ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uLzAwLUlOREVYCmluZGV4IDA3ZGU3ZTEuLjI3ZTY3YTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWApAQCAtNDEzLDggKzQxMyw2IEBACiAJLSBob3cgdG8gc2V0IHVwIExpbnV4IHdpdGggYSBzZXJpYWwgbGluZSBjb25zb2xlIGFzIHRoZSBkZWZhdWx0Lgogc2dpLWlvYzQudHh0CiAJLSBkZXNjcmlwdGlvbiBvZiB0aGUgU0dJIElPQzQgUENJIChtdWx0aSBmdW5jdGlvbikgZGV2aWNlLgotc2dpLXZpc3dzLnR4dAotCS0gc2hvcnQgYmx1cmIgb24gdGhlIFNHSSBWaXN1YWwgV29ya3N0YXRpb25zLgogc2gvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIHBvcnRpbmcgTGludXggdG8gYSBuZXcgYXJjaGl0ZWN0dXJlLgogc21zY19lY2UxMDk5LnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1zY3NpX2hvc3QgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXNjc2lfaG9zdAppbmRleCAyOWE0Zjg5Li4wZWIyNTVlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXNjc2lfaG9zdAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXNjc2lfaG9zdApAQCAtMTEsMyArMTEsMTkgQEAKIAkJZ3VhcmFudGVlZC4gIFRoZSAnaXNjaV9pZCcgYXR0cmlidXRlIHVuYW1iaWd1b3VzbHkgaWRlbnRpZmllcwogCQl0aGUgY29udHJvbGxlciBpbmRleDogJzAnIGZvciB0aGUgZmlyc3QgY29udHJvbGxlciwKIAkJJzEnIGZvciB0aGUgc2Vjb25kLgorCitXaGF0OgkJL3N5cy9jbGFzcy9zY3NpX2hvc3QvaG9zdFgvYWNjaW9wYXRoX3N0YXR1cworRGF0ZToJCU5vdmVtYmVyIDIwMTMKK0NvbnRhY3Q6CVN0ZXBoZW4gTS4gQ2FtZXJvbiA8c2NhbWVyb25AYmVhcmRvZy5jY2UuaHAuY29tPgorRGVzY3JpcHRpb246CVRoaXMgZmlsZSBjb250YWlucyB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlICJTU0QgU21hcnQgUGF0aCIKKwkJZmVhdHVyZSBvZiBIUCBTbWFydCBBcnJheSBSQUlEIGNvbnRyb2xsZXJzIHVzaW5nIHRoZSBocHNhCisJCWRyaXZlci4gIFNTRCBTbWFydCBQYXRoLCB3aGVuIGVuYWJsZWQgcGVybWl0cyB0aGUgZHJpdmVyIHRvCisJCXNlbmQgaS9vIHJlcXVlc3RzIGRpcmVjdGx5IHRvIHBoeXNpY2FsIGRldmljZXMgdGhhdCBhcmUgcGFydAorCQlvZiBhIGxvZ2ljYWwgZHJpdmUsIGJ5cGFzc2luZyB0aGUgY29udHJvbGxlcnMgZmlybXdhcmUgUkFJRAorCQlzdGFjayBmb3IgYSBwZXJmb3JtYW5jZSBhZHZhbnRhZ2Ugd2hlbiBwb3NzaWJsZS4gIEEgdmFsdWUgb2YKKwkJJzEnIGluZGljYXRlcyB0aGUgZmVhdHVyZSBpcyBlbmFibGVkLCBhbmQgdGhlIGNvbnRyb2xsZXIgbWF5CisJCXVzZSB0aGUgZGlyZWN0IGkvbyBwYXRoIHRvIHBoeXNpY2FsIGRldmljZXMuICBBIHZhbHVlIG9mIHplcm8KKwkJbWVhbnMgdGhlIGZlYXR1cmUgaXMgZGlzYWJsZWQgYW5kIHRoZSBjb250cm9sbGVyIG1heSBub3QgdXNlCisJCXRoZSBkaXJlY3QgaS9vIHBhdGggdG8gcGh5c2ljYWwgZGV2aWNlcy4gIFRoaXMgc2V0dGluZyBpcworCQljb250cm9sbGVyIHdpZGUsIGFmZmVjdGluZyBhbGwgY29uZmlndXJlZCBsb2dpY2FsIGRyaXZlcyBvbiB0aGUKKwkJY29udHJvbGxlci4gIFRoaXMgZmlsZSBpcyByZWFkYWJsZSBhbmQgd3JpdGFibGUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtcG93ZXIgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtcG93ZXIKaW5kZXggZWZlNDQ5Yi4uN2RiZjk2YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXBvd2VyCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1wb3dlcgpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJCU5vdCBhbGwgZHJpdmVycyBzdXBwb3J0IHRoaXMgYXR0cmlidXRlLiAgSWYgaXQgaXNuJ3Qgc3VwcG9ydGVkLAogCQlhdHRlbXB0cyB0byByZWFkIG9yIHdyaXRlIGl0IHdpbGwgeWllbGQgSS9PIGVycm9ycy4KIAotV2hhdDoJCS9zeXMvZGV2aWNlcy8uLi4vcG93ZXIvcG1fcW9zX2xhdGVuY3lfdXMKK1doYXQ6CQkvc3lzL2RldmljZXMvLi4uL3Bvd2VyL3BtX3Fvc19yZXN1bWVfbGF0ZW5jeV91cwogRGF0ZToJCU1hcmNoIDIwMTIKIENvbnRhY3Q6CVJhZmFlbCBKLiBXeXNvY2tpIDxyandAcmp3eXNvY2tpLm5ldD4KIERlc2NyaXB0aW9uOgpAQCAtMjA1LDYgKzIwNSwzMSBAQAogCQlUaGlzIGF0dHJpYnV0ZSBoYXMgbm8gZWZmZWN0IG9uIHN5c3RlbS13aWRlIHN1c3BlbmQvcmVzdW1lIGFuZAogCQloaWJlcm5hdGlvbi4KIAorV2hhdDoJCS9zeXMvZGV2aWNlcy8uLi4vcG93ZXIvcG1fcW9zX2xhdGVuY3lfdG9sZXJhbmNlX3VzCitEYXRlOgkJSmFudWFyeSAyMDE0CitDb250YWN0OglSYWZhZWwgSi4gV3lzb2NraSA8cmp3QHJqd3lzb2NraS5uZXQ+CitEZXNjcmlwdGlvbjoKKwkJVGhlIC9zeXMvZGV2aWNlcy8uLi4vcG93ZXIvcG1fcW9zX2xhdGVuY3lfdG9sZXJhbmNlX3VzIGF0dHJpYnV0ZQorCQljb250YWlucyB0aGUgUE0gUW9TIGFjdGl2ZSBzdGF0ZSBsYXRlbmN5IHRvbGVyYW5jZSBsaW1pdCBmb3IgdGhlCisJCWdpdmVuIGRldmljZSBpbiBtaWNyb3NlY29uZHMuICBUaGF0IGlzIHRoZSBtYXhpbXVtIG1lbW9yeSBhY2Nlc3MKKwkJbGF0ZW5jeSB0aGUgZGV2aWNlIGNhbiBzdWZmZXIgd2l0aG91dCBhbnkgdmlzaWJsZSBhZHZlcnNlCisJCWVmZmVjdHMgb24gdXNlciBzcGFjZSBmdW5jdGlvbmFsaXR5LiAgSWYgdGhhdCB2YWx1ZSBpcyB0aGUKKwkJc3RyaW5nICJhbnkiLCB0aGUgbGF0ZW5jeSBkb2VzIG5vdCBtYXR0ZXIgdG8gdXNlciBzcGFjZSBhdCBhbGwsCisJCWJ1dCBoYXJkd2FyZSBzaG91bGQgbm90IGJlIGFsbG93ZWQgdG8gc2V0IHRoZSBsYXRlbmN5IHRvbGVyYW5jZQorCQlmb3IgdGhlIGRldmljZSBhdXRvbWF0aWNhbGx5LgorCisJCVJlYWRpbmcgImF1dG8iIGZyb20gdGhpcyBmaWxlIG1lYW5zIHRoYXQgdGhlIG1heGltdW0gbWVtb3J5CisJCWFjY2VzcyBsYXRlbmN5IGZvciB0aGUgZGV2aWNlIG1heSBiZSBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHkKKwkJYnkgdGhlIGhhcmR3YXJlIGFzIG5lZWRlZC4gIFdyaXRpbmcgImF1dG8iIHRvIGl0IGFsbG93cyB0aGUKKwkJaGFyZHdhcmUgdG8gYmUgc3dpdGNoZWQgdG8gdGhpcyBtb2RlIGlmIHRoZXJlIGFyZSBubyBvdGhlcgorCQlsYXRlbmN5IHRvbGVyYW5jZSByZXF1aXJlbWVudHMgZnJvbSB0aGUga2VybmVsIHNpZGUuCisKKwkJVGhpcyBhdHRyaWJ1dGUgaXMgb25seSBwcmVzZW50IGlmIHRoZSBmZWF0dXJlIGNvbnRyb2xsZWQgYnkgaXQKKwkJaXMgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZS4KKworCQlUaGlzIGF0dHJpYnV0ZSBoYXMgbm8gZWZmZWN0IG9uIHJ1bnRpbWUgc3VzcGVuZCBhbmQgcmVzdW1lIG9mCisJCWRldmljZXMgYW5kIG9uIHN5c3RlbS13aWRlIHN1c3BlbmQvcmVzdW1lIGFuZCBoaWJlcm5hdGlvbi4KKwogV2hhdDoJCS9zeXMvZGV2aWNlcy8uLi4vcG93ZXIvcG1fcW9zX25vX3Bvd2VyX29mZgogRGF0ZToJCVNlcHRlbWJlciAyMDEyCiBDb250YWN0OglSYWZhZWwgSi4gV3lzb2NraSA8cmp3QHJqd3lzb2NraS5uZXQ+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBvd2VyIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlcgppbmRleCAyMDVhNzM4Li42NGM5Mjc2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBvd2VyCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcG93ZXIKQEAgLTEyLDggKzEyLDkgQEAKIERlc2NyaXB0aW9uOgogCQlUaGUgL3N5cy9wb3dlci9zdGF0ZSBmaWxlIGNvbnRyb2xzIHRoZSBzeXN0ZW0gcG93ZXIgc3RhdGUuCiAJCVJlYWRpbmcgZnJvbSB0aGlzIGZpbGUgcmV0dXJucyB3aGF0IHN0YXRlcyBhcmUgc3VwcG9ydGVkLAotCQl3aGljaCBpcyBoYXJkLWNvZGVkIHRvICdzdGFuZGJ5JyAoUG93ZXItT24gU3VzcGVuZCksICdtZW0nCi0JCShTdXNwZW5kLXRvLVJBTSksIGFuZCAnZGlzaycgKFN1c3BlbmQtdG8tRGlzaykuCisJCXdoaWNoIGlzIGhhcmQtY29kZWQgdG8gJ2ZyZWV6ZScgKExvdy1Qb3dlciBJZGxlKSwgJ3N0YW5kYnknCisJCShQb3dlci1PbiBTdXNwZW5kKSwgJ21lbScgKFN1c3BlbmQtdG8tUkFNKSwgYW5kICdkaXNrJworCQkoU3VzcGVuZC10by1EaXNrKS4KIAogCQlXcml0aW5nIHRvIHRoaXMgZmlsZSBvbmUgb2YgdGhlc2Ugc3RyaW5ncyBjYXVzZXMgdGhlIHN5c3RlbSB0bwogCQl0cmFuc2l0aW9uIGludG8gdGhhdCBzdGF0ZS4gUGxlYXNlIHNlZSB0aGUgZmlsZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCmluZGV4IDBmOWM2ZmYuLjhkOTZlYmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKQEAgLTE0LDcgKzE0LDcgQEAKIAkgICAgZ2VuZXJpY2lycS54bWwgczM5MC1kcml2ZXJzLnhtbCB1aW8taG93dG8ueG1sIHNjc2kueG1sIFwKIAkgICAgODAyMTEueG1sIGRlYnVnb2JqZWN0cy54bWwgc2gueG1sIHJlZ3VsYXRvci54bWwgXAogCSAgICBhbHNhLWRyaXZlci1hcGkueG1sIHdyaXRpbmctYW4tYWxzYS1kcml2ZXIueG1sIFwKLQkgICAgdHJhY2Vwb2ludC54bWwgZHJtLnhtbCBtZWRpYV9hcGkueG1sCisJICAgIHRyYWNlcG9pbnQueG1sIGRybS54bWwgbWVkaWFfYXBpLnhtbCB3MS54bWwKIAogaW5jbHVkZSAkKHNyY3RyZWUpL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9NYWtlZmlsZQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdzEudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay93MS50bXBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMjI4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdzEudG1wbApAQCAtMCwwICsxLDEwMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBib29rIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC4xLjIvL0VOIgorCSJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMS4yL2RvY2Jvb2t4LmR0ZCIgW10+CisKKzxib29rIGlkPSJ3MWlkIj4KKyAgPGJvb2tpbmZvPgorICAgIDx0aXRsZT5XMTogRGFsbGFzJyAxLXdpcmUgYnVzPC90aXRsZT4KKworICAgIDxhdXRob3Jncm91cD4KKyAgICAgIDxhdXRob3I+CisgICAgICAgIDxmaXJzdG5hbWU+RGF2aWQ8L2ZpcnN0bmFtZT4KKyAgICAgICAgPHN1cm5hbWU+RnJpZXM8L3N1cm5hbWU+CisgICAgICAgIDxhZmZpbGlhdGlvbj4KKyAgICAgICAgICA8YWRkcmVzcz4KKyAgICAgICAgICAgIDxlbWFpbD5EYXZpZEBGcmllcy5uZXQ8L2VtYWlsPgorICAgICAgICAgIDwvYWRkcmVzcz4KKyAgICAgICAgPC9hZmZpbGlhdGlvbj4KKyAgICAgIDwvYXV0aG9yPgorCisgICAgPC9hdXRob3Jncm91cD4KKworICAgIDxjb3B5cmlnaHQ+CisgICAgICA8eWVhcj4yMDEzPC95ZWFyPgorICAgICAgPCEtLQorICAgICAgPGhvbGRlcj48L2hvbGRlcj4KKyAgICAgIC0tPgorICAgIDwvY29weXJpZ2h0PgorCisgICAgPGxlZ2Fsbm90aWNlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoaXMgZG9jdW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQorICAgICAgICBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgICAgICAgIExpY2Vuc2UgdmVyc2lvbiAyLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICAgICAgICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgICAgICAgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAgICAgICAgRm9yIG1vcmUgZGV0YWlscyBzZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgc291cmNlCisgICAgICAgIGRpc3RyaWJ1dGlvbiBvZiBMaW51eC4KKyAgICAgIDwvcGFyYT4KKyAgICA8L2xlZ2Fsbm90aWNlPgorICA8L2Jvb2tpbmZvPgorCisgIDx0b2M+PC90b2M+CisKKyAgPGNoYXB0ZXIgaWQ9IncxX2ludGVybmFsIj4KKyAgICA8dGl0bGU+VzEgQVBJIGludGVybmFsIHRvIHRoZSBrZXJuZWw8L3RpdGxlPgorCisgICAgPHNlY3QxIGlkPSJ3MV9pbnRlcm5hbF9hcGkiPgorICAgICAgPHRpdGxlPlcxIEFQSSBpbnRlcm5hbCB0byB0aGUga2VybmVsPC90aXRsZT4KKyAgICAgIDxzZWN0MiBpZD0idzEuaCI+CisgICAgICAgIDx0aXRsZT5kcml2ZXJzL3cxL3cxLmg8L3RpdGxlPgorICAgICAgICA8cGFyYT5XMSBjb3JlIGZ1bmN0aW9ucy48L3BhcmE+CishSWRyaXZlcnMvdzEvdzEuaAorICAgICAgPC9zZWN0Mj4KKworICAgICAgPHNlY3QyIGlkPSJ3MS5jIj4KKyAgICAgICAgPHRpdGxlPmRyaXZlcnMvdzEvdzEuYzwvdGl0bGU+CisgICAgICAgIDxwYXJhPlcxIGNvcmUgZnVuY3Rpb25zLjwvcGFyYT4KKyFJZHJpdmVycy93MS93MS5jCisgICAgICA8L3NlY3QyPgorCisgICAgICA8c2VjdDIgaWQ9IncxX2ZhbWlseS5oIj4KKyAgICAgICAgPHRpdGxlPmRyaXZlcnMvdzEvdzFfZmFtaWx5Lmg8L3RpdGxlPgorICAgICAgICA8cGFyYT5BbGxvd3MgcmVnaXN0ZXJpbmcgZGV2aWNlIGZhbWlseSBvcGVyYXRpb25zLjwvcGFyYT4KKyFJZHJpdmVycy93MS93MV9mYW1pbHkuaAorICAgICAgPC9zZWN0Mj4KKworICAgICAgPHNlY3QyIGlkPSJ3MV9mYW1pbHkuYyI+CisgICAgICAgIDx0aXRsZT5kcml2ZXJzL3cxL3cxX2ZhbWlseS5jPC90aXRsZT4KKyAgICAgICAgPHBhcmE+QWxsb3dzIHJlZ2lzdGVyaW5nIGRldmljZSBmYW1pbHkgb3BlcmF0aW9ucy48L3BhcmE+CishRWRyaXZlcnMvdzEvdzFfZmFtaWx5LmMKKyAgICAgIDwvc2VjdDI+CisKKyAgICAgIDxzZWN0MiBpZD0idzFfaW50LmMiPgorICAgICAgICA8dGl0bGU+ZHJpdmVycy93MS93MV9pbnQuYzwvdGl0bGU+CisgICAgICAgIDxwYXJhPlcxIGludGVybmFsIGluaXRpYWxpemF0aW9uIGZvciBtYXN0ZXIgZGV2aWNlcy48L3BhcmE+CishRWRyaXZlcnMvdzEvdzFfaW50LmMKKyAgICAgIDwvc2VjdDI+CisKKyAgICAgIDxzZWN0MiBpZD0idzFfbmV0bGluay5oIj4KKyAgICAgICAgPHRpdGxlPmRyaXZlcnMvdzEvdzFfbmV0bGluay5oPC90aXRsZT4KKyAgICAgICAgPHBhcmE+VzEgZXh0ZXJuYWwgbmV0bGluayBBUEkgc3RydWN0dXJlcyBhbmQgY29tbWFuZHMuPC9wYXJhPgorIUlkcml2ZXJzL3cxL3cxX25ldGxpbmsuaAorICAgICAgPC9zZWN0Mj4KKworICAgICAgPHNlY3QyIGlkPSJ3MV9pby5jIj4KKyAgICAgICAgPHRpdGxlPmRyaXZlcnMvdzEvdzFfaW8uYzwvdGl0bGU+CisgICAgICAgIDxwYXJhPlcxIGlucHV0L291dHB1dC48L3BhcmE+CishRWRyaXZlcnMvdzEvdzFfaW8uYworIUlkcml2ZXJzL3cxL3cxX2lvLmMKKyAgICAgIDwvc2VjdDI+CisKKyAgICA8L3NlY3QxPgorCisKKyAgPC9jaGFwdGVyPgorCis8L2Jvb2s+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svd3JpdGluZy1hbi1hbHNhLWRyaXZlci50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbAppbmRleCAwNjc0MWU5Li5kMDA1NmE0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svd3JpdGluZy1hbi1hbHNhLWRyaXZlci50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnRtcGwKQEAgLTQ2OCw4ICs0NjgsNiBAQAogICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICB9CiAKLSAgICAgICAgICBzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KICAgICAgICAgICAqcmNoaXAgPSBjaGlwOwogICAgICAgICAgIHJldHVybiAwOwogICB9CkBAIC00OTIsNyArNDkwLDggQEAKICAgICAgICAgICB9CiAKICAgICAgICAgICAvKiAoMikgKi8KLSAgICAgICAgICBlcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKyAgICAgICAgICBlcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJmNhcmQpOwogICAgICAgICAgIGlmIChlcnIgPCAwKQogICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKIApAQCAtNTkxLDcgKzU5MCw4IEBACiAgIHN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKICAgaW50IGVycjsKICAgLi4uLgotICBlcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKyAgZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisgICAgICAgICAgICAgICAgICAgICAwLCAmY2FyZCk7CiBdXT4KICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CiAgICAgICAgICAgPC9pbmZvcm1hbGV4YW1wbGU+CkBAIC04MDksMjggKzgwOSwzNCBAQAogCiAgICAgICA8cGFyYT4KICAgICAgICAgQXMgbWVudGlvbmVkIGFib3ZlLCB0byBjcmVhdGUgYSBjYXJkIGluc3RhbmNlLCBjYWxsCi0gICAgICA8ZnVuY3Rpb24+c25kX2NhcmRfY3JlYXRlKCk8L2Z1bmN0aW9uPi4KKyAgICAgIDxmdW5jdGlvbj5zbmRfY2FyZF9uZXcoKTwvZnVuY3Rpb24+LgogCiAgICAgICAgIDxpbmZvcm1hbGV4YW1wbGU+CiAgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgogPCFbQ0RBVEFbCiAgIHN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKICAgaW50IGVycjsKLSAgZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgbW9kdWxlLCBleHRyYV9zaXplLCAmY2FyZCk7CisgIGVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4LCBpZCwgbW9kdWxlLCBleHRyYV9zaXplLCAmY2FyZCk7CiBdXT4KICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgogICAgICAgICA8L2luZm9ybWFsZXhhbXBsZT4KICAgICAgIDwvcGFyYT4KIAogICAgICAgPHBhcmE+Ci0gICAgICAgIFRoZSBmdW5jdGlvbiB0YWtlcyBmaXZlIGFyZ3VtZW50cywgdGhlIGNhcmQtaW5kZXggbnVtYmVyLCB0aGUKLSAgICAgICAgaWQgc3RyaW5nLCB0aGUgbW9kdWxlIHBvaW50ZXIgKHVzdWFsbHkKKyAgICAgICAgVGhlIGZ1bmN0aW9uIHRha2VzIHNpeCBhcmd1bWVudHM6IHRoZSBwYXJlbnQgZGV2aWNlIHBvaW50ZXIsCisgICAgICAgIHRoZSBjYXJkLWluZGV4IG51bWJlciwgdGhlIGlkIHN0cmluZywgdGhlIG1vZHVsZSBwb2ludGVyICh1c3VhbGx5CiAgICAgICAgIDxjb25zdGFudD5USElTX01PRFVMRTwvY29uc3RhbnQ+KSwKICAgICAgICAgdGhlIHNpemUgb2YgZXh0cmEtZGF0YSBzcGFjZSwgYW5kIHRoZSBwb2ludGVyIHRvIHJldHVybiB0aGUKICAgICAgICAgY2FyZCBpbnN0YW5jZS4gIFRoZSBleHRyYV9zaXplIGFyZ3VtZW50IGlzIHVzZWQgdG8KICAgICAgICAgYWxsb2NhdGUgY2FyZC0mZ3Q7cHJpdmF0ZV9kYXRhIGZvciB0aGUKICAgICAgICAgY2hpcC1zcGVjaWZpYyBkYXRhLiAgTm90ZSB0aGF0IHRoZXNlIGRhdGEKLSAgICAgICAgYXJlIGFsbG9jYXRlZCBieSA8ZnVuY3Rpb24+c25kX2NhcmRfY3JlYXRlKCk8L2Z1bmN0aW9uPi4KKyAgICAgICAgYXJlIGFsbG9jYXRlZCBieSA8ZnVuY3Rpb24+c25kX2NhcmRfbmV3KCk8L2Z1bmN0aW9uPi4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisJVGhlIGZpcnN0IGFyZ3VtZW50LCB0aGUgcG9pbnRlciBvZiBzdHJ1Y3QKKwk8c3RydWN0bmFtZT5kZXZpY2U8L3N0cnVjdG5hbWU+LCBzcGVjaWZpZXMgdGhlIHBhcmVudCBkZXZpY2UuCisJRm9yIFBDSSBkZXZpY2VzLCB0eXBpY2FsbHkgJmFtcDtwY2ktJmd0OyBpcyBwYXNzZWQgdGhlcmUuCiAgICAgICA8L3BhcmE+CiAgICAgPC9zZWN0aW9uPgogCkBAIC05MTYsMTYgKzkyMiwxNiBAQAogICAgICAgPC9wYXJhPgogCiAgICAgICA8c2VjdGlvbiBpZD0iY2FyZC1tYW5hZ2VtZW50LWNoaXAtc3BlY2lmaWMtc25kLWNhcmQtbmV3Ij4KLSAgICAgICAgPHRpdGxlPjEuIEFsbG9jYXRpbmcgdmlhIDxmdW5jdGlvbj5zbmRfY2FyZF9jcmVhdGUoKTwvZnVuY3Rpb24+LjwvdGl0bGU+CisgICAgICAgIDx0aXRsZT4xLiBBbGxvY2F0aW5nIHZpYSA8ZnVuY3Rpb24+c25kX2NhcmRfbmV3KCk8L2Z1bmN0aW9uPi48L3RpdGxlPgogICAgICAgICA8cGFyYT4KICAgICAgICAgICBBcyBtZW50aW9uZWQgYWJvdmUsIHlvdSBjYW4gcGFzcyB0aGUgZXh0cmEtZGF0YS1sZW5ndGgKLQkgIHRvIHRoZSA0dGggYXJndW1lbnQgb2YgPGZ1bmN0aW9uPnNuZF9jYXJkX2NyZWF0ZSgpPC9mdW5jdGlvbj4sIGkuZS4KKwkgIHRvIHRoZSA1dGggYXJndW1lbnQgb2YgPGZ1bmN0aW9uPnNuZF9jYXJkX25ldygpPC9mdW5jdGlvbj4sIGkuZS4KIAogICAgICAgICAgIDxpbmZvcm1hbGV4YW1wbGU+CiAgICAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CiA8IVtDREFUQVsKLSAgZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBteWNoaXApLCAmY2FyZCk7CisgIGVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBteWNoaXApLCAmY2FyZCk7CiBdXT4KICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CiAgICAgICAgICAgPC9pbmZvcm1hbGV4YW1wbGU+CkBAIC05NTQsNyArOTYwLDcgQEAKIAogICAgICAgICA8cGFyYT4KICAgICAgICAgICBBZnRlciBhbGxvY2F0aW5nIGEgY2FyZCBpbnN0YW5jZSB2aWEKLSAgICAgICAgICA8ZnVuY3Rpb24+c25kX2NhcmRfY3JlYXRlKCk8L2Z1bmN0aW9uPiAod2l0aAorICAgICAgICAgIDxmdW5jdGlvbj5zbmRfY2FyZF9uZXcoKTwvZnVuY3Rpb24+ICh3aXRoCiAgICAgICAgICAgPGNvbnN0YW50PjA8L2NvbnN0YW50PiBvbiB0aGUgNHRoIGFyZyksIGNhbGwKICAgICAgICAgICA8ZnVuY3Rpb24+a3phbGxvYygpPC9mdW5jdGlvbj4uIAogCkBAIC05NjMsNyArOTY5LDggQEAKIDwhW0NEQVRBWwogICBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAgIHN0cnVjdCBteWNoaXAgKmNoaXA7Ci0gIGVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworICBlcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKyAgICAgICAgICAgICAgICAgICAgIDAsICZjYXJkKTsKICAgLi4uLi4KICAgY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7CiBdXT4KQEAgLTExNzAsOCArMTE3Nyw2IEBACiAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgIH0KIAotICAgICAgICAgIHNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogICAgICAgICAgICpyY2hpcCA9IGNoaXA7CiAgICAgICAgICAgcmV0dXJuIDA7CiAgIH0gICAgICAgIApAQCAtMTUyNiwzMCArMTUzMSw2IEBACiAKICAgICA8L3NlY3Rpb24+CiAKLSAgICA8c2VjdGlvbiBpZD0icGNpLXJlc291cmNlLWRldmljZS1zdHJ1Y3QiPgotICAgICAgPHRpdGxlPlJlZ2lzdHJhdGlvbiBvZiBEZXZpY2UgU3RydWN0PC90aXRsZT4KLSAgICAgIDxwYXJhPgotCUF0IHNvbWUgcG9pbnQsIHR5cGljYWxseSBhZnRlciBjYWxsaW5nIDxmdW5jdGlvbj5zbmRfZGV2aWNlX25ldygpPC9mdW5jdGlvbj4sCi0JeW91IG5lZWQgdG8gcmVnaXN0ZXIgdGhlIHN0cnVjdCA8c3RydWN0bmFtZT5kZXZpY2U8L3N0cnVjdG5hbWU+IG9mIHRoZSBjaGlwCi0JeW91J3JlIGhhbmRsaW5nIGZvciB1ZGV2IGFuZCBjby4gIEFMU0EgcHJvdmlkZXMgYSBtYWNybyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCi0Jb2xkZXIga2VybmVscy4gIFNpbXBseSBjYWxsIGxpa2UgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgPGluZm9ybWFsZXhhbXBsZT4KLSAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+Ci08IVtDREFUQVsKLSAgc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotXV0+Ci0gICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KLSAgICAgICAgPC9pbmZvcm1hbGV4YW1wbGU+Ci0Jc28gdGhhdCBpdCBzdG9yZXMgdGhlIFBDSSdzIGRldmljZSBwb2ludGVyIHRvIHRoZSBjYXJkLiAgVGhpcyB3aWxsIGJlCi0JcmVmZXJyZWQgYnkgQUxTQSBjb3JlIGZ1bmN0aW9ucyBsYXRlciB3aGVuIHRoZSBkZXZpY2VzIGFyZSByZWdpc3RlcmVkLgotICAgICAgPC9wYXJhPgotICAgICAgPHBhcmE+Ci0JSW4gdGhlIGNhc2Ugb2Ygbm9uLVBDSSwgcGFzcyB0aGUgcHJvcGVyIGRldmljZSBzdHJ1Y3QgcG9pbnRlciBvZiB0aGUgQlVTCi0JaW5zdGVhZC4gIChJbiB0aGUgY2FzZSBvZiBsZWdhY3kgSVNBIHdpdGhvdXQgUG5QLCB5b3UgZG9uJ3QgaGF2ZSB0byBkbwotCWFueXRoaW5nLikKLSAgICAgIDwvcGFyYT4KLSAgICA8L3NlY3Rpb24+Ci0KICAgICA8c2VjdGlvbiBpZD0icGNpLXJlc291cmNlLWVudHJpZXMiPgogICAgICAgPHRpdGxlPlBDSSBFbnRyaWVzPC90aXRsZT4KICAgICAgIDxwYXJhPgpAQCAtNTc0MCw3ICs1NzIxLDggQEAKICAgICAgICAgICBzdHJ1Y3QgbXljaGlwICpjaGlwOwogICAgICAgICAgIGludCBlcnI7CiAgICAgICAgICAgLi4uLgotICAgICAgICAgIGVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworICAgICAgICAgIGVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAmY2FyZCk7CiAgICAgICAgICAgLi4uLgogICAgICAgICAgIGNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOwogICAgICAgICAgIC4uLi4KQEAgLTU3NTIsNyArNTczNCw3IEBACiAgICAgICA8L2luZm9ybWFsZXhhbXBsZT4KIAogCVdoZW4geW91IGNyZWF0ZWQgdGhlIGNoaXAgZGF0YSB3aXRoCi0JPGZ1bmN0aW9uPnNuZF9jYXJkX2NyZWF0ZSgpPC9mdW5jdGlvbj4sIGl0J3MgYW55d2F5IGFjY2Vzc2libGUKKwk8ZnVuY3Rpb24+c25kX2NhcmRfbmV3KCk8L2Z1bmN0aW9uPiwgaXQncyBhbnl3YXkgYWNjZXNzaWJsZQogCXZpYSA8c3RydWN0ZmllbGQ+cHJpdmF0ZV9kYXRhPC9zdHJ1Y3RmaWVsZD4gZmllbGQuCiAKICAgICAgIDxpbmZvcm1hbGV4YW1wbGU+CkBAIC01NzY2LDggKzU3NDgsOCBAQAogICAgICAgICAgIHN0cnVjdCBteWNoaXAgKmNoaXA7CiAgICAgICAgICAgaW50IGVycjsKICAgICAgICAgICAuLi4uCi0gICAgICAgICAgZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IG15Y2hpcCksICZjYXJkKTsKKyAgICAgICAgICBlcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBteWNoaXApLCAmY2FyZCk7CiAgICAgICAgICAgLi4uLgogICAgICAgICAgIGNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAgICAgICAgICAgLi4uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLWlvdi1ob3d0by50eHQgYi9Eb2N1bWVudGF0aW9uL1BDSS9wY2ktaW92LWhvd3RvLnR4dAppbmRleCA4NjU1MWNjLi4yZDkxYWUyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1BDSS9wY2ktaW92LWhvd3RvLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL1BDSS9wY2ktaW92LWhvd3RvLnR4dApAQCAtNjgsMTAgKzY4LDYgQEAKIAllY2hvICAwID4gXAogICAgICAgICAvc3lzL2J1cy9wY2kvZGV2aWNlcy88RE9NQUlOOkJVUzpERVZJQ0UuRlVOQ1RJT04+L3NyaW92X251bXZmcwogCi1UbyBub3RpZnkgU1ItSU9WIGNvcmUgb2YgVmlydHVhbCBGdW5jdGlvbiBNaWdyYXRpb246Ci0oYSkgSW4gdGhlIGRyaXZlcjoKLQlpcnFyZXR1cm5fdCBwY2lfc3Jpb3ZfbWlncmF0aW9uKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotCiAzLjIgVXNhZ2UgZXhhbXBsZQogCiBGb2xsb3dpbmcgcGllY2Ugb2YgY29kZSBpbGx1c3RyYXRlcyB0aGUgdXNhZ2Ugb2YgdGhlIFNSLUlPViBBUEkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Jsb2NrZGV2L2RyYmQvZGF0YS1zdHJ1Y3R1cmUtdjkudHh0IGIvRG9jdW1lbnRhdGlvbi9ibG9ja2Rldi9kcmJkL2RhdGEtc3RydWN0dXJlLXY5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTUyYTBlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ibG9ja2Rldi9kcmJkL2RhdGEtc3RydWN0dXJlLXY5LnR4dApAQCAtMCwwICsxLDM4IEBACitUaGlzIGRlc2NyaWJlcyB0aGUgaW4ga2VybmVsIGRhdGEgc3RydWN0dXJlIGZvciBEUkJELTkuIFN0YXJ0aW5nIHdpdGgKK0xpbnV4IHYzLjE0IHdlIGFyZSByZW9yZ2FuaXppbmcgRFJCRCB0byB1c2UgdGhpcyBkYXRhIHN0cnVjdHVyZS4KKworQmFzaWMgRGF0YSBTdHJ1Y3R1cmUKKz09PT09PT09PT09PT09PT09PT09CisKK0Egbm9kZSBoYXMgYSBudW1iZXIgb2YgRFJCRCByZXNvdXJjZXMuICBFYWNoIHN1Y2ggcmVzb3VyY2UgaGFzIGEgbnVtYmVyIG9mCitkZXZpY2VzIChha2Egdm9sdW1lcykgYW5kIGNvbm5lY3Rpb25zIHRvIG90aGVyIG5vZGVzICgicGVlciBub2RlcyIpLiBFYWNoIERSQkQKK2RldmljZSBpcyByZXByZXNlbnRlZCBieSBhIGJsb2NrIGRldmljZSBsb2NhbGx5LgorCitUaGUgRFJCRCBvYmplY3RzIGFyZSBpbnRlcmNvbm5lY3RlZCB0byBmb3JtIGEgbWF0cml4IGFzIGRlcGljdGVkIGJlbG93OyBhCitkcmJkX3BlZXJfZGV2aWNlIG9iamVjdCBzaXRzIGF0IGVhY2ggaW50ZXJzZWN0aW9uIGJldHdlZW4gYSBkcmJkX2RldmljZSBhbmQgYQorZHJiZF9jb25uZWN0aW9uOgorCisgIC8tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLi4uLi4rLS0tLS0tLS0tLS0tLS0tXAorICB8ICAgcmVzb3VyY2UgICB8ICAgIGRldmljZSAgICAgfCAgICAgfCAgICBkZXZpY2UgICAgIHwKKyAgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsuLi4uListLS0tLS0tLS0tLS0tLS0rCisgIHwgIGNvbm5lY3Rpb24gIHwgIHBlZXJfZGV2aWNlICB8ICAgICB8ICBwZWVyX2RldmljZSAgfAorICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy4uLi4uKy0tLS0tLS0tLS0tLS0tLSsKKyAgOiAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgIDogICAgIDogICAgICAgICAgICAgICA6CisgIDogICAgICAgICAgICAgIDogICAgICAgICAgICAgICA6ICAgICA6ICAgICAgICAgICAgICAgOgorICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy4uLi4uKy0tLS0tLS0tLS0tLS0tLSsKKyAgfCAgY29ubmVjdGlvbiAgfCAgcGVlcl9kZXZpY2UgIHwgICAgIHwgIHBlZXJfZGV2aWNlICB8CisgIFwtLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLi4uLi4rLS0tLS0tLS0tLS0tLS0tLworCitJbiB0aGlzIHRhYmxlLCBob3Jpem9udGFsbHksIGRldmljZXMgY2FuIGJlIGFjY2Vzc2VkIGZyb20gcmVzb3VyY2VzIGJ5IHRoZWlyCit2b2x1bWUgbnVtYmVyLiAgTGlrZXdpc2UsIHBlZXJfZGV2aWNlcyBjYW4gYmUgYWNjZXNzZWQgZnJvbSBjb25uZWN0aW9ucyBieQordGhlaXIgdm9sdW1lIG51bWJlci4gIE9iamVjdHMgaW4gdGhlIHZlcnRpY2FsIGRpcmVjdGlvbiBhcmUgY29ubmVjdGVkIGJ5IGRvdWJsZQorbGlua2VkIGxpc3RzLiAgVGhlcmUgYXJlIGJhY2sgcG9pbnRlcnMgZnJvbSBwZWVyX2RldmljZXMgdG8gdGhlaXIgY29ubmVjdGlvbnMgYQorZGV2aWNlcywgYW5kIGZyb20gY29ubmVjdGlvbnMgYW5kIGRldmljZXMgdG8gdGhlaXIgcmVzb3VyY2UuCisKK0FsbCByZXNvdXJjZXMgYXJlIGluIHRoZSBkcmJkX3Jlc291cmNlcyBkb3VibGUtbGlua2VkIGxpc3QuICBJbiBhZGRpdGlvbiwgYWxsCitkZXZpY2VzIGNhbiBiZSBhY2Nlc3NlZCBieSB0aGVpciBtaW5vciBkZXZpY2UgbnVtYmVyIHZpYSB0aGUgZHJiZF9kZXZpY2VzIGlkci4KKworVGhlIGRyYmRfcmVzb3VyY2UsIGRyYmRfY29ubmVjdGlvbiwgYW5kIGRyYmRfZGV2aWNlIG9iamVjdHMgYXJlIHJlZmVyZW5jZQorY291bnRlZC4gIFRoZSBwZWVyX2RldmljZSBvYmplY3RzIG9ubHkgc2VydmUgdG8gZXN0YWJsaXNoIHRoZSBsaW5rcyBiZXR3ZWVuCitkZXZpY2VzIGFuZCBjb25uZWN0aW9uczsgdGhlaXIgbGlmZXRpbWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbGlmZXRpbWUgb2YgdGhlCitkZXZpY2UgYW5kIGNvbm5lY3Rpb24gd2hpY2ggdGhleSByZWZlcmVuY2UuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nvbm5lY3Rvci9jbl90ZXN0LmMgYi9Eb2N1bWVudGF0aW9uL2Nvbm5lY3Rvci9jbl90ZXN0LmMKaW5kZXggYWRjY2EwMy4uZDEyY2M5NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jb25uZWN0b3IvY25fdGVzdC5jCisrKyBiL0RvY3VtZW50YXRpb24vY29ubmVjdG9yL2NuX3Rlc3QuYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAKIAkJbWVtY3B5KG0gKyAxLCBkYXRhLCBtLT5sZW4pOwogCi0JCWNuX25ldGxpbmtfc2VuZChtLCAwLCBHRlBfQVRPTUlDKTsKKwkJY25fbmV0bGlua19zZW5kKG0sIDAsIDAsIEdGUF9BVE9NSUMpOwogCQlrZnJlZShtKTsKIAl9CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvY29yZS50eHQgYi9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NvcmUudHh0CmluZGV4IGNlMDY2NmUuLjAwNjBkNzYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvY29yZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9jb3JlLnR4dApAQCAtOTIsNyArOTIsMyBAQAogY3B1CS0gbnVtYmVyIG9mIHRoZSBhZmZlY3RlZCBDUFUKIG9sZAktIG9sZCBmcmVxdWVuY3kKIG5ldwktIG5ldyBmcmVxdWVuY3kKLQotSWYgdGhlIGNwdWZyZXEgY29yZSBkZXRlY3RzIHRoZSBmcmVxdWVuY3kgaGFzIGNoYW5nZWQgd2hpbGUgdGhlIHN5c3RlbQotd2FzIHN1c3BlbmRlZCwgdGhlc2Ugbm90aWZpZXJzIGFyZSBjYWxsZWQgd2l0aCBDUFVGUkVRX1JFU1VNRUNIQU5HRSBhcwotc2Vjb25kIGFyZ3VtZW50LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9jcHUtZHJpdmVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdS1kcml2ZXJzLnR4dAppbmRleCA4YjFhNDQ1Li40OGRhNWZkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdS1kcml2ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdS1kcml2ZXJzLnR4dApAQCAtNjEsNyArNjEsMTMgQEAKIAogQW5kIG9wdGlvbmFsbHkKIAotY3B1ZnJlcV9kcml2ZXIuZXhpdCAtCQlBIHBvaW50ZXIgdG8gYSBwZXItQ1BVIGNsZWFudXAgZnVuY3Rpb24uCitjcHVmcmVxX2RyaXZlci5leGl0IC0JCUEgcG9pbnRlciB0byBhIHBlci1DUFUgY2xlYW51cAorCQkJCWZ1bmN0aW9uIGNhbGxlZCBkdXJpbmcgQ1BVX1BPU1RfREVBRAorCQkJCXBoYXNlIG9mIGNwdSBob3RwbHVnIHByb2Nlc3MuCisKK2NwdWZyZXFfZHJpdmVyLnN0b3BfY3B1IC0JQSBwb2ludGVyIHRvIGEgcGVyLUNQVSBzdG9wIGZ1bmN0aW9uCisJCQkJY2FsbGVkIGR1cmluZyBDUFVfRE9XTl9QUkVQQVJFIHBoYXNlIG9mCisJCQkJY3B1IGhvdHBsdWcgcHJvY2Vzcy4KIAogY3B1ZnJlcV9kcml2ZXIucmVzdW1lIC0JCUEgcG9pbnRlciB0byBhIHBlci1DUFUgcmVzdW1lIGZ1bmN0aW9uCiAJCQkJd2hpY2ggaXMgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNlcy50eHQKaW5kZXggMTAzNzhjYy4uMDg3ZDIxMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXMudHh0CkBAIC00MTAsNiArNDEwLDcgQEAKIAkJMTk0ID0gL2Rldi96a3NoaW0JWmVyby1Lbm93bGVkZ2UgbmV0d29yayBzaGltIGNvbnRyb2wKIAkJMTk1ID0gL2Rldi9lbG9ncmFwaGljcy9lMjIwMQlFbG9ncmFwaGljcyB0b3VjaHNjcmVlbiBFMjcxLTIyMDEKIAkJMTk2ID0gL2Rldi92ZmlvL3ZmaW8JVkZJTyB1c2Vyc3BhY2UgZHJpdmVyIGludGVyZmFjZQorCQkxOTcgPSAvZGV2L3B4YTN4eC1nY3UJUFhBM3h4IGdyYXBoaWNzIGNvbnRyb2xsZXIgdW5pdCBkcml2ZXIKIAkJMTk4ID0gL2Rldi9zZXhlYwlTaWduZWQgZXhlY3V0YWJsZSBpbnRlcmZhY2UKIAkJMTk5ID0gL2Rldi9zY2FubmVycy9jdWVjYXQgOkN1ZUNhdCBiYXJjb2RlIHNjYW5uZXIKIAkJMjAwID0gL2Rldi9uZXQvdHVuCVRBUC9UVU4gbmV0d29yayBkZXZpY2UKQEAgLTQ1MSw2ICs0NTIsNyBAQAogCQkyMzYgPSAvZGV2L21hcHBlci9jb250cm9sCURldmljZS1NYXBwZXIgY29udHJvbCBkZXZpY2UKIAkJMjM3ID0gL2Rldi9sb29wLWNvbnRyb2wgTG9vcGJhY2sgY29udHJvbCBkZXZpY2UKIAkJMjM4ID0gL2Rldi92aG9zdC1uZXQJSG9zdCBrZXJuZWwgYWNjZWxlcmF0b3IgZm9yIHZpcnRpbyBuZXQKKwkJMjM5ID0gL2Rldi91aGlkCQlVc2VyLXNwYWNlIEkvTyBkcml2ZXIgc3VwcG9ydCBmb3IgSElEIHN1YnN5c3RlbQogCiAJCTI0MC0yNTQJCQlSZXNlcnZlZCBmb3IgbG9jYWwgdXNlCiAJCTI1NQkJCVJlc2VydmVkIGZvciBNSVNDX0RZTkFNSUNfTUlOT1IKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYXJtYWRhLTM3MC14cC1tcGljLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYXJtYWRhLTM3MC14cC1tcGljLnR4dAppbmRleCBkNzQwOTFhLi41ZmMwMzEzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2FybWFkYS0zNzAteHAtbXBpYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9hcm1hZGEtMzcwLXhwLW1waWMudHh0CkBAIC0xLDQgKzEsNCBAQAotTWFydmVsbCBBcm1hZGEgMzcwIGFuZCBBcm1hZGEgWFAgSW50ZXJydXB0IENvbnRyb2xsZXIKK01hcnZlbGwgQXJtYWRhIDM3MCwgMzc1LCAzOHgsIFhQIEludGVycnVwdCBDb250cm9sbGVyCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgpAQCAtMTYsNyArMTYsMTMgQEAKICAgYXV0b21hdGljYWxseSBtYXAgdG8gdGhlIGludGVycnVwdCBjb250cm9sbGVyIHJlZ2lzdGVycyBvZiB0aGUKICAgY3VycmVudCBDUFUpCiAKK09wdGlvbmFsIHByb3BlcnRpZXM6CiAKKy0gaW50ZXJydXB0czogSWYgZGVmaW5lZCwgdGhlbiBpdCBpbmRpY2F0ZXMgdGhhdCB0aGlzIE1QSUMgaXMKKyAgY29ubmVjdGVkIGFzIGEgc2xhdmUgdG8gYW5vdGhlciBpbnRlcnJ1cHQgY29udHJvbGxlci4gVGhpcyBpcworICB0eXBpY2FsbHkgdGhlIGNhc2Ugb24gQXJtYWRhIDM3NSBhbmQgQXJtYWRhIDM4eCwgd2hlcmUgdGhlIE1QSUMgaXMKKyAgY29ubmVjdGVkIGFzIGEgc2xhdmUgdG8gdGhlIENvcnRleC1BOSBHSUMuIFRoZSBwcm92aWRlZCBpbnRlcnJ1cHQKKyAgaW5kaWNhdGUgdG8gd2hpY2ggR0lDIGludGVycnVwdCB0aGUgTVBJQyBvdXRwdXQgaXMgY29ubmVjdGVkLgogCiBFeGFtcGxlOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2F0bWVsLWFkYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2F0bWVsLWFkYy50eHQKaW5kZXggZDEwNjE0Ni4uOWExMTc1YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9hdG1lbC1hZGMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYXRtZWwtYWRjLnR4dApAQCAtNSw2ICs1LDkgQEAKICAgICA8Y2hpcD4gY2FuIGJlICJhdDkxc2FtOTI2MCIsICJhdDkxc2FtOWc0NSIgb3IgImF0OTFzYW05eDUiCiAgIC0gcmVnOiBTaG91bGQgY29udGFpbiBBREMgcmVnaXN0ZXJzIGxvY2F0aW9uIGFuZCBsZW5ndGgKICAgLSBpbnRlcnJ1cHRzOiBTaG91bGQgY29udGFpbiB0aGUgSVJRIGxpbmUgZm9yIHRoZSBBREMKKyAgLSBjbG9jay1uYW1lczogdHVwbGUgbGlzdGluZyBpbnB1dCBjbG9jayBuYW1lcy4KKwlSZXF1aXJlZCBlbGVtZW50czogImFkY19jbGsiLCAiYWRjX29wX2NsayIuCisgIC0gY2xvY2tzOiBwaGFuZGxlcyB0byBpbnB1dCBjbG9ja3MuCiAgIC0gYXRtZWwsYWRjLWNoYW5uZWxzLXVzZWQ6IEJpdG1hc2sgb2YgdGhlIGNoYW5uZWxzIG11eGVkIGFuZCBlbmFibGUgZm9yIHRoaXMKICAgICBkZXZpY2UKICAgLSBhdG1lbCxhZGMtc3RhcnR1cC10aW1lOiBTdGFydHVwIFRpbWUgb2YgdGhlIEFEQyBpbiBtaWNyb3NlY29uZHMgYXMKQEAgLTQ0LDYgKzQ3LDggQEAKIAljb21wYXRpYmxlID0gImF0bWVsLGF0OTFzYW05MjYwLWFkYyI7CiAJcmVnID0gPDB4ZmZmYjAwMDAgMHgxMDA+OwogCWludGVycnVwdHMgPSA8MjAgND47CisJY2xvY2tzID0gPCZhZGNfY2xrPiwgPCZhZGNfb3BfY2xrPjsKKwljbG9jay1uYW1lcyA9ICJhZGNfY2xrIiwgImFkY19vcF9jbGsiOwogCWF0bWVsLGFkYy1jaGFubmVsLWJhc2UgPSA8MHgzMD47CiAJYXRtZWwsYWRjLWNoYW5uZWxzLXVzZWQgPSA8MHhmZj47CiAJYXRtZWwsYWRjLWRyZHktbWFzayA9IDwweDEwMDAwPjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWFydmVsbCxkb3ZlLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWFydmVsbCxkb3ZlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWFmNjRjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tYXJ2ZWxsLGRvdmUudHh0CkBAIC0wLDAgKzEsMjIgQEAKK01hcnZlbGwgRG92ZSBQbGF0Zm9ybXMgRGV2aWNlIFRyZWUgQmluZGluZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JvYXJkcyB3aXRoIGEgTWFydmVsbCBEb3ZlIFNvQyBzaGFsbCBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKworUmVxdWlyZWQgcm9vdCBub2RlIHByb3BlcnR5OgorLSBjb21wYXRpYmxlOiBtdXN0IGNvbnRhaW4gIm1hcnZlbGwsZG92ZSI7CisKKyogR2xvYmFsIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisKK0dsb2JhbCBDb25maWd1cmF0aW9uIHJlZ2lzdGVycyBvZiBEb3ZlIFNvQyBhcmUgc2hhcmVkIGJ5IGEgc3lzY29uIG5vZGUuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IG11c3QgY29udGFpbiAibWFydmVsbCxkb3ZlLWdsb2JhbC1jb25maWciIGFuZCAic3lzY29uIi4KKy0gcmVnOiBiYXNlIGFkZHJlc3MgYW5kIHNpemUgb2YgdGhlIEdsb2JhbCBDb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKworRXhhbXBsZToKKworZ2NvbmY6IGdsb2JhbC1jb25maWdAZTgwMmMgeworCWNvbXBhdGlibGUgPSAibWFydmVsbCxkb3ZlLWdsb2JhbC1jb25maWciLCAic3lzY29uIjsKKwlyZWcgPSA8MHhlODAyYyAweDE0PjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3JhcGgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dyYXBoLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTY5YzA3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dyYXBoLnR4dApAQCAtMCwwICsxLDEyOSBAQAorQ29tbW9uIGJpbmRpbmdzIGZvciBkZXZpY2UgZ3JhcGhzCisKK0dlbmVyYWwgY29uY2VwdAorLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBoaWVyYXJjaGljYWwgb3JnYW5pc2F0aW9uIG9mIHRoZSBkZXZpY2UgdHJlZSBpcyB3ZWxsIHN1aXRlZCB0byBkZXNjcmliZQorY29udHJvbCBmbG93IHRvIGRldmljZXMsIGJ1dCB0aGVyZSBjYW4gYmUgbW9yZSBjb21wbGV4IGNvbm5lY3Rpb25zIGJldHdlZW4KK2RldmljZXMgdGhhdCB3b3JrIHRvZ2V0aGVyIHRvIGZvcm0gYSBsb2dpY2FsIGNvbXBvdW5kIGRldmljZSwgZm9sbG93aW5nIGFuCithcmJpdHJhcmlseSBjb21wbGV4IGdyYXBoLgorVGhlcmUgYWxyZWFkeSBpcyBhIHNpbXBsZSBkaXJlY3RlZCBncmFwaCBiZXR3ZWVuIGRldmljZXMgdHJlZSBub2RlcyB1c2luZworcGhhbmRsZSBwcm9wZXJ0aWVzIHBvaW50aW5nIHRvIG90aGVyIG5vZGVzIHRvIGRlc2NyaWJlIGNvbm5lY3Rpb25zIHRoYXQKK2NhbiBub3QgYmUgaW5mZXJyZWQgZnJvbSBkZXZpY2UgdHJlZSBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcy4gVGhlIGRldmljZQordHJlZSBncmFwaCBiaW5kaW5ncyBkZXNjcmliZWQgaGVyZWluIGFic3RyYWN0IG1vcmUgY29tcGxleCBkZXZpY2VzIHRoYXQgY2FuCitoYXZlIG11bHRpcGxlIHNwZWNpZmlhYmxlIHBvcnRzLCBlYWNoIG9mIHdoaWNoIGNhbiBiZSBsaW5rZWQgdG8gb25lIG9yIG1vcmUKK3BvcnRzIG9mIG90aGVyIGRldmljZXMuCisKK1RoZXNlIGNvbW1vbiBiaW5kaW5ncyBkbyBub3QgY29udGFpbiBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRpcmVjdGlvbiBvcgordHlwZSBvZiB0aGUgY29ubmVjdGlvbnMsIHRoZXkganVzdCBtYXAgdGhlaXIgZXhpc3RlbmNlLiBTcGVjaWZpYyBwcm9wZXJ0aWVzCittYXkgYmUgZGVzY3JpYmVkIGJ5IHNwZWNpYWxpemVkIGJpbmRpbmdzIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBjb25uZWN0aW9uLgorCitUbyBzZWUgaG93IHRoaXMgYmluZGluZyBhcHBsaWVzIHRvIHZpZGVvIHBpcGVsaW5lcywgZm9yIGV4YW1wbGUsIHNlZQorRG9jdW1lbnRhdGlvbi9kZXZpY2UtdHJlZS9iaW5kaW5ncy9tZWRpYS92aWRlby1pbnRlcmZhY2VzLnR4dC4KK0hlcmUgdGhlIHBvcnRzIGRlc2NyaWJlIGRhdGEgaW50ZXJmYWNlcywgYW5kIHRoZSBsaW5rcyBiZXR3ZWVuIHRoZW0gYXJlCit0aGUgY29ubmVjdGluZyBkYXRhIGJ1c2VzLiBBIHNpbmdsZSBwb3J0IHdpdGggbXVsdGlwbGUgY29ubmVjdGlvbnMgY2FuCitjb3JyZXNwb25kIHRvIG11bHRpcGxlIGRldmljZXMgYmVpbmcgY29ubmVjdGVkIHRvIHRoZSBzYW1lIHBoeXNpY2FsIGJ1cy4KKworT3JnYW5pc2F0aW9uIG9mIHBvcnRzIGFuZCBlbmRwb2ludHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BvcnRzIGFyZSBkZXNjcmliZWQgYnkgY2hpbGQgJ3BvcnQnIG5vZGVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlIG5vZGUuCitFYWNoIHBvcnQgbm9kZSBjb250YWlucyBhbiAnZW5kcG9pbnQnIHN1Ym5vZGUgZm9yIGVhY2ggcmVtb3RlIGRldmljZSBwb3J0Citjb25uZWN0ZWQgdG8gdGhpcyBwb3J0LiBJZiBhIHNpbmdsZSBwb3J0IGlzIGNvbm5lY3RlZCB0byBtb3JlIHRoYW4gb25lCityZW1vdGUgZGV2aWNlLCBhbiAnZW5kcG9pbnQnIGNoaWxkIG5vZGUgbXVzdCBiZSBwcm92aWRlZCBmb3IgZWFjaCBsaW5rLgorSWYgbW9yZSB0aGFuIG9uZSBwb3J0IGlzIHByZXNlbnQgaW4gYSBkZXZpY2Ugbm9kZSBvciB0aGVyZSBpcyBtb3JlIHRoYW4gb25lCitlbmRwb2ludCBhdCBhIHBvcnQsIG9yIGEgcG9ydCBub2RlIG5lZWRzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNlbGVjdGVkCitoYXJkd2FyZSBpbnRlcmZhY2UsIGEgY29tbW9uIHNjaGVtZSB1c2luZyAnI2FkZHJlc3MtY2VsbHMnLCAnI3NpemUtY2VsbHMnCithbmQgJ3JlZycgcHJvcGVydGllcyBpcyB1c2VkIG51bWJlciB0aGUgbm9kZXMuCisKK2RldmljZSB7CisgICAgICAgIC4uLgorICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwxPjsKKyAgICAgICAgI3NpemUtY2VsbHMgPSA8MD47CisKKyAgICAgICAgcG9ydEAwIHsKKwkgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDE+OworCSAgICAgICAgI3NpemUtY2VsbHMgPSA8MD47CisJCXJlZyA9IDwwPjsKKworICAgICAgICAgICAgICAgIGVuZHBvaW50QDAgeworCQkJcmVnID0gPDA+OworCQkJLi4uCisJCX07CisgICAgICAgICAgICAgICAgZW5kcG9pbnRAMSB7CisJCQlyZWcgPSA8MT47CisJCQkuLi4KKwkJfTsKKyAgICAgICAgfTsKKworICAgICAgICBwb3J0QDEgeworCQlyZWcgPSA8MT47CisKKwkJZW5kcG9pbnQgeyAuLi4gfTsKKwl9OworfTsKKworQWxsICdwb3J0JyBub2RlcyBjYW4gYmUgZ3JvdXBlZCB1bmRlciBhbiBvcHRpb25hbCAncG9ydHMnIG5vZGUsIHdoaWNoCithbGxvd3MgdG8gc3BlY2lmeSAjYWRkcmVzcy1jZWxscywgI3NpemUtY2VsbHMgcHJvcGVydGllcyBmb3IgdGhlICdwb3J0Jworbm9kZXMgaW5kZXBlbmRlbnRseSBmcm9tIGFueSBvdGhlciBjaGlsZCBkZXZpY2Ugbm9kZXMgYSBkZXZpY2UgbWlnaHQKK2hhdmUuCisKK2RldmljZSB7CisgICAgICAgIC4uLgorICAgICAgICBwb3J0cyB7CisgICAgICAgICAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSA8MT47CisgICAgICAgICAgICAgICAgI3NpemUtY2VsbHMgPSA8MD47CisKKyAgICAgICAgICAgICAgICBwb3J0QDAgeworICAgICAgICAgICAgICAgICAgICAgICAgLi4uCisgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludEAwIHsgLi4uIH07CisgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludEAxIHsgLi4uIH07CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHBvcnRAMSB7IC4uLiB9OworICAgICAgICB9OworfTsKKworTGlua3MgYmV0d2VlbiBlbmRwb2ludHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VhY2ggZW5kcG9pbnQgc2hvdWxkIGNvbnRhaW4gYSAncmVtb3RlLWVuZHBvaW50JyBwaGFuZGxlIHByb3BlcnR5IHRoYXQgcG9pbnRzCit0byB0aGUgY29ycmVzcG9uZGluZyBlbmRwb2ludCBpbiB0aGUgcG9ydCBvZiB0aGUgcmVtb3RlIGRldmljZS4gSW4gdHVybiwgdGhlCityZW1vdGUgZW5kcG9pbnQgc2hvdWxkIGNvbnRhaW4gYSAncmVtb3RlLWVuZHBvaW50JyBwcm9wZXJ0eS4gSWYgaXQgaGFzIG9uZSwKK2l0IG11c3Qgbm90IHBvaW50IHRvIGFub3RoZXIgdGhhbiB0aGUgbG9jYWwgZW5kcG9pbnQuIFR3byBlbmRwb2ludHMgd2l0aCB0aGVpcgorJ3JlbW90ZS1lbmRwb2ludCcgcGhhbmRsZXMgcG9pbnRpbmcgYXQgZWFjaCBvdGhlciBmb3JtIGEgbGluayBiZXR3ZWVuIHRoZQorY29udGFpbmluZyBwb3J0cy4KKworZGV2aWNlLTEgeworICAgICAgICBwb3J0IHsKKyAgICAgICAgICAgICAgICBkZXZpY2VfMV9vdXRwdXQ6IGVuZHBvaW50IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZS1lbmRwb2ludCA9IDwmZGV2aWNlXzJfaW5wdXQ+OworICAgICAgICAgICAgICAgIH07CisgICAgICAgIH07Cit9OworCitkZXZpY2UtMiB7CisgICAgICAgIHBvcnQgeworICAgICAgICAgICAgICAgIGRldmljZV8yX2lucHV0OiBlbmRwb2ludCB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGUtZW5kcG9pbnQgPSA8JmRldmljZV8xX291dHB1dD47CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgfTsKK307CisKKworUmVxdWlyZWQgcHJvcGVydGllcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lICdwb3J0JyBvciBtb3JlIHRoYW4gb25lICdlbmRwb2ludCcgbm9kZSBvciAncmVnJworcHJvcGVydHkgaXMgcHJlc2VudCBpbiBwb3J0IGFuZC9vciBlbmRwb2ludCBub2RlcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMKK2FyZSByZXF1aXJlZCBpbiBhIHJlbGV2YW50IHBhcmVudCBub2RlOgorCisgLSAjYWRkcmVzcy1jZWxscyA6IG51bWJlciBvZiBjZWxscyByZXF1aXJlZCB0byBkZWZpbmUgcG9ydC9lbmRwb2ludAorICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyLCBzaG91bGQgYmUgMS4KKyAtICNzaXplLWNlbGxzICAgIDogc2hvdWxkIGJlIHplcm8uCisKK09wdGlvbmFsIGVuZHBvaW50IHByb3BlcnRpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSByZW1vdGUtZW5kcG9pbnQ6IHBoYW5kbGUgdG8gYW4gJ2VuZHBvaW50JyBzdWJub2RlIG9mIGEgcmVtb3RlIGRldmljZSBub2RlLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3RyaXZpYWwtZGV2aWNlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3RyaXZpYWwtZGV2aWNlcy50eHQKaW5kZXggMWExYWMyZS4uZjQ3ZTU2YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy90cml2aWFsLWRldmljZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJpdmlhbC1kZXZpY2VzLnR4dApAQCAtMTgsNiArMTgsNyBAQAogYXRtZWwsYXQ5N3NjMzIwNHQJaTJjIHRydXN0ZWQgcGxhdGZvcm0gbW9kdWxlIChUUE0pCiBjYXBlbGxhLGNtMzIxODEJCUNNMzIxODE6IEFtYmllbnQgTGlnaHQgU2Vuc29yCiBjYXRhbHlzdCwyNGMzMgkJaTJjIHNlcmlhbCBlZXByb20KK2NpcnJ1cyxjczQybDUxCQlDaXJydXMgTG9naWMgQ1M0Mkw1MSBhdWRpbyBjb2RlYwogZGFsbGFzLGRzMTMwNwkJNjQgeCA4LCBTZXJpYWwsIEkyQyBSZWFsLVRpbWUgQ2xvY2sKIGRhbGxhcyxkczEzMzgJCUkyQyBSVEMgd2l0aCA1Ni1CeXRlIE5WIFJBTQogZGFsbGFzLGRzMTMzOQkJSTJDIFNlcmlhbCBSZWFsLVRpbWUgQ2xvY2sKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL3ZmNjEwLWFkYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy92ZjYxMC1hZGMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZWJmZjE5MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL3ZmNjEwLWFkYy50eHQKQEAgLTAsMCArMSwyMiBAQAorRnJlZXNjYWxlIHZmNjEwIEFuYWxvZyB0byBEaWdpdGFsIENvbnZlcnRlciBiaW5kaW5ncworCitUaGUgZGV2aWNldHJlZSBiaW5kaW5ncyBhcmUgZm9yIHRoZSBuZXcgQURDIGRyaXZlciB3cml0dGVuIGZvcgordmY2MTAvaS5NWDZzbHggYW5kIHVwd2FyZCBTb0NzIGZyb20gRnJlZXNjYWxlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBTaG91bGQgY29udGFpbiAiZnNsLHZmNjEwLWFkYyIKKy0gcmVnOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlCistIGludGVycnVwdHM6IFNob3VsZCBjb250YWluIHRoZSBpbnRlcnJ1cHQgZm9yIHRoZSBkZXZpY2UKKy0gY2xvY2tzOiBUaGUgY2xvY2sgaXMgbmVlZGVkIGJ5IHRoZSBBREMgY29udHJvbGxlciwgQURDIGNsb2NrIHNvdXJjZSBpcyBpcGcgY2xvY2suCistIGNsb2NrLW5hbWVzOiBNdXN0IGNvbnRhaW4gImFkYyIsIG1hdGNoaW5nIGVudHJ5IGluIHRoZSBjbG9ja3MgcHJvcGVydHkuCistIHZyZWYtc3VwcGx5OiBUaGUgcmVndWxhdG9yIHN1cHBseSBBREMgcmVmcmVuY2Ugdm9sdGFnZS4KKworRXhhbXBsZToKK2FkYzA6IGFkY0A0MDAzYjAwMCB7CisJY29tcGF0aWJsZSA9ICJmc2wsdmY2MTAtYWRjIjsKKwlyZWcgPSA8MHg0MDAzYjAwMCAweDEwMDA+OworCWludGVycnVwdHMgPSA8MCA1MyAweDA0PjsKKwljbG9ja3MgPSA8JmNsa3MgVkY2MTBfQ0xLX0FEQzA+OworCWNsb2NrLW5hbWVzID0gImFkYyI7CisJdnJlZi1zdXBwbHkgPSA8JnJlZ192Y2NfM3YzX21jdT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMveGlsaW54LXhhZGMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMveGlsaW54LXhhZGMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZWU5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy94aWxpbngteGFkYy50eHQKQEAgLTAsMCArMSwxMTMgQEAKK1hpbGlueCBYQURDIGRldmljZSBkcml2ZXIKKworVGhpcyBiaW5kaW5nIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgYmluZGluZ3MgZm9yIGJvdGggb2YgdGhlbSBzaW5jZSB0aGUKK2JpbmRpbmdzIGFyZSB2ZXJ5IHNpbWlsYXIuIFRoZSBYaWxpbnggWEFEQyBpcyBhIEFEQyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUKK3NlcmllcyA3IEZQR0FzIGZyb20gWGlsaW54LiBUaGUgWEFEQyBoYXMgYSBEUlAgaW50ZXJmYWNlIGZvciBjb21tdW5pY2F0aW9uLgorQ3VycmVudGx5IHR3byBkaWZmZXJlbnQgZnJvbnRlbmRzIGZvciB0aGUgRFJQIGludGVyZmFjZSBleGlzdC4gT25lIHRoYXQgaXMgb25seQorYXZhaWxhYmxlIG9uIHRoZSBaWU5RIGZhbWlseSBhcyBhIGhhcmRtYWNybyBpbiB0aGUgU29DIHBvcnRpb24gb2YgdGhlIFpZTlEuIFRoZQorb3RoZXIgb25lIGlzIGF2YWlsYWJsZSBvbiBhbGwgc2VyaWVzIDcgcGxhdGZvcm1zIGFuZCBpcyBhIHNvZnRtYWNybyB3aXRoIGEgQVhJCitpbnRlcmZhY2UuIFRoaXMgYmluZGluZyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGJpbmRpbmdzIGZvciBib3RoIG9mIHRoZW0gc2luY2UKK3RoZSBiaW5kaW5ncyBhcmUgdmVyeSBzaW1pbGFyLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCS0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZgorCQkqICJ4bG54LHp5bnEteGFkYy0xLjAwLmEiOiBXaGVuIHVzaW5nIHRoZSBaWU5RIGRldmljZQorCQkgIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIHRvIGludGVyZmFjZSB0byB0aGUgWEFEQyBoYXJkbWFjcm8uCisJCSogInhsbngsYXhpLXhhZGMtMS4wMC5hIjogV2hlbiB1c2luZyB0aGUgYXhpLXhhZGMgcGNvcmUgdG8KKwkJICBpbnRlcmZhY2UgdG8gdGhlIFhBREMgaGFyZG1hY3JvLgorCS0gcmVnOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZQorCS0gaW50ZXJydXB0czogSW50ZXJydXB0IGZvciB0aGUgWEFEQyBjb250cm9sIGludGVyZmFjZS4KKwktIGNsb2NrczogV2hlbiB1c2luZyB0aGUgWllOUSB0aGlzIG11c3QgYmUgdGhlIFpZTlEgUENBUCBjbG9jaywKKwkgIHdoZW4gdXNpbmcgdGhlIEFYSS1YQURDIHBjb3JlIHRoaXMgbXVzdCBiZSB0aGUgY2xvY2sgdGhhdCBwcm92aWRlcyB0aGUKKwkgIGNsb2NrIHRvIHRoZSBBWEkgYnVzIGludGVyZmFjZSBvZiB0aGUgY29yZS4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKwktIGludGVycnVwdC1wYXJlbnQ6IHBoYW5kbGUgdG8gdGhlIHBhcmVudCBpbnRlcnJ1cHQgY29udHJvbGxlcgorCS0geGxueCxleHRlcm5hbC1tdXg6CisJCSogIm5vbmUiOiBObyBleHRlcm5hbCBtdWx0aXBsZXhlciBpcyB1c2VkLCB0aGlzIGlzIHRoZSBkZWZhdWx0CisJCSAgaWYgdGhlIHByb3BlcnR5IGlzIG9taXR0ZWQuCisJCSogInNpbmdsZSI6IEV4dGVybmFsIG11bHRpcGxleGVyIG1vZGUgaXMgdXNlZCB3aXRoIG9uZQorCQkgICBtdWx0aXBsZXhlci4KKwkJKiAiZHVhbCI6IEV4dGVybmFsIG11bHRpcGxleGVyIG1vZGUgaXMgdXNlZCB3aXRoIHR3bworCQkgIG11bHRpcGxleGVycyBmb3Igc2ltdWx0YW5lb3VzIHNhbXBsaW5nLgorCS0geGxueCxleHRlcm5hbC1tdXgtY2hhbm5lbDogQ29uZmlndXJlcyB3aGljaCBwYWlyIG9mIHBpbnMgaXMgdXNlZCB0bworCSAgc2FtcGxlIGRhdGEgaW4gZXh0ZXJuYWwgbXV4IG1vZGUuCisJICBWYWxpZCB2YWx1ZXMgZm9yIHNpbmdsZSBleHRlcm5hbCBtdWx0aXBsZXhlciBtb2RlIGFyZToKKwkJMDogVlAvVk4KKwkJMTogVkFVWFBbMF0vVkFVWE5bMF0KKwkJMjogVkFVWFBbMV0vVkFVWE5bMV0KKwkJLi4uCisJCTE2OiBWQVVYUFsxNV0vVkFVWE5bMTVdCisJICBWYWxpZCB2YWx1ZXMgZm9yIGR1YWwgZXh0ZXJuYWwgbXVsdGlwbGV4ZXIgbW9kZSBhcmU6CisJCTE6IFZBVVhQWzBdL1ZBVVhOWzBdIC0gVkFVWFBbOF0vVkFVWE5bOF0KKwkJMjogVkFVWFBbMV0vVkFVWE5bMV0gLSBWQVVYUFs5XS9WQVVYTls5XQorCQkuLi4KKwkJODogVkFVWFBbN10vVkFVWE5bN10gLSBWQVVYUFsxNV0vVkFVWE5bMTVdCisKKwkgIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gYmUgcHJlc2VudCBpZiB0aGUgZGV2aWNlIGlzIGNvbmZpZ3VyZWQgZm9yCisJICBleHRlcm5hbCBtdWx0aXBsZXhlciBtb2RlIChlaXRoZXIgc2luZ2xlIG9yIGR1YWwpLiBJZiB0aGUgZGV2aWNlIGlzCisJICBub3QgdXNpbmcgZXh0ZXJuYWwgbXVsdGlwbGV4ZXIgbW9kZSB0aGUgcHJvcGVydHkgaXMgaWdub3JlZC4KKwktIHhubHgsY2hhbm5lbHM6IExpc3Qgb2YgZXh0ZXJuYWwgY2hhbm5lbHMgdGhhdCBhcmUgY29ubmVjdGVkIHRvIHRoZSBBREMKKwkgIFJlcXVpcmVkIHByb3BlcnRpZXM6CisJCSogI2FkZHJlc3MtY2VsbHM6IFNob3VsZCBiZSAxLgorCQkqICNzaXplLWNlbGxzOiBTaG91bGQgYmUgMC4KKworCSAgVGhlIGNoaWxkIG5vZGVzIG9mIHRoaXMgbm9kZSByZXByZXNlbnQgdGhlIGV4dGVybmFsIGNoYW5uZWxzIHdoaWNoIGFyZQorCSAgY29ubmVjdGVkIHRvIHRoZSBBREMuIElmIHRoZSBwcm9wZXJ0eSBpcyBubyBwcmVzZW50IG5vIGV4dGVybmFsCisJICBjaGFubmVscyB3aWxsIGJlIGFzc3VtZWQgdG8gYmUgY29ubmVjdGVkLgorCisJICBFYWNoIGNoaWxkIG5vZGUgcmVwcmVzZW50cyBvbmUgY2hhbm5lbCBhbmQgaGFzIHRoZSBmb2xsb3dpbmcKKwkgIHByb3BlcnRpZXM6CisJCVJlcXVpcmVkIHByb3BlcnRpZXM6CisJCQkqIHJlZzogUGFpciBvZiBwaW5zIHRoZSB0aGUgY2hhbm5lbCBpcyBjb25uZWN0ZWQgdG8uCisJCQkJMDogVlAvVk4KKwkJCQkxOiBWQVVYUFswXS9WQVVYTlswXQorCQkJCTI6IFZBVVhQWzFdL1ZBVVhOWzFdCisJCQkJLi4uCisJCQkJMTY6IFZBVVhQWzE1XS9WQVVYTlsxNV0KKwkJCSAgTm90ZSBlYWNoIGNoYW5uZWwgbnVtYmVyIHNob3VsZCBvbmx5IGJlIHVzZWQgYXQgbW9zdAorCQkJICBvbmNlLgorCQlPcHRpb25hbCBwcm9wZXJ0aWVzOgorCQkJKiB4bG54LGJpcG9sYXI6IElmIHNldCB0aGUgY2hhbm5lbCBpcyB1c2VkIGluIGJpcG9sYXIKKwkJCSAgbW9kZS4KKworCitFeGFtcGxlczoKKwl4YWRjQGY4MDA3MTAwIHsKKwkJY29tcGF0aWJsZSA9ICJ4bG54LHp5bnEteGFkYy0xLjAwLmEiOworCQlyZWcgPSA8MHhmODAwNzEwMCAweDIwPjsKKwkJaW50ZXJydXB0cyA9IDwwIDcgND47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CisJCWNsb2NrcyA9IDwmcGNhcF9jbGs+OworCisJCXhsbngsY2hhbm5lbHMgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNoYW5uZWxAMCB7CisJCQkJcmVnID0gPDA+OworCQkJfTsKKwkJCWNoYW5uZWxAMSB7CisJCQkJcmVnID0gPDE+OworCQkJfTsKKwkJCWNoYW5uZWxAOCB7CisJCQkJcmVnID0gPDg+OworCQkJfTsKKwkJfTsKKwl9OworCisJeGFkY0A0MzIwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAieGxueCxheGkteGFkYy0xLjAwLmEiOworCQlyZWcgPSA8MHg0MzIwMDAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDAgNTMgND47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CisJCWNsb2NrcyA9IDwmZnBnYTFfY2xrPjsKKworCQl4bG54LGNoYW5uZWxzIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljaGFubmVsQDAgeworCQkJCXJlZyA9IDwwPjsKKwkJCQl4bG54LGJpcG9sYXI7CisJCQl9OworCQl9OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYWxsd2lubmVyLHN1bjRpLWljLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hbGx3aW5uZXIsc3VuNGktaWMudHh0CmluZGV4IDMyY2VjNGIuLmIyOTBjYTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hbGx3aW5uZXIsc3VuNGktaWMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hbGx3aW5uZXIsc3VuNGktaWMudHh0CkBAIC0yLDcgKzIsNyBAQAogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogCi0tIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgImFsbHdpbm5lcixzdW40aS1pYyIKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAiYWxsd2lubmVyLHN1bjRpLWExMC1pYyIKIC0gcmVnIDogU3BlY2lmaWVzIGJhc2UgcGh5c2ljYWwgYWRkcmVzcyBhbmQgc2l6ZSBvZiB0aGUgcmVnaXN0ZXJzLgogLSBpbnRlcnJ1cHQtY29udHJvbGxlciA6IElkZW50aWZpZXMgdGhlIG5vZGUgYXMgYW4gaW50ZXJydXB0IGNvbnRyb2xsZXIKIC0gI2ludGVycnVwdC1jZWxscyA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNlbGxzIG5lZWRlZCB0byBlbmNvZGUgYW4KQEAgLTExLDcgKzExLDcgQEAKIEV4YW1wbGU6CiAKIGludGM6IGludGVycnVwdC1jb250cm9sbGVyIHsKLQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1pYyI7CisJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLWljIjsKIAlyZWcgPSA8MHgwMWMyMDQwMCAweDQwMD47CiAJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hbGx3aW5uZXIsc3VuNjdpLXNjLW5taS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYWxsd2lubmVyLHN1bjY3aS1zYy1ubWkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYzVjZGEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYWxsd2lubmVyLHN1bjY3aS1zYy1ubWkudHh0CkBAIC0wLDAgKzEsMjcgQEAKK0FsbHdpbm5lciBTdW54aSBOTUkgQ29udHJvbGxlcgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAiYWxsd2lubmVyLHN1bjdpLWEyMC1zYy1ubWkiIG9yCisgICJhbGx3aW5uZXIsc3VuNmktYTMxLXNjLW5taSIKKy0gcmVnIDogU3BlY2lmaWVzIGJhc2UgcGh5c2ljYWwgYWRkcmVzcyBhbmQgc2l6ZSBvZiB0aGUgcmVnaXN0ZXJzLgorLSBpbnRlcnJ1cHQtY29udHJvbGxlciA6IElkZW50aWZpZXMgdGhlIG5vZGUgYXMgYW4gaW50ZXJydXB0IGNvbnRyb2xsZXIKKy0gI2ludGVycnVwdC1jZWxscyA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNlbGxzIG5lZWRlZCB0byBlbmNvZGUgYW4KKyAgaW50ZXJydXB0IHNvdXJjZS4gVGhlIHZhbHVlIHNoYWxsIGJlIDIuIFRoZSBmaXJzdCBjZWxsIGlzIHRoZSBJUlEgbnVtYmVyLCB0aGUKKyAgc2Vjb25kIGNlbGwgdGhlIHRyaWdnZXIgdHlwZSBhcyBkZWZpbmVkIGluIGludGVycnVwdC50eHQgaW4gdGhpcyBkaXJlY3RvcnkuCistIGludGVycnVwdC1wYXJlbnQ6IFNwZWNpZmllcyB0aGUgcGFyZW50IGludGVycnVwdCBjb250cm9sbGVyLgorLSBpbnRlcnJ1cHRzOiBTcGVjaWZpZXMgdGhlIGludGVycnVwdCBsaW5lIChOTUkpIHdoaWNoIGlzIGhhbmRsZWQgYnkKKyAgdGhlIGludGVycnVwdCBjb250cm9sbGVyIGluIHRoZSBwYXJlbnQgY29udHJvbGxlcidzIG5vdGF0aW9uLiBUaGlzIHZhbHVlCisgIHNoYWxsIGJlIHRoZSBOTUkuCisKK0V4YW1wbGU6CisKK3NjLW5taS1pbnRjQDAxYzAwMDMwIHsKKwljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW43aS1hMjAtc2Mtbm1pIjsKKwlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCXJlZyA9IDwweDAxYzAwMDMwIDB4MGM+OworCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CisJaW50ZXJydXB0cyA9IDwwIDAgND47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VycGMvZnNsL2lmYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVtb3J5LWNvbnRyb2xsZXJzL2ZzbC9pZmMudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvaWZjLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lbW9yeS1jb250cm9sbGVycy9mc2wvaWZjLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lbW9yeS1jb250cm9sbGVycy90aS1hZW1pZi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVtb3J5LWNvbnRyb2xsZXJzL3RpLWFlbWlmLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTkyNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lbW9yeS1jb250cm9sbGVycy90aS1hZW1pZi50eHQKQEAgLTAsMCArMSwyMTAgQEAKKyogRGV2aWNlIHRyZWUgYmluZGluZ3MgZm9yIFRleGFzIGluc3RydW1lbnRzIEFFTUlGIGNvbnRyb2xsZXIKKworVGhlIEFzeW5jIEV4dGVybmFsIE1lbW9yeSBJbnRlcmZhY2UgKEVNSUYxNi9BRU1JRikgY29udHJvbGxlciBpcyBpbnRlbmRlZCB0bworcHJvdmlkZSBhIGdsdWUtbGVzcyBpbnRlcmZhY2UgdG8gYSB2YXJpZXR5IG9mIGFzeW5jaHJvbm91cyBtZW1vcnkgZGV2aWNlcyBsaWtlCitBU1JBIE0sIE5PUiBhbmQgTkFORCBtZW1vcnkuIEEgdG90YWwgb2YgMjU2TSBieXRlcyBvZiBhbnkgb2YgdGhlc2UgbWVtb3JpZXMKK2NhbiBiZSBhY2Nlc3NlZCBhdCBhbnkgZ2l2ZW4gdGltZSB2aWEgZm91ciBjaGlwIHNlbGVjdHMgd2l0aCA2NE0gYnl0ZSBhY2Nlc3MKK3BlciBjaGlwIHNlbGVjdC4gU3luY2hyb25vdXMgbWVtb3JpZXMgc3VjaCBhcyBERFIxIFNEIFJBTSwgU0RSIFNEUkFNCithbmQgTW9iaWxlIFNEUiBhcmUgbm90IHN1cHBvcnRlZC4KKworRG9jdW1lbnRhdGlvbjoKK0RhdmluY2kgRE02NDZ4IC0gaHR0cDovL3d3dy50aS5jb20vbGl0L3VnL3NwcnVlcTdjL3NwcnVlcTdjLnBkZgorT01BUC1MMTM4IChEQTg1MCkgLSBodHRwOi8vd3d3LnRpLmNvbS9saXQvdWcvc3BydWg3N2Evc3BydWg3N2EucGRmCitLZXN0b25lIC0gaHR0cDovL3d3dy50aS5jb20vbGl0L3VnL3NwcnVnejNhL3NwcnVnejNhLnBkZgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGU6CQkidGksZGF2aW5jaS1hZW1pZiIKKwkJCSJ0aSxrZXlzdG9uZS1hZW1pZiIKKwkJCSJ0aSxkYTg1MC1hZW1pZiIKKworLSByZWc6CQkJY29udGFpbnMgb2Zmc2V0L2xlbmd0aCB2YWx1ZSBmb3IgQUVNSUYgY29udHJvbCByZWdpc3RlcnMKKwkJCXNwYWNlLgorCistICNhZGRyZXNzLWNlbGxzOglNdXN0IGJlIDIuIFRoZSBwYXJ0aXRpb24gbnVtYmVyIGhhcyB0byBiZSBlbmNvZGVkIGluIHRoZQorCQkJZmlyc3QgYWRkcmVzcyBjZWxsIGFuZCBpdCBtYXkgYWNjZXB0IHZhbHVlcyAwLi5OLTEKKwkJCShOIC0gdG90YWwgbnVtYmVyIG9mIHBhcnRpdGlvbnMpLiBJdCdzIHJlY29tbWVuZGVkIHRvCisJCQlhc3NpZ24gTi0xIG51bWJlciBmb3IgdGhlIGNvbnRyb2wgcGFydGl0aW9uLiBUaGUgc2Vjb25kCisJCQljZWxsIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgcGFydGl0aW9uLgorCistICNzaXplLWNlbGxzOgkJTXVzdCBiZSBzZXQgdG8gMS4KKworLSByYW5nZXM6CQlDb250YWlucyBtZW1vcnkgcmVnaW9ucy4gVGhlcmUgYXJlIHR3byB0eXBlcyBvZgorCQkJcmFuZ2VzL3BhcnRpdGlvbnM6CisJCQktIENTLXNwZWNpZmljIHBhcnRpdGlvbi9yYW5nZS4gSWYgY29udGludW91cywgbXVzdCBiZQorCQkJc2V0IHVwIHRvIHJlZmxlY3QgdGhlIG1lbW9yeSBsYXlvdXQgZm9yIDQgY2hpcHNlbGVjdHMsCisJCQlpZiBub3QgdGhlbiBhZGRpdGlvbmFsIHJhbmdlL3BhcnRpdGlvbiBjYW4gYmUgYWRkZWQgYW5kCisJCQljaGlsZCBkZXZpY2UgY2FuIHNlbGVjdCB0aGUgcHJvcGVyIG9uZS4KKwkJCS0gY29udHJvbCBwYXJ0aXRpb24gd2hpY2ggaXMgY29tbW9uIGZvciBhbGwgQ1MKKwkJCWludGVyZmFjZXMuCisKKy0gY2xvY2tzOgkJdGhlIGNsb2NrIGZlZWRpbmcgdGhlIGNvbnRyb2xsZXIgY2xvY2suIFJlcXVpcmVkIG9ubHkKKwkJCWlmIGNsb2NrIHRyZWUgZGF0YSBwcmVzZW50IGluIGRldmljZSB0cmVlLgorCQkJU2VlIGNsb2NrLWJpbmRpbmdzLnR4dAorCistIGNsb2NrLW5hbWVzOgkJY2xvY2sgbmFtZS4gSXQgaGFzIHRvIGJlICJhZW1pZiIuIFJlcXVpcmVkIG9ubHkgaWYgY2xvY2sKKwkJCXRyZWUgZGF0YSBwcmVzZW50IGluIGRldmljZSB0cmVlLCBpbiBhbm90aGVyIGNhc2UgZG9uJ3QKKwkJCXVzZSBpdC4KKwkJCVNlZSBjbG9jay1iaW5kaW5ncy50eHQKKworLSBjbG9jay1yYW5nZXM6CQlFbXB0eSBwcm9wZXJ0eSBpbmRpY2F0aW5nIHRoYXQgY2hpbGQgbm9kZXMgY2FuIGluaGVyaXQKKwkJCW5hbWVkIGNsb2Nrcy4gUmVxdWlyZWQgb25seSBpZiBjbG9jayB0cmVlIGRhdGEgcHJlc2VudAorCQkJaW4gZGV2aWNlIHRyZWUuCisJCQlTZWUgY2xvY2stYmluZGluZ3MudHh0CisKKworQ2hpbGQgY2hpcC1zZWxlY3QgKGNzKSBub2RlcyBjb250YWluIHRoZSBtZW1vcnkgZGV2aWNlcyBub2RlcyBjb25uZWN0ZWQgdG8KK3N1Y2ggYXMgTk9SIChlLmcuIGNmaS1mbGFzaCkgYW5kIE5BTkQgKHRpLGRhdmluY2ktbmFuZCwgc2VlIGRhdmluY2ktbmFuZC50eHQpLgorVGhlcmUgbWlnaHQgYmUgYm9hcmQgc3BlY2lmaWMgZGV2aWNlcyBsaWtlIEZQR0FzLgorCitSZXF1aXJlZCBjaGlsZCBjcyBub2RlIHByb3BlcnRpZXM6CisKKy0gI2FkZHJlc3MtY2VsbHM6CU11c3QgYmUgMi4KKworLSAjc2l6ZS1jZWxsczoJCU11c3QgYmUgMS4KKworLSByYW5nZXM6CQlFbXB0eSBwcm9wZXJ0eSBpbmRpY2F0aW5nIHRoYXQgY2hpbGQgbm9kZXMgY2FuIGluaGVyaXQKKwkJCW1lbW9yeSBsYXlvdXQuCisKKy0gY2xvY2stcmFuZ2VzOgkJRW1wdHkgcHJvcGVydHkgaW5kaWNhdGluZyB0aGF0IGNoaWxkIG5vZGVzIGNhbiBpbmhlcml0CisJCQluYW1lZCBjbG9ja3MuIFJlcXVpcmVkIG9ubHkgaWYgY2xvY2sgdHJlZSBkYXRhIHByZXNlbnQKKwkJCWluIGRldmljZSB0cmVlLgorCistIHRpLGNzLWNoaXBzZWxlY3Q6CW51bWJlciBvZiBjaGlwc2VsZWN0LiBJbmRpY2F0ZXMgb24gdGhlIGFlbWlmIGRyaXZlcgorCQkJd2hpY2ggY2hpcHNlbGVjdCBpcyB1c2VkIGZvciBhY2Nlc3NpbmcgdGhlIG1lbW9yeS4gRm9yCisJCQljb21wYXRpYmxlcyAidGksZGF2aW5jaS1hZW1pZiIgYW5kICJ0aSxrZXlzdG9uZS1hZW1pZiIKKwkJCWl0IGNhbiBiZSBpbiByYW5nZSBbMC0zXS4gRm9yIGNvbXBhdGlibGUKKwkJCSJ0aSxkYTg1MC1hZW1pZiIgcmFuZ2UgaXMgWzItNV0uCisKK09wdGlvbmFsIGNoaWxkIGNzIG5vZGUgcHJvcGVydGllczoKKworLSB0aSxjcy1idXMtd2lkdGg6CQl3aWR0aCBvZiB0aGUgYXN5bmNocm9ub3VzIGRldmljZSdzIGRhdGEgYnVzCisJCQkJOCBvciAxNiBpZiBub3QgcHJlc2V0IDgKKworLSB0aSxjcy1zZWxlY3Qtc3Ryb2JlLW1vZGU6CWVuYWJsZS9kaXNhYmxlIHNlbGVjdCBzdHJvYmUgbW9kZQorCQkJCUluIHNlbGVjdCBzdHJvYmUgbW9kZSBjaGlwIHNlbGVjdCBiZWhhdmVzIGFzCisJCQkJdGhlIHN0cm9iZSBhbmQgaXMgYWN0aXZlIG9ubHkgZHVyaW5nIHRoZSBzdHJvYmUKKwkJCQlwZXJpb2QuIElmIHByZXNlbnQgdGhlbiBlbmFibGUuCisKKy0gdGksY3MtZXh0ZW5kZWQtd2FpdC1tb2RlOgllbmFibGUvZGlzYWJsZSBleHRlbmRlZCB3YWl0IG1vZGUKKwkJCQlpZiBzZXQsIHRoZSBjb250cm9sbGVyIG1vbml0b3JzIHRoZSBFTUlGV0FJVCBwaW4KKwkJCQltYXBwZWQgdG8gdGhhdCBjaGlwIHNlbGVjdCB0byBkZXRlcm1pbmUgaWYgdGhlCisJCQkJZGV2aWNlIHdhbnRzIHRvIGV4dGVuZCB0aGUgc3Ryb2JlIHBlcmlvZC4gSWYKKwkJCQlwcmVzZW50IHRoZW4gZW5hYmxlLgorCistIHRpLGNzLW1pbi10dXJuYXJvdW5kLW5zOgltaW5pbXVtIHR1cm4gYXJvdW5kIHRpbWUsIG5zCisJCQkJVGltZSBiZXR3ZWVuIHRoZSBlbmQgb2Ygb25lIGFzeW5jaHJvbm91cyBtZW1vcnkKKwkJCQlhY2Nlc3MgYW5kIHRoZSBzdGFydCBvZiBhbm90aGVyIGFzeW5jaHJvbm91cworCQkJCW1lbW9yeSBhY2Nlc3MuIFRoaXMgZGVsYXkgaXMgbm90IGluY3VycmVkCisJCQkJYmV0d2VlbiBhIHJlYWQgZm9sbG93ZWQgYnkgcmVhZCBvciBhIHdyaXRlCisJCQkJZm9sbG93ZWQgYnkgYSB3cml0ZSB0byBzYW1lIGNoaXAgc2VsZWN0LgorCistIHRpLGNzLXJlYWQtc2V0dXAtbnM6CQlyZWFkIHNldHVwIHdpZHRoLCBucworCQkJCVRpbWUgYmV0d2VlbiB0aGUgYmVnaW5uaW5nIG9mIGEgbWVtb3J5IGN5Y2xlCisJCQkJYW5kIHRoZSBhY3RpdmF0aW9uIG9mIHJlYWQgc3Ryb2JlLgorCQkJCU1pbmltdW0gdmFsdWUgaXMgMSAoMCB0cmVhdGVkIGFzIDEpLgorCistIHRpLGNzLXJlYWQtc3Ryb2JlLW5zOgkJcmVhZCBzdHJvYmUgd2lkdGgsIG5zCisJCQkJVGltZSBiZXR3ZWVuIHRoZSBhY3RpdmF0aW9uIGFuZCBkZWFjdGl2YXRpb24gb2YKKwkJCQl0aGUgcmVhZCBzdHJvYmUuCisJCQkJTWluaW11bSB2YWx1ZSBpcyAxICgwIHRyZWF0ZWQgYXMgMSkuCisKKy0gdGksY3MtcmVhZC1ob2xkLW5zOgkJcmVhZCBob2xkIHdpZHRoLCBucworCQkJCVRpbWUgYmV0d2VlbiB0aGUgZGVhY3RpdmF0aW9uIG9mIHRoZSByZWFkCisJCQkJc3Ryb2JlIGFuZCB0aGUgZW5kIG9mIHRoZSBjeWNsZSAod2hpY2ggbWF5IGJlCisJCQkJZWl0aGVyIGFuIGFkZHJlc3MgY2hhbmdlIG9yIHRoZSBkZWFjdGl2YXRpb24gb2YKKwkJCQl0aGUgY2hpcCBzZWxlY3Qgc2lnbmFsLgorCQkJCU1pbmltdW0gdmFsdWUgaXMgMSAoMCB0cmVhdGVkIGFzIDEpLgorCistIHRpLGNzLXdyaXRlLXNldHVwLW5zOgkJd3JpdGUgc2V0dXAgd2lkdGgsIG5zCisJCQkJVGltZSBiZXR3ZWVuIHRoZSBiZWdpbm5pbmcgb2YgYSBtZW1vcnkgY3ljbGUKKwkJCQlhbmQgdGhlIGFjdGl2YXRpb24gb2Ygd3JpdGUgc3Ryb2JlLgorCQkJCU1pbmltdW0gdmFsdWUgaXMgMSAoMCB0cmVhdGVkIGFzIDEpLgorCistIHRpLGNzLXdyaXRlLXN0cm9iZS1uczoJd3JpdGUgc3Ryb2JlIHdpZHRoLCBucworCQkJCVRpbWUgYmV0d2VlbiB0aGUgYWN0aXZhdGlvbiBhbmQgZGVhY3RpdmF0aW9uIG9mCisJCQkJdGhlIHdyaXRlIHN0cm9iZS4KKwkJCQlNaW5pbXVtIHZhbHVlIGlzIDEgKDAgdHJlYXRlZCBhcyAxKS4KKworLSB0aSxjcy13cml0ZS1ob2xkLW5zOgkJd3JpdGUgaG9sZCB3aWR0aCwgbnMKKwkJCQlUaW1lIGJldHdlZW4gdGhlIGRlYWN0aXZhdGlvbiBvZiB0aGUgd3JpdGUKKwkJCQlzdHJvYmUgYW5kIHRoZSBlbmQgb2YgdGhlIGN5Y2xlICh3aGljaCBtYXkgYmUKKwkJCQllaXRoZXIgYW4gYWRkcmVzcyBjaGFuZ2Ugb3IgdGhlIGRlYWN0aXZhdGlvbiBvZgorCQkJCXRoZSBjaGlwIHNlbGVjdCBzaWduYWwuCisJCQkJTWluaW11bSB2YWx1ZSBpcyAxICgwIHRyZWF0ZWQgYXMgMSkuCisKK0lmIGFueSBvZiB0aGUgYWJvdmUgcGFyYW1ldGVycyBhcmUgYWJzZW50LCBjdXJyZW50IHBhcmFtZXRlciB2YWx1ZSB3aWxsIGJlIHRha2VuCitmcm9tIHRoZSBjb3JyZXNwb25kaW5nIEhXIHJlZy4KKworRXhhbXBsZSBmb3IgYWVtaWYsIGRhdmluY2kgbmFuZCBhbmQgbm9yIGZsYXNoIGNoaXAgc2VsZWN0IHNob3duIGJlbG93LgorCittZW1vcnktY29udHJvbGxlckAyMTAwMEEwMCB7CisJY29tcGF0aWJsZSA9ICJ0aSxkYXZpbmNpLWFlbWlmIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwljbG9ja3MgPSA8JmNsa2FlbWlmIDA+OworCWNsb2NrLW5hbWVzID0gImFlbWlmIjsKKwljbG9jay1yYW5nZXM7CisJcmVnID0gPDB4MjEwMDBBMDAgMHgwMDAwMDEwMD47CisJcmFuZ2VzID0gPDAgMCAweDcwMDAwMDAwIDB4MTAwMDAwMDAKKwkJICAxIDAgMHgyMTAwMEEwMCAweDAwMDAwMTAwPjsKKwkJICAvKgorCQkgICAqIFBhcnRpdGlvbjA6IENTLXNwZWNpZmljIG1lbW9yeSByYW5nZSB3aGljaCBpcworCQkgICAqIGltcGxlbWVudGVkIGFzIGNvbnRpbnVvdXMgcGh5c2ljYWwgbWVtb3J5IHJlZ2lvbgorCQkgICAqIFBhcnRpdGlvbjE6IGNvbnRyb2wgbWVtb3J5IHJhbmdlCisJCSAgICovCisKKwluYW5kOmNzMiB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY2xvY2stcmFuZ2VzOworCQlyYW5nZXM7CisKKwkJdGksY3MtY2hpcHNlbGVjdCA9IDwyPjsKKwkJLyogYWxsIHRpbWluZ3MgaW4gbmFub3NlY29uZHMgKi8KKwkJdGksY3MtbWluLXR1cm5hcm91bmQtbnMgPSA8MD47CisJCXRpLGNzLXJlYWQtaG9sZC1ucyA9IDw3PjsKKwkJdGksY3MtcmVhZC1zdHJvYmUtbnMgPSA8NDI+OworCQl0aSxjcy1yZWFkLXNldHVwLW5zID0gPDE0PjsKKwkJdGksY3Mtd3JpdGUtaG9sZC1ucyA9IDw3PjsKKwkJdGksY3Mtd3JpdGUtc3Ryb2JlLW5zID0gPDQyPjsKKwkJdGksY3Mtd3JpdGUtc2V0dXAtbnMgPSA8MTQ+OworCisJCW5hbmRAMCwweDgwMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJ0aSxkYXZpbmNpLW5hbmQiOworCQkJcmVnID0gPDAgMHg4MDAwMDAwIDB4NDAwMDAwMAorCQkJICAgICAgIDEgMHgwMDAwMDAwIDB4MDAwMDEwMD47CisJCQkvKgorCQkJICogUGFydGl0aW9uMCwgb2Zmc2V0IDB4ODAwMDAwMCwgc2l6ZSAweDQwMDAwMDAKKwkJCSAqIFBhcnRpdGlvbjEsIG9mZnNldCAweDAwMDAwMDAsIHNpemUgMHgwMDAwMTAwCisJCQkgKi8KKworCQkJLi4gc2VlIGRhdmluY2ktbmFuZC50eHQKKwkJfTsKKwl9OworCisJbm9yOmNzMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY2xvY2stcmFuZ2VzOworCQlyYW5nZXM7CisKKwkJdGksY3MtY2hpcHNlbGVjdCA9IDwwPjsKKwkJLyogYWxsIHRpbWluZ3MgaW4gbmFub3NlY29uZHMgKi8KKwkJdGksY3MtbWluLXR1cm5hcm91bmQtbnMgPSA8MD47CisJCXRpLGNzLXJlYWQtaG9sZC1ucyA9IDw4PjsKKwkJdGksY3MtcmVhZC1zdHJvYmUtbnMgPSA8NDA+OworCQl0aSxjcy1yZWFkLXNldHVwLW5zID0gPDE0PjsKKwkJdGksY3Mtd3JpdGUtaG9sZC1ucyA9IDw3PjsKKwkJdGksY3Mtd3JpdGUtc3Ryb2JlLW5zID0gPDQwPjsKKwkJdGksY3Mtd3JpdGUtc2V0dXAtbnMgPSA8MTQ+OworCQl0aSxjcy1idXMtd2lkdGggPSA8MTY+OworCisJCWZsYXNoQDAsMHgwMDAwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiY2ZpLWZsYXNoIjsKKwkJCXJlZyA9IDwwIDB4MDAwMDAwMCAweDQwMDAwMDA+OworCisJCQkuLi4KKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvczJtcGEwMS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3MybXBhMDEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxM2QzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3MybXBhMDEudHh0CkBAIC0wLDAgKzEsOTAgQEAKKworKiBTYW1zdW5nIFMyTVBBMDEgVm9sdGFnZSBhbmQgQ3VycmVudCBSZWd1bGF0b3IKKworVGhlIFNhbXN1bmcgUzJNUEEwMSBpcyBhIG11bHRpLWZ1bmN0aW9uIGRldmljZSB3aGljaCBpbmNsdWRlcyBoaWdoCitlZmZpY2llbmN5IGJ1Y2sgY29udmVydGVycyBpbmNsdWRpbmcgRHVhbC1QaGFzZSBidWNrIGNvbnZlcnRlciwgdmFyaW91cyBMRE9zLAorYW5kIGFuIFJUQy4gSXQgaXMgaW50ZXJmYWNlZCB0byB0aGUgaG9zdCBjb250cm9sbGVyIHVzaW5nIGFuIEkyQyBpbnRlcmZhY2UuCitFYWNoIHN1Yi1ibG9jayBpcyBhZGRyZXNzZWQgYnkgdGhlIGhvc3Qgc3lzdGVtIHVzaW5nIGRpZmZlcmVudCBJMkMgc2xhdmUKK2FkZHJlc3Nlcy4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJzYW1zdW5nLHMybXBhMDEtcG1pYyIuCistIHJlZzogU3BlY2lmaWVzIHRoZSBJMkMgc2xhdmUgYWRkcmVzcyBvZiB0aGUgUE1JQyBibG9jay4gSXQgc2hvdWxkIGJlIDB4NjYuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGludGVycnVwdC1wYXJlbnQ6IFNwZWNpZmllcyB0aGUgcGhhbmRsZSBvZiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgdG8gd2hpY2gKKyAgdGhlIGludGVycnVwdHMgZnJvbSBzMm1wYTAxIGFyZSBkZWxpdmVyZWQgdG8uCistIGludGVycnVwdHM6IEFuIGludGVycnVwdCBzcGVjaWZpZXIgZm9yIHRoZSBzb2xlIGludGVycnVwdCBnZW5lcmF0ZWQgYnkgdGhlCisgIGRldmljZS4KKworT3B0aW9uYWwgbm9kZXM6CistIHJlZ3VsYXRvcnM6IFRoZSByZWd1bGF0b3JzIG9mIHMybXBhMDEgdGhhdCBoYXZlIHRvIGJlIGluc3RhbnRpYXRlZCBzaG91bGQgYmUKKyAgaW5jbHVkZWQgaW4gYSBzdWItbm9kZSBuYW1lZCAncmVndWxhdG9ycycuIFJlZ3VsYXRvciBub2RlcyBhbmQgY29uc3RyYWludHMKKyAgaW5jbHVkZWQgaW4gdGhpcyBzdWItbm9kZSB1c2UgdGhlIHN0YW5kYXJkIHJlZ3VsYXRvciBiaW5kaW5ncyB3aGljaCBhcmUKKyAgZG9jdW1lbnRlZCBlbHNld2hlcmUuCisKK1Byb3BlcnRpZXMgZm9yIEJVQ0sgcmVndWxhdG9yIG5vZGVzOgorLSByZWd1bGF0b3ItcmFtcC1kZWxheTogcmFtcCBkZWxheSBpbiB1Vi91cy4gTWF5IGJlIDYyNTAsIDEyNTAwCisgIChkZWZhdWx0KSwgMjUwMDAsIG9yIDUwMDAwLiBNYXkgYmUgMCBmb3IgZGlzYWJsaW5nIHRoZSByYW1wIGRlbGF5IG9uCisgIEJVQ0t7MSwyLDMsNH0uCisKKyBJbiB0aGUgYWJzZW5jZSBvZiB0aGUgcmVndWxhdG9yLXJhbXAtZGVsYXkgcHJvcGVydHksIHRoZSBkZWZhdWx0IHJhbXAKKyBkZWxheSB3aWxsIGJlIHVzZWQuCisKKyAgTk9URTogU29tZSBCVUNLcyBzaGFyZSB0aGUgcmFtcCByYXRlIHNldHRpbmcgaS5lLiBzYW1lIHJhbXAgdmFsdWUgd2lsbCBiZSBzZXQKKyAgZm9yIGEgcGFydGljdWxhciBncm91cCBvZiBCVUNLcy4gU28gcHJvdmlkZSBzYW1lIHJlZ3VsYXRvci1yYW1wLWRlbGF5PTx2YWx1ZT4uCisKKyAgVGhlIGZvbGxvd2luZyBCVUNLcyBzaGFyZSByYW1wIHNldHRpbmdzOgorICAqIDEgYW5kIDYKKyAgKiAyIGFuZCA0CisgICogOCwgOSwgYW5kIDEwCisKK1RoZSBmb2xsb3dpbmcgYXJlIHRoZSBuYW1lcyBvZiB0aGUgcmVndWxhdG9ycyB0aGF0IHRoZSBzMm1wYTAxIFBNSUMgYmxvY2sKK3N1cHBvcnRzLiBOb3RlOiBUaGUgJ24nIGluIExET24gYW5kIEJVQ0tuIHJlcHJlc2VudHMgdGhlIExETyBvciBCVUNLIG51bWJlcgorYXMgcGVyIHRoZSBkYXRhc2hlZXQgb2YgczJtcGEwMS4KKworCS0gTERPbgorCQkgIC0gdmFsaWQgdmFsdWVzIGZvciBuIGFyZSAxIHRvIDI2CisJCSAgLSBFeGFtcGxlOiBMRE8xLCBMRDAyLCBMRE8yNgorCS0gQlVDS24KKwkJICAtIHZhbGlkIHZhbHVlcyBmb3IgbiBhcmUgMSB0byAxMC4KKwkJICAtIEV4YW1wbGU6IEJVQ0sxLCBCVUNLMiwgQlVDSzkKKworRXhhbXBsZToKKworCXMybXBhMDFfcG1pY0A2NiB7CisJCWNvbXBhdGlibGUgPSAic2Ftc3VuZyxzMm1wYTAxLXBtaWMiOworCQlyZWcgPSA8MHg2Nj47CisKKwkJcmVndWxhdG9ycyB7CisJCQlsZG8xX3JlZzogTERPMSB7CisJCQkJcmVndWxhdG9yLW5hbWUgPSAiVkREX0FMSVZFIjsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwxMDAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwxMDAwMDAwPjsKKwkJCX07CisKKwkJCWxkbzJfcmVnOiBMRE8yIHsKKwkJCQlyZWd1bGF0b3ItbmFtZSA9ICJWRERRX01NQzIiOworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDI4MDAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDI4MDAwMDA+OworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQl9OworCisJCQlidWNrMV9yZWc6IEJVQ0sxIHsKKwkJCQlyZWd1bGF0b3ItbmFtZSA9ICJ2ZGRfbWlmIjsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw5NTAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDEzNTAwMDA+OworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQkJcmVndWxhdG9yLWJvb3Qtb247CisJCQl9OworCisJCQlidWNrMl9yZWc6IEJVQ0syIHsKKwkJCQlyZWd1bGF0b3ItbmFtZSA9ICJ2ZGRfYXJtIjsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw5NTAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDEzNTAwMDA+OworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQkJcmVndWxhdG9yLWJvb3Qtb247CisJCQkJcmVndWxhdG9yLXJhbXAtZGVsYXkgPSA8NTAwMDA+OworCQkJfTsKKwkJfTsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9zMm1wczExLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvczJtcHMxMS50eHQKaW5kZXggMTVlZTg5YzNjLi5mNjliZWMyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3MybXBzMTEudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvczJtcHMxMS50eHQKQEAgLTEsNSArMSw1IEBACiAKLSogU2Ftc3VuZyBTMk1QUzExIFZvbHRhZ2UgYW5kIEN1cnJlbnQgUmVndWxhdG9yCisqIFNhbXN1bmcgUzJNUFMxMSBhbmQgUzJNUFMxNCBWb2x0YWdlIGFuZCBDdXJyZW50IFJlZ3VsYXRvcgogCiBUaGUgU2Ftc3VuZyBTMk1QUzExIGlzIGEgbXVsdGktZnVuY3Rpb24gZGV2aWNlIHdoaWNoIGluY2x1ZGVzIHZvbHRhZ2UgYW5kCiBjdXJyZW50IHJlZ3VsYXRvcnMsIFJUQywgY2hhcmdlciBjb250cm9sbGVyIGFuZCBvdGhlciBzdWItYmxvY2tzLiBJdCBpcwpAQCAtNyw3ICs3LDcgQEAKIGFkZHJlc3NlZCBieSB0aGUgaG9zdCBzeXN0ZW0gdXNpbmcgZGlmZmVyZW50IEkyQyBzbGF2ZSBhZGRyZXNzZXMuCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGU6IFNob3VsZCBiZSAic2Ftc3VuZyxzMm1wczExLXBtaWMiLgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgInNhbXN1bmcsczJtcHMxMS1wbWljIiBvciAic2Ftc3VuZyxzMm1wczE0LXBtaWMiLgogLSByZWc6IFNwZWNpZmllcyB0aGUgSTJDIHNsYXZlIGFkZHJlc3Mgb2YgdGhlIHBtaWMgYmxvY2suIEl0IHNob3VsZCBiZSAweDY2LgogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgpAQCAtNTksMTAgKzU5LDE0IEBACiBhcyBwZXIgdGhlIGRhdGFzaGVldCBvZiBzMm1wczExLgogCiAJLSBMRE9uCi0JCSAgLSB2YWxpZCB2YWx1ZXMgZm9yIG4gYXJlIDEgdG8gMzgKKwkJICAtIHZhbGlkIHZhbHVlcyBmb3IgbiBhcmU6CisJCQktIFMyTVBTMTE6IDEgdG8gMzgKKwkJCS0gUzJNUFMxNDogMSB0byAyNQogCQkgIC0gRXhhbXBsZTogTERPMSwgTEQwMiwgTERPMjgKIAktIEJVQ0tuCi0JCSAgLSB2YWxpZCB2YWx1ZXMgZm9yIG4gYXJlIDEgdG8gMTAuCisJCSAgLSB2YWxpZCB2YWx1ZXMgZm9yIG4gYXJlOgorCQkJLSBTMk1QUzExOiAxIHRvIDEwCisJCQktIFMyTVBTMTQ6IDEgdG8gNQogCQkgIC0gRXhhbXBsZTogQlVDSzEsIEJVQ0syLCBCVUNLOQogCiBFeGFtcGxlOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC90cHM2NTkxMC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3RwczY1OTEwLnR4dAppbmRleCBiNGJkOThhLi4zODgzM2U2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3RwczY1OTEwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3RwczY1OTEwLnR4dApAQCAtMTEsNyArMTEsNyBAQAogLSAjaW50ZXJydXB0LWNlbGxzOiB0aGUgbnVtYmVyIG9mIGNlbGxzIHRvIGRlc2NyaWJlIGFuIElSUSwgdGhpcyBzaG91bGQgYmUgMi4KICAgVGhlIGZpcnN0IGNlbGwgaXMgdGhlIElSUSBudW1iZXIuCiAgIFRoZSBzZWNvbmQgY2VsbCBpcyB0aGUgZmxhZ3MsIGVuY29kZWQgYXMgdGhlIHRyaWdnZXIgbWFza3MgZnJvbQotICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0cy50eHQKKyAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2ludGVycnVwdHMudHh0CiAtIHJlZ3VsYXRvcnM6IFRoaXMgaXMgdGhlIGxpc3Qgb2YgY2hpbGQgbm9kZXMgdGhhdCBzcGVjaWZ5IHRoZSByZWd1bGF0b3IKICAgaW5pdGlhbGl6YXRpb24gZGF0YSBmb3IgZGVmaW5lZCByZWd1bGF0b3JzLiBOb3QgYWxsIHJlZ3VsYXRvcnMgZm9yIHRoZSBnaXZlbgogICBkZXZpY2UgbmVlZCB0byBiZSBwcmVzZW50LiBUaGUgZGVmaW5pdGlvbiBmb3IgZWFjaCBvZiB0aGVzZSBub2RlcyBpcyBkZWZpbmVkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWlzYy9hbGx3aW5uZXIsc3VueGktc2lkLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9taXNjL2FsbHdpbm5lcixzdW54aS1zaWQudHh0CmluZGV4IDY4YmEzNzIuLmZhYmRmNjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9taXNjL2FsbHdpbm5lcixzdW54aS1zaWQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9taXNjL2FsbHdpbm5lcixzdW54aS1zaWQudHh0CkBAIC0xLDEyICsxLDEyIEBACiBBbGx3aW5uZXIgc3VueGktc2lkCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGU6ICJhbGx3aW5uZXIsc3VuNGktc2lkIiBvciAiYWxsd2lubmVyLHN1bjdpLWEyMC1zaWQiLgorLSBjb21wYXRpYmxlOiAiYWxsd2lubmVyLHN1bjRpLWExMC1zaWQiIG9yICJhbGx3aW5uZXIsc3VuN2ktYTIwLXNpZCIKIC0gcmVnOiBTaG91bGQgY29udGFpbiByZWdpc3RlcnMgbG9jYXRpb24gYW5kIGxlbmd0aAogCiBFeGFtcGxlIGZvciBzdW40aToKIAlzaWRAMDFjMjM4MDAgewotCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1zaWQiOworCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtc2lkIjsKIAkJcmVnID0gPDB4MDFjMjM4MDAgMHgxMD4KIAl9OwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWlzYy9hdG1lbC1zc2MudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21pc2MvYXRtZWwtc3NjLnR4dAppbmRleCA2MDk2MGIyLi5lZmM5OGVhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWlzYy9hdG1lbC1zc2MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9taXNjL2F0bWVsLXNzYy50eHQKQEAgLTE3LDYgKzE3LDE0IEBACiAgIFNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL2F0bWVsLWRtYS50eHQgZm9yIGRldGFpbHMuCiAtIGRtYS1uYW1lczogTXVzdCBiZSAidHgiLCAicngiLgogCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorICAtIGF0bWVsLGNsay1mcm9tLXJrLXBpbjogYm9vbCBwcm9wZXJ0eS4KKyAgICAgLSBXaGVuIFNTQyB3b3JrcyBpbiBzbGF2ZSBtb2RlLCBhY2NvcmRpbmcgdG8gdGhlIGhhcmR3YXJlIGRlc2lnbiwgdGhlCisgICAgICAgY2xvY2sgY2FuIGdldCBmcm9tIFRLIHBpbiwgYW5kIGFsc28gY2FuIGdldCBmcm9tIFJLIHBpbi4gU28sIGFkZAorICAgICAgIHRoaXMgcGFyYW1ldGVyIHRvIGNob29zZSB3aGVyZSB0aGUgY2xvY2sgZnJvbS4KKyAgICAgLSBCeSBkZWZhdWx0IHRoZSBjbG9jayBpcyBmcm9tIFRLIHBpbiwgaWYgdGhlIGNsb2NrIGZyb20gUksgcGluLCB0aGlzCisgICAgICAgcHJvcGVydHkgaXMgbmVlZGVkLgorCiBFeGFtcGxlczoKIC0gUERDIHRyYW5zZmVyOgogc3NjMDogc3NjQGZmZmJjMDAwIHsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9taXNjL3NyYW0udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21pc2Mvc3JhbS50eHQKaW5kZXggNGQwYTAwZS4uMzZjYmU1YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21pc2Mvc3JhbS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21pc2Mvc3JhbS50eHQKQEAgLTgsOSArOCw0NCBAQAogCiAtIHJlZyA6IFNSQU0gaW9tZW0gYWRkcmVzcyByYW5nZQogCitSZXNlcnZpbmcgc3JhbSBhcmVhczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFYWNoIGNoaWxkIG9mIHRoZSBzcmFtIG5vZGUgc3BlY2lmaWVzIGEgcmVnaW9uIG9mIHJlc2VydmVkIG1lbW9yeS4gRWFjaAorY2hpbGQgbm9kZSBzaG91bGQgdXNlIGEgJ3JlZycgcHJvcGVydHkgdG8gc3BlY2lmeSBhIHNwZWNpZmljIHJhbmdlIG9mCityZXNlcnZlZCBtZW1vcnkuCisKK0ZvbGxvd2luZyB0aGUgZ2VuZXJpYy1uYW1lcyByZWNvbW1lbmRlZCBwcmFjdGljZSwgbm9kZSBuYW1lcyBzaG91bGQKK3JlZmxlY3QgdGhlIHB1cnBvc2Ugb2YgdGhlIG5vZGUuIFVuaXQgYWRkcmVzcyAoQDxhZGRyZXNzPikgc2hvdWxkIGJlCithcHBlbmRlZCB0byB0aGUgbmFtZS4KKworUmVxdWlyZWQgcHJvcGVydGllcyBpbiB0aGUgc3JhbSBub2RlOgorCistICNhZGRyZXNzLWNlbGxzLCAjc2l6ZS1jZWxscyA6IHNob3VsZCB1c2UgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZSByb290IG5vZGUKKy0gcmFuZ2VzIDogc3RhbmRhcmQgZGVmaW5pdGlvbiwgc2hvdWxkIHRyYW5zbGF0ZSBmcm9tIGxvY2FsIGFkZHJlc3NlcworICAgICAgICAgICB3aXRoaW4gdGhlIHNyYW0gdG8gYnVzIGFkZHJlc3NlcworCitSZXF1aXJlZCBwcm9wZXJ0aWVzIGluIHRoZSBhcmVhIG5vZGVzOgorCistIHJlZyA6IGlvbWVtIGFkZHJlc3MgcmFuZ2UsIHJlbGF0aXZlIHRvIHRoZSBTUkFNIHJhbmdlCisKK09wdGlvbmFsIHByb3BlcnRpZXMgaW4gdGhlIGFyZWEgbm9kZXM6CisKKy0gY29tcGF0aWJsZSA6IHN0YW5kYXJkIGRlZmluaXRpb24sIHNob3VsZCBjb250YWluIGEgdmVuZG9yIHNwZWNpZmljIHN0cmluZworICAgICAgICAgICAgICAgaW4gdGhlIGZvcm0gPHZlbmRvcj4sWzxkZXZpY2U+LV08dXNhZ2U+CisKIEV4YW1wbGU6CiAKIHNyYW06IHNyYW1ANWMwMDAwMDAgewogCWNvbXBhdGlibGUgPSAibW1pby1zcmFtIjsKIAlyZWcgPSA8MHg1YzAwMDAwMCAweDQwMDAwPjsgLyogMjU2IEtpQiBTUkFNIGF0IGFkZHJlc3MgMHg1YzAwMDAwMCAqLworCisJI2FkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlyYW5nZXMgPSA8MCAweDVjMDAwMDAwIDB4NDAwMDA+OworCisJc21wLXNyYW1AMTAwIHsKKwkJY29tcGF0aWJsZSA9ICJzb2N2ZW5kb3Isc21wLXNyYW0iOworCQlyZWcgPSA8MHgxMDAgMHg1MD47CisJfTsKIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L2FwbS14Z2VuZS1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9hcG0teGdlbmUtcGh5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjNhNjVhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9hcG0teGdlbmUtcGh5LnR4dApAQCAtMCwwICsxLDc5IEBACisqIEFQTSBYLUdlbmUgMTVHYnBzIE11bHRpLXB1cnBvc2UgUEhZIG5vZGVzCisKK1BIWSBub2RlcyBhcmUgZGVmaW5lZCB0byBkZXNjcmliZSBvbi1jaGlwIDE1R2JwcyBNdWx0aS1wdXJwb3NlIFBIWS4gRWFjaAorUEhZIChwYWlyIG9mIGxhbmVzKSBoYXMgaXRzIG93biBub2RlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlCQk6IFNoYWxsIGJlICJhcG0seGdlbmUtcGh5Ii4KKy0gcmVnCQkJOiBQSFkgbWVtb3J5IHJlc291cmNlIGlzIHRoZSBTRFMgUEhZIGFjY2VzcyByZXNvdXJjZS4KKy0gI3BoeS1jZWxscwkJOiBTaGFsbCBiZSAxIGFzIGl0IGV4cGVjdHMgb25lIGFyZ3VtZW50IGZvciBzZXR0aW5nCisJCQkgIHRoZSBtb2RlIG9mIHRoZSBQSFkuIFBvc3NpYmxlIHZhbHVlcyBhcmUgMCAoU0FUQSksCisJCQkgIDEgKFNHTUlJKSwgMiAoUENJZSksIDMgKFVTQiksIGFuZCA0IChYRkkpLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBzdGF0dXMJCTogU2hhbGwgYmUgIm9rIiBpZiBlbmFibGVkIG9yICJkaXNhYmxlZCIgaWYgZGlzYWJsZWQuCisJCQkgIERlZmF1bHQgaXMgIm9rIi4KKy0gY2xvY2tzCQk6IFJlZmVyZW5jZSB0byB0aGUgY2xvY2sgZW50cnkuCistIGFwbSx0eC1leWUtdHVuaW5nCTogTWFudWFsIGNvbnRyb2wgdG8gZmluZSB0dW5lIHRoZSBjYXB0dXJlIG9mIHRoZSBzZXJpYWwKKwkJCSAgYml0IGxpbmVzIGZyb20gdGhlIGF1dG9tYXRpYyBjYWxpYnJhdGVkIHBvc2l0aW9uLgorCQkJICBUd28gc2V0IG9mIDMtdHVwbGUgc2V0dGluZyBmb3IgZWFjaCAodXAgdG8gMykKKwkJCSAgc3VwcG9ydGVkIGxpbmsgc3BlZWQgb24gdGhlIGhvc3QuIFJhbmdlIGZyb20gMCB0bworCQkJICAxMjcgaW4gdW5pdCBvZiBvbmUgYml0IHBlcmlvZC4gRGVmYXVsdCBpcyAxMC4KKy0gYXBtLHR4LWV5ZS1kaXJlY3Rpb24JOiBFeWUgdHVuaW5nIG1hbnVhbCBjb250cm9sIGRpcmVjdGlvbi4gMCBtZWFucyBzYW1wbGUKKwkJCSAgZGF0YSBlYXJsaWVyIHRoYW4gdGhlIG5vbWluYWwgc2FtcGxpbmcgcG9pbnQuIDEgbWVhbnMKKwkJCSAgc2FtcGxlIGRhdGEgbGF0ZXIgdGhhbiB0aGUgbm9taW5hbCBzYW1wbGluZyBwb2ludC4KKwkJCSAgVHdvIHNldCBvZiAzLXR1cGxlIHNldHRpbmcgZm9yIGVhY2ggKHVwIHRvIDMpCisJCQkgIHN1cHBvcnRlZCBsaW5rIHNwZWVkIG9uIHRoZSBob3N0LiBEZWZhdWx0IGlzIDAuCistIGFwbSx0eC1ib29zdC1nYWluCTogRnJlcXVlbmN5IGJvb3N0IEFDIChMU0IgMy1iaXQpIGFuZCBEQyAoMi1iaXQpCisJCQkgIGdhaW4gY29udHJvbC4gVHdvIHNldCBvZiAzLXR1cGxlIHNldHRpbmcgZm9yIGVhY2gKKwkJCSAgKHVwIHRvIDMpIHN1cHBvcnRlZCBsaW5rIHNwZWVkIG9uIHRoZSBob3N0LiBSYW5nZSBpcworCQkJICBiZXR3ZWVuIDAgdG8gMzEgaW4gdW5pdCBvZiBkQi4gRGVmYXVsdCBpcyAzLgorLSBhcG0sdHgtYW1wbGl0dWRlCTogQW1wbGl0dWRlIGNvbnRyb2wuIFR3byBzZXQgb2YgMy10dXBsZSBzZXR0aW5nIGZvcgorCQkJICBlYWNoICh1cCB0byAzKSBzdXBwb3J0ZWQgbGluayBzcGVlZCBvbiB0aGUgaG9zdC4KKwkJCSAgUmFuZ2UgaXMgYmV0d2VlbiAwIHRvIDE5OTUwMCBpbiB1bml0IG9mIHVWLgorCQkJICBEZWZhdWx0IGlzIDE5OTUwMCB1Vi4KKy0gYXBtLHR4LXByZS1jdXJzb3IxCTogMXN0IHByZS1jdXJzb3IgZW1waGFzaXMgdGFwcyBjb250cm9sLiBUd28gc2V0IG9mCisJCQkgIDMtdHVwbGUgc2V0dGluZyBmb3IgZWFjaCAodXAgdG8gMykgc3VwcG9ydGVkIGxpbmsKKwkJCSAgc3BlZWQgb24gdGhlIGhvc3QuIFJhbmdlIGlzIDAgdG8gMjczMDAwIGluIHVuaXQgb2YKKwkJCSAgdVYuIERlZmF1bHQgaXMgMC4KKy0gYXBtLHR4LXByZS1jdXJzb3IyCTogMnN0IHByZS1jdXJzb3IgZW1waGFzaXMgdGFwcyBjb250cm9sLiBUd28gc2V0IG9mCisJCQkgIDMtdHVwbGUgc2V0dGluZyBmb3IgZWFjaCAodXAgdG8gMykgc3VwcG9ydGVkIGxpbmsKKwkJCSAgc3BlZWQgb24gdGhlIGhvc3QuIFJhbmdlIGlzIDAgdG8gMTI3NDAwIGluIHVuaXQgdVYuCisJCQkgIERlZmF1bHQgaXMgMHgwLgorLSBhcG0sdHgtcG9zdC1jdXJzb3IJOiBQb3N0LWN1cnNvciBlbXBoYXNpcyB0YXBzIGNvbnRyb2wuIFR3byBzZXQgb2YKKwkJCSAgMy10dXBsZSBzZXR0aW5nIGZvciBHZW4xLCBHZW4yLCBhbmQgR2VuMy4gUmFuZ2UgaXMKKwkJCSAgYmV0d2VlbiAwIHRvIDB4MWYgaW4gdW5pdCBvZiAxOC4ybVYuIERlZmF1bHQgaXMgMHhmLgorLSBhcG0sdHgtc3BlZWQJCTogVHggb3BlcmF0aW5nIHNwZWVkLiBPbmUgc2V0IG9mIDMtdHVwbGUgZm9yIGVhY2gKKwkJCSAgc3VwcG9ydGVkIGxpbmsgc3BlZWQgb24gdGhlIGhvc3QuCisJCQkgICAwID0gMS0yR2JwcworCQkJICAgMSA9IDItNEdicHMgKDFzdCB0dXBsZSBkZWZhdWx0KQorCQkJICAgMiA9IDQtOEdicHMKKwkJCSAgIDMgPSA4LTE1R2JwcyAoMm5kIHR1cGxlIGRlZmF1bHQpCisJCQkgICA0ID0gMi41LTRHYnBzCisJCQkgICA1ID0gNC01R2JwcworCQkJICAgNiA9IDUtNkdicHMKKwkJCSAgIDcgPSA2LTE2R2JwcyAoM3JkIHR1cGxlIGRlZmF1bHQpCisKK05PVEU6IFBIWSBvdmVycmlkZSBwYXJhbWV0ZXJzIGFyZSBib2FyZCBzcGVjaWZpYyBzZXR0aW5nLgorCitFeGFtcGxlOgorCQlwaHkxOiBwaHlAMWYyMWEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtcGh5IjsKKwkJCXJlZyA9IDwweDAgMHgxZjIxYTAwMCAweDAgMHgxMDA+OworCQkJI3BoeS1jZWxscyA9IDwxPjsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcGh5MjogcGh5QDFmMjJhMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLXBoeSI7CisJCQlyZWcgPSA8MHgwIDB4MWYyMmEwMDAgMHgwIDB4MTAwPjsKKwkJCSNwaHktY2VsbHMgPSA8MT47CisJCQlzdGF0dXMgPSAib2siOworCQl9OworCisJCXBoeTM6IHBoeUAxZjIzYTAwMCB7CisJCQljb21wYXRpYmxlID0gImFwbSx4Z2VuZS1waHkiOworCQkJcmVnID0gPDB4MCAweDFmMjNhMDAwIDB4MCAweDEwMD47CisJCQkjcGh5LWNlbGxzID0gPDE+OworCQkJc3RhdHVzID0gIm9rIjsKKwkJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvc2Ftc3VuZy1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zYW1zdW5nLXBoeS50eHQKaW5kZXggYzBmY2NhYS4uMjhmOWVkYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zYW1zdW5nLXBoeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zYW1zdW5nLXBoeS50eHQKQEAgLTIwLDMgKzIwLDU3IEBACiAtIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgInNhbXN1bmcsZXh5bm9zNTI1MC1kcC12aWRlby1waHkiOwogLSByZWcgOiBvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgRGlzcGxheSBQb3J0IFBIWSByZWdpc3RlciBzZXQ7CiAtICNwaHktY2VsbHMgOiBmcm9tIHRoZSBnZW5lcmljIFBIWSBiaW5kaW5ncywgbXVzdCBiZSAwOworCitTYW1zdW5nIFM1UC9FWFlOT1MgU29DIHNlcmllcyBVU0IgUEhZCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgb25lIG9mIHRoZSBsaXN0ZWQgY29tcGF0aWJsZXM6CisJLSAic2Ftc3VuZyxleHlub3M0MjEwLXVzYjItcGh5IgorCS0gInNhbXN1bmcsZXh5bm9zNHgxMi11c2IyLXBoeSIKKwktICJzYW1zdW5nLGV4eW5vczUyNTAtdXNiMi1waHkiCistIHJlZyA6IGEgbGlzdCBvZiByZWdpc3RlcnMgdXNlZCBieSBwaHkgZHJpdmVyCisJLSBmaXJzdCBhbmQgb2JsaWdhdG9yeSBpcyB0aGUgbG9jYXRpb24gb2YgcGh5IG1vZHVsZXMgcmVnaXN0ZXJzCistIHNhbXN1bmcsc3lzcmVnLXBoYW5kbGUgLSBoYW5kbGUgdG8gc3lzY29uIHVzZWQgdG8gY29udHJvbCB0aGUgc3lzdGVtIHJlZ2lzdGVycworLSBzYW1zdW5nLHBtdXJlZy1waGFuZGxlIC0gaGFuZGxlIHRvIHN5c2NvbiB1c2VkIHRvIGNvbnRyb2wgUE1VIHJlZ2lzdGVycworLSAjcGh5LWNlbGxzIDogZnJvbSB0aGUgZ2VuZXJpYyBwaHkgYmluZGluZ3MsIG11c3QgYmUgMTsKKy0gY2xvY2tzIGFuZCBjbG9jay1uYW1lczoKKwktIHRoZSAicGh5IiBjbG9jayBpcyByZXF1aXJlZCBieSB0aGUgcGh5IG1vZHVsZSwgdXNlZCBhcyBhIGdhdGUKKwktIHRoZSAicmVmIiBjbG9jayBpcyB1c2VkIHRvIGdldCB0aGUgcmF0ZSBvZiB0aGUgY2xvY2sgcHJvdmlkZWQgdG8gdGhlCisJICBQSFkgbW9kdWxlCisKK1RoZSBmaXJzdCBwaGFuZGxlIGFyZ3VtZW50IGluIHRoZSBQSFkgc3BlY2lmaWVyIGlkZW50aWZpZXMgdGhlIFBIWSwgaXRzCittZWFuaW5nIGlzIGNvbXBhdGlibGUgZGVwZW5kZW50LiBGb3IgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgU29DcyAoRXh5bm9zIDQyMTAKK2FuZCBFeHlub3MgNDIxMikgaXQgaXMgYXMgZm9sbG93czoKKyAgMCAtIFVTQiBkZXZpY2UgKCJkZXZpY2UiKSwKKyAgMSAtIFVTQiBob3N0ICgiaG9zdCIpLAorICAyIC0gSFNJQzAgKCJoc2ljMCIpLAorICAzIC0gSFNJQzEgKCJoc2ljMSIpLAorCitFeHlub3MgNDIxMCBhbmQgRXh5bm9zIDQyMTIgdXNlIG1vZGUgc3dpdGNoaW5nIGFuZCByZXF1aXJlIHRoYXQgbW9kZSBzd2l0Y2gKK3JlZ2lzdGVyIGlzIHN1cHBsaWVkLgorCitFeGFtcGxlOgorCitGb3IgRXh5bm9zIDQ0MTIgKGNvbXBhdGlibGUgd2l0aCBFeHlub3MgNDIxMik6CisKK3VzYnBoeTogcGh5QDEyNWIwMDAwIHsKKwljb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNHgxMi11c2IyLXBoeSI7CisJcmVnID0gPDB4MTI1YjAwMDAgMHgxMDA+OworCWNsb2NrcyA9IDwmY2xvY2sgMzA1PiwgPCZjbG9jayAyPjsKKwljbG9jay1uYW1lcyA9ICJwaHkiLCAicmVmIjsKKwlzdGF0dXMgPSAib2theSI7CisJI3BoeS1jZWxscyA9IDwxPjsKKwlzYW1zdW5nLHN5c3JlZy1waGFuZGxlID0gPCZzeXNfcmVnPjsKKwlzYW1zdW5nLHBtdXJlZy1waGFuZGxlID0gPCZwbXVfcmVnPjsKK307CisKK1RoZW4gdGhlIFBIWSBjYW4gYmUgdXNlZCBpbiBvdGhlciBub2RlcyBzdWNoIGFzOgorCitwaHktY29uc3VtZXJAMTIzNDAwMDAgeworCXBoeXMgPSA8JnVzYnBoeSAyPjsKKwlwaHktbmFtZXMgPSAicGh5IjsKK307CisKK1JlZmVyIHRvIERUIGJpbmRpbmdzIGRvY3VtZW50YXRpb24gb2YgcGFydGljdWxhciBQSFkgY29uc3VtZXIgZGV2aWNlcyBmb3IgbW9yZQoraW5mb3JtYXRpb24gYWJvdXQgcmVxdWlyZWQgUEhZcyBhbmQgdGhlIHdheSBvZiBzcGVjaWZpY2F0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zdW40aS11c2ItcGh5LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvc3VuNGktdXNiLXBoeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgyMzYxYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvc3VuNGktdXNiLXBoeS50eHQKQEAgLTAsMCArMSwyNiBAQAorQWxsd2lubmVyIHN1bjRpIFVTQiBQSFkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgb25lIG9mICJhbGx3aW5uZXIsc3VuNGktYTEwLXVzYi1waHkiLAorICAiYWxsd2lubmVyLHN1bjVpLWExMy11c2ItcGh5IiBvciAiYWxsd2lubmVyLHN1bjdpLWEyMC11c2ItcGh5IgorLSByZWcgOiBhIGxpc3Qgb2Ygb2Zmc2V0ICsgbGVuZ3RoIHBhaXJzCistIHJlZy1uYW1lcyA6ICJwaHlfY3RybCIsICJwbXUxIiBhbmQgZm9yIHN1bjRpIG9yIHN1bjdpICJwbXUyIgorLSAjcGh5LWNlbGxzIDogZnJvbSB0aGUgZ2VuZXJpYyBwaHkgYmluZGluZ3MsIG11c3QgYmUgMQorLSBjbG9ja3MgOiBwaGFuZGxlICsgY2xvY2sgc3BlY2lmaWVyIGZvciB0aGUgcGh5IGNsb2NrCistIGNsb2NrLW5hbWVzIDogInVzYl9waHkiCistIHJlc2V0cyA6IGEgbGlzdCBvZiBwaGFuZGxlICsgcmVzZXQgc3BlY2lmaWVyIHBhaXJzCistIHJlc2V0LW5hbWVzIDogInVzYjBfcmVzZXQiLCAidXNiMV9yZXNldCIgYW5kIGZvciBzdW40aSBvciBzdW43aSAidXNiMl9yZXNldCIKKworRXhhbXBsZToKKwl1c2JwaHk6IHBoeUAweDAxYzEzNDAwIHsKKwkJI3BoeS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXVzYi1waHkiOworCQkvKiBwaHkgYmFzZSByZWdzLCBwaHkxIHBtdSByZWcsIHBoeTIgcG11IHJlZyAqLworCQlyZWcgPSA8MHgwMWMxMzQwMCAweDEwIDB4MDFjMTQ4MDAgMHg0IDB4MDFjMWM4MDAgMHg0PjsKKwkJcmVnLW5hbWVzID0gInBoeV9jdHJsIiwgInBtdTEiLCAicG11MiI7CisJCWNsb2NrcyA9IDwmdXNiX2NsayA4PjsKKwkJY2xvY2stbmFtZXMgPSAidXNiX3BoeSI7CisJCXJlc2V0cyA9IDwmdXNiX2NsayAxPiwgPCZ1c2JfY2xrIDI+OworCQlyZXNldC1uYW1lcyA9ICJ1c2IxX3Jlc2V0IiwgInVzYjJfcmVzZXQiOworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3RpLXBoeS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3RpLXBoeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4ZmIwZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvdGktcGh5LnR4dApAQCAtMCwwICsxLDg2IEBACitUSSBQSFk6IERUIERPQ1VNRU5UQVRJT04gRk9SIFBIWXMgaW4gVEkgUExBVEZPUk1zCisKK09NQVAgQ09OVFJPTCBQSFkKKworUmVxdWlyZWQgcHJvcGVydGllczoKKyAtIGNvbXBhdGlibGU6IFNob3VsZCBiZSBvbmUgb2YKKyAidGksY29udHJvbC1waHktb3RnaHMiIC0gaWYgaXQgaGFzIG90Z2hzX2NvbnRyb2wgbWFpbGJveCByZWdpc3RlciBhcyBvbiBPTUFQNC4KKyAidGksY29udHJvbC1waHktdXNiMiIgLSBpZiBpdCBoYXMgUG93ZXIgZG93biBiaXQgaW4gY29udHJvbF9kZXZfY29uZiByZWdpc3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgZS5nLiBVU0IyX1BIWSBvbiBPTUFQNS4KKyAidGksY29udHJvbC1waHktcGlwZTMiIC0gaWYgaXQgaGFzIERQTEwgYW5kIGluZGl2aWR1YWwgUnggJiBUeCBwb3dlciBjb250cm9sCisgICAgICAgICAgICAgICAgICAgICAgICBlLmcuIFVTQjMgUEhZIGFuZCBTQVRBIFBIWSBvbiBPTUFQNS4KKyAidGksY29udHJvbC1waHktdXNiMi1kcmE3IiAtIGlmIGl0IGhhcyBwb3dlciBkb3duIHJlZ2lzdGVyIGxpa2UgVVNCMiBQSFkgb24KKyAgICAgICAgICAgICAgICAgICAgICAgIERSQTcgcGxhdGZvcm0uCisgInRpLGNvbnRyb2wtcGh5LXVzYjItYW00MzciIC0gaWYgaXQgaGFzIHBvd2VyIGRvd24gcmVnaXN0ZXIgbGlrZSBVU0IyIFBIWSBvbgorICAgICAgICAgICAgICAgICAgICAgICAgQU00MzcgcGxhdGZvcm0uCisgLSByZWcgOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZS4gSXQgY29udGFpbnMKKyAgIHRoZSBhZGRyZXNzIG9mICJvdGdoc19jb250cm9sIiBmb3IgY29udHJvbC1waHktb3RnaHMgb3IgInBvd2VyIiByZWdpc3RlcgorICAgZm9yIG90aGVyIHR5cGVzLgorIC0gcmVnLW5hbWVzOiBzaG91bGQgYmUgIm90Z2hzX2NvbnRyb2wiIGNvbnRyb2wtcGh5LW90Z2hzIGFuZCAicG93ZXIiIGZvcgorICAgb3RoZXIgdHlwZXMuCisKK29tYXBfY29udHJvbF91c2I6IG9tYXAtY29udHJvbC11c2JANGEwMDIzMDAgeworICAgICAgICBjb21wYXRpYmxlID0gInRpLGNvbnRyb2wtcGh5LW90Z2hzIjsKKyAgICAgICAgcmVnID0gPDB4NGEwMDIzM2MgMHg0PjsKKyAgICAgICAgcmVnLW5hbWVzID0gIm90Z2hzX2NvbnRyb2wiOworfTsKKworT01BUCBVU0IyIFBIWQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJ0aSxvbWFwLXVzYjIiCisgLSByZWcgOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZS4KKyAtICNwaHktY2VsbHM6IGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGNlbGxzIHRoYXQgc2hvdWxkIGJlIGdpdmVuIGluIHRoZQorICAgcGhhbmRsZSB3aGlsZSByZWZlcmVuY2luZyB0aGlzIHBoeS4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKyAtIGN0cmwtbW9kdWxlIDogcGhhbmRsZSBvZiB0aGUgY29udHJvbCBtb2R1bGUgdXNlZCBieSBQSFkgZHJpdmVyIHRvIHBvd2VyIG9uCisgICB0aGUgUEhZLgorCitUaGlzIGlzIHVzdWFsbHkgYSBzdWJub2RlIG9mIG9jcDJzY3AgdG8gd2hpY2ggaXQgaXMgY29ubmVjdGVkLgorCit1c2IycGh5QDRhMGFkMDgwIHsKKwljb21wYXRpYmxlID0gInRpLG9tYXAtdXNiMiI7CisJcmVnID0gPDB4NGEwYWQwODAgMHg1OD47CisJY3RybC1tb2R1bGUgPSA8Jm9tYXBfY29udHJvbF91c2I+OworCSNwaHktY2VsbHMgPSA8MD47Cit9OworCitUSSBQSVBFMyBQSFkKKworUmVxdWlyZWQgcHJvcGVydGllczoKKyAtIGNvbXBhdGlibGU6IFNob3VsZCBiZSAidGkscGh5LXVzYjMiIG9yICJ0aSxwaHktcGlwZTMtc2F0YSIuCisgICAidGksb21hcC11c2IzIiBpcyBkZXByZWNhdGVkLgorIC0gcmVnIDogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UuCisgLSByZWctbmFtZXM6IFRoZSBuYW1lcyBvZiB0aGUgcmVnaXN0ZXIgYWRkcmVzc2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZ2lzdGVycworICAgZmlsbGVkIGluICJyZWciLgorIC0gI3BoeS1jZWxsczogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgY2VsbHMgdGhhdCBzaG91bGQgYmUgZ2l2ZW4gaW4gdGhlCisgICBwaGFuZGxlIHdoaWxlIHJlZmVyZW5jaW5nIHRoaXMgcGh5LgorIC0gY2xvY2tzOiBhIGxpc3Qgb2YgcGhhbmRsZXMgYW5kIGNsb2NrLXNwZWNpZmllciBwYWlycywgb25lIGZvciBlYWNoIGVudHJ5IGluCisgICBjbG9jay1uYW1lcy4KKyAtIGNsb2NrLW5hbWVzOiBzaG91bGQgaW5jbHVkZToKKyAgICogIndrdXBjbGsiIC0gd2FrZXVwIGNsb2NrLgorICAgKiAic3lzY2xrIiAtIHN5c3RlbSBjbG9jay4KKyAgICogInJlZmNsayIgLSByZWZlcmVuY2UgY2xvY2suCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisgLSBjdHJsLW1vZHVsZSA6IHBoYW5kbGUgb2YgdGhlIGNvbnRyb2wgbW9kdWxlIHVzZWQgYnkgUEhZIGRyaXZlciB0byBwb3dlciBvbgorICAgdGhlIFBIWS4KKworVGhpcyBpcyB1c3VhbGx5IGEgc3Vibm9kZSBvZiBvY3Ayc2NwIHRvIHdoaWNoIGl0IGlzIGNvbm5lY3RlZC4KKwordXNiM3BoeUA0YTA4NDQwMCB7CisJY29tcGF0aWJsZSA9ICJ0aSxwaHktdXNiMyI7CisJcmVnID0gPDB4NGEwODQ0MDAgMHg4MD4sCisJICAgICAgPDB4NGEwODQ4MDAgMHg2ND4sCisJICAgICAgPDB4NGEwODRjMDAgMHg0MD47CisJcmVnLW5hbWVzID0gInBoeV9yeCIsICJwaHlfdHgiLCAicGxsX2N0cmwiOworCWN0cmwtbW9kdWxlID0gPCZvbWFwX2NvbnRyb2xfdXNiPjsKKwkjcGh5LWNlbGxzID0gPDA+OworCWNsb2NrcyA9IDwmdXNiX3BoeV9jbV9jbGszMms+LAorCQkgPCZzeXNfY2xraW4+LAorCQkgPCZ1c2Jfb3RnX3NzX3JlZmNsazk2MG0+OworCWNsb2NrLW5hbWVzID0JIndrdXBjbGsiLAorCQkJInN5c2NsayIsCisJCQkicmVmY2xrIjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGFybWFkYS0zNzAtcGluY3RybC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGFybWFkYS0zNzAtcGluY3RybC50eHQKaW5kZXggMDFlZjQwOC4uYWRkYTJhOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxhcm1hZGEtMzcwLXBpbmN0cmwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsYXJtYWRhLTM3MC1waW5jdHJsLnR4dApAQCAtNSw2ICs1LDcgQEAKIAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZTogIm1hcnZlbGwsODhmNjcxMC1waW5jdHJsIgorLSByZWc6IHJlZ2lzdGVyIHNwZWNpZmllciBvZiBNUFAgcmVnaXN0ZXJzCiAKIEF2YWlsYWJsZSBtcHAgcGlucy9ncm91cHMgYW5kIGZ1bmN0aW9uczoKIE5vdGU6IGJyYWNrZXRzICh4KSBhcmUgbm90IHBhcnQgb2YgdGhlIG1wcCBuYW1lIGZvciBtYXJ2ZWxsLGZ1bmN0aW9uIGFuZCBnaXZlbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxhcm1hZGEtMzc1LXBpbmN0cmwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxhcm1hZGEtMzc1LXBpbmN0cmwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZTBjZGEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGFybWFkYS0zNzUtcGluY3RybC50eHQKQEAgLTAsMCArMSw4MiBAQAorKiBNYXJ2ZWxsIEFybWFkYSAzNzUgU29DIHBpbmN0cmwgZHJpdmVyIGZvciBtcHAKKworUGxlYXNlIHJlZmVyIHRvIG1hcnZlbGwsbXZlYnUtcGluY3RybC50eHQgaW4gdGhpcyBkaXJlY3RvcnkgZm9yIGNvbW1vbiBiaW5kaW5nCitwYXJ0IGFuZCB1c2FnZS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogIm1hcnZlbGwsODhmNjcyMC1waW5jdHJsIgorLSByZWc6IHJlZ2lzdGVyIHNwZWNpZmllciBvZiBNUFAgcmVnaXN0ZXJzCisKK0F2YWlsYWJsZSBtcHAgcGlucy9ncm91cHMgYW5kIGZ1bmN0aW9uczoKK05vdGU6IGJyYWNrZXRzICh4KSBhcmUgbm90IHBhcnQgb2YgdGhlIG1wcCBuYW1lIGZvciBtYXJ2ZWxsLGZ1bmN0aW9uIGFuZCBnaXZlbgorb25seSBmb3IgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBpbiB0aGlzIGRvY3VtZW50LgorCituYW1lICAgICAgICAgIHBpbnMgICAgIGZ1bmN0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK21wcDAgICAgICAgICAgMCAgICAgICAgZ3BpbywgZGV2KGFkMiksIHNwaTAoY3MxKSwgc3BpMShjczEpCittcHAxICAgICAgICAgIDEgICAgICAgIGdwaW8sIGRldihhZDMpLCBzcGkwKG1vc2kpLCBzcGkxKG1vc2kpCittcHAyICAgICAgICAgIDIgICAgICAgIGdwaW8sIGRldihhZDQpLCBwdHAoZXZlbnRyZXEpLCBsZWQoYzApLCBhdWRpbyhzZGkpCittcHAzICAgICAgICAgIDMgICAgICAgIGdwaW8sIGRldihhZDUpLCBwdHAodHJpZ2dlbiksIGxlZChwMyksIGF1ZGlvKG1jbGspCittcHA0ICAgICAgICAgIDQgICAgICAgIGdwaW8sIGRldihhZDYpLCBzcGkwKG1pc28pLCBzcGkxKG1pc28pCittcHA1ICAgICAgICAgIDUgICAgICAgIGdwaW8sIGRldihhZDcpLCBzcGkwKGNzMiksIHNwaTEoY3MyKQorbXBwNiAgICAgICAgICA2ICAgICAgICBncGlvLCBkZXYoYWQwKSwgbGVkKHAxKSwgYXVkaW8ocmNsaykKK21wcDcgICAgICAgICAgNyAgICAgICAgZ3BpbywgZGV2KGFkMSksIHB0cChjbGspLCBsZWQocDIpLCBhdWRpbyhleHRjbGspCittcHA4ICAgICAgICAgIDggICAgICAgIGdwaW8sIGRldiAoYm9vdGNzKSwgc3BpMChjczApLCBzcGkxKGNzMCkKK21wcDkgICAgICAgICAgOSAgICAgICAgZ3BpbywgbmYod2VuKSwgc3BpMChzY2spLCBzcGkxKHNjaykKK21wcDEwICAgICAgICAxMCAgICAgICAgZ3BpbywgbmYocmVuKSwgZHJhbSh2dHRjdHJsKSwgbGVkKGMxKQorbXBwMTEgICAgICAgIDExICAgICAgICBncGlvLCBkZXYoYTApLCBsZWQoYzIpLCBhdWRpbyhzZG8pCittcHAxMiAgICAgICAgMTIgICAgICAgIGdwaW8sIGRldihhMSksIGF1ZGlvKGJjbGspCittcHAxMyAgICAgICAgMTMgICAgICAgIGdwaW8sIGRldihyZWFkeW4pLCBwY2llMChyc3RvdXRuKSwgcGNpZTEocnN0b3V0bikKK21wcDE0ICAgICAgICAxNCAgICAgICAgZ3BpbywgaTJjMChzZGEpLCB1YXJ0MSh0eGQpCittcHAxNSAgICAgICAgMTUgICAgICAgIGdwaW8sIGkyYzAoc2NrKSwgdWFydDEocnhkKQorbXBwMTYgICAgICAgIDE2ICAgICAgICBncGlvLCB1YXJ0MCh0eGQpCittcHAxNyAgICAgICAgMTcgICAgICAgIGdwaW8sIHVhcnQwKHJ4ZCkKK21wcDE4ICAgICAgICAxOCAgICAgICAgZ3BpbywgdGRtKGludG4pCittcHAxOSAgICAgICAgMTkgICAgICAgIGdwaW8sIHRkbShyc3RuKQorbXBwMjAgICAgICAgIDIwICAgICAgICBncGlvLCB0ZG0ocGNsaykKK21wcDIxICAgICAgICAyMSAgICAgICAgZ3BpbywgdGRtKGZzeW5jKQorbXBwMjIgICAgICAgIDIyICAgICAgICBncGlvLCB0ZG0oZHJ4KQorbXBwMjMgICAgICAgIDIzICAgICAgICBncGlvLCB0ZG0oZHR4KQorbXBwMjQgICAgICAgIDI0ICAgICAgICBncGlvLCBsZWQocDApLCBnZTEocnhkMCksIHNkKGNtZCksIHVhcnQwKHJ0cykKK21wcDI1ICAgICAgICAyNSAgICAgICAgZ3BpbywgbGVkKHAyKSwgZ2UxKHJ4ZDEpLCBzZChkMCksIHVhcnQwKGN0cykKK21wcDI2ICAgICAgICAyNiAgICAgICAgZ3BpbywgcGNpZTAoY2xrcmVxKSwgZ2UxKHJ4ZDIpLCBzZChkMiksIHVhcnQxKHJ0cykKK21wcDI3ICAgICAgICAyNyAgICAgICAgZ3BpbywgcGNpZTEoY2xrcmVxKSwgZ2UxKHJ4ZDMpLCBzZChkMSksIHVhcnQxKGN0cykKK21wcDI4ICAgICAgICAyOCAgICAgICAgZ3BpbywgbGVkKHAzKSwgZ2UxKHR4Y3RsKSwgc2QoY2xrKQorbXBwMjkgICAgICAgIDI5ICAgICAgICBncGlvLCBwY2llMShjbGtyZXEpLCBnZTEocnhjbGspLCBzZChkMykKK21wcDMwICAgICAgICAzMCAgICAgICAgZ3BpbywgZ2UxKHR4ZDApLCBzcGkxKGNzMCkKK21wcDMxICAgICAgICAzMSAgICAgICAgZ3BpbywgZ2UxKHR4ZDEpLCBzcGkxKG1vc2kpCittcHAzMiAgICAgICAgMzIgICAgICAgIGdwaW8sIGdlMSh0eGQyKSwgc3BpMShzY2spLCBwdHAodHJpZ2dlbikKK21wcDMzICAgICAgICAzMyAgICAgICAgZ3BpbywgZ2UxKHR4ZDMpLCBzcGkxKG1pc28pCittcHAzNCAgICAgICAgMzQgICAgICAgIGdwaW8sIGdlMSh0eGNsa291dCksIHNwaTEoc2NrKQorbXBwMzUgICAgICAgIDM1ICAgICAgICBncGlvLCBnZTEocnhjdGwpLCBzcGkxKGNzMSksIHNwaTAoY3MyKQorbXBwMzYgICAgICAgIDM2ICAgICAgICBncGlvLCBwY2llMChjbGtyZXEpCittcHAzNyAgICAgICAgMzcgICAgICAgIGdwaW8sIHBjaWUwKGNsa3JlcSksIHRkbShpbnRuKSwgZ2UobWRjKQorbXBwMzggICAgICAgIDM4ICAgICAgICBncGlvLCBwY2llMShjbGtyZXEpLCBnZShtZGlvKQorbXBwMzkgICAgICAgIDM5ICAgICAgICBncGlvLCByZWYoY2xrb3V0KQorbXBwNDAgICAgICAgIDQwICAgICAgICBncGlvLCB1YXJ0MSh0eGQpCittcHA0MSAgICAgICAgNDEgICAgICAgIGdwaW8sIHVhcnQxKHJ4ZCkKK21wcDQyICAgICAgICA0MiAgICAgICAgZ3Bpbywgc3BpMShjczIpLCBsZWQoYzApCittcHA0MyAgICAgICAgNDMgICAgICAgIGdwaW8sIHNhdGEwKHByc250KSwgZHJhbSh2dHRjdHJsKQorbXBwNDQgICAgICAgIDQ0ICAgICAgICBncGlvLCBzYXRhMChwcnNudCkKK21wcDQ1ICAgICAgICA0NSAgICAgICAgZ3Bpbywgc3BpMChjczIpLCBwY2llMChyc3RvdXRuKQorbXBwNDYgICAgICAgIDQ2ICAgICAgICBncGlvLCBsZWQocDApLCBnZTAodHhkMCksIGdlMSh0eGQwKQorbXBwNDcgICAgICAgIDQ3ICAgICAgICBncGlvLCBsZWQocDEpLCBnZTAodHhkMSksIGdlMSh0eGQxKQorbXBwNDggICAgICAgIDQ4ICAgICAgICBncGlvLCBsZWQocDIpLCBnZTAodHhkMiksIGdlMSh0eGQyKQorbXBwNDkgICAgICAgIDQ5ICAgICAgICBncGlvLCBsZWQocDMpLCBnZTAodHhkMyksIGdlMSh0eGQzKQorbXBwNTAgICAgICAgIDUwICAgICAgICBncGlvLCBsZWQoYzApLCBnZTAocnhkMCksIGdlMShyeGQwKQorbXBwNTEgICAgICAgIDUxICAgICAgICBncGlvLCBsZWQoYzEpLCBnZTAocnhkMSksIGdlMShyeGQxKQorbXBwNTIgICAgICAgIDUyICAgICAgICBncGlvLCBsZWQoYzIpLCBnZTAocnhkMiksIGdlMShyeGQyKQorbXBwNTMgICAgICAgIDUzICAgICAgICBncGlvLCBwY2llMShyc3RvdXRuKSwgZ2UwKHJ4ZDMpLCBnZTEocnhkMykKK21wcDU0ICAgICAgICA1NCAgICAgICAgZ3BpbywgcGNpZTAocnN0b3V0biksIGdlMChyeGN0bCksIGdlMShyeGN0bCkKK21wcDU1ICAgICAgICA1NSAgICAgICAgZ3BpbywgZ2UwKHJ4Y2xrKSwgZ2UxKHJ4Y2xrKQorbXBwNTYgICAgICAgIDU2ICAgICAgICBncGlvLCBnZTAodHhjbGtvdXQpLCBnZTEodHhjbGtvdXQpCittcHA1NyAgICAgICAgNTcgICAgICAgIGdwaW8sIGdlMCh0eGN0bCksIGdlMSh0eGN0bCkKK21wcDU4ICAgICAgICA1OCAgICAgICAgZ3BpbywgbGVkKGMwKQorbXBwNTkgICAgICAgIDU5ICAgICAgICBncGlvLCBsZWQoYzEpCittcHA2MCAgICAgICAgNjAgICAgICAgIGdwaW8sIHVhcnQxKHR4ZCksIGxlZChjMikKK21wcDYxICAgICAgICA2MSAgICAgICAgZ3BpbywgaTJjMShzZGEpLCB1YXJ0MShyeGQpLCBzcGkxKGNzMiksIGxlZChwMCkKK21wcDYyICAgICAgICA2MiAgICAgICAgZ3BpbywgaTJjMShzY2spLCBsZWQocDEpCittcHA2MyAgICAgICAgNjMgICAgICAgIGdwaW8sIHB0cCh0cmlnZ2VuKSwgbGVkKHAyKQorbXBwNjQgICAgICAgIDY0ICAgICAgICBncGlvLCBkcmFtKHZ0dGN0cmwpLCBsZWQocDMpCittcHA2NSAgICAgICAgNjUgICAgICAgIGdwaW8sIHNhdGExKHByc250KQorbXBwNjYgICAgICAgIDY2ICAgICAgICBncGlvLCBwdHAoZXZlbnRyZXEpLCBzcGkxKGNzMykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsYXJtYWRhLTM4eC1waW5jdHJsLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsYXJtYWRhLTM4eC1waW5jdHJsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTdjOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxhcm1hZGEtMzh4LXBpbmN0cmwudHh0CkBAIC0wLDAgKzEsODAgQEAKKyogTWFydmVsbCBBcm1hZGEgMzgwLzM4NSBTb0MgcGluY3RybCBkcml2ZXIgZm9yIG1wcAorCitQbGVhc2UgcmVmZXIgdG8gbWFydmVsbCxtdmVidS1waW5jdHJsLnR4dCBpbiB0aGlzIGRpcmVjdG9yeSBmb3IgY29tbW9uIGJpbmRpbmcKK3BhcnQgYW5kIHVzYWdlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAibWFydmVsbCw4OGY2ODEwLXBpbmN0cmwiLCAibWFydmVsbCw4OGY2ODIwLXBpbmN0cmwiIG9yCisgICJtYXJ2ZWxsLDg4ZjY4MjgtcGluY3RybCIgZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpYyB2YXJpYW50IG9mIHRoZQorICBTb0MgYmVpbmcgdXNlZC4KKy0gcmVnOiByZWdpc3RlciBzcGVjaWZpZXIgb2YgTVBQIHJlZ2lzdGVycworCitBdmFpbGFibGUgbXBwIHBpbnMvZ3JvdXBzIGFuZCBmdW5jdGlvbnM6CitOb3RlOiBicmFja2V0cyAoeCkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBtcHAgbmFtZSBmb3IgbWFydmVsbCxmdW5jdGlvbiBhbmQgZ2l2ZW4KK29ubHkgZm9yIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gaW4gdGhpcyBkb2N1bWVudC4KKworbmFtZSAgICAgICAgICBwaW5zICAgICBmdW5jdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CittcHAwICAgICAgICAgIDAgICAgICAgIGdwaW8sIHVhMChyeGQpCittcHAxICAgICAgICAgIDEgICAgICAgIGdwaW8sIHVhMCh0eGQpCittcHAyICAgICAgICAgIDIgICAgICAgIGdwaW8sIGkyYzAoc2NrKQorbXBwMyAgICAgICAgICAzICAgICAgICBncGlvLCBpMmMwKHNkYSkKK21wcDQgICAgICAgICAgNCAgICAgICAgZ3BpbywgZ2UobWRjKSwgdWExKHR4ZCksIHVhMChydHMpCittcHA1ICAgICAgICAgIDUgICAgICAgIGdwaW8sIGdlKG1kaW8pLCB1YTEocnhkKSwgdWEwKGN0cykKK21wcDYgICAgICAgICAgNiAgICAgICAgZ3BpbywgZ2UwKHR4Y2xrb3V0KSwgZ2UwKGNycyksIGRldihjczMpCittcHA3ICAgICAgICAgIDcgICAgICAgIGdwaW8sIGdlMCh0eGQwKSwgZGV2KGFkOSkKK21wcDggICAgICAgICAgOCAgICAgICAgZ3BpbywgZ2UwKHR4ZDEpLCBkZXYoYWQxMCkKK21wcDkgICAgICAgICAgOSAgICAgICAgZ3BpbywgZ2UwKHR4ZDIpLCBkZXYoYWQxMSkKK21wcDEwICAgICAgICAgMTAgICAgICAgZ3BpbywgZ2UwKHR4ZDMpLCBkZXYoYWQxMikKK21wcDExICAgICAgICAgMTEgICAgICAgZ3BpbywgZ2UwKHR4Y3RsKSwgZGV2KGFkMTMpCittcHAxMiAgICAgICAgIDEyICAgICAgIGdwaW8sIGdlMChyeGQwKSwgcGNpZTAocnN0b3V0KSwgcGNpZTEocnN0b3V0KSBbMV0sIHNwaTAoY3MxKSwgZGV2KGFkMTQpCittcHAxMyAgICAgICAgIDEzICAgICAgIGdwaW8sIGdlMChyeGQxKSwgcGNpZTAoY2xrcmVxKSwgcGNpZTEoY2xrcmVxKSBbMV0sIHNwaTAoY3MyKSwgZGV2KGFkMTUpCittcHAxNCAgICAgICAgIDE0ICAgICAgIGdwaW8sIGdlMChyeGQyKSwgcHRwKGNsayksIG0odnR0X2N0cmwpLCBzcGkwKGNzMyksIGRldih3ZW4xKQorbXBwMTUgICAgICAgICAxNSAgICAgICBncGlvLCBnZTAocnhkMyksIGdlKG1kYyBzbGF2ZSksIHBjaWUwKHJzdG91dCksIHNwaTAobW9zaSksIHBjaWUxKHJzdG91dCkgWzFdCittcHAxNiAgICAgICAgIDE2ICAgICAgIGdwaW8sIGdlMChyeGN0bCksIGdlKG1kaW8gc2xhdmUpLCBtKGRlY2NfZXJyKSwgc3BpMChtaXNvKSwgcGNpZTAoY2xrcmVxKQorbXBwMTcgICAgICAgICAxNyAgICAgICBncGlvLCBnZTAocnhjbGspLCBwdHAoY2xrKSwgdWExKHJ4ZCksIHNwaTAoc2NrKSwgc2F0YTEocHJzbnQpCittcHAxOCAgICAgICAgIDE4ICAgICAgIGdwaW8sIGdlMChyeGVyciksIHB0cCh0cmlnX2dlbiksIHVhMSh0eGQpLCBzcGkwKGNzMCksIHBjaWUxKHJzdG91dCkgWzFdCittcHAxOSAgICAgICAgIDE5ICAgICAgIGdwaW8sIGdlMChjb2wpLCBwdHAoZXZlbnRfcmVxKSwgcGNpZTAoY2xrcmVxKSwgc2F0YTEocHJzbnQpLCB1YTAoY3RzKQorbXBwMjAgICAgICAgICAyMCAgICAgICBncGlvLCBnZTAodHhjbGspLCBwdHAoY2xrKSwgcGNpZTEocnN0b3V0KSBbMV0sIHNhdGEwKHByc250KSwgdWEwKHJ0cykKK21wcDIxICAgICAgICAgMjEgICAgICAgZ3Bpbywgc3BpMChjczEpLCBnZTEocnhkMCksIHNhdGEwKHByc250KSwgc2QwKGNtZCksIGRldihib290Y3MpCittcHAyMiAgICAgICAgIDIyICAgICAgIGdwaW8sIHNwaTAobW9zaSksIGRldihhZDApCittcHAyMyAgICAgICAgIDIzICAgICAgIGdwaW8sIHNwaTAoc2NrKSwgZGV2KGFkMikKK21wcDI0ICAgICAgICAgMjQgICAgICAgZ3Bpbywgc3BpMChtaXNvKSwgdWEwKGN0cyksIHVhMShyeGQpLCBzZDAoZDQpLCBkZXYocmVhZHkpCittcHAyNSAgICAgICAgIDI1ICAgICAgIGdwaW8sIHNwaTAoY3MwKSwgdWEwKHJ0cyksIHVhMSh0eGQpLCBzZDAoZDUpLCBkZXYoY3MwKQorbXBwMjYgICAgICAgICAyNiAgICAgICBncGlvLCBzcGkwKGNzMiksIGkyYzEoc2NrKSwgc2QwKGQ2KSwgZGV2KGNzMSkKK21wcDI3ICAgICAgICAgMjcgICAgICAgZ3Bpbywgc3BpMChjczMpLCBnZTEodHhjbGtvdXQpLCBpMmMxKHNkYSksIHNkMChkNyksIGRldihjczIpCittcHAyOCAgICAgICAgIDI4ICAgICAgIGdwaW8sIGdlMSh0eGQwKSwgc2QwKGNsayksIGRldihhZDUpCittcHAyOSAgICAgICAgIDI5ICAgICAgIGdwaW8sIGdlMSh0eGQxKSwgZGV2KGFsZTApCittcHAzMCAgICAgICAgIDMwICAgICAgIGdwaW8sIGdlMSh0eGQyKSwgZGV2KG9lbikKK21wcDMxICAgICAgICAgMzEgICAgICAgZ3BpbywgZ2UxKHR4ZDMpLCBkZXYoYWxlMSkKK21wcDMyICAgICAgICAgMzIgICAgICAgZ3BpbywgZ2UxKHR4Y3RsKSwgZGV2KHdlbjApCittcHAzMyAgICAgICAgIDMzICAgICAgIGdwaW8sIG0oZGVjY19lcnIpLCBkZXYoYWQzKQorbXBwMzQgICAgICAgICAzNCAgICAgICBncGlvLCBkZXYoYWQxKQorbXBwMzUgICAgICAgICAzNSAgICAgICBncGlvLCByZWYoY2xrX291dDEpLCBkZXYoYTEpCittcHAzNiAgICAgICAgIDM2ICAgICAgIGdwaW8sIHB0cCh0cmlnX2dlbiksIGRldihhMCkKK21wcDM3ICAgICAgICAgMzcgICAgICAgZ3BpbywgcHRwKGNsayksIGdlMShyeGNsayksIHNkMChkMyksIGRldihhZDgpCittcHAzOCAgICAgICAgIDM4ICAgICAgIGdwaW8sIHB0cChldmVudF9yZXEpLCBnZTEocnhkMSksIHJlZihjbGtfb3V0MCksIHNkMChkMCksIGRldihhZDQpCittcHAzOSAgICAgICAgIDM5ICAgICAgIGdwaW8sIGkyYzEoc2NrKSwgZ2UxKHJ4ZDIpLCB1YTAoY3RzKSwgc2QwKGQxKSwgZGV2KGEyKQorbXBwNDAgICAgICAgICA0MCAgICAgICBncGlvLCBpMmMxKHNkYSksIGdlMShyeGQzKSwgdWEwKHJ0cyksIHNkMChkMiksIGRldihhZDYpCittcHA0MSAgICAgICAgIDQxICAgICAgIGdwaW8sIHVhMShyeGQpLCBnZTEocnhjdGwpLCB1YTAoY3RzKSwgc3BpMShjczMpLCBkZXYoYnVyc3QvbGFzdCkKK21wcDQyICAgICAgICAgNDIgICAgICAgZ3BpbywgdWExKHR4ZCksIHVhMChydHMpLCBkZXYoYWQ3KQorbXBwNDMgICAgICAgICA0MyAgICAgICBncGlvLCBwY2llMChjbGtyZXEpLCBtKHZ0dF9jdHJsKSwgbShkZWNjX2VyciksIHBjaWUwKHJzdG91dCksIGRldihjbGtvdXQpCittcHA0NCAgICAgICAgIDQ0ICAgICAgIGdwaW8sIHNhdGEwKHByc250KSwgc2F0YTEocHJzbnQpLCBzYXRhMihwcnNudCkgWzJdLCBzYXRhMyhwcnNudCkgWzNdLCBwY2llMChyc3RvdXQpCittcHA0NSAgICAgICAgIDQ1ICAgICAgIGdwaW8sIHJlZihjbGtfb3V0MCksIHBjaWUwKHJzdG91dCksIHBjaWUxKHJzdG91dCkgWzFdLCBwY2llMihyc3RvdXQpLCBwY2llMyhyc3RvdXQpCittcHA0NiAgICAgICAgIDQ2ICAgICAgIGdwaW8sIHJlZihjbGtfb3V0MSksIHBjaWUwKHJzdG91dCksIHBjaWUxKHJzdG91dCkgWzFdLCBwY2llMihyc3RvdXQpLCBwY2llMyhyc3RvdXQpCittcHA0NyAgICAgICAgIDQ3ICAgICAgIGdwaW8sIHNhdGEwKHByc250KSwgc2F0YTEocHJzbnQpLCBzYXRhMihwcnNudCkgWzJdLCBzcGkxKGNzMiksIHNhdGEzKHByc250KSBbMl0KK21wcDQ4ICAgICAgICAgNDggICAgICAgZ3Bpbywgc2F0YTAocHJzbnQpLCBtKHZ0dF9jdHJsKSwgdGRtMmMocGNsayksIGF1ZGlvKG1jbGspLCBzZDAoZDQpCittcHA0OSAgICAgICAgIDQ5ICAgICAgIGdwaW8sIHNhdGEyKHByc250KSBbMl0sIHNhdGEzKHByc250KSBbMl0sIHRkbTJjKGZzeW5jKSwgYXVkaW8obHJjbGspLCBzZDAoZDUpCittcHA1MCAgICAgICAgIDUwICAgICAgIGdwaW8sIHBjaWUwKHJzdG91dCksIHBjaWUxKHJzdG91dCkgWzFdLCB0ZG0yYyhkcngpLCBhdWRpbyhleHRjbGspLCBzZDAoY21kKQorbXBwNTEgICAgICAgICA1MSAgICAgICBncGlvLCB0ZG0yYyhkdHgpLCBhdWRpbyhzZG8pLCBtKGRlY2NfZXJyKQorbXBwNTIgICAgICAgICA1MiAgICAgICBncGlvLCBwY2llMChyc3RvdXQpLCBwY2llMShyc3RvdXQpIFsxXSwgdGRtMmMoaW50biksIGF1ZGlvKHNkaSksIHNkMChkNikKK21wcDUzICAgICAgICAgNTMgICAgICAgZ3Bpbywgc2F0YTEocHJzbnQpLCBzYXRhMChwcnNudCksIHRkbTJjKHJzdG4pLCBhdWRpbyhiY2xrKSwgc2QwKGQ3KQorbXBwNTQgICAgICAgICA1NCAgICAgICBncGlvLCBzYXRhMChwcnNudCksIHNhdGExKHByc250KSwgcGNpZTAocnN0b3V0KSwgcGNpZTEocnN0b3V0KSBbMV0sIHNkMChkMykKK21wcDU1ICAgICAgICAgNTUgICAgICAgZ3BpbywgdWExKGN0cyksIGdlKG1kaW8pLCBwY2llMShjbGtyZXEpIFsxXSwgc3BpMShjczEpLCBzZDAoZDApCittcHA1NiAgICAgICAgIDU2ICAgICAgIGdwaW8sIHVhMShydHMpLCBnZShtZGMpLCBtKGRlY2NfZXJyKSwgc3BpMShtb3NpKQorbXBwNTcgICAgICAgICA1NyAgICAgICBncGlvLCBzcGkxKHNjayksIHNkMChjbGspCittcHA1OCAgICAgICAgIDU4ICAgICAgIGdwaW8sIHBjaWUxKGNsa3JlcSkgWzFdLCBpMmMxKHNjayksIHBjaWUyKGNsa3JlcSksIHNwaTEobWlzbyksIHNkMChkMSkKK21wcDU5ICAgICAgICAgNTkgICAgICAgZ3BpbywgcGNpZTAocnN0b3V0KSwgaTJjMShzZGEpLCBwY2llMShyc3RvdXQpIFsxXSwgc3BpMShjczApLCBzZDAoZDIpCisKK1sxXTogb25seSBhdmFpbGFibGUgb24gODhGNjgyMCBhbmQgODhGNjgyOAorWzJdOiBvbmx5IGF2YWlsYWJsZSBvbiA4OEY2ODI4CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGFybWFkYS14cC1waW5jdHJsLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsYXJtYWRhLXhwLXBpbmN0cmwudHh0CmluZGV4IGJmYTBhMmUuLjM3M2RiY2NkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGFybWFkYS14cC1waW5jdHJsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGFybWFkYS14cC1waW5jdHJsLnR4dApAQCAtNiw2ICs2LDcgQEAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAtIGNvbXBhdGlibGU6ICJtYXJ2ZWxsLG12NzgyMzAtcGluY3RybCIsICJtYXJ2ZWxsLG12NzgyNjAtcGluY3RybCIsCiAgICAgICAgICAgICAgICJtYXJ2ZWxsLG12Nzg0NjAtcGluY3RybCIKKy0gcmVnOiByZWdpc3RlciBzcGVjaWZpZXIgb2YgTVBQIHJlZ2lzdGVycwogCiBUaGlzIGRyaXZlciBzdXBwb3J0cyBhbGwgQXJtYWRhIFhQIHZhcmlhbnRzLCBpLmUuIG12NzgyMzAsIG12NzgyNjAsIGFuZCBtdjc4NDYwLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGRvdmUtcGluY3RybC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGRvdmUtcGluY3RybC50eHQKaW5kZXggNTBlYzM1MS4uY2Y1MjQ3NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxkb3ZlLXBpbmN0cmwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsZG92ZS1waW5jdHJsLnR4dApAQCAtNiw2ICs2LDcgQEAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAtIGNvbXBhdGlibGU6ICJtYXJ2ZWxsLGRvdmUtcGluY3RybCIKIC0gY2xvY2tzOiAob3B0aW9uYWwpIHBoYW5kbGUgb2YgcGRtYSBjbG9jaworLSByZWc6IHJlZ2lzdGVyIHNwZWNpZmllcnMgb2YgTVBQLCBNUFA0LCBhbmQgUE1VIE1QUCByZWdpc3RlcnMKIAogQXZhaWxhYmxlIG1wcCBwaW5zL2dyb3VwcyBhbmQgZnVuY3Rpb25zOgogTm90ZTogYnJhY2tldHMgKHgpIGFyZSBub3QgcGFydCBvZiB0aGUgbXBwIG5hbWUgZm9yIG1hcnZlbGwsZnVuY3Rpb24gYW5kIGdpdmVuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGtpcmt3b29kLXBpbmN0cmwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxraXJrd29vZC1waW5jdHJsLnR4dAppbmRleCA5NWRhZjYzLi43MzA0NDRhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGtpcmt3b29kLXBpbmN0cmwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsa2lya3dvb2QtcGluY3RybC50eHQKQEAgLTgsNiArOCw3IEBACiAgICAgICAgICAgICAgICJtYXJ2ZWxsLDg4ZjYxOTAtcGluY3RybCIsICJtYXJ2ZWxsLDg4ZjYxOTItcGluY3RybCIsCiAgICAgICAgICAgICAgICJtYXJ2ZWxsLDg4ZjYyODEtcGluY3RybCIsICJtYXJ2ZWxsLDg4ZjYyODItcGluY3RybCIKICAgICAgICAgICAgICAgIm1hcnZlbGwsOThkeDQxMjItcGluY3RybCIKKy0gcmVnOiByZWdpc3RlciBzcGVjaWZpZXIgb2YgTVBQIHJlZ2lzdGVycwogCiBUaGlzIGRyaXZlciBzdXBwb3J0cyBhbGwga2lya3dvb2QgdmFyaWFudHMsIGkuZS4gODhmNjE4MCwgODhmNjE5eCwgYW5kIDg4ZjYyOHguCiBJdCBhbHNvIHN1cHBvcnQgdGhlIDg4ZjYyODEtYmFzZWQgdmFyaWFudCBpbiB0aGUgOThkeDQxMnggQm9iY2F0IFNvQ3MuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLG12ZWJ1LXBpbmN0cmwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxtdmVidS1waW5jdHJsLnR4dAppbmRleCAwYTI2YzNhLi4wYzA5ZjRlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLG12ZWJ1LXBpbmN0cmwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsbXZlYnUtcGluY3RybC50eHQKQEAgLTM3LDcgKzM3LDcgQEAKIAogcGluY3RybDogcGluY3RybEBkMDIwMCB7CiAJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGRvdmUtcGluY3RybCI7Ci0JcmVnID0gPDB4ZDAyMDAgMHgyMD47CisJcmVnID0gPDB4ZDAyMDAgMHgxND4sIDwweGQwNDQwIDB4MDQ+LCA8MHhkODAyYyAweDA4PjsKIAogCXBteF91YXJ0MV9zdzogcG14LXVhcnQxLXN3IHsKIAkJbWFydmVsbCxwaW5zID0gIm1wcF91YXJ0MSI7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLXNpbmdsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLXNpbmdsZS50eHQKaW5kZXggYmMwZGZkZi4uNjZkY2FhOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcGluY3RybC1zaW5nbGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3BpbmN0cmwtc2luZ2xlLnR4dApAQCAtNjMsNiArNjMsMTMgQEAKIAkJLyogaW5wdXQsIGVuYWJsZSBiaXRzLCBkaXNhYmxlIGJpdHMsIG1hc2sgKi8KIAkJcGluY3RybC1zaW5nbGUsaW5wdXQtc2NobWl0dC1lbmFibGUgPSA8MHgzMCAweDQwIDAgMHg3MD47CiAKKy0gcGluY3RybC1zaW5nbGUsbG93LXBvd2VyLW1vZGUgOiBhcnJheSBvZiB2YWx1ZSB0aGF0IGFyZSB1c2VkIHRvIGNvbmZpZ3VyZQorICBsb3cgcG93ZXIgbW9kZSBvZiB0aGlzIHBpbi4gRm9yIHNvbWUgc2lsaWNvbnMsIHRoZSBsb3cgcG93ZXIgbW9kZSB3aWxsCisgIGNvbnRyb2wgdGhlIG91dHB1dCBvZiB0aGUgcGluIHdoZW4gdGhlIHBhZCBpbmNsdWRpbmcgdGhlIHBpbiBlbnRlciBsb3cKKyAgcG93ZXIgbW9kZS4KKwkJLyogbG93IHBvd2VyIG1vZGUgdmFsdWUsIG1hc2sgKi8KKwkJcGluY3RybC1zaW5nbGUsbG93LXBvd2VyLW1vZGUgPSA8MHgyODggMHgzODg+OworCiAtIHBpbmN0cmwtc2luZ2xlLGdwaW8tcmFuZ2UgOiBsaXN0IG9mIHZhbHVlIHRoYXQgYXJlIHVzZWQgdG8gY29uZmlndXJlIGEgR1BJTwogICByYW5nZS4gVGhleSdyZSB2YWx1ZSBvZiBzdWJub2RlIHBoYW5kbGUsIHBpbiBiYXNlIGluIHBpbmN0cmwgZGV2aWNlLCBwaW4KICAgbnVtYmVyIGluIHRoaXMgcmFuZ2UsIEdQSU8gZnVuY3Rpb24gdmFsdWUgb2YgdGhpcyBHUElPIHJhbmdlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcGluY3RybC1zdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLXN0LnR4dAppbmRleCAwNWJmODJhLi40YmQ1YmUwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLXN0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLXN0LnR4dApAQCAtMTEsMTggKzExLDY4IEBACiBTVCBwaW5jdHJsIGRyaXZlciBjb250cm9scyBQSU8gbXVsdGlwbGV4aW5nIGJsb2NrIGFuZCBhbHNvIGludGVyYWN0cyB3aXRoCiBncGlvIGRyaXZlciB0byBjb25maWd1cmUgYSBwaW4uCiAKLVJlcXVpcmVkIHByb3BlcnRpZXM6IChQSU8gbXVsdGlwbGV4aW5nIGJsb2NrKQorR1BJTyBiYW5rIGNhbiBoYXZlIG9uZSBvZiB0aGUgdHdvIHBvc3NpYmxlIHR5cGVzIG9mIGludGVycnVwdC13aXJpbmdzLgorCitGaXJzdCB0eXBlIGlzIHZpYSBpcnFtdXgsIHNpbmdsZSBpbnRlcnJ1cHQgaXMgdXNlZCBieSBtdWx0aXBsZSBncGlvIGJhbmtzLiBUaGlzCityZWR1Y2VzIG51bWJlciBvZiBvdmVyYWxsIGludGVycnVwdHMgbnVtYmVycyByZXF1aXJlZC4gQWxsIHRoZXNlIGJhbmtzIGJlbG9uZyB0bworYSBzaW5nbGUgcGluY29udHJvbGxlci4KKwkJICBfX19fX19fX18KKwkJIHwJICAgfC0tLS0+IFtncGlvLWJhbmsgKG4pICAgIF0KKwkJIHwJICAgfC0tLS0+IFtncGlvLWJhbmsgKG4gKyAxKV0KKwlbaXJxTl0tLSB8IGlycS1tdXggfC0tLS0+IFtncGlvLWJhbmsgKG4gKyAyKV0KKwkJIHwJICAgfC0tLS0+IFtncGlvLWJhbmsgKC4uLiAgKV0KKwkJIHxfX19fX19fX198LS0tLT4gW2dwaW8tYmFuayAobiArIDcpXQorCitTZWNvbmQgdHlwZSBoYXMgYSBkZWRpY2F0ZWQgaW50ZXJydXB0IHBlciBncGlvIGJhbmsuCisKKwlbaXJxTl0tLS0tPiBbZ3Bpby1iYW5rIChuKV0KKworCitQaW4gY29udHJvbGxlciBub2RlOgorUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZQk6IHNob3VsZCBiZSAic3QsPFNPQz4tPHBpby1ibG9jaz4tcGluY3RybCIKIAlsaWtlIHN0LHN0aWg0MTUtc2JjLXBpbmN0cmwsIHN0LHN0aWg0MTUtZnJvbnQtcGluY3RybCBhbmQgc28gb24uCi0tIGdwaW8tY29udHJvbGxlciA6IEluZGljYXRlcyB0aGlzIGRldmljZSBpcyBhIEdQSU8gY29udHJvbGxlcgotLSAjZ3Bpby1jZWxscwkgIDogU2hvdWxkIGJlIG9uZS4gVGhlIGZpcnN0IGNlbGwgaXMgdGhlIHBpbiBudW1iZXIuCistIHN0LHN5c2NmZwkJOiBTaG91bGQgYmUgYSBwaGFuZGxlIG9mIHRoZSBzeXNjZmcgbm9kZS4KIC0gc3QscmV0aW1lLXBpbi1tYXNrCTogU2hvdWxkIGJlIG1hc2sgdG8gc3BlY2lmeSB3aGljaCBwaW5zIGNhbiBiZSByZXRpbWVkLgogCUlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgcHJlc2VudCwgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbCB0aGUgcGlucyBpbiB0aGUKIAliYW5rIGFyZSBjYXBhYmxlIG9mIHJldGltaW5nLiBSZXRpbWluZyBpcyBtYWlubHkgdXNlZCB0byBpbXByb3ZlIHRoZQogCUlPIHRpbWluZyBtYXJnaW5zIG9mIGV4dGVybmFsIHN5bmNocm9ub3VzIGludGVyZmFjZXMuCi0tIHN0LGJhbmstbmFtZQkJOiBTaG91bGQgYmUgYSBuYW1lIHN0cmluZyBmb3IgdGhpcyBiYW5rIGFzCi0JCQlzcGVjaWZpZWQgaW4gZGF0YXNoZWV0LgotLSBzdCxzeXNjZmcJCTogU2hvdWxkIGJlIGEgcGhhbmRsZSBvZiB0aGUgc3lzY2ZnIG5vZGUuCistIHJhbmdlcyA6IGRlZmluZXMgbWFwcGluZyBiZXR3ZWVuIHBpbiBjb250cm9sbGVyIG5vZGUgKHBhcmVudCkgdG8gZ3Bpby1iYW5rCisgIG5vZGUgKGNoaWxkcmVuKS4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gaW50ZXJydXB0cwk6IEludGVycnVwdCBudW1iZXIgb2YgdGhlIGlycW11eC4gSWYgdGhlIGludGVycnVwdCBpcyBzaGFyZWQKKyAgd2l0aCBvdGhlciBncGlvIGJhbmtzIHZpYSBpcnFtdXguCisgIGEgaXJxbGluZSBhbmQgZ3BpbyBiYW5rcy4KKy0gcmVnCQk6IGlycW11eCBtZW1vcnkgcmVzb3VyY2UuIElmIGlycW11eCBpcyBwcmVzZW50LgorLSByZWctbmFtZXMJOiBpcnFtdXggcmVzb3VyY2Ugc2hvdWxkIGJlIG5hbWVkIGFzICJpcnFtdXgiLgorCitHUElPIGNvbnRyb2xsZXIvYmFuayBub2RlLgorUmVxdWlyZWQgcHJvcGVydGllczoKKy0gZ3Bpby1jb250cm9sbGVyIDogSW5kaWNhdGVzIHRoaXMgZGV2aWNlIGlzIGEgR1BJTyBjb250cm9sbGVyCistICNncGlvLWNlbGxzCSAgOiBTaG91bGQgYmUgb25lLiBUaGUgZmlyc3QgY2VsbCBpcyB0aGUgcGluIG51bWJlci4KKy0gc3QsYmFuay1uYW1lCSAgOiBTaG91bGQgYmUgYSBuYW1lIHN0cmluZyBmb3IgdGhpcyBiYW5rIGFzIHNwZWNpZmllZCBpbgorICBkYXRhc2hlZXQuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGludGVycnVwdHMJOiBJbnRlcnJ1cHQgbnVtYmVyIGZvciB0aGlzIGdwaW8gYmFuay4gSWYgdGhlcmUgaXMgYSBkZWRpY2F0ZWQKKyAgaW50ZXJydXB0IHdpcmVkIHVwIGZvciB0aGlzIGdwaW8gYmFuay4KKworLSBpbnRlcnJ1cHQtY29udHJvbGxlciA6IEluZGljYXRlcyB0aGlzIGRldmljZSBpcyBhIGludGVycnVwdCBjb250cm9sbGVyLiBHUElPCisgIGJhbmsgY2FuIGJlIGFuIGludGVycnVwdCBjb250cm9sbGVyIGlmZiBvbmUgb2YgdGhlIGludGVycnVwdCB0eXBlIGVpdGhlciB2aWEKK2lycW11eCBvciBhIGRlZGljYXRlZCBpbnRlcnJ1cHQgcGVyIGJhbmsgaXMgc3BlY2lmaWVkLgorCistICNpbnRlcnJ1cHQtY2VsbHM6IHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IHNob3VsZCBiZSAyLgorICAgICAtIEZpcnN0IENlbGw6IHJlcHJlc2VudHMgdGhlIGV4dGVybmFsIGdwaW8gaW50ZXJydXB0IG51bWJlciBsb2NhbCB0byB0aGUKKyAgICAgICBncGlvIGludGVycnVwdCBzcGFjZSBvZiB0aGUgY29udHJvbGxlci4KKyAgICAgLSBTZWNvbmQgQ2VsbDogZmxhZ3MgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgdGhlIGludGVycnVwdAorICAgICAgIC0gMSA9IHJpc2luZyBlZGdlIHRyaWdnZXJlZAorICAgICAgIC0gMiA9IGZhbGxpbmcgZWRnZSB0cmlnZ2VyZWQKKyAgICAgICAtIDMgPSByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VyZWQKKyAgICAgICAtIDQgPSBoaWdoIGxldmVsIHRyaWdnZXJlZAorICAgICAgIC0gOCA9IGxvdyBsZXZlbCB0cmlnZ2VyZWQKK2ZvciByZWxhdGVkIG1hY3JvcyBsb29rIGluOgoraW5jbHVkZS9kdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9pcnEuaAogCiBFeGFtcGxlOgogCXBpbi1jb250cm9sbGVyLXNiYyB7CkBAIC0zMCwxMCArODAsMTcgQEAKIAkJI3NpemUtY2VsbHMJPSA8MT47CiAJCWNvbXBhdGlibGUJPSAic3Qsc3RpaDQxNS1zYmMtcGluY3RybCI7CiAJCXN0LHN5c2NmZwk9IDwmc3lzY2ZnX3NiYz47CisJCXJlZyAJCT0gPDB4ZmU2MWYwODAgMHg0PjsKKwkJcmVnLW5hbWVzCT0gImlycW11eCI7CisJCWludGVycnVwdHMgCT0gPEdJQ19TUEkgMTgwIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQlpbnRlcnJ1cHRzLW5hbWVzID0gImlycW11eCI7CiAJCXJhbmdlcyAJCT0gPDAgMHhmZTYxMDAwMCAweDUwMDA+OworCiAJCVBJTzA6IGdwaW9AZmU2MTAwMDAgewogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMJPSA8MT47CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAJCQlyZWcJCT0gPDAgMHgxMDA+OwogCQkJc3QsYmFuay1uYW1lCT0gIlBJTzAiOwogCQl9OwpAQCAtMTA1LDYgKzE2MiwxMCBAQAogCiBzZGhjaTA6c2RoY2lAZmU4MTAwMDB7CiAJLi4uCisJaW50ZXJydXB0LXBhcmVudCA9IDwmUElPMz47CisJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHRzID0gPDMgSVJRX1RZUEVfTEVWRUxfSElHSD47IC8qIEludGVycnVwdCBsaW5lIHZpYSBQSU8zLTMgKi8KKwlpbnRlcnJ1cHRzLW5hbWVzID0gImNhcmQtZGV0ZWN0IjsKIAlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOwogCXBpbmN0cmwtMAk9IDwmcGluY3RybF9tbWM+OwogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20sbXNtODk3NC1waW5jdHJsLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20sbXNtODk3NC1waW5jdHJsLnR4dAppbmRleCA0YzM1MmJlLi45ZmI4OWUzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9xY29tLG1zbTg5NzQtcGluY3RybC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxtc204OTc0LXBpbmN0cmwudHh0CkBAIC0xLDcgKzEsNyBAQAogUXVhbGNvbW0gTVNNODk3NCBUTE1NIGJsb2NrCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGU6ICJxY29tLG1zbTh4NzQtcGluY3RybCIKKy0gY29tcGF0aWJsZTogInFjb20sbXNtODk3NC1waW5jdHJsIgogLSByZWc6IFNob3VsZCBiZSB0aGUgYmFzZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIFRMTU0gYmxvY2suCiAtIGludGVycnVwdHM6IFNob3VsZCBiZSB0aGUgcGFyZW50IElSUSBvZiB0aGUgVExNTSBibG9jay4KIC0gaW50ZXJydXB0LWNvbnRyb2xsZXI6IE1hcmtzIHRoZSBkZXZpY2Ugbm9kZSBhcyBhbiBpbnRlcnJ1cHQgY29udHJvbGxlci4KQEAgLTQyLDE0ICs0MiwxNCBAQAogTm90ZSB0aGF0IG5vdCBhbGwgcHJvcGVydGllcyBhcmUgdmFsaWQgZm9yIGFsbCBwaW5zLgogCiAKLVZhbGlkIHZhbHVlcyBmb3IgcWNvbSxwaW5zIGFyZToKK1ZhbGlkIHZhbHVlcyBmb3IgcGlucyBhcmU6CiAgIGdwaW8wLWdwaW8xNDUKICAgICBTdXBwb3J0cyBtdXgsIGJpYXMgYW5kIGRyaXZlLXN0cmVuZ3RoCiAKICAgc2RjMV9jbGssIHNkYzFfY21kLCBzZGMxX2RhdGEsIHNkYzJfY2xrLCBzZGMyX2NtZCwgc2RjMl9kYXRhCiAgICAgU3VwcG9ydHMgYmlhcyBhbmQgZHJpdmUtc3RyZW5ndGgKIAotVmFsaWQgdmFsdWVzIGZvciBxY29tLGZ1bmN0aW9uIGFyZToKK1ZhbGlkIHZhbHVlcyBmb3IgZnVuY3Rpb24gYXJlOgogICBibHNwX2kyYzIsIGJsc3BfaTJjNiwgYmxzcF9pMmMxMSwgYmxzcF9zcGkxLCBibHNwX3VhcnQyLCBibHNwX3VhcnQ4LCBzbGltYnVzCiAKICAgKE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB5ZXQgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgZnVuY3Rpb25zKQpAQCAtNzMsMTggKzczLDE4IEBACiAKIAkJdWFydDJfZGVmYXVsdDogdWFydDJfZGVmYXVsdCB7CiAJCQltdXggewotCQkJCXFjb20scGlucyA9ICJncGlvNCIsICJncGlvNSI7Ci0JCQkJcWNvbSxmdW5jdGlvbiA9ICJibHNwX3VhcnQyIjsKKwkJCQlwaW5zID0gImdwaW80IiwgImdwaW81IjsKKwkJCQlmdW5jdGlvbiA9ICJibHNwX3VhcnQyIjsKIAkJCX07CiAKIAkJCXR4IHsKLQkJCQlxY29tLHBpbnMgPSAiZ3BpbzQiOworCQkJCXBpbnMgPSAiZ3BpbzQiOwogCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDQ+OwogCQkJCWJpYXMtZGlzYWJsZTsKIAkJCX07CiAKIAkJCXJ4IHsKLQkJCQlxY29tLHBpbnMgPSAiZ3BpbzUiOworCQkJCXBpbnMgPSAiZ3BpbzUiOwogCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OwogCQkJCWJpYXMtcHVsbC11cDsKIAkJCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9zYW1zdW5nLXBpbmN0cmwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvc2Ftc3VuZy1waW5jdHJsLnR4dAppbmRleCAyNTc2NzdkLi4yYjMyNzgzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9zYW1zdW5nLXBpbmN0cmwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3NhbXN1bmctcGluY3RybC50eHQKQEAgLTE2LDYgKzE2LDcgQEAKICAgLSAic2Ftc3VuZyxleHlub3M0MjEwLXBpbmN0cmwiOiBmb3IgRXh5bm9zNDIxMCBjb21wYXRpYmxlIHBpbi1jb250cm9sbGVyLgogICAtICJzYW1zdW5nLGV4eW5vczR4MTItcGluY3RybCI6IGZvciBFeHlub3M0eDEyIGNvbXBhdGlibGUgcGluLWNvbnRyb2xsZXIuCiAgIC0gInNhbXN1bmcsZXh5bm9zNTI1MC1waW5jdHJsIjogZm9yIEV4eW5vczUyNTAgY29tcGF0aWJsZSBwaW4tY29udHJvbGxlci4KKyAgLSAic2Ftc3VuZyxleHlub3M1MjYwLXBpbmN0cmwiOiBmb3IgRXh5bm9zNTI2MCBjb21wYXRpYmxlIHBpbi1jb250cm9sbGVyLgogICAtICJzYW1zdW5nLGV4eW5vczU0MjAtcGluY3RybCI6IGZvciBFeHlub3M1NDIwIGNvbXBhdGlibGUgcGluLWNvbnRyb2xsZXIuCiAKIC0gcmVnOiBCYXNlIGFkZHJlc3Mgb2YgdGhlIHBpbiBjb250cm9sbGVyIGhhcmR3YXJlIG1vZHVsZSBhbmQgbGVuZ3RoIG9mCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL2dwaW8tcmVndWxhdG9yLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvZ3Bpby1yZWd1bGF0b3IudHh0CmluZGV4IDYzYzY1OTguLmU1Y2FjMWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvZ3Bpby1yZWd1bGF0b3IudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvZ3Bpby1yZWd1bGF0b3IudHh0CkBAIC04LDggKzgsMTIgQEAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAtIGVuYWJsZS1ncGlvCQk6IEdQSU8gdG8gdXNlIHRvIGVuYWJsZS9kaXNhYmxlIHRoZSByZWd1bGF0b3IuCiAtIGdwaW9zCQkJOiBHUElPIGdyb3VwIHVzZWQgdG8gY29udHJvbCB2b2x0YWdlLgorLSBncGlvcy1zdGF0ZXMJCTogZ3Bpb3MgcGluJ3MgaW5pdGlhbCBzdGF0ZXMgYXJyYXkuIDA6IExPVywgMTogSElHSC4KKwkJCSAgZGVmdWFsdCBpcyBMT1cgaWYgbm90aGluZyBpcyBzcGVjaWZpZWQuCiAtIHN0YXJ0dXAtZGVsYXktdXMJOiBTdGFydHVwIHRpbWUgaW4gbWljcm9zZWNvbmRzLgogLSBlbmFibGUtYWN0aXZlLWhpZ2gJOiBQb2xhcml0eSBvZiBHUElPIGlzIGFjdGl2ZSBoaWdoIChkZWZhdWx0IGlzIGxvdykuCistIHJlZ3VsYXRvci10eXBlCTogU3BlY2lmaWVzIHdoYXQgaXMgYmVpbmcgcmVndWxhdGVkLCBtdXN0IGJlIGVpdGhlcgorCQkJICAidm9sdGFnZSIgb3IgImN1cnJlbnQiLCBkZWZhdWx0cyB0byBjdXJyZW50LgogCiBBbnkgcHJvcGVydHkgZGVmaW5lZCBhcyBwYXJ0IG9mIHRoZSBjb3JlIHJlZ3VsYXRvciBiaW5kaW5nIGRlZmluZWQgaW4KIHJlZ3VsYXRvci50eHQgY2FuIGFsc28gYmUgdXNlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvcGZ1emUxMDAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9wZnV6ZTEwMC50eHQKaW5kZXggZmM5ODliMi4uMzRlZjVkMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9wZnV6ZTEwMC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9wZnV6ZTEwMC50eHQKQEAgLTEsNyArMSw3IEBACiBQRlVaRTEwMCBmYW1pbHkgb2YgcmVndWxhdG9ycwogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlOiAiZnNsLHBmdXplMTAwIgorLSBjb21wYXRpYmxlOiAiZnNsLHBmdXplMTAwIiBvciAiZnNsLHBmdXplMjAwIgogLSByZWc6IEkyQyBzbGF2ZSBhZGRyZXNzCiAKIFJlcXVpcmVkIGNoaWxkIG5vZGU6CkBAIC0xMCwxMSArMTAsMTQgQEAKICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9yZWd1bGF0b3IudHh0LgogCiAgIFRoZSB2YWxpZCBuYW1lcyBmb3IgcmVndWxhdG9ycyBhcmU6CisgIC0tUEZVWkUxMDAKICAgc3cxYWIsc3cxYyxzdzIsc3czYSxzdzNiLHN3NCxzd2JzdCx2c252cyx2cmVmZGRyLHZnZW4xfnZnZW42CisgIC0tUEZVWkUyMDAKKyAgc3cxYWIsc3cyLHN3M2Esc3czYixzd2JzdCx2c252cyx2cmVmZGRyLHZnZW4xfnZnZW42CiAKIEVhY2ggcmVndWxhdG9yIGlzIGRlZmluZWQgdXNpbmcgdGhlIHN0YW5kYXJkIGJpbmRpbmcgZm9yIHJlZ3VsYXRvcnMuCiAKLUV4YW1wbGU6CitFeGFtcGxlIDE6IFBGVVpFMTAwCiAKIAlwbWljOiBwZnV6ZTEwMEAwOCB7CiAJCWNvbXBhdGlibGUgPSAiZnNsLHBmdXplMTAwIjsKQEAgLTExMywzICsxMTYsOTIgQEAKIAkJCX07CiAJCX07CiAJfTsKKworCitFeGFtcGxlIDI6IFBGVVpFMjAwCisKKwlwbWljOiBwZnV6ZTIwMEAwOCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHBmdXplMjAwIjsKKwkJcmVnID0gPDB4MDg+OworCisJCXJlZ3VsYXRvcnMgeworCQkJc3cxYV9yZWc6IHN3MWFiIHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwzMDAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDE4NzUwMDA+OworCQkJCXJlZ3VsYXRvci1ib290LW9uOworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQkJcmVndWxhdG9yLXJhbXAtZGVsYXkgPSA8NjI1MD47CisJCQl9OworCisJCQlzdzJfcmVnOiBzdzIgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDgwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MzMwMDAwMD47CisJCQkJcmVndWxhdG9yLWJvb3Qtb247CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCX07CisKKwkJCXN3M2FfcmVnOiBzdzNhIHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw0MDAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDE5NzUwMDA+OworCQkJCXJlZ3VsYXRvci1ib290LW9uOworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQl9OworCisJCQlzdzNiX3JlZzogc3czYiB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8NDAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwxOTc1MDAwPjsKKwkJCQlyZWd1bGF0b3ItYm9vdC1vbjsKKwkJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOworCQkJfTsKKworCQkJc3dic3RfcmVnOiBzd2JzdCB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8NTAwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8NTE1MDAwMD47CisJCQl9OworCisJCQlzbnZzX3JlZzogdnNudnMgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDEwMDAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDMwMDAwMDA+OworCQkJCXJlZ3VsYXRvci1ib290LW9uOworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQl9OworCisJCQl2cmVmX3JlZzogdnJlZmRkciB7CisJCQkJcmVndWxhdG9yLWJvb3Qtb247CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCX07CisKKwkJCXZnZW4xX3JlZzogdmdlbjEgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDgwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTU1MDAwMD47CisJCQl9OworCisJCQl2Z2VuMl9yZWc6IHZnZW4yIHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw4MDAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDE1NTAwMDA+OworCQkJfTsKKworCQkJdmdlbjNfcmVnOiB2Z2VuMyB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MTgwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MzMwMDAwMD47CisJCQl9OworCisJCQl2Z2VuNF9yZWc6IHZnZW40IHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwxODAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwzMzAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOworCQkJfTsKKworCQkJdmdlbjVfcmVnOiB2Z2VuNSB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MTgwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MzMwMDAwMD47CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCX07CisKKwkJCXZnZW42X3JlZzogdmdlbjYgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDE4MDAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDMzMDAwMDA+OworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQl9OworCQl9OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3M1bTg3NjctcmVndWxhdG9yLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvczVtODc2Ny1yZWd1bGF0b3IudHh0CmluZGV4IGZjNmIzOGYuLmQyOTA5ODggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvczVtODc2Ny1yZWd1bGF0b3IudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvczVtODc2Ny1yZWd1bGF0b3IudHh0CkBAIC02OSwxMyArNjksMTYgQEAKIAkJfTsKIAl9OwogVGhlIGFib3ZlIHJlZ3VsYXRvciBlbnRyaWVzIGFyZSBkZWZpbmVkIGluIHJlZ3VsYXRvciBiaW5kaW5ncyBkb2N1bWVudGF0aW9uCi1leGNlcHQgb3BfbW9kZSBkZXNjcmlwdGlvbi4KK2V4Y2VwdCB0aGVzZSBwcm9wZXJ0aWVzOgogCS0gb3BfbW9kZTogZGVzY3JpYmVzIHRoZSBkaWZmZXJlbnQgb3BlcmF0aW5nIG1vZGVzIG9mIHRoZSBMRE8ncyB3aXRoCiAJCXBvd2VyIG1vZGUgY2hhbmdlIGluIFNPQy4gVGhlIGRpZmZlcmVudCBwb3NzaWJsZSB2YWx1ZXMgYXJlLAogCQkwIC0gYWx3YXlzIG9mZiBtb2RlCiAJCTEgLSBvbiBpbiBub3JtYWwgbW9kZQogCQkyIC0gbG93IHBvd2VyIG1vZGUKIAkJMyAtIHN1c3BlbmQgbW9kZQorCS0gczVtODc2NyxwbWljLWV4dC1jb250cm9sLWdwaW9zOiAob3B0aW9uYWwpIEdQSU8gc3BlY2lmaWVyIGZvciBvbmUKKwkJR1BJTyBjb250cm9sbGluZyB0aGlzIHJlZ3VsYXRvciAoZW5hYmxlL2Rpc2FibGUpOyBUaGlzIGlzCisJCXZhbGlkIG9ubHkgZm9yIGJ1Y2s5LgogCiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbmFtZXMgb2YgdGhlIHJlZ3VsYXRvcnMgdGhhdCB0aGUgczVtODc2NyBwbWljIGJsb2NrCiBzdXBwb3J0cy4gTm90ZTogVGhlICduJyBpbiBMRE9uIGFuZCBCVUNLbiByZXByZXNlbnRzIHRoZSBMRE8gb3IgQlVDSyBudW1iZXIKQEAgLTE0OCw1ICsxNTEsMTMgQEAKIAkJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOwogCQkJCXJlZ3VsYXRvci1ib290LW9uOwogCQkJfTsKKworCQkJdmVtbWNfcmVnOiBCVUNLOSB7CisJCQkJcmVndWxhdG9yLW5hbWUgPSAiVk1FTV9WRERfMi44ViI7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MjgwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MjgwMDAwMD47CisJCQkJb3BfbW9kZSA9IDwzPjsgLyogU3RhbmRieSBNb2RlICovCisJCQkJczVtODc2NyxwbWljLWV4dC1jb250cm9sLWdwaW9zID0gPCZncGswIDIgMD47CisJCQl9OwogCQl9OwogCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3RpLWFiYi1yZWd1bGF0b3IudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci90aS1hYmItcmVndWxhdG9yLnR4dAppbmRleCAyZTU3YTMzLi5jNThkYjc1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3RpLWFiYi1yZWd1bGF0b3IudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvdGktYWJiLXJlZ3VsYXRvci50eHQKQEAgLTQsMTAgKzQsMTQgQEAKIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZjoKICAgLSAidGksYWJiLXYxIiBmb3Igb2xkZXIgU29DcyBsaWtlIE9NQVAzCiAgIC0gInRpLGFiYi12MiIgZm9yIG5ld2VyIFNvQ3MgbGlrZSBPTUFQNCwgT01BUDUKKyAgLSAidGksYWJiLXYzIiBmb3IgYSBnZW5lcmljIGRlZmluaXRpb24gd2hlcmUgc2V0dXAgYW5kIGNvbnRyb2wgcmVnaXN0ZXJzIGFyZQorICAgICBwcm92aWRlZCAoZXhhbXBsZTogRFJBNykKIC0gcmVnOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZS4gSXQgY29udGFpbnMKICAgdGhlIGluZm9ybWF0aW9uIG9mIHJlZ2lzdGVycyBpbiB0aGUgc2FtZSBvcmRlciBhcyBkZXNjcmliZWQgYnkgcmVnLW5hbWVzCiAtIHJlZy1uYW1lczogU2hvdWxkIGNvbnRhaW4gdGhlIHJlZyBuYW1lcwotICAtICJiYXNlLWFkZHJlc3MiCS0gY29udGFpbnMgYmFzZSBhZGRyZXNzIG9mIEFCQiBtb2R1bGUKKyAgLSAiYmFzZS1hZGRyZXNzIgktIGNvbnRhaW5zIGJhc2UgYWRkcmVzcyBvZiBBQkIgbW9kdWxlICh0aSxhYmItdjEsdGksYWJiLXYyKQorICAtICJjb250cm9sLWFkZHJlc3MiCS0gY29udGFpbnMgY29udHJvbCByZWdpc3RlciBhZGRyZXNzIG9mIEFCQiBtb2R1bGUgKHRpLGFiYi12MykKKyAgLSAic2V0dXAtYWRkcmVzcyIJLSBjb250YWlucyBzZXR1cCByZWdpc3RlciBhZGRyZXNzIG9mIEFCQiBtb2R1bGUgKHRpLGFiYi12MykKICAgLSAiaW50LWFkZHJlc3MiCS0gY29udGFpbnMgYWRkcmVzcyBvZiBpbnRlcnJ1cHQgcmVnaXN0ZXIgZm9yIEFCQiBtb2R1bGUKICAgKGFsc28gc2VlIE9wdGlvbmFsIHByb3BlcnRpZXMpCiAtICNhZGRyZXNzLWNlbGw6IHNob3VsZCBiZSAwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL2VmbTMyLXVhcnQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC9lZm0zMi11YXJ0LnR4dAppbmRleCA4ZTA4MGI4Li4xOTg0YmRmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL2VmbTMyLXVhcnQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvZWZtMzItdWFydC50eHQKQEAgLTYsNyArNiw3IEBACiAtIGludGVycnVwdHMgOiBTaG91bGQgY29udGFpbiB1YXJ0IGludGVycnVwdAogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgotLSBsb2NhdGlvbiA6IERlY2lkZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBVU0FSVCBJL08gcGlucy4KKy0gZWZtMzIsbG9jYXRpb24gOiBEZWNpZGVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgVVNBUlQgSS9PIHBpbnMuCiAgIEFsbG93ZWQgcmFuZ2UgOiBbMCAuLiA1XQogICBEZWZhdWx0OiAwCiAKQEAgLTE2LDUgKzE2LDUgQEAKIAljb21wYXRpYmxlID0gImVmbTMyLHVhcnQiOwogCXJlZyA9IDwweDQwMDBjNDAwIDB4NDAwPjsKIAlpbnRlcnJ1cHRzID0gPDE1PjsKLQlsb2NhdGlvbiA9IDwwPjsKKwllZm0zMixsb2NhdGlvbiA9IDwwPjsKIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL2ZzbC1scHVhcnQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC9mc2wtbHB1YXJ0LnR4dAppbmRleCA2ZmQxZGQxLi5hMWQxMjA1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL2ZzbC1scHVhcnQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvZnNsLWxwdWFydC50eHQKQEAgLTQsMTEgKzQsMjQgQEAKIC0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAiZnNsLDxzb2M+LWxwdWFydCIKIC0gcmVnIDogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UKIC0gaW50ZXJydXB0cyA6IFNob3VsZCBjb250YWluIHVhcnQgaW50ZXJydXB0CistIGNsb2NrcyA6IHBoYW5kbGUgKyBjbG9jayBzcGVjaWZpZXIgcGFpcnMsIG9uZSBmb3IgZWFjaCBlbnRyeSBpbiBjbG9jay1uYW1lcworLSBjbG9jay1uYW1lcyA6IHNob3VsZCBjb250YWluOiAiaXBnIiAtIHRoZSB1YXJ0IGNsb2NrCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGRtYXM6IEEgbGlzdCBvZiB0d28gZG1hIHNwZWNpZmllcnMsIG9uZSBmb3IgZWFjaCBlbnRyeSBpbiBkbWEtbmFtZXMuCistIGRtYS1uYW1lczogc2hvdWxkIGNvbnRhaW4gInR4IiBhbmQgInJ4Ii4KKworTm90ZTogT3B0aW9uYWwgcHJvcGVydGllcyBmb3IgRE1BIHN1cHBvcnQuIFdyaXRlIHRoZW0gYm90aCBvciBib3RoIG5vdC4KIAogRXhhbXBsZToKIAogdWFydDA6IHNlcmlhbEA0MDAyNzAwMCB7Ci0JICAgICAgIGNvbXBhdGlibGUgPSAiZnNsLHZmNjEwLWxwdWFydCI7Ci0JICAgICAgIHJlZyA9IDwweDQwMDI3MDAwIDB4MTAwMD47Ci0JICAgICAgIGludGVycnVwdHMgPSA8MCA2MSAweDAwPjsKLSAgICAgICB9OworCQljb21wYXRpYmxlID0gImZzbCx2ZjYxMC1scHVhcnQiOworCQlyZWcgPSA8MHg0MDAyNzAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDAgNjEgMHgwMD47CisJCWNsb2NrcyA9IDwmY2xrcyBWRjYxMF9DTEtfVUFSVDA+OworCQljbG9jay1uYW1lcyA9ICJpcGciOworCQlkbWFzID0gPCZlZG1hMCAwIDI+LAorCQkJPCZlZG1hMCAwIDM+OworCQlkbWEtbmFtZXMgPSAicngiLCJ0eCI7CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvbWF4aW0sbWF4MzEweC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL21heGltLG1heDMxMHgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYTkxOWMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL21heGltLG1heDMxMHgudHh0CkBAIC0wLDAgKzEsMzYgQEAKKyogTWF4aW0gTUFYMzEwWCBhZHZhbmNlZCBVbml2ZXJzYWwgQXN5bmNocm9ub3VzIFJlY2VpdmVyLVRyYW5zbWl0dGVyIChVQVJUKQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgIC0gIm1heGltLG1heDMxMDciIGZvciBNYXhpbSBNQVgzMTA3LAorICAtICJtYXhpbSxtYXgzMTA4IiBmb3IgTWF4aW0gTUFYMzEwOCwKKyAgLSAibWF4aW0sbWF4MzEwOSIgZm9yIE1heGltIE1BWDMxMDksCisgIC0gIm1heGltLG1heDE0ODMwIiBmb3IgTWF4aW0gTUFYMTQ4MzAuCistIHJlZzogU1BJIGNoaXAgc2VsZWN0IG51bWJlci4KKy0gaW50ZXJydXB0LXBhcmVudDogVGhlIHBoYW5kbGUgZm9yIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciB0aGF0CisgIHNlcnZpY2VzIGludGVycnVwdHMgZm9yIHRoaXMgSUMuCistIGludGVycnVwdHM6IFNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSBvZiB0aGUgcGFyZW50IGludGVycnVwdAorICBjb250cm9sbGVyLiBUaGUgZm9ybWF0IG9mIHRoZSBpbnRlcnJ1cHQgc3BlY2lmaWVyIGRlcGVuZHMgb24gdGhlCisgIHBhcmVudCBpbnRlcnJ1cHQgY29udHJvbGxlci4KKy0gY2xvY2tzOiBwaGFuZGxlIHRvIHRoZSBJQyBzb3VyY2UgY2xvY2suCistIGNsb2NrLW5hbWVzOiBTaG91bGQgYmUgInh0YWwiIGlmIGNsb2NrIGlzIGFuIGV4dGVybmFsIGNyeXN0YWwgb3IKKyAgIm9zYyIgaWYgYW4gZXh0ZXJuYWwgY2xvY2sgc291cmNlIGlzIHVzZWQuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGdwaW8tY29udHJvbGxlcjogTWFya3MgdGhlIGRldmljZSBub2RlIGFzIGEgR1BJTyBjb250cm9sbGVyLgorLSAjZ3Bpby1jZWxsczogU2hvdWxkIGJlIHR3by4gVGhlIGZpcnN0IGNlbGwgaXMgdGhlIEdQSU8gbnVtYmVyIGFuZAorICB0aGUgc2Vjb25kIGNlbGwgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBHUElPIHBvbGFyaXR5OgorICAgIDAgPSBhY3RpdmUgaGlnaCwKKyAgICAxID0gYWN0aXZlIGxvdy4KKworRXhhbXBsZToKKwltYXgxNDgzMDogbWF4MTQ4MzBAMCB7CisJCWNvbXBhdGlibGUgPSAibWF4aW0sbWF4MTQ4MzAiOworCQlyZWcgPSA8MD47CisJCWNsb2NrcyA9IDwmY2xrMjBtPjsKKwkJY2xvY2stbmFtZXMgPSAib3NjIjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ3BpbzM+OworCQlpbnRlcnJ1cHRzID0gPDcgSVJRX1RZUEVfRURHRV9GQUxMSU5HPjsKKwkJZ3Bpby1jb250cm9sbGVyOworCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC9yZW5lc2FzLHNjaS1zZXJpYWwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC9yZW5lc2FzLHNjaS1zZXJpYWwudHh0CmluZGV4IGYzNzJjZjIuLjUzZTZjMTcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvcmVuZXNhcyxzY2ktc2VyaWFsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL3JlbmVzYXMsc2NpLXNlcmlhbC50eHQKQEAgLTM3LDcgKzM3LDcgQEAKIAl9OwogCiAJc2NpZmEwOiBzZXJpYWxAZTZjNDAwMDAgewotCQljb21wYXRpYmxlID0gInJlbmVzYXMsc2NpZmEtcjhhNzc5MCIsICJyZW5lc2FzLHNjaWZhLWdlbmVyaWMiOworCQljb21wYXRpYmxlID0gInJlbmVzYXMsc2NpZmEtcjhhNzc5MCIsICJyZW5lc2FzLHNjaWZhIjsKIAkJcmVnID0gPDAgMHhlNmM0MDAwMCAwIDY0PjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAkJaW50ZXJydXB0cyA9IDwwIDE0NCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9hcm1hZGEtMzcwZGItYXVkaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2FybWFkYS0zNzBkYi1hdWRpby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY5ODRkMjM4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2FybWFkYS0zNzBkYi1hdWRpby50eHQKQEAgLTAsMCArMSwyNyBAQAorRGV2aWNlIFRyZWUgYmluZGluZ3MgZm9yIHRoZSBBcm1hZGEgMzcwIERCIGF1ZGlvCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlc2UgRGV2aWNlIFRyZWUgYmluZGluZ3MgYXJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGF1ZGlvIGNvbXBsZXgKK2ZvdW5kIG9uIHRoZSBBcm1hZGEgMzcwIERCIHBsYXRmb3JtLgorCitNYW5kYXRvcnkgcHJvcGVydGllczoKKworICogY29tcGF0aWJsZTogbXVzdCBiZSAibWFydmVsbCxhMzcwZGItYXVkaW8iCisKKyAqIG1hcnZlbGwsYXVkaW8tY29udHJvbGxlcjogYSBwaGFuZGxlIHRoYXQgcG9pbnRzIHRvIHRoZSBhdWRpbworICAgY29udHJvbGxlciBvZiB0aGUgQXJtYWRhIDM3MCBTb0MuCisKKyAqIG1hcnZlbGwsYXVkaW8tY29kZWM6IGEgc2V0IG9mIHRocmVlIHBoYW5kbGVzIHRoYXQgcG9pbnRzIHRvOgorCisgICAgMS8gdGhlIGFuYWxvZyBhdWRpbyBjb2RlYyBjb25uZWN0ZWQgdG8gdGhlIEFybWFkYSAzNzAgU29DCisgICAgMi8gdGhlIFMvUERJRiB0cmFuc2NlaXZlcgorICAgIDMvIHRoZSBTL1BESUYgcmVjZWl2ZXIKKworRXhhbXBsZToKKworCXNvdW5kIHsKKwkgICAgICBjb21wYXRpYmxlID0gIm1hcnZlbGwsYTM3MGRiLWF1ZGlvIjsKKwkgICAgICBtYXJ2ZWxsLGF1ZGlvLWNvbnRyb2xsZXIgPSA8JmF1ZGlvX2NvbnRyb2xsZXI+OworCSAgICAgIG1hcnZlbGwsYXVkaW8tY29kZWMgPSA8JmF1ZGlvX2NvZGVjICZzcGRpZl9vdXQgJnNwZGlmX2luPjsKKwkgICAgICBzdGF0dXMgPSAib2theSI7CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9jczQyeHg4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9jczQyeHg4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjMxZmJjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2NzNDJ4eDgudHh0CkBAIC0wLDAgKzEsMjggQEAKK0NTNDI0NDgvQ1M0Mjg4OCBhdWRpbyBDT0RFQworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgIC0gY29tcGF0aWJsZSA6IG11c3QgY29udGFpbiBvbmUgb2YgImNpcnJ1cyxjczQyNDQ4IiBhbmQgImNpcnJ1cyxjczQyODg4IgorCisgIC0gcmVnIDogdGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgZm9yIEkyQworCisgIC0gY2xvY2tzIDogYSBsaXN0IG9mIHBoYW5kbGVzICsgY2xvY2stc3BlY2lmaWVycywgb25lIGZvciBlYWNoIGVudHJ5IGluCisgICAgY2xvY2stbmFtZXMKKworICAtIGNsb2NrLW5hbWVzIDogbXVzdCBjb250YWluICJtY2xrIgorCisgIC0gVkEtc3VwcGx5LCBWRC1zdXBwbHksIFZMUy1zdXBwbHksIFZMQy1zdXBwbHk6IHBvd2VyIHN1cHBsaWVzIGZvciB0aGUgZGV2aWNlLAorICAgIGFzIGNvdmVyZWQgaW4gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9yZWd1bGF0b3IudHh0CisKK0V4YW1wbGU6CisKK2NvZGVjOiBjczQyODg4QDQ4IHsKKwljb21wYXRpYmxlID0gImNpcnJ1cyxjczQyODg4IjsKKwlyZWcgPSA8MHg0OD47CisJY2xvY2tzID0gPCZjb2RlY19tY2xrIDA+OworCWNsb2NrLW5hbWVzID0gIm1jbGsiOworCVZBLXN1cHBseSA9IDwmcmVnX2F1ZGlvPjsKKwlWRC1zdXBwbHkgPSA8JnJlZ19hdWRpbz47CisJVkxTLXN1cHBseSA9IDwmcmVnX2F1ZGlvPjsKKwlWTEMtc3VwcGx5ID0gPCZyZWdfYXVkaW8+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9kYTkwNTUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2RhOTA1NS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQxYjdjYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9kYTkwNTUudHh0CkBAIC0wLDAgKzEsMjIgQEAKKyogRGlhbG9nIERBOTA1NSBBdWRpbyBDT0RFQworCitEQTkwNTUgcHJvdmlkZXMgQXVkaW8gQ09ERUMgc3VwcG9ydCAoSTJDIG9ubHkpLgorCitUaGUgQXVkaW8gQ09ERUMgZGV2aWNlIGluIERBOTA1NSBoYXMgaXQncyBvd24gSTJDIGFkZHJlc3Mgd2hpY2ggaXMgY29uZmlndXJhYmxlLAorc28gdGhlIGRldmljZSBpcyBpbnN0YW50aWF0ZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBQTUlDIChNRkQpIGRldmljZS4KKworRm9yIGRldGFpbHMgb24gYWNjb21wYW55aW5nIFBNSUMgSTJDIGRldmljZSwgc2VlIHRoZSBmb2xsb3dpbmc6CitEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL2RhOTA1NS50eHQKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworICAtIGNvbXBhdGlibGU6ICJkbGcsZGE5MDU1LWNvZGVjIgorICAtIHJlZzogU3BlY2lmaWVzIHRoZSBJMkMgc2xhdmUgYWRkcmVzcworCisKK0V4YW1wbGU6CisKKwljb2RlYzogZGE5MDU1LWNvZGVjQDFhIHsKKwkJY29tcGF0aWJsZSA9ICJkbGcsZGE5MDU1LWNvZGVjIjsKKwkJcmVnID0gPDB4MWE+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvZGF2aW5jaS1ldm0tYXVkaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2RhdmluY2ktZXZtLWF1ZGlvLnR4dAppbmRleCA4NjUxNzhkLi45NjNlMTAwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvZGF2aW5jaS1ldm0tYXVkaW8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9kYXZpbmNpLWV2bS1hdWRpby50eHQKQEAgLTUsMTIgKzUsMTkgQEAKIC0gdGksbW9kZWwgOiBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhpcyBzb3VuZCBjb21wbGV4LgogLSB0aSxhdWRpby1jb2RlYyA6IFRoZSBwaGFuZGxlIG9mIHRoZSBUTFYzMjBBSUMzeCBhdWRpbyBjb2RlYwogLSB0aSxtY2FzcC1jb250cm9sbGVyIDogVGhlIHBoYW5kbGUgb2YgdGhlIE1jQVNQIGNvbnRyb2xsZXIKLS0gdGksY29kZWMtY2xvY2stcmF0ZSA6IFRoZSBDb2RlYyBDbG9jayByYXRlIChpbiBIeikgYXBwbGllZCB0byB0aGUgQ29kZWMKIC0gdGksYXVkaW8tcm91dGluZyA6IEEgbGlzdCBvZiB0aGUgY29ubmVjdGlvbnMgYmV0d2VlbiBhdWRpbyBjb21wb25lbnRzLgogICBFYWNoIGVudHJ5IGlzIGEgcGFpciBvZiBzdHJpbmdzLCB0aGUgZmlyc3QgYmVpbmcgdGhlIGNvbm5lY3Rpb24ncyBzaW5rLAogICB0aGUgc2Vjb25kIGJlaW5nIHRoZSBjb25uZWN0aW9uJ3Mgc291cmNlLiBWYWxpZCBuYW1lcyBmb3Igc291cmNlcyBhbmQKICAgc2lua3MgYXJlIHRoZSBjb2RlYydzIHBpbnMsIGFuZCB0aGUgamFja3Mgb24gdGhlIGJvYXJkOgogCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSB0aSxjb2RlYy1jbG9jay1yYXRlIDogVGhlIENvZGVjIENsb2NrIHJhdGUgKGluIEh6KSBhcHBsaWVkIHRvIHRoZSBDb2RlYy4KKy0gY2xvY2tzIDogUmVmZXJlbmNlIHRvIHRoZSBtYXN0ZXIgY2xvY2sKKy0gY2xvY2stbmFtZXMgOiBUaGUgY2xvY2sgc2hvdWxkIGJlIG5hbWVkICJtY2xrIgorLSBFaXRoZXIgY29kZWMtY2xvY2stcmF0ZSBvciB0aGUgY29kZWMtY2xvY2sgcmVmZXJlbmNlIGhhcyB0byBiZSBkZWZpbmVkLiBJZgorICB0aGUgYm90aCBhcmUgZGVmaW5lZCB0aGUgZHJpdmVyIGF0dGVtcHRzIHRvIHNldCByZWZlcmVuY2VkIGNsb2NrIHRvIHRoZQorICBkZWZpbmVkIHJhdGUgYW5kIHRha2VzIHRoZSByYXRlIGZyb20gdGhlIGNsb2NrIHJlZmVyZW5jZS4KKwogICBCb2FyZCBjb25uZWN0b3JzOgogCiAgICogSGVhZHBob25lIEphY2sKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9ldWtyZWEtdGx2MzIwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9ldWtyZWEtdGx2MzIwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDc5ODVjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2V1a3JlYS10bHYzMjAudHh0CkBAIC0wLDAgKzEsMjEgQEAKK0F1ZGlvIGNvbXBsZXggZm9yIEV1a3JlYSBib2FyZHMgd2l0aCB0bHYzMjBhaWMyMyBjb2RlYy4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6ICJldWtyZWEsYXNvYy10bHYzMjAiCistIGV1a3JlYSxtb2RlbCA6IFRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGlzIHNvdW5kIGNvbXBsZXguCistIHNzaS1jb250cm9sbGVyIDogVGhlIHBoYW5kbGUgb2YgdGhlIFNTSSBjb250cm9sbGVyLgorLSBmc2wsbXV4LWludC1wb3J0IDogVGhlIGludGVybmFsIHBvcnQgb2YgdGhlIGkuTVggYXVkaW8gbXV4ZXIgKEFVRE1VWCkuCistIGZzbCxtdXgtZXh0LXBvcnQgOiBUaGUgZXh0ZXJuYWwgcG9ydCBvZiB0aGUgaS5NWCBhdWRpbyBtdXhlci4KKworTm90ZTogVGhlIEFVRE1VWCBwb3J0IG51bWJlcmluZyBzaG91bGQgc3RhcnQgYXQgMSwgd2hpY2ggaXMgY29uc2lzdGVudCB3aXRoCitoYXJkd2FyZSBtYW51YWwuCisKK0V4YW1wbGU6CisKKwlzb3VuZCB7CisJCWNvbXBhdGlibGUgPSAiZXVrcmVhLGFzb2MtdGx2MzIwIjsKKwkJZXVrcmVhLG1vZGVsID0gImlteDUxLWV1a3JlYS10bHYzMjBhaWMyMyI7CisJCXNzaS1jb250cm9sbGVyID0gPCZzc2kyPjsKKwkJZnNsLG11eC1pbnQtcG9ydCA9IDwyPjsKKwkJZnNsLG11eC1leHQtcG9ydCA9IDwzPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2ZzbCxlc2FpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9mc2wsZXNhaS50eHQKaW5kZXggZDdiOTlmYS4uYWViOGM0YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2ZzbCxlc2FpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvZnNsLGVzYWkudHh0CkBAIC0zNCw2ICszNCwxMCBAQAogICAgIHRoYXQgRVNBSSB3b3VsZCB3b3JrIGluIHRoZSBzeW5jaHJvbm91cyBtb2RlLCB3aGljaCBtZWFucyBhbGwgdGhlIHNldHRpbmdzCiAgICAgZm9yIFJlY2VpdmluZyB3b3VsZCBiZSBkdXBsaWNhdGVkIGZyb20gVHJhbnNtaXRpb24gcmVsYXRlZCByZWdpc3RlcnMuCiAKKyAgLSBiaWctZW5kaWFuIDogSWYgdGhpcyBwcm9wZXJ0eSBpcyBhYnNlbnQsIHRoZSBuYXRpdmUgZW5kaWFuIG1vZGUgd2lsbAorICAgIGJlIGluIHVzZSBhcyBkZWZhdWx0LCBvciB0aGUgYmlnIGVuZGlhbiBtb2RlIHdpbGwgYmUgaW4gdXNlIGZvciBhbGwgdGhlCisgICAgZGV2aWNlIHJlZ2lzdGVycy4KKwogRXhhbXBsZToKIAogZXNhaTogZXNhaUAwMjAyNDAwMCB7CkBAIC00Niw1ICs1MCw2IEBACiAJZG1hLW5hbWVzID0gInJ4IiwgInR4IjsKIAlmc2wsZmlmby1kZXB0aCA9IDwxMjg+OwogCWZzbCxlc2FpLXN5bmNocm9ub3VzOworCWJpZy1lbmRpYW47CiAJc3RhdHVzID0gImRpc2FibGVkIjsKIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvZnNsLHNwZGlmLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9mc2wsc3BkaWYudHh0CmluZGV4IGYyYWUzMzUuLjNlOWU4MmM4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvZnNsLHNwZGlmLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvZnNsLHNwZGlmLnR4dApAQCAtMjksNiArMjksMTAgQEAKIAkJCWNhbiBhbHNvIGJlIHJlZmVycmVkIHRvIFR4Q2xrX1NvdXJjZQogCQkJYml0IG9mIHJlZ2lzdGVyIFNQRElGX1NUQy4KIAorICAgLSBiaWctZW5kaWFuIDogSWYgdGhpcyBwcm9wZXJ0eSBpcyBhYnNlbnQsIHRoZSBuYXRpdmUgZW5kaWFuIG1vZGUgd2lsbAorICAgYmUgaW4gdXNlIGFzIGRlZmF1bHQsIG9yIHRoZSBiaWcgZW5kaWFuIG1vZGUgd2lsbCBiZSBpbiB1c2UgZm9yIGFsbCB0aGUKKyAgIGRldmljZSByZWdpc3RlcnMuCisKIEV4YW1wbGU6CiAKIHNwZGlmOiBzcGRpZkAwMjAwNDAwMCB7CkBAIC01MCw1ICs1NCw2IEBACiAJCSJyeHR4NSIsICJyeHR4NiIsCiAJCSJyeHR4NyI7CiAKKwliaWctZW5kaWFuOwogCXN0YXR1cyA9ICJva2F5IjsKIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvbXZlYnUtYXVkaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL212ZWJ1LWF1ZGlvLnR4dAppbmRleCBmMDA2MmM1Li5jYjhjMDdjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvbXZlYnUtYXVkaW8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9tdmVidS1hdWRpby50eHQKQEAgLTUsNiArNSw3IEBACiAtIGNvbXBhdGlibGU6CiAgICJtYXJ2ZWxsLGtpcmt3b29kLWF1ZGlvIiBmb3IgS2lya3dvb2QgcGxhdGZvcm1zCiAgICJtYXJ2ZWxsLGRvdmUtYXVkaW8iIGZvciBEb3ZlIHBsYXRmb3JtcworICAibWFydmVsbCxhcm1hZGEzNzAtYXVkaW8iIGZvciBBcm1hZGEgMzcwIHBsYXRmb3JtcwogCiAtIHJlZzogcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBjb250cm9sbGVyIGFuZCBsZW5ndGggb2YgbWVtb3J5IG1hcHBlZAogICByZWdpb24uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcGNtNTEyeC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcGNtNTEyeC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmZjc1ZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9wY201MTJ4LnR4dApAQCAtMCwwICsxLDMwIEBACitQQ001MTJ4IGF1ZGlvIENPREVDcworCitUaGVzZSBkZXZpY2VzIHN1cHBvcnQgYm90aCBJMkMgYW5kIFNQSSAoY29uZmlndXJlZCB3aXRoIHBpbiBzdHJhcHBpbmcKK29uIHRoZSBib2FyZCkuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAgLSBjb21wYXRpYmxlIDogT25lIG9mICJ0aSxwY201MTIxIiBvciAidGkscGNtNTEyMiIKKworICAtIHJlZyA6IHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGZvciBJMkMsIHRoZSBjaGlwIHNlbGVjdAorICAgICAgICAgIG51bWJlciBmb3IgU1BJLgorCisgIC0gQVZERC1zdXBwbHksIERWREQtc3VwcGx5LCBhbmQgQ1BWREQtc3VwcGx5IDogcG93ZXIgc3VwcGxpZXMgZm9yIHRoZQorICAgIGRldmljZSwgYXMgY292ZXJlZCBpbiBiaW5kaW5ncy9yZWd1bGF0b3IvcmVndWxhdG9yLnR4dAorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCisgIC0gY2xvY2tzIDogQSBjbG9jayBzcGVjaWZpZXIgZm9yIHRoZSBjbG9jayBjb25uZWN0ZWQgYXMgU0NMSy4gIElmIHRoaXMKKyAgICBpcyBhYnNlbnQgdGhlIGRldmljZSB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gY2xvY2sgZnJvbSBCQ0xLLgorCitFeGFtcGxlOgorCisJcGNtNTEyMjogcGNtNTEyMkA0YyB7CisJCWNvbXBhdGlibGUgPSAidGkscGNtNTEyMiI7CisJCXJlZyA9IDwweDRjPjsKKworCQlBVkRELXN1cHBseSA9IDwmcmVnXzN2M19hbmFsb2c+OworCQlEVkRELXN1cHBseSA9IDwmcmVnXzF2OD47CisJCUNQVkRELXN1cHBseSA9IDwmcmVnXzN2Mz47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9yZW5lc2FzLHJzbmQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3JlbmVzYXMscnNuZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0ZTkxNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9yZW5lc2FzLHJzbmQudHh0CkBAIC0wLDAgKzEsMTA1IEBACitSZW5lc2FzIFItQ2FyIHNvdW5kCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUJCQk6ICJyZW5lc2FzLHJjYXJfc291bmQtZ2VuMSIgaWYgZ2VuZXJhdGlvbjEKKwkJCQkgICJyZW5lc2FzLHJjYXJfc291bmQtZ2VuMiIgaWYgZ2VuZXJhdGlvbjIKKy0gcmVnCQkJCTogU2hvdWxkIGNvbnRhaW4gdGhlIHJlZ2lzdGVyIHBoeXNpY2FsIGFkZHJlc3MuCisJCQkJICByZXF1aXJlZCByZWdpc3RlciBpcworCQkJCSAgIFNSVS9BREcvU1NJICAgICAgaWYgZ2VuZXJhdGlvbjEKKwkJCQkgICBTUlUvQURHL1NTSVUvU1NJIGlmIGdlbmVyYXRpb24yCistIHJjYXJfc291bmQsc3NpCQk6IFNob3VsZCBjb250YWluIFNTSSBmZWF0dXJlLgorCQkJCSAgVGhlIG51bWJlciBvZiBTU0kgc3Vibm9kZSBzaG91bGQgYmUgc2FtZSBhcyBIVy4KKwkJCQkgIHNlZSBiZWxvdyBmb3IgZGV0YWlsLgorLSByY2FyX3NvdW5kLHNyYwkJOiBTaG91bGQgY29udGFpbiBTUkMgZmVhdHVyZS4KKwkJCQkgIFRoZSBudW1iZXIgb2YgU1JDIHN1Ym5vZGUgc2hvdWxkIGJlIHNhbWUgYXMgSFcuCisJCQkJICBzZWUgYmVsb3cgZm9yIGRldGFpbC4KKy0gcmNhcl9zb3VuZCxkYWkJCTogREFJIGNvbnRlbnRzLgorCQkJCSAgVGhlIG51bWJlciBvZiBEQUkgc3Vibm9kZSBzaG91bGQgYmUgc2FtZSBhcyBIVy4KKwkJCQkgIHNlZSBiZWxvdyBmb3IgZGV0YWlsLgorCitTU0kgc3Vibm9kZSBwcm9wZXJ0aWVzOgorLSBpbnRlcnJ1cHRzCQkJOiBTaG91bGQgY29udGFpbiBTU0kgaW50ZXJydXB0IGZvciBQSU8gdHJhbnNmZXIKKy0gc2hhcmVkLXBpbgkJCTogaWYgc2hhcmVkIGNsb2NrIHBpbgorCitTUkMgc3Vibm9kZSBwcm9wZXJ0aWVzOgorbm8gcHJvcGVydGllcyBhdCB0aGlzIHBvaW50CisKK0RBSSBzdWJub2RlIHByb3BlcnRpZXM6CistIHBsYXliYWNrCQkJOiBsaXN0IG9mIHBsYXliYWNrIG1vZHVsZXMKKy0gY2FwdHVyZQkJCTogbGlzdCBvZiBjYXB0dXJlICBtb2R1bGVzCisKK0V4YW1wbGU6CisKK3JjYXJfc291bmQ6IHJjYXJfc291bmRAMHhmZmQ5MDAwMCB7CisJI3NvdW5kLWRhaS1jZWxscyA9IDwxPjsKKwljb21wYXRpYmxlID0gInJlbmVzYXMscmNhcl9zb3VuZC1nZW4yIjsKKwlyZWcgPQk8MCAweGVjNTAwMDAwIDAgMHgxMDAwPiwgLyogU0NVICovCisJCTwwIDB4ZWM1YTAwMDAgMCAweDEwMD4sICAvKiBBREcgKi8KKwkJPDAgMHhlYzU0MDAwMCAwIDB4MTAwMD4sIC8qIFNTSVUgKi8KKwkJPDAgMHhlYzU0MTAwMCAwIDB4MTI4MD47IC8qIFNTSSAqLworCisJcmNhcl9zb3VuZCxzcmMgeworCQlzcmMwOiBzcmNAMCB7IH07CisJCXNyYzE6IHNyY0AxIHsgfTsKKwkJc3JjMjogc3JjQDIgeyB9OworCQlzcmMzOiBzcmNAMyB7IH07CisJCXNyYzQ6IHNyY0A0IHsgfTsKKwkJc3JjNTogc3JjQDUgeyB9OworCQlzcmM2OiBzcmNANiB7IH07CisJCXNyYzc6IHNyY0A3IHsgfTsKKwkJc3JjODogc3JjQDggeyB9OworCQlzcmM5OiBzcmNAOSB7IH07CisJfTsKKworCXJjYXJfc291bmQsc3NpIHsKKwkJc3NpMDogc3NpQDAgeworCQkJaW50ZXJydXB0cyA9IDwwIDM3MCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJfTsKKwkJc3NpMTogc3NpQDEgeworCQkJaW50ZXJydXB0cyA9IDwwIDM3MSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJfTsKKwkJc3NpMjogc3NpQDIgeworCQkJaW50ZXJydXB0cyA9IDwwIDM3MiBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJfTsKKwkJc3NpMzogc3NpQDMgeworCQkJaW50ZXJydXB0cyA9IDwwIDM3MyBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJfTsKKwkJc3NpNDogc3NpQDQgeworCQkJaW50ZXJydXB0cyA9IDwwIDM3NCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJfTsKKwkJc3NpNTogc3NpQDUgeworCQkJaW50ZXJydXB0cyA9IDwwIDM3NSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJfTsKKwkJc3NpNjogc3NpQDYgeworCQkJaW50ZXJydXB0cyA9IDwwIDM3NiBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJfTsKKwkJc3NpNzogc3NpQDcgeworCQkJaW50ZXJydXB0cyA9IDwwIDM3NyBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJfTsKKwkJc3NpODogc3NpQDggeworCQkJaW50ZXJydXB0cyA9IDwwIDM3OCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJfTsKKwkJc3NpOTogc3NpQDkgeworCQkJaW50ZXJydXB0cyA9IDwwIDM3OSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJfTsKKwl9OworCisJcmNhcl9zb3VuZCxkYWkgeworCQlkYWkwIHsKKwkJCXBsYXliYWNrID0gPCZzc2k1ICZzcmM1PjsKKwkJCWNhcHR1cmUgID0gPCZzc2k2PjsKKwkJfTsKKwkJZGFpMSB7CisJCQlwbGF5YmFjayA9IDwmc3NpMz47CisJCX07CisJCWRhaTIgeworCQkJY2FwdHVyZSAgPSA8JnNzaTQ+OworCQl9OworCQlkYWkzIHsKKwkJCXBsYXliYWNrID0gPCZzc2k3PjsKKwkJfTsKKwkJZGFpNCB7CisJCQljYXB0dXJlICA9IDwmc3NpOD47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2ltcGxlLWNhcmQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpbXBsZS1jYXJkLnR4dAppbmRleCAxOWM4NGRmLi4xMzFhYTJhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2ltcGxlLWNhcmQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaW1wbGUtY2FyZC50eHQKQEAgLTgsMTYgKzgsMjYgQEAKIAogT3B0aW9uYWwgcHJvcGVydGllczoKIAorLSBzaW1wbGUtYXVkaW8tY2FyZCxuYW1lCQk6IFVzZXIgc3BlY2lmaWVkIGF1ZGlvIHNvdW5kIGNhcmQgbmFtZSwgb25lIHN0cmluZworCQkJCQkgIHByb3BlcnR5LgogLSBzaW1wbGUtYXVkaW8tY2FyZCxmb3JtYXQJCTogQ1BVL0NPREVDIGNvbW1vbiBhdWRpbyBmb3JtYXQuCiAJCQkJCSAgImkycyIsICJyaWdodF9qIiwgImxlZnRfaiIgLCAiZHNwX2EiCiAJCQkJCSAgImRzcF9iIiwgImFjOTciLCAicGRtIiwgIm1zYiIsICJsc2IiCistIHNpbXBsZS1hdWRpby1jYXJkLHdpZGdldHMJCTogUGxlYXNlIHJlZmVyIHRvIHdpZGdldHMudHh0LgogLSBzaW1wbGUtYXVkaW8tY2FyZCxyb3V0aW5nCQk6IEEgbGlzdCBvZiB0aGUgY29ubmVjdGlvbnMgYmV0d2VlbiBhdWRpbyBjb21wb25lbnRzLgogCQkJCQkgIEVhY2ggZW50cnkgaXMgYSBwYWlyIG9mIHN0cmluZ3MsIHRoZSBmaXJzdCBiZWluZyB0aGUKIAkJCQkJICBjb25uZWN0aW9uJ3Mgc2luaywgdGhlIHNlY29uZCBiZWluZyB0aGUgY29ubmVjdGlvbidzCiAJCQkJCSAgc291cmNlLgorLSBkYWktdGRtLXNsb3QtbnVtCQkJOiBQbGVhc2UgcmVmZXIgdG8gdGRtLXNsb3QudHh0LgorLSBkYWktdGRtLXNsb3Qtd2lkdGgJCQk6IFBsZWFzZSByZWZlciB0byB0ZG0tc2xvdC50eHQuCiAKIFJlcXVpcmVkIHN1Ym5vZGVzOgogCistIHNpbXBsZS1hdWRpby1jYXJkLGRhaS1saW5rCQk6IGNvbnRhaW5lciBmb3IgdGhlIENQVSBhbmQgQ09ERUMgc3ViLW5vZGVzCisJCQkJCSAgVGhpcyBjb250YWluZXIgbWF5IGJlIG9taXR0ZWQgd2hlbiB0aGUKKwkJCQkJICBjYXJkIGhhcyBvbmx5IG9uZSBEQUkgbGluay4KKwkJCQkJICBTZWUgdGhlIGV4YW1wbGVzLgorCiAtIHNpbXBsZS1hdWRpby1jYXJkLGNwdQkJCTogQ1BVICAgc3ViLW5vZGUKIC0gc2ltcGxlLWF1ZGlvLWNhcmQsY29kZWMJCTogQ09ERUMgc3ViLW5vZGUKIApAQCAtMzgsMTUgKzQ4LDI5IEBACiAJCQkJCSAgY2xvY2sgbm9kZSAoPSBjb21tb24gY2xvY2spLCBvciAic3lzdGVtLWNsb2NrLWZyZXF1ZW5jeSIKIAkJCQkJICAoaWYgc3lzdGVtIGRvZW5zJ3Qgc3VwcG9ydCBjb21tb24gY2xvY2spCiAKLUV4YW1wbGU6CitOb3RlOgorICogRm9yICdmb3JtYXQnLCAnZnJhbWUtbWFzdGVyJywgJ2JpdGNsb2NrLW1hc3RlcicsICdiaXRjbG9jay1pbnZlcnNpb24nIGFuZAorICAgJ2ZyYW1lLWludmVyc2lvbicsIHRoZSBzaW1wbGUgY2FyZCB3aWxsIHVzZSB0aGUgc2V0dGluZ3Mgb2YgQ09ERUMgZm9yIGJvdGgKKyAgIENQVSBhbmQgQ09ERUMgc2lkZXMgYXMgd2UgbmVlZCB0byBrZWVwIHRoZSBzZXR0aW5ncyBpZGVudGljYWwgZm9yIGJvdGggZW5kcworICAgb2YgdGhlIGxpbmsuCisKK0V4YW1wbGUgMSAtIHNpbmdsZSBEQUkgbGluazoKIAogc291bmQgewogCWNvbXBhdGlibGUgPSAic2ltcGxlLWF1ZGlvLWNhcmQiOworCXNpbXBsZS1hdWRpby1jYXJkLG5hbWUgPSAiVkY2MTAtVG93ZXItU291bmQtQ2FyZCI7CiAJc2ltcGxlLWF1ZGlvLWNhcmQsZm9ybWF0ID0gImxlZnRfaiI7CisJc2ltcGxlLWF1ZGlvLWNhcmQsd2lkZ2V0cyA9CisJCSJNaWNyb3Bob25lIiwgIk1pY3JvcGhvbmUgSmFjayIsCisJCSJIZWFkcGhvbmUiLCAiSGVhZHBob25lIEphY2siLAorCQkiU3BlYWtlciIsICJFeHRlcm5hbCBTcGVha2VyIjsKIAlzaW1wbGUtYXVkaW8tY2FyZCxyb3V0aW5nID0KLQkJIk1JQ19JTiIsICJNaWMgSmFjayIsCisJCSJNSUNfSU4iLCAiTWljcm9waG9uZSBKYWNrIiwKIAkJIkhlYWRwaG9uZSBKYWNrIiwgIkhQX09VVCIsCi0JCSJFeHQgU3BrIiwgIkxJTkVfT1VUIjsKKwkJIkV4dGVybmFsIFNwZWFrZXIiLCAiTElORV9PVVQiOworCisJZGFpLXRkbS1zbG90LW51bSA9IDwyPjsKKwlkYWktdGRtLXNsb3Qtd2lkdGggPSA8OD47CiAKIAlzaW1wbGUtYXVkaW8tY2FyZCxjcHUgewogCQlzb3VuZC1kYWkgPSA8JnNoX2ZzaTIgMD47CkBAIC03NSwzICs5OSwzOCBAQAogCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CiAJaW50ZXJydXB0cyA9IDwwIDE0NiAweDQ+OwogfTsKKworRXhhbXBsZSAyIC0gbWFueSBEQUkgbGlua3M6CisKK3NvdW5kIHsKKwljb21wYXRpYmxlID0gInNpbXBsZS1hdWRpby1jYXJkIjsKKwlzaW1wbGUtYXVkaW8tY2FyZCxuYW1lID0gIkN1Ym94IEF1ZGlvIjsKKwlzaW1wbGUtYXVkaW8tY2FyZCxmb3JtYXQgPSAiaTJzIjsKKworCXNpbXBsZS1hdWRpby1jYXJkLGRhaS1saW5rQDAgewkJLyogSTJTIC0gSERNSSAqLworCQlzaW1wbGUtYXVkaW8tY2FyZCxjcHUgeworCQkJc291bmQtZGFpID0gPCZhdWRpbzEgMD47CisJCX07CisJCXNpbXBsZS1hdWRpby1jYXJkLGNvZGVjIHsKKwkJCXNvdW5kLWRhaSA9IDwmdGRhOTk4eCAwPjsKKwkJfTsKKwl9OworCisJc2ltcGxlLWF1ZGlvLWNhcmQsZGFpLWxpbmtAMSB7CQkvKiBTL1BESUYgLSBIRE1JICovCisJCXNpbXBsZS1hdWRpby1jYXJkLGNwdSB7CisJCQlzb3VuZC1kYWkgPSA8JmF1ZGlvMSAxPjsKKwkJfTsKKwkJc2ltcGxlLWF1ZGlvLWNhcmQsY29kZWMgeworCQkJc291bmQtZGFpID0gPCZ0ZGE5OTh4IDE+OworCQl9OworCX07CisKKwlzaW1wbGUtYXVkaW8tY2FyZCxkYWktbGlua0AyIHsJCS8qIFMvUERJRiAtIFMvUERJRiAqLworCQlzaW1wbGUtYXVkaW8tY2FyZCxjcHUgeworCQkJc291bmQtZGFpID0gPCZhdWRpbzEgMT47CisJCX07CisJCXNpbXBsZS1hdWRpby1jYXJkLGNvZGVjIHsKKwkJCXNvdW5kLWRhaSA9IDwmc3BkaWZfY29kZWM+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpcmYtYXVkaW8tY29kZWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpcmYtYXVkaW8tY29kZWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MmY1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2lyZi1hdWRpby1jb2RlYy50eHQKQEAgLTAsMCArMSwxNyBAQAorU2lSRiBpbnRlcm5hbCBhdWRpbyBDT0RFQworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgIC0gY29tcGF0aWJsZSA6ICJzaXJmLGF0bGFzNi1hdWRpby1jb2RlYyIgb3IgInNpcmYscHJpbWEyLWF1ZGlvLWNvZGVjIgorCisgIC0gcmVnIDogdGhlIHJlZ2lzdGVyIGFkZHJlc3Mgb2YgdGhlIGRldmljZS4KKworICAtIGNsb2NrczogdGhlIGNsb2NrIG9mIFNpUkYgaW50ZXJuYWwgYXVkaW8gY29kZWMKKworRXhhbXBsZToKKworYXVkaW9jb2RlYzogYXVkaW9jb2RlY0BiMDA0MDAwMCB7CisJY29tcGF0aWJsZSA9ICJzaXJmLGF0bGFzNi1hdWRpby1jb2RlYyI7CisJcmVnID0gPDB4YjAwNDAwMDAgMHgxMDAwMD47CisJY2xvY2tzID0gPCZjbGtzIDI3PjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2lyZi1hdWRpby1wb3J0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaXJmLWF1ZGlvLXBvcnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNjZkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2lyZi1hdWRpby1wb3J0LnR4dApAQCAtMCwwICsxLDIwIEBACisqIFNpUkYgU29DIGF1ZGlvIHBvcnQKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogInNpcmYsYXVkaW8tcG9ydCIKKy0gcmVnOiBCYXNlIGFkZHJlc3MgYW5kIHNpemUgZW50cmllczoKKy0gZG1hczogTGlzdCBvZiBETUEgY29udHJvbGxlciBwaGFuZGxlIGFuZCBETUEgcmVxdWVzdCBsaW5lIG9yZGVyZWQgcGFpcnMuCistIGRtYS1uYW1lczogSWRlbnRpZmllciBzdHJpbmcgZm9yIGVhY2ggRE1BIHJlcXVlc3QgbGluZSBpbiB0aGUgZG1hcyBwcm9wZXJ0eS4KKyAgVGhlc2Ugc3RyaW5ncyBjb3JyZXNwb25kIDE6MSB3aXRoIHRoZSBvcmRlcmVkIHBhaXJzIGluIGRtYXMuCisKKyAgT25lIG9mIHRoZSBETUEgY2hhbm5lbHMgd2lsbCBiZSByZXNwb25zaWJsZSBmb3IgdHJhbnNtaXNzaW9uIChzaG91bGQgYmUKKyAgbmFtZWQgInR4IikgYW5kIG9uZSBmb3IgcmVjZXB0aW9uIChzaG91bGQgYmUgbmFtZWQgInJ4IikuCisKK0V4YW1wbGU6CisKK2F1ZGlvcG9ydDogYXVkaW9wb3J0QGIwMDQwMDAwIHsKKwljb21wYXRpYmxlID0gInNpcmYsYXVkaW8tcG9ydCI7CisJcmVnID0gPDB4YjAwNDAwMDAgMHgxMDAwMD47CisJZG1hcyA9IDwmZG1hYzEgMz4sIDwmZG1hYzEgOD47CisJZG1hLW5hbWVzID0gInJ4IiwgInR4IjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2lyZi1hdWRpby50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2lyZi1hdWRpby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4ODgyYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaXJmLWF1ZGlvLnR4dApAQCAtMCwwICsxLDQxIEBACisqIFNpUkYgYXRsYXM2IGFuZCBwcmltYTIgaW50ZXJuYWwgYXVkaW8gY29kZWMgYW5kIHBvcnQgYmFzZWQgYXVkaW8gc2V0dXBzCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6ICJzaXJmLHNpcmYtYXVkaW8tY2FyZCIKKy0gc2lyZixhdWRpby1wbGF0Zm9ybTogcGhhbmRsZSBmb3IgdGhlIHBsYXRmb3JtIG5vZGUKKy0gc2lyZixhdWRpby1jb2RlYzogcGhhbmRsZSBmb3IgdGhlIFNpUkYgaW50ZXJuYWwgY29kZWMgbm9kZQorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBocC1wYS1ncGlvczogTmVlZCB0byBiZSBwcmVzZW50IGlmIHRoZSBib2FyZCBuZWVkIGNvbnRyb2wgZXh0ZXJuYWwKKyAgaGVhZHBob25lIGFtcGxpZmllci4KKy0gc3BrLXBhLWdwaW9zOiBOZWVkIHRvIGJlIHByZXNlbnQgaWYgdGhlIGJvYXJkIG5lZWQgY29udHJvbCBleHRlcm5hbAorICBzcGVha2VyIGFtcGxpZmllci4KKy0gaHAtc3dpdGNoLWdwaW9zOiBOZWVkIHRvIGJlIHByZXNlbnQgaWYgdGhlIGJvYXJkIGNhcGFibGUgdG8gZGV0ZWN0IGphY2sKKyAgaW5zZXJ0aW9uLCByZW1vdmFsLgorCitBdmFpbGFibGUgYXVkaW8gZW5kcG9pbnRzIGZvciB0aGUgYXVkaW8tcm91dGluZyB0YWJsZToKKworQm9hcmQgY29ubmVjdG9yczoKKyAqIEhlYWRzZXQgU3RlcmVvcGhvbmUKKyAqIEV4dCBTcGsKKyAqIExpbmUgSW4KKyAqIE1pYworCitTaVJGIGludGVybmFsIGF1ZGlvIGNvZGVjIHBpbnM6CisgKiBIUE9VVEwKKyAqIEhQT1VUUgorICogU1BLT1VUCisgKiBFeHQgTWljCisgKiBNaWMgQmlhcworCitFeGFtcGxlOgorCitzb3VuZCB7CisJCWNvbXBhdGlibGUgPSAic2lyZixzaXJmLWF1ZGlvLWNhcmQiOworCQlzaXJmLGF1ZGlvLWNvZGVjID0gPCZhdWRpb2NvZGVjPjsKKwkJc2lyZixhdWRpby1wbGF0Zm9ybSA9IDwmYXVkaW9wb3J0PjsKKwkJaHAtcGEtZ3Bpb3MgPSA8JmdwaW8gNDQgMD47CisJCXNway1wYS1ncGlvcyA9IDwmZ3BpbyA0NiAwPjsKKwkJaHAtc3dpdGNoLWdwaW9zID0gPCZncGlvIDQ1IDA+OworfTsKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3RkbS1zbG90LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC90ZG0tc2xvdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyYzg0MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC90ZG0tc2xvdC50eHQKQEAgLTAsMCArMSwyMCBAQAorVERNIHNsb3Q6CisKK1RoaXMgc3BlY2lmaWVzIGF1ZGlvIERBSSdzIFRETSBzbG90LgorCitURE0gc2xvdCBwcm9wZXJ0aWVzOgorZGFpLXRkbS1zbG90LW51bSA6IE51bWJlciBvZiBzbG90cyBpbiB1c2UuCitkYWktdGRtLXNsb3Qtd2lkdGggOiAgV2lkdGggaW4gYml0cyBmb3IgZWFjaCBzbG90LgorCitGb3IgaW5zdGFuY2U6CisJZGFpLXRkbS1zbG90LW51bSA9IDwyPjsKKwlkYWktdGRtLXNsb3Qtd2lkdGggPSA8OD47CisKK0FuZCBmb3IgZWFjaCBzcGNpZmllZCBkcml2ZXIsIHRoZXJlIGNvdWxkIGJlIG9uZSAub2ZfeGxhdGVfdGRtX3Nsb3RfbWFzaygpCit0byBzcGVjaWZ5IGEgZXhwbGljaXQgbWFwcGluZyBvZiB0aGUgY2hhbm5lbHMgYW5kIHRoZSBzbG90cy4gSWYgaXQncyBhYnNlbnQKK3RoZSBkZWZhdWx0IHNuZF9zb2Nfb2ZfeGxhdGVfdGRtX3Nsb3RfbWFzaygpIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0aW5nIHRoZQordHggYW5kIHJ4IG1hc2tzLgorCitGb3Igc25kX3NvY19vZl94bGF0ZV90ZG1fc2xvdF9tYXNrKCksIHRoZSB0eCBhbmQgcnggbWFza3Mgd2lsbCB1c2UgYSAxIGJpdAorZm9yIGFuIGFjdGl2ZSBzbG90IGFzIGRlZmF1bHQsIGFuZCB0aGUgZGVmYXVsdCBhY3RpdmUgYml0cyBhcmUgYXQgdGhlIExTQiBvZgordGhlIG1hc2tzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3RsdjMyMGFpYzMxeHgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3RsdjMyMGFpYzMxeHgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YzY2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvdGx2MzIwYWljMzF4eC50eHQKQEAgLTAsMCArMSw2MSBAQAorVGV4YXMgSW5zdHJ1bWVudHMgLSB0bHYzMjBhaWMzMXh4IENvZGVjIG1vZHVsZQorCitUaGUgdGx2MzIwYWljMzF4eCBzZXJpYWwgY29udHJvbCBidXMgY29tbXVuaWNhdGVzIHRocm91Z2ggSTJDIHByb3RvY29scworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGUgLSAic3RyaW5nIiAtIE9uZSBvZjoKKyAgICAidGksdGx2MzIwYWljMzEweCIgLSBHZW5lcmljIFRMVjMyMEFJQzMxeHggd2l0aCBtb25vIHNwZWFrZXIgYW1wCisgICAgInRpLHRsdjMyMGFpYzMxMXgiIC0gR2VuZXJpYyBUTFYzMjBBSUMzMXh4IHdpdGggc3RlcmVvIHNwZWFrZXIgYW1wCisgICAgInRpLHRsdjMyMGFpYzMxMDAiIC0gVExWMzIwQUlDMzEwMCAobW9ubyBzcGVha2VyIGFtcCwgbm8gTWluaURTUCkKKyAgICAidGksdGx2MzIwYWljMzExMCIgLSBUTFYzMjBBSUMzMTEwIChzdGVyZW8gc3BlYWtlciBhbXAsIG5vIE1pbmlEU1ApCisgICAgInRpLHRsdjMyMGFpYzMxMjAiIC0gVExWMzIwQUlDMzEyMCAobW9ubyBzcGVha2VyIGFtcCwgTWluaURTUCkKKyAgICAidGksdGx2MzIwYWljMzExMSIgLSBUTFYzMjBBSUMzMTExIChzdGVyZW8gc3BlYWtlciBhbXAsIE1pbmlEU1ApCisKKy0gcmVnIC0gPGludD4gLSAgSTJDIHNsYXZlIGFkZHJlc3MKKworCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCistIGdwaW8tcmVzZXQgLSBncGlvIHBpbiBudW1iZXIgdXNlZCBmb3IgY29kZWMgcmVzZXQKKy0gYWkzMXh4LW1pY2JpYXMtdmcgLSBNaWNCaWFzIFZvbHRhZ2Ugc2V0dGluZworICAgICAgICAxIG9yIE1JQ0JJQVNfMl8wViAtIE1JQ0JJQVMgb3V0cHV0IGlzIHBvd2VyZWQgdG8gMi4wVgorICAgICAgICAyIG9yIE1JQ0JJQVNfMl81ViAtIE1JQ0JJQVMgb3V0cHV0IGlzIHBvd2VyZWQgdG8gMi41VgorICAgICAgICAzIG9yIE1JQ0JJQVNfQVZERCAtIE1JQ0JJQVMgb3V0cHV0IGlzIGNvbm5lY3RlZCB0byBBVkRECisJSWYgdGhpcyBub2RlIGlzIG5vdCBtZW50aW9uZWQgb3IgaWYgdGhlIHZhbHVlIGlzIHVua25vd24sIHRoZW4KKwltaWNiaWFzCWlzIHNldCB0byAyLjBWLgorLSBIUFZERC1zdXBwbHksIFNQUlZERC1zdXBwbHksIFNQTFZERC1zdXBwbHksIEFWREQtc3VwcGx5LCBJT1ZERC1zdXBwbHksCisgIERWREQtc3VwcGx5IDogcG93ZXIgc3VwcGxpZXMgZm9yIHRoZSBkZXZpY2UgYXMgY292ZXJlZCBpbgorICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3JlZ3VsYXRvci50eHQKKworQ09ERUMgb3V0cHV0IHBpbnM6CisgICogSFBMCisgICogSFBSCisgICogU1BMLCBkZXZpY2VzIHdpdGggc3RlcmVvIHNwZWFrZXIgYW1wCisgICogU1BSLCBkZXZpY2VzIHdpdGggc3RlcmVvIHNwZWFrZXIgYW1wCisgICogU1BLLCBkZXZpY2VzIHdpdGggbW9ubyBzcGVha2VyIGFtcAorICAqIE1JQ0JJQVMKKworQ09ERUMgaW5wdXQgcGluczoKKyAgKiBNSUMxTFAKKyAgKiBNSUMxUlAKKyAgKiBNSUMxTE0KKworVGhlIHBpbnMgY2FuIGJlIHVzZWQgaW4gcmVmZXJyaW5nIHNvdW5kIG5vZGUncyBhdWRpby1yb3V0aW5nIHByb3BlcnR5LgorCitFeGFtcGxlOgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL3NvdW5kL3RsdjMyMGFpYzMxeHgtbWljYmlhcy5oPgorCit0bHYzMjBhaWMzMXh4OiB0bHYzMjBhaWMzMXh4QDE4IHsKKwljb21wYXRpYmxlID0gInRpLHRsdjMyMGFpYzMxMXgiOworCXJlZyA9IDwweDE4PjsKKworCWFpMzF4eC1taWNiaWFzLXZnID0gPE1JQ0JJQVNfT0ZGPjsKKworCUhQVkRELXN1cHBseSA9IDwmcmVndWxhdG9yPjsKKwlTUFJWREQtc3VwcGx5ID0gPCZyZWd1bGF0b3I+OworCVNQTFZERC1zdXBwbHkgPSA8JnJlZ3VsYXRvcj47CisJQVZERC1zdXBwbHkgPSA8JnJlZ3VsYXRvcj47CisJSU9WREQtc3VwcGx5ID0gPCZyZWd1bGF0b3I+OworCURWREQtc3VwcGx5ID0gPCZyZWd1bGF0b3I+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC90bHYzMjBhaWMzMng0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC90bHYzMjBhaWMzMng0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTI3NDFhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3RsdjMyMGFpYzMyeDQudHh0CkBAIC0wLDAgKzEsMzAgQEAKK1RleGFzIEluc3RydW1lbnRzIC0gdGx2MzIwYWljMzJ4NCBDb2RlYyBtb2R1bGUKKworVGhlIHRsdjMyMGFpYzMyeDQgc2VyaWFsIGNvbnRyb2wgYnVzIGNvbW11bmljYXRlcyB0aHJvdWdoIEkyQyBwcm90b2NvbHMKKworUmVxdWlyZWQgcHJvcGVydGllczoKKyAtIGNvbXBhdGlibGU6IFNob3VsZCBiZSAidGksdGx2MzIwYWljMzJ4NCIKKyAtIHJlZzogSTJDIHNsYXZlIGFkZHJlc3MKKyAtIHN1cHBseS0qOiBSZXF1aXJlZCBzdXBwbHkgcmVndWxhdG9ycyBhcmU6CisgICAgImlvdiIgLSBkaWdpdGFsIElPIHBvd2VyIHN1cHBseQorICAgICJsZG9pbiIgLSBMRE8gcG93ZXIgc3VwcGx5CisgICAgImR2IiAtIERpZ2l0YWwgY29yZSBwb3dlciBzdXBwbHkKKyAgICAiYXYiIC0gQW5hbG9nIGNvcmUgcG93ZXIgc3VwcGx5CisgICAgSWYgeW91IHN1cHBseSBsZG9pbiwgZHYgYW5kIGF2IGFyZSBvcHRpb25hbC4gT3RoZXJ3aXNlIHRoZXkgYXJlIHJlcXVpcmVkCisgICBTZWUgcmVndWxhdG9yL3JlZ3VsYXRvci50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldGFpbGVkIGJpbmRpbmcKKyAgIGZvcm1hdC4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKyAtIHJlc2V0LWdwaW9zOiBSZXNldC1HUElPIHBoYW5kbGUgd2l0aCBhcmdzIGFzIGRlc2NyaWJlZCBpbiBncGlvL2dwaW8udHh0CisgLSBjbG9ja3MvY2xvY2stbmFtZXM6IENsb2NrIG5hbWVkICdtY2xrJyBmb3IgdGhlIG1hc3RlciBjbG9jayBvZiB0aGUgY29kZWMuCisgICBTZWUgY2xvY2svY2xvY2stYmluZGluZ3MudHh0IGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV0YWlsZWQgZm9ybWF0LgorCisKK0V4YW1wbGU6CisKK2NvZGVjOiB0bHYzMjBhaWMzMng0QDE4IHsKKwljb21wYXRpYmxlID0gInRpLHRsdjMyMGFpYzMyeDQiOworCXJlZyA9IDwweDE4PjsKKwljbG9ja3MgPSA8JmNsa3MgMjAxPjsKKwljbG9jay1uYW1lcyA9ICJtY2xrIjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvdGx2MzIwYWljM3gudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3RsdjMyMGFpYzN4LnR4dAppbmRleCA5ZDhlYTE0Li41ZTYwNDBjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvdGx2MzIwYWljM3gudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC90bHYzMjBhaWMzeC50eHQKQEAgLTYsNyArNiw2IEBACiAKIC0gY29tcGF0aWJsZSAtICJzdHJpbmciIC0gT25lIG9mOgogICAgICJ0aSx0bHYzMjBhaWMzeCIgLSBHZW5lcmljIFRMVjMyMEFJQzN4IGRldmljZQotICAgICJ0aSx0bHYzMjBhaWMzMng0IiAtIFRMVjMyMEFJQzMyeDQKICAgICAidGksdGx2MzIwYWljMzMiIC0gVExWMzIwQUlDMzMKICAgICAidGksdGx2MzIwYWljMzAwNyIgLSBUTFYzMjBBSUMzMDA3CiAgICAgInRpLHRsdjMyMGFpYzMxMDYiIC0gVExWMzIwQUlDMzEwNgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dpZGdldHMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dpZGdldHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZGU1YmEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd2lkZ2V0cy50eHQKQEAgLTAsMCArMSwyMCBAQAorV2lkZ2V0czoKKworVGhpcyBtYWlubHkgc3BlY2lmaWVzIGF1ZGlvIG9mZi1jb2RlYyBEQVBNIHdpZGdldHMuCisKK0VhY2ggZW50cnkgaXMgYSBwYWlyIG9mIHN0cmluZ3MgaW4gRFQ6CisKKwkidGVtcGxhdGUtd25hbWUiLCAidXNlci1zdXBwbGllZC13bmFtZSIKKworVGhlICJ0ZW1wbGF0ZS13bmFtZSIgYmVpbmcgdGhlIHRlbXBsYXRlIHdpZGdldCBuYW1lIGFuZCBjdXJyZW50bHkgaW5jbHVkZXM6CisiTWljcm9waG9uZSIsICJMaW5lIiwgIkhlYWRwaG9uZSIgYW5kICJTcGVha2VyIi4KKworVGhlICJ1c2VyLXN1cHBsaWVkLXduYW1lIiBiZWluZyB0aGUgdXNlciBzcGVjaWZpZWQgd2lkZ2V0IG5hbWUuCisKK0ZvciBpbnN0YW5jZToKKwlzaW1wbGUtYXVkaW8td2lkZ2V0cyA9CisJCSJNaWNyb3Bob25lIiwgIk1pY3JvcGhvbmUgSmFjayIsCisJCSJMaW5lIiwgIkxpbmUgSW4gSmFjayIsCisJCSJMaW5lIiwgIkxpbmUgT3V0IEphY2siLAorCQkiSGVhZHBob25lIiwgIkhlYWRwaG9uZSBKYWNrIiwKKwkJIlNwZWFrZXIiLCAiU3BlYWtlciBFeHRlcm5hbCI7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL2VmbTMyLXNwaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL2VmbTMyLXNwaS50eHQKaW5kZXggYTU5MGNhNS4uOGYwODFjOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9lZm0zMi1zcGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvZWZtMzItc3BpLnR4dApAQCAtMywyNCArMywyNCBAQAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gI2FkZHJlc3MtY2VsbHM6IHNlZSBzcGktYnVzLnR4dAogLSAjc2l6ZS1jZWxsczogc2VlIHNwaS1idXMudHh0Ci0tIGNvbXBhdGlibGU6IHNob3VsZCBiZSAiZWZtMzIsc3BpIgorLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgImVuZXJneW1pY3JvLGVmbTMyLXNwaSIKIC0gcmVnOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgY29udHJvbGxlcgogLSBpbnRlcnJ1cHRzOiBwYWlyIHNwZWNpZnlpbmcgcnggYW5kIHR4IGlycQogLSBjbG9ja3M6IHBoYW5kbGUgdG8gdGhlIHNwaSBjbG9jawogLSBjcy1ncGlvczogc2VlIHNwaS1idXMudHh0Ci0tIGxvY2F0aW9uOiBWYWx1ZSB0byB3cml0ZSB0byB0aGUgUk9VVEUgcmVnaXN0ZXIncyBMT0NBVElPTiBiaXRmaWVsZCB0byBjb25maWd1cmUgdGhlIHBpbm11eCBmb3IgdGhlIGRldmljZSwgc2VlIGRhdGFzaGVldCBmb3IgdmFsdWVzLgorLSBlZm0zMixsb2NhdGlvbjogVmFsdWUgdG8gd3JpdGUgdG8gdGhlIFJPVVRFIHJlZ2lzdGVyJ3MgTE9DQVRJT04gYml0ZmllbGQgdG8gY29uZmlndXJlIHRoZSBwaW5tdXggZm9yIHRoZSBkZXZpY2UsIHNlZSBkYXRhc2hlZXQgZm9yIHZhbHVlcy4KIAogRXhhbXBsZToKIAogc3BpMTogc3BpQDB4NDAwMGM0MDAgeyAvKiBVU0FSVDEgKi8KIAkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkjc2l6ZS1jZWxscyA9IDwwPjsKLQljb21wYXRpYmxlID0gImVmbTMyLHNwaSI7CisJY29tcGF0aWJsZSA9ICJlbmVyZ3ltaWNybyxlZm0zMi1zcGkiOwogCXJlZyA9IDwweDQwMDBjNDAwIDB4NDAwPjsKIAlpbnRlcnJ1cHRzID0gPDE1IDE2PjsKIAljbG9ja3MgPSA8JmNtdSAyMD47CiAJY3MtZ3Bpb3MgPSA8JmdwaW8gNTEgMT47IC8vIEQzCi0JbG9jYXRpb24gPSA8MT47CisJZWZtMzIsbG9jYXRpb24gPSA8MT47CiAJc3RhdHVzID0gIm9rIjsKIAogCWtzODg1MUAwIHsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvcWNvbSxzcGktcXVwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvcWNvbSxzcGktcXVwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODJhMjY4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9xY29tLHNwaS1xdXAudHh0CkBAIC0wLDAgKzEsODUgQEAKK1F1YWxjb21tIFVuaXZlcnNhbCBQZXJpcGhlcmFsIChRVVApIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoU1BJKQorCitUaGUgUVVQIGNvcmUgaXMgYW4gQUhCIHNsYXZlIHRoYXQgcHJvdmlkZXMgYSBjb21tb24gZGF0YSBwYXRoIChhbiBvdXRwdXQgRklGTworYW5kIGFuIGlucHV0IEZJRk8pIGZvciBzZXJpYWwgcGVyaXBoZXJhbCBpbnRlcmZhY2UgKFNQSSkgbWluaS1jb3JlLgorCitTUEkgaW4gbWFzdGVyIG1vZGUgc3VwcG9ydHMgdXAgdG8gNTBNSHosIHVwIHRvIGZvdXIgY2hpcCBzZWxlY3RzLCBwcm9ncmFtbWFibGUKK2RhdGEgcGF0aCBmcm9tIDQgYml0cyB0byAzMiBiaXRzIGFuZCBudW1lcm91cyBwcm90b2NvbCB2YXJpYW50cy4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogICAgIFNob3VsZCBjb250YWluICJxY29tLHNwaS1xdXAtdjIuMS4xIiBvciAicWNvbSxzcGktcXVwLXYyLjIuMSIKKy0gcmVnOiAgICAgICAgICAgIFNob3VsZCBjb250YWluIGJhc2UgcmVnaXN0ZXIgbG9jYXRpb24gYW5kIGxlbmd0aAorLSBpbnRlcnJ1cHRzOiAgICAgSW50ZXJydXB0IG51bWJlciB1c2VkIGJ5IHRoaXMgY29udHJvbGxlcgorCistIGNsb2NrczogICAgICAgICBTaG91bGQgY29udGFpbiB0aGUgY29yZSBjbG9jayBhbmQgdGhlIEFIQiBjbG9jay4KKy0gY2xvY2stbmFtZXM6ICAgIFNob3VsZCBiZSAiY29yZSIgZm9yIHRoZSBjb3JlIGNsb2NrIGFuZCAiaWZhY2UiIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgIEFIQiBjbG9jay4KKworLSAjYWRkcmVzcy1jZWxsczogTnVtYmVyIG9mIGNlbGxzIHJlcXVpcmVkIHRvIGRlZmluZSBhIGNoaXAgc2VsZWN0CisgICAgICAgICAgICAgICAgICBhZGRyZXNzIG9uIHRoZSBTUEkgYnVzLiBTaG91bGQgYmUgc2V0IHRvIDEuCistICNzaXplLWNlbGxzOiAgICBTaG91bGQgYmUgemVyby4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gc3BpLW1heC1mcmVxdWVuY3k6IFNwZWNpZmllcyBtYXhpbXVtIFNQSSBjbG9jayBmcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICBVbml0cyAtIEh6LiBEZWZpbml0aW9uIGFzIHBlcgorICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktYnVzLnR4dAorCitTUEkgc2xhdmUgbm9kZXMgbXVzdCBiZSBjaGlsZHJlbiBvZiB0aGUgU1BJIG1hc3RlciBub2RlIGFuZCBjYW4gY29udGFpbgorcHJvcGVydGllcyBkZXNjcmliZWQgaW4gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktYnVzLnR4dAorCitFeGFtcGxlOgorCisJc3BpXzg6IHNwaUBmOTk2NDAwMCB7IC8qIEJMU1AyIFFVUDIgKi8KKworCQljb21wYXRpYmxlID0gInFjb20sc3BpLXF1cC12MiI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJcmVnID0gPDB4Zjk5NjQwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwwIDEwMiAwPjsKKwkJc3BpLW1heC1mcmVxdWVuY3kgPSA8MTkyMDAwMDA+OworCisJCWNsb2NrcyA9IDwmZ2NjIEdDQ19CTFNQMl9RVVAyX1NQSV9BUFBTX0NMSz4sIDwmZ2NjIEdDQ19CTFNQMl9BSEJfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiY29yZSIsICJpZmFjZSI7CisKKwkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKKwkJcGluY3RybC0wID0gPCZzcGk4X2RlZmF1bHQ+OworCisJCWRldmljZUAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDIyLWR1bW15IjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MD47IC8qIENoaXAgc2VsZWN0IDAgKi8KKwkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDE5MjAwMDAwPjsKKwkJCXNwaS1jcG9sOworCQl9OworCisJCWRldmljZUAxIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDIyLWR1bW15IjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MT47IC8qIENoaXAgc2VsZWN0IDEgKi8KKwkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDk2MDAwMDA+OworCQkJc3BpLWNwaGE7CisJCX07CisKKwkJZGV2aWNlQDIgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scGwwMjItZHVtbXkiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwyPjsgLyogQ2hpcCBzZWxlY3QgMiAqLworCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8MTkyMDAwMDA+OworCQkJc3BpLWNwb2w7CisJCQlzcGktY3BoYTsKKwkJfTsKKworCQlkZXZpY2VAMyB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDAyMi1kdW1teSI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDM+OyAvKiBDaGlwIHNlbGVjdCAzICovCisJCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDwxOTIwMDAwMD47CisJCQlzcGktY3BvbDsKKwkJCXNwaS1jcGhhOworCQkJc3BpLWNzLWhpZ2g7CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc2gtaHNwaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NoLWhzcGkudHh0CmluZGV4IDMwYjU3YjEuLjMxOWJhZDQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc2gtaHNwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zaC1oc3BpLnR4dApAQCAtMSw3ICsxLDI5IEBACiBSZW5lc2FzIEhTUEkuCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGUgOiAJInJlbmVzYXMsaHNwaSIKLS0gcmVnIDogT2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZQotLSBpbnRlcnJ1cHRzIDogaW50ZXJydXB0IGxpbmUgdXNlZCBieSBIU1BJCistIGNvbXBhdGlibGUgICAgICAgOiAicmVuZXNhcyxoc3BpLTxzb2N0eXBlPiIsICJyZW5lc2FzLGhzcGkiIGFzIGZhbGxiYWNrLgorCQkgICAgIEV4YW1wbGVzIHdpdGggc29jdHlwZXMgYXJlOgorCQkgICAgICAgLSAicmVuZXNhcyxoc3BpLXI4YTc3NzgiIChSLUNhciBNMSkKKwkJICAgICAgIC0gInJlbmVzYXMsaHNwaS1yOGE3Nzc5IiAoUi1DYXIgSDEpCistIHJlZyAgICAgICAgICAgICAgOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlCistIGludGVycnVwdC1wYXJlbnQgOiBUaGUgcGhhbmRsZSBmb3IgdGhlIGludGVycnVwdCBjb250cm9sbGVyIHRoYXQKKwkJICAgICBzZXJ2aWNlcyBpbnRlcnJ1cHRzIGZvciB0aGlzIGRldmljZQorLSBpbnRlcnJ1cHRzICAgICAgIDogSW50ZXJydXB0IHNwZWNpZmllcgorLSAjYWRkcmVzcy1jZWxscyAgIDogTXVzdCBiZSA8MT4KKy0gI3NpemUtY2VsbHMgICAgICA6IE11c3QgYmUgPDA+CisKK1BpbmN0cmwgcHJvcGVydGllcyBtaWdodCBiZSBuZWVkZWQsIHRvby4gIFNlZQorRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcmVuZXNhcywqLgorCitFeGFtcGxlOgorCisJaHNwaTA6IHNwaUBmZmZjNzAwMCB7CisJCWNvbXBhdGlibGUgPSAicmVuZXNhcyxoc3BpLXI4YTc3NzgiLCAicmVuZXNhcyxoc3BpIjsKKwkJcmVnID0gPDB4ZmZmYzcwMDAgMHgxOD47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CisJCWludGVycnVwdHMgPSA8MCA2MyBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCX07CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc2gtbXNpb2YudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zaC1tc2lvZi50eHQKaW5kZXggZTYyMjIxMC4uZjI0YmFmMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zaC1tc2lvZi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zaC1tc2lvZi50eHQKQEAgLTEsMTIgKzEsNDAgQEAKIFJlbmVzYXMgTVNJT0Ygc3BpIGNvbnRyb2xsZXIKIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZSA6IAkicmVuZXNhcyxzaC1tc2lvZiIgZm9yIFN1cGVySCBvcgotCQkicmVuZXNhcyxzaC1tb2JpbGUtbXNpb2YiIGZvciBTSCBNb2JpbGUgc2VyaWVzCi0tIHJlZyA6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UKLS0gaW50ZXJydXB0cyA6IGludGVycnVwdCBsaW5lIHVzZWQgYnkgTVNJT0YKKy0gY29tcGF0aWJsZSAgICAgICAgICAgOiAicmVuZXNhcyxtc2lvZi08c29jdHlwZT4iIGZvciBTb0NzLAorCQkJICJyZW5lc2FzLHNoLW1zaW9mIiBmb3IgU3VwZXJILCBvcgorCQkJICJyZW5lc2FzLHNoLW1vYmlsZS1tc2lvZiIgZm9yIFNIIE1vYmlsZSBzZXJpZXMuCisJCQkgRXhhbXBsZXMgd2l0aCBzb2N0eXBlcyBhcmU6CisJCQkgInJlbmVzYXMsbXNpb2YtcjhhNzc5MCIgKFItQ2FyIEgyKQorCQkJICJyZW5lc2FzLG1zaW9mLXI4YTc3OTEiIChSLUNhciBNMikKKy0gcmVnICAgICAgICAgICAgICAgICAgOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlCistIGludGVycnVwdC1wYXJlbnQgICAgIDogVGhlIHBoYW5kbGUgZm9yIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciB0aGF0CisJCQkgc2VydmljZXMgaW50ZXJydXB0cyBmb3IgdGhpcyBkZXZpY2UKKy0gaW50ZXJydXB0cyAgICAgICAgICAgOiBJbnRlcnJ1cHQgc3BlY2lmaWVyCistICNhZGRyZXNzLWNlbGxzICAgICAgIDogTXVzdCBiZSA8MT4KKy0gI3NpemUtY2VsbHMgICAgICAgICAgOiBNdXN0IGJlIDwwPgogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgotLSBudW0tY3MJCTogdG90YWwgbnVtYmVyIG9mIGNoaXAtc2VsZWN0cwotLSByZW5lc2FzLHR4LWZpZm8tc2l6ZQk6IE92ZXJyaWRlcyB0aGUgZGVmYXVsdCB0eCBmaWZvIHNpemUgZ2l2ZW4gaW4gd29yZHMKLS0gcmVuZXNhcyxyeC1maWZvLXNpemUJOiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgcnggZmlmbyBzaXplIGdpdmVuIGluIHdvcmRzCistIGNsb2NrcyAgICAgICAgICAgICAgIDogTXVzdCBjb250YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbmFsIGNsb2NrLgorLSBudW0tY3MgICAgICAgICAgICAgICA6IFRvdGFsIG51bWJlciBvZiBjaGlwLXNlbGVjdHMgKGRlZmF1bHQgaXMgMSkKKworT3B0aW9uYWwgcHJvcGVydGllcywgZGVwcmVjYXRlZCBmb3Igc29jdHlwZS1zcGVjaWZpYyBiaW5kaW5nczoKKy0gcmVuZXNhcyx0eC1maWZvLXNpemUgOiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgdHggZmlmbyBzaXplIGdpdmVuIGluIHdvcmRzCisJCQkgKGRlZmF1bHQgaXMgNjQpCistIHJlbmVzYXMscngtZmlmby1zaXplIDogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHJ4IGZpZm8gc2l6ZSBnaXZlbiBpbiB3b3JkcworCQkJIChkZWZhdWx0IGlzIDY0LCBvciAyNTYgb24gUi1DYXIgSDIgYW5kIE0yKQorCitQaW5jdHJsIHByb3BlcnRpZXMgbWlnaHQgYmUgbmVlZGVkLCB0b28uICBTZWUKK0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3JlbmVzYXMsKi4KKworRXhhbXBsZToKKworCW1zaW9mMDogc3BpQGU2ZTIwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJyZW5lc2FzLG1zaW9mLXI4YTc3OTEiOworCQlyZWcgPSA8MCAweGU2ZTIwMDAwIDAgMHgwMDY0PjsKKwkJaW50ZXJydXB0cyA9IDwwIDE1NiBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJY2xvY2tzID0gPCZtc3RwMF9jbGtzIFI4QTc3OTFfQ0xLX01TSU9GMD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktZnNsLWRzcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktZnNsLWRzcGkudHh0CmluZGV4IGExZmIzMDMuLjUzNzZkZTQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWZzbC1kc3BpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1mc2wtZHNwaS50eHQKQEAgLTEwLDYgKzEwLDcgQEAKIC0gcGluY3RybC1uYW1lczogbXVzdCBjb250YWluIGEgImRlZmF1bHQiIGVudHJ5LgogLSBzcGktbnVtLWNoaXBzZWxlY3RzIDogdGhlIG51bWJlciBvZiB0aGUgY2hpcHNlbGVjdCBzaWduYWxzLgogLSBidXMtbnVtIDogdGhlIHNsYXZlIGNoaXAgY2hpcHNlbGVjdCBzaWduYWwgbnVtYmVyLgorLSBiaWctZW5kaWFuIDogaWYgRFNQSSBtb2R1ZGxlIGlzIGJpZyBlbmRpYW4sIHRoZSBib29sIHdpbGwgYmUgc2V0IGluIG5vZGUuCiBFeGFtcGxlOgogCiBkc3BpMEA0MDAyYzAwMCB7CkBAIC0yNCw2ICsyNSw3IEBACiAJYnVzLW51bSA9IDwwPjsKIAlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOwogCXBpbmN0cmwtMCA9IDwmcGluY3RybF9kc3BpMF8xPjsKKwliaWctZW5kaWFuOwogCXN0YXR1cyA9ICJva2F5IjsKIAogCXNmbGFzaDogYXQyNmRmMDgxYUAwIHsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLXJzcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktcnNwaS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU3ZDgyYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLXJzcGkudHh0CkBAIC0wLDAgKzEsNjEgQEAKK0RldmljZSB0cmVlIGNvbmZpZ3VyYXRpb24gZm9yIFJlbmVzYXMgUlNQSS9RU1BJIGRyaXZlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlICAgICAgIDogRm9yIFJlbmVzYXMgU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIG9uIGxlZ2FjeSBTSDoKKwkJICAgICAicmVuZXNhcyxyc3BpLTxzb2N0eXBlPiIsICJyZW5lc2FzLHJzcGkiIGFzIGZhbGxiYWNrLgorCQkgICAgIEZvciBSZW5lc2FzIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSBvbiBSWi9BMUg6CisJCSAgICAgInJlbmVzYXMscnNwaS08c29jdHlwZT4iLCAicmVuZXNhcyxyc3BpLXJ6IiBhcyBmYWxsYmFjay4KKwkJICAgICBGb3IgUXVhZCBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2Ugb24gUi1DYXIgR2VuMjoKKwkJICAgICAicmVuZXNhcyxxc3BpLTxzb2N0eXBlPiIsICJyZW5lc2FzLHFzcGkiIGFzIGZhbGxiYWNrLgorCQkgICAgIEV4YW1wbGVzIHdpdGggc29jdHlwZXMgYXJlOgorCQkgICAgICAgIC0gInJlbmVzYXMscnNwaS1zaDc3NTciIChTSCkKKwkJCS0gInJlbmVzYXMscnNwaS1yN3M3MjEwMCIgKFJaL0ExSCkKKwkJCS0gInJlbmVzYXMscXNwaS1yOGE3NzkwIiAoUi1DYXIgSDIpCisJCQktICJyZW5lc2FzLHFzcGktcjhhNzc5MSIgKFItQ2FyIE0yKQorLSByZWcgICAgICAgICAgICAgIDogQWRkcmVzcyBzdGFydCBhbmQgYWRkcmVzcyByYW5nZSBzaXplIG9mIHRoZSBkZXZpY2UKKy0gaW50ZXJydXB0cyAgICAgICA6IEEgbGlzdCBvZiBpbnRlcnJ1cHQtc3BlY2lmaWVycywgb25lIGZvciBlYWNoIGVudHJ5IGluCisJCSAgICAgaW50ZXJydXB0LW5hbWVzLgorCQkgICAgIElmIGludGVycnVwdC1uYW1lcyBpcyBub3QgcHJlc2VudCwgYW4gaW50ZXJydXB0IHNwZWNpZmllcgorCQkgICAgIGZvciBhIHNpbmdsZSBtdXhlZCBpbnRlcnJ1cHQuCistIGludGVycnVwdC1uYW1lcyAgOiBBIGxpc3Qgb2YgaW50ZXJydXB0IG5hbWVzLiBTaG91bGQgY29udGFpbiAoaWYgcHJlc2VudCk6CisJCSAgICAgICAtICJlcnJvciIgZm9yIFNQRUksCisJCSAgICAgICAtICJyeCIgZm9yIFNQUkksCisJCSAgICAgICAtICJ0eCIgdG8gU1BUSSwKKwkJICAgICAgIC0gIm11eCIgZm9yIGEgc2luZ2xlIG11eGVkIGludGVycnVwdC4KKy0gaW50ZXJydXB0LXBhcmVudCA6IFRoZSBwaGFuZGxlIGZvciB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgdGhhdAorCQkgICAgIHNlcnZpY2VzIGludGVycnVwdHMgZm9yIHRoaXMgZGV2aWNlLgorLSBudW0tY3MJICAgOiBOdW1iZXIgb2YgY2hpcCBzZWxlY3RzLiBTb21lIFJTUEkgY29yZXMgaGF2ZSBtb3JlIHRoYW4gMS4KKy0gI2FkZHJlc3MtY2VsbHMgICA6IE11c3QgYmUgPDE+CistICNzaXplLWNlbGxzICAgICAgOiBNdXN0IGJlIDwwPgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBjbG9ja3MgICAgICAgICAgIDogTXVzdCBjb250YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbmFsIGNsb2NrLgorCitQaW5jdHJsIHByb3BlcnRpZXMgbWlnaHQgYmUgbmVlZGVkLCB0b28uICBTZWUKK0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3JlbmVzYXMsKi4KKworRXhhbXBsZXM6CisKKwlzcGkwOiBzcGlAZTgwMGM4MDAgeworCQljb21wYXRpYmxlID0gInJlbmVzYXMscnNwaS1yN3M3MjEwMCIsICJyZW5lc2FzLHJzcGktcnoiOworCQlyZWcgPSA8MHhlODAwYzgwMCAweDI0PjsKKwkJaW50ZXJydXB0cyA9IDwwIDIzOCBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJCSAgICAgPDAgMjM5IElSUV9UWVBFX0xFVkVMX0hJR0g+LAorCQkJICAgICA8MCAyNDAgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCWludGVycnVwdC1uYW1lcyA9ICJlcnJvciIsICJyeCIsICJ0eCI7CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CisJCW51bS1jcyA9IDwxPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCX07CisKKwlzcGk6IHNwaUBlNmIxMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicmVuZXNhcyxxc3BpLXI4YTc3OTEiLCAicmVuZXNhcyxxc3BpIjsKKwkJcmVnID0gPDAgMHhlNmIxMDAwMCAwIDB4MmM+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OworCQlpbnRlcnJ1cHRzID0gPDAgMTg0IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQljbG9ja3MgPSA8Jm1zdHA5X2Nsa3MgUjhBNzc5MV9DTEtfUVNQSV9NT0Q+OworCQludW0tY3MgPSA8MT47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktc3VuNGkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktc3VuNGkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlODI3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1zdW40aS50eHQKQEAgLTAsMCArMSwyNCBAQAorQWxsd2lubmVyIEExMCBTUEkgY29udHJvbGxlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgImFsbHdpbm5lcixzdW40LWExMC1zcGkiLgorLSByZWc6IFNob3VsZCBjb250YWluIHJlZ2lzdGVyIGxvY2F0aW9uIGFuZCBsZW5ndGguCistIGludGVycnVwdHM6IFNob3VsZCBjb250YWluIGludGVycnVwdC4KKy0gY2xvY2tzOiBwaGFuZGxlIHRvIHRoZSBjbG9ja3MgZmVlZGluZyB0aGUgU1BJIGNvbnRyb2xsZXIuIFR3byBhcmUKKyAgICAgICAgICBuZWVkZWQ6CisgIC0gImFoYiI6IHRoZSBnYXRlZCBBSEIgcGFyZW50IGNsb2NrCisgIC0gIm1vZCI6IHRoZSBwYXJlbnQgbW9kdWxlIGNsb2NrCistIGNsb2NrLW5hbWVzOiBNdXN0IGNvbnRhaW4gdGhlIGNsb2NrIG5hbWVzIGRlc2NyaWJlZCBqdXN0IGFib3ZlCisKK0V4YW1wbGU6CisKK3NwaTE6IHNwaUAwMWMwNjAwMCB7CisJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXNwaSI7CisJcmVnID0gPDB4MDFjMDYwMDAgMHgxMDAwPjsKKwlpbnRlcnJ1cHRzID0gPDExPjsKKwljbG9ja3MgPSA8JmFoYl9nYXRlcyAyMT4sIDwmc3BpMV9jbGs+OworCWNsb2NrLW5hbWVzID0gImFoYiIsICJtb2QiOworCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MD47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktc3VuNmkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktc3VuNmkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZGU3M2QKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1zdW42aS50eHQKQEAgLTAsMCArMSwyNCBAQAorQWxsd2lubmVyIEEzMSBTUEkgY29udHJvbGxlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgImFsbHdpbm5lcixzdW42aS1hMzEtc3BpIi4KKy0gcmVnOiBTaG91bGQgY29udGFpbiByZWdpc3RlciBsb2NhdGlvbiBhbmQgbGVuZ3RoLgorLSBpbnRlcnJ1cHRzOiBTaG91bGQgY29udGFpbiBpbnRlcnJ1cHQuCistIGNsb2NrczogcGhhbmRsZSB0byB0aGUgY2xvY2tzIGZlZWRpbmcgdGhlIFNQSSBjb250cm9sbGVyLiBUd28gYXJlCisgICAgICAgICAgbmVlZGVkOgorICAtICJhaGIiOiB0aGUgZ2F0ZWQgQUhCIHBhcmVudCBjbG9jaworICAtICJtb2QiOiB0aGUgcGFyZW50IG1vZHVsZSBjbG9jaworLSBjbG9jay1uYW1lczogTXVzdCBjb250YWluIHRoZSBjbG9jayBuYW1lcyBkZXNjcmliZWQganVzdCBhYm92ZQorLSByZXNldHM6IHBoYW5kbGUgdG8gdGhlIHJlc2V0IGNvbnRyb2xsZXIgYXNzZXJ0aW5nIHRoaXMgZGV2aWNlIGluCisgICAgICAgICAgcmVzZXQKKworRXhhbXBsZToKKworc3BpMTogc3BpQDAxYzY5MDAwIHsKKwljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW42aS1hMzEtc3BpIjsKKwlyZWcgPSA8MHgwMWM2OTAwMCAweDEwMDA+OworCWludGVycnVwdHMgPSA8MCA2NiA0PjsKKwljbG9ja3MgPSA8JmFoYjFfZ2F0ZXMgMjE+LCA8JnNwaTFfY2xrPjsKKwljbG9jay1uYW1lcyA9ICJhaGIiLCAibW9kIjsKKwlyZXNldHMgPSA8JmFoYjFfcnN0IDIxPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS14dGVuc2EteHRmcGdhLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLXh0ZW5zYS14dGZwZ2EudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZWJlMmIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS14dGVuc2EteHRmcGdhLnR4dApAQCAtMCwwICsxLDkgQEAKK0NhZGVuY2UgWHRlbnNhIFhURlBHQSBwbGF0Zm9ybSBTUEkgY29udHJvbGxlci4KKworVGhpcyBzaW1wbGUgU1BJIG1hc3RlciBjb250cm9sbGVyIGlzIGJ1aWx0IGludG8geHRmcGdhIGJpdHN0cmVhbXMgYW5kIGlzIHVzZWQKK3RvIGNvbnRyb2wgZGF1Z2h0ZXJib2FyZCBhdWRpbyBjb2RlYy4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJjZG5zLHh0ZnBnYS1zcGkiLgorLSByZWc6IHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgY29udHJvbGxlciBhbmQgbGVuZ3RoIG9mIG1lbW9yeSBtYXBwZWQKKyAgcmVnaW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwbWkvcWNvbSxzcG1pLXBtaWMtYXJiLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcG1pL3Fjb20sc3BtaS1wbWljLWFyYi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE1ZDA5OQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcG1pL3Fjb20sc3BtaS1wbWljLWFyYi50eHQKQEAgLTAsMCArMSw2MSBAQAorUXVhbGNvbW0gU1BNSSBDb250cm9sbGVyIChQTUlDIEFyYml0ZXIpCisKK1RoZSBTUE1JIFBNSUMgQXJiaXRlciBpcyBmb3VuZCBvbiB0aGUgU25hcGRyYWdvbiA4MDAgU2VyaWVzLiAgSXQgaXMgYW4gU1BNSQorY29udHJvbGxlciB3aXRoIHdyYXBwaW5nIGFyYml0cmF0aW9uIGxvZ2ljIHRvIGFsbG93IGZvciBtdWx0aXBsZSBvbi1jaGlwCitkZXZpY2VzIHRvIGNvbnRyb2wgYSBzaW5nbGUgU1BNSSBtYXN0ZXIuCisKK1RoZSBQTUlDIEFyYml0ZXIgY2FuIGFsc28gYWN0IGFzIGFuIGludGVycnVwdCBjb250cm9sbGVyLCBwcm92aWRpbmcgaW50ZXJydXB0cwordG8gc2xhdmUgZGV2aWNlcy4KKworU2VlIHNwbWkudHh0IGZvciB0aGUgZ2VuZXJpYyBTUE1JIGNvbnRyb2xsZXIgYmluZGluZyByZXF1aXJlbWVudHMgZm9yIGNoaWxkCitub2Rlcy4KKworU2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9pbnRlcnJ1cHRzLnR4dCBmb3IKK2dlbmVyaWMgaW50ZXJydXB0IGNvbnRyb2xsZXIgYmluZGluZyBkb2N1bWVudGF0aW9uLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlICJxY29tLHNwbWktcG1pYy1hcmIiLgorLSByZWctbmFtZXMgIDogbXVzdCBjb250YWluOgorICAgICAiY29yZSIgLSBjb3JlIHJlZ2lzdGVycworICAgICAiaW50ciIgLSBpbnRlcnJ1cHQgY29udHJvbGxlciByZWdpc3RlcnMKKyAgICAgImNuZmciIC0gY29uZmlndXJhdGlvbiByZWdpc3RlcnMKKy0gcmVnIDogYWRkcmVzcyArIHNpemUgcGFpcnMgZGVzY3JpYmluZyB0aGUgUE1JQyBhcmIgcmVnaXN0ZXIgc2V0czsgb3JkZXIgbXVzdAorICAgICAgICBjb3JyZXNwb25kIHdpdGggdGhlIG9yZGVyIG9mIGVudHJpZXMgaW4gcmVnLW5hbWVzCistICNhZGRyZXNzLWNlbGxzIDogbXVzdCBiZSBzZXQgdG8gMgorLSAjc2l6ZS1jZWxscyA6IG11c3QgYmUgc2V0IHRvIDAKKy0gcWNvbSxlZSA6IGluZGljYXRlcyB0aGUgYWN0aXZlIEV4ZWN1dGlvbiBFbnZpcm9ubWVudCBpZGVudGlmaWVyICgwLTUpCistIHFjb20sY2hhbm5lbCA6IHdoaWNoIG9mIHRoZSBQTUlDIEFyYiBwcm92aWRlZCBjaGFubmVscyB0byB1c2UgZm9yIGFjY2Vzc2VzICgwLTUpCistIGludGVycnVwdHMgOiBpbnRlcnJ1cHQgbGlzdCBmb3IgdGhlIFBNSUMgQXJiIGNvbnRyb2xsZXIsIG11c3QgY29udGFpbiBhCisgICAgICAgICAgICAgICBzaW5nbGUgaW50ZXJydXB0IGVudHJ5IGZvciB0aGUgcGVyaXBoZXJhbCBpbnRlcnJ1cHQKKy0gaW50ZXJydXB0LW5hbWVzIDogY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQgbmFtZXMgZm9yIHRoZSBpbnRlcnJ1cHRzCisgICAgICAgICAgICAgICAgICAgIGxpc3RlZCBpbiB0aGUgJ2ludGVycnVwdHMnIHByb3BlcnR5LCBtdXN0IGNvbnRhaW46CisgICAgICJwZXJpcGhfaXJxIiAtIHN1bW1hcnkgaW50ZXJydXB0IGZvciBQTUlDIHBlcmlwaGVyYWxzCistIGludGVycnVwdC1jb250cm9sbGVyIDogYm9vbGVhbiBpbmRpY2F0b3IgdGhhdCB0aGUgUE1JQyBhcmJpdGVyIGlzIGFuIGludGVycnVwdCBjb250cm9sbGVyCistICNpbnRlcnJ1cHQtY2VsbHMgOiAgbXVzdCBiZSBzZXQgdG8gNC4gSW50ZXJydXB0cyBhcmUgc3BlY2lmaWVkIGFzIGEgNC10dXBsZToKKyAgICBjZWxsIDE6IHNsYXZlIElEIGZvciB0aGUgcmVxdWVzdGVkIGludGVycnVwdCAoMC0xNSkKKyAgICBjZWxsIDI6IHBlcmlwaGVyYWwgSUQgZm9yIHJlcXVlc3RlZCBpbnRlcnJ1cHQgKDAtMjU1KQorICAgIGNlbGwgMzogdGhlIHJlcXVlc3RlZCBwZXJpcGhlcmFsIGludGVycnVwdCAoMC03KQorICAgIGNlbGwgNDogaW50ZXJydXB0IGZsYWdzIGluZGljYXRpbmcgbGV2ZWwtc2Vuc2UgaW5mb3JtYXRpb24sIGFzIGRlZmluZWQgaW4KKyAgICAgICAgICAgIGR0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2lycS5oCisKK0V4YW1wbGU6CisKKwlzcG1pIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHNwbWktcG1pYy1hcmIiOworCQlyZWctbmFtZXMgPSAiY29yZSIsICJpbnRyIiwgImNuZmciOworCQlyZWcgPSA8MHhmYzRjZjAwMCAweDEwMDA+LAorCQkgICAgICA8MHhmYzRjYjAwMCAweDEwMDA+LAorCQkgICAgICA8MHhmYzRjYTAwMCAweDEwMDA+OworCisJCWludGVycnVwdC1uYW1lcyA9ICJwZXJpcGhfaXJxIjsKKwkJaW50ZXJydXB0cyA9IDwwIDE5MCAwPjsKKworCQlxY29tLGVlID0gPDA+OworCQlxY29tLGNoYW5uZWwgPSA8MD47CisKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCWludGVycnVwdC1jb250cm9sbGVyOworCQkjaW50ZXJydXB0LWNlbGxzID0gPDQ+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BtaS9zcG1pLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcG1pL3NwbWkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MmE0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BtaS9zcG1pLnR4dApAQCAtMCwwICsxLDQxIEBACitTeXN0ZW0gUG93ZXIgTWFuYWdlbWVudCBJbnRlcmZhY2UgKFNQTUkpIENvbnRyb2xsZXIKKworVGhpcyBkb2N1bWVudCBkZWZpbmVzIGEgZ2VuZXJpYyBzZXQgb2YgYmluZGluZ3MgZm9yIHVzZSBieSBTUE1JIGNvbnRyb2xsZXJzLiAgQQorY29udHJvbGxlciBpcyBtb2RlbGxlZCBpbiBkZXZpY2UgdHJlZSBhcyBhIG5vZGUgd2l0aCB6ZXJvIG9yIG1vcmUgY2hpbGQgbm9kZXMsCitlYWNoIHJlcHJlc2VudGluZyBhIHVuaXF1ZSBzbGF2ZSBvbiB0aGUgYnVzLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSAjYWRkcmVzcy1jZWxscyA6IG11c3QgYmUgc2V0IHRvIDIKKy0gI3NpemUtY2VsbHMgOiBtdXN0IGJlIHNldCB0byAwCisKK0NoaWxkIG5vZGVzOgorCitBbiBTUE1JIGNvbnRyb2xsZXIgbm9kZSBjYW4gY29udGFpbiB6ZXJvIG9yIG1vcmUgY2hpbGQgbm9kZXMgcmVwcmVzZW50aW5nIHNsYXZlCitkZXZpY2VzIG9uIHRoZSBidXMuICBDaGlsZCAncmVnJyBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQgYXMgYW4gYWRkcmVzcywgdHlwZQorcGFpci4gIFRoZSBhZGRyZXNzIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAtMTUgKDQgYml0cykuICBUaGUgdHlwZSBtdXN0IGJlIG9uZSBvZgorU1BNSV9VU0lEICgwKSBvciBTUE1JX0dTSUQgKDEpIGZvciBVbmlxdWUgU2xhdmUgSUQgb3IgR3JvdXAgU2xhdmUgSUQgcmVzcGVjdGl2ZWx5LgorVGhlc2UgYXJlIHRoZSBpZGVudGlmaWVycyAic3RhdGljYWxseSBhc3NpZ25lZCBieSB0aGUgc3lzdGVtIGludGVncmF0b3IiLCBhcworcGVyIHRoZSBTUE1JIHNwZWMuCisKK0VhY2ggY2hpbGQgbm9kZSBtdXN0IGhhdmUgb25lIGFuZCBvbmx5IG9uZSAncmVnJyBlbnRyeSBvZiB0eXBlIFNQTUlfVVNJRC4KKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL3NwbWkvc3BtaS5oPgorCisJc3BtaUAuLiB7CisJCWNvbXBhdGlibGUgPSAiLi4uIjsKKwkJcmVnID0gPC4uLj47CisKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzIDwwPjsKKworCQljaGlsZEAwIHsKKwkJCWNvbXBhdGlibGUgPSAiLi4uIjsKKwkJCXJlZyA9IDwwIFNQTUlfVVNJRD47CisJCX07CisKKwkJY2hpbGRANyB7CisJCQljb21wYXRpYmxlID0gIi4uLiI7CisJCQlyZWcgPSA8NyBTUE1JX1VTSUQKKwkJCSAgICAgICAzIFNQTUlfR1NJRD47CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zdGFnaW5nL2lteC1kcm0vZnNsLWlteC1kcm0udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3N0YWdpbmcvaW14LWRybS9mc2wtaW14LWRybS50eHQKaW5kZXggYjg3NmQ0OS4uM2JlNWNlNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3N0YWdpbmcvaW14LWRybS9mc2wtaW14LWRybS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3N0YWdpbmcvaW14LWRybS9mc2wtaW14LWRybS50eHQKQEAgLTEsMyArMSwyMiBAQAorRnJlZXNjYWxlIGkuTVggRFJNIG1hc3RlciBkZXZpY2UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBmcmVlc2NhbGUgaS5NWCBEUk0gbWFzdGVyIGRldmljZSBpcyBhIHZpcnR1YWwgZGV2aWNlIG5lZWRlZCB0byBsaXN0IGFsbAorSVBVIG9yIG90aGVyIGRpc3BsYXkgaW50ZXJmYWNlIG5vZGVzIHRoYXQgY29tcHJpc2UgdGhlIGdyYXBoaWNzIHN1YnN5c3RlbS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJmc2wsaW14LWRpc3BsYXktc3Vic3lzdGVtIgorLSBwb3J0czogU2hvdWxkIGNvbnRhaW4gYSBsaXN0IG9mIHBoYW5kbGVzIHBvaW50aW5nIHRvIGRpc3BsYXkgaW50ZXJmYWNlIHBvcnRzCisgIG9mIElQVSBkZXZpY2VzCisKK2V4YW1wbGU6CisKK2Rpc3BsYXktc3Vic3lzdGVtIHsKKwljb21wYXRpYmxlID0gImZzbCxkaXNwbGF5LXN1YnN5c3RlbSI7CisJcG9ydHMgPSA8JmlwdV9kaTA+OworfTsKKworCiBGcmVlc2NhbGUgaS5NWCBJUFV2MwogPT09PT09PT09PT09PT09PT09PT0KIApAQCAtNywxOCArMjYsMzEgQEAKICAgZGF0YXNoZWV0CiAtIGludGVycnVwdHM6IFNob3VsZCBjb250YWluIHN5bmMgaW50ZXJydXB0IGFuZCBlcnJvciBpbnRlcnJ1cHQsCiAgIGluIHRoaXMgb3JkZXIuCi0tICNjcnRjLWNlbGxzOiAxLCBTZWUgYmVsb3cKIC0gcmVzZXRzOiBwaGFuZGxlIHBvaW50aW5nIHRvIHRoZSBzeXN0ZW0gcmVzZXQgY29udHJvbGxlciBhbmQKICAgICAgICAgICByZXNldCBsaW5lIGluZGV4LCBzZWUgcmVzZXQvZnNsLGlteC1zcmMudHh0IGZvciBkZXRhaWxzCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBwb3J0QFswLTNdOiBQb3J0IG5vZGVzIHdpdGggZW5kcG9pbnQgZGVmaW5pdGlvbnMgYXMgZGVmaW5lZCBpbgorICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8taW50ZXJmYWNlcy50eHQuCisgIFBvcnRzIDAgYW5kIDEgc2hvdWxkIGNvcnJlc3BvbmQgdG8gQ1NJMCBhbmQgQ1NJMSwKKyAgcG9ydHMgMiBhbmQgMyBzaG91bGQgY29ycmVzcG9uZCB0byBESTAgYW5kIERJMSwgcmVzcGVjdGl2ZWx5LgogCiBleGFtcGxlOgogCiBpcHU6IGlwdUAxODAwMDAwMCB7Ci0JI2NydGMtY2VsbHMgPSA8MT47CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MD47CiAJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtaXB1IjsKIAlyZWcgPSA8MHgxODAwMDAwMCAweDA4MDAwMDAwMD47CiAJaW50ZXJydXB0cyA9IDwxMSAxMD47CiAJcmVzZXRzID0gPCZzcmMgMj47CisKKwlpcHVfZGkwOiBwb3J0QDIgeworCQlyZWcgPSA8Mj47CisKKwkJaXB1X2RpMF9kaXNwMDogZW5kcG9pbnQgeworCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZkaXNwbGF5X2luPjsKKwkJfTsKKwl9OwogfTsKIAogUGFyYWxsZWwgZGlzcGxheSBzdXBwb3J0CkBAIC0yNiwxOSArNTgsMjUgQEAKIAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJmc2wsaW14LXBhcmFsbGVsLWRpc3BsYXkiCi0tIGNydGM6IHRoZSBjcnRjIHRoaXMgZGlzcGxheSBpcyBjb25uZWN0ZWQgdG8sIHNlZSBiZWxvdwogT3B0aW9uYWwgcHJvcGVydGllczoKIC0gaW50ZXJmYWNlX3BpeF9mbXQ6IEhvdyB0aGlzIGRpc3BsYXkgaXMgY29ubmVjdGVkIHRvIHRoZQotICBjcnRjLiBDdXJyZW50bHkgc3VwcG9ydGVkIHR5cGVzOiAicmdiMjQiLCAicmdiNTY1IiwgImJncjY2NiIKKyAgZGlzcGxheSBpbnRlcmZhY2UuIEN1cnJlbnRseSBzdXBwb3J0ZWQgdHlwZXM6ICJyZ2IyNCIsICJyZ2I1NjUiLCAiYmdyNjY2IgogLSBlZGlkOiB2ZXJiYXRpbSBFRElEIGRhdGEgYmxvY2sgZGVzY3JpYmluZyBhdHRhY2hlZCBkaXNwbGF5LgogLSBkZGM6IHBoYW5kbGUgZGVzY3JpYmluZyB0aGUgaTJjIGJ1cyBoYW5kbGluZyB0aGUgZGlzcGxheSBkYXRhCiAgIGNoYW5uZWwKKy0gcG9ydDogQSBwb3J0IG5vZGUgd2l0aCBlbmRwb2ludCBkZWZpbml0aW9ucyBhcyBkZWZpbmVkIGluCisgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZWRpYS92aWRlby1pbnRlcmZhY2VzLnR4dC4KIAogZXhhbXBsZToKIAogZGlzcGxheUBkaTAgewogCWNvbXBhdGlibGUgPSAiZnNsLGlteC1wYXJhbGxlbC1kaXNwbGF5IjsKIAllZGlkID0gW2VkaWQtZGF0YV07Ci0JY3J0YyA9IDwmaXB1IDA+OwogCWludGVyZmFjZS1waXgtZm10ID0gInJnYjI0IjsKKworCXBvcnQgeworCQlkaXNwbGF5X2luOiBlbmRwb2ludCB7CisJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdV9kaTBfZGlzcDA+OworCQl9OworCX07CiB9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3N0YWdpbmcvaW14LWRybS9oZG1pLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zdGFnaW5nL2lteC1kcm0vaGRtaS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI3NTZjZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zdGFnaW5nL2lteC1kcm0vaGRtaS50eHQKQEAgLTAsMCArMSw1OCBAQAorRGV2aWNlLVRyZWUgYmluZGluZ3MgZm9yIEhETUkgVHJhbnNtaXR0ZXIKKworSERNSSBUcmFuc21pdHRlcgorPT09PT09PT09PT09PT09PQorCitUaGUgSERNSSBUcmFuc21pdHRlciBpcyBhIFN5bm9wc3lzIERlc2lnbldhcmUgSERNSSAxLjQgVFggY29udHJvbGxlciBJUAord2l0aCBhY2NvbXBhbnlpbmcgUEhZIElQLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gI2FkZHJlc3MtY2VsbHMgOiBzaG91bGQgYmUgPDE+CisgLSAjc2l6ZS1jZWxscyA6IHNob3VsZCBiZSA8MD4KKyAtIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgImZzbCxpbXg2cS1oZG1pIiBvciAiZnNsLGlteDZkbC1oZG1pIi4KKyAtIGdwciA6IHNob3VsZCBiZSA8Jmdwcj4uCisgICBUaGUgcGhhbmRsZSBwb2ludHMgdG8gdGhlIGlvbXV4Yy1ncHIgcmVnaW9uIGNvbnRhaW5pbmcgdGhlIEhETUkKKyAgIG11bHRpcGxleGVyIGNvbnRyb2wgcmVnaXN0ZXIuCisgLSBjbG9ja3MsIGNsb2NrLW5hbWVzIDogcGhhbmRsZXMgdG8gdGhlIEhETUkgaWFoYiBhbmQgaXNyZiBjbG9ja3MsIGFzIGRlc2NyaWJlZAorICAgaW4gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2Nsb2NrLWJpbmRpbmdzLnR4dCBhbmQKKyAgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9pbXg2cS1jbG9jay50eHQuCisgLSBwb3J0QFswLTRdOiBVcCB0byBmb3VyIHBvcnQgbm9kZXMgd2l0aCBlbmRwb2ludCBkZWZpbml0aW9ucyBhcyBkZWZpbmVkIGluCisgICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8taW50ZXJmYWNlcy50eHQsCisgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBmb3VyIGlucHV0cyB0byB0aGUgSERNSSBtdWx0aXBsZXhlci4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKyAtIGRkYy1pMmMtYnVzOiBwaGFuZGxlIG9mIGFuIEkyQyBjb250cm9sbGVyIHVzZWQgZm9yIEREQyBFRElEIHByb2JpbmcKKworZXhhbXBsZToKKworCWdwcjogaW9tdXhjLWdwckAwMjBlMDAwMCB7CisJCS8qIC4uLiAqLworCX07CisKKyAgICAgICAgaGRtaTogaGRtaUAwMTIwMDAwIHsKKyAgICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwxPjsKKyAgICAgICAgICAgICAgICAjc2l6ZS1jZWxscyA9IDwwPjsKKyAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gImZzbCxpbXg2cS1oZG1pIjsKKyAgICAgICAgICAgICAgICByZWcgPSA8MHgwMDEyMDAwMCAweDkwMDA+OworICAgICAgICAgICAgICAgIGludGVycnVwdHMgPSA8MCAxMTUgMHgwND47CisgICAgICAgICAgICAgICAgZ3ByID0gPCZncHI+OworICAgICAgICAgICAgICAgIGNsb2NrcyA9IDwmY2xrcyAxMjM+LCA8JmNsa3MgMTI0PjsKKyAgICAgICAgICAgICAgICBjbG9jay1uYW1lcyA9ICJpYWhiIiwgImlzZnIiOworICAgICAgICAgICAgICAgIGRkYy1pMmMtYnVzID0gPCZpMmMyPjsKKworICAgICAgICAgICAgICAgIHBvcnRAMCB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8MD47CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkbWlfbXV4XzA6IGVuZHBvaW50IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlLWVuZHBvaW50ID0gPCZpcHUxX2RpMF9oZG1pPjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHBvcnRAMSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8MT47CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkbWlfbXV4XzE6IGVuZHBvaW50IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlLWVuZHBvaW50ID0gPCZpcHUxX2RpMV9oZG1pPjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zdGFnaW5nL2lteC1kcm0vbGRiLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zdGFnaW5nL2lteC1kcm0vbGRiLnR4dAppbmRleCBlZDkzNzc4Li41NzhhMWZjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3RhZ2luZy9pbXgtZHJtL2xkYi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3N0YWdpbmcvaW14LWRybS9sZGIudHh0CkBAIC01MCwxMiArNTAsMTQgQEAKIAogUmVxdWlyZWQgcHJvcGVydGllczoKICAtIHJlZyA6IHNob3VsZCBiZSA8MD4gb3IgPDE+Ci0gLSBjcnRjcyA6IGEgbGlzdCBvZiBwaGFuZGxlcyB3aXRoIGluZGV4IHBvaW50aW5nIHRvIHRoZSBJUFUgZGlzcGxheSBpbnRlcmZhY2VzCi0gICAgICAgICAgIHRoYXQgY2FuIGJlIHVzZWQgYXMgdmlkZW8gc291cmNlIGZvciB0aGlzIGNoYW5uZWwuCiAgLSBmc2wsZGF0YS1tYXBwaW5nIDogc2hvdWxkIGJlICJzcHdnIiBvciAiamVpZGEiCiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBkZXNjcmliZXMgaG93IHRoZSBjb2xvciBiaXRzIGFyZSBsYWlkIG91dCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkIExWRFMgc2lnbmFsLgogIC0gZnNsLGRhdGEtd2lkdGggOiBzaG91bGQgYmUgPDE4PiBvciA8MjQ+CisgLSBwb3J0OiBBIHBvcnQgbm9kZSB3aXRoIGVuZHBvaW50IGRlZmluaXRpb25zIGFzIGRlZmluZWQgaW4KKyAgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZWRpYS92aWRlby1pbnRlcmZhY2VzLnR4dC4KKyAgIE9uIGkuTVg2LCB0aGVyZSBzaG91bGQgYmUgZm91ciBwb3J0cyAocG9ydEBbMC0zXSkgdGhhdCBjb3JyZXNwb25kCisgICB0byB0aGUgZm91ciBMVkRTIG11bHRpcGxleGVyIGlucHV0cy4KIAogZXhhbXBsZToKIApAQCAtNzcsMjMgKzc5LDMzIEBACiAKIAlsdmRzLWNoYW5uZWxAMCB7CiAJCXJlZyA9IDwwPjsKLQkJY3J0Y3MgPSA8JmlwdSAwPjsKIAkJZnNsLGRhdGEtbWFwcGluZyA9ICJzcHdnIjsKIAkJZnNsLGRhdGEtd2lkdGggPSA8MjQ+OwogCiAJCWRpc3BsYXktdGltaW5ncyB7CiAJCQkvKiAuLi4gKi8KIAkJfTsKKworCQlwb3J0IHsKKwkJCWx2ZHMwX2luOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHVfZGkwX2x2ZHMwPjsKKwkJCX07CisJCX07CiAJfTsKIAogCWx2ZHMtY2hhbm5lbEAxIHsKIAkJcmVnID0gPDE+OwotCQljcnRjcyA9IDwmaXB1IDE+OwogCQlmc2wsZGF0YS1tYXBwaW5nID0gInNwd2ciOwogCQlmc2wsZGF0YS13aWR0aCA9IDwyND47CiAKIAkJZGlzcGxheS10aW1pbmdzIHsKIAkJCS8qIC4uLiAqLwogCQl9OworCisJCXBvcnQgeworCQkJbHZkczFfaW46IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdV9kaTFfbHZkczE+OworCQkJfTsKKwkJfTsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aW1lci9hbGx3aW5uZXIsc3VuNGktdGltZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RpbWVyL2FsbHdpbm5lcixzdW40aS10aW1lci50eHQKaW5kZXggNDhhZWI3OC4uNWMyZTIzNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RpbWVyL2FsbHdpbm5lcixzdW40aS10aW1lci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RpbWVyL2FsbHdpbm5lcixzdW40aS10aW1lci50eHQKQEAgLTIsNyArMiw3IEBACiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAKLS0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAiYWxsd2lubmVyLHN1bjRpLXRpbWVyIgorLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlICJhbGx3aW5uZXIsc3VuNGktYTEwLXRpbWVyIgogLSByZWcgOiBTcGVjaWZpZXMgYmFzZSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBzaXplIG9mIHRoZSByZWdpc3RlcnMuCiAtIGludGVycnVwdHMgOiBUaGUgaW50ZXJydXB0IG9mIHRoZSBmaXJzdCB0aW1lcgogLSBjbG9ja3M6IHBoYW5kbGUgdG8gdGhlIHNvdXJjZSBjbG9jayAodXN1YWxseSBhIDI0IE1IeiBmaXhlZCBjbG9jaykKQEAgLTEwLDcgKzEwLDcgQEAKIEV4YW1wbGU6CiAKIHRpbWVyIHsKLQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS10aW1lciI7CisJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXRpbWVyIjsKIAlyZWcgPSA8MHgwMWMyMGMwMCAweDQwMD47CiAJaW50ZXJydXB0cyA9IDwyMj47CiAJY2xvY2tzID0gPCZvc2M+OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RpbWVyL3RpLGtleXN0b25lLXRpbWVyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aW1lci90aSxrZXlzdG9uZS10aW1lci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiZTM2MQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aW1lci90aSxrZXlzdG9uZS10aW1lci50eHQKQEAgLTAsMCArMSwyOSBAQAorKiBEZXZpY2UgdHJlZSBiaW5kaW5ncyBmb3IgVGV4YXMgaW5zdHJ1bWVudHMgS2V5c3RvbmUgdGltZXIKKworVGhpcyBkb2N1bWVudCBwcm92aWRlcyBiaW5kaW5ncyBmb3IgdGhlIDY0LWJpdCB0aW1lciBpbiB0aGUgS2V5U3RvbmUKK2FyY2hpdGVjdHVyZSBkZXZpY2VzLiBUaGUgdGltZXIgY2FuIGJlIGNvbmZpZ3VyZWQgYXMgYSBnZW5lcmFsLXB1cnBvc2UgNjQtYml0Cit0aW1lciwgZHVhbCBnZW5lcmFsLXB1cnBvc2UgMzItYml0IHRpbWVycy4gV2hlbiBjb25maWd1cmVkIGFzIGR1YWwgMzItYml0Cit0aW1lcnMsIGVhY2ggaGFsZiBjYW4gb3BlcmF0ZSBpbiBjb25qdW5jdGlvbiAoY2hhaW4gbW9kZSkgb3IgaW5kZXBlbmRlbnRseQorKHVuY2hhaW5lZCBtb2RlKSBvZiBlYWNoIG90aGVyLgorCitJdCBpcyBnbG9iYWwgdGltZXIgaXMgYSBmcmVlIHJ1bm5pbmcgdXAtY291bnRlciBhbmQgY2FuIGdlbmVyYXRlIGludGVycnVwdAord2hlbiB0aGUgY291bnRlciByZWFjaGVzIHByZXNldCBjb3VudGVyIHZhbHVlcy4KKworRG9jdW1lbnRhdGlvbjoKK2h0dHA6Ly93d3cudGkuY29tL2xpdC91Zy9zcHJ1Z3Y1YS9zcHJ1Z3Y1YS5wZGYKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlICJ0aSxrZXlzdG9uZS10aW1lciIuCistIHJlZyA6IHNwZWNpZmllcyBiYXNlIHBoeXNpY2FsIGFkZHJlc3MgYW5kIGNvdW50IG9mIHRoZSByZWdpc3RlcnMuCistIGludGVycnVwdHMgOiBpbnRlcnJ1cHQgZ2VuZXJhdGVkIGJ5IHRoZSB0aW1lci4KKy0gY2xvY2tzIDogdGhlIGNsb2NrIGZlZWRpbmcgdGhlIHRpbWVyIGNsb2NrLgorCitFeGFtcGxlOgorCit0aW1lckAyMmYwMDAwIHsKKwljb21wYXRpYmxlID0gInRpLGtleXN0b25lLXRpbWVyIjsKKwlyZWcgPSA8MHgwMjJmMDAwMCAweDgwPjsKKwlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMTEwIElSUV9UWVBFX0VER0VfUklTSU5HPjsKKwljbG9ja3MgPSA8JmNsa3RpbWVyMTU+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvY2ktaGRyYy1pbXgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9jaS1oZHJjLWlteC50eHQKaW5kZXggYjRiNWI3OS4uYTZhMzJjYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9jaS1oZHJjLWlteC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9jaS1oZHJjLWlteC50eHQKQEAgLTE4LDYgKzE4LDcgQEAKIC0gdmJ1cy1zdXBwbHk6IHJlZ3VsYXRvciBmb3IgdmJ1cwogLSBkaXNhYmxlLW92ZXItY3VycmVudDogZGlzYWJsZSBvdmVyIGN1cnJlbnQgZGV0ZWN0CiAtIGV4dGVybmFsLXZidXMtZGl2aWRlcjogZW5hYmxlcyBvZmYtY2hpcCByZXNpc3RvciBkaXZpZGVyIGZvciBWYnVzCistIG1heGltdW0tc3BlZWQ6IGxpbWl0IHRoZSBtYXhpbXVtIGNvbm5lY3Rpb24gc3BlZWQgdG8gImZ1bGwtc3BlZWQiLgogCiBFeGFtcGxlczoKIHVzYkAwMjE4NDAwMCB7IC8qIFVTQiBPVEcgKi8KQEAgLTI4LDQgKzI5LDUgQEAKIAlmc2wsdXNibWlzYyA9IDwmdXNibWlzYyAwPjsKIAlkaXNhYmxlLW92ZXItY3VycmVudDsKIAlleHRlcm5hbC12YnVzLWRpdmlkZXI7CisJbWF4aW11bS1zcGVlZCA9ICJmdWxsLXNwZWVkIjsKIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2NpLWhkcmMtemV2aW8udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9jaS1oZHJjLXpldmlvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmJjYjJhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9jaS1oZHJjLXpldmlvLnR4dApAQCAtMCwwICsxLDE3IEBACisqIExTSSBaZXZpbyBVU0IgT1RHIENvbnRyb2xsZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJsc2ksemV2aW8tdXNiIgorLSByZWc6IFNob3VsZCBjb250YWluIHJlZ2lzdGVycyBsb2NhdGlvbiBhbmQgbGVuZ3RoCistIGludGVycnVwdHM6IFNob3VsZCBjb250YWluIGNvbnRyb2xsZXIgaW50ZXJydXB0CisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHZidXMtc3VwcGx5OiByZWd1bGF0b3IgZm9yIHZidXMKKworRXhhbXBsZXM6CisJCXVzYjA6IHVzYkBiMDAwMDAwMCB7CisJCQlyZWcgPSA8MHhiMDAwMDAwMCAweDEwMDA+OworCQkJY29tcGF0aWJsZSA9ICJsc2ksemV2aW8tdXNiIjsKKwkJCWludGVycnVwdHMgPSA8OD47CisJCQl2YnVzLXN1cHBseSA9IDwmdmJ1c19yZWc+OworCQl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMy50eHQKaW5kZXggZTgwNzYzNS4uNDcxMzY2ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzMudHh0CkBAIC02LDExICs2LDEzIEBACiAgLSBjb21wYXRpYmxlOiBtdXN0IGJlICJzbnBzLGR3YzMiCiAgLSByZWcgOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZQogIC0gaW50ZXJydXB0czogSW50ZXJydXB0cyB1c2VkIGJ5IHRoZSBkd2MzIGNvbnRyb2xsZXIuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CiAgLSB1c2ItcGh5IDogYXJyYXkgb2YgcGhhbmRsZSBmb3IgdGhlIFBIWSBkZXZpY2UuICBUaGUgZmlyc3QgZWxlbWVudAogICAgaW4gdGhlIGFycmF5IGlzIGV4cGVjdGVkIHRvIGJlIGEgaGFuZGxlIHRvIHRoZSBVU0IyL0hTIFBIWSBhbmQKICAgIHRoZSBzZWNvbmQgZWxlbWVudCBpcyBleHBlY3RlZCB0byBiZSBhIGhhbmRsZSB0byB0aGUgVVNCMy9TUyBQSFkKLQotT3B0aW9uYWwgcHJvcGVydGllczoKKyAtIHBoeXM6IGZyb20gdGhlICpHZW5lcmljIFBIWSogYmluZGluZ3MKKyAtIHBoeS1uYW1lczogZnJvbSB0aGUgKkdlbmVyaWMgUEhZKiBiaW5kaW5ncwogIC0gdHgtZmlmby1yZXNpemU6IGRldGVybWluZXMgaWYgdGhlIEZJRk8gKmhhcyogdG8gYmUgcmVhbGxvY2F0ZWQuCiAKIFRoaXMgaXMgdXN1YWxseSBhIHN1Ym5vZGUgdG8gRFdDMyBnbHVlIHRvIHdoaWNoIGl0IGlzIGNvbm5lY3RlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvbXhzLXBoeS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL214cy1waHkudHh0CmluZGV4IDU4MzViMjcuLmNlZjE4MWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvbXhzLXBoeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9teHMtcGh5LnR4dApAQCAtMSwxMyArMSwxOSBAQAogKiBGcmVlc2NhbGUgTVhTIFVTQiBQaHkgRGV2aWNlCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGU6IFNob3VsZCBiZSAiZnNsLGlteDIzLXVzYnBoeSIKKy0gY29tcGF0aWJsZTogc2hvdWxkIGNvbnRhaW46CisJKiAiZnNsLGlteDIzLXVzYnBoeSIgZm9yIGlteDIzIGFuZCBpbXgyOAorCSogImZzbCxpbXg2cS11c2JwaHkiIGZvciBpbXg2ZHEgYW5kIGlteDZkbAorCSogImZzbCxpbXg2c2wtdXNicGh5IiBmb3IgaW14NnNsCisgICJmc2wsaW14MjMtdXNicGh5IiBpcyBzdGlsbCBhIGZhbGxiYWNrIGZvciBvdGhlciBzdHJpbmdzCiAtIHJlZzogU2hvdWxkIGNvbnRhaW4gcmVnaXN0ZXJzIGxvY2F0aW9uIGFuZCBsZW5ndGgKIC0gaW50ZXJydXB0czogU2hvdWxkIGNvbnRhaW4gcGh5IGludGVycnVwdAorLSBmc2wsYW5hdG9wOiBwaGFuZGxlIGZvciBhbmF0b3AgcmVnaXN0ZXIsIGl0IGlzIG9ubHkgZm9yIGlteDYgU29DIHNlcmllcwogCiBFeGFtcGxlOgogdXNicGh5MTogdXNicGh5QDAyMGM5MDAwIHsKIAljb21wYXRpYmxlID0gImZzbCxpbXg2cS11c2JwaHkiLCAiZnNsLGlteDIzLXVzYnBoeSI7CiAJcmVnID0gPDB4MDIwYzkwMDAgMHgxMDAwPjsKIAlpbnRlcnJ1cHRzID0gPDAgNDQgMHgwND47CisJZnNsLGFuYXRvcCA9IDwmYW5hdG9wPjsKIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL29tYXAtdXNiLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2Ivb21hcC11c2IudHh0CmluZGV4IGM0OTUxMzUuLjM4YjJmYWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2Ivb21hcC11c2IudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2Ivb21hcC11c2IudHh0CkBAIC03NiwyNyArNzYsMyBAQAogCXJhbmdlczsKIH07CiAKLU9NQVAgQ09OVFJPTCBVU0IKLQotUmVxdWlyZWQgcHJvcGVydGllczoKLSAtIGNvbXBhdGlibGU6IFNob3VsZCBiZSBvbmUgb2YKLSAidGksY29udHJvbC1waHktb3RnaHMiIC0gaWYgaXQgaGFzIG90Z2hzX2NvbnRyb2wgbWFpbGJveCByZWdpc3RlciBhcyBvbiBPTUFQNC4KLSAidGksY29udHJvbC1waHktdXNiMiIgLSBpZiBpdCBoYXMgUG93ZXIgZG93biBiaXQgaW4gY29udHJvbF9kZXZfY29uZiByZWdpc3RlcgotCQkJZS5nLiBVU0IyX1BIWSBvbiBPTUFQNS4KLSAidGksY29udHJvbC1waHktcGlwZTMiIC0gaWYgaXQgaGFzIERQTEwgYW5kIGluZGl2aWR1YWwgUnggJiBUeCBwb3dlciBjb250cm9sCi0JCQllLmcuIFVTQjMgUEhZIGFuZCBTQVRBIFBIWSBvbiBPTUFQNS4KLSAidGksY29udHJvbC1waHktZHJhN3VzYjIiIC0gaWYgaXQgaGFzIHBvd2VyIGRvd24gcmVnaXN0ZXIgbGlrZSBVU0IyIFBIWSBvbgotCQkJRFJBNyBwbGF0Zm9ybS4KLSAidGksY29udHJvbC1waHktYW00Mzd1c2IyIiAtIGlmIGl0IGhhcyBwb3dlciBkb3duIHJlZ2lzdGVyIGxpa2UgVVNCMiBQSFkgb24KLQkJCUFNNDM3IHBsYXRmb3JtLgotIC0gcmVnIDogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UuIEl0IGNvbnRhaW5zCi0gICB0aGUgYWRkcmVzcyBvZiAib3RnaHNfY29udHJvbCIgZm9yIGNvbnRyb2wtcGh5LW90Z2hzIG9yICJwb3dlciIgcmVnaXN0ZXIKLSAgIGZvciBvdGhlciB0eXBlcy4KLSAtIHJlZy1uYW1lczogc2hvdWxkIGJlICJvdGdoc19jb250cm9sIiBjb250cm9sLXBoeS1vdGdocyBhbmQgInBvd2VyIiBmb3IKLSAgIG90aGVyIHR5cGVzLgotCi1vbWFwX2NvbnRyb2xfdXNiOiBvbWFwLWNvbnRyb2wtdXNiQDRhMDAyMzAwIHsKLQljb21wYXRpYmxlID0gInRpLGNvbnRyb2wtcGh5LW90Z2hzIjsKLQlyZWcgPSA8MHg0YTAwMjMzYyAweDQ+OwotCXJlZy1uYW1lcyA9ICJvdGdoc19jb250cm9sIjsKLX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYi1laGNpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLWVoY2kudHh0CmluZGV4IGZhMTg2MTIuLmZmMTUxZWMwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYi1laGNpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYi1laGNpLnR4dApAQCAtMSwxOSArMSwyMCBAQAogVVNCIEVIQ0kgY29udHJvbGxlcnMKIAogUmVxdWlyZWQgcHJvcGVydGllczoKLSAgLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlICJ1c2ItZWhjaSIuCisgIC0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAiZ2VuZXJpYy1laGNpIi4KICAgLSByZWcgOiBzaG91bGQgY29udGFpbiBhdCBsZWFzdCBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHN0YW5kYXJkIEVIQ0kKICAgICByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UuIE9wdGlvbmFsIHBsYXRmb3JtLWRlcGVuZGVudCByZWdpc3RlcnMKICAgICAoZGVidWctcG9ydCBvciBvdGhlcikgY2FuIGJlIGFsc28gc3BlY2lmaWVkIGhlcmUsIGJ1dCBvbmx5IGFmdGVyCiAgICAgZGVmaW5pdGlvbiBvZiBzdGFuZGFyZCBFSENJIHJlZ2lzdGVycy4KICAgLSBpbnRlcnJ1cHRzIDogb25lIEVIQ0kgaW50ZXJydXB0IHNob3VsZCBiZSBkZXNjcmliZWQgaGVyZS4KLUlmIGRldmljZSByZWdpc3RlcnMgYXJlIGltcGxlbWVudGVkIGluIGJpZyBlbmRpYW4gbW9kZSwgdGhlIGRldmljZQotbm9kZSBzaG91bGQgaGF2ZSAiYmlnLWVuZGlhbi1yZWdzIiBwcm9wZXJ0eS4KLUlmIGNvbnRyb2xsZXIgaW1wbGVtZW50YXRpb24gb3BlcmF0ZXMgd2l0aCBiaWcgZW5kaWFuIGRlc2NyaXB0b3JzLAotImJpZy1lbmRpYW4tZGVzYyIgcHJvcGVydHkgc2hvdWxkIGJlIHNwZWNpZmllZC4KLUlmIGJvdGggYmlnIGVuZGlhbiByZWdpc3RlcnMgYW5kIGRlc2NyaXB0b3JzIGFyZSB1c2VkIGJ5IHRoZSBjb250cm9sbGVyCi1pbXBsZW1lbnRhdGlvbiwgImJpZy1lbmRpYW4iIHByb3BlcnR5IGNhbiBiZSBzcGVjaWZpZWQgaW5zdGVhZCBvZiBoYXZpbmcKLWJvdGggImJpZy1lbmRpYW4tcmVncyIgYW5kICJiaWctZW5kaWFuLWRlc2MiLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorIC0gYmlnLWVuZGlhbi1yZWdzIDogYm9vbGVhbiwgc2V0IHRoaXMgZm9yIGhjZHMgd2l0aCBiaWctZW5kaWFuIHJlZ2lzdGVycworIC0gYmlnLWVuZGlhbi1kZXNjIDogYm9vbGVhbiwgc2V0IHRoaXMgZm9yIGhjZHMgd2l0aCBiaWctZW5kaWFuIGRlc2NyaXB0b3JzCisgLSBiaWctZW5kaWFuIDogYm9vbGVhbiwgZm9yIGhjZHMgd2l0aCBiaWctZW5kaWFuLXJlZ3MgKyBiaWctZW5kaWFuLWRlc2MKKyAtIGNsb2NrcyA6IGEgbGlzdCBvZiBwaGFuZGxlICsgY2xvY2sgc3BlY2lmaWVyIHBhaXJzCisgLSBwaHlzIDogcGhhbmRsZSArIHBoeSBzcGVjaWZpZXIgcGFpcgorIC0gcGh5LW5hbWVzIDogInVzYiIKIAogRXhhbXBsZSAoU2VxdW9pYSA0NDBFUHgpOgogICAgIGVoY2lAZTAwMDAzMDAgewpAQCAtMjMsMyArMjQsMTMgQEAKIAkgICByZWcgPSA8MCBlMDAwMDMwMCA5MCAwIGUwMDAwMzkwIDcwPjsKIAkgICBiaWctZW5kaWFuOwogICAgfTsKKworRXhhbXBsZSAoQWxsd2lubmVyIHN1bjRpIEExMCBTb0MpOgorICAgZWhjaTA6IHVzYkAwMWMxNDAwMCB7CisJICAgY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLWVoY2kiLCAiZ2VuZXJpYy1laGNpIjsKKwkgICByZWcgPSA8MHgwMWMxNDAwMCAweDEwMD47CisJICAgaW50ZXJydXB0cyA9IDwzOT47CisJICAgY2xvY2tzID0gPCZhaGJfZ2F0ZXMgMT47CisJICAgcGh5cyA9IDwmdXNicGh5IDE+OworCSAgIHBoeS1uYW1lcyA9ICJ1c2IiOworICAgfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLW9oY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2Itb2hjaS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmNjdkOQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLW9oY2kudHh0CkBAIC0wLDAgKzEsMjUgQEAKK1VTQiBPSENJIGNvbnRyb2xsZXJzCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiAiZ2VuZXJpYy1vaGNpIgorLSByZWcgOiBvaGNpIGNvbnRyb2xsZXIgcmVnaXN0ZXIgcmFuZ2UgKGFkZHJlc3MgYW5kIGxlbmd0aCkKKy0gaW50ZXJydXB0cyA6IG9oY2kgY29udHJvbGxlciBpbnRlcnJ1cHQKKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gYmlnLWVuZGlhbi1yZWdzIDogYm9vbGVhbiwgc2V0IHRoaXMgZm9yIGhjZHMgd2l0aCBiaWctZW5kaWFuIHJlZ2lzdGVycworLSBiaWctZW5kaWFuLWRlc2MgOiBib29sZWFuLCBzZXQgdGhpcyBmb3IgaGNkcyB3aXRoIGJpZy1lbmRpYW4gZGVzY3JpcHRvcnMKKy0gYmlnLWVuZGlhbiA6IGJvb2xlYW4sIGZvciBoY2RzIHdpdGggYmlnLWVuZGlhbi1yZWdzICsgYmlnLWVuZGlhbi1kZXNjCistIGNsb2NrcyA6IGEgbGlzdCBvZiBwaGFuZGxlICsgY2xvY2sgc3BlY2lmaWVyIHBhaXJzCistIHBoeXMgOiBwaGFuZGxlICsgcGh5IHNwZWNpZmllciBwYWlyCistIHBoeS1uYW1lcyA6ICJ1c2IiCisKK0V4YW1wbGU6CisKKwlvaGNpMDogdXNiQDAxYzE0NDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLW9oY2kiLCAiZ2VuZXJpYy1vaGNpIjsKKwkJcmVnID0gPDB4MDFjMTQ0MDAgMHgxMDA+OworCQlpbnRlcnJ1cHRzID0gPDY0PjsKKwkJY2xvY2tzID0gPCZ1c2JfY2xrIDY+LCA8JmFoYl9nYXRlcyAyPjsKKwkJcGh5cyA9IDwmdXNicGh5IDE+OworCQlwaHktbmFtZXMgPSAidXNiIjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2ItcGh5LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLXBoeS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMjQ1YzguLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2ItcGh5LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLVVTQiBQSFkKLQotT01BUCBVU0IyIFBIWQotCi1SZXF1aXJlZCBwcm9wZXJ0aWVzOgotIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJ0aSxvbWFwLXVzYjIiCi0gLSByZWcgOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZS4KLSAtICNwaHktY2VsbHM6IGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGNlbGxzIHRoYXQgc2hvdWxkIGJlIGdpdmVuIGluIHRoZQotICAgcGhhbmRsZSB3aGlsZSByZWZlcmVuY2luZyB0aGlzIHBoeS4KLQotT3B0aW9uYWwgcHJvcGVydGllczoKLSAtIGN0cmwtbW9kdWxlIDogcGhhbmRsZSBvZiB0aGUgY29udHJvbCBtb2R1bGUgdXNlZCBieSBQSFkgZHJpdmVyIHRvIHBvd2VyIG9uCi0gICB0aGUgUEhZLgotCi1UaGlzIGlzIHVzdWFsbHkgYSBzdWJub2RlIG9mIG9jcDJzY3AgdG8gd2hpY2ggaXQgaXMgY29ubmVjdGVkLgotCi11c2IycGh5QDRhMGFkMDgwIHsKLQljb21wYXRpYmxlID0gInRpLG9tYXAtdXNiMiI7Ci0JcmVnID0gPDB4NGEwYWQwODAgMHg1OD47Ci0JY3RybC1tb2R1bGUgPSA8Jm9tYXBfY29udHJvbF91c2I+OwotCSNwaHktY2VsbHMgPSA8MD47Ci19OwotCi1PTUFQIFVTQjMgUEhZCi0KLVJlcXVpcmVkIHByb3BlcnRpZXM6Ci0gLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgInRpLG9tYXAtdXNiMyIKLSAtIHJlZyA6IEFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlLgotIC0gcmVnLW5hbWVzOiBUaGUgbmFtZXMgb2YgdGhlIHJlZ2lzdGVyIGFkZHJlc3NlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSByZWdpc3RlcnMKLSAgIGZpbGxlZCBpbiAicmVnIi4KLSAtICNwaHktY2VsbHM6IGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGNlbGxzIHRoYXQgc2hvdWxkIGJlIGdpdmVuIGluIHRoZQotICAgcGhhbmRsZSB3aGlsZSByZWZlcmVuY2luZyB0aGlzIHBoeS4KLQotT3B0aW9uYWwgcHJvcGVydGllczoKLSAtIGN0cmwtbW9kdWxlIDogcGhhbmRsZSBvZiB0aGUgY29udHJvbCBtb2R1bGUgdXNlZCBieSBQSFkgZHJpdmVyIHRvIHBvd2VyIG9uCi0gICB0aGUgUEhZLgotCi1UaGlzIGlzIHVzdWFsbHkgYSBzdWJub2RlIG9mIG9jcDJzY3AgdG8gd2hpY2ggaXQgaXMgY29ubmVjdGVkLgotCi11c2IzcGh5QDRhMDg0NDAwIHsKLQljb21wYXRpYmxlID0gInRpLG9tYXAtdXNiMyI7Ci0JcmVnID0gPDB4NGEwODQ0MDAgMHg4MD4sCi0JICAgICAgPDB4NGEwODQ4MDAgMHg2ND4sCi0JICAgICAgPDB4NGEwODRjMDAgMHg0MD47Ci0JcmVnLW5hbWVzID0gInBoeV9yeCIsICJwaHlfdHgiLCAicGxsX2N0cmwiOwotCWN0cmwtbW9kdWxlID0gPCZvbWFwX2NvbnRyb2xfdXNiPjsKLQkjcGh5LWNlbGxzID0gPDA+OwotfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvcGxhdGZvcm0tdWhjaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYi11aGNpLnR4dApzaW1pbGFyaXR5IGluZGV4IDc2JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3BsYXRmb3JtLXVoY2kudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYi11aGNpLnR4dAppbmRleCBhNGZiMDcxLi4yOTgxMzM0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3BsYXRmb3JtLXVoY2kudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLXVoY2kudHh0CkBAIC0yLDE0ICsyLDE0IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlIDogInBsYXRmb3JtLXVoY2kiCistIGNvbXBhdGlibGUgOiAiZ2VuZXJpYy11aGNpIiAoZGVwcmVjYXRlZDogInBsYXRmb3JtLXVoY2kiKQogLSByZWcgOiBTaG91bGQgY29udGFpbiAxIHJlZ2lzdGVyIHJhbmdlcyhhZGRyZXNzIGFuZCBsZW5ndGgpCiAtIGludGVycnVwdHMgOiBVSENJIGNvbnRyb2xsZXIgaW50ZXJydXB0CiAKIEV4YW1wbGU6CiAKIAl1aGNpQGQ4MDA3YjAwIHsKLQkJY29tcGF0aWJsZSA9ICJwbGF0Zm9ybS11aGNpIjsKKwkJY29tcGF0aWJsZSA9ICJnZW5lcmljLXVoY2kiOwogCQlyZWcgPSA8MHhkODAwN2IwMCAweDIwMD47CiAJCWludGVycnVwdHMgPSA8NDM+OwogCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYi14aGNpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLXhoY2kudHh0CmluZGV4IDU3NTJkZjAuLjkwZjhmNjAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLXhoY2kudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLXhoY2kudHh0CkBAIC0xLDE0ICsxLDE0IEBACiBVU0IgeEhDSSBjb250cm9sbGVycwogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotICAtIGNvbXBhdGlibGU6IHNob3VsZCBiZSAieGhjaS1wbGF0Zm9ybSIuCisgIC0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJnZW5lcmljLXhoY2kiIChkZXByZWNhdGVkOiAieGhjaS1wbGF0Zm9ybSIpLgogICAtIHJlZzogc2hvdWxkIGNvbnRhaW4gYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSBzdGFuZGFyZCBYSENJCiAgICAgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlLgogICAtIGludGVycnVwdHM6IG9uZSBYSENJIGludGVycnVwdCBzaG91bGQgYmUgZGVzY3JpYmVkIGhlcmUuCiAKIEV4YW1wbGU6CiAJdXNiQGYwOTMxMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJ4aGNpLXBsYXRmb3JtIjsKKwkJY29tcGF0aWJsZSA9ICJnZW5lcmljLXhoY2kiOwogCQlyZWcgPSA8MHhmMDkzMTAwMCAweDhjOD47CiAJCWludGVycnVwdHMgPSA8MHgwIDB4NGUgMHgwPjsKIAl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi92aWEsdnQ4NTAwLWVoY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi92aWEsdnQ4NTAwLWVoY2kudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2IzYWQxLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdmlhLHZ0ODUwMC1laGNpLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLVZJQS9Xb25kZXJtZWRpYSBWVDg1MDAgRUhDSSBDb250cm9sbGVyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZXF1aXJlZCBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlIDogInZpYSx2dDg1MDAtZWhjaSIKLS0gcmVnIDogU2hvdWxkIGNvbnRhaW4gMSByZWdpc3RlciByYW5nZXMoYWRkcmVzcyBhbmQgbGVuZ3RoKQotLSBpbnRlcnJ1cHRzIDogZWhjaSBjb250cm9sbGVyIGludGVycnVwdAotCi1FeGFtcGxlOgotCi0JZWhjaUBkODAwNzkwMCB7Ci0JCWNvbXBhdGlibGUgPSAidmlhLHZ0ODUwMC1laGNpIjsKLQkJcmVnID0gPDB4ZDgwMDc5MDAgMHgyMDA+OwotCQlpbnRlcnJ1cHRzID0gPDQzPjsKLQl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi92dDg1MDAtZWhjaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3Z0ODUwMC1laGNpLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZiOGZkNi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3Z0ODUwMC1laGNpLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLVZJQSBWVDg1MDAgYW5kIFdvbmRlcm1lZGlhIFdNOHh4eCBTb0MgVVNCIGNvbnRyb2xsZXJzLgotCi1SZXF1aXJlZCBwcm9wZXJ0aWVzOgotIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJ2aWEsdnQ4NTAwLWVoY2kiIG9yICJ3bSxwcml6bS1laGNpIi4KLSAtIHJlZzogQWRkcmVzcyByYW5nZSBvZiB0aGUgZWhjaSByZWdpc3RlcnMuIHNpemUgc2hvdWxkIGJlIDB4MjAwCi0gLSBpbnRlcnJ1cHRzOiBTaG91bGQgY29udGFpbiB0aGUgZWhjaSBpbnRlcnJ1cHQuCi0KLXVzYjogZWhjaUBEODAwNzEwMCB7Ci0JY29tcGF0aWJsZSA9ICJ3bSxwcml6bS1laGNpIiwgInVzYi1laGNpIjsKLQlyZWcgPSA8MHhEODAwNzEwMCAweDIwMD47Ci0JaW50ZXJydXB0cyA9IDwxPjsKLX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvd2F0Y2hkb2cvb2YteGlsaW54LXdkdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvd2F0Y2hkb2cvb2YteGlsaW54LXdkdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ2Mzc4MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9vZi14aWxpbngtd2R0LnR4dApAQCAtMCwwICsxLDIzIEBACitYaWxpbnggQVhJL1BMQiBzb2Z0LWNvcmUgd2F0Y2hkb2cgRGV2aWNlIFRyZWUgQmluZGluZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlCQk6IFNob3VsZCBiZSAieGxueCx4cHMtdGltZWJhc2Utd2R0LTEuMDAuYSIgb3IKKwkJCSAgInhsbngseHBzLXRpbWViYXNlLXdkdC0xLjAxLmEiLgorLSByZWcJCQk6IFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBhbmQgc2l6ZQorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBjbG9jay1mcmVxdWVuY3kJOiBGcmVxdWVuY3kgb2YgY2xvY2sgaW4gSHoKKy0geGxueCx3ZHQtZW5hYmxlLW9uY2UJOiAwIC0gV2F0Y2hkb2cgY2FuIGJlIHJlc3RhcnRlZAorCQkJICAxIC0gV2F0Y2hkb2cgY2FuIGJlIGVuYWJsZWQganVzdCBvbmNlCistIHhsbngsd2R0LWludGVydmFsCTogV2F0Y2hkb2cgdGltZW91dCBpbnRlcnZhbCBpbiAyXjx2YWw+IGNsb2NrIGN5Y2xlcywKKwkJCSAgPHZhbD4gaXMgaW50ZWdlciBmcm9tIDggdG8gMzEuCisKK0V4YW1wbGU6CitheGktdGltZWJhc2Utd2R0QDQwMTAwMDAwIHsKKwljbG9jay1mcmVxdWVuY3kgPSA8NTAwMDAwMDA+OworCWNvbXBhdGlibGUgPSAieGxueCx4cHMtdGltZWJhc2Utd2R0LTEuMDAuYSI7CisJcmVnID0gPDB4NDAxMDAwMDAgMHgxMDAwMD47CisJeGxueCx3ZHQtZW5hYmxlLW9uY2UgPSA8MHgwPjsKKwl4bG54LHdkdC1pbnRlcnZhbCA9IDwweDFiPjsKK30gOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3dhdGNoZG9nL3N1bnhpLXdkdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvd2F0Y2hkb2cvc3VueGktd2R0LnR4dAppbmRleCBlMzljYjI2Li5iOGY3NWM1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvd2F0Y2hkb2cvc3VueGktd2R0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvd2F0Y2hkb2cvc3VueGktd2R0LnR4dApAQCAtMiwxMyArMiwxMyBAQAogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogCi0tIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgImFsbHdpbm5lciw8c29jLWZhbWlseT4td2R0IiwgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQKLSAgU29DIGZhbWlsaWVzIGJlaW5nIHN1bjRpIGFuZCBzdW42aQorLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlIGVpdGhlciAiYWxsd2lubmVyLHN1bjRpLWExMC13ZHQiIG9yCisgICAgICAgICAgICAgICAiYWxsd2lubmVyLHN1bjZpLWEzMS13ZHQiCiAtIHJlZyA6IFNwZWNpZmllcyBiYXNlIHBoeXNpY2FsIGFkZHJlc3MgYW5kIHNpemUgb2YgdGhlIHJlZ2lzdGVycy4KIAogRXhhbXBsZToKIAogd2R0OiB3YXRjaGRvZ0AwMWMyMGM5MCB7Ci0JY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktd2R0IjsKKwljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtd2R0IjsKIAlyZWcgPSA8MHgwMWMyMGM5MCAweDEwPjsKIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZtYy9mbWMtd3JpdGUtZWVwcm9tLnR4dCBiL0RvY3VtZW50YXRpb24vZm1jL2ZtYy13cml0ZS1lZXByb20udHh0CmluZGV4IDQ0YTNiYzYuLmUwYTk3MTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZm1jL2ZtYy13cml0ZS1lZXByb20udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZm1jL2ZtYy13cml0ZS1lZXByb20udHh0CkBAIC05LDcgKzksMTIgQEAKIGV4cGVjdGVkIHRvIG9ubHkgaGFwcGVuIGR1cmluZyBtYW51ZmFjdHVyaW5nLiBGb3IgdGhpcyByZWFzb24sIHRoZQogbW9kdWxlIG1ha2VzIGl0IHVubGlrZWx5IGZvciB0aGUgcmFuZG9tIHVzZXIgdG8gY2hhbmdlIGEgd29ya2luZyBFRVBST00uCiAKLVRoZSBtb2R1bGUgdGFrZXMgdGhlIGZvbGxvd2luZyBtZWFzdXJlczoKK0hvd2V2ZXIsIHNpbmNlIHRoZSBFRVBST00gbWF5IGluY2x1ZGUgYXBwbGljYXRpb24tc3BlY2lmaWMgaW5mb3JtYXRpb24KK290aGVyIHRoYW4gdGhlIGlkZW50aWZpY2F0aW9uLCBsYXRlciB2ZXJzaW9ucyBvZiB0aGlzIHBhY2thZ2VzIGFkZGVkCit3cml0ZS1zdXBwb3J0IHRocm91Z2ggc3lzZnMuIFNlZSAqbm90ZSBBY2Nlc3NpbmcgdGhlIEVFUFJPTTo6LgorCitUbyBhdm9pZCBkYW1hZ2luZyB0aGUgRUVQUk9NIGNvbnRlbnQsIHRoZSBtb2R1bGUgdGFrZXMgdGhlIGZvbGxvd2luZworbWVhc3VyZXM6CiAKICAgICogSXQgYWNjZXB0cyBhIGBmaWxlPScgYXJndW1lbnQgKHdpdGhpbiAvbGliL2Zpcm13YXJlKSBhbmQgaWYgbm8KICAgICAgc3VjaCBhcmd1bWVudCBpcyByZWNlaXZlZCwgaXQgZG9lc24ndCB3cml0ZSBhbnl0aGluZyB0byBFRVBST00KQEAgLTcwLDU2ICs3NSwyNCBAQAogICAgICAgICBbICAxMzIuODk5ODcyXSAgZmFrZS1mbWM6IFByb2R1Y3QgbmFtZTogRm1jRGVsYXkxbnM0Y2hhCiAKIAotV3JpdGluZyB0byB0aGUgRUVQUk9NCitBY2Nlc3NpbmcgdGhlIEVFUFJPTQogPT09PT09PT09PT09PT09PT09PT09CiAKLU9uY2UgeW91IGhhdmUgY3JlYXRlZCBhIGJpbmFyeSBmaWxlIGZvciB5b3VyIEVFUFJPTSwgeW91IGNhbiB3cml0ZSBpdAotdG8gdGhlIHN0b3JhZ2UgbWVkaXVtIHVzaW5nIHRoZSBmbWMtd3JpdGUtZWVwcm9tIChTZWUgKm5vdGUKLWZtYy13cml0ZS1lZXByb206Oiwgd2hpbGUgcmVseWluZyBvbiBhIGNhcnJpZXIgZHJpdmVyLiAgVGhlIHByb2NlZHVyZQotaGVyZSBzaG93biBoZXJlIHVzZXMgdGhlIFNQRUMgZHJpdmVyCi0oYGh0dHA6Ly93d3cub2h3ci5vcmcvcHJvamVjdHMvc3BlYy1zdycpLgorVGhlIGJ1cyBjcmVhdGVzIGEgc3lzZnMgYmluYXJ5IGZpbGUgY2FsbGVkIGVlcHJvbSBmb3IgZWFjaCBtZXp6YW5pbmUgaXQKK2tub3dzIGFib3V0OgogCi1UaGUgZXhhbXBsZSBhc3N1bWVzIG5vIGRyaXZlciBpcyBhbHJlYWR5IGxvYWRlZCAoYWN0dWFsbHksIEkgdW5sb2FkZWQKLXRoZW0gYnkgaGFuZCBhcyBldmVyeXRoaW5nIGxvYWRzIGF1dG9tYXRpY2FsbHkgYXQgYm9vdCB0aW1lIGFmdGVyIHlvdQotaW5zdGFsbGVkIHRoZSBtb2R1bGVzKSwgYW5kIHNob3dzIGtlcm5lbCBtZXNzYWdlcyB0b2dldGhlciB3aXRoCi1jb21tYW5kcy4gSGVyZSB0aGUgcHJvbXB0IGlzIHNwdXNhLnJvb3QjIGFuZCB0d28gU1BFQyBjYXJkcyBhcmUgcGx1Z2dlZAotaW4gdGhlIHN5c3RlbS4KKyAgICAgICAgc3B1c2Eucm9vdCMgY2QgL3N5cy9idXMvZm1jL2RldmljZXM7IGxzIC1sICovZWVwcm9tCisgICAgICAgIC1yLS1yLS1yLS0gMSByb290IHJvb3QgODE5MiBGZWIgMjEgMTI6MzAgRm1jQWRjMTAwbTE0YjRjaGEtMDgwMC9lZXByb20KKyAgICAgICAgLXItLXItLXItLSAxIHJvb3Qgcm9vdCA4MTkyIEZlYiAyMSAxMjozMCBGbWNEZWxheTFuczRjaGEtMDIwMC9lZXByb20KKyAgICAgICAgLXItLXItLXItLSAxIHJvb3Qgcm9vdCA4MTkyIEZlYiAyMSAxMjozMCBGbWNEaW81Y2hhLTA0MDAvZWVwcm9tCiAKLSAgICAgc3B1c2Eucm9vdCMgaW5zbW9kIGZtYy5rbwotICAgICBzcHVzYS5yb290IyBpbnNtb2Qgc3BlYy5rbwotICAgICBbMTM5NzIuMzgyODE4XSBzcGVjIDAwMDA6MDI6MDAuMDogIHByb2JlIGZvciBkZXZpY2UgMDAwMjowMDAwCi0gICAgIFsxMzk3Mi4zOTI3NzNdIHNwZWMgMDAwMDowMjowMC4wOiBnb3QgZmlsZSAiZm1jL3NwZWMtaW5pdC5iaW4iLCAxNDg0NDA0ICgweDE2YTY3NCkgYnl0ZXMKLSAgICAgWzEzOTcyLjU5MTM4OF0gc3BlYyAwMDAwOjAyOjAwLjA6IEZQR0EgcHJvZ3JhbW1pbmcgc3VjY2Vzc2Z1bAotICAgICBbMTM5NzIuODgzMDExXSBzcGVjIDAwMDA6MDI6MDAuMDogRUVQUk9NIGhhcyBubyBGUlUgaW5mb3JtYXRpb24KLSAgICAgWzEzOTcyLjg4ODcxOV0gc3BlYyAwMDAwOjAyOjAwLjA6IE5vIGRldmljZV9pZCBmaWxsZWQsIHVzaW5nIGluZGV4Ci0gICAgIFsxMzk3Mi44OTQ2NzZdIHNwZWMgMDAwMDowMjowMC4wOiBObyBtZXp6YW5pbmVfbmFtZSBmb3VuZAotICAgICBbMTM5NzIuODk5ODYzXSAvaG9tZS9ydWJpbmkvd2lwL3NwZWMtc3cva2VybmVsL3NwZWMtZ3Bpby5jIC0gc3BlY19ncGlvX2luaXQKLSAgICAgWzEzOTcyLjkwNjU3OF0gc3BlYyAwMDAwOjA0OjAwLjA6ICBwcm9iZSBmb3IgZGV2aWNlIDAwMDQ6MDAwMAotICAgICBbMTM5NzIuOTE2NTA5XSBzcGVjIDAwMDA6MDQ6MDAuMDogZ290IGZpbGUgImZtYy9zcGVjLWluaXQuYmluIiwgMTQ4NDQwNCAoMHgxNmE2NzQpIGJ5dGVzCi0gICAgIFsxMzk3My4xMTUwOTZdIHNwZWMgMDAwMDowNDowMC4wOiBGUEdBIHByb2dyYW1taW5nIHN1Y2Nlc3NmdWwKLSAgICAgWzEzOTczLjQwMTc5OF0gc3BlYyAwMDAwOjA0OjAwLjA6IEVFUFJPTSBoYXMgbm8gRlJVIGluZm9ybWF0aW9uCi0gICAgIFsxMzk3My40MDc0NzRdIHNwZWMgMDAwMDowNDowMC4wOiBObyBkZXZpY2VfaWQgZmlsbGVkLCB1c2luZyBpbmRleAotICAgICBbMTM5NzMuNDEzNDE3XSBzcGVjIDAwMDA6MDQ6MDAuMDogTm8gbWV6emFuaW5lX25hbWUgZm91bmQKLSAgICAgWzEzOTczLjQxODYwMF0gL2hvbWUvcnViaW5pL3dpcC9zcGVjLXN3L2tlcm5lbC9zcGVjLWdwaW8uYyAtIHNwZWNfZ3Bpb19pbml0Ci0gICAgIHNwdXNhLnJvb3QjIGxzIC9zeXMvYnVzL2ZtYy9kZXZpY2VzCi0gICAgIGZtYy0wMDAwICBmbWMtMDAwMQotICAgICBzcHVzYS5yb290IyBpbnNtb2QgZm1jLXdyaXRlLWVlcHJvbS5rbyBidXNpZD0weDAyMDAgZmlsZT1mZGVsYXktZWVwcm9tLmJpbgotICAgICBbMTQxMDMuOTY2MjU5XSBzcGVjIDAwMDA6MDI6MDAuMDogTWF0Y2hpbmcgYW4gZ2VuZXJpYyBkcml2ZXIgKG5vIElEKQotICAgICBbMTQxMDMuOTc1NTE5XSBzcGVjIDAwMDA6MDI6MDAuMDogcHJvZ3JhbW1pbmcgNjE1NSBieXRlcwotICAgICBbMTQxMjYuMzczNzYyXSBzcGVjIDAwMDA6MDI6MDAuMDogd3JpdGVfZWVwcm9tOiBzdWNjZXNzCi0gICAgIFsxNDEyNi4zNzg3NzBdIHNwZWMgMDAwMDowNDowMC4wOiBNYXRjaGluZyBhbiBnZW5lcmljIGRyaXZlciAobm8gSUQpCi0gICAgIFsxNDEyNi4zODQ5MDNdIHNwZWMgMDAwMDowNDowMC4wOiBmbWNfd3JpdGVfZWVwcm9tOiBubyBmaWxlbmFtZSBnaXZlbjogbm90IHByb2dyYW1taW5nCi0gICAgIFsxNDEyNi4zOTI2MDBdIGZtY193cml0ZV9lZXByb206IHByb2JlIG9mIGZtYy0wMDAxIGZhaWxlZCB3aXRoIGVycm9yIC0yCitFdmVyeWJvZHkgY2FuIHJlYWQgdGhlIGZpbGVzIGFuZCB0aGUgc3VwZXJ1c2VyIGNhbiBhbHNvIG1vZGlmeSBpdCwgYnV0Cit0aGUgb3BlcmF0aW9uIG1heSBvbiB0aGUgY2FycmllciBkcml2ZXIsIGlmIHRoZSBjYXJyaWVyIGlzIHVuYWJsZSB0bworYWNjZXNzIHRoZSBJMkMgYnVzLiAgRm9yIGV4YW1wbGUsIHRoZSBzcGVjIGRyaXZlciBjYW4gYWNjZXNzIHRoZSBidXMKK29ubHkgd2l0aCBpdHMgZ29sZGVuIGdhdGV3YXJlOiBhZnRlciBhIG1lenphbmluZSBkcml2ZXIgcmVwcm9ncmFtbWVkCit0aGUgRlBHQSB3aXRoIGEgY3VzdG9tIGNpcmN1aXQsIHRoZSBjYXJyaWVyIGlzIHVuYWJsZSB0byBhY2Nlc3MgdGhlCitFRVBST00gYW5kIHJldHVybnMgRU5PVFNVUFAuCiAKLVJlYWRpbmcgYmFjayB0aGUgRUVQUk9NCi09PT09PT09PT09PT09PT09PT09PT09PQotCi1JbiBvcmRlciB0byByZWFkIGJhY2sgdGhlIGJpbmFyeSBjb250ZW50IG9mIHRoZSBFRVBST00gb2YgeW91cgotbWV6emFuaW5lIGRldmljZSwgdGhlIGJ1cyBjcmVhdGVzIGEgcmVhZC1vbmx5IHN5c2ZzIGZpbGUgY2FsbGVkIGVlcHJvbQotZm9yIGVhY2ggbWV6emFuaW5lIGl0IGtub3dzIGFib3V0OgotCi0gICBzcHVzYS5yb290IyBjZCAvc3lzL2J1cy9mbWMvZGV2aWNlczsgbHMgLWwgKi9lZXByb20KLSAgIC1yLS1yLS1yLS0gMSByb290IHJvb3QgODE5MiBBcHIgIDkgMTY6NTMgRm1jRGVsYXkxbnM0Y2hhLWYwMDEvZWVwcm9tCi0gICAtci0tci0tci0tIDEgcm9vdCByb290IDgxOTIgQXByICA5IDE3OjE5IGZha2UtZGVzaWduLWZvci10ZXN0aW5nLWYwMDIvZWVwcm9tCi0gICAtci0tci0tci0tIDEgcm9vdCByb290IDgxOTIgQXByICA5IDE3OjE5IGZha2UtZGVzaWduLWZvci10ZXN0aW5nLWYwMDMvZWVwcm9tCi0gICAtci0tci0tci0tIDEgcm9vdCByb290IDgxOTIgQXByICA5IDE3OjE5IGZtYy1mMDA0L2VlcHJvbQorQW4gYWx0ZXJuYXRpdmUgd2F5IHRvIHdyaXRlIHRoZSBFRVBST00gaXMgdGhlIG1lenphbmluZSBkcml2ZXIKK2ZtYy13cml0ZS1lZXByb20gKFNlZSAqbm90ZSBmbWMtd3JpdGUtZWVwcm9tOjopLCBidXQgdGhlIHByb2NlZHVyZSBpcworbW9yZSBjb21wbGV4LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9hZGMxMjhkODE4IGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZGMxMjhkODE4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Yzk1MDAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkYzEyOGQ4MTgKQEAgLTAsMCArMSw0NyBAQAorS2VybmVsIGRyaXZlciBhZGMxMjhkODE4Cis9PT09PT09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIGNoaXBzOgorICAqIFRleGFzIEluc3RydW1lbnRzIEFEQzgxOEQ4MTgKKyAgICBQcmVmaXg6ICdhZGM4MThkODE4JworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgxZCwgMHgxZSwgMHgxZiwgMHgyZCwgMHgyZSwgMHgyZgorICAgIERhdGFzaGVldDogUHVibGljbHkgYXZhaWxhYmxlIGF0IHRoZSBUSSB3ZWJzaXRlCisgICAgICAgICAgICAgICBodHRwOi8vd3d3LnRpLmNvbS8KKworQXV0aG9yOiBHdWVudGVyIFJvZWNrCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBBREMxMjhEODE4LgorSXQgaXMgZGVzY3JpYmVkIGFzICdBREMgU3lzdGVtIE1vbml0b3Igd2l0aCBUZW1wZXJhdHVyZSBTZW5zb3InLgorCitUaGUgQURDMTI4RDgxOCBpbXBsZW1lbnRzIG9uZSB0ZW1wZXJhdHVyZSBzZW5zb3IgYW5kIHNldmVuIHZvbHRhZ2Ugc2Vuc29ycy4KKworVGVtcGVyYXR1cmVzIGFyZSBtZWFzdXJlZCBpbiBkZWdyZWVzIENlbHNpdXMuIFRoZXJlIGlzIG9uZSBzZXQgb2YgbGltaXRzLgorV2hlbiB0aGUgSE9UIFRlbXBlcmF0dXJlIExpbWl0IGlzIGNyb3NzZWQsIHRoaXMgd2lsbCBjYXVzZSBhbiBhbGFybSB0aGF0IHdpbGwKK2JlIHJlYXNzZXJ0ZWQgdW50aWwgdGhlIHRlbXBlcmF0dXJlIGRyb3BzIGJlbG93IHRoZSBIT1QgSHlzdGVyZXNpcy4KK01lYXN1cmVtZW50cyBhcmUgZ3VhcmFudGVlZCBiZXR3ZWVuIC01NSBhbmQgKzEyNSBkZWdyZWVzLiBUaGUgdGVtcGVyYXR1cmUKK21lYXN1cmVtZW50IGhhcyBhIHJlc29sdXRpb24gb2YgMC41IGRlZ3JlZXM7IHRoZSBsaW1pdHMgaGF2ZSBhIHJlc29sdXRpb24KK29mIDEgZGVncmVlLgorCitWb2x0YWdlIHNlbnNvcnMgKGFsc28ga25vd24gYXMgSU4gc2Vuc29ycykgcmVwb3J0IHRoZWlyIHZhbHVlcyBpbiB2b2x0cy4KK0FuIGFsYXJtIGlzIHRyaWdnZXJlZCBpZiB0aGUgdm9sdGFnZSBoYXMgY3Jvc3NlZCBhIHByb2dyYW1tYWJsZSBtaW5pbXVtCitvciBtYXhpbXVtIGxpbWl0LiBOb3RlIHRoYXQgbWluaW11bSBpbiB0aGlzIGNhc2UgYWx3YXlzIG1lYW5zICdjbG9zZXN0IHRvCit6ZXJvJzsgdGhpcyBpcyBpbXBvcnRhbnQgZm9yIG5lZ2F0aXZlIHZvbHRhZ2UgbWVhc3VyZW1lbnRzLiBBbGwgdm9sdGFnZQoraW5wdXRzIGNhbiBtZWFzdXJlIHZvbHRhZ2VzIGJldHdlZW4gMCBhbmQgMi41NSB2b2x0cywgd2l0aCBhIHJlc29sdXRpb24KK29mIDAuNjI1IG1WLgorCitJZiBhbiBhbGFybSB0cmlnZ2VycywgaXQgd2lsbCByZW1haW4gdHJpZ2dlcmVkIHVudGlsIHRoZSBoYXJkd2FyZSByZWdpc3RlcgoraXMgcmVhZCBhdCBsZWFzdCBvbmNlLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGNhdXNlIGZvciB0aGUgYWxhcm0gbWF5CithbHJlYWR5IGhhdmUgZGlzYXBwZWFyZWQgYnkgdGhlIHRpbWUgdGhlIGFsYXJtIGlzIHJlYWQuIFRoZSBkcml2ZXIKK2NhY2hlcyB0aGUgYWxhcm0gc3RhdHVzIGZvciBlYWNoIHNlbnNvciB1bnRpbCBpdCBpcyBhdCBsZWFzdCByZXBvcnRlZAorb25jZSwgdG8gZW5zdXJlIHRoYXQgYWxhcm1zIGFyZSByZXBvcnRlZCB0byB1c2VyIHNwYWNlLgorCitUaGUgQURDMTI4RDgxOCBvbmx5IHVwZGF0ZXMgaXRzIHZhbHVlcyBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIHNlY29uZDsKK3JlYWRpbmcgaXQgbW9yZSBvZnRlbiB3aWxsIGRvIG5vIGhhcm0sIGJ1dCB3aWxsIHJldHVybiAnb2xkJyB2YWx1ZXMuCisKK0luIGFkZGl0aW9uIHRvIHRoZSBzY2FubmVkIGFkZHJlc3MgbGlzdCwgdGhlIGNoaXAgY2FuIGFsc28gYmUgY29uZmlndXJlZCBmb3IKK2FkZHJlc3NlcyAweDM1IHRvIDB4MzcuIFRob3NlIGFkZHJlc3NlcyBhcmUgbm90IHNjYW5uZWQuIFlvdSBoYXZlIHRvIGluc3RhbnRpYXRlCit0aGUgZHJpdmVyIGV4cGxpY2l0bHkgaWYgdGhlIGNoaXAgaXMgY29uZmlndXJlZCBmb3IgYW55IG9mIHRob3NlIGFkZHJlc3NlcyBpbgoreW91ciBzeXN0ZW0uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtOTUyNDUgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtOTUyNDUKaW5kZXggY2JkOGFlYS4uNzdlYWYyOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9sbTk1MjQ1CisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbG05NTI0NQpAQCAtMjQsOCArMjQsMTIgQEAKIGdpdmVuIHdpdGhpbiBhIHJhbmdlIG9mIC0xMjcgdG8gKzI1NSBkZWdyZWVzLiBSZXNvbHV0aW9uIGRlcGVuZHMgb24KIHRlbXBlcmF0dXJlIGlucHV0IGFuZCByYW5nZS4KIAotRWFjaCBzZW5zb3IgaGFzIGl0cyBvd24gY3JpdGljYWwgbGltaXQsIGJ1dCB0aGUgaHlzdGVyZXNpcyBpcyBjb21tb24gdG8gYWxsCi10d28gY2hhbm5lbHMuCitFYWNoIHNlbnNvciBoYXMgaXRzIG93biBjcml0aWNhbCBsaW1pdC4gQWRkaXRpb25hbGx5LCB0aGVyZSBpcyBhIHJlbGF0aXZlCitoeXN0ZXJlc2lzIHZhbHVlIGNvbW1vbiB0byBib3RoIGNyaXRpY2FsIGxpbWl0cy4gVG8gbWFrZSBsaWZlIGVhc2llciB0bwordXNlci1zcGFjZSBhcHBsaWNhdGlvbnMsIHR3byBhYnNvbHV0ZSB2YWx1ZXMgYXJlIGV4cG9ydGVkLCBvbmUgZm9yIGVhY2gKK2NoYW5uZWwsIGJ1dCB0aGVzZSB2YWx1ZXMgYXJlIG9mIGNvdXJzZSBsaW5rZWQuIE9ubHkgdGhlIGxvY2FsIGh5c3RlcmVzaXMKK2NhbiBiZSBzZXQgZnJvbSB1c2VyLXNwYWNlLCBhbmQgdGhlIHNhbWUgZGVsdGEgYXBwbGllcyB0byB0aGUgcmVtb3RlCitoeXN0ZXJlc2lzLgogCiBUaGUgbG05NTI0NSBkcml2ZXIgY2FuIGNoYW5nZSBpdHMgdXBkYXRlIGludGVydmFsIHRvIGEgZml4ZWQgc2V0IG9mIHZhbHVlcy4KIEl0IHdpbGwgcm91bmQgdXAgdG8gdGhlIG5leHQgc2VsZWN0YWJsZSBpbnRlcnZhbC4gU2VlIHRoZSBkYXRhc2hlZXQgZm9yIGV4YWN0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2x0YzI5NDUgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2x0YzI5NDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkMGY3ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbHRjMjk0NQpAQCAtMCwwICsxLDg0IEBACitLZXJuZWwgZHJpdmVyIGx0YzI5NDUKKz09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgY2hpcHM6CisgICogTGluZWFyIFRlY2hub2xvZ3kgTFRDMjk0NQorICAgIFByZWZpeDogJ2x0YzI5NDUnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IC0KKyAgICBEYXRhc2hlZXQ6CisgICAgICAgIGh0dHA6Ly9jZHMubGluZWFyLmNvbS9kb2NzL2VuL2RhdGFzaGVldC8yOTQ1ZmEucGRmCisKK0F1dGhvcjogR3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMubmV0PgorCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGUgTFRDMjk0NSAgaXMgYSByYWlsLXRvLXJhaWwgc3lzdGVtIG1vbml0b3IgdGhhdCBtZWFzdXJlcyBjdXJyZW50LCB2b2x0YWdlLAorYW5kIHBvd2VyIGNvbnN1bXB0aW9uLgorCisKK1VzYWdlIE5vdGVzCistLS0tLS0tLS0tLQorCitUaGlzIGRyaXZlciBkb2VzIG5vdCBwcm9iZSBmb3IgTFRDMjk0NSBkZXZpY2VzLCBzaW5jZSB0aGVyZSBpcyBubyByZWdpc3Rlcgord2hpY2ggY2FuIGJlIHNhZmVseSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBjaGlwLiBZb3Ugd2lsbCBoYXZlIHRvIGluc3RhbnRpYXRlCit0aGUgZGV2aWNlcyBleHBsaWNpdGx5LgorCitFeGFtcGxlOiB0aGUgZm9sbG93aW5nIHdpbGwgbG9hZCB0aGUgZHJpdmVyIGZvciBhbiBMVEMyOTQ1IGF0IGFkZHJlc3MgMHgxMAorb24gSTJDIGJ1cyAjMToKKyQgbW9kcHJvYmUgbHRjMjk0NQorJCBlY2hvIGx0YzI5NDUgMHgxMCA+IC9zeXMvYnVzL2kyYy9kZXZpY2VzL2kyYy0xL25ld19kZXZpY2UKKworCitTeXNmcyBlbnRyaWVzCistLS0tLS0tLS0tLS0tCisKK1ZvbHRhZ2UgcmVhZGluZ3MgcHJvdmlkZWQgYnkgdGhpcyBkcml2ZXIgYXJlIHJlcG9ydGVkIGFzIG9idGFpbmVkIGZyb20gdGhlIEFEQworcmVnaXN0ZXJzLiBJZiBhIHNldCBvZiB2b2x0YWdlIGRpdmlkZXIgcmVzaXN0b3JzIGlzIGluc3RhbGxlZCwgY2FsY3VsYXRlIHRoZQorcmVhbCB2b2x0YWdlIGJ5IG11bHRpcGx5aW5nIHRoZSByZXBvcnRlZCB2YWx1ZSB3aXRoIChSMStSMikvUjIsIHdoZXJlIFIxIGlzIHRoZQordmFsdWUgb2YgdGhlIGRpdmlkZXIgcmVzaXN0b3IgYWdhaW5zdCB0aGUgbWVhc3VyZWQgdm9sdGFnZSBhbmQgUjIgaXMgdGhlIHZhbHVlCitvZiB0aGUgZGl2aWRlciByZXNpc3RvciBhZ2FpbnN0IEdyb3VuZC4KKworQ3VycmVudCByZWFkaW5nIHByb3ZpZGVkIGJ5IHRoaXMgZHJpdmVyIGlzIHJlcG9ydGVkIGFzIG9idGFpbmVkIGZyb20gdGhlIEFEQworQ3VycmVudCBTZW5zZSByZWdpc3Rlci4gVGhlIHJlcG9ydGVkIHZhbHVlIGFzc3VtZXMgdGhhdCBhIDEgbU9obSBzZW5zZSByZXNpc3RvcgoraXMgaW5zdGFsbGVkLiBJZiBhIGRpZmZlcmVudCBzZW5zZSByZXNpc3RvciBpcyBpbnN0YWxsZWQsIGNhbGN1bGF0ZSB0aGUgcmVhbAorY3VycmVudCBieSBkaXZpZGluZyB0aGUgcmVwb3J0ZWQgdmFsdWUgYnkgdGhlIHNlbnNlIHJlc2lzdG9yIHZhbHVlIGluIG1PaG0uCisKK2luMV9pbnB1dAkJVklOIHZvbHRhZ2UgKG1WKS4gVm9sdGFnZSBpcyBtZWFzdXJlZCBlaXRoZXIgYXQKKwkJCVNFTlNFKyBvciBWREQgcGluIGRlcGVuZGluZyBvbiBjaGlwIGNvbmZpZ3VyYXRpb24uCitpbjFfbWluCQkJVW5kZXJ2b2x0YWdlIHRocmVzaG9sZAoraW4xX21heAkJCU92ZXJ2b2x0YWdlIHRocmVzaG9sZAoraW4xX2xvd2VzdAkJTG93ZXN0IG1lYXN1cmVkIHZvbHRhZ2UKK2luMV9oaWdoZXN0CQlIaWdoZXN0IG1lYXN1cmVkIHZvbHRhZ2UKK2luMV9yZXNldF9oaXN0b3J5CVdyaXRlIDEgdG8gcmVzZXQgaW4xIGhpc3RvcnkKK2luMV9taW5fYWxhcm0JCVVuZGVydm9sdGFnZSBhbGFybQoraW4xX21heF9hbGFybQkJT3ZlcnZvbHRhZ2UgYWxhcm0KKworaW4yX2lucHV0CQlBRElOIHZvbHRhZ2UgKG1WKQoraW4yX21pbgkJCVVuZGVydm9sdGFnZSB0aHJlc2hvbGQKK2luMl9tYXgJCQlPdmVydm9sdGFnZSB0aHJlc2hvbGQKK2luMl9sb3dlc3QJCUxvd2VzdCBtZWFzdXJlZCB2b2x0YWdlCitpbjJfaGlnaGVzdAkJSGlnaGVzdCBtZWFzdXJlZCB2b2x0YWdlCitpbjJfcmVzZXRfaGlzdG9yeQlXcml0ZSAxIHRvIHJlc2V0IGluMiBoaXN0b3J5CitpbjJfbWluX2FsYXJtCQlVbmRlcnZvbHRhZ2UgYWxhcm0KK2luMl9tYXhfYWxhcm0JCU92ZXJ2b2x0YWdlIGFsYXJtCisKK2N1cnIxX2lucHV0CQlTRU5TRSBjdXJyZW50IChtQSkKK2N1cnIxX21pbgkJVW5kZXJjdXJyZW50IHRocmVzaG9sZAorY3VycjFfbWF4CQlPdmVyY3VycmVudCB0aHJlc2hvbGQKK2N1cnIxX2xvd2VzdAkJTG93ZXN0IG1lYXN1cmVkIGN1cnJlbnQKK2N1cnIxX2hpZ2hlc3QJCUhpZ2hlc3QgbWVhc3VyZWQgY3VycmVudAorY3VycjFfcmVzZXRfaGlzdG9yeQlXcml0ZSAxIHRvIHJlc2V0IGN1cnIxIGhpc3RvcnkKK2N1cnIxX21pbl9hbGFybQkJVW5kZXJjdXJyZW50IGFsYXJtCitjdXJyMV9tYXhfYWxhcm0JCU92ZXJjdXJyZW50IGFsYXJtCisKK3Bvd2VyMV9pbnB1dAkJUG93ZXIgKGluIHVXKS4gUG93ZXIgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiBTRU5TRSsvVkRECisJCQl2b2x0YWdlIG9yIEFESU4gdm9sdGFnZSBkZXBlbmRpbmcgb24gY2hpcCBjb25maWd1cmF0aW9uLgorcG93ZXIxX21pbgkJTG93IGxvd2VyIHRocmVzaG9sZAorcG93ZXIxX21heAkJSGlnaCBwb3dlciB0aHJlc2hvbGQKK3Bvd2VyMV9pbnB1dF9sb3dlc3QJSGlzdG9yaWNhbCBtaW5pbXVtIHBvd2VyIHVzZQorcG93ZXIxX2lucHV0X2hpZ2hlc3QJSGlzdG9yaWNhbCBtYXhpbXVtIHBvd2VyIHVzZQorcG93ZXIxX3Jlc2V0X2hpc3RvcnkJV3JpdGUgMSB0byByZXNldCBwb3dlcjEgaGlzdG9yeQorcG93ZXIxX21pbl9hbGFybQlMb3cgcG93ZXIgYWxhcm0KK3Bvd2VyMV9tYXhfYWxhcm0JSGlnaCBwb3dlciBhbGFybQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9sdGMyOTc4IGIvRG9jdW1lbnRhdGlvbi9od21vbi9sdGMyOTc4CmluZGV4IGEwNTQ2ZmMuLjY4NmMwNzggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vbHRjMjk3OAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2x0YzI5NzgKQEAgLTIzLDYgKzIzLDEwIEBACiAgICAgUHJlZml4OiAnbHRjMzg4MycKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogLQogICAgIERhdGFzaGVldDogaHR0cDovL3d3dy5saW5lYXIuY29tL3Byb2R1Y3QvbHRjMzg4MworICAqIExpbmVhciBUZWNobm9sb2d5IExUTTQ2NzYKKyAgICBQcmVmaXg6ICdsdG00Njc2JworICAgIEFkZHJlc3NlcyBzY2FubmVkOiAtCisgICAgRGF0YXNoZWV0OiBodHRwOi8vd3d3LmxpbmVhci5jb20vcHJvZHVjdC9sdG00Njc2CiAKIEF1dGhvcjogR3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMubmV0PgogCkBAIC0zMyw3ICszNyw4IEBACiBMVEMyOTc0IGlzIGEgcXVhZCBkaWdpdGFsIHBvd2VyIHN1cHBseSBtYW5hZ2VyLiBMVEMyOTc4IGlzIGFuIG9jdGFsIHBvd2VyIHN1cHBseQogbW9uaXRvci4gTFRDMjk3NyBpcyBhIHBpbiBjb21wYXRpYmxlIHJlcGxhY2VtZW50IGZvciBMVEMyOTc4LiBMVEMzODgwIGlzIGEgZHVhbAogb3V0cHV0IHBvbHktcGhhc2Ugc3RlcC1kb3duIERDL0RDIGNvbnRyb2xsZXIuIExUQzM4ODMgaXMgYSBzaW5nbGUgcGhhc2UKLXN0ZXAtZG93biBEQy9EQyBjb250cm9sbGVyLgorc3RlcC1kb3duIERDL0RDIGNvbnRyb2xsZXIuIExUTTQ2NzYgaXMgYSBkdWFsIDEzQSBvciBzaW5nbGUgMjZBIHVNb2R1bGUKK3JlZ3VsYXRvci4KIAogCiBVc2FnZSBOb3RlcwpAQCAtNzUsNyArODAsNyBAQAogCQkJTFRDMjk3NDogTj0yLTUKIAkJCUxUQzI5Nzc6IE49Mi05CiAJCQlMVEMyOTc4OiBOPTItOQotCQkJTFRDMzg4MDogTj0yLTMKKwkJCUxUQzM4ODAsIExUTTQ2NzY6IE49Mi0zCiAJCQlMVEMzODgzOiBOPTIKIGluW05dX2lucHV0CQlNZWFzdXJlZCBvdXRwdXQgdm9sdGFnZS4KIGluW05dX21pbgkJTWluaW11bSBvdXRwdXQgdm9sdGFnZS4KQEAgLTk1LDcgKzEwMCw3IEBACiAJCQlhbmQgdGVtcDUgcmVwb3J0cyB0aGUgY2hpcCB0ZW1wZXJhdHVyZS4KIAkJCU9uIExUQzI5NzcgYW5kIExUQzI5NzgsIG9ubHkgb25lIHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50CiAJCQlpcyBzdXBwb3J0ZWQgYW5kIHJlcG9ydHMgdGhlIGNoaXAgdGVtcGVyYXR1cmUuCi0JCQlPbiBMVEMzODgwLCB0ZW1wMSBhbmQgdGVtcDIgcmVwb3J0IGV4dGVybmFsCisJCQlPbiBMVEMzODgwIGFuZCBMVE00Njc2LCB0ZW1wMSBhbmQgdGVtcDIgcmVwb3J0IGV4dGVybmFsCiAJCQl0ZW1wZXJhdHVyZXMsIGFuZCB0ZW1wMyByZXBvcnRzIHRoZSBjaGlwIHRlbXBlcmF0dXJlLgogCQkJT24gTFRDMzg4MywgdGVtcDEgcmVwb3J0cyBhbiBleHRlcm5hbCB0ZW1wZXJhdHVyZSwKIAkJCWFuZCB0ZW1wMiByZXBvcnRzIHRoZSBjaGlwIHRlbXBlcmF0dXJlLgpAQCAtMTIzLDExICsxMjgsMTEgQEAKIAkJCUxUQzI5NzQ6IE49MS00CiAJCQlMVEMyOTc3OiBOb3Qgc3VwcG9ydGVkCiAJCQlMVEMyOTc4OiBOb3Qgc3VwcG9ydGVkCi0JCQlMVEMzODgwOiBOPTEtMgorCQkJTFRDMzg4MCwgTFRNNDY3NjogTj0xLTIKIAkJCUxUQzM4ODM6IE49MgogcG93ZXJbTl1faW5wdXQJCU1lYXN1cmVkIG91dHB1dCBwb3dlci4KIAotY3VycjFfbGFiZWwJCSJpaW4iLiBMVEMzODgwIGFuZCBMVEMzODgzIG9ubHkuCitjdXJyMV9sYWJlbAkJImlpbiIuIExUQzM4ODAsIExUQzM4ODMsIGFuZCBMVE00Njc2IG9ubHkuCiBjdXJyMV9pbnB1dAkJTWVhc3VyZWQgaW5wdXQgY3VycmVudC4KIGN1cnIxX21heAkJTWF4aW11bSBpbnB1dCBjdXJyZW50LgogY3VycjFfbWF4X2FsYXJtCQlJbnB1dCBjdXJyZW50IGhpZ2ggYWxhcm0uCkBAIC0xMzgsNyArMTQzLDcgQEAKIAkJCUxUQzI5NzQ6IE49MS00CiAJCQlMVEMyOTc3OiBub3Qgc3VwcG9ydGVkCiAJCQlMVEMyOTc4OiBub3Qgc3VwcG9ydGVkCi0JCQlMVEMzODgwOiBOPTItMworCQkJTFRDMzg4MCwgTFRNNDY3NjogTj0yLTMKIAkJCUxUQzM4ODM6IE49MgogY3VycltOXV9pbnB1dAkJTWVhc3VyZWQgb3V0cHV0IGN1cnJlbnQuCiBjdXJyW05dX21heAkJTWF4aW11bSBvdXRwdXQgY3VycmVudC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbHRjNDI2MCBiL0RvY3VtZW50YXRpb24vaHdtb24vbHRjNDI2MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGZmNGFkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sdGM0MjYwCkBAIC0wLDAgKzEsNTYgQEAKK0tlcm5lbCBkcml2ZXIgbHRjNDI2MAorPT09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBjaGlwczoKKyAgKiBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjYwCisgICAgUHJlZml4OiAnbHRjNDI2MCcKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogLQorICAgIERhdGFzaGVldDoKKyAgICAgICAgaHR0cDovL2Nkcy5saW5lYXIuY29tL2RvY3MvZW4vZGF0YXNoZWV0LzQyNjBmYy5wZGYKKworQXV0aG9yOiBHdWVudGVyIFJvZWNrIDxsaW51eEByb2Vjay11cy5uZXQ+CisKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoZSBMVEM0MjYwIEhvdCBTd2FwIGNvbnRyb2xsZXIgYWxsb3dzIGEgYm9hcmQgdG8gYmUgc2FmZWx5IGluc2VydGVkCithbmQgcmVtb3ZlZCBmcm9tIGEgbGl2ZSBiYWNrcGxhbmUuCisKKworVXNhZ2UgTm90ZXMKKy0tLS0tLS0tLS0tCisKK1RoaXMgZHJpdmVyIGRvZXMgbm90IHByb2JlIGZvciBMVEM0MjYwIGRldmljZXMsIHNpbmNlIHRoZXJlIGlzIG5vIHJlZ2lzdGVyCit3aGljaCBjYW4gYmUgc2FmZWx5IHVzZWQgdG8gaWRlbnRpZnkgdGhlIGNoaXAuIFlvdSB3aWxsIGhhdmUgdG8gaW5zdGFudGlhdGUKK3RoZSBkZXZpY2VzIGV4cGxpY2l0bHkuCisKK0V4YW1wbGU6IHRoZSBmb2xsb3dpbmcgd2lsbCBsb2FkIHRoZSBkcml2ZXIgZm9yIGFuIExUQzQyNjAgYXQgYWRkcmVzcyAweDEwCitvbiBJMkMgYnVzICMxOgorJCBtb2Rwcm9iZSBsdGM0MjYwCiskIGVjaG8gbHRjNDI2MCAweDEwID4gL3N5cy9idXMvaTJjL2RldmljZXMvaTJjLTEvbmV3X2RldmljZQorCisKK1N5c2ZzIGVudHJpZXMKKy0tLS0tLS0tLS0tLS0KKworVm9sdGFnZSByZWFkaW5ncyBwcm92aWRlZCBieSB0aGlzIGRyaXZlciBhcmUgcmVwb3J0ZWQgYXMgb2J0YWluZWQgZnJvbSB0aGUgQURDCityZWdpc3RlcnMuIElmIGEgc2V0IG9mIHZvbHRhZ2UgZGl2aWRlciByZXNpc3RvcnMgaXMgaW5zdGFsbGVkLCBjYWxjdWxhdGUgdGhlCityZWFsIHZvbHRhZ2UgYnkgbXVsdGlwbHlpbmcgdGhlIHJlcG9ydGVkIHZhbHVlIHdpdGggKFIxK1IyKS9SMiwgd2hlcmUgUjEgaXMgdGhlCit2YWx1ZSBvZiB0aGUgZGl2aWRlciByZXNpc3RvciBhZ2FpbnN0IHRoZSBtZWFzdXJlZCB2b2x0YWdlIGFuZCBSMiBpcyB0aGUgdmFsdWUKK29mIHRoZSBkaXZpZGVyIHJlc2lzdG9yIGFnYWluc3QgR3JvdW5kLgorCitDdXJyZW50IHJlYWRpbmcgcHJvdmlkZWQgYnkgdGhpcyBkcml2ZXIgaXMgcmVwb3J0ZWQgYXMgb2J0YWluZWQgZnJvbSB0aGUgQURDCitDdXJyZW50IFNlbnNlIHJlZ2lzdGVyLiBUaGUgcmVwb3J0ZWQgdmFsdWUgYXNzdW1lcyB0aGF0IGEgMSBtT2htIHNlbnNlIHJlc2lzdG9yCitpcyBpbnN0YWxsZWQuIElmIGEgZGlmZmVyZW50IHNlbnNlIHJlc2lzdG9yIGlzIGluc3RhbGxlZCwgY2FsY3VsYXRlIHRoZSByZWFsCitjdXJyZW50IGJ5IGRpdmlkaW5nIHRoZSByZXBvcnRlZCB2YWx1ZSBieSB0aGUgc2Vuc2UgcmVzaXN0b3IgdmFsdWUgaW4gbU9obS4KKworaW4xX2lucHV0CQlTT1VSQ0Ugdm9sdGFnZSAobVYpCitpbjFfbWluX2FsYXJtCQlVbmRlcnZvbHRhZ2UgYWxhcm0KK2luMV9tYXhfYWxhcm0JCU92ZXJ2b2x0YWdlIGFsYXJtCisKK2luMl9pbnB1dAkJQURJTiB2b2x0YWdlIChtVikKK2luMl9hbGFybQkJUG93ZXIgYmFkIGFsYXJtCisKK2N1cnIxX2lucHV0CQlTRU5TRSBjdXJyZW50IChtQSkKK2N1cnIxX2FsYXJtCQlTRU5TRSBvdmVyY3VycmVudCBhbGFybQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCA2Nzc1NWVhLi4yMzExZGFkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtMjMxLDYgKzIzMSwxNCBAQAogCiAJYWNwaV9ub19hdXRvX3NzZHQJW0hXLEFDUEldIERpc2FibGUgYXV0b21hdGljIGxvYWRpbmcgb2YgU1NEVAogCisJYWNwaWNhX25vX3JldHVybl9yZXBhaXIgW0hXLCBBQ1BJXQorCQkJRGlzYWJsZSBBTUwgcHJlZGVmaW5lZCB2YWxpZGF0aW9uIG1lY2hhbmlzbQorCQkJVGhpcyBtZWNoYW5pc20gY2FuIHJlcGFpciB0aGUgZXZhbHVhdGlvbiByZXN1bHQgdG8gbWFrZQorCQkJdGhlIHJldHVybiBvYmplY3RzIG1vcmUgQUNQSSBzcGVjaWZpY2F0aW9uIGNvbXBsaWFudC4KKwkJCVRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBmb3IgZGV2ZWxvcGVycyB0byBpZGVudGlmeSB0aGUKKwkJCXJvb3QgY2F1c2Ugb2YgYW4gQU1MIGludGVycHJldGVyIGlzc3VlIHdoZW4gdGhlIGlzc3VlCisJCQloYXMgc29tZXRoaW5nIHRvIGRvIHdpdGggdGhlIHJlcGFpciBtZWNoYW5pc20uCisKIAlhY3BpX29zX25hbWU9CVtIVyxBQ1BJXSBUZWxsIEFDUEkgQklPUyB0aGUgbmFtZSBvZiB0aGUgT1MKIAkJCUZvcm1hdDogVG8gc3Bvb2YgYXMgV2luZG93cyA5ODogPSJNaWNyb3NvZnQgV2luZG93cyIKIApAQCAtMzQxNiwxNCArMzQyNCwyNCBAQAogCQkJCQlvZiBDT05GSUdfSElHSFBURS4KIAogCXZkc289CQlbWDg2LFNIXQotCQkJdmRzbz0yOiBlbmFibGUgY29tcGF0IFZEU08gKGRlZmF1bHQgd2l0aCBDT01QQVRfVkRTTykKLQkJCXZkc289MTogZW5hYmxlIFZEU08gKGRlZmF1bHQpCisJCQlPbiBYODZfMzIsIHRoaXMgaXMgYW4gYWxpYXMgZm9yIHZkc28zMj0uICBPdGhlcndpc2U6CisKKwkJCXZkc289MTogZW5hYmxlIFZEU08gKHRoZSBkZWZhdWx0KQogCQkJdmRzbz0wOiBkaXNhYmxlIFZEU08gbWFwcGluZwogCi0JdmRzbzMyPQkJW1g4Nl0KLQkJCXZkc28zMj0yOiBlbmFibGUgY29tcGF0IFZEU08gKGRlZmF1bHQgd2l0aCBDT01QQVRfVkRTTykKLQkJCXZkc28zMj0xOiBlbmFibGUgMzItYml0IFZEU08gKGRlZmF1bHQpCi0JCQl2ZHNvMzI9MDogZGlzYWJsZSAzMi1iaXQgVkRTTyBtYXBwaW5nCisJdmRzbzMyPQkJW1g4Nl0gQ29udHJvbCB0aGUgMzItYml0IHZEU08KKwkJCXZkc28zMj0xOiBlbmFibGUgMzItYml0IFZEU08KKwkJCXZkc28zMj0wIG9yIHZkc28zMj0yOiBkaXNhYmxlIDMyLWJpdCBWRFNPCisKKwkJCVNlZSB0aGUgaGVscCB0ZXh0IGZvciBDT05GSUdfQ09NUEFUX1ZEU08gZm9yIG1vcmUKKwkJCWRldGFpbHMuICBJZiBDT05GSUdfQ09NUEFUX1ZEU08gaXMgc2V0LCB0aGUgZGVmYXVsdCBpcworCQkJdmRzbzMyPTA7IG90aGVyd2lzZSwgdGhlIGRlZmF1bHQgaXMgdmRzbzMyPTEuCisKKwkJCUZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIga2VybmVscywgdmRzbzMyPTIgaXMgYW4KKwkJCWFsaWFzIGZvciB2ZHNvMzI9MC4KKworCQkJVHJ5IHZkc28zMj0wIGlmIHlvdSBlbmNvdW50ZXIgYW4gZXJyb3IgdGhhdCBzYXlzOgorCQkJZGxfbWFpbjogQXNzZXJ0aW9uIGAodm9pZCAqKSBwaC0+cF92YWRkciA9PSBfcnRsZF9sb2NhbC5fZGxfc3lzaW5mb19kc28nIGZhaWxlZCEKIAogCXZlY3Rvcj0JCVtJQS02NCxTTVBdCiAJCQl2ZWN0b3I9cGVyY3B1OiBlbmFibGUgcGVyY3B1IHZlY3RvciBkb21haW4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcGh5L3NhbXN1bmctdXNiMi50eHQgYi9Eb2N1bWVudGF0aW9uL3BoeS9zYW1zdW5nLXVzYjIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMTJkNDMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3BoeS9zYW1zdW5nLXVzYjIudHh0CkBAIC0wLDAgKzEsMTM1IEBACisuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfAkJCVNhbXN1bmcgVVNCIDIuMCBQSFkgYWRhcHRhdGlvbiBsYXllcgkJICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsnCisKK3wgMS4gRGVzY3JpcHRpb24KKystLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIFVTQiAyLjAgUEhZIG1vZHVsZSBpbiBTYW1zdW5nIFNvQ3MgaXMgc2ltaWxhcgorYW1vbmcgbWFueSBTb0NzLiBJbiBzcGl0ZSBvZiB0aGUgc2ltaWxhcml0aWVzIGl0IHByb3ZlZCBkaWZmaWN1bHQgdG8KK2NyZWF0ZSBhIG9uZSBkcml2ZXIgdGhhdCB3b3VsZCBmaXQgYWxsIHRoZXNlIFBIWSBjb250cm9sbGVycy4gT2Z0ZW4KK3RoZSBkaWZmZXJlbmNlcyB3ZXJlIG1pbm9yIGFuZCB3ZXJlIGZvdW5kIGluIHBhcnRpY3VsYXIgYml0cyBvZiB0aGUKK3JlZ2lzdGVycyBvZiB0aGUgUEhZLiBJbiBzb21lIHJhcmUgY2FzZXMgdGhlIG9yZGVyIG9mIHJlZ2lzdGVyIHdyaXRlcyBvcgordGhlIFBIWSBwb3dlcmluZyB1cCBwcm9jZXNzIGhhZCB0byBiZSBhbHRlcmVkLiBUaGlzIGFkYXB0YXRpb24gbGF5ZXIgaXMKK2EgY29tcHJvbWlzZSBiZXR3ZWVuIGhhdmluZyBzZXBhcmF0ZSBkcml2ZXJzIGFuZCBoYXZpbmcgYSBzaW5nbGUgZHJpdmVyCit3aXRoIGFkZGVkIHN1cHBvcnQgZm9yIG1hbnkgc3BlY2lhbCBjYXNlcy4KKworfCAyLiBGaWxlcyBkZXNjcmlwdGlvbgorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBwaHktc2Ftc3VuZy11c2IyLmMKKyAgIFRoaXMgaXMgdGhlIG1haW4gZmlsZSBvZiB0aGUgYWRhcHRhdGlvbiBsYXllci4gVGhpcyBmaWxlIGNvbnRhaW5zCisgICB0aGUgcHJvYmUgZnVuY3Rpb24gYW5kIHByb3ZpZGVzIHR3byBjYWxsYmFja3MgdG8gdGhlIEdlbmVyaWMgUEhZCisgICBGcmFtZXdvcmsuIFRoaXMgdHdvIGNhbGxiYWNrcyBhcmUgdXNlZCB0byBwb3dlciBvbiBhbmQgcG93ZXIgb2ZmIHRoZQorICAgcGh5LiBUaGV5IGNhcnJ5IG91dCB0aGUgY29tbW9uIHdvcmsgdGhhdCBoYXMgdG8gYmUgZG9uZSBvbiBhbGwgdmVyc2lvbgorICAgb2YgdGhlIFBIWSBtb2R1bGUuIERlcGVuZGluZyBvbiB3aGljaCBTb0Mgd2FzIGNob3NlbiB0aGV5IGV4ZWN1dGUgU29DCisgICBzcGVjaWZpYyBjYWxsYmFja3MuIFRoZSBzcGVjaWZpYyBTb0MgdmVyc2lvbiBpcyBzZWxlY3RlZCBieSBjaG9vc2luZworICAgdGhlIGFwcHJvcHJpYXRlIGNvbXBhdGlibGUgc3RyaW5nLiBJbiBhZGRpdGlvbiwgdGhpcyBmaWxlIGNvbnRhaW5zCisgICBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGRlZmluaXRpb25zIGZvciBwYXJ0aWN1bGFyIFNvQ3MuCisKKy0gcGh5LXNhbXN1bmctdXNiMi5oCisgICBUaGlzIGlzIHRoZSBpbmNsdWRlIGZpbGUuIEl0IGRlY2xhcmVzIHRoZSBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhpcworICAgZHJpdmVyLiBJbiBhZGRpdGlvbiBpdCBzaG91bGQgY29udGFpbiBleHRlcm4gZGVjbGFyYXRpb25zIGZvcgorICAgc3RydWN0dXJlcyB0aGF0IGRlc2NyaWJlIHBhcnRpY3VsYXIgU29Dcy4KKworfCAzLiBTdXBwb3J0aW5nIFNvQ3MKKystLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUbyBzdXBwb3J0IGEgbmV3IFNvQyBhIG5ldyBmaWxlIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZHJpdmVycy9waHkKK2RpcmVjdG9yeS4gRWFjaCBTb0MncyBjb25maWd1cmF0aW9uIGlzIHN0b3JlZCBpbiBhbiBpbnN0YW5jZSBvZiB0aGUKK3N0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2NvbmZpZy4KKworc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfY29uZmlnIHsKKwljb25zdCBzdHJ1Y3Qgc2Ftc3VuZ191c2IyX2NvbW1vbl9waHkgKnBoeXM7CisJaW50ICgqcmF0ZV90b19jbGspKHVuc2lnbmVkIGxvbmcsIHUzMiAqKTsKKwl1bnNpZ25lZCBpbnQgbnVtX3BoeXM7CisJYm9vbCBoYXNfbW9kZV9zd2l0Y2g7Cit9OworCitUaGUgbnVtX3BoeXMgaXMgdGhlIG51bWJlciBvZiBwaHlzIGhhbmRsZWQgYnkgdGhlIGRyaXZlci4gKnBoeXMgaXMgYW4KK2FycmF5IHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGVhY2ggcGh5LiBUaGUgaGFzX21vZGVfc3dpdGNoCitwcm9wZXJ0eSBpcyBhIGJvb2xlYW4gZmxhZyB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgU29DIGhhcyBVU0IgaG9zdAorYW5kIGRldmljZSBvbiBhIHNpbmdsZSBwYWlyIG9mIHBpbnMuIElmIHNvLCBhIHNwZWNpYWwgcmVnaXN0ZXIgaGFzIHRvCitiZSBtb2RpZmllZCB0byBjaGFuZ2UgdGhlIGludGVybmFsIHJvdXRpbmcgb2YgdGhlc2UgcGlucyBiZXR3ZWVuIGEgVVNCCitkZXZpY2Ugb3IgaG9zdCBtb2R1bGUuCisKK0ZvciBleGFtcGxlIHRoZSBjb25maWd1cmF0aW9uIGZvciBFeHlub3MgNDIxMCBpcyBmb2xsb3dpbmc6CisKK2NvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2NvbmZpZyBleHlub3M0MjEwX3VzYjJfcGh5X2NvbmZpZyA9IHsKKwkuaGFzX21vZGVfc3dpdGNoICAgICAgICA9IDAsCisJLm51bV9waHlzCQk9IEVYWU5PUzQyMTBfTlVNX1BIWVMsCisJLnBoeXMJCQk9IGV4eW5vczQyMTBfcGh5cywKKwkucmF0ZV90b19jbGsJCT0gZXh5bm9zNDIxMF9yYXRlX3RvX2NsaywKK30KKworLSBpbnQgKCpyYXRlX3RvX2NsaykodW5zaWduZWQgbG9uZywgdTMyICopCisJVGhlIHJhdGVfdG9fY2xrIGNhbGxiYWNrIGlzIHRvIGNvbnZlcnQgdGhlIHJhdGUgb2YgdGhlIGNsb2NrCisJdXNlZCBhcyB0aGUgcmVmZXJlbmNlIGNsb2NrIGZvciB0aGUgUEhZIG1vZHVsZSB0byB0aGUgdmFsdWUKKwl0aGF0IHNob3VsZCBiZSB3cml0dGVuIGluIHRoZSBoYXJkd2FyZSByZWdpc3Rlci4KKworVGhlIGV4eW5vczQyMTBfcGh5cyBjb25maWd1cmF0aW9uIGFycmF5IGlzIGFzIGZvbGxvd3M6CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ191c2IyX2NvbW1vbl9waHkgZXh5bm9zNDIxMF9waHlzW10gPSB7CisJeworCQkubGFiZWwJCT0gImRldmljZSIsCisJCS5pZAkJPSBFWFlOT1M0MjEwX0RFVklDRSwKKwkJLnBvd2VyX29uCT0gZXh5bm9zNDIxMF9wb3dlcl9vbiwKKwkJLnBvd2VyX29mZgk9IGV4eW5vczQyMTBfcG93ZXJfb2ZmLAorCX0sCisJeworCQkubGFiZWwJCT0gImhvc3QiLAorCQkuaWQJCT0gRVhZTk9TNDIxMF9IT1NULAorCQkucG93ZXJfb24JPSBleHlub3M0MjEwX3Bvd2VyX29uLAorCQkucG93ZXJfb2ZmCT0gZXh5bm9zNDIxMF9wb3dlcl9vZmYsCisJfSwKKwl7CisJCS5sYWJlbAkJPSAiaHNpYzAiLAorCQkuaWQJCT0gRVhZTk9TNDIxMF9IU0lDMCwKKwkJLnBvd2VyX29uCT0gZXh5bm9zNDIxMF9wb3dlcl9vbiwKKwkJLnBvd2VyX29mZgk9IGV4eW5vczQyMTBfcG93ZXJfb2ZmLAorCX0sCisJeworCQkubGFiZWwJCT0gImhzaWMxIiwKKwkJLmlkCQk9IEVYWU5PUzQyMTBfSFNJQzEsCisJCS5wb3dlcl9vbgk9IGV4eW5vczQyMTBfcG93ZXJfb24sCisJCS5wb3dlcl9vZmYJPSBleHlub3M0MjEwX3Bvd2VyX29mZiwKKwl9LAorCXt9LAorfTsKKworLSBpbnQgKCpwb3dlcl9vbikoc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKik7CistIGludCAoKnBvd2VyX29mZikoc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKik7CisJVGhlc2UgdHdvIGNhbGxiYWNrcyBhcmUgdXNlZCB0byBwb3dlciBvbiBhbmQgcG93ZXIgb2ZmIHRoZSBwaHkKKwlieSBtb2RpZnlpbmcgYXBwcm9wcmlhdGUgcmVnaXN0ZXJzLgorCitGaW5hbCBjaGFuZ2UgdG8gdGhlIGRyaXZlciBpcyBhZGRpbmcgYXBwcm9wcmlhdGUgY29tcGF0aWJsZSB2YWx1ZSB0byB0aGUKK3BoeS1zYW1zdW5nLXVzYjIuYyBmaWxlLiBJbiBjYXNlIG9mIEV4eW5vcyA0MjEwIHRoZSBmb2xsb3dpbmcgbGluZXMgd2VyZQorYWRkZWQgdG8gdGhlIHN0cnVjdCBvZl9kZXZpY2VfaWQgc2Ftc3VuZ191c2IyX3BoeV9vZl9tYXRjaFtdIGFycmF5OgorCisjaWZkZWYgQ09ORklHX1BIWV9FWFlOT1M0MjEwX1VTQjIKKwl7CisJCS5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNDIxMC11c2IyLXBoeSIsCisJCS5kYXRhID0gJmV4eW5vczQyMTBfdXNiMl9waHlfY29uZmlnLAorCX0sCisjZW5kaWYKKworVG8gYWRkIGZ1cnRoZXIgZmxleGliaWxpdHkgdG8gdGhlIGRyaXZlciB0aGUgS2NvbmZpZyBmaWxlIGVuYWJsZXMgdG8KK2luY2x1ZGUgc3VwcG9ydCBmb3Igc2VsZWN0ZWQgU29DcyBpbiB0aGUgY29tcGlsZWQgZHJpdmVyLiBUaGUgS2NvbmZpZworZW50cnkgZm9yIEV4eW5vcyA0MjEwIGlzIGZvbGxvd2luZzoKKworY29uZmlnIFBIWV9FWFlOT1M0MjEwX1VTQjIKKwlib29sICJTdXBwb3J0IGZvciBFeHlub3MgNDIxMCIKKwlkZXBlbmRzIG9uIFBIWV9TQU1TVU5HX1VTQjIKKwlkZXBlbmRzIG9uIENQVV9FWFlOT1M0MjEwCisJaGVscAorCSAgRW5hYmxlIFVTQiBQSFkgc3VwcG9ydCBmb3IgRXh5bm9zIDQyMTAuIFRoaXMgb3B0aW9uIHJlcXVpcmVzIHRoYXQKKwkgIFNhbXN1bmcgVVNCIDIuMCBQSFkgZHJpdmVyIGlzIGVuYWJsZWQgYW5kIG1lYW5zIHRoYXQgc3VwcG9ydCBmb3IgdGhpcworCSAgcGFydGljdWxhciBTb0MgaXMgY29tcGlsZWQgaW4gdGhlIGRyaXZlci4gSW4gY2FzZSBvZiBFeHlub3MgNDIxMCBmb3VyCisJICBwaHlzIGFyZSBhdmFpbGFibGUgLSBkZXZpY2UsIGhvc3QsIEhTQ0kwIGFuZCBIU0NJMS4KKworVGhlIG5ld2x5IGNyZWF0ZWQgZmlsZSB0aGF0IHN1cHBvcnRzIHRoZSBuZXcgU29DIGhhcyB0byBiZSBhbHNvIGFkZGVkIHRvIHRoZQorTWFrZWZpbGUuIEluIGNhc2Ugb2YgRXh5bm9zIDQyMTAgdGhlIGFkZGVkIGxpbmUgaXMgZm9sbG93aW5nOgorCitvYmotJChDT05GSUdfUEhZX0VYWU5PUzQyMTBfVVNCMikgICAgICAgKz0gcGh5LWV4eW5vczQyMTAtdXNiMi5vCisKK0FmdGVyIGNvbXBsZXRpbmcgdGhlc2Ugc3RlcHMgdGhlIHN1cHBvcnQgZm9yIHRoZSBuZXcgU29DIHNob3VsZCBiZSByZWFkeS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvcG1fcW9zX2ludGVyZmFjZS50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3BtX3Fvc19pbnRlcmZhY2UudHh0CmluZGV4IDQ4MzYzMjAuLmE1ZGE1YzcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvcG1fcW9zX2ludGVyZmFjZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9wbV9xb3NfaW50ZXJmYWNlLnR4dApAQCAtODgsMTcgKzg4LDE5IEBACiAKIDIuIFBNIFFvUyBwZXItZGV2aWNlIGxhdGVuY3kgYW5kIGZsYWdzIGZyYW1ld29yawogCi1Gb3IgZWFjaCBkZXZpY2UsIHRoZXJlIGFyZSB0d28gbGlzdHMgb2YgUE0gUW9TIHJlcXVlc3RzLiBPbmUgaXMgbWFpbnRhaW5lZAotYWxvbmcgd2l0aCB0aGUgYWdncmVnYXRlZCB0YXJnZXQgb2YgbGF0ZW5jeSB2YWx1ZSBhbmQgdGhlIG90aGVyIGlzIGZvciBQTSBRb1MKLWZsYWdzLiBWYWx1ZXMgYXJlIHVwZGF0ZWQgaW4gcmVzcG9uc2UgdG8gY2hhbmdlcyBvZiB0aGUgcmVxdWVzdCBsaXN0LgorRm9yIGVhY2ggZGV2aWNlLCB0aGVyZSBhcmUgdGhyZWUgbGlzdHMgb2YgUE0gUW9TIHJlcXVlc3RzLiBUd28gb2YgdGhlbSBhcmUKK21haW50YWluZWQgYWxvbmcgd2l0aCB0aGUgYWdncmVnYXRlZCB0YXJnZXRzIG9mIHJlc3VtZSBsYXRlbmN5IGFuZCBhY3RpdmUKK3N0YXRlIGxhdGVuY3kgdG9sZXJhbmNlIChpbiBtaWNyb3NlY29uZHMpIGFuZCB0aGUgdGhpcmQgb25lIGlzIGZvciBQTSBRb1MgZmxhZ3MuCitWYWx1ZXMgYXJlIHVwZGF0ZWQgaW4gcmVzcG9uc2UgdG8gY2hhbmdlcyBvZiB0aGUgcmVxdWVzdCBsaXN0LgogCi1UYXJnZXQgbGF0ZW5jeSB2YWx1ZSBpcyBzaW1wbHkgdGhlIG1pbmltdW0gb2YgdGhlIHJlcXVlc3QgdmFsdWVzIGhlbGQgaW4gdGhlCi1wYXJhbWV0ZXIgbGlzdCBlbGVtZW50cy4gIFRoZSBQTSBRb1MgZmxhZ3MgYWdncmVnYXRlIHZhbHVlIGlzIGEgZ2F0aGVyIChiaXR3aXNlCi1PUikgb2YgYWxsIGxpc3QgZWxlbWVudHMnIHZhbHVlcy4gVHdvIGRldmljZSBQTSBRb1MgZmxhZ3MgYXJlIGRlZmluZWQgY3VycmVudGx5OgotUE1fUU9TX0ZMQUdfTk9fUE9XRVJfT0ZGIGFuZCBQTV9RT1NfRkxBR19SRU1PVEVfV0FLRVVQLgorVGhlIHRhcmdldCB2YWx1ZXMgb2YgcmVzdW1lIGxhdGVuY3kgYW5kIGFjdGl2ZSBzdGF0ZSBsYXRlbmN5IHRvbGVyYW5jZSBhcmUKK3NpbXBseSB0aGUgbWluaW11bSBvZiB0aGUgcmVxdWVzdCB2YWx1ZXMgaGVsZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QgZWxlbWVudHMuCitUaGUgUE0gUW9TIGZsYWdzIGFnZ3JlZ2F0ZSB2YWx1ZSBpcyBhIGdhdGhlciAoYml0d2lzZSBPUikgb2YgYWxsIGxpc3QgZWxlbWVudHMnCit2YWx1ZXMuICBUd28gZGV2aWNlIFBNIFFvUyBmbGFncyBhcmUgZGVmaW5lZCBjdXJyZW50bHk6IFBNX1FPU19GTEFHX05PX1BPV0VSX09GRgorYW5kIFBNX1FPU19GTEFHX1JFTU9URV9XQUtFVVAuCiAKLU5vdGU6IHRoZSBhZ2dyZWdhdGVkIHRhcmdldCB2YWx1ZSBpcyBpbXBsZW1lbnRlZCBhcyBhbiBhdG9taWMgdmFyaWFibGUgc28gdGhhdAotcmVhZGluZyB0aGUgYWdncmVnYXRlZCB2YWx1ZSBkb2VzIG5vdCByZXF1aXJlIGFueSBsb2NraW5nIG1lY2hhbmlzbS4KK05vdGU6IFRoZSBhZ2dyZWdhdGVkIHRhcmdldCB2YWx1ZXMgYXJlIGltcGxlbWVudGVkIGluIHN1Y2ggYSB3YXkgdGhhdCByZWFkaW5nCit0aGUgYWdncmVnYXRlZCB2YWx1ZSBkb2VzIG5vdCByZXF1aXJlIGFueSBsb2NraW5nIG1lY2hhbmlzbS4KIAogCiBGcm9tIGtlcm5lbCBtb2RlIHRoZSB1c2Ugb2YgdGhpcyBpbnRlcmZhY2UgaXMgdGhlIGZvbGxvd2luZzoKQEAgLTEzMiwxOSArMTM0LDIxIEBACiAJUE1fUU9TX0ZMQUdTX1VOREVGSU5FRDogVGhlIGRldmljZSdzIFBNIFFvUyBzdHJ1Y3R1cmUgaGFzIG5vdCBiZWVuCiAJCQlpbml0aWFsaXplZCBvciB0aGUgbGlzdCBvZiByZXF1ZXN0cyBpcyBlbXB0eS4KIAotaW50IGRldl9wbV9xb3NfYWRkX2FuY2VzdG9yX3JlcXVlc3QoZGV2LCBoYW5kbGUsIHZhbHVlKQoraW50IGRldl9wbV9xb3NfYWRkX2FuY2VzdG9yX3JlcXVlc3QoZGV2LCBoYW5kbGUsIHR5cGUsIHZhbHVlKQogQWRkIGEgUE0gUW9TIHJlcXVlc3QgZm9yIHRoZSBmaXJzdCBkaXJlY3QgYW5jZXN0b3Igb2YgdGhlIGdpdmVuIGRldmljZSB3aG9zZQotcG93ZXIuaWdub3JlX2NoaWxkcmVuIGZsYWcgaXMgdW5zZXQuCitwb3dlci5pZ25vcmVfY2hpbGRyZW4gZmxhZyBpcyB1bnNldCAoZm9yIERFVl9QTV9RT1NfUkVTVU1FX0xBVEVOQ1kgcmVxdWVzdHMpCitvciB3aG9zZSBwb3dlci5zZXRfbGF0ZW5jeV90b2xlcmFuY2UgY2FsbGJhY2sgcG9pbnRlciBpcyBub3QgTlVMTCAoZm9yCitERVZfUE1fUU9TX0xBVEVOQ1lfVE9MRVJBTkNFIHJlcXVlc3RzKS4KIAogaW50IGRldl9wbV9xb3NfZXhwb3NlX2xhdGVuY3lfbGltaXQoZGV2aWNlLCB2YWx1ZSkKLUFkZCBhIHJlcXVlc3QgdG8gdGhlIGRldmljZSdzIFBNIFFvUyBsaXN0IG9mIGxhdGVuY3kgY29uc3RyYWludHMgYW5kIGNyZWF0ZQotYSBzeXNmcyBhdHRyaWJ1dGUgcG1fcW9zX3Jlc3VtZV9sYXRlbmN5X3VzIHVuZGVyIHRoZSBkZXZpY2UncyBwb3dlciBkaXJlY3RvcnkKLWFsbG93aW5nIHVzZXIgc3BhY2UgdG8gbWFuaXB1bGF0ZSB0aGF0IHJlcXVlc3QuCitBZGQgYSByZXF1ZXN0IHRvIHRoZSBkZXZpY2UncyBQTSBRb1MgbGlzdCBvZiByZXN1bWUgbGF0ZW5jeSBjb25zdHJhaW50cyBhbmQKK2NyZWF0ZSBhIHN5c2ZzIGF0dHJpYnV0ZSBwbV9xb3NfcmVzdW1lX2xhdGVuY3lfdXMgdW5kZXIgdGhlIGRldmljZSdzIHBvd2VyCitkaXJlY3RvcnkgYWxsb3dpbmcgdXNlciBzcGFjZSB0byBtYW5pcHVsYXRlIHRoYXQgcmVxdWVzdC4KIAogdm9pZCBkZXZfcG1fcW9zX2hpZGVfbGF0ZW5jeV9saW1pdChkZXZpY2UpCiBEcm9wIHRoZSByZXF1ZXN0IGFkZGVkIGJ5IGRldl9wbV9xb3NfZXhwb3NlX2xhdGVuY3lfbGltaXQoKSBmcm9tIHRoZSBkZXZpY2UncwotUE0gUW9TIGxpc3Qgb2YgbGF0ZW5jeSBjb25zdHJhaW50cyBhbmQgcmVtb3ZlIHN5c2ZzIGF0dHJpYnV0ZSBwbV9xb3NfcmVzdW1lX2xhdGVuY3lfdXMKLWZyb20gdGhlIGRldmljZSdzIHBvd2VyIGRpcmVjdG9yeS4KK1BNIFFvUyBsaXN0IG9mIHJlc3VtZSBsYXRlbmN5IGNvbnN0cmFpbnRzIGFuZCByZW1vdmUgc3lzZnMgYXR0cmlidXRlCitwbV9xb3NfcmVzdW1lX2xhdGVuY3lfdXMgZnJvbSB0aGUgZGV2aWNlJ3MgcG93ZXIgZGlyZWN0b3J5LgogCiBpbnQgZGV2X3BtX3Fvc19leHBvc2VfZmxhZ3MoZGV2aWNlLCB2YWx1ZSkKIEFkZCBhIHJlcXVlc3QgdG8gdGhlIGRldmljZSdzIFBNIFFvUyBsaXN0IG9mIGZsYWdzIGFuZCBjcmVhdGUgc3lzZnMgYXR0cmlidXRlcwpAQCAtMTYzLDcgKzE2Nyw3IEBACiBpbnQgZGV2X3BtX3Fvc19hZGRfbm90aWZpZXIoZGV2aWNlLCBub3RpZmllcik6CiBBZGRzIGEgbm90aWZpY2F0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgZGV2aWNlLgogVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSBhZ2dyZWdhdGVkIHZhbHVlIG9mIHRoZSBkZXZpY2UgY29uc3RyYWludHMgbGlzdAotaXMgY2hhbmdlZC4KK2lzIGNoYW5nZWQgKGZvciByZXN1bWUgbGF0ZW5jeSBkZXZpY2UgUE0gUW9TIG9ubHkpLgogCiBpbnQgZGV2X3BtX3Fvc19yZW1vdmVfbm90aWZpZXIoZGV2aWNlLCBub3RpZmllcik6CiBSZW1vdmVzIHRoZSBub3RpZmljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBkZXZpY2UuCkBAIC0xNzEsMTQgKzE3NSw0OCBAQAogaW50IGRldl9wbV9xb3NfYWRkX2dsb2JhbF9ub3RpZmllcihub3RpZmllcik6CiBBZGRzIGEgbm90aWZpY2F0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uIGluIHRoZSBnbG9iYWwgbm90aWZpY2F0aW9uIHRyZWUgb2YgdGhlCiBmcmFtZXdvcmsuCi1UaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIGFnZ3JlZ2F0ZWQgdmFsdWUgZm9yIGFueSBkZXZpY2UgaXMgY2hhbmdlZC4KK1RoZSBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiB0aGUgYWdncmVnYXRlZCB2YWx1ZSBmb3IgYW55IGRldmljZSBpcyBjaGFuZ2VkCisoZm9yIHJlc3VtZSBsYXRlbmN5IGRldmljZSBQTSBRb1Mgb25seSkuCiAKIGludCBkZXZfcG1fcW9zX3JlbW92ZV9nbG9iYWxfbm90aWZpZXIobm90aWZpZXIpOgogUmVtb3ZlcyB0aGUgbm90aWZpY2F0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uIGZyb20gdGhlIGdsb2JhbCBub3RpZmljYXRpb24gdHJlZQogb2YgdGhlIGZyYW1ld29yay4KIAogCi1Gcm9tIHVzZXIgbW9kZToKLU5vIEFQSSBmb3IgdXNlciBzcGFjZSBhY2Nlc3MgdG8gdGhlIHBlci1kZXZpY2UgbGF0ZW5jeSBjb25zdHJhaW50cyBpcyBwcm92aWRlZAoteWV0IC0gc3RpbGwgdW5kZXIgZGlzY3Vzc2lvbi4KK0FjdGl2ZSBzdGF0ZSBsYXRlbmN5IHRvbGVyYW5jZQogCitUaGlzIGRldmljZSBQTSBRb1MgdHlwZSBpcyB1c2VkIHRvIHN1cHBvcnQgc3lzdGVtcyBpbiB3aGljaCBoYXJkd2FyZSBtYXkgc3dpdGNoCit0byBlbmVyZ3ktc2F2aW5nIG9wZXJhdGlvbiBtb2RlcyBvbiB0aGUgZmx5LiAgSW4gdGhvc2Ugc3lzdGVtcywgaWYgdGhlIG9wZXJhdGlvbgorbW9kZSBjaG9zZW4gYnkgdGhlIGhhcmR3YXJlIGF0dGVtcHRzIHRvIHNhdmUgZW5lcmd5IGluIGFuIG92ZXJseSBhZ2dyZXNzaXZlIHdheSwKK2l0IG1heSBjYXVzZSBleGNlc3MgbGF0ZW5jaWVzIHRvIGJlIHZpc2libGUgdG8gc29mdHdhcmUsIGNhdXNpbmcgaXQgdG8gbWlzcworY2VydGFpbiBwcm90b2NvbCByZXF1aXJlbWVudHMgb3IgdGFyZ2V0IGZyYW1lIG9yIHNhbXBsZSByYXRlcyBldGMuCisKK0lmIHRoZXJlIGlzIGEgbGF0ZW5jeSB0b2xlcmFuY2UgY29udHJvbCBtZWNoYW5pc20gZm9yIGEgZ2l2ZW4gZGV2aWNlIGF2YWlsYWJsZQordG8gc29mdHdhcmUsIHRoZSAuc2V0X2xhdGVuY3lfdG9sZXJhbmNlIGNhbGxiYWNrIGluIHRoYXQgZGV2aWNlJ3MgZGV2X3BtX2luZm8KK3N0cnVjdHVyZSBzaG91bGQgYmUgcG9wdWxhdGVkLiAgVGhlIHJvdXRpbmUgcG9pbnRlZCB0byBieSBpdCBpcyBzaG91bGQgaW1wbGVtZW50Cit3aGF0ZXZlciBpcyBuZWNlc3NhcnkgdG8gdHJhbnNmZXIgdGhlIGVmZmVjdGl2ZSByZXF1aXJlbWVudCB2YWx1ZSB0byB0aGUKK2hhcmR3YXJlLgorCitXaGVuZXZlciB0aGUgZWZmZWN0aXZlIGxhdGVuY3kgdG9sZXJhbmNlIGNoYW5nZXMgZm9yIHRoZSBkZXZpY2UsIGl0cworLnNldF9sYXRlbmN5X3RvbGVyYW5jZSgpIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQgYW5kIHRoZSBlZmZlY3RpdmUgdmFsdWUgd2lsbAorYmUgcGFzc2VkIHRvIGl0LiAgSWYgdGhhdCB2YWx1ZSBpcyBuZWdhdGl2ZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgbGlzdCBvZgorbGF0ZW5jeSB0b2xlcmFuY2UgcmVxdWlyZW1lbnRzIGZvciB0aGUgZGV2aWNlIGlzIGVtcHR5LCB0aGUgY2FsbGJhY2sgaXMgZXhwZWN0ZWQKK3RvIHN3aXRjaCB0aGUgdW5kZXJseWluZyBoYXJkd2FyZSBsYXRlbmN5IHRvbGVyYW5jZSBjb250cm9sIG1lY2hhbmlzbSB0byBhbgorYXV0b25vbW91cyBtb2RlIGlmIGF2YWlsYWJsZS4gIElmIHRoYXQgdmFsdWUgaXMgUE1fUU9TX0xBVEVOQ1lfQU5ZLCBpbiB0dXJuLCBhbmQKK3RoZSBoYXJkd2FyZSBzdXBwb3J0cyBhIHNwZWNpYWwgIm5vIHJlcXVpcmVtZW50IiBzZXR0aW5nLCB0aGUgY2FsbGJhY2sgaXMKK2V4cGVjdGVkIHRvIHVzZSBpdC4gIFRoYXQgYWxsb3dzIHNvZnR3YXJlIHRvIHByZXZlbnQgdGhlIGhhcmR3YXJlIGZyb20KK2F1dG9tYXRpY2FsbHkgdXBkYXRpbmcgdGhlIGRldmljZSdzIGxhdGVuY3kgdG9sZXJhbmNlIGluIHJlc3BvbnNlIHRvIGl0cyBwb3dlcgorc3RhdGUgY2hhbmdlcyAoZS5nLiBkdXJpbmcgdHJhbnNpdGlvbnMgZnJvbSBEM2NvbGQgdG8gRDApLCB3aGljaCBnZW5lcmFsbHkgbWF5CitiZSBkb25lIGluIHRoZSBhdXRvbm9tb3VzIGxhdGVuY3kgdG9sZXJhbmNlIGNvbnRyb2wgbW9kZS4KKworSWYgLnNldF9sYXRlbmN5X3RvbGVyYW5jZSgpIGlzIHByZXNlbnQgZm9yIHRoZSBkZXZpY2UsIHN5c2ZzIGF0dHJpYnV0ZQorcG1fcW9zX2xhdGVuY3lfdG9sZXJhbmNlX3VzIHdpbGwgYmUgcHJlc2VudCBpbiB0aGUgZGV2aXZjZSdzIHBvd2VyIGRpcmVjdG9yeS4KK1RoZW4sIHVzZXIgc3BhY2UgY2FuIHVzZSB0aGF0IGF0dHJpYnV0ZSB0byBzcGVjaWZ5IGl0cyBsYXRlbmN5IHRvbGVyYW5jZQorcmVxdWlyZW1lbnQgZm9yIHRoZSBkZXZpY2UsIGlmIGFueS4gIFdyaXRpbmcgImFueSIgdG8gaXQgbWVhbnMgIm5vIHJlcXVpcmVtZW50LAorYnV0IGRvIG5vdCBsZXQgdGhlIGhhcmR3YXJlIGNvbnRyb2wgbGF0ZW5jeSB0b2xlcmFuY2UiIGFuZCB3cml0aW5nICJhdXRvIiB0byBpdAorYWxsb3dzIHRoZSBoYXJkd2FyZSB0byBiZSBzd2l0Y2hlZCB0byB0aGUgYXV0b25vbW91cyBtb2RlIGlmIHRoZXJlIGFyZSBubyBvdGhlcgorcmVxdWlyZW1lbnRzIGZyb20gdGhlIGtlcm5lbCBzaWRlIGluIHRoZSBkZXZpY2UncyBsaXN0LgorCitLZXJuZWwgY29kZSBjYW4gdXNlIHRoZSBmdW5jdGlvbnMgZGVzY3JpYmVkIGFib3ZlIGFsb25nIHdpdGggdGhlCitERVZfUE1fUU9TX0xBVEVOQ1lfVE9MRVJBTkNFIGRldmljZSBQTSBRb1MgdHlwZSB0byBhZGQsIHJlbW92ZSBhbmQgdXBkYXRlCitsYXRlbmN5IHRvbGVyYW5jZSByZXF1aXJlbWVudHMgZm9yIGRldmljZXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLm1lZ2FyYWlkX3NhcyBiL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubWVnYXJhaWRfc2FzCmluZGV4IDZlZGFhNjUuLjkxYmE1OGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubWVnYXJhaWRfc2FzCisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubWVnYXJhaWRfc2FzCkBAIC0xLDMgKzEsMTYgQEAKK1JlbGVhc2UgRGF0ZSAgICA6IE1vbi4gTWFyIDEwLCAyMDE0IDE3OjAwOjAwIFBTVCAyMDE0IC0KKwkJCShlbWFpbGQtaWQ6bWVnYXJhaWRsaW51eEBsc2kuY29tKQorCQkJQWRhbSBSYWRmb3JkCisJCQlLYXNoeWFwIERlc2FpCisJCQlTdW1pdCBTYXhlbmEKK0N1cnJlbnQgVmVyc2lvbiA6IDA2LjgwMy4wMS4wMC1yYzEKK09sZCBWZXJzaW9uICAgICA6IDA2LjcwMC4wNi4wMC1yYzEKKyAgICAxLiBMb2FkIGNvcnJlY3QgcmFpZCBjb250ZXh0IHRpbWVvdXQgdmFsdWUgZm9yIG11bHRpcGF0aGluZyAmIGNsdXN0ZXJpbmcuCisgICAgMi4gRml4IG1lZ2FzYXNfaW9jX2luaXRfZnVzaW9uIHRvIHVzZSBsb2NhbCBzdGFjayB2YXJpYWJsZS4KKyAgICAzLiBSZXR1cm4gbGVha2VkIE1QVCBmcmFtZXMgdG8gTVBUIGNvbW1hbmQgcG9vbC4KKyAgICA0LiBBZGQgRGVsbCBQb3dlckVkZ2UgVlJUWCBTUi1JT1YgVkYgZGV2aWNlIHN1cHBvcnQuCisgICAgNS4gVmVyc2lvbiBhbmQgQ2hhbmdlbG9nIHVwZGF0ZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFJlbGVhc2UgRGF0ZSAgICA6IFNhdC4gQXVnIDMxLCAyMDEzIDE3OjAwOjAwIFBTVCAyMDEzIC0KIAkJCShlbWFpbGQtaWQ6bWVnYXJhaWRsaW51eEBsc2kuY29tKQogCQkJQWRhbSBSYWRmb3JkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NnaS12aXN3cy50eHQgYi9Eb2N1bWVudGF0aW9uL3NnaS12aXN3cy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZjA4MTFjLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vc2dpLXZpc3dzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotVGhlIFNHSSBWaXN1YWwgV29ya3N0YXRpb25zIChtb2RlbHMgMzIwIGFuZCA1NDApIGFyZSBiYXNlZCBhcm91bmQKLXRoZSBDb2JhbHQsIExpdGhpdW0sIGFuZCBBcnNlbmljIEFTSUNzLiAgVGhlIENvYmFsdCBBU0lDIGlzIHRoZQotbWFpbiBzeXN0ZW0gQVNJQyB3aGljaCBpbnRlcmZhY2VzIHRoZSAxLTQgSUEzMiBjcHVzLCB0aGUgbWVtb3J5Ci1zeXN0ZW0sIGFuZCB0aGUgSS9PIHN5c3RlbSBpbiB0aGUgTGl0aGl1bSBBU0lDLiAgVGhlIENvYmFsdCBBU0lDCi1hbHNvIGNvbnRhaW5zIHRoZSAzRCBnZnggcmVuZGVyaW5nIGVuZ2luZSB3aGljaCByZW5kZXJzIHRvIG1haW4KLXN5c3RlbSBtZW1vcnkgLS0gcGFydCBvZiB3aGljaCBpcyB1c2VkIGFzIHRoZSBmcmFtZSBidWZmZXIgd2hpY2gKLWlzIERNQSdlZCB0byBhIHZpZGVvIGNvbm5lY3RvciB1c2luZyB0aGUgQXJzZW5pYyBBU0lDLiAgQSBQSUlYNAotY2hpcCBhbmQgTlM4NzMwNyBhcmUgdXNlZCB0byBwcm92aWRlIGxlZ2FjeSBkZXZpY2Ugc3VwcG9ydCAoSURFLAotc2VyaWFsLCBmbG9wcHksIGFuZCBwYXJhbGxlbCkuCi0KLVRoZSBWaXN1YWwgV29ya3N0YXRpb24gY2hpcHNldCBsYXJnZWx5IGNvbmZvcm1zIHRvIHRoZSBQQyBhcmNoaXRlY3R1cmUKLXdpdGggc29tZSBub3RhYmxlIGV4Y2VwdGlvbnMgc3VjaCBhcyBpbnRlcnJ1cHQgaGFuZGxpbmcuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy92d3NuZCBiL0RvY3VtZW50YXRpb24vc291bmQvb3NzL3Z3c25kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzZjYmRiLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvb3NzL3Z3c25kCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLXZ3c25kIC0gU291bmQgZHJpdmVyIGZvciB0aGUgU2lsaWNvbiBHcmFwaGljcyAzMjAgYW5kIDU0MCBWaXN1YWwKLVdvcmtzdGF0aW9ucycgb25ib2FyZCBhdWRpby4KLQotQ29weXJpZ2h0IDE5OTkgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotCi1BdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIE1hcmNoIDE5OTksIHRoZXJlIGFyZSB0d28gbW9kZWxzIG9mCi1WaXN1YWwgV29ya3N0YXRpb24sIHRoZSAzMjAgYW5kIHRoZSA1NDAuICBUaGlzIGRvY3VtZW50IG9ubHkgZGVzY3JpYmVzCi10aG9zZSBtb2RlbHMuICBGdXR1cmUgVmlzdWFsIFdvcmtzdGF0aW9uIG1vZGVscyBtYXkgaGF2ZSBkaWZmZXJlbnQKLXNvdW5kIGNhcGFiaWxpdGllcywgYW5kIHRoaXMgZHJpdmVyIHdpbGwgcHJvYmFibHkgbm90IHdvcmsgb24gdGhvc2UKLWJveGVzLgotCi1UaGUgVmlzdWFsIFdvcmtzdGF0aW9uIGhhcyBhbiBBbmFsb2cgRGV2aWNlcyBBRDE4NDMgIlNvdW5kQ29tbSIgYXVkaW8KLWNvZGVjIGNoaXAuICBUaGUgQUQxODQzIGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIENvYmFsdCBJL08gQVNJQywgYWxzbwota25vd24gYXMgTGl0aGl1bS4gIFRoaXMgZHJpdmVyIHByb2dyYW1zIGJvdGggY2hpcHMuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUVVJQ0sgQ09ORklHVVJBVElPTgotCi0JIyBpbnNtb2Qgc291bmRjb3JlCi0JIyBpbnNtb2QgdndzbmQKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1JL08gQ09OTkVDVElPTlMKLQotT24gdGhlIFZpc3VhbCBXb3Jrc3RhdGlvbiwgb25seSB0aHJlZSBvZiB0aGUgQUQxODQzIGlucHV0cyBhcmUgaG9va2VkCi11cC4gIFRoZSBhbmFsb2cgbGluZSBpbiBqYWNrcyBhcmUgY29ubmVjdGVkIHRvIHRoZSBBRDE4NDMncyBBVVgxCi1pbnB1dC4gIFRoZSBDRCBhdWRpbyBsaW5lcyBhcmUgY29ubmVjdGVkIHRvIHRoZSBBRDE4NDMncyBBVVgyIGlucHV0LgotVGhlIG1pY3JvcGhvbmUgamFjayBpcyBjb25uZWN0ZWQgdG8gdGhlIEFEMTg0MydzIE1JQyBpbnB1dC4gIFRoZSBtaWMKLWphY2sgaXMgbW9ubywgYnV0IHRoZSBzaWduYWwgaXMgZGVsaXZlcmVkIHRvIGJvdGggdGhlIGxlZnQgYW5kIHJpZ2h0Ci1NSUMgaW5wdXRzLiAgWW91IGNhbiByZWNvcmQgaW4gc3RlcmVvIGZyb20gdGhlIG1pYyBpbnB1dCwgYnV0IHlvdSB3aWxsCi1nZXQgdGhlIHNhbWUgc2lnbmFsIG9uIGJvdGggY2hhbm5lbHMgKHdpdGhpbiB0aGUgbGltaXRzIG9mIEEvRAotYWNjdXJhY3kpLiAgRnVsbCBzY2FsZSBvbiB0aGUgTGluZSBpbnB1dCBpcyArLy0gMi4wIFYuICBGdWxsIHNjYWxlIG9uCi10aGUgTUlDIGlucHV0IGlzIDIwIGRCIGxlc3MsIG9yICsvLSAwLjIgVi4KLQotVGhlIEFEMTg0MydzIExPVVQxIG91dHB1dHMgYXJlIGNvbm5lY3RlZCB0byB0aGUgTGluZSBPdXQgamFja3MuICBUaGUKLUFEMTg0MydzIEhQT1VUIG91dHB1dHMgYXJlIGNvbm5lY3RlZCB0byB0aGUgc3BlYWtlci9oZWFkcGhvbmUgamFjay4KLUxPVVQyIGlzIG5vdCBjb25uZWN0ZWQuICBMaW5lIG91dCdzIG1heGltdW0gbGV2ZWwgaXMgKy8tIDIuMCBWIHBlYWsgdG8KLXBlYWsuICBUaGUgc3BlYWtlci9oZWFkcGhvbmUgb3V0J3MgbWF4aW11bSBpcyArLy0gNC4wIFYgcGVhayB0byBwZWFrLgotCi1UaGUgQUQxODQzJ3MgUENNIGlucHV0IGNoYW5uZWwgYW5kIG9uZSBvZiBpdHMgb3V0cHV0IGNoYW5uZWxzIChEQUMxKQotYXJlIGNvbm5lY3RlZCB0byBMaXRoaXVtLiAgVGhlIG90aGVyIG91dHB1dCBjaGFubmVsIChEQUMyKSBpcyBub3QKLWNvbm5lY3RlZC4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1DQVBBQklMSVRJRVMKLQotVGhlIEFEMTg0MyBoYXMgUENNIGlucHV0IGFuZCBvdXRwdXQgKFB1bHNlIENvZGUgTW9kdWxhdGlvbiwgYWxzbyBrbm93bgotYXMgd2F2ZXRhYmxlKS4gIFBDTSBpbnB1dCBhbmQgb3V0cHV0IGNhbiBiZSBtb25vIG9yIHN0ZXJlbyBpbiBhbnkgb2YKLWZvdXIgZm9ybWF0cy4gIFRoZSBmb3JtYXRzIGFyZSAxNiBiaXQgc2lnbmVkIGFuZCA4IGJpdCB1bnNpZ25lZCwKLXUtTGF3LCBhbmQgQS1MYXcgZm9ybWF0LiAgQW55IHNhbXBsZSByYXRlIGZyb20gNCBLSHogdG8gNDkgS0h6IGlzCi1hdmFpbGFibGUsIGluIDEgSHogaW5jcmVtZW50cy4KLQotVGhlIEFEMTg0MyBpbmNsdWRlcyBhbiBhbmFsb2cgbWl4ZXIgdGhhdCBjYW4gbWl4IGFsbCB0aHJlZSBpbnB1dAotc2lnbmFscyAobGluZSwgbWljIGFuZCBDRCkgaW50byB0aGUgYW5hbG9nIG91dHB1dHMuICBUaGUgbWl4ZXIgaGFzIGEKLXNlcGFyYXRlIGdhaW4gY29udHJvbCBhbmQgbXV0ZSBzd2l0Y2ggZm9yIGVhY2ggaW5wdXQuCi0KLVRoZXJlIGFyZSB0d28gb3V0cHV0cywgbGluZSBvdXQgYW5kIHNwZWFrZXIvaGVhZHBob25lIG91dC4gIFRoZXkKLWFsd2F5cyBwcm9kdWNlIHRoZSBzYW1lIHNpZ25hbCwgYW5kIHRoZSBzcGVha2VyIGFsd2F5cyBoYXMgMyBkQiBtb3JlCi1nYWluIHRoYW4gdGhlIGxpbmUgb3V0LiAgVGhlIHNwZWFrZXIvaGVhZHBob25lIG91dHB1dCBjYW4gYmUgbXV0ZWQsCi1idXQgdGhpcyBkcml2ZXIgZG9lcyBub3QgZXhwb3J0IHRoYXQgZnVuY3Rpb24uCi0KLVRoZSBoYXJkd2FyZSBjYW4gc3luYyBhdWRpbyB0byB0aGUgdmlkZW8gY2xvY2ssIGJ1dCB0aGlzIGRyaXZlciBkb2VzCi1ub3QgaGF2ZSBhIHdheSB0byBzcGVjaWZ5IHN5bmNpbmcgdG8gdmlkZW8uCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUFJPR1JBTU1JTkcKLQotVGhpcyBzZWN0aW9uIGV4cGxhaW5zIHRoZSBBUEkgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIuICBBbHNvIHNlZSB0aGUKLU9wZW4gU291bmQgUHJvZ3JhbW1pbmcgR3VpZGUgYXQgaHR0cDovL3d3dy5vcGVuc291bmQuY29tL3BndWlkZS8gLgotVGhpcyBzZWN0aW9uIGFzc3VtZXMgZmFtaWxpYXJpdHkgd2l0aCB0aGF0IGRvY3VtZW50LgotCi1UaGUgZHJpdmVyIGhhcyB0d28gaW50ZXJmYWNlcywgYW4gSS9PIGludGVyZmFjZSBhbmQgYSBtaXhlciBpbnRlcmZhY2UuCi1UaGVyZSBpcyBubyBNSURJIG9yIHNlcXVlbmNlciBjYXBhYmlsaXR5LgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVBST0dSQU1NSU5HIFBDTSBJL08KLQotVGhlIEkvTyBpbnRlcmZhY2UgaXMgdXN1YWxseSBhY2Nlc3NlZCBhcyAvZGV2L2F1ZGlvIG9yIC9kZXYvZHNwLgotVXNpbmcgdGhlIHN0YW5kYXJkIE9wZW4gU291bmQgU3lzdGVtIChPU1MpIGlvY3RsIGNhbGxzLCB0aGUgc2FtcGxlCi1yYXRlLCBudW1iZXIgb2YgY2hhbm5lbHMsIGFuZCBzYW1wbGUgZm9ybWF0IG1heSBiZSBzZXQgd2l0aGluIHRoZQotbGltaXRhdGlvbnMgZGVzY3JpYmVkIGFib3ZlLiAgVGhlIGRyaXZlciBzdXBwb3J0cyB0cmlnZ2VyaW5nLiAgSXQgYWxzbwotc3VwcG9ydHMgZ2V0dGluZyB0aGUgaW5wdXQgYW5kIG91dHB1dCBwb2ludGVycyB3aXRoIG9uZS1zYW1wbGUKLWFjY3VyYWN5LgotCi1UaGUgU05EQ1RMX0RTUF9HRVRDQVAgaW9jdGwgcmV0dXJucyB0aGVzZSBjYXBhYmlsaXRpZXMuCi0KLQlEU1BfQ0FQX0RVUExFWCAtIGRyaXZlciBzdXBwb3J0cyBmdWxsIGR1cGxleC4KLQotCURTUF9DQVBfVFJJR0dFUiAtIGRyaXZlciBzdXBwb3J0cyB0cmlnZ2VyaW5nLgotCi0JRFNQX0NBUF9SRUFMVElNRSAtIHZhbHVlcyByZXR1cm5lZCBieSBTTkRDVExfRFNQX0dFVElQVFIKLQlhbmQgU05EQ1RMX0RTUF9HRVRPUFRSIGFyZSBhY2N1cmF0ZSB0byBhIGZldyBzYW1wbGVzLgotCi1NZW1vcnkgbWFwcGluZyAobW1hcCkgaXMgbm90IGltcGxlbWVudGVkLgotCi1UaGUgZHJpdmVyIHBlcm1pdHMgc3ViZGl2aWRlZCBmcmFnbWVudCBzaXplcyBmcm9tIDY0IHRvIDQwOTYgYnl0ZXMuCi1UaGUgbnVtYmVyIG9mIGZyYWdtZW50cyBjYW4gYmUgYW55dGhpbmcgZnJvbSAzIGZyYWdtZW50cyB0byBob3dldmVyCi1tYW55IGZyYWdtZW50cyBmaXQgaW50byAxMjQga2lsb2J5dGVzLiAgSXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8KLWRldGVybWluZSBob3cgZmV3L3NtYWxsIGZyYWdtZW50cyBjYW4gYmUgdXNlZCB3aXRob3V0IGludHJvZHVjaW5nCi1nbGl0Y2hlcyB3aXRoIGEgZ2l2ZW4gd29ya2xvYWQuICBMaW51eCBpcyBub3QgcmVhbHRpbWUsIHNvIHdlIGNhbid0Ci1wcm9taXNlIGFueXRoaW5nLiAgKHNpZ2guLi4pCi0KLVdoZW4gdGhpcyBkcml2ZXIgaXMgc3dpdGNoZWQgaW50byBvciBvdXQgb2YgbXUtTGF3IG9yIEEtTGF3IG1vZGUgb24KLW91dHB1dCwgaXQgbWF5IHByb2R1Y2UgYW4gYXVkaWJsZSBjbGljay4gIFRoaXMgaXMgdW5hdm9pZGFibGUuICBUbwotcHJldmVudCBjbGlja2luZywgdXNlIHNpZ25lZCAxNi1iaXQgbW9kZSBpbnN0ZWFkLCBhbmQgY29udmVydCBmcm9tCi1tdS1MYXcgb3IgQS1MYXcgZm9ybWF0IGluIHNvZnR3YXJlLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVBST0dSQU1NSU5HIFRIRSBNSVhFUiBJTlRFUkZBQ0UKLQotVGhlIG1peGVyIGludGVyZmFjZSBpcyB1c3VhbGx5IGFjY2Vzc2VkIGFzIC9kZXYvbWl4ZXIuICBJdCBpcyBhY2Nlc3NlZAotdGhyb3VnaCBpb2N0bHMuICBUaGUgbWl4ZXIgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBjb250cm9sIGdhaW4gb3IKLW11dGUgc2V2ZXJhbCBhdWRpbyBzaWduYWwgcGF0aHMsIGFuZCBhbHNvIGFsbG93cyBzZWxlY3Rpb24gb2YgdGhlCi1yZWNvcmRpbmcgc291cmNlLgotCi1FYWNoIG9mIHRoZSBjb25zdGFudHMgZGVzY3JpYmVkIGhlcmUgY2FuIGJlIHJlYWQgdXNpbmcgdGhlCi1NSVhFUl9SRUFEKFNPVU5EX01JWEVSX3h4eCkgaW9jdGwuICBUaG9zZSB0aGF0IGFyZSBub3QgcmVhZC1vbmx5IGNhbgotYWxzbyBiZSB3cml0dGVuIHVzaW5nIHRoZSBNSVhFUl9XUklURShTT1VORF9NSVhFUl94eHgpIGlvY3RsLiAgSW4gbW9zdAotY2FzZXMsIDxzeXMvc291bmRjYXJkLmg+IGRlZmluZXMgY29uc3RhbnRzIFNPVU5EX01JWEVSX1JFQURfeHh4IGFuZAotU09VTkRfTUlYRVJfV1JJVEVfeHh4IHdoaWNoIHdvcmsganVzdCBhcyB3ZWxsLgotCi1TT1VORF9NSVhFUl9DQVBTCVJlYWQtb25seQotCi1UaGlzIGlzIGEgbWFzayBvZiBvcHRpb25hbCBkcml2ZXIgY2FwYWJpbGl0aWVzIHRoYXQgYXJlIGltcGxlbWVudGVkLgotVGhpcyBkcml2ZXIncyBvbmx5IGNhcGFiaWxpdHkgaXMgU09VTkRfQ0FQX0VYQ0xfSU5QVVQsIHdoaWNoIG1lYW5zCi10aGF0IG9ubHkgb25lIHJlY29yZGluZyBzb3VyY2UgY2FuIGJlIGFjdGl2ZSBhdCBhIHRpbWUuCi0KLVNPVU5EX01JWEVSX0RFVk1BU0sJUmVhZC1vbmx5Ci0KLVRoaXMgaXMgYSBtYXNrIG9mIHRoZSBzb3VuZCBjaGFubmVscy4gIFRoaXMgZHJpdmVyJ3MgY2hhbm5lbHMgYXJlIFBDTSwKLUxJTkUsIE1JQywgQ0QsIGFuZCBSRUNMRVYuCi0KLVNPVU5EX01JWEVSX1NURVJFT0RFVlMJUmVhZC1vbmx5Ci0KLVRoaXMgaXMgYSBtYXNrIG9mIHdoaWNoIHNvdW5kIGNoYW5uZWxzIGFyZSBjYXBhYmxlIG9mIHN0ZXJlby4gIEFsbAotY2hhbm5lbHMgYXJlIGNhcGFibGUgb2Ygc3RlcmVvLiAgKEJ1dCBzZWUgY2F2ZWF0IG9uIE1JQyBpbnB1dCBpbiBJL08KLUNPTk5FQ1RJT05TIHNlY3Rpb24gYWJvdmUpLgotCi1TT1VORF9NSVhFUl9PVVRNQVNLCVJlYWQtb25seQotCi1UaGlzIGlzIGEgbWFzayBvZiBjaGFubmVscyB0aGF0IHJvdXRlIGlucHV0cyB0aHJvdWdoIHRvIG91dHB1dHMuCi1UaG9zZSBhcmUgTElORSwgTUlDLCBhbmQgQ0QuCi0KLVNPVU5EX01JWEVSX1JFQ01BU0sJUmVhZC1vbmx5Ci0KLVRoaXMgaXMgYSBtYXNrIG9mIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHJlY29yZGluZyBzb3VyY2VzLiAgVGhvc2UgYXJlCi1QQ00sIExJTkUsIE1JQywgQ0QuCi0KLVNPVU5EX01JWEVSX1BDTQkJRGVmYXVsdDogMHg1NzU3ICgwIGRCKQotCi1UaGlzIGlzIHRoZSBnYWluIGNvbnRyb2wgZm9yIFBDTSBvdXRwdXQuICBUaGUgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbAotZ2FpbiBhcmUgY29udHJvbGxlZCBpbmRlcGVuZGVudGx5LiAgVGhpcyBnYWluIGNvbnRyb2wgaGFzIDY0IGxldmVscywKLXdoaWNoIHJhbmdlIGZyb20gLTgyLjUgZEIgdG8gKzEyLjAgZEIgaW4gMS41IGRCIHN0ZXBzLiAgVGhvc2UgNjQKLWxldmVscyBhcmUgbWFwcGVkIG9udG8gMTAwIGxldmVscyBhdCB0aGUgaW9jdGwsIHNlZSBiZWxvdy4KLQotU09VTkRfTUlYRVJfTElORQlEZWZhdWx0OiAweDRhNGEgKDAgZEIpCi0KLVRoaXMgaXMgdGhlIGdhaW4gY29udHJvbCBmb3IgbWl4aW5nIHRoZSBMaW5lIEluIHNvdXJjZSBpbnRvIHRoZQotb3V0cHV0cy4gIFRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGdhaW4gYXJlIGNvbnRyb2xsZWQKLWluZGVwZW5kZW50bHkuICBUaGlzIGdhaW4gY29udHJvbCBoYXMgMzIgbGV2ZWxzLCB3aGljaCByYW5nZSBmcm9tCi0tMzQuNSBkQiB0byArMTIuMCBkQiBpbiAxLjUgZEIgc3RlcHMuICBUaG9zZSAzMiBsZXZlbHMgYXJlIG1hcHBlZCBvbnRvCi0xMDAgbGV2ZWxzIGF0IHRoZSBpb2N0bCwgc2VlIGJlbG93LgotCi1TT1VORF9NSVhFUl9NSUMJCURlZmF1bHQ6IDB4NGE0YSAoMCBkQikKLQotVGhpcyBpcyB0aGUgZ2FpbiBjb250cm9sIGZvciBtaXhpbmcgdGhlIE1JQyBzb3VyY2UgaW50byB0aGUgb3V0cHV0cy4KLVRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGdhaW4gYXJlIGNvbnRyb2xsZWQgaW5kZXBlbmRlbnRseS4gIFRoaXMKLWdhaW4gY29udHJvbCBoYXMgMzIgbGV2ZWxzLCB3aGljaCByYW5nZSBmcm9tIC0zNC41IGRCIHRvICsxMi4wIGRCIGluCi0xLjUgZEIgc3RlcHMuICBUaG9zZSAzMiBsZXZlbHMgYXJlIG1hcHBlZCBvbnRvIDEwMCBsZXZlbHMgYXQgdGhlCi1pb2N0bCwgc2VlIGJlbG93LgotCi1TT1VORF9NSVhFUl9DRAkJRGVmYXVsdDogMHg0YTRhICgwIGRCKQotCi1UaGlzIGlzIHRoZSBnYWluIGNvbnRyb2wgZm9yIG1peGluZyB0aGUgQ0QgYXVkaW8gc291cmNlIGludG8gdGhlCi1vdXRwdXRzLiAgVGhlIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgZ2FpbiBhcmUgY29udHJvbGxlZAotaW5kZXBlbmRlbnRseS4gIFRoaXMgZ2FpbiBjb250cm9sIGhhcyAzMiBsZXZlbHMsIHdoaWNoIHJhbmdlIGZyb20KLS0zNC41IGRCIHRvICsxMi4wIGRCIGluIDEuNSBkQiBzdGVwcy4gIFRob3NlIDMyIGxldmVscyBhcmUgbWFwcGVkIG9udG8KLTEwMCBsZXZlbHMgYXQgdGhlIGlvY3RsLCBzZWUgYmVsb3cuCi0KLVNPVU5EX01JWEVSX1JFQ0xFVgkgRGVmYXVsdDogMCAoMCBkQikKLQotVGhpcyBpcyB0aGUgZ2FpbiBjb250cm9sIGZvciBQQ00gaW5wdXQgKFJFQ29yZGluZyBMRVZlbCkuICBUaGUgbGVmdAotYW5kIHJpZ2h0IGNoYW5uZWwgZ2FpbiBhcmUgY29udHJvbGxlZCBpbmRlcGVuZGVudGx5LiAgVGhpcyBnYWluCi1jb250cm9sIGhhcyAxNiBsZXZlbHMsIHdoaWNoIHJhbmdlIGZyb20gMCBkQiB0byArMjIuNSBkQiBpbiAxLjUgZEIKLXN0ZXBzLiAgVGhvc2UgMTYgbGV2ZWxzIGFyZSBtYXBwZWQgb250byAxMDAgbGV2ZWxzIGF0IHRoZSBpb2N0bCwgc2VlCi1iZWxvdy4KLQotU09VTkRfTUlYRVJfUkVDU1JDCSBEZWZhdWx0OiBTT1VORF9NQVNLX0xJTkUKLQotVGhpcyBpcyBhIG1hc2sgb2YgY3VycmVudGx5IHNlbGVjdGVkIFBDTSBpbnB1dCBzb3VyY2VzIChSRUNvcmRpbmcKLVNvdVJDZXMpLiAgQmVjYXVzZSB0aGUgQUQxODQzIGNhbiBvbmx5IGhhdmUgYSBzaW5nbGUgcmVjb3JkaW5nIHNvdXJjZQotYXQgYSB0aW1lLCBvbmx5IG9uZSBiaXQgYXQgYSB0aW1lIGNhbiBiZSBzZXQgaW4gdGhpcyBtYXNrLiAgVGhlCi1hbGxvd2FibGUgdmFsdWVzIGFyZSBTT1VORF9NQVNLX1BDTSwgU09VTkRfTUFTS19MSU5FLCBTT1VORF9NQVNLX01JQywKLW9yIFNPVU5EX01BU0tfQ0QuICBTZWxlY3RpbmcgU09VTkRfTUFTS19QQ00gc2V0cyB1cCBpbnRlcm5hbAotcmVzYW1wbGluZyB3aGljaCBpcyB1c2VmdWwgZm9yIGxvb3BiYWNrIHRlc3RpbmcgYW5kIGZvciBoYXJkd2FyZQotc2FtcGxlIHJhdGUgY29udmVyc2lvbi4gIEJ1dCBzb2Z0d2FyZSBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uIGlzCi1wcm9iYWJseSBmYXN0ZXIsIHNvIEkgZG9uJ3Qga25vdyBob3cgdXNlZnVsIHRoYXQgaXMuCi0KLVNPVU5EX01JWEVSX09VVFNSQwlERUZBVUxUOiBTT1VORF9NQVNLX0xJTkV8U09VTkRfTUFTS19NSUN8U09VTkRfTUFTS19DRAotCi1UaGlzIGlzIGEgbWFzayBvZiBzb3VyY2VzIHRoYXQgYXJlIGN1cnJlbnRseSBwYXNzZWQgdGhyb3VnaCB0byB0aGUKLW91dHB1dHMuICBUaG9zZSBzb3VyY2VzIHdob3NlIGJpdHMgYXJlIG5vdCBzZXQgYXJlIG11dGVkLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUdBSU4gQ09OVFJPTAotCi1UaGVyZSBhcmUgZml2ZSBnYWluIGNvbnRyb2xzIGxpc3RlZCBhYm92ZS4gIEVhY2ggaGFzIDE2LCAzMiwgb3IgNjQKLXN0ZXBzLiAgRWFjaCBjb250cm9sIGhhcyAxLjUgZEIgb2YgZ2FpbiBwZXIgc3RlcC4gIEVhY2ggY29udHJvbCBpcwotc3RlcmVvLgotCi1UaGUgT1NTIGRlZmluZXMgdGhlIGFyZ3VtZW50IHRvIGEgY2hhbm5lbCBnYWluIGlvY3RsIGFzIGhhdmluZyB0d28KLWNvbXBvbmVudHMsIGxlZnQgYW5kIHJpZ2h0LCBlYWNoIG9mIHdoaWNoIHJhbmdlcyBmcm9tIDAgdG8gMTAwLiAgVGhlCi10d28gY29tcG9uZW50cyBhcmUgcGFja2VkIGludG8gdGhlIHNhbWUgd29yZCwgd2l0aCB0aGUgbGVmdCBzaWRlIGdhaW4KLWluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlLCBhbmQgdGhlIHJpZ2h0IHNpZGUgZ2FpbiBpbiB0aGUgc2Vjb25kCi1sZWFzdCBzaWduaWZpY2FudCBieXRlLiAgSW4gQywgd2Ugd291bGQgc2F5IHRoaXMuCi0KLQkjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLQkuLi4KLQotCSAJYXNzZXJ0KGxlZnRnYWluID49IDAgJiYgbGVmdGdhaW4gPD0gMTAwKTsKLQkJYXNzZXJ0KHJpZ2h0Z2FpbiA+PSAwICYmIHJpZ2h0Z2FpbiA8PSAxMDApOwotCQlhcmcgPSBsZWZ0Z2FpbiB8IHJpZ2h0Z2FpbiA8PCA4OwotCi1TbyBlYWNoIE9TUyBnYWluIGNvbnRyb2wgaGFzIDEwMSBzdGVwcy4gIEJ1dCB0aGUgaGFyZHdhcmUgaGFzIDE2LCAzMiwKLW9yIDY0IHN0ZXBzLiAgVGhlIGhhcmR3YXJlIHN0ZXBzIGFyZSBzcHJlYWQgYWNyb3NzIHRoZSAxMDEgT1NTIHN0ZXBzCi1uZWFybHkgZXZlbmx5LiAgVGhlIGNvbnZlcnNpb24gZm9ybXVsYXMgYXJlIGxpa2UgdGhpcywgZ2l2ZW4gTiBlcXVhbHMKLTE2LCAzMiwgb3IgNjQuCi0KLQlpbnQgcm91bmQgPSBOLzIgLSAxOwotCU9TU19nYWluX3N0ZXBzID0gKGh3X2dhaW5fc3RlcHMgKiAxMDAgKyByb3VuZCkgLyAoTiAtIDEpOwotCWh3X2dhaW5fc3RlcHMgPSAoT1NTX2dhaW5fc3RlcHMgKiAoTiAtIDEpICsgcm91bmQpIC8gMTAwOwotCi1IZXJlIGlzIGEgc25pcHBldCBvZiBDIGNvZGUgdGhhdCB3aWxsIHJldHVybiB0aGUgbGVmdCBhbmQgcmlnaHQgZ2Fpbgotb2YgYW55IGNoYW5uZWwgaW4gZEIuICBQYXNzIGl0IG9uZSBvZiB0aGUgcHJlZGVmaW5lZCBnYWluX2Rlc2NfdAotc3RydWN0dXJlcyB0byBhY2Nlc3MgYW55IG9mIHRoZSBmaXZlIGNoYW5uZWxzJyBnYWlucy4KLQotCXR5cGVkZWYgc3RydWN0IGdhaW5fZGVzYyB7Ci0JCWZsb2F0IG1pbl9nYWluOwotCQlmbG9hdCBnYWluX3N0ZXA7Ci0JCWludCBuYml0czsKLQkJaW50IGNoYW47Ci0JfSBnYWluX2Rlc2NfdDsKLQotCWNvbnN0IGdhaW5fZGVzY190IGdhaW5fcGNtICAgID0geyAtODIuNSwgMS41LCA2LCBTT1VORF9NSVhFUl9QQ00gICAgfTsKLQljb25zdCBnYWluX2Rlc2NfdCBnYWluX2xpbmUgICA9IHsgLTM0LjUsIDEuNSwgNSwgU09VTkRfTUlYRVJfTElORSAgIH07Ci0JY29uc3QgZ2Fpbl9kZXNjX3QgZ2Fpbl9taWMgICAgPSB7IC0zNC41LCAxLjUsIDUsIFNPVU5EX01JWEVSX01JQyAgICB9OwotCWNvbnN0IGdhaW5fZGVzY190IGdhaW5fY2QgICAgID0geyAtMzQuNSwgMS41LCA1LCBTT1VORF9NSVhFUl9DRCAgICAgfTsKLQljb25zdCBnYWluX2Rlc2NfdCBnYWluX3JlY2xldiA9IHsgICAwLjAsIDEuNSwgNCwgU09VTkRfTUlYRVJfUkVDTEVWIH07Ci0KLQlpbnQgZ2V0X2dhaW5fZEIoaW50IGZkLCBjb25zdCBnYWluX2Rlc2NfdCAqZ3AsCi0JCQlmbG9hdCAqbGVmdCwgZmxvYXQgKnJpZ2h0KQotCXsKLQkJaW50IHdvcmQ7Ci0JCWludCBsZywgcmc7Ci0JCWludCBtYXNrID0gKDEgPDwgZ3AtPm5iaXRzKSAtIDE7Ci0KLQkJaWYgKGlvY3RsKGZkLCBNSVhFUl9SRUFEKGdwLT5jaGFuKSwgJndvcmQpICE9IDApCi0JCQlyZXR1cm4gLTE7CS8qIGZhaWwgKi8KLQkJbGcgPSB3b3JkICYgMHhGRjsKLQkJcmcgPSB3b3JkID4+IDggJiAweEZGOwotCQlsZyA9IChsZyAqIG1hc2sgKyBtYXNrIC8gMikgLyAxMDA7Ci0JCXJnID0gKHJnICogbWFzayArIG1hc2sgLyAyKSAvIDEwMDsKLQkJKmxlZnQgPSBncC0+bWluX2dhaW4gKyBncC0+Z2Fpbl9zdGVwICogbGc7Ci0JCSpyaWdodCA9IGdwLT5taW5fZ2FpbiArIGdwLT5nYWluX3N0ZXAgKiByZzsKLQkJcmV0dXJuIDA7Ci0JfQkKLQotQW5kIGhlcmUgaXMgdGhlIGNvcnJlc3BvbmRpbmcgcm91dGluZSB0byBzZXQgYSBjaGFubmVsJ3MgZ2FpbiBpbiBkQi4KLQotCWludCBzZXRfZ2Fpbl9kQihpbnQgZmQsIGNvbnN0IGdhaW5fZGVzY190ICpncCwgZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpCi0JewotCQlmbG9hdCBtYXhfZ2FpbiA9Ci0JCQlncC0+bWluX2dhaW4gKyAoMSA8PCBncC0+bmJpdHMpICogZ3AtPmdhaW5fc3RlcDsKLQkJZmxvYXQgcm91bmQgPSBncC0+Z2Fpbl9zdGVwIC8gMjsKLQkJaW50IG1hc2sgPSAoMSA8PCBncC0+bmJpdHMpIC0gMTsKLQkJaW50IHdvcmQ7Ci0JCWludCBsZywgcmc7Ci0KLQkJaWYgKGxlZnQgPCBncC0+bWluX2dhaW4gfHwgcmlnaHQgPCBncC0+bWluX2dhaW4pCi0JCQlyZXR1cm4gRUlOVkFMOwotCQlsZyA9IChsZWZ0IC0gZ3AtPm1pbl9nYWluICsgcm91bmQpIC8gZ3AtPmdhaW5fc3RlcDsKLQkJcmcgPSAocmlnaHQgLSBncC0+bWluX2dhaW4gKyByb3VuZCkgLyBncC0+Z2Fpbl9zdGVwOwotCQlpZiAobGcgPj0gKDEgPDwgZ3AtPm5iaXRzKSB8fCByZyA+PSAoMSA8PCBncC0+bmJpdHMpKQotCQkJcmV0dXJuIEVJTlZBTDsKLQkJbGcgPSAoMTAwICogbGcgKyBtYXNrIC8gMikgLyBtYXNrOwotCQlyZyA9ICgxMDAgKiByZyArIG1hc2sgLyAyKSAvIG1hc2s7Ci0JCXdvcmQgPSBsZyB8IHJnIDw8IDg7Ci0KLQkJcmV0dXJuIGlvY3RsKGZkLCBNSVhFUl9XUklURShncC0+Y2hhbiksICZ3b3JkKTsKLQl9Ci0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BpL3NwaWRldiBiL0RvY3VtZW50YXRpb24vc3BpL3NwaWRldgppbmRleCBlZDJkYTVlLi4zZDE0MDM1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NwaS9zcGlkZXYKKysrIGIvRG9jdW1lbnRhdGlvbi9zcGkvc3BpZGV2CkBAIC04NSw2ICs4NSwxMiBAQAogCVNQSV9NT0RFXzAuLlNQSV9NT0RFXzM7IG9yIGlmIHlvdSBwcmVmZXIgeW91IGNhbiBjb21iaW5lIFNQSV9DUE9MCiAJKGNsb2NrIHBvbGFyaXR5LCBpZGxlIGhpZ2ggaWZmIHRoaXMgaXMgc2V0KSBvciBTUElfQ1BIQSAoY2xvY2sgcGhhc2UsCiAJc2FtcGxlIG9uIHRyYWlsaW5nIGVkZ2UgaWZmIHRoaXMgaXMgc2V0KSBmbGFncy4KKwlOb3RlIHRoYXQgdGhpcyByZXF1ZXN0IGlzIGxpbWl0ZWQgdG8gU1BJIG1vZGUgZmxhZ3MgdGhhdCBmaXQgaW4gYQorCXNpbmdsZSBieXRlLgorCisgICAgU1BJX0lPQ19SRF9NT0RFMzIsIFNQSV9JT0NfV1JfTU9ERTMyIC4uLiBwYXNzIGEgcG9pbnRlciB0byBhIHVpbjMyX3QKKwl3aGljaCB3aWxsIHJldHVybiAoUkQpIG9yIGFzc2lnbiAoV1IpIHRoZSBmdWxsIFNQSSB0cmFuc2ZlciBtb2RlLAorCW5vdCBsaW1pdGVkIHRvIHRoZSBiaXRzIHRoYXQgZml0IGluIG9uZSBieXRlLgogCiAgICAgU1BJX0lPQ19SRF9MU0JfRklSU1QsIFNQSV9JT0NfV1JfTFNCX0ZJUlNUIC4uLiBwYXNzIGEgcG9pbnRlciB0byBhIGJ5dGUKIAl3aGljaCB3aWxsIHJldHVybiAoUkQpIG9yIGFzc2lnbiAoV1IpIHRoZSBiaXQganVzdGlmaWNhdGlvbiB1c2VkIHRvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaS9zcGlkZXZfZmR4LmMgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGlkZXZfZmR4LmMKaW5kZXggMzZlYzA3Ny4uMGVhM2U1MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zcGkvc3BpZGV2X2ZkeC5jCisrKyBiL0RvY3VtZW50YXRpb24vc3BpL3NwaWRldl9mZHguYwpAQCAtNzgsMTAgKzc4LDEwIEBACiAKIHN0YXRpYyB2b2lkIGR1bXBzdGF0KGNvbnN0IGNoYXIgKm5hbWUsIGludCBmZCkKIHsKLQlfX3U4CW1vZGUsIGxzYiwgYml0czsKLQlfX3UzMglzcGVlZDsKKwlfX3U4CWxzYiwgYml0czsKKwlfX3UzMgltb2RlLCBzcGVlZDsKIAotCWlmIChpb2N0bChmZCwgU1BJX0lPQ19SRF9NT0RFLCAmbW9kZSkgPCAwKSB7CisJaWYgKGlvY3RsKGZkLCBTUElfSU9DX1JEX01PREUzMiwgJm1vZGUpIDwgMCkgewogCQlwZXJyb3IoIlNQSSByZF9tb2RlIik7CiAJCXJldHVybjsKIAl9CkBAIC05OCw3ICs5OCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlwcmludGYoIiVzOiBzcGkgbW9kZSAlZCwgJWQgYml0cyAlc3BlciB3b3JkLCAlZCBIeiBtYXhcbiIsCisJcHJpbnRmKCIlczogc3BpIG1vZGUgMHgleCwgJWQgYml0cyAlc3BlciB3b3JkLCAlZCBIeiBtYXhcbiIsCiAJCW5hbWUsIG1vZGUsIGJpdHMsIGxzYiA/ICIobHNiIGZpcnN0KSAiIDogIiIsIHNwZWVkKTsKIH0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGkvc3BpZGV2X3Rlc3QuYyBiL0RvY3VtZW50YXRpb24vc3BpL3NwaWRldl90ZXN0LmMKaW5kZXggMTZmZWRhOS4uM2EyZjlkNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zcGkvc3BpZGV2X3Rlc3QuYworKysgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGlkZXZfdGVzdC5jCkBAIC0zMCw3ICszMCw3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkZXZpY2UgPSAiL2Rldi9zcGlkZXYxLjEiOwotc3RhdGljIHVpbnQ4X3QgbW9kZTsKK3N0YXRpYyB1aW50MzJfdCBtb2RlOwogc3RhdGljIHVpbnQ4X3QgYml0cyA9IDg7CiBzdGF0aWMgdWludDMyX3Qgc3BlZWQgPSA1MDAwMDA7CiBzdGF0aWMgdWludDE2X3QgZGVsYXk7CkBAIC01Nyw2ICs1NywyMSBAQAogCQkuYml0c19wZXJfd29yZCA9IGJpdHMsCiAJfTsKIAorCWlmIChtb2RlICYgU1BJX1RYX1FVQUQpCisJCXRyLnR4X25iaXRzID0gNDsKKwllbHNlIGlmIChtb2RlICYgU1BJX1RYX0RVQUwpCisJCXRyLnR4X25iaXRzID0gMjsKKwlpZiAobW9kZSAmIFNQSV9SWF9RVUFEKQorCQl0ci5yeF9uYml0cyA9IDQ7CisJZWxzZSBpZiAobW9kZSAmIFNQSV9SWF9EVUFMKQorCQl0ci5yeF9uYml0cyA9IDI7CisJaWYgKCEobW9kZSAmIFNQSV9MT09QKSkgeworCQlpZiAobW9kZSAmIChTUElfVFhfUVVBRCB8IFNQSV9UWF9EVUFMKSkKKwkJCXRyLnJ4X2J1ZiA9IDA7CisJCWVsc2UgaWYgKG1vZGUgJiAoU1BJX1JYX1FVQUQgfCBTUElfUlhfRFVBTCkpCisJCQl0ci50eF9idWYgPSAwOworCX0KKwogCXJldCA9IGlvY3RsKGZkLCBTUElfSU9DX01FU1NBR0UoMSksICZ0cik7CiAJaWYgKHJldCA8IDEpCiAJCXBhYm9ydCgiY2FuJ3Qgc2VuZCBzcGkgbWVzc2FnZSIpOwpAQCAtODEsNyArOTYsMTEgQEAKIAkgICAgICIgIC1PIC0tY3BvbCAgICAgY2xvY2sgcG9sYXJpdHlcbiIKIAkgICAgICIgIC1MIC0tbHNiICAgICAgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGZpcnN0XG4iCiAJICAgICAiICAtQyAtLWNzLWhpZ2ggIGNoaXAgc2VsZWN0IGFjdGl2ZSBoaWdoXG4iCi0JICAgICAiICAtMyAtLTN3aXJlICAgIFNJL1NPIHNpZ25hbHMgc2hhcmVkXG4iKTsKKwkgICAgICIgIC0zIC0tM3dpcmUgICAgU0kvU08gc2lnbmFscyBzaGFyZWRcbiIKKwkgICAgICIgIC1OIC0tbm8tY3MgICAgbm8gY2hpcCBzZWxlY3RcbiIKKwkgICAgICIgIC1SIC0tcmVhZHkgICAgc2xhdmUgcHVsbHMgbG93IHRvIHBhdXNlXG4iCisJICAgICAiICAtMiAtLWR1YWwgICAgIGR1YWwgdHJhbnNmZXJcbiIKKwkgICAgICIgIC00IC0tcXVhZCAgICAgcXVhZCB0cmFuc2ZlclxuIik7CiAJZXhpdCgxKTsKIH0KIApAQCAtMTAxLDExICsxMjAsMTMgQEAKIAkJCXsgIjN3aXJlIiwgICAwLCAwLCAnMycgfSwKIAkJCXsgIm5vLWNzIiwgICAwLCAwLCAnTicgfSwKIAkJCXsgInJlYWR5IiwgICAwLCAwLCAnUicgfSwKKwkJCXsgImR1YWwiLCAgICAwLCAwLCAnMicgfSwKKwkJCXsgInF1YWQiLCAgICAwLCAwLCAnNCcgfSwKIAkJCXsgTlVMTCwgMCwgMCwgMCB9LAogCQl9OwogCQlpbnQgYzsKIAotCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIkQ6czpkOmI6bEhPTEMzTlIiLCBsb3B0cywgTlVMTCk7CisJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiRDpzOmQ6YjpsSE9MQzNOUjI0IiwgbG9wdHMsIE5VTEwpOwogCiAJCWlmIChjID09IC0xKQogCQkJYnJlYWs7CkBAIC0xNDcsMTEgKzE2OCwyMyBAQAogCQljYXNlICdSJzoKIAkJCW1vZGUgfD0gU1BJX1JFQURZOwogCQkJYnJlYWs7CisJCWNhc2UgJzInOgorCQkJbW9kZSB8PSBTUElfVFhfRFVBTDsKKwkJCWJyZWFrOworCQljYXNlICc0JzoKKwkJCW1vZGUgfD0gU1BJX1RYX1FVQUQ7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByaW50X3VzYWdlKGFyZ3ZbMF0pOwogCQkJYnJlYWs7CiAJCX0KIAl9CisJaWYgKG1vZGUgJiBTUElfTE9PUCkgeworCQlpZiAobW9kZSAmIFNQSV9UWF9EVUFMKQorCQkJbW9kZSB8PSBTUElfUlhfRFVBTDsKKwkJaWYgKG1vZGUgJiBTUElfVFhfUVVBRCkKKwkJCW1vZGUgfD0gU1BJX1JYX1FVQUQ7CisJfQogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQpAQCAtMTY4LDExICsyMDEsMTEgQEAKIAkvKgogCSAqIHNwaSBtb2RlCiAJICovCi0JcmV0ID0gaW9jdGwoZmQsIFNQSV9JT0NfV1JfTU9ERSwgJm1vZGUpOworCXJldCA9IGlvY3RsKGZkLCBTUElfSU9DX1dSX01PREUzMiwgJm1vZGUpOwogCWlmIChyZXQgPT0gLTEpCiAJCXBhYm9ydCgiY2FuJ3Qgc2V0IHNwaSBtb2RlIik7CiAKLQlyZXQgPSBpb2N0bChmZCwgU1BJX0lPQ19SRF9NT0RFLCAmbW9kZSk7CisJcmV0ID0gaW9jdGwoZmQsIFNQSV9JT0NfUkRfTU9ERTMyLCAmbW9kZSk7CiAJaWYgKHJldCA9PSAtMSkKIAkJcGFib3J0KCJjYW4ndCBnZXQgc3BpIG1vZGUiKTsKIApAQCAtMTk4LDcgKzIzMSw3IEBACiAJaWYgKHJldCA9PSAtMSkKIAkJcGFib3J0KCJjYW4ndCBnZXQgbWF4IHNwZWVkIGh6Iik7CiAKLQlwcmludGYoInNwaSBtb2RlOiAlZFxuIiwgbW9kZSk7CisJcHJpbnRmKCJzcGkgbW9kZTogMHgleFxuIiwgbW9kZSk7CiAJcHJpbnRmKCJiaXRzIHBlciB3b3JkOiAlZFxuIiwgYml0cyk7CiAJcHJpbnRmKCJtYXggc3BlZWQ6ICVkIEh6ICglZCBLSHopXG4iLCBzcGVlZCwgc3BlZWQvMTAwMCk7CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHJhY2UvZXZlbnRzLXBvd2VyLnR4dCBiL0RvY3VtZW50YXRpb24vdHJhY2UvZXZlbnRzLXBvd2VyLnR4dAppbmRleCAzYmQzM2I4Li4yMWQ1MTRjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3RyYWNlL2V2ZW50cy1wb3dlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi90cmFjZS9ldmVudHMtcG93ZXIudHh0CkBAIC05Miw1ICs5Miw1IEBACiAKIFRoZSBmaXJzdCBwYXJhbWV0ZXIgZ2l2ZXMgdGhlIGRldmljZSBuYW1lIHdoaWNoIHRyaWVzIHRvIGFkZC91cGRhdGUvcmVtb3ZlCiBRb1MgcmVxdWVzdHMuCi1UaGUgc2Vjb25kIHBhcmFtZXRlciBnaXZlcyB0aGUgcmVxdWVzdCB0eXBlIChlLmcuICJERVZfUE1fUU9TX0xBVEVOQ1kiKS4KK1RoZSBzZWNvbmQgcGFyYW1ldGVyIGdpdmVzIHRoZSByZXF1ZXN0IHR5cGUgKGUuZy4gIkRFVl9QTV9RT1NfUkVTVU1FX0xBVEVOQ1kiKS4KIFRoZSB0aGlyZCBwYXJhbWV0ZXIgaXMgdmFsdWUgdG8gYmUgYWRkZWQvdXBkYXRlZC9yZW1vdmVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzL2RzMjQ5MCBiL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy9kczI0OTAKaW5kZXggMjgxNzZkZS4uM2UwOTExNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzL2RzMjQ5MAorKysgYi9Eb2N1bWVudGF0aW9uL3cxL21hc3RlcnMvZHMyNDkwCkBAIC0yMSw4ICsyMSw2IEBACiAtIFRoZSB3ZWFrIHB1bGx1cCBjdXJyZW50IGlzIGEgbWluaW11bSBvZiAwLjltQSBhbmQgbWF4aW11bSBvZiA2LjBtQS4KIC0gVGhlIDVWIHN0cm9uZyBwdWxsdXAgaXMgc3VwcG9ydGVkIHdpdGggYSBtaW5pbXVtIG9mIDUuOW1BIGFuZCBhCiAgIG1heGltdW0gb2YgMzAuNCBtQS4gIChGcm9tIERTMjQ5MC5wZGYpCi0tIFdoaWxlIHRoZSBkczI0OTAgc3VwcG9ydHMgYSBoYXJkd2FyZSBzZWFyY2ggdGhlIGNvZGUgZG9lc24ndCB0YWtlCi0gIGFkdmFudGFnZSBvZiBpdCAoaW4gdGVzdGVkIGNhc2UgaXQgb25seSByZXR1cm5lZCBmaXJzdCBkZXZpY2UpLgogLSBUaGUgaGFyZHdhcmUgd2lsbCBkZXRlY3Qgd2hlbiBkZXZpY2VzIGFyZSBhdHRhY2hlZCB0byB0aGUgYnVzIG9uIHRoZQogICBuZXh0IGJ1cyAocmVzZXQ/KSBvcGVyYXRpb24sIGhvd2V2ZXIgb25seSBhIG1lc3NhZ2UgaXMgcHJpbnRlZCBhcwogICB0aGUgY29yZSB3MSBjb2RlIGRvZXNuJ3QgbWFrZSB1c2Ugb2YgdGhlIGluZm9ybWF0aW9uLiAgQ29ubmVjdGluZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93MS93MS5uZXRsaW5rIGIvRG9jdW1lbnRhdGlvbi93MS93MS5uZXRsaW5rCmluZGV4IGY1OWEzMTkuLjkyN2E1MmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdzEvdzEubmV0bGluaworKysgYi9Eb2N1bWVudGF0aW9uL3cxL3cxLm5ldGxpbmsKQEAgLTUsOCArNSw4IEBACiA9PT09PT09PT09PT09CiAKIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBtZXNzYWdlcyBiZXR3ZWVuIHcxIGNvcmUgYW5kIHVzZXJzcGFjZToKLTEuIEV2ZW50cy4gVGhleSBhcmUgZ2VuZXJhdGVkIGVhY2ggdGltZSBuZXcgbWFzdGVyIG9yIHNsYXZlIGRldmljZQotCWZvdW5kIGVpdGhlciBkdWUgdG8gYXV0b21hdGljIG9yIHJlcXVlc3RlZCBzZWFyY2guCisxLiBFdmVudHMuIFRoZXkgYXJlIGdlbmVyYXRlZCBlYWNoIHRpbWUgYSBuZXcgbWFzdGVyIG9yIHNsYXZlIGRldmljZQorCWlzIGZvdW5kIGVpdGhlciBkdWUgdG8gYXV0b21hdGljIG9yIHJlcXVlc3RlZCBzZWFyY2guCiAyLiBVc2Vyc3BhY2UgY29tbWFuZHMuCiAzLiBSZXBsaWVzIHRvIHVzZXJzcGFjZSBjb21tYW5kcy4KIApAQCAtMTMxLDcgKzEzMSw3IEBACiBvZiB0aGUgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgYW5kIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpLgogSWYgcmVwbHkgaXMgZ2VuZXJhdGVkIGZvciBtYXN0ZXIgb3Igcm9vdCBjb21tYW5kICh3aGljaCBkbyBub3QgaGF2ZQogdzFfbmV0bGlua19jbWQgYXR0YWNoZWQpLCByZXBseSB3aWxsIGNvbnRhaW4gb25seSBjbl9tc2cgYW5kIHcxX25ldGxpbmtfbXNnCi1zdHJ1Y3RpcmVzLgorc3RydWN0dXJlcy4KIAogdzFfbmV0bGlua19tc2cuc3RhdHVzIGZpZWxkIHdpbGwgY2FycnkgcG9zaXRpdmUgZXJyb3IgdmFsdWUKIChFSU5WQUwgZm9yIGV4YW1wbGUpIG9yIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzLgpAQCAtMTYwLDcgKzE2MCw3IEBACiBUaGVuIGFsbCByZXF1ZXN0ZWQgaW4gdzFfbmV0bGlua19tc2cgb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIG9uZSBieSBvbmUuCiBJZiBjb21tYW5kIHJlcXVpcmVzIHJlcGx5IChsaWtlIHJlYWQgY29tbWFuZCkgaXQgaXMgc2VudCBvbiBjb21tYW5kIGNvbXBsZXRpb24uCiAKLVdoZW4gYWxsIGNvbW1hbmRzICh3MV9uZXRsaW5rX2NtZCkgYXJlIHByb2Nlc3NlZCBtdXN0ZXIgZGV2aWNlIGlzIHVubG9ja2VkCitXaGVuIGFsbCBjb21tYW5kcyAodzFfbmV0bGlua19jbWQpIGFyZSBwcm9jZXNzZWQgbWFzdGVyIGRldmljZSBpcyB1bmxvY2tlZAogYW5kIG5leHQgdzFfbmV0bGlua19tc2cgaGVhZGVyIHByb2Nlc3Npbmcgc3RhcnRlZC4KIAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL3dhdGNoZG9nLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy93YXRjaGRvZy1wYXJhbWV0ZXJzLnR4dAppbmRleCBmOTQ5MmZlLi42OTI3OTFjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL3dhdGNoZG9nLXBhcmFtZXRlcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vd2F0Y2hkb2cvd2F0Y2hkb2ctcGFyYW1ldGVycy50eHQKQEAgLTE1MCw2ICsxNTAsOCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogaXQ4N193ZHQ6CiBub2dhbWVwb3J0OiBGb3JiaWQgdGhlIGFjdGl2YXRpb24gb2YgZ2FtZSBwb3J0LCBkZWZhdWx0PTAKK25vY2lyOiBGb3JiaWQgdGhlIHVzZSBvZiBDSVIgKHdvcmthcm91bmQgZm9yIHNvbWUgYnVnZ3kgc2V0dXBzKTsgc2V0IHRvIDEgaWYKK3N5c3RlbSByZXNldHMgZGVzcGl0ZSB3YXRjaGRvZyBkYWVtb24gcnVubmluZywgZGVmYXVsdD0wCiBleGNsdXNpdmU6IFdhdGNoZG9nIGV4Y2x1c2l2ZSBkZXZpY2Ugb3BlbiwgZGVmYXVsdD0xCiB0aW1lb3V0OiBXYXRjaGRvZyB0aW1lb3V0IGluIHNlY29uZHMsIGRlZmF1bHQ9NjAKIHRlc3Rtb2RlOiBXYXRjaGRvZyB0ZXN0IG1vZGUgKDEgPSBubyByZWJvb3QpLCBkZWZhdWx0PTAKQEAgLTMyNSw2ICszMjcsMTEgQEAKIHN0bXAzeHh4X3dkdDoKIGhlYXJ0YmVhdDogV2F0Y2hkb2cgaGVhcnRiZWF0IHBlcmlvZCBpbiBzZWNvbmRzIGZyb20gMSB0byA0MTk0MzA0LCBkZWZhdWx0IDE5CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0ZWdyYV93ZHQ6CitoZWFydGJlYXQ6IFdhdGNoZG9nIGhlYXJ0YmVhdHMgaW4gc2Vjb25kcy4gKGRlZmF1bHQgPSAxMjApCitub3dheW91dDogV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkCisJKGRlZmF1bHQ9a2VybmVsIGNvbmZpZyBwYXJhbWV0ZXIpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB0czcyeHhfd2R0OgogdGltZW91dDogV2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzLiAoMSA8PSB0aW1lb3V0IDw9IDgsIGRlZmF1bHQ9OCkKIG5vd2F5b3V0OiBEaXNhYmxlIHdhdGNoZG9nIHNodXRkb3duIG9uIGNsb3NlCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDc5MDMxYTUuLmI5OWJiYmMgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC0yNDIsOCArMjQyLDggQEAKIEY6CWRyaXZlcnMvcGxhdGZvcm0veDg2L2FjZXItd21pLmMKIAogQUNQSQotTToJTGVuIEJyb3duIDxsZW5iQGtlcm5lbC5vcmc+CiBNOglSYWZhZWwgSi4gV3lzb2NraSA8cmp3QHJqd3lzb2NraS5uZXQ+CitNOglMZW4gQnJvd24gPGxlbmJAa2VybmVsLm9yZz4KIEw6CWxpbnV4LWFjcGlAdmdlci5rZXJuZWwub3JnCiBXOglodHRwczovLzAxLm9yZy9saW51eC1hY3BpCiBROglodHRwczovL3BhdGNod29yay5rZXJuZWwub3JnL3Byb2plY3QvbGludXgtYWNwaS9saXN0LwpAQCAtMTMyMCw2ICsxMzIwLDcgQEAKIEw6CWxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCiBTOglTdXBwb3J0ZWQKIEY6CWFyY2gvYXJtL21hY2gtdTMwMC8KK0Y6CWRyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXItdTMwMC5jCiBGOglkcml2ZXJzL2kyYy9idXNzZXMvaTJjLXN0dTMwMC5jCiBGOglkcml2ZXJzL3J0Yy9ydGMtY29oOTAxMzMxLmMKIEY6CWRyaXZlcnMvd2F0Y2hkb2cvY29oOTAxMzI3X3dkdC5jCkBAIC0xOTIwLDggKzE5MjEsOCBAQAogRjoJaW5jbHVkZS9saW51eC9iY21hLwogCiBCUk9DQURFIEJGQSBGQyBTQ1NJIERSSVZFUgotTToJQW5pbCBHdXJ1bXVydGh5IDxhZ3VydW11ckBicm9jYWRlLmNvbT4KLU06CVZpamF5YSBNb2hhbiBHdXZ2YSA8dm1vaGFuQGJyb2NhZGUuY29tPgorTToJQW5pbCBHdXJ1bXVydGh5IDxhbmlsLmd1cnVtdXJ0aHlAcWxvZ2ljLmNvbT4KK006CVN1ZGFyc2FuYSBLYWxsdXJ1IDxzdWRhcnNhbmEua2FsbHVydUBxbG9naWMuY29tPgogTDoJbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy9zY3NpL2JmYS8KQEAgLTIyMDMsNiArMjIwNCwxMyBAQAogUzoJT2RkIEZpeGVzCiBGOglzb3VuZC9zb2MvY29kZWNzL2NzNDI3MCoKIAorQ0lSUlVTIExPR0lDIEFVRElPIENPREVDIERSSVZFUlMKK006CUJyaWFuIEF1c3RpbiA8YnJpYW4uYXVzdGluQGNpcnJ1cy5jb20+CitNOglQYXVsIEhhbmRyaWdhbiA8UGF1bC5IYW5kcmlnYW5AY2lycnVzLmNvbT4KK0w6CWFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCitTOglNYWludGFpbmVkCitGOglzb3VuZC9zb2MvY29kZWNzL2NzKgorCiBDTEVBTkNBQ0hFIEFQSQogTToJS29ucmFkIFJ6ZXN6dXRlayBXaWxrIDxrb25yYWQud2lsa0BvcmFjbGUuY29tPgogTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwpAQCAtMzY1Nyw4ICszNjY1LDggQEAKIEY6CWZzL2ZyZWV2eGZzLwogCiBGUkVFWkVSCi1NOglQYXZlbCBNYWNoZWsgPHBhdmVsQHVjdy5jej4KIE06CSJSYWZhZWwgSi4gV3lzb2NraSIgPHJqd0Byand5c29ja2kubmV0PgorTToJUGF2ZWwgTWFjaGVrIDxwYXZlbEB1Y3cuY3o+CiBMOglsaW51eC1wbUB2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZAogRjoJRG9jdW1lbnRhdGlvbi9wb3dlci9mcmVlemluZy1vZi10YXNrcy50eHQKQEAgLTQwMjIsOCArNDAzMCw4IEBACiBGOglkcml2ZXJzL3ZpZGVvL2hnYWZiLmMKIAogSElCRVJOQVRJT04gKGFrYSBTb2Z0d2FyZSBTdXNwZW5kLCBha2Egc3dzdXNwKQotTToJUGF2ZWwgTWFjaGVrIDxwYXZlbEB1Y3cuY3o+CiBNOgkiUmFmYWVsIEouIFd5c29ja2kiIDxyandAcmp3eXNvY2tpLm5ldD4KK006CVBhdmVsIE1hY2hlayA8cGF2ZWxAdWN3LmN6PgogTDoJbGludXgtcG1Admdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKIEY6CWFyY2gveDg2L3Bvd2VyLwpAQCAtNTY4OCw2ICs1Njk2LDEyIEBACiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvd2F0Y2hkb2cvbWVuYTIxX3dkdC5jCiAKK01FTiBDSEFNRUxFT04gQlVTIChtY2IpCitNOiAgCUpvaGFubmVzIFRodW1zaGlybiA8am9oYW5uZXMudGh1bXNoaXJuQG1lbi5kZT4KK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9tY2IvCitGOglpbmNsdWRlL2xpbnV4L21jYi5oCisKIE1FVEFHIEFSQ0hJVEVDVFVSRQogTToJSmFtZXMgSG9nYW4gPGphbWVzLmhvZ2FuQGltZ3RlYy5jb20+CiBMOglsaW51eC1tZXRhZ0B2Z2VyLmtlcm5lbC5vcmcKQEAgLTc4MjYsMTMgKzc4NDAsNiBAQAogRjoJZHJpdmVycy90dHkvc2VyaWFsL2lvYz9fc2VyaWFsLmMKIEY6CWluY2x1ZGUvbGludXgvaW9jPy5oCiAKLVNHSSBWSVNVQUwgV09SS1NUQVRJT04gMzIwIEFORCA1NDAKLU06CUFuZHJleSBQYW5pbiA8cGF6a2VAZG9ucGFjLnJ1PgotTDoJbGludXgtdmlzd3MtZGV2ZWxAbGlzdHMuc2YubmV0Ci1XOglodHRwOi8vbGludXgtdmlzd3Muc2YubmV0Ci1TOglNYWludGFpbmVkIGZvciAyLjYuCi1GOglEb2N1bWVudGF0aW9uL3NnaS12aXN3cy50eHQKLQogU0dJIFhQL1hQQy9YUE5FVCBEUklWRVIKIE06CUNsaWZmIFdoaWNrbWFuIDxjcHdAc2dpLmNvbT4KIE06CVJvYmluIEhvbHQgPHJvYmlubWhvbHRAZ21haWwuY29tPgpAQCAtODM4MCw2ICs4Mzg3LDEyIEBACiBTOglPZGQgRml4ZXMKIEY6CWRyaXZlcnMvc3RhZ2luZy9zbTd4eGZiLwogCitTVEFHSU5HIC0gU0xJQ09TUworTToJTGlvciBEb3RhbiA8bGlvZG90QGdtYWlsLmNvbT4KK006CUNocmlzdG9waGVyIEhhcnJlciA8Y2hhcnJlckBhbGFjcml0ZWNoLmNvbT4KK1M6CU9kZCBGaXhlcworRjoJZHJpdmVycy9zdGFnaW5nL3NsaWNvc3MvCisKIFNUQUdJTkcgLSBTT0ZUTE9HSUMgNngxMCBNUEVHIENPREVDCiBNOglJc21hZWwgTHVjZW5vIDxpc21hZWwubHVjZW5vQGNvcnAuYmx1ZWNoZXJyeS5uZXQ+CiBTOglTdXBwb3J0ZWQKQEAgLTg0NTIsOSArODQ2NSw5IEBACiBGOglkcml2ZXJzL3NoLwogCiBTVVNQRU5EIFRPIFJBTQorTToJIlJhZmFlbCBKLiBXeXNvY2tpIiA8cmp3QHJqd3lzb2NraS5uZXQ+CiBNOglMZW4gQnJvd24gPGxlbi5icm93bkBpbnRlbC5jb20+CiBNOglQYXZlbCBNYWNoZWsgPHBhdmVsQHVjdy5jej4KLU06CSJSYWZhZWwgSi4gV3lzb2NraSIgPHJqd0Byand5c29ja2kubmV0PgogTDoJbGludXgtcG1Admdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKIEY6CURvY3VtZW50YXRpb24vcG93ZXIvCkBAIC05MDY1LDYgKzkwNzgsMTMgQEAKIEY6CWluY2x1ZGUvbGludXgvY2Ryb20uaAogRjoJaW5jbHVkZS91YXBpL2xpbnV4L2Nkcm9tLmgKIAorVU5JU1lTIFMtUEFSIERSSVZFUlMKK006ICAgICBCZW5qYW1pbiBSb21lciA8YmVuamFtaW4ucm9tZXJAdW5pc3lzLmNvbT4KK006ICAgICBEYXZpZCBLZXJzaG5lciA8ZGF2aWQua2Vyc2huZXJAdW5pc3lzLmNvbT4KK0w6ICAgICBzcGFybWFpbnRhaW5lckB1bmlzeXMuY29tIChVbmlzeXMgaW50ZXJuYWwpCitTOiAgICAgU3VwcG9ydGVkCitGOiAgICAgZHJpdmVycy9zdGFnaW5nL3VuaXN5cy8KKwogVU5JVkVSU0FMIEZMQVNIIFNUT1JBR0UgSE9TVCBDT05UUk9MTEVSIERSSVZFUgogTToJVmluYXlhayBIb2xpa2F0dGkgPHZpbmhvbGlrYXR0aUBnbWFpbC5jb20+CiBNOglTYW50b3NoIFkgPHNhbnRvc2hzeUBnbWFpbC5jb20+CkBAIC05MTAzLDggKzkxMjMsNyBAQAogRjoJZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2FyNTUyMy8KIAogVVNCIEFUVEFDSEVEIFNDU0kKLU06CU1hdHRoZXcgV2lsY294IDx3aWxseUBsaW51eC5pbnRlbC5jb20+Ci1NOglTYXJhaCBTaGFycCA8c2FyYWguYS5zaGFycEBsaW51eC5pbnRlbC5jb20+CitNOglIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgogTToJR2VyZCBIb2ZmbWFubiA8a3JheGVsQHJlZGhhdC5jb20+CiBMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCiBMOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZwpAQCAtOTMzMCw3ICs5MzQ5LDcgQEAKIEY6CWRyaXZlcnMvbmV0L3dpcmVsZXNzL3JuZGlzX3dsYW4uYwogCiBVU0IgWEhDSSBEUklWRVIKLU06CVNhcmFoIFNoYXJwIDxzYXJhaC5hLnNoYXJwQGxpbnV4LmludGVsLmNvbT4KK006CU1hdGhpYXMgTnltYW4gPG1hdGhpYXMubnltYW5AaW50ZWwuY29tPgogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL3VzYi9ob3N0L3hoY2kqCkBAIC05ODA4LDYgKzk4MjcsMTIgQEAKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvdHR5L3NlcmlhbC91YXJ0bGl0ZS5jCiAKK1hURU5TQSBYVEZQR0EgUExBVEZPUk0gU1VQUE9SVAorTToJTWF4IEZpbGlwcG92IDxqY212YmtiY0BnbWFpbC5jb20+CitMOglsaW51eC14dGVuc2FAbGludXgteHRlbnNhLm9yZworUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9zcGkvc3BpLXh0ZW5zYS14dGZwZ2EuYworCiBZQU0gRFJJVkVSIEZPUiBBWC4yNQogTToJSmVhbi1QYXVsIFJvdWJlbGF0IDxqcHJAZjZmYmIub3JnPgogTDoJbGludXgtaGFtc0B2Z2VyLmtlcm5lbC5vcmcKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggNzczNmY0Mi4uOTZlNTRiZSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTEsNiArMSw3IEBACiAKIAogZ2VuZXJpYy15ICs9IGNsa2Rldi5oCitnZW5lcmljLXkgKz0gY3B1dGltZS5oCiBnZW5lcmljLXkgKz0gZXhlYy5oCiBnZW5lcmljLXkgKz0gaGFzaC5oCiBnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vY3B1dGltZS5oIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NTc3ZmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX19BTFBIQV9DUFVUSU1FX0gKLSNkZWZpbmUgX19BTFBIQV9DUFVUSU1FX0gKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NwdXRpbWUuaD4KLQotI2VuZGlmIC8qIF9fQUxQSEFfQ1BVVElNRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wY2kuYyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jCmluZGV4IGVkYjRlMDAuLjA3NmMzNWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jCkBAIC0yNTQsMTIgKzI1NCw2IEBACiAJfQogfQogCi1pbnQKLXBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKLXsKLQlyZXR1cm4gcGNpX2VuYWJsZV9yZXNvdXJjZXMoZGV2LCBtYXNrKTsKLX0KLQogLyoKICAqICBJZiB3ZSBzZXQgdXAgYSBkZXZpY2UgZm9yIGJ1cyBtYXN0ZXJpbmcsIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGxhdGVuY3kKICAqICB0aW1lciBhcyBjZXJ0YWluIGZpcm13YXJlIGZvcmdldHMgdG8gc2V0IGl0IHByb3Blcmx5LCBhcyBzZWVuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9LY29uZmlnIGIvYXJjaC9hcm0vS2NvbmZpZwppbmRleCAxNTk0OTQ1Li5iNzZhZTQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL0tjb25maWcKQEAgLTUzNCw3ICs1MzQsNiBAQAogCXNlbGVjdCBQSU5DVFJMCiAJc2VsZWN0IFBJTkNUUkxfRE9WRQogCXNlbGVjdCBQTEFUX09SSU9OX0xFR0FDWQotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSBNYXJ2ZWxsIERvdmUgU29DIDg4QVA1MTAKIApAQCAtNjMzLDcgKzYzMiw2IEBACiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKIAlzZWxlY3QgSEFWRV9JREUKIAlzZWxlY3QgSEFWRV9QV00KLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKIAlzZWxlY3QgVVNFX09GCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgdGhlIE5YUCBMUEMzMlhYIGZhbWlseSBvZiBwcm9jZXNzb3JzCkBAIC03NzAsNyArNzY4LDYgQEAKIAlzZWxlY3QgU0FNU1VOR19BVEFHUwogCXNlbGVjdCBTQU1TVU5HX1dBS0VNQVNLCiAJc2VsZWN0IFNBTVNVTkdfV0RUX1JFU0VUCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCiAJaGVscAogCSAgU2Ftc3VuZyBTM0M2NFhYIHNlcmllcyBiYXNlZCBzeXN0ZW1zCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2F0bGFzNi5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvYXRsYXM2LmR0c2kKaW5kZXggZjg2NzRiYy4uMGM4MWRjOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvYXRsYXM2LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvYXRsYXM2LmR0c2kKQEAgLTIxNyw4ICsyMTcsOCBAQAogCQkJCWludGVycnVwdHMgPSA8MTc+OwogCQkJCWZpZm9zaXplID0gPDEyOD47CiAJCQkJY2xvY2tzID0gPCZjbGtzIDEzPjsKLQkJCQlzaXJmLHVhcnQtZG1hLXJ4LWNoYW5uZWwgPSA8MjE+OwotCQkJCXNpcmYsdWFydC1kbWEtdHgtY2hhbm5lbCA9IDwyPjsKKwkJCQlkbWFzID0gPCZkbWFjMSA1PiwgPCZkbWFjMCAyPjsKKwkJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiOwogCQkJfTsKIAogCQkJdWFydDE6IHVhcnRAYjAwNjAwMDAgewpAQCAtMjI4LDYgKzIyOCw3IEBACiAJCQkJaW50ZXJydXB0cyA9IDwxOD47CiAJCQkJZmlmb3NpemUgPSA8MzI+OwogCQkJCWNsb2NrcyA9IDwmY2xrcyAxND47CisJCQkJZG1hLW5hbWVzID0gIm5vLXJ4IiwgIm5vLXR4IjsKIAkJCX07CiAKIAkJCXVhcnQyOiB1YXJ0QGIwMDcwMDAwIHsKQEAgLTIzNyw4ICsyMzgsOCBAQAogCQkJCWludGVycnVwdHMgPSA8MTk+OwogCQkJCWZpZm9zaXplID0gPDEyOD47CiAJCQkJY2xvY2tzID0gPCZjbGtzIDE1PjsKLQkJCQlzaXJmLHVhcnQtZG1hLXJ4LWNoYW5uZWwgPSA8Nj47Ci0JCQkJc2lyZix1YXJ0LWRtYS10eC1jaGFubmVsID0gPDc+OworCQkJCWRtYXMgPSA8JmRtYWMwIDY+LCA8JmRtYWMwIDc+OworCQkJCWRtYS1uYW1lcyA9ICJyeCIsICJ0eCI7CiAJCQl9OwogCiAJCQl1c3AwOiB1c3BAYjAwODAwMDAgewpAQCAtMjQ4LDggKzI0OSw4IEBACiAJCQkJaW50ZXJydXB0cyA9IDwyMD47CiAJCQkJZmlmb3NpemUgPSA8MTI4PjsKIAkJCQljbG9ja3MgPSA8JmNsa3MgMjg+OwotCQkJCXNpcmYsdXNwLWRtYS1yeC1jaGFubmVsID0gPDE3PjsKLQkJCQlzaXJmLHVzcC1kbWEtdHgtY2hhbm5lbCA9IDwxOD47CisJCQkJZG1hcyA9IDwmZG1hYzEgMT4sIDwmZG1hYzEgMj47CisJCQkJZG1hLW5hbWVzID0gInJ4IiwgInR4IjsKIAkJCX07CiAKIAkJCXVzcDE6IHVzcEBiMDA5MDAwMCB7CkBAIC0yNTksOCArMjYwLDggQEAKIAkJCQlpbnRlcnJ1cHRzID0gPDIxPjsKIAkJCQlmaWZvc2l6ZSA9IDwxMjg+OwogCQkJCWNsb2NrcyA9IDwmY2xrcyAyOT47Ci0JCQkJc2lyZix1c3AtZG1hLXJ4LWNoYW5uZWwgPSA8MTQ+OwotCQkJCXNpcmYsdXNwLWRtYS10eC1jaGFubmVsID0gPDE1PjsKKwkJCQlkbWFzID0gPCZkbWFjMCAxND4sIDwmZG1hYzAgMTU+OworCQkJCWRtYS1uYW1lcyA9ICJyeCIsICJ0eCI7CiAJCQl9OwogCiAJCQlkbWFjMDogZG1hLWNvbnRyb2xsZXJAYjAwYjAwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTEtYXBmNTFkZXYuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTEtYXBmNTFkZXYuZHRzCmluZGV4IDVhN2Y1NTIuLmQzZjk4MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUxLWFwZjUxZGV2LmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1MS1hcGY1MWRldi5kdHMKQEAgLTE4LDcgKzE4LDYgQEAKIAogCWRpc3BsYXlAZGkxIHsKIAkJY29tcGF0aWJsZSA9ICJmc2wsaW14LXBhcmFsbGVsLWRpc3BsYXkiOwotCQljcnRjcyA9IDwmaXB1IDA+OwogCQlpbnRlcmZhY2UtcGl4LWZtdCA9ICJiZ3I2NjYiOwogCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOwogCQlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfaXB1X2Rpc3AxXzE+OwpAQCAtNDEsNiArNDAsMTIgQEAKIAkJCQlwaXhlbGNsay1hY3RpdmUgPSA8MD47CiAJCQl9OwogCQl9OworCisJCXBvcnQgeworCQkJZGlzcGxheV9pbjogZW5kcG9pbnQgeworCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaXB1X2RpMF9kaXNwMD47CisJCQl9OworCQl9OwogCX07CiAKIAlncGlvLWtleXMgewpAQCAtMTIyLDMgKzEyNyw3IEBACiAJCX07CiAJfTsKIH07CisKKyZpcHVfZGkwX2Rpc3AwIHsKKwlyZW1vdGUtZW5kcG9pbnQgPSA8JmRpc3BsYXlfaW4+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUxLWJhYmJhZ2UuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTEtYmFiYmFnZS5kdHMKaW5kZXggYmUxNDA3Yy4uNjcxOTI3MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTEtYmFiYmFnZS5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTEtYmFiYmFnZS5kdHMKQEAgLTIxLDkgKzIxLDggQEAKIAkJcmVnID0gPDB4OTAwMDAwMDAgMHgyMDAwMDAwMD47CiAJfTsKIAotCWRpc3BsYXlAZGkwIHsKKwlkaXNwbGF5MDogZGlzcGxheUBkaTAgewogCQljb21wYXRpYmxlID0gImZzbCxpbXgtcGFyYWxsZWwtZGlzcGxheSI7Ci0JCWNydGNzID0gPCZpcHUgMD47CiAJCWludGVyZmFjZS1waXgtZm10ID0gInJnYjI0IjsKIAkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAkJcGluY3RybC0wID0gPCZwaW5jdHJsX2lwdV9kaXNwMV8xPjsKQEAgLTQxLDExICs0MCwxNiBAQAogCQkJCXZzeW5jLWxlbiA9IDwxMD47CiAJCQl9OwogCQl9OworCisJCXBvcnQgeworCQkJZGlzcGxheTBfaW46IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdV9kaTBfZGlzcDA+OworCQkJfTsKKwkJfTsKIAl9OwogCi0JZGlzcGxheUBkaTEgeworCWRpc3BsYXkxOiBkaXNwbGF5QGRpMSB7CiAJCWNvbXBhdGlibGUgPSAiZnNsLGlteC1wYXJhbGxlbC1kaXNwbGF5IjsKLQkJY3J0Y3MgPSA8JmlwdSAxPjsKIAkJaW50ZXJmYWNlLXBpeC1mbXQgPSAicmdiNTY1IjsKIAkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAkJcGluY3RybC0wID0gPCZwaW5jdHJsX2lwdV9kaXNwMl8xPjsKQEAgLTY4LDYgKzcyLDEyIEBACiAJCQkJcGl4ZWxjbGstYWN0aXZlID0gPDA+OwogCQkJfTsKIAkJfTsKKworCQlwb3J0IHsKKwkJCWRpc3BsYXkxX2luOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHVfZGkxX2Rpc3AxPjsKKwkJCX07CisJCX07CiAJfTsKIAogCWdwaW8ta2V5cyB7CkBAIC0yNTgsNiArMjY4LDE0IEBACiAJfTsKIH07CiAKKyZpcHVfZGkwX2Rpc3AwIHsKKwlyZW1vdGUtZW5kcG9pbnQgPSA8JmRpc3BsYXkwX2luPjsKK307CisKKyZpcHVfZGkxX2Rpc3AxIHsKKwlyZW1vdGUtZW5kcG9pbnQgPSA8JmRpc3BsYXkxX2luPjsKK307CisKICZzc2kyIHsKIAlmc2wsbW9kZSA9ICJpMnMtc2xhdmUiOwogCXN0YXR1cyA9ICJva2F5IjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUxLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1MS5kdHNpCmluZGV4IDRiY2RkM2EuLjI4Yzk2YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUxLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTEuZHRzaQpAQCAtNzksNiArNzksMTEgQEAKIAkJfTsKIAl9OwogCisJZGlzcGxheS1zdWJzeXN0ZW0geworCQljb21wYXRpYmxlID0gImZzbCxpbXgtZGlzcGxheS1zdWJzeXN0ZW0iOworCQlwb3J0cyA9IDwmaXB1X2RpMD4sIDwmaXB1X2RpMT47CisJfTsKKwogCXNvYyB7CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKQEAgLTkyLDEzICs5NywyOCBAQAogCQl9OwogCiAJCWlwdTogaXB1QDQwMDAwMDAwIHsKLQkJCSNjcnRjLWNlbGxzID0gPDE+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWlwdSI7CiAJCQlyZWcgPSA8MHg0MDAwMDAwMCAweDIwMDAwMDAwPjsKIAkJCWludGVycnVwdHMgPSA8MTEgMTA+OwogCQkJY2xvY2tzID0gPCZjbGtzIDU5PiwgPCZjbGtzIDExMD4sIDwmY2xrcyA2MT47CiAJCQljbG9jay1uYW1lcyA9ICJidXMiLCAiZGkwIiwgImRpMSI7CiAJCQlyZXNldHMgPSA8JnNyYyAyPjsKKworCQkJaXB1X2RpMDogcG9ydEAyIHsKKwkJCQlyZWcgPSA8Mj47CisKKwkJCQlpcHVfZGkwX2Rpc3AwOiBlbmRwb2ludCB7CisJCQkJfTsKKwkJCX07CisKKwkJCWlwdV9kaTE6IHBvcnRAMyB7CisJCQkJcmVnID0gPDM+OworCisJCQkJaXB1X2RpMV9kaXNwMTogZW5kcG9pbnQgeworCQkJCX07CisJCQl9OwogCQl9OwogCiAJCWFpcHNANzAwMDAwMDAgeyAvKiBBSVBTMSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtbTUzZXZrLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLW01M2V2ay5kdHMKaW5kZXggN2QzMDRkMC4uMDI5OGFkYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtbTUzZXZrLmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1My1tNTNldmsuZHRzCkBAIC0yMSw5ICsyMSw4IEBACiAJfTsKIAogCXNvYyB7Ci0JCWRpc3BsYXlAZGkxIHsKKwkJZGlzcGxheTE6IGRpc3BsYXlAZGkxIHsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLGlteC1wYXJhbGxlbC1kaXNwbGF5IjsKLQkJCWNydGNzID0gPCZpcHUgMT47CiAJCQlpbnRlcmZhY2UtcGl4LWZtdCA9ICJiZ3I2NjYiOwogCQkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAkJCXBpbmN0cmwtMCA9IDwmcGluY3RybF9pcHVfZGlzcDJfMT47CkBAIC00NCw2ICs0MywxMiBAQAogCQkJCX07CiAJCQl9OwogCQl9OworCisJCXBvcnQgeworCQkJZGlzcGxheTFfaW46IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdV9kaTFfZGlzcDE+OworCQkJfTsKKwkJfTsKIAl9OwogCiAJYmFja2xpZ2h0IHsKQEAgLTIyMSw2ICsyMjYsMTAgQEAKIAl9OwogfTsKIAorJmlwdV9kaTFfZGlzcDEgeworCXJlbW90ZS1lbmRwb2ludCA9IDwmZGlzcGxheTFfaW4+OworfTsKKwogJm5mYyB7CiAJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfbmFuZF8xPjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLW1iYTUzLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLW1iYTUzLmR0cwppbmRleCBhNjMwOTAyLi5hNWI1NWM2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9pbXg1My1tYmE1My5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtbWJhNTMuZHRzCkBAIC0zOCw5ICszOCwxNCBAQAogCQljb21wYXRpYmxlID0gImZzbCxpbXgtcGFyYWxsZWwtZGlzcGxheSI7CiAJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CiAJCXBpbmN0cmwtMCA9IDwmcGluY3RybF9kaXNwMV8xPjsKLQkJY3J0Y3MgPSA8JmlwdSAxPjsKIAkJaW50ZXJmYWNlLXBpeC1mbXQgPSAicmdiMjQiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCisJCXBvcnQgeworCQkJZGlzcGxheTFfaW46IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdV9kaTFfZGlzcDE+OworCQkJfTsKKwkJfTsKIAl9OwogCiAJcmVnXzNwMnY6IDNwMnYgewpAQCAtMTQxLDYgKzE0NiwxMCBAQAogCX07CiB9OwogCismaXB1X2RpMV9kaXNwMSB7CisJcmVtb3RlLWVuZHBvaW50ID0gPCZkaXNwbGF5MV9pbj47Cit9OworCiAmY3NwaSB7CiAJc3RhdHVzID0gIm9rYXkiOwogfTsKQEAgLTIyOCw3ICsyMzcsNyBAQAogJnR2ZSB7CiAJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfdmdhX3N5bmNfMT47Ci0JZGRjID0gPCZpMmMzPjsKKwlpMmMtZGRjLWJ1cyA9IDwmaTJjMz47CiAJZnNsLHR2ZS1tb2RlID0gInZnYSI7CiAJZnNsLGhzeW5jLXBpbiA9IDw0PjsKIAlmc2wsdnN5bmMtcGluID0gPDY+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtcXNiLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLXFzYi5kdHMKaW5kZXggOTFhNTkzNS4uOGIyNTQyOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtcXNiLmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1My1xc2IuZHRzCkBAIC0yMSw5ICsyMSw4IEBACiAJCXJlZyA9IDwweDcwMDAwMDAwIDB4NDAwMDAwMDA+OwogCX07CiAKLQlkaXNwbGF5QGRpMCB7CisJZGlzcGxheTA6IGRpc3BsYXlAZGkwIHsKIAkJY29tcGF0aWJsZSA9ICJmc2wsaW14LXBhcmFsbGVsLWRpc3BsYXkiOwotCQljcnRjcyA9IDwmaXB1IDA+OwogCQlpbnRlcmZhY2UtcGl4LWZtdCA9ICJyZ2I1NjUiOwogCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOwogCQlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfaXB1X2Rpc3AwXzE+OwpAQCAtNDYsNiArNDUsMTIgQEAKIAkJCQlwaXhlbGNsay1hY3RpdmUgPSA8MD47CiAJCQl9OwogCQl9OworCisJCXBvcnQgeworCQkJZGlzcGxheTBfaW46IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdV9kaTBfZGlzcDA+OworCQkJfTsKKwkJfTsKIAl9OwogCiAJZ3Bpby1rZXlzIHsKQEAgLTEyNiw2ICsxMzEsMTAgQEAKIAlzdGF0dXMgPSAib2theSI7CiB9OwogCismaXB1X2RpMF9kaXNwMCB7CisJcmVtb3RlLWVuZHBvaW50ID0gPCZkaXNwbGF5MF9pbj47Cit9OworCiAmc3NpMiB7CiAJZnNsLG1vZGUgPSAiaTJzLXNsYXZlIjsKIAlzdGF0dXMgPSAib2theSI7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9pbXg1My5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMuZHRzaQppbmRleCA0MzA3ZTgwLi4wNGQzMTI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9pbXg1My5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLmR0c2kKQEAgLTQ1LDYgKzQ1LDExIEBACiAJCX07CiAJfTsKIAorCWRpc3BsYXktc3Vic3lzdGVtIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsaW14LWRpc3BsYXktc3Vic3lzdGVtIjsKKwkJcG9ydHMgPSA8JmlwdV9kaTA+LCA8JmlwdV9kaTE+OworCX07CisKIAl0emljOiB0ei1pbnRlcnJ1cHQtY29udHJvbGxlckAwZmZmYzAwMCB7CiAJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLXR6aWMiLCAiZnNsLHR6aWMiOwogCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKQEAgLTg1LDEzICs5MCw0OSBAQAogCQlyYW5nZXM7CiAKIAkJaXB1OiBpcHVAMTgwMDAwMDAgewotCQkJI2NydGMtY2VsbHMgPSA8MT47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtaXB1IjsKIAkJCXJlZyA9IDwweDE4MDAwMDAwIDB4MDgwMDAwMDAwPjsKIAkJCWludGVycnVwdHMgPSA8MTEgMTA+OwogCQkJY2xvY2tzID0gPCZjbGtzIDU5PiwgPCZjbGtzIDExMD4sIDwmY2xrcyA2MT47CiAJCQljbG9jay1uYW1lcyA9ICJidXMiLCAiZGkwIiwgImRpMSI7CiAJCQlyZXNldHMgPSA8JnNyYyAyPjsKKworCQkJaXB1X2RpMDogcG9ydEAyIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQlyZWcgPSA8Mj47CisKKwkJCQlpcHVfZGkwX2Rpc3AwOiBlbmRwb2ludEAwIHsKKwkJCQkJcmVnID0gPDA+OworCQkJCX07CisKKwkJCQlpcHVfZGkwX2x2ZHMwOiBlbmRwb2ludEAxIHsKKwkJCQkJcmVnID0gPDE+OworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8Jmx2ZHMwX2luPjsKKwkJCQl9OworCQkJfTsKKworCQkJaXB1X2RpMTogcG9ydEAzIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQlyZWcgPSA8Mz47CisKKwkJCQlpcHVfZGkxX2Rpc3AxOiBlbmRwb2ludEAwIHsKKwkJCQkJcmVnID0gPDA+OworCQkJCX07CisKKwkJCQlpcHVfZGkxX2x2ZHMxOiBlbmRwb2ludEAxIHsKKwkJCQkJcmVnID0gPDE+OworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8Jmx2ZHMxX2luPjsKKwkJCQl9OworCisJCQkJaXB1X2RpMV90dmU6IGVuZHBvaW50QDIgeworCQkJCQlyZWcgPSA8Mj47CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmdHZlX2luPjsKKwkJCQl9OworCQkJfTsKIAkJfTsKIAogCQlhaXBzQDUwMDAwMDAwIHsgLyogQUlQUzEgKi8KQEAgLTgzOCwxNCArODc5LDI0IEBACiAKIAkJCQlsdmRzLWNoYW5uZWxAMCB7CiAJCQkJCXJlZyA9IDwwPjsKLQkJCQkJY3J0Y3MgPSA8JmlwdSAwPjsKIAkJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKworCQkJCQlwb3J0IHsKKwkJCQkJCWx2ZHMwX2luOiBlbmRwb2ludCB7CisJCQkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHVfZGkwX2x2ZHMwPjsKKwkJCQkJCX07CisJCQkJCX07CiAJCQkJfTsKIAogCQkJCWx2ZHMtY2hhbm5lbEAxIHsKIAkJCQkJcmVnID0gPDE+OwotCQkJCQljcnRjcyA9IDwmaXB1IDE+OwogCQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCisJCQkJCXBvcnQgeworCQkJCQkJbHZkczFfaW46IGVuZHBvaW50IHsKKwkJCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdV9kaTBfbHZkczA+OworCQkJCQkJfTsKKwkJCQkJfTsKIAkJCQl9OwogCQkJfTsKIApAQCAtMTEwMyw4ICsxMTU0LDEzIEBACiAJCQkJaW50ZXJydXB0cyA9IDw5Mj47CiAJCQkJY2xvY2tzID0gPCZjbGtzIDY5PiwgPCZjbGtzIDExNj47CiAJCQkJY2xvY2stbmFtZXMgPSAidHZlIiwgImRpX3NlbCI7Ci0JCQkJY3J0Y3MgPSA8JmlwdSAxPjsKIAkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCisJCQkJcG9ydCB7CisJCQkJCXR2ZV9pbjogZW5kcG9pbnQgeworCQkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHVfZGkxX3R2ZT47CisJCQkJCX07CisJCQkJfTsKIAkJCX07CiAKIAkJCXZwdTogdnB1QDYzZmY0MDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZkbC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NmRsLmR0c2kKaW5kZXggOWU4YWUxMS4uMjViYmRkNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZkbC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZkbC5kdHNpCkBAIC03MCw2ICs3MCwxNSBAQAogCQkJfTsKIAkJfTsKIAl9OworCisJZGlzcGxheS1zdWJzeXN0ZW0geworCQljb21wYXRpYmxlID0gImZzbCxpbXgtZGlzcGxheS1zdWJzeXN0ZW0iOworCQlwb3J0cyA9IDwmaXB1MV9kaTA+LCA8JmlwdTFfZGkxPjsKKwl9OworfTsKKworJmhkbWkgeworCWNvbXBhdGlibGUgPSAiZnNsLGlteDZkbC1oZG1pIjsKIH07CiAKICZsZGIgewpAQCAtNzksMTIgKzg4LDQgQEAKIAljbG9jay1uYW1lcyA9ICJkaTBfcGxsIiwgImRpMV9wbGwiLAogCQkgICAgICAiZGkwX3NlbCIsICJkaTFfc2VsIiwKIAkJICAgICAgImRpMCIsICJkaTEiOwotCi0JbHZkcy1jaGFubmVsQDAgewotCQljcnRjcyA9IDwmaXB1MSAwPiwgPCZpcHUxIDE+OwotCX07Ci0KLQlsdmRzLWNoYW5uZWxAMSB7Ci0JCWNydGNzID0gPCZpcHUxIDA+LCA8JmlwdTEgMT47Ci0JfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9pbXg2cS5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnEuZHRzaQppbmRleCBmMDI0ZWYyLi4yYThkOWRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9pbXg2cS5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZxLmR0c2kKQEAgLTEzMiwxMyArMTMyLDg0IEBACiAJCX07CiAKIAkJaXB1MjogaXB1QDAyODAwMDAwIHsKLQkJCSNjcnRjLWNlbGxzID0gPDE+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWlwdSI7CiAJCQlyZWcgPSA8MHgwMjgwMDAwMCAweDQwMDAwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDAgOCAweDQgMCA3IDB4ND47CiAJCQljbG9ja3MgPSA8JmNsa3MgMTMzPiwgPCZjbGtzIDEzND4sIDwmY2xrcyAxMzc+OwogCQkJY2xvY2stbmFtZXMgPSAiYnVzIiwgImRpMCIsICJkaTEiOwogCQkJcmVzZXRzID0gPCZzcmMgND47CisKKwkJCWlwdTJfZGkwOiBwb3J0QDIgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCXJlZyA9IDwyPjsKKworCQkJCWlwdTJfZGkwX2Rpc3AwOiBlbmRwb2ludEAwIHsKKwkJCQl9OworCisJCQkJaXB1Ml9kaTBfaGRtaTogZW5kcG9pbnRAMSB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaGRtaV9tdXhfMj47CisJCQkJfTsKKworCQkJCWlwdTJfZGkwX21pcGk6IGVuZHBvaW50QDIgeworCQkJCX07CisKKwkJCQlpcHUyX2RpMF9sdmRzMDogZW5kcG9pbnRAMyB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmbHZkczBfbXV4XzI+OworCQkJCX07CisKKwkJCQlpcHUyX2RpMF9sdmRzMTogZW5kcG9pbnRANCB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmbHZkczFfbXV4XzI+OworCQkJCX07CisJCQl9OworCisJCQlpcHUyX2RpMTogcG9ydEAzIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQlyZWcgPSA8Mz47CisKKwkJCQlpcHUyX2RpMV9oZG1pOiBlbmRwb2ludEAxIHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZoZG1pX211eF8zPjsKKwkJCQl9OworCisJCQkJaXB1Ml9kaTFfbWlwaTogZW5kcG9pbnRAMiB7CisJCQkJfTsKKworCQkJCWlwdTJfZGkxX2x2ZHMwOiBlbmRwb2ludEAzIHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZsdmRzMF9tdXhfMz47CisJCQkJfTsKKworCQkJCWlwdTJfZGkxX2x2ZHMxOiBlbmRwb2ludEA0IHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZsdmRzMV9tdXhfMz47CisJCQkJfTsKKwkJCX07CisJCX07CisJfTsKKworCWRpc3BsYXktc3Vic3lzdGVtIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsaW14LWRpc3BsYXktc3Vic3lzdGVtIjsKKwkJcG9ydHMgPSA8JmlwdTFfZGkwPiwgPCZpcHUxX2RpMT4sIDwmaXB1Ml9kaTA+LCA8JmlwdTJfZGkxPjsKKwl9OworfTsKKworJmhkbWkgeworCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWhkbWkiOworCisJcG9ydEAyIHsKKwkJcmVnID0gPDI+OworCisJCWhkbWlfbXV4XzI6IGVuZHBvaW50IHsKKwkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaXB1Ml9kaTBfaGRtaT47CisJCX07CisJfTsKKworCXBvcnRAMyB7CisJCXJlZyA9IDwzPjsKKworCQloZG1pX211eF8zOiBlbmRwb2ludCB7CisJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTJfZGkxX2hkbWk+OwogCQl9OwogCX07CiB9OwpAQCAtMTUyLDEwICsyMjMsNTYgQEAKIAkJICAgICAgImRpMCIsICJkaTEiOwogCiAJbHZkcy1jaGFubmVsQDAgewotCQljcnRjcyA9IDwmaXB1MSAwPiwgPCZpcHUxIDE+LCA8JmlwdTIgMD4sIDwmaXB1MiAxPjsKKwkJcG9ydEAyIHsKKwkJCXJlZyA9IDwyPjsKKworCQkJbHZkczBfbXV4XzI6IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTJfZGkwX2x2ZHMwPjsKKwkJCX07CisJCX07CisKKwkJcG9ydEAzIHsKKwkJCXJlZyA9IDwzPjsKKworCQkJbHZkczBfbXV4XzM6IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTJfZGkxX2x2ZHMwPjsKKwkJCX07CisJCX07CiAJfTsKIAogCWx2ZHMtY2hhbm5lbEAxIHsKLQkJY3J0Y3MgPSA8JmlwdTEgMD4sIDwmaXB1MSAxPiwgPCZpcHUyIDA+LCA8JmlwdTIgMT47CisJCXBvcnRAMiB7CisJCQlyZWcgPSA8Mj47CisKKwkJCWx2ZHMxX211eF8yOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHUyX2RpMF9sdmRzMT47CisJCQl9OworCQl9OworCisJCXBvcnRAMyB7CisJCQlyZWcgPSA8Mz47CisKKwkJCWx2ZHMxX211eF8zOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHUyX2RpMV9sdmRzMT47CisJCQl9OworCQl9OworCX07Cit9OworCismbWlwaV9kc2kgeworCXBvcnRAMiB7CisJCXJlZyA9IDwyPjsKKworCQltaXBpX211eF8yOiBlbmRwb2ludCB7CisJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTJfZGkwX21pcGk+OworCQl9OworCX07CisKKwlwb3J0QDMgeworCQlyZWcgPSA8Mz47CisKKwkJbWlwaV9tdXhfMzogZW5kcG9pbnQgeworCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHUyX2RpMV9taXBpPjsKKwkJfTsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZxZGwuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZxZGwuZHRzaQppbmRleCBmYjI4YjJlLi42NGE4Y2JlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9pbXg2cWRsLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnFkbC5kdHNpCkBAIC0xMzU4LDEzICsxMzU4LDc2IEBACiAJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAogCQkJCWx2ZHMtY2hhbm5lbEAwIHsKKwkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJCQlyZWcgPSA8MD47CiAJCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisKKwkJCQkJcG9ydEAwIHsKKwkJCQkJCXJlZyA9IDwwPjsKKworCQkJCQkJbHZkczBfbXV4XzA6IGVuZHBvaW50IHsKKwkJCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTFfZGkwX2x2ZHMwPjsKKwkJCQkJCX07CisJCQkJCX07CisKKwkJCQkJcG9ydEAxIHsKKwkJCQkJCXJlZyA9IDwxPjsKKworCQkJCQkJbHZkczBfbXV4XzE6IGVuZHBvaW50IHsKKwkJCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTFfZGkxX2x2ZHMwPjsKKwkJCQkJCX07CisJCQkJCX07CiAJCQkJfTsKIAogCQkJCWx2ZHMtY2hhbm5lbEAxIHsKKwkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJCQlyZWcgPSA8MT47CiAJCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisKKwkJCQkJcG9ydEAwIHsKKwkJCQkJCXJlZyA9IDwwPjsKKworCQkJCQkJbHZkczFfbXV4XzA6IGVuZHBvaW50IHsKKwkJCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTFfZGkwX2x2ZHMxPjsKKwkJCQkJCX07CisJCQkJCX07CisKKwkJCQkJcG9ydEAxIHsKKwkJCQkJCXJlZyA9IDwxPjsKKworCQkJCQkJbHZkczFfbXV4XzE6IGVuZHBvaW50IHsKKwkJCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTFfZGkxX2x2ZHMxPjsKKwkJCQkJCX07CisJCQkJCX07CisJCQkJfTsKKwkJCX07CisKKwkJCWhkbWk6IGhkbWlAMDEyMDAwMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJcmVnID0gPDB4MDAxMjAwMDAgMHg5MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMTE1IDB4MDQ+OworCQkJCWdwciA9IDwmZ3ByPjsKKwkJCQljbG9ja3MgPSA8JmNsa3MgMTIzPiwgPCZjbGtzIDEyND47CisJCQkJY2xvY2stbmFtZXMgPSAiaWFoYiIsICJpc2ZyIjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCisJCQkJcG9ydEAwIHsKKwkJCQkJcmVnID0gPDA+OworCisJCQkJCWhkbWlfbXV4XzA6IGVuZHBvaW50IHsKKwkJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaXB1MV9kaTBfaGRtaT47CisJCQkJCX07CisJCQkJfTsKKworCQkJCXBvcnRAMSB7CisJCQkJCXJlZyA9IDwxPjsKKworCQkJCQloZG1pX211eF8xOiBlbmRwb2ludCB7CisJCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTFfZGkxX2hkbWk+OworCQkJCQl9OwogCQkJCX07CiAJCQl9OwogCkBAIC0xNTc5LDggKzE2NDIsMjcgQEAKIAkJCQlyZWcgPSA8MHgwMjFkYzAwMCAweDQwMDA+OwogCQkJfTsKIAotCQkJbWlwaUAwMjFlMDAwMCB7IC8qIE1JUEktRFNJICovCisJCQltaXBpX2RzaTogbWlwaUAwMjFlMDAwMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CiAJCQkJcmVnID0gPDB4MDIxZTAwMDAgMHg0MDAwPjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCisJCQkJcG9ydEAwIHsKKwkJCQkJcmVnID0gPDA+OworCisJCQkJCW1pcGlfbXV4XzA6IGVuZHBvaW50IHsKKwkJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaXB1MV9kaTBfbWlwaT47CisJCQkJCX07CisJCQkJfTsKKworCQkJCXBvcnRAMSB7CisJCQkJCXJlZyA9IDwxPjsKKworCQkJCQltaXBpX211eF8xOiBlbmRwb2ludCB7CisJCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTFfZGkxX21pcGk+OworCQkJCQl9OworCQkJCX07CiAJCQl9OwogCiAJCQl2ZG9hQDAyMWU0MDAwIHsKQEAgLTE2MzQsMTMgKzE3MTYsNjQgQEAKIAkJfTsKIAogCQlpcHUxOiBpcHVAMDI0MDAwMDAgewotCQkJI2NydGMtY2VsbHMgPSA8MT47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtaXB1IjsKIAkJCXJlZyA9IDwweDAyNDAwMDAwIDB4NDAwMDAwPjsKIAkJCWludGVycnVwdHMgPSA8MCA2IDB4NCAwIDUgMHg0PjsKIAkJCWNsb2NrcyA9IDwmY2xrcyAxMzA+LCA8JmNsa3MgMTMxPiwgPCZjbGtzIDEzMj47CiAJCQljbG9jay1uYW1lcyA9ICJidXMiLCAiZGkwIiwgImRpMSI7CiAJCQlyZXNldHMgPSA8JnNyYyAyPjsKKworCQkJaXB1MV9kaTA6IHBvcnRAMiB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJcmVnID0gPDI+OworCisJCQkJaXB1MV9kaTBfZGlzcDA6IGVuZHBvaW50QDAgeworCQkJCX07CisKKwkJCQlpcHUxX2RpMF9oZG1pOiBlbmRwb2ludEAxIHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZoZG1pX211eF8wPjsKKwkJCQl9OworCisJCQkJaXB1MV9kaTBfbWlwaTogZW5kcG9pbnRAMiB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmbWlwaV9tdXhfMD47CisJCQkJfTsKKworCQkJCWlwdTFfZGkwX2x2ZHMwOiBlbmRwb2ludEAzIHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZsdmRzMF9tdXhfMD47CisJCQkJfTsKKworCQkJCWlwdTFfZGkwX2x2ZHMxOiBlbmRwb2ludEA0IHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZsdmRzMV9tdXhfMD47CisJCQkJfTsKKwkJCX07CisKKwkJCWlwdTFfZGkxOiBwb3J0QDMgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCXJlZyA9IDwzPjsKKworCQkJCWlwdTFfZGkwX2Rpc3AxOiBlbmRwb2ludEAwIHsKKwkJCQl9OworCisJCQkJaXB1MV9kaTFfaGRtaTogZW5kcG9pbnRAMSB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaGRtaV9tdXhfMT47CisJCQkJfTsKKworCQkJCWlwdTFfZGkxX21pcGk6IGVuZHBvaW50QDIgeworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8Jm1pcGlfbXV4XzE+OworCQkJCX07CisKKwkJCQlpcHUxX2RpMV9sdmRzMDogZW5kcG9pbnRAMyB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmbHZkczBfbXV4XzE+OworCQkJCX07CisKKwkJCQlpcHUxX2RpMV9sdmRzMTogZW5kcG9pbnRANCB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmbHZkczFfbXV4XzE+OworCQkJCX07CisJCQl9OwogCQl9OwogCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvcHJpbWEyLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9wcmltYTIuZHRzaQppbmRleCAwZTIxOTkzLi44NTgyYWU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9wcmltYTIuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9wcmltYTIuZHRzaQpAQCAtMjIzLDggKzIyMyw4IEBACiAJCQkJaW50ZXJydXB0cyA9IDwxNz47CiAJCQkJZmlmb3NpemUgPSA8MTI4PjsKIAkJCQljbG9ja3MgPSA8JmNsa3MgMTM+OwotCQkJCXNpcmYsdWFydC1kbWEtcngtY2hhbm5lbCA9IDwyMT47Ci0JCQkJc2lyZix1YXJ0LWRtYS10eC1jaGFubmVsID0gPDI+OworCQkJCWRtYXMgPSA8JmRtYWMxIDU+LCA8JmRtYWMwIDI+OworCQkJCWRtYS1uYW1lcyA9ICJyeCIsICJ0eCI7CiAJCQl9OwogCiAJCQl1YXJ0MTogdWFydEBiMDA2MDAwMCB7CkBAIC0yNDMsOCArMjQzLDggQEAKIAkJCQlpbnRlcnJ1cHRzID0gPDE5PjsKIAkJCQlmaWZvc2l6ZSA9IDwxMjg+OwogCQkJCWNsb2NrcyA9IDwmY2xrcyAxNT47Ci0JCQkJc2lyZix1YXJ0LWRtYS1yeC1jaGFubmVsID0gPDY+OwotCQkJCXNpcmYsdWFydC1kbWEtdHgtY2hhbm5lbCA9IDw3PjsKKwkJCQlkbWFzID0gPCZkbWFjMCA2PiwgPCZkbWFjMCA3PjsKKwkJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiOwogCQkJfTsKIAogCQkJdXNwMDogdXNwQGIwMDgwMDAwIHsKQEAgLTI1NCw4ICsyNTQsOCBAQAogCQkJCWludGVycnVwdHMgPSA8MjA+OwogCQkJCWZpZm9zaXplID0gPDEyOD47CiAJCQkJY2xvY2tzID0gPCZjbGtzIDI4PjsKLQkJCQlzaXJmLHVzcC1kbWEtcngtY2hhbm5lbCA9IDwxNz47Ci0JCQkJc2lyZix1c3AtZG1hLXR4LWNoYW5uZWwgPSA8MTg+OworCQkJCWRtYXMgPSA8JmRtYWMxIDE+LCA8JmRtYWMxIDI+OworCQkJCWRtYS1uYW1lcyA9ICJyeCIsICJ0eCI7CiAJCQl9OwogCiAJCQl1c3AxOiB1c3BAYjAwOTAwMDAgewpAQCAtMjY1LDggKzI2NSw4IEBACiAJCQkJaW50ZXJydXB0cyA9IDwyMT47CiAJCQkJZmlmb3NpemUgPSA8MTI4PjsKIAkJCQljbG9ja3MgPSA8JmNsa3MgMjk+OwotCQkJCXNpcmYsdXNwLWRtYS1yeC1jaGFubmVsID0gPDE0PjsKLQkJCQlzaXJmLHVzcC1kbWEtdHgtY2hhbm5lbCA9IDwxNT47CisJCQkJZG1hcyA9IDwmZG1hYzAgMTQ+LCA8JmRtYWMwIDE1PjsKKwkJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiOwogCQkJfTsKIAogCQkJdXNwMjogdXNwQGIwMGEwMDAwIHsKQEAgLTI3Niw4ICsyNzYsOCBAQAogCQkJCWludGVycnVwdHMgPSA8MjI+OwogCQkJCWZpZm9zaXplID0gPDEyOD47CiAJCQkJY2xvY2tzID0gPCZjbGtzIDMwPjsKLQkJCQlzaXJmLHVzcC1kbWEtcngtY2hhbm5lbCA9IDwxMD47Ci0JCQkJc2lyZix1c3AtZG1hLXR4LWNoYW5uZWwgPSA8MTE+OworCQkJCWRtYXMgPSA8JmRtYWMwIDEwPiwgPCZkbWFjMCAxMT47CisJCQkJZG1hLW5hbWVzID0gInJ4IiwgInR4IjsKIAkJCX07CiAKIAkJCWRtYWMwOiBkbWEtY29udHJvbGxlckBiMDBiMDAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9yOGE3NzkxLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9yOGE3NzkxLmR0c2kKaW5kZXggMTljNjU1MC4uM2IwNzVkZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvcjhhNzc5MS5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3I4YTc3OTEuZHRzaQpAQCAtNDI5LDcgKzQyOSw3IEBACiAJCQkJUjhBNzc5MV9DTEtfTVNJT0YxIFI4QTc3OTFfQ0xLX1NDSUZCMgogCQkJPjsKIAkJCWNsb2NrLW91dHB1dC1uYW1lcyA9Ci0JCQkJInNjaWZhMiIsICJzY2lmYTEiLCAic2NpZmEwIiwgIm1pc29mMiIsICJzY2lmYjAiLAorCQkJCSJzY2lmYTIiLCAic2NpZmExIiwgInNjaWZhMCIsICJtc2lvZjIiLCAic2NpZmIwIiwKIAkJCQkic2NpZmIxIiwgIm1zaW9mMSIsICJzY2lmYjIiOwogCQl9OwogCQltc3RwM19jbGtzOiBtc3RwM19jbGtzQGU2MTUwMTNjIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjRpLWExMC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNGktYTEwLmR0c2kKaW5kZXggZDRkMjc2My4uNzc1M2JlMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNGktYTEwLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNGktYTEwLmR0c2kKQEAgLTMzMSw3ICszMzEsNyBAQAogCQl9OwogCiAJCWludGM6IGludGVycnVwdC1jb250cm9sbGVyQDAxYzIwNDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWljIjsKKwkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1pYyI7CiAJCQlyZWcgPSA8MHgwMWMyMDQwMCAweDQwMD47CiAJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CkBAIC00MDMsNyArNDAzLDcgQEAKIAkJfTsKIAogCQl0aW1lckAwMWMyMGMwMCB7Ci0JCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS10aW1lciI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtdGltZXIiOwogCQkJcmVnID0gPDB4MDFjMjBjMDAgMHg5MD47CiAJCQlpbnRlcnJ1cHRzID0gPDIyPjsKIAkJCWNsb2NrcyA9IDwmb3NjMjRNPjsKQEAgLTQyMSw3ICs0MjEsNyBAQAogCQl9OwogCiAJCXNpZDogZWVwcm9tQDAxYzIzODAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLXNpZCI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtc2lkIjsKIAkJCXJlZyA9IDwweDAxYzIzODAwIDB4MTA+OwogCQl9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zdW41aS1hMTBzLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zdW41aS1hMTBzLmR0c2kKaW5kZXggNzlmZDQxMi4uZWUxN2IxYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNWktYTEwcy5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjVpLWExMHMuZHRzaQpAQCAtMjk0LDcgKzI5NCw3IEBACiAJCX07CiAKIAkJaW50YzogaW50ZXJydXB0LWNvbnRyb2xsZXJAMDFjMjA0MDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktaWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLWljIjsKIAkJCXJlZyA9IDwweDAxYzIwNDAwIDB4NDAwPjsKIAkJCWludGVycnVwdC1jb250cm9sbGVyOwogCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKQEAgLTM2Niw3ICszNjYsNyBAQAogCQl9OwogCiAJCXRpbWVyQDAxYzIwYzAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLXRpbWVyIjsKKwkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC10aW1lciI7CiAJCQlyZWcgPSA8MHgwMWMyMGMwMCAweDkwPjsKIAkJCWludGVycnVwdHMgPSA8MjI+OwogCQkJY2xvY2tzID0gPCZvc2MyNE0+OwpAQCAtMzc4LDcgKzM3OCw3IEBACiAJCX07CiAKIAkJc2lkOiBlZXByb21AMDFjMjM4MDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktc2lkIjsKKwkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1zaWQiOwogCQkJcmVnID0gPDB4MDFjMjM4MDAgMHgxMD47CiAJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjVpLWExMy5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNWktYTEzLmR0c2kKaW5kZXggYzQ2M2ZkNy4uMzQ5MGVmOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNWktYTEzLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNWktYTEzLmR0c2kKQEAgLTI3NSw3ICsyNzUsNyBAQAogCQlyYW5nZXM7CiAKIAkJaW50YzogaW50ZXJydXB0LWNvbnRyb2xsZXJAMDFjMjA0MDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktaWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLWljIjsKIAkJCXJlZyA9IDwweDAxYzIwNDAwIDB4NDAwPjsKIAkJCWludGVycnVwdC1jb250cm9sbGVyOwogCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKQEAgLTMyOSw3ICszMjksNyBAQAogCQl9OwogCiAJCXRpbWVyQDAxYzIwYzAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLXRpbWVyIjsKKwkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC10aW1lciI7CiAJCQlyZWcgPSA8MHgwMWMyMGMwMCAweDkwPjsKIAkJCWludGVycnVwdHMgPSA8MjI+OwogCQkJY2xvY2tzID0gPCZvc2MyNE0+OwpAQCAtMzQxLDcgKzM0MSw3IEBACiAJCX07CiAKIAkJc2lkOiBlZXByb21AMDFjMjM4MDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktc2lkIjsKKwkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1zaWQiOwogCQkJcmVnID0gPDB4MDFjMjM4MDAgMHgxMD47CiAJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjZpLWEzMS5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNmktYTMxLmR0c2kKaW5kZXggNTI1NmFkOS4uMzhkNDNmZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNmktYTMxLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNmktYTMxLmR0c2kKQEAgLTE5MCw2ICsxOTAsMTQgQEAKIAkJI3NpemUtY2VsbHMgPSA8MT47CiAJCXJhbmdlczsKIAorCQlubWlfaW50YzogaW50ZXJydXB0LWNvbnRyb2xsZXJAMDFmMDBjMGMgeworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNmktYTMxLXNjLW5taSI7CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCQlyZWcgPSA8MHgwMWYwMGMwYyAweDM4PjsKKwkJCWludGVycnVwdHMgPSA8MCAzMiA0PjsKKwkJfTsKKwogCQlwaW86IHBpbmN0cmxAMDFjMjA4MDAgewogCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNmktYTMxLXBpbmN0cmwiOwogCQkJcmVnID0gPDB4MDFjMjA4MDAgMHg0MDA+OwpAQCAtMjMxLDcgKzIzOSw3IEBACiAJCX07CiAKIAkJdGltZXJAMDFjMjBjMDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktdGltZXIiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXRpbWVyIjsKIAkJCXJlZyA9IDwweDAxYzIwYzAwIDB4YTA+OwogCQkJaW50ZXJydXB0cyA9IDwwIDE4IDQ+LAogCQkJCSAgICAgPDAgMTkgND4sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zdW43aS1hMjAuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjdpLWEyMC5kdHNpCmluZGV4IDZmMjVjZjUuLmNhZGNmMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjdpLWEyMC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjdpLWEyMC5kdHNpCkBAIC0zMzksNiArMzM5LDE0IEBACiAJCSNzaXplLWNlbGxzID0gPDE+OwogCQlyYW5nZXM7CiAKKwkJbm1pX2ludGM6IGludGVycnVwdC1jb250cm9sbGVyQDAxYzAwMDMwIHsKKwkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjdpLWEyMC1zYy1ubWkiOworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJcmVnID0gPDB4MDFjMDAwMzAgMHgwYz47CisJCQlpbnRlcnJ1cHRzID0gPDAgMCA0PjsKKwkJfTsKKwogCQllbWFjOiBldGhlcm5ldEAwMWMwYjAwMCB7CiAJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtZW1hYyI7CiAJCQlyZWcgPSA8MHgwMWMwYjAwMCAweDEwMDA+OwpAQCAtNDM1LDcgKzQ0Myw3IEBACiAJCX07CiAKIAkJdGltZXJAMDFjMjBjMDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktdGltZXIiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXRpbWVyIjsKIAkJCXJlZyA9IDwweDAxYzIwYzAwIDB4OTA+OwogCQkJaW50ZXJydXB0cyA9IDwwIDIyIDQ+LAogCQkJCSAgICAgPDAgMjMgND4sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy96eW5xLTcwMDAuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3p5bnEtNzAwMC5kdHNpCmluZGV4IDhiNjdiMTkuLjc4OWQwYmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3p5bnEtNzAwMC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3p5bnEtNzAwMC5kdHNpCkBAIC0yNCw2ICsyNCwxMiBAQAogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwwPjsKIAkJCWNsb2NrcyA9IDwmY2xrYyAzPjsKKwkJCW9wZXJhdGluZy1wb2ludHMgPSA8CisJCQkJLyoga0h6ICAgIHVWICovCisJCQkJNjY2NjY3ICAxMDAwMDAwCisJCQkJMzMzMzM0ICAxMDAwMDAwCisJCQkJMjIyMjIzICAxMDAwMDAwCisJCQk+OwogCQl9OwogCiAJCWNwdUAxIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYyBiL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYwppbmRleCAzMTdkYTg4Li5kMGQ0Njc4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCkBAIC0xOSw3ICsxOSw3IEBACiBzdGF0aWMgaW50IGRlYnVnX3BjaTsKIAogLyoKLSAqIFdlIGNhbid0IHVzZSBwY2lfZmluZF9kZXZpY2UoKSBoZXJlIHNpbmNlIHdlIGFyZQorICogV2UgY2FuJ3QgdXNlIHBjaV9nZXRfZGV2aWNlKCkgaGVyZSBzaW5jZSB3ZSBhcmUKICAqIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LgogICovCiBzdGF0aWMgdm9pZCBwY2liaW9zX2J1c19yZXBvcnRfc3RhdHVzKHN0cnVjdCBwY2lfYnVzICpidXMsIHVfaW50IHN0YXR1c19tYXNrLCBpbnQgd2FybikKQEAgLTU3LDEzICs1NywxMCBAQAogCiB2b2lkIHBjaWJpb3NfcmVwb3J0X3N0YXR1cyh1X2ludCBzdGF0dXNfbWFzaywgaW50IHdhcm4pCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbDsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwogCi0JbGlzdF9mb3JfZWFjaChsLCAmcGNpX3Jvb3RfYnVzZXMpIHsKLQkJc3RydWN0IHBjaV9idXMgKmJ1cyA9IHBjaV9idXNfYihsKTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkoYnVzLCAmcGNpX3Jvb3RfYnVzZXMsIG5vZGUpCiAJCXBjaWJpb3NfYnVzX3JlcG9ydF9zdGF0dXMoYnVzLCBzdGF0dXNfbWFzaywgd2Fybik7Ci0JfQogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NtcC5jIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCmluZGV4IGI3YjRjODYuLjdjNGZhZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKQEAgLTY3NCw4ICs2NzQsNyBAQAogCX0KIAogCWlmICgodmFsID09IENQVUZSRVFfUFJFQ0hBTkdFICAmJiBmcmVxLT5vbGQgPCBmcmVxLT5uZXcpIHx8Ci0JICAgICh2YWwgPT0gQ1BVRlJFUV9QT1NUQ0hBTkdFICYmIGZyZXEtPm9sZCA+IGZyZXEtPm5ldykgfHwKLQkgICAgKHZhbCA9PSBDUFVGUkVRX1JFU1VNRUNIQU5HRSB8fCB2YWwgPT0gQ1BVRlJFUV9TVVNQRU5EQ0hBTkdFKSkgeworCSAgICAodmFsID09IENQVUZSRVFfUE9TVENIQU5HRSAmJiBmcmVxLT5vbGQgPiBmcmVxLT5uZXcpKSB7CiAJCWxvb3BzX3Blcl9qaWZmeSA9IGNwdWZyZXFfc2NhbGUoZ2xvYmFsX2xfcF9qX3JlZiwKIAkJCQkJCWdsb2JhbF9sX3Bfal9yZWZfZnJlcSwKIAkJCQkJCWZyZXEtPm5ldyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc21wX3R3ZC5jIGIvYXJjaC9hcm0va2VybmVsL3NtcF90d2QuYwppbmRleCA2NTkxZTI2Li5kZmMzMjEzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc21wX3R3ZC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zbXBfdHdkLmMKQEAgLTE2Niw3ICsxNjYsNyBAQAogCSAqIGZyZXF1ZW5jeS4gIFRoZSB0aW1lciBpcyBsb2NhbCB0byBhIGNwdSwgc28gY3Jvc3MtY2FsbCB0byB0aGUKIAkgKiBjaGFuZ2luZyBjcHUuCiAJICovCi0JaWYgKHN0YXRlID09IENQVUZSRVFfUE9TVENIQU5HRSB8fCBzdGF0ZSA9PSBDUFVGUkVRX1JFU1VNRUNIQU5HRSkKKwlpZiAoc3RhdGUgPT0gQ1BVRlJFUV9QT1NUQ0hBTkdFKQogCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoZnJlcXMtPmNwdSwgdHdkX3VwZGF0ZV9mcmVxdWVuY3ksCiAJCQlOVUxMLCAxKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL0tjb25maWcKaW5kZXggNGM0MTRhZi4uOGQxOTdkYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3MvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9LY29uZmlnCkBAIC0zNiw3ICszNiw2IEBACiAJc2VsZWN0IEhBVkVfQVJNX1NDVSBpZiBTTVAKIAlzZWxlY3QgSEFWRV9TTVAKIAlzZWxlY3QgUElOQ1RSTAotCXNlbGVjdCBVU0JfQVJDSF9IQVNfWEhDSQogCWhlbHAKIAkgIFNhbXN1bmcgRVhZTk9TNSAoQ29ydGV4LUExNSkgU29DIGJhc2VkIHN5c3RlbXMKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbW9ib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbW9ib2FyZC5jCmluZGV4IGIzNzM4ZTYuLjhmNDVhZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMW1vYm9hcmQuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFtb2JvYXJkLmMKQEAgLTEyOCwyNyArMTI4LDE1IEBACiAJLm51bV9yZXNvdXJjZXMgPSAxLAogfTsKIAotc3RhdGljIGludCBtb2JvYXJkX3VhcnQwX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyB2b2lkIF9faW5pdCBtb2JvYXJkX3VhcnQwX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0ID0gZ3Bpb19yZXF1ZXN0KElPTVVYX1RPX0dQSU8oTVgzMV9QSU5fQ1RTMSksICJ1YXJ0MC1jdHMtaGFjayIpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoSU9NVVhfVE9fR1BJTyhNWDMxX1BJTl9DVFMxKSwgMCk7Ci0JaWYgKHJldCkKKwlpZiAoIWdwaW9fcmVxdWVzdChJT01VWF9UT19HUElPKE1YMzFfUElOX0NUUzEpLCAidWFydDAtY3RzLWhhY2siKSkgeworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoSU9NVVhfVE9fR1BJTyhNWDMxX1BJTl9DVFMxKSwgMCk7CiAJCWdwaW9fZnJlZShJT01VWF9UT19HUElPKE1YMzFfUElOX0NUUzEpKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG1vYm9hcmRfdWFydDBfZXhpdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWdwaW9fZnJlZShJT01VWF9UT19HUElPKE1YMzFfUElOX0NUUzEpKTsKKwl9CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnQwX3BkYXRhIF9faW5pdGNvbnN0ID0gewotCS5pbml0ID0gbW9ib2FyZF91YXJ0MF9pbml0LAotCS5leGl0ID0gbW9ib2FyZF91YXJ0MF9leGl0LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydDRfcGRhdGEgX19pbml0Y29uc3QgPSB7CkBAIC01NDMsNiArNTMxLDcgQEAKIAogCWlteDMxX2FkZF9pbXgyX3dkdCgpOwogCisJbW9ib2FyZF91YXJ0MF9pbml0KCk7CiAJaW14MzFfYWRkX2lteF91YXJ0MCgmdWFydDBfcGRhdGEpOwogCWlteDMxX2FkZF9pbXhfdWFydDQoJnVhcnQ0X3BkYXRhKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvcG0taW14NnEuYyBiL2FyY2gvYXJtL21hY2gtaW14L3BtLWlteDZxLmMKaW5kZXggN2E5Yjk4NS4uMjllM2ZlNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvcG0taW14NnEuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9wbS1pbXg2cS5jCkBAIC0xMjAsNyArMTIwLDcgQEAKIAogaW50IGlteDZxX3NldF9scG0oZW51bSBteGNfY3B1X3B3cl9tb2RlIG1vZGUpCiB7Ci0Jc3RydWN0IGlycV9kZXNjICppb211eGNfaXJxX2Rlc2M7CisJc3RydWN0IGlycV9kYXRhICppb211eGNfaXJxX2RhdGEgPSBpcnFfZ2V0X2lycV9kYXRhKDMyKTsKIAl1MzIgdmFsID0gcmVhZGxfcmVsYXhlZChjY21fYmFzZSArIENMUENSKTsKIAogCXZhbCAmPSB+Qk1fQ0xQQ1JfTFBNOwpAQCAtMTY3LDEwICsxNjcsOSBAQAogCSAqIDMpIFNvZnR3YXJlIHNob3VsZCBtYXNrIElSUSAjMzIgcmlnaHQgYWZ0ZXIgQ0NNIExvdy1Qb3dlciBtb2RlCiAJICogICAgaXMgc2V0IChzZXQgYml0cyAwLTEgb2YgQ0NNX0NMUENSKS4KIAkgKi8KLQlpb211eGNfaXJxX2Rlc2MgPSBpcnFfdG9fZGVzYygzMik7Ci0JaW14X2dwY19pcnFfdW5tYXNrKCZpb211eGNfaXJxX2Rlc2MtPmlycV9kYXRhKTsKKwlpbXhfZ3BjX2lycV91bm1hc2soaW9tdXhjX2lycV9kYXRhKTsKIAl3cml0ZWxfcmVsYXhlZCh2YWwsIGNjbV9iYXNlICsgQ0xQQ1IpOwotCWlteF9ncGNfaXJxX21hc2soJmlvbXV4Y19pcnFfZGVzYy0+aXJxX2RhdGEpOworCWlteF9ncGNfaXJxX21hc2soaW9tdXhjX2lycV9kYXRhKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tbXAvcG0tbW1wMi5jIGIvYXJjaC9hcm0vbWFjaC1tbXAvcG0tbW1wMi5jCmluZGV4IDQ2MWExOTEuLjQzYjFhNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL3BtLW1tcDIuYworKysgYi9hcmNoL2FybS9tYWNoLW1tcC9wbS1tbXAyLmMKQEAgLTI3LDIyICsyNyw4IEBACiAKIGludCBtbXAyX3NldF93YWtlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IG9uKQogewotCWludCBpcnEgPSBkLT5pcnE7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAl1bnNpZ25lZCBsb25nIGRhdGEgPSAwOwotCi0JaWYgKHVubGlrZWx5KGlycSA+PSBucl9pcnFzKSkgewotCQlwcl9lcnIoIklSUSBudWJtZXJzIGFyZSBvdXQgb2YgYm91bmRhcnkhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKG9uKSB7Ci0JCWlmIChkZXNjLT5hY3Rpb24pCi0JCQlkZXNjLT5hY3Rpb24tPmZsYWdzIHw9IElSUUZfTk9fU1VTUEVORDsKLQl9IGVsc2UgewotCQlpZiAoZGVzYy0+YWN0aW9uKQotCQkJZGVzYy0+YWN0aW9uLT5mbGFncyAmPSB+SVJRRl9OT19TVVNQRU5EOwotCX0KKwlpbnQgaXJxID0gZC0+aXJxOwogCiAJLyogZW5hYmxlIHdha2V1cCBzb3VyY2VzICovCiAJc3dpdGNoIChpcnEpIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL3BtLXB4YTkxMC5jIGIvYXJjaC9hcm0vbWFjaC1tbXAvcG0tcHhhOTEwLmMKaW5kZXggNDg5ODFjYS4uMDRjOWRhZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvcG0tcHhhOTEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvcG0tcHhhOTEwLmMKQEAgLTI3LDIyICsyNyw4IEBACiAKIGludCBweGE5MTBfc2V0X3dha2Uoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgb24pCiB7Ci0JaW50IGlycSA9IGRhdGEtPmlycTsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhkYXRhLT5pcnEpOwogCXVpbnQzMl90IGF3dWNybSA9IDAsIGFwY3IgPSAwOwotCi0JaWYgKHVubGlrZWx5KGlycSA+PSBucl9pcnFzKSkgewotCQlwcl9lcnIoIklSUSBudWJtZXJzIGFyZSBvdXQgb2YgYm91bmRhcnkhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKG9uKSB7Ci0JCWlmIChkZXNjLT5hY3Rpb24pCi0JCQlkZXNjLT5hY3Rpb24tPmZsYWdzIHw9IElSUUZfTk9fU1VTUEVORDsKLQl9IGVsc2UgewotCQlpZiAoZGVzYy0+YWN0aW9uKQotCQkJZGVzYy0+YWN0aW9uLT5mbGFncyAmPSB+SVJRRl9OT19TVVNQRU5EOwotCX0KKwlpbnQgaXJxID0gZGF0YS0+aXJxOwogCiAJLyogc2V0dGluZyB3YWtldXAgc291cmNlcyAqLwogCXN3aXRjaCAoaXJxKSB7CkBAIC0xMTUsOSArMTAxLDExIEBACiAJCWlmIChpcnEgPj0gSVJRX0dQSU9fU1RBUlQgJiYgaXJxIDwgSVJRX0JPQVJEX1NUQVJUKSB7CiAJCQlhd3Vjcm0gPSBNUE1VX0FXVUNSTV9XQUtFVVAoMik7CiAJCQlhcGNyIHw9IE1QTVVfQVBDUl9TTFBXUDI7Ci0JCX0gZWxzZQorCQl9IGVsc2UgeworCQkJLyogRklYTUU6IFRoaXMgc2hvdWxkIHJldHVybiBhIHByb3BlciBlcnJvciBjb2RlICEgKi8KIAkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3I6IG5vIGRlZmluZWQgd2FrZSB1cCBzb3VyY2UgaXJxOiAlZFxuIiwKIAkJCQlpcnEpOworCQl9CiAJfQogCiAJaWYgKG9uKSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2Ftcy1kZWx0YS1maXEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYW1zLWRlbHRhLWZpcS5jCmluZGV4IGYxMmExMmEuLmQxZjEyMDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYW1zLWRlbHRhLWZpcS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYW1zLWRlbHRhLWZpcS5jCkBAIC00NCwxMyArNDQsMTAgQEAKIAogc3RhdGljIGlycXJldHVybl90IGRlZmVycmVkX2ZpcShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0Jc3RydWN0IGlycV9kZXNjICppcnFfZGVzYzsKLQlzdHJ1Y3QgaXJxX2NoaXAgKmlycV9jaGlwID0gTlVMTDsKIAlpbnQgZ3BpbywgaXJxX251bSwgZmlxX2NvdW50OworCXN0cnVjdCBpcnFfY2hpcCAqaXJxX2NoaXA7CiAKLQlpcnFfZGVzYyA9IGlycV90b19kZXNjKGdwaW9fdG9faXJxKEFNU19ERUxUQV9HUElPX1BJTl9LRVlCUkRfQ0xLKSk7Ci0JaWYgKGlycV9kZXNjKQotCQlpcnFfY2hpcCA9IGlycV9kZXNjLT5pcnFfZGF0YS5jaGlwOworCWlycV9jaGlwID0gaXJxX2dldF9jaGlwKGdwaW9fdG9faXJxKEFNU19ERUxUQV9HUElPX1BJTl9LRVlCUkRfQ0xLKSk7CiAKIAkvKgogCSAqIEZvciBlYWNoIGhhbmRsZWQgR1BJTyBpbnRlcnJ1cHQsIGtlZXAgY2FsbGluZyBpdHMgaW50ZXJydXB0IGhhbmRsZXIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtb21hcDIvS2NvbmZpZwppbmRleCAwYWY3Y2EwLi42ZmI5MWZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9LY29uZmlnCkBAIC0yMSw3ICsyMSw2IEBACiAJc2VsZWN0IFBNX09QUCBpZiBQTQogCXNlbGVjdCBQTV9SVU5USU1FIGlmIENQVV9JRExFCiAJc2VsZWN0IFNPQ19IQVNfT01BUDJfU0RSQwotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSSBpZiBVU0JfU1VQUE9SVAogCiBjb25maWcgQVJDSF9PTUFQNAogCWJvb2wgIlRJIE9NQVA0IgpAQCAtNDIsNyArNDEsNiBAQAogCXNlbGVjdCBQTDMxMF9FUlJBVEFfNzI3OTE1CiAJc2VsZWN0IFBNX09QUCBpZiBQTQogCXNlbGVjdCBQTV9SVU5USU1FIGlmIENQVV9JRExFCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJIGlmIFVTQl9TVVBQT1JUCiAJc2VsZWN0IEFSTV9FUlJBVEFfNzU0MzIyCiAJc2VsZWN0IEFSTV9FUlJBVEFfNzc1NDIwCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3ZpcGVyLmMgYi9hcmNoL2FybS9tYWNoLXB4YS92aXBlci5jCmluZGV4IDI5OTA1YjEuLjQxZjI3ZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3ZpcGVyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvdmlwZXIuYwpAQCAtODg1LDkgKzg4NSw2IEBACiAJCQl2aXBlcl9zZXRfY29yZV9jcHVfdm9sdGFnZShmcmVxLT5uZXcsIDApOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgQ1BVRlJFUV9SRVNVTUVDSEFOR0U6Ci0JCXZpcGVyX3NldF9jb3JlX2NwdV92b2x0YWdlKGZyZXEtPm5ldywgMCk7Ci0JCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIGlnbm9yZSAqLwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvS2NvbmZpZwppbmRleCAwNWZhNTA1Li4zYjhjODc0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9LY29uZmlnCkBAIC0yNCwxNyArMjQsMjEgQEAKIAogY29uZmlnIEFSQ0hfRU1FVjIKIAlib29sICJFbW1hIE1vYmlsZSBFVjIiCisJc2VsZWN0IFNZU19TVVBQT1JUU19FTV9TVEkKIAogY29uZmlnIEFSQ0hfUjdTNzIxMDAKIAlib29sICJSWi9BMUggKFI3UzcyMTAwKSIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX01UVTIKIAogY29uZmlnIEFSQ0hfUjhBNzc5MAogCWJvb2wgIlItQ2FyIEgyIChSOEE3NzkwMCkiCiAJc2VsZWN0IFJFTkVTQVNfSVJRQworCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfQ01UCiAKIGNvbmZpZyBBUkNIX1I4QTc3OTEKIAlib29sICJSLUNhciBNMiAoUjhBNzc5MTApIgogCXNlbGVjdCBSRU5FU0FTX0lSUUMKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAogCiBjb21tZW50ICJSZW5lc2FzIEFSTSBTb0NzIEJvYXJkIFR5cGUiCiAKQEAgLTY4LDYgKzcyLDggQEAKIAlzZWxlY3QgQVJNX0NQVV9TVVNQRU5EIGlmIFBNIHx8IENQVV9JRExFCiAJc2VsZWN0IENQVV9WNwogCXNlbGVjdCBTSF9DTEtfQ1BHCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX1RNVQogCiBjb25maWcgQVJDSF9TSDczQTAKIAlib29sICJTSC1Nb2JpbGUgQUc1IChSOEE3M0EwMCkiCkBAIC03Nyw2ICs4Myw4IEBACiAJc2VsZWN0IEkyQwogCXNlbGVjdCBTSF9DTEtfQ1BHCiAJc2VsZWN0IFJFTkVTQVNfSU5UQ19JUlFQSU4KKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfVE1VCiAKIGNvbmZpZyBBUkNIX1I4QTczQTQKIAlib29sICJSLU1vYmlsZSBBUEU2IChSOEE3M0E0MCkiCkBAIC04Nyw2ICs5NSw4IEBACiAJc2VsZWN0IFJFTkVTQVNfSVJRQwogCXNlbGVjdCBBUkNIX0hBU19DUFVGUkVRCiAJc2VsZWN0IEFSQ0hfSEFTX09QUAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfQ01UCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9UTVUKIAogY29uZmlnIEFSQ0hfUjhBNzc0MAogCWJvb2wgIlItTW9iaWxlIEExIChSOEE3NzQwMCkiCkBAIC05NSw2ICsxMDUsOCBAQAogCXNlbGVjdCBDUFVfVjcKIAlzZWxlY3QgU0hfQ0xLX0NQRwogCXNlbGVjdCBSRU5FU0FTX0lOVENfSVJRUElOCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX1RNVQogCiBjb25maWcgQVJDSF9SOEE3Nzc4CiAJYm9vbCAiUi1DYXIgTTFBIChSOEE3Nzc4MSkiCkBAIC0xMDIsOCArMTE0LDcgQEAKIAlzZWxlY3QgQ1BVX1Y3CiAJc2VsZWN0IFNIX0NMS19DUEcKIAlzZWxlY3QgQVJNX0dJQwotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQotCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfVE1VCiAKIGNvbmZpZyBBUkNIX1I4QTc3NzkKIAlib29sICJSLUNhciBIMSAoUjhBNzc3OTApIgpAQCAtMTExLDkgKzEyMiw4IEBACiAJc2VsZWN0IEFSTV9HSUMKIAlzZWxlY3QgQ1BVX1Y3CiAJc2VsZWN0IFNIX0NMS19DUEcKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKIAlzZWxlY3QgUkVORVNBU19JTlRDX0lSUVBJTgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfVE1VCiAKIGNvbmZpZyBBUkNIX1I4QTc3OTAKIAlib29sICJSLUNhciBIMiAoUjhBNzc5MDApIgpAQCAtMTIzLDYgKzEzMyw3IEBACiAJc2VsZWN0IE1JR0hUX0hBVkVfUENJCiAJc2VsZWN0IFNIX0NMS19DUEcKIAlzZWxlY3QgUkVORVNBU19JUlFDCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKIAogY29uZmlnIEFSQ0hfUjhBNzc5MQogCWJvb2wgIlItQ2FyIE0yIChSOEE3NzkxMCkiCkBAIC0xMzIsNiArMTQzLDcgQEAKIAlzZWxlY3QgTUlHSFRfSEFWRV9QQ0kKIAlzZWxlY3QgU0hfQ0xLX0NQRwogCXNlbGVjdCBSRU5FU0FTX0lSUUMKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAogCiBjb25maWcgQVJDSF9FTUVWMgogCWJvb2wgIkVtbWEgTW9iaWxlIEVWMiIKQEAgLTE0MSw2ICsxNTMsNyBAQAogCXNlbGVjdCBNSUdIVF9IQVZFX1BDSQogCXNlbGVjdCBVU0VfT0YKIAlzZWxlY3QgQVVUT19aUkVMQUREUgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfRU1fU1RJCiAKIGNvbmZpZyBBUkNIX1I3UzcyMTAwCiAJYm9vbCAiUlovQTFIIChSN1M3MjEwMCkiCkBAIC0xNDgsNiArMTYxLDcgQEAKIAlzZWxlY3QgQVJNX0dJQwogCXNlbGVjdCBDUFVfVjcKIAlzZWxlY3QgU0hfQ0xLX0NQRworCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfTVRVMgogCiBjb21tZW50ICJSZW5lc2FzIEFSTSBTb0NzIEJvYXJkIFR5cGUiCiAKQEAgLTMyMSwyNCArMzM1LDYgQEAKIAkgIHdhbnQgdG8gc2VsZWN0IGEgSFogdmFsdWUgc3VjaCBhcyAxMjggdGhhdCBjYW4gZXZlbmx5IGRpdmlkZSBSQ0xLLgogCSAgQSBIWiB2YWx1ZSB0aGF0IGRvZXMgbm90IGRpdmlkZSBldmVubHkgbWF5IGNhdXNlIHRpbWVyIGRyaWZ0LgogCi1jb25maWcgU0hfVElNRVJfQ01UCi0JYm9vbCAiQ01UIHRpbWVyIGRyaXZlciIKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBUaGlzIGVuYWJsZXMgYnVpbGQgb2YgdGhlIENNVCB0aW1lciBkcml2ZXIuCi0KLWNvbmZpZyBTSF9USU1FUl9UTVUKLQlib29sICJUTVUgdGltZXIgZHJpdmVyIgotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyBidWlsZCBvZiB0aGUgVE1VIHRpbWVyIGRyaXZlci4KLQotY29uZmlnIEVNX1RJTUVSX1NUSQotCWJvb2wgIlNUSSB0aW1lciBkcml2ZXIiCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgVGhpcyBlbmFibGVzIGJ1aWxkIG9mIHRoZSBTVEkgdGltZXIgZHJpdmVyLgotCiBlbmRtZW51CiAKIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFybWFkaWxsbzgwMGV2YS5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hcm1hZGlsbG84MDBldmEuYwppbmRleCA5MzUzM2UyLi45MzIzODU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFybWFkaWxsbzgwMGV2YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYXJtYWRpbGxvODAwZXZhLmMKQEAgLTk4OCwxNCArOTg4LDEyIEBACiAJLmNhcmQJCT0gIkZTSTJBLVdNODk3OCIsCiAJLmNvZGVjCQk9ICJ3bTg5NzguMC0wMDFhIiwKIAkucGxhdGZvcm0JPSAic2hfZnNpMiIsCi0JLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9JMlMsCisJLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCS5jcHVfZGFpID0gewogCQkubmFtZQk9ICJmc2lhLWRhaSIsCi0JCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTIHwgU05EX1NPQ19EQUlGTVRfSUJfTkYsCiAJfSwKIAkuY29kZWNfZGFpID0gewogCQkubmFtZQk9ICJ3bTg5NzgtaGlmaSIsCi0JCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYsCiAJCS5zeXNjbGsJPSAxMjI4ODAwMCwKIAl9LAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYm9ja3cuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYm9ja3cuYwppbmRleCBjNDc1MjIwLi43NGMyN2Q5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWJvY2t3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1ib2Nrdy5jCkBAIC00MjksMTQgKzQyOSwxMiBAQAogCQkuY2FyZAkJPSAiU1NJNTYtQUs0NjQzIiwKIAkJLmNvZGVjCQk9ICJhazQ2NDItY29kZWMuMC0wMDEyIiwKIAkJLnBsYXRmb3JtCT0gInJjYXJfc291bmQiLAotCQkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0xFRlRfSiwKKwkJLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9MRUZUX0ogfCBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCQkuY3B1X2RhaSA9IHsKIAkJCS5uYW1lCT0gInJzbmQtZGFpLjAiLAotCQkJLmZtdAk9IFNORF9TT0NfREFJRk1UX0NCU19DRlMsCiAJCX0sCiAJCS5jb2RlY19kYWkgPSB7CiAJCQkubmFtZQk9ICJhazQ2NDItaGlmaSIsCi0JCQkuZm10CT0gU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSwKIAkJCS5zeXNjbGsJPSAxMTI4OTYwMCwKIAkJfSwKIAl9LApAQCAtNDQ2LDEwICs0NDQsOSBAQAogCQkuY2FyZAkJPSAiU1NJMy1BSzQ1NTQocGxheWJhY2spIiwKIAkJLmNvZGVjCQk9ICJhazQ1NTQtYWRjLWRhYy4wIiwKIAkJLnBsYXRmb3JtCT0gInJjYXJfc291bmQiLAorCQkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0NCU19DRlMgfCBTTkRfU09DX0RBSUZNVF9SSUdIVF9KLAogCQkuY3B1X2RhaSA9IHsKIAkJCS5uYW1lCT0gInJzbmQtZGFpLjEiLAotCQkJLmZtdAk9IFNORF9TT0NfREFJRk1UX0NCTV9DRk0gfAotCQkJCSAgU05EX1NPQ19EQUlGTVRfUklHSFRfSiwKIAkJfSwKIAkJLmNvZGVjX2RhaSA9IHsKIAkJCS5uYW1lCT0gImFrNDU1NC1oaWZpIiwKQEAgLTQ2MSwxMCArNDU4LDkgQEAKIAkJLmNhcmQJCT0gIlNTSTQtQUs0NTU0KGNhcHR1cmUpIiwKIAkJLmNvZGVjCQk9ICJhazQ1NTQtYWRjLWRhYy4wIiwKIAkJLnBsYXRmb3JtCT0gInJjYXJfc291bmQiLAorCQkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0NCU19DRlMgfCBTTkRfU09DX0RBSUZNVF9MRUZUX0osCiAJCS5jcHVfZGFpID0gewogCQkJLm5hbWUJPSAicnNuZC1kYWkuMiIsCi0JCQkuZm10CT0gU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9MRUZUX0osCiAJCX0sCiAJCS5jb2RlY19kYWkgPSB7CiAJCQkubmFtZQk9ICJhazQ1NTQtaGlmaSIsCkBAIC00NzYsMTAgKzQ3Miw5IEBACiAJCS5jYXJkCQk9ICJTU0k3LUFLNDU1NChwbGF5YmFjaykiLAogCQkuY29kZWMJCT0gImFrNDU1NC1hZGMtZGFjLjEiLAogCQkucGxhdGZvcm0JPSAicmNhcl9zb3VuZCIsCisJCS5kYWlmbXQJCT0gU05EX1NPQ19EQUlGTVRfQ0JTX0NGUyB8IFNORF9TT0NfREFJRk1UX1JJR0hUX0osCiAJCS5jcHVfZGFpID0gewogCQkJLm5hbWUJPSAicnNuZC1kYWkuMyIsCi0JCQkuZm10CT0gU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9SSUdIVF9KLAogCQl9LAogCQkuY29kZWNfZGFpID0gewogCQkJLm5hbWUJPSAiYWs0NTU0LWhpZmkiLApAQCAtNDkxLDEwICs0ODYsOSBAQAogCQkuY2FyZAkJPSAiU1NJOC1BSzQ1NTQoY2FwdHVyZSkiLAogCQkuY29kZWMJCT0gImFrNDU1NC1hZGMtZGFjLjEiLAogCQkucGxhdGZvcm0JPSAicmNhcl9zb3VuZCIsCisJCS5kYWlmbXQJCT0gU05EX1NPQ19EQUlGTVRfQ0JTX0NGUyB8IFNORF9TT0NfREFJRk1UX0xFRlRfSiwKIAkJLmNwdV9kYWkgPSB7CiAJCQkubmFtZQk9ICJyc25kLWRhaS40IiwKLQkJCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0xFRlRfSiwKIAkJfSwKIAkJLmNvZGVjX2RhaSA9IHsKIAkJCS5uYW1lCT0gImFrNDU1NC1oaWZpIiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQta3ptOWcuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQta3ptOWcuYwppbmRleCBiYzQwYjg1Li4wM2RjM2FjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWt6bTlnLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1rem05Zy5jCkBAIC01ODksMTQgKzU4OSwxMiBAQAogCS5jYXJkCQk9ICJGU0kyQS1BSzQ2NDgiLAogCS5jb2RlYwkJPSAiYWs0NjQyLWNvZGVjLjAtMDAxMiIsCiAJLnBsYXRmb3JtCT0gInNoX2ZzaTIiLAotCS5kYWlmbXQJCT0gU05EX1NPQ19EQUlGTVRfTEVGVF9KLAorCS5kYWlmbXQJCT0gU05EX1NPQ19EQUlGTVRfTEVGVF9KIHwgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSwKIAkuY3B1X2RhaSA9IHsKIAkJLm5hbWUJPSAiZnNpYS1kYWkiLAotCQkuZm10CT0gU05EX1NPQ19EQUlGTVRfQ0JTX0NGUywKIAl9LAogCS5jb2RlY19kYWkgPSB7CiAJCS5uYW1lCT0gImFrNDY0Mi1oaWZpIiwKLQkJLmZtdAk9IFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJCS5zeXNjbGsJPSAxMTI4OTYwMCwKIAl9LAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtbWFja2VyZWwuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtbWFja2VyZWwuYwppbmRleCAzYWJhMDM3Li4wZmY0ZDhlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLW1hY2tlcmVsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1tYWNrZXJlbC5jCkBAIC01MDksOSArNTA5LDkgQEAKIAkuY2FyZAkJPSAiRlNJMkItSERNSSIsCiAJLmNvZGVjCQk9ICJzaC1tb2JpbGUtaGRtaSIsCiAJLnBsYXRmb3JtCT0gInNoX2ZzaTIiLAorCS5kYWlmbXQJCT0gU05EX1NPQ19EQUlGTVRfQ0JTX0NGUywKIAkuY3B1X2RhaSA9IHsKIAkJLm5hbWUJPSAiZnNpYi1kYWkiLAotCQkuZm10CT0gU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSB8IFNORF9TT0NfREFJRk1UX0lCX05GLAogCX0sCiAJLmNvZGVjX2RhaSA9IHsKIAkJLm5hbWUJPSAic2hfbW9iaWxlX2hkbWktaGlmaSIsCkBAIC05MDUsMTQgKzkwNSwxMiBAQAogCS5jYXJkCQk9ICJGU0kyQS1BSzQ2NDMiLAogCS5jb2RlYwkJPSAiYWs0NjQyLWNvZGVjLjAtMDAxMyIsCiAJLnBsYXRmb3JtCT0gInNoX2ZzaTIiLAotCS5kYWlmbXQJCT0gU05EX1NPQ19EQUlGTVRfTEVGVF9KLAorCS5kYWlmbXQJCT0gU05EX1NPQ19EQUlGTVRfTEVGVF9KIHwgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSwKIAkuY3B1X2RhaSA9IHsKIAkJLm5hbWUJPSAiZnNpYS1kYWkiLAotCQkuZm10CT0gU05EX1NPQ19EQUlGTVRfQ0JTX0NGUywKIAl9LAogCS5jb2RlY19kYWkgPSB7CiAJCS5uYW1lCT0gImFrNDY0Mi1oaWZpIiwKLQkJLmZtdAk9IFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJCS5zeXNjbGsJPSAxMTI4OTYwMCwKIAl9LAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc3BlYXIvc3BlYXIxMzEwLmMgYi9hcmNoL2FybS9tYWNoLXNwZWFyL3NwZWFyMTMxMC5jCmluZGV4IDdhZDAwMzAuLjgyNGIxMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc3BlYXIvc3BlYXIxMzEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zcGVhci9zcGVhcjEzMTAuYwpAQCAtMjgsNiArMjgsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IHNwZWFyMTMxMF9kdF9pbml0KHZvaWQpCiB7CiAJb2ZfcGxhdGZvcm1fcG9wdWxhdGUoTlVMTCwgb2ZfZGVmYXVsdF9idXNfbWF0Y2hfdGFibGUsIE5VTEwsIE5VTEwpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInNwZWFyLWNwdWZyZXEiLCAtMSwgTlVMTCwgMCk7CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BlYXIxMzEwX2R0X2JvYXJkX2NvbXBhdFtdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zcGVhci9zcGVhcjEzNDAuYyBiL2FyY2gvYXJtL21hY2gtc3BlYXIvc3BlYXIxMzQwLmMKaW5kZXggM2ZiNjgzNC4uN2I2YmZmNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zcGVhci9zcGVhcjEzNDAuYworKysgYi9hcmNoL2FybS9tYWNoLXNwZWFyL3NwZWFyMTM0MC5jCkBAIC0xNDMsNiArMTQzLDcgQEAKIHsKIAlvZl9wbGF0Zm9ybV9wb3B1bGF0ZShOVUxMLCBvZl9kZWZhdWx0X2J1c19tYXRjaF90YWJsZSwKIAkJCXNwZWFyMTM0MF9hdXhkYXRhX2xvb2t1cCwgTlVMTCk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgic3BlYXItY3B1ZnJlcSIsIC0xLCBOVUxMLCAwKTsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGVhcjEzNDBfZHRfYm9hcmRfY29tcGF0W10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL0tjb25maWcKaW5kZXggYjEyMzJkOC4uNDkyNmJkMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvS2NvbmZpZwpAQCAtMTksNyArMTksNiBAQAogCXNlbGVjdCBSRVNFVF9DT05UUk9MTEVSCiAJc2VsZWN0IFNPQ19CVVMKIAlzZWxlY3QgU1BBUlNFX0lSUQotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSSBpZiBVU0JfU1VQUE9SVAogCXNlbGVjdCBVU0JfVUxQSSBpZiBVU0JfUEhZCiAJc2VsZWN0IFVTQl9VTFBJX1ZJRVdQT1JUIGlmIFVTQl9QSFkKIAlzZWxlY3QgVVNFX09GCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXUzMDAvTWFrZWZpbGUKaW5kZXggMGYzNjJiNi4uM2VjNzRhYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9NYWtlZmlsZQpAQCAtMiw3ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwsIFUzMDAgbWFjaGluZS4KICMKIAotb2JqLXkJCTo9IGNvcmUubyB0aW1lci5vCitvYmoteQkJOj0gY29yZS5vCiBvYmotbQkJOj0KIG9iai1uCQk6PQogb2JqLQkJOj0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtenlucS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC16eW5xL0tjb25maWcKaW5kZXggNmIwNDI2MC4uZjAzZTc1YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC16eW5xL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC16eW5xL0tjb25maWcKQEAgLTIsNiArMiw4IEBACiAJYm9vbCAiWGlsaW54IFp5bnEgQVJNIENvcnRleCBBOSBQbGF0Zm9ybSIgaWYgQVJDSF9NVUxUSV9WNwogCXNlbGVjdCBBUk1fQU1CQQogCXNlbGVjdCBBUk1fR0lDCisJc2VsZWN0IEFSQ0hfSEFTX0NQVUZSRVEKKwlzZWxlY3QgQVJDSF9IQVNfT1BQCiAJc2VsZWN0IENPTU1PTl9DTEsKIAlzZWxlY3QgQ1BVX1Y3CiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKQEAgLTEzLDYgKzE1LDYgQEAKIAlzZWxlY3QgSEFWRV9TTVAKIAlzZWxlY3QgU1BBUlNFX0lSUQogCXNlbGVjdCBDQURFTkNFX1RUQ19USU1FUgotCXNlbGVjdCBBUk1fR0xPQkFMX1RJTUVSCisJc2VsZWN0IEFSTV9HTE9CQUxfVElNRVIgaWYgIUNQVV9GUkVRCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgWGlsaW54IFp5bnEgQVJNIENvcnRleCBBOSBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC16eW5xL2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC16eW5xL2NvbW1vbi5jCmluZGV4IDhjMDlhODMuLmEzOWJlOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtenlucS9jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLXp5bnEvY29tbW9uLmMKQEAgLTY0LDYgKzY0LDggQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IHp5bnFfaW5pdF9tYWNoaW5lKHZvaWQpCiB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZV9pbmZvIGRldmluZm8gPSB7IC5uYW1lID0gImNwdWZyZXEtY3B1MCIsIH07CisKIAkvKgogCSAqIDY0S0Igd2F5IHNpemUsIDgtd2F5IGFzc29jaWF0aXZpdHksIHBhcml0eSBkaXNhYmxlZAogCSAqLwpAQCAtNzIsNiArNzQsNyBAQAogCW9mX3BsYXRmb3JtX3BvcHVsYXRlKE5VTEwsIG9mX2RlZmF1bHRfYnVzX21hdGNoX3RhYmxlLCBOVUxMLCBOVUxMKTsKIAogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmenlucV9jcHVpZGxlX2RldmljZSk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2Z1bGwoJmRldmluZm8pOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgenlucV90aW1lcl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L0tjb25maWcgYi9hcmNoL2FybTY0L0tjb25maWcKaW5kZXggNTE2ZDhhNy4uMDdhYTM1NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9LY29uZmlnCisrKyBiL2FyY2gvYXJtNjQvS2NvbmZpZwpAQCAtMzI1LDYgKzMyNSwxNCBAQAogCiBlbmRtZW51CiAKK21lbnUgIlBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyIKKworc291cmNlICJrZXJuZWwvcG93ZXIvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL2NwdWZyZXEvS2NvbmZpZyIKKworZW5kbWVudQorCiBzb3VyY2UgIm5ldC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL21pbWMyMDAvTWFrZWZpbGUgYi9hcmNoL2F2cjMyL2JvYXJkcy9taW1jMjAwL01ha2VmaWxlCmluZGV4IDc5YzA3NmUuLmM3NDBhYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL21pbWMyMDAvTWFrZWZpbGUKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvbWltYzIwMC9NYWtlZmlsZQpAQCAtMSArMSBAQAotb2JqLXkJCQkJKz0gc2V0dXAubyBmbGFzaC5vIGZyYW0ubworb2JqLXkJCQkJKz0gc2V0dXAubyBmbGFzaC5vCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9taW1jMjAwL2ZyYW0uYyBiL2FyY2gvYXZyMzIvYm9hcmRzL21pbWMyMDAvZnJhbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ2NmE4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL21pbWMyMDAvZnJhbS5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIEZSQU0gZHJpdmVyIGZvciBNSU1DMjAwIGJvYXJkCi0gKgotICogQ29weXJpZ2h0IDIwMDggTWFyayBKYWNrc29uIDxtcGZqQG1pbWMuY28udWs+Ci0gKgotICogVGhpcyBtb2R1bGUgYWRkcyAqdmVyeSogc2ltcGx5IHN1cHBvcnQgZm9yIHRoZSBzeXN0ZW0ncyBGUkFNIGRldmljZS4KLSAqIEF0IHRoZSBtb21lbnQsIHRoaXMgaXMgaGFyZC1jb2RlZCB0byB0aGUgTUlNQzIwMCBwbGF0Zm9ybSwgYW5kIG9ubHkKLSAqIHN1cHBvcnRzIG1tYXAoKS4KLSAqLwotCi0jZGVmaW5lIEZSQU1fVkVSU0lPTgkiMS4wIgotCi0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNkZWZpbmUgRlJBTV9CQVNFCTB4YWMwMDAwMDAKLSNkZWZpbmUgRlJBTV9TSVpFCTB4MjAwMDAKLQotLyoKLSAqIFRoZSBhcmUgdGhlIGZpbGUgb3BlcmF0aW9uIGZ1bmN0aW9uIGZvciB1c2VyIGFjY2VzcyB0byAvZGV2L2ZyYW0KLSAqLwotCi1zdGF0aWMgaW50IGZyYW1fbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsCi0JCXZtYS0+dm1fc3RhcnQsCi0JCXZpcnRfdG9fcGh5cygodm9pZCAqKSgodW5zaWduZWQgbG9uZylGUkFNX0JBU0UpKSA+PiBQQUdFX1NISUZULAotCQl2bWEtPnZtX2VuZC12bWEtPnZtX3N0YXJ0LAotCQlQQUdFX1NIQVJFRCk7Ci0KLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiAtRUFHQUlOOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZyYW1fZm9wcyA9IHsKLQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCS5tbWFwCQkJPSBmcmFtX21tYXAsCi0JLmxsc2VlawkJCT0gbm9vcF9sbHNlZWssCi19OwotCi0jZGVmaW5lIEZSQU1fTUlOT1IJMAotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgZnJhbV9kZXYgPSB7Ci0JRlJBTV9NSU5PUiwKLQkiZnJhbSIsCi0JJmZyYW1fZm9wcwotfTsKLQotc3RhdGljIGludCBfX2luaXQKLWZyYW1faW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZmcmFtX2Rldik7Ci0JaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgImZyYW06IGNhbid0IG1pc2NfcmVnaXN0ZXIgb24gbWlub3I9JWRcbiIsCi0JCSAgICBGUkFNX01JTk9SKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiRlJBTSBtZW1vcnkgZHJpdmVyIHYiIEZSQU1fVkVSU0lPTiAiXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0Ci1mcmFtX2NsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZmcmFtX2Rldik7Ci19Ci0KLW1vZHVsZV9pbml0KGZyYW1faW5pdCk7Ci1tb2R1bGVfZXhpdChmcmFtX2NsZWFudXBfbW9kdWxlKTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1NT0RVTEVfQUxJQVNfTUlTQ0RFVihGUkFNX01JTk9SKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYnVncy5oIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9idWdzLmgKaW5kZXggNzYzNWU3Ny4uMjc4NjYxYiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9idWdzLmgKKysrIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9idWdzLmgKQEAgLTksNyArOSw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBjaGVja19idWdzKHZvaWQpCiB7Ci0JY3B1X2RhdGEtPmxvb3BzX3Blcl9qaWZmeSA9IGxvb3BzX3Blcl9qaWZmeTsKKwlib290X2NwdV9kYXRhLmxvb3BzX3Blcl9qaWZmeSA9IGxvb3BzX3Blcl9qaWZmeTsKIH0KIAogI2VuZGlmIC8qIF9fQVNNX0FWUjMyX0JVR1NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggNDhkNzFjNS4uOTcyYWRjYyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC04MywxMyArODMsOCBAQAogCiBleHRlcm4gc3RydWN0IGF2cjMyX2NwdWluZm8gYm9vdF9jcHVfZGF0YTsKIAotI2lmZGVmIENPTkZJR19TTVAKLWV4dGVybiBzdHJ1Y3QgYXZyMzJfY3B1aW5mbyBjcHVfZGF0YVtdOwotI2RlZmluZSBjdXJyZW50X2NwdV9kYXRhIGNwdV9kYXRhW3NtcF9wcm9jZXNzb3JfaWQoKV0KLSNlbHNlCi0jZGVmaW5lIGNwdV9kYXRhICgmYm9vdF9jcHVfZGF0YSkKKy8qIE5vIFNNUCBzdXBwb3J0IHNvIGZhciAqLwogI2RlZmluZSBjdXJyZW50X2NwdV9kYXRhIGJvb3RfY3B1X2RhdGEKLSNlbmRpZgogCiAvKiBUaGlzIGRlY2lkZXMgd2hlcmUgdGhlIGtlcm5lbCB3aWxsIHNlYXJjaCBmb3IgYSBmcmVlIGNodW5rIG9mIHZtCiAgKiBzcGFjZSBkdXJpbmcgbW1hcCdzCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9jcHUuYyBiL2FyY2gvYXZyMzIva2VybmVsL2NwdS5jCmluZGV4IDIyMzNiZTcuLjAzNDFhZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL2NwdS5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL2NwdS5jCkBAIC0zOSwxMCArMzksMTIgQEAKIAkJCSAgICAgIHNpemVfdCBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbDsKLQljaGFyICplbmRwOworCWludCByZXQ7CiAKLQl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmRwLCAwKTsKLQlpZiAoZW5kcCA9PSBidWYgfHwgdmFsID4gMHgzZikKKwlyZXQgPSBrc3RydG91bChidWYsIDAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJaWYgKHZhbCA+IDB4M2YpCiAJCXJldHVybiAtRUlOVkFMOwogCXZhbCA9ICh2YWwgPDwgMTIpIHwgKHN5c3JlZ19yZWFkKFBDQ1IpICYgMHhmZmZjMGZmZik7CiAJc3lzcmVnX3dyaXRlKFBDQ1IsIHZhbCk7CkBAIC02MSwxMSArNjMsMTEgQEAKIAkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbDsKLQljaGFyICplbmRwOworCWludCByZXQ7CiAKLQl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmRwLCAwKTsKLQlpZiAoZW5kcCA9PSBidWYpCi0JCXJldHVybiAtRUlOVkFMOworCXJldCA9IGtzdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAlzeXNyZWdfd3JpdGUoUENOVDAsIHZhbCk7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC04NCwxMCArODYsMTIgQEAKIAkJCSAgICAgIHNpemVfdCBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbDsKLQljaGFyICplbmRwOworCWludCByZXQ7CiAKLQl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmRwLCAwKTsKLQlpZiAoZW5kcCA9PSBidWYgfHwgdmFsID4gMHgzZikKKwlyZXQgPSBrc3RydG91bChidWYsIDAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJaWYgKHZhbCA+IDB4M2YpCiAJCXJldHVybiAtRUlOVkFMOwogCXZhbCA9ICh2YWwgPDwgMTgpIHwgKHN5c3JlZ19yZWFkKFBDQ1IpICYgMHhmZjAzZmZmZik7CiAJc3lzcmVnX3dyaXRlKFBDQ1IsIHZhbCk7CkBAIC0xMDYsMTEgKzExMCwxMSBAQAogCQkJICAgICAgc2l6ZV90IGNvdW50KQogewogCXVuc2lnbmVkIGxvbmcgdmFsOwotCWNoYXIgKmVuZHA7CisJaW50IHJldDsKIAotCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZHAsIDApOwotCWlmIChlbmRwID09IGJ1ZikKLQkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0ga3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCXN5c3JlZ193cml0ZShQQ05UMSwgdmFsKTsKIAogCXJldHVybiBjb3VudDsKQEAgLTEyOSwxMSArMTMzLDExIEBACiAJCQkgICAgICBzaXplX3QgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWw7Ci0JY2hhciAqZW5kcDsKKwlpbnQgcmV0OwogCi0JdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmZW5kcCwgMCk7Ci0JaWYgKGVuZHAgPT0gYnVmKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSBrc3RydG91bChidWYsIDAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAJc3lzcmVnX3dyaXRlKFBDQ05ULCB2YWwpOwogCiAJcmV0dXJuIGNvdW50OwpAQCAtMTUyLDExICsxNTYsMTEgQEAKIAkJCSAgICAgIHNpemVfdCBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIHBjY3IsIHZhbDsKLQljaGFyICplbmRwOworCWludCByZXQ7CiAKLQl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmRwLCAwKTsKLQlpZiAoZW5kcCA9PSBidWYpCi0JCXJldHVybiAtRUlOVkFMOworCXJldCA9IGtzdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAlpZiAodmFsKQogCQl2YWwgPSAxOwogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21tL2NhY2hlLmMgYi9hcmNoL2F2cjMyL21tL2NhY2hlLmMKaW5kZXggNmE0NmVjZC4uODVkNjM1YyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tbS9jYWNoZS5jCisrKyBiL2FyY2gvYXZyMzIvbW0vY2FjaGUuYwpAQCAtMTExLDYgKzExMSw3IEBACiAJX19mbHVzaF9pY2FjaGVfcmFuZ2Uoc3RhcnQgJiB+KGxpbmVzeiAtIDEpLAogCQkJICAgICAoZW5kICsgbGluZXN6IC0gMSkgJiB+KGxpbmVzeiAtIDEpKTsKIH0KK0VYUE9SVF9TWU1CT0woZmx1c2hfaWNhY2hlX3JhbmdlKTsKIAogLyoKICAqIFRoaXMgb25lIGlzIGNhbGxlZCBmcm9tIF9fZG9fZmF1bHQoKSBhbmQgZG9fc3dhcF9wYWdlKCkuCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lycS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcnEuaAppbmRleCAyZmQwNGYxLi44OWRlNTM5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lycS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXJxLmgKQEAgLTIwLDE1ICsyMCw2IEBACiAvKiBTWVNfSVJRUyBhbmQgTlJfSVJRUyBhcmUgZGVmaW5lZCBpbiA8bWFjaC1iZjV4eC9pcnEuaD4gKi8KICNpbmNsdWRlIDxtYWNoL2lycS5oPgogCi0vKgotICogcG0gc2F2ZSBiZmluIHBpbnQgcmVnaXN0ZXJzCi0gKi8KLXN0cnVjdCBhZGlfcG1fcGludF9zYXZlIHsKLQl1MzIgYXNzaWduOwotCXUzMiBlZGdlX3NldDsKLQl1MzIgaW52ZXJ0X3NldDsKLX07Ci0KICNpZiBBTk9NQUxZXzA1MDAwMjQ0ICYmIGRlZmluZWQoQ09ORklHX0JGSU5fSUNBQ0hFKQogIyBkZWZpbmUgTk9QX1BBRF9BTk9NQUxZXzA1MDAwMjQ0ICJub3A7IG5vcDsiCiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggMDU2MDI3Zi4uYWZmZjUxMCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2NyaXMvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC01LDYgKzUsNyBAQAogCiBnZW5lcmljLXkgKz0gYmFycmllci5oCiBnZW5lcmljLXkgKz0gY2xrZGV2LmgKK2dlbmVyaWMteSArPSBjcHV0aW1lLmgKIGdlbmVyaWMteSArPSBleGVjLmgKIGdlbmVyaWMteSArPSBoYXNoLmgKIGdlbmVyaWMteSArPSBrdm1fcGFyYS5oCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvaW5jbHVkZS9hc20vY3B1dGltZS5oIGIvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL2NwdXRpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0NmE2NS4uMDAwMDAwMAotLS0gYS9hcmNoL2NyaXMvaW5jbHVkZS9hc20vY3B1dGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaWZuZGVmIF9fQ1JJU19DUFVUSU1FX0gKLSNkZWZpbmUgX19DUklTX0NQVVRJTUVfSAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvY3B1dGltZS5oPgotCi0jZW5kaWYgLyogX19DUklTX0NQVVRJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9mcnYvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IGJhYmI5MzMuLjg3Yjk1ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2Zydi9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTEsNSArMSw2IEBACiAKIGdlbmVyaWMteSArPSBjbGtkZXYuaAorZ2VuZXJpYy15ICs9IGNwdXRpbWUuaAogZ2VuZXJpYy15ICs9IGV4ZWMuaAogZ2VuZXJpYy15ICs9IGhhc2guaAogZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9pbmNsdWRlL2FzbS9jcHV0aW1lLmggYi9hcmNoL2Zydi9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YzM3M2EuLjAwMDAwMDAKLS0tIGEvYXJjaC9mcnYvaW5jbHVkZS9hc20vY3B1dGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaWZuZGVmIF9BU01fQ1BVVElNRV9ICi0jZGVmaW5lIF9BU01fQ1BVVElNRV9ICi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jcHV0aW1lLmg+Ci0KLSNlbmRpZiAvKiBfQVNNX0NQVVRJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1mcnYuYyBiL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktZnJ2LmMKaW5kZXggYzI4MTIxNy4uNjdiMWQxNiAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1mcnYuYworKysgYi9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWZydi5jCkBAIC04OCw3ICs4OCw3IEBACiAKIAkvKiBEZXB0aC1GaXJzdCBTZWFyY2ggb24gYnVzIHRyZWUgKi8KIAlmb3IgKGxuPWJ1c19saXN0LT5uZXh0OyBsbiAhPSBidXNfbGlzdDsgbG49bG4tPm5leHQpIHsKLQkJYnVzID0gcGNpX2J1c19iKGxuKTsKKwkJYnVzID0gbGlzdF9lbnRyeShsbiwgc3RydWN0IHBjaV9idXMsIG5vZGUpOwogCQlpZiAoKGRldiA9IGJ1cy0+c2VsZikpIHsKIAkJCWZvciAoaWR4ID0gUENJX0JSSURHRV9SRVNPVVJDRVM7IGlkeCA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpZHgrKykgewogCQkJCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2NvbmZpZ3MvZ2VuZXJpY19kZWZjb25maWcgYi9hcmNoL2lhNjQvY29uZmlncy9nZW5lcmljX2RlZmNvbmZpZwppbmRleCA2NDA0YWNiLi5iNGVmYWYyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy9nZW5lcmljX2RlZmNvbmZpZworKysgYi9hcmNoL2lhNjQvY29uZmlncy9nZW5lcmljX2RlZmNvbmZpZwpAQCAtMjUsNyArMjUsNiBAQAogQ09ORklHX0NSQVNIX0RVTVA9eQogQ09ORklHX0VGSV9WQVJTPXkKIENPTkZJR19CSU5GTVRfTUlTQz1tCi1DT05GSUdfQUNQSV9QUk9DRlM9eQogQ09ORklHX0FDUElfQlVUVE9OPW0KIENPTkZJR19BQ1BJX0ZBTj1tCiBDT05GSUdfQUNQSV9ET0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9jb25maWdzL3RpZ2VyX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL3RpZ2VyX2RlZmNvbmZpZwppbmRleCAwZjRlOWU0Li4wZmVkOWFlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy90aWdlcl9kZWZjb25maWcKKysrIGIvYXJjaC9pYTY0L2NvbmZpZ3MvdGlnZXJfZGVmY29uZmlnCkBAIC0yNiw3ICsyNiw2IEBACiBDT05GSUdfS0VYRUM9eQogQ09ORklHX0VGSV9WQVJTPXkKIENPTkZJR19CSU5GTVRfTUlTQz1tCi1DT05GSUdfQUNQSV9QUk9DRlM9eQogQ09ORklHX0FDUElfQlVUVE9OPW0KIENPTkZJR19BQ1BJX0ZBTj1tCiBDT05GSUdfQUNQSV9QUk9DRVNTT1I9bQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2NvbmZpZ3MvengxX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL3p4MV9kZWZjb25maWcKaW5kZXggZmM3YWJhMC4uNTRiYzcyZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2NvbmZpZ3MvengxX2RlZmNvbmZpZworKysgYi9hcmNoL2lhNjQvY29uZmlncy96eDFfZGVmY29uZmlnCkBAIC0xNiw3ICsxNiw2IEBACiBDT05GSUdfQ1JBU0hfRFVNUD15CiBDT05GSUdfRUZJX1ZBUlM9eQogQ09ORklHX0JJTkZNVF9NSVNDPXkKLUNPTkZJR19BQ1BJX1BST0NGUz15CiBDT05GSUdfSE9UUExVR19QQ0k9eQogQ09ORklHX0hPVFBMVUdfUENJX0FDUEk9eQogQ09ORklHX1BBQ0tFVD15CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jIGIvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYwppbmRleCAzMGM0M2QzLi4xYTg3MWI3IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jCisrKyBiL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMKQEAgLTExNDAsMTEgKzExNDAsMTMgQEAKIAogI2lmZGVmIENPTkZJR19OVU1BCiAJeworCQlpbnQgbm9kZSA9IGlvYy0+bm9kZTsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JCXBhZ2UgPSBhbGxvY19wYWdlc19leGFjdF9ub2RlKGlvYy0+bm9kZSA9PSBNQVhfTlVNTk9ERVMgPwotCQkgICAgICAgICAgICAgICAgICAgICAgICBudW1hX25vZGVfaWQoKSA6IGlvYy0+bm9kZSwgZmxhZ3MsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgIGdldF9vcmRlcihzaXplKSk7CiAKKwkJaWYgKG5vZGUgPT0gTlVNQV9OT19OT0RFKQorCQkJbm9kZSA9IG51bWFfbm9kZV9pZCgpOworCisJCXBhZ2UgPSBhbGxvY19wYWdlc19leGFjdF9ub2RlKG5vZGUsIGZsYWdzLCBnZXRfb3JkZXIoc2l6ZSkpOwogCQlpZiAodW5saWtlbHkoIXBhZ2UpKQogCQkJcmV0dXJuIE5VTEw7CiAKQEAgLTE5MTQsNyArMTkxNiw3IEBACiAJc2VxX3ByaW50ZihzLCAiSGV3bGV0dCBQYWNrYXJkICVzIElPQyByZXYgJWQuJWRcbiIsCiAJCWlvYy0+bmFtZSwgKChpb2MtPnJldiA+PiA0KSAmIDB4RiksIChpb2MtPnJldiAmIDB4RikpOwogI2lmZGVmIENPTkZJR19OVU1BCi0JaWYgKGlvYy0+bm9kZSAhPSBNQVhfTlVNTk9ERVMpCisJaWYgKGlvYy0+bm9kZSAhPSBOVU1BX05PX05PREUpCiAJCXNlcV9wcmludGYocywgIk5VTUEgbm9kZSAgICAgICA6ICVkXG4iLCBpb2MtPm5vZGUpOwogI2VuZGlmCiAJc2VxX3ByaW50ZihzLCAiSU9WQSBzaXplICAgICAgIDogJWxkIE1CXG4iLCAoKGlvYy0+cGRpcl9zaXplID4+IDMpICogaW92cF9zaXplKS8oMTAyNCoxMDI0KSk7CkBAIC0yMDE1LDMxICsyMDE3LDE5IEBACiAJcHJpbnRrKEtFUk5fV0FSTklORyAiTm8gSU9DIGZvciBQQ0kgQnVzICUwNHg6JTAyeCBpbiBBQ1BJXG4iLCBwY2lfZG9tYWluX25yKGJ1cyksIGJ1cy0+bnVtYmVyKTsKIH0KIAotI2lmZGVmIENPTkZJR19OVU1BCiBzdGF0aWMgdm9pZCBfX2luaXQKIHNiYV9tYXBfaW9jX3RvX25vZGUoc3RydWN0IGlvYyAqaW9jLCBhY3BpX2hhbmRsZSBoYW5kbGUpCiB7CisjaWZkZWYgQ09ORklHX05VTUEKIAl1bnNpZ25lZCBpbnQgbm9kZTsKLQlpbnQgcHhtOwogCi0JaW9jLT5ub2RlID0gTUFYX05VTU5PREVTOwotCi0JcHhtID0gYWNwaV9nZXRfcHhtKGhhbmRsZSk7Ci0KLQlpZiAocHhtIDwgMCkKLQkJcmV0dXJuOwotCi0Jbm9kZSA9IHB4bV90b19ub2RlKHB4bSk7Ci0KLQlpZiAobm9kZSA+PSBNQVhfTlVNTk9ERVMgfHwgIW5vZGVfb25saW5lKG5vZGUpKQotCQlyZXR1cm47CisJbm9kZSA9IGFjcGlfZ2V0X25vZGUoaGFuZGxlKTsKKwlpZiAobm9kZSAhPSBOVU1BX05PX05PREUgJiYgIW5vZGVfb25saW5lKG5vZGUpKQorCQlub2RlID0gTlVNQV9OT19OT0RFOwogCiAJaW9jLT5ub2RlID0gbm9kZTsKLQlyZXR1cm47Ci19Ci0jZWxzZQotI2RlZmluZSBzYmFfbWFwX2lvY190b19ub2RlKGlvYywgaGFuZGxlKQogI2VuZGlmCit9CiAKIHN0YXRpYyBpbnQKIGFjcGlfc2JhX2lvY19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vcGNpLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vcGNpLmgKaW5kZXggNzFmYmFhYS4uN2Q0MWNjMCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3BjaS5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9wY2kuaApAQCAtOTgsNyArOTgsNyBAQAogCXN0cnVjdCBhY3BpX2RldmljZSAqY29tcGFuaW9uOwogCXZvaWQgKmlvbW11OwogCWludCBzZWdtZW50OwotCWludCBub2RlOwkJLyogbmVhcmVzdCBub2RlIHdpdGggbWVtb3J5IG9yIC0xIGZvciBnbG9iYWwgYWxsb2NhdGlvbiAqLworCWludCBub2RlOwkJLyogbmVhcmVzdCBub2RlIHdpdGggbWVtb3J5IG9yIE5VTUFfTk9fTk9ERSBmb3IgZ2xvYmFsIGFsbG9jYXRpb24gKi8KIAogCXZvaWQgKnBsYXRmb3JtX2RhdGE7CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwppbmRleCAwN2QyMDljLi4wZDQwN2IzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwpAQCAtNTQsMTAgKzU0LDYgQEAKICNpbmNsdWRlIDxhc20vc2FsLmg+CiAjaW5jbHVkZSA8YXNtL2N5Y2xvbmUuaD4KIAotI2RlZmluZSBCQURfTUFEVF9FTlRSWShlbnRyeSwgZW5kKSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJKCFlbnRyeSkgfHwgKHVuc2lnbmVkIGxvbmcpZW50cnkgKyBzaXplb2YoKmVudHJ5KSA+IGVuZCB8fCAgXAotCQkoKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqKWVudHJ5KS0+bGVuZ3RoIDwgc2l6ZW9mKCplbnRyeSkpCi0KICNkZWZpbmUgUFJFRklYCQkJIkFDUEk6ICIKIAogdW5zaWduZWQgaW50IGFjcGlfY3BlaV9vdmVycmlkZTsKQEAgLTgwMywxNCArNzk5LDkgQEAKICAqICBBQ1BJIGJhc2VkIGhvdHBsdWcgQ1BVIHN1cHBvcnQKICAqLwogI2lmZGVmIENPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVCi1zdGF0aWMKLWludCBhY3BpX21hcF9jcHUybm9kZShhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBjcHUsIGludCBwaHlzaWQpCitzdGF0aWMgaW50IGFjcGlfbWFwX2NwdTJub2RlKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IGNwdSwgaW50IHBoeXNpZCkKIHsKICNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCi0JaW50IHB4bV9pZDsKLQlpbnQgbmlkOwotCi0JcHhtX2lkID0gYWNwaV9nZXRfcHhtKGhhbmRsZSk7CiAJLyoKIAkgKiBXZSBkb24ndCBoYXZlIGNwdS1vbmx5LW5vZGUgaG90YWRkLiBCdXQgaWYgdGhlIHN5c3RlbSBlcXVpcHMKIAkgKiBTUkFUIHRhYmxlLCBweG0gaXMgYWxyZWFkeSBmb3VuZCBhbmQgbm9kZSBpcyByZWFkeS4KQEAgLTgxOCwxMSArODA5LDEwIEBACiAJICogVGhpcyBjb2RlIGhlcmUgaXMgZm9yIHRoZSBzeXN0ZW0gd2hpY2ggZG9lc24ndCBoYXZlIGZ1bGwgU1JBVAogICAJICogdGFibGUgZm9yIHBvc3NpYmxlIGNwdXMuCiAJICovCi0JbmlkID0gYWNwaV9tYXBfcHhtX3RvX25vZGUocHhtX2lkKTsKIAlub2RlX2NwdWlkW2NwdV0ucGh5c19pZCA9IHBoeXNpZDsKLQlub2RlX2NwdWlkW2NwdV0ubmlkID0gbmlkOworCW5vZGVfY3B1aWRbY3B1XS5uaWQgPSBhY3BpX2dldF9ub2RlKGhhbmRsZSk7CiAjZW5kaWYKLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiBpbnQgYWRkaXRpb25hbF9jcHVzIF9faW5pdGRhdGEgPSAtMTsKQEAgLTkyOSw3ICs5MTksNyBAQAogCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CiAJc3RydWN0IGFjcGlfbWFkdF9pb19zYXBpYyAqaW9zYXBpYzsKIAl1bnNpZ25lZCBpbnQgZ3NpX2Jhc2U7Ci0JaW50IHB4bSwgbm9kZTsKKwlpbnQgbm9kZTsKIAogCS8qIE9ubHkgY2FyZSBhYm91dCBvYmplY3RzIHcvIGEgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgTUFEVCAqLwogCWlmIChBQ1BJX0ZBSUxVUkUoYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAiX01BVCIsIE5VTEwsICZidWZmZXIpKSkKQEAgLTk1NiwxNyArOTQ2LDkgQEAKIAogCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKIAotCS8qCi0JICogT0ssIGl0J3MgYW4gSU9TQVBJQyBNQURUIGVudHJ5LCBsb29rIGZvciBhIF9QWE0gdmFsdWUgdG8gdGVsbAotCSAqIHVzIHdoaWNoIG5vZGUgdG8gYXNzb2NpYXRlIHRoaXMgd2l0aC4KLQkgKi8KLQlweG0gPSBhY3BpX2dldF9weG0oaGFuZGxlKTsKLQlpZiAocHhtIDwgMCkKLQkJcmV0dXJuIEFFX09LOwotCi0Jbm9kZSA9IHB4bV90b19ub2RlKHB4bSk7Ci0KLQlpZiAobm9kZSA+PSBNQVhfTlVNTk9ERVMgfHwgIW5vZGVfb25saW5lKG5vZGUpIHx8CisJLyogT0ssIGl0J3MgYW4gSU9TQVBJQyBNQURUIGVudHJ5OyBhc3NvY2lhdGUgaXQgd2l0aCBhIG5vZGUgKi8KKwlub2RlID0gYWNwaV9nZXRfbm9kZShoYW5kbGUpOworCWlmIChub2RlID09IE5VTUFfTk9fTk9ERSB8fCAhbm9kZV9vbmxpbmUobm9kZSkgfHwKIAkgICAgY3B1bWFza19lbXB0eShjcHVtYXNrX29mX25vZGUobm9kZSkpKQogCQlyZXR1cm4gQUVfT0s7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYyBiL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYwppbmRleCAxMDM0ODg0Li4wODg0ZjVlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jCkBAIC0zNjQsNyArMzY0LDYgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxX21vdmVfaXJxYWN0aW9uID0gewogCS5oYW5kbGVyID0Jc21wX2lycV9tb3ZlX2NsZWFudXBfaW50ZXJydXB0LAotCS5mbGFncyA9CUlSUUZfRElTQUJMRUQsCiAJLm5hbWUgPQkJImlycV9tb3ZlIgogfTsKIApAQCAtNDg5LDE0ICs0ODgsMTMgQEAKIAlpYTY0X3NybHpfZCgpOwogCXdoaWxlICh2ZWN0b3IgIT0gSUE2NF9TUFVSSU9VU19JTlRfVkVDVE9SKSB7CiAJCWludCBpcnEgPSBsb2NhbF92ZWN0b3JfdG9faXJxKHZlY3Rvcik7Ci0JCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CiAKIAkJaWYgKHVubGlrZWx5KElTX0xPQ0FMX1RMQl9GTFVTSCh2ZWN0b3IpKSkgewogCQkJc21wX2xvY2FsX2ZsdXNoX3RsYigpOwotCQkJa3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgZGVzYyk7CisJCQlrc3RhdF9pbmNyX2lycV90aGlzX2NwdShpcnEpOwogCQl9IGVsc2UgaWYgKHVubGlrZWx5KElTX1JFU0NIRURVTEUodmVjdG9yKSkpIHsKIAkJCXNjaGVkdWxlcl9pcGkoKTsKLQkJCWtzdGF0X2luY3JfaXJxc190aGlzX2NwdShpcnEsIGRlc2MpOworCQkJa3N0YXRfaW5jcl9pcnFfdGhpc19jcHUoaXJxKTsKIAkJfSBlbHNlIHsKIAkJCWlhNjRfc2V0cmVnKF9JQTY0X1JFR19DUl9UUFIsIHZlY3Rvcik7CiAJCQlpYTY0X3NybHpfZCgpOwpAQCAtNTQ5LDEzICs1NDcsMTIgQEAKIAkgICovCiAJd2hpbGUgKHZlY3RvciAhPSBJQTY0X1NQVVJJT1VTX0lOVF9WRUNUT1IpIHsKIAkJaW50IGlycSA9IGxvY2FsX3ZlY3Rvcl90b19pcnEodmVjdG9yKTsKLQkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAogCQlpZiAodW5saWtlbHkoSVNfTE9DQUxfVExCX0ZMVVNIKHZlY3RvcikpKSB7CiAJCQlzbXBfbG9jYWxfZmx1c2hfdGxiKCk7Ci0JCQlrc3RhdF9pbmNyX2lycXNfdGhpc19jcHUoaXJxLCBkZXNjKTsKKwkJCWtzdGF0X2luY3JfaXJxX3RoaXNfY3B1KGlycSk7CiAJCX0gZWxzZSBpZiAodW5saWtlbHkoSVNfUkVTQ0hFRFVMRSh2ZWN0b3IpKSkgewotCQkJa3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgZGVzYyk7CisJCQlrc3RhdF9pbmNyX2lycV90aGlzX2NwdShpcnEpOwogCQl9IGVsc2UgewogCQkJc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKE5VTEwpOwogCkBAIC02MDIsNyArNTk5LDYgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXBpX2lycWFjdGlvbiA9IHsKIAkuaGFuZGxlciA9CWhhbmRsZV9JUEksCi0JLmZsYWdzID0JSVJRRl9ESVNBQkxFRCwKIAkubmFtZSA9CQkiSVBJIgogfTsKIApAQCAtNjExLDEzICs2MDcsMTEgQEAKICAqLwogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gcmVzY2hlZF9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIgPQlkdW1teV9oYW5kbGVyLAotCS5mbGFncyA9CUlSUUZfRElTQUJMRUQsCiAJLm5hbWUgPQkJInJlc2NoZWQiCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiB0bGJfaXJxYWN0aW9uID0gewogCS5oYW5kbGVyID0JZHVtbXlfaGFuZGxlciwKLQkuZmxhZ3MgPQlJUlFGX0RJU0FCTEVELAogCS5uYW1lID0JCSJ0bGJfZmx1c2giCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL21jYS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYwppbmRleCA2MDE1MDJhLi5kYjdiMzZiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL21jYS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKQEAgLTE3NzIsMzggKzE3NzIsMzIgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gY21jaV9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIgPQlpYTY0X21jYV9jbWNfaW50X2hhbmRsZXIsCi0JLmZsYWdzID0JSVJRRl9ESVNBQkxFRCwKIAkubmFtZSA9CQkiY21jX2huZGxyIgogfTsKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gY21jcF9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIgPQlpYTY0X21jYV9jbWNfaW50X2NhbGxlciwKLQkuZmxhZ3MgPQlJUlFGX0RJU0FCTEVELAogCS5uYW1lID0JCSJjbWNfcG9sbCIKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG1jYV9yZHp2X2lycWFjdGlvbiA9IHsKIAkuaGFuZGxlciA9CWlhNjRfbWNhX3JlbmRlel9pbnRfaGFuZGxlciwKLQkuZmxhZ3MgPQlJUlFGX0RJU0FCTEVELAogCS5uYW1lID0JCSJtY2FfcmR6diIKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG1jYV93a3VwX2lycWFjdGlvbiA9IHsKIAkuaGFuZGxlciA9CWlhNjRfbWNhX3dha2V1cF9pbnRfaGFuZGxlciwKLQkuZmxhZ3MgPQlJUlFGX0RJU0FCTEVELAogCS5uYW1lID0JCSJtY2Ffd2t1cCIKIH07CiAKICNpZmRlZiBDT05GSUdfQUNQSQogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbWNhX2NwZV9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIgPQlpYTY0X21jYV9jcGVfaW50X2hhbmRsZXIsCi0JLmZsYWdzID0JSVJRRl9ESVNBQkxFRCwKIAkubmFtZSA9CQkiY3BlX2huZGxyIgogfTsKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbWNhX2NwZXBfaXJxYWN0aW9uID0gewogCS5oYW5kbGVyID0JaWE2NF9tY2FfY3BlX2ludF9jYWxsZXIsCi0JLmZsYWdzID0JSVJRRl9ESVNBQkxFRCwKIAkubmFtZSA9CQkiY3BlX3BvbGwiCiB9OwogI2VuZGlmIC8qIENPTkZJR19BQ1BJICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL21zaV9pYTY0LmMgYi9hcmNoL2lhNjQva2VybmVsL21zaV9pYTY0LmMKaW5kZXggZmIyZjFlNi4uYzQzMGY5MSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9tc2lfaWE2NC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvbXNpX2lhNjQuYwpAQCAtMTcsMTIgKzE3LDkgQEAKIHsKIAlzdHJ1Y3QgbXNpX21zZyBtc2c7CiAJdTMyIGFkZHIsIGRhdGE7Ci0JaW50IGNwdSA9IGZpcnN0X2NwdSgqY3B1X21hc2spOworCWludCBjcHUgPSBjcHVtYXNrX2ZpcnN0X2FuZChjcHVfbWFzaywgY3B1X29ubGluZV9tYXNrKTsKIAl1bnNpZ25lZCBpbnQgaXJxID0gaWRhdGEtPmlycTsKIAotCWlmICghY3B1X29ubGluZShjcHUpKQotCQlyZXR1cm4gLTE7Ci0KIAlpZiAoaXJxX3ByZXBhcmVfbW92ZShpcnEsIGNwdSkpCiAJCXJldHVybiAtMTsKIApAQCAtMTM5LDEwICsxMzYsNyBAQAogCXVuc2lnbmVkIGludCBpcnEgPSBkYXRhLT5pcnE7CiAJc3RydWN0IGlycV9jZmcgKmNmZyA9IGlycV9jZmcgKyBpcnE7CiAJc3RydWN0IG1zaV9tc2cgbXNnOwotCWludCBjcHUgPSBjcHVtYXNrX2ZpcnN0KG1hc2spOwotCi0JaWYgKCFjcHVfb25saW5lKGNwdSkpCi0JCXJldHVybiAtMTsKKwlpbnQgY3B1ID0gY3B1bWFza19maXJzdF9hbmQobWFzaywgY3B1X29ubGluZV9tYXNrKTsKIAogCWlmIChpcnFfcHJlcGFyZV9tb3ZlKGlycSwgY3B1KSkKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYwppbmRleCBjYjU5Mjc3Li5kODQxYzRiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYworKysgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYwpAQCAtNjM4Nyw3ICs2Mzg3LDYgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gcGVyZm1vbl9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIgPSBwZm1faW50ZXJydXB0X2hhbmRsZXIsCi0JLmZsYWdzICAgPSBJUlFGX0RJU0FCTEVELAogCS5uYW1lICAgID0gInBlcmZtb24iCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3RpbWUuYyBiL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jCmluZGV4IGZiYWFjMWEuLjcxYzUyYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jCkBAIC0zODAsNyArMzgwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gdGltZXJfaXJxYWN0aW9uID0gewogCS5oYW5kbGVyID0JdGltZXJfaW50ZXJydXB0LAotCS5mbGFncyA9CUlSUUZfRElTQUJMRUQgfCBJUlFGX0lSUVBPTEwsCisJLmZsYWdzID0JSVJRRl9JUlFQT0xMLAogCS5uYW1lID0JCSJ0aW1lciIKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9wY2kvZml4dXAuYyBiL2FyY2gvaWE2NC9wY2kvZml4dXAuYwppbmRleCA1ZGM5NjlkLi5lZWUwNjlhIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvcGNpL2ZpeHVwLmMKKysrIGIvYXJjaC9pYTY0L3BjaS9maXh1cC5jCkBAIC01LDYgKzUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZnYWFyYi5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KIApAQCAtMTksOSArMjAsMTAgQEAKICAqIElPUkVTT1VSQ0VfUk9NX1NIQURPVyBpcyB1c2VkIHRvIGFzc29jaWF0ZSB0aGUgYm9vdCB2aWRlbwogICogY2FyZCB3aXRoIHRoaXMgY29weS4gT24gbGFwdG9wcyB0aGlzIGNvcHkgaGFzIHRvIGJlIHVzZWQgc2luY2UKICAqIHRoZSBtYWluIFJPTSBtYXkgYmUgY29tcHJlc3NlZCBvciBjb21iaW5lZCB3aXRoIGFub3RoZXIgaW1hZ2UuCi0gKiBTZWUgcGNpX21hcF9yb20oKSBmb3IgdXNlIG9mIHRoaXMgZmxhZy4gSU9SRVNPVVJDRV9ST01fU0hBRE9XCi0gKiBpcyBtYXJrZWQgaGVyZSBzaW5jZSB0aGUgYm9vdCB2aWRlbyBkZXZpY2Ugd2lsbCBiZSB0aGUgb25seSBlbmFibGVkCi0gKiB2aWRlbyBkZXZpY2UgYXQgdGhpcyBwb2ludC4KKyAqIFNlZSBwY2lfbWFwX3JvbSgpIGZvciB1c2Ugb2YgdGhpcyBmbGFnLiBCZWZvcmUgbWFya2luZyB0aGUgZGV2aWNlCisgKiB3aXRoIElPUkVTT1VSQ0VfUk9NX1NIQURPVyBjaGVjayBpZiBhIHZnYV9kZWZhdWx0X2RldmljZSBpcyBhbHJlYWR5IHNldAorICogYnkgZWl0aGVyIGFyY2ggY2RlIG9yIHZnYS1hcmJpdHJhdGlvbiwgaWYgc28gb25seSBhcHBseSB0aGUgZml4dXAgdG8gdGhpcworICogYWxyZWFkeSBkZXRlcm1pbmVkIHByaW1hcnkgdmlkZW8gY2FyZC4KICAqLwogCiBzdGF0aWMgdm9pZCBwY2lfZml4dXBfdmlkZW8oc3RydWN0IHBjaV9kZXYgKnBkZXYpCkBAIC0zNSw5ICszNyw2IEBACiAJCXJldHVybjsKIAkvKiBNYXliZSwgdGhpcyBtYWNoaW5lIHN1cHBvcnRzIGxlZ2FjeSBtZW1vcnkgbWFwLiAqLwogCi0JaWYgKChwZGV2LT5jbGFzcyA+PiA4KSAhPSBQQ0lfQ0xBU1NfRElTUExBWV9WR0EpCi0JCXJldHVybjsKLQogCS8qIElzIFZHQSByb3V0ZWQgdG8gdXM/ICovCiAJYnVzID0gcGRldi0+YnVzOwogCXdoaWxlIChidXMpIHsKQEAgLTYwLDEwICs1OSwxNCBAQAogCQl9CiAJCWJ1cyA9IGJ1cy0+cGFyZW50OwogCX0KLQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmNvbmZpZyk7Ci0JaWYgKGNvbmZpZyAmIChQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSkpIHsKLQkJcGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZmxhZ3MgfD0gSU9SRVNPVVJDRV9ST01fU0hBRE9XOwotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJCb290IHZpZGVvIGRldmljZVxuIik7CisJaWYgKCF2Z2FfZGVmYXVsdF9kZXZpY2UoKSB8fCBwZGV2ID09IHZnYV9kZWZhdWx0X2RldmljZSgpKSB7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY29uZmlnKTsKKwkJaWYgKGNvbmZpZyAmIChQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSkpIHsKKwkJCXBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLmZsYWdzIHw9IElPUkVTT1VSQ0VfUk9NX1NIQURPVzsKKwkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgIkJvb3QgdmlkZW8gZGV2aWNlXG4iKTsKKwkJCXZnYV9zZXRfZGVmYXVsdF9kZXZpY2UocGRldik7CisJCX0KIAl9CiB9Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2ZpeHVwX3ZpZGVvKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0NMQVNTX0ZJTkFMKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJCQkJUENJX0NMQVNTX0RJU1BMQVlfVkdBLCA4LCBwY2lfZml4dXBfdmlkZW8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3BjaS9wY2kuYyBiL2FyY2gvaWE2NC9wY2kvcGNpLmMKaW5kZXggOWU0OTM4ZC4uMjkxYTU4MiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3BjaS9wY2kuYworKysgYi9hcmNoL2lhNjQvcGNpL3BjaS5jCkBAIC0xMjYsNyArMTI2LDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAljb250cm9sbGVyLT5zZWdtZW50ID0gc2VnOwotCWNvbnRyb2xsZXItPm5vZGUgPSAtMTsKIAlyZXR1cm4gY29udHJvbGxlcjsKIH0KIApAQCAtNDMwLDE5ICs0MjksMTQgQEAKIAlzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbyA9IE5VTEw7CiAJaW50IGJ1c251bSA9IHJvb3QtPnNlY29uZGFyeS5zdGFydDsKIAlzdHJ1Y3QgcGNpX2J1cyAqcGJ1czsKLQlpbnQgcHhtLCByZXQ7CisJaW50IHJldDsKIAogCWNvbnRyb2xsZXIgPSBhbGxvY19wY2lfY29udHJvbGxlcihkb21haW4pOwogCWlmICghY29udHJvbGxlcikKIAkJcmV0dXJuIE5VTEw7CiAKIAljb250cm9sbGVyLT5jb21wYW5pb24gPSBkZXZpY2U7Ci0KLQlweG0gPSBhY3BpX2dldF9weG0oZGV2aWNlLT5oYW5kbGUpOwotI2lmZGVmIENPTkZJR19OVU1BCi0JaWYgKHB4bSA+PSAwKQotCQljb250cm9sbGVyLT5ub2RlID0gcHhtX3RvX25vZGUocHhtKTsKLSNlbmRpZgorCWNvbnRyb2xsZXItPm5vZGUgPSBhY3BpX2dldF9ub2RlKGRldmljZS0+aGFuZGxlKTsKIAogCWluZm8gPSBremFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghaW5mbykgewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaXJxLmMKaW5kZXggNjJjZjRkZC4uODVkMDk1MSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jCkBAIC0yMDksOCArMjA5LDggQEAKIAluYXNpZF90IG5hc2lkOwogCWludCBzbGljZTsKIAotCW5hc2lkID0gY3B1aWRfdG9fbmFzaWQoY3B1bWFza19maXJzdChtYXNrKSk7Ci0Jc2xpY2UgPSBjcHVpZF90b19zbGljZShjcHVtYXNrX2ZpcnN0KG1hc2spKTsKKwluYXNpZCA9IGNwdWlkX3RvX25hc2lkKGNwdW1hc2tfZmlyc3RfYW5kKG1hc2ssIGNwdV9vbmxpbmVfbWFzaykpOworCXNsaWNlID0gY3B1aWRfdG9fc2xpY2UoY3B1bWFza19maXJzdF9hbmQobWFzaywgY3B1X29ubGluZV9tYXNrKSk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc25faXJxX2luZm8sIHNuX2lycV9pbmZvX3NhZmUsCiAJCQkJIHNuX2lycV9saFtpcnFdLCBsaXN0KQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9tc2lfc24uYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvbXNpX3NuLmMKaW5kZXggMmI5OGI5ZS4uYWZjNThkMiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9tc2lfc24uYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL21zaV9zbi5jCkBAIC0xNjYsNyArMTY2LDcgQEAKIAlzdHJ1Y3Qgc25fcGNpYnVzX3Byb3ZpZGVyICpwcm92aWRlcjsKIAl1bnNpZ25lZCBpbnQgY3B1LCBpcnEgPSBkYXRhLT5pcnE7CiAKLQljcHUgPSBjcHVtYXNrX2ZpcnN0KGNwdV9tYXNrKTsKKwljcHUgPSBjcHVtYXNrX2ZpcnN0X2FuZChjcHVfbWFzaywgY3B1X29ubGluZV9tYXNrKTsKIAlzbl9pcnFfaW5mbyA9IHNuX21zaV9pbmZvW2lycV0uc25faXJxX2luZm87CiAJaWYgKHNuX2lycV9pbmZvID09IE5VTEwgfHwgc25faXJxX2luZm8tPmlycV9pbnRfYml0ID49IDApCiAJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL20zMnIvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDU4MjVhMzUuLjY3Nzc5YTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSw1ICsxLDYgQEAKIAogZ2VuZXJpYy15ICs9IGNsa2Rldi5oCitnZW5lcmljLXkgKz0gY3B1dGltZS5oCiBnZW5lcmljLXkgKz0gZXhlYy5oCiBnZW5lcmljLXkgKz0gaGFzaC5oCiBnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9jcHV0aW1lLmggYi9hcmNoL20zMnIvaW5jbHVkZS9hc20vY3B1dGltZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTQ3NTUwLi4wMDAwMDAwCi0tLSBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX19NMzJSX0NQVVRJTUVfSAotI2RlZmluZSBfX00zMlJfQ1BVVElNRV9ICi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jcHV0aW1lLmg+Ci0KLSNlbmRpZiAvKiBfX00zMlJfQ1BVVElNRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvYW1pZ2EvY2lhLmMgYi9hcmNoL202OGsvYW1pZ2EvY2lhLmMKaW5kZXggMThjMGUyOS4uMjA4MWI4YyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2FtaWdhL2NpYS5jCisrKyBiL2FyY2gvbTY4ay9hbWlnYS9jaWEuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CmRpZmYgLS1naXQgYS9hcmNoL202OGsvYXRhcmkvYXRhaW50cy5jIGIvYXJjaC9tNjhrL2F0YXJpL2F0YWludHMuYwppbmRleCAzZTczYTYzLi4zZDJiNjNiIDEwMDY0NAotLS0gYS9hcmNoL202OGsvYXRhcmkvYXRhaW50cy5jCisrKyBiL2FyY2gvbTY4ay9hdGFyaS9hdGFpbnRzLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL2ludHMuYyBiL2FyY2gvbTY4ay9rZXJuZWwvaW50cy5jCmluZGV4IDA3N2QzYTcuLjViOGQ2NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvaW50cy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvaW50cy5jCkBAIC0xMCw5ICsxMCw5IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CmRpZmYgLS1naXQgYS9hcmNoL21ldGFnL0tjb25maWcgYi9hcmNoL21ldGFnL0tjb25maWcKaW5kZXggZTU2YWJkMi4uYjFkM2M5YyAxMDA2NDQKLS0tIGEvYXJjaC9tZXRhZy9LY29uZmlnCisrKyBiL2FyY2gvbWV0YWcvS2NvbmZpZwpAQCAtOSw2ICs5LDcgQEAKIAlzZWxlY3QgSEFWRV9BUkNIX1RSQUNFSE9PSwogCXNlbGVjdCBIQVZFX0NfUkVDT1JETUNPVU5UCiAJc2VsZWN0IEhBVkVfREVCVUdfS01FTUxFQUsKKwlzZWxlY3QgSEFWRV9ERUJVR19TVEFDS09WRVJGTE9XCiAJc2VsZWN0IEhBVkVfRFlOQU1JQ19GVFJBQ0UKIAlzZWxlY3QgSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRAogCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX1RSQUNFUgpAQCAtMjksNyArMzAsNiBAQAogCXNlbGVjdCBPRgogCXNlbGVjdCBPRl9FQVJMWV9GTEFUVFJFRQogCXNlbGVjdCBTUEFSU0VfSVJRCi0Jc2VsZWN0IEhBVkVfREVCVUdfU1RBQ0tPVkVSRkxPVwogCiBjb25maWcgU1RBQ0tUUkFDRV9TVVBQT1JUCiAJZGVmX2Jvb2wgeQpkaWZmIC0tZ2l0IGEvYXJjaC9tZXRhZy9pbmNsdWRlL2FzbS90b3BvbG9neS5oIGIvYXJjaC9tZXRhZy9pbmNsdWRlL2FzbS90b3BvbG9neS5oCmluZGV4IDhlOWMwYjMuLmU5NWY4NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWV0YWcvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAorKysgYi9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKQEAgLTMsMzMgKzMsNiBAQAogCiAjaWZkZWYgQ09ORklHX05VTUEKIAotLyogc2NoZWRfZG9tYWlucyBTRF9OT0RFX0lOSVQgZm9yIE1ldGEgbWFjaGluZXMgKi8KLSNkZWZpbmUgU0RfTk9ERV9JTklUIChzdHJ1Y3Qgc2NoZWRfZG9tYWluKSB7CQlcCi0JLnBhcmVudAkJCT0gTlVMTCwJCQlcCi0JLmNoaWxkCQkJPSBOVUxMLAkJCVwKLQkuZ3JvdXBzCQkJPSBOVUxMLAkJCVwKLQkubWluX2ludGVydmFsCQk9IDgsCQkJXAotCS5tYXhfaW50ZXJ2YWwJCT0gMzIsCQkJXAotCS5idXN5X2ZhY3RvcgkJPSAzMiwJCQlcCi0JLmltYmFsYW5jZV9wY3QJCT0gMTI1LAkJCVwKLQkuY2FjaGVfbmljZV90cmllcwk9IDIsCQkJXAotCS5idXN5X2lkeAkJPSAzLAkJCVwKLQkuaWRsZV9pZHgJCT0gMiwJCQlcCi0JLm5ld2lkbGVfaWR4CQk9IDAsCQkJXAotCS53YWtlX2lkeAkJPSAwLAkJCVwKLQkuZm9ya2V4ZWNfaWR4CQk9IDAsCQkJXAotCS5mbGFncwkJCT0gU0RfTE9BRF9CQUxBTkNFCVwKLQkJCQl8IFNEX0JBTEFOQ0VfRk9SSwlcCi0JCQkJfCBTRF9CQUxBTkNFX0VYRUMJXAotCQkJCXwgU0RfQkFMQU5DRV9ORVdJRExFCVwKLQkJCQl8IFNEX1NFUklBTElaRSwJCVwKLQkubGFzdF9iYWxhbmNlCQk9IGppZmZpZXMsCQlcCi0JLmJhbGFuY2VfaW50ZXJ2YWwJPSAxLAkJCVwKLQkubnJfYmFsYW5jZV9mYWlsZWQJPSAwLAkJCVwKLQkubWF4X25ld2lkbGVfbGJfY29zdAk9IDAsCQkJXAotCS5uZXh0X2RlY2F5X21heF9sYl9jb3N0CT0gamlmZmllcywJCVwKLX0KLQogI2RlZmluZSBjcHVfdG9fbm9kZShjcHUpCSgodm9pZCkoY3B1KSwgMCkKICNkZWZpbmUgcGFyZW50X25vZGUobm9kZSkJKCh2b2lkKShub2RlKSwgMCkKIApkaWZmIC0tZ2l0IGEvYXJjaC9tZXRhZy9rZXJuZWwvaXJxLmMgYi9hcmNoL21ldGFnL2tlcm5lbC9pcnEuYwppbmRleCAzYjRiN2Y2Li41Mzg1ZGQxIDEwMDY0NAotLS0gYS9hcmNoL21ldGFnL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL21ldGFnL2tlcm5lbC9pcnEuYwpAQCAtMjYxLDE4ICsyNjEsNiBAQAogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi1zdGF0aWMgdm9pZCByb3V0ZV9pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgY3B1KQotewotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7Ci0Jc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwKGRhdGEpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKLQlpZiAoY2hpcC0+aXJxX3NldF9hZmZpbml0eSkKLQkJY2hpcC0+aXJxX3NldF9hZmZpbml0eShkYXRhLCBjcHVtYXNrX29mKGNwdSksIGZhbHNlKTsKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwotfQotCiAvKgogICogVGhlIENQVSBoYXMgYmVlbiBtYXJrZWQgb2ZmbGluZS4gIE1pZ3JhdGUgSVJRcyBvZmYgdGhpcyBDUFUuICBJZgogICogdGhlIGFmZmluaXR5IHNldHRpbmdzIGRvIG5vdCBhbGxvdyBvdGhlciBDUFVzLCBmb3JjZSB0aGVtIG9udG8gYW55CkBAIC0yODEsMTAgKzI2OSw5IEBACiB2b2lkIG1pZ3JhdGVfaXJxcyh2b2lkKQogewogCXVuc2lnbmVkIGludCBpLCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjOwogCi0JZm9yX2VhY2hfaXJxX2Rlc2MoaSwgZGVzYykgewotCQlzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEgPSBpcnFfZGVzY19nZXRfaXJxX2RhdGEoZGVzYyk7CisJZm9yX2VhY2hfYWN0aXZlX2lycShpKSB7CisJCXN0cnVjdCBpcnFfZGF0YSAqZGF0YSA9IGlycV9nZXRfaXJxX2RhdGEoaSk7CiAJCXVuc2lnbmVkIGludCBuZXdjcHU7CiAKIAkJaWYgKGlycWRfaXNfcGVyX2NwdShkYXRhKSkKQEAgLTMwMCwxMSArMjg3LDggQEAKIAkJCQkJICAgIGksIGNwdSk7CiAKIAkJCWNwdW1hc2tfc2V0YWxsKGRhdGEtPmFmZmluaXR5KTsKLQkJCW5ld2NwdSA9IGNwdW1hc2tfYW55X2FuZChkYXRhLT5hZmZpbml0eSwKLQkJCQkJCSBjcHVfb25saW5lX21hc2spOwogCQl9Ci0KLQkJcm91dGVfaXJxKGRhdGEsIGksIG5ld2NwdSk7CisJCWlycV9zZXRfYWZmaW5pdHkoaSwgZGF0YS0+YWZmaW5pdHkpOwogCX0KIH0KICNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWV0YWcva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9tZXRhZy9rZXJuZWwvc2lnbmFsLmMKaW5kZXggM2JlNjFjZi4uYjllNGE4MiAxMDA2NDQKLS0tIGEvYXJjaC9tZXRhZy9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9tZXRhZy9rZXJuZWwvc2lnbmFsLmMKQEAgLTE1MiwxOCArMTUyLDE4IEBACiAJcmV0dXJuICh2b2lkIF9fdXNlciAqKXNwOwogfQogCi1zdGF0aWMgaW50IHNldHVwX3J0X2ZyYW1lKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHNpZ2luZm9fdCAqaW5mbywKLQkJCSAgc2lnc2V0X3QgKnNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IHNldHVwX3J0X2ZyYW1lKHN0cnVjdCBrc2lnbmFsICprc2lnLCBzaWdzZXRfdCAqc2V0LAorCQkJICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZTsKLQlpbnQgZXJyID0gLUVGQVVMVDsKKwlpbnQgZXJyOwogCXVuc2lnbmVkIGxvbmcgY29kZTsKIAotCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLT5SRUdfU1AsIHNpemVvZigqZnJhbWUpKTsKKwlmcmFtZSA9IGdldF9zaWdmcmFtZSgma3NpZy0+a2EsIHJlZ3MtPlJFR19TUCwgc2l6ZW9mKCpmcmFtZSkpOwogCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKLQkJZ290byBvdXQ7CisJCXJldHVybiAtRUZBVUxUOwogCi0JZXJyID0gY29weV9zaWdpbmZvX3RvX3VzZXIoJmZyYW1lLT5pbmZvLCBpbmZvKTsKKwllcnIgPSBjb3B5X3NpZ2luZm9fdG9fdXNlcigmZnJhbWUtPmluZm8sICZrc2lnLT5pbmZvKTsKIAogCS8qIENyZWF0ZSB0aGUgdWNvbnRleHQuICAqLwogCWVyciB8PSBfX3B1dF91c2VyKDAsICZmcmFtZS0+dWMudWNfZmxhZ3MpOwpAQCAtMTc0LDcgKzE3NCw3IEBACiAJZXJyIHw9IF9fY29weV90b191c2VyKCZmcmFtZS0+dWMudWNfc2lnbWFzaywgc2V0LCBzaXplb2YoKnNldCkpOwogCiAJaWYgKGVycikKLQkJZ290byBvdXQ7CisJCXJldHVybiAtRUZBVUxUOwogCiAJLyogU2V0IHVwIHRvIHJldHVybiBmcm9tIHVzZXJzcGFjZS4gICovCiAKQEAgLTE4NywxNSArMTg3LDE1IEBACiAJZXJyIHw9IF9fcHV0X3VzZXIoY29kZSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopKCZmcmFtZS0+cmV0Y29kZVsxXSkpOwogCiAJaWYgKGVycikKLQkJZ290byBvdXQ7CisJCXJldHVybiAtRUZBVUxUOwogCiAJLyogU2V0IHVwIHJlZ2lzdGVycyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KIAlyZWdzLT5SRUdfUlRQID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lLT5yZXRjb2RlOwogCXJlZ3MtPlJFR19TUCA9ICh1bnNpZ25lZCBsb25nKSBmcmFtZSArIHNpemVvZigqZnJhbWUpOwotCXJlZ3MtPlJFR19BUkcxID0gc2lnOworCXJlZ3MtPlJFR19BUkcxID0ga3NpZy0+c2lnOwogCXJlZ3MtPlJFR19BUkcyID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+aW5mbzsKIAlyZWdzLT5SRUdfQVJHMyA9ICh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPnVjOwotCXJlZ3MtPlJFR19QQyA9ICh1bnNpZ25lZCBsb25nKSBrYS0+c2Euc2FfaGFuZGxlcjsKKwlyZWdzLT5SRUdfUEMgPSAodW5zaWduZWQgbG9uZykga3NpZy0+a2Euc2Euc2FfaGFuZGxlcjsKIAogCXByX2RlYnVnKCJTSUcgZGVsaXZlciAoJXM6JWQpOiBzcD0lcCBwYz0lMDh4IHByPSUwOHhcbiIsCiAJCSBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGZyYW1lLCByZWdzLT5SRUdfUEMsCkBAIC0yMDUsMjQgKzIwNSwxOSBAQAogCSAqIGVmZmVjdGl2ZSBjYWNoZSBmbHVzaCAtIGRpcmVjdGVkIHJhdGhlciB0aGFuICdmdWxsIGZsdXNoJy4KIAkgKi8KIAlmbHVzaF9jYWNoZV9zaWd0cmFtcChyZWdzLT5SRUdfUlRQLCBzaXplb2YoZnJhbWUtPnJldGNvZGUpKTsKLW91dDoKLQlpZiAoZXJyKSB7Ci0JCWZvcmNlX3NpZ3NlZ3Yoc2lnLCBjdXJyZW50KTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQorCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGhhbmRsZV9zaWduYWwodW5zaWduZWQgbG9uZyBzaWcsIHNpZ2luZm9fdCAqaW5mbywKLQkJCSAgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBoYW5kbGVfc2lnbmFsKHN0cnVjdCBrc2lnbmFsICprc2lnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzaWdzZXRfdCAqb2xkc2V0ID0gc2lnbWFza190b19zYXZlKCk7CisJaW50IHJldDsKIAogCS8qIFNldCB1cCB0aGUgc3RhY2sgZnJhbWUgKi8KLQlpZiAoc2V0dXBfcnRfZnJhbWUoc2lnLCBrYSwgaW5mbywgb2xkc2V0LCByZWdzKSkKLQkJcmV0dXJuOworCXJldCA9IHNldHVwX3J0X2ZyYW1lKGtzaWcsIG9sZHNldCwgcmVncyk7CiAKLQlzaWduYWxfZGVsaXZlcmVkKHNpZywgaW5mbywga2EsIHJlZ3MsIHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKTsKKwlzaWduYWxfc2V0dXBfZG9uZShyZXQsIGtzaWcsIHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKTsKIH0KIAogIC8qCkBAIC0yMzUsMTAgKzIzMCw4IEBACiBzdGF0aWMgaW50IGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHN5c2NhbGwpCiB7CiAJdW5zaWduZWQgaW50IHJldHZhbCA9IDAsIGNvbnRpbnVlX2FkZHIgPSAwLCByZXN0YXJ0X2FkZHIgPSAwOwotCXN0cnVjdCBrX3NpZ2FjdGlvbiBrYTsKLQlzaWdpbmZvX3QgaW5mbzsKLQlpbnQgc2lnbnI7CiAJaW50IHJlc3RhcnQgPSAwOworCXN0cnVjdCBrc2lnbmFsIGtzaWc7CiAKIAkvKgogCSAqIEJ5IHRoZSBlbmQgb2YgcnRfc2lncmV0dXJuIHRoZSBjb250ZXh0IGRlc2NyaWJlcyB0aGUgcG9pbnQgdGhhdCB0aGUKQEAgLTI3NSw3ICsyNjgsOCBAQAogCSAqIEdldCB0aGUgc2lnbmFsIHRvIGRlbGl2ZXIuIFdoZW4gcnVubmluZyB1bmRlciBwdHJhY2UsIGF0IHRoaXMgcG9pbnQKIAkgKiB0aGUgZGVidWdnZXIgbWF5IGNoYW5nZSBhbGwgb3VyIHJlZ2lzdGVycyAuLi4KIAkgKi8KLQlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKKwlnZXRfc2lnbmFsKCZrc2lnKTsKKwogCS8qCiAJICogRGVwZW5kaW5nIG9uIHRoZSBzaWduYWwgc2V0dGluZ3Mgd2UgbWF5IG5lZWQgdG8gcmV2ZXJ0IHRoZSBkZWNpc2lvbgogCSAqIHRvIHJlc3RhcnQgdGhlIHN5c3RlbSBjYWxsLiBCdXQgc2tpcCB0aGlzIGlmIGEgZGVidWdnZXIgaGFzIGNob3NlbiB0bwpAQCAtMjgzLDE5ICsyNzcsMTkgQEAKIAkgKi8KIAlpZiAocmVncy0+UkVHX1BDICE9IHJlc3RhcnRfYWRkcikKIAkJcmVzdGFydCA9IDA7Ci0JaWYgKHNpZ25yID4gMCkgeworCWlmIChrc2lnLnNpZyA+IDApIHsKIAkJaWYgKHVubGlrZWx5KHJlc3RhcnQpKSB7CiAJCQlpZiAocmV0dmFsID09IC1FUkVTVEFSVE5PSEFORAogCQkJICAgIHx8IHJldHZhbCA9PSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLCiAJCQkgICAgfHwgKHJldHZhbCA9PSAtRVJFU1RBUlRTWVMKLQkJCQkmJiAhKGthLnNhLnNhX2ZsYWdzICYgU0FfUkVTVEFSVCkpKSB7CisJCQkJJiYgIShrc2lnLmthLnNhLnNhX2ZsYWdzICYgU0FfUkVTVEFSVCkpKSB7CiAJCQkJcmVncy0+UkVHX1JFVFZBTCA9IC1FSU5UUjsKIAkJCQlyZWdzLT5SRUdfUEMgPSBjb250aW51ZV9hZGRyOwogCQkJfQogCQl9CiAKIAkJLyogV2hlZSEgQWN0dWFsbHkgZGVsaXZlciB0aGUgc2lnbmFsLiAgKi8KLQkJaGFuZGxlX3NpZ25hbChzaWduciwgJmluZm8sICZrYSwgcmVncyk7CisJCWhhbmRsZV9zaWduYWwoJmtzaWcsIHJlZ3MpOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDFmNTkwYWIuLmM5OGVkOTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSw2ICsxLDcgQEAKIAogZ2VuZXJpYy15ICs9IGJhcnJpZXIuaAogZ2VuZXJpYy15ICs9IGNsa2Rldi5oCitnZW5lcmljLXkgKz0gY3B1dGltZS5oCiBnZW5lcmljLXkgKz0gZXhlYy5oCiBnZW5lcmljLXkgKz0gaGFzaC5oCiBnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9jcHV0aW1lLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vY3B1dGltZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDY4YWQ3Li4wMDAwMDAwCi0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvY3B1dGltZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL3BjaS9wY2ktY29tbW9uLmMgYi9hcmNoL21pY3JvYmxhemUvcGNpL3BjaS1jb21tb24uYwppbmRleCA2NjgwNGFkLi43MDk5NmNjIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvcGNpL3BjaS1jb21tb24uYworKysgYi9hcmNoL21pY3JvYmxhemUvcGNpL3BjaS1jb21tb24uYwpAQCAtMTI5NCwxMSArMTI5NCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwY2liaW9zX2ZpbmlzaF9hZGRpbmdfdG9fYnVzKTsKIAotaW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKLXsKLQlyZXR1cm4gcGNpX2VuYWJsZV9yZXNvdXJjZXMoZGV2LCBtYXNrKTsKLX0KLQogc3RhdGljIHZvaWQgcGNpYmlvc19zZXR1cF9waGJfcmVzb3VyY2VzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKIAkJCQkJc3RydWN0IGxpc3RfaGVhZCAqcmVzb3VyY2VzKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL0tjb25maWcgYi9hcmNoL21pcHMvS2NvbmZpZwppbmRleCA5NWZhMWYxLi5jYjFkYTM3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvS2NvbmZpZworKysgYi9hcmNoL21pcHMvS2NvbmZpZwpAQCAtNjcsOCArNjcsNiBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTgogCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgogCXNlbGVjdCBTWVNfU1VQUE9SVFNfWkJPT1QKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKIAogY29uZmlnIEFSNwogCWJvb2wgIlRleGFzIEluc3RydW1lbnRzIEFSNyIKQEAgLTM2MCw3ICszNTgsNiBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCXNlbGVjdCBTWVNfU1VQUE9SVFNfU01BUlRNSVBTCiAJc2VsZWN0IFNZU19TVVBQT1JUU19NSUNST01JUFMKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKIAlzZWxlY3QgVVNCX0VIQ0lfQklHX0VORElBTl9ERVNDCiAJc2VsZWN0IFVTQl9FSENJX0JJR19FTkRJQU5fTU1JTwogCXNlbGVjdCBVU0VfT0YKQEAgLTcxOCw4ICs3MTUsNiBAQAogCXNlbGVjdCBTV0FQX0lPX1NQQUNFCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgWk9ORV9ETUEzMgotCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCXNlbGVjdCBIT0xFU19JTl9aT05FCiAJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCiAJaGVscApAQCAtNzU2LDggKzc1MSw2IEBACiAJc2VsZWN0IFpPTkVfRE1BMzIgaWYgNjRCSVQKIAlzZWxlY3QgU1lOQ19SNEsKIAlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kgaWYgVVNCX1NVUFBPUlQKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kgaWYgVVNCX1NVUFBPUlQKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX1pCT09UCiAJc2VsZWN0IFNZU19TVVBQT1JUU19aQk9PVF9VQVJUMTY1NTAKIAloZWxwCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXRoNzkvS2NvbmZpZyBiL2FyY2gvbWlwcy9hdGg3OS9LY29uZmlnCmluZGV4IDM5OTVlMzEuLmRmYzYwMjAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hdGg3OS9LY29uZmlnCisrKyBiL2FyY2gvbWlwcy9hdGg3OS9LY29uZmlnCkBAIC03NCwzNCArNzQsMjYgQEAKIGVuZG1lbnUKIAogY29uZmlnIFNPQ19BUjcxWFgKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKIAlzZWxlY3QgSFdfSEFTX1BDSQogCWRlZl9ib29sIG4KIAogY29uZmlnIFNPQ19BUjcyNFgKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBQQ0lfQVI3MjRYIGlmIFBDSQogCWRlZl9ib29sIG4KIAogY29uZmlnIFNPQ19BUjkxM1gKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKIAlkZWZfYm9vbCBuCiAKIGNvbmZpZyBTT0NfQVI5MzNYCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCiAJZGVmX2Jvb2wgbgogCiBjb25maWcgU09DX0FSOTM0WAotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCXNlbGVjdCBIV19IQVNfUENJCiAJc2VsZWN0IFBDSV9BUjcyNFggaWYgUENJCiAJZGVmX2Jvb2wgbgogCiBjb25maWcgU09DX1FDQTk1NVgKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBQQ0lfQVI3MjRYIGlmIFBDSQogCWRlZl9ib29sIG4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc210Yy5jIGIvYXJjaC9taXBzL2tlcm5lbC9zbXRjLmMKaW5kZXggZGZjMWI5MS4uYzE2ODFkNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zbXRjLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXRjLmMKQEAgLTEwMDcsNyArMTAwNyw3IEBACiAJaW50IGlycSA9IE1JUFNfQ1BVX0lSUV9CQVNFICsgMTsKIAogCWlycV9lbnRlcigpOwotCWtzdGF0X2luY3JfaXJxc190aGlzX2NwdShpcnEsIGlycV90b19kZXNjKGlycSkpOworCWtzdGF0X2luY3JfaXJxX3RoaXNfY3B1KGlycSk7CiAJY2QgPSAmcGVyX2NwdShtaXBzX2Nsb2NrZXZlbnRfZGV2aWNlLCBjcHUpOwogCWNkLT5ldmVudF9oYW5kbGVyKGNkKTsKIAlpcnFfZXhpdCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3JhbGluay9LY29uZmlnIGIvYXJjaC9taXBzL3JhbGluay9LY29uZmlnCmluZGV4IDFiZmQxYzEuLjRhMjk2NjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9yYWxpbmsvS2NvbmZpZworKysgYi9hcmNoL21pcHMvcmFsaW5rL0tjb25maWcKQEAgLTIwLDE5ICsyMCwxMyBAQAogCWNvbmZpZyBTT0NfUlQzMDVYCiAJCWJvb2wgIlJUMzA1eCIKIAkJc2VsZWN0IFVTQl9BUkNIX0hBU19IQ0QKLQkJc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCi0JCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCiAJY29uZmlnIFNPQ19SVDM4ODMKIAkJYm9vbCAiUlQzODgzIgotCQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKLQkJc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCiAJCXNlbGVjdCBIV19IQVNfUENJCiAKIAljb25maWcgU09DX01UNzYyMAogCQlib29sICJNVDc2MjAiCi0JCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQotCQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKIAogZW5kY2hvaWNlCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLWludC5jIGIvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItaW50LmMKaW5kZXggM2RiNjRkNS4uNThiNDBhZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItaW50LmMKKysrIGIvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItaW50LmMKQEAgLTE0OCw3ICsxNDgsNyBAQAogCWludCBpcnEgPSBTR0lfQlVTRVJSX0lSUTsKIAogCWlycV9lbnRlcigpOwotCWtzdGF0X2luY3JfaXJxc190aGlzX2NwdShpcnEsIGlycV90b19kZXNjKGlycSkpOworCWtzdGF0X2luY3JfaXJxX3RoaXNfY3B1KGlycSk7CiAJaXAyMl9iZV9pbnRlcnJ1cHQoaXJxKTsKIAlpcnFfZXhpdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItdGltZS5jIGIvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItdGltZS5jCmluZGV4IDYwNzE5MjQuLjA0NWFhODkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLXRpbWUuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi10aW1lLmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogCWNoYXIgYzsKIAogCWlycV9lbnRlcigpOwotCWtzdGF0X2luY3JfaXJxc190aGlzX2NwdShpcnEsIGlycV90b19kZXNjKGlycSkpOworCWtzdGF0X2luY3JfaXJxX3RoaXNfY3B1KGlycSk7CiAJcHJpbnRrKEtFUk5fQUxFUlQgIk9vcHMsIGdvdCA4MjU0IGludGVycnVwdC5cbiIpOwogCUFyY1JlYWQoMCwgJmMsIDEsICZjbnQpOwogCUFyY0VudGVySW50ZXJhY3RpdmVNb2RlKCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvaXJxLmMgYi9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvaXJxLmMKaW5kZXggMDlkNmUxNi4uNTljZmUyNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL2lycS5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9pcnEuYwpAQCAtOTUsNyArOTUsNyBAQAogCXU2NCBjdXJfaW50czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaSA9IGNwdW1hc2tfZmlyc3QobWFzayk7CisJaSA9IGNwdW1hc2tfZmlyc3RfYW5kKG1hc2ssIGNwdV9vbmxpbmVfbWFzayk7CiAKIAkvKiBDb252ZXJ0IGxvZ2ljYWwgQ1BVIHRvIHBoeXNpY2FsIENQVSAqLwogCWNwdSA9IGNwdV9sb2dpY2FsX21hcChpKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9zbXAuYyBiL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9zbXAuYwppbmRleCA1NGUyYzRkLi43MGQ5MTgyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvc21wLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NtcC5jCkBAIC0xODIsNyArMTgyLDcgQEAKIAlpbnQgaXJxID0gS19CQ00xNDgwX0lOVF9NQk9YXzBfMDsKIAl1bnNpZ25lZCBpbnQgYWN0aW9uOwogCi0Ja3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgaXJxX3RvX2Rlc2MoaXJxKSk7CisJa3N0YXRfaW5jcl9pcnFfdGhpc19jcHUoaXJxKTsKIAkvKiBMb2FkIHRoZSBtYWlsYm94IHJlZ2lzdGVyIHRvIGZpZ3VyZSBvdXQgd2hhdCB3ZSdyZSBzdXBwb3NlZCB0byBkbyAqLwogCWFjdGlvbiA9IChfX3Jhd19yZWFkcShtYWlsYm94XzBfcmVnc1tjcHVdKSA+PiA0OCkgJiAweGZmZmY7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2lycS5jIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvaXJxLmMKaW5kZXggZmNhMGNkYi4uNmQ4ZGJhNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvaXJxLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvaXJxLmMKQEAgLTg4LDcgKzg4LDcgQEAKIAl1NjQgY3VyX2ludHM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWkgPSBjcHVtYXNrX2ZpcnN0KG1hc2spOworCWkgPSBjcHVtYXNrX2ZpcnN0X2FuZChtYXNrLCBjcHVfb25saW5lX21hc2spOwogCiAJLyogQ29udmVydCBsb2dpY2FsIENQVSB0byBwaHlzaWNhbCBDUFUgKi8KIAljcHUgPSBjcHVfbG9naWNhbF9tYXAoaSk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zbXAuYyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL3NtcC5jCmluZGV4IGQ3Yjk0MmQuLmRiOTc2MTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL3NtcC5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL3NtcC5jCkBAIC0xNzAsNyArMTcwLDcgQEAKIAlpbnQgaXJxID0gS19JTlRfTUJPWF8wOwogCXVuc2lnbmVkIGludCBhY3Rpb247CiAKLQlrc3RhdF9pbmNyX2lycXNfdGhpc19jcHUoaXJxLCBpcnFfdG9fZGVzYyhpcnEpKTsKKwlrc3RhdF9pbmNyX2lycV90aGlzX2NwdShpcnEpOwogCS8qIExvYWQgdGhlIG1haWxib3ggcmVnaXN0ZXIgdG8gZmlndXJlIG91dCB3aGF0IHdlJ3JlIHN1cHBvc2VkIHRvIGRvICovCiAJYWN0aW9uID0gKF9fX19yYXdfcmVhZHEobWFpbGJveF9yZWdzW2NwdV0pID4+IDQ4KSAmIDB4ZmZmZjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggY2JjNmI5Yi4uNjU0ZDViYSAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDYgKzEsNyBAQAogCiBnZW5lcmljLXkgKz0gYmFycmllci5oCiBnZW5lcmljLXkgKz0gY2xrZGV2LmgKK2dlbmVyaWMteSArPSBjcHV0aW1lLmgKIGdlbmVyaWMteSArPSBleGVjLmgKIGdlbmVyaWMteSArPSBoYXNoLmgKIGdlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaApkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL2NwdXRpbWUuaCBiL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNjhhZDcuLjAwMDAwMDAKLS0tIGEvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL2NwdXRpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jcHV0aW1lLmg+CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL2NldnQtbW4xMDMwMC5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9jZXZ0LW1uMTAzMDAuYwppbmRleCBjY2NlMzVlLi42MGY2NGNhIDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAva2VybmVsL2NldnQtbW4xMDMwMC5jCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvY2V2dC1tbjEwMzAwLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCWNkLT5zZXRfbmV4dF9ldmVudAk9IG5leHRfZXZlbnQ7CiAKIAlpYWN0ID0gJnBlcl9jcHUodGltZXJfaXJxLCBjcHUpOwotCWlhY3QtPmZsYWdzID0gSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVEIHwgSVJRRl9USU1FUjsKKwlpYWN0LT5mbGFncyA9IElSUUZfU0hBUkVEIHwgSVJRRl9USU1FUjsKIAlpYWN0LT5oYW5kbGVyID0gdGltZXJfaW50ZXJydXB0OwogCiAJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKGNkKTsKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvbW4xMDMwMC1zZXJpYWwuYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvbW4xMDMwMC1zZXJpYWwuYwppbmRleCBiZjZlOTQ5Li43ZWNmNjk4IDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAva2VybmVsL21uMTAzMDAtc2VyaWFsLmMKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwLXNlcmlhbC5jCkBAIC05ODUsMTcgKzk4NSwxNyBAQAogCWlycV9zZXRfY2hpcChwb3J0LT50bV9pcnEsICZtbjEwMzAwX3NlcmlhbF9waWMpOwogCiAJaWYgKHJlcXVlc3RfaXJxKHBvcnQtPnJ4X2lycSwgbW4xMDMwMF9zZXJpYWxfaW50ZXJydXB0LAotCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfTk9CQUxBTkNJTkcsCisJCQlJUlFGX05PQkFMQU5DSU5HLAogCQkJcG9ydC0+cnhfbmFtZSwgcG9ydCkgPCAwKQogCQlnb3RvIGVycm9yOwogCiAJaWYgKHJlcXVlc3RfaXJxKHBvcnQtPnR4X2lycSwgbW4xMDMwMF9zZXJpYWxfaW50ZXJydXB0LAotCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfTk9CQUxBTkNJTkcsCisJCQlJUlFGX05PQkFMQU5DSU5HLAogCQkJcG9ydC0+dHhfbmFtZSwgcG9ydCkgPCAwKQogCQlnb3RvIGVycm9yMjsKIAogCWlmIChyZXF1ZXN0X2lycShwb3J0LT50bV9pcnEsIG1uMTAzMDBfc2VyaWFsX2ludGVycnVwdCwKLQkJCUlSUUZfRElTQUJMRUQgfCBJUlFGX05PQkFMQU5DSU5HLAorCQkJSVJRRl9OT0JBTEFOQ0lORywKIAkJCXBvcnQtPnRtX25hbWUsIHBvcnQpIDwgMCkKIAkJZ290byBlcnJvcjM7CiAJbW4xMDMwMF9zZXJpYWxfbWFza19hY2socG9ydC0+dG1faXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvbW4xMDMwMC13YXRjaGRvZy5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwLXdhdGNoZG9nLmMKaW5kZXggZGI2NGE3MS4uYTJkOGU2OSAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwLXdhdGNoZG9nLmMKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwLXdhdGNoZG9nLmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogCU5NSUNSID0gTk1JQ1JfV0RJRjsKIAogCW5taV9jb3VudChzbXBfcHJvY2Vzc29yX2lkKCkpKys7Ci0Ja3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgaXJxX3RvX2Rlc2MoaXJxKSk7CisJa3N0YXRfaW5jcl9pcnFfdGhpc19jcHUoaXJxKTsKIAogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvc21wLmMgYi9hcmNoL21uMTAzMDAva2VybmVsL3NtcC5jCmluZGV4IGExN2Y5YzkuLmY5ODQxOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9zbXAuYwpAQCAtMTQzLDcgKzE0Myw3IEBACiBzdGF0aWMgaXJxcmV0dXJuX3Qgc21wX2lwaV90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGxvY2FsX3RpbWVyX2lwaSA9IHsKIAkuaGFuZGxlcgk9IHNtcF9pcGlfdGltZXJfaW50ZXJydXB0LAotCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9OT0JBTEFOQ0lORywKKwkuZmxhZ3MJCT0gSVJRRl9OT0JBTEFOQ0lORywKIAkubmFtZQkJPSAic21wIGxvY2FsIHRpbWVyIElQSSIKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzNjQvaXJxLWZwZ2EuYyBiL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzNjQvaXJxLWZwZ2EuYwppbmRleCBlMTZjMjE2Li4wNzNlMmNjIDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzY0L2lycS1mcGdhLmMKKysrIGIvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjM2NC9pcnEtZnBnYS5jCkBAIC03Niw3ICs3Niw3IEBACiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBmcGdhX2lycVtdICA9IHsKIAlbMF0gPSB7CiAJCS5oYW5kbGVyCT0gZnBnYV9pbnRlcnJ1cHQsCi0JCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisJCS5mbGFncwkJPSBJUlFGX1NIQVJFRCwKIAkJLm5hbWUJCT0gImZwZ2EiLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2lycS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL2lycS5jCmluZGV4IDhjZWFjNDcuLmNmZTA1NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvaXJxLmMKQEAgLTExNyw3ICsxMTcsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIHdoYXRldmVyIG1hc2sgdGhleSBzZXQsIHdlIGp1c3QgYWxsb3cgb25lIENQVSAqLwotCWNwdV9kZXN0ID0gZmlyc3RfY3B1KCpkZXN0KTsKKwljcHVfZGVzdCA9IGNwdW1hc2tfZmlyc3RfYW5kKGRlc3QsIGNwdV9vbmxpbmVfbWFzayk7CiAKIAlyZXR1cm4gY3B1X2Rlc3Q7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCmluZGV4IDk1N2JmMzQuLmI5ZmNlY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCkBAIC03MzYsMTAgKzczNiw2IEBACiAJICBjb250cm9sbGVyLiAgQWxzbyBjb250YWlucyBzb21lIGNvbW1vbiBjb2RlIHVzZWQgYnkKIAkgIGRyaXZlcnMgZm9yIHNwZWNpZmljIGxvY2FsIGJ1cyBwZXJpcGhlcmFscy4KIAotY29uZmlnIEZTTF9JRkMKLQlib29sCi0gICAgICAgIGRlcGVuZHMgb24gRlNMX1NPQwotCiBjb25maWcgRlNMX0dUTQogCWJvb2wKIAlkZXBlbmRzIG9uIFBQQ184M3h4IHx8IFFVSUNDX0VOR0lORSB8fCBDUE0yCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2VlaF9kcml2ZXIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZWVoX2RyaXZlci5jCmluZGV4IGZkYzY3OWQuLmJiNjFjYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZWVoX2RyaXZlci5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZWVoX2RyaXZlci5jCkBAIC0xNDMsMTMgKzE0MywzMCBAQAogc3RhdGljIHZvaWQgZWVoX2VuYWJsZV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgZWVoX2RldiAqZWRldiA9IHBjaV9kZXZfdG9fZWVoX2RldihkZXYpOwotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAogCWlmICgoZWRldi0+bW9kZSkgJiBFRUhfREVWX0lSUV9ESVNBQkxFRCkgewogCQllZGV2LT5tb2RlICY9IH5FRUhfREVWX0lSUV9ESVNBQkxFRDsKLQotCQlkZXNjID0gaXJxX3RvX2Rlc2MoZGV2LT5pcnEpOwotCQlpZiAoZGVzYyAmJiBkZXNjLT5kZXB0aCA+IDApCisJCS8qCisJCSAqIEZJWE1FICEhISEhCisJCSAqCisJCSAqIFRoaXMgaXMganVzdCBhc3MgYmFja3dhcmRzLiBUaGlzIG1hemUgaGFzCisJCSAqIHVuYmFsYW5jZWQgaXJxX2VuYWJsZS9kaXNhYmxlIGNhbGxzLiBTbyBpbnN0ZWFkIG9mCisJCSAqIGZpbmRpbmcgdGhlIHJvb3QgY2F1c2UgaXQgd29ya3MgYXJvdW5kIHRoZSB3YXJuaW5nCisJCSAqIGluIHRoZSBpcnFfZW5hYmxlIGNvZGUgYnkgY29uZGl0aW9uYWxseSBjYWxsaW5nCisJCSAqIGludG8gaXQuCisJCSAqCisJCSAqIFRoYXQncyBqdXN0IHdyb25nLlRoZSB3YXJuaW5nIGluIHRoZSBjb3JlIGNvZGUgaXMKKwkJICogdGhlcmUgdG8gdGVsbCBwZW9wbGUgdG8gZml4IHRoZWlyIGFzc3ltZXRyaWVzIGluCisJCSAqIHRoZWlyIG93biBjb2RlLCBub3QgYnkgYWJ1c2luZyB0aGUgY29yZSBpbmZvcm1hdGlvbgorCQkgKiB0byBhdm9pZCBpdC4KKwkJICoKKwkJICogSSBzbyB3aXNoIHRoYXQgdGhlIGFzc3ltZXRyeSB3b3VsZCBiZSB0aGUgb3RoZXIgd2F5CisJCSAqIHJvdW5kIGFuZCBhIGZldyBtb3JlIGlycV9kaXNhYmxlIGNhbGxzIHJlbmRlciB0aGF0CisJCSAqIHNoaXQgdW51c2FibGUgZm9yZXZlci4KKwkJICoKKwkJICoJdGdseAorCQkgKi8KKwkJaWYgKGlycWRfaXJxX2Rpc2FibGVkKGlycV9nZXRfaXJxX2RhdGEoZGV2LT5pcnEpKSkKIAkJCWVuYWJsZV9pcnEoZGV2LT5pcnEpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCmluZGV4IDFkMDg0OGIuLmNhMWNkNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYwpAQCAtNDY1LDcgKzQ2NSw2IEBACiAKIHZvaWQgX19kb19pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjOwogCXVuc2lnbmVkIGludCBpcnE7CiAKIAlpcnFfZW50ZXIoKTsKQEAgLTQ4NywxMSArNDg2LDggQEAKIAkvKiBBbmQgZmluYWxseSBwcm9jZXNzIGl0ICovCiAJaWYgKHVubGlrZWx5KGlycSA9PSBOT19JUlEpKQogCQlfX2dldF9jcHVfdmFyKGlycV9zdGF0KS5zcHVyaW91c19pcnFzKys7Ci0JZWxzZSB7Ci0JCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwotCQlpZiAobGlrZWx5KGRlc2MpKQotCQkJZGVzYy0+aGFuZGxlX2lycShpcnEsIGRlc2MpOwotCX0KKwllbHNlCisJCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOwogCiAJdHJhY2VfaXJxX2V4aXQocmVncyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCmluZGV4IGE5ZTMxMWYuLjJhNDc3OTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYwpAQCAtMjA4LDcgKzIwOCw2IEBACiAJCQkgIHVuc2lnbmVkIGxvbmcgaW5fZGV2Zm4pCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlOwotCXN0cnVjdCBsaXN0X2hlYWQgKmxuOwogCXN0cnVjdCBwY2lfYnVzICpidXMgPSBOVUxMOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaG9zZV9ub2RlOwogCkBAIC0yMzAsOCArMjI5LDcgQEAKIAkgKiB1c2VkIG9uIHByZS1kb21haW5zIHNldHVwLiBXZSByZXR1cm4gdGhlIGZpcnN0IG1hdGNoCiAJICovCiAKLQlmb3IgKGxuID0gcGNpX3Jvb3RfYnVzZXMubmV4dDsgbG4gIT0gJnBjaV9yb290X2J1c2VzOyBsbiA9IGxuLT5uZXh0KSB7Ci0JCWJ1cyA9IHBjaV9idXNfYihsbik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShidXMsICZwY2lfcm9vdF9idXNlcywgbm9kZSkgewogCQlpZiAoaW5fYnVzID49IGJ1cy0+bnVtYmVyICYmIGluX2J1cyA8PSBidXMtPmJ1c25fcmVzLmVuZCkKIAkJCWJyZWFrOwogCQlidXMgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX2NlbGwuYyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9jZWxsLmMKaW5kZXggMWYwZWJkZS4uODYzZDg5MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX2NlbGwuYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfY2VsbC5jCkBAIC0xMTIxLDggKzExMjEsNyBAQAogCWludCByZXQgPSAwOwogCXN0cnVjdCBjcHVmcmVxX2ZyZXFzICpmcnEgPSBkYXRhOwogCWlmICgodmFsID09IENQVUZSRVFfUFJFQ0hBTkdFICYmIGZycS0+b2xkIDwgZnJxLT5uZXcpIHx8Ci0JICAgICh2YWwgPT0gQ1BVRlJFUV9QT1NUQ0hBTkdFICYmIGZycS0+b2xkID4gZnJxLT5uZXcpIHx8Ci0JICAgICh2YWwgPT0gQ1BVRlJFUV9SRVNVTUVDSEFOR0UgfHwgdmFsID09IENQVUZSRVFfU1VTUEVORENIQU5HRSkpCisJICAgICh2YWwgPT0gQ1BVRlJFUV9QT1NUQ0hBTkdFICYmIGZycS0+b2xkID4gZnJxLT5uZXcpKQogCQlzZXRfc3B1X3Byb2ZpbGluZ19mcmVxdWVuY3koZnJxLT5uZXcsIHNwdV9jeWNsZV9yZXNldCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9LY29uZmlnCmluZGV4IGQ2Yzc1MDYuLmRjMWEyNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvS2NvbmZpZwpAQCAtMjY1LDcgKzI2NSw2IEBACiAJc2VsZWN0IFBQQ19GUFUKIAlzZWxlY3QgSUJNNDQwRVBfRVJSNDIKIAlzZWxlY3QgSUJNX0VNQUNfWk1JSQotCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQogCiBjb25maWcgNDQwRVBYCiAJYm9vbApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL0tjb25maWcKaW5kZXggZTg3YzE5NC4uNTZmMjc0MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnCkBAIC0yLDEwICsyLDggQEAKIAlib29sICJTb255IFBTMyIKIAlkZXBlbmRzIG9uIFBQQzY0ICYmIFBQQ19CT09LM1MKIAlzZWxlY3QgUFBDX0NFTEwKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKIAlzZWxlY3QgVVNCX09IQ0lfTElUVExFX0VORElBTgogCXNlbGVjdCBVU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8KLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKIAlzZWxlY3QgVVNCX0VIQ0lfQklHX0VORElBTl9NTUlPCiAJc2VsZWN0IFBQQ19QQ0lfQ0hPSUNFCiAJaGVscApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jCmluZGV4IGVmZTYxMzcuLjIwM2NiZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMKQEAgLTM3LDE1ICszNywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9ub2RlICpkbikKIHsKIAlzdHJ1Y3QgcGNpX2J1cyAqY2hpbGQgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlzdHJ1Y3QgcGNpX2J1cyAqdG1wOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqYnVzZG47CiAKIAlidXNkbiA9IHBjaV9idXNfdG9fT0Zfbm9kZShidXMpOwogCWlmIChidXNkbiA9PSBkbikKIAkJcmV0dXJuIGJ1czsKIAotCWxpc3RfZm9yX2VhY2godG1wLCAmYnVzLT5jaGlsZHJlbikgewotCQljaGlsZCA9IGZpbmRfYnVzX2Ftb25nX2NoaWxkcmVuKHBjaV9idXNfYih0bXApLCBkbik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZidXMtPmNoaWxkcmVuLCBub2RlKSB7CisJCWNoaWxkID0gZmluZF9idXNfYW1vbmdfY2hpbGRyZW4odG1wLCBkbik7CiAJCWlmIChjaGlsZCkKIAkJCWJyZWFrOwogCX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQppbmRleCBmNjdhYzkwLi5hZmJjYzM3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKQEAgLTIxLDcgKzIxLDYgQEAKIG9iai0kKENPTkZJR19GU0xfUENJKQkJKz0gZnNsX3BjaS5vICQoZnNsLW1zaS1vYmoteSkKIG9iai0kKENPTkZJR19GU0xfUE1DKQkJKz0gZnNsX3BtYy5vCiBvYmotJChDT05GSUdfRlNMX0xCQykJCSs9IGZzbF9sYmMubwotb2JqLSQoQ09ORklHX0ZTTF9JRkMpCQkrPSBmc2xfaWZjLm8KIG9iai0kKENPTkZJR19GU0xfR1RNKQkJKz0gZnNsX2d0bS5vCiBvYmotJChDT05GSUdfRlNMXzg1WFhfQ0FDSEVfU1JBTSkJKz0gZnNsXzg1eHhfbDJjdGxyLm8gZnNsXzg1eHhfY2FjaGVfc3JhbS5vCiBvYmotJChDT05GSUdfU0lNUExFX0dQSU8pCSs9IHNpbXBsZV9ncGlvLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZWh2X3BpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9laHZfcGljLmMKaW5kZXggYjc0MDg1Yy4uMmQyMGYxMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9laHZfcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9laHZfcGljLmMKQEAgLTI4LDggKzI4LDYgQEAKICNpbmNsdWRlIDxhc20vZWh2X3BpYy5oPgogI2luY2x1ZGUgPGFzbS9mc2xfaGNhbGxzLmg+CiAKLSNpbmNsdWRlICIuLi8uLi8uLi9rZXJuZWwvaXJxL3NldHRpbmdzLmgiCi0KIHN0YXRpYyBzdHJ1Y3QgZWh2X3BpYyAqZ2xvYmFsX2Vodl9waWM7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGVodl9waWNfbG9jayk7CiAKQEAgLTExMywxNyArMTExLDEzIEBACiBpbnQgZWh2X3BpY19zZXRfaXJxX3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgZmxvd190eXBlKQogewogCXVuc2lnbmVkIGludCBzcmMgPSB2aXJxX3RvX2h3KGQtPmlycSk7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoZC0+aXJxKTsKIAl1bnNpZ25lZCBpbnQgdmVjcHJpLCB2b2xkLCB2bmV3LCBwcmlvLCBjcHVfZGVzdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGZsb3dfdHlwZSA9PSBJUlFfVFlQRV9OT05FKQogCQlmbG93X3R5cGUgPSBJUlFfVFlQRV9MRVZFTF9MT1c7CiAKLQlpcnFfc2V0dGluZ3NfY2xyX2xldmVsKGRlc2MpOwotCWlycV9zZXR0aW5nc19zZXRfdHJpZ2dlcl9tYXNrKGRlc2MsIGZsb3dfdHlwZSk7Ci0JaWYgKGZsb3dfdHlwZSAmIChJUlFfVFlQRV9MRVZFTF9ISUdIIHwgSVJRX1RZUEVfTEVWRUxfTE9XKSkKLQkJaXJxX3NldHRpbmdzX3NldF9sZXZlbChkZXNjKTsKKwlpcnFkX3NldF90cmlnZ2VyX3R5cGUoZCwgZmxvd190eXBlKTsKIAogCXZlY3ByaSA9IGVodl9waWNfdHlwZV90b192ZWNwcmkoZmxvd190eXBlKTsKIApAQCAtMTQ0LDcgKzEzOCw3IEBACiAJZXZfaW50X3NldF9jb25maWcoc3JjLCB2ZWNwcmksIHByaW8sIGNwdV9kZXN0KTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVodl9waWNfbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOworCXJldHVybiBJUlFfU0VUX01BU0tfT0tfTk9DT1BZOwogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGVodl9waWNfaXJxX2NoaXAgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2N3Z3JvdXAuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jY3dncm91cC5oCmluZGV4IDIzNzIzY2UuLjZlNjcwZjggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jY3dncm91cC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jY3dncm91cC5oCkBAIC0yMyw2ICsyMyw3IEBACiAJdW5zaWduZWQgaW50IGNvdW50OwogCXN0cnVjdCBkZXZpY2UJZGV2OwogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2WzBdOworCXN0cnVjdCB3b3JrX3N0cnVjdCB1bmdyb3VwX3dvcms7CiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvaXJxLmMgYi9hcmNoL3MzOTAva2VybmVsL2lycS5jCmluZGV4IGJiMjdhMjYuLmE3NzBiZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9pcnEuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgogI2luY2x1ZGUgPGFzbS9jcHV0aW1lLmg+CiAjaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9wY2kvcGNpLmMgYi9hcmNoL3MzOTAvcGNpL3BjaS5jCmluZGV4IDY2NjcwZmYuLjFkZjFkMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9wY2kvcGNpLmMKKysrIGIvYXJjaC9zMzkwL3BjaS9wY2kuYwpAQCAtNjg2LDI3ICs2ODYsMTMgQEAKIGludCBwY2liaW9zX2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBtYXNrKQogewogCXN0cnVjdCB6cGNpX2RldiAqemRldiA9IGdldF96ZGV2KHBkZXYpOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCXUxNiBjbWQ7Ci0JaW50IGk7CiAKIAl6ZGV2LT5wZGV2ID0gcGRldjsKIAl6cGNpX2RlYnVnX2luaXRfZGV2aWNlKHpkZXYpOwogCXpwY2lfZm1iX2VuYWJsZV9kZXZpY2UoemRldik7CiAJenBjaV9tYXBfcmVzb3VyY2VzKHpkZXYpOwogCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwotCWZvciAoaSA9IDA7IGkgPCBQQ0lfQkFSX0NPVU5UOyBpKyspIHsKLQkJcmVzID0gJnBkZXYtPnJlc291cmNlW2ldOwotCi0JCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCi0JCQljbWQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOwotCX0KLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIGNtZCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHBjaV9lbmFibGVfcmVzb3VyY2VzKHBkZXYsIG1hc2spOwogfQogCiB2b2lkIHBjaWJpb3NfZGlzYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvcGNpL3BjaV9zeXNmcy5jIGIvYXJjaC9zMzkwL3BjaS9wY2lfc3lzZnMuYwppbmRleCBjZjhhMTJmLi5hYjRhOTEzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvcGNpL3BjaV9zeXNmcy5jCisrKyBiL2FyY2gvczM5MC9wY2kvcGNpX3N5c2ZzLmMKQEAgLTQ4LDI5ICs0OCwyNyBAQAogfQogc3RhdGljIERFVklDRV9BVFRSKHBmZ2lkLCBTX0lSVUdPLCBzaG93X3BmZ2lkLCBOVUxMKTsKIAotc3RhdGljIHZvaWQgcmVjb3Zlcl9jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgc3NpemVfdCBzdG9yZV9yZWNvdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwogCXN0cnVjdCB6cGNpX2RldiAqemRldiA9IGdldF96ZGV2KHBkZXYpOwogCWludCByZXQ7CiAKKwlpZiAoIWRldmljZV9yZW1vdmVfZmlsZV9zZWxmKGRldiwgYXR0cikpCisJCXJldHVybiBjb3VudDsKKwogCXBjaV9zdG9wX2FuZF9yZW1vdmVfYnVzX2RldmljZShwZGV2KTsKIAlyZXQgPSB6cGNpX2Rpc2FibGVfZGV2aWNlKHpkZXYpOwogCWlmIChyZXQpCi0JCXJldHVybjsKKwkJcmV0dXJuIHJldDsKIAogCXJldCA9IHpwY2lfZW5hYmxlX2RldmljZSh6ZGV2KTsKIAlpZiAocmV0KQotCQlyZXR1cm47CisJCXJldHVybiByZXQ7CiAKIAlwY2lfcmVzY2FuX2J1cyh6ZGV2LT5idXMpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9yZWNvdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCWludCByYyA9IGRldmljZV9zY2hlZHVsZV9jYWxsYmFjayhkZXYsIHJlY292ZXJfY2FsbGJhY2spOwotCXJldHVybiByYyA/IHJjIDogY291bnQ7CisJcmV0dXJuIGNvdW50OwogfQogc3RhdGljIERFVklDRV9BVFRSKHJlY292ZXIsIFNfSVdVU1IsIE5VTEwsIHN0b3JlX3JlY292ZXIpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Njb3JlL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvc2NvcmUvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDQ2MzBjZjIuLjJmOTQ3YWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2NvcmUvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvc2NvcmUvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC00LDYgKzQsNyBAQAogCiBnZW5lcmljLXkgKz0gYmFycmllci5oCiBnZW5lcmljLXkgKz0gY2xrZGV2LmgKK2dlbmVyaWMteSArPSBjcHV0aW1lLmgKIGdlbmVyaWMteSArPSBoYXNoLmgKIGdlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAogZ2VuZXJpYy15ICs9IHByZWVtcHQuaApkaWZmIC0tZ2l0IGEvYXJjaC9zY29yZS9pbmNsdWRlL2FzbS9jcHV0aW1lLmggYi9hcmNoL3Njb3JlL2luY2x1ZGUvYXNtL2NwdXRpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZjZWQ5OS4uMDAwMDAwMAotLS0gYS9hcmNoL3Njb3JlL2luY2x1ZGUvYXNtL2NwdXRpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfQVNNX1NDT1JFX0NQVVRJTUVfSAotI2RlZmluZSBfQVNNX1NDT1JFX0NQVVRJTUVfSAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvY3B1dGltZS5oPgotCi0jZW5kaWYgLyogX0FTTV9TQ09SRV9DUFVUSU1FX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZyBiL2FyY2gvc2gvS2NvbmZpZwppbmRleCA2MzU3NzEwLi4xMzk5MzgzIDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcKKysrIGIvYXJjaC9zaC9LY29uZmlnCkBAIC0xMjMsMTUgKzEyMyw2IEBACiBjb25maWcgU1lTX1NVUFBPUlRTX1BDSQogCWJvb2wKIAotY29uZmlnIFNZU19TVVBQT1JUU19DTVQKLQlib29sCi0KLWNvbmZpZyBTWVNfU1VQUE9SVFNfTVRVMgotCWJvb2wKLQotY29uZmlnIFNZU19TVVBQT1JUU19UTVUKLQlib29sCi0KIGNvbmZpZyBTVEFDS1RSQUNFX1NVUFBPUlQKIAlkZWZfYm9vbCB5CiAKQEAgLTE5MSwxNCArMTgyLDE0IEBACiAJYm9vbAogCXNlbGVjdCBDUFVfSEFTX0lOVEVWVAogCXNlbGVjdCBDUFVfSEFTX1NSX1JCCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19UTVUKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX1RNVQogCiBjb25maWcgQ1BVX1NINAogCWJvb2wKIAlzZWxlY3QgQ1BVX0hBU19JTlRFVlQKIAlzZWxlY3QgQ1BVX0hBU19TUl9SQgogCXNlbGVjdCBDUFVfSEFTX0ZQVSBpZiAhQ1BVX1NINEFMX0RTUAotCXNlbGVjdCBTWVNfU1VQUE9SVFNfVE1VCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9UTVUKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0hVR0VUTEJGUyBpZiBNTVUKIAogY29uZmlnIENQVV9TSDRBCkBAIC0yMTMsNyArMjA0LDcgQEAKIGNvbmZpZyBDUFVfU0g1CiAJYm9vbAogCXNlbGVjdCBDUFVfSEFTX0ZQVQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfVE1VCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9UTVUKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0hVR0VUTEJGUyBpZiBNTVUKIAogY29uZmlnIENQVV9TSFgyCkBAIC0yNTAsNyArMjQxLDcgQEAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc2MTkKIAlib29sICJTdXBwb3J0IFNINzYxOSBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDIKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0NNVAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfQ01UCiAKICMgU0gtMkEgUHJvY2Vzc29yIFN1cHBvcnQKIApAQCAtMjU4LDUwICsyNDksNTAgQEAKIAlib29sICJTdXBwb3J0IFNINzIwMSBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDJBCiAJc2VsZWN0IENQVV9IQVNfRlBVCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19NVFUyCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9NVFUyCiAgCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3MjAzCiAJYm9vbCAiU3VwcG9ydCBTSDcyMDMgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gyQQogCXNlbGVjdCBDUFVfSEFTX0ZQVQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQ01UCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19NVFUyCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX01UVTIKIAlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKIAlzZWxlY3QgUElOQ1RSTAogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3MjA2CiAJYm9vbCAiU3VwcG9ydCBTSDcyMDYgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gyQQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQ01UCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19NVFUyCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX01UVTIKIAogY29uZmlnIENQVV9TVUJUWVBFX1NINzI2MwogCWJvb2wgIlN1cHBvcnQgU0g3MjYzIHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NIMkEKIAlzZWxlY3QgQ1BVX0hBU19GUFUKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0NNVAotCXNlbGVjdCBTWVNfU1VQUE9SVFNfTVRVMgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfQ01UCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9NVFUyCiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDcyNjQKIAlib29sICJTdXBwb3J0IFNINzI2NCBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDJBCiAJc2VsZWN0IENQVV9IQVNfRlBVCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX01UVTIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfTVRVMgogCXNlbGVjdCBQSU5DVFJMCiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDcyNjkKIAlib29sICJTdXBwb3J0IFNINzI2OSBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDJBCiAJc2VsZWN0IENQVV9IQVNfRlBVCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX01UVTIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfTVRVMgogCXNlbGVjdCBQSU5DVFJMCiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9NWEcKIAlib29sICJTdXBwb3J0IE1YLUcgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gyQQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfTVRVMgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfTVRVMgogCWhlbHAKIAkgIFNlbGVjdCBNWC1HIGlmIHJ1bm5pbmcgb24gYW4gUjhBMDMwMjJCRyBwYXJ0LgogCkBAIC0zNTQsOSArMzQ1LDggQEAKIAlib29sICJTdXBwb3J0IFNINzcyMCBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDMKIAlzZWxlY3QgQ1BVX0hBU19EU1AKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0NNVAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfQ01UCiAJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCiAJc2VsZWN0IFVTQl9PSENJX1NIIGlmIFVTQl9PSENJX0hDRAogCXNlbGVjdCBQSU5DVFJMCiAJaGVscApAQCAtMzY2LDggKzM1Niw3IEBACiAJYm9vbCAiU3VwcG9ydCBTSDc3MjEgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gzCiAJc2VsZWN0IENQVV9IQVNfRFNQCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAogCXNlbGVjdCBVU0JfT0hDSV9TSCBpZiBVU0JfT0hDSV9IQ0QKIAloZWxwCiAJICBTZWxlY3QgU0g3NzIxIGlmIHlvdSBoYXZlIGEgU0gzLURTUCBTSDc3MjEgQ1BVLgpAQCAtNDIyLDcgKzQxMSw3IEBACiAJc2VsZWN0IENQVV9TSFgyCiAJc2VsZWN0IEFSQ0hfU0hNT0JJTEUKIAlzZWxlY3QgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAogCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgogCXNlbGVjdCBQSU5DVFJMCiAJaGVscApAQCAtNDM0LDcgKzQyMyw3IEBACiAJc2VsZWN0IENQVV9TSFgyCiAJc2VsZWN0IEFSQ0hfU0hNT0JJTEUKIAlzZWxlY3QgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAogCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgogCXNlbGVjdCBQSU5DVFJMCiAJaGVscApAQCAtNDQ1LDggKzQzNCw2IEBACiAJc2VsZWN0IENQVV9TSDRBCiAJc2VsZWN0IENQVV9TSFgyCiAJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCiAJc2VsZWN0IFBJTkNUUkwKIAloZWxwCiAJICBTZWxlY3QgU0g3NzM0IGlmIHlvdSBoYXZlIGEgU0g0QSBTSDc3MzQgQ1BVLgpAQCAtNDU2LDggKzQ0Myw2IEBACiAJc2VsZWN0IENQVV9TSDRBCiAJc2VsZWN0IENQVV9TSFgyCiAJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCiAJc2VsZWN0IFBJTkNUUkwKIAloZWxwCiAJICBTZWxlY3QgU0g3NzU3IGlmIHlvdSBoYXZlIGEgU0g0QSBTSDc3NTcgQ1BVLgpAQCAtNDY1LDcgKzQ1MCw2IEBACiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzYzCiAJYm9vbCAiU3VwcG9ydCBTSDc3NjMgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0g0QQotCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQogCXNlbGVjdCBVU0JfT0hDSV9TSCBpZiBVU0JfT0hDSV9IQ0QKIAloZWxwCiAJICBTZWxlY3QgU0g3NzYzIGlmIHlvdSBoYXZlIGEgU0g0QSBTSDc3NjMoUjVTNzc2MzEpIENQVS4KQEAgLTQ5NCw5ICs0NzgsNyBAQAogCXNlbGVjdCBDUFVfSEFTX1BURUFFWAogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVCBpZiBTTVAKIAlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKIAlzZWxlY3QgVVNCX09IQ0lfU0ggaWYgVVNCX09IQ0lfSENECi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCiAJc2VsZWN0IFVTQl9FSENJX1NIIGlmIFVTQl9FSENJX0hDRAogCXNlbGVjdCBQSU5DVFJMCiAKQEAgLTUxNCw3ICs0OTYsNyBAQAogCWJvb2wgIlN1cHBvcnQgU0g3MzQzIHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NINEFMX0RTUAogCXNlbGVjdCBBUkNIX1NITU9CSUxFCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzIyCiAJYm9vbCAiU3VwcG9ydCBTSDc3MjIgcHJvY2Vzc29yIgpAQCAtNTIzLDcgKzUwNSw3IEBACiAJc2VsZWN0IEFSQ0hfU0hNT0JJTEUKIAlzZWxlY3QgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCiAJc2VsZWN0IFNZU19TVVBQT1JUU19OVU1BCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAogCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgogCXNlbGVjdCBQSU5DVFJMCiAKQEAgLTUzNCw3ICs1MTYsNyBAQAogCXNlbGVjdCBBUkNIX1NITU9CSUxFCiAJc2VsZWN0IEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTlVNQQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQ01UCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKIAogZW5kY2hvaWNlCiAKQEAgLTU2NywyNyArNTQ5LDYgQEAKIAogbWVudSAiVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24iCiAKLWNvbmZpZyBTSF9USU1FUl9UTVUKLQlib29sICJUTVUgdGltZXIgZHJpdmVyIgotCWRlcGVuZHMgb24gU1lTX1NVUFBPUlRTX1RNVQotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyB0aGUgYnVpbGQgb2YgdGhlIFRNVSB0aW1lciBkcml2ZXIuCi0KLWNvbmZpZyBTSF9USU1FUl9DTVQKLQlib29sICJDTVQgdGltZXIgZHJpdmVyIgotCWRlcGVuZHMgb24gU1lTX1NVUFBPUlRTX0NNVAotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyBidWlsZCBvZiB0aGUgQ01UIHRpbWVyIGRyaXZlci4KLQotY29uZmlnIFNIX1RJTUVSX01UVTIKLQlib29sICJNVFUyIHRpbWVyIGRyaXZlciIKLQlkZXBlbmRzIG9uIFNZU19TVVBQT1JUU19NVFUyCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgVGhpcyBlbmFibGVzIGJ1aWxkIG9mIHRoZSBNVFUyIHRpbWVyIGRyaXZlci4KLQogY29uZmlnIFNIX1BDTEtfRlJFUQogCWludCAiUGVyaXBoZXJhbCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KSIKIAlkZXBlbmRzIG9uIFNIX0NMS19DUEdfTEVHQUNZCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L3NldHVwLmMKaW5kZXggNWJjM2ExNS4uODVkNTI1NSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1lY292ZWMyNC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtZWNvdmVjMjQvc2V0dXAuYwpAQCAtODYxLDE0ICs4NjEsMTIgQEAKIAkuY2FyZAkJPSAiRlNJQi1EQTcyMTAiLAogCS5jb2RlYwkJPSAiZGE3MjEwLjAtMDAxYSIsCiAJLnBsYXRmb3JtCT0gInNoX2ZzaS4wIiwKLQkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0kyUywKKwkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJLmNwdV9kYWkgPSB7CiAJCS5uYW1lCT0gImZzaWItZGFpIiwKLQkJLmZtdAk9IFNORF9TT0NfREFJRk1UX0NCU19DRlMgfCBTTkRfU09DX0RBSUZNVF9JQl9ORiwKIAl9LAogCS5jb2RlY19kYWkgPSB7CiAJCS5uYW1lCT0gImRhNzIxMC1oaWZpIiwKLQkJLmZtdAk9IFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L3NldHVwLmMKaW5kZXggMjFlNDIzMC4uMTE2MmJjNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L3NldHVwLmMKQEAgLTMwNCwxNCArMzA0LDEyIEBACiAJLmNhcmQJCT0gIkZTSUEtQUs0NjQyIiwKIAkuY29kZWMJCT0gImFrNDY0Mi1jb2RlYy4wLTAwMTIiLAogCS5wbGF0Zm9ybQk9ICJzaF9mc2kuMCIsCi0JLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9MRUZUX0osCisJLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9MRUZUX0ogfCBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCS5jcHVfZGFpID0gewogCQkubmFtZQk9ICJmc2lhLWRhaSIsCi0JCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTIHwgU05EX1NPQ19EQUlGTVRfSUJfTkYsCiAJfSwKIAkuY29kZWNfZGFpID0gewogCQkubmFtZQk9ICJhazQ2NDItaGlmaSIsCi0JCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCQkuc3lzY2xrCT0gMTEyODk2MDAsCiAJfSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2kuYwppbmRleCA2MGVkM2UxLi4xYmMwOWVlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLmMKQEAgLTE4NiwxMSArMTg2LDYgQEAKIAlyZXR1cm4gc3RhcnQ7CiB9CiAKLWludCBwY2liaW9zX2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG1hc2spCi17Ci0JcmV0dXJuIHBjaV9lbmFibGVfcmVzb3VyY2VzKGRldiwgbWFzayk7Ci19Ci0KIHN0YXRpYyB2b2lkIF9faW5pdAogcGNpYmlvc19idXNfcmVwb3J0X3N0YXR1c19lYXJseShzdHJ1Y3QgcGNpX2NoYW5uZWwgKmhvc2UsCiAJCQkJaW50IHRvcF9idXMsIGludCBjdXJyZW50X2J1cywKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2lycS5jIGIvYXJjaC9zaC9rZXJuZWwvaXJxLmMKaW5kZXggMDgzMzczNi4uNjVhMWVjZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvaXJxLmMKQEAgLTIxNywxOSArMjE3LDYgQEAKIH0KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotc3RhdGljIHZvaWQgcm91dGVfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGNwdSkKLXsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwotCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcChkYXRhKTsKLQotCXByaW50ayhLRVJOX0lORk8gIklSUSV1OiBtb3ZpbmcgZnJvbSBjcHUldSB0byBjcHUldVxuIiwKLQkgICAgICAgaXJxLCBkYXRhLT5ub2RlLCBjcHUpOwotCi0JcmF3X3NwaW5fbG9ja19pcnEoJmRlc2MtPmxvY2spOwotCWNoaXAtPmlycV9zZXRfYWZmaW5pdHkoZGF0YSwgY3B1bWFza19vZihjcHUpLCBmYWxzZSk7Ci0JcmF3X3NwaW5fdW5sb2NrX2lycSgmZGVzYy0+bG9jayk7Ci19Ci0KIC8qCiAgKiBUaGUgQ1BVIGhhcyBiZWVuIG1hcmtlZCBvZmZsaW5lLiAgTWlncmF0ZSBJUlFzIG9mZiB0aGlzIENQVS4gIElmCiAgKiB0aGUgYWZmaW5pdHkgc2V0dGluZ3MgZG8gbm90IGFsbG93IG90aGVyIENQVXMsIGZvcmNlIHRoZW0gb250byBhbnkKQEAgLTI1MCwxMSArMjM3LDggQEAKIAkJCQkJCSAgICBpcnEsIGNwdSk7CiAKIAkJCQljcHVtYXNrX3NldGFsbChkYXRhLT5hZmZpbml0eSk7Ci0JCQkJbmV3Y3B1ID0gY3B1bWFza19hbnlfYW5kKGRhdGEtPmFmZmluaXR5LAotCQkJCQkJCSBjcHVfb25saW5lX21hc2spOwogCQkJfQotCi0JCQlyb3V0ZV9pcnEoZGF0YSwgaXJxLCBuZXdjcHUpOworCQkJaXJxX3NldF9hZmZpbml0eShpcnEsIGRhdGEtPmFmZmluaXR5KTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaS5jCmluZGV4IDg4YWFhYTUuLmUxNmM0MTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2kuYwpAQCAtOTksMTEgKzk5LDYgQEAKIAlyZXR1cm4gcmVzLT5zdGFydDsKIH0KIAotaW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKLXsKLQlyZXR1cm4gcGNpX2VuYWJsZV9yZXNvdXJjZXMoZGV2LCBtYXNrKTsKLX0KLQogLyogaW4vb3V0IHJvdXRpbmVzIHRha2VuIGZyb20gcGNpYy5jCiAgKgogICogVGhpcyBwcm9iYWJseSBiZWxvbmdzIGhlcmUgcmF0aGVyIHRoYW4gaW9wb3J0LmMgYmVjYXVzZQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdGltZV82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdGltZV82NC5jCmluZGV4IGMzZDgyYjUuLjNmZGRmNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzY0LmMKQEAgLTY1OSw4ICs2NTksNyBAQAogCQlmdC0+Y2xvY2tfdGlja19yZWYgPSBjcHVfZGF0YShjcHUpLmNsb2NrX3RpY2s7CiAJfQogCWlmICgodmFsID09IENQVUZSRVFfUFJFQ0hBTkdFICAmJiBmcmVxLT5vbGQgPCBmcmVxLT5uZXcpIHx8Ci0JICAgICh2YWwgPT0gQ1BVRlJFUV9QT1NUQ0hBTkdFICYmIGZyZXEtPm9sZCA+IGZyZXEtPm5ldykgfHwKLQkgICAgKHZhbCA9PSBDUFVGUkVRX1JFU1VNRUNIQU5HRSkpIHsKKwkgICAgKHZhbCA9PSBDUFVGUkVRX1BPU1RDSEFOR0UgJiYgZnJlcS0+b2xkID4gZnJlcS0+bmV3KSkgewogCQljcHVfZGF0YShjcHUpLmNsb2NrX3RpY2sgPQogCQkJY3B1ZnJlcV9zY2FsZShmdC0+Y2xvY2tfdGlja19yZWYsCiAJCQkJICAgICAgZnQtPnJlZl9mcmVxLApAQCAtNzMzLDcgKzczMiw3IEBACiAJaXJxX2VudGVyKCk7CiAKIAlsb2NhbF9jcHVfZGF0YSgpLmlycTBfaXJxcysrOwotCWtzdGF0X2luY3JfaXJxc190aGlzX2NwdSgwLCBpcnFfdG9fZGVzYygwKSk7CisJa3N0YXRfaW5jcl9pcnFfdGhpc19jcHUoMCk7CiAKIAlpZiAodW5saWtlbHkoIWV2dC0+ZXZlbnRfaGFuZGxlcikpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2tlcm5lbC9wY2lfZ3guYyBiL2FyY2gvdGlsZS9rZXJuZWwvcGNpX2d4LmMKaW5kZXggYTk3YTY0NS4uMDc3YjdiYyAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2tlcm5lbC9wY2lfZ3guYworKysgYi9hcmNoL3RpbGUva2VybmVsL3BjaV9neC5jCkBAIC0xMDY1LDE4ICsxMDY1LDYgQEAKIH0KIAogLyoKLSAqIEVuYWJsZSBtZW1vcnkgYWRkcmVzcyBkZWNvZGluZywgYXMgYXBwcm9wcmlhdGUsIGZvciB0aGUKLSAqIGRldmljZSBkZXNjcmliZWQgYnkgdGhlICdkZXYnIHN0cnVjdC4KLSAqCi0gKiBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBnZW5lcmljIFBDSSBsYXllciwgYW5kIGNhbiBiZSBjYWxsZWQKLSAqIGZvciBicmlkZ2VzIG9yIGVuZHBvaW50cy4KLSAqLwotaW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKLXsKLQlyZXR1cm4gcGNpX2VuYWJsZV9yZXNvdXJjZXMoZGV2LCBtYXNrKTsKLX0KLQotLyoKICAqIENhbGxlZCBmb3IgZWFjaCBkZXZpY2UgYWZ0ZXIgUENJIHNldHVwIGlzIGRvbmUuCiAgKiBXZSBpbml0aWFsaXplIHRoZSBQQ0kgZGV2aWNlIGNhcGFiaWxpdGllcyBjb25zZXJ2YXRpdmVseSwgYXNzdW1pbmcgdGhhdAogICogYWxsIGRldmljZXMgY2FuIG9ubHkgYWRkcmVzcyB0aGUgMzItYml0IERNQSBzcGFjZS4gVGhlIGV4Y2VwdGlvbiBoZXJlIGlzCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnIGIvYXJjaC94ODYvS2NvbmZpZwppbmRleCA4NDUzZmUxLi5mNzMwNzE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9LY29uZmlnCisrKyBiL2FyY2gveDg2L0tjb25maWcKQEAgLTEwNyw5ICsxMDcsOSBAQAogCXNlbGVjdCBIQVZFX0FSQ0hfU09GVF9ESVJUWQogCXNlbGVjdCBDTE9DS1NPVVJDRV9XQVRDSERPRwogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCi0Jc2VsZWN0IEFSQ0hfQ0xPQ0tTT1VSQ0VfREFUQSBpZiBYODZfNjQKKwlzZWxlY3QgQVJDSF9DTE9DS1NPVVJDRV9EQVRBCiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUIGlmIFg4Nl82NCB8fCAoWDg2XzMyICYmIFg4Nl9MT0NBTF9BUElDKQotCXNlbGVjdCBHRU5FUklDX1RJTUVfVlNZU0NBTEwgaWYgWDg2XzY0CisJc2VsZWN0IEdFTkVSSUNfVElNRV9WU1lTQ0FMTAogCXNlbGVjdCBLVElNRV9TQ0FMQVIgaWYgWDg2XzMyCiAJc2VsZWN0IEdFTkVSSUNfU1RSTkNQWV9GUk9NX1VTRVIKIAlzZWxlY3QgR0VORVJJQ19TVFJOTEVOX1VTRVIKQEAgLTEyNyw2ICsxMjcsNyBAQAogCXNlbGVjdCBIQVZFX0RFQlVHX1NUQUNLT1ZFUkZMT1cKIAlzZWxlY3QgSEFWRV9JUlFfRVhJVF9PTl9JUlFfU1RBQ0sgaWYgWDg2XzY0CiAJc2VsZWN0IEhBVkVfQ0NfU1RBQ0tQUk9URUNUT1IKKwlzZWxlY3QgR0VORVJJQ19DUFVfQVVUT1BST0JFCiAKIGNvbmZpZyBJTlNUUlVDVElPTl9ERUNPREVSCiAJZGVmX2Jvb2wgeQpAQCAtMTk1LDkgKzE5Niw2IEBACiBjb25maWcgQVJDSF9IQVNfQ0FDSEVfTElORV9TSVpFCiAJZGVmX2Jvb2wgeQogCi1jb25maWcgQVJDSF9IQVNfQ1BVX0FVVE9QUk9CRQotCWRlZl9ib29sIHkKLQogY29uZmlnIEhBVkVfU0VUVVBfUEVSX0NQVV9BUkVBCiAJZGVmX2Jvb2wgeQogCkBAIC0zNDYsMTIgKzM0NCw5IEBACiAJICBmb3IgdGhlIGZvbGxvd2luZyAobm9uLVBDKSAzMiBiaXQgeDg2IHBsYXRmb3JtczoKIAkJR29sZGZpc2ggKEFuZHJvaWQgZW11bGF0b3IpCiAJCUFNRCBFbGFuCi0JCU5VTUFRIChJQk0vU2VxdWVudCkKIAkJUkRDIFItMzIxeCBTb0MKIAkJU0dJIDMyMC81NDAgKFZpc3VhbCBXb3Jrc3RhdGlvbikKIAkJU1RBMlgxMS1iYXNlZCAoZS5nLiBOb3J0aHZpbGxlKQotCQlTdW1taXQvRVhBIChJQk0geDQ0MCkKLQkJVW5pc3lzIEVTNzAwMCBJQTMyIHNlcmllcwogCQlNb29yZXN0b3duIE1JRCBkZXZpY2VzCiAKIAkgIElmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBzeXN0ZW1zLCBvciBpZiB5b3Ugd2FudCB0byBidWlsZCBhCkBAIC00ODksNDkgKzQ4NCwyMiBAQAogCWRlcGVuZHMgb24gWDg2XzMyICYmIFNNUAogCWRlcGVuZHMgb24gWDg2X0VYVEVOREVEX1BMQVRGT1JNCiAJLS0taGVscC0tLQotCSAgVGhpcyBvcHRpb24gY29tcGlsZXMgaW4gdGhlIE5VTUFRLCBTdW1taXQsIGJpZ3NtcCwgRVM3MDAwLAotCSAgU1RBMlgxMSwgZGVmYXVsdCBzdWJhcmNoaXRlY3R1cmVzLiAgSXQgaXMgaW50ZW5kZWQgZm9yIGEgZ2VuZXJpYwotCSAgYmluYXJ5IGtlcm5lbC4gSWYgeW91IHNlbGVjdCB0aGVtIGFsbCwga2VybmVsIHdpbGwgcHJvYmUgaXQKLQkgIG9uZSBieSBvbmUgYW5kIHdpbGwgZmFsbGJhY2sgdG8gZGVmYXVsdC4KKwkgIFRoaXMgb3B0aW9uIGNvbXBpbGVzIGluIHRoZSBiaWdzbXAgYW5kIFNUQTJYMTEgZGVmYXVsdAorCSAgc3ViYXJjaGl0ZWN0dXJlcy4gIEl0IGlzIGludGVuZGVkIGZvciBhIGdlbmVyaWMgYmluYXJ5CisJICBrZXJuZWwuIElmIHlvdSBzZWxlY3QgdGhlbSBhbGwsIGtlcm5lbCB3aWxsIHByb2JlIGl0IG9uZSBieQorCSAgb25lIGFuZCB3aWxsIGZhbGxiYWNrIHRvIGRlZmF1bHQuCiAKICMgQWxwaGFiZXRpY2FsbHkgc29ydGVkIGxpc3Qgb2YgTm9uIHN0YW5kYXJkIDMyIGJpdCBwbGF0Zm9ybXMKIAotY29uZmlnIFg4Nl9OVU1BUQotCWJvb2wgIk5VTUFRIChJQk0vU2VxdWVudCkiCi0JZGVwZW5kcyBvbiBYODZfMzJfTk9OX1NUQU5EQVJECi0JZGVwZW5kcyBvbiBQQ0kKLQlzZWxlY3QgTlVNQQotCXNlbGVjdCBYODZfTVBQQVJTRQotCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIGlzIHVzZWQgZm9yIGdldHRpbmcgTGludXggdG8gcnVuIG9uIGEgTlVNQVEgKElCTS9TZXF1ZW50KQotCSAgTlVNQSBtdWx0aXF1YWQgYm94LiBUaGlzIGNoYW5nZXMgdGhlIHdheSB0aGF0IHByb2Nlc3NvcnMgYXJlCi0JICBib290c3RyYXBwZWQsIGFuZCB1c2VzIENsdXN0ZXJlZCBMb2dpY2FsIEFQSUMgYWRkcmVzc2luZyBtb2RlIGluc3RlYWQKLQkgIG9mIEZsYXQgTG9naWNhbC4gIFlvdSB3aWxsIG5lZWQgYSBuZXcgbHlueGVyLmVsZiBmaWxlIHRvIGZsYXNoIHlvdXIKLQkgIGZpcm13YXJlIHdpdGggLSBzZW5kIGVtYWlsIHRvIDxNYXJ0aW4uQmxpZ2hAdXMuaWJtLmNvbT4uCi0KIGNvbmZpZyBYODZfU1VQUE9SVFNfTUVNT1JZX0ZBSUxVUkUKIAlkZWZfYm9vbCB5CiAJIyBNQ0UgY29kZSBjYWxscyBtZW1vcnlfZmFpbHVyZSgpOgogCWRlcGVuZHMgb24gWDg2X01DRQogCSMgT24gMzItYml0IHRoaXMgYWRkcyB0b28gYmlnIG9mIE5PREVTX1NISUZUIGFuZCB3ZSBydW4gb3V0IG9mIHBhZ2UgZmxhZ3M6Ci0JZGVwZW5kcyBvbiAhWDg2X05VTUFRCiAJIyBPbiAzMi1iaXQgU1BBUlNFTUVNIGFkZHMgdG9vIGJpZyBvZiBTRUNUSU9OU19XSURUSDoKIAlkZXBlbmRzIG9uIFg4Nl82NCB8fCAhU1BBUlNFTUVNCiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTUVNT1JZX0ZBSUxVUkUKIAotY29uZmlnIFg4Nl9WSVNXUwotCWJvb2wgIlNHSSAzMjAvNTQwIChWaXN1YWwgV29ya3N0YXRpb24pIgotCWRlcGVuZHMgb24gWDg2XzMyICYmIFBDSSAmJiBYODZfTVBQQVJTRSAmJiBQQ0lfR09ESVJFQ1QKLQlkZXBlbmRzIG9uIFg4Nl8zMl9OT05fU1RBTkRBUkQKLQktLS1oZWxwLS0tCi0JICBUaGUgU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbiBzZXJpZXMgaXMgYW4gSUEzMi1iYXNlZCB3b3Jrc3RhdGlvbgotCSAgYmFzZWQgb24gU0dJIHN5c3RlbXMgY2hpcHMgd2l0aCBzb21lIGxlZ2FjeSBQQyBoYXJkd2FyZSBhdHRhY2hlZC4KLQotCSAgU2F5IFkgaGVyZSB0byBjcmVhdGUgYSBrZXJuZWwgdG8gcnVuIG9uIHRoZSBTR0kgMzIwIG9yIDU0MC4KLQotCSAgQSBrZXJuZWwgY29tcGlsZWQgZm9yIHRoZSBWaXN1YWwgV29ya3N0YXRpb24gd2lsbCBydW4gb24gZ2VuZXJhbAotCSAgUENzIGFzIHdlbGwuIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NnaS12aXN3cy50eHQ+IGZvciBkZXRhaWxzLgotCiBjb25maWcgU1RBMlgxMQogCWJvb2wgIlNUQTJYMTEgQ29tcGFuaW9uIENoaXAgU3VwcG9ydCIKIAlkZXBlbmRzIG9uIFg4Nl8zMl9OT05fU1RBTkRBUkQgJiYgUENJCkBAIC01NDgsMjAgKzUxNiw2IEBACiAJICBvcHRpb24gaXMgc2VsZWN0ZWQgdGhlIGtlcm5lbCB3aWxsIHN0aWxsIGJlIGFibGUgdG8gYm9vdCBvbgogCSAgc3RhbmRhcmQgUEMgbWFjaGluZXMuCiAKLWNvbmZpZyBYODZfU1VNTUlUCi0JYm9vbCAiU3VtbWl0L0VYQSAoSUJNIHg0NDApIgotCWRlcGVuZHMgb24gWDg2XzMyX05PTl9TVEFOREFSRAotCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIGlzIG5lZWRlZCBmb3IgSUJNIHN5c3RlbXMgdGhhdCB1c2UgdGhlIFN1bW1pdC9FWEEgY2hpcHNldC4KLQkgIEluIHBhcnRpY3VsYXIsIGl0IGlzIG5lZWRlZCBmb3IgdGhlIHg0NDAuCi0KLWNvbmZpZyBYODZfRVM3MDAwCi0JYm9vbCAiVW5pc3lzIEVTNzAwMCBJQTMyIHNlcmllcyIKLQlkZXBlbmRzIG9uIFg4Nl8zMl9OT05fU1RBTkRBUkQgJiYgWDg2X0JJR1NNUAotCS0tLWhlbHAtLS0KLQkgIFN1cHBvcnQgZm9yIFVuaXN5cyBFUzcwMDAgc3lzdGVtcy4gIFNheSAnWScgaGVyZSBpZiB0aGlzIGtlcm5lbCBpcwotCSAgc3VwcG9zZWQgdG8gcnVuIG9uIGFuIElBMzItYmFzZWQgVW5pc3lzIEVTNzAwMCBzeXN0ZW0uCi0KIGNvbmZpZyBYODZfMzJfSVJJUwogCXRyaXN0YXRlICJFdXJvYnJhaWxsZS9JcmlzIHBvd2Vyb2ZmIG1vZHVsZSIKIAlkZXBlbmRzIG9uIFg4Nl8zMgpAQCAtNjg0LDE0ICs2MzgsNiBAQAogCSAgICAgICAgbWVtdGVzdD00LCBtZWFuIGRvIDQgdGVzdCBwYXR0ZXJucy4KIAkgIElmIHlvdSBhcmUgdW5zdXJlIGhvdyB0byBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgYW5zd2VyIE4uCiAKLWNvbmZpZyBYODZfU1VNTUlUX05VTUEKLQlkZWZfYm9vbCB5Ci0JZGVwZW5kcyBvbiBYODZfMzIgJiYgTlVNQSAmJiBYODZfMzJfTk9OX1NUQU5EQVJECi0KLWNvbmZpZyBYODZfQ1lDTE9ORV9USU1FUgotCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIFg4Nl9TVU1NSVQKLQogc291cmNlICJhcmNoL3g4Ni9LY29uZmlnLmNwdSIKIAogY29uZmlnIEhQRVRfVElNRVIKQEAgLTgyMCw3ICs3NjYsNyBAQAogCXJhbmdlIDIgODE5MiBpZiBTTVAgJiYgIU1BWFNNUCAmJiBDUFVNQVNLX09GRlNUQUNLICYmIFg4Nl82NAogCWRlZmF1bHQgIjEiIGlmICFTTVAKIAlkZWZhdWx0ICI4MTkyIiBpZiBNQVhTTVAKLQlkZWZhdWx0ICIzMiIgaWYgU01QICYmIChYODZfTlVNQVEgfHwgWDg2X1NVTU1JVCB8fCBYODZfQklHU01QIHx8IFg4Nl9FUzcwMDApCisJZGVmYXVsdCAiMzIiIGlmIFNNUCAmJiBYODZfQklHU01QCiAJZGVmYXVsdCAiOCIgaWYgU01QCiAJLS0taGVscC0tLQogCSAgVGhpcyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIENQVXMgd2hpY2ggdGhpcwpAQCAtODg0LDEwICs4MzAsNiBAQAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFg4Nl82NCB8fCBTTVAgfHwgWDg2XzMyX05PTl9TVEFOREFSRCB8fCBYODZfVVBfSU9BUElDIHx8IFBDSV9NU0kKIAotY29uZmlnIFg4Nl9WSVNXU19BUElDCi0JZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gWDg2XzMyICYmIFg4Nl9WSVNXUwotCiBjb25maWcgWDg2X1JFUk9VVEVfRk9SX0JST0tFTl9CT09UX0lSUVMKIAlib29sICJSZXJvdXRlIGZvciBicm9rZW4gYm9vdCBJUlFzIgogCWRlcGVuZHMgb24gWDg2X0lPX0FQSUMKQEAgLTExMDUsMTMgKzEwNDcsMTEgQEAKIAogY2hvaWNlCiAJcHJvbXB0ICJIaWdoIE1lbW9yeSBTdXBwb3J0IgotCWRlZmF1bHQgSElHSE1FTTY0RyBpZiBYODZfTlVNQVEKIAlkZWZhdWx0IEhJR0hNRU00RwogCWRlcGVuZHMgb24gWDg2XzMyCiAKIGNvbmZpZyBOT0hJR0hNRU0KIAlib29sICJvZmYiCi0JZGVwZW5kcyBvbiAhWDg2X05VTUFRCiAJLS0taGVscC0tLQogCSAgTGludXggY2FuIHVzZSB1cCB0byA2NCBHaWdhYnl0ZXMgb2YgcGh5c2ljYWwgbWVtb3J5IG9uIHg4NiBzeXN0ZW1zLgogCSAgSG93ZXZlciwgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgMzItYml0IHg4NiBwcm9jZXNzb3JzIGlzIG9ubHkgNApAQCAtMTE0OCw3ICsxMDg4LDYgQEAKIAogY29uZmlnIEhJR0hNRU00RwogCWJvb2wgIjRHQiIKLQlkZXBlbmRzIG9uICFYODZfTlVNQVEKIAktLS1oZWxwLS0tCiAJICBTZWxlY3QgdGhpcyBpZiB5b3UgaGF2ZSBhIDMyLWJpdCBwcm9jZXNzb3IgYW5kIGJldHdlZW4gMSBhbmQgNAogCSAgZ2lnYWJ5dGVzIG9mIHBoeXNpY2FsIFJBTS4KQEAgLTEyNDAsOCArMTE3OSw4IEBACiBjb25maWcgTlVNQQogCWJvb2wgIk51bWEgTWVtb3J5IEFsbG9jYXRpb24gYW5kIFNjaGVkdWxlciBTdXBwb3J0IgogCWRlcGVuZHMgb24gU01QCi0JZGVwZW5kcyBvbiBYODZfNjQgfHwgKFg4Nl8zMiAmJiBISUdITUVNNjRHICYmIChYODZfTlVNQVEgfHwgWDg2X0JJR1NNUCB8fCBYODZfU1VNTUlUICYmIEFDUEkpKQotCWRlZmF1bHQgeSBpZiAoWDg2X05VTUFRIHx8IFg4Nl9TVU1NSVQgfHwgWDg2X0JJR1NNUCkKKwlkZXBlbmRzIG9uIFg4Nl82NCB8fCAoWDg2XzMyICYmIEhJR0hNRU02NEcgJiYgWDg2X0JJR1NNUCkKKwlkZWZhdWx0IHkgaWYgWDg2X0JJR1NNUAogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBOVU1BIChOb24gVW5pZm9ybSBNZW1vcnkgQWNjZXNzKSBzdXBwb3J0LgogCkBAIC0xMjUyLDE1ICsxMTkxLDExIEBACiAJICBGb3IgNjQtYml0IHRoaXMgaXMgcmVjb21tZW5kZWQgaWYgdGhlIHN5c3RlbSBpcyBJbnRlbCBDb3JlIGk3CiAJICAob3IgbGF0ZXIpLCBBTUQgT3B0ZXJvbiwgb3IgRU02NFQgTlVNQS4KIAotCSAgRm9yIDMyLWJpdCB0aGlzIGlzIG9ubHkgbmVlZGVkIG9uIChyYXJlKSAzMi1iaXQtb25seSBwbGF0Zm9ybXMKLQkgIHRoYXQgc3VwcG9ydCBOVU1BIHRvcG9sb2dpZXMsIHN1Y2ggYXMgTlVNQVEgLyBTdW1taXQsIG9yIGlmIHlvdQotCSAgYm9vdCBhIDMyLWJpdCBrZXJuZWwgb24gYSA2NC1iaXQgTlVNQSBwbGF0Zm9ybS4KKwkgIEZvciAzMi1iaXQgdGhpcyBpcyBvbmx5IG5lZWRlZCBpZiB5b3UgYm9vdCBhIDMyLWJpdAorCSAga2VybmVsIG9uIGEgNjQtYml0IE5VTUEgcGxhdGZvcm0uCiAKIAkgIE90aGVyd2lzZSwgeW91IHNob3VsZCBzYXkgTi4KIAotY29tbWVudCAiTlVNQSAoU3VtbWl0KSByZXF1aXJlcyBTTVAsIDY0R0IgaGlnaG1lbSBzdXBwb3J0LCBBQ1BJIgotCWRlcGVuZHMgb24gWDg2XzMyICYmIFg4Nl9TVU1NSVQgJiYgKCFISUdITUVNNjRHIHx8ICFBQ1BJKQotCiBjb25maWcgQU1EX05VTUEKIAlkZWZfYm9vbCB5CiAJcHJvbXB0ICJPbGQgc3R5bGUgQU1EIE9wdGVyb24gTlVNQSBkZXRlY3Rpb24iCkBAIC0xMzAyLDcgKzEyMzcsNiBAQAogCXJhbmdlIDEgMTAKIAlkZWZhdWx0ICIxMCIgaWYgTUFYU01QCiAJZGVmYXVsdCAiNiIgaWYgWDg2XzY0Ci0JZGVmYXVsdCAiNCIgaWYgWDg2X05VTUFRCiAJZGVmYXVsdCAiMyIKIAlkZXBlbmRzIG9uIE5FRURfTVVMVElQTEVfTk9ERVMKIAktLS1oZWxwLS0tCkBAIC0xODUwLDE3ICsxNzg0LDI5IEBACiAJICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgQ09NUEFUX1ZEU08KLQlkZWZfYm9vbCB5Ci0JcHJvbXB0ICJDb21wYXQgVkRTTyBzdXBwb3J0IgorCWRlZl9ib29sIG4KKwlwcm9tcHQgIkRpc2FibGUgdGhlIDMyLWJpdCB2RFNPIChuZWVkZWQgZm9yIGdsaWJjIDIuMy4zKSIKIAlkZXBlbmRzIG9uIFg4Nl8zMiB8fCBJQTMyX0VNVUxBVElPTgogCS0tLWhlbHAtLS0KLQkgIE1hcCB0aGUgMzItYml0IFZEU08gdG8gdGhlIHByZWRpY3RhYmxlIG9sZC1zdHlsZSBhZGRyZXNzIHRvby4KKwkgIENlcnRhaW4gYnVnZ3kgdmVyc2lvbnMgb2YgZ2xpYmMgd2lsbCBjcmFzaCBpZiB0aGV5IGFyZQorCSAgcHJlc2VudGVkIHdpdGggYSAzMi1iaXQgdkRTTyB0aGF0IGlzIG5vdCBtYXBwZWQgYXQgdGhlIGFkZHJlc3MKKwkgIGluZGljYXRlZCBpbiBpdHMgc2VnbWVudCB0YWJsZS4KIAotCSAgU2F5IE4gaGVyZSBpZiB5b3UgYXJlIHJ1bm5pbmcgYSBzdWZmaWNpZW50bHkgcmVjZW50IGdsaWJjCi0JICB2ZXJzaW9uICgyLjMuMyBvciBsYXRlciksIHRvIHJlbW92ZSB0aGUgaGlnaC1tYXBwZWQKLQkgIFZEU08gbWFwcGluZyBhbmQgdG8gZXhjbHVzaXZlbHkgdXNlIHRoZSByYW5kb21pemVkIFZEU08uCisJICBUaGUgYnVnIHdhcyBpbnRyb2R1Y2VkIGJ5IGY4NjYzMTRiODlkNTY4NDVmNTVlNmYzNjVlMThiMzFlYzk3OGVjM2EKKwkgIGFuZCBmaXhlZCBieSAzYjNkZGI0ZjdkYjk4ZWM5ZTkxMmNjZGY1NGQzNWRmNGFhMzBlMDRhIGFuZAorCSAgNDlhZDU3MmE3MGI4YWViOTFlNTc0ODNhMTFkZDFiNzdlMzFjNDQ2OC4gIEdsaWJjIDIuMy4zIGlzCisJICB0aGUgb25seSByZWxlYXNlZCB2ZXJzaW9uIHdpdGggdGhlIGJ1ZywgYnV0IE9wZW5TVVNFIDkKKwkgIGNvbnRhaW5zIGEgYnVnZ3kgImdsaWJjIDIuMy4yIi4KIAotCSAgSWYgdW5zdXJlLCBzYXkgWS4KKwkgIFRoZSBzeW1wdG9tIG9mIHRoZSBidWcgaXMgdGhhdCBldmVyeXRoaW5nIGNyYXNoZXMgb24gc3RhcnR1cCwgc2F5aW5nOgorCSAgZGxfbWFpbjogQXNzZXJ0aW9uIGAodm9pZCAqKSBwaC0+cF92YWRkciA9PSBfcnRsZF9sb2NhbC5fZGxfc3lzaW5mb19kc28nIGZhaWxlZCEKKworCSAgU2F5aW5nIFkgaGVyZSBjaGFuZ2VzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSB2ZHNvMzIgYm9vdAorCSAgb3B0aW9uIGZyb20gMSB0byAwLCB3aGljaCB0dXJucyBvZmYgdGhlIDMyLWJpdCB2RFNPIGVudGlyZWx5LgorCSAgVGhpcyB3b3JrcyBhcm91bmQgdGhlIGdsaWJjIGJ1ZyBidXQgaHVydHMgcGVyZm9ybWFuY2UuCisKKwkgIElmIHVuc3VyZSwgc2F5IE46IGlmIHlvdSBhcmUgY29tcGlsaW5nIHlvdXIgb3duIGtlcm5lbCwgeW91CisJICBhcmUgdW5saWtlbHkgdG8gYmUgdXNpbmcgYSBidWdneSB2ZXJzaW9uIG9mIGdsaWJjLgogCiBjb25maWcgQ01ETElORV9CT09MCiAJYm9vbCAiQnVpbHQtaW4ga2VybmVsIGNvbW1hbmQgbGluZSIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25maWcuY3B1IGIvYXJjaC94ODYvS2NvbmZpZy5jcHUKaW5kZXggZjNhYWYyMy4uNjk4MzMxNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvS2NvbmZpZy5jcHUKKysrIGIvYXJjaC94ODYvS2NvbmZpZy5jcHUKQEAgLTM1OSw3ICszNTksNyBAQAogCiBjb25maWcgWDg2X1RTQwogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uICgoTVdJTkNISVAzRCB8fCBNQ1JVU09FIHx8IE1FRkZJQ0VPTiB8fCBNQ1lSSVhJSUkgfHwgTUs3IHx8IE1LNiB8fCBNUEVOVElVTTQgfHwgTVBFTlRJVU1NIHx8IE1QRU5USVVNSUlJIHx8IE1QRU5USVVNSUkgfHwgTTY4NiB8fCBNNTg2TU1YIHx8IE01ODZUU0MgfHwgTUs4IHx8IE1WSUFDM18yIHx8IE1WSUFDNyB8fCBNR0VPREVHWDEgfHwgTUdFT0RFX0xYIHx8IE1DT1JFMiB8fCBNQVRPTSkgJiYgIVg4Nl9OVU1BUSkgfHwgWDg2XzY0CisJZGVwZW5kcyBvbiAoTVdJTkNISVAzRCB8fCBNQ1JVU09FIHx8IE1FRkZJQ0VPTiB8fCBNQ1lSSVhJSUkgfHwgTUs3IHx8IE1LNiB8fCBNUEVOVElVTTQgfHwgTVBFTlRJVU1NIHx8IE1QRU5USVVNSUlJIHx8IE1QRU5USVVNSUkgfHwgTTY4NiB8fCBNNTg2TU1YIHx8IE01ODZUU0MgfHwgTUs4IHx8IE1WSUFDM18yIHx8IE1WSUFDNyB8fCBNR0VPREVHWDEgfHwgTUdFT0RFX0xYIHx8IE1DT1JFMiB8fCBNQVRPTSkgfHwgWDg2XzY0CiAKIGNvbmZpZyBYODZfQ01QWENIRzY0CiAJZGVmX2Jvb2wgeQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9ib290LmggYi9hcmNoL3g4Ni9ib290L2Jvb3QuaAppbmRleCA1MGY4YzVlLi5iZDQ5ZWM2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2Jvb3QuaAorKysgYi9hcmNoL3g4Ni9ib290L2Jvb3QuaApAQCAtMTc3LDE0ICsxNzcsNiBAQAogfQogCiAvKiBOb3RlOiB0aGVzZSBvbmx5IHJldHVybiB0cnVlL2ZhbHNlLCBub3QgYSBzaWduZWQgcmV0dXJuIHZhbHVlISAqLwotc3RhdGljIGlubGluZSBpbnQgbWVtY21wKGNvbnN0IHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IGxlbikKLXsKLQl1OCBkaWZmOwotCWFzbSgicmVwZTsgY21wc2I7IHNldG56ICUwIgotCSAgICA6ICI9cW0iIChkaWZmKSwgIitEIiAoczEpLCAiK1MiIChzMiksICIrYyIgKGxlbikpOwotCXJldHVybiBkaWZmOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBtZW1jbXBfZnMoY29uc3Qgdm9pZCAqczEsIGFkZHJfdCBzMiwgc2l6ZV90IGxlbikKIHsKIAl1OCBkaWZmOwpAQCAtMjI4LDExICsyMjAsNiBAQAogdm9pZCAqY29weV9mcm9tX2ZzKHZvaWQgKmRzdCwgYWRkcl90IHNyYywgc2l6ZV90IGxlbik7CiB2b2lkIGNvcHlfdG9fZ3MoYWRkcl90IGRzdCwgdm9pZCAqc3JjLCBzaXplX3QgbGVuKTsKIHZvaWQgKmNvcHlfZnJvbV9ncyh2b2lkICpkc3QsIGFkZHJfdCBzcmMsIHNpemVfdCBsZW4pOwotdm9pZCAqbWVtY3B5KHZvaWQgKmRzdCwgdm9pZCAqc3JjLCBzaXplX3QgbGVuKTsKLXZvaWQgKm1lbXNldCh2b2lkICpkc3QsIGludCBjLCBzaXplX3QgbGVuKTsKLQotI2RlZmluZSBtZW1jcHkoZCxzLGwpIF9fYnVpbHRpbl9tZW1jcHkoZCxzLGwpCi0jZGVmaW5lIG1lbXNldChkLGMsbCkgX19idWlsdGluX21lbXNldChkLGMsbCkKIAogLyogYTIwLmMgKi8KIGludCBlbmFibGVfYTIwKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKaW5kZXggMTk2ZWFmMy4uMTc2ODQ2MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYworKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICIuLi9zdHJpbmcuaCIKIAogLyogV0FSTklORyEhCiAgKiBUaGlzIGNvZGUgaXMgY29tcGlsZWQgd2l0aCAtZlBJQyBhbmQgaXQgaXMgcmVsb2NhdGVkIGR5bmFtaWNhbGx5CkBAIC05Nyw4ICs5OCwxNCBAQAogICovCiAjZGVmaW5lIFNUQVRJQwkJc3RhdGljCiAKLSN1bmRlZiBtZW1zZXQKICN1bmRlZiBtZW1jcHkKKworLyoKKyAqIFVzZSBhIG5vcm1hbCBkZWZpbml0aW9uIG9mIG1lbXNldCgpIGZyb20gc3RyaW5nLmMuIFRoZXJlIGFyZSBhbHJlYWR5CisgKiBpbmNsdWRlZCBoZWFkZXIgZmlsZXMgd2hpY2ggZXhwZWN0IGEgZGVmaW5pdGlvbiBvZiBtZW1zZXQoKSBhbmQgYnkKKyAqIHRoZSB0aW1lIHdlIGRlZmluZSBtZW1zZXQgbWFjcm8sIGl0IGlzIHRvbyBsYXRlLgorICovCisjdW5kZWYgbWVtc2V0CiAjZGVmaW5lIG1lbXplcm8ocywgbikJbWVtc2V0KChzKSwgMCwgKG4pKQogCiAKQEAgLTEwOSw5ICsxMTYsNiBAQAogICovCiBzdHJ1Y3QgYm9vdF9wYXJhbXMgKnJlYWxfbW9kZTsJCS8qIFBvaW50ZXIgdG8gcmVhbC1tb2RlIGRhdGEgKi8KIAotdm9pZCAqbWVtc2V0KHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7Ci12b2lkICptZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgbik7Ci0KIG1lbXB0ciBmcmVlX21lbV9wdHI7CiBtZW1wdHIgZnJlZV9tZW1fZW5kX3B0cjsKIApAQCAtMjE2LDQ1ICsyMjAsNiBAQAogCW91dGIoMHhmZiAmIChwb3MgPj4gMSksIHZpZHBvcnQrMSk7CiB9CiAKLXZvaWQgKm1lbXNldCh2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pCi17Ci0JaW50IGk7Ci0JY2hhciAqc3MgPSBzOwotCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykKLQkJc3NbaV0gPSBjOwotCXJldHVybiBzOwotfQotI2lmZGVmIENPTkZJR19YODZfMzIKLXZvaWQgKm1lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQotewotCWludCBkMCwgZDEsIGQyOwotCWFzbSB2b2xhdGlsZSgKLQkJInJlcCA7IG1vdnNsXG5cdCIKLQkJIm1vdmwgJTQsJSVlY3hcblx0IgotCQkicmVwIDsgbW92c2Jcblx0IgotCQk6ICI9JmMiIChkMCksICI9JkQiIChkMSksICI9JlMiIChkMikKLQkJOiAiMCIgKG4gPj4gMiksICJnIiAobiAmIDMpLCAiMSIgKGRlc3QpLCAiMiIgKHNyYykKLQkJOiAibWVtb3J5Iik7Ci0KLQlyZXR1cm4gZGVzdDsKLX0KLSNlbHNlCi12b2lkICptZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKLXsKLQlsb25nIGQwLCBkMSwgZDI7Ci0JYXNtIHZvbGF0aWxlKAotCQkicmVwIDsgbW92c3Fcblx0IgotCQkibW92cSAlNCwlJXJjeFxuXHQiCi0JCSJyZXAgOyBtb3ZzYlxuXHQiCi0JCTogIj0mYyIgKGQwKSwgIj0mRCIgKGQxKSwgIj0mUyIgKGQyKQotCQk6ICIwIiAobiA+PiAzKSwgImciIChuICYgNyksICIxIiAoZGVzdCksICIyIiAoc3JjKQotCQk6ICJtZW1vcnkiKTsKLQotCXJldHVybiBkZXN0OwotfQotI2VuZGlmCi0KIHN0YXRpYyB2b2lkIGVycm9yKGNoYXIgKngpCiB7CiAJZXJyb3JfcHV0c3RyKCJcblxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvc3RyaW5nLmMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvc3RyaW5nLmMKaW5kZXggZmZiOWM1Yy4uZjNjNTdlMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL3N0cmluZy5jCisrKyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9zdHJpbmcuYwpAQCAtMSwxMSArMSw0NSBAQAogI2luY2x1ZGUgIm1pc2MuaCIKLQotaW50IG1lbWNtcChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBsZW4pCi17Ci0JdTggZGlmZjsKLQlhc20oInJlcGU7IGNtcHNiOyBzZXRueiAlMCIKLQkgICAgOiAiPXFtIiAoZGlmZiksICIrRCIgKHMxKSwgIitTIiAoczIpLCAiK2MiIChsZW4pKTsKLQlyZXR1cm4gZGlmZjsKLX0KLQogI2luY2x1ZGUgIi4uL3N0cmluZy5jIgorCisvKiBtaXNjLmggbWlnaHQgcHVsbCBpbiBzdHJpbmdfMzIuaCB3aGljaCBoYXMgYSBtYWNybyBmb3IgbWVtY3B5LiB1bmRlZiB0aGF0ICovCisjdW5kZWYgbWVtY3B5CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCit2b2lkICptZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKK3sKKwlpbnQgZDAsIGQxLCBkMjsKKwlhc20gdm9sYXRpbGUoCisJCSJyZXAgOyBtb3ZzbFxuXHQiCisJCSJtb3ZsICU0LCUlZWN4XG5cdCIKKwkJInJlcCA7IG1vdnNiXG5cdCIKKwkJOiAiPSZjIiAoZDApLCAiPSZEIiAoZDEpLCAiPSZTIiAoZDIpCisJCTogIjAiIChuID4+IDIpLCAiZyIgKG4gJiAzKSwgIjEiIChkZXN0KSwgIjIiIChzcmMpCisJCTogIm1lbW9yeSIpOworCisJcmV0dXJuIGRlc3Q7Cit9CisjZWxzZQordm9pZCAqbWVtY3B5KHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCit7CisJbG9uZyBkMCwgZDEsIGQyOworCWFzbSB2b2xhdGlsZSgKKwkJInJlcCA7IG1vdnNxXG5cdCIKKwkJIm1vdnEgJTQsJSVyY3hcblx0IgorCQkicmVwIDsgbW92c2Jcblx0IgorCQk6ICI9JmMiIChkMCksICI9JkQiIChkMSksICI9JlMiIChkMikKKwkJOiAiMCIgKG4gPj4gMyksICJnIiAobiAmIDcpLCAiMSIgKGRlc3QpLCAiMiIgKHNyYykKKwkJOiAibWVtb3J5Iik7CisKKwlyZXR1cm4gZGVzdDsKK30KKyNlbmRpZgorCit2b2lkICptZW1zZXQodm9pZCAqcywgaW50IGMsIHNpemVfdCBuKQoreworCWludCBpOworCWNoYXIgKnNzID0gczsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCXNzW2ldID0gYzsKKwlyZXR1cm4gczsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY3B1Y2hlY2suYyBiL2FyY2gveDg2L2Jvb3QvY3B1Y2hlY2suYwppbmRleCBmMGQwYjIwLi4xZmQ3ZDU3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NwdWNoZWNrLmMKKysrIGIvYXJjaC94ODYvYm9vdC9jcHVjaGVjay5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci1mbGFncy5oPgogI2luY2x1ZGUgPGFzbS9yZXF1aXJlZC1mZWF0dXJlcy5oPgogI2luY2x1ZGUgPGFzbS9tc3ItaW5kZXguaD4KKyNpbmNsdWRlICJzdHJpbmcuaCIKIAogc3RhdGljIHUzMiBlcnJfZmxhZ3NbTkNBUElOVFNdOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2VkZC5jIGIvYXJjaC94ODYvYm9vdC9lZGQuYwppbmRleCBjNTAxYTViLi4yMjNlNDI1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2VkZC5jCisrKyBiL2FyY2gveDg2L2Jvb3QvZWRkLmMKQEAgLTE1LDYgKzE1LDcgQEAKIAogI2luY2x1ZGUgImJvb3QuaCIKICNpbmNsdWRlIDxsaW51eC9lZGQuaD4KKyNpbmNsdWRlICJzdHJpbmcuaCIKIAogI2lmIGRlZmluZWQoQ09ORklHX0VERCkgfHwgZGVmaW5lZChDT05GSUdfRUREX01PRFVMRSkKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9tYWluLmMgYi9hcmNoL3g4Ni9ib290L21haW4uYwppbmRleCBjZjYwODNkLi5mZDZjOWYyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L21haW4uYworKysgYi9hcmNoL3g4Ni9ib290L21haW4uYwpAQCAtMTQsNiArMTQsNyBAQAogICovCiAKICNpbmNsdWRlICJib290LmgiCisjaW5jbHVkZSAic3RyaW5nLmgiCiAKIHN0cnVjdCBib290X3BhcmFtcyBib290X3BhcmFtcyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L3JlZ3MuYyBiL2FyY2gveDg2L2Jvb3QvcmVncy5jCmluZGV4IDk1ODAxOWIuLmMwZmIzNTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvcmVncy5jCisrKyBiL2FyY2gveDg2L2Jvb3QvcmVncy5jCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgImJvb3QuaCIKKyNpbmNsdWRlICJzdHJpbmcuaCIKIAogdm9pZCBpbml0cmVncyhzdHJ1Y3QgYmlvc3JlZ3MgKnJlZykKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3Qvc3RyaW5nLmMgYi9hcmNoL3g4Ni9ib290L3N0cmluZy5jCmluZGV4IDU3NGRlZGYuLjUzMzkwNDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3Qvc3RyaW5nLmMKKysrIGIvYXJjaC94ODYvYm9vdC9zdHJpbmcuYwpAQCAtMTQsNiArMTQsMjAgQEAKIAogI2luY2x1ZGUgImJvb3QuaCIKIAorLyoKKyAqIFRoaXMgZmlsZSBnZXRzIGluY2x1ZGVkIGluIGNvbXByZXNzZWQvc3RyaW5nLmMgd2hpY2ggbWlnaHQgcHVsbCBpbgorICogc3RyaW5nXzMyLmggYW5kIHdoaWNoIGluIHR1cm4gbWFwcyBtZW1jbXAgdG8gX19idWlsdGluX21lbWNtcCgpLiBVbmRvCisgKiB0aGF0IGZpcnN0LgorICovCisjdW5kZWYgbWVtY21wCitpbnQgbWVtY21wKGNvbnN0IHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IGxlbikKK3sKKwl1OCBkaWZmOworCWFzbSgicmVwZTsgY21wc2I7IHNldG56ICUwIgorCSAgICA6ICI9cW0iIChkaWZmKSwgIitEIiAoczEpLCAiK1MiIChzMiksICIrYyIgKGxlbikpOworCXJldHVybiBkaWZmOworfQorCiBpbnQgc3RyY21wKGNvbnN0IGNoYXIgKnN0cjEsIGNvbnN0IGNoYXIgKnN0cjIpCiB7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqczEgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXN0cjE7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L3N0cmluZy5oIGIvYXJjaC94ODYvYm9vdC9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjVlODIwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvYm9vdC9zdHJpbmcuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIEJPT1RfU1RSSU5HX0gKKyNkZWZpbmUgQk9PVF9TVFJJTkdfSAorCisvKiBVbmRlZiBhbnkgb2YgdGhlc2UgbWFjcm9zIGNvbWluZyBmcm9tIHN0cmluZ18zMi5oLiAqLworI3VuZGVmIG1lbWNweQorI3VuZGVmIG1lbXNldAorI3VuZGVmIG1lbWNtcAorCit2b2lkICptZW1jcHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4pOwordm9pZCAqbWVtc2V0KHZvaWQgKmRzdCwgaW50IGMsIHNpemVfdCBsZW4pOworaW50IG1lbWNtcChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBsZW4pOworCisvKgorICogQWNjZXNzIGJ1aWx0aW4gdmVyc2lvbiBieSBkZWZhdWx0LiBJZiBvbmUgbmVlZHMgdG8gdXNlIG9wdGltaXplZCB2ZXJzaW9uLAorICogZG8gInVuZGVmIG1lbWNweSIgaW4gLmMgZmlsZSBhbmQgbGluayBhZ2FpbnN0IHJpZ2h0IHN0cmluZy5jCisgKi8KKyNkZWZpbmUgbWVtY3B5KGQscyxsKSBfX2J1aWx0aW5fbWVtY3B5KGQscyxsKQorI2RlZmluZSBtZW1zZXQoZCxjLGwpIF9fYnVpbHRpbl9tZW1zZXQoZCxjLGwpCisjZGVmaW5lIG1lbWNtcAlfX2J1aWx0aW5fbWVtY21wCisKKyNlbmRpZiAvKiBCT09UX1NUUklOR19IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L3ZpZGVvLXZlc2EuYyBiL2FyY2gveDg2L2Jvb3QvdmlkZW8tdmVzYS5jCmluZGV4IDExZThjNmUuLmJhM2UxMDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvdmlkZW8tdmVzYS5jCisrKyBiL2FyY2gveDg2L2Jvb3QvdmlkZW8tdmVzYS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSAiYm9vdC5oIgogI2luY2x1ZGUgInZpZGVvLmgiCiAjaW5jbHVkZSAidmVzYS5oIgorI2luY2x1ZGUgInN0cmluZy5oIgogCiAvKiBWRVNBIGluZm9ybWF0aW9uICovCiBzdGF0aWMgc3RydWN0IHZlc2FfZ2VuZXJhbF9pbmZvIHZnaW5mbzsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NvbmZpZ3MvaTM4Nl9kZWZjb25maWcgYi9hcmNoL3g4Ni9jb25maWdzL2kzODZfZGVmY29uZmlnCmluZGV4IGE3ZmVmMjYuLjYxOWU3ZjcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NvbmZpZ3MvaTM4Nl9kZWZjb25maWcKKysrIGIvYXJjaC94ODYvY29uZmlncy9pMzg2X2RlZmNvbmZpZwpAQCAtNjAsNyArNjAsNiBAQAogQ09ORklHX0hJQkVSTkFUSU9OPXkKIENPTkZJR19QTV9ERUJVRz15CiBDT05GSUdfUE1fVFJBQ0VfUlRDPXkKLUNPTkZJR19BQ1BJX1BST0NGUz15CiBDT05GSUdfQUNQSV9ET0NLPXkKIENPTkZJR19DUFVfRlJFUT15CiAjIENPTkZJR19DUFVfRlJFUV9TVEFUIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NvbmZpZ3MveDg2XzY0X2RlZmNvbmZpZyBiL2FyY2gveDg2L2NvbmZpZ3MveDg2XzY0X2RlZmNvbmZpZwppbmRleCBjMTExOWQ0Li42MTgxYzY5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9jb25maWdzL3g4Nl82NF9kZWZjb25maWcKKysrIGIvYXJjaC94ODYvY29uZmlncy94ODZfNjRfZGVmY29uZmlnCkBAIC01OCw3ICs1OCw2IEBACiBDT05GSUdfSElCRVJOQVRJT049eQogQ09ORklHX1BNX0RFQlVHPXkKIENPTkZJR19QTV9UUkFDRV9SVEM9eQotQ09ORklHX0FDUElfUFJPQ0ZTPXkKIENPTkZJR19BQ1BJX0RPQ0s9eQogQ09ORklHX0NQVV9GUkVRPXkKICMgQ09ORklHX0NQVV9GUkVRX1NUQVQgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IGE4ZmVlMDcuLjRhY2RkYzQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTUsNCArNSw1IEBACiBnZW5oZHIteSArPSB1bmlzdGRfeDMyLmgKIAogZ2VuZXJpYy15ICs9IGNsa2Rldi5oCitnZW5lcmljLXkgKz0gY3B1dGltZS5oCiBnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Nsb2Nrc291cmNlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbG9ja3NvdXJjZS5oCmluZGV4IDE2YTU3ZjQuLmVkYTgxZGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Nsb2Nrc291cmNlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY2xvY2tzb3VyY2UuaApAQCAtMyw4ICszLDYgQEAKICNpZm5kZWYgX0FTTV9YODZfQ0xPQ0tTT1VSQ0VfSAogI2RlZmluZSBfQVNNX1g4Nl9DTE9DS1NPVVJDRV9ICiAKLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0KICNkZWZpbmUgVkNMT0NLX05PTkUgMCAgLyogTm8gdkRTTyBjbG9jayBhdmFpbGFibGUuCSovCiAjZGVmaW5lIFZDTE9DS19UU0MgIDEgIC8qIHZEU08gc2hvdWxkIHVzZSB2cmVhZF90c2MuCSovCiAjZGVmaW5lIFZDTE9DS19IUEVUIDIgIC8qIHZEU08gc2hvdWxkIHVzZSB2cmVhZF9ocGV0LgkqLwpAQCAtMTQsNiArMTIsNCBAQAogCWludCB2Y2xvY2tfbW9kZTsKIH07CiAKLSNlbmRpZiAvKiBDT05GSUdfWDg2XzY0ICovCi0KICNlbmRpZiAvKiBfQVNNX1g4Nl9DTE9DS1NPVVJDRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKaW5kZXggYmM1MDdkNy4uZTI2NWZmOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaApAQCAtMzcsNyArMzcsNyBAQAogI2RlZmluZSBYODZfRkVBVFVSRV9QQVQJCSgwKjMyKzE2KSAvKiBQYWdlIEF0dHJpYnV0ZSBUYWJsZSAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9QU0UzNgkoMCozMisxNykgLyogMzYtYml0IFBTRXMgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfUE4JCSgwKjMyKzE4KSAvKiBQcm9jZXNzb3Igc2VyaWFsIG51bWJlciAqLwotI2RlZmluZSBYODZfRkVBVFVSRV9DTEZMU0gJKDAqMzIrMTkpIC8qICJjbGZsdXNoIiBDTEZMVVNIIGluc3RydWN0aW9uICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0NMRkxVU0gJKDAqMzIrMTkpIC8qIENMRkxVU0ggaW5zdHJ1Y3Rpb24gKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfRFMJCSgwKjMyKzIxKSAvKiAiZHRzIiBEZWJ1ZyBTdG9yZSAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9BQ1BJCSgwKjMyKzIyKSAvKiBBQ1BJIHZpYSBNU1IgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfTU1YCQkoMCozMisyMykgLyogTXVsdGltZWRpYSBFeHRlbnNpb25zICovCkBAIC0zMTgsNyArMzE4LDcgQEAKICNkZWZpbmUgY3B1X2hhc19wbW1fZW5hYmxlZAlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfUE1NX0VOKQogI2RlZmluZSBjcHVfaGFzX2RzCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfRFMpCiAjZGVmaW5lIGNwdV9oYXNfcGVicwkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1BFQlMpCi0jZGVmaW5lIGNwdV9oYXNfY2xmbHVzaAkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0NMRkxTSCkKKyNkZWZpbmUgY3B1X2hhc19jbGZsdXNoCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQ0xGTFVTSCkKICNkZWZpbmUgY3B1X2hhc19idHMJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9CVFMpCiAjZGVmaW5lIGNwdV9oYXNfZ2JwYWdlcwkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0dCUEFHRVMpCiAjZGVmaW5lIGNwdV9oYXNfYXJjaF9wZXJmbW9uCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BUkNIX1BFUkZNT04pCkBAIC01NDYsNiArNTQ2LDEzIEBACiAjZGVmaW5lIHN0YXRpY19jcHVfaGFzX2J1ZyhiaXQpCXN0YXRpY19jcHVfaGFzKChiaXQpKQogI2RlZmluZSBib290X2NwdV9oYXNfYnVnKGJpdCkJY3B1X2hhc19idWcoJmJvb3RfY3B1X2RhdGEsIChiaXQpKQogCisjZGVmaW5lIE1BWF9DUFVfRkVBVFVSRVMJKE5DQVBJTlRTICogMzIpCisjZGVmaW5lIGNwdV9oYXZlX2ZlYXR1cmUJYm9vdF9jcHVfaGFzCisKKyNkZWZpbmUgQ1BVX0ZFQVRVUkVfVFlQRUZNVAkieDg2LHZlbiUwNFhmYW0lMDRYbW9kJTA0WCIKKyNkZWZpbmUgQ1BVX0ZFQVRVUkVfVFlQRVZBTAlib290X2NwdV9kYXRhLng4Nl92ZW5kb3IsIGJvb3RfY3B1X2RhdGEueDg2LCBcCisJCQkJYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwKKwogI2VuZGlmIC8qIGRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19BU1NFTUJMWV9fKSAqLwogCiAjZW5kaWYgLyogX0FTTV9YODZfQ1BVRkVBVFVSRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHV0aW1lLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNjhhZDcuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1dGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NwdXRpbWUuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VsZi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZWxmLmgKaW5kZXggOWM5OTljMS4uMmM3MTE4MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZWxmLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZWxmLmgKQEAgLTI4MSwxNiArMjgxLDEyIEBACiAKICNkZWZpbmUgU1RBQ0tfUk5EX01BU0sgKDB4N2ZmKQogCi0jZGVmaW5lIFZEU09fSElHSF9CQVNFCQkoX19maXhfdG9fdmlydChGSVhfVkRTTykpCi0KICNkZWZpbmUgQVJDSF9ETElORk8JCUFSQ0hfRExJTkZPX0lBMzIodmRzb19lbmFibGVkKQogCiAvKiB1cGRhdGUgQVRfVkVDVE9SX1NJWkVfQVJDSCBpZiB0aGUgbnVtYmVyIG9mIE5FV19BVVhfRU5UIGVudHJpZXMgY2hhbmdlcyAqLwogCiAjZWxzZSAvKiBDT05GSUdfWDg2XzMyICovCiAKLSNkZWZpbmUgVkRTT19ISUdIX0JBU0UJCTB4ZmZmZmUwMDBVIC8qIENPTkZJR19DT01QQVRfVkRTTyBhZGRyZXNzICovCi0KIC8qIDFHQiBmb3IgNjRiaXQsIDhNQiBmb3IgMzJiaXQgKi8KICNkZWZpbmUgU1RBQ0tfUk5EX01BU0sgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX0FERFIzMikgPyAweDdmZiA6IDB4M2ZmZmZmKQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9maXhtYXAuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZpeG1hcC5oCmluZGV4IDcyNTJjZDMuLjhkY2QzNWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZpeG1hcC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZpeG1hcC5oCkBAIC00MCwxNSArNDAsOCBAQAogICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBfX0ZJWEFERFJfVE9QOwogI2RlZmluZSBGSVhBRERSX1RPUAkoKHVuc2lnbmVkIGxvbmcpX19GSVhBRERSX1RPUCkKLQotI2RlZmluZSBGSVhBRERSX1VTRVJfU1RBUlQgICAgIF9fZml4X3RvX3ZpcnQoRklYX1ZEU08pCi0jZGVmaW5lIEZJWEFERFJfVVNFUl9FTkQgICAgICAgX19maXhfdG9fdmlydChGSVhfVkRTTyAtIDEpCiAjZWxzZQogI2RlZmluZSBGSVhBRERSX1RPUAkoVlNZU0NBTExfRU5ELVBBR0VfU0laRSkKLQotLyogT25seSBjb3ZlcnMgMzJiaXQgdnN5c2NhbGxzIGN1cnJlbnRseS4gTmVlZCBhbm90aGVyIHNldCBmb3IgNjRiaXQuICovCi0jZGVmaW5lIEZJWEFERFJfVVNFUl9TVEFSVAkoKHVuc2lnbmVkIGxvbmcpVlNZU0NBTEwzMl9WU1lTQ0FMTCkKLSNkZWZpbmUgRklYQUREUl9VU0VSX0VORAkoRklYQUREUl9VU0VSX1NUQVJUICsgUEFHRV9TSVpFKQogI2VuZGlmCiAKIApAQCAtNzQsNyArNjcsNiBAQAogZW51bSBmaXhlZF9hZGRyZXNzZXMgewogI2lmZGVmIENPTkZJR19YODZfMzIKIAlGSVhfSE9MRSwKLQlGSVhfVkRTTywKICNlbHNlCiAJVlNZU0NBTExfTEFTVF9QQUdFLAogCVZTWVNDQUxMX0ZJUlNUX1BBR0UgPSBWU1lTQ0FMTF9MQVNUX1BBR0UKQEAgLTk4LDEyICs5MCw2IEBACiAJRklYX0lPX0FQSUNfQkFTRV8wLAogCUZJWF9JT19BUElDX0JBU0VfRU5EID0gRklYX0lPX0FQSUNfQkFTRV8wICsgTUFYX0lPX0FQSUNTIC0gMSwKICNlbmRpZgotI2lmZGVmIENPTkZJR19YODZfVklTV1NfQVBJQwotCUZJWF9DT19DUFUsCS8qIENvYmFsdCB0aW1lciAqLwotCUZJWF9DT19BUElDLAkvKiBDb2JhbHQgQVBJQyBSZWRpcmVjdGlvbiBUYWJsZSAqLwotCUZJWF9MSV9QQ0lBLAkvKiBMaXRoaXVtIFBDSSBCcmlkZ2UgQSAqLwotCUZJWF9MSV9QQ0lCLAkvKiBMaXRoaXVtIFBDSSBCcmlkZ2UgQiAqLwotI2VuZGlmCiAJRklYX1JPX0lEVCwJLyogVmlydHVhbCBtYXBwaW5nIGZvciByZWFkLW9ubHkgSURUICovCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogCUZJWF9LTUFQX0JFR0lOLAkvKiByZXNlcnZlZCBwdGUncyBmb3IgdGVtcG9yYXJ5IGtlcm5lbCBtYXBwaW5ncyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZmxvcHB5LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mbG9wcHkuaAppbmRleCBkM2Q3NDY5Li4xYzdlZWZlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mbG9wcHkuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mbG9wcHkuaApAQCAtMTQ1LDEwICsxNDUsMTAgQEAKIHsKIAlpZiAoY2FuX3VzZV92aXJ0dWFsX2RtYSkKIAkJcmV0dXJuIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9oYXJkaW50LAotCQkJCSAgIElSUUZfRElTQUJMRUQsICJmbG9wcHkiLCBOVUxMKTsKKwkJCQkgICAwLCAiZmxvcHB5IiwgTlVMTCk7CiAJZWxzZQogCQlyZXR1cm4gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2ludGVycnVwdCwKLQkJCQkgICBJUlFGX0RJU0FCTEVELCAiZmxvcHB5IiwgTlVMTCk7CisJCQkJICAgMCwgImZsb3BweSIsIE5VTEwpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBkbWFfbWVtX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2hhcmRpcnEuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2hhcmRpcnEuaAppbmRleCBhYjBhZTFhLi4yMzA4NTNkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaGFyZGlycS5oCkBAIC0zMyw2ICszMyw5IEBACiAjaWZkZWYgQ09ORklHX1g4Nl9NQ0VfVEhSRVNIT0xECiAJdW5zaWduZWQgaW50IGlycV90aHJlc2hvbGRfY291bnQ7CiAjZW5kaWYKKyNpZiBJU19FTkFCTEVEKENPTkZJR19IWVBFUlYpIHx8IGRlZmluZWQoQ09ORklHX1hFTikKKwl1bnNpZ25lZCBpbnQgaXJxX2h2X2NhbGxiYWNrX2NvdW50OworI2VuZGlmCiB9IF9fX19jYWNoZWxpbmVfYWxpZ25lZCBpcnFfY3B1c3RhdF90OwogCiBERUNMQVJFX1BFUl9DUFVfU0hBUkVEX0FMSUdORUQoaXJxX2NwdXN0YXRfdCwgaXJxX3N0YXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaHdfaXJxLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9od19pcnEuaAppbmRleCA2N2Q2OWI4Li5hMzA3Yjc1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9od19pcnEuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9od19pcnEuaApAQCAtOTgsNyArOTgsNiBAQAogI2RlZmluZSBJT19BUElDX0lSUSh4KSAoKCh4KSA+PSBOUl9JUlFTX0xFR0FDWSkgfHwgKCgxPDwoeCkpICYgaW9fYXBpY19pcnFzKSkKIGV4dGVybiB1bnNpZ25lZCBsb25nIGlvX2FwaWNfaXJxczsKIAotZXh0ZXJuIHZvaWQgaW5pdF9WSVNXU19BUElDX2lycXModm9pZCk7CiBleHRlcm4gdm9pZCBzZXR1cF9JT19BUElDKHZvaWQpOwogZXh0ZXJuIHZvaWQgZGlzYWJsZV9JT19BUElDKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXpvbmVfMzIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV8zMi5oCmluZGV4IDhhOWIzZTIuLjFlYzk5MGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV8zMi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV8zMi5oCkBAIC0xMSw5ICsxMSw2IEBACiAjaWZkZWYgQ09ORklHX05VTUEKIGV4dGVybiBzdHJ1Y3QgcGdsaXN0X2RhdGEgKm5vZGVfZGF0YVtdOwogI2RlZmluZSBOT0RFX0RBVEEobmlkKQkobm9kZV9kYXRhW25pZF0pCi0KLSNpbmNsdWRlIDxhc20vbnVtYXEuaD4KLQogI2VuZGlmIC8qIENPTkZJR19OVU1BICovCiAKICNpZmRlZiBDT05GSUdfRElTQ09OVElHTUVNCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tcHNwZWMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21wc3BlYy5oCmluZGV4IDNlNmI0OTIuLmY1YTYxNzkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21wc3BlYy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21wc3BlYy5oCkBAIC0yNSwxMiArMjUsNiBAQAogCiBleHRlcm4gdW5zaWduZWQgaW50IGRlZl90b19iaWdzbXA7CiAKLSNpZmRlZiBDT05GSUdfWDg2X05VTUFRCi1leHRlcm4gaW50IG1wX2J1c19pZF90b19ub2RlW01BWF9NUF9CVVNTRVNdOwotZXh0ZXJuIGludCBtcF9idXNfaWRfdG9fbG9jYWxbTUFYX01QX0JVU1NFU107Ci1leHRlcm4gaW50IHF1YWRfbG9jYWxfdG9fbXBfYnVzX2lkIFtOUl9DUFVTLzRdWzRdOwotI2VuZGlmCi0KICNlbHNlIC8qIENPTkZJR19YODZfNjQ6ICovCiAKICNkZWZpbmUgTUFYX01QX0JVU1NFUwkJMjU2CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc2h5cGVydi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbXNoeXBlcnYuaAppbmRleCBjZDljNDE5Li5jMTYzMjE1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc2h5cGVydi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zaHlwZXJ2LmgKQEAgLTIsNiArMiw3IEBACiAjZGVmaW5lIF9BU01fWDg2X01TSFlQRVJfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxhc20vaHlwZXJ2Lmg+CiAKIHN0cnVjdCBtc19oeXBlcnZfaW5mbyB7CkBAIC0xNiw2ICsxNyw3IEBACiAjZGVmaW5lIHRyYWNlX2h5cGVydl9jYWxsYmFja192ZWN0b3IgaHlwZXJ2X2NhbGxiYWNrX3ZlY3RvcgogI2VuZGlmCiB2b2lkIGh5cGVydl92ZWN0b3JfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci12b2lkIGh2X3JlZ2lzdGVyX3ZtYnVzX2hhbmRsZXIoaW50IGlycSwgaXJxX2hhbmRsZXJfdCBoYW5kbGVyKTsKK3ZvaWQgaHZfc2V0dXBfdm1idXNfaXJxKHZvaWQgKCpoYW5kbGVyKSh2b2lkKSk7Cit2b2lkIGh2X3JlbW92ZV92bWJ1c19pcnEodm9pZCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbnVtYXEuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWFxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYjNjMzIuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbnVtYXEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKgotICogV3JpdHRlbiBieTogUGF0cmljaWEgR2F1Z2hlbiwgSUJNIENvcnBvcmF0aW9uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyLCBJQk0gQ29ycC4KLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqIFNlbmQgZmVlZGJhY2sgdG8gPGdvbmVAdXMuaWJtLmNvbT4KLSAqLwotCi0jaWZuZGVmIF9BU01fWDg2X05VTUFRX0gKLSNkZWZpbmUgX0FTTV9YODZfTlVNQVFfSAotCi0jaWZkZWYgQ09ORklHX1g4Nl9OVU1BUQotCi1leHRlcm4gaW50IGZvdW5kX251bWFxOwotZXh0ZXJuIGludCBudW1hcV9udW1hX2luaXQodm9pZCk7Ci1leHRlcm4gaW50IHBjaV9udW1hcV9pbml0KHZvaWQpOwotCi1leHRlcm4gdm9pZCAqeHF1YWRfcG9ydGlvOwotCi0jZGVmaW5lIFhRVUFEX1BPUlRJT19CQVNFIDB4ZmU0MDAwMDAKLSNkZWZpbmUgWFFVQURfUE9SVElPX1FVQUQgMHg0MDAwMCAgLyogMjU2ayBwZXIgcXVhZC4gKi8KLSNkZWZpbmUgWFFVQURfUE9SVF9BRERSKHBvcnQsIHF1YWQpICh4cXVhZF9wb3J0aW8gKyAoWFFVQURfUE9SVElPX1FVQUQqcXVhZCkgKyBwb3J0KQotCi0vKgotICogU1lTX0NGR19EQVRBX1BSSVZfQUREUiwgc3RydWN0IGVhY2hxdWFkbWVtLCBhbmQgc3RydWN0IHN5c19jZmdfZGF0YSBhcmUgdGhlCi0gKi8KLSNkZWZpbmUgU1lTX0NGR19EQVRBX1BSSVZfQUREUgkJMHgwMDA5ZDAwMCAvKiBwbGFjZSBmb3Igc2NkIGluIHByaXZhdGUKLQkJCQkJCSAgICAgIHF1YWQgc3BhY2UgKi8KLQotLyoKLSAqIENvbW11bmljYXRpb24gYXJlYSBmb3IgZWFjaCBwcm9jZXNzb3Igb24gbHlueGVyLXByb2Nlc3NvciB0ZXN0cy4KLSAqCi0gKiBOT1RFOiBJZiB5b3UgY2hhbmdlIHRoZSBzaXplIG9mIHRoaXMgZWFjaHByb2Mgc3RydWN0dXJlIHlvdSBuZWVkCi0gKiAgICAgICB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gZm9yIEVBQ0hfUVVBRF9TSVpFLgotICovCi1zdHJ1Y3QgZWFjaHF1YWRtZW0gewotCXVuc2lnbmVkIGludAlwcml2X21lbV9zdGFydDsJCS8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhpcyAqLwotCQkJCQkJLyogcXVhZCdzIHByaXZhdGUgbWVtb3J5LiAqLwotCQkJCQkJLyogVGhpcyBpcyBhbHdheXMgMC4gKi8KLQkJCQkJCS8qIEluIE1CLiAqLwotCXVuc2lnbmVkIGludAlwcml2X21lbV9zaXplOwkJLyogU2l6ZSBvZiB0aGlzIHF1YWQncyAqLwotCQkJCQkJLyogcHJpdmF0ZSBtZW1vcnkuICovCi0JCQkJCQkvKiBJbiBNQi4gKi8KLQl1bnNpZ25lZCBpbnQJbG93X3NocmRfbWVtX3N0cnBfc3RhcnQ7LyogU3RhcnRpbmcgYWRkcmVzcyBvZiB0aGlzICovCi0JCQkJCQkvKiBxdWFkJ3MgbG93IHNoYXJlZCBibG9jayAqLwotCQkJCQkJLyogKHVudHJhbnNsYXRlZCkuICovCi0JCQkJCQkvKiBJbiBNQi4gKi8KLQl1bnNpZ25lZCBpbnQJbG93X3NocmRfbWVtX3N0YXJ0OwkvKiBTdGFydGluZyBhZGRyZXNzIG9mIHRoaXMgKi8KLQkJCQkJCS8qIHF1YWQncyBsb3cgc2hhcmVkIG1lbW9yeSAqLwotCQkJCQkJLyogKHVudHJhbnNsYXRlZCkuICovCi0JCQkJCQkvKiBJbiBNQi4gKi8KLQl1bnNpZ25lZCBpbnQJbG93X3NocmRfbWVtX3NpemU7CS8qIFNpemUgb2YgdGhpcyBxdWFkJ3MgbG93ICovCi0JCQkJCQkvKiBzaGFyZWQgbWVtb3J5LiAqLwotCQkJCQkJLyogSW4gTUIuICovCi0JdW5zaWduZWQgaW50CWxtbWlvX2NvcGJfc3RhcnQ7CS8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhpcyAqLwotCQkJCQkJLyogcXVhZCdzIGxvY2FsIG1lbW9yeSAqLwotCQkJCQkJLyogbWFwcGVkIEkvTyBpbiB0aGUgKi8KLQkJCQkJCS8qIGNvbXBhdGliaWxpdHkgT1BCLiAqLwotCQkJCQkJLyogSW4gTUIuICovCi0JdW5zaWduZWQgaW50CWxtbWlvX2NvcGJfc2l6ZTsJLyogU2l6ZSBvZiB0aGlzIHF1YWQncyBsb2NhbCAqLwotCQkJCQkJLyogbWVtb3J5IG1hcHBlZCBJL08gaW4gdGhlICovCi0JCQkJCQkvKiBjb21wYXRpYmlsaXR5IE9QQi4gKi8KLQkJCQkJCS8qIEluIE1CLiAqLwotCXVuc2lnbmVkIGludAlsbW1pb19ub3BiX3N0YXJ0OwkvKiBTdGFydGluZyBhZGRyZXNzIG9mIHRoaXMgKi8KLQkJCQkJCS8qIHF1YWQncyBsb2NhbCBtZW1vcnkgKi8KLQkJCQkJCS8qIG1hcHBlZCBJL08gaW4gdGhlICovCi0JCQkJCQkvKiBub24tY29tcGF0aWJpbGl0eSBPUEIuICovCi0JCQkJCQkvKiBJbiBNQi4gKi8KLQl1bnNpZ25lZCBpbnQJbG1taW9fbm9wYl9zaXplOwkvKiBTaXplIG9mIHRoaXMgcXVhZCdzIGxvY2FsICovCi0JCQkJCQkvKiBtZW1vcnkgbWFwcGVkIEkvTyBpbiB0aGUgKi8KLQkJCQkJCS8qIG5vbi1jb21wYXRpYmlsaXR5IE9QQi4gKi8KLQkJCQkJCS8qIEluIE1CLiAqLwotCXVuc2lnbmVkIGludAlpb19hcGljXzBfc3RhcnQ7CS8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgSS9PICovCi0JCQkJCQkvKiBBUElDIDAuICovCi0JdW5zaWduZWQgaW50CWlvX2FwaWNfMF9zejsJCS8qIFNpemUgSS9PIEFQSUMgMC4gKi8KLQl1bnNpZ25lZCBpbnQJaW9fYXBpY18xX3N0YXJ0OwkvKiBTdGFydGluZyBhZGRyZXNzIG9mIEkvTyAqLwotCQkJCQkJLyogQVBJQyAxLiAqLwotCXVuc2lnbmVkIGludAlpb19hcGljXzFfc3o7CQkvKiBTaXplIEkvTyBBUElDIDEuICovCi0JdW5zaWduZWQgaW50CWhpX3NocmRfbWVtX3N0YXJ0OwkvKiBTdGFydGluZyBhZGRyZXNzIG9mIHRoaXMgKi8KLQkJCQkJCS8qIHF1YWQncyBoaWdoIHNoYXJlZCBtZW1vcnkuKi8KLQkJCQkJCS8qIEluIE1CLiAqLwotCXVuc2lnbmVkIGludAloaV9zaHJkX21lbV9zaXplOwkvKiBTaXplIG9mIHRoaXMgcXVhZCdzIGhpZ2ggKi8KLQkJCQkJCS8qIHNoYXJlZCBtZW1vcnkuICovCi0JCQkJCQkvKiBJbiBNQi4gKi8KLQl1bnNpZ25lZCBpbnQJbXBzX3RhYmxlX2FkZHI7CQkvKiBBZGRyZXNzIG9mIHRoaXMgcXVhZCdzICovCi0JCQkJCQkvKiBNUFMgdGFibGVzIGZyb20gQklPUywgKi8KLQkJCQkJCS8qIGluIHN5c3RlbSBzcGFjZS4qLwotCXVuc2lnbmVkIGludAlsY2xfTURDX3Bpb19hZGRyOwkvKiBQb3J0LUkvTyBhZGRyZXNzIGZvciAqLwotCQkJCQkJLyogbG9jYWwgYWNjZXNzIG9mIE1EQy4gKi8KLQl1bnNpZ25lZCBpbnQJcm10X01EQ19tbXBpb19hZGRyOwkvKiBNTS1Qb3J0LUkvTyBhZGRyZXNzIGZvciAqLwotCQkJCQkJLyogcmVtb3RlIGFjY2VzcyBvZiBNREMuICovCi0JdW5zaWduZWQgaW50CW1tX3BvcnRfaW9fc3RhcnQ7CS8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhpcyAqLwotCQkJCQkJLyogcXVhZCdzIG1lbW9yeSBtYXBwZWQgUG9ydCAqLwotCQkJCQkJLyogSS9PIHNwYWNlLiAqLwotCXVuc2lnbmVkIGludAltbV9wb3J0X2lvX3NpemU7CS8qIFNpemUgb2YgdGhpcyBxdWFkJ3MgbWVtb3J5Ki8KLQkJCQkJCS8qIG1hcHBlZCBQb3J0IEkvTyBzcGFjZS4gKi8KLQl1bnNpZ25lZCBpbnQJbW1fcm10X2lvX2FwaWNfc3RhcnQ7CS8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhpcyAqLwotCQkJCQkJLyogcXVhZCdzIG1lbW9yeSBtYXBwZWQgKi8KLQkJCQkJCS8qIHJlbW90ZSBJL08gQVBJQyBzcGFjZS4gKi8KLQl1bnNpZ25lZCBpbnQJbW1fcm10X2lvX2FwaWNfc2l6ZTsJLyogU2l6ZSBvZiB0aGlzIHF1YWQncyBtZW1vcnkqLwotCQkJCQkJLyogbWFwcGVkIHJlbW90ZSBJL08gQVBJQyAqLwotCQkJCQkJLyogc3BhY2UuICovCi0JdW5zaWduZWQgaW50CW1tX2lzYV9zdGFydDsJCS8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhpcyAqLwotCQkJCQkJLyogcXVhZCdzIG1lbW9yeSBtYXBwZWQgSVNBICovCi0JCQkJCQkvKiBzcGFjZSAoY29udGFpbnMgTURDICovCi0JCQkJCQkvKiBtZW1vcnkgc3BhY2UpLiAqLwotCXVuc2lnbmVkIGludAltbV9pc2Ffc2l6ZTsJCS8qIFNpemUgb2YgdGhpcyBxdWFkJ3MgbWVtb3J5Ki8KLQkJCQkJCS8qIG1hcHBlZCBJU0Egc3BhY2UgKGNvbnRhaW5zKi8KLQkJCQkJCS8qIE1EQyBtZW1vcnkgc3BhY2UpLiAqLwotCXVuc2lnbmVkIGludAlybXRfcW1pX2FkZHI7CQkvKiBSZW1vdGUgYWRkciB0byBhY2Nlc3MgUU1JLiovCi0JdW5zaWduZWQgaW50CWxjbF9xbWlfYWRkcjsJCS8qIExvY2FsIGFkZHIgdG8gYWNjZXNzIFFNSS4gKi8KLX07Ci0KLS8qCi0gKiBOb3RlOiBUaGlzIHN0cnVjdHVyZSBtdXN0IGJlIE5PVCBiZSBjaGFuZ2VkIHVubGVzcyB0aGUgbXVsdGlwcm9jIGFuZAotICogT1MgYXJlIGNoYW5nZWQgdG8gcmVmbGVjdCB0aGUgbmV3IHN0cnVjdHVyZS4KLSAqLwotc3RydWN0IHN5c19jZmdfZGF0YSB7Ci0JdW5zaWduZWQgaW50CXF1YWRfaWQ7Ci0JdW5zaWduZWQgaW50CWJzcF9wcm9jX2lkOyAvKiBCb290IFN0cmFwIFByb2Nlc3NvciBpbiB0aGlzIHF1YWQuICovCi0JdW5zaWduZWQgaW50CXNjZF92ZXJzaW9uOyAvKiBWZXJzaW9uIG51bWJlciBvZiB0aGlzIHRhYmxlLiAqLwotCXVuc2lnbmVkIGludAlmaXJzdF9xdWFkX2lkOwotCXVuc2lnbmVkIGludAlxdWFkc19wcmVzZW50MzFfMDsgLyogMSBiaXQgZm9yIGVhY2ggcXVhZCAqLwotCXVuc2lnbmVkIGludAlxdWFkc19wcmVzZW50NjNfMzI7IC8qIDEgYml0IGZvciBlYWNoIHF1YWQgKi8KLQl1bnNpZ25lZCBpbnQJY29uZmlnX2ZsYWdzOwotCXVuc2lnbmVkIGludAlib290X2ZsYWdzOwotCXVuc2lnbmVkIGludAljc3Jfc3RhcnRfYWRkcjsgLyogQWJzb2x1dGUgdmFsdWUgKG5vdCBpbiBNQikgKi8KLQl1bnNpZ25lZCBpbnQJY3NyX3NpemU7IC8qIEFic29sdXRlIHZhbHVlIChub3QgaW4gTUIpICovCi0JdW5zaWduZWQgaW50CWxjbF9hcGljX3N0YXJ0X2FkZHI7IC8qIEFic29sdXRlIHZhbHVlIChub3QgaW4gTUIpICovCi0JdW5zaWduZWQgaW50CWxjbF9hcGljX3NpemU7IC8qIEFic29sdXRlIHZhbHVlIChub3QgaW4gTUIpICovCi0JdW5zaWduZWQgaW50CWxvd19zaHJkX21lbV9iYXNlOyAvKiAwIG9yIDUxMk1CIG9yIDFHQiAqLwotCXVuc2lnbmVkIGludAlsb3dfc2hyZF9tZW1fcXVhZF9vZmZzZXQ7IC8qIDAsMTI4TSwyNTZNLDUxMk0sMUcgKi8KLQkJCQkJLyogbWF5IG5vdCBiZSB0b3RhbGx5IHBvcHVsYXRlZCAqLwotCXVuc2lnbmVkIGludAlzcGxpdF9tZW1fZW5ibDsgLyogMCBmb3Igbm8gbG93IHNoYXJlZCBtZW1vcnkgKi8KLQl1bnNpZ25lZCBpbnQJbW1pb19zejsgLyogU2l6ZSBvZiB0b3RhbCBzeXN0ZW0gbWVtb3J5IG1hcHBlZCBJL08gKi8KLQkJCQkgLyogKGluIE1CKS4gKi8KLQl1bnNpZ25lZCBpbnQJcXVhZF9zcGluX2xvY2s7IC8qIFNwYXJlIGxvY2F0aW9uIHVzZWQgZm9yIHF1YWQgKi8KLQkJCQkJLyogYnJpbmd1cC4gKi8KLQl1bnNpZ25lZCBpbnQJbm9uemVybzU1OyAvKiBGb3IgY2hlY2tzdW1taW5nLiAqLwotCXVuc2lnbmVkIGludAlub256ZXJvYWE7IC8qIEZvciBjaGVja3N1bW1pbmcuICovCi0JdW5zaWduZWQgaW50CXNjZF9tYWdpY19udW1iZXI7Ci0JdW5zaWduZWQgaW50CXN5c3RlbV90eXBlOwotCXVuc2lnbmVkIGludAljaGVja3N1bTsKLQkvKgotCSAqCW1lbW9yeSBjb25maWd1cmF0aW9uIGFyZWEgZm9yIGVhY2ggcXVhZAotCSAqLwotCXN0cnVjdAkJZWFjaHF1YWRtZW0gZXFbTUFYX05VTU5PREVTXTsJLyogaW5kZXhlZCBieSBxdWFkIGlkICovCi19OwotCi12b2lkIG51bWFxX3RzY19kaXNhYmxlKHZvaWQpOwotCi0jZW5kaWYgLyogQ09ORklHX1g4Nl9OVU1BUSAqLwotI2VuZGlmIC8qIF9BU01fWDg2X05VTUFRX0ggKi8KLQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGNpLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wY2kuaAppbmRleCAxYWM2MTE0Li45NmFlNGY0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wY2kuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wY2kuaApAQCAtMjYsMTEgKzI2LDYgQEAKIGV4dGVybiBpbnQgbm9pb2FwaWNxdWlyazsKIGV4dGVybiBpbnQgbm9pb2FwaWNyZXJvdXRlOwogCi0vKiBzY2FuIGEgYnVzIGFmdGVyIGFsbG9jYXRpbmcgYSBwY2lfc3lzZGF0YSBmb3IgaXQgKi8KLWV4dGVybiBzdHJ1Y3QgcGNpX2J1cyAqcGNpX3NjYW5fYnVzX29uX25vZGUoaW50IGJ1c25vLCBzdHJ1Y3QgcGNpX29wcyAqb3BzLAotCQkJCQkgICAgaW50IG5vZGUpOwotZXh0ZXJuIHN0cnVjdCBwY2lfYnVzICpwY2lfc2Nhbl9idXNfd2l0aF9zeXNkYXRhKGludCBidXNubyk7Ci0KICNpZmRlZiBDT05GSUdfUENJCiAKICNpZmRlZiBDT05GSUdfUENJX0RPTUFJTlMKQEAgLTcwLDcgKzY1LDcgQEAKIAogZXh0ZXJuIGludCBwY2liaW9zX2VuYWJsZWQ7CiB2b2lkIHBjaWJpb3NfY29uZmlnX2luaXQodm9pZCk7Ci1zdHJ1Y3QgcGNpX2J1cyAqcGNpYmlvc19zY2FuX3Jvb3QoaW50IGJ1cyk7Cit2b2lkIHBjaWJpb3Nfc2Nhbl9yb290KGludCBidXMpOwogCiB2b2lkIHBjaWJpb3Nfc2V0X21hc3RlcihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV90eXBlcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV90eXBlcy5oCmluZGV4IDcwOGYxOWYuLmViM2Q0NDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfdHlwZXMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlX3R5cGVzLmgKQEAgLTIxNCwxMyArMjE0LDggQEAKICNpZmRlZiBDT05GSUdfWDg2XzY0CiAjZGVmaW5lIF9fUEFHRV9LRVJORUxfSURFTlRfTEFSR0VfRVhFQwlfX1BBR0VfS0VSTkVMX0xBUkdFX0VYRUMKICNlbHNlCi0vKgotICogRm9yIFBERV9JREVOVF9BVFRSIGluY2x1ZGUgVVNFUiBiaXQuIEFzIHRoZSBQREUgYW5kIFBURSBwcm90ZWN0aW9uCi0gKiBiaXRzIGFyZSBjb21iaW5lZCwgdGhpcyB3aWxsIGFsb3cgdXNlciB0byBhY2Nlc3MgdGhlIGhpZ2ggYWRkcmVzcyBtYXBwZWQKLSAqIFZEU08gaW4gdGhlIHByZXNlbmNlIG9mIENPTkZJR19DT01QQVRfVkRTTwotICovCiAjZGVmaW5lIFBURV9JREVOVF9BVFRSCSAweDAwMwkJLyogUFJFU0VOVCtSVyAqLwotI2RlZmluZSBQREVfSURFTlRfQVRUUgkgMHgwNjcJCS8qIFBSRVNFTlQrUlcrVVNFUitESVJUWStBQ0NFU1NFRCAqLworI2RlZmluZSBQREVfSURFTlRfQVRUUgkgMHgwNjMJCS8qIFBSRVNFTlQrUlcrRElSVFkrQUNDRVNTRUQgKi8KICNkZWZpbmUgUEdEX0lERU5UX0FUVFIJIDB4MDAxCQkvKiBQUkVTRU5UIChubyBvdGhlciBhdHRyaWJ1dGVzKSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggZmRlZGQzOC4uYTRlYTAyMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTQ0OSw2ICs0NDksMTUgQEAKIH07CiBERUNMQVJFX1BFUl9DUFVfQUxJR05FRChzdHJ1Y3Qgc3RhY2tfY2FuYXJ5LCBzdGFja19jYW5hcnkpOwogI2VuZGlmCisvKgorICogcGVyLUNQVSBJUlEgaGFuZGxpbmcgc3RhY2tzCisgKi8KK3N0cnVjdCBpcnFfc3RhY2sgeworCXUzMiAgICAgICAgICAgICAgICAgICAgIHN0YWNrW1RIUkVBRF9TSVpFL3NpemVvZih1MzIpXTsKK30gX19hbGlnbmVkKFRIUkVBRF9TSVpFKTsKKworREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBpcnFfc3RhY2sgKiwgaGFyZGlycV9zdGFjayk7CitERUNMQVJFX1BFUl9DUFUoc3RydWN0IGlycV9zdGFjayAqLCBzb2Z0aXJxX3N0YWNrKTsKICNlbmRpZgkvKiBYODZfNjQgKi8KIAogZXh0ZXJuIHVuc2lnbmVkIGludCB4c3RhdGVfc2l6ZTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldHVwLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZXR1cC5oCmluZGV4IGQ2MmM5ZjguLjkyNjRmMDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldHVwLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2V0dXAuaApAQCAtMzksMTIgKzM5LDYgQEAKIAogdm9pZCBzZXR1cF9iaW9zX2NvcnJ1cHRpb25fY2hlY2sodm9pZCk7CiAKLSNpZmRlZiBDT05GSUdfWDg2X1ZJU1dTCi1leHRlcm4gdm9pZCB2aXN3c19lYXJseV9kZXRlY3Qodm9pZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHZpc3dzX2Vhcmx5X2RldGVjdCh2b2lkKSB7IH0KLSNlbmRpZgotCiBleHRlcm4gdW5zaWduZWQgbG9uZyBzYXZlZF92aWRlb19tb2RlOwogCiBleHRlcm4gdm9pZCByZXNlcnZlX3N0YW5kYXJkX2lvX3Jlc291cmNlcyh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IGUxOTQwYzAuLjQ3ZTVkZTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtOSw2ICs5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGVyY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKIC8qCkBAIC0zMiwxMiArMzMsNiBAQAogCW1tX3NlZ21lbnRfdAkJYWRkcl9saW1pdDsKIAlzdHJ1Y3QgcmVzdGFydF9ibG9jayAgICByZXN0YXJ0X2Jsb2NrOwogCXZvaWQgX191c2VyCQkqc3lzZW50ZXJfcmV0dXJuOwotI2lmZGVmIENPTkZJR19YODZfMzIKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICBwcmV2aW91c19lc3A7ICAgLyogRVNQIG9mIHRoZSBwcmV2aW91cyBzdGFjayBpbgotCQkJCQkJICAgY2FzZSBvZiBuZXN0ZWQgKElSUSkgc3RhY2tzCi0JCQkJCQkqLwotCV9fdTgJCQlzdXBlcnZpc29yX3N0YWNrWzBdOwotI2VuZGlmCiAJdW5zaWduZWQgaW50CQlzaWdfb25fdWFjY2Vzc19lcnJvcjoxOwogCXVuc2lnbmVkIGludAkJdWFjY2Vzc19lcnI6MTsJLyogdWFjY2VzcyBmYWlsZWQgKi8KIH07CkBAIC0xNTMsOSArMTQ4LDkgQEAKICNkZWZpbmUgX1RJRl9XT1JLX0NUWFNXX1BSRVYgKF9USUZfV09SS19DVFhTV3xfVElGX1VTRVJfUkVUVVJOX05PVElGWSkKICNkZWZpbmUgX1RJRl9XT1JLX0NUWFNXX05FWFQgKF9USUZfV09SS19DVFhTVykKIAotI2lmZGVmIENPTkZJR19YODZfMzIKKyNkZWZpbmUgU1RBQ0tfV0FSTgkJKFRIUkVBRF9TSVpFLzgpCisjZGVmaW5lIEtFUk5FTF9TVEFDS19PRkZTRVQJKDUqKEJJVFNfUEVSX0xPTkcvOCkpCiAKLSNkZWZpbmUgU1RBQ0tfV0FSTgkoVEhSRUFEX1NJWkUvOCkKIC8qCiAgKiBtYWNyb3MvZnVuY3Rpb25zIGZvciBnYWluaW5nIGFjY2VzcyB0byB0aGUgdGhyZWFkIGluZm9ybWF0aW9uIHN0cnVjdHVyZQogICoKQEAgLTE2Myw0MiArMTU4LDYgQEAKICAqLwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotI2RlZmluZSBjdXJyZW50X3N0YWNrX3BvaW50ZXIgKHsJCVwKLQl1bnNpZ25lZCBsb25nIHNwOwkJCVwKLQlhc20oIm1vdiAlJWVzcCwlMCIgOiAiPWciIChzcCkpOwlcCi0Jc3A7CQkJCQlcCi19KQotCi0vKiBob3cgdG8gZ2V0IHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0IGZyb20gQyAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgdGhyZWFkX2luZm8gKmN1cnJlbnRfdGhyZWFkX2luZm8odm9pZCkKLXsKLQlyZXR1cm4gKHN0cnVjdCB0aHJlYWRfaW5mbyAqKQotCQkoY3VycmVudF9zdGFja19wb2ludGVyICYgfihUSFJFQURfU0laRSAtIDEpKTsKLX0KLQotI2Vsc2UgLyogIV9fQVNTRU1CTFlfXyAqLwotCi0vKiBob3cgdG8gZ2V0IHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0IGZyb20gQVNNICovCi0jZGVmaW5lIEdFVF9USFJFQURfSU5GTyhyZWcpCSBcCi0JbW92bCAkLVRIUkVBRF9TSVpFLCByZWc7IFwKLQlhbmRsICVlc3AsIHJlZwotCi0vKiB1c2UgdGhpcyBvbmUgaWYgcmVnIGFscmVhZHkgY29udGFpbnMgJWVzcCAqLwotI2RlZmluZSBHRVRfVEhSRUFEX0lORk9fV0lUSF9FU1AocmVnKSBcCi0JYW5kbCAkLVRIUkVBRF9TSVpFLCByZWcKLQotI2VuZGlmCi0KLSNlbHNlIC8qIFg4Nl8zMiAqLwotCi0jaW5jbHVkZSA8YXNtL3BlcmNwdS5oPgotI2RlZmluZSBLRVJORUxfU1RBQ0tfT0ZGU0VUICg1KjgpCi0KLS8qCi0gKiBtYWNyb3MvZnVuY3Rpb25zIGZvciBnYWluaW5nIGFjY2VzcyB0byB0aGUgdGhyZWFkIGluZm9ybWF0aW9uIHN0cnVjdHVyZQotICogcHJlZW1wdF9jb3VudCBuZWVkcyB0byBiZSAxIGluaXRpYWxseSwgdW50aWwgdGhlIHNjaGVkdWxlciBpcyBmdW5jdGlvbmFsLgotICovCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwogREVDTEFSRV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIGtlcm5lbF9zdGFjayk7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRocmVhZF9pbmZvICpjdXJyZW50X3RocmVhZF9pbmZvKHZvaWQpCkBAIC0yMTMsOCArMTcyLDggQEAKIAogLyogaG93IHRvIGdldCB0aGUgdGhyZWFkIGluZm9ybWF0aW9uIHN0cnVjdCBmcm9tIEFTTSAqLwogI2RlZmluZSBHRVRfVEhSRUFEX0lORk8ocmVnKSBcCi0JbW92cSBQRVJfQ1BVX1ZBUihrZXJuZWxfc3RhY2spLHJlZyA7IFwKLQlzdWJxICQoVEhSRUFEX1NJWkUtS0VSTkVMX1NUQUNLX09GRlNFVCkscmVnCisJX0FTTV9NT1YgUEVSX0NQVV9WQVIoa2VybmVsX3N0YWNrKSxyZWcgOyBcCisJX0FTTV9TVUIgJChUSFJFQURfU0laRS1LRVJORUxfU1RBQ0tfT0ZGU0VUKSxyZWcgOwogCiAvKgogICogU2FtZSBpZiBQRVJfQ1BVX1ZBUihrZXJuZWxfc3RhY2spIGlzLCBwZXJoYXBzIHdpdGggc29tZSBvZmZzZXQsIGFscmVhZHkgaW4KQEAgLTIyNCw4ICsxODMsNiBAQAogCiAjZW5kaWYKIAotI2VuZGlmIC8qICFYODZfMzIgKi8KLQogLyoKICAqIFRocmVhZC1zeW5jaHJvbm91cyBzdGF0dXMuCiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKaW5kZXggYjI4MDk3ZS4uMGU4ZjA0ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90b3BvbG9neS5oCkBAIC0xMzIsMTkgKzEzMiw3IEBACiB9CiAKIHN0cnVjdCBwY2lfYnVzOworaW50IHg4Nl9wY2lfcm9vdF9idXNfbm9kZShpbnQgYnVzKTsKIHZvaWQgeDg2X3BjaV9yb290X2J1c19yZXNvdXJjZXMoaW50IGJ1cywgc3RydWN0IGxpc3RfaGVhZCAqcmVzb3VyY2VzKTsKIAotI2lmZGVmIENPTkZJR19OVU1BCi1leHRlcm4gaW50IGdldF9tcF9idXNfdG9fbm9kZShpbnQgYnVzbnVtKTsKLWV4dGVybiB2b2lkIHNldF9tcF9idXNfdG9fbm9kZShpbnQgYnVzbnVtLCBpbnQgbm9kZSk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgZ2V0X21wX2J1c190b19ub2RlKGludCBidXNudW0pCi17Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X21wX2J1c190b19ub2RlKGludCBidXNudW0sIGludCBub2RlKQotewotfQotI2VuZGlmCi0KICNlbmRpZiAvKiBfQVNNX1g4Nl9UT1BPTE9HWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92ZHNvLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92ZHNvLmgKaW5kZXggZmRkYjUzZC4uZDFkYzU1NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdmRzby5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zkc28uaApAQCAtMSw4ICsxLDQ1IEBACiAjaWZuZGVmIF9BU01fWDg2X1ZEU09fSAogI2RlZmluZSBfQVNNX1g4Nl9WRFNPX0gKIAorI2luY2x1ZGUgPGFzbS9wYWdlX3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorCisjaWZkZWYgX19BU1NFTUJMRVJfXworCisjZGVmaW5lIERFRklORV9WRFNPX0lNQUdFKHN5bW5hbWUsIGZpbGVuYW1lKQkJCQlcCitfX1BBR0VfQUxJR05FRF9EQVRBIDsJCQkJCQkJXAorCS5nbG9ibCBzeW1uYW1lIyNfc3RhcnQsIHN5bW5hbWUjI19lbmQgOwkJCQlcCisJLmFsaWduIFBBR0VfU0laRSA7CQkJCQkJXAorCXN5bW5hbWUjI19zdGFydDogOwkJCQkJCVwKKwkuaW5jYmluIGZpbGVuYW1lIDsJCQkJCQlcCisJc3ltbmFtZSMjX2VuZDogOwkJCQkJCVwKKwkuYWxpZ24gUEFHRV9TSVpFIC8qIGV4dHJhIGRhdGEgaGVyZSBsZWFrcyB0byB1c2Vyc3BhY2UuICovIDsJXAorCQkJCQkJCQkJXAorLnByZXZpb3VzIDsJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKwkuZ2xvYmwgc3ltbmFtZSMjX3BhZ2VzIDsJCQkJCVwKKwkuYnNzIDsJCQkJCQkJCVwKKwkuYWxpZ24gOCA7CQkJCQkJCVwKKwkudHlwZSBzeW1uYW1lIyNfcGFnZXMsIEBvYmplY3QgOwkJCQlcCisJc3ltbmFtZSMjX3BhZ2VzOiA7CQkJCQkJXAorCS56ZXJvIChzeW1uYW1lIyNfZW5kIC0gc3ltbmFtZSMjX3N0YXJ0ICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkUgKiAoQklUU19QRVJfTE9ORyAvIDgpIDsgXAorCS5zaXplIHN5bW5hbWUjI19wYWdlcywgLi1zeW1uYW1lIyNfcGFnZXMKKworI2Vsc2UKKworI2RlZmluZSBERUNMQVJFX1ZEU09fSU1BR0Uoc3ltbmFtZSkJCQkJXAorCWV4dGVybiBjaGFyIHN5bW5hbWUjI19zdGFydFtdLCBzeW1uYW1lIyNfZW5kW107CQlcCisJZXh0ZXJuIHN0cnVjdCBwYWdlICpzeW1uYW1lIyNfcGFnZXNbXQorCiAjaWYgZGVmaW5lZCBDT05GSUdfWDg2XzMyIHx8IGRlZmluZWQgQ09ORklHX0NPTVBBVAotZXh0ZXJuIGNvbnN0IGNoYXIgVkRTTzMyX1BSRUxJTktbXTsKKworI2luY2x1ZGUgPGFzbS92ZHNvMzIuaD4KKworREVDTEFSRV9WRFNPX0lNQUdFKHZkc28zMl9pbnQ4MCk7CisjaWZkZWYgQ09ORklHX0NPTVBBVAorREVDTEFSRV9WRFNPX0lNQUdFKHZkc28zMl9zeXNjYWxsKTsKKyNlbmRpZgorREVDTEFSRV9WRFNPX0lNQUdFKHZkc28zMl9zeXNlbnRlcik7CiAKIC8qCiAgKiBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlIHZEU08gaW1hZ2UsIGZpbmQgdGhlIHBvaW50ZXIgdG8gVkRTTzMyX25hbWUKQEAgLTExLDggKzQ4LDcgQEAKICNkZWZpbmUgVkRTTzMyX1NZTUJPTChiYXNlLCBuYW1lKQkJCQkJXAogKHsJCQkJCQkJCQlcCiAJZXh0ZXJuIGNvbnN0IGNoYXIgVkRTTzMyXyMjbmFtZVtdOwkJCQlcCi0JKHZvaWQgX191c2VyICopKFZEU08zMl8jI25hbWUgLSBWRFNPMzJfUFJFTElOSyArCQlcCi0JCQkodW5zaWduZWQgbG9uZykoYmFzZSkpOwkJCQlcCisJKHZvaWQgX191c2VyICopKFZEU08zMl8jI25hbWUgKyAodW5zaWduZWQgbG9uZykoYmFzZSkpOwkJXAogfSkKICNlbmRpZgogCkBAIC0yMywxMiArNTksOCBAQAogZXh0ZXJuIHZvaWQgX191c2VyIF9fa2VybmVsX3NpZ3JldHVybjsKIGV4dGVybiB2b2lkIF9fdXNlciBfX2tlcm5lbF9ydF9zaWdyZXR1cm47CiAKLS8qCi0gKiBUaGVzZSBzeW1ib2xzIGFyZSBkZWZpbmVkIGJ5IHZkc28zMi5TIHRvIG1hcmsgdGhlIGJvdW5kcwotICogb2YgdGhlIEVMRiBEU08gaW1hZ2VzIGluY2x1ZGVkIHRoZXJlaW4uCi0gKi8KLWV4dGVybiBjb25zdCBjaGFyIHZkc28zMl9pbnQ4MF9zdGFydCwgdmRzbzMyX2ludDgwX2VuZDsKLWV4dGVybiBjb25zdCBjaGFyIHZkc28zMl9zeXNjYWxsX3N0YXJ0LCB2ZHNvMzJfc3lzY2FsbF9lbmQ7Ci1leHRlcm4gY29uc3QgY2hhciB2ZHNvMzJfc3lzZW50ZXJfc3RhcnQsIHZkc28zMl9zeXNlbnRlcl9lbmQ7Cit2b2lkIF9faW5pdCBwYXRjaF92ZHNvMzIodm9pZCAqdmRzbywgc2l6ZV90IGxlbik7CisKKyNlbmRpZiAvKiBfX0FTU0VNQkxFUl9fICovCiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9WRFNPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zkc28zMi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdmRzbzMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmYjcwMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zkc28zMi5oCkBAIC0wLDAgKzEsMTEgQEAKKyNpZm5kZWYgX0FTTV9YODZfVkRTTzMyX0gKKyNkZWZpbmUgX0FTTV9YODZfVkRTTzMyX0gKKworI2RlZmluZSBWRFNPX0JBU0VfUEFHRQkwCisjZGVmaW5lIFZEU09fVlZBUl9QQUdFCTEKKyNkZWZpbmUgVkRTT19IUEVUX1BBR0UJMgorI2RlZmluZSBWRFNPX1BBR0VTCTMKKyNkZWZpbmUgVkRTT19QUkVWX1BBR0VTCTIKKyNkZWZpbmUgVkRTT19PRkZTRVQoeCkJKCh4KSAqIFBBR0VfU0laRSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92Z3RvZC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdmd0b2QuaAppbmRleCA0NmUyNGQzLi4zYzMzNjZjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92Z3RvZC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZndG9kLmgKQEAgLTEsMzAgKzEsNzMgQEAKICNpZm5kZWYgX0FTTV9YODZfVkdUT0RfSAogI2RlZmluZSBfQVNNX1g4Nl9WR1RPRF9ICiAKLSNpbmNsdWRlIDxhc20vdnN5c2NhbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAKKyNpZmRlZiBCVUlMRF9WRFNPMzJfNjQKK3R5cGVkZWYgdTY0IGd0b2RfbG9uZ190OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBndG9kX2xvbmdfdDsKKyNlbmRpZgorLyoKKyAqIHZzeXNjYWxsX2d0b2RfZGF0YSB3aWxsIGJlIGFjY2Vzc2VkIGJ5IDMyIGFuZCA2NCBiaXQgY29kZSBhdCB0aGUgc2FtZSB0aW1lCisgKiBzbyBiZSBjYXJlZnVsbCBieSBtb2RpZnlpbmcgdGhpcyBzdHJ1Y3R1cmUuCisgKi8KIHN0cnVjdCB2c3lzY2FsbF9ndG9kX2RhdGEgewotCXNlcWNvdW50X3QJc2VxOworCXVuc2lnbmVkIHNlcTsKIAotCXN0cnVjdCB7IC8qIGV4dHJhY3Qgb2YgYSBjbG9ja3NvdXJjZSBzdHJ1Y3QgKi8KLQkJaW50IHZjbG9ja19tb2RlOwotCQljeWNsZV90CWN5Y2xlX2xhc3Q7Ci0JCWN5Y2xlX3QJbWFzazsKLQkJdTMyCW11bHQ7Ci0JCXUzMglzaGlmdDsKLQl9IGNsb2NrOworCWludCB2Y2xvY2tfbW9kZTsKKwljeWNsZV90CWN5Y2xlX2xhc3Q7CisJY3ljbGVfdAltYXNrOworCXUzMgltdWx0OworCXUzMglzaGlmdDsKIAogCS8qIG9wZW4gY29kZWQgJ3N0cnVjdCB0aW1lc3BlYycgKi8KLQl0aW1lX3QJCXdhbGxfdGltZV9zZWM7CiAJdTY0CQl3YWxsX3RpbWVfc25zZWM7CisJZ3RvZF9sb25nX3QJd2FsbF90aW1lX3NlYzsKKwlndG9kX2xvbmdfdAltb25vdG9uaWNfdGltZV9zZWM7CiAJdTY0CQltb25vdG9uaWNfdGltZV9zbnNlYzsKLQl0aW1lX3QJCW1vbm90b25pY190aW1lX3NlYzsKKwlndG9kX2xvbmdfdAl3YWxsX3RpbWVfY29hcnNlX3NlYzsKKwlndG9kX2xvbmdfdAl3YWxsX3RpbWVfY29hcnNlX25zZWM7CisJZ3RvZF9sb25nX3QJbW9ub3RvbmljX3RpbWVfY29hcnNlX3NlYzsKKwlndG9kX2xvbmdfdAltb25vdG9uaWNfdGltZV9jb2Fyc2VfbnNlYzsKIAotCXN0cnVjdCB0aW1lem9uZSBzeXNfdHo7Ci0Jc3RydWN0IHRpbWVzcGVjIHdhbGxfdGltZV9jb2Fyc2U7Ci0Jc3RydWN0IHRpbWVzcGVjIG1vbm90b25pY190aW1lX2NvYXJzZTsKKwlpbnQJCXR6X21pbnV0ZXN3ZXN0OworCWludAkJdHpfZHN0dGltZTsKIH07CiBleHRlcm4gc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YSB2c3lzY2FsbF9ndG9kX2RhdGE7CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ3RvZF9yZWFkX2JlZ2luKGNvbnN0IHN0cnVjdCB2c3lzY2FsbF9ndG9kX2RhdGEgKnMpCit7CisJdW5zaWduZWQgcmV0OworCityZXBlYXQ6CisJcmV0ID0gQUNDRVNTX09OQ0Uocy0+c2VxKTsKKwlpZiAodW5saWtlbHkocmV0ICYgMSkpIHsKKwkJY3B1X3JlbGF4KCk7CisJCWdvdG8gcmVwZWF0OworCX0KKwlzbXBfcm1iKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ3RvZF9yZWFkX3JldHJ5KGNvbnN0IHN0cnVjdCB2c3lzY2FsbF9ndG9kX2RhdGEgKnMsCisJCQkJCXVuc2lnbmVkIHN0YXJ0KQoreworCXNtcF9ybWIoKTsKKwlyZXR1cm4gdW5saWtlbHkocy0+c2VxICE9IHN0YXJ0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGd0b2Rfd3JpdGVfYmVnaW4oc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YSAqcykKK3sKKwkrK3MtPnNlcTsKKwlzbXBfd21iKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBndG9kX3dyaXRlX2VuZChzdHJ1Y3QgdnN5c2NhbGxfZ3RvZF9kYXRhICpzKQoreworCXNtcF93bWIoKTsKKwkrK3MtPnNlcTsKK30KKwogI2VuZGlmIC8qIF9BU01fWDg2X1ZHVE9EX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zpc3dzL2NvYmFsdC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdmlzd3MvY29iYWx0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZGIzNzYuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdmlzd3MvY29iYWx0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotI2lmbmRlZiBfQVNNX1g4Nl9WSVNXU19DT0JBTFRfSAotI2RlZmluZSBfQVNNX1g4Nl9WSVNXU19DT0JBTFRfSAotCi0jaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgotCi0vKgotICogQ29iYWx0IFNHSSBWaXN1YWwgV29ya3N0YXRpb24gc3lzdGVtIEFTSUMKLSAqLyAKLQotI2RlZmluZSBDT19DUFVfTlVNX1BIWVMgMHgxZTAwCi0jZGVmaW5lIENPX0NQVV9UQUJfUEhZUyAoQ09fQ1BVX05VTV9QSFlTICsgMikKLQotI2RlZmluZSBDT19DUFVfTUFYIDQKLQotI2RlZmluZQlDT19DUFVfUEhZUwkJMHhjMjAwMDAwMAotI2RlZmluZQlDT19BUElDX1BIWVMJCTB4YzQwMDAwMDAKLQotLyogc2VlIHNldF9maXhtYXAoKSBhbmQgYXNtL2ZpeG1hcC5oICovCi0jZGVmaW5lCUNPX0NQVV9WQUREUgkJKGZpeF90b192aXJ0KEZJWF9DT19DUFUpKQotI2RlZmluZQlDT19BUElDX1ZBRERSCQkoZml4X3RvX3ZpcnQoRklYX0NPX0FQSUMpKQotCi0vKiBDb2JhbHQgQ1BVIHJlZ2lzdGVycyAtLSByZWxhdGl2ZSB0byBDT19DUFVfVkFERFIsIHVzZSBjb19jcHVfKigpICovCi0jZGVmaW5lCUNPX0NQVV9SRVYJCTB4MDgKLSNkZWZpbmUJQ09fQ1BVX0NUUkwJCTB4MTAKLSNkZWZpbmUJQ09fQ1BVX1NUQVQJCTB4MjAKLSNkZWZpbmUJQ09fQ1BVX1RJTUVWQUwJCTB4MzAKLQotLyogQ09fQ1BVX0NUUkwgYml0cyAqLwotI2RlZmluZQlDT19DVFJMX1RJTUVSVU4JCTB4MDQJCS8qIDAgPT0gZGlzYWJsZWQgKi8KLSNkZWZpbmUJQ09fQ1RSTF9USU1FTUFTSwkweDA4CQkvKiAwID09IHVubWFza2VkICovCi0KLS8qIENPX0NQVV9TVEFUVVMgYml0cyAqLwotI2RlZmluZQlDT19TVEFUX1RJTUVJTlRSCTB4MDIJLyogKHIpIDEgPT0gaW50IHBlbmQsICh3KSAwID09IGNsZWFyICovCi0KLS8qIENPX0NQVV9USU1FVkFMIHZhbHVlICovCi0jZGVmaW5lCUNPX1RJTUVfSFoJCTEwMDAwMDAwMAkvKiBDb2JhbHQgY29yZSByYXRlICovCi0KLS8qIENvYmFsdCBBUElDIHJlZ2lzdGVycyAtLSByZWxhdGl2ZSB0byBDT19BUElDX1ZBRERSLCB1c2UgY29fYXBpY18qKCkgKi8KLSNkZWZpbmUJQ09fQVBJQ19ISShuKQkJKCgobikgKiAweDEwKSArIDQpCi0jZGVmaW5lCUNPX0FQSUNfTE8obikJCSgobikgKiAweDEwKQotI2RlZmluZQlDT19BUElDX0lECQkweDBmZmMKLQotLyogQ09fQVBJQ19JRCBiaXRzICovCi0jZGVmaW5lCUNPX0FQSUNfRU5BQkxFCQkweDAwMDAwMTAwCi0KLS8qIENPX0FQSUNfTE8gYml0cyAqLwotI2RlZmluZQlDT19BUElDX01BU0sJCTB4MDAwMTAwMDAJLyogMCA9IGVuYWJsZWQgKi8KLSNkZWZpbmUJQ09fQVBJQ19MRVZFTAkJMHgwMDAwODAwMAkvKiAwID0gZWRnZSAqLwotCi0vKgotICogV2hlcmUgdGhpbmdzIGFyZSBwaHlzaWNhbGx5IHdpcmVkIHRvIENvYmFsdAotICogI2RlZmluZXMgd2l0aCBubyBib2FyZCBfPHR5cGU+XzxyZXY+XyBhcmUgY29tbW9uIHRvIGFsbCAodGh1cyBmYXIpCi0gKi8KLSNkZWZpbmUJQ09fQVBJQ19JREUwCQk0Ci0jZGVmaW5lIENPX0FQSUNfSURFMQkJMgkJLyogT25seSBvbiAzMjAgKi8KLQotI2RlZmluZQlDT19BUElDXzgyNTkJCTEyCQkvKiBzZXJpYWwsIGZsb3BweSwgcGFyLWwtbCAqLwotCi0vKiBMaXRoaXVtIFBDSSBCcmlkZ2UgQSAtLSAidGhlIG9uZSB3aXRoIDgyNTU3IEV0aGVybmV0IiAqLwotI2RlZmluZQlDT19BUElDX1BDSUFfQkFTRTAJMCAvKiBhbmQgMSAqLwkvKiBzbG90IDAsIGxpbmUgMCAqLwotI2RlZmluZQlDT19BUElDX1BDSUFfQkFTRTEyMwk1IC8qIGFuZCA2ICovCS8qIHNsb3QgMCwgbGluZSAxICovCi0KLSNkZWZpbmUJQ09fQVBJQ19QSUlYNF9VU0IJNwkJLyogdGhpcyBvbmUgaXMgd2VpcmQgKi8KLQotLyogTGl0aGl1bSBQQ0kgQnJpZGdlIEIgLS0gInRoZSBvbmUgd2l0aCBQSUlYNCIgKi8KLSNkZWZpbmUJQ09fQVBJQ19QQ0lCX0JBU0UwCTggLyogYW5kIDktMTIgKi8vKiBzbG90IDAsIGxpbmUgMCAqLwotI2RlZmluZQlDT19BUElDX1BDSUJfQkFTRTEyMwkxMyAvKiAxNC4xNSAqLwkvKiBzbG90IDAsIGxpbmUgMSAqLwotCi0jZGVmaW5lCUNPX0FQSUNfVklET1VUMAkJMTYKLSNkZWZpbmUJQ09fQVBJQ19WSURPVVQxCQkxNwotI2RlZmluZQlDT19BUElDX1ZJRElOMAkJMTgKLSNkZWZpbmUJQ09fQVBJQ19WSURJTjEJCTE5Ci0KLSNkZWZpbmUJQ09fQVBJQ19MSV9BVURJTwkyMgotCi0jZGVmaW5lCUNPX0FQSUNfQVMJCTI0Ci0jZGVmaW5lCUNPX0FQSUNfUkUJCTI1Ci0KLSNkZWZpbmUgQ09fQVBJQ19DUFUJCTI4CQkvKiBUaW1lciBhbmQgQ2FjaGUgaW50ZXJydXB0ICovCi0jZGVmaW5lCUNPX0FQSUNfTk1JCQkyOQotI2RlZmluZQlDT19BUElDX0xBU1QJCUNPX0FQSUNfTk1JCi0KLS8qCi0gKiBUaGlzIGlzIGhvdyBpcnFzIGFyZSBhc3NpZ25lZCBvbiB0aGUgVmlzdWFsIFdvcmtzdGF0aW9uLgotICogTGVnYWN5IGRldmljZXMgZ2V0IGlycSdzIDEtMTUgKHN5c3RlbSBjbG9jayBpcyAwIGFuZCBpcyBDT19BUElDX0NQVSkuCi0gKiBBbGwgb3RoZXIgZGV2aWNlcyAoaW5jbHVkaW5nIFBDSSkgZ28gdG8gQ29iYWx0IGFuZCBhcmUgaXJxJ3MgMTYgb24gdXAuCi0gKi8KLSNkZWZpbmUJQ09fSVJRX0FQSUMwCTE2CQkJLyogaXJxIG9mIGFwaWMgZW50cnkgMCAqLwotI2RlZmluZQlJU19DT19BUElDKGlycSkJKChpcnEpID49IENPX0lSUV9BUElDMCkKLSNkZWZpbmUJQ09fSVJRKGFwaWMpCShDT19JUlFfQVBJQzAgKyAoYXBpYykpCS8qIGFwaWMgZW50IHRvIGlycSAqLwotI2RlZmluZQlDT19BUElDKGlycSkJKChpcnEpIC0gQ09fSVJRX0FQSUMwKQkvKiBpcnEgdG8gYXBpYyBlbnQgKi8KLSNkZWZpbmUgQ09fSVJRX0lERTAJMTQJCQkvKiBrbm93bGVkZ2Ugb2YuLi4gKi8KLSNkZWZpbmUgQ09fSVJRX0lERTEJMTUJCQkvKiAuLi4gaWRlIGRyaXZlciBkZWZhdWx0cyEgKi8KLSNkZWZpbmUJQ09fSVJRXzgyNTkJQ09fSVJRKENPX0FQSUNfODI1OSkKLQotI2lmZGVmIENPTkZJR19YODZfVklTV1NfQVBJQwotc3RhdGljIGlubGluZSB2b2lkIGNvX2NwdV93cml0ZSh1bnNpZ25lZCBsb25nIHJlZywgdW5zaWduZWQgbG9uZyB2KQotewotCSooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoQ09fQ1BVX1ZBRERSK3JlZykpPXY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjb19jcHVfcmVhZCh1bnNpZ25lZCBsb25nIHJlZykKLXsKLQlyZXR1cm4gKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShDT19DUFVfVkFERFIrcmVnKSk7Ci19ICAgICAgICAgICAgCi0gICAgICAgICAgICAgCi1zdGF0aWMgaW5saW5lIHZvaWQgY29fYXBpY193cml0ZSh1bnNpZ25lZCBsb25nIHJlZywgdW5zaWduZWQgbG9uZyB2KQotewotCSooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoQ09fQVBJQ19WQUREUityZWcpKT12OwotfSAgICAgICAgICAgIAotICAgICAgICAgICAgIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvX2FwaWNfcmVhZCh1bnNpZ25lZCBsb25nIHJlZykKLXsKLQlyZXR1cm4gKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShDT19BUElDX1ZBRERSK3JlZykpOwotfQotI2VuZGlmCi0KLWV4dGVybiBjaGFyIHZpc3dzX2JvYXJkX3R5cGU7Ci0KLSNkZWZpbmUJVklTV1NfMzIwCTAKLSNkZWZpbmUJVklTV1NfNTQwCTEKLQotZXh0ZXJuIGNoYXIgdmlzd3NfYm9hcmRfcmV2OwotCi1leHRlcm4gaW50IHBjaV92aXN3c19pbml0KHZvaWQpOwotCi0jZW5kaWYgLyogX0FTTV9YODZfVklTV1NfQ09CQUxUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zpc3dzL2xpdGhpdW0uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zpc3dzL2xpdGhpdW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEwZDg5Yi4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92aXN3cy9saXRoaXVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jaWZuZGVmIF9BU01fWDg2X1ZJU1dTX0xJVEhJVU1fSAotI2RlZmluZSBfQVNNX1g4Nl9WSVNXU19MSVRISVVNX0gKLQotI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KLQotLyoKLSAqIExpdGhpdW0gaXMgdGhlIFNHSSBWaXN1YWwgV29ya3N0YXRpb24gSS9PIEFTSUMKLSAqLwotCi0jZGVmaW5lCUxJX1BDSV9BX1BIWVMJCTB4ZmMwMDAwMDAJLyogRW5ldCBpcyBkZXYgMyAqLwotI2RlZmluZQlMSV9QQ0lfQl9QSFlTCQkweGZkMDAwMDAwCS8qIFBJSVg0IGlzIGhlcmUgKi8KLQotLyogc2VlIHNldF9maXhtYXAoKSBhbmQgYXNtL2ZpeG1hcC5oICovCi0jZGVmaW5lIExJX1BDSUFfVkFERFIgICAoZml4X3RvX3ZpcnQoRklYX0xJX1BDSUEpKQotI2RlZmluZSBMSV9QQ0lCX1ZBRERSICAgKGZpeF90b192aXJ0KEZJWF9MSV9QQ0lCKSkKLQotLyogTm90IGEgc3RhbmRhcmQgUENJPyAobm90IGluIGxpbnV4L3BjaS5oKSAqLwotI2RlZmluZQlMSV9QQ0lfQlVTTlVNCTB4NDQJCQkvKiBsbzg6IHByaW1hcnksIGhpODogc3ViICovCi0jZGVmaW5lIExJX1BDSV9JTlRFTiAgICAweDQ2Ci0KLS8qIExJX1BDSV9JTlRFTlQgYml0cyAqLwotI2RlZmluZQlMSV9JTlRBXzAJMHgwMDAxCi0jZGVmaW5lCUxJX0lOVEFfMQkweDAwMDIKLSNkZWZpbmUJTElfSU5UQV8yCTB4MDAwNAotI2RlZmluZQlMSV9JTlRBXzMJMHgwMDA4Ci0jZGVmaW5lCUxJX0lOVEFfNAkweDAwMTAKLSNkZWZpbmUJTElfSU5UQgkJMHgwMDIwCi0jZGVmaW5lCUxJX0lOVEMJCTB4MDA0MAotI2RlZmluZQlMSV9JTlRECQkweDAwODAKLQotLyogTW9yZSBzcGVjaWFsIHB1cnBvc2UgbWFjcm9zLi4uICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbGlfcGNpYV93cml0ZTE2KHVuc2lnbmVkIGxvbmcgcmVnLCB1bnNpZ25lZCBzaG9ydCB2KQotewotCSooKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKExJX1BDSUFfVkFERFIrcmVnKSk9djsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBsaV9wY2lhX3JlYWQxNih1bnNpZ25lZCBsb25nIHJlZykKLXsKLQkgcmV0dXJuICooKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKExJX1BDSUFfVkFERFIrcmVnKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBsaV9wY2liX3dyaXRlMTYodW5zaWduZWQgbG9uZyByZWcsIHVuc2lnbmVkIHNob3J0IHYpCi17Ci0JKigodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoTElfUENJQl9WQUREUityZWcpKT12OwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGxpX3BjaWJfcmVhZDE2KHVuc2lnbmVkIGxvbmcgcmVnKQotewotCXJldHVybiAqKCh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShMSV9QQ0lCX1ZBRERSK3JlZykpOwotfQotCi0jZW5kaWYgLyogX0FTTV9YODZfVklTV1NfTElUSElVTV9IICovCi0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zpc3dzL3BpaXg0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92aXN3cy9waWl4NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGFmNGQzLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zpc3dzL3BpaXg0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotI2lmbmRlZiBfQVNNX1g4Nl9WSVNXU19QSUlYNF9ICi0jZGVmaW5lIF9BU01fWDg2X1ZJU1dTX1BJSVg0X0gKLQotLyoKLSAqIFBJSVg0IGFzIHVzZWQgb24gU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbnMKLSAqLwotCi0jZGVmaW5lCVBJSVhfUE1fU1RBUlQJCTB4MEY4MAotCi0jZGVmaW5lCVNJT19HUElPX1NUQVJUCQkweDBGQzAKLQotI2RlZmluZQlTSU9fUE1fU1RBUlQJCTB4MEZDOAotCi0jZGVmaW5lCVBNQkFTRQkJCVBJSVhfUE1fU1RBUlQKLSNkZWZpbmUJR1BJUkVHMAkJCShQTUJBU0UrMHgzMCkKLSNkZWZpbmUJR1BJUkVHKHgpCQkoR1BJUkVHMCsoKHgpLzgpKQotI2RlZmluZQlHUElCSVQoeCkJCSgxIDw8ICgoeCklOCkpCi0KLSNkZWZpbmUJUElJWF9HUElfQkRfSUQxCQkxOAotI2RlZmluZQlQSUlYX0dQSV9CRF9JRDIJCTE5Ci0jZGVmaW5lCVBJSVhfR1BJX0JEX0lEMwkJMjAKLSNkZWZpbmUJUElJWF9HUElfQkRfSUQ0CQkyMQotI2RlZmluZQlQSUlYX0dQSV9CRF9SRUcJCUdQSVJFRyhQSUlYX0dQSV9CRF9JRDEpCi0jZGVmaW5lCVBJSVhfR1BJX0JEX01BU0sJKEdQSUJJVChQSUlYX0dQSV9CRF9JRDEpIHwgXAotCQkJCUdQSUJJVChQSUlYX0dQSV9CRF9JRDIpIHwgXAotCQkJCUdQSUJJVChQSUlYX0dQSV9CRF9JRDMpIHwgXAotCQkJCUdQSUJJVChQSUlYX0dQSV9CRF9JRDQpICkKLQotI2RlZmluZQlQSUlYX0dQSV9CRF9TSElGVAkoUElJWF9HUElfQkRfSUQxICUgOCkKLQotI2RlZmluZQlTSU9fSU5ERVgJCTB4MmUKLSNkZWZpbmUJU0lPX0RBVEEJCTB4MmYKLQotI2RlZmluZQlTSU9fREVWX1NFTAkJMHg3Ci0jZGVmaW5lCVNJT19ERVZfRU5CCQkweDMwCi0jZGVmaW5lCVNJT19ERVZfTVNCCQkweDYwCi0jZGVmaW5lCVNJT19ERVZfTFNCCQkweDYxCi0KLSNkZWZpbmUJU0lPX0dQX0RFVgkJMHg3Ci0KLSNkZWZpbmUJU0lPX0dQX0JBU0UJCVNJT19HUElPX1NUQVJUCi0jZGVmaW5lCVNJT19HUF9NU0IJCShTSU9fR1BfQkFTRT4+OCkKLSNkZWZpbmUJU0lPX0dQX0xTQgkJKFNJT19HUF9CQVNFJjB4ZmYpCi0KLSNkZWZpbmUJU0lPX0dQX0RBVEExCQkoU0lPX0dQX0JBU0UrMCkKLQotI2RlZmluZQlTSU9fUE1fREVWCQkweDgKLQotI2RlZmluZQlTSU9fUE1fQkFTRQkJU0lPX1BNX1NUQVJUCi0jZGVmaW5lCVNJT19QTV9NU0IJCShTSU9fUE1fQkFTRT4+OCkKLSNkZWZpbmUJU0lPX1BNX0xTQgkJKFNJT19QTV9CQVNFJjB4ZmYpCi0jZGVmaW5lCVNJT19QTV9JTkRFWAkJKFNJT19QTV9CQVNFKzApCi0jZGVmaW5lCVNJT19QTV9EQVRBCQkoU0lPX1BNX0JBU0UrMSkKLQotI2RlZmluZQlTSU9fUE1fRkVSMgkJMHgxCi0KLSNkZWZpbmUJU0lPX1BNX0dQX0VOCQkweDgwCi0KLQotCi0vKgotICogVGhpcyBpcyB0aGUgZGV2L3JlZyB3aGVyZSBnZW5lcmF0aW5nIGEgY29uZmlnIGN5Y2xlIHdpbGwKLSAqIHJlc3VsdCBpbiBhIFBDSSBzcGVjaWFsIGN5Y2xlLgotICovCi0jZGVmaW5lIFNQRUNJQUxfREVWCQkweGZmCi0jZGVmaW5lIFNQRUNJQUxfUkVHCQkweDAwCi0KLS8qCi0gKiBQSUlYNCBuZWVkcyB0byBzZWUgYSBzcGVjaWFsIGN5Y2xlIHdpdGggdGhlIGZvbGxvd2luZyBkYXRhCi0gKiB0byBiZSBjb252aW5jZWQgdGhlIHByb2Nlc3NvciBoYXMgZ29uZSBpbnRvIHRoZSBzdG9wIGdyYW50Ci0gKiBzdGF0ZS4gIFBJSVg0IGluc2lzdHMgb24gc2VlaW5nIHRoaXMgYmVmb3JlIGl0IHdpbGwgcG93ZXIKLSAqIGRvd24gYSBzeXN0ZW0uCi0gKi8KLSNkZWZpbmUgUElJWF9TUEVDSUFMX1NUT1AJCTB4MDAxMjAwMDIKLQotI2RlZmluZSBQSUlYNF9SRVNFVF9QT1JUCTB4Y2Y5Ci0jZGVmaW5lIFBJSVg0X1JFU0VUX1ZBTAkJMHg2Ci0KLSNkZWZpbmUgUE1TVFNfUE9SVAkJMHhmODAJLy8gMiBieXRlcwlQTSBTdGF0dXMKLSNkZWZpbmUgUE1FTl9QT1JUCQkweGY4MgkvLyAyIGJ5dGVzCVBNIEVuYWJsZQotI2RlZmluZQlQTUNOVFJMX1BPUlQJCTB4Zjg0CS8vIDIgYnl0ZXMJUE0gQ29udHJvbAotCi0jZGVmaW5lIFBNX1NVU1BFTkRfRU5BQkxFCTB4MjAwMAkvLyBzdGFydCBzZXF1ZW5jZSB0byBzdXNwZW5kIHN0YXRlCi0KLS8qCi0gKiBQTVNUUyBhbmQgUE1FTiBJL08gYml0IGRlZmluaXRpb25zLgotICogKEJpdHMgYXJlIHRoZSBzYW1lIGluIGJvdGggcmVnaXN0ZXJzKQotICovCi0jZGVmaW5lIFBNX1NUU19SU00JCSgxPDwxNSkJLy8gUmVzdW1lIFN0YXR1cwotI2RlZmluZSBQTV9TVFNfUFdSQlROT1IJCSgxPDwxMSkJLy8gUG93ZXIgQnV0dG9uIE92ZXJyaWRlCi0jZGVmaW5lIFBNX1NUU19SVEMJCSgxPDwxMCkJLy8gUlRDIHN0YXR1cwotI2RlZmluZSBQTV9TVFNfUFdSQlROCQkoMTw8OCkJLy8gUG93ZXIgQnV0dG9uIFByZXNzZWQ/Ci0jZGVmaW5lIFBNX1NUU19HQkwJCSgxPDw1KQkvLyBHbG9iYWwgU3RhdHVzCi0jZGVmaW5lIFBNX1NUU19CTQkJKDE8PDQpCS8vIEJ1cyBNYXN0ZXIgU3RhdHVzCi0jZGVmaW5lIFBNX1NUU19UTVJPRgkJKDE8PDApCS8vIFRpbWVyIE92ZXJmbG93IFN0YXR1cy4KLQotLyoKLSAqIFN0b3AgY2xvY2sgR1BJIHJlZ2lzdGVyCi0gKi8KLSNkZWZpbmUgUElJWF9HUElSRUcwCQkJKDB4ZjgwICsgMHgzMCkKLQotLyoKLSAqIFN0b3AgY2xvY2sgR1BJIGJpdCBpbiBHUElSRUcwCi0gKi8KLSNkZWZpbmUJUElJWF9HUElfU1RQQ0xLCQkweDQJLy8gU1RQQ0xLIHNpZ25hbCByb3V0ZWQgYmFjayBpbgotCi0jZW5kaWYgLyogX0FTTV9YODZfVklTV1NfUElJWDRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdmlzd3Mvc2dpdncuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zpc3dzL3NnaXZ3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYmY2M2UuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdmlzd3Mvc2dpdncuaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotLyoKLSAqIEZyYW1lIGJ1ZmZlciBwb3NpdGlvbiBhbmQgc2l6ZToKLSAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2dpdndmYl9tZW1fcGh5czsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHNnaXZ3ZmJfbWVtX3NpemU7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92dmFyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92dmFyLmgKaW5kZXggZDc2YWM0MC4uMDgxZDkwOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdnZhci5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Z2YXIuaApAQCAtMTYsOCArMTYsOCBAQAogICogeW91IG1lc3MgdXAsIHRoZSBsaW5rZXIgd2lsbCBjYXRjaCBpdC4pCiAgKi8KIAotLyogQmFzZSBhZGRyZXNzIG9mIHZ2YXJzLiAgVGhpcyBpcyBub3QgQUJJLiAqLwotI2RlZmluZSBWVkFSX0FERFJFU1MgKC0xMCoxMDI0KjEwMjQgLSA0MDk2KQorI2lmbmRlZiBfQVNNX1g4Nl9WVkFSX0gKKyNkZWZpbmUgX0FTTV9YODZfVlZBUl9ICiAKICNpZiBkZWZpbmVkKF9fVlZBUl9LRVJORUxfTERTKQogCkBAIC0yOSwxNiArMjksMzUgQEAKIAogI2Vsc2UKIAorI2lmZGVmIEJVSUxEX1ZEU08zMgorCisjZGVmaW5lIERFQ0xBUkVfVlZBUihvZmZzZXQsIHR5cGUsIG5hbWUpCQkJCVwKKwlleHRlcm4gdHlwZSB2dmFyXyAjIyBuYW1lIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSk7CisKKyNkZWZpbmUgVlZBUihuYW1lKSAodnZhcl8gIyMgbmFtZSkKKworI2Vsc2UKKworZXh0ZXJuIGNoYXIgX192dmFyX3BhZ2U7CisKKy8qIEJhc2UgYWRkcmVzcyBvZiB2dmFycy4gIFRoaXMgaXMgbm90IEFCSS4gKi8KKyNpZmRlZiBDT05GSUdfWDg2XzY0CisjZGVmaW5lIFZWQVJfQUREUkVTUyAoLTEwKjEwMjQqMTAyNCAtIDQwOTYpCisjZWxzZQorI2RlZmluZSBWVkFSX0FERFJFU1MgKCZfX3Z2YXJfcGFnZSkKKyNlbmRpZgorCiAjZGVmaW5lIERFQ0xBUkVfVlZBUihvZmZzZXQsIHR5cGUsIG5hbWUpCQkJCVwKIAlzdGF0aWMgdHlwZSBjb25zdCAqIGNvbnN0IHZ2YXJhZGRyXyAjIyBuYW1lID0JCQlcCiAJCSh2b2lkICopKFZWQVJfQUREUkVTUyArIChvZmZzZXQpKTsKIAorI2RlZmluZSBWVkFSKG5hbWUpICgqdnZhcmFkZHJfICMjIG5hbWUpCisjZW5kaWYKKwogI2RlZmluZSBERUZJTkVfVlZBUih0eXBlLCBuYW1lKQkJCQkJCVwKIAl0eXBlIG5hbWUJCQkJCQkJXAogCV9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi52dmFyXyIgI25hbWUpLCBhbGlnbmVkKDE2KSkpIF9fdmlzaWJsZQogCi0jZGVmaW5lIFZWQVIobmFtZSkgKCp2dmFyYWRkcl8gIyMgbmFtZSkKLQogI2VuZGlmCiAKIC8qIERFQ0xBUkVfVlZBUihvZmZzZXQsIHR5cGUsIG5hbWUpICovCkBAIC00OCwzICs2Nyw1IEBACiBERUNMQVJFX1ZWQVIoMTI4LCBzdHJ1Y3QgdnN5c2NhbGxfZ3RvZF9kYXRhLCB2c3lzY2FsbF9ndG9kX2RhdGEpCiAKICN1bmRlZiBERUNMQVJFX1ZWQVIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUKaW5kZXggY2I2NDhjOC4uZjRkOTYwMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZQpAQCAtMjYsNyArMjYsNyBAQAogb2JqLXkJCQkrPSBwcm9iZV9yb21zLm8KIG9iai0kKENPTkZJR19YODZfMzIpCSs9IGkzODZfa3N5bXNfMzIubwogb2JqLSQoQ09ORklHX1g4Nl82NCkJKz0gc3lzX3g4Nl82NC5vIHg4NjY0X2tzeW1zXzY0Lm8KLW9iai15CQkJKz0gc3lzY2FsbF8kKEJJVFMpLm8KK29iai15CQkJKz0gc3lzY2FsbF8kKEJJVFMpLm8gdnN5c2NhbGxfZ3RvZC5vCiBvYmotJChDT05GSUdfWDg2XzY0KQkrPSB2c3lzY2FsbF82NC5vCiBvYmotJChDT05GSUdfWDg2XzY0KQkrPSB2c3lzY2FsbF9lbXVfNjQubwogb2JqLSQoQ09ORklHX1NZU0ZTKQkrPSBrc3lzZnMubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jCmluZGV4IDlmNDZmMmIuLjg2MjgxZmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL2Jvb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMKQEAgLTUzLDEwICs1Myw2IEBACiAjIGluY2x1ZGUgPGFzbS9wcm90by5oPgogI2VuZGlmCQkJCS8qIFg4NiAqLwogCi0jZGVmaW5lIEJBRF9NQURUX0VOVFJZKGVudHJ5LCBlbmQpICgJCQkJCSAgICBcCi0JCSghZW50cnkpIHx8ICh1bnNpZ25lZCBsb25nKWVudHJ5ICsgc2l6ZW9mKCplbnRyeSkgPiBlbmQgfHwgIFwKLQkJKChzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKillbnRyeSktPmxlbmd0aCA8IHNpemVvZigqZW50cnkpKQotCiAjZGVmaW5lIFBSRUZJWAkJCSJBQ1BJOiAiCiAKIGludCBhY3BpX25vaXJxOwkJCQkvKiBza2lwIEFDUEkgSVJRIGluaXRpYWxpemF0aW9uICovCkBAIC05MDcsMTAgKzkwMyw2IEBACiAjaWZkZWYJQ09ORklHX1g4Nl9JT19BUElDCiAjZGVmaW5lIE1QX0lTQV9CVVMJCTAKIAotI2lmZGVmIENPTkZJR19YODZfRVM3MDAwCi1leHRlcm4gaW50IGVzNzAwMF9wbGF0OwotI2VuZGlmCi0KIHZvaWQgX19pbml0IG1wX292ZXJyaWRlX2xlZ2FjeV9pcnEodTggYnVzX2lycSwgdTggcG9sYXJpdHksIHU4IHRyaWdnZXIsIHUzMiBnc2kpCiB7CiAJaW50IGlvYXBpYzsKQEAgLTk2MCwxNCArOTUyLDYgQEAKIAlzZXRfYml0KE1QX0lTQV9CVVMsIG1wX2J1c19ub3RfcGNpKTsKIAlwcl9kZWJ1ZygiQnVzICMlZCBpcyBJU0FcbiIsIE1QX0lTQV9CVVMpOwogCi0jaWZkZWYgQ09ORklHX1g4Nl9FUzcwMDAKLQkvKgotCSAqIE9sZGVyIGdlbmVyYXRpb25zIG9mIEVTNzAwMCBoYXZlIG5vIGxlZ2FjeSBpZGVudGl0eSBtYXBwaW5ncwotCSAqLwotCWlmIChlczcwMDBfcGxhdCA9PSAxKQotCQlyZXR1cm47Ci0jZW5kaWYKLQogCS8qCiAJICogVXNlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBJUlFzIDAtMTUuICBVbmxlc3MKIAkgKiBvdmVycmlkZGVuIGJ5IChNQURUKSBpbnRlcnJ1cHQgc291cmNlIG92ZXJyaWRlIGVudHJpZXMuCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX25iLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYW1kX25iLmMKaW5kZXggZGVjOGRlNC4uZjA0ZGJiMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FtZF9uYi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfbmIuYwpAQCAtMjIsNiArMjIsNyBAQAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTVIX00xMEhfRjMpIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF8xNUhfTTMwSF9OQl9GMykgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EXzE2SF9OQl9GMykgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EXzE2SF9NMzBIX05CX0YzKSB9LAogCXt9CiB9OwogRVhQT1JUX1NZTUJPTChhbWRfbmJfbWlzY19pZHMpOwpAQCAtMzAsNiArMzEsNyBAQAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTVIX05CX0Y0KSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTVIX00zMEhfTkJfRjQpIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF8xNkhfTkJfRjQpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF8xNkhfTTMwSF9OQl9GNCkgfSwKIAl7fQogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvTWFrZWZpbGUgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9NYWtlZmlsZQppbmRleCAwYWUwMzIzLi5kY2I1YjE1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9NYWtlZmlsZQpAQCAtMTgsMTAgKzE4LDcgQEAKIGVuZGlmCiAKICMgQVBJQyBwcm9iZSB3aWxsIGRlcGVuZCBvbiB0aGUgbGlzdGluZyBvcmRlciBoZXJlCi1vYmotJChDT05GSUdfWDg2X05VTUFRKQkJKz0gbnVtYXFfMzIubwotb2JqLSQoQ09ORklHX1g4Nl9TVU1NSVQpCSs9IHN1bW1pdF8zMi5vCiBvYmotJChDT05GSUdfWDg2X0JJR1NNUCkJKz0gYmlnc21wXzMyLm8KLW9iai0kKENPTkZJR19YODZfRVM3MDAwKQkrPSBlczcwMDBfMzIubwogCiAjIEZvciAzMmJpdCwgcHJvYmVfMzIgbmVlZCB0byBiZSBsaXN0ZWQgbGFzdAogb2JqLSQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKQkrPSBwcm9iZV8kKEJJVFMpLm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYwppbmRleCA1M2UyMDUzLi40ODFhZTM4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCkBAIC0yMTM2LDcgKzIxMzYsNiBAQAogCSAqCiAJICogLSBhcmNoL3g4Ni9rZXJuZWwvbXBwYXJzZS5jOiBNUF9wcm9jZXNzb3JfaW5mbygpCiAJICogLSBhcmNoL3g4Ni9tbS9hbWR0b3BvbG9neS5jOiBhbWRfbnVtYV9pbml0KCkKLQkgKiAtIGFyY2gveDg2L3BsYXRmb3JtL3Zpc3dzL3Zpc3dzX3F1aXJrcy5jOiBNUF9wcm9jZXNzb3JfaW5mbygpCiAJICoKIAkgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIHdpdGggdGhlIG1vZGlmaWVkCiAJICogYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkLiBTbywgZGlzYWJsZWRfY3B1X2FwaWNpZCBrZXJuZWwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2VzNzAwMF8zMi5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvZXM3MDAwXzMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOGY4YjMuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvZXM3MDAwXzMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MzggKzAsMCBAQAotLyoKLSAqIFdyaXR0ZW4gYnk6IEdhcnJ5IEZvcnNncmVuLCBVbmlzeXMgQ29ycG9yYXRpb24KLSAqICAgICAgICAgICAgIE5hdGFsaWUgUHJvdGFzZXZpY2gsIFVuaXN5cyBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSB0byBjb25maWd1cmUgYW5kIGludGVyZmFjZQotICogd2l0aCBVbmlzeXMgRVM3MDAwIHNlcmllcyBoYXJkd2FyZSBzeXN0ZW0gbWFuYWdlci4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgVW5pc3lzIENvcnBvcmF0aW9uLgotICogQ29weXJpZ2h0IChDKSAyMDA5LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgotICoKLSAqICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogVW5pc3lzIENvcnBvcmF0aW9uLCBUb3duc2hpcCBMaW5lICYgVW5pb24gTWVldGluZwotICogUm9hZHMtQSwgVW5pc3lzIFdheSwgQmx1ZSBCZWxsLCBQZW5uc3lsdmFuaWEsIDE5NDI0LCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnVuaXN5cy5jb20KLSAqLwotCi0jZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10Ci0KLSNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgotI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KLSNpbmNsdWRlIDxsaW51eC9ubWkuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8YXNtL2FwaWNkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vZml4bWFwLmg+Ci0jaW5jbHVkZSA8YXNtL21wc3BlYy5oPgotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9hcGljLmg+Ci0jaW5jbHVkZSA8YXNtL2lwaS5oPgotCi0vKgotICogRVM3MDAwIGNoaXBzZXRzCi0gKi8KLQotI2RlZmluZSBOT05fVU5JU1lTCQkJMAotI2RlZmluZSBFUzcwMDBfQ0xBU1NJQwkJCTEKLSNkZWZpbmUgRVM3MDAwX1pPUlJPCQkJMgotCi0jZGVmaW5lCU1JUF9SRUcJCQkJMQotI2RlZmluZQlNSVBfUFNBSV9SRUcJCQk0Ci0KLSNkZWZpbmUJTUlQX0JVU1kJCQkxCi0jZGVmaW5lCU1JUF9TUElOCQkJMHhmMDAwMAotI2RlZmluZQlNSVBfVkFMSUQJCQkweDAxMDAwMDAwMDAwMDAwMDBVTEwKLSNkZWZpbmUJTUlQX1NXX0FQSUMJCQkweDEwMjBiCi0KLSNkZWZpbmUJTUlQX1BPUlQodmFsKQkJCSgodmFsID4+IDMyKSAmIDB4ZmZmZikKLQotI2RlZmluZQlNSVBfUkRfTE8odmFsKQkJCSh2YWwgJiAweGZmZmZmZmZmKQotCi1zdHJ1Y3QgbWlwX3JlZyB7Ci0JdW5zaWduZWQgbG9uZyBsb25nCQlvZmZfMHgwMDsKLQl1bnNpZ25lZCBsb25nIGxvbmcJCW9mZl8weDA4OwotCXVuc2lnbmVkIGxvbmcgbG9uZwkJb2ZmXzB4MTA7Ci0JdW5zaWduZWQgbG9uZyBsb25nCQlvZmZfMHgxODsKLQl1bnNpZ25lZCBsb25nIGxvbmcJCW9mZl8weDIwOwotCXVuc2lnbmVkIGxvbmcgbG9uZwkJb2ZmXzB4Mjg7Ci0JdW5zaWduZWQgbG9uZyBsb25nCQlvZmZfMHgzMDsKLQl1bnNpZ25lZCBsb25nIGxvbmcJCW9mZl8weDM4OwotfTsKLQotc3RydWN0IG1pcF9yZWdfaW5mbyB7Ci0JdW5zaWduZWQgbG9uZyBsb25nCQltaXBfaW5mbzsKLQl1bnNpZ25lZCBsb25nIGxvbmcJCWRlbGl2ZXJ5X2luZm87Ci0JdW5zaWduZWQgbG9uZyBsb25nCQlob3N0X3JlZzsKLQl1bnNpZ25lZCBsb25nIGxvbmcJCW1pcF9yZWc7Ci19OwotCi1zdHJ1Y3QgcHNhaSB7Ci0JdW5zaWduZWQgbG9uZyBsb25nCQllbnRyeV90eXBlOwotCXVuc2lnbmVkIGxvbmcgbG9uZwkJYWRkcjsKLQl1bnNpZ25lZCBsb25nIGxvbmcJCWJlcF9hZGRyOwotfTsKLQotI2lmZGVmIENPTkZJR19BQ1BJCi0KLXN0cnVjdCBlczcwMDBfb2VtX3RhYmxlIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIJSGVhZGVyOwotCXUzMgkJCQlPRU1UYWJsZUFkZHI7Ci0JdTMyCQkJCU9FTVRhYmxlU2l6ZTsKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCQkJb2VtX2FkZHJYOwotc3RhdGljIHVuc2lnbmVkIGxvbmcJCQlvZW1fc2l6ZTsKLQotI2VuZGlmCi0KLS8qCi0gKiBFUzcwMDAgR2xvYmFscwotICovCi0KLXN0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nCQkqcHNhaTsKLXN0YXRpYyBzdHJ1Y3QgbWlwX3JlZwkJCSptaXBfcmVnOwotc3RhdGljIHN0cnVjdCBtaXBfcmVnCQkJKmhvc3RfcmVnOwotc3RhdGljIGludCAJCQkJbWlwX3BvcnQ7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZwkJCW1pcF9hZGRyOwotc3RhdGljIHVuc2lnbmVkIGxvbmcJCQlob3N0X2FkZHI7Ci0KLWludAkJCQkJZXM3MDAwX3BsYXQ7Ci0KLS8qCi0gKiBHU0kgb3ZlcnJpZGUgZm9yIEVTNzAwMCBwbGF0Zm9ybXMuCi0gKi8KLQotCi1zdGF0aWMgaW50IHdha2V1cF9zZWNvbmRhcnlfY3B1X3ZpYV9taXAoaW50IGNwdSwgdW5zaWduZWQgbG9uZyBlaXApCi17Ci0JdW5zaWduZWQgbG9uZyB2ZWN0ID0gMCwgcHNhaXZhbCA9IDA7Ci0KLQlpZiAocHNhaSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQl2ZWN0ID0gKCh1bnNpZ25lZCBsb25nKV9fcGEoZWlwKS8weDEwMDApIDw8IDE2OwotCXBzYWl2YWwgPSAoMHgxMDAwMDAwIHwgdmVjdCB8IGNwdSk7Ci0KLQl3aGlsZSAoKnBzYWkgJiAweDEwMDAwMDApCi0JCTsKLQotCSpwc2FpID0gcHNhaXZhbDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGVzNzAwMF9hcGljX2lzX2NsdXN0ZXIodm9pZCkKLXsKLQkvKiBNUEVOVElVTUlJSSAqLwotCWlmIChib290X2NwdV9kYXRhLng4NiA9PSA2ICYmCi0JICAgIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCA+PSA3ICYmIGJvb3RfY3B1X2RhdGEueDg2X21vZGVsIDw9IDExKSkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc2V0dXBfdW5pc3lzKHZvaWQpCi17Ci0JLyoKLQkgKiBEZXRlcm1pbmUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIEVTNzAwMCBjdXJyZW50bHkgcnVubmluZy4KLQkgKgotCSAqIGVzNzAwMF9wbGF0ID0gMSBpZiB0aGUgbWFjaGluZSBpcyBhIDV4eCBFUzcwMDAgYm94Ci0JICogZXM3MDAwX3BsYXQgPSAyIGlmIHRoZSBtYWNoaW5lIGlzIGEgeDg2XzY0IEVTNzAwMCBib3gKLQkgKgotCSAqLwotCWlmICghKGJvb3RfY3B1X2RhdGEueDg2IDw9IDE1ICYmIGJvb3RfY3B1X2RhdGEueDg2X21vZGVsIDw9IDIpKQotCQllczcwMDBfcGxhdCA9IEVTNzAwMF9aT1JSTzsKLQllbHNlCi0JCWVzNzAwMF9wbGF0ID0gRVM3MDAwX0NMQVNTSUM7Ci19Ci0KLS8qCi0gKiBQYXJzZSB0aGUgT0VNIFRhYmxlOgotICovCi1zdGF0aWMgaW50IHBhcnNlX3VuaXN5c19vZW0oY2hhciAqb2VtcHRyKQotewotCWludAkJCWk7Ci0JaW50IAkJCXN1Y2Nlc3MgPSAwOwotCXVuc2lnbmVkIGNoYXIJCXR5cGUsIHNpemU7Ci0JdW5zaWduZWQgbG9uZwkJdmFsOwotCWNoYXIJCQkqdHAgPSBOVUxMOwotCXN0cnVjdCBwc2FpCQkqcHNhaXAgPSBOVUxMOwotCXN0cnVjdCBtaXBfcmVnX2luZm8gCSptaTsKLQlzdHJ1Y3QgbWlwX3JlZwkJKmhvc3QsICptaXA7Ci0KLQl0cCA9IG9lbXB0cjsKLQotCXRwICs9IDg7Ci0KLQlmb3IgKGkgPSAwOyBpIDw9IDY7IGkrKykgewotCQl0eXBlID0gKnRwKys7Ci0JCXNpemUgPSAqdHArKzsKLQkJdHAgLT0gMjsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgTUlQX1JFRzoKLQkJCW1pID0gKHN0cnVjdCBtaXBfcmVnX2luZm8gKil0cDsKLQkJCXZhbCA9IE1JUF9SRF9MTyhtaS0+aG9zdF9yZWcpOwotCQkJaG9zdF9hZGRyID0gdmFsOwotCQkJaG9zdCA9IChzdHJ1Y3QgbWlwX3JlZyAqKXZhbDsKLQkJCWhvc3RfcmVnID0gX192YShob3N0KTsKLQkJCXZhbCA9IE1JUF9SRF9MTyhtaS0+bWlwX3JlZyk7Ci0JCQltaXBfcG9ydCA9IE1JUF9QT1JUKG1pLT5taXBfaW5mbyk7Ci0JCQltaXBfYWRkciA9IHZhbDsKLQkJCW1pcCA9IChzdHJ1Y3QgbWlwX3JlZyAqKXZhbDsKLQkJCW1pcF9yZWcgPSBfX3ZhKG1pcCk7Ci0JCQlwcl9kZWJ1ZygiaG9zdF9yZWcgPSAweCVseFxuIiwKLQkJCQkgKHVuc2lnbmVkIGxvbmcpaG9zdF9yZWcpOwotCQkJcHJfZGVidWcoIm1pcF9yZWcgPSAweCVseFxuIiwKLQkJCQkgKHVuc2lnbmVkIGxvbmcpbWlwX3JlZyk7Ci0JCQlzdWNjZXNzKys7Ci0JCQlicmVhazsKLQkJY2FzZSBNSVBfUFNBSV9SRUc6Ci0JCQlwc2FpcCA9IChzdHJ1Y3QgcHNhaSAqKXRwOwotCQkJaWYgKHRwICE9IE5VTEwpIHsKLQkJCQlpZiAocHNhaXAtPmFkZHIpCi0JCQkJCXBzYWkgPSBfX3ZhKHBzYWlwLT5hZGRyKTsKLQkJCQllbHNlCi0JCQkJCXBzYWkgPSBOVUxMOwotCQkJCXN1Y2Nlc3MrKzsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJdHAgKz0gc2l6ZTsKLQl9Ci0KLQlpZiAoc3VjY2VzcyA8IDIpCi0JCWVzNzAwMF9wbGF0ID0gTk9OX1VOSVNZUzsKLQllbHNlCi0JCXNldHVwX3VuaXN5cygpOwotCi0JcmV0dXJuIGVzNzAwMF9wbGF0OwotfQotCi0jaWZkZWYgQ09ORklHX0FDUEkKLXN0YXRpYyBpbnQgX19pbml0IGZpbmRfdW5pc3lzX2FjcGlfb2VtX3RhYmxlKHVuc2lnbmVkIGxvbmcgKm9lbV9hZGRyKQotewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyID0gTlVMTDsKLQlzdHJ1Y3QgZXM3MDAwX29lbV90YWJsZSAqdGFibGU7Ci0JYWNwaV9zaXplIHRibF9zaXplOwotCWFjcGlfc3RhdHVzIHJldDsKLQlpbnQgaSA9IDA7Ci0KLQlmb3IgKDs7KSB7Ci0JCXJldCA9IGFjcGlfZ2V0X3RhYmxlX3dpdGhfc2l6ZSgiT0VNMSIsIGkrKywgJmhlYWRlciwgJnRibF9zaXplKTsKLQkJaWYgKCFBQ1BJX1NVQ0NFU1MocmV0KSkKLQkJCXJldHVybiAtMTsKLQotCQlpZiAoIW1lbWNtcCgoY2hhciAqKSAmaGVhZGVyLT5vZW1faWQsICJVTklTWVMiLCA2KSkKLQkJCWJyZWFrOwotCi0JCWVhcmx5X2FjcGlfb3NfdW5tYXBfbWVtb3J5KGhlYWRlciwgdGJsX3NpemUpOwotCX0KLQotCXRhYmxlID0gKHZvaWQgKiloZWFkZXI7Ci0KLQlvZW1fYWRkclgJPSB0YWJsZS0+T0VNVGFibGVBZGRyOwotCW9lbV9zaXplCT0gdGFibGUtPk9FTVRhYmxlU2l6ZTsKLQotCWVhcmx5X2FjcGlfb3NfdW5tYXBfbWVtb3J5KGhlYWRlciwgdGJsX3NpemUpOwotCi0JKm9lbV9hZGRyCT0gKHVuc2lnbmVkIGxvbmcpX19hY3BpX21hcF90YWJsZShvZW1fYWRkclgsIG9lbV9zaXplKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgdW5tYXBfdW5pc3lzX2FjcGlfb2VtX3RhYmxlKHVuc2lnbmVkIGxvbmcgb2VtX2FkZHIpCi17Ci0JaWYgKCFvZW1fYWRkcikKLQkJcmV0dXJuOwotCi0JX19hY3BpX3VubWFwX3RhYmxlKChjaGFyICopb2VtX2FkZHIsIG9lbV9zaXplKTsKLX0KLQotc3RhdGljIGludCBlczcwMDBfY2hlY2tfZHNkdCh2b2lkKQotewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7Ci0KLQlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X3RhYmxlX2hlYWRlcihBQ1BJX1NJR19EU0RULCAwLCAmaGVhZGVyKSkgJiYKLQkgICAgIXN0cm5jbXAoaGVhZGVyLm9lbV9pZCwgIlVOSVNZUyIsIDYpKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBlczcwMDBfYWNwaV9yZXQ7Ci0KLS8qIEhvb2sgZnJvbSBnZW5lcmljIEFDUEkgdGFibGVzLmMgKi8KLXN0YXRpYyBpbnQgX19pbml0IGVzNzAwMF9hY3BpX21hZHRfb2VtX2NoZWNrKGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkKQotewotCXVuc2lnbmVkIGxvbmcgb2VtX2FkZHIgPSAwOwotCWludCBjaGVja19kc2R0OwotCWludCByZXQgPSAwOwotCi0JLyogY2hlY2sgZHNkdCBhdCBmaXJzdCB0byBhdm9pZCBjbGVhciBmaXhfbWFwIGZvciBvZW1fYWRkciAqLwotCWNoZWNrX2RzZHQgPSBlczcwMDBfY2hlY2tfZHNkdCgpOwotCi0JaWYgKCFmaW5kX3VuaXN5c19hY3BpX29lbV90YWJsZSgmb2VtX2FkZHIpKSB7Ci0JCWlmIChjaGVja19kc2R0KSB7Ci0JCQlyZXQgPSBwYXJzZV91bmlzeXNfb2VtKChjaGFyICopb2VtX2FkZHIpOwotCQl9IGVsc2UgewotCQkJc2V0dXBfdW5pc3lzKCk7Ci0JCQlyZXQgPSAxOwotCQl9Ci0JCS8qCi0JCSAqIHdlIG5lZWQgdG8gdW5tYXAgaXQKLQkJICovCi0JCXVubWFwX3VuaXN5c19hY3BpX29lbV90YWJsZShvZW1fYWRkcik7Ci0JfQotCi0JZXM3MDAwX2FjcGlfcmV0ID0gcmV0OwotCi0JcmV0dXJuIHJldCAmJiAhZXM3MDAwX2FwaWNfaXNfY2x1c3RlcigpOwotfQotCi1zdGF0aWMgaW50IGVzNzAwMF9hY3BpX21hZHRfb2VtX2NoZWNrX2NsdXN0ZXIoY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpCi17Ci0JaW50IHJldCA9IGVzNzAwMF9hY3BpX3JldDsKLQotCXJldHVybiByZXQgJiYgZXM3MDAwX2FwaWNfaXNfY2x1c3RlcigpOwotfQotCi0jZWxzZSAvKiAhQ09ORklHX0FDUEk6ICovCi1zdGF0aWMgaW50IGVzNzAwMF9hY3BpX21hZHRfb2VtX2NoZWNrKGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGVzNzAwMF9hY3BpX21hZHRfb2VtX2NoZWNrX2NsdXN0ZXIoY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogIUNPTkZJR19BQ1BJICovCi0KLXN0YXRpYyB2b2lkIGVzNzAwMF9zcGluKGludCBuKQotewotCWludCBpID0gMDsKLQotCXdoaWxlIChpKysgPCBuKQotCQlyZXBfbm9wKCk7Ci19Ci0KLXN0YXRpYyBpbnQgZXM3MDAwX21pcF93cml0ZShzdHJ1Y3QgbWlwX3JlZyAqbWlwX3JlZykKLXsKLQlpbnQgc3RhdHVzID0gMDsKLQlpbnQgc3BpbjsKLQotCXNwaW4gPSBNSVBfU1BJTjsKLQl3aGlsZSAoKGhvc3RfcmVnLT5vZmZfMHgzOCAmIE1JUF9WQUxJRCkgIT0gMCkgewotCQlpZiAoLS1zcGluIDw9IDApIHsKLQkJCVdBUk4oMSwJIlRpbWVvdXQgd2FpdGluZyBmb3IgSG9zdCBWYWxpZCBGbGFnXG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQllczcwMDBfc3BpbihNSVBfU1BJTik7Ci0JfQotCi0JbWVtY3B5KGhvc3RfcmVnLCBtaXBfcmVnLCBzaXplb2Yoc3RydWN0IG1pcF9yZWcpKTsKLQlvdXRiKDEsIG1pcF9wb3J0KTsKLQotCXNwaW4gPSBNSVBfU1BJTjsKLQotCXdoaWxlICgobWlwX3JlZy0+b2ZmXzB4MzggJiBNSVBfVkFMSUQpID09IDApIHsKLQkJaWYgKC0tc3BpbiA8PSAwKSB7Ci0JCQlXQVJOKDEsCSJUaW1lb3V0IHdhaXRpbmcgZm9yIE1JUCBWYWxpZCBGbGFnXG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQllczcwMDBfc3BpbihNSVBfU1BJTik7Ci0JfQotCi0Jc3RhdHVzID0gKG1pcF9yZWctPm9mZl8weDAwICYgMHhmZmZmMDAwMDAwMDAwMFVMTCkgPj4gNDg7Ci0JbWlwX3JlZy0+b2ZmXzB4MzggJj0gfk1JUF9WQUxJRDsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyB2b2lkIGVzNzAwMF9lbmFibGVfYXBpY19tb2RlKHZvaWQpCi17Ci0Jc3RydWN0IG1pcF9yZWcgZXM3MDAwX21pcF9yZWc7Ci0JaW50IG1pcF9zdGF0dXM7Ci0KLQlpZiAoIWVzNzAwMF9wbGF0KQotCQlyZXR1cm47Ci0KLQlwcl9pbmZvKCJFbmFibGluZyBBUElDIG1vZGUuXG4iKTsKLQltZW1zZXQoJmVzNzAwMF9taXBfcmVnLCAwLCBzaXplb2Yoc3RydWN0IG1pcF9yZWcpKTsKLQllczcwMDBfbWlwX3JlZy5vZmZfMHgwMCA9IE1JUF9TV19BUElDOwotCWVzNzAwMF9taXBfcmVnLm9mZl8weDM4ID0gTUlQX1ZBTElEOwotCi0Jd2hpbGUgKChtaXBfc3RhdHVzID0gZXM3MDAwX21pcF93cml0ZSgmZXM3MDAwX21pcF9yZWcpKSAhPSAwKQotCQlXQVJOKDEsICJDb21tYW5kIGZhaWxlZCwgc3RhdHVzID0gJXhcbiIsIG1pcF9zdGF0dXMpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGVzNzAwMF9nZXRfYXBpY19pZCh1bnNpZ25lZCBsb25nIHgpCi17Ci0JcmV0dXJuICh4ID4+IDI0KSAmIDB4RkY7Ci19Ci0KLXN0YXRpYyB2b2lkIGVzNzAwMF9zZW5kX0lQSV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLCBpbnQgdmVjdG9yKQotewotCWRlZmF1bHRfc2VuZF9JUElfbWFza19zZXF1ZW5jZV9waHlzKG1hc2ssIHZlY3Rvcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGVzNzAwMF9zZW5kX0lQSV9hbGxidXRzZWxmKGludCB2ZWN0b3IpCi17Ci0JZGVmYXVsdF9zZW5kX0lQSV9tYXNrX2FsbGJ1dHNlbGZfcGh5cyhjcHVfb25saW5lX21hc2ssIHZlY3Rvcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGVzNzAwMF9zZW5kX0lQSV9hbGwoaW50IHZlY3RvcikKLXsKLQllczcwMDBfc2VuZF9JUElfbWFzayhjcHVfb25saW5lX21hc2ssIHZlY3Rvcik7Ci19Ci0KLXN0YXRpYyBpbnQgZXM3MDAwX2FwaWNfaWRfcmVnaXN0ZXJlZCh2b2lkKQotewotCXJldHVybiAxOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNwdW1hc2sgKnRhcmdldF9jcHVzX2NsdXN0ZXIodm9pZCkKLXsKLQlyZXR1cm4gY3B1X2FsbF9tYXNrOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmVzNzAwMF90YXJnZXRfY3B1cyh2b2lkKQotewotCXJldHVybiBjcHVtYXNrX29mKHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVzNzAwMF9jaGVja19hcGljaWRfdXNlZChwaHlzaWRfbWFza190ICptYXAsIGludCBhcGljaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVzNzAwMF9jaGVja19hcGljaWRfcHJlc2VudChpbnQgYml0KQotewotCXJldHVybiBwaHlzaWRfaXNzZXQoYml0LCBwaHlzX2NwdV9wcmVzZW50X21hcCk7Ci19Ci0KLXN0YXRpYyBpbnQgZXM3MDAwX2Vhcmx5X2xvZ2ljYWxfYXBpY2lkKGludCBjcHUpCi17Ci0JLyogb24gZXM3MDAwLCBsb2dpY2FsIGFwaWNpZCBpcyB0aGUgc2FtZSBhcyBwaHlzaWNhbCAqLwotCXJldHVybiBlYXJseV9wZXJfY3B1KHg4Nl9iaW9zX2NwdV9hcGljaWQsIGNwdSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNhbGN1bGF0ZV9sZHIoaW50IGNwdSkKLXsKLQl1bnNpZ25lZCBsb25nIGlkID0gcGVyX2NwdSh4ODZfYmlvc19jcHVfYXBpY2lkLCBjcHUpOwotCi0JcmV0dXJuIFNFVF9BUElDX0xPR0lDQUxfSUQoaWQpOwotfQotCi0vKgotICogU2V0IHVwIHRoZSBsb2dpY2FsIGRlc3RpbmF0aW9uIElELgotICoKLSAqIEludGVsIHJlY29tbWVuZHMgdG8gc2V0IERGUiwgTGRSIGFuZCBUUFIgYmVmb3JlIGVuYWJsaW5nCi0gKiBhbiBBUElDLiAgU2VlIGUuZy4gIkFQLTM4OCA4MjQ4OURYIFVzZXIncyBNYW51YWwiIChJbnRlbAotICogZG9jdW1lbnQgbnVtYmVyIDI5MjExNikuICBTbyBoZXJlIGl0IGdvZXMuLi4KLSAqLwotc3RhdGljIHZvaWQgZXM3MDAwX2luaXRfYXBpY19sZHJfY2x1c3Rlcih2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQlhcGljX3dyaXRlKEFQSUNfREZSLCBBUElDX0RGUl9DTFVTVEVSKTsKLQl2YWwgPSBjYWxjdWxhdGVfbGRyKGNwdSk7Ci0JYXBpY193cml0ZShBUElDX0xEUiwgdmFsKTsKLX0KLQotc3RhdGljIHZvaWQgZXM3MDAwX2luaXRfYXBpY19sZHIodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JYXBpY193cml0ZShBUElDX0RGUiwgQVBJQ19ERlJfRkxBVCk7Ci0JdmFsID0gY2FsY3VsYXRlX2xkcihjcHUpOwotCWFwaWNfd3JpdGUoQVBJQ19MRFIsIHZhbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVzNzAwMF9zZXR1cF9hcGljX3JvdXRpbmcodm9pZCkKLXsKLQlpbnQgYXBpYyA9IHBlcl9jcHUoeDg2X2Jpb3NfY3B1X2FwaWNpZCwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQotCXByX2luZm8oIkVuYWJsaW5nIEFQSUMgbW9kZTogICVzLiBVc2luZyAlZCBJL08gQVBJQ3MsIHRhcmdldCBjcHVzICVseFxuIiwKLQkJKGFwaWNfdmVyc2lvblthcGljXSA9PSAweDE0KSA/Ci0JCQkiUGh5c2ljYWwgQ2x1c3RlciIgOiAiTG9naWNhbCBDbHVzdGVyIiwKLQkJbnJfaW9hcGljcywgY3B1bWFza19iaXRzKGVzNzAwMF90YXJnZXRfY3B1cygpKVswXSk7Ci19Ci0KLXN0YXRpYyBpbnQgZXM3MDAwX2NwdV9wcmVzZW50X3RvX2FwaWNpZChpbnQgbXBzX2NwdSkKLXsKLQlpZiAoIW1wc19jcHUpCi0JCXJldHVybiBib290X2NwdV9waHlzaWNhbF9hcGljaWQ7Ci0JZWxzZSBpZiAobXBzX2NwdSA8IG5yX2NwdV9pZHMpCi0JCXJldHVybiBwZXJfY3B1KHg4Nl9iaW9zX2NwdV9hcGljaWQsIG1wc19jcHUpOwotCWVsc2UKLQkJcmV0dXJuIEJBRF9BUElDSUQ7Ci19Ci0KLXN0YXRpYyBpbnQgY3B1X2lkOwotCi1zdGF0aWMgdm9pZCBlczcwMDBfYXBpY2lkX3RvX2NwdV9wcmVzZW50KGludCBwaHlzX2FwaWNpZCwgcGh5c2lkX21hc2tfdCAqcmV0bWFwKQotewotCXBoeXNpZF9zZXRfbWFza19vZl9waHlzaWQoY3B1X2lkLCByZXRtYXApOwotCSsrY3B1X2lkOwotfQotCi1zdGF0aWMgdm9pZCBlczcwMDBfaW9hcGljX3BoeXNfaWRfbWFwKHBoeXNpZF9tYXNrX3QgKnBoeXNfbWFwLCBwaHlzaWRfbWFza190ICpyZXRtYXApCi17Ci0JLyogRm9yIGNsdXN0ZXJlZCB3ZSBkb24ndCBoYXZlIGEgZ29vZCB3YXkgdG8gZG8gdGhpcyB5ZXQgLSBoYWNrICovCi0JcGh5c2lkc19wcm9tb3RlKDB4RkZMLCByZXRtYXApOwotfQotCi1zdGF0aWMgaW50IGVzNzAwMF9jaGVja19waHlzX2FwaWNpZF9wcmVzZW50KGludCBjcHVfcGh5c2ljYWxfYXBpY2lkKQotewotCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IHJlYWRfYXBpY19pZCgpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotZXM3MDAwX2NwdV9tYXNrX3RvX2FwaWNpZChjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzaywgdW5zaWduZWQgaW50ICpkZXN0X2lkKQotewotCXVuc2lnbmVkIGludCByb3VuZCA9IDA7Ci0JdW5zaWduZWQgaW50IGNwdSwgdW5pbml0aWFsaXplZF92YXIoYXBpY2lkKTsKLQotCS8qCi0JICogVGhlIGNwdXMgaW4gdGhlIG1hc2sgbXVzdCBhbGwgYmUgb24gdGhlIGFwaWMgY2x1c3Rlci4KLQkgKi8KLQlmb3JfZWFjaF9jcHVfYW5kKGNwdSwgY3B1bWFzaywgY3B1X29ubGluZV9tYXNrKSB7Ci0JCWludCBuZXdfYXBpY2lkID0gZWFybHlfcGVyX2NwdSh4ODZfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkLCBjcHUpOwotCi0JCWlmIChyb3VuZCAmJiBBUElDX0NMVVNURVIoYXBpY2lkKSAhPSBBUElDX0NMVVNURVIobmV3X2FwaWNpZCkpIHsKLQkJCVdBUk4oMSwgIk5vdCBhIHZhbGlkIG1hc2shIik7Ci0KLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWFwaWNpZCB8PSBuZXdfYXBpY2lkOwotCQlyb3VuZCsrOwotCX0KLQlpZiAoIXJvdW5kKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkqZGVzdF9pZCA9IGFwaWNpZDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotZXM3MDAwX2NwdV9tYXNrX3RvX2FwaWNpZF9hbmQoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmlubWFzaywKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICphbmRtYXNrLAotCQkJICAgICAgdW5zaWduZWQgaW50ICphcGljaWQpCi17Ci0JY3B1bWFza192YXJfdCBjcHVtYXNrOwotCSphcGljaWQgPSBlYXJseV9wZXJfY3B1KHg4Nl9jcHVfdG9fbG9naWNhbF9hcGljaWQsIDApOwotCi0JaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmY3B1bWFzaywgR0ZQX0FUT01JQykpCi0JCXJldHVybiAwOwotCi0JY3B1bWFza19hbmQoY3B1bWFzaywgaW5tYXNrLCBhbmRtYXNrKTsKLQllczcwMDBfY3B1X21hc2tfdG9fYXBpY2lkKGNwdW1hc2ssIGFwaWNpZCk7Ci0KLQlmcmVlX2NwdW1hc2tfdmFyKGNwdW1hc2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZXM3MDAwX3BoeXNfcGtnX2lkKGludCBjcHVpZF9hcGljLCBpbnQgaW5kZXhfbXNiKQotewotCXJldHVybiBjcHVpZF9hcGljID4+IGluZGV4X21zYjsKLX0KLQotc3RhdGljIGludCBwcm9iZV9lczcwMDAodm9pZCkKLXsKLQkvKiBwcm9iZWQgbGF0ZXIgaW4gbXB0YWJsZS9BQ1BJIGhvb2tzICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZXM3MDAwX21wc19yZXQ7Ci1zdGF0aWMgaW50IGVzNzAwMF9tcHNfb2VtX2NoZWNrKHN0cnVjdCBtcGNfdGFibGUgKm1wYywgY2hhciAqb2VtLAotCQljaGFyICpwcm9kdWN0aWQpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAobXBjLT5vZW1wdHIpIHsKLQkJc3RydWN0IG1wY19vZW10YWJsZSAqb2VtX3RhYmxlID0KLQkJCShzdHJ1Y3QgbXBjX29lbXRhYmxlICopbXBjLT5vZW1wdHI7Ci0KLQkJaWYgKCFzdHJuY21wKG9lbSwgIlVOSVNZUyIsIDYpKQotCQkJcmV0ID0gcGFyc2VfdW5pc3lzX29lbSgoY2hhciAqKW9lbV90YWJsZSk7Ci0JfQotCi0JZXM3MDAwX21wc19yZXQgPSByZXQ7Ci0KLQlyZXR1cm4gcmV0ICYmICFlczcwMDBfYXBpY19pc19jbHVzdGVyKCk7Ci19Ci0KLXN0YXRpYyBpbnQgZXM3MDAwX21wc19vZW1fY2hlY2tfY2x1c3RlcihzdHJ1Y3QgbXBjX3RhYmxlICptcGMsIGNoYXIgKm9lbSwKLQkJY2hhciAqcHJvZHVjdGlkKQotewotCWludCByZXQgPSBlczcwMDBfbXBzX3JldDsKLQotCXJldHVybiByZXQgJiYgZXM3MDAwX2FwaWNfaXNfY2x1c3RlcigpOwotfQotCi0vKiBXZSd2ZSBiZWVuIHdhcm5lZCBieSBhIGZhbHNlIHBvc2l0aXZlIHdhcm5pbmcuVXNlIF9fcmVmZGF0YSB0byBrZWVwIGNhbG0uICovCi1zdGF0aWMgc3RydWN0IGFwaWMgX19yZWZkYXRhIGFwaWNfZXM3MDAwX2NsdXN0ZXIgPSB7Ci0KLQkubmFtZQkJCQk9ICJlczcwMDAiLAotCS5wcm9iZQkJCQk9IHByb2JlX2VzNzAwMCwKLQkuYWNwaV9tYWR0X29lbV9jaGVjawkJPSBlczcwMDBfYWNwaV9tYWR0X29lbV9jaGVja19jbHVzdGVyLAotCS5hcGljX2lkX3ZhbGlkCQkJPSBkZWZhdWx0X2FwaWNfaWRfdmFsaWQsCi0JLmFwaWNfaWRfcmVnaXN0ZXJlZAkJPSBlczcwMDBfYXBpY19pZF9yZWdpc3RlcmVkLAotCi0JLmlycV9kZWxpdmVyeV9tb2RlCQk9IGRlc3RfTG93ZXN0UHJpbywKLQkvKiBsb2dpY2FsIGRlbGl2ZXJ5IGJyb2FkY2FzdCB0byBhbGwgcHJvY3M6ICovCi0JLmlycV9kZXN0X21vZGUJCQk9IDEsCi0KLQkudGFyZ2V0X2NwdXMJCQk9IHRhcmdldF9jcHVzX2NsdXN0ZXIsCi0JLmRpc2FibGVfZXNyCQkJPSAxLAotCS5kZXN0X2xvZ2ljYWwJCQk9IDAsCi0JLmNoZWNrX2FwaWNpZF91c2VkCQk9IGVzNzAwMF9jaGVja19hcGljaWRfdXNlZCwKLQkuY2hlY2tfYXBpY2lkX3ByZXNlbnQJCT0gZXM3MDAwX2NoZWNrX2FwaWNpZF9wcmVzZW50LAotCi0JLnZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbgk9IGZsYXRfdmVjdG9yX2FsbG9jYXRpb25fZG9tYWluLAotCS5pbml0X2FwaWNfbGRyCQkJPSBlczcwMDBfaW5pdF9hcGljX2xkcl9jbHVzdGVyLAotCi0JLmlvYXBpY19waHlzX2lkX21hcAkJPSBlczcwMDBfaW9hcGljX3BoeXNfaWRfbWFwLAotCS5zZXR1cF9hcGljX3JvdXRpbmcJCT0gZXM3MDAwX3NldHVwX2FwaWNfcm91dGluZywKLQkubXVsdGlfdGltZXJfY2hlY2sJCT0gTlVMTCwKLQkuY3B1X3ByZXNlbnRfdG9fYXBpY2lkCQk9IGVzNzAwMF9jcHVfcHJlc2VudF90b19hcGljaWQsCi0JLmFwaWNpZF90b19jcHVfcHJlc2VudAkJPSBlczcwMDBfYXBpY2lkX3RvX2NwdV9wcmVzZW50LAotCS5zZXR1cF9wb3J0aW9fcmVtYXAJCT0gTlVMTCwKLQkuY2hlY2tfcGh5c19hcGljaWRfcHJlc2VudAk9IGVzNzAwMF9jaGVja19waHlzX2FwaWNpZF9wcmVzZW50LAotCS5lbmFibGVfYXBpY19tb2RlCQk9IGVzNzAwMF9lbmFibGVfYXBpY19tb2RlLAotCS5waHlzX3BrZ19pZAkJCT0gZXM3MDAwX3BoeXNfcGtnX2lkLAotCS5tcHNfb2VtX2NoZWNrCQkJPSBlczcwMDBfbXBzX29lbV9jaGVja19jbHVzdGVyLAotCi0JLmdldF9hcGljX2lkCQkJPSBlczcwMDBfZ2V0X2FwaWNfaWQsCi0JLnNldF9hcGljX2lkCQkJPSBOVUxMLAotCS5hcGljX2lkX21hc2sJCQk9IDB4RkYgPDwgMjQsCi0KLQkuY3B1X21hc2tfdG9fYXBpY2lkX2FuZAkJPSBlczcwMDBfY3B1X21hc2tfdG9fYXBpY2lkX2FuZCwKLQotCS5zZW5kX0lQSV9tYXNrCQkJPSBlczcwMDBfc2VuZF9JUElfbWFzaywKLQkuc2VuZF9JUElfbWFza19hbGxidXRzZWxmCT0gTlVMTCwKLQkuc2VuZF9JUElfYWxsYnV0c2VsZgkJPSBlczcwMDBfc2VuZF9JUElfYWxsYnV0c2VsZiwKLQkuc2VuZF9JUElfYWxsCQkJPSBlczcwMDBfc2VuZF9JUElfYWxsLAotCS5zZW5kX0lQSV9zZWxmCQkJPSBkZWZhdWx0X3NlbmRfSVBJX3NlbGYsCi0KLQkud2FrZXVwX3NlY29uZGFyeV9jcHUJCT0gd2FrZXVwX3NlY29uZGFyeV9jcHVfdmlhX21pcCwKLQotCS50cmFtcG9saW5lX3BoeXNfbG93CQk9IDB4NDY3LAotCS50cmFtcG9saW5lX3BoeXNfaGlnaAkJPSAweDQ2OSwKLQotCS53YWl0X2Zvcl9pbml0X2RlYXNzZXJ0CQk9IGZhbHNlLAotCS8qIE5vdGhpbmcgdG8gZG8gZm9yIG1vc3QgcGxhdGZvcm1zLCBzaW5jZSBjbGVhcmVkIGJ5IHRoZSBJTklUIGN5Y2xlOiAqLwotCS5zbXBfY2FsbGluX2NsZWFyX2xvY2FsX2FwaWMJPSBOVUxMLAotCS5pbnF1aXJlX3JlbW90ZV9hcGljCQk9IGRlZmF1bHRfaW5xdWlyZV9yZW1vdGVfYXBpYywKLQotCS5yZWFkCQkJCT0gbmF0aXZlX2FwaWNfbWVtX3JlYWQsCi0JLndyaXRlCQkJCT0gbmF0aXZlX2FwaWNfbWVtX3dyaXRlLAotCS5lb2lfd3JpdGUJCQk9IG5hdGl2ZV9hcGljX21lbV93cml0ZSwKLQkuaWNyX3JlYWQJCQk9IG5hdGl2ZV9hcGljX2ljcl9yZWFkLAotCS5pY3Jfd3JpdGUJCQk9IG5hdGl2ZV9hcGljX2ljcl93cml0ZSwKLQkud2FpdF9pY3JfaWRsZQkJCT0gbmF0aXZlX2FwaWNfd2FpdF9pY3JfaWRsZSwKLQkuc2FmZV93YWl0X2ljcl9pZGxlCQk9IG5hdGl2ZV9zYWZlX2FwaWNfd2FpdF9pY3JfaWRsZSwKLQotCS54ODZfMzJfZWFybHlfbG9naWNhbF9hcGljaWQJPSBlczcwMDBfZWFybHlfbG9naWNhbF9hcGljaWQsCi19OwotCi1zdGF0aWMgc3RydWN0IGFwaWMgX19yZWZkYXRhIGFwaWNfZXM3MDAwID0gewotCi0JLm5hbWUJCQkJPSAiZXM3MDAwIiwKLQkucHJvYmUJCQkJPSBwcm9iZV9lczcwMDAsCi0JLmFjcGlfbWFkdF9vZW1fY2hlY2sJCT0gZXM3MDAwX2FjcGlfbWFkdF9vZW1fY2hlY2ssCi0JLmFwaWNfaWRfdmFsaWQJCQk9IGRlZmF1bHRfYXBpY19pZF92YWxpZCwKLQkuYXBpY19pZF9yZWdpc3RlcmVkCQk9IGVzNzAwMF9hcGljX2lkX3JlZ2lzdGVyZWQsCi0KLQkuaXJxX2RlbGl2ZXJ5X21vZGUJCT0gZGVzdF9GaXhlZCwKLQkvKiBwaHlzIGRlbGl2ZXJ5IHRvIHRhcmdldCBDUFVzOiAqLwotCS5pcnFfZGVzdF9tb2RlCQkJPSAwLAotCi0JLnRhcmdldF9jcHVzCQkJPSBlczcwMDBfdGFyZ2V0X2NwdXMsCi0JLmRpc2FibGVfZXNyCQkJPSAxLAotCS5kZXN0X2xvZ2ljYWwJCQk9IDAsCi0JLmNoZWNrX2FwaWNpZF91c2VkCQk9IGVzNzAwMF9jaGVja19hcGljaWRfdXNlZCwKLQkuY2hlY2tfYXBpY2lkX3ByZXNlbnQJCT0gZXM3MDAwX2NoZWNrX2FwaWNpZF9wcmVzZW50LAotCi0JLnZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbgk9IGZsYXRfdmVjdG9yX2FsbG9jYXRpb25fZG9tYWluLAotCS5pbml0X2FwaWNfbGRyCQkJPSBlczcwMDBfaW5pdF9hcGljX2xkciwKLQotCS5pb2FwaWNfcGh5c19pZF9tYXAJCT0gZXM3MDAwX2lvYXBpY19waHlzX2lkX21hcCwKLQkuc2V0dXBfYXBpY19yb3V0aW5nCQk9IGVzNzAwMF9zZXR1cF9hcGljX3JvdXRpbmcsCi0JLm11bHRpX3RpbWVyX2NoZWNrCQk9IE5VTEwsCi0JLmNwdV9wcmVzZW50X3RvX2FwaWNpZAkJPSBlczcwMDBfY3B1X3ByZXNlbnRfdG9fYXBpY2lkLAotCS5hcGljaWRfdG9fY3B1X3ByZXNlbnQJCT0gZXM3MDAwX2FwaWNpZF90b19jcHVfcHJlc2VudCwKLQkuc2V0dXBfcG9ydGlvX3JlbWFwCQk9IE5VTEwsCi0JLmNoZWNrX3BoeXNfYXBpY2lkX3ByZXNlbnQJPSBlczcwMDBfY2hlY2tfcGh5c19hcGljaWRfcHJlc2VudCwKLQkuZW5hYmxlX2FwaWNfbW9kZQkJPSBlczcwMDBfZW5hYmxlX2FwaWNfbW9kZSwKLQkucGh5c19wa2dfaWQJCQk9IGVzNzAwMF9waHlzX3BrZ19pZCwKLQkubXBzX29lbV9jaGVjawkJCT0gZXM3MDAwX21wc19vZW1fY2hlY2ssCi0KLQkuZ2V0X2FwaWNfaWQJCQk9IGVzNzAwMF9nZXRfYXBpY19pZCwKLQkuc2V0X2FwaWNfaWQJCQk9IE5VTEwsCi0JLmFwaWNfaWRfbWFzawkJCT0gMHhGRiA8PCAyNCwKLQotCS5jcHVfbWFza190b19hcGljaWRfYW5kCQk9IGVzNzAwMF9jcHVfbWFza190b19hcGljaWRfYW5kLAotCi0JLnNlbmRfSVBJX21hc2sJCQk9IGVzNzAwMF9zZW5kX0lQSV9tYXNrLAotCS5zZW5kX0lQSV9tYXNrX2FsbGJ1dHNlbGYJPSBOVUxMLAotCS5zZW5kX0lQSV9hbGxidXRzZWxmCQk9IGVzNzAwMF9zZW5kX0lQSV9hbGxidXRzZWxmLAotCS5zZW5kX0lQSV9hbGwJCQk9IGVzNzAwMF9zZW5kX0lQSV9hbGwsCi0JLnNlbmRfSVBJX3NlbGYJCQk9IGRlZmF1bHRfc2VuZF9JUElfc2VsZiwKLQotCS50cmFtcG9saW5lX3BoeXNfbG93CQk9IDB4NDY3LAotCS50cmFtcG9saW5lX3BoeXNfaGlnaAkJPSAweDQ2OSwKLQotCS53YWl0X2Zvcl9pbml0X2RlYXNzZXJ0CQk9IHRydWUsCi0JLyogTm90aGluZyB0byBkbyBmb3IgbW9zdCBwbGF0Zm9ybXMsIHNpbmNlIGNsZWFyZWQgYnkgdGhlIElOSVQgY3ljbGU6ICovCi0JLnNtcF9jYWxsaW5fY2xlYXJfbG9jYWxfYXBpYwk9IE5VTEwsCi0JLmlucXVpcmVfcmVtb3RlX2FwaWMJCT0gZGVmYXVsdF9pbnF1aXJlX3JlbW90ZV9hcGljLAotCi0JLnJlYWQJCQkJPSBuYXRpdmVfYXBpY19tZW1fcmVhZCwKLQkud3JpdGUJCQkJPSBuYXRpdmVfYXBpY19tZW1fd3JpdGUsCi0JLmVvaV93cml0ZQkJCT0gbmF0aXZlX2FwaWNfbWVtX3dyaXRlLAotCS5pY3JfcmVhZAkJCT0gbmF0aXZlX2FwaWNfaWNyX3JlYWQsCi0JLmljcl93cml0ZQkJCT0gbmF0aXZlX2FwaWNfaWNyX3dyaXRlLAotCS53YWl0X2ljcl9pZGxlCQkJPSBuYXRpdmVfYXBpY193YWl0X2ljcl9pZGxlLAotCS5zYWZlX3dhaXRfaWNyX2lkbGUJCT0gbmF0aXZlX3NhZmVfYXBpY193YWl0X2ljcl9pZGxlLAotCi0JLng4Nl8zMl9lYXJseV9sb2dpY2FsX2FwaWNpZAk9IGVzNzAwMF9lYXJseV9sb2dpY2FsX2FwaWNpZCwKLX07Ci0KLS8qCi0gKiBOZWVkIHRvIGNoZWNrIGZvciBlczcwMDAgZm9sbG93ZWQgYnkgZXM3MDAwX2NsdXN0ZXIsIHNvIHRoaXMgb3JkZXIKLSAqIGluIGFwaWNfZHJpdmVycyBpcyBpbXBvcnRhbnQuCi0gKi8KLWFwaWNfZHJpdmVycyhhcGljX2VzNzAwMCwgYXBpY19lczcwMDBfY2x1c3Rlcik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9udW1hcV8zMi5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvbnVtYXFfMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwZWExYy4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9udW1hcV8zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTI0ICswLDAgQEAKLS8qCi0gKiBXcml0dGVuIGJ5OiBQYXRyaWNpYSBHYXVnaGVuLCBJQk0gQ29ycG9yYXRpb24KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIsIElCTSBDb3JwLgotICogQ29weXJpZ2h0IChDKSAyMDA5LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICogU2VuZCBmZWVkYmFjayB0byA8Z29uZUB1cy5pYm0uY29tPgotICovCi0jaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KLSNpbmNsdWRlIDxsaW51eC90b3BvbG9neS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW16b25lLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L251bWEuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgotI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KLSNpbmNsdWRlIDxhc20vbnVtYXEuaD4KLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vYXBpYy5oPgotI2luY2x1ZGUgPGFzbS9lODIwLmg+Ci0jaW5jbHVkZSA8YXNtL2lwaS5oPgotCi1pbnQgZm91bmRfbnVtYXE7Ci0KLS8qCi0gKiBIYXZlIHRvIG1hdGNoIHRyYW5zbGF0aW9uIHRhYmxlIGVudHJpZXMgdG8gbWFpbiB0YWJsZSBlbnRyaWVzIGJ5IGNvdW50ZXIKLSAqIGhlbmNlIHRoZSBtcGNfcmVjb3JkIHZhcmlhYmxlIC4uLi4gY2FuJ3Qgc2VlIGEgbGVzcyBkaXNndXN0aW5nIHdheSBvZgotICogZG9pbmcgdGhpcyAuLi4uCi0gKi8KLXN0cnVjdCBtcGNfdHJhbnMgewotCXVuc2lnbmVkIGNoYXIJCQltcGNfdHlwZTsKLQl1bnNpZ25lZCBjaGFyCQkJdHJhbnNfbGVuOwotCXVuc2lnbmVkIGNoYXIJCQl0cmFuc190eXBlOwotCXVuc2lnbmVkIGNoYXIJCQl0cmFuc19xdWFkOwotCXVuc2lnbmVkIGNoYXIJCQl0cmFuc19nbG9iYWw7Ci0JdW5zaWduZWQgY2hhcgkJCXRyYW5zX2xvY2FsOwotCXVuc2lnbmVkIHNob3J0CQkJdHJhbnNfcmVzZXJ2ZWQ7Ci19OwotCi1zdGF0aWMgaW50CQkJCW1wY19yZWNvcmQ7Ci0KLXN0YXRpYyBzdHJ1Y3QgbXBjX3RyYW5zCQkJKnRyYW5zbGF0aW9uX3RhYmxlW01BWF9NUENfRU5UUlldOwotCi1pbnQJCQkJCW1wX2J1c19pZF90b19ub2RlW01BWF9NUF9CVVNTRVNdOwotaW50CQkJCQltcF9idXNfaWRfdG9fbG9jYWxbTUFYX01QX0JVU1NFU107Ci1pbnQJCQkJCXF1YWRfbG9jYWxfdG9fbXBfYnVzX2lkW05SX0NQVVMvNF1bNF07Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIG51bWFxX3JlZ2lzdGVyX25vZGUoaW50IG5vZGUsIHN0cnVjdCBzeXNfY2ZnX2RhdGEgKnNjZCkKLXsKLQlzdHJ1Y3QgZWFjaHF1YWRtZW0gKmVxID0gc2NkLT5lcSArIG5vZGU7Ci0JdTY0IHN0YXJ0ID0gKHU2NCkoZXEtPmhpX3NocmRfbWVtX3N0YXJ0IC0gZXEtPnByaXZfbWVtX3NpemUpIDw8IDIwOwotCXU2NCBlbmQgPSAodTY0KShlcS0+aGlfc2hyZF9tZW1fc3RhcnQgKyBlcS0+aGlfc2hyZF9tZW1fc2l6ZSkgPDwgMjA7Ci0JaW50IHJldDsKLQotCW5vZGVfc2V0KG5vZGUsIG51bWFfbm9kZXNfcGFyc2VkKTsKLQlyZXQgPSBudW1hX2FkZF9tZW1ibGsobm9kZSwgc3RhcnQsIGVuZCk7Ci0JQlVHX09OKHJldCA8IDApOwotfQotCi0vKgotICogRnVuY3Rpb246IHNtcF9kdW1wX3FjdCgpCi0gKgotICogRGVzY3JpcHRpb246IGdldHMgbWVtb3J5IGxheW91dCBmcm9tIHRoZSBxdWFkIGNvbmZpZyB0YWJsZS4gIFRoaXMKLSAqIGZ1bmN0aW9uIGFsc28gdXBkYXRlcyBudW1hX25vZGVzX3BhcnNlZCB3aXRoIHRoZSBub2RlcyAocXVhZHMpIHByZXNlbnQuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBzbXBfZHVtcF9xY3Qodm9pZCkKLXsKLQlzdHJ1Y3Qgc3lzX2NmZ19kYXRhICpzY2Q7Ci0JaW50IG5vZGU7Ci0KLQlzY2QgPSAodm9pZCAqKV9fdmEoU1lTX0NGR19EQVRBX1BSSVZfQUREUik7Ci0KLQlmb3JfZWFjaF9ub2RlKG5vZGUpIHsKLQkJaWYgKHNjZC0+cXVhZHNfcHJlc2VudDMxXzAgJiAoMSA8PCBub2RlKSkKLQkJCW51bWFxX3JlZ2lzdGVyX25vZGUobm9kZSwgc2NkKTsKLQl9Ci19Ci0KLXZvaWQgbnVtYXFfdHNjX2Rpc2FibGUodm9pZCkKLXsKLQlpZiAoIWZvdW5kX251bWFxKQotCQlyZXR1cm47Ci0KLQlpZiAobnVtX29ubGluZV9ub2RlcygpID4gMSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiTlVNQVE6IGRpc2FibGluZyBUU0NcbiIpOwotCQlzZXR1cF9jbGVhcl9jcHVfY2FwKFg4Nl9GRUFUVVJFX1RTQyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgbnVtYXFfdHNjX2luaXQodm9pZCkKLXsKLQludW1hcV90c2NfZGlzYWJsZSgpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBnZW5lcmF0ZV9sb2dpY2FsX2FwaWNpZChpbnQgcXVhZCwgaW50IHBoeXNfYXBpY2lkKQotewotCXJldHVybiAocXVhZCA8PCA0KSArIChwaHlzX2FwaWNpZCA/IHBoeXNfYXBpY2lkIDw8IDEgOiAxKTsKLX0KLQotLyogeDg2X3F1aXJrcyBtZW1iZXIgKi8KLXN0YXRpYyBpbnQgbXBjX2FwaWNfaWQoc3RydWN0IG1wY19jcHUgKm0pCi17Ci0JaW50IHF1YWQgPSB0cmFuc2xhdGlvbl90YWJsZVttcGNfcmVjb3JkXS0+dHJhbnNfcXVhZDsKLQlpbnQgbG9naWNhbF9hcGljaWQgPSBnZW5lcmF0ZV9sb2dpY2FsX2FwaWNpZChxdWFkLCBtLT5hcGljaWQpOwotCi0JcHJpbnRrKEtFUk5fREVCVUcKLQkJIlByb2Nlc3NvciAjJWQgJXU6JXUgQVBJQyB2ZXJzaW9uICVkIChxdWFkICVkLCBhcGljICVkKVxuIiwKLQkJIG0tPmFwaWNpZCwgKG0tPmNwdWZlYXR1cmUgJiBDUFVfRkFNSUxZX01BU0spID4+IDgsCi0JCShtLT5jcHVmZWF0dXJlICYgQ1BVX01PREVMX01BU0spID4+IDQsCi0JCSBtLT5hcGljdmVyLCBxdWFkLCBsb2dpY2FsX2FwaWNpZCk7Ci0KLQlyZXR1cm4gbG9naWNhbF9hcGljaWQ7Ci19Ci0KLS8qIHg4Nl9xdWlya3MgbWVtYmVyICovCi1zdGF0aWMgdm9pZCBtcGNfb2VtX2J1c19pbmZvKHN0cnVjdCBtcGNfYnVzICptLCBjaGFyICpuYW1lKQotewotCWludCBxdWFkID0gdHJhbnNsYXRpb25fdGFibGVbbXBjX3JlY29yZF0tPnRyYW5zX3F1YWQ7Ci0JaW50IGxvY2FsID0gdHJhbnNsYXRpb25fdGFibGVbbXBjX3JlY29yZF0tPnRyYW5zX2xvY2FsOwotCi0JbXBfYnVzX2lkX3RvX25vZGVbbS0+YnVzaWRdID0gcXVhZDsKLQltcF9idXNfaWRfdG9fbG9jYWxbbS0+YnVzaWRdID0gbG9jYWw7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJCdXMgIyVkIGlzICVzIChub2RlICVkKVxuIiwgbS0+YnVzaWQsIG5hbWUsIHF1YWQpOwotfQotCi0vKiB4ODZfcXVpcmtzIG1lbWJlciAqLwotc3RhdGljIHZvaWQgbXBjX29lbV9wY2lfYnVzKHN0cnVjdCBtcGNfYnVzICptKQotewotCWludCBxdWFkID0gdHJhbnNsYXRpb25fdGFibGVbbXBjX3JlY29yZF0tPnRyYW5zX3F1YWQ7Ci0JaW50IGxvY2FsID0gdHJhbnNsYXRpb25fdGFibGVbbXBjX3JlY29yZF0tPnRyYW5zX2xvY2FsOwotCi0JcXVhZF9sb2NhbF90b19tcF9idXNfaWRbcXVhZF1bbG9jYWxdID0gbS0+YnVzaWQ7Ci19Ci0KLS8qCi0gKiBDYWxsZWQgZnJvbSBtcHBhcnNlIGNvZGUuCi0gKiBtb2RlID0gMDogcHJlc2NhbgotICogbW9kZSA9IDE6IG9uZSBtcGMgZW50cnkgc2Nhbm5lZAotICovCi1zdGF0aWMgdm9pZCBudW1hcV9tcGNfcmVjb3JkKHVuc2lnbmVkIGludCBtb2RlKQotewotCWlmICghbW9kZSkKLQkJbXBjX3JlY29yZCA9IDA7Ci0JZWxzZQotCQltcGNfcmVjb3JkKys7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBNUF90cmFuc2xhdGlvbl9pbmZvKHN0cnVjdCBtcGNfdHJhbnMgKm0pCi17Ci0JcHJpbnRrKEtFUk5fSU5GTwotCSAgICAiVHJhbnNsYXRpb246IHJlY29yZCAlZCwgdHlwZSAlZCwgcXVhZCAlZCwgZ2xvYmFsICVkLCBsb2NhbCAlZFxuIiwKLQkgICAgICAgbXBjX3JlY29yZCwgbS0+dHJhbnNfdHlwZSwgbS0+dHJhbnNfcXVhZCwgbS0+dHJhbnNfZ2xvYmFsLAotCSAgICAgICBtLT50cmFuc19sb2NhbCk7Ci0KLQlpZiAobXBjX3JlY29yZCA+PSBNQVhfTVBDX0VOVFJZKQotCQlwcmludGsoS0VSTl9FUlIgIk1BWF9NUENfRU5UUlkgZXhjZWVkZWQhXG4iKTsKLQllbHNlCi0JCXRyYW5zbGF0aW9uX3RhYmxlW21wY19yZWNvcmRdID0gbTsgLyogc3Rhc2ggdGhpcyBmb3IgbGF0ZXIgKi8KLQotCWlmIChtLT50cmFuc19xdWFkIDwgTUFYX05VTU5PREVTICYmICFub2RlX29ubGluZShtLT50cmFuc19xdWFkKSkKLQkJbm9kZV9zZXRfb25saW5lKG0tPnRyYW5zX3F1YWQpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBtcGZfY2hlY2tzdW0odW5zaWduZWQgY2hhciAqbXAsIGludCBsZW4pCi17Ci0JaW50IHN1bSA9IDA7Ci0KLQl3aGlsZSAobGVuLS0pCi0JCXN1bSArPSAqbXArKzsKLQotCXJldHVybiBzdW0gJiAweEZGOwotfQotCi0vKgotICogUmVhZC9wYXJzZSB0aGUgTVBDIG9lbSB0YWJsZXMKLSAqLwotc3RhdGljIHZvaWQgX19pbml0IHNtcF9yZWFkX21wY19vZW0oc3RydWN0IG1wY190YWJsZSAqbXBjKQotewotCXN0cnVjdCBtcGNfb2VtdGFibGUgKm9lbXRhYmxlID0gKHZvaWQgKikobG9uZyltcGMtPm9lbXB0cjsKLQlpbnQgY291bnQgPSBzaXplb2YoKm9lbXRhYmxlKTsJLyogdGhlIGhlYWRlciBzaXplICovCi0JdW5zaWduZWQgY2hhciAqb2VtcHRyID0gKCh1bnNpZ25lZCBjaGFyICopb2VtdGFibGUpICsgY291bnQ7Ci0KLQltcGNfcmVjb3JkID0gMDsKLQlwcmludGsoS0VSTl9JTkZPCi0JCSJGb3VuZCBhbiBPRU0gTVBDIHRhYmxlIGF0ICU4cCAtIHBhcnNpbmcgaXQuLi5cbiIsIG9lbXRhYmxlKTsKLQotCWlmIChtZW1jbXAob2VtdGFibGUtPnNpZ25hdHVyZSwgTVBDX09FTV9TSUdOQVRVUkUsIDQpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJTTVAgbXBjIG9lbXRhYmxlOiBiYWQgc2lnbmF0dXJlIFslYyVjJWMlY10hXG4iLAotCQkgICAgICAgb2VtdGFibGUtPnNpZ25hdHVyZVswXSwgb2VtdGFibGUtPnNpZ25hdHVyZVsxXSwKLQkJICAgICAgIG9lbXRhYmxlLT5zaWduYXR1cmVbMl0sIG9lbXRhYmxlLT5zaWduYXR1cmVbM10pOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKG1wZl9jaGVja3N1bSgodW5zaWduZWQgY2hhciAqKW9lbXRhYmxlLCBvZW10YWJsZS0+bGVuZ3RoKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJTTVAgb2VtIG1wdGFibGU6IGNoZWNrc3VtIGVycm9yIVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQl3aGlsZSAoY291bnQgPCBvZW10YWJsZS0+bGVuZ3RoKSB7Ci0JCXN3aXRjaCAoKm9lbXB0cikgewotCQljYXNlIE1QX1RSQU5TTEFUSU9OOgotCQkJewotCQkJCXN0cnVjdCBtcGNfdHJhbnMgKm0gPSAodm9pZCAqKW9lbXB0cjsKLQotCQkJCU1QX3RyYW5zbGF0aW9uX2luZm8obSk7Ci0JCQkJb2VtcHRyICs9IHNpemVvZigqbSk7Ci0JCQkJY291bnQgKz0gc2l6ZW9mKCptKTsKLQkJCQkrK21wY19yZWNvcmQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgIlVucmVjb2duaXNlZCBPRU0gdGFibGUgZW50cnkgdHlwZSEgLSAlZFxuIiwKLQkJCSAgICAgICAoaW50KSpvZW1wdHIpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgX19pbml0IHZvaWQgZWFybHlfY2hlY2tfbnVtYXEodm9pZCkKLXsKLQkvKgotCSAqIGdldCBib290LXRpbWUgU01QIGNvbmZpZ3VyYXRpb246Ci0JICovCi0JaWYgKHNtcF9mb3VuZF9jb25maWcpCi0JCWVhcmx5X2dldF9zbXBfY29uZmlnKCk7Ci0KLQlpZiAoZm91bmRfbnVtYXEpIHsKLQkJeDg2X2luaXQubXBwYXJzZS5tcGNfcmVjb3JkID0gbnVtYXFfbXBjX3JlY29yZDsKLQkJeDg2X2luaXQubXBwYXJzZS5zZXR1cF9pb2FwaWNfaWRzID0geDg2X2luaXRfbm9vcDsKLQkJeDg2X2luaXQubXBwYXJzZS5tcGNfYXBpY19pZCA9IG1wY19hcGljX2lkOwotCQl4ODZfaW5pdC5tcHBhcnNlLnNtcF9yZWFkX21wY19vZW0gPSBzbXBfcmVhZF9tcGNfb2VtOwotCQl4ODZfaW5pdC5tcHBhcnNlLm1wY19vZW1fcGNpX2J1cyA9IG1wY19vZW1fcGNpX2J1czsKLQkJeDg2X2luaXQubXBwYXJzZS5tcGNfb2VtX2J1c19pbmZvID0gbXBjX29lbV9idXNfaW5mbzsKLQkJeDg2X2luaXQudGltZXJzLnRzY19wcmVfaW5pdCA9IG51bWFxX3RzY19pbml0OwotCQl4ODZfaW5pdC5wY2kuaW5pdCA9IHBjaV9udW1hcV9pbml0OwotCX0KLX0KLQotaW50IF9faW5pdCBudW1hcV9udW1hX2luaXQodm9pZCkKLXsKLQllYXJseV9jaGVja19udW1hcSgpOwotCWlmICghZm91bmRfbnVtYXEpCi0JCXJldHVybiAtRU5PRU5UOwotCXNtcF9kdW1wX3FjdCgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgTlVNQVFfQVBJQ19ERlJfVkFMVUUJKEFQSUNfREZSX0NMVVNURVIpCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG51bWFxX2dldF9hcGljX2lkKHVuc2lnbmVkIGxvbmcgeCkKLXsKLQlyZXR1cm4gKHggPj4gMjQpICYgMHgwRjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG51bWFxX3NlbmRfSVBJX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIGludCB2ZWN0b3IpCi17Ci0JZGVmYXVsdF9zZW5kX0lQSV9tYXNrX3NlcXVlbmNlX2xvZ2ljYWwobWFzaywgdmVjdG9yKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG51bWFxX3NlbmRfSVBJX2FsbGJ1dHNlbGYoaW50IHZlY3RvcikKLXsKLQlkZWZhdWx0X3NlbmRfSVBJX21hc2tfYWxsYnV0c2VsZl9sb2dpY2FsKGNwdV9vbmxpbmVfbWFzaywgdmVjdG9yKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG51bWFxX3NlbmRfSVBJX2FsbChpbnQgdmVjdG9yKQotewotCW51bWFxX3NlbmRfSVBJX21hc2soY3B1X29ubGluZV9tYXNrLCB2ZWN0b3IpOwotfQotCi0jZGVmaW5lIE5VTUFRX1RSQU1QT0xJTkVfUEhZU19MT1cJKDB4OCkKLSNkZWZpbmUgTlVNQVFfVFJBTVBPTElORV9QSFlTX0hJR0gJKDB4YSkKLQotLyoKLSAqIEJlY2F1c2Ugd2UgdXNlIE5NSXMgcmF0aGVyIHRoYW4gdGhlIElOSVQtU1RBUlRVUCBzZXF1ZW5jZSB0bwotICogYm9vdHN0cmFwIHRoZSBDUFVzLCB0aGUgQVBJQyBtYXkgYmUgaW4gYSB3ZWlyZCBzdGF0ZS4gS2ljayBpdDoKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIG51bWFxX3NtcF9jYWxsaW5fY2xlYXJfbG9jYWxfYXBpYyh2b2lkKQotewotCWNsZWFyX2xvY2FsX0FQSUMoKTsKLX0KLQotc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbnVtYXFfdGFyZ2V0X2NwdXModm9pZCkKLXsKLQlyZXR1cm4gY3B1X2FsbF9tYXNrOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBudW1hcV9jaGVja19hcGljaWRfdXNlZChwaHlzaWRfbWFza190ICptYXAsIGludCBhcGljaWQpCi17Ci0JcmV0dXJuIHBoeXNpZF9pc3NldChhcGljaWQsICptYXApOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbnVtYXFfY2hlY2tfYXBpY2lkX3ByZXNlbnQoaW50IGJpdCkKLXsKLQlyZXR1cm4gcGh5c2lkX2lzc2V0KGJpdCwgcGh5c19jcHVfcHJlc2VudF9tYXApOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBudW1hcV9hcGljX2lkX3JlZ2lzdGVyZWQodm9pZCkKLXsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG51bWFxX2luaXRfYXBpY19sZHIodm9pZCkKLXsKLQkvKiBBbHJlYWR5IGRvbmUgaW4gTlVNQS1RIGZpcm13YXJlICovCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBudW1hcV9zZXR1cF9hcGljX3JvdXRpbmcodm9pZCkKLXsKLQlwcmludGsoS0VSTl9JTkZPCi0JCSJFbmFibGluZyBBUElDIG1vZGU6ICBOVU1BLVEuICBVc2luZyAlZCBJL08gQVBJQ3NcbiIsCi0JCW5yX2lvYXBpY3MpOwotfQotCi0vKgotICogU2tpcCBhZGRpbmcgdGhlIHRpbWVyIGludCBvbiBzZWNvbmRhcnkgbm9kZXMsIHdoaWNoIGNhdXNlcwotICogYSBzbWFsbCBidXQgcGFpbmZ1bCByaWZ0IGluIHRoZSB0aW1lLXNwYWNlIGNvbnRpbnV1bS4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgbnVtYXFfbXVsdGlfdGltZXJfY2hlY2soaW50IGFwaWMsIGludCBpcnEpCi17Ci0JcmV0dXJuIGFwaWMgIT0gMCAmJiBpcnEgPT0gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG51bWFxX2lvYXBpY19waHlzX2lkX21hcChwaHlzaWRfbWFza190ICpwaHlzX21hcCwgcGh5c2lkX21hc2tfdCAqcmV0bWFwKQotewotCS8qIFdlIGRvbid0IGhhdmUgYSBnb29kIHdheSB0byBkbyB0aGlzIHlldCAtIGhhY2sgKi8KLQlyZXR1cm4gcGh5c2lkc19wcm9tb3RlKDB4RlVMLCByZXRtYXApOwotfQotCi0vKgotICogU3VwcG9ydGluZyBvdmVyIDYwIGNwdXMgb24gTlVNQS1RIHJlcXVpcmVzIGEgbG9jYWxpdHktZGVwZW5kZW50Ci0gKiBjcHUgdG8gQVBJQyBJRCByZWxhdGlvbiB0byBwcm9wZXJseSBpbnRlcmFjdCB3aXRoIHRoZSBpbnRlbGxpZ2VudAotICogbW9kZSBvZiB0aGUgY2x1c3RlciBjb250cm9sbGVyLgotICovCi1zdGF0aWMgaW5saW5lIGludCBudW1hcV9jcHVfcHJlc2VudF90b19hcGljaWQoaW50IG1wc19jcHUpCi17Ci0JaWYgKG1wc19jcHUgPCA2MCkKLQkJcmV0dXJuICgobXBzX2NwdSA+PiAyKSA8PCA0KSB8ICgxIDw8IChtcHNfY3B1ICYgMHgzKSk7Ci0JZWxzZQotCQlyZXR1cm4gQkFEX0FQSUNJRDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbnVtYXFfYXBpY2lkX3RvX25vZGUoaW50IGxvZ2ljYWxfYXBpY2lkKQotewotCXJldHVybiBsb2dpY2FsX2FwaWNpZCA+PiA0OwotfQotCi1zdGF0aWMgaW50IG51bWFxX251bWFfY3B1X25vZGUoaW50IGNwdSkKLXsKLQlpbnQgbG9naWNhbF9hcGljaWQgPSBlYXJseV9wZXJfY3B1KHg4Nl9jcHVfdG9fbG9naWNhbF9hcGljaWQsIGNwdSk7Ci0KLQlpZiAobG9naWNhbF9hcGljaWQgIT0gQkFEX0FQSUNJRCkKLQkJcmV0dXJuIG51bWFxX2FwaWNpZF90b19ub2RlKGxvZ2ljYWxfYXBpY2lkKTsKLQlyZXR1cm4gTlVNQV9OT19OT0RFOwotfQotCi1zdGF0aWMgdm9pZCBudW1hcV9hcGljaWRfdG9fY3B1X3ByZXNlbnQoaW50IGxvZ2ljYWxfYXBpY2lkLCBwaHlzaWRfbWFza190ICpyZXRtYXApCi17Ci0JaW50IG5vZGUgPSBudW1hcV9hcGljaWRfdG9fbm9kZShsb2dpY2FsX2FwaWNpZCk7Ci0JaW50IGNwdSA9IF9fZmZzKGxvZ2ljYWxfYXBpY2lkICYgMHhmKTsKLQotCXBoeXNpZF9zZXRfbWFza19vZl9waHlzaWQoY3B1ICsgNCpub2RlLCByZXRtYXApOwotfQotCi0vKiBXaGVyZSB0aGUgSU8gYXJlYSB3YXMgbWFwcGVkIG9uIG11bHRpcXVhZCwgYWx3YXlzIDAgb3RoZXJ3aXNlICovCi12b2lkICp4cXVhZF9wb3J0aW87Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG51bWFxX2NoZWNrX3BoeXNfYXBpY2lkX3ByZXNlbnQoaW50IHBoeXNfYXBpY2lkKQotewotCXJldHVybiAxOwotfQotCi0vKgotICogV2UgdXNlIHBoeXNpY2FsIGFwaWNpZHMgaGVyZSwgbm90IGxvZ2ljYWwsIHNvIGp1c3QgcmV0dXJuIHRoZSBkZWZhdWx0Ci0gKiBwaHlzaWNhbCBicm9hZGNhc3QgdG8gc3RvcCBwZW9wbGUgZnJvbSBicmVha2luZyB1cwotICovCi1zdGF0aWMgaW50Ci1udW1hcV9jcHVfbWFza190b19hcGljaWRfYW5kKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYW5kbWFzaywKLQkJCSAgICAgdW5zaWduZWQgaW50ICphcGljaWQpCi17Ci0JKmFwaWNpZCA9IDB4MEY7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIE5vIE5VTUEtUSBib3ggaGFzIGEgSFQgQ1BVLCBidXQgaXQgY2FuJ3QgaHVydCB0byB1c2UgdGhlIGRlZmF1bHQgY29kZS4gKi8KLXN0YXRpYyBpbmxpbmUgaW50IG51bWFxX3BoeXNfcGtnX2lkKGludCBjcHVpZF9hcGljLCBpbnQgaW5kZXhfbXNiKQotewotCXJldHVybiBjcHVpZF9hcGljID4+IGluZGV4X21zYjsKLX0KLQotc3RhdGljIGludAotbnVtYXFfbXBzX29lbV9jaGVjayhzdHJ1Y3QgbXBjX3RhYmxlICptcGMsIGNoYXIgKm9lbSwgY2hhciAqcHJvZHVjdGlkKQotewotCWlmIChzdHJuY21wKG9lbSwgIklCTSBOVU1BIiwgOCkpCi0JCXByaW50ayhLRVJOX0VSUiAiV2FybmluZyEgTm90IGEgTlVNQS1RIHN5c3RlbSFcbiIpOwotCWVsc2UKLQkJZm91bmRfbnVtYXEgPSAxOwotCi0JcmV0dXJuIGZvdW5kX251bWFxOwotfQotCi1zdGF0aWMgaW50IHByb2JlX251bWFxKHZvaWQpCi17Ci0JLyogYWxyZWFkeSBrbm93IGZyb20gZ2V0X21lbWNmZ19udW1hcSgpICovCi0JcmV0dXJuIGZvdW5kX251bWFxOwotfQotCi1zdGF0aWMgdm9pZCBudW1hcV9zZXR1cF9wb3J0aW9fcmVtYXAodm9pZCkKLXsKLQlpbnQgbnVtX3F1YWRzID0gbnVtX29ubGluZV9ub2RlcygpOwotCi0JaWYgKG51bV9xdWFkcyA8PSAxKQotCQlyZXR1cm47Ci0KLQlwcmludGsoS0VSTl9JTkZPCi0JCSJSZW1hcHBpbmcgY3Jvc3MtcXVhZCBwb3J0IEkvTyBmb3IgJWQgcXVhZHNcbiIsIG51bV9xdWFkcyk7Ci0KLQl4cXVhZF9wb3J0aW8gPSBpb3JlbWFwKFhRVUFEX1BPUlRJT19CQVNFLCBudW1fcXVhZHMqWFFVQURfUE9SVElPX1FVQUQpOwotCi0JcHJpbnRrKEtFUk5fSU5GTwotCQkieHF1YWRfcG9ydGlvIHZhZGRyIDB4JTA4bHgsIGxlbiAlMDhseFxuIiwKLQkJKHVfbG9uZykgeHF1YWRfcG9ydGlvLCAodV9sb25nKSBudW1fcXVhZHMqWFFVQURfUE9SVElPX1FVQUQpOwotfQotCi0vKiBVc2UgX19yZWZkYXRhIHRvIGtlZXAgZmFsc2UgcG9zaXRpdmUgd2FybmluZyBjYWxtLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYXBpYyBfX3JlZmRhdGEgYXBpY19udW1hcSA9IHsKLQotCS5uYW1lCQkJCT0gIk5VTUFRIiwKLQkucHJvYmUJCQkJPSBwcm9iZV9udW1hcSwKLQkuYWNwaV9tYWR0X29lbV9jaGVjawkJPSBOVUxMLAotCS5hcGljX2lkX3ZhbGlkCQkJPSBkZWZhdWx0X2FwaWNfaWRfdmFsaWQsCi0JLmFwaWNfaWRfcmVnaXN0ZXJlZAkJPSBudW1hcV9hcGljX2lkX3JlZ2lzdGVyZWQsCi0KLQkuaXJxX2RlbGl2ZXJ5X21vZGUJCT0gZGVzdF9Mb3dlc3RQcmlvLAotCS8qIHBoeXNpY2FsIGRlbGl2ZXJ5IG9uIExPQ0FMIHF1YWQ6ICovCi0JLmlycV9kZXN0X21vZGUJCQk9IDAsCi0KLQkudGFyZ2V0X2NwdXMJCQk9IG51bWFxX3RhcmdldF9jcHVzLAotCS5kaXNhYmxlX2VzcgkJCT0gMSwKLQkuZGVzdF9sb2dpY2FsCQkJPSBBUElDX0RFU1RfTE9HSUNBTCwKLQkuY2hlY2tfYXBpY2lkX3VzZWQJCT0gbnVtYXFfY2hlY2tfYXBpY2lkX3VzZWQsCi0JLmNoZWNrX2FwaWNpZF9wcmVzZW50CQk9IG51bWFxX2NoZWNrX2FwaWNpZF9wcmVzZW50LAotCi0JLnZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbgk9IGZsYXRfdmVjdG9yX2FsbG9jYXRpb25fZG9tYWluLAotCS5pbml0X2FwaWNfbGRyCQkJPSBudW1hcV9pbml0X2FwaWNfbGRyLAotCi0JLmlvYXBpY19waHlzX2lkX21hcAkJPSBudW1hcV9pb2FwaWNfcGh5c19pZF9tYXAsCi0JLnNldHVwX2FwaWNfcm91dGluZwkJPSBudW1hcV9zZXR1cF9hcGljX3JvdXRpbmcsCi0JLm11bHRpX3RpbWVyX2NoZWNrCQk9IG51bWFxX211bHRpX3RpbWVyX2NoZWNrLAotCS5jcHVfcHJlc2VudF90b19hcGljaWQJCT0gbnVtYXFfY3B1X3ByZXNlbnRfdG9fYXBpY2lkLAotCS5hcGljaWRfdG9fY3B1X3ByZXNlbnQJCT0gbnVtYXFfYXBpY2lkX3RvX2NwdV9wcmVzZW50LAotCS5zZXR1cF9wb3J0aW9fcmVtYXAJCT0gbnVtYXFfc2V0dXBfcG9ydGlvX3JlbWFwLAotCS5jaGVja19waHlzX2FwaWNpZF9wcmVzZW50CT0gbnVtYXFfY2hlY2tfcGh5c19hcGljaWRfcHJlc2VudCwKLQkuZW5hYmxlX2FwaWNfbW9kZQkJPSBOVUxMLAotCS5waHlzX3BrZ19pZAkJCT0gbnVtYXFfcGh5c19wa2dfaWQsCi0JLm1wc19vZW1fY2hlY2sJCQk9IG51bWFxX21wc19vZW1fY2hlY2ssCi0KLQkuZ2V0X2FwaWNfaWQJCQk9IG51bWFxX2dldF9hcGljX2lkLAotCS5zZXRfYXBpY19pZAkJCT0gTlVMTCwKLQkuYXBpY19pZF9tYXNrCQkJPSAweDBGIDw8IDI0LAotCi0JLmNwdV9tYXNrX3RvX2FwaWNpZF9hbmQJCT0gbnVtYXFfY3B1X21hc2tfdG9fYXBpY2lkX2FuZCwKLQotCS5zZW5kX0lQSV9tYXNrCQkJPSBudW1hcV9zZW5kX0lQSV9tYXNrLAotCS5zZW5kX0lQSV9tYXNrX2FsbGJ1dHNlbGYJPSBOVUxMLAotCS5zZW5kX0lQSV9hbGxidXRzZWxmCQk9IG51bWFxX3NlbmRfSVBJX2FsbGJ1dHNlbGYsCi0JLnNlbmRfSVBJX2FsbAkJCT0gbnVtYXFfc2VuZF9JUElfYWxsLAotCS5zZW5kX0lQSV9zZWxmCQkJPSBkZWZhdWx0X3NlbmRfSVBJX3NlbGYsCi0KLQkud2FrZXVwX3NlY29uZGFyeV9jcHUJCT0gd2FrZXVwX3NlY29uZGFyeV9jcHVfdmlhX25taSwKLQkudHJhbXBvbGluZV9waHlzX2xvdwkJPSBOVU1BUV9UUkFNUE9MSU5FX1BIWVNfTE9XLAotCS50cmFtcG9saW5lX3BoeXNfaGlnaAkJPSBOVU1BUV9UUkFNUE9MSU5FX1BIWVNfSElHSCwKLQotCS8qIFdlIGRvbid0IGRvIGFueXRoaW5nIGhlcmUgYmVjYXVzZSB3ZSB1c2UgTk1JJ3MgdG8gYm9vdCBpbnN0ZWFkICovCi0JLndhaXRfZm9yX2luaXRfZGVhc3NlcnQJCT0gZmFsc2UsCi0JLnNtcF9jYWxsaW5fY2xlYXJfbG9jYWxfYXBpYwk9IG51bWFxX3NtcF9jYWxsaW5fY2xlYXJfbG9jYWxfYXBpYywKLQkuaW5xdWlyZV9yZW1vdGVfYXBpYwkJPSBOVUxMLAotCi0JLnJlYWQJCQkJPSBuYXRpdmVfYXBpY19tZW1fcmVhZCwKLQkud3JpdGUJCQkJPSBuYXRpdmVfYXBpY19tZW1fd3JpdGUsCi0JLmVvaV93cml0ZQkJCT0gbmF0aXZlX2FwaWNfbWVtX3dyaXRlLAotCS5pY3JfcmVhZAkJCT0gbmF0aXZlX2FwaWNfaWNyX3JlYWQsCi0JLmljcl93cml0ZQkJCT0gbmF0aXZlX2FwaWNfaWNyX3dyaXRlLAotCS53YWl0X2ljcl9pZGxlCQkJPSBuYXRpdmVfYXBpY193YWl0X2ljcl9pZGxlLAotCS5zYWZlX3dhaXRfaWNyX2lkbGUJCT0gbmF0aXZlX3NhZmVfYXBpY193YWl0X2ljcl9pZGxlLAotCi0JLng4Nl8zMl9lYXJseV9sb2dpY2FsX2FwaWNpZAk9IG5vb3BfeDg2XzMyX2Vhcmx5X2xvZ2ljYWxfYXBpY2lkLAotCS54ODZfMzJfbnVtYV9jcHVfbm9kZQkJPSBudW1hcV9udW1hX2NwdV9ub2RlLAotfTsKLQotYXBpY19kcml2ZXIoYXBpY19udW1hcSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9zdW1taXRfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3N1bW1pdF8zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjU2MTI4Li4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3N1bW1pdF8zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUwICswLDAgQEAKLS8qCi0gKiBJQk0gU3VtbWl0LVNwZWNpZmljIENvZGUKLSAqCi0gKiBXcml0dGVuIEJ5OiBNYXR0aGV3IERvYnNvbiwgSUJNIENvcnBvcmF0aW9uCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAzIElCTSBDb3JwLgotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICogU2VuZCBmZWVkYmFjayB0byA8Y29scGF0Y2hAdXMuaWJtLmNvbT4KLSAqCi0gKi8KLQotI2RlZmluZSBwcl9mbXQoZm10KSAic3VtbWl0OiAlczogIiBmbXQsIF9fZnVuY19fCi0KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9iaW9zX2ViZGEuaD4KLQotLyoKLSAqIEFQSUMgZHJpdmVyIGZvciB0aGUgSUJNICJTdW1taXQiIGNoaXBzZXQuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgotI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KLSNpbmNsdWRlIDxhc20vYXBpYy5oPgotI2luY2x1ZGUgPGFzbS9zbXAuaD4KLSNpbmNsdWRlIDxhc20vZml4bWFwLmg+Ci0jaW5jbHVkZSA8YXNtL2FwaWNkZWYuaD4KLSNpbmNsdWRlIDxhc20vaXBpLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZ2ZwLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0KLXN0YXRpYyB1bnNpZ25lZCBzdW1taXRfZ2V0X2FwaWNfaWQodW5zaWduZWQgbG9uZyB4KQotewotCXJldHVybiAoeCA+PiAyNCkgJiAweEZGOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3VtbWl0X3NlbmRfSVBJX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIGludCB2ZWN0b3IpCi17Ci0JZGVmYXVsdF9zZW5kX0lQSV9tYXNrX3NlcXVlbmNlX2xvZ2ljYWwobWFzaywgdmVjdG9yKTsKLX0KLQotc3RhdGljIHZvaWQgc3VtbWl0X3NlbmRfSVBJX2FsbGJ1dHNlbGYoaW50IHZlY3RvcikKLXsKLQlkZWZhdWx0X3NlbmRfSVBJX21hc2tfYWxsYnV0c2VsZl9sb2dpY2FsKGNwdV9vbmxpbmVfbWFzaywgdmVjdG9yKTsKLX0KLQotc3RhdGljIHZvaWQgc3VtbWl0X3NlbmRfSVBJX2FsbChpbnQgdmVjdG9yKQotewotCXN1bW1pdF9zZW5kX0lQSV9tYXNrKGNwdV9vbmxpbmVfbWFzaywgdmVjdG9yKTsKLX0KLQotI2luY2x1ZGUgPGFzbS90c2MuaD4KLQotZXh0ZXJuIGludCB1c2VfY3ljbG9uZTsKLQotI2lmZGVmIENPTkZJR19YODZfU1VNTUlUX05VTUEKLXN0YXRpYyB2b2lkIHNldHVwX3N1bW1pdCh2b2lkKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfc3VtbWl0KHZvaWQpIHt9Ci0jZW5kaWYKLQotc3RhdGljIGludCBzdW1taXRfbXBzX29lbV9jaGVjayhzdHJ1Y3QgbXBjX3RhYmxlICptcGMsIGNoYXIgKm9lbSwKLQkJY2hhciAqcHJvZHVjdGlkKQotewotCWlmICghc3RybmNtcChvZW0sICJJQk0gRU5TVyIsIDgpICYmCi0JCQkoIXN0cm5jbXAocHJvZHVjdGlkLCAiVklHSUwgU01QIiwgOSkKLQkJCSB8fCAhc3RybmNtcChwcm9kdWN0aWQsICJFWEEiLCAzKQotCQkJIHx8ICFzdHJuY21wKHByb2R1Y3RpZCwgIlJVVEhMRVNTIFNNUCIsIDEyKSkpewotCQltYXJrX3RzY191bnN0YWJsZSgiU3VtbWl0IGJhc2VkIHN5c3RlbSIpOwotCQl1c2VfY3ljbG9uZSA9IDE7IC8qZW5hYmxlIGN5Y2xvbmUtdGltZXIqLwotCQlzZXR1cF9zdW1taXQoKTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKiBIb29rIGZyb20gZ2VuZXJpYyBBQ1BJIHRhYmxlcy5jICovCi1zdGF0aWMgaW50IHN1bW1pdF9hY3BpX21hZHRfb2VtX2NoZWNrKGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkKQotewotCWlmICghc3RybmNtcChvZW1faWQsICJJQk0iLCAzKSAmJgotCSAgICAoIXN0cm5jbXAob2VtX3RhYmxlX2lkLCAiU0VSVklHSUwiLCA4KQotCSAgICAgfHwgIXN0cm5jbXAob2VtX3RhYmxlX2lkLCAiRVhBIiwgMykpKXsKLQkJbWFya190c2NfdW5zdGFibGUoIlN1bW1pdCBiYXNlZCBzeXN0ZW0iKTsKLQkJdXNlX2N5Y2xvbmUgPSAxOyAvKmVuYWJsZSBjeWNsb25lLXRpbWVyKi8KLQkJc2V0dXBfc3VtbWl0KCk7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IHJpb190YWJsZV9oZHIgewotCXVuc2lnbmVkIGNoYXIgdmVyc2lvbjsgICAgICAvKiBWZXJzaW9uIG51bWJlciBvZiB0aGlzIGRhdGEgc3RydWN0dXJlICAgICAgICAgICAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZXJzaW9uIDMgYWRkcyBjaGFzc2lzX251bSAmIFdQX2luZGV4ICAgICAgICAgICAqLwotCXVuc2lnbmVkIGNoYXIgbnVtX3NjYWxfZGV2OyAvKiAjIG9mIFNjYWxhYmlsaXR5IGRldmljZXMgKFR3aXN0ZXJzIGZvciBWaWdpbCkgICAqLwotCXVuc2lnbmVkIGNoYXIgbnVtX3Jpb19kZXY7ICAvKiAjIG9mIFJJTyBJL08gZGV2aWNlcyAoQ3ljbG9uZXMgYW5kIFdpbm5pcGVncykgICAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IHNjYWxfZGV0YWlsIHsKLQl1bnNpZ25lZCBjaGFyIG5vZGVfaWQ7ICAgICAgLyogU2NhbGFiaWxpdHkgTm9kZSBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nIENCQVI7ICAgICAgICAgLyogQWRkcmVzcyBvZiAxTUIgcmVnaXN0ZXIgc3BhY2UgICAgICAgICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBjaGFyIHBvcnQwbm9kZTsgICAgLyogTm9kZSBJRCBwb3J0IGNvbm5lY3RlZCB0bzogMHhGRj1Ob25lICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBjaGFyIHBvcnQwcG9ydDsgICAgLyogUG9ydCBudW0gcG9ydCBjb25uZWN0ZWQgdG86IDAsMSwyLCBvciAweEZGPU5vbmUgKi8KLQl1bnNpZ25lZCBjaGFyIHBvcnQxbm9kZTsgICAgLyogTm9kZSBJRCBwb3J0IGNvbm5lY3RlZCB0bzogMHhGRiA9IE5vbmUgICAgICAgICAgKi8KLQl1bnNpZ25lZCBjaGFyIHBvcnQxcG9ydDsgICAgLyogUG9ydCBudW0gcG9ydCBjb25uZWN0ZWQgdG86IDAsMSwyLCBvciAweEZGPU5vbmUgKi8KLQl1bnNpZ25lZCBjaGFyIHBvcnQybm9kZTsgICAgLyogTm9kZSBJRCBwb3J0IGNvbm5lY3RlZCB0bzogMHhGRiA9IE5vbmUgICAgICAgICAgKi8KLQl1bnNpZ25lZCBjaGFyIHBvcnQycG9ydDsgICAgLyogUG9ydCBudW0gcG9ydCBjb25uZWN0ZWQgdG86IDAsMSwyLCBvciAweEZGPU5vbmUgKi8KLQl1bnNpZ25lZCBjaGFyIGNoYXNzaXNfbnVtOyAgLyogMSBiYXNlZCBDaGFzc2lzIG51bWJlciAoMSA9IGJvb3Qgbm9kZSkgICAgICAgICAgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCByaW9fZGV0YWlsIHsKLQl1bnNpZ25lZCBjaGFyIG5vZGVfaWQ7ICAgICAgLyogUklPIE5vZGUgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nIEJCQVI7ICAgICAgICAgLyogQWRkcmVzcyBvZiAxTUIgcmVnaXN0ZXIgc3BhY2UgICAgICAgICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBjaGFyIHR5cGU7ICAgICAgICAgLyogVHlwZSBvZiBkZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBjaGFyIG93bmVyX2lkOyAgICAgLyogRm9yIFdQRUc6IE5vZGUgSUQgb2YgQ3ljbG9uZSB0aGF0IG93bnMgdGhpcyBXUEVHKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIENZQzogIE5vZGUgSUQgb2YgVHdpc3RlciB0aGF0IG93bnMgdGhpcyBDWUMgKi8KLQl1bnNpZ25lZCBjaGFyIHBvcnQwbm9kZTsgICAgLyogTm9kZSBJRCBwb3J0IGNvbm5lY3RlZCB0bzogMHhGRj1Ob25lICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBjaGFyIHBvcnQwcG9ydDsgICAgLyogUG9ydCBudW0gcG9ydCBjb25uZWN0ZWQgdG86IDAsMSwyLCBvciAweEZGPU5vbmUgKi8KLQl1bnNpZ25lZCBjaGFyIHBvcnQxbm9kZTsgICAgLyogTm9kZSBJRCBwb3J0IGNvbm5lY3RlZCB0bzogMHhGRj1Ob25lICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBjaGFyIHBvcnQxcG9ydDsgICAgLyogUG9ydCBudW0gcG9ydCBjb25uZWN0ZWQgdG86IDAsMSwyLCBvciAweEZGPU5vbmUgKi8KLQl1bnNpZ25lZCBjaGFyIGZpcnN0X3Nsb3Q7ICAgLyogRm9yIFdQRUc6IExvd2VzdCBzbG90IG51bWJlciBiZWxvdyB0aGlzIFdQRUcgICAgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIENZQzogIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBjaGFyIHN0YXR1czsgICAgICAgLyogRm9yIFdQRUc6IEJpdCAwID0gMSA6IHRoZSBYQVBJQyBpcyB1c2VkICAgICAgICAgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgID0gMCA6IHRoZSBYQVBJQyBpcyBub3QgdXNlZCwgaWU6Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICBpbnRzIGZ3ZGVkIHRvIGFub3RoZXIgWEFQSUMgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgIEJpdHMxOjcgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIENZQzogIEJpdHMwOjcgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBjaGFyIFdQX2luZGV4OyAgICAgLyogRm9yIFdQRUc6IFdQRUcgaW5zdGFuY2UgaW5kZXggLSBsb3dlciBvbmVzIGhhdmUgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgIGxvd2VyIHNsb3QgbnVtYmVycy9QQ0kgYnVzIG51bWJlcnMgICAgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIENZQzogIE5vIG1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBjaGFyIGNoYXNzaXNfbnVtOyAgLyogMSBiYXNlZCBDaGFzc2lzIG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIExvb2tPdXQgV1BFR3MgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlICAgICAgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRXhwYW5zaW9uIENoYXNzaXMgIywgZW51bWVyYXRlZCBmcm9tIEJvb3QgICAgICAgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm9kZSBXUEVHIGV4dGVybmFsIHBvcnQsIHRoZW4gQm9vdCBOb2RlIENZQyAgICAgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0ZXJuYWwgcG9ydCwgdGhlbiBOZXh0IFZpZ2lsIGNoYXNzaXMgV1BFRyAgICAgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0ZXJuYWwgcG9ydCwgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hhcmVkIExvb2tvdXRzIGhhdmUgb25seSAxIGNoYXNzaXMgbnVtYmVyICh0aGUgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyc3Qgb25lIGFzc2lnbmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLQotdHlwZWRlZiBlbnVtIHsKLQlDb21wYXRUd2lzdGVyID0gMCwgIC8qIENvbXBhdGliaWxpdHkgVHdpc3RlciAgICAgICAgICAgICAgICovCi0JQWx0VHdpc3RlciAgICA9IDEsICAvKiBBbHRlcm5hdGUgVHdpc3RlciBvZiBpbnRlcm5hbCA4LXdheSAqLwotCUNvbXBhdEN5Y2xvbmUgPSAyLCAgLyogQ29tcGF0aWJpbGl0eSBDeWNsb25lICAgICAgICAgICAgICAgKi8KLQlBbHRDeWNsb25lICAgID0gMywgIC8qIEFsdGVybmF0ZSBDeWNsb25lIG9mIGludGVybmFsIDgtd2F5ICovCi0JQ29tcGF0V1BFRyAgICA9IDQsICAvKiBDb21wYXRpYmlsaXR5IFdQRUcgICAgICAgICAgICAgICAgICAqLwotCUFsdFdQRUcgICAgICAgPSA1LCAgLyogU2Vjb25kIFBsYW5hciBXUEVHICAgICAgICAgICAgICAgICAgKi8KLQlMb29rT3V0QVdQRUcgID0gNiwgIC8qIExvb2tPdXQgV1BFRyAgICAgICAgICAgICAgICAgICAgICAgICovCi0JTG9va091dEJXUEVHICA9IDcsICAvKiBMb29rT3V0IFdQRUcgICAgICAgICAgICAgICAgICAgICAgICAqLwotfSBub2RlX3R5cGU7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGlzX1dQRUcoc3RydWN0IHJpb19kZXRhaWwgKnJpbyl7Ci0JcmV0dXJuIChyaW8tPnR5cGUgPT0gQ29tcGF0V1BFRyB8fCByaW8tPnR5cGUgPT0gQWx0V1BFRyB8fAotCQlyaW8tPnR5cGUgPT0gTG9va091dEFXUEVHIHx8IHJpby0+dHlwZSA9PSBMb29rT3V0QldQRUcpOwotfQotCi0jZGVmaW5lIFNVTU1JVF9BUElDX0RGUl9WQUxVRQkoQVBJQ19ERlJfQ0xVU1RFUikKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpzdW1taXRfdGFyZ2V0X2NwdXModm9pZCkKLXsKLQkvKiBDUFVfTUFTS19BTEwgKDB4ZmYpIGhhcyB1bmRlZmluZWQgYmVoYXZpb3VyIHdpdGgKLQkgKiBkZXN0X0xvd2VzdFByaW8gbW9kZSBsb2dpY2FsIGNsdXN0ZXJlZCBhcGljIGludGVycnVwdCByb3V0aW5nCi0JICogSnVzdCBzdGFydCBvbiBjcHUgMC4gIElSUSBiYWxhbmNpbmcgd2lsbCBzcHJlYWQgbG9hZAotCSAqLwotCXJldHVybiBjcHVtYXNrX29mKDApOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzdW1taXRfY2hlY2tfYXBpY2lkX3VzZWQocGh5c2lkX21hc2tfdCAqbWFwLCBpbnQgYXBpY2lkKQotewotCXJldHVybiAwOwotfQotCi0vKiB3ZSBkb24ndCB1c2UgdGhlIHBoeXNfY3B1X3ByZXNlbnRfbWFwIHRvIGluZGljYXRlIGFwaWNpZCBwcmVzZW5jZSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgc3VtbWl0X2NoZWNrX2FwaWNpZF9wcmVzZW50KGludCBiaXQpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgc3VtbWl0X2Vhcmx5X2xvZ2ljYWxfYXBpY2lkKGludCBjcHUpCi17Ci0JaW50IGNvdW50ID0gMDsKLQl1OCBteV9pZCA9IGVhcmx5X3Blcl9jcHUoeDg2X2NwdV90b19hcGljaWQsIGNwdSk7Ci0JdTggbXlfY2x1c3RlciA9IEFQSUNfQ0xVU1RFUihteV9pZCk7Ci0jaWZkZWYgQ09ORklHX1NNUAotCXU4IGxpZDsKLQlpbnQgaTsKLQotCS8qIENyZWF0ZSBsb2dpY2FsIEFQSUMgSURzIGJ5IGNvdW50aW5nIENQVXMgYWxyZWFkeSBpbiBjbHVzdGVyLiAqLwotCWZvciAoY291bnQgPSAwLCBpID0gbnJfY3B1X2lkczsgLS1pID49IDA7ICkgewotCQlsaWQgPSBlYXJseV9wZXJfY3B1KHg4Nl9jcHVfdG9fbG9naWNhbF9hcGljaWQsIGkpOwotCQlpZiAobGlkICE9IEJBRF9BUElDSUQgJiYgQVBJQ19DTFVTVEVSKGxpZCkgPT0gbXlfY2x1c3RlcikKLQkJCSsrY291bnQ7Ci0JfQotI2VuZGlmCi0JLyogV2Ugb25seSBoYXZlIGEgNCB3aWRlIGJpdG1hcCBpbiBjbHVzdGVyIG1vZGUuICBJZiBhIGRlcmFuZ2VkCi0JICogQklPUyBwdXRzIDUgQ1BVcyBpbiBvbmUgQVBJQyBjbHVzdGVyLCB3ZSdyZSBob3NlZC4gKi8KLQlCVUdfT04oY291bnQgPj0gWEFQSUNfREVTVF9DUFVTX1NISUZUKTsKLQlyZXR1cm4gbXlfY2x1c3RlciB8ICgxVUwgPDwgY291bnQpOwotfQotCi1zdGF0aWMgdm9pZCBzdW1taXRfaW5pdF9hcGljX2xkcih2b2lkKQotewotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JdW5zaWduZWQgbG9uZyBpZCA9IGVhcmx5X3Blcl9jcHUoeDg2X2NwdV90b19sb2dpY2FsX2FwaWNpZCwgY3B1KTsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQotCWFwaWNfd3JpdGUoQVBJQ19ERlIsIFNVTU1JVF9BUElDX0RGUl9WQUxVRSk7Ci0JdmFsID0gYXBpY19yZWFkKEFQSUNfTERSKSAmIH5BUElDX0xEUl9NQVNLOwotCXZhbCB8PSBTRVRfQVBJQ19MT0dJQ0FMX0lEKGlkKTsKLQlhcGljX3dyaXRlKEFQSUNfTERSLCB2YWwpOwotfQotCi1zdGF0aWMgaW50IHN1bW1pdF9hcGljX2lkX3JlZ2lzdGVyZWQodm9pZCkKLXsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgc3VtbWl0X3NldHVwX2FwaWNfcm91dGluZyh2b2lkKQotewotCXByX2luZm8oIkVuYWJsaW5nIEFQSUMgbW9kZTogIFN1bW1pdC4gIFVzaW5nICVkIEkvTyBBUElDc1xuIiwKLQkJbnJfaW9hcGljcyk7Ci19Ci0KLXN0YXRpYyBpbnQgc3VtbWl0X2NwdV9wcmVzZW50X3RvX2FwaWNpZChpbnQgbXBzX2NwdSkKLXsKLQlpZiAobXBzX2NwdSA8IG5yX2NwdV9pZHMpCi0JCXJldHVybiAoaW50KXBlcl9jcHUoeDg2X2Jpb3NfY3B1X2FwaWNpZCwgbXBzX2NwdSk7Ci0JZWxzZQotCQlyZXR1cm4gQkFEX0FQSUNJRDsKLX0KLQotc3RhdGljIHZvaWQgc3VtbWl0X2lvYXBpY19waHlzX2lkX21hcChwaHlzaWRfbWFza190ICpwaHlzX2lkX21hcCwgcGh5c2lkX21hc2tfdCAqcmV0bWFwKQotewotCS8qIEZvciBjbHVzdGVyZWQgd2UgZG9uJ3QgaGF2ZSBhIGdvb2Qgd2F5IHRvIGRvIHRoaXMgeWV0IC0gaGFjayAqLwotCXBoeXNpZHNfcHJvbW90ZSgweDBGTCwgcmV0bWFwKTsKLX0KLQotc3RhdGljIHZvaWQgc3VtbWl0X2FwaWNpZF90b19jcHVfcHJlc2VudChpbnQgYXBpY2lkLCBwaHlzaWRfbWFza190ICpyZXRtYXApCi17Ci0JcGh5c2lkX3NldF9tYXNrX29mX3BoeXNpZCgwLCByZXRtYXApOwotfQotCi1zdGF0aWMgaW50IHN1bW1pdF9jaGVja19waHlzX2FwaWNpZF9wcmVzZW50KGludCBwaHlzaWNhbF9hcGljaWQpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1zdW1taXRfY3B1X21hc2tfdG9fYXBpY2lkKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrLCB1bnNpZ25lZCBpbnQgKmRlc3RfaWQpCi17Ci0JdW5zaWduZWQgaW50IHJvdW5kID0gMDsKLQl1bnNpZ25lZCBpbnQgY3B1LCBhcGljaWQgPSAwOwotCi0JLyoKLQkgKiBUaGUgY3B1cyBpbiB0aGUgbWFzayBtdXN0IGFsbCBiZSBvbiB0aGUgYXBpYyBjbHVzdGVyLgotCSAqLwotCWZvcl9lYWNoX2NwdV9hbmQoY3B1LCBjcHVtYXNrLCBjcHVfb25saW5lX21hc2spIHsKLQkJaW50IG5ld19hcGljaWQgPSBlYXJseV9wZXJfY3B1KHg4Nl9jcHVfdG9fbG9naWNhbF9hcGljaWQsIGNwdSk7Ci0KLQkJaWYgKHJvdW5kICYmIEFQSUNfQ0xVU1RFUihhcGljaWQpICE9IEFQSUNfQ0xVU1RFUihuZXdfYXBpY2lkKSkgewotCQkJcHJfZXJyKCJOb3QgYSB2YWxpZCBtYXNrIVxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlhcGljaWQgfD0gbmV3X2FwaWNpZDsKLQkJcm91bmQrKzsKLQl9Ci0JaWYgKCFyb3VuZCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JKmRlc3RfaWQgPSBhcGljaWQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXN1bW1pdF9jcHVfbWFza190b19hcGljaWRfYW5kKGNvbnN0IHN0cnVjdCBjcHVtYXNrICppbm1hc2ssCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYW5kbWFzaywKLQkJCSAgICAgIHVuc2lnbmVkIGludCAqYXBpY2lkKQotewotCWNwdW1hc2tfdmFyX3QgY3B1bWFzazsKLQkqYXBpY2lkID0gZWFybHlfcGVyX2NwdSh4ODZfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkLCAwKTsKLQotCWlmICghYWxsb2NfY3B1bWFza192YXIoJmNwdW1hc2ssIEdGUF9BVE9NSUMpKQotCQlyZXR1cm4gMDsKLQotCWNwdW1hc2tfYW5kKGNwdW1hc2ssIGlubWFzaywgYW5kbWFzayk7Ci0Jc3VtbWl0X2NwdV9tYXNrX3RvX2FwaWNpZChjcHVtYXNrLCBhcGljaWQpOwotCi0JZnJlZV9jcHVtYXNrX3ZhcihjcHVtYXNrKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogY3B1aWQgcmV0dXJucyB0aGUgdmFsdWUgbGF0Y2hlZCBpbiB0aGUgSFcgYXQgcmVzZXQsIG5vdCB0aGUgQVBJQyBJRAotICogcmVnaXN0ZXIncyB2YWx1ZS4gIEZvciBhbnkgYm94IHdob3NlIEJJT1MgY2hhbmdlcyBBUElDIElEcywgbGlrZQotICogY2x1c3RlcmVkIEFQSUMgc3lzdGVtcywgd2UgbXVzdCB1c2UgaGFyZF9zbXBfcHJvY2Vzc29yX2lkLgotICoKLSAqIFNlZSBJbnRlbCdzIElBLTMyIFNXIERldidzIE1hbnVhbCBWb2wyIHVuZGVyIENQVUlELgotICovCi1zdGF0aWMgaW50IHN1bW1pdF9waHlzX3BrZ19pZChpbnQgY3B1aWRfYXBpYywgaW50IGluZGV4X21zYikKLXsKLQlyZXR1cm4gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkgPj4gaW5kZXhfbXNiOwotfQotCi1zdGF0aWMgaW50IHByb2JlX3N1bW1pdCh2b2lkKQotewotCS8qIHByb2JlZCBsYXRlciBpbiBtcHRhYmxlL0FDUEkgaG9va3MgKi8KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19YODZfU1VNTUlUX05VTUEKLXN0YXRpYyBzdHJ1Y3QgcmlvX3RhYmxlX2hkciAqcmlvX3RhYmxlX2hkcjsKLXN0YXRpYyBzdHJ1Y3Qgc2NhbF9kZXRhaWwgICAqc2NhbF9kZXZzW01BWF9OVU1OT0RFU107Ci1zdGF0aWMgc3RydWN0IHJpb19kZXRhaWwgICAgKnJpb19kZXZzW01BWF9OVU1OT0RFUyo0XTsKLQotI2lmbmRlZiBDT05GSUdfWDg2X05VTUFRCi1zdGF0aWMgaW50IG1wX2J1c19pZF90b19ub2RlW01BWF9NUF9CVVNTRVNdOwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgc2V0dXBfcGNpX25vZGVfbWFwX2Zvcl93cGVnKGludCB3cGVnX251bSwgaW50IGxhc3RfYnVzKQotewotCWludCB0d2lzdGVyID0gMCwgbm9kZSA9IDA7Ci0JaW50IGksIGJ1cywgbnVtX2J1c2VzOwotCi0JZm9yIChpID0gMDsgaSA8IHJpb190YWJsZV9oZHItPm51bV9yaW9fZGV2OyBpKyspIHsKLQkJaWYgKHJpb19kZXZzW2ldLT5ub2RlX2lkID09IHJpb19kZXZzW3dwZWdfbnVtXS0+b3duZXJfaWQpIHsKLQkJCXR3aXN0ZXIgPSByaW9fZGV2c1tpXS0+b3duZXJfaWQ7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoaSA9PSByaW9fdGFibGVfaGRyLT5udW1fcmlvX2RldikgewotCQlwcl9lcnIoIkNvdWxkbid0IGZpbmQgb3duZXIgQ3ljbG9uZSBmb3IgV2lubmlwZWchXG4iKTsKLQkJcmV0dXJuIGxhc3RfYnVzOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCByaW9fdGFibGVfaGRyLT5udW1fc2NhbF9kZXY7IGkrKykgewotCQlpZiAoc2NhbF9kZXZzW2ldLT5ub2RlX2lkID09IHR3aXN0ZXIpIHsKLQkJCW5vZGUgPSBzY2FsX2RldnNbaV0tPm5vZGVfaWQ7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoaSA9PSByaW9fdGFibGVfaGRyLT5udW1fc2NhbF9kZXYpIHsKLQkJcHJfZXJyKCJDb3VsZG4ndCBmaW5kIG93bmVyIFR3aXN0ZXIgZm9yIEN5Y2xvbmUhXG4iKTsKLQkJcmV0dXJuIGxhc3RfYnVzOwotCX0KLQotCXN3aXRjaCAocmlvX2RldnNbd3BlZ19udW1dLT50eXBlKSB7Ci0JY2FzZSBDb21wYXRXUEVHOgotCQkvKgotCQkgKiBUaGUgQ29tcGF0aWJpbGl0eSBXaW5uaXBlZyBjb250cm9scyB0aGUgMiBsZWdhY3kgYnVzZXMsCi0JCSAqIHRoZSA2Nk1IeiBQQ0kgYnVzIFsyIHNsb3RzXSBhbmQgdGhlIDIgImV4dHJhIiBidXNlcyBpbiBjYXNlCi0JCSAqIGEgUENJLVBDSSBicmlkZ2UgY2FyZCBpcyB1c2VkIGluIGVpdGhlciBzbG90OiB0b3RhbCA1IGJ1c2VzLgotCQkgKi8KLQkJbnVtX2J1c2VzID0gNTsKLQkJYnJlYWs7Ci0JY2FzZSBBbHRXUEVHOgotCQkvKgotCQkgKiBUaGUgQWx0ZXJuYXRlIFdpbm5pcGVnIGNvbnRyb2xzIHRoZSAyIDEzM01IeiBidXNlcyBbMSBzbG90Ci0JCSAqIGVhY2hdLCB0aGVpciAyICJleHRyYSIgYnVzZXMsIHRoZSAxMDBNSHogYnVzIFsyIHNsb3RzXSBhbmQKLQkJICogdGhlICJleHRyYSIgYnVzZXMgZm9yIGVhY2ggb2YgdGhvc2Ugc2xvdHM6IHRvdGFsIDcgYnVzZXMuCi0JCSAqLwotCQludW1fYnVzZXMgPSA3OwotCQlicmVhazsKLQljYXNlIExvb2tPdXRBV1BFRzoKLQljYXNlIExvb2tPdXRCV1BFRzoKLQkJLyoKLQkJICogQSBMb29rb3V0IFdpbm5pcGVnIGNvbnRyb2xzIDMgMTAwTUh6IGJ1c2VzIFsyIHNsb3RzIGVhY2hdCi0JCSAqICYgdGhlICJleHRyYSIgYnVzZXMgZm9yIGVhY2ggb2YgdGhvc2Ugc2xvdHM6IHRvdGFsIDkgYnVzZXMuCi0JCSAqLwotCQludW1fYnVzZXMgPSA5OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9pbmZvKCJVbnN1cHBvcnRlZCBXaW5uaXBlZyB0eXBlIVxuIik7Ci0JCXJldHVybiBsYXN0X2J1czsKLQl9Ci0KLQlmb3IgKGJ1cyA9IGxhc3RfYnVzOyBidXMgPCBsYXN0X2J1cyArIG51bV9idXNlczsgYnVzKyspCi0JCW1wX2J1c19pZF90b19ub2RlW2J1c10gPSBub2RlOwotCXJldHVybiBidXM7Ci19Ci0KLXN0YXRpYyBpbnQgYnVpbGRfZGV0YWlsX2FycmF5cyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgcHRyOwotCWludCBpLCBzY2FsX2RldGFpbF9zaXplLCByaW9fZGV0YWlsX3NpemU7Ci0KLQlpZiAocmlvX3RhYmxlX2hkci0+bnVtX3NjYWxfZGV2ID4gTUFYX05VTU5PREVTKSB7Ci0JCXByX3dhcm4oIk1BWF9OVU1OT0RFUyB0b28gbG93ISAgRGVmaW5lZCBhcyAlZCwgYnV0IHN5c3RlbSBoYXMgJWQgbm9kZXNcbiIsCi0JCQlNQVhfTlVNTk9ERVMsIHJpb190YWJsZV9oZHItPm51bV9zY2FsX2Rldik7Ci0JCXJldHVybiAwOwotCX0KLQotCXN3aXRjaCAocmlvX3RhYmxlX2hkci0+dmVyc2lvbikgewotCWRlZmF1bHQ6Ci0JCXByX3dhcm4oIkludmFsaWQgUmlvIEdyYW5kZSBUYWJsZSBWZXJzaW9uOiAlZFxuIiwKLQkJCXJpb190YWJsZV9oZHItPnZlcnNpb24pOwotCQlyZXR1cm4gMDsKLQljYXNlIDI6Ci0JCXNjYWxfZGV0YWlsX3NpemUgPSAxMTsKLQkJcmlvX2RldGFpbF9zaXplID0gMTM7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJc2NhbF9kZXRhaWxfc2l6ZSA9IDEyOwotCQlyaW9fZGV0YWlsX3NpemUgPSAxNTsKLQkJYnJlYWs7Ci0JfQotCi0JcHRyID0gKHVuc2lnbmVkIGxvbmcpcmlvX3RhYmxlX2hkciArIDM7Ci0JZm9yIChpID0gMDsgaSA8IHJpb190YWJsZV9oZHItPm51bV9zY2FsX2RldjsgaSsrLCBwdHIgKz0gc2NhbF9kZXRhaWxfc2l6ZSkKLQkJc2NhbF9kZXZzW2ldID0gKHN0cnVjdCBzY2FsX2RldGFpbCAqKXB0cjsKLQotCWZvciAoaSA9IDA7IGkgPCByaW9fdGFibGVfaGRyLT5udW1fcmlvX2RldjsgaSsrLCBwdHIgKz0gcmlvX2RldGFpbF9zaXplKQotCQlyaW9fZGV2c1tpXSA9IChzdHJ1Y3QgcmlvX2RldGFpbCAqKXB0cjsKLQotCXJldHVybiAxOwotfQotCi12b2lkIHNldHVwX3N1bW1pdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcJCXB0cjsKLQl1bnNpZ25lZCBzaG9ydAkJb2Zmc2V0OwotCWludAkJCWksIG5leHRfd3BlZywgbmV4dF9idXMgPSAwOwotCi0JLyogVGhlIHBvaW50ZXIgdG8gdGhlIEVCREEgaXMgc3RvcmVkIGluIHRoZSB3b3JkIEAgcGh5cyAweDQwRSg0MDowRSkgKi8KLQlwdHIgPSBnZXRfYmlvc19lYmRhKCk7Ci0JcHRyID0gKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHB0cik7Ci0KLQlyaW9fdGFibGVfaGRyID0gTlVMTDsKLQlvZmZzZXQgPSAweDE4MDsKLQl3aGlsZSAob2Zmc2V0KSB7Ci0JCS8qIFRoZSBibG9jayBpZCBpcyBzdG9yZWQgaW4gdGhlIDJuZCB3b3JkICovCi0JCWlmICgqKCh1bnNpZ25lZCBzaG9ydCAqKShwdHIgKyBvZmZzZXQgKyAyKSkgPT0gMHg0NzUyKSB7Ci0JCQkvKiBzZXQgdGhlIHBvaW50ZXIgcGFzdCB0aGUgb2Zmc2V0ICYgYmxvY2sgaWQgKi8KLQkJCXJpb190YWJsZV9oZHIgPSAoc3RydWN0IHJpb190YWJsZV9oZHIgKikocHRyICsgb2Zmc2V0ICsgNCk7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBUaGUgbmV4dCBvZmZzZXQgaXMgc3RvcmVkIGluIHRoZSAxc3Qgd29yZC4gIDAgbWVhbnMgbm8gbW9yZSAqLwotCQlvZmZzZXQgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKShwdHIgKyBvZmZzZXQpKTsKLQl9Ci0JaWYgKCFyaW9fdGFibGVfaGRyKSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGxvY2F0ZSBSaW8gR3JhbmRlIFRhYmxlIGluIEVCREEgLSBiYWlsaW5nIVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIWJ1aWxkX2RldGFpbF9hcnJheXMoKSkKLQkJcmV0dXJuOwotCi0JLyogVGhlIGZpcnN0IFdpbm5pcGVnIHdlJ3JlIGxvb2tpbmcgZm9yIGhhcyBhbiBpbmRleCBvZiAwICovCi0JbmV4dF93cGVnID0gMDsKLQlkbyB7Ci0JCWZvciAoaSA9IDA7IGkgPCByaW9fdGFibGVfaGRyLT5udW1fcmlvX2RldjsgaSsrKSB7Ci0JCQlpZiAoaXNfV1BFRyhyaW9fZGV2c1tpXSkgJiYgcmlvX2RldnNbaV0tPldQX2luZGV4ID09IG5leHRfd3BlZykgewotCQkJCS8qIEl0J3MgdGhlIFdpbm5pcGVnIHdlJ3JlIGxvb2tpbmcgZm9yISAqLwotCQkJCW5leHRfYnVzID0gc2V0dXBfcGNpX25vZGVfbWFwX2Zvcl93cGVnKGksIG5leHRfYnVzKTsKLQkJCQluZXh0X3dwZWcrKzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvKgotCQkgKiBJZiB3ZSBnbyB0aHJvdWdoIGFsbCBSaW8gZGV2aWNlcyBhbmQgZG9uJ3QgZmluZCBvbmUgd2l0aAotCQkgKiB0aGUgbmV4dCBpbmRleCwgaXQgbWVhbnMgd2UndmUgZm91bmQgYWxsIHRoZSBXaW5uaXBlZ3MsCi0JCSAqIGFuZCB0aHVzIGFsbCB0aGUgUENJIGJ1c2VzLgotCQkgKi8KLQkJaWYgKGkgPT0gcmlvX3RhYmxlX2hkci0+bnVtX3Jpb19kZXYpCi0JCQluZXh0X3dwZWcgPSAwOwotCX0gd2hpbGUgKG5leHRfd3BlZyAhPSAwKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IGFwaWMgYXBpY19zdW1taXQgPSB7Ci0KLQkubmFtZQkJCQk9ICJzdW1taXQiLAotCS5wcm9iZQkJCQk9IHByb2JlX3N1bW1pdCwKLQkuYWNwaV9tYWR0X29lbV9jaGVjawkJPSBzdW1taXRfYWNwaV9tYWR0X29lbV9jaGVjaywKLQkuYXBpY19pZF92YWxpZAkJCT0gZGVmYXVsdF9hcGljX2lkX3ZhbGlkLAotCS5hcGljX2lkX3JlZ2lzdGVyZWQJCT0gc3VtbWl0X2FwaWNfaWRfcmVnaXN0ZXJlZCwKLQotCS5pcnFfZGVsaXZlcnlfbW9kZQkJPSBkZXN0X0xvd2VzdFByaW8sCi0JLyogbG9naWNhbCBkZWxpdmVyeSBicm9hZGNhc3QgdG8gYWxsIENQVXM6ICovCi0JLmlycV9kZXN0X21vZGUJCQk9IDEsCi0KLQkudGFyZ2V0X2NwdXMJCQk9IHN1bW1pdF90YXJnZXRfY3B1cywKLQkuZGlzYWJsZV9lc3IJCQk9IDEsCi0JLmRlc3RfbG9naWNhbAkJCT0gQVBJQ19ERVNUX0xPR0lDQUwsCi0JLmNoZWNrX2FwaWNpZF91c2VkCQk9IHN1bW1pdF9jaGVja19hcGljaWRfdXNlZCwKLQkuY2hlY2tfYXBpY2lkX3ByZXNlbnQJCT0gc3VtbWl0X2NoZWNrX2FwaWNpZF9wcmVzZW50LAotCi0JLnZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbgk9IGZsYXRfdmVjdG9yX2FsbG9jYXRpb25fZG9tYWluLAotCS5pbml0X2FwaWNfbGRyCQkJPSBzdW1taXRfaW5pdF9hcGljX2xkciwKLQotCS5pb2FwaWNfcGh5c19pZF9tYXAJCT0gc3VtbWl0X2lvYXBpY19waHlzX2lkX21hcCwKLQkuc2V0dXBfYXBpY19yb3V0aW5nCQk9IHN1bW1pdF9zZXR1cF9hcGljX3JvdXRpbmcsCi0JLm11bHRpX3RpbWVyX2NoZWNrCQk9IE5VTEwsCi0JLmNwdV9wcmVzZW50X3RvX2FwaWNpZAkJPSBzdW1taXRfY3B1X3ByZXNlbnRfdG9fYXBpY2lkLAotCS5hcGljaWRfdG9fY3B1X3ByZXNlbnQJCT0gc3VtbWl0X2FwaWNpZF90b19jcHVfcHJlc2VudCwKLQkuc2V0dXBfcG9ydGlvX3JlbWFwCQk9IE5VTEwsCi0JLmNoZWNrX3BoeXNfYXBpY2lkX3ByZXNlbnQJPSBzdW1taXRfY2hlY2tfcGh5c19hcGljaWRfcHJlc2VudCwKLQkuZW5hYmxlX2FwaWNfbW9kZQkJPSBOVUxMLAotCS5waHlzX3BrZ19pZAkJCT0gc3VtbWl0X3BoeXNfcGtnX2lkLAotCS5tcHNfb2VtX2NoZWNrCQkJPSBzdW1taXRfbXBzX29lbV9jaGVjaywKLQotCS5nZXRfYXBpY19pZAkJCT0gc3VtbWl0X2dldF9hcGljX2lkLAotCS5zZXRfYXBpY19pZAkJCT0gTlVMTCwKLQkuYXBpY19pZF9tYXNrCQkJPSAweEZGIDw8IDI0LAotCi0JLmNwdV9tYXNrX3RvX2FwaWNpZF9hbmQJCT0gc3VtbWl0X2NwdV9tYXNrX3RvX2FwaWNpZF9hbmQsCi0KLQkuc2VuZF9JUElfbWFzawkJCT0gc3VtbWl0X3NlbmRfSVBJX21hc2ssCi0JLnNlbmRfSVBJX21hc2tfYWxsYnV0c2VsZgk9IE5VTEwsCi0JLnNlbmRfSVBJX2FsbGJ1dHNlbGYJCT0gc3VtbWl0X3NlbmRfSVBJX2FsbGJ1dHNlbGYsCi0JLnNlbmRfSVBJX2FsbAkJCT0gc3VtbWl0X3NlbmRfSVBJX2FsbCwKLQkuc2VuZF9JUElfc2VsZgkJCT0gZGVmYXVsdF9zZW5kX0lQSV9zZWxmLAotCi0JLnRyYW1wb2xpbmVfcGh5c19sb3cJCT0gREVGQVVMVF9UUkFNUE9MSU5FX1BIWVNfTE9XLAotCS50cmFtcG9saW5lX3BoeXNfaGlnaAkJPSBERUZBVUxUX1RSQU1QT0xJTkVfUEhZU19ISUdILAotCi0JLndhaXRfZm9yX2luaXRfZGVhc3NlcnQJCT0gdHJ1ZSwKLQkuc21wX2NhbGxpbl9jbGVhcl9sb2NhbF9hcGljCT0gTlVMTCwKLQkuaW5xdWlyZV9yZW1vdGVfYXBpYwkJPSBkZWZhdWx0X2lucXVpcmVfcmVtb3RlX2FwaWMsCi0KLQkucmVhZAkJCQk9IG5hdGl2ZV9hcGljX21lbV9yZWFkLAotCS53cml0ZQkJCQk9IG5hdGl2ZV9hcGljX21lbV93cml0ZSwKLQkuZW9pX3dyaXRlCQkJPSBuYXRpdmVfYXBpY19tZW1fd3JpdGUsCi0JLmljcl9yZWFkCQkJPSBuYXRpdmVfYXBpY19pY3JfcmVhZCwKLQkuaWNyX3dyaXRlCQkJPSBuYXRpdmVfYXBpY19pY3Jfd3JpdGUsCi0JLndhaXRfaWNyX2lkbGUJCQk9IG5hdGl2ZV9hcGljX3dhaXRfaWNyX2lkbGUsCi0JLnNhZmVfd2FpdF9pY3JfaWRsZQkJPSBuYXRpdmVfc2FmZV9hcGljX3dhaXRfaWNyX2lkbGUsCi0KLQkueDg2XzMyX2Vhcmx5X2xvZ2ljYWxfYXBpY2lkCT0gc3VtbWl0X2Vhcmx5X2xvZ2ljYWxfYXBpY2lkLAotfTsKLQotYXBpY19kcml2ZXIoYXBpY19zdW1taXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKaW5kZXggOGUyOGJmMi4uYTEzNTIzOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCkBAIC0xMDI1LDcgKzEwMjUsOCBAQAogCiBzdGF0aWMgX19pbml0IGludCBzZXR1cF9ub2NsZmx1c2goY2hhciAqYXJnKQogewotCXNldHVwX2NsZWFyX2NwdV9jYXAoWDg2X0ZFQVRVUkVfQ0xGTFNIKTsKKwlzZXR1cF9jbGVhcl9jcHVfY2FwKFg4Nl9GRUFUVVJFX0NMRkxVU0gpOworCXNldHVwX2NsZWFyX2NwdV9jYXAoWDg2X0ZFQVRVUkVfQ0xGTFVTSE9QVCk7CiAJcmV0dXJuIDE7CiB9CiBfX3NldHVwKCJub2NsZmx1c2giLCBzZXR1cF9ub2NsZmx1c2gpOwpAQCAtMTA3OCw2ICsxMDc5LDEwIEBACiB9CiBfX3NldHVwKCJjbGVhcmNwdWlkPSIsIHNldHVwX2Rpc2FibGVjcHVpZCk7CiAKK0RFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIGtlcm5lbF9zdGFjaykgPQorCSh1bnNpZ25lZCBsb25nKSZpbml0X3RocmVhZF91bmlvbiAtIEtFUk5FTF9TVEFDS19PRkZTRVQgKyBUSFJFQURfU0laRTsKK0VYUE9SVF9QRVJfQ1BVX1NZTUJPTChrZXJuZWxfc3RhY2spOworCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogc3RydWN0IGRlc2NfcHRyIGlkdF9kZXNjciA9IHsgTlJfVkVDVE9SUyAqIDE2IC0gMSwgKHVuc2lnbmVkIGxvbmcpIGlkdF90YWJsZSB9Owogc3RydWN0IGRlc2NfcHRyIGRlYnVnX2lkdF9kZXNjciA9IHsgTlJfVkVDVE9SUyAqIDE2IC0gMSwKQEAgLTEwOTQsMTAgKzEwOTksNiBAQAogCSZpbml0X3Rhc2s7CiBFWFBPUlRfUEVSX0NQVV9TWU1CT0woY3VycmVudF90YXNrKTsKIAotREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywga2VybmVsX3N0YWNrKSA9Ci0JKHVuc2lnbmVkIGxvbmcpJmluaXRfdGhyZWFkX3VuaW9uIC0gS0VSTkVMX1NUQUNLX09GRlNFVCArIFRIUkVBRF9TSVpFOwotRVhQT1JUX1BFUl9DUFVfU1lNQk9MKGtlcm5lbF9zdGFjayk7Ci0KIERFRklORV9QRVJfQ1BVKGNoYXIgKiwgaXJxX3N0YWNrX3B0cikgPQogCWluaXRfcGVyX2NwdV92YXIoaXJxX3N0YWNrX3VuaW9uLmlycV9zdGFjaykgKyBJUlFfU1RBQ0tfU0laRSAtIDY0OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsLmMKaW5kZXggODk3ZDYyMC4uYTgwMDI5MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYwpAQCAtMjc0LDEwICsyNzQsNiBAQAogCX0KICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1g4Nl9OVU1BUQotCW51bWFxX3RzY19kaXNhYmxlKCk7Ci0jZW5kaWYKLQogCWludGVsX3NtcF9jaGVjayhjKTsKIH0KICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21hdGNoLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21hdGNoLmMKaW5kZXggMzY1NjUzNy4uYWZhOWYwZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tYXRjaC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWF0Y2guYwpAQCAtNDcsNDUgKzQ3LDMgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0woeDg2X21hdGNoX2NwdSk7Ci0KLXNzaXplX3QgYXJjaF9wcmludF9jcHVfbW9kYWxpYXMoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCWNoYXIgKmJ1ZnB0cikKLXsKLQlpbnQgc2l6ZSA9IFBBR0VfU0laRTsKLQlpbnQgaSwgbjsKLQljaGFyICpidWYgPSBidWZwdHI7Ci0KLQluID0gc25wcmludGYoYnVmLCBzaXplLCAieDg2Y3B1OnZlbmRvcjolMDRYOmZhbWlseTolMDRYOiIKLQkJICAgICAibW9kZWw6JTA0WDpmZWF0dXJlOiIsCi0JCWJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciwKLQkJYm9vdF9jcHVfZGF0YS54ODYsCi0JCWJvb3RfY3B1X2RhdGEueDg2X21vZGVsKTsKLQlzaXplIC09IG47Ci0JYnVmICs9IG47Ci0Jc2l6ZSAtPSAxOwotCWZvciAoaSA9IDA7IGkgPCBOQ0FQSU5UUyozMjsgaSsrKSB7Ci0JCWlmIChib290X2NwdV9oYXMoaSkpIHsKLQkJCW4gPSBzbnByaW50ZihidWYsIHNpemUsICIsJTA0WCIsIGkpOwotCQkJaWYgKG4gPj0gc2l6ZSkgewotCQkJCVdBUk4oMSwgIng4NiBmZWF0dXJlcyBvdmVyZmxvdyBwYWdlXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXNpemUgLT0gbjsKLQkJCWJ1ZiArPSBuOwotCQl9Ci0JfQotCSpidWYrKyA9ICdcbic7Ci0JcmV0dXJuIGJ1ZiAtIGJ1ZnB0cjsKLX0KLQotaW50IGFyY2hfY3B1X3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKLXsKLQljaGFyICpidWYgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGJ1ZikgewotCQlhcmNoX3ByaW50X2NwdV9tb2RhbGlhcyhOVUxMLCBOVUxMLCBidWYpOwotCQlhZGRfdWV2ZW50X3ZhcihlbnYsICJNT0RBTElBUz0lcyIsIGJ1Zik7Ci0JCWtmcmVlKGJ1Zik7Ci0JfQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tc2h5cGVydi5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tc2h5cGVydi5jCmluZGV4IDgzMmQwNWEuLjc2Zjk4ZmUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXNoeXBlcnYuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21zaHlwZXJ2LmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+CiAjaW5jbHVkZSA8YXNtL2h5cGVydi5oPgpAQCAtMzEsNiArMzIsNDUgQEAKIHN0cnVjdCBtc19oeXBlcnZfaW5mbyBtc19oeXBlcnY7CiBFWFBPUlRfU1lNQk9MX0dQTChtc19oeXBlcnYpOwogCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSFlQRVJWKQorc3RhdGljIHZvaWQgKCp2bWJ1c19oYW5kbGVyKSh2b2lkKTsKKwordm9pZCBoeXBlcnZfdmVjdG9yX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOworCisJaXJxX2VudGVyKCk7CisJZXhpdF9pZGxlKCk7CisKKwlpbmNfaXJxX3N0YXQoaXJxX2h2X2NhbGxiYWNrX2NvdW50KTsKKwlpZiAodm1idXNfaGFuZGxlcikKKwkJdm1idXNfaGFuZGxlcigpOworCisJaXJxX2V4aXQoKTsKKwlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOworfQorCit2b2lkIGh2X3NldHVwX3ZtYnVzX2lycSh2b2lkICgqaGFuZGxlcikodm9pZCkpCit7CisJdm1idXNfaGFuZGxlciA9IGhhbmRsZXI7CisJLyoKKwkgKiBTZXR1cCB0aGUgSURUIGZvciBoeXBlcnZpc29yIGNhbGxiYWNrLiBQcmV2ZW50IHJlYWxsb2NhdGlvbgorCSAqIGF0IG1vZHVsZSByZWxvYWQuCisJICovCisJaWYgKCF0ZXN0X2JpdChIWVBFUlZJU09SX0NBTExCQUNLX1ZFQ1RPUiwgdXNlZF92ZWN0b3JzKSkKKwkJYWxsb2NfaW50cl9nYXRlKEhZUEVSVklTT1JfQ0FMTEJBQ0tfVkVDVE9SLAorCQkJCWh5cGVydl9jYWxsYmFja192ZWN0b3IpOworfQorCit2b2lkIGh2X3JlbW92ZV92bWJ1c19pcnEodm9pZCkKK3sKKwkvKiBXZSBoYXZlIG5vIHdheSB0byBkZWFsbG9jYXRlIHRoZSBpbnRlcnJ1cHQgZ2F0ZSAqLworCXZtYnVzX2hhbmRsZXIgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaHZfc2V0dXBfdm1idXNfaXJxKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGh2X3JlbW92ZV92bWJ1c19pcnEpOworI2VuZGlmCisKIHN0YXRpYyB1aW50MzJfdCAgX19pbml0IG1zX2h5cGVydl9wbGF0Zm9ybSh2b2lkKQogewogCXUzMiBlYXg7CkBAIC0xMTksNDEgKzE1OSwzIEBACiAJLmluaXRfcGxhdGZvcm0JCT0gbXNfaHlwZXJ2X2luaXRfcGxhdGZvcm0sCiB9OwogRVhQT1JUX1NZTUJPTCh4ODZfaHlwZXJfbXNfaHlwZXJ2KTsKLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX0hZUEVSVikKLXN0YXRpYyBpbnQgdm1idXNfaXJxID0gLTE7Ci1zdGF0aWMgaXJxX2hhbmRsZXJfdCB2bWJ1c19pc3I7Ci0KLXZvaWQgaHZfcmVnaXN0ZXJfdm1idXNfaGFuZGxlcihpbnQgaXJxLCBpcnFfaGFuZGxlcl90IGhhbmRsZXIpCi17Ci0JLyoKLQkgKiBTZXR1cCB0aGUgSURUIGZvciBoeXBlcnZpc29yIGNhbGxiYWNrLgotCSAqLwotCWFsbG9jX2ludHJfZ2F0ZShIWVBFUlZJU09SX0NBTExCQUNLX1ZFQ1RPUiwgaHlwZXJ2X2NhbGxiYWNrX3ZlY3Rvcik7Ci0KLQl2bWJ1c19pcnEgPSBpcnE7Ci0Jdm1idXNfaXNyID0gaGFuZGxlcjsKLX0KLQotdm9pZCBoeXBlcnZfdmVjdG9yX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOwotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKLQotCWlycV9lbnRlcigpOwotCWV4aXRfaWRsZSgpOwotCi0JZGVzYyA9IGlycV90b19kZXNjKHZtYnVzX2lycSk7Ci0KLQlpZiAoZGVzYykKLQkJZ2VuZXJpY19oYW5kbGVfaXJxX2Rlc2Modm1idXNfaXJxLCBkZXNjKTsKLQotCWlycV9leGl0KCk7Ci0Jc2V0X2lycV9yZWdzKG9sZF9yZWdzKTsKLX0KLSNlbHNlCi12b2lkIGh2X3JlZ2lzdGVyX3ZtYnVzX2hhbmRsZXIoaW50IGlycSwgaXJxX2hhbmRsZXJfdCBoYW5kbGVyKQotewotfQotI2VuZGlmCi1FWFBPUlRfU1lNQk9MX0dQTChodl9yZWdpc3Rlcl92bWJ1c19oYW5kbGVyKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfMzIuYwppbmRleCBhMjFkNDljLi41YWJkNGNkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja18zMi5jCkBAIC0xNiwxMiArMTYsMzUgQEAKIAogI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CiAKK3N0YXRpYyB2b2lkICppc19pcnFfc3RhY2sodm9pZCAqcCwgdm9pZCAqaXJxKQoreworCWlmIChwIDwgaXJxIHx8IHAgPj0gKGlycSArIFRIUkVBRF9TSVpFKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGlycSArIFRIUkVBRF9TSVpFOworfQorCisKK3N0YXRpYyB2b2lkICppc19oYXJkaXJxX3N0YWNrKHVuc2lnbmVkIGxvbmcgKnN0YWNrLCBpbnQgY3B1KQoreworCXZvaWQgKmlycSA9IHBlcl9jcHUoaGFyZGlycV9zdGFjaywgY3B1KTsKKworCXJldHVybiBpc19pcnFfc3RhY2soc3RhY2ssIGlycSk7Cit9CisKK3N0YXRpYyB2b2lkICppc19zb2Z0aXJxX3N0YWNrKHVuc2lnbmVkIGxvbmcgKnN0YWNrLCBpbnQgY3B1KQoreworCXZvaWQgKmlycSA9IHBlcl9jcHUoc29mdGlycV9zdGFjaywgY3B1KTsKKworCXJldHVybiBpc19pcnFfc3RhY2soc3RhY2ssIGlycSk7Cit9CiAKIHZvaWQgZHVtcF90cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAogCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwKIAkJY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsIHZvaWQgKmRhdGEpCiB7CisJY29uc3QgdW5zaWduZWQgY3B1ID0gZ2V0X2NwdSgpOwogCWludCBncmFwaCA9IDA7CisJdTMyICpwcmV2X2VzcDsKIAogCWlmICghdGFzaykKIAkJdGFzayA9IGN1cnJlbnQ7CkBAIC0zOSwxOCArNjIsMzEgQEAKIAogCWZvciAoOzspIHsKIAkJc3RydWN0IHRocmVhZF9pbmZvICpjb250ZXh0OworCQl2b2lkICplbmRfc3RhY2s7CiAKLQkJY29udGV4dCA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKikKLQkJCSgodW5zaWduZWQgbG9uZylzdGFjayAmICh+KFRIUkVBRF9TSVpFIC0gMSkpKTsKLQkJYnAgPSBvcHMtPndhbGtfc3RhY2soY29udGV4dCwgc3RhY2ssIGJwLCBvcHMsIGRhdGEsIE5VTEwsICZncmFwaCk7CisJCWVuZF9zdGFjayA9IGlzX2hhcmRpcnFfc3RhY2soc3RhY2ssIGNwdSk7CisJCWlmICghZW5kX3N0YWNrKQorCQkJZW5kX3N0YWNrID0gaXNfc29mdGlycV9zdGFjayhzdGFjaywgY3B1KTsKIAotCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopY29udGV4dC0+cHJldmlvdXNfZXNwOworCQljb250ZXh0ID0gdGFza190aHJlYWRfaW5mbyh0YXNrKTsKKwkJYnAgPSBvcHMtPndhbGtfc3RhY2soY29udGV4dCwgc3RhY2ssIGJwLCBvcHMsIGRhdGEsCisJCQkJICAgICBlbmRfc3RhY2ssICZncmFwaCk7CisKKwkJLyogU3RvcCBpZiBub3Qgb24gaXJxIHN0YWNrICovCisJCWlmICghZW5kX3N0YWNrKQorCQkJYnJlYWs7CisKKwkJLyogVGhlIHByZXZpb3VzIGVzcCBpcyBzYXZlZCBvbiB0aGUgYm90dG9tIG9mIHRoZSBzdGFjayAqLworCQlwcmV2X2VzcCA9ICh1MzIgKikoZW5kX3N0YWNrIC0gVEhSRUFEX1NJWkUpOworCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopKnByZXZfZXNwOwogCQlpZiAoIXN0YWNrKQogCQkJYnJlYWs7CisKIAkJaWYgKG9wcy0+c3RhY2soZGF0YSwgIklSUSIpIDwgMCkKIAkJCWJyZWFrOwogCQl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKIAl9CisJcHV0X2NwdSgpOwogfQogRVhQT1JUX1NZTUJPTChkdW1wX3RyYWNlKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jCmluZGV4IGFkZGIyMDcuLjFhYmNiNTAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzY0LmMKQEAgLTEwNCw2ICsxMDQsNDQgQEAKIAlyZXR1cm4gKHN0YWNrID49IGlycV9zdGFjayAmJiBzdGFjayA8IGlycV9zdGFja19lbmQpOwogfQogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBpcnFfc3RhY2tfc2l6ZSA9CisJKElSUV9TVEFDS19TSVpFIC0gNjQpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCitlbnVtIHN0YWNrX3R5cGUgeworCVNUQUNLX0lTX1VOS05PV04sCisJU1RBQ0tfSVNfTk9STUFMLAorCVNUQUNLX0lTX0VYQ0VQVElPTiwKKwlTVEFDS19JU19JUlEsCit9OworCitzdGF0aWMgZW51bSBzdGFja190eXBlCithbmFseXplX3N0YWNrKGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3RhY2ssCisJICAgICAgdW5zaWduZWQgbG9uZyAqKnN0YWNrX2VuZCwgdW5zaWduZWQgbG9uZyAqaXJxX3N0YWNrLAorCSAgICAgIHVuc2lnbmVkICp1c2VkLCBjaGFyICoqaWQpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJYWRkciA9ICgodW5zaWduZWQgbG9uZylzdGFjayAmICh+KFRIUkVBRF9TSVpFIC0gMSkpKTsKKwlpZiAoKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHRhc2spID09IGFkZHIpCisJCXJldHVybiBTVEFDS19JU19OT1JNQUw7CisKKwkqc3RhY2tfZW5kID0gaW5fZXhjZXB0aW9uX3N0YWNrKGNwdSwgKHVuc2lnbmVkIGxvbmcpc3RhY2ssCisJCQkJCXVzZWQsIGlkKTsKKwlpZiAoKnN0YWNrX2VuZCkKKwkJcmV0dXJuIFNUQUNLX0lTX0VYQ0VQVElPTjsKKworCWlmICghaXJxX3N0YWNrKQorCQlyZXR1cm4gU1RBQ0tfSVNfTk9STUFMOworCisJKnN0YWNrX2VuZCA9IGlycV9zdGFjazsKKwlpcnFfc3RhY2sgPSBpcnFfc3RhY2sgLSBpcnFfc3RhY2tfc2l6ZTsKKworCWlmIChpbl9pcnFfc3RhY2soc3RhY2ssIGlycV9zdGFjaywgKnN0YWNrX2VuZCkpCisJCXJldHVybiBTVEFDS19JU19JUlE7CisKKwlyZXR1cm4gU1RBQ0tfSVNfVU5LTk9XTjsKK30KKwogLyoKICAqIHg4Ni02NCBjYW4gaGF2ZSB1cCB0byB0aHJlZSBrZXJuZWwgc3RhY2tzOgogICogcHJvY2VzcyBzdGFjawpAQCAtMTE2LDEyICsxNTQsMTIgQEAKIAkJY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsIHZvaWQgKmRhdGEpCiB7CiAJY29uc3QgdW5zaWduZWQgY3B1ID0gZ2V0X2NwdSgpOwotCXVuc2lnbmVkIGxvbmcgKmlycV9zdGFja19lbmQgPQotCQkodW5zaWduZWQgbG9uZyAqKXBlcl9jcHUoaXJxX3N0YWNrX3B0ciwgY3B1KTsKLQl1bnNpZ25lZCB1c2VkID0gMDsKIAlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpbmZvOwotCWludCBncmFwaCA9IDA7CisJdW5zaWduZWQgbG9uZyAqaXJxX3N0YWNrID0gKHVuc2lnbmVkIGxvbmcgKilwZXJfY3B1KGlycV9zdGFja19wdHIsIGNwdSk7CiAJdW5zaWduZWQgbG9uZyBkdW1teTsKKwl1bnNpZ25lZCB1c2VkID0gMDsKKwlpbnQgZ3JhcGggPSAwOworCWludCBkb25lID0gMDsKIAogCWlmICghdGFzaykKIAkJdGFzayA9IGN1cnJlbnQ7CkBAIC0xNDMsNDkgKzE4MSw2MSBAQAogCSAqIGV4Y2VwdGlvbnMKIAkgKi8KIAl0aW5mbyA9IHRhc2tfdGhyZWFkX2luZm8odGFzayk7Ci0JZm9yICg7OykgeworCXdoaWxlICghZG9uZSkgeworCQl1bnNpZ25lZCBsb25nICpzdGFja19lbmQ7CisJCWVudW0gc3RhY2tfdHlwZSBzdHlwZTsKIAkJY2hhciAqaWQ7Ci0JCXVuc2lnbmVkIGxvbmcgKmVzdGFja19lbmQ7Ci0JCWVzdGFja19lbmQgPSBpbl9leGNlcHRpb25fc3RhY2soY3B1LCAodW5zaWduZWQgbG9uZylzdGFjaywKLQkJCQkJCSZ1c2VkLCAmaWQpOwogCi0JCWlmIChlc3RhY2tfZW5kKSB7CisJCXN0eXBlID0gYW5hbHl6ZV9zdGFjayhjcHUsIHRhc2ssIHN0YWNrLCAmc3RhY2tfZW5kLAorCQkJCSAgICAgIGlycV9zdGFjaywgJnVzZWQsICZpZCk7CisKKwkJLyogRGVmYXVsdCBmaW5pc2ggdW5sZXNzIHNwZWNpZmllZCB0byBjb250aW51ZSAqLworCQlkb25lID0gMTsKKworCQlzd2l0Y2ggKHN0eXBlKSB7CisKKwkJLyogQnJlYWsgb3V0IGVhcmx5IGlmIHdlIGFyZSBvbiB0aGUgdGhyZWFkIHN0YWNrICovCisJCWNhc2UgU1RBQ0tfSVNfTk9STUFMOgorCQkJYnJlYWs7CisKKwkJY2FzZSBTVEFDS19JU19FWENFUFRJT046CisKIAkJCWlmIChvcHMtPnN0YWNrKGRhdGEsIGlkKSA8IDApCiAJCQkJYnJlYWs7CiAKIAkJCWJwID0gb3BzLT53YWxrX3N0YWNrKHRpbmZvLCBzdGFjaywgYnAsIG9wcywKLQkJCQkJICAgICBkYXRhLCBlc3RhY2tfZW5kLCAmZ3JhcGgpOworCQkJCQkgICAgIGRhdGEsIHN0YWNrX2VuZCwgJmdyYXBoKTsKIAkJCW9wcy0+c3RhY2soZGF0YSwgIjxFT0U+Iik7CiAJCQkvKgogCQkJICogV2UgbGluayB0byB0aGUgbmV4dCBzdGFjayB2aWEgdGhlCiAJCQkgKiBzZWNvbmQtdG8tbGFzdCBwb2ludGVyIChpbmRleCAtMiB0byBlbmQpIGluIHRoZQogCQkJICogZXhjZXB0aW9uIHN0YWNrOgogCQkJICovCi0JCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopIGVzdGFja19lbmRbLTJdOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGlycV9zdGFja19lbmQpIHsKLQkJCXVuc2lnbmVkIGxvbmcgKmlycV9zdGFjazsKLQkJCWlycV9zdGFjayA9IGlycV9zdGFja19lbmQgLQotCQkJCShJUlFfU1RBQ0tfU0laRSAtIDY0KSAvIHNpemVvZigqaXJxX3N0YWNrKTsKKwkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKikgc3RhY2tfZW5kWy0yXTsKKwkJCWRvbmUgPSAwOworCQkJYnJlYWs7CiAKLQkJCWlmIChpbl9pcnFfc3RhY2soc3RhY2ssIGlycV9zdGFjaywgaXJxX3N0YWNrX2VuZCkpIHsKLQkJCQlpZiAob3BzLT5zdGFjayhkYXRhLCAiSVJRIikgPCAwKQotCQkJCQlicmVhazsKLQkJCQlicCA9IG9wcy0+d2Fsa19zdGFjayh0aW5mbywgc3RhY2ssIGJwLAotCQkJCQlvcHMsIGRhdGEsIGlycV9zdGFja19lbmQsICZncmFwaCk7Ci0JCQkJLyoKLQkJCQkgKiBXZSBsaW5rIHRvIHRoZSBuZXh0IHN0YWNrICh3aGljaCB3b3VsZCBiZQotCQkJCSAqIHRoZSBwcm9jZXNzIHN0YWNrIG5vcm1hbGx5KSB0aGUgbGFzdAotCQkJCSAqIHBvaW50ZXIgKGluZGV4IC0xIHRvIGVuZCkgaW4gdGhlIElSUSBzdGFjazoKLQkJCQkgKi8KLQkJCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopIChpcnFfc3RhY2tfZW5kWy0xXSk7Ci0JCQkJaXJxX3N0YWNrX2VuZCA9IE5VTEw7Ci0JCQkJb3BzLT5zdGFjayhkYXRhLCAiRU9JIik7Ci0JCQkJY29udGludWU7Ci0JCQl9CisJCWNhc2UgU1RBQ0tfSVNfSVJROgorCisJCQlpZiAob3BzLT5zdGFjayhkYXRhLCAiSVJRIikgPCAwKQorCQkJCWJyZWFrOworCQkJYnAgPSBvcHMtPndhbGtfc3RhY2sodGluZm8sIHN0YWNrLCBicCwKKwkJCQkgICAgIG9wcywgZGF0YSwgc3RhY2tfZW5kLCAmZ3JhcGgpOworCQkJLyoKKwkJCSAqIFdlIGxpbmsgdG8gdGhlIG5leHQgc3RhY2sgKHdoaWNoIHdvdWxkIGJlCisJCQkgKiB0aGUgcHJvY2VzcyBzdGFjayBub3JtYWxseSkgdGhlIGxhc3QKKwkJCSAqIHBvaW50ZXIgKGluZGV4IC0xIHRvIGVuZCkgaW4gdGhlIElSUSBzdGFjazoKKwkJCSAqLworCQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKSAoc3RhY2tfZW5kWy0xXSk7CisJCQlpcnFfc3RhY2sgPSBOVUxMOworCQkJb3BzLT5zdGFjayhkYXRhLCAiRU9JIik7CisJCQlkb25lID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgU1RBQ0tfSVNfVU5LTk9XTjoKKwkJCW9wcy0+c3RhY2soZGF0YSwgIlVOSyIpOworCQkJYnJlYWs7CiAJCX0KLQkJYnJlYWs7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9lYXJseS1xdWlya3MuYyBiL2FyY2gveDg2L2tlcm5lbC9lYXJseS1xdWlya3MuYwppbmRleCBiYzRhMDg4Li42ZDdkNWExIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZWFybHktcXVpcmtzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2Vhcmx5LXF1aXJrcy5jCkBAIC0yMDMsMTggKzIwMywxNSBAQAogCXJldmlzaW9uID0gcmVhZF9wY2lfY29uZmlnX2J5dGUobnVtLCBzbG90LCBmdW5jLCBQQ0lfUkVWSVNJT05fSUQpOwogCiAJLyoKLSAJICogUmV2aXNpb24gMTMgb2YgYWxsIHRyaWdnZXJpbmcgZGV2aWNlcyBpZCBpbiB0aGlzIHF1aXJrIGhhdmUKLQkgKiBhIHByb2JsZW0gZHJhaW5pbmcgaW50ZXJydXB0cyB3aGVuIGlycSByZW1hcHBpbmcgaXMgZW5hYmxlZCwKLQkgKiBhbmQgc2hvdWxkIGJlIGZsYWdnZWQgYXMgYnJva2VuLiAgQWRkaXRpb25hbGx5IHJldmlzaW9ucyAweDEyCi0JICogYW5kIDB4MjIgb2YgZGV2aWNlIGlkIDB4MzQwNSBoYXMgdGhpcyBwcm9ibGVtLgorCSAqIFJldmlzaW9uIDw9IDEzIG9mIGFsbCB0cmlnZ2VyaW5nIGRldmljZXMgaWQgaW4gdGhpcyBxdWlyaworCSAqIGhhdmUgYSBwcm9ibGVtIGRyYWluaW5nIGludGVycnVwdHMgd2hlbiBpcnEgcmVtYXBwaW5nIGlzCisJICogZW5hYmxlZCwgYW5kIHNob3VsZCBiZSBmbGFnZ2VkIGFzIGJyb2tlbi4gQWRkaXRpb25hbGx5CisJICogcmV2aXNpb24gMHgyMiBvZiBkZXZpY2UgaWQgMHgzNDA1IGhhcyB0aGlzIHByb2JsZW0uCiAJICovCi0JaWYgKHJldmlzaW9uID09IDB4MTMpCisJaWYgKHJldmlzaW9uIDw9IDB4MTMpCiAJCXNldF9pcnFfcmVtYXBwaW5nX2Jyb2tlbigpOwotCWVsc2UgaWYgKChkZXZpY2UgPT0gMHgzNDA1KSAmJgotCSAgICAoKHJldmlzaW9uID09IDB4MTIpIHx8Ci0JICAgICAocmV2aXNpb24gPT0gMHgyMikpKQorCWVsc2UgaWYgKGRldmljZSA9PSAweDM0MDUgJiYgcmV2aXNpb24gPT0gMHgyMikKIAkJc2V0X2lycV9yZW1hcHBpbmdfYnJva2VuKCk7Ci0KIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaHBldC5jCmluZGV4IGRhODVhOGUuLjkzZWVkMTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2hwZXQuYwpAQCAtNTIxLDcgKzUyMSw3IEBACiB7CiAKIAlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGhwZXRfaW50ZXJydXB0X2hhbmRsZXIsCi0JCQlJUlFGX1RJTUVSIHwgSVJRRl9ESVNBQkxFRCB8IElSUUZfTk9CQUxBTkNJTkcsCisJCQlJUlFGX1RJTUVSIHwgSVJRRl9OT0JBTEFOQ0lORywKIAkJCWRldi0+bmFtZSwgZGV2KSkKIAkJcmV0dXJuIC0xOwogCkBAIC02OTksNyArNjk5LDcgQEAKIAkJLyogRklYTUU6IGFkZCBzY2hlZHVsZV93b3JrX29uKCkgKi8KIAkJc2NoZWR1bGVfZGVsYXllZF93b3JrX29uKGNwdSwgJndvcmsud29yaywgMCk7CiAJCXdhaXRfZm9yX2NvbXBsZXRpb24oJndvcmsuY29tcGxldGUpOwotCQlkZXN0cm95X3RpbWVyX29uX3N0YWNrKCZ3b3JrLndvcmsudGltZXIpOworCQlkZXN0cm95X2RlbGF5ZWRfd29ya19vbl9zdGFjaygmd29yay53b3JrKTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfREVBRDoKIAkJaWYgKGhkZXYpIHsKQEAgLTc1Miw5ICs3NTIsNyBAQAogCS5tYXNrCQk9IEhQRVRfTUFTSywKIAkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiAJLnJlc3VtZQkJPSBocGV0X3Jlc3VtZV9jb3VudGVyLAotI2lmZGVmIENPTkZJR19YODZfNjQKIAkuYXJjaGRhdGEJPSB7IC52Y2xvY2tfbW9kZSA9IFZDTE9DS19IUEVUIH0sCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgaHBldF9jbG9ja3NvdXJjZV9yZWdpc3Rlcih2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2lycS5jIGIvYXJjaC94ODYva2VybmVsL2lycS5jCmluZGV4IGQ5OWYzMWQuLjQyODA1ZmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMKQEAgLTEyNSw2ICsxMjUsMTIgQEAKIAkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBwZXJfY3B1KG1jZV9wb2xsX2NvdW50LCBqKSk7CiAJc2VxX3ByaW50ZihwLCAiICBNYWNoaW5lIGNoZWNrIHBvbGxzXG4iKTsKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0hZUEVSVikgfHwgZGVmaW5lZChDT05GSUdfWEVOKQorCXNlcV9wcmludGYocCwgIiUqczogIiwgcHJlYywgIlRIUiIpOworCWZvcl9lYWNoX29ubGluZV9jcHUoaikKKwkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBpcnFfc3RhdHMoaiktPmlycV9odl9jYWxsYmFja19jb3VudCk7CisJc2VxX3ByaW50ZihwLCAiICBIeXBlcnZpc29yIGNhbGxiYWNrIGludGVycnVwdHNcbiIpOworI2VuZGlmCiAJc2VxX3ByaW50ZihwLCAiJSpzOiAlMTB1XG4iLCBwcmVjLCAiRVJSIiwgYXRvbWljX3JlYWQoJmlycV9lcnJfY291bnQpKTsKICNpZiBkZWZpbmVkKENPTkZJR19YODZfSU9fQVBJQykKIAlzZXFfcHJpbnRmKHAsICIlKnM6ICUxMHVcbiIsIHByZWMsICJNSVMiLCBhdG9taWNfcmVhZCgmaXJxX21pc19jb3VudCkpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2lycV8zMi5jIGIvYXJjaC94ODYva2VybmVsL2lycV8zMi5jCmluZGV4IGQ3ZmNiZWQuLjYzY2U4MzggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pcnFfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxXzMyLmMKQEAgLTU1LDE2ICs1NSw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfc3RhY2tfb3ZlcmZsb3codm9pZCkgeyB9CiAjZW5kaWYKIAotLyoKLSAqIHBlci1DUFUgSVJRIGhhbmRsaW5nIGNvbnRleHRzICh0aHJlYWQgaW5mb3JtYXRpb24gYW5kIHN0YWNrKQotICovCi11bmlvbiBpcnFfY3R4IHsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gICAgICB0aW5mbzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICBzdGFja1tUSFJFQURfU0laRS9zaXplb2YodTMyKV07Ci19IF9fYXR0cmlidXRlX18oKGFsaWduZWQoVEhSRUFEX1NJWkUpKSk7Ci0KLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bmlvbiBpcnFfY3R4ICosIGhhcmRpcnFfY3R4KTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bmlvbiBpcnFfY3R4ICosIHNvZnRpcnFfY3R4KTsKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBpcnFfc3RhY2sgKiwgaGFyZGlycV9zdGFjayk7CitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaXJxX3N0YWNrICosIHNvZnRpcnFfc3RhY2spOwogCiBzdGF0aWMgdm9pZCBjYWxsX29uX3N0YWNrKHZvaWQgKmZ1bmMsIHZvaWQgKnN0YWNrKQogewpAQCAtNzcsMTQgKzY5LDI2IEBACiAJCSAgICAgOiAibWVtb3J5IiwgImNjIiwgImVkeCIsICJlY3giLCAiZWF4Iik7CiB9CiAKKy8qIGhvdyB0byBnZXQgdGhlIGN1cnJlbnQgc3RhY2sgcG9pbnRlciBmcm9tIEMgKi8KKyNkZWZpbmUgY3VycmVudF9zdGFja19wb2ludGVyICh7CQlcCisJdW5zaWduZWQgbG9uZyBzcDsJCQlcCisJYXNtKCJtb3YgJSVlc3AsJTAiIDogIj1nIiAoc3ApKTsJXAorCXNwOwkJCQkJXAorfSkKKworc3RhdGljIGlubGluZSB2b2lkICpjdXJyZW50X3N0YWNrKHZvaWQpCit7CisJcmV0dXJuICh2b2lkICopKGN1cnJlbnRfc3RhY2tfcG9pbnRlciAmIH4oVEhSRUFEX1NJWkUgLSAxKSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50CiBleGVjdXRlX29uX2lycV9zdGFjayhpbnQgb3ZlcmZsb3csIHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IGlycSkKIHsKLQl1bmlvbiBpcnFfY3R4ICpjdXJjdHgsICppcnFjdHg7Ci0JdTMyICppc3AsIGFyZzEsIGFyZzI7CisJc3RydWN0IGlycV9zdGFjayAqY3Vyc3RrLCAqaXJxc3RrOworCXUzMiAqaXNwLCAqcHJldl9lc3AsIGFyZzEsIGFyZzI7CiAKLQljdXJjdHggPSAodW5pb24gaXJxX2N0eCAqKSBjdXJyZW50X3RocmVhZF9pbmZvKCk7Ci0JaXJxY3R4ID0gX190aGlzX2NwdV9yZWFkKGhhcmRpcnFfY3R4KTsKKwljdXJzdGsgPSAoc3RydWN0IGlycV9zdGFjayAqKSBjdXJyZW50X3N0YWNrKCk7CisJaXJxc3RrID0gX190aGlzX2NwdV9yZWFkKGhhcmRpcnFfc3RhY2spOwogCiAJLyoKIAkgKiB0aGlzIGlzIHdoZXJlIHdlIHN3aXRjaCB0byB0aGUgSVJRIHN0YWNrLiBIb3dldmVyLCBpZiB3ZSBhcmUKQEAgLTkyLDEzICs5NiwxNCBAQAogCSAqIGhhbmRsZXIpIHdlIGNhbid0IGRvIHRoYXQgYW5kIGp1c3QgaGF2ZSB0byBrZWVwIHVzaW5nIHRoZQogCSAqIGN1cnJlbnQgc3RhY2sgKHdoaWNoIGlzIHRoZSBpcnEgc3RhY2sgYWxyZWFkeSBhZnRlciBhbGwpCiAJICovCi0JaWYgKHVubGlrZWx5KGN1cmN0eCA9PSBpcnFjdHgpKQorCWlmICh1bmxpa2VseShjdXJzdGsgPT0gaXJxc3RrKSkKIAkJcmV0dXJuIDA7CiAKLQkvKiBidWlsZCB0aGUgc3RhY2sgZnJhbWUgb24gdGhlIElSUSBzdGFjayAqLwotCWlzcCA9ICh1MzIgKikgKChjaGFyICopaXJxY3R4ICsgc2l6ZW9mKCppcnFjdHgpKTsKLQlpcnFjdHgtPnRpbmZvLnRhc2sgPSBjdXJjdHgtPnRpbmZvLnRhc2s7Ci0JaXJxY3R4LT50aW5mby5wcmV2aW91c19lc3AgPSBjdXJyZW50X3N0YWNrX3BvaW50ZXI7CisJaXNwID0gKHUzMiAqKSAoKGNoYXIgKilpcnFzdGsgKyBzaXplb2YoKmlycXN0aykpOworCisJLyogU2F2ZSB0aGUgbmV4dCBlc3AgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2sgKi8KKwlwcmV2X2VzcCA9ICh1MzIgKilpcnFzdGs7CisJKnByZXZfZXNwID0gY3VycmVudF9zdGFja19wb2ludGVyOwogCiAJaWYgKHVubGlrZWx5KG92ZXJmbG93KSkKIAkJY2FsbF9vbl9zdGFjayhwcmludF9zdGFja19vdmVyZmxvdywgaXNwKTsKQEAgLTExOCw0NiArMTIzLDQwIEBACiAgKi8KIHZvaWQgaXJxX2N0eF9pbml0KGludCBjcHUpCiB7Ci0JdW5pb24gaXJxX2N0eCAqaXJxY3R4OworCXN0cnVjdCBpcnFfc3RhY2sgKmlycXN0azsKIAotCWlmIChwZXJfY3B1KGhhcmRpcnFfY3R4LCBjcHUpKQorCWlmIChwZXJfY3B1KGhhcmRpcnFfc3RhY2ssIGNwdSkpCiAJCXJldHVybjsKIAotCWlycWN0eCA9IHBhZ2VfYWRkcmVzcyhhbGxvY19wYWdlc19ub2RlKGNwdV90b19ub2RlKGNwdSksCisJaXJxc3RrID0gcGFnZV9hZGRyZXNzKGFsbG9jX3BhZ2VzX25vZGUoY3B1X3RvX25vZGUoY3B1KSwKIAkJCQkJICAgICAgIFRIUkVBRElORk9fR0ZQLAogCQkJCQkgICAgICAgVEhSRUFEX1NJWkVfT1JERVIpKTsKLQltZW1zZXQoJmlycWN0eC0+dGluZm8sIDAsIHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pKTsKLQlpcnFjdHgtPnRpbmZvLmNwdQkJPSBjcHU7Ci0JaXJxY3R4LT50aW5mby5hZGRyX2xpbWl0CT0gTUFLRV9NTV9TRUcoMCk7CisJcGVyX2NwdShoYXJkaXJxX3N0YWNrLCBjcHUpID0gaXJxc3RrOwogCi0JcGVyX2NwdShoYXJkaXJxX2N0eCwgY3B1KSA9IGlycWN0eDsKLQotCWlycWN0eCA9IHBhZ2VfYWRkcmVzcyhhbGxvY19wYWdlc19ub2RlKGNwdV90b19ub2RlKGNwdSksCisJaXJxc3RrID0gcGFnZV9hZGRyZXNzKGFsbG9jX3BhZ2VzX25vZGUoY3B1X3RvX25vZGUoY3B1KSwKIAkJCQkJICAgICAgIFRIUkVBRElORk9fR0ZQLAogCQkJCQkgICAgICAgVEhSRUFEX1NJWkVfT1JERVIpKTsKLQltZW1zZXQoJmlycWN0eC0+dGluZm8sIDAsIHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pKTsKLQlpcnFjdHgtPnRpbmZvLmNwdQkJPSBjcHU7Ci0JaXJxY3R4LT50aW5mby5hZGRyX2xpbWl0CT0gTUFLRV9NTV9TRUcoMCk7Ci0KLQlwZXJfY3B1KHNvZnRpcnFfY3R4LCBjcHUpID0gaXJxY3R4OworCXBlcl9jcHUoc29mdGlycV9zdGFjaywgY3B1KSA9IGlycXN0azsKIAogCXByaW50ayhLRVJOX0RFQlVHICJDUFUgJXUgaXJxc3RhY2tzLCBoYXJkPSVwIHNvZnQ9JXBcbiIsCi0JICAgICAgIGNwdSwgcGVyX2NwdShoYXJkaXJxX2N0eCwgY3B1KSwgIHBlcl9jcHUoc29mdGlycV9jdHgsIGNwdSkpOworCSAgICAgICBjcHUsIHBlcl9jcHUoaGFyZGlycV9zdGFjaywgY3B1KSwgIHBlcl9jcHUoc29mdGlycV9zdGFjaywgY3B1KSk7CiB9CiAKIHZvaWQgZG9fc29mdGlycV9vd25fc3RhY2sodm9pZCkKIHsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKmN1cmN0eDsKLQl1bmlvbiBpcnFfY3R4ICppcnFjdHg7Ci0JdTMyICppc3A7CisJc3RydWN0IHRocmVhZF9pbmZvICpjdXJzdGs7CisJc3RydWN0IGlycV9zdGFjayAqaXJxc3RrOworCXUzMiAqaXNwLCAqcHJldl9lc3A7CiAKLQljdXJjdHggPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7Ci0JaXJxY3R4ID0gX190aGlzX2NwdV9yZWFkKHNvZnRpcnFfY3R4KTsKLQlpcnFjdHgtPnRpbmZvLnRhc2sgPSBjdXJjdHgtPnRhc2s7Ci0JaXJxY3R4LT50aW5mby5wcmV2aW91c19lc3AgPSBjdXJyZW50X3N0YWNrX3BvaW50ZXI7CisJY3Vyc3RrID0gY3VycmVudF9zdGFjaygpOworCWlycXN0ayA9IF9fdGhpc19jcHVfcmVhZChzb2Z0aXJxX3N0YWNrKTsKIAogCS8qIGJ1aWxkIHRoZSBzdGFjayBmcmFtZSBvbiB0aGUgc29mdGlycSBzdGFjayAqLwotCWlzcCA9ICh1MzIgKikgKChjaGFyICopaXJxY3R4ICsgc2l6ZW9mKCppcnFjdHgpKTsKKwlpc3AgPSAodTMyICopICgoY2hhciAqKWlycXN0ayArIHNpemVvZigqaXJxc3RrKSk7CisKKwkvKiBQdXNoIHRoZSBwcmV2aW91cyBlc3Agb250byB0aGUgc3RhY2sgKi8KKwlwcmV2X2VzcCA9ICh1MzIgKilpcnFzdGs7CisJKnByZXZfZXNwID0gY3VycmVudF9zdGFja19wb2ludGVyOwogCiAJY2FsbF9vbl9zdGFjayhfX2RvX3NvZnRpcnEsIGlzcCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYwppbmRleCAwZGU0M2U5Li43YmM4NmJiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKQEAgLTMxNCw2ICszMTQsMTAgQEAKIAkgKi8KIAlhcmNoX2VuZF9jb250ZXh0X3N3aXRjaChuZXh0X3ApOwogCisJdGhpc19jcHVfd3JpdGUoa2VybmVsX3N0YWNrLAorCQkgICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShuZXh0X3ApICsKKwkJICBUSFJFQURfU0laRSAtIEtFUk5FTF9TVEFDS19PRkZTRVQpOworCiAJLyoKIAkgKiBSZXN0b3JlICVncyBpZiBuZWVkZWQgKHdoaWNoIGlzIGNvbW1vbikKIAkgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gveDg2L2tlcm5lbC9wdHJhY2UuYwppbmRleCA3NDYxZjUwLi42NzhjMGFkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jCkBAIC0xODQsMTQgKzE4NCwxNCBAQAogewogCXVuc2lnbmVkIGxvbmcgY29udGV4dCA9ICh1bnNpZ25lZCBsb25nKXJlZ3MgJiB+KFRIUkVBRF9TSVpFIC0gMSk7CiAJdW5zaWduZWQgbG9uZyBzcCA9ICh1bnNpZ25lZCBsb25nKSZyZWdzLT5zcDsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpbmZvOworCXUzMiAqcHJldl9lc3A7CiAKIAlpZiAoY29udGV4dCA9PSAoc3AgJiB+KFRIUkVBRF9TSVpFIC0gMSkpKQogCQlyZXR1cm4gc3A7CiAKLQl0aW5mbyA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKiljb250ZXh0OwotCWlmICh0aW5mby0+cHJldmlvdXNfZXNwKQotCQlyZXR1cm4gdGluZm8tPnByZXZpb3VzX2VzcDsKKwlwcmV2X2VzcCA9ICh1MzIgKikoY29udGV4dCk7CisJaWYgKHByZXZfZXNwKQorCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcHJldl9lc3A7CiAKIAlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcmVnczsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYyBiL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYwppbmRleCBjNzUyY2I0Li42NTRiNDY1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCkBAIC00NjQsOSArNDY0LDEyIEBACiAgKiAyKSBJZiBzdGlsbCBhbGl2ZSwgd3JpdGUgdG8gdGhlIGtleWJvYXJkIGNvbnRyb2xsZXIKICAqIDMpIElmIHN0aWxsIGFsaXZlLCB3cml0ZSB0byB0aGUgQUNQSSByZWJvb3QgcmVnaXN0ZXIgYWdhaW4KICAqIDQpIElmIHN0aWxsIGFsaXZlLCB3cml0ZSB0byB0aGUga2V5Ym9hcmQgY29udHJvbGxlciBhZ2FpbgorICogNSkgSWYgc3RpbGwgYWxpdmUsIGNhbGwgdGhlIEVGSSBydW50aW1lIHNlcnZpY2UgdG8gcmVib290CisgKiA2KSBJZiBzdGlsbCBhbGl2ZSwgd3JpdGUgdG8gdGhlIFBDSSBJTyBwb3J0IDB4Q0Y5IHRvIHJlYm9vdAorICogNykgSWYgc3RpbGwgYWxpdmUsIGluZm9ybSBCSU9TIHRvIGRvIGEgcHJvcGVyIHJlYm9vdAogICoKICAqIElmIHRoZSBtYWNoaW5lIGlzIHN0aWxsIGFsaXZlIGF0IHRoaXMgc3RhZ2UsIGl0IGdpdmVzIHVwLiBXZSBkZWZhdWx0IHRvCi0gKiBmb2xsb3dpbmcgdGhlIHNhbWUgcGF0dGVybiwgZXhjZXB0IHRoYXQgaWYgd2UncmUgc3RpbGwgYWxpdmUgYWZ0ZXIgKDQpIHdlJ2xsCisgKiBmb2xsb3dpbmcgdGhlIHNhbWUgcGF0dGVybiwgZXhjZXB0IHRoYXQgaWYgd2UncmUgc3RpbGwgYWxpdmUgYWZ0ZXIgKDcpIHdlJ2xsCiAgKiB0cnkgdG8gZm9yY2UgYSB0cmlwbGUgZmF1bHQgYW5kIHRoZW4gY3ljbGUgYmV0d2VlbiBoaXR0aW5nIHRoZSBrZXlib2FyZAogICogY29udHJvbGxlciBhbmQgZG9pbmcgdGhhdAogICovCkBAIC01MDIsNyArNTA1LDcgQEAKIAkJCQlhdHRlbXB0ID0gMTsKIAkJCQlyZWJvb3RfdHlwZSA9IEJPT1RfQUNQSTsKIAkJCX0gZWxzZSB7Ci0JCQkJcmVib290X3R5cGUgPSBCT09UX1RSSVBMRTsKKwkJCQlyZWJvb3RfdHlwZSA9IEJPT1RfRUZJOwogCQkJfQogCQkJYnJlYWs7CiAKQEAgLTUxMCwxMyArNTEzLDE1IEBACiAJCQlsb2FkX2lkdCgmbm9faWR0KTsKIAkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJpbnQzIik7CiAKKwkJCS8qIFdlJ3JlIHByb2JhYmx5IGRlYWQgYWZ0ZXIgdGhpcywgYnV0Li4uICovCiAJCQlyZWJvb3RfdHlwZSA9IEJPT1RfS0JEOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBCT09UX0JJT1M6CiAJCQltYWNoaW5lX3JlYWxfcmVzdGFydChNUlJfQklPUyk7CiAKLQkJCXJlYm9vdF90eXBlID0gQk9PVF9LQkQ7CisJCQkvKiBXZSdyZSBwcm9iYWJseSBkZWFkIGFmdGVyIHRoaXMsIGJ1dC4uLiAqLworCQkJcmVib290X3R5cGUgPSBCT09UX1RSSVBMRTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQk9PVF9BQ1BJOgpAQCAtNTMwLDcgKzUzNSw3IEBACiAJCQkJCQkgRUZJX1JFU0VUX1dBUk0gOgogCQkJCQkJIEVGSV9SRVNFVF9DT0xELAogCQkJCQkJIEVGSV9TVUNDRVNTLCAwLCBOVUxMKTsKLQkJCXJlYm9vdF90eXBlID0gQk9PVF9LQkQ7CisJCQlyZWJvb3RfdHlwZSA9IEJPT1RfQ0Y5X0NPTkQ7CiAJCQlicmVhazsKIAogCQljYXNlIEJPT1RfQ0Y5OgpAQCAtNTQ4LDcgKzU1Myw3IEBACiAJCQkJb3V0YihjZjl8cmVib290X2NvZGUsIDB4Y2Y5KTsKIAkJCQl1ZGVsYXkoNTApOwogCQkJfQotCQkJcmVib290X3R5cGUgPSBCT09UX0tCRDsKKwkJCXJlYm9vdF90eXBlID0gQk9PVF9CSU9TOwogCQkJYnJlYWs7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCmluZGV4IGZhNTExYWMuLjA5Yzc2ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCkBAIC04NjksNyArODY5LDYgQEAKIAogI2lmZGVmIENPTkZJR19YODZfMzIKIAltZW1jcHkoJmJvb3RfY3B1X2RhdGEsICZuZXdfY3B1X2RhdGEsIHNpemVvZihuZXdfY3B1X2RhdGEpKTsKLQl2aXN3c19lYXJseV9kZXRlY3QoKTsKIAogCS8qCiAJICogY29weSBrZXJuZWwgYWRkcmVzcyByYW5nZSBlc3RhYmxpc2hlZCBzbyBmYXIgYW5kIHN3aXRjaApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYyBiL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKaW5kZXggNjAxNzllYy4uMzQ4MjY5MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCkBAIC03NjYsMTAgKzc2NiwxMCBAQAogI2Vsc2UKIAljbGVhcl90c2tfdGhyZWFkX2ZsYWcoaWRsZSwgVElGX0ZPUkspOwogCWluaXRpYWxfZ3MgPSBwZXJfY3B1X29mZnNldChjcHUpOworI2VuZGlmCiAJcGVyX2NwdShrZXJuZWxfc3RhY2ssIGNwdSkgPQogCQkodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UoaWRsZSkgLQogCQlLRVJORUxfU1RBQ0tfT0ZGU0VUICsgVEhSRUFEX1NJWkU7Ci0jZW5kaWYKIAllYXJseV9nZHRfZGVzY3IuYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKWdldF9jcHVfZ2R0X3RhYmxlKGNwdSk7CiAJaW5pdGlhbF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpc3RhcnRfc2Vjb25kYXJ5OwogCXN0YWNrX3N0YXJ0ICA9IGlkbGUtPnRocmVhZC5zcDsKQEAgLTEzODcsNyArMTM4Nyw3IEBACiAKIAlpZiAoIXRoaXNfY3B1X2hhcyhYODZfRkVBVFVSRV9NV0FJVCkpCiAJCXJldHVybjsKLQlpZiAoIXRoaXNfY3B1X2hhcyhYODZfRkVBVFVSRV9DTEZMU0gpKQorCWlmICghdGhpc19jcHVfaGFzKFg4Nl9GRUFUVVJFX0NMRkxVU0gpKQogCQlyZXR1cm47CiAJaWYgKF9fdGhpc19jcHVfcmVhZChjcHVfaW5mby5jcHVpZF9sZXZlbCkgPCBDUFVJRF9NV0FJVF9MRUFGKQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdGltZS5jIGIvYXJjaC94ODYva2VybmVsL3RpbWUuYwppbmRleCA2ZWM5MWMwLi5iZjdlZjVjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC90aW1lLmMKQEAgLTYyLDcgKzYyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxMCAgPSB7CiAJLmhhbmRsZXIgPSB0aW1lcl9pbnRlcnJ1cHQsCi0JLmZsYWdzID0gSVJRRl9ESVNBQkxFRCB8IElSUUZfTk9CQUxBTkNJTkcgfCBJUlFGX0lSUVBPTEwgfCBJUlFGX1RJTUVSLAorCS5mbGFncyA9IElSUUZfTk9CQUxBTkNJTkcgfCBJUlFGX0lSUVBPTEwgfCBJUlFGX1RJTUVSLAogCS5uYW1lID0gInRpbWVyIgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3RzYy5jIGIvYXJjaC94ODYva2VybmVsL3RzYy5jCmluZGV4IGNmYmU5OWYuLjU3ZTVjZTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90c2MuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdHNjLmMKQEAgLTkxNCw4ICs5MTQsNyBAQAogCQl0c2Nfa2h6X3JlZiA9IHRzY19raHo7CiAJfQogCWlmICgodmFsID09IENQVUZSRVFfUFJFQ0hBTkdFICAmJiBmcmVxLT5vbGQgPCBmcmVxLT5uZXcpIHx8Ci0JCQkodmFsID09IENQVUZSRVFfUE9TVENIQU5HRSAmJiBmcmVxLT5vbGQgPiBmcmVxLT5uZXcpIHx8Ci0JCQkodmFsID09IENQVUZSRVFfUkVTVU1FQ0hBTkdFKSkgeworCQkJKHZhbCA9PSBDUFVGUkVRX1BPU1RDSEFOR0UgJiYgZnJlcS0+b2xkID4gZnJlcS0+bmV3KSkgewogCQkqbHBqID0gY3B1ZnJlcV9zY2FsZShsb29wc19wZXJfamlmZnlfcmVmLCByZWZfZnJlcSwgZnJlcS0+bmV3KTsKIAogCQl0c2Nfa2h6ID0gY3B1ZnJlcV9zY2FsZSh0c2Nfa2h6X3JlZiwgcmVmX2ZyZXEsIGZyZXEtPm5ldyk7CkBAIC05ODUsOSArOTg0LDcgQEAKIAkubWFzayAgICAgICAgICAgICAgICAgICA9IENMT0NLU09VUkNFX01BU0soNjQpLAogCS5mbGFncyAgICAgICAgICAgICAgICAgID0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMgfAogCQkJCSAgQ0xPQ0tfU09VUkNFX01VU1RfVkVSSUZZLAotI2lmZGVmIENPTkZJR19YODZfNjQKIAkuYXJjaGRhdGEgICAgICAgICAgICAgICA9IHsgLnZjbG9ja19tb2RlID0gVkNMT0NLX1RTQyB9LAotI2VuZGlmCiB9OwogCiB2b2lkIG1hcmtfdHNjX3Vuc3RhYmxlKGNoYXIgKnJlYXNvbikKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC94ODYva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggZGE2YjM1YS4uNDllZGYyZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC94ODYva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTE0Nyw3ICsxNDcsNiBAQAogCQlfZWRhdGEgPSAuOwogCX0gOmRhdGEKIAotI2lmZGVmIENPTkZJR19YODZfNjQKIAogCS4gPSBBTElHTihQQUdFX1NJWkUpOwogCV9fdnZhcl9wYWdlID0gLjsKQEAgLTE2NSwxMiArMTY0LDE1IEBACiAjdW5kZWYgX19WVkFSX0tFUk5FTF9MRFMKICN1bmRlZiBFTUlUX1ZWQVIKIAorCQkvKgorCQkgKiBQYWQgdGhlIHJlc3Qgb2YgdGhlIHBhZ2Ugd2l0aCB6ZXJvcy4gIE90aGVyd2lzZSB0aGUgbG9hZGVyCisJCSAqIGNhbiBsZWF2ZSBnYXJiYWdlIGhlcmUuCisJCSAqLworCQkuID0gX192dmFyX2JlZ2lubmluZ19oYWNrICsgUEFHRV9TSVpFOwogCX0gOmRhdGEKIAogICAgICAgIC4gPSBBTElHTihfX3Z2YXJfcGFnZSArIFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKIAotI2VuZGlmIC8qIENPTkZJR19YODZfNjQgKi8KLQogCS8qIEluaXQgY29kZSBhbmQgZGF0YSAtIHdpbGwgYmUgZnJlZWQgYWZ0ZXIgaW5pdCAqLwogCS4gPSBBTElHTihQQUdFX1NJWkUpOwogCS5pbml0LmJlZ2luIDogQVQoQUREUiguaW5pdC5iZWdpbikgLSBMT0FEX09GRlNFVCkgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZzeXNjYWxsXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYwppbmRleCAxZjk2ZjkzLi45ZWEyODc2NiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3ZzeXNjYWxsXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3ZzeXNjYWxsXzY0LmMKQEAgLTQ3LDE0ICs0NywxMiBAQAogI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vdG9wb2xvZ3kuaD4KLSNpbmNsdWRlIDxhc20vdmd0b2QuaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KIAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSAidnN5c2NhbGxfdHJhY2UuaCIKIAogREVGSU5FX1ZWQVIoaW50LCB2Z2V0Y3B1X21vZGUpOwotREVGSU5FX1ZWQVIoc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YSwgdnN5c2NhbGxfZ3RvZF9kYXRhKTsKIAogc3RhdGljIGVudW0geyBFTVVMQVRFLCBOQVRJVkUsIE5PTkUgfSB2c3lzY2FsbF9tb2RlID0gRU1VTEFURTsKIApAQCAtNzcsNDggKzc1LDYgQEAKIH0KIGVhcmx5X3BhcmFtKCJ2c3lzY2FsbCIsIHZzeXNjYWxsX3NldHVwKTsKIAotdm9pZCB1cGRhdGVfdnN5c2NhbGxfdHoodm9pZCkKLXsKLQl2c3lzY2FsbF9ndG9kX2RhdGEuc3lzX3R6ID0gc3lzX3R6OwotfQotCi12b2lkIHVwZGF0ZV92c3lzY2FsbChzdHJ1Y3QgdGltZWtlZXBlciAqdGspCi17Ci0Jc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YSAqdmRhdGEgPSAmdnN5c2NhbGxfZ3RvZF9kYXRhOwotCi0Jd3JpdGVfc2VxY291bnRfYmVnaW4oJnZkYXRhLT5zZXEpOwotCi0JLyogY29weSB2c3lzY2FsbCBkYXRhICovCi0JdmRhdGEtPmNsb2NrLnZjbG9ja19tb2RlCT0gdGstPmNsb2NrLT5hcmNoZGF0YS52Y2xvY2tfbW9kZTsKLQl2ZGF0YS0+Y2xvY2suY3ljbGVfbGFzdAkJPSB0ay0+Y2xvY2stPmN5Y2xlX2xhc3Q7Ci0JdmRhdGEtPmNsb2NrLm1hc2sJCT0gdGstPmNsb2NrLT5tYXNrOwotCXZkYXRhLT5jbG9jay5tdWx0CQk9IHRrLT5tdWx0OwotCXZkYXRhLT5jbG9jay5zaGlmdAkJPSB0ay0+c2hpZnQ7Ci0KLQl2ZGF0YS0+d2FsbF90aW1lX3NlYwkJPSB0ay0+eHRpbWVfc2VjOwotCXZkYXRhLT53YWxsX3RpbWVfc25zZWMJCT0gdGstPnh0aW1lX25zZWM7Ci0KLQl2ZGF0YS0+bW9ub3RvbmljX3RpbWVfc2VjCT0gdGstPnh0aW1lX3NlYwotCQkJCQkrIHRrLT53YWxsX3RvX21vbm90b25pYy50dl9zZWM7Ci0JdmRhdGEtPm1vbm90b25pY190aW1lX3Nuc2VjCT0gdGstPnh0aW1lX25zZWMKLQkJCQkJKyAodGstPndhbGxfdG9fbW9ub3RvbmljLnR2X25zZWMKLQkJCQkJCTw8IHRrLT5zaGlmdCk7Ci0Jd2hpbGUgKHZkYXRhLT5tb25vdG9uaWNfdGltZV9zbnNlYyA+PQotCQkJCQkoKCh1NjQpTlNFQ19QRVJfU0VDKSA8PCB0ay0+c2hpZnQpKSB7Ci0JCXZkYXRhLT5tb25vdG9uaWNfdGltZV9zbnNlYyAtPQotCQkJCQkoKHU2NClOU0VDX1BFUl9TRUMpIDw8IHRrLT5zaGlmdDsKLQkJdmRhdGEtPm1vbm90b25pY190aW1lX3NlYysrOwotCX0KLQotCXZkYXRhLT53YWxsX3RpbWVfY29hcnNlLnR2X3NlYwk9IHRrLT54dGltZV9zZWM7Ci0JdmRhdGEtPndhbGxfdGltZV9jb2Fyc2UudHZfbnNlYwk9IChsb25nKSh0ay0+eHRpbWVfbnNlYyA+PiB0ay0+c2hpZnQpOwotCi0JdmRhdGEtPm1vbm90b25pY190aW1lX2NvYXJzZQk9IHRpbWVzcGVjX2FkZCh2ZGF0YS0+d2FsbF90aW1lX2NvYXJzZSwKLQkJCQkJCQl0ay0+d2FsbF90b19tb25vdG9uaWMpOwotCi0Jd3JpdGVfc2VxY291bnRfZW5kKCZ2ZGF0YS0+c2VxKTsKLX0KLQogc3RhdGljIHZvaWQgd2Fybl9iYWRfdnN5c2NhbGwoY29uc3QgY2hhciAqbGV2ZWwsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAogCQkJICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSkKIHsKQEAgLTM3NCw3ICszMzAsNiBAQAogewogCWV4dGVybiBjaGFyIF9fdnN5c2NhbGxfcGFnZTsKIAl1bnNpZ25lZCBsb25nIHBoeXNhZGRyX3ZzeXNjYWxsID0gX19wYV9zeW1ib2woJl9fdnN5c2NhbGxfcGFnZSk7Ci0JZXh0ZXJuIGNoYXIgX192dmFyX3BhZ2U7CiAJdW5zaWduZWQgbG9uZyBwaHlzYWRkcl92dmFyX3BhZ2UgPSBfX3BhX3N5bWJvbCgmX192dmFyX3BhZ2UpOwogCiAJX19zZXRfZml4bWFwKFZTWVNDQUxMX0ZJUlNUX1BBR0UsIHBoeXNhZGRyX3ZzeXNjYWxsLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZzeXNjYWxsX2d0b2QuYyBiL2FyY2gveDg2L2tlcm5lbC92c3lzY2FsbF9ndG9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljNmU1NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2tlcm5lbC92c3lzY2FsbF9ndG9kLmMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgQW5kcmVhIEFyY2FuZ2VsaSA8YW5kcmVhQHN1c2UuZGU+IFN1U0UKKyAqICBDb3B5cmlnaHQgMjAwMyBBbmRpIEtsZWVuLCBTdVNFIExhYnMuCisgKgorICogIE1vZGlmaWVkIGZvciB4ODYgMzIgYml0IGFyY2hpdGVjdHVyZSBieQorICogIFN0ZWZhbmkgU2VpYm9sZCA8c3RlZmFuaUBzZWlib2xkLm5ldD4KKyAqICBzcG9uc29yZWQgYnkgUm9oZGUgJiBTY2h3YXJ6IEdtYkggJiBDby4gS0cgTXVuaWNoL0dlcm1hbnkKKyAqCisgKiAgVGhhbmtzIHRvIGhwYUB0cmFuc21ldGEuY29tIGZvciBzb21lIHVzZWZ1bCBoaW50LgorICogIFNwZWNpYWwgdGhhbmtzIHRvIEluZ28gTW9sbmFyIGZvciBoaXMgZWFybHkgZXhwZXJpZW5jZSB3aXRoCisgKiAgYSBkaWZmZXJlbnQgdnN5c2NhbGwgaW1wbGVtZW50YXRpb24gZm9yIExpbnV4L0lBMzIgYW5kIGZvciB0aGUgbmFtZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RpbWVrZWVwZXJfaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxhc20vdmd0b2QuaD4KKyNpbmNsdWRlIDxhc20vdnZhci5oPgorCitERUZJTkVfVlZBUihzdHJ1Y3QgdnN5c2NhbGxfZ3RvZF9kYXRhLCB2c3lzY2FsbF9ndG9kX2RhdGEpOworCit2b2lkIHVwZGF0ZV92c3lzY2FsbF90eih2b2lkKQoreworCXZzeXNjYWxsX2d0b2RfZGF0YS50el9taW51dGVzd2VzdCA9IHN5c190ei50el9taW51dGVzd2VzdDsKKwl2c3lzY2FsbF9ndG9kX2RhdGEudHpfZHN0dGltZSA9IHN5c190ei50el9kc3R0aW1lOworfQorCit2b2lkIHVwZGF0ZV92c3lzY2FsbChzdHJ1Y3QgdGltZWtlZXBlciAqdGspCit7CisJc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YSAqdmRhdGEgPSAmdnN5c2NhbGxfZ3RvZF9kYXRhOworCisJZ3RvZF93cml0ZV9iZWdpbih2ZGF0YSk7CisKKwkvKiBjb3B5IHZzeXNjYWxsIGRhdGEgKi8KKwl2ZGF0YS0+dmNsb2NrX21vZGUJPSB0ay0+Y2xvY2stPmFyY2hkYXRhLnZjbG9ja19tb2RlOworCXZkYXRhLT5jeWNsZV9sYXN0CT0gdGstPmNsb2NrLT5jeWNsZV9sYXN0OworCXZkYXRhLT5tYXNrCQk9IHRrLT5jbG9jay0+bWFzazsKKwl2ZGF0YS0+bXVsdAkJPSB0ay0+bXVsdDsKKwl2ZGF0YS0+c2hpZnQJCT0gdGstPnNoaWZ0OworCisJdmRhdGEtPndhbGxfdGltZV9zZWMJCT0gdGstPnh0aW1lX3NlYzsKKwl2ZGF0YS0+d2FsbF90aW1lX3Nuc2VjCQk9IHRrLT54dGltZV9uc2VjOworCisJdmRhdGEtPm1vbm90b25pY190aW1lX3NlYwk9IHRrLT54dGltZV9zZWMKKwkJCQkJKyB0ay0+d2FsbF90b19tb25vdG9uaWMudHZfc2VjOworCXZkYXRhLT5tb25vdG9uaWNfdGltZV9zbnNlYwk9IHRrLT54dGltZV9uc2VjCisJCQkJCSsgKHRrLT53YWxsX3RvX21vbm90b25pYy50dl9uc2VjCisJCQkJCQk8PCB0ay0+c2hpZnQpOworCXdoaWxlICh2ZGF0YS0+bW9ub3RvbmljX3RpbWVfc25zZWMgPj0KKwkJCQkJKCgodTY0KU5TRUNfUEVSX1NFQykgPDwgdGstPnNoaWZ0KSkgeworCQl2ZGF0YS0+bW9ub3RvbmljX3RpbWVfc25zZWMgLT0KKwkJCQkJKCh1NjQpTlNFQ19QRVJfU0VDKSA8PCB0ay0+c2hpZnQ7CisJCXZkYXRhLT5tb25vdG9uaWNfdGltZV9zZWMrKzsKKwl9CisKKwl2ZGF0YS0+d2FsbF90aW1lX2NvYXJzZV9zZWMJPSB0ay0+eHRpbWVfc2VjOworCXZkYXRhLT53YWxsX3RpbWVfY29hcnNlX25zZWMJPSAobG9uZykodGstPnh0aW1lX25zZWMgPj4gdGstPnNoaWZ0KTsKKworCXZkYXRhLT5tb25vdG9uaWNfdGltZV9jb2Fyc2Vfc2VjID0KKwkJdmRhdGEtPndhbGxfdGltZV9jb2Fyc2Vfc2VjICsgdGstPndhbGxfdG9fbW9ub3RvbmljLnR2X3NlYzsKKwl2ZGF0YS0+bW9ub3RvbmljX3RpbWVfY29hcnNlX25zZWMgPQorCQl2ZGF0YS0+d2FsbF90aW1lX2NvYXJzZV9uc2VjICsgdGstPndhbGxfdG9fbW9ub3RvbmljLnR2X25zZWM7CisKKwl3aGlsZSAodmRhdGEtPm1vbm90b25pY190aW1lX2NvYXJzZV9uc2VjID49IE5TRUNfUEVSX1NFQykgeworCQl2ZGF0YS0+bW9ub3RvbmljX3RpbWVfY29hcnNlX25zZWMgLT0gTlNFQ19QRVJfU0VDOworCQl2ZGF0YS0+bW9ub3RvbmljX3RpbWVfY29hcnNlX3NlYysrOworCX0KKworCWd0b2Rfd3JpdGVfZW5kKHZkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9jcHVpZC5jIGIvYXJjaC94ODYva3ZtL2NwdWlkLmMKaW5kZXggYzY5NzYyNS4uZTU1MDNkOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2NwdWlkLmMKKysrIGIvYXJjaC94ODYva3ZtL2NwdWlkLmMKQEAgLTI2Myw3ICsyNjMsNyBAQAogCQlGKFRTQykgfCBGKE1TUikgfCBGKFBBRSkgfCBGKE1DRSkgfAogCQlGKENYOCkgfCBGKEFQSUMpIHwgMCAvKiBSZXNlcnZlZCAqLyB8IEYoU0VQKSB8CiAJCUYoTVRSUikgfCBGKFBHRSkgfCBGKE1DQSkgfCBGKENNT1YpIHwKLQkJRihQQVQpIHwgRihQU0UzNikgfCAwIC8qIFBTTiAqLyB8IEYoQ0xGTFNIKSB8CisJCUYoUEFUKSB8IEYoUFNFMzYpIHwgMCAvKiBQU04gKi8gfCBGKENMRkxVU0gpIHwKIAkJMCAvKiBSZXNlcnZlZCwgRFMsIEFDUEkgKi8gfCBGKE1NWCkgfAogCQlGKEZYU1IpIHwgRihYTU0pIHwgRihYTU0yKSB8IEYoU0VMRlNOT09QKSB8CiAJCTAgLyogSFRULCBUTSwgUmVzZXJ2ZWQsIFBCRSAqLzsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL251bWEuYyBiL2FyY2gveDg2L21tL251bWEuYwppbmRleCAyN2FhMDQ1NS4uMWQwNDVmOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vbnVtYS5jCisrKyBiL2FyY2gveDg2L21tL251bWEuYwpAQCAtNjg3LDEwICs2ODcsNiBAQAogdm9pZCBfX2luaXQgeDg2X251bWFfaW5pdCh2b2lkKQogewogCWlmICghbnVtYV9vZmYpIHsKLSNpZmRlZiBDT05GSUdfWDg2X05VTUFRCi0JCWlmICghbnVtYV9pbml0KG51bWFxX251bWFfaW5pdCkpCi0JCQlyZXR1cm47Ci0jZW5kaWYKICNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCiAJCWlmICghbnVtYV9pbml0KHg4Nl9hY3BpX251bWFfaW5pdCkpCiAJCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9zcmF0LmMgYi9hcmNoL3g4Ni9tbS9zcmF0LmMKaW5kZXggMTk1M2U5Yy4uNjYzMzhhNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vc3JhdC5jCisrKyBiL2FyY2gveDg2L21tL3NyYXQuYwpAQCAtNTIsMTIgKzUyLDE4IEBACiAJaW50IGksIGo7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2xpdC0+bG9jYWxpdHlfY291bnQ7IGkrKykgewotCQlpZiAocHhtX3RvX25vZGUoaSkgPT0gTlVNQV9OT19OT0RFKQorCQljb25zdCBpbnQgZnJvbV9ub2RlID0gcHhtX3RvX25vZGUoaSk7CisKKwkJaWYgKGZyb21fbm9kZSA9PSBOVU1BX05PX05PREUpCiAJCQljb250aW51ZTsKKwogCQlmb3IgKGogPSAwOyBqIDwgc2xpdC0+bG9jYWxpdHlfY291bnQ7IGorKykgewotCQkJaWYgKHB4bV90b19ub2RlKGopID09IE5VTUFfTk9fTk9ERSkKKwkJCWNvbnN0IGludCB0b19ub2RlID0gcHhtX3RvX25vZGUoaik7CisKKwkJCWlmICh0b19ub2RlID09IE5VTUFfTk9fTk9ERSkKIAkJCQljb250aW51ZTsKLQkJCW51bWFfc2V0X2Rpc3RhbmNlKHB4bV90b19ub2RlKGkpLCBweG1fdG9fbm9kZShqKSwKKworCQkJbnVtYV9zZXRfZGlzdGFuY2UoZnJvbV9ub2RlLCB0b19ub2RlLAogCQkJCXNsaXQtPmVudHJ5W3NsaXQtPmxvY2FsaXR5X2NvdW50ICogaSArIGpdKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9NYWtlZmlsZSBiL2FyY2gveDg2L3BjaS9NYWtlZmlsZQppbmRleCBlMDYzZWVkLi41YzZmYzM1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvcGNpL01ha2VmaWxlCkBAIC0xMyw5ICsxMyw2IEBACiAKIG9iai0kKENPTkZJR19TVEEyWDExKSAgICAgICAgICAgKz0gc3RhMngxMS1maXh1cC5vCiAKLW9iai0kKENPTkZJR19YODZfVklTV1MpCQkrPSB2aXN3cy5vCi0KLW9iai0kKENPTkZJR19YODZfTlVNQVEpCQkrPSBudW1hcV8zMi5vCiBvYmotJChDT05GSUdfWDg2X05VTUFDSElQKQkrPSBudW1hY2hpcC5vCiAKIG9iai0kKENPTkZJR19YODZfSU5URUxfTUlEKQkrPSBpbnRlbF9taWRfcGNpLm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9hY3BpLmMgYi9hcmNoL3g4Ni9wY2kvYWNwaS5jCmluZGV4IDRmMjVlYzAuLjAxZWRhYzYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9hY3BpLmMKKysrIGIvYXJjaC94ODYvcGNpL2FjcGkuYwpAQCAtMjE4LDkgKzIxOCw4IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGFjcGlfc3RhdHVzCi1yZXNvdXJjZV90b19hZGRyKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKLQkJCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCAqYWRkcikKK3N0YXRpYyBhY3BpX3N0YXR1cyByZXNvdXJjZV90b19hZGRyKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKKwkJCQkgICAgc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0ICphZGRyKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW1vcnkyNCAqbWVtb3J5MjQ7CkBAIC0yNjUsOCArMjY0LDcgQEAKIAlyZXR1cm4gQUVfRVJST1I7CiB9CiAKLXN0YXRpYyBhY3BpX3N0YXR1cwotY291bnRfcmVzb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2UgKmFjcGlfcmVzLCB2b2lkICpkYXRhKQorc3RhdGljIGFjcGlfc3RhdHVzIGNvdW50X3Jlc291cmNlKHN0cnVjdCBhY3BpX3Jlc291cmNlICphY3BpX3Jlcywgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbyA9IGRhdGE7CiAJc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0IGFkZHI7CkBAIC0yNzgsOCArMjc2LDcgQEAKIAlyZXR1cm4gQUVfT0s7CiB9CiAKLXN0YXRpYyBhY3BpX3N0YXR1cwotc2V0dXBfcmVzb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2UgKmFjcGlfcmVzLCB2b2lkICpkYXRhKQorc3RhdGljIGFjcGlfc3RhdHVzIHNldHVwX3Jlc291cmNlKHN0cnVjdCBhY3BpX3Jlc291cmNlICphY3BpX3Jlcywgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbyA9IGRhdGE7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CkBAIC00MzUsOSArNDMyLDkgQEAKIAlfX3JlbGVhc2VfcGNpX3Jvb3RfaW5mbyhpbmZvKTsKIH0KIAotc3RhdGljIHZvaWQKLXByb2JlX3BjaV9yb290X2luZm8oc3RydWN0IHBjaV9yb290X2luZm8gKmluZm8sIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAotCQkgICAgaW50IGJ1c251bSwgaW50IGRvbWFpbikKK3N0YXRpYyB2b2lkIHByb2JlX3BjaV9yb290X2luZm8oc3RydWN0IHBjaV9yb290X2luZm8gKmluZm8sCisJCQkJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsCisJCQkJaW50IGJ1c251bSwgaW50IGRvbWFpbikKIHsKIAlzaXplX3Qgc2l6ZTsKIApAQCAtNDczLDE2ICs0NzAsMTMgQEAKIHN0cnVjdCBwY2lfYnVzICpwY2lfYWNwaV9zY2FuX3Jvb3Qoc3RydWN0IGFjcGlfcGNpX3Jvb3QgKnJvb3QpCiB7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSByb290LT5kZXZpY2U7Ci0Jc3RydWN0IHBjaV9yb290X2luZm8gKmluZm8gPSBOVUxMOworCXN0cnVjdCBwY2lfcm9vdF9pbmZvICppbmZvOwogCWludCBkb21haW4gPSByb290LT5zZWdtZW50OwogCWludCBidXNudW0gPSByb290LT5zZWNvbmRhcnkuc3RhcnQ7CiAJTElTVF9IRUFEKHJlc291cmNlcyk7Ci0Jc3RydWN0IHBjaV9idXMgKmJ1cyA9IE5VTEw7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKIAlzdHJ1Y3QgcGNpX3N5c2RhdGEgKnNkOwogCWludCBub2RlOwotI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKLQlpbnQgcHhtOwotI2VuZGlmCiAKIAlpZiAocGNpX2lnbm9yZV9zZWcpCiAJCWRvbWFpbiA9IDA7CkBAIC00OTQsMTkgKzQ4OCwxMiBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlub2RlID0gLTE7Ci0jaWZkZWYgQ09ORklHX0FDUElfTlVNQQotCXB4bSA9IGFjcGlfZ2V0X3B4bShkZXZpY2UtPmhhbmRsZSk7Ci0JaWYgKHB4bSA+PSAwKQotCQlub2RlID0gcHhtX3RvX25vZGUocHhtKTsKLQlpZiAobm9kZSAhPSAtMSkKLQkJc2V0X21wX2J1c190b19ub2RlKGJ1c251bSwgbm9kZSk7Ci0JZWxzZQotI2VuZGlmCi0JCW5vZGUgPSBnZXRfbXBfYnVzX3RvX25vZGUoYnVzbnVtKTsKKwlub2RlID0gYWNwaV9nZXRfbm9kZShkZXZpY2UtPmhhbmRsZSk7CisJaWYgKG5vZGUgPT0gTlVNQV9OT19OT0RFKQorCQlub2RlID0geDg2X3BjaV9yb290X2J1c19ub2RlKGJ1c251bSk7CiAKLQlpZiAobm9kZSAhPSAtMSAmJiAhbm9kZV9vbmxpbmUobm9kZSkpCi0JCW5vZGUgPSAtMTsKKwlpZiAobm9kZSAhPSBOVU1BX05PX05PREUgJiYgIW5vZGVfb25saW5lKG5vZGUpKQorCQlub2RlID0gTlVNQV9OT19OT0RFOwogCiAJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbmZvKSB7CkBAIC01MTksMTUgKzUwNiwxMiBAQAogCXNkLT5kb21haW4gPSBkb21haW47CiAJc2QtPm5vZGUgPSBub2RlOwogCXNkLT5jb21wYW5pb24gPSBkZXZpY2U7Ci0JLyoKLQkgKiBNYXliZSB0aGUgZGVzaXJlZCBwY2kgYnVzIGhhcyBiZWVuIGFscmVhZHkgc2Nhbm5lZC4gSW4gc3VjaCBjYXNlCi0JICogaXQgaXMgdW5uZWNlc3NhcnkgdG8gc2NhbiB0aGUgcGNpIGJ1cyB3aXRoIHRoZSBnaXZlbiBkb21haW4sYnVzbnVtLgotCSAqLworCiAJYnVzID0gcGNpX2ZpbmRfYnVzKGRvbWFpbiwgYnVzbnVtKTsKIAlpZiAoYnVzKSB7CiAJCS8qCi0JCSAqIElmIHRoZSBkZXNpcmVkIGJ1cyBleGl0cywgdGhlIGNvbnRlbnQgb2YgYnVzLT5zeXNkYXRhIHdpbGwKLQkJICogYmUgcmVwbGFjZWQgYnkgc2QuCisJCSAqIElmIHRoZSBkZXNpcmVkIGJ1cyBoYXMgYmVlbiBzY2FubmVkIGFscmVhZHksIHJlcGxhY2UKKwkJICogaXRzIGJ1cy0+c3lzZGF0YS4KIAkJICovCiAJCW1lbWNweShidXMtPnN5c2RhdGEsIHNkLCBzaXplb2YoKnNkKSk7CiAJCWtmcmVlKGluZm8pOwpAQCAtNTcyLDE1ICs1NTYsOCBAQAogCQkJcGNpZV9idXNfY29uZmlndXJlX3NldHRpbmdzKGNoaWxkKTsKIAl9CiAKLQlpZiAoYnVzICYmIG5vZGUgIT0gLTEpIHsKLSNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCi0JCWlmIChweG0gPj0gMCkKLQkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmJ1cy0+ZGV2LAotCQkJCSAgICJvbiBOVU1BIG5vZGUgJWQgKHB4bSAlZClcbiIsIG5vZGUsIHB4bSk7Ci0jZWxzZQorCWlmIChidXMgJiYgbm9kZSAhPSBOVU1BX05PX05PREUpCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmJ1cy0+ZGV2LCAib24gTlVNQSBub2RlICVkXG4iLCBub2RlKTsKLSNlbmRpZgotCX0KIAogCXJldHVybiBidXM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvYW1kX2J1cy5jIGIvYXJjaC94ODYvcGNpL2FtZF9idXMuYwppbmRleCBhNDhiZTk4Li5hMzEzYTdmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvYW1kX2J1cy5jCisrKyBiL2FyY2gveDg2L3BjaS9hbWRfYnVzLmMKQEAgLTQ0LDE1ICs0NCw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfbXBfYnVzX3JhbmdlX3RvX25vZGUoaW50IG1pbl9idXMsIGludCBtYXhfYnVzLCBpbnQgbm9kZSkKLXsKLSNpZmRlZiBDT05GSUdfTlVNQQotCWludCBqOwotCi0JZm9yIChqID0gbWluX2J1czsgaiA8PSBtYXhfYnVzOyBqKyspCi0JCXNldF9tcF9idXNfdG9fbm9kZShqLCBub2RlKTsKLSNlbmRpZgotfQogLyoqCiAgKiBlYXJseV9maWxsX21wX2J1c190b19ub2RlKCkKICAqIGNhbGxlZCBiZWZvcmUgcGNpYmlvc19zY2FuX3Jvb3QgYW5kIHBjaV9zY2FuX2J1cwpAQCAtMTE3LDcgKzEwOCw2IEBACiAJCW1pbl9idXMgPSAocmVnID4+IDE2KSAmIDB4ZmY7CiAJCW1heF9idXMgPSAocmVnID4+IDI0KSAmIDB4ZmY7CiAJCW5vZGUgPSAocmVnID4+IDQpICYgMHgwNzsKLQkJc2V0X21wX2J1c19yYW5nZV90b19ub2RlKG1pbl9idXMsIG1heF9idXMsIG5vZGUpOwogCQlsaW5rID0gKHJlZyA+PiA4KSAmIDB4MDM7CiAKIAkJaW5mbyA9IGFsbG9jX3BjaV9yb290X2luZm8obWluX2J1cywgbWF4X2J1cywgbm9kZSwgbGluayk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvYnVzX251bWEuYyBiL2FyY2gveDg2L3BjaS9idXNfbnVtYS5jCmluZGV4IGMyNzM1ZmUuLmYzYTJjZmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9idXNfbnVtYS5jCisrKyBiL2FyY2gveDg2L3BjaS9idXNfbnVtYS5jCkBAIC0xMCw5ICsxMCw2IEBACiB7CiAJc3RydWN0IHBjaV9yb290X2luZm8gKmluZm87CiAKLQlpZiAobGlzdF9lbXB0eSgmcGNpX3Jvb3RfaW5mb3MpKQotCQlyZXR1cm4gTlVMTDsKLQogCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5mbywgJnBjaV9yb290X2luZm9zLCBsaXN0KQogCQlpZiAoaW5mby0+YnVzbi5zdGFydCA9PSBidXMpCiAJCQlyZXR1cm4gaW5mbzsKQEAgLTIwLDYgKzE3LDE2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK2ludCB4ODZfcGNpX3Jvb3RfYnVzX25vZGUoaW50IGJ1cykKK3sKKwlzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbyA9IHg4Nl9maW5kX3BjaV9yb290X2luZm8oYnVzKTsKKworCWlmICghaW5mbykKKwkJcmV0dXJuIE5VTUFfTk9fTk9ERTsKKworCXJldHVybiBpbmZvLT5ub2RlOworfQorCiB2b2lkIHg4Nl9wY2lfcm9vdF9idXNfcmVzb3VyY2VzKGludCBidXMsIHN0cnVjdCBsaXN0X2hlYWQgKnJlc291cmNlcykKIHsKIAlzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbyA9IHg4Nl9maW5kX3BjaV9yb290X2luZm8oYnVzKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9jb21tb24uYyBiL2FyY2gveDg2L3BjaS9jb21tb24uYwppbmRleCA5ODFjMmRiLi4wNTlhNzZjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvY29tbW9uLmMKKysrIGIvYXJjaC94ODYvcGNpL2NvbW1vbi5jCkBAIC00NTYsMTkgKzQ1NiwyNSBAQAogCWRtaV9jaGVja19zeXN0ZW0ocGNpcHJvYmVfZG1pX3RhYmxlKTsKIH0KIAotc3RydWN0IHBjaV9idXMgKnBjaWJpb3Nfc2Nhbl9yb290KGludCBidXNudW0pCit2b2lkIHBjaWJpb3Nfc2Nhbl9yb290KGludCBidXNudW0pCiB7Ci0Jc3RydWN0IHBjaV9idXMgKmJ1cyA9IE5VTEw7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKKwlzdHJ1Y3QgcGNpX3N5c2RhdGEgKnNkOworCUxJU1RfSEVBRChyZXNvdXJjZXMpOwogCi0Jd2hpbGUgKChidXMgPSBwY2lfZmluZF9uZXh0X2J1cyhidXMpKSAhPSBOVUxMKSB7Ci0JCWlmIChidXMtPm51bWJlciA9PSBidXNudW0pIHsKLQkJCS8qIEFscmVhZHkgc2Nhbm5lZCAqLwotCQkJcmV0dXJuIGJ1czsKLQkJfQorCXNkID0ga3phbGxvYyhzaXplb2YoKnNkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZCkgeworCQlwcmludGsoS0VSTl9FUlIgIlBDSTogT09NLCBza2lwcGluZyBQQ0kgYnVzICUwMnhcbiIsIGJ1c251bSk7CisJCXJldHVybjsKIAl9Ci0KLQlyZXR1cm4gcGNpX3NjYW5fYnVzX29uX25vZGUoYnVzbnVtLCAmcGNpX3Jvb3Rfb3BzLAotCQkJCQlnZXRfbXBfYnVzX3RvX25vZGUoYnVzbnVtKSk7CisJc2QtPm5vZGUgPSB4ODZfcGNpX3Jvb3RfYnVzX25vZGUoYnVzbnVtKTsKKwl4ODZfcGNpX3Jvb3RfYnVzX3Jlc291cmNlcyhidXNudW0sICZyZXNvdXJjZXMpOworCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6IFByb2JpbmcgUENJIGhhcmR3YXJlIChidXMgJTAyeClcbiIsIGJ1c251bSk7CisJYnVzID0gcGNpX3NjYW5fcm9vdF9idXMoTlVMTCwgYnVzbnVtLCAmcGNpX3Jvb3Rfb3BzLCBzZCwgJnJlc291cmNlcyk7CisJaWYgKCFidXMpIHsKKwkJcGNpX2ZyZWVfcmVzb3VyY2VfbGlzdCgmcmVzb3VyY2VzKTsKKwkJa2ZyZWUoc2QpOworCX0KIH0KIAogdm9pZCBfX2luaXQgcGNpYmlvc19zZXRfY2FjaGVfbGluZV9zaXplKHZvaWQpCkBAIC01NjEsNyArNTY3LDYgQEAKIAkJcGNpX3Byb2JlIHw9IFBDSV9QUk9CRV9OT0VBUkxZOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0jaWZuZGVmIENPTkZJR19YODZfVklTV1MKIAllbHNlIGlmICghc3RyY21wKHN0ciwgInVzZXBpcnFtYXNrIikpIHsKIAkJcGNpX3Byb2JlIHw9IFBDSV9VU0VfUElSUV9NQVNLOwogCQlyZXR1cm4gTlVMTDsKQEAgLTU3MSw5ICs1NzYsNyBAQAogCX0gZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCAibGFzdGJ1cz0iLCA4KSkgewogCQlwY2liaW9zX2xhc3RfYnVzID0gc2ltcGxlX3N0cnRvbChzdHIrOCwgTlVMTCwgMCk7CiAJCXJldHVybiBOVUxMOwotCX0KLSNlbmRpZgotCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCAicm9tIikpIHsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAicm9tIikpIHsKIAkJcGNpX3Byb2JlIHw9IFBDSV9BU1NJR05fUk9NUzsKIAkJcmV0dXJuIE5VTEw7CiAJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIm5vcm9tIikpIHsKQEAgLTY3NywxMDUgKzY4MCwzIEBACiAJZWxzZQogCQlyZXR1cm4gMDsKIH0KLQotc3RydWN0IHBjaV9idXMgKnBjaV9zY2FuX2J1c19vbl9ub2RlKGludCBidXNubywgc3RydWN0IHBjaV9vcHMgKm9wcywgaW50IG5vZGUpCi17Ci0JTElTVF9IRUFEKHJlc291cmNlcyk7Ci0Jc3RydWN0IHBjaV9idXMgKmJ1cyA9IE5VTEw7Ci0Jc3RydWN0IHBjaV9zeXNkYXRhICpzZDsKLQotCS8qCi0JICogQWxsb2NhdGUgcGVyLXJvb3QtYnVzIChub3QgcGVyIGJ1cykgYXJjaC1zcGVjaWZpYyBkYXRhLgotCSAqIFRPRE86IGxlYWs7IHRoaXMgbWVtb3J5IGlzIG5ldmVyIGZyZWVkLgotCSAqIEl0J3MgYXJndWFibGUgd2hldGhlciBpdCdzIHdvcnRoIHRoZSB0cm91YmxlIHRvIGNhcmUuCi0JICovCi0Jc2QgPSBremFsbG9jKHNpemVvZigqc2QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUENJOiBPT00sIHNraXBwaW5nIFBDSSBidXMgJTAyeFxuIiwgYnVzbm8pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2QtPm5vZGUgPSBub2RlOwotCXg4Nl9wY2lfcm9vdF9idXNfcmVzb3VyY2VzKGJ1c25vLCAmcmVzb3VyY2VzKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBQcm9iaW5nIFBDSSBoYXJkd2FyZSAoYnVzICUwMngpXG4iLCBidXNubyk7Ci0JYnVzID0gcGNpX3NjYW5fcm9vdF9idXMoTlVMTCwgYnVzbm8sIG9wcywgc2QsICZyZXNvdXJjZXMpOwotCWlmICghYnVzKSB7Ci0JCXBjaV9mcmVlX3Jlc291cmNlX2xpc3QoJnJlc291cmNlcyk7Ci0JCWtmcmVlKHNkKTsKLQl9Ci0KLQlyZXR1cm4gYnVzOwotfQotCi1zdHJ1Y3QgcGNpX2J1cyAqcGNpX3NjYW5fYnVzX3dpdGhfc3lzZGF0YShpbnQgYnVzbm8pCi17Ci0JcmV0dXJuIHBjaV9zY2FuX2J1c19vbl9ub2RlKGJ1c25vLCAmcGNpX3Jvb3Rfb3BzLCAtMSk7Ci19Ci0KLS8qCi0gKiBOVU1BIGluZm8gZm9yIFBDSSBidXNzZXMKLSAqCi0gKiBFYXJseSBhcmNoIGNvZGUgaXMgcmVzcG9uc2libGUgZm9yIGZpbGxpbmcgaW4gcmVhc29uYWJsZSB2YWx1ZXMgaGVyZS4KLSAqIEEgbm9kZSBpZCBvZiAiLTEiIG1lYW5zICJ1c2UgY3VycmVudCBub2RlIi4gIEluIG90aGVyIHdvcmRzLCBpZiBhIGJ1cwotICogaGFzIGEgLTEgbm9kZSBpZCwgaXQncyBub3QgdGlnaHRseSBjb3VwbGVkIHRvIGFueSBwYXJ0aWN1bGFyIGNodW5rCi0gKiBvZiBtZW1vcnkgKGFzIGlzIHRoZSBjYXNlIG9uIHNvbWUgTmVoYWxlbSBzeXN0ZW1zKS4KLSAqLwotI2lmZGVmIENPTkZJR19OVU1BCi0KLSNkZWZpbmUgQlVTX05SIDI1NgotCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotCi1zdGF0aWMgaW50IG1wX2J1c190b19ub2RlW0JVU19OUl0gPSB7Ci0JWzAgLi4uIEJVU19OUiAtIDFdID0gLTEKLX07Ci0KLXZvaWQgc2V0X21wX2J1c190b19ub2RlKGludCBidXNudW0sIGludCBub2RlKQotewotCWlmIChidXNudW0gPj0gMCAmJiAgYnVzbnVtIDwgQlVTX05SKQotCQltcF9idXNfdG9fbm9kZVtidXNudW1dID0gbm9kZTsKLX0KLQotaW50IGdldF9tcF9idXNfdG9fbm9kZShpbnQgYnVzbnVtKQotewotCWludCBub2RlID0gLTE7Ci0KLQlpZiAoYnVzbnVtIDwgMCB8fCBidXNudW0gPiAoQlVTX05SIC0gMSkpCi0JCXJldHVybiBub2RlOwotCi0Jbm9kZSA9IG1wX2J1c190b19ub2RlW2J1c251bV07Ci0KLQkvKgotCSAqIGxldCBudW1hX25vZGVfaWQgdG8gZGVjaWRlIGl0IGxhdGVyIGluIGRtYV9hbGxvY19wYWdlcwotCSAqIGlmIHRoZXJlIGlzIG5vIHJhbSBvbiB0aGF0IG5vZGUKLQkgKi8KLQlpZiAobm9kZSAhPSAtMSAmJiAhbm9kZV9vbmxpbmUobm9kZSkpCi0JCW5vZGUgPSAtMTsKLQotCXJldHVybiBub2RlOwotfQotCi0jZWxzZSAvKiBDT05GSUdfWDg2XzMyICovCi0KLXN0YXRpYyBpbnQgbXBfYnVzX3RvX25vZGVbQlVTX05SXSA9IHsKLQlbMCAuLi4gQlVTX05SIC0gMV0gPSAtMQotfTsKLQotdm9pZCBzZXRfbXBfYnVzX3RvX25vZGUoaW50IGJ1c251bSwgaW50IG5vZGUpCi17Ci0JaWYgKGJ1c251bSA+PSAwICYmICBidXNudW0gPCBCVVNfTlIpCi0JbXBfYnVzX3RvX25vZGVbYnVzbnVtXSA9ICh1bnNpZ25lZCBjaGFyKSBub2RlOwotfQotCi1pbnQgZ2V0X21wX2J1c190b19ub2RlKGludCBidXNudW0pCi17Ci0JaW50IG5vZGU7Ci0KLQlpZiAoYnVzbnVtIDwgMCB8fCBidXNudW0gPiAoQlVTX05SIC0gMSkpCi0JCXJldHVybiAwOwotCW5vZGUgPSBtcF9idXNfdG9fbm9kZVtidXNudW1dOwotCXJldHVybiBub2RlOwotfQotCi0jZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLwotCi0jZW5kaWYgLyogQ09ORklHX05VTUEgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9maXh1cC5jIGIvYXJjaC94ODYvcGNpL2ZpeHVwLmMKaW5kZXggYmNhOWU4NS4uOTRhZTlhZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2ZpeHVwLmMKKysrIGIvYXJjaC94ODYvcGNpL2ZpeHVwLmMKQEAgLTI1LDkgKzI1LDkgQEAKIAkJZGV2X2RiZygmZC0+ZGV2LCAiaTQ1ME5YIFBYQiAlZDogJTAyeC8lMDJ4LyUwMnhcbiIsIHB4YiwgYnVzbm8sCiAJCQlzdWJhLCBzdWJiKTsKIAkJaWYgKGJ1c25vKQotCQkJcGNpX3NjYW5fYnVzX3dpdGhfc3lzZGF0YShidXNubyk7CS8qIEJ1cyBBICovCisJCQlwY2liaW9zX3NjYW5fcm9vdChidXNubyk7CS8qIEJ1cyBBICovCiAJCWlmIChzdWJhIDwgc3ViYikKLQkJCXBjaV9zY2FuX2J1c193aXRoX3N5c2RhdGEoc3ViYSsxKTsJLyogQnVzIEIgKi8KKwkJCXBjaWJpb3Nfc2Nhbl9yb290KHN1YmErMSk7CS8qIEJ1cyBCICovCiAJfQogCXBjaWJpb3NfbGFzdF9idXMgPSAtMTsKIH0KQEAgLTQyLDcgKzQyLDcgQEAKIAl1OCBidXNubzsKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShkLCAweDRhLCAmYnVzbm8pOwogCWRldl9pbmZvKCZkLT5kZXYsICJpNDQwS1gvR1ggaG9zdCBicmlkZ2U7IHNlY29uZGFyeSBidXMgJTAyeFxuIiwgYnVzbm8pOwotCXBjaV9zY2FuX2J1c193aXRoX3N5c2RhdGEoYnVzbm8pOworCXBjaWJpb3Nfc2Nhbl9yb290KGJ1c25vKTsKIAlwY2liaW9zX2xhc3RfYnVzID0gLTE7CiB9CiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ1NEdYLCBwY2lfZml4dXBfaTQ1MGd4KTsKQEAgLTMxMyw5ICszMTMsMTAgQEAKICAqIElPUkVTT1VSQ0VfUk9NX1NIQURPVyBpcyB1c2VkIHRvIGFzc29jaWF0ZSB0aGUgYm9vdCB2aWRlbwogICogY2FyZCB3aXRoIHRoaXMgY29weS4gT24gbGFwdG9wcyB0aGlzIGNvcHkgaGFzIHRvIGJlIHVzZWQgc2luY2UKICAqIHRoZSBtYWluIFJPTSBtYXkgYmUgY29tcHJlc3NlZCBvciBjb21iaW5lZCB3aXRoIGFub3RoZXIgaW1hZ2UuCi0gKiBTZWUgcGNpX21hcF9yb20oKSBmb3IgdXNlIG9mIHRoaXMgZmxhZy4gSU9SRVNPVVJDRV9ST01fU0hBRE9XCi0gKiBpcyBtYXJrZWQgaGVyZSBzaW5jZSB0aGUgYm9vdCB2aWRlbyBkZXZpY2Ugd2lsbCBiZSB0aGUgb25seSBlbmFibGVkCi0gKiB2aWRlbyBkZXZpY2UgYXQgdGhpcyBwb2ludC4KKyAqIFNlZSBwY2lfbWFwX3JvbSgpIGZvciB1c2Ugb2YgdGhpcyBmbGFnLiBCZWZvcmUgbWFya2luZyB0aGUgZGV2aWNlCisgKiB3aXRoIElPUkVTT1VSQ0VfUk9NX1NIQURPVyBjaGVjayBpZiBhIHZnYV9kZWZhdWx0X2RldmljZSBpcyBhbHJlYWR5IHNldAorICogYnkgZWl0aGVyIGFyY2ggY2RlIG9yIHZnYS1hcmJpdHJhdGlvbiwgaWYgc28gb25seSBhcHBseSB0aGUgZml4dXAgdG8gdGhpcworICogYWxyZWFkeSBkZXRlcm1pbmVkIHByaW1hcnkgdmlkZW8gY2FyZC4KICAqLwogCiBzdGF0aWMgdm9pZCBwY2lfZml4dXBfdmlkZW8oc3RydWN0IHBjaV9kZXYgKnBkZXYpCkBAIC0zNDYsMTIgKzM0NywxMyBAQAogCQl9CiAJCWJ1cyA9IGJ1cy0+cGFyZW50OwogCX0KLQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmNvbmZpZyk7Ci0JaWYgKGNvbmZpZyAmIChQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSkpIHsKLQkJcGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZmxhZ3MgfD0gSU9SRVNPVVJDRV9ST01fU0hBRE9XOwotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJCb290IHZpZGVvIGRldmljZVxuIik7Ci0JCWlmICghdmdhX2RlZmF1bHRfZGV2aWNlKCkpCisJaWYgKCF2Z2FfZGVmYXVsdF9kZXZpY2UoKSB8fCBwZGV2ID09IHZnYV9kZWZhdWx0X2RldmljZSgpKSB7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY29uZmlnKTsKKwkJaWYgKGNvbmZpZyAmIChQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSkpIHsKKwkJCXBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLmZsYWdzIHw9IElPUkVTT1VSQ0VfUk9NX1NIQURPVzsKKwkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgIkJvb3QgdmlkZW8gZGV2aWNlXG4iKTsKIAkJCXZnYV9zZXRfZGVmYXVsdF9kZXZpY2UocGRldik7CisJCX0KIAl9CiB9CiBERUNMQVJFX1BDSV9GSVhVUF9DTEFTU19GSU5BTChQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2lycS5jIGIvYXJjaC94ODYvcGNpL2lycS5jCmluZGV4IDM3MmU5YjguLjg0MTEyZjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9pcnEuYworKysgYi9hcmNoL3g4Ni9wY2kvaXJxLmMKQEAgLTEzNiwxMyArMTM2LDkgQEAKIAkJYnVzbWFwW2UtPmJ1c10gPSAxOwogCX0KIAlmb3IgKGkgPSAxOyBpIDwgMjU2OyBpKyspIHsKLQkJaW50IG5vZGU7CiAJCWlmICghYnVzbWFwW2ldIHx8IHBjaV9maW5kX2J1cygwLCBpKSkKIAkJCWNvbnRpbnVlOwotCQlub2RlID0gZ2V0X21wX2J1c190b19ub2RlKGkpOwotCQlpZiAocGNpX3NjYW5fYnVzX29uX25vZGUoaSwgJnBjaV9yb290X29wcywgbm9kZSkpCi0JCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IERpc2NvdmVyZWQgcHJpbWFyeSBwZWVyICIKLQkJCSAgICAgICAiYnVzICUwMnggW0lSUV1cbiIsIGkpOworCQlwY2liaW9zX3NjYW5fcm9vdChpKTsKIAl9CiAJcGNpYmlvc19sYXN0X2J1cyA9IC0xOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2xlZ2FjeS5jIGIvYXJjaC94ODYvcGNpL2xlZ2FjeS5jCmluZGV4IDRkYjk2ZmIuLjViNjYyYzAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9sZWdhY3kuYworKysgYi9hcmNoL3g4Ni9wY2kvbGVnYWN5LmMKQEAgLTM3LDE5ICszNywxNyBAQAogdm9pZCBwY2liaW9zX3NjYW5fc3BlY2lmaWNfYnVzKGludCBidXNuKQogewogCWludCBkZXZmbjsKLQlsb25nIG5vZGU7CiAJdTMyIGw7CiAKIAlpZiAocGNpX2ZpbmRfYnVzKDAsIGJ1c24pKQogCQlyZXR1cm47CiAKLQlub2RlID0gZ2V0X21wX2J1c190b19ub2RlKGJ1c24pOwogCWZvciAoZGV2Zm4gPSAwOyBkZXZmbiA8IDI1NjsgZGV2Zm4gKz0gOCkgewogCQlpZiAoIXJhd19wY2lfcmVhZCgwLCBidXNuLCBkZXZmbiwgUENJX1ZFTkRPUl9JRCwgMiwgJmwpICYmCiAJCSAgICBsICE9IDB4MDAwMCAmJiBsICE9IDB4ZmZmZikgewogCQkJREJHKCJGb3VuZCBkZXZpY2UgYXQgJTAyeDolMDJ4IFslMDR4XVxuIiwgYnVzbiwgZGV2Zm4sIGwpOwogCQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBEaXNjb3ZlcmVkIHBlZXIgYnVzICUwMnhcbiIsIGJ1c24pOwotCQkJcGNpX3NjYW5fYnVzX29uX25vZGUoYnVzbiwgJnBjaV9yb290X29wcywgbm9kZSk7CisJCQlwY2liaW9zX3NjYW5fcm9vdChidXNuKTsKIAkJCXJldHVybjsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9udW1hcV8zMi5jIGIvYXJjaC94ODYvcGNpL251bWFxXzMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYzIyOWYuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvcGNpL251bWFxXzMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqIG51bWFxXzMyLmMgLSBMb3ctbGV2ZWwgUENJIGFjY2VzcyBmb3IgTlVNQS1RIG1hY2hpbmVzCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgotI2luY2x1ZGUgPGFzbS9hcGljLmg+Ci0jaW5jbHVkZSA8YXNtL21wc3BlYy5oPgotI2luY2x1ZGUgPGFzbS9wY2lfeDg2Lmg+Ci0jaW5jbHVkZSA8YXNtL251bWFxLmg+Ci0KLSNkZWZpbmUgQlVTMlFVQUQoZ2xvYmFsKSAobXBfYnVzX2lkX3RvX25vZGVbZ2xvYmFsXSkKLQotI2RlZmluZSBCVVMyTE9DQUwoZ2xvYmFsKSAobXBfYnVzX2lkX3RvX2xvY2FsW2dsb2JhbF0pCi0KLSNkZWZpbmUgUVVBRExPQ0FMMkJVUyhxdWFkLGxvY2FsKSAocXVhZF9sb2NhbF90b19tcF9idXNfaWRbcXVhZF1bbG9jYWxdKQotCi0jZGVmaW5lIFBDSV9DT05GMV9NUV9BRERSRVNTKGJ1cywgZGV2Zm4sIHJlZykgXAotCSgweDgwMDAwMDAwIHwgKEJVUzJMT0NBTChidXMpIDw8IDE2KSB8IChkZXZmbiA8PCA4KSB8IChyZWcgJiB+MykpCi0KLXN0YXRpYyB2b2lkIHdyaXRlX2NmOCh1bnNpZ25lZCBidXMsIHVuc2lnbmVkIGRldmZuLCB1bnNpZ25lZCByZWcpCi17Ci0JdW5zaWduZWQgdmFsID0gUENJX0NPTkYxX01RX0FERFJFU1MoYnVzLCBkZXZmbiwgcmVnKTsKLQlpZiAoeHF1YWRfcG9ydGlvKQotCQl3cml0ZWwodmFsLCBYUVVBRF9QT1JUX0FERFIoMHhjZjgsIEJVUzJRVUFEKGJ1cykpKTsKLQllbHNlCi0JCW91dGwodmFsLCAweENGOCk7Ci19Ci0KLXN0YXRpYyBpbnQgcGNpX2NvbmYxX21xX3JlYWQodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGJ1cywKLQkJCSAgICAgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgcmVnLCBpbnQgbGVuLCB1MzIgKnZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jdm9pZCAqYWRyIF9faW9tZW0gPSBYUVVBRF9QT1JUX0FERFIoMHhjZmMsIEJVUzJRVUFEKGJ1cykpOwotCi0JV0FSTl9PTihzZWcpOwotCWlmICghdmFsdWUgfHwgKGJ1cyA+PSBNQVhfTVBfQlVTU0VTKSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7Ci0KLQl3cml0ZV9jZjgoYnVzLCBkZXZmbiwgcmVnKTsKLQotCXN3aXRjaCAobGVuKSB7Ci0JY2FzZSAxOgotCQlpZiAoeHF1YWRfcG9ydGlvKQotCQkJKnZhbHVlID0gcmVhZGIoYWRyICsgKHJlZyAmIDMpKTsKLQkJZWxzZQotCQkJKnZhbHVlID0gaW5iKDB4Q0ZDICsgKHJlZyAmIDMpKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlpZiAoeHF1YWRfcG9ydGlvKQotCQkJKnZhbHVlID0gcmVhZHcoYWRyICsgKHJlZyAmIDIpKTsKLQkJZWxzZQotCQkJKnZhbHVlID0gaW53KDB4Q0ZDICsgKHJlZyAmIDIpKTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlpZiAoeHF1YWRfcG9ydGlvKQotCQkJKnZhbHVlID0gcmVhZGwoYWRyKTsKLQkJZWxzZQotCQkJKnZhbHVlID0gaW5sKDB4Q0ZDKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcGNpX2NvbmYxX21xX3dyaXRlKHVuc2lnbmVkIGludCBzZWcsIHVuc2lnbmVkIGludCBidXMsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCByZWcsIGludCBsZW4sIHUzMiB2YWx1ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXZvaWQgKmFkciBfX2lvbWVtID0gWFFVQURfUE9SVF9BRERSKDB4Y2ZjLCBCVVMyUVVBRChidXMpKTsKLQotCVdBUk5fT04oc2VnKTsKLQlpZiAoKGJ1cyA+PSBNQVhfTVBfQlVTU0VTKSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKSAKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOwotCi0Jd3JpdGVfY2Y4KGJ1cywgZGV2Zm4sIHJlZyk7Ci0KLQlzd2l0Y2ggKGxlbikgewotCWNhc2UgMToKLQkJaWYgKHhxdWFkX3BvcnRpbykKLQkJCXdyaXRlYih2YWx1ZSwgYWRyICsgKHJlZyAmIDMpKTsKLQkJZWxzZQotCQkJb3V0YigodTgpdmFsdWUsIDB4Q0ZDICsgKHJlZyAmIDMpKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlpZiAoeHF1YWRfcG9ydGlvKQotCQkJd3JpdGV3KHZhbHVlLCBhZHIgKyAocmVnICYgMikpOwotCQllbHNlCi0JCQlvdXR3KCh1MTYpdmFsdWUsIDB4Q0ZDICsgKHJlZyAmIDIpKTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlpZiAoeHF1YWRfcG9ydGlvKQotCQkJd3JpdGVsKHZhbHVlLCBhZHIgKyByZWcpOwotCQllbHNlCi0JCQlvdXRsKCh1MzIpdmFsdWUsIDB4Q0ZDKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSN1bmRlZiBQQ0lfQ09ORjFfTVFfQUREUkVTUwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9yYXdfb3BzIHBjaV9kaXJlY3RfY29uZjFfbXEgPSB7Ci0JLnJlYWQJPSBwY2lfY29uZjFfbXFfcmVhZCwKLQkud3JpdGUJPSBwY2lfY29uZjFfbXFfd3JpdGUKLX07Ci0KLQotc3RhdGljIHZvaWQgcGNpX2ZpeHVwX2k0NTBueChzdHJ1Y3QgcGNpX2RldiAqZCkKLXsKLQkvKgotCSAqIGk0NTBOWCAtLSBGaW5kIGFuZCBzY2FuIGFsbCBzZWNvbmRhcnkgYnVzZXMgb24gYWxsIFBYQidzLgotCSAqLwotCWludCBweGIsIHJlZzsKLQl1OCBidXNubywgc3ViYSwgc3ViYjsKLQlpbnQgcXVhZCA9IEJVUzJRVUFEKGQtPmJ1cy0+bnVtYmVyKTsKLQotCWRldl9pbmZvKCZkLT5kZXYsICJzZWFyY2hpbmcgZm9yIGk0NTBOWCBob3N0IGJyaWRnZXNcbiIpOwotCXJlZyA9IDB4ZDA7Ci0JZm9yKHB4Yj0wOyBweGI8MjsgcHhiKyspIHsKLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZCwgcmVnKyssICZidXNubyk7Ci0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGQsIHJlZysrLCAmc3ViYSk7Ci0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGQsIHJlZysrLCAmc3ViYik7Ci0JCWRldl9kYmcoJmQtPmRldiwgImk0NTBOWCBQWEIgJWQ6ICUwMngvJTAyeC8lMDJ4XG4iLAotCQkJcHhiLCBidXNubywgc3ViYSwgc3ViYik7Ci0JCWlmIChidXNubykgewotCQkJLyogQnVzIEEgKi8KLQkJCXBjaV9zY2FuX2J1c193aXRoX3N5c2RhdGEoUVVBRExPQ0FMMkJVUyhxdWFkLCBidXNubykpOwotCQl9Ci0JCWlmIChzdWJhIDwgc3ViYikgewotCQkJLyogQnVzIEIgKi8KLQkJCXBjaV9zY2FuX2J1c193aXRoX3N5c2RhdGEoUVVBRExPQ0FMMkJVUyhxdWFkLCBzdWJhKzEpKTsKLQkJfQotCX0KLQlwY2liaW9zX2xhc3RfYnVzID0gLTE7Ci19Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ1MU5YLCBwY2lfZml4dXBfaTQ1MG54KTsKLQotaW50IF9faW5pdCBwY2lfbnVtYXFfaW5pdCh2b2lkKQotewotCWludCBxdWFkOwotCi0JcmF3X3BjaV9vcHMgPSAmcGNpX2RpcmVjdF9jb25mMV9tcTsKLQotCXBjaWJpb3Nfc2Nhbl9yb290KDApOwotCWlmIChudW1fb25saW5lX25vZGVzKCkgPiAxKQotCQlmb3JfZWFjaF9vbmxpbmVfbm9kZShxdWFkKSB7Ci0JCQlpZiAocXVhZCA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJcHJpbnRrKCJTY2FubmluZyBQQ0kgYnVzICVkIGZvciBxdWFkICVkXG4iLCAKLQkJCQlRVUFETE9DQUwyQlVTKHF1YWQsMCksIHF1YWQpOwotCQkJcGNpX3NjYW5fYnVzX3dpdGhfc3lzZGF0YShRVUFETE9DQUwyQlVTKHF1YWQsIDApKTsKLQkJfQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL3Zpc3dzLmMgYi9hcmNoL3g4Ni9wY2kvdmlzd3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2ZDJhNi4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9wY2kvdmlzd3MuYworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKglMb3ctTGV2ZWwgUENJIFN1cHBvcnQgZm9yIFNHSSBWaXN1YWwgV29ya3N0YXRpb24KLSAqCi0gKgkoYykgMTk5OS0tMjAwMCBNYXJ0aW4gTWFyZXMgPG1qQHVjdy5jej4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL3BjaV94ODYuaD4KLSNpbmNsdWRlIDxhc20vdmlzd3MvY29iYWx0Lmg+Ci0jaW5jbHVkZSA8YXNtL3Zpc3dzL2xpdGhpdW0uaD4KLQotc3RhdGljIGludCBwY2lfdmlzd3NfZW5hYmxlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgdm9pZCBwY2lfdmlzd3NfZGlzYWJsZV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldikgeyB9Ci0KLS8qIGludCAoKnBjaWJpb3NfZW5hYmxlX2lycSkoc3RydWN0IHBjaV9kZXYgKmRldikgPSAmcGNpX3Zpc3dzX2VuYWJsZV9pcnE7ICovCi0vKiB2b2lkICgqcGNpYmlvc19kaXNhYmxlX2lycSkoc3RydWN0IHBjaV9kZXYgKmRldikgPSAmcGNpX3Zpc3dzX2Rpc2FibGVfaXJxOyAqLwotCi0vKiB2b2lkIF9faW5pdCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkge30gKi8KLQotCi11bnNpZ25lZCBpbnQgcGNpX2J1czAsIHBjaV9idXMxOwotCi1zdGF0aWMgaW50IF9faW5pdCB2aXN3c19tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKLXsKLQlpbnQgaXJxLCBidXMgPSBkZXYtPmJ1cy0+bnVtYmVyOwotCi0JcGluLS07Ci0KLQkvKiBOb3RoaW5nIHVzZWZ1bCBhdCBQSUlYNCBwaW4gMSAqLwotCWlmIChidXMgPT0gcGNpX2J1czAgJiYgc2xvdCA9PSA0ICYmIHBpbiA9PSAwKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBQSUlYNCBVU0IgaXMgb24gQnVzIDAsIFNsb3QgNCwgTGluZSAzICovCi0JaWYgKGJ1cyA9PSBwY2lfYnVzMCAmJiBzbG90ID09IDQgJiYgcGluID09IDMpIHsKLQkJaXJxID0gQ09fSVJRKENPX0FQSUNfUElJWDRfVVNCKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogRmlyc3QgcGluIHNwcmVhZCBkb3duIDEgQVBJQyBlbnRyeSBwZXIgc2xvdCAqLwotCWlmIChwaW4gPT0gMCkgewotCQlpcnEgPSBDT19JUlEoKGJ1cyA9PSBwY2lfYnVzMCA/IENPX0FQSUNfUENJQl9CQVNFMCA6Ci0JCQkJCQlDT19BUElDX1BDSUFfQkFTRTApICsgc2xvdCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIGxpbmVzIDEsMiwzIGZyb20gYW55IHNsb3QgaXMgc2hhcmVkIGluIHRoaXMgdHdpcmx5IHBhdHRlcm4gKi8KLQlpZiAoYnVzID09IHBjaV9idXMxKSB7Ci0JCS8qIGxpbmVzIDEtMyBmcm9tIGRldmljZXMgMCAxIHJvdGF0ZSBvdmVyIDIgYXBpYyBlbnRyaWVzICovCi0JCWlycSA9IENPX0lSUShDT19BUElDX1BDSUFfQkFTRTEyMyArICgoc2xvdCArIChwaW4gLSAxKSkgJSAyKSk7Ci0JfSBlbHNlIHsgLyogYnVzID09IHBjaV9idXMwICovCi0JCS8qIGxpbmVzIDEtMyBmcm9tIGRldmljZXMgMC0zIHJvdGF0ZSBvdmVyIDMgYXBpYyBlbnRyaWVzICovCi0JCWlmIChzbG90ID09IDApCi0JCQlzbG90ID0gMzsgLyogc2FtZSBwYXR0ZXJuICovCi0JCWlycSA9IENPX0lSUShDT19BUElDX1BDSUFfQkFTRTEyMyArICgoMyAtIHNsb3QpICsgKHBpbiAtIDEpICUgMykpOwotCX0KLW91dDoKLQlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBCdXMgJWQgU2xvdCAlZCBMaW5lICVkIC0+IElSUSAlZFxuIiwgYnVzLCBzbG90LCBwaW4sIGlycSk7Ci0JcmV0dXJuIGlycTsKLX0KLQotaW50IF9faW5pdCBwY2lfdmlzd3NfaW5pdCh2b2lkKQotewotCXBjaWJpb3NfZW5hYmxlX2lycSA9ICZwY2lfdmlzd3NfZW5hYmxlX2lycTsKLQlwY2liaW9zX2Rpc2FibGVfaXJxID0gJnBjaV92aXN3c19kaXNhYmxlX2lycTsKLQotCS8qIFRoZSBWSVNXUyBzdXBwb3J0cyBjb25maWd1cmF0aW9uIGFjY2VzcyB0eXBlIDEgb25seSAqLwotCXBjaV9wcm9iZSA9IChwY2lfcHJvYmUgfCBQQ0lfUFJPQkVfQ09ORjEpICYKLQkJICAgIH4oUENJX1BST0JFX0JJT1MgfCBQQ0lfUFJPQkVfQ09ORjIpOwotCi0JcGNpX2J1czAgPSBsaV9wY2liX3JlYWQxNihMSV9QQ0lfQlVTTlVNKSAmIDB4ZmY7Ci0JcGNpX2J1czEgPSBsaV9wY2lhX3JlYWQxNihMSV9QQ0lfQlVTTlVNKSAmIDB4ZmY7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IExpdGhpdW0gYnJpZGdlIEEgYnVzOiAldSwgIgotCQkiYnJpZGdlIEIgKFBJSVg0KSBidXM6ICV1XG4iLCBwY2lfYnVzMSwgcGNpX2J1czApOwotCi0JcmF3X3BjaV9vcHMgPSAmcGNpX2RpcmVjdF9jb25mMTsKLQlwY2lfc2Nhbl9idXNfd2l0aF9zeXNkYXRhKHBjaV9idXMwKTsKLQlwY2lfc2Nhbl9idXNfd2l0aF9zeXNkYXRhKHBjaV9idXMxKTsKLQlwY2lfZml4dXBfaXJxcyhwY2lfY29tbW9uX3N3aXp6bGUsIHZpc3dzX21hcF9pcnEpOwotCXBjaWJpb3NfcmVzb3VyY2Vfc3VydmV5KCk7Ci0JLyogUmVxdWVzdCBidXMgc2NhbiAqLwotCXJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vTWFrZWZpbGUgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9NYWtlZmlsZQppbmRleCAyMDM0MmQ0Li44NWFmZGUxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9NYWtlZmlsZQpAQCAtOSw1ICs5LDQgQEAKIG9iai15CSs9IHNjeDIwMC8KIG9iai15CSs9IHNmaS8KIG9iai15CSs9IHRzNTUwMC8KLW9iai15CSs9IHZpc3dzLwogb2JqLXkJKz0gdXYvCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS92aXN3cy9NYWtlZmlsZSBiL2FyY2gveDg2L3BsYXRmb3JtL3Zpc3dzL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWJjMTdhLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL3Zpc3dzL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotb2JqLSQoQ09ORklHX1g4Nl9WSVNXUykJKz0gdmlzd3NfcXVpcmtzLm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL3Zpc3dzL3Zpc3dzX3F1aXJrcy5jIGIvYXJjaC94ODYvcGxhdGZvcm0vdmlzd3Mvdmlzd3NfcXVpcmtzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZDhhMzkuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vdmlzd3Mvdmlzd3NfcXVpcmtzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MDggKzAsMCBAQAotLyoKLSAqICBTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIHN1cHBvcnQgYW5kIHF1aXJrcywgdW5tYWludGFpbmVkLgotICoKLSAqICBTcGxpdCBvdXQgZnJvbSBzZXR1cC5jIGJ5IGRhdmVqQHN1c2UuZGUKLSAqCi0gKglDb3B5cmlnaHQgKEMpIDE5OTkgQmVudCBIYWdlbWFyaywgSW5nbyBNb2xuYXIKLSAqCi0gKiAgU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbiBpbnRlcnJ1cHQgY29udHJvbGxlcgotICoKLSAqICBUaGUgQ29iYWx0IHN5c3RlbSBBU0lDIGluIHRoZSBWaXN1YWwgV29ya3N0YXRpb24gY29udGFpbnMgYSAiQ29iYWx0IiBBUElDCi0gKiAgd2hpY2ggc2VydmVzIGFzIHRoZSBtYWluIGludGVycnVwdCBjb250cm9sbGVyIGluIHRoZSBzeXN0ZW0uICBOb24tbGVnYWN5Ci0gKiAgaGFyZHdhcmUgaW4gdGhlIHN5c3RlbSB1c2VzIHRoaXMgY29udHJvbGxlciBkaXJlY3RseS4gIExlZ2FjeSBkZXZpY2VzCi0gKiAgYXJlIGNvbm5lY3RlZCB0byB0aGUgUElJWDQgd2hpY2ggaW4gdHVybiBoYXMgaXRzIDgyNTkocykgY29ubmVjdGVkIHRvCi0gKiAgYSBvZiB0aGUgQ29iYWx0IEFQSUMgZW50cnkuCi0gKgotICogIDA5LzAyLzIwMDAgLSBVcGRhdGVkIGZvciAyLjQgYnkgamJhcm5lc0BzZ2kuY29tCi0gKgotICogIDI1LzExLzIwMDIgLSBVcGRhdGVkIGZvciAyLjUgYnkgQW5kcmV5IFBhbmluIDxwYXprZUBvcmJpdGExLnJ1PgotICovCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotCi0jaW5jbHVkZSA8YXNtL3Zpc3dzL2NvYmFsdC5oPgotI2luY2x1ZGUgPGFzbS92aXN3cy9waWl4NC5oPgotI2luY2x1ZGUgPGFzbS9pb19hcGljLmg+Ci0jaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgotI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vYXBpYy5oPgotI2luY2x1ZGUgPGFzbS9lODIwLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vaTgyNTkuaD4KLSNpbmNsdWRlIDxhc20vaXJxX3ZlY3RvcnMuaD4KLSNpbmNsdWRlIDxhc20vdmlzd3MvbGl0aGl1bS5oPgotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+Ci0KLWV4dGVybiBpbnQgbm9fYnJvYWRjYXN0OwotCi1jaGFyIHZpc3dzX2JvYXJkX3R5cGUJPSAtMTsKLWNoYXIgdmlzd3NfYm9hcmRfcmV2CT0gLTE7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB2aXN3c190aW1lX2luaXQodm9pZCkKLXsKLQlwcmludGsoS0VSTl9JTkZPICJTdGFydGluZyBDb2JhbHQgVGltZXIgc3lzdGVtIGNsb2NrXG4iKTsKLQotCS8qIFNldCB0aGUgY291bnRkb3duIHZhbHVlICovCi0JY29fY3B1X3dyaXRlKENPX0NQVV9USU1FVkFMLCBDT19USU1FX0haL0haKTsKLQotCS8qIFN0YXJ0IHRoZSB0aW1lciAqLwotCWNvX2NwdV93cml0ZShDT19DUFVfQ1RSTCwgY29fY3B1X3JlYWQoQ09fQ1BVX0NUUkwpIHwgQ09fQ1RSTF9USU1FUlVOKTsKLQotCS8qIEVuYWJsZSAodW5tYXNrKSB0aGUgdGltZXIgaW50ZXJydXB0ICovCi0JY29fY3B1X3dyaXRlKENPX0NQVV9DVFJMLCBjb19jcHVfcmVhZChDT19DUFVfQ1RSTCkgJiB+Q09fQ1RSTF9USU1FTUFTSyk7Ci0KLQlzZXR1cF9kZWZhdWx0X3RpbWVyX2lycSgpOwotfQotCi0vKiBSZXBsYWNlcyB0aGUgZGVmYXVsdCBpbml0X0lTQV9pcnFzIGluIHRoZSBnZW5lcmljIHNldHVwICovCi1zdGF0aWMgdm9pZCBfX2luaXQgdmlzd3NfcHJlX2ludHJfaW5pdCh2b2lkKTsKLQotLyogUXVpcmsgZm9yIG1hY2hpbmUgc3BlY2lmaWMgbWVtb3J5IHNldHVwLiAqLwotCi0jZGVmaW5lIE1CICgxMDI0ICogMTAyNCkKLQotdW5zaWduZWQgbG9uZyBzZ2l2d2ZiX21lbV9waHlzOwotdW5zaWduZWQgbG9uZyBzZ2l2d2ZiX21lbV9zaXplOwotRVhQT1JUX1NZTUJPTChzZ2l2d2ZiX21lbV9waHlzKTsKLUVYUE9SVF9TWU1CT0woc2dpdndmYl9tZW1fc2l6ZSk7Ci0KLWxvbmcgbG9uZyBtZW1fc2l6ZSBfX2luaXRkYXRhID0gMDsKLQotc3RhdGljIGNoYXIgKiBfX2luaXQgdmlzd3NfbWVtb3J5X3NldHVwKHZvaWQpCi17Ci0JbG9uZyBsb25nIGdmeF9tZW1fc2l6ZSA9IDggKiBNQjsKLQotCW1lbV9zaXplID0gYm9vdF9wYXJhbXMuYWx0X21lbV9rOwotCi0JaWYgKCFtZW1fc2l6ZSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJCb290bG9hZGVyIGRpZG4ndCBzZXQgbWVtb3J5IHNpemUsIHVwZ3JhZGUgaXQgIVxuIik7Ci0JCW1lbV9zaXplID0gMTI4ICogTUI7Ci0JfQotCi0JLyoKLQkgKiB0aGlzIGhhcmRjb2RlcyB0aGUgZ3JhcGhpY3MgbWVtb3J5IHRvIDggTUIKLQkgKiBpdCByZWFsbHkgc2hvdWxkIGJlIHNpemVkIGR5bmFtaWNhbGx5IChvciBhdCBsZWFzdAotCSAqIHNldCBhcyBhIGJvb3QgcGFyYW0pCi0JICovCi0JaWYgKCFzZ2l2d2ZiX21lbV9zaXplKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkRlZmF1bHRpbmcgdG8gOCBNQiBmcmFtZWJ1ZmZlciBzaXplXG4iKTsKLQkJc2dpdndmYl9tZW1fc2l6ZSA9IDggKiBNQjsKLQl9Ci0KLQkvKgotCSAqIFRyaW0gdG8gbmVhcmVzdCBNQgotCSAqLwotCXNnaXZ3ZmJfbWVtX3NpemUgJj0gfigoMSA8PCAyMCkgLSAxKTsKLQlzZ2l2d2ZiX21lbV9waHlzID0gbWVtX3NpemUgLSBnZnhfbWVtX3NpemU7Ci0KLQllODIwX2FkZF9yZWdpb24oMCwgTE9XTUVNU0laRSgpLCBFODIwX1JBTSk7Ci0JZTgyMF9hZGRfcmVnaW9uKEhJR0hfTUVNT1JZLCBtZW1fc2l6ZSAtIHNnaXZ3ZmJfbWVtX3NpemUgLSBISUdIX01FTU9SWSwgRTgyMF9SQU0pOwotCWU4MjBfYWRkX3JlZ2lvbihzZ2l2d2ZiX21lbV9waHlzLCBzZ2l2d2ZiX21lbV9zaXplLCBFODIwX1JFU0VSVkVEKTsKLQotCXJldHVybiAiUFJPTSI7Ci19Ci0KLXN0YXRpYyB2b2lkIHZpc3dzX21hY2hpbmVfZW1lcmdlbmN5X3Jlc3RhcnQodm9pZCkKLXsKLQkvKgotCSAqIFZpc3VhbCBXb3Jrc3RhdGlvbnMgcmVzdGFydCBhZnRlciB0aGlzCi0JICogcmVnaXN0ZXIgaXMgcG9rZWQgb24gdGhlIFBJSVg0Ci0JICovCi0Jb3V0YihQSUlYNF9SRVNFVF9WQUwsIFBJSVg0X1JFU0VUX1BPUlQpOwotfQotCi1zdGF0aWMgdm9pZCB2aXN3c19tYWNoaW5lX3Bvd2VyX29mZih2b2lkKQotewotCXVuc2lnbmVkIHNob3J0IHBtX3N0YXR1czsKLS8qCWV4dGVybiB1bnNpZ25lZCBpbnQgcGNpX2J1czA7ICovCi0KLQl3aGlsZSAoKHBtX3N0YXR1cyA9IGludyhQTVNUU19QT1JUKSkgJiAweDEwMCkKLQkJb3V0dyhwbV9zdGF0dXMsIFBNU1RTX1BPUlQpOwotCi0Jb3V0dyhQTV9TVVNQRU5EX0VOQUJMRSwgUE1DTlRSTF9QT1JUKTsKLQotCW1kZWxheSgxMCk7Ci0KLSNkZWZpbmUgUENJX0NPTkYxX0FERFJFU1MoYnVzLCBkZXZmbiwgcmVnKSBcCi0JKDB4ODAwMDAwMDAgfCAoYnVzIDw8IDE2KSB8IChkZXZmbiA8PCA4KSB8IChyZWcgJiB+MykpCi0KLS8qCW91dGwoUENJX0NPTkYxX0FERFJFU1MocGNpX2J1czAsIFNQRUNJQUxfREVWLCBTUEVDSUFMX1JFRyksIDB4Q0Y4KTsgKi8KLQlvdXRsKFBJSVhfU1BFQ0lBTF9TVE9QLCAweENGQyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB2aXN3c19nZXRfc21wX2NvbmZpZyh1bnNpZ25lZCBpbnQgZWFybHkpCi17Ci19Ci0KLS8qCi0gKiBUaGUgVmlzdWFsIFdvcmtzdGF0aW9uIGlzIEludGVsIE1QIGNvbXBsaWFudCBpbiB0aGUgaGFyZHdhcmUKLSAqIHNlbnNlLCBidXQgaXQgZG9lc24ndCBoYXZlIGEgQklPUygtY29uZmlndXJhdGlvbiB0YWJsZSkuCi0gKiBObyBwcm9ibGVtIGZvciBMaW51eC4KLSAqLwotCi1zdGF0aWMgdm9pZCBfX2luaXQgTVBfcHJvY2Vzc29yX2luZm8oc3RydWN0IG1wY19jcHUgKm0pCi17Ci0JaW50IHZlciwgbG9naWNhbF9hcGljaWQ7Ci0JcGh5c2lkX21hc2tfdCBhcGljX2NwdXM7Ci0KLQlpZiAoIShtLT5jcHVmbGFnICYgQ1BVX0VOQUJMRUQpKQotCQlyZXR1cm47Ci0KLQlsb2dpY2FsX2FwaWNpZCA9IG0tPmFwaWNpZDsKLQlwcmludGsoS0VSTl9JTkZPICIlc0NQVSAjJWQgJXU6JXUgQVBJQyB2ZXJzaW9uICVkXG4iLAotCSAgICAgICBtLT5jcHVmbGFnICYgQ1BVX0JPT1RQUk9DRVNTT1IgPyAiQm9vdHVwICIgOiAiIiwKLQkgICAgICAgbS0+YXBpY2lkLCAobS0+Y3B1ZmVhdHVyZSAmIENQVV9GQU1JTFlfTUFTSykgPj4gOCwKLQkgICAgICAgKG0tPmNwdWZlYXR1cmUgJiBDUFVfTU9ERUxfTUFTSykgPj4gNCwgbS0+YXBpY3Zlcik7Ci0KLQlpZiAobS0+Y3B1ZmxhZyAmIENQVV9CT09UUFJPQ0VTU09SKQotCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSBtLT5hcGljaWQ7Ci0KLQl2ZXIgPSBtLT5hcGljdmVyOwotCWlmICgodmVyID49IDB4MTQgJiYgbS0+YXBpY2lkID49IDB4ZmYpIHx8IG0tPmFwaWNpZCA+PSAweGYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJQcm9jZXNzb3IgIyVkIElOVkFMSUQuIChNYXggSUQ6ICVkKS5cbiIsCi0JCQltLT5hcGljaWQsIE1BWF9MT0NBTF9BUElDKTsKLQkJcmV0dXJuOwotCX0KLQotCWFwaWMtPmFwaWNpZF90b19jcHVfcHJlc2VudChtLT5hcGljaWQsICZhcGljX2NwdXMpOwotCXBoeXNpZHNfb3IocGh5c19jcHVfcHJlc2VudF9tYXAsIHBoeXNfY3B1X3ByZXNlbnRfbWFwLCBhcGljX2NwdXMpOwotCS8qCi0JICogVmFsaWRhdGUgdmVyc2lvbgotCSAqLwotCWlmICh2ZXIgPT0gMHgwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQklPUyBidWcsIEFQSUMgdmVyc2lvbiBpcyAwIGZvciBDUFUjJWQhICIKLQkJCSJmaXhpbmcgdXAgdG8gMHgxMC4gKHRlbGwgeW91ciBodyB2ZW5kb3IpXG4iLAotCQkJbS0+YXBpY2lkKTsKLQkJdmVyID0gMHgxMDsKLQl9Ci0JYXBpY192ZXJzaW9uW20tPmFwaWNpZF0gPSB2ZXI7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB2aXN3c19maW5kX3NtcF9jb25maWcodm9pZCkKLXsKLQlzdHJ1Y3QgbXBjX2NwdSAqbXAgPSBwaHlzX3RvX3ZpcnQoQ09fQ1BVX1RBQl9QSFlTKTsKLQl1bnNpZ25lZCBzaG9ydCBuY3B1cyA9IHJlYWR3KHBoeXNfdG9fdmlydChDT19DUFVfTlVNX1BIWVMpKTsKLQotCWlmIChuY3B1cyA+IENPX0NQVV9NQVgpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZmluZF92aXN3c19zbXA6IGdvdCBjcHUgY291bnQgb2YgJWQgYXQgJXBcbiIsCi0JCQluY3B1cywgbXApOwotCi0JCW5jcHVzID0gQ09fQ1BVX01BWDsKLQl9Ci0KLQlpZiAobmNwdXMgPiBzZXR1cF9tYXhfY3B1cykKLQkJbmNwdXMgPSBzZXR1cF9tYXhfY3B1czsKLQotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotCXNtcF9mb3VuZF9jb25maWcgPSAxOwotI2VuZGlmCi0Jd2hpbGUgKG5jcHVzLS0pCi0JCU1QX3Byb2Nlc3Nvcl9pbmZvKG1wKyspOwotCi0JbXBfbGFwaWNfYWRkciA9IEFQSUNfREVGQVVMVF9QSFlTX0JBU0U7Ci19Ci0KLXN0YXRpYyB2b2lkIHZpc3dzX3RyYXBfaW5pdCh2b2lkKTsKLQotdm9pZCBfX2luaXQgdmlzd3NfZWFybHlfZGV0ZWN0KHZvaWQpCi17Ci0JaW50IHJhdzsKLQotCXZpc3dzX2JvYXJkX3R5cGUgPSAoY2hhcikoaW5iX3AoUElJWF9HUElfQkRfUkVHKSAmIFBJSVhfR1BJX0JEX1JFRykKLQkJCQkJCQkgPj4gUElJWF9HUElfQkRfU0hJRlQ7Ci0KLQlpZiAodmlzd3NfYm9hcmRfdHlwZSA8IDApCi0JCXJldHVybjsKLQotCS8qCi0JICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgcGxhdGZvcm0gc2V0dXAgZnVuY3Rpb25zCi0JICovCi0JeDg2X2luaXQucmVzb3VyY2VzLm1lbW9yeV9zZXR1cCA9IHZpc3dzX21lbW9yeV9zZXR1cDsKLQl4ODZfaW5pdC5tcHBhcnNlLmdldF9zbXBfY29uZmlnID0gdmlzd3NfZ2V0X3NtcF9jb25maWc7Ci0JeDg2X2luaXQubXBwYXJzZS5maW5kX3NtcF9jb25maWcgPSB2aXN3c19maW5kX3NtcF9jb25maWc7Ci0JeDg2X2luaXQuaXJxcy5wcmVfdmVjdG9yX2luaXQgPSB2aXN3c19wcmVfaW50cl9pbml0OwotCXg4Nl9pbml0LmlycXMudHJhcF9pbml0ID0gdmlzd3NfdHJhcF9pbml0OwotCXg4Nl9pbml0LnRpbWVycy50aW1lcl9pbml0ID0gdmlzd3NfdGltZV9pbml0OwotCXg4Nl9pbml0LnBjaS5pbml0ID0gcGNpX3Zpc3dzX2luaXQ7Ci0JeDg2X2luaXQucGNpLmluaXRfaXJxID0geDg2X2luaXRfbm9vcDsKLQotCS8qCi0JICogSW5zdGFsbCByZWJvb3QgcXVpcmtzOgotCSAqLwotCXBtX3Bvd2VyX29mZgkJCT0gdmlzd3NfbWFjaGluZV9wb3dlcl9vZmY7Ci0JbWFjaGluZV9vcHMuZW1lcmdlbmN5X3Jlc3RhcnQJPSB2aXN3c19tYWNoaW5lX2VtZXJnZW5jeV9yZXN0YXJ0OwotCi0JLyoKLQkgKiBEbyBub3QgdXNlIGJyb2FkY2FzdCBJUElzOgotCSAqLwotCW5vX2Jyb2FkY2FzdCA9IDA7Ci0KLSNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKLQkvKgotCSAqIFR1cm4gb2ZmIElPLUFQSUMgZGV0ZWN0aW9uIGFuZCBpbml0aWFsaXphdGlvbjoKLQkgKi8KLQlza2lwX2lvYXBpY19zZXR1cAkJPSAxOwotI2VuZGlmCi0KLQkvKgotCSAqIEdldCBCb2FyZCByZXYuCi0JICogRmlyc3QsIHdlIGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGUgMzA3IHBhcnQgdG8gYWxsb3cgdXMgYWNjZXNzCi0JICogdG8gdGhlIEdQSU8gcmVnaXN0ZXJzLiAgTGV0J3MgbWFwIHRoZW0gYXQgMHgwZmMwIHdoaWNoIGlzIHJpZ2h0Ci0JICogYWZ0ZXIgdGhlIFBJSVg0IFBNIHNlY3Rpb24uCi0JICovCi0Jb3V0Yl9wKFNJT19ERVZfU0VMLCBTSU9fSU5ERVgpOwotCW91dGJfcChTSU9fR1BfREVWLCBTSU9fREFUQSk7CS8qIFRhbGsgdG8gR1BJTyByZWdzLiAqLwotCi0Jb3V0Yl9wKFNJT19ERVZfTVNCLCBTSU9fSU5ERVgpOwotCW91dGJfcChTSU9fR1BfTVNCLCBTSU9fREFUQSk7CS8qIE1TQiBvZiBHUElPIGJhc2UgYWRkcmVzcyAqLwotCi0Jb3V0Yl9wKFNJT19ERVZfTFNCLCBTSU9fSU5ERVgpOwotCW91dGJfcChTSU9fR1BfTFNCLCBTSU9fREFUQSk7CS8qIExTQiBvZiBHUElPIGJhc2UgYWRkcmVzcyAqLwotCi0Jb3V0Yl9wKFNJT19ERVZfRU5CLCBTSU9fSU5ERVgpOwotCW91dGJfcCgxLCBTSU9fREFUQSk7CQkvKiBFbmFibGUgR1BJTyByZWdpc3RlcnMuICovCi0KLQkvKgotCSAqIE5vdywgd2UgaGF2ZSB0byBtYXAgdGhlIHBvd2VyIG1hbmFnZW1lbnQgc2VjdGlvbiB0byB3cml0ZQotCSAqIGEgYml0IHdoaWNoIGVuYWJsZXMgYWNjZXNzIHRvIHRoZSBHUElPIHJlZ2lzdGVycy4KLQkgKiBXaGF0IGx1bmF0aWMgY2FtZSB1cCB3aXRoIHRoaXMgc2hpdD8KLQkgKi8KLQlvdXRiX3AoU0lPX0RFVl9TRUwsIFNJT19JTkRFWCk7Ci0Jb3V0Yl9wKFNJT19QTV9ERVYsIFNJT19EQVRBKTsJLyogVGFsayB0byBHUElPIHJlZ3MuICovCi0KLQlvdXRiX3AoU0lPX0RFVl9NU0IsIFNJT19JTkRFWCk7Ci0Jb3V0Yl9wKFNJT19QTV9NU0IsIFNJT19EQVRBKTsJLyogTVNCIG9mIFBNIGJhc2UgYWRkcmVzcyAqLwotCi0Jb3V0Yl9wKFNJT19ERVZfTFNCLCBTSU9fSU5ERVgpOwotCW91dGJfcChTSU9fUE1fTFNCLCBTSU9fREFUQSk7CS8qIExTQiBvZiBQTSBiYXNlIGFkZHJlc3MgKi8KLQotCW91dGJfcChTSU9fREVWX0VOQiwgU0lPX0lOREVYKTsKLQlvdXRiX3AoMSwgU0lPX0RBVEEpOwkJLyogRW5hYmxlIFBNIHJlZ2lzdGVycy4gKi8KLQotCS8qCi0JICogTm93LCB3cml0ZSB0aGUgUE0gcmVnaXN0ZXIgd2hpY2ggZW5hYmxlcyB0aGUgR1BJTyByZWdpc3RlcnMuCi0JICovCi0Jb3V0Yl9wKFNJT19QTV9GRVIyLCBTSU9fUE1fSU5ERVgpOwotCW91dGJfcChTSU9fUE1fR1BfRU4sIFNJT19QTV9EQVRBKTsKLQotCS8qCi0JICogTm93LCBpbml0aWFsaXplIHRoZSBHUElPIHJlZ2lzdGVycy4KLQkgKiBXZSB3YW50IHRoZW0gYWxsIHRvIGJlIGlucHV0cyB3aGljaCBpcyB0aGUKLQkgKiBwb3dlciBvbiBkZWZhdWx0LCBzbyBsZXQncyBsZWF2ZSB0aGVtIGFsb25lLgotCSAqIFNvLCBsZXQncyBqdXN0IHJlYWQgdGhlIGJvYXJkIHJldiEKLQkgKi8KLQlyYXcgPSBpbmJfcChTSU9fR1BfREFUQTEpOwotCXJhdyAmPSAweDdmOwkvKiA3IGJpdHMgb2YgdmFsaWQgYm9hcmQgcmV2aXNpb24gSUQuICovCi0KLQlpZiAodmlzd3NfYm9hcmRfdHlwZSA9PSBWSVNXU18zMjApIHsKLQkJaWYgKHJhdyA8IDB4NikgewotCQkJdmlzd3NfYm9hcmRfcmV2ID0gNDsKLQkJfSBlbHNlIGlmIChyYXcgPCAweGMpIHsKLQkJCXZpc3dzX2JvYXJkX3JldiA9IDU7Ci0JCX0gZWxzZSB7Ci0JCQl2aXN3c19ib2FyZF9yZXYgPSA2OwotCQl9Ci0JfSBlbHNlIGlmICh2aXN3c19ib2FyZF90eXBlID09IFZJU1dTXzU0MCkgewotCQkJdmlzd3NfYm9hcmRfcmV2ID0gMjsKLQkJfSBlbHNlIHsKLQkJCXZpc3dzX2JvYXJkX3JldiA9IHJhdzsKLQkJfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAiU2lsaWNvbiBHcmFwaGljcyBWaXN1YWwgV29ya3N0YXRpb24gJXMgKHJldiAlZCkgZGV0ZWN0ZWRcbiIsCi0JICAgICAgICh2aXN3c19ib2FyZF90eXBlID09IFZJU1dTXzMyMCA/ICIzMjAiIDoKLQkgICAgICAgKHZpc3dzX2JvYXJkX3R5cGUgPT0gVklTV1NfNTQwID8gIjU0MCIgOgotCQkidW5rbm93biIpKSwgdmlzd3NfYm9hcmRfcmV2KTsKLX0KLQotI2RlZmluZSBBMDEyMzQgKExJX0lOVEFfMCB8IExJX0lOVEFfMSB8IExJX0lOVEFfMiB8IExJX0lOVEFfMyB8IExJX0lOVEFfNCkKLSNkZWZpbmUgQkNEIChMSV9JTlRCIHwgTElfSU5UQyB8IExJX0lOVEQpCi0jZGVmaW5lIEFMTERFVlMgKEEwMTIzNCB8IEJDRCkKLQotc3RhdGljIF9faW5pdCB2b2lkIGxpdGhpdW1faW5pdCh2b2lkKQotewotCXNldF9maXhtYXAoRklYX0xJX1BDSUEsIExJX1BDSV9BX1BIWVMpOwotCXNldF9maXhtYXAoRklYX0xJX1BDSUIsIExJX1BDSV9CX1BIWVMpOwotCi0JaWYgKChsaV9wY2lhX3JlYWQxNihQQ0lfVkVORE9SX0lEKSAhPSBQQ0lfVkVORE9SX0lEX1NHSSkgfHwKLQkgICAgKGxpX3BjaWFfcmVhZDE2KFBDSV9ERVZJQ0VfSUQpICE9IFBDSV9ERVZJQ0VfSURfU0dJX0xJVEhJVU0pKSB7Ci0JCXByaW50ayhLRVJOX0VNRVJHICJMaXRoaXVtIGhvc3RicmlkZ2UgJWMgbm90IGZvdW5kXG4iLCAnQScpOwotLyoJCXBhbmljKCJUaGlzIG1hY2hpbmUgaXMgbm90IFNHSSBWaXN1YWwgV29ya3N0YXRpb24gMzIwLzU0MCIpOyAqLwotCX0KLQotCWlmICgobGlfcGNpYl9yZWFkMTYoUENJX1ZFTkRPUl9JRCkgIT0gUENJX1ZFTkRPUl9JRF9TR0kpIHx8Ci0JICAgIChsaV9wY2liX3JlYWQxNihQQ0lfREVWSUNFX0lEKSAhPSBQQ0lfREVWSUNFX0lEX1NHSV9MSVRISVVNKSkgewotCQlwcmludGsoS0VSTl9FTUVSRyAiTGl0aGl1bSBob3N0YnJpZGdlICVjIG5vdCBmb3VuZFxuIiwgJ0InKTsKLS8qCQlwYW5pYygiVGhpcyBtYWNoaW5lIGlzIG5vdCBTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIDMyMC81NDAiKTsgKi8KLQl9Ci0KLQlsaV9wY2lhX3dyaXRlMTYoTElfUENJX0lOVEVOLCBBTExERVZTKTsKLQlsaV9wY2liX3dyaXRlMTYoTElfUENJX0lOVEVOLCBBTExERVZTKTsKLX0KLQotc3RhdGljIF9faW5pdCB2b2lkIGNvYmFsdF9pbml0KHZvaWQpCi17Ci0JLyoKLQkgKiBPbiBub3JtYWwgU01QIFBDIHRoaXMgaXMgdXNlZCBvbmx5IHdpdGggU01QLCBidXQgd2UgaGF2ZSB0bwotCSAqIHVzZSBpdCBhbmQgc2V0IGl0IHVwIGhlcmUgdG8gc3RhcnQgdGhlIENvYmFsdCBjbG9jawotCSAqLwotCXNldF9maXhtYXAoRklYX0FQSUNfQkFTRSwgQVBJQ19ERUZBVUxUX1BIWVNfQkFTRSk7Ci0Jc2V0dXBfbG9jYWxfQVBJQygpOwotCXByaW50ayhLRVJOX0lORk8gIkxvY2FsIEFQSUMgVmVyc2lvbiAlI3gsIElEICUjeFxuIiwKLQkJKHVuc2lnbmVkIGludClhcGljX3JlYWQoQVBJQ19MVlIpLAotCQkodW5zaWduZWQgaW50KWFwaWNfcmVhZChBUElDX0lEKSk7Ci0KLQlzZXRfZml4bWFwKEZJWF9DT19DUFUsIENPX0NQVV9QSFlTKTsKLQlzZXRfZml4bWFwKEZJWF9DT19BUElDLCBDT19BUElDX1BIWVMpOwotCXByaW50ayhLRVJOX0lORk8gIkNvYmFsdCBSZXZpc2lvbiAlI2x4LCBBUElDIElEICUjbHhcbiIsCi0JCWNvX2NwdV9yZWFkKENPX0NQVV9SRVYpLCBjb19hcGljX3JlYWQoQ09fQVBJQ19JRCkpOwotCi0JLyogRW5hYmxlIENvYmFsdCBBUElDIGJlaW5nIGNhcmVmdWwgdG8gTk9UIGNoYW5nZSB0aGUgSUQhICovCi0JY29fYXBpY193cml0ZShDT19BUElDX0lELCBjb19hcGljX3JlYWQoQ09fQVBJQ19JRCkgfCBDT19BUElDX0VOQUJMRSk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJDb2JhbHQgQVBJQyBlbmFibGVkOiBJRCByZWcgJSNseFxuIiwKLQkJY29fYXBpY19yZWFkKENPX0FQSUNfSUQpKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHZpc3dzX3RyYXBfaW5pdCh2b2lkKQotewotCWxpdGhpdW1faW5pdCgpOwotCWNvYmFsdF9pbml0KCk7Ci19Ci0KLS8qCi0gKiBJUlEgY29udHJvbGxlciAvIEFQSUMgc3VwcG9ydDoKLSAqLwotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNvYmFsdF9sb2NrKTsKLQotLyoKLSAqIFNldCB0aGUgZ2l2ZW4gQ29iYWx0IEFQSUMgUmVkaXJlY3Rpb24gVGFibGUgZW50cnkgdG8gcG9pbnQKLSAqIHRvIHRoZSBnaXZlbiBJRFQgdmVjdG9yL2luZGV4LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY29fYXBpY19zZXQoaW50IGVudHJ5LCBpbnQgaXJxKQotewotCWNvX2FwaWNfd3JpdGUoQ09fQVBJQ19MTyhlbnRyeSksIENPX0FQSUNfTEVWRUwgfCAoaXJxICsgRklSU1RfRVhURVJOQUxfVkVDVE9SKSk7Ci0JY29fYXBpY193cml0ZShDT19BUElDX0hJKGVudHJ5KSwgMCk7Ci19Ci0KLS8qCi0gKiBDb2JhbHQgKElPKS1BUElDIGZ1bmN0aW9ucyB0byBoYW5kbGUgUENJIGRldmljZXMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNvX2FwaWNfaWRlMF9oYWNrKHZvaWQpCi17Ci0JZXh0ZXJuIGNoYXIgdmlzd3NfYm9hcmRfdHlwZTsKLQlleHRlcm4gY2hhciB2aXN3c19ib2FyZF9yZXY7Ci0KLQlpZiAodmlzd3NfYm9hcmRfdHlwZSA9PSBWSVNXU18zMjAgJiYgdmlzd3NfYm9hcmRfcmV2ID09IDUpCi0JCXJldHVybiA1OwotCXJldHVybiBDT19BUElDX0lERTA7Ci19Ci0KLXN0YXRpYyBpbnQgaXNfY29fYXBpYyh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlmIChJU19DT19BUElDKGlycSkpCi0JCXJldHVybiBDT19BUElDKGlycSk7Ci0KLQlzd2l0Y2ggKGlycSkgewotCQljYXNlIDA6IHJldHVybiBDT19BUElDX0NQVTsKLQkJY2FzZSBDT19JUlFfSURFMDogcmV0dXJuIGNvX2FwaWNfaWRlMF9oYWNrKCk7Ci0JCWNhc2UgQ09fSVJRX0lERTE6IHJldHVybiBDT19BUElDX0lERTE7Ci0JCWRlZmF1bHQ6IHJldHVybiAtMTsKLQl9Ci19Ci0KLQotLyoKLSAqIFRoaXMgaXMgdGhlIFNHSSBDb2JhbHQgKElPLSlBUElDOgotICovCi1zdGF0aWMgdm9pZCBlbmFibGVfY29iYWx0X2lycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci0JY29fYXBpY19zZXQoaXNfY29fYXBpYyhkYXRhLT5pcnEpLCBkYXRhLT5pcnEpOwotfQotCi1zdGF0aWMgdm9pZCBkaXNhYmxlX2NvYmFsdF9pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhKQotewotCWludCBlbnRyeSA9IGlzX2NvX2FwaWMoZGF0YS0+aXJxKTsKLQotCWNvX2FwaWNfd3JpdGUoQ09fQVBJQ19MTyhlbnRyeSksIENPX0FQSUNfTUFTSyk7Ci0JY29fYXBpY19yZWFkKENPX0FQSUNfTE8oZW50cnkpKTsKLX0KLQotc3RhdGljIHZvaWQgYWNrX2NvYmFsdF9pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY29iYWx0X2xvY2ssIGZsYWdzKTsKLQlkaXNhYmxlX2NvYmFsdF9pcnEoZGF0YSk7Ci0JYXBpY193cml0ZShBUElDX0VPSSwgQVBJQ19FT0lfQUNLKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb2JhbHRfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGNvYmFsdF9pcnFfdHlwZSA9IHsKLQkubmFtZQkJPSAiQ29iYWx0LUFQSUMiLAotCS5pcnFfZW5hYmxlCT0gZW5hYmxlX2NvYmFsdF9pcnEsCi0JLmlycV9kaXNhYmxlCT0gZGlzYWJsZV9jb2JhbHRfaXJxLAotCS5pcnFfYWNrCT0gYWNrX2NvYmFsdF9pcnEsCi19OwotCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSBQSUlYNC1iYXNlZCA4MjU5IHRoYXQgaXMgd2lyZWQgdXAgaW5kaXJlY3RseSB0byBDb2JhbHQKLSAqIC0tIG5vdCB0aGUgbWFubmVyIGV4cGVjdGVkIGJ5IHRoZSBjb2RlIGluIGk4MjU5LmMuCi0gKgotICogdGhlcmUgaXMgYSAnbWFzdGVyJyBwaHlzaWNhbCBpbnRlcnJ1cHQgc291cmNlIHRoYXQgZ2V0cyBzZW50IHRvCi0gKiB0aGUgQ1BVLiBCdXQgaW4gdGhlIGNoaXBzZXQgdGhlcmUgYXJlIHZhcmlvdXMgJ3ZpcnR1YWwnIGludGVycnVwdHMKLSAqIHdhaXRpbmcgdG8gYmUgaGFuZGxlZC4gV2UgcmVwcmVzZW50IHRoaXMgdG8gTGludXggdGhyb3VnaCBhICdtYXN0ZXInCi0gKiBpbnRlcnJ1cHQgY29udHJvbGxlciB0eXBlLCBhbmQgdGhyb3VnaCBhIHNwZWNpYWwgdmlydHVhbCBpbnRlcnJ1cHQtCi0gKiBjb250cm9sbGVyLiBEZXZpY2UgZHJpdmVycyBvbmx5IHNlZSB0aGUgdmlydHVhbCBpbnRlcnJ1cHQgc291cmNlcy4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3BpaXg0X21hc3Rlcl9pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhKQotewotCWxlZ2FjeV9waWMtPmluaXQoMCk7Ci0JZW5hYmxlX2NvYmFsdF9pcnEoZGF0YSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcGlpeDRfbWFzdGVyX2lycV90eXBlID0gewotCS5uYW1lCQk9ICJQSUlYNC1tYXN0ZXIiLAotCS5pcnFfc3RhcnR1cAk9IHN0YXJ0dXBfcGlpeDRfbWFzdGVyX2lycSwKLQkuaXJxX2Fjawk9IGFja19jb2JhbHRfaXJxLAotfTsKLQotc3RhdGljIHZvaWQgcGlpNF9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkgeyB9Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcGlpeDRfdmlydHVhbF9pcnFfdHlwZSA9IHsKLQkubmFtZQkJPSAiUElJWDQtdmlydHVhbCIsCi0JLmlycV9tYXNrCT0gcGlpNF9tYXNrLAotfTsKLQotLyoKLSAqIFBJSVg0LTgyNTkgbWFzdGVyL3ZpcnR1YWwgZnVuY3Rpb25zIHRvIGhhbmRsZSBpbnRlcnJ1cHQgcmVxdWVzdHMKLSAqIGZyb20gbGVnYWN5IGRldmljZXM6IGZsb3BweSwgcGFyYWxsZWwsIHNlcmlhbCwgcnRjLgotICoKLSAqIE5vbmUgb2YgdGhlc2UgZ2V0IENvYmFsdCBBUElDIGVudHJpZXMsIG5laXRoZXIgZG8gdGhleSBoYXZlIElEVAotICogZW50cmllcy4gVGhlc2UgaW50ZXJydXB0cyBhcmUgcHVyZWx5IHZpcnR1YWwgYW5kIGRpc3RyaWJ1dGVkIGZyb20KLSAqIHRoZSAnbWFzdGVyJyBpbnRlcnJ1cHQgc291cmNlOiBDT19JUlFfODI1OS4KLSAqCi0gKiBXaGVuIHRoZSA4MjU5IGludGVycnVwdHMgaXRzIGhhbmRsZXIgZmlndXJlcyBvdXQgd2hpY2ggb2YgdGhlc2UKLSAqIGRldmljZXMgaXMgaW50ZXJydXB0aW5nIGFuZCBkaXNwYXRjaGVzIHRvIGl0cyBoYW5kbGVyLgotICoKLSAqIENBUkVGVUw6IGRldmljZXMgc2VlIHRoZSAndmlydHVhbCcgaW50ZXJydXB0IG9ubHkuIFRodXMgZGlzYWJsZS8KLSAqIGVuYWJsZV9pcnEgZ2V0cyB0aGUgcmlnaHQgaXJxLiBUaGlzICdtYXN0ZXInIGlycSBpcyBuZXZlciBkaXJlY3RseQotICogbWFuaXB1bGF0ZWQgYnkgYW55IGRyaXZlci4KLSAqLwotc3RhdGljIGlycXJldHVybl90IHBpaXg0X21hc3Rlcl9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZWFsaXJxOwotCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZpODI1OUFfbG9jaywgZmxhZ3MpOwotCi0JLyogRmluZCBvdXQgd2hhdCdzIGludGVycnVwdGluZyBpbiB0aGUgUElJWDQgbWFzdGVyIDgyNTkgKi8KLQlvdXRiKDB4MGMsIDB4MjApOwkJLyogT0NXMyBQb2xsIGNvbW1hbmQgKi8KLQlyZWFsaXJxID0gaW5iKDB4MjApOwotCi0JLyoKLQkgKiBCaXQgNyA9PSAwIG1lYW5zIGludmFsaWQvc3B1cmlvdXMKLQkgKi8KLQlpZiAodW5saWtlbHkoIShyZWFsaXJxICYgMHg4MCkpKQotCQlnb3RvIG91dF91bmxvY2s7Ci0KLQlyZWFsaXJxICY9IDc7Ci0KLQlpZiAodW5saWtlbHkocmVhbGlycSA9PSAyKSkgewotCQlvdXRiKDB4MGMsIDB4YTApOwotCQlyZWFsaXJxID0gaW5iKDB4YTApOwotCi0JCWlmICh1bmxpa2VseSghKHJlYWxpcnEgJiAweDgwKSkpCi0JCQlnb3RvIG91dF91bmxvY2s7Ci0KLQkJcmVhbGlycSA9IChyZWFsaXJxICYgNykgKyA4OwotCX0KLQotCS8qIG1hc2sgYW5kIGFjayBpbnRlcnJ1cHQgKi8KLQljYWNoZWRfaXJxX21hc2sgfD0gMSA8PCByZWFsaXJxOwotCWlmICh1bmxpa2VseShyZWFsaXJxID4gNykpIHsKLQkJaW5iKDB4YTEpOwotCQlvdXRiKGNhY2hlZF9zbGF2ZV9tYXNrLCAweGExKTsKLQkJb3V0YigweDYwICsgKHJlYWxpcnEgJiA3KSwgMHhhMCk7Ci0JCW91dGIoMHg2MCArIDIsIDB4MjApOwotCX0gZWxzZSB7Ci0JCWluYigweDIxKTsKLQkJb3V0YihjYWNoZWRfbWFzdGVyX21hc2ssIDB4MjEpOwotCQlvdXRiKDB4NjAgKyByZWFsaXJxLCAweDIwKTsKLQl9Ci0KLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKLQotCS8qCi0JICogaGFuZGxlIHRoaXMgJ3ZpcnR1YWwgaW50ZXJydXB0JyBhcyBhIENvYmFsdCBvbmUgbm93LgotCSAqLwotCWdlbmVyaWNfaGFuZGxlX2lycShyZWFsaXJxKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLQotb3V0X3VubG9jazoKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gSVJRX05PTkU7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG1hc3Rlcl9hY3Rpb24gPSB7Ci0JLmhhbmRsZXIgPQlwaWl4NF9tYXN0ZXJfaW50ciwKLQkubmFtZSA9CQkiUElJWDQtODI1OSIsCi0JLmZsYWdzID0JSVJRRl9OT19USFJFQUQsCi19OwotCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBjYXNjYWRlX2FjdGlvbiA9IHsKLQkuaGFuZGxlciA9IAlub19hY3Rpb24sCi0JLm5hbWUgPQkJImNhc2NhZGUiLAotCS5mbGFncyA9CUlSUUZfTk9fVEhSRUFELAotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIHNldF9waWl4NF92aXJ0dWFsX2lycV90eXBlKHZvaWQpCi17Ci0JcGlpeDRfdmlydHVhbF9pcnFfdHlwZS5pcnFfZW5hYmxlID0gaTgyNTlBX2NoaXAuaXJxX3VubWFzazsKLQlwaWl4NF92aXJ0dWFsX2lycV90eXBlLmlycV9kaXNhYmxlID0gaTgyNTlBX2NoaXAuaXJxX21hc2s7Ci0JcGlpeDRfdmlydHVhbF9pcnFfdHlwZS5pcnFfdW5tYXNrID0gaTgyNTlBX2NoaXAuaXJxX3VubWFzazsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHZpc3dzX3ByZV9pbnRyX2luaXQodm9pZCkKLXsKLQlpbnQgaTsKLQotCXNldF9waWl4NF92aXJ0dWFsX2lycV90eXBlKCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQ09fSVJRX0FQSUMwICsgQ09fQVBJQ19MQVNUICsgMTsgaSsrKSB7Ci0JCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IE5VTEw7Ci0KLQkJaWYgKGkgPT0gMCkKLQkJCWNoaXAgPSAmY29iYWx0X2lycV90eXBlOwotCQllbHNlIGlmIChpID09IENPX0lSUV9JREUwKQotCQkJY2hpcCA9ICZjb2JhbHRfaXJxX3R5cGU7Ci0JCWVsc2UgaWYgKGkgPT0gQ09fSVJRX0lERTEpCi0JCQljaGlwID0gJmNvYmFsdF9pcnFfdHlwZTsKLQkJZWxzZSBpZiAoaSA9PSBDT19JUlFfODI1OSkKLQkJCWNoaXAgPSAmcGlpeDRfbWFzdGVyX2lycV90eXBlOwotCQllbHNlIGlmIChpIDwgQ09fSVJRX0FQSUMwKQotCQkJY2hpcCA9ICZwaWl4NF92aXJ0dWFsX2lycV90eXBlOwotCQllbHNlIGlmIChJU19DT19BUElDKGkpKQotCQkJY2hpcCA9ICZjb2JhbHRfaXJxX3R5cGU7Ci0KLQkJaWYgKGNoaXApCi0JCQlpcnFfc2V0X2NoaXAoaSwgY2hpcCk7Ci0JfQotCi0Jc2V0dXBfaXJxKENPX0lSUV84MjU5LCAmbWFzdGVyX2FjdGlvbik7Ci0Jc2V0dXBfaXJxKDIsICZjYXNjYWRlX2FjdGlvbik7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni90b29scy9yZWxvY3MuYyBiL2FyY2gveDg2L3Rvb2xzL3JlbG9jcy5jCmluZGV4IGNmYmRiZGIuLmJiYjFkMjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Rvb2xzL3JlbG9jcy5jCisrKyBiL2FyY2gveDg2L3Rvb2xzL3JlbG9jcy5jCkBAIC02OSw4ICs2OSw4IEBACiAJIl9fcGVyX2NwdV9sb2FkfCIKIAkiaW5pdF9wZXJfY3B1X18uKnwiCiAJIl9fZW5kX3JvZGF0YV9ocGFnZV9hbGlnbnwiCi0JIl9fdnZhcl9wYWdlfCIKICNlbmRpZgorCSJfX3Z2YXJfcGFnZXwiCiAJIl9lbmQpJCIKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Zkc28vTWFrZWZpbGUgYi9hcmNoL3g4Ni92ZHNvL01ha2VmaWxlCmluZGV4IDkyMDZhYzcuLmM1ODBkMTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Zkc28vTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvdmRzby9NYWtlZmlsZQpAQCAtMjMsNyArMjMsOCBAQAogdm9iajY0cyA6PSAkKGZpbHRlci1vdXQgJCh2b2JqeDMycy1jb21wYXQpLCQodm9ianMteSkpCiAKICMgZmlsZXMgdG8gbGluayBpbnRvIGtlcm5lbAotb2JqLSQoVkRTTzY0LXkpCQkJKz0gdm1hLm8gdmRzby5vCitvYmoteQkJCQkrPSB2bWEubworb2JqLSQoVkRTTzY0LXkpCQkJKz0gdmRzby5vCiBvYmotJChWRFNPWDMyLXkpCQkrPSB2ZHNveDMyLm8KIG9iai0kKFZEU08zMi15KQkJCSs9IHZkc28zMi5vIHZkc28zMi1zZXR1cC5vCiAKQEAgLTEzOCw3ICsxMzksNyBAQAogCiB0YXJnZXRzICs9IHZkc28zMi92ZHNvMzIubGRzCiB0YXJnZXRzICs9ICQodmRzbzMyLWltYWdlcykgJCh2ZHNvMzItaW1hZ2VzOj0uZGJnKQotdGFyZ2V0cyArPSB2ZHNvMzIvbm90ZS5vICQodmRzbzMyLnNvLXk6JT12ZHNvMzIvJS5vKQordGFyZ2V0cyArPSB2ZHNvMzIvbm90ZS5vIHZkc28zMi92Y2xvY2tfZ2V0dGltZS5vICQodmRzbzMyLnNvLXk6JT12ZHNvMzIvJS5vKQogCiBleHRyYS15CSs9ICQodmRzbzMyLWltYWdlcykKIApAQCAtMTQ4LDggKzE0OSwxOSBAQAogJCh2ZHNvMzItaW1hZ2VzOiU9JChvYmopLyUuZGJnKTogS0JVSUxEX0FGTEFHUyA9ICQoS0JVSUxEX0FGTEFHU18zMikKICQodmRzbzMyLWltYWdlczolPSQob2JqKS8lLmRiZyk6IGFzZmxhZ3MtJChDT05GSUdfWDg2XzY0KSArPSAtbTMyCiAKK0tCVUlMRF9DRkxBR1NfMzIgOj0gJChmaWx0ZXItb3V0IC1tNjQsJChLQlVJTERfQ0ZMQUdTKSkKK0tCVUlMRF9DRkxBR1NfMzIgOj0gJChmaWx0ZXItb3V0IC1tY21vZGVsPWtlcm5lbCwkKEtCVUlMRF9DRkxBR1NfMzIpKQorS0JVSUxEX0NGTEFHU18zMiA6PSAkKGZpbHRlci1vdXQgLWZuby1waWMsJChLQlVJTERfQ0ZMQUdTXzMyKSkKK0tCVUlMRF9DRkxBR1NfMzIgOj0gJChmaWx0ZXItb3V0IC1tZmVudHJ5LCQoS0JVSUxEX0NGTEFHU18zMikpCitLQlVJTERfQ0ZMQUdTXzMyICs9IC1tMzIgLW1zb2Z0LWZsb2F0IC1tcmVncGFybT0wIC1mcGljCitLQlVJTERfQ0ZMQUdTXzMyICs9ICQoY2FsbCBjYy1vcHRpb24sIC1mbm8tc3RhY2stcHJvdGVjdG9yKQorS0JVSUxEX0NGTEFHU18zMiArPSAkKGNhbGwgY2Mtb3B0aW9uLCAtZm9wdGltaXplLXNpYmxpbmctY2FsbHMpCitLQlVJTERfQ0ZMQUdTXzMyICs9IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyCiskKHZkc28zMi1pbWFnZXM6JT0kKG9iaikvJS5kYmcpOiBLQlVJTERfQ0ZMQUdTID0gJChLQlVJTERfQ0ZMQUdTXzMyKQorCiAkKHZkc28zMi1pbWFnZXM6JT0kKG9iaikvJS5kYmcpOiAkKG9iaikvdmRzbzMyLSUuc28uZGJnOiBGT1JDRSBcCiAJCQkJICQob2JqKS92ZHNvMzIvdmRzbzMyLmxkcyBcCisJCQkJICQob2JqKS92ZHNvMzIvdmNsb2NrX2dldHRpbWUubyBcCiAJCQkJICQob2JqKS92ZHNvMzIvbm90ZS5vIFwKIAkJCQkgJChvYmopL3Zkc28zMi8lLm8KIAkkKGNhbGwgaWZfY2hhbmdlZCx2ZHNvKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdmRzby92Y2xvY2tfZ2V0dGltZS5jIGIvYXJjaC94ODYvdmRzby92Y2xvY2tfZ2V0dGltZS5jCmluZGV4IGViNWQ3YTUuLjE2ZDY4NjEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Zkc28vdmNsb2NrX2dldHRpbWUuYworKysgYi9hcmNoL3g4Ni92ZHNvL3ZjbG9ja19nZXR0aW1lLmMKQEAgLTQsNiArNCw5IEBACiAgKgogICogRmFzdCB1c2VyIGNvbnRleHQgaW1wbGVtZW50YXRpb24gb2YgY2xvY2tfZ2V0dGltZSwgZ2V0dGltZW9mZGF5LCBhbmQgdGltZS4KICAqCisgKiAzMiBCaXQgY29tcGF0IGxheWVyIGJ5IFN0ZWZhbmkgU2VpYm9sZCA8c3RlZmFuaUBzZWlib2xkLm5ldD4KKyAqICBzcG9uc29yZWQgYnkgUm9oZGUgJiBTY2h3YXJ6IEdtYkggJiBDby4gS0cgTXVuaWNoL0dlcm1hbnkKKyAqCiAgKiBUaGUgY29kZSBzaG91bGQgaGF2ZSBubyBpbnRlcm5hbCB1bnJlc29sdmVkIHJlbG9jYXRpb25zLgogICogQ2hlY2sgd2l0aCByZWFkZWxmIGFmdGVyIGNoYW5naW5nLgogICovCkBAIC0xMSw1NiArMTQsNTUgQEAKIC8qIERpc2FibGUgcHJvZmlsaW5nIGZvciB1c2Vyc3BhY2UgY29kZTogKi8KICNkZWZpbmUgRElTQUJMRV9CUkFOQ0hfUFJPRklMSU5HCiAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wb3NpeC10aW1lcnMuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8YXNtL3ZzeXNjYWxsLmg+Ci0jaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvdGltZS5oPgogI2luY2x1ZGUgPGFzbS92Z3RvZC5oPgotI2luY2x1ZGUgPGFzbS90aW1leC5oPgogI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CisjaW5jbHVkZSA8YXNtL3Z2YXIuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3B2Y2xvY2suaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgogCiAjZGVmaW5lIGd0b2QgKCZWVkFSKHZzeXNjYWxsX2d0b2RfZGF0YSkpCiAKLW5vdHJhY2Ugc3RhdGljIGN5Y2xlX3QgdnJlYWRfdHNjKHZvaWQpCitleHRlcm4gaW50IF9fdmRzb19jbG9ja19nZXR0aW1lKGNsb2NraWRfdCBjbG9jaywgc3RydWN0IHRpbWVzcGVjICp0cyk7CitleHRlcm4gaW50IF9fdmRzb19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2LCBzdHJ1Y3QgdGltZXpvbmUgKnR6KTsKK2V4dGVybiB0aW1lX3QgX192ZHNvX3RpbWUodGltZV90ICp0KTsKKworI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCitzdGF0aWMgaW5saW5lIHUzMiByZWFkX2hwZXRfY291bnRlcihjb25zdCB2b2xhdGlsZSB2b2lkICphZGRyKQogewotCWN5Y2xlX3QgcmV0OwotCXU2NCBsYXN0OwotCi0JLyoKLQkgKiBFbXBpcmljYWxseSwgYSBmZW5jZSAob2YgdHlwZSB0aGF0IGRlcGVuZHMgb24gdGhlIENQVSkKLQkgKiBiZWZvcmUgcmR0c2MgaXMgZW5vdWdoIHRvIGVuc3VyZSB0aGF0IHJkdHNjIGlzIG9yZGVyZWQKLQkgKiB3aXRoIHJlc3BlY3QgdG8gbG9hZHMuICBUaGUgdmFyaW91cyBDUFUgbWFudWFscyBhcmUgdW5jbGVhcgotCSAqIGFzIHRvIHdoZXRoZXIgcmR0c2MgY2FuIGJlIHJlb3JkZXJlZCB3aXRoIGxhdGVyIGxvYWRzLAotCSAqIGJ1dCBubyBvbmUgaGFzIGV2ZXIgc2VlbiBpdCBoYXBwZW4uCi0JICovCi0JcmR0c2NfYmFycmllcigpOwotCXJldCA9IChjeWNsZV90KXZnZXRfY3ljbGVzKCk7Ci0KLQlsYXN0ID0gVlZBUih2c3lzY2FsbF9ndG9kX2RhdGEpLmNsb2NrLmN5Y2xlX2xhc3Q7Ci0KLQlpZiAobGlrZWx5KHJldCA+PSBsYXN0KSkKLQkJcmV0dXJuIHJldDsKLQotCS8qCi0JICogR0NDIGxpa2VzIHRvIGdlbmVyYXRlIGNtb3YgaGVyZSwgYnV0IHRoaXMgYnJhbmNoIGlzIGV4dHJlbWVseQotCSAqIHByZWRpY3RhYmxlIChpdCdzIGp1c3QgYSBmdW5jaXRvbiBvZiB0aW1lIGFuZCB0aGUgbGlrZWx5IGlzCi0JICogdmVyeSBsaWtlbHkpIGFuZCB0aGVyZSdzIGEgZGF0YSBkZXBlbmRlbmNlLCBzbyBmb3JjZSBHQ0MKLQkgKiB0byBnZW5lcmF0ZSBhIGJyYW5jaCBpbnN0ZWFkLiAgSSBkb24ndCBiYXJyaWVyKCkgYmVjYXVzZQotCSAqIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgYSBiYXJyaWVyLCBhbmQgaWYgdGhpcyBmdW5jdGlvbgotCSAqIGV2ZXIgZ2V0cyBpbmxpbmVkIGl0IHdpbGwgZ2VuZXJhdGUgd29yc2UgY29kZS4KLQkgKi8KLQlhc20gdm9sYXRpbGUgKCIiKTsKLQlyZXR1cm4gbGFzdDsKKwlyZXR1cm4gKihjb25zdCB2b2xhdGlsZSB1MzIgKikgKGFkZHIgKyBIUEVUX0NPVU5URVIpOwogfQorI2VuZGlmCisKKyNpZm5kZWYgQlVJTERfVkRTTzMyCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vdnN5c2NhbGwuaD4KKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSA8YXNtL3B2Y2xvY2suaD4KIAogc3RhdGljIG5vdHJhY2UgY3ljbGVfdCB2cmVhZF9ocGV0KHZvaWQpCiB7Ci0JcmV0dXJuIHJlYWRsKChjb25zdCB2b2lkIF9faW9tZW0gKilmaXhfdG9fdmlydChWU1lTQ0FMTF9IUEVUKSArIEhQRVRfQ09VTlRFUik7CisJcmV0dXJuIHJlYWRfaHBldF9jb3VudGVyKChjb25zdCB2b2lkICopZml4X3RvX3ZpcnQoVlNZU0NBTExfSFBFVCkpOworfQorCitub3RyYWNlIHN0YXRpYyBsb25nIHZkc29fZmFsbGJhY2tfZ2V0dGltZShsb25nIGNsb2NrLCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQoreworCWxvbmcgcmV0OworCWFzbSgic3lzY2FsbCIgOiAiPWEiIChyZXQpIDoKKwkgICAgIjAiIChfX05SX2Nsb2NrX2dldHRpbWUpLCAiRCIgKGNsb2NrKSwgIlMiICh0cykgOiAibWVtb3J5Iik7CisJcmV0dXJuIHJldDsKK30KKworbm90cmFjZSBzdGF0aWMgbG9uZyB2ZHNvX2ZhbGxiYWNrX2d0b2Qoc3RydWN0IHRpbWV2YWwgKnR2LCBzdHJ1Y3QgdGltZXpvbmUgKnR6KQoreworCWxvbmcgcmV0OworCisJYXNtKCJzeXNjYWxsIiA6ICI9YSIgKHJldCkgOgorCSAgICAiMCIgKF9fTlJfZ2V0dGltZW9mZGF5KSwgIkQiICh0diksICJTIiAodHopIDogIm1lbW9yeSIpOworCXJldHVybiByZXQ7CiB9CiAKICNpZmRlZiBDT05GSUdfUEFSQVZJUlRfQ0xPQ0sKQEAgLTEyNCw3ICsxMjYsNyBAQAogCQkqbW9kZSA9IFZDTE9DS19OT05FOwogCiAJLyogcmVmZXIgdG8gdHNjLmMgcmVhZF90c2MoKSBjb21tZW50IGZvciByYXRpb25hbGUgKi8KLQlsYXN0ID0gVlZBUih2c3lzY2FsbF9ndG9kX2RhdGEpLmNsb2NrLmN5Y2xlX2xhc3Q7CisJbGFzdCA9IGd0b2QtPmN5Y2xlX2xhc3Q7CiAKIAlpZiAobGlrZWx5KHJldCA+PSBsYXN0KSkKIAkJcmV0dXJuIHJldDsKQEAgLTEzMywxMSArMTM1LDMwIEBACiB9CiAjZW5kaWYKIAorI2Vsc2UKKworZXh0ZXJuIHU4IGhwZXRfcGFnZQorCV9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSk7CisKKyNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgorc3RhdGljIG5vdHJhY2UgY3ljbGVfdCB2cmVhZF9ocGV0KHZvaWQpCit7CisJcmV0dXJuIHJlYWRfaHBldF9jb3VudGVyKChjb25zdCB2b2lkICopKCZocGV0X3BhZ2UpKTsKK30KKyNlbmRpZgorCiBub3RyYWNlIHN0YXRpYyBsb25nIHZkc29fZmFsbGJhY2tfZ2V0dGltZShsb25nIGNsb2NrLCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQogewogCWxvbmcgcmV0OwotCWFzbSgic3lzY2FsbCIgOiAiPWEiIChyZXQpIDoKLQkgICAgIjAiIChfX05SX2Nsb2NrX2dldHRpbWUpLCJEIiAoY2xvY2spLCAiUyIgKHRzKSA6ICJtZW1vcnkiKTsKKworCWFzbSgKKwkJIm1vdiAlJWVieCwgJSVlZHggXG4iCisJCSJtb3YgJTIsICUlZWJ4IFxuIgorCQkiY2FsbCBWRFNPMzJfdnN5c2NhbGwgXG4iCisJCSJtb3YgJSVlZHgsICUlZWJ4IFxuIgorCQk6ICI9YSIgKHJldCkKKwkJOiAiMCIgKF9fTlJfY2xvY2tfZ2V0dGltZSksICJnIiAoY2xvY2spLCAiYyIgKHRzKQorCQk6ICJtZW1vcnkiLCAiZWR4Iik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTQ1LDI4ICsxNjYsNzkgQEAKIHsKIAlsb25nIHJldDsKIAotCWFzbSgic3lzY2FsbCIgOiAiPWEiIChyZXQpIDoKLQkgICAgIjAiIChfX05SX2dldHRpbWVvZmRheSksICJEIiAodHYpLCAiUyIgKHR6KSA6ICJtZW1vcnkiKTsKKwlhc20oCisJCSJtb3YgJSVlYngsICUlZWR4IFxuIgorCQkibW92ICUyLCAlJWVieCBcbiIKKwkJImNhbGwgVkRTTzMyX3ZzeXNjYWxsIFxuIgorCQkibW92ICUlZWR4LCAlJWVieCBcbiIKKwkJOiAiPWEiIChyZXQpCisJCTogIjAiIChfX05SX2dldHRpbWVvZmRheSksICJnIiAodHYpLCAiYyIgKHR6KQorCQk6ICJtZW1vcnkiLCAiZWR4Iik7CiAJcmV0dXJuIHJldDsKIH0KIAorI2lmZGVmIENPTkZJR19QQVJBVklSVF9DTE9DSworCitzdGF0aWMgbm90cmFjZSBjeWNsZV90IHZyZWFkX3B2Y2xvY2soaW50ICptb2RlKQoreworCSptb2RlID0gVkNMT0NLX05PTkU7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2VuZGlmCisKK25vdHJhY2Ugc3RhdGljIGN5Y2xlX3QgdnJlYWRfdHNjKHZvaWQpCit7CisJY3ljbGVfdCByZXQ7CisJdTY0IGxhc3Q7CisKKwkvKgorCSAqIEVtcGlyaWNhbGx5LCBhIGZlbmNlIChvZiB0eXBlIHRoYXQgZGVwZW5kcyBvbiB0aGUgQ1BVKQorCSAqIGJlZm9yZSByZHRzYyBpcyBlbm91Z2ggdG8gZW5zdXJlIHRoYXQgcmR0c2MgaXMgb3JkZXJlZAorCSAqIHdpdGggcmVzcGVjdCB0byBsb2Fkcy4gIFRoZSB2YXJpb3VzIENQVSBtYW51YWxzIGFyZSB1bmNsZWFyCisJICogYXMgdG8gd2hldGhlciByZHRzYyBjYW4gYmUgcmVvcmRlcmVkIHdpdGggbGF0ZXIgbG9hZHMsCisJICogYnV0IG5vIG9uZSBoYXMgZXZlciBzZWVuIGl0IGhhcHBlbi4KKwkgKi8KKwlyZHRzY19iYXJyaWVyKCk7CisJcmV0ID0gKGN5Y2xlX3QpX19uYXRpdmVfcmVhZF90c2MoKTsKKworCWxhc3QgPSBndG9kLT5jeWNsZV9sYXN0OworCisJaWYgKGxpa2VseShyZXQgPj0gbGFzdCkpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIEdDQyBsaWtlcyB0byBnZW5lcmF0ZSBjbW92IGhlcmUsIGJ1dCB0aGlzIGJyYW5jaCBpcyBleHRyZW1lbHkKKwkgKiBwcmVkaWN0YWJsZSAoaXQncyBqdXN0IGEgZnVuY2l0b24gb2YgdGltZSBhbmQgdGhlIGxpa2VseSBpcworCSAqIHZlcnkgbGlrZWx5KSBhbmQgdGhlcmUncyBhIGRhdGEgZGVwZW5kZW5jZSwgc28gZm9yY2UgR0NDCisJICogdG8gZ2VuZXJhdGUgYSBicmFuY2ggaW5zdGVhZC4gIEkgZG9uJ3QgYmFycmllcigpIGJlY2F1c2UKKwkgKiB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIGEgYmFycmllciwgYW5kIGlmIHRoaXMgZnVuY3Rpb24KKwkgKiBldmVyIGdldHMgaW5saW5lZCBpdCB3aWxsIGdlbmVyYXRlIHdvcnNlIGNvZGUuCisJICovCisJYXNtIHZvbGF0aWxlICgiIik7CisJcmV0dXJuIGxhc3Q7Cit9CiAKIG5vdHJhY2Ugc3RhdGljIGlubGluZSB1NjQgdmdldHNucyhpbnQgKm1vZGUpCiB7Ci0JbG9uZyB2OworCXU2NCB2OwogCWN5Y2xlc190IGN5Y2xlczsKLQlpZiAoZ3RvZC0+Y2xvY2sudmNsb2NrX21vZGUgPT0gVkNMT0NLX1RTQykKKworCWlmIChndG9kLT52Y2xvY2tfbW9kZSA9PSBWQ0xPQ0tfVFNDKQogCQljeWNsZXMgPSB2cmVhZF90c2MoKTsKLQllbHNlIGlmIChndG9kLT5jbG9jay52Y2xvY2tfbW9kZSA9PSBWQ0xPQ0tfSFBFVCkKKyNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgorCWVsc2UgaWYgKGd0b2QtPnZjbG9ja19tb2RlID09IFZDTE9DS19IUEVUKQogCQljeWNsZXMgPSB2cmVhZF9ocGV0KCk7CisjZW5kaWYKICNpZmRlZiBDT05GSUdfUEFSQVZJUlRfQ0xPQ0sKLQllbHNlIGlmIChndG9kLT5jbG9jay52Y2xvY2tfbW9kZSA9PSBWQ0xPQ0tfUFZDTE9DSykKKwllbHNlIGlmIChndG9kLT52Y2xvY2tfbW9kZSA9PSBWQ0xPQ0tfUFZDTE9DSykKIAkJY3ljbGVzID0gdnJlYWRfcHZjbG9jayhtb2RlKTsKICNlbmRpZgogCWVsc2UKIAkJcmV0dXJuIDA7Ci0JdiA9IChjeWNsZXMgLSBndG9kLT5jbG9jay5jeWNsZV9sYXN0KSAmIGd0b2QtPmNsb2NrLm1hc2s7Ci0JcmV0dXJuIHYgKiBndG9kLT5jbG9jay5tdWx0OworCXYgPSAoY3ljbGVzIC0gZ3RvZC0+Y3ljbGVfbGFzdCkgJiBndG9kLT5tYXNrOworCXJldHVybiB2ICogZ3RvZC0+bXVsdDsKIH0KIAogLyogQ29kZSBzaXplIGRvZXNuJ3QgbWF0dGVyICh2ZHNvIGlzIDRrIGFueXdheSkgYW5kIHRoaXMgaXMgZmFzdGVyLiAqLwpAQCAtMTc2LDEwNiArMjQ4LDEwMiBAQAogCXU2NCBuczsKIAlpbnQgbW9kZTsKIAotCXRzLT50dl9uc2VjID0gMDsKIAlkbyB7Ci0JCXNlcSA9IHJhd19yZWFkX3NlcWNvdW50X2JlZ2luKCZndG9kLT5zZXEpOwotCQltb2RlID0gZ3RvZC0+Y2xvY2sudmNsb2NrX21vZGU7CisJCXNlcSA9IGd0b2RfcmVhZF9iZWdpbihndG9kKTsKKwkJbW9kZSA9IGd0b2QtPnZjbG9ja19tb2RlOwogCQl0cy0+dHZfc2VjID0gZ3RvZC0+d2FsbF90aW1lX3NlYzsKIAkJbnMgPSBndG9kLT53YWxsX3RpbWVfc25zZWM7CiAJCW5zICs9IHZnZXRzbnMoJm1vZGUpOwotCQlucyA+Pj0gZ3RvZC0+Y2xvY2suc2hpZnQ7Ci0JfSB3aGlsZSAodW5saWtlbHkocmVhZF9zZXFjb3VudF9yZXRyeSgmZ3RvZC0+c2VxLCBzZXEpKSk7CisJCW5zID4+PSBndG9kLT5zaGlmdDsKKwl9IHdoaWxlICh1bmxpa2VseShndG9kX3JlYWRfcmV0cnkoZ3RvZCwgc2VxKSkpOwogCi0JdGltZXNwZWNfYWRkX25zKHRzLCBucyk7CisJdHMtPnR2X3NlYyArPSBfX2l0ZXJfZGl2X3U2NF9yZW0obnMsIE5TRUNfUEVSX1NFQywgJm5zKTsKKwl0cy0+dHZfbnNlYyA9IG5zOworCiAJcmV0dXJuIG1vZGU7CiB9CiAKLW5vdHJhY2Ugc3RhdGljIGludCBkb19tb25vdG9uaWMoc3RydWN0IHRpbWVzcGVjICp0cykKK25vdHJhY2Ugc3RhdGljIGludCBfX2Fsd2F5c19pbmxpbmUgZG9fbW9ub3RvbmljKHN0cnVjdCB0aW1lc3BlYyAqdHMpCiB7CiAJdW5zaWduZWQgbG9uZyBzZXE7CiAJdTY0IG5zOwogCWludCBtb2RlOwogCi0JdHMtPnR2X25zZWMgPSAwOwogCWRvIHsKLQkJc2VxID0gcmF3X3JlYWRfc2VxY291bnRfYmVnaW4oJmd0b2QtPnNlcSk7Ci0JCW1vZGUgPSBndG9kLT5jbG9jay52Y2xvY2tfbW9kZTsKKwkJc2VxID0gZ3RvZF9yZWFkX2JlZ2luKGd0b2QpOworCQltb2RlID0gZ3RvZC0+dmNsb2NrX21vZGU7CiAJCXRzLT50dl9zZWMgPSBndG9kLT5tb25vdG9uaWNfdGltZV9zZWM7CiAJCW5zID0gZ3RvZC0+bW9ub3RvbmljX3RpbWVfc25zZWM7CiAJCW5zICs9IHZnZXRzbnMoJm1vZGUpOwotCQlucyA+Pj0gZ3RvZC0+Y2xvY2suc2hpZnQ7Ci0JfSB3aGlsZSAodW5saWtlbHkocmVhZF9zZXFjb3VudF9yZXRyeSgmZ3RvZC0+c2VxLCBzZXEpKSk7Ci0JdGltZXNwZWNfYWRkX25zKHRzLCBucyk7CisJCW5zID4+PSBndG9kLT5zaGlmdDsKKwl9IHdoaWxlICh1bmxpa2VseShndG9kX3JlYWRfcmV0cnkoZ3RvZCwgc2VxKSkpOworCisJdHMtPnR2X3NlYyArPSBfX2l0ZXJfZGl2X3U2NF9yZW0obnMsIE5TRUNfUEVSX1NFQywgJm5zKTsKKwl0cy0+dHZfbnNlYyA9IG5zOwogCiAJcmV0dXJuIG1vZGU7CiB9CiAKLW5vdHJhY2Ugc3RhdGljIGludCBkb19yZWFsdGltZV9jb2Fyc2Uoc3RydWN0IHRpbWVzcGVjICp0cykKK25vdHJhY2Ugc3RhdGljIHZvaWQgZG9fcmVhbHRpbWVfY29hcnNlKHN0cnVjdCB0aW1lc3BlYyAqdHMpCiB7CiAJdW5zaWduZWQgbG9uZyBzZXE7CiAJZG8gewotCQlzZXEgPSByYXdfcmVhZF9zZXFjb3VudF9iZWdpbigmZ3RvZC0+c2VxKTsKLQkJdHMtPnR2X3NlYyA9IGd0b2QtPndhbGxfdGltZV9jb2Fyc2UudHZfc2VjOwotCQl0cy0+dHZfbnNlYyA9IGd0b2QtPndhbGxfdGltZV9jb2Fyc2UudHZfbnNlYzsKLQl9IHdoaWxlICh1bmxpa2VseShyZWFkX3NlcWNvdW50X3JldHJ5KCZndG9kLT5zZXEsIHNlcSkpKTsKLQlyZXR1cm4gMDsKKwkJc2VxID0gZ3RvZF9yZWFkX2JlZ2luKGd0b2QpOworCQl0cy0+dHZfc2VjID0gZ3RvZC0+d2FsbF90aW1lX2NvYXJzZV9zZWM7CisJCXRzLT50dl9uc2VjID0gZ3RvZC0+d2FsbF90aW1lX2NvYXJzZV9uc2VjOworCX0gd2hpbGUgKHVubGlrZWx5KGd0b2RfcmVhZF9yZXRyeShndG9kLCBzZXEpKSk7CiB9CiAKLW5vdHJhY2Ugc3RhdGljIGludCBkb19tb25vdG9uaWNfY29hcnNlKHN0cnVjdCB0aW1lc3BlYyAqdHMpCitub3RyYWNlIHN0YXRpYyB2b2lkIGRvX21vbm90b25pY19jb2Fyc2Uoc3RydWN0IHRpbWVzcGVjICp0cykKIHsKIAl1bnNpZ25lZCBsb25nIHNlcTsKIAlkbyB7Ci0JCXNlcSA9IHJhd19yZWFkX3NlcWNvdW50X2JlZ2luKCZndG9kLT5zZXEpOwotCQl0cy0+dHZfc2VjID0gZ3RvZC0+bW9ub3RvbmljX3RpbWVfY29hcnNlLnR2X3NlYzsKLQkJdHMtPnR2X25zZWMgPSBndG9kLT5tb25vdG9uaWNfdGltZV9jb2Fyc2UudHZfbnNlYzsKLQl9IHdoaWxlICh1bmxpa2VseShyZWFkX3NlcWNvdW50X3JldHJ5KCZndG9kLT5zZXEsIHNlcSkpKTsKLQotCXJldHVybiAwOworCQlzZXEgPSBndG9kX3JlYWRfYmVnaW4oZ3RvZCk7CisJCXRzLT50dl9zZWMgPSBndG9kLT5tb25vdG9uaWNfdGltZV9jb2Fyc2Vfc2VjOworCQl0cy0+dHZfbnNlYyA9IGd0b2QtPm1vbm90b25pY190aW1lX2NvYXJzZV9uc2VjOworCX0gd2hpbGUgKHVubGlrZWx5KGd0b2RfcmVhZF9yZXRyeShndG9kLCBzZXEpKSk7CiB9CiAKIG5vdHJhY2UgaW50IF9fdmRzb19jbG9ja19nZXR0aW1lKGNsb2NraWRfdCBjbG9jaywgc3RydWN0IHRpbWVzcGVjICp0cykKIHsKLQlpbnQgcmV0ID0gVkNMT0NLX05PTkU7Ci0KIAlzd2l0Y2ggKGNsb2NrKSB7CiAJY2FzZSBDTE9DS19SRUFMVElNRToKLQkJcmV0ID0gZG9fcmVhbHRpbWUodHMpOworCQlpZiAoZG9fcmVhbHRpbWUodHMpID09IFZDTE9DS19OT05FKQorCQkJZ290byBmYWxsYmFjazsKIAkJYnJlYWs7CiAJY2FzZSBDTE9DS19NT05PVE9OSUM6Ci0JCXJldCA9IGRvX21vbm90b25pYyh0cyk7CisJCWlmIChkb19tb25vdG9uaWModHMpID09IFZDTE9DS19OT05FKQorCQkJZ290byBmYWxsYmFjazsKIAkJYnJlYWs7CiAJY2FzZSBDTE9DS19SRUFMVElNRV9DT0FSU0U6Ci0JCXJldHVybiBkb19yZWFsdGltZV9jb2Fyc2UodHMpOworCQlkb19yZWFsdGltZV9jb2Fyc2UodHMpOworCQlicmVhazsKIAljYXNlIENMT0NLX01PTk9UT05JQ19DT0FSU0U6Ci0JCXJldHVybiBkb19tb25vdG9uaWNfY29hcnNlKHRzKTsKKwkJZG9fbW9ub3RvbmljX2NvYXJzZSh0cyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gZmFsbGJhY2s7CiAJfQogCi0JaWYgKHJldCA9PSBWQ0xPQ0tfTk9ORSkKLQkJcmV0dXJuIHZkc29fZmFsbGJhY2tfZ2V0dGltZShjbG9jaywgdHMpOwogCXJldHVybiAwOworZmFsbGJhY2s6CisJcmV0dXJuIHZkc29fZmFsbGJhY2tfZ2V0dGltZShjbG9jaywgdHMpOwogfQogaW50IGNsb2NrX2dldHRpbWUoY2xvY2tpZF90LCBzdHJ1Y3QgdGltZXNwZWMgKikKIAlfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX192ZHNvX2Nsb2NrX2dldHRpbWUiKSkpOwogCiBub3RyYWNlIGludCBfX3Zkc29fZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0diwgc3RydWN0IHRpbWV6b25lICp0eikKIHsKLQlsb25nIHJldCA9IFZDTE9DS19OT05FOwotCiAJaWYgKGxpa2VseSh0diAhPSBOVUxMKSkgewotCQlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHRpbWV2YWwsIHR2X3VzZWMpICE9Ci0JCQkgICAgIG9mZnNldG9mKHN0cnVjdCB0aW1lc3BlYywgdHZfbnNlYykgfHwKLQkJCSAgICAgc2l6ZW9mKCp0dikgIT0gc2l6ZW9mKHN0cnVjdCB0aW1lc3BlYykpOwotCQlyZXQgPSBkb19yZWFsdGltZSgoc3RydWN0IHRpbWVzcGVjICopdHYpOworCQlpZiAodW5saWtlbHkoZG9fcmVhbHRpbWUoKHN0cnVjdCB0aW1lc3BlYyAqKXR2KSA9PSBWQ0xPQ0tfTk9ORSkpCisJCQlyZXR1cm4gdmRzb19mYWxsYmFja19ndG9kKHR2LCB0eik7CiAJCXR2LT50dl91c2VjIC89IDEwMDA7CiAJfQogCWlmICh1bmxpa2VseSh0eiAhPSBOVUxMKSkgewotCQkvKiBBdm9pZCBtZW1jcHkuIFNvbWUgb2xkIGNvbXBpbGVycyBmYWlsIHRvIGlubGluZSBpdCAqLwotCQl0ei0+dHpfbWludXRlc3dlc3QgPSBndG9kLT5zeXNfdHoudHpfbWludXRlc3dlc3Q7Ci0JCXR6LT50el9kc3R0aW1lID0gZ3RvZC0+c3lzX3R6LnR6X2RzdHRpbWU7CisJCXR6LT50el9taW51dGVzd2VzdCA9IGd0b2QtPnR6X21pbnV0ZXN3ZXN0OworCQl0ei0+dHpfZHN0dGltZSA9IGd0b2QtPnR6X2RzdHRpbWU7CiAJfQogCi0JaWYgKHJldCA9PSBWQ0xPQ0tfTk9ORSkKLQkJcmV0dXJuIHZkc29fZmFsbGJhY2tfZ3RvZCh0diwgdHopOwogCXJldHVybiAwOwogfQogaW50IGdldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqLCBzdHJ1Y3QgdGltZXpvbmUgKikKQEAgLTI4Nyw4ICszNTUsOCBAQAogICovCiBub3RyYWNlIHRpbWVfdCBfX3Zkc29fdGltZSh0aW1lX3QgKnQpCiB7Ci0JLyogVGhpcyBpcyBhdG9taWMgb24geDg2XzY0IHNvIHdlIGRvbid0IG5lZWQgYW55IGxvY2tzLiAqLwotCXRpbWVfdCByZXN1bHQgPSBBQ0NFU1NfT05DRShWVkFSKHZzeXNjYWxsX2d0b2RfZGF0YSkud2FsbF90aW1lX3NlYyk7CisJLyogVGhpcyBpcyBhdG9taWMgb24geDg2IHNvIHdlIGRvbid0IG5lZWQgYW55IGxvY2tzLiAqLworCXRpbWVfdCByZXN1bHQgPSBBQ0NFU1NfT05DRShndG9kLT53YWxsX3RpbWVfc2VjKTsKIAogCWlmICh0KQogCQkqdCA9IHJlc3VsdDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Zkc28vdmRzby1sYXlvdXQubGRzLlMgYi9hcmNoL3g4Ni92ZHNvL3Zkc28tbGF5b3V0Lmxkcy5TCmluZGV4IDYzNGEyY2YuLjJlMjYzZjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Zkc28vdmRzby1sYXlvdXQubGRzLlMKKysrIGIvYXJjaC94ODYvdmRzby92ZHNvLWxheW91dC5sZHMuUwpAQCAtNiw3ICs2LDI1IEBACiAKIFNFQ1RJT05TCiB7Ci0JLiA9IFZEU09fUFJFTElOSyArIFNJWkVPRl9IRUFERVJTOworI2lmZGVmIEJVSUxEX1ZEU08zMgorI2luY2x1ZGUgPGFzbS92ZHNvMzIuaD4KKworCS5ocGV0X3NlY3QgOiB7CisJCWhwZXRfcGFnZSA9IC4gLSBWRFNPX09GRlNFVChWRFNPX0hQRVRfUEFHRSk7CisJfSA6dGV4dCA6aHBldF9zZWN0CisKKwkudnZhcl9zZWN0IDogeworCQl2dmFyID0gLiAtIFZEU09fT0ZGU0VUKFZEU09fVlZBUl9QQUdFKTsKKworCS8qIFBsYWNlIGFsbCB2dmFycyBhdCB0aGUgb2Zmc2V0cyBpbiBhc20vdnZhci5oLiAqLworI2RlZmluZSBFTUlUX1ZWQVIobmFtZSwgb2Zmc2V0KSB2dmFyXyAjIyBuYW1lID0gdnZhciArIG9mZnNldDsKKyNkZWZpbmUgX19WVkFSX0tFUk5FTF9MRFMKKyNpbmNsdWRlIDxhc20vdnZhci5oPgorI3VuZGVmIF9fVlZBUl9LRVJORUxfTERTCisjdW5kZWYgRU1JVF9WVkFSCisJfSA6dGV4dCA6dnZhcl9zZWN0CisjZW5kaWYKKwkuID0gU0laRU9GX0hFQURFUlM7CiAKIAkuaGFzaAkJOiB7ICooLmhhc2gpIH0JCQk6dGV4dAogCS5nbnUuaGFzaAk6IHsgKiguZ251Lmhhc2gpIH0KQEAgLTQ0LDYgKzYyLDExIEBACiAJLiA9IEFMSUdOKDB4MTAwKTsKIAogCS50ZXh0CQk6IHsgKigudGV4dCopIH0JCQk6dGV4dAk9MHg5MDkwOTA5MAorCisJL0RJU0NBUkQvIDogeworCQkqKC5kaXNjYXJkKQorCQkqKC5kaXNjYXJkLiopCisJfQogfQogCiAvKgpAQCAtNjEsNCArODQsOCBAQAogCWR5bmFtaWMJCVBUX0RZTkFNSUMJRkxBR1MoNCk7CQkvKiBQRl9SICovCiAJbm90ZQkJUFRfTk9URQkJRkxBR1MoNCk7CQkvKiBQRl9SICovCiAJZWhfZnJhbWVfaGRyCVBUX0dOVV9FSF9GUkFNRTsKKyNpZmRlZiBCVUlMRF9WRFNPMzIKKwl2dmFyX3NlY3QJUFRfTlVMTAkJRkxBR1MoNCk7CQkvKiBQRl9SICovCisJaHBldF9zZWN0CVBUX05VTEwJCUZMQUdTKDQpOwkJLyogUEZfUiAqLworI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL3Zkc28uUyBiL2FyY2gveDg2L3Zkc28vdmRzby5TCmluZGV4IDFlMTNlYjguLmJlM2YyM2IgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Zkc28vdmRzby5TCisrKyBiL2FyY2gveDg2L3Zkc28vdmRzby5TCkBAIC0xLDIxICsxLDMgQEAKLSNpbmNsdWRlIDxhc20vcGFnZV90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vdmRzby5oPgogCi1fX1BBR0VfQUxJR05FRF9EQVRBCi0KLQkuZ2xvYmwgdmRzb19zdGFydCwgdmRzb19lbmQKLQkuYWxpZ24gUEFHRV9TSVpFCi12ZHNvX3N0YXJ0OgotCS5pbmNiaW4gImFyY2gveDg2L3Zkc28vdmRzby5zbyIKLXZkc29fZW5kOgotCS5hbGlnbiBQQUdFX1NJWkUgLyogZXh0cmEgZGF0YSBoZXJlIGxlYWtzIHRvIHVzZXJzcGFjZS4gKi8KLQotLnByZXZpb3VzCi0KLQkuZ2xvYmwgdmRzb19wYWdlcwotCS5ic3MKLQkuYWxpZ24gOAotCS50eXBlIHZkc29fcGFnZXMsIEBvYmplY3QKLXZkc29fcGFnZXM6Ci0JLnplcm8gKHZkc29fZW5kIC0gdmRzb19zdGFydCArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFICogOAotCS5zaXplIHZkc29fcGFnZXMsIC4tdmRzb19wYWdlcworREVGSU5FX1ZEU09fSU1BR0UodmRzbywgImFyY2gveDg2L3Zkc28vdmRzby5zbyIpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL3Zkc28zMi1zZXR1cC5jIGIvYXJjaC94ODYvdmRzby92ZHNvMzItc2V0dXAuYwppbmRleCBkNmJmYjg3Li4wMDM0ODk4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL3Zkc28zMi1zZXR1cC5jCisrKyBiL2FyY2gveDg2L3Zkc28vdmRzbzMyLXNldHVwLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CiAjaW5jbHVkZSA8YXNtL21zci5oPgpAQCAtMjUsMTcgKzI2LDE0IEBACiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3Zkc28uaD4KICNpbmNsdWRlIDxhc20vcHJvdG8uaD4KLQotZW51bSB7Ci0JVkRTT19ESVNBQkxFRCA9IDAsCi0JVkRTT19FTkFCTEVEID0gMSwKLQlWRFNPX0NPTVBBVCA9IDIsCi19OworI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KKyNpbmNsdWRlIDxhc20vaHBldC5oPgorI2luY2x1ZGUgPGFzbS92dmFyLmg+CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUX1ZEU08KLSNkZWZpbmUgVkRTT19ERUZBVUxUCVZEU09fQ09NUEFUCisjZGVmaW5lIFZEU09fREVGQVVMVAkwCiAjZWxzZQotI2RlZmluZSBWRFNPX0RFRkFVTFQJVkRTT19FTkFCTEVECisjZGVmaW5lIFZEU09fREVGQVVMVAkxCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19YODZfNjQKQEAgLTQ0LDEzICs0Miw2IEBACiAjZW5kaWYKIAogLyoKLSAqIFRoaXMgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcHJlbGlua2VkIGFkZHJlc3NlcyBpbiB0aGUgdkRTTyBpbWFnZXMKLSAqIGFuZCB0aGUgVkRTT19ISUdIX0JBU0UgYWRkcmVzcyB3aGVyZSBDT05GSUdfQ09NUEFUX1ZEU08gcGxhY2VzIHRoZSB2RFNPCi0gKiBpbiB0aGUgdXNlciBhZGRyZXNzIHNwYWNlLgotICovCi0jZGVmaW5lIFZEU09fQUREUl9BREpVU1QJKFZEU09fSElHSF9CQVNFIC0gKHVuc2lnbmVkIGxvbmcpVkRTTzMyX1BSRUxJTkspCi0KLS8qCiAgKiBTaG91bGQgdGhlIGtlcm5lbCBtYXAgYSBWRFNPIHBhZ2UgaW50byBwcm9jZXNzZXMgYW5kIHBhc3MgaXRzCiAgKiBhZGRyZXNzIGRvd24gdG8gZ2xpYmMgdXBvbiBleGVjKCk/CiAgKi8KQEAgLTYwLDYgKzUxLDkgQEAKIHsKIAl2ZHNvX2VuYWJsZWQgPSBzaW1wbGVfc3RydG91bChzLCBOVUxMLCAwKTsKIAorCWlmICh2ZHNvX2VuYWJsZWQgPiAxKQorCQlwcl93YXJuKCJ2ZHNvMzIgdmFsdWVzIG90aGVyIHRoYW4gMCBhbmQgMSBhcmUgbm8gbG9uZ2VyIGFsbG93ZWQ7IHZkc28gZGlzYWJsZWRcbiIpOworCiAJcmV0dXJuIDE7CiB9CiAKQEAgLTc2LDEyNCArNzAsOCBAQAogRVhQT1JUX1NZTUJPTF9HUEwodmRzb19lbmFibGVkKTsKICNlbmRpZgogCi1zdGF0aWMgX19pbml0IHZvaWQgcmVsb2Nfc3ltdGFiKEVsZjMyX0VoZHIgKmVoZHIsCi0JCQkJdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBzaXplKQotewotCUVsZjMyX1N5bSAqc3ltID0gKHZvaWQgKillaGRyICsgb2Zmc2V0OwotCXVuc2lnbmVkIG5zeW0gPSBzaXplIC8gc2l6ZW9mKCpzeW0pOwotCXVuc2lnbmVkIGk7Ci0KLQlmb3IoaSA9IDA7IGkgPCBuc3ltOyBpKyssIHN5bSsrKSB7Ci0JCWlmIChzeW0tPnN0X3NobmR4ID09IFNITl9VTkRFRiB8fAotCQkgICAgc3ltLT5zdF9zaG5keCA9PSBTSE5fQUJTKQotCQkJY29udGludWU7ICAvKiBza2lwICovCi0KLQkJaWYgKHN5bS0+c3Rfc2huZHggPiBTSE5fTE9SRVNFUlZFKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJWRFNPOiB1bmV4cGVjdGVkIHN0X3NobmR4ICV4XG4iLAotCQkJICAgICAgIHN5bS0+c3Rfc2huZHgpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlzd2l0Y2goRUxGX1NUX1RZUEUoc3ltLT5zdF9pbmZvKSkgewotCQljYXNlIFNUVF9PQkpFQ1Q6Ci0JCWNhc2UgU1RUX0ZVTkM6Ci0JCWNhc2UgU1RUX1NFQ1RJT046Ci0JCWNhc2UgU1RUX0ZJTEU6Ci0JCQlzeW0tPnN0X3ZhbHVlICs9IFZEU09fQUREUl9BREpVU1Q7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBfX2luaXQgdm9pZCByZWxvY19keW4oRWxmMzJfRWhkciAqZWhkciwgdW5zaWduZWQgb2Zmc2V0KQotewotCUVsZjMyX0R5biAqZHluID0gKHZvaWQgKillaGRyICsgb2Zmc2V0OwotCi0JZm9yKDsgZHluLT5kX3RhZyAhPSBEVF9OVUxMOyBkeW4rKykKLQkJc3dpdGNoKGR5bi0+ZF90YWcpIHsKLQkJY2FzZSBEVF9QTFRHT1Q6Ci0JCWNhc2UgRFRfSEFTSDoKLQkJY2FzZSBEVF9TVFJUQUI6Ci0JCWNhc2UgRFRfU1lNVEFCOgotCQljYXNlIERUX1JFTEE6Ci0JCWNhc2UgRFRfSU5JVDoKLQkJY2FzZSBEVF9GSU5JOgotCQljYXNlIERUX1JFTDoKLQkJY2FzZSBEVF9ERUJVRzoKLQkJY2FzZSBEVF9KTVBSRUw6Ci0JCWNhc2UgRFRfVkVSU1lNOgotCQljYXNlIERUX1ZFUkRFRjoKLQkJY2FzZSBEVF9WRVJORUVEOgotCQljYXNlIERUX0FERFJSTkdMTyAuLi4gRFRfQUREUlJOR0hJOgotCQkJLyogZGVmaW5pdGVseSBwb2ludGVycyBuZWVkaW5nIHJlbG9jYXRpb24gKi8KLQkJCWR5bi0+ZF91bi5kX3B0ciArPSBWRFNPX0FERFJfQURKVVNUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBEVF9FTkNPRElORyAuLi4gT0xEX0RUX0xPT1MtMToKLQkJY2FzZSBEVF9MT09TIC4uLiBEVF9ISU9TLTE6Ci0JCQkvKiBUYWdzIGFib3ZlIERUX0VOQ09ESU5HIGFyZSBwb2ludGVycyBpZgotCQkJICAgdGhleSdyZSBldmVuICovCi0JCQlpZiAoZHluLT5kX3RhZyA+PSBEVF9FTkNPRElORyAmJgotCQkJICAgIChkeW4tPmRfdGFnICYgMSkgPT0gMCkKLQkJCQlkeW4tPmRfdW4uZF9wdHIgKz0gVkRTT19BRERSX0FESlVTVDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgRFRfVkVSREVGTlVNOgotCQljYXNlIERUX1ZFUk5FRUROVU06Ci0JCWNhc2UgRFRfRkxBR1NfMToKLQkJY2FzZSBEVF9SRUxBQ09VTlQ6Ci0JCWNhc2UgRFRfUkVMQ09VTlQ6Ci0JCWNhc2UgRFRfVkFMUk5HTE8gLi4uIERUX1ZBTFJOR0hJOgotCQkJLyogZGVmaW5pdGVseSBub3QgcG9pbnRlcnMgKi8KLQkJCWJyZWFrOwotCi0JCWNhc2UgT0xEX0RUX0xPT1MgLi4uIERUX0xPT1MtMToKLQkJY2FzZSBEVF9ISU9TIC4uLiBEVF9WQUxSTkdMTy0xOgotCQlkZWZhdWx0OgotCQkJaWYgKGR5bi0+ZF90YWcgPiBEVF9FTkNPRElORykKLQkJCQlwcmludGsoS0VSTl9JTkZPICJWRFNPOiB1bmV4cGVjdGVkIERUX3RhZyAleFxuIiwKLQkJCQkgICAgICAgZHluLT5kX3RhZyk7Ci0JCQlicmVhazsKLQkJfQotfQotCi1zdGF0aWMgX19pbml0IHZvaWQgcmVsb2NhdGVfdmRzbyhFbGYzMl9FaGRyICplaGRyKQotewotCUVsZjMyX1BoZHIgKnBoZHI7Ci0JRWxmMzJfU2hkciAqc2hkcjsKLQlpbnQgaTsKLQotCUJVR19PTihtZW1jbXAoZWhkci0+ZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKSAhPSAwIHx8Ci0JICAgICAgICFlbGZfY2hlY2tfYXJjaF9pYTMyKGVoZHIpIHx8Ci0JICAgICAgIGVoZHItPmVfdHlwZSAhPSBFVF9EWU4pOwotCi0JZWhkci0+ZV9lbnRyeSArPSBWRFNPX0FERFJfQURKVVNUOwotCi0JLyogcmViYXNlIHBoZHJzICovCi0JcGhkciA9ICh2b2lkICopZWhkciArIGVoZHItPmVfcGhvZmY7Ci0JZm9yIChpID0gMDsgaSA8IGVoZHItPmVfcGhudW07IGkrKykgewotCQlwaGRyW2ldLnBfdmFkZHIgKz0gVkRTT19BRERSX0FESlVTVDsKLQotCQkvKiByZWxvY2F0ZSBkeW5hbWljIHN0dWZmICovCi0JCWlmIChwaGRyW2ldLnBfdHlwZSA9PSBQVF9EWU5BTUlDKQotCQkJcmVsb2NfZHluKGVoZHIsIHBoZHJbaV0ucF9vZmZzZXQpOwotCX0KLQotCS8qIHJlYmFzZSBzZWN0aW9ucyAqLwotCXNoZHIgPSAodm9pZCAqKWVoZHIgKyBlaGRyLT5lX3Nob2ZmOwotCWZvcihpID0gMDsgaSA8IGVoZHItPmVfc2hudW07IGkrKykgewotCQlpZiAoIShzaGRyW2ldLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSkKLQkJCWNvbnRpbnVlOwotCi0JCXNoZHJbaV0uc2hfYWRkciArPSBWRFNPX0FERFJfQURKVVNUOwotCi0JCWlmIChzaGRyW2ldLnNoX3R5cGUgPT0gU0hUX1NZTVRBQiB8fAotCQkgICAgc2hkcltpXS5zaF90eXBlID09IFNIVF9EWU5TWU0pCi0JCQlyZWxvY19zeW10YWIoZWhkciwgc2hkcltpXS5zaF9vZmZzZXQsCi0JCQkJICAgICBzaGRyW2ldLnNoX3NpemUpOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBwYWdlICp2ZHNvMzJfcGFnZXNbMV07CitzdGF0aWMgc3RydWN0IHBhZ2UgKip2ZHNvMzJfcGFnZXM7CitzdGF0aWMgdW5zaWduZWQgdmRzbzMyX3NpemU7CiAKICNpZmRlZiBDT05GSUdfWDg2XzY0CiAKQEAgLTIxMiwxMiArOTAsNiBAQAogCXdybXNybChNU1JfQ1NUQVIsIGlhMzJfY3N0YXJfdGFyZ2V0KTsKIH0KIAotI2RlZmluZSBjb21wYXRfdXNlc192bWEJCTEKLQotc3RhdGljIGlubGluZSB2b2lkIG1hcF9jb21wYXRfdmRzbyhpbnQgbWFwKQotewotfQotCiAjZWxzZSAgLyogQ09ORklHX1g4Nl8zMiAqLwogCiAjZGVmaW5lIHZkc28zMl9zeXNlbnRlcigpCShib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfU0VQKSkKQEAgLTI0MSw2NCArMTEzLDM2IEBACiAJcHV0X2NwdSgpOwkKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCBnYXRlX3ZtYTsKLQotc3RhdGljIGludCBfX2luaXQgZ2F0ZV92bWFfaW5pdCh2b2lkKQotewotCWdhdGVfdm1hLnZtX21tID0gTlVMTDsKLQlnYXRlX3ZtYS52bV9zdGFydCA9IEZJWEFERFJfVVNFUl9TVEFSVDsKLQlnYXRlX3ZtYS52bV9lbmQgPSBGSVhBRERSX1VTRVJfRU5EOwotCWdhdGVfdm1hLnZtX2ZsYWdzID0gVk1fUkVBRCB8IFZNX01BWVJFQUQgfCBWTV9FWEVDIHwgVk1fTUFZRVhFQzsKLQlnYXRlX3ZtYS52bV9wYWdlX3Byb3QgPSBfX1AxMDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBjb21wYXRfdXNlc192bWEJCTAKLQotc3RhdGljIHZvaWQgbWFwX2NvbXBhdF92ZHNvKGludCBtYXApCi17Ci0Jc3RhdGljIGludCB2ZHNvX21hcHBlZDsKLQotCWlmIChtYXAgPT0gdmRzb19tYXBwZWQpCi0JCXJldHVybjsKLQotCXZkc29fbWFwcGVkID0gbWFwOwotCi0JX19zZXRfZml4bWFwKEZJWF9WRFNPLCBwYWdlX3RvX3Bmbih2ZHNvMzJfcGFnZXNbMF0pIDw8IFBBR0VfU0hJRlQsCi0JCSAgICAgbWFwID8gUEFHRV9SRUFET05MWV9FWEVDIDogUEFHRV9OT05FKTsKLQotCS8qIGZsdXNoIHN0cmF5IHRsYnMgKi8KLQlmbHVzaF90bGJfYWxsKCk7Ci19Ci0KICNlbmRpZgkvKiBDT05GSUdfWDg2XzY0ICovCiAKIGludCBfX2luaXQgc3lzZW50ZXJfc2V0dXAodm9pZCkKIHsKLQl2b2lkICpzeXNjYWxsX3BhZ2UgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfQVRPTUlDKTsKLQljb25zdCB2b2lkICp2c3lzY2FsbDsKLQlzaXplX3QgdnN5c2NhbGxfbGVuOworCWNoYXIgKnZkc28zMl9zdGFydCwgKnZkc28zMl9lbmQ7CisJaW50IG5wYWdlcywgaTsKIAotCXZkc28zMl9wYWdlc1swXSA9IHZpcnRfdG9fcGFnZShzeXNjYWxsX3BhZ2UpOwotCi0jaWZkZWYgQ09ORklHX1g4Nl8zMgotCWdhdGVfdm1hX2luaXQoKTsKLSNlbmRpZgotCisjaWZkZWYgQ09ORklHX0NPTVBBVAogCWlmICh2ZHNvMzJfc3lzY2FsbCgpKSB7Ci0JCXZzeXNjYWxsID0gJnZkc28zMl9zeXNjYWxsX3N0YXJ0OwotCQl2c3lzY2FsbF9sZW4gPSAmdmRzbzMyX3N5c2NhbGxfZW5kIC0gJnZkc28zMl9zeXNjYWxsX3N0YXJ0OwotCX0gZWxzZSBpZiAodmRzbzMyX3N5c2VudGVyKCkpewotCQl2c3lzY2FsbCA9ICZ2ZHNvMzJfc3lzZW50ZXJfc3RhcnQ7Ci0JCXZzeXNjYWxsX2xlbiA9ICZ2ZHNvMzJfc3lzZW50ZXJfZW5kIC0gJnZkc28zMl9zeXNlbnRlcl9zdGFydDsKKwkJdmRzbzMyX3N0YXJ0ID0gdmRzbzMyX3N5c2NhbGxfc3RhcnQ7CisJCXZkc28zMl9lbmQgPSB2ZHNvMzJfc3lzY2FsbF9lbmQ7CisJCXZkc28zMl9wYWdlcyA9IHZkc28zMl9zeXNjYWxsX3BhZ2VzOworCX0gZWxzZQorI2VuZGlmCisJaWYgKHZkc28zMl9zeXNlbnRlcigpKSB7CisJCXZkc28zMl9zdGFydCA9IHZkc28zMl9zeXNlbnRlcl9zdGFydDsKKwkJdmRzbzMyX2VuZCA9IHZkc28zMl9zeXNlbnRlcl9lbmQ7CisJCXZkc28zMl9wYWdlcyA9IHZkc28zMl9zeXNlbnRlcl9wYWdlczsKIAl9IGVsc2UgewotCQl2c3lzY2FsbCA9ICZ2ZHNvMzJfaW50ODBfc3RhcnQ7Ci0JCXZzeXNjYWxsX2xlbiA9ICZ2ZHNvMzJfaW50ODBfZW5kIC0gJnZkc28zMl9pbnQ4MF9zdGFydDsKKwkJdmRzbzMyX3N0YXJ0ID0gdmRzbzMyX2ludDgwX3N0YXJ0OworCQl2ZHNvMzJfZW5kID0gdmRzbzMyX2ludDgwX2VuZDsKKwkJdmRzbzMyX3BhZ2VzID0gdmRzbzMyX2ludDgwX3BhZ2VzOwogCX0KIAotCW1lbWNweShzeXNjYWxsX3BhZ2UsIHZzeXNjYWxsLCB2c3lzY2FsbF9sZW4pOwotCXJlbG9jYXRlX3Zkc28oc3lzY2FsbF9wYWdlKTsKKwlucGFnZXMgPSAoKHZkc28zMl9lbmQgLSB2ZHNvMzJfc3RhcnQpICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CisJdmRzbzMyX3NpemUgPSBucGFnZXMgPDwgUEFHRV9TSElGVDsKKwlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyspCisJCXZkc28zMl9wYWdlc1tpXSA9IHZpcnRfdG9fcGFnZSh2ZHNvMzJfc3RhcnQgKyBpKlBBR0VfU0laRSk7CisKKwlwYXRjaF92ZHNvMzIodmRzbzMyX3N0YXJ0LCB2ZHNvMzJfc2l6ZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMwOSw0OCArMTUzLDczIEBACiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAJaW50IHJldCA9IDA7Ci0JYm9vbCBjb21wYXQ7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAKICNpZmRlZiBDT05GSUdfWDg2X1gzMl9BQkkKIAlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfWDMyKSkKIAkJcmV0dXJuIHgzMl9zZXR1cF9hZGRpdGlvbmFsX3BhZ2VzKGJwcm0sIHVzZXNfaW50ZXJwKTsKICNlbmRpZgogCi0JaWYgKHZkc29fZW5hYmxlZCA9PSBWRFNPX0RJU0FCTEVEKQorCWlmICh2ZHNvX2VuYWJsZWQgIT0gMSkgIC8qIE90aGVyIHZhbHVlcyBhbGwgbWVhbiAiZGlzYWJsZWQiICovCiAJCXJldHVybiAwOwogCiAJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKIAotCS8qIFRlc3QgY29tcGF0IG1vZGUgb25jZSBoZXJlLCBpbiBjYXNlIHNvbWVvbmUKLQkgICBjaGFuZ2VzIGl0IHZpYSBzeXNjdGwgKi8KLQljb21wYXQgPSAodmRzb19lbmFibGVkID09IFZEU09fQ09NUEFUKTsKLQotCW1hcF9jb21wYXRfdmRzbyhjb21wYXQpOwotCi0JaWYgKGNvbXBhdCkKLQkJYWRkciA9IFZEU09fSElHSF9CQVNFOwotCWVsc2UgewotCQlhZGRyID0gZ2V0X3VubWFwcGVkX2FyZWEoTlVMTCwgMCwgUEFHRV9TSVpFLCAwLCAwKTsKLQkJaWYgKElTX0VSUl9WQUxVRShhZGRyKSkgewotCQkJcmV0ID0gYWRkcjsKLQkJCWdvdG8gdXBfZmFpbDsKLQkJfQorCWFkZHIgPSBnZXRfdW5tYXBwZWRfYXJlYShOVUxMLCAwLCB2ZHNvMzJfc2l6ZSArIFZEU09fT0ZGU0VUKFZEU09fUFJFVl9QQUdFUyksIDAsIDApOworCWlmIChJU19FUlJfVkFMVUUoYWRkcikpIHsKKwkJcmV0ID0gYWRkcjsKKwkJZ290byB1cF9mYWlsOwogCX0KIAorCWFkZHIgKz0gVkRTT19PRkZTRVQoVkRTT19QUkVWX1BBR0VTKTsKKwogCWN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc28gPSAodm9pZCAqKWFkZHI7CiAKLQlpZiAoY29tcGF0X3VzZXNfdm1hIHx8ICFjb21wYXQpIHsKLQkJLyoKLQkJICogTUFZV1JJVEUgdG8gYWxsb3cgZ2RiIHRvIENPVyBhbmQgc2V0IGJyZWFrcG9pbnRzCi0JCSAqLwotCQlyZXQgPSBpbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhtbSwgYWRkciwgUEFHRV9TSVpFLAotCQkJCQkgICAgICBWTV9SRUFEfFZNX0VYRUN8Ci0JCQkJCSAgICAgIFZNX01BWVJFQUR8Vk1fTUFZV1JJVEV8Vk1fTUFZRVhFQywKLQkJCQkJICAgICAgdmRzbzMyX3BhZ2VzKTsKKwkvKgorCSAqIE1BWVdSSVRFIHRvIGFsbG93IGdkYiB0byBDT1cgYW5kIHNldCBicmVha3BvaW50cworCSAqLworCXJldCA9IGluc3RhbGxfc3BlY2lhbF9tYXBwaW5nKG1tLAorCQkJYWRkciwKKwkJCXZkc28zMl9zaXplLAorCQkJVk1fUkVBRHxWTV9FWEVDfAorCQkJVk1fTUFZUkVBRHxWTV9NQVlXUklURXxWTV9NQVlFWEVDLAorCQkJdmRzbzMyX3BhZ2VzKTsKKworCWlmIChyZXQpCisJCWdvdG8gdXBfZmFpbDsKKworCXZtYSA9IF9pbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhtbSwKKwkJCWFkZHIgLSAgVkRTT19PRkZTRVQoVkRTT19QUkVWX1BBR0VTKSwKKwkJCVZEU09fT0ZGU0VUKFZEU09fUFJFVl9QQUdFUyksCisJCQlWTV9SRUFELAorCQkJTlVMTCk7CisKKwlpZiAoSVNfRVJSKHZtYSkpIHsKKwkJcmV0ID0gUFRSX0VSUih2bWEpOworCQlnb3RvIHVwX2ZhaWw7CisJfQorCisJcmV0ID0gcmVtYXBfcGZuX3JhbmdlKHZtYSwKKwkJYWRkciAtIFZEU09fT0ZGU0VUKFZEU09fVlZBUl9QQUdFKSwKKwkJX19wYV9zeW1ib2woJl9fdnZhcl9wYWdlKSA+PiBQQUdFX1NISUZULAorCQlQQUdFX1NJWkUsCisJCVBBR0VfUkVBRE9OTFkpOworCisJaWYgKHJldCkKKwkJZ290byB1cF9mYWlsOworCisjaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKKwlpZiAoaHBldF9hZGRyZXNzKSB7CisJCXJldCA9IGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsCisJCQlhZGRyIC0gVkRTT19PRkZTRVQoVkRTT19IUEVUX1BBR0UpLAorCQkJaHBldF9hZGRyZXNzID4+IFBBR0VfU0hJRlQsCisJCQlQQUdFX1NJWkUsCisJCQlwZ3Byb3Rfbm9uY2FjaGVkKFBBR0VfUkVBRE9OTFkpKTsKIAogCQlpZiAocmV0KQogCQkJZ290byB1cF9mYWlsOwogCX0KKyNlbmRpZgogCiAJY3VycmVudF90aHJlYWRfaW5mbygpLT5zeXNlbnRlcl9yZXR1cm4gPQogCQlWRFNPMzJfU1lNQk9MKGFkZHIsIFNZU0VOVEVSX1JFVFVSTik7CkBAIC00MTEsMjAgKzI4MCwxMiBAQAogCiBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmdldF9nYXRlX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQkvKgotCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgY29ycmVzcG9uZGluZyB0YXNrIHdhcyBjcmVhdGVkIGluIGNvbXBhdCB2ZHNvCi0JICogbW9kZS4KLQkgKi8KLQlpZiAobW0gJiYgbW0tPmNvbnRleHQudmRzbyA9PSAodm9pZCAqKVZEU09fSElHSF9CQVNFKQotCQlyZXR1cm4gJmdhdGVfdm1hOwogCXJldHVybiBOVUxMOwogfQogCiBpbnQgaW5fZ2F0ZV9hcmVhKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBnZXRfZ2F0ZV92bWEobW0pOwotCi0JcmV0dXJuIHZtYSAmJiBhZGRyID49IHZtYS0+dm1fc3RhcnQgJiYgYWRkciA8IHZtYS0+dm1fZW5kOworCXJldHVybiAwOwogfQogCiBpbnQgaW5fZ2F0ZV9hcmVhX25vX21tKHVuc2lnbmVkIGxvbmcgYWRkcikKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Zkc28vdmRzbzMyLlMgYi9hcmNoL3g4Ni92ZHNvL3Zkc28zMi5TCmluZGV4IDJjZTVmODIuLjAxOGJjZDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Zkc28vdmRzbzMyLlMKKysrIGIvYXJjaC94ODYvdmRzby92ZHNvMzIuUwpAQCAtMSwyMiArMSw5IEBACi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS92ZHNvLmg+CiAKLV9fSU5JVERBVEEKK0RFRklORV9WRFNPX0lNQUdFKHZkc28zMl9pbnQ4MCwgImFyY2gveDg2L3Zkc28vdmRzbzMyLWludDgwLnNvIikKIAotCS5nbG9ibCB2ZHNvMzJfaW50ODBfc3RhcnQsIHZkc28zMl9pbnQ4MF9lbmQKLXZkc28zMl9pbnQ4MF9zdGFydDoKLQkuaW5jYmluICJhcmNoL3g4Ni92ZHNvL3Zkc28zMi1pbnQ4MC5zbyIKLXZkc28zMl9pbnQ4MF9lbmQ6Ci0KLQkuZ2xvYmwgdmRzbzMyX3N5c2NhbGxfc3RhcnQsIHZkc28zMl9zeXNjYWxsX2VuZAotdmRzbzMyX3N5c2NhbGxfc3RhcnQ6CiAjaWZkZWYgQ09ORklHX0NPTVBBVAotCS5pbmNiaW4gImFyY2gveDg2L3Zkc28vdmRzbzMyLXN5c2NhbGwuc28iCitERUZJTkVfVkRTT19JTUFHRSh2ZHNvMzJfc3lzY2FsbCwgImFyY2gveDg2L3Zkc28vdmRzbzMyLXN5c2NhbGwuc28iKQogI2VuZGlmCi12ZHNvMzJfc3lzY2FsbF9lbmQ6CiAKLQkuZ2xvYmwgdmRzbzMyX3N5c2VudGVyX3N0YXJ0LCB2ZHNvMzJfc3lzZW50ZXJfZW5kCi12ZHNvMzJfc3lzZW50ZXJfc3RhcnQ6Ci0JLmluY2JpbiAiYXJjaC94ODYvdmRzby92ZHNvMzItc3lzZW50ZXIuc28iCi12ZHNvMzJfc3lzZW50ZXJfZW5kOgotCi1fX0ZJTklUCitERUZJTkVfVkRTT19JTUFHRSh2ZHNvMzJfc3lzZW50ZXIsICJhcmNoL3g4Ni92ZHNvL3Zkc28zMi1zeXNlbnRlci5zbyIpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL3Zkc28zMi92Y2xvY2tfZ2V0dGltZS5jIGIvYXJjaC94ODYvdmRzby92ZHNvMzIvdmNsb2NrX2dldHRpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzVjYzcyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdmRzby92ZHNvMzIvdmNsb2NrX2dldHRpbWUuYwpAQCAtMCwwICsxLDMwIEBACisjZGVmaW5lIEJVSUxEX1ZEU08zMgorCisjaWZuZGVmIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRQorI3VuZGVmIENPTkZJR19PUFRJTUlaRV9JTkxJTklORworI2VuZGlmCisKKyN1bmRlZiBDT05GSUdfWDg2X1BQUk9fRkVOQ0UKKworI2lmZGVmIENPTkZJR19YODZfNjQKKworLyoKKyAqIGluIGNhc2Ugb2YgYSAzMiBiaXQgVkRTTyBmb3IgYSA2NCBiaXQga2VybmVsIGZha2UgYSAzMiBiaXQga2VybmVsCisgKiBjb25maWd1cmF0aW9uCisgKi8KKyN1bmRlZiBDT05GSUdfNjRCSVQKKyN1bmRlZiBDT05GSUdfWDg2XzY0CisjdW5kZWYgQ09ORklHX0lMTEVHQUxfUE9JTlRFUl9WQUxVRQorI3VuZGVmIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUAorI3VuZGVmIENPTkZJR19OUl9DUFVTCisKKyNkZWZpbmUgQ09ORklHX1g4Nl8zMiAxCisjZGVmaW5lIENPTkZJR19QQUdFX09GRlNFVCAwCisjZGVmaW5lIENPTkZJR19JTExFR0FMX1BPSU5URVJfVkFMVUUgMAorI2RlZmluZSBDT05GSUdfTlJfQ1BVUyAxCisKKyNkZWZpbmUgQlVJTERfVkRTTzMyXzY0CisKKyNlbmRpZgorCisjaW5jbHVkZSAiLi4vdmNsb2NrX2dldHRpbWUuYyIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Zkc28vdmRzbzMyL3Zkc28zMi5sZHMuUyBiL2FyY2gveDg2L3Zkc28vdmRzbzMyL3Zkc28zMi5sZHMuUwppbmRleCA5NzYxMjRiLi5hYWRiOGI5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL3Zkc28zMi92ZHNvMzIubGRzLlMKKysrIGIvYXJjaC94ODYvdmRzby92ZHNvMzIvdmRzbzMyLmxkcy5TCkBAIC04LDcgKzgsMTEgQEAKICAqIHZhbHVlcyB2aXNpYmxlIHVzaW5nIHRoZSBhc20teDg2L3Zkc28uaCBtYWNyb3MgZnJvbSB0aGUga2VybmVsIHByb3Blci4KICAqLwogCisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworI2RlZmluZSBCVUlMRF9WRFNPMzIKICNkZWZpbmUgVkRTT19QUkVMSU5LIDAKKwogI2luY2x1ZGUgIi4uL3Zkc28tbGF5b3V0Lmxkcy5TIgogCiAvKiBUaGUgRUxGIGVudHJ5IHBvaW50IGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgQVRfU1lTSU5GTyB2YWx1ZS4gICovCkBAIC0xOSw2ICsyMywxMyBAQAogICovCiBWRVJTSU9OCiB7CisJTElOVVhfMi42IHsKKwlnbG9iYWw6CisJCV9fdmRzb19jbG9ja19nZXR0aW1lOworCQlfX3Zkc29fZ2V0dGltZW9mZGF5OworCQlfX3Zkc29fdGltZTsKKwl9OworCiAJTElOVVhfMi41IHsKIAlnbG9iYWw6CiAJCV9fa2VybmVsX3ZzeXNjYWxsOwpAQCAtMzEsNyArNDIsOSBAQAogLyoKICAqIFN5bWJvbHMgd2UgZGVmaW5lIGhlcmUgY2FsbGVkIFZEU08qIGdldCB0aGVpciB2YWx1ZXMgaW50byB2ZHNvMzItc3ltcy5oLgogICovCi1WRFNPMzJfUFJFTElOSwkJPSBWRFNPX1BSRUxJTks7CiBWRFNPMzJfdnN5c2NhbGwJCT0gX19rZXJuZWxfdnN5c2NhbGw7CiBWRFNPMzJfc2lncmV0dXJuCT0gX19rZXJuZWxfc2lncmV0dXJuOwogVkRTTzMyX3J0X3NpZ3JldHVybgk9IF9fa2VybmVsX3J0X3NpZ3JldHVybjsKK1ZEU08zMl9jbG9ja19nZXR0aW1lCT0gY2xvY2tfZ2V0dGltZTsKK1ZEU08zMl9nZXR0aW1lb2ZkYXkJPSBnZXR0aW1lb2ZkYXk7CitWRFNPMzJfdGltZQkJPSB0aW1lOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdmRzby92ZHNveDMyLlMgYi9hcmNoL3g4Ni92ZHNvL3Zkc294MzIuUwppbmRleCAyOTVmMWM3Li5mNGFhMzRlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL3Zkc294MzIuUworKysgYi9hcmNoL3g4Ni92ZHNvL3Zkc294MzIuUwpAQCAtMSwyMSArMSwzIEBACi0jaW5jbHVkZSA8YXNtL3BhZ2VfdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3Zkc28uaD4KIAotX19QQUdFX0FMSUdORURfREFUQQotCi0JLmdsb2JsIHZkc294MzJfc3RhcnQsIHZkc294MzJfZW5kCi0JLmFsaWduIFBBR0VfU0laRQotdmRzb3gzMl9zdGFydDoKLQkuaW5jYmluICJhcmNoL3g4Ni92ZHNvL3Zkc294MzIuc28iCi12ZHNveDMyX2VuZDoKLQkuYWxpZ24gUEFHRV9TSVpFIC8qIGV4dHJhIGRhdGEgaGVyZSBsZWFrcyB0byB1c2Vyc3BhY2UuICovCi0KLS5wcmV2aW91cwotCi0JLmdsb2JsIHZkc294MzJfcGFnZXMKLQkuYnNzCi0JLmFsaWduIDgKLQkudHlwZSB2ZHNveDMyX3BhZ2VzLCBAb2JqZWN0Ci12ZHNveDMyX3BhZ2VzOgotCS56ZXJvICh2ZHNveDMyX2VuZCAtIHZkc294MzJfc3RhcnQgKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRSAqIDgKLQkuc2l6ZSB2ZHNveDMyX3BhZ2VzLCAuLXZkc294MzJfcGFnZXMKK0RFRklORV9WRFNPX0lNQUdFKHZkc294MzIsICJhcmNoL3g4Ni92ZHNvL3Zkc294MzIuc28iKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdmRzby92bWEuYyBiL2FyY2gveDg2L3Zkc28vdm1hLmMKaW5kZXggNDMxZTg3NS4uMWFkMTAyNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdmRzby92bWEuYworKysgYi9hcmNoL3g4Ni92ZHNvL3ZtYS5jCkBAIC0xNiwyMCArMTYsMjIgQEAKICNpbmNsdWRlIDxhc20vdmRzby5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpCiB1bnNpZ25lZCBpbnQgX19yZWFkX21vc3RseSB2ZHNvX2VuYWJsZWQgPSAxOwogCi1leHRlcm4gY2hhciB2ZHNvX3N0YXJ0W10sIHZkc29fZW5kW107CitERUNMQVJFX1ZEU09fSU1BR0UodmRzbyk7CiBleHRlcm4gdW5zaWduZWQgc2hvcnQgdmRzb19zeW5jX2NwdWlkOwotCi1leHRlcm4gc3RydWN0IHBhZ2UgKnZkc29fcGFnZXNbXTsKIHN0YXRpYyB1bnNpZ25lZCB2ZHNvX3NpemU7CiAKICNpZmRlZiBDT05GSUdfWDg2X1gzMl9BQkkKLWV4dGVybiBjaGFyIHZkc294MzJfc3RhcnRbXSwgdmRzb3gzMl9lbmRbXTsKLWV4dGVybiBzdHJ1Y3QgcGFnZSAqdmRzb3gzMl9wYWdlc1tdOworREVDTEFSRV9WRFNPX0lNQUdFKHZkc294MzIpOwogc3RhdGljIHVuc2lnbmVkIHZkc294MzJfc2l6ZTsKKyNlbmRpZgorI2VuZGlmCiAKLXN0YXRpYyB2b2lkIF9faW5pdCBwYXRjaF92ZHNveDMyKHZvaWQgKnZkc28sIHNpemVfdCBsZW4pCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzMyKSB8fCBkZWZpbmVkKENPTkZJR19YODZfWDMyX0FCSSkgfHwgXAorCWRlZmluZWQoQ09ORklHX0NPTVBBVCkKK3ZvaWQgX19pbml0IHBhdGNoX3Zkc28zMih2b2lkICp2ZHNvLCBzaXplX3QgbGVuKQogewogCUVsZjMyX0VoZHIgKmhkciA9IHZkc287CiAJRWxmMzJfU2hkciAqc2VjaGRycywgKmFsdF9zZWMgPSAwOwpAQCAtNTIsNyArNTQsNyBAQAogCX0KIAogCS8qIElmIHdlIGdldCBoZXJlLCBpdCdzIHByb2JhYmx5IGEgYnVnLiAqLwotCXByX3dhcm5pbmcoInBhdGNoX3Zkc294MzI6IC5hbHRpbnN0cnVjdGlvbnMgbm90IGZvdW5kXG4iKTsKKwlwcl93YXJuaW5nKCJwYXRjaF92ZHNvMzI6IC5hbHRpbnN0cnVjdGlvbnMgbm90IGZvdW5kXG4iKTsKIAlyZXR1cm47ICAvKiBub3RoaW5nIHRvIHBhdGNoICovCiAKIGZvdW5kOgpAQCAtNjEsNiArNjMsNyBAQAogfQogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpCiBzdGF0aWMgdm9pZCBfX2luaXQgcGF0Y2hfdmRzbzY0KHZvaWQgKnZkc28sIHNpemVfdCBsZW4pCiB7CiAJRWxmNjRfRWhkciAqaGRyID0gdmRzbzsKQEAgLTEwNCw3ICsxMDcsNyBAQAogCQl2ZHNvX3BhZ2VzW2ldID0gdmlydF90b19wYWdlKHZkc29fc3RhcnQgKyBpKlBBR0VfU0laRSk7CiAKICNpZmRlZiBDT05GSUdfWDg2X1gzMl9BQkkKLQlwYXRjaF92ZHNveDMyKHZkc294MzJfc3RhcnQsIHZkc294MzJfZW5kIC0gdmRzb3gzMl9zdGFydCk7CisJcGF0Y2hfdmRzbzMyKHZkc294MzJfc3RhcnQsIHZkc294MzJfZW5kIC0gdmRzb3gzMl9zdGFydCk7CiAJbnBhZ2VzID0gKHZkc294MzJfZW5kIC0gdmRzb3gzMl9zdGFydCArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOwogCXZkc294MzJfc2l6ZSA9IG5wYWdlcyA8PCBQQUdFX1NISUZUOwogCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykKQEAgLTIwNCwzICsyMDcsNCBAQAogCXJldHVybiAwOwogfQogX19zZXR1cCgidmRzbz0iLCB2ZHNvX3NldHVwKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL0tjb25maWcgYi9hcmNoL3g4Ni94ZW4vS2NvbmZpZwppbmRleCAwMWI5MDI2Li45YzUwY2MyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vS2NvbmZpZworKysgYi9hcmNoL3g4Ni94ZW4vS2NvbmZpZwpAQCAtNyw3ICs3LDcgQEAKIAlkZXBlbmRzIG9uIFBBUkFWSVJUCiAJc2VsZWN0IFBBUkFWSVJUX0NMT0NLCiAJc2VsZWN0IFhFTl9IQVZFX1BWTU1VCi0JZGVwZW5kcyBvbiBYODZfNjQgfHwgKFg4Nl8zMiAmJiBYODZfUEFFICYmICFYODZfVklTV1MpCisJZGVwZW5kcyBvbiBYODZfNjQgfHwgKFg4Nl8zMiAmJiBYODZfUEFFKQogCWRlcGVuZHMgb24gWDg2X1RTQwogCWhlbHAKIAkgIFRoaXMgaXMgdGhlIExpbnV4IFhlbiBwb3J0LiAgRW5hYmxpbmcgdGhpcyB3aWxsIGFsbG93IHRoZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL21tdS5jIGIvYXJjaC94ODYveGVuL21tdS5jCmluZGV4IDI0MjNlZjAuLjg2ZTAyZWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9tbXUuYworKysgYi9hcmNoL3g4Ni94ZW4vbW11LmMKQEAgLTIwNTgsNyArMjA1OCw2IEBACiAJY2FzZSBGSVhfUk9fSURUOgogI2lmZGVmIENPTkZJR19YODZfMzIKIAljYXNlIEZJWF9XUF9URVNUOgotCWNhc2UgRklYX1ZEU086CiAjIGlmZGVmIENPTkZJR19ISUdITUVNCiAJY2FzZSBGSVhfS01BUF9CRUdJTiAuLi4gRklYX0tNQVBfRU5EOgogIyBlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3NwaW5sb2NrLmMgYi9hcmNoL3g4Ni94ZW4vc3BpbmxvY2suYwppbmRleCA1ODE1MjFjLi40ZDNhY2MzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vc3BpbmxvY2suYworKysgYi9hcmNoL3g4Ni94ZW4vc3BpbmxvY2suYwpAQCAtMTgzLDcgKzE4Myw3IEBACiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKLQlrc3RhdF9pbmNyX2lycXNfdGhpc19jcHUoaXJxLCBpcnFfdG9fZGVzYyhpcnEpKTsKKwlrc3RhdF9pbmNyX2lycV90aGlzX2NwdShpcnEpOwogb3V0OgogCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgJndhaXRpbmdfY3B1cyk7CiAJdy0+bG9jayA9IE5VTEw7CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvaXJxLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvaXJxLmMKaW5kZXggNDgyODY4YS4uM2VlZTk0ZiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL2lycS5jCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9pcnEuYwpAQCAtMTU1LDE4ICsxNTUsNiBAQAogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi1zdGF0aWMgdm9pZCByb3V0ZV9pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgY3B1KQotewotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7Ci0Jc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwKGRhdGEpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKLQlpZiAoY2hpcC0+aXJxX3NldF9hZmZpbml0eSkKLQkJY2hpcC0+aXJxX3NldF9hZmZpbml0eShkYXRhLCBjcHVtYXNrX29mKGNwdSksIGZhbHNlKTsKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwotfQotCiAvKgogICogVGhlIENQVSBoYXMgYmVlbiBtYXJrZWQgb2ZmbGluZS4gIE1pZ3JhdGUgSVJRcyBvZmYgdGhpcyBDUFUuICBJZgogICogdGhlIGFmZmluaXR5IHNldHRpbmdzIGRvIG5vdCBhbGxvdyBvdGhlciBDUFVzLCBmb3JjZSB0aGVtIG9udG8gYW55CkBAIC0xNzUsMTAgKzE2Myw5IEBACiB2b2lkIG1pZ3JhdGVfaXJxcyh2b2lkKQogewogCXVuc2lnbmVkIGludCBpLCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjOwogCi0JZm9yX2VhY2hfaXJxX2Rlc2MoaSwgZGVzYykgewotCQlzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEgPSBpcnFfZGVzY19nZXRfaXJxX2RhdGEoZGVzYyk7CisJZm9yX2VhY2hfYWN0aXZlX2lycShpKSB7CisJCXN0cnVjdCBpcnFfZGF0YSAqZGF0YSA9IGlycV9nZXRfaXJxX2RhdGEoaSk7CiAJCXVuc2lnbmVkIGludCBuZXdjcHU7CiAKIAkJaWYgKGlycWRfaXNfcGVyX2NwdShkYXRhKSkKQEAgLTE5NCwxMSArMTgxLDggQEAKIAkJCQkJICAgIGksIGNwdSk7CiAKIAkJCWNwdW1hc2tfc2V0YWxsKGRhdGEtPmFmZmluaXR5KTsKLQkJCW5ld2NwdSA9IGNwdW1hc2tfYW55X2FuZChkYXRhLT5hZmZpbml0eSwKLQkJCQkJCSBjcHVfb25saW5lX21hc2spOwogCQl9Ci0KLQkJcm91dGVfaXJxKGRhdGEsIGksIG5ld2NwdSk7CisJCWlycV9zZXRfYWZmaW5pdHkoaSwgZGF0YS0+YWZmaW5pdHkpOwogCX0KIH0KICNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jZ3JvdXAuYyBiL2Jsb2NrL2Jsay1jZ3JvdXAuYwppbmRleCA0ZTQ5MWQ5Li5iNmU5NWI1IDEwMDY0NAotLS0gYS9ibG9jay9ibGstY2dyb3VwLmMKKysrIGIvYmxvY2svYmxrLWNncm91cC5jCkBAIC0zMzYsNyArMzM2LDcgQEAKIAkgKiB1bmRlciBxdWV1ZV9sb2NrLiAgSWYgaXQncyBub3QgcG9pbnRpbmcgdG8gQGJsa2cgbm93LCBpdCBuZXZlcgogCSAqIHdpbGwuICBIaW50IGFzc2lnbm1lbnQgaXRzZWxmIGNhbiByYWNlIHNhZmVseS4KIAkgKi8KLQlpZiAocmN1X2RlcmVmZXJlbmNlX3JhdyhibGtjZy0+YmxrZ19oaW50KSA9PSBibGtnKQorCWlmIChyY3VfYWNjZXNzX3BvaW50ZXIoYmxrY2ctPmJsa2dfaGludCkgPT0gYmxrZykKIAkJcmN1X2Fzc2lnbl9wb2ludGVyKGJsa2NnLT5ibGtnX2hpbnQsIE5VTEwpOwogCiAJLyoKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jb3JlLmMgYi9ibG9jay9ibGstY29yZS5jCmluZGV4IGJmZTE2ZDUuLmU0NWIzMjEgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jb3JlLmMKKysrIGIvYmxvY2svYmxrLWNvcmUuYwpAQCAtMjM1Myw3ICsyMzUzLDcgQEAKIAlpZiAoIXJlcS0+YmlvKQogCQlyZXR1cm4gZmFsc2U7CiAKLQl0cmFjZV9ibG9ja19ycV9jb21wbGV0ZShyZXEtPnEsIHJlcSk7CisJdHJhY2VfYmxvY2tfcnFfY29tcGxldGUocmVxLT5xLCByZXEsIG5yX2J5dGVzKTsKIAogCS8qCiAJICogRm9yIGZzIHJlcXVlc3RzLCBycSBpcyBqdXN0IGNhcnJpZXIgb2YgaW5kZXBlbmRlbnQgYmlvJ3MKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1pb2MuYyBiL2Jsb2NrL2Jsay1pb2MuYwppbmRleCAyNDJkZjAxLi4xYTI3ZjQ1IDEwMDY0NAotLS0gYS9ibG9jay9ibGstaW9jLmMKKysrIGIvYmxvY2svYmxrLWlvYy5jCkBAIC02OCw3ICs2OCw3IEBACiAJICogdW5kZXIgcXVldWVfbG9jay4gIElmIGl0J3Mgbm90IHBvaW50aW5nIHRvIEBpY3Egbm93LCBpdCBuZXZlcgogCSAqIHdpbGwuICBIaW50IGFzc2lnbm1lbnQgaXRzZWxmIGNhbiByYWNlIHNhZmVseS4KIAkgKi8KLQlpZiAocmN1X2RlcmVmZXJlbmNlX3Jhdyhpb2MtPmljcV9oaW50KSA9PSBpY3EpCisJaWYgKHJjdV9hY2Nlc3NfcG9pbnRlcihpb2MtPmljcV9oaW50KSA9PSBpY3EpCiAJCXJjdV9hc3NpZ25fcG9pbnRlcihpb2MtPmljcV9oaW50LCBOVUxMKTsKIAogCWlvY19leGl0X2ljcShpY3EpOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWlvcG9sbC5jIGIvYmxvY2svYmxrLWlvcG9sbC5jCmluZGV4IDE4NTViZjUuLmMxMWQyNGUgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1pb3BvbGwuYworKysgYi9ibG9jay9ibGstaW9wb2xsLmMKQEAgLTE0LDkgKzE0LDYgQEAKIAogI2luY2x1ZGUgImJsay5oIgogCi1pbnQgYmxrX2lvcG9sbF9lbmFibGVkID0gMTsKLUVYUE9SVF9TWU1CT0woYmxrX2lvcG9sbF9lbmFibGVkKTsKLQogc3RhdGljIHVuc2lnbmVkIGludCBibGtfaW9wb2xsX2J1ZGdldCBfX3JlYWRfbW9zdGx5ID0gMjU2OwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGxpc3RfaGVhZCwgYmxrX2NwdV9pb3BvbGwpOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLW1xLWNwdW1hcC5jIGIvYmxvY2svYmxrLW1xLWNwdW1hcC5jCmluZGV4IGY4NzIxMjcuLjA5NzkyMTMyIDEwMDY0NAotLS0gYS9ibG9jay9ibGstbXEtY3B1bWFwLmMKKysrIGIvYmxvY2svYmxrLW1xLWNwdW1hcC5jCkBAIC05LDE1ICs5LDYgQEAKICNpbmNsdWRlICJibGsuaCIKICNpbmNsdWRlICJibGstbXEuaCIKIAotc3RhdGljIHZvaWQgc2hvd19tYXAodW5zaWduZWQgaW50ICptYXAsIHVuc2lnbmVkIGludCBucikKLXsKLQlpbnQgaTsKLQotCXByX2luZm8oImJsay1tcTogQ1BVIC0+IHF1ZXVlIG1hcFxuIik7Ci0JZm9yX2VhY2hfb25saW5lX2NwdShpKQotCQlwcl9pbmZvKCIgIENQVSUydSAtPiBRdWV1ZSAldVxuIiwgaSwgbWFwW2ldKTsKLX0KLQogc3RhdGljIGludCBjcHVfdG9fcXVldWVfaW5kZXgodW5zaWduZWQgaW50IG5yX2NwdXMsIHVuc2lnbmVkIGludCBucl9xdWV1ZXMsCiAJCQkgICAgICBjb25zdCBpbnQgY3B1KQogewpAQCAtODUsNyArNzYsNiBAQAogCQkJbWFwW2ldID0gbWFwW2ZpcnN0X3NpYmxpbmddOwogCX0KIAotCXNob3dfbWFwKG1hcCwgbnJfY3B1cyk7CiAJZnJlZV9jcHVtYXNrX3ZhcihjcHVzKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tcS1zeXNmcy5jIGIvYmxvY2svYmxrLW1xLXN5c2ZzLmMKaW5kZXggYjkxY2U3NS4uYjBiYTI2NCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLW1xLXN5c2ZzLmMKKysrIGIvYmxvY2svYmxrLW1xLXN5c2ZzLmMKQEAgLTI0NCw2ICsyNDQsMzIgQEAKIAlyZXR1cm4gYmxrX21xX3RhZ19zeXNmc19zaG93KGhjdHgtPnRhZ3MsIHBhZ2UpOwogfQogCitzdGF0aWMgc3NpemVfdCBibGtfbXFfaHdfc3lzZnNfY3B1c19zaG93KHN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4LCBjaGFyICpwYWdlKQoreworCXVuc2lnbmVkIGludCBpLCBxdWV1ZV9udW0sIGZpcnN0ID0gMTsKKwlzc2l6ZV90IHJldCA9IDA7CisKKwlibGtfbXFfZGlzYWJsZV9ob3RwbHVnKCk7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKKwkJcXVldWVfbnVtID0gaGN0eC0+cXVldWUtPm1xX21hcFtpXTsKKwkJaWYgKHF1ZXVlX251bSAhPSBoY3R4LT5xdWV1ZV9udW0pCisJCQljb250aW51ZTsKKworCQlpZiAoZmlyc3QpCisJCQlyZXQgKz0gc3ByaW50ZihyZXQgKyBwYWdlLCAiJXUiLCBpKTsKKwkJZWxzZQorCQkJcmV0ICs9IHNwcmludGYocmV0ICsgcGFnZSwgIiwgJXUiLCBpKTsKKworCQlmaXJzdCA9IDA7CisJfQorCisJYmxrX21xX2VuYWJsZV9ob3RwbHVnKCk7CisKKwlyZXQgKz0gc3ByaW50ZihyZXQgKyBwYWdlLCAiXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgc3RydWN0IGJsa19tcV9jdHhfc3lzZnNfZW50cnkgYmxrX21xX3N5c2ZzX2Rpc3BhdGNoZWQgPSB7CiAJLmF0dHIgPSB7Lm5hbWUgPSAiZGlzcGF0Y2hlZCIsIC5tb2RlID0gU19JUlVHTyB9LAogCS5zaG93ID0gYmxrX21xX3N5c2ZzX2Rpc3BhdGNoZWRfc2hvdywKQEAgLTI5NCw2ICszMjAsMTAgQEAKIAkuYXR0ciA9IHsubmFtZSA9ICJ0YWdzIiwgLm1vZGUgPSBTX0lSVUdPIH0sCiAJLnNob3cgPSBibGtfbXFfaHdfc3lzZnNfdGFnc19zaG93LAogfTsKK3N0YXRpYyBzdHJ1Y3QgYmxrX21xX2h3X2N0eF9zeXNmc19lbnRyeSBibGtfbXFfaHdfc3lzZnNfY3B1cyA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJjcHVfbGlzdCIsIC5tb2RlID0gU19JUlVHTyB9LAorCS5zaG93ID0gYmxrX21xX2h3X3N5c2ZzX2NwdXNfc2hvdywKK307CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkZWZhdWx0X2h3X2N0eF9hdHRyc1tdID0gewogCSZibGtfbXFfaHdfc3lzZnNfcXVldWVkLmF0dHIsCkBAIC0zMDIsNiArMzMyLDcgQEAKIAkmYmxrX21xX2h3X3N5c2ZzX3BlbmRpbmcuYXR0ciwKIAkmYmxrX21xX2h3X3N5c2ZzX2lwaS5hdHRyLAogCSZibGtfbXFfaHdfc3lzZnNfdGFncy5hdHRyLAorCSZibGtfbXFfaHdfc3lzZnNfY3B1cy5hdHRyLAogCU5VTEwsCiB9OwogCmRpZmYgLS1naXQgYS9ibG9jay9ibGstbXEuYyBiL2Jsb2NrL2Jsay1tcS5jCmluZGV4IDg4M2Y3MjAuLmIxYmNjNjEgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1tcS5jCisrKyBiL2Jsb2NrL2Jsay1tcS5jCkBAIC0zMjAsNyArMzIwLDcgQEAKIAkJcnEtPmNzZC5mdW5jID0gX19ibGtfbXFfY29tcGxldGVfcmVxdWVzdF9yZW1vdGU7CiAJCXJxLT5jc2QuaW5mbyA9IHJxOwogCQlycS0+Y3NkLmZsYWdzID0gMDsKLQkJX19zbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3R4LT5jcHUsICZycS0+Y3NkLCAwKTsKKwkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2FzeW5jKGN0eC0+Y3B1LCAmcnEtPmNzZCk7CiAJfSBlbHNlIHsKIAkJcnEtPnEtPnNvZnRpcnFfZG9uZV9mbihycSk7CiAJfQpAQCAtNTE0LDcgKzUxNCw3IEBACiAJTElTVF9IRUFEKHJxX2xpc3QpOwogCWludCBiaXQsIHF1ZXVlZDsKIAotCWlmICh1bmxpa2VseSh0ZXN0X2JpdChCTEtfTVFfU19TVE9QUEVELCAmaGN0eC0+ZmxhZ3MpKSkKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoQkxLX01RX1NfU1RPUFBFRCwgJmhjdHgtPnN0YXRlKSkpCiAJCXJldHVybjsKIAogCWhjdHgtPnJ1bisrOwpAQCAtNjAzLDcgKzYwMyw3IEBACiAKIHZvaWQgYmxrX21xX3J1bl9od19xdWV1ZShzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eCwgYm9vbCBhc3luYykKIHsKLQlpZiAodW5saWtlbHkodGVzdF9iaXQoQkxLX01RX1NfU1RPUFBFRCwgJmhjdHgtPmZsYWdzKSkpCisJaWYgKHVubGlrZWx5KHRlc3RfYml0KEJMS19NUV9TX1NUT1BQRUQsICZoY3R4LT5zdGF0ZSkpKQogCQlyZXR1cm47CiAKIAlpZiAoIWFzeW5jKQpAQCAtNjIzLDcgKzYyMyw3IEBACiAJcXVldWVfZm9yX2VhY2hfaHdfY3R4KHEsIGhjdHgsIGkpIHsKIAkJaWYgKCghYmxrX21xX2hjdHhfaGFzX3BlbmRpbmcoaGN0eCkgJiYKIAkJICAgIGxpc3RfZW1wdHlfY2FyZWZ1bCgmaGN0eC0+ZGlzcGF0Y2gpKSB8fAotCQkgICAgdGVzdF9iaXQoQkxLX01RX1NfU1RPUFBFRCwgJmhjdHgtPmZsYWdzKSkKKwkJICAgIHRlc3RfYml0KEJMS19NUV9TX1NUT1BQRUQsICZoY3R4LT5zdGF0ZSkpCiAJCQljb250aW51ZTsKIAogCQlibGtfbXFfcnVuX2h3X3F1ZXVlKGhjdHgsIGFzeW5jKTsKQEAgLTk5NCw4ICs5OTQsNDYgQEAKIAlibGtfbXFfcHV0X2N0eChjdHgpOwogfQogCi1zdGF0aWMgdm9pZCBibGtfbXFfaW5pdF9od19jb21tYW5kcyhzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eCwKLQkJCQkgICAgdm9pZCAoKmluaXQpKHZvaWQgKiwgc3RydWN0IGJsa19tcV9od19jdHggKiwKK3N0YXRpYyBpbnQgYmxrX21xX2luaXRfaHdfY29tbWFuZHMoc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgsCisJCQkJICAgaW50ICgqaW5pdCkodm9pZCAqLCBzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqLAorCQkJCQlzdHJ1Y3QgcmVxdWVzdCAqLCB1bnNpZ25lZCBpbnQpLAorCQkJCSAgIHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgaGN0eC0+cXVldWVfZGVwdGg7IGkrKykgeworCQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBoY3R4LT5ycXNbaV07CisKKwkJcmV0ID0gaW5pdChkYXRhLCBoY3R4LCBycSwgaSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYmxrX21xX2luaXRfY29tbWFuZHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCisJCQkgaW50ICgqaW5pdCkodm9pZCAqLCBzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqLAorCQkJCQlzdHJ1Y3QgcmVxdWVzdCAqLCB1bnNpZ25lZCBpbnQpLAorCQkJIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJsa19tcV9od19jdHggKmhjdHg7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldCA9IDA7CisKKwlxdWV1ZV9mb3JfZWFjaF9od19jdHgocSwgaGN0eCwgaSkgeworCQlyZXQgPSBibGtfbXFfaW5pdF9od19jb21tYW5kcyhoY3R4LCBpbml0LCBkYXRhKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGJsa19tcV9pbml0X2NvbW1hbmRzKTsKKworc3RhdGljIHZvaWQgYmxrX21xX2ZyZWVfaHdfY29tbWFuZHMoc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgsCisJCQkJICAgIHZvaWQgKCpmcmVlKSh2b2lkICosIHN0cnVjdCBibGtfbXFfaHdfY3R4ICosCiAJCQkJCXN0cnVjdCByZXF1ZXN0ICosIHVuc2lnbmVkIGludCksCiAJCQkJICAgIHZvaWQgKmRhdGEpCiB7CkBAIC0xMDA0LDEyICsxMDQyLDEyIEBACiAJZm9yIChpID0gMDsgaSA8IGhjdHgtPnF1ZXVlX2RlcHRoOyBpKyspIHsKIAkJc3RydWN0IHJlcXVlc3QgKnJxID0gaGN0eC0+cnFzW2ldOwogCi0JCWluaXQoZGF0YSwgaGN0eCwgcnEsIGkpOworCQlmcmVlKGRhdGEsIGhjdHgsIHJxLCBpKTsKIAl9CiB9CiAKLXZvaWQgYmxrX21xX2luaXRfY29tbWFuZHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCi0JCQkgIHZvaWQgKCppbml0KSh2b2lkICosIHN0cnVjdCBibGtfbXFfaHdfY3R4ICosCit2b2lkIGJsa19tcV9mcmVlX2NvbW1hbmRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAorCQkJICB2b2lkICgqZnJlZSkodm9pZCAqLCBzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqLAogCQkJCQlzdHJ1Y3QgcmVxdWVzdCAqLCB1bnNpZ25lZCBpbnQpLAogCQkJICB2b2lkICpkYXRhKQogewpAQCAtMTAxNyw5ICsxMDU1LDkgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAogCXF1ZXVlX2Zvcl9lYWNoX2h3X2N0eChxLCBoY3R4LCBpKQotCQlibGtfbXFfaW5pdF9od19jb21tYW5kcyhoY3R4LCBpbml0LCBkYXRhKTsKKwkJYmxrX21xX2ZyZWVfaHdfY29tbWFuZHMoaGN0eCwgZnJlZSwgZGF0YSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGJsa19tcV9pbml0X2NvbW1hbmRzKTsKK0VYUE9SVF9TWU1CT0woYmxrX21xX2ZyZWVfY29tbWFuZHMpOwogCiBzdGF0aWMgdm9pZCBibGtfbXFfZnJlZV9ycV9tYXAoc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgpCiB7CkBAIC0xNDMwLDYgKzE0NjgsMTYgQEAKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCit2b2lkIGJsa19tcV9kaXNhYmxlX2hvdHBsdWcodm9pZCkKK3sKKwltdXRleF9sb2NrKCZhbGxfcV9tdXRleCk7Cit9CisKK3ZvaWQgYmxrX21xX2VuYWJsZV9ob3RwbHVnKHZvaWQpCit7CisJbXV0ZXhfdW5sb2NrKCZhbGxfcV9tdXRleCk7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IGJsa19tcV9pbml0KHZvaWQpCiB7CiAJYmxrX21xX2NwdV9pbml0KCk7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstbXEuaCBiL2Jsb2NrL2Jsay1tcS5oCmluZGV4IDcyYmViYTEuLmViYmU2YmEgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1tcS5oCisrKyBiL2Jsb2NrL2Jsay1tcS5oCkBAIC0zOSw2ICszOSw4IEBACiB2b2lkIGJsa19tcV9yZWdpc3Rlcl9jcHVfbm90aWZpZXIoc3RydWN0IGJsa19tcV9jcHVfbm90aWZpZXIgKm5vdGlmaWVyKTsKIHZvaWQgYmxrX21xX3VucmVnaXN0ZXJfY3B1X25vdGlmaWVyKHN0cnVjdCBibGtfbXFfY3B1X25vdGlmaWVyICpub3RpZmllcik7CiB2b2lkIGJsa19tcV9jcHVfaW5pdCh2b2lkKTsKK3ZvaWQgYmxrX21xX2VuYWJsZV9ob3RwbHVnKHZvaWQpOwordm9pZCBibGtfbXFfZGlzYWJsZV9ob3RwbHVnKHZvaWQpOwogCiAvKgogICogQ1BVIC0+IHF1ZXVlIG1hcHBpbmdzCmRpZmYgLS1naXQgYS9ibG9jay9ibGstc29mdGlycS5jIGIvYmxvY2svYmxrLXNvZnRpcnEuYwppbmRleCA1Nzc5MGMxLi5lYmQ2YjZmIDEwMDY0NAotLS0gYS9ibG9jay9ibGstc29mdGlycS5jCisrKyBiL2Jsb2NrL2Jsay1zb2Z0aXJxLmMKQEAgLTMwLDggKzMwLDggQEAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmxvY2FsX2xpc3QpKSB7CiAJCXN0cnVjdCByZXF1ZXN0ICpycTsKIAotCQlycSA9IGxpc3RfZW50cnkobG9jYWxfbGlzdC5uZXh0LCBzdHJ1Y3QgcmVxdWVzdCwgY3NkLmxpc3QpOwotCQlsaXN0X2RlbF9pbml0KCZycS0+Y3NkLmxpc3QpOworCQlycSA9IGxpc3RfZW50cnkobG9jYWxfbGlzdC5uZXh0LCBzdHJ1Y3QgcmVxdWVzdCwgcXVldWVsaXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmcnEtPnF1ZXVlbGlzdCk7CiAJCXJxLT5xLT5zb2Z0aXJxX2RvbmVfZm4ocnEpOwogCX0KIH0KQEAgLTQ1LDkgKzQ1LDE0IEBACiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJbGlzdCA9IHRoaXNfY3B1X3B0cigmYmxrX2NwdV9kb25lKTsKLQlsaXN0X2FkZF90YWlsKCZycS0+Y3NkLmxpc3QsIGxpc3QpOworCS8qCisJICogV2UgcmV1c2UgcXVldWVsaXN0IGZvciBhIGxpc3Qgb2YgcmVxdWVzdHMgdG8gcHJvY2Vzcy4gU2luY2UgdGhlCisJICogcXVldWVsaXN0IGlzIHVzZWQgYnkgdGhlIGJsb2NrIGxheWVyIG9ubHkgZm9yIHJlcXVlc3RzIHdhaXRpbmcgdG8gYmUKKwkgKiBzdWJtaXR0ZWQgdG8gdGhlIGRldmljZSBpdCBpcyB1bnVzZWQgbm93LgorCSAqLworCWxpc3RfYWRkX3RhaWwoJnJxLT5xdWV1ZWxpc3QsIGxpc3QpOwogCi0JaWYgKGxpc3QtPm5leHQgPT0gJnJxLT5jc2QubGlzdCkKKwlpZiAobGlzdC0+bmV4dCA9PSAmcnEtPnF1ZXVlbGlzdCkKIAkJcmFpc2Vfc29mdGlycV9pcnFvZmYoQkxPQ0tfU09GVElSUSk7CiAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CkBAIC02NSw3ICs3MCw3IEBACiAJCWRhdGEtPmluZm8gPSBycTsKIAkJZGF0YS0+ZmxhZ3MgPSAwOwogCi0JCV9fc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgZGF0YSwgMCk7CisJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9hc3luYyhjcHUsIGRhdGEpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTEzNiw3ICsxNDEsNyBAQAogCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogZG9fbG9jYWw6CiAJCWxpc3QgPSB0aGlzX2NwdV9wdHIoJmJsa19jcHVfZG9uZSk7Ci0JCWxpc3RfYWRkX3RhaWwoJnJlcS0+Y3NkLmxpc3QsIGxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZyZXEtPnF1ZXVlbGlzdCwgbGlzdCk7CiAKIAkJLyoKIAkJICogaWYgdGhlIGxpc3Qgb25seSBjb250YWlucyBvdXIganVzdCBhZGRlZCByZXF1ZXN0LApAQCAtMTQ0LDcgKzE0OSw3IEBACiAJCSAqIGVudHJpZXMgdGhlcmUsIHNvbWVvbmUgYWxyZWFkeSByYWlzZWQgdGhlIGlycSBidXQgaXQKIAkJICogaGFzbid0IHJ1biB5ZXQuCiAJCSAqLwotCQlpZiAobGlzdC0+bmV4dCA9PSAmcmVxLT5jc2QubGlzdCkKKwkJaWYgKGxpc3QtPm5leHQgPT0gJnJlcS0+cXVldWVsaXN0KQogCQkJcmFpc2Vfc29mdGlycV9pcnFvZmYoQkxPQ0tfU09GVElSUSk7CiAJfSBlbHNlIGlmIChyYWlzZV9ibGtfaXJxKGNjcHUsIHJlcSkpCiAJCWdvdG8gZG9fbG9jYWw7CmRpZmYgLS1naXQgYS9ibG9jay9jZnEtaW9zY2hlZC5jIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwppbmRleCA3NDQ4MzNiLi41ODczZTRhIDEwMDY0NAotLS0gYS9ibG9jay9jZnEtaW9zY2hlZC5jCisrKyBiL2Jsb2NrL2NmcS1pb3NjaGVkLmMKQEAgLTIzNjcsMTAgKzIzNjcsMTAgQEAKIAkgKiByZXBvc2l0aW9uIGluIGZpZm8gaWYgbmV4dCBpcyBvbGRlciB0aGFuIHJxCiAJICovCiAJaWYgKCFsaXN0X2VtcHR5KCZycS0+cXVldWVsaXN0KSAmJiAhbGlzdF9lbXB0eSgmbmV4dC0+cXVldWVsaXN0KSAmJgotCSAgICB0aW1lX2JlZm9yZShycV9maWZvX3RpbWUobmV4dCksIHJxX2ZpZm9fdGltZShycSkpICYmCisJICAgIHRpbWVfYmVmb3JlKG5leHQtPmZpZm9fdGltZSwgcnEtPmZpZm9fdGltZSkgJiYKIAkgICAgY2ZxcSA9PSBSUV9DRlFRKG5leHQpKSB7CiAJCWxpc3RfbW92ZSgmcnEtPnF1ZXVlbGlzdCwgJm5leHQtPnF1ZXVlbGlzdCk7Ci0JCXJxX3NldF9maWZvX3RpbWUocnEsIHJxX2ZpZm9fdGltZShuZXh0KSk7CisJCXJxLT5maWZvX3RpbWUgPSBuZXh0LT5maWZvX3RpbWU7CiAJfQogCiAJaWYgKGNmcXEtPm5leHRfcnEgPT0gbmV4dCkKQEAgLTI4MTQsNyArMjgxNCw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJcnEgPSBycV9lbnRyeV9maWZvKGNmcXEtPmZpZm8ubmV4dCk7Ci0JaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHJxX2ZpZm9fdGltZShycSkpKQorCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBycS0+Zmlmb190aW1lKSkKIAkJcnEgPSBOVUxMOwogCiAJY2ZxX2xvZ19jZnFxKGNmcXEtPmNmcWQsIGNmcXEsICJmaWZvPSVwIiwgcnEpOwpAQCAtMzkyNyw3ICszOTI3LDcgQEAKIAljZnFfbG9nX2NmcXEoY2ZxZCwgY2ZxcSwgImluc2VydF9yZXF1ZXN0Iik7CiAJY2ZxX2luaXRfcHJpb19kYXRhKGNmcXEsIFJRX0NJQyhycSkpOwogCi0JcnFfc2V0X2ZpZm9fdGltZShycSwgamlmZmllcyArIGNmcWQtPmNmcV9maWZvX2V4cGlyZVtycV9pc19zeW5jKHJxKV0pOworCXJxLT5maWZvX3RpbWUgPSBqaWZmaWVzICsgY2ZxZC0+Y2ZxX2ZpZm9fZXhwaXJlW3JxX2lzX3N5bmMocnEpXTsKIAlsaXN0X2FkZF90YWlsKCZycS0+cXVldWVsaXN0LCAmY2ZxcS0+Zmlmbyk7CiAJY2ZxX2FkZF9ycV9yYihycSk7CiAJY2ZxZ19zdGF0c191cGRhdGVfaW9fYWRkKFJRX0NGUUcocnEpLCBjZnFkLT5zZXJ2aW5nX2dyb3VwLApkaWZmIC0tZ2l0IGEvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jIGIvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jCmluZGV4IDllZjY2NDAuLmE3NTNkZjIgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYworKysgYi9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCS8qCiAJICogc2V0IGV4cGlyZSB0aW1lIGFuZCBhZGQgdG8gZmlmbyBsaXN0CiAJICovCi0JcnFfc2V0X2ZpZm9fdGltZShycSwgamlmZmllcyArIGRkLT5maWZvX2V4cGlyZVtkYXRhX2Rpcl0pOworCXJxLT5maWZvX3RpbWUgPSBqaWZmaWVzICsgZGQtPmZpZm9fZXhwaXJlW2RhdGFfZGlyXTsKIAlsaXN0X2FkZF90YWlsKCZycS0+cXVldWVsaXN0LCAmZGQtPmZpZm9fbGlzdFtkYXRhX2Rpcl0pOwogfQogCkBAIC0xNzQsOSArMTc0LDkgQEAKIAkgKiBhbmQgbW92ZSBpbnRvIG5leHQgcG9zaXRpb24gKG5leHQgd2lsbCBiZSBkZWxldGVkKSBpbiBmaWZvCiAJICovCiAJaWYgKCFsaXN0X2VtcHR5KCZyZXEtPnF1ZXVlbGlzdCkgJiYgIWxpc3RfZW1wdHkoJm5leHQtPnF1ZXVlbGlzdCkpIHsKLQkJaWYgKHRpbWVfYmVmb3JlKHJxX2ZpZm9fdGltZShuZXh0KSwgcnFfZmlmb190aW1lKHJlcSkpKSB7CisJCWlmICh0aW1lX2JlZm9yZShuZXh0LT5maWZvX3RpbWUsIHJlcS0+Zmlmb190aW1lKSkgewogCQkJbGlzdF9tb3ZlKCZyZXEtPnF1ZXVlbGlzdCwgJm5leHQtPnF1ZXVlbGlzdCk7Ci0JCQlycV9zZXRfZmlmb190aW1lKHJlcSwgcnFfZmlmb190aW1lKG5leHQpKTsKKwkJCXJlcS0+Zmlmb190aW1lID0gbmV4dC0+Zmlmb190aW1lOwogCQl9CiAJfQogCkBAIC0yMzAsNyArMjMwLDcgQEAKIAkvKgogCSAqIHJxIGlzIGV4cGlyZWQhCiAJICovCi0JaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcnFfZmlmb190aW1lKHJxKSkpCisJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcnEtPmZpZm9fdGltZSkpCiAJCXJldHVybiAxOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9ibG9jay9wYXJ0aXRpb25zL2F0YXJpLmggYi9ibG9jay9wYXJ0aXRpb25zL2F0YXJpLmgKaW5kZXggZmUyZDMyYS4uZjJlYzQzYiAxMDA2NDQKLS0tIGEvYmxvY2svcGFydGl0aW9ucy9hdGFyaS5oCisrKyBiL2Jsb2NrL3BhcnRpdGlvbnMvYXRhcmkuaApAQCAtMTEsNiArMTEsOCBAQAogICogYnkgR3VlbnRoZXIgS2VsbGV0ZXIgKGd1ZW50aGVyQHBvb2wuaW5mb3JtYXRpay5yd3RoLWFhY2hlbi5kZSkKICAqLwogCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKwogc3RydWN0IHBhcnRpdGlvbl9pbmZvCiB7CiAgIHU4IGZsZzsJCQkvKiBiaXQgMDogYWN0aXZlOyBiaXQgNzogYm9vdGFibGUgKi8KQEAgLTI5LDYgKzMxLDYgQEAKICAgdTMyIGJzbF9zdDsJCQkvKiBzdGFydCBvZiBiYWQgc2VjdG9yIGxpc3QgKi8KICAgdTMyIGJzbF9jbnQ7CQkJLyogbGVuZ3RoIG9mIGJhZCBzZWN0b3IgbGlzdCAqLwogICB1MTYgY2hlY2tzdW07CQkJLyogY2hlY2tzdW0gZm9yIGJvb3RhYmxlIGRpc2tzICovCi19IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKK30gX19wYWNrZWQ7CiAKIGludCBhdGFyaV9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSk7CmRpZmYgLS1naXQgYS9ibG9jay9wYXJ0aXRpb25zL2VmaS5oIGIvYmxvY2svcGFydGl0aW9ucy9lZmkuaAppbmRleCA0ZWZjYWZiLi5hYmQwYjE5MiAxMDA2NDQKLS0tIGEvYmxvY2svcGFydGl0aW9ucy9lZmkuaAorKysgYi9ibG9jay9wYXJ0aXRpb25zL2VmaS5oCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogCiAjZGVmaW5lIE1TRE9TX01CUl9TSUdOQVRVUkUgMHhhYTU1CiAjZGVmaW5lIEVGSV9QTUJSX09TVFlQRV9FRkkgMHhFRgpAQCAtODcsMTMgKzg4LDEzIEBACiAJICoKIAkgKiB1aW50OF90CQlyZXNlcnZlZDJbIEJsb2NrU2l6ZSAtIDkyIF07CiAJICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBncHRfaGVhZGVyOworfSBfX3BhY2tlZCBncHRfaGVhZGVyOwogCiB0eXBlZGVmIHN0cnVjdCBfZ3B0X2VudHJ5X2F0dHJpYnV0ZXMgewogCXU2NCByZXF1aXJlZF90b19mdW5jdGlvbjoxOwogCXU2NCByZXNlcnZlZDo0NzsKICAgICAgICAgdTY0IHR5cGVfZ3VpZF9zcGVjaWZpYzoxNjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGdwdF9lbnRyeV9hdHRyaWJ1dGVzOworfSBfX3BhY2tlZCBncHRfZW50cnlfYXR0cmlidXRlczsKIAogdHlwZWRlZiBzdHJ1Y3QgX2dwdF9lbnRyeSB7CiAJZWZpX2d1aWRfdCBwYXJ0aXRpb25fdHlwZV9ndWlkOwpAQCAtMTAyLDcgKzEwMyw3IEBACiAJX19sZTY0IGVuZGluZ19sYmE7CiAJZ3B0X2VudHJ5X2F0dHJpYnV0ZXMgYXR0cmlidXRlczsKIAllZmlfY2hhcjE2X3QgcGFydGl0aW9uX25hbWVbNzIgLyBzaXplb2YgKGVmaV9jaGFyMTZfdCldOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZ3B0X2VudHJ5OworfSBfX3BhY2tlZCBncHRfZW50cnk7CiAKIHR5cGVkZWYgc3RydWN0IF9ncHRfbWJyX3JlY29yZCB7CiAJdTgJYm9vdF9pbmRpY2F0b3I7IC8qIHVudXNlZCBieSBFRkksIHNldCB0byAweDgwIGZvciBib290YWJsZSAqLwpAQCAtMTI0LDcgKzEyNSw3IEBACiAJX19sZTE2IHVua25vd247CiAJZ3B0X21icl9yZWNvcmQgcGFydGl0aW9uX3JlY29yZFs0XTsKIAlfX2xlMTYgc2lnbmF0dXJlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbGVnYWN5X21icjsKK30gX19wYWNrZWQgbGVnYWN5X21icjsKIAogLyogRnVuY3Rpb25zICovCiBleHRlcm4gaW50IGVmaV9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSk7CmRpZmYgLS1naXQgYS9ibG9jay9wYXJ0aXRpb25zL2thcm1hLmMgYi9ibG9jay9wYXJ0aXRpb25zL2thcm1hLmMKaW5kZXggMGVhMTkzMS4uOTcyMWZhNSAxMDA2NDQKLS0tIGEvYmxvY2svcGFydGl0aW9ucy9rYXJtYS5jCisrKyBiL2Jsb2NrL3BhcnRpdGlvbnMva2FybWEuYwpAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgImNoZWNrLmgiCiAjaW5jbHVkZSAia2FybWEuaCIKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogCiBpbnQga2FybWFfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUpCiB7CkBAIC0yNiw3ICsyNyw3IEBACiAJCX0gZF9wYXJ0aXRpb25zWzJdOwogCQl1OCBkX2JsYW5rWzIwOF07CiAJCV9fbGUxNiBkX21hZ2ljOwotCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgKmxhYmVsOworCX0gX19wYWNrZWQgKmxhYmVsOwogCXN0cnVjdCBkX3BhcnRpdGlvbiAqcDsKIAogCWRhdGEgPSByZWFkX3BhcnRfc2VjdG9yKHN0YXRlLCAwLCAmc2VjdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL0tjb25maWcgYi9kcml2ZXJzL0tjb25maWcKaW5kZXggYjMxMzhmYi4uMGEwYTkwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9LY29uZmlnCisrKyBiL2RyaXZlcnMvS2NvbmZpZwpAQCAtNTIsNiArNTIsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3BpL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zcG1pL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9oc2kvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3Bwcy9LY29uZmlnIgpAQCAtMTcwLDQgKzE3Miw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9wb3dlcmNhcC9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvbWNiL0tjb25maWciCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL01ha2VmaWxlCmluZGV4IDhlM2I4YjAuLmUzY2VkOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9NYWtlZmlsZQpAQCAtNjYsNiArNjYsNyBAQAogb2JqLSQoQ09ORklHX1RBUkdFVF9DT1JFKQkrPSB0YXJnZXQvCiBvYmotJChDT05GSUdfTVREKQkJKz0gbXRkLwogb2JqLSQoQ09ORklHX1NQSSkJCSs9IHNwaS8KK29iai0kKENPTkZJR19TUE1JKQkJKz0gc3BtaS8KIG9iai15CQkJCSs9IGhzaS8KIG9iai15CQkJCSs9IG5ldC8KIG9iai0kKENPTkZJR19BVE0pCQkrPSBhdG0vCkBAIC0xNTUsMyArMTU2LDQgQEAKIG9iai0kKENPTkZJR19OVEIpCQkrPSBudGIvCiBvYmotJChDT05GSUdfRk1DKQkJKz0gZm1jLwogb2JqLSQoQ09ORklHX1BPV0VSQ0FQKQkJKz0gcG93ZXJjYXAvCitvYmotJChDT05GSUdfTUNCKQkJKz0gbWNiLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL0tjb25maWcgYi9kcml2ZXJzL2FjcGkvS2NvbmZpZwppbmRleCA0NzcwZGU1Li5jMjA1NjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvS2NvbmZpZworKysgYi9kcml2ZXJzL2FjcGkvS2NvbmZpZwpAQCAtNDMsMTkgKzQzLDYgQEAKIAlkZXBlbmRzIG9uIFNVU1BFTkQgfHwgSElCRVJOQVRJT04KIAlkZWZhdWx0IHkKIAotY29uZmlnIEFDUElfUFJPQ0ZTCi0JYm9vbCAiRGVwcmVjYXRlZCAvcHJvYy9hY3BpIGZpbGVzIgotCWRlcGVuZHMgb24gUFJPQ19GUwotCWhlbHAKLQkgIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhpcyBvcHRpb24gYWxsb3dzCi0JICBkZXByZWNhdGVkIC9wcm9jL2FjcGkvIGZpbGVzIHRvIGV4aXN0LCBldmVuIHdoZW4KLQkgIHRoZXkgaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5IGZ1bmN0aW9ucyBpbiAvc3lzLgotCi0JICBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIC9wcm9jL2FjcGkvIGZpbGVzCi0JICBhbmQgZnVuY3Rpb25zIHdoaWNoIGRvIG5vdCB5ZXQgZXhpc3QgaW4gL3N5cy4KLQotCSAgU2F5IE4gdG8gZGVsZXRlIC9wcm9jL2FjcGkvIGZpbGVzIHRoYXQgaGF2ZSBtb3ZlZCB0byAvc3lzLwotCiBjb25maWcgQUNQSV9FQ19ERUJVR0ZTCiAJdHJpc3RhdGUgIkVDIHJlYWQvd3JpdGUgYWNjZXNzIHRocm91Z2ggL3N5cy9rZXJuZWwvZGVidWcvZWMiCiAJZGVmYXVsdCBuCkBAIC0xMTUsNyArMTAyLDcgQEAKIAogY29uZmlnIEFDUElfVklERU8KIAl0cmlzdGF0ZSAiVmlkZW8iCi0JZGVwZW5kcyBvbiBYODYgJiYgQkFDS0xJR0hUX0NMQVNTX0RFVklDRSAmJiBWSURFT19PVVRQVVRfQ09OVFJPTAorCWRlcGVuZHMgb24gWDg2ICYmIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKIAlkZXBlbmRzIG9uIElOUFVUCiAJc2VsZWN0IFRIRVJNQUwKIAloZWxwCkBAIC0zNDMsNiArMzMwLDE5IEBACiAJICBkYXRhIGZyb20gdGhlIGZpcm13YXJlIGJvb3Qgc3BsYXNoLiBJdCB3aWxsIGFwcGVhciB1bmRlcgogCSAgL3N5cy9maXJtd2FyZS9hY3BpL2JncnQvIC4KIAorY29uZmlnIEFDUElfUkVEVUNFRF9IQVJEV0FSRV9PTkxZCisJYm9vbCAiSGFyZHdhcmUtcmVkdWNlZCBBQ1BJIHN1cHBvcnQgb25seSIgaWYgRVhQRVJUCisJZGVmX2Jvb2wgbgorCWRlcGVuZHMgb24gQUNQSQorCWhlbHAKKwlUaGlzIGNvbmZpZyBpdGVtIGNoYW5nZXMgdGhlIHdheSB0aGUgQUNQSSBjb2RlIGlzIGJ1aWx0LiAgV2hlbiB0aGlzCisJb3B0aW9uIGlzIHNlbGVjdGVkLCB0aGUga2VybmVsIHdpbGwgdXNlIGEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZgorCUFDUElDQSB0aGF0IE9OTFkgc3VwcG9ydHMgdGhlIEFDUEkgInJlZHVjZWQgaGFyZHdhcmUiIG1vZGUuICBUaGUKKwlyZXN1bHRpbmcga2VybmVsIHdpbGwgYmUgc21hbGxlciBidXQgaXQgd2lsbCBhbHNvIGJlIHJlc3RyaWN0ZWQgdG8KKwlydW5uaW5nIGluIEFDUEkgcmVkdWNlZCBoYXJkd2FyZSBtb2RlIE9OTFkuCisKKwlJZiB5b3UgYXJlIHVuc3VyZSB3aGF0IHRvIGRvLCBkbyBub3QgZW5hYmxlIHRoaXMgb3B0aW9uLgorCiBzb3VyY2UgImRyaXZlcnMvYWNwaS9hcGVpL0tjb25maWciCiAKIGNvbmZpZyBBQ1BJX0VYVExPRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjLmMgYi9kcml2ZXJzL2FjcGkvYWMuYwppbmRleCA2ZjE5MGJjLi4yYzAxYzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWMuYworKysgYi9kcml2ZXJzL2FjcGkvYWMuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlICJiYXR0ZXJ5LmgiCiAKICNkZWZpbmUgUFJFRklYICJBQ1BJOiAiCiAKQEAgLTU3LDYgKzU4LDcgQEAKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGNoYXJnZXI7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAl1bnNpZ25lZCBsb25nIGxvbmcgc3RhdGU7CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGJhdHRlcnlfbmI7CiB9OwogCiAjZGVmaW5lIHRvX2FjcGlfYWMoeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBhY3BpX2FjLCBjaGFyZ2VyKQpAQCAtMTUyLDYgKzE1NCwyNiBAQAogCXJldHVybjsKIH0KIAorc3RhdGljIGludCBhY3BpX2FjX2JhdHRlcnlfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYWNwaV9hYyAqYWMgPSBjb250YWluZXJfb2YobmIsIHN0cnVjdCBhY3BpX2FjLCBiYXR0ZXJ5X25iKTsKKwlzdHJ1Y3QgYWNwaV9idXNfZXZlbnQgKmV2ZW50ID0gKHN0cnVjdCBhY3BpX2J1c19ldmVudCAqKWRhdGE7CisKKwkvKgorCSAqIE9uIEhQIFBhdmlsaW9uIGR2Ni02MTc5ZXIgQUMgc3RhdHVzIG5vdGlmaWNhdGlvbnMgYXJlbid0IHRyaWdnZXJlZAorCSAqIHdoZW4gYWRhcHRlciBpcyBwbHVnZ2VkL3VucGx1Z2dlZC4gSG93ZXZlciwgYmF0dGVyeSBzdGF0dXMKKwkgKiBub3RpZmNhdGlvbnMgYXJlIHRyaWdnZXJlZCB3aGVuIGJhdHRlcnkgc3RhcnRzIGNoYXJnaW5nIG9yCisJICogZGlzY2hhcmdpbmcuIFJlLXJlYWRpbmcgQUMgc3RhdHVzIHRyaWdnZXJzIGxvc3QgQUMgbm90aWZpY2F0aW9ucywKKwkgKiBpZiBBQyBzdGF0dXMgaGFzIGNoYW5nZWQuCisJICovCisJaWYgKHN0cmNtcChldmVudC0+ZGV2aWNlX2NsYXNzLCBBQ1BJX0JBVFRFUllfQ0xBU1MpID09IDAgJiYKKwkgICAgZXZlbnQtPnR5cGUgPT0gQUNQSV9CQVRURVJZX05PVElGWV9TVEFUVVMpCisJCWFjcGlfYWNfZ2V0X3N0YXRlKGFjKTsKKworCXJldHVybiBOT1RJRllfT0s7Cit9CisKIHN0YXRpYyBpbnQgdGhpbmtwYWRfZTUzMF9xdWlyayhjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKIHsKIAlhY19zbGVlcF9iZWZvcmVfZ2V0X3N0YXRlX21zID0gMTAwMDsKQEAgLTIxNSw2ICsyMzcsOCBAQAogCSAgICAgICBhY3BpX2RldmljZV9uYW1lKGFkZXYpLCBhY3BpX2RldmljZV9iaWQoYWRldiksCiAJICAgICAgIGFjLT5zdGF0ZSA/ICJvbi1saW5lIiA6ICJvZmYtbGluZSIpOwogCisJYWMtPmJhdHRlcnlfbmIubm90aWZpZXJfY2FsbCA9IGFjcGlfYWNfYmF0dGVyeV9ub3RpZnk7CisJcmVnaXN0ZXJfYWNwaV9ub3RpZmllcigmYWMtPmJhdHRlcnlfbmIpOwogZW5kOgogCWlmIChyZXN1bHQpCiAJCWtmcmVlKGFjKTsKQEAgLTI2MSw2ICsyODUsNyBAQAogCWFjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJaWYgKGFjLT5jaGFyZ2VyLmRldikKIAkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmFjLT5jaGFyZ2VyKTsKKwl1bnJlZ2lzdGVyX2FjcGlfbm90aWZpZXIoJmFjLT5iYXR0ZXJ5X25iKTsKIAogCWtmcmVlKGFjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGlfY21vc19ydGMuYyBiL2RyaXZlcnMvYWNwaS9hY3BpX2Ntb3NfcnRjLmMKaW5kZXggODQxOTBlZC4uOTYxYjQ1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGlfY21vc19ydGMuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaV9jbW9zX3J0Yy5jCkBAIC0xOCw4ICsxOCw2IEBACiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi0jZGVmaW5lIFBSRUZJWCAiQUNQSTogIgotCiBBQ1BJX01PRFVMRV9OQU1FKCJjbW9zIHJ0YyIpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGFjcGlfY21vc19ydGNfaWRzW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaV9scHNzLmMgYi9kcml2ZXJzL2FjcGkvYWNwaV9scHNzLmMKaW5kZXggNjc0NWZlMS4uNjllMjlmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGlfbHBzcy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpX2xwc3MuYwpAQCAtMzMsNiArMzMsMTMgQEAKICNkZWZpbmUgTFBTU19HRU5FUkFMX1VBUlRfUlRTX09WUkQJQklUKDMpCiAjZGVmaW5lIExQU1NfU1dfTFRSCQkJMHgxMAogI2RlZmluZSBMUFNTX0FVVE9fTFRSCQkJMHgxNAorI2RlZmluZSBMUFNTX0xUUl9TTk9PUF9SRVEJCUJJVCgxNSkKKyNkZWZpbmUgTFBTU19MVFJfU05PT1BfTUFTSwkJMHgwMDAwRkZGRgorI2RlZmluZSBMUFNTX0xUUl9TTk9PUF9MQVRfMVVTCQkweDgwMAorI2RlZmluZSBMUFNTX0xUUl9TTk9PUF9MQVRfMzJVUwkJMHhDMDAKKyNkZWZpbmUgTFBTU19MVFJfU05PT1BfTEFUX1NISUZUCTUKKyNkZWZpbmUgTFBTU19MVFJfU05PT1BfTEFUX0NVVE9GRgkzMDAwCisjZGVmaW5lIExQU1NfTFRSX01BWF9WQUwJCTB4M0ZGCiAjZGVmaW5lIExQU1NfVFhfSU5UCQkJMHgyMAogI2RlZmluZSBMUFNTX1RYX0lOVF9NQVNLCQlCSVQoMSkKIApAQCAtMTAyLDYgKzEwOSwxNiBAQAogCS5sdHJfcmVxdWlyZWQgPSB0cnVlLAogfTsKIAorc3RhdGljIHN0cnVjdCBscHNzX3NoYXJlZF9jbG9jayBwd21fY2xvY2sgPSB7CisJLm5hbWUgPSAicHdtX2NsayIsCisJLnJhdGUgPSAyNTAwMDAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbHBzc19kZXZpY2VfZGVzYyBieXRfcHdtX2Rldl9kZXNjID0geworCS5jbGtfcmVxdWlyZWQgPSB0cnVlLAorCS5zaGFyZWRfY2xvY2sgPSAmcHdtX2Nsb2NrLAorfTsKKwogc3RhdGljIHN0cnVjdCBscHNzX3NoYXJlZF9jbG9jayB1YXJ0X2Nsb2NrID0gewogCS5uYW1lID0gInVhcnRfY2xrIiwKIAkucmF0ZSA9IDQ0MjM2ODAwLApAQCAtMTU3LDYgKzE3NCw3IEBACiAJeyAiSU5UMzNDNyIsIH0sCiAKIAkvKiBCYXlUcmFpbCBMUFNTIGRldmljZXMgKi8KKwl7ICI4MDg2MEYwOSIsICh1bnNpZ25lZCBsb25nKSZieXRfcHdtX2Rldl9kZXNjIH0sCiAJeyAiODA4NjBGMEEiLCAodW5zaWduZWQgbG9uZykmYnl0X3VhcnRfZGV2X2Rlc2MgfSwKIAl7ICI4MDg2MEYwRSIsICh1bnNpZ25lZCBsb25nKSZieXRfc3BpX2Rldl9kZXNjIH0sCiAJeyAiODA4NjBGMTQiLCAodW5zaWduZWQgbG9uZykmYnl0X3NkaW9fZGV2X2Rlc2MgfSwKQEAgLTMxNSw2ICszMzMsMTcgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdTMyIF9fbHBzc19yZWdfcmVhZChzdHJ1Y3QgbHBzc19wcml2YXRlX2RhdGEgKnBkYXRhLCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXJldHVybiByZWFkbChwZGF0YS0+bW1pb19iYXNlICsgcGRhdGEtPmRldl9kZXNjLT5wcnZfb2Zmc2V0ICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgX19scHNzX3JlZ193cml0ZSh1MzIgdmFsLCBzdHJ1Y3QgbHBzc19wcml2YXRlX2RhdGEgKnBkYXRhLAorCQkJICAgICB1bnNpZ25lZCBpbnQgcmVnKQoreworCXdyaXRlbCh2YWwsIHBkYXRhLT5tbWlvX2Jhc2UgKyBwZGF0YS0+ZGV2X2Rlc2MtPnBydl9vZmZzZXQgKyByZWcpOworfQorCiBzdGF0aWMgaW50IGxwc3NfcmVnX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnLCB1MzIgKnZhbCkKIHsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXY7CkBAIC0zMzYsNyArMzY1LDcgQEAKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CiAJfQotCSp2YWwgPSByZWFkbChwZGF0YS0+bW1pb19iYXNlICsgcGRhdGEtPmRldl9kZXNjLT5wcnZfb2Zmc2V0ICsgcmVnKTsKKwkqdmFsID0gX19scHNzX3JlZ19yZWFkKHBkYXRhLCByZWcpOwogCiAgb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cG93ZXIubG9jaywgZmxhZ3MpOwpAQCAtMzg5LDYgKzQxOCwzNyBAQAogCS5uYW1lID0gImxwc3NfbHRyIiwKIH07CiAKK3N0YXRpYyB2b2lkIGFjcGlfbHBzc19zZXRfbHRyKHN0cnVjdCBkZXZpY2UgKmRldiwgczMyIHZhbCkKK3sKKwlzdHJ1Y3QgbHBzc19wcml2YXRlX2RhdGEgKnBkYXRhID0gYWNwaV9kcml2ZXJfZGF0YShBQ1BJX0NPTVBBTklPTihkZXYpKTsKKwl1MzIgbHRyX21vZGUsIGx0cl92YWw7CisKKwlsdHJfbW9kZSA9IF9fbHBzc19yZWdfcmVhZChwZGF0YSwgTFBTU19HRU5FUkFMKTsKKwlpZiAodmFsIDwgMCkgeworCQlpZiAobHRyX21vZGUgJiBMUFNTX0dFTkVSQUxfTFRSX01PREVfU1cpIHsKKwkJCWx0cl9tb2RlICY9IH5MUFNTX0dFTkVSQUxfTFRSX01PREVfU1c7CisJCQlfX2xwc3NfcmVnX3dyaXRlKGx0cl9tb2RlLCBwZGF0YSwgTFBTU19HRU5FUkFMKTsKKwkJfQorCQlyZXR1cm47CisJfQorCWx0cl92YWwgPSBfX2xwc3NfcmVnX3JlYWQocGRhdGEsIExQU1NfU1dfTFRSKSAmIH5MUFNTX0xUUl9TTk9PUF9NQVNLOworCWlmICh2YWwgPj0gTFBTU19MVFJfU05PT1BfTEFUX0NVVE9GRikgeworCQlsdHJfdmFsIHw9IExQU1NfTFRSX1NOT09QX0xBVF8zMlVTOworCQl2YWwgPSBMUFNTX0xUUl9NQVhfVkFMOworCX0gZWxzZSBpZiAodmFsID4gTFBTU19MVFJfTUFYX1ZBTCkgeworCQlsdHJfdmFsIHw9IExQU1NfTFRSX1NOT09QX0xBVF8zMlVTIHwgTFBTU19MVFJfU05PT1BfUkVROworCQl2YWwgPj49IExQU1NfTFRSX1NOT09QX0xBVF9TSElGVDsKKwl9IGVsc2UgeworCQlsdHJfdmFsIHw9IExQU1NfTFRSX1NOT09QX0xBVF8xVVMgfCBMUFNTX0xUUl9TTk9PUF9SRVE7CisJfQorCWx0cl92YWwgfD0gdmFsOworCV9fbHBzc19yZWdfd3JpdGUobHRyX3ZhbCwgcGRhdGEsIExQU1NfU1dfTFRSKTsKKwlpZiAoIShsdHJfbW9kZSAmIExQU1NfR0VORVJBTF9MVFJfTU9ERV9TVykpIHsKKwkJbHRyX21vZGUgfD0gTFBTU19HRU5FUkFMX0xUUl9NT0RFX1NXOworCQlfX2xwc3NfcmVnX3dyaXRlKGx0cl9tb2RlLCBwZGF0YSwgTFBTU19HRU5FUkFMKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgYWNwaV9scHNzX3BsYXRmb3JtX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAogCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpCiB7CkBAIC00MjYsOSArNDg2LDI5IEBACiAJLm5vdGlmaWVyX2NhbGwgPSBhY3BpX2xwc3NfcGxhdGZvcm1fbm90aWZ5LAogfTsKIAorc3RhdGljIHZvaWQgYWNwaV9scHNzX2JpbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBscHNzX3ByaXZhdGVfZGF0YSAqcGRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKEFDUElfQ09NUEFOSU9OKGRldikpOworCisJaWYgKCFwZGF0YSB8fCAhcGRhdGEtPm1taW9fYmFzZSB8fCAhcGRhdGEtPmRldl9kZXNjLT5sdHJfcmVxdWlyZWQpCisJCXJldHVybjsKKworCWlmIChwZGF0YS0+bW1pb19zaXplID49IHBkYXRhLT5kZXZfZGVzYy0+cHJ2X29mZnNldCArIExQU1NfTFRSX1NJWkUpCisJCWRldi0+cG93ZXIuc2V0X2xhdGVuY3lfdG9sZXJhbmNlID0gYWNwaV9scHNzX3NldF9sdHI7CisJZWxzZQorCQlkZXZfZXJyKGRldiwgIk1NSU8gc2l6ZSBpbnN1ZmZpY2llbnQgdG8gYWNjZXNzIExUUlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfbHBzc191bmJpbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWRldi0+cG93ZXIuc2V0X2xhdGVuY3lfdG9sZXJhbmNlID0gTlVMTDsKK30KKwogc3RhdGljIHN0cnVjdCBhY3BpX3NjYW5faGFuZGxlciBscHNzX2hhbmRsZXIgPSB7CiAJLmlkcyA9IGFjcGlfbHBzc19kZXZpY2VfaWRzLAogCS5hdHRhY2ggPSBhY3BpX2xwc3NfY3JlYXRlX2RldmljZSwKKwkuYmluZCA9IGFjcGlfbHBzc19iaW5kLAorCS51bmJpbmQgPSBhY3BpX2xwc3NfdW5iaW5kLAogfTsKIAogdm9pZCBfX2luaXQgYWNwaV9scHNzX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpX3BhZC5jIGIvZHJpdmVycy9hY3BpL2FjcGlfcGFkLmMKaW5kZXggZGY5NmEwZi4uMzdkNzMwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGlfcGFkLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGlfcGFkLmMKQEAgLTQwOCwyOCArNDA4LDE0IEBACiAJcmV0dXJuIG51bTsKIH0KIAotLyogTm90aWZ5IGZpcm13YXJlIGhvdyBtYW55IENQVXMgYXJlIGlkbGUgKi8KLXN0YXRpYyB2b2lkIGFjcGlfcGFkX29zdChhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBzdGF0LAotCXVpbnQzMl90IGlkbGVfY3B1cykKLXsKLQl1bmlvbiBhY3BpX29iamVjdCBwYXJhbXNbM10gPSB7Ci0JCXsudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSLH0sCi0JCXsudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSLH0sCi0JCXsudHlwZSA9IEFDUElfVFlQRV9CVUZGRVIsfSwKLQl9OwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0ID0gezMsIHBhcmFtc307Ci0KLQlwYXJhbXNbMF0uaW50ZWdlci52YWx1ZSA9IEFDUElfUFJPQ0VTU09SX0FHR1JFR0FUT1JfTk9USUZZOwotCXBhcmFtc1sxXS5pbnRlZ2VyLnZhbHVlID0gIHN0YXQ7Ci0JcGFyYW1zWzJdLmJ1ZmZlci5sZW5ndGggPSA0OwotCXBhcmFtc1syXS5idWZmZXIucG9pbnRlciA9ICh2b2lkICopJmlkbGVfY3B1czsKLQlhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsICJfT1NUIiwgJmFyZ19saXN0LCBOVUxMKTsKLX0KLQogc3RhdGljIHZvaWQgYWNwaV9wYWRfaGFuZGxlX25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUpCiB7CiAJaW50IG51bV9jcHVzOwogCXVpbnQzMl90IGlkbGVfY3B1czsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgcGFyYW0gPSB7CisJCS5sZW5ndGggPSA0LAorCQkucG9pbnRlciA9ICh2b2lkICopJmlkbGVfY3B1cywKKwl9OwogCiAJbXV0ZXhfbG9jaygmaXNvbGF0ZWRfY3B1c19sb2NrKTsKIAludW1fY3B1cyA9IGFjcGlfcGFkX3B1cihoYW5kbGUpOwpAQCAtNDM5LDcgKzQyNSw3IEBACiAJfQogCWFjcGlfcGFkX2lkbGVfY3B1cyhudW1fY3B1cyk7CiAJaWRsZV9jcHVzID0gYWNwaV9wYWRfaWRsZV9jcHVzX251bSgpOwotCWFjcGlfcGFkX29zdChoYW5kbGUsIDAsIGlkbGVfY3B1cyk7CisJYWNwaV9ldmFsdWF0ZV9vc3QoaGFuZGxlLCBBQ1BJX1BST0NFU1NPUl9BR0dSRUdBVE9SX05PVElGWSwgMCwgJnBhcmFtKTsKIAltdXRleF91bmxvY2soJmlzb2xhdGVkX2NwdXNfbG9jayk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvTWFrZWZpbGUgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL01ha2VmaWxlCmluZGV4IDQzODMwNDAuLmI3ZWQ4NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9NYWtlZmlsZQpAQCAtMTIyLDYgKzEyMiw4IEBACiAJcnNhZGRyLm8JXAogCXJzY2FsYy5vCVwKIAlyc2NyZWF0ZS5vCVwKKwlyc2R1bXAubwlcCisJcnNkdW1waW5mby5vCVwKIAlyc2luZm8ubwlcCiAJcnNpby5vCQlcCiAJcnNpcnEubwkJXApAQCAtMTMyLDggKzEzNCw2IEBACiAJcnN1dGlscy5vCVwKIAlyc3hmYWNlLm8KIAotYWNwaS0kKEFDUElfRlVUVVJFX1VTQUdFKSArPSByc2R1bXAubyByc2R1bXBpbmZvLm8KLQogYWNwaS15ICs9CQlcCiAJdGJmYWR0Lm8JXAogCXRiZmluZC5vCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNjb21tb24uaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNjb21tb24uaAppbmRleCA4YTZjNGEwLi42ZjFjNjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjY29tbW9uLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2NvbW1vbi5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2RlYnVnLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZGVidWcuaAppbmRleCAyYmYzY2EyLi42OGE5MWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZGVidWcuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZGVidWcuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTExNSw2ICsxMTUsOCBAQAogCQkJCQkJICAgY2hhciAqYmxvY2tfYXJnKSkKIEFDUElfSFdfREVQRU5ERU5UX1JFVFVSTl9WT0lEKHZvaWQgYWNwaV9kYl9nZW5lcmF0ZV9zY2kodm9pZCkpCiAKK3ZvaWQgYWNwaV9kYl9leGVjdXRlX3Rlc3QoY2hhciAqdHlwZV9hcmcpOworCiAvKgogICogZGJjb252ZXJ0IC0gbWlzY2VsbGFuZW91cyBjb252ZXJzaW9uIHJvdXRpbmVzCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNkaXNwYXQuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNkaXNwYXQuaAppbmRleCA0MjdkYjcyLi41YjQ3MmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZGlzcGF0LmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2Rpc3BhdC5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2V2ZW50cy5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2V2ZW50cy5oCmluZGV4IDBmYjBhZGYuLjY4ZWM2MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNldmVudHMuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZXZlbnRzLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZ2xvYmFsLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZ2xvYmFsLmgKaW5kZXggNGVkMWFhMy4uOGY0MGJiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2dsb2JhbC5oCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNnbG9iYWwuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTUxLDExICs1MSwxOSBAQAogICogdG8gc2ltcGxpZnkgbWFpbnRlbmFuY2Ugb2YgdGhlIGNvZGUuCiAgKi8KICNpZmRlZiBERUZJTkVfQUNQSV9HTE9CQUxTCi0jZGVmaW5lIEFDUElfRVhURVJOCi0jZGVmaW5lIEFDUElfSU5JVF9HTE9CQUwoYSxiKSBhPWIKKyNkZWZpbmUgQUNQSV9HTE9CQUwodHlwZSxuYW1lKSBcCisJZXh0ZXJuIHR5cGUgbmFtZTsgXAorCXR5cGUgbmFtZQorCisjZGVmaW5lIEFDUElfSU5JVF9HTE9CQUwodHlwZSxuYW1lLHZhbHVlKSBcCisJdHlwZSBuYW1lPXZhbHVlCisKICNlbHNlCi0jZGVmaW5lIEFDUElfRVhURVJOIGV4dGVybgotI2RlZmluZSBBQ1BJX0lOSVRfR0xPQkFMKGEsYikgYQorI2RlZmluZSBBQ1BJX0dMT0JBTCh0eXBlLG5hbWUpIFwKKwlleHRlcm4gdHlwZSBuYW1lCisKKyNkZWZpbmUgQUNQSV9JTklUX0dMT0JBTCh0eXBlLG5hbWUsdmFsdWUpIFwKKwlleHRlcm4gdHlwZSBuYW1lCiAjZW5kaWYKIAogI2lmZGVmIERFRklORV9BQ1BJX0dMT0JBTFMKQEAgLTgyLDcgKzkwLDcgQEAKICAqIDUpIEFsbG93IHVucmVzb2x2ZWQgcmVmZXJlbmNlcyAoaW52YWxpZCB0YXJnZXQgbmFtZSkgaW4gcGFja2FnZSBvYmplY3RzCiAgKiA2KSBFbmFibGUgd2FybmluZyBtZXNzYWdlcyBmb3IgYmVoYXZpb3IgdGhhdCBpcyBub3QgQUNQSSBzcGVjIGNvbXBsaWFudAogICovCi11OCBBQ1BJX0lOSVRfR0xPQkFMKGFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaywgRkFMU0UpOworQUNQSV9JTklUX0dMT0JBTCh1OCwgYWNwaV9nYmxfZW5hYmxlX2ludGVycHJldGVyX3NsYWNrLCBGQUxTRSk7CiAKIC8qCiAgKiBBdXRvbWF0aWNhbGx5IHNlcmlhbGl6ZSBBTEwgY29udHJvbCBtZXRob2RzPyBEZWZhdWx0IGlzIEZBTFNFLCBtZWFuaW5nCkBAIC05MCwyNSArOTgsMjUgQEAKICAqIE9ubHkgY2hhbmdlIHRoaXMgaWYgdGhlIEFTTCBjb2RlIGlzIHBvb3JseSB3cml0dGVuIGFuZCBjYW5ub3QgaGFuZGxlCiAgKiByZWVudHJhbmN5IGV2ZW4gdGhvdWdoIG1ldGhvZHMgYXJlIG1hcmtlZCAiTm90U2VyaWFsaXplZCIuCiAgKi8KLXU4IEFDUElfSU5JVF9HTE9CQUwoYWNwaV9nYmxfYWxsX21ldGhvZHNfc2VyaWFsaXplZCwgRkFMU0UpOworQUNQSV9JTklUX0dMT0JBTCh1OCwgYWNwaV9nYmxfYWxsX21ldGhvZHNfc2VyaWFsaXplZCwgRkFMU0UpOwogCiAvKgogICogQ3JlYXRlIHRoZSBwcmVkZWZpbmVkIF9PU0kgbWV0aG9kIGluIHRoZSBuYW1lc3BhY2U/IERlZmF1bHQgaXMgVFJVRQogICogYmVjYXVzZSBBQ1BJIENBIGlzIGZ1bGx5IGNvbXBhdGlibGUgd2l0aCBvdGhlciBBQ1BJIGltcGxlbWVudGF0aW9ucy4KICAqIENoYW5naW5nIHRoaXMgd2lsbCByZXZlcnQgQUNQSSBDQSAoYW5kIG1hY2hpbmUgQVNMKSB0byBwcmUtT1NJIGJlaGF2aW9yLgogICovCi11OCBBQ1BJX0lOSVRfR0xPQkFMKGFjcGlfZ2JsX2NyZWF0ZV9vc2lfbWV0aG9kLCBUUlVFKTsKK0FDUElfSU5JVF9HTE9CQUwodTgsIGFjcGlfZ2JsX2NyZWF0ZV9vc2lfbWV0aG9kLCBUUlVFKTsKIAogLyoKICAqIE9wdGlvbmFsbHkgdXNlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgQUNQSSByZWdpc3RlciB3aWR0aHMuIFNldCB0aGlzIHRvCiAgKiBUUlVFIHRvIHVzZSB0aGUgZGVmYXVsdHMsIGlmIGFuIEZBRFQgY29udGFpbnMgaW5jb3JyZWN0IHdpZHRocy9sZW5ndGhzLgogICovCi11OCBBQ1BJX0lOSVRfR0xPQkFMKGFjcGlfZ2JsX3VzZV9kZWZhdWx0X3JlZ2lzdGVyX3dpZHRocywgVFJVRSk7CitBQ1BJX0lOSVRfR0xPQkFMKHU4LCBhY3BpX2dibF91c2VfZGVmYXVsdF9yZWdpc3Rlcl93aWR0aHMsIFRSVUUpOwogCiAvKgogICogT3B0aW9uYWxseSBlbmFibGUgb3V0cHV0IGZyb20gdGhlIEFNTCBEZWJ1ZyBPYmplY3QuCiAgKi8KLXU4IEFDUElfSU5JVF9HTE9CQUwoYWNwaV9nYmxfZW5hYmxlX2FtbF9kZWJ1Z19vYmplY3QsIEZBTFNFKTsKK0FDUElfSU5JVF9HTE9CQUwodTgsIGFjcGlfZ2JsX2VuYWJsZV9hbWxfZGVidWdfb2JqZWN0LCBGQUxTRSk7CiAKIC8qCiAgKiBPcHRpb25hbGx5IGNvcHkgdGhlIGVudGlyZSBEU0RUIHRvIGxvY2FsIG1lbW9yeSAoaW5zdGVhZCBvZiBzaW1wbHkKQEAgLTExNiw3ICsxMjQsNyBAQAogICogRFNEVCwgY3JlYXRpbmcgdGhlIG5lZWQgZm9yIHRoaXMgb3B0aW9uLiBEZWZhdWx0IGlzIEZBTFNFLCBkbyBub3QgY29weQogICogdGhlIERTRFQuCiAgKi8KLXU4IEFDUElfSU5JVF9HTE9CQUwoYWNwaV9nYmxfY29weV9kc2R0X2xvY2FsbHksIEZBTFNFKTsKK0FDUElfSU5JVF9HTE9CQUwodTgsIGFjcGlfZ2JsX2NvcHlfZHNkdF9sb2NhbGx5LCBGQUxTRSk7CiAKIC8qCiAgKiBPcHRpb25hbGx5IGlnbm9yZSBhbiBYU0RUIGlmIHByZXNlbnQgYW5kIHVzZSB0aGUgUlNEVCBpbnN0ZWFkLgpAQCAtMTI0LDcgKzEzMiw3IEBACiAgKiBvZiB0aGUgUlNEVCwgdGhlIFhTRFQgaGFzIGJlZW4gZm91bmQgdG8gYmUgY29ycnVwdCBvciBpbGwtZm9ybWVkIG9uCiAgKiBzb21lIG1hY2hpbmVzLiBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHVzZSB0aGUgWFNEVCBpZiBwcmVzZW50LgogICovCi11OCBBQ1BJX0lOSVRfR0xPQkFMKGFjcGlfZ2JsX2RvX25vdF91c2VfeHNkdCwgRkFMU0UpOworQUNQSV9JTklUX0dMT0JBTCh1OCwgYWNwaV9nYmxfZG9fbm90X3VzZV94c2R0LCBGQUxTRSk7CiAKIC8qCiAgKiBPcHRpb25hbGx5IHVzZSAzMi1iaXQgRkFEVCBhZGRyZXNzZXMgaWYgYW5kIHdoZW4gdGhlcmUgaXMgYSBjb25mbGljdApAQCAtMTM0LDcgKzE0Miw3IEBACiAgKiBzb21lIG1hY2hpbmVzIGhhdmUgYmVlbiBmb3VuZCB0byBoYXZlIGEgY29ycnVwdGVkIG5vbi16ZXJvIDY0LWJpdAogICogYWRkcmVzcy4gRGVmYXVsdCBpcyBGQUxTRSwgZG8gbm90IGZhdm9yIHRoZSAzMi1iaXQgYWRkcmVzc2VzLgogICovCi11OCBBQ1BJX0lOSVRfR0xPQkFMKGFjcGlfZ2JsX3VzZTMyX2JpdF9mYWR0X2FkZHJlc3NlcywgRkFMU0UpOworQUNQSV9JTklUX0dMT0JBTCh1OCwgYWNwaV9nYmxfdXNlMzJfYml0X2ZhZHRfYWRkcmVzc2VzLCBGQUxTRSk7CiAKIC8qCiAgKiBPcHRpb25hbGx5IHRydW5jYXRlIEkvTyBhZGRyZXNzZXMgdG8gMTYgYml0cy4gUHJvdmlkZXMgY29tcGF0aWJpbGl0eQpAQCAtMTQyLDQ3ICsxNTAsMjggQEAKICAqIHRoaXMgdmFsdWUgaXMgc2V0IHRvIFRSVUUgaWYgYW55IFdpbmRvd3MgT1NJIHN0cmluZ3MgaGF2ZSBiZWVuCiAgKiByZXF1ZXN0ZWQgYnkgdGhlIEJJT1MuCiAgKi8KLXU4IEFDUElfSU5JVF9HTE9CQUwoYWNwaV9nYmxfdHJ1bmNhdGVfaW9fYWRkcmVzc2VzLCBGQUxTRSk7CitBQ1BJX0lOSVRfR0xPQkFMKHU4LCBhY3BpX2dibF90cnVuY2F0ZV9pb19hZGRyZXNzZXMsIEZBTFNFKTsKIAogLyoKICAqIERpc2FibGUgcnVudGltZSBjaGVja2luZyBhbmQgcmVwYWlyIG9mIHZhbHVlcyByZXR1cm5lZCBieSBjb250cm9sIG1ldGhvZHMuCiAgKiBVc2Ugb25seSBpZiB0aGUgcmVwYWlyIGlzIGNhdXNpbmcgYSBwcm9ibGVtIG9uIGEgcGFydGljdWxhciBtYWNoaW5lLgogICovCi11OCBBQ1BJX0lOSVRfR0xPQkFMKGFjcGlfZ2JsX2Rpc2FibGVfYXV0b19yZXBhaXIsIEZBTFNFKTsKK0FDUElfSU5JVF9HTE9CQUwodTgsIGFjcGlfZ2JsX2Rpc2FibGVfYXV0b19yZXBhaXIsIEZBTFNFKTsKIAogLyoKICAqIE9wdGlvbmFsbHkgZG8gbm90IGxvYWQgYW55IFNTRFRzIGZyb20gdGhlIFJTRFQvWFNEVCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCiAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBBQ1BJIHByb2JsZW1zIG9uIHNvbWUgbWFjaGluZXMuCiAgKi8KLXU4IEFDUElfSU5JVF9HTE9CQUwoYWNwaV9nYmxfZGlzYWJsZV9zc2R0X3RhYmxlX2xvYWQsIEZBTFNFKTsKK0FDUElfSU5JVF9HTE9CQUwodTgsIGFjcGlfZ2JsX2Rpc2FibGVfc3NkdF90YWJsZV9sb2FkLCBGQUxTRSk7CiAKIC8qCiAgKiBXZSBrZWVwIHRyYWNrIG9mIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBXaW5kb3dzIHRoYXQgaGFzIGJlZW4gcmVxdWVzdGVkIGJ5CiAgKiB0aGUgQklPUy4KICAqLwotdTggQUNQSV9JTklUX0dMT0JBTChhY3BpX2dibF9vc2lfZGF0YSwgMCk7Ci0KLS8qIGFjcGlfZ2JsX0ZBRFQgaXMgYSBsb2NhbCBjb3B5IG9mIHRoZSBGQURULCBjb252ZXJ0ZWQgdG8gYSBjb21tb24gZm9ybWF0LiAqLwotCi1zdHJ1Y3QgYWNwaV90YWJsZV9mYWR0IGFjcGlfZ2JsX0ZBRFQ7Ci11MzIgYWNwaV9jdXJyZW50X2dwZV9jb3VudDsKLXUzMiBhY3BpX2dibF90cmFjZV9mbGFnczsKLWFjcGlfbmFtZSBhY3BpX2dibF90cmFjZV9tZXRob2RfbmFtZTsKLXU4IGFjcGlfZ2JsX3N5c3RlbV9hd2FrZV9hbmRfcnVubmluZzsKLQotLyoKLSAqIEFDUEkgNS4wIGludHJvZHVjZXMgdGhlIGNvbmNlcHQgb2YgYSAicmVkdWNlZCBoYXJkd2FyZSBwbGF0Zm9ybSIsIG1lYW5pbmcKLSAqIHRoYXQgdGhlIEFDUEkgaGFyZHdhcmUgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLiBBIGZsYWcgaW4gdGhlIEZBRFQgaW5kaWNhdGVzCi0gKiBhIHJlZHVjZWQgSFcgbWFjaGluZSwgYW5kIHRoYXQgZmxhZyBpcyBkdXBsaWNhdGVkIGhlcmUgZm9yIGNvbnZlbmllbmNlLgotICovCi11OCBhY3BpX2dibF9yZWR1Y2VkX2hhcmR3YXJlOworQUNQSV9JTklUX0dMT0JBTCh1OCwgYWNwaV9nYmxfb3NpX2RhdGEsIDApOwogCiAjZW5kaWYJCQkJLyogREVGSU5FX0FDUElfR0xPQkFMUyAqLwogCi0vKiBEbyBub3QgZGlzYXNzZW1ibGUgYnVmZmVycyB0byByZXNvdXJjZSBkZXNjcmlwdG9ycyAqLwotCi1BQ1BJX0VYVEVSTiB1OCBBQ1BJX0lOSVRfR0xPQkFMKGFjcGlfZ2JsX25vX3Jlc291cmNlX2Rpc2Fzc2VtYmx5LCBGQUxTRSk7Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEFDUEkgVGFibGUgZ2xvYmFscwpAQCAtMTkwLDM3ICsxNzksMzYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0IGlzIHRoZSBtYXN0ZXIgbGlzdCBvZiBBQ1BJIHRhYmxlcyB0aGF0IHdlcmUKLSAqIGZvdW5kIGluIHRoZSBSU0RUL1hTRFQuCisgKiBNYXN0ZXIgbGlzdCBvZiBhbGwgQUNQSSB0YWJsZXMgdGhhdCB3ZXJlIGZvdW5kIGluIHRoZSBSU0RUL1hTRFQuCiAgKi8KLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX3RhYmxlX2xpc3QgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0OworQUNQSV9HTE9CQUwoc3RydWN0IGFjcGlfdGFibGVfbGlzdCwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0KTsKKworLyogRFNEVCBpbmZvcm1hdGlvbi4gVXNlZCB0byBjaGVjayBmb3IgRFNEVCBjb3JydXB0aW9uICovCisKK0FDUElfR0xPQkFMKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqLCBhY3BpX2dibF9EU0RUKTsKK0FDUElfR0xPQkFMKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciwgYWNwaV9nYmxfb3JpZ2luYWxfZHNkdF9oZWFkZXIpOwogCiAjaWYgKCFBQ1BJX1JFRFVDRURfSEFSRFdBUkUpCi1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV90YWJsZV9mYWNzICphY3BpX2dibF9GQUNTOworQUNQSV9HTE9CQUwoc3RydWN0IGFjcGlfdGFibGVfZmFjcyAqLCBhY3BpX2dibF9GQUNTKTsKIAogI2VuZGlmCQkJCS8qICFBQ1BJX1JFRFVDRURfSEFSRFdBUkUgKi8KIAogLyogVGhlc2UgYWRkcmVzc2VzIGFyZSBjYWxjdWxhdGVkIGZyb20gdGhlIEZBRFQgRXZlbnQgQmxvY2sgYWRkcmVzc2VzICovCiAKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBhY3BpX2dibF94cG0xYV9zdGF0dXM7Ci1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgYWNwaV9nYmxfeHBtMWFfZW5hYmxlOworQUNQSV9HTE9CQUwoc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzLCBhY3BpX2dibF94cG0xYV9zdGF0dXMpOworQUNQSV9HTE9CQUwoc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzLCBhY3BpX2dibF94cG0xYV9lbmFibGUpOwogCi1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgYWNwaV9nYmxfeHBtMWJfc3RhdHVzOwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGFjcGlfZ2JsX3hwbTFiX2VuYWJsZTsKLQotLyogRFNEVCBpbmZvcm1hdGlvbi4gVXNlZCB0byBjaGVjayBmb3IgRFNEVCBjb3JydXB0aW9uICovCi0KLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqYWNwaV9nYmxfRFNEVDsKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBhY3BpX2dibF9vcmlnaW5hbF9kc2R0X2hlYWRlcjsKK0FDUElfR0xPQkFMKHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcywgYWNwaV9nYmxfeHBtMWJfc3RhdHVzKTsKK0FDUElfR0xPQkFMKHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcywgYWNwaV9nYmxfeHBtMWJfZW5hYmxlKTsKIAogLyoKLSAqIEhhbmRsZSBib3RoIEFDUEkgMS4wIGFuZCBBQ1BJIDIuMCBJbnRlZ2VyIHdpZHRocy4gVGhlIGludGVnZXIgd2lkdGggaXMKKyAqIEhhbmRsZSBib3RoIEFDUEkgMS4wIGFuZCBBQ1BJIDIuMCsgSW50ZWdlciB3aWR0aHMuIFRoZSBpbnRlZ2VyIHdpZHRoIGlzCiAgKiBkZXRlcm1pbmVkIGJ5IHRoZSByZXZpc2lvbiBvZiB0aGUgRFNEVDogSWYgdGhlIERTRFQgcmV2aXNpb24gaXMgbGVzcyB0aGFuCiAgKiAyLCB1c2Ugb25seSB0aGUgbG93ZXIgMzIgYml0cyBvZiB0aGUgaW50ZXJuYWwgNjQtYml0IEludGVnZXIuCiAgKi8KLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2ludGVnZXJfYml0X3dpZHRoOwotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoOwotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfaW50ZWdlcl9ueWJibGVfd2lkdGg7CitBQ1BJX0dMT0JBTCh1OCwgYWNwaV9nYmxfaW50ZWdlcl9iaXRfd2lkdGgpOworQUNQSV9HTE9CQUwodTgsIGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCk7CitBQ1BJX0dMT0JBTCh1OCwgYWNwaV9nYmxfaW50ZWdlcl9ueWJibGVfd2lkdGgpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yMzMsMzYgKzIyMSwzNiBAQAogICogYWN0dWFsIE9TIG11dGV4IGhhbmRsZXMsIGluZGV4ZWQgYnkgdGhlIGxvY2FsIEFDUElfTVVURVhfSEFORExFcy4KICAqIChUaGUgdGFibGUgbWFwcyBsb2NhbCBoYW5kbGVzIHRvIHRoZSByZWFsIE9TIGhhbmRsZXMpCiAgKi8KLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX211dGV4X2luZm8gYWNwaV9nYmxfbXV0ZXhfaW5mb1tBQ1BJX05VTV9NVVRFWF07CitBQ1BJX0dMT0JBTChzdHJ1Y3QgYWNwaV9tdXRleF9pbmZvLCBhY3BpX2dibF9tdXRleF9pbmZvW0FDUElfTlVNX01VVEVYXSk7CiAKIC8qCiAgKiBHbG9iYWwgbG9jayBtdXRleCBpcyBhbiBhY3R1YWwgQU1MIG11dGV4IG9iamVjdAogICogR2xvYmFsIGxvY2sgc2VtYXBob3JlIHdvcmtzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGFjdHVhbCBnbG9iYWwgbG9jawogICogR2xvYmFsIGxvY2sgc3BpbmxvY2sgaXMgdXNlZCBmb3IgInBlbmRpbmciIGhhbmRzaGFrZQogICovCi1BQ1BJX0VYVEVSTiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleDsKLUFDUElfRVhURVJOIGFjcGlfc2VtYXBob3JlIGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZTsKLUFDUElfRVhURVJOIGFjcGlfc3BpbmxvY2sgYWNwaV9nYmxfZ2xvYmFsX2xvY2tfcGVuZGluZ19sb2NrOwotQUNQSV9FWFRFUk4gdTE2IGFjcGlfZ2JsX2dsb2JhbF9sb2NrX2hhbmRsZTsKLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2dsb2JhbF9sb2NrX2FjcXVpcmVkOwotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZ2xvYmFsX2xvY2tfcHJlc2VudDsKLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3BlbmRpbmc7CitBQ1BJX0dMT0JBTCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICosIGFjcGlfZ2JsX2dsb2JhbF9sb2NrX211dGV4KTsKK0FDUElfR0xPQkFMKGFjcGlfc2VtYXBob3JlLCBhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUpOworQUNQSV9HTE9CQUwoYWNwaV9zcGlubG9jaywgYWNwaV9nYmxfZ2xvYmFsX2xvY2tfcGVuZGluZ19sb2NrKTsKK0FDUElfR0xPQkFMKHUxNiwgYWNwaV9nYmxfZ2xvYmFsX2xvY2tfaGFuZGxlKTsKK0FDUElfR0xPQkFMKHU4LCBhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCk7CitBQ1BJX0dMT0JBTCh1OCwgYWNwaV9nYmxfZ2xvYmFsX2xvY2tfcHJlc2VudCk7CitBQ1BJX0dMT0JBTCh1OCwgYWNwaV9nYmxfZ2xvYmFsX2xvY2tfcGVuZGluZyk7CiAKIC8qCiAgKiBTcGlubG9ja3MgYXJlIHVzZWQgZm9yIGludGVyZmFjZXMgdGhhdCBjYW4gYmUgcG9zc2libHkgY2FsbGVkIGF0CiAgKiBpbnRlcnJ1cHQgbGV2ZWwKICAqLwotQUNQSV9FWFRFUk4gYWNwaV9zcGlubG9jayBhY3BpX2dibF9ncGVfbG9jazsJLyogRm9yIEdQRSBkYXRhIHN0cnVjdHMgYW5kIHJlZ2lzdGVycyAqLwotQUNQSV9FWFRFUk4gYWNwaV9zcGlubG9jayBhY3BpX2dibF9oYXJkd2FyZV9sb2NrOwkvKiBGb3IgQUNQSSBIL1cgZXhjZXB0IEdQRSByZWdpc3RlcnMgKi8KLUFDUElfRVhURVJOIGFjcGlfc3BpbmxvY2sgYWNwaV9nYmxfcmVmZXJlbmNlX2NvdW50X2xvY2s7CitBQ1BJX0dMT0JBTChhY3BpX3NwaW5sb2NrLCBhY3BpX2dibF9ncGVfbG9jayk7CS8qIEZvciBHUEUgZGF0YSBzdHJ1Y3RzIGFuZCByZWdpc3RlcnMgKi8KK0FDUElfR0xPQkFMKGFjcGlfc3BpbmxvY2ssIGFjcGlfZ2JsX2hhcmR3YXJlX2xvY2spOwkvKiBGb3IgQUNQSSBIL1cgZXhjZXB0IEdQRSByZWdpc3RlcnMgKi8KK0FDUElfR0xPQkFMKGFjcGlfc3BpbmxvY2ssIGFjcGlfZ2JsX3JlZmVyZW5jZV9jb3VudF9sb2NrKTsKIAogLyogTXV0ZXggZm9yIF9PU0kgc3VwcG9ydCAqLwogCi1BQ1BJX0VYVEVSTiBhY3BpX211dGV4IGFjcGlfZ2JsX29zaV9tdXRleDsKK0FDUElfR0xPQkFMKGFjcGlfbXV0ZXgsIGFjcGlfZ2JsX29zaV9tdXRleCk7CiAKIC8qIFJlYWRlci9Xcml0ZXIgbG9jayBpcyB1c2VkIGZvciBuYW1lc3BhY2Ugd2FsayBhbmQgZHluYW1pYyB0YWJsZSB1bmxvYWQgKi8KIAotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfcndfbG9jayBhY3BpX2dibF9uYW1lc3BhY2VfcndfbG9jazsKK0FDUElfR0xPQkFMKHN0cnVjdCBhY3BpX3J3X2xvY2ssIGFjcGlfZ2JsX25hbWVzcGFjZV9yd19sb2NrKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjcyLDcwICsyNjAsNjkgQEAKIAogLyogT2JqZWN0IGNhY2hlcyAqLwogCi1BQ1BJX0VYVEVSTiBhY3BpX2NhY2hlX3QgKmFjcGlfZ2JsX25hbWVzcGFjZV9jYWNoZTsKLUFDUElfRVhURVJOIGFjcGlfY2FjaGVfdCAqYWNwaV9nYmxfc3RhdGVfY2FjaGU7Ci1BQ1BJX0VYVEVSTiBhY3BpX2NhY2hlX3QgKmFjcGlfZ2JsX3BzX25vZGVfY2FjaGU7Ci1BQ1BJX0VYVEVSTiBhY3BpX2NhY2hlX3QgKmFjcGlfZ2JsX3BzX25vZGVfZXh0X2NhY2hlOwotQUNQSV9FWFRFUk4gYWNwaV9jYWNoZV90ICphY3BpX2dibF9vcGVyYW5kX2NhY2hlOworQUNQSV9HTE9CQUwoYWNwaV9jYWNoZV90ICosIGFjcGlfZ2JsX25hbWVzcGFjZV9jYWNoZSk7CitBQ1BJX0dMT0JBTChhY3BpX2NhY2hlX3QgKiwgYWNwaV9nYmxfc3RhdGVfY2FjaGUpOworQUNQSV9HTE9CQUwoYWNwaV9jYWNoZV90ICosIGFjcGlfZ2JsX3BzX25vZGVfY2FjaGUpOworQUNQSV9HTE9CQUwoYWNwaV9jYWNoZV90ICosIGFjcGlfZ2JsX3BzX25vZGVfZXh0X2NhY2hlKTsKK0FDUElfR0xPQkFMKGFjcGlfY2FjaGVfdCAqLCBhY3BpX2dibF9vcGVyYW5kX2NhY2hlKTsKKworLyogU3lzdGVtICovCisKK0FDUElfSU5JVF9HTE9CQUwodTMyLCBhY3BpX2dibF9zdGFydHVwX2ZsYWdzLCAwKTsKK0FDUElfSU5JVF9HTE9CQUwodTgsIGFjcGlfZ2JsX3NodXRkb3duLCBUUlVFKTsKIAogLyogR2xvYmFsIGhhbmRsZXJzICovCiAKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX2dsb2JhbF9ub3RpZnlfaGFuZGxlciBhY3BpX2dibF9nbG9iYWxfbm90aWZ5WzJdOwotQUNQSV9FWFRFUk4gYWNwaV9leGNlcHRpb25faGFuZGxlciBhY3BpX2dibF9leGNlcHRpb25faGFuZGxlcjsKLUFDUElfRVhURVJOIGFjcGlfaW5pdF9oYW5kbGVyIGFjcGlfZ2JsX2luaXRfaGFuZGxlcjsKLUFDUElfRVhURVJOIGFjcGlfdGFibGVfaGFuZGxlciBhY3BpX2dibF90YWJsZV9oYW5kbGVyOwotQUNQSV9FWFRFUk4gdm9pZCAqYWNwaV9nYmxfdGFibGVfaGFuZGxlcl9jb250ZXh0OwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqYWNwaV9nYmxfYnJlYWtwb2ludF93YWxrOwotQUNQSV9FWFRFUk4gYWNwaV9pbnRlcmZhY2VfaGFuZGxlciBhY3BpX2dibF9pbnRlcmZhY2VfaGFuZGxlcjsKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX3NjaV9oYW5kbGVyX2luZm8gKmFjcGlfZ2JsX3NjaV9oYW5kbGVyX2xpc3Q7CitBQ1BJX0dMT0JBTChzdHJ1Y3QgYWNwaV9nbG9iYWxfbm90aWZ5X2hhbmRsZXIsIGFjcGlfZ2JsX2dsb2JhbF9ub3RpZnlbMl0pOworQUNQSV9HTE9CQUwoYWNwaV9leGNlcHRpb25faGFuZGxlciwgYWNwaV9nYmxfZXhjZXB0aW9uX2hhbmRsZXIpOworQUNQSV9HTE9CQUwoYWNwaV9pbml0X2hhbmRsZXIsIGFjcGlfZ2JsX2luaXRfaGFuZGxlcik7CitBQ1BJX0dMT0JBTChhY3BpX3RhYmxlX2hhbmRsZXIsIGFjcGlfZ2JsX3RhYmxlX2hhbmRsZXIpOworQUNQSV9HTE9CQUwodm9pZCAqLCBhY3BpX2dibF90YWJsZV9oYW5kbGVyX2NvbnRleHQpOworQUNQSV9HTE9CQUwoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqLCBhY3BpX2dibF9icmVha3BvaW50X3dhbGspOworQUNQSV9HTE9CQUwoYWNwaV9pbnRlcmZhY2VfaGFuZGxlciwgYWNwaV9nYmxfaW50ZXJmYWNlX2hhbmRsZXIpOworQUNQSV9HTE9CQUwoc3RydWN0IGFjcGlfc2NpX2hhbmRsZXJfaW5mbyAqLCBhY3BpX2dibF9zY2lfaGFuZGxlcl9saXN0KTsKIAogLyogT3duZXIgSUQgc3VwcG9ydCAqLwogCi1BQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfb3duZXJfaWRfbWFza1tBQ1BJX05VTV9PV05FUklEX01BU0tTXTsKLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2xhc3Rfb3duZXJfaWRfaW5kZXg7Ci1BQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9uZXh0X293bmVyX2lkX29mZnNldDsKK0FDUElfR0xPQkFMKHUzMiwgYWNwaV9nYmxfb3duZXJfaWRfbWFza1tBQ1BJX05VTV9PV05FUklEX01BU0tTXSk7CitBQ1BJX0dMT0JBTCh1OCwgYWNwaV9nYmxfbGFzdF9vd25lcl9pZF9pbmRleCk7CitBQ1BJX0dMT0JBTCh1OCwgYWNwaV9nYmxfbmV4dF9vd25lcl9pZF9vZmZzZXQpOwogCiAvKiBJbml0aWFsaXphdGlvbiBzZXF1ZW5jaW5nICovCiAKLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX3JlZ19tZXRob2RzX2V4ZWN1dGVkOworQUNQSV9HTE9CQUwodTgsIGFjcGlfZ2JsX3JlZ19tZXRob2RzX2V4ZWN1dGVkKTsKIAogLyogTWlzYyAqLwogCi1BQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfb3JpZ2luYWxfbW9kZTsKLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9yc2RwX29yaWdpbmFsX2xvY2F0aW9uOwotQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX25zX2xvb2t1cF9jb3VudDsKLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9wc19maW5kX2NvdW50OwotQUNQSV9FWFRFUk4gdTE2IGFjcGlfZ2JsX3BtMV9lbmFibGVfcmVnaXN0ZXJfc2F2ZTsKLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2RlYnVnZ2VyX2NvbmZpZ3VyYXRpb247Ci1BQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9zdGVwX3RvX25leHRfY2FsbDsKLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2FjcGlfaGFyZHdhcmVfcHJlc2VudDsKLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2V2ZW50c19pbml0aWFsaXplZDsKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX2ludGVyZmFjZV9pbmZvICphY3BpX2dibF9zdXBwb3J0ZWRfaW50ZXJmYWNlczsKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX2FkZHJlc3NfcmFuZ2UKLSAgICAqYWNwaV9nYmxfYWRkcmVzc19yYW5nZV9saXN0W0FDUElfQUREUkVTU19SQU5HRV9NQVhdOworQUNQSV9HTE9CQUwodTMyLCBhY3BpX2dibF9vcmlnaW5hbF9tb2RlKTsKK0FDUElfR0xPQkFMKHUzMiwgYWNwaV9nYmxfcnNkcF9vcmlnaW5hbF9sb2NhdGlvbik7CitBQ1BJX0dMT0JBTCh1MzIsIGFjcGlfZ2JsX25zX2xvb2t1cF9jb3VudCk7CitBQ1BJX0dMT0JBTCh1MzIsIGFjcGlfZ2JsX3BzX2ZpbmRfY291bnQpOworQUNQSV9HTE9CQUwodTE2LCBhY3BpX2dibF9wbTFfZW5hYmxlX3JlZ2lzdGVyX3NhdmUpOworQUNQSV9HTE9CQUwodTgsIGFjcGlfZ2JsX2RlYnVnZ2VyX2NvbmZpZ3VyYXRpb24pOworQUNQSV9HTE9CQUwodTgsIGFjcGlfZ2JsX3N0ZXBfdG9fbmV4dF9jYWxsKTsKK0FDUElfR0xPQkFMKHU4LCBhY3BpX2dibF9hY3BpX2hhcmR3YXJlX3ByZXNlbnQpOworQUNQSV9HTE9CQUwodTgsIGFjcGlfZ2JsX2V2ZW50c19pbml0aWFsaXplZCk7CitBQ1BJX0dMT0JBTChzdHJ1Y3QgYWNwaV9pbnRlcmZhY2VfaW5mbyAqLCBhY3BpX2dibF9zdXBwb3J0ZWRfaW50ZXJmYWNlcyk7CitBQ1BJX0dMT0JBTChzdHJ1Y3QgYWNwaV9hZGRyZXNzX3JhbmdlICosCisJICAgIGFjcGlfZ2JsX2FkZHJlc3NfcmFuZ2VfbGlzdFtBQ1BJX0FERFJFU1NfUkFOR0VfTUFYXSk7CiAKLSNpZm5kZWYgREVGSU5FX0FDUElfR0xPQkFMUworLyogT3RoZXIgbWlzY2VsbGFuZW91cywgZGVjbGFyZWQgYW5kIGluaXRpYWxpemVkIGluIHV0Z2xvYmFsICovCiAKLS8qIE90aGVyIG1pc2NlbGxhbmVvdXMgKi8KLQotZXh0ZXJuIHU4IGFjcGlfZ2JsX3NodXRkb3duOwotZXh0ZXJuIHUzMiBhY3BpX2dibF9zdGFydHVwX2ZsYWdzOwogZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX3NsZWVwX3N0YXRlX25hbWVzW0FDUElfU19TVEFURV9DT1VOVF07CiBleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfbG93ZXN0X2RzdGF0ZV9uYW1lc1tBQ1BJX05VTV9zeF93X01FVEhPRFNdOwogZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2hpZ2hlc3RfZHN0YXRlX25hbWVzW0FDUElfTlVNX3N4X2RfTUVUSE9EU107Ci1leHRlcm4gY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gYWNwaV9nYmxfYW1sX29wX2luZm9bQU1MX05VTV9PUENPREVTXTsKIGV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9yZWdpb25fdHlwZXNbQUNQSV9OVU1fUFJFREVGSU5FRF9SRUdJT05TXTsKLQotI2VuZGlmCitleHRlcm4gY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gYWNwaV9nYmxfYW1sX29wX2luZm9bQU1MX05VTV9PUENPREVTXTsKIAogI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCiAKLS8qIExpc3RzIGZvciB0cmFja2luZyBtZW1vcnkgYWxsb2NhdGlvbnMgKi8KKy8qIExpc3RzIGZvciB0cmFja2luZyBtZW1vcnkgYWxsb2NhdGlvbnMgKGRlYnVnIG9ubHkpICovCiAKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICphY3BpX2dibF9nbG9iYWxfbGlzdDsKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICphY3BpX2dibF9uc19ub2RlX2xpc3Q7Ci1BQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9kaXNwbGF5X2ZpbmFsX21lbV9zdGF0czsKLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2Rpc2FibGVfbWVtX3RyYWNraW5nOworQUNQSV9HTE9CQUwoc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgKiwgYWNwaV9nYmxfZ2xvYmFsX2xpc3QpOworQUNQSV9HTE9CQUwoc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgKiwgYWNwaV9nYmxfbnNfbm9kZV9saXN0KTsKK0FDUElfR0xPQkFMKHU4LCBhY3BpX2dibF9kaXNwbGF5X2ZpbmFsX21lbV9zdGF0cyk7CitBQ1BJX0dMT0JBTCh1OCwgYWNwaV9nYmxfZGlzYWJsZV9tZW1fdHJhY2tpbmcpOwogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzUwLDIyICszMzcsMjMgQEAKICNkZWZpbmUgTlVNX1BSRURFRklORURfTkFNRVMgICAgICAgICAgICA5CiAjZW5kaWYKIAotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgYWNwaV9nYmxfcm9vdF9ub2RlX3N0cnVjdDsKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX2dibF9yb290X25vZGU7Ci1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlOwotQUNQSV9FWFRFUk4gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV9nYmxfbW9kdWxlX2NvZGVfbGlzdDsKK0FDUElfR0xPQkFMKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLCBhY3BpX2dibF9yb290X25vZGVfc3RydWN0KTsKK0FDUElfR0xPQkFMKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICosIGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CitBQ1BJX0dMT0JBTChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqLCBhY3BpX2dibF9mYWR0X2dwZV9kZXZpY2UpOworQUNQSV9HTE9CQUwodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqLCBhY3BpX2dibF9tb2R1bGVfY29kZV9saXN0KTsKIAogZXh0ZXJuIGNvbnN0IHU4IGFjcGlfZ2JsX25zX3Byb3BlcnRpZXNbQUNQSV9OVU1fTlNfVFlQRVNdOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhY3BpX3ByZWRlZmluZWRfbmFtZXMKICAgICBhY3BpX2dibF9wcmVfZGVmaW5lZF9uYW1lc1tOVU1fUFJFREVGSU5FRF9OQU1FU107CiAKICNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAotQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX2N1cnJlbnRfbm9kZV9jb3VudDsKLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9jdXJyZW50X25vZGVfc2l6ZTsKLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9tYXhfY29uY3VycmVudF9ub2RlX2NvdW50OwotQUNQSV9FWFRFUk4gYWNwaV9zaXplICphY3BpX2dibF9lbnRyeV9zdGFja19wb2ludGVyOwotQUNQSV9FWFRFUk4gYWNwaV9zaXplICphY3BpX2dibF9sb3dlc3Rfc3RhY2tfcG9pbnRlcjsKLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9kZWVwZXN0X25lc3Rpbmc7CitBQ1BJX0dMT0JBTCh1MzIsIGFjcGlfZ2JsX2N1cnJlbnRfbm9kZV9jb3VudCk7CitBQ1BJX0dMT0JBTCh1MzIsIGFjcGlfZ2JsX2N1cnJlbnRfbm9kZV9zaXplKTsKK0FDUElfR0xPQkFMKHUzMiwgYWNwaV9nYmxfbWF4X2NvbmN1cnJlbnRfbm9kZV9jb3VudCk7CitBQ1BJX0dMT0JBTChhY3BpX3NpemUgKiwgYWNwaV9nYmxfZW50cnlfc3RhY2tfcG9pbnRlcik7CitBQ1BJX0dMT0JBTChhY3BpX3NpemUgKiwgYWNwaV9nYmxfbG93ZXN0X3N0YWNrX3BvaW50ZXIpOworQUNQSV9HTE9CQUwodTMyLCBhY3BpX2dibF9kZWVwZXN0X25lc3RpbmcpOworQUNQSV9JTklUX0dMT0JBTCh1MzIsIGFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwsIDApOwogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzc0LDExICszNjIsMTEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICphY3BpX2dibF9jdXJyZW50X3dhbGtfbGlzdDsKK0FDUElfR0xPQkFMKHN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqLCBhY3BpX2dibF9jdXJyZW50X3dhbGtfbGlzdCk7CiAKIC8qIENvbnRyb2wgbWV0aG9kIHNpbmdsZSBzdGVwIGZsYWcgKi8KIAotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfY21fc2luZ2xlX3N0ZXA7CitBQ1BJX0dMT0JBTCh1OCwgYWNwaV9nYmxfY21fc2luZ2xlX3N0ZXApOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0zODgsOCArMzc2LDkgQEAKIAogZXh0ZXJuIHN0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvCiAgICAgYWNwaV9nYmxfYml0X3JlZ2lzdGVyX2luZm9bQUNQSV9OVU1fQklUUkVHXTsKLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX3NsZWVwX3R5cGVfYTsKLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX3NsZWVwX3R5cGVfYjsKKworQUNQSV9HTE9CQUwodTgsIGFjcGlfZ2JsX3NsZWVwX3R5cGVfYSk7CitBQ1BJX0dMT0JBTCh1OCwgYWNwaV9nYmxfc2xlZXBfdHlwZV9iKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMzk5LDE0ICszODgsMTUgQEAKIAogI2lmICghQUNQSV9SRURVQ0VEX0hBUkRXQVJFKQogCi1BQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9hbGxfZ3Blc19pbml0aWFsaXplZDsKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICphY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkOwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8KLSAgICAqYWNwaV9nYmxfZ3BlX2ZhZHRfYmxvY2tzW0FDUElfTUFYX0dQRV9CTE9DS1NdOwotQUNQSV9FWFRFUk4gYWNwaV9nYmxfZXZlbnRfaGFuZGxlciBhY3BpX2dibF9nbG9iYWxfZXZlbnRfaGFuZGxlcjsKLUFDUElfRVhURVJOIHZvaWQgKmFjcGlfZ2JsX2dsb2JhbF9ldmVudF9oYW5kbGVyX2NvbnRleHQ7Ci1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9maXhlZF9ldmVudF9oYW5kbGVyCi0gICAgYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbQUNQSV9OVU1fRklYRURfRVZFTlRTXTsKK0FDUElfR0xPQkFMKHU4LCBhY3BpX2dibF9hbGxfZ3Blc19pbml0aWFsaXplZCk7CitBQ1BJX0dMT0JBTChzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqLCBhY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkKTsKK0FDUElfR0xPQkFMKHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICosCisJICAgIGFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1tBQ1BJX01BWF9HUEVfQkxPQ0tTXSk7CitBQ1BJX0dMT0JBTChhY3BpX2dibF9ldmVudF9oYW5kbGVyLCBhY3BpX2dibF9nbG9iYWxfZXZlbnRfaGFuZGxlcik7CitBQ1BJX0dMT0JBTCh2b2lkICosIGFjcGlfZ2JsX2dsb2JhbF9ldmVudF9oYW5kbGVyX2NvbnRleHQpOworQUNQSV9HTE9CQUwoc3RydWN0IGFjcGlfZml4ZWRfZXZlbnRfaGFuZGxlciwKKwkgICAgYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbQUNQSV9OVU1fRklYRURfRVZFTlRTXSk7CisKIGV4dGVybiBzdHJ1Y3QgYWNwaV9maXhlZF9ldmVudF9pbmZvCiAgICAgYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tBQ1BJX05VTV9GSVhFRF9FVkVOVFNdOwogCkBAIC00MTgsMjMgKzQwOCwxOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBQcm9jZWR1cmUgbmVzdGluZyBsZXZlbCBmb3IgZGVidWcgb3V0cHV0ICovCi0KLWV4dGVybiB1MzIgYWNwaV9nYmxfbmVzdGluZ19sZXZlbDsKLQogLyogRXZlbnQgY291bnRlcnMgKi8KIAotQUNQSV9FWFRFUk4gdTMyIGFjcGlfbWV0aG9kX2NvdW50OwotQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ3BlX2NvdW50OwotQUNQSV9FWFRFUk4gdTMyIGFjcGlfc2NpX2NvdW50OwotQUNQSV9FWFRFUk4gdTMyIGFjcGlfZml4ZWRfZXZlbnRfY291bnRbQUNQSV9OVU1fRklYRURfRVZFTlRTXTsKK0FDUElfR0xPQkFMKHUzMiwgYWNwaV9tZXRob2RfY291bnQpOworQUNQSV9HTE9CQUwodTMyLCBhY3BpX2dwZV9jb3VudCk7CitBQ1BJX0dMT0JBTCh1MzIsIGFjcGlfc2NpX2NvdW50KTsKK0FDUElfR0xPQkFMKHUzMiwgYWNwaV9maXhlZF9ldmVudF9jb3VudFtBQ1BJX05VTV9GSVhFRF9FVkVOVFNdKTsKIAogLyogU3VwcG9ydCBmb3IgZHluYW1pYyBjb250cm9sIG1ldGhvZCB0cmFjaW5nIG1lY2hhbmlzbSAqLwogCi1BQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfb3JpZ2luYWxfZGJnX2xldmVsOwotQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX29yaWdpbmFsX2RiZ19sYXllcjsKLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF90cmFjZV9kYmdfbGV2ZWw7Ci1BQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfdHJhY2VfZGJnX2xheWVyOworQUNQSV9HTE9CQUwodTMyLCBhY3BpX2dibF9vcmlnaW5hbF9kYmdfbGV2ZWwpOworQUNQSV9HTE9CQUwodTMyLCBhY3BpX2dibF9vcmlnaW5hbF9kYmdfbGF5ZXIpOworQUNQSV9HTE9CQUwodTMyLCBhY3BpX2dibF90cmFjZV9kYmdfbGV2ZWwpOworQUNQSV9HTE9CQUwodTMyLCBhY3BpX2dibF90cmFjZV9kYmdfbGF5ZXIpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC00NDIsNjEgKzQyOCw2NCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1BQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9kYl9vdXRwdXRfZmxhZ3M7CitBQ1BJX0dMT0JBTCh1OCwgYWNwaV9nYmxfZGJfb3V0cHV0X2ZsYWdzKTsKIAogI2lmZGVmIEFDUElfRElTQVNTRU1CTEVSCiAKLUFDUElfRVhURVJOIHU4IEFDUElfSU5JVF9HTE9CQUwoYWNwaV9nYmxfaWdub3JlX25vb3Bfb3BlcmF0b3IsIEZBTFNFKTsKKy8qIERvIG5vdCBkaXNhc3NlbWJsZSBidWZmZXJzIHRvIHJlc291cmNlIGRlc2NyaXB0b3JzICovCiAKLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2RiX29wdF9kaXNhc207Ci1BQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9kYl9vcHRfdmVyYm9zZTsKLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX251bV9leHRlcm5hbF9tZXRob2RzOwotQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3Jlc29sdmVkX2V4dGVybmFsX21ldGhvZHM7Ci1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9leHRlcm5hbF9saXN0ICphY3BpX2dibF9leHRlcm5hbF9saXN0OwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfZXh0ZXJuYWxfZmlsZSAqYWNwaV9nYmxfZXh0ZXJuYWxfZmlsZV9saXN0OworQUNQSV9JTklUX0dMT0JBTCh1OCwgYWNwaV9nYmxfbm9fcmVzb3VyY2VfZGlzYXNzZW1ibHksIEZBTFNFKTsKK0FDUElfSU5JVF9HTE9CQUwodTgsIGFjcGlfZ2JsX2lnbm9yZV9ub29wX29wZXJhdG9yLCBGQUxTRSk7CisKK0FDUElfR0xPQkFMKHU4LCBhY3BpX2dibF9kYl9vcHRfZGlzYXNtKTsKK0FDUElfR0xPQkFMKHU4LCBhY3BpX2dibF9kYl9vcHRfdmVyYm9zZSk7CitBQ1BJX0dMT0JBTCh1OCwgYWNwaV9nYmxfbnVtX2V4dGVybmFsX21ldGhvZHMpOworQUNQSV9HTE9CQUwodTMyLCBhY3BpX2dibF9yZXNvbHZlZF9leHRlcm5hbF9tZXRob2RzKTsKK0FDUElfR0xPQkFMKHN0cnVjdCBhY3BpX2V4dGVybmFsX2xpc3QgKiwgYWNwaV9nYmxfZXh0ZXJuYWxfbGlzdCk7CitBQ1BJX0dMT0JBTChzdHJ1Y3QgYWNwaV9leHRlcm5hbF9maWxlICosIGFjcGlfZ2JsX2V4dGVybmFsX2ZpbGVfbGlzdCk7CiAjZW5kaWYKIAogI2lmZGVmIEFDUElfREVCVUdHRVIKIAotZXh0ZXJuIHU4IGFjcGlfZ2JsX21ldGhvZF9leGVjdXRpbmc7Ci1leHRlcm4gdTggYWNwaV9nYmxfYWJvcnRfbWV0aG9kOwotZXh0ZXJuIHU4IGFjcGlfZ2JsX2RiX3Rlcm1pbmF0ZV90aHJlYWRzOworQUNQSV9JTklUX0dMT0JBTCh1OCwgYWNwaV9nYmxfZGJfdGVybWluYXRlX3RocmVhZHMsIEZBTFNFKTsKK0FDUElfSU5JVF9HTE9CQUwodTgsIGFjcGlfZ2JsX2Fib3J0X21ldGhvZCwgRkFMU0UpOworQUNQSV9JTklUX0dMT0JBTCh1OCwgYWNwaV9nYmxfbWV0aG9kX2V4ZWN1dGluZywgRkFMU0UpOwogCi1BQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9kYl9vcHRfdGFibGVzOwotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGJfb3B0X3N0YXRzOwotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGJfb3B0X2luaV9tZXRob2RzOwotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGJfb3B0X25vX3JlZ2lvbl9zdXBwb3J0OwotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGJfb3V0cHV0X3RvX2ZpbGU7Ci1BQ1BJX0VYVEVSTiBjaGFyICphY3BpX2dibF9kYl9idWZmZXI7Ci1BQ1BJX0VYVEVSTiBjaGFyICphY3BpX2dibF9kYl9maWxlbmFtZTsKLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9kYl9kZWJ1Z19sZXZlbDsKLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9kYl9jb25zb2xlX2RlYnVnX2xldmVsOwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfZ2JsX2RiX3Njb3BlX25vZGU7CitBQ1BJX0dMT0JBTCh1OCwgYWNwaV9nYmxfZGJfb3B0X3RhYmxlcyk7CitBQ1BJX0dMT0JBTCh1OCwgYWNwaV9nYmxfZGJfb3B0X3N0YXRzKTsKK0FDUElfR0xPQkFMKHU4LCBhY3BpX2dibF9kYl9vcHRfaW5pX21ldGhvZHMpOworQUNQSV9HTE9CQUwodTgsIGFjcGlfZ2JsX2RiX29wdF9ub19yZWdpb25fc3VwcG9ydCk7CitBQ1BJX0dMT0JBTCh1OCwgYWNwaV9nYmxfZGJfb3V0cHV0X3RvX2ZpbGUpOworQUNQSV9HTE9CQUwoY2hhciAqLCBhY3BpX2dibF9kYl9idWZmZXIpOworQUNQSV9HTE9CQUwoY2hhciAqLCBhY3BpX2dibF9kYl9maWxlbmFtZSk7CitBQ1BJX0dMT0JBTCh1MzIsIGFjcGlfZ2JsX2RiX2RlYnVnX2xldmVsKTsKK0FDUElfR0xPQkFMKHUzMiwgYWNwaV9nYmxfZGJfY29uc29sZV9kZWJ1Z19sZXZlbCk7CitBQ1BJX0dMT0JBTChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqLCBhY3BpX2dibF9kYl9zY29wZV9ub2RlKTsKIAotQUNQSV9FWFRFUk4gY2hhciAqYWNwaV9nYmxfZGJfYXJnc1tBQ1BJX0RFQlVHR0VSX01BWF9BUkdTXTsKLUFDUElfRVhURVJOIGFjcGlfb2JqZWN0X3R5cGUgYWNwaV9nYmxfZGJfYXJnX3R5cGVzW0FDUElfREVCVUdHRVJfTUFYX0FSR1NdOworQUNQSV9HTE9CQUwoY2hhciAqLCBhY3BpX2dibF9kYl9hcmdzW0FDUElfREVCVUdHRVJfTUFYX0FSR1NdKTsKK0FDUElfR0xPQkFMKGFjcGlfb2JqZWN0X3R5cGUsIGFjcGlfZ2JsX2RiX2FyZ190eXBlc1tBQ1BJX0RFQlVHR0VSX01BWF9BUkdTXSk7CiAKIC8qIFRoZXNlIGJ1ZmZlcnMgc2hvdWxkIGFsbCBiZSB0aGUgc2FtZSBzaXplICovCiAKLUFDUElfRVhURVJOIGNoYXIgYWNwaV9nYmxfZGJfbGluZV9idWZbQUNQSV9EQl9MSU5FX0JVRkZFUl9TSVpFXTsKLUFDUElfRVhURVJOIGNoYXIgYWNwaV9nYmxfZGJfcGFyc2VkX2J1ZltBQ1BJX0RCX0xJTkVfQlVGRkVSX1NJWkVdOwotQUNQSV9FWFRFUk4gY2hhciBhY3BpX2dibF9kYl9zY29wZV9idWZbQUNQSV9EQl9MSU5FX0JVRkZFUl9TSVpFXTsKLUFDUElfRVhURVJOIGNoYXIgYWNwaV9nYmxfZGJfZGVidWdfZmlsZW5hbWVbQUNQSV9EQl9MSU5FX0JVRkZFUl9TSVpFXTsKK0FDUElfR0xPQkFMKGNoYXIsIGFjcGlfZ2JsX2RiX2xpbmVfYnVmW0FDUElfREJfTElORV9CVUZGRVJfU0laRV0pOworQUNQSV9HTE9CQUwoY2hhciwgYWNwaV9nYmxfZGJfcGFyc2VkX2J1ZltBQ1BJX0RCX0xJTkVfQlVGRkVSX1NJWkVdKTsKK0FDUElfR0xPQkFMKGNoYXIsIGFjcGlfZ2JsX2RiX3Njb3BlX2J1ZltBQ1BJX0RCX0xJTkVfQlVGRkVSX1NJWkVdKTsKK0FDUElfR0xPQkFMKGNoYXIsIGFjcGlfZ2JsX2RiX2RlYnVnX2ZpbGVuYW1lW0FDUElfREJfTElORV9CVUZGRVJfU0laRV0pOwogCiAvKgogICogU3RhdGlzdGljIGdsb2JhbHMKICAqLwotQUNQSV9FWFRFUk4gdTE2IGFjcGlfZ2JsX29ial90eXBlX2NvdW50W0FDUElfVFlQRV9OU19OT0RFX01BWCArIDFdOwotQUNQSV9FWFRFUk4gdTE2IGFjcGlfZ2JsX25vZGVfdHlwZV9jb3VudFtBQ1BJX1RZUEVfTlNfTk9ERV9NQVggKyAxXTsKLUFDUElfRVhURVJOIHUxNiBhY3BpX2dibF9vYmpfdHlwZV9jb3VudF9taXNjOwotQUNQSV9FWFRFUk4gdTE2IGFjcGlfZ2JsX25vZGVfdHlwZV9jb3VudF9taXNjOwotQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX251bV9ub2RlczsKLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9udW1fb2JqZWN0czsKK0FDUElfR0xPQkFMKHUxNiwgYWNwaV9nYmxfb2JqX3R5cGVfY291bnRbQUNQSV9UWVBFX05TX05PREVfTUFYICsgMV0pOworQUNQSV9HTE9CQUwodTE2LCBhY3BpX2dibF9ub2RlX3R5cGVfY291bnRbQUNQSV9UWVBFX05TX05PREVfTUFYICsgMV0pOworQUNQSV9HTE9CQUwodTE2LCBhY3BpX2dibF9vYmpfdHlwZV9jb3VudF9taXNjKTsKK0FDUElfR0xPQkFMKHUxNiwgYWNwaV9nYmxfbm9kZV90eXBlX2NvdW50X21pc2MpOworQUNQSV9HTE9CQUwodTMyLCBhY3BpX2dibF9udW1fbm9kZXMpOworQUNQSV9HTE9CQUwodTMyLCBhY3BpX2dibF9udW1fb2JqZWN0cyk7CiAKLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9zaXplX29mX3BhcnNlX3RyZWU7Ci1BQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfc2l6ZV9vZl9tZXRob2RfdHJlZXM7Ci1BQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfc2l6ZV9vZl9ub2RlX2VudHJpZXM7Ci1BQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfc2l6ZV9vZl9hY3BpX29iamVjdHM7CitBQ1BJX0dMT0JBTCh1MzIsIGFjcGlfZ2JsX3NpemVfb2ZfcGFyc2VfdHJlZSk7CitBQ1BJX0dMT0JBTCh1MzIsIGFjcGlfZ2JsX3NpemVfb2ZfbWV0aG9kX3RyZWVzKTsKK0FDUElfR0xPQkFMKHUzMiwgYWNwaV9nYmxfc2l6ZV9vZl9ub2RlX2VudHJpZXMpOworQUNQSV9HTE9CQUwodTMyLCBhY3BpX2dibF9zaXplX29mX2FjcGlfb2JqZWN0cyk7CiAKICNlbmRpZgkJCQkvKiBBQ1BJX0RFQlVHR0VSICovCiAKQEAgLTUwOCw3ICs0OTcsNyBAQAogCiAjaWZkZWYgQUNQSV9BUFBMSUNBVElPTgogCi1BQ1BJX0ZJTEUgQUNQSV9JTklUX0dMT0JBTChhY3BpX2dibF9kZWJ1Z19maWxlLCBOVUxMKTsKK0FDUElfSU5JVF9HTE9CQUwoQUNQSV9GSUxFLCBhY3BpX2dibF9kZWJ1Z19maWxlLCBOVUxMKTsKIAogI2VuZGlmCQkJCS8qIEFDUElfQVBQTElDQVRJT04gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2h3YXJlLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjaHdhcmUuaAppbmRleCA2MzU3ZTkzLi4yYWQyMzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjaHdhcmUuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjaHdhcmUuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNpbnRlcnAuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNpbnRlcnAuaAppbmRleCA4YWY4YzliLi5jNTQyNjc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjaW50ZXJwLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2ludGVycC5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtODcsNiArODcsMTAgQEAKICNkZWZpbmUgQUNQSV9FWERfUEFDS0FHRSAgICAgICAgICAgICAgICAxMQogI2RlZmluZSBBQ1BJX0VYRF9GSUVMRCAgICAgICAgICAgICAgICAgIDEyCiAjZGVmaW5lIEFDUElfRVhEX1JFRkVSRU5DRSAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQUNQSV9FWERfTElTVCAgICAgICAgICAgICAgICAgICAxNAkvKiBPcGVyYW5kIG9iamVjdCBsaXN0ICovCisjZGVmaW5lIEFDUElfRVhEX0hETFJfTElTVCAgICAgICAgICAgICAgMTUJLyogQWRkcmVzcyBIYW5kbGVyIGxpc3QgKi8KKyNkZWZpbmUgQUNQSV9FWERfUkdOX0xJU1QgICAgICAgICAgICAgICAxNgkvKiBSZWdpb24gbGlzdCAqLworI2RlZmluZSBBQ1BJX0VYRF9OT0RFICAgICAgICAgICAgICAgICAgIDE3CS8qIE5hbWVzcGFjZSBOb2RlICovCiAKIC8qIHJlc3RvcmUgZGVmYXVsdCBhbGlnbm1lbnQgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2xvY2FsLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbG9jYWwuaAppbmRleCBkOTVjYTU0Li41MmEyMWRhZmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbG9jYWwuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbG9jYWwuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNtYWNyb3MuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNtYWNyb3MuaAppbmRleCAyYTg2YzY1Li40YmNlYjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbWFjcm9zLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY21hY3Jvcy5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNjMsMTcgKzYzLDIxIEBACiAjZGVmaW5lIEFDUElfU0VUNjQocHRyLCB2YWwpICAgICAgICAgICAgKCpBQ1BJX0NBU1Q2NCAocHRyKSA9ICh1NjQpICh2YWwpKQogCiAvKgotICogcHJpbnRmKCkgZm9ybWF0IGhlbHBlcnMKKyAqIHByaW50ZigpIGZvcm1hdCBoZWxwZXJzLiBUaGVzZSBtYWNyb3MgYXJlIHdvcmthcm91bmRzIGZvciB0aGUgZGlmZmljdWx0aWVzCisgKiB3aXRoIGVtaXR0aW5nIDY0LWJpdCBpbnRlZ2VycyBhbmQgNjQtYml0IHBvaW50ZXJzIHdpdGggdGhlIHNhbWUgY29kZQorICogZm9yIGJvdGggMzItYml0IGFuZCA2NC1iaXQgaG9zdHMuCiAgKi8KLQotLyogU3BsaXQgNjQtYml0IGludGVnZXIgaW50byB0d28gMzItYml0IHZhbHVlcy4gVXNlIHdpdGggJTguOFglOC44WCAqLwotCiAjZGVmaW5lIEFDUElfRk9STUFUX1VJTlQ2NChpKSAgICAgICAgICAgQUNQSV9ISURXT1JEKGkpLCBBQ1BJX0xPRFdPUkQoaSkKIAogI2lmIEFDUElfTUFDSElORV9XSURUSCA9PSA2NAogI2RlZmluZSBBQ1BJX0ZPUk1BVF9OQVRJVkVfVUlOVChpKSAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChpKQorI2RlZmluZSBBQ1BJX0ZPUk1BVF9UT19VSU5UKGkpICAgICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChpKQorI2RlZmluZSBBQ1BJX1BSSU5URl9VSU5UICAgICAgICAgICAgICAgICAiMHglOC44WCU4LjhYIgorCiAjZWxzZQotI2RlZmluZSBBQ1BJX0ZPUk1BVF9OQVRJVkVfVUlOVChpKSAgICAgIDAsIChpKQorI2RlZmluZSBBQ1BJX0ZPUk1BVF9OQVRJVkVfVUlOVChpKSAgICAgIDAsICh1MzIpIChpKQorI2RlZmluZSBBQ1BJX0ZPUk1BVF9UT19VSU5UKGkpICAgICAgICAgICh1MzIpIChpKQorI2RlZmluZSBBQ1BJX1BSSU5URl9VSU5UICAgICAgICAgICAgICAgICAiMHglOC44WCIKICNlbmRpZgogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY25hbWVzcC5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY25hbWVzcC5oCmluZGV4IGU2MTM4YWMuLmVlMWMwNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNuYW1lc3AuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbmFtZXNwLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2Fjb2JqZWN0LmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Fjb2JqZWN0LmgKaW5kZXggY2M3YWI2ZC4uMWE0ZDYxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY29iamVjdC5oCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNvYmplY3QuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNvcGNvZGUuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNvcGNvZGUuaAppbmRleCAzZmM5Y2E3Li5kZGEwZTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2Fjb3Bjb2RlLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY29wY29kZS5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY3BhcnNlci5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY3BhcnNlci5oCmluZGV4IGFlZDMxOTMuLjYxNjhiODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNwYXJzZXIuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjcGFyc2VyLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjcHJlZGVmLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjcHJlZGVmLmgKaW5kZXggZjYwMGFkZWQuLmE0OGQ3MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNwcmVkZWYuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjcHJlZGVmLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC00OCw3ICs0OCw3IEBACiAgKgogICogUmV0dXJuIFBhY2thZ2UgdHlwZXMKICAqCi0gKiAxKSBQVFlQRTEgcGFja2FnZXMgZG8gbm90IGNvbnRhaW4gc3ViLXBhY2thZ2VzLgorICogMSkgUFRZUEUxIHBhY2thZ2VzIGRvIG5vdCBjb250YWluIHN1YnBhY2thZ2VzLgogICoKICAqIEFDUElfUFRZUEUxX0ZJWEVEOiBGaXhlZC1sZW5ndGggbGVuZ3RoLCAxIG9yIDIgb2JqZWN0IHR5cGVzOgogICogICAgICBvYmplY3QgdHlwZQpAQCAtNjMsOCArNjMsOCBAQAogICogICAgICAoVXNlZCBmb3IgX1BSVykKICAqCiAgKgotICogMikgUFRZUEUyIHBhY2thZ2VzIGNvbnRhaW4gYSBWYXJpYWJsZS1sZW5ndGggbnVtYmVyIG9mIHN1Yi1wYWNrYWdlcy4gRWFjaAotICogICAgb2YgdGhlIGRpZmZlcmVudCB0eXBlcyBkZXNjcmliZSB0aGUgY29udGVudHMgb2YgZWFjaCBvZiB0aGUgc3ViLXBhY2thZ2VzLgorICogMikgUFRZUEUyIHBhY2thZ2VzIGNvbnRhaW4gYSBWYXJpYWJsZS1sZW5ndGggbnVtYmVyIG9mIHN1YnBhY2thZ2VzLiBFYWNoCisgKiAgICBvZiB0aGUgZGlmZmVyZW50IHR5cGVzIGRlc2NyaWJlIHRoZSBjb250ZW50cyBvZiBlYWNoIG9mIHRoZSBzdWJwYWNrYWdlcy4KICAqCiAgKiBBQ1BJX1BUWVBFMjogRWFjaCBzdWJwYWNrYWdlIGNvbnRhaW5zIDEgb3IgMiBvYmplY3QgdHlwZXMuIFplcm8tbGVuZ3RoCiAgKiAgICAgIHBhcmVudCBwYWNrYWdlIGlzIGFsbG93ZWQ6CkBAIC01NjAsNyArNTYwLDcgQEAKIAogCS8qCiAJICogRm9yIF9IUFgsIGEgc2luZ2xlIHBhY2thZ2UgaXMgcmV0dXJuZWQsIGNvbnRhaW5pbmcgYSB2YXJpYWJsZS1sZW5ndGggbnVtYmVyCi0JICogb2Ygc3ViLXBhY2thZ2VzLiBFYWNoIHN1Yi1wYWNrYWdlIGNvbnRhaW5zIGEgUENJIHJlY29yZCBzZXR0aW5nLgorCSAqIG9mIHN1YnBhY2thZ2VzLiBFYWNoIHN1YnBhY2thZ2UgY29udGFpbnMgYSBQQ0kgcmVjb3JkIHNldHRpbmcuCiAJICogVGhlcmUgYXJlIHNldmVyYWwgZGlmZmVyZW50IHR5cGUgb2YgcmVjb3JkIHNldHRpbmdzLCBvZiBkaWZmZXJlbnQKIAkgKiBsZW5ndGhzLCBidXQgYWxsIGVsZW1lbnRzIG9mIGFsbCBzZXR0aW5ncyBhcmUgSW50ZWdlcnMuCiAJICovCkBAIC02OTgsNiArNjk4LDEyIEBACiAJICBNRVRIT0RfUkVUVVJOUyhBQ1BJX1JUWVBFX1BBQ0tBR0UpfX0sCS8qIFZhcmlhYmxlLWxlbmd0aCAoUmVmcykgKi8KIAlQQUNLQUdFX0lORk8oQUNQSV9QVFlQRTFfVkFSLCBBQ1BJX1JUWVBFX1JFRkVSRU5DRSwgMCwgMCwgMCwgMCksCiAKKwl7eyJfUFJQIiwgTUVUSE9EXzBBUkdTLAorCSAgTUVUSE9EX1JFVFVSTlMoQUNQSV9SVFlQRV9QQUNLQUdFKX19LAkvKiBWYXJpYWJsZS1sZW5ndGggKFBrZ3MpIGVhY2g6IDEgU3RyLCAxIEludC9TdHIvUGtnICovCisJUEFDS0FHRV9JTkZPKEFDUElfUFRZUEUyLCBBQ1BJX1JUWVBFX1NUUklORywgMSwKKwkJICAgICBBQ1BJX1JUWVBFX0lOVEVHRVIgfCBBQ1BJX1JUWVBFX1NUUklORyB8CisJCSAgICAgQUNQSV9SVFlQRV9QQUNLQUdFIHwgQUNQSV9SVFlQRV9SRUZFUkVOQ0UsIDEsIDApLAorCiAJe3siX1BSUyIsIE1FVEhPRF8wQVJHUywKIAkgIE1FVEhPRF9SRVRVUk5TKEFDUElfUlRZUEVfQlVGRkVSKX19LAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjcmVzcmMuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNyZXNyYy5oCmluZGV4IGZmOTc0MzAuLjRiMDA4ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNyZXNyYy5oCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNyZXNyYy5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY3N0cnVjdC5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY3N0cnVjdC5oCmluZGV4IGZjODNjMGEuLjVkMjk4OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNzdHJ1Y3QuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Fjc3RydWN0LmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjdGFibGVzLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjdGFibGVzLmgKaW5kZXggYzU0ZjQyYy4uNWZhNGIyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY3RhYmxlcy5oCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWN0YWJsZXMuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWN1dGlscy5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY3V0aWxzLmgKaW5kZXggYmU4MTgwYy4uY2VlZWMwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY3V0aWxzLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY3V0aWxzLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC00OSw3ICs0OSw3IEBACiAKIC8qIFN0cmluZ3MgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyIGFuZCBkZWJ1Z2dlciByZXNvdXJjZSBkdW1wIHJvdXRpbmVzICovCiAKLSNpZiBkZWZpbmVkKEFDUElfRElTQVNTRU1CTEVSKSB8fCBkZWZpbmVkIChBQ1BJX0RFQlVHR0VSKQorI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQgKEFDUElfRElTQVNTRU1CTEVSKSB8fCBkZWZpbmVkIChBQ1BJX0RFQlVHR0VSKQogCiBleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfYm1fZGVjb2RlW107CiBleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfY29uZmlnX2RlY29kZVtdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hbWxjb2RlLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FtbGNvZGUuaAppbmRleCA0OGEzZTMzLi41OTA4Y2NlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FtbGNvZGUuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FtbGNvZGUuaApAQCAtNyw3ICs3LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYW1scmVzcmMuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYW1scmVzcmMuaAppbmRleCA4N2MyNjM2Li5mM2Y4MzQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FtbHJlc3JjLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hbWxyZXNyYy5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc2FyZ3MuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNhcmdzLmMKaW5kZXggYWZkYzZkZi4uNzIwYjFjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc2FyZ3MuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzYXJncy5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc2NvbnRyb2wuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNjb250cm9sLmMKaW5kZXggZWI1NmI2Ni4uOGRhZjlkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc2NvbnRyb2wuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzY29udHJvbC5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc2ZpZWxkLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzZmllbGQuYwppbmRleCBlN2E1N2M1Li4zNjYxYzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzZmllbGQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzZmllbGQuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNpbml0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzaW5pdC5jCmluZGV4IDE0NDI0MjAuLjk2NjQ0ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNpbml0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc2luaXQuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNtZXRob2QuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNtZXRob2QuYwppbmRleCA4MWE3OGJhLi4yYzZkNDJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzbWV0aG9kLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc21ldGhvZC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc210aGRhdC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc210aGRhdC5jCmluZGV4IGM0YjBiMzYuLmI2NzUyMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNtdGhkYXQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzbXRoZGF0LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc29iamVjdC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc29iamVjdC5jCmluZGV4IGIxNzQ2YTYuLmExZTdlNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNvYmplY3QuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzb2JqZWN0LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzb3Bjb2RlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzb3Bjb2RlLmMKaW5kZXggNTIwNWVkYy4uNmMwNzU5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc29wY29kZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNvcGNvZGUuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN1dGlscy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc3V0aWxzLmMKaW5kZXggZDdmNTNmYi4uOWY3NDc5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc3V0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc3V0aWxzLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc3dleGVjLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd2V4ZWMuYwppbmRleCAxYmJiMjJmLi5mN2Y1MTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd2V4ZWMuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd2V4ZWMuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN3bG9hZC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc3dsb2FkLmMKaW5kZXggMmRiZTEwOS4uYmQ3ODExYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc3dsb2FkLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc3dsb2FkLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd2xvYWQyLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd2xvYWQyLmMKaW5kZXggN2Y1NjlkNS4uMmFjMjhkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc3dsb2FkMi5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN3bG9hZDIuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN3c2NvcGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN3c2NvcGUuYwppbmRleCBkNjc4OTFkLi45ZDZlMmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd3Njb3BlLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc3dzY29wZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc3dzdGF0ZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc3dzdGF0ZS5jCmluZGV4IGVjYjEyZTIuLjI0ZjdkNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN3c3RhdGUuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd3N0YXRlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2ZXZlbnQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZldmVudC5jCmluZGV4IDgzY2Q0NWYuLmM3YmZmZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZldmVudC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZldmVudC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldmdsb2NrLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z2xvY2suYwppbmRleCA0YzY3MTkzLi4zMzkzYTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z2xvY2suYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z2xvY2suYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGUuYwppbmRleCBhOWNiNGExLi45NTVmODNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BlLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldmdwZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldmdwZWJsay5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldmdwZWJsay5jCmluZGV4IGEzMWU1NDkuLmNhYWVkM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGVibGsuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BlYmxrLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BlaW5pdC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldmdwZWluaXQuYwppbmRleCBhM2UyZjM4Li5hZTc3OWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BlaW5pdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGVpbml0LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BldXRpbC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldmdwZXV0aWwuYwppbmRleCA0ZDc2NGU4Li4xN2U0YmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BldXRpbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGV1dGlsLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2aGFuZGxlci5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldmhhbmRsZXIuYwppbmRleCBlMzE1NzMxLi43OGFjMjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2aGFuZGxlci5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZoYW5kbGVyLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2bWlzYy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldm1pc2MuYwppbmRleCBhNTY4NzU0Li41ZDU5NGViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2bWlzYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZtaXNjLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2cmVnaW9uLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2cmVnaW9uLmMKaW5kZXggMTQ0Y2JiOS4uOTk1NzI5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldnJlZ2lvbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZyZWdpb24uYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTMxNCw2ICszMTQsNyBAQAogewogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmhhbmRsZXJfb2JqOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnN0YXJ0X2Rlc2M7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmxhc3Rfb2JqX3B0cjsKIAlhY3BpX2Fkcl9zcGFjZV9zZXR1cCByZWdpb25fc2V0dXA7CiAJdm9pZCAqKnJlZ2lvbl9jb250ZXh0OwpAQCAtMzQxLDYgKzM0Miw3IEBACiAJLyogRmluZCB0aGlzIHJlZ2lvbiBpbiB0aGUgaGFuZGxlcidzIGxpc3QgKi8KIAogCW9ial9kZXNjID0gaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UucmVnaW9uX2xpc3Q7CisJc3RhcnRfZGVzYyA9IG9ial9kZXNjOwogCWxhc3Rfb2JqX3B0ciA9ICZoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5yZWdpb25fbGlzdDsKIAogCXdoaWxlIChvYmpfZGVzYykgewpAQCAtNDM4LDYgKzQ0MCwxNSBAQAogCiAJCWxhc3Rfb2JqX3B0ciA9ICZvYmpfZGVzYy0+cmVnaW9uLm5leHQ7CiAJCW9ial9kZXNjID0gb2JqX2Rlc2MtPnJlZ2lvbi5uZXh0OworCisJCS8qIFByZXZlbnQgaW5maW5pdGUgbG9vcCBpZiBsaXN0IGlzIGNvcnJ1cHRlZCAqLworCisJCWlmIChvYmpfZGVzYyA9PSBzdGFydF9kZXNjKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiQ2lyY3VsYXIgaGFuZGxlciBsaXN0IGluIHJlZ2lvbiBvYmplY3QgJXAiLAorCQkJCSAgICByZWdpb25fb2JqKSk7CisJCQlyZXR1cm5fVk9JRDsKKwkJfQogCX0KIAogCS8qIElmIHdlIGdldCBoZXJlLCB0aGUgcmVnaW9uIHdhcyBub3QgaW4gdGhlIGhhbmRsZXIncyByZWdpb24gbGlzdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldnJnbmluaS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldnJnbmluaS5jCmluZGV4IDgzNTRjNGYuLjFiMTQ4YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZyZ25pbmkuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2cmduaW5pLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2c2NpLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2c2NpLmMKaW5kZXggOWU5ZTM0NS4uNGQ4YTcwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldnNjaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZzY2kuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmFjZS5jCmluZGV4IDIzYTdmYWQuLmE3MzRiMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmFjZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmZXZudC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmZXZudC5jCmluZGV4IDM5ZDA2YWYuLmUyODY2NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmV2bnQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZldm50LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZncGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmdwZS5jCmluZGV4IDU3MTNkYTcuLjIwYTEzOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmdwZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmdwZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNTgzLDYgKzU4MywxOCBAQAogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CiAKKwkvKiBWYWxpZGF0ZSB0aGUgcGFyZW50IGRldmljZSAqLworCisJaWYgKG5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX0RFVklDRSkgeworCQlzdGF0dXMgPSBBRV9UWVBFOworCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwl9CisKKwlpZiAobm9kZS0+b2JqZWN0KSB7CisJCXN0YXR1cyA9IEFFX0FMUkVBRFlfRVhJU1RTOworCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwl9CisKIAkvKgogCSAqIEZvciB1c2VyLWluc3RhbGxlZCBHUEUgQmxvY2sgRGV2aWNlcywgdGhlIGdwZV9ibG9ja19iYXNlX251bWJlcgogCSAqIGlzIGFsd2F5cyB6ZXJvCkBAIC02NjYsNiArNjc4LDEzIEBACiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KIAorCS8qIFZhbGlkYXRlIHRoZSBwYXJlbnQgZGV2aWNlICovCisKKwlpZiAobm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfREVWSUNFKSB7CisJCXN0YXR1cyA9IEFFX1RZUEU7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKwogCS8qIEdldCB0aGUgZGV2aWNlX29iamVjdCBhdHRhY2hlZCB0byB0aGUgbm9kZSAqLwogCiAJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZyZWduLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZyZWduLmMKaW5kZXggMDJlZDc1YS4uMmQ2ZjE4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmcmVnbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZnJlZ24uYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhjb25maWcuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhjb25maWcuYwppbmRleCAwNmQyMTZjLi44YmExNDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y29uZmlnLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leGNvbmZpZy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leGNvbnZydC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leGNvbnZydC5jCmluZGV4IDY5ZTRhOGMuLmM1NDUzODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhjb252cnQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y29udnJ0LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y3JlYXRlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y3JlYXRlLmMKaW5kZXggM2MyZTZkYy4uOTVkMjNkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9leGNyZWF0ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhjcmVhdGUuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhkZWJ1Zy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leGRlYnVnLmMKaW5kZXggODFjNzJhNC4uNGNmYzNkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9leGRlYnVnLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leGRlYnVnLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4ZHVtcC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leGR1bXAuYwppbmRleCA0ZDA0NmZhLi45NzNmZGFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4ZHVtcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhkdW1wLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC05NCwxMiArOTQsMTMgQEAKIAl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfYnVmZmVyKSwgTlVMTH0sCiAJe0FDUElfRVhEX1VJTlQzMiwgQUNQSV9FWERfT0ZGU0VUKGJ1ZmZlci5sZW5ndGgpLCAiTGVuZ3RoIn0sCiAJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChidWZmZXIucG9pbnRlciksICJQb2ludGVyIn0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChidWZmZXIubm9kZSksICJQYXJlbnQgTm9kZSJ9LAorCXtBQ1BJX0VYRF9OT0RFLCBBQ1BJX0VYRF9PRkZTRVQoYnVmZmVyLm5vZGUpLCAiUGFyZW50IE5vZGUifSwKIAl7QUNQSV9FWERfQlVGRkVSLCAwLCBOVUxMfQogfTsKIAotc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9wYWNrYWdlWzVdID0geworc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9wYWNrYWdlWzZdID0gewogCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9wYWNrYWdlKSwgTlVMTH0sCisJe0FDUElfRVhEX05PREUsIEFDUElfRVhEX09GRlNFVChwYWNrYWdlLm5vZGUpLCAiUGFyZW50IE5vZGUifSwKIAl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChwYWNrYWdlLmZsYWdzKSwgIkZsYWdzIn0sCiAJe0FDUElfRVhEX1VJTlQzMiwgQUNQSV9FWERfT0ZGU0VUKHBhY2thZ2UuY291bnQpLCAiRWxlbWVudHMifSwKIAl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHBhY2thZ2UuZWxlbWVudHMpLCAiRWxlbWVudCBMaXN0In0sCkBAIC0xMDgsMTEgKzEwOSwxMSBAQAogCiBzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX2RldmljZVs0XSA9IHsKIAl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfZGV2aWNlKSwgTlVMTH0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChkZXZpY2UuaGFuZGxlciksICJIYW5kbGVyIn0sCiAJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChkZXZpY2Uubm90aWZ5X2xpc3RbMF0pLAogCSAiU3lzdGVtIE5vdGlmeSJ9LAogCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoZGV2aWNlLm5vdGlmeV9saXN0WzFdKSwKLQkgIkRldmljZSBOb3RpZnkifQorCSAiRGV2aWNlIE5vdGlmeSJ9LAorCXtBQ1BJX0VYRF9IRExSX0xJU1QsIEFDUElfRVhEX09GRlNFVChkZXZpY2UuaGFuZGxlciksICJIYW5kbGVyIn0KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfZXZlbnRbMl0gPSB7CkBAIC0xNDIsMTcgKzE0MywxOCBAQAogCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQobXV0ZXgub3NfbXV0ZXgpLCAiT3NNdXRleCJ9CiB9OwogCi1zdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX3JlZ2lvbls3XSA9IHsKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfcmVnaW9uWzhdID0gewogCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9yZWdpb24pLCBOVUxMfSwKIAl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChyZWdpb24uc3BhY2VfaWQpLCAiU3BhY2UgSWQifSwKIAl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChyZWdpb24uZmxhZ3MpLCAiRmxhZ3MifSwKKwl7QUNQSV9FWERfTk9ERSwgQUNQSV9FWERfT0ZGU0VUKHJlZ2lvbi5ub2RlKSwgIlBhcmVudCBOb2RlIn0sCiAJe0FDUElfRVhEX0FERFJFU1MsIEFDUElfRVhEX09GRlNFVChyZWdpb24uYWRkcmVzcyksICJBZGRyZXNzIn0sCiAJe0FDUElfRVhEX1VJTlQzMiwgQUNQSV9FWERfT0ZGU0VUKHJlZ2lvbi5sZW5ndGgpLCAiTGVuZ3RoIn0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChyZWdpb24uaGFuZGxlciksICJIYW5kbGVyIn0sCisJe0FDUElfRVhEX0hETFJfTElTVCwgQUNQSV9FWERfT0ZGU0VUKHJlZ2lvbi5oYW5kbGVyKSwgIkhhbmRsZXIifSwKIAl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHJlZ2lvbi5uZXh0KSwgIk5leHQifQogfTsKIAotc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9wb3dlcls1XSA9IHsKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfcG93ZXJbNl0gPSB7CiAJe0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX3Bvd2VyKSwgTlVMTH0sCiAJe0FDUElfRVhEX1VJTlQzMiwgQUNQSV9FWERfT0ZGU0VUKHBvd2VyX3Jlc291cmNlLnN5c3RlbV9sZXZlbCksCiAJICJTeXN0ZW0gTGV2ZWwifSwKQEAgLTE2MSw3ICsxNjMsOCBAQAogCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQocG93ZXJfcmVzb3VyY2Uubm90aWZ5X2xpc3RbMF0pLAogCSAiU3lzdGVtIE5vdGlmeSJ9LAogCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQocG93ZXJfcmVzb3VyY2Uubm90aWZ5X2xpc3RbMV0pLAotCSAiRGV2aWNlIE5vdGlmeSJ9CisJICJEZXZpY2UgTm90aWZ5In0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChwb3dlcl9yZXNvdXJjZS5oYW5kbGVyKSwgIkhhbmRsZXIifQogfTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9wcm9jZXNzb3JbN10gPSB7CkBAIC0yMjUsNyArMjI4LDcgQEAKIAl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChyZWZlcmVuY2UudGFyZ2V0X3R5cGUpLCAiVGFyZ2V0IFR5cGUifSwKIAl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQocmVmZXJlbmNlLnZhbHVlKSwgIlZhbHVlIn0sCiAJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChyZWZlcmVuY2Uub2JqZWN0KSwgIk9iamVjdCBEZXNjIn0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChyZWZlcmVuY2Uubm9kZSksICJOb2RlIn0sCisJe0FDUElfRVhEX05PREUsIEFDUElfRVhEX09GRlNFVChyZWZlcmVuY2Uubm9kZSksICJOb2RlIn0sCiAJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChyZWZlcmVuY2Uud2hlcmUpLCAiV2hlcmUifSwKIAl7QUNQSV9FWERfUkVGRVJFTkNFLCAwLCBOVUxMfQogfTsKQEAgLTIzNCwxNiArMjM3LDE2IEBACiAJe0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX2FkZHJlc3NfaGFuZGxlciksCiAJIE5VTEx9LAogCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfT0ZGU0VUKGFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQpLCAiU3BhY2UgSWQifSwKLQl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGFkZHJlc3Nfc3BhY2UubmV4dCksICJOZXh0In0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChhZGRyZXNzX3NwYWNlLnJlZ2lvbl9saXN0KSwKKwl7QUNQSV9FWERfSERMUl9MSVNULCBBQ1BJX0VYRF9PRkZTRVQoYWRkcmVzc19zcGFjZS5uZXh0KSwgIk5leHQifSwKKwl7QUNQSV9FWERfUkdOX0xJU1QsIEFDUElfRVhEX09GRlNFVChhZGRyZXNzX3NwYWNlLnJlZ2lvbl9saXN0KSwKIAkgIlJlZ2lvbiBMaXN0In0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChhZGRyZXNzX3NwYWNlLm5vZGUpLCAiTm9kZSJ9LAorCXtBQ1BJX0VYRF9OT0RFLCBBQ1BJX0VYRF9PRkZTRVQoYWRkcmVzc19zcGFjZS5ub2RlKSwgIk5vZGUifSwKIAl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGFkZHJlc3Nfc3BhY2UuY29udGV4dCksICJDb250ZXh0In0KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfbm90aWZ5WzddID0gewogCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9ub3RpZnkpLCBOVUxMfSwKLQl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKG5vdGlmeS5ub2RlKSwgIk5vZGUifSwKKwl7QUNQSV9FWERfTk9ERSwgQUNQSV9FWERfT0ZGU0VUKG5vdGlmeS5ub2RlKSwgIk5vZGUifSwKIAl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQobm90aWZ5LmhhbmRsZXJfdHlwZSksICJIYW5kbGVyIFR5cGUifSwKIAl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKG5vdGlmeS5oYW5kbGVyKSwgIkhhbmRsZXIifSwKIAl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKG5vdGlmeS5jb250ZXh0KSwgIkNvbnRleHQifSwKQEAgLTI1MiwxNCArMjU1LDMxIEBACiAJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChub3RpZnkubmV4dFsxXSksICJOZXh0IERldmljZSBOb3RpZnkifQogfTsKIAorc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9leHRyYVs2XSA9IHsKKwl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfZXh0cmEpLCBOVUxMfSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGV4dHJhLm1ldGhvZF9SRUcpLCAiX1JFRyBNZXRob2QifSwKKwl7QUNQSV9FWERfTk9ERSwgQUNQSV9FWERfT0ZGU0VUKGV4dHJhLnNjb3BlX25vZGUpLCAiU2NvcGUgTm9kZSJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoZXh0cmEucmVnaW9uX2NvbnRleHQpLAorCSAiUmVnaW9uIENvbnRleHQifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGV4dHJhLmFtbF9zdGFydCksICJBbWwgU3RhcnQifSwKKwl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQoZXh0cmEuYW1sX2xlbmd0aCksICJBbWwgTGVuZ3RoIn0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfZGF0YVszXSA9IHsKKwl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfZGF0YSksIE5VTEx9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoZGF0YS5oYW5kbGVyKSwgIkhhbmRsZXIifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGRhdGEucG9pbnRlciksICJSYXcgRGF0YSJ9Cit9OworCiAvKiBNaXNjZWxsYW5lb3VzIHRhYmxlcyAqLwogCi1zdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX2NvbW1vbls0XSA9IHsKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfY29tbW9uWzVdID0gewogCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9jb21tb24pLCBOVUxMfSwKIAl7QUNQSV9FWERfVFlQRSwgMCwgTlVMTH0sCiAJe0FDUElfRVhEX1VJTlQxNiwgQUNQSV9FWERfT0ZGU0VUKGNvbW1vbi5yZWZlcmVuY2VfY291bnQpLAogCSAiUmVmZXJlbmNlIENvdW50In0sCi0Je0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9PRkZTRVQoY29tbW9uLmZsYWdzKSwgIkZsYWdzIn0KKwl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChjb21tb24uZmxhZ3MpLCAiRmxhZ3MifSwKKwl7QUNQSV9FWERfTElTVCwgQUNQSV9FWERfT0ZGU0VUKGNvbW1vbi5uZXh0X29iamVjdCksICJPYmplY3QgTGlzdCJ9CiB9OwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX2ZpZWxkX2NvbW1vbls3XSA9IHsKQEAgLTI3NCwxNSArMjk0LDE3IEBACiAJICJGaWVsZCBCaXQgT2Zmc2V0In0sCiAJe0FDUElfRVhEX1VJTlQzMiwgQUNQSV9FWERfT0ZGU0VUKGNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0KSwKIAkgIkJhc2UgQnl0ZSBPZmZzZXQifSwKLQl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGNvbW1vbl9maWVsZC5ub2RlKSwgIlBhcmVudCBOb2RlIn0KKwl7QUNQSV9FWERfTk9ERSwgQUNQSV9FWERfT0ZGU0VUKGNvbW1vbl9maWVsZC5ub2RlKSwgIlBhcmVudCBOb2RlIn0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfbm9kZVs1XSA9IHsKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfbm9kZVs3XSA9IHsKIAl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfbm9kZSksIE5VTEx9LAogCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfTlNPRkZTRVQoZmxhZ3MpLCAiRmxhZ3MifSwKIAl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX05TT0ZGU0VUKG93bmVyX2lkKSwgIk93bmVyIElkIn0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX05TT0ZGU0VUKGNoaWxkKSwgIkNoaWxkIExpc3QifSwKLQl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfTlNPRkZTRVQocGVlciksICJOZXh0IFBlZXIifQorCXtBQ1BJX0VYRF9MSVNULCBBQ1BJX0VYRF9OU09GRlNFVChvYmplY3QpLCAiT2JqZWN0IExpc3QifSwKKwl7QUNQSV9FWERfTk9ERSwgQUNQSV9FWERfTlNPRkZTRVQocGFyZW50KSwgIlBhcmVudCJ9LAorCXtBQ1BJX0VYRF9OT0RFLCBBQ1BJX0VYRF9OU09GRlNFVChjaGlsZCksICJDaGlsZCJ9LAorCXtBQ1BJX0VYRF9OT0RFLCBBQ1BJX0VYRF9OU09GRlNFVChwZWVyKSwgIlBlZXIifQogfTsKIAogLyogRGlzcGF0Y2ggdGFibGUsIGluZGV4ZWQgYnkgb2JqZWN0IHR5cGUgKi8KQEAgLTMxNSw3ICszMzcsOSBAQAogCWFjcGlfZXhfZHVtcF9hZGRyZXNzX2hhbmRsZXIsCiAJTlVMTCwKIAlOVUxMLAotCU5VTEwKKwlOVUxMLAorCWFjcGlfZXhfZHVtcF9leHRyYSwKKwlhY3BpX2V4X2R1bXBfZGF0YQogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM0MCw2ICszNjQsMTAgQEAKIAljaGFyICpuYW1lOwogCWNvbnN0IGNoYXIgKnJlZmVyZW5jZV9uYW1lOwogCXU4IGNvdW50OworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnN0YXJ0OworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmRhdGEgPSBOVUxMOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm5leHQ7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiAKIAlpZiAoIWluZm8pIHsKIAkJYWNwaV9vc19wcmludGYKQEAgLTM2Myw5ICszOTEsOSBAQAogCiAJCWNhc2UgQUNQSV9FWERfVFlQRToKIAotCQkJYWNwaV9leF9vdXRfc3RyaW5nKCJUeXBlIiwKLQkJCQkJICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQotCQkJCQkgICAob2JqX2Rlc2MpKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJTIuMlggWyVzXVxuIiwgIlR5cGUiLAorCQkJCSAgICAgICBvYmpfZGVzYy0+Y29tbW9uLnR5cGUsCisJCQkJICAgICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUob2JqX2Rlc2MpKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9FWERfVUlOVDg6CkBAIC00MzMsNiArNDYxLDEyMSBAQAogCQkJYWNwaV9leF9kdW1wX3JlZmVyZW5jZV9vYmoob2JqX2Rlc2MpOwogCQkJYnJlYWs7CiAKKwkJY2FzZSBBQ1BJX0VYRF9MSVNUOgorCisJCQlzdGFydCA9ICpBQ1BJX0NBU1RfUFRSKHZvaWQgKiwgdGFyZ2V0KTsKKwkJCW5leHQgPSBzdGFydDsKKworCQkJYWNwaV9vc19wcmludGYoIiUyMHMgOiAlcCIsIG5hbWUsIG5leHQpOworCQkJaWYgKG5leHQpIHsKKwkJCQlhY3BpX29zX3ByaW50ZigiKCVzICUyLjJYKSIsCisJCQkJCSAgICAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCSAgICAgICAobmV4dCksIG5leHQtPmNvbW1vbi50eXBlKTsKKworCQkJCXdoaWxlIChuZXh0LT5jb21tb24ubmV4dF9vYmplY3QpIHsKKwkJCQkJaWYgKChuZXh0LT5jb21tb24udHlwZSA9PQorCQkJCQkgICAgIEFDUElfVFlQRV9MT0NBTF9EQVRBKSAmJiAhZGF0YSkgeworCQkJCQkJZGF0YSA9IG5leHQ7CisJCQkJCX0KKworCQkJCQluZXh0ID0gbmV4dC0+Y29tbW9uLm5leHRfb2JqZWN0OworCQkJCQlhY3BpX29zX3ByaW50ZigiLT4lcCglcyAlMi4yWCkiLCBuZXh0LAorCQkJCQkJICAgICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJCSAgICAgICAobmV4dCksCisJCQkJCQkgICAgICAgbmV4dC0+Y29tbW9uLnR5cGUpOworCisJCQkJCWlmICgobmV4dCA9PSBzdGFydCkgfHwgKG5leHQgPT0gZGF0YSkpIHsKKwkJCQkJCWFjcGlfb3NfcHJpbnRmCisJCQkJCQkgICAgKCJcbioqKiogRXJyb3I6IE9iamVjdCBsaXN0IGFwcGVhcnMgdG8gYmUgY2lyY3VsYXIgbGlua2VkIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJYWNwaV9vc19wcmludGYoIlxuIiwgbmV4dCk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfRVhEX0hETFJfTElTVDoKKworCQkJc3RhcnQgPSAqQUNQSV9DQVNUX1BUUih2b2lkICosIHRhcmdldCk7CisJCQluZXh0ID0gc3RhcnQ7CisKKwkJCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJXAiLCBuYW1lLCBuZXh0KTsKKwkJCWlmIChuZXh0KSB7CisJCQkJYWNwaV9vc19wcmludGYoIiglcyAlMi4yWCkiLAorCQkJCQkgICAgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkgICAgICAgKG5leHQpLCBuZXh0LT5jb21tb24udHlwZSk7CisKKwkJCQl3aGlsZSAobmV4dC0+YWRkcmVzc19zcGFjZS5uZXh0KSB7CisJCQkJCWlmICgobmV4dC0+Y29tbW9uLnR5cGUgPT0KKwkJCQkJICAgICBBQ1BJX1RZUEVfTE9DQUxfREFUQSkgJiYgIWRhdGEpIHsKKwkJCQkJCWRhdGEgPSBuZXh0OworCQkJCQl9CisKKwkJCQkJbmV4dCA9IG5leHQtPmFkZHJlc3Nfc3BhY2UubmV4dDsKKwkJCQkJYWNwaV9vc19wcmludGYoIi0+JXAoJXMgJTIuMlgpIiwgbmV4dCwKKwkJCQkJCSAgICAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCQkgICAgICAgKG5leHQpLAorCQkJCQkJICAgICAgIG5leHQtPmNvbW1vbi50eXBlKTsKKworCQkJCQlpZiAoKG5leHQgPT0gc3RhcnQpIHx8IChuZXh0ID09IGRhdGEpKSB7CisJCQkJCQlhY3BpX29zX3ByaW50ZgorCQkJCQkJICAgICgiXG4qKioqIEVycm9yOiBIYW5kbGVyIGxpc3QgYXBwZWFycyB0byBiZSBjaXJjdWxhciBsaW5rZWQiKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlhY3BpX29zX3ByaW50ZigiXG4iLCBuZXh0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9FWERfUkdOX0xJU1Q6CisKKwkJCXN0YXJ0ID0gKkFDUElfQ0FTVF9QVFIodm9pZCAqLCB0YXJnZXQpOworCQkJbmV4dCA9IHN0YXJ0OworCisJCQlhY3BpX29zX3ByaW50ZigiJTIwcyA6ICVwIiwgbmFtZSwgbmV4dCk7CisJCQlpZiAobmV4dCkgeworCQkJCWFjcGlfb3NfcHJpbnRmKCIoJXMgJTIuMlgpIiwKKwkJCQkJICAgICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJICAgICAgIChuZXh0KSwgbmV4dC0+Y29tbW9uLnR5cGUpOworCisJCQkJd2hpbGUgKG5leHQtPnJlZ2lvbi5uZXh0KSB7CisJCQkJCWlmICgobmV4dC0+Y29tbW9uLnR5cGUgPT0KKwkJCQkJICAgICBBQ1BJX1RZUEVfTE9DQUxfREFUQSkgJiYgIWRhdGEpIHsKKwkJCQkJCWRhdGEgPSBuZXh0OworCQkJCQl9CisKKwkJCQkJbmV4dCA9IG5leHQtPnJlZ2lvbi5uZXh0OworCQkJCQlhY3BpX29zX3ByaW50ZigiLT4lcCglcyAlMi4yWCkiLCBuZXh0LAorCQkJCQkJICAgICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJCSAgICAgICAobmV4dCksCisJCQkJCQkgICAgICAgbmV4dC0+Y29tbW9uLnR5cGUpOworCisJCQkJCWlmICgobmV4dCA9PSBzdGFydCkgfHwgKG5leHQgPT0gZGF0YSkpIHsKKwkJCQkJCWFjcGlfb3NfcHJpbnRmCisJCQkJCQkgICAgKCJcbioqKiogRXJyb3I6IFJlZ2lvbiBsaXN0IGFwcGVhcnMgdG8gYmUgY2lyY3VsYXIgbGlua2VkIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJYWNwaV9vc19wcmludGYoIlxuIiwgbmV4dCk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfRVhEX05PREU6CisKKwkJCW5vZGUgPQorCQkJICAgICpBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICosCisJCQkJCSAgIHRhcmdldCk7CisKKwkJCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJXAiLCBuYW1lLCBub2RlKTsKKwkJCWlmIChub2RlKSB7CisJCQkJYWNwaV9vc19wcmludGYoIiBbJTQuNHNdIiwgbm9kZS0+bmFtZS5hc2NpaSk7CisJCQl9CisJCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKKwkJCWJyZWFrOworCiAJCWRlZmF1bHQ6CiAKIAkJCWFjcGlfb3NfcHJpbnRmKCIqKioqIEludmFsaWQgdGFibGUgb3Bjb2RlIFslWF0gKioqKlxuIiwKQEAgLTgyMSwxMCArOTY0LDggQEAKIAl9CiAKIAlhY3BpX29zX3ByaW50ZigiJTIwcyA6ICU0LjRzXG4iLCAiTmFtZSIsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSk7Ci0JYWNwaV9leF9vdXRfc3RyaW5nKCJUeXBlIiwgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG5vZGUtPnR5cGUpKTsKLQlhY3BpX2V4X291dF9wb2ludGVyKCJBdHRhY2hlZCBPYmplY3QiLAotCQkJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKSk7Ci0JYWNwaV9leF9vdXRfcG9pbnRlcigiUGFyZW50Iiwgbm9kZS0+cGFyZW50KTsKKwlhY3BpX29zX3ByaW50ZigiJTIwcyA6ICUyLjJYIFslc11cbiIsICJUeXBlIiwKKwkJICAgICAgIG5vZGUtPnR5cGUsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShub2RlLT50eXBlKSk7CiAKIAlhY3BpX2V4X2R1bXBfb2JqZWN0KEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgbm9kZSksCiAJCQkgICAgYWNwaV9leF9kdW1wX25vZGUpOwpAQCAtMTAxNywyMiArMTE1OCwyNiBAQAogCQkJICAgICAgICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfZGVzYyktPgogCQkJICAgICAgIG9iamVjdCk7CiAKLQkJYWNwaV9leF9kdW1wX29iamVjdF9kZXNjcmlwdG9yKCgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikKLQkJCQkJCW9ial9kZXNjKS0+b2JqZWN0LCBmbGFncyk7Ci0JCXJldHVybl9WT0lEOworCQlvYmpfZGVzYyA9ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfZGVzYyktPm9iamVjdDsKKwkJZ290byBkdW1wX29iamVjdDsKIAl9CiAKIAlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7Ci0JCWFjcGlfb3NfcHJpbnRmCi0JCSAgICAoIkV4RHVtcE9iamVjdERlc2NyaXB0b3I6ICVwIGlzIG5vdCBhbiBBQ1BJIG9wZXJhbmQgb2JqZWN0OiBbJXNdXG4iLAotCQkgICAgIG9ial9kZXNjLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUob2JqX2Rlc2MpKTsKKwkJYWNwaV9vc19wcmludGYoIiVwIGlzIG5vdCBhbiBBQ1BJIG9wZXJhbmQgb2JqZWN0OiBbJXNdXG4iLAorCQkJICAgICAgIG9ial9kZXNjLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUob2JqX2Rlc2MpKTsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCi0JaWYgKG9ial9kZXNjLT5jb21tb24udHlwZSA+IEFDUElfVFlQRV9OU19OT0RFX01BWCkgeworCS8qIFZhbGlkYXRlIHRoZSBvYmplY3QgdHlwZSAqLworCisJaWYgKG9ial9kZXNjLT5jb21tb24udHlwZSA+IEFDUElfVFlQRV9MT0NBTF9NQVgpIHsKKwkJYWNwaV9vc19wcmludGYoIk5vdCBhIGtub3duIG9iamVjdCB0eXBlOiAlMi4yWFxuIiwKKwkJCSAgICAgICBvYmpfZGVzYy0+Y29tbW9uLnR5cGUpOwogCQlyZXR1cm5fVk9JRDsKIAl9CiAKK2R1bXBfb2JqZWN0OgorCiAJLyogQ29tbW9uIEZpZWxkcyAqLwogCiAJYWNwaV9leF9kdW1wX29iamVjdChvYmpfZGVzYywgYWNwaV9leF9kdW1wX2NvbW1vbik7CkBAIC0xMDQwLDYgKzExODUsMjIgQEAKIAkvKiBPYmplY3Qtc3BlY2lmaWMgZmllbGRzICovCiAKIAlhY3BpX2V4X2R1bXBfb2JqZWN0KG9ial9kZXNjLCBhY3BpX2V4X2R1bXBfaW5mb1tvYmpfZGVzYy0+Y29tbW9uLnR5cGVdKTsKKworCWlmIChvYmpfZGVzYy0+Y29tbW9uLnR5cGUgPT0gQUNQSV9UWVBFX1JFR0lPTikgeworCQlvYmpfZGVzYyA9IG9ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3Q7CisJCWlmIChvYmpfZGVzYy0+Y29tbW9uLnR5cGUgPiBBQ1BJX1RZUEVfTE9DQUxfTUFYKSB7CisJCQlhY3BpX29zX3ByaW50ZgorCQkJICAgICgiU2Vjb25kYXJ5IG9iamVjdCBpcyBub3QgYSBrbm93biBvYmplY3QgdHlwZTogJTIuMlhcbiIsCisJCQkgICAgIG9ial9kZXNjLT5jb21tb24udHlwZSk7CisKKwkJCXJldHVybl9WT0lEOworCQl9CisKKwkJYWNwaV9vc19wcmludGYoIlxuRXh0cmEgYXR0YWNoZWQgT2JqZWN0ICglcCk6XG4iLCBvYmpfZGVzYyk7CisJCWFjcGlfZXhfZHVtcF9vYmplY3Qob2JqX2Rlc2MsCisJCQkJICAgIGFjcGlfZXhfZHVtcF9pbmZvW29ial9kZXNjLT5jb21tb24udHlwZV0pOworCX0KKwogCXJldHVybl9WT0lEOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4ZmllbGQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhmaWVsZC5jCmluZGV4IGNmZDg3NTIuLjY4ZDk3NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhmaWVsZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhmaWVsZC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leGZsZGlvLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4ZmxkaW8uYwppbmRleCA0OWZiNzQyLi4xZDFiMjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4ZmxkaW8uYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4ZmxkaW8uYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhtaXNjLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4bWlzYy5jCmluZGV4IDY1ZDkzNjAuLjIyMDdlNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhtaXNjLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leG1pc2MuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhtdXRleC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leG11dGV4LmMKaW5kZXggN2JlMDIwNS4uYjQ5ZWEyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9leG11dGV4LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leG11dGV4LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4bmFtZXMuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhuYW1lcy5jCmluZGV4IDE0Njg5ZGUuLmRiYjAzYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhuYW1lcy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhuYW1lcy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leG9wYXJnMS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leG9wYXJnMS5jCmluZGV4IGQ3NGNlYTQuLjFiOGU5NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhvcGFyZzEuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4b3BhcmcxLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4b3BhcmcyLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4b3BhcmcyLmMKaW5kZXggZDZmYTBmYy4uMmVkZTY1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9leG9wYXJnMi5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhvcGFyZzIuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhvcGFyZzMuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhvcGFyZzMuYwppbmRleCBiYzA0MmFkZi4uMzYzNzY3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9leG9wYXJnMy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhvcGFyZzMuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhvcGFyZzYuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhvcGFyZzYuYwppbmRleCA0NDU5ZTMyLi4yOWU5ZTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4b3Bhcmc2LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leG9wYXJnNi5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leHByZXAuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhwcmVwLmMKaW5kZXggNWE1ODg2MS4uZWUzZjg3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9leHByZXAuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4cHJlcC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlZ2lvbi5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlZ2lvbi5jCmluZGV4IDlkMjg4NjdlLi5jZDUyODhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4cmVnaW9uLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlZ2lvbi5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlc250ZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlc250ZS5jCmluZGV4IDdjYTY5MjUuLmFiMDYwMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhyZXNudGUuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4cmVzbnRlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4cmVzb2x2LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4cmVzb2x2LmMKaW5kZXggMTYwNjUyNC4uM2NkZTU1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlc29sdi5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhyZXNvbHYuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhyZXNvcC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlc29wLmMKaW5kZXggYmUzZjY2OS4uM2FmOGRlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlc29wLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlc29wLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4c3RvcmUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhzdG9yZS5jCmluZGV4IGYwYjA5YmYuLmRhZjQ5ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhzdG9yZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhzdG9yZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leHN0b3Jlbi5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHN0b3Jlbi5jCmluZGV4IDIwZDgwOWQuLjA0YmQxNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhzdG9yZW4uYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4c3RvcmVuLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4c3Rvcm9iLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4c3Rvcm9iLmMKaW5kZXggMjZlMzcxMC4uZmQxMTAxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9leHN0b3JvYi5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhzdG9yb2IuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhzeXN0ZW0uYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhzeXN0ZW0uYwppbmRleCA2NTc4ZGVlLi44NDFjYWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4c3lzdGVtLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHN5c3RlbS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leHV0aWxzLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4dXRpbHMuYwppbmRleCA5OWRjN2IyLi41YjE2YzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4dXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4dXRpbHMuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdhY3BpLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3YWNwaS5jCmluZGV4IDNkMzZkZjguLjFlNjZkOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdhY3BpLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od2FjcGkuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdlc2xlZXAuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdlc2xlZXAuYwppbmRleCA0MTQwNzY4Li44NThmZGQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3ZXNsZWVwLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od2VzbGVlcC5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9od2dwZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od2dwZS5jCmluZGV4IDk2NTQwNTAuLjJlNmNhYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdncGUuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3Z3BlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3cGNpLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3cGNpLmMKaW5kZXggMDg4OWE2Mi4uZTcwMWQ4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9od3BjaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdwY2kuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3cmVncy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od3JlZ3MuYwppbmRleCAxMmU2Y2ZmLi5lMGZkOWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3cmVncy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdyZWdzLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9od3NsZWVwLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3c2xlZXAuYwppbmRleCBlMzgyOGNjLi5kNTkwNjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3c2xlZXAuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3c2xlZXAuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHd0aW1lci5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od3RpbWVyLmMKaW5kZXggM2M0OThkYy4uNzZhYjVjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9od3RpbWVyLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od3RpbWVyLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3dmFsaWQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHd2YWxpZC5jCmluZGV4IGVhYjcwZDUuLjZiOTE5MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHd2YWxpZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHd2YWxpZC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9od3hmYWNlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3eGZhY2UuYwppbmRleCBiNGI0N2RiLi45NmQwMDdkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9od3hmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od3hmYWNlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3eGZzbGVlcC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od3hmc2xlZXAuYwppbmRleCAxNWRkZGMxLi42OTIxYzdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3eGZzbGVlcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHd4ZnNsZWVwLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zYWNjZXNzLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zYWNjZXNzLmMKaW5kZXggMTRmNjVmNi4uZjEyNDllMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2FjY2Vzcy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNhY2Nlc3MuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zYWxsb2MuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNhbGxvYy5jCmluZGV4IGZkMWZmNTQuLjYwN2ViOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNhbGxvYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNhbGxvYy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNhcmd1bWVudHMuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNhcmd1bWVudHMuYwppbmRleCA3NGIyNGM4Li44MGZjZmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zYXJndW1lbnRzLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc2FyZ3VtZW50cy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2NvbnZlcnQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNjb252ZXJ0LmMKaW5kZXggYWNkMjk2NC4uYjU1NjQyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2NvbnZlcnQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zY29udmVydC5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2R1bXAuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNkdW1wLmMKaW5kZXggNDhiOWM2Zi4uM2Q4OGVmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2R1bXAuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zZHVtcC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2R1bXBkdi5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc2R1bXBkdi5jCmluZGV4IDI4Mzc2MjUuLjQyZDM3MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNkdW1wZHYuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zZHVtcGR2LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zZXZhbC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc2V2YWwuYwppbmRleCA5NjNjZWVmLi5lNjM0YTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zZXZhbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNldmFsLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2luaXQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNpbml0LmMKaW5kZXggM2EwNDIzYS4uNWI3NDY3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2luaXQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zaW5pdC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2xvYWQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNsb2FkLmMKaW5kZXggODllYzY0NS4uN2FlNTIxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2xvYWQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zbG9hZC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc25hbWVzLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zbmFtZXMuYwppbmRleCA5MGEwMzgwLi43ZWVlMGE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zbmFtZXMuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zbmFtZXMuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zb2JqZWN0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zb2JqZWN0LmMKaW5kZXggN2E3MzZmNC4uZmU1NGE4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc29iamVjdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNvYmplY3QuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0yMjIsMTMgKzIyMiwxOSBAQAogCQl9CiAJfQogCi0JLyogQ2xlYXIgdGhlIGVudHJ5IGluIGFsbCBjYXNlcyAqLworCS8qIENsZWFyIHRoZSBOb2RlIGVudHJ5IGluIGFsbCBjYXNlcyAqLwogCiAJbm9kZS0+b2JqZWN0ID0gTlVMTDsKIAlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7CisKKwkJLyogVW5saW5rIG9iamVjdCBmcm9tIGZyb250IG9mIHBvc3NpYmxlIG9iamVjdCBsaXN0ICovCisKIAkJbm9kZS0+b2JqZWN0ID0gb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdDsKKworCQkvKiBIYW5kbGUgcG9zc2libGUgMi1kZXNjcmlwdG9yIG9iamVjdCAqLworCiAJCWlmIChub2RlLT5vYmplY3QgJiYKLQkJICAgICgobm9kZS0+b2JqZWN0KS0+Y29tbW9uLnR5cGUgIT0gQUNQSV9UWVBFX0xPQ0FMX0RBVEEpKSB7CisJCSAgICAobm9kZS0+b2JqZWN0LT5jb21tb24udHlwZSAhPSBBQ1BJX1RZUEVfTE9DQUxfREFUQSkpIHsKIAkJCW5vZGUtPm9iamVjdCA9IG5vZGUtPm9iamVjdC0+Y29tbW9uLm5leHRfb2JqZWN0OwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3BhcnNlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcGFyc2UuYwppbmRleCAxNzc4NTczLi5lODNjZmYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcGFyc2UuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcGFyc2UuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNwcmVkZWYuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNwcmVkZWYuYwppbmRleCBkMjg1NWQ5Li4zOTI5MTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcHJlZGVmLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3ByZWRlZi5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3ByZXBrZy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3ByZXBrZy5jCmluZGV4IDNkNTM5MWYuLjY4ZjcyNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNwcmVwa2cuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcHJlcGtnLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0xMzIsMTIgKzEzMiwxMiBAQAogCSAqIERlY29kZSB0aGUgdHlwZSBvZiB0aGUgZXhwZWN0ZWQgcGFja2FnZSBjb250ZW50cwogCSAqCiAJICogUFRZUEUxIHBhY2thZ2VzIGNvbnRhaW4gbm8gc3VicGFja2FnZXMKLQkgKiBQVFlQRTIgcGFja2FnZXMgY29udGFpbiBzdWItcGFja2FnZXMKKwkgKiBQVFlQRTIgcGFja2FnZXMgY29udGFpbiBzdWJwYWNrYWdlcwogCSAqLwogCXN3aXRjaCAocGFja2FnZS0+cmV0X2luZm8udHlwZSkgewogCWNhc2UgQUNQSV9QVFlQRTFfRklYRUQ6CiAJCS8qCi0JCSAqIFRoZSBwYWNrYWdlIGNvdW50IGlzIGZpeGVkIGFuZCB0aGVyZSBhcmUgbm8gc3ViLXBhY2thZ2VzCisJCSAqIFRoZSBwYWNrYWdlIGNvdW50IGlzIGZpeGVkIGFuZCB0aGVyZSBhcmUgbm8gc3VicGFja2FnZXMKIAkJICoKIAkJICogSWYgcGFja2FnZSBpcyB0b28gc21hbGwsIGV4aXQuCiAJCSAqIElmIHBhY2thZ2UgaXMgbGFyZ2VyIHRoYW4gZXhwZWN0ZWQsIGlzc3VlIHdhcm5pbmcgYnV0IGNvbnRpbnVlCkBAIC0xNjksNyArMTY5LDcgQEAKIAogCWNhc2UgQUNQSV9QVFlQRTFfVkFSOgogCQkvKgotCQkgKiBUaGUgcGFja2FnZSBjb3VudCBpcyB2YXJpYWJsZSwgdGhlcmUgYXJlIG5vIHN1Yi1wYWNrYWdlcywgYW5kIGFsbAorCQkgKiBUaGUgcGFja2FnZSBjb3VudCBpcyB2YXJpYWJsZSwgdGhlcmUgYXJlIG5vIHN1YnBhY2thZ2VzLCBhbmQgYWxsCiAJCSAqIGVsZW1lbnRzIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZQogCQkgKi8KIAkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKQEAgLTE4NSw3ICsxODUsNyBAQAogCiAJY2FzZSBBQ1BJX1BUWVBFMV9PUFRJT046CiAJCS8qCi0JCSAqIFRoZSBwYWNrYWdlIGNvdW50IGlzIHZhcmlhYmxlLCB0aGVyZSBhcmUgbm8gc3ViLXBhY2thZ2VzLiBUaGVyZSBhcmUKKwkJICogVGhlIHBhY2thZ2UgY291bnQgaXMgdmFyaWFibGUsIHRoZXJlIGFyZSBubyBzdWJwYWNrYWdlcy4gVGhlcmUgYXJlCiAJCSAqIGEgZml4ZWQgbnVtYmVyIG9mIHJlcXVpcmVkIGVsZW1lbnRzLCBhbmQgYSB2YXJpYWJsZSBudW1iZXIgb2YKIAkJICogb3B0aW9uYWwgZWxlbWVudHMuCiAJCSAqCkBAIC0yNDIsNyArMjQyLDcgQEAKIAkJZWxlbWVudHMrKzsKIAkJY291bnQtLTsKIAotCQkvKiBFeGFtaW5lIHRoZSBzdWItcGFja2FnZXMgKi8KKwkJLyogRXhhbWluZSB0aGUgc3VicGFja2FnZXMgKi8KIAogCQlzdGF0dXMgPQogCQkgICAgYWNwaV9uc19jaGVja19wYWNrYWdlX2xpc3QoaW5mbywgcGFja2FnZSwgZWxlbWVudHMsIGNvdW50KTsKQEAgLTI1MCw3ICsyNTAsNyBAQAogCiAJY2FzZSBBQ1BJX1BUWVBFMl9QS0dfQ09VTlQ6CiAKLQkJLyogRmlyc3QgZWxlbWVudCBpcyB0aGUgKEludGVnZXIpIGNvdW50IG9mIHN1Yi1wYWNrYWdlcyB0byBmb2xsb3cgKi8KKwkJLyogRmlyc3QgZWxlbWVudCBpcyB0aGUgKEludGVnZXIpIGNvdW50IG9mIHN1YnBhY2thZ2VzIHRvIGZvbGxvdyAqLwogCiAJCXN0YXR1cyA9IGFjcGlfbnNfY2hlY2tfb2JqZWN0X3R5cGUoaW5mbywgZWxlbWVudHMsCiAJCQkJCQkgICBBQ1BJX1JUWVBFX0lOVEVHRVIsIDApOwpAQCAtMjcwLDcgKzI3MCw3IEBACiAJCWNvdW50ID0gZXhwZWN0ZWRfY291bnQ7CiAJCWVsZW1lbnRzKys7CiAKLQkJLyogRXhhbWluZSB0aGUgc3ViLXBhY2thZ2VzICovCisJCS8qIEV4YW1pbmUgdGhlIHN1YnBhY2thZ2VzICovCiAKIAkJc3RhdHVzID0KIAkJICAgIGFjcGlfbnNfY2hlY2tfcGFja2FnZV9saXN0KGluZm8sIHBhY2thZ2UsIGVsZW1lbnRzLCBjb3VudCk7CkBAIC0yODMsOSArMjgzLDkgQEAKIAljYXNlIEFDUElfUFRZUEUyX0ZJWF9WQVI6CiAJCS8qCiAJCSAqIFRoZXNlIHR5cGVzIGFsbCByZXR1cm4gYSBzaW5nbGUgUGFja2FnZSB0aGF0IGNvbnNpc3RzIG9mIGEKLQkJICogdmFyaWFibGUgbnVtYmVyIG9mIHN1Yi1QYWNrYWdlcy4KKwkJICogdmFyaWFibGUgbnVtYmVyIG9mIHN1YnBhY2thZ2VzLgogCQkgKgotCQkgKiBGaXJzdCwgZW5zdXJlIHRoYXQgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYSBzdWItUGFja2FnZS4gSWYgbm90LAorCQkgKiBGaXJzdCwgZW5zdXJlIHRoYXQgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYSBzdWJwYWNrYWdlLiBJZiBub3QsCiAJCSAqIHRoZSBCSU9TIG1heSBoYXZlIGluY29ycmVjdGx5IHJldHVybmVkIHRoZSBvYmplY3QgYXMgYSBzaW5nbGUKIAkJICogcGFja2FnZSBpbnN0ZWFkIG9mIGEgUGFja2FnZSBvZiBQYWNrYWdlcyAoYSBjb21tb24gZXJyb3IgaWYKIAkJICogdGhlcmUgaXMgb25seSBvbmUgZW50cnkpLiBXZSBtYXkgYmUgYWJsZSB0byByZXBhaXIgdGhpcyBieQpAQCAtMzEwLDcgKzMxMCw3IEBACiAJCQljb3VudCA9IDE7CiAJCX0KIAotCQkvKiBFeGFtaW5lIHRoZSBzdWItcGFja2FnZXMgKi8KKwkJLyogRXhhbWluZSB0aGUgc3VicGFja2FnZXMgKi8KIAogCQlzdGF0dXMgPQogCQkgICAgYWNwaV9uc19jaGVja19wYWNrYWdlX2xpc3QoaW5mbywgcGFja2FnZSwgZWxlbWVudHMsIGNvdW50KTsKQEAgLTM3MCw5ICszNzAsOSBAQAogCXUzMiBqOwogCiAJLyoKLQkgKiBWYWxpZGF0ZSBlYWNoIHN1Yi1QYWNrYWdlIGluIHRoZSBwYXJlbnQgUGFja2FnZQorCSAqIFZhbGlkYXRlIGVhY2ggc3VicGFja2FnZSBpbiB0aGUgcGFyZW50IFBhY2thZ2UKIAkgKgotCSAqIE5PVEU6IGFzc3VtZXMgbGlzdCBvZiBzdWItcGFja2FnZXMgY29udGFpbnMgbm8gTlVMTCBlbGVtZW50cy4KKwkgKiBOT1RFOiBhc3N1bWVzIGxpc3Qgb2Ygc3VicGFja2FnZXMgY29udGFpbnMgbm8gTlVMTCBlbGVtZW50cy4KIAkgKiBBbnkgTlVMTCBlbGVtZW50cyBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQgYnkgZWFybGllciBjYWxsCiAJICogdG8gYWNwaV9uc19yZW1vdmVfbnVsbF9lbGVtZW50cy4KIAkgKi8KQEAgLTM4OSw3ICszODksNyBAQAogCQkJcmV0dXJuIChzdGF0dXMpOwogCQl9CiAKLQkJLyogRXhhbWluZSB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGV4cGVjdGVkIHN1Yi1wYWNrYWdlcyAqLworCQkvKiBFeGFtaW5lIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgZXhwZWN0ZWQgc3VicGFja2FnZXMgKi8KIAogCQlpbmZvLT5wYXJlbnRfcGFja2FnZSA9IHN1Yl9wYWNrYWdlOwogCQlzd2l0Y2ggKHBhY2thZ2UtPnJldF9pbmZvLnR5cGUpIHsKQEAgLTQ1MCwxNCArNDUwLDE0IEBACiAKIAkJY2FzZSBBQ1BJX1BUWVBFMl9GSVhFRDoKIAotCQkJLyogRWFjaCBzdWItcGFja2FnZSBoYXMgYSBmaXhlZCBsZW5ndGggKi8KKwkJCS8qIEVhY2ggc3VicGFja2FnZSBoYXMgYSBmaXhlZCBsZW5ndGggKi8KIAogCQkJZXhwZWN0ZWRfY291bnQgPSBwYWNrYWdlLT5yZXRfaW5mbzIuY291bnQ7CiAJCQlpZiAoc3ViX3BhY2thZ2UtPnBhY2thZ2UuY291bnQgPCBleHBlY3RlZF9jb3VudCkgewogCQkJCWdvdG8gcGFja2FnZV90b29fc21hbGw7CiAJCQl9CiAKLQkJCS8qIENoZWNrIHRoZSB0eXBlIG9mIGVhY2ggc3ViLXBhY2thZ2UgZWxlbWVudCAqLworCQkJLyogQ2hlY2sgdGhlIHR5cGUgb2YgZWFjaCBzdWJwYWNrYWdlIGVsZW1lbnQgKi8KIAogCQkJZm9yIChqID0gMDsgaiA8IGV4cGVjdGVkX2NvdW50OyBqKyspIHsKIAkJCQlzdGF0dXMgPQpAQCAtNDc1LDE0ICs0NzUsMTQgQEAKIAogCQljYXNlIEFDUElfUFRZUEUyX01JTjoKIAotCQkJLyogRWFjaCBzdWItcGFja2FnZSBoYXMgYSB2YXJpYWJsZSBidXQgbWluaW11bSBsZW5ndGggKi8KKwkJCS8qIEVhY2ggc3VicGFja2FnZSBoYXMgYSB2YXJpYWJsZSBidXQgbWluaW11bSBsZW5ndGggKi8KIAogCQkJZXhwZWN0ZWRfY291bnQgPSBwYWNrYWdlLT5yZXRfaW5mby5jb3VudDE7CiAJCQlpZiAoc3ViX3BhY2thZ2UtPnBhY2thZ2UuY291bnQgPCBleHBlY3RlZF9jb3VudCkgewogCQkJCWdvdG8gcGFja2FnZV90b29fc21hbGw7CiAJCQl9CiAKLQkJCS8qIENoZWNrIHRoZSB0eXBlIG9mIGVhY2ggc3ViLXBhY2thZ2UgZWxlbWVudCAqLworCQkJLyogQ2hlY2sgdGhlIHR5cGUgb2YgZWFjaCBzdWJwYWNrYWdlIGVsZW1lbnQgKi8KIAogCQkJc3RhdHVzID0KIAkJCSAgICBhY3BpX25zX2NoZWNrX3BhY2thZ2VfZWxlbWVudHMoaW5mbywgc3ViX2VsZW1lbnRzLApAQCAtNTMxLDcgKzUzMSw3IEBACiAJCQkJKCpzdWJfZWxlbWVudHMpLT5pbnRlZ2VyLnZhbHVlID0gZXhwZWN0ZWRfY291bnQ7CiAJCQl9CiAKLQkJCS8qIENoZWNrIHRoZSB0eXBlIG9mIGVhY2ggc3ViLXBhY2thZ2UgZWxlbWVudCAqLworCQkJLyogQ2hlY2sgdGhlIHR5cGUgb2YgZWFjaCBzdWJwYWNrYWdlIGVsZW1lbnQgKi8KIAogCQkJc3RhdHVzID0KIAkJCSAgICBhY3BpX25zX2NoZWNrX3BhY2thZ2VfZWxlbWVudHMoaW5mbywKQEAgLTU1NywxMCArNTU3LDEwIEBACiAKIHBhY2thZ2VfdG9vX3NtYWxsOgogCi0JLyogVGhlIHN1Yi1wYWNrYWdlIGNvdW50IHdhcyBzbWFsbGVyIHRoYW4gcmVxdWlyZWQgKi8KKwkvKiBUaGUgc3VicGFja2FnZSBjb3VudCB3YXMgc21hbGxlciB0aGFuIHJlcXVpcmVkICovCiAKIAlBQ1BJX1dBUk5fUFJFREVGSU5FRCgoQUVfSU5GTywgaW5mby0+ZnVsbF9wYXRobmFtZSwgaW5mby0+bm9kZV9mbGFncywKLQkJCSAgICAgICJSZXR1cm4gU3ViLVBhY2thZ2VbJXVdIGlzIHRvbyBzbWFsbCAtIGZvdW5kICV1IGVsZW1lbnRzLCBleHBlY3RlZCAldSIsCisJCQkgICAgICAiUmV0dXJuIFN1YlBhY2thZ2VbJXVdIGlzIHRvbyBzbWFsbCAtIGZvdW5kICV1IGVsZW1lbnRzLCBleHBlY3RlZCAldSIsCiAJCQkgICAgICBpLCBzdWJfcGFja2FnZS0+cGFja2FnZS5jb3VudCwgZXhwZWN0ZWRfY291bnQpKTsKIAogCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVkFMVUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3JlcGFpci5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3JlcGFpci5jCmluZGV4IGEwNWFmZmYuLjdlNDE3YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNyZXBhaXIuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcmVwYWlyLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0yMDcsMTMgKzIwNywzMCBAQAogCSAqIHRoaXMgcHJlZGVmaW5lZCBuYW1lLiBFaXRoZXIgb25lIHJldHVybiB2YWx1ZSBpcyBleHBlY3RlZCwgb3Igbm9uZSwKIAkgKiBmb3IgYm90aCBtZXRob2RzIGFuZCBvdGhlciBvYmplY3RzLgogCSAqCi0JICogRXhpdCBub3cgaWYgdGhlcmUgaXMgbm8gcmV0dXJuIG9iamVjdC4gV2FybmluZyBpZiBvbmUgd2FzIGV4cGVjdGVkLgorCSAqIFRyeSB0byBmaXggaWYgdGhlcmUgd2FzIG5vIHJldHVybiBvYmplY3QuIFdhcm5pbmcgaWYgZmFpbGVkIHRvIGZpeC4KIAkgKi8KIAlpZiAoIXJldHVybl9vYmplY3QpIHsKIAkJaWYgKGV4cGVjdGVkX2J0eXBlcyAmJiAoIShleHBlY3RlZF9idHlwZXMgJiBBQ1BJX1JUWVBFX05PTkUpKSkgewotCQkJQUNQSV9XQVJOX1BSRURFRklORUQoKEFFX0lORk8sIGluZm8tPmZ1bGxfcGF0aG5hbWUsCi0JCQkJCSAgICAgIEFDUElfV0FSTl9BTFdBWVMsCi0JCQkJCSAgICAgICJNaXNzaW5nIGV4cGVjdGVkIHJldHVybiB2YWx1ZSIpKTsKKwkJCWlmIChwYWNrYWdlX2luZGV4ICE9IEFDUElfTk9UX1BBQ0tBR0VfRUxFTUVOVCkgeworCQkJCUFDUElfV0FSTl9QUkVERUZJTkVEKChBRV9JTkZPLAorCQkJCQkJICAgICAgaW5mby0+ZnVsbF9wYXRobmFtZSwKKwkJCQkJCSAgICAgIEFDUElfV0FSTl9BTFdBWVMsCisJCQkJCQkgICAgICAiRm91bmQgdW5leHBlY3RlZCBOVUxMIHBhY2thZ2UgZWxlbWVudCIpKTsKKworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfbnNfcmVwYWlyX251bGxfZWxlbWVudChpbmZvLAorCQkJCQkJCQlleHBlY3RlZF9idHlwZXMsCisJCQkJCQkJCXBhY2thZ2VfaW5kZXgsCisJCQkJCQkJCXJldHVybl9vYmplY3RfcHRyKTsKKwkJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQkJcmV0dXJuIChBRV9PSyk7CS8qIFJlcGFpciB3YXMgc3VjY2Vzc2Z1bCAqLworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJQUNQSV9XQVJOX1BSRURFRklORUQoKEFFX0lORk8sCisJCQkJCQkgICAgICBpbmZvLT5mdWxsX3BhdGhuYW1lLAorCQkJCQkJICAgICAgQUNQSV9XQVJOX0FMV0FZUywKKwkJCQkJCSAgICAgICJNaXNzaW5nIGV4cGVjdGVkIHJldHVybiB2YWx1ZSIpKTsKKwkJCX0KIAogCQkJcmV0dXJuIChBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKTsKIAkJfQpAQCAtNDQ4LDcgKzQ2NSw3IEBACiAgKiBSRVRVUk46ICAgICAgTm9uZS4KICAqCiAgKiBERVNDUklQVElPTjogUmVtb3ZlIGFsbCBOVUxMIHBhY2thZ2UgZWxlbWVudHMgZnJvbSBwYWNrYWdlcyB0aGF0IGNvbnRhaW4KLSAqICAgICAgICAgICAgICBhIHZhcmlhYmxlIG51bWJlciBvZiBzdWItcGFja2FnZXMuIEZvciB0aGVzZSB0eXBlcyBvZgorICogICAgICAgICAgICAgIGEgdmFyaWFibGUgbnVtYmVyIG9mIHN1YnBhY2thZ2VzLiBGb3IgdGhlc2UgdHlwZXMgb2YKICAqICAgICAgICAgICAgICBwYWNrYWdlcywgTlVMTCBlbGVtZW50cyBjYW4gYmUgc2FmZWx5IHJlbW92ZWQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDY5LDcgKzQ4Niw3IEBACiAJLyoKIAkgKiBXZSBjYW4gc2FmZWx5IHJlbW92ZSBhbGwgTlVMTCBlbGVtZW50cyBmcm9tIHRoZXNlIHBhY2thZ2UgdHlwZXM6CiAJICogUFRZUEUxX1ZBUiBwYWNrYWdlcyBjb250YWluIGEgdmFyaWFibGUgbnVtYmVyIG9mIHNpbXBsZSBkYXRhIHR5cGVzLgotCSAqIFBUWVBFMiBwYWNrYWdlcyBjb250YWluIGEgdmFyaWFibGUgbnVtYmVyIG9mIHN1Yi1wYWNrYWdlcy4KKwkgKiBQVFlQRTIgcGFja2FnZXMgY29udGFpbiBhIHZhcmlhYmxlIG51bWJlciBvZiBzdWJwYWNrYWdlcy4KIAkgKi8KIAlzd2l0Y2ggKHBhY2thZ2VfdHlwZSkgewogCWNhc2UgQUNQSV9QVFlQRTFfVkFSOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3JlcGFpcjIuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNyZXBhaXIyLmMKaW5kZXggNmEyNWQzMi4uYjA5ZTZiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3JlcGFpcjIuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcmVwYWlyMi5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDMyLDggKzQzMiw4IEBACiAgKiBERVNDUklQVElPTjogUmVwYWlyIGZvciB0aGUgX0NTVCBvYmplY3Q6CiAgKiAgICAgICAgICAgICAgMS4gU29ydCB0aGUgbGlzdCBhc2NlbmRpbmcgYnkgQyBzdGF0ZSB0eXBlCiAgKiAgICAgICAgICAgICAgMi4gRW5zdXJlIHR5cGUgY2Fubm90IGJlIHplcm8KLSAqICAgICAgICAgICAgICAzLiBBIHN1Yi1wYWNrYWdlIGNvdW50IG9mIHplcm8gbWVhbnMgX0NTVCBpcyBtZWFuaW5nbGVzcwotICogICAgICAgICAgICAgIDQuIENvdW50IG11c3QgbWF0Y2ggdGhlIG51bWJlciBvZiBDIHN0YXRlIHN1Yi1wYWNrYWdlcworICogICAgICAgICAgICAgIDMuIEEgc3VicGFja2FnZSBjb3VudCBvZiB6ZXJvIG1lYW5zIF9DU1QgaXMgbWVhbmluZ2xlc3MKKyAqICAgICAgICAgICAgICA0LiBDb3VudCBtdXN0IG1hdGNoIHRoZSBudW1iZXIgb2YgQyBzdGF0ZSBzdWJwYWNrYWdlcwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNjExLDYgKzYxMSw3IEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnRvcF9vYmplY3RfbGlzdDsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqc3ViX29iamVjdF9saXN0OwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnN1Yl9wYWNrYWdlOwogCXUzMiBlbGVtZW50X2NvdW50OwogCXUzMiBpbmRleDsKIApAQCAtNjE5LDggKzYyMCwxNyBAQAogCXRvcF9vYmplY3RfbGlzdCA9IHBhY2thZ2Vfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzOwogCWVsZW1lbnRfY291bnQgPSBwYWNrYWdlX29iamVjdC0+cGFja2FnZS5jb3VudDsKIAotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGVsZW1lbnRfY291bnQ7IGluZGV4KyspIHsKLQkJc3ViX29iamVjdF9saXN0ID0gKCp0b3Bfb2JqZWN0X2xpc3QpLT5wYWNrYWdlLmVsZW1lbnRzOworCS8qIEV4YW1pbmUgZWFjaCBzdWJwYWNrYWdlICovCisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBlbGVtZW50X2NvdW50OyBpbmRleCsrLCB0b3Bfb2JqZWN0X2xpc3QrKykgeworCQlzdWJfcGFja2FnZSA9ICp0b3Bfb2JqZWN0X2xpc3Q7CisJCXN1Yl9vYmplY3RfbGlzdCA9IHN1Yl9wYWNrYWdlLT5wYWNrYWdlLmVsZW1lbnRzOworCisJCS8qIENoZWNrIGZvciBtaW5pbXVtIHJlcXVpcmVkIGVsZW1lbnQgY291bnQgKi8KKworCQlpZiAoc3ViX3BhY2thZ2UtPnBhY2thZ2UuY291bnQgPCA0KSB7CisJCQljb250aW51ZTsKKwkJfQogCiAJCS8qCiAJCSAqIElmIHRoZSBCSU9TIGhhcyBlcnJvbmVvdXNseSByZXZlcnNlZCB0aGUgX1BSVCBzb3VyY2VfbmFtZSAoaW5kZXggMikKQEAgLTYzNCwxNSArNjQ0LDEyIEBACiAJCQlzdWJfb2JqZWN0X2xpc3RbMl0gPSBvYmpfZGVzYzsKIAkJCWluZm8tPnJldHVybl9mbGFncyB8PSBBQ1BJX09CSkVDVF9SRVBBSVJFRDsKIAotCQkJQUNQSV9XQVJOX1BSRURFRklORUQoKEFFX0lORk8sIGluZm8tPmZ1bGxfcGF0aG5hbWUsCisJCQlBQ1BJX1dBUk5fUFJFREVGSU5FRCgoQUVfSU5GTywKKwkJCQkJICAgICAgaW5mby0+ZnVsbF9wYXRobmFtZSwKIAkJCQkJICAgICAgaW5mby0+bm9kZV9mbGFncywKIAkJCQkJICAgICAgIlBSVFslWF06IEZpeGVkIHJldmVyc2VkIFNvdXJjZU5hbWUgYW5kIFNvdXJjZUluZGV4IiwKIAkJCQkJICAgICAgaW5kZXgpKTsKIAkJfQotCi0JCS8qIFBvaW50IHRvIHRoZSBuZXh0IHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgaW4gdGhlIHRvcCBsZXZlbCBwYWNrYWdlICovCi0KLQkJdG9wX29iamVjdF9saXN0Kys7CiAJfQogCiAJcmV0dXJuIChBRV9PSyk7CkBAIC02NzksNyArNjg2LDcgQEAKIAl1MzIgaTsKIAogCS8qCi0JICogRW50cmllcyAoc3ViLXBhY2thZ2VzKSBpbiB0aGUgX1BTUyBQYWNrYWdlIG11c3QgYmUgc29ydGVkIGJ5IHBvd2VyCisJICogRW50cmllcyAoc3VicGFja2FnZXMpIGluIHRoZSBfUFNTIFBhY2thZ2UgbXVzdCBiZSBzb3J0ZWQgYnkgcG93ZXIKIAkgKiBkaXNzaXBhdGlvbiwgaW4gZGVzY2VuZGluZyBvcmRlci4gSWYgaXQgYXBwZWFycyB0aGF0IHRoZSBsaXN0IGlzCiAJICogaW5jb3JyZWN0bHkgc29ydGVkLCBzb3J0IGl0LiBXZSBzb3J0IGJ5IGNwdV9mcmVxdWVuY3ksIHNpbmNlIHRoaXMKIAkgKiBzaG91bGQgYmUgcHJvcG9ydGlvbmFsIHRvIHRoZSBwb3dlci4KQEAgLTc2Nyw5ICs3NzQsOSBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBpbmZvICAgICAgICAgICAgICAgIC0gTWV0aG9kIGV4ZWN1dGlvbiBpbmZvcm1hdGlvbiBibG9jawogICogICAgICAgICAgICAgIHJldHVybl9vYmplY3QgICAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGV2ZWwgcmV0dXJuZWQgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgc3RhcnRfaW5kZXggICAgICAgICAtIEluZGV4IG9mIHRoZSBmaXJzdCBzdWItcGFja2FnZQotICogICAgICAgICAgICAgIGV4cGVjdGVkX2NvdW50ICAgICAgLSBNaW5pbXVtIGxlbmd0aCBvZiBlYWNoIHN1Yi1wYWNrYWdlCi0gKiAgICAgICAgICAgICAgc29ydF9pbmRleCAgICAgICAgICAtIFN1Yi1wYWNrYWdlIGVudHJ5IHRvIHNvcnQgb24KKyAqICAgICAgICAgICAgICBzdGFydF9pbmRleCAgICAgICAgIC0gSW5kZXggb2YgdGhlIGZpcnN0IHN1YnBhY2thZ2UKKyAqICAgICAgICAgICAgICBleHBlY3RlZF9jb3VudCAgICAgIC0gTWluaW11bSBsZW5ndGggb2YgZWFjaCBzdWJwYWNrYWdlCisgKiAgICAgICAgICAgICAgc29ydF9pbmRleCAgICAgICAgICAtIFN1YnBhY2thZ2UgZW50cnkgdG8gc29ydCBvbgogICogICAgICAgICAgICAgIHNvcnRfZGlyZWN0aW9uICAgICAgLSBBc2NlbmRpbmcgb3IgZGVzY2VuZGluZwogICogICAgICAgICAgICAgIHNvcnRfa2V5X25hbWUgICAgICAgLSBOYW1lIG9mIHRoZSBzb3J0X2luZGV4IGZpZWxkCiAgKgpAQCAtODA1LDcgKzgxMiw3IEBACiAJfQogCiAJLyoKLQkgKiBOT1RFOiBhc3N1bWVzIGxpc3Qgb2Ygc3ViLXBhY2thZ2VzIGNvbnRhaW5zIG5vIE5VTEwgZWxlbWVudHMuCisJICogTk9URTogYXNzdW1lcyBsaXN0IG9mIHN1YnBhY2thZ2VzIGNvbnRhaW5zIG5vIE5VTEwgZWxlbWVudHMuCiAJICogQW55IE5VTEwgZWxlbWVudHMgc2hvdWxkIGhhdmUgYmVlbiByZW1vdmVkIGJ5IGVhcmxpZXIgY2FsbAogCSAqIHRvIGFjcGlfbnNfcmVtb3ZlX251bGxfZWxlbWVudHMuCiAJICovCkBAIC04MzIsNyArODM5LDcgQEAKIAkJCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCX0KIAotCQkvKiBFYWNoIHN1Yi1wYWNrYWdlIG11c3QgaGF2ZSB0aGUgbWluaW11bSBsZW5ndGggKi8KKwkJLyogRWFjaCBzdWJwYWNrYWdlIG11c3QgaGF2ZSB0aGUgbWluaW11bSBsZW5ndGggKi8KIAogCQlpZiAoKCpvdXRlcl9lbGVtZW50cyktPnBhY2thZ2UuY291bnQgPCBleHBlY3RlZF9jb3VudCkgewogCQkJcmV0dXJuIChBRV9BTUxfUEFDS0FHRV9MSU1JVCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zc2VhcmNoLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zc2VhcmNoLmMKaW5kZXggNDc0MjBmYS4uYWYxY2M0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3NlYXJjaC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNzZWFyY2guYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN1dGlscy5jCmluZGV4IDRhMDY2NWIuLjRhNWUzZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN1dGlscy5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3dhbGsuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN3YWxrLmMKaW5kZXggZTgxZjE1ZS4uNDc1OGExZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3dhbGsuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zd2Fsay5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmZXZhbC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmZXZhbC5jCmluZGV4IDFmMGMyOGIuLjRiZDU1OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN4ZmV2YWwuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zeGZldmFsLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtOTIzLDE5ICs5MjMsMjIgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9nZXRfZGF0YQorICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2RhdGFfZnVsbAogICoKICAqIFBBUkFNRVRFUlM6ICBvYmpfaGFuZGxlICAgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUKICAqICAgICAgICAgICAgICBoYW5kbGVyICAgICAgICAgICAgIC0gSGFuZGxlciB1c2VkIGluIGNhbGwgdG8gYXR0YWNoX2RhdGEKICAqICAgICAgICAgICAgICBkYXRhICAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIGRhdGEgaXMgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICBjYWxsYmFjayAgICAgICAgICAgIC0gZnVuY3Rpb24gdG8gZXhlY3V0ZSBiZWZvcmUgcmV0dXJuaW5nCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBSZXRyaWV2ZSBkYXRhIHRoYXQgd2FzIHByZXZpb3VzbHkgYXR0YWNoZWQgdG8gYSBuYW1lc3BhY2Ugbm9kZS4KKyAqIERFU0NSSVBUSU9OOiBSZXRyaWV2ZSBkYXRhIHRoYXQgd2FzIHByZXZpb3VzbHkgYXR0YWNoZWQgdG8gYSBuYW1lc3BhY2Ugbm9kZQorICogICAgICAgICAgICAgIGFuZCBleGVjdXRlIGEgY2FsbGJhY2sgYmVmb3JlIHJldHVybmluZy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X2RhdGEoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyLCB2b2lkICoqZGF0YSkKK2FjcGlfZ2V0X2RhdGFfZnVsbChhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLCBhY3BpX29iamVjdF9oYW5kbGVyIGhhbmRsZXIsCisJCSAgIHZvaWQgKipkYXRhLCB2b2lkICgqY2FsbGJhY2spKHZvaWQgKikpCiB7CiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwpAQCAtOTYwLDEwICs5NjMsMzQgQEAKIAl9CiAKIAlzdGF0dXMgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9kYXRhKG5vZGUsIGhhbmRsZXIsIGRhdGEpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJiBjYWxsYmFjaykgeworCQljYWxsYmFjaygqZGF0YSk7CisJfQogCiB1bmxvY2tfYW5kX2V4aXQ6CiAJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAJcmV0dXJuIChzdGF0dXMpOwogfQogCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfZGF0YV9mdWxsKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9kYXRhCisgKgorICogUEFSQU1FVEVSUzogIG9ial9oYW5kbGUgICAgICAgICAgLSBOYW1lc3BhY2Ugbm9kZQorICogICAgICAgICAgICAgIGhhbmRsZXIgICAgICAgICAgICAgLSBIYW5kbGVyIHVzZWQgaW4gY2FsbCB0byBhdHRhY2hfZGF0YQorICogICAgICAgICAgICAgIGRhdGEgICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgZGF0YSBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUmV0cmlldmUgZGF0YSB0aGF0IHdhcyBwcmV2aW91c2x5IGF0dGFjaGVkIHRvIGEgbmFtZXNwYWNlIG5vZGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX2dldF9kYXRhKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsIGFjcGlfb2JqZWN0X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqKmRhdGEpCit7CisJcmV0dXJuIGFjcGlfZ2V0X2RhdGFfZnVsbChvYmpfaGFuZGxlLCBoYW5kbGVyLCBkYXRhLCBOVUxMKTsKK30KKwogQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2RhdGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zeGZuYW1lLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zeGZuYW1lLmMKaW5kZXggM2E0YmQzZi4uOGM2YzExYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmbmFtZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN4Zm5hbWUuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN4Zm9iai5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmb2JqLmMKaW5kZXggMGU2ZDc5ZS4uZGFlOTQwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmb2JqLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmb2JqLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9wc2FyZ3MuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNhcmdzLmMKaW5kZXggOTFhNWE2OS4uMzE0ZDMxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9wc2FyZ3MuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3BzYXJncy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9wc2xvb3AuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNsb29wLmMKaW5kZXggMDY1YjQ0YS4uNjQ2ZDFhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9wc2xvb3AuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3BzbG9vcC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9wc29iamVjdC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9wc29iamVjdC5jCmluZGV4IDk1ZGM2MDguLmFmMWY0NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNvYmplY3QuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3Bzb2JqZWN0LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3Bzb3Bjb2RlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3Bzb3Bjb2RlLmMKaW5kZXggMWI2NTllNTkuLjE3NTVkMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNvcGNvZGUuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3Bzb3Bjb2RlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3Bzb3BpbmZvLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3Bzb3BpbmZvLmMKaW5kZXggYjBjOTc4Ny4uMGQ4ZDM3ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNvcGluZm8uYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3Bzb3BpbmZvLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3BzcGFyc2UuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNwYXJzZS5jCmluZGV4IDc5ZDlhMjguLjZkMjdiNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNwYXJzZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNwYXJzZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9wc3Njb3BlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3Bzc2NvcGUuYwppbmRleCA2YTRiNmZiLi4zMmQyNTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3Bzc2NvcGUuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3Bzc2NvcGUuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN0cmVlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3BzdHJlZS5jCmluZGV4IDg3N2RjMGQuLjBiNjQxODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN0cmVlLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9wc3RyZWUuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN1dGlscy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9wc3V0aWxzLmMKaW5kZXggOTFmYTczYS4uM2NkNDg4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9wc3V0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9wc3V0aWxzLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3Bzd2Fsay5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9wc3dhbGsuYwppbmRleCBhYmQ2NTYyLi45Y2IwN2UxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3Bzd2Fsay5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN3YWxrLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3BzeGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN4ZmFjZS5jCmluZGV4IGZjYjdhODQuLmUxMzVhY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN4ZmFjZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9yc2FkZHIuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNhZGRyLmMKaW5kZXggZjNhOTI3Ni4uOTE2ZmQwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9yc2FkZHIuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzYWRkci5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNjYWxjLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzY2FsYy5jCmluZGV4IGI2MGM5Y2YuLjY4OTU1NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNjYWxjLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9yc2NhbGMuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC02MzYsNyArNjM2LDcgQEAKIAogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWJlcl9vZl9lbGVtZW50czsgaW5kZXgrKykgewogCi0JCS8qIERlcmVmZXJlbmNlIHRoZSBzdWItcGFja2FnZSAqLworCQkvKiBEZXJlZmVyZW5jZSB0aGUgc3VicGFja2FnZSAqLwogCiAJCXBhY2thZ2VfZWxlbWVudCA9ICp0b3Bfb2JqZWN0X2xpc3Q7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNjcmVhdGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNjcmVhdGUuYwppbmRleCAzYTJhY2U5Li43NWQzNjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzY3JlYXRlLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9yc2NyZWF0ZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTI3Myw3ICsyNzMsNyBAQAogCQkgKi8KIAkJdXNlcl9wcnQtPmxlbmd0aCA9IChzaXplb2Yoc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUpIC0gNCk7CiAKLQkJLyogRWFjaCBzdWItcGFja2FnZSBtdXN0IGJlIG9mIGxlbmd0aCA0ICovCisJCS8qIEVhY2ggc3VicGFja2FnZSBtdXN0IGJlIG9mIGxlbmd0aCA0ICovCiAKIAkJaWYgKCgqdG9wX29iamVjdF9saXN0KS0+cGFja2FnZS5jb3VudCAhPSA0KSB7CiAJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLApAQCAtMjgzLDcgKzI4Myw3IEBACiAJCX0KIAogCQkvKgotCQkgKiBEZXJlZmVyZW5jZSB0aGUgc3ViLXBhY2thZ2UuCisJCSAqIERlcmVmZXJlbmNlIHRoZSBzdWJwYWNrYWdlLgogCQkgKiBUaGUgc3ViX29iamVjdF9saXN0IHdpbGwgbm93IHBvaW50IHRvIGFuIGFycmF5IG9mIHRoZSBmb3VyIElSUQogCQkgKiBlbGVtZW50czogW0FkZHJlc3MsIFBpbiwgU291cmNlLCBzb3VyY2VfaW5kZXhdCiAJCSAqLwpAQCAtMjkyLDcgKzI5Miw3IEBACiAJCS8qIDEpIEZpcnN0IHN1Ym9iamVjdDogRGVyZWZlcmVuY2UgdGhlIFBSVC5BZGRyZXNzICovCiAKIAkJb2JqX2Rlc2MgPSBzdWJfb2JqZWN0X2xpc3RbMF07Ci0JCWlmIChvYmpfZGVzYy0+Y29tbW9uLnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwkJaWYgKCFvYmpfZGVzYyB8fCBvYmpfZGVzYy0+Y29tbW9uLnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKIAkJCUFDUElfRVJST1IoKEFFX0lORk8sCiAJCQkJICAgICIoUFJUWyV1XS5BZGRyZXNzKSBOZWVkIEludGVnZXIsIGZvdW5kICVzIiwKIAkJCQkgICAgaW5kZXgsCkBAIC0zMDUsNyArMzA1LDcgQEAKIAkJLyogMikgU2Vjb25kIHN1Ym9iamVjdDogRGVyZWZlcmVuY2UgdGhlIFBSVC5QaW4gKi8KIAogCQlvYmpfZGVzYyA9IHN1Yl9vYmplY3RfbGlzdFsxXTsKLQkJaWYgKG9ial9kZXNjLT5jb21tb24udHlwZSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgeworCQlpZiAoIW9ial9kZXNjIHx8IG9ial9kZXNjLT5jb21tb24udHlwZSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgewogCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKIAkJCQkgICAgIihQUlRbJXVdLlBpbikgTmVlZCBJbnRlZ2VyLCBmb3VuZCAlcyIsCiAJCQkJICAgIGluZGV4LApAQCAtMzk0LDcgKzM5NCw3IEBACiAJCS8qIDQpIEZvdXJ0aCBzdWJvYmplY3Q6IERlcmVmZXJlbmNlIHRoZSBQUlQuc291cmNlX2luZGV4ICovCiAKIAkJb2JqX2Rlc2MgPSBzdWJfb2JqZWN0X2xpc3RbM107Ci0JCWlmIChvYmpfZGVzYy0+Y29tbW9uLnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwkJaWYgKCFvYmpfZGVzYyB8fCBvYmpfZGVzYy0+Y29tbW9uLnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKIAkJCUFDUElfRVJST1IoKEFFX0lORk8sCiAJCQkJICAgICIoUFJUWyV1XS5Tb3VyY2VJbmRleCkgTmVlZCBJbnRlZ2VyLCBmb3VuZCAlcyIsCiAJCQkJICAgIGluZGV4LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9yc2R1bXAuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNkdW1wLmMKaW5kZXggOGEyZDQ5OC4uYzNjNTZiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9yc2R1bXAuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzZHVtcC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQ3LDcgKzQ3LDggQEAKIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCiBBQ1BJX01PRFVMRV9OQU1FKCJyc2R1bXAiKQotI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKKworI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ESVNBU1NFTUJMRVIpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KIHN0YXRpYyB2b2lkIGFjcGlfcnNfb3V0X3N0cmluZyhjaGFyICp0aXRsZSwgY2hhciAqdmFsdWUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzZHVtcGluZm8uYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNkdW1waW5mby5jCmluZGV4IDQ2MTkyYmQuLjJmOTMzMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNkdW1waW5mby5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNkdW1waW5mby5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQ4LDcgKzQ4LDcgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUwogQUNQSV9NT0RVTEVfTkFNRSgicnNkdW1waW5mbyIpCiAKLSNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpCisjaWYgZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RJU0FTU0VNQkxFUikgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKQogI2RlZmluZSBBQ1BJX1JTRF9PRkZTRVQoZikgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhLGYpCiAjZGVmaW5lIEFDUElfUFJUX09GRlNFVChmKSAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSxmKQogI2RlZmluZSBBQ1BJX1JTRF9UQUJMRV9TSVpFKG5hbWUpICAgKHNpemVvZihuYW1lKSAvIHNpemVvZiAoc3RydWN0IGFjcGlfcnNkdW1wX2luZm8pKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9yc2luZm8uYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNpbmZvLmMKaW5kZXggNDFmZWQ3OC4uOWQzZjhhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9yc2luZm8uYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzaW5mby5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTEzMiw4ICsxMzIsNyBAQAogCWFjcGlfcnNfY29udmVydF91YXJ0X3NlcmlhbF9idXMsCiB9OwogCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLSNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpCisjaWYgZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RJU0FTU0VNQkxFUikgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKQogCiAvKiBEaXNwYXRjaCB0YWJsZSBmb3IgcmVzb3VyY2UgZHVtcCBmdW5jdGlvbnMgKi8KIApAQCAtMTY4LDcgKzE2Nyw2IEBACiB9OwogI2VuZGlmCiAKLSNlbmRpZgkJCQkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogLyoKICAqIEJhc2Ugc2l6ZXMgZm9yIGV4dGVybmFsIEFNTCByZXNvdXJjZSBkZXNjcmlwdG9ycywgaW5kZXhlZCBieSBpbnRlcm5hbCB0eXBlLgogICogSW5jbHVkZXMgc2l6ZSBvZiB0aGUgZGVzY3JpcHRvciBoZWFkZXIgKDEgYnl0ZSBmb3Igc21hbGwgZGVzY3JpcHRvcnMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzaW8uYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNpby5jCmluZGV4IGNhMTgzNzUuLjE5ZDY0ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNpby5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNpby5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNpcnEuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNpcnEuYwppbmRleCAzNjRkZWNjLi4zNDYxZjdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzaXJxLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9yc2lycS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNsaXN0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzbGlzdC5jCmluZGV4IDYwNTNhYTEuLjc3MjkxMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNsaXN0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9yc2xpc3QuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzbWVtb3J5LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzbWVtb3J5LmMKaW5kZXggZWJjNzczYS4uZWFiNDQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9yc21lbW9yeS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNtZW1vcnkuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzbWlzYy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9yc21pc2MuYwppbmRleCBjOTljZWM5Li40MWVlYTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzbWlzYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNtaXNjLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9yc3NlcmlhbC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9yc3NlcmlhbC5jCmluZGV4IGZlNDlmYzQuLjllODQwNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNzZXJpYWwuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3Jzc2VyaWFsLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9yc3V0aWxzLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzdXRpbHMuYwppbmRleCAxNGE3OTgyLi44OTdhNWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzdXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzdXRpbHMuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzeGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnN4ZmFjZS5jCmluZGV4IDAxZTQ3NjkuLjg3N2FiOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnN4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnN4ZmFjZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJmYWR0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiZmFkdC5jCmluZGV4IDhmODkyNjMuLmVjMTQ1ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJmYWR0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS90YmZhZHQuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJmaW5kLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiZmluZC5jCmluZGV4IGU0ZjRmMDIuLmMxMjAwMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJmaW5kLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS90YmZpbmQuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJpbnN0YWwuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJpbnN0YWwuYwppbmRleCA2MzQzNTdkLi5lMzA0MDk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiaW5zdGFsLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS90Ymluc3RhbC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMjkyLDEwICsyOTIsMTEgQEAKIAkJbmV3X3RhYmxlID0gYWNwaV9vc19tYXBfbWVtb3J5KG5ld19hZGRyZXNzLCBuZXdfdGFibGVfbGVuZ3RoKTsKIAkJaWYgKCFuZXdfdGFibGUpIHsKIAkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9OT19NRU1PUlksCi0JCQkJCSIlNC40cyAlcCBBdHRlbXB0ZWQgcGh5c2ljYWwgdGFibGUgb3ZlcnJpZGUgZmFpbGVkIiwKKwkJCQkJIiU0LjRzICIgQUNQSV9QUklOVEZfVUlOVAorCQkJCQkiIEF0dGVtcHRlZCBwaHlzaWNhbCB0YWJsZSBvdmVycmlkZSBmYWlsZWQiLAogCQkJCQl0YWJsZV9oZWFkZXItPnNpZ25hdHVyZSwKLQkJCQkJQUNQSV9DQVNUX1BUUih2b2lkLAotCQkJCQkJICAgICAgdGFibGVfZGVzYy0+YWRkcmVzcykpKTsKKwkJCQkJQUNQSV9GT1JNQVRfVE9fVUlOVCh0YWJsZV9kZXNjLT4KKwkJCQkJCQkgICAgYWRkcmVzcykpKTsKIAkJCXJldHVybiAoTlVMTCk7CiAJCX0KIApAQCAtMzA4LDExICszMDksMTEgQEAKIAogZmluaXNoX292ZXJyaWRlOgogCi0JQUNQSV9JTkZPKChBRV9JTkZPLAotCQkgICAiJTQuNHMgJXAgJXMgdGFibGUgb3ZlcnJpZGUsIG5ldyB0YWJsZTogJXAiLAorCUFDUElfSU5GTygoQUVfSU5GTywgIiU0LjRzICIgQUNQSV9QUklOVEZfVUlOVAorCQkgICAiICVzIHRhYmxlIG92ZXJyaWRlLCBuZXcgdGFibGU6ICIgQUNQSV9QUklOVEZfVUlOVCwKIAkJICAgdGFibGVfaGVhZGVyLT5zaWduYXR1cmUsCi0JCSAgIEFDUElfQ0FTVF9QVFIodm9pZCwgdGFibGVfZGVzYy0+YWRkcmVzcyksCi0JCSAgIG92ZXJyaWRlX3R5cGUsIG5ld190YWJsZSkpOworCQkgICBBQ1BJX0ZPUk1BVF9UT19VSU5UKHRhYmxlX2Rlc2MtPmFkZHJlc3MpLAorCQkgICBvdmVycmlkZV90eXBlLCBBQ1BJX0ZPUk1BVF9UT19VSU5UKG5ld190YWJsZSkpKTsKIAogCS8qIFdlIGNhbiBub3cgdW5tYXAvZGVsZXRlIHRoZSBvcmlnaW5hbCB0YWJsZSAoaWYgZnVsbHkgbWFwcGVkKSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3RicHJpbnQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJwcmludC5jCmluZGV4IDY4NjZlNzYuLmRmM2JiMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJwcmludC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJwcmludC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMTI4LDE1ICsxMjgsMTcgQEAKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgbG9jYWxfaGVhZGVyOwogCiAJLyoKLQkgKiBUaGUgcmVhc29uIHRoYXQgdGhlIEFkZHJlc3MgaXMgY2FzdCB0byBhIHZvaWQgcG9pbnRlciBpcyBzbyB0aGF0IHdlCi0JICogY2FuIHVzZSAlcCB3aGljaCB3aWxsIHdvcmsgcHJvcGVybHkgb24gYm90aCAzMi1iaXQgYW5kIDY0LWJpdCBob3N0cy4KKwkgKiBUaGUgcmVhc29uIHRoYXQgd2UgdXNlIEFDUElfUFJJTlRGX1VJTlQgYW5kIEFDUElfRk9STUFUX1RPX1VJTlQgaXMgdG8KKwkgKiBzdXBwb3J0IGJvdGggMzItYml0IGFuZCA2NC1iaXQgaG9zdHMvYWRkcmVzc2VzIGluIGEgY29uc2lzdGVudCBtYW5uZXIuCisJICogVGhlICVwIHNwZWNpZmllciBkb2VzIG5vdCBlbWl0IHVuaWZvcm0gb3V0cHV0IG9uIGFsbCBob3N0cy4gT24gc29tZSwKKwkgKiBsZWFkaW5nIHplcm9zIGFyZSBub3Qgc3VwcG9ydGVkLgogCSAqLwogCWlmIChBQ1BJX0NPTVBBUkVfTkFNRShoZWFkZXItPnNpZ25hdHVyZSwgQUNQSV9TSUdfRkFDUykpIHsKIAogCQkvKiBGQUNTIG9ubHkgaGFzIHNpZ25hdHVyZSBhbmQgbGVuZ3RoIGZpZWxkcyAqLwogCi0JCUFDUElfSU5GTygoQUVfSU5GTywgIiU0LjRzICVwICUwNlgiLAotCQkJICAgaGVhZGVyLT5zaWduYXR1cmUsIEFDUElfQ0FTVF9QVFIodm9pZCwgYWRkcmVzcyksCisJCUFDUElfSU5GTygoQUVfSU5GTywgIiUtNC40cyAiIEFDUElfUFJJTlRGX1VJTlQgIiAlMDZYIiwKKwkJCSAgIGhlYWRlci0+c2lnbmF0dXJlLCBBQ1BJX0ZPUk1BVF9UT19VSU5UKGFkZHJlc3MpLAogCQkJICAgaGVhZGVyLT5sZW5ndGgpKTsKIAl9IGVsc2UgaWYgKEFDUElfVkFMSURBVEVfUlNEUF9TSUcoaGVhZGVyLT5zaWduYXR1cmUpKSB7CiAKQEAgLTE0Nyw4ICsxNDksOSBAQAogCQkJCQkgIGhlYWRlciktPm9lbV9pZCwgQUNQSV9PRU1fSURfU0laRSk7CiAJCWFjcGlfdGJfZml4X3N0cmluZyhsb2NhbF9oZWFkZXIub2VtX2lkLCBBQ1BJX09FTV9JRF9TSVpFKTsKIAotCQlBQ1BJX0lORk8oKEFFX0lORk8sICJSU0RQICVwICUwNlggKHYlLjJkICU2LjZzKSIsCi0JCQkgICBBQ1BJX0NBU1RfUFRSKHZvaWQsIGFkZHJlc3MpLAorCQlBQ1BJX0lORk8oKEFFX0lORk8sCisJCQkgICAiUlNEUCAiIEFDUElfUFJJTlRGX1VJTlQgIiAlMDZYICh2JS4yZCAlLTYuNnMpIiwKKwkJCSAgIEFDUElfRk9STUFUX1RPX1VJTlQoYWRkcmVzcyksCiAJCQkgICAoQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwLCBoZWFkZXIpLT4KIAkJCSAgICByZXZpc2lvbiA+CiAJCQkgICAgMCkgPyBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3RhYmxlX3JzZHAsCkBAIC0xNjIsOCArMTY1LDkgQEAKIAkJYWNwaV90Yl9jbGVhbnVwX3RhYmxlX2hlYWRlcigmbG9jYWxfaGVhZGVyLCBoZWFkZXIpOwogCiAJCUFDUElfSU5GTygoQUVfSU5GTywKLQkJCSAgICIlNC40cyAlcCAlMDZYICh2JS4yZCAlNi42cyAlOC44cyAlMDhYICU0LjRzICUwOFgpIiwKLQkJCSAgIGxvY2FsX2hlYWRlci5zaWduYXR1cmUsIEFDUElfQ0FTVF9QVFIodm9pZCwgYWRkcmVzcyksCisJCQkgICAiJS00LjRzICIgQUNQSV9QUklOVEZfVUlOVAorCQkJICAgIiAlMDZYICh2JS4yZCAlLTYuNnMgJS04LjhzICUwOFggJS00LjRzICUwOFgpIiwKKwkJCSAgIGxvY2FsX2hlYWRlci5zaWduYXR1cmUsIEFDUElfRk9STUFUX1RPX1VJTlQoYWRkcmVzcyksCiAJCQkgICBsb2NhbF9oZWFkZXIubGVuZ3RoLCBsb2NhbF9oZWFkZXIucmV2aXNpb24sCiAJCQkgICBsb2NhbF9oZWFkZXIub2VtX2lkLCBsb2NhbF9oZWFkZXIub2VtX3RhYmxlX2lkLAogCQkJICAgbG9jYWxfaGVhZGVyLm9lbV9yZXZpc2lvbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJ1dGlscy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS90YnV0aWxzLmMKaW5kZXggNjQxMmQzYy4uYTQ3MDJlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS90YnV0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS90YnV0aWxzLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJ4ZmFjZS5jCmluZGV4IGRiODI2ZWEuLmExNTkzMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJ4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJ4ZmFjZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90YnhmbG9hZC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS90YnhmbG9hZC5jCmluZGV4IDYwYjVhODcuLjA5MDk0MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJ4ZmxvYWQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZsb2FkLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZyb290LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZyb290LmMKaW5kZXggZTRlMTQ2OC4uNjVhYjhmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS90Ynhmcm9vdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJ4ZnJvb3QuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRhZGRyZXNzLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0YWRkcmVzcy5jCmluZGV4IDJjMmI2YWUuLmExYWNlYzlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0YWRkcmVzcy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRhZGRyZXNzLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0YWxsb2MuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRhbGxvYy5jCmluZGV4IDE4NTE3NjIuLmVmYWM4M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRhbGxvYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRhbGxvYy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGJ1ZmZlci5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGJ1ZmZlci5jCmluZGV4IDExZmRlOTMuLjNjMTY5OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRidWZmZXIuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0YnVmZmVyLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0Y2FjaGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRjYWNoZS5jCmluZGV4IGNhY2QyZmQuLjc4ZmRlMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRjYWNoZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRjYWNoZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGNvcHkuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRjb3B5LmMKaW5kZXggZWRmZjRlNi4uMjcwYzE2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGNvcHkuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0Y29weS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNTM1LDEwICs1MzUsMTAgQEAKIAogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKIAotCQkvKiBUQkQ6IHNob3VsZCB2YWxpZGF0ZSBpbmNvbWluZyBoYW5kbGUgKi8KKwkJLyogQW4gaW5jb21pbmcgcmVmZXJlbmNlIGlzIGRlZmluZWQgdG8gYmUgYSBuYW1lc3BhY2Ugbm9kZSAqLwogCi0JCWludGVybmFsX29iamVjdC0+cmVmZXJlbmNlLmNsYXNzID0gQUNQSV9SRUZDTEFTU19OQU1FOwotCQlpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5ub2RlID0KKwkJaW50ZXJuYWxfb2JqZWN0LT5yZWZlcmVuY2UuY2xhc3MgPSBBQ1BJX1JFRkNMQVNTX1JFRk9GOworCQlpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5vYmplY3QgPQogCQkgICAgZXh0ZXJuYWxfb2JqZWN0LT5yZWZlcmVuY2UuaGFuZGxlOwogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGRlYnVnLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVidWcuYwppbmRleCBkOTcxYzg2Li4yMWEyMGFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVidWcuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVidWcuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRkZWNvZGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRkZWNvZGUuYwppbmRleCBiM2YzMWRkLi5mYmZhOWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVjb2RlLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGRlY29kZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGRlbGV0ZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGRlbGV0ZS5jCmluZGV4IGMwN2QyMjIuLmEzNTE2ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRkZWxldGUuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVsZXRlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNzUsNiArNzUsNyBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmhhbmRsZXJfZGVzYzsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzZWNvbmRfZGVzYzsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXh0X2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc3RhcnRfZGVzYzsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqbGFzdF9vYmpfcHRyOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIodXRfZGVsZXRlX2ludGVybmFsX29iaiwgb2JqZWN0KTsKQEAgLTIzNSwxMCArMjM2LDExIEBACiAJCQlpZiAoaGFuZGxlcl9kZXNjKSB7CiAJCQkJbmV4dF9kZXNjID0KIAkJCQkgICAgaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLnJlZ2lvbl9saXN0OworCQkJCXN0YXJ0X2Rlc2MgPSBuZXh0X2Rlc2M7CiAJCQkJbGFzdF9vYmpfcHRyID0KIAkJCQkgICAgJmhhbmRsZXJfZGVzYy0+YWRkcmVzc19zcGFjZS5yZWdpb25fbGlzdDsKIAotCQkJCS8qIFJlbW92ZSB0aGUgcmVnaW9uIG9iamVjdCBmcm9tIHRoZSBoYW5kbGVyJ3MgbGlzdCAqLworCQkJCS8qIFJlbW92ZSB0aGUgcmVnaW9uIG9iamVjdCBmcm9tIHRoZSBoYW5kbGVyIGxpc3QgKi8KIAogCQkJCXdoaWxlIChuZXh0X2Rlc2MpIHsKIAkJCQkJaWYgKG5leHRfZGVzYyA9PSBvYmplY3QpIHsKQEAgLTI0NywxMCArMjQ5LDE5IEBACiAJCQkJCQlicmVhazsKIAkJCQkJfQogCi0JCQkJCS8qIFdhbGsgdGhlIGxpbmtlZCBsaXN0IG9mIGhhbmRsZXIgKi8KKwkJCQkJLyogV2FsayB0aGUgbGlua2VkIGxpc3Qgb2YgaGFuZGxlcnMgKi8KIAogCQkJCQlsYXN0X29ial9wdHIgPSAmbmV4dF9kZXNjLT5yZWdpb24ubmV4dDsKIAkJCQkJbmV4dF9kZXNjID0gbmV4dF9kZXNjLT5yZWdpb24ubmV4dDsKKworCQkJCQkvKiBQcmV2ZW50IGluZmluaXRlIGxvb3AgaWYgbGlzdCBpcyBjb3JydXB0ZWQgKi8KKworCQkJCQlpZiAobmV4dF9kZXNjID09IHN0YXJ0X2Rlc2MpIHsKKwkJCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJCQkJICAgICJDaXJjdWxhciByZWdpb24gbGlzdCBpbiBhZGRyZXNzIGhhbmRsZXIgb2JqZWN0ICVwIiwKKwkJCQkJCQkgICAgaGFuZGxlcl9kZXNjKSk7CisJCQkJCQlyZXR1cm5fVk9JRDsKKwkJCQkJfQogCQkJCX0KIAogCQkJCWlmIChoYW5kbGVyX2Rlc2MtPmFkZHJlc3Nfc3BhY2UuaGFuZGxlcl9mbGFncyAmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZXJyb3IuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRlcnJvci5jCmluZGV4IDE1NGZkY2EuLjhlNTQ0ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRlcnJvci5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRlcnJvci5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRldmFsLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZXZhbC5jCmluZGV4IDE2ZmI5MDUuLjhmZWQxNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRldmFsLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGV2YWwuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRleGNlcC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGV4Y2VwLmMKaW5kZXggM2NmN2I1OS4uMDQwM2RjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGV4Y2VwLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGV4Y2VwLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGdsb2JhbC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGdsb2JhbC5jCmluZGV4IDAzMGNiMGQuLmYzYWJlYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRnbG9iYWwuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0Z2xvYmFsLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC01NSwzMSArNTUsMjcgQEAKICAqIFN0YXRpYyBnbG9iYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24uCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBXZSB3YW50IHRoZSBkZWJ1ZyBzd2l0Y2hlcyBzdGF0aWNhbGx5IGluaXRpYWxpemVkIHNvIHRoZXkKLSAqIGFyZSBhbHJlYWR5IHNldCB3aGVuIHRoZSBkZWJ1Z2dlciBpcyBlbnRlcmVkLgotICovCi0vKiBEZWJ1ZyBzd2l0Y2ggLSBsZXZlbCBhbmQgdHJhY2UgbWFzayAqLworLyogRGVidWcgb3V0cHV0IGNvbnRyb2wgbWFza3MgKi8KIHUzMiBhY3BpX2RiZ19sZXZlbCA9IEFDUElfREVCVUdfREVGQVVMVDsKIAotLyogRGVidWcgc3dpdGNoIC0gbGF5ZXIgKGNvbXBvbmVudCkgbWFzayAqLwotCiB1MzIgYWNwaV9kYmdfbGF5ZXIgPSAwOwotdTMyIGFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwgPSAwOwogCi0vKiBEZWJ1Z2dlciBnbG9iYWxzICovCisvKiBhY3BpX2dibF9GQURUIGlzIGEgbG9jYWwgY29weSBvZiB0aGUgRkFEVCwgY29udmVydGVkIHRvIGEgY29tbW9uIGZvcm1hdC4gKi8KIAotdTggYWNwaV9nYmxfZGJfdGVybWluYXRlX3RocmVhZHMgPSBGQUxTRTsKLXU4IGFjcGlfZ2JsX2Fib3J0X21ldGhvZCA9IEZBTFNFOwotdTggYWNwaV9nYmxfbWV0aG9kX2V4ZWN1dGluZyA9IEZBTFNFOworc3RydWN0IGFjcGlfdGFibGVfZmFkdCBhY3BpX2dibF9GQURUOwordTMyIGFjcGlfZ2JsX3RyYWNlX2ZsYWdzOworYWNwaV9uYW1lIGFjcGlfZ2JsX3RyYWNlX21ldGhvZF9uYW1lOwordTggYWNwaV9nYmxfc3lzdGVtX2F3YWtlX2FuZF9ydW5uaW5nOwordTMyIGFjcGlfY3VycmVudF9ncGVfY291bnQ7CiAKLS8qIFN5c3RlbSBmbGFncyAqLworLyoKKyAqIEFDUEkgNS4wIGludHJvZHVjZXMgdGhlIGNvbmNlcHQgb2YgYSAicmVkdWNlZCBoYXJkd2FyZSBwbGF0Zm9ybSIsIG1lYW5pbmcKKyAqIHRoYXQgdGhlIEFDUEkgaGFyZHdhcmUgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLiBBIGZsYWcgaW4gdGhlIEZBRFQgaW5kaWNhdGVzCisgKiBhIHJlZHVjZWQgSFcgbWFjaGluZSwgYW5kIHRoYXQgZmxhZyBpcyBkdXBsaWNhdGVkIGhlcmUgZm9yIGNvbnZlbmllbmNlLgorICovCit1OCBhY3BpX2dibF9yZWR1Y2VkX2hhcmR3YXJlOwogCi11MzIgYWNwaV9nYmxfc3RhcnR1cF9mbGFncyA9IDA7Ci0KLS8qIFN5c3RlbSBzdGFydHMgdW5pbml0aWFsaXplZCAqLwotCi11OCBhY3BpX2dibF9zaHV0ZG93biA9IFRSVUU7CisvKiBWYXJpb3VzIHN0YXRlIG5hbWUgc3RyaW5ncyAqLwogCiBjb25zdCBjaGFyICphY3BpX2dibF9zbGVlcF9zdGF0ZV9uYW1lc1tBQ1BJX1NfU1RBVEVfQ09VTlRdID0gewogCSJcXF9TMF8iLApAQCAtMzM1LDcgKzMzMSw2IEBACiAKIAlhY3BpX2dibF9EU0RUID0gTlVMTDsKIAlhY3BpX2dibF9jbV9zaW5nbGVfc3RlcCA9IEZBTFNFOwotCWFjcGlfZ2JsX2RiX3Rlcm1pbmF0ZV90aHJlYWRzID0gRkFMU0U7CiAJYWNwaV9nYmxfc2h1dGRvd24gPSBGQUxTRTsKIAlhY3BpX2dibF9uc19sb29rdXBfY291bnQgPSAwOwogCWFjcGlfZ2JsX3BzX2ZpbmRfY291bnQgPSAwOwpAQCAtMzgyLDYgKzM3NywxMCBAQAogCWFjcGlfZ2JsX2Rpc2FibGVfbWVtX3RyYWNraW5nID0gRkFMU0U7CiAjZW5kaWYKIAorI2lmZGVmIEFDUElfREVCVUdHRVIKKwlhY3BpX2dibF9kYl90ZXJtaW5hdGVfdGhyZWFkcyA9IEZBTFNFOworI2VuZGlmCisKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0aWRzLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0aWRzLmMKaW5kZXggYmZjYTdiNC4uNGIxMjg4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGlkcy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRpZHMuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRpbml0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0aW5pdC5jCmluZGV4IGM1ZDFhYzQuLjVmNTZmYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRpbml0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGluaXQuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRsb2NrLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0bG9jay5jCmluZGV4IDVjMjZhZDQuLmRjNmU5NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRsb2NrLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGxvY2suYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRtYXRoLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0bWF0aC5jCmluZGV4IDkwOWZlNjYuLmQ0NGRlZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRtYXRoLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dG1hdGguYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0bWlzYy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dG1pc2MuYwppbmRleCAwMmY5MTAxLi4yZTJiYjE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0bWlzYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRtaXNjLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dG11dGV4LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0bXV0ZXguYwppbmRleCAwOGMzMjMyLi44MjcxN2ZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0bXV0ZXguYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0bXV0ZXguYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0b2JqZWN0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0b2JqZWN0LmMKaW5kZXggNTE3YWY3MC4uZGZhOTAwOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRvYmplY3QuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0b2JqZWN0LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0b3NpLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0b3NpLmMKaW5kZXggODg1NmJkMy4uNjg1NzY2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dG9zaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRvc2kuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQ3LDYgKzQ3LDMxIEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKIEFDUElfTU9EVUxFX05BTUUoInV0b3NpIikKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEFDUElDQSBwb2xpY3kgZm9yIG5ldyBfT1NJIHN0cmluZ3M6CisgKgorICogSXQgaXMgdGhlIHN0YXRlZCBwb2xpY3kgb2YgQUNQSUNBIHRoYXQgbmV3IF9PU0kgc3RyaW5ncyB3aWxsIGJlIGludGVncmF0ZWQKKyAqIGludG8gdGhpcyBtb2R1bGUgYXMgc29vbiBhcyBwb3NzaWJsZSBhZnRlciB0aGV5IGFyZSBkZWZpbmVkLiBJdCBpcyBzdHJvbmdseQorICogcmVjb21tZW5kZWQgdGhhdCBhbGwgQUNQSUNBIGhvc3RzIG1pcnJvciB0aGlzIHBvbGljeSBhbmQgaW50ZWdyYXRlIGFueQorICogY2hhbmdlcyB0byB0aGlzIG1vZHVsZSBhcyBzb29uIGFzIHBvc3NpYmxlLiBUaGVyZSBhcmUgc2V2ZXJhbCBoaXN0b3JpY2FsCisgKiByZWFzb25zIGJlaGluZCB0aGlzIHBvbGljeToKKyAqCisgKiAxKSBOZXcgQklPU3MgdGVuZCB0byB0ZXN0IG9ubHkgdGhlIGNhc2Ugd2hlcmUgdGhlIGhvc3QgcmVzcG9uZHMgVFJVRSB0bworICogICAgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFdpbmRvd3MsIHdoaWNoIHdvdWxkIHJlc3BvbmQgdG8gdGhlIGxhdGVzdC9uZXdlc3QKKyAqICAgIF9PU0kgc3RyaW5nLiBOb3QgcmVzcG9uZGluZyBUUlVFIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBXaW5kb3dzIHdpbGwKKyAqICAgIHJpc2sgZXhlY3V0aW5nIHVudGVzdGVkIGNvZGUgcGF0aHMgdGhyb3VnaG91dCB0aGUgRFNEVCBhbmQgU1NEVHMuCisgKgorICogMikgSWYgYSBuZXcgX09TSSBzdHJpbmcgaXMgcmVjb2duaXplZCBvbmx5IGFmdGVyIGEgc2lnbmlmaWNhbnQgZGVsYXksIHRoaXMKKyAqICAgIGhhcyB0aGUgcG90ZW50aWFsIHRvIGNhdXNlIHByb2JsZW1zIG9uIGV4aXN0aW5nIHdvcmtpbmcgbWFjaGluZXMgYmVjYXVzZQorICogICAgb2YgdGhlIHBvc3NpYmlsaXR5IHRoYXQgYSBuZXcgYW5kIGRpZmZlcmVudCBwYXRoIHRocm91Z2ggdGhlIEFTTCBjb2RlCisgKiAgICB3aWxsIGJlIGV4ZWN1dGVkLgorICoKKyAqIDMpIE5ldyBfT1NJIHN0cmluZ3MgYXJlIHRlbmRpbmcgdG8gY29tZSBvdXQgYWJvdXQgb25jZSBwZXIgeWVhci4gQSBkZWxheQorICogICAgaW4gcmVjb2duaXppbmcgYSBuZXcgc3RyaW5nIGZvciBhIHNpZ25pZmljYW50IGFtb3VudCBvZiB0aW1lIHJpc2tzIHRoZQorICogICAgcmVsZWFzZSBvZiBhbm90aGVyIHN0cmluZyB3aGljaCBvbmx5IGNvbXBvdW5kcyB0aGUgaW5pdGlhbCBwcm9ibGVtLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBTdHJpbmdzIHN1cHBvcnRlZCBieSB0aGUgX09TSSBwcmVkZWZpbmVkIGNvbnRyb2wgbWV0aG9kICh3aGljaCBpcwogICogaW1wbGVtZW50ZWQgaW50ZXJuYWxseSB3aXRoaW4gdGhpcyBtb2R1bGUuKQpAQCAtNzQsNiArOTksNyBAQAogCXsiV2luZG93cyAyMDA2IFNQMiIsIE5VTEwsIDAsIEFDUElfT1NJX1dJTl9WSVNUQV9TUDJ9LAkvKiBXaW5kb3dzIFZpc3RhIFNQMiAtIEFkZGVkIDA5LzIwMTAgKi8KIAl7IldpbmRvd3MgMjAwOSIsIE5VTEwsIDAsIEFDUElfT1NJX1dJTl83fSwJLyogV2luZG93cyA3IGFuZCBTZXJ2ZXIgMjAwOCBSMiAtIEFkZGVkIDA5LzIwMDkgKi8KIAl7IldpbmRvd3MgMjAxMiIsIE5VTEwsIDAsIEFDUElfT1NJX1dJTl84fSwJLyogV2luZG93cyA4IGFuZCBTZXJ2ZXIgMjAxMiAtIEFkZGVkIDA4LzIwMTIgKi8KKwl7IldpbmRvd3MgMjAxMyIsIE5VTEwsIDAsIEFDUElfT1NJX1dJTl84fSwJLyogV2luZG93cyA4LjEgYW5kIFNlcnZlciAyMDEyIFIyIC0gQWRkZWQgMDEvMjAxNCAqLwogCiAJLyogRmVhdHVyZSBHcm91cCBTdHJpbmdzICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRvd25lcmlkLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0b3duZXJpZC5jCmluZGV4IGViM2FjYTcuLjM2YmVjNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRvd25lcmlkLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dG93bmVyaWQuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0cHJlZGVmLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0cHJlZGVmLmMKaW5kZXggMmIxY2U0Yy4uZGIzMGNhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dHByZWRlZi5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRwcmVkZWYuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRyZXNyYy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHJlc3JjLmMKaW5kZXggMmMyYWNjYi4uMTRjYjZjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dHJlc3JjLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHJlc3JjLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDcsNyArNDcsOCBAQAogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKIEFDUElfTU9EVUxFX05BTUUoInV0cmVzcmMiKQotI2lmIGRlZmluZWQoQUNQSV9ESVNBU1NFTUJMRVIpIHx8IGRlZmluZWQgKEFDUElfREVCVUdHRVIpCisKKyNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkIChBQ1BJX0RJU0FTU0VNQkxFUikgfHwgZGVmaW5lZCAoQUNQSV9ERUJVR0dFUikKIC8qCiAgKiBTdHJpbmdzIHVzZWQgdG8gZGVjb2RlIHJlc291cmNlIGRlc2NyaXB0b3JzLgogICogVXNlZCBieSBib3RoIHRoZSBkaXNhc3NlbWJsZXIgYW5kIHRoZSBkZWJ1Z2dlciByZXNvdXJjZSBkdW1wIHJvdXRpbmVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0c3RhdGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRzdGF0ZS5jCmluZGV4IDAzYzRjMmYuLjFjYzk3YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRzdGF0ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRzdGF0ZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRzdHJpbmcuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRzdHJpbmcuYwppbmRleCA0NWMwZWIyLi43NzIxOTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0c3RyaW5nLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHN0cmluZy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR0cmFjay5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHRyYWNrLmMKaW5kZXggYzAwMjc3Ny4uN2QwZWU5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dHRyYWNrLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHRyYWNrLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0yNzYsNyArMjc2LDggQEAKIAl9CiAKIAlhY3BpX29zX2ZyZWUoZGVidWdfYmxvY2spOwotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsICIlcCBmcmVlZFxuIiwgYWxsb2NhdGlvbikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsICIlcCBmcmVlZCAoYmxvY2sgJXApXG4iLAorCQkJICBhbGxvY2F0aW9uLCBkZWJ1Z19ibG9jaykpOwogCXJldHVybl9WT0lEOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0eGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmFjZS5jCmluZGV4IGJlMzIyYzguLjUwMmE4NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmFjZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dHhmZXJyb3IuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmVycm9yLmMKaW5kZXggZjdlZGI4OC4uZWRkODYxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dHhmZXJyb3IuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0eGZlcnJvci5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmluaXQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmluaXQuYwppbmRleCAyNDZlZjY4Li4xMzM4MGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0eGZpbml0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHhmaW5pdC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dHhmbXV0ZXguYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4Zm11dGV4LmMKaW5kZXggMzEyMjk5Ny4uMmEwZjllMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dHhmbXV0ZXguYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0eGZtdXRleC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcGVpL0tjb25maWcgYi9kcml2ZXJzL2FjcGkvYXBlaS9LY29uZmlnCmluZGV4IDM2NTBiMjEuLmM0ZGFjNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hcGVpL0tjb25maWcKKysrIGIvZHJpdmVycy9hY3BpL2FwZWkvS2NvbmZpZwpAQCAtMTIsNyArMTIsNyBAQAogCiBjb25maWcgQUNQSV9BUEVJX0dIRVMKIAlib29sICJBUEVJIEdlbmVyaWMgSGFyZHdhcmUgRXJyb3IgU291cmNlIgotCWRlcGVuZHMgb24gQUNQSV9BUEVJICYmIFg4NgorCWRlcGVuZHMgb24gQUNQSV9BUEVJCiAJc2VsZWN0IEFDUElfSEVECiAJc2VsZWN0IElSUV9XT1JLCiAJc2VsZWN0IEdFTkVSSUNfQUxMT0NBVE9SCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jIGIvZHJpdmVycy9hY3BpL2JhdHRlcnkuYwppbmRleCA3OTdhNjkzLi45YTJjNjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKQEAgLTM5LDE1ICszOSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KIAorI2luY2x1ZGUgImJhdHRlcnkuaCIKKwogI2RlZmluZSBQUkVGSVggIkFDUEk6ICIKIAogI2RlZmluZSBBQ1BJX0JBVFRFUllfVkFMVUVfVU5LTk9XTiAweEZGRkZGRkZGCiAKLSNkZWZpbmUgQUNQSV9CQVRURVJZX0NMQVNTCQkiYmF0dGVyeSIKICNkZWZpbmUgQUNQSV9CQVRURVJZX0RFVklDRV9OQU1FCSJCYXR0ZXJ5IgotI2RlZmluZSBBQ1BJX0JBVFRFUllfTk9USUZZX1NUQVRVUwkweDgwCi0jZGVmaW5lIEFDUElfQkFUVEVSWV9OT1RJRllfSU5GTwkweDgxCi0jZGVmaW5lIEFDUElfQkFUVEVSWV9OT1RJRllfVEhSRVNIT0xEICAgMHg4MgogCiAvKiBCYXR0ZXJ5IHBvd2VyIHVuaXQ6IDAgbWVhbnMgbVcsIDEgbWVhbnMgbUEgKi8KICNkZWZpbmUgQUNQSV9CQVRURVJZX1BPV0VSX1VOSVRfTUEJMQpAQCAtNzM2LDYgKzczNCw3IEBACiAJYWNwaV9idXNfZ2VuZXJhdGVfbmV0bGlua19ldmVudChkZXZpY2UtPnBucC5kZXZpY2VfY2xhc3MsCiAJCQkJCWRldl9uYW1lKCZkZXZpY2UtPmRldiksIGV2ZW50LAogCQkJCQlhY3BpX2JhdHRlcnlfcHJlc2VudChiYXR0ZXJ5KSk7CisJYWNwaV9ub3RpZmllcl9jYWxsX2NoYWluKGRldmljZSwgZXZlbnQsIGFjcGlfYmF0dGVyeV9wcmVzZW50KGJhdHRlcnkpKTsKIAkvKiBhY3BpX2JhdHRlcnlfdXBkYXRlIGNvdWxkIHJlbW92ZSBwb3dlcl9zdXBwbHkgb2JqZWN0ICovCiAJaWYgKG9sZCAmJiBiYXR0ZXJ5LT5iYXQuZGV2KQogCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmYmF0dGVyeS0+YmF0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmggYi9kcml2ZXJzL2FjcGkvYmF0dGVyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMDg0OTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYmF0dGVyeS5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX19BQ1BJX0JBVFRFUllfSAorI2RlZmluZSBfX0FDUElfQkFUVEVSWV9ICisKKyNkZWZpbmUgQUNQSV9CQVRURVJZX0NMQVNTICJiYXR0ZXJ5IgorCisjZGVmaW5lIEFDUElfQkFUVEVSWV9OT1RJRllfU1RBVFVTCTB4ODAKKyNkZWZpbmUgQUNQSV9CQVRURVJZX05PVElGWV9JTkZPCTB4ODEKKyNkZWZpbmUgQUNQSV9CQVRURVJZX05PVElGWV9USFJFU0hPTEQgICAweDgyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2J1cy5jIGIvZHJpdmVycy9hY3BpL2J1cy5jCmluZGV4IGZjYjU5YzIuLmU3ZTU4NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9idXMuYworKysgYi9kcml2ZXJzL2FjcGkvYnVzLmMKQEAgLTMxMSw5ICszMTEsNyBAQAogCWNhcGJ1ZltPU0NfU1VQUE9SVF9EV09SRF0gfD0gT1NDX1NCX1BQQ19PU1RfU1VQUE9SVDsKICNlbmRpZgogCi0jaWZkZWYgQUNQSV9IT1RQTFVHX09TVAogCWNhcGJ1ZltPU0NfU1VQUE9SVF9EV09SRF0gfD0gT1NDX1NCX0hPVFBMVUdfT1NUX1NVUFBPUlQ7Ci0jZW5kaWYKIAogCWlmICghZ2hlc19kaXNhYmxlKQogCQljYXBidWZbT1NDX1NVUFBPUlRfRFdPUkRdIHw9IE9TQ19TQl9BUEVJX1NVUFBPUlQ7CkBAIC0zNDAsNjAgKzMzOCw3NyBAQAogICovCiBzdGF0aWMgdm9pZCBhY3BpX2J1c19ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgdHlwZSwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfZGV2aWNlICphZGV2OwogCXN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiTm90aWZpY2F0aW9uICUjMDJ4IHRvIGhhbmRsZSAlcFxuIiwKLQkJCSAgdHlwZSwgaGFuZGxlKSk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiBvc3RfY29kZSA9IEFDUElfT1NUX1NDX05PTl9TUEVDSUZJQ19GQUlMVVJFOwogCiAJc3dpdGNoICh0eXBlKSB7Ci0KIAljYXNlIEFDUElfTk9USUZZX0JVU19DSEVDSzoKLQkJLyogVEJEICovCisJCWFjcGlfaGFuZGxlX2RlYnVnKGhhbmRsZSwgIkFDUElfTk9USUZZX0JVU19DSEVDSyBldmVudFxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX05PVElGWV9ERVZJQ0VfQ0hFQ0s6Ci0JCS8qIFRCRCAqLworCQlhY3BpX2hhbmRsZV9kZWJ1ZyhoYW5kbGUsICJBQ1BJX05PVElGWV9ERVZJQ0VfQ0hFQ0sgZXZlbnRcbiIpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9OT1RJRllfREVWSUNFX1dBS0U6Ci0JCS8qIFRCRCAqLworCQlhY3BpX2hhbmRsZV9kZWJ1ZyhoYW5kbGUsICJBQ1BJX05PVElGWV9ERVZJQ0VfV0FLRSBldmVudFxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX05PVElGWV9FSkVDVF9SRVFVRVNUOgotCQkvKiBUQkQgKi8KKwkJYWNwaV9oYW5kbGVfZGVidWcoaGFuZGxlLCAiQUNQSV9OT1RJRllfRUpFQ1RfUkVRVUVTVCBldmVudFxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX05PVElGWV9ERVZJQ0VfQ0hFQ0tfTElHSFQ6CisJCWFjcGlfaGFuZGxlX2RlYnVnKGhhbmRsZSwgIkFDUElfTk9USUZZX0RFVklDRV9DSEVDS19MSUdIVCBldmVudFxuIik7CiAJCS8qIFRCRDogRXhhY3RseSB3aGF0IGRvZXMgJ2xpZ2h0JyBtZWFuPyAqLwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9OT1RJRllfRlJFUVVFTkNZX01JU01BVENIOgotCQkvKiBUQkQgKi8KKwkJYWNwaV9oYW5kbGVfZXJyKGhhbmRsZSwgIkRldmljZSBjYW5ub3QgYmUgY29uZmlndXJlZCBkdWUgIgorCQkJCSJ0byBhIGZyZXF1ZW5jeSBtaXNtYXRjaFxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX05PVElGWV9CVVNfTU9ERV9NSVNNQVRDSDoKLQkJLyogVEJEICovCisJCWFjcGlfaGFuZGxlX2VycihoYW5kbGUsICJEZXZpY2UgY2Fubm90IGJlIGNvbmZpZ3VyZWQgZHVlICIKKwkJCQkidG8gYSBidXMgbW9kZSBtaXNtYXRjaFxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX05PVElGWV9QT1dFUl9GQVVMVDoKLQkJLyogVEJEICovCisJCWFjcGlfaGFuZGxlX2VycihoYW5kbGUsICJEZXZpY2UgaGFzIHN1ZmZlcmVkIGEgcG93ZXIgZmF1bHRcbiIpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkgICJSZWNlaXZlZCB1bmtub3duL3Vuc3VwcG9ydGVkIG5vdGlmaWNhdGlvbiBbJTA4eF1cbiIsCi0JCQkJICB0eXBlKSk7Ci0JCWJyZWFrOworCQlhY3BpX2hhbmRsZV93YXJuKGhhbmRsZSwgIlVuc3VwcG9ydGVkIGV2ZW50IHR5cGUgMHgleFxuIiwgdHlwZSk7CisJCW9zdF9jb2RlID0gQUNQSV9PU1RfU0NfVU5SRUNPR05JWkVEX05PVElGWTsKKwkJZ290byBlcnI7CiAJfQogCi0JYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZkZXZpY2UpOwotCWlmIChkZXZpY2UpIHsKLQkJZHJpdmVyID0gZGV2aWNlLT5kcml2ZXI7Ci0JCWlmIChkcml2ZXIgJiYgZHJpdmVyLT5vcHMubm90aWZ5ICYmCi0JCSAgICAoZHJpdmVyLT5mbGFncyAmIEFDUElfRFJJVkVSX0FMTF9OT1RJRllfRVZFTlRTKSkKLQkJCWRyaXZlci0+b3BzLm5vdGlmeShkZXZpY2UsIHR5cGUpOworCWFkZXYgPSBhY3BpX2J1c19nZXRfYWNwaV9kZXZpY2UoaGFuZGxlKTsKKwlpZiAoIWFkZXYpCisJCWdvdG8gZXJyOworCisJZHJpdmVyID0gYWRldi0+ZHJpdmVyOworCWlmIChkcml2ZXIgJiYgZHJpdmVyLT5vcHMubm90aWZ5ICYmCisJICAgIChkcml2ZXItPmZsYWdzICYgQUNQSV9EUklWRVJfQUxMX05PVElGWV9FVkVOVFMpKQorCQlkcml2ZXItPm9wcy5ub3RpZnkoYWRldiwgdHlwZSk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFDUElfTk9USUZZX0JVU19DSEVDSzoKKwljYXNlIEFDUElfTk9USUZZX0RFVklDRV9DSEVDSzoKKwljYXNlIEFDUElfTk9USUZZX0VKRUNUX1JFUVVFU1Q6CisJCXN0YXR1cyA9IGFjcGlfaG90cGx1Z19zY2hlZHVsZShhZGV2LCB0eXBlKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQorCQkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWJyZWFrOwogCX0KKwlhY3BpX2J1c19wdXRfYWNwaV9kZXZpY2UoYWRldik7CisJcmV0dXJuOworCisgZXJyOgorCWFjcGlfZXZhbHVhdGVfb3N0KGhhbmRsZSwgdHlwZSwgb3N0X2NvZGUsIE5VTEwpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2J1dHRvbi5jIGIvZHJpdmVycy9hY3BpL2J1dHRvbi5jCmluZGV4IDcxNGU5NTcuLmRiMzU1OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9idXR0b24uYworKysgYi9kcml2ZXJzL2FjcGkvYnV0dG9uLmMKQEAgLTMwMiw2ICszMDIsMTAgQEAKIAkJCWlucHV0X3N5bmMoaW5wdXQpOwogCiAJCQlwbV93YWtldXBfZXZlbnQoJmRldmljZS0+ZGV2LCAwKTsKKwkJCWFjcGlfYnVzX2dlbmVyYXRlX25ldGxpbmtfZXZlbnQoCisJCQkJCWRldmljZS0+cG5wLmRldmljZV9jbGFzcywKKwkJCQkJZGV2X25hbWUoJmRldmljZS0+ZGV2KSwKKwkJCQkJZXZlbnQsICsrYnV0dG9uLT5wdXNoZWQpOwogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvY29udGFpbmVyLmMgYi9kcml2ZXJzL2FjcGkvY29udGFpbmVyLmMKaW5kZXggMzY4ZjlkZC4uNjMxMTlkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2NvbnRhaW5lci5jCisrKyBiL2RyaXZlcnMvYWNwaS9jb250YWluZXIuYwpAQCAtMzEsOCArMzEsNiBAQAogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotI2RlZmluZSBQUkVGSVggIkFDUEk6ICIKLQogI2RlZmluZSBfQ09NUE9ORU5UCQkJQUNQSV9DT05UQUlORVJfQ09NUE9ORU5UCiBBQ1BJX01PRFVMRV9OQU1FKCJjb250YWluZXIiKTsKIApAQCAtNjgsNiArNjYsOSBAQAogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlpbnQgcmV0OwogCisJaWYgKGFkZXYtPmZsYWdzLmlzX2RvY2tfc3RhdGlvbikKKwkJcmV0dXJuIDA7CisKIAljZGV2ID0ga3phbGxvYyhzaXplb2YoKmNkZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNkZXYpCiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2RldmljZV9wbS5jIGIvZHJpdmVycy9hY3BpL2RldmljZV9wbS5jCmluZGV4IGMxNGEwMGQuLmQwNDc3MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kZXZpY2VfcG0uYworKysgYi9kcml2ZXJzL2FjcGkvZGV2aWNlX3BtLmMKQEAgLTkwMSwxNSArOTAxLDMwIEBACiBpbnQgYWNwaV9zdWJzeXNfcHJlcGFyZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJLyoKLQkgKiBGb2xsb3cgUENJIGFuZCByZXN1bWUgZGV2aWNlcyBzdXNwZW5kZWQgYXQgcnVuIHRpbWUgYmVmb3JlIHJ1bm5pbmcKLQkgKiB0aGVpciBzeXN0ZW0gc3VzcGVuZCBjYWxsYmFja3MuCisJICogRGV2aWNlcyBoYXZpbmcgcG93ZXIuaWdub3JlX2NoaWxkcmVuIHNldCBtYXkgc3RpbGwgYmUgbmVjZXNzYXJ5IGZvcgorCSAqIHN1c3BlbmRpbmcgdGhlaXIgY2hpbGRyZW4gaW4gdGhlIG5leHQgcGhhc2Ugb2YgZGV2aWNlIHN1c3BlbmQuCiAJICovCi0JcG1fcnVudGltZV9yZXN1bWUoZGV2KTsKKwlpZiAoZGV2LT5wb3dlci5pZ25vcmVfY2hpbGRyZW4pCisJCXBtX3J1bnRpbWVfcmVzdW1lKGRldik7CisKIAlyZXR1cm4gcG1fZ2VuZXJpY19wcmVwYXJlKGRldik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhY3BpX3N1YnN5c19wcmVwYXJlKTsKIAogLyoqCisgKiBhY3BpX3N1YnN5c19zdXNwZW5kIC0gUnVuIHRoZSBkZXZpY2UgZHJpdmVyJ3Mgc3VzcGVuZCBjYWxsYmFjay4KKyAqIEBkZXY6IERldmljZSB0byBoYW5kbGUuCisgKgorICogRm9sbG93IFBDSSBhbmQgcmVzdW1lIGRldmljZXMgc3VzcGVuZGVkIGF0IHJ1biB0aW1lIGJlZm9yZSBydW5uaW5nIHRoZWlyCisgKiBzeXN0ZW0gc3VzcGVuZCBjYWxsYmFja3MuCisgKi8KK2ludCBhY3BpX3N1YnN5c19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlwbV9ydW50aW1lX3Jlc3VtZShkZXYpOworCXJldHVybiBwbV9nZW5lcmljX3N1c3BlbmQoZGV2KTsKK30KKworLyoqCiAgKiBhY3BpX3N1YnN5c19zdXNwZW5kX2xhdGUgLSBTdXNwZW5kIGRldmljZSB1c2luZyBBQ1BJLgogICogQGRldjogRGV2aWNlIHRvIHN1c3BlbmQuCiAgKgpAQCAtOTM3LDYgKzk1MiwyMyBAQAogCXJldHVybiByZXQgPyByZXQgOiBwbV9nZW5lcmljX3Jlc3VtZV9lYXJseShkZXYpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYWNwaV9zdWJzeXNfcmVzdW1lX2Vhcmx5KTsKKworLyoqCisgKiBhY3BpX3N1YnN5c19mcmVlemUgLSBSdW4gdGhlIGRldmljZSBkcml2ZXIncyBmcmVlemUgY2FsbGJhY2suCisgKiBAZGV2OiBEZXZpY2UgdG8gaGFuZGxlLgorICovCitpbnQgYWNwaV9zdWJzeXNfZnJlZXplKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvKgorCSAqIFRoaXMgdXNlZCB0byBiZSBkb25lIGluIGFjcGlfc3Vic3lzX3ByZXBhcmUoKSBmb3IgYWxsIGRldmljZXMgYW5kCisJICogc29tZSBkcml2ZXJzIG1heSBkZXBlbmQgb24gaXQsIHNvIGRvIGl0IGhlcmUuICBJZGVhbGx5LCBob3dldmVyLAorCSAqIHJ1bnRpbWUtc3VzcGVuZGVkIGRldmljZXMgc2hvdWxkIG5vdCBiZSB0b3VjaGVkIGR1cmluZyBmcmVlemUvdGhhdworCSAqIHRyYW5zaXRpb25zLgorCSAqLworCXBtX3J1bnRpbWVfcmVzdW1lKGRldik7CisJcmV0dXJuIHBtX2dlbmVyaWNfZnJlZXplKGRldik7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KIAogc3RhdGljIHN0cnVjdCBkZXZfcG1fZG9tYWluIGFjcGlfZ2VuZXJhbF9wbV9kb21haW4gPSB7CkBAIC05NDcsOCArOTc5LDExIEBACiAjZW5kaWYKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIAkJLnByZXBhcmUgPSBhY3BpX3N1YnN5c19wcmVwYXJlLAorCQkuc3VzcGVuZCA9IGFjcGlfc3Vic3lzX3N1c3BlbmQsCiAJCS5zdXNwZW5kX2xhdGUgPSBhY3BpX3N1YnN5c19zdXNwZW5kX2xhdGUsCiAJCS5yZXN1bWVfZWFybHkgPSBhY3BpX3N1YnN5c19yZXN1bWVfZWFybHksCisJCS5mcmVlemUgPSBhY3BpX3N1YnN5c19mcmVlemUsCisJCS5wb3dlcm9mZiA9IGFjcGlfc3Vic3lzX3N1c3BlbmQsCiAJCS5wb3dlcm9mZl9sYXRlID0gYWNwaV9zdWJzeXNfc3VzcGVuZF9sYXRlLAogCQkucmVzdG9yZV9lYXJseSA9IGFjcGlfc3Vic3lzX3Jlc3VtZV9lYXJseSwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2RvY2suYyBiL2RyaXZlcnMvYWNwaS9kb2NrLmMKaW5kZXggNWJmZDc2OS4uZjBmYzYyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2RvY2suYworKysgYi9kcml2ZXJzL2FjcGkvZG9jay5jCkBAIC0xLDcgKzEsOSBAQAogLyoKICAqICBkb2NrLmMgLSBBQ1BJIGRvY2sgc3RhdGlvbiBkcml2ZXIKICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA2IEtyaXN0ZW4gQ2FybHNvbiBBY2NhcmRpIDxrcmlzdGVuLmMuYWNjYXJkaUBpbnRlbC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDE0LCBJbnRlbCBDb3JwLgorICogIEF1dGhvcjogS3Jpc3RlbiBDYXJsc29uIEFjY2FyZGkgPGtyaXN0ZW4uYy5hY2NhcmRpQGludGVsLmNvbT4KKyAqICAgICAgICAgIFJhZmFlbCBKLiBXeXNvY2tpIDxyYWZhZWwuai53eXNvY2tpQGludGVsLmNvbT4KICAqCiAgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogICoKQEAgLTM1LDggKzM3LDYgQEAKIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAKLSNkZWZpbmUgUFJFRklYICJBQ1BJOiAiCi0KICNkZWZpbmUgQUNQSV9ET0NLX0RSSVZFUl9ERVNDUklQVElPTiAiQUNQSSBEb2NrIFN0YXRpb24gRHJpdmVyIgogCiBBQ1BJX01PRFVMRV9OQU1FKCJkb2NrIik7CkBAIC02OCwxNSArNjgsMTAgQEAKIH07CiBzdGF0aWMgTElTVF9IRUFEKGRvY2tfc3RhdGlvbnMpOwogc3RhdGljIGludCBkb2NrX3N0YXRpb25fY291bnQ7Ci1zdGF0aWMgREVGSU5FX01VVEVYKGhvdHBsdWdfbG9jayk7CiAKIHN0cnVjdCBkb2NrX2RlcGVuZGVudF9kZXZpY2UgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlhY3BpX2hhbmRsZSBoYW5kbGU7Ci0JY29uc3Qgc3RydWN0IGFjcGlfZG9ja19vcHMgKmhwX29wczsKLQl2b2lkICpocF9jb250ZXh0OwotCXVuc2lnbmVkIGludCBocF9yZWZjb3VudDsKLQl2b2lkICgqaHBfcmVsZWFzZSkodm9pZCAqKTsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXY7CiB9OwogCiAjZGVmaW5lIERPQ0tfRE9DS0lORwkweDAwMDAwMDAxCkBAIC05OCwxMyArOTMsMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKgogICogYWRkX2RvY2tfZGVwZW5kZW50X2RldmljZSAtIGFzc29jaWF0ZSBhIGRldmljZSB3aXRoIHRoZSBkb2NrIHN0YXRpb24KLSAqIEBkczogVGhlIGRvY2sgc3RhdGlvbgotICogQGhhbmRsZTogaGFuZGxlIG9mIHRoZSBkZXBlbmRlbnQgZGV2aWNlCisgKiBAZHM6IERvY2sgc3RhdGlvbi4KKyAqIEBhZGV2OiBEZXBlbmRlbnQgQUNQSSBkZXZpY2Ugb2JqZWN0LgogICoKICAqIEFkZCB0aGUgZGVwZW5kZW50IGRldmljZSB0byB0aGUgZG9jaydzIGRlcGVuZGVudCBkZXZpY2UgbGlzdC4KICAqLwotc3RhdGljIGludCBfX2luaXQKLWFkZF9kb2NrX2RlcGVuZGVudF9kZXZpY2Uoc3RydWN0IGRvY2tfc3RhdGlvbiAqZHMsIGFjcGlfaGFuZGxlIGhhbmRsZSkKK3N0YXRpYyBpbnQgYWRkX2RvY2tfZGVwZW5kZW50X2RldmljZShzdHJ1Y3QgZG9ja19zdGF0aW9uICpkcywKKwkJCQkgICAgIHN0cnVjdCBhY3BpX2RldmljZSAqYWRldikKIHsKIAlzdHJ1Y3QgZG9ja19kZXBlbmRlbnRfZGV2aWNlICpkZDsKIApAQCAtMTEyLDE4MCArMTA3LDEyMCBAQAogCWlmICghZGQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZGQtPmhhbmRsZSA9IGhhbmRsZTsKKwlkZC0+YWRldiA9IGFkZXY7CiAJSU5JVF9MSVNUX0hFQUQoJmRkLT5saXN0KTsKIAlsaXN0X2FkZF90YWlsKCZkZC0+bGlzdCwgJmRzLT5kZXBlbmRlbnRfZGV2aWNlcyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcmVtb3ZlX2RvY2tfZGVwZW5kZW50X2RldmljZXMoc3RydWN0IGRvY2tfc3RhdGlvbiAqZHMpCi17Ci0Jc3RydWN0IGRvY2tfZGVwZW5kZW50X2RldmljZSAqZGQsICphdXg7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGQsIGF1eCwgJmRzLT5kZXBlbmRlbnRfZGV2aWNlcywgbGlzdCkgewotCQlsaXN0X2RlbCgmZGQtPmxpc3QpOwotCQlrZnJlZShkZCk7Ci0JfQotfQotCi0vKioKLSAqIGRvY2tfaW5pdF9ob3RwbHVnIC0gSW5pdGlhbGl6ZSBhIGhvdHBsdWcgZGV2aWNlIG9uIGEgZG9ja2luZyBzdGF0aW9uLgotICogQGRkOiBEb2NrLWRlcGVuZGVudCBkZXZpY2UuCi0gKiBAb3BzOiBEb2NrIG9wZXJhdGlvbnMgdG8gYXR0YWNoIHRvIHRoZSBkZXBlbmRlbnQgZGV2aWNlLgotICogQGNvbnRleHQ6IERhdGEgdG8gcGFzcyB0byB0aGUgQG9wcyBjYWxsYmFja3MgYW5kIEByZWxlYXNlLgotICogQGluaXQ6IE9wdGlvbmFsIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgdG8gcnVuIGFmdGVyIHNldHRpbmcgdXAgY29udGV4dC4KLSAqIEByZWxlYXNlOiBPcHRpb25hbCByZWxlYXNlIHJvdXRpbmUgdG8gcnVuIG9uIHJlbW92YWwuCi0gKi8KLXN0YXRpYyBpbnQgZG9ja19pbml0X2hvdHBsdWcoc3RydWN0IGRvY2tfZGVwZW5kZW50X2RldmljZSAqZGQsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBhY3BpX2RvY2tfb3BzICpvcHMsIHZvaWQgKmNvbnRleHQsCi0JCQkgICAgIHZvaWQgKCppbml0KSh2b2lkICopLCB2b2lkICgqcmVsZWFzZSkodm9pZCAqKSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCW11dGV4X2xvY2soJmhvdHBsdWdfbG9jayk7Ci0JaWYgKFdBUk5fT04oZGQtPmhwX2NvbnRleHQpKSB7Ci0JCXJldCA9IC1FRVhJU1Q7Ci0JfSBlbHNlIHsKLQkJZGQtPmhwX3JlZmNvdW50ID0gMTsKLQkJZGQtPmhwX29wcyA9IG9wczsKLQkJZGQtPmhwX2NvbnRleHQgPSBjb250ZXh0OwotCQlkZC0+aHBfcmVsZWFzZSA9IHJlbGVhc2U7Ci0JCWlmIChpbml0KQotCQkJaW5pdChjb250ZXh0KTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZob3RwbHVnX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogZG9ja19yZWxlYXNlX2hvdHBsdWcgLSBEZWNyZW1lbnQgaG90cGx1ZyByZWZlcmVuY2UgY291bnRlciBvZiBkb2NrIGRldmljZS4KLSAqIEBkZDogRG9jay1kZXBlbmRlbnQgZGV2aWNlLgotICoKLSAqIERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50ZXIgb2YgQGRkIGFuZCBpZiAwLCBkZXRhY2ggaXRzIGhvdHBsdWcKLSAqIG9wZXJhdGlvbnMgZnJvbSBpdCwgcmVzZXQgaXRzIGNvbnRleHQgcG9pbnRlciBhbmQgcnVuIHRoZSBvcHRpb25hbCByZWxlYXNlCi0gKiByb3V0aW5lIGlmIHByZXNlbnQuCi0gKi8KLXN0YXRpYyB2b2lkIGRvY2tfcmVsZWFzZV9ob3RwbHVnKHN0cnVjdCBkb2NrX2RlcGVuZGVudF9kZXZpY2UgKmRkKQotewotCW11dGV4X2xvY2soJmhvdHBsdWdfbG9jayk7Ci0JaWYgKGRkLT5ocF9jb250ZXh0ICYmICEtLWRkLT5ocF9yZWZjb3VudCkgewotCQl2b2lkICgqcmVsZWFzZSkodm9pZCAqKSA9IGRkLT5ocF9yZWxlYXNlOwotCQl2b2lkICpjb250ZXh0ID0gZGQtPmhwX2NvbnRleHQ7Ci0KLQkJZGQtPmhwX29wcyA9IE5VTEw7Ci0JCWRkLT5ocF9jb250ZXh0ID0gTlVMTDsKLQkJZGQtPmhwX3JlbGVhc2UgPSBOVUxMOwotCQlpZiAocmVsZWFzZSkKLQkJCXJlbGVhc2UoY29udGV4dCk7Ci0JfQotCW11dGV4X3VubG9jaygmaG90cGx1Z19sb2NrKTsKLX0KLQogc3RhdGljIHZvaWQgZG9ja19ob3RwbHVnX2V2ZW50KHN0cnVjdCBkb2NrX2RlcGVuZGVudF9kZXZpY2UgKmRkLCB1MzIgZXZlbnQsCiAJCQkgICAgICAgZW51bSBkb2NrX2NhbGxiYWNrX3R5cGUgY2JfdHlwZSkKIHsKLQlhY3BpX25vdGlmeV9oYW5kbGVyIGNiID0gTlVMTDsKLQlib29sIHJ1biA9IGZhbHNlOworCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiA9IGRkLT5hZGV2OwogCi0JbXV0ZXhfbG9jaygmaG90cGx1Z19sb2NrKTsKKwlhY3BpX2xvY2tfaHBfY29udGV4dCgpOwogCi0JaWYgKGRkLT5ocF9jb250ZXh0KSB7Ci0JCXJ1biA9IHRydWU7Ci0JCWRkLT5ocF9yZWZjb3VudCsrOwotCQlpZiAoZGQtPmhwX29wcykgewotCQkJc3dpdGNoIChjYl90eXBlKSB7Ci0JCQljYXNlIERPQ0tfQ0FMTF9GSVhVUDoKLQkJCQljYiA9IGRkLT5ocF9vcHMtPmZpeHVwOwotCQkJCWJyZWFrOwotCQkJY2FzZSBET0NLX0NBTExfVUVWRU5UOgotCQkJCWNiID0gZGQtPmhwX29wcy0+dWV2ZW50OwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQljYiA9IGRkLT5ocF9vcHMtPmhhbmRsZXI7Ci0JCQl9CisJaWYgKCFhZGV2LT5ocCkKKwkJZ290byBvdXQ7CisKKwlpZiAoY2JfdHlwZSA9PSBET0NLX0NBTExfRklYVVApIHsKKwkJdm9pZCAoKmZpeHVwKShzdHJ1Y3QgYWNwaV9kZXZpY2UgKik7CisKKwkJZml4dXAgPSBhZGV2LT5ocC0+Zml4dXA7CisJCWlmIChmaXh1cCkgeworCQkJYWNwaV91bmxvY2tfaHBfY29udGV4dCgpOworCQkJZml4dXAoYWRldik7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgaWYgKGNiX3R5cGUgPT0gRE9DS19DQUxMX1VFVkVOVCkgeworCQl2b2lkICgqdWV2ZW50KShzdHJ1Y3QgYWNwaV9kZXZpY2UgKiwgdTMyKTsKKworCQl1ZXZlbnQgPSBhZGV2LT5ocC0+dWV2ZW50OworCQlpZiAodWV2ZW50KSB7CisJCQlhY3BpX3VubG9ja19ocF9jb250ZXh0KCk7CisJCQl1ZXZlbnQoYWRldiwgZXZlbnQpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJaW50ICgqbm90aWZ5KShzdHJ1Y3QgYWNwaV9kZXZpY2UgKiwgdTMyKTsKKworCQlub3RpZnkgPSBhZGV2LT5ocC0+bm90aWZ5OworCQlpZiAobm90aWZ5KSB7CisJCQlhY3BpX3VubG9ja19ocF9jb250ZXh0KCk7CisJCQlub3RpZnkoYWRldiwgZXZlbnQpOworCQkJcmV0dXJuOwogCQl9CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCZob3RwbHVnX2xvY2spOworIG91dDoKKwlhY3BpX3VubG9ja19ocF9jb250ZXh0KCk7Cit9CiAKLQlpZiAoIXJ1bikKLQkJcmV0dXJuOworc3RhdGljIHN0cnVjdCBkb2NrX3N0YXRpb24gKmZpbmRfZG9ja19zdGF0aW9uKGFjcGlfaGFuZGxlIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgZG9ja19zdGF0aW9uICpkczsKIAotCWlmIChjYikKLQkJY2IoZGQtPmhhbmRsZSwgZXZlbnQsIGRkLT5ocF9jb250ZXh0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRzLCAmZG9ja19zdGF0aW9ucywgc2libGluZykKKwkJaWYgKGRzLT5oYW5kbGUgPT0gaGFuZGxlKQorCQkJcmV0dXJuIGRzOwogCi0JZG9ja19yZWxlYXNlX2hvdHBsdWcoZGQpOworCXJldHVybiBOVUxMOwogfQogCiAvKioKICAqIGZpbmRfZG9ja19kZXBlbmRlbnRfZGV2aWNlIC0gZ2V0IGEgZGV2aWNlIGRlcGVuZGVudCBvbiB0aGlzIGRvY2sKICAqIEBkczogdGhlIGRvY2sgc3RhdGlvbgotICogQGhhbmRsZTogdGhlIGFjcGlfaGFuZGxlIG9mIHRoZSBkZXZpY2Ugd2Ugd2FudAorICogQGFkZXY6IEFDUEkgZGV2aWNlIG9iamVjdCB0byBmaW5kLgogICoKICAqIGl0ZXJhdGUgb3ZlciB0aGUgZGVwZW5kZW50IGRldmljZSBsaXN0IGZvciB0aGlzIGRvY2suICBJZiB0aGUKICAqIGRlcGVuZGVudCBkZXZpY2UgbWF0Y2hlcyB0aGUgaGFuZGxlLCByZXR1cm4uCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZG9ja19kZXBlbmRlbnRfZGV2aWNlICoKLWZpbmRfZG9ja19kZXBlbmRlbnRfZGV2aWNlKHN0cnVjdCBkb2NrX3N0YXRpb24gKmRzLCBhY3BpX2hhbmRsZSBoYW5kbGUpCitmaW5kX2RvY2tfZGVwZW5kZW50X2RldmljZShzdHJ1Y3QgZG9ja19zdGF0aW9uICpkcywgc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KQogewogCXN0cnVjdCBkb2NrX2RlcGVuZGVudF9kZXZpY2UgKmRkOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZCwgJmRzLT5kZXBlbmRlbnRfZGV2aWNlcywgbGlzdCkKLQkJaWYgKGhhbmRsZSA9PSBkZC0+aGFuZGxlKQorCQlpZiAoYWRldiA9PSBkZC0+YWRldikKIAkJCXJldHVybiBkZDsKIAogCXJldHVybiBOVUxMOwogfQogCit2b2lkIHJlZ2lzdGVyX2RvY2tfZGVwZW5kZW50X2RldmljZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsCisJCQkJICAgIGFjcGlfaGFuZGxlIGRzaGFuZGxlKQoreworCXN0cnVjdCBkb2NrX3N0YXRpb24gKmRzID0gZmluZF9kb2NrX3N0YXRpb24oZHNoYW5kbGUpOworCisJaWYgKGRzICYmICFmaW5kX2RvY2tfZGVwZW5kZW50X2RldmljZShkcywgYWRldikpCisJCWFkZF9kb2NrX2RlcGVuZGVudF9kZXZpY2UoZHMsIGFkZXYpOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgICAgICAgIERvY2sgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBfX2luaXQgaXNfYmF0dGVyeShhY3BpX2hhbmRsZSBoYW5kbGUpCi17Ci0Jc3RydWN0IGFjcGlfZGV2aWNlX2luZm8gKmluZm87Ci0JaW50IHJldCA9IDE7Ci0KLQlpZiAoIUFDUElfU1VDQ0VTUyhhY3BpX2dldF9vYmplY3RfaW5mbyhoYW5kbGUsICZpbmZvKSkpCi0JCXJldHVybiAwOwotCWlmICghKGluZm8tPnZhbGlkICYgQUNQSV9WQUxJRF9ISUQpKQotCQlyZXQgPSAwOwotCWVsc2UKLQkJcmV0ID0gIXN0cmNtcCgiUE5QMEMwQSIsIGluZm8tPmhhcmR3YXJlX2lkLnN0cmluZyk7Ci0KLQlrZnJlZShpbmZvKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKiBDaGVjayB3aGV0aGVyIEFDUEkgb2JqZWN0IGlzIGFuIGVqZWN0YWJsZSBiYXR0ZXJ5IG9yIGRpc2sgYmF5ICovCi1zdGF0aWMgYm9vbCBfX2luaXQgaXNfZWplY3RhYmxlX2JheShhY3BpX2hhbmRsZSBoYW5kbGUpCi17Ci0JaWYgKGFjcGlfaGFzX21ldGhvZChoYW5kbGUsICJfRUowIikgJiYgaXNfYmF0dGVyeShoYW5kbGUpKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBhY3BpX2JheV9tYXRjaChoYW5kbGUpOwotfQogCiAvKioKICAqIGlzX2RvY2tfZGV2aWNlIC0gc2VlIGlmIGEgZGV2aWNlIGlzIG9uIGEgZG9jayBzdGF0aW9uCi0gKiBAaGFuZGxlOiBhY3BpIGhhbmRsZSBvZiB0aGUgZGV2aWNlCisgKiBAYWRldjogQUNQSSBkZXZpY2Ugb2JqZWN0IHRvIGNoZWNrLgogICoKICAqIElmIHRoaXMgZGV2aWNlIGlzIGVpdGhlciB0aGUgZG9jayBzdGF0aW9uIGl0c2VsZiwKICAqIG9yIGlzIGEgZGV2aWNlIGRlcGVuZGVudCBvbiB0aGUgZG9jayBzdGF0aW9uLCB0aGVuIGl0CiAgKiBpcyBhIGRvY2sgZGV2aWNlCiAgKi8KLWludCBpc19kb2NrX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUpCitpbnQgaXNfZG9ja19kZXZpY2Uoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KQogewogCXN0cnVjdCBkb2NrX3N0YXRpb24gKmRvY2tfc3RhdGlvbjsKIAogCWlmICghZG9ja19zdGF0aW9uX2NvdW50KQogCQlyZXR1cm4gMDsKIAotCWlmIChhY3BpX2RvY2tfbWF0Y2goaGFuZGxlKSkKKwlpZiAoYWNwaV9kb2NrX21hdGNoKGFkZXYtPmhhbmRsZSkpCiAJCXJldHVybiAxOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkb2NrX3N0YXRpb24sICZkb2NrX3N0YXRpb25zLCBzaWJsaW5nKQotCQlpZiAoZmluZF9kb2NrX2RlcGVuZGVudF9kZXZpY2UoZG9ja19zdGF0aW9uLCBoYW5kbGUpKQorCQlpZiAoZmluZF9kb2NrX2RlcGVuZGVudF9kZXZpY2UoZG9ja19zdGF0aW9uLCBhZGV2KSkKIAkJCXJldHVybiAxOwogCiAJcmV0dXJuIDA7CkBAIC0zMTMsNDMgKzI0OCw2IEBACiB9CiAKIC8qKgotICogZG9ja19jcmVhdGVfYWNwaV9kZXZpY2UgLSBhZGQgbmV3IGRldmljZXMgdG8gYWNwaQotICogQGhhbmRsZSAtIGhhbmRsZSBvZiB0aGUgZGV2aWNlIHRvIGFkZAotICoKLSAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgY3JlYXRlIGEgbmV3IGFjcGlfZGV2aWNlIGZvciB0aGUgZ2l2ZW4KLSAqICBoYW5kbGUgaWYgb25lIGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBUaGlzIHNob3VsZCBjYXVzZQotICogIGFjcGkgdG8gc2NhbiBmb3IgZHJpdmVycyBmb3IgdGhlIGdpdmVuIGRldmljZXMsIGFuZCBjYWxsCi0gKiAgbWF0Y2hpbmcgZHJpdmVyJ3MgYWRkIHJvdXRpbmUuCi0gKi8KLXN0YXRpYyB2b2lkIGRvY2tfY3JlYXRlX2FjcGlfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSkKLXsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7Ci0JaW50IHJldDsKLQotCWFjcGlfYnVzX2dldF9kZXZpY2UoaGFuZGxlLCAmZGV2aWNlKTsKLQlpZiAoIWFjcGlfZGV2aWNlX2VudW1lcmF0ZWQoZGV2aWNlKSkgewotCQlyZXQgPSBhY3BpX2J1c19zY2FuKGhhbmRsZSk7Ci0JCWlmIChyZXQpCi0JCQlwcl9kZWJ1ZygiZXJyb3IgYWRkaW5nIGJ1cywgJXhcbiIsIC1yZXQpOwotCX0KLX0KLQotLyoqCi0gKiBkb2NrX3JlbW92ZV9hY3BpX2RldmljZSAtIHJlbW92ZSB0aGUgYWNwaV9kZXZpY2Ugc3RydWN0IGZyb20gYWNwaQotICogQGhhbmRsZSAtIHRoZSBoYW5kbGUgb2YgdGhlIGRldmljZSB0byByZW1vdmUKLSAqCi0gKiAgVGVsbCBhY3BpIHRvIHJlbW92ZSB0aGUgYWNwaV9kZXZpY2UuICBUaGlzIHNob3VsZCBjYXVzZSBhbnkgbG9hZGVkCi0gKiAgZHJpdmVyIHRvIGhhdmUgaXQncyByZW1vdmUgcm91dGluZSBjYWxsZWQuCi0gKi8KLXN0YXRpYyB2b2lkIGRvY2tfcmVtb3ZlX2FjcGlfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSkKLXsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsKLQotCWlmICghYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZkZXZpY2UpKQotCQlhY3BpX2J1c190cmltKGRldmljZSk7Ci19Ci0KLS8qKgogICogaG90X3JlbW92ZV9kb2NrX2RldmljZXMgLSBSZW1vdmUgZG9jayBzdGF0aW9uIGRldmljZXMuCiAgKiBAZHM6IERvY2sgc3RhdGlvbi4KICAqLwpAQCAtMzY2LDcgKzI2NCw3IEBACiAJCWRvY2tfaG90cGx1Z19ldmVudChkZCwgQUNQSV9OT1RJRllfRUpFQ1RfUkVRVUVTVCwgZmFsc2UpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGRkLCAmZHMtPmRlcGVuZGVudF9kZXZpY2VzLCBsaXN0KQotCQlkb2NrX3JlbW92ZV9hY3BpX2RldmljZShkZC0+aGFuZGxlKTsKKwkJYWNwaV9idXNfdHJpbShkZC0+YWRldik7CiB9CiAKIC8qKgpAQCAtMzkyLDEyICsyOTAsMjAgQEAKIAkJZG9ja19ob3RwbHVnX2V2ZW50KGRkLCBldmVudCwgRE9DS19DQUxMX0hBTkRMRVIpOwogCiAJLyoKLQkgKiBOb3cgbWFrZSBzdXJlIHRoYXQgYW4gYWNwaV9kZXZpY2UgaXMgY3JlYXRlZCBmb3IgZWFjaCBkZXBlbmRlbnQKLQkgKiBkZXZpY2UuICBUaGF0IHdpbGwgY2F1c2Ugc2NhbiBoYW5kbGVycyB0byBiZSBhdHRhY2hlZCB0byBkZXZpY2UKLQkgKiBvYmplY3RzIG9yIGFjcGlfZHJpdmVycyB0byBiZSBzdG9wcGVkL3N0YXJ0ZWQgaWYgdGhleSBhcmUgcHJlc2VudC4KKwkgKiBDaGVjayBpZiBhbGwgZGV2aWNlcyBoYXZlIGJlZW4gZW51bWVyYXRlZCBhbHJlYWR5LiAgSWYgbm90LCBydW4KKwkgKiBhY3BpX2J1c19zY2FuKCkgZm9yIHRoZW0gYW5kIHRoYXQgd2lsbCBjYXVzZSBzY2FuIGhhbmRsZXJzIHRvIGJlCisJICogYXR0YWNoZWQgdG8gZGV2aWNlIG9iamVjdHMgb3IgYWNwaV9kcml2ZXJzIHRvIGJlIHN0b3BwZWQvc3RhcnRlZCBpZgorCSAqIHRoZXkgYXJlIHByZXNlbnQuCiAJICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZCwgJmRzLT5kZXBlbmRlbnRfZGV2aWNlcywgbGlzdCkKLQkJZG9ja19jcmVhdGVfYWNwaV9kZXZpY2UoZGQtPmhhbmRsZSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZCwgJmRzLT5kZXBlbmRlbnRfZGV2aWNlcywgbGlzdCkgeworCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYgPSBkZC0+YWRldjsKKworCQlpZiAoIWFjcGlfZGV2aWNlX2VudW1lcmF0ZWQoYWRldikpIHsKKwkJCWludCByZXQgPSBhY3BpX2J1c19zY2FuKGFkZXYtPmhhbmRsZSk7CisJCQlpZiAocmV0KQorCQkJCWRldl9kYmcoJmFkZXYtPmRldiwgInNjYW4gZXJyb3IgJWRcbiIsIC1yZXQpOworCQl9CisJfQogfQogCiBzdGF0aWMgdm9pZCBkb2NrX2V2ZW50KHN0cnVjdCBkb2NrX3N0YXRpb24gKmRzLCB1MzIgZXZlbnQsIGludCBudW0pCkBAIC01MDEsNzEgKzQwNyw2IEBACiB9CiAKIC8qKgotICogcmVnaXN0ZXJfaG90cGx1Z19kb2NrX2RldmljZSAtIHJlZ2lzdGVyIGEgaG90cGx1ZyBmdW5jdGlvbgotICogQGhhbmRsZTogdGhlIGhhbmRsZSBvZiB0aGUgZGV2aWNlCi0gKiBAb3BzOiBoYW5kbGVycyB0byBjYWxsIGFmdGVyIGRvY2tpbmcKLSAqIEBjb250ZXh0OiBkZXZpY2Ugc3BlY2lmaWMgZGF0YQotICogQGluaXQ6IE9wdGlvbmFsIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgdG8gcnVuIGFmdGVyIHJlZ2lzdHJhdGlvbgotICogQHJlbGVhc2U6IE9wdGlvbmFsIHJlbGVhc2Ugcm91dGluZSB0byBydW4gb24gdW5yZWdpc3RyYXRpb24KLSAqCi0gKiBJZiBhIGRyaXZlciB3b3VsZCBsaWtlIHRvIHBlcmZvcm0gYSBob3RwbHVnIG9wZXJhdGlvbiBhZnRlciBhIGRvY2sKLSAqIGV2ZW50LCB0aGV5IGNhbiByZWdpc3RlciBhbiBhY3BpX25vdGlmaXlfaGFuZGxlciB0byBiZSBjYWxsZWQgYnkKLSAqIHRoZSBkb2NrIGRyaXZlciBhZnRlciBfRENLIGlzIGV4ZWN1dGVkLgotICovCi1pbnQgcmVnaXN0ZXJfaG90cGx1Z19kb2NrX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUsCi0JCQkJIGNvbnN0IHN0cnVjdCBhY3BpX2RvY2tfb3BzICpvcHMsIHZvaWQgKmNvbnRleHQsCi0JCQkJIHZvaWQgKCppbml0KSh2b2lkICopLCB2b2lkICgqcmVsZWFzZSkodm9pZCAqKSkKLXsKLQlzdHJ1Y3QgZG9ja19kZXBlbmRlbnRfZGV2aWNlICpkZDsKLQlzdHJ1Y3QgZG9ja19zdGF0aW9uICpkb2NrX3N0YXRpb247Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQlpZiAoV0FSTl9PTighY29udGV4dCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFkb2NrX3N0YXRpb25fY291bnQpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyoKLQkgKiBtYWtlIHN1cmUgdGhpcyBoYW5kbGUgaXMgZm9yIGEgZGV2aWNlIGRlcGVuZGVudCBvbiB0aGUgZG9jaywKLQkgKiB0aGlzIHdvdWxkIGluY2x1ZGUgdGhlIGRvY2sgc3RhdGlvbiBpdHNlbGYKLQkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRvY2tfc3RhdGlvbiwgJmRvY2tfc3RhdGlvbnMsIHNpYmxpbmcpIHsKLQkJLyoKLQkJICogQW4gQVRBIGJheSBjYW4gYmUgaW4gYSBkb2NrIGFuZCBpdHNlbGYgY2FuIGJlIGVqZWN0ZWQKLQkJICogc2VwYXJhdGVseSwgc28gdGhlcmUgYXJlIHR3byAnZG9jayBzdGF0aW9ucycgd2hpY2ggbmVlZCB0aGUKLQkJICogb3BzCi0JCSAqLwotCQlkZCA9IGZpbmRfZG9ja19kZXBlbmRlbnRfZGV2aWNlKGRvY2tfc3RhdGlvbiwgaGFuZGxlKTsKLQkJaWYgKGRkICYmICFkb2NrX2luaXRfaG90cGx1ZyhkZCwgb3BzLCBjb250ZXh0LCBpbml0LCByZWxlYXNlKSkKLQkJCXJldCA9IDA7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHJlZ2lzdGVyX2hvdHBsdWdfZG9ja19kZXZpY2UpOwotCi0vKioKLSAqIHVucmVnaXN0ZXJfaG90cGx1Z19kb2NrX2RldmljZSAtIHJlbW92ZSB5b3Vyc2VsZiBmcm9tIHRoZSBob3RwbHVnIGxpc3QKLSAqIEBoYW5kbGU6IHRoZSBhY3BpIGhhbmRsZSBvZiB0aGUgZGV2aWNlCi0gKi8KLXZvaWQgdW5yZWdpc3Rlcl9ob3RwbHVnX2RvY2tfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSkKLXsKLQlzdHJ1Y3QgZG9ja19kZXBlbmRlbnRfZGV2aWNlICpkZDsKLQlzdHJ1Y3QgZG9ja19zdGF0aW9uICpkb2NrX3N0YXRpb247Ci0KLQlpZiAoIWRvY2tfc3RhdGlvbl9jb3VudCkKLQkJcmV0dXJuOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkb2NrX3N0YXRpb24sICZkb2NrX3N0YXRpb25zLCBzaWJsaW5nKSB7Ci0JCWRkID0gZmluZF9kb2NrX2RlcGVuZGVudF9kZXZpY2UoZG9ja19zdGF0aW9uLCBoYW5kbGUpOwotCQlpZiAoZGQpCi0JCQlkb2NrX3JlbGVhc2VfaG90cGx1ZyhkZCk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTF9HUEwodW5yZWdpc3Rlcl9ob3RwbHVnX2RvY2tfZGV2aWNlKTsKLQotLyoqCiAgKiBoYW5kbGVfZWplY3RfcmVxdWVzdCAtIGhhbmRsZSBhbiB1bmRvY2sgcmVxdWVzdCBjaGVja2luZyBmb3IgZXJyb3IgY29uZGl0aW9ucwogICoKICAqIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgZG9jayBkZXZpY2UgaXMgc3RpbGwgcHJlc2VudCwgdGhlbiB1bmRvY2sgYW5kCkBAIC01OTgsMjAgKzQzOSwyMyBAQAogfQogCiAvKioKLSAqIGRvY2tfbm90aWZ5IC0gYWN0IHVwb24gYW4gYWNwaSBkb2NrIG5vdGlmaWNhdGlvbgotICogQGRzOiBkb2NrIHN0YXRpb24KLSAqIEBldmVudDogdGhlIGFjcGkgZXZlbnQKKyAqIGRvY2tfbm90aWZ5IC0gSGFuZGxlIEFDUEkgZG9jayBub3RpZmljYXRpb24uCisgKiBAYWRldjogRG9jayBzdGF0aW9uJ3MgQUNQSSBkZXZpY2Ugb2JqZWN0LgorICogQGV2ZW50OiBFdmVudCBjb2RlLgogICoKICAqIElmIHdlIGFyZSBub3RpZmllZCB0byBkb2NrLCB0aGVuIGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jayBpcwogICogcHJlc2VudCBhbmQgdGhlbiBkb2NrLiAgTm90aWZ5IGFsbCBkcml2ZXJzIG9mIHRoZSBkb2NrIGV2ZW50LAogICogYW5kIHRoZW4gaG90cGx1ZyBhbmQgZGV2aWNlcyB0aGF0IG1heSBuZWVkIGhvdHBsdWdnaW5nLgogICovCi1zdGF0aWMgdm9pZCBkb2NrX25vdGlmeShzdHJ1Y3QgZG9ja19zdGF0aW9uICpkcywgdTMyIGV2ZW50KQoraW50IGRvY2tfbm90aWZ5KHN0cnVjdCBhY3BpX2RldmljZSAqYWRldiwgdTMyIGV2ZW50KQogewotCWFjcGlfaGFuZGxlIGhhbmRsZSA9IGRzLT5oYW5kbGU7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICphZGV2ID0gTlVMTDsKKwlhY3BpX2hhbmRsZSBoYW5kbGUgPSBhZGV2LT5oYW5kbGU7CisJc3RydWN0IGRvY2tfc3RhdGlvbiAqZHMgPSBmaW5kX2RvY2tfc3RhdGlvbihoYW5kbGUpOwogCWludCBzdXJwcmlzZV9yZW1vdmFsID0gMDsKIAorCWlmICghZHMpCisJCXJldHVybiAtRU5PREVWOworCiAJLyoKIAkgKiBBY2NvcmRpbmcgdG8gYWNwaSBzcGVjIDMuMGEsIGlmIGEgREVWSUNFX0NIRUNLIG5vdGlmaWNhdGlvbgogCSAqIGlzIHNlbnQgYW5kIF9EQ0sgaXMgcHJlc2VudCwgaXQgaXMgYXNzdW1lZCB0byBtZWFuIGFuIHVuZG9jawpAQCAtNjMyLDcgKzQ3Niw2IEBACiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgQUNQSV9OT1RJRllfQlVTX0NIRUNLOgogCWNhc2UgQUNQSV9OT1RJRllfREVWSUNFX0NIRUNLOgotCQlhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmFkZXYpOwogCQlpZiAoIWRvY2tfaW5fcHJvZ3Jlc3MoZHMpICYmICFhY3BpX2RldmljZV9lbnVtZXJhdGVkKGFkZXYpKSB7CiAJCQliZWdpbl9kb2NrKGRzKTsKIAkJCWRvY2soZHMpOwpAQCAtNjYyLDQ5ICs1MDUsOCBAQAogCQllbHNlCiAJCQlkb2NrX2V2ZW50KGRzLCBldmVudCwgVU5ET0NLX0VWRU5UKTsKIAkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYWNwaV9oYW5kbGVfZXJyKGhhbmRsZSwgIlVua25vd24gZG9jayBldmVudCAlZFxuIiwgZXZlbnQpOwogCX0KLX0KLQotc3RhdGljIHZvaWQgYWNwaV9kb2NrX2RlZmVycmVkX2NiKHZvaWQgKmRhdGEsIHUzMiBldmVudCkKLXsKLQlhY3BpX3NjYW5fbG9ja19hY3F1aXJlKCk7Ci0JZG9ja19ub3RpZnkoZGF0YSwgZXZlbnQpOwotCWFjcGlfc2Nhbl9sb2NrX3JlbGVhc2UoKTsKLX0KLQotc3RhdGljIHZvaWQgZG9ja19ub3RpZnlfaGFuZGxlcihhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKLXsKLQlpZiAoZXZlbnQgIT0gQUNQSV9OT1RJRllfQlVTX0NIRUNLICYmIGV2ZW50ICE9IEFDUElfTk9USUZZX0RFVklDRV9DSEVDSwotCSAgICYmIGV2ZW50ICE9IEFDUElfTk9USUZZX0VKRUNUX1JFUVVFU1QpCi0JCXJldHVybjsKLQotCWFjcGlfaG90cGx1Z19leGVjdXRlKGFjcGlfZG9ja19kZWZlcnJlZF9jYiwgZGF0YSwgZXZlbnQpOwotfQotCi0vKioKLSAqIGZpbmRfZG9ja19kZXZpY2VzIC0gZmluZCBkZXZpY2VzIG9uIHRoZSBkb2NrIHN0YXRpb24KLSAqIEBoYW5kbGU6IHRoZSBoYW5kbGUgb2YgdGhlIGRldmljZSB3ZSBhcmUgZXhhbWluaW5nCi0gKiBAbHZsOiB1bnVzZWQKLSAqIEBjb250ZXh0OiB0aGUgZG9jayBzdGF0aW9uIHByaXZhdGUgZGF0YQotICogQHJ2OiB1bnVzZWQKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBhY3BpX3dhbGtfbmFtZXNwYWNlLiAgSXQgd2lsbAotICogY2hlY2sgdG8gc2VlIGlmIGFuIG9iamVjdCBoYXMgYW4gX0VKRCBtZXRob2QuICBJZiBpdCBkb2VzLCB0aGVuIGl0Ci0gKiB3aWxsIHNlZSBpZiBpdCBpcyBkZXBlbmRlbnQgb24gdGhlIGRvY2sgc3RhdGlvbi4KLSAqLwotc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdCBmaW5kX2RvY2tfZGV2aWNlcyhhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsdmwsCi0JCQkJCSAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcnYpCi17Ci0Jc3RydWN0IGRvY2tfc3RhdGlvbiAqZHMgPSBjb250ZXh0OwotCWFjcGlfaGFuZGxlIGVqZCA9IE5VTEw7Ci0KLQlhY3BpX2J1c19nZXRfZWpkKGhhbmRsZSwgJmVqZCk7Ci0JaWYgKGVqZCA9PSBkcy0+aGFuZGxlKQotCQlhZGRfZG9ja19kZXBlbmRlbnRfZGV2aWNlKGRzLCBoYW5kbGUpOwotCi0JcmV0dXJuIEFFX09LOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtODAzLDIzICs2MDUsMjggQEAKIH07CiAKIC8qKgotICogZG9ja19hZGQgLSBhZGQgYSBuZXcgZG9jayBzdGF0aW9uCi0gKiBAaGFuZGxlOiB0aGUgZG9jayBzdGF0aW9uIGhhbmRsZQorICogYWNwaV9kb2NrX2FkZCAtIEFkZCBhIG5ldyBkb2NrIHN0YXRpb24KKyAqIEBhZGV2OiBEb2NrIHN0YXRpb24gQUNQSSBkZXZpY2Ugb2JqZWN0LgogICoKLSAqIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBkb2NrIHN0YXRpb24gZGV2aWNlLiAgRmluZCBhbGwgZGV2aWNlcwotICogdGhhdCBhcmUgb24gdGhlIGRvY2sgc3RhdGlvbiwgYW5kIHJlZ2lzdGVyIGZvciBkb2NrIGV2ZW50IG5vdGlmaWNhdGlvbnMuCisgKiBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemUgYSBuZXcgZG9jayBzdGF0aW9uIGRldmljZS4KICAqLwotc3RhdGljIGludCBfX2luaXQgZG9ja19hZGQoYWNwaV9oYW5kbGUgaGFuZGxlKQordm9pZCBhY3BpX2RvY2tfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqYWRldikKIHsKIAlzdHJ1Y3QgZG9ja19zdGF0aW9uICpkb2NrX3N0YXRpb24sIGRzID0geyBOVUxMLCB9OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaW5mbyBwZGV2aW5mbzsKKwlhY3BpX2hhbmRsZSBoYW5kbGUgPSBhZGV2LT5oYW5kbGU7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGQ7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwogCWludCByZXQ7CiAKLQlkZCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9kYXRhKE5VTEwsICJkb2NrIiwgZG9ja19zdGF0aW9uX2NvdW50LAotCQkJCQkgICAmZHMsIHNpemVvZihkcykpOworCW1lbXNldCgmcGRldmluZm8sIDAsIHNpemVvZihwZGV2aW5mbykpOworCXBkZXZpbmZvLm5hbWUgPSAiZG9jayI7CisJcGRldmluZm8uaWQgPSBkb2NrX3N0YXRpb25fY291bnQ7CisJcGRldmluZm8uYWNwaV9ub2RlLmNvbXBhbmlvbiA9IGFkZXY7CisJcGRldmluZm8uZGF0YSA9ICZkczsKKwlwZGV2aW5mby5zaXplX2RhdGEgPSBzaXplb2YoZHMpOworCWRkID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2Z1bGwoJnBkZXZpbmZvKTsKIAlpZiAoSVNfRVJSKGRkKSkKLQkJcmV0dXJuIFBUUl9FUlIoZGQpOworCQlyZXR1cm47CiAKIAlkb2NrX3N0YXRpb24gPSBkZC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKQEAgLTgzNyw3MiArNjQ0LDI5IEBACiAJCWRvY2tfc3RhdGlvbi0+ZmxhZ3MgfD0gRE9DS19JU19ET0NLOwogCWlmIChhY3BpX2F0YV9tYXRjaChoYW5kbGUpKQogCQlkb2NrX3N0YXRpb24tPmZsYWdzIHw9IERPQ0tfSVNfQVRBOwotCWlmIChpc19iYXR0ZXJ5KGhhbmRsZSkpCisJaWYgKGFjcGlfZGV2aWNlX2lzX2JhdHRlcnkoYWRldikpCiAJCWRvY2tfc3RhdGlvbi0+ZmxhZ3MgfD0gRE9DS19JU19CQVQ7CiAKIAlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRkLT5kZXYua29iaiwgJmRvY2tfYXR0cmlidXRlX2dyb3VwKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl91bnJlZ2lzdGVyOwogCi0JLyogRmluZCBkZXBlbmRlbnQgZGV2aWNlcyAqLwotCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgQUNQSV9ST09UX09CSkVDVCwKLQkJCSAgICBBQ1BJX1VJTlQzMl9NQVgsIGZpbmRfZG9ja19kZXZpY2VzLCBOVUxMLAotCQkJICAgIGRvY2tfc3RhdGlvbiwgTlVMTCk7Ci0KIAkvKiBhZGQgdGhlIGRvY2sgc3RhdGlvbiBhcyBhIGRldmljZSBkZXBlbmRlbnQgb24gaXRzZWxmICovCi0JcmV0ID0gYWRkX2RvY2tfZGVwZW5kZW50X2RldmljZShkb2NrX3N0YXRpb24sIGhhbmRsZSk7CisJcmV0ID0gYWRkX2RvY2tfZGVwZW5kZW50X2RldmljZShkb2NrX3N0YXRpb24sIGFkZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX3JtZ3JvdXA7CiAKLQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoaGFuZGxlLCBBQ1BJX1NZU1RFTV9OT1RJRlksCi0JCQkJCSAgICAgZG9ja19ub3RpZnlfaGFuZGxlciwgZG9ja19zdGF0aW9uKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBlcnJfcm1ncm91cDsKLQl9Ci0KIAlkb2NrX3N0YXRpb25fY291bnQrKzsKIAlsaXN0X2FkZCgmZG9ja19zdGF0aW9uLT5zaWJsaW5nLCAmZG9ja19zdGF0aW9ucyk7Ci0JcmV0dXJuIDA7CisJYWRldi0+ZmxhZ3MuaXNfZG9ja19zdGF0aW9uID0gdHJ1ZTsKKwlkZXZfaW5mbygmYWRldi0+ZGV2LCAiQUNQSSBkb2NrIHN0YXRpb24gKGRvY2tzL2JheXMgY291bnQ6ICVkKVxuIiwKKwkJIGRvY2tfc3RhdGlvbl9jb3VudCk7CisJcmV0dXJuOwogCiBlcnJfcm1ncm91cDoKLQlyZW1vdmVfZG9ja19kZXBlbmRlbnRfZGV2aWNlcyhkb2NrX3N0YXRpb24pOwogCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGQtPmRldi5rb2JqLCAmZG9ja19hdHRyaWJ1dGVfZ3JvdXApOworCiBlcnJfdW5yZWdpc3RlcjoKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkZCk7CiAJYWNwaV9oYW5kbGVfZXJyKGhhbmRsZSwgIiVzIGVuY291bnRlcmVkIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGZpbmRfZG9ja19hbmRfYmF5IC0gbG9vayBmb3IgZG9jayBzdGF0aW9ucyBhbmQgYmF5cwotICogQGhhbmRsZTogYWNwaSBoYW5kbGUgb2YgYSBkZXZpY2UKLSAqIEBsdmw6IHVudXNlZAotICogQGNvbnRleHQ6IHVudXNlZAotICogQHJ2OiB1bnVzZWQKLSAqCi0gKiBUaGlzIGlzIGNhbGxlZCBieSBhY3BpX3dhbGtfbmFtZXNwYWNlIHRvIGxvb2sgZm9yIGRvY2sgc3RhdGlvbnMgYW5kIGJheXMuCi0gKi8KLXN0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQKLWZpbmRfZG9ja19hbmRfYmF5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGx2bCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJ2KQotewotCWlmIChhY3BpX2RvY2tfbWF0Y2goaGFuZGxlKSB8fCBpc19lamVjdGFibGVfYmF5KGhhbmRsZSkpCi0JCWRvY2tfYWRkKGhhbmRsZSk7Ci0KLQlyZXR1cm4gQUVfT0s7Ci19Ci0KLXZvaWQgX19pbml0IGFjcGlfZG9ja19pbml0KHZvaWQpCi17Ci0JLyogbG9vayBmb3IgZG9jayBzdGF0aW9ucyBhbmQgYmF5cyAqLwotCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgQUNQSV9ST09UX09CSkVDVCwKLQkJQUNQSV9VSU5UMzJfTUFYLCBmaW5kX2RvY2tfYW5kX2JheSwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0KLQlpZiAoIWRvY2tfc3RhdGlvbl9jb3VudCkgewotCQlwcl9pbmZvKFBSRUZJWCAiTm8gZG9jayBkZXZpY2VzIGZvdW5kLlxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcl9pbmZvKFBSRUZJWCAiJXM6ICVkIGRvY2tzL2JheXMgZm91bmRcbiIsCi0JCUFDUElfRE9DS19EUklWRVJfREVTQ1JJUFRJT04sIGRvY2tfc3RhdGlvbl9jb3VudCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZmFuLmMgYi9kcml2ZXJzL2FjcGkvZmFuLmMKaW5kZXggMDllNDIzZi4uOGFjZjUzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Zhbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9mYW4uYwpAQCAtNTUsMTEgKzU1LDE2IEBACiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW50IGFjcGlfZmFuX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgYWNwaV9mYW5fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IGRldl9wbV9vcHMgYWNwaV9mYW5fcG0gPSB7CisJLnJlc3VtZSA9IGFjcGlfZmFuX3Jlc3VtZSwKKwkuZnJlZXplID0gYWNwaV9mYW5fc3VzcGVuZCwKKwkudGhhdyA9IGFjcGlfZmFuX3Jlc3VtZSwKKwkucmVzdG9yZSA9IGFjcGlfZmFuX3Jlc3VtZSwKK307CisjZGVmaW5lIEZBTl9QTV9PUFNfUFRSICgmYWNwaV9mYW5fcG0pCiAjZWxzZQotI2RlZmluZSBhY3BpX2Zhbl9zdXNwZW5kIE5VTEwKLSNkZWZpbmUgYWNwaV9mYW5fcmVzdW1lIE5VTEwKKyNkZWZpbmUgRkFOX1BNX09QU19QVFIgTlVMTAogI2VuZGlmCi1zdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoYWNwaV9mYW5fcG0sIGFjcGlfZmFuX3N1c3BlbmQsIGFjcGlfZmFuX3Jlc3VtZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9mYW5fZHJpdmVyID0gewogCS5uYW1lID0gImZhbiIsCkBAIC02OSw3ICs3NCw3IEBACiAJCS5hZGQgPSBhY3BpX2Zhbl9hZGQsCiAJCS5yZW1vdmUgPSBhY3BpX2Zhbl9yZW1vdmUsCiAJCX0sCi0JLmRydi5wbSA9ICZhY3BpX2Zhbl9wbSwKKwkuZHJ2LnBtID0gRkFOX1BNX09QU19QVFIsCiB9OwogCiAvKiB0aGVybWFsIGNvb2xpbmcgZGV2aWNlIGNhbGxiYWNrcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2dsdWUuYyBiL2RyaXZlcnMvYWNwaS9nbHVlLmMKaW5kZXggMGM3ODkyMi4uZjc3NGM2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2dsdWUuYworKysgYi9kcml2ZXJzL2FjcGkvZ2x1ZS5jCkBAIC0yODcsNiArMjg3LDcgQEAKIHN0YXRpYyBpbnQgYWNwaV9wbGF0Zm9ybV9ub3RpZnkoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBhY3BpX2J1c190eXBlICp0eXBlID0gYWNwaV9nZXRfYnVzX3R5cGUoZGV2KTsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXY7CiAJaW50IHJldDsKIAogCXJldCA9IGFjcGlfYmluZF9vbmUoZGV2LCBOVUxMKTsKQEAgLTMwMyw5ICszMDQsMTQgQEAKIAkJaWYgKHJldCkKIAkJCWdvdG8gb3V0OwogCX0KKwlhZGV2ID0gQUNQSV9DT01QQU5JT04oZGV2KTsKKwlpZiAoIWFkZXYpCisJCWdvdG8gb3V0OwogCiAJaWYgKHR5cGUgJiYgdHlwZS0+c2V0dXApCiAJCXR5cGUtPnNldHVwKGRldik7CisJZWxzZSBpZiAoYWRldi0+aGFuZGxlciAmJiBhZGV2LT5oYW5kbGVyLT5iaW5kKQorCQlhZGV2LT5oYW5kbGVyLT5iaW5kKGRldik7CiAKICBvdXQ6CiAjaWYgQUNQSV9HTFVFX0RFQlVHCkBAIC0zMjQsMTEgKzMzMCwxNyBAQAogCiBzdGF0aWMgaW50IGFjcGlfcGxhdGZvcm1fbm90aWZ5X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IGFjcGlfZGV2aWNlICphZGV2ID0gQUNQSV9DT01QQU5JT04oZGV2KTsKIAlzdHJ1Y3QgYWNwaV9idXNfdHlwZSAqdHlwZTsKIAorCWlmICghYWRldikKKwkJcmV0dXJuIDA7CisKIAl0eXBlID0gYWNwaV9nZXRfYnVzX3R5cGUoZGV2KTsKIAlpZiAodHlwZSAmJiB0eXBlLT5jbGVhbnVwKQogCQl0eXBlLT5jbGVhbnVwKGRldik7CisJZWxzZSBpZiAoYWRldi0+aGFuZGxlciAmJiBhZGV2LT5oYW5kbGVyLT51bmJpbmQpCisJCWFkZXYtPmhhbmRsZXItPnVuYmluZChkZXYpOwogCiAJYWNwaV91bmJpbmRfb25lKGRldik7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaW50ZXJuYWwuaCBiL2RyaXZlcnMvYWNwaS9pbnRlcm5hbC5oCmluZGV4IGRlZGJiMmQuLjk1NzM5MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvYWNwaS9pbnRlcm5hbC5oCkBAIC0zNyw5ICszNywxNSBAQAogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfY29udGFpbmVyX2luaXQodm9pZCkge30KICNlbmRpZgogI2lmZGVmIENPTkZJR19BQ1BJX0RPQ0sKLXZvaWQgYWNwaV9kb2NrX2luaXQodm9pZCk7Cit2b2lkIHJlZ2lzdGVyX2RvY2tfZGVwZW5kZW50X2RldmljZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsCisJCQkJICAgIGFjcGlfaGFuZGxlIGRzaGFuZGxlKTsKK2ludCBkb2NrX25vdGlmeShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsIHUzMiBldmVudCk7Cit2b2lkIGFjcGlfZG9ja19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9kb2NrX2luaXQodm9pZCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCByZWdpc3Rlcl9kb2NrX2RlcGVuZGVudF9kZXZpY2Uoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2LAorCQkJCQkJICBhY3BpX2hhbmRsZSBkc2hhbmRsZSkge30KK3N0YXRpYyBpbmxpbmUgaW50IGRvY2tfbm90aWZ5KHN0cnVjdCBhY3BpX2RldmljZSAqYWRldiwgdTMyIGV2ZW50KSB7IHJldHVybiAtRU5PREVWOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9kb2NrX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpIHt9CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQUNQSV9IT1RQTFVHX01FTU9SWQogdm9pZCBhY3BpX21lbW9yeV9ob3RwbHVnX2luaXQodm9pZCk7CkBAIC03Miw3ICs3OCw5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9scHNzX2luaXQodm9pZCkge30KICNlbmRpZgogCithY3BpX3N0YXR1cyBhY3BpX2hvdHBsdWdfc2NoZWR1bGUoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2LCB1MzIgc3JjKTsKIGJvb2wgYWNwaV9xdWV1ZV9ob3RwbHVnX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3ZvaWQgYWNwaV9kZXZpY2VfaG90cGx1ZyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsIHUzMiBzcmMpOwogYm9vbCBhY3BpX3NjYW5faXNfb2ZmbGluZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsIGJvb2wgdWV2ZW50KTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTkwLDYgKzk4LDcgQEAKIGludCBhY3BpX2JpbmRfb25lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KTsKIGludCBhY3BpX3VuYmluZF9vbmUoc3RydWN0IGRldmljZSAqZGV2KTsKIGJvb2wgYWNwaV9kZXZpY2VfaXNfcHJlc2VudChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpOworYm9vbCBhY3BpX2RldmljZV9pc19iYXR0ZXJ5KHN0cnVjdCBhY3BpX2RldmljZSAqYWRldik7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG93ZXIgUmVzb3VyY2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9udW1hLmMgYi9kcml2ZXJzL2FjcGkvbnVtYS5jCmluZGV4IDllNjgxNmUuLjI0YjU0NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9udW1hLmMKKysrIGIvZHJpdmVycy9hY3BpL251bWEuYwpAQCAtNjAsNyArNjAsNyBAQAogCXJldHVybiBub2RlX3RvX3B4bV9tYXBbbm9kZV07CiB9CiAKLXZvaWQgX19hY3BpX21hcF9weG1fdG9fbm9kZShpbnQgcHhtLCBpbnQgbm9kZSkKK3N0YXRpYyB2b2lkIF9fYWNwaV9tYXBfcHhtX3RvX25vZGUoaW50IHB4bSwgaW50IG5vZGUpCiB7CiAJaWYgKHB4bV90b19ub2RlX21hcFtweG1dID09IE5VTUFfTk9fTk9ERSB8fCBub2RlIDwgcHhtX3RvX25vZGVfbWFwW3B4bV0pCiAJCXB4bV90b19ub2RlX21hcFtweG1dID0gbm9kZTsKQEAgLTE5Myw3ICsxOTMsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIF9faW5pdCBfX2F0dHJpYnV0ZV9fICgod2VhaykpCit2b2lkIF9faW5pdCBfX3dlYWsKIGFjcGlfbnVtYV94MmFwaWNfYWZmaW5pdHlfaW5pdChzdHJ1Y3QgYWNwaV9zcmF0X3gyYXBpY19jcHVfYWZmaW5pdHkgKnBhKQogewogCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCkBAIC0zMTQsNyArMzE0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGFjcGlfZ2V0X3B4bShhY3BpX2hhbmRsZSBoKQorc3RhdGljIGludCBhY3BpX2dldF9weG0oYWNwaV9oYW5kbGUgaCkKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgcHhtOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTMzMSwxNCArMzMxLDE0IEBACiAJcmV0dXJuIC0xOwogfQogCi1pbnQgYWNwaV9nZXRfbm9kZShhY3BpX2hhbmRsZSAqaGFuZGxlKQoraW50IGFjcGlfZ2V0X25vZGUoYWNwaV9oYW5kbGUgaGFuZGxlKQogewotCWludCBweG0sIG5vZGUgPSBOVU1BX05PX05PREU7CisJaW50IHB4bTsKIAogCXB4bSA9IGFjcGlfZ2V0X3B4bShoYW5kbGUpOwotCWlmIChweG0gPj0gMCAmJiBweG0gPCBNQVhfUFhNX0RPTUFJTlMpCi0JCW5vZGUgPSBhY3BpX21hcF9weG1fdG9fbm9kZShweG0pOworCWlmIChweG0gPCAwIHx8IHB4bSA+PSBNQVhfUFhNX0RPTUFJTlMpCisJCXJldHVybiBOVU1BX05PX05PREU7CiAKLQlyZXR1cm4gbm9kZTsKKwlyZXR1cm4gYWNwaV9tYXBfcHhtX3RvX25vZGUocHhtKTsKIH0KIEVYUE9SVF9TWU1CT0woYWNwaV9nZXRfbm9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvb3NsLmMgYi9kcml2ZXJzL2FjcGkvb3NsLmMKaW5kZXggZmMxYWE3OS4uMjdmODRhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL29zbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9vc2wuYwpAQCAtNTIsNyArNTIsNyBAQAogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfT1NfU0VSVklDRVMKIEFDUElfTU9EVUxFX05BTUUoIm9zbCIpOwotI2RlZmluZSBQUkVGSVgJCSJBQ1BJOiAiCisKIHN0cnVjdCBhY3BpX29zX2RwYyB7CiAJYWNwaV9vc2RfZXhlY19jYWxsYmFjayBmdW5jdGlvbjsKIAl2b2lkICpjb250ZXh0OwpAQCAtMTE2OCw4ICsxMTY4LDcgQEAKIAogc3RydWN0IGFjcGlfaHBfd29yayB7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Ci0JYWNwaV9ocF9jYWxsYmFjayBmdW5jOwotCXZvaWQgKmRhdGE7CisJc3RydWN0IGFjcGlfZGV2aWNlICphZGV2OwogCXUzMiBzcmM7CiB9OwogCkBAIC0xMTc4LDI1ICsxMTc3LDI0IEBACiAJc3RydWN0IGFjcGlfaHBfd29yayAqaHB3ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhY3BpX2hwX3dvcmssIHdvcmspOwogCiAJYWNwaV9vc193YWl0X2V2ZW50c19jb21wbGV0ZSgpOwotCWhwdy0+ZnVuYyhocHctPmRhdGEsIGhwdy0+c3JjKTsKKwlhY3BpX2RldmljZV9ob3RwbHVnKGhwdy0+YWRldiwgaHB3LT5zcmMpOwogCWtmcmVlKGhwdyk7CiB9CiAKLWFjcGlfc3RhdHVzIGFjcGlfaG90cGx1Z19leGVjdXRlKGFjcGlfaHBfY2FsbGJhY2sgZnVuYywgdm9pZCAqZGF0YSwgdTMyIHNyYykKK2FjcGlfc3RhdHVzIGFjcGlfaG90cGx1Z19zY2hlZHVsZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsIHUzMiBzcmMpCiB7CiAJc3RydWN0IGFjcGlfaHBfd29yayAqaHB3OwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkgICJTY2hlZHVsaW5nIGZ1bmN0aW9uIFslcCglcCwgJXUpXSBmb3IgZGVmZXJyZWQgZXhlY3V0aW9uLlxuIiwKLQkJICBmdW5jLCBkYXRhLCBzcmMpKTsKKwkJICAiU2NoZWR1bGluZyBob3RwbHVnIGV2ZW50ICglcCwgJXUpIGZvciBkZWZlcnJlZCBleGVjdXRpb24uXG4iLAorCQkgIGFkZXYsIHNyYykpOwogCiAJaHB3ID0ga21hbGxvYyhzaXplb2YoKmhwdyksIEdGUF9LRVJORUwpOwogCWlmICghaHB3KQogCQlyZXR1cm4gQUVfTk9fTUVNT1JZOwogCiAJSU5JVF9XT1JLKCZocHctPndvcmssIGFjcGlfaG90cGx1Z193b3JrX2ZuKTsKLQlocHctPmZ1bmMgPSBmdW5jOwotCWhwdy0+ZGF0YSA9IGRhdGE7CisJaHB3LT5hZGV2ID0gYWRldjsKIAlocHctPnNyYyA9IHNyYzsKIAkvKgogCSAqIFdlIGNhbid0IHJ1biBob3RwbHVnIGNvZGUgaW4ga2FjcGlkX3dxL2thY3BpZF9ub3RpZnlfd3EgZXRjLiwgYmVjYXVzZQpAQCAtMTc4MCw2ICsxNzc4LDE3IEBACiAKIF9fc2V0dXAoImFjcGlfbm9fYXV0b19zc2R0IiwgYWNwaV9ub19hdXRvX3NzZHRfc2V0dXApOwogCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2Rpc2FibGVfcmV0dXJuX3JlcGFpcihjaGFyICpzKQoreworCXByaW50ayhLRVJOX05PVElDRSBQUkVGSVgKKwkgICAgICAgIkFDUEk6IFByZWRlZmluZWQgdmFsaWRhdGlvbiBtZWNoYW5pc20gZGlzYWJsZWRcbiIpOworCWFjcGlfZ2JsX2Rpc2FibGVfYXV0b19yZXBhaXIgPSBUUlVFOworCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImFjcGljYV9ub19yZXR1cm5fcmVwYWlyIiwgYWNwaV9kaXNhYmxlX3JldHVybl9yZXBhaXIpOworCiBhY3BpX3N0YXR1cyBfX2luaXQgYWNwaV9vc19pbml0aWFsaXplKHZvaWQpCiB7CiAJYWNwaV9vc19tYXBfZ2VuZXJpY19hZGRyZXNzKCZhY3BpX2dibF9GQURULnhwbTFhX2V2ZW50X2Jsb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMgYi9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCmluZGV4IDM2MWI0MGMuLjljNjIzNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9pcnEuYwpAQCAtMzcwLDYgKzM3MCwzMCBAQAogCXJldHVybiBOVUxMOwogfQogCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVNBKSB8fCBJU19FTkFCTEVEKENPTkZJR19FSVNBKQorc3RhdGljIGludCBhY3BpX2lzYV9yZWdpc3Rlcl9nc2koc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1MzIgZGV2X2dzaTsKKworCS8qIEludGVycnVwdCBMaW5lIHZhbHVlcyBhYm92ZSAweEYgYXJlIGZvcmJpZGRlbiAqLworCWlmIChkZXYtPmlycSA+IDAgJiYgKGRldi0+aXJxIDw9IDB4RikgJiYKKwkgICAgKGFjcGlfaXNhX2lycV90b19nc2koZGV2LT5pcnEsICZkZXZfZ3NpKSA9PSAwKSkgeworCQlkZXZfd2FybigmZGV2LT5kZXYsICJQQ0kgSU5UICVjOiBubyBHU0kgLSB1c2luZyBJU0EgSVJRICVkXG4iLAorCQkJIHBpbl9uYW1lKGRldi0+cGluKSwgZGV2LT5pcnEpOworCQlhY3BpX3JlZ2lzdGVyX2dzaSgmZGV2LT5kZXYsIGRldl9nc2ksCisJCQkJICBBQ1BJX0xFVkVMX1NFTlNJVElWRSwKKwkJCQkgIEFDUElfQUNUSVZFX0xPVyk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBhY3BpX2lzYV9yZWdpc3Rlcl9nc2koc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKyNlbmRpZgorCiBpbnQgYWNwaV9wY2lfaXJxX2VuYWJsZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBhY3BpX3BydF9lbnRyeSAqZW50cnk7CkBAIC00MTYsMTkgKzQ0MCw5IEBACiAJICogZHJpdmVyIHJlcG9ydGVkIG9uZSwgdGhlbiB1c2UgaXQuIEV4aXQgaW4gYW55IGNhc2UuCiAJICovCiAJaWYgKGdzaSA8IDApIHsKLQkJdTMyIGRldl9nc2k7Ci0JCS8qIEludGVycnVwdCBMaW5lIHZhbHVlcyBhYm92ZSAweEYgYXJlIGZvcmJpZGRlbiAqLwotCQlpZiAoZGV2LT5pcnEgPiAwICYmIChkZXYtPmlycSA8PSAweEYpICYmCi0JCSAgICAoYWNwaV9pc2FfaXJxX3RvX2dzaShkZXYtPmlycSwgJmRldl9nc2kpID09IDApKSB7Ci0JCQlkZXZfd2FybigmZGV2LT5kZXYsICJQQ0kgSU5UICVjOiBubyBHU0kgLSB1c2luZyBJU0EgSVJRICVkXG4iLAotCQkJCSBwaW5fbmFtZShwaW4pLCBkZXYtPmlycSk7Ci0JCQlhY3BpX3JlZ2lzdGVyX2dzaSgmZGV2LT5kZXYsIGRldl9nc2ksCi0JCQkJCSAgQUNQSV9MRVZFTF9TRU5TSVRJVkUsCi0JCQkJCSAgQUNQSV9BQ1RJVkVfTE9XKTsKLQkJfSBlbHNlIHsKKwkJaWYgKGFjcGlfaXNhX3JlZ2lzdGVyX2dzaShkZXYpKQogCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiUENJIElOVCAlYzogbm8gR1NJXG4iLAogCQkJCSBwaW5fbmFtZShwaW4pKTsKLQkJfQogCiAJCWtmcmVlKGVudHJ5KTsKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYyBiL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jCmluZGV4IDk0MThjN2EuLmNmZDc1ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jCisrKyBiL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jCkBAIC00Myw4ICs0Myw2IEBACiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi0jZGVmaW5lIFBSRUZJWCAiQUNQSTogIgotCiAjZGVmaW5lIF9DT01QT05FTlQJCQlBQ1BJX1BDSV9DT01QT05FTlQKIEFDUElfTU9EVUxFX05BTUUoInBjaV9saW5rIik7CiAjZGVmaW5lIEFDUElfUENJX0xJTktfQ0xBU1MJCSJwY2lfaXJxX3JvdXRpbmciCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYyBiL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jCmluZGV4IGMxYzQxMDIuLmQzODhmMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jCkBAIC0zOSw4ICszOSw2IEBACiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi0jZGVmaW5lIFBSRUZJWCAiQUNQSTogIgotCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfUENJX0NPTVBPTkVOVAogQUNQSV9NT0RVTEVfTkFNRSgicGNpX3Jvb3QiKTsKICNkZWZpbmUgQUNQSV9QQ0lfUk9PVF9DTEFTUwkJInBjaV9icmlkZ2UiCkBAIC01MSw3ICs0OSw3IEBACiAKIHN0YXRpYyBpbnQgYWNwaV9wY2lfcm9vdF9zY2FuX2RlcGVuZGVudChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpCiB7Ci0JYWNwaXBocF9jaGVja19ob3N0X2JyaWRnZShhZGV2LT5oYW5kbGUpOworCWFjcGlwaHBfY2hlY2tfaG9zdF9icmlkZ2UoYWRldik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wb3dlci5jIGIvZHJpdmVycy9hY3BpL3Bvd2VyLmMKaW5kZXggYWQ3ZGE2OC4uZTBiY2ZiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Bvd2VyLmMKKysrIGIvZHJpdmVycy9hY3BpL3Bvd2VyLmMKQEAgLTQ2LDggKzQ2LDYgQEAKICNpbmNsdWRlICJzbGVlcC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKLSNkZWZpbmUgUFJFRklYICJBQ1BJOiAiCi0KICNkZWZpbmUgX0NPTVBPTkVOVAkJCUFDUElfUE9XRVJfQ09NUE9ORU5UCiBBQ1BJX01PRFVMRV9OQU1FKCJwb3dlciIpOwogI2RlZmluZSBBQ1BJX1BPV0VSX0NMQVNTCQkicG93ZXJfcmVzb3VyY2UiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCmluZGV4IGE0ZWVhOWEuLjg2ZDczZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCkBAIC0xNSwyOCArMTUsOSBAQAogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotI2RlZmluZSBQUkVGSVgJCQkiQUNQSTogIgogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1BST0NFU1NPUl9DT01QT05FTlQKIEFDUElfTU9EVUxFX05BTUUoInByb2Nlc3Nvcl9jb3JlIik7CiAKLXN0YXRpYyBpbnQgX19pbml0IHNldF9ub19td2FpdChjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCi17Ci0JcHJpbnRrKEtFUk5fTk9USUNFIFBSRUZJWCAiJXMgZGV0ZWN0ZWQgLSAiCi0JCSJkaXNhYmxpbmcgbXdhaXQgZm9yIENQVSBDLXN0YXRlc1xuIiwgaWQtPmlkZW50KTsKLQlib290X29wdGlvbl9pZGxlX292ZXJyaWRlID0gSURMRV9OT01XQUlUOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgcHJvY2Vzc29yX2lkbGVfZG1pX3RhYmxlW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0Jc2V0X25vX213YWl0LCAiRXh0ZW5zYSA1MjIwIiwgewotCURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJQaG9lbml4IFRlY2hub2xvZ2llcyBMVEQiKSwKLQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyIiksCi0JRE1JX01BVENIKERNSV9QUk9EVUNUX1ZFUlNJT04sICIwMTAwIiksCi0JRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiQ29sdW1iaWEiKSB9LCBOVUxMfSwKLQl7fSwKLX07Ci0KIHN0YXRpYyBpbnQgbWFwX2xhcGljX2lkKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqZW50cnksCiAJCSB1MzIgYWNwaV9pZCwgaW50ICphcGljX2lkKQogewpAQCAtODksNiArNzAsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtYXBfZ2ljX2lkKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqZW50cnksCisJCWludCBkZXZpY2VfZGVjbGFyYXRpb24sIHUzMiBhY3BpX2lkLCBpbnQgKmFwaWNfaWQpCit7CisJc3RydWN0IGFjcGlfbWFkdF9nZW5lcmljX2ludGVycnVwdCAqZ2ljID0KKwkJKHN0cnVjdCBhY3BpX21hZHRfZ2VuZXJpY19pbnRlcnJ1cHQgKillbnRyeTsKKworCWlmICghKGdpYy0+ZmxhZ3MgJiBBQ1BJX01BRFRfRU5BQkxFRCkpCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKwkgKiBJbiB0aGUgR0lDIGludGVycnVwdCBtb2RlbCwgbG9naWNhbCBwcm9jZXNzb3JzIGFyZQorCSAqIHJlcXVpcmVkIHRvIGhhdmUgYSBQcm9jZXNzb3IgRGV2aWNlIG9iamVjdCBpbiB0aGUgRFNEVCwKKwkgKiBzbyB3ZSBzaG91bGQgY2hlY2sgZGV2aWNlX2RlY2xhcmF0aW9uIGhlcmUKKwkgKi8KKwlpZiAoZGV2aWNlX2RlY2xhcmF0aW9uICYmIChnaWMtPnVpZCA9PSBhY3BpX2lkKSkgeworCQkqYXBpY19pZCA9IGdpYy0+Z2ljX2lkOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwogc3RhdGljIGludCBtYXBfbWFkdF9lbnRyeShpbnQgdHlwZSwgdTMyIGFjcGlfaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBtYWR0X2VuZCwgZW50cnk7CkBAIC0xMjQsNiArMTI3LDkgQEAKIAkJfSBlbHNlIGlmIChoZWFkZXItPnR5cGUgPT0gQUNQSV9NQURUX1RZUEVfTE9DQUxfU0FQSUMpIHsKIAkJCWlmICghbWFwX2xzYXBpY19pZChoZWFkZXIsIHR5cGUsIGFjcGlfaWQsICZhcGljX2lkKSkKIAkJCQlicmVhazsKKwkJfSBlbHNlIGlmIChoZWFkZXItPnR5cGUgPT0gQUNQSV9NQURUX1RZUEVfR0VORVJJQ19JTlRFUlJVUFQpIHsKKwkJCWlmICghbWFwX2dpY19pZChoZWFkZXIsIHR5cGUsIGFjcGlfaWQsICZhcGljX2lkKSkKKwkJCQlicmVhazsKIAkJfQogCQllbnRyeSArPSBoZWFkZXItPmxlbmd0aDsKIAl9CkBAIC0xNTQsNiArMTYwLDggQEAKIAkJbWFwX2xhcGljX2lkKGhlYWRlciwgYWNwaV9pZCwgJmFwaWNfaWQpOwogCX0gZWxzZSBpZiAoaGVhZGVyLT50eXBlID09IEFDUElfTUFEVF9UWVBFX0xPQ0FMX1NBUElDKSB7CiAJCW1hcF9sc2FwaWNfaWQoaGVhZGVyLCB0eXBlLCBhY3BpX2lkLCAmYXBpY19pZCk7CisJfSBlbHNlIGlmIChoZWFkZXItPnR5cGUgPT0gQUNQSV9NQURUX1RZUEVfR0VORVJJQ19JTlRFUlJVUFQpIHsKKwkJbWFwX2dpY19pZChoZWFkZXIsIHR5cGUsIGFjcGlfaWQsICZhcGljX2lkKTsKIAl9CiAKIGV4aXQ6CkBAIC0zMjMsNyArMzMxLDcgQEAKICAqIF9QREMgaXMgcmVxdWlyZWQgZm9yIGEgQklPUy1PUyBoYW5kc2hha2UgZm9yIG1vc3Qgb2YgdGhlIG5ld2VyCiAgKiBBQ1BJIHByb2Nlc3NvciBmZWF0dXJlcy4KICAqLwotc3RhdGljIGludAorc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3Byb2Nlc3Nvcl9ldmFsX3BkYyhhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpwZGNfaW4pCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CkBAIC0zNzksMTYgKzM4Nyw0MyBAQAogCXJldHVybiBBRV9PSzsKIH0KIAotdm9pZCBfX2luaXQgYWNwaV9lYXJseV9wcm9jZXNzb3Jfc2V0X3BkYyh2b2lkKQorI2lmIGRlZmluZWQoQ09ORklHX1g4NikgfHwgZGVmaW5lZChDT05GSUdfSUE2NCkKK3N0YXRpYyBpbnQgX19pbml0IHNldF9ub19td2FpdChjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCit7CisJcHJfbm90aWNlKFBSRUZJWCAiJXMgZGV0ZWN0ZWQgLSBkaXNhYmxpbmcgbXdhaXQgZm9yIENQVSBDLXN0YXRlc1xuIiwKKwkJICBpZC0+aWRlbnQpOworCWJvb3Rfb3B0aW9uX2lkbGVfb3ZlcnJpZGUgPSBJRExFX05PTVdBSVQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBwcm9jZXNzb3JfaWRsZV9kbWlfdGFibGVbXSBfX2luaXRkYXRhID0geworCXsKKwlzZXRfbm9fbXdhaXQsICJFeHRlbnNhIDUyMjAiLCB7CisJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKwlETUlfTUFUQ0goRE1JX1BST0RVQ1RfVkVSU0lPTiwgIjAxMDAiKSwKKwlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJDb2x1bWJpYSIpIH0sIE5VTEx9LAorCXt9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHByb2Nlc3Nvcl9kbWlfY2hlY2sodm9pZCkKIHsKIAkvKgogCSAqIENoZWNrIHdoZXRoZXIgdGhlIHN5c3RlbSBpcyBETUkgdGFibGUuIElmIHllcywgT1NQTQogCSAqIHNob3VsZCBub3QgdXNlIG13YWl0IGZvciBDUFUtc3RhdGVzLgogCSAqLwogCWRtaV9jaGVja19zeXN0ZW0ocHJvY2Vzc29yX2lkbGVfZG1pX3RhYmxlKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcHJvY2Vzc29yX2RtaV9jaGVjayh2b2lkKSB7fQorI2VuZGlmCisKK3ZvaWQgX19pbml0IGFjcGlfZWFybHlfcHJvY2Vzc29yX3NldF9wZGModm9pZCkKK3sKKwlwcm9jZXNzb3JfZG1pX2NoZWNrKCk7CiAKIAlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9QUk9DRVNTT1IsIEFDUElfUk9PVF9PQkpFQ1QsCiAJCQkgICAgQUNQSV9VSU5UMzJfTUFYLAogCQkJICAgIGVhcmx5X2luaXRfcGRjLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQlhY3BpX2dldF9kZXZpY2VzKCJBQ1BJMDAwNyIsIGVhcmx5X2luaXRfcGRjLCBOVUxMLCBOVUxMKTsKKwlhY3BpX2dldF9kZXZpY2VzKEFDUElfUFJPQ0VTU09SX0RFVklDRV9ISUQsIGVhcmx5X2luaXRfcGRjLCBOVUxMLCBOVUxMKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfZHJpdmVyLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2RyaXZlci5jCmluZGV4IGMxYzM1NjIuLjdmNzBmMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfZHJpdmVyLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9kcml2ZXIuYwpAQCAtNDEsOCArNDEsNiBAQAogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotI2RlZmluZSBQUkVGSVggIkFDUEk6ICIKLQogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9OT1RJRllfUEVSRk9STUFOQ0UgMHg4MAogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9OT1RJRllfUE9XRVIJMHg4MQogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9OT1RJRllfVEhST1RUTElORwkweDgyCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCmluZGV4IGZmOTAwNTQuLmNmYzhhYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCkBAIC0xNTYsMTcgKzE1Niw5IEBACiAgKi8KIHN0YXRpYyB2b2lkIGFjcGlfcHJvY2Vzc29yX3BwY19vc3QoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgc3RhdHVzKQogewotCXVuaW9uIGFjcGlfb2JqZWN0IHBhcmFtc1syXSA9IHsKLQkJey50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVIsfSwKLQkJey50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVIsfSwKLQl9OwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0ID0gezIsIHBhcmFtc307Ci0KLQlpZiAoYWNwaV9oYXNfbWV0aG9kKGhhbmRsZSwgIl9PU1QiKSkgewotCQlwYXJhbXNbMF0uaW50ZWdlci52YWx1ZSA9IEFDUElfUFJPQ0VTU09SX05PVElGWV9QRVJGT1JNQU5DRTsKLQkJcGFyYW1zWzFdLmludGVnZXIudmFsdWUgPSAgc3RhdHVzOwotCQlhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsICJfT1NUIiwgJmFyZ19saXN0LCBOVUxMKTsKLQl9CisJaWYgKGFjcGlfaGFzX21ldGhvZChoYW5kbGUsICJfT1NUIikpCisJCWFjcGlfZXZhbHVhdGVfb3N0KGhhbmRsZSwgQUNQSV9QUk9DRVNTT1JfTk9USUZZX1BFUkZPUk1BTkNFLAorCQkJCSAgc3RhdHVzLCBOVUxMKTsKIH0KIAogaW50IGFjcGlfcHJvY2Vzc29yX3BwY19oYXNfY2hhbmdlZChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLCBpbnQgZXZlbnRfZmxhZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zYnMuYyBiL2RyaXZlcnMvYWNwaS9zYnMuYwppbmRleCBkYmQ0ODQ5Li4zNjZjYTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2JzLmMKKysrIGIvZHJpdmVycy9hY3BpL3Nicy5jCkBAIC0zNywxMiArMzcsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KIAogI2luY2x1ZGUgInNic2hjLmgiCisjaW5jbHVkZSAiYmF0dGVyeS5oIgogCiAjZGVmaW5lIFBSRUZJWCAiQUNQSTogIgogCiAjZGVmaW5lIEFDUElfU0JTX0NMQVNTCQkJInNicyIKICNkZWZpbmUgQUNQSV9BQ19DTEFTUwkJCSJhY19hZGFwdGVyIgotI2RlZmluZSBBQ1BJX0JBVFRFUllfQ0xBU1MJCSJiYXR0ZXJ5IgogI2RlZmluZSBBQ1BJX1NCU19ERVZJQ0VfTkFNRQkJIlNtYXJ0IEJhdHRlcnkgU3lzdGVtIgogI2RlZmluZSBBQ1BJX1NCU19GSUxFX0lORk8JCSJpbmZvIgogI2RlZmluZSBBQ1BJX1NCU19GSUxFX1NUQVRFCQkic3RhdGUiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2Nhbi5jIGIvZHJpdmVycy9hY3BpL3NjYW4uYwppbmRleCA1N2IwNTNmLi43ZWZlNTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2Nhbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9zY2FuLmMKQEAgLTQxLDYgKzQxLDcgQEAKIHN0YXRpYyBMSVNUX0hFQUQoYWNwaV9zY2FuX2hhbmRsZXJzX2xpc3QpOwogREVGSU5FX01VVEVYKGFjcGlfZGV2aWNlX2xvY2spOwogTElTVF9IRUFEKGFjcGlfd2FrZXVwX2RldmljZV9saXN0KTsKK3N0YXRpYyBERUZJTkVfTVVURVgoYWNwaV9ocF9jb250ZXh0X2xvY2spOwogCiBzdHJ1Y3QgYWNwaV9kZXZpY2VfYnVzX2lkewogCWNoYXIgYnVzX2lkWzE1XTsKQEAgLTYwLDYgKzYxLDI3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhY3BpX3NjYW5fbG9ja19yZWxlYXNlKTsKIAordm9pZCBhY3BpX2xvY2tfaHBfY29udGV4dCh2b2lkKQoreworCW11dGV4X2xvY2soJmFjcGlfaHBfY29udGV4dF9sb2NrKTsKK30KKwordm9pZCBhY3BpX3VubG9ja19ocF9jb250ZXh0KHZvaWQpCit7CisJbXV0ZXhfdW5sb2NrKCZhY3BpX2hwX2NvbnRleHRfbG9jayk7Cit9CisKK3ZvaWQgYWNwaV9pbml0aWFsaXplX2hwX2NvbnRleHQoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2LAorCQkJCXN0cnVjdCBhY3BpX2hvdHBsdWdfY29udGV4dCAqaHAsCisJCQkJaW50ICgqbm90aWZ5KShzdHJ1Y3QgYWNwaV9kZXZpY2UgKiwgdTMyKSwKKwkJCQl2b2lkICgqdWV2ZW50KShzdHJ1Y3QgYWNwaV9kZXZpY2UgKiwgdTMyKSkKK3sKKwlhY3BpX2xvY2tfaHBfY29udGV4dCgpOworCWFjcGlfc2V0X2hwX2NvbnRleHQoYWRldiwgaHAsIG5vdGlmeSwgdWV2ZW50LCBOVUxMKTsKKwlhY3BpX3VubG9ja19ocF9jb250ZXh0KCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhY3BpX2luaXRpYWxpemVfaHBfY29udGV4dCk7CisKIGludCBhY3BpX3NjYW5fYWRkX2hhbmRsZXIoc3RydWN0IGFjcGlfc2Nhbl9oYW5kbGVyICpoYW5kbGVyKQogewogCWlmICghaGFuZGxlciB8fCAhaGFuZGxlci0+YXR0YWNoKQpAQCAtNDM5LDkyICs0NjEsNzcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYWNwaV9kZXZpY2VfaG90cGx1Zyh2b2lkICpkYXRhLCB1MzIgc3JjKQorc3RhdGljIGludCBhY3BpX2dlbmVyaWNfaG90cGx1Z19ldmVudChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsIHUzMiB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQUNQSV9OT1RJRllfQlVTX0NIRUNLOgorCQlyZXR1cm4gYWNwaV9zY2FuX2J1c19jaGVjayhhZGV2KTsKKwljYXNlIEFDUElfTk9USUZZX0RFVklDRV9DSEVDSzoKKwkJcmV0dXJuIGFjcGlfc2Nhbl9kZXZpY2VfY2hlY2soYWRldik7CisJY2FzZSBBQ1BJX05PVElGWV9FSkVDVF9SRVFVRVNUOgorCWNhc2UgQUNQSV9PU1RfRUNfT1NQTV9FSkVDVDoKKwkJaWYgKGFkZXYtPmhhbmRsZXIgJiYgIWFkZXYtPmhhbmRsZXItPmhvdHBsdWcuZW5hYmxlZCkgeworCQkJZGV2X2luZm8oJmFkZXYtPmRldiwgIkVqZWN0IGRpc2FibGVkXG4iKTsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKwkJYWNwaV9ldmFsdWF0ZV9vc3QoYWRldi0+aGFuZGxlLCBBQ1BJX05PVElGWV9FSkVDVF9SRVFVRVNULAorCQkJCSAgQUNQSV9PU1RfU0NfRUpFQ1RfSU5fUFJPR1JFU1MsIE5VTEwpOworCQlyZXR1cm4gYWNwaV9zY2FuX2hvdF9yZW1vdmUoYWRldik7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCit2b2lkIGFjcGlfZGV2aWNlX2hvdHBsdWcoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2LCB1MzIgc3JjKQogewogCXUzMiBvc3RfY29kZSA9IEFDUElfT1NUX1NDX05PTl9TUEVDSUZJQ19GQUlMVVJFOwotCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiA9IGRhdGE7Ci0JaW50IGVycm9yOworCWludCBlcnJvciA9IC1FTk9ERVY7CiAKIAlsb2NrX2RldmljZV9ob3RwbHVnKCk7CiAJbXV0ZXhfbG9jaygmYWNwaV9zY2FuX2xvY2spOwogCiAJLyoKIAkgKiBUaGUgZGV2aWNlIG9iamVjdCdzIEFDUEkgaGFuZGxlIGNhbm5vdCBiZWNvbWUgaW52YWxpZCBhcyBsb25nIGFzIHdlCi0JICogYXJlIGhvbGRpbmcgYWNwaV9zY2FuX2xvY2ssIGJ1dCBpdCBtYXkgaGF2ZSBiZWNvbWUgaW52YWxpZCBiZWZvcmUKKwkgKiBhcmUgaG9sZGluZyBhY3BpX3NjYW5fbG9jaywgYnV0IGl0IG1pZ2h0IGhhdmUgYmVjb21lIGludmFsaWQgYmVmb3JlCiAJICogdGhhdCBsb2NrIHdhcyBhY3F1aXJlZC4KIAkgKi8KIAlpZiAoYWRldi0+aGFuZGxlID09IElOVkFMSURfQUNQSV9IQU5ETEUpCi0JCWdvdG8gb3V0OworCQlnb3RvIGVycl9vdXQ7CiAKLQlzd2l0Y2ggKHNyYykgewotCWNhc2UgQUNQSV9OT1RJRllfQlVTX0NIRUNLOgotCQllcnJvciA9IGFjcGlfc2Nhbl9idXNfY2hlY2soYWRldik7Ci0JCWJyZWFrOwotCWNhc2UgQUNQSV9OT1RJRllfREVWSUNFX0NIRUNLOgotCQllcnJvciA9IGFjcGlfc2Nhbl9kZXZpY2VfY2hlY2soYWRldik7Ci0JCWJyZWFrOwotCWNhc2UgQUNQSV9OT1RJRllfRUpFQ1RfUkVRVUVTVDoKLQljYXNlIEFDUElfT1NUX0VDX09TUE1fRUpFQ1Q6Ci0JCWVycm9yID0gYWNwaV9zY2FuX2hvdF9yZW1vdmUoYWRldik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVycm9yID0gLUVJTlZBTDsKLQkJYnJlYWs7CisJaWYgKGFkZXYtPmZsYWdzLmlzX2RvY2tfc3RhdGlvbikgeworCQllcnJvciA9IGRvY2tfbm90aWZ5KGFkZXYsIHNyYyk7CisJfSBlbHNlIGlmIChhZGV2LT5mbGFncy5ob3RwbHVnX25vdGlmeSkgeworCQllcnJvciA9IGFjcGlfZ2VuZXJpY19ob3RwbHVnX2V2ZW50KGFkZXYsIHNyYyk7CisJCWlmIChlcnJvciA9PSAtRVBFUk0pIHsKKwkJCW9zdF9jb2RlID0gQUNQSV9PU1RfU0NfRUpFQ1RfTk9UX1NVUFBPUlRFRDsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCX0gZWxzZSB7CisJCWludCAoKm5vdGlmeSkoc3RydWN0IGFjcGlfZGV2aWNlICosIHUzMik7CisKKwkJYWNwaV9sb2NrX2hwX2NvbnRleHQoKTsKKwkJbm90aWZ5ID0gYWRldi0+aHAgPyBhZGV2LT5ocC0+bm90aWZ5IDogTlVMTDsKKwkJYWNwaV91bmxvY2tfaHBfY29udGV4dCgpOworCQkvKgorCQkgKiBUaGVyZSBtYXkgYmUgYWRkaXRpb25hbCBub3RpZnkgaGFuZGxlcnMgZm9yIGRldmljZSBvYmplY3RzCisJCSAqIHdpdGhvdXQgdGhlIC5ldmVudCgpIGNhbGxiYWNrLCBzbyBpZ25vcmUgdGhlbSBoZXJlLgorCQkgKi8KKwkJaWYgKG5vdGlmeSkKKwkJCWVycm9yID0gbm90aWZ5KGFkZXYsIHNyYyk7CisJCWVsc2UKKwkJCWdvdG8gb3V0OwogCX0KIAlpZiAoIWVycm9yKQogCQlvc3RfY29kZSA9IEFDUElfT1NUX1NDX1NVQ0NFU1M7CiAKKyBlcnJfb3V0OgorCWFjcGlfZXZhbHVhdGVfb3N0KGFkZXYtPmhhbmRsZSwgc3JjLCBvc3RfY29kZSwgTlVMTCk7CisKICBvdXQ6Ci0JYWNwaV9ldmFsdWF0ZV9ob3RwbHVnX29zdChhZGV2LT5oYW5kbGUsIHNyYywgb3N0X2NvZGUsIE5VTEwpOwotCXB1dF9kZXZpY2UoJmFkZXYtPmRldik7CisJYWNwaV9idXNfcHV0X2FjcGlfZGV2aWNlKGFkZXYpOwogCW11dGV4X3VubG9jaygmYWNwaV9zY2FuX2xvY2spOwogCXVubG9ja19kZXZpY2VfaG90cGx1ZygpOwogfQogCi1zdGF0aWMgdm9pZCBhY3BpX2hvdHBsdWdfbm90aWZ5X2NiKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIHR5cGUsIHZvaWQgKmRhdGEpCi17Ci0JdTMyIG9zdF9jb2RlID0gQUNQSV9PU1RfU0NfTk9OX1NQRUNJRklDX0ZBSUxVUkU7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICphZGV2OwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCWlmIChhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmFkZXYpKQotCQlnb3RvIGVycl9vdXQ7Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIEFDUElfTk9USUZZX0JVU19DSEVDSzoKLQkJYWNwaV9oYW5kbGVfZGVidWcoaGFuZGxlLCAiQUNQSV9OT1RJRllfQlVTX0NIRUNLIGV2ZW50XG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBBQ1BJX05PVElGWV9ERVZJQ0VfQ0hFQ0s6Ci0JCWFjcGlfaGFuZGxlX2RlYnVnKGhhbmRsZSwgIkFDUElfTk9USUZZX0RFVklDRV9DSEVDSyBldmVudFxuIik7Ci0JCWJyZWFrOwotCWNhc2UgQUNQSV9OT1RJRllfRUpFQ1RfUkVRVUVTVDoKLQkJYWNwaV9oYW5kbGVfZGVidWcoaGFuZGxlLCAiQUNQSV9OT1RJRllfRUpFQ1RfUkVRVUVTVCBldmVudFxuIik7Ci0JCWlmICghYWRldi0+aGFuZGxlcikKLQkJCWdvdG8gZXJyX291dDsKLQotCQlpZiAoIWFkZXYtPmhhbmRsZXItPmhvdHBsdWcuZW5hYmxlZCkgewotCQkJYWNwaV9oYW5kbGVfZXJyKGhhbmRsZSwgIkVqZWN0IGRpc2FibGVkXG4iKTsKLQkJCW9zdF9jb2RlID0gQUNQSV9PU1RfU0NfRUpFQ1RfTk9UX1NVUFBPUlRFRDsKLQkJCWdvdG8gZXJyX291dDsKLQkJfQotCQlhY3BpX2V2YWx1YXRlX2hvdHBsdWdfb3N0KGhhbmRsZSwgQUNQSV9OT1RJRllfRUpFQ1RfUkVRVUVTVCwKLQkJCQkJICBBQ1BJX09TVF9TQ19FSkVDVF9JTl9QUk9HUkVTUywgTlVMTCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIG5vbi1ob3RwbHVnIGV2ZW50OyBwb3NzaWJseSBoYW5kbGVkIGJ5IG90aGVyIGhhbmRsZXIgKi8KLQkJcmV0dXJuOwotCX0KLQlnZXRfZGV2aWNlKCZhZGV2LT5kZXYpOwotCXN0YXR1cyA9IGFjcGlfaG90cGx1Z19leGVjdXRlKGFjcGlfZGV2aWNlX2hvdHBsdWcsIGFkZXYsIHR5cGUpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKLQkJcmV0dXJuOwotCi0JcHV0X2RldmljZSgmYWRldi0+ZGV2KTsKLQotIGVycl9vdXQ6Ci0JYWNwaV9ldmFsdWF0ZV9ob3RwbHVnX29zdChoYW5kbGUsIHR5cGUsIG9zdF9jb2RlLCBOVUxMKTsKLX0KLQogc3RhdGljIHNzaXplX3QgcmVhbF9wb3dlcl9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CkBAIC01NzAsMTcgKzU3NywxNCBAQAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCAhYWNwaV9kZXZpY2UtPmZsYWdzLmVqZWN0YWJsZSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlhY3BpX2V2YWx1YXRlX2hvdHBsdWdfb3N0KGFjcGlfZGV2aWNlLT5oYW5kbGUsIEFDUElfT1NUX0VDX09TUE1fRUpFQ1QsCi0JCQkJICBBQ1BJX09TVF9TQ19FSkVDVF9JTl9QUk9HUkVTUywgTlVMTCk7CiAJZ2V0X2RldmljZSgmYWNwaV9kZXZpY2UtPmRldik7Ci0Jc3RhdHVzID0gYWNwaV9ob3RwbHVnX2V4ZWN1dGUoYWNwaV9kZXZpY2VfaG90cGx1ZywgYWNwaV9kZXZpY2UsCi0JCQkJICAgICAgQUNQSV9PU1RfRUNfT1NQTV9FSkVDVCk7CisJc3RhdHVzID0gYWNwaV9ob3RwbHVnX3NjaGVkdWxlKGFjcGlfZGV2aWNlLCBBQ1BJX09TVF9FQ19PU1BNX0VKRUNUKTsKIAlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCiAJCXJldHVybiBjb3VudDsKIAogCXB1dF9kZXZpY2UoJmFjcGlfZGV2aWNlLT5kZXYpOwotCWFjcGlfZXZhbHVhdGVfaG90cGx1Z19vc3QoYWNwaV9kZXZpY2UtPmhhbmRsZSwgQUNQSV9PU1RfRUNfT1NQTV9FSkVDVCwKLQkJCQkgIEFDUElfT1NUX1NDX05PTl9TUEVDSUZJQ19GQUlMVVJFLCBOVUxMKTsKKwlhY3BpX2V2YWx1YXRlX29zdChhY3BpX2RldmljZS0+aGFuZGxlLCBBQ1BJX09TVF9FQ19PU1BNX0VKRUNULAorCQkJICBBQ1BJX09TVF9TQ19OT05fU1BFQ0lGSUNfRkFJTFVSRSwgTlVMTCk7CiAJcmV0dXJuIHN0YXR1cyA9PSBBRV9OT19NRU1PUlkgPyAtRU5PTUVNIDogLUVBR0FJTjsKIH0KIApAQCAtMTExNCwxNCArMTExOCwxNiBAQAogCW11dGV4X3VubG9jaygmYWNwaV9kZXZpY2VfZGVsX2xvY2spOwogfQogCi1pbnQgYWNwaV9idXNfZ2V0X2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2RldmljZSAqKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9nZXRfZGV2aWNlX2RhdGEoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UgKipkZXZpY2UsCisJCQkJdm9pZCAoKmNhbGxiYWNrKSh2b2lkICopKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCWlmICghZGV2aWNlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXN0YXR1cyA9IGFjcGlfZ2V0X2RhdGEoaGFuZGxlLCBhY3BpX3NjYW5fZHJvcF9kZXZpY2UsICh2b2lkICoqKWRldmljZSk7CisJc3RhdHVzID0gYWNwaV9nZXRfZGF0YV9mdWxsKGhhbmRsZSwgYWNwaV9zY2FuX2Ryb3BfZGV2aWNlLAorCQkJCSAgICAodm9pZCAqKilkZXZpY2UsIGNhbGxiYWNrKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgISpkZXZpY2UpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiTm8gY29udGV4dCBmb3Igb2JqZWN0IFslcF1cbiIsCiAJCQkJICBoYW5kbGUpKTsKQEAgLTExMjksOCArMTEzNSwzMiBAQAogCX0KIAlyZXR1cm4gMDsKIH0KKworaW50IGFjcGlfYnVzX2dldF9kZXZpY2UoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UgKipkZXZpY2UpCit7CisJcmV0dXJuIGFjcGlfZ2V0X2RldmljZV9kYXRhKGhhbmRsZSwgZGV2aWNlLCBOVUxMKTsKK30KIEVYUE9SVF9TWU1CT0woYWNwaV9idXNfZ2V0X2RldmljZSk7CiAKK3N0YXRpYyB2b2lkIGdldF9hY3BpX2RldmljZSh2b2lkICpkZXYpCit7CisJaWYgKGRldikKKwkJZ2V0X2RldmljZSgmKChzdHJ1Y3QgYWNwaV9kZXZpY2UgKilkZXYpLT5kZXYpOworfQorCitzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfYnVzX2dldF9hY3BpX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJc3RydWN0IGFjcGlfZGV2aWNlICphZGV2ID0gTlVMTDsKKworCWFjcGlfZ2V0X2RldmljZV9kYXRhKGhhbmRsZSwgJmFkZXYsIGdldF9hY3BpX2RldmljZSk7CisJcmV0dXJuIGFkZXY7Cit9CisKK3ZvaWQgYWNwaV9idXNfcHV0X2FjcGlfZGV2aWNlKHN0cnVjdCBhY3BpX2RldmljZSAqYWRldikKK3sKKwlwdXRfZGV2aWNlKCZhZGV2LT5kZXYpOworfQorCiBpbnQgYWNwaV9kZXZpY2VfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAogCQkgICAgdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBkZXZpY2UgKikpCiB7CkBAIC0xNjQxLDYgKzE2NzEsMjcgQEAKIAlyZXR1cm4gYWNwaV9hdGFfbWF0Y2gocGhhbmRsZSk7CiB9CiAKK2Jvb2wgYWNwaV9kZXZpY2VfaXNfYmF0dGVyeShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpCit7CisJc3RydWN0IGFjcGlfaGFyZHdhcmVfaWQgKmh3aWQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGh3aWQsICZhZGV2LT5wbnAuaWRzLCBsaXN0KQorCQlpZiAoIXN0cmNtcCgiUE5QMEMwQSIsIGh3aWQtPmlkKSkKKwkJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpc19lamVjdGFibGVfYmF5KHN0cnVjdCBhY3BpX2RldmljZSAqYWRldikKK3sKKwlhY3BpX2hhbmRsZSBoYW5kbGUgPSBhZGV2LT5oYW5kbGU7CisKKwlpZiAoYWNwaV9oYXNfbWV0aG9kKGhhbmRsZSwgIl9FSjAiKSAmJiBhY3BpX2RldmljZV9pc19iYXR0ZXJ5KGFkZXYpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBhY3BpX2JheV9tYXRjaChoYW5kbGUpOworfQorCiAvKgogICogYWNwaV9kb2NrX21hdGNoIC0gc2VlIGlmIGFuIGFjcGkgb2JqZWN0IGhhcyBhIF9EQ0sgbWV0aG9kCiAgKi8KQEAgLTE3MDYsNiArMTc1NywyMCBAQAogCXJldHVybiBmYWxzZTsKIH0KIAorc3RhdGljIGJvb2wgYWNwaV9vYmplY3RfaXNfc3lzdGVtX2J1cyhhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJYWNwaV9oYW5kbGUgdG1wOworCisJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoTlVMTCwgIlxcX1NCIiwgJnRtcCkpICYmCisJICAgIHRtcCA9PSBoYW5kbGUpCisJCXJldHVybiB0cnVlOworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKE5VTEwsICJcXF9UWiIsICZ0bXApKSAmJgorCSAgICB0bXAgPT0gaGFuZGxlKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKwogc3RhdGljIHZvaWQgYWNwaV9zZXRfcG5wX2lkcyhhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2RldmljZV9wbnAgKnBucCwKIAkJCQlpbnQgZGV2aWNlX3R5cGUpCiB7CkBAIC0xNzU3LDggKzE4MjIsMTAgQEAKIAkJCWFjcGlfYWRkX2lkKHBucCwgQUNQSV9ET0NLX0hJRCk7CiAJCWVsc2UgaWYgKGFjcGlfaWJtX3NtYnVzX21hdGNoKGhhbmRsZSkpCiAJCQlhY3BpX2FkZF9pZChwbnAsIEFDUElfU01CVVNfSUJNX0hJRCk7Ci0JCWVsc2UgaWYgKGxpc3RfZW1wdHkoJnBucC0+aWRzKSAmJiBoYW5kbGUgPT0gQUNQSV9ST09UX09CSkVDVCkgewotCQkJYWNwaV9hZGRfaWQocG5wLCBBQ1BJX0JVU19ISUQpOyAvKiBcX1NCLCBMTlhTWUJVUyAqLworCQllbHNlIGlmIChsaXN0X2VtcHR5KCZwbnAtPmlkcykgJiYKKwkJCSBhY3BpX29iamVjdF9pc19zeXN0ZW1fYnVzKGhhbmRsZSkpIHsKKwkJCS8qIFxfU0IsIFxfVFosIExOWFNZQlVTICovCisJCQlhY3BpX2FkZF9pZChwbnAsIEFDUElfQlVTX0hJRCk7CiAJCQlzdHJjcHkocG5wLT5kZXZpY2VfbmFtZSwgQUNQSV9CVVNfREVWSUNFX05BTUUpOwogCQkJc3RyY3B5KHBucC0+ZGV2aWNlX2NsYXNzLCBBQ1BJX0JVU19DTEFTUyk7CiAJCX0KQEAgLTE5NDEsMzMgKzIwMDgsMjMgQEAKIAltdXRleF91bmxvY2soJmFjcGlfc2Nhbl9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgYWNwaV9zY2FuX2luaXRfaG90cGx1ZyhhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlKQorc3RhdGljIHZvaWQgYWNwaV9zY2FuX2luaXRfaG90cGx1ZyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpCiB7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlX3BucCBwbnAgPSB7fTsKIAlzdHJ1Y3QgYWNwaV9oYXJkd2FyZV9pZCAqaHdpZDsKLQlzdHJ1Y3QgYWNwaV9zY2FuX2hhbmRsZXIgKmhhbmRsZXI7CiAKLQlJTklUX0xJU1RfSEVBRCgmcG5wLmlkcyk7Ci0JYWNwaV9zZXRfcG5wX2lkcyhoYW5kbGUsICZwbnAsIHR5cGUpOworCWlmIChhY3BpX2RvY2tfbWF0Y2goYWRldi0+aGFuZGxlKSB8fCBpc19lamVjdGFibGVfYmF5KGFkZXYpKSB7CisJCWFjcGlfZG9ja19hZGQoYWRldik7CisJCXJldHVybjsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShod2lkLCAmYWRldi0+cG5wLmlkcywgbGlzdCkgeworCQlzdHJ1Y3QgYWNwaV9zY2FuX2hhbmRsZXIgKmhhbmRsZXI7CiAKLQlpZiAoIXBucC50eXBlLmhhcmR3YXJlX2lkKQotCQlnb3RvIG91dDsKLQotCS8qCi0JICogVGhpcyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoKSB3aWxsIG5vdAotCSAqIGluc3RhbGwgdGhlIHNhbWUgbm90aWZ5IGhhbmRsZXIgcm91dGluZSB0d2ljZSBmb3IgdGhlIHNhbWUgaGFuZGxlLgotCSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaHdpZCwgJnBucC5pZHMsIGxpc3QpIHsKIAkJaGFuZGxlciA9IGFjcGlfc2Nhbl9tYXRjaF9oYW5kbGVyKGh3aWQtPmlkLCBOVUxMKTsKIAkJaWYgKGhhbmRsZXIpIHsKLQkJCWFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihoYW5kbGUsIEFDUElfU1lTVEVNX05PVElGWSwKLQkJCQkJYWNwaV9ob3RwbHVnX25vdGlmeV9jYiwgaGFuZGxlcik7CisJCQlhZGV2LT5mbGFncy5ob3RwbHVnX25vdGlmeSA9IHRydWU7CiAJCQlicmVhazsKIAkJfQogCX0KLQotb3V0OgotCWFjcGlfZnJlZV9wbnBfaWRzKCZwbnApOwogfQogCiBzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9idXNfY2hlY2tfYWRkKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGx2bF9ub3RfdXNlZCwKQEAgLTE5OTEsMTIgKzIwNDgsMTIgQEAKIAkJcmV0dXJuIEFFX09LOwogCX0KIAotCWFjcGlfc2Nhbl9pbml0X2hvdHBsdWcoaGFuZGxlLCB0eXBlKTsKLQogCWFjcGlfYWRkX3NpbmdsZV9vYmplY3QoJmRldmljZSwgaGFuZGxlLCB0eXBlLCBzdGEpOwogCWlmICghZGV2aWNlKQogCQlyZXR1cm4gQUVfQ1RSTF9ERVBUSDsKIAorCWFjcGlfc2Nhbl9pbml0X2hvdHBsdWcoZGV2aWNlKTsKKwogIG91dDoKIAlpZiAoISpyZXR1cm5fdmFsdWUpCiAJCSpyZXR1cm5fdmFsdWUgPSBkZXZpY2U7CkBAIC0yMDE1LDEzICsyMDcyLDE0IEBACiAKIAkJaGFuZGxlciA9IGFjcGlfc2Nhbl9tYXRjaF9oYW5kbGVyKGh3aWQtPmlkLCAmZGV2aWQpOwogCQlpZiAoaGFuZGxlcikgeworCQkJZGV2aWNlLT5oYW5kbGVyID0gaGFuZGxlcjsKIAkJCXJldCA9IGhhbmRsZXItPmF0dGFjaChkZXZpY2UsIGRldmlkKTsKLQkJCWlmIChyZXQgPiAwKSB7Ci0JCQkJZGV2aWNlLT5oYW5kbGVyID0gaGFuZGxlcjsKKwkJCWlmIChyZXQgPiAwKQogCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChyZXQgPCAwKSB7CisKKwkJCWRldmljZS0+aGFuZGxlciA9IE5VTEw7CisJCQlpZiAocmV0IDwgMCkKIAkJCQlicmVhazsKLQkJCX0KIAkJfQogCX0KIAlyZXR1cm4gcmV0OwpAQCAtMjAzMCw4ICsyMDg4LDEyIEBACiBzdGF0aWMgdm9pZCBhY3BpX2J1c19hdHRhY2goc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpjaGlsZDsKKwlhY3BpX2hhbmRsZSBlamQ7CiAJaW50IHJldDsKIAorCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9idXNfZ2V0X2VqZChkZXZpY2UtPmhhbmRsZSwgJmVqZCkpKQorCQlyZWdpc3Rlcl9kb2NrX2RlcGVuZGVudF9kZXZpY2UoZGV2aWNlLCBlamQpOworCiAJYWNwaV9idXNfZ2V0X3N0YXR1cyhkZXZpY2UpOwogCS8qIFNraXAgZGV2aWNlcyB0aGF0IGFyZSBub3QgcHJlc2VudC4gKi8KIAlpZiAoIWFjcGlfZGV2aWNlX2lzX3ByZXNlbnQoZGV2aWNlKSkgewpAQCAtMjE4NCw3ICsyMjQ2LDYgQEAKIAlhY3BpX2Ntb3NfcnRjX2luaXQoKTsKIAlhY3BpX2NvbnRhaW5lcl9pbml0KCk7CiAJYWNwaV9tZW1vcnlfaG90cGx1Z19pbml0KCk7Ci0JYWNwaV9kb2NrX2luaXQoKTsKIAogCW11dGV4X2xvY2soJmFjcGlfc2Nhbl9sb2NrKTsKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3N5c2ZzLmMgYi9kcml2ZXJzL2FjcGkvc3lzZnMuYwppbmRleCA5MWEzMmNlLi4zOGNiOTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc3lzZnMuYworKysgYi9kcml2ZXJzL2FjcGkvc3lzZnMuYwpAQCAtMTIsOCArMTIsNiBAQAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1NZU1RFTV9DT01QT05FTlQKIEFDUElfTU9EVUxFX05BTUUoInN5c2ZzIik7CiAKLSNkZWZpbmUgUFJFRklYICJBQ1BJOiAiCi0KICNpZmRlZiBDT05GSUdfQUNQSV9ERUJVRwogLyoKICAqIEFDUEkgZGVidWcgc3lzZnMgSS9GLCBpbmNsdWRpbmc6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzLmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzLmMKaW5kZXggNTgzN2Y4NS4uMjE3ODIyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMuYwpAQCAtMjMsNiArMjMsOCBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpICJBQ1BJOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgpAQCAtMzMsOCArMzUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAKLSNkZWZpbmUgUFJFRklYCQkJIkFDUEk6ICIKLQogI2RlZmluZSBBQ1BJX01BWF9UQUJMRVMJCTEyOAogCiBzdGF0aWMgY2hhciAqbXBzX2ludGlfZmxhZ3NfcG9sYXJpdHlbXSA9IHsgImRmbCIsICJoaWdoIiwgInJlcyIsICJsb3ciIH07CkBAIC01NSwxMCArNTUsOSBAQAogCQl7CiAJCQlzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX2FwaWMgKnAgPQogCQkJICAgIChzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX2FwaWMgKiloZWFkZXI7Ci0JCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAotCQkJICAgICAgICJMQVBJQyAoYWNwaV9pZFsweCUwMnhdIGxhcGljX2lkWzB4JTAyeF0gJXMpXG4iLAotCQkJICAgICAgIHAtPnByb2Nlc3Nvcl9pZCwgcC0+aWQsCi0JCQkgICAgICAgKHAtPmxhcGljX2ZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJCQlwcl9pbmZvKCJMQVBJQyAoYWNwaV9pZFsweCUwMnhdIGxhcGljX2lkWzB4JTAyeF0gJXMpXG4iLAorCQkJCXAtPnByb2Nlc3Nvcl9pZCwgcC0+aWQsCisJCQkJKHAtPmxhcGljX2ZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTY2LDExICs2NSw5IEBACiAJCXsKIAkJCXN0cnVjdCBhY3BpX21hZHRfbG9jYWxfeDJhcGljICpwID0KIAkJCSAgICAoc3RydWN0IGFjcGlfbWFkdF9sb2NhbF94MmFwaWMgKiloZWFkZXI7Ci0JCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAotCQkJICAgICAgICJYMkFQSUMgKGFwaWNfaWRbMHglMDJ4XSB1aWRbMHglMDJ4XSAlcylcbiIsCi0JCQkgICAgICAgcC0+bG9jYWxfYXBpY19pZCwgcC0+dWlkLAotCQkJICAgICAgIChwLT5sYXBpY19mbGFncyAmIEFDUElfTUFEVF9FTkFCTEVEKSA/Ci0JCQkgICAgICAgImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJCQlwcl9pbmZvKCJYMkFQSUMgKGFwaWNfaWRbMHglMDJ4XSB1aWRbMHglMDJ4XSAlcylcbiIsCisJCQkJcC0+bG9jYWxfYXBpY19pZCwgcC0+dWlkLAorCQkJCShwLT5sYXBpY19mbGFncyAmIEFDUElfTUFEVF9FTkFCTEVEKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwogCQl9CiAJCWJyZWFrOwogCkBAIC03OCw5ICs3NSw4IEBACiAJCXsKIAkJCXN0cnVjdCBhY3BpX21hZHRfaW9fYXBpYyAqcCA9CiAJCQkgICAgKHN0cnVjdCBhY3BpX21hZHRfaW9fYXBpYyAqKWhlYWRlcjsKLQkJCXByaW50ayhLRVJOX0lORk8gUFJFRklYCi0JCQkgICAgICAgIklPQVBJQyAoaWRbMHglMDJ4XSBhZGRyZXNzWzB4JTA4eF0gZ3NpX2Jhc2VbJWRdKVxuIiwKLQkJCSAgICAgICBwLT5pZCwgcC0+YWRkcmVzcywgcC0+Z2xvYmFsX2lycV9iYXNlKTsKKwkJCXByX2luZm8oIklPQVBJQyAoaWRbMHglMDJ4XSBhZGRyZXNzWzB4JTA4eF0gZ3NpX2Jhc2VbJWRdKVxuIiwKKwkJCQlwLT5pZCwgcC0+YWRkcmVzcywgcC0+Z2xvYmFsX2lycV9iYXNlKTsKIAkJfQogCQlicmVhazsKIApAQCAtODgsMTggKzg0LDE1IEBACiAJCXsKIAkJCXN0cnVjdCBhY3BpX21hZHRfaW50ZXJydXB0X292ZXJyaWRlICpwID0KIAkJCSAgICAoc3RydWN0IGFjcGlfbWFkdF9pbnRlcnJ1cHRfb3ZlcnJpZGUgKiloZWFkZXI7Ci0JCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAotCQkJICAgICAgICJJTlRfU1JDX09WUiAoYnVzICVkIGJ1c19pcnEgJWQgZ2xvYmFsX2lycSAlZCAlcyAlcylcbiIsCi0JCQkgICAgICAgcC0+YnVzLCBwLT5zb3VyY2VfaXJxLCBwLT5nbG9iYWxfaXJxLAotCQkJICAgICAgIG1wc19pbnRpX2ZsYWdzX3BvbGFyaXR5W3AtPmludGlfZmxhZ3MgJiBBQ1BJX01BRFRfUE9MQVJJVFlfTUFTS10sCi0JCQkgICAgICAgbXBzX2ludGlfZmxhZ3NfdHJpZ2dlclsocC0+aW50aV9mbGFncyAmIEFDUElfTUFEVF9UUklHR0VSX01BU0spID4+IDJdKTsKKwkJCXByX2luZm8oIklOVF9TUkNfT1ZSIChidXMgJWQgYnVzX2lycSAlZCBnbG9iYWxfaXJxICVkICVzICVzKVxuIiwKKwkJCQlwLT5idXMsIHAtPnNvdXJjZV9pcnEsIHAtPmdsb2JhbF9pcnEsCisJCQkJbXBzX2ludGlfZmxhZ3NfcG9sYXJpdHlbcC0+aW50aV9mbGFncyAmIEFDUElfTUFEVF9QT0xBUklUWV9NQVNLXSwKKwkJCQltcHNfaW50aV9mbGFnc190cmlnZ2VyWyhwLT5pbnRpX2ZsYWdzICYgQUNQSV9NQURUX1RSSUdHRVJfTUFTSykgPj4gMl0pOwogCQkJaWYgKHAtPmludGlfZmxhZ3MgICYKIAkJCSAgICB+KEFDUElfTUFEVF9QT0xBUklUWV9NQVNLIHwgQUNQSV9NQURUX1RSSUdHRVJfTUFTSykpCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKLQkJCQkgICAgICAgIklOVF9TUkNfT1ZSIHVuZXhwZWN0ZWQgcmVzZXJ2ZWQgZmxhZ3M6IDB4JXhcbiIsCi0JCQkJICAgICAgIHAtPmludGlfZmxhZ3MgICYKKwkJCQlwcl9pbmZvKCJJTlRfU1JDX09WUiB1bmV4cGVjdGVkIHJlc2VydmVkIGZsYWdzOiAweCV4XG4iLAorCQkJCQlwLT5pbnRpX2ZsYWdzICAmCiAJCQkJCX4oQUNQSV9NQURUX1BPTEFSSVRZX01BU0sgfCBBQ1BJX01BRFRfVFJJR0dFUl9NQVNLKSk7Ci0KIAkJfQogCQlicmVhazsKIApAQCAtMTA3LDExICsxMDAsMTAgQEAKIAkJewogCQkJc3RydWN0IGFjcGlfbWFkdF9ubWlfc291cmNlICpwID0KIAkJCSAgICAoc3RydWN0IGFjcGlfbWFkdF9ubWlfc291cmNlICopaGVhZGVyOwotCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKLQkJCSAgICAgICAiTk1JX1NSQyAoJXMgJXMgZ2xvYmFsX2lycSAlZClcbiIsCi0JCQkgICAgICAgbXBzX2ludGlfZmxhZ3NfcG9sYXJpdHlbcC0+aW50aV9mbGFncyAmIEFDUElfTUFEVF9QT0xBUklUWV9NQVNLXSwKLQkJCSAgICAgICBtcHNfaW50aV9mbGFnc190cmlnZ2VyWyhwLT5pbnRpX2ZsYWdzICYgQUNQSV9NQURUX1RSSUdHRVJfTUFTSykgPj4gMl0sCi0JCQkgICAgICAgcC0+Z2xvYmFsX2lycSk7CisJCQlwcl9pbmZvKCJOTUlfU1JDICglcyAlcyBnbG9iYWxfaXJxICVkKVxuIiwKKwkJCQltcHNfaW50aV9mbGFnc19wb2xhcml0eVtwLT5pbnRpX2ZsYWdzICYgQUNQSV9NQURUX1BPTEFSSVRZX01BU0tdLAorCQkJCW1wc19pbnRpX2ZsYWdzX3RyaWdnZXJbKHAtPmludGlfZmxhZ3MgJiBBQ1BJX01BRFRfVFJJR0dFUl9NQVNLKSA+PiAyXSwKKwkJCQlwLT5nbG9iYWxfaXJxKTsKIAkJfQogCQlicmVhazsKIApAQCAtMTE5LDEyICsxMTEsMTEgQEAKIAkJewogCQkJc3RydWN0IGFjcGlfbWFkdF9sb2NhbF9hcGljX25taSAqcCA9CiAJCQkgICAgKHN0cnVjdCBhY3BpX21hZHRfbG9jYWxfYXBpY19ubWkgKiloZWFkZXI7Ci0JCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAotCQkJICAgICAgICJMQVBJQ19OTUkgKGFjcGlfaWRbMHglMDJ4XSAlcyAlcyBsaW50WzB4JXhdKVxuIiwKLQkJCSAgICAgICBwLT5wcm9jZXNzb3JfaWQsCi0JCQkgICAgICAgbXBzX2ludGlfZmxhZ3NfcG9sYXJpdHlbcC0+aW50aV9mbGFncyAmIEFDUElfTUFEVF9QT0xBUklUWV9NQVNLCV0sCi0JCQkgICAgICAgbXBzX2ludGlfZmxhZ3NfdHJpZ2dlclsocC0+aW50aV9mbGFncyAmIEFDUElfTUFEVF9UUklHR0VSX01BU0spID4+IDJdLAotCQkJICAgICAgIHAtPmxpbnQpOworCQkJcHJfaW5mbygiTEFQSUNfTk1JIChhY3BpX2lkWzB4JTAyeF0gJXMgJXMgbGludFsweCV4XSlcbiIsCisJCQkJcC0+cHJvY2Vzc29yX2lkLAorCQkJCW1wc19pbnRpX2ZsYWdzX3BvbGFyaXR5W3AtPmludGlfZmxhZ3MgJiBBQ1BJX01BRFRfUE9MQVJJVFlfTUFTSwldLAorCQkJCW1wc19pbnRpX2ZsYWdzX3RyaWdnZXJbKHAtPmludGlfZmxhZ3MgJiBBQ1BJX01BRFRfVFJJR0dFUl9NQVNLKSA+PiAyXSwKKwkJCQlwLT5saW50KTsKIAkJfQogCQlicmVhazsKIApAQCAtMTM3LDEyICsxMjgsMTEgQEAKIAkJCXBvbGFyaXR5ID0gcC0+aW50aV9mbGFncyAmIEFDUElfTUFEVF9QT0xBUklUWV9NQVNLOwogCQkJdHJpZ2dlciA9IChwLT5pbnRpX2ZsYWdzICYgQUNQSV9NQURUX1RSSUdHRVJfTUFTSykgPj4gMjsKIAotCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKLQkJCSAgICAgICAiWDJBUElDX05NSSAodWlkWzB4JTAyeF0gJXMgJXMgbGludFsweCV4XSlcbiIsCi0JCQkgICAgICAgcC0+dWlkLAotCQkJICAgICAgIG1wc19pbnRpX2ZsYWdzX3BvbGFyaXR5W3BvbGFyaXR5XSwKLQkJCSAgICAgICBtcHNfaW50aV9mbGFnc190cmlnZ2VyW3RyaWdnZXJdLAotCQkJICAgICAgIHAtPmxpbnQpOworCQkJcHJfaW5mbygiWDJBUElDX05NSSAodWlkWzB4JTAyeF0gJXMgJXMgbGludFsweCV4XSlcbiIsCisJCQkJcC0+dWlkLAorCQkJCW1wc19pbnRpX2ZsYWdzX3BvbGFyaXR5W3BvbGFyaXR5XSwKKwkJCQltcHNfaW50aV9mbGFnc190cmlnZ2VyW3RyaWdnZXJdLAorCQkJCXAtPmxpbnQpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0xNTAsOSArMTQwLDggQEAKIAkJewogCQkJc3RydWN0IGFjcGlfbWFkdF9sb2NhbF9hcGljX292ZXJyaWRlICpwID0KIAkJCSAgICAoc3RydWN0IGFjcGlfbWFkdF9sb2NhbF9hcGljX292ZXJyaWRlICopaGVhZGVyOwotCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKLQkJCSAgICAgICAiTEFQSUNfQUREUl9PVlIgKGFkZHJlc3NbJXBdKVxuIiwKLQkJCSAgICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXAtPmFkZHJlc3MpOworCQkJcHJfaW5mbygiTEFQSUNfQUREUl9PVlIgKGFkZHJlc3NbJXBdKVxuIiwKKwkJCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKXAtPmFkZHJlc3MpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0xNjAsMTAgKzE0OSw5IEBACiAJCXsKIAkJCXN0cnVjdCBhY3BpX21hZHRfaW9fc2FwaWMgKnAgPQogCQkJICAgIChzdHJ1Y3QgYWNwaV9tYWR0X2lvX3NhcGljICopaGVhZGVyOwotCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKLQkJCSAgICAgICAiSU9TQVBJQyAoaWRbMHgleF0gYWRkcmVzc1slcF0gZ3NpX2Jhc2VbJWRdKVxuIiwKLQkJCSAgICAgICBwLT5pZCwgKHZvaWQgKikodW5zaWduZWQgbG9uZylwLT5hZGRyZXNzLAotCQkJICAgICAgIHAtPmdsb2JhbF9pcnFfYmFzZSk7CisJCQlwcl9pbmZvKCJJT1NBUElDIChpZFsweCV4XSBhZGRyZXNzWyVwXSBnc2lfYmFzZVslZF0pXG4iLAorCQkJCXAtPmlkLCAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXAtPmFkZHJlc3MsCisJCQkJcC0+Z2xvYmFsX2lycV9iYXNlKTsKIAkJfQogCQlicmVhazsKIApAQCAtMTcxLDEwICsxNTksOSBAQAogCQl7CiAJCQlzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX3NhcGljICpwID0KIAkJCSAgICAoc3RydWN0IGFjcGlfbWFkdF9sb2NhbF9zYXBpYyAqKWhlYWRlcjsKLQkJCXByaW50ayhLRVJOX0lORk8gUFJFRklYCi0JCQkgICAgICAgIkxTQVBJQyAoYWNwaV9pZFsweCUwMnhdIGxzYXBpY19pZFsweCUwMnhdIGxzYXBpY19laWRbMHglMDJ4XSAlcylcbiIsCi0JCQkgICAgICAgcC0+cHJvY2Vzc29yX2lkLCBwLT5pZCwgcC0+ZWlkLAotCQkJICAgICAgIChwLT5sYXBpY19mbGFncyAmIEFDUElfTUFEVF9FTkFCTEVEKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCQkJcHJfaW5mbygiTFNBUElDIChhY3BpX2lkWzB4JTAyeF0gbHNhcGljX2lkWzB4JTAyeF0gbHNhcGljX2VpZFsweCUwMnhdICVzKVxuIiwKKwkJCQlwLT5wcm9jZXNzb3JfaWQsIHAtPmlkLCBwLT5laWQsCisJCQkJKHAtPmxhcGljX2ZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTE4MiwxOSArMTY5LDE3IEBACiAJCXsKIAkJCXN0cnVjdCBhY3BpX21hZHRfaW50ZXJydXB0X3NvdXJjZSAqcCA9CiAJCQkgICAgKHN0cnVjdCBhY3BpX21hZHRfaW50ZXJydXB0X3NvdXJjZSAqKWhlYWRlcjsKLQkJCXByaW50ayhLRVJOX0lORk8gUFJFRklYCi0JCQkgICAgICAgIlBMQVRfSU5UX1NSQyAoJXMgJXMgdHlwZVsweCV4XSBpZFsweCUwNHhdIGVpZFsweCV4XSBpb3NhcGljX3ZlY3RvclsweCV4XSBnbG9iYWxfaXJxWzB4JXhdXG4iLAotCQkJICAgICAgIG1wc19pbnRpX2ZsYWdzX3BvbGFyaXR5W3AtPmludGlfZmxhZ3MgJiBBQ1BJX01BRFRfUE9MQVJJVFlfTUFTS10sCi0JCQkgICAgICAgbXBzX2ludGlfZmxhZ3NfdHJpZ2dlclsocC0+aW50aV9mbGFncyAmIEFDUElfTUFEVF9UUklHR0VSX01BU0spID4+IDJdLAotCQkJICAgICAgIHAtPnR5cGUsIHAtPmlkLCBwLT5laWQsIHAtPmlvX3NhcGljX3ZlY3RvciwKLQkJCSAgICAgICBwLT5nbG9iYWxfaXJxKTsKKwkJCXByX2luZm8oIlBMQVRfSU5UX1NSQyAoJXMgJXMgdHlwZVsweCV4XSBpZFsweCUwNHhdIGVpZFsweCV4XSBpb3NhcGljX3ZlY3RvclsweCV4XSBnbG9iYWxfaXJxWzB4JXhdXG4iLAorCQkJCW1wc19pbnRpX2ZsYWdzX3BvbGFyaXR5W3AtPmludGlfZmxhZ3MgJiBBQ1BJX01BRFRfUE9MQVJJVFlfTUFTS10sCisJCQkJbXBzX2ludGlfZmxhZ3NfdHJpZ2dlclsocC0+aW50aV9mbGFncyAmIEFDUElfTUFEVF9UUklHR0VSX01BU0spID4+IDJdLAorCQkJCXAtPnR5cGUsIHAtPmlkLCBwLT5laWQsIHAtPmlvX3NhcGljX3ZlY3RvciwKKwkJCQlwLT5nbG9iYWxfaXJxKTsKIAkJfQogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCi0JCSAgICAgICAiRm91bmQgdW5zdXBwb3J0ZWQgTUFEVCBlbnRyeSAodHlwZSA9IDB4JXgpXG4iLAotCQkgICAgICAgaGVhZGVyLT50eXBlKTsKKwkJcHJfd2FybigiRm91bmQgdW5zdXBwb3J0ZWQgTUFEVCBlbnRyeSAodHlwZSA9IDB4JXgpXG4iLAorCQkJaGVhZGVyLT50eXBlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMjI1LDcgKzIxMCw3IEBACiAJCWFjcGlfZ2V0X3RhYmxlX3dpdGhfc2l6ZShpZCwgMCwgJnRhYmxlX2hlYWRlciwgJnRibF9zaXplKTsKIAogCWlmICghdGFibGVfaGVhZGVyKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICIlNC40cyBub3QgcHJlc2VudFxuIiwgaWQpOworCQlwcl93YXJuKCIlNC40cyBub3QgcHJlc2VudFxuIiwgaWQpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTI0OCw3ICsyMzMsNyBAQAogCQkgKiBpbmZpbml0ZSBsb29wLgogCQkgKi8KIAkJaWYgKGVudHJ5LT5sZW5ndGggPT0gMCkgewotCQkJcHJfZXJyKFBSRUZJWCAiWyU0LjRzOjB4JTAyeF0gSW52YWxpZCB6ZXJvIGxlbmd0aFxuIiwgaWQsIGVudHJ5X2lkKTsKKwkJCXByX2VycigiWyU0LjRzOjB4JTAyeF0gSW52YWxpZCB6ZXJvIGxlbmd0aFxuIiwgaWQsIGVudHJ5X2lkKTsKIAkJCWdvdG8gZXJyOwogCQl9CiAKQEAgLTI1Niw4ICsyNDEsOCBAQAogCQkgICAgKCh1bnNpZ25lZCBsb25nKWVudHJ5ICsgZW50cnktPmxlbmd0aCk7CiAJfQogCWlmIChtYXhfZW50cmllcyAmJiBjb3VudCA+IG1heF9lbnRyaWVzKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJbJTQuNHM6MHglMDJ4XSBpZ25vcmVkICVpIGVudHJpZXMgb2YgIgotCQkgICAgICAgIiVpIGZvdW5kXG4iLCBpZCwgZW50cnlfaWQsIGNvdW50IC0gbWF4X2VudHJpZXMsIGNvdW50KTsKKwkJcHJfd2FybigiWyU0LjRzOjB4JTAyeF0gaWdub3JlZCAlaSBlbnRyaWVzIG9mICVpIGZvdW5kXG4iLAorCQkJaWQsIGVudHJ5X2lkLCBjb3VudCAtIG1heF9lbnRyaWVzLCBjb3VudCk7CiAJfQogCiAJZWFybHlfYWNwaV9vc191bm1hcF9tZW1vcnkoKGNoYXIgKil0YWJsZV9oZWFkZXIsIHRibF9zaXplKTsKQEAgLTMyMiwxMyArMzA3LDExIEBACiAKIAlhY3BpX2dldF90YWJsZV93aXRoX3NpemUoQUNQSV9TSUdfTUFEVCwgMiwgJnRhYmxlLCAmdGJsX3NpemUpOwogCWlmICh0YWJsZSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAotCQkgICAgICAgIkJJT1MgYnVnOiBtdWx0aXBsZSBBUElDL01BRFQgZm91bmQsIgotCQkgICAgICAgIiB1c2luZyAlZFxuIiwgYWNwaV9hcGljX2luc3RhbmNlKTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKLQkJICAgICAgICJJZiBcImFjcGlfYXBpY19pbnN0YW5jZT0lZFwiIHdvcmtzIGJldHRlciwgIgotCQkgICAgICAgIm5vdGlmeSBsaW51eC1hY3BpQHZnZXIua2VybmVsLm9yZ1xuIiwKLQkJICAgICAgIGFjcGlfYXBpY19pbnN0YW5jZSA/IDAgOiAyKTsKKwkJcHJfd2FybigiQklPUyBidWc6IG11bHRpcGxlIEFQSUMvTUFEVCBmb3VuZCwgdXNpbmcgJWRcbiIsCisJCQlhY3BpX2FwaWNfaW5zdGFuY2UpOworCQlwcl93YXJuKCJJZiBcImFjcGlfYXBpY19pbnN0YW5jZT0lZFwiIHdvcmtzIGJldHRlciwgIgorCQkJIm5vdGlmeSBsaW51eC1hY3BpQHZnZXIua2VybmVsLm9yZ1xuIiwKKwkJCWFjcGlfYXBpY19pbnN0YW5jZSA/IDAgOiAyKTsKIAkJZWFybHlfYWNwaV9vc191bm1hcF9tZW1vcnkodGFibGUsIHRibF9zaXplKTsKIAogCX0gZWxzZQpAQCAtMzY1LDggKzM0OCw3IEBACiAKIAlhY3BpX2FwaWNfaW5zdGFuY2UgPSBzaW1wbGVfc3RydG91bChzdHIsIE5VTEwsIDApOwogCi0JcHJpbnRrKEtFUk5fTk9USUNFIFBSRUZJWCAiU2hhbGwgdXNlIEFQSUMvTUFEVCB0YWJsZSAlZFxuIiwKLQkgICAgICAgYWNwaV9hcGljX2luc3RhbmNlKTsKKwlwcl9ub3RpY2UoIlNoYWxsIHVzZSBBUElDL01BRFQgdGFibGUgJWRcbiIsIGFjcGlfYXBpY19pbnN0YW5jZSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90aGVybWFsLmMgYi9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jCmluZGV4IDA4NjI2YzguLjk2NDA2ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90aGVybWFsLmMKKysrIGIvZHJpdmVycy9hY3BpL3RoZXJtYWwuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RoZXJtYWwuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2RlZmluZSBQUkVGSVggIkFDUEk6ICIKQEAgLTkwLDYgKzkxLDggQEAKIG1vZHVsZV9wYXJhbShwc3YsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBzdiwgIkRpc2FibGUgb3Igb3ZlcnJpZGUgYWxsIHBhc3NpdmUgdHJpcCBwb2ludHMuIik7CiAKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYWNwaV90aGVybWFsX3BtX3F1ZXVlOworCiBzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIHN0YXRpYyB2b2lkIGFjcGlfdGhlcm1hbF9ub3RpZnkoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIHUzMiBldmVudCk7CkBAIC0xMDEsMTEgKzEwNCwxMyBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCB0aGVybWFsX2RldmljZV9pZHMpOwogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKICNlbHNlCisjZGVmaW5lIGFjcGlfdGhlcm1hbF9zdXNwZW5kIE5VTEwKICNkZWZpbmUgYWNwaV90aGVybWFsX3Jlc3VtZSBOVUxMCiAjZW5kaWYKLXN0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhhY3BpX3RoZXJtYWxfcG0sIE5VTEwsIGFjcGlfdGhlcm1hbF9yZXN1bWUpOworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGFjcGlfdGhlcm1hbF9wbSwgYWNwaV90aGVybWFsX3N1c3BlbmQsIGFjcGlfdGhlcm1hbF9yZXN1bWUpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfdGhlcm1hbF9kcml2ZXIgPSB7CiAJLm5hbWUgPSAidGhlcm1hbCIsCkBAIC0xODYsNiArMTkxLDcgQEAKIAlzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdGhlcm1hbF96b25lOwogCWludCB0el9lbmFibGVkOwogCWludCBrZWx2aW5fb2Zmc2V0OworCXN0cnVjdCB3b3JrX3N0cnVjdCB0aGVybWFsX2NoZWNrX3dvcms7CiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTA2NCw2ICsxMDcwLDEzIEBACiAJCXR6LT5rZWx2aW5fb2Zmc2V0ID0gMjczMjsKIH0KIAorc3RhdGljIHZvaWQgYWNwaV90aGVybWFsX2NoZWNrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWNwaV90aGVybWFsICp0eiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWNwaV90aGVybWFsLAorCQkJCQkgICAgICAgdGhlcm1hbF9jaGVja193b3JrKTsKKwlhY3BpX3RoZXJtYWxfY2hlY2sodHopOworfQorCiBzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC0xMDkzLDYgKzExMDYsOCBAQAogCWlmIChyZXN1bHQpCiAJCWdvdG8gZnJlZV9tZW1vcnk7CiAKKwlJTklUX1dPUksoJnR6LT50aGVybWFsX2NoZWNrX3dvcmssIGFjcGlfdGhlcm1hbF9jaGVja19mbik7CisKIAlwcl9pbmZvKFBSRUZJWCAiJXMgWyVzXSAoJWxkIEMpXG4iLCBhY3BpX2RldmljZV9uYW1lKGRldmljZSksCiAJCWFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLCBLRUxWSU5fVE9fQ0VMU0lVUyh0ei0+dGVtcGVyYXR1cmUpKTsKIAlnb3RvIGVuZDsKQEAgLTExMTAsNiArMTEyNSw3IEBACiAJaWYgKCFkZXZpY2UgfHwgIWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlmbHVzaF93b3JrcXVldWUoYWNwaV90aGVybWFsX3BtX3F1ZXVlKTsKIAl0eiA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAogCWFjcGlfdGhlcm1hbF91bnJlZ2lzdGVyX3RoZXJtYWxfem9uZSh0eik7CkBAIC0xMTE4LDYgKzExMzQsMTMgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJLyogTWFrZSBzdXJlIHRoZSBwcmV2aW91c2x5IHF1ZXVlZCB0aGVybWFsIGNoZWNrIHdvcmsgaGFzIGJlZW4gZG9uZSAqLworCWZsdXNoX3dvcmtxdWV1ZShhY3BpX3RoZXJtYWxfcG1fcXVldWUpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6OwpAQCAtMTE0OCw3ICsxMTcxLDcgQEAKIAkJdHotPnN0YXRlLmFjdGl2ZSB8PSB0ei0+dHJpcHMuYWN0aXZlW2ldLmZsYWdzLmVuYWJsZWQ7CiAJfQogCi0JYWNwaV90aGVybWFsX2NoZWNrKHR6KTsKKwlxdWV1ZV93b3JrKGFjcGlfdGhlcm1hbF9wbV9xdWV1ZSwgJnR6LT50aGVybWFsX2NoZWNrX3dvcmspOwogCiAJcmV0dXJuIEFFX09LOwogfQpAQCAtMTI0MCwxNiArMTI2MywyMiBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlyZXN1bHQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfdGhlcm1hbF9kcml2ZXIpOwotCWlmIChyZXN1bHQgPCAwKQorCWFjcGlfdGhlcm1hbF9wbV9xdWV1ZSA9IGNyZWF0ZV93b3JrcXVldWUoImFjcGlfdGhlcm1hbF9wbSIpOworCWlmICghYWNwaV90aGVybWFsX3BtX3F1ZXVlKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV90aGVybWFsX2RyaXZlcik7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGVzdHJveV93b3JrcXVldWUoYWNwaV90aGVybWFsX3BtX3F1ZXVlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhY3BpX3RoZXJtYWxfZXhpdCh2b2lkKQogewotCisJZGVzdHJveV93b3JrcXVldWUoYWNwaV90aGVybWFsX3BtX3F1ZXVlKTsKIAlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmYWNwaV90aGVybWFsX2RyaXZlcik7CiAKIAlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS91dGlscy5jCmluZGV4IDg1ZTNiNjEuLjBmNWY3OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlscy5jCkBAIC00MjIsNyArNDIyLDcgQEAKIEVYUE9SVF9TWU1CT0woYWNwaV9nZXRfcGh5c2ljYWxfZGV2aWNlX2xvY2F0aW9uKTsKIAogLyoqCi0gKiBhY3BpX2V2YWx1YXRlX2hvdHBsdWdfb3N0OiBFdmFsdWF0ZSBfT1NUIGZvciBob3RwbHVnIG9wZXJhdGlvbnMKKyAqIGFjcGlfZXZhbHVhdGVfb3N0OiBFdmFsdWF0ZSBfT1NUIGZvciBob3RwbHVnIG9wZXJhdGlvbnMKICAqIEBoYW5kbGU6IEFDUEkgZGV2aWNlIGhhbmRsZQogICogQHNvdXJjZV9ldmVudDogc291cmNlIGV2ZW50IGNvZGUKICAqIEBzdGF0dXNfY29kZTogc3RhdHVzIGNvZGUKQEAgLTQzMywxNyArNDMzLDE1IEBACiAgKiBXaGVuIHRoZSBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IF9PU1QsIHRoaXMgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdC4KICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZXZhbHVhdGVfaG90cGx1Z19vc3QoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgc291cmNlX2V2ZW50LAotCQl1MzIgc3RhdHVzX2NvZGUsIHN0cnVjdCBhY3BpX2J1ZmZlciAqc3RhdHVzX2J1ZikKK2FjcGlfZXZhbHVhdGVfb3N0KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIHNvdXJjZV9ldmVudCwgdTMyIHN0YXR1c19jb2RlLAorCQkgIHN0cnVjdCBhY3BpX2J1ZmZlciAqc3RhdHVzX2J1ZikKIHsKLSNpZmRlZiBBQ1BJX0hPVFBMVUdfT1NUCiAJdW5pb24gYWNwaV9vYmplY3QgcGFyYW1zWzNdID0gewogCQl7LnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUix9LAogCQl7LnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUix9LAogCQl7LnR5cGUgPSBBQ1BJX1RZUEVfQlVGRkVSLH0KIAl9OwogCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0ID0gezMsIHBhcmFtc307Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJcGFyYW1zWzBdLmludGVnZXIudmFsdWUgPSBzb3VyY2VfZXZlbnQ7CiAJcGFyYW1zWzFdLmludGVnZXIudmFsdWUgPSBzdGF0dXNfY29kZTsKQEAgLTQ1NSwxMyArNDUzLDkgQEAKIAkJcGFyYW1zWzJdLmJ1ZmZlci5sZW5ndGggPSAwOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgIl9PU1QiLCAmYXJnX2xpc3QsIE5VTEwpOwotCXJldHVybiBzdGF0dXM7Ci0jZWxzZQotCXJldHVybiBBRV9PSzsKLSNlbmRpZgorCXJldHVybiBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsICJfT1NUIiwgJmFyZ19saXN0LCBOVUxMKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9ldmFsdWF0ZV9ob3RwbHVnX29zdCk7CitFWFBPUlRfU1lNQk9MKGFjcGlfZXZhbHVhdGVfb3N0KTsKIAogLyoqCiAgKiBhY3BpX2hhbmRsZV9wcmludGs6IFByaW50IG1lc3NhZ2Ugd2l0aCBBQ1BJIHByZWZpeCBhbmQgb2JqZWN0IHBhdGgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS92aWRlby5jIGIvZHJpdmVycy9hY3BpL3ZpZGVvLmMKaW5kZXggYjZiYTg4ZS4uNDhjN2U4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3ZpZGVvLmMKKysrIGIvZHJpdmVycy9hY3BpL3ZpZGVvLmMKQEAgLTQ1LDggKzQ1LDYgQEAKIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAKLSNkZWZpbmUgUFJFRklYICJBQ1BJOiAiCi0KICNkZWZpbmUgQUNQSV9WSURFT19CVVNfTkFNRQkJIlZpZGVvIEJ1cyIKICNkZWZpbmUgQUNQSV9WSURFT19ERVZJQ0VfTkFNRQkJIlZpZGVvIERldmljZSIKICNkZWZpbmUgQUNQSV9WSURFT19OT1RJRllfU1dJVENICTB4ODAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS92aWRlb19kZXRlY3QuYyBiL2RyaXZlcnMvYWNwaS92aWRlb19kZXRlY3QuYwppbmRleCAxOTA4MGM4Li4zM2UzZGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdmlkZW9fZGV0ZWN0LmMKKysrIGIvZHJpdmVycy9hY3BpL3ZpZGVvX2RldGVjdC5jCkBAIC00MCw4ICs0MCw2IEBACiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi0jZGVmaW5lIFBSRUZJWCAiQUNQSTogIgotCiBBQ1BJX01PRFVMRV9OQU1FKCJ2aWRlbyIpOwogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1ZJREVPX0NPTVBPTkVOVAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpLmMgYi9kcml2ZXJzL2F0YS9haGNpLmMKaW5kZXggYTUyYTViNi4uNWEwYmY4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWhjaS5jCisrKyBiL2RyaXZlcnMvYXRhL2FoY2kuYwpAQCAtMTE2NiwxMyArMTE2NiwxMyBAQAogc3RhdGljIGludCBhaGNpX2luaXRfaW50ZXJydXB0cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgaW50IG5fcG9ydHMsCiAJCQkgc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdikKIHsKLQlpbnQgcmMsIG52ZWM7CisJaW50IG52ZWM7CiAKIAlpZiAoaHByaXYtPmZsYWdzICYgQUhDSV9IRkxBR19OT19NU0kpCiAJCWdvdG8gaW50eDsKIAotCXJjID0gcGNpX21zaV92ZWNfY291bnQocGRldik7Ci0JaWYgKHJjIDwgMCkKKwludmVjID0gcGNpX21zaV92ZWNfY291bnQocGRldik7CisJaWYgKG52ZWMgPCAwKQogCQlnb3RvIGludHg7CiAKIAkvKgpAQCAtMTE4MCwyMSArMTE4MCwxOSBAQAogCSAqIE1lc3NhZ2UgbW9kZSBjb3VsZCBiZSBlbmZvcmNlZC4gSW4gdGhpcyBjYXNlIGFzc3VtZSB0aGF0IGFkdmFudGFnZQogCSAqIG9mIG11bHRpcGUgTVNJcyBpcyBuZWdhdGVkIGFuZCB1c2Ugc2luZ2xlIE1TSSBtb2RlIGluc3RlYWQuCiAJICovCi0JaWYgKHJjIDwgbl9wb3J0cykKKwlpZiAobnZlYyA8IG5fcG9ydHMpCiAJCWdvdG8gc2luZ2xlX21zaTsKIAotCW52ZWMgPSByYzsKLQlyYyA9IHBjaV9lbmFibGVfbXNpX2Jsb2NrKHBkZXYsIG52ZWMpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gaW50eDsKLQllbHNlIGlmIChyYyA+IDApCisJbnZlYyA9IHBjaV9lbmFibGVfbXNpX3JhbmdlKHBkZXYsIG52ZWMsIG52ZWMpOworCWlmIChudmVjID09IC1FTk9TUEMpCiAJCWdvdG8gc2luZ2xlX21zaTsKKwllbHNlIGlmIChudmVjIDwgMCkKKwkJZ290byBpbnR4OwogCiAJcmV0dXJuIG52ZWM7CiAKIHNpbmdsZV9tc2k6Ci0JcmMgPSBwY2lfZW5hYmxlX21zaShwZGV2KTsKLQlpZiAocmMpCisJaWYgKHBjaV9lbmFibGVfbXNpKHBkZXYpKQogCQlnb3RvIGludHg7CiAJcmV0dXJuIDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtYWNwaS5jCmluZGV4IGI0ZjdjYzIuLjk3YTE0ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWFjcGkuYwpAQCAtMzgsNiArMzgsMTYgQEAKIAlkZXYtPmd0Zl9jYWNoZSA9IE5VTEw7CiB9CiAKK3N0cnVjdCBhdGFfYWNwaV9ob3RwbHVnX2NvbnRleHQgeworCXN0cnVjdCBhY3BpX2hvdHBsdWdfY29udGV4dCBocDsKKwl1bmlvbiB7CisJCXN0cnVjdCBhdGFfcG9ydCAqYXA7CisJCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CisJfSBkYXRhOworfTsKKworI2RlZmluZSBhdGFfaG90cGx1Z19kYXRhKGNvbnRleHQpIChjb250YWluZXJfb2YoKGNvbnRleHQpLCBzdHJ1Y3QgYXRhX2FjcGlfaG90cGx1Z19jb250ZXh0LCBocCktPmRhdGEpCisKIC8qKgogICogYXRhX2Rldl9hY3BpX2hhbmRsZSAtIHByb3ZpZGUgdGhlIGFjcGlfaGFuZGxlIGZvciBhbiBhdGFfZGV2aWNlCiAgKiBAZGV2OiB0aGUgYWNwaV9oYW5kbGUgcmV0dXJuZWQgd2lsbCBjb3JyZXNwb25kIHRvIHRoaXMgZGV2aWNlCkBAIC0xMjEsMTggKzEzMSwxNyBAQAogCQlhdGFfcG9ydF93YWl0X2VoKGFwKTsKIH0KIAotc3RhdGljIHZvaWQgYXRhX2FjcGlfZGV2X25vdGlmeV9kb2NrKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQorc3RhdGljIGludCBhdGFfYWNwaV9kZXZfbm90aWZ5X2RvY2soc3RydWN0IGFjcGlfZGV2aWNlICphZGV2LCB1MzIgZXZlbnQpCiB7Ci0Jc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9IGRhdGE7Ci0KKwlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gYXRhX2hvdHBsdWdfZGF0YShhZGV2LT5ocCkuZGV2OwogCWF0YV9hY3BpX2hhbmRsZV9ob3RwbHVnKGRldi0+bGluay0+YXAsIGRldiwgZXZlbnQpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBhdGFfYWNwaV9hcF9ub3RpZnlfZG9jayhhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgYXRhX2FjcGlfYXBfbm90aWZ5X2RvY2soc3RydWN0IGFjcGlfZGV2aWNlICphZGV2LCB1MzIgZXZlbnQpCiB7Ci0Jc3RydWN0IGF0YV9wb3J0ICphcCA9IGRhdGE7Ci0KLQlhdGFfYWNwaV9oYW5kbGVfaG90cGx1ZyhhcCwgTlVMTCwgZXZlbnQpOworCWF0YV9hY3BpX2hhbmRsZV9ob3RwbHVnKGF0YV9ob3RwbHVnX2RhdGEoYWRldi0+aHApLmFwLCBOVUxMLCBldmVudCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGF0YV9hY3BpX3VldmVudChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LApAQCAtMTU0LDMxICsxNjMsMjMgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGF0YV9hY3BpX2FwX3VldmVudChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGF0YV9hY3BpX2FwX3VldmVudChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsIHUzMiBldmVudCkKIHsKLQlhdGFfYWNwaV91ZXZlbnQoZGF0YSwgTlVMTCwgZXZlbnQpOworCWF0YV9hY3BpX3VldmVudChhdGFfaG90cGx1Z19kYXRhKGFkZXYtPmhwKS5hcCwgTlVMTCwgZXZlbnQpOwogfQogCi1zdGF0aWMgdm9pZCBhdGFfYWNwaV9kZXZfdWV2ZW50KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgYXRhX2FjcGlfZGV2X3VldmVudChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsIHUzMiBldmVudCkKIHsKLQlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gYXRhX2hvdHBsdWdfZGF0YShhZGV2LT5ocCkuZGV2OwogCWF0YV9hY3BpX3VldmVudChkZXYtPmxpbmstPmFwLCBkZXYsIGV2ZW50KTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RvY2tfb3BzIGF0YV9hY3BpX2Rldl9kb2NrX29wcyA9IHsKLQkuaGFuZGxlciA9IGF0YV9hY3BpX2Rldl9ub3RpZnlfZG9jaywKLQkudWV2ZW50ID0gYXRhX2FjcGlfZGV2X3VldmVudCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kb2NrX29wcyBhdGFfYWNwaV9hcF9kb2NrX29wcyA9IHsKLQkuaGFuZGxlciA9IGF0YV9hY3BpX2FwX25vdGlmeV9kb2NrLAotCS51ZXZlbnQgPSBhdGFfYWNwaV9hcF91ZXZlbnQsCi19OwotCiAvKiBiaW5kIGFjcGkgaGFuZGxlIHRvIHBhdGEgcG9ydCAqLwogdm9pZCBhdGFfYWNwaV9iaW5kX3BvcnQoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmhvc3RfY29tcGFuaW9uID0gQUNQSV9DT01QQU5JT04oYXAtPmhvc3QtPmRldik7CisJc3RydWN0IGFjcGlfZGV2aWNlICphZGV2OworCXN0cnVjdCBhdGFfYWNwaV9ob3RwbHVnX2NvbnRleHQgKmNvbnRleHQ7CiAKIAlpZiAobGliYXRhX25vYWNwaSB8fCBhcC0+ZmxhZ3MgJiBBVEFfRkxBR19BQ1BJX1NBVEEgfHwgIWhvc3RfY29tcGFuaW9uKQogCQlyZXR1cm47CkBAIC0xODgsOSArMTg5LDE3IEBACiAJaWYgKGF0YV9hY3BpX2d0bShhcCwgJmFwLT5fX2FjcGlfaW5pdF9ndG0pID09IDApCiAJCWFwLT5wZmxhZ3MgfD0gQVRBX1BGTEFHX0lOSVRfR1RNX1ZBTElEOwogCi0JLyogd2UgbWlnaHQgYmUgb24gYSBkb2NraW5nIHN0YXRpb24gKi8KLQlyZWdpc3Rlcl9ob3RwbHVnX2RvY2tfZGV2aWNlKEFDUElfSEFORExFKCZhcC0+dGRldiksCi0JCQkJICAgICAmYXRhX2FjcGlfYXBfZG9ja19vcHMsIGFwLCBOVUxMLCBOVUxMKTsKKwlhZGV2ID0gQUNQSV9DT01QQU5JT04oJmFwLT50ZGV2KTsKKwlpZiAoIWFkZXYgfHwgYWRldi0+aHApCisJCXJldHVybjsKKworCWNvbnRleHQgPSBremFsbG9jKHNpemVvZigqY29udGV4dCksIEdGUF9LRVJORUwpOworCWlmICghY29udGV4dCkKKwkJcmV0dXJuOworCisJY29udGV4dC0+ZGF0YS5hcCA9IGFwOworCWFjcGlfaW5pdGlhbGl6ZV9ocF9jb250ZXh0KGFkZXYsICZjb250ZXh0LT5ocCwgYXRhX2FjcGlfYXBfbm90aWZ5X2RvY2ssCisJCQkJICAgYXRhX2FjcGlfYXBfdWV2ZW50KTsKIH0KIAogdm9pZCBhdGFfYWNwaV9iaW5kX2RldihzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQpAQCAtMTk4LDcgKzIwNyw4IEBACiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IGRldi0+bGluay0+YXA7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpwb3J0X2NvbXBhbmlvbiA9IEFDUElfQ09NUEFOSU9OKCZhcC0+dGRldik7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpob3N0X2NvbXBhbmlvbiA9IEFDUElfQ09NUEFOSU9OKGFwLT5ob3N0LT5kZXYpOwotCXN0cnVjdCBhY3BpX2RldmljZSAqcGFyZW50OworCXN0cnVjdCBhY3BpX2RldmljZSAqcGFyZW50LCAqYWRldjsKKwlzdHJ1Y3QgYXRhX2FjcGlfaG90cGx1Z19jb250ZXh0ICpjb250ZXh0OwogCXU2NCBhZHI7CiAKIAkvKgpAQCAtMjIxLDkgKzIzMSwxNyBAQAogCX0KIAogCWFjcGlfcHJlc2V0X2NvbXBhbmlvbigmZGV2LT50ZGV2LCBwYXJlbnQsIGFkcik7CisJYWRldiA9IEFDUElfQ09NUEFOSU9OKCZkZXYtPnRkZXYpOworCWlmICghYWRldiB8fCBhZGV2LT5ocCkKKwkJcmV0dXJuOwogCi0JcmVnaXN0ZXJfaG90cGx1Z19kb2NrX2RldmljZShhdGFfZGV2X2FjcGlfaGFuZGxlKGRldiksCi0JCQkJICAgICAmYXRhX2FjcGlfZGV2X2RvY2tfb3BzLCBkZXYsIE5VTEwsIE5VTEwpOworCWNvbnRleHQgPSBremFsbG9jKHNpemVvZigqY29udGV4dCksIEdGUF9LRVJORUwpOworCWlmICghY29udGV4dCkKKwkJcmV0dXJuOworCisJY29udGV4dC0+ZGF0YS5kZXYgPSBkZXY7CisJYWNwaV9pbml0aWFsaXplX2hwX2NvbnRleHQoYWRldiwgJmNvbnRleHQtPmhwLCBhdGFfYWNwaV9kZXZfbm90aWZ5X2RvY2ssCisJCQkJICAgYXRhX2FjcGlfZGV2X3VldmVudCk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL0tjb25maWcgYi9kcml2ZXJzL2Jhc2UvS2NvbmZpZwppbmRleCBlYzM2ZTc3Li44ZmE4ZGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvS2NvbmZpZworKysgYi9kcml2ZXJzL2Jhc2UvS2NvbmZpZwpAQCAtMTg1LDYgKzE4NSw5IEBACiAJYm9vbAogCWRlZmF1bHQgbgogCitjb25maWcgR0VORVJJQ19DUFVfQVVUT1BST0JFCisJYm9vbAorCiBjb25maWcgU09DX0JVUwogCWJvb2wKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYyBiL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMKaW5kZXggZWNjMTkyOS4uYjg0Y2E4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYworKysgYi9kcml2ZXJzL2Jhc2UvYXR0cmlidXRlX2NvbnRhaW5lci5jCkBAIC0xMiw3ICsxMiw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2F0dHJpYnV0ZV9jb250YWluZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKaW5kZXggMmI1NjcxNy4uMGRkNjUyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NvcmUuYworKysgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KQEAgLTU3MSw2ICs1NzAsMjMgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9yZW1vdmVfZmlsZSk7CiAKIC8qKgorICogZGV2aWNlX3JlbW92ZV9maWxlX3NlbGYgLSByZW1vdmUgc3lzZnMgYXR0cmlidXRlIGZpbGUgZnJvbSBpdHMgb3duIG1ldGhvZC4KKyAqIEBkZXY6IGRldmljZS4KKyAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlIGRlc2NyaXB0b3IuCisgKgorICogU2VlIGtlcm5mc19yZW1vdmVfc2VsZigpIGZvciBkZXRhaWxzLgorICovCitib29sIGRldmljZV9yZW1vdmVfZmlsZV9zZWxmKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIpCit7CisJaWYgKGRldikKKwkJcmV0dXJuIHN5c2ZzX3JlbW92ZV9maWxlX3NlbGYoJmRldi0+a29iaiwgJmF0dHItPmF0dHIpOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX3JlbW92ZV9maWxlX3NlbGYpOworCisvKioKICAqIGRldmljZV9jcmVhdGVfYmluX2ZpbGUgLSBjcmVhdGUgc3lzZnMgYmluYXJ5IGF0dHJpYnV0ZSBmaWxlIGZvciBkZXZpY2UuCiAgKiBAZGV2OiBkZXZpY2UuCiAgKiBAYXR0cjogZGV2aWNlIGJpbmFyeSBhdHRyaWJ1dGUgZGVzY3JpcHRvci4KQEAgLTIwMDMsNyArMjAxOSw2IEBACiAJCXNwaW5fbG9jaygmZGV2aWNlc19rc2V0LT5saXN0X2xvY2spOwogCX0KIAlzcGluX3VubG9jaygmZGV2aWNlc19rc2V0LT5saXN0X2xvY2spOwotCWFzeW5jX3N5bmNocm9uaXplX2Z1bGwoKTsKIH0KIAogLyoKQEAgLTIwNTgsNyArMjA3Myw2IEBACiAKIAlyZXR1cm4gcG9zOwogfQotRVhQT1JUX1NZTUJPTChjcmVhdGVfc3lzbG9nX2hlYWRlcik7CiAKIGludCBkZXZfdnByaW50a19lbWl0KGludCBsZXZlbCwgY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LAogCQkgICAgIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NwdS5jIGIvZHJpdmVycy9iYXNlL2NwdS5jCmluZGV4IGY0ODM3MGQuLjAwNmIxYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jcHUuYworKysgYi9kcml2ZXJzL2Jhc2UvY3B1LmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmZWF0dXJlLmg+CiAKICNpbmNsdWRlICJiYXNlLmgiCiAKQEAgLTI4Niw2ICsyODcsNDEgQEAKIAkgKi8KIH0KIAorI2lmZGVmIENPTkZJR19HRU5FUklDX0NQVV9BVVRPUFJPQkUKK3N0YXRpYyBzc2l6ZV90IHByaW50X2NwdV9tb2RhbGlhcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgIGNoYXIgKmJ1ZikKK3sKKwlzc2l6ZV90IG47CisJdTMyIGk7CisKKwluID0gc3ByaW50ZihidWYsICJjcHU6dHlwZToiIENQVV9GRUFUVVJFX1RZUEVGTVQgIjpmZWF0dXJlOiIsCisJCSAgICBDUFVfRkVBVFVSRV9UWVBFVkFMKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ1BVX0ZFQVRVUkVTOyBpKyspCisJCWlmIChjcHVfaGF2ZV9mZWF0dXJlKGkpKSB7CisJCQlpZiAoUEFHRV9TSVpFIDwgbiArIHNpemVvZigiLFhYWFhcbiIpKSB7CisJCQkJV0FSTigxLCAiQ1BVIGZlYXR1cmVzIG92ZXJmbG93IHBhZ2VcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbiArPSBzcHJpbnRmKCZidWZbbl0sICIsJTA0WCIsIGkpOworCQl9CisJYnVmW24rK10gPSAnXG4nOworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IGNwdV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCit7CisJY2hhciAqYnVmID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWlmIChidWYpIHsKKwkJcHJpbnRfY3B1X21vZGFsaWFzKE5VTEwsIE5VTEwsIGJ1Zik7CisJCWFkZF91ZXZlbnRfdmFyKGVudiwgIk1PREFMSUFTPSVzIiwgYnVmKTsKKwkJa2ZyZWUoYnVmKTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogLyoKICAqIHJlZ2lzdGVyX2NwdSAtIFNldHVwIGEgc3lzZnMgZGV2aWNlIGZvciBhIENQVS4KICAqIEBjcHUgLSBjcHUtPmhvdHBsdWdnYWJsZSBmaWVsZCBzZXQgdG8gMSB3aWxsIGdlbmVyYXRlIGEgY29udHJvbCBmaWxlIGluCkBAIC0zMDYsOCArMzQyLDggQEAKIAljcHUtPmRldi5vZmZsaW5lX2Rpc2FibGVkID0gIWNwdS0+aG90cGx1Z2dhYmxlOwogCWNwdS0+ZGV2Lm9mZmxpbmUgPSAhY3B1X29ubGluZShudW0pOwogCWNwdS0+ZGV2Lm9mX25vZGUgPSBvZl9nZXRfY3B1X25vZGUobnVtLCBOVUxMKTsKLSNpZmRlZiBDT05GSUdfQVJDSF9IQVNfQ1BVX0FVVE9QUk9CRQotCWNwdS0+ZGV2LmJ1cy0+dWV2ZW50ID0gYXJjaF9jcHVfdWV2ZW50OworI2lmZGVmIENPTkZJR19HRU5FUklDX0NQVV9BVVRPUFJPQkUKKwljcHUtPmRldi5idXMtPnVldmVudCA9IGNwdV91ZXZlbnQ7CiAjZW5kaWYKIAljcHUtPmRldi5ncm91cHMgPSBjb21tb25fY3B1X2F0dHJfZ3JvdXBzOwogCWlmIChjcHUtPmhvdHBsdWdnYWJsZSkKQEAgLTMzMCw4ICszNjYsOCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ2V0X2NwdV9kZXZpY2UpOwogCi0jaWZkZWYgQ09ORklHX0FSQ0hfSEFTX0NQVV9BVVRPUFJPQkUKLXN0YXRpYyBERVZJQ0VfQVRUUihtb2RhbGlhcywgMDQ0NCwgYXJjaF9wcmludF9jcHVfbW9kYWxpYXMsIE5VTEwpOworI2lmZGVmIENPTkZJR19HRU5FUklDX0NQVV9BVVRPUFJPQkUKK3N0YXRpYyBERVZJQ0VfQVRUUihtb2RhbGlhcywgMDQ0NCwgcHJpbnRfY3B1X21vZGFsaWFzLCBOVUxMKTsKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY3B1X3Jvb3RfYXR0cnNbXSA9IHsKQEAgLTM0NCw3ICszODAsNyBAQAogCSZjcHVfYXR0cnNbMl0uYXR0ci5hdHRyLAogCSZkZXZfYXR0cl9rZXJuZWxfbWF4LmF0dHIsCiAJJmRldl9hdHRyX29mZmxpbmUuYXR0ciwKLSNpZmRlZiBDT05GSUdfQVJDSF9IQVNfQ1BVX0FVVE9QUk9CRQorI2lmZGVmIENPTkZJR19HRU5FUklDX0NQVV9BVVRPUFJPQkUKIAkmZGV2X2F0dHJfbW9kYWxpYXMuYXR0ciwKICNlbmRpZgogCU5VTEwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kZXZyZXMuYyBiL2RyaXZlcnMvYmFzZS9kZXZyZXMuYwppbmRleCA1NDVjNGRlLi5kYjRlMjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZGV2cmVzLmMKKysrIGIvZHJpdmVycy9iYXNlL2RldnJlcy5jCkBAIC03OTEsNiArNzkxLDMyIEBACiBFWFBPUlRfU1lNQk9MX0dQTChkZXZtX2ttYWxsb2MpOwogCiAvKioKKyAqIGRldm1fa3N0cmR1cCAtIEFsbG9jYXRlIHJlc291cmNlIG1hbmFnZWQgc3BhY2UgYW5kCisgKiAgICAgICAgICAgICAgICBjb3B5IGFuIGV4aXN0aW5nIHN0cmluZyBpbnRvIHRoYXQuCisgKiBAZGV2OiBEZXZpY2UgdG8gYWxsb2NhdGUgbWVtb3J5IGZvcgorICogQHM6IHRoZSBzdHJpbmcgdG8gZHVwbGljYXRlCisgKiBAZ2ZwOiB0aGUgR0ZQIG1hc2sgdXNlZCBpbiB0aGUgZGV2bV9rbWFsbG9jKCkgY2FsbCB3aGVuCisgKiAgICAgICBhbGxvY2F0aW5nIG1lbW9yeQorICogUkVUVVJOUzoKKyAqIFBvaW50ZXIgdG8gYWxsb2NhdGVkIHN0cmluZyBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuCisgKi8KK2NoYXIgKmRldm1fa3N0cmR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKnMsIGdmcF90IGdmcCkKK3sKKwlzaXplX3Qgc2l6ZTsKKwljaGFyICpidWY7CisKKwlpZiAoIXMpCisJCXJldHVybiBOVUxMOworCisJc2l6ZSA9IHN0cmxlbihzKSArIDE7CisJYnVmID0gZGV2bV9rbWFsbG9jKGRldiwgc2l6ZSwgZ2ZwKTsKKwlpZiAoYnVmKQorCQltZW1jcHkoYnVmLCBzLCBzaXplKTsKKwlyZXR1cm4gYnVmOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGV2bV9rc3RyZHVwKTsKKworLyoqCiAgKiBkZXZtX2tmcmVlIC0gUmVzb3VyY2UtbWFuYWdlZCBrZnJlZQogICogQGRldjogRGV2aWNlIHRoaXMgbWVtb3J5IGJlbG9uZ3MgdG8KICAqIEBwOiBNZW1vcnkgdG8gZnJlZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RtYS1idWYuYyBiL2RyaXZlcnMvYmFzZS9kbWEtYnVmLmMKaW5kZXggNjFkNmQ2Mi4uZWE3NzcwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RtYS1idWYuYworKysgYi9kcml2ZXJzL2Jhc2UvZG1hLWJ1Zi5jCkBAIC0yNTEsOSArMjUxLDggQEAKICAqIEBkbWFidWY6CVtpbl0JYnVmZmVyIHRvIGF0dGFjaCBkZXZpY2UgdG8uCiAgKiBAZGV2OglbaW5dCWRldmljZSB0byBiZSBhdHRhY2hlZC4KICAqCi0gKiBSZXR1cm5zIHN0cnVjdCBkbWFfYnVmX2F0dGFjaG1lbnQgKiBmb3IgdGhpcyBhdHRhY2htZW50OyBtYXkgcmV0dXJuIG5lZ2F0aXZlCi0gKiBlcnJvciBjb2Rlcy4KLSAqCisgKiBSZXR1cm5zIHN0cnVjdCBkbWFfYnVmX2F0dGFjaG1lbnQgKiBmb3IgdGhpcyBhdHRhY2htZW50OyByZXR1cm5zIEVSUl9QVFIgb24KKyAqIGVycm9yLgogICovCiBzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICpkbWFfYnVmX2F0dGFjaChzdHJ1Y3QgZG1hX2J1ZiAqZG1hYnVmLAogCQkJCQkgIHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTMxOSw5ICszMTgsOCBAQAogICogQGF0dGFjaDoJW2luXQlhdHRhY2htZW50IHdob3NlIHNjYXR0ZXJsaXN0IGlzIHRvIGJlIHJldHVybmVkCiAgKiBAZGlyZWN0aW9uOglbaW5dCWRpcmVjdGlvbiBvZiBETUEgdHJhbnNmZXIKICAqCi0gKiBSZXR1cm5zIHNnX3RhYmxlIGNvbnRhaW5pbmcgdGhlIHNjYXR0ZXJsaXN0IHRvIGJlIHJldHVybmVkOyBtYXkgcmV0dXJuIE5VTEwKLSAqIG9yIEVSUl9QVFIuCi0gKgorICogUmV0dXJucyBzZ190YWJsZSBjb250YWluaW5nIHRoZSBzY2F0dGVybGlzdCB0byBiZSByZXR1cm5lZDsgcmV0dXJucyBFUlJfUFRSCisgKiBvbiBlcnJvci4KICAqLwogc3RydWN0IHNnX3RhYmxlICpkbWFfYnVmX21hcF9hdHRhY2htZW50KHN0cnVjdCBkbWFfYnVmX2F0dGFjaG1lbnQgKmF0dGFjaCwKIAkJCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQpAQCAtMzM0LDYgKzMzMiw4IEBACiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCiAJc2dfdGFibGUgPSBhdHRhY2gtPmRtYWJ1Zi0+b3BzLT5tYXBfZG1hX2J1ZihhdHRhY2gsIGRpcmVjdGlvbik7CisJaWYgKCFzZ190YWJsZSkKKwkJc2dfdGFibGUgPSBFUlJfUFRSKC1FTk9NRU0pOwogCiAJcmV0dXJuIHNnX3RhYmxlOwogfQpAQCAtNTQ0LDYgKzU0NCw4IEBACiAgKiBUaGVzZSBjYWxscyBhcmUgb3B0aW9uYWwgaW4gZHJpdmVycy4gVGhlIGludGVuZGVkIHVzZSBmb3IgdGhlbQogICogaXMgZm9yIG1hcHBpbmcgb2JqZWN0cyBsaW5lYXIgaW4ga2VybmVsIHNwYWNlIGZvciBoaWdoIHVzZSBvYmplY3RzLgogICogUGxlYXNlIGF0dGVtcHQgdG8gdXNlIGttYXAva3VubWFwIGJlZm9yZSB0aGlua2luZyBhYm91dCB0aGVzZSBpbnRlcmZhY2VzLgorICoKKyAqIFJldHVybnMgTlVMTCBvbiBlcnJvci4KICAqLwogdm9pZCAqZG1hX2J1Zl92bWFwKHN0cnVjdCBkbWFfYnVmICpkbWFidWYpCiB7CkBAIC01NjYsNyArNTY4LDkgQEAKIAlCVUdfT04oZG1hYnVmLT52bWFwX3B0cik7CiAKIAlwdHIgPSBkbWFidWYtPm9wcy0+dm1hcChkbWFidWYpOwotCWlmIChJU19FUlJfT1JfTlVMTChwdHIpKQorCWlmIChXQVJOX09OX09OQ0UoSVNfRVJSKHB0cikpKQorCQlwdHIgPSBOVUxMOworCWlmICghcHRyKQogCQlnb3RvIG91dF91bmxvY2s7CiAKIAlkbWFidWYtPnZtYXBfcHRyID0gcHRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMgYi9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwppbmRleCBjMzBkZjUwZS4uZDI3NmUzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKKysrIGIvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKQEAgLTY0OSw3ICs2NDksOSBAQAogCQkJICogc2VlIHRoZSBtYXBwZWQgJ2J1Zi0+ZGF0YScgb25jZSB0aGUgbG9hZGluZwogCQkJICogaXMgY29tcGxldGVkLgogCQkJICogKi8KLQkJCWZ3X21hcF9wYWdlc19idWYoZndfYnVmKTsKKwkJCWlmIChmd19tYXBfcGFnZXNfYnVmKGZ3X2J1ZikpCisJCQkJZGV2X2VycihkZXYsICIlczogbWFwIHBhZ2VzIGZhaWxlZFxuIiwKKwkJCQkJX19mdW5jX18pOwogCQkJbGlzdF9kZWxfaW5pdCgmZndfYnVmLT5wZW5kaW5nX2xpc3QpOwogCQkJY29tcGxldGVfYWxsKCZmd19idWYtPmNvbXBsZXRpb24pOwogCQkJYnJlYWs7CkBAIC05MDAsNyArOTAyLDggQEAKIAkJZGV2X3NldF91ZXZlbnRfc3VwcHJlc3MoZl9kZXYsIGZhbHNlKTsKIAkJZGV2X2RiZyhmX2RldiwgImZpcm13YXJlOiByZXF1ZXN0aW5nICVzXG4iLCBidWYtPmZ3X2lkKTsKIAkJaWYgKHRpbWVvdXQgIT0gTUFYX1NDSEVEVUxFX1RJTUVPVVQpCi0JCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmZ3X3ByaXYtPnRpbWVvdXRfd29yaywgdGltZW91dCk7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwKKwkJCQkJICAgJmZ3X3ByaXYtPnRpbWVvdXRfd29yaywgdGltZW91dCk7CiAKIAkJa29iamVjdF91ZXZlbnQoJmZ3X3ByaXYtPmRldi5rb2JqLCBLT0JKX0FERCk7CiAJfQpAQCAtOTA4LDYgKzkxMSw4IEBACiAJd2FpdF9mb3JfY29tcGxldGlvbigmYnVmLT5jb21wbGV0aW9uKTsKIAogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZndfcHJpdi0+dGltZW91dF93b3JrKTsKKwlpZiAoIWJ1Zi0+ZGF0YSkKKwkJcmV0dmFsID0gLUVOT01FTTsKIAogCWRldmljZV9yZW1vdmVfZmlsZShmX2RldiwgJmRldl9hdHRyX2xvYWRpbmcpOwogZXJyX2RlbF9iaW5fYXR0cjoKQEAgLTE1NzAsOCArMTU3NSw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIGRldmljZV91bmNhY2hlX2Z3X2ltYWdlc19kZWxheSh1bnNpZ25lZCBsb25nIGRlbGF5KQogewotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZndfY2FjaGUud29yaywKLQkJCW1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwgJmZ3X2NhY2hlLndvcmssCisJCQkgICBtc2Vjc190b19qaWZmaWVzKGRlbGF5KSk7CiB9CiAKIHN0YXRpYyBpbnQgZndfcG1fbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZ5X2Jsb2NrLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL25vZGUuYyBiL2RyaXZlcnMvYmFzZS9ub2RlLmMKaW5kZXggYmM5ZjQzYi4uOGY3ZWQ5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL25vZGUuYworKysgYi9kcml2ZXJzL2Jhc2Uvbm9kZS5jCkBAIC01OTksNyArNTk5LDExIEBACiAKIHZvaWQgdW5yZWdpc3Rlcl9vbmVfbm9kZShpbnQgbmlkKQogeworCWlmICghbm9kZV9kZXZpY2VzW25pZF0pCisJCXJldHVybjsKKwogCXVucmVnaXN0ZXJfbm9kZShub2RlX2RldmljZXNbbmlkXSk7CisJa2ZyZWUobm9kZV9kZXZpY2VzW25pZF0pOwogCW5vZGVfZGV2aWNlc1tuaWRdID0gTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMgYi9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYwppbmRleCBiYzc4ODQ4Li5lNzE0NzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYwpAQCAtNDgxLDExICs0ODEsMTAgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoX2Rldik7CiAJaW50IHJldDsKIAotCWlmIChBQ1BJX0hBTkRMRShfZGV2KSkKLQkJYWNwaV9kZXZfcG1fYXR0YWNoKF9kZXYsIHRydWUpOworCWFjcGlfZGV2X3BtX2F0dGFjaChfZGV2LCB0cnVlKTsKIAogCXJldCA9IGRydi0+cHJvYmUoZGV2KTsKLQlpZiAocmV0ICYmIEFDUElfSEFORExFKF9kZXYpKQorCWlmIChyZXQpCiAJCWFjcGlfZGV2X3BtX2RldGFjaChfZGV2LCB0cnVlKTsKIAogCWlmIChkcnYtPnByZXZlbnRfZGVmZXJyZWRfcHJvYmUgJiYgcmV0ID09IC1FUFJPQkVfREVGRVIpIHsKQEAgLTUwOCw4ICs1MDcsNyBAQAogCWludCByZXQ7CiAKIAlyZXQgPSBkcnYtPnJlbW92ZShkZXYpOwotCWlmIChBQ1BJX0hBTkRMRShfZGV2KSkKLQkJYWNwaV9kZXZfcG1fZGV0YWNoKF9kZXYsIHRydWUpOworCWFjcGlfZGV2X3BtX2RldGFjaChfZGV2LCB0cnVlKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC01MjAsOCArNTE4LDcgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoX2Rldik7CiAKIAlkcnYtPnNodXRkb3duKGRldik7Ci0JaWYgKEFDUElfSEFORExFKF9kZXYpKQotCQlhY3BpX2Rldl9wbV9kZXRhY2goX2RldiwgdHJ1ZSk7CisJYWNwaV9kZXZfcG1fZGV0YWNoKF9kZXYsIHRydWUpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9NYWtlZmlsZSBiL2RyaXZlcnMvYmFzZS9wb3dlci9NYWtlZmlsZQppbmRleCAyZTU4ZWJiLi4xY2I4NTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL01ha2VmaWxlCkBAIC0xLDYgKzEsNSBAQAotb2JqLSQoQ09ORklHX1BNKQkrPSBzeXNmcy5vIGdlbmVyaWNfb3BzLm8gY29tbW9uLm8gcW9zLm8KK29iai0kKENPTkZJR19QTSkJKz0gc3lzZnMubyBnZW5lcmljX29wcy5vIGNvbW1vbi5vIHFvcy5vIHJ1bnRpbWUubwogb2JqLSQoQ09ORklHX1BNX1NMRUVQKQkrPSBtYWluLm8gd2FrZXVwLm8KLW9iai0kKENPTkZJR19QTV9SVU5USU1FKQkrPSBydW50aW1lLm8KIG9iai0kKENPTkZJR19QTV9UUkFDRV9SVEMpCSs9IHRyYWNlLm8KIG9iai0kKENPTkZJR19QTV9PUFApCSs9IG9wcC5vCiBvYmotJChDT05GSUdfUE1fR0VORVJJQ19ET01BSU5TKQkrPSAgZG9tYWluLm8gZG9tYWluX2dvdmVybm9yLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9jbG9ja19vcHMuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9jbG9ja19vcHMuYwppbmRleCBlODcwYmJlLi5iOTllNmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvY2xvY2tfb3BzLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2Nsb2NrX29wcy5jCkBAIC02LDcgKzYsNiBAQAogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2Mi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvY29tbW9uLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvY29tbW9uLmMKaW5kZXggNWRhOTE0MC4uZGYyZTVlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9jb21tb24uYwpAQCAtNiw3ICs2LDYgQEAKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW4uYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW4uYwppbmRleCBiZmI4OTU1Li42ZjU0OTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvZG9tYWluLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2RvbWFpbi5jCkBAIC02LDcgKzYsNiBAQAogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2Mi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgpAQCAtNDIsNyArNDEsNyBAQAogCXN0cnVjdCBncGRfdGltaW5nX2RhdGEgKl9fdGQgPSAmZGV2X2dwZF9kYXRhKGRldiktPnRkOwkJCVwKIAlpZiAoIV9fcmV0dmFsICYmIF9fZWxhcHNlZCA+IF9fdGQtPmZpZWxkKSB7CQkJCVwKIAkJX190ZC0+ZmllbGQgPSBfX2VsYXBzZWQ7CQkJCQlcCi0JCWRldl93YXJuKGRldiwgbmFtZSAiIGxhdGVuY3kgZXhjZWVkZWQsIG5ldyB2YWx1ZSAlbGxkIG5zXG4iLAlcCisJCWRldl9kYmcoZGV2LCBuYW1lICIgbGF0ZW5jeSBleGNlZWRlZCwgbmV3IHZhbHVlICVsbGQgbnNcbiIsCVwKIAkJCV9fZWxhcHNlZCk7CQkJCQkJXAogCQlnZW5wZC0+bWF4X29mZl90aW1lX2NoYW5nZWQgPSB0cnVlOwkJCQlcCiAJCV9fdGQtPmNvbnN0cmFpbnRfY2hhbmdlZCA9IHRydWU7CQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW5fZ292ZXJub3IuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW5fZ292ZXJub3IuYwppbmRleCAyOGRlZTMwLi5hMDg5ZTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvZG9tYWluX2dvdmVybm9yLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2RvbWFpbl9nb3Zlcm5vci5jCkBAIC02LDcgKzYsNiBAQAogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2Mi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX2RvbWFpbi5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKaW5kZXggMWI0MWZjYS4uODZkNWU0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3Bvd2VyLmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogCkBAIC05MSw2ICs5Miw4IEBACiB7CiAJZGV2LT5wb3dlci5pc19wcmVwYXJlZCA9IGZhbHNlOwogCWRldi0+cG93ZXIuaXNfc3VzcGVuZGVkID0gZmFsc2U7CisJZGV2LT5wb3dlci5pc19ub2lycV9zdXNwZW5kZWQgPSBmYWxzZTsKKwlkZXYtPnBvd2VyLmlzX2xhdGVfc3VzcGVuZGVkID0gZmFsc2U7CiAJaW5pdF9jb21wbGV0aW9uKCZkZXYtPnBvd2VyLmNvbXBsZXRpb24pOwogCWNvbXBsZXRlX2FsbCgmZGV2LT5wb3dlci5jb21wbGV0aW9uKTsKIAlkZXYtPnBvd2VyLndha2V1cCA9IE5VTEw7CkBAIC00NjcsNyArNDcwLDcgQEAKICAqIFRoZSBkcml2ZXIgb2YgQGRldiB3aWxsIG5vdCByZWNlaXZlIGludGVycnVwdHMgd2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBiZWluZwogICogZXhlY3V0ZWQuCiAgKi8KLXN0YXRpYyBpbnQgZGV2aWNlX3Jlc3VtZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgZGV2aWNlX3Jlc3VtZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgYm9vbCBhc3luYykKIHsKIAlwbV9jYWxsYmFja190IGNhbGxiYWNrID0gTlVMTDsKIAljaGFyICppbmZvID0gTlVMTDsKQEAgLTQ3OSw2ICs0ODIsMTEgQEAKIAlpZiAoZGV2LT5wb3dlci5zeXNjb3JlKQogCQlnb3RvIE91dDsKIAorCWlmICghZGV2LT5wb3dlci5pc19ub2lycV9zdXNwZW5kZWQpCisJCWdvdG8gT3V0OworCisJZHBtX3dhaXQoZGV2LT5wYXJlbnQsIGFzeW5jKTsKKwogCWlmIChkZXYtPnBtX2RvbWFpbikgewogCQlpbmZvID0gIm5vaXJxIHBvd2VyIGRvbWFpbiAiOwogCQljYWxsYmFjayA9IHBtX25vaXJxX29wKCZkZXYtPnBtX2RvbWFpbi0+b3BzLCBzdGF0ZSk7CkBAIC00OTksMTIgKzUwNywzMiBAQAogCX0KIAogCWVycm9yID0gZHBtX3J1bl9jYWxsYmFjayhjYWxsYmFjaywgZGV2LCBzdGF0ZSwgaW5mbyk7CisJZGV2LT5wb3dlci5pc19ub2lycV9zdXNwZW5kZWQgPSBmYWxzZTsKIAogIE91dDoKKwljb21wbGV0ZV9hbGwoJmRldi0+cG93ZXIuY29tcGxldGlvbik7CiAJVFJBQ0VfUkVTVU1FKGVycm9yKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKK3N0YXRpYyBib29sIGlzX2FzeW5jKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2LT5wb3dlci5hc3luY19zdXNwZW5kICYmIHBtX2FzeW5jX2VuYWJsZWQKKwkJJiYgIXBtX3RyYWNlX2lzX2VuYWJsZWQoKTsKK30KKworc3RhdGljIHZvaWQgYXN5bmNfcmVzdW1lX25vaXJxKHZvaWQgKmRhdGEsIGFzeW5jX2Nvb2tpZV90IGNvb2tpZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAoc3RydWN0IGRldmljZSAqKWRhdGE7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZXZpY2VfcmVzdW1lX25vaXJxKGRldiwgcG1fdHJhbnNpdGlvbiwgdHJ1ZSk7CisJaWYgKGVycm9yKQorCQlwbV9kZXZfZXJyKGRldiwgcG1fdHJhbnNpdGlvbiwgIiBhc3luYyIsIGVycm9yKTsKKworCXB1dF9kZXZpY2UoZGV2KTsKK30KKwogLyoqCiAgKiBkcG1fcmVzdW1lX25vaXJxIC0gRXhlY3V0ZSAibm9pcnEgcmVzdW1lIiBjYWxsYmFja3MgZm9yIGFsbCBkZXZpY2VzLgogICogQHN0YXRlOiBQTSB0cmFuc2l0aW9uIG9mIHRoZSBzeXN0ZW0gYmVpbmcgY2FycmllZCBvdXQuCkBAIC01MTQsMjkgKzU0Miw0OCBAQAogICovCiBzdGF0aWMgdm9pZCBkcG1fcmVzdW1lX25vaXJxKHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJa3RpbWVfdCBzdGFydHRpbWUgPSBrdGltZV9nZXQoKTsKIAogCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZkcG1fbm9pcnFfbGlzdCkpIHsKLQkJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2aWNlKGRwbV9ub2lycV9saXN0Lm5leHQpOwotCQlpbnQgZXJyb3I7CisJcG1fdHJhbnNpdGlvbiA9IHN0YXRlOwogCisJLyoKKwkgKiBBZHZhbmNlZCB0aGUgYXN5bmMgdGhyZWFkcyB1cGZyb250LAorCSAqIGluIGNhc2UgdGhlIHN0YXJ0aW5nIG9mIGFzeW5jIHRocmVhZHMgaXMKKwkgKiBkZWxheWVkIGJ5IG5vbi1hc3luYyByZXN1bWluZyBkZXZpY2VzLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmZHBtX25vaXJxX2xpc3QsIHBvd2VyLmVudHJ5KSB7CisJCXJlaW5pdF9jb21wbGV0aW9uKCZkZXYtPnBvd2VyLmNvbXBsZXRpb24pOworCQlpZiAoaXNfYXN5bmMoZGV2KSkgeworCQkJZ2V0X2RldmljZShkZXYpOworCQkJYXN5bmNfc2NoZWR1bGUoYXN5bmNfcmVzdW1lX25vaXJxLCBkZXYpOworCQl9CisJfQorCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZkcG1fbm9pcnFfbGlzdCkpIHsKKwkJZGV2ID0gdG9fZGV2aWNlKGRwbV9ub2lycV9saXN0Lm5leHQpOwogCQlnZXRfZGV2aWNlKGRldik7CiAJCWxpc3RfbW92ZV90YWlsKCZkZXYtPnBvd2VyLmVudHJ5LCAmZHBtX2xhdGVfZWFybHlfbGlzdCk7CiAJCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKIAotCQllcnJvciA9IGRldmljZV9yZXN1bWVfbm9pcnEoZGV2LCBzdGF0ZSk7Ci0JCWlmIChlcnJvcikgewotCQkJc3VzcGVuZF9zdGF0cy5mYWlsZWRfcmVzdW1lX25vaXJxKys7Ci0JCQlkcG1fc2F2ZV9mYWlsZWRfc3RlcChTVVNQRU5EX1JFU1VNRV9OT0lSUSk7Ci0JCQlkcG1fc2F2ZV9mYWlsZWRfZGV2KGRldl9uYW1lKGRldikpOwotCQkJcG1fZGV2X2VycihkZXYsIHN0YXRlLCAiIG5vaXJxIiwgZXJyb3IpOworCQlpZiAoIWlzX2FzeW5jKGRldikpIHsKKwkJCWludCBlcnJvcjsKKworCQkJZXJyb3IgPSBkZXZpY2VfcmVzdW1lX25vaXJxKGRldiwgc3RhdGUsIGZhbHNlKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXN1c3BlbmRfc3RhdHMuZmFpbGVkX3Jlc3VtZV9ub2lycSsrOworCQkJCWRwbV9zYXZlX2ZhaWxlZF9zdGVwKFNVU1BFTkRfUkVTVU1FX05PSVJRKTsKKwkJCQlkcG1fc2F2ZV9mYWlsZWRfZGV2KGRldl9uYW1lKGRldikpOworCQkJCXBtX2Rldl9lcnIoZGV2LCBzdGF0ZSwgIiBub2lycSIsIGVycm9yKTsKKwkJCX0KIAkJfQogCiAJCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7CiAJCXB1dF9kZXZpY2UoZGV2KTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOworCWFzeW5jX3N5bmNocm9uaXplX2Z1bGwoKTsKIAlkcG1fc2hvd190aW1lKHN0YXJ0dGltZSwgc3RhdGUsICJub2lycSIpOwogCXJlc3VtZV9kZXZpY2VfaXJxcygpOwogCWNwdWlkbGVfcmVzdW1lKCk7CkBAIC01NDksNyArNTk2LDcgQEAKICAqCiAgKiBSdW50aW1lIFBNIGlzIGRpc2FibGVkIGZvciBAZGV2IHdoaWxlIHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgZXhlY3V0ZWQuCiAgKi8KLXN0YXRpYyBpbnQgZGV2aWNlX3Jlc3VtZV9lYXJseShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgZGV2aWNlX3Jlc3VtZV9lYXJseShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgYm9vbCBhc3luYykKIHsKIAlwbV9jYWxsYmFja190IGNhbGxiYWNrID0gTlVMTDsKIAljaGFyICppbmZvID0gTlVMTDsKQEAgLTU2MSw2ICs2MDgsMTEgQEAKIAlpZiAoZGV2LT5wb3dlci5zeXNjb3JlKQogCQlnb3RvIE91dDsKIAorCWlmICghZGV2LT5wb3dlci5pc19sYXRlX3N1c3BlbmRlZCkKKwkJZ290byBPdXQ7CisKKwlkcG1fd2FpdChkZXYtPnBhcmVudCwgYXN5bmMpOworCiAJaWYgKGRldi0+cG1fZG9tYWluKSB7CiAJCWluZm8gPSAiZWFybHkgcG93ZXIgZG9tYWluICI7CiAJCWNhbGxiYWNrID0gcG1fbGF0ZV9lYXJseV9vcCgmZGV2LT5wbV9kb21haW4tPm9wcywgc3RhdGUpOwpAQCAtNTgxLDQzICs2MzMsNzUgQEAKIAl9CiAKIAllcnJvciA9IGRwbV9ydW5fY2FsbGJhY2soY2FsbGJhY2ssIGRldiwgc3RhdGUsIGluZm8pOworCWRldi0+cG93ZXIuaXNfbGF0ZV9zdXNwZW5kZWQgPSBmYWxzZTsKIAogIE91dDoKIAlUUkFDRV9SRVNVTUUoZXJyb3IpOwogCiAJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKKwljb21wbGV0ZV9hbGwoJmRldi0+cG93ZXIuY29tcGxldGlvbik7CiAJcmV0dXJuIGVycm9yOwogfQogCitzdGF0aWMgdm9pZCBhc3luY19yZXN1bWVfZWFybHkodm9pZCAqZGF0YSwgYXN5bmNfY29va2llX3QgY29va2llKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IChzdHJ1Y3QgZGV2aWNlICopZGF0YTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRldmljZV9yZXN1bWVfZWFybHkoZGV2LCBwbV90cmFuc2l0aW9uLCB0cnVlKTsKKwlpZiAoZXJyb3IpCisJCXBtX2Rldl9lcnIoZGV2LCBwbV90cmFuc2l0aW9uLCAiIGFzeW5jIiwgZXJyb3IpOworCisJcHV0X2RldmljZShkZXYpOworfQorCiAvKioKICAqIGRwbV9yZXN1bWVfZWFybHkgLSBFeGVjdXRlICJlYXJseSByZXN1bWUiIGNhbGxiYWNrcyBmb3IgYWxsIGRldmljZXMuCiAgKiBAc3RhdGU6IFBNIHRyYW5zaXRpb24gb2YgdGhlIHN5c3RlbSBiZWluZyBjYXJyaWVkIG91dC4KICAqLwogc3RhdGljIHZvaWQgZHBtX3Jlc3VtZV9lYXJseShwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CisJc3RydWN0IGRldmljZSAqZGV2OwogCWt0aW1lX3Qgc3RhcnR0aW1lID0ga3RpbWVfZ2V0KCk7CiAKIAltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwotCXdoaWxlICghbGlzdF9lbXB0eSgmZHBtX2xhdGVfZWFybHlfbGlzdCkpIHsKLQkJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2aWNlKGRwbV9sYXRlX2Vhcmx5X2xpc3QubmV4dCk7Ci0JCWludCBlcnJvcjsKKwlwbV90cmFuc2l0aW9uID0gc3RhdGU7CiAKKwkvKgorCSAqIEFkdmFuY2VkIHRoZSBhc3luYyB0aHJlYWRzIHVwZnJvbnQsCisJICogaW4gY2FzZSB0aGUgc3RhcnRpbmcgb2YgYXN5bmMgdGhyZWFkcyBpcworCSAqIGRlbGF5ZWQgYnkgbm9uLWFzeW5jIHJlc3VtaW5nIGRldmljZXMuCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZkcG1fbGF0ZV9lYXJseV9saXN0LCBwb3dlci5lbnRyeSkgeworCQlyZWluaXRfY29tcGxldGlvbigmZGV2LT5wb3dlci5jb21wbGV0aW9uKTsKKwkJaWYgKGlzX2FzeW5jKGRldikpIHsKKwkJCWdldF9kZXZpY2UoZGV2KTsKKwkJCWFzeW5jX3NjaGVkdWxlKGFzeW5jX3Jlc3VtZV9lYXJseSwgZGV2KTsKKwkJfQorCX0KKworCXdoaWxlICghbGlzdF9lbXB0eSgmZHBtX2xhdGVfZWFybHlfbGlzdCkpIHsKKwkJZGV2ID0gdG9fZGV2aWNlKGRwbV9sYXRlX2Vhcmx5X2xpc3QubmV4dCk7CiAJCWdldF9kZXZpY2UoZGV2KTsKIAkJbGlzdF9tb3ZlX3RhaWwoJmRldi0+cG93ZXIuZW50cnksICZkcG1fc3VzcGVuZGVkX2xpc3QpOwogCQltdXRleF91bmxvY2soJmRwbV9saXN0X210eCk7CiAKLQkJZXJyb3IgPSBkZXZpY2VfcmVzdW1lX2Vhcmx5KGRldiwgc3RhdGUpOwotCQlpZiAoZXJyb3IpIHsKLQkJCXN1c3BlbmRfc3RhdHMuZmFpbGVkX3Jlc3VtZV9lYXJseSsrOwotCQkJZHBtX3NhdmVfZmFpbGVkX3N0ZXAoU1VTUEVORF9SRVNVTUVfRUFSTFkpOwotCQkJZHBtX3NhdmVfZmFpbGVkX2RldihkZXZfbmFtZShkZXYpKTsKLQkJCXBtX2Rldl9lcnIoZGV2LCBzdGF0ZSwgIiBlYXJseSIsIGVycm9yKTsKLQkJfQorCQlpZiAoIWlzX2FzeW5jKGRldikpIHsKKwkJCWludCBlcnJvcjsKIAorCQkJZXJyb3IgPSBkZXZpY2VfcmVzdW1lX2Vhcmx5KGRldiwgc3RhdGUsIGZhbHNlKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXN1c3BlbmRfc3RhdHMuZmFpbGVkX3Jlc3VtZV9lYXJseSsrOworCQkJCWRwbV9zYXZlX2ZhaWxlZF9zdGVwKFNVU1BFTkRfUkVTVU1FX0VBUkxZKTsKKwkJCQlkcG1fc2F2ZV9mYWlsZWRfZGV2KGRldl9uYW1lKGRldikpOworCQkJCXBtX2Rldl9lcnIoZGV2LCBzdGF0ZSwgIiBlYXJseSIsIGVycm9yKTsKKwkJCX0KKwkJfQogCQltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwogCQlwdXRfZGV2aWNlKGRldik7CiAJfQogCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKKwlhc3luY19zeW5jaHJvbml6ZV9mdWxsKCk7CiAJZHBtX3Nob3dfdGltZShzdGFydHRpbWUsIHN0YXRlLCAiZWFybHkiKTsKIH0KIApAQCAtNzMyLDEyICs4MTYsNiBAQAogCXB1dF9kZXZpY2UoZGV2KTsKIH0KIAotc3RhdGljIGJvb2wgaXNfYXN5bmMoc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBkZXYtPnBvd2VyLmFzeW5jX3N1c3BlbmQgJiYgcG1fYXN5bmNfZW5hYmxlZAotCQkmJiAhcG1fdHJhY2VfaXNfZW5hYmxlZCgpOwotfQotCiAvKioKICAqIGRwbV9yZXN1bWUgLSBFeGVjdXRlICJyZXN1bWUiIGNhbGxiYWNrcyBmb3Igbm9uLXN5c2RldiBkZXZpY2VzLgogICogQHN0YXRlOiBQTSB0cmFuc2l0aW9uIG9mIHRoZSBzeXN0ZW0gYmVpbmcgY2FycmllZCBvdXQuCkBAIC03ODksNiArODY3LDggQEAKIAltdXRleF91bmxvY2soJmRwbV9saXN0X210eCk7CiAJYXN5bmNfc3luY2hyb25pemVfZnVsbCgpOwogCWRwbV9zaG93X3RpbWUoc3RhcnR0aW1lLCBzdGF0ZSwgTlVMTCk7CisKKwljcHVmcmVxX3Jlc3VtZSgpOwogfQogCiAvKioKQEAgLTkxMywxMyArOTkzLDI0IEBACiAgKiBUaGUgZHJpdmVyIG9mIEBkZXYgd2lsbCBub3QgcmVjZWl2ZSBpbnRlcnJ1cHRzIHdoaWxlIHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcKICAqIGV4ZWN1dGVkLgogICovCi1zdGF0aWMgaW50IGRldmljZV9zdXNwZW5kX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBfX2RldmljZV9zdXNwZW5kX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlLCBib29sIGFzeW5jKQogewogCXBtX2NhbGxiYWNrX3QgY2FsbGJhY2sgPSBOVUxMOwogCWNoYXIgKmluZm8gPSBOVUxMOworCWludCBlcnJvciA9IDA7CisKKwlpZiAoYXN5bmNfZXJyb3IpCisJCWdvdG8gQ29tcGxldGU7CisKKwlpZiAocG1fd2FrZXVwX3BlbmRpbmcoKSkgeworCQlhc3luY19lcnJvciA9IC1FQlVTWTsKKwkJZ290byBDb21wbGV0ZTsKKwl9CiAKIAlpZiAoZGV2LT5wb3dlci5zeXNjb3JlKQotCQlyZXR1cm4gMDsKKwkJZ290byBDb21wbGV0ZTsKKworCWRwbV93YWl0X2Zvcl9jaGlsZHJlbihkZXYsIGFzeW5jKTsKIAogCWlmIChkZXYtPnBtX2RvbWFpbikgewogCQlpbmZvID0gIm5vaXJxIHBvd2VyIGRvbWFpbiAiOwpAQCAtOTQwLDcgKzEwMzEsNDEgQEAKIAkJY2FsbGJhY2sgPSBwbV9ub2lycV9vcChkZXYtPmRyaXZlci0+cG0sIHN0YXRlKTsKIAl9CiAKLQlyZXR1cm4gZHBtX3J1bl9jYWxsYmFjayhjYWxsYmFjaywgZGV2LCBzdGF0ZSwgaW5mbyk7CisJZXJyb3IgPSBkcG1fcnVuX2NhbGxiYWNrKGNhbGxiYWNrLCBkZXYsIHN0YXRlLCBpbmZvKTsKKwlpZiAoIWVycm9yKQorCQlkZXYtPnBvd2VyLmlzX25vaXJxX3N1c3BlbmRlZCA9IHRydWU7CisJZWxzZQorCQlhc3luY19lcnJvciA9IGVycm9yOworCitDb21wbGV0ZToKKwljb21wbGV0ZV9hbGwoJmRldi0+cG93ZXIuY29tcGxldGlvbik7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBhc3luY19zdXNwZW5kX25vaXJxKHZvaWQgKmRhdGEsIGFzeW5jX2Nvb2tpZV90IGNvb2tpZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAoc3RydWN0IGRldmljZSAqKWRhdGE7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBfX2RldmljZV9zdXNwZW5kX25vaXJxKGRldiwgcG1fdHJhbnNpdGlvbiwgdHJ1ZSk7CisJaWYgKGVycm9yKSB7CisJCWRwbV9zYXZlX2ZhaWxlZF9kZXYoZGV2X25hbWUoZGV2KSk7CisJCXBtX2Rldl9lcnIoZGV2LCBwbV90cmFuc2l0aW9uLCAiIGFzeW5jIiwgZXJyb3IpOworCX0KKworCXB1dF9kZXZpY2UoZGV2KTsKK30KKworc3RhdGljIGludCBkZXZpY2Vfc3VzcGVuZF9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmVpbml0X2NvbXBsZXRpb24oJmRldi0+cG93ZXIuY29tcGxldGlvbik7CisKKwlpZiAocG1fYXN5bmNfZW5hYmxlZCAmJiBkZXYtPnBvd2VyLmFzeW5jX3N1c3BlbmQpIHsKKwkJZ2V0X2RldmljZShkZXYpOworCQlhc3luY19zY2hlZHVsZShhc3luY19zdXNwZW5kX25vaXJxLCBkZXYpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIF9fZGV2aWNlX3N1c3BlbmRfbm9pcnEoZGV2LCBwbV90cmFuc2l0aW9uLCBmYWxzZSk7CiB9CiAKIC8qKgpAQCAtOTU4LDE5ICsxMDgzLDIwIEBACiAJY3B1aWRsZV9wYXVzZSgpOwogCXN1c3BlbmRfZGV2aWNlX2lycXMoKTsKIAltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOworCXBtX3RyYW5zaXRpb24gPSBzdGF0ZTsKKwlhc3luY19lcnJvciA9IDA7CisKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmRwbV9sYXRlX2Vhcmx5X2xpc3QpKSB7CiAJCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2RldmljZShkcG1fbGF0ZV9lYXJseV9saXN0LnByZXYpOwogCiAJCWdldF9kZXZpY2UoZGV2KTsKIAkJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOwogCi0JCWVycm9yID0gZGV2aWNlX3N1c3BlbmRfbm9pcnEoZGV2LCBzdGF0ZSk7CisJCWVycm9yID0gZGV2aWNlX3N1c3BlbmRfbm9pcnEoZGV2KTsKIAogCQltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwogCQlpZiAoZXJyb3IpIHsKIAkJCXBtX2Rldl9lcnIoZGV2LCBzdGF0ZSwgIiBub2lycSIsIGVycm9yKTsKLQkJCXN1c3BlbmRfc3RhdHMuZmFpbGVkX3N1c3BlbmRfbm9pcnErKzsKLQkJCWRwbV9zYXZlX2ZhaWxlZF9zdGVwKFNVU1BFTkRfU1VTUEVORF9OT0lSUSk7CiAJCQlkcG1fc2F2ZV9mYWlsZWRfZGV2KGRldl9uYW1lKGRldikpOwogCQkJcHV0X2RldmljZShkZXYpOwogCQkJYnJlYWs7CkBAIC05NzksMTYgKzExMDUsMjEgQEAKIAkJCWxpc3RfbW92ZSgmZGV2LT5wb3dlci5lbnRyeSwgJmRwbV9ub2lycV9saXN0KTsKIAkJcHV0X2RldmljZShkZXYpOwogCi0JCWlmIChwbV93YWtldXBfcGVuZGluZygpKSB7Ci0JCQllcnJvciA9IC1FQlVTWTsKKwkJaWYgKGFzeW5jX2Vycm9yKQogCQkJYnJlYWs7Ci0JCX0KIAl9CiAJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOwotCWlmIChlcnJvcikKKwlhc3luY19zeW5jaHJvbml6ZV9mdWxsKCk7CisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBhc3luY19lcnJvcjsKKworCWlmIChlcnJvcikgeworCQlzdXNwZW5kX3N0YXRzLmZhaWxlZF9zdXNwZW5kX25vaXJxKys7CisJCWRwbV9zYXZlX2ZhaWxlZF9zdGVwKFNVU1BFTkRfU1VTUEVORF9OT0lSUSk7CiAJCWRwbV9yZXN1bWVfbm9pcnEocmVzdW1lX2V2ZW50KHN0YXRlKSk7Ci0JZWxzZQorCX0gZWxzZSB7CiAJCWRwbV9zaG93X3RpbWUoc3RhcnR0aW1lLCBzdGF0ZSwgIm5vaXJxIik7CisJfQogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtOTk5LDE1ICsxMTMwLDI2IEBACiAgKgogICogUnVudGltZSBQTSBpcyBkaXNhYmxlZCBmb3IgQGRldiB3aGlsZSB0aGlzIGZ1bmN0aW9uIGlzIGJlaW5nIGV4ZWN1dGVkLgogICovCi1zdGF0aWMgaW50IGRldmljZV9zdXNwZW5kX2xhdGUoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IF9fZGV2aWNlX3N1c3BlbmRfbGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgYm9vbCBhc3luYykKIHsKIAlwbV9jYWxsYmFja190IGNhbGxiYWNrID0gTlVMTDsKIAljaGFyICppbmZvID0gTlVMTDsKKwlpbnQgZXJyb3IgPSAwOwogCiAJX19wbV9ydW50aW1lX2Rpc2FibGUoZGV2LCBmYWxzZSk7CiAKKwlpZiAoYXN5bmNfZXJyb3IpCisJCWdvdG8gQ29tcGxldGU7CisKKwlpZiAocG1fd2FrZXVwX3BlbmRpbmcoKSkgeworCQlhc3luY19lcnJvciA9IC1FQlVTWTsKKwkJZ290byBDb21wbGV0ZTsKKwl9CisKIAlpZiAoZGV2LT5wb3dlci5zeXNjb3JlKQotCQlyZXR1cm4gMDsKKwkJZ290byBDb21wbGV0ZTsKKworCWRwbV93YWl0X2Zvcl9jaGlsZHJlbihkZXYsIGFzeW5jKTsKIAogCWlmIChkZXYtPnBtX2RvbWFpbikgewogCQlpbmZvID0gImxhdGUgcG93ZXIgZG9tYWluICI7CkBAIC0xMDI4LDcgKzExNzAsNDEgQEAKIAkJY2FsbGJhY2sgPSBwbV9sYXRlX2Vhcmx5X29wKGRldi0+ZHJpdmVyLT5wbSwgc3RhdGUpOwogCX0KIAotCXJldHVybiBkcG1fcnVuX2NhbGxiYWNrKGNhbGxiYWNrLCBkZXYsIHN0YXRlLCBpbmZvKTsKKwllcnJvciA9IGRwbV9ydW5fY2FsbGJhY2soY2FsbGJhY2ssIGRldiwgc3RhdGUsIGluZm8pOworCWlmICghZXJyb3IpCisJCWRldi0+cG93ZXIuaXNfbGF0ZV9zdXNwZW5kZWQgPSB0cnVlOworCWVsc2UKKwkJYXN5bmNfZXJyb3IgPSBlcnJvcjsKKworQ29tcGxldGU6CisJY29tcGxldGVfYWxsKCZkZXYtPnBvd2VyLmNvbXBsZXRpb24pOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgYXN5bmNfc3VzcGVuZF9sYXRlKHZvaWQgKmRhdGEsIGFzeW5jX2Nvb2tpZV90IGNvb2tpZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAoc3RydWN0IGRldmljZSAqKWRhdGE7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBfX2RldmljZV9zdXNwZW5kX2xhdGUoZGV2LCBwbV90cmFuc2l0aW9uLCB0cnVlKTsKKwlpZiAoZXJyb3IpIHsKKwkJZHBtX3NhdmVfZmFpbGVkX2RldihkZXZfbmFtZShkZXYpKTsKKwkJcG1fZGV2X2VycihkZXYsIHBtX3RyYW5zaXRpb24sICIgYXN5bmMiLCBlcnJvcik7CisJfQorCXB1dF9kZXZpY2UoZGV2KTsKK30KKworc3RhdGljIGludCBkZXZpY2Vfc3VzcGVuZF9sYXRlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZWluaXRfY29tcGxldGlvbigmZGV2LT5wb3dlci5jb21wbGV0aW9uKTsKKworCWlmIChwbV9hc3luY19lbmFibGVkICYmIGRldi0+cG93ZXIuYXN5bmNfc3VzcGVuZCkgeworCQlnZXRfZGV2aWNlKGRldik7CisJCWFzeW5jX3NjaGVkdWxlKGFzeW5jX3N1c3BlbmRfbGF0ZSwgZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIF9fZGV2aWNlX3N1c3BlbmRfbGF0ZShkZXYsIHBtX3RyYW5zaXRpb24sIGZhbHNlKTsKIH0KIAogLyoqCkBAIC0xMDQxLDE5ICsxMjE3LDIwIEBACiAJaW50IGVycm9yID0gMDsKIAogCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7CisJcG1fdHJhbnNpdGlvbiA9IHN0YXRlOworCWFzeW5jX2Vycm9yID0gMDsKKwogCXdoaWxlICghbGlzdF9lbXB0eSgmZHBtX3N1c3BlbmRlZF9saXN0KSkgewogCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXZpY2UoZHBtX3N1c3BlbmRlZF9saXN0LnByZXYpOwogCiAJCWdldF9kZXZpY2UoZGV2KTsKIAkJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOwogCi0JCWVycm9yID0gZGV2aWNlX3N1c3BlbmRfbGF0ZShkZXYsIHN0YXRlKTsKKwkJZXJyb3IgPSBkZXZpY2Vfc3VzcGVuZF9sYXRlKGRldik7CiAKIAkJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKIAkJaWYgKGVycm9yKSB7CiAJCQlwbV9kZXZfZXJyKGRldiwgc3RhdGUsICIgbGF0ZSIsIGVycm9yKTsKLQkJCXN1c3BlbmRfc3RhdHMuZmFpbGVkX3N1c3BlbmRfbGF0ZSsrOwotCQkJZHBtX3NhdmVfZmFpbGVkX3N0ZXAoU1VTUEVORF9TVVNQRU5EX0xBVEUpOwogCQkJZHBtX3NhdmVfZmFpbGVkX2RldihkZXZfbmFtZShkZXYpKTsKIAkJCXB1dF9kZXZpY2UoZGV2KTsKIAkJCWJyZWFrOwpAQCAtMTA2MiwxNyArMTIzOSwxOCBAQAogCQkJbGlzdF9tb3ZlKCZkZXYtPnBvd2VyLmVudHJ5LCAmZHBtX2xhdGVfZWFybHlfbGlzdCk7CiAJCXB1dF9kZXZpY2UoZGV2KTsKIAotCQlpZiAocG1fd2FrZXVwX3BlbmRpbmcoKSkgewotCQkJZXJyb3IgPSAtRUJVU1k7CisJCWlmIChhc3luY19lcnJvcikKIAkJCWJyZWFrOwotCQl9CiAJfQogCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKLQlpZiAoZXJyb3IpCisJYXN5bmNfc3luY2hyb25pemVfZnVsbCgpOworCWlmIChlcnJvcikgeworCQlzdXNwZW5kX3N0YXRzLmZhaWxlZF9zdXNwZW5kX2xhdGUrKzsKKwkJZHBtX3NhdmVfZmFpbGVkX3N0ZXAoU1VTUEVORF9TVVNQRU5EX0xBVEUpOwogCQlkcG1fcmVzdW1lX2Vhcmx5KHJlc3VtZV9ldmVudChzdGF0ZSkpOwotCWVsc2UKKwl9IGVsc2UgewogCQlkcG1fc2hvd190aW1lKHN0YXJ0dGltZSwgc3RhdGUsICJsYXRlIik7Ci0KKwl9CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0xMjU5LDYgKzE0MzcsOCBAQAogCiAJbWlnaHRfc2xlZXAoKTsKIAorCWNwdWZyZXFfc3VzcGVuZCgpOworCiAJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKIAlwbV90cmFuc2l0aW9uID0gc3RhdGU7CiAJYXN5bmNfZXJyb3IgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC5jCmluZGV4IGZhNDE4NzQuLjI1NTM4NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9vcHAuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvb3BwLmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3Bvd2VyLmggYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcG93ZXIuaAppbmRleCBjZmMzMjI2Li5hMjEyMjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvcG93ZXIuaAorKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcG93ZXIuaApAQCAtODksOCArODksOCBAQAogZXh0ZXJuIHZvaWQgcnBtX3N5c2ZzX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCB3YWtldXBfc3lzZnNfYWRkKHN0cnVjdCBkZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCB3YWtldXBfc3lzZnNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldik7Ci1leHRlcm4gaW50IHBtX3Fvc19zeXNmc19hZGRfbGF0ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgcG1fcW9zX3N5c2ZzX3JlbW92ZV9sYXRlbmN5KHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHBtX3Fvc19zeXNmc19hZGRfcmVzdW1lX2xhdGVuY3koc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIHBtX3Fvc19zeXNmc19yZW1vdmVfcmVzdW1lX2xhdGVuY3koc3RydWN0IGRldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgcG1fcW9zX3N5c2ZzX2FkZF9mbGFncyhzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgcG1fcW9zX3N5c2ZzX3JlbW92ZV9mbGFncyhzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvcW9zLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcW9zLmMKaW5kZXggNWMxMzYxYS4uMzZiOWViNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL3Fvcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9xb3MuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiBzMzIgX19kZXZfcG1fcW9zX3JlYWRfdmFsdWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXJldHVybiBJU19FUlJfT1JfTlVMTChkZXYtPnBvd2VyLnFvcykgPwotCQkwIDogcG1fcW9zX3JlYWRfdmFsdWUoJmRldi0+cG93ZXIucW9zLT5sYXRlbmN5KTsKKwkJMCA6IHBtX3Fvc19yZWFkX3ZhbHVlKCZkZXYtPnBvd2VyLnFvcy0+cmVzdW1lX2xhdGVuY3kpOwogfQogCiAvKioKQEAgLTE0MSwxNiArMTQxLDI0IEBACiAJaW50IHJldDsKIAogCXN3aXRjaChyZXEtPnR5cGUpIHsKLQljYXNlIERFVl9QTV9RT1NfTEFURU5DWToKLQkJcmV0ID0gcG1fcW9zX3VwZGF0ZV90YXJnZXQoJnFvcy0+bGF0ZW5jeSwgJnJlcS0+ZGF0YS5wbm9kZSwKLQkJCQkJICAgYWN0aW9uLCB2YWx1ZSk7CisJY2FzZSBERVZfUE1fUU9TX1JFU1VNRV9MQVRFTkNZOgorCQlyZXQgPSBwbV9xb3NfdXBkYXRlX3RhcmdldCgmcW9zLT5yZXN1bWVfbGF0ZW5jeSwKKwkJCQkJICAgJnJlcS0+ZGF0YS5wbm9kZSwgYWN0aW9uLCB2YWx1ZSk7CiAJCWlmIChyZXQpIHsKLQkJCXZhbHVlID0gcG1fcW9zX3JlYWRfdmFsdWUoJnFvcy0+bGF0ZW5jeSk7CisJCQl2YWx1ZSA9IHBtX3Fvc19yZWFkX3ZhbHVlKCZxb3MtPnJlc3VtZV9sYXRlbmN5KTsKIAkJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmRldl9wbV9ub3RpZmllcnMsCiAJCQkJCQkgICAgICh1bnNpZ25lZCBsb25nKXZhbHVlLAogCQkJCQkJICAgICByZXEpOwogCQl9CiAJCWJyZWFrOworCWNhc2UgREVWX1BNX1FPU19MQVRFTkNZX1RPTEVSQU5DRToKKwkJcmV0ID0gcG1fcW9zX3VwZGF0ZV90YXJnZXQoJnFvcy0+bGF0ZW5jeV90b2xlcmFuY2UsCisJCQkJCSAgICZyZXEtPmRhdGEucG5vZGUsIGFjdGlvbiwgdmFsdWUpOworCQlpZiAocmV0KSB7CisJCQl2YWx1ZSA9IHBtX3Fvc19yZWFkX3ZhbHVlKCZxb3MtPmxhdGVuY3lfdG9sZXJhbmNlKTsKKwkJCXJlcS0+ZGV2LT5wb3dlci5zZXRfbGF0ZW5jeV90b2xlcmFuY2UocmVxLT5kZXYsIHZhbHVlKTsKKwkJfQorCQlicmVhazsKIAljYXNlIERFVl9QTV9RT1NfRkxBR1M6CiAJCXJldCA9IHBtX3Fvc191cGRhdGVfZmxhZ3MoJnFvcy0+ZmxhZ3MsICZyZXEtPmRhdGEuZmxyLAogCQkJCQkgIGFjdGlvbiwgdmFsdWUpOwpAQCAtMTg2LDEzICsxOTQsMjEgQEAKIAl9CiAJQkxPQ0tJTkdfSU5JVF9OT1RJRklFUl9IRUFEKG4pOwogCi0JYyA9ICZxb3MtPmxhdGVuY3k7CisJYyA9ICZxb3MtPnJlc3VtZV9sYXRlbmN5OwogCXBsaXN0X2hlYWRfaW5pdCgmYy0+bGlzdCk7Ci0JYy0+dGFyZ2V0X3ZhbHVlID0gUE1fUU9TX0RFVl9MQVRfREVGQVVMVF9WQUxVRTsKLQljLT5kZWZhdWx0X3ZhbHVlID0gUE1fUU9TX0RFVl9MQVRfREVGQVVMVF9WQUxVRTsKKwljLT50YXJnZXRfdmFsdWUgPSBQTV9RT1NfUkVTVU1FX0xBVEVOQ1lfREVGQVVMVF9WQUxVRTsKKwljLT5kZWZhdWx0X3ZhbHVlID0gUE1fUU9TX1JFU1VNRV9MQVRFTkNZX0RFRkFVTFRfVkFMVUU7CisJYy0+bm9fY29uc3RyYWludF92YWx1ZSA9IFBNX1FPU19SRVNVTUVfTEFURU5DWV9ERUZBVUxUX1ZBTFVFOwogCWMtPnR5cGUgPSBQTV9RT1NfTUlOOwogCWMtPm5vdGlmaWVycyA9IG47CiAKKwljID0gJnFvcy0+bGF0ZW5jeV90b2xlcmFuY2U7CisJcGxpc3RfaGVhZF9pbml0KCZjLT5saXN0KTsKKwljLT50YXJnZXRfdmFsdWUgPSBQTV9RT1NfTEFURU5DWV9UT0xFUkFOQ0VfREVGQVVMVF9WQUxVRTsKKwljLT5kZWZhdWx0X3ZhbHVlID0gUE1fUU9TX0xBVEVOQ1lfVE9MRVJBTkNFX0RFRkFVTFRfVkFMVUU7CisJYy0+bm9fY29uc3RyYWludF92YWx1ZSA9IFBNX1FPU19MQVRFTkNZX1RPTEVSQU5DRV9OT19DT05TVFJBSU5UOworCWMtPnR5cGUgPSBQTV9RT1NfTUlOOworCiAJSU5JVF9MSVNUX0hFQUQoJnFvcy0+ZmxhZ3MubGlzdCk7CiAKIAlzcGluX2xvY2tfaXJxKCZkZXYtPnBvd2VyLmxvY2spOwpAQCAtMjI0LDcgKzI0MCw3IEBACiAJICogSWYgdGhlIGRldmljZSdzIFBNIFFvUyByZXN1bWUgbGF0ZW5jeSBsaW1pdCBvciBQTSBRb1MgZmxhZ3MgaGF2ZSBiZWVuCiAJICogZXhwb3NlZCB0byB1c2VyIHNwYWNlLCB0aGV5IGhhdmUgdG8gYmUgaGlkZGVuIGF0IHRoaXMgcG9pbnQuCiAJICovCi0JcG1fcW9zX3N5c2ZzX3JlbW92ZV9sYXRlbmN5KGRldik7CisJcG1fcW9zX3N5c2ZzX3JlbW92ZV9yZXN1bWVfbGF0ZW5jeShkZXYpOwogCXBtX3Fvc19zeXNmc19yZW1vdmVfZmxhZ3MoZGV2KTsKIAogCW11dGV4X2xvY2soJmRldl9wbV9xb3NfbXR4KTsKQEAgLTIzNyw3ICsyNTMsNyBAQAogCQlnb3RvIG91dDsKIAogCS8qIEZsdXNoIHRoZSBjb25zdHJhaW50cyBsaXN0cyBmb3IgdGhlIGRldmljZS4gKi8KLQljID0gJnFvcy0+bGF0ZW5jeTsKKwljID0gJnFvcy0+cmVzdW1lX2xhdGVuY3k7CiAJcGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHRtcCwgJmMtPmxpc3QsIGRhdGEucG5vZGUpIHsKIAkJLyoKIAkJICogVXBkYXRlIGNvbnN0cmFpbnRzIGxpc3QgYW5kIGNhbGwgdGhlIG5vdGlmaWNhdGlvbgpAQCAtMjQ2LDYgKzI2MiwxMSBAQAogCQlhcHBseV9jb25zdHJhaW50KHJlcSwgUE1fUU9TX1JFTU9WRV9SRVEsIFBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKIAkJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsKIAl9CisJYyA9ICZxb3MtPmxhdGVuY3lfdG9sZXJhbmNlOworCXBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCB0bXAsICZjLT5saXN0LCBkYXRhLnBub2RlKSB7CisJCWFwcGx5X2NvbnN0cmFpbnQocmVxLCBQTV9RT1NfUkVNT1ZFX1JFUSwgUE1fUU9TX0RFRkFVTFRfVkFMVUUpOworCQltZW1zZXQocmVxLCAwLCBzaXplb2YoKnJlcSkpOworCX0KIAlmID0gJnFvcy0+ZmxhZ3M7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgdG1wLCAmZi0+bGlzdCwgZGF0YS5mbHIubm9kZSkgewogCQlhcHBseV9jb25zdHJhaW50KHJlcSwgUE1fUU9TX1JFTU9WRV9SRVEsIFBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKQEAgLTI2NSw2ICsyODYsNDAgQEAKIAltdXRleF91bmxvY2soJmRldl9wbV9xb3Nfc3lzZnNfbXR4KTsKIH0KIAorc3RhdGljIGJvb2wgZGV2X3BtX3Fvc19pbnZhbGlkX3JlcXVlc3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2X3BtX3Fvc19yZXF1ZXN0ICpyZXEpCit7CisJcmV0dXJuICFyZXEgfHwgKHJlcS0+dHlwZSA9PSBERVZfUE1fUU9TX0xBVEVOQ1lfVE9MRVJBTkNFCisJCQkmJiAhZGV2LT5wb3dlci5zZXRfbGF0ZW5jeV90b2xlcmFuY2UpOworfQorCitzdGF0aWMgaW50IF9fZGV2X3BtX3Fvc19hZGRfcmVxdWVzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkZXZfcG1fcW9zX3JlcXVlc3QgKnJlcSwKKwkJCQkgICAgZW51bSBkZXZfcG1fcW9zX3JlcV90eXBlIHR5cGUsIHMzMiB2YWx1ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghZGV2IHx8IGRldl9wbV9xb3NfaW52YWxpZF9yZXF1ZXN0KGRldiwgcmVxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoV0FSTihkZXZfcG1fcW9zX3JlcXVlc3RfYWN0aXZlKHJlcSksCisJCSAiJXMoKSBjYWxsZWQgZm9yIGFscmVhZHkgYWRkZWQgcmVxdWVzdFxuIiwgX19mdW5jX18pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChJU19FUlIoZGV2LT5wb3dlci5xb3MpKQorCQlyZXQgPSAtRU5PREVWOworCWVsc2UgaWYgKCFkZXYtPnBvd2VyLnFvcykKKwkJcmV0ID0gZGV2X3BtX3Fvc19jb25zdHJhaW50c19hbGxvY2F0ZShkZXYpOworCisJdHJhY2VfZGV2X3BtX3Fvc19hZGRfcmVxdWVzdChkZXZfbmFtZShkZXYpLCB0eXBlLCB2YWx1ZSk7CisJaWYgKCFyZXQpIHsKKwkJcmVxLT5kZXYgPSBkZXY7CisJCXJlcS0+dHlwZSA9IHR5cGU7CisJCXJldCA9IGFwcGx5X2NvbnN0cmFpbnQocmVxLCBQTV9RT1NfQUREX1JFUSwgdmFsdWUpOworCX0KKwlyZXR1cm4gcmV0OworfQorCiAvKioKICAqIGRldl9wbV9xb3NfYWRkX3JlcXVlc3QgLSBpbnNlcnRzIG5ldyBxb3MgcmVxdWVzdCBpbnRvIHRoZSBsaXN0CiAgKiBAZGV2OiB0YXJnZXQgZGV2aWNlIGZvciB0aGUgY29uc3RyYWludApAQCAtMjkwLDMxICszNDUsMTEgQEAKIGludCBkZXZfcG1fcW9zX2FkZF9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldl9wbV9xb3NfcmVxdWVzdCAqcmVxLAogCQkJICAgZW51bSBkZXZfcG1fcW9zX3JlcV90eXBlIHR5cGUsIHMzMiB2YWx1ZSkKIHsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghZGV2IHx8ICFyZXEpIC8qZ3VhcmQgYWdhaW5zdCBjYWxsZXJzIHBhc3NpbmcgaW4gbnVsbCAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChXQVJOKGRldl9wbV9xb3NfcmVxdWVzdF9hY3RpdmUocmVxKSwKLQkJICIlcygpIGNhbGxlZCBmb3IgYWxyZWFkeSBhZGRlZCByZXF1ZXN0XG4iLCBfX2Z1bmNfXykpCi0JCXJldHVybiAtRUlOVkFMOworCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZkZXZfcG1fcW9zX210eCk7Ci0KLQlpZiAoSVNfRVJSKGRldi0+cG93ZXIucW9zKSkKLQkJcmV0ID0gLUVOT0RFVjsKLQllbHNlIGlmICghZGV2LT5wb3dlci5xb3MpCi0JCXJldCA9IGRldl9wbV9xb3NfY29uc3RyYWludHNfYWxsb2NhdGUoZGV2KTsKLQotCXRyYWNlX2Rldl9wbV9xb3NfYWRkX3JlcXVlc3QoZGV2X25hbWUoZGV2KSwgdHlwZSwgdmFsdWUpOwotCWlmICghcmV0KSB7Ci0JCXJlcS0+ZGV2ID0gZGV2OwotCQlyZXEtPnR5cGUgPSB0eXBlOwotCQlyZXQgPSBhcHBseV9jb25zdHJhaW50KHJlcSwgUE1fUU9TX0FERF9SRVEsIHZhbHVlKTsKLQl9Ci0KKwlyZXQgPSBfX2Rldl9wbV9xb3NfYWRkX3JlcXVlc3QoZGV2LCByZXEsIHR5cGUsIHZhbHVlKTsKIAltdXRleF91bmxvY2soJmRldl9wbV9xb3NfbXR4KTsKLQogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkZXZfcG1fcW9zX2FkZF9yZXF1ZXN0KTsKQEAgLTM0MSw3ICszNzYsOCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXN3aXRjaChyZXEtPnR5cGUpIHsKLQljYXNlIERFVl9QTV9RT1NfTEFURU5DWToKKwljYXNlIERFVl9QTV9RT1NfUkVTVU1FX0xBVEVOQ1k6CisJY2FzZSBERVZfUE1fUU9TX0xBVEVOQ1lfVE9MRVJBTkNFOgogCQljdXJyX3ZhbHVlID0gcmVxLT5kYXRhLnBub2RlLnByaW87CiAJCWJyZWFrOwogCWNhc2UgREVWX1BNX1FPU19GTEFHUzoKQEAgLTQ2MCw4ICs0OTYsOCBAQAogCQlyZXQgPSBkZXZfcG1fcW9zX2NvbnN0cmFpbnRzX2FsbG9jYXRlKGRldik7CiAKIAlpZiAoIXJldCkKLQkJcmV0ID0gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoCi0JCQkJZGV2LT5wb3dlci5xb3MtPmxhdGVuY3kubm90aWZpZXJzLCBub3RpZmllcik7CisJCXJldCA9IGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKGRldi0+cG93ZXIucW9zLT5yZXN1bWVfbGF0ZW5jeS5ub3RpZmllcnMsCisJCQkJCQkgICAgICAgbm90aWZpZXIpOwogCiAJbXV0ZXhfdW5sb2NrKCZkZXZfcG1fcW9zX210eCk7CiAJcmV0dXJuIHJldDsKQEAgLTQ4Nyw5ICs1MjMsOCBAQAogCiAJLyogU2lsZW50bHkgcmV0dXJuIGlmIHRoZSBjb25zdHJhaW50cyBvYmplY3QgaXMgbm90IHByZXNlbnQuICovCiAJaWYgKCFJU19FUlJfT1JfTlVMTChkZXYtPnBvd2VyLnFvcykpCi0JCXJldHZhbCA9IGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoCi0JCQkJZGV2LT5wb3dlci5xb3MtPmxhdGVuY3kubm90aWZpZXJzLAotCQkJCW5vdGlmaWVyKTsKKwkJcmV0dmFsID0gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcihkZXYtPnBvd2VyLnFvcy0+cmVzdW1lX2xhdGVuY3kubm90aWZpZXJzLAorCQkJCQkJCSAgICBub3RpZmllcik7CiAKIAltdXRleF91bmxvY2soJmRldl9wbV9xb3NfbXR4KTsKIAlyZXR1cm4gcmV0dmFsOwpAQCAtNTMwLDIwICs1NjUsMzIgQEAKICAqIGRldl9wbV9xb3NfYWRkX2FuY2VzdG9yX3JlcXVlc3QgLSBBZGQgUE0gUW9TIHJlcXVlc3QgZm9yIGRldmljZSdzIGFuY2VzdG9yLgogICogQGRldjogRGV2aWNlIHdob3NlIGFuY2VzdG9yIHRvIGFkZCB0aGUgcmVxdWVzdCBmb3IuCiAgKiBAcmVxOiBQb2ludGVyIHRvIHRoZSBwcmVhbGxvY2F0ZWQgaGFuZGxlLgorICogQHR5cGU6IFR5cGUgb2YgdGhlIHJlcXVlc3QuCiAgKiBAdmFsdWU6IENvbnN0cmFpbnQgbGF0ZW5jeSB2YWx1ZS4KICAqLwogaW50IGRldl9wbV9xb3NfYWRkX2FuY2VzdG9yX3JlcXVlc3Qoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgZGV2X3BtX3Fvc19yZXF1ZXN0ICpyZXEsIHMzMiB2YWx1ZSkKKwkJCQkgICAgc3RydWN0IGRldl9wbV9xb3NfcmVxdWVzdCAqcmVxLAorCQkJCSAgICBlbnVtIGRldl9wbV9xb3NfcmVxX3R5cGUgdHlwZSwgczMyIHZhbHVlKQogewogCXN0cnVjdCBkZXZpY2UgKmFuY2VzdG9yID0gZGV2LT5wYXJlbnQ7CiAJaW50IHJldCA9IC1FTk9ERVY7CiAKLQl3aGlsZSAoYW5jZXN0b3IgJiYgIWFuY2VzdG9yLT5wb3dlci5pZ25vcmVfY2hpbGRyZW4pCi0JCWFuY2VzdG9yID0gYW5jZXN0b3ItPnBhcmVudDsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIERFVl9QTV9RT1NfUkVTVU1FX0xBVEVOQ1k6CisJCXdoaWxlIChhbmNlc3RvciAmJiAhYW5jZXN0b3ItPnBvd2VyLmlnbm9yZV9jaGlsZHJlbikKKwkJCWFuY2VzdG9yID0gYW5jZXN0b3ItPnBhcmVudDsKIAorCQlicmVhazsKKwljYXNlIERFVl9QTV9RT1NfTEFURU5DWV9UT0xFUkFOQ0U6CisJCXdoaWxlIChhbmNlc3RvciAmJiAhYW5jZXN0b3ItPnBvd2VyLnNldF9sYXRlbmN5X3RvbGVyYW5jZSkKKwkJCWFuY2VzdG9yID0gYW5jZXN0b3ItPnBhcmVudDsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlhbmNlc3RvciA9IE5VTEw7CisJfQogCWlmIChhbmNlc3RvcikKLQkJcmV0ID0gZGV2X3BtX3Fvc19hZGRfcmVxdWVzdChhbmNlc3RvciwgcmVxLAotCQkJCQkgICAgIERFVl9QTV9RT1NfTEFURU5DWSwgdmFsdWUpOworCQlyZXQgPSBkZXZfcG1fcW9zX2FkZF9yZXF1ZXN0KGFuY2VzdG9yLCByZXEsIHR5cGUsIHZhbHVlKTsKIAogCWlmIChyZXQgPCAwKQogCQlyZXEtPmRldiA9IE5VTEw7CkBAIC01NTksOSArNjA2LDEzIEBACiAJc3RydWN0IGRldl9wbV9xb3NfcmVxdWVzdCAqcmVxID0gTlVMTDsKIAogCXN3aXRjaCh0eXBlKSB7Ci0JY2FzZSBERVZfUE1fUU9TX0xBVEVOQ1k6Ci0JCXJlcSA9IGRldi0+cG93ZXIucW9zLT5sYXRlbmN5X3JlcTsKLQkJZGV2LT5wb3dlci5xb3MtPmxhdGVuY3lfcmVxID0gTlVMTDsKKwljYXNlIERFVl9QTV9RT1NfUkVTVU1FX0xBVEVOQ1k6CisJCXJlcSA9IGRldi0+cG93ZXIucW9zLT5yZXN1bWVfbGF0ZW5jeV9yZXE7CisJCWRldi0+cG93ZXIucW9zLT5yZXN1bWVfbGF0ZW5jeV9yZXEgPSBOVUxMOworCQlicmVhazsKKwljYXNlIERFVl9QTV9RT1NfTEFURU5DWV9UT0xFUkFOQ0U6CisJCXJlcSA9IGRldi0+cG93ZXIucW9zLT5sYXRlbmN5X3RvbGVyYW5jZV9yZXE7CisJCWRldi0+cG93ZXIucW9zLT5sYXRlbmN5X3RvbGVyYW5jZV9yZXEgPSBOVUxMOwogCQlicmVhazsKIAljYXNlIERFVl9QTV9RT1NfRkxBR1M6CiAJCXJlcSA9IGRldi0+cG93ZXIucW9zLT5mbGFnc19yZXE7CkBAIC01OTcsNyArNjQ4LDcgQEAKIAlpZiAoIXJlcSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZXQgPSBkZXZfcG1fcW9zX2FkZF9yZXF1ZXN0KGRldiwgcmVxLCBERVZfUE1fUU9TX0xBVEVOQ1ksIHZhbHVlKTsKKwlyZXQgPSBkZXZfcG1fcW9zX2FkZF9yZXF1ZXN0KGRldiwgcmVxLCBERVZfUE1fUU9TX1JFU1VNRV9MQVRFTkNZLCB2YWx1ZSk7CiAJaWYgKHJldCA8IDApIHsKIAkJa2ZyZWUocmVxKTsKIAkJcmV0dXJuIHJldDsKQEAgLTYwOSw3ICs2NjAsNyBAQAogCiAJaWYgKElTX0VSUl9PUl9OVUxMKGRldi0+cG93ZXIucW9zKSkKIAkJcmV0ID0gLUVOT0RFVjsKLQllbHNlIGlmIChkZXYtPnBvd2VyLnFvcy0+bGF0ZW5jeV9yZXEpCisJZWxzZSBpZiAoZGV2LT5wb3dlci5xb3MtPnJlc3VtZV9sYXRlbmN5X3JlcSkKIAkJcmV0ID0gLUVFWElTVDsKIAogCWlmIChyZXQgPCAwKSB7CkBAIC02MTgsMTMgKzY2OSwxMyBAQAogCQltdXRleF91bmxvY2soJmRldl9wbV9xb3NfbXR4KTsKIAkJZ290byBvdXQ7CiAJfQotCWRldi0+cG93ZXIucW9zLT5sYXRlbmN5X3JlcSA9IHJlcTsKKwlkZXYtPnBvd2VyLnFvcy0+cmVzdW1lX2xhdGVuY3lfcmVxID0gcmVxOwogCiAJbXV0ZXhfdW5sb2NrKCZkZXZfcG1fcW9zX210eCk7CiAKLQlyZXQgPSBwbV9xb3Nfc3lzZnNfYWRkX2xhdGVuY3koZGV2KTsKKwlyZXQgPSBwbV9xb3Nfc3lzZnNfYWRkX3Jlc3VtZV9sYXRlbmN5KGRldik7CiAJaWYgKHJldCkKLQkJZGV2X3BtX3Fvc19kcm9wX3VzZXJfcmVxdWVzdChkZXYsIERFVl9QTV9RT1NfTEFURU5DWSk7CisJCWRldl9wbV9xb3NfZHJvcF91c2VyX3JlcXVlc3QoZGV2LCBERVZfUE1fUU9TX1JFU1VNRV9MQVRFTkNZKTsKIAogIG91dDoKIAltdXRleF91bmxvY2soJmRldl9wbV9xb3Nfc3lzZnNfbXR4KTsKQEAgLTYzNCw4ICs2ODUsOCBAQAogCiBzdGF0aWMgdm9pZCBfX2Rldl9wbV9xb3NfaGlkZV9sYXRlbmN5X2xpbWl0KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpZiAoIUlTX0VSUl9PUl9OVUxMKGRldi0+cG93ZXIucW9zKSAmJiBkZXYtPnBvd2VyLnFvcy0+bGF0ZW5jeV9yZXEpCi0JCV9fZGV2X3BtX3Fvc19kcm9wX3VzZXJfcmVxdWVzdChkZXYsIERFVl9QTV9RT1NfTEFURU5DWSk7CisJaWYgKCFJU19FUlJfT1JfTlVMTChkZXYtPnBvd2VyLnFvcykgJiYgZGV2LT5wb3dlci5xb3MtPnJlc3VtZV9sYXRlbmN5X3JlcSkKKwkJX19kZXZfcG1fcW9zX2Ryb3BfdXNlcl9yZXF1ZXN0KGRldiwgREVWX1BNX1FPU19SRVNVTUVfTEFURU5DWSk7CiB9CiAKIC8qKgpAQCAtNjQ2LDcgKzY5Nyw3IEBACiB7CiAJbXV0ZXhfbG9jaygmZGV2X3BtX3Fvc19zeXNmc19tdHgpOwogCi0JcG1fcW9zX3N5c2ZzX3JlbW92ZV9sYXRlbmN5KGRldik7CisJcG1fcW9zX3N5c2ZzX3JlbW92ZV9yZXN1bWVfbGF0ZW5jeShkZXYpOwogCiAJbXV0ZXhfbG9jaygmZGV2X3BtX3Fvc19tdHgpOwogCV9fZGV2X3BtX3Fvc19oaWRlX2xhdGVuY3lfbGltaXQoZGV2KTsKQEAgLTc2OCw2ICs4MTksNjcgQEAKIAlwbV9ydW50aW1lX3B1dChkZXYpOwogCXJldHVybiByZXQ7CiB9CisKKy8qKgorICogZGV2X3BtX3Fvc19nZXRfdXNlcl9sYXRlbmN5X3RvbGVyYW5jZSAtIEdldCB1c2VyIHNwYWNlIGxhdGVuY3kgdG9sZXJhbmNlLgorICogQGRldjogRGV2aWNlIHRvIG9idGFpbiB0aGUgdXNlciBzcGFjZSBsYXRlbmN5IHRvbGVyYW5jZSBmb3IuCisgKi8KK3MzMiBkZXZfcG1fcW9zX2dldF91c2VyX2xhdGVuY3lfdG9sZXJhbmNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzMzIgcmV0OworCisJbXV0ZXhfbG9jaygmZGV2X3BtX3Fvc19tdHgpOworCXJldCA9IElTX0VSUl9PUl9OVUxMKGRldi0+cG93ZXIucW9zKQorCQl8fCAhZGV2LT5wb3dlci5xb3MtPmxhdGVuY3lfdG9sZXJhbmNlX3JlcSA/CisJCQlQTV9RT1NfTEFURU5DWV9UT0xFUkFOQ0VfTk9fQ09OU1RSQUlOVCA6CisJCQlkZXYtPnBvd2VyLnFvcy0+bGF0ZW5jeV90b2xlcmFuY2VfcmVxLT5kYXRhLnBub2RlLnByaW87CisJbXV0ZXhfdW5sb2NrKCZkZXZfcG1fcW9zX210eCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBkZXZfcG1fcW9zX3VwZGF0ZV91c2VyX2xhdGVuY3lfdG9sZXJhbmNlIC0gVXBkYXRlIHVzZXIgc3BhY2UgbGF0ZW5jeSB0b2xlcmFuY2UuCisgKiBAZGV2OiBEZXZpY2UgdG8gdXBkYXRlIHRoZSB1c2VyIHNwYWNlIGxhdGVuY3kgdG9sZXJhbmNlIGZvci4KKyAqIEB2YWw6IE5ldyB1c2VyIHNwYWNlIGxhdGVuY3kgdG9sZXJhbmNlIGZvciBAZGV2IChuZWdhdGl2ZSB2YWx1ZXMgZGlzYWJsZSkuCisgKi8KK2ludCBkZXZfcG1fcW9zX3VwZGF0ZV91c2VyX2xhdGVuY3lfdG9sZXJhbmNlKHN0cnVjdCBkZXZpY2UgKmRldiwgczMyIHZhbCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZGV2X3BtX3Fvc19tdHgpOworCisJaWYgKElTX0VSUl9PUl9OVUxMKGRldi0+cG93ZXIucW9zKQorCSAgICB8fCAhZGV2LT5wb3dlci5xb3MtPmxhdGVuY3lfdG9sZXJhbmNlX3JlcSkgeworCQlzdHJ1Y3QgZGV2X3BtX3Fvc19yZXF1ZXN0ICpyZXE7CisKKwkJaWYgKHZhbCA8IDApIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyZXEgPSBremFsbG9jKHNpemVvZigqcmVxKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcmVxKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmV0ID0gX19kZXZfcG1fcW9zX2FkZF9yZXF1ZXN0KGRldiwgcmVxLCBERVZfUE1fUU9TX0xBVEVOQ1lfVE9MRVJBTkNFLCB2YWwpOworCQlpZiAocmV0IDwgMCkgeworCQkJa2ZyZWUocmVxKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWRldi0+cG93ZXIucW9zLT5sYXRlbmN5X3RvbGVyYW5jZV9yZXEgPSByZXE7CisJfSBlbHNlIHsKKwkJaWYgKHZhbCA8IDApIHsKKwkJCV9fZGV2X3BtX3Fvc19kcm9wX3VzZXJfcmVxdWVzdChkZXYsIERFVl9QTV9RT1NfTEFURU5DWV9UT0xFUkFOQ0UpOworCQkJcmV0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IF9fZGV2X3BtX3Fvc191cGRhdGVfcmVxdWVzdChkZXYtPnBvd2VyLnFvcy0+bGF0ZW5jeV90b2xlcmFuY2VfcmVxLCB2YWwpOworCQl9CisJfQorCisgb3V0OgorCW11dGV4X3VubG9jaygmZGV2X3BtX3Fvc19tdHgpOworCXJldHVybiByZXQ7Cit9CiAjZWxzZSAvKiAhQ09ORklHX1BNX1JVTlRJTUUgKi8KIHN0YXRpYyB2b2lkIF9fZGV2X3BtX3Fvc19oaWRlX2xhdGVuY3lfbGltaXQoc3RydWN0IGRldmljZSAqZGV2KSB7fQogc3RhdGljIHZvaWQgX19kZXZfcG1fcW9zX2hpZGVfZmxhZ3Moc3RydWN0IGRldmljZSAqZGV2KSB7fQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMKaW5kZXggNzJlMDBlNi4uNjdjNzkzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcnVudGltZS5jCkBAIC0xMyw2ICsxMyw0MyBAQAogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9ycG0uaD4KICNpbmNsdWRlICJwb3dlci5oIgogCisjZGVmaW5lIFJQTV9HRVRfQ0FMTEJBQ0soZGV2LCBjYikJCQkJXAorKHsJCQkJCQkJCVwKKwlpbnQgKCpfX3JwbV9jYikoc3RydWN0IGRldmljZSAqX19kKTsJCQlcCisJCQkJCQkJCVwKKwlpZiAoZGV2LT5wbV9kb21haW4pCQkJCQlcCisJCV9fcnBtX2NiID0gZGV2LT5wbV9kb21haW4tPm9wcy5jYjsJCVwKKwllbHNlIGlmIChkZXYtPnR5cGUgJiYgZGV2LT50eXBlLT5wbSkJCQlcCisJCV9fcnBtX2NiID0gZGV2LT50eXBlLT5wbS0+Y2I7CQkJXAorCWVsc2UgaWYgKGRldi0+Y2xhc3MgJiYgZGV2LT5jbGFzcy0+cG0pCQkJXAorCQlfX3JwbV9jYiA9IGRldi0+Y2xhc3MtPnBtLT5jYjsJCQlcCisJZWxzZSBpZiAoZGV2LT5idXMgJiYgZGV2LT5idXMtPnBtKQkJCVwKKwkJX19ycG1fY2IgPSBkZXYtPmJ1cy0+cG0tPmNiOwkJCVwKKwllbHNlCQkJCQkJCVwKKwkJX19ycG1fY2IgPSBOVUxMOwkJCQlcCisJCQkJCQkJCVwKKwlpZiAoIV9fcnBtX2NiICYmIGRldi0+ZHJpdmVyICYmIGRldi0+ZHJpdmVyLT5wbSkJXAorCQlfX3JwbV9jYiA9IGRldi0+ZHJpdmVyLT5wbS0+Y2I7CQkJXAorCQkJCQkJCQlcCisJX19ycG1fY2I7CQkJCQkJXAorfSkKKworc3RhdGljIGludCAoKnJwbV9nZXRfc3VzcGVuZF9jYihzdHJ1Y3QgZGV2aWNlICpkZXYpKShzdHJ1Y3QgZGV2aWNlICopCit7CisJcmV0dXJuIFJQTV9HRVRfQ0FMTEJBQ0soZGV2LCBydW50aW1lX3N1c3BlbmQpOworfQorCitzdGF0aWMgaW50ICgqcnBtX2dldF9yZXN1bWVfY2Ioc3RydWN0IGRldmljZSAqZGV2KSkoc3RydWN0IGRldmljZSAqKQoreworCXJldHVybiBSUE1fR0VUX0NBTExCQUNLKGRldiwgcnVudGltZV9yZXN1bWUpOworfQorCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKK3N0YXRpYyBpbnQgKCpycG1fZ2V0X2lkbGVfY2Ioc3RydWN0IGRldmljZSAqZGV2KSkoc3RydWN0IGRldmljZSAqKQoreworCXJldHVybiBSUE1fR0VUX0NBTExCQUNLKGRldiwgcnVudGltZV9pZGxlKTsKK30KKwogc3RhdGljIGludCBycG1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHJwbWZsYWdzKTsKIHN0YXRpYyBpbnQgcnBtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcnBtZmxhZ3MpOwogCkBAIC0zMTAsMTkgKzM0Nyw3IEBACiAKIAlkZXYtPnBvd2VyLmlkbGVfbm90aWZpY2F0aW9uID0gdHJ1ZTsKIAotCWlmIChkZXYtPnBtX2RvbWFpbikKLQkJY2FsbGJhY2sgPSBkZXYtPnBtX2RvbWFpbi0+b3BzLnJ1bnRpbWVfaWRsZTsKLQllbHNlIGlmIChkZXYtPnR5cGUgJiYgZGV2LT50eXBlLT5wbSkKLQkJY2FsbGJhY2sgPSBkZXYtPnR5cGUtPnBtLT5ydW50aW1lX2lkbGU7Ci0JZWxzZSBpZiAoZGV2LT5jbGFzcyAmJiBkZXYtPmNsYXNzLT5wbSkKLQkJY2FsbGJhY2sgPSBkZXYtPmNsYXNzLT5wbS0+cnVudGltZV9pZGxlOwotCWVsc2UgaWYgKGRldi0+YnVzICYmIGRldi0+YnVzLT5wbSkKLQkJY2FsbGJhY2sgPSBkZXYtPmJ1cy0+cG0tPnJ1bnRpbWVfaWRsZTsKLQllbHNlCi0JCWNhbGxiYWNrID0gTlVMTDsKLQotCWlmICghY2FsbGJhY2sgJiYgZGV2LT5kcml2ZXIgJiYgZGV2LT5kcml2ZXItPnBtKQotCQljYWxsYmFjayA9IGRldi0+ZHJpdmVyLT5wbS0+cnVudGltZV9pZGxlOworCWNhbGxiYWNrID0gcnBtX2dldF9pZGxlX2NiKGRldik7CiAKIAlpZiAoY2FsbGJhY2spCiAJCXJldHZhbCA9IF9fcnBtX2NhbGxiYWNrKGNhbGxiYWNrLCBkZXYpOwpAQCAtNDkyLDE5ICs1MTcsNyBAQAogCiAJX191cGRhdGVfcnVudGltZV9zdGF0dXMoZGV2LCBSUE1fU1VTUEVORElORyk7CiAKLQlpZiAoZGV2LT5wbV9kb21haW4pCi0JCWNhbGxiYWNrID0gZGV2LT5wbV9kb21haW4tPm9wcy5ydW50aW1lX3N1c3BlbmQ7Ci0JZWxzZSBpZiAoZGV2LT50eXBlICYmIGRldi0+dHlwZS0+cG0pCi0JCWNhbGxiYWNrID0gZGV2LT50eXBlLT5wbS0+cnVudGltZV9zdXNwZW5kOwotCWVsc2UgaWYgKGRldi0+Y2xhc3MgJiYgZGV2LT5jbGFzcy0+cG0pCi0JCWNhbGxiYWNrID0gZGV2LT5jbGFzcy0+cG0tPnJ1bnRpbWVfc3VzcGVuZDsKLQllbHNlIGlmIChkZXYtPmJ1cyAmJiBkZXYtPmJ1cy0+cG0pCi0JCWNhbGxiYWNrID0gZGV2LT5idXMtPnBtLT5ydW50aW1lX3N1c3BlbmQ7Ci0JZWxzZQotCQljYWxsYmFjayA9IE5VTEw7Ci0KLQlpZiAoIWNhbGxiYWNrICYmIGRldi0+ZHJpdmVyICYmIGRldi0+ZHJpdmVyLT5wbSkKLQkJY2FsbGJhY2sgPSBkZXYtPmRyaXZlci0+cG0tPnJ1bnRpbWVfc3VzcGVuZDsKKwljYWxsYmFjayA9IHJwbV9nZXRfc3VzcGVuZF9jYihkZXYpOwogCiAJcmV0dmFsID0gcnBtX2NhbGxiYWNrKGNhbGxiYWNrLCBkZXYpOwogCWlmIChyZXR2YWwpCkBAIC03MjQsMTkgKzczNyw3IEBACiAKIAlfX3VwZGF0ZV9ydW50aW1lX3N0YXR1cyhkZXYsIFJQTV9SRVNVTUlORyk7CiAKLQlpZiAoZGV2LT5wbV9kb21haW4pCi0JCWNhbGxiYWNrID0gZGV2LT5wbV9kb21haW4tPm9wcy5ydW50aW1lX3Jlc3VtZTsKLQllbHNlIGlmIChkZXYtPnR5cGUgJiYgZGV2LT50eXBlLT5wbSkKLQkJY2FsbGJhY2sgPSBkZXYtPnR5cGUtPnBtLT5ydW50aW1lX3Jlc3VtZTsKLQllbHNlIGlmIChkZXYtPmNsYXNzICYmIGRldi0+Y2xhc3MtPnBtKQotCQljYWxsYmFjayA9IGRldi0+Y2xhc3MtPnBtLT5ydW50aW1lX3Jlc3VtZTsKLQllbHNlIGlmIChkZXYtPmJ1cyAmJiBkZXYtPmJ1cy0+cG0pCi0JCWNhbGxiYWNrID0gZGV2LT5idXMtPnBtLT5ydW50aW1lX3Jlc3VtZTsKLQllbHNlCi0JCWNhbGxiYWNrID0gTlVMTDsKLQotCWlmICghY2FsbGJhY2sgJiYgZGV2LT5kcml2ZXIgJiYgZGV2LT5kcml2ZXItPnBtKQotCQljYWxsYmFjayA9IGRldi0+ZHJpdmVyLT5wbS0+cnVudGltZV9yZXN1bWU7CisJY2FsbGJhY2sgPSBycG1fZ2V0X3Jlc3VtZV9jYihkZXYpOwogCiAJcmV0dmFsID0gcnBtX2NhbGxiYWNrKGNhbGxiYWNrLCBkZXYpOwogCWlmIChyZXR2YWwpIHsKQEAgLTExMzAsNyArMTEzMSw3IEBACiAgKiBAZGV2OiBEZXZpY2UgdG8gaGFuZGxlLgogICogQGNoZWNrX3Jlc3VtZTogSWYgc2V0LCBjaGVjayBpZiB0aGVyZSdzIGEgcmVzdW1lIHJlcXVlc3QgZm9yIHRoZSBkZXZpY2UuCiAgKgotICogSW5jcmVtZW50IHBvd2VyLmRpc2FibGVfZGVwdGggZm9yIHRoZSBkZXZpY2UgYW5kIGlmIHdhcyB6ZXJvIHByZXZpb3VzbHksCisgKiBJbmNyZW1lbnQgcG93ZXIuZGlzYWJsZV9kZXB0aCBmb3IgdGhlIGRldmljZSBhbmQgaWYgaXQgd2FzIHplcm8gcHJldmlvdXNseSwKICAqIGNhbmNlbCBhbGwgcGVuZGluZyBydW50aW1lIFBNIHJlcXVlc3RzIGZvciB0aGUgZGV2aWNlIGFuZCB3YWl0IGZvciBhbGwKICAqIG9wZXJhdGlvbnMgaW4gcHJvZ3Jlc3MgdG8gY29tcGxldGUuICBUaGUgZGV2aWNlIGNhbiBiZSBlaXRoZXIgYWN0aXZlIG9yCiAgKiBzdXNwZW5kZWQgYWZ0ZXIgaXRzIHJ1bnRpbWUgUE0gaGFzIGJlZW4gZGlzYWJsZWQuCkBAIC0xNDAxLDMgKzE0MDIsODYgQEAKIAlpZiAoZGV2LT5wb3dlci5pcnFfc2FmZSAmJiBkZXYtPnBhcmVudCkKIAkJcG1fcnVudGltZV9wdXQoZGV2LT5wYXJlbnQpOwogfQorI2VuZGlmCisKKy8qKgorICogcG1fcnVudGltZV9mb3JjZV9zdXNwZW5kIC0gRm9yY2UgYSBkZXZpY2UgaW50byBzdXNwZW5kIHN0YXRlIGlmIG5lZWRlZC4KKyAqIEBkZXY6IERldmljZSB0byBzdXNwZW5kLgorICoKKyAqIERpc2FibGUgcnVudGltZSBQTSBzbyB3ZSBzYWZlbHkgY2FuIGNoZWNrIHRoZSBkZXZpY2UncyBydW50aW1lIFBNIHN0YXR1cyBhbmQKKyAqIGlmIGl0IGlzIGFjdGl2ZSwgaW52b2tlIGl0J3MgLnJ1bnRpbWVfc3VzcGVuZCBjYWxsYmFjayB0byBicmluZyBpdCBpbnRvCisgKiBzdXNwZW5kIHN0YXRlLiBLZWVwIHJ1bnRpbWUgUE0gZGlzYWJsZWQgdG8gcHJlc2VydmUgdGhlIHN0YXRlIHVubGVzcyB3ZQorICogZW5jb3VudGVyIGVycm9ycy4KKyAqCisgKiBUeXBpY2FsbHkgdGhpcyBmdW5jdGlvbiBtYXkgYmUgaW52b2tlZCBmcm9tIGEgc3lzdGVtIHN1c3BlbmQgY2FsbGJhY2sgdG8gbWFrZQorICogc3VyZSB0aGUgZGV2aWNlIGlzIHB1dCBpbnRvIGxvdyBwb3dlciBzdGF0ZS4KKyAqLworaW50IHBtX3J1bnRpbWVfZm9yY2Vfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50ICgqY2FsbGJhY2spKHN0cnVjdCBkZXZpY2UgKik7CisJaW50IHJldCA9IDA7CisKKwlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKworCS8qCisJICogTm90ZSB0aGF0IHBtX3J1bnRpbWVfc3RhdHVzX3N1c3BlbmRlZCgpIHJldHVybnMgZmFsc2Ugd2hpbGUKKwkgKiAhQ09ORklHX1BNX1JVTlRJTUUsIHdoaWNoIG1lYW5zIHRoZSBkZXZpY2Ugd2lsbCBiZSBwdXQgaW50byBsb3cKKwkgKiBwb3dlciBzdGF0ZS4KKwkgKi8KKwlpZiAocG1fcnVudGltZV9zdGF0dXNfc3VzcGVuZGVkKGRldikpCisJCXJldHVybiAwOworCisJY2FsbGJhY2sgPSBycG1fZ2V0X3N1c3BlbmRfY2IoZGV2KTsKKworCWlmICghY2FsbGJhY2spIHsKKwkJcmV0ID0gLUVOT1NZUzsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gY2FsbGJhY2soZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZChkZXYpOworCXJldHVybiAwOworZXJyOgorCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBtX3J1bnRpbWVfZm9yY2Vfc3VzcGVuZCk7CisKKy8qKgorICogcG1fcnVudGltZV9mb3JjZV9yZXN1bWUgLSBGb3JjZSBhIGRldmljZSBpbnRvIHJlc3VtZSBzdGF0ZS4KKyAqIEBkZXY6IERldmljZSB0byByZXN1bWUuCisgKgorICogUHJpb3IgaW52b2tpbmcgdGhpcyBmdW5jdGlvbiB3ZSBleHBlY3QgdGhlIHVzZXIgdG8gaGF2ZSBicm91Z2h0IHRoZSBkZXZpY2UKKyAqIGludG8gbG93IHBvd2VyIHN0YXRlIGJ5IGEgY2FsbCB0byBwbV9ydW50aW1lX2ZvcmNlX3N1c3BlbmQoKS4gSGVyZSB3ZSByZXZlcnNlCisgKiB0aG9zZSBhY3Rpb25zIGFuZCBicmluZ3MgdGhlIGRldmljZSBpbnRvIGZ1bGwgcG93ZXIuIFdlIHVwZGF0ZSB0aGUgcnVudGltZSBQTQorICogc3RhdHVzIGFuZCByZS1lbmFibGVzIHJ1bnRpbWUgUE0uCisgKgorICogVHlwaWNhbGx5IHRoaXMgZnVuY3Rpb24gbWF5IGJlIGludm9rZWQgZnJvbSBhIHN5c3RlbSByZXN1bWUgY2FsbGJhY2sgdG8gbWFrZQorICogc3VyZSB0aGUgZGV2aWNlIGlzIHB1dCBpbnRvIGZ1bGwgcG93ZXIgc3RhdGUuCisgKi8KK2ludCBwbV9ydW50aW1lX2ZvcmNlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50ICgqY2FsbGJhY2spKHN0cnVjdCBkZXZpY2UgKik7CisJaW50IHJldCA9IDA7CisKKwljYWxsYmFjayA9IHJwbV9nZXRfcmVzdW1lX2NiKGRldik7CisKKwlpZiAoIWNhbGxiYWNrKSB7CisJCXJldCA9IC1FTk9TWVM7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGNhbGxiYWNrKGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGRldik7CitvdXQ6CisJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwocG1fcnVudGltZV9mb3JjZV9yZXN1bWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3N5c2ZzLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvc3lzZnMuYwppbmRleCAwM2UwODlhLi45NWIxODFkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL3N5c2ZzLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3N5c2ZzLmMKQEAgLTIxOCwxNSArMjE4LDE2IEBACiBzdGF0aWMgREVWSUNFX0FUVFIoYXV0b3N1c3BlbmRfZGVsYXlfbXMsIDA2NDQsIGF1dG9zdXNwZW5kX2RlbGF5X21zX3Nob3csCiAJCWF1dG9zdXNwZW5kX2RlbGF5X21zX3N0b3JlKTsKIAotc3RhdGljIHNzaXplX3QgcG1fcW9zX2xhdGVuY3lfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHBtX3Fvc19yZXN1bWVfbGF0ZW5jeV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICBjaGFyICpidWYpCiB7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRldl9wbV9xb3NfcmVxdWVzdGVkX2xhdGVuY3koZGV2KSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRldl9wbV9xb3NfcmVxdWVzdGVkX3Jlc3VtZV9sYXRlbmN5KGRldikpOwogfQogCi1zdGF0aWMgc3NpemVfdCBwbV9xb3NfbGF0ZW5jeV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBuKQorc3RhdGljIHNzaXplX3QgcG1fcW9zX3Jlc3VtZV9sYXRlbmN5X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG4pCiB7CiAJczMyIHZhbHVlOwogCWludCByZXQ7CkBAIC0yMzcsMTIgKzIzOCw0NyBAQAogCWlmICh2YWx1ZSA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gZGV2X3BtX3Fvc191cGRhdGVfcmVxdWVzdChkZXYtPnBvd2VyLnFvcy0+bGF0ZW5jeV9yZXEsIHZhbHVlKTsKKwlyZXQgPSBkZXZfcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KGRldi0+cG93ZXIucW9zLT5yZXN1bWVfbGF0ZW5jeV9yZXEsCisJCQkJCXZhbHVlKTsKIAlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IG47CiB9CiAKIHN0YXRpYyBERVZJQ0VfQVRUUihwbV9xb3NfcmVzdW1lX2xhdGVuY3lfdXMsIDA2NDQsCi0JCSAgIHBtX3Fvc19sYXRlbmN5X3Nob3csIHBtX3Fvc19sYXRlbmN5X3N0b3JlKTsKKwkJICAgcG1fcW9zX3Jlc3VtZV9sYXRlbmN5X3Nob3csIHBtX3Fvc19yZXN1bWVfbGF0ZW5jeV9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IHBtX3Fvc19sYXRlbmN5X3RvbGVyYW5jZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgICBjaGFyICpidWYpCit7CisJczMyIHZhbHVlID0gZGV2X3BtX3Fvc19nZXRfdXNlcl9sYXRlbmN5X3RvbGVyYW5jZShkZXYpOworCisJaWYgKHZhbHVlIDwgMCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiYXV0b1xuIik7CisJZWxzZSBpZiAodmFsdWUgPT0gUE1fUU9TX0xBVEVOQ1lfQU5ZKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJhbnlcbiIpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbHVlKTsKK30KKworc3RhdGljIHNzaXplX3QgcG1fcW9zX2xhdGVuY3lfdG9sZXJhbmNlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG4pCit7CisJczMyIHZhbHVlOworCWludCByZXQ7CisKKwlpZiAoa3N0cnRvczMyKGJ1ZiwgMCwgJnZhbHVlKSkgeworCQlpZiAoIXN0cmNtcChidWYsICJhdXRvIikgfHwgIXN0cmNtcChidWYsICJhdXRvXG4iKSkKKwkJCXZhbHVlID0gUE1fUU9TX0xBVEVOQ1lfVE9MRVJBTkNFX05PX0NPTlNUUkFJTlQ7CisJCWVsc2UgaWYgKCFzdHJjbXAoYnVmLCAiYW55IikgfHwgIXN0cmNtcChidWYsICJhbnlcbiIpKQorCQkJdmFsdWUgPSBQTV9RT1NfTEFURU5DWV9BTlk7CisJfQorCXJldCA9IGRldl9wbV9xb3NfdXBkYXRlX3VzZXJfbGF0ZW5jeV90b2xlcmFuY2UoZGV2LCB2YWx1ZSk7CisJcmV0dXJuIHJldCA8IDAgPyByZXQgOiBuOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIocG1fcW9zX2xhdGVuY3lfdG9sZXJhbmNlX3VzLCAwNjQ0LAorCQkgICBwbV9xb3NfbGF0ZW5jeV90b2xlcmFuY2Vfc2hvdywgcG1fcW9zX2xhdGVuY3lfdG9sZXJhbmNlX3N0b3JlKTsKIAogc3RhdGljIHNzaXplX3QgcG1fcW9zX25vX3Bvd2VyX29mZl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCkBAIC02MTgsMTUgKzY1NCwyNiBAQAogCS5hdHRycwk9IHJ1bnRpbWVfYXR0cnMsCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcG1fcW9zX2xhdGVuY3lfYXR0cnNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpwbV9xb3NfcmVzdW1lX2xhdGVuY3lfYXR0cnNbXSA9IHsKICNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQogCSZkZXZfYXR0cl9wbV9xb3NfcmVzdW1lX2xhdGVuY3lfdXMuYXR0ciwKICNlbmRpZiAvKiBDT05GSUdfUE1fUlVOVElNRSAqLwogCU5VTEwsCiB9Owotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgcG1fcW9zX2xhdGVuY3lfYXR0cl9ncm91cCA9IHsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHBtX3Fvc19yZXN1bWVfbGF0ZW5jeV9hdHRyX2dyb3VwID0gewogCS5uYW1lCT0gcG93ZXJfZ3JvdXBfbmFtZSwKLQkuYXR0cnMJPSBwbV9xb3NfbGF0ZW5jeV9hdHRycywKKwkuYXR0cnMJPSBwbV9xb3NfcmVzdW1lX2xhdGVuY3lfYXR0cnMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcG1fcW9zX2xhdGVuY3lfdG9sZXJhbmNlX2F0dHJzW10gPSB7CisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKKwkmZGV2X2F0dHJfcG1fcW9zX2xhdGVuY3lfdG9sZXJhbmNlX3VzLmF0dHIsCisjZW5kaWYgLyogQ09ORklHX1BNX1JVTlRJTUUgKi8KKwlOVUxMLAorfTsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHBtX3Fvc19sYXRlbmN5X3RvbGVyYW5jZV9hdHRyX2dyb3VwID0geworCS5uYW1lCT0gcG93ZXJfZ3JvdXBfbmFtZSwKKwkuYXR0cnMJPSBwbV9xb3NfbGF0ZW5jeV90b2xlcmFuY2VfYXR0cnMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcG1fcW9zX2ZsYWdzX2F0dHJzW10gPSB7CkBAIC02NTQsMTggKzcwMSwyMyBAQAogCQlpZiAocmMpCiAJCQlnb3RvIGVycl9vdXQ7CiAJfQotCiAJaWYgKGRldmljZV9jYW5fd2FrZXVwKGRldikpIHsKIAkJcmMgPSBzeXNmc19tZXJnZV9ncm91cCgmZGV2LT5rb2JqLCAmcG1fd2FrZXVwX2F0dHJfZ3JvdXApOwotCQlpZiAocmMpIHsKLQkJCWlmIChwbV9ydW50aW1lX2NhbGxiYWNrc19wcmVzZW50KGRldikpCi0JCQkJc3lzZnNfdW5tZXJnZV9ncm91cCgmZGV2LT5rb2JqLAotCQkJCQkJICAgICZwbV9ydW50aW1lX2F0dHJfZ3JvdXApOwotCQkJZ290byBlcnJfb3V0OwotCQl9CisJCWlmIChyYykKKwkJCWdvdG8gZXJyX3J1bnRpbWU7CisJfQorCWlmIChkZXYtPnBvd2VyLnNldF9sYXRlbmN5X3RvbGVyYW5jZSkgeworCQlyYyA9IHN5c2ZzX21lcmdlX2dyb3VwKCZkZXYtPmtvYmosCisJCQkJICAgICAgICZwbV9xb3NfbGF0ZW5jeV90b2xlcmFuY2VfYXR0cl9ncm91cCk7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyX3dha2V1cDsKIAl9CiAJcmV0dXJuIDA7CiAKKyBlcnJfd2FrZXVwOgorCXN5c2ZzX3VubWVyZ2VfZ3JvdXAoJmRldi0+a29iaiwgJnBtX3dha2V1cF9hdHRyX2dyb3VwKTsKKyBlcnJfcnVudGltZToKKwlzeXNmc191bm1lcmdlX2dyb3VwKCZkZXYtPmtvYmosICZwbV9ydW50aW1lX2F0dHJfZ3JvdXApOwogIGVycl9vdXQ6CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosICZwbV9hdHRyX2dyb3VwKTsKIAlyZXR1cm4gcmM7CkBAIC02ODEsMTQgKzczMywxNCBAQAogCXN5c2ZzX3VubWVyZ2VfZ3JvdXAoJmRldi0+a29iaiwgJnBtX3dha2V1cF9hdHRyX2dyb3VwKTsKIH0KIAotaW50IHBtX3Fvc19zeXNmc19hZGRfbGF0ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYpCitpbnQgcG1fcW9zX3N5c2ZzX2FkZF9yZXN1bWVfbGF0ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIHN5c2ZzX21lcmdlX2dyb3VwKCZkZXYtPmtvYmosICZwbV9xb3NfbGF0ZW5jeV9hdHRyX2dyb3VwKTsKKwlyZXR1cm4gc3lzZnNfbWVyZ2VfZ3JvdXAoJmRldi0+a29iaiwgJnBtX3Fvc19yZXN1bWVfbGF0ZW5jeV9hdHRyX2dyb3VwKTsKIH0KIAotdm9pZCBwbV9xb3Nfc3lzZnNfcmVtb3ZlX2xhdGVuY3koc3RydWN0IGRldmljZSAqZGV2KQordm9pZCBwbV9xb3Nfc3lzZnNfcmVtb3ZlX3Jlc3VtZV9sYXRlbmN5KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzeXNmc191bm1lcmdlX2dyb3VwKCZkZXYtPmtvYmosICZwbV9xb3NfbGF0ZW5jeV9hdHRyX2dyb3VwKTsKKwlzeXNmc191bm1lcmdlX2dyb3VwKCZkZXYtPmtvYmosICZwbV9xb3NfcmVzdW1lX2xhdGVuY3lfYXR0cl9ncm91cCk7CiB9CiAKIGludCBwbV9xb3Nfc3lzZnNfYWRkX2ZsYWdzKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTcwOCw2ICs3NjAsNyBAQAogCiB2b2lkIGRwbV9zeXNmc19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQogeworCXN5c2ZzX3VubWVyZ2VfZ3JvdXAoJmRldi0+a29iaiwgJnBtX3Fvc19sYXRlbmN5X3RvbGVyYW5jZV9hdHRyX2dyb3VwKTsKIAlkZXZfcG1fcW9zX2NvbnN0cmFpbnRzX2Rlc3Ryb3koZGV2KTsKIAlycG1fc3lzZnNfcmVtb3ZlKGRldik7CiAJc3lzZnNfdW5tZXJnZV9ncm91cCgmZGV2LT5rb2JqLCAmcG1fd2FrZXVwX2F0dHJfZ3JvdXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9pbnRlcm5hbC5oIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9pbnRlcm5hbC5oCmluZGV4IDMzNDE0YjEuLjdkMTMyNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL2ludGVybmFsLmgKQEAgLTEzNCw2ICsxMzQsOCBAQAogCiAJLyogaWYgc2V0LCBjb252ZXJ0cyBidWxrIHJ3IHRvIHNpbmdsZSBydyAqLwogCWJvb2wgdXNlX3NpbmdsZV9ydzsKKwkvKiBpZiBzZXQsIHRoZSBkZXZpY2Ugc3VwcG9ydHMgbXVsdGkgd3JpdGUgbW9kZSAqLworCWJvb2wgY2FuX211bHRpX3dyaXRlOwogCiAJc3RydWN0IHJiX3Jvb3QgcmFuZ2VfdHJlZTsKIAl2b2lkICpzZWxlY3Rvcl93b3JrX2J1ZjsJLyogU2NyYXRjaCBidWZmZXIgdXNlZCBmb3Igc2VsZWN0b3IgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUuYyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUuYwppbmRleCBkNGRkNzcxLi4yOWI0MTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ2NhY2hlLmMKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdjYWNoZS5jCkBAIC0yNDksMTEgKzI0OSwxMiBAQAogewogCXVuc2lnbmVkIGludCByZWc7CiAKLQlmb3IgKHJlZyA9IG1pbjsgcmVnIDw9IG1heDsgcmVnKyspIHsKKwlmb3IgKHJlZyA9IG1pbjsgcmVnIDw9IG1heDsgcmVnICs9IG1hcC0+cmVnX3N0cmlkZSkgewogCQl1bnNpZ25lZCBpbnQgdmFsOwogCQlpbnQgcmV0OwogCi0JCWlmIChyZWdtYXBfdm9sYXRpbGUobWFwLCByZWcpKQorCQlpZiAocmVnbWFwX3ZvbGF0aWxlKG1hcCwgcmVnKSB8fAorCQkgICAgIXJlZ21hcF93cml0ZWFibGUobWFwLCByZWcpKQogCQkJY29udGludWU7CiAKIAkJcmV0ID0gcmVnY2FjaGVfcmVhZChtYXAsIHJlZywgJnZhbCk7CkBAIC0zMTIsMTAgKzMxMyw2IEBACiAJLyogQXBwbHkgYW55IHBhdGNoIGZpcnN0ICovCiAJbWFwLT5jYWNoZV9ieXBhc3MgPSAxOwogCWZvciAoaSA9IDA7IGkgPCBtYXAtPnBhdGNoX3JlZ3M7IGkrKykgewotCQlpZiAobWFwLT5wYXRjaFtpXS5yZWcgJSBtYXAtPnJlZ19zdHJpZGUpIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dDsKLQkJfQogCQlyZXQgPSBfcmVnbWFwX3dyaXRlKG1hcCwgbWFwLT5wYXRjaFtpXS5yZWcsIG1hcC0+cGF0Y2hbaV0uZGVmKTsKIAkJaWYgKHJldCAhPSAwKSB7CiAJCQlkZXZfZXJyKG1hcC0+ZGV2LCAiRmFpbGVkIHRvIHdyaXRlICV4ID0gJXg6ICVkXG4iLApAQCAtNjM2LDEwICs2MzMsMTAgQEAKIAlpZiAoKmRhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKLQljb3VudCA9IGN1ciAtIGJhc2U7CisJY291bnQgPSAoY3VyIC0gYmFzZSkgLyBtYXAtPnJlZ19zdHJpZGU7CiAKIAlkZXZfZGJnKG1hcC0+ZGV2LCAiV3JpdGluZyAlenUgYnl0ZXMgZm9yICVkIHJlZ2lzdGVycyBmcm9tIDB4JXgtMHgleFxuIiwKLQkJY291bnQgKiB2YWxfYnl0ZXMsIGNvdW50LCBiYXNlLCBjdXIgLSAxKTsKKwkJY291bnQgKiB2YWxfYnl0ZXMsIGNvdW50LCBiYXNlLCBjdXIgLSBtYXAtPnJlZ19zdHJpZGUpOwogCiAJbWFwLT5jYWNoZV9ieXBhc3MgPSAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1kZWJ1Z2ZzLmMgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1kZWJ1Z2ZzLmMKaW5kZXggYzU0NzFjZC4uNDVkODEyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWRlYnVnZnMuYwpAQCAtNTExLDcgKzUxMSw3IEBACiAJZGVidWdmc19jcmVhdGVfZmlsZSgicmFuZ2UiLCAwNDAwLCBtYXAtPmRlYnVnZnMsCiAJCQkgICAgbWFwLCAmcmVnbWFwX3JlZ19yYW5nZXNfZm9wcyk7CiAKLQlpZiAobWFwLT5tYXhfcmVnaXN0ZXIpIHsKKwlpZiAobWFwLT5tYXhfcmVnaXN0ZXIgfHwgcmVnbWFwX3JlYWRhYmxlKG1hcCwgMCkpIHsKIAkJZGVidWdmc19jcmVhdGVfZmlsZSgicmVnaXN0ZXJzIiwgMDQwMCwgbWFwLT5kZWJ1Z2ZzLAogCQkJCSAgICBtYXAsICZyZWdtYXBfbWFwX2ZvcHMpOwogCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJhY2Nlc3MiLCAwNDAwLCBtYXAtPmRlYnVnZnMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1pMmMuYyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWkyYy5jCmluZGV4IGZhNmJmNTIuLmViZDE4OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWkyYy5jCisrKyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWkyYy5jCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiBzdGF0aWMgaW50IHJlZ21hcF9pMmNfd3JpdGUodm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGNvdW50KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtaXJxLmMgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1pcnEuYwppbmRleCA4MjY5MjA2Li5lZGY4OGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1pcnEuYworKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1pcnEuYwpAQCAtMzY4LDggKzM2OCw2IEBACiAJaWYgKCFkKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCSpkYXRhID0gZDsKLQogCWQtPnN0YXR1c19idWYgPSBremFsbG9jKHNpemVvZih1bnNpZ25lZCBpbnQpICogY2hpcC0+bnVtX3JlZ3MsCiAJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFkLT5zdGF0dXNfYnVmKQpAQCAtNTA2LDYgKzUwNCw4IEBACiAJCWdvdG8gZXJyX2RvbWFpbjsKIAl9CiAKKwkqZGF0YSA9IGQ7CisKIAlyZXR1cm4gMDsKIAogZXJyX2RvbWFpbjoKQEAgLTUzMyw3ICs1MzMsNyBAQAogCQlyZXR1cm47CiAKIAlmcmVlX2lycShpcnEsIGQpOwotCS8qIFdlIHNob3VsZCB1bm1hcCB0aGUgZG9tYWluIGJ1dC4uLiAqLworCWlycV9kb21haW5fcmVtb3ZlKGQtPmRvbWFpbik7CiAJa2ZyZWUoZC0+d2FrZV9idWYpOwogCWtmcmVlKGQtPm1hc2tfYnVmX2RlZik7CiAJa2ZyZWUoZC0+bWFza19idWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtbW1pby5jIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtbW1pby5jCmluZGV4IDgxZjk3NzUuLjFlMDNlN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLW1taW8uYworKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1tbWlvLmMKQEAgLTE4LDcgKzE4LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgpAQCAtMjYsMTAgKzI1LDQ3IEBACiAKIHN0cnVjdCByZWdtYXBfbW1pb19jb250ZXh0IHsKIAl2b2lkIF9faW9tZW0gKnJlZ3M7CisJdW5zaWduZWQgcmVnX2J5dGVzOwogCXVuc2lnbmVkIHZhbF9ieXRlczsKKwl1bnNpZ25lZCBwYWRfYnl0ZXM7CiAJc3RydWN0IGNsayAqY2xrOwogfTsKIAorc3RhdGljIGlubGluZSB2b2lkIHJlZ21hcF9tbWlvX3JlZ3NpemVfY2hlY2soc2l6ZV90IHJlZ19zaXplKQoreworCXN3aXRjaCAocmVnX3NpemUpIHsKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgNDoKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwljYXNlIDg6CisjZW5kaWYKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCitzdGF0aWMgaW50IHJlZ21hcF9tbWlvX3JlZ2JpdHNfY2hlY2soc2l6ZV90IHJlZ19iaXRzKQoreworCXN3aXRjaCAocmVnX2JpdHMpIHsKKwljYXNlIDg6CisJY2FzZSAxNjoKKwljYXNlIDMyOgorI2lmZGVmIENPTkZJR182NEJJVAorCWNhc2UgNjQ6CisjZW5kaWYKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVnbWFwX21taW9fY291bnRfY2hlY2soc2l6ZV90IGNvdW50KQoreworCUJVR19PTihjb3VudCAlIDIgIT0gMCk7Cit9CisKIHN0YXRpYyBpbnQgcmVnbWFwX21taW9fZ2F0aGVyX3dyaXRlKHZvaWQgKmNvbnRleHQsCiAJCQkJICAgIGNvbnN0IHZvaWQgKnJlZywgc2l6ZV90IHJlZ19zaXplLAogCQkJCSAgICBjb25zdCB2b2lkICp2YWwsIHNpemVfdCB2YWxfc2l6ZSkKQEAgLTM4LDcgKzc0LDcgQEAKIAl1MzIgb2Zmc2V0OwogCWludCByZXQ7CiAKLQlCVUdfT04ocmVnX3NpemUgIT0gNCk7CisJcmVnbWFwX21taW9fcmVnc2l6ZV9jaGVjayhyZWdfc2l6ZSk7CiAKIAlpZiAoIUlTX0VSUihjdHgtPmNsaykpIHsKIAkJcmV0ID0gY2xrX2VuYWJsZShjdHgtPmNsayk7CkBAIC04MSw5ICsxMTcsMTMgQEAKIAogc3RhdGljIGludCByZWdtYXBfbW1pb193cml0ZSh2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY291bnQpCiB7Ci0JQlVHX09OKGNvdW50IDwgNCk7CisJc3RydWN0IHJlZ21hcF9tbWlvX2NvbnRleHQgKmN0eCA9IGNvbnRleHQ7CisJdTMyIG9mZnNldCA9IGN0eC0+cmVnX2J5dGVzICsgY3R4LT5wYWRfYnl0ZXM7CiAKLQlyZXR1cm4gcmVnbWFwX21taW9fZ2F0aGVyX3dyaXRlKGNvbnRleHQsIGRhdGEsIDQsIGRhdGEgKyA0LCBjb3VudCAtIDQpOworCXJlZ21hcF9tbWlvX2NvdW50X2NoZWNrKGNvdW50KTsKKworCXJldHVybiByZWdtYXBfbW1pb19nYXRoZXJfd3JpdGUoY29udGV4dCwgZGF0YSwgY3R4LT5yZWdfYnl0ZXMsCisJCQkJCWRhdGEgKyBvZmZzZXQsIGNvdW50IC0gb2Zmc2V0KTsKIH0KIAogc3RhdGljIGludCByZWdtYXBfbW1pb19yZWFkKHZvaWQgKmNvbnRleHQsCkBAIC05NCw3ICsxMzQsNyBAQAogCXUzMiBvZmZzZXQ7CiAJaW50IHJldDsKIAotCUJVR19PTihyZWdfc2l6ZSAhPSA0KTsKKwlyZWdtYXBfbW1pb19yZWdzaXplX2NoZWNrKHJlZ19zaXplKTsKIAogCWlmICghSVNfRVJSKGN0eC0+Y2xrKSkgewogCQlyZXQgPSBjbGtfZW5hYmxlKGN0eC0+Y2xrKTsKQEAgLTE2NSw4ICsyMDUsOSBAQAogCWludCBtaW5fc3RyaWRlOwogCWludCByZXQ7CiAKLQlpZiAoY29uZmlnLT5yZWdfYml0cyAhPSAzMikKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJcmV0ID0gcmVnbWFwX21taW9fcmVnYml0c19jaGVjayhjb25maWctPnJlZ19iaXRzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCiAJaWYgKGNvbmZpZy0+cGFkX2JpdHMpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMjA5LDYgKzI1MCw4IEBACiAKIAljdHgtPnJlZ3MgPSByZWdzOwogCWN0eC0+dmFsX2J5dGVzID0gY29uZmlnLT52YWxfYml0cyAvIDg7CisJY3R4LT5yZWdfYnl0ZXMgPSBjb25maWctPnJlZ19iaXRzIC8gODsKKwljdHgtPnBhZF9ieXRlcyA9IGNvbmZpZy0+cGFkX2JpdHMgLyA4OwogCWN0eC0+Y2xrID0gRVJSX1BUUigtRU5PREVWKTsKIAogCWlmIChjbGtfaWQgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLXNwaS5jIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtc3BpLmMKaW5kZXggMzdmMTJhZS4uMGViMzA5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtc3BpLmMKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtc3BpLmMKQEAgLTEyLDcgKzEyLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtc3BtaS5jIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtc3BtaS5jCmluZGV4IGFjMjM5MTAuLmQ3MDI2ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLXNwbWkuYworKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1zcG1pLmMKQEAgLTIyLDY5ICsyMiwyMzUgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKLXN0YXRpYyBpbnQgcmVnbWFwX3NwbWlfcmVhZCh2b2lkICpjb250ZXh0LAotCQkJICAgIGNvbnN0IHZvaWQgKnJlZywgc2l6ZV90IHJlZ19zaXplLAotCQkJICAgIHZvaWQgKnZhbCwgc2l6ZV90IHZhbF9zaXplKQorc3RhdGljIGludCByZWdtYXBfc3BtaV9iYXNlX3JlYWQodm9pZCAqY29udGV4dCwKKwkJCQkgY29uc3Qgdm9pZCAqcmVnLCBzaXplX3QgcmVnX3NpemUsCisJCQkJIHZvaWQgKnZhbCwgc2l6ZV90IHZhbF9zaXplKQogewotCUJVR19PTihyZWdfc2l6ZSAhPSAyKTsKLQlyZXR1cm4gc3BtaV9leHRfcmVnaXN0ZXJfcmVhZGwoY29udGV4dCwgKih1MTYgKilyZWcsCi0JCQkJICAgICAgIHZhbCwgdmFsX3NpemUpOworCXU4IGFkZHIgPSAqKHU4ICopcmVnOworCWludCBlcnIgPSAwOworCisJQlVHX09OKHJlZ19zaXplICE9IDEpOworCisJd2hpbGUgKHZhbF9zaXplLS0gJiYgIWVycikKKwkJZXJyID0gc3BtaV9yZWdpc3Rlcl9yZWFkKGNvbnRleHQsIGFkZHIrKywgdmFsKyspOworCisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCByZWdtYXBfc3BtaV9nYXRoZXJfd3JpdGUodm9pZCAqY29udGV4dCwKLQkJCQkgICAgY29uc3Qgdm9pZCAqcmVnLCBzaXplX3QgcmVnX3NpemUsCi0JCQkJICAgIGNvbnN0IHZvaWQgKnZhbCwgc2l6ZV90IHZhbF9zaXplKQorc3RhdGljIGludCByZWdtYXBfc3BtaV9iYXNlX2dhdGhlcl93cml0ZSh2b2lkICpjb250ZXh0LAorCQkJCQkgY29uc3Qgdm9pZCAqcmVnLCBzaXplX3QgcmVnX3NpemUsCisJCQkJCSBjb25zdCB2b2lkICp2YWwsIHNpemVfdCB2YWxfc2l6ZSkKIHsKLQlCVUdfT04ocmVnX3NpemUgIT0gMik7Ci0JcmV0dXJuIHNwbWlfZXh0X3JlZ2lzdGVyX3dyaXRlbChjb250ZXh0LCAqKHUxNiAqKXJlZywgdmFsLCB2YWxfc2l6ZSk7CisJY29uc3QgdTggKmRhdGEgPSB2YWw7CisJdTggYWRkciA9ICoodTggKilyZWc7CisJaW50IGVyciA9IDA7CisKKwlCVUdfT04ocmVnX3NpemUgIT0gMSk7CisKKwkvKgorCSAqIFNQTUkgZGVmaW5lcyBhIG1vcmUgYmFuZHdpZHRoLWVmZmljaWVudCAnUmVnaXN0ZXIgMCBXcml0ZScgc2VxdWVuY2UsCisJICogdXNlIGl0IHdoZW4gcG9zc2libGUuCisJICovCisJaWYgKGFkZHIgPT0gMCAmJiB2YWxfc2l6ZSkgeworCQllcnIgPSBzcG1pX3JlZ2lzdGVyX3plcm9fd3JpdGUoY29udGV4dCwgKmRhdGEpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0OworCisJCWRhdGErKzsKKwkJYWRkcisrOworCQl2YWxfc2l6ZS0tOworCX0KKworCXdoaWxlICh2YWxfc2l6ZSkgeworCQllcnIgPSBzcG1pX3JlZ2lzdGVyX3dyaXRlKGNvbnRleHQsIGFkZHIsICpkYXRhKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX291dDsKKworCQlkYXRhKys7CisJCWFkZHIrKzsKKwkJdmFsX3NpemUtLTsKKwl9CisKK2Vycl9vdXQ6CisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCByZWdtYXBfc3BtaV93cml0ZSh2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICpkYXRhLAotCQkJICAgICBzaXplX3QgY291bnQpCitzdGF0aWMgaW50IHJlZ21hcF9zcG1pX2Jhc2Vfd3JpdGUodm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgIHNpemVfdCBjb3VudCkKIHsKLQlCVUdfT04oY291bnQgPCAyKTsKLQlyZXR1cm4gcmVnbWFwX3NwbWlfZ2F0aGVyX3dyaXRlKGNvbnRleHQsIGRhdGEsIDIsIGRhdGEgKyAyLCBjb3VudCAtIDIpOworCUJVR19PTihjb3VudCA8IDEpOworCXJldHVybiByZWdtYXBfc3BtaV9iYXNlX2dhdGhlcl93cml0ZShjb250ZXh0LCBkYXRhLCAxLCBkYXRhICsgMSwKKwkJCQkJICAgICBjb3VudCAtIDEpOwogfQogCi1zdGF0aWMgc3RydWN0IHJlZ21hcF9idXMgcmVnbWFwX3NwbWkgPSB7Ci0JLnJlYWQJCQkJPSByZWdtYXBfc3BtaV9yZWFkLAotCS53cml0ZQkJCQk9IHJlZ21hcF9zcG1pX3dyaXRlLAotCS5nYXRoZXJfd3JpdGUJCQk9IHJlZ21hcF9zcG1pX2dhdGhlcl93cml0ZSwKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2J1cyByZWdtYXBfc3BtaV9iYXNlID0geworCS5yZWFkCQkJCT0gcmVnbWFwX3NwbWlfYmFzZV9yZWFkLAorCS53cml0ZQkJCQk9IHJlZ21hcF9zcG1pX2Jhc2Vfd3JpdGUsCisJLmdhdGhlcl93cml0ZQkJCT0gcmVnbWFwX3NwbWlfYmFzZV9nYXRoZXJfd3JpdGUsCiAJLnJlZ19mb3JtYXRfZW5kaWFuX2RlZmF1bHQJPSBSRUdNQVBfRU5ESUFOX05BVElWRSwKIAkudmFsX2Zvcm1hdF9lbmRpYW5fZGVmYXVsdAk9IFJFR01BUF9FTkRJQU5fTkFUSVZFLAogfTsKIAogLyoqCi0gKiByZWdtYXBfaW5pdF9zcG1pKCk6IEluaXRpYWxpemUgcmVnaXN0ZXIgbWFwCi0gKgotICogQHNkZXY6IERldmljZSB0aGF0IHdpbGwgYmUgaW50ZXJhY3RlZCB3aXRoCi0gKiBAY29uZmlnOiBDb25maWd1cmF0aW9uIGZvciByZWdpc3RlciBtYXAKKyAqIHJlZ21hcF9pbml0X3NwbWlfYmFzZSgpOiBDcmVhdGUgcmVnbWFwIGZvciB0aGUgQmFzZSByZWdpc3RlciBzcGFjZQorICogQHNkZXY6CVNQTUkgZGV2aWNlIHRoYXQgd2lsbCBiZSBpbnRlcmFjdGVkIHdpdGgKKyAqIEBjb25maWc6CUNvbmZpZ3VyYXRpb24gZm9yIHJlZ2lzdGVyIG1hcAogICoKICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBhbiBFUlJfUFRSKCkgb24gZXJyb3Igb3IgYSB2YWxpZCBwb2ludGVyIHRvCiAgKiBhIHN0cnVjdCByZWdtYXAuCiAgKi8KLXN0cnVjdCByZWdtYXAgKnJlZ21hcF9pbml0X3NwbWkoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LAotCQkJCWNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpCitzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfaW5pdF9zcG1pX2Jhc2Uoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZykKIHsKLQlyZXR1cm4gcmVnbWFwX2luaXQoJnNkZXYtPmRldiwgJnJlZ21hcF9zcG1pLCBzZGV2LCBjb25maWcpOworCXJldHVybiByZWdtYXBfaW5pdCgmc2Rldi0+ZGV2LCAmcmVnbWFwX3NwbWlfYmFzZSwgc2RldiwgY29uZmlnKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHJlZ21hcF9pbml0X3NwbWkpOworRVhQT1JUX1NZTUJPTF9HUEwocmVnbWFwX2luaXRfc3BtaV9iYXNlKTsKIAogLyoqCi0gKiBkZXZtX3JlZ21hcF9pbml0X3NwbWkoKTogSW5pdGlhbGlzZSBtYW5hZ2VkIHJlZ2lzdGVyIG1hcAotICoKLSAqIEBzZGV2OiBEZXZpY2UgdGhhdCB3aWxsIGJlIGludGVyYWN0ZWQgd2l0aAotICogQGNvbmZpZzogQ29uZmlndXJhdGlvbiBmb3IgcmVnaXN0ZXIgbWFwCisgKiBkZXZtX3JlZ21hcF9pbml0X3NwbWlfYmFzZSgpOiBDcmVhdGUgbWFuYWdlZCByZWdtYXAgZm9yIEJhc2UgcmVnaXN0ZXIgc3BhY2UKKyAqIEBzZGV2OglTUE1JIGRldmljZSB0aGF0IHdpbGwgYmUgaW50ZXJhY3RlZCB3aXRoCisgKiBAY29uZmlnOglDb25maWd1cmF0aW9uIGZvciByZWdpc3RlciBtYXAKICAqCiAgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYW4gRVJSX1BUUigpIG9uIGVycm9yIG9yIGEgdmFsaWQgcG9pbnRlcgogICogdG8gYSBzdHJ1Y3QgcmVnbWFwLiAgVGhlIHJlZ21hcCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZnJlZWQgYnkgdGhlCiAgKiBkZXZpY2UgbWFuYWdlbWVudCBjb2RlLgogICovCi1zdHJ1Y3QgcmVnbWFwICpkZXZtX3JlZ21hcF9pbml0X3NwbWkoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LAorc3RydWN0IHJlZ21hcCAqZGV2bV9yZWdtYXBfaW5pdF9zcG1pX2Jhc2Uoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LAorCQkJCQkgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpCit7CisJcmV0dXJuIGRldm1fcmVnbWFwX2luaXQoJnNkZXYtPmRldiwgJnJlZ21hcF9zcG1pX2Jhc2UsIHNkZXYsIGNvbmZpZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX3JlZ21hcF9pbml0X3NwbWlfYmFzZSk7CisKK3N0YXRpYyBpbnQgcmVnbWFwX3NwbWlfZXh0X3JlYWQodm9pZCAqY29udGV4dCwKKwkJCQljb25zdCB2b2lkICpyZWcsIHNpemVfdCByZWdfc2l6ZSwKKwkJCQl2b2lkICp2YWwsIHNpemVfdCB2YWxfc2l6ZSkKK3sKKwlpbnQgZXJyID0gMDsKKwlzaXplX3QgbGVuOworCXUxNiBhZGRyOworCisJQlVHX09OKHJlZ19zaXplICE9IDIpOworCisJYWRkciA9ICoodTE2ICopcmVnOworCisJLyoKKwkgKiBTcGxpdCBhY2Nlc3NlcyBpbnRvIHR3byB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbW9yZQorCSAqIGJhbmR3aWR0aC1lZmZpY2llbnQgJ0V4dGVuZGVkIFJlZ2lzdGVyIFJlYWQnIGNvbW1hbmQgd2hlbiBwb3NzaWJsZQorCSAqLworCXdoaWxlIChhZGRyIDw9IDB4RkYgJiYgdmFsX3NpemUpIHsKKwkJbGVuID0gbWluX3Qoc2l6ZV90LCB2YWxfc2l6ZSwgMTYpOworCisJCWVyciA9IHNwbWlfZXh0X3JlZ2lzdGVyX3JlYWQoY29udGV4dCwgYWRkciwgdmFsLCBsZW4pOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0OworCisJCWFkZHIgKz0gbGVuOworCQl2YWwgKz0gbGVuOworCQl2YWxfc2l6ZSAtPSBsZW47CisJfQorCisJd2hpbGUgKHZhbF9zaXplKSB7CisJCWxlbiA9IG1pbl90KHNpemVfdCwgdmFsX3NpemUsIDgpOworCisJCWVyciA9IHNwbWlfZXh0X3JlZ2lzdGVyX3JlYWRsKGNvbnRleHQsIGFkZHIsIHZhbCwgdmFsX3NpemUpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0OworCisJCWFkZHIgKz0gbGVuOworCQl2YWwgKz0gbGVuOworCQl2YWxfc2l6ZSAtPSBsZW47CisJfQorCitlcnJfb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmVnbWFwX3NwbWlfZXh0X2dhdGhlcl93cml0ZSh2b2lkICpjb250ZXh0LAorCQkJCQljb25zdCB2b2lkICpyZWcsIHNpemVfdCByZWdfc2l6ZSwKKwkJCQkJY29uc3Qgdm9pZCAqdmFsLCBzaXplX3QgdmFsX3NpemUpCit7CisJaW50IGVyciA9IDA7CisJc2l6ZV90IGxlbjsKKwl1MTYgYWRkcjsKKworCUJVR19PTihyZWdfc2l6ZSAhPSAyKTsKKworCWFkZHIgPSAqKHUxNiAqKXJlZzsKKworCXdoaWxlIChhZGRyIDw9IDB4RkYgJiYgdmFsX3NpemUpIHsKKwkJbGVuID0gbWluX3Qoc2l6ZV90LCB2YWxfc2l6ZSwgMTYpOworCisJCWVyciA9IHNwbWlfZXh0X3JlZ2lzdGVyX3dyaXRlKGNvbnRleHQsIGFkZHIsIHZhbCwgbGVuKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX291dDsKKworCQlhZGRyICs9IGxlbjsKKwkJdmFsICs9IGxlbjsKKwkJdmFsX3NpemUgLT0gbGVuOworCX0KKworCXdoaWxlICh2YWxfc2l6ZSkgeworCQlsZW4gPSBtaW5fdChzaXplX3QsIHZhbF9zaXplLCA4KTsKKworCQllcnIgPSBzcG1pX2V4dF9yZWdpc3Rlcl93cml0ZWwoY29udGV4dCwgYWRkciwgdmFsLCBsZW4pOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0OworCisJCWFkZHIgKz0gbGVuOworCQl2YWwgKz0gbGVuOworCQl2YWxfc2l6ZSAtPSBsZW47CisJfQorCitlcnJfb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmVnbWFwX3NwbWlfZXh0X3dyaXRlKHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJIHNpemVfdCBjb3VudCkKK3sKKwlCVUdfT04oY291bnQgPCAyKTsKKwlyZXR1cm4gcmVnbWFwX3NwbWlfZXh0X2dhdGhlcl93cml0ZShjb250ZXh0LCBkYXRhLCAyLCBkYXRhICsgMiwKKwkJCQkJICAgIGNvdW50IC0gMik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2J1cyByZWdtYXBfc3BtaV9leHQgPSB7CisJLnJlYWQJCQkJPSByZWdtYXBfc3BtaV9leHRfcmVhZCwKKwkud3JpdGUJCQkJPSByZWdtYXBfc3BtaV9leHRfd3JpdGUsCisJLmdhdGhlcl93cml0ZQkJCT0gcmVnbWFwX3NwbWlfZXh0X2dhdGhlcl93cml0ZSwKKwkucmVnX2Zvcm1hdF9lbmRpYW5fZGVmYXVsdAk9IFJFR01BUF9FTkRJQU5fTkFUSVZFLAorCS52YWxfZm9ybWF0X2VuZGlhbl9kZWZhdWx0CT0gUkVHTUFQX0VORElBTl9OQVRJVkUsCit9OworCisvKioKKyAqIHJlZ21hcF9pbml0X3NwbWlfZXh0KCk6IENyZWF0ZSByZWdtYXAgZm9yIEV4dCByZWdpc3RlciBzcGFjZQorICogQHNkZXY6CURldmljZSB0aGF0IHdpbGwgYmUgaW50ZXJhY3RlZCB3aXRoCisgKiBAY29uZmlnOglDb25maWd1cmF0aW9uIGZvciByZWdpc3RlciBtYXAKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYW4gRVJSX1BUUigpIG9uIGVycm9yIG9yIGEgdmFsaWQgcG9pbnRlciB0bworICogYSBzdHJ1Y3QgcmVnbWFwLgorICovCitzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfaW5pdF9zcG1pX2V4dChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpCit7CisJcmV0dXJuIHJlZ21hcF9pbml0KCZzZGV2LT5kZXYsICZyZWdtYXBfc3BtaV9leHQsIHNkZXYsIGNvbmZpZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWdtYXBfaW5pdF9zcG1pX2V4dCk7CisKKy8qKgorICogZGV2bV9yZWdtYXBfaW5pdF9zcG1pX2V4dCgpOiBDcmVhdGUgbWFuYWdlZCByZWdtYXAgZm9yIEV4dCByZWdpc3RlciBzcGFjZQorICogQHNkZXY6CVNQTUkgZGV2aWNlIHRoYXQgd2lsbCBiZSBpbnRlcmFjdGVkIHdpdGgKKyAqIEBjb25maWc6CUNvbmZpZ3VyYXRpb24gZm9yIHJlZ2lzdGVyIG1hcAorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBhbiBFUlJfUFRSKCkgb24gZXJyb3Igb3IgYSB2YWxpZCBwb2ludGVyCisgKiB0byBhIHN0cnVjdCByZWdtYXAuICBUaGUgcmVnbWFwIHdpbGwgYmUgYXV0b21hdGljYWxseSBmcmVlZCBieSB0aGUKKyAqIGRldmljZSBtYW5hZ2VtZW50IGNvZGUuCisgKi8KK3N0cnVjdCByZWdtYXAgKmRldm1fcmVnbWFwX2luaXRfc3BtaV9leHQoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LAogCQkJCSAgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZykKIHsKLQlyZXR1cm4gZGV2bV9yZWdtYXBfaW5pdCgmc2Rldi0+ZGV2LCAmcmVnbWFwX3NwbWksIHNkZXYsIGNvbmZpZyk7CisJcmV0dXJuIGRldm1fcmVnbWFwX2luaXQoJnNkZXYtPmRldiwgJnJlZ21hcF9zcG1pX2V4dCwgc2RldiwgY29uZmlnKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGRldm1fcmVnbWFwX2luaXRfc3BtaSk7CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX3JlZ21hcF9pbml0X3NwbWlfZXh0KTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAuYyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLmMKaW5kZXggNmExOTUxNS4uZDBhMDcyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAuYworKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC5jCkBAIC0zODAsNiArMzgwLDI4IEBACiAJa2ZyZWUobWFwLT5zZWxlY3Rvcl93b3JrX2J1Zik7CiB9CiAKK2ludCByZWdtYXBfYXR0YWNoX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKm1hcCwKKwkJICAgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZykKK3sKKwlzdHJ1Y3QgcmVnbWFwICoqbTsKKworCW1hcC0+ZGV2ID0gZGV2OworCisJcmVnbWFwX2RlYnVnZnNfaW5pdChtYXAsIGNvbmZpZy0+bmFtZSk7CisKKwkvKiBBZGQgYSBkZXZyZXMgcmVzb3VyY2UgZm9yIGRldl9nZXRfcmVnbWFwKCkgKi8KKwltID0gZGV2cmVzX2FsbG9jKGRldl9nZXRfcmVnbWFwX3JlbGVhc2UsIHNpemVvZigqbSksIEdGUF9LRVJORUwpOworCWlmICghbSkgeworCQlyZWdtYXBfZGVidWdmc19leGl0KG1hcCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkqbSA9IG1hcDsKKwlkZXZyZXNfYWRkKGRldiwgbSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJlZ21hcF9hdHRhY2hfZGV2KTsKKwogLyoqCiAgKiByZWdtYXBfaW5pdCgpOiBJbml0aWFsaXNlIHJlZ2lzdGVyIG1hcAogICoKQEAgLTM5Nyw3ICs0MTksNyBAQAogCQkJICAgdm9pZCAqYnVzX2NvbnRleHQsCiAJCQkgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKQogewotCXN0cnVjdCByZWdtYXAgKm1hcCwgKiptOworCXN0cnVjdCByZWdtYXAgKm1hcDsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAllbnVtIHJlZ21hcF9lbmRpYW4gcmVnX2VuZGlhbiwgdmFsX2VuZGlhbjsKIAlpbnQgaSwgajsKQEAgLTQzOSw2ICs0NjEsNyBAQAogCWVsc2UKIAkJbWFwLT5yZWdfc3RyaWRlID0gMTsKIAltYXAtPnVzZV9zaW5nbGVfcncgPSBjb25maWctPnVzZV9zaW5nbGVfcnc7CisJbWFwLT5jYW5fbXVsdGlfd3JpdGUgPSBjb25maWctPmNhbl9tdWx0aV93cml0ZTsKIAltYXAtPmRldiA9IGRldjsKIAltYXAtPmJ1cyA9IGJ1czsKIAltYXAtPmJ1c19jb250ZXh0ID0gYnVzX2NvbnRleHQ7CkBAIC03MTgsNyArNzQxLDcgQEAKIAkJbmV3LT53aW5kb3dfc3RhcnQgPSByYW5nZV9jZmctPndpbmRvd19zdGFydDsKIAkJbmV3LT53aW5kb3dfbGVuID0gcmFuZ2VfY2ZnLT53aW5kb3dfbGVuOwogCi0JCWlmIChfcmVnbWFwX3JhbmdlX2FkZChtYXAsIG5ldykgPT0gZmFsc2UpIHsKKwkJaWYgKCFfcmVnbWFwX3JhbmdlX2FkZChtYXAsIG5ldykpIHsKIAkJCWRldl9lcnIobWFwLT5kZXYsICJGYWlsZWQgdG8gYWRkIHJhbmdlICVkXG4iLCBpKTsKIAkJCWtmcmVlKG5ldyk7CiAJCQlnb3RvIGVycl9yYW5nZTsKQEAgLTczNCwyNSArNzU3LDE4IEBACiAJCX0KIAl9CiAKLQlyZWdtYXBfZGVidWdmc19pbml0KG1hcCwgY29uZmlnLT5uYW1lKTsKLQogCXJldCA9IHJlZ2NhY2hlX2luaXQobWFwLCBjb25maWcpOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byBlcnJfcmFuZ2U7CiAKLQkvKiBBZGQgYSBkZXZyZXMgcmVzb3VyY2UgZm9yIGRldl9nZXRfcmVnbWFwKCkgKi8KLQltID0gZGV2cmVzX2FsbG9jKGRldl9nZXRfcmVnbWFwX3JlbGVhc2UsIHNpemVvZigqbSksIEdGUF9LRVJORUwpOwotCWlmICghbSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9kZWJ1Z2ZzOwotCX0KLQkqbSA9IG1hcDsKLQlkZXZyZXNfYWRkKGRldiwgbSk7CisJaWYgKGRldikKKwkJcmV0ID0gcmVnbWFwX2F0dGFjaF9kZXYoZGV2LCBtYXAsIGNvbmZpZyk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWdvdG8gZXJyX3JlZ2NhY2hlOwogCiAJcmV0dXJuIG1hcDsKIAotZXJyX2RlYnVnZnM6Ci0JcmVnbWFwX2RlYnVnZnNfZXhpdChtYXApOworZXJyX3JlZ2NhY2hlOgogCXJlZ2NhY2hlX2V4aXQobWFwKTsKIGVycl9yYW5nZToKIAlyZWdtYXBfcmFuZ2VfZXhpdChtYXApOwpAQCAtMTUyMCwxMiArMTUzNiwxMiBAQAogCWlmIChyZWcgJSBtYXAtPnJlZ19zdHJpZGUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbWFwLT5sb2NrKG1hcC0+bG9ja19hcmcpOwogCS8qCiAJICogU29tZSBkZXZpY2VzIGRvbid0IHN1cHBvcnQgYnVsayB3cml0ZSwgZm9yCiAJICogdGhlbSB3ZSBoYXZlIGEgc2VyaWVzIG9mIHNpbmdsZSB3cml0ZSBvcGVyYXRpb25zLgogCSAqLwogCWlmICghbWFwLT5idXMgfHwgbWFwLT51c2Vfc2luZ2xlX3J3KSB7CisJCW1hcC0+bG9jayhtYXAtPmxvY2tfYXJnKTsKIAkJZm9yIChpID0gMDsgaSA8IHZhbF9jb3VudDsgaSsrKSB7CiAJCQl1bnNpZ25lZCBpbnQgaXZhbDsKIApAQCAtMTU1NCwzMSArMTU3MCwyMzkgQEAKIAkJCWlmIChyZXQgIT0gMCkKIAkJCQlnb3RvIG91dDsKIAkJfQorb3V0OgorCQltYXAtPnVubG9jayhtYXAtPmxvY2tfYXJnKTsKIAl9IGVsc2UgewogCQl2b2lkICp3dmFsOwogCiAJCXd2YWwgPSBrbWVtZHVwKHZhbCwgdmFsX2NvdW50ICogdmFsX2J5dGVzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF3dmFsKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwogCQkJZGV2X2VycihtYXAtPmRldiwgIkVycm9yIGluIG1lbW9yeSBhbGxvY2F0aW9uXG4iKTsKLQkJCWdvdG8gb3V0OworCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJZm9yIChpID0gMDsgaSA8IHZhbF9jb3VudCAqIHZhbF9ieXRlczsgaSArPSB2YWxfYnl0ZXMpCiAJCQltYXAtPmZvcm1hdC5wYXJzZV9pbnBsYWNlKHd2YWwgKyBpKTsKIAorCQltYXAtPmxvY2sobWFwLT5sb2NrX2FyZyk7CiAJCXJldCA9IF9yZWdtYXBfcmF3X3dyaXRlKG1hcCwgcmVnLCB3dmFsLCB2YWxfYnl0ZXMgKiB2YWxfY291bnQpOworCQltYXAtPnVubG9jayhtYXAtPmxvY2tfYXJnKTsKIAogCQlrZnJlZSh3dmFsKTsKIAl9Ci1vdXQ6Ci0JbWFwLT51bmxvY2sobWFwLT5sb2NrX2FyZyk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ21hcF9idWxrX3dyaXRlKTsKIAogLyoKKyAqIF9yZWdtYXBfcmF3X211bHRpX3JlZ193cml0ZSgpCisgKgorICogdGhlIChyZWdpc3RlcixuZXd2YWx1ZSkgcGFpcnMgaW4gcmVncyBoYXZlIG5vdCBiZWVuIGZvcm1hdHRlZCwgYnV0CisgKiB0aGV5IGFyZSBhbGwgaW4gdGhlIHNhbWUgcGFnZSBhbmQgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gYmVpbmcgcGFnZQorICogcmVsYXRpdmUuIFRoZSBwYWdlIHJlZ2lzdGVyIGhhcyBiZWVuIHdyaXR0ZW4gaWYgdGhhdCB3YXMgbmVjY2Vzc2FyeS4KKyAqLworc3RhdGljIGludCBfcmVnbWFwX3Jhd19tdWx0aV9yZWdfd3JpdGUoc3RydWN0IHJlZ21hcCAqbWFwLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgKnJlZ3MsCisJCQkJICAgICAgIHNpemVfdCBudW1fcmVncykKK3sKKwlpbnQgcmV0OworCXZvaWQgKmJ1ZjsKKwlpbnQgaTsKKwl1OCAqdTg7CisJc2l6ZV90IHZhbF9ieXRlcyA9IG1hcC0+Zm9ybWF0LnZhbF9ieXRlczsKKwlzaXplX3QgcmVnX2J5dGVzID0gbWFwLT5mb3JtYXQucmVnX2J5dGVzOworCXNpemVfdCBwYWRfYnl0ZXMgPSBtYXAtPmZvcm1hdC5wYWRfYnl0ZXM7CisJc2l6ZV90IHBhaXJfc2l6ZSA9IHJlZ19ieXRlcyArIHBhZF9ieXRlcyArIHZhbF9ieXRlczsKKwlzaXplX3QgbGVuID0gcGFpcl9zaXplICogbnVtX3JlZ3M7CisKKwlidWYgPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogV2UgaGF2ZSB0byBsaW5lYXJpc2UgYnkgaGFuZC4gKi8KKworCXU4ID0gYnVmOworCisJZm9yIChpID0gMDsgaSA8IG51bV9yZWdzOyBpKyspIHsKKwkJaW50IHJlZyA9IHJlZ3NbaV0ucmVnOworCQlpbnQgdmFsID0gcmVnc1tpXS5kZWY7CisJCXRyYWNlX3JlZ21hcF9od193cml0ZV9zdGFydChtYXAtPmRldiwgcmVnLCAxKTsKKwkJbWFwLT5mb3JtYXQuZm9ybWF0X3JlZyh1OCwgcmVnLCBtYXAtPnJlZ19zaGlmdCk7CisJCXU4ICs9IHJlZ19ieXRlcyArIHBhZF9ieXRlczsKKwkJbWFwLT5mb3JtYXQuZm9ybWF0X3ZhbCh1OCwgdmFsLCAwKTsKKwkJdTggKz0gdmFsX2J5dGVzOworCX0KKwl1OCA9IGJ1ZjsKKwkqdTggfD0gbWFwLT53cml0ZV9mbGFnX21hc2s7CisKKwlyZXQgPSBtYXAtPmJ1cy0+d3JpdGUobWFwLT5idXNfY29udGV4dCwgYnVmLCBsZW4pOworCisJa2ZyZWUoYnVmKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcmVnczsgaSsrKSB7CisJCWludCByZWcgPSByZWdzW2ldLnJlZzsKKwkJdHJhY2VfcmVnbWFwX2h3X3dyaXRlX2RvbmUobWFwLT5kZXYsIHJlZywgMSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX3JlZ21hcF9yZWdpc3Rlcl9wYWdlKHN0cnVjdCByZWdtYXAgKm1hcCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgcmVnLAorCQkJCQkgIHN0cnVjdCByZWdtYXBfcmFuZ2Vfbm9kZSAqcmFuZ2UpCit7CisJdW5zaWduZWQgaW50IHdpbl9wYWdlID0gKHJlZyAtIHJhbmdlLT5yYW5nZV9taW4pIC8gcmFuZ2UtPndpbmRvd19sZW47CisKKwlyZXR1cm4gd2luX3BhZ2U7Cit9CisKK3N0YXRpYyBpbnQgX3JlZ21hcF9yYW5nZV9tdWx0aV9wYWdlZF9yZWdfd3JpdGUoc3RydWN0IHJlZ21hcCAqbWFwLAorCQkJCQkgICAgICAgc3RydWN0IHJlZ19kZWZhdWx0ICpyZWdzLAorCQkJCQkgICAgICAgc2l6ZV90IG51bV9yZWdzKQoreworCWludCByZXQ7CisJaW50IGksIG47CisJc3RydWN0IHJlZ19kZWZhdWx0ICpiYXNlOworCXVuc2lnbmVkIGludCB0aGlzX3BhZ2U7CisJLyoKKwkgKiB0aGUgc2V0IG9mIHJlZ2lzdGVycyBhcmUgbm90IG5lY2Nlc3NhcmlseSBpbiBvcmRlciwgYnV0CisJICogc2luY2UgdGhlIG9yZGVyIG9mIHdyaXRlIG11c3QgYmUgcHJlc2VydmVkIHRoaXMgYWxnb3JpdGhtCisJICogY2hvcHMgdGhlIHNldCBlYWNoIHRpbWUgdGhlIHBhZ2UgY2hhbmdlcworCSAqLworCWJhc2UgPSByZWdzOworCWZvciAoaSA9IDAsIG4gPSAwOyBpIDwgbnVtX3JlZ3M7IGkrKywgbisrKSB7CisJCXVuc2lnbmVkIGludCByZWcgPSByZWdzW2ldLnJlZzsKKwkJc3RydWN0IHJlZ21hcF9yYW5nZV9ub2RlICpyYW5nZTsKKworCQlyYW5nZSA9IF9yZWdtYXBfcmFuZ2VfbG9va3VwKG1hcCwgcmVnKTsKKwkJaWYgKHJhbmdlKSB7CisJCQl1bnNpZ25lZCBpbnQgd2luX3BhZ2UgPSBfcmVnbWFwX3JlZ2lzdGVyX3BhZ2UobWFwLCByZWcsCisJCQkJCQkJCSAgICAgIHJhbmdlKTsKKworCQkJaWYgKGkgPT0gMCkKKwkJCQl0aGlzX3BhZ2UgPSB3aW5fcGFnZTsKKwkJCWlmICh3aW5fcGFnZSAhPSB0aGlzX3BhZ2UpIHsKKwkJCQl0aGlzX3BhZ2UgPSB3aW5fcGFnZTsKKwkJCQlyZXQgPSBfcmVnbWFwX3Jhd19tdWx0aV9yZWdfd3JpdGUobWFwLCBiYXNlLCBuKTsKKwkJCQlpZiAocmV0ICE9IDApCisJCQkJCXJldHVybiByZXQ7CisJCQkJYmFzZSArPSBuOworCQkJCW4gPSAwOworCQkJfQorCQkJcmV0ID0gX3JlZ21hcF9zZWxlY3RfcGFnZShtYXAsICZiYXNlW25dLnJlZywgcmFuZ2UsIDEpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJaWYgKG4gPiAwKQorCQlyZXR1cm4gX3JlZ21hcF9yYXdfbXVsdGlfcmVnX3dyaXRlKG1hcCwgYmFzZSwgbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3JlZ21hcF9tdWx0aV9yZWdfd3JpdGUoc3RydWN0IHJlZ21hcCAqbWFwLAorCQkJCSAgIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcmVncywKKwkJCQkgICBzaXplX3QgbnVtX3JlZ3MpCit7CisJaW50IGk7CisJaW50IHJldDsKKworCWlmICghbWFwLT5jYW5fbXVsdGlfd3JpdGUpIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9yZWdzOyBpKyspIHsKKwkJCXJldCA9IF9yZWdtYXBfd3JpdGUobWFwLCByZWdzW2ldLnJlZywgcmVnc1tpXS5kZWYpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFtYXAtPmZvcm1hdC5wYXJzZV9pbnBsYWNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtYXAtPndyaXRlYWJsZV9yZWcpCisJCWZvciAoaSA9IDA7IGkgPCBudW1fcmVnczsgaSsrKSB7CisJCQlpbnQgcmVnID0gcmVnc1tpXS5yZWc7CisJCQlpZiAoIW1hcC0+d3JpdGVhYmxlX3JlZyhtYXAtPmRldiwgcmVnKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChyZWcgJSBtYXAtPnJlZ19zdHJpZGUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCWlmICghbWFwLT5jYWNoZV9ieXBhc3MpIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9yZWdzOyBpKyspIHsKKwkJCXVuc2lnbmVkIGludCB2YWwgPSByZWdzW2ldLmRlZjsKKwkJCXVuc2lnbmVkIGludCByZWcgPSByZWdzW2ldLnJlZzsKKwkJCXJldCA9IHJlZ2NhY2hlX3dyaXRlKG1hcCwgcmVnLCB2YWwpOworCQkJaWYgKHJldCkgeworCQkJCWRldl9lcnIobWFwLT5kZXYsCisJCQkJIkVycm9yIGluIGNhY2hpbmcgb2YgcmVnaXN0ZXI6ICV4IHJldDogJWRcbiIsCisJCQkJCQkJCXJlZywgcmV0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJCWlmIChtYXAtPmNhY2hlX29ubHkpIHsKKwkJCW1hcC0+Y2FjaGVfZGlydHkgPSB0cnVlOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlXQVJOX09OKCFtYXAtPmJ1cyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3JlZ3M7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgcmVnID0gcmVnc1tpXS5yZWc7CisJCXN0cnVjdCByZWdtYXBfcmFuZ2Vfbm9kZSAqcmFuZ2U7CisJCXJhbmdlID0gX3JlZ21hcF9yYW5nZV9sb29rdXAobWFwLCByZWcpOworCQlpZiAocmFuZ2UpIHsKKwkJCXNpemVfdCBsZW4gPSBzaXplb2Yoc3RydWN0IHJlZ19kZWZhdWx0KSpudW1fcmVnczsKKwkJCXN0cnVjdCByZWdfZGVmYXVsdCAqYmFzZSA9IGttZW1kdXAocmVncywgbGVuLAorCQkJCQkJCSAgIEdGUF9LRVJORUwpOworCQkJaWYgKCFiYXNlKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJcmV0ID0gX3JlZ21hcF9yYW5nZV9tdWx0aV9wYWdlZF9yZWdfd3JpdGUobWFwLCBiYXNlLAorCQkJCQkJCQkgIG51bV9yZWdzKTsKKwkJCWtmcmVlKGJhc2UpOworCisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXJldHVybiBfcmVnbWFwX3Jhd19tdWx0aV9yZWdfd3JpdGUobWFwLCByZWdzLCBudW1fcmVncyk7Cit9CisKKy8qCiAgKiByZWdtYXBfbXVsdGlfcmVnX3dyaXRlKCk6IFdyaXRlIG11bHRpcGxlIHJlZ2lzdGVycyB0byB0aGUgZGV2aWNlCiAgKgorICogd2hlcmUgdGhlIHNldCBvZiByZWdpc3Rlcix2YWx1ZSBwYWlycyBhcmUgc3VwcGxpZWQgaW4gYW55IG9yZGVyLAorICogcG9zc2libHkgbm90IGFsbCBpbiBhIHNpbmdsZSByYW5nZS4KKyAqCisgKiBAbWFwOiBSZWdpc3RlciBtYXAgdG8gd3JpdGUgdG8KKyAqIEByZWdzOiBBcnJheSBvZiBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgcmVnaXN0ZXIsdmFsdWUgdG8gYmUgd3JpdHRlbgorICogQG51bV9yZWdzOiBOdW1iZXIgb2YgcmVnaXN0ZXJzIHRvIHdyaXRlCisgKgorICogVGhlICdub3JtYWwnIGJsb2NrIHdyaXRlIG1vZGUgd2lsbCBzZW5kIHVsdGltYXRlbHkgc2VuZCBkYXRhIG9uIHRoZQorICogdGFyZ2V0IGJ1cyBhcyBSLFYxLFYyLFYzLC4uLFZuIHdoZXJlIHN1Y2Nlc3NpdmVseSBoaWdlciByZWdpc3RlcnMgYXJlCisgKiBhZGRyZXNzZWQuIEhvd2V2ZXIsIHRoaXMgYWx0ZXJuYXRpdmUgYmxvY2sgbXVsdGkgd3JpdGUgbW9kZSB3aWxsIHNlbmQKKyAqIHRoZSBkYXRhIGFzIFIxLFYxLFIyLFYyLC4uLFJuLFZuIG9uIHRoZSB0YXJnZXQgYnVzLiBUaGUgdGFyZ2V0IGRldmljZQorICogbXVzdCBvZiBjb3Vyc2Ugc3VwcG9ydCB0aGUgbW9kZS4KKyAqCisgKiBBIHZhbHVlIG9mIHplcm8gd2lsbCBiZSByZXR1cm5lZCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm5vIHdpbGwgYmUKKyAqIHJldHVybmVkIGluIGVycm9yIGNhc2VzLgorICovCitpbnQgcmVnbWFwX211bHRpX3JlZ193cml0ZShzdHJ1Y3QgcmVnbWFwICptYXAsIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcmVncywKKwkJCSAgIGludCBudW1fcmVncykKK3sKKwlpbnQgcmV0OworCisJbWFwLT5sb2NrKG1hcC0+bG9ja19hcmcpOworCisJcmV0ID0gX3JlZ21hcF9tdWx0aV9yZWdfd3JpdGUobWFwLCByZWdzLCBudW1fcmVncyk7CisKKwltYXAtPnVubG9jayhtYXAtPmxvY2tfYXJnKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWdtYXBfbXVsdGlfcmVnX3dyaXRlKTsKKworLyoKKyAqIHJlZ21hcF9tdWx0aV9yZWdfd3JpdGVfYnlwYXNzZWQoKTogV3JpdGUgbXVsdGlwbGUgcmVnaXN0ZXJzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgYnV0IG5vdCB0aGUgY2FjaGUKKyAqCiAgKiB3aGVyZSB0aGUgc2V0IG9mIHJlZ2lzdGVyIGFyZSBzdXBwbGllZCBpbiBhbnkgb3JkZXIKICAqCiAgKiBAbWFwOiBSZWdpc3RlciBtYXAgdG8gd3JpdGUgdG8KQEAgLTE1OTIsMzAgKzE4MTYsMjcgQEAKICAqIEEgdmFsdWUgb2YgemVybyB3aWxsIGJlIHJldHVybmVkIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJybm8gd2lsbAogICogYmUgcmV0dXJuZWQgaW4gZXJyb3IgY2FzZXMuCiAgKi8KLWludCByZWdtYXBfbXVsdGlfcmVnX3dyaXRlKHN0cnVjdCByZWdtYXAgKm1hcCwgc3RydWN0IHJlZ19kZWZhdWx0ICpyZWdzLAotCQkJCWludCBudW1fcmVncykKK2ludCByZWdtYXBfbXVsdGlfcmVnX3dyaXRlX2J5cGFzc2VkKHN0cnVjdCByZWdtYXAgKm1hcCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHJlZ19kZWZhdWx0ICpyZWdzLAorCQkJCSAgICBpbnQgbnVtX3JlZ3MpCiB7Ci0JaW50IHJldCA9IDAsIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3JlZ3M7IGkrKykgewotCQlpbnQgcmVnID0gcmVnc1tpXS5yZWc7Ci0JCWlmIChyZWcgJSBtYXAtPnJlZ19zdHJpZGUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJaW50IHJldDsKKwlib29sIGJ5cGFzczsKIAogCW1hcC0+bG9jayhtYXAtPmxvY2tfYXJnKTsKIAotCWZvciAoaSA9IDA7IGkgPCBudW1fcmVnczsgaSsrKSB7Ci0JCXJldCA9IF9yZWdtYXBfd3JpdGUobWFwLCByZWdzW2ldLnJlZywgcmVnc1tpXS5kZWYpOwotCQlpZiAocmV0ICE9IDApCi0JCQlnb3RvIG91dDsKLQl9Ci1vdXQ6CisJYnlwYXNzID0gbWFwLT5jYWNoZV9ieXBhc3M7CisJbWFwLT5jYWNoZV9ieXBhc3MgPSB0cnVlOworCisJcmV0ID0gX3JlZ21hcF9tdWx0aV9yZWdfd3JpdGUobWFwLCByZWdzLCBudW1fcmVncyk7CisKKwltYXAtPmNhY2hlX2J5cGFzcyA9IGJ5cGFzczsKKwogCW1hcC0+dW5sb2NrKG1hcC0+bG9ja19hcmcpOwogCiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHJlZ21hcF9tdWx0aV9yZWdfd3JpdGUpOworRVhQT1JUX1NZTUJPTF9HUEwocmVnbWFwX211bHRpX3JlZ193cml0ZV9ieXBhc3NlZCk7CiAKIC8qKgogICogcmVnbWFwX3Jhd193cml0ZV9hc3luYygpOiBXcml0ZSByYXcgdmFsdWVzIHRvIG9uZSBvciBtb3JlIHJlZ2lzdGVycwpAQCAtMTczNiw2ICsxOTU3LDkgQEAKIAlpZiAobWFwLT5jYWNoZV9vbmx5KQogCQlyZXR1cm4gLUVCVVNZOwogCisJaWYgKCFyZWdtYXBfcmVhZGFibGUobWFwLCByZWcpKQorCQlyZXR1cm4gLUVJTzsKKwogCXJldCA9IG1hcC0+cmVnX3JlYWQoY29udGV4dCwgcmVnLCB2YWwpOwogCWlmIChyZXQgPT0gMCkgewogI2lmZGVmIExPR19ERVZJQ0UKQEAgLTE5NjYsOSArMjE5MCwxMSBAQAogCiAJaWYgKHRtcCAhPSBvcmlnKSB7CiAJCXJldCA9IF9yZWdtYXBfd3JpdGUobWFwLCByZWcsIHRtcCk7Ci0JCSpjaGFuZ2UgPSB0cnVlOworCQlpZiAoY2hhbmdlKQorCQkJKmNoYW5nZSA9IHRydWU7CiAJfSBlbHNlIHsKLQkJKmNoYW5nZSA9IGZhbHNlOworCQlpZiAoY2hhbmdlKQorCQkJKmNoYW5nZSA9IGZhbHNlOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xOTg3LDExICsyMjEzLDEwIEBACiBpbnQgcmVnbWFwX3VwZGF0ZV9iaXRzKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZywKIAkJICAgICAgIHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgdmFsKQogewotCWJvb2wgY2hhbmdlOwogCWludCByZXQ7CiAKIAltYXAtPmxvY2sobWFwLT5sb2NrX2FyZyk7Ci0JcmV0ID0gX3JlZ21hcF91cGRhdGVfYml0cyhtYXAsIHJlZywgbWFzaywgdmFsLCAmY2hhbmdlKTsKKwlyZXQgPSBfcmVnbWFwX3VwZGF0ZV9iaXRzKG1hcCwgcmVnLCBtYXNrLCB2YWwsIE5VTEwpOwogCW1hcC0+dW5sb2NrKG1hcC0+bG9ja19hcmcpOwogCiAJcmV0dXJuIHJldDsKQEAgLTIwMTYsMTQgKzIyNDEsMTMgQEAKIGludCByZWdtYXBfdXBkYXRlX2JpdHNfYXN5bmMoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgcmVnLAogCQkJICAgICB1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IHZhbCkKIHsKLQlib29sIGNoYW5nZTsKIAlpbnQgcmV0OwogCiAJbWFwLT5sb2NrKG1hcC0+bG9ja19hcmcpOwogCiAJbWFwLT5hc3luYyA9IHRydWU7CiAKLQlyZXQgPSBfcmVnbWFwX3VwZGF0ZV9iaXRzKG1hcCwgcmVnLCBtYXNrLCB2YWwsICZjaGFuZ2UpOworCXJldCA9IF9yZWdtYXBfdXBkYXRlX2JpdHMobWFwLCByZWcsIG1hc2ssIHZhbCwgTlVMTCk7CiAKIAltYXAtPmFzeW5jID0gZmFsc2U7CiAKQEAgLTIxNzMsMzUgKzIzOTcsMjEgQEAKICAqIGFwcGx5IHRoZW0gaW1tZWRpYXRlbHkuICBUeXBpY2FsbHkgdGhpcyBpcyB1c2VkIHRvIGFwcGx5CiAgKiBjb3JyZWN0aW9ucyB0byBiZSBhcHBsaWVkIHRvIHRoZSBkZXZpY2UgZGVmYXVsdHMgb24gc3RhcnR1cCwgc3VjaAogICogYXMgdGhlIHVwZGF0ZXMgc29tZSB2ZW5kb3JzIHByb3ZpZGUgdG8gdW5kb2N1bWVudGVkIHJlZ2lzdGVycy4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkCisgKiBjb25jdXJyZW50bHkgd2l0aCBlaXRoZXIgaXRzZWxmIG9yIHJlZ2NhY2hlX3N5bmMoKS4KICAqLwogaW50IHJlZ21hcF9yZWdpc3Rlcl9wYXRjaChzdHJ1Y3QgcmVnbWFwICptYXAsIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcmVncywKIAkJCSAgaW50IG51bV9yZWdzKQogewogCXN0cnVjdCByZWdfZGVmYXVsdCAqcDsKLQlpbnQgaSwgcmV0OworCWludCByZXQ7CiAJYm9vbCBieXBhc3M7CiAKIAlpZiAoV0FSTl9PTkNFKG51bV9yZWdzIDw9IDAsICJpbnZhbGlkIHJlZ2lzdGVycyBudW1iZXIgKCVkKVxuIiwKIAkgICAgbnVtX3JlZ3MpKQogCQlyZXR1cm4gMDsKIAotCW1hcC0+bG9jayhtYXAtPmxvY2tfYXJnKTsKLQotCWJ5cGFzcyA9IG1hcC0+Y2FjaGVfYnlwYXNzOwotCi0JbWFwLT5jYWNoZV9ieXBhc3MgPSB0cnVlOwotCW1hcC0+YXN5bmMgPSB0cnVlOwotCi0JLyogV3JpdGUgb3V0IGZpcnN0OyBpdCdzIHVzZWZ1bCB0byBhcHBseSBldmVuIGlmIHdlIGZhaWwgbGF0ZXIuICovCi0JZm9yIChpID0gMDsgaSA8IG51bV9yZWdzOyBpKyspIHsKLQkJcmV0ID0gX3JlZ21hcF93cml0ZShtYXAsIHJlZ3NbaV0ucmVnLCByZWdzW2ldLmRlZik7Ci0JCWlmIChyZXQgIT0gMCkgewotCQkJZGV2X2VycihtYXAtPmRldiwgIkZhaWxlZCB0byB3cml0ZSAleCA9ICV4OiAlZFxuIiwKLQkJCQlyZWdzW2ldLnJlZywgcmVnc1tpXS5kZWYsIHJldCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQogCXAgPSBrcmVhbGxvYyhtYXAtPnBhdGNoLAogCQkgICAgIHNpemVvZihzdHJ1Y3QgcmVnX2RlZmF1bHQpICogKG1hcC0+cGF0Y2hfcmVncyArIG51bV9yZWdzKSwKIAkJICAgICBHRlBfS0VSTkVMKTsKQEAgLTIyMTAsOSArMjQyMCwyMCBAQAogCQltYXAtPnBhdGNoID0gcDsKIAkJbWFwLT5wYXRjaF9yZWdzICs9IG51bV9yZWdzOwogCX0gZWxzZSB7Ci0JCXJldCA9IC1FTk9NRU07CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCW1hcC0+bG9jayhtYXAtPmxvY2tfYXJnKTsKKworCWJ5cGFzcyA9IG1hcC0+Y2FjaGVfYnlwYXNzOworCisJbWFwLT5jYWNoZV9ieXBhc3MgPSB0cnVlOworCW1hcC0+YXN5bmMgPSB0cnVlOworCisJcmV0ID0gX3JlZ21hcF9tdWx0aV9yZWdfd3JpdGUobWFwLCByZWdzLCBudW1fcmVncyk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIG91dDsKKwogb3V0OgogCW1hcC0+YXN5bmMgPSBmYWxzZTsKIAltYXAtPmNhY2hlX2J5cGFzcyA9IGJ5cGFzczsKQEAgLTIyNDAsNiArMjQ2MSwxOCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVnbWFwX2dldF92YWxfYnl0ZXMpOwogCitpbnQgcmVnbWFwX3BhcnNlX3ZhbChzdHJ1Y3QgcmVnbWFwICptYXAsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCXVuc2lnbmVkIGludCAqdmFsKQoreworCWlmICghbWFwLT5mb3JtYXQucGFyc2VfdmFsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSp2YWwgPSBtYXAtPmZvcm1hdC5wYXJzZV92YWwoYnVmKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmVnbWFwX3BhcnNlX3ZhbCk7CisKIHN0YXRpYyBpbnQgX19pbml0IHJlZ21hcF9pbml0Y2FsbCh2b2lkKQogewogCXJlZ21hcF9kZWJ1Z2ZzX2luaXRjYWxsKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvdG9wb2xvZ3kuYyBiL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jCmluZGV4IDk0ZmZlZTMuLmFkOWQxNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jCisrKyBiL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jCkBAIC0yMyw3ICsyMyw2IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svREFDOTYwLmMgYi9kcml2ZXJzL2Jsb2NrL0RBQzk2MC5jCmluZGV4IGViMzk1MDEuLjEyNWQ4NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svREFDOTYwLmMKKysrIGIvZHJpdmVycy9ibG9jay9EQUM5NjAuYwpAQCAtNjQxMSwxMiArNjQxMSwxMiBAQAogCQkJCQkuU2NhdHRlckdhdGhlclNlZ21lbnRzWzBdCiAJCQkJCS5TZWdtZW50Qnl0ZUNvdW50ID0KIAkgICAgQ29tbWFuZE1haWxib3gtPkNvbnRyb2xsZXJJbmZvLkRhdGFUcmFuc2ZlclNpemU7Ci0JICBEQUM5NjBfRXhlY3V0ZUNvbW1hbmQoQ29tbWFuZCk7Ci0JICB3aGlsZSAoQ29udHJvbGxlci0+VjIuTmV3Q29udHJvbGxlckluZm9ybWF0aW9uLT5QaHlzaWNhbFNjYW5BY3RpdmUpCi0JICAgIHsKLQkgICAgICBEQUM5NjBfRXhlY3V0ZUNvbW1hbmQoQ29tbWFuZCk7Ci0JICAgICAgc2xlZXBfb25fdGltZW91dCgmQ29udHJvbGxlci0+Q29tbWFuZFdhaXRRdWV1ZSwgSFopOwotCSAgICB9CisJICB3aGlsZSAoMSkgeworCSAgICBEQUM5NjBfRXhlY3V0ZUNvbW1hbmQoQ29tbWFuZCk7CisJICAgIGlmICghQ29udHJvbGxlci0+VjIuTmV3Q29udHJvbGxlckluZm9ybWF0aW9uLT5QaHlzaWNhbFNjYW5BY3RpdmUpCisJCWJyZWFrOworCSAgICBtc2xlZXAoMTAwMCk7CisJICB9CiAJICBEQUM5NjBfVXNlckNyaXRpY2FsKCJEaXNjb3ZlcnkgQ29tcGxldGVkXG4iLCBDb250cm9sbGVyKTsKICAJfQogICAgIH0KQEAgLTcwMzUsMTggKzcwMzUsMTYgQEAKIAkJRXJyb3JDb2RlID0gLUVGQVVMVDsKIAkJYnJlYWs7CiAJfQotCXdoaWxlIChDb250cm9sbGVyLT5WMi5IZWFsdGhTdGF0dXNCdWZmZXItPlN0YXR1c0NoYW5nZUNvdW50ZXIKLQkgICAgICAgPT0gSGVhbHRoU3RhdHVzQnVmZmVyLlN0YXR1c0NoYW5nZUNvdW50ZXIgJiYKLQkgICAgICAgQ29udHJvbGxlci0+VjIuSGVhbHRoU3RhdHVzQnVmZmVyLT5OZXh0RXZlbnRTZXF1ZW5jZU51bWJlcgotCSAgICAgICA9PSBIZWFsdGhTdGF0dXNCdWZmZXIuTmV4dEV2ZW50U2VxdWVuY2VOdW1iZXIpCi0JICB7Ci0JICAgIGludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmQ29udHJvbGxlci0+SGVhbHRoU3RhdHVzV2FpdFF1ZXVlLAotCQkJCQkgICBEQUM5NjBfTW9uaXRvcmluZ1RpbWVySW50ZXJ2YWwpOwotCSAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkgICAgCUVycm9yQ29kZSA9IC1FSU5UUjsKLQkgICAgCWJyZWFrOwotCSAgICB9Ci0JICB9CisJRXJyb3JDb2RlID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoQ29udHJvbGxlci0+SGVhbHRoU3RhdHVzV2FpdFF1ZXVlLAorCQkJIShDb250cm9sbGVyLT5WMi5IZWFsdGhTdGF0dXNCdWZmZXItPlN0YXR1c0NoYW5nZUNvdW50ZXIKKwkJCSAgICA9PSBIZWFsdGhTdGF0dXNCdWZmZXIuU3RhdHVzQ2hhbmdlQ291bnRlciAmJgorCQkJICBDb250cm9sbGVyLT5WMi5IZWFsdGhTdGF0dXNCdWZmZXItPk5leHRFdmVudFNlcXVlbmNlTnVtYmVyCisJCQkgICAgPT0gSGVhbHRoU3RhdHVzQnVmZmVyLk5leHRFdmVudFNlcXVlbmNlTnVtYmVyKSwKKwkJCURBQzk2MF9Nb25pdG9yaW5nVGltZXJJbnRlcnZhbCk7CisJaWYgKEVycm9yQ29kZSA9PSAtRVJFU1RBUlRTWVMpIHsKKwkJRXJyb3JDb2RlID0gLUVJTlRSOworCQlicmVhazsKKwl9CiAJaWYgKGNvcHlfdG9fdXNlcihHZXRIZWFsdGhTdGF0dXMuSGVhbHRoU3RhdHVzQnVmZmVyLAogCQkJIENvbnRyb2xsZXItPlYyLkhlYWx0aFN0YXR1c0J1ZmZlciwKIAkJCSBzaXplb2YoREFDOTYwX1YyX0hlYWx0aFN0YXR1c0J1ZmZlcl9UKSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYyBiL2RyaXZlcnMvYmxvY2svYXRhZmxvcC5jCmluZGV4IDBlMzBjNmUuLjk2YjYyOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYXRhZmxvcC5jCisrKyBiL2RyaXZlcnMvYmxvY2svYXRhZmxvcC5jCkBAIC02OCw2ICs2OCw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9hdGFmZC5oPgogI2luY2x1ZGUgPGFzbS9hdGFmZHJlZy5oPgpAQCAtMzAxLDcgKzMwMyw3IEBACiAvKiBTeW5jaHJvbml6YXRpb24gb2YgRkRDIGFjY2Vzcy4gKi8KIHN0YXRpYyB2b2xhdGlsZSBpbnQgZmRjX2J1c3kgPSAwOwogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGZkY193YWl0KTsKLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChmb3JtYXRfd2FpdCk7CitzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGZvcm1hdF93YWl0KTsKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hhbmdlZF9mbG9wcGllcyA9IDB4ZmYsIGZha2VfY2hhbmdlID0gMDsKICNkZWZpbmUJQ0hFQ0tfQ0hBTkdFX0RFTEFZCUhaLzIKQEAgLTYwOCw3ICs2MTAsNyBAQAogCWlmIChJc0Zvcm1hdHRpbmcpIHsKIAkJSXNGb3JtYXR0aW5nID0gMDsKIAkJRm9ybWF0RXJyb3IgPSAxOwotCQl3YWtlX3VwKCAmZm9ybWF0X3dhaXQgKTsKKwkJY29tcGxldGUoJmZvcm1hdF93YWl0KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNjUwLDkgKzY1Miw4IEBACiAJRFBSSU5UKCgiZG9fZm9ybWF0KCBkcj0lZCB0cj0lZCBoZT0lZCBvZmZzPSVkIClcbiIsCiAJCWRyaXZlLCBkZXNjLT50cmFjaywgZGVzYy0+aGVhZCwgZGVzYy0+c2VjdF9vZmZzZXQgKSk7CiAKKwl3YWl0X2V2ZW50KGZkY193YWl0LCBjbXB4Y2hnKCZmZGNfYnVzeSwgMCwgMSkgPT0gMCk7CiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXdoaWxlKCBmZGNfYnVzeSApIHNsZWVwX29uKCAmZmRjX3dhaXQgKTsKLQlmZGNfYnVzeSA9IDE7CiAJc3RkbWFfbG9jayhmbG9wcHlfaXJxLCBOVUxMKTsKIAlhdGFyaV90dXJub25faXJxKCBJUlFfTUZQX0ZEQyApOyAvKiBzaG91bGQgYmUgYWxyZWFkeSwganVzdCB0byBiZSBzdXJlICovCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtNzA2LDcgKzcwNyw3IEBACiAJUmVxU2lkZSAgPSBkZXNjLT5oZWFkOwogCWRvX2ZkX2FjdGlvbiggZHJpdmUgKTsKIAotCXNsZWVwX29uKCAmZm9ybWF0X3dhaXQgKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmb3JtYXRfd2FpdCk7CiAKIAlyZWRvX2ZkX3JlcXVlc3QoKTsKIAlyZXR1cm4oIEZvcm1hdEVycm9yID8gLUVJTyA6IDAgKTsJCkBAIC0xMjI5LDcgKzEyMzAsNyBAQAogCQlnb3RvIGVycl9lbmQ7CiAJfQogCi0Jd2FrZV91cCggJmZvcm1hdF93YWl0ICk7CisJY29tcGxldGUoJmZvcm1hdF93YWl0KTsKIAlyZXR1cm47CiAKICAgZXJyX2VuZDoKQEAgLTE0OTcsOCArMTQ5OCw3IEBACiB2b2lkIGRvX2ZkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiBxKQogewogCURQUklOVCgoImRvX2ZkX3JlcXVlc3QgZm9yIHBpZCAlZFxuIixjdXJyZW50LT5waWQpKTsKLQl3aGlsZSggZmRjX2J1c3kgKSBzbGVlcF9vbiggJmZkY193YWl0ICk7Ci0JZmRjX2J1c3kgPSAxOworCXdhaXRfZXZlbnQoZmRjX3dhaXQsIGNtcHhjaGcoJmZkY19idXN5LCAwLCAxKSA9PSAwKTsKIAlzdGRtYV9sb2NrKGZsb3BweV9pcnEsIE5VTEwpOwogCiAJYXRhcmlfZGlzYWJsZV9pcnEoIElSUV9NRlBfRkRDICk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKaW5kZXggMDM2ZThhYi4uNzM4OTRjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5jCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwpAQCAtNDA5MiwxMSArNDA5Miw5IEBACiAJCWlmIChlcnIgPiAwKSB7CiAJCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LAogCQkJCSJvbmx5ICVkIE1TSS1YIHZlY3RvcnMgYXZhaWxhYmxlXG4iLCBlcnIpOwotCQkJZ290byBkZWZhdWx0X2ludF9tb2RlOwogCQl9IGVsc2UgewogCQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKIAkJCQkiTVNJLVggaW5pdCBmYWlsZWQgJWRcbiIsIGVycik7Ci0JCQlnb3RvIGRlZmF1bHRfaW50X21vZGU7CiAJCX0KIAl9CiAJaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkoaC0+cGRldiwgUENJX0NBUF9JRF9NU0kpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9hY3Rsb2cuYyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2FjdGxvZy5jCmluZGV4IGE5YjEzZjIuLjkwYWU0YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2FjdGxvZy5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2FjdGxvZy5jCkBAIC05NSwzNCArOTUsMzYgQEAKIAogc3RydWN0IHVwZGF0ZV9vZGJtX3dvcmsgewogCXN0cnVjdCBkcmJkX3dvcmsgdzsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAl1bnNpZ25lZCBpbnQgZW5yOwogfTsKIAogc3RydWN0IHVwZGF0ZV9hbF93b3JrIHsKIAlzdHJ1Y3QgZHJiZF93b3JrIHc7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IGNvbXBsZXRpb24gZXZlbnQ7CiAJaW50IGVycjsKIH07CiAKIAotdm9pZCAqZHJiZF9tZF9nZXRfYnVmZmVyKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkICpkcmJkX21kX2dldF9idWZmZXIoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHI7CiAKLQl3YWl0X2V2ZW50KG1kZXYtPm1pc2Nfd2FpdCwKLQkJICAgKHIgPSBhdG9taWNfY21weGNoZygmbWRldi0+bWRfaW9faW5fdXNlLCAwLCAxKSkgPT0gMCB8fAotCQkgICBtZGV2LT5zdGF0ZS5kaXNrIDw9IERfRkFJTEVEKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+bWlzY193YWl0LAorCQkgICAociA9IGF0b21pY19jbXB4Y2hnKCZkZXZpY2UtPm1kX2lvX2luX3VzZSwgMCwgMSkpID09IDAgfHwKKwkJICAgZGV2aWNlLT5zdGF0ZS5kaXNrIDw9IERfRkFJTEVEKTsKIAotCXJldHVybiByID8gTlVMTCA6IHBhZ2VfYWRkcmVzcyhtZGV2LT5tZF9pb19wYWdlKTsKKwlyZXR1cm4gciA/IE5VTEwgOiBwYWdlX2FkZHJlc3MoZGV2aWNlLT5tZF9pb19wYWdlKTsKIH0KIAotdm9pZCBkcmJkX21kX3B1dF9idWZmZXIoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgZHJiZF9tZF9wdXRfYnVmZmVyKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZtZGV2LT5tZF9pb19pbl91c2UpKQotCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXZpY2UtPm1kX2lvX2luX3VzZSkpCisJCXdha2VfdXAoJmRldmljZS0+bWlzY193YWl0KTsKIH0KIAotdm9pZCB3YWl0X3VudGlsX2RvbmVfb3JfZm9yY2VfZGV0YWNoZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsCit2b2lkIHdhaXRfdW50aWxfZG9uZV9vcl9mb3JjZV9kZXRhY2hlZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgKmRvbmUpCiB7CiAJbG9uZyBkdDsKQEAgLTEzNCwxNSArMTM2LDE1IEBACiAJaWYgKGR0ID09IDApCiAJCWR0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CiAKLQlkdCA9IHdhaXRfZXZlbnRfdGltZW91dChtZGV2LT5taXNjX3dhaXQsCi0JCQkqZG9uZSB8fCB0ZXN0X2JpdChGT1JDRV9ERVRBQ0gsICZtZGV2LT5mbGFncyksIGR0KTsKKwlkdCA9IHdhaXRfZXZlbnRfdGltZW91dChkZXZpY2UtPm1pc2Nfd2FpdCwKKwkJCSpkb25lIHx8IHRlc3RfYml0KEZPUkNFX0RFVEFDSCwgJmRldmljZS0+ZmxhZ3MpLCBkdCk7CiAJaWYgKGR0ID09IDApIHsKLQkJZGV2X2VycihERVYsICJtZXRhLWRhdGEgSU8gb3BlcmF0aW9uIHRpbWVkIG91dFxuIik7Ci0JCWRyYmRfY2hrX2lvX2Vycm9yKG1kZXYsIDEsIERSQkRfRk9SQ0VfREVUQUNIKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAibWV0YS1kYXRhIElPIG9wZXJhdGlvbiB0aW1lZCBvdXRcbiIpOworCQlkcmJkX2Noa19pb19lcnJvcihkZXZpY2UsIDEsIERSQkRfRk9SQ0VfREVUQUNIKTsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgX2RyYmRfbWRfc3luY19wYWdlX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgaW50IF9kcmJkX21kX3N5bmNfcGFnZV9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJCQkgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsCiAJCQkJIHN0cnVjdCBwYWdlICpwYWdlLCBzZWN0b3JfdCBzZWN0b3IsCiAJCQkJIGludCBydywgaW50IHNpemUpCkBAIC0xNTAsMTAgKzE1MiwxMCBAQAogCXN0cnVjdCBiaW8gKmJpbzsKIAlpbnQgZXJyOwogCi0JbWRldi0+bWRfaW8uZG9uZSA9IDA7Ci0JbWRldi0+bWRfaW8uZXJyb3IgPSAtRU5PREVWOworCWRldmljZS0+bWRfaW8uZG9uZSA9IDA7CisJZGV2aWNlLT5tZF9pby5lcnJvciA9IC1FTk9ERVY7CiAKLQlpZiAoKHJ3ICYgV1JJVEUpICYmICF0ZXN0X2JpdChNRF9OT19GVUEsICZtZGV2LT5mbGFncykpCisJaWYgKChydyAmIFdSSVRFKSAmJiAhdGVzdF9iaXQoTURfTk9fRlVBLCAmZGV2aWNlLT5mbGFncykpCiAJCXJ3IHw9IFJFUV9GVUEgfCBSRVFfRkxVU0g7CiAJcncgfD0gUkVRX1NZTkM7CiAKQEAgLTE2Myw2OSArMTY1LDY5IEBACiAJZXJyID0gLUVJTzsKIAlpZiAoYmlvX2FkZF9wYWdlKGJpbywgcGFnZSwgc2l6ZSwgMCkgIT0gc2l6ZSkKIAkJZ290byBvdXQ7Ci0JYmlvLT5iaV9wcml2YXRlID0gJm1kZXYtPm1kX2lvOworCWJpby0+YmlfcHJpdmF0ZSA9ICZkZXZpY2UtPm1kX2lvOwogCWJpby0+YmlfZW5kX2lvID0gZHJiZF9tZF9pb19jb21wbGV0ZTsKIAliaW8tPmJpX3J3ID0gcnc7CiAKLQlpZiAoIShydyAmIFdSSVRFKSAmJiBtZGV2LT5zdGF0ZS5kaXNrID09IERfRElTS0xFU1MgJiYgbWRldi0+bGRldiA9PSBOVUxMKQorCWlmICghKHJ3ICYgV1JJVEUpICYmIGRldmljZS0+c3RhdGUuZGlzayA9PSBEX0RJU0tMRVNTICYmIGRldmljZS0+bGRldiA9PSBOVUxMKQogCQkvKiBzcGVjaWFsIGNhc2UsIGRyYmRfbWRfcmVhZCgpIGR1cmluZyBkcmJkX2FkbV9hdHRhY2goKTogbm8gZ2V0X2xkZXYgKi8KIAkJOwotCWVsc2UgaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0FUVEFDSElORykpIHsKKwllbHNlIGlmICghZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0FUVEFDSElORykpIHsKIAkJLyogQ29ycmVzcG9uZGluZyBwdXRfbGRldiBpbiBkcmJkX21kX2lvX2NvbXBsZXRlKCkgKi8KLQkJZGV2X2VycihERVYsICJBU1NFUlQgRkFJTEVEOiBnZXRfbGRldl9pZl9zdGF0ZSgpID09IDEgaW4gX2RyYmRfbWRfc3luY19wYWdlX2lvKClcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJBU1NFUlQgRkFJTEVEOiBnZXRfbGRldl9pZl9zdGF0ZSgpID09IDEgaW4gX2RyYmRfbWRfc3luY19wYWdlX2lvKClcbiIpOwogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKIAl9CiAKIAliaW9fZ2V0KGJpbyk7IC8qIG9uZSBiaW9fcHV0KCkgaXMgaW4gdGhlIGNvbXBsZXRpb24gaGFuZGxlciAqLwotCWF0b21pY19pbmMoJm1kZXYtPm1kX2lvX2luX3VzZSk7IC8qIGRyYmRfbWRfcHV0X2J1ZmZlcigpIGlzIGluIHRoZSBjb21wbGV0aW9uIGhhbmRsZXIgKi8KLQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQobWRldiwgKHJ3ICYgV1JJVEUpID8gRFJCRF9GQVVMVF9NRF9XUiA6IERSQkRfRkFVTFRfTURfUkQpKQorCWF0b21pY19pbmMoJmRldmljZS0+bWRfaW9faW5fdXNlKTsgLyogZHJiZF9tZF9wdXRfYnVmZmVyKCkgaXMgaW4gdGhlIGNvbXBsZXRpb24gaGFuZGxlciAqLworCWlmIChkcmJkX2luc2VydF9mYXVsdChkZXZpY2UsIChydyAmIFdSSVRFKSA/IERSQkRfRkFVTFRfTURfV1IgOiBEUkJEX0ZBVUxUX01EX1JEKSkKIAkJYmlvX2VuZGlvKGJpbywgLUVJTyk7CiAJZWxzZQogCQlzdWJtaXRfYmlvKHJ3LCBiaW8pOwotCXdhaXRfdW50aWxfZG9uZV9vcl9mb3JjZV9kZXRhY2hlZChtZGV2LCBiZGV2LCAmbWRldi0+bWRfaW8uZG9uZSk7CisJd2FpdF91bnRpbF9kb25lX29yX2ZvcmNlX2RldGFjaGVkKGRldmljZSwgYmRldiwgJmRldmljZS0+bWRfaW8uZG9uZSk7CiAJaWYgKGJpb19mbGFnZ2VkKGJpbywgQklPX1VQVE9EQVRFKSkKLQkJZXJyID0gbWRldi0+bWRfaW8uZXJyb3I7CisJCWVyciA9IGRldmljZS0+bWRfaW8uZXJyb3I7CiAKICBvdXQ6CiAJYmlvX3B1dChiaW8pOwogCXJldHVybiBlcnI7CiB9CiAKLWludCBkcmJkX21kX3N5bmNfcGFnZV9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqYmRldiwKK2ludCBkcmJkX21kX3N5bmNfcGFnZV9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsCiAJCQkgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgcncpCiB7CiAJaW50IGVycjsKLQlzdHJ1Y3QgcGFnZSAqaW9wID0gbWRldi0+bWRfaW9fcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqaW9wID0gZGV2aWNlLT5tZF9pb19wYWdlOwogCi0JRF9BU1NFUlQoYXRvbWljX3JlYWQoJm1kZXYtPm1kX2lvX2luX3VzZSkgPT0gMSk7CisJRF9BU1NFUlQoZGV2aWNlLCBhdG9taWNfcmVhZCgmZGV2aWNlLT5tZF9pb19pbl91c2UpID09IDEpOwogCiAJQlVHX09OKCFiZGV2LT5tZF9iZGV2KTsKIAotCWRldl9kYmcoREVWLCAibWV0YV9kYXRhIGlvOiAlcyBbJWRdOiVzKCwlbGx1cywlcykgJXBTXG4iLAorCWRyYmRfZGJnKGRldmljZSwgIm1ldGFfZGF0YSBpbzogJXMgWyVkXTolcygsJWxsdXMsJXMpICVwU1xuIiwKIAkgICAgIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgX19mdW5jX18sCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNlY3RvciwgKHJ3ICYgV1JJVEUpID8gIldSSVRFIiA6ICJSRUFEIiwKIAkgICAgICh2b2lkKilfUkVUX0lQXyApOwogCiAJaWYgKHNlY3RvciA8IGRyYmRfbWRfZmlyc3Rfc2VjdG9yKGJkZXYpIHx8CiAJICAgIHNlY3RvciArIDcgPiBkcmJkX21kX2xhc3Rfc2VjdG9yKGJkZXYpKQotCQlkZXZfYWxlcnQoREVWLCAiJXMgWyVkXTolcygsJWxsdXMsJXMpIG91dCBvZiByYW5nZSBtZCBhY2Nlc3MhXG4iLAorCQlkcmJkX2FsZXJ0KGRldmljZSwgIiVzIFslZF06JXMoLCVsbHVzLCVzKSBvdXQgb2YgcmFuZ2UgbWQgYWNjZXNzIVxuIiwKIAkJICAgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIF9fZnVuY19fLAogCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLCAocncgJiBXUklURSkgPyAiV1JJVEUiIDogIlJFQUQiKTsKIAogCS8qIHdlIGRvIGFsbCBvdXIgbWV0YSBkYXRhIElPIGluIGFsaWduZWQgNGsgYmxvY2tzLiAqLwotCWVyciA9IF9kcmJkX21kX3N5bmNfcGFnZV9pbyhtZGV2LCBiZGV2LCBpb3AsIHNlY3RvciwgcncsIDQwOTYpOworCWVyciA9IF9kcmJkX21kX3N5bmNfcGFnZV9pbyhkZXZpY2UsIGJkZXYsIGlvcCwgc2VjdG9yLCBydywgNDA5Nik7CiAJaWYgKGVycikgewotCQlkZXZfZXJyKERFViwgImRyYmRfbWRfc3luY19wYWdlX2lvKCwlbGx1cywlcykgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfbWRfc3luY19wYWdlX2lvKCwlbGx1cywlcykgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsCiAJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXNlY3RvciwgKHJ3ICYgV1JJVEUpID8gIldSSVRFIiA6ICJSRUFEIiwgZXJyKTsKIAl9CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHN0cnVjdCBibV9leHRlbnQgKmZpbmRfYWN0aXZlX3Jlc3luY19leHRlbnQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgaW50IGVucikKK3N0YXRpYyBzdHJ1Y3QgYm1fZXh0ZW50ICpmaW5kX2FjdGl2ZV9yZXN5bmNfZXh0ZW50KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgZW5yKQogewogCXN0cnVjdCBsY19lbGVtZW50ICp0bXA7Ci0JdG1wID0gbGNfZmluZChtZGV2LT5yZXN5bmMsIGVuci9BTF9FWFRfUEVSX0JNX1NFQ1QpOworCXRtcCA9IGxjX2ZpbmQoZGV2aWNlLT5yZXN5bmMsIGVuci9BTF9FWFRfUEVSX0JNX1NFQ1QpOwogCWlmICh1bmxpa2VseSh0bXAgIT0gTlVMTCkpIHsKIAkJc3RydWN0IGJtX2V4dGVudCAgKmJtX2V4dCA9IGxjX2VudHJ5KHRtcCwgc3RydWN0IGJtX2V4dGVudCwgbGNlKTsKIAkJaWYgKHRlc3RfYml0KEJNRV9OT19XUklURVMsICZibV9leHQtPmZsYWdzKSkKQEAgLTIzNCw0NyArMjM2LDQ4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbGNfZWxlbWVudCAqX2FsX2dldChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBpbnQgZW5yLCBib29sIG5vbmJsb2NrKQorc3RhdGljIHN0cnVjdCBsY19lbGVtZW50ICpfYWxfZ2V0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgZW5yLCBib29sIG5vbmJsb2NrKQogewogCXN0cnVjdCBsY19lbGVtZW50ICphbF9leHQ7CiAJc3RydWN0IGJtX2V4dGVudCAqYm1fZXh0OwogCWludCB3YWtlOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7Ci0JYm1fZXh0ID0gZmluZF9hY3RpdmVfcmVzeW5jX2V4dGVudChtZGV2LCBlbnIpOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CisJYm1fZXh0ID0gZmluZF9hY3RpdmVfcmVzeW5jX2V4dGVudChkZXZpY2UsIGVucik7CiAJaWYgKGJtX2V4dCkgewogCQl3YWtlID0gIXRlc3RfYW5kX3NldF9iaXQoQk1FX1BSSU9SSVRZLCAmYm1fZXh0LT5mbGFncyk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAkJaWYgKHdha2UpCi0JCQl3YWtlX3VwKCZtZGV2LT5hbF93YWl0KTsKKwkJCXdha2VfdXAoJmRldmljZS0+YWxfd2FpdCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlpZiAobm9uYmxvY2spCi0JCWFsX2V4dCA9IGxjX3RyeV9nZXQobWRldi0+YWN0X2xvZywgZW5yKTsKKwkJYWxfZXh0ID0gbGNfdHJ5X2dldChkZXZpY2UtPmFjdF9sb2csIGVucik7CiAJZWxzZQotCQlhbF9leHQgPSBsY19nZXQobWRldi0+YWN0X2xvZywgZW5yKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCQlhbF9leHQgPSBsY19nZXQoZGV2aWNlLT5hY3RfbG9nLCBlbnIpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAlyZXR1cm4gYWxfZXh0OwogfQogCi1ib29sIGRyYmRfYWxfYmVnaW5faW9fZmFzdHBhdGgoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfaW50ZXJ2YWwgKmkpCitib29sIGRyYmRfYWxfYmVnaW5faW9fZmFzdHBhdGgoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX2ludGVydmFsICppKQogewogCS8qIGZvciBiaW9zIGNyb3NzaW5nIGFjdGl2aXR5IGxvZyBleHRlbnQgYm91bmRhcmllcywKIAkgKiB3ZSBtYXkgbmVlZCB0byBhY3RpdmF0ZSB0d28gZXh0ZW50cyBpbiBvbmUgZ28gKi8KIAl1bnNpZ25lZCBmaXJzdCA9IGktPnNlY3RvciA+PiAoQUxfRVhURU5UX1NISUZULTkpOwogCXVuc2lnbmVkIGxhc3QgPSBpLT5zaXplID09IDAgPyBmaXJzdCA6IChpLT5zZWN0b3IgKyAoaS0+c2l6ZSA+PiA5KSAtIDEpID4+IChBTF9FWFRFTlRfU0hJRlQtOSk7CiAKLQlEX0FTU0VSVCgodW5zaWduZWQpKGxhc3QgLSBmaXJzdCkgPD0gMSk7Ci0JRF9BU1NFUlQoYXRvbWljX3JlYWQoJm1kZXYtPmxvY2FsX2NudCkgPiAwKTsKKwlEX0FTU0VSVChkZXZpY2UsICh1bnNpZ25lZCkobGFzdCAtIGZpcnN0KSA8PSAxKTsKKwlEX0FTU0VSVChkZXZpY2UsIGF0b21pY19yZWFkKCZkZXZpY2UtPmxvY2FsX2NudCkgPiAwKTsKIAogCS8qIEZJWE1FIGZpZ3VyZSBvdXQgYSBmYXN0IHBhdGggZm9yIGJpb3MgY3Jvc3NpbmcgQUwgZXh0ZW50IGJvdW5kYXJpZXMgKi8KIAlpZiAoZmlyc3QgIT0gbGFzdCkKIAkJcmV0dXJuIGZhbHNlOwogCi0JcmV0dXJuIF9hbF9nZXQobWRldiwgZmlyc3QsIHRydWUpOworCXJldHVybiBfYWxfZ2V0KGRldmljZSwgZmlyc3QsIHRydWUpOwogfQogCi1ib29sIGRyYmRfYWxfYmVnaW5faW9fcHJlcGFyZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSkKK3N0YXRpYworYm9vbCBkcmJkX2FsX2JlZ2luX2lvX3ByZXBhcmUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX2ludGVydmFsICppKQogewogCS8qIGZvciBiaW9zIGNyb3NzaW5nIGFjdGl2aXR5IGxvZyBleHRlbnQgYm91bmRhcmllcywKIAkgKiB3ZSBtYXkgbmVlZCB0byBhY3RpdmF0ZSB0d28gZXh0ZW50cyBpbiBvbmUgZ28gKi8KQEAgLTI4MywyMCArMjg2LDIwIEBACiAJdW5zaWduZWQgZW5yOwogCWJvb2wgbmVlZF90cmFuc2FjdGlvbiA9IGZhbHNlOwogCi0JRF9BU1NFUlQoZmlyc3QgPD0gbGFzdCk7Ci0JRF9BU1NFUlQoYXRvbWljX3JlYWQoJm1kZXYtPmxvY2FsX2NudCkgPiAwKTsKKwlEX0FTU0VSVChkZXZpY2UsIGZpcnN0IDw9IGxhc3QpOworCURfQVNTRVJUKGRldmljZSwgYXRvbWljX3JlYWQoJmRldmljZS0+bG9jYWxfY250KSA+IDApOwogCiAJZm9yIChlbnIgPSBmaXJzdDsgZW5yIDw9IGxhc3Q7IGVucisrKSB7CiAJCXN0cnVjdCBsY19lbGVtZW50ICphbF9leHQ7Ci0JCXdhaXRfZXZlbnQobWRldi0+YWxfd2FpdCwKLQkJCQkoYWxfZXh0ID0gX2FsX2dldChtZGV2LCBlbnIsIGZhbHNlKSkgIT0gTlVMTCk7CisJCXdhaXRfZXZlbnQoZGV2aWNlLT5hbF93YWl0LAorCQkJCShhbF9leHQgPSBfYWxfZ2V0KGRldmljZSwgZW5yLCBmYWxzZSkpICE9IE5VTEwpOwogCQlpZiAoYWxfZXh0LT5sY19udW1iZXIgIT0gZW5yKQogCQkJbmVlZF90cmFuc2FjdGlvbiA9IHRydWU7CiAJfQogCXJldHVybiBuZWVkX3RyYW5zYWN0aW9uOwogfQogCi1zdGF0aWMgaW50IGFsX3dyaXRlX3RyYW5zYWN0aW9uKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGJvb2wgZGVsZWdhdGUpOworc3RhdGljIGludCBhbF93cml0ZV90cmFuc2FjdGlvbihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgYm9vbCBkZWxlZ2F0ZSk7CiAKIC8qIFdoZW4gY2FsbGVkIHRocm91Z2ggZ2VuZXJpY19tYWtlX3JlcXVlc3QoKSwgd2UgbXVzdCBkZWxlZ2F0ZQogICogYWN0aXZpdHkgbG9nIEkvTyB0byB0aGUgd29ya2VyIHRocmVhZDogYSBmdXJ0aGVyIHJlcXVlc3QKQEAgLTMxMCw1OCArMzEzLDU4IEBACiAvKgogICogQGRlbGVnYXRlOiAgIGRlbGVnYXRlIGFjdGl2aXR5IGxvZyBJL08gdG8gdGhlIHdvcmtlciB0aHJlYWQKICAqLwotdm9pZCBkcmJkX2FsX2JlZ2luX2lvX2NvbW1pdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBib29sIGRlbGVnYXRlKQordm9pZCBkcmJkX2FsX2JlZ2luX2lvX2NvbW1pdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgYm9vbCBkZWxlZ2F0ZSkKIHsKIAlib29sIGxvY2tlZCA9IGZhbHNlOwogCi0JQlVHX09OKGRlbGVnYXRlICYmIGN1cnJlbnQgPT0gbWRldi0+dGNvbm4tPndvcmtlci50YXNrKTsKKwlCVUdfT04oZGVsZWdhdGUgJiYgY3VycmVudCA9PSBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT53b3JrZXIudGFzayk7CiAKIAkvKiBTZXJpYWxpemUgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLgogCSAqIFRoaXMgdXNlcyB0ZXN0X2FuZF9zZXRfYml0LCBtZW1vcnkgYmFycmllciBpcyBpbXBsaWNpdC4KIAkgKi8KLQl3YWl0X2V2ZW50KG1kZXYtPmFsX3dhaXQsCi0JCQltZGV2LT5hY3RfbG9nLT5wZW5kaW5nX2NoYW5nZXMgPT0gMCB8fAotCQkJKGxvY2tlZCA9IGxjX3RyeV9sb2NrX2Zvcl90cmFuc2FjdGlvbihtZGV2LT5hY3RfbG9nKSkpOworCXdhaXRfZXZlbnQoZGV2aWNlLT5hbF93YWl0LAorCQkJZGV2aWNlLT5hY3RfbG9nLT5wZW5kaW5nX2NoYW5nZXMgPT0gMCB8fAorCQkJKGxvY2tlZCA9IGxjX3RyeV9sb2NrX2Zvcl90cmFuc2FjdGlvbihkZXZpY2UtPmFjdF9sb2cpKSk7CiAKIAlpZiAobG9ja2VkKSB7CiAJCS8qIERvdWJsZSBjaGVjazogaXQgbWF5IGhhdmUgYmVlbiBjb21taXR0ZWQgYnkgc29tZW9uZSBlbHNlLAogCQkgKiB3aGlsZSB3ZSBoYXZlIGJlZW4gd2FpdGluZyBmb3IgdGhlIGxvY2suICovCi0JCWlmIChtZGV2LT5hY3RfbG9nLT5wZW5kaW5nX2NoYW5nZXMpIHsKKwkJaWYgKGRldmljZS0+YWN0X2xvZy0+cGVuZGluZ19jaGFuZ2VzKSB7CiAJCQlib29sIHdyaXRlX2FsX3VwZGF0ZXM7CiAKIAkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCXdyaXRlX2FsX3VwZGF0ZXMgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKS0+YWxfdXBkYXRlczsKKwkJCXdyaXRlX2FsX3VwZGF0ZXMgPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5hbF91cGRhdGVzOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkJCWlmICh3cml0ZV9hbF91cGRhdGVzKQotCQkJCWFsX3dyaXRlX3RyYW5zYWN0aW9uKG1kZXYsIGRlbGVnYXRlKTsKLQkJCXNwaW5fbG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCQkJCWFsX3dyaXRlX3RyYW5zYWN0aW9uKGRldmljZSwgZGVsZWdhdGUpOworCQkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAkJCS8qIEZJWE1FCiAJCQlpZiAoZXJyKQogCQkJCXdlIG5lZWQgYW4gImxjX2NhbmNlbCIgaGVyZTsKIAkJCSovCi0JCQlsY19jb21taXR0ZWQobWRldi0+YWN0X2xvZyk7Ci0JCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCQkJbGNfY29tbWl0dGVkKGRldmljZS0+YWN0X2xvZyk7CisJCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAJCX0KLQkJbGNfdW5sb2NrKG1kZXYtPmFjdF9sb2cpOwotCQl3YWtlX3VwKCZtZGV2LT5hbF93YWl0KTsKKwkJbGNfdW5sb2NrKGRldmljZS0+YWN0X2xvZyk7CisJCXdha2VfdXAoJmRldmljZS0+YWxfd2FpdCk7CiAJfQogfQogCiAvKgogICogQGRlbGVnYXRlOiAgIGRlbGVnYXRlIGFjdGl2aXR5IGxvZyBJL08gdG8gdGhlIHdvcmtlciB0aHJlYWQKICAqLwotdm9pZCBkcmJkX2FsX2JlZ2luX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBkcmJkX2ludGVydmFsICppLCBib29sIGRlbGVnYXRlKQordm9pZCBkcmJkX2FsX2JlZ2luX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSwgYm9vbCBkZWxlZ2F0ZSkKIHsKLQlCVUdfT04oZGVsZWdhdGUgJiYgY3VycmVudCA9PSBtZGV2LT50Y29ubi0+d29ya2VyLnRhc2spOworCUJVR19PTihkZWxlZ2F0ZSAmJiBjdXJyZW50ID09IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPndvcmtlci50YXNrKTsKIAotCWlmIChkcmJkX2FsX2JlZ2luX2lvX3ByZXBhcmUobWRldiwgaSkpCi0JCWRyYmRfYWxfYmVnaW5faW9fY29tbWl0KG1kZXYsIGRlbGVnYXRlKTsKKwlpZiAoZHJiZF9hbF9iZWdpbl9pb19wcmVwYXJlKGRldmljZSwgaSkpCisJCWRyYmRfYWxfYmVnaW5faW9fY29tbWl0KGRldmljZSwgZGVsZWdhdGUpOwogfQogCi1pbnQgZHJiZF9hbF9iZWdpbl9pb19ub25ibG9jayhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSkKK2ludCBkcmJkX2FsX2JlZ2luX2lvX25vbmJsb2NrKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSkKIHsKLQlzdHJ1Y3QgbHJ1X2NhY2hlICphbCA9IG1kZXYtPmFjdF9sb2c7CisJc3RydWN0IGxydV9jYWNoZSAqYWwgPSBkZXZpY2UtPmFjdF9sb2c7CiAJLyogZm9yIGJpb3MgY3Jvc3NpbmcgYWN0aXZpdHkgbG9nIGV4dGVudCBib3VuZGFyaWVzLAogCSAqIHdlIG1heSBuZWVkIHRvIGFjdGl2YXRlIHR3byBleHRlbnRzIGluIG9uZSBnbyAqLwogCXVuc2lnbmVkIGZpcnN0ID0gaS0+c2VjdG9yID4+IChBTF9FWFRFTlRfU0hJRlQtOSk7CkBAIC0zNzAsNyArMzczLDcgQEAKIAl1bnNpZ25lZCBhdmFpbGFibGVfdXBkYXRlX3Nsb3RzOwogCXVuc2lnbmVkIGVucjsKIAotCURfQVNTRVJUKGZpcnN0IDw9IGxhc3QpOworCURfQVNTRVJUKGRldmljZSwgZmlyc3QgPD0gbGFzdCk7CiAKIAlucl9hbF9leHRlbnRzID0gMSArIGxhc3QgLSBmaXJzdDsgLyogd29yc3QgY2FzZTogYWxsIHRvdWNoZWQgZXh0ZW5kcyBhcmUgY29sZC4gKi8KIAlhdmFpbGFibGVfdXBkYXRlX3Nsb3RzID0gbWluKGFsLT5ucl9lbGVtZW50cyAtIGFsLT51c2VkLApAQCAtMzg1LDcgKzM4OCw3IEBACiAJLyogSXMgcmVzeW5jIGFjdGl2ZSBpbiB0aGlzIGFyZWE/ICovCiAJZm9yIChlbnIgPSBmaXJzdDsgZW5yIDw9IGxhc3Q7IGVucisrKSB7CiAJCXN0cnVjdCBsY19lbGVtZW50ICp0bXA7Ci0JCXRtcCA9IGxjX2ZpbmQobWRldi0+cmVzeW5jLCBlbnIvQUxfRVhUX1BFUl9CTV9TRUNUKTsKKwkJdG1wID0gbGNfZmluZChkZXZpY2UtPnJlc3luYywgZW5yL0FMX0VYVF9QRVJfQk1fU0VDVCk7CiAJCWlmICh1bmxpa2VseSh0bXAgIT0gTlVMTCkpIHsKIAkJCXN0cnVjdCBibV9leHRlbnQgICpibV9leHQgPSBsY19lbnRyeSh0bXAsIHN0cnVjdCBibV9leHRlbnQsIGxjZSk7CiAJCQlpZiAodGVzdF9iaXQoQk1FX05PX1dSSVRFUywgJmJtX2V4dC0+ZmxhZ3MpKSB7CkBAIC00MDEsMTQgKzQwNCwxNCBAQAogCSAqIHRoaXMgaGFzIHRvIGJlIHN1Y2Nlc3NmdWwuICovCiAJZm9yIChlbnIgPSBmaXJzdDsgZW5yIDw9IGxhc3Q7IGVucisrKSB7CiAJCXN0cnVjdCBsY19lbGVtZW50ICphbF9leHQ7Ci0JCWFsX2V4dCA9IGxjX2dldF9jdW11bGF0aXZlKG1kZXYtPmFjdF9sb2csIGVucik7CisJCWFsX2V4dCA9IGxjX2dldF9jdW11bGF0aXZlKGRldmljZS0+YWN0X2xvZywgZW5yKTsKIAkJaWYgKCFhbF9leHQpCi0JCQlkZXZfaW5mbyhERVYsICJMT0dJQyBCVUcgZm9yIGVucj0ldVxuIiwgZW5yKTsKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJMT0dJQyBCVUcgZm9yIGVucj0ldVxuIiwgZW5yKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgZHJiZF9hbF9jb21wbGV0ZV9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSkKK3ZvaWQgZHJiZF9hbF9jb21wbGV0ZV9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGRyYmRfaW50ZXJ2YWwgKmkpCiB7CiAJLyogZm9yIGJpb3MgY3Jvc3NpbmcgYWN0aXZpdHkgbG9nIGV4dGVudCBib3VuZGFyaWVzLAogCSAqIHdlIG1heSBuZWVkIHRvIGFjdGl2YXRlIHR3byBleHRlbnRzIGluIG9uZSBnbyAqLwpAQCAtNDE4LDE5ICs0MjEsMTkgQEAKIAlzdHJ1Y3QgbGNfZWxlbWVudCAqZXh0ZW50OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlEX0FTU0VSVChmaXJzdCA8PSBsYXN0KTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+YWxfbG9jaywgZmxhZ3MpOworCURfQVNTRVJUKGRldmljZSwgZmlyc3QgPD0gbGFzdCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+YWxfbG9jaywgZmxhZ3MpOwogCiAJZm9yIChlbnIgPSBmaXJzdDsgZW5yIDw9IGxhc3Q7IGVucisrKSB7Ci0JCWV4dGVudCA9IGxjX2ZpbmQobWRldi0+YWN0X2xvZywgZW5yKTsKKwkJZXh0ZW50ID0gbGNfZmluZChkZXZpY2UtPmFjdF9sb2csIGVucik7CiAJCWlmICghZXh0ZW50KSB7Ci0JCQlkZXZfZXJyKERFViwgImFsX2NvbXBsZXRlX2lvKCkgY2FsbGVkIG9uIGluYWN0aXZlIGV4dGVudCAldVxuIiwgZW5yKTsKKwkJCWRyYmRfZXJyKGRldmljZSwgImFsX2NvbXBsZXRlX2lvKCkgY2FsbGVkIG9uIGluYWN0aXZlIGV4dGVudCAldVxuIiwgZW5yKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWxjX3B1dChtZGV2LT5hY3RfbG9nLCBleHRlbnQpOworCQlsY19wdXQoZGV2aWNlLT5hY3RfbG9nLCBleHRlbnQpOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT5hbF9sb2NrLCBmbGFncyk7Ci0Jd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5hbF9sb2NrLCBmbGFncyk7CisJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKIH0KIAogI2lmIChQQUdFX1NISUZUICsgMykgPCAoQUxfRVhURU5UX1NISUZUIC0gQk1fQkxPQ0tfU0hJRlQpCkBAIC00NjAsMTMgKzQ2MywxMyBAQAogCQkgKEJNX0VYVF9TSElGVCAtIEJNX0JMT0NLX1NISUZUKSk7CiB9CiAKLXN0YXRpYyBzZWN0b3JfdCBhbF90cl9udW1iZXJfdG9fb25fZGlza19zZWN0b3Ioc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBzZWN0b3JfdCBhbF90cl9udW1iZXJfdG9fb25fZGlza19zZWN0b3Ioc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JY29uc3QgdW5zaWduZWQgaW50IHN0cmlwZXMgPSBtZGV2LT5sZGV2LT5tZC5hbF9zdHJpcGVzOwotCWNvbnN0IHVuc2lnbmVkIGludCBzdHJpcGVfc2l6ZV80a0IgPSBtZGV2LT5sZGV2LT5tZC5hbF9zdHJpcGVfc2l6ZV80azsKKwljb25zdCB1bnNpZ25lZCBpbnQgc3RyaXBlcyA9IGRldmljZS0+bGRldi0+bWQuYWxfc3RyaXBlczsKKwljb25zdCB1bnNpZ25lZCBpbnQgc3RyaXBlX3NpemVfNGtCID0gZGV2aWNlLT5sZGV2LT5tZC5hbF9zdHJpcGVfc2l6ZV80azsKIAogCS8qIHRyYW5zYWN0aW9uIG51bWJlciwgbW9kdWxvIG9uLWRpc2sgcmluZyBidWZmZXIgd3JhcCBhcm91bmQgKi8KLQl1bnNpZ25lZCBpbnQgdCA9IG1kZXYtPmFsX3RyX251bWJlciAlIChtZGV2LT5sZGV2LT5tZC5hbF9zaXplXzRrKTsKKwl1bnNpZ25lZCBpbnQgdCA9IGRldmljZS0+YWxfdHJfbnVtYmVyICUgKGRldmljZS0+bGRldi0+bWQuYWxfc2l6ZV80ayk7CiAKIAkvKiAuLi4gdG8gYWxpZ25lZCA0ayBvbiBkaXNrIGJsb2NrICovCiAJdCA9ICgodCAlIHN0cmlwZXMpICogc3RyaXBlX3NpemVfNGtCKSArIHQvc3RyaXBlczsKQEAgLTQ3NSwxMSArNDc4LDExIEBACiAJdCAqPSA4OwogCiAJLyogLi4uIHBsdXMgb2Zmc2V0IHRvIHRoZSBvbiBkaXNrIHBvc2l0aW9uICovCi0JcmV0dXJuIG1kZXYtPmxkZXYtPm1kLm1kX29mZnNldCArIG1kZXYtPmxkZXYtPm1kLmFsX29mZnNldCArIHQ7CisJcmV0dXJuIGRldmljZS0+bGRldi0+bWQubWRfb2Zmc2V0ICsgZGV2aWNlLT5sZGV2LT5tZC5hbF9vZmZzZXQgKyB0OwogfQogCiBzdGF0aWMgaW50Ci1fYWxfd3JpdGVfdHJhbnNhY3Rpb24oc3RydWN0IGRyYmRfY29uZiAqbWRldikKK19hbF93cml0ZV90cmFuc2FjdGlvbihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgYWxfdHJhbnNhY3Rpb25fb25fZGlzayAqYnVmZmVyOwogCXN0cnVjdCBsY19lbGVtZW50ICplOwpAQCAtNDg5LDMxICs0OTIsMzEgQEAKIAl1bnNpZ25lZCBjcmMgPSAwOwogCWludCBlcnIgPSAwOwogCi0JaWYgKCFnZXRfbGRldihtZGV2KSkgewotCQlkZXZfZXJyKERFViwgImRpc2sgaXMgJXMsIGNhbm5vdCBzdGFydCBhbCB0cmFuc2FjdGlvblxuIiwKLQkJCWRyYmRfZGlza19zdHIobWRldi0+c3RhdGUuZGlzaykpOworCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlkcmJkX2VycihkZXZpY2UsICJkaXNrIGlzICVzLCBjYW5ub3Qgc3RhcnQgYWwgdHJhbnNhY3Rpb25cbiIsCisJCQlkcmJkX2Rpc2tfc3RyKGRldmljZS0+c3RhdGUuZGlzaykpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAkvKiBUaGUgYml0bWFwIHdyaXRlIG1heSBoYXZlIGZhaWxlZCwgY2F1c2luZyBhIHN0YXRlIGNoYW5nZS4gKi8KLQlpZiAobWRldi0+c3RhdGUuZGlzayA8IERfSU5DT05TSVNURU5UKSB7Ci0JCWRldl9lcnIoREVWLAorCWlmIChkZXZpY2UtPnN0YXRlLmRpc2sgPCBEX0lOQ09OU0lTVEVOVCkgeworCQlkcmJkX2VycihkZXZpY2UsCiAJCQkiZGlzayBpcyAlcywgY2Fubm90IHdyaXRlIGFsIHRyYW5zYWN0aW9uXG4iLAotCQkJZHJiZF9kaXNrX3N0cihtZGV2LT5zdGF0ZS5kaXNrKSk7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQkJZHJiZF9kaXNrX3N0cihkZXZpY2UtPnN0YXRlLmRpc2spKTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JYnVmZmVyID0gZHJiZF9tZF9nZXRfYnVmZmVyKG1kZXYpOyAvKiBwcm90ZWN0cyBtZF9pb19idWZmZXIsIGFsX3RyX2N5Y2xlLCAuLi4gKi8KKwlidWZmZXIgPSBkcmJkX21kX2dldF9idWZmZXIoZGV2aWNlKTsgLyogcHJvdGVjdHMgbWRfaW9fYnVmZmVyLCBhbF90cl9jeWNsZSwgLi4uICovCiAJaWYgKCFidWZmZXIpIHsKLQkJZGV2X2VycihERVYsICJkaXNrIGZhaWxlZCB3aGlsZSB3YWl0aW5nIGZvciBtZF9pbyBidWZmZXJcbiIpOwotCQlwdXRfbGRldihtZGV2KTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiZGlzayBmYWlsZWQgd2hpbGUgd2FpdGluZyBmb3IgbWRfaW8gYnVmZmVyXG4iKTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKCpidWZmZXIpKTsKIAlidWZmZXItPm1hZ2ljID0gY3B1X3RvX2JlMzIoRFJCRF9BTF9NQUdJQyk7Ci0JYnVmZmVyLT50cl9udW1iZXIgPSBjcHVfdG9fYmUzMihtZGV2LT5hbF90cl9udW1iZXIpOworCWJ1ZmZlci0+dHJfbnVtYmVyID0gY3B1X3RvX2JlMzIoZGV2aWNlLT5hbF90cl9udW1iZXIpOwogCiAJaSA9IDA7CiAKQEAgLTUyMSw4ICs1MjQsOCBAQAogCSAqIG9uY2Ugd2Ugc2V0IHRoZSBMQ19MT0NLRUQgLS0gZnJvbSBkcmJkX2FsX2JlZ2luX2lvKCksCiAJICogbGNfdHJ5X2xvY2tfZm9yX3RyYW5zYWN0aW9uKCkgLS0sIHNvbWVvbmUgbWF5IHN0aWxsCiAJICogYmUgaW4gdGhlIHByb2Nlc3Mgb2YgY2hhbmdpbmcgaXQuICovCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShlLCAmbWRldi0+YWN0X2xvZy0+dG9fYmVfY2hhbmdlZCwgbGlzdCkgeworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlLCAmZGV2aWNlLT5hY3RfbG9nLT50b19iZV9jaGFuZ2VkLCBsaXN0KSB7CiAJCWlmIChpID09IEFMX1VQREFURVNfUEVSX1RSQU5TQUNUSU9OKSB7CiAJCQlpKys7CiAJCQlicmVhazsKQEAgLTUzMCwxMSArNTMzLDExIEBACiAJCWJ1ZmZlci0+dXBkYXRlX3Nsb3RfbnJbaV0gPSBjcHVfdG9fYmUxNihlLT5sY19pbmRleCk7CiAJCWJ1ZmZlci0+dXBkYXRlX2V4dGVudF9ucltpXSA9IGNwdV90b19iZTMyKGUtPmxjX25ld19udW1iZXIpOwogCQlpZiAoZS0+bGNfbnVtYmVyICE9IExDX0ZSRUUpCi0JCQlkcmJkX2JtX21hcmtfZm9yX3dyaXRlb3V0KG1kZXYsCisJCQlkcmJkX2JtX21hcmtfZm9yX3dyaXRlb3V0KGRldmljZSwKIAkJCQkJYWxfZXh0ZW50X3RvX2JtX3BhZ2UoZS0+bGNfbnVtYmVyKSk7CiAJCWkrKzsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5hbF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAJQlVHX09OKGkgPiBBTF9VUERBVEVTX1BFUl9UUkFOU0FDVElPTik7CiAKIAlidWZmZXItPm5fdXBkYXRlcyA9IGNwdV90b19iZTE2KGkpOwpAQCAtNTQzLDQ4ICs1NDYsNDggQEAKIAkJYnVmZmVyLT51cGRhdGVfZXh0ZW50X25yW2ldID0gY3B1X3RvX2JlMzIoTENfRlJFRSk7CiAJfQogCi0JYnVmZmVyLT5jb250ZXh0X3NpemUgPSBjcHVfdG9fYmUxNihtZGV2LT5hY3RfbG9nLT5ucl9lbGVtZW50cyk7Ci0JYnVmZmVyLT5jb250ZXh0X3N0YXJ0X3Nsb3RfbnIgPSBjcHVfdG9fYmUxNihtZGV2LT5hbF90cl9jeWNsZSk7CisJYnVmZmVyLT5jb250ZXh0X3NpemUgPSBjcHVfdG9fYmUxNihkZXZpY2UtPmFjdF9sb2ctPm5yX2VsZW1lbnRzKTsKKwlidWZmZXItPmNvbnRleHRfc3RhcnRfc2xvdF9uciA9IGNwdV90b19iZTE2KGRldmljZS0+YWxfdHJfY3ljbGUpOwogCiAJbXggPSBtaW5fdChpbnQsIEFMX0NPTlRFWFRfUEVSX1RSQU5TQUNUSU9OLAotCQkgICBtZGV2LT5hY3RfbG9nLT5ucl9lbGVtZW50cyAtIG1kZXYtPmFsX3RyX2N5Y2xlKTsKKwkJICAgZGV2aWNlLT5hY3RfbG9nLT5ucl9lbGVtZW50cyAtIGRldmljZS0+YWxfdHJfY3ljbGUpOwogCWZvciAoaSA9IDA7IGkgPCBteDsgaSsrKSB7Ci0JCXVuc2lnbmVkIGlkeCA9IG1kZXYtPmFsX3RyX2N5Y2xlICsgaTsKLQkJZXh0ZW50X25yID0gbGNfZWxlbWVudF9ieV9pbmRleChtZGV2LT5hY3RfbG9nLCBpZHgpLT5sY19udW1iZXI7CisJCXVuc2lnbmVkIGlkeCA9IGRldmljZS0+YWxfdHJfY3ljbGUgKyBpOworCQlleHRlbnRfbnIgPSBsY19lbGVtZW50X2J5X2luZGV4KGRldmljZS0+YWN0X2xvZywgaWR4KS0+bGNfbnVtYmVyOwogCQlidWZmZXItPmNvbnRleHRbaV0gPSBjcHVfdG9fYmUzMihleHRlbnRfbnIpOwogCX0KIAlmb3IgKDsgaSA8IEFMX0NPTlRFWFRfUEVSX1RSQU5TQUNUSU9OOyBpKyspCiAJCWJ1ZmZlci0+Y29udGV4dFtpXSA9IGNwdV90b19iZTMyKExDX0ZSRUUpOwogCi0JbWRldi0+YWxfdHJfY3ljbGUgKz0gQUxfQ09OVEVYVF9QRVJfVFJBTlNBQ1RJT047Ci0JaWYgKG1kZXYtPmFsX3RyX2N5Y2xlID49IG1kZXYtPmFjdF9sb2ctPm5yX2VsZW1lbnRzKQotCQltZGV2LT5hbF90cl9jeWNsZSA9IDA7CisJZGV2aWNlLT5hbF90cl9jeWNsZSArPSBBTF9DT05URVhUX1BFUl9UUkFOU0FDVElPTjsKKwlpZiAoZGV2aWNlLT5hbF90cl9jeWNsZSA+PSBkZXZpY2UtPmFjdF9sb2ctPm5yX2VsZW1lbnRzKQorCQlkZXZpY2UtPmFsX3RyX2N5Y2xlID0gMDsKIAotCXNlY3RvciA9IGFsX3RyX251bWJlcl90b19vbl9kaXNrX3NlY3RvcihtZGV2KTsKKwlzZWN0b3IgPSBhbF90cl9udW1iZXJfdG9fb25fZGlza19zZWN0b3IoZGV2aWNlKTsKIAogCWNyYyA9IGNyYzMyYygwLCBidWZmZXIsIDQwOTYpOwogCWJ1ZmZlci0+Y3JjMzJjID0gY3B1X3RvX2JlMzIoY3JjKTsKIAotCWlmIChkcmJkX2JtX3dyaXRlX2hpbnRlZChtZGV2KSkKKwlpZiAoZHJiZF9ibV93cml0ZV9oaW50ZWQoZGV2aWNlKSkKIAkJZXJyID0gLUVJTzsKIAllbHNlIHsKIAkJYm9vbCB3cml0ZV9hbF91cGRhdGVzOwogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXdyaXRlX2FsX3VwZGF0ZXMgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKS0+YWxfdXBkYXRlczsKKwkJd3JpdGVfYWxfdXBkYXRlcyA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPmFsX3VwZGF0ZXM7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQlpZiAod3JpdGVfYWxfdXBkYXRlcykgewotCQkJaWYgKGRyYmRfbWRfc3luY19wYWdlX2lvKG1kZXYsIG1kZXYtPmxkZXYsIHNlY3RvciwgV1JJVEUpKSB7CisJCQlpZiAoZHJiZF9tZF9zeW5jX3BhZ2VfaW8oZGV2aWNlLCBkZXZpY2UtPmxkZXYsIHNlY3RvciwgV1JJVEUpKSB7CiAJCQkJZXJyID0gLUVJTzsKLQkJCQlkcmJkX2Noa19pb19lcnJvcihtZGV2LCAxLCBEUkJEX01FVEFfSU9fRVJST1IpOworCQkJCWRyYmRfY2hrX2lvX2Vycm9yKGRldmljZSwgMSwgRFJCRF9NRVRBX0lPX0VSUk9SKTsKIAkJCX0gZWxzZSB7Ci0JCQkJbWRldi0+YWxfdHJfbnVtYmVyKys7Ci0JCQkJbWRldi0+YWxfd3JpdF9jbnQrKzsKKwkJCQlkZXZpY2UtPmFsX3RyX251bWJlcisrOworCQkJCWRldmljZS0+YWxfd3JpdF9jbnQrKzsKIAkJCX0KIAkJfQogCX0KIAotCWRyYmRfbWRfcHV0X2J1ZmZlcihtZGV2KTsKLQlwdXRfbGRldihtZGV2KTsKKwlkcmJkX21kX3B1dF9idWZmZXIoZGV2aWNlKTsKKwlwdXRfbGRldihkZXZpY2UpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTU5MywxMCArNTk2LDEwIEBACiBzdGF0aWMgaW50IHdfYWxfd3JpdGVfdHJhbnNhY3Rpb24oc3RydWN0IGRyYmRfd29yayAqdywgaW50IHVudXNlZCkKIHsKIAlzdHJ1Y3QgdXBkYXRlX2FsX3dvcmsgKmF3ID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCB1cGRhdGVfYWxfd29yaywgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBhdy0+ZGV2aWNlOwogCWludCBlcnI7CiAKLQllcnIgPSBfYWxfd3JpdGVfdHJhbnNhY3Rpb24obWRldik7CisJZXJyID0gX2FsX3dyaXRlX3RyYW5zYWN0aW9uKGRldmljZSk7CiAJYXctPmVyciA9IGVycjsKIAljb21wbGV0ZSgmYXctPmV2ZW50KTsKIApAQCAtNjA2LDYzICs2MDksNjQgQEAKIC8qIENhbGxzIGZyb20gd29ya2VyIGNvbnRleHQgKHNlZSB3X3Jlc3RhcnRfZGlza19pbygpKSBuZWVkIHRvIHdyaXRlIHRoZQogICAgdHJhbnNhY3Rpb24gZGlyZWN0bHkuIE90aGVycyBjYW1lIHRocm91Z2ggZ2VuZXJpY19tYWtlX3JlcXVlc3QoKSwKICAgIHRob3NlIG5lZWQgdG8gZGVsZWdhdGUgaXQgdG8gdGhlIHdvcmtlci4gKi8KLXN0YXRpYyBpbnQgYWxfd3JpdGVfdHJhbnNhY3Rpb24oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgYm9vbCBkZWxlZ2F0ZSkKK3N0YXRpYyBpbnQgYWxfd3JpdGVfdHJhbnNhY3Rpb24oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGJvb2wgZGVsZWdhdGUpCiB7CiAJaWYgKGRlbGVnYXRlKSB7CiAJCXN0cnVjdCB1cGRhdGVfYWxfd29yayBhbF93b3JrOwogCQlpbml0X2NvbXBsZXRpb24oJmFsX3dvcmsuZXZlbnQpOwogCQlhbF93b3JrLncuY2IgPSB3X2FsX3dyaXRlX3RyYW5zYWN0aW9uOwotCQlhbF93b3JrLncubWRldiA9IG1kZXY7Ci0JCWRyYmRfcXVldWVfd29ya19mcm9udCgmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmYWxfd29yay53KTsKKwkJYWxfd29yay5kZXZpY2UgPSBkZXZpY2U7CisJCWRyYmRfcXVldWVfd29ya19mcm9udCgmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkJICAgICAgJmFsX3dvcmsudyk7CiAJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFsX3dvcmsuZXZlbnQpOwogCQlyZXR1cm4gYWxfd29yay5lcnI7CiAJfSBlbHNlCi0JCXJldHVybiBfYWxfd3JpdGVfdHJhbnNhY3Rpb24obWRldik7CisJCXJldHVybiBfYWxfd3JpdGVfdHJhbnNhY3Rpb24oZGV2aWNlKTsKIH0KIAotc3RhdGljIGludCBfdHJ5X2xjX2RlbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgbGNfZWxlbWVudCAqYWxfZXh0KQorc3RhdGljIGludCBfdHJ5X2xjX2RlbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGxjX2VsZW1lbnQgKmFsX2V4dCkKIHsKIAlpbnQgcnY7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT5hbF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPmFsX2xvY2spOwogCXJ2ID0gKGFsX2V4dC0+cmVmY250ID09IDApOwogCWlmIChsaWtlbHkocnYpKQotCQlsY19kZWwobWRldi0+YWN0X2xvZywgYWxfZXh0KTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCQlsY19kZWwoZGV2aWNlLT5hY3RfbG9nLCBhbF9leHQpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAogCXJldHVybiBydjsKIH0KIAogLyoqCiAgKiBkcmJkX2FsX3NocmluaygpIC0gUmVtb3ZlcyBhbGwgYWN0aXZlIGV4dGVudHMgZm9ybSB0aGUgYWN0aXZpdHkgbG9nCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBSZW1vdmVzIGFsbCBhY3RpdmUgZXh0ZW50cyBmb3JtIHRoZSBhY3Rpdml0eSBsb2csIHdhaXRpbmcgdW50aWwKICAqIHRoZSByZWZlcmVuY2UgY291bnQgb2YgZWFjaCBlbnRyeSBkcm9wcGVkIHRvIDAgZmlyc3QsIG9mIGNvdXJzZS4KICAqCi0gKiBZb3UgbmVlZCB0byBsb2NrIG1kZXYtPmFjdF9sb2cgd2l0aCBsY190cnlfbG9jaygpIC8gbGNfdW5sb2NrKCkKKyAqIFlvdSBuZWVkIHRvIGxvY2sgZGV2aWNlLT5hY3RfbG9nIHdpdGggbGNfdHJ5X2xvY2soKSAvIGxjX3VubG9jaygpCiAgKi8KLXZvaWQgZHJiZF9hbF9zaHJpbmsoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgZHJiZF9hbF9zaHJpbmsoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IGxjX2VsZW1lbnQgKmFsX2V4dDsKIAlpbnQgaTsKIAotCURfQVNTRVJUKHRlc3RfYml0KF9fTENfTE9DS0VELCAmbWRldi0+YWN0X2xvZy0+ZmxhZ3MpKTsKKwlEX0FTU0VSVChkZXZpY2UsIHRlc3RfYml0KF9fTENfTE9DS0VELCAmZGV2aWNlLT5hY3RfbG9nLT5mbGFncykpOwogCi0JZm9yIChpID0gMDsgaSA8IG1kZXYtPmFjdF9sb2ctPm5yX2VsZW1lbnRzOyBpKyspIHsKLQkJYWxfZXh0ID0gbGNfZWxlbWVudF9ieV9pbmRleChtZGV2LT5hY3RfbG9nLCBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2aWNlLT5hY3RfbG9nLT5ucl9lbGVtZW50czsgaSsrKSB7CisJCWFsX2V4dCA9IGxjX2VsZW1lbnRfYnlfaW5kZXgoZGV2aWNlLT5hY3RfbG9nLCBpKTsKIAkJaWYgKGFsX2V4dC0+bGNfbnVtYmVyID09IExDX0ZSRUUpCiAJCQljb250aW51ZTsKLQkJd2FpdF9ldmVudChtZGV2LT5hbF93YWl0LCBfdHJ5X2xjX2RlbChtZGV2LCBhbF9leHQpKTsKKwkJd2FpdF9ldmVudChkZXZpY2UtPmFsX3dhaXQsIF90cnlfbGNfZGVsKGRldmljZSwgYWxfZXh0KSk7CiAJfQogCi0Jd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKIH0KIAotaW50IGRyYmRfaW5pdGlhbGl6ZV9hbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB2b2lkICpidWZmZXIpCitpbnQgZHJiZF9pbml0aWFsaXplX2FsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB2b2lkICpidWZmZXIpCiB7CiAJc3RydWN0IGFsX3RyYW5zYWN0aW9uX29uX2Rpc2sgKmFsID0gYnVmZmVyOwotCXN0cnVjdCBkcmJkX21kICptZCA9ICZtZGV2LT5sZGV2LT5tZDsKKwlzdHJ1Y3QgZHJiZF9tZCAqbWQgPSAmZGV2aWNlLT5sZGV2LT5tZDsKIAlzZWN0b3JfdCBhbF9iYXNlID0gbWQtPm1kX29mZnNldCArIG1kLT5hbF9vZmZzZXQ7CiAJaW50IGFsX3NpemVfNGsgPSBtZC0+YWxfc3RyaXBlcyAqIG1kLT5hbF9zdHJpcGVfc2l6ZV80azsKIAlpbnQgaTsKQEAgLTY3Myw3ICs2NzcsNyBAQAogCWFsLT5jcmMzMmMgPSBjcHVfdG9fYmUzMihjcmMzMmMoMCwgYWwsIDQwOTYpKTsKIAogCWZvciAoaSA9IDA7IGkgPCBhbF9zaXplXzRrOyBpKyspIHsKLQkJaW50IGVyciA9IGRyYmRfbWRfc3luY19wYWdlX2lvKG1kZXYsIG1kZXYtPmxkZXYsIGFsX2Jhc2UgKyBpICogOCwgV1JJVEUpOworCQlpbnQgZXJyID0gZHJiZF9tZF9zeW5jX3BhZ2VfaW8oZGV2aWNlLCBkZXZpY2UtPmxkZXYsIGFsX2Jhc2UgKyBpICogOCwgV1JJVEUpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9CkBAIC02ODMsMzIgKzY4NywzMiBAQAogc3RhdGljIGludCB3X3VwZGF0ZV9vZGJtKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCB1bnVzZWQpCiB7CiAJc3RydWN0IHVwZGF0ZV9vZGJtX3dvcmsgKnVkdyA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgdXBkYXRlX29kYm1fd29yaywgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSB1ZHctPmRldmljZTsKIAlzdHJ1Y3Qgc2liX2luZm8gc2liID0geyAuc2liX3JlYXNvbiA9IFNJQl9TWU5DX1BST0dSRVNTLCB9OwogCi0JaWYgKCFnZXRfbGRldihtZGV2KSkgeworCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkgewogCQlpZiAoX19yYXRlbGltaXQoJmRyYmRfcmF0ZWxpbWl0X3N0YXRlKSkKLQkJCWRldl93YXJuKERFViwgIkNhbiBub3QgdXBkYXRlIG9uIGRpc2sgYml0bWFwLCBsb2NhbCBJTyBkaXNhYmxlZC5cbiIpOworCQkJZHJiZF93YXJuKGRldmljZSwgIkNhbiBub3QgdXBkYXRlIG9uIGRpc2sgYml0bWFwLCBsb2NhbCBJTyBkaXNhYmxlZC5cbiIpOwogCQlrZnJlZSh1ZHcpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlkcmJkX2JtX3dyaXRlX3BhZ2UobWRldiwgcnNfZXh0ZW50X3RvX2JtX3BhZ2UodWR3LT5lbnIpKTsKLQlwdXRfbGRldihtZGV2KTsKKwlkcmJkX2JtX3dyaXRlX3BhZ2UoZGV2aWNlLCByc19leHRlbnRfdG9fYm1fcGFnZSh1ZHctPmVucikpOworCXB1dF9sZGV2KGRldmljZSk7CiAKIAlrZnJlZSh1ZHcpOwogCi0JaWYgKGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpIDw9IG1kZXYtPnJzX2ZhaWxlZCkgewotCQlzd2l0Y2ggKG1kZXYtPnN0YXRlLmNvbm4pIHsKKwlpZiAoZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKSA8PSBkZXZpY2UtPnJzX2ZhaWxlZCkgeworCQlzd2l0Y2ggKGRldmljZS0+c3RhdGUuY29ubikgewogCQljYXNlIENfU1lOQ19TT1VSQ0U6ICBjYXNlIENfU1lOQ19UQVJHRVQ6CiAJCWNhc2UgQ19QQVVTRURfU1lOQ19TOiBjYXNlIENfUEFVU0VEX1NZTkNfVDoKLQkJCWRyYmRfcmVzeW5jX2ZpbmlzaGVkKG1kZXYpOworCQkJZHJiZF9yZXN5bmNfZmluaXNoZWQoZGV2aWNlKTsKIAkJZGVmYXVsdDoKIAkJCS8qIG5vdGhpbmcgdG8gZG8gKi8KIAkJCWJyZWFrOwogCQl9CiAJfQotCWRyYmRfYmNhc3RfZXZlbnQobWRldiwgJnNpYik7CisJZHJiZF9iY2FzdF9ldmVudChkZXZpY2UsICZzaWIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03MjAsNyArNzI0LDcgQEAKICAqCiAgKiBUT0RPIHdpbGwgYmUgb2Jzb2xldGVkIG9uY2Ugd2UgaGF2ZSBhIGNhY2hpbmcgbHJ1IG9mIHRoZSBvbiBkaXNrIGJpdG1hcAogICovCi1zdGF0aWMgdm9pZCBkcmJkX3RyeV9jbGVhcl9vbl9kaXNrX2JtKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHNlY3Rvcl90IHNlY3RvciwKK3N0YXRpYyB2b2lkIGRyYmRfdHJ5X2NsZWFyX29uX2Rpc2tfYm0oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvciwKIAkJCQkgICAgICBpbnQgY291bnQsIGludCBzdWNjZXNzKQogewogCXN0cnVjdCBsY19lbGVtZW50ICplOwpAQCAtNzI4LDEzICs3MzIsMTMgQEAKIAogCXVuc2lnbmVkIGludCBlbnI7CiAKLQlEX0FTU0VSVChhdG9taWNfcmVhZCgmbWRldi0+bG9jYWxfY250KSk7CisJRF9BU1NFUlQoZGV2aWNlLCBhdG9taWNfcmVhZCgmZGV2aWNlLT5sb2NhbF9jbnQpKTsKIAogCS8qIEkgc2ltcGx5IGFzc3VtZSB0aGF0IGEgc2VjdG9yL3NpemUgcGFpciBuZXZlciBjcm9zc2VzCiAJICogYSAxNiBNQiBleHRlbnQgYm9yZGVyLiAoQ3VycmVudGx5IHRoaXMgaXMgdHJ1ZS4uLikgKi8KIAllbnIgPSBCTV9TRUNUX1RPX0VYVChzZWN0b3IpOwogCi0JZSA9IGxjX2dldChtZGV2LT5yZXN5bmMsIGVucik7CisJZSA9IGxjX2dldChkZXZpY2UtPnJlc3luYywgZW5yKTsKIAlpZiAoZSkgewogCQlzdHJ1Y3QgYm1fZXh0ZW50ICpleHQgPSBsY19lbnRyeShlLCBzdHJ1Y3QgYm1fZXh0ZW50LCBsY2UpOwogCQlpZiAoZXh0LT5sY2UubGNfbnVtYmVyID09IGVucikgewpAQCAtNzQzLDEyICs3NDcsMTIgQEAKIAkJCWVsc2UKIAkJCQlleHQtPnJzX2ZhaWxlZCArPSBjb3VudDsKIAkJCWlmIChleHQtPnJzX2xlZnQgPCBleHQtPnJzX2ZhaWxlZCkgewotCQkJCWRldl93YXJuKERFViwgIkJBRCEgc2VjdG9yPSVsbHVzIGVucj0ldSByc19sZWZ0PSVkICIKKwkJCQlkcmJkX3dhcm4oZGV2aWNlLCAiQkFEISBzZWN0b3I9JWxsdXMgZW5yPSV1IHJzX2xlZnQ9JWQgIgogCQkJCSAgICAicnNfZmFpbGVkPSVkIGNvdW50PSVkIGNzdGF0ZT0lc1xuIiwKIAkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLAogCQkJCSAgICAgZXh0LT5sY2UubGNfbnVtYmVyLCBleHQtPnJzX2xlZnQsCiAJCQkJICAgICBleHQtPnJzX2ZhaWxlZCwgY291bnQsCi0JCQkJICAgICBkcmJkX2Nvbm5fc3RyKG1kZXYtPnN0YXRlLmNvbm4pKTsKKwkJCQkgICAgIGRyYmRfY29ubl9zdHIoZGV2aWNlLT5zdGF0ZS5jb25uKSk7CiAKIAkJCQkvKiBXZSBkb24ndCBleHBlY3QgdG8gYmUgYWJsZSB0byBjbGVhciBtb3JlIGJpdHMKIAkJCQkgKiB0aGFuIGhhdmUgYmVlbiBzZXQgd2hlbiB3ZSBvcmlnaW5hbGx5IGNvdW50ZWQKQEAgLTc1Niw3ICs3NjAsNyBAQAogCQkJCSAqIFdoYXRldmVyIHRoZSByZWFzb24gKGRpc2Nvbm5lY3QgZHVyaW5nIHJlc3luYywKIAkJCQkgKiBkZWxheWVkIGxvY2FsIGNvbXBsZXRpb24gb2YgYW4gYXBwbGljYXRpb24gd3JpdGUpLAogCQkJCSAqIHRyeSB0byBmaXggaXQgdXAgYnkgcmVjb3VudGluZyBoZXJlLiAqLwotCQkJCWV4dC0+cnNfbGVmdCA9IGRyYmRfYm1fZV93ZWlnaHQobWRldiwgZW5yKTsKKwkJCQlleHQtPnJzX2xlZnQgPSBkcmJkX2JtX2Vfd2VpZ2h0KGRldmljZSwgZW5yKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8qIE5vcm1hbGx5IHRoaXMgZWxlbWVudCBzaG91bGQgYmUgaW4gdGhlIGNhY2hlLApAQCAtNzY1LDE2ICs3NjksMTYgQEAKIAkJCSAqIEJ1dCBtYXliZSBhbiBhcHBsaWNhdGlvbiB3cml0ZSBmaW5pc2hlZCwgYW5kIHdlIHNldAogCQkJICogc29tZXRoaW5nIG91dHNpZGUgdGhlIHJlc3luYyBscnVfY2FjaGUgaW4gc3luYy4KIAkJCSAqLwotCQkJaW50IHJzX2xlZnQgPSBkcmJkX2JtX2Vfd2VpZ2h0KG1kZXYsIGVucik7CisJCQlpbnQgcnNfbGVmdCA9IGRyYmRfYm1fZV93ZWlnaHQoZGV2aWNlLCBlbnIpOwogCQkJaWYgKGV4dC0+ZmxhZ3MgIT0gMCkgewotCQkJCWRldl93YXJuKERFViwgImNoYW5naW5nIHJlc3luYyBsY2U6ICVkWyV1OyUwMmx4XSIKKwkJCQlkcmJkX3dhcm4oZGV2aWNlLCAiY2hhbmdpbmcgcmVzeW5jIGxjZTogJWRbJXU7JTAybHhdIgogCQkJCSAgICAgIiAtPiAlZFsldTswMF1cbiIsCiAJCQkJICAgICBleHQtPmxjZS5sY19udW1iZXIsIGV4dC0+cnNfbGVmdCwKIAkJCQkgICAgIGV4dC0+ZmxhZ3MsIGVuciwgcnNfbGVmdCk7CiAJCQkJZXh0LT5mbGFncyA9IDA7CiAJCQl9CiAJCQlpZiAoZXh0LT5yc19mYWlsZWQpIHsKLQkJCQlkZXZfd2FybihERVYsICJLaWNraW5nIHJlc3luY19scnUgZWxlbWVudCBlbnI9JXUgIgorCQkJCWRyYmRfd2FybihkZXZpY2UsICJLaWNraW5nIHJlc3luY19scnUgZWxlbWVudCBlbnI9JXUgIgogCQkJCSAgICAgIm91dCB3aXRoIHJzX2ZhaWxlZD0lZFxuIiwKIAkJCQkgICAgIGV4dC0+bGNlLmxjX251bWJlciwgZXh0LT5yc19mYWlsZWQpOwogCQkJfQpAQCAtNzgyLDkgKzc4Niw5IEBACiAJCQlleHQtPnJzX2ZhaWxlZCA9IHN1Y2Nlc3MgPyAwIDogY291bnQ7CiAJCQkvKiB3ZSBkb24ndCBrZWVwIGEgcGVyc2lzdGVudCBsb2cgb2YgdGhlIHJlc3luYyBscnUsCiAJCQkgKiB3ZSBjYW4gY29tbWl0IGFueSBjaGFuZ2UgcmlnaHQgYXdheS4gKi8KLQkJCWxjX2NvbW1pdHRlZChtZGV2LT5yZXN5bmMpOworCQkJbGNfY29tbWl0dGVkKGRldmljZS0+cmVzeW5jKTsKIAkJfQotCQlsY19wdXQobWRldi0+cmVzeW5jLCAmZXh0LT5sY2UpOworCQlsY19wdXQoZGV2aWNlLT5yZXN5bmMsICZleHQtPmxjZSk7CiAJCS8qIG5vIHJhY2UsIHdlIGFyZSB3aXRoaW4gdGhlIGFsX2xvY2shICovCiAKIAkJaWYgKGV4dC0+cnNfbGVmdCA9PSBleHQtPnJzX2ZhaWxlZCkgewpAQCAtNzk0LDMyICs3OTgsMzMgQEAKIAkJCWlmICh1ZHcpIHsKIAkJCQl1ZHctPmVuciA9IGV4dC0+bGNlLmxjX251bWJlcjsKIAkJCQl1ZHctPncuY2IgPSB3X3VwZGF0ZV9vZGJtOwotCQkJCXVkdy0+dy5tZGV2ID0gbWRldjsKLQkJCQlkcmJkX3F1ZXVlX3dvcmtfZnJvbnQoJm1kZXYtPnRjb25uLT5zZW5kZXJfd29yaywgJnVkdy0+dyk7CisJCQkJdWR3LT5kZXZpY2UgPSBkZXZpY2U7CisJCQkJZHJiZF9xdWV1ZV93b3JrX2Zyb250KCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yaywKKwkJCQkJCSAgICAgICZ1ZHctPncpOwogCQkJfSBlbHNlIHsKLQkJCQlkZXZfd2FybihERVYsICJDb3VsZCBub3Qga21hbGxvYyBhbiB1ZHdcbiIpOworCQkJCWRyYmRfd2FybihkZXZpY2UsICJDb3VsZCBub3Qga21hbGxvYyBhbiB1ZHdcbiIpOwogCQkJfQogCQl9CiAJfSBlbHNlIHsKLQkJZGV2X2VycihERVYsICJsY19nZXQoKSBmYWlsZWQhIGxvY2tlZD0lZC8lZCBmbGFncz0lbHVcbiIsCi0JCSAgICBtZGV2LT5yZXN5bmNfbG9ja2VkLAotCQkgICAgbWRldi0+cmVzeW5jLT5ucl9lbGVtZW50cywKLQkJICAgIG1kZXYtPnJlc3luYy0+ZmxhZ3MpOworCQlkcmJkX2VycihkZXZpY2UsICJsY19nZXQoKSBmYWlsZWQhIGxvY2tlZD0lZC8lZCBmbGFncz0lbHVcbiIsCisJCSAgICBkZXZpY2UtPnJlc3luY19sb2NrZWQsCisJCSAgICBkZXZpY2UtPnJlc3luYy0+bnJfZWxlbWVudHMsCisJCSAgICBkZXZpY2UtPnJlc3luYy0+ZmxhZ3MpOwogCX0KIH0KIAotdm9pZCBkcmJkX2FkdmFuY2VfcnNfbWFya3Moc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBzdGlsbF90b19nbykKK3ZvaWQgZHJiZF9hZHZhbmNlX3JzX21hcmtzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIHN0aWxsX3RvX2dvKQogewogCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKLQl1bnNpZ25lZCBsb25nIGxhc3QgPSBtZGV2LT5yc19tYXJrX3RpbWVbbWRldi0+cnNfbGFzdF9tYXJrXTsKLQlpbnQgbmV4dCA9IChtZGV2LT5yc19sYXN0X21hcmsgKyAxKSAlIERSQkRfU1lOQ19NQVJLUzsKKwl1bnNpZ25lZCBsb25nIGxhc3QgPSBkZXZpY2UtPnJzX21hcmtfdGltZVtkZXZpY2UtPnJzX2xhc3RfbWFya107CisJaW50IG5leHQgPSAoZGV2aWNlLT5yc19sYXN0X21hcmsgKyAxKSAlIERSQkRfU1lOQ19NQVJLUzsKIAlpZiAodGltZV9hZnRlcl9lcShub3csIGxhc3QgKyBEUkJEX1NZTkNfTUFSS19TVEVQKSkgewotCQlpZiAobWRldi0+cnNfbWFya19sZWZ0W21kZXYtPnJzX2xhc3RfbWFya10gIT0gc3RpbGxfdG9fZ28gJiYKLQkJICAgIG1kZXYtPnN0YXRlLmNvbm4gIT0gQ19QQVVTRURfU1lOQ19UICYmCi0JCSAgICBtZGV2LT5zdGF0ZS5jb25uICE9IENfUEFVU0VEX1NZTkNfUykgewotCQkJbWRldi0+cnNfbWFya190aW1lW25leHRdID0gbm93OwotCQkJbWRldi0+cnNfbWFya19sZWZ0W25leHRdID0gc3RpbGxfdG9fZ287Ci0JCQltZGV2LT5yc19sYXN0X21hcmsgPSBuZXh0OworCQlpZiAoZGV2aWNlLT5yc19tYXJrX2xlZnRbZGV2aWNlLT5yc19sYXN0X21hcmtdICE9IHN0aWxsX3RvX2dvICYmCisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gIT0gQ19QQVVTRURfU1lOQ19UICYmCisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gIT0gQ19QQVVTRURfU1lOQ19TKSB7CisJCQlkZXZpY2UtPnJzX21hcmtfdGltZVtuZXh0XSA9IG5vdzsKKwkJCWRldmljZS0+cnNfbWFya19sZWZ0W25leHRdID0gc3RpbGxfdG9fZ287CisJCQlkZXZpY2UtPnJzX2xhc3RfbWFyayA9IG5leHQ7CiAJCX0KIAl9CiB9CkBAIC04MzEsNyArODM2LDcgQEAKICAqIGNhbGxlZCBieSB3b3JrZXIgb24gQ19TWU5DX1RBUkdFVCBhbmQgcmVjZWl2ZXIgb24gU3luY1NvdXJjZS4KICAqCiAgKi8KLXZvaWQgX19kcmJkX3NldF9pbl9zeW5jKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUsCit2b2lkIF9fZHJiZF9zZXRfaW5fc3luYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSwKIAkJICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IHVuc2lnbmVkIGludCBsaW5lKQogewogCS8qIElzIGNhbGxlZCBmcm9tIHdvcmtlciBhbmQgcmVjZWl2ZXIgY29udGV4dCBfb25seV8gKi8KQEAgLTg0MiwxNSArODQ3LDE1IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChzaXplIDw9IDAgfHwgIUlTX0FMSUdORUQoc2l6ZSwgNTEyKSB8fCBzaXplID4gRFJCRF9NQVhfQklPX1NJWkUpIHsKLQkJZGV2X2VycihERVYsICJkcmJkX3NldF9pbl9zeW5jOiBzZWN0b3I9JWxsdXMgc2l6ZT0lZCBub25zZW5zZSFcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfc2V0X2luX3N5bmM6IHNlY3Rvcj0lbGx1cyBzaXplPSVkIG5vbnNlbnNlIVxuIiwKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKXNlY3Rvciwgc2l6ZSk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoIWdldF9sZGV2KG1kZXYpKQorCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkKIAkJcmV0dXJuOyAvKiBubyBkaXNrLCBubyBtZXRhZGF0YSwgbm8gYml0bWFwIHRvIGNsZWFyIGJpdHMgaW4gKi8KIAotCW5yX3NlY3RvcnMgPSBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYpOworCW5yX3NlY3RvcnMgPSBkcmJkX2dldF9jYXBhY2l0eShkZXZpY2UtPnRoaXNfYmRldik7CiAJZXNlY3RvciA9IHNlY3RvciArIChzaXplID4+IDkpIC0gMTsKIAogCWlmICghZXhwZWN0KHNlY3RvciA8IG5yX3NlY3RvcnMpKQpAQCAtODc4LDIxICs4ODMsMjEgQEAKIAkgKiBvaywgKGNhcGFjaXR5ICYgNykgIT0gMCBzb21ldGltZXMsIGJ1dCB3aG8gY2FyZXMuLi4KIAkgKiB3ZSBjb3VudCByc197dG90YWwsbGVmdH0gaW4gYml0cywgbm90IHNlY3RvcnMuCiAJICovCi0JY291bnQgPSBkcmJkX2JtX2NsZWFyX2JpdHMobWRldiwgc2JuciwgZWJucik7CisJY291bnQgPSBkcmJkX2JtX2NsZWFyX2JpdHMoZGV2aWNlLCBzYm5yLCBlYm5yKTsKIAlpZiAoY291bnQpIHsKLQkJZHJiZF9hZHZhbmNlX3JzX21hcmtzKG1kZXYsIGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPmFsX2xvY2ssIGZsYWdzKTsKLQkJZHJiZF90cnlfY2xlYXJfb25fZGlza19ibShtZGV2LCBzZWN0b3IsIGNvdW50LCB0cnVlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+YWxfbG9jaywgZmxhZ3MpOworCQlkcmJkX2FkdmFuY2VfcnNfbWFya3MoZGV2aWNlLCBkcmJkX2JtX3RvdGFsX3dlaWdodChkZXZpY2UpKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+YWxfbG9jaywgZmxhZ3MpOworCQlkcmJkX3RyeV9jbGVhcl9vbl9kaXNrX2JtKGRldmljZSwgc2VjdG9yLCBjb3VudCwgdHJ1ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+YWxfbG9jaywgZmxhZ3MpOwogCiAJCS8qIGp1c3Qgd2FrZV91cCB1bmNvbmRpdGlvbmFsIG5vdywgdmFyaW91cyBsY19jaGFnZWQoKSwKIAkJICogbGNfcHV0KCkgaW4gZHJiZF90cnlfY2xlYXJfb25fZGlza19ibSgpLiAqLwogCQl3YWtlX3VwID0gMTsKIAl9CiBvdXQ6Ci0JcHV0X2xkZXYobWRldik7CisJcHV0X2xkZXYoZGV2aWNlKTsKIAlpZiAod2FrZV91cCkKLQkJd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJCXdha2VfdXAoJmRldmljZS0+YWxfd2FpdCk7CiB9CiAKIC8qCkBAIC05MDMsNyArOTA4LDcgQEAKICAqIGNhbGxlZCBieSB0bF9jbGVhciBhbmQgZHJiZF9zZW5kX2RibG9jayAoPT1kcmJkX21ha2VfcmVxdWVzdCkuCiAgKiBzbyB0aGlzIGNhbiBiZSBfYW55XyBwcm9jZXNzLgogICovCi1pbnQgX19kcmJkX3NldF9vdXRfb2Zfc3luYyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplLAoraW50IF9fZHJiZF9zZXRfb3V0X29mX3N5bmMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUsCiAJCQkgICAgY29uc3QgY2hhciAqZmlsZSwgY29uc3QgdW5zaWduZWQgaW50IGxpbmUpCiB7CiAJdW5zaWduZWQgbG9uZyBzYm5yLCBlYm5yLCBmbGFnczsKQEAgLTkxNiwxNSArOTIxLDE1IEBACiAJCXJldHVybiAwOwogCiAJaWYgKHNpemUgPCAwIHx8ICFJU19BTElHTkVEKHNpemUsIDUxMikgfHwgc2l6ZSA+IERSQkRfTUFYX0JJT19TSVpFKSB7Ci0JCWRldl9lcnIoREVWLCAic2VjdG9yOiAlbGx1cywgc2l6ZTogJWRcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgInNlY3RvcjogJWxsdXMsIHNpemU6ICVkXG4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IsIHNpemUpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIWdldF9sZGV2KG1kZXYpKQorCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkKIAkJcmV0dXJuIDA7IC8qIG5vIGRpc2ssIG5vIG1ldGFkYXRhLCBubyBiaXRtYXAgdG8gc2V0IGJpdHMgaW4gKi8KIAotCW5yX3NlY3RvcnMgPSBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYpOworCW5yX3NlY3RvcnMgPSBkcmJkX2dldF9jYXBhY2l0eShkZXZpY2UtPnRoaXNfYmRldik7CiAJZXNlY3RvciA9IHNlY3RvciArIChzaXplID4+IDkpIC0gMTsKIAogCWlmICghZXhwZWN0KHNlY3RvciA8IG5yX3NlY3RvcnMpKQpAQCAtOTM5LDU1ICs5NDQsNTUgQEAKIAogCS8qIG9rLCAoY2FwYWNpdHkgJiA3KSAhPSAwIHNvbWV0aW1lcywgYnV0IHdobyBjYXJlcy4uLgogCSAqIHdlIGNvdW50IHJzX3t0b3RhbCxsZWZ0fSBpbiBiaXRzLCBub3Qgc2VjdG9ycy4gICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPmFsX2xvY2ssIGZsYWdzKTsKLQljb3VudCA9IGRyYmRfYm1fc2V0X2JpdHMobWRldiwgc2JuciwgZWJucik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+YWxfbG9jaywgZmxhZ3MpOworCWNvdW50ID0gZHJiZF9ibV9zZXRfYml0cyhkZXZpY2UsIHNibnIsIGVibnIpOwogCiAJZW5yID0gQk1fU0VDVF9UT19FWFQoc2VjdG9yKTsKLQllID0gbGNfZmluZChtZGV2LT5yZXN5bmMsIGVucik7CisJZSA9IGxjX2ZpbmQoZGV2aWNlLT5yZXN5bmMsIGVucik7CiAJaWYgKGUpCiAJCWxjX2VudHJ5KGUsIHN0cnVjdCBibV9leHRlbnQsIGxjZSktPnJzX2xlZnQgKz0gY291bnQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+YWxfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+YWxfbG9jaywgZmxhZ3MpOwogCiBvdXQ6Ci0JcHV0X2xkZXYobWRldik7CisJcHV0X2xkZXYoZGV2aWNlKTsKIAogCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljCi1zdHJ1Y3QgYm1fZXh0ZW50ICpfYm1lX2dldChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBpbnQgZW5yKQorc3RydWN0IGJtX2V4dGVudCAqX2JtZV9nZXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGludCBlbnIpCiB7CiAJc3RydWN0IGxjX2VsZW1lbnQgKmU7CiAJc3RydWN0IGJtX2V4dGVudCAqYm1fZXh0OwogCWludCB3YWtldXAgPSAwOwogCXVuc2lnbmVkIGxvbmcgcnNfZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT5hbF9sb2NrKTsKLQlpZiAobWRldi0+cmVzeW5jX2xvY2tlZCA+IG1kZXYtPnJlc3luYy0+bnJfZWxlbWVudHMvMikgewotCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CisJaWYgKGRldmljZS0+cmVzeW5jX2xvY2tlZCA+IGRldmljZS0+cmVzeW5jLT5ucl9lbGVtZW50cy8yKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWUgPSBsY19nZXQobWRldi0+cmVzeW5jLCBlbnIpOworCWUgPSBsY19nZXQoZGV2aWNlLT5yZXN5bmMsIGVucik7CiAJYm1fZXh0ID0gZSA/IGxjX2VudHJ5KGUsIHN0cnVjdCBibV9leHRlbnQsIGxjZSkgOiBOVUxMOwogCWlmIChibV9leHQpIHsKIAkJaWYgKGJtX2V4dC0+bGNlLmxjX251bWJlciAhPSBlbnIpIHsKLQkJCWJtX2V4dC0+cnNfbGVmdCA9IGRyYmRfYm1fZV93ZWlnaHQobWRldiwgZW5yKTsKKwkJCWJtX2V4dC0+cnNfbGVmdCA9IGRyYmRfYm1fZV93ZWlnaHQoZGV2aWNlLCBlbnIpOwogCQkJYm1fZXh0LT5yc19mYWlsZWQgPSAwOwotCQkJbGNfY29tbWl0dGVkKG1kZXYtPnJlc3luYyk7CisJCQlsY19jb21taXR0ZWQoZGV2aWNlLT5yZXN5bmMpOwogCQkJd2FrZXVwID0gMTsKIAkJfQogCQlpZiAoYm1fZXh0LT5sY2UucmVmY250ID09IDEpCi0JCQltZGV2LT5yZXN5bmNfbG9ja2VkKys7CisJCQlkZXZpY2UtPnJlc3luY19sb2NrZWQrKzsKIAkJc2V0X2JpdChCTUVfTk9fV1JJVEVTLCAmYm1fZXh0LT5mbGFncyk7CiAJfQotCXJzX2ZsYWdzID0gbWRldi0+cmVzeW5jLT5mbGFnczsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCXJzX2ZsYWdzID0gZGV2aWNlLT5yZXN5bmMtPmZsYWdzOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAlpZiAod2FrZXVwKQotCQl3YWtlX3VwKCZtZGV2LT5hbF93YWl0KTsKKwkJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKIAogCWlmICghYm1fZXh0KSB7CiAJCWlmIChyc19mbGFncyAmIExDX1NUQVJWSU5HKQotCQkJZGV2X3dhcm4oREVWLCAiSGF2ZSB0byB3YWl0IGZvciBlbGVtZW50IgorCQkJZHJiZF93YXJuKGRldmljZSwgIkhhdmUgdG8gd2FpdCBmb3IgZWxlbWVudCIKIAkJCSAgICAgIiAocmVzeW5jIExSVSB0b28gc21hbGw/KVxuIik7CiAJCUJVR19PTihyc19mbGFncyAmIExDX0xPQ0tFRCk7CiAJfQpAQCAtOTk1LDI1ICsxMDAwLDI1IEBACiAJcmV0dXJuIGJtX2V4dDsKIH0KIAotc3RhdGljIGludCBfaXNfaW5fYWwoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgaW50IGVucikKK3N0YXRpYyBpbnQgX2lzX2luX2FsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgZW5yKQogewogCWludCBydjsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOwotCXJ2ID0gbGNfaXNfdXNlZChtZGV2LT5hY3RfbG9nLCBlbnIpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKKwlydiA9IGxjX2lzX3VzZWQoZGV2aWNlLT5hY3RfbG9nLCBlbnIpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAogCXJldHVybiBydjsKIH0KIAogLyoqCiAgKiBkcmJkX3JzX2JlZ2luX2lvKCkgLSBHZXRzIGFuIGV4dGVudCBpbiB0aGUgcmVzeW5jIExSVSBjYWNoZSBhbmQgc2V0cyBpdCB0byBCTUVfTE9DS0VECi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBzZWN0b3I6CVRoZSBzZWN0b3IgbnVtYmVyLgogICoKICAqIFRoaXMgZnVuY3Rpb25zIHNsZWVwcyBvbiBhbF93YWl0LiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlRSIGlmIGludGVycnVwdGVkLgogICovCi1pbnQgZHJiZF9yc19iZWdpbl9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IpCitpbnQgZHJiZF9yc19iZWdpbl9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yKQogewogCXVuc2lnbmVkIGludCBlbnIgPSBCTV9TRUNUX1RPX0VYVChzZWN0b3IpOwogCXN0cnVjdCBibV9leHRlbnQgKmJtX2V4dDsKQEAgLTEwMjIsOCArMTAyNyw4IEBACiAJCQkgMjAwIHRpbWVzIC0+IDIwIHNlY29uZHMuICovCiAKIHJldHJ5OgotCXNpZyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShtZGV2LT5hbF93YWl0LAotCQkJKGJtX2V4dCA9IF9ibWVfZ2V0KG1kZXYsIGVucikpKTsKKwlzaWcgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2aWNlLT5hbF93YWl0LAorCQkJKGJtX2V4dCA9IF9ibWVfZ2V0KGRldmljZSwgZW5yKSkpOwogCWlmIChzaWcpCiAJCXJldHVybiAtRUlOVFI7CiAKQEAgLTEwMzEsMjQgKzEwMzYsMjQgQEAKIAkJcmV0dXJuIDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQUxfRVhUX1BFUl9CTV9TRUNUOyBpKyspIHsKLQkJc2lnID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKG1kZXYtPmFsX3dhaXQsCi0JCQkJCSAgICAgICAhX2lzX2luX2FsKG1kZXYsIGVuciAqIEFMX0VYVF9QRVJfQk1fU0VDVCArIGkpIHx8CisJCXNpZyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZXZpY2UtPmFsX3dhaXQsCisJCQkJCSAgICAgICAhX2lzX2luX2FsKGRldmljZSwgZW5yICogQUxfRVhUX1BFUl9CTV9TRUNUICsgaSkgfHwKIAkJCQkJICAgICAgIHRlc3RfYml0KEJNRV9QUklPUklUWSwgJmJtX2V4dC0+ZmxhZ3MpKTsKIAogCQlpZiAoc2lnIHx8ICh0ZXN0X2JpdChCTUVfUFJJT1JJVFksICZibV9leHQtPmZsYWdzKSAmJiBzYSkpIHsKLQkJCXNwaW5fbG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOwotCQkJaWYgKGxjX3B1dChtZGV2LT5yZXN5bmMsICZibV9leHQtPmxjZSkgPT0gMCkgeworCQkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKKwkJCWlmIChsY19wdXQoZGV2aWNlLT5yZXN5bmMsICZibV9leHQtPmxjZSkgPT0gMCkgewogCQkJCWJtX2V4dC0+ZmxhZ3MgPSAwOyAvKiBjbGVhcnMgQk1FX05PX1dSSVRFUyBhbmQgZXZlbnR1YWxseSBCTUVfUFJJT1JJVFkgKi8KLQkJCQltZGV2LT5yZXN5bmNfbG9ja2VkLS07Ci0JCQkJd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJCQkJZGV2aWNlLT5yZXN5bmNfbG9ja2VkLS07CisJCQkJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKIAkJCX0KLQkJCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAJCQlpZiAoc2lnKQogCQkJCXJldHVybiAtRUlOVFI7CiAJCQlpZiAoc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKEhaLzEwKSkKIAkJCQlyZXR1cm4gLUVJTlRSOwogCQkJaWYgKHNhICYmIC0tc2EgPT0gMCkKLQkJCQlkZXZfd2FybihERVYsImRyYmRfcnNfYmVnaW5faW8oKSBzdGVwcGVkIGFzaWRlIGZvciAyMHNlYy4iCisJCQkJZHJiZF93YXJuKGRldmljZSwgImRyYmRfcnNfYmVnaW5faW8oKSBzdGVwcGVkIGFzaWRlIGZvciAyMHNlYy4iCiAJCQkJCSAiUmVzeW5jIHN0YWxsZWQ/XG4iKTsKIAkJCWdvdG8gcmV0cnk7CiAJCX0KQEAgLTEwNTksMTQgKzEwNjQsMTQgQEAKIAogLyoqCiAgKiBkcmJkX3RyeV9yc19iZWdpbl9pbygpIC0gR2V0cyBhbiBleHRlbnQgaW4gdGhlIHJlc3luYyBMUlUgY2FjaGUsIGRvZXMgbm90IHNsZWVwCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBzZWN0b3I6CVRoZSBzZWN0b3IgbnVtYmVyLgogICoKICAqIEdldHMgYW4gZXh0ZW50IGluIHRoZSByZXN5bmMgTFJVIGNhY2hlLCBzZXRzIGl0IHRvIEJNRV9OT19XUklURVMsIHRoZW4KICAqIHRyaWVzIHRvIHNldCBpdCB0byBCTUVfTE9DS0VELiBSZXR1cm5zIDAgdXBvbiBzdWNjZXNzLCBhbmQgLUVBR0FJTgogICogaWYgdGhlcmUgaXMgc3RpbGwgYXBwbGljYXRpb24gSU8gZ29pbmcgb24gaW4gdGhpcyBhcmVhLgogICovCi1pbnQgZHJiZF90cnlfcnNfYmVnaW5faW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yKQoraW50IGRyYmRfdHJ5X3JzX2JlZ2luX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzZWN0b3JfdCBzZWN0b3IpCiB7CiAJdW5zaWduZWQgaW50IGVuciA9IEJNX1NFQ1RfVE9fRVhUKHNlY3Rvcik7CiAJY29uc3QgdW5zaWduZWQgaW50IGFsX2VuciA9IGVucipBTF9FWFRfUEVSX0JNX1NFQ1Q7CkBAIC0xMDc0LDggKzEwNzksOCBAQAogCXN0cnVjdCBibV9leHRlbnQgKmJtX2V4dDsKIAlpbnQgaTsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOwotCWlmIChtZGV2LT5yZXN5bmNfd2VuciAhPSBMQ19GUkVFICYmIG1kZXYtPnJlc3luY193ZW5yICE9IGVucikgeworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CisJaWYgKGRldmljZS0+cmVzeW5jX3dlbnIgIT0gTENfRlJFRSAmJiBkZXZpY2UtPnJlc3luY193ZW5yICE9IGVucikgewogCQkvKiBpbiBjYXNlIHlvdSBoYXZlIHZlcnkgaGVhdnkgc2NhdHRlcmVkIGlvLCBpdCBtYXkKIAkJICogc3RhbGwgdGhlIHN5bmNlciB1bmRlZmluZWQgaWYgd2UgZ2l2ZSB1cCB0aGUgcmVmIGNvdW50CiAJCSAqIHdoZW4gd2UgdHJ5IGFnYWluIGFuZCByZXF1ZXVlLgpAQCAtMTA4OSwxOTMgKzEwOTQsMTkzIEBACiAJCSAqIHRoZSBsY19wdXQgaGVyZS4uLgogCQkgKiB3ZSBhbHNvIGhhdmUgdG8gd2FrZV91cAogCQkgKi8KLQkJZSA9IGxjX2ZpbmQobWRldi0+cmVzeW5jLCBtZGV2LT5yZXN5bmNfd2Vucik7CisJCWUgPSBsY19maW5kKGRldmljZS0+cmVzeW5jLCBkZXZpY2UtPnJlc3luY193ZW5yKTsKIAkJYm1fZXh0ID0gZSA/IGxjX2VudHJ5KGUsIHN0cnVjdCBibV9leHRlbnQsIGxjZSkgOiBOVUxMOwogCQlpZiAoYm1fZXh0KSB7Ci0JCQlEX0FTU0VSVCghdGVzdF9iaXQoQk1FX0xPQ0tFRCwgJmJtX2V4dC0+ZmxhZ3MpKTsKLQkJCURfQVNTRVJUKHRlc3RfYml0KEJNRV9OT19XUklURVMsICZibV9leHQtPmZsYWdzKSk7CisJCQlEX0FTU0VSVChkZXZpY2UsICF0ZXN0X2JpdChCTUVfTE9DS0VELCAmYm1fZXh0LT5mbGFncykpOworCQkJRF9BU1NFUlQoZGV2aWNlLCB0ZXN0X2JpdChCTUVfTk9fV1JJVEVTLCAmYm1fZXh0LT5mbGFncykpOwogCQkJY2xlYXJfYml0KEJNRV9OT19XUklURVMsICZibV9leHQtPmZsYWdzKTsKLQkJCW1kZXYtPnJlc3luY193ZW5yID0gTENfRlJFRTsKLQkJCWlmIChsY19wdXQobWRldi0+cmVzeW5jLCAmYm1fZXh0LT5sY2UpID09IDApCi0JCQkJbWRldi0+cmVzeW5jX2xvY2tlZC0tOwotCQkJd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJCQlkZXZpY2UtPnJlc3luY193ZW5yID0gTENfRlJFRTsKKwkJCWlmIChsY19wdXQoZGV2aWNlLT5yZXN5bmMsICZibV9leHQtPmxjZSkgPT0gMCkKKwkJCQlkZXZpY2UtPnJlc3luY19sb2NrZWQtLTsKKwkJCXdha2VfdXAoJmRldmljZS0+YWxfd2FpdCk7CiAJCX0gZWxzZSB7Ci0JCQlkZXZfYWxlcnQoREVWLCAiTE9HSUMgQlVHXG4iKTsKKwkJCWRyYmRfYWxlcnQoZGV2aWNlLCAiTE9HSUMgQlVHXG4iKTsKIAkJfQogCX0KIAkvKiBUUlkuICovCi0JZSA9IGxjX3RyeV9nZXQobWRldi0+cmVzeW5jLCBlbnIpOworCWUgPSBsY190cnlfZ2V0KGRldmljZS0+cmVzeW5jLCBlbnIpOwogCWJtX2V4dCA9IGUgPyBsY19lbnRyeShlLCBzdHJ1Y3QgYm1fZXh0ZW50LCBsY2UpIDogTlVMTDsKIAlpZiAoYm1fZXh0KSB7CiAJCWlmICh0ZXN0X2JpdChCTUVfTE9DS0VELCAmYm1fZXh0LT5mbGFncykpCiAJCQlnb3RvIHByb2NlZWQ7CiAJCWlmICghdGVzdF9hbmRfc2V0X2JpdChCTUVfTk9fV1JJVEVTLCAmYm1fZXh0LT5mbGFncykpIHsKLQkJCW1kZXYtPnJlc3luY19sb2NrZWQrKzsKKwkJCWRldmljZS0+cmVzeW5jX2xvY2tlZCsrOwogCQl9IGVsc2UgewogCQkJLyogd2UgZGlkIHNldCB0aGUgQk1FX05PX1dSSVRFUywKIAkJCSAqIGJ1dCB0aGVuIGNvdWxkIG5vdCBzZXQgQk1FX0xPQ0tFRCwKIAkJCSAqIHNvIHdlIHRyaWVkIGFnYWluLgogCQkJICogZHJvcCB0aGUgZXh0cmEgcmVmZXJlbmNlLiAqLwogCQkJYm1fZXh0LT5sY2UucmVmY250LS07Ci0JCQlEX0FTU0VSVChibV9leHQtPmxjZS5yZWZjbnQgPiAwKTsKKwkJCURfQVNTRVJUKGRldmljZSwgYm1fZXh0LT5sY2UucmVmY250ID4gMCk7CiAJCX0KIAkJZ290byBjaGVja19hbDsKIAl9IGVsc2UgewogCQkvKiBkbyB3ZSByYXRoZXIgd2FudCB0byB0cnkgbGF0ZXI/ICovCi0JCWlmIChtZGV2LT5yZXN5bmNfbG9ja2VkID4gbWRldi0+cmVzeW5jLT5ucl9lbGVtZW50cy0zKQorCQlpZiAoZGV2aWNlLT5yZXN5bmNfbG9ja2VkID4gZGV2aWNlLT5yZXN5bmMtPm5yX2VsZW1lbnRzLTMpCiAJCQlnb3RvIHRyeV9hZ2FpbjsKIAkJLyogRG8gb3IgZG8gbm90LiBUaGVyZSBpcyBubyB0cnkuIC0tIFlvZGEgKi8KLQkJZSA9IGxjX2dldChtZGV2LT5yZXN5bmMsIGVucik7CisJCWUgPSBsY19nZXQoZGV2aWNlLT5yZXN5bmMsIGVucik7CiAJCWJtX2V4dCA9IGUgPyBsY19lbnRyeShlLCBzdHJ1Y3QgYm1fZXh0ZW50LCBsY2UpIDogTlVMTDsKIAkJaWYgKCFibV9leHQpIHsKLQkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgcnNfZmxhZ3MgPSBtZGV2LT5yZXN5bmMtPmZsYWdzOworCQkJY29uc3QgdW5zaWduZWQgbG9uZyByc19mbGFncyA9IGRldmljZS0+cmVzeW5jLT5mbGFnczsKIAkJCWlmIChyc19mbGFncyAmIExDX1NUQVJWSU5HKQotCQkJCWRldl93YXJuKERFViwgIkhhdmUgdG8gd2FpdCBmb3IgZWxlbWVudCIKKwkJCQlkcmJkX3dhcm4oZGV2aWNlLCAiSGF2ZSB0byB3YWl0IGZvciBlbGVtZW50IgogCQkJCSAgICAgIiAocmVzeW5jIExSVSB0b28gc21hbGw/KVxuIik7CiAJCQlCVUdfT04ocnNfZmxhZ3MgJiBMQ19MT0NLRUQpOwogCQkJZ290byB0cnlfYWdhaW47CiAJCX0KIAkJaWYgKGJtX2V4dC0+bGNlLmxjX251bWJlciAhPSBlbnIpIHsKLQkJCWJtX2V4dC0+cnNfbGVmdCA9IGRyYmRfYm1fZV93ZWlnaHQobWRldiwgZW5yKTsKKwkJCWJtX2V4dC0+cnNfbGVmdCA9IGRyYmRfYm1fZV93ZWlnaHQoZGV2aWNlLCBlbnIpOwogCQkJYm1fZXh0LT5yc19mYWlsZWQgPSAwOwotCQkJbGNfY29tbWl0dGVkKG1kZXYtPnJlc3luYyk7Ci0JCQl3YWtlX3VwKCZtZGV2LT5hbF93YWl0KTsKLQkJCURfQVNTRVJUKHRlc3RfYml0KEJNRV9MT0NLRUQsICZibV9leHQtPmZsYWdzKSA9PSAwKTsKKwkJCWxjX2NvbW1pdHRlZChkZXZpY2UtPnJlc3luYyk7CisJCQl3YWtlX3VwKCZkZXZpY2UtPmFsX3dhaXQpOworCQkJRF9BU1NFUlQoZGV2aWNlLCB0ZXN0X2JpdChCTUVfTE9DS0VELCAmYm1fZXh0LT5mbGFncykgPT0gMCk7CiAJCX0KIAkJc2V0X2JpdChCTUVfTk9fV1JJVEVTLCAmYm1fZXh0LT5mbGFncyk7Ci0JCURfQVNTRVJUKGJtX2V4dC0+bGNlLnJlZmNudCA9PSAxKTsKLQkJbWRldi0+cmVzeW5jX2xvY2tlZCsrOworCQlEX0FTU0VSVChkZXZpY2UsIGJtX2V4dC0+bGNlLnJlZmNudCA9PSAxKTsKKwkJZGV2aWNlLT5yZXN5bmNfbG9ja2VkKys7CiAJCWdvdG8gY2hlY2tfYWw7CiAJfQogY2hlY2tfYWw6CiAJZm9yIChpID0gMDsgaSA8IEFMX0VYVF9QRVJfQk1fU0VDVDsgaSsrKSB7Ci0JCWlmIChsY19pc191c2VkKG1kZXYtPmFjdF9sb2csIGFsX2VucitpKSkKKwkJaWYgKGxjX2lzX3VzZWQoZGV2aWNlLT5hY3RfbG9nLCBhbF9lbnIraSkpCiAJCQlnb3RvIHRyeV9hZ2FpbjsKIAl9CiAJc2V0X2JpdChCTUVfTE9DS0VELCAmYm1fZXh0LT5mbGFncyk7CiBwcm9jZWVkOgotCW1kZXYtPnJlc3luY193ZW5yID0gTENfRlJFRTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCWRldmljZS0+cmVzeW5jX3dlbnIgPSBMQ19GUkVFOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAlyZXR1cm4gMDsKIAogdHJ5X2FnYWluOgogCWlmIChibV9leHQpCi0JCW1kZXYtPnJlc3luY193ZW5yID0gZW5yOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJCWRldmljZS0+cmVzeW5jX3dlbnIgPSBlbnI7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPmFsX2xvY2spOwogCXJldHVybiAtRUFHQUlOOwogfQogCi12b2lkIGRyYmRfcnNfY29tcGxldGVfaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yKQordm9pZCBkcmJkX3JzX2NvbXBsZXRlX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzZWN0b3JfdCBzZWN0b3IpCiB7CiAJdW5zaWduZWQgaW50IGVuciA9IEJNX1NFQ1RfVE9fRVhUKHNlY3Rvcik7CiAJc3RydWN0IGxjX2VsZW1lbnQgKmU7CiAJc3RydWN0IGJtX2V4dGVudCAqYm1fZXh0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+YWxfbG9jaywgZmxhZ3MpOwotCWUgPSBsY19maW5kKG1kZXYtPnJlc3luYywgZW5yKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5hbF9sb2NrLCBmbGFncyk7CisJZSA9IGxjX2ZpbmQoZGV2aWNlLT5yZXN5bmMsIGVucik7CiAJYm1fZXh0ID0gZSA/IGxjX2VudHJ5KGUsIHN0cnVjdCBibV9leHRlbnQsIGxjZSkgOiBOVUxMOwogCWlmICghYm1fZXh0KSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmFsX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5hbF9sb2NrLCBmbGFncyk7CiAJCWlmIChfX3JhdGVsaW1pdCgmZHJiZF9yYXRlbGltaXRfc3RhdGUpKQotCQkJZGV2X2VycihERVYsICJkcmJkX3JzX2NvbXBsZXRlX2lvKCkgY2FsbGVkLCBidXQgZXh0ZW50IG5vdCBmb3VuZFxuIik7CisJCQlkcmJkX2VycihkZXZpY2UsICJkcmJkX3JzX2NvbXBsZXRlX2lvKCkgY2FsbGVkLCBidXQgZXh0ZW50IG5vdCBmb3VuZFxuIik7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAoYm1fZXh0LT5sY2UucmVmY250ID09IDApIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+YWxfbG9jaywgZmxhZ3MpOwotCQlkZXZfZXJyKERFViwgImRyYmRfcnNfY29tcGxldGVfaW8oLCVsbHUgWz0ldV0pIGNhbGxlZCwgIgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPmFsX2xvY2ssIGZsYWdzKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiZHJiZF9yc19jb21wbGV0ZV9pbygsJWxsdSBbPSV1XSkgY2FsbGVkLCAiCiAJCSAgICAiYnV0IHJlZmNudCBpcyAwIT9cbiIsCiAJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXNlY3RvciwgZW5yKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChsY19wdXQobWRldi0+cmVzeW5jLCAmYm1fZXh0LT5sY2UpID09IDApIHsKKwlpZiAobGNfcHV0KGRldmljZS0+cmVzeW5jLCAmYm1fZXh0LT5sY2UpID09IDApIHsKIAkJYm1fZXh0LT5mbGFncyA9IDA7IC8qIGNsZWFyIEJNRV9MT0NLRUQsIEJNRV9OT19XUklURVMgYW5kIEJNRV9QUklPUklUWSAqLwotCQltZGV2LT5yZXN5bmNfbG9ja2VkLS07Ci0JCXdha2VfdXAoJm1kZXYtPmFsX3dhaXQpOworCQlkZXZpY2UtPnJlc3luY19sb2NrZWQtLTsKKwkJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT5hbF9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5hbF9sb2NrLCBmbGFncyk7CiB9CiAKIC8qKgogICogZHJiZF9yc19jYW5jZWxfYWxsKCkgLSBSZW1vdmVzIGFsbCBleHRlbnRzIGZyb20gdGhlIHJlc3luYyBMUlUgKGV2ZW4gQk1FX0xPQ0tFRCkKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICovCi12b2lkIGRyYmRfcnNfY2FuY2VsX2FsbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX3JzX2NhbmNlbF9hbGwoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAotCWlmIChnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0ZBSUxFRCkpIHsgLyogTWFrZXMgc3VyZSAtPnJlc3luYyBpcyB0aGVyZS4gKi8KLQkJbGNfcmVzZXQobWRldi0+cmVzeW5jKTsKLQkJcHV0X2xkZXYobWRldik7CisJaWYgKGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKSB7IC8qIE1ha2VzIHN1cmUgLT5yZXN5bmMgaXMgdGhlcmUuICovCisJCWxjX3Jlc2V0KGRldmljZS0+cmVzeW5jKTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9Ci0JbWRldi0+cmVzeW5jX2xvY2tlZCA9IDA7Ci0JbWRldi0+cmVzeW5jX3dlbnIgPSBMQ19GUkVFOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7Ci0Jd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJZGV2aWNlLT5yZXN5bmNfbG9ja2VkID0gMDsKKwlkZXZpY2UtPnJlc3luY193ZW5yID0gTENfRlJFRTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CisJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKIH0KIAogLyoqCiAgKiBkcmJkX3JzX2RlbF9hbGwoKSAtIEdyYWNlZnVsbHkgcmVtb3ZlIGFsbCBleHRlbnRzIGZyb20gdGhlIHJlc3luYyBMUlUKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIFJldHVybnMgMCB1cG9uIHN1Y2Nlc3MsIC1FQUdBSU4gaWYgYXQgbGVhc3Qgb25lIHJlZmVyZW5jZSBjb3VudCB3YXMKICAqIG5vdCB6ZXJvLgogICovCi1pbnQgZHJiZF9yc19kZWxfYWxsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitpbnQgZHJiZF9yc19kZWxfYWxsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBsY19lbGVtZW50ICplOwogCXN0cnVjdCBibV9leHRlbnQgKmJtX2V4dDsKIAlpbnQgaTsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAKLQlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9GQUlMRUQpKSB7CisJaWYgKGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKSB7CiAJCS8qIG9rLCAtPnJlc3luYyBpcyB0aGVyZS4gKi8KLQkJZm9yIChpID0gMDsgaSA8IG1kZXYtPnJlc3luYy0+bnJfZWxlbWVudHM7IGkrKykgewotCQkJZSA9IGxjX2VsZW1lbnRfYnlfaW5kZXgobWRldi0+cmVzeW5jLCBpKTsKKwkJZm9yIChpID0gMDsgaSA8IGRldmljZS0+cmVzeW5jLT5ucl9lbGVtZW50czsgaSsrKSB7CisJCQllID0gbGNfZWxlbWVudF9ieV9pbmRleChkZXZpY2UtPnJlc3luYywgaSk7CiAJCQlibV9leHQgPSBsY19lbnRyeShlLCBzdHJ1Y3QgYm1fZXh0ZW50LCBsY2UpOwogCQkJaWYgKGJtX2V4dC0+bGNlLmxjX251bWJlciA9PSBMQ19GUkVFKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKGJtX2V4dC0+bGNlLmxjX251bWJlciA9PSBtZGV2LT5yZXN5bmNfd2VucikgewotCQkJCWRldl9pbmZvKERFViwgImRyb3BwaW5nICV1IGluIGRyYmRfcnNfZGVsX2FsbCwgYXBwYXJlbnRseSIKKwkJCWlmIChibV9leHQtPmxjZS5sY19udW1iZXIgPT0gZGV2aWNlLT5yZXN5bmNfd2VucikgeworCQkJCWRyYmRfaW5mbyhkZXZpY2UsICJkcm9wcGluZyAldSBpbiBkcmJkX3JzX2RlbF9hbGwsIGFwcGFyZW50bHkiCiAJCQkJICAgICAiIGdvdCAnc3luY2VkJyBieSBhcHBsaWNhdGlvbiBpb1xuIiwKLQkJCQkgICAgIG1kZXYtPnJlc3luY193ZW5yKTsKLQkJCQlEX0FTU0VSVCghdGVzdF9iaXQoQk1FX0xPQ0tFRCwgJmJtX2V4dC0+ZmxhZ3MpKTsKLQkJCQlEX0FTU0VSVCh0ZXN0X2JpdChCTUVfTk9fV1JJVEVTLCAmYm1fZXh0LT5mbGFncykpOworCQkJCSAgICAgZGV2aWNlLT5yZXN5bmNfd2Vucik7CisJCQkJRF9BU1NFUlQoZGV2aWNlLCAhdGVzdF9iaXQoQk1FX0xPQ0tFRCwgJmJtX2V4dC0+ZmxhZ3MpKTsKKwkJCQlEX0FTU0VSVChkZXZpY2UsIHRlc3RfYml0KEJNRV9OT19XUklURVMsICZibV9leHQtPmZsYWdzKSk7CiAJCQkJY2xlYXJfYml0KEJNRV9OT19XUklURVMsICZibV9leHQtPmZsYWdzKTsKLQkJCQltZGV2LT5yZXN5bmNfd2VuciA9IExDX0ZSRUU7Ci0JCQkJbGNfcHV0KG1kZXYtPnJlc3luYywgJmJtX2V4dC0+bGNlKTsKKwkJCQlkZXZpY2UtPnJlc3luY193ZW5yID0gTENfRlJFRTsKKwkJCQlsY19wdXQoZGV2aWNlLT5yZXN5bmMsICZibV9leHQtPmxjZSk7CiAJCQl9CiAJCQlpZiAoYm1fZXh0LT5sY2UucmVmY250ICE9IDApIHsKLQkJCQlkZXZfaW5mbyhERVYsICJSZXRyeWluZyBkcmJkX3JzX2RlbF9hbGwoKSBsYXRlci4gIgorCQkJCWRyYmRfaW5mbyhkZXZpY2UsICJSZXRyeWluZyBkcmJkX3JzX2RlbF9hbGwoKSBsYXRlci4gIgogCQkJCSAgICAgInJlZmNudD0lZFxuIiwgYm1fZXh0LT5sY2UucmVmY250KTsKLQkJCQlwdXRfbGRldihtZGV2KTsKLQkJCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCQkJCXB1dF9sZGV2KGRldmljZSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPmFsX2xvY2spOwogCQkJCXJldHVybiAtRUFHQUlOOwogCQkJfQotCQkJRF9BU1NFUlQoIXRlc3RfYml0KEJNRV9MT0NLRUQsICZibV9leHQtPmZsYWdzKSk7Ci0JCQlEX0FTU0VSVCghdGVzdF9iaXQoQk1FX05PX1dSSVRFUywgJmJtX2V4dC0+ZmxhZ3MpKTsKLQkJCWxjX2RlbChtZGV2LT5yZXN5bmMsICZibV9leHQtPmxjZSk7CisJCQlEX0FTU0VSVChkZXZpY2UsICF0ZXN0X2JpdChCTUVfTE9DS0VELCAmYm1fZXh0LT5mbGFncykpOworCQkJRF9BU1NFUlQoZGV2aWNlLCAhdGVzdF9iaXQoQk1FX05PX1dSSVRFUywgJmJtX2V4dC0+ZmxhZ3MpKTsKKwkJCWxjX2RlbChkZXZpY2UtPnJlc3luYywgJmJtX2V4dC0+bGNlKTsKIAkJfQotCQlEX0FTU0VSVChtZGV2LT5yZXN5bmMtPnVzZWQgPT0gMCk7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlEX0FTU0VSVChkZXZpY2UsIGRldmljZS0+cmVzeW5jLT51c2VkID09IDApOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOwotCXdha2VfdXAoJm1kZXYtPmFsX3dhaXQpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKKwl3YWtlX3VwKCZkZXZpY2UtPmFsX3dhaXQpOwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qKgogICogZHJiZF9yc19mYWlsZWRfaW8oKSAtIFJlY29yZCBpbmZvcm1hdGlvbiBvbiBhIGZhaWx1cmUgdG8gcmVzeW5jIHRoZSBzcGVjaWZpZWQgYmxvY2tzCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBzZWN0b3I6CVRoZSBzZWN0b3IgbnVtYmVyLgogICogQHNpemU6CVNpemUgb2YgZmFpbGVkIElPIG9wZXJhdGlvbiwgaW4gYnl0ZS4KICAqLwotdm9pZCBkcmJkX3JzX2ZhaWxlZF9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplKQordm9pZCBkcmJkX3JzX2ZhaWxlZF9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSkKIHsKIAkvKiBJcyBjYWxsZWQgZnJvbSB3b3JrZXIgYW5kIHJlY2VpdmVyIGNvbnRleHQgX29ubHlfICovCiAJdW5zaWduZWQgbG9uZyBzYm5yLCBlYm5yLCBsYm5yOwpAQCAtMTI4NCwxMSArMTI4OSwxMSBAQAogCWludCB3YWtlX3VwID0gMDsKIAogCWlmIChzaXplIDw9IDAgfHwgIUlTX0FMSUdORUQoc2l6ZSwgNTEyKSB8fCBzaXplID4gRFJCRF9NQVhfQklPX1NJWkUpIHsKLQkJZGV2X2VycihERVYsICJkcmJkX3JzX2ZhaWxlZF9pbzogc2VjdG9yPSVsbHVzIHNpemU9JWQgbm9uc2Vuc2UhXG4iLAorCQlkcmJkX2VycihkZXZpY2UsICJkcmJkX3JzX2ZhaWxlZF9pbzogc2VjdG9yPSVsbHVzIHNpemU9JWQgbm9uc2Vuc2UhXG4iLAogCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLCBzaXplKTsKIAkJcmV0dXJuOwogCX0KLQlucl9zZWN0b3JzID0gZHJiZF9nZXRfY2FwYWNpdHkobWRldi0+dGhpc19iZGV2KTsKKwlucl9zZWN0b3JzID0gZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT50aGlzX2JkZXYpOwogCWVzZWN0b3IgPSBzZWN0b3IgKyAoc2l6ZSA+PiA5KSAtIDE7CiAKIAlpZiAoIWV4cGVjdChzZWN0b3IgPCBucl9zZWN0b3JzKSkKQEAgLTEzMTYsMjEgKzEzMjEsMjEgQEAKIAkgKiBvaywgKGNhcGFjaXR5ICYgNykgIT0gMCBzb21ldGltZXMsIGJ1dCB3aG8gY2FyZXMuLi4KIAkgKiB3ZSBjb3VudCByc197dG90YWwsbGVmdH0gaW4gYml0cywgbm90IHNlY3RvcnMuCiAJICovCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7Ci0JY291bnQgPSBkcmJkX2JtX2NvdW50X2JpdHMobWRldiwgc2JuciwgZWJucik7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKKwljb3VudCA9IGRyYmRfYm1fY291bnRfYml0cyhkZXZpY2UsIHNibnIsIGVibnIpOwogCWlmIChjb3VudCkgewotCQltZGV2LT5yc19mYWlsZWQgKz0gY291bnQ7CisJCWRldmljZS0+cnNfZmFpbGVkICs9IGNvdW50OwogCi0JCWlmIChnZXRfbGRldihtZGV2KSkgewotCQkJZHJiZF90cnlfY2xlYXJfb25fZGlza19ibShtZGV2LCBzZWN0b3IsIGNvdW50LCBmYWxzZSk7Ci0JCQlwdXRfbGRldihtZGV2KTsKKwkJaWYgKGdldF9sZGV2KGRldmljZSkpIHsKKwkJCWRyYmRfdHJ5X2NsZWFyX29uX2Rpc2tfYm0oZGV2aWNlLCBzZWN0b3IsIGNvdW50LCBmYWxzZSk7CisJCQlwdXRfbGRldihkZXZpY2UpOwogCQl9CiAKIAkJLyoganVzdCB3YWtlX3VwIHVuY29uZGl0aW9uYWwgbm93LCB2YXJpb3VzIGxjX2NoYWdlZCgpLAogCQkgKiBsY19wdXQoKSBpbiBkcmJkX3RyeV9jbGVhcl9vbl9kaXNrX2JtKCkuICovCiAJCXdha2VfdXAgPSAxOwogCX0KLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAlpZiAod2FrZV91cCkKLQkJd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJCXdha2VfdXAoJmRldmljZS0+YWxfd2FpdCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9iaXRtYXAuYyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2JpdG1hcC5jCmluZGV4IDU5N2YxMTEuLjFhYTI5ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2JpdG1hcC5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2JpdG1hcC5jCkBAIC0xMTMsNTQgKzExMyw1NCBAQAogfTsKIAogI2RlZmluZSBibV9wcmludF9sb2NrX2luZm8obSkgX19ibV9wcmludF9sb2NrX2luZm8obSwgX19mdW5jX18pCi1zdGF0aWMgdm9pZCBfX2JtX3ByaW50X2xvY2tfaW5mbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCBjaGFyICpmdW5jKQorc3RhdGljIHZvaWQgX19ibV9wcmludF9sb2NrX2luZm8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNvbnN0IGNoYXIgKmZ1bmMpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCWlmICghX19yYXRlbGltaXQoJmRyYmRfcmF0ZWxpbWl0X3N0YXRlKSkKIAkJcmV0dXJuOwotCWRldl9lcnIoREVWLCAiRklYTUUgJXMgaW4gJXMsIGJpdG1hcCBsb2NrZWQgZm9yICclcycgYnkgJXNcbiIsCi0JCWRyYmRfdGFza190b190aHJlYWRfbmFtZShtZGV2LT50Y29ubiwgY3VycmVudCksCi0JCWZ1bmMsIGItPmJtX3doeSA/OiAiPyIsCi0JCWRyYmRfdGFza190b190aHJlYWRfbmFtZShtZGV2LT50Y29ubiwgYi0+Ym1fdGFzaykpOworCWRyYmRfZXJyKGRldmljZSwgIkZJWE1FICVzWyVkXSBpbiAlcywgYml0bWFwIGxvY2tlZCBmb3IgJyVzJyBieSAlc1slZF1cbiIsCisJCSBjdXJyZW50LT5jb21tLCB0YXNrX3BpZF9ucihjdXJyZW50KSwKKwkJIGZ1bmMsIGItPmJtX3doeSA/OiAiPyIsCisJCSBiLT5ibV90YXNrLT5jb21tLCB0YXNrX3BpZF9ucihiLT5ibV90YXNrKSk7CiB9CiAKLXZvaWQgZHJiZF9ibV9sb2NrKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNoYXIgKndoeSwgZW51bSBibV9mbGFnIGZsYWdzKQordm9pZCBkcmJkX2JtX2xvY2soc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNoYXIgKndoeSwgZW51bSBibV9mbGFnIGZsYWdzKQogewotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAlpbnQgdHJ5bG9ja19mYWlsZWQ7CiAKIAlpZiAoIWIpIHsKLQkJZGV2X2VycihERVYsICJGSVhNRSBubyBiaXRtYXAgaW4gZHJiZF9ibV9sb2NrIT9cbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJGSVhNRSBubyBiaXRtYXAgaW4gZHJiZF9ibV9sb2NrIT9cbiIpOwogCQlyZXR1cm47CiAJfQogCiAJdHJ5bG9ja19mYWlsZWQgPSAhbXV0ZXhfdHJ5bG9jaygmYi0+Ym1fY2hhbmdlKTsKIAogCWlmICh0cnlsb2NrX2ZhaWxlZCkgewotCQlkZXZfd2FybihERVYsICIlcyBnb2luZyB0byAnJXMnIGJ1dCBiaXRtYXAgYWxyZWFkeSBsb2NrZWQgZm9yICclcycgYnkgJXNcbiIsCi0JCQkgZHJiZF90YXNrX3RvX3RocmVhZF9uYW1lKG1kZXYtPnRjb25uLCBjdXJyZW50KSwKLQkJCSB3aHksIGItPmJtX3doeSA/OiAiPyIsCi0JCQkgZHJiZF90YXNrX3RvX3RocmVhZF9uYW1lKG1kZXYtPnRjb25uLCBiLT5ibV90YXNrKSk7CisJCWRyYmRfd2FybihkZXZpY2UsICIlc1slZF0gZ29pbmcgdG8gJyVzJyBidXQgYml0bWFwIGFscmVhZHkgbG9ja2VkIGZvciAnJXMnIGJ5ICVzWyVkXVxuIiwKKwkJCSAgY3VycmVudC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVudCksCisJCQkgIHdoeSwgYi0+Ym1fd2h5ID86ICI/IiwKKwkJCSAgYi0+Ym1fdGFzay0+Y29tbSwgdGFza19waWRfbnIoYi0+Ym1fdGFzaykpOwogCQltdXRleF9sb2NrKCZiLT5ibV9jaGFuZ2UpOwogCX0KIAlpZiAoQk1fTE9DS0VEX01BU0sgJiBiLT5ibV9mbGFncykKLQkJZGV2X2VycihERVYsICJGSVhNRSBiaXRtYXAgYWxyZWFkeSBsb2NrZWQgaW4gYm1fbG9ja1xuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkZJWE1FIGJpdG1hcCBhbHJlYWR5IGxvY2tlZCBpbiBibV9sb2NrXG4iKTsKIAliLT5ibV9mbGFncyB8PSBmbGFncyAmIEJNX0xPQ0tFRF9NQVNLOwogCiAJYi0+Ym1fd2h5ICA9IHdoeTsKIAliLT5ibV90YXNrID0gY3VycmVudDsKIH0KIAotdm9pZCBkcmJkX2JtX3VubG9jayhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX2JtX3VubG9jayhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJaWYgKCFiKSB7Ci0JCWRldl9lcnIoREVWLCAiRklYTUUgbm8gYml0bWFwIGluIGRyYmRfYm1fdW5sb2NrIT9cbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJGSVhNRSBubyBiaXRtYXAgaW4gZHJiZF9ibV91bmxvY2shP1xuIik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoIShCTV9MT0NLRURfTUFTSyAmIG1kZXYtPmJpdG1hcC0+Ym1fZmxhZ3MpKQotCQlkZXZfZXJyKERFViwgIkZJWE1FIGJpdG1hcCBub3QgbG9ja2VkIGluIGJtX3VubG9ja1xuIik7CisJaWYgKCEoQk1fTE9DS0VEX01BU0sgJiBkZXZpY2UtPmJpdG1hcC0+Ym1fZmxhZ3MpKQorCQlkcmJkX2VycihkZXZpY2UsICJGSVhNRSBiaXRtYXAgbm90IGxvY2tlZCBpbiBibV91bmxvY2tcbiIpOwogCiAJYi0+Ym1fZmxhZ3MgJj0gfkJNX0xPQ0tFRF9NQVNLOwogCWItPmJtX3doeSAgPSBOVUxMOwpAQCAtMjExLDE5ICsyMTEsMTkgQEAKIC8qIEFzIGlzIHZlcnkgdW5saWtlbHkgdGhhdCB0aGUgc2FtZSBwYWdlIGlzIHVuZGVyIElPIGZyb20gbW9yZSB0aGFuIG9uZQogICogY29udGV4dCwgd2UgY2FuIGdldCBhd2F5IHdpdGggYSBiaXQgcGVyIHBhZ2UgYW5kIG9uZSB3YWl0IHF1ZXVlIHBlciBiaXRtYXAuCiAgKi8KLXN0YXRpYyB2b2lkIGJtX3BhZ2VfbG9ja19pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgcGFnZV9ucikKK3N0YXRpYyB2b2lkIGJtX3BhZ2VfbG9ja19pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IHBhZ2VfbnIpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCXZvaWQgKmFkZHIgPSAmcGFnZV9wcml2YXRlKGItPmJtX3BhZ2VzW3BhZ2VfbnJdKTsKIAl3YWl0X2V2ZW50KGItPmJtX2lvX3dhaXQsICF0ZXN0X2FuZF9zZXRfYml0KEJNX1BBR0VfSU9fTE9DSywgYWRkcikpOwogfQogCi1zdGF0aWMgdm9pZCBibV9wYWdlX3VubG9ja19pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgcGFnZV9ucikKK3N0YXRpYyB2b2lkIGJtX3BhZ2VfdW5sb2NrX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgcGFnZV9ucikKIHsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJdm9pZCAqYWRkciA9ICZwYWdlX3ByaXZhdGUoYi0+Ym1fcGFnZXNbcGFnZV9ucl0pOwogCWNsZWFyX2JpdF91bmxvY2soQk1fUEFHRV9JT19MT0NLLCBhZGRyKTsKLQl3YWtlX3VwKCZtZGV2LT5iaXRtYXAtPmJtX2lvX3dhaXQpOworCXdha2VfdXAoJmRldmljZS0+Yml0bWFwLT5ibV9pb193YWl0KTsKIH0KIAogLyogc2V0IF9iZWZvcmVfIHN1Ym1pdF9pbywgc28gaXQgbWF5IGJlIHJlc2V0IGR1ZSB0byBiZWluZyBjaGFuZ2VkCkBAIC0yNDIsMjIgKzI0MiwyMiBAQAogCiAvKioKICAqIGRyYmRfYm1fbWFya19mb3Jfd3JpdGVvdXQoKSAtIG1hcmsgYSBwYWdlIHdpdGggYSAiaGludCIgdG8gYmUgY29uc2lkZXJlZCBmb3Igd3JpdGVvdXQKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQHBhZ2VfbnI6CXRoZSBiaXRtYXAgcGFnZSB0byBtYXJrIHdpdGggdGhlICJoaW50IiBmbGFnCiAgKgogICogRnJvbSB3aXRoaW4gYW4gYWN0aXZpdHkgbG9nIHRyYW5zYWN0aW9uLCB3ZSBtYXJrIGEgZmV3IHBhZ2VzIHdpdGggdGhlc2UKICAqIGhpbnRzLCB0aGVuIGNhbGwgZHJiZF9ibV93cml0ZV9oaW50ZWQoKSwgd2hpY2ggd2lsbCBvbmx5IHdyaXRlIG91dCBjaGFuZ2VkCiAgKiBwYWdlcyB3aGljaCBhcmUgZmxhZ2dlZCB3aXRoIHRoaXMgbWFyay4KICAqLwotdm9pZCBkcmJkX2JtX21hcmtfZm9yX3dyaXRlb3V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBwYWdlX25yKQordm9pZCBkcmJkX2JtX21hcmtfZm9yX3dyaXRlb3V0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgcGFnZV9ucikKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlpZiAocGFnZV9uciA+PSBtZGV2LT5iaXRtYXAtPmJtX251bWJlcl9vZl9wYWdlcykgewotCQlkZXZfd2FybihERVYsICJCQUQ6IHBhZ2VfbnI6ICV1LCBudW1iZXJfb2ZfcGFnZXM6ICV1XG4iLAotCQkJIHBhZ2VfbnIsIChpbnQpbWRldi0+Yml0bWFwLT5ibV9udW1iZXJfb2ZfcGFnZXMpOworCWlmIChwYWdlX25yID49IGRldmljZS0+Yml0bWFwLT5ibV9udW1iZXJfb2ZfcGFnZXMpIHsKKwkJZHJiZF93YXJuKGRldmljZSwgIkJBRDogcGFnZV9ucjogJXUsIG51bWJlcl9vZl9wYWdlczogJXVcbiIsCisJCQkgcGFnZV9uciwgKGludClkZXZpY2UtPmJpdG1hcC0+Ym1fbnVtYmVyX29mX3BhZ2VzKTsKIAkJcmV0dXJuOwogCX0KLQlwYWdlID0gbWRldi0+Yml0bWFwLT5ibV9wYWdlc1twYWdlX25yXTsKKwlwYWdlID0gZGV2aWNlLT5iaXRtYXAtPmJtX3BhZ2VzW3BhZ2VfbnJdOwogCXNldF9iaXQoQk1fUEFHRV9ISU5UX1dSSVRFT1VULCAmcGFnZV9wcml2YXRlKHBhZ2UpKTsKIH0KIApAQCAtMzQwLDcgKzM0MCw3IEBACiAKIC8qCiAgKiBhY3R1YWxseSBtb3N0IGZ1bmN0aW9ucyBoZXJlaW4gc2hvdWxkIHRha2UgYSBzdHJ1Y3QgZHJiZF9iaXRtYXAqLCBub3QgYQotICogc3RydWN0IGRyYmRfY29uZiosIGJ1dCBmb3IgdGhlIGRlYnVnIG1hY3JvcyBJIGxpa2UgdG8gaGF2ZSB0aGUgbWRldiBhcm91bmQKKyAqIHN0cnVjdCBkcmJkX2RldmljZSosIGJ1dCBmb3IgdGhlIGRlYnVnIG1hY3JvcyBJIGxpa2UgdG8gaGF2ZSB0aGUgZGV2aWNlIGFyb3VuZAogICogdG8gYmUgYWJsZSB0byByZXBvcnQgZGV2aWNlIHNwZWNpZmljLgogICovCiAKQEAgLTQzNiwxMSArNDM2LDExIEBACiAKIC8qCiAgKiBjYWxsZWQgb24gZHJpdmVyIGluaXQgb25seS4gVE9ETyBjYWxsIHdoZW4gYSBkZXZpY2UgaXMgY3JlYXRlZC4KLSAqIGFsbG9jYXRlcyB0aGUgZHJiZF9iaXRtYXAsIGFuZCBzdG9yZXMgaXQgaW4gbWRldi0+Yml0bWFwLgorICogYWxsb2NhdGVzIHRoZSBkcmJkX2JpdG1hcCwgYW5kIHN0b3JlcyBpdCBpbiBkZXZpY2UtPmJpdG1hcC4KICAqLwotaW50IGRyYmRfYm1faW5pdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQoraW50IGRyYmRfYm1faW5pdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJV0FSTl9PTihiICE9IE5VTEwpOwogCWIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJiZF9iaXRtYXApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWIpCkBAIC00NDksMjggKzQ0OSwyOCBAQAogCW11dGV4X2luaXQoJmItPmJtX2NoYW5nZSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmYi0+Ym1faW9fd2FpdCk7CiAKLQltZGV2LT5iaXRtYXAgPSBiOworCWRldmljZS0+Yml0bWFwID0gYjsKIAogCXJldHVybiAwOwogfQogCi1zZWN0b3JfdCBkcmJkX2JtX2NhcGFjaXR5KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzZWN0b3JfdCBkcmJkX2JtX2NhcGFjaXR5KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCWlmICghZXhwZWN0KG1kZXYtPmJpdG1hcCkpCisJaWYgKCFleHBlY3QoZGV2aWNlLT5iaXRtYXApKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gbWRldi0+Yml0bWFwLT5ibV9kZXZfY2FwYWNpdHk7CisJcmV0dXJuIGRldmljZS0+Yml0bWFwLT5ibV9kZXZfY2FwYWNpdHk7CiB9CiAKIC8qIGNhbGxlZCBvbiBkcml2ZXIgdW5sb2FkLiBUT0RPOiBjYWxsIHdoZW4gYSBkZXZpY2UgaXMgZGVzdHJveWVkLgogICovCi12b2lkIGRyYmRfYm1fY2xlYW51cChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX2JtX2NsZWFudXAoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaWYgKCFleHBlY3QobWRldi0+Yml0bWFwKSkKKwlpZiAoIWV4cGVjdChkZXZpY2UtPmJpdG1hcCkpCiAJCXJldHVybjsKLQlibV9mcmVlX3BhZ2VzKG1kZXYtPmJpdG1hcC0+Ym1fcGFnZXMsIG1kZXYtPmJpdG1hcC0+Ym1fbnVtYmVyX29mX3BhZ2VzKTsKLQlibV92a19mcmVlKG1kZXYtPmJpdG1hcC0+Ym1fcGFnZXMsIChCTV9QX1ZNQUxMT0NFRCAmIG1kZXYtPmJpdG1hcC0+Ym1fZmxhZ3MpKTsKLQlrZnJlZShtZGV2LT5iaXRtYXApOwotCW1kZXYtPmJpdG1hcCA9IE5VTEw7CisJYm1fZnJlZV9wYWdlcyhkZXZpY2UtPmJpdG1hcC0+Ym1fcGFnZXMsIGRldmljZS0+Yml0bWFwLT5ibV9udW1iZXJfb2ZfcGFnZXMpOworCWJtX3ZrX2ZyZWUoZGV2aWNlLT5iaXRtYXAtPmJtX3BhZ2VzLCAoQk1fUF9WTUFMTE9DRUQgJiBkZXZpY2UtPmJpdG1hcC0+Ym1fZmxhZ3MpKTsKKwlrZnJlZShkZXZpY2UtPmJpdG1hcCk7CisJZGV2aWNlLT5iaXRtYXAgPSBOVUxMOwogfQogCiAvKgpAQCAtNjMxLDkgKzYzMSw5IEBACiAgKiBJbiBjYXNlIHRoaXMgaXMgYWN0dWFsbHkgYSByZXNpemUsIHdlIGNvcHkgdGhlIG9sZCBiaXRtYXAgaW50byB0aGUgbmV3IG9uZS4KICAqIE90aGVyd2lzZSwgdGhlIGJpdG1hcCBpcyBpbml0aWFsaXplZCB0byBhbGwgYml0cyBzZXQuCiAgKi8KLWludCBkcmJkX2JtX3Jlc2l6ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBjYXBhY2l0eSwgaW50IHNldF9uZXdfYml0cykKK2ludCBkcmJkX2JtX3Jlc2l6ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3QgY2FwYWNpdHksIGludCBzZXRfbmV3X2JpdHMpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCXVuc2lnbmVkIGxvbmcgYml0cywgd29yZHMsIG93b3Jkcywgb2JpdHM7CiAJdW5zaWduZWQgbG9uZyB3YW50LCBoYXZlLCBvbnBhZ2VzOyAvKiBudW1iZXIgb2YgcGFnZXMgKi8KIAlzdHJ1Y3QgcGFnZSAqKm5wYWdlcywgKipvcGFnZXMgPSBOVUxMOwpAQCAtNjQzLDkgKzY0Myw5IEBACiAJaWYgKCFleHBlY3QoYikpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZHJiZF9ibV9sb2NrKG1kZXYsICJyZXNpemUiLCBCTV9MT0NLRURfTUFTSyk7CisJZHJiZF9ibV9sb2NrKGRldmljZSwgInJlc2l6ZSIsIEJNX0xPQ0tFRF9NQVNLKTsKIAotCWRldl9pbmZvKERFViwgImRyYmRfYm1fcmVzaXplIGNhbGxlZCB3aXRoIGNhcGFjaXR5ID09ICVsbHVcbiIsCisJZHJiZF9pbmZvKGRldmljZSwgImRyYmRfYm1fcmVzaXplIGNhbGxlZCB3aXRoIGNhcGFjaXR5ID09ICVsbHVcbiIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKWNhcGFjaXR5KTsKIAogCWlmIChjYXBhY2l0eSA9PSBiLT5ibV9kZXZfY2FwYWNpdHkpCkBAIC02NzgsMTIgKzY3OCwxMiBAQAogCSovCiAJd29yZHMgPSBBTElHTihiaXRzLCA2NCkgPj4gTE4yX0JQTDsKIAotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQl1NjQgYml0c19vbl9kaXNrID0gZHJiZF9tZF9vbl9kaXNrX2JpdHMobWRldi0+bGRldik7Ci0JCXB1dF9sZGV2KG1kZXYpOworCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CisJCXU2NCBiaXRzX29uX2Rpc2sgPSBkcmJkX21kX29uX2Rpc2tfYml0cyhkZXZpY2UtPmxkZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCQlpZiAoYml0cyA+IGJpdHNfb25fZGlzaykgewotCQkJZGV2X2luZm8oREVWLCAiYml0cyA9ICVsdVxuIiwgYml0cyk7Ci0JCQlkZXZfaW5mbyhERVYsICJiaXRzX29uX2Rpc2sgPSAlbGx1XG4iLCBiaXRzX29uX2Rpc2spOworCQkJZHJiZF9pbmZvKGRldmljZSwgImJpdHMgPSAlbHVcbiIsIGJpdHMpOworCQkJZHJiZF9pbmZvKGRldmljZSwgImJpdHNfb25fZGlzayA9ICVsbHVcbiIsIGJpdHNfb25fZGlzayk7CiAJCQllcnIgPSAtRU5PU1BDOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTY5MiwxMCArNjkyLDEwIEBACiAJd2FudCA9IEFMSUdOKHdvcmRzKnNpemVvZihsb25nKSwgUEFHRV9TSVpFKSA+PiBQQUdFX1NISUZUOwogCWhhdmUgPSBiLT5ibV9udW1iZXJfb2ZfcGFnZXM7CiAJaWYgKHdhbnQgPT0gaGF2ZSkgewotCQlEX0FTU0VSVChiLT5ibV9wYWdlcyAhPSBOVUxMKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCBiLT5ibV9wYWdlcyAhPSBOVUxMKTsKIAkJbnBhZ2VzID0gYi0+Ym1fcGFnZXM7CiAJfSBlbHNlIHsKLQkJaWYgKGRyYmRfaW5zZXJ0X2ZhdWx0KG1kZXYsIERSQkRfRkFVTFRfQk1fQUxMT0MpKQorCQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQoZGV2aWNlLCBEUkJEX0ZBVUxUX0JNX0FMTE9DKSkKIAkJCW5wYWdlcyA9IE5VTEw7CiAJCWVsc2UKIAkJCW5wYWdlcyA9IGJtX3JlYWxsb2NfcGFnZXMoYiwgd2FudCk7CkBAIC03NDIsMTAgKzc0MiwxMCBAQAogCQlibV92a19mcmVlKG9wYWdlcywgb3BhZ2VzX3ZtYWxsb2NlZCk7CiAJaWYgKCFncm93aW5nKQogCQliLT5ibV9zZXQgPSBibV9jb3VudF9iaXRzKGIpOwotCWRldl9pbmZvKERFViwgInJlc3luYyBiaXRtYXA6IGJpdHM9JWx1IHdvcmRzPSVsdSBwYWdlcz0lbHVcbiIsIGJpdHMsIHdvcmRzLCB3YW50KTsKKwlkcmJkX2luZm8oZGV2aWNlLCAicmVzeW5jIGJpdG1hcDogYml0cz0lbHUgd29yZHM9JWx1IHBhZ2VzPSVsdVxuIiwgYml0cywgd29yZHMsIHdhbnQpOwogCiAgb3V0OgotCWRyYmRfYm1fdW5sb2NrKG1kZXYpOworCWRyYmRfYm1fdW5sb2NrKGRldmljZSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNzU3LDkgKzc1Nyw5IEBACiAgKgogICogbWF5YmUgYm1fc2V0IHNob3VsZCBiZSBhdG9taWNfdCA/CiAgKi8KLXVuc2lnbmVkIGxvbmcgX2RyYmRfYm1fdG90YWxfd2VpZ2h0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit1bnNpZ25lZCBsb25nIF9kcmJkX2JtX3RvdGFsX3dlaWdodChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJdW5zaWduZWQgbG9uZyBzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTc3NSwyMCArNzc1LDIwIEBACiAJcmV0dXJuIHM7CiB9CiAKLXVuc2lnbmVkIGxvbmcgZHJiZF9ibV90b3RhbF93ZWlnaHQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3Vuc2lnbmVkIGxvbmcgZHJiZF9ibV90b3RhbF93ZWlnaHQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJdW5zaWduZWQgbG9uZyBzOwogCS8qIGlmIEkgZG9uJ3QgaGF2ZSBhIGRpc2ssIEkgZG9uJ3Qga25vdyBhYm91dCBvdXQtb2Ytc3luYyBzdGF0dXMgKi8KLQlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfTkVHT1RJQVRJTkcpKQorCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX05FR09USUFUSU5HKSkKIAkJcmV0dXJuIDA7Ci0JcyA9IF9kcmJkX2JtX3RvdGFsX3dlaWdodChtZGV2KTsKLQlwdXRfbGRldihtZGV2KTsKKwlzID0gX2RyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSk7CisJcHV0X2xkZXYoZGV2aWNlKTsKIAlyZXR1cm4gczsKIH0KIAotc2l6ZV90IGRyYmRfYm1fd29yZHMoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3NpemVfdCBkcmJkX2JtX3dvcmRzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAlpZiAoIWV4cGVjdChiKSkKIAkJcmV0dXJuIDA7CiAJaWYgKCFleHBlY3QoYi0+Ym1fcGFnZXMpKQpAQCAtNzk3LDkgKzc5Nyw5IEBACiAJcmV0dXJuIGItPmJtX3dvcmRzOwogfQogCi11bnNpZ25lZCBsb25nIGRyYmRfYm1fYml0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordW5zaWduZWQgbG9uZyBkcmJkX2JtX2JpdHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCWlmICghZXhwZWN0KGIpKQogCQlyZXR1cm4gMDsKIApAQCAtODExLDEwICs4MTEsMTAgQEAKICAqIGJpdG1hcCBtdXN0IGJlIGxvY2tlZCBieSBkcmJkX2JtX2xvY2suCiAgKiBjdXJyZW50bHkgb25seSB1c2VkIGZyb20gcmVjZWl2ZV9iaXRtYXAuCiAgKi8KLXZvaWQgZHJiZF9ibV9tZXJnZV9sZWwoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IG51bWJlciwKK3ZvaWQgZHJiZF9ibV9tZXJnZV9sZWwoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBudW1iZXIsCiAJCQl1bnNpZ25lZCBsb25nICpidWZmZXIpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCXVuc2lnbmVkIGxvbmcgKnBfYWRkciwgKmJtOwogCXVuc2lnbmVkIGxvbmcgd29yZCwgYml0czsKIAl1bnNpZ25lZCBpbnQgaWR4OwpAQCAtODYwLDEwICs4NjAsMTAgQEAKIC8qIGNvcHkgbnVtYmVyIHdvcmRzIGZyb20gdGhlIGJpdG1hcCBzdGFydGluZyBhdCBvZmZzZXQgaW50byB0aGUgYnVmZmVyLgogICogYnVmZmVyW2ldIHdpbGwgYmUgbGl0dGxlIGVuZGlhbiB1bnNpZ25lZCBsb25nLgogICovCi12b2lkIGRyYmRfYm1fZ2V0X2xlbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbnVtYmVyLAordm9pZCBkcmJkX2JtX2dldF9sZWwoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBudW1iZXIsCiAJCSAgICAgdW5zaWduZWQgbG9uZyAqYnVmZmVyKQogewotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAl1bnNpZ25lZCBsb25nICpwX2FkZHIsICpibTsKIAlzaXplX3QgZW5kLCBkb19ub3c7CiAKQEAgLTg3OCw3ICs4NzgsNyBAQAogCWlmICgob2Zmc2V0ID49IGItPmJtX3dvcmRzKSB8fAogCSAgICAoZW5kICAgID4gIGItPmJtX3dvcmRzKSB8fAogCSAgICAobnVtYmVyIDw9IDApKQotCQlkZXZfZXJyKERFViwgIm9mZnNldD0lbHUgbnVtYmVyPSVsdSBibV93b3Jkcz0lbHVcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgIm9mZnNldD0lbHUgbnVtYmVyPSVsdSBibV93b3Jkcz0lbHVcbiIsCiAJCQkodW5zaWduZWQgbG9uZykJb2Zmc2V0LAogCQkJKHVuc2lnbmVkIGxvbmcpCW51bWJlciwKIAkJCSh1bnNpZ25lZCBsb25nKSBiLT5ibV93b3Jkcyk7CkBAIC04OTcsOSArODk3LDkgQEAKIH0KIAogLyogc2V0IGFsbCBiaXRzIGluIHRoZSBiaXRtYXAgKi8KLXZvaWQgZHJiZF9ibV9zZXRfYWxsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkIGRyYmRfYm1fc2V0X2FsbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJaWYgKCFleHBlY3QoYikpCiAJCXJldHVybjsKIAlpZiAoIWV4cGVjdChiLT5ibV9wYWdlcykpCkBAIC05MTMsOSArOTEzLDkgQEAKIH0KIAogLyogY2xlYXIgYWxsIGJpdHMgaW4gdGhlIGJpdG1hcCAqLwotdm9pZCBkcmJkX2JtX2NsZWFyX2FsbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX2JtX2NsZWFyX2FsbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJaWYgKCFleHBlY3QoYikpCiAJCXJldHVybjsKIAlpZiAoIWV4cGVjdChiLT5ibV9wYWdlcykpCkBAIC05MjgsNyArOTI4LDcgQEAKIH0KIAogc3RydWN0IGJtX2Fpb19jdHggewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJYXRvbWljX3QgaW5fZmxpZ2h0OwogCXVuc2lnbmVkIGludCBkb25lOwogCXVuc2lnbmVkIGZsYWdzOwpAQCAtOTQzLDcgKzk0Myw3IEBACiB7CiAJc3RydWN0IGJtX2Fpb19jdHggKmN0eCA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgYm1fYWlvX2N0eCwga3JlZik7CiAKLQlwdXRfbGRldihjdHgtPm1kZXYpOworCXB1dF9sZGV2KGN0eC0+ZGV2aWNlKTsKIAlrZnJlZShjdHgpOwogfQogCkBAIC05NTEsOCArOTUxLDggQEAKIHN0YXRpYyB2b2lkIGJtX2FzeW5jX2lvX2NvbXBsZXRlKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycm9yKQogewogCXN0cnVjdCBibV9haW9fY3R4ICpjdHggPSBiaW8tPmJpX3ByaXZhdGU7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IGN0eC0+bWRldjsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBjdHgtPmRldmljZTsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAl1bnNpZ25lZCBpbnQgaWR4ID0gYm1fcGFnZV90b19pZHgoYmlvLT5iaV9pb192ZWNbMF0uYnZfcGFnZSk7CiAJaW50IHVwdG9kYXRlID0gYmlvX2ZsYWdnZWQoYmlvLCBCSU9fVVBUT0RBVEUpOwogCkBAIC05NjYsNyArOTY2LDcgQEAKIAogCWlmICgoY3R4LT5mbGFncyAmIEJNX0FJT19DT1BZX1BBR0VTKSA9PSAwICYmCiAJICAgICFibV90ZXN0X3BhZ2VfdW5jaGFuZ2VkKGItPmJtX3BhZ2VzW2lkeF0pKQotCQlkZXZfd2FybihERVYsICJiaXRtYXAgcGFnZSBpZHggJXUgY2hhbmdlZCBkdXJpbmcgSU8hXG4iLCBpZHgpOworCQlkcmJkX3dhcm4oZGV2aWNlLCAiYml0bWFwIHBhZ2UgaWR4ICV1IGNoYW5nZWQgZHVyaW5nIElPIVxuIiwgaWR4KTsKIAogCWlmIChlcnJvcikgewogCQkvKiBjdHggZXJyb3Igd2lsbCBob2xkIHRoZSBjb21wbGV0ZWQtbGFzdCBub24temVybyBlcnJvciBjb2RlLApAQCAtOTc2LDE0ICs5NzYsMTQgQEAKIAkJLyogTm90IGlkZW50aWNhbCB0byBvbiBkaXNrIHZlcnNpb24gb2YgaXQuCiAJCSAqIElzIEJNX1BBR0VfSU9fRVJST1IgZW5vdWdoPyAqLwogCQlpZiAoX19yYXRlbGltaXQoJmRyYmRfcmF0ZWxpbWl0X3N0YXRlKSkKLQkJCWRldl9lcnIoREVWLCAiSU8gRVJST1IgJWQgb24gYml0bWFwIHBhZ2UgaWR4ICV1XG4iLAorCQkJZHJiZF9lcnIoZGV2aWNlLCAiSU8gRVJST1IgJWQgb24gYml0bWFwIHBhZ2UgaWR4ICV1XG4iLAogCQkJCQllcnJvciwgaWR4KTsKIAl9IGVsc2UgewogCQlibV9jbGVhcl9wYWdlX2lvX2VycihiLT5ibV9wYWdlc1tpZHhdKTsKLQkJZHluYW1pY19kZXZfZGJnKERFViwgImJpdG1hcCBwYWdlIGlkeCAldSBjb21wbGV0ZWRcbiIsIGlkeCk7CisJCWR5bmFtaWNfZHJiZF9kYmcoZGV2aWNlLCAiYml0bWFwIHBhZ2UgaWR4ICV1IGNvbXBsZXRlZFxuIiwgaWR4KTsKIAl9CiAKLQlibV9wYWdlX3VubG9ja19pbyhtZGV2LCBpZHgpOworCWJtX3BhZ2VfdW5sb2NrX2lvKGRldmljZSwgaWR4KTsKIAogCWlmIChjdHgtPmZsYWdzICYgQk1fQUlPX0NPUFlfUEFHRVMpCiAJCW1lbXBvb2xfZnJlZShiaW8tPmJpX2lvX3ZlY1swXS5idl9wYWdlLCBkcmJkX21kX2lvX3BhZ2VfcG9vbCk7CkBAIC05OTIsNyArOTkyLDcgQEAKIAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjdHgtPmluX2ZsaWdodCkpIHsKIAkJY3R4LT5kb25lID0gMTsKLQkJd2FrZV91cCgmbWRldi0+bWlzY193YWl0KTsKKwkJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOwogCQlrcmVmX3B1dCgmY3R4LT5rcmVmLCAmYm1fYWlvX2N0eF9kZXN0cm95KTsKIAl9CiB9CkBAIC0xMDAwLDIzICsxMDAwLDIzIEBACiBzdGF0aWMgdm9pZCBibV9wYWdlX2lvX2FzeW5jKHN0cnVjdCBibV9haW9fY3R4ICpjdHgsIGludCBwYWdlX25yLCBpbnQgcncpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCXN0cnVjdCBiaW8gKmJpbyA9IGJpb19hbGxvY19kcmJkKEdGUF9OT0lPKTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gY3R4LT5tZGV2OwotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IGN0eC0+ZGV2aWNlOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCXVuc2lnbmVkIGludCBsZW47CiAKIAlzZWN0b3JfdCBvbl9kaXNrX3NlY3RvciA9Ci0JCW1kZXYtPmxkZXYtPm1kLm1kX29mZnNldCArIG1kZXYtPmxkZXYtPm1kLmJtX29mZnNldDsKKwkJZGV2aWNlLT5sZGV2LT5tZC5tZF9vZmZzZXQgKyBkZXZpY2UtPmxkZXYtPm1kLmJtX29mZnNldDsKIAlvbl9kaXNrX3NlY3RvciArPSAoKHNlY3Rvcl90KXBhZ2VfbnIpIDw8IChQQUdFX1NISUZULTkpOwogCiAJLyogdGhpcyBtaWdodCBoYXBwZW4gd2l0aCB2ZXJ5IHNtYWxsCiAJICogZmxleGlibGUgZXh0ZXJuYWwgbWV0YSBkYXRhIGRldmljZSwKIAkgKiBvciB3aXRoIFBBR0VfU0laRSA+IDRrICovCiAJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBQQUdFX1NJWkUsCi0JCShkcmJkX21kX2xhc3Rfc2VjdG9yKG1kZXYtPmxkZXYpIC0gb25fZGlza19zZWN0b3IgKyAxKTw8OSk7CisJCShkcmJkX21kX2xhc3Rfc2VjdG9yKGRldmljZS0+bGRldikgLSBvbl9kaXNrX3NlY3RvciArIDEpPDw5KTsKIAogCS8qIHNlcmlhbGl6ZSBJTyBvbiB0aGlzIHBhZ2UgKi8KLQlibV9wYWdlX2xvY2tfaW8obWRldiwgcGFnZV9ucik7CisJYm1fcGFnZV9sb2NrX2lvKGRldmljZSwgcGFnZV9ucik7CiAJLyogYmVmb3JlIG1lbWNweSBhbmQgc3VibWl0LAogCSAqIHNvIGl0IGNhbiBiZSByZWRpcnRpZWQgYW55IHRpbWUgKi8KIAlibV9zZXRfcGFnZV91bmNoYW5nZWQoYi0+Ym1fcGFnZXNbcGFnZV9ucl0pOwpAQCAtMTAyNyw3ICsxMDI3LDcgQEAKIAkJYm1fc3RvcmVfcGFnZV9pZHgocGFnZSwgcGFnZV9ucik7CiAJfSBlbHNlCiAJCXBhZ2UgPSBiLT5ibV9wYWdlc1twYWdlX25yXTsKLQliaW8tPmJpX2JkZXYgPSBtZGV2LT5sZGV2LT5tZF9iZGV2OworCWJpby0+YmlfYmRldiA9IGRldmljZS0+bGRldi0+bWRfYmRldjsKIAliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gb25fZGlza19zZWN0b3I7CiAJLyogYmlvX2FkZF9wYWdlIG9mIGEgc2luZ2xlIHBhZ2UgdG8gYW4gZW1wdHkgYmlvIHdpbGwgYWx3YXlzIHN1Y2NlZWQsCiAJICogYWNjb3JkaW5nIHRvIGFwaS4gIERvIHdlIHdhbnQgdG8gYXNzZXJ0IHRoYXQ/ICovCkBAIC0xMDM1LDI0ICsxMDM1LDI0IEBACiAJYmlvLT5iaV9wcml2YXRlID0gY3R4OwogCWJpby0+YmlfZW5kX2lvID0gYm1fYXN5bmNfaW9fY29tcGxldGU7CiAKLQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQobWRldiwgKHJ3ICYgV1JJVEUpID8gRFJCRF9GQVVMVF9NRF9XUiA6IERSQkRfRkFVTFRfTURfUkQpKSB7CisJaWYgKGRyYmRfaW5zZXJ0X2ZhdWx0KGRldmljZSwgKHJ3ICYgV1JJVEUpID8gRFJCRF9GQVVMVF9NRF9XUiA6IERSQkRfRkFVTFRfTURfUkQpKSB7CiAJCWJpby0+YmlfcncgfD0gcnc7CiAJCWJpb19lbmRpbyhiaW8sIC1FSU8pOwogCX0gZWxzZSB7CiAJCXN1Ym1pdF9iaW8ocncsIGJpbyk7CiAJCS8qIHRoaXMgc2hvdWxkIG5vdCBjb3VudCBhcyB1c2VyIGFjdGl2aXR5IGFuZCBjYXVzZSB0aGUKIAkJICogcmVzeW5jIHRvIHRocm90dGxlIC0tIHNlZSBkcmJkX3JzX3Nob3VsZF9zbG93X2Rvd24oKS4gKi8KLQkJYXRvbWljX2FkZChsZW4gPj4gOSwgJm1kZXYtPnJzX3NlY3RfZXYpOworCQlhdG9taWNfYWRkKGxlbiA+PiA5LCAmZGV2aWNlLT5yc19zZWN0X2V2KTsKIAl9CiB9CiAKIC8qCiAgKiBibV9ydzogcmVhZC93cml0ZSB0aGUgd2hvbGUgYml0bWFwIGZyb20vdG8gaXRzIG9uIGRpc2sgbG9jYXRpb24uCiAgKi8KLXN0YXRpYyBpbnQgYm1fcncoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IHJ3LCB1bnNpZ25lZCBmbGFncywgdW5zaWduZWQgbGF6eV93cml0ZW91dF91cHBlcl9pZHgpIF9fbXVzdF9ob2xkKGxvY2FsKQorc3RhdGljIGludCBibV9ydyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IHJ3LCB1bnNpZ25lZCBmbGFncywgdW5zaWduZWQgbGF6eV93cml0ZW91dF91cHBlcl9pZHgpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCXN0cnVjdCBibV9haW9fY3R4ICpjdHg7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCWludCBudW1fcGFnZXMsIGksIGNvdW50ID0gMDsKIAl1bnNpZ25lZCBsb25nIG5vdzsKIAljaGFyIHBwYlsxMF07CkBAIC0xMDcyLDcgKzEwNzIsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCSpjdHggPSAoc3RydWN0IGJtX2Fpb19jdHgpIHsKLQkJLm1kZXYgPSBtZGV2LAorCQkuZGV2aWNlID0gZGV2aWNlLAogCQkuaW5fZmxpZ2h0ID0gQVRPTUlDX0lOSVQoMSksCiAJCS5kb25lID0gMCwKIAkJLmZsYWdzID0gZmxhZ3MsCkBAIC0xMDgwLDggKzEwODAsOCBAQAogCQkua3JlZiA9IHsgQVRPTUlDX0lOSVQoMikgfSwKIAl9OwogCi0JaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0FUVEFDSElORykpIHsgIC8qIHB1dCBpcyBpbiBibV9haW9fY3R4X2Rlc3Ryb3koKSAqLwotCQlkZXZfZXJyKERFViwgIkFTU0VSVCBGQUlMRUQ6IGdldF9sZGV2X2lmX3N0YXRlKCkgPT0gMSBpbiBibV9ydygpXG4iKTsKKwlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9BVFRBQ0hJTkcpKSB7ICAvKiBwdXQgaXMgaW4gYm1fYWlvX2N0eF9kZXN0cm95KCkgKi8KKwkJZHJiZF9lcnIoZGV2aWNlLCAiQVNTRVJUIEZBSUxFRDogZ2V0X2xkZXZfaWZfc3RhdGUoKSA9PSAxIGluIGJtX3J3KClcbiIpOwogCQlrZnJlZShjdHgpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0xMTA2LDE0ICsxMTA2LDE0IEBACiAKIAkJCWlmICghKGZsYWdzICYgQk1fV1JJVEVfQUxMX1BBR0VTKSAmJgogCQkJICAgIGJtX3Rlc3RfcGFnZV91bmNoYW5nZWQoYi0+Ym1fcGFnZXNbaV0pKSB7Ci0JCQkJZHluYW1pY19kZXZfZGJnKERFViwgInNraXBwZWQgYm0gd3JpdGUgZm9yIGlkeCAldVxuIiwgaSk7CisJCQkJZHluYW1pY19kcmJkX2RiZyhkZXZpY2UsICJza2lwcGVkIGJtIHdyaXRlIGZvciBpZHggJXVcbiIsIGkpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJLyogZHVyaW5nIGxhenkgd3JpdGVvdXQsCiAJCQkgKiBpZ25vcmUgdGhvc2UgcGFnZXMgbm90IG1hcmtlZCBmb3IgbGF6eSB3cml0ZW91dC4gKi8KIAkJCWlmIChsYXp5X3dyaXRlb3V0X3VwcGVyX2lkeCAmJgogCQkJICAgICFibV90ZXN0X3BhZ2VfbGF6eV93cml0ZW91dChiLT5ibV9wYWdlc1tpXSkpIHsKLQkJCQlkeW5hbWljX2Rldl9kYmcoREVWLCAic2tpcHBlZCBibSBsYXp5IHdyaXRlIGZvciBpZHggJXVcbiIsIGkpOworCQkJCWR5bmFtaWNfZHJiZF9kYmcoZGV2aWNlLCAic2tpcHBlZCBibSBsYXp5IHdyaXRlIGZvciBpZHggJXVcbiIsIGkpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQl9CkBAIC0xMTMyLDE5ICsxMTMyLDE5IEBACiAJICogImluX2ZsaWdodCByZWFjaGVkIHplcm8sIGFsbCBkb25lIiBldmVudC4KIAkgKi8KIAlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmN0eC0+aW5fZmxpZ2h0KSkKLQkJd2FpdF91bnRpbF9kb25lX29yX2ZvcmNlX2RldGFjaGVkKG1kZXYsIG1kZXYtPmxkZXYsICZjdHgtPmRvbmUpOworCQl3YWl0X3VudGlsX2RvbmVfb3JfZm9yY2VfZGV0YWNoZWQoZGV2aWNlLCBkZXZpY2UtPmxkZXYsICZjdHgtPmRvbmUpOwogCWVsc2UKIAkJa3JlZl9wdXQoJmN0eC0+a3JlZiwgJmJtX2Fpb19jdHhfZGVzdHJveSk7CiAKIAkvKiBzdW1tYXJ5IGZvciBnbG9iYWwgYml0bWFwIElPICovCiAJaWYgKGZsYWdzID09IDApCi0JCWRldl9pbmZvKERFViwgImJpdG1hcCAlcyBvZiAldSBwYWdlcyB0b29rICVsdSBqaWZmaWVzXG4iLAorCQlkcmJkX2luZm8oZGV2aWNlLCAiYml0bWFwICVzIG9mICV1IHBhZ2VzIHRvb2sgJWx1IGppZmZpZXNcbiIsCiAJCQkgcncgPT0gV1JJVEUgPyAiV1JJVEUiIDogIlJFQUQiLAogCQkJIGNvdW50LCBqaWZmaWVzIC0gbm93KTsKIAogCWlmIChjdHgtPmVycm9yKSB7Ci0JCWRldl9hbGVydChERVYsICJ3ZSBoYWQgYXQgbGVhc3Qgb25lIE1EIElPIEVSUk9SIGR1cmluZyBiaXRtYXAgSU9cbiIpOwotCQlkcmJkX2Noa19pb19lcnJvcihtZGV2LCAxLCBEUkJEX01FVEFfSU9fRVJST1IpOworCQlkcmJkX2FsZXJ0KGRldmljZSwgIndlIGhhZCBhdCBsZWFzdCBvbmUgTUQgSU8gRVJST1IgZHVyaW5nIGJpdG1hcCBJT1xuIik7CisJCWRyYmRfY2hrX2lvX2Vycm9yKGRldmljZSwgMSwgRFJCRF9NRVRBX0lPX0VSUk9SKTsKIAkJZXJyID0gLUVJTzsgLyogY3R4LT5lcnJvciA/ICovCiAJfQogCkBAIC0xMTUzLDE2ICsxMTUzLDE2IEBACiAKIAlub3cgPSBqaWZmaWVzOwogCWlmIChydyA9PSBXUklURSkgewotCQlkcmJkX21kX2ZsdXNoKG1kZXYpOworCQlkcmJkX21kX2ZsdXNoKGRldmljZSk7CiAJfSBlbHNlIC8qIHJ3ID09IFJFQUQgKi8gewogCQliLT5ibV9zZXQgPSBibV9jb3VudF9iaXRzKGIpOwotCQlkZXZfaW5mbyhERVYsICJyZWNvdW50aW5nIG9mIHNldCBiaXRzIHRvb2sgYWRkaXRpb25hbCAlbHUgamlmZmllc1xuIiwKKwkJZHJiZF9pbmZvKGRldmljZSwgInJlY291bnRpbmcgb2Ygc2V0IGJpdHMgdG9vayBhZGRpdGlvbmFsICVsdSBqaWZmaWVzXG4iLAogCQkgICAgIGppZmZpZXMgLSBub3cpOwogCX0KIAlub3cgPSBiLT5ibV9zZXQ7CiAKIAlpZiAoZmxhZ3MgPT0gMCkKLQkJZGV2X2luZm8oREVWLCAiJXMgKCVsdSBiaXRzKSBtYXJrZWQgb3V0LW9mLXN5bmMgYnkgb24gZGlzayBiaXQtbWFwLlxuIiwKKwkJZHJiZF9pbmZvKGRldmljZSwgIiVzICglbHUgYml0cykgbWFya2VkIG91dC1vZi1zeW5jIGJ5IG9uIGRpc2sgYml0LW1hcC5cbiIsCiAJCSAgICAgcHBzaXplKHBwYiwgbm93IDw8IChCTV9CTE9DS19TSElGVC0xMCkpLCBub3cpOwogCiAJa3JlZl9wdXQoJmN0eC0+a3JlZiwgJmJtX2Fpb19jdHhfZGVzdHJveSk7CkBAIC0xMTcxLDQ4ICsxMTcxLDM4IEBACiAKIC8qKgogICogZHJiZF9ibV9yZWFkKCkgLSBSZWFkIHRoZSB3aG9sZSBiaXRtYXAgZnJvbSBpdHMgb24gZGlzayBsb2NhdGlvbi4KLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICovCi1pbnQgZHJiZF9ibV9yZWFkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpIF9fbXVzdF9ob2xkKGxvY2FsKQoraW50IGRyYmRfYm1fcmVhZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkgX19tdXN0X2hvbGQobG9jYWwpCiB7Ci0JcmV0dXJuIGJtX3J3KG1kZXYsIFJFQUQsIDAsIDApOworCXJldHVybiBibV9ydyhkZXZpY2UsIFJFQUQsIDAsIDApOwogfQogCiAvKioKICAqIGRyYmRfYm1fd3JpdGUoKSAtIFdyaXRlIHRoZSB3aG9sZSBiaXRtYXAgdG8gaXRzIG9uIGRpc2sgbG9jYXRpb24uCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBXaWxsIG9ubHkgd3JpdGUgcGFnZXMgdGhhdCBoYXZlIGNoYW5nZWQgc2luY2UgbGFzdCBJTy4KICAqLwotaW50IGRyYmRfYm1fd3JpdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpCitpbnQgZHJiZF9ibV93cml0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkgX19tdXN0X2hvbGQobG9jYWwpCiB7Ci0JcmV0dXJuIGJtX3J3KG1kZXYsIFdSSVRFLCAwLCAwKTsKKwlyZXR1cm4gYm1fcncoZGV2aWNlLCBXUklURSwgMCwgMCk7CiB9CiAKIC8qKgogICogZHJiZF9ibV93cml0ZV9hbGwoKSAtIFdyaXRlIHRoZSB3aG9sZSBiaXRtYXAgdG8gaXRzIG9uIGRpc2sgbG9jYXRpb24uCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBXaWxsIHdyaXRlIGFsbCBwYWdlcy4KICAqLwotaW50IGRyYmRfYm1fd3JpdGVfYWxsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpIF9fbXVzdF9ob2xkKGxvY2FsKQoraW50IGRyYmRfYm1fd3JpdGVfYWxsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKSBfX211c3RfaG9sZChsb2NhbCkKIHsKLQlyZXR1cm4gYm1fcncobWRldiwgV1JJVEUsIEJNX1dSSVRFX0FMTF9QQUdFUywgMCk7Ci19Ci0KLS8qKgotICogZHJiZF9ibV9sYXp5X3dyaXRlX291dCgpIC0gV3JpdGUgYml0bWFwIHBhZ2VzIDAgdG8gQHVwcGVyX2lkeC0xLCBpZiB0aGV5IGhhdmUgY2hhbmdlZC4KLSAqIEBtZGV2OglEUkJEIGRldmljZS4KLSAqIEB1cHBlcl9pZHg6CTA6IHdyaXRlIGFsbCBjaGFuZ2VkIHBhZ2VzOyArdmU6IHBhZ2UgaW5kZXggdG8gc3RvcCBzY2FubmluZyBmb3IgY2hhbmdlZCBwYWdlcwotICovCi1pbnQgZHJiZF9ibV93cml0ZV9sYXp5KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIHVwcGVyX2lkeCkgX19tdXN0X2hvbGQobG9jYWwpCi17Ci0JcmV0dXJuIGJtX3J3KG1kZXYsIFdSSVRFLCBCTV9BSU9fQ09QWV9QQUdFUywgdXBwZXJfaWR4KTsKKwlyZXR1cm4gYm1fcncoZGV2aWNlLCBXUklURSwgQk1fV1JJVEVfQUxMX1BBR0VTLCAwKTsKIH0KIAogLyoqCiAgKiBkcmJkX2JtX3dyaXRlX2NvcHlfcGFnZXMoKSAtIFdyaXRlIHRoZSB3aG9sZSBiaXRtYXAgdG8gaXRzIG9uIGRpc2sgbG9jYXRpb24uCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBXaWxsIG9ubHkgd3JpdGUgcGFnZXMgdGhhdCBoYXZlIGNoYW5nZWQgc2luY2UgbGFzdCBJTy4KICAqIEluIGNvbnRyYXN0IHRvIGRyYmRfYm1fd3JpdGUoKSwgdGhpcyB3aWxsIGNvcHkgdGhlIGJpdG1hcCBwYWdlcwpAQCAtMTIyMSwyMyArMTIxMSwyMyBAQAogICogdmVyaWZ5IGlzIGFib3J0ZWQgZHVlIHRvIGEgZmFpbGVkIHBlZXIgZGlzaywgd2hpbGUgbG9jYWwgSU8gY29udGludWVzLCBvcgogICogcGVuZGluZyByZXN5bmMgYWNrcyBhcmUgc3RpbGwgYmVpbmcgcHJvY2Vzc2VkLgogICovCi1pbnQgZHJiZF9ibV93cml0ZV9jb3B5X3BhZ2VzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpIF9fbXVzdF9ob2xkKGxvY2FsKQoraW50IGRyYmRfYm1fd3JpdGVfY29weV9wYWdlcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkgX19tdXN0X2hvbGQobG9jYWwpCiB7Ci0JcmV0dXJuIGJtX3J3KG1kZXYsIFdSSVRFLCBCTV9BSU9fQ09QWV9QQUdFUywgMCk7CisJcmV0dXJuIGJtX3J3KGRldmljZSwgV1JJVEUsIEJNX0FJT19DT1BZX1BBR0VTLCAwKTsKIH0KIAogLyoqCiAgKiBkcmJkX2JtX3dyaXRlX2hpbnRlZCgpIC0gV3JpdGUgYml0bWFwIHBhZ2VzIHdpdGggImhpbnQiIG1hcmtzLCBpZiB0aGV5IGhhdmUgY2hhbmdlZC4KLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICovCi1pbnQgZHJiZF9ibV93cml0ZV9oaW50ZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpCitpbnQgZHJiZF9ibV93cml0ZV9oaW50ZWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpIF9fbXVzdF9ob2xkKGxvY2FsKQogewotCXJldHVybiBibV9ydyhtZGV2LCBXUklURSwgQk1fQUlPX1dSSVRFX0hJTlRFRCB8IEJNX0FJT19DT1BZX1BBR0VTLCAwKTsKKwlyZXR1cm4gYm1fcncoZGV2aWNlLCBXUklURSwgQk1fQUlPX1dSSVRFX0hJTlRFRCB8IEJNX0FJT19DT1BZX1BBR0VTLCAwKTsKIH0KIAogLyoqCiAgKiBkcmJkX2JtX3dyaXRlX3BhZ2UoKSAtIFdyaXRlcyBhIFBBR0VfU0laRSBhbGlnbmVkIHBpZWNlIG9mIGJpdG1hcAotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAaWR4OgliaXRtYXAgcGFnZSBpbmRleAogICoKICAqIFdlIGRvbid0IHdhbnQgdG8gc3BlY2lhbCBjYXNlIG9uIGxvZ2ljYWxfYmxvY2tfc2l6ZSBvZiB0aGUgYmFja2VuZCBkZXZpY2UsCkBAIC0xMjQ3LDEzICsxMjM3LDEzIEBACiAgKiBJbiBjYXNlIHRoaXMgYmVjb21lcyBhbiBpc3N1ZSBvbiBzeXN0ZW1zIHdpdGggbGFyZ2VyIFBBR0VfU0laRSwKICAqIHdlIG1heSB3YW50IHRvIGNoYW5nZSB0aGlzIGFnYWluIHRvIHdyaXRlIDRrIGFsaWduZWQgNGsgcGllY2VzLgogICovCi1pbnQgZHJiZF9ibV93cml0ZV9wYWdlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGludCBpZHgpIF9fbXVzdF9ob2xkKGxvY2FsKQoraW50IGRyYmRfYm1fd3JpdGVfcGFnZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgaW50IGlkeCkgX19tdXN0X2hvbGQobG9jYWwpCiB7CiAJc3RydWN0IGJtX2Fpb19jdHggKmN0eDsKIAlpbnQgZXJyOwogCi0JaWYgKGJtX3Rlc3RfcGFnZV91bmNoYW5nZWQobWRldi0+Yml0bWFwLT5ibV9wYWdlc1tpZHhdKSkgewotCQlkeW5hbWljX2Rldl9kYmcoREVWLCAic2tpcHBlZCBibSBwYWdlIHdyaXRlIGZvciBpZHggJXVcbiIsIGlkeCk7CisJaWYgKGJtX3Rlc3RfcGFnZV91bmNoYW5nZWQoZGV2aWNlLT5iaXRtYXAtPmJtX3BhZ2VzW2lkeF0pKSB7CisJCWR5bmFtaWNfZHJiZF9kYmcoZGV2aWNlLCAic2tpcHBlZCBibSBwYWdlIHdyaXRlIGZvciBpZHggJXVcbiIsIGlkeCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTI2Miw3ICsxMjUyLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkqY3R4ID0gKHN0cnVjdCBibV9haW9fY3R4KSB7Ci0JCS5tZGV2ID0gbWRldiwKKwkJLmRldmljZSA9IGRldmljZSwKIAkJLmluX2ZsaWdodCA9IEFUT01JQ19JTklUKDEpLAogCQkuZG9uZSA9IDAsCiAJCS5mbGFncyA9IEJNX0FJT19DT1BZX1BBR0VTLApAQCAtMTI3MCwyMSArMTI2MCwyMSBAQAogCQkua3JlZiA9IHsgQVRPTUlDX0lOSVQoMikgfSwKIAl9OwogCi0JaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0FUVEFDSElORykpIHsgIC8qIHB1dCBpcyBpbiBibV9haW9fY3R4X2Rlc3Ryb3koKSAqLwotCQlkZXZfZXJyKERFViwgIkFTU0VSVCBGQUlMRUQ6IGdldF9sZGV2X2lmX3N0YXRlKCkgPT0gMSBpbiBkcmJkX2JtX3dyaXRlX3BhZ2UoKVxuIik7CisJaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfQVRUQUNISU5HKSkgeyAgLyogcHV0IGlzIGluIGJtX2Fpb19jdHhfZGVzdHJveSgpICovCisJCWRyYmRfZXJyKGRldmljZSwgIkFTU0VSVCBGQUlMRUQ6IGdldF9sZGV2X2lmX3N0YXRlKCkgPT0gMSBpbiBkcmJkX2JtX3dyaXRlX3BhZ2UoKVxuIik7CiAJCWtmcmVlKGN0eCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWJtX3BhZ2VfaW9fYXN5bmMoY3R4LCBpZHgsIFdSSVRFX1NZTkMpOwotCXdhaXRfdW50aWxfZG9uZV9vcl9mb3JjZV9kZXRhY2hlZChtZGV2LCBtZGV2LT5sZGV2LCAmY3R4LT5kb25lKTsKKwl3YWl0X3VudGlsX2RvbmVfb3JfZm9yY2VfZGV0YWNoZWQoZGV2aWNlLCBkZXZpY2UtPmxkZXYsICZjdHgtPmRvbmUpOwogCiAJaWYgKGN0eC0+ZXJyb3IpCi0JCWRyYmRfY2hrX2lvX2Vycm9yKG1kZXYsIDEsIERSQkRfTUVUQV9JT19FUlJPUik7CisJCWRyYmRfY2hrX2lvX2Vycm9yKGRldmljZSwgMSwgRFJCRF9NRVRBX0lPX0VSUk9SKTsKIAkJLyogdGhhdCBjYXVzZXMgdXMgdG8gZGV0YWNoLCBzbyB0aGUgaW4gbWVtb3J5IGJpdG1hcCB3aWxsIGJlCiAJCSAqIGdvbmUgaW4gYSBtb21lbnQgYXMgd2VsbC4gKi8KIAotCW1kZXYtPmJtX3dyaXRfY250Kys7CisJZGV2aWNlLT5ibV93cml0X2NudCsrOwogCWVyciA9IGF0b21pY19yZWFkKCZjdHgtPmluX2ZsaWdodCkgPyAtRUlPIDogY3R4LT5lcnJvcjsKIAlrcmVmX3B1dCgmY3R4LT5rcmVmLCAmYm1fYWlvX2N0eF9kZXN0cm95KTsKIAlyZXR1cm4gZXJyOwpAQCAtMTI5OCwxNyArMTI4OCwxNyBAQAogICoKICAqIHRoaXMgcmV0dXJucyBhIGJpdCBudW1iZXIsIE5PVCBhIHNlY3RvciEKICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19ibV9maW5kX25leHQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBibV9mbywKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fYm1fZmluZF9uZXh0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIGJtX2ZvLAogCWNvbnN0IGludCBmaW5kX3plcm9fYml0KQogewotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAl1bnNpZ25lZCBsb25nICpwX2FkZHI7CiAJdW5zaWduZWQgbG9uZyBiaXRfb2Zmc2V0OwogCXVuc2lnbmVkIGk7CiAKIAogCWlmIChibV9mbyA+IGItPmJtX2JpdHMpIHsKLQkJZGV2X2VycihERVYsICJibV9mbz0lbHUgYm1fYml0cz0lbHVcbiIsIGJtX2ZvLCBiLT5ibV9iaXRzKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiYm1fZm89JWx1IGJtX2JpdHM9JWx1XG4iLCBibV9mbywgYi0+Ym1fYml0cyk7CiAJCWJtX2ZvID0gRFJCRF9FTkRfT0ZfQklUTUFQOwogCX0gZWxzZSB7CiAJCXdoaWxlIChibV9mbyA8IGItPmJtX2JpdHMpIHsKQEAgLTEzMzgsMTAgKzEzMjgsMTAgQEAKIAlyZXR1cm4gYm1fZm87CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGJtX2ZpbmRfbmV4dChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIHVuc2lnbmVkIGxvbmcgYm1fZmluZF9uZXh0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCXVuc2lnbmVkIGxvbmcgYm1fZm8sIGNvbnN0IGludCBmaW5kX3plcm9fYml0KQogewotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAl1bnNpZ25lZCBsb25nIGkgPSBEUkJEX0VORF9PRl9CSVRNQVA7CiAKIAlpZiAoIWV4cGVjdChiKSkKQEAgLTEzNTEsMzkgKzEzNDEsMzkgQEAKIAogCXNwaW5fbG9ja19pcnEoJmItPmJtX2xvY2spOwogCWlmIChCTV9ET05UX1RFU1QgJiBiLT5ibV9mbGFncykKLQkJYm1fcHJpbnRfbG9ja19pbmZvKG1kZXYpOworCQlibV9wcmludF9sb2NrX2luZm8oZGV2aWNlKTsKIAotCWkgPSBfX2JtX2ZpbmRfbmV4dChtZGV2LCBibV9mbywgZmluZF96ZXJvX2JpdCk7CisJaSA9IF9fYm1fZmluZF9uZXh0KGRldmljZSwgYm1fZm8sIGZpbmRfemVyb19iaXQpOwogCiAJc3Bpbl91bmxvY2tfaXJxKCZiLT5ibV9sb2NrKTsKIAlyZXR1cm4gaTsKIH0KIAotdW5zaWduZWQgbG9uZyBkcmJkX2JtX2ZpbmRfbmV4dChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBsb25nIGJtX2ZvKQordW5zaWduZWQgbG9uZyBkcmJkX2JtX2ZpbmRfbmV4dChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgbG9uZyBibV9mbykKIHsKLQlyZXR1cm4gYm1fZmluZF9uZXh0KG1kZXYsIGJtX2ZvLCAwKTsKKwlyZXR1cm4gYm1fZmluZF9uZXh0KGRldmljZSwgYm1fZm8sIDApOwogfQogCiAjaWYgMAogLyogbm90IHlldCBuZWVkZWQgZm9yIGFueXRoaW5nLiAqLwotdW5zaWduZWQgbG9uZyBkcmJkX2JtX2ZpbmRfbmV4dF96ZXJvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGxvbmcgYm1fZm8pCit1bnNpZ25lZCBsb25nIGRyYmRfYm1fZmluZF9uZXh0X3plcm8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGxvbmcgYm1fZm8pCiB7Ci0JcmV0dXJuIGJtX2ZpbmRfbmV4dChtZGV2LCBibV9mbywgMSk7CisJcmV0dXJuIGJtX2ZpbmRfbmV4dChkZXZpY2UsIGJtX2ZvLCAxKTsKIH0KICNlbmRpZgogCiAvKiBkb2VzIG5vdCBzcGluX2xvY2tfaXJxc2F2ZS4KICAqIHlvdSBtdXN0IHRha2UgZHJiZF9ibV9sb2NrKCkgZmlyc3QgKi8KLXVuc2lnbmVkIGxvbmcgX2RyYmRfYm1fZmluZF9uZXh0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGxvbmcgYm1fZm8pCit1bnNpZ25lZCBsb25nIF9kcmJkX2JtX2ZpbmRfbmV4dChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgbG9uZyBibV9mbykKIHsKLQkvKiBXQVJOX09OKCEoQk1fRE9OVF9TRVQgJiBtZGV2LT5iLT5ibV9mbGFncykpOyAqLwotCXJldHVybiBfX2JtX2ZpbmRfbmV4dChtZGV2LCBibV9mbywgMCk7CisJLyogV0FSTl9PTighKEJNX0RPTlRfU0VUICYgZGV2aWNlLT5iLT5ibV9mbGFncykpOyAqLworCXJldHVybiBfX2JtX2ZpbmRfbmV4dChkZXZpY2UsIGJtX2ZvLCAwKTsKIH0KIAotdW5zaWduZWQgbG9uZyBfZHJiZF9ibV9maW5kX25leHRfemVybyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBsb25nIGJtX2ZvKQordW5zaWduZWQgbG9uZyBfZHJiZF9ibV9maW5kX25leHRfemVybyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgbG9uZyBibV9mbykKIHsKLQkvKiBXQVJOX09OKCEoQk1fRE9OVF9TRVQgJiBtZGV2LT5iLT5ibV9mbGFncykpOyAqLwotCXJldHVybiBfX2JtX2ZpbmRfbmV4dChtZGV2LCBibV9mbywgMSk7CisJLyogV0FSTl9PTighKEJNX0RPTlRfU0VUICYgZGV2aWNlLT5iLT5ibV9mbGFncykpOyAqLworCXJldHVybiBfX2JtX2ZpbmRfbmV4dChkZXZpY2UsIGJtX2ZvLCAxKTsKIH0KIAogLyogcmV0dXJucyBudW1iZXIgb2YgYml0cyBhY3R1YWxseSBjaGFuZ2VkLgpAQCAtMTM5MiwxMCArMTM4MiwxMCBAQAogICogd2FudHMgYml0bnIsIG5vdCBzZWN0b3IuCiAgKiBleHBlY3RlZCB0byBiZSBjYWxsZWQgZm9yIG9ubHkgYSBmZXcgYml0cyAoZSAtIHMgYWJvdXQgQklUU19QRVJfTE9ORykuCiAgKiBNdXN0IGhvbGQgYml0bWFwIGxvY2sgYWxyZWFkeS4gKi8KLXN0YXRpYyBpbnQgX19ibV9jaGFuZ2VfYml0c190byhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCB1bnNpZ25lZCBsb25nIHMsCitzdGF0aWMgaW50IF9fYm1fY2hhbmdlX2JpdHNfdG8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNvbnN0IHVuc2lnbmVkIGxvbmcgcywKIAl1bnNpZ25lZCBsb25nIGUsIGludCB2YWwpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCXVuc2lnbmVkIGxvbmcgKnBfYWRkciA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBiaXRucjsKIAl1bnNpZ25lZCBpbnQgbGFzdF9wYWdlX25yID0gLTFVOwpAQCAtMTQwMyw3ICsxMzkzLDcgQEAKIAlpbnQgY2hhbmdlZF90b3RhbCA9IDA7CiAKIAlpZiAoZSA+PSBiLT5ibV9iaXRzKSB7Ci0JCWRldl9lcnIoREVWLCAiQVNTRVJUIEZBSUxFRDogYml0X3M9JWx1IGJpdF9lPSVsdSBibV9iaXRzPSVsdVxuIiwKKwkJZHJiZF9lcnIoZGV2aWNlLCAiQVNTRVJUIEZBSUxFRDogYml0X3M9JWx1IGJpdF9lPSVsdSBibV9iaXRzPSVsdVxuIiwKIAkJCQlzLCBlLCBiLT5ibV9iaXRzKTsKIAkJZSA9IGItPmJtX2JpdHMgPyBiLT5ibV9iaXRzIC0xIDogMDsKIAl9CkBAIC0xNDQxLDExICsxNDMxLDExIEBACiAgKiBmb3IgdmFsICE9IDAsIHdlIGNoYW5nZSAwIC0+IDEsIHJldHVybiBjb2RlIHBvc2l0aXZlCiAgKiBmb3IgdmFsID09IDAsIHdlIGNoYW5nZSAxIC0+IDAsIHJldHVybiBjb2RlIG5lZ2F0aXZlCiAgKiB3YW50cyBiaXRuciwgbm90IHNlY3RvciAqLwotc3RhdGljIGludCBibV9jaGFuZ2VfYml0c190byhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCB1bnNpZ25lZCBsb25nIHMsCitzdGF0aWMgaW50IGJtX2NoYW5nZV9iaXRzX3RvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCB1bnNpZ25lZCBsb25nIHMsCiAJY29uc3QgdW5zaWduZWQgbG9uZyBlLCBpbnQgdmFsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCWludCBjID0gMDsKIAogCWlmICghZXhwZWN0KGIpKQpAQCAtMTQ1NSwyNCArMTQ0NSwyNCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmItPmJtX2xvY2ssIGZsYWdzKTsKIAlpZiAoKHZhbCA/IEJNX0RPTlRfU0VUIDogQk1fRE9OVF9DTEVBUikgJiBiLT5ibV9mbGFncykKLQkJYm1fcHJpbnRfbG9ja19pbmZvKG1kZXYpOworCQlibV9wcmludF9sb2NrX2luZm8oZGV2aWNlKTsKIAotCWMgPSBfX2JtX2NoYW5nZV9iaXRzX3RvKG1kZXYsIHMsIGUsIHZhbCk7CisJYyA9IF9fYm1fY2hhbmdlX2JpdHNfdG8oZGV2aWNlLCBzLCBlLCB2YWwpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYi0+Ym1fbG9jaywgZmxhZ3MpOwogCXJldHVybiBjOwogfQogCiAvKiByZXR1cm5zIG51bWJlciBvZiBiaXRzIGNoYW5nZWQgMCAtPiAxICovCi1pbnQgZHJiZF9ibV9zZXRfYml0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCB1bnNpZ25lZCBsb25nIHMsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZSkKK2ludCBkcmJkX2JtX3NldF9iaXRzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCB1bnNpZ25lZCBsb25nIHMsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZSkKIHsKLQlyZXR1cm4gYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgcywgZSwgMSk7CisJcmV0dXJuIGJtX2NoYW5nZV9iaXRzX3RvKGRldmljZSwgcywgZSwgMSk7CiB9CiAKIC8qIHJldHVybnMgbnVtYmVyIG9mIGJpdHMgY2hhbmdlZCAxIC0+IDAgKi8KLWludCBkcmJkX2JtX2NsZWFyX2JpdHMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgY29uc3QgdW5zaWduZWQgbG9uZyBzLCBjb25zdCB1bnNpZ25lZCBsb25nIGUpCitpbnQgZHJiZF9ibV9jbGVhcl9iaXRzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCB1bnNpZ25lZCBsb25nIHMsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZSkKIHsKLQlyZXR1cm4gLWJtX2NoYW5nZV9iaXRzX3RvKG1kZXYsIHMsIGUsIDApOworCXJldHVybiAtYm1fY2hhbmdlX2JpdHNfdG8oZGV2aWNlLCBzLCBlLCAwKTsKIH0KIAogLyogc2V0cyBhbGwgYml0cyBpbiBmdWxsIHdvcmRzLApAQCAtMTUwNCw3ICsxNDk0LDcgQEAKICAqIFlvdSBtdXN0IGZpcnN0IGRyYmRfYm1fbG9jaygpLgogICogQ2FuIGJlIGNhbGxlZCB0byBzZXQgdGhlIHdob2xlIGJpdG1hcCBpbiBvbmUgZ28uCiAgKiBTZXRzIGJpdHMgZnJvbSBzIHRvIGUgX2luY2x1c2l2ZV8uICovCi12b2lkIF9kcmJkX2JtX3NldF9iaXRzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IHVuc2lnbmVkIGxvbmcgcywgY29uc3QgdW5zaWduZWQgbG9uZyBlKQordm9pZCBfZHJiZF9ibV9zZXRfYml0cyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyBzLCBjb25zdCB1bnNpZ25lZCBsb25nIGUpCiB7CiAJLyogRmlyc3Qgc2V0X2JpdCBmcm9tIHRoZSBmaXJzdCBiaXQgKHMpCiAJICogdXAgdG8gdGhlIG5leHQgbG9uZyBib3VuZGFyeSAoc2wpLApAQCAtMTUxNCw3ICsxNTA0LDcgQEAKIAkgKiBEbyBub3QgdXNlIG1lbXNldCwgYmVjYXVzZSB3ZSBtdXN0IGFjY291bnQgZm9yIGNoYW5nZXMsCiAJICogc28gd2UgbmVlZCB0byBsb29wIG92ZXIgdGhlIHdvcmRzIHdpdGggaHdlaWdodCgpIGFueXdheXMuCiAJICovCi0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCXVuc2lnbmVkIGxvbmcgc2wgPSBBTElHTihzLEJJVFNfUEVSX0xPTkcpOwogCXVuc2lnbmVkIGxvbmcgZWwgPSAoZSsxKSAmIH4oKHVuc2lnbmVkIGxvbmcpQklUU19QRVJfTE9ORy0xKTsKIAlpbnQgZmlyc3RfcGFnZTsKQEAgLTE1MjYsNyArMTUxNiw3IEBACiAJaWYgKGUgLSBzIDw9IDMqQklUU19QRVJfTE9ORykgewogCQkvKiBkb24ndCBib3RoZXI7IGVsIGFuZCBzbCBtYXkgZXZlbiBiZSB3cm9uZy4gKi8KIAkJc3Bpbl9sb2NrX2lycSgmYi0+Ym1fbG9jayk7Ci0JCV9fYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgcywgZSwgMSk7CisJCV9fYm1fY2hhbmdlX2JpdHNfdG8oZGV2aWNlLCBzLCBlLCAxKTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZiLT5ibV9sb2NrKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE1MzcsNyArMTUyNyw3IEBACiAKIAkvKiBiaXRzIGZpbGxpbmcgdGhlIGN1cnJlbnQgbG9uZyAqLwogCWlmIChzbCkKLQkJX19ibV9jaGFuZ2VfYml0c190byhtZGV2LCBzLCBzbC0xLCAxKTsKKwkJX19ibV9jaGFuZ2VfYml0c190byhkZXZpY2UsIHMsIHNsLTEsIDEpOwogCiAJZmlyc3RfcGFnZSA9IHNsID4+ICgzICsgUEFHRV9TSElGVCk7CiAJbGFzdF9wYWdlID0gZWwgPj4gKDMgKyBQQUdFX1NISUZUKTsKQEAgLTE1NDksNyArMTUzOSw3IEBACiAKIAkvKiBmaXJzdCBhbmQgZnVsbCBwYWdlcywgdW5sZXNzIGZpcnN0IHBhZ2UgPT0gbGFzdCBwYWdlICovCiAJZm9yIChwYWdlX25yID0gZmlyc3RfcGFnZTsgcGFnZV9uciA8IGxhc3RfcGFnZTsgcGFnZV9ucisrKSB7Ci0JCWJtX3NldF9mdWxsX3dvcmRzX3dpdGhpbl9vbmVfcGFnZShtZGV2LT5iaXRtYXAsIHBhZ2VfbnIsIGZpcnN0X3dvcmQsIGxhc3Rfd29yZCk7CisJCWJtX3NldF9mdWxsX3dvcmRzX3dpdGhpbl9vbmVfcGFnZShkZXZpY2UtPmJpdG1hcCwgcGFnZV9uciwgZmlyc3Rfd29yZCwgbGFzdF93b3JkKTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZiLT5ibV9sb2NrKTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJCWZpcnN0X3dvcmQgPSAwOwpAQCAtMTU2NSw3ICsxNTU1LDcgQEAKIAkgKiBhcyB3ZSBkaWQgbm90IGFsbG9jYXRlIGl0LCBpdCBpcyBub3QgcHJlc2VudCBpbiBiaXRtYXAtPmJtX3BhZ2VzLgogCSAqLwogCWlmIChsYXN0X3dvcmQpCi0JCWJtX3NldF9mdWxsX3dvcmRzX3dpdGhpbl9vbmVfcGFnZShtZGV2LT5iaXRtYXAsIGxhc3RfcGFnZSwgZmlyc3Rfd29yZCwgbGFzdF93b3JkKTsKKwkJYm1fc2V0X2Z1bGxfd29yZHNfd2l0aGluX29uZV9wYWdlKGRldmljZS0+Yml0bWFwLCBsYXN0X3BhZ2UsIGZpcnN0X3dvcmQsIGxhc3Rfd29yZCk7CiAKIAkvKiBwb3NzaWJseSB0cmFpbGluZyBiaXRzLgogCSAqIGV4YW1wbGU6IChlICYgNjMpID09IDYzLCBlbCB3aWxsIGJlIGUrMS4KQEAgLTE1NzMsNyArMTU2Myw3IEBACiAJICogaXQgd291bGQgdHJpZ2dlciBhbiBhc3NlcnQgaW4gX19ibV9jaGFuZ2VfYml0c190bygpCiAJICovCiAJaWYgKGVsIDw9IGUpCi0JCV9fYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgZWwsIGUsIDEpOworCQlfX2JtX2NoYW5nZV9iaXRzX3RvKGRldmljZSwgZWwsIGUsIDEpOwogCXNwaW5fdW5sb2NrX2lycSgmYi0+Ym1fbG9jayk7CiB9CiAKQEAgLTE1ODQsMTAgKzE1NzQsMTAgQEAKICAqICAwIC4uLiBiaXQgbm90IHNldAogICogLTEgLi4uIGZpcnN0IG91dCBvZiBib3VuZHMgYWNjZXNzLCBzdG9wIHRlc3RpbmcgZm9yIGJpdHMhCiAgKi8KLWludCBkcmJkX2JtX3Rlc3RfYml0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IHVuc2lnbmVkIGxvbmcgYml0bnIpCitpbnQgZHJiZF9ibV90ZXN0X2JpdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyBiaXRucikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAl1bnNpZ25lZCBsb25nICpwX2FkZHI7CiAJaW50IGk7CiAKQEAgLTE1OTgsNyArMTU4OCw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYi0+Ym1fbG9jaywgZmxhZ3MpOwogCWlmIChCTV9ET05UX1RFU1QgJiBiLT5ibV9mbGFncykKLQkJYm1fcHJpbnRfbG9ja19pbmZvKG1kZXYpOworCQlibV9wcmludF9sb2NrX2luZm8oZGV2aWNlKTsKIAlpZiAoYml0bnIgPCBiLT5ibV9iaXRzKSB7CiAJCXBfYWRkciA9IGJtX21hcF9waWR4KGIsIGJtX2JpdF90b19wYWdlX2lkeChiLCBiaXRucikpOwogCQlpID0gdGVzdF9iaXRfbGUoYml0bnIgJiBCSVRTX1BFUl9QQUdFX01BU0ssIHBfYWRkcikgPyAxIDogMDsKQEAgLTE2MDYsNyArMTU5Niw3IEBACiAJfSBlbHNlIGlmIChiaXRuciA9PSBiLT5ibV9iaXRzKSB7CiAJCWkgPSAtMTsKIAl9IGVsc2UgeyAvKiAoYml0bnIgPiBiLT5ibV9iaXRzKSAqLwotCQlkZXZfZXJyKERFViwgImJpdG5yPSVsdSA+IGJtX2JpdHM9JWx1XG4iLCBiaXRuciwgYi0+Ym1fYml0cyk7CisJCWRyYmRfZXJyKGRldmljZSwgImJpdG5yPSVsdSA+IGJtX2JpdHM9JWx1XG4iLCBiaXRuciwgYi0+Ym1fYml0cyk7CiAJCWkgPSAwOwogCX0KIApAQCAtMTYxNSwxMCArMTYwNSwxMCBAQAogfQogCiAvKiByZXR1cm5zIG51bWJlciBvZiBiaXRzIHNldCBpbiB0aGUgcmFuZ2UgW3MsIGVdICovCi1pbnQgZHJiZF9ibV9jb3VudF9iaXRzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IHVuc2lnbmVkIGxvbmcgcywgY29uc3QgdW5zaWduZWQgbG9uZyBlKQoraW50IGRyYmRfYm1fY291bnRfYml0cyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyBzLCBjb25zdCB1bnNpZ25lZCBsb25nIGUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJdW5zaWduZWQgbG9uZyAqcF9hZGRyID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGJpdG5yOwogCXVuc2lnbmVkIGludCBwYWdlX25yID0gLTFVOwpAQCAtMTYzNSw3ICsxNjI1LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZiLT5ibV9sb2NrLCBmbGFncyk7CiAJaWYgKEJNX0RPTlRfVEVTVCAmIGItPmJtX2ZsYWdzKQotCQlibV9wcmludF9sb2NrX2luZm8obWRldik7CisJCWJtX3ByaW50X2xvY2tfaW5mbyhkZXZpY2UpOwogCWZvciAoYml0bnIgPSBzOyBiaXRuciA8PSBlOyBiaXRucisrKSB7CiAJCXVuc2lnbmVkIGludCBpZHggPSBibV9iaXRfdG9fcGFnZV9pZHgoYiwgYml0bnIpOwogCQlpZiAocGFnZV9uciAhPSBpZHgpIHsKQEAgLTE2NDcsNyArMTYzNyw3IEBACiAJCWlmIChleHBlY3QoYml0bnIgPCBiLT5ibV9iaXRzKSkKIAkJCWMgKz0gKDAgIT0gdGVzdF9iaXRfbGUoYml0bnIgLSAocGFnZV9uciA8PCAoUEFHRV9TSElGVCszKSksIHBfYWRkcikpOwogCQllbHNlCi0JCQlkZXZfZXJyKERFViwgImJpdG5yPSVsdSBibV9iaXRzPSVsdVxuIiwgYml0bnIsIGItPmJtX2JpdHMpOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiYml0bnI9JWx1IGJtX2JpdHM9JWx1XG4iLCBiaXRuciwgYi0+Ym1fYml0cyk7CiAJfQogCWlmIChwX2FkZHIpCiAJCWJtX3VubWFwKHBfYWRkcik7CkBAIC0xNjcwLDkgKzE2NjAsOSBAQAogICogcmVmZXJlbmNlIGNvdW50IG9mIHNvbWUgYml0bWFwIGV4dGVudCBlbGVtZW50IGZyb20gc29tZSBscnUgaW5zdGVhZC4uLgogICoKICAqLwotaW50IGRyYmRfYm1fZV93ZWlnaHQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBlbnIpCitpbnQgZHJiZF9ibV9lX3dlaWdodChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgbG9uZyBlbnIpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCWludCBjb3VudCwgcywgZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgKnBfYWRkciwgKmJtOwpAQCAtMTY4NCw3ICsxNjc0LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZiLT5ibV9sb2NrLCBmbGFncyk7CiAJaWYgKEJNX0RPTlRfVEVTVCAmIGItPmJtX2ZsYWdzKQotCQlibV9wcmludF9sb2NrX2luZm8obWRldik7CisJCWJtX3ByaW50X2xvY2tfaW5mbyhkZXZpY2UpOwogCiAJcyA9IFMyVyhlbnIpOwogCWUgPSBtaW4oKHNpemVfdClTMlcoZW5yKzEpLCBiLT5ibV93b3Jkcyk7CkBAIC0xNjk3LDcgKzE2ODcsNyBAQAogCQkJY291bnQgKz0gaHdlaWdodF9sb25nKCpibSsrKTsKIAkJYm1fdW5tYXAocF9hZGRyKTsKIAl9IGVsc2UgewotCQlkZXZfZXJyKERFViwgInN0YXJ0IG9mZnNldCAoJWQpIHRvbyBsYXJnZSBpbiBkcmJkX2JtX2Vfd2VpZ2h0XG4iLCBzKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAic3RhcnQgb2Zmc2V0ICglZCkgdG9vIGxhcmdlIGluIGRyYmRfYm1fZV93ZWlnaHRcbiIsIHMpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiLT5ibV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGNvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfaW50LmggYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9pbnQuaAppbmRleCAwZTA2ZjBjLi5lNzA5M2Q0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9pbnQuaAorKysgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9pbnQuaApAQCAtNDUsNyArNDUsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAjaW5jbHVkZSA8bGludXgvZHJiZF9nZW5sX2FwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RyYmQuaD4KKyNpbmNsdWRlICJkcmJkX3N0cmluZ3MuaCIKICNpbmNsdWRlICJkcmJkX3N0YXRlLmgiCisjaW5jbHVkZSAiZHJiZF9wcm90b2NvbC5oIgogCiAjaWZkZWYgX19DSEVDS0VSX18KICMgZGVmaW5lIF9fcHJvdGVjdGVkX2J5KHgpICAgICAgIF9fYXR0cmlidXRlX18oKHJlcXVpcmVfY29udGV4dCh4LDEsOTk5LCJyZHdyIikpKQpAQCAtNjUsNiArNjcsNyBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBtaW5vcl9jb3VudDsKIGV4dGVybiBib29sIGRpc2FibGVfc2VuZHBhZ2U7CiBleHRlcm4gYm9vbCBhbGxvd19vb3M7Cit2b2lkIHRsX2Fib3J0X2Rpc2tfaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOwogCiAjaWZkZWYgQ09ORklHX0RSQkRfRkFVTFRfSU5KRUNUSU9OCiBleHRlcm4gaW50IGVuYWJsZV9mYXVsdHM7CkBAIC05NSwyNSArOTgsNjAgQEAKIAogI2RlZmluZSBVVUlEX05FV19CTV9PRkZTRVQgKCh1NjQpMHgwMDAxMDAwMDAwMDAwMDAwVUxMKQogCi1zdHJ1Y3QgZHJiZF9jb25mOwotc3RydWN0IGRyYmRfdGNvbm47CitzdHJ1Y3QgZHJiZF9kZXZpY2U7CitzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uOwogCisjZGVmaW5lIF9fZHJiZF9wcmludGtfZGV2aWNlKGxldmVsLCBkZXZpY2UsIGZtdCwgYXJncy4uLikgXAorCWRldl9wcmludGsobGV2ZWwsIGRpc2tfdG9fZGV2KChkZXZpY2UpLT52ZGlzayksIGZtdCwgIyMgYXJncykKKyNkZWZpbmUgX19kcmJkX3ByaW50a19wZWVyX2RldmljZShsZXZlbCwgcGVlcl9kZXZpY2UsIGZtdCwgYXJncy4uLikgXAorCWRldl9wcmludGsobGV2ZWwsIGRpc2tfdG9fZGV2KChwZWVyX2RldmljZSktPmRldmljZS0+dmRpc2spLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIF9fZHJiZF9wcmludGtfcmVzb3VyY2UobGV2ZWwsIHJlc291cmNlLCBmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsobGV2ZWwgImRyYmQgJXM6ICIgZm10LCAocmVzb3VyY2UpLT5uYW1lLCAjIyBhcmdzKQorI2RlZmluZSBfX2RyYmRfcHJpbnRrX2Nvbm5lY3Rpb24obGV2ZWwsIGNvbm5lY3Rpb24sIGZtdCwgYXJncy4uLikgXAorCXByaW50ayhsZXZlbCAiZHJiZCAlczogIiBmbXQsIChjb25uZWN0aW9uKS0+cmVzb3VyY2UtPm5hbWUsICMjIGFyZ3MpCiAKLS8qIHRvIHNob3J0ZW4gZGV2X3dhcm4oREVWLCAibXNnIik7IGFuZCByZWxhdGl2ZXMgc3RhdGVtZW50cyAqLwotI2RlZmluZSBERVYgKGRpc2tfdG9fZGV2KG1kZXYtPnZkaXNrKSkKK3ZvaWQgZHJiZF9wcmludGtfd2l0aF93cm9uZ19vYmplY3RfdHlwZSh2b2lkKTsKIAotI2RlZmluZSBjb25uX3ByaW50ayhMRVZFTCwgVENPTk4sIEZNVCwgQVJHUy4uLikgXAotCXByaW50ayhMRVZFTCAiZC1jb24gJXM6ICIgRk1ULCBUQ09OTi0+bmFtZSAsICMjIEFSR1MpCi0jZGVmaW5lIGNvbm5fYWxlcnQoVENPTk4sIEZNVCwgQVJHUy4uLikgIGNvbm5fcHJpbnRrKEtFUk5fQUxFUlQsIFRDT05OLCBGTVQsICMjIEFSR1MpCi0jZGVmaW5lIGNvbm5fY3JpdChUQ09OTiwgRk1ULCBBUkdTLi4uKSAgIGNvbm5fcHJpbnRrKEtFUk5fQ1JJVCwgVENPTk4sIEZNVCwgIyMgQVJHUykKLSNkZWZpbmUgY29ubl9lcnIoVENPTk4sIEZNVCwgQVJHUy4uLikgICAgY29ubl9wcmludGsoS0VSTl9FUlIsIFRDT05OLCBGTVQsICMjIEFSR1MpCi0jZGVmaW5lIGNvbm5fd2FybihUQ09OTiwgRk1ULCBBUkdTLi4uKSAgIGNvbm5fcHJpbnRrKEtFUk5fV0FSTklORywgVENPTk4sIEZNVCwgIyMgQVJHUykKLSNkZWZpbmUgY29ubl9ub3RpY2UoVENPTk4sIEZNVCwgQVJHUy4uLikgY29ubl9wcmludGsoS0VSTl9OT1RJQ0UsIFRDT05OLCBGTVQsICMjIEFSR1MpCi0jZGVmaW5lIGNvbm5faW5mbyhUQ09OTiwgRk1ULCBBUkdTLi4uKSAgIGNvbm5fcHJpbnRrKEtFUk5fSU5GTywgVENPTk4sIEZNVCwgIyMgQVJHUykKLSNkZWZpbmUgY29ubl9kYmcoVENPTk4sIEZNVCwgQVJHUy4uLikgICAgY29ubl9wcmludGsoS0VSTl9ERUJVRywgVENPTk4sIEZNVCwgIyMgQVJHUykKKyNkZWZpbmUgX19kcmJkX3ByaW50a19pZl9zYW1lX3R5cGUob2JqLCB0eXBlLCBmdW5jLCBsZXZlbCwgZm10LCBhcmdzLi4uKSBcCisJKF9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AodHlwZW9mKG9iaiksIHR5cGUpIHx8IFwKKwkgX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVfcCh0eXBlb2Yob2JqKSwgY29uc3QgdHlwZSkpLCBcCisJZnVuYyhsZXZlbCwgKGNvbnN0IHR5cGUpKG9iaiksIGZtdCwgIyMgYXJncykKIAotI2RlZmluZSBEX0FTU0VSVChleHApCWlmICghKGV4cCkpIFwKLQkgZGV2X2VycihERVYsICJBU1NFUlQoICIgI2V4cCAiICkgaW4gJXM6JWRcbiIsIF9fRklMRV9fLCBfX0xJTkVfXykKKyNkZWZpbmUgZHJiZF9wcmludGsobGV2ZWwsIG9iaiwgZm10LCBhcmdzLi4uKSBcCisJX19idWlsdGluX2Nob29zZV9leHByKCBcCisJICBfX2RyYmRfcHJpbnRrX2lmX3NhbWVfdHlwZShvYmosIHN0cnVjdCBkcmJkX2RldmljZSAqLCBcCisJCQkgICAgIF9fZHJiZF9wcmludGtfZGV2aWNlLCBsZXZlbCwgZm10LCAjIyBhcmdzKSwgXAorCSAgX19idWlsdGluX2Nob29zZV9leHByKCBcCisJICAgIF9fZHJiZF9wcmludGtfaWZfc2FtZV90eXBlKG9iaiwgc3RydWN0IGRyYmRfcmVzb3VyY2UgKiwgXAorCQkJICAgICAgIF9fZHJiZF9wcmludGtfcmVzb3VyY2UsIGxldmVsLCBmbXQsICMjIGFyZ3MpLCBcCisJICAgIF9fYnVpbHRpbl9jaG9vc2VfZXhwciggXAorCSAgICAgIF9fZHJiZF9wcmludGtfaWZfc2FtZV90eXBlKG9iaiwgc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqLCBcCisJCQkJIF9fZHJiZF9wcmludGtfY29ubmVjdGlvbiwgbGV2ZWwsIGZtdCwgIyMgYXJncyksIFwKKwkgICAgICBfX2J1aWx0aW5fY2hvb3NlX2V4cHIoIFwKKwkJX19kcmJkX3ByaW50a19pZl9zYW1lX3R5cGUob2JqLCBzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCBcCisJCQkJIF9fZHJiZF9wcmludGtfcGVlcl9kZXZpY2UsIGxldmVsLCBmbXQsICMjIGFyZ3MpLCBcCisJCWRyYmRfcHJpbnRrX3dpdGhfd3Jvbmdfb2JqZWN0X3R5cGUoKSkpKSkKKworI2RlZmluZSBkcmJkX2RiZyhvYmosIGZtdCwgYXJncy4uLikgXAorCWRyYmRfcHJpbnRrKEtFUk5fREVCVUcsIG9iaiwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBkcmJkX2FsZXJ0KG9iaiwgZm10LCBhcmdzLi4uKSBcCisJZHJiZF9wcmludGsoS0VSTl9BTEVSVCwgb2JqLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIGRyYmRfZXJyKG9iaiwgZm10LCBhcmdzLi4uKSBcCisJZHJiZF9wcmludGsoS0VSTl9FUlIsIG9iaiwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBkcmJkX3dhcm4ob2JqLCBmbXQsIGFyZ3MuLi4pIFwKKwlkcmJkX3ByaW50ayhLRVJOX1dBUk5JTkcsIG9iaiwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBkcmJkX2luZm8ob2JqLCBmbXQsIGFyZ3MuLi4pIFwKKwlkcmJkX3ByaW50ayhLRVJOX0lORk8sIG9iaiwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBkcmJkX2VtZXJnKG9iaiwgZm10LCBhcmdzLi4uKSBcCisJZHJiZF9wcmludGsoS0VSTl9FTUVSRywgb2JqLCBmbXQsICMjIGFyZ3MpCisKKyNkZWZpbmUgZHluYW1pY19kcmJkX2RiZyhkZXZpY2UsIGZtdCwgYXJncy4uLikgXAorCWR5bmFtaWNfZGV2X2RiZyhkaXNrX3RvX2RldihkZXZpY2UtPnZkaXNrKSwgZm10LCAjIyBhcmdzKQorCisjZGVmaW5lIERfQVNTRVJUKGRldmljZSwgZXhwKQlkbyB7IFwKKwlpZiAoIShleHApKSBcCisJCWRyYmRfZXJyKGRldmljZSwgIkFTU0VSVCggIiAjZXhwICIgKSBpbiAlczolZFxuIiwgX19GSUxFX18sIF9fTElORV9fKTsgXAorCX0gd2hpbGUgKDApCiAKIC8qKgogICogZXhwZWN0ICAtICBNYWtlIGFuIGFzc2VydGlvbgpAQCAtMTIzLDcgKzE2MSw3IEBACiAjZGVmaW5lIGV4cGVjdChleHApICh7CQkJCQkJCQlcCiAJCWJvb2wgX2Jvb2wgPSAoZXhwKTsJCQkJCQlcCiAJCWlmICghX2Jvb2wpCQkJCQkJCVwKLQkJCWRldl9lcnIoREVWLCAiQVNTRVJUSU9OICVzIEZBSUxFRCBpbiAlc1xuIiwJCVwKKwkJCWRyYmRfZXJyKGRldmljZSwgIkFTU0VSVElPTiAlcyBGQUlMRUQgaW4gJXNcbiIsCQlcCiAJCQkgICAgICAgICNleHAsIF9fZnVuY19fKTsJCQkJXAogCQlfYm9vbDsJCQkJCQkJCVwKIAkJfSkKQEAgLTE0NSwxNCArMTgzLDE0IEBACiB9OwogCiBleHRlcm4gdW5zaWduZWQgaW50Ci1fZHJiZF9pbnNlcnRfZmF1bHQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgaW50IHR5cGUpOworX2RyYmRfaW5zZXJ0X2ZhdWx0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgdHlwZSk7CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1kcmJkX2luc2VydF9mYXVsdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSkgeworZHJiZF9pbnNlcnRfZmF1bHQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGludCB0eXBlKSB7CiAjaWZkZWYgQ09ORklHX0RSQkRfRkFVTFRfSU5KRUNUSU9OCiAJcmV0dXJuIGZhdWx0X3JhdGUgJiYKIAkJKGVuYWJsZV9mYXVsdHMgJiAoMTw8dHlwZSkpICYmCi0JCV9kcmJkX2luc2VydF9mYXVsdChtZGV2LCB0eXBlKTsKKwkJX2RyYmRfaW5zZXJ0X2ZhdWx0KGRldmljZSwgdHlwZSk7CiAjZWxzZQogCXJldHVybiAwOwogI2VuZGlmCkBAIC0xNjQsNzQgKzIwMiw4IEBACiAjZGVmaW5lIGRpdl9mbG9vcihBLCBCKSAoKEEpLyhCKSkKIAogZXh0ZXJuIHN0cnVjdCByYXRlbGltaXRfc3RhdGUgZHJiZF9yYXRlbGltaXRfc3RhdGU7Ci1leHRlcm4gc3RydWN0IGlkciBtaW5vcnM7IC8qIFJDVSwgdXBkYXRlczogZ2VubF9sb2NrKCkgKi8KLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGRyYmRfdGNvbm5zOyAvKiBSQ1UsIHVwZGF0ZXM6IGdlbmxfbG9jaygpICovCi0KLS8qIG9uIHRoZSB3aXJlICovCi1lbnVtIGRyYmRfcGFja2V0IHsKLQkvKiByZWNlaXZlciAoZGF0YSBzb2NrZXQpICovCi0JUF9EQVRBCQkgICAgICA9IDB4MDAsCi0JUF9EQVRBX1JFUExZCSAgICAgID0gMHgwMSwgLyogUmVzcG9uc2UgdG8gUF9EQVRBX1JFUVVFU1QgKi8KLQlQX1JTX0RBVEFfUkVQTFkJICAgICAgPSAweDAyLCAvKiBSZXNwb25zZSB0byBQX1JTX0RBVEFfUkVRVUVTVCAqLwotCVBfQkFSUklFUgkgICAgICA9IDB4MDMsCi0JUF9CSVRNQVAJICAgICAgPSAweDA0LAotCVBfQkVDT01FX1NZTkNfVEFSR0VUICA9IDB4MDUsCi0JUF9CRUNPTUVfU1lOQ19TT1VSQ0UgID0gMHgwNiwKLQlQX1VOUExVR19SRU1PVEUJICAgICAgPSAweDA3LCAvKiBVc2VkIGF0IHZhcmlvdXMgdGltZXMgdG8gaGludCB0aGUgcGVlciAqLwotCVBfREFUQV9SRVFVRVNUCSAgICAgID0gMHgwOCwgLyogVXNlZCB0byBhc2sgZm9yIGEgZGF0YSBibG9jayAqLwotCVBfUlNfREFUQV9SRVFVRVNUICAgICA9IDB4MDksIC8qIFVzZWQgdG8gYXNrIGZvciBhIGRhdGEgYmxvY2sgZm9yIHJlc3luYyAqLwotCVBfU1lOQ19QQVJBTQkgICAgICA9IDB4MGEsCi0JUF9QUk9UT0NPTAkgICAgICA9IDB4MGIsCi0JUF9VVUlEUwkJICAgICAgPSAweDBjLAotCVBfU0laRVMJCSAgICAgID0gMHgwZCwKLQlQX1NUQVRFCQkgICAgICA9IDB4MGUsCi0JUF9TWU5DX1VVSUQJICAgICAgPSAweDBmLAotCVBfQVVUSF9DSEFMTEVOR0UgICAgICA9IDB4MTAsCi0JUF9BVVRIX1JFU1BPTlNFCSAgICAgID0gMHgxMSwKLQlQX1NUQVRFX0NIR19SRVEJICAgICAgPSAweDEyLAotCi0JLyogYXNlbmRlciAobWV0YSBzb2NrZXQgKi8KLQlQX1BJTkcJCSAgICAgID0gMHgxMywKLQlQX1BJTkdfQUNLCSAgICAgID0gMHgxNCwKLQlQX1JFQ1ZfQUNLCSAgICAgID0gMHgxNSwgLyogVXNlZCBpbiBwcm90b2NvbCBCICovCi0JUF9XUklURV9BQ0sJICAgICAgPSAweDE2LCAvKiBVc2VkIGluIHByb3RvY29sIEMgKi8KLQlQX1JTX1dSSVRFX0FDSwkgICAgICA9IDB4MTcsIC8qIElzIGEgUF9XUklURV9BQ0ssIGFkZGl0aW9uYWxseSBjYWxsIHNldF9pbl9zeW5jKCkuICovCi0JUF9TVVBFUlNFREVECSAgICAgID0gMHgxOCwgLyogVXNlZCBpbiBwcm90byBDLCB0d28tcHJpbWFyaWVzIGNvbmZsaWN0IGRldGVjdGlvbiAqLwotCVBfTkVHX0FDSwkgICAgICA9IDB4MTksIC8qIFNlbnQgaWYgbG9jYWwgZGlzayBpcyB1bnVzYWJsZSAqLwotCVBfTkVHX0RSRVBMWQkgICAgICA9IDB4MWEsIC8qIExvY2FsIGRpc2sgaXMgYnJva2VuLi4uICovCi0JUF9ORUdfUlNfRFJFUExZCSAgICAgID0gMHgxYiwgLyogTG9jYWwgZGlzayBpcyBicm9rZW4uLi4gKi8KLQlQX0JBUlJJRVJfQUNLCSAgICAgID0gMHgxYywKLQlQX1NUQVRFX0NIR19SRVBMWSAgICAgPSAweDFkLAotCi0JLyogIm5ldyIgY29tbWFuZHMsIG5vIGxvbmdlciBmaXR0aW5nIGludG8gdGhlIG9yZGVyaW5nIHNjaGVtZSBhYm92ZSAqLwotCi0JUF9PVl9SRVFVRVNUCSAgICAgID0gMHgxZSwgLyogZGF0YSBzb2NrZXQgKi8KLQlQX09WX1JFUExZCSAgICAgID0gMHgxZiwKLQlQX09WX1JFU1VMVAkgICAgICA9IDB4MjAsIC8qIG1ldGEgc29ja2V0ICovCi0JUF9DU1VNX1JTX1JFUVVFU1QgICAgID0gMHgyMSwgLyogZGF0YSBzb2NrZXQgKi8KLQlQX1JTX0lTX0lOX1NZTkMJICAgICAgPSAweDIyLCAvKiBtZXRhIHNvY2tldCAqLwotCVBfU1lOQ19QQVJBTTg5CSAgICAgID0gMHgyMywgLyogZGF0YSBzb2NrZXQsIHByb3RvY29sIHZlcnNpb24gODkgcmVwbGFjZW1lbnQgZm9yIFBfU1lOQ19QQVJBTSAqLwotCVBfQ09NUFJFU1NFRF9CSVRNQVAgICA9IDB4MjQsIC8qIGNvbXByZXNzZWQgb3Igb3RoZXJ3aXNlIGVuY29kZWQgYml0bWFwIHRyYW5zZmVyICovCi0JLyogUF9DS1BUX0ZFTkNFX1JFUSAgICAgID0gMHgyNSwgKiBjdXJyZW50bHkgcmVzZXJ2ZWQgZm9yIHByb3RvY29sIEQgKi8KLQkvKiBQX0NLUFRfRElTQUJMRV9SRVEgICAgPSAweDI2LCAqIGN1cnJlbnRseSByZXNlcnZlZCBmb3IgcHJvdG9jb2wgRCAqLwotCVBfREVMQVlfUFJPQkUgICAgICAgICA9IDB4MjcsIC8qIGlzIHVzZWQgb24gQk9USCBzb2NrZXRzICovCi0JUF9PVVRfT0ZfU1lOQyAgICAgICAgID0gMHgyOCwgLyogTWFyayBhcyBvdXQgb2Ygc3luYyAoT3V0cnVubmluZyksIGRhdGEgc29ja2V0ICovCi0JUF9SU19DQU5DRUwgICAgICAgICAgID0gMHgyOSwgLyogbWV0YTogVXNlZCB0byBjYW5jZWwgUlNfREFUQV9SRVFVRVNUIHBhY2tldCBieSBTeW5jU291cmNlICovCi0JUF9DT05OX1NUX0NIR19SRVEgICAgID0gMHgyYSwgLyogZGF0YSBzb2NrOiBDb25uZWN0aW9uIHdpZGUgc3RhdGUgcmVxdWVzdCAqLwotCVBfQ09OTl9TVF9DSEdfUkVQTFkgICA9IDB4MmIsIC8qIG1ldGEgc29jazogQ29ubmVjdGlvbiBzaWRlIHN0YXRlIHJlcSByZXBseSAqLwotCVBfUkVUUllfV1JJVEUJICAgICAgPSAweDJjLCAvKiBQcm90b2NvbCBDOiByZXRyeSBjb25mbGljdGluZyB3cml0ZSByZXF1ZXN0ICovCi0JUF9QUk9UT0NPTF9VUERBVEUgICAgID0gMHgyZCwgLyogZGF0YSBzb2NrOiBpcyB1c2VkIGluIGVzdGFibGlzaGVkIGNvbm5lY3Rpb25zICovCi0KLQlQX01BWV9JR05PUkUJICAgICAgPSAweDEwMCwgLyogRmxhZyB0byB0ZXN0IGlmIChjbWQgPiBQX01BWV9JR05PUkUpIC4uLiAqLwotCVBfTUFYX09QVF9DTUQJICAgICAgPSAweDEwMSwKLQotCS8qIHNwZWNpYWwgY29tbWFuZCBpZHMgZm9yIGhhbmRzaGFrZSAqLwotCi0JUF9JTklUSUFMX01FVEEJICAgICAgPSAweGZmZjEsIC8qIEZpcnN0IFBhY2tldCBvbiB0aGUgTWV0YVNvY2sgKi8KLQlQX0lOSVRJQUxfREFUQQkgICAgICA9IDB4ZmZmMiwgLyogRmlyc3QgUGFja2V0IG9uIHRoZSBTb2NrZXQgKi8KLQotCVBfQ09OTkVDVElPTl9GRUFUVVJFUyA9IDB4ZmZmZQkvKiBGSVhFRCBmb3IgdGhlIG5leHQgY2VudHVyeSEgKi8KLX07CitleHRlcm4gc3RydWN0IGlkciBkcmJkX2RldmljZXM7IC8qIFJDVSwgdXBkYXRlczogZ2VubF9sb2NrKCkgKi8KK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGRyYmRfcmVzb3VyY2VzOyAvKiBSQ1UsIHVwZGF0ZXM6IGdlbmxfbG9jaygpICovCiAKIGV4dGVybiBjb25zdCBjaGFyICpjbWRuYW1lKGVudW0gZHJiZF9wYWNrZXQgY21kKTsKIApAQCAtMjUzLDcgKzIyNSw3IEBACiAJdW5zaWduZWQgYnl0ZXNbMl07CiB9OwogCi1leHRlcm4gdm9pZCBJTkZPX2JtX3hmZXJfc3RhdHMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK2V4dGVybiB2b2lkIElORk9fYm1feGZlcl9zdGF0cyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJY29uc3QgY2hhciAqZGlyZWN0aW9uLCBzdHJ1Y3QgYm1feGZlcl9jdHggKmMpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgYm1feGZlcl9jdHhfYml0X3RvX3dvcmRfb2Zmc2V0KHN0cnVjdCBibV94ZmVyX2N0eCAqYykKQEAgLTI3NSwyMzMgKzI0Nyw3IEBACiAjZW5kaWYKIH0KIAotI2lmbmRlZiBfX3BhY2tlZAotI2RlZmluZSBfX3BhY2tlZCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQotI2VuZGlmCi0KLS8qIFRoaXMgaXMgdGhlIGxheW91dCBmb3IgYSBwYWNrZXQgb24gdGhlIHdpcmUuCi0gKiBUaGUgYnl0ZW9yZGVyIGlzIHRoZSBuZXR3b3JrIGJ5dGUgb3JkZXIuCi0gKiAgICAgKGV4Y2VwdCBibG9ja19pZCBhbmQgYmFycmllciBmaWVsZHMuCi0gKgl0aGVzZSBhcmUgcG9pbnRlcnMgdG8gbG9jYWwgc3RydWN0cwotICoJYW5kIGhhdmUgbm8gcmVsZXZhbmNlIGZvciB0aGUgcGFydG5lciwKLSAqCXdoaWNoIGp1c3QgZWNob2VzIHRoZW0gYXMgcmVjZWl2ZWQuKQotICoKLSAqIE5PVEUgdGhhdCB0aGUgcGF5bG9hZCBzdGFydHMgYXQgYSBsb25nIGFsaWduZWQgb2Zmc2V0LAotICogcmVnYXJkbGVzcyBvZiAzMiBvciA2NCBiaXQgYXJjaCEKLSAqLwotc3RydWN0IHBfaGVhZGVyODAgewotCXUzMgkgIG1hZ2ljOwotCXUxNgkgIGNvbW1hbmQ7Ci0JdTE2CSAgbGVuZ3RoOwkvKiBieXRlcyBvZiBkYXRhIGFmdGVyIHRoaXMgaGVhZGVyICovCi19IF9fcGFja2VkOwotCi0vKiBIZWFkZXIgZm9yIGJpZyBwYWNrZXRzLCBVc2VkIGZvciBkYXRhIHBhY2tldHMgZXhjZWVkaW5nIDY0a0IgKi8KLXN0cnVjdCBwX2hlYWRlcjk1IHsKLQl1MTYJICBtYWdpYzsJLyogdXNlIERSQkRfTUFHSUNfQklHIGhlcmUgKi8KLQl1MTYJICBjb21tYW5kOwotCXUzMgkgIGxlbmd0aDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX2hlYWRlcjEwMCB7Ci0JdTMyCSAgbWFnaWM7Ci0JdTE2CSAgdm9sdW1lOwotCXUxNgkgIGNvbW1hbmQ7Ci0JdTMyCSAgbGVuZ3RoOwotCXUzMgkgIHBhZDsKLX0gX19wYWNrZWQ7Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgZHJiZF9oZWFkZXJfc2l6ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pOwotCi0vKiB0aGVzZSBkZWZpbmVzIG11c3Qgbm90IGJlIGNoYW5nZWQgd2l0aG91dCBjaGFuZ2luZyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAqLwotI2RlZmluZSBEUF9IQVJEQkFSUklFUgkgICAgICAxIC8qIGRlcHJpY2F0ZWQgKi8KLSNkZWZpbmUgRFBfUldfU1lOQwkgICAgICAyIC8qIGVxdWFscyBSRVFfU1lOQyAgICAqLwotI2RlZmluZSBEUF9NQVlfU0VUX0lOX1NZTkMgICAgNAotI2RlZmluZSBEUF9VTlBMVUcgICAgICAgICAgICAgOCAvKiBub3QgdXNlZCBhbnltb3JlICAgKi8KLSNkZWZpbmUgRFBfRlVBICAgICAgICAgICAgICAgMTYgLyogZXF1YWxzIFJFUV9GVUEgICAgICovCi0jZGVmaW5lIERQX0ZMVVNIICAgICAgICAgICAgIDMyIC8qIGVxdWFscyBSRVFfRkxVU0ggICAqLwotI2RlZmluZSBEUF9ESVNDQVJEICAgICAgICAgICA2NCAvKiBlcXVhbHMgUkVRX0RJU0NBUkQgKi8KLSNkZWZpbmUgRFBfU0VORF9SRUNFSVZFX0FDSyAxMjggLyogVGhpcyBpcyBhIHByb3RvIEIgd3JpdGUgcmVxdWVzdCAqLwotI2RlZmluZSBEUF9TRU5EX1dSSVRFX0FDSyAgIDI1NiAvKiBUaGlzIGlzIGEgcHJvdG8gQyB3cml0ZSByZXF1ZXN0ICovCi0KLXN0cnVjdCBwX2RhdGEgewotCXU2NAkgICAgc2VjdG9yOyAgICAvKiA2NCBiaXRzIHNlY3RvciBudW1iZXIgKi8KLQl1NjQJICAgIGJsb2NrX2lkOyAgLyogdG8gaWRlbnRpZnkgdGhlIHJlcXVlc3QgaW4gcHJvdG9jb2wgQiZDICovCi0JdTMyCSAgICBzZXFfbnVtOwotCXUzMgkgICAgZHBfZmxhZ3M7Ci19IF9fcGFja2VkOwotCi0vKgotICogY29tbWFuZHMgd2hpY2ggc2hhcmUgYSBzdHJ1Y3Q6Ci0gKiAgcF9ibG9ja19hY2s6Ci0gKiAgIFBfUkVDVl9BQ0sgKHByb3RvIEIpLCBQX1dSSVRFX0FDSyAocHJvdG8gQyksCi0gKiAgIFBfU1VQRVJTRURFRCAocHJvdG8gQywgdHdvLXByaW1hcmllcyBjb25mbGljdCBkZXRlY3Rpb24pCi0gKiAgcF9ibG9ja19yZXE6Ci0gKiAgIFBfREFUQV9SRVFVRVNULCBQX1JTX0RBVEFfUkVRVUVTVAotICovCi1zdHJ1Y3QgcF9ibG9ja19hY2sgewotCXU2NAkgICAgc2VjdG9yOwotCXU2NAkgICAgYmxvY2tfaWQ7Ci0JdTMyCSAgICBibGtzaXplOwotCXUzMgkgICAgc2VxX251bTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX2Jsb2NrX3JlcSB7Ci0JdTY0IHNlY3RvcjsKLQl1NjQgYmxvY2tfaWQ7Ci0JdTMyIGJsa3NpemU7Ci0JdTMyIHBhZDsJLyogdG8gbXVsdGlwbGUgb2YgOCBCeXRlICovCi19IF9fcGFja2VkOwotCi0vKgotICogY29tbWFuZHMgd2l0aCB0aGVpciBvd24gc3RydWN0IGZvciBhZGRpdGlvbmFsIGZpZWxkczoKLSAqICAgUF9DT05ORUNUSU9OX0ZFQVRVUkVTCi0gKiAgIFBfQkFSUklFUgotICogICBQX0JBUlJJRVJfQUNLCi0gKiAgIFBfU1lOQ19QQVJBTQotICogICBSZXBvcnRQYXJhbXMKLSAqLwotCi1zdHJ1Y3QgcF9jb25uZWN0aW9uX2ZlYXR1cmVzIHsKLQl1MzIgcHJvdG9jb2xfbWluOwotCXUzMiBmZWF0dXJlX2ZsYWdzOwotCXUzMiBwcm90b2NvbF9tYXg7Ci0KLQkvKiBzaG91bGQgYmUgbW9yZSB0aGFuIGVub3VnaCBmb3IgZnV0dXJlIGVuaGFuY2VtZW50cwotCSAqIGZvciBub3csIGZlYXR1cmVfZmxhZ3MgYW5kIHRoZSByZXNlcnZlZCBhcnJheSBzaGFsbCBiZSB6ZXJvLgotCSAqLwotCi0JdTMyIF9wYWQ7Ci0JdTY0IHJlc2VydmVkWzddOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHBfYmFycmllciB7Ci0JdTMyIGJhcnJpZXI7CS8qIGJhcnJpZXIgbnVtYmVyIF9oYW5kbGVfIG9ubHkgKi8KLQl1MzIgcGFkOwkvKiB0byBtdWx0aXBsZSBvZiA4IEJ5dGUgKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX2JhcnJpZXJfYWNrIHsKLQl1MzIgYmFycmllcjsKLQl1MzIgc2V0X3NpemU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgcF9yc19wYXJhbSB7Ci0JdTMyIHJlc3luY19yYXRlOwotCi0JICAgICAgLyogU2luY2UgcHJvdG9jb2wgdmVyc2lvbiA4OCBhbmQgaGlnaGVyLiAqLwotCWNoYXIgdmVyaWZ5X2FsZ1swXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX3JzX3BhcmFtXzg5IHsKLQl1MzIgcmVzeW5jX3JhdGU7Ci0gICAgICAgIC8qIHByb3RvY29sIHZlcnNpb24gODk6ICovCi0JY2hhciB2ZXJpZnlfYWxnW1NIQVJFRF9TRUNSRVRfTUFYXTsKLQljaGFyIGNzdW1zX2FsZ1tTSEFSRURfU0VDUkVUX01BWF07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgcF9yc19wYXJhbV85NSB7Ci0JdTMyIHJlc3luY19yYXRlOwotCWNoYXIgdmVyaWZ5X2FsZ1tTSEFSRURfU0VDUkVUX01BWF07Ci0JY2hhciBjc3Vtc19hbGdbU0hBUkVEX1NFQ1JFVF9NQVhdOwotCXUzMiBjX3BsYW5fYWhlYWQ7Ci0JdTMyIGNfZGVsYXlfdGFyZ2V0OwotCXUzMiBjX2ZpbGxfdGFyZ2V0OwotCXUzMiBjX21heF9yYXRlOwotfSBfX3BhY2tlZDsKLQotZW51bSBkcmJkX2Nvbm5fZmxhZ3MgewotCUNGX0RJU0NBUkRfTVlfREFUQSA9IDEsCi0JQ0ZfRFJZX1JVTiA9IDIsCi19OwotCi1zdHJ1Y3QgcF9wcm90b2NvbCB7Ci0JdTMyIHByb3RvY29sOwotCXUzMiBhZnRlcl9zYl8wcDsKLQl1MzIgYWZ0ZXJfc2JfMXA7Ci0JdTMyIGFmdGVyX3NiXzJwOwotCXUzMiBjb25uX2ZsYWdzOwotCXUzMiB0d29fcHJpbWFyaWVzOwotCi0gICAgICAgICAgICAgIC8qIFNpbmNlIHByb3RvY29sIHZlcnNpb24gODcgYW5kIGhpZ2hlci4gKi8KLQljaGFyIGludGVncml0eV9hbGdbMF07Ci0KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX3V1aWRzIHsKLQl1NjQgdXVpZFtVSV9FWFRFTkRFRF9TSVpFXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX3JzX3V1aWQgewotCXU2NAkgICAgdXVpZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX3NpemVzIHsKLQl1NjQJICAgIGRfc2l6ZTsgIC8qIHNpemUgb2YgZGlzayAqLwotCXU2NAkgICAgdV9zaXplOyAgLyogdXNlciByZXF1ZXN0ZWQgc2l6ZSAqLwotCXU2NAkgICAgY19zaXplOyAgLyogY3VycmVudCBleHBvcnRlZCBzaXplICovCi0JdTMyCSAgICBtYXhfYmlvX3NpemU7ICAvKiBNYXhpbWFsIHNpemUgb2YgYSBCSU8gKi8KLQl1MTYJICAgIHF1ZXVlX29yZGVyX3R5cGU7ICAvKiBub3QgeWV0IGltcGxlbWVudGVkIGluIERSQkQqLwotCXUxNgkgICAgZGRzX2ZsYWdzOyAvKiB1c2UgZW51bSBkZHNfZmxhZ3MgaGVyZS4gKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX3N0YXRlIHsKLQl1MzIJICAgIHN0YXRlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHBfcmVxX3N0YXRlIHsKLQl1MzIJICAgIG1hc2s7Ci0JdTMyCSAgICB2YWw7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgcF9yZXFfc3RhdGVfcmVwbHkgewotCXUzMgkgICAgcmV0Y29kZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX2RyYmQwNl9wYXJhbSB7Ci0JdTY0CSAgc2l6ZTsKLQl1MzIJICBzdGF0ZTsKLQl1MzIJICBibGtzaXplOwotCXUzMgkgIHByb3RvY29sOwotCXUzMgkgIHZlcnNpb247Ci0JdTMyCSAgZ2VuX2NudFs1XTsKLQl1MzIJICBiaXRfbWFwX2dlbls1XTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX2Jsb2NrX2Rlc2MgewotCXU2NCBzZWN0b3I7Ci0JdTMyIGJsa3NpemU7Ci0JdTMyIHBhZDsJLyogdG8gbXVsdGlwbGUgb2YgOCBCeXRlICovCi19IF9fcGFja2VkOwotCi0vKiBWYWxpZCB2YWx1ZXMgZm9yIHRoZSBlbmNvZGluZyBmaWVsZC4KLSAqIEJ1bXAgcHJvdG8gdmVyc2lvbiB3aGVuIGNoYW5naW5nIHRoaXMuICovCi1lbnVtIGRyYmRfYml0bWFwX2NvZGUgewotCS8qIFJMRV9WTElfQnl0ZXMgPSAwLAotCSAqIGFuZCBvdGhlciBiaXQgdmFyaWFudHMgaGFkIGJlZW4gZGVmaW5lZCBkdXJpbmcKLQkgKiBhbGdvcml0aG0gZXZhbHVhdGlvbi4gKi8KLQlSTEVfVkxJX0JpdHMgPSAyLAotfTsKLQotc3RydWN0IHBfY29tcHJlc3NlZF9ibSB7Ci0JLyogKGVuY29kaW5nICYgMHgwZik6IGFjdHVhbCBlbmNvZGluZywgc2VlIGVudW0gZHJiZF9iaXRtYXBfY29kZQotCSAqIChlbmNvZGluZyAmIDB4ODApOiBwb2xhcml0eSAoc2V0L3Vuc2V0KSBvZiBmaXJzdCBydW5sZW5ndGgKLQkgKiAoKGVuY29kaW5nID4+IDQpICYgMHgwNyk6IHBhZF9iaXRzLCBudW1iZXIgb2YgdHJhaWxpbmcgemVybyBiaXRzCi0JICogdXNlZCB0byBwYWQgdXAgdG8gaGVhZC5sZW5ndGggYnl0ZXMKLQkgKi8KLQl1OCBlbmNvZGluZzsKLQotCXU4IGNvZGVbMF07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgcF9kZWxheV9wcm9iZTkzIHsKLQl1MzIgICAgIHNlcV9udW07IC8qIHNlcXVlbmNlIG51bWJlciB0byBtYXRjaCB0aGUgdHdvIHByb2JlIHBhY2tldHMgKi8KLQl1MzIgICAgIG9mZnNldDsgIC8qIHVzZWNzIHRoZSBwcm9iZSBnb3Qgc2VudCBhZnRlciB0aGUgcmVmZXJlbmNlIHRpbWUgcG9pbnQgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBCaXRtYXAgcGFja2V0cyBuZWVkIHRvIGZpdCB3aXRoaW4gYSBzaW5nbGUgcGFnZSBvbiB0aGUgc2VuZGVyIGFuZCByZWNlaXZlciwKLSAqIHNvIHdlIGFyZSBsaW1pdGVkIHRvIDQgS2lCIChhbmQgbm90IHRvIFBBR0VfU0laRSwgd2hpY2ggY2FuIGJlIGJpZ2dlcikuCi0gKi8KLSNkZWZpbmUgRFJCRF9TT0NLRVRfQlVGRkVSX1NJWkUgNDA5NgorZXh0ZXJuIHVuc2lnbmVkIGludCBkcmJkX2hlYWRlcl9zaXplKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGVudW0gZHJiZF90aHJlYWRfc3RhdGUgewpAQCAtNTE3LDkgKzI2MywxMCBAQAogCXN0cnVjdCBjb21wbGV0aW9uIHN0b3A7CiAJZW51bSBkcmJkX3RocmVhZF9zdGF0ZSB0X3N0YXRlOwogCWludCAoKmZ1bmN0aW9uKSAoc3RydWN0IGRyYmRfdGhyZWFkICopOwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubjsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2U7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKIAlpbnQgcmVzZXRfY3B1X21hc2s7Ci0JY2hhciBuYW1lWzldOworCWNvbnN0IGNoYXIgKm5hbWU7CiB9OwogCiBzdGF0aWMgaW5saW5lIGVudW0gZHJiZF90aHJlYWRfc3RhdGUgZ2V0X3Rfc3RhdGUoc3RydWN0IGRyYmRfdGhyZWFkICp0aGkpCkBAIC01MzUsMTggKzI4MiwyMCBAQAogc3RydWN0IGRyYmRfd29yayB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWludCAoKmNiKShzdHJ1Y3QgZHJiZF93b3JrICosIGludCBjYW5jZWwpOwotCXVuaW9uIHsKLQkJc3RydWN0IGRyYmRfY29uZiAqbWRldjsKLQkJc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uOwotCX07Cit9OworCitzdHJ1Y3QgZHJiZF9kZXZpY2Vfd29yayB7CisJc3RydWN0IGRyYmRfd29yayB3OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogfTsKIAogI2luY2x1ZGUgImRyYmRfaW50ZXJ2YWwuaCIKIAotZXh0ZXJuIGludCBkcmJkX3dhaXRfbWlzYyhzdHJ1Y3QgZHJiZF9jb25mICosIHN0cnVjdCBkcmJkX2ludGVydmFsICopOworZXh0ZXJuIGludCBkcmJkX3dhaXRfbWlzYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgc3RydWN0IGRyYmRfaW50ZXJ2YWwgKik7CiAKIHN0cnVjdCBkcmJkX3JlcXVlc3QgewogCXN0cnVjdCBkcmJkX3dvcmsgdzsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAogCS8qIGlmIGxvY2FsIElPIGlzIG5vdCBhbGxvd2VkLCB3aWxsIGJlIE5VTEwuCiAJICogaWYgbG9jYWwgSU8gX2lzXyBhbGxvd2VkLCBob2xkcyB0aGUgbG9jYWxseSBzdWJtaXR0ZWQgYmlvIGNsb25lLApAQCAtNTc5LDcgKzMyOCw3IEBACiB9OwogCiBzdHJ1Y3QgZHJiZF9lcG9jaCB7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXVuc2lnbmVkIGludCBiYXJyaWVyX25yOwogCWF0b21pY190IGVwb2NoX3NpemU7IC8qIGluY3JlYXNlZCBvbiBldmVyeSByZXF1ZXN0IGFkZGVkLiAqLwpAQCAtNTg3LDYgKzMzNiwxMCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiB9OwogCisvKiBQcm90b3R5cGUgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb24gZGVmaW5lZCBpbiBkcmJkX3JlY2VpdmVyLmMgKi8KK2ludCBkcmJkZF9pbml0KHN0cnVjdCBkcmJkX3RocmVhZCAqKTsKK2ludCBkcmJkX2FzZW5kZXIoc3RydWN0IGRyYmRfdGhyZWFkICopOworCiAvKiBkcmJkX2Vwb2NoIGZsYWcgYml0cyAqLwogZW51bSB7CiAJREVfSEFWRV9CQVJSSUVSX05VTUJFUiwKQEAgLTU5OSwxMSArMzUyLDYgQEAKIAlFVl9DTEVBTlVQID0gMzIsIC8qIHVzZWQgYXMgZmxhZyAqLwogfTsKIAotc3RydWN0IGRyYmRfd3FfYmFycmllciB7Ci0Jc3RydWN0IGRyYmRfd29yayB3OwotCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7Ci19OwotCiBzdHJ1Y3QgZGlnZXN0X2luZm8gewogCWludCBkaWdlc3Rfc2l6ZTsKIAl2b2lkICpkaWdlc3Q7CkBAIC02MTEsNiArMzU5LDcgQEAKIAogc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0IHsKIAlzdHJ1Y3QgZHJiZF93b3JrIHc7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCXN0cnVjdCBkcmJkX2Vwb2NoICplcG9jaDsgLyogZm9yIHdyaXRlcyAqLwogCXN0cnVjdCBwYWdlICpwYWdlczsKIAlhdG9taWNfdCBwZW5kaW5nX2Jpb3M7CkBAIC02NjMsNyArNDEyLDcgQEAKICNkZWZpbmUgRUVfU0VORF9XUklURV9BQ0sJKDE8PF9fRUVfU0VORF9XUklURV9BQ0spCiAjZGVmaW5lIEVFX0lOX0lOVEVSVkFMX1RSRUUJKDE8PF9fRUVfSU5fSU5URVJWQUxfVFJFRSkKIAotLyogZmxhZyBiaXRzIHBlciBtZGV2ICovCisvKiBmbGFnIGJpdHMgcGVyIGRldmljZSAqLwogZW51bSB7CiAJVU5QTFVHX1JFTU9URSwJCS8qIHNlbmRpbmcgYSAiVW5wbHVnUmVtb3RlIiBjb3VsZCBoZWxwICovCiAJTURfRElSVFksCQkvKiBjdXJyZW50IHV1aWRzIGFuZCBmbGFncyBub3QgeWV0IG9uIGRpc2sgKi8KQEAgLTY5NSw3ICs0NDQsNyBAQAogCVJFQURfQkFMQU5DRV9SUiwKIH07CiAKLXN0cnVjdCBkcmJkX2JpdG1hcDsgLyogb3BhcXVlIGZvciBkcmJkX2NvbmYgKi8KK3N0cnVjdCBkcmJkX2JpdG1hcDsgLyogb3BhcXVlIGZvciBkcmJkX2RldmljZSAqLwogCiAvKiBkZWZpbml0aW9uIG9mIGJpdHMgaW4gYm1fZmxhZ3MgdG8gYmUgdXNlZCBpbiBkcmJkX2JtX2xvY2sKICAqIGFuZCBkcmJkX2JpdG1hcF9pbyBhbmQgZnJpZW5kcy4gKi8KQEAgLTc2OSw3ICs1MTgsNyBAQAogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJhY2tpbmdfYmRldjsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICptZF9iZGV2OwogCXN0cnVjdCBkcmJkX21kIG1kOwotCXN0cnVjdCBkaXNrX2NvbmYgKmRpc2tfY29uZjsgLyogUkNVLCBmb3IgdXBkYXRlczogbWRldi0+dGNvbm4tPmNvbmZfdXBkYXRlICovCisJc3RydWN0IGRpc2tfY29uZiAqZGlza19jb25mOyAvKiBSQ1UsIGZvciB1cGRhdGVzOiByZXNvdXJjZS0+Y29uZl91cGRhdGUgKi8KIAlzZWN0b3JfdCBrbm93bl9zaXplOyAvKiBsYXN0IGtub3duIHNpemUgb2YgdGhhdCBiYWNraW5nIGRldmljZSAqLwogfTsKIApAQCAtNzgyLDggKzUzMSw4IEBACiAJc3RydWN0IGRyYmRfd29yayB3OwogCWNoYXIgKndoeTsKIAllbnVtIGJtX2ZsYWcgZmxhZ3M7Ci0JaW50ICgqaW9fZm4pKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotCXZvaWQgKCpkb25lKShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgcnYpOworCWludCAoKmlvX2ZuKShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CisJdm9pZCAoKmRvbmUpKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgcnYpOwogfTsKIAogZW51bSB3cml0ZV9vcmRlcmluZ19lIHsKQEAgLTgwMCw3ICs1NDksNyBAQAogfTsKIGV4dGVybiBzdHJ1Y3QgZmlmb19idWZmZXIgKmZpZm9fYWxsb2MoaW50IGZpZm9fc2l6ZSk7CiAKLS8qIGZsYWcgYml0cyBwZXIgdGNvbm4gKi8KKy8qIGZsYWcgYml0cyBwZXIgY29ubmVjdGlvbiAqLwogZW51bSB7CiAJTkVUX0NPTkdFU1RFRCwJCS8qIFRoZSBkYXRhIHNvY2tldCBpcyBjb25nZXN0ZWQgKi8KIAlSRVNPTFZFX0NPTkZMSUNUUywJLyogU2V0IG9uIG9uZSBub2RlLCBjbGVhcmVkIG9uIHRoZSBwZWVyISAqLwpAQCAtODIyLDIzICs1NzEsMzUgQEAKIAlESVNDT05ORUNUX1NFTlQsCiB9OwogCi1zdHJ1Y3QgZHJiZF90Y29ubiB7CQkJLyogaXMgYSByZXNvdXJjZSBmcm9tIHRoZSBjb25maWcgZmlsZSAqLwotCWNoYXIgKm5hbWU7CQkJLyogUmVzb3VyY2UgbmFtZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgYWxsX3Rjb25uOwkvKiBsaW5rZWQgb24gZ2xvYmFsIGRyYmRfdGNvbm5zICovCitzdHJ1Y3QgZHJiZF9yZXNvdXJjZSB7CisJY2hhciAqbmFtZTsKIAlzdHJ1Y3Qga3JlZiBrcmVmOwotCXN0cnVjdCBpZHIgdm9sdW1lczsJCS8qIDx0Y29ubiwgdm5yPiB0byBtZGV2IG1hcHBpbmcgKi8KLQllbnVtIGRyYmRfY29ubnMgY3N0YXRlOwkJLyogT25seSBDX1NUQU5EQUxPTkUgdG8gQ19XRl9SRVBPUlRfUEFSQU1TICovCisJc3RydWN0IGlkciBkZXZpY2VzOwkJLyogdm9sdW1lIG51bWJlciB0byBkZXZpY2UgbWFwcGluZyAqLworCXN0cnVjdCBsaXN0X2hlYWQgY29ubmVjdGlvbnM7CisJc3RydWN0IGxpc3RfaGVhZCByZXNvdXJjZXM7CisJc3RydWN0IHJlc19vcHRzIHJlc19vcHRzOworCXN0cnVjdCBtdXRleCBjb25mX3VwZGF0ZTsJLyogbXV0ZXggZm9yIHJlYWR5LWNvcHktdXBkYXRlIG9mIG5ldF9jb25mIGFuZCBkaXNrX2NvbmYgKi8KKwlzcGlubG9ja190IHJlcV9sb2NrOworCiAJdW5zaWduZWQgc3VzcDoxOwkJLyogSU8gc3VzcGVuZGVkIGJ5IHVzZXIgKi8KIAl1bnNpZ25lZCBzdXNwX25vZDoxOwkJLyogSU8gc3VzcGVuZGVkIGJlY2F1c2Ugbm8gZGF0YSAqLwogCXVuc2lnbmVkIHN1c3BfZmVuOjE7CQkvKiBJTyBzdXNwZW5kZWQgYmVjYXVzZSBmZW5jZSBwZWVyIGhhbmRsZXIgcnVucyAqLworCisJY3B1bWFza192YXJfdCBjcHVfbWFzazsKK307CisKK3N0cnVjdCBkcmJkX2Nvbm5lY3Rpb24geworCXN0cnVjdCBsaXN0X2hlYWQgY29ubmVjdGlvbnM7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBrcmVmIGtyZWY7CisJc3RydWN0IGlkciBwZWVyX2RldmljZXM7CS8qIHZvbHVtZSBudW1iZXIgdG8gcGVlciBkZXZpY2UgbWFwcGluZyAqLworCWVudW0gZHJiZF9jb25ucyBjc3RhdGU7CQkvKiBPbmx5IENfU1RBTkRBTE9ORSB0byBDX1dGX1JFUE9SVF9QQVJBTVMgKi8KIAlzdHJ1Y3QgbXV0ZXggY3N0YXRlX211dGV4OwkvKiBQcm90ZWN0cyBncmFjZWZ1bCBkaXNjb25uZWN0cyAqLwogCXVuc2lnbmVkIGludCBjb25uZWN0X2NudDsJLyogSW5jIGVhY2ggdGltZSBhIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgKi8KIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IG5ldF9jb25mICpuZXRfY29uZjsJLyogY29udGVudCBwcm90ZWN0ZWQgYnkgcmN1ICovCi0Jc3RydWN0IG11dGV4IGNvbmZfdXBkYXRlOwkvKiBtdXRleCBmb3IgcmVhZHktY29weS11cGRhdGUgb2YgbmV0X2NvbmYgYW5kIGRpc2tfY29uZiAqLwogCXdhaXRfcXVldWVfaGVhZF90IHBpbmdfd2FpdDsJLyogV29rZW4gdXBvbiByZWNlcHRpb24gb2YgYSBwaW5nLCBhbmQgYSBzdGF0ZSBjaGFuZ2UgKi8KLQlzdHJ1Y3QgcmVzX29wdHMgcmVzX29wdHM7CiAKIAlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBteV9hZGRyOwogCWludCBteV9hZGRyX2xlbjsKQEAgLTg1MSwxMiArNjEyLDEwIEBACiAJdW5zaWduZWQgbG9uZyBsYXN0X3JlY2VpdmVkOwkvKiBpbiBqaWZmaWVzLCBlaXRoZXIgc29ja2V0ICovCiAJdW5zaWduZWQgaW50IGtvX2NvdW50OwogCi0Jc3BpbmxvY2tfdCByZXFfbG9jazsKLQogCXN0cnVjdCBsaXN0X2hlYWQgdHJhbnNmZXJfbG9nOwkvKiBhbGwgcmVxdWVzdHMgbm90IHlldCBmdWxseSBwcm9jZXNzZWQgKi8KIAogCXN0cnVjdCBjcnlwdG9faGFzaCAqY3JhbV9obWFjX3RmbTsKLQlzdHJ1Y3QgY3J5cHRvX2hhc2ggKmludGVncml0eV90Zm07ICAvKiBjaGVja3N1bXMgd2UgY29tcHV0ZSwgdXBkYXRlcyBwcm90ZWN0ZWQgYnkgdGNvbm4tPmRhdGEtPm11dGV4ICovCisJc3RydWN0IGNyeXB0b19oYXNoICppbnRlZ3JpdHlfdGZtOyAgLyogY2hlY2tzdW1zIHdlIGNvbXB1dGUsIHVwZGF0ZXMgcHJvdGVjdGVkIGJ5IGNvbm5lY3Rpb24tPmRhdGEtPm11dGV4ICovCiAJc3RydWN0IGNyeXB0b19oYXNoICpwZWVyX2ludGVncml0eV90Zm07ICAvKiBjaGVja3N1bXMgd2UgdmVyaWZ5LCBvbmx5IGFjY2Vzc2VkIGZyb20gcmVjZWl2ZXIgdGhyZWFkICAqLwogCXN0cnVjdCBjcnlwdG9faGFzaCAqY3N1bXNfdGZtOwogCXN0cnVjdCBjcnlwdG9faGFzaCAqdmVyaWZ5X3RmbTsKQEAgLTg3NSw3ICs2MzQsNiBAQAogCXN0cnVjdCBkcmJkX3RocmVhZCByZWNlaXZlcjsKIAlzdHJ1Y3QgZHJiZF90aHJlYWQgd29ya2VyOwogCXN0cnVjdCBkcmJkX3RocmVhZCBhc2VuZGVyOwotCWNwdW1hc2tfdmFyX3QgY3B1X21hc2s7CiAKIAkvKiBzZW5kZXIgc2lkZSAqLwogCXN0cnVjdCBkcmJkX3dvcmtfcXVldWUgc2VuZGVyX3dvcms7CkBAIC05MDMsOCArNjYxLDE1IEBACiAJc3RydWN0IGxpc3RfaGVhZCB3cml0ZXM7CiB9OwogCi1zdHJ1Y3QgZHJiZF9jb25mIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm47CitzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSB7CisJc3RydWN0IGxpc3RfaGVhZCBwZWVyX2RldmljZXM7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKK307CisKK3N0cnVjdCBkcmJkX2RldmljZSB7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBsaXN0X2hlYWQgcGVlcl9kZXZpY2VzOwogCWludCB2bnI7CQkJLyogdm9sdW1lIG51bWJlciB3aXRoaW4gdGhlIGNvbm5lY3Rpb24gKi8KIAlzdHJ1Y3Qga3JlZiBrcmVmOwogCkBAIC05MjAsMTEgKzY4NSwxMSBAQAogCXN0cnVjdCBnZW5kaXNrCSAgICAqdmRpc2s7CiAKIAl1bnNpZ25lZCBsb25nIGxhc3RfcmVhdHRhY2hfamlmOwotCXN0cnVjdCBkcmJkX3dvcmsgIHJlc3luY193b3JrLAotCQkJICB1bnBsdWdfd29yaywKLQkJCSAgZ29fZGlza2xlc3MsCi0JCQkgIG1kX3N5bmNfd29yaywKLQkJCSAgc3RhcnRfcmVzeW5jX3dvcms7CisJc3RydWN0IGRyYmRfd29yayByZXN5bmNfd29yazsKKwlzdHJ1Y3QgZHJiZF93b3JrIHVucGx1Z193b3JrOworCXN0cnVjdCBkcmJkX3dvcmsgZ29fZGlza2xlc3M7CisJc3RydWN0IGRyYmRfd29yayBtZF9zeW5jX3dvcms7CisJc3RydWN0IGRyYmRfd29yayBzdGFydF9yZXN5bmNfd29yazsKIAlzdHJ1Y3QgdGltZXJfbGlzdCByZXN5bmNfdGltZXI7CiAJc3RydWN0IHRpbWVyX2xpc3QgbWRfc3luY190aW1lcjsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBzdGFydF9yZXN5bmNfdGltZXI7CkBAIC0xMDMwLDcgKzc5NSw3IEBACiAJc3RydWN0IGJtX2lvX3dvcmsgYm1faW9fd29yazsKIAl1NjQgZWRfdXVpZDsgLyogVVVJRCBvZiB0aGUgZXhwb3NlZCBkYXRhICovCiAJc3RydWN0IG11dGV4IG93bl9zdGF0ZV9tdXRleDsKLQlzdHJ1Y3QgbXV0ZXggKnN0YXRlX211dGV4OyAvKiBlaXRoZXIgb3duX3N0YXRlX211dGV4IG9yIG1kZXYtPnRjb25uLT5jc3RhdGVfbXV0ZXggKi8KKwlzdHJ1Y3QgbXV0ZXggKnN0YXRlX211dGV4OyAvKiBlaXRoZXIgb3duX3N0YXRlX211dGV4IG9yIGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmNzdGF0ZV9tdXRleCAqLwogCWNoYXIgY29uZ2VzdGlvbl9yZWFzb247ICAvKiBXaHkgd2Ugd2hlcmUgY29uZ2VzdGVkLi4uICovCiAJYXRvbWljX3QgcnNfc2VjdF9pbjsgLyogZm9yIGluY29taW5nIHJlc3luYyBkYXRhIHJhdGUsIFN5bmNUYXJnZXQgKi8KIAlhdG9taWNfdCByc19zZWN0X2V2OyAvKiBmb3Igc3VibWl0dGVkIHJlc3luYyBkYXRhIHJhdGUsIGJvdGggKi8KQEAgLTEwMzgsNyArODAzLDcgQEAKIAlpbnQgcnNfbGFzdF9ldmVudHM7ICAvKiBjb3VudGVyIG9mIHJlYWQgb3Igd3JpdGUgImV2ZW50cyIgKHVuaXQgc2VjdG9ycykKIAkJCSAgICAgICogb24gdGhlIGxvd2VyIGxldmVsIGRldmljZSB3aGVuIHdlIGxhc3QgbG9va2VkLiAqLwogCWludCBjX3N5bmNfcmF0ZTsgLyogY3VycmVudCByZXN5bmMgcmF0ZSBhZnRlciBzeW5jZXIgdGhyb3R0bGUgbWFnaWMgKi8KLQlzdHJ1Y3QgZmlmb19idWZmZXIgKnJzX3BsYW5fczsgLyogY29ycmVjdGlvbiB2YWx1ZXMgb2YgcmVzeW5jIHBsYW5lciAoUkNVLCB0Y29ubi0+Y29ubl91cGRhdGUpICovCisJc3RydWN0IGZpZm9fYnVmZmVyICpyc19wbGFuX3M7IC8qIGNvcnJlY3Rpb24gdmFsdWVzIG9mIHJlc3luYyBwbGFuZXIgKFJDVSwgY29ubmVjdGlvbi0+Y29ubl91cGRhdGUpICovCiAJaW50IHJzX2luX2ZsaWdodDsgLyogcmVzeW5jIHNlY3RvcnMgaW4gZmxpZ2h0ICh0byBwcm94eSwgaW4gcHJveHkgYW5kIGZyb20gcHJveHkpICovCiAJYXRvbWljX3QgYXBfaW5fZmxpZ2h0OyAvKiBBcHAgc2VjdG9ycyBpbiBmbGlnaHQgKHdhaXRpbmcgZm9yIGFjaykgKi8KIAl1bnNpZ25lZCBpbnQgcGVlcl9tYXhfYmlvX3NpemU7CkBAIC0xMDQ5LDE5ICs4MTQsNDYgQEAKIAlzdHJ1Y3Qgc3VibWl0X3dvcmtlciBzdWJtaXQ7CiB9OwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkcmJkX2NvbmYgKm1pbm9yX3RvX21kZXYodW5zaWduZWQgaW50IG1pbm9yKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJiZF9kZXZpY2UgKm1pbm9yX3RvX2RldmljZSh1bnNpZ25lZCBpbnQgbWlub3IpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgZHJiZF9jb25mICopaWRyX2ZpbmQoJm1pbm9ycywgbWlub3IpOworCXJldHVybiAoc3RydWN0IGRyYmRfZGV2aWNlICopaWRyX2ZpbmQoJmRyYmRfZGV2aWNlcywgbWlub3IpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtZGV2X3RvX21pbm9yKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpmaXJzdF9wZWVyX2RldmljZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlyZXR1cm4gbWRldi0+bWlub3I7CisJcmV0dXJuIGxpc3RfZmlyc3RfZW50cnkoJmRldmljZS0+cGVlcl9kZXZpY2VzLCBzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSwgcGVlcl9kZXZpY2VzKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJiZF9jb25mICp2bnJfdG9fbWRldihzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGludCB2bnIpCisjZGVmaW5lIGZvcl9lYWNoX3Jlc291cmNlKHJlc291cmNlLCBfcmVzb3VyY2VzKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXNvdXJjZSwgX3Jlc291cmNlcywgcmVzb3VyY2VzKQorCisjZGVmaW5lIGZvcl9lYWNoX3Jlc291cmNlX3JjdShyZXNvdXJjZSwgX3Jlc291cmNlcykgXAorCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHJlc291cmNlLCBfcmVzb3VyY2VzLCByZXNvdXJjZXMpCisKKyNkZWZpbmUgZm9yX2VhY2hfcmVzb3VyY2Vfc2FmZShyZXNvdXJjZSwgdG1wLCBfcmVzb3VyY2VzKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlc291cmNlLCB0bXAsIF9yZXNvdXJjZXMsIHJlc291cmNlcykKKworI2RlZmluZSBmb3JfZWFjaF9jb25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlc291cmNlKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0aW9uLCAmcmVzb3VyY2UtPmNvbm5lY3Rpb25zLCBjb25uZWN0aW9ucykKKworI2RlZmluZSBmb3JfZWFjaF9jb25uZWN0aW9uX3JjdShjb25uZWN0aW9uLCByZXNvdXJjZSkgXAorCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNvbm5lY3Rpb24sICZyZXNvdXJjZS0+Y29ubmVjdGlvbnMsIGNvbm5lY3Rpb25zKQorCisjZGVmaW5lIGZvcl9lYWNoX2Nvbm5lY3Rpb25fc2FmZShjb25uZWN0aW9uLCB0bXAsIHJlc291cmNlKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbm5lY3Rpb24sIHRtcCwgJnJlc291cmNlLT5jb25uZWN0aW9ucywgY29ubmVjdGlvbnMpCisKKyNkZWZpbmUgZm9yX2VhY2hfcGVlcl9kZXZpY2UocGVlcl9kZXZpY2UsIGRldmljZSkgXAorCWxpc3RfZm9yX2VhY2hfZW50cnkocGVlcl9kZXZpY2UsICZkZXZpY2UtPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2VzKQorCisjZGVmaW5lIGZvcl9lYWNoX3BlZXJfZGV2aWNlX3JjdShwZWVyX2RldmljZSwgZGV2aWNlKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocGVlcl9kZXZpY2UsICZkZXZpY2UtPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2VzKQorCisjZGVmaW5lIGZvcl9lYWNoX3BlZXJfZGV2aWNlX3NhZmUocGVlcl9kZXZpY2UsIHRtcCwgZGV2aWNlKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBlZXJfZGV2aWNlLCB0bXAsICZkZXZpY2UtPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2VzKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBkZXZpY2VfdG9fbWlub3Ioc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgZHJiZF9jb25mICopaWRyX2ZpbmQoJnRjb25uLT52b2x1bWVzLCB2bnIpOworCXJldHVybiBkZXZpY2UtPm1pbm9yOwogfQogCiAvKgpAQCAtMTA3NSw5NiArODY3LDkzIEBACiAJRERTRl9OT19SRVNZTkMgPSAyLCAvKiBEbyBub3QgcnVuIGEgcmVzeW5jIGZvciB0aGUgbmV3IHNwYWNlICovCiB9OwogCi1leHRlcm4gdm9pZCBkcmJkX2luaXRfc2V0X2RlZmF1bHRzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOworZXh0ZXJuIHZvaWQgZHJiZF9pbml0X3NldF9kZWZhdWx0cyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CiBleHRlcm4gaW50ICBkcmJkX3RocmVhZF9zdGFydChzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSk7CiBleHRlcm4gdm9pZCBfZHJiZF90aHJlYWRfc3RvcChzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSwgaW50IHJlc3RhcnQsIGludCB3YWl0KTsKLWV4dGVybiBjaGFyICpkcmJkX3Rhc2tfdG9fdGhyZWFkX25hbWUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwogI2lmZGVmIENPTkZJR19TTVAKIGV4dGVybiB2b2lkIGRyYmRfdGhyZWFkX2N1cnJlbnRfc2V0X2NwdShzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSk7Ci1leHRlcm4gdm9pZCBkcmJkX2NhbGNfY3B1X21hc2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKICNlbHNlCiAjZGVmaW5lIGRyYmRfdGhyZWFkX2N1cnJlbnRfc2V0X2NwdShBKSAoe30pCi0jZGVmaW5lIGRyYmRfY2FsY19jcHVfbWFzayhBKSAoe30pCiAjZW5kaWYKLWV4dGVybiB2b2lkIHRsX3JlbGVhc2Uoc3RydWN0IGRyYmRfdGNvbm4gKiwgdW5zaWduZWQgaW50IGJhcnJpZXJfbnIsCitleHRlcm4gdm9pZCB0bF9yZWxlYXNlKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKiwgdW5zaWduZWQgaW50IGJhcnJpZXJfbnIsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgc2V0X3NpemUpOwotZXh0ZXJuIHZvaWQgdGxfY2xlYXIoc3RydWN0IGRyYmRfdGNvbm4gKik7Ci1leHRlcm4gdm9pZCBkcmJkX2ZyZWVfc29jayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pOwotZXh0ZXJuIGludCBkcmJkX3NlbmQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorZXh0ZXJuIHZvaWQgdGxfY2xlYXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqKTsKK2V4dGVybiB2b2lkIGRyYmRfZnJlZV9zb2NrKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZXh0ZXJuIGludCBkcmJkX3NlbmQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHNvY2tldCAqc29jaywKIAkJICAgICB2b2lkICpidWYsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBtc2dfZmxhZ3MpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfYWxsKHN0cnVjdCBkcmJkX3Rjb25uICosIHN0cnVjdCBzb2NrZXQgKiwgdm9pZCAqLCBzaXplX3QsCitleHRlcm4gaW50IGRyYmRfc2VuZF9hbGwoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqLCBzdHJ1Y3Qgc29ja2V0ICosIHZvaWQgKiwgc2l6ZV90LAogCQkJIHVuc2lnbmVkKTsKIAotZXh0ZXJuIGludCBfX2RyYmRfc2VuZF9wcm90b2NvbChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGVudW0gZHJiZF9wYWNrZXQgY21kKTsKLWV4dGVybiBpbnQgZHJiZF9zZW5kX3Byb3RvY29sKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1leHRlcm4gaW50IGRyYmRfc2VuZF91dWlkcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiBpbnQgZHJiZF9zZW5kX3V1aWRzX3NraXBfaW5pdGlhbF9zeW5jKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIHZvaWQgZHJiZF9nZW5fYW5kX3NlbmRfc3luY191dWlkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfc2l6ZXMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IHRyaWdnZXJfcmVwbHksIGVudW0gZGRzX2ZsYWdzIGZsYWdzKTsKLWV4dGVybiBpbnQgZHJiZF9zZW5kX3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgcyk7Ci1leHRlcm4gaW50IGRyYmRfc2VuZF9jdXJyZW50X3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfc3luY19wYXJhbShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiB2b2lkIGRyYmRfc2VuZF9iX2FjayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHUzMiBiYXJyaWVyX25yLAorZXh0ZXJuIGludCBfX2RyYmRfc2VuZF9wcm90b2NvbChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBlbnVtIGRyYmRfcGFja2V0IGNtZCk7CitleHRlcm4gaW50IGRyYmRfc2VuZF9wcm90b2NvbChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2V4dGVybiBpbnQgZHJiZF9zZW5kX3V1aWRzKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICopOworZXh0ZXJuIGludCBkcmJkX3NlbmRfdXVpZHNfc2tpcF9pbml0aWFsX3N5bmMoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBkcmJkX2dlbl9hbmRfc2VuZF9zeW5jX3V1aWQoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKik7CitleHRlcm4gaW50IGRyYmRfc2VuZF9zaXplcyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCBpbnQgdHJpZ2dlcl9yZXBseSwgZW51bSBkZHNfZmxhZ3MgZmxhZ3MpOworZXh0ZXJuIGludCBkcmJkX3NlbmRfc3RhdGUoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgdW5pb24gZHJiZF9zdGF0ZSBzKTsKK2V4dGVybiBpbnQgZHJiZF9zZW5kX2N1cnJlbnRfc3RhdGUoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKik7CitleHRlcm4gaW50IGRyYmRfc2VuZF9zeW5jX3BhcmFtKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICopOworZXh0ZXJuIHZvaWQgZHJiZF9zZW5kX2JfYWNrKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHUzMiBiYXJyaWVyX25yLAogCQkJICAgIHUzMiBzZXRfc2l6ZSk7Ci1leHRlcm4gaW50IGRyYmRfc2VuZF9hY2soc3RydWN0IGRyYmRfY29uZiAqLCBlbnVtIGRyYmRfcGFja2V0LAorZXh0ZXJuIGludCBkcmJkX3NlbmRfYWNrKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICosIGVudW0gZHJiZF9wYWNrZXQsCiAJCQkgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICopOwotZXh0ZXJuIHZvaWQgZHJiZF9zZW5kX2Fja19ycChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKK2V4dGVybiB2b2lkIGRyYmRfc2VuZF9hY2tfcnAoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgZW51bSBkcmJkX3BhY2tldCwKIAkJCSAgICAgc3RydWN0IHBfYmxvY2tfcmVxICpycCk7Ci1leHRlcm4gdm9pZCBkcmJkX3NlbmRfYWNrX2RwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gZHJiZF9wYWNrZXQgY21kLAorZXh0ZXJuIHZvaWQgZHJiZF9zZW5kX2Fja19kcChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCBlbnVtIGRyYmRfcGFja2V0LAogCQkJICAgICBzdHJ1Y3QgcF9kYXRhICpkcCwgaW50IGRhdGFfc2l6ZSk7Ci1leHRlcm4gaW50IGRyYmRfc2VuZF9hY2tfZXgoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX3BhY2tldCBjbWQsCitleHRlcm4gaW50IGRyYmRfc2VuZF9hY2tfZXgoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgZW51bSBkcmJkX3BhY2tldCwKIAkJCSAgICBzZWN0b3JfdCBzZWN0b3IsIGludCBibGtzaXplLCB1NjQgYmxvY2tfaWQpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfb3V0X29mX3N5bmMoc3RydWN0IGRyYmRfY29uZiAqLCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICopOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfYmxvY2soc3RydWN0IGRyYmRfY29uZiAqLCBlbnVtIGRyYmRfcGFja2V0LAorZXh0ZXJuIGludCBkcmJkX3NlbmRfb3V0X29mX3N5bmMoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqKTsKK2V4dGVybiBpbnQgZHJiZF9zZW5kX2Jsb2NrKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICosIGVudW0gZHJiZF9wYWNrZXQsCiAJCQkgICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKik7Ci1leHRlcm4gaW50IGRyYmRfc2VuZF9kYmxvY2soc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKTsKLWV4dGVybiBpbnQgZHJiZF9zZW5kX2RyZXF1ZXN0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBjbWQsCitleHRlcm4gaW50IGRyYmRfc2VuZF9kYmxvY2soc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKTsKK2V4dGVybiBpbnQgZHJiZF9zZW5kX2RyZXF1ZXN0KHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICosIGludCBjbWQsCiAJCQkgICAgICBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplLCB1NjQgYmxvY2tfaWQpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfZHJlcXVlc3RfY3N1bShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsCitleHRlcm4gaW50IGRyYmRfc2VuZF9kcmVxdWVzdF9jc3VtKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICosIHNlY3Rvcl90IHNlY3RvciwKIAkJCQkgICBpbnQgc2l6ZSwgdm9pZCAqZGlnZXN0LCBpbnQgZGlnZXN0X3NpemUsCiAJCQkJICAgZW51bSBkcmJkX3BhY2tldCBjbWQpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfb3ZfcmVxdWVzdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LHNlY3Rvcl90IHNlY3RvcixpbnQgc2l6ZSk7CitleHRlcm4gaW50IGRyYmRfc2VuZF9vdl9yZXF1ZXN0KHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICosIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUpOwogCi1leHRlcm4gaW50IGRyYmRfc2VuZF9iaXRtYXAoc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci1leHRlcm4gdm9pZCBkcmJkX3NlbmRfc3JfcmVwbHkoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX3N0YXRlX3J2IHJldGNvZGUpOwotZXh0ZXJuIHZvaWQgY29ubl9zZW5kX3NyX3JlcGx5KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgZW51bSBkcmJkX3N0YXRlX3J2IHJldGNvZGUpOworZXh0ZXJuIGludCBkcmJkX3NlbmRfYml0bWFwKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKK2V4dGVybiB2b2lkIGRyYmRfc2VuZF9zcl9yZXBseShzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCBlbnVtIGRyYmRfc3RhdGVfcnYgcmV0Y29kZSk7CitleHRlcm4gdm9pZCBjb25uX3NlbmRfc3JfcmVwbHkoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgZW51bSBkcmJkX3N0YXRlX3J2IHJldGNvZGUpOwogZXh0ZXJuIHZvaWQgZHJiZF9mcmVlX2JjKHN0cnVjdCBkcmJkX2JhY2tpbmdfZGV2ICpsZGV2KTsKLWV4dGVybiB2b2lkIGRyYmRfbWRldl9jbGVhbnVwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotdm9pZCBkcmJkX3ByaW50X3V1aWRzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IGNoYXIgKnRleHQpOworZXh0ZXJuIHZvaWQgZHJiZF9kZXZpY2VfY2xlYW51cChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7Cit2b2lkIGRyYmRfcHJpbnRfdXVpZHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNvbnN0IGNoYXIgKnRleHQpOwogCi1leHRlcm4gdm9pZCBjb25uX21kX3N5bmMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKLWV4dGVybiB2b2lkIGRyYmRfbWRfd3JpdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdm9pZCAqYnVmZmVyKTsKLWV4dGVybiB2b2lkIGRyYmRfbWRfc3luYyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiBpbnQgIGRyYmRfbWRfcmVhZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqYmRldik7Ci1leHRlcm4gdm9pZCBkcmJkX3V1aWRfc2V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBpZHgsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKTsKLWV4dGVybiB2b2lkIF9kcmJkX3V1aWRfc2V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBpZHgsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKTsKLWV4dGVybiB2b2lkIGRyYmRfdXVpZF9uZXdfY3VycmVudChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KSBfX211c3RfaG9sZChsb2NhbCk7Ci1leHRlcm4gdm9pZCBkcmJkX3V1aWRfc2V0X2JtKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKTsKLWV4dGVybiB2b2lkIGRyYmRfdXVpZF9tb3ZlX2hpc3Rvcnkoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpOwotZXh0ZXJuIHZvaWQgX19kcmJkX3V1aWRfc2V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBpZHgsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKTsKLWV4dGVybiB2b2lkIGRyYmRfbWRfc2V0X2ZsYWcoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IGZsYWdzKSBfX211c3RfaG9sZChsb2NhbCk7Ci1leHRlcm4gdm9pZCBkcmJkX21kX2NsZWFyX2ZsYWcoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IGZsYWdzKV9fbXVzdF9ob2xkKGxvY2FsKTsKK2V4dGVybiB2b2lkIGNvbm5fbWRfc3luYyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2V4dGVybiB2b2lkIGRyYmRfbWRfd3JpdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHZvaWQgKmJ1ZmZlcik7CitleHRlcm4gdm9pZCBkcmJkX21kX3N5bmMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGludCAgZHJiZF9tZF9yZWFkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqYmRldik7CitleHRlcm4gdm9pZCBkcmJkX3V1aWRfc2V0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgaWR4LCB1NjQgdmFsKSBfX211c3RfaG9sZChsb2NhbCk7CitleHRlcm4gdm9pZCBfZHJiZF91dWlkX3NldChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IGlkeCwgdTY0IHZhbCkgX19tdXN0X2hvbGQobG9jYWwpOworZXh0ZXJuIHZvaWQgZHJiZF91dWlkX25ld19jdXJyZW50KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKSBfX211c3RfaG9sZChsb2NhbCk7CitleHRlcm4gdm9pZCBkcmJkX3V1aWRfc2V0X2JtKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1NjQgdmFsKSBfX211c3RfaG9sZChsb2NhbCk7CitleHRlcm4gdm9pZCBkcmJkX3V1aWRfbW92ZV9oaXN0b3J5KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKSBfX211c3RfaG9sZChsb2NhbCk7CitleHRlcm4gdm9pZCBfX2RyYmRfdXVpZF9zZXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCBpZHgsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKTsKK2V4dGVybiB2b2lkIGRyYmRfbWRfc2V0X2ZsYWcoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCBmbGFncykgX19tdXN0X2hvbGQobG9jYWwpOworZXh0ZXJuIHZvaWQgZHJiZF9tZF9jbGVhcl9mbGFnKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgZmxhZ3MpX19tdXN0X2hvbGQobG9jYWwpOwogZXh0ZXJuIGludCBkcmJkX21kX3Rlc3RfZmxhZyhzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqLCBpbnQpOwogI2lmbmRlZiBEUkJEX0RFQlVHX01EX1NZTkMKLWV4dGVybiB2b2lkIGRyYmRfbWRfbWFya19kaXJ0eShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKK2V4dGVybiB2b2lkIGRyYmRfbWRfbWFya19kaXJ0eShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CiAjZWxzZQogI2RlZmluZSBkcmJkX21kX21hcmtfZGlydHkobSkJZHJiZF9tZF9tYXJrX2RpcnR5XyhtLCBfX0xJTkVfXyAsIF9fZnVuY19fICkKLWV4dGVybiB2b2lkIGRyYmRfbWRfbWFya19kaXJ0eV8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK2V4dGVybiB2b2lkIGRyYmRfbWRfbWFya19kaXJ0eV8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCXVuc2lnbmVkIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jKTsKICNlbmRpZgotZXh0ZXJuIHZvaWQgZHJiZF9xdWV1ZV9iaXRtYXBfaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwKLQkJCQkgaW50ICgqaW9fZm4pKHN0cnVjdCBkcmJkX2NvbmYgKiksCi0JCQkJIHZvaWQgKCpkb25lKShzdHJ1Y3QgZHJiZF9jb25mICosIGludCksCitleHRlcm4gdm9pZCBkcmJkX3F1ZXVlX2JpdG1hcF9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKKwkJCQkgaW50ICgqaW9fZm4pKHN0cnVjdCBkcmJkX2RldmljZSAqKSwKKwkJCQkgdm9pZCAoKmRvbmUpKHN0cnVjdCBkcmJkX2RldmljZSAqLCBpbnQpLAogCQkJCSBjaGFyICp3aHksIGVudW0gYm1fZmxhZyBmbGFncyk7Ci1leHRlcm4gaW50IGRyYmRfYml0bWFwX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCi0JCWludCAoKmlvX2ZuKShzdHJ1Y3QgZHJiZF9jb25mICopLAorZXh0ZXJuIGludCBkcmJkX2JpdG1hcF9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKKwkJaW50ICgqaW9fZm4pKHN0cnVjdCBkcmJkX2RldmljZSAqKSwKIAkJY2hhciAqd2h5LCBlbnVtIGJtX2ZsYWcgZmxhZ3MpOwotZXh0ZXJuIGludCBkcmJkX2JpdG1hcF9pb19mcm9tX3dvcmtlcihzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAotCQlpbnQgKCppb19mbikoc3RydWN0IGRyYmRfY29uZiAqKSwKK2V4dGVybiBpbnQgZHJiZF9iaXRtYXBfaW9fZnJvbV93b3JrZXIoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCisJCWludCAoKmlvX2ZuKShzdHJ1Y3QgZHJiZF9kZXZpY2UgKiksCiAJCWNoYXIgKndoeSwgZW51bSBibV9mbGFnIGZsYWdzKTsKLWV4dGVybiBpbnQgZHJiZF9ibWlvX3NldF9uX3dyaXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGludCBkcmJkX2JtaW9fY2xlYXJfbl93cml0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiB2b2lkIGRyYmRfbGRldl9kZXN0cm95KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOworZXh0ZXJuIGludCBkcmJkX2JtaW9fc2V0X25fd3JpdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGludCBkcmJkX2JtaW9fY2xlYXJfbl93cml0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gdm9pZCBkcmJkX2xkZXZfZGVzdHJveShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CiAKIC8qIE1ldGEgZGF0YSBsYXlvdXQKICAqCkBAIC0xMzUwLDUyICsxMTM5LDUyIEBACiAjZGVmaW5lIERSQkRfTUFYX1NJWkVfSDgwX1BBQ0tFVCAoMVUgPDwgMTUpIC8qIEhlYWRlciA4MCBvbmx5IGFsbG93cyBwYWNrZXRzIHVwIHRvIDMyS2lCIGRhdGEgKi8KICNkZWZpbmUgRFJCRF9NQVhfQklPX1NJWkVfUDk1ICAgICgxVSA8PCAxNykgLyogUHJvdG9jb2wgOTUgdG8gOTkgYWxsb3dzIGJpb3MgdXAgdG8gMTI4S2lCICovCiAKLWV4dGVybiBpbnQgIGRyYmRfYm1faW5pdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiBpbnQgIGRyYmRfYm1fcmVzaXplKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHNlY3Rvcl90IHNlY3RvcnMsIGludCBzZXRfbmV3X2JpdHMpOwotZXh0ZXJuIHZvaWQgZHJiZF9ibV9jbGVhbnVwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIHZvaWQgZHJiZF9ibV9zZXRfYWxsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIHZvaWQgZHJiZF9ibV9jbGVhcl9hbGwoc3RydWN0IGRyYmRfY29uZiAqbWRldik7CitleHRlcm4gaW50ICBkcmJkX2JtX2luaXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGludCAgZHJiZF9ibV9yZXNpemUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvcnMsIGludCBzZXRfbmV3X2JpdHMpOworZXh0ZXJuIHZvaWQgZHJiZF9ibV9jbGVhbnVwKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKK2V4dGVybiB2b2lkIGRyYmRfYm1fc2V0X2FsbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gdm9pZCBkcmJkX2JtX2NsZWFyX2FsbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CiAvKiBzZXQvY2xlYXIvdGVzdCBvbmx5IGEgZmV3IGJpdHMgYXQgYSB0aW1lICovCiBleHRlcm4gaW50ICBkcmJkX2JtX3NldF9iaXRzKAotCQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBsb25nIHMsIHVuc2lnbmVkIGxvbmcgZSk7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIHMsIHVuc2lnbmVkIGxvbmcgZSk7CiBleHRlcm4gaW50ICBkcmJkX2JtX2NsZWFyX2JpdHMoCi0JCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGxvbmcgcywgdW5zaWduZWQgbG9uZyBlKTsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGxvbmcgcywgdW5zaWduZWQgbG9uZyBlKTsKIGV4dGVybiBpbnQgZHJiZF9ibV9jb3VudF9iaXRzKAotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IHVuc2lnbmVkIGxvbmcgcywgY29uc3QgdW5zaWduZWQgbG9uZyBlKTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyBzLCBjb25zdCB1bnNpZ25lZCBsb25nIGUpOwogLyogYm1fc2V0X2JpdHMgdmFyaWFudCBmb3IgdXNlIHdoaWxlIGhvbGRpbmcgZHJiZF9ibV9sb2NrLAogICogbWF5IHByb2Nlc3MgdGhlIHdob2xlIGJpdG1hcCBpbiBvbmUgZ28gKi8KLWV4dGVybiB2b2lkIF9kcmJkX2JtX3NldF9iaXRzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitleHRlcm4gdm9pZCBfZHJiZF9ibV9zZXRfYml0cyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJY29uc3QgdW5zaWduZWQgbG9uZyBzLCBjb25zdCB1bnNpZ25lZCBsb25nIGUpOwotZXh0ZXJuIGludCAgZHJiZF9ibV90ZXN0X2JpdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBsb25nIGJpdG5yKTsKLWV4dGVybiBpbnQgIGRyYmRfYm1fZV93ZWlnaHQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBlbnIpOwotZXh0ZXJuIGludCAgZHJiZF9ibV93cml0ZV9wYWdlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGludCBpZHgpIF9fbXVzdF9ob2xkKGxvY2FsKTsKLWV4dGVybiBpbnQgIGRyYmRfYm1fcmVhZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KSBfX211c3RfaG9sZChsb2NhbCk7Ci1leHRlcm4gdm9pZCBkcmJkX2JtX21hcmtfZm9yX3dyaXRlb3V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBwYWdlX25yKTsKLWV4dGVybiBpbnQgIGRyYmRfYm1fd3JpdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpOwotZXh0ZXJuIGludCAgZHJiZF9ibV93cml0ZV9oaW50ZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpOwotZXh0ZXJuIGludCBkcmJkX2JtX3dyaXRlX2FsbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KSBfX211c3RfaG9sZChsb2NhbCk7Ci1leHRlcm4gaW50ICBkcmJkX2JtX3dyaXRlX2NvcHlfcGFnZXMoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpOwotZXh0ZXJuIHNpemVfdAkgICAgIGRyYmRfYm1fd29yZHMoc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBkcmJkX2JtX2JpdHMoc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci1leHRlcm4gc2VjdG9yX3QgICAgICBkcmJkX2JtX2NhcGFjaXR5KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOworZXh0ZXJuIGludCAgZHJiZF9ibV90ZXN0X2JpdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgbG9uZyBiaXRucik7CitleHRlcm4gaW50ICBkcmJkX2JtX2Vfd2VpZ2h0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIGVucik7CitleHRlcm4gaW50ICBkcmJkX2JtX3dyaXRlX3BhZ2Uoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGludCBpZHgpIF9fbXVzdF9ob2xkKGxvY2FsKTsKK2V4dGVybiBpbnQgIGRyYmRfYm1fcmVhZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkgX19tdXN0X2hvbGQobG9jYWwpOworZXh0ZXJuIHZvaWQgZHJiZF9ibV9tYXJrX2Zvcl93cml0ZW91dChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IHBhZ2VfbnIpOworZXh0ZXJuIGludCAgZHJiZF9ibV93cml0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkgX19tdXN0X2hvbGQobG9jYWwpOworZXh0ZXJuIGludCAgZHJiZF9ibV93cml0ZV9oaW50ZWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpIF9fbXVzdF9ob2xkKGxvY2FsKTsKK2V4dGVybiBpbnQgZHJiZF9ibV93cml0ZV9hbGwoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpIF9fbXVzdF9ob2xkKGxvY2FsKTsKK2V4dGVybiBpbnQgIGRyYmRfYm1fd3JpdGVfY29weV9wYWdlcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkgX19tdXN0X2hvbGQobG9jYWwpOworZXh0ZXJuIHNpemVfdAkgICAgIGRyYmRfYm1fd29yZHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJiZF9ibV9iaXRzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKK2V4dGVybiBzZWN0b3JfdCAgICAgIGRyYmRfYm1fY2FwYWNpdHkoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOwogCiAjZGVmaW5lIERSQkRfRU5EX09GX0JJVE1BUAkofih1bnNpZ25lZCBsb25nKTApCi1leHRlcm4gdW5zaWduZWQgbG9uZyBkcmJkX2JtX2ZpbmRfbmV4dChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBsb25nIGJtX2ZvKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRyYmRfYm1fZmluZF9uZXh0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIGJtX2ZvKTsKIC8qIGJtX2ZpbmRfbmV4dCB2YXJpYW50cyBmb3IgdXNlIHdoaWxlIHlvdSBob2xkIGRyYmRfYm1fbG9jaygpICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBfZHJiZF9ibV9maW5kX25leHQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBibV9mbyk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBfZHJiZF9ibV9maW5kX25leHRfemVybyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBsb25nIGJtX2ZvKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIF9kcmJkX2JtX3RvdGFsX3dlaWdodChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGRyYmRfYm1fdG90YWxfd2VpZ2h0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGludCBkcmJkX2JtX3JzX2RvbmUoc3RydWN0IGRyYmRfY29uZiAqbWRldik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBfZHJiZF9ibV9maW5kX25leHQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGxvbmcgYm1fZm8pOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX2RyYmRfYm1fZmluZF9uZXh0X3plcm8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGxvbmcgYm1fZm8pOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX2RyYmRfYm1fdG90YWxfd2VpZ2h0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRyYmRfYm1fdG90YWxfd2VpZ2h0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKK2V4dGVybiBpbnQgZHJiZF9ibV9yc19kb25lKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKIC8qIGZvciByZWNlaXZlX2JpdG1hcCAqLwotZXh0ZXJuIHZvaWQgZHJiZF9ibV9tZXJnZV9sZWwoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2l6ZV90IG9mZnNldCwKK2V4dGVybiB2b2lkIGRyYmRfYm1fbWVyZ2VfbGVsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzaXplX3Qgb2Zmc2V0LAogCQlzaXplX3QgbnVtYmVyLCB1bnNpZ25lZCBsb25nICpidWZmZXIpOwogLyogZm9yIF9kcmJkX3NlbmRfYml0bWFwICovCi1leHRlcm4gdm9pZCBkcmJkX2JtX2dldF9sZWwoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2l6ZV90IG9mZnNldCwKK2V4dGVybiB2b2lkIGRyYmRfYm1fZ2V0X2xlbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2l6ZV90IG9mZnNldCwKIAkJc2l6ZV90IG51bWJlciwgdW5zaWduZWQgbG9uZyAqYnVmZmVyKTsKIAotZXh0ZXJuIHZvaWQgZHJiZF9ibV9sb2NrKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNoYXIgKndoeSwgZW51bSBibV9mbGFnIGZsYWdzKTsKLWV4dGVybiB2b2lkIGRyYmRfYm1fdW5sb2NrKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOworZXh0ZXJuIHZvaWQgZHJiZF9ibV9sb2NrKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjaGFyICp3aHksIGVudW0gYm1fZmxhZyBmbGFncyk7CitleHRlcm4gdm9pZCBkcmJkX2JtX3VubG9jayhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CiAvKiBkcmJkX21haW4uYyAqLwogCiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmRyYmRfcmVxdWVzdF9jYWNoZTsKQEAgLTE0MzksMzUgKzEyMjgsNDAgQEAKIAogZXh0ZXJuIHJ3bG9ja190IGdsb2JhbF9zdGF0ZV9sb2NrOwogCi1leHRlcm4gaW50IGNvbm5fbG93ZXN0X21pbm9yKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1lbnVtIGRyYmRfcmV0X2NvZGUgY29ubl9uZXdfbWlub3Ioc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bnNpZ25lZCBpbnQgbWlub3IsIGludCB2bnIpOwotZXh0ZXJuIHZvaWQgZHJiZF9taW5vcl9kZXN0cm95KHN0cnVjdCBrcmVmICprcmVmKTsKK2V4dGVybiBpbnQgY29ubl9sb3dlc3RfbWlub3Ioc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitlbnVtIGRyYmRfcmV0X2NvZGUgZHJiZF9jcmVhdGVfZGV2aWNlKHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSwgdW5zaWduZWQgaW50IG1pbm9yLCBpbnQgdm5yKTsKK2V4dGVybiB2b2lkIGRyYmRfZGVzdHJveV9kZXZpY2Uoc3RydWN0IGtyZWYgKmtyZWYpOworZXh0ZXJuIHZvaWQgZHJiZF9kZWxldGVfZGV2aWNlKHN0cnVjdCBkcmJkX2RldmljZSAqbWRldik7CiAKLWV4dGVybiBpbnQgc2V0X3Jlc291cmNlX29wdGlvbnMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcmVzX29wdHMgKnJlc19vcHRzKTsKLWV4dGVybiBzdHJ1Y3QgZHJiZF90Y29ubiAqY29ubl9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHJlc19vcHRzICpyZXNfb3B0cyk7Ci1leHRlcm4gdm9pZCBjb25uX2Rlc3Ryb3koc3RydWN0IGtyZWYgKmtyZWYpOwotc3RydWN0IGRyYmRfdGNvbm4gKmNvbm5fZ2V0X2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSk7Ci1leHRlcm4gc3RydWN0IGRyYmRfdGNvbm4gKmNvbm5fZ2V0X2J5X2FkZHJzKHZvaWQgKm15X2FkZHIsIGludCBteV9hZGRyX2xlbiwKK2V4dGVybiBzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqZHJiZF9jcmVhdGVfcmVzb3VyY2UoY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBkcmJkX2ZyZWVfcmVzb3VyY2Uoc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlKTsKKworZXh0ZXJuIGludCBzZXRfcmVzb3VyY2Vfb3B0aW9ucyhzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2UsIHN0cnVjdCByZXNfb3B0cyAqcmVzX29wdHMpOworZXh0ZXJuIHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5fY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCByZXNfb3B0cyAqcmVzX29wdHMpOworZXh0ZXJuIHZvaWQgZHJiZF9kZXN0cm95X2Nvbm5lY3Rpb24oc3RydWN0IGtyZWYgKmtyZWYpOworZXh0ZXJuIHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5fZ2V0X2J5X2FkZHJzKHZvaWQgKm15X2FkZHIsIGludCBteV9hZGRyX2xlbiwKIAkJCQkJICAgIHZvaWQgKnBlZXJfYWRkciwgaW50IHBlZXJfYWRkcl9sZW4pOwotZXh0ZXJuIHZvaWQgY29ubl9mcmVlX2NyeXB0byhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pOworZXh0ZXJuIHN0cnVjdCBkcmJkX3Jlc291cmNlICpkcmJkX2ZpbmRfcmVzb3VyY2UoY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2Uoc3RydWN0IGtyZWYgKmtyZWYpOworZXh0ZXJuIHZvaWQgY29ubl9mcmVlX2NyeXB0byhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKIAogZXh0ZXJuIGludCBwcm9jX2RldGFpbHM7CiAKIC8qIGRyYmRfcmVxICovCiBleHRlcm4gdm9pZCBkb19zdWJtaXQoc3RydWN0IHdvcmtfc3RydWN0ICp3cyk7Ci1leHRlcm4gdm9pZCBfX2RyYmRfbWFrZV9yZXF1ZXN0KHN0cnVjdCBkcmJkX2NvbmYgKiwgc3RydWN0IGJpbyAqLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkIF9fZHJiZF9tYWtlX3JlcXVlc3Qoc3RydWN0IGRyYmRfZGV2aWNlICosIHN0cnVjdCBiaW8gKiwgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gdm9pZCBkcmJkX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKTsKLWV4dGVybiBpbnQgZHJiZF9yZWFkX3JlbW90ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpOworZXh0ZXJuIGludCBkcmJkX3JlYWRfcmVtb3RlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpOwogZXh0ZXJuIGludCBkcmJkX21lcmdlX2J2ZWMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBidmVjX21lcmdlX2RhdGEgKmJ2bSwgc3RydWN0IGJpb192ZWMgKmJ2ZWMpOwogZXh0ZXJuIGludCBpc192YWxpZF9hcl9oYW5kbGUoc3RydWN0IGRyYmRfcmVxdWVzdCAqLCBzZWN0b3JfdCk7CiAKIAogLyogZHJiZF9ubC5jICovCiBleHRlcm4gaW50IGRyYmRfbXNnX3B1dF9pbmZvKGNvbnN0IGNoYXIgKmluZm8pOwotZXh0ZXJuIHZvaWQgZHJiZF9zdXNwZW5kX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIHZvaWQgZHJiZF9yZXN1bWVfaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldik7CitleHRlcm4gdm9pZCBkcmJkX3N1c3BlbmRfaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIHZvaWQgZHJiZF9yZXN1bWVfaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOwogZXh0ZXJuIGNoYXIgKnBwc2l6ZShjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplKTsKLWV4dGVybiBzZWN0b3JfdCBkcmJkX25ld19kZXZfc2l6ZShzdHJ1Y3QgZHJiZF9jb25mICosIHN0cnVjdCBkcmJkX2JhY2tpbmdfZGV2ICosIHNlY3Rvcl90LCBpbnQpOworZXh0ZXJuIHNlY3Rvcl90IGRyYmRfbmV3X2Rldl9zaXplKHN0cnVjdCBkcmJkX2RldmljZSAqLCBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqLCBzZWN0b3JfdCwgaW50KTsKIGVudW0gZGV0ZXJtaW5lX2Rldl9zaXplIHsKIAlEU19FUlJPUl9TSFJJTksgPSAtMywKIAlEU19FUlJPUl9TUEFDRV9NRCA9IC0yLApAQCAtMTQ3OCw0OCArMTI3Miw0NyBAQAogCURTX0dSRVdfRlJPTV9aRVJPID0gMywKIH07CiBleHRlcm4gZW51bSBkZXRlcm1pbmVfZGV2X3NpemUKLWRyYmRfZGV0ZXJtaW5lX2Rldl9zaXplKHN0cnVjdCBkcmJkX2NvbmYgKiwgZW51bSBkZHNfZmxhZ3MsIHN0cnVjdCByZXNpemVfcGFybXMgKikgX19tdXN0X2hvbGQobG9jYWwpOwotZXh0ZXJuIHZvaWQgcmVzeW5jX2FmdGVyX29ubGluZV9ncm93KHN0cnVjdCBkcmJkX2NvbmYgKik7Ci1leHRlcm4gdm9pZCBkcmJkX3JlY29uc2lkZXJfbWF4X2Jpb19zaXplKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGVudW0gZHJiZF9zdGF0ZV9ydiBkcmJkX3NldF9yb2xlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitkcmJkX2RldGVybWluZV9kZXZfc2l6ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgZW51bSBkZHNfZmxhZ3MsIHN0cnVjdCByZXNpemVfcGFybXMgKikgX19tdXN0X2hvbGQobG9jYWwpOworZXh0ZXJuIHZvaWQgcmVzeW5jX2FmdGVyX29ubGluZV9ncm93KHN0cnVjdCBkcmJkX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIGRyYmRfcmVjb25zaWRlcl9tYXhfYmlvX3NpemUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGVudW0gZHJiZF9zdGF0ZV9ydiBkcmJkX3NldF9yb2xlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCQllbnVtIGRyYmRfcm9sZSBuZXdfcm9sZSwKIAkJCQkJaW50IGZvcmNlKTsKLWV4dGVybiBib29sIGNvbm5fdHJ5X291dGRhdGVfcGVlcihzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pOwotZXh0ZXJuIHZvaWQgY29ubl90cnlfb3V0ZGF0ZV9wZWVyX2FzeW5jKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1leHRlcm4gaW50IGRyYmRfa2hlbHBlcihzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjaGFyICpjbWQpOworZXh0ZXJuIGJvb2wgY29ubl90cnlfb3V0ZGF0ZV9wZWVyKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZXh0ZXJuIHZvaWQgY29ubl90cnlfb3V0ZGF0ZV9wZWVyX2FzeW5jKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZXh0ZXJuIGludCBkcmJkX2toZWxwZXIoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNoYXIgKmNtZCk7CiAKIC8qIGRyYmRfd29ya2VyLmMgKi8KIGV4dGVybiBpbnQgZHJiZF93b3JrZXIoc3RydWN0IGRyYmRfdGhyZWFkICp0aGkpOwotZW51bSBkcmJkX3JldF9jb2RlIGRyYmRfcmVzeW5jX2FmdGVyX3ZhbGlkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBvX21pbm9yKTsKLXZvaWQgZHJiZF9yZXN5bmNfYWZ0ZXJfY2hhbmdlZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiB2b2lkIGRyYmRfc3RhcnRfcmVzeW5jKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gZHJiZF9jb25ucyBzaWRlKTsKLWV4dGVybiB2b2lkIHJlc3VtZV9uZXh0X3NnKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIHZvaWQgc3VzcGVuZF9vdGhlcl9zZyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiBpbnQgZHJiZF9yZXN5bmNfZmluaXNoZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldik7CitlbnVtIGRyYmRfcmV0X2NvZGUgZHJiZF9yZXN5bmNfYWZ0ZXJfdmFsaWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCBvX21pbm9yKTsKK3ZvaWQgZHJiZF9yZXN5bmNfYWZ0ZXJfY2hhbmdlZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gdm9pZCBkcmJkX3N0YXJ0X3Jlc3luYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgZW51bSBkcmJkX2Nvbm5zIHNpZGUpOworZXh0ZXJuIHZvaWQgcmVzdW1lX25leHRfc2coc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIHZvaWQgc3VzcGVuZF9vdGhlcl9zZyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gaW50IGRyYmRfcmVzeW5jX2ZpbmlzaGVkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKIC8qIG1heWJlIHJhdGhlciBkcmJkX21haW4uYyA/ICovCi1leHRlcm4gdm9pZCAqZHJiZF9tZF9nZXRfYnVmZmVyKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIHZvaWQgZHJiZF9tZF9wdXRfYnVmZmVyKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGludCBkcmJkX21kX3N5bmNfcGFnZV9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorZXh0ZXJuIHZvaWQgKmRyYmRfbWRfZ2V0X2J1ZmZlcihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gdm9pZCBkcmJkX21kX3B1dF9idWZmZXIoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGludCBkcmJkX21kX3N5bmNfcGFnZV9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwgaW50IHJ3KTsKLWV4dGVybiB2b2lkIGRyYmRfb3Zfb3V0X29mX3N5bmNfZm91bmQoc3RydWN0IGRyYmRfY29uZiAqLCBzZWN0b3JfdCwgaW50KTsKLWV4dGVybiB2b2lkIHdhaXRfdW50aWxfZG9uZV9vcl9mb3JjZV9kZXRhY2hlZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorZXh0ZXJuIHZvaWQgZHJiZF9vdl9vdXRfb2Zfc3luY19mb3VuZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgc2VjdG9yX3QsIGludCk7CitleHRlcm4gdm9pZCB3YWl0X3VudGlsX2RvbmVfb3JfZm9yY2VfZGV0YWNoZWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCXN0cnVjdCBkcmJkX2JhY2tpbmdfZGV2ICpiZGV2LCB1bnNpZ25lZCBpbnQgKmRvbmUpOwotZXh0ZXJuIHZvaWQgZHJiZF9yc19jb250cm9sbGVyX3Jlc2V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOworZXh0ZXJuIHZvaWQgZHJiZF9yc19jb250cm9sbGVyX3Jlc2V0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKIAotc3RhdGljIGlubGluZSB2b2lkIG92X291dF9vZl9zeW5jX3ByaW50KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW5saW5lIHZvaWQgb3Zfb3V0X29mX3N5bmNfcHJpbnQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaWYgKG1kZXYtPm92X2xhc3Rfb29zX3NpemUpIHsKLQkJZGV2X2VycihERVYsICJPdXQgb2Ygc3luYzogc3RhcnQ9JWxsdSwgc2l6ZT0lbHUgKHNlY3RvcnMpXG4iLAotCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbWRldi0+b3ZfbGFzdF9vb3Nfc3RhcnQsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpbWRldi0+b3ZfbGFzdF9vb3Nfc2l6ZSk7CisJaWYgKGRldmljZS0+b3ZfbGFzdF9vb3Nfc2l6ZSkgeworCQlkcmJkX2VycihkZXZpY2UsICJPdXQgb2Ygc3luYzogc3RhcnQ9JWxsdSwgc2l6ZT0lbHUgKHNlY3RvcnMpXG4iLAorCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2aWNlLT5vdl9sYXN0X29vc19zdGFydCwKKwkJICAgICAodW5zaWduZWQgbG9uZylkZXZpY2UtPm92X2xhc3Rfb29zX3NpemUpOwogCX0KLQltZGV2LT5vdl9sYXN0X29vc19zaXplPTA7CisJZGV2aWNlLT5vdl9sYXN0X29vc19zaXplID0gMDsKIH0KIAogCi1leHRlcm4gdm9pZCBkcmJkX2NzdW1fYmlvKHN0cnVjdCBkcmJkX2NvbmYgKiwgc3RydWN0IGNyeXB0b19oYXNoICosIHN0cnVjdCBiaW8gKiwgdm9pZCAqKTsKLWV4dGVybiB2b2lkIGRyYmRfY3N1bV9lZShzdHJ1Y3QgZHJiZF9jb25mICosIHN0cnVjdCBjcnlwdG9faGFzaCAqLAotCQkJIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqLCB2b2lkICopOworZXh0ZXJuIHZvaWQgZHJiZF9jc3VtX2JpbyhzdHJ1Y3QgY3J5cHRvX2hhc2ggKiwgc3RydWN0IGJpbyAqLCB2b2lkICopOworZXh0ZXJuIHZvaWQgZHJiZF9jc3VtX2VlKHN0cnVjdCBjcnlwdG9faGFzaCAqLCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKiwgdm9pZCAqKTsKIC8qIHdvcmtlciBjYWxsYmFja3MgKi8KIGV4dGVybiBpbnQgd19lX2VuZF9kYXRhX3JlcShzdHJ1Y3QgZHJiZF93b3JrICosIGludCk7CiBleHRlcm4gaW50IHdfZV9lbmRfcnNkYXRhX3JlcShzdHJ1Y3QgZHJiZF93b3JrICosIGludCk7CkBAIC0xNTI5LDEwICsxMzIyLDggQEAKIGV4dGVybiBpbnQgd19vdl9maW5pc2hlZChzdHJ1Y3QgZHJiZF93b3JrICosIGludCk7CiBleHRlcm4gaW50IHdfcmVzeW5jX3RpbWVyKHN0cnVjdCBkcmJkX3dvcmsgKiwgaW50KTsKIGV4dGVybiBpbnQgd19zZW5kX3dyaXRlX2hpbnQoc3RydWN0IGRyYmRfd29yayAqLCBpbnQpOwotZXh0ZXJuIGludCB3X21ha2VfcmVzeW5jX3JlcXVlc3Qoc3RydWN0IGRyYmRfd29yayAqLCBpbnQpOwogZXh0ZXJuIGludCB3X3NlbmRfZGJsb2NrKHN0cnVjdCBkcmJkX3dvcmsgKiwgaW50KTsKIGV4dGVybiBpbnQgd19zZW5kX3JlYWRfcmVxKHN0cnVjdCBkcmJkX3dvcmsgKiwgaW50KTsKLWV4dGVybiBpbnQgd19wcmV2X3dvcmtfZG9uZShzdHJ1Y3QgZHJiZF93b3JrICosIGludCk7CiBleHRlcm4gaW50IHdfZV9yZWlzc3VlKHN0cnVjdCBkcmJkX3dvcmsgKiwgaW50KTsKIGV4dGVybiBpbnQgd19yZXN0YXJ0X2Rpc2tfaW8oc3RydWN0IGRyYmRfd29yayAqLCBpbnQpOwogZXh0ZXJuIGludCB3X3NlbmRfb3V0X29mX3N5bmMoc3RydWN0IGRyYmRfd29yayAqLCBpbnQpOwpAQCAtMTU0MiwyNyArMTMzMywyNCBAQAogZXh0ZXJuIHZvaWQgc3RhcnRfcmVzeW5jX3RpbWVyX2ZuKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKIC8qIGRyYmRfcmVjZWl2ZXIuYyAqLwotZXh0ZXJuIGludCBkcmJkX3JzX3Nob3VsZF9zbG93X2Rvd24oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yKTsKLWV4dGVybiBpbnQgZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KHN0cnVjdCBkcmJkX2NvbmYgKiwKK2V4dGVybiBpbnQgZHJiZF9yZWNlaXZlcihzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSk7CitleHRlcm4gaW50IGRyYmRfYXNlbmRlcihzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSk7CitleHRlcm4gaW50IGRyYmRfcnNfc2hvdWxkX3Nsb3dfZG93bihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yKTsKK2V4dGVybiBpbnQgZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KHN0cnVjdCBkcmJkX2RldmljZSAqLAogCQkJCSAgICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKiwgY29uc3QgdW5zaWduZWQsCiAJCQkJICAgIGNvbnN0IGludCk7Ci1leHRlcm4gaW50IGRyYmRfZnJlZV9wZWVyX3JlcXMoc3RydWN0IGRyYmRfY29uZiAqLCBzdHJ1Y3QgbGlzdF9oZWFkICopOwotZXh0ZXJuIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqZHJiZF9hbGxvY19wZWVyX3JlcShzdHJ1Y3QgZHJiZF9jb25mICosIHU2NCwKK2V4dGVybiBpbnQgZHJiZF9mcmVlX3BlZXJfcmVxcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgc3RydWN0IGxpc3RfaGVhZCAqKTsKK2V4dGVybiBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKmRyYmRfYWxsb2NfcGVlcl9yZXEoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgdTY0LAogCQkJCQkJICAgICBzZWN0b3JfdCwgdW5zaWduZWQgaW50LAogCQkJCQkJICAgICBnZnBfdCkgX19tdXN0X2hvbGQobG9jYWwpOwotZXh0ZXJuIHZvaWQgX19kcmJkX2ZyZWVfcGVlcl9yZXEoc3RydWN0IGRyYmRfY29uZiAqLCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKiwKK2V4dGVybiB2b2lkIF9fZHJiZF9mcmVlX3BlZXJfcmVxKHN0cnVjdCBkcmJkX2RldmljZSAqLCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKiwKIAkJCQkgaW50KTsKICNkZWZpbmUgZHJiZF9mcmVlX3BlZXJfcmVxKG0sZSkgX19kcmJkX2ZyZWVfcGVlcl9yZXEobSwgZSwgMCkKICNkZWZpbmUgZHJiZF9mcmVlX25ldF9wZWVyX3JlcShtLGUpIF9fZHJiZF9mcmVlX3BlZXJfcmVxKG0sIGUsIDEpCi1leHRlcm4gc3RydWN0IHBhZ2UgKmRyYmRfYWxsb2NfcGFnZXMoc3RydWN0IGRyYmRfY29uZiAqLCB1bnNpZ25lZCBpbnQsIGJvb2wpOwotZXh0ZXJuIHZvaWQgZHJiZF9zZXRfcmVjdl90Y3Eoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IHRjcV9lbmFibGVkKTsKLWV4dGVybiB2b2lkIF9kcmJkX2NsZWFyX2RvbmVfZWUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGxpc3RfaGVhZCAqdG9fYmVfZnJlZWQpOwotZXh0ZXJuIHZvaWQgY29ubl9mbHVzaF93b3JrcXVldWUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKLWV4dGVybiBpbnQgZHJiZF9jb25uZWN0ZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci1zdGF0aWMgaW5saW5lIHZvaWQgZHJiZF9mbHVzaF93b3JrcXVldWUoc3RydWN0IGRyYmRfY29uZiAqbWRldikKLXsKLQljb25uX2ZsdXNoX3dvcmtxdWV1ZShtZGV2LT50Y29ubik7Ci19CitleHRlcm4gc3RydWN0IHBhZ2UgKmRyYmRfYWxsb2NfcGFnZXMoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgdW5zaWduZWQgaW50LCBib29sKTsKK2V4dGVybiB2b2lkIGRyYmRfc2V0X3JlY3ZfdGNxKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgdGNxX2VuYWJsZWQpOworZXh0ZXJuIHZvaWQgX2RyYmRfY2xlYXJfZG9uZV9lZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGxpc3RfaGVhZCAqdG9fYmVfZnJlZWQpOworZXh0ZXJuIGludCBkcmJkX2Nvbm5lY3RlZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqKTsKIAogLyogWWVzLCB0aGVyZSBpcyBrZXJuZWxfc2V0c29ja29wdCwgYnV0IG9ubHkgc2luY2UgMi42LjE4LgogICogU28gd2UgaGF2ZSBvdXIgb3duIGNvcHkgb2YgaXQgaGVyZS4gKi8KQEAgLTE2MTMsNyArMTQwMSw3IEBACiAJCQkoY2hhciopJnZhbCwgc2l6ZW9mKHZhbCkpOwogfQogCi12b2lkIGRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGVudW0gd3JpdGVfb3JkZXJpbmdfZSB3byk7Cit2b2lkIGRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBlbnVtIHdyaXRlX29yZGVyaW5nX2Ugd28pOwogCiAvKiBkcmJkX3Byb2MuYyAqLwogZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHJiZF9wcm9jOwpAQCAtMTYyMiwyOSArMTQxMCwyOSBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKmRyYmRfcm9sZV9zdHIoZW51bSBkcmJkX3JvbGUgcyk7CiAKIC8qIGRyYmRfYWN0bG9nLmMgKi8KLWV4dGVybiBpbnQgZHJiZF9hbF9iZWdpbl9pb19ub25ibG9jayhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSk7Ci1leHRlcm4gdm9pZCBkcmJkX2FsX2JlZ2luX2lvX2NvbW1pdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBib29sIGRlbGVnYXRlKTsKLWV4dGVybiBib29sIGRyYmRfYWxfYmVnaW5faW9fZmFzdHBhdGgoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfaW50ZXJ2YWwgKmkpOwotZXh0ZXJuIHZvaWQgZHJiZF9hbF9iZWdpbl9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSwgYm9vbCBkZWxlZ2F0ZSk7Ci1leHRlcm4gdm9pZCBkcmJkX2FsX2NvbXBsZXRlX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBkcmJkX2ludGVydmFsICppKTsKLWV4dGVybiB2b2lkIGRyYmRfcnNfY29tcGxldGVfaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yKTsKLWV4dGVybiBpbnQgZHJiZF9yc19iZWdpbl9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IpOwotZXh0ZXJuIGludCBkcmJkX3RyeV9yc19iZWdpbl9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IpOwotZXh0ZXJuIHZvaWQgZHJiZF9yc19jYW5jZWxfYWxsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGludCBkcmJkX3JzX2RlbF9hbGwoc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci1leHRlcm4gdm9pZCBkcmJkX3JzX2ZhaWxlZF9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorZXh0ZXJuIGludCBkcmJkX2FsX2JlZ2luX2lvX25vbmJsb2NrKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSk7CitleHRlcm4gdm9pZCBkcmJkX2FsX2JlZ2luX2lvX2NvbW1pdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgYm9vbCBkZWxlZ2F0ZSk7CitleHRlcm4gYm9vbCBkcmJkX2FsX2JlZ2luX2lvX2Zhc3RwYXRoKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSk7CitleHRlcm4gdm9pZCBkcmJkX2FsX2JlZ2luX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSwgYm9vbCBkZWxlZ2F0ZSk7CitleHRlcm4gdm9pZCBkcmJkX2FsX2NvbXBsZXRlX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSk7CitleHRlcm4gdm9pZCBkcmJkX3JzX2NvbXBsZXRlX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzZWN0b3JfdCBzZWN0b3IpOworZXh0ZXJuIGludCBkcmJkX3JzX2JlZ2luX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzZWN0b3JfdCBzZWN0b3IpOworZXh0ZXJuIGludCBkcmJkX3RyeV9yc19iZWdpbl9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yKTsKK2V4dGVybiB2b2lkIGRyYmRfcnNfY2FuY2VsX2FsbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gaW50IGRyYmRfcnNfZGVsX2FsbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gdm9pZCBkcmJkX3JzX2ZhaWxlZF9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSk7Ci1leHRlcm4gdm9pZCBkcmJkX2FkdmFuY2VfcnNfbWFya3Moc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBzdGlsbF90b19nbyk7Ci1leHRlcm4gdm9pZCBfX2RyYmRfc2V0X2luX3N5bmMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yLAorZXh0ZXJuIHZvaWQgZHJiZF9hZHZhbmNlX3JzX21hcmtzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIHN0aWxsX3RvX2dvKTsKK2V4dGVybiB2b2lkIF9fZHJiZF9zZXRfaW5fc3luYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yLAogCQlpbnQgc2l6ZSwgY29uc3QgY2hhciAqZmlsZSwgY29uc3QgdW5zaWduZWQgaW50IGxpbmUpOwotI2RlZmluZSBkcmJkX3NldF9pbl9zeW5jKG1kZXYsIHNlY3Rvciwgc2l6ZSkgXAotCV9fZHJiZF9zZXRfaW5fc3luYyhtZGV2LCBzZWN0b3IsIHNpemUsIF9fRklMRV9fLCBfX0xJTkVfXykKLWV4dGVybiBpbnQgX19kcmJkX3NldF9vdXRfb2Zfc3luYyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsCisjZGVmaW5lIGRyYmRfc2V0X2luX3N5bmMoZGV2aWNlLCBzZWN0b3IsIHNpemUpIFwKKwlfX2RyYmRfc2V0X2luX3N5bmMoZGV2aWNlLCBzZWN0b3IsIHNpemUsIF9fRklMRV9fLCBfX0xJTkVfXykKK2V4dGVybiBpbnQgX19kcmJkX3NldF9vdXRfb2Zfc3luYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yLAogCQlpbnQgc2l6ZSwgY29uc3QgY2hhciAqZmlsZSwgY29uc3QgdW5zaWduZWQgaW50IGxpbmUpOwotI2RlZmluZSBkcmJkX3NldF9vdXRfb2Zfc3luYyhtZGV2LCBzZWN0b3IsIHNpemUpIFwKLQlfX2RyYmRfc2V0X291dF9vZl9zeW5jKG1kZXYsIHNlY3Rvciwgc2l6ZSwgX19GSUxFX18sIF9fTElORV9fKQotZXh0ZXJuIHZvaWQgZHJiZF9hbF9zaHJpbmsoc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci1leHRlcm4gaW50IGRyYmRfaW5pdGlhbGl6ZV9hbChzdHJ1Y3QgZHJiZF9jb25mICosIHZvaWQgKik7CisjZGVmaW5lIGRyYmRfc2V0X291dF9vZl9zeW5jKGRldmljZSwgc2VjdG9yLCBzaXplKSBcCisJX19kcmJkX3NldF9vdXRfb2Zfc3luYyhkZXZpY2UsIHNlY3Rvciwgc2l6ZSwgX19GSUxFX18sIF9fTElORV9fKQorZXh0ZXJuIHZvaWQgZHJiZF9hbF9zaHJpbmsoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGludCBkcmJkX2luaXRpYWxpemVfYWwoc3RydWN0IGRyYmRfZGV2aWNlICosIHZvaWQgKik7CiAKIC8qIGRyYmRfbmwuYyAqLwogLyogc3RhdGUgaW5mbyBicm9hZGNhc3QgKi8KQEAgLTE2NjEsNyArMTQ0OSw3IEBACiAJCX07CiAJfTsKIH07Ci12b2lkIGRyYmRfYmNhc3RfZXZlbnQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgY29uc3Qgc3RydWN0IHNpYl9pbmZvICpzaWIpOwordm9pZCBkcmJkX2JjYXN0X2V2ZW50KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCBzdHJ1Y3Qgc2liX2luZm8gKnNpYik7CiAKIC8qCiAgKiBpbmxpbmUgaGVscGVyIGZ1bmN0aW9ucwpAQCAtMTY5MCwyNiArMTQ3OCwyNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGVudW0gZHJiZF9zdGF0ZV9ydgotX2RyYmRfc2V0X3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgbnMsCitfZHJiZF9zZXRfc3RhdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuaW9uIGRyYmRfc3RhdGUgbnMsCiAJCWVudW0gY2hnX3N0YXRlX2ZsYWdzIGZsYWdzLCBzdHJ1Y3QgY29tcGxldGlvbiAqZG9uZSkKIHsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnY7CiAKIAlyZWFkX2xvY2soJmdsb2JhbF9zdGF0ZV9sb2NrKTsKLQlydiA9IF9fZHJiZF9zZXRfc3RhdGUobWRldiwgbnMsIGZsYWdzLCBkb25lKTsKKwlydiA9IF9fZHJiZF9zZXRfc3RhdGUoZGV2aWNlLCBucywgZmxhZ3MsIGRvbmUpOwogCXJlYWRfdW5sb2NrKCZnbG9iYWxfc3RhdGVfbG9jayk7CiAKIAlyZXR1cm4gcnY7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5pb24gZHJiZF9zdGF0ZSBkcmJkX3JlYWRfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbmxpbmUgdW5pb24gZHJiZF9zdGF0ZSBkcmJkX3JlYWRfc3RhdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlID0gZGV2aWNlLT5yZXNvdXJjZTsKIAl1bmlvbiBkcmJkX3N0YXRlIHJ2OwogCi0JcnYuaSA9IG1kZXYtPnN0YXRlLmk7Ci0JcnYuc3VzcCA9IG1kZXYtPnRjb25uLT5zdXNwOwotCXJ2LnN1c3Bfbm9kID0gbWRldi0+dGNvbm4tPnN1c3Bfbm9kOwotCXJ2LnN1c3BfZmVuID0gbWRldi0+dGNvbm4tPnN1c3BfZmVuOworCXJ2LmkgPSBkZXZpY2UtPnN0YXRlLmk7CisJcnYuc3VzcCA9IHJlc291cmNlLT5zdXNwOworCXJ2LnN1c3Bfbm9kID0gcmVzb3VyY2UtPnN1c3Bfbm9kOworCXJ2LnN1c3BfZmVuID0gcmVzb3VyY2UtPnN1c3BfZmVuOwogCiAJcmV0dXJuIHJ2OwogfQpAQCAtMTcyMiwyMiArMTUxMSwyMiBAQAogfTsKIAogI2RlZmluZSBfX2RyYmRfY2hrX2lvX2Vycm9yKG0sZikgX19kcmJkX2Noa19pb19lcnJvcl8obSxmLCBfX2Z1bmNfXykKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2RyYmRfY2hrX2lvX2Vycm9yXyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIGlubGluZSB2b2lkIF9fZHJiZF9jaGtfaW9fZXJyb3JfKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQllbnVtIGRyYmRfZm9yY2VfZGV0YWNoX2ZsYWdzIGRmLAogCQljb25zdCBjaGFyICp3aGVyZSkKIHsKIAllbnVtIGRyYmRfaW9fZXJyb3JfcCBlcDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQllcCA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5vbl9pb19lcnJvcjsKKwllcCA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPm9uX2lvX2Vycm9yOwogCXJjdV9yZWFkX3VubG9jaygpOwogCXN3aXRjaCAoZXApIHsKIAljYXNlIEVQX1BBU1NfT046IC8qIEZJWE1FIHdvdWxkIHRoaXMgYmUgYmV0dGVyIG5hbWVkICJJZ25vcmUiPyAqLwogCQlpZiAoZGYgPT0gRFJCRF9SRUFEX0VSUk9SIHx8IGRmID09IERSQkRfV1JJVEVfRVJST1IpIHsKIAkJCWlmIChfX3JhdGVsaW1pdCgmZHJiZF9yYXRlbGltaXRfc3RhdGUpKQotCQkJCWRldl9lcnIoREVWLCAiTG9jYWwgSU8gZmFpbGVkIGluICVzLlxuIiwgd2hlcmUpOwotCQkJaWYgKG1kZXYtPnN0YXRlLmRpc2sgPiBEX0lOQ09OU0lTVEVOVCkKLQkJCQlfZHJiZF9zZXRfc3RhdGUoX05TKG1kZXYsIGRpc2ssIERfSU5DT05TSVNURU5UKSwgQ1NfSEFSRCwgTlVMTCk7CisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiTG9jYWwgSU8gZmFpbGVkIGluICVzLlxuIiwgd2hlcmUpOworCQkJaWYgKGRldmljZS0+c3RhdGUuZGlzayA+IERfSU5DT05TSVNURU5UKQorCQkJCV9kcmJkX3NldF9zdGF0ZShfTlMoZGV2aWNlLCBkaXNrLCBEX0lOQ09OU0lTVEVOVCksIENTX0hBUkQsIE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KIAkJLyogTk9URSBmYWxsIHRocm91Z2ggZm9yIERSQkRfTUVUQV9JT19FUlJPUiBvciBEUkJEX0ZPUkNFX0RFVEFDSCAqLwpAQCAtMTc2MywxNCArMTU1MiwxNCBAQAogCQkgKiB3ZSByZWFkIG1ldGEgZGF0YSBvbmx5IG9uY2UgZHVyaW5nIGF0dGFjaCwKIAkJICogd2hpY2ggd2lsbCBmYWlsIGluIGNhc2Ugb2YgZXJyb3JzLgogCQkgKi8KLQkJc2V0X2JpdChXQVNfSU9fRVJST1IsICZtZGV2LT5mbGFncyk7CisJCXNldF9iaXQoV0FTX0lPX0VSUk9SLCAmZGV2aWNlLT5mbGFncyk7CiAJCWlmIChkZiA9PSBEUkJEX1JFQURfRVJST1IpCi0JCQlzZXRfYml0KFdBU19SRUFEX0VSUk9SLCAmbWRldi0+ZmxhZ3MpOworCQkJc2V0X2JpdChXQVNfUkVBRF9FUlJPUiwgJmRldmljZS0+ZmxhZ3MpOwogCQlpZiAoZGYgPT0gRFJCRF9GT1JDRV9ERVRBQ0gpCi0JCQlzZXRfYml0KEZPUkNFX0RFVEFDSCwgJm1kZXYtPmZsYWdzKTsKLQkJaWYgKG1kZXYtPnN0YXRlLmRpc2sgPiBEX0ZBSUxFRCkgewotCQkJX2RyYmRfc2V0X3N0YXRlKF9OUyhtZGV2LCBkaXNrLCBEX0ZBSUxFRCksIENTX0hBUkQsIE5VTEwpOwotCQkJZGV2X2VycihERVYsCisJCQlzZXRfYml0KEZPUkNFX0RFVEFDSCwgJmRldmljZS0+ZmxhZ3MpOworCQlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrID4gRF9GQUlMRUQpIHsKKwkJCV9kcmJkX3NldF9zdGF0ZShfTlMoZGV2aWNlLCBkaXNrLCBEX0ZBSUxFRCksIENTX0hBUkQsIE5VTEwpOworCQkJZHJiZF9lcnIoZGV2aWNlLAogCQkJCSJMb2NhbCBJTyBmYWlsZWQgaW4gJXMuIERldGFjaGluZy4uLlxuIiwgd2hlcmUpOwogCQl9CiAJCWJyZWFrOwpAQCAtMTc3OSwyMSArMTU2OCwyMSBAQAogCiAvKioKICAqIGRyYmRfY2hrX2lvX2Vycm9yOiBIYW5kbGUgdGhlIG9uX2lvX2Vycm9yIHNldHRpbmcsIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBhbGwgaW8gY29tcGxldGlvbiBoYW5kbGVycwotICogQG1kZXY6CSBEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CSBEUkJEIGRldmljZS4KICAqIEBlcnJvcjoJIEVycm9yIGNvZGUgcGFzc2VkIHRvIHRoZSBJTyBjb21wbGV0aW9uIGNhbGxiYWNrCiAgKiBAZm9yY2VkZXRhY2g6IEZvcmNlIGRldGFjaC4gSS5lLiB0aGUgZXJyb3IgaGFwcGVuZWQgd2hpbGUgYWNjZXNzaW5nIHRoZSBtZXRhIGRhdGEKICAqCiAgKiBTZWUgYWxzbyBkcmJkX21haW4uYzphZnRlcl9zdGF0ZV9jaCgpIGlmIChvcy5kaXNrID4gRF9GQUlMRUQgJiYgbnMuZGlzayA9PSBEX0ZBSUxFRCkKICAqLwogI2RlZmluZSBkcmJkX2Noa19pb19lcnJvcihtLGUsZikgZHJiZF9jaGtfaW9fZXJyb3JfKG0sZSxmLCBfX2Z1bmNfXykKLXN0YXRpYyBpbmxpbmUgdm9pZCBkcmJkX2Noa19pb19lcnJvcl8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcmJkX2Noa19pb19lcnJvcl8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJaW50IGVycm9yLCBlbnVtIGRyYmRfZm9yY2VfZGV0YWNoX2ZsYWdzIGZvcmNlZGV0YWNoLCBjb25zdCBjaGFyICp3aGVyZSkKIHsKIAlpZiAoZXJyb3IpIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPnRjb25uLT5yZXFfbG9jaywgZmxhZ3MpOwotCQlfX2RyYmRfY2hrX2lvX2Vycm9yXyhtZGV2LCBmb3JjZWRldGFjaCwgd2hlcmUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CisJCV9fZHJiZF9jaGtfaW9fZXJyb3JfKGRldmljZSwgZm9yY2VkZXRhY2gsIHdoZXJlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKIAl9CiB9CiAKQEAgLTE5MTYsMzEgKzE3MDUsMzMgQEAKIAl3YWtlX3VwKCZxLT5xX3dhaXQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgd2FrZV9hc2VuZGVyKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK2V4dGVybiB2b2lkIGRyYmRfZmx1c2hfd29ya3F1ZXVlKHN0cnVjdCBkcmJkX3dvcmtfcXVldWUgKndvcmtfcXVldWUpOworCitzdGF0aWMgaW5saW5lIHZvaWQgd2FrZV9hc2VuZGVyKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0JaWYgKHRlc3RfYml0KFNJR05BTF9BU0VOREVSLCAmdGNvbm4tPmZsYWdzKSkKLQkJZm9yY2Vfc2lnKERSQkRfU0lHLCB0Y29ubi0+YXNlbmRlci50YXNrKTsKKwlpZiAodGVzdF9iaXQoU0lHTkFMX0FTRU5ERVIsICZjb25uZWN0aW9uLT5mbGFncykpCisJCWZvcmNlX3NpZyhEUkJEX1NJRywgY29ubmVjdGlvbi0+YXNlbmRlci50YXNrKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHJlcXVlc3RfcGluZyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitzdGF0aWMgaW5saW5lIHZvaWQgcmVxdWVzdF9waW5nKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0Jc2V0X2JpdChTRU5EX1BJTkcsICZ0Y29ubi0+ZmxhZ3MpOwotCXdha2VfYXNlbmRlcih0Y29ubik7CisJc2V0X2JpdChTRU5EX1BJTkcsICZjb25uZWN0aW9uLT5mbGFncyk7CisJd2FrZV9hc2VuZGVyKGNvbm5lY3Rpb24pOwogfQogCi1leHRlcm4gdm9pZCAqY29ubl9wcmVwYXJlX2NvbW1hbmQoc3RydWN0IGRyYmRfdGNvbm4gKiwgc3RydWN0IGRyYmRfc29ja2V0ICopOwotZXh0ZXJuIHZvaWQgKmRyYmRfcHJlcGFyZV9jb21tYW5kKHN0cnVjdCBkcmJkX2NvbmYgKiwgc3RydWN0IGRyYmRfc29ja2V0ICopOwotZXh0ZXJuIGludCBjb25uX3NlbmRfY29tbWFuZChzdHJ1Y3QgZHJiZF90Y29ubiAqLCBzdHJ1Y3QgZHJiZF9zb2NrZXQgKiwKK2V4dGVybiB2b2lkICpjb25uX3ByZXBhcmVfY29tbWFuZChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICosIHN0cnVjdCBkcmJkX3NvY2tldCAqKTsKK2V4dGVybiB2b2lkICpkcmJkX3ByZXBhcmVfY29tbWFuZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCBzdHJ1Y3QgZHJiZF9zb2NrZXQgKik7CitleHRlcm4gaW50IGNvbm5fc2VuZF9jb21tYW5kKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKiwgc3RydWN0IGRyYmRfc29ja2V0ICosCiAJCQkgICAgIGVudW0gZHJiZF9wYWNrZXQsIHVuc2lnbmVkIGludCwgdm9pZCAqLAogCQkJICAgICB1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfY29tbWFuZChzdHJ1Y3QgZHJiZF9jb25mICosIHN0cnVjdCBkcmJkX3NvY2tldCAqLAorZXh0ZXJuIGludCBkcmJkX3NlbmRfY29tbWFuZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCBzdHJ1Y3QgZHJiZF9zb2NrZXQgKiwKIAkJCSAgICAgZW51bSBkcmJkX3BhY2tldCwgdW5zaWduZWQgaW50LCB2b2lkICosCiAJCQkgICAgIHVuc2lnbmVkIGludCk7CiAKLWV4dGVybiBpbnQgZHJiZF9zZW5kX3Bpbmcoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKLWV4dGVybiBpbnQgZHJiZF9zZW5kX3BpbmdfYWNrKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1leHRlcm4gaW50IGRyYmRfc2VuZF9zdGF0ZV9yZXEoc3RydWN0IGRyYmRfY29uZiAqLCB1bmlvbiBkcmJkX3N0YXRlLCB1bmlvbiBkcmJkX3N0YXRlKTsKLWV4dGVybiBpbnQgY29ubl9zZW5kX3N0YXRlX3JlcShzdHJ1Y3QgZHJiZF90Y29ubiAqLCB1bmlvbiBkcmJkX3N0YXRlLCB1bmlvbiBkcmJkX3N0YXRlKTsKK2V4dGVybiBpbnQgZHJiZF9zZW5kX3Bpbmcoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitleHRlcm4gaW50IGRyYmRfc2VuZF9waW5nX2FjayhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2V4dGVybiBpbnQgZHJiZF9zZW5kX3N0YXRlX3JlcShzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCB1bmlvbiBkcmJkX3N0YXRlLCB1bmlvbiBkcmJkX3N0YXRlKTsKK2V4dGVybiBpbnQgY29ubl9zZW5kX3N0YXRlX3JlcShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICosIHVuaW9uIGRyYmRfc3RhdGUsIHVuaW9uIGRyYmRfc3RhdGUpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgZHJiZF90aHJlYWRfc3RvcChzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSkKIHsKQEAgLTE5NzksMjIgKzE3NzAsMjIgQEAKICAqICBfcmVxX21vZChyZXEsIENPTk5FQ1RJT05fTE9TVF9XSElMRV9QRU5ESU5HKQogICogICAgIFtmcm9tIHRsX2NsZWFyX2JhcnJpZXJdCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpbmNfYXBfcGVuZGluZyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSB2b2lkIGluY19hcF9wZW5kaW5nKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCWF0b21pY19pbmMoJm1kZXYtPmFwX3BlbmRpbmdfY250KTsKKwlhdG9taWNfaW5jKCZkZXZpY2UtPmFwX3BlbmRpbmdfY250KTsKIH0KIAogI2RlZmluZSBFUlJfSUZfQ05UX0lTX05FR0FUSVZFKHdoaWNoLCBmdW5jLCBsaW5lKQkJCVwKLQlpZiAoYXRvbWljX3JlYWQoJm1kZXYtPndoaWNoKSA8IDApCQkJCVwKLQkJZGV2X2VycihERVYsICJpbiAlczolZDogIiAjd2hpY2ggIiA9ICVkIDwgMCAhXG4iLAlcCisJaWYgKGF0b21pY19yZWFkKCZkZXZpY2UtPndoaWNoKSA8IDApCQkJCVwKKwkJZHJiZF9lcnIoZGV2aWNlLCAiaW4gJXM6JWQ6ICIgI3doaWNoICIgPSAlZCA8IDAgIVxuIiwJXAogCQkJZnVuYywgbGluZSwJCQkJCVwKLQkJCWF0b21pY19yZWFkKCZtZGV2LT53aGljaCkpCisJCQlhdG9taWNfcmVhZCgmZGV2aWNlLT53aGljaCkpCiAKLSNkZWZpbmUgZGVjX2FwX3BlbmRpbmcobWRldikgX2RlY19hcF9wZW5kaW5nKG1kZXYsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCi1zdGF0aWMgaW5saW5lIHZvaWQgX2RlY19hcF9wZW5kaW5nKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQorI2RlZmluZSBkZWNfYXBfcGVuZGluZyhkZXZpY2UpIF9kZWNfYXBfcGVuZGluZyhkZXZpY2UsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCitzdGF0aWMgaW5saW5lIHZvaWQgX2RlY19hcF9wZW5kaW5nKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKIHsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbWRldi0+YXBfcGVuZGluZ19jbnQpKQotCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXZpY2UtPmFwX3BlbmRpbmdfY250KSkKKwkJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOwogCUVSUl9JRl9DTlRfSVNfTkVHQVRJVkUoYXBfcGVuZGluZ19jbnQsIGZ1bmMsIGxpbmUpOwogfQogCkBAIC0yMDA0LDE1ICsxNzk1LDE1IEBACiAgKiBDX1NZTkNfU09VUkNFIHNlbmRzIFBfUlNfREFUQV9SRVBMWSAgIChhbmQgZXhwZWN0cyBQX1dSSVRFX0FDSyB3aXRoIElEX1NZTkNFUikKICAqCQkJCQkgICAob3IgUF9ORUdfQUNLIHdpdGggSURfU1lOQ0VSKQogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5jX3JzX3BlbmRpbmcoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbmNfcnNfcGVuZGluZyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlhdG9taWNfaW5jKCZtZGV2LT5yc19wZW5kaW5nX2NudCk7CisJYXRvbWljX2luYygmZGV2aWNlLT5yc19wZW5kaW5nX2NudCk7CiB9CiAKLSNkZWZpbmUgZGVjX3JzX3BlbmRpbmcobWRldikgX2RlY19yc19wZW5kaW5nKG1kZXYsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCi1zdGF0aWMgaW5saW5lIHZvaWQgX2RlY19yc19wZW5kaW5nKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQorI2RlZmluZSBkZWNfcnNfcGVuZGluZyhkZXZpY2UpIF9kZWNfcnNfcGVuZGluZyhkZXZpY2UsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCitzdGF0aWMgaW5saW5lIHZvaWQgX2RlY19yc19wZW5kaW5nKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKIHsKLQlhdG9taWNfZGVjKCZtZGV2LT5yc19wZW5kaW5nX2NudCk7CisJYXRvbWljX2RlYygmZGV2aWNlLT5yc19wZW5kaW5nX2NudCk7CiAJRVJSX0lGX0NOVF9JU19ORUdBVElWRShyc19wZW5kaW5nX2NudCwgZnVuYywgbGluZSk7CiB9CiAKQEAgLTIwMjUsMTAzICsxODE2LDEwNCBAQAogICogIHJlY2VpdmVfRGF0YVJlcXVlc3QgKHJlY2VpdmVfUlNEYXRhUmVxdWVzdCkgd2UgbmVlZCB0byBzZW5kIGJhY2sgUF9EQVRBCiAgKiAgcmVjZWl2ZV9CYXJyaWVyXyoJd2UgbmVlZCB0byBzZW5kIGEgUF9CQVJSSUVSX0FDSwogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5jX3VuYWNrZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbmNfdW5hY2tlZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlhdG9taWNfaW5jKCZtZGV2LT51bmFja2VkX2NudCk7CisJYXRvbWljX2luYygmZGV2aWNlLT51bmFja2VkX2NudCk7CiB9CiAKLSNkZWZpbmUgZGVjX3VuYWNrZWQobWRldikgX2RlY191bmFja2VkKG1kZXYsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCi1zdGF0aWMgaW5saW5lIHZvaWQgX2RlY191bmFja2VkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQorI2RlZmluZSBkZWNfdW5hY2tlZChkZXZpY2UpIF9kZWNfdW5hY2tlZChkZXZpY2UsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCitzdGF0aWMgaW5saW5lIHZvaWQgX2RlY191bmFja2VkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKIHsKLQlhdG9taWNfZGVjKCZtZGV2LT51bmFja2VkX2NudCk7CisJYXRvbWljX2RlYygmZGV2aWNlLT51bmFja2VkX2NudCk7CiAJRVJSX0lGX0NOVF9JU19ORUdBVElWRSh1bmFja2VkX2NudCwgZnVuYywgbGluZSk7CiB9CiAKLSNkZWZpbmUgc3ViX3VuYWNrZWQobWRldiwgbikgX3N1Yl91bmFja2VkKG1kZXYsIG4sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCi1zdGF0aWMgaW5saW5lIHZvaWQgX3N1Yl91bmFja2VkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBuLCBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKKyNkZWZpbmUgc3ViX3VuYWNrZWQoZGV2aWNlLCBuKSBfc3ViX3VuYWNrZWQoZGV2aWNlLCBuLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKQorc3RhdGljIGlubGluZSB2b2lkIF9zdWJfdW5hY2tlZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IG4sIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQogewotCWF0b21pY19zdWIobiwgJm1kZXYtPnVuYWNrZWRfY250KTsKKwlhdG9taWNfc3ViKG4sICZkZXZpY2UtPnVuYWNrZWRfY250KTsKIAlFUlJfSUZfQ05UX0lTX05FR0FUSVZFKHVuYWNrZWRfY250LCBmdW5jLCBsaW5lKTsKIH0KIAogLyoqCi0gKiBnZXRfbGRldigpIC0gSW5jcmVhc2UgdGhlIHJlZiBjb3VudCBvbiBtZGV2LT5sZGV2LiBSZXR1cm5zIDAgaWYgdGhlcmUgaXMgbm8gbGRldgorICogZ2V0X2xkZXYoKSAtIEluY3JlYXNlIHRoZSByZWYgY291bnQgb24gZGV2aWNlLT5sZGV2LiBSZXR1cm5zIDAgaWYgdGhlcmUgaXMgbm8gbGRldgogICogQE06CQlEUkJEIGRldmljZS4KICAqCi0gKiBZb3UgaGF2ZSB0byBjYWxsIHB1dF9sZGV2KCkgd2hlbiBmaW5pc2hlZCB3b3JraW5nIHdpdGggbWRldi0+bGRldi4KKyAqIFlvdSBoYXZlIHRvIGNhbGwgcHV0X2xkZXYoKSB3aGVuIGZpbmlzaGVkIHdvcmtpbmcgd2l0aCBkZXZpY2UtPmxkZXYuCiAgKi8KICNkZWZpbmUgZ2V0X2xkZXYoTSkgX19jb25kX2xvY2sobG9jYWwsIF9nZXRfbGRldl9pZl9zdGF0ZShNLERfSU5DT05TSVNURU5UKSkKICNkZWZpbmUgZ2V0X2xkZXZfaWZfc3RhdGUoTSxNSU5TKSBfX2NvbmRfbG9jayhsb2NhbCwgX2dldF9sZGV2X2lmX3N0YXRlKE0sTUlOUykpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfbGRldihzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSB2b2lkIHB1dF9sZGV2KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCWludCBpID0gYXRvbWljX2RlY19yZXR1cm4oJm1kZXYtPmxvY2FsX2NudCk7CisJaW50IGkgPSBhdG9taWNfZGVjX3JldHVybigmZGV2aWNlLT5sb2NhbF9jbnQpOwogCiAJLyogVGhpcyBtYXkgYmUgY2FsbGVkIGZyb20gc29tZSBlbmRpbyBoYW5kbGVyLAogCSAqIHNvIHdlIG11c3Qgbm90IHNsZWVwIGhlcmUuICovCiAKIAlfX3JlbGVhc2UobG9jYWwpOwotCURfQVNTRVJUKGkgPj0gMCk7CisJRF9BU1NFUlQoZGV2aWNlLCBpID49IDApOwogCWlmIChpID09IDApIHsKLQkJaWYgKG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUykKKwkJaWYgKGRldmljZS0+c3RhdGUuZGlzayA9PSBEX0RJU0tMRVNTKQogCQkJLyogZXZlbiBpbnRlcm5hbCByZWZlcmVuY2VzIGdvbmUsIHNhZmUgdG8gZGVzdHJveSAqLwotCQkJZHJiZF9sZGV2X2Rlc3Ryb3kobWRldik7Ci0JCWlmIChtZGV2LT5zdGF0ZS5kaXNrID09IERfRkFJTEVEKSB7CisJCQlkcmJkX2xkZXZfZGVzdHJveShkZXZpY2UpOworCQlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrID09IERfRkFJTEVEKSB7CiAJCQkvKiBhbGwgYXBwbGljYXRpb24gSU8gcmVmZXJlbmNlcyBnb25lLiAqLwotCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEdPX0RJU0tMRVNTLCAmbWRldi0+ZmxhZ3MpKQotCQkJCWRyYmRfcXVldWVfd29yaygmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmbWRldi0+Z29fZGlza2xlc3MpOworCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEdPX0RJU0tMRVNTLCAmZGV2aWNlLT5mbGFncykpCisJCQkJZHJiZF9xdWV1ZV93b3JrKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yaywKKwkJCQkJCSZkZXZpY2UtPmdvX2Rpc2tsZXNzKTsKIAkJfQotCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCQl3YWtlX3VwKCZkZXZpY2UtPm1pc2Nfd2FpdCk7CiAJfQogfQogCiAjaWZuZGVmIF9fQ0hFQ0tFUl9fCi1zdGF0aWMgaW5saW5lIGludCBfZ2V0X2xkZXZfaWZfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX2Rpc2tfc3RhdGUgbWlucykKK3N0YXRpYyBpbmxpbmUgaW50IF9nZXRfbGRldl9pZl9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgZW51bSBkcmJkX2Rpc2tfc3RhdGUgbWlucykKIHsKIAlpbnQgaW9fYWxsb3dlZDsKIAogCS8qIG5ldmVyIGdldCBhIHJlZmVyZW5jZSB3aGlsZSBEX0RJU0tMRVNTICovCi0JaWYgKG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUykKKwlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrID09IERfRElTS0xFU1MpCiAJCXJldHVybiAwOwogCi0JYXRvbWljX2luYygmbWRldi0+bG9jYWxfY250KTsKLQlpb19hbGxvd2VkID0gKG1kZXYtPnN0YXRlLmRpc2sgPj0gbWlucyk7CisJYXRvbWljX2luYygmZGV2aWNlLT5sb2NhbF9jbnQpOworCWlvX2FsbG93ZWQgPSAoZGV2aWNlLT5zdGF0ZS5kaXNrID49IG1pbnMpOwogCWlmICghaW9fYWxsb3dlZCkKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJcmV0dXJuIGlvX2FsbG93ZWQ7CiB9CiAjZWxzZQotZXh0ZXJuIGludCBfZ2V0X2xkZXZfaWZfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX2Rpc2tfc3RhdGUgbWlucyk7CitleHRlcm4gaW50IF9nZXRfbGRldl9pZl9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgZW51bSBkcmJkX2Rpc2tfc3RhdGUgbWlucyk7CiAjZW5kaWYKIAogLyogeW91IG11c3QgaGF2ZSBhbiAiZ2V0X2xkZXYiIHJlZmVyZW5jZSAqLwotc3RhdGljIGlubGluZSB2b2lkIGRyYmRfZ2V0X3N5bmNlcl9wcm9ncmVzcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIGlubGluZSB2b2lkIGRyYmRfZ2V0X3N5bmNlcl9wcm9ncmVzcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJdW5zaWduZWQgbG9uZyAqYml0c19sZWZ0LCB1bnNpZ25lZCBpbnQgKnBlcl9taWxfZG9uZSkKIHsKIAkvKiB0aGlzIGlzIHRvIGJyZWFrIGl0IGF0IGNvbXBpbGUgdGltZSB3aGVuIHdlIGNoYW5nZSB0aGF0LCBpbiBjYXNlIHdlCiAJICogd2FudCB0byBzdXBwb3J0IG1vcmUgdGhhbiAoMTw8MzIpIGJpdHMgb24gYSAzMmJpdCBhcmNoLiAqLwotCXR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCBtZGV2LT5yc190b3RhbCk7CisJdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsIGRldmljZS0+cnNfdG90YWwpOwogCiAJLyogbm90ZTogYm90aCByc190b3RhbCBhbmQgcnNfbGVmdCBhcmUgaW4gYml0cywgaS5lLiBpbgogCSAqIHVuaXRzIG9mIEJNX0JMT0NLX1NJWkUuCiAJICogZm9yIHRoZSBwZXJjZW50YWdlLCB3ZSBkb24ndCBjYXJlLiAqLwogCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUyB8fCBtZGV2LT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpCi0JCSpiaXRzX2xlZnQgPSBtZGV2LT5vdl9sZWZ0OworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUyB8fCBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfVCkKKwkJKmJpdHNfbGVmdCA9IGRldmljZS0+b3ZfbGVmdDsKIAllbHNlCi0JCSpiaXRzX2xlZnQgPSBkcmJkX2JtX3RvdGFsX3dlaWdodChtZGV2KSAtIG1kZXYtPnJzX2ZhaWxlZDsKKwkJKmJpdHNfbGVmdCA9IGRyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSkgLSBkZXZpY2UtPnJzX2ZhaWxlZDsKIAkvKiA+PiAxMCB0byBwcmV2ZW50IG92ZXJmbG93LAogCSAqICsxIHRvIHByZXZlbnQgZGl2aXNpb24gYnkgemVybyAqLwotCWlmICgqYml0c19sZWZ0ID4gbWRldi0+cnNfdG90YWwpIHsKKwlpZiAoKmJpdHNfbGVmdCA+IGRldmljZS0+cnNfdG90YWwpIHsKIAkJLyogZG9oLiBtYXliZSBhIGxvZ2ljIGJ1ZyBzb21ld2hlcmUuCiAJCSAqIG1heSBhbHNvIGJlIGp1c3QgYSByYWNlIGNvbmRpdGlvbgogCQkgKiBiZXR3ZWVuIHRoaXMgYW5kIGEgZGlzY29ubmVjdCBkdXJpbmcgc3luYy4KIAkJICogZm9yIG5vdywganVzdCBwcmV2ZW50IGluLWtlcm5lbCBidWZmZXIgb3ZlcmZsb3cuCiAJCSAqLwogCQlzbXBfcm1iKCk7Ci0JCWRldl93YXJuKERFViwgImNzOiVzIHJzX2xlZnQ9JWx1ID4gcnNfdG90YWw9JWx1IChyc19mYWlsZWQgJWx1KVxuIiwKLQkJCQlkcmJkX2Nvbm5fc3RyKG1kZXYtPnN0YXRlLmNvbm4pLAotCQkJCSpiaXRzX2xlZnQsIG1kZXYtPnJzX3RvdGFsLCBtZGV2LT5yc19mYWlsZWQpOworCQlkcmJkX3dhcm4oZGV2aWNlLCAiY3M6JXMgcnNfbGVmdD0lbHUgPiByc190b3RhbD0lbHUgKHJzX2ZhaWxlZCAlbHUpXG4iLAorCQkJCWRyYmRfY29ubl9zdHIoZGV2aWNlLT5zdGF0ZS5jb25uKSwKKwkJCQkqYml0c19sZWZ0LCBkZXZpY2UtPnJzX3RvdGFsLCBkZXZpY2UtPnJzX2ZhaWxlZCk7CiAJCSpwZXJfbWlsX2RvbmUgPSAwOwogCX0gZWxzZSB7CiAJCS8qIE1ha2Ugc3VyZSB0aGUgZGl2aXNpb24gaGFwcGVucyBpbiBsb25nIGNvbnRleHQuCkBAIC0yMTMzLDkgKzE5MjUsOSBAQAogCQkgKiBOb3RlOiBjdXJyZW50bHkgd2UgZG9uJ3Qgc3VwcG9ydCBzdWNoIGxhcmdlIGJpdG1hcHMgb24gMzJiaXQKIAkJICogYXJjaCBhbnl3YXlzLCBidXQgbm8gaGFybSBkb25lIHRvIGJlIHByZXBhcmVkIGZvciBpdCBoZXJlLgogCQkgKi8KLQkJdW5zaWduZWQgaW50IHNoaWZ0ID0gbWRldi0+cnNfdG90YWwgPiBVSU5UX01BWCA/IDE2IDogMTA7CisJCXVuc2lnbmVkIGludCBzaGlmdCA9IGRldmljZS0+cnNfdG90YWwgPiBVSU5UX01BWCA/IDE2IDogMTA7CiAJCXVuc2lnbmVkIGxvbmcgbGVmdCA9ICpiaXRzX2xlZnQgPj4gc2hpZnQ7Ci0JCXVuc2lnbmVkIGxvbmcgdG90YWwgPSAxVUwgKyAobWRldi0+cnNfdG90YWwgPj4gc2hpZnQpOworCQl1bnNpZ25lZCBsb25nIHRvdGFsID0gMVVMICsgKGRldmljZS0+cnNfdG90YWwgPj4gc2hpZnQpOwogCQl1bnNpZ25lZCBsb25nIHRtcCA9IDEwMDBVTCAtIGxlZnQgKiAxMDAwVUwvdG90YWw7CiAJCSpwZXJfbWlsX2RvbmUgPSB0bXA7CiAJfQpAQCAtMjE0NSwyMiArMTkzNywyMiBAQAogLyogdGhpcyB0aHJvdHRsZXMgb24tdGhlLWZseSBhcHBsaWNhdGlvbiByZXF1ZXN0cwogICogYWNjb3JkaW5nIHRvIG1heF9idWZmZXJzIHNldHRpbmdzOwogICogbWF5YmUgcmUtaW1wbGVtZW50IHVzaW5nIHNlbWFwaG9yZXM/ICovCi1zdGF0aWMgaW5saW5lIGludCBkcmJkX2dldF9tYXhfYnVmZmVycyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSBpbnQgZHJiZF9nZXRfbWF4X2J1ZmZlcnMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAlpbnQgbXhiOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW5jID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZik7CisJbmMgPSByY3VfZGVyZWZlcmVuY2UoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpOwogCW14YiA9IG5jID8gbmMtPm1heF9idWZmZXJzIDogMTAwMDAwMDsgIC8qIGFyYml0cmFyeSBsaW1pdCBvbiBvcGVuIHJlcXVlc3RzICovCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyZXR1cm4gbXhiOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBkcmJkX3N0YXRlX2lzX3N0YWJsZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSBpbnQgZHJiZF9zdGF0ZV9pc19zdGFibGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JdW5pb24gZHJiZF9kZXZfc3RhdGUgcyA9IG1kZXYtPnN0YXRlOworCXVuaW9uIGRyYmRfZGV2X3N0YXRlIHMgPSBkZXZpY2UtPnN0YXRlOwogCiAJLyogRE8gTk9UIGFkZCBhIGRlZmF1bHQgY2xhdXNlLCB3ZSB3YW50IHRoZSBjb21waWxlciB0byB3YXJuIHVzCiAJICogZm9yIGFueSBuZXdseSBpbnRyb2R1Y2VkIHN0YXRlIHdlIG1heSBoYXZlIGZvcmdvdHRlbiB0byBhZGQgaGVyZSAqLwpAQCAtMjE5NCw3ICsxOTg2LDcgQEAKIAogCQkvKiBBbGxvdyBJTyBpbiBCTSBleGNoYW5nZSBzdGF0ZXMgd2l0aCBuZXcgcHJvdG9jb2xzICovCiAJY2FzZSBDX1dGX0JJVE1BUF9TOgotCQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk2KQorCQlpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTYpCiAJCQlyZXR1cm4gMDsKIAkJYnJlYWs7CiAKQEAgLTIyMjgsMjAgKzIwMjAsMjAgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZHJiZF9zdXNwZW5kZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbmxpbmUgaW50IGRyYmRfc3VzcGVuZGVkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IG1kZXYtPnRjb25uOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSA9IGRldmljZS0+cmVzb3VyY2U7CiAKLQlyZXR1cm4gdGNvbm4tPnN1c3AgfHwgdGNvbm4tPnN1c3BfZmVuIHx8IHRjb25uLT5zdXNwX25vZDsKKwlyZXR1cm4gcmVzb3VyY2UtPnN1c3AgfHwgcmVzb3VyY2UtPnN1c3BfZmVuIHx8IHJlc291cmNlLT5zdXNwX25vZDsKIH0KIAotc3RhdGljIGlubGluZSBib29sIG1heV9pbmNfYXBfYmlvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW5saW5lIGJvb2wgbWF5X2luY19hcF9iaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50IG14YiA9IGRyYmRfZ2V0X21heF9idWZmZXJzKG1kZXYpOworCWludCBteGIgPSBkcmJkX2dldF9tYXhfYnVmZmVycyhkZXZpY2UpOwogCi0JaWYgKGRyYmRfc3VzcGVuZGVkKG1kZXYpKQorCWlmIChkcmJkX3N1c3BlbmRlZChkZXZpY2UpKQogCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKHRlc3RfYml0KFNVU1BFTkRfSU8sICZtZGV2LT5mbGFncykpCisJaWYgKHRlc3RfYml0KFNVU1BFTkRfSU8sICZkZXZpY2UtPmZsYWdzKSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJLyogdG8gYXZvaWQgcG90ZW50aWFsIGRlYWRsb2NrIG9yIGJpdG1hcCBjb3JydXB0aW9uLApAQCAtMjI0OSwzMiArMjA0MSwzMiBAQAogCSAqIHRvIHN0YXJ0IGR1cmluZyAic3RhYmxlIiBzdGF0ZXMuICovCiAKIAkvKiBubyBuZXcgaW8gYWNjZXB0ZWQgd2hlbiBhdHRhY2hpbmcgb3IgZGV0YWNoaW5nIHRoZSBkaXNrICovCi0JaWYgKCFkcmJkX3N0YXRlX2lzX3N0YWJsZShtZGV2KSkKKwlpZiAoIWRyYmRfc3RhdGVfaXNfc3RhYmxlKGRldmljZSkpCiAJCXJldHVybiBmYWxzZTsKIAogCS8qIHNpbmNlIHNvbWUgb2xkZXIga2VybmVscyBkb24ndCBoYXZlIGF0b21pY19hZGRfdW5sZXNzLAogCSAqIGFuZCB3ZSBhcmUgd2l0aGluIHRoZSBzcGlubG9jayBhbnl3YXlzLCB3ZSBoYXZlIHRoaXMgd29ya2Fyb3VuZC4gICovCi0JaWYgKGF0b21pY19yZWFkKCZtZGV2LT5hcF9iaW9fY250KSA+IG14YikKKwlpZiAoYXRvbWljX3JlYWQoJmRldmljZS0+YXBfYmlvX2NudCkgPiBteGIpCiAJCXJldHVybiBmYWxzZTsKLQlpZiAodGVzdF9iaXQoQklUTUFQX0lPLCAmbWRldi0+ZmxhZ3MpKQorCWlmICh0ZXN0X2JpdChCSVRNQVBfSU8sICZkZXZpY2UtPmZsYWdzKSkKIAkJcmV0dXJuIGZhbHNlOwogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgaW5jX2FwX2Jpb19jb25kKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW5saW5lIGJvb2wgaW5jX2FwX2Jpb19jb25kKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWJvb2wgcnYgPSBmYWxzZTsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JcnYgPSBtYXlfaW5jX2FwX2JpbyhtZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJcnYgPSBtYXlfaW5jX2FwX2JpbyhkZXZpY2UpOwogCWlmIChydikKLQkJYXRvbWljX2luYygmbWRldi0+YXBfYmlvX2NudCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCQlhdG9taWNfaW5jKCZkZXZpY2UtPmFwX2Jpb19jbnQpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJcmV0dXJuIHJ2OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5jX2FwX2JpbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSB2b2lkIGluY19hcF9iaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJLyogd2Ugd2FpdCBoZXJlCiAJICogICAgYXMgbG9uZyBhcyB0aGUgZGV2aWNlIGlzIHN1c3BlbmRlZApAQCAtMjI4NCw0MiArMjA3Niw0NCBAQAogCSAqIHRvIGF2b2lkIHJhY2VzIHdpdGggdGhlIHJlY29ubmVjdCBjb2RlLAogCSAqIHdlIG5lZWQgdG8gYXRvbWljX2luYyB3aXRoaW4gdGhlIHNwaW5sb2NrLiAqLwogCi0Jd2FpdF9ldmVudChtZGV2LT5taXNjX3dhaXQsIGluY19hcF9iaW9fY29uZChtZGV2KSk7CisJd2FpdF9ldmVudChkZXZpY2UtPm1pc2Nfd2FpdCwgaW5jX2FwX2Jpb19jb25kKGRldmljZSkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGVjX2FwX2JpbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSB2b2lkIGRlY19hcF9iaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50IG14YiA9IGRyYmRfZ2V0X21heF9idWZmZXJzKG1kZXYpOwotCWludCBhcF9iaW8gPSBhdG9taWNfZGVjX3JldHVybigmbWRldi0+YXBfYmlvX2NudCk7CisJaW50IG14YiA9IGRyYmRfZ2V0X21heF9idWZmZXJzKGRldmljZSk7CisJaW50IGFwX2JpbyA9IGF0b21pY19kZWNfcmV0dXJuKCZkZXZpY2UtPmFwX2Jpb19jbnQpOwogCi0JRF9BU1NFUlQoYXBfYmlvID49IDApOworCURfQVNTRVJUKGRldmljZSwgYXBfYmlvID49IDApOwogCi0JaWYgKGFwX2JpbyA9PSAwICYmIHRlc3RfYml0KEJJVE1BUF9JTywgJm1kZXYtPmZsYWdzKSkgewotCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoQklUTUFQX0lPX1FVRVVFRCwgJm1kZXYtPmZsYWdzKSkKLQkJCWRyYmRfcXVldWVfd29yaygmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmbWRldi0+Ym1faW9fd29yay53KTsKKwlpZiAoYXBfYmlvID09IDAgJiYgdGVzdF9iaXQoQklUTUFQX0lPLCAmZGV2aWNlLT5mbGFncykpIHsKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEJJVE1BUF9JT19RVUVVRUQsICZkZXZpY2UtPmZsYWdzKSkKKwkJCWRyYmRfcXVldWVfd29yaygmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+CisJCQkJY29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkJJmRldmljZS0+Ym1faW9fd29yay53KTsKIAl9CiAKIAkvKiB0aGlzIGN1cnJlbnRseSBkb2VzIHdha2VfdXAgZm9yIGV2ZXJ5IGRlY19hcF9iaW8hCiAJICogbWF5YmUgcmF0aGVyIGludHJvZHVjZSBzb21lIHR5cGUgb2YgaHlzdGVyZXNpcz8KIAkgKiBlLmcuIChhcF9iaW8gPT0gbXhiLzIgfHwgYXBfYmlvID09IDApID8gKi8KIAlpZiAoYXBfYmlvIDwgbXhiKQotCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCQl3YWtlX3VwKCZkZXZpY2UtPm1pc2Nfd2FpdCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCB2ZXJpZnlfY2FuX2RvX3N0b3Bfc2VjdG9yKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW5saW5lIGJvb2wgdmVyaWZ5X2Nhbl9kb19zdG9wX3NlY3RvcihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlyZXR1cm4gbWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA5NyAmJgotCQltZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uICE9IDEwMDsKKwlyZXR1cm4gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDk3ICYmCisJCWZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiAhPSAxMDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRyYmRfc2V0X2VkX3V1aWQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdTY0IHZhbCkKK3N0YXRpYyBpbmxpbmUgaW50IGRyYmRfc2V0X2VkX3V1aWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHU2NCB2YWwpCiB7Ci0JaW50IGNoYW5nZWQgPSBtZGV2LT5lZF91dWlkICE9IHZhbDsKLQltZGV2LT5lZF91dWlkID0gdmFsOworCWludCBjaGFuZ2VkID0gZGV2aWNlLT5lZF91dWlkICE9IHZhbDsKKwlkZXZpY2UtPmVkX3V1aWQgPSB2YWw7CiAJcmV0dXJuIGNoYW5nZWQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRyYmRfcXVldWVfb3JkZXJfdHlwZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSBpbnQgZHJiZF9xdWV1ZV9vcmRlcl90eXBlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCS8qIHNvcnJ5LCB3ZSBjdXJyZW50bHkgaGF2ZSBubyB3b3JraW5nIGltcGxlbWVudGF0aW9uCiAJICogb2YgZGlzdHJpYnV0ZWQgVENRIHN0dWZmICovCkBAIC0yMzI5LDIzICsyMTIzLDI5IEBACiAJcmV0dXJuIFFVRVVFX09SREVSRURfTk9ORTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGRyYmRfbWRfZmx1c2goc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcmJkX21kX2ZsdXNoKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWludCByOwogCi0JaWYgKG1kZXYtPmxkZXYgPT0gTlVMTCkgewotCQlkZXZfd2FybihERVYsICJtZGV2LT5sZGV2ID09IE5VTEwgaW4gZHJiZF9tZF9mbHVzaFxuIik7CisJaWYgKGRldmljZS0+bGRldiA9PSBOVUxMKSB7CisJCWRyYmRfd2FybihkZXZpY2UsICJkZXZpY2UtPmxkZXYgPT0gTlVMTCBpbiBkcmJkX21kX2ZsdXNoXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmICh0ZXN0X2JpdChNRF9OT19GVUEsICZtZGV2LT5mbGFncykpCisJaWYgKHRlc3RfYml0KE1EX05PX0ZVQSwgJmRldmljZS0+ZmxhZ3MpKQogCQlyZXR1cm47CiAKLQlyID0gYmxrZGV2X2lzc3VlX2ZsdXNoKG1kZXYtPmxkZXYtPm1kX2JkZXYsIEdGUF9OT0lPLCBOVUxMKTsKKwlyID0gYmxrZGV2X2lzc3VlX2ZsdXNoKGRldmljZS0+bGRldi0+bWRfYmRldiwgR0ZQX05PSU8sIE5VTEwpOwogCWlmIChyKSB7Ci0JCXNldF9iaXQoTURfTk9fRlVBLCAmbWRldi0+ZmxhZ3MpOwotCQlkZXZfZXJyKERFViwgIm1ldGEgZGF0YSBmbHVzaCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQsIGRpc2FibGluZyBtZC1mbHVzaGVzXG4iLCByKTsKKwkJc2V0X2JpdChNRF9OT19GVUEsICZkZXZpY2UtPmZsYWdzKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAibWV0YSBkYXRhIGZsdXNoIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCwgZGlzYWJsaW5nIG1kLWZsdXNoZXNcbiIsIHIpOwogCX0KIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpmaXJzdF9jb25uZWN0aW9uKHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSkKK3sKKwlyZXR1cm4gbGlzdF9maXJzdF9lbnRyeSgmcmVzb3VyY2UtPmNvbm5lY3Rpb25zLAorCQkJCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24sIGNvbm5lY3Rpb25zKTsKK30KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9tYWluLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9tYWluLmMKaW5kZXggOTI5NDY4ZS4uMzMxZTVjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfbWFpbi5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX21haW4uYwpAQCAtNTIsMTYgKzUyLDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC9kcmJkX2xpbWl0cy5oPgogI2luY2x1ZGUgImRyYmRfaW50LmgiCisjaW5jbHVkZSAiZHJiZF9wcm90b2NvbC5oIgogI2luY2x1ZGUgImRyYmRfcmVxLmgiIC8qIG9ubHkgZm9yIF9yZXFfbW9kIGluIHRsX3JlbGVhc2UgYW5kIHRsX2NsZWFyICovCiAKICNpbmNsdWRlICJkcmJkX3ZsaS5oIgogCiBzdGF0aWMgREVGSU5FX01VVEVYKGRyYmRfbWFpbl9tdXRleCk7Ci1pbnQgZHJiZGRfaW5pdChzdHJ1Y3QgZHJiZF90aHJlYWQgKik7Ci1pbnQgZHJiZF93b3JrZXIoc3RydWN0IGRyYmRfdGhyZWFkICopOwotaW50IGRyYmRfYXNlbmRlcihzdHJ1Y3QgZHJiZF90aHJlYWQgKik7Ci0KLWludCBkcmJkX2luaXQodm9pZCk7CiBzdGF0aWMgaW50IGRyYmRfb3BlbihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUpOwogc3RhdGljIHZvaWQgZHJiZF9yZWxlYXNlKHN0cnVjdCBnZW5kaXNrICpnZCwgZm1vZGVfdCBtb2RlKTsKIHN0YXRpYyBpbnQgd19tZF9zeW5jKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCB1bnVzZWQpOwpAQCAtMTE4LDggKzExNCw4IEBACiAvKiBpbiAyLjYueCwgb3VyIGRldmljZSBtYXBwaW5nIGFuZCBjb25maWcgaW5mbyBjb250YWlucyBvdXIgdmlydHVhbCBnZW5kaXNrcwogICogYXMgbWVtYmVyICJzdHJ1Y3QgZ2VuZGlzayAqdmRpc2s7IgogICovCi1zdHJ1Y3QgaWRyIG1pbm9yczsKLXN0cnVjdCBsaXN0X2hlYWQgZHJiZF90Y29ubnM7ICAvKiBsaXN0IG9mIHN0cnVjdCBkcmJkX3Rjb25uICovCitzdHJ1Y3QgaWRyIGRyYmRfZGV2aWNlczsKK3N0cnVjdCBsaXN0X2hlYWQgZHJiZF9yZXNvdXJjZXM7CiAKIHN0cnVjdCBrbWVtX2NhY2hlICpkcmJkX3JlcXVlc3RfY2FjaGU7CiBzdHJ1Y3Qga21lbV9jYWNoZSAqZHJiZF9lZV9jYWNoZTsJLyogcGVlciByZXF1ZXN0cyAqLwpAQCAtMTY2LDE1ICsxNjIsMTUgQEAKIC8qIFdoZW4gY2hlY2tpbmcgd2l0aCBzcGFyc2UsIGFuZCB0aGlzIGlzIGFuIGlubGluZSBmdW5jdGlvbiwgc3BhcnNlIHdpbGwKICAgIGdpdmUgdG9ucyBvZiBmYWxzZSBwb3NpdGl2ZXMuIFdoZW4gdGhpcyBpcyBhIHJlYWwgZnVuY3Rpb25zIHNwYXJzZSB3b3Jrcy4KICAqLwotaW50IF9nZXRfbGRldl9pZl9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBlbnVtIGRyYmRfZGlza19zdGF0ZSBtaW5zKQoraW50IF9nZXRfbGRldl9pZl9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgZW51bSBkcmJkX2Rpc2tfc3RhdGUgbWlucykKIHsKIAlpbnQgaW9fYWxsb3dlZDsKIAotCWF0b21pY19pbmMoJm1kZXYtPmxvY2FsX2NudCk7Ci0JaW9fYWxsb3dlZCA9IChtZGV2LT5zdGF0ZS5kaXNrID49IG1pbnMpOworCWF0b21pY19pbmMoJmRldmljZS0+bG9jYWxfY250KTsKKwlpb19hbGxvd2VkID0gKGRldmljZS0+c3RhdGUuZGlzayA+PSBtaW5zKTsKIAlpZiAoIWlvX2FsbG93ZWQpIHsKLQkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJm1kZXYtPmxvY2FsX2NudCkpCi0JCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZGV2aWNlLT5sb2NhbF9jbnQpKQorCQkJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOwogCX0KIAlyZXR1cm4gaW9fYWxsb3dlZDsKIH0KQEAgLTE4Myw3ICsxNzksNyBAQAogCiAvKioKICAqIHRsX3JlbGVhc2UoKSAtIG1hcmsgYXMgQkFSUklFUl9BQ0tFRCBhbGwgcmVxdWVzdHMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgdHJhbnNmZXIgbG9nIGVwb2NoCi0gKiBAdGNvbm46CURSQkQgY29ubmVjdGlvbi4KKyAqIEBjb25uZWN0aW9uOglEUkJEIGNvbm5lY3Rpb24uCiAgKiBAYmFycmllcl9ucjoJRXhwZWN0ZWQgaWRlbnRpZmllciBvZiB0aGUgRFJCRCB3cml0ZSBiYXJyaWVyIHBhY2tldC4KICAqIEBzZXRfc2l6ZToJRXhwZWN0ZWQgbnVtYmVyIG9mIHJlcXVlc3RzIGJlZm9yZSB0aGF0IGJhcnJpZXIuCiAgKgpAQCAtMTkxLDcgKzE4Nyw3IEBACiAgKiBlcG9jaCBvZiBub3QgeWV0IGJhcnJpZXItYWNrZWQgcmVxdWVzdHMsIHRoaXMgZnVuY3Rpb24gd2lsbCBjYXVzZSBhCiAgKiB0ZXJtaW5hdGlvbiBvZiB0aGUgY29ubmVjdGlvbi4KICAqLwotdm9pZCB0bF9yZWxlYXNlKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgdW5zaWduZWQgaW50IGJhcnJpZXJfbnIsCit2b2lkIHRsX3JlbGVhc2Uoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdW5zaWduZWQgaW50IGJhcnJpZXJfbnIsCiAJCXVuc2lnbmVkIGludCBzZXRfc2l6ZSkKIHsKIAlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyOwpAQCAtMTk5LDExICsxOTUsMTEgQEAKIAlpbnQgZXhwZWN0X2Vwb2NoID0gMDsKIAlpbnQgZXhwZWN0X3NpemUgPSAwOwogCi0Jc3Bpbl9sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJLyogZmluZCBvbGRlc3Qgbm90IHlldCBiYXJyaWVyLWFja2VkIHdyaXRlIHJlcXVlc3QsCiAJICogY291bnQgd3JpdGVzIGluIGl0cyBlcG9jaC4gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHIsICZ0Y29ubi0+dHJhbnNmZXJfbG9nLCB0bF9yZXF1ZXN0cykgeworCWxpc3RfZm9yX2VhY2hfZW50cnkociwgJmNvbm5lY3Rpb24tPnRyYW5zZmVyX2xvZywgdGxfcmVxdWVzdHMpIHsKIAkJY29uc3QgdW5zaWduZWQgcyA9IHItPnJxX3N0YXRlOwogCQlpZiAoIXJlcSkgewogCQkJaWYgKCEocyAmIFJRX1dSSVRFKSkKQEAgLTIyOCwxOCArMjI0LDE4IEBACiAKIAkvKiBmaXJzdCBzb21lIHBhcmFub2lhIGNvZGUgKi8KIAlpZiAocmVxID09IE5VTEwpIHsKLQkJY29ubl9lcnIodGNvbm4sICJCQUQhIEJhcnJpZXJBY2sgIyV1IHJlY2VpdmVkLCBidXQgbm8gZXBvY2ggaW4gdGwhP1xuIiwKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIkJBRCEgQmFycmllckFjayAjJXUgcmVjZWl2ZWQsIGJ1dCBubyBlcG9jaCBpbiB0bCE/XG4iLAogCQkJIGJhcnJpZXJfbnIpOwogCQlnb3RvIGJhaWw7CiAJfQogCWlmIChleHBlY3RfZXBvY2ggIT0gYmFycmllcl9ucikgewotCQljb25uX2Vycih0Y29ubiwgIkJBRCEgQmFycmllckFjayAjJXUgcmVjZWl2ZWQsIGV4cGVjdGVkICMldSFcbiIsCisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJCQUQhIEJhcnJpZXJBY2sgIyV1IHJlY2VpdmVkLCBleHBlY3RlZCAjJXUhXG4iLAogCQkJIGJhcnJpZXJfbnIsIGV4cGVjdF9lcG9jaCk7CiAJCWdvdG8gYmFpbDsKIAl9CiAKIAlpZiAoZXhwZWN0X3NpemUgIT0gc2V0X3NpemUpIHsKLQkJY29ubl9lcnIodGNvbm4sICJCQUQhIEJhcnJpZXJBY2sgIyV1IHJlY2VpdmVkIHdpdGggbl93cml0ZXM9JXUsIGV4cGVjdGVkIG5fd3JpdGVzPSV1IVxuIiwKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIkJBRCEgQmFycmllckFjayAjJXUgcmVjZWl2ZWQgd2l0aCBuX3dyaXRlcz0ldSwgZXhwZWN0ZWQgbl93cml0ZXM9JXUhXG4iLAogCQkJIGJhcnJpZXJfbnIsIHNldF9zaXplLCBleHBlY3Rfc2l6ZSk7CiAJCWdvdG8gYmFpbDsKIAl9CkBAIC0yNDgsOTAgKzI0NCw5MSBAQAogCS8qIHRoaXMgZXh0cmEgbGlzdCB3YWxrIHJlc3RhcnQgaXMgcGFyYW5vaWEsCiAJICogdG8gY2F0Y2ggcmVxdWVzdHMgYmVpbmcgYmFycmllci1hY2tlZCAidW5leHBlY3RlZGx5Ii4KIAkgKiBJdCB1c3VhbGx5IHNob3VsZCBmaW5kIHRoZSBzYW1lIHJlcSBhZ2Fpbiwgb3Igc29tZSBSRUFEIHByZWNlZGluZyBpdC4gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcSwgJnRjb25uLT50cmFuc2Zlcl9sb2csIHRsX3JlcXVlc3RzKQorCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxLCAmY29ubmVjdGlvbi0+dHJhbnNmZXJfbG9nLCB0bF9yZXF1ZXN0cykKIAkJaWYgKHJlcS0+ZXBvY2ggPT0gZXhwZWN0X2Vwb2NoKQogCQkJYnJlYWs7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX2Zyb20ocmVxLCByLCAmdGNvbm4tPnRyYW5zZmVyX2xvZywgdGxfcmVxdWVzdHMpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfZnJvbShyZXEsIHIsICZjb25uZWN0aW9uLT50cmFuc2Zlcl9sb2csIHRsX3JlcXVlc3RzKSB7CiAJCWlmIChyZXEtPmVwb2NoICE9IGV4cGVjdF9lcG9jaCkKIAkJCWJyZWFrOwogCQlfcmVxX21vZChyZXEsIEJBUlJJRVJfQUNLRUQpOwogCX0KLQlzcGluX3VubG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJcmV0dXJuOwogCiBiYWlsOgotCXNwaW5fdW5sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKLQljb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TKGNvbm4sIENfUFJPVE9DT0xfRVJST1IpLCBDU19IQVJEKTsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CisJY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfUFJPVE9DT0xfRVJST1IpLCBDU19IQVJEKTsKIH0KIAogCiAvKioKICAqIF90bF9yZXN0YXJ0KCkgLSBXYWxrcyB0aGUgdHJhbnNmZXIgbG9nLCBhbmQgYXBwbGllcyBhbiBhY3Rpb24gdG8gYWxsIHJlcXVlc3RzCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEB3aGF0OiAgICAgICBUaGUgYWN0aW9uL2V2ZW50IHRvIHBlcmZvcm0gd2l0aCBhbGwgcmVxdWVzdCBvYmplY3RzCiAgKgogICogQHdoYXQgbWlnaHQgYmUgb25lIG9mIENPTk5FQ1RJT05fTE9TVF9XSElMRV9QRU5ESU5HLCBSRVNFTkQsIEZBSUxfRlJPWkVOX0RJU0tfSU8sCiAgKiBSRVNUQVJUX0ZST1pFTl9ESVNLX0lPLgogICovCiAvKiBtdXN0IGhvbGQgcmVzb3VyY2UtPnJlcV9sb2NrICovCi12b2lkIF90bF9yZXN0YXJ0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgZW51bSBkcmJkX3JlcV9ldmVudCB3aGF0KQordm9pZCBfdGxfcmVzdGFydChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBlbnVtIGRyYmRfcmVxX2V2ZW50IHdoYXQpCiB7CiAJc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxLCAqcjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHIsICZ0Y29ubi0+dHJhbnNmZXJfbG9nLCB0bF9yZXF1ZXN0cykKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCByLCAmY29ubmVjdGlvbi0+dHJhbnNmZXJfbG9nLCB0bF9yZXF1ZXN0cykKIAkJX3JlcV9tb2QocmVxLCB3aGF0KTsKIH0KIAotdm9pZCB0bF9yZXN0YXJ0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgZW51bSBkcmJkX3JlcV9ldmVudCB3aGF0KQordm9pZCB0bF9yZXN0YXJ0KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCkKIHsKLQlzcGluX2xvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCV90bF9yZXN0YXJ0KHRjb25uLCB3aGF0KTsKLQlzcGluX3VubG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlfdGxfcmVzdGFydChjb25uZWN0aW9uLCB3aGF0KTsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiB9CiAKIC8qKgogICogdGxfY2xlYXIoKSAtIENsZWFycyBhbGwgcmVxdWVzdHMgYW5kICZzdHJ1Y3QgZHJiZF90bF9lcG9jaCBvYmplY3RzIG91dCBvZiB0aGUgVEwKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBwZWVyIHdhcyBsb3N0LiBUaGUgc3RvcmFnZSBjb3ZlcmVkCiAgKiBieSB0aGUgcmVxdWVzdHMgb24gdGhlIHRyYW5zZmVyIGdldHMgbWFya2VkIGFzIG91ciBvZiBzeW5jLiBDYWxsZWQgZnJvbSB0aGUKICAqIHJlY2VpdmVyIHRocmVhZCBhbmQgdGhlIHdvcmtlciB0aHJlYWQuCiAgKi8KLXZvaWQgdGxfY2xlYXIoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQordm9pZCB0bF9jbGVhcihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCXRsX3Jlc3RhcnQodGNvbm4sIENPTk5FQ1RJT05fTE9TVF9XSElMRV9QRU5ESU5HKTsKKwl0bF9yZXN0YXJ0KGNvbm5lY3Rpb24sIENPTk5FQ1RJT05fTE9TVF9XSElMRV9QRU5ESU5HKTsKIH0KIAogLyoqCi0gKiB0bF9hYm9ydF9kaXNrX2lvKCkgLSBBYm9ydCBkaXNrIEkvTyBmb3IgYWxsIHJlcXVlc3RzIGZvciBhIGNlcnRhaW4gbWRldiBpbiB0aGUgVEwKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIHRsX2Fib3J0X2Rpc2tfaW8oKSAtIEFib3J0IGRpc2sgSS9PIGZvciBhbGwgcmVxdWVzdHMgZm9yIGEgY2VydGFpbiBkZXZpY2UgaW4gdGhlIFRMCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqLwotdm9pZCB0bF9hYm9ydF9kaXNrX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkIHRsX2Fib3J0X2Rpc2tfaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uID0gbWRldi0+dGNvbm47CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb247CiAJc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxLCAqcjsKIAotCXNwaW5fbG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgciwgJnRjb25uLT50cmFuc2Zlcl9sb2csIHRsX3JlcXVlc3RzKSB7CisJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCByLCAmY29ubmVjdGlvbi0+dHJhbnNmZXJfbG9nLCB0bF9yZXF1ZXN0cykgewogCQlpZiAoIShyZXEtPnJxX3N0YXRlICYgUlFfTE9DQUxfUEVORElORykpCiAJCQljb250aW51ZTsKLQkJaWYgKHJlcS0+dy5tZGV2ICE9IG1kZXYpCisJCWlmIChyZXEtPmRldmljZSAhPSBkZXZpY2UpCiAJCQljb250aW51ZTsKIAkJX3JlcV9tb2QocmVxLCBBQk9SVF9ESVNLX0lPKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIH0KIAogc3RhdGljIGludCBkcmJkX3RocmVhZF9zZXR1cCh2b2lkICphcmcpCiB7CiAJc3RydWN0IGRyYmRfdGhyZWFkICp0aGkgPSAoc3RydWN0IGRyYmRfdGhyZWFkICopIGFyZzsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSB0aGktPnRjb25uOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSA9IHRoaS0+cmVzb3VyY2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0dmFsOwogCiAJc25wcmludGYoY3VycmVudC0+Y29tbSwgc2l6ZW9mKGN1cnJlbnQtPmNvbW0pLCAiZHJiZF8lY18lcyIsCi0JCSB0aGktPm5hbWVbMF0sIHRoaS0+dGNvbm4tPm5hbWUpOworCQkgdGhpLT5uYW1lWzBdLAorCQkgcmVzb3VyY2UtPm5hbWUpOwogCiByZXN0YXJ0OgogCXJldHZhbCA9IHRoaS0+ZnVuY3Rpb24odGhpKTsKQEAgLTM0OSw3ICszNDYsNyBAQAogCSAqLwogCiAJaWYgKHRoaS0+dF9zdGF0ZSA9PSBSRVNUQVJUSU5HKSB7Ci0JCWNvbm5faW5mbyh0Y29ubiwgIlJlc3RhcnRpbmcgJXMgdGhyZWFkXG4iLCB0aGktPm5hbWUpOworCQlkcmJkX2luZm8ocmVzb3VyY2UsICJSZXN0YXJ0aW5nICVzIHRocmVhZFxuIiwgdGhpLT5uYW1lKTsKIAkJdGhpLT50X3N0YXRlID0gUlVOTklORzsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpLT50X2xvY2ssIGZsYWdzKTsKIAkJZ290byByZXN0YXJ0OwpAQCAtMzYxLDI5ICszNTgsMzIgQEAKIAljb21wbGV0ZV9hbGwoJnRoaS0+c3RvcCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpLT50X2xvY2ssIGZsYWdzKTsKIAotCWNvbm5faW5mbyh0Y29ubiwgIlRlcm1pbmF0aW5nICVzXG4iLCBjdXJyZW50LT5jb21tKTsKKwlkcmJkX2luZm8ocmVzb3VyY2UsICJUZXJtaW5hdGluZyAlc1xuIiwgY3VycmVudC0+Y29tbSk7CiAKIAkvKiBSZWxlYXNlIG1vZCByZWZlcmVuY2UgdGFrZW4gd2hlbiB0aHJlYWQgd2FzIHN0YXJ0ZWQgKi8KIAotCWtyZWZfcHV0KCZ0Y29ubi0+a3JlZiwgJmNvbm5fZGVzdHJveSk7CisJaWYgKHRoaS0+Y29ubmVjdGlvbikKKwkJa3JlZl9wdXQoJnRoaS0+Y29ubmVjdGlvbi0+a3JlZiwgZHJiZF9kZXN0cm95X2Nvbm5lY3Rpb24pOworCWtyZWZfcHV0KCZyZXNvdXJjZS0+a3JlZiwgZHJiZF9kZXN0cm95X3Jlc291cmNlKTsKIAltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgdm9pZCBkcmJkX3RocmVhZF9pbml0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IGRyYmRfdGhyZWFkICp0aGksCi0JCQkgICAgIGludCAoKmZ1bmMpIChzdHJ1Y3QgZHJiZF90aHJlYWQgKiksIGNoYXIgKm5hbWUpCitzdGF0aWMgdm9pZCBkcmJkX3RocmVhZF9pbml0KHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSwgc3RydWN0IGRyYmRfdGhyZWFkICp0aGksCisJCQkgICAgIGludCAoKmZ1bmMpIChzdHJ1Y3QgZHJiZF90aHJlYWQgKiksIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3Bpbl9sb2NrX2luaXQoJnRoaS0+dF9sb2NrKTsKIAl0aGktPnRhc2sgICAgPSBOVUxMOwogCXRoaS0+dF9zdGF0ZSA9IE5PTkU7CiAJdGhpLT5mdW5jdGlvbiA9IGZ1bmM7Ci0JdGhpLT50Y29ubiA9IHRjb25uOwotCXN0cm5jcHkodGhpLT5uYW1lLCBuYW1lLCBBUlJBWV9TSVpFKHRoaS0+bmFtZSkpOworCXRoaS0+cmVzb3VyY2UgPSByZXNvdXJjZTsKKwl0aGktPmNvbm5lY3Rpb24gPSBOVUxMOworCXRoaS0+bmFtZSA9IG5hbWU7CiB9CiAKIGludCBkcmJkX3RocmVhZF9zdGFydChzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSkKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSB0aGktPnRjb25uOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSA9IHRoaS0+cmVzb3VyY2U7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpudDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0zOTMsMTcgKzM5MywxOSBAQAogCiAJc3dpdGNoICh0aGktPnRfc3RhdGUpIHsKIAljYXNlIE5PTkU6Ci0JCWNvbm5faW5mbyh0Y29ubiwgIlN0YXJ0aW5nICVzIHRocmVhZCAoZnJvbSAlcyBbJWRdKVxuIiwKKwkJZHJiZF9pbmZvKHJlc291cmNlLCAiU3RhcnRpbmcgJXMgdGhyZWFkIChmcm9tICVzIFslZF0pXG4iLAogCQkJIHRoaS0+bmFtZSwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkKTsKIAogCQkvKiBHZXQgcmVmIG9uIG1vZHVsZSBmb3IgdGhyZWFkIC0gdGhpcyBpcyByZWxlYXNlZCB3aGVuIHRocmVhZCBleGl0cyAqLwogCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkgewotCQkJY29ubl9lcnIodGNvbm4sICJGYWlsZWQgdG8gZ2V0IG1vZHVsZSByZWZlcmVuY2UgaW4gZHJiZF90aHJlYWRfc3RhcnRcbiIpOworCQkJZHJiZF9lcnIocmVzb3VyY2UsICJGYWlsZWQgdG8gZ2V0IG1vZHVsZSByZWZlcmVuY2UgaW4gZHJiZF90aHJlYWRfc3RhcnRcbiIpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpLT50X2xvY2ssIGZsYWdzKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCi0JCWtyZWZfZ2V0KCZ0aGktPnRjb25uLT5rcmVmKTsKKwkJa3JlZl9nZXQoJnJlc291cmNlLT5rcmVmKTsKKwkJaWYgKHRoaS0+Y29ubmVjdGlvbikKKwkJCWtyZWZfZ2V0KCZ0aGktPmNvbm5lY3Rpb24tPmtyZWYpOwogCiAJCWluaXRfY29tcGxldGlvbigmdGhpLT5zdG9wKTsKIAkJdGhpLT5yZXNldF9jcHVfbWFzayA9IDE7CkBAIC00MTIsMTIgKzQxNCwxNCBAQAogCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOyAvKiBvdGhlcncuIG1heSBnZXQgLUVSRVNUQVJUTk9JTlRSICovCiAKIAkJbnQgPSBrdGhyZWFkX2NyZWF0ZShkcmJkX3RocmVhZF9zZXR1cCwgKHZvaWQgKikgdGhpLAotCQkJCSAgICAiZHJiZF8lY18lcyIsIHRoaS0+bmFtZVswXSwgdGhpLT50Y29ubi0+bmFtZSk7CisJCQkJICAgICJkcmJkXyVjXyVzIiwgdGhpLT5uYW1lWzBdLCB0aGktPnJlc291cmNlLT5uYW1lKTsKIAogCQlpZiAoSVNfRVJSKG50KSkgewotCQkJY29ubl9lcnIodGNvbm4sICJDb3VsZG4ndCBzdGFydCB0aHJlYWRcbiIpOworCQkJZHJiZF9lcnIocmVzb3VyY2UsICJDb3VsZG4ndCBzdGFydCB0aHJlYWRcbiIpOwogCi0JCQlrcmVmX3B1dCgmdGNvbm4tPmtyZWYsICZjb25uX2Rlc3Ryb3kpOworCQkJaWYgKHRoaS0+Y29ubmVjdGlvbikKKwkJCQlrcmVmX3B1dCgmdGhpLT5jb25uZWN0aW9uLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfY29ubmVjdGlvbik7CisJCQlrcmVmX3B1dCgmcmVzb3VyY2UtPmtyZWYsIGRyYmRfZGVzdHJveV9yZXNvdXJjZSk7CiAJCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQpAQCAtNDI5LDcgKzQzMyw3IEBACiAJCWJyZWFrOwogCWNhc2UgRVhJVElORzoKIAkJdGhpLT50X3N0YXRlID0gUkVTVEFSVElORzsKLQkJY29ubl9pbmZvKHRjb25uLCAiUmVzdGFydGluZyAlcyB0aHJlYWQgKGZyb20gJXMgWyVkXSlcbiIsCisJCWRyYmRfaW5mbyhyZXNvdXJjZSwgIlJlc3RhcnRpbmcgJXMgdGhyZWFkIChmcm9tICVzIFslZF0pXG4iLAogCQkJCXRoaS0+bmFtZSwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkKTsKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBSVU5OSU5HOgpAQCAtNDc4LDY1ICs0ODIsNjAgQEAKIAkJd2FpdF9mb3JfY29tcGxldGlvbigmdGhpLT5zdG9wKTsKIH0KIAotc3RhdGljIHN0cnVjdCBkcmJkX3RocmVhZCAqZHJiZF90YXNrX3RvX3RocmVhZChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK2ludCBjb25uX2xvd2VzdF9taW5vcihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCXN0cnVjdCBkcmJkX3RocmVhZCAqdGhpID0KLQkJdGFzayA9PSB0Y29ubi0+cmVjZWl2ZXIudGFzayA/ICZ0Y29ubi0+cmVjZWl2ZXIgOgotCQl0YXNrID09IHRjb25uLT5hc2VuZGVyLnRhc2sgID8gJnRjb25uLT5hc2VuZGVyIDoKLQkJdGFzayA9PSB0Y29ubi0+d29ya2VyLnRhc2sgICA/ICZ0Y29ubi0+d29ya2VyIDogTlVMTDsKLQotCXJldHVybiB0aGk7Ci19Ci0KLWNoYXIgKmRyYmRfdGFza190b190aHJlYWRfbmFtZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKLXsKLQlzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSA9IGRyYmRfdGFza190b190aHJlYWQodGNvbm4sIHRhc2spOwotCXJldHVybiB0aGkgPyB0aGktPm5hbWUgOiB0YXNrLT5jb21tOwotfQotCi1pbnQgY29ubl9sb3dlc3RfbWlub3Ioc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQotewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7Ci0JaW50IHZuciA9IDAsIG07CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCWludCB2bnIgPSAwLCBtaW5vciA9IC0xOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW1kZXYgPSBpZHJfZ2V0X25leHQoJnRjb25uLT52b2x1bWVzLCAmdm5yKTsKLQltID0gbWRldiA/IG1kZXZfdG9fbWlub3IobWRldikgOiAtMTsKKwlwZWVyX2RldmljZSA9IGlkcl9nZXRfbmV4dCgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCAmdm5yKTsKKwlpZiAocGVlcl9kZXZpY2UpCisJCW1pbm9yID0gZGV2aWNlX3RvX21pbm9yKHBlZXJfZGV2aWNlLT5kZXZpY2UpOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JcmV0dXJuIG07CisJcmV0dXJuIG1pbm9yOwogfQogCiAjaWZkZWYgQ09ORklHX1NNUAogLyoqCiAgKiBkcmJkX2NhbGNfY3B1X21hc2soKSAtIEdlbmVyYXRlIENQVSBtYXNrcywgc3ByZWFkIG92ZXIgYWxsIENQVXMKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KICAqCi0gKiBGb3JjZXMgYWxsIHRocmVhZHMgb2YgYSBkZXZpY2Ugb250byB0aGUgc2FtZSBDUFUuIFRoaXMgaXMgYmVuZWZpY2lhbCBmb3IKKyAqIEZvcmNlcyBhbGwgdGhyZWFkcyBvZiBhIHJlc291cmNlIG9udG8gdGhlIHNhbWUgQ1BVLiBUaGlzIGlzIGJlbmVmaWNpYWwgZm9yCiAgKiBEUkJEJ3MgcGVyZm9ybWFuY2UuIE1heSBiZSBvdmVyd3JpdHRlbiBieSB1c2VyJ3MgY29uZmlndXJhdGlvbi4KICAqLwotdm9pZCBkcmJkX2NhbGNfY3B1X21hc2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIHZvaWQgZHJiZF9jYWxjX2NwdV9tYXNrKGNwdW1hc2tfdmFyX3QgKmNwdV9tYXNrKQogewotCWludCBvcmQsIGNwdTsKKwl1bnNpZ25lZCBpbnQgKnJlc291cmNlc19wZXJfY3B1LCBtaW5faW5kZXggPSB+MDsKIAotCS8qIHVzZXIgb3ZlcnJpZGUuICovCi0JaWYgKGNwdW1hc2tfd2VpZ2h0KHRjb25uLT5jcHVfbWFzaykpCi0JCXJldHVybjsKKwlyZXNvdXJjZXNfcGVyX2NwdSA9IGt6YWxsb2MobnJfY3B1X2lkcyAqIHNpemVvZigqcmVzb3VyY2VzX3Blcl9jcHUpLCBHRlBfS0VSTkVMKTsKKwlpZiAocmVzb3VyY2VzX3Blcl9jcHUpIHsKKwkJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlOworCQl1bnNpZ25lZCBpbnQgY3B1LCBtaW4gPSB+MDsKIAotCW9yZCA9IGNvbm5fbG93ZXN0X21pbm9yKHRjb25uKSAlIGNwdW1hc2tfd2VpZ2h0KGNwdV9vbmxpbmVfbWFzayk7Ci0JZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJaWYgKG9yZC0tID09IDApIHsKLQkJCWNwdW1hc2tfc2V0X2NwdShjcHUsIHRjb25uLT5jcHVfbWFzayk7Ci0JCQlyZXR1cm47CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJZm9yX2VhY2hfcmVzb3VyY2VfcmN1KHJlc291cmNlLCAmZHJiZF9yZXNvdXJjZXMpIHsKKwkJCWZvcl9lYWNoX2NwdShjcHUsIHJlc291cmNlLT5jcHVfbWFzaykKKwkJCQlyZXNvdXJjZXNfcGVyX2NwdVtjcHVdKys7CiAJCX0KKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCQlpZiAocmVzb3VyY2VzX3Blcl9jcHVbY3B1XSA8IG1pbikgeworCQkJCW1pbiA9IHJlc291cmNlc19wZXJfY3B1W2NwdV07CisJCQkJbWluX2luZGV4ID0gY3B1OworCQkJfQorCQl9CisJCWtmcmVlKHJlc291cmNlc19wZXJfY3B1KTsKIAl9Ci0JLyogc2hvdWxkIG5vdCBiZSByZWFjaGVkICovCi0JY3B1bWFza19zZXRhbGwodGNvbm4tPmNwdV9tYXNrKTsKKwlpZiAobWluX2luZGV4ID09IH4wKSB7CisJCWNwdW1hc2tfc2V0YWxsKCpjcHVfbWFzayk7CisJCXJldHVybjsKKwl9CisJY3B1bWFza19zZXRfY3B1KG1pbl9pbmRleCwgKmNwdV9tYXNrKTsKIH0KIAogLyoqCiAgKiBkcmJkX3RocmVhZF9jdXJyZW50X3NldF9jcHUoKSAtIG1vZGlmaWVzIHRoZSBjcHUgbWFzayBvZiB0aGUgX2N1cnJlbnRfIHRocmVhZAotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAdGhpOglkcmJkX3RocmVhZCBvYmplY3QKICAqCiAgKiBjYWxsIGluIHRoZSAibWFpbiBsb29wIiBvZiBfYWxsXyB0aHJlYWRzLCBubyBuZWVkIGZvciBhbnkgbXV0ZXgsIGN1cnJlbnQgd29uJ3QgZGllCkBAIC01NDQsMTMgKzU0MywxNiBAQAogICovCiB2b2lkIGRyYmRfdGhyZWFkX2N1cnJlbnRfc2V0X2NwdShzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSkKIHsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2UgPSB0aGktPnJlc291cmNlOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCA9IGN1cnJlbnQ7CiAKIAlpZiAoIXRoaS0+cmVzZXRfY3B1X21hc2spCiAJCXJldHVybjsKIAl0aGktPnJlc2V0X2NwdV9tYXNrID0gMDsKLQlzZXRfY3B1c19hbGxvd2VkX3B0cihwLCB0aGktPnRjb25uLT5jcHVfbWFzayk7CisJc2V0X2NwdXNfYWxsb3dlZF9wdHIocCwgcmVzb3VyY2UtPmNwdV9tYXNrKTsKIH0KKyNlbHNlCisjZGVmaW5lIGRyYmRfY2FsY19jcHVfbWFzayhBKSAoe30pCiAjZW5kaWYKIAogLyoqCkBAIC01NjAsOSArNTYyLDkgQEAKICAqIHdvcmQgYWxpZ25lZCBvbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcy4gIChUaGUgYml0bWFwIHNlbmQgYW5kIHJlY2VpdmUgY29kZQogICogcmVsaWVzIG9uIHRoaXMuKQogICovCi11bnNpZ25lZCBpbnQgZHJiZF9oZWFkZXJfc2l6ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCit1bnNpZ25lZCBpbnQgZHJiZF9oZWFkZXJfc2l6ZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCWlmICh0Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDEwMCkgeworCWlmIChjb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gMTAwKSB7CiAJCUJVSUxEX0JVR19PTighSVNfQUxJR05FRChzaXplb2Yoc3RydWN0IHBfaGVhZGVyMTAwKSwgOCkpOwogCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBwX2hlYWRlcjEwMCk7CiAJfSBlbHNlIHsKQEAgLTYwMCw0NCArNjAyLDQ0IEBACiAJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcF9oZWFkZXIxMDApOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IHByZXBhcmVfaGVhZGVyKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgaW50IHZuciwKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHJlcGFyZV9oZWFkZXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IHZuciwKIAkJCQkgICB2b2lkICpidWZmZXIsIGVudW0gZHJiZF9wYWNrZXQgY21kLCBpbnQgc2l6ZSkKIHsKLQlpZiAodGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSAxMDApCisJaWYgKGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSAxMDApCiAJCXJldHVybiBwcmVwYXJlX2hlYWRlcjEwMChidWZmZXIsIGNtZCwgc2l6ZSwgdm5yKTsKLQllbHNlIGlmICh0Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDk1ICYmCisJZWxzZSBpZiAoY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDk1ICYmCiAJCSBzaXplID4gRFJCRF9NQVhfU0laRV9IODBfUEFDS0VUKQogCQlyZXR1cm4gcHJlcGFyZV9oZWFkZXI5NShidWZmZXIsIGNtZCwgc2l6ZSk7CiAJZWxzZQogCQlyZXR1cm4gcHJlcGFyZV9oZWFkZXI4MChidWZmZXIsIGNtZCwgc2l6ZSk7CiB9CiAKLXN0YXRpYyB2b2lkICpfX2Nvbm5fcHJlcGFyZV9jb21tYW5kKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwKK3N0YXRpYyB2b2lkICpfX2Nvbm5fcHJlcGFyZV9jb21tYW5kKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCiAJCQkJICAgIHN0cnVjdCBkcmJkX3NvY2tldCAqc29jaykKIHsKIAlpZiAoIXNvY2stPnNvY2tldCkKIAkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHNvY2stPnNidWYgKyBkcmJkX2hlYWRlcl9zaXplKHRjb25uKTsKKwlyZXR1cm4gc29jay0+c2J1ZiArIGRyYmRfaGVhZGVyX3NpemUoY29ubmVjdGlvbik7CiB9CiAKLXZvaWQgKmNvbm5fcHJlcGFyZV9jb21tYW5kKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrKQordm9pZCAqY29ubl9wcmVwYXJlX2NvbW1hbmQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrKQogewogCXZvaWQgKnA7CiAKIAltdXRleF9sb2NrKCZzb2NrLT5tdXRleCk7Ci0JcCA9IF9fY29ubl9wcmVwYXJlX2NvbW1hbmQodGNvbm4sIHNvY2spOworCXAgPSBfX2Nvbm5fcHJlcGFyZV9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2spOwogCWlmICghcCkKIAkJbXV0ZXhfdW5sb2NrKCZzb2NrLT5tdXRleCk7CiAKIAlyZXR1cm4gcDsKIH0KIAotdm9pZCAqZHJiZF9wcmVwYXJlX2NvbW1hbmQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrKQordm9pZCAqZHJiZF9wcmVwYXJlX2NvbW1hbmQoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2spCiB7Ci0JcmV0dXJuIGNvbm5fcHJlcGFyZV9jb21tYW5kKG1kZXYtPnRjb25uLCBzb2NrKTsKKwlyZXR1cm4gY29ubl9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24sIHNvY2spOwogfQogCi1zdGF0aWMgaW50IF9fc2VuZF9jb21tYW5kKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgaW50IHZuciwKK3N0YXRpYyBpbnQgX19zZW5kX2NvbW1hbmQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IHZuciwKIAkJCSAgc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrLCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKIAkJCSAgdW5zaWduZWQgaW50IGhlYWRlcl9zaXplLCB2b2lkICpkYXRhLAogCQkJICB1bnNpZ25lZCBpbnQgc2l6ZSkKQEAgLTY1NCw4MiArNjU2LDgyIEBACiAJICovCiAJbXNnX2ZsYWdzID0gZGF0YSA/IE1TR19NT1JFIDogMDsKIAotCWhlYWRlcl9zaXplICs9IHByZXBhcmVfaGVhZGVyKHRjb25uLCB2bnIsIHNvY2stPnNidWYsIGNtZCwKKwloZWFkZXJfc2l6ZSArPSBwcmVwYXJlX2hlYWRlcihjb25uZWN0aW9uLCB2bnIsIHNvY2stPnNidWYsIGNtZCwKIAkJCQkgICAgICBoZWFkZXJfc2l6ZSArIHNpemUpOwotCWVyciA9IGRyYmRfc2VuZF9hbGwodGNvbm4sIHNvY2stPnNvY2tldCwgc29jay0+c2J1ZiwgaGVhZGVyX3NpemUsCisJZXJyID0gZHJiZF9zZW5kX2FsbChjb25uZWN0aW9uLCBzb2NrLT5zb2NrZXQsIHNvY2stPnNidWYsIGhlYWRlcl9zaXplLAogCQkJICAgIG1zZ19mbGFncyk7CiAJaWYgKGRhdGEgJiYgIWVycikKLQkJZXJyID0gZHJiZF9zZW5kX2FsbCh0Y29ubiwgc29jay0+c29ja2V0LCBkYXRhLCBzaXplLCAwKTsKKwkJZXJyID0gZHJiZF9zZW5kX2FsbChjb25uZWN0aW9uLCBzb2NrLT5zb2NrZXQsIGRhdGEsIHNpemUsIDApOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19jb25uX3NlbmRfY29tbWFuZChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBkcmJkX3NvY2tldCAqc29jaywKK3N0YXRpYyBpbnQgX19jb25uX3NlbmRfY29tbWFuZChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2ssCiAJCQkgICAgICAgZW51bSBkcmJkX3BhY2tldCBjbWQsIHVuc2lnbmVkIGludCBoZWFkZXJfc2l6ZSwKIAkJCSAgICAgICB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSkKIHsKLQlyZXR1cm4gX19zZW5kX2NvbW1hbmQodGNvbm4sIDAsIHNvY2ssIGNtZCwgaGVhZGVyX3NpemUsIGRhdGEsIHNpemUpOworCXJldHVybiBfX3NlbmRfY29tbWFuZChjb25uZWN0aW9uLCAwLCBzb2NrLCBjbWQsIGhlYWRlcl9zaXplLCBkYXRhLCBzaXplKTsKIH0KIAotaW50IGNvbm5fc2VuZF9jb21tYW5kKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrLAoraW50IGNvbm5fc2VuZF9jb21tYW5kKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBkcmJkX3NvY2tldCAqc29jaywKIAkJICAgICAgZW51bSBkcmJkX3BhY2tldCBjbWQsIHVuc2lnbmVkIGludCBoZWFkZXJfc2l6ZSwKIAkJICAgICAgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IF9fY29ubl9zZW5kX2NvbW1hbmQodGNvbm4sIHNvY2ssIGNtZCwgaGVhZGVyX3NpemUsIGRhdGEsIHNpemUpOworCWVyciA9IF9fY29ubl9zZW5kX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jaywgY21kLCBoZWFkZXJfc2l6ZSwgZGF0YSwgc2l6ZSk7CiAJbXV0ZXhfdW5sb2NrKCZzb2NrLT5tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KIAotaW50IGRyYmRfc2VuZF9jb21tYW5kKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBkcmJkX3NvY2tldCAqc29jaywKK2ludCBkcmJkX3NlbmRfY29tbWFuZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHN0cnVjdCBkcmJkX3NvY2tldCAqc29jaywKIAkJICAgICAgZW51bSBkcmJkX3BhY2tldCBjbWQsIHVuc2lnbmVkIGludCBoZWFkZXJfc2l6ZSwKIAkJICAgICAgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IF9fc2VuZF9jb21tYW5kKG1kZXYtPnRjb25uLCBtZGV2LT52bnIsIHNvY2ssIGNtZCwgaGVhZGVyX3NpemUsCi0JCQkgICAgIGRhdGEsIHNpemUpOworCWVyciA9IF9fc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBwZWVyX2RldmljZS0+ZGV2aWNlLT52bnIsCisJCQkgICAgIHNvY2ssIGNtZCwgaGVhZGVyX3NpemUsIGRhdGEsIHNpemUpOwogCW11dGV4X3VubG9jaygmc29jay0+bXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiAKLWludCBkcmJkX3NlbmRfcGluZyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitpbnQgZHJiZF9zZW5kX3Bpbmcoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAKLQlzb2NrID0gJnRjb25uLT5tZXRhOwotCWlmICghY29ubl9wcmVwYXJlX2NvbW1hbmQodGNvbm4sIHNvY2spKQorCXNvY2sgPSAmY29ubmVjdGlvbi0+bWV0YTsKKwlpZiAoIWNvbm5fcHJlcGFyZV9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2spKQogCQlyZXR1cm4gLUVJTzsKLQlyZXR1cm4gY29ubl9zZW5kX2NvbW1hbmQodGNvbm4sIHNvY2ssIFBfUElORywgMCwgTlVMTCwgMCk7CisJcmV0dXJuIGNvbm5fc2VuZF9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2ssIFBfUElORywgMCwgTlVMTCwgMCk7CiB9CiAKLWludCBkcmJkX3NlbmRfcGluZ19hY2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQoraW50IGRyYmRfc2VuZF9waW5nX2FjayhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAotCXNvY2sgPSAmdGNvbm4tPm1ldGE7Ci0JaWYgKCFjb25uX3ByZXBhcmVfY29tbWFuZCh0Y29ubiwgc29jaykpCisJc29jayA9ICZjb25uZWN0aW9uLT5tZXRhOworCWlmICghY29ubl9wcmVwYXJlX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jaykpCiAJCXJldHVybiAtRUlPOwotCXJldHVybiBjb25uX3NlbmRfY29tbWFuZCh0Y29ubiwgc29jaywgUF9QSU5HX0FDSywgMCwgTlVMTCwgMCk7CisJcmV0dXJuIGNvbm5fc2VuZF9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2ssIFBfUElOR19BQ0ssIDAsIE5VTEwsIDApOwogfQogCi1pbnQgZHJiZF9zZW5kX3N5bmNfcGFyYW0oc3RydWN0IGRyYmRfY29uZiAqbWRldikKK2ludCBkcmJkX3NlbmRfc3luY19wYXJhbShzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UpCiB7CiAJc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrOwogCXN0cnVjdCBwX3JzX3BhcmFtXzk1ICpwOwogCWludCBzaXplOwotCWNvbnN0IGludCBhcHYgPSBtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uOworCWNvbnN0IGludCBhcHYgPSBwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uOwogCWVudW0gZHJiZF9wYWNrZXQgY21kOwogCXN0cnVjdCBuZXRfY29uZiAqbmM7CiAJc3RydWN0IGRpc2tfY29uZiAqZGM7CiAKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5kYXRhOwotCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChtZGV2LCBzb2NrKTsKKwlzb2NrID0gJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5kYXRhOworCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChwZWVyX2RldmljZSwgc29jayk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTzsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQluYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpOworCW5jID0gcmN1X2RlcmVmZXJlbmNlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAKIAlzaXplID0gYXB2IDw9IDg3ID8gc2l6ZW9mKHN0cnVjdCBwX3JzX3BhcmFtKQogCQk6IGFwdiA9PSA4OCA/IHNpemVvZihzdHJ1Y3QgcF9yc19wYXJhbSkKQEAgLTc0MiwxNCArNzQ0LDE0IEBACiAJLyogaW5pdGlhbGl6ZSB2ZXJpZnlfYWxnIGFuZCBjc3Vtc19hbGcgKi8KIAltZW1zZXQocC0+dmVyaWZ5X2FsZywgMCwgMiAqIFNIQVJFRF9TRUNSRVRfTUFYKTsKIAotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQlkYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpOworCWlmIChnZXRfbGRldihwZWVyX2RldmljZS0+ZGV2aWNlKSkgeworCQlkYyA9IHJjdV9kZXJlZmVyZW5jZShwZWVyX2RldmljZS0+ZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpOwogCQlwLT5yZXN5bmNfcmF0ZSA9IGNwdV90b19iZTMyKGRjLT5yZXN5bmNfcmF0ZSk7CiAJCXAtPmNfcGxhbl9haGVhZCA9IGNwdV90b19iZTMyKGRjLT5jX3BsYW5fYWhlYWQpOwogCQlwLT5jX2RlbGF5X3RhcmdldCA9IGNwdV90b19iZTMyKGRjLT5jX2RlbGF5X3RhcmdldCk7CiAJCXAtPmNfZmlsbF90YXJnZXQgPSBjcHVfdG9fYmUzMihkYy0+Y19maWxsX3RhcmdldCk7CiAJCXAtPmNfbWF4X3JhdGUgPSBjcHVfdG9fYmUzMihkYy0+Y19tYXhfcmF0ZSk7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihwZWVyX2RldmljZS0+ZGV2aWNlKTsKIAl9IGVsc2UgewogCQlwLT5yZXN5bmNfcmF0ZSA9IGNwdV90b19iZTMyKERSQkRfUkVTWU5DX1JBVEVfREVGKTsKIAkJcC0+Y19wbGFuX2FoZWFkID0gY3B1X3RvX2JlMzIoRFJCRF9DX1BMQU5fQUhFQURfREVGKTsKQEAgLTc2NCwzMyArNzY2LDMzIEBACiAJCXN0cmNweShwLT5jc3Vtc19hbGcsIG5jLT5jc3Vtc19hbGcpOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKG1kZXYsIHNvY2ssIGNtZCwgc2l6ZSwgTlVMTCwgMCk7CisJcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBjbWQsIHNpemUsIE5VTEwsIDApOwogfQogCi1pbnQgX19kcmJkX3NlbmRfcHJvdG9jb2woc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBlbnVtIGRyYmRfcGFja2V0IGNtZCkKK2ludCBfX2RyYmRfc2VuZF9wcm90b2NvbChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBlbnVtIGRyYmRfcGFja2V0IGNtZCkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfcHJvdG9jb2wgKnA7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAlpbnQgc2l6ZSwgY2Y7CiAKLQlzb2NrID0gJnRjb25uLT5kYXRhOwotCXAgPSBfX2Nvbm5fcHJlcGFyZV9jb21tYW5kKHRjb25uLCBzb2NrKTsKKwlzb2NrID0gJmNvbm5lY3Rpb24tPmRhdGE7CisJcCA9IF9fY29ubl9wcmVwYXJlX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jayk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTzsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQluYyA9IHJjdV9kZXJlZmVyZW5jZSh0Y29ubi0+bmV0X2NvbmYpOworCW5jID0gcmN1X2RlcmVmZXJlbmNlKGNvbm5lY3Rpb24tPm5ldF9jb25mKTsKIAotCWlmIChuYy0+dGVudGF0aXZlICYmIHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5MikgeworCWlmIChuYy0+dGVudGF0aXZlICYmIGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkyKSB7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQltdXRleF91bmxvY2soJnNvY2stPm11dGV4KTsKLQkJY29ubl9lcnIodGNvbm4sICItLWRyeS1ydW4gaXMgbm90IHN1cHBvcnRlZCBieSBwZWVyIik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICItLWRyeS1ydW4gaXMgbm90IHN1cHBvcnRlZCBieSBwZWVyIik7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKIAlzaXplID0gc2l6ZW9mKCpwKTsKLQlpZiAodGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA4NykKKwlpZiAoY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDg3KQogCQlzaXplICs9IHN0cmxlbihuYy0+aW50ZWdyaXR5X2FsZykgKyAxOwogCiAJcC0+cHJvdG9jb2wgICAgICA9IGNwdV90b19iZTMyKG5jLT53aXJlX3Byb3RvY29sKTsKQEAgLTgwNSwxMjggKzgwNywxMzEgQEAKIAkJY2YgfD0gQ0ZfRFJZX1JVTjsKIAlwLT5jb25uX2ZsYWdzICAgID0gY3B1X3RvX2JlMzIoY2YpOwogCi0JaWYgKHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gODcpCisJaWYgKGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA4NykKIAkJc3RyY3B5KHAtPmludGVncml0eV9hbGcsIG5jLT5pbnRlZ3JpdHlfYWxnKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCXJldHVybiBfX2Nvbm5fc2VuZF9jb21tYW5kKHRjb25uLCBzb2NrLCBjbWQsIHNpemUsIE5VTEwsIDApOworCXJldHVybiBfX2Nvbm5fc2VuZF9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2ssIGNtZCwgc2l6ZSwgTlVMTCwgMCk7CiB9CiAKLWludCBkcmJkX3NlbmRfcHJvdG9jb2woc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQoraW50IGRyYmRfc2VuZF9wcm90b2NvbChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewogCWludCBlcnI7CiAKLQltdXRleF9sb2NrKCZ0Y29ubi0+ZGF0YS5tdXRleCk7Ci0JZXJyID0gX19kcmJkX3NlbmRfcHJvdG9jb2wodGNvbm4sIFBfUFJPVE9DT0wpOwotCW11dGV4X3VubG9jaygmdGNvbm4tPmRhdGEubXV0ZXgpOworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPmRhdGEubXV0ZXgpOworCWVyciA9IF9fZHJiZF9zZW5kX3Byb3RvY29sKGNvbm5lY3Rpb24sIFBfUFJPVE9DT0wpOworCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+ZGF0YS5tdXRleCk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgX2RyYmRfc2VuZF91dWlkcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1NjQgdXVpZF9mbGFncykKK3N0YXRpYyBpbnQgX2RyYmRfc2VuZF91dWlkcyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHU2NCB1dWlkX2ZsYWdzKQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfdXVpZHMgKnA7CiAJaW50IGk7CiAKLQlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfTkVHT1RJQVRJTkcpKQorCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX05FR09USUFUSU5HKSkKIAkJcmV0dXJuIDA7CiAKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5kYXRhOwotCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChtZGV2LCBzb2NrKTsKKwlzb2NrID0gJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5kYXRhOworCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChwZWVyX2RldmljZSwgc29jayk7CiAJaWYgKCFwKSB7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+bGRldi0+bWQudXVpZF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jayk7CiAJZm9yIChpID0gVUlfQ1VSUkVOVDsgaSA8IFVJX1NJWkU7IGkrKykKLQkJcC0+dXVpZFtpXSA9IGNwdV90b19iZTY0KG1kZXYtPmxkZXYtPm1kLnV1aWRbaV0pOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+bGRldi0+bWQudXVpZF9sb2NrKTsKKwkJcC0+dXVpZFtpXSA9IGNwdV90b19iZTY0KGRldmljZS0+bGRldi0+bWQudXVpZFtpXSk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jayk7CiAKLQltZGV2LT5jb21tX2JtX3NldCA9IGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpOwotCXAtPnV1aWRbVUlfU0laRV0gPSBjcHVfdG9fYmU2NChtZGV2LT5jb21tX2JtX3NldCk7CisJZGV2aWNlLT5jb21tX2JtX3NldCA9IGRyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSk7CisJcC0+dXVpZFtVSV9TSVpFXSA9IGNwdV90b19iZTY0KGRldmljZS0+Y29tbV9ibV9zZXQpOwogCXJjdV9yZWFkX2xvY2soKTsKLQl1dWlkX2ZsYWdzIHw9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpLT5kaXNjYXJkX215X2RhdGEgPyAxIDogMDsKKwl1dWlkX2ZsYWdzIHw9IHJjdV9kZXJlZmVyZW5jZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpLT5kaXNjYXJkX215X2RhdGEgPyAxIDogMDsKIAlyY3VfcmVhZF91bmxvY2soKTsKLQl1dWlkX2ZsYWdzIHw9IHRlc3RfYml0KENSQVNIRURfUFJJTUFSWSwgJm1kZXYtPmZsYWdzKSA/IDIgOiAwOwotCXV1aWRfZmxhZ3MgfD0gbWRldi0+bmV3X3N0YXRlX3RtcC5kaXNrID09IERfSU5DT05TSVNURU5UID8gNCA6IDA7CisJdXVpZF9mbGFncyB8PSB0ZXN0X2JpdChDUkFTSEVEX1BSSU1BUlksICZkZXZpY2UtPmZsYWdzKSA/IDIgOiAwOworCXV1aWRfZmxhZ3MgfD0gZGV2aWNlLT5uZXdfc3RhdGVfdG1wLmRpc2sgPT0gRF9JTkNPTlNJU1RFTlQgPyA0IDogMDsKIAlwLT51dWlkW1VJX0ZMQUdTXSA9IGNwdV90b19iZTY0KHV1aWRfZmxhZ3MpOwogCi0JcHV0X2xkZXYobWRldik7Ci0JcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKG1kZXYsIHNvY2ssIFBfVVVJRFMsIHNpemVvZigqcCksIE5VTEwsIDApOworCXB1dF9sZGV2KGRldmljZSk7CisJcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBQX1VVSURTLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAotaW50IGRyYmRfc2VuZF91dWlkcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQoraW50IGRyYmRfc2VuZF91dWlkcyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UpCiB7Ci0JcmV0dXJuIF9kcmJkX3NlbmRfdXVpZHMobWRldiwgMCk7CisJcmV0dXJuIF9kcmJkX3NlbmRfdXVpZHMocGVlcl9kZXZpY2UsIDApOwogfQogCi1pbnQgZHJiZF9zZW5kX3V1aWRzX3NraXBfaW5pdGlhbF9zeW5jKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitpbnQgZHJiZF9zZW5kX3V1aWRzX3NraXBfaW5pdGlhbF9zeW5jKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSkKIHsKLQlyZXR1cm4gX2RyYmRfc2VuZF91dWlkcyhtZGV2LCA4KTsKKwlyZXR1cm4gX2RyYmRfc2VuZF91dWlkcyhwZWVyX2RldmljZSwgOCk7CiB9CiAKLXZvaWQgZHJiZF9wcmludF91dWlkcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCBjaGFyICp0ZXh0KQordm9pZCBkcmJkX3ByaW50X3V1aWRzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCBjaGFyICp0ZXh0KQogewotCWlmIChnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX05FR09USUFUSU5HKSkgewotCQl1NjQgKnV1aWQgPSBtZGV2LT5sZGV2LT5tZC51dWlkOwotCQlkZXZfaW5mbyhERVYsICIlcyAlMDE2bGxYOiUwMTZsbFg6JTAxNmxsWDolMDE2bGxYXG4iLAorCWlmIChnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfTkVHT1RJQVRJTkcpKSB7CisJCXU2NCAqdXVpZCA9IGRldmljZS0+bGRldi0+bWQudXVpZDsKKwkJZHJiZF9pbmZvKGRldmljZSwgIiVzICUwMTZsbFg6JTAxNmxsWDolMDE2bGxYOiUwMTZsbFhcbiIsCiAJCSAgICAgdGV4dCwKIAkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXV1aWRbVUlfQ1VSUkVOVF0sCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl1dWlkW1VJX0JJVE1BUF0sCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl1dWlkW1VJX0hJU1RPUllfU1RBUlRdLAogCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdXVpZFtVSV9ISVNUT1JZX0VORF0pOwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9IGVsc2UgewotCQlkZXZfaW5mbyhERVYsICIlcyBlZmZlY3RpdmUgZGF0YSB1dWlkOiAlMDE2bGxYXG4iLAorCQlkcmJkX2luZm8oZGV2aWNlLCAiJXMgZWZmZWN0aXZlIGRhdGEgdXVpZDogJTAxNmxsWFxuIiwKIAkJCQl0ZXh0LAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWRldi0+ZWRfdXVpZCk7CisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkZXZpY2UtPmVkX3V1aWQpOwogCX0KIH0KIAotdm9pZCBkcmJkX2dlbl9hbmRfc2VuZF9zeW5jX3V1aWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgZHJiZF9nZW5fYW5kX3NlbmRfc3luY191dWlkKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSkKIHsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAJc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrOwogCXN0cnVjdCBwX3JzX3V1aWQgKnA7CiAJdTY0IHV1aWQ7CiAKLQlEX0FTU0VSVChtZGV2LT5zdGF0ZS5kaXNrID09IERfVVBfVE9fREFURSk7CisJRF9BU1NFUlQoZGV2aWNlLCBkZXZpY2UtPnN0YXRlLmRpc2sgPT0gRF9VUF9UT19EQVRFKTsKIAotCXV1aWQgPSBtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF07CisJdXVpZCA9IGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdOwogCWlmICh1dWlkICYmIHV1aWQgIT0gVVVJRF9KVVNUX0NSRUFURUQpCiAJCXV1aWQgPSB1dWlkICsgVVVJRF9ORVdfQk1fT0ZGU0VUOwogCWVsc2UKIAkJZ2V0X3JhbmRvbV9ieXRlcygmdXVpZCwgc2l6ZW9mKHU2NCkpOwotCWRyYmRfdXVpZF9zZXQobWRldiwgVUlfQklUTUFQLCB1dWlkKTsKLQlkcmJkX3ByaW50X3V1aWRzKG1kZXYsICJ1cGRhdGVkIHN5bmMgVVVJRCIpOwotCWRyYmRfbWRfc3luYyhtZGV2KTsKKwlkcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfQklUTUFQLCB1dWlkKTsKKwlkcmJkX3ByaW50X3V1aWRzKGRldmljZSwgInVwZGF0ZWQgc3luYyBVVUlEIik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5kYXRhOwotCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChtZGV2LCBzb2NrKTsKKwlzb2NrID0gJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5kYXRhOworCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChwZWVyX2RldmljZSwgc29jayk7CiAJaWYgKHApIHsKIAkJcC0+dXVpZCA9IGNwdV90b19iZTY0KHV1aWQpOwotCQlkcmJkX3NlbmRfY29tbWFuZChtZGV2LCBzb2NrLCBQX1NZTkNfVVVJRCwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CisJCWRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBQX1NZTkNfVVVJRCwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CiAJfQogfQogCi1pbnQgZHJiZF9zZW5kX3NpemVzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCB0cmlnZ2VyX3JlcGx5LCBlbnVtIGRkc19mbGFncyBmbGFncykKK2ludCBkcmJkX3NlbmRfc2l6ZXMoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBpbnQgdHJpZ2dlcl9yZXBseSwgZW51bSBkZHNfZmxhZ3MgZmxhZ3MpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAlzdHJ1Y3QgcF9zaXplcyAqcDsKIAlzZWN0b3JfdCBkX3NpemUsIHVfc2l6ZTsKIAlpbnQgcV9vcmRlcl90eXBlOwogCXVuc2lnbmVkIGludCBtYXhfYmlvX3NpemU7CiAKLQlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9ORUdPVElBVElORykpIHsKLQkJRF9BU1NFUlQobWRldi0+bGRldi0+YmFja2luZ19iZGV2KTsKLQkJZF9zaXplID0gZHJiZF9nZXRfbWF4X2NhcGFjaXR5KG1kZXYtPmxkZXYpOworCWlmIChnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfTkVHT1RJQVRJTkcpKSB7CisJCURfQVNTRVJUKGRldmljZSwgZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXYpOworCQlkX3NpemUgPSBkcmJkX2dldF9tYXhfY2FwYWNpdHkoZGV2aWNlLT5sZGV2KTsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQl1X3NpemUgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKS0+ZGlza19zaXplOworCQl1X3NpemUgPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5kaXNrX3NpemU7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlxX29yZGVyX3R5cGUgPSBkcmJkX3F1ZXVlX29yZGVyX3R5cGUobWRldik7Ci0JCW1heF9iaW9fc2l6ZSA9IHF1ZXVlX21heF9od19zZWN0b3JzKG1kZXYtPmxkZXYtPmJhY2tpbmdfYmRldi0+YmRfZGlzay0+cXVldWUpIDw8IDk7CisJCXFfb3JkZXJfdHlwZSA9IGRyYmRfcXVldWVfb3JkZXJfdHlwZShkZXZpY2UpOworCQltYXhfYmlvX3NpemUgPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhkZXZpY2UtPmxkZXYtPmJhY2tpbmdfYmRldi0+YmRfZGlzay0+cXVldWUpIDw8IDk7CiAJCW1heF9iaW9fc2l6ZSA9IG1pbihtYXhfYmlvX3NpemUsIERSQkRfTUFYX0JJT19TSVpFKTsKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfSBlbHNlIHsKIAkJZF9zaXplID0gMDsKIAkJdV9zaXplID0gMDsKQEAgLTkzNCw0NSArOTM5LDQ1IEBACiAJCW1heF9iaW9fc2l6ZSA9IERSQkRfTUFYX0JJT19TSVpFOyAvKiAuLi4gbXVsdGlwbGUgQklPcyBwZXIgcGVlcl9yZXF1ZXN0ICovCiAJfQogCi0Jc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jayk7CisJc29jayA9ICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8PSA5NCkKKwlpZiAocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8PSA5NCkKIAkJbWF4X2Jpb19zaXplID0gbWluKG1heF9iaW9fc2l6ZSwgRFJCRF9NQVhfU0laRV9IODBfUEFDS0VUKTsKLQllbHNlIGlmIChtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgMTAwKQorCWVsc2UgaWYgKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDApCiAJCW1heF9iaW9fc2l6ZSA9IG1pbihtYXhfYmlvX3NpemUsIERSQkRfTUFYX0JJT19TSVpFX1A5NSk7CiAKIAlwLT5kX3NpemUgPSBjcHVfdG9fYmU2NChkX3NpemUpOwogCXAtPnVfc2l6ZSA9IGNwdV90b19iZTY0KHVfc2l6ZSk7Ci0JcC0+Y19zaXplID0gY3B1X3RvX2JlNjQodHJpZ2dlcl9yZXBseSA/IDAgOiBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYpKTsKKwlwLT5jX3NpemUgPSBjcHVfdG9fYmU2NCh0cmlnZ2VyX3JlcGx5ID8gMCA6IGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KSk7CiAJcC0+bWF4X2Jpb19zaXplID0gY3B1X3RvX2JlMzIobWF4X2Jpb19zaXplKTsKIAlwLT5xdWV1ZV9vcmRlcl90eXBlID0gY3B1X3RvX2JlMTYocV9vcmRlcl90eXBlKTsKIAlwLT5kZHNfZmxhZ3MgPSBjcHVfdG9fYmUxNihmbGFncyk7Ci0JcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKG1kZXYsIHNvY2ssIFBfU0laRVMsIHNpemVvZigqcCksIE5VTEwsIDApOworCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChwZWVyX2RldmljZSwgc29jaywgUF9TSVpFUywgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CiB9CiAKIC8qKgogICogZHJiZF9zZW5kX2N1cnJlbnRfc3RhdGUoKSAtIFNlbmRzIHRoZSBkcmJkIHN0YXRlIHRvIHRoZSBwZWVyCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAcGVlcl9kZXZpY2U6CURSQkQgcGVlciBkZXZpY2UuCiAgKi8KLWludCBkcmJkX3NlbmRfY3VycmVudF9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQoraW50IGRyYmRfc2VuZF9jdXJyZW50X3N0YXRlKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfc3RhdGUgKnA7CiAKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5kYXRhOwotCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChtZGV2LCBzb2NrKTsKKwlzb2NrID0gJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5kYXRhOworCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChwZWVyX2RldmljZSwgc29jayk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTzsKLQlwLT5zdGF0ZSA9IGNwdV90b19iZTMyKG1kZXYtPnN0YXRlLmkpOyAvKiBXaXRoaW4gdGhlIHNlbmQgbXV0ZXggKi8KLQlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQobWRldiwgc29jaywgUF9TVEFURSwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CisJcC0+c3RhdGUgPSBjcHVfdG9fYmUzMihwZWVyX2RldmljZS0+ZGV2aWNlLT5zdGF0ZS5pKTsgLyogV2l0aGluIHRoZSBzZW5kIG11dGV4ICovCisJcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBQX1NUQVRFLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAogLyoqCiAgKiBkcmJkX3NlbmRfc3RhdGUoKSAtIEFmdGVyIGEgc3RhdGUgY2hhbmdlLCBzZW5kcyB0aGUgbmV3IHN0YXRlIHRvIHRoZSBwZWVyCi0gKiBAbWRldjogICAgICBEUkJEIGRldmljZS4KKyAqIEBwZWVyX2RldmljZTogICAgICBEUkJEIHBlZXIgZGV2aWNlLgogICogQHN0YXRlOiAgICAgdGhlIHN0YXRlIHRvIHNlbmQsIG5vdCBuZWNlc3NhcmlseSB0aGUgY3VycmVudCBzdGF0ZS4KICAqCiAgKiBFYWNoIHN0YXRlIGNoYW5nZSBxdWV1ZXMgYW4gImFmdGVyX3N0YXRlX2NoIiB3b3JrLCB3aGljaCB3aWxsIGV2ZW50dWFsbHkKQEAgLTk4MCw3MyArOTg1LDczIEBACiAgKiBiZXR3ZWVuIHF1ZXVpbmcgYW5kIHByb2Nlc3Npbmcgb2YgdGhlIGFmdGVyX3N0YXRlX2NoIHdvcmssIHdlIHN0aWxsCiAgKiB3YW50IHRvIHNlbmQgZWFjaCBpbnRlcm1lZGlhcnkgc3RhdGUgaW4gdGhlIG9yZGVyIGl0IG9jY3VycmVkLgogICovCi1pbnQgZHJiZF9zZW5kX3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgc3RhdGUpCitpbnQgZHJiZF9zZW5kX3N0YXRlKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgdW5pb24gZHJiZF9zdGF0ZSBzdGF0ZSkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfc3RhdGUgKnA7CiAKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5kYXRhOwotCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChtZGV2LCBzb2NrKTsKKwlzb2NrID0gJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5kYXRhOworCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChwZWVyX2RldmljZSwgc29jayk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTzsKIAlwLT5zdGF0ZSA9IGNwdV90b19iZTMyKHN0YXRlLmkpOyAvKiBXaXRoaW4gdGhlIHNlbmQgbXV0ZXggKi8KLQlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQobWRldiwgc29jaywgUF9TVEFURSwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CisJcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBQX1NUQVRFLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAotaW50IGRyYmRfc2VuZF9zdGF0ZV9yZXEoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLCB1bmlvbiBkcmJkX3N0YXRlIHZhbCkKK2ludCBkcmJkX3NlbmRfc3RhdGVfcmVxKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLCB1bmlvbiBkcmJkX3N0YXRlIHZhbCkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfcmVxX3N0YXRlICpwOwogCi0Jc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jayk7CisJc29jayA9ICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87CiAJcC0+bWFzayA9IGNwdV90b19iZTMyKG1hc2suaSk7CiAJcC0+dmFsID0gY3B1X3RvX2JlMzIodmFsLmkpOwotCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChtZGV2LCBzb2NrLCBQX1NUQVRFX0NIR19SRVEsIHNpemVvZigqcCksIE5VTEwsIDApOworCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChwZWVyX2RldmljZSwgc29jaywgUF9TVEFURV9DSEdfUkVRLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAotaW50IGNvbm5fc2VuZF9zdGF0ZV9yZXEoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsKQoraW50IGNvbm5fc2VuZF9zdGF0ZV9yZXEoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLCB1bmlvbiBkcmJkX3N0YXRlIHZhbCkKIHsKIAllbnVtIGRyYmRfcGFja2V0IGNtZDsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfcmVxX3N0YXRlICpwOwogCi0JY21kID0gdGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDEwMCA/IFBfU1RBVEVfQ0hHX1JFUSA6IFBfQ09OTl9TVF9DSEdfUkVROwotCXNvY2sgPSAmdGNvbm4tPmRhdGE7Ci0JcCA9IGNvbm5fcHJlcGFyZV9jb21tYW5kKHRjb25uLCBzb2NrKTsKKwljbWQgPSBjb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDAgPyBQX1NUQVRFX0NIR19SRVEgOiBQX0NPTk5fU1RfQ0hHX1JFUTsKKwlzb2NrID0gJmNvbm5lY3Rpb24tPmRhdGE7CisJcCA9IGNvbm5fcHJlcGFyZV9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87CiAJcC0+bWFzayA9IGNwdV90b19iZTMyKG1hc2suaSk7CiAJcC0+dmFsID0gY3B1X3RvX2JlMzIodmFsLmkpOwotCXJldHVybiBjb25uX3NlbmRfY29tbWFuZCh0Y29ubiwgc29jaywgY21kLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKKwlyZXR1cm4gY29ubl9zZW5kX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jaywgY21kLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAotdm9pZCBkcmJkX3NlbmRfc3JfcmVwbHkoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX3N0YXRlX3J2IHJldGNvZGUpCit2b2lkIGRyYmRfc2VuZF9zcl9yZXBseShzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIGVudW0gZHJiZF9zdGF0ZV9ydiByZXRjb2RlKQogewogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAlzdHJ1Y3QgcF9yZXFfc3RhdGVfcmVwbHkgKnA7CiAKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5tZXRhOwotCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChtZGV2LCBzb2NrKTsKKwlzb2NrID0gJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5tZXRhOworCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChwZWVyX2RldmljZSwgc29jayk7CiAJaWYgKHApIHsKIAkJcC0+cmV0Y29kZSA9IGNwdV90b19iZTMyKHJldGNvZGUpOwotCQlkcmJkX3NlbmRfY29tbWFuZChtZGV2LCBzb2NrLCBQX1NUQVRFX0NIR19SRVBMWSwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CisJCWRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBQX1NUQVRFX0NIR19SRVBMWSwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CiAJfQogfQogCi12b2lkIGNvbm5fc2VuZF9zcl9yZXBseShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGVudW0gZHJiZF9zdGF0ZV9ydiByZXRjb2RlKQordm9pZCBjb25uX3NlbmRfc3JfcmVwbHkoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgZW51bSBkcmJkX3N0YXRlX3J2IHJldGNvZGUpCiB7CiAJc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrOwogCXN0cnVjdCBwX3JlcV9zdGF0ZV9yZXBseSAqcDsKLQllbnVtIGRyYmRfcGFja2V0IGNtZCA9IHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDAgPyBQX1NUQVRFX0NIR19SRVBMWSA6IFBfQ09OTl9TVF9DSEdfUkVQTFk7CisJZW51bSBkcmJkX3BhY2tldCBjbWQgPSBjb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDAgPyBQX1NUQVRFX0NIR19SRVBMWSA6IFBfQ09OTl9TVF9DSEdfUkVQTFk7CiAKLQlzb2NrID0gJnRjb25uLT5tZXRhOwotCXAgPSBjb25uX3ByZXBhcmVfY29tbWFuZCh0Y29ubiwgc29jayk7CisJc29jayA9ICZjb25uZWN0aW9uLT5tZXRhOworCXAgPSBjb25uX3ByZXBhcmVfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrKTsKIAlpZiAocCkgewogCQlwLT5yZXRjb2RlID0gY3B1X3RvX2JlMzIocmV0Y29kZSk7Ci0JCWNvbm5fc2VuZF9jb21tYW5kKHRjb25uLCBzb2NrLCBjbWQsIHNpemVvZigqcCksIE5VTEwsIDApOworCQljb25uX3NlbmRfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrLCBjbWQsIHNpemVvZigqcCksIE5VTEwsIDApOwogCX0KIH0KIApAQCAtMTA2Nyw3ICsxMDcyLDcgQEAKIAlwLT5lbmNvZGluZyA9IChwLT5lbmNvZGluZyAmICh+MHg3IDw8IDQpKSB8IChuIDw8IDQpOwogfQogCi1pbnQgZmlsbF9iaXRtYXBfcmxlX2JpdHMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3N0YXRpYyBpbnQgZmlsbF9iaXRtYXBfcmxlX2JpdHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkgc3RydWN0IHBfY29tcHJlc3NlZF9ibSAqcCwKIAkJCSB1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJCSBzdHJ1Y3QgYm1feGZlcl9jdHggKmMpCkBAIC0xMDgyLDkgKzEwODcsOSBAQAogCiAJLyogbWF5IHdlIHVzZSB0aGlzIGZlYXR1cmU/ICovCiAJcmN1X3JlYWRfbG9jaygpOwotCXVzZV9ybGUgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKS0+dXNlX3JsZTsKKwl1c2VfcmxlID0gcmN1X2RlcmVmZXJlbmNlKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPm5ldF9jb25mKS0+dXNlX3JsZTsKIAlyY3VfcmVhZF91bmxvY2soKTsKLQlpZiAoIXVzZV9ybGUgfHwgbWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkwKQorCWlmICghdXNlX3JsZSB8fCBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5MCkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoYy0+Yml0X29mZnNldCA+PSBjLT5ibV9iaXRzKQpAQCAtMTEwNCw4ICsxMTA5LDggQEAKIAkvKiBzZWUgaG93IG11Y2ggcGxhaW4gYml0cyB3ZSBjYW4gc3R1ZmYgaW50byBvbmUgcGFja2V0CiAJICogdXNpbmcgUkxFIGFuZCBWTEkuICovCiAJZG8gewotCQl0bXAgPSAodG9nZ2xlID09IDApID8gX2RyYmRfYm1fZmluZF9uZXh0X3plcm8obWRldiwgYy0+Yml0X29mZnNldCkKLQkJCQkgICAgOiBfZHJiZF9ibV9maW5kX25leHQobWRldiwgYy0+Yml0X29mZnNldCk7CisJCXRtcCA9ICh0b2dnbGUgPT0gMCkgPyBfZHJiZF9ibV9maW5kX25leHRfemVybyhkZXZpY2UsIGMtPmJpdF9vZmZzZXQpCisJCQkJICAgIDogX2RyYmRfYm1fZmluZF9uZXh0KGRldmljZSwgYy0+Yml0X29mZnNldCk7CiAJCWlmICh0bXAgPT0gLTFVTCkKIAkJCXRtcCA9IGMtPmJtX2JpdHM7CiAJCXJsID0gdG1wIC0gYy0+Yml0X29mZnNldDsKQEAgLTExMjUsNyArMTEzMCw3IEBACiAJCS8qIHBhcmFub2lhOiBjYXRjaCB6ZXJvIHJ1bmxlbmd0aC4KIAkJICogY2FuIG9ubHkgaGFwcGVuIGlmIGJpdG1hcCBpcyBtb2RpZmllZCB3aGlsZSB3ZSBzY2FuIGl0LiAqLwogCQlpZiAocmwgPT0gMCkgewotCQkJZGV2X2VycihERVYsICJ1bmV4cGVjdGVkIHplcm8gcnVubGVuZ3RoIHdoaWxlIGVuY29kaW5nIGJpdG1hcCAiCisJCQlkcmJkX2VycihkZXZpY2UsICJ1bmV4cGVjdGVkIHplcm8gcnVubGVuZ3RoIHdoaWxlIGVuY29kaW5nIGJpdG1hcCAiCiAJCQkgICAgInQ6JXUgYm86JWx1XG4iLCB0b2dnbGUsIGMtPmJpdF9vZmZzZXQpOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC0xMTM0LDcgKzExMzksNyBAQAogCQlpZiAoYml0cyA9PSAtRU5PQlVGUykgLyogYnVmZmVyIGZ1bGwgKi8KIAkJCWJyZWFrOwogCQlpZiAoYml0cyA8PSAwKSB7Ci0JCQlkZXZfZXJyKERFViwgImVycm9yIHdoaWxlIGVuY29kaW5nIGJpdG1hcDogJWRcbiIsIGJpdHMpOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiZXJyb3Igd2hpbGUgZW5jb2RpbmcgYml0bWFwOiAlZFxuIiwgYml0cyk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCkBAIC0xMTcxLDIxICsxMTc2LDIxIEBACiAgKiBjb2RlIHVwb24gZmFpbHVyZS4KICAqLwogc3RhdGljIGludAotc2VuZF9iaXRtYXBfcmxlX29yX3BsYWluKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBibV94ZmVyX2N0eCAqYykKK3NlbmRfYml0bWFwX3JsZV9vcl9wbGFpbihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGJtX3hmZXJfY3R4ICpjKQogewotCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQl1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBkcmJkX2hlYWRlcl9zaXplKG1kZXYtPnRjb25uKTsKKwlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2sgPSAmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBkcmJkX2hlYWRlcl9zaXplKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pOwogCXN0cnVjdCBwX2NvbXByZXNzZWRfYm0gKnAgPSBzb2NrLT5zYnVmICsgaGVhZGVyX3NpemU7CiAJaW50IGxlbiwgZXJyOwogCi0JbGVuID0gZmlsbF9iaXRtYXBfcmxlX2JpdHMobWRldiwgcCwKKwlsZW4gPSBmaWxsX2JpdG1hcF9ybGVfYml0cyhkZXZpY2UsIHAsCiAJCQlEUkJEX1NPQ0tFVF9CVUZGRVJfU0laRSAtIGhlYWRlcl9zaXplIC0gc2l6ZW9mKCpwKSwgYyk7CiAJaWYgKGxlbiA8IDApCiAJCXJldHVybiAtRUlPOwogCiAJaWYgKGxlbikgewogCQlkY2JwX3NldF9jb2RlKHAsIFJMRV9WTElfQml0cyk7Ci0JCWVyciA9IF9fc2VuZF9jb21tYW5kKG1kZXYtPnRjb25uLCBtZGV2LT52bnIsIHNvY2ssCisJCWVyciA9IF9fc2VuZF9jb21tYW5kKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24sIGRldmljZS0+dm5yLCBzb2NrLAogCQkJCSAgICAgUF9DT01QUkVTU0VEX0JJVE1BUCwgc2l6ZW9mKCpwKSArIGxlbiwKIAkJCQkgICAgIE5VTEwsIDApOwogCQljLT5wYWNrZXRzWzBdKys7CkBAIC0xMjA1LDggKzEyMTAsOCBAQAogCQkJCSAgYy0+Ym1fd29yZHMgLSBjLT53b3JkX29mZnNldCk7CiAJCWxlbiA9IG51bV93b3JkcyAqIHNpemVvZigqcCk7CiAJCWlmIChsZW4pCi0JCQlkcmJkX2JtX2dldF9sZWwobWRldiwgYy0+d29yZF9vZmZzZXQsIG51bV93b3JkcywgcCk7Ci0JCWVyciA9IF9fc2VuZF9jb21tYW5kKG1kZXYtPnRjb25uLCBtZGV2LT52bnIsIHNvY2ssIFBfQklUTUFQLCBsZW4sIE5VTEwsIDApOworCQkJZHJiZF9ibV9nZXRfbGVsKGRldmljZSwgYy0+d29yZF9vZmZzZXQsIG51bV93b3JkcywgcCk7CisJCWVyciA9IF9fc2VuZF9jb21tYW5kKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24sIGRldmljZS0+dm5yLCBzb2NrLCBQX0JJVE1BUCwgbGVuLCBOVUxMLCAwKTsKIAkJYy0+d29yZF9vZmZzZXQgKz0gbnVtX3dvcmRzOwogCQljLT5iaXRfb2Zmc2V0ID0gYy0+d29yZF9vZmZzZXQgKiBCSVRTX1BFUl9MT05HOwogCkBAIC0xMjE4LDcgKzEyMjMsNyBAQAogCX0KIAlpZiAoIWVycikgewogCQlpZiAobGVuID09IDApIHsKLQkJCUlORk9fYm1feGZlcl9zdGF0cyhtZGV2LCAic2VuZCIsIGMpOworCQkJSU5GT19ibV94ZmVyX3N0YXRzKGRldmljZSwgInNlbmQiLCBjKTsKIAkJCXJldHVybiAwOwogCQl9IGVsc2UKIAkJCXJldHVybiAxOwpAQCAtMTIyNywxMjggKzEyMzIsMTI4IEBACiB9CiAKIC8qIFNlZSB0aGUgY29tbWVudCBhdCByZWNlaXZlX2JpdG1hcCgpICovCi1zdGF0aWMgaW50IF9kcmJkX3NlbmRfYml0bWFwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW50IF9kcmJkX3NlbmRfYml0bWFwKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBibV94ZmVyX2N0eCBjOwogCWludCBlcnI7CiAKLQlpZiAoIWV4cGVjdChtZGV2LT5iaXRtYXApKQorCWlmICghZXhwZWN0KGRldmljZS0+Yml0bWFwKSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKGdldF9sZGV2KG1kZXYpKSB7Ci0JCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhtZGV2LT5sZGV2LCBNREZfRlVMTF9TWU5DKSkgewotCQkJZGV2X2luZm8oREVWLCAiV3JpdGluZyB0aGUgd2hvbGUgYml0bWFwLCBNREZfRnVsbFN5bmMgd2FzIHNldC5cbiIpOwotCQkJZHJiZF9ibV9zZXRfYWxsKG1kZXYpOwotCQkJaWYgKGRyYmRfYm1fd3JpdGUobWRldikpIHsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlpZiAoZHJiZF9tZF90ZXN0X2ZsYWcoZGV2aWNlLT5sZGV2LCBNREZfRlVMTF9TWU5DKSkgeworCQkJZHJiZF9pbmZvKGRldmljZSwgIldyaXRpbmcgdGhlIHdob2xlIGJpdG1hcCwgTURGX0Z1bGxTeW5jIHdhcyBzZXQuXG4iKTsKKwkJCWRyYmRfYm1fc2V0X2FsbChkZXZpY2UpOworCQkJaWYgKGRyYmRfYm1fd3JpdGUoZGV2aWNlKSkgewogCQkJCS8qIHdyaXRlX2JtIGRpZCBmYWlsISBMZWF2ZSBmdWxsIHN5bmMgZmxhZyBzZXQgaW4gTWV0YSBQX0RBVEEKIAkJCQkgKiBidXQgb3RoZXJ3aXNlIHByb2Nlc3MgYXMgcGVyIG5vcm1hbCAtIG5lZWQgdG8gdGVsbCBvdGhlcgogCQkJCSAqIHNpZGUgdGhhdCBhIGZ1bGwgcmVzeW5jIGlzIHJlcXVpcmVkISAqLwotCQkJCWRldl9lcnIoREVWLCAiRmFpbGVkIHRvIHdyaXRlIGJpdG1hcCB0byBkaXNrIVxuIik7CisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiRmFpbGVkIHRvIHdyaXRlIGJpdG1hcCB0byBkaXNrIVxuIik7CiAJCQl9IGVsc2UgewotCQkJCWRyYmRfbWRfY2xlYXJfZmxhZyhtZGV2LCBNREZfRlVMTF9TWU5DKTsKLQkJCQlkcmJkX21kX3N5bmMobWRldik7CisJCQkJZHJiZF9tZF9jbGVhcl9mbGFnKGRldmljZSwgTURGX0ZVTExfU1lOQyk7CisJCQkJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAJCQl9CiAJCX0KLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJYyA9IChzdHJ1Y3QgYm1feGZlcl9jdHgpIHsKLQkJLmJtX2JpdHMgPSBkcmJkX2JtX2JpdHMobWRldiksCi0JCS5ibV93b3JkcyA9IGRyYmRfYm1fd29yZHMobWRldiksCisJCS5ibV9iaXRzID0gZHJiZF9ibV9iaXRzKGRldmljZSksCisJCS5ibV93b3JkcyA9IGRyYmRfYm1fd29yZHMoZGV2aWNlKSwKIAl9OwogCiAJZG8gewotCQllcnIgPSBzZW5kX2JpdG1hcF9ybGVfb3JfcGxhaW4obWRldiwgJmMpOworCQllcnIgPSBzZW5kX2JpdG1hcF9ybGVfb3JfcGxhaW4oZGV2aWNlLCAmYyk7CiAJfSB3aGlsZSAoZXJyID4gMCk7CiAKIAlyZXR1cm4gZXJyID09IDA7CiB9CiAKLWludCBkcmJkX3NlbmRfYml0bWFwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitpbnQgZHJiZF9zZW5kX2JpdG1hcChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2sgPSAmbWRldi0+dGNvbm4tPmRhdGE7CisJc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrID0gJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmRhdGE7CiAJaW50IGVyciA9IC0xOwogCiAJbXV0ZXhfbG9jaygmc29jay0+bXV0ZXgpOwogCWlmIChzb2NrLT5zb2NrZXQpCi0JCWVyciA9ICFfZHJiZF9zZW5kX2JpdG1hcChtZGV2KTsKKwkJZXJyID0gIV9kcmJkX3NlbmRfYml0bWFwKGRldmljZSk7CiAJbXV0ZXhfdW5sb2NrKCZzb2NrLT5tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KIAotdm9pZCBkcmJkX3NlbmRfYl9hY2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1MzIgYmFycmllcl9uciwgdTMyIHNldF9zaXplKQordm9pZCBkcmJkX3NlbmRfYl9hY2soc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdTMyIGJhcnJpZXJfbnIsIHUzMiBzZXRfc2l6ZSkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfYmFycmllcl9hY2sgKnA7CiAKLQlpZiAodGNvbm4tPmNzdGF0ZSA8IENfV0ZfUkVQT1JUX1BBUkFNUykKKwlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlIDwgQ19XRl9SRVBPUlRfUEFSQU1TKQogCQlyZXR1cm47CiAKLQlzb2NrID0gJnRjb25uLT5tZXRhOwotCXAgPSBjb25uX3ByZXBhcmVfY29tbWFuZCh0Y29ubiwgc29jayk7CisJc29jayA9ICZjb25uZWN0aW9uLT5tZXRhOworCXAgPSBjb25uX3ByZXBhcmVfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrKTsKIAlpZiAoIXApCiAJCXJldHVybjsKIAlwLT5iYXJyaWVyID0gYmFycmllcl9ucjsKIAlwLT5zZXRfc2l6ZSA9IGNwdV90b19iZTMyKHNldF9zaXplKTsKLQljb25uX3NlbmRfY29tbWFuZCh0Y29ubiwgc29jaywgUF9CQVJSSUVSX0FDSywgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CisJY29ubl9zZW5kX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jaywgUF9CQVJSSUVSX0FDSywgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CiB9CiAKIC8qKgogICogX2RyYmRfc2VuZF9hY2soKSAtIFNlbmRzIGFuIGFjayBwYWNrZXQKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQGNtZDoJUGFja2V0IGNvbW1hbmQgY29kZS4KICAqIEBzZWN0b3I6CXNlY3RvciwgbmVlZHMgdG8gYmUgaW4gYmlnIGVuZGlhbiBieXRlIG9yZGVyCiAgKiBAYmxrc2l6ZToJc2l6ZSBpbiBieXRlLCBuZWVkcyB0byBiZSBpbiBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIKICAqIEBibG9ja19pZDoJSWQsIGJpZyBlbmRpYW4gYnl0ZSBvcmRlcgogICovCi1zdGF0aWMgaW50IF9kcmJkX3NlbmRfYWNrKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gZHJiZF9wYWNrZXQgY21kLAorc3RhdGljIGludCBfZHJiZF9zZW5kX2FjayhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIGVudW0gZHJiZF9wYWNrZXQgY21kLAogCQkJICB1NjQgc2VjdG9yLCB1MzIgYmxrc2l6ZSwgdTY0IGJsb2NrX2lkKQogewogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAlzdHJ1Y3QgcF9ibG9ja19hY2sgKnA7CiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKQorCWlmIChwZWVyX2RldmljZS0+ZGV2aWNlLT5zdGF0ZS5jb25uIDwgQ19DT05ORUNURUQpCiAJCXJldHVybiAtRUlPOwogCi0Jc29jayA9ICZtZGV2LT50Y29ubi0+bWV0YTsKLQlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jayk7CisJc29jayA9ICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+bWV0YTsKKwlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87CiAJcC0+c2VjdG9yID0gc2VjdG9yOwogCXAtPmJsb2NrX2lkID0gYmxvY2tfaWQ7CiAJcC0+Ymxrc2l6ZSA9IGJsa3NpemU7Ci0JcC0+c2VxX251bSA9IGNwdV90b19iZTMyKGF0b21pY19pbmNfcmV0dXJuKCZtZGV2LT5wYWNrZXRfc2VxKSk7Ci0JcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKG1kZXYsIHNvY2ssIGNtZCwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CisJcC0+c2VxX251bSA9IGNwdV90b19iZTMyKGF0b21pY19pbmNfcmV0dXJuKCZwZWVyX2RldmljZS0+ZGV2aWNlLT5wYWNrZXRfc2VxKSk7CisJcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBjbWQsIHNpemVvZigqcCksIE5VTEwsIDApOwogfQogCiAvKiBkcC0+c2VjdG9yIGFuZCBkcC0+YmxvY2tfaWQgYWxyZWFkeS9zdGlsbCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIsCiAgKiBkYXRhX3NpemUgaXMgcGF5bG9hZCBzaXplIGFjY29yZGluZyB0byBkcC0+aGVhZCwKICAqIGFuZCBtYXkgbmVlZCB0byBiZSBjb3JyZWN0ZWQgZm9yIGRpZ2VzdCBzaXplLiAqLwotdm9pZCBkcmJkX3NlbmRfYWNrX2RwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gZHJiZF9wYWNrZXQgY21kLAordm9pZCBkcmJkX3NlbmRfYWNrX2RwKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgZW51bSBkcmJkX3BhY2tldCBjbWQsCiAJCSAgICAgIHN0cnVjdCBwX2RhdGEgKmRwLCBpbnQgZGF0YV9zaXplKQogewotCWlmIChtZGV2LT50Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtKQotCQlkYXRhX3NpemUgLT0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShtZGV2LT50Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtKTsKLQlfZHJiZF9zZW5kX2FjayhtZGV2LCBjbWQsIGRwLT5zZWN0b3IsIGNwdV90b19iZTMyKGRhdGFfc2l6ZSksCisJaWYgKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5wZWVyX2ludGVncml0eV90Zm0pCisJCWRhdGFfc2l6ZSAtPSBjcnlwdG9faGFzaF9kaWdlc3RzaXplKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5wZWVyX2ludGVncml0eV90Zm0pOworCV9kcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBjbWQsIGRwLT5zZWN0b3IsIGNwdV90b19iZTMyKGRhdGFfc2l6ZSksCiAJCSAgICAgICBkcC0+YmxvY2tfaWQpOwogfQogCi12b2lkIGRyYmRfc2VuZF9hY2tfcnAoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX3BhY2tldCBjbWQsCit2b2lkIGRyYmRfc2VuZF9hY2tfcnAoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKIAkJICAgICAgc3RydWN0IHBfYmxvY2tfcmVxICpycCkKIHsKLQlfZHJiZF9zZW5kX2FjayhtZGV2LCBjbWQsIHJwLT5zZWN0b3IsIHJwLT5ibGtzaXplLCBycC0+YmxvY2tfaWQpOworCV9kcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBjbWQsIHJwLT5zZWN0b3IsIHJwLT5ibGtzaXplLCBycC0+YmxvY2tfaWQpOwogfQogCiAvKioKICAqIGRyYmRfc2VuZF9hY2soKSAtIFNlbmRzIGFuIGFjayBwYWNrZXQKLSAqIEBtZGV2OglEUkJEIGRldmljZQorICogQGRldmljZToJRFJCRCBkZXZpY2UKICAqIEBjbWQ6CXBhY2tldCBjb21tYW5kIGNvZGUKICAqIEBwZWVyX3JlcToJcGVlciByZXF1ZXN0CiAgKi8KLWludCBkcmJkX3NlbmRfYWNrKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gZHJiZF9wYWNrZXQgY21kLAoraW50IGRyYmRfc2VuZF9hY2soc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKIAkJICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQogewotCXJldHVybiBfZHJiZF9zZW5kX2FjayhtZGV2LCBjbWQsCisJcmV0dXJuIF9kcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBjbWQsCiAJCQkgICAgICBjcHVfdG9fYmU2NChwZWVyX3JlcS0+aS5zZWN0b3IpLAogCQkJICAgICAgY3B1X3RvX2JlMzIocGVlcl9yZXEtPmkuc2l6ZSksCiAJCQkgICAgICBwZWVyX3JlcS0+YmxvY2tfaWQpOwpAQCAtMTM1NiwzMiArMTM2MSwzMiBAQAogCiAvKiBUaGlzIGZ1bmN0aW9uIG1pc3VzZXMgdGhlIGJsb2NrX2lkIGZpZWxkIHRvIHNpZ25hbCBpZiB0aGUgYmxvY2tzCiAgKiBhcmUgaXMgc3luYyBvciBub3QuICovCi1pbnQgZHJiZF9zZW5kX2Fja19leChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKK2ludCBkcmJkX3NlbmRfYWNrX2V4KHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgZW51bSBkcmJkX3BhY2tldCBjbWQsCiAJCSAgICAgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgYmxrc2l6ZSwgdTY0IGJsb2NrX2lkKQogewotCXJldHVybiBfZHJiZF9zZW5kX2FjayhtZGV2LCBjbWQsCisJcmV0dXJuIF9kcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBjbWQsCiAJCQkgICAgICBjcHVfdG9fYmU2NChzZWN0b3IpLAogCQkJICAgICAgY3B1X3RvX2JlMzIoYmxrc2l6ZSksCiAJCQkgICAgICBjcHVfdG9fYmU2NChibG9ja19pZCkpOwogfQogCi1pbnQgZHJiZF9zZW5kX2RyZXF1ZXN0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBjbWQsCitpbnQgZHJiZF9zZW5kX2RyZXF1ZXN0KHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgaW50IGNtZCwKIAkJICAgICAgIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUsIHU2NCBibG9ja19pZCkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfYmxvY2tfcmVxICpwOwogCi0Jc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jayk7CisJc29jayA9ICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87CiAJcC0+c2VjdG9yID0gY3B1X3RvX2JlNjQoc2VjdG9yKTsKIAlwLT5ibG9ja19pZCA9IGJsb2NrX2lkOwogCXAtPmJsa3NpemUgPSBjcHVfdG9fYmUzMihzaXplKTsKLQlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQobWRldiwgc29jaywgY21kLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKKwlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2ssIGNtZCwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CiB9CiAKLWludCBkcmJkX3NlbmRfZHJlcXVlc3RfY3N1bShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplLAoraW50IGRyYmRfc2VuZF9kcmVxdWVzdF9jc3VtKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSwKIAkJCSAgICB2b2lkICpkaWdlc3QsIGludCBkaWdlc3Rfc2l6ZSwgZW51bSBkcmJkX3BhY2tldCBjbWQpCiB7CiAJc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrOwpAQCAtMTM4OSw2NCArMTM5NCw2MyBAQAogCiAJLyogRklYTUU6IFB1dCB0aGUgZGlnZXN0IGludG8gdGhlIHByZWFsbG9jYXRlZCBzb2NrZXQgYnVmZmVyLiAgKi8KIAotCXNvY2sgPSAmbWRldi0+dGNvbm4tPmRhdGE7Ci0JcCA9IGRyYmRfcHJlcGFyZV9jb21tYW5kKG1kZXYsIHNvY2spOworCXNvY2sgPSAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmRhdGE7CisJcCA9IGRyYmRfcHJlcGFyZV9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrKTsKIAlpZiAoIXApCiAJCXJldHVybiAtRUlPOwogCXAtPnNlY3RvciA9IGNwdV90b19iZTY0KHNlY3Rvcik7CiAJcC0+YmxvY2tfaWQgPSBJRF9TWU5DRVIgLyogdW51c2VkICovOwogCXAtPmJsa3NpemUgPSBjcHVfdG9fYmUzMihzaXplKTsKLQlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQobWRldiwgc29jaywgY21kLCBzaXplb2YoKnApLAotCQkJCSBkaWdlc3QsIGRpZ2VzdF9zaXplKTsKKwlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2ssIGNtZCwgc2l6ZW9mKCpwKSwgZGlnZXN0LCBkaWdlc3Rfc2l6ZSk7CiB9CiAKLWludCBkcmJkX3NlbmRfb3ZfcmVxdWVzdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplKQoraW50IGRyYmRfc2VuZF9vdl9yZXF1ZXN0KHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfYmxvY2tfcmVxICpwOwogCi0Jc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jayk7CisJc29jayA9ICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87CiAJcC0+c2VjdG9yID0gY3B1X3RvX2JlNjQoc2VjdG9yKTsKIAlwLT5ibG9ja19pZCA9IElEX1NZTkNFUiAvKiB1bnVzZWQgKi87CiAJcC0+Ymxrc2l6ZSA9IGNwdV90b19iZTMyKHNpemUpOwotCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChtZGV2LCBzb2NrLCBQX09WX1JFUVVFU1QsIHNpemVvZigqcCksIE5VTEwsIDApOworCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChwZWVyX2RldmljZSwgc29jaywgUF9PVl9SRVFVRVNULCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAogLyogY2FsbGVkIG9uIHNuZHRpbWVvCiAgKiByZXR1cm5zIGZhbHNlIGlmIHdlIHNob3VsZCByZXRyeSwKICAqIHRydWUgaWYgd2UgdGhpbmsgY29ubmVjdGlvbiBpcyBkZWFkCiAgKi8KLXN0YXRpYyBpbnQgd2Vfc2hvdWxkX2Ryb3BfdGhlX2Nvbm5lY3Rpb24oc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrKQorc3RhdGljIGludCB3ZV9zaG91bGRfZHJvcF90aGVfY29ubmVjdGlvbihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrKQogewogCWludCBkcm9wX2l0OwotCS8qIGxvbmcgZWxhcHNlZCA9IChsb25nKShqaWZmaWVzIC0gbWRldi0+bGFzdF9yZWNlaXZlZCk7ICovCisJLyogbG9uZyBlbGFwc2VkID0gKGxvbmcpKGppZmZpZXMgLSBkZXZpY2UtPmxhc3RfcmVjZWl2ZWQpOyAqLwogCi0JZHJvcF9pdCA9ICAgdGNvbm4tPm1ldGEuc29ja2V0ID09IHNvY2sKLQkJfHwgIXRjb25uLT5hc2VuZGVyLnRhc2sKLQkJfHwgZ2V0X3Rfc3RhdGUoJnRjb25uLT5hc2VuZGVyKSAhPSBSVU5OSU5HCi0JCXx8IHRjb25uLT5jc3RhdGUgPCBDX1dGX1JFUE9SVF9QQVJBTVM7CisJZHJvcF9pdCA9ICAgY29ubmVjdGlvbi0+bWV0YS5zb2NrZXQgPT0gc29jaworCQl8fCAhY29ubmVjdGlvbi0+YXNlbmRlci50YXNrCisJCXx8IGdldF90X3N0YXRlKCZjb25uZWN0aW9uLT5hc2VuZGVyKSAhPSBSVU5OSU5HCisJCXx8IGNvbm5lY3Rpb24tPmNzdGF0ZSA8IENfV0ZfUkVQT1JUX1BBUkFNUzsKIAogCWlmIChkcm9wX2l0KQogCQlyZXR1cm4gdHJ1ZTsKIAotCWRyb3BfaXQgPSAhLS10Y29ubi0+a29fY291bnQ7CisJZHJvcF9pdCA9ICEtLWNvbm5lY3Rpb24tPmtvX2NvdW50OwogCWlmICghZHJvcF9pdCkgewotCQljb25uX2Vycih0Y29ubiwgIlslcy8lZF0gc29ja19zZW5kbXNnIHRpbWUgZXhwaXJlZCwga28gPSAldVxuIiwKLQkJCSBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHRjb25uLT5rb19jb3VudCk7Ci0JCXJlcXVlc3RfcGluZyh0Y29ubik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJbJXMvJWRdIHNvY2tfc2VuZG1zZyB0aW1lIGV4cGlyZWQsIGtvID0gJXVcbiIsCisJCQkgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBjb25uZWN0aW9uLT5rb19jb3VudCk7CisJCXJlcXVlc3RfcGluZyhjb25uZWN0aW9uKTsKIAl9CiAKLQlyZXR1cm4gZHJvcF9pdDsgLyogJiYgKG1kZXYtPnN0YXRlID09IFJfUFJJTUFSWSkgKi87CisJcmV0dXJuIGRyb3BfaXQ7IC8qICYmIChkZXZpY2UtPnN0YXRlID09IFJfUFJJTUFSWSkgKi87CiB9CiAKLXN0YXRpYyB2b2lkIGRyYmRfdXBkYXRlX2Nvbmdlc3RlZChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitzdGF0aWMgdm9pZCBkcmJkX3VwZGF0ZV9jb25nZXN0ZWQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKLQlzdHJ1Y3Qgc29jayAqc2sgPSB0Y29ubi0+ZGF0YS5zb2NrZXQtPnNrOworCXN0cnVjdCBzb2NrICpzayA9IGNvbm5lY3Rpb24tPmRhdGEuc29ja2V0LT5zazsKIAlpZiAoc2stPnNrX3dtZW1fcXVldWVkID4gc2stPnNrX3NuZGJ1ZiAqIDQgLyA1KQotCQlzZXRfYml0KE5FVF9DT05HRVNURUQsICZ0Y29ubi0+ZmxhZ3MpOworCQlzZXRfYml0KE5FVF9DT05HRVNURUQsICZjb25uZWN0aW9uLT5mbGFncyk7CiB9CiAKIC8qIFRoZSBpZGVhIG9mIHNlbmRwYWdlIHNlZW1zIHRvIGJlIHRvIHB1dCBzb21lIGtpbmQgb2YgcmVmZXJlbmNlCkBAIC0xNDcwLDI2ICsxNDc0LDI2IEBACiAgKiBBcyBhIHdvcmthcm91bmQsIHdlIGRpc2FibGUgc2VuZHBhZ2Ugb24gcGFnZXMKICAqIHdpdGggcGFnZV9jb3VudCA9PSAwIG9yIFBhZ2VTbGFiLgogICovCi1zdGF0aWMgaW50IF9kcmJkX25vX3NlbmRfcGFnZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKK3N0YXRpYyBpbnQgX2RyYmRfbm9fc2VuZF9wYWdlKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQkgICAgICBpbnQgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgbXNnX2ZsYWdzKQogewogCXN0cnVjdCBzb2NrZXQgKnNvY2tldDsKIAl2b2lkICphZGRyOwogCWludCBlcnI7CiAKLQlzb2NrZXQgPSBtZGV2LT50Y29ubi0+ZGF0YS5zb2NrZXQ7CisJc29ja2V0ID0gcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmRhdGEuc29ja2V0OwogCWFkZHIgPSBrbWFwKHBhZ2UpICsgb2Zmc2V0OwotCWVyciA9IGRyYmRfc2VuZF9hbGwobWRldi0+dGNvbm4sIHNvY2tldCwgYWRkciwgc2l6ZSwgbXNnX2ZsYWdzKTsKKwllcnIgPSBkcmJkX3NlbmRfYWxsKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBzb2NrZXQsIGFkZHIsIHNpemUsIG1zZ19mbGFncyk7CiAJa3VubWFwKHBhZ2UpOwogCWlmICghZXJyKQotCQltZGV2LT5zZW5kX2NudCArPSBzaXplID4+IDk7CisJCXBlZXJfZGV2aWNlLT5kZXZpY2UtPnNlbmRfY250ICs9IHNpemUgPj4gOTsKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9kcmJkX3NlbmRfcGFnZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKK3N0YXRpYyBpbnQgX2RyYmRfc2VuZF9wYWdlKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCSAgICBpbnQgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgbXNnX2ZsYWdzKQogewotCXN0cnVjdCBzb2NrZXQgKnNvY2tldCA9IG1kZXYtPnRjb25uLT5kYXRhLnNvY2tldDsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrZXQgPSBwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZGF0YS5zb2NrZXQ7CiAJbW1fc2VnbWVudF90IG9sZGZzID0gZ2V0X2ZzKCk7CiAJaW50IGxlbiA9IHNpemU7CiAJaW50IGVyciA9IC1FSU87CkBAIC0xNTAxLDEwICsxNTA1LDEwIEBACiAJICogX19wYWdlX2NhY2hlX3JlbGVhc2UgYSBwYWdlIHRoYXQgd291bGQgYWN0dWFsbHkgc3RpbGwgYmUgcmVmZXJlbmNlZAogCSAqIGJ5IHNvbWVvbmUsIGxlYWRpbmcgdG8gc29tZSBvYnNjdXJlIGRlbGF5ZWQgT29wcyBzb21ld2hlcmUgZWxzZS4gKi8KIAlpZiAoZGlzYWJsZV9zZW5kcGFnZSB8fCAocGFnZV9jb3VudChwYWdlKSA8IDEpIHx8IFBhZ2VTbGFiKHBhZ2UpKQotCQlyZXR1cm4gX2RyYmRfbm9fc2VuZF9wYWdlKG1kZXYsIHBhZ2UsIG9mZnNldCwgc2l6ZSwgbXNnX2ZsYWdzKTsKKwkJcmV0dXJuIF9kcmJkX25vX3NlbmRfcGFnZShwZWVyX2RldmljZSwgcGFnZSwgb2Zmc2V0LCBzaXplLCBtc2dfZmxhZ3MpOwogCiAJbXNnX2ZsYWdzIHw9IE1TR19OT1NJR05BTDsKLQlkcmJkX3VwZGF0ZV9jb25nZXN0ZWQobWRldi0+dGNvbm4pOworCWRyYmRfdXBkYXRlX2Nvbmdlc3RlZChwZWVyX2RldmljZS0+Y29ubmVjdGlvbik7CiAJc2V0X2ZzKEtFUk5FTF9EUyk7CiAJZG8gewogCQlpbnQgc2VudDsKQEAgLTE1MTIsMTEgKzE1MTYsMTEgQEAKIAkJc2VudCA9IHNvY2tldC0+b3BzLT5zZW5kcGFnZShzb2NrZXQsIHBhZ2UsIG9mZnNldCwgbGVuLCBtc2dfZmxhZ3MpOwogCQlpZiAoc2VudCA8PSAwKSB7CiAJCQlpZiAoc2VudCA9PSAtRUFHQUlOKSB7Ci0JCQkJaWYgKHdlX3Nob3VsZF9kcm9wX3RoZV9jb25uZWN0aW9uKG1kZXYtPnRjb25uLCBzb2NrZXQpKQorCQkJCWlmICh3ZV9zaG91bGRfZHJvcF90aGVfY29ubmVjdGlvbihwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgc29ja2V0KSkKIAkJCQkJYnJlYWs7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlkZXZfd2FybihERVYsICIlczogc2l6ZT0lZCBsZW49JWQgc2VudD0lZFxuIiwKKwkJCWRyYmRfd2FybihwZWVyX2RldmljZS0+ZGV2aWNlLCAiJXM6IHNpemU9JWQgbGVuPSVkIHNlbnQ9JWRcbiIsCiAJCQkgICAgIF9fZnVuY19fLCAoaW50KXNpemUsIGxlbiwgc2VudCk7CiAJCQlpZiAoc2VudCA8IDApCiAJCQkJZXJyID0gc2VudDsKQEAgLTE1MjQsMTggKzE1MjgsMTggQEAKIAkJfQogCQlsZW4gICAgLT0gc2VudDsKIAkJb2Zmc2V0ICs9IHNlbnQ7Ci0JfSB3aGlsZSAobGVuID4gMCAvKiBUSElOSyAmJiBtZGV2LT5jc3RhdGUgPj0gQ19DT05ORUNURUQqLyk7CisJfSB3aGlsZSAobGVuID4gMCAvKiBUSElOSyAmJiBkZXZpY2UtPmNzdGF0ZSA+PSBDX0NPTk5FQ1RFRCovKTsKIAlzZXRfZnMob2xkZnMpOwotCWNsZWFyX2JpdChORVRfQ09OR0VTVEVELCAmbWRldi0+dGNvbm4tPmZsYWdzKTsKKwljbGVhcl9iaXQoTkVUX0NPTkdFU1RFRCwgJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5mbGFncyk7CiAKIAlpZiAobGVuID09IDApIHsKIAkJZXJyID0gMDsKLQkJbWRldi0+c2VuZF9jbnQgKz0gc2l6ZSA+PiA5OworCQlwZWVyX2RldmljZS0+ZGV2aWNlLT5zZW5kX2NudCArPSBzaXplID4+IDk7CiAJfQogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX2RyYmRfc2VuZF9iaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGJpbyAqYmlvKQorc3RhdGljIGludCBfZHJiZF9zZW5kX2JpbyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgYmlvX3ZlYyBidmVjOwogCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKQEAgLTE1NDQsNyArMTU0OCw3IEBACiAJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpdGVyKSB7CiAJCWludCBlcnI7CiAKLQkJZXJyID0gX2RyYmRfbm9fc2VuZF9wYWdlKG1kZXYsIGJ2ZWMuYnZfcGFnZSwKKwkJZXJyID0gX2RyYmRfbm9fc2VuZF9wYWdlKHBlZXJfZGV2aWNlLCBidmVjLmJ2X3BhZ2UsCiAJCQkJCSBidmVjLmJ2X29mZnNldCwgYnZlYy5idl9sZW4sCiAJCQkJCSBiaW9faXRlcl9sYXN0KGJ2ZWMsIGl0ZXIpCiAJCQkJCSA/IDAgOiBNU0dfTU9SRSk7CkBAIC0xNTU0LDcgKzE1NTgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9kcmJkX3NlbmRfemNfYmlvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyBpbnQgX2RyYmRfc2VuZF96Y19iaW8oc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IGJpb192ZWMgYnZlYzsKIAlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CkBAIC0xNTYzLDcgKzE1NjcsNyBAQAogCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaXRlcikgewogCQlpbnQgZXJyOwogCi0JCWVyciA9IF9kcmJkX3NlbmRfcGFnZShtZGV2LCBidmVjLmJ2X3BhZ2UsCisJCWVyciA9IF9kcmJkX3NlbmRfcGFnZShwZWVyX2RldmljZSwgYnZlYy5idl9wYWdlLAogCQkJCSAgICAgIGJ2ZWMuYnZfb2Zmc2V0LCBidmVjLmJ2X2xlbiwKIAkJCQkgICAgICBiaW9faXRlcl9sYXN0KGJ2ZWMsIGl0ZXIpID8gMCA6IE1TR19NT1JFKTsKIAkJaWYgKGVycikKQEAgLTE1NzIsNyArMTU3Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX2RyYmRfc2VuZF96Y19lZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIGludCBfZHJiZF9zZW5kX3pjX2VlKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwKIAkJCSAgICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQogewogCXN0cnVjdCBwYWdlICpwYWdlID0gcGVlcl9yZXEtPnBhZ2VzOwpAQCAtMTU4Myw3ICsxNTg3LDcgQEAKIAlwYWdlX2NoYWluX2Zvcl9lYWNoKHBhZ2UpIHsKIAkJdW5zaWduZWQgbCA9IG1pbl90KHVuc2lnbmVkLCBsZW4sIFBBR0VfU0laRSk7CiAKLQkJZXJyID0gX2RyYmRfc2VuZF9wYWdlKG1kZXYsIHBhZ2UsIDAsIGwsCisJCWVyciA9IF9kcmJkX3NlbmRfcGFnZShwZWVyX2RldmljZSwgcGFnZSwgMCwgbCwKIAkJCQkgICAgICBwYWdlX2NoYWluX25leHQocGFnZSkgPyBNU0dfTU9SRSA6IDApOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKQEAgLTE1OTIsOSArMTU5Niw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1MzIgYmlvX2ZsYWdzX3RvX3dpcmUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBiaV9ydykKK3N0YXRpYyB1MzIgYmlvX2ZsYWdzX3RvX3dpcmUoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdW5zaWduZWQgbG9uZyBiaV9ydykKIHsKLQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA5NSkKKwlpZiAoY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDk1KQogCQlyZXR1cm4gIChiaV9ydyAmIFJFUV9TWU5DID8gRFBfUldfU1lOQyA6IDApIHwKIAkJCShiaV9ydyAmIFJFUV9GVUEgPyBEUF9GVUEgOiAwKSB8CiAJCQkoYmlfcncgJiBSRVFfRkxVU0ggPyBEUF9GTFVTSCA6IDApIHwKQEAgLTE2MDYsMjggKzE2MTAsMzAgQEAKIC8qIFVzZWQgdG8gc2VuZCB3cml0ZSByZXF1ZXN0cwogICogUl9QUklNQVJZIC0+IFBlZXIJKFBfREFUQSkKICAqLwotaW50IGRyYmRfc2VuZF9kYmxvY2soc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKQoraW50IGRyYmRfc2VuZF9kYmxvY2soc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAlzdHJ1Y3QgcF9kYXRhICpwOwogCXVuc2lnbmVkIGludCBkcF9mbGFncyA9IDA7CiAJaW50IGRnczsKIAlpbnQgZXJyOwogCi0Jc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jayk7Ci0JZGdzID0gbWRldi0+dGNvbm4tPmludGVncml0eV90Zm0gPyBjcnlwdG9faGFzaF9kaWdlc3RzaXplKG1kZXYtPnRjb25uLT5pbnRlZ3JpdHlfdGZtKSA6IDA7CisJc29jayA9ICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2spOworCWRncyA9IHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5pbnRlZ3JpdHlfdGZtID8KKwkgICAgICBjcnlwdG9faGFzaF9kaWdlc3RzaXplKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5pbnRlZ3JpdHlfdGZtKSA6IDA7CiAKIAlpZiAoIXApCiAJCXJldHVybiAtRUlPOwogCXAtPnNlY3RvciA9IGNwdV90b19iZTY0KHJlcS0+aS5zZWN0b3IpOwogCXAtPmJsb2NrX2lkID0gKHVuc2lnbmVkIGxvbmcpcmVxOwotCXAtPnNlcV9udW0gPSBjcHVfdG9fYmUzMihhdG9taWNfaW5jX3JldHVybigmbWRldi0+cGFja2V0X3NlcSkpOwotCWRwX2ZsYWdzID0gYmlvX2ZsYWdzX3RvX3dpcmUobWRldiwgcmVxLT5tYXN0ZXJfYmlvLT5iaV9ydyk7Ci0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPj0gQ19TWU5DX1NPVVJDRSAmJgotCSAgICBtZGV2LT5zdGF0ZS5jb25uIDw9IENfUEFVU0VEX1NZTkNfVCkKKwlwLT5zZXFfbnVtID0gY3B1X3RvX2JlMzIoYXRvbWljX2luY19yZXR1cm4oJmRldmljZS0+cGFja2V0X3NlcSkpOworCWRwX2ZsYWdzID0gYmlvX2ZsYWdzX3RvX3dpcmUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24sIHJlcS0+bWFzdGVyX2Jpby0+YmlfcncpOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPj0gQ19TWU5DX1NPVVJDRSAmJgorCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPD0gQ19QQVVTRURfU1lOQ19UKQogCQlkcF9mbGFncyB8PSBEUF9NQVlfU0VUX0lOX1NZTkM7Ci0JaWYgKG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gMTAwKSB7CisJaWYgKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gMTAwKSB7CiAJCWlmIChyZXEtPnJxX3N0YXRlICYgUlFfRVhQX1JFQ0VJVkVfQUNLKQogCQkJZHBfZmxhZ3MgfD0gRFBfU0VORF9SRUNFSVZFX0FDSzsKIAkJaWYgKHJlcS0+cnFfc3RhdGUgJiBSUV9FWFBfV1JJVEVfQUNLKQpAQCAtMTYzNSw4ICsxNjQxLDggQEAKIAl9CiAJcC0+ZHBfZmxhZ3MgPSBjcHVfdG9fYmUzMihkcF9mbGFncyk7CiAJaWYgKGRncykKLQkJZHJiZF9jc3VtX2JpbyhtZGV2LCBtZGV2LT50Y29ubi0+aW50ZWdyaXR5X3RmbSwgcmVxLT5tYXN0ZXJfYmlvLCBwICsgMSk7Ci0JZXJyID0gX19zZW5kX2NvbW1hbmQobWRldi0+dGNvbm4sIG1kZXYtPnZuciwgc29jaywgUF9EQVRBLCBzaXplb2YoKnApICsgZGdzLCBOVUxMLCByZXEtPmkuc2l6ZSk7CisJCWRyYmRfY3N1bV9iaW8ocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmludGVncml0eV90Zm0sIHJlcS0+bWFzdGVyX2JpbywgcCArIDEpOworCWVyciA9IF9fc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBkZXZpY2UtPnZuciwgc29jaywgUF9EQVRBLCBzaXplb2YoKnApICsgZGdzLCBOVUxMLCByZXEtPmkuc2l6ZSk7CiAJaWYgKCFlcnIpIHsKIAkJLyogRm9yIHByb3RvY29sIEEsIHdlIGhhdmUgdG8gbWVtY3B5IHRoZSBwYXlsb2FkIGludG8KIAkJICogc29ja2V0IGJ1ZmZlcnMsIGFzIHdlIG1heSBjb21wbGV0ZSByaWdodCBhd2F5CkBAIC0xNjUwLDE4ICsxNjU2LDE4IEBACiAJCSAqIHJlY2VpdmluZyBzaWRlLCB3ZSBzdXJlIGhhdmUgZGV0ZWN0ZWQgY29ycnVwdGlvbiBlbHNld2hlcmUuCiAJCSAqLwogCQlpZiAoIShyZXEtPnJxX3N0YXRlICYgKFJRX0VYUF9SRUNFSVZFX0FDSyB8IFJRX0VYUF9XUklURV9BQ0spKSB8fCBkZ3MpCi0JCQllcnIgPSBfZHJiZF9zZW5kX2JpbyhtZGV2LCByZXEtPm1hc3Rlcl9iaW8pOworCQkJZXJyID0gX2RyYmRfc2VuZF9iaW8ocGVlcl9kZXZpY2UsIHJlcS0+bWFzdGVyX2Jpbyk7CiAJCWVsc2UKLQkJCWVyciA9IF9kcmJkX3NlbmRfemNfYmlvKG1kZXYsIHJlcS0+bWFzdGVyX2Jpbyk7CisJCQllcnIgPSBfZHJiZF9zZW5kX3pjX2JpbyhwZWVyX2RldmljZSwgcmVxLT5tYXN0ZXJfYmlvKTsKIAogCQkvKiBkb3VibGUgY2hlY2sgZGlnZXN0LCBzb21ldGltZXMgYnVmZmVycyBoYXZlIGJlZW4gbW9kaWZpZWQgaW4gZmxpZ2h0LiAqLwogCQlpZiAoZGdzID4gMCAmJiBkZ3MgPD0gNjQpIHsKIAkJCS8qIDY0IGJ5dGUsIDUxMiBiaXQsIGlzIHRoZSBsYXJnZXN0IGRpZ2VzdCBzaXplCiAJCQkgKiBjdXJyZW50bHkgc3VwcG9ydGVkIGluIGtlcm5lbCBjcnlwdG8uICovCiAJCQl1bnNpZ25lZCBjaGFyIGRpZ2VzdFs2NF07Ci0JCQlkcmJkX2NzdW1fYmlvKG1kZXYsIG1kZXYtPnRjb25uLT5pbnRlZ3JpdHlfdGZtLCByZXEtPm1hc3Rlcl9iaW8sIGRpZ2VzdCk7CisJCQlkcmJkX2NzdW1fYmlvKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5pbnRlZ3JpdHlfdGZtLCByZXEtPm1hc3Rlcl9iaW8sIGRpZ2VzdCk7CiAJCQlpZiAobWVtY21wKHAgKyAxLCBkaWdlc3QsIGRncykpIHsKLQkJCQlkZXZfd2FybihERVYsCisJCQkJZHJiZF93YXJuKGRldmljZSwKIAkJCQkJIkRpZ2VzdCBtaXNtYXRjaCwgYnVmZmVyIG1vZGlmaWVkIGJ5IHVwcGVyIGxheWVycyBkdXJpbmcgd3JpdGU6ICVsbHVzICsldVxuIiwKIAkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZXEtPmkuc2VjdG9yLCByZXEtPmkuc2l6ZSk7CiAJCQl9CkBAIC0xNjc4LDE4ICsxNjg0LDIwIEBACiAgKiAgUGVlciAgICAgICAtPiAoZGlza2xlc3MpIFJfUFJJTUFSWSAgIChQX0RBVEFfUkVQTFkpCiAgKiAgQ19TWU5DX1NPVVJDRSAtPiBDX1NZTkNfVEFSR0VUICAgICAgICAgKFBfUlNfREFUQV9SRVBMWSkKICAqLwotaW50IGRyYmRfc2VuZF9ibG9jayhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKK2ludCBkcmJkX3NlbmRfYmxvY2soc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKIAkJICAgIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAlzdHJ1Y3QgcF9kYXRhICpwOwogCWludCBlcnI7CiAJaW50IGRnczsKIAotCXNvY2sgPSAmbWRldi0+dGNvbm4tPmRhdGE7Ci0JcCA9IGRyYmRfcHJlcGFyZV9jb21tYW5kKG1kZXYsIHNvY2spOworCXNvY2sgPSAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmRhdGE7CisJcCA9IGRyYmRfcHJlcGFyZV9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrKTsKIAotCWRncyA9IG1kZXYtPnRjb25uLT5pbnRlZ3JpdHlfdGZtID8gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShtZGV2LT50Y29ubi0+aW50ZWdyaXR5X3RmbSkgOiAwOworCWRncyA9IHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5pbnRlZ3JpdHlfdGZtID8KKwkgICAgICBjcnlwdG9faGFzaF9kaWdlc3RzaXplKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5pbnRlZ3JpdHlfdGZtKSA6IDA7CiAKIAlpZiAoIXApCiAJCXJldHVybiAtRUlPOwpAQCAtMTY5OCwyNyArMTcwNiwyNyBAQAogCXAtPnNlcV9udW0gPSAwOyAgLyogdW51c2VkICovCiAJcC0+ZHBfZmxhZ3MgPSAwOwogCWlmIChkZ3MpCi0JCWRyYmRfY3N1bV9lZShtZGV2LCBtZGV2LT50Y29ubi0+aW50ZWdyaXR5X3RmbSwgcGVlcl9yZXEsIHAgKyAxKTsKLQllcnIgPSBfX3NlbmRfY29tbWFuZChtZGV2LT50Y29ubiwgbWRldi0+dm5yLCBzb2NrLCBjbWQsIHNpemVvZigqcCkgKyBkZ3MsIE5VTEwsIHBlZXJfcmVxLT5pLnNpemUpOworCQlkcmJkX2NzdW1fZWUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmludGVncml0eV90Zm0sIHBlZXJfcmVxLCBwICsgMSk7CisJZXJyID0gX19zZW5kX2NvbW1hbmQocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24sIGRldmljZS0+dm5yLCBzb2NrLCBjbWQsIHNpemVvZigqcCkgKyBkZ3MsIE5VTEwsIHBlZXJfcmVxLT5pLnNpemUpOwogCWlmICghZXJyKQotCQllcnIgPSBfZHJiZF9zZW5kX3pjX2VlKG1kZXYsIHBlZXJfcmVxKTsKKwkJZXJyID0gX2RyYmRfc2VuZF96Y19lZShwZWVyX2RldmljZSwgcGVlcl9yZXEpOwogCW11dGV4X3VubG9jaygmc29jay0+bXV0ZXgpOyAgLyogbG9ja2VkIGJ5IGRyYmRfcHJlcGFyZV9jb21tYW5kKCkgKi8KIAogCXJldHVybiBlcnI7CiB9CiAKLWludCBkcmJkX3NlbmRfb3V0X29mX3N5bmMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKQoraW50IGRyYmRfc2VuZF9vdXRfb2Zfc3luYyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfYmxvY2tfZGVzYyAqcDsKIAotCXNvY2sgPSAmbWRldi0+dGNvbm4tPmRhdGE7Ci0JcCA9IGRyYmRfcHJlcGFyZV9jb21tYW5kKG1kZXYsIHNvY2spOworCXNvY2sgPSAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmRhdGE7CisJcCA9IGRyYmRfcHJlcGFyZV9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrKTsKIAlpZiAoIXApCiAJCXJldHVybiAtRUlPOwogCXAtPnNlY3RvciA9IGNwdV90b19iZTY0KHJlcS0+aS5zZWN0b3IpOwogCXAtPmJsa3NpemUgPSBjcHVfdG9fYmUzMihyZXEtPmkuc2l6ZSk7Ci0JcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKG1kZXYsIHNvY2ssIFBfT1VUX09GX1NZTkMsIHNpemVvZigqcCksIE5VTEwsIDApOworCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChwZWVyX2RldmljZSwgc29jaywgUF9PVVRfT0ZfU1lOQywgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CiB9CiAKIC8qCkBAIC0xNzM3LDcgKzE3NDUsNyBAQAogLyoKICAqIHlvdSBtdXN0IGhhdmUgZG93bigpZWQgdGhlIGFwcHJvcHJpYXRlIFttXXNvY2tfbXV0ZXggZWxzZXdoZXJlIQogICovCi1pbnQgZHJiZF9zZW5kKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHNvY2tldCAqc29jaywKK2ludCBkcmJkX3NlbmQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHNvY2tldCAqc29jaywKIAkgICAgICB2b2lkICpidWYsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBtc2dfZmxhZ3MpCiB7CiAJc3RydWN0IGt2ZWMgaW92OwpAQCAtMTc1OCwxMSArMTc2NiwxMSBAQAogCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CiAJbXNnLm1zZ19mbGFncyAgICAgID0gbXNnX2ZsYWdzIHwgTVNHX05PU0lHTkFMOwogCi0JaWYgKHNvY2sgPT0gdGNvbm4tPmRhdGEuc29ja2V0KSB7CisJaWYgKHNvY2sgPT0gY29ubmVjdGlvbi0+ZGF0YS5zb2NrZXQpIHsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQl0Y29ubi0+a29fY291bnQgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKS0+a29fY291bnQ7CisJCWNvbm5lY3Rpb24tPmtvX2NvdW50ID0gcmN1X2RlcmVmZXJlbmNlKGNvbm5lY3Rpb24tPm5ldF9jb25mKS0+a29fY291bnQ7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlkcmJkX3VwZGF0ZV9jb25nZXN0ZWQodGNvbm4pOworCQlkcmJkX3VwZGF0ZV9jb25nZXN0ZWQoY29ubmVjdGlvbik7CiAJfQogCWRvIHsKIAkJLyogU1RSQU5HRQpAQCAtMTc3Niw3ICsxNzg0LDcgQEAKICAqLwogCQlydiA9IGtlcm5lbF9zZW5kbXNnKHNvY2ssICZtc2csICZpb3YsIDEsIHNpemUpOwogCQlpZiAocnYgPT0gLUVBR0FJTikgewotCQkJaWYgKHdlX3Nob3VsZF9kcm9wX3RoZV9jb25uZWN0aW9uKHRjb25uLCBzb2NrKSkKKwkJCWlmICh3ZV9zaG91bGRfZHJvcF90aGVfY29ubmVjdGlvbihjb25uZWN0aW9uLCBzb2NrKSkKIAkJCQlicmVhazsKIAkJCWVsc2UKIAkJCQljb250aW51ZTsKQEAgLTE3OTIsMTcgKzE4MDAsMTcgQEAKIAkJaW92Lmlvdl9sZW4gIC09IHJ2OwogCX0gd2hpbGUgKHNlbnQgPCBzaXplKTsKIAotCWlmIChzb2NrID09IHRjb25uLT5kYXRhLnNvY2tldCkKLQkJY2xlYXJfYml0KE5FVF9DT05HRVNURUQsICZ0Y29ubi0+ZmxhZ3MpOworCWlmIChzb2NrID09IGNvbm5lY3Rpb24tPmRhdGEuc29ja2V0KQorCQljbGVhcl9iaXQoTkVUX0NPTkdFU1RFRCwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAogCWlmIChydiA8PSAwKSB7CiAJCWlmIChydiAhPSAtRUFHQUlOKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgIiVzX3NlbmRtc2cgcmV0dXJuZWQgJWRcbiIsCi0JCQkJIHNvY2sgPT0gdGNvbm4tPm1ldGEuc29ja2V0ID8gIm1zb2NrIiA6ICJzb2NrIiwKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICIlc19zZW5kbXNnIHJldHVybmVkICVkXG4iLAorCQkJCSBzb2NrID09IGNvbm5lY3Rpb24tPm1ldGEuc29ja2V0ID8gIm1zb2NrIiA6ICJzb2NrIiwKIAkJCQkgcnYpOwotCQkJY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX0JST0tFTl9QSVBFKSwgQ1NfSEFSRCk7CisJCQljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19CUk9LRU5fUElQRSksIENTX0hBUkQpOwogCQl9IGVsc2UKLQkJCWNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19USU1FT1VUKSwgQ1NfSEFSRCk7CisJCQljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19USU1FT1VUKSwgQ1NfSEFSRCk7CiAJfQogCiAJcmV0dXJuIHNlbnQ7CkBAIC0xODEzLDEyICsxODIxLDEyIEBACiAgKgogICogUmV0dXJucyAwIHVwb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciB2YWx1ZSBvdGhlcndpc2UuCiAgKi8KLWludCBkcmJkX3NlbmRfYWxsKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHNvY2tldCAqc29jaywgdm9pZCAqYnVmZmVyLAoraW50IGRyYmRfc2VuZF9hbGwoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHNvY2tldCAqc29jaywgdm9pZCAqYnVmZmVyLAogCQkgIHNpemVfdCBzaXplLCB1bnNpZ25lZCBtc2dfZmxhZ3MpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IGRyYmRfc2VuZCh0Y29ubiwgc29jaywgYnVmZmVyLCBzaXplLCBtc2dfZmxhZ3MpOworCWVyciA9IGRyYmRfc2VuZChjb25uZWN0aW9uLCBzb2NrLCBidWZmZXIsIHNpemUsIG1zZ19mbGFncyk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJaWYgKGVyciAhPSBzaXplKQpAQCAtMTgyOCwxNiArMTgzNiwxNiBAQAogCiBzdGF0aWMgaW50IGRyYmRfb3BlbihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBydiA9IDA7CiAKIAltdXRleF9sb2NrKCZkcmJkX21haW5fbXV0ZXgpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKLQkvKiB0byBoYXZlIGEgc3RhYmxlIG1kZXYtPnN0YXRlLnJvbGUKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKKwkvKiB0byBoYXZlIGEgc3RhYmxlIGRldmljZS0+c3RhdGUucm9sZQogCSAqIGFuZCBubyByYWNlIHdpdGggdXBkYXRpbmcgb3Blbl9jbnQgKi8KIAotCWlmIChtZGV2LT5zdGF0ZS5yb2xlICE9IFJfUFJJTUFSWSkgeworCWlmIChkZXZpY2UtPnN0YXRlLnJvbGUgIT0gUl9QUklNQVJZKSB7CiAJCWlmIChtb2RlICYgRk1PREVfV1JJVEUpCiAJCQlydiA9IC1FUk9GUzsKIAkJZWxzZSBpZiAoIWFsbG93X29vcykKQEAgLTE4NDUsOCArMTg1Myw4IEBACiAJfQogCiAJaWYgKCFydikKLQkJbWRldi0+b3Blbl9jbnQrKzsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKKwkJZGV2aWNlLT5vcGVuX2NudCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CiAJbXV0ZXhfdW5sb2NrKCZkcmJkX21haW5fbXV0ZXgpOwogCiAJcmV0dXJuIHJ2OwpAQCAtMTg1NCwxNyArMTg2MiwxNyBAQAogCiBzdGF0aWMgdm9pZCBkcmJkX3JlbGVhc2Uoc3RydWN0IGdlbmRpc2sgKmdkLCBmbW9kZV90IG1vZGUpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IGdkLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBnZC0+cHJpdmF0ZV9kYXRhOwogCW11dGV4X2xvY2soJmRyYmRfbWFpbl9tdXRleCk7Ci0JbWRldi0+b3Blbl9jbnQtLTsKKwlkZXZpY2UtPm9wZW5fY250LS07CiAJbXV0ZXhfdW5sb2NrKCZkcmJkX21haW5fbXV0ZXgpOwogfQogCi1zdGF0aWMgdm9pZCBkcmJkX3NldF9kZWZhdWx0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIHZvaWQgZHJiZF9zZXRfZGVmYXVsdHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJLyogQmV3YXJlISBUaGUgYWN0dWFsIGxheW91dCBkaWZmZXJzCiAJICogYmV0d2VlbiBiaWcgZW5kaWFuIGFuZCBsaXR0bGUgZW5kaWFuICovCi0JbWRldi0+c3RhdGUgPSAodW5pb24gZHJiZF9kZXZfc3RhdGUpIHsKKwlkZXZpY2UtPnN0YXRlID0gKHVuaW9uIGRyYmRfZGV2X3N0YXRlKSB7CiAJCXsgLnJvbGUgPSBSX1NFQ09OREFSWSwKIAkJICAucGVlciA9IFJfVU5LTk9XTiwKIAkJICAuY29ubiA9IENfU1RBTkRBTE9ORSwKQEAgLTE4NzMsMTMwICsxODgxLDEyMyBAQAogCQl9IH07CiB9CiAKLXZvaWQgZHJiZF9pbml0X3NldF9kZWZhdWx0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX2luaXRfc2V0X2RlZmF1bHRzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCS8qIHRoZSBtZW1zZXQoLDAsKSBkaWQgbW9zdCBvZiB0aGlzLgogCSAqIG5vdGU6IG9ubHkgYXNzaWdubWVudHMsIG5vIGFsbG9jYXRpb24gaW4gaGVyZSAqLwogCi0JZHJiZF9zZXRfZGVmYXVsdHMobWRldik7CisJZHJiZF9zZXRfZGVmYXVsdHMoZGV2aWNlKTsKIAotCWF0b21pY19zZXQoJm1kZXYtPmFwX2Jpb19jbnQsIDApOwotCWF0b21pY19zZXQoJm1kZXYtPmFwX3BlbmRpbmdfY250LCAwKTsKLQlhdG9taWNfc2V0KCZtZGV2LT5yc19wZW5kaW5nX2NudCwgMCk7Ci0JYXRvbWljX3NldCgmbWRldi0+dW5hY2tlZF9jbnQsIDApOwotCWF0b21pY19zZXQoJm1kZXYtPmxvY2FsX2NudCwgMCk7Ci0JYXRvbWljX3NldCgmbWRldi0+cHBfaW5fdXNlX2J5X25ldCwgMCk7Ci0JYXRvbWljX3NldCgmbWRldi0+cnNfc2VjdF9pbiwgMCk7Ci0JYXRvbWljX3NldCgmbWRldi0+cnNfc2VjdF9ldiwgMCk7Ci0JYXRvbWljX3NldCgmbWRldi0+YXBfaW5fZmxpZ2h0LCAwKTsKLQlhdG9taWNfc2V0KCZtZGV2LT5tZF9pb19pbl91c2UsIDApOworCWF0b21pY19zZXQoJmRldmljZS0+YXBfYmlvX2NudCwgMCk7CisJYXRvbWljX3NldCgmZGV2aWNlLT5hcF9wZW5kaW5nX2NudCwgMCk7CisJYXRvbWljX3NldCgmZGV2aWNlLT5yc19wZW5kaW5nX2NudCwgMCk7CisJYXRvbWljX3NldCgmZGV2aWNlLT51bmFja2VkX2NudCwgMCk7CisJYXRvbWljX3NldCgmZGV2aWNlLT5sb2NhbF9jbnQsIDApOworCWF0b21pY19zZXQoJmRldmljZS0+cHBfaW5fdXNlX2J5X25ldCwgMCk7CisJYXRvbWljX3NldCgmZGV2aWNlLT5yc19zZWN0X2luLCAwKTsKKwlhdG9taWNfc2V0KCZkZXZpY2UtPnJzX3NlY3RfZXYsIDApOworCWF0b21pY19zZXQoJmRldmljZS0+YXBfaW5fZmxpZ2h0LCAwKTsKKwlhdG9taWNfc2V0KCZkZXZpY2UtPm1kX2lvX2luX3VzZSwgMCk7CiAKLQltdXRleF9pbml0KCZtZGV2LT5vd25fc3RhdGVfbXV0ZXgpOwotCW1kZXYtPnN0YXRlX211dGV4ID0gJm1kZXYtPm93bl9zdGF0ZV9tdXRleDsKKwltdXRleF9pbml0KCZkZXZpY2UtPm93bl9zdGF0ZV9tdXRleCk7CisJZGV2aWNlLT5zdGF0ZV9tdXRleCA9ICZkZXZpY2UtPm93bl9zdGF0ZV9tdXRleDsKIAotCXNwaW5fbG9ja19pbml0KCZtZGV2LT5hbF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmbWRldi0+cGVlcl9zZXFfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRldmljZS0+YWxfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRldmljZS0+cGVlcl9zZXFfbG9jayk7CiAKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+YWN0aXZlX2VlKTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+c3luY19lZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJm1kZXYtPmRvbmVfZWUpOwotCUlOSVRfTElTVF9IRUFEKCZtZGV2LT5yZWFkX2VlKTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+bmV0X2VlKTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+cmVzeW5jX3JlYWRzKTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+cmVzeW5jX3dvcmsubGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJm1kZXYtPnVucGx1Z193b3JrLmxpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZtZGV2LT5nb19kaXNrbGVzcy5saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+bWRfc3luY193b3JrLmxpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZtZGV2LT5zdGFydF9yZXN5bmNfd29yay5saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+Ym1faW9fd29yay53Lmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPmFjdGl2ZV9lZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+c3luY19lZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+ZG9uZV9lZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+cmVhZF9lZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+bmV0X2VlKTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5yZXN5bmNfcmVhZHMpOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPnJlc3luY193b3JrLmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPnVucGx1Z193b3JrLmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPmdvX2Rpc2tsZXNzLmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPm1kX3N5bmNfd29yay5saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5zdGFydF9yZXN5bmNfd29yay5saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5ibV9pb193b3JrLncubGlzdCk7CiAKLQltZGV2LT5yZXN5bmNfd29yay5jYiAgPSB3X3Jlc3luY190aW1lcjsKLQltZGV2LT51bnBsdWdfd29yay5jYiAgPSB3X3NlbmRfd3JpdGVfaGludDsKLQltZGV2LT5nb19kaXNrbGVzcy5jYiAgPSB3X2dvX2Rpc2tsZXNzOwotCW1kZXYtPm1kX3N5bmNfd29yay5jYiA9IHdfbWRfc3luYzsKLQltZGV2LT5ibV9pb193b3JrLncuY2IgPSB3X2JpdG1hcF9pbzsKLQltZGV2LT5zdGFydF9yZXN5bmNfd29yay5jYiA9IHdfc3RhcnRfcmVzeW5jOworCWRldmljZS0+cmVzeW5jX3dvcmsuY2IgID0gd19yZXN5bmNfdGltZXI7CisJZGV2aWNlLT51bnBsdWdfd29yay5jYiAgPSB3X3NlbmRfd3JpdGVfaGludDsKKwlkZXZpY2UtPmdvX2Rpc2tsZXNzLmNiICA9IHdfZ29fZGlza2xlc3M7CisJZGV2aWNlLT5tZF9zeW5jX3dvcmsuY2IgPSB3X21kX3N5bmM7CisJZGV2aWNlLT5ibV9pb193b3JrLncuY2IgPSB3X2JpdG1hcF9pbzsKKwlkZXZpY2UtPnN0YXJ0X3Jlc3luY193b3JrLmNiID0gd19zdGFydF9yZXN5bmM7CiAKLQltZGV2LT5yZXN5bmNfd29yay5tZGV2ICA9IG1kZXY7Ci0JbWRldi0+dW5wbHVnX3dvcmsubWRldiAgPSBtZGV2OwotCW1kZXYtPmdvX2Rpc2tsZXNzLm1kZXYgID0gbWRldjsKLQltZGV2LT5tZF9zeW5jX3dvcmsubWRldiA9IG1kZXY7Ci0JbWRldi0+Ym1faW9fd29yay53Lm1kZXYgPSBtZGV2OwotCW1kZXYtPnN0YXJ0X3Jlc3luY193b3JrLm1kZXYgPSBtZGV2OworCWluaXRfdGltZXIoJmRldmljZS0+cmVzeW5jX3RpbWVyKTsKKwlpbml0X3RpbWVyKCZkZXZpY2UtPm1kX3N5bmNfdGltZXIpOworCWluaXRfdGltZXIoJmRldmljZS0+c3RhcnRfcmVzeW5jX3RpbWVyKTsKKwlpbml0X3RpbWVyKCZkZXZpY2UtPnJlcXVlc3RfdGltZXIpOworCWRldmljZS0+cmVzeW5jX3RpbWVyLmZ1bmN0aW9uID0gcmVzeW5jX3RpbWVyX2ZuOworCWRldmljZS0+cmVzeW5jX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2aWNlOworCWRldmljZS0+bWRfc3luY190aW1lci5mdW5jdGlvbiA9IG1kX3N5bmNfdGltZXJfZm47CisJZGV2aWNlLT5tZF9zeW5jX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2aWNlOworCWRldmljZS0+c3RhcnRfcmVzeW5jX3RpbWVyLmZ1bmN0aW9uID0gc3RhcnRfcmVzeW5jX3RpbWVyX2ZuOworCWRldmljZS0+c3RhcnRfcmVzeW5jX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2aWNlOworCWRldmljZS0+cmVxdWVzdF90aW1lci5mdW5jdGlvbiA9IHJlcXVlc3RfdGltZXJfZm47CisJZGV2aWNlLT5yZXF1ZXN0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2aWNlOwogCi0JaW5pdF90aW1lcigmbWRldi0+cmVzeW5jX3RpbWVyKTsKLQlpbml0X3RpbWVyKCZtZGV2LT5tZF9zeW5jX3RpbWVyKTsKLQlpbml0X3RpbWVyKCZtZGV2LT5zdGFydF9yZXN5bmNfdGltZXIpOwotCWluaXRfdGltZXIoJm1kZXYtPnJlcXVlc3RfdGltZXIpOwotCW1kZXYtPnJlc3luY190aW1lci5mdW5jdGlvbiA9IHJlc3luY190aW1lcl9mbjsKLQltZGV2LT5yZXN5bmNfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtZGV2OwotCW1kZXYtPm1kX3N5bmNfdGltZXIuZnVuY3Rpb24gPSBtZF9zeW5jX3RpbWVyX2ZuOwotCW1kZXYtPm1kX3N5bmNfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtZGV2OwotCW1kZXYtPnN0YXJ0X3Jlc3luY190aW1lci5mdW5jdGlvbiA9IHN0YXJ0X3Jlc3luY190aW1lcl9mbjsKLQltZGV2LT5zdGFydF9yZXN5bmNfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtZGV2OwotCW1kZXYtPnJlcXVlc3RfdGltZXIuZnVuY3Rpb24gPSByZXF1ZXN0X3RpbWVyX2ZuOwotCW1kZXYtPnJlcXVlc3RfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtZGV2OworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldmljZS0+bWlzY193YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXZpY2UtPnN0YXRlX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldmljZS0+ZWVfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2aWNlLT5hbF93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXZpY2UtPnNlcV93YWl0KTsKIAotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1kZXYtPm1pc2Nfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWRldi0+c3RhdGVfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWRldi0+ZWVfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWRldi0+YWxfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWRldi0+c2VxX3dhaXQpOwotCi0JbWRldi0+cmVzeW5jX3dlbnIgPSBMQ19GUkVFOwotCW1kZXYtPnBlZXJfbWF4X2Jpb19zaXplID0gRFJCRF9NQVhfQklPX1NJWkVfU0FGRTsKLQltZGV2LT5sb2NhbF9tYXhfYmlvX3NpemUgPSBEUkJEX01BWF9CSU9fU0laRV9TQUZFOworCWRldmljZS0+cmVzeW5jX3dlbnIgPSBMQ19GUkVFOworCWRldmljZS0+cGVlcl9tYXhfYmlvX3NpemUgPSBEUkJEX01BWF9CSU9fU0laRV9TQUZFOworCWRldmljZS0+bG9jYWxfbWF4X2Jpb19zaXplID0gRFJCRF9NQVhfQklPX1NJWkVfU0FGRTsKIH0KIAotdm9pZCBkcmJkX21kZXZfY2xlYW51cChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX2RldmljZV9jbGVhbnVwKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWludCBpOwotCWlmIChtZGV2LT50Y29ubi0+cmVjZWl2ZXIudF9zdGF0ZSAhPSBOT05FKQotCQlkZXZfZXJyKERFViwgIkFTU0VSVCBGQUlMRUQ6IHJlY2VpdmVyIHRfc3RhdGUgPT0gJWQgZXhwZWN0ZWQgMC5cbiIsCi0JCQkJbWRldi0+dGNvbm4tPnJlY2VpdmVyLnRfc3RhdGUpOworCWlmIChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5yZWNlaXZlci50X3N0YXRlICE9IE5PTkUpCisJCWRyYmRfZXJyKGRldmljZSwgIkFTU0VSVCBGQUlMRUQ6IHJlY2VpdmVyIHRfc3RhdGUgPT0gJWQgZXhwZWN0ZWQgMC5cbiIsCisJCQkJZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+cmVjZWl2ZXIudF9zdGF0ZSk7CiAKLQltZGV2LT5hbF93cml0X2NudCAgPQotCW1kZXYtPmJtX3dyaXRfY250ICA9Ci0JbWRldi0+cmVhZF9jbnQgICAgID0KLQltZGV2LT5yZWN2X2NudCAgICAgPQotCW1kZXYtPnNlbmRfY250ICAgICA9Ci0JbWRldi0+d3JpdF9jbnQgICAgID0KLQltZGV2LT5wX3NpemUgICAgICAgPQotCW1kZXYtPnJzX3N0YXJ0ICAgICA9Ci0JbWRldi0+cnNfdG90YWwgICAgID0KLQltZGV2LT5yc19mYWlsZWQgICAgPSAwOwotCW1kZXYtPnJzX2xhc3RfZXZlbnRzID0gMDsKLQltZGV2LT5yc19sYXN0X3NlY3RfZXYgPSAwOworCWRldmljZS0+YWxfd3JpdF9jbnQgID0KKwlkZXZpY2UtPmJtX3dyaXRfY250ICA9CisJZGV2aWNlLT5yZWFkX2NudCAgICAgPQorCWRldmljZS0+cmVjdl9jbnQgICAgID0KKwlkZXZpY2UtPnNlbmRfY250ICAgICA9CisJZGV2aWNlLT53cml0X2NudCAgICAgPQorCWRldmljZS0+cF9zaXplICAgICAgID0KKwlkZXZpY2UtPnJzX3N0YXJ0ICAgICA9CisJZGV2aWNlLT5yc190b3RhbCAgICAgPQorCWRldmljZS0+cnNfZmFpbGVkICAgID0gMDsKKwlkZXZpY2UtPnJzX2xhc3RfZXZlbnRzID0gMDsKKwlkZXZpY2UtPnJzX2xhc3Rfc2VjdF9ldiA9IDA7CiAJZm9yIChpID0gMDsgaSA8IERSQkRfU1lOQ19NQVJLUzsgaSsrKSB7Ci0JCW1kZXYtPnJzX21hcmtfbGVmdFtpXSA9IDA7Ci0JCW1kZXYtPnJzX21hcmtfdGltZVtpXSA9IDA7CisJCWRldmljZS0+cnNfbWFya19sZWZ0W2ldID0gMDsKKwkJZGV2aWNlLT5yc19tYXJrX3RpbWVbaV0gPSAwOwogCX0KLQlEX0FTU0VSVChtZGV2LT50Y29ubi0+bmV0X2NvbmYgPT0gTlVMTCk7CisJRF9BU1NFUlQoZGV2aWNlLCBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZiA9PSBOVUxMKTsKIAotCWRyYmRfc2V0X215X2NhcGFjaXR5KG1kZXYsIDApOwotCWlmIChtZGV2LT5iaXRtYXApIHsKKwlkcmJkX3NldF9teV9jYXBhY2l0eShkZXZpY2UsIDApOworCWlmIChkZXZpY2UtPmJpdG1hcCkgewogCQkvKiBtYXliZSBuZXZlciBhbGxvY2F0ZWQuICovCi0JCWRyYmRfYm1fcmVzaXplKG1kZXYsIDAsIDEpOwotCQlkcmJkX2JtX2NsZWFudXAobWRldik7CisJCWRyYmRfYm1fcmVzaXplKGRldmljZSwgMCwgMSk7CisJCWRyYmRfYm1fY2xlYW51cChkZXZpY2UpOwogCX0KIAotCWRyYmRfZnJlZV9iYyhtZGV2LT5sZGV2KTsKLQltZGV2LT5sZGV2ID0gTlVMTDsKKwlkcmJkX2ZyZWVfYmMoZGV2aWNlLT5sZGV2KTsKKwlkZXZpY2UtPmxkZXYgPSBOVUxMOwogCi0JY2xlYXJfYml0KEFMX1NVU1BFTkRFRCwgJm1kZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoQUxfU1VTUEVOREVELCAmZGV2aWNlLT5mbGFncyk7CiAKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5hY3RpdmVfZWUpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5zeW5jX2VlKSk7Ci0JRF9BU1NFUlQobGlzdF9lbXB0eSgmbWRldi0+ZG9uZV9lZSkpOwotCURfQVNTRVJUKGxpc3RfZW1wdHkoJm1kZXYtPnJlYWRfZWUpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5uZXRfZWUpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5yZXN5bmNfcmVhZHMpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT50Y29ubi0+c2VuZGVyX3dvcmsucSkpOwotCURfQVNTRVJUKGxpc3RfZW1wdHkoJm1kZXYtPnJlc3luY193b3JrLmxpc3QpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT51bnBsdWdfd29yay5saXN0KSk7Ci0JRF9BU1NFUlQobGlzdF9lbXB0eSgmbWRldi0+Z29fZGlza2xlc3MubGlzdCkpOworCURfQVNTRVJUKGRldmljZSwgbGlzdF9lbXB0eSgmZGV2aWNlLT5hY3RpdmVfZWUpKTsKKwlEX0FTU0VSVChkZXZpY2UsIGxpc3RfZW1wdHkoJmRldmljZS0+c3luY19lZSkpOworCURfQVNTRVJUKGRldmljZSwgbGlzdF9lbXB0eSgmZGV2aWNlLT5kb25lX2VlKSk7CisJRF9BU1NFUlQoZGV2aWNlLCBsaXN0X2VtcHR5KCZkZXZpY2UtPnJlYWRfZWUpKTsKKwlEX0FTU0VSVChkZXZpY2UsIGxpc3RfZW1wdHkoJmRldmljZS0+bmV0X2VlKSk7CisJRF9BU1NFUlQoZGV2aWNlLCBsaXN0X2VtcHR5KCZkZXZpY2UtPnJlc3luY19yZWFkcykpOworCURfQVNTRVJUKGRldmljZSwgbGlzdF9lbXB0eSgmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmsucSkpOworCURfQVNTRVJUKGRldmljZSwgbGlzdF9lbXB0eSgmZGV2aWNlLT5yZXN5bmNfd29yay5saXN0KSk7CisJRF9BU1NFUlQoZGV2aWNlLCBsaXN0X2VtcHR5KCZkZXZpY2UtPnVucGx1Z193b3JrLmxpc3QpKTsKKwlEX0FTU0VSVChkZXZpY2UsIGxpc3RfZW1wdHkoJmRldmljZS0+Z29fZGlza2xlc3MubGlzdCkpOwogCi0JZHJiZF9zZXRfZGVmYXVsdHMobWRldik7CisJZHJiZF9zZXRfZGVmYXVsdHMoZGV2aWNlKTsKIH0KIAogCkBAIC0yMDExLDcgKzIwMTIsNyBAQAogCQlkcmJkX3BwX3ZhY2FudC0tOwogCX0KIAotCS8qIERfQVNTRVJUKGF0b21pY19yZWFkKCZkcmJkX3BwX3ZhY2FudCk9PTApOyAqLworCS8qIERfQVNTRVJUKGRldmljZSwgYXRvbWljX3JlYWQoJmRyYmRfcHBfdmFjYW50KT09MCk7ICovCiAKIAlpZiAoZHJiZF9tZF9pb19iaW9fc2V0KQogCQliaW9zZXRfZnJlZShkcmJkX21kX2lvX2Jpb19zZXQpOwpAQCAtMjEzMSw2OSArMjEzMiw3MyBAQAogCS5ub3RpZmllcl9jYWxsID0gZHJiZF9ub3RpZnlfc3lzLAogfTsKIAotc3RhdGljIHZvaWQgZHJiZF9yZWxlYXNlX2FsbF9wZWVyX3JlcXMoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyB2b2lkIGRyYmRfcmVsZWFzZV9hbGxfcGVlcl9yZXFzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWludCBycjsKIAotCXJyID0gZHJiZF9mcmVlX3BlZXJfcmVxcyhtZGV2LCAmbWRldi0+YWN0aXZlX2VlKTsKKwlyciA9IGRyYmRfZnJlZV9wZWVyX3JlcXMoZGV2aWNlLCAmZGV2aWNlLT5hY3RpdmVfZWUpOwogCWlmIChycikKLQkJZGV2X2VycihERVYsICIlZCBFRXMgaW4gYWN0aXZlIGxpc3QgZm91bmQhXG4iLCBycik7CisJCWRyYmRfZXJyKGRldmljZSwgIiVkIEVFcyBpbiBhY3RpdmUgbGlzdCBmb3VuZCFcbiIsIHJyKTsKIAotCXJyID0gZHJiZF9mcmVlX3BlZXJfcmVxcyhtZGV2LCAmbWRldi0+c3luY19lZSk7CisJcnIgPSBkcmJkX2ZyZWVfcGVlcl9yZXFzKGRldmljZSwgJmRldmljZS0+c3luY19lZSk7CiAJaWYgKHJyKQotCQlkZXZfZXJyKERFViwgIiVkIEVFcyBpbiBzeW5jIGxpc3QgZm91bmQhXG4iLCBycik7CisJCWRyYmRfZXJyKGRldmljZSwgIiVkIEVFcyBpbiBzeW5jIGxpc3QgZm91bmQhXG4iLCBycik7CiAKLQlyciA9IGRyYmRfZnJlZV9wZWVyX3JlcXMobWRldiwgJm1kZXYtPnJlYWRfZWUpOworCXJyID0gZHJiZF9mcmVlX3BlZXJfcmVxcyhkZXZpY2UsICZkZXZpY2UtPnJlYWRfZWUpOwogCWlmIChycikKLQkJZGV2X2VycihERVYsICIlZCBFRXMgaW4gcmVhZCBsaXN0IGZvdW5kIVxuIiwgcnIpOworCQlkcmJkX2VycihkZXZpY2UsICIlZCBFRXMgaW4gcmVhZCBsaXN0IGZvdW5kIVxuIiwgcnIpOwogCi0JcnIgPSBkcmJkX2ZyZWVfcGVlcl9yZXFzKG1kZXYsICZtZGV2LT5kb25lX2VlKTsKKwlyciA9IGRyYmRfZnJlZV9wZWVyX3JlcXMoZGV2aWNlLCAmZGV2aWNlLT5kb25lX2VlKTsKIAlpZiAocnIpCi0JCWRldl9lcnIoREVWLCAiJWQgRUVzIGluIGRvbmUgbGlzdCBmb3VuZCFcbiIsIHJyKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiJWQgRUVzIGluIGRvbmUgbGlzdCBmb3VuZCFcbiIsIHJyKTsKIAotCXJyID0gZHJiZF9mcmVlX3BlZXJfcmVxcyhtZGV2LCAmbWRldi0+bmV0X2VlKTsKKwlyciA9IGRyYmRfZnJlZV9wZWVyX3JlcXMoZGV2aWNlLCAmZGV2aWNlLT5uZXRfZWUpOwogCWlmIChycikKLQkJZGV2X2VycihERVYsICIlZCBFRXMgaW4gbmV0IGxpc3QgZm91bmQhXG4iLCBycik7CisJCWRyYmRfZXJyKGRldmljZSwgIiVkIEVFcyBpbiBuZXQgbGlzdCBmb3VuZCFcbiIsIHJyKTsKIH0KIAogLyogY2F1dGlvbi4gbm8gbG9ja2luZy4gKi8KLXZvaWQgZHJiZF9taW5vcl9kZXN0cm95KHN0cnVjdCBrcmVmICprcmVmKQordm9pZCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKHN0cnVjdCBrcmVmICprcmVmKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRyYmRfY29uZiwga3JlZik7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uID0gbWRldi0+dGNvbm47CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRyYmRfZGV2aWNlLCBrcmVmKTsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2UgPSBkZXZpY2UtPnJlc291cmNlOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CiAKLQlkZWxfdGltZXJfc3luYygmbWRldi0+cmVxdWVzdF90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmRldmljZS0+cmVxdWVzdF90aW1lcik7CiAKIAkvKiBwYXJhbm9pYSBhc3NlcnRzICovCi0JRF9BU1NFUlQobWRldi0+b3Blbl9jbnQgPT0gMCk7CisJRF9BU1NFUlQoZGV2aWNlLCBkZXZpY2UtPm9wZW5fY250ID09IDApOwogCS8qIGVuZCBwYXJhbm9pYSBhc3NlcnRzICovCiAKIAkvKiBjbGVhbnVwIHN0dWZmIHRoYXQgbWF5IGhhdmUgYmVlbiBhbGxvY2F0ZWQgZHVyaW5nCiAJICogZGV2aWNlIChyZS0pY29uZmlndXJhdGlvbiBvciBzdGF0ZSBjaGFuZ2VzICovCiAKLQlpZiAobWRldi0+dGhpc19iZGV2KQotCQliZHB1dChtZGV2LT50aGlzX2JkZXYpOworCWlmIChkZXZpY2UtPnRoaXNfYmRldikKKwkJYmRwdXQoZGV2aWNlLT50aGlzX2JkZXYpOwogCi0JZHJiZF9mcmVlX2JjKG1kZXYtPmxkZXYpOwotCW1kZXYtPmxkZXYgPSBOVUxMOworCWRyYmRfZnJlZV9iYyhkZXZpY2UtPmxkZXYpOworCWRldmljZS0+bGRldiA9IE5VTEw7CiAKLQlkcmJkX3JlbGVhc2VfYWxsX3BlZXJfcmVxcyhtZGV2KTsKKwlkcmJkX3JlbGVhc2VfYWxsX3BlZXJfcmVxcyhkZXZpY2UpOwogCi0JbGNfZGVzdHJveShtZGV2LT5hY3RfbG9nKTsKLQlsY19kZXN0cm95KG1kZXYtPnJlc3luYyk7CisJbGNfZGVzdHJveShkZXZpY2UtPmFjdF9sb2cpOworCWxjX2Rlc3Ryb3koZGV2aWNlLT5yZXN5bmMpOwogCi0Ja2ZyZWUobWRldi0+cF91dWlkKTsKLQkvKiBtZGV2LT5wX3V1aWQgPSBOVUxMOyAqLworCWtmcmVlKGRldmljZS0+cF91dWlkKTsKKwkvKiBkZXZpY2UtPnBfdXVpZCA9IE5VTEw7ICovCiAKLQlpZiAobWRldi0+Yml0bWFwKSAvKiBzaG91bGQgbm8gbG9uZ2VyIGJlIHRoZXJlLiAqLwotCQlkcmJkX2JtX2NsZWFudXAobWRldik7Ci0JX19mcmVlX3BhZ2UobWRldi0+bWRfaW9fcGFnZSk7Ci0JcHV0X2Rpc2sobWRldi0+dmRpc2spOwotCWJsa19jbGVhbnVwX3F1ZXVlKG1kZXYtPnJxX3F1ZXVlKTsKLQlrZnJlZShtZGV2LT5yc19wbGFuX3MpOwotCWtmcmVlKG1kZXYpOworCWlmIChkZXZpY2UtPmJpdG1hcCkgLyogc2hvdWxkIG5vIGxvbmdlciBiZSB0aGVyZS4gKi8KKwkJZHJiZF9ibV9jbGVhbnVwKGRldmljZSk7CisJX19mcmVlX3BhZ2UoZGV2aWNlLT5tZF9pb19wYWdlKTsKKwlwdXRfZGlzayhkZXZpY2UtPnZkaXNrKTsKKwlibGtfY2xlYW51cF9xdWV1ZShkZXZpY2UtPnJxX3F1ZXVlKTsKKwlrZnJlZShkZXZpY2UtPnJzX3BsYW5fcyk7CisJa2ZyZWUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSk7CisJa2ZyZWUoZGV2aWNlKTsKIAotCWtyZWZfcHV0KCZ0Y29ubi0+a3JlZiwgJmNvbm5fZGVzdHJveSk7CisJZm9yX2VhY2hfY29ubmVjdGlvbihjb25uZWN0aW9uLCByZXNvdXJjZSkKKwkJa3JlZl9wdXQoJmNvbm5lY3Rpb24tPmtyZWYsIGRyYmRfZGVzdHJveV9jb25uZWN0aW9uKTsKKwlrcmVmX3B1dCgmcmVzb3VyY2UtPmtyZWYsIGRyYmRfZGVzdHJveV9yZXNvdXJjZSk7CiB9CiAKIC8qIE9uZSBnbG9iYWwgcmV0cnkgdGhyZWFkLCBpZiB3ZSBuZWVkIHRvIHB1c2ggYmFjayBzb21lIGJpbyBhbmQgaGF2ZSBpdApAQCAtMjIxOCwxOSArMjIyMywxOSBAQAogCXNwaW5fdW5sb2NrX2lycSgmcmV0cnktPmxvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgdG1wLCAmd3JpdGVzLCB0bF9yZXF1ZXN0cykgewotCQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gcmVxLT53Lm1kZXY7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJCXN0cnVjdCBiaW8gKmJpbyA9IHJlcS0+bWFzdGVyX2JpbzsKIAkJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lID0gcmVxLT5zdGFydF90aW1lOwogCQlib29sIGV4cGVjdGVkOwogCi0JCWV4cGVjdGVkID0gCisJCWV4cGVjdGVkID0KIAkJCWV4cGVjdChhdG9taWNfcmVhZCgmcmVxLT5jb21wbGV0aW9uX3JlZikgPT0gMCkgJiYKIAkJCWV4cGVjdChyZXEtPnJxX3N0YXRlICYgUlFfUE9TVFBPTkVEKSAmJgogCQkJZXhwZWN0KChyZXEtPnJxX3N0YXRlICYgUlFfTE9DQUxfUEVORElORykgPT0gMCB8fAogCQkJCShyZXEtPnJxX3N0YXRlICYgUlFfTE9DQUxfQUJPUlRFRCkgIT0gMCk7CiAKIAkJaWYgKCFleHBlY3RlZCkKLQkJCWRldl9lcnIoREVWLCAicmVxPSVwIGNvbXBsZXRpb25fcmVmPSVkIHJxX3N0YXRlPSV4XG4iLAorCQkJZHJiZF9lcnIoZGV2aWNlLCAicmVxPSVwIGNvbXBsZXRpb25fcmVmPSVkIHJxX3N0YXRlPSV4XG4iLAogCQkJCXJlcSwgYXRvbWljX3JlYWQoJnJlcS0+Y29tcGxldGlvbl9yZWYpLAogCQkJCXJlcS0+cnFfc3RhdGUpOwogCkBAIC0yMjU0LDggKzIyNTksOCBAQAogCiAJCS8qIFdlIGFyZSBub3QganVzdCBkb2luZyBnZW5lcmljX21ha2VfcmVxdWVzdCgpLAogCQkgKiBhcyB3ZSB3YW50IHRvIGtlZXAgdGhlIHN0YXJ0X3RpbWUgaW5mb3JtYXRpb24uICovCi0JCWluY19hcF9iaW8obWRldik7Ci0JCV9fZHJiZF9tYWtlX3JlcXVlc3QobWRldiwgYmlvLCBzdGFydF90aW1lKTsKKwkJaW5jX2FwX2JpbyhkZXZpY2UpOworCQlfX2RyYmRfbWFrZV9yZXF1ZXN0KGRldmljZSwgYmlvLCBzdGFydF90aW1lKTsKIAl9CiB9CiAKQEAgLTIyNjksMTcgKzIyNzQsMzggQEAKIAkvKiBEcm9wIHRoZSBleHRyYSByZWZlcmVuY2UgdGhhdCB3b3VsZCBvdGhlcndpc2UKIAkgKiBoYXZlIGJlZW4gZHJvcHBlZCBieSBjb21wbGV0ZV9tYXN0ZXJfYmlvLgogCSAqIGRvX3JldHJ5KCkgbmVlZHMgdG8gZ3JhYiBhIG5ldyBvbmUuICovCi0JZGVjX2FwX2JpbyhyZXEtPncubWRldik7CisJZGVjX2FwX2JpbyhyZXEtPmRldmljZSk7CiAKIAlxdWV1ZV93b3JrKHJldHJ5LndxLCAmcmV0cnkud29ya2VyKTsKIH0KIAordm9pZCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlID0KKwkJY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBkcmJkX3Jlc291cmNlLCBrcmVmKTsKKworCWlkcl9kZXN0cm95KCZyZXNvdXJjZS0+ZGV2aWNlcyk7CisJZnJlZV9jcHVtYXNrX3ZhcihyZXNvdXJjZS0+Y3B1X21hc2spOworCWtmcmVlKHJlc291cmNlLT5uYW1lKTsKKwlrZnJlZShyZXNvdXJjZSk7Cit9CisKK3ZvaWQgZHJiZF9mcmVlX3Jlc291cmNlKHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSkKK3sKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCAqdG1wOworCisJZm9yX2VhY2hfY29ubmVjdGlvbl9zYWZlKGNvbm5lY3Rpb24sIHRtcCwgcmVzb3VyY2UpIHsKKwkJbGlzdF9kZWwoJmNvbm5lY3Rpb24tPmNvbm5lY3Rpb25zKTsKKwkJa3JlZl9wdXQoJmNvbm5lY3Rpb24tPmtyZWYsIGRyYmRfZGVzdHJveV9jb25uZWN0aW9uKTsKKwl9CisJa3JlZl9wdXQoJnJlc291cmNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2UpOworfQogCiBzdGF0aWMgdm9pZCBkcmJkX2NsZWFudXAodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgKnRtcDsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2UsICp0bXA7CiAKIAl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmZHJiZF9ub3RpZmllcik7CiAKQEAgLTIyOTksMjYgKzIzMjUsMTkgQEAKIAogCWRyYmRfZ2VubF91bnJlZ2lzdGVyKCk7CiAKLQlpZHJfZm9yX2VhY2hfZW50cnkoJm1pbm9ycywgbWRldiwgaSkgewotCQlpZHJfcmVtb3ZlKCZtaW5vcnMsIG1kZXZfdG9fbWlub3IobWRldikpOwotCQlpZHJfcmVtb3ZlKCZtZGV2LT50Y29ubi0+dm9sdW1lcywgbWRldi0+dm5yKTsKLQkJZGVzdHJveV93b3JrcXVldWUobWRldi0+c3VibWl0LndxKTsKLQkJZGVsX2dlbmRpc2sobWRldi0+dmRpc2spOwotCQkvKiBzeW5jaHJvbml6ZV9yY3UoKTsgTm8gb3RoZXIgdGhyZWFkcyBydW5uaW5nIGF0IHRoaXMgcG9pbnQgKi8KLQkJa3JlZl9wdXQoJm1kZXYtPmtyZWYsICZkcmJkX21pbm9yX2Rlc3Ryb3kpOwotCX0KKwlpZHJfZm9yX2VhY2hfZW50cnkoJmRyYmRfZGV2aWNlcywgZGV2aWNlLCBpKQorCQlkcmJkX2RlbGV0ZV9kZXZpY2UoZGV2aWNlKTsKIAogCS8qIG5vdCBfcmN1IHNpbmNlLCBubyBvdGhlciB1cGRhdGVyIGFueW1vcmUuIEdlbmwgYWxyZWFkeSB1bnJlZ2lzdGVyZWQgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGNvbm4sIHRtcCwgJmRyYmRfdGNvbm5zLCBhbGxfdGNvbm4pIHsKLQkJbGlzdF9kZWwoJnRjb25uLT5hbGxfdGNvbm4pOyAvKiBub3QgX3JjdSBubyBwcm9jLCBub3Qgb3RoZXIgdGhyZWFkcyAqLwotCQkvKiBzeW5jaHJvbml6ZV9yY3UoKTsgKi8KLQkJa3JlZl9wdXQoJnRjb25uLT5rcmVmLCAmY29ubl9kZXN0cm95KTsKKwlmb3JfZWFjaF9yZXNvdXJjZV9zYWZlKHJlc291cmNlLCB0bXAsICZkcmJkX3Jlc291cmNlcykgeworCQlsaXN0X2RlbCgmcmVzb3VyY2UtPnJlc291cmNlcyk7CisJCWRyYmRfZnJlZV9yZXNvdXJjZShyZXNvdXJjZSk7CiAJfQogCiAJZHJiZF9kZXN0cm95X21lbXBvb2xzKCk7CiAJdW5yZWdpc3Rlcl9ibGtkZXYoRFJCRF9NQUpPUiwgImRyYmQiKTsKIAotCWlkcl9kZXN0cm95KCZtaW5vcnMpOworCWlkcl9kZXN0cm95KCZkcmJkX2RldmljZXMpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiZHJiZDogbW9kdWxlIGNsZWFudXAgZG9uZS5cbiIpOwogfQpAQCAtMjMzMiw0OSArMjM1MSw1MCBAQAogICovCiBzdGF0aWMgaW50IGRyYmRfY29uZ2VzdGVkKHZvaWQgKmNvbmdlc3RlZF9kYXRhLCBpbnQgYmRpX2JpdHMpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IGNvbmdlc3RlZF9kYXRhOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gY29uZ2VzdGVkX2RhdGE7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CiAJY2hhciByZWFzb24gPSAnLSc7CiAJaW50IHIgPSAwOwogCi0JaWYgKCFtYXlfaW5jX2FwX2JpbyhtZGV2KSkgeworCWlmICghbWF5X2luY19hcF9iaW8oZGV2aWNlKSkgewogCQkvKiBEUkJEIGhhcyBmcm96ZW4gSU8gKi8KIAkJciA9IGJkaV9iaXRzOwogCQlyZWFzb24gPSAnZCc7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlmICh0ZXN0X2JpdChDQUxMQkFDS19QRU5ESU5HLCAmbWRldi0+dGNvbm4tPmZsYWdzKSkgeworCWlmICh0ZXN0X2JpdChDQUxMQkFDS19QRU5ESU5HLCAmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+ZmxhZ3MpKSB7CiAJCXIgfD0gKDEgPDwgQkRJX2FzeW5jX2Nvbmdlc3RlZCk7CiAJCS8qIFdpdGhvdXQgZ29vZCBsb2NhbCBkYXRhLCB3ZSB3b3VsZCBuZWVkIHRvIHJlYWQgZnJvbSByZW1vdGUsCiAJCSAqIGFuZCB0aGF0IHdvdWxkIG5lZWQgdGhlIHdvcmtlciB0aHJlYWQgYXMgd2VsbCwgd2hpY2ggaXMKIAkJICogY3VycmVudGx5IGJsb2NrZWQgd2FpdGluZyBmb3IgdGhhdCB1c2VybW9kZSBoZWxwZXIgdG8KIAkJICogZmluaXNoLgogCQkgKi8KLQkJaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX1VQX1RPX0RBVEUpKQorCQlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9VUF9UT19EQVRFKSkKIAkJCXIgfD0gKDEgPDwgQkRJX3N5bmNfY29uZ2VzdGVkKTsKIAkJZWxzZQotCQkJcHV0X2xkZXYobWRldik7CisJCQlwdXRfbGRldihkZXZpY2UpOwogCQlyICY9IGJkaV9iaXRzOwogCQlyZWFzb24gPSAnYyc7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQlxID0gYmRldl9nZXRfcXVldWUobWRldi0+bGRldi0+YmFja2luZ19iZGV2KTsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlxID0gYmRldl9nZXRfcXVldWUoZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXYpOwogCQlyID0gYmRpX2Nvbmdlc3RlZCgmcS0+YmFja2luZ19kZXZfaW5mbywgYmRpX2JpdHMpOwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJaWYgKHIpCiAJCQlyZWFzb24gPSAnYic7CiAJfQogCi0JaWYgKGJkaV9iaXRzICYgKDEgPDwgQkRJX2FzeW5jX2Nvbmdlc3RlZCkgJiYgdGVzdF9iaXQoTkVUX0NPTkdFU1RFRCwgJm1kZXYtPnRjb25uLT5mbGFncykpIHsKKwlpZiAoYmRpX2JpdHMgJiAoMSA8PCBCRElfYXN5bmNfY29uZ2VzdGVkKSAmJgorCSAgICB0ZXN0X2JpdChORVRfQ09OR0VTVEVELCAmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+ZmxhZ3MpKSB7CiAJCXIgfD0gKDEgPDwgQkRJX2FzeW5jX2Nvbmdlc3RlZCk7CiAJCXJlYXNvbiA9IHJlYXNvbiA9PSAnYicgPyAnYScgOiAnbic7CiAJfQogCiBvdXQ6Ci0JbWRldi0+Y29uZ2VzdGlvbl9yZWFzb24gPSByZWFzb247CisJZGV2aWNlLT5jb25nZXN0aW9uX3JlYXNvbiA9IHJlYXNvbjsKIAlyZXR1cm4gcjsKIH0KIApAQCAtMjM4NSw0NSArMjQwNSw3MiBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndxLT5xX3dhaXQpOwogfQogCi1zdHJ1Y3QgZHJiZF90Y29ubiAqY29ubl9nZXRfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKQorc3RydWN0IGNvbXBsZXRpb25fd29yayB7CisJc3RydWN0IGRyYmRfd29yayB3OworCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7Cit9OworCitzdGF0aWMgaW50IHdfY29tcGxldGUoc3RydWN0IGRyYmRfd29yayAqdywgaW50IGNhbmNlbCkKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm47CisJc3RydWN0IGNvbXBsZXRpb25fd29yayAqY29tcGxldGlvbl93b3JrID0KKwkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBjb21wbGV0aW9uX3dvcmssIHcpOworCisJY29tcGxldGUoJmNvbXBsZXRpb25fd29yay0+ZG9uZSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZHJiZF9mbHVzaF93b3JrcXVldWUoc3RydWN0IGRyYmRfd29ya19xdWV1ZSAqd29ya19xdWV1ZSkKK3sKKwlzdHJ1Y3QgY29tcGxldGlvbl93b3JrIGNvbXBsZXRpb25fd29yazsKKworCWNvbXBsZXRpb25fd29yay53LmNiID0gd19jb21wbGV0ZTsKKwlpbml0X2NvbXBsZXRpb24oJmNvbXBsZXRpb25fd29yay5kb25lKTsKKwlkcmJkX3F1ZXVlX3dvcmsod29ya19xdWV1ZSwgJmNvbXBsZXRpb25fd29yay53KTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wbGV0aW9uX3dvcmsuZG9uZSk7Cit9CisKK3N0cnVjdCBkcmJkX3Jlc291cmNlICpkcmJkX2ZpbmRfcmVzb3VyY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2U7CiAKIAlpZiAoIW5hbWUgfHwgIW5hbWVbMF0pCiAJCXJldHVybiBOVUxMOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHRjb25uLCAmZHJiZF90Y29ubnMsIGFsbF90Y29ubikgewotCQlpZiAoIXN0cmNtcCh0Y29ubi0+bmFtZSwgbmFtZSkpIHsKLQkJCWtyZWZfZ2V0KCZ0Y29ubi0+a3JlZik7CisJZm9yX2VhY2hfcmVzb3VyY2VfcmN1KHJlc291cmNlLCAmZHJiZF9yZXNvdXJjZXMpIHsKKwkJaWYgKCFzdHJjbXAocmVzb3VyY2UtPm5hbWUsIG5hbWUpKSB7CisJCQlrcmVmX2dldCgmcmVzb3VyY2UtPmtyZWYpOwogCQkJZ290byBmb3VuZDsKIAkJfQogCX0KLQl0Y29ubiA9IE5VTEw7CisJcmVzb3VyY2UgPSBOVUxMOwogZm91bmQ6CiAJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JcmV0dXJuIHRjb25uOworCXJldHVybiByZXNvdXJjZTsKIH0KIAotc3RydWN0IGRyYmRfdGNvbm4gKmNvbm5fZ2V0X2J5X2FkZHJzKHZvaWQgKm15X2FkZHIsIGludCBteV9hZGRyX2xlbiwKK3N0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5fZ2V0X2J5X2FkZHJzKHZvaWQgKm15X2FkZHIsIGludCBteV9hZGRyX2xlbiwKIAkJCQkgICAgIHZvaWQgKnBlZXJfYWRkciwgaW50IHBlZXJfYWRkcl9sZW4pCiB7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHRjb25uLCAmZHJiZF90Y29ubnMsIGFsbF90Y29ubikgewotCQlpZiAodGNvbm4tPm15X2FkZHJfbGVuID09IG15X2FkZHJfbGVuICYmCi0JCSAgICB0Y29ubi0+cGVlcl9hZGRyX2xlbiA9PSBwZWVyX2FkZHJfbGVuICYmCi0JCSAgICAhbWVtY21wKCZ0Y29ubi0+bXlfYWRkciwgbXlfYWRkciwgbXlfYWRkcl9sZW4pICYmCi0JCSAgICAhbWVtY21wKCZ0Y29ubi0+cGVlcl9hZGRyLCBwZWVyX2FkZHIsIHBlZXJfYWRkcl9sZW4pKSB7Ci0JCQlrcmVmX2dldCgmdGNvbm4tPmtyZWYpOwotCQkJZ290byBmb3VuZDsKKwlmb3JfZWFjaF9yZXNvdXJjZV9yY3UocmVzb3VyY2UsICZkcmJkX3Jlc291cmNlcykgeworCQlmb3JfZWFjaF9jb25uZWN0aW9uX3JjdShjb25uZWN0aW9uLCByZXNvdXJjZSkgeworCQkJaWYgKGNvbm5lY3Rpb24tPm15X2FkZHJfbGVuID09IG15X2FkZHJfbGVuICYmCisJCQkgICAgY29ubmVjdGlvbi0+cGVlcl9hZGRyX2xlbiA9PSBwZWVyX2FkZHJfbGVuICYmCisJCQkgICAgIW1lbWNtcCgmY29ubmVjdGlvbi0+bXlfYWRkciwgbXlfYWRkciwgbXlfYWRkcl9sZW4pICYmCisJCQkgICAgIW1lbWNtcCgmY29ubmVjdGlvbi0+cGVlcl9hZGRyLCBwZWVyX2FkZHIsIHBlZXJfYWRkcl9sZW4pKSB7CisJCQkJa3JlZl9nZXQoJmNvbm5lY3Rpb24tPmtyZWYpOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CiAJCX0KIAl9Ci0JdGNvbm4gPSBOVUxMOworCWNvbm5lY3Rpb24gPSBOVUxMOwogZm91bmQ6CiAJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JcmV0dXJuIHRjb25uOworCXJldHVybiBjb25uZWN0aW9uOwogfQogCiBzdGF0aWMgaW50IGRyYmRfYWxsb2Nfc29ja2V0KHN0cnVjdCBkcmJkX3NvY2tldCAqc29ja2V0KQpAQCAtMjQ0MywyOSArMjQ5MCwzMCBAQAogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgc29ja2V0LT5yYnVmKTsKIH0KIAotdm9pZCBjb25uX2ZyZWVfY3J5cHRvKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3ZvaWQgY29ubl9mcmVlX2NyeXB0byhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCWRyYmRfZnJlZV9zb2NrKHRjb25uKTsKKwlkcmJkX2ZyZWVfc29jayhjb25uZWN0aW9uKTsKIAotCWNyeXB0b19mcmVlX2hhc2godGNvbm4tPmNzdW1zX3RmbSk7Ci0JY3J5cHRvX2ZyZWVfaGFzaCh0Y29ubi0+dmVyaWZ5X3RmbSk7Ci0JY3J5cHRvX2ZyZWVfaGFzaCh0Y29ubi0+Y3JhbV9obWFjX3RmbSk7Ci0JY3J5cHRvX2ZyZWVfaGFzaCh0Y29ubi0+aW50ZWdyaXR5X3RmbSk7Ci0JY3J5cHRvX2ZyZWVfaGFzaCh0Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtKTsKLQlrZnJlZSh0Y29ubi0+aW50X2RpZ19pbik7Ci0Ja2ZyZWUodGNvbm4tPmludF9kaWdfdnYpOworCWNyeXB0b19mcmVlX2hhc2goY29ubmVjdGlvbi0+Y3N1bXNfdGZtKTsKKwljcnlwdG9fZnJlZV9oYXNoKGNvbm5lY3Rpb24tPnZlcmlmeV90Zm0pOworCWNyeXB0b19mcmVlX2hhc2goY29ubmVjdGlvbi0+Y3JhbV9obWFjX3RmbSk7CisJY3J5cHRvX2ZyZWVfaGFzaChjb25uZWN0aW9uLT5pbnRlZ3JpdHlfdGZtKTsKKwljcnlwdG9fZnJlZV9oYXNoKGNvbm5lY3Rpb24tPnBlZXJfaW50ZWdyaXR5X3RmbSk7CisJa2ZyZWUoY29ubmVjdGlvbi0+aW50X2RpZ19pbik7CisJa2ZyZWUoY29ubmVjdGlvbi0+aW50X2RpZ192dik7CiAKLQl0Y29ubi0+Y3N1bXNfdGZtID0gTlVMTDsKLQl0Y29ubi0+dmVyaWZ5X3RmbSA9IE5VTEw7Ci0JdGNvbm4tPmNyYW1faG1hY190Zm0gPSBOVUxMOwotCXRjb25uLT5pbnRlZ3JpdHlfdGZtID0gTlVMTDsKLQl0Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtID0gTlVMTDsKLQl0Y29ubi0+aW50X2RpZ19pbiA9IE5VTEw7Ci0JdGNvbm4tPmludF9kaWdfdnYgPSBOVUxMOworCWNvbm5lY3Rpb24tPmNzdW1zX3RmbSA9IE5VTEw7CisJY29ubmVjdGlvbi0+dmVyaWZ5X3RmbSA9IE5VTEw7CisJY29ubmVjdGlvbi0+Y3JhbV9obWFjX3RmbSA9IE5VTEw7CisJY29ubmVjdGlvbi0+aW50ZWdyaXR5X3RmbSA9IE5VTEw7CisJY29ubmVjdGlvbi0+cGVlcl9pbnRlZ3JpdHlfdGZtID0gTlVMTDsKKwljb25uZWN0aW9uLT5pbnRfZGlnX2luID0gTlVMTDsKKwljb25uZWN0aW9uLT5pbnRfZGlnX3Z2ID0gTlVMTDsKIH0KIAotaW50IHNldF9yZXNvdXJjZV9vcHRpb25zKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHJlc19vcHRzICpyZXNfb3B0cykKK2ludCBzZXRfcmVzb3VyY2Vfb3B0aW9ucyhzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2UsIHN0cnVjdCByZXNfb3B0cyAqcmVzX29wdHMpCiB7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKIAljcHVtYXNrX3Zhcl90IG5ld19jcHVfbWFzazsKIAlpbnQgZXJyOwogCkBAIC0yNDc4LDIyICsyNTI2LDI0IEBACiAKIAkvKiBzaWxlbnRseSBpZ25vcmUgY3B1IG1hc2sgb24gVVAga2VybmVsICovCiAJaWYgKG5yX2NwdV9pZHMgPiAxICYmIHJlc19vcHRzLT5jcHVfbWFza1swXSAhPSAwKSB7Ci0JCS8qIEZJWE1FOiBHZXQgcmlkIG9mIGNvbnN0YW50IDMyIGhlcmUgKi8KLQkJZXJyID0gYml0bWFwX3BhcnNlKHJlc19vcHRzLT5jcHVfbWFzaywgMzIsCisJCWVyciA9IGJpdG1hcF9wYXJzZShyZXNfb3B0cy0+Y3B1X21hc2ssIERSQkRfQ1BVX01BU0tfU0laRSwKIAkJCQkgICBjcHVtYXNrX2JpdHMobmV3X2NwdV9tYXNrKSwgbnJfY3B1X2lkcyk7CiAJCWlmIChlcnIpIHsKLQkJCWNvbm5fd2Fybih0Y29ubiwgImJpdG1hcF9wYXJzZSgpIGZhaWxlZCB3aXRoICVkXG4iLCBlcnIpOworCQkJZHJiZF93YXJuKHJlc291cmNlLCAiYml0bWFwX3BhcnNlKCkgZmFpbGVkIHdpdGggJWRcbiIsIGVycik7CiAJCQkvKiByZXRjb2RlID0gRVJSX0NQVV9NQVNLX1BBUlNFOyAqLwogCQkJZ290byBmYWlsOwogCQl9CiAJfQotCXRjb25uLT5yZXNfb3B0cyA9ICpyZXNfb3B0czsKLQlpZiAoIWNwdW1hc2tfZXF1YWwodGNvbm4tPmNwdV9tYXNrLCBuZXdfY3B1X21hc2spKSB7Ci0JCWNwdW1hc2tfY29weSh0Y29ubi0+Y3B1X21hc2ssIG5ld19jcHVfbWFzayk7Ci0JCWRyYmRfY2FsY19jcHVfbWFzayh0Y29ubik7Ci0JCXRjb25uLT5yZWNlaXZlci5yZXNldF9jcHVfbWFzayA9IDE7Ci0JCXRjb25uLT5hc2VuZGVyLnJlc2V0X2NwdV9tYXNrID0gMTsKLQkJdGNvbm4tPndvcmtlci5yZXNldF9jcHVfbWFzayA9IDE7CisJcmVzb3VyY2UtPnJlc19vcHRzID0gKnJlc19vcHRzOworCWlmIChjcHVtYXNrX2VtcHR5KG5ld19jcHVfbWFzaykpCisJCWRyYmRfY2FsY19jcHVfbWFzaygmbmV3X2NwdV9tYXNrKTsKKwlpZiAoIWNwdW1hc2tfZXF1YWwocmVzb3VyY2UtPmNwdV9tYXNrLCBuZXdfY3B1X21hc2spKSB7CisJCWNwdW1hc2tfY29weShyZXNvdXJjZS0+Y3B1X21hc2ssIG5ld19jcHVfbWFzayk7CisJCWZvcl9lYWNoX2Nvbm5lY3Rpb25fcmN1KGNvbm5lY3Rpb24sIHJlc291cmNlKSB7CisJCQljb25uZWN0aW9uLT5yZWNlaXZlci5yZXNldF9jcHVfbWFzayA9IDE7CisJCQljb25uZWN0aW9uLT5hc2VuZGVyLnJlc2V0X2NwdV9tYXNrID0gMTsKKwkJCWNvbm5lY3Rpb24tPndvcmtlci5yZXNldF9jcHVfbWFzayA9IDE7CisJCX0KIAl9CiAJZXJyID0gMDsKIApAQCAtMjUwMywxNDYgKzI1NTMsMTc3IEBACiAKIH0KIAotLyogY2FsbGVyIG11c3QgYmUgdW5kZXIgZ2VubF9sb2NrKCkgKi8KLXN0cnVjdCBkcmJkX3Rjb25uICpjb25uX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgcmVzX29wdHMgKnJlc19vcHRzKQorc3RydWN0IGRyYmRfcmVzb3VyY2UgKmRyYmRfY3JlYXRlX3Jlc291cmNlKGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZTsKIAotCXRjb25uID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfdGNvbm4pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRjb25uKQotCQlyZXR1cm4gTlVMTDsKLQotCXRjb25uLT5uYW1lID0ga3N0cmR1cChuYW1lLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRjb25uLT5uYW1lKQorCXJlc291cmNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfcmVzb3VyY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlc291cmNlKQogCQlnb3RvIGZhaWw7CisJcmVzb3VyY2UtPm5hbWUgPSBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOworCWlmICghcmVzb3VyY2UtPm5hbWUpCisJCWdvdG8gZmFpbF9mcmVlX3Jlc291cmNlOworCWlmICghemFsbG9jX2NwdW1hc2tfdmFyKCZyZXNvdXJjZS0+Y3B1X21hc2ssIEdGUF9LRVJORUwpKQorCQlnb3RvIGZhaWxfZnJlZV9uYW1lOworCWtyZWZfaW5pdCgmcmVzb3VyY2UtPmtyZWYpOworCWlkcl9pbml0KCZyZXNvdXJjZS0+ZGV2aWNlcyk7CisJSU5JVF9MSVNUX0hFQUQoJnJlc291cmNlLT5jb25uZWN0aW9ucyk7CisJbGlzdF9hZGRfdGFpbF9yY3UoJnJlc291cmNlLT5yZXNvdXJjZXMsICZkcmJkX3Jlc291cmNlcyk7CisJbXV0ZXhfaW5pdCgmcmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKKwlzcGluX2xvY2tfaW5pdCgmcmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlyZXR1cm4gcmVzb3VyY2U7CiAKLQlpZiAoZHJiZF9hbGxvY19zb2NrZXQoJnRjb25uLT5kYXRhKSkKLQkJZ290byBmYWlsOwotCWlmIChkcmJkX2FsbG9jX3NvY2tldCgmdGNvbm4tPm1ldGEpKQotCQlnb3RvIGZhaWw7Ci0KLQlpZiAoIXphbGxvY19jcHVtYXNrX3ZhcigmdGNvbm4tPmNwdV9tYXNrLCBHRlBfS0VSTkVMKSkKLQkJZ290byBmYWlsOwotCi0JaWYgKHNldF9yZXNvdXJjZV9vcHRpb25zKHRjb25uLCByZXNfb3B0cykpCi0JCWdvdG8gZmFpbDsKLQotCXRjb25uLT5jdXJyZW50X2Vwb2NoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfZXBvY2gpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRjb25uLT5jdXJyZW50X2Vwb2NoKQotCQlnb3RvIGZhaWw7Ci0KLQlJTklUX0xJU1RfSEVBRCgmdGNvbm4tPnRyYW5zZmVyX2xvZyk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmdGNvbm4tPmN1cnJlbnRfZXBvY2gtPmxpc3QpOwotCXRjb25uLT5lcG9jaHMgPSAxOwotCXNwaW5fbG9ja19pbml0KCZ0Y29ubi0+ZXBvY2hfbG9jayk7Ci0JdGNvbm4tPndyaXRlX29yZGVyaW5nID0gV09fYmRldl9mbHVzaDsKLQotCXRjb25uLT5zZW5kLnNlZW5fYW55X3dyaXRlX3lldCA9IGZhbHNlOwotCXRjb25uLT5zZW5kLmN1cnJlbnRfZXBvY2hfbnIgPSAwOwotCXRjb25uLT5zZW5kLmN1cnJlbnRfZXBvY2hfd3JpdGVzID0gMDsKLQotCXRjb25uLT5jc3RhdGUgPSBDX1NUQU5EQUxPTkU7Ci0JbXV0ZXhfaW5pdCgmdGNvbm4tPmNzdGF0ZV9tdXRleCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnRjb25uLT5yZXFfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmdGNvbm4tPmNvbmZfdXBkYXRlKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0Y29ubi0+cGluZ193YWl0KTsKLQlpZHJfaW5pdCgmdGNvbm4tPnZvbHVtZXMpOwotCi0JZHJiZF9pbml0X3dvcmtxdWV1ZSgmdGNvbm4tPnNlbmRlcl93b3JrKTsKLQltdXRleF9pbml0KCZ0Y29ubi0+ZGF0YS5tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmdGNvbm4tPm1ldGEubXV0ZXgpOwotCi0JZHJiZF90aHJlYWRfaW5pdCh0Y29ubiwgJnRjb25uLT5yZWNlaXZlciwgZHJiZGRfaW5pdCwgInJlY2VpdmVyIik7Ci0JZHJiZF90aHJlYWRfaW5pdCh0Y29ubiwgJnRjb25uLT53b3JrZXIsIGRyYmRfd29ya2VyLCAid29ya2VyIik7Ci0JZHJiZF90aHJlYWRfaW5pdCh0Y29ubiwgJnRjb25uLT5hc2VuZGVyLCBkcmJkX2FzZW5kZXIsICJhc2VuZGVyIik7Ci0KLQlrcmVmX2luaXQoJnRjb25uLT5rcmVmKTsKLQlsaXN0X2FkZF90YWlsX3JjdSgmdGNvbm4tPmFsbF90Y29ubiwgJmRyYmRfdGNvbm5zKTsKLQotCXJldHVybiB0Y29ubjsKLQorZmFpbF9mcmVlX25hbWU6CisJa2ZyZWUocmVzb3VyY2UtPm5hbWUpOworZmFpbF9mcmVlX3Jlc291cmNlOgorCWtmcmVlKHJlc291cmNlKTsKIGZhaWw6Ci0Ja2ZyZWUodGNvbm4tPmN1cnJlbnRfZXBvY2gpOwotCWZyZWVfY3B1bWFza192YXIodGNvbm4tPmNwdV9tYXNrKTsKLQlkcmJkX2ZyZWVfc29ja2V0KCZ0Y29ubi0+bWV0YSk7Ci0JZHJiZF9mcmVlX3NvY2tldCgmdGNvbm4tPmRhdGEpOwotCWtmcmVlKHRjb25uLT5uYW1lKTsKLQlrZnJlZSh0Y29ubik7Ci0KIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBjb25uX2Rlc3Ryb3koc3RydWN0IGtyZWYgKmtyZWYpCisvKiBjYWxsZXIgbXVzdCBiZSB1bmRlciBnZW5sX2xvY2soKSAqLworc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubl9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHJlc19vcHRzICpyZXNfb3B0cykKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRyYmRfdGNvbm4sIGtyZWYpOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOwogCi0JaWYgKGF0b21pY19yZWFkKCZ0Y29ubi0+Y3VycmVudF9lcG9jaC0+ZXBvY2hfc2l6ZSkgIT0gIDApCi0JCWNvbm5fZXJyKHRjb25uLCAiZXBvY2hfc2l6ZTolZFxuIiwgYXRvbWljX3JlYWQoJnRjb25uLT5jdXJyZW50X2Vwb2NoLT5lcG9jaF9zaXplKSk7Ci0Ja2ZyZWUodGNvbm4tPmN1cnJlbnRfZXBvY2gpOworCWNvbm5lY3Rpb24gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb25uZWN0aW9uKQorCQlyZXR1cm4gTlVMTDsKIAotCWlkcl9kZXN0cm95KCZ0Y29ubi0+dm9sdW1lcyk7CisJaWYgKGRyYmRfYWxsb2Nfc29ja2V0KCZjb25uZWN0aW9uLT5kYXRhKSkKKwkJZ290byBmYWlsOworCWlmIChkcmJkX2FsbG9jX3NvY2tldCgmY29ubmVjdGlvbi0+bWV0YSkpCisJCWdvdG8gZmFpbDsKIAotCWZyZWVfY3B1bWFza192YXIodGNvbm4tPmNwdV9tYXNrKTsKLQlkcmJkX2ZyZWVfc29ja2V0KCZ0Y29ubi0+bWV0YSk7Ci0JZHJiZF9mcmVlX3NvY2tldCgmdGNvbm4tPmRhdGEpOwotCWtmcmVlKHRjb25uLT5uYW1lKTsKLQlrZnJlZSh0Y29ubi0+aW50X2RpZ19pbik7Ci0Ja2ZyZWUodGNvbm4tPmludF9kaWdfdnYpOwotCWtmcmVlKHRjb25uKTsKKwljb25uZWN0aW9uLT5jdXJyZW50X2Vwb2NoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfZXBvY2gpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gpCisJCWdvdG8gZmFpbDsKKworCUlOSVRfTElTVF9IRUFEKCZjb25uZWN0aW9uLT50cmFuc2Zlcl9sb2cpOworCisJSU5JVF9MSVNUX0hFQUQoJmNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmxpc3QpOworCWNvbm5lY3Rpb24tPmVwb2NocyA9IDE7CisJc3Bpbl9sb2NrX2luaXQoJmNvbm5lY3Rpb24tPmVwb2NoX2xvY2spOworCWNvbm5lY3Rpb24tPndyaXRlX29yZGVyaW5nID0gV09fYmRldl9mbHVzaDsKKworCWNvbm5lY3Rpb24tPnNlbmQuc2Vlbl9hbnlfd3JpdGVfeWV0ID0gZmFsc2U7CisJY29ubmVjdGlvbi0+c2VuZC5jdXJyZW50X2Vwb2NoX25yID0gMDsKKwljb25uZWN0aW9uLT5zZW5kLmN1cnJlbnRfZXBvY2hfd3JpdGVzID0gMDsKKworCXJlc291cmNlID0gZHJiZF9jcmVhdGVfcmVzb3VyY2UobmFtZSk7CisJaWYgKCFyZXNvdXJjZSkKKwkJZ290byBmYWlsOworCisJY29ubmVjdGlvbi0+Y3N0YXRlID0gQ19TVEFOREFMT05FOworCW11dGV4X2luaXQoJmNvbm5lY3Rpb24tPmNzdGF0ZV9tdXRleCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY29ubmVjdGlvbi0+cGluZ193YWl0KTsKKwlpZHJfaW5pdCgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzKTsKKworCWRyYmRfaW5pdF93b3JrcXVldWUoJmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrKTsKKwltdXRleF9pbml0KCZjb25uZWN0aW9uLT5kYXRhLm11dGV4KTsKKwltdXRleF9pbml0KCZjb25uZWN0aW9uLT5tZXRhLm11dGV4KTsKKworCWRyYmRfdGhyZWFkX2luaXQocmVzb3VyY2UsICZjb25uZWN0aW9uLT5yZWNlaXZlciwgZHJiZF9yZWNlaXZlciwgInJlY2VpdmVyIik7CisJY29ubmVjdGlvbi0+cmVjZWl2ZXIuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJZHJiZF90aHJlYWRfaW5pdChyZXNvdXJjZSwgJmNvbm5lY3Rpb24tPndvcmtlciwgZHJiZF93b3JrZXIsICJ3b3JrZXIiKTsKKwljb25uZWN0aW9uLT53b3JrZXIuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJZHJiZF90aHJlYWRfaW5pdChyZXNvdXJjZSwgJmNvbm5lY3Rpb24tPmFzZW5kZXIsIGRyYmRfYXNlbmRlciwgImFzZW5kZXIiKTsKKwljb25uZWN0aW9uLT5hc2VuZGVyLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCisJa3JlZl9pbml0KCZjb25uZWN0aW9uLT5rcmVmKTsKKworCWNvbm5lY3Rpb24tPnJlc291cmNlID0gcmVzb3VyY2U7CisKKwlpZiAoc2V0X3Jlc291cmNlX29wdGlvbnMocmVzb3VyY2UsIHJlc19vcHRzKSkKKwkJZ290byBmYWlsX3Jlc291cmNlOworCisJa3JlZl9nZXQoJnJlc291cmNlLT5rcmVmKTsKKwlsaXN0X2FkZF90YWlsX3JjdSgmY29ubmVjdGlvbi0+Y29ubmVjdGlvbnMsICZyZXNvdXJjZS0+Y29ubmVjdGlvbnMpOworCXJldHVybiBjb25uZWN0aW9uOworCitmYWlsX3Jlc291cmNlOgorCWxpc3RfZGVsKCZyZXNvdXJjZS0+cmVzb3VyY2VzKTsKKwlkcmJkX2ZyZWVfcmVzb3VyY2UocmVzb3VyY2UpOworZmFpbDoKKwlrZnJlZShjb25uZWN0aW9uLT5jdXJyZW50X2Vwb2NoKTsKKwlkcmJkX2ZyZWVfc29ja2V0KCZjb25uZWN0aW9uLT5tZXRhKTsKKwlkcmJkX2ZyZWVfc29ja2V0KCZjb25uZWN0aW9uLT5kYXRhKTsKKwlrZnJlZShjb25uZWN0aW9uKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAotaW50IGluaXRfc3VibWl0dGVyKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkIGRyYmRfZGVzdHJveV9jb25uZWN0aW9uKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRyYmRfY29ubmVjdGlvbiwga3JlZik7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlID0gY29ubmVjdGlvbi0+cmVzb3VyY2U7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmVwb2NoX3NpemUpICE9ICAwKQorCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiZXBvY2hfc2l6ZTolZFxuIiwgYXRvbWljX3JlYWQoJmNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmVwb2NoX3NpemUpKTsKKwlrZnJlZShjb25uZWN0aW9uLT5jdXJyZW50X2Vwb2NoKTsKKworCWlkcl9kZXN0cm95KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMpOworCisJZHJiZF9mcmVlX3NvY2tldCgmY29ubmVjdGlvbi0+bWV0YSk7CisJZHJiZF9mcmVlX3NvY2tldCgmY29ubmVjdGlvbi0+ZGF0YSk7CisJa2ZyZWUoY29ubmVjdGlvbi0+aW50X2RpZ19pbik7CisJa2ZyZWUoY29ubmVjdGlvbi0+aW50X2RpZ192dik7CisJa2ZyZWUoY29ubmVjdGlvbik7CisJa3JlZl9wdXQoJnJlc291cmNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2UpOworfQorCitzdGF0aWMgaW50IGluaXRfc3VibWl0dGVyKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCS8qIG9wZW5jb2RlZCBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgpLAogCSAqIHRvIGJlIGFibGUgdG8gc2F5ICJkcmJkJWQiLCAuLi4sIG1pbm9yICovCi0JbWRldi0+c3VibWl0LndxID0gYWxsb2Nfd29ya3F1ZXVlKCJkcmJkJXVfc3VibWl0IiwKLQkJCVdRX1VOQk9VTkQgfCBXUV9NRU1fUkVDTEFJTSwgMSwgbWRldi0+bWlub3IpOwotCWlmICghbWRldi0+c3VibWl0LndxKQorCWRldmljZS0+c3VibWl0LndxID0gYWxsb2Nfd29ya3F1ZXVlKCJkcmJkJXVfc3VibWl0IiwKKwkJCVdRX1VOQk9VTkQgfCBXUV9NRU1fUkVDTEFJTSwgMSwgZGV2aWNlLT5taW5vcik7CisJaWYgKCFkZXZpY2UtPnN1Ym1pdC53cSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlJTklUX1dPUksoJm1kZXYtPnN1Ym1pdC53b3JrZXIsIGRvX3N1Ym1pdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJm1kZXYtPnN1Ym1pdC5sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+c3VibWl0LndyaXRlcyk7CisJSU5JVF9XT1JLKCZkZXZpY2UtPnN1Ym1pdC53b3JrZXIsIGRvX3N1Ym1pdCk7CisJc3Bpbl9sb2NrX2luaXQoJmRldmljZS0+c3VibWl0LmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPnN1Ym1pdC53cml0ZXMpOwogCXJldHVybiAwOwogfQogCi1lbnVtIGRyYmRfcmV0X2NvZGUgY29ubl9uZXdfbWlub3Ioc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bnNpZ25lZCBpbnQgbWlub3IsIGludCB2bnIpCitlbnVtIGRyYmRfcmV0X2NvZGUgZHJiZF9jcmVhdGVfZGV2aWNlKHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSwgdW5zaWduZWQgaW50IG1pbm9yLCBpbnQgdm5yKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsICp0bXBfcGVlcl9kZXZpY2U7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7Ci0JaW50IHZucl9nb3QgPSB2bnI7Ci0JaW50IG1pbm9yX2dvdCA9IG1pbm9yOworCWludCBpZDsKIAllbnVtIGRyYmRfcmV0X2NvZGUgZXJyID0gRVJSX05PTUVNOwogCi0JbWRldiA9IG1pbm9yX3RvX21kZXYobWlub3IpOwotCWlmIChtZGV2KQorCWRldmljZSA9IG1pbm9yX3RvX2RldmljZShtaW5vcik7CisJaWYgKGRldmljZSkKIAkJcmV0dXJuIEVSUl9NSU5PUl9FWElTVFM7CiAKIAkvKiBHRlBfS0VSTkVMLCB3ZSBhcmUgb3V0c2lkZSBvZiBhbGwgd3JpdGUtb3V0IHBhdGhzICovCi0JbWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkcmJkX2NvbmYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1kZXYpCisJZGV2aWNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZpY2UpCiAJCXJldHVybiBFUlJfTk9NRU07CisJa3JlZl9pbml0KCZkZXZpY2UtPmtyZWYpOwogCi0Ja3JlZl9nZXQoJnRjb25uLT5rcmVmKTsKLQltZGV2LT50Y29ubiA9IHRjb25uOworCWtyZWZfZ2V0KCZyZXNvdXJjZS0+a3JlZik7CisJZGV2aWNlLT5yZXNvdXJjZSA9IHJlc291cmNlOworCWRldmljZS0+bWlub3IgPSBtaW5vcjsKKwlkZXZpY2UtPnZuciA9IHZucjsKIAotCW1kZXYtPm1pbm9yID0gbWlub3I7Ci0JbWRldi0+dm5yID0gdm5yOwotCi0JZHJiZF9pbml0X3NldF9kZWZhdWx0cyhtZGV2KTsKKwlkcmJkX2luaXRfc2V0X2RlZmF1bHRzKGRldmljZSk7CiAKIAlxID0gYmxrX2FsbG9jX3F1ZXVlKEdGUF9LRVJORUwpOwogCWlmICghcSkKIAkJZ290byBvdXRfbm9fcTsKLQltZGV2LT5ycV9xdWV1ZSA9IHE7Ci0JcS0+cXVldWVkYXRhICAgPSBtZGV2OworCWRldmljZS0+cnFfcXVldWUgPSBxOworCXEtPnF1ZXVlZGF0YSAgID0gZGV2aWNlOwogCiAJZGlzayA9IGFsbG9jX2Rpc2soMSk7CiAJaWYgKCFkaXNrKQogCQlnb3RvIG91dF9ub19kaXNrOwotCW1kZXYtPnZkaXNrID0gZGlzazsKKwlkZXZpY2UtPnZkaXNrID0gZGlzazsKIAogCXNldF9kaXNrX3JvKGRpc2ssIHRydWUpOwogCkBAIC0yNjUxLDE0ICsyNzMyLDE0IEBACiAJZGlzay0+Zmlyc3RfbWlub3IgPSBtaW5vcjsKIAlkaXNrLT5mb3BzID0gJmRyYmRfb3BzOwogCXNwcmludGYoZGlzay0+ZGlza19uYW1lLCAiZHJiZCVkIiwgbWlub3IpOwotCWRpc2stPnByaXZhdGVfZGF0YSA9IG1kZXY7CisJZGlzay0+cHJpdmF0ZV9kYXRhID0gZGV2aWNlOwogCi0JbWRldi0+dGhpc19iZGV2ID0gYmRnZXQoTUtERVYoRFJCRF9NQUpPUiwgbWlub3IpKTsKKwlkZXZpY2UtPnRoaXNfYmRldiA9IGJkZ2V0KE1LREVWKERSQkRfTUFKT1IsIG1pbm9yKSk7CiAJLyogd2UgaGF2ZSBubyBwYXJ0aXRpb25zLiB3ZSBjb250YWluIG9ubHkgb3Vyc2VsdmVzLiAqLwotCW1kZXYtPnRoaXNfYmRldi0+YmRfY29udGFpbnMgPSBtZGV2LT50aGlzX2JkZXY7CisJZGV2aWNlLT50aGlzX2JkZXYtPmJkX2NvbnRhaW5zID0gZGV2aWNlLT50aGlzX2JkZXY7CiAKIAlxLT5iYWNraW5nX2Rldl9pbmZvLmNvbmdlc3RlZF9mbiA9IGRyYmRfY29uZ2VzdGVkOwotCXEtPmJhY2tpbmdfZGV2X2luZm8uY29uZ2VzdGVkX2RhdGEgPSBtZGV2OworCXEtPmJhY2tpbmdfZGV2X2luZm8uY29uZ2VzdGVkX2RhdGEgPSBkZXZpY2U7CiAKIAlibGtfcXVldWVfbWFrZV9yZXF1ZXN0KHEsIGRyYmRfbWFrZV9yZXF1ZXN0KTsKIAlibGtfcXVldWVfZmx1c2gocSwgUkVRX0ZMVVNIIHwgUkVRX0ZVQSk7CkBAIC0yNjY3LDcwICsyNzQ4LDEyNSBAQAogCWJsa19xdWV1ZV9tYXhfaHdfc2VjdG9ycyhxLCBEUkJEX01BWF9CSU9fU0laRV9TQUZFID4+IDgpOwogCWJsa19xdWV1ZV9ib3VuY2VfbGltaXQocSwgQkxLX0JPVU5DRV9BTlkpOwogCWJsa19xdWV1ZV9tZXJnZV9idmVjKHEsIGRyYmRfbWVyZ2VfYnZlYyk7Ci0JcS0+cXVldWVfbG9jayA9ICZtZGV2LT50Y29ubi0+cmVxX2xvY2s7IC8qIG5lZWRlZCBzaW5jZSB3ZSB1c2UgKi8KKwlxLT5xdWV1ZV9sb2NrID0gJnJlc291cmNlLT5yZXFfbG9jazsKIAotCW1kZXYtPm1kX2lvX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOwotCWlmICghbWRldi0+bWRfaW9fcGFnZSkKKwlkZXZpY2UtPm1kX2lvX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCWlmICghZGV2aWNlLT5tZF9pb19wYWdlKQogCQlnb3RvIG91dF9ub19pb19wYWdlOwogCi0JaWYgKGRyYmRfYm1faW5pdChtZGV2KSkKKwlpZiAoZHJiZF9ibV9pbml0KGRldmljZSkpCiAJCWdvdG8gb3V0X25vX2JpdG1hcDsKLQltZGV2LT5yZWFkX3JlcXVlc3RzID0gUkJfUk9PVDsKLQltZGV2LT53cml0ZV9yZXF1ZXN0cyA9IFJCX1JPT1Q7CisJZGV2aWNlLT5yZWFkX3JlcXVlc3RzID0gUkJfUk9PVDsKKwlkZXZpY2UtPndyaXRlX3JlcXVlc3RzID0gUkJfUk9PVDsKIAotCW1pbm9yX2dvdCA9IGlkcl9hbGxvYygmbWlub3JzLCBtZGV2LCBtaW5vciwgbWlub3IgKyAxLCBHRlBfS0VSTkVMKTsKLQlpZiAobWlub3JfZ290IDwgMCkgewotCQlpZiAobWlub3JfZ290ID09IC1FTk9TUEMpIHsKKwlpZCA9IGlkcl9hbGxvYygmZHJiZF9kZXZpY2VzLCBkZXZpY2UsIG1pbm9yLCBtaW5vciArIDEsIEdGUF9LRVJORUwpOworCWlmIChpZCA8IDApIHsKKwkJaWYgKGlkID09IC1FTk9TUEMpIHsKIAkJCWVyciA9IEVSUl9NSU5PUl9FWElTVFM7CiAJCQlkcmJkX21zZ19wdXRfaW5mbygicmVxdWVzdGVkIG1pbm9yIGV4aXN0cyBhbHJlYWR5Iik7CiAJCX0KIAkJZ290byBvdXRfbm9fbWlub3JfaWRyOwogCX0KKwlrcmVmX2dldCgmZGV2aWNlLT5rcmVmKTsKIAotCXZucl9nb3QgPSBpZHJfYWxsb2MoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIsIHZuciArIDEsIEdGUF9LRVJORUwpOwotCWlmICh2bnJfZ290IDwgMCkgewotCQlpZiAodm5yX2dvdCA9PSAtRU5PU1BDKSB7Ci0JCQllcnIgPSBFUlJfSU5WQUxJRF9SRVFVRVNUOwotCQkJZHJiZF9tc2dfcHV0X2luZm8oInJlcXVlc3RlZCB2b2x1bWUgZXhpc3RzIGFscmVhZHkiKTsKKwlpZCA9IGlkcl9hbGxvYygmcmVzb3VyY2UtPmRldmljZXMsIGRldmljZSwgdm5yLCB2bnIgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoaWQgPCAwKSB7CisJCWlmIChpZCA9PSAtRU5PU1BDKSB7CisJCQllcnIgPSBFUlJfTUlOT1JfRVhJU1RTOworCQkJZHJiZF9tc2dfcHV0X2luZm8oInJlcXVlc3RlZCBtaW5vciBleGlzdHMgYWxyZWFkeSIpOwogCQl9CiAJCWdvdG8gb3V0X2lkcl9yZW1vdmVfbWlub3I7CiAJfQorCWtyZWZfZ2V0KCZkZXZpY2UtPmtyZWYpOwogCi0JaWYgKGluaXRfc3VibWl0dGVyKG1kZXYpKSB7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+cGVlcl9kZXZpY2VzKTsKKwlmb3JfZWFjaF9jb25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlc291cmNlKSB7CisJCXBlZXJfZGV2aWNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwZWVyX2RldmljZSkKKwkJCWdvdG8gb3V0X2lkcl9yZW1vdmVfZnJvbV9yZXNvdXJjZTsKKwkJcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCQlwZWVyX2RldmljZS0+ZGV2aWNlID0gZGV2aWNlOworCisJCWxpc3RfYWRkKCZwZWVyX2RldmljZS0+cGVlcl9kZXZpY2VzLCAmZGV2aWNlLT5wZWVyX2RldmljZXMpOworCQlrcmVmX2dldCgmZGV2aWNlLT5rcmVmKTsKKworCQlpZCA9IGlkcl9hbGxvYygmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yLCB2bnIgKyAxLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGlkIDwgMCkgeworCQkJaWYgKGlkID09IC1FTk9TUEMpIHsKKwkJCQllcnIgPSBFUlJfSU5WQUxJRF9SRVFVRVNUOworCQkJCWRyYmRfbXNnX3B1dF9pbmZvKCJyZXF1ZXN0ZWQgdm9sdW1lIGV4aXN0cyBhbHJlYWR5Iik7CisJCQl9CisJCQlnb3RvIG91dF9pZHJfcmVtb3ZlX2Zyb21fcmVzb3VyY2U7CisJCX0KKwkJa3JlZl9nZXQoJmNvbm5lY3Rpb24tPmtyZWYpOworCX0KKworCWlmIChpbml0X3N1Ym1pdHRlcihkZXZpY2UpKSB7CiAJCWVyciA9IEVSUl9OT01FTTsKIAkJZHJiZF9tc2dfcHV0X2luZm8oInVuYWJsZSB0byBjcmVhdGUgc3VibWl0IHdvcmtxdWV1ZSIpOwogCQlnb3RvIG91dF9pZHJfcmVtb3ZlX3ZvbDsKIAl9CiAKIAlhZGRfZGlzayhkaXNrKTsKLQlrcmVmX2luaXQoJm1kZXYtPmtyZWYpOyAvKiBvbmUgcmVmIGZvciBib3RoIGlkcnMgYW5kIHRoZSB0aGUgYWRkX2Rpc2sgKi8KIAogCS8qIGluaGVyaXQgdGhlIGNvbm5lY3Rpb24gc3RhdGUgKi8KLQltZGV2LT5zdGF0ZS5jb25uID0gdGNvbm4tPmNzdGF0ZTsKLQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpCi0JCWRyYmRfY29ubmVjdGVkKG1kZXYpOworCWRldmljZS0+c3RhdGUuY29ubiA9IGZpcnN0X2Nvbm5lY3Rpb24ocmVzb3VyY2UpLT5jc3RhdGU7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKKwkJZm9yX2VhY2hfcGVlcl9kZXZpY2UocGVlcl9kZXZpY2UsIGRldmljZSkKKwkJCWRyYmRfY29ubmVjdGVkKHBlZXJfZGV2aWNlKTsKKwl9CiAKIAlyZXR1cm4gTk9fRVJST1I7CiAKIG91dF9pZHJfcmVtb3ZlX3ZvbDoKLQlpZHJfcmVtb3ZlKCZ0Y29ubi0+dm9sdW1lcywgdm5yX2dvdCk7CisJaWRyX3JlbW92ZSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCB2bnIpOworb3V0X2lkcl9yZW1vdmVfZnJvbV9yZXNvdXJjZToKKwlmb3JfZWFjaF9jb25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlc291cmNlKSB7CisJCXBlZXJfZGV2aWNlID0gaWRyX2ZpbmQoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgdm5yKTsKKwkJaWYgKHBlZXJfZGV2aWNlKSB7CisJCQlpZHJfcmVtb3ZlKCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHZucik7CisJCQlrcmVmX3B1dCgmY29ubmVjdGlvbi0+a3JlZiwgZHJiZF9kZXN0cm95X2Nvbm5lY3Rpb24pOworCQl9CisJfQorCWZvcl9lYWNoX3BlZXJfZGV2aWNlX3NhZmUocGVlcl9kZXZpY2UsIHRtcF9wZWVyX2RldmljZSwgZGV2aWNlKSB7CisJCWxpc3RfZGVsKCZwZWVyX2RldmljZS0+cGVlcl9kZXZpY2VzKTsKKwkJa2ZyZWUocGVlcl9kZXZpY2UpOworCX0KKwlpZHJfcmVtb3ZlKCZyZXNvdXJjZS0+ZGV2aWNlcywgdm5yKTsKIG91dF9pZHJfcmVtb3ZlX21pbm9yOgotCWlkcl9yZW1vdmUoJm1pbm9ycywgbWlub3JfZ290KTsKKwlpZHJfcmVtb3ZlKCZkcmJkX2RldmljZXMsIG1pbm9yKTsKIAlzeW5jaHJvbml6ZV9yY3UoKTsKIG91dF9ub19taW5vcl9pZHI6Ci0JZHJiZF9ibV9jbGVhbnVwKG1kZXYpOworCWRyYmRfYm1fY2xlYW51cChkZXZpY2UpOwogb3V0X25vX2JpdG1hcDoKLQlfX2ZyZWVfcGFnZShtZGV2LT5tZF9pb19wYWdlKTsKKwlfX2ZyZWVfcGFnZShkZXZpY2UtPm1kX2lvX3BhZ2UpOwogb3V0X25vX2lvX3BhZ2U6CiAJcHV0X2Rpc2soZGlzayk7CiBvdXRfbm9fZGlzazoKIAlibGtfY2xlYW51cF9xdWV1ZShxKTsKIG91dF9ub19xOgotCWtmcmVlKG1kZXYpOwotCWtyZWZfcHV0KCZ0Y29ubi0+a3JlZiwgJmNvbm5fZGVzdHJveSk7CisJa3JlZl9wdXQoJnJlc291cmNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2UpOworCWtmcmVlKGRldmljZSk7CiAJcmV0dXJuIGVycjsKIH0KIAordm9pZCBkcmJkX2RlbGV0ZV9kZXZpY2Uoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlID0gZGV2aWNlLT5yZXNvdXJjZTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCWludCByZWZzID0gMzsKKworCWZvcl9lYWNoX2Nvbm5lY3Rpb24oY29ubmVjdGlvbiwgcmVzb3VyY2UpIHsKKwkJaWRyX3JlbW92ZSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBkZXZpY2UtPnZucik7CisJCXJlZnMrKzsKKwl9CisJaWRyX3JlbW92ZSgmcmVzb3VyY2UtPmRldmljZXMsIGRldmljZS0+dm5yKTsKKwlpZHJfcmVtb3ZlKCZkcmJkX2RldmljZXMsIGRldmljZV90b19taW5vcihkZXZpY2UpKTsKKwlkZWxfZ2VuZGlzayhkZXZpY2UtPnZkaXNrKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKKwlrcmVmX3N1YigmZGV2aWNlLT5rcmVmLCByZWZzLCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKTsKK30KKwogaW50IF9faW5pdCBkcmJkX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyOwpAQCAtMjc2MSwxMCArMjg5NywxMCBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRyYmRfcHBfd2FpdCk7CiAKIAlkcmJkX3Byb2MgPSBOVUxMOyAvKiBwbGF5IHNhZmUgZm9yIGRyYmRfY2xlYW51cCAqLwotCWlkcl9pbml0KCZtaW5vcnMpOworCWlkcl9pbml0KCZkcmJkX2RldmljZXMpOwogCiAJcndsb2NrX2luaXQoJmdsb2JhbF9zdGF0ZV9sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmZHJiZF90Y29ubnMpOworCUlOSVRfTElTVF9IRUFEKCZkcmJkX3Jlc291cmNlcyk7CiAKIAllcnIgPSBkcmJkX2dlbmxfcmVnaXN0ZXIoKTsKIAlpZiAoZXJyKSB7CkBAIC0yODIyLDM3ICsyOTU4LDM5IEBACiAJa2ZyZWUobGRldik7CiB9CiAKLXZvaWQgZHJiZF9mcmVlX3NvY2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQordm9pZCBkcmJkX2ZyZWVfc29jayhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCWlmICh0Y29ubi0+ZGF0YS5zb2NrZXQpIHsKLQkJbXV0ZXhfbG9jaygmdGNvbm4tPmRhdGEubXV0ZXgpOwotCQlrZXJuZWxfc29ja19zaHV0ZG93bih0Y29ubi0+ZGF0YS5zb2NrZXQsIFNIVVRfUkRXUik7Ci0JCXNvY2tfcmVsZWFzZSh0Y29ubi0+ZGF0YS5zb2NrZXQpOwotCQl0Y29ubi0+ZGF0YS5zb2NrZXQgPSBOVUxMOwotCQltdXRleF91bmxvY2soJnRjb25uLT5kYXRhLm11dGV4KTsKKwlpZiAoY29ubmVjdGlvbi0+ZGF0YS5zb2NrZXQpIHsKKwkJbXV0ZXhfbG9jaygmY29ubmVjdGlvbi0+ZGF0YS5tdXRleCk7CisJCWtlcm5lbF9zb2NrX3NodXRkb3duKGNvbm5lY3Rpb24tPmRhdGEuc29ja2V0LCBTSFVUX1JEV1IpOworCQlzb2NrX3JlbGVhc2UoY29ubmVjdGlvbi0+ZGF0YS5zb2NrZXQpOworCQljb25uZWN0aW9uLT5kYXRhLnNvY2tldCA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+ZGF0YS5tdXRleCk7CiAJfQotCWlmICh0Y29ubi0+bWV0YS5zb2NrZXQpIHsKLQkJbXV0ZXhfbG9jaygmdGNvbm4tPm1ldGEubXV0ZXgpOwotCQlrZXJuZWxfc29ja19zaHV0ZG93bih0Y29ubi0+bWV0YS5zb2NrZXQsIFNIVVRfUkRXUik7Ci0JCXNvY2tfcmVsZWFzZSh0Y29ubi0+bWV0YS5zb2NrZXQpOwotCQl0Y29ubi0+bWV0YS5zb2NrZXQgPSBOVUxMOwotCQltdXRleF91bmxvY2soJnRjb25uLT5tZXRhLm11dGV4KTsKKwlpZiAoY29ubmVjdGlvbi0+bWV0YS5zb2NrZXQpIHsKKwkJbXV0ZXhfbG9jaygmY29ubmVjdGlvbi0+bWV0YS5tdXRleCk7CisJCWtlcm5lbF9zb2NrX3NodXRkb3duKGNvbm5lY3Rpb24tPm1ldGEuc29ja2V0LCBTSFVUX1JEV1IpOworCQlzb2NrX3JlbGVhc2UoY29ubmVjdGlvbi0+bWV0YS5zb2NrZXQpOworCQljb25uZWN0aW9uLT5tZXRhLnNvY2tldCA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+bWV0YS5tdXRleCk7CiAJfQogfQogCiAvKiBtZXRhIGRhdGEgbWFuYWdlbWVudCAqLwogCi12b2lkIGNvbm5fbWRfc3luYyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCit2b2lkIGNvbm5fbWRfc3luYyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCWludCB2bnI7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKSB7Ci0JCWtyZWZfZ2V0KCZtZGV2LT5rcmVmKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisKKwkJa3JlZl9nZXQoJmRldmljZS0+a3JlZik7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlkcmJkX21kX3N5bmMobWRldik7Ci0JCWtyZWZfcHV0KCZtZGV2LT5rcmVmLCAmZHJiZF9taW5vcl9kZXN0cm95KTsKKwkJZHJiZF9tZF9zeW5jKGRldmljZSk7CisJCWtyZWZfcHV0KCZkZXZpY2UtPmtyZWYsIGRyYmRfZGVzdHJveV9kZXZpY2UpOwogCQlyY3VfcmVhZF9sb2NrKCk7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtMjg4Myw3ICszMDIxLDcgQEAKIAogCiAKLXZvaWQgZHJiZF9tZF93cml0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB2b2lkICpiKQordm9pZCBkcmJkX21kX3dyaXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB2b2lkICpiKQogewogCXN0cnVjdCBtZXRhX2RhdGFfb25fZGlzayAqYnVmZmVyID0gYjsKIAlzZWN0b3JfdCBzZWN0b3I7CkBAIC0yODkxLDM5ICszMDI5LDM5IEBACiAKIAltZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoKmJ1ZmZlcikpOwogCi0JYnVmZmVyLT5sYV9zaXplX3NlY3QgPSBjcHVfdG9fYmU2NChkcmJkX2dldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYpKTsKKwlidWZmZXItPmxhX3NpemVfc2VjdCA9IGNwdV90b19iZTY0KGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KSk7CiAJZm9yIChpID0gVUlfQ1VSUkVOVDsgaSA8IFVJX1NJWkU7IGkrKykKLQkJYnVmZmVyLT51dWlkW2ldID0gY3B1X3RvX2JlNjQobWRldi0+bGRldi0+bWQudXVpZFtpXSk7Ci0JYnVmZmVyLT5mbGFncyA9IGNwdV90b19iZTMyKG1kZXYtPmxkZXYtPm1kLmZsYWdzKTsKKwkJYnVmZmVyLT51dWlkW2ldID0gY3B1X3RvX2JlNjQoZGV2aWNlLT5sZGV2LT5tZC51dWlkW2ldKTsKKwlidWZmZXItPmZsYWdzID0gY3B1X3RvX2JlMzIoZGV2aWNlLT5sZGV2LT5tZC5mbGFncyk7CiAJYnVmZmVyLT5tYWdpYyA9IGNwdV90b19iZTMyKERSQkRfTURfTUFHSUNfODRfVU5DTEVBTik7CiAKLQlidWZmZXItPm1kX3NpemVfc2VjdCAgPSBjcHVfdG9fYmUzMihtZGV2LT5sZGV2LT5tZC5tZF9zaXplX3NlY3QpOwotCWJ1ZmZlci0+YWxfb2Zmc2V0ICAgICA9IGNwdV90b19iZTMyKG1kZXYtPmxkZXYtPm1kLmFsX29mZnNldCk7Ci0JYnVmZmVyLT5hbF9ucl9leHRlbnRzID0gY3B1X3RvX2JlMzIobWRldi0+YWN0X2xvZy0+bnJfZWxlbWVudHMpOworCWJ1ZmZlci0+bWRfc2l6ZV9zZWN0ICA9IGNwdV90b19iZTMyKGRldmljZS0+bGRldi0+bWQubWRfc2l6ZV9zZWN0KTsKKwlidWZmZXItPmFsX29mZnNldCAgICAgPSBjcHVfdG9fYmUzMihkZXZpY2UtPmxkZXYtPm1kLmFsX29mZnNldCk7CisJYnVmZmVyLT5hbF9ucl9leHRlbnRzID0gY3B1X3RvX2JlMzIoZGV2aWNlLT5hY3RfbG9nLT5ucl9lbGVtZW50cyk7CiAJYnVmZmVyLT5ibV9ieXRlc19wZXJfYml0ID0gY3B1X3RvX2JlMzIoQk1fQkxPQ0tfU0laRSk7Ci0JYnVmZmVyLT5kZXZpY2VfdXVpZCA9IGNwdV90b19iZTY0KG1kZXYtPmxkZXYtPm1kLmRldmljZV91dWlkKTsKKwlidWZmZXItPmRldmljZV91dWlkID0gY3B1X3RvX2JlNjQoZGV2aWNlLT5sZGV2LT5tZC5kZXZpY2VfdXVpZCk7CiAKLQlidWZmZXItPmJtX29mZnNldCA9IGNwdV90b19iZTMyKG1kZXYtPmxkZXYtPm1kLmJtX29mZnNldCk7Ci0JYnVmZmVyLT5sYV9wZWVyX21heF9iaW9fc2l6ZSA9IGNwdV90b19iZTMyKG1kZXYtPnBlZXJfbWF4X2Jpb19zaXplKTsKKwlidWZmZXItPmJtX29mZnNldCA9IGNwdV90b19iZTMyKGRldmljZS0+bGRldi0+bWQuYm1fb2Zmc2V0KTsKKwlidWZmZXItPmxhX3BlZXJfbWF4X2Jpb19zaXplID0gY3B1X3RvX2JlMzIoZGV2aWNlLT5wZWVyX21heF9iaW9fc2l6ZSk7CiAKLQlidWZmZXItPmFsX3N0cmlwZXMgPSBjcHVfdG9fYmUzMihtZGV2LT5sZGV2LT5tZC5hbF9zdHJpcGVzKTsKLQlidWZmZXItPmFsX3N0cmlwZV9zaXplXzRrID0gY3B1X3RvX2JlMzIobWRldi0+bGRldi0+bWQuYWxfc3RyaXBlX3NpemVfNGspOworCWJ1ZmZlci0+YWxfc3RyaXBlcyA9IGNwdV90b19iZTMyKGRldmljZS0+bGRldi0+bWQuYWxfc3RyaXBlcyk7CisJYnVmZmVyLT5hbF9zdHJpcGVfc2l6ZV80ayA9IGNwdV90b19iZTMyKGRldmljZS0+bGRldi0+bWQuYWxfc3RyaXBlX3NpemVfNGspOwogCi0JRF9BU1NFUlQoZHJiZF9tZF9zcyhtZGV2LT5sZGV2KSA9PSBtZGV2LT5sZGV2LT5tZC5tZF9vZmZzZXQpOwotCXNlY3RvciA9IG1kZXYtPmxkZXYtPm1kLm1kX29mZnNldDsKKwlEX0FTU0VSVChkZXZpY2UsIGRyYmRfbWRfc3MoZGV2aWNlLT5sZGV2KSA9PSBkZXZpY2UtPmxkZXYtPm1kLm1kX29mZnNldCk7CisJc2VjdG9yID0gZGV2aWNlLT5sZGV2LT5tZC5tZF9vZmZzZXQ7CiAKLQlpZiAoZHJiZF9tZF9zeW5jX3BhZ2VfaW8obWRldiwgbWRldi0+bGRldiwgc2VjdG9yLCBXUklURSkpIHsKKwlpZiAoZHJiZF9tZF9zeW5jX3BhZ2VfaW8oZGV2aWNlLCBkZXZpY2UtPmxkZXYsIHNlY3RvciwgV1JJVEUpKSB7CiAJCS8qIHRoaXMgd2FzIGEgdHJ5IGFueXdheXMgLi4uICovCi0JCWRldl9lcnIoREVWLCAibWV0YSBkYXRhIHVwZGF0ZSBmYWlsZWQhXG4iKTsKLQkJZHJiZF9jaGtfaW9fZXJyb3IobWRldiwgMSwgRFJCRF9NRVRBX0lPX0VSUk9SKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAibWV0YSBkYXRhIHVwZGF0ZSBmYWlsZWQhXG4iKTsKKwkJZHJiZF9jaGtfaW9fZXJyb3IoZGV2aWNlLCAxLCBEUkJEX01FVEFfSU9fRVJST1IpOwogCX0KIH0KIAogLyoqCiAgKiBkcmJkX21kX3N5bmMoKSAtIFdyaXRlcyB0aGUgbWV0YSBkYXRhIHN1cGVyIGJsb2NrIGlmIHRoZSBNRF9ESVJUWSBmbGFnIGJpdCBpcyBzZXQKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICovCi12b2lkIGRyYmRfbWRfc3luYyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX21kX3N5bmMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IG1ldGFfZGF0YV9vbl9kaXNrICpidWZmZXI7CiAKQEAgLTI5MzEsMzIgKzMwNjksMzIgQEAKIAlCVUlMRF9CVUdfT04oVUlfU0laRSAhPSA0KTsKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBtZXRhX2RhdGFfb25fZGlzaykgIT0gNDA5Nik7CiAKLQlkZWxfdGltZXIoJm1kZXYtPm1kX3N5bmNfdGltZXIpOworCWRlbF90aW1lcigmZGV2aWNlLT5tZF9zeW5jX3RpbWVyKTsKIAkvKiB0aW1lciBtYXkgYmUgcmVhcm1lZCBieSBkcmJkX21kX21hcmtfZGlydHkoKSBub3cuICovCi0JaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoTURfRElSVFksICZtZGV2LT5mbGFncykpCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoTURfRElSVFksICZkZXZpY2UtPmZsYWdzKSkKIAkJcmV0dXJuOwogCiAJLyogV2UgdXNlIGhlcmUgRF9GQUlMRUQgYW5kIG5vdCBEX0FUVEFDSElORyBiZWNhdXNlIHdlIHRyeSB0byB3cml0ZQogCSAqIG1ldGFkYXRhIGV2ZW4gaWYgd2UgZGV0YWNoIGR1ZSB0byBhIGRpc2sgZmFpbHVyZSEgKi8KLQlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfRkFJTEVEKSkKKwlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKQogCQlyZXR1cm47CiAKLQlidWZmZXIgPSBkcmJkX21kX2dldF9idWZmZXIobWRldik7CisJYnVmZmVyID0gZHJiZF9tZF9nZXRfYnVmZmVyKGRldmljZSk7CiAJaWYgKCFidWZmZXIpCiAJCWdvdG8gb3V0OwogCi0JZHJiZF9tZF93cml0ZShtZGV2LCBidWZmZXIpOworCWRyYmRfbWRfd3JpdGUoZGV2aWNlLCBidWZmZXIpOwogCi0JLyogVXBkYXRlIG1kZXYtPmxkZXYtPm1kLmxhX3NpemVfc2VjdCwKKwkvKiBVcGRhdGUgZGV2aWNlLT5sZGV2LT5tZC5sYV9zaXplX3NlY3QsCiAJICogc2luY2Ugd2UgdXBkYXRlZCBpdCBvbiBtZXRhZGF0YS4gKi8KLQltZGV2LT5sZGV2LT5tZC5sYV9zaXplX3NlY3QgPSBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYpOworCWRldmljZS0+bGRldi0+bWQubGFfc2l6ZV9zZWN0ID0gZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT50aGlzX2JkZXYpOwogCi0JZHJiZF9tZF9wdXRfYnVmZmVyKG1kZXYpOworCWRyYmRfbWRfcHV0X2J1ZmZlcihkZXZpY2UpOwogb3V0OgotCXB1dF9sZGV2KG1kZXYpOworCXB1dF9sZGV2KGRldmljZSk7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfYWN0aXZpdHlfbG9nX3N0cmlwZV9zaXplKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgaW50IGNoZWNrX2FjdGl2aXR5X2xvZ19zdHJpcGVfc2l6ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJc3RydWN0IG1ldGFfZGF0YV9vbl9kaXNrICpvbl9kaXNrLAogCQlzdHJ1Y3QgZHJiZF9tZCAqaW5fY29yZSkKIHsKQEAgLTI5OTYsMTIgKzMxMzQsMTIgQEAKIAogCXJldHVybiAwOwogZXJyOgotCWRldl9lcnIoREVWLCAiaW52YWxpZCBhY3Rpdml0eSBsb2cgc3RyaXBpbmc6IGFsX3N0cmlwZXM9JXUsIGFsX3N0cmlwZV9zaXplXzRrPSV1XG4iLAorCWRyYmRfZXJyKGRldmljZSwgImludmFsaWQgYWN0aXZpdHkgbG9nIHN0cmlwaW5nOiBhbF9zdHJpcGVzPSV1LCBhbF9zdHJpcGVfc2l6ZV80az0ldVxuIiwKIAkJCWFsX3N0cmlwZXMsIGFsX3N0cmlwZV9zaXplXzRrKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBjaGVja19vZmZzZXRzX2FuZF9zaXplcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqYmRldikKK3N0YXRpYyBpbnQgY2hlY2tfb2Zmc2V0c19hbmRfc2l6ZXMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX2JhY2tpbmdfZGV2ICpiZGV2KQogewogCXNlY3Rvcl90IGNhcGFjaXR5ID0gZHJiZF9nZXRfY2FwYWNpdHkoYmRldi0+bWRfYmRldik7CiAJc3RydWN0IGRyYmRfbWQgKmluX2NvcmUgPSAmYmRldi0+bWQ7CkBAIC0zMDY4LDcgKzMyMDYsNyBAQAogCXJldHVybiAwOwogCiBlcnI6Ci0JZGV2X2VycihERVYsICJtZXRhIGRhdGEgb2Zmc2V0cyBkb24ndCBtYWtlIHNlbnNlOiBpZHg9JWQgIgorCWRyYmRfZXJyKGRldmljZSwgIm1ldGEgZGF0YSBvZmZzZXRzIGRvbid0IG1ha2Ugc2Vuc2U6IGlkeD0lZCAiCiAJCQkiYWxfcz0ldSwgYWxfc3o0az0ldSwgYWxfb2Zmc2V0PSVkLCBibV9vZmZzZXQ9JWQsICIKIAkJCSJtZF9zaXplX3NlY3Q9JXUsIGxhX3NpemU9JWxsdSwgbWRfY2FwYWNpdHk9JWxsdVxuIiwKIAkJCWluX2NvcmUtPm1ldGFfZGV2X2lkeCwKQEAgLTMwODMsMjUgKzMyMjEsMjUgQEAKIAogLyoqCiAgKiBkcmJkX21kX3JlYWQoKSAtIFJlYWRzIGluIHRoZSBtZXRhIGRhdGEgc3VwZXIgYmxvY2sKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQGJkZXY6CURldmljZSBmcm9tIHdoaWNoIHRoZSBtZXRhIGRhdGEgc2hvdWxkIGJlIHJlYWQgaW4uCiAgKgogICogUmV0dXJuIE5PX0VSUk9SIG9uIHN1Y2Nlc3MsIGFuZCBhbiBlbnVtIGRyYmRfcmV0X2NvZGUgaW4gY2FzZQogICogc29tZXRoaW5nIGdvZXMgd3JvbmcuCiAgKgogICogQ2FsbGVkIGV4YWN0bHkgb25jZSBkdXJpbmcgZHJiZF9hZG1fYXR0YWNoKCksIHdoaWxlIHN0aWxsIGJlaW5nIERfRElTS0xFU1MsCi0gKiBldmVuIGJlZm9yZSBAYmRldiBpcyBhc3NpZ25lZCB0byBAbWRldi0+bGRldi4KKyAqIGV2ZW4gYmVmb3JlIEBiZGV2IGlzIGFzc2lnbmVkIHRvIEBkZXZpY2UtPmxkZXYuCiAgKi8KLWludCBkcmJkX21kX3JlYWQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYpCitpbnQgZHJiZF9tZF9yZWFkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqYmRldikKIHsKIAlzdHJ1Y3QgbWV0YV9kYXRhX29uX2Rpc2sgKmJ1ZmZlcjsKIAl1MzIgbWFnaWMsIGZsYWdzOwogCWludCBpLCBydiA9IE5PX0VSUk9SOwogCi0JaWYgKG1kZXYtPnN0YXRlLmRpc2sgIT0gRF9ESVNLTEVTUykKKwlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrICE9IERfRElTS0xFU1MpCiAJCXJldHVybiBFUlJfRElTS19DT05GSUdVUkVEOwogCi0JYnVmZmVyID0gZHJiZF9tZF9nZXRfYnVmZmVyKG1kZXYpOworCWJ1ZmZlciA9IGRyYmRfbWRfZ2V0X2J1ZmZlcihkZXZpY2UpOwogCWlmICghYnVmZmVyKQogCQlyZXR1cm4gRVJSX05PTUVNOwogCkBAIC0zMTEwLDEwICszMjQ4LDEwIEBACiAJYmRldi0+bWQubWV0YV9kZXZfaWR4ID0gYmRldi0+ZGlza19jb25mLT5tZXRhX2Rldl9pZHg7CiAJYmRldi0+bWQubWRfb2Zmc2V0ID0gZHJiZF9tZF9zcyhiZGV2KTsKIAotCWlmIChkcmJkX21kX3N5bmNfcGFnZV9pbyhtZGV2LCBiZGV2LCBiZGV2LT5tZC5tZF9vZmZzZXQsIFJFQUQpKSB7CisJaWYgKGRyYmRfbWRfc3luY19wYWdlX2lvKGRldmljZSwgYmRldiwgYmRldi0+bWQubWRfb2Zmc2V0LCBSRUFEKSkgewogCQkvKiBOT1RFOiBjYW4ndCBkbyBub3JtYWwgZXJyb3IgcHJvY2Vzc2luZyBoZXJlIGFzIHRoaXMgaXMKIAkJICAgY2FsbGVkIEJFRk9SRSBkaXNrIGlzIGF0dGFjaGVkICovCi0JCWRldl9lcnIoREVWLCAiRXJyb3Igd2hpbGUgcmVhZGluZyBtZXRhZGF0YS5cbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJFcnJvciB3aGlsZSByZWFkaW5nIG1ldGFkYXRhLlxuIik7CiAJCXJ2ID0gRVJSX0lPX01EX0RJU0s7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTMxMjMsNyArMzI2MSw3IEBACiAJaWYgKG1hZ2ljID09IERSQkRfTURfTUFHSUNfODRfVU5DTEVBTiB8fAogCSAgICAobWFnaWMgPT0gRFJCRF9NRF9NQUdJQ18wOCAmJiAhKGZsYWdzICYgTURGX0FMX0NMRUFOKSkpIHsKIAkJCS8qIGJ0dzogdGhhdCdzIEFjdGl2aXR5IExvZyBjbGVhbiwgbm90ICJhbGwiIGNsZWFuLiAqLwotCQlkZXZfZXJyKERFViwgIkZvdW5kIHVuY2xlYW4gbWV0YSBkYXRhLiBEaWQgeW91IFwiZHJiZGFkbSBhcHBseS1hbFwiP1xuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkZvdW5kIHVuY2xlYW4gbWV0YSBkYXRhLiBEaWQgeW91IFwiZHJiZGFkbSBhcHBseS1hbFwiP1xuIik7CiAJCXJ2ID0gRVJSX01EX1VOQ0xFQU47CiAJCWdvdG8gZXJyOwogCX0KQEAgLTMxMzEsMTQgKzMyNjksMTQgQEAKIAlydiA9IEVSUl9NRF9JTlZBTElEOwogCWlmIChtYWdpYyAhPSBEUkJEX01EX01BR0lDXzA4KSB7CiAJCWlmIChtYWdpYyA9PSBEUkJEX01EX01BR0lDXzA3KQotCQkJZGV2X2VycihERVYsICJGb3VuZCBvbGQgKDAuNykgbWV0YSBkYXRhIG1hZ2ljLiBEaWQgeW91IFwiZHJiZGFkbSBjcmVhdGUtbWRcIj9cbiIpOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiRm91bmQgb2xkICgwLjcpIG1ldGEgZGF0YSBtYWdpYy4gRGlkIHlvdSBcImRyYmRhZG0gY3JlYXRlLW1kXCI/XG4iKTsKIAkJZWxzZQotCQkJZGV2X2VycihERVYsICJNZXRhIGRhdGEgbWFnaWMgbm90IGZvdW5kLiBEaWQgeW91IFwiZHJiZGFkbSBjcmVhdGUtbWRcIj9cbiIpOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiTWV0YSBkYXRhIG1hZ2ljIG5vdCBmb3VuZC4gRGlkIHlvdSBcImRyYmRhZG0gY3JlYXRlLW1kXCI/XG4iKTsKIAkJZ290byBlcnI7CiAJfQogCiAJaWYgKGJlMzJfdG9fY3B1KGJ1ZmZlci0+Ym1fYnl0ZXNfcGVyX2JpdCkgIT0gQk1fQkxPQ0tfU0laRSkgewotCQlkZXZfZXJyKERFViwgInVuZXhwZWN0ZWQgYm1fYnl0ZXNfcGVyX2JpdDogJXUgKGV4cGVjdGVkICV1KVxuIiwKKwkJZHJiZF9lcnIoZGV2aWNlLCAidW5leHBlY3RlZCBibV9ieXRlc19wZXJfYml0OiAldSAoZXhwZWN0ZWQgJXUpXG4iLAogCQkgICAgYmUzMl90b19jcHUoYnVmZmVyLT5ibV9ieXRlc19wZXJfYml0KSwgQk1fQkxPQ0tfU0laRSk7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTMxNTUsMTgyICszMjkzLDE4MiBAQAogCWJkZXYtPm1kLmFsX29mZnNldCA9IGJlMzJfdG9fY3B1KGJ1ZmZlci0+YWxfb2Zmc2V0KTsKIAliZGV2LT5tZC5ibV9vZmZzZXQgPSBiZTMyX3RvX2NwdShidWZmZXItPmJtX29mZnNldCk7CiAKLQlpZiAoY2hlY2tfYWN0aXZpdHlfbG9nX3N0cmlwZV9zaXplKG1kZXYsIGJ1ZmZlciwgJmJkZXYtPm1kKSkKKwlpZiAoY2hlY2tfYWN0aXZpdHlfbG9nX3N0cmlwZV9zaXplKGRldmljZSwgYnVmZmVyLCAmYmRldi0+bWQpKQogCQlnb3RvIGVycjsKLQlpZiAoY2hlY2tfb2Zmc2V0c19hbmRfc2l6ZXMobWRldiwgYmRldikpCisJaWYgKGNoZWNrX29mZnNldHNfYW5kX3NpemVzKGRldmljZSwgYmRldikpCiAJCWdvdG8gZXJyOwogCiAJaWYgKGJlMzJfdG9fY3B1KGJ1ZmZlci0+Ym1fb2Zmc2V0KSAhPSBiZGV2LT5tZC5ibV9vZmZzZXQpIHsKLQkJZGV2X2VycihERVYsICJ1bmV4cGVjdGVkIGJtX29mZnNldDogJWQgKGV4cGVjdGVkICVkKVxuIiwKKwkJZHJiZF9lcnIoZGV2aWNlLCAidW5leHBlY3RlZCBibV9vZmZzZXQ6ICVkIChleHBlY3RlZCAlZClcbiIsCiAJCSAgICBiZTMyX3RvX2NwdShidWZmZXItPmJtX29mZnNldCksIGJkZXYtPm1kLmJtX29mZnNldCk7CiAJCWdvdG8gZXJyOwogCX0KIAlpZiAoYmUzMl90b19jcHUoYnVmZmVyLT5tZF9zaXplX3NlY3QpICE9IGJkZXYtPm1kLm1kX3NpemVfc2VjdCkgewotCQlkZXZfZXJyKERFViwgInVuZXhwZWN0ZWQgbWRfc2l6ZTogJXUgKGV4cGVjdGVkICV1KVxuIiwKKwkJZHJiZF9lcnIoZGV2aWNlLCAidW5leHBlY3RlZCBtZF9zaXplOiAldSAoZXhwZWN0ZWQgJXUpXG4iLAogCQkgICAgYmUzMl90b19jcHUoYnVmZmVyLT5tZF9zaXplX3NlY3QpLCBiZGV2LT5tZC5tZF9zaXplX3NlY3QpOwogCQlnb3RvIGVycjsKIAl9CiAKIAlydiA9IE5PX0VSUk9SOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlpZiAobWRldi0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKSB7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCkgewogCQl1bnNpZ25lZCBpbnQgcGVlcjsKIAkJcGVlciA9IGJlMzJfdG9fY3B1KGJ1ZmZlci0+bGFfcGVlcl9tYXhfYmlvX3NpemUpOwogCQlwZWVyID0gbWF4KHBlZXIsIERSQkRfTUFYX0JJT19TSVpFX1NBRkUpOwotCQltZGV2LT5wZWVyX21heF9iaW9fc2l6ZSA9IHBlZXI7CisJCWRldmljZS0+cGVlcl9tYXhfYmlvX3NpemUgPSBwZWVyOwogCX0KLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAKICBlcnI6Ci0JZHJiZF9tZF9wdXRfYnVmZmVyKG1kZXYpOworCWRyYmRfbWRfcHV0X2J1ZmZlcihkZXZpY2UpOwogCiAJcmV0dXJuIHJ2OwogfQogCiAvKioKICAqIGRyYmRfbWRfbWFya19kaXJ0eSgpIC0gTWFyayBtZXRhIGRhdGEgc3VwZXIgYmxvY2sgYXMgZGlydHkKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIENhbGwgdGhpcyBmdW5jdGlvbiBpZiB5b3UgY2hhbmdlIGFueXRoaW5nIHRoYXQgc2hvdWxkIGJlIHdyaXR0ZW4gdG8KICAqIHRoZSBtZXRhLWRhdGEgc3VwZXIgYmxvY2suIFRoaXMgZnVuY3Rpb24gc2V0cyBNRF9ESVJUWSwgYW5kIHN0YXJ0cyBhCiAgKiB0aW1lciB0aGF0IGVuc3VyZXMgdGhhdCB3aXRoaW4gZml2ZSBzZWNvbmRzIHlvdSBoYXZlIHRvIGNhbGwgZHJiZF9tZF9zeW5jKCkuCiAgKi8KICNpZmRlZiBERUJVRwotdm9pZCBkcmJkX21kX21hcmtfZGlydHlfKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jKQordm9pZCBkcmJkX21kX21hcmtfZGlydHlfKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgbGluZSwgY29uc3QgY2hhciAqZnVuYykKIHsKLQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoTURfRElSVFksICZtZGV2LT5mbGFncykpIHsKLQkJbW9kX3RpbWVyKCZtZGV2LT5tZF9zeW5jX3RpbWVyLCBqaWZmaWVzICsgSFopOwotCQltZGV2LT5sYXN0X21kX21hcmtfZGlydHkubGluZSA9IGxpbmU7Ci0JCW1kZXYtPmxhc3RfbWRfbWFya19kaXJ0eS5mdW5jID0gZnVuYzsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoTURfRElSVFksICZkZXZpY2UtPmZsYWdzKSkgeworCQltb2RfdGltZXIoJmRldmljZS0+bWRfc3luY190aW1lciwgamlmZmllcyArIEhaKTsKKwkJZGV2aWNlLT5sYXN0X21kX21hcmtfZGlydHkubGluZSA9IGxpbmU7CisJCWRldmljZS0+bGFzdF9tZF9tYXJrX2RpcnR5LmZ1bmMgPSBmdW5jOwogCX0KIH0KICNlbHNlCi12b2lkIGRyYmRfbWRfbWFya19kaXJ0eShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX21kX21hcmtfZGlydHkoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KE1EX0RJUlRZLCAmbWRldi0+ZmxhZ3MpKQotCQltb2RfdGltZXIoJm1kZXYtPm1kX3N5bmNfdGltZXIsIGppZmZpZXMgKyA1KkhaKTsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoTURfRElSVFksICZkZXZpY2UtPmZsYWdzKSkKKwkJbW9kX3RpbWVyKCZkZXZpY2UtPm1kX3N5bmNfdGltZXIsIGppZmZpZXMgKyA1KkhaKTsKIH0KICNlbmRpZgogCi12b2lkIGRyYmRfdXVpZF9tb3ZlX2hpc3Rvcnkoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpCit2b2lkIGRyYmRfdXVpZF9tb3ZlX2hpc3Rvcnkoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCWludCBpOwogCiAJZm9yIChpID0gVUlfSElTVE9SWV9TVEFSVDsgaSA8IFVJX0hJU1RPUllfRU5EOyBpKyspCi0JCW1kZXYtPmxkZXYtPm1kLnV1aWRbaSsxXSA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbaV07CisJCWRldmljZS0+bGRldi0+bWQudXVpZFtpKzFdID0gZGV2aWNlLT5sZGV2LT5tZC51dWlkW2ldOwogfQogCi12b2lkIF9fZHJiZF91dWlkX3NldChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgaWR4LCB1NjQgdmFsKSBfX211c3RfaG9sZChsb2NhbCkKK3ZvaWQgX19kcmJkX3V1aWRfc2V0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgaWR4LCB1NjQgdmFsKSBfX211c3RfaG9sZChsb2NhbCkKIHsKIAlpZiAoaWR4ID09IFVJX0NVUlJFTlQpIHsKLQkJaWYgKG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKQorCQlpZiAoZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSkKIAkJCXZhbCB8PSAxOwogCQllbHNlCiAJCQl2YWwgJj0gfigodTY0KTEpOwogCi0JCWRyYmRfc2V0X2VkX3V1aWQobWRldiwgdmFsKTsKKwkJZHJiZF9zZXRfZWRfdXVpZChkZXZpY2UsIHZhbCk7CiAJfQogCi0JbWRldi0+bGRldi0+bWQudXVpZFtpZHhdID0gdmFsOwotCWRyYmRfbWRfbWFya19kaXJ0eShtZGV2KTsKKwlkZXZpY2UtPmxkZXYtPm1kLnV1aWRbaWR4XSA9IHZhbDsKKwlkcmJkX21kX21hcmtfZGlydHkoZGV2aWNlKTsKIH0KIAotdm9pZCBfZHJiZF91dWlkX3NldChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgaWR4LCB1NjQgdmFsKSBfX211c3RfaG9sZChsb2NhbCkKK3ZvaWQgX2RyYmRfdXVpZF9zZXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCBpZHgsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPmxkZXYtPm1kLnV1aWRfbG9jaywgZmxhZ3MpOwotCV9fZHJiZF91dWlkX3NldChtZGV2LCBpZHgsIHZhbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7CisJX19kcmJkX3V1aWRfc2V0KGRldmljZSwgaWR4LCB2YWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7CiB9CiAKLXZvaWQgZHJiZF91dWlkX3NldChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgaWR4LCB1NjQgdmFsKSBfX211c3RfaG9sZChsb2NhbCkKK3ZvaWQgZHJiZF91dWlkX3NldChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IGlkeCwgdTY0IHZhbCkgX19tdXN0X2hvbGQobG9jYWwpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7Ci0JaWYgKG1kZXYtPmxkZXYtPm1kLnV1aWRbaWR4XSkgewotCQlkcmJkX3V1aWRfbW92ZV9oaXN0b3J5KG1kZXYpOwotCQltZGV2LT5sZGV2LT5tZC51dWlkW1VJX0hJU1RPUllfU1RBUlRdID0gbWRldi0+bGRldi0+bWQudXVpZFtpZHhdOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jaywgZmxhZ3MpOworCWlmIChkZXZpY2UtPmxkZXYtPm1kLnV1aWRbaWR4XSkgeworCQlkcmJkX3V1aWRfbW92ZV9oaXN0b3J5KGRldmljZSk7CisJCWRldmljZS0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUXSA9IGRldmljZS0+bGRldi0+bWQudXVpZFtpZHhdOwogCX0KLQlfX2RyYmRfdXVpZF9zZXQobWRldiwgaWR4LCB2YWwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmxkZXYtPm1kLnV1aWRfbG9jaywgZmxhZ3MpOworCV9fZHJiZF91dWlkX3NldChkZXZpY2UsIGlkeCwgdmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jaywgZmxhZ3MpOwogfQogCiAvKioKICAqIGRyYmRfdXVpZF9uZXdfY3VycmVudCgpIC0gQ3JlYXRlcyBhIG5ldyBjdXJyZW50IFVVSUQKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIENyZWF0ZXMgYSBuZXcgY3VycmVudCBVVUlELCBhbmQgcm90YXRlcyB0aGUgb2xkIGN1cnJlbnQgVVVJRCBpbnRvCiAgKiB0aGUgYml0bWFwIHNsb3QuIENhdXNlcyBhbiBpbmNyZW1lbnRhbCByZXN5bmMgdXBvbiBuZXh0IGNvbm5lY3QuCiAgKi8KLXZvaWQgZHJiZF91dWlkX25ld19jdXJyZW50KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpIF9fbXVzdF9ob2xkKGxvY2FsKQordm9pZCBkcmJkX3V1aWRfbmV3X2N1cnJlbnQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCXU2NCB2YWw7CiAJdW5zaWduZWQgbG9uZyBsb25nIGJtX3V1aWQ7CiAKIAlnZXRfcmFuZG9tX2J5dGVzKCZ2YWwsIHNpemVvZih1NjQpKTsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPmxkZXYtPm1kLnV1aWRfbG9jayk7Ci0JYm1fdXVpZCA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jayk7CisJYm1fdXVpZCA9IGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdOwogCiAJaWYgKGJtX3V1aWQpCi0JCWRldl93YXJuKERFViwgImJtIFVVSUQgd2FzIGFscmVhZHkgc2V0OiAlbGxYXG4iLCBibV91dWlkKTsKKwkJZHJiZF93YXJuKGRldmljZSwgImJtIFVVSUQgd2FzIGFscmVhZHkgc2V0OiAlbGxYXG4iLCBibV91dWlkKTsKIAotCW1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF07Ci0JX19kcmJkX3V1aWRfc2V0KG1kZXYsIFVJX0NVUlJFTlQsIHZhbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5sZGV2LT5tZC51dWlkX2xvY2spOworCWRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdID0gZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0NVUlJFTlRdOworCV9fZHJiZF91dWlkX3NldChkZXZpY2UsIFVJX0NVUlJFTlQsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jayk7CiAKLQlkcmJkX3ByaW50X3V1aWRzKG1kZXYsICJuZXcgY3VycmVudCBVVUlEIik7CisJZHJiZF9wcmludF91dWlkcyhkZXZpY2UsICJuZXcgY3VycmVudCBVVUlEIik7CiAJLyogZ2V0IGl0IHRvIHN0YWJsZSBzdG9yYWdlIF9ub3dfICovCi0JZHJiZF9tZF9zeW5jKG1kZXYpOworCWRyYmRfbWRfc3luYyhkZXZpY2UpOwogfQogCi12b2lkIGRyYmRfdXVpZF9zZXRfYm0oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdTY0IHZhbCkgX19tdXN0X2hvbGQobG9jYWwpCit2b2lkIGRyYmRfdXVpZF9zZXRfYm0oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaWYgKG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9PSAwICYmIHZhbCA9PSAwKQorCWlmIChkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9PSAwICYmIHZhbCA9PSAwKQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7CiAJaWYgKHZhbCA9PSAwKSB7Ci0JCWRyYmRfdXVpZF9tb3ZlX2hpc3RvcnkobWRldik7Ci0JCW1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0gPSBtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF07Ci0JCW1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9IDA7CisJCWRyYmRfdXVpZF9tb3ZlX2hpc3RvcnkoZGV2aWNlKTsKKwkJZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0hJU1RPUllfU1RBUlRdID0gZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF07CisJCWRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdID0gMDsKIAl9IGVsc2UgewotCQl1bnNpZ25lZCBsb25nIGxvbmcgYm1fdXVpZCA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXTsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGJtX3V1aWQgPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXTsKIAkJaWYgKGJtX3V1aWQpCi0JCQlkZXZfd2FybihERVYsICJibSBVVUlEIHdhcyBhbHJlYWR5IHNldDogJWxsWFxuIiwgYm1fdXVpZCk7CisJCQlkcmJkX3dhcm4oZGV2aWNlLCAiYm0gVVVJRCB3YXMgYWxyZWFkeSBzZXQ6ICVsbFhcbiIsIGJtX3V1aWQpOwogCi0JCW1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9IHZhbCAmIH4oKHU2NCkxKTsKKwkJZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPSB2YWwgJiB+KCh1NjQpMSk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmxkZXYtPm1kLnV1aWRfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7CiAKLQlkcmJkX21kX21hcmtfZGlydHkobWRldik7CisJZHJiZF9tZF9tYXJrX2RpcnR5KGRldmljZSk7CiB9CiAKIC8qKgogICogZHJiZF9ibWlvX3NldF9uX3dyaXRlKCkgLSBpb19mbiBmb3IgZHJiZF9xdWV1ZV9iaXRtYXBfaW8oKSBvciBkcmJkX2JpdG1hcF9pbygpCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBTZXRzIGFsbCBiaXRzIGluIHRoZSBiaXRtYXAgYW5kIHdyaXRlcyB0aGUgd2hvbGUgYml0bWFwIHRvIHN0YWJsZSBzdG9yYWdlLgogICovCi1pbnQgZHJiZF9ibWlvX3NldF9uX3dyaXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitpbnQgZHJiZF9ibWlvX3NldF9uX3dyaXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWludCBydiA9IC1FSU87CiAKLQlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9BVFRBQ0hJTkcpKSB7Ci0JCWRyYmRfbWRfc2V0X2ZsYWcobWRldiwgTURGX0ZVTExfU1lOQyk7Ci0JCWRyYmRfbWRfc3luYyhtZGV2KTsKLQkJZHJiZF9ibV9zZXRfYWxsKG1kZXYpOworCWlmIChnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfQVRUQUNISU5HKSkgeworCQlkcmJkX21kX3NldF9mbGFnKGRldmljZSwgTURGX0ZVTExfU1lOQyk7CisJCWRyYmRfbWRfc3luYyhkZXZpY2UpOworCQlkcmJkX2JtX3NldF9hbGwoZGV2aWNlKTsKIAotCQlydiA9IGRyYmRfYm1fd3JpdGUobWRldik7CisJCXJ2ID0gZHJiZF9ibV93cml0ZShkZXZpY2UpOwogCiAJCWlmICghcnYpIHsKLQkJCWRyYmRfbWRfY2xlYXJfZmxhZyhtZGV2LCBNREZfRlVMTF9TWU5DKTsKLQkJCWRyYmRfbWRfc3luYyhtZGV2KTsKKwkJCWRyYmRfbWRfY2xlYXJfZmxhZyhkZXZpY2UsIE1ERl9GVUxMX1NZTkMpOworCQkJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAJCX0KIAotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKIAlyZXR1cm4gcnY7CkBAIC0zMzM4LDE5ICszNDc2LDE5IEBACiAKIC8qKgogICogZHJiZF9ibWlvX2NsZWFyX25fd3JpdGUoKSAtIGlvX2ZuIGZvciBkcmJkX3F1ZXVlX2JpdG1hcF9pbygpIG9yIGRyYmRfYml0bWFwX2lvKCkKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIENsZWFycyBhbGwgYml0cyBpbiB0aGUgYml0bWFwIGFuZCB3cml0ZXMgdGhlIHdob2xlIGJpdG1hcCB0byBzdGFibGUgc3RvcmFnZS4KICAqLwotaW50IGRyYmRfYm1pb19jbGVhcl9uX3dyaXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitpbnQgZHJiZF9ibWlvX2NsZWFyX25fd3JpdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJ2ID0gLUVJTzsKIAotCWRyYmRfcmVzdW1lX2FsKG1kZXYpOwotCWlmIChnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0FUVEFDSElORykpIHsKLQkJZHJiZF9ibV9jbGVhcl9hbGwobWRldik7Ci0JCXJ2ID0gZHJiZF9ibV93cml0ZShtZGV2KTsKLQkJcHV0X2xkZXYobWRldik7CisJZHJiZF9yZXN1bWVfYWwoZGV2aWNlKTsKKwlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0FUVEFDSElORykpIHsKKwkJZHJiZF9ibV9jbGVhcl9hbGwoZGV2aWNlKTsKKwkJcnYgPSBkcmJkX2JtX3dyaXRlKGRldmljZSk7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJcmV0dXJuIHJ2OwpAQCAtMzM1OCw1MCArMzQ5Niw1MiBAQAogCiBzdGF0aWMgaW50IHdfYml0bWFwX2lvKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCB1bnVzZWQpCiB7Ci0Jc3RydWN0IGJtX2lvX3dvcmsgKndvcmsgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJtX2lvX3dvcmssIHcpOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0KKwkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX2RldmljZSwgYm1faW9fd29yay53KTsKKwlzdHJ1Y3QgYm1faW9fd29yayAqd29yayA9ICZkZXZpY2UtPmJtX2lvX3dvcms7CiAJaW50IHJ2ID0gLUVJTzsKIAotCURfQVNTRVJUKGF0b21pY19yZWFkKCZtZGV2LT5hcF9iaW9fY250KSA9PSAwKTsKKwlEX0FTU0VSVChkZXZpY2UsIGF0b21pY19yZWFkKCZkZXZpY2UtPmFwX2Jpb19jbnQpID09IDApOwogCi0JaWYgKGdldF9sZGV2KG1kZXYpKSB7Ci0JCWRyYmRfYm1fbG9jayhtZGV2LCB3b3JrLT53aHksIHdvcmstPmZsYWdzKTsKLQkJcnYgPSB3b3JrLT5pb19mbihtZGV2KTsKLQkJZHJiZF9ibV91bmxvY2sobWRldik7Ci0JCXB1dF9sZGV2KG1kZXYpOworCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CisJCWRyYmRfYm1fbG9jayhkZXZpY2UsIHdvcmstPndoeSwgd29yay0+ZmxhZ3MpOworCQlydiA9IHdvcmstPmlvX2ZuKGRldmljZSk7CisJCWRyYmRfYm1fdW5sb2NrKGRldmljZSk7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCi0JY2xlYXJfYml0X3VubG9jayhCSVRNQVBfSU8sICZtZGV2LT5mbGFncyk7Ci0Jd2FrZV91cCgmbWRldi0+bWlzY193YWl0KTsKKwljbGVhcl9iaXRfdW5sb2NrKEJJVE1BUF9JTywgJmRldmljZS0+ZmxhZ3MpOworCXdha2VfdXAoJmRldmljZS0+bWlzY193YWl0KTsKIAogCWlmICh3b3JrLT5kb25lKQotCQl3b3JrLT5kb25lKG1kZXYsIHJ2KTsKKwkJd29yay0+ZG9uZShkZXZpY2UsIHJ2KTsKIAotCWNsZWFyX2JpdChCSVRNQVBfSU9fUVVFVUVELCAmbWRldi0+ZmxhZ3MpOworCWNsZWFyX2JpdChCSVRNQVBfSU9fUVVFVUVELCAmZGV2aWNlLT5mbGFncyk7CiAJd29yay0+d2h5ID0gTlVMTDsKIAl3b3JrLT5mbGFncyA9IDA7CiAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBkcmJkX2xkZXZfZGVzdHJveShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX2xkZXZfZGVzdHJveShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlsY19kZXN0cm95KG1kZXYtPnJlc3luYyk7Ci0JbWRldi0+cmVzeW5jID0gTlVMTDsKLQlsY19kZXN0cm95KG1kZXYtPmFjdF9sb2cpOwotCW1kZXYtPmFjdF9sb2cgPSBOVUxMOworCWxjX2Rlc3Ryb3koZGV2aWNlLT5yZXN5bmMpOworCWRldmljZS0+cmVzeW5jID0gTlVMTDsKKwlsY19kZXN0cm95KGRldmljZS0+YWN0X2xvZyk7CisJZGV2aWNlLT5hY3RfbG9nID0gTlVMTDsKIAlfX25vX3dhcm4obG9jYWwsCi0JCWRyYmRfZnJlZV9iYyhtZGV2LT5sZGV2KTsKLQkJbWRldi0+bGRldiA9IE5VTEw7KTsKKwkJZHJiZF9mcmVlX2JjKGRldmljZS0+bGRldik7CisJCWRldmljZS0+bGRldiA9IE5VTEw7KTsKIAotCWNsZWFyX2JpdChHT19ESVNLTEVTUywgJm1kZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoR09fRElTS0xFU1MsICZkZXZpY2UtPmZsYWdzKTsKIH0KIAogc3RhdGljIGludCB3X2dvX2Rpc2tsZXNzKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCB1bnVzZWQpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPQorCQljb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfZGV2aWNlLCBnb19kaXNrbGVzcyk7CiAKLQlEX0FTU0VSVChtZGV2LT5zdGF0ZS5kaXNrID09IERfRkFJTEVEKTsKKwlEX0FTU0VSVChkZXZpY2UsIGRldmljZS0+c3RhdGUuZGlzayA9PSBEX0ZBSUxFRCk7CiAJLyogd2UgY2Fubm90IGFzc2VydCBsb2NhbF9jbnQgPT0gMCBoZXJlLCBhcyBnZXRfbGRldl9pZl9zdGF0ZSB3aWxsCiAJICogaW5jL2RlYyBpdCBmcmVxdWVudGx5LiBPbmNlIHdlIGFyZSBEX0RJU0tMRVNTLCBubyBvbmUgd2lsbCB0b3VjaAogCSAqIHRoZSBwcm90ZWN0ZWQgbWVtYmVycyBhbnltb3JlLCB0aG91Z2gsIHNvIG9uY2UgcHV0X2xkZXYgcmVhY2hlcyB6ZXJvCkBAIC0zNDIwLDI3ICszNTYwLDI3IEBACiAJICogV2Ugc3RpbGwgbmVlZCB0byBjaGVjayBpZiBib3RoIGJpdG1hcCBhbmQgbGRldiBhcmUgcHJlc2VudCwgd2UgbWF5CiAJICogZW5kIHVwIGhlcmUgYWZ0ZXIgYSBmYWlsZWQgYXR0YWNoLCBiZWZvcmUgbGRldiB3YXMgZXZlbiBhc3NpZ25lZC4KIAkgKi8KLQlpZiAobWRldi0+Yml0bWFwICYmIG1kZXYtPmxkZXYpIHsKKwlpZiAoZGV2aWNlLT5iaXRtYXAgJiYgZGV2aWNlLT5sZGV2KSB7CiAJCS8qIEFuIGludGVycnVwdGVkIHJlc3luYyBvciBzaW1pbGFyIGlzIGFsbG93ZWQgdG8gcmVjb3VudHMgYml0cwogCQkgKiB3aGlsZSB3ZSBkZXRhY2guCiAJCSAqIEFueSBtb2RpZmljYXRpb25zIHdvdWxkIG5vdCBiZSBleHBlY3RlZCBhbnltb3JlLCB0aG91Z2guCiAJCSAqLwotCQlpZiAoZHJiZF9iaXRtYXBfaW9fZnJvbV93b3JrZXIobWRldiwgZHJiZF9ibV93cml0ZSwKKwkJaWYgKGRyYmRfYml0bWFwX2lvX2Zyb21fd29ya2VyKGRldmljZSwgZHJiZF9ibV93cml0ZSwKIAkJCQkJImRldGFjaCIsIEJNX0xPQ0tFRF9URVNUX0FMTE9XRUQpKSB7Ci0JCQlpZiAodGVzdF9iaXQoV0FTX1JFQURfRVJST1IsICZtZGV2LT5mbGFncykpIHsKLQkJCQlkcmJkX21kX3NldF9mbGFnKG1kZXYsIE1ERl9GVUxMX1NZTkMpOwotCQkJCWRyYmRfbWRfc3luYyhtZGV2KTsKKwkJCWlmICh0ZXN0X2JpdChXQVNfUkVBRF9FUlJPUiwgJmRldmljZS0+ZmxhZ3MpKSB7CisJCQkJZHJiZF9tZF9zZXRfZmxhZyhkZXZpY2UsIE1ERl9GVUxMX1NZTkMpOworCQkJCWRyYmRfbWRfc3luYyhkZXZpY2UpOwogCQkJfQogCQl9CiAJfQogCi0JZHJiZF9mb3JjZV9zdGF0ZShtZGV2LCBOUyhkaXNrLCBEX0RJU0tMRVNTKSk7CisJZHJiZF9mb3JjZV9zdGF0ZShkZXZpY2UsIE5TKGRpc2ssIERfRElTS0xFU1MpKTsKIAlyZXR1cm4gMDsKIH0KIAogLyoqCiAgKiBkcmJkX3F1ZXVlX2JpdG1hcF9pbygpIC0gUXVldWVzIGFuIElPIG9wZXJhdGlvbiBvbiB0aGUgd2hvbGUgYml0bWFwCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBpb19mbjoJSU8gY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gYml0bWFwIElPIGlzIHBvc3NpYmxlCiAgKiBAZG9uZToJY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBiaXRtYXAgSU8gd2FzIHBlcmZvcm1lZAogICogQHdoeToJRGVzY3JpcHRpdmUgdGV4dCBvZiB0aGUgcmVhc29uIGZvciBkb2luZyB0aGUgSU8KQEAgLTM0NTAsNzYgKzM1OTAsNzcgQEAKICAqIGNhbGxlZCBmcm9tIHdvcmtlciBjb250ZXh0LiBJdCBNVVNUIE5PVCBiZSB1c2VkIHdoaWxlIGEgcHJldmlvdXMgc3VjaAogICogd29yayBpcyBzdGlsbCBwZW5kaW5nIQogICovCi12b2lkIGRyYmRfcXVldWVfYml0bWFwX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCi0JCQkgIGludCAoKmlvX2ZuKShzdHJ1Y3QgZHJiZF9jb25mICopLAotCQkJICB2b2lkICgqZG9uZSkoc3RydWN0IGRyYmRfY29uZiAqLCBpbnQpLAordm9pZCBkcmJkX3F1ZXVlX2JpdG1hcF9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKKwkJCSAgaW50ICgqaW9fZm4pKHN0cnVjdCBkcmJkX2RldmljZSAqKSwKKwkJCSAgdm9pZCAoKmRvbmUpKHN0cnVjdCBkcmJkX2RldmljZSAqLCBpbnQpLAogCQkJICBjaGFyICp3aHksIGVudW0gYm1fZmxhZyBmbGFncykKIHsKLQlEX0FTU0VSVChjdXJyZW50ID09IG1kZXYtPnRjb25uLT53b3JrZXIudGFzayk7CisJRF9BU1NFUlQoZGV2aWNlLCBjdXJyZW50ID09IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPndvcmtlci50YXNrKTsKIAotCURfQVNTRVJUKCF0ZXN0X2JpdChCSVRNQVBfSU9fUVVFVUVELCAmbWRldi0+ZmxhZ3MpKTsKLQlEX0FTU0VSVCghdGVzdF9iaXQoQklUTUFQX0lPLCAmbWRldi0+ZmxhZ3MpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5ibV9pb193b3JrLncubGlzdCkpOwotCWlmIChtZGV2LT5ibV9pb193b3JrLndoeSkKLQkJZGV2X2VycihERVYsICJGSVhNRSBnb2luZyB0byBxdWV1ZSAnJXMnIGJ1dCAnJXMnIHN0aWxsIHBlbmRpbmc/XG4iLAotCQkJd2h5LCBtZGV2LT5ibV9pb193b3JrLndoeSk7CisJRF9BU1NFUlQoZGV2aWNlLCAhdGVzdF9iaXQoQklUTUFQX0lPX1FVRVVFRCwgJmRldmljZS0+ZmxhZ3MpKTsKKwlEX0FTU0VSVChkZXZpY2UsICF0ZXN0X2JpdChCSVRNQVBfSU8sICZkZXZpY2UtPmZsYWdzKSk7CisJRF9BU1NFUlQoZGV2aWNlLCBsaXN0X2VtcHR5KCZkZXZpY2UtPmJtX2lvX3dvcmsudy5saXN0KSk7CisJaWYgKGRldmljZS0+Ym1faW9fd29yay53aHkpCisJCWRyYmRfZXJyKGRldmljZSwgIkZJWE1FIGdvaW5nIHRvIHF1ZXVlICclcycgYnV0ICclcycgc3RpbGwgcGVuZGluZz9cbiIsCisJCQl3aHksIGRldmljZS0+Ym1faW9fd29yay53aHkpOwogCi0JbWRldi0+Ym1faW9fd29yay5pb19mbiA9IGlvX2ZuOwotCW1kZXYtPmJtX2lvX3dvcmsuZG9uZSA9IGRvbmU7Ci0JbWRldi0+Ym1faW9fd29yay53aHkgPSB3aHk7Ci0JbWRldi0+Ym1faW9fd29yay5mbGFncyA9IGZsYWdzOworCWRldmljZS0+Ym1faW9fd29yay5pb19mbiA9IGlvX2ZuOworCWRldmljZS0+Ym1faW9fd29yay5kb25lID0gZG9uZTsKKwlkZXZpY2UtPmJtX2lvX3dvcmsud2h5ID0gd2h5OworCWRldmljZS0+Ym1faW9fd29yay5mbGFncyA9IGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlzZXRfYml0KEJJVE1BUF9JTywgJm1kZXYtPmZsYWdzKTsKLQlpZiAoYXRvbWljX3JlYWQoJm1kZXYtPmFwX2Jpb19jbnQpID09IDApIHsKLQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEJJVE1BUF9JT19RVUVVRUQsICZtZGV2LT5mbGFncykpCi0JCQlkcmJkX3F1ZXVlX3dvcmsoJm1kZXYtPnRjb25uLT5zZW5kZXJfd29yaywgJm1kZXYtPmJtX2lvX3dvcmsudyk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCXNldF9iaXQoQklUTUFQX0lPLCAmZGV2aWNlLT5mbGFncyk7CisJaWYgKGF0b21pY19yZWFkKCZkZXZpY2UtPmFwX2Jpb19jbnQpID09IDApIHsKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEJJVE1BUF9JT19RVUVVRUQsICZkZXZpY2UtPmZsYWdzKSkKKwkJCWRyYmRfcXVldWVfd29yaygmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkJCSZkZXZpY2UtPmJtX2lvX3dvcmsudyk7CiAJfQotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIH0KIAogLyoqCiAgKiBkcmJkX2JpdG1hcF9pbygpIC0gIERvZXMgYW4gSU8gb3BlcmF0aW9uIG9uIHRoZSB3aG9sZSBiaXRtYXAKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQGlvX2ZuOglJTyBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBiaXRtYXAgSU8gaXMgcG9zc2libGUKICAqIEB3aHk6CURlc2NyaXB0aXZlIHRleHQgb2YgdGhlIHJlYXNvbiBmb3IgZG9pbmcgdGhlIElPCiAgKgogICogZnJlZXplcyBhcHBsaWNhdGlvbiBJTyB3aGlsZSB0aGF0IHRoZSBhY3R1YWwgSU8gb3BlcmF0aW9ucyBydW5zLiBUaGlzCiAgKiBmdW5jdGlvbnMgTUFZIE5PVCBiZSBjYWxsZWQgZnJvbSB3b3JrZXIgY29udGV4dC4KICAqLwotaW50IGRyYmRfYml0bWFwX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCAoKmlvX2ZuKShzdHJ1Y3QgZHJiZF9jb25mICopLAoraW50IGRyYmRfYml0bWFwX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgKCppb19mbikoc3RydWN0IGRyYmRfZGV2aWNlICopLAogCQljaGFyICp3aHksIGVudW0gYm1fZmxhZyBmbGFncykKIHsKIAlpbnQgcnY7CiAKLQlEX0FTU0VSVChjdXJyZW50ICE9IG1kZXYtPnRjb25uLT53b3JrZXIudGFzayk7CisJRF9BU1NFUlQoZGV2aWNlLCBjdXJyZW50ICE9IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPndvcmtlci50YXNrKTsKIAogCWlmICgoZmxhZ3MgJiBCTV9MT0NLRURfU0VUX0FMTE9XRUQpID09IDApCi0JCWRyYmRfc3VzcGVuZF9pbyhtZGV2KTsKKwkJZHJiZF9zdXNwZW5kX2lvKGRldmljZSk7CiAKLQlkcmJkX2JtX2xvY2sobWRldiwgd2h5LCBmbGFncyk7Ci0JcnYgPSBpb19mbihtZGV2KTsKLQlkcmJkX2JtX3VubG9jayhtZGV2KTsKKwlkcmJkX2JtX2xvY2soZGV2aWNlLCB3aHksIGZsYWdzKTsKKwlydiA9IGlvX2ZuKGRldmljZSk7CisJZHJiZF9ibV91bmxvY2soZGV2aWNlKTsKIAogCWlmICgoZmxhZ3MgJiBCTV9MT0NLRURfU0VUX0FMTE9XRUQpID09IDApCi0JCWRyYmRfcmVzdW1lX2lvKG1kZXYpOworCQlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogCiAJcmV0dXJuIHJ2OwogfQogCi12b2lkIGRyYmRfbWRfc2V0X2ZsYWcoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IGZsYWcpIF9fbXVzdF9ob2xkKGxvY2FsKQordm9pZCBkcmJkX21kX3NldF9mbGFnKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgZmxhZykgX19tdXN0X2hvbGQobG9jYWwpCiB7Ci0JaWYgKChtZGV2LT5sZGV2LT5tZC5mbGFncyAmIGZsYWcpICE9IGZsYWcpIHsKLQkJZHJiZF9tZF9tYXJrX2RpcnR5KG1kZXYpOwotCQltZGV2LT5sZGV2LT5tZC5mbGFncyB8PSBmbGFnOworCWlmICgoZGV2aWNlLT5sZGV2LT5tZC5mbGFncyAmIGZsYWcpICE9IGZsYWcpIHsKKwkJZHJiZF9tZF9tYXJrX2RpcnR5KGRldmljZSk7CisJCWRldmljZS0+bGRldi0+bWQuZmxhZ3MgfD0gZmxhZzsKIAl9CiB9CiAKLXZvaWQgZHJiZF9tZF9jbGVhcl9mbGFnKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBmbGFnKSBfX211c3RfaG9sZChsb2NhbCkKK3ZvaWQgZHJiZF9tZF9jbGVhcl9mbGFnKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgZmxhZykgX19tdXN0X2hvbGQobG9jYWwpCiB7Ci0JaWYgKChtZGV2LT5sZGV2LT5tZC5mbGFncyAmIGZsYWcpICE9IDApIHsKLQkJZHJiZF9tZF9tYXJrX2RpcnR5KG1kZXYpOwotCQltZGV2LT5sZGV2LT5tZC5mbGFncyAmPSB+ZmxhZzsKKwlpZiAoKGRldmljZS0+bGRldi0+bWQuZmxhZ3MgJiBmbGFnKSAhPSAwKSB7CisJCWRyYmRfbWRfbWFya19kaXJ0eShkZXZpY2UpOworCQlkZXZpY2UtPmxkZXYtPm1kLmZsYWdzICY9IH5mbGFnOwogCX0KIH0KIGludCBkcmJkX21kX3Rlc3RfZmxhZyhzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqYmRldiwgaW50IGZsYWcpCkBAIC0zNTI5LDIzICszNjcwLDI1IEBACiAKIHN0YXRpYyB2b2lkIG1kX3N5bmNfdGltZXJfZm4odW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSAoc3RydWN0IGRyYmRfY29uZiAqKSBkYXRhOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gKHN0cnVjdCBkcmJkX2RldmljZSAqKSBkYXRhOwogCiAJLyogbXVzdCBub3QgZG91YmxlLXF1ZXVlISAqLwotCWlmIChsaXN0X2VtcHR5KCZtZGV2LT5tZF9zeW5jX3dvcmsubGlzdCkpCi0JCWRyYmRfcXVldWVfd29ya19mcm9udCgmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmbWRldi0+bWRfc3luY193b3JrKTsKKwlpZiAobGlzdF9lbXB0eSgmZGV2aWNlLT5tZF9zeW5jX3dvcmsubGlzdCkpCisJCWRyYmRfcXVldWVfd29ya19mcm9udCgmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkJICAgICAgJmRldmljZS0+bWRfc3luY193b3JrKTsKIH0KIAogc3RhdGljIGludCB3X21kX3N5bmMoc3RydWN0IGRyYmRfd29yayAqdywgaW50IHVudXNlZCkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9CisJCWNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9kZXZpY2UsIG1kX3N5bmNfd29yayk7CiAKLQlkZXZfd2FybihERVYsICJtZF9zeW5jX3RpbWVyIGV4cGlyZWQhIFdvcmtlciBjYWxscyBkcmJkX21kX3N5bmMoKS5cbiIpOworCWRyYmRfd2FybihkZXZpY2UsICJtZF9zeW5jX3RpbWVyIGV4cGlyZWQhIFdvcmtlciBjYWxscyBkcmJkX21kX3N5bmMoKS5cbiIpOwogI2lmZGVmIERFQlVHCi0JZGV2X3dhcm4oREVWLCAibGFzdCBtZF9tYXJrX2RpcnR5OiAlczoldVxuIiwKLQkJbWRldi0+bGFzdF9tZF9tYXJrX2RpcnR5LmZ1bmMsIG1kZXYtPmxhc3RfbWRfbWFya19kaXJ0eS5saW5lKTsKKwlkcmJkX3dhcm4oZGV2aWNlLCAibGFzdCBtZF9tYXJrX2RpcnR5OiAlczoldVxuIiwKKwkJZGV2aWNlLT5sYXN0X21kX21hcmtfZGlydHkuZnVuYywgZGV2aWNlLT5sYXN0X21kX21hcmtfZGlydHkubGluZSk7CiAjZW5kaWYKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM2MjEsMTggKzM3NjQsMTggQEAKIAogLyoqCiAgKiBkcmJkX3dhaXRfbWlzYyAgLSAgd2FpdCBmb3IgYSByZXF1ZXN0IHRvIG1ha2UgcHJvZ3Jlc3MKLSAqIEBtZGV2OglkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0CisgKiBAZGV2aWNlOglkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0CiAgKiBAaToJCXRoZSBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCBlbWJlZGRlZCBpbiBzdHJ1Y3QgZHJiZF9yZXF1ZXN0IG9yCiAgKgkJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0CiAgKi8KLWludCBkcmJkX3dhaXRfbWlzYyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSkKK2ludCBkcmJkX3dhaXRfbWlzYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGRyYmRfaW50ZXJ2YWwgKmkpCiB7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAlsb25nIHRpbWVvdXQ7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbmMgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKTsKKwluYyA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJaWYgKCFuYykgewogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIC1FVElNRURPVVQ7CkBAIC0zNjQwLDE0ICszNzgzLDE0IEBACiAJdGltZW91dCA9IG5jLT5rb19jb3VudCA/IG5jLT50aW1lb3V0ICogSFogLyAxMCAqIG5jLT5rb19jb3VudCA6IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JLyogSW5kaWNhdGUgdG8gd2FrZSB1cCBtZGV2LT5taXNjX3dhaXQgb24gcHJvZ3Jlc3MuICAqLworCS8qIEluZGljYXRlIHRvIHdha2UgdXAgZGV2aWNlLT5taXNjX3dhaXQgb24gcHJvZ3Jlc3MuICAqLwogCWktPndhaXRpbmcgPSB0cnVlOwotCXByZXBhcmVfdG9fd2FpdCgmbWRldi0+bWlzY193YWl0LCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJcHJlcGFyZV90b193YWl0KCZkZXZpY2UtPm1pc2Nfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0JZmluaXNoX3dhaXQoJm1kZXYtPm1pc2Nfd2FpdCwgJndhaXQpOwotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JaWYgKCF0aW1lb3V0IHx8IG1kZXYtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCkKKwlmaW5pc2hfd2FpdCgmZGV2aWNlLT5taXNjX3dhaXQsICZ3YWl0KTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJaWYgKCF0aW1lb3V0IHx8IGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKQogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CkBAIC0zNzAzLDIwICszODQ2LDIwIEBACiB9CiAKIHVuc2lnbmVkIGludAotX2RyYmRfaW5zZXJ0X2ZhdWx0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGludCB0eXBlKQorX2RyYmRfaW5zZXJ0X2ZhdWx0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgdHlwZSkKIHsKIAlzdGF0aWMgc3RydWN0IGZhdWx0X3JhbmRvbV9zdGF0ZSBycnMgPSB7MCwgMH07CiAKIAl1bnNpZ25lZCBpbnQgcmV0ID0gKAogCQkoZmF1bHRfZGV2cyA9PSAwIHx8Ci0JCQkoKDEgPDwgbWRldl90b19taW5vcihtZGV2KSkgJiBmYXVsdF9kZXZzKSAhPSAwKSAmJgorCQkJKCgxIDw8IGRldmljZV90b19taW5vcihkZXZpY2UpKSAmIGZhdWx0X2RldnMpICE9IDApICYmCiAJCSgoKF9kcmJkX2ZhdWx0X3JhbmRvbSgmcnJzKSAlIDEwMCkgKyAxKSA8PSBmYXVsdF9yYXRlKSk7CiAKIAlpZiAocmV0KSB7CiAJCWZhdWx0X2NvdW50Kys7CiAKIAkJaWYgKF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpCi0JCQlkZXZfd2FybihERVYsICIqKipTaW11bGF0aW5nICVzIGZhaWx1cmVcbiIsCisJCQlkcmJkX3dhcm4oZGV2aWNlLCAiKioqU2ltdWxhdGluZyAlcyBmYWlsdXJlXG4iLAogCQkJCV9kcmJkX2ZhdWx0X3N0cih0eXBlKSk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9ubC5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfbmwuYwppbmRleCBjNzA2ZDUwLi41MjY0MTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9ubC5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX25sLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ibGtwZy5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KICNpbmNsdWRlICJkcmJkX2ludC5oIgorI2luY2x1ZGUgImRyYmRfcHJvdG9jb2wuaCIKICNpbmNsdWRlICJkcmJkX3JlcS5oIgogI2luY2x1ZGUgImRyYmRfd3JhcHBlcnMuaCIKICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CkBAIC00NCw4ICs0NSw4IEBACiAvLyBpbnQgZHJiZF9hZG1fY3JlYXRlX3Jlc291cmNlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOwogLy8gaW50IGRyYmRfYWRtX2RlbGV0ZV9yZXNvdXJjZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIAotaW50IGRyYmRfYWRtX2FkZF9taW5vcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKLWludCBkcmJkX2FkbV9kZWxldGVfbWlub3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CitpbnQgZHJiZF9hZG1fbmV3X21pbm9yKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOworaW50IGRyYmRfYWRtX2RlbF9taW5vcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIAogaW50IGRyYmRfYWRtX25ld19yZXNvdXJjZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIGludCBkcmJkX2FkbV9kZWxfcmVzb3VyY2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CkBAIC0xMDIsOCArMTAzLDkgQEAKIAkvKiBwb2ludGVyIGludG8gcmVwbHkgYnVmZmVyICovCiAJc3RydWN0IGRyYmRfZ2VubG1zZ2hkciAqcmVwbHlfZGg7CiAJLyogcmVzb2x2ZWQgZnJvbSBhdHRyaWJ1dGVzLCBpZiBwb3NzaWJsZSAqLwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOwogfSBhZG1fY3R4OwogCiBzdGF0aWMgdm9pZCBkcmJkX2FkbV9zZW5kX3JlcGx5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCkBAIC0yMDIsNjIgKzIwNCw2NyBAQAogCQlhZG1fY3R4Lm15X2FkZHIgPSBuZXN0ZWRfYXR0cl90YltfX25sYV90eXBlKFRfY3R4X215X2FkZHIpXTsKIAkJYWRtX2N0eC5wZWVyX2FkZHIgPSBuZXN0ZWRfYXR0cl90YltfX25sYV90eXBlKFRfY3R4X3BlZXJfYWRkcildOwogCQlpZiAoKGFkbV9jdHgubXlfYWRkciAmJgotCQkgICAgIG5sYV9sZW4oYWRtX2N0eC5teV9hZGRyKSA+IHNpemVvZihhZG1fY3R4LnRjb25uLT5teV9hZGRyKSkgfHwKKwkJICAgICBubGFfbGVuKGFkbV9jdHgubXlfYWRkcikgPiBzaXplb2YoYWRtX2N0eC5jb25uZWN0aW9uLT5teV9hZGRyKSkgfHwKIAkJICAgIChhZG1fY3R4LnBlZXJfYWRkciAmJgotCQkgICAgIG5sYV9sZW4oYWRtX2N0eC5wZWVyX2FkZHIpID4gc2l6ZW9mKGFkbV9jdHgudGNvbm4tPnBlZXJfYWRkcikpKSB7CisJCSAgICAgbmxhX2xlbihhZG1fY3R4LnBlZXJfYWRkcikgPiBzaXplb2YoYWRtX2N0eC5jb25uZWN0aW9uLT5wZWVyX2FkZHIpKSkgewogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gZmFpbDsKIAkJfQogCX0KIAogCWFkbV9jdHgubWlub3IgPSBkX2luLT5taW5vcjsKLQlhZG1fY3R4Lm1kZXYgPSBtaW5vcl90b19tZGV2KGRfaW4tPm1pbm9yKTsKLQlhZG1fY3R4LnRjb25uID0gY29ubl9nZXRfYnlfbmFtZShhZG1fY3R4LnJlc291cmNlX25hbWUpOworCWFkbV9jdHguZGV2aWNlID0gbWlub3JfdG9fZGV2aWNlKGRfaW4tPm1pbm9yKTsKKwlpZiAoYWRtX2N0eC5yZXNvdXJjZV9uYW1lKSB7CisJCWFkbV9jdHgucmVzb3VyY2UgPSBkcmJkX2ZpbmRfcmVzb3VyY2UoYWRtX2N0eC5yZXNvdXJjZV9uYW1lKTsKKwl9CiAKLQlpZiAoIWFkbV9jdHgubWRldiAmJiAoZmxhZ3MgJiBEUkJEX0FETV9ORUVEX01JTk9SKSkgeworCWlmICghYWRtX2N0eC5kZXZpY2UgJiYgKGZsYWdzICYgRFJCRF9BRE1fTkVFRF9NSU5PUikpIHsKIAkJZHJiZF9tc2dfcHV0X2luZm8oInVua25vd24gbWlub3IiKTsKIAkJcmV0dXJuIEVSUl9NSU5PUl9JTlZBTElEOwogCX0KLQlpZiAoIWFkbV9jdHgudGNvbm4gJiYgKGZsYWdzICYgRFJCRF9BRE1fTkVFRF9SRVNPVVJDRSkpIHsKKwlpZiAoIWFkbV9jdHgucmVzb3VyY2UgJiYgKGZsYWdzICYgRFJCRF9BRE1fTkVFRF9SRVNPVVJDRSkpIHsKIAkJZHJiZF9tc2dfcHV0X2luZm8oInVua25vd24gcmVzb3VyY2UiKTsKKwkJaWYgKGFkbV9jdHgucmVzb3VyY2VfbmFtZSkKKwkJCXJldHVybiBFUlJfUkVTX05PVF9LTk9XTjsKIAkJcmV0dXJuIEVSUl9JTlZBTElEX1JFUVVFU1Q7CiAJfQogCiAJaWYgKGZsYWdzICYgRFJCRF9BRE1fTkVFRF9DT05ORUNUSU9OKSB7Ci0JCWlmIChhZG1fY3R4LnRjb25uICYmICEoZmxhZ3MgJiBEUkJEX0FETV9ORUVEX1JFU09VUkNFKSkgeworCQlpZiAoYWRtX2N0eC5yZXNvdXJjZSkgewogCQkJZHJiZF9tc2dfcHV0X2luZm8oIm5vIHJlc291cmNlIG5hbWUgZXhwZWN0ZWQiKTsKIAkJCXJldHVybiBFUlJfSU5WQUxJRF9SRVFVRVNUOwogCQl9Ci0JCWlmIChhZG1fY3R4Lm1kZXYpIHsKKwkJaWYgKGFkbV9jdHguZGV2aWNlKSB7CiAJCQlkcmJkX21zZ19wdXRfaW5mbygibm8gbWlub3IgbnVtYmVyIGV4cGVjdGVkIik7CiAJCQlyZXR1cm4gRVJSX0lOVkFMSURfUkVRVUVTVDsKIAkJfQogCQlpZiAoYWRtX2N0eC5teV9hZGRyICYmIGFkbV9jdHgucGVlcl9hZGRyKQotCQkJYWRtX2N0eC50Y29ubiA9IGNvbm5fZ2V0X2J5X2FkZHJzKG5sYV9kYXRhKGFkbV9jdHgubXlfYWRkciksCisJCQlhZG1fY3R4LmNvbm5lY3Rpb24gPSBjb25uX2dldF9ieV9hZGRycyhubGFfZGF0YShhZG1fY3R4Lm15X2FkZHIpLAogCQkJCQkJCSAgbmxhX2xlbihhZG1fY3R4Lm15X2FkZHIpLAogCQkJCQkJCSAgbmxhX2RhdGEoYWRtX2N0eC5wZWVyX2FkZHIpLAogCQkJCQkJCSAgbmxhX2xlbihhZG1fY3R4LnBlZXJfYWRkcikpOwotCQlpZiAoIWFkbV9jdHgudGNvbm4pIHsKKwkJaWYgKCFhZG1fY3R4LmNvbm5lY3Rpb24pIHsKIAkJCWRyYmRfbXNnX3B1dF9pbmZvKCJ1bmtub3duIGNvbm5lY3Rpb24iKTsKIAkJCXJldHVybiBFUlJfSU5WQUxJRF9SRVFVRVNUOwogCQl9CiAJfQogCiAJLyogc29tZSBtb3JlIHBhcmFub2lhLCBpZiB0aGUgcmVxdWVzdCB3YXMgb3Zlci1kZXRlcm1pbmVkICovCi0JaWYgKGFkbV9jdHgubWRldiAmJiBhZG1fY3R4LnRjb25uICYmCi0JICAgIGFkbV9jdHgubWRldi0+dGNvbm4gIT0gYWRtX2N0eC50Y29ubikgewotCQlwcl93YXJuaW5nKCJyZXF1ZXN0OiBtaW5vcj0ldSwgcmVzb3VyY2U9JXM7IGJ1dCB0aGF0IG1pbm9yIGJlbG9uZ3MgdG8gY29ubmVjdGlvbiAlc1xuIiwKLQkJCQlhZG1fY3R4Lm1pbm9yLCBhZG1fY3R4LnJlc291cmNlX25hbWUsCi0JCQkJYWRtX2N0eC5tZGV2LT50Y29ubi0+bmFtZSk7CisJaWYgKGFkbV9jdHguZGV2aWNlICYmIGFkbV9jdHgucmVzb3VyY2UgJiYKKwkgICAgYWRtX2N0eC5kZXZpY2UtPnJlc291cmNlICE9IGFkbV9jdHgucmVzb3VyY2UpIHsKKwkJcHJfd2FybmluZygicmVxdWVzdDogbWlub3I9JXUsIHJlc291cmNlPSVzOyBidXQgdGhhdCBtaW5vciBiZWxvbmdzIHRvIHJlc291cmNlICVzXG4iLAorCQkJCWFkbV9jdHgubWlub3IsIGFkbV9jdHgucmVzb3VyY2UtPm5hbWUsCisJCQkJYWRtX2N0eC5kZXZpY2UtPnJlc291cmNlLT5uYW1lKTsKIAkJZHJiZF9tc2dfcHV0X2luZm8oIm1pbm9yIGV4aXN0cyBpbiBkaWZmZXJlbnQgcmVzb3VyY2UiKTsKIAkJcmV0dXJuIEVSUl9JTlZBTElEX1JFUVVFU1Q7CiAJfQotCWlmIChhZG1fY3R4Lm1kZXYgJiYKKwlpZiAoYWRtX2N0eC5kZXZpY2UgJiYKIAkgICAgYWRtX2N0eC52b2x1bWUgIT0gVk9MVU1FX1VOU1BFQ0lGSUVEICYmCi0JICAgIGFkbV9jdHgudm9sdW1lICE9IGFkbV9jdHgubWRldi0+dm5yKSB7CisJICAgIGFkbV9jdHgudm9sdW1lICE9IGFkbV9jdHguZGV2aWNlLT52bnIpIHsKIAkJcHJfd2FybmluZygicmVxdWVzdDogbWlub3I9JXUsIHZvbHVtZT0ldTsgYnV0IHRoYXQgbWlub3IgaXMgdm9sdW1lICV1IGluICVzXG4iLAogCQkJCWFkbV9jdHgubWlub3IsIGFkbV9jdHgudm9sdW1lLAotCQkJCWFkbV9jdHgubWRldi0+dm5yLCBhZG1fY3R4Lm1kZXYtPnRjb25uLT5uYW1lKTsKKwkJCQlhZG1fY3R4LmRldmljZS0+dm5yLAorCQkJCWFkbV9jdHguZGV2aWNlLT5yZXNvdXJjZS0+bmFtZSk7CiAJCWRyYmRfbXNnX3B1dF9pbmZvKCJtaW5vciBleGlzdHMgYXMgZGlmZmVyZW50IHZvbHVtZSIpOwogCQlyZXR1cm4gRVJSX0lOVkFMSURfUkVRVUVTVDsKIAl9CkBAIC0yNzIsOSArMjc5LDEzIEBACiAKIHN0YXRpYyBpbnQgZHJiZF9hZG1fZmluaXNoKHN0cnVjdCBnZW5sX2luZm8gKmluZm8sIGludCByZXRjb2RlKQogewotCWlmIChhZG1fY3R4LnRjb25uKSB7Ci0JCWtyZWZfcHV0KCZhZG1fY3R4LnRjb25uLT5rcmVmLCAmY29ubl9kZXN0cm95KTsKLQkJYWRtX2N0eC50Y29ubiA9IE5VTEw7CisJaWYgKGFkbV9jdHguY29ubmVjdGlvbikgeworCQlrcmVmX3B1dCgmYWRtX2N0eC5jb25uZWN0aW9uLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfY29ubmVjdGlvbik7CisJCWFkbV9jdHguY29ubmVjdGlvbiA9IE5VTEw7CisJfQorCWlmIChhZG1fY3R4LnJlc291cmNlKSB7CisJCWtyZWZfcHV0KCZhZG1fY3R4LnJlc291cmNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2UpOworCQlhZG1fY3R4LnJlc291cmNlID0gTlVMTDsKIAl9CiAKIAlpZiAoIWFkbV9jdHgucmVwbHlfc2tiKQpAQCAtMjg1LDM0ICsyOTYsMzQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc2V0dXBfa2hlbHBlcl9lbnYoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBjaGFyICoqZW52cCkKK3N0YXRpYyB2b2lkIHNldHVwX2toZWxwZXJfZW52KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGNoYXIgKiplbnZwKQogewogCWNoYXIgKmFmczsKIAogCS8qIEZJWE1FOiBBIGZ1dHVyZSB2ZXJzaW9uIHdpbGwgbm90IGFsbG93IHRoaXMgY2FzZS4gKi8KLQlpZiAodGNvbm4tPm15X2FkZHJfbGVuID09IDAgfHwgdGNvbm4tPnBlZXJfYWRkcl9sZW4gPT0gMCkKKwlpZiAoY29ubmVjdGlvbi0+bXlfYWRkcl9sZW4gPT0gMCB8fCBjb25uZWN0aW9uLT5wZWVyX2FkZHJfbGVuID09IDApCiAJCXJldHVybjsKIAotCXN3aXRjaCAoKChzdHJ1Y3Qgc29ja2FkZHIgKikmdGNvbm4tPnBlZXJfYWRkciktPnNhX2ZhbWlseSkgeworCXN3aXRjaCAoKChzdHJ1Y3Qgc29ja2FkZHIgKikmY29ubmVjdGlvbi0+cGVlcl9hZGRyKS0+c2FfZmFtaWx5KSB7CiAJY2FzZSBBRl9JTkVUNjoKIAkJYWZzID0gImlwdjYiOwogCQlzbnByaW50ZihlbnZwWzRdLCA2MCwgIkRSQkRfUEVFUl9BRERSRVNTPSVwSTYiLAotCQkJICYoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmdGNvbm4tPnBlZXJfYWRkciktPnNpbjZfYWRkcik7CisJCQkgJigoc3RydWN0IHNvY2thZGRyX2luNiAqKSZjb25uZWN0aW9uLT5wZWVyX2FkZHIpLT5zaW42X2FkZHIpOwogCQlicmVhazsKIAljYXNlIEFGX0lORVQ6CiAJCWFmcyA9ICJpcHY0IjsKIAkJc25wcmludGYoZW52cFs0XSwgNjAsICJEUkJEX1BFRVJfQUREUkVTUz0lcEk0IiwKLQkJCSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmdGNvbm4tPnBlZXJfYWRkciktPnNpbl9hZGRyKTsKKwkJCSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmY29ubmVjdGlvbi0+cGVlcl9hZGRyKS0+c2luX2FkZHIpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlhZnMgPSAic3NvY2tzIjsKIAkJc25wcmludGYoZW52cFs0XSwgNjAsICJEUkJEX1BFRVJfQUREUkVTUz0lcEk0IiwKLQkJCSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmdGNvbm4tPnBlZXJfYWRkciktPnNpbl9hZGRyKTsKKwkJCSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmY29ubmVjdGlvbi0+cGVlcl9hZGRyKS0+c2luX2FkZHIpOwogCX0KIAlzbnByaW50ZihlbnZwWzNdLCAyMCwgIkRSQkRfUEVFUl9BRj0lcyIsIGFmcyk7CiB9CiAKLWludCBkcmJkX2toZWxwZXIoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgY2hhciAqY21kKQoraW50IGRyYmRfa2hlbHBlcihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgY2hhciAqY21kKQogewogCWNoYXIgKmVudnBbXSA9IHsgIkhPTUU9LyIsCiAJCQkiVEVSTT1saW51eCIsCkBAIC0zMjIsMzkgKzMzMywzOSBAQAogCQkJTlVMTCB9OwogCWNoYXIgbWJbMTJdOwogCWNoYXIgKmFyZ3ZbXSA9IHt1c2VybW9kZV9oZWxwZXIsIGNtZCwgbWIsIE5VTEwgfTsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSBtZGV2LT50Y29ubjsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbjsKIAlzdHJ1Y3Qgc2liX2luZm8gc2liOwogCWludCByZXQ7CiAKLQlpZiAoY3VycmVudCA9PSB0Y29ubi0+d29ya2VyLnRhc2spCi0JCXNldF9iaXQoQ0FMTEJBQ0tfUEVORElORywgJnRjb25uLT5mbGFncyk7CisJaWYgKGN1cnJlbnQgPT0gY29ubmVjdGlvbi0+d29ya2VyLnRhc2spCisJCXNldF9iaXQoQ0FMTEJBQ0tfUEVORElORywgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAotCXNucHJpbnRmKG1iLCAxMiwgIm1pbm9yLSVkIiwgbWRldl90b19taW5vcihtZGV2KSk7Ci0Jc2V0dXBfa2hlbHBlcl9lbnYodGNvbm4sIGVudnApOworCXNucHJpbnRmKG1iLCAxMiwgIm1pbm9yLSVkIiwgZGV2aWNlX3RvX21pbm9yKGRldmljZSkpOworCXNldHVwX2toZWxwZXJfZW52KGNvbm5lY3Rpb24sIGVudnApOwogCiAJLyogVGhlIGhlbHBlciBtYXkgdGFrZSBzb21lIHRpbWUuCiAJICogd3JpdGUgb3V0IGFueSB1bnN5bmNlZCBtZXRhIGRhdGEgY2hhbmdlcyBub3cgKi8KLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAKLQlkZXZfaW5mbyhERVYsICJoZWxwZXIgY29tbWFuZDogJXMgJXMgJXNcbiIsIHVzZXJtb2RlX2hlbHBlciwgY21kLCBtYik7CisJZHJiZF9pbmZvKGRldmljZSwgImhlbHBlciBjb21tYW5kOiAlcyAlcyAlc1xuIiwgdXNlcm1vZGVfaGVscGVyLCBjbWQsIG1iKTsKIAlzaWIuc2liX3JlYXNvbiA9IFNJQl9IRUxQRVJfUFJFOwogCXNpYi5oZWxwZXJfbmFtZSA9IGNtZDsKLQlkcmJkX2JjYXN0X2V2ZW50KG1kZXYsICZzaWIpOworCWRyYmRfYmNhc3RfZXZlbnQoZGV2aWNlLCAmc2liKTsKIAlyZXQgPSBjYWxsX3VzZXJtb2RlaGVscGVyKHVzZXJtb2RlX2hlbHBlciwgYXJndiwgZW52cCwgVU1IX1dBSVRfUFJPQyk7CiAJaWYgKHJldCkKLQkJZGV2X3dhcm4oREVWLCAiaGVscGVyIGNvbW1hbmQ6ICVzICVzICVzIGV4aXQgY29kZSAldSAoMHgleClcbiIsCisJCWRyYmRfd2FybihkZXZpY2UsICJoZWxwZXIgY29tbWFuZDogJXMgJXMgJXMgZXhpdCBjb2RlICV1ICgweCV4KVxuIiwKIAkJCQl1c2VybW9kZV9oZWxwZXIsIGNtZCwgbWIsCiAJCQkJKHJldCA+PiA4KSAmIDB4ZmYsIHJldCk7CiAJZWxzZQotCQlkZXZfaW5mbyhERVYsICJoZWxwZXIgY29tbWFuZDogJXMgJXMgJXMgZXhpdCBjb2RlICV1ICgweCV4KVxuIiwKKwkJZHJiZF9pbmZvKGRldmljZSwgImhlbHBlciBjb21tYW5kOiAlcyAlcyAlcyBleGl0IGNvZGUgJXUgKDB4JXgpXG4iLAogCQkJCXVzZXJtb2RlX2hlbHBlciwgY21kLCBtYiwKIAkJCQkocmV0ID4+IDgpICYgMHhmZiwgcmV0KTsKIAlzaWIuc2liX3JlYXNvbiA9IFNJQl9IRUxQRVJfUE9TVDsKIAlzaWIuaGVscGVyX2V4aXRfY29kZSA9IHJldDsKLQlkcmJkX2JjYXN0X2V2ZW50KG1kZXYsICZzaWIpOworCWRyYmRfYmNhc3RfZXZlbnQoZGV2aWNlLCAmc2liKTsKIAotCWlmIChjdXJyZW50ID09IHRjb25uLT53b3JrZXIudGFzaykKLQkJY2xlYXJfYml0KENBTExCQUNLX1BFTkRJTkcsICZ0Y29ubi0+ZmxhZ3MpOworCWlmIChjdXJyZW50ID09IGNvbm5lY3Rpb24tPndvcmtlci50YXNrKQorCQljbGVhcl9iaXQoQ0FMTEJBQ0tfUEVORElORywgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAogCWlmIChyZXQgPCAwKSAvKiBJZ25vcmUgYW55IEVSUk5PcyB3ZSBnb3QuICovCiAJCXJldCA9IDA7CkBAIC0zNjIsNyArMzczLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgY29ubl9raGVscGVyKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgY2hhciAqY21kKQorc3RhdGljIGludCBjb25uX2toZWxwZXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgY2hhciAqY21kKQogewogCWNoYXIgKmVudnBbXSA9IHsgIkhPTUU9LyIsCiAJCQkiVEVSTT1saW51eCIsCkBAIC0zNzAsMjMgKzM4MSwyNCBAQAogCQkJIChjaGFyWzIwXSkgeyB9LCAvKiBhZGRyZXNzIGZhbWlseSAqLwogCQkJIChjaGFyWzYwXSkgeyB9LCAvKiBhZGRyZXNzICovCiAJCQlOVUxMIH07Ci0JY2hhciAqYXJndltdID0ge3VzZXJtb2RlX2hlbHBlciwgY21kLCB0Y29ubi0+bmFtZSwgTlVMTCB9OworCWNoYXIgKnJlc291cmNlX25hbWUgPSBjb25uZWN0aW9uLT5yZXNvdXJjZS0+bmFtZTsKKwljaGFyICphcmd2W10gPSB7dXNlcm1vZGVfaGVscGVyLCBjbWQsIHJlc291cmNlX25hbWUsIE5VTEwgfTsKIAlpbnQgcmV0OwogCi0Jc2V0dXBfa2hlbHBlcl9lbnYodGNvbm4sIGVudnApOwotCWNvbm5fbWRfc3luYyh0Y29ubik7CisJc2V0dXBfa2hlbHBlcl9lbnYoY29ubmVjdGlvbiwgZW52cCk7CisJY29ubl9tZF9zeW5jKGNvbm5lY3Rpb24pOwogCi0JY29ubl9pbmZvKHRjb25uLCAiaGVscGVyIGNvbW1hbmQ6ICVzICVzICVzXG4iLCB1c2VybW9kZV9oZWxwZXIsIGNtZCwgdGNvbm4tPm5hbWUpOworCWRyYmRfaW5mbyhjb25uZWN0aW9uLCAiaGVscGVyIGNvbW1hbmQ6ICVzICVzICVzXG4iLCB1c2VybW9kZV9oZWxwZXIsIGNtZCwgcmVzb3VyY2VfbmFtZSk7CiAJLyogVE9ETzogY29ubl9iY2FzdF9ldmVudCgpID8/ICovCiAKIAlyZXQgPSBjYWxsX3VzZXJtb2RlaGVscGVyKHVzZXJtb2RlX2hlbHBlciwgYXJndiwgZW52cCwgVU1IX1dBSVRfUFJPQyk7CiAJaWYgKHJldCkKLQkJY29ubl93YXJuKHRjb25uLCAiaGVscGVyIGNvbW1hbmQ6ICVzICVzICVzIGV4aXQgY29kZSAldSAoMHgleClcbiIsCi0JCQkgIHVzZXJtb2RlX2hlbHBlciwgY21kLCB0Y29ubi0+bmFtZSwKKwkJZHJiZF93YXJuKGNvbm5lY3Rpb24sICJoZWxwZXIgY29tbWFuZDogJXMgJXMgJXMgZXhpdCBjb2RlICV1ICgweCV4KVxuIiwKKwkJCSAgdXNlcm1vZGVfaGVscGVyLCBjbWQsIHJlc291cmNlX25hbWUsCiAJCQkgIChyZXQgPj4gOCkgJiAweGZmLCByZXQpOwogCWVsc2UKLQkJY29ubl9pbmZvKHRjb25uLCAiaGVscGVyIGNvbW1hbmQ6ICVzICVzICVzIGV4aXQgY29kZSAldSAoMHgleClcbiIsCi0JCQkgIHVzZXJtb2RlX2hlbHBlciwgY21kLCB0Y29ubi0+bmFtZSwKKwkJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJoZWxwZXIgY29tbWFuZDogJXMgJXMgJXMgZXhpdCBjb2RlICV1ICgweCV4KVxuIiwKKwkJCSAgdXNlcm1vZGVfaGVscGVyLCBjbWQsIHJlc291cmNlX25hbWUsCiAJCQkgIChyZXQgPj4gOCkgJiAweGZmLCByZXQpOwogCS8qIFRPRE86IGNvbm5fYmNhc3RfZXZlbnQoKSA/PyAqLwogCkBAIC0zOTYsMTggKzQwOCwyMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBlbnVtIGRyYmRfZmVuY2luZ19wIGhpZ2hlc3RfZmVuY2luZ19wb2xpY3koc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIGVudW0gZHJiZF9mZW5jaW5nX3AgaGlnaGVzdF9mZW5jaW5nX3BvbGljeShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewogCWVudW0gZHJiZF9mZW5jaW5nX3AgZnAgPSBGUF9OT1RfQVZBSUw7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZucjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJaWYgKGdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfQ09OU0lTVEVOVCkpIHsKLQkJCWZwID0gbWF4X3QoZW51bSBkcmJkX2ZlbmNpbmdfcCwgZnAsCi0JCQkJICAgcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZiktPmZlbmNpbmcpOwotCQkJcHV0X2xkZXYobWRldik7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0NPTlNJU1RFTlQpKSB7CisJCQlzdHJ1Y3QgZGlza19jb25mICpkaXNrX2NvbmYgPQorCQkJCXJjdV9kZXJlZmVyZW5jZShwZWVyX2RldmljZS0+ZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpOworCQkJZnAgPSBtYXhfdChlbnVtIGRyYmRfZmVuY2luZ19wLCBmcCwgZGlza19jb25mLT5mZW5jaW5nKTsKKwkJCXB1dF9sZGV2KGRldmljZSk7CiAJCX0KIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC00MTUsNyArNDI5LDcgQEAKIAlyZXR1cm4gZnA7CiB9CiAKLWJvb2wgY29ubl90cnlfb3V0ZGF0ZV9wZWVyKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK2Jvb2wgY29ubl90cnlfb3V0ZGF0ZV9wZWVyKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7CiAJdW5zaWduZWQgaW50IGNvbm5lY3RfY250OwogCXVuaW9uIGRyYmRfc3RhdGUgbWFzayA9IHsgfTsKQEAgLTQyNCwyNiArNDM4LDI2IEBACiAJY2hhciAqZXhfdG9fc3RyaW5nOwogCWludCByOwogCi0JaWYgKHRjb25uLT5jc3RhdGUgPj0gQ19XRl9SRVBPUlRfUEFSQU1TKSB7Ci0JCWNvbm5fZXJyKHRjb25uLCAiRXhwZWN0ZWQgY3N0YXRlIDwgQ19XRl9SRVBPUlRfUEFSQU1TXG4iKTsKKwlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlID49IENfV0ZfUkVQT1JUX1BBUkFNUykgeworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiRXhwZWN0ZWQgY3N0YXRlIDwgQ19XRl9SRVBPUlRfUEFSQU1TXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCXNwaW5fbG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7Ci0JY29ubmVjdF9jbnQgPSB0Y29ubi0+Y29ubmVjdF9jbnQ7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CisJY29ubmVjdF9jbnQgPSBjb25uZWN0aW9uLT5jb25uZWN0X2NudDsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiAKLQlmcCA9IGhpZ2hlc3RfZmVuY2luZ19wb2xpY3kodGNvbm4pOworCWZwID0gaGlnaGVzdF9mZW5jaW5nX3BvbGljeShjb25uZWN0aW9uKTsKIAlzd2l0Y2ggKGZwKSB7CiAJY2FzZSBGUF9OT1RfQVZBSUw6Ci0JCWNvbm5fd2Fybih0Y29ubiwgIk5vdCBmZW5jaW5nIHBlZXIsIEknbSBub3QgZXZlbiBDb25zaXN0ZW50IG15c2VsZi5cbiIpOworCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgIk5vdCBmZW5jaW5nIHBlZXIsIEknbSBub3QgZXZlbiBDb25zaXN0ZW50IG15c2VsZi5cbiIpOwogCQlnb3RvIG91dDsKIAljYXNlIEZQX0RPTlRfQ0FSRToKIAkJcmV0dXJuIHRydWU7CiAJZGVmYXVsdDogOwogCX0KIAotCXIgPSBjb25uX2toZWxwZXIodGNvbm4sICJmZW5jZS1wZWVyIik7CisJciA9IGNvbm5fa2hlbHBlcihjb25uZWN0aW9uLCAiZmVuY2UtcGVlciIpOwogCiAJc3dpdGNoICgocj4+OCkgJiAweGZmKSB7CiAJY2FzZSAzOiAvKiBwZWVyIGlzIGluY29uc2lzdGVudCAqLwpAQCAtNDU3LDcgKzQ3MSw3IEBACiAJCXZhbC5wZHNrID0gRF9PVVREQVRFRDsKIAkJYnJlYWs7CiAJY2FzZSA1OiAvKiBwZWVyIHdhcyBkb3duICovCi0JCWlmIChjb25uX2hpZ2hlc3RfZGlzayh0Y29ubikgPT0gRF9VUF9UT19EQVRFKSB7CisJCWlmIChjb25uX2hpZ2hlc3RfZGlzayhjb25uZWN0aW9uKSA9PSBEX1VQX1RPX0RBVEUpIHsKIAkJCS8qIHdlIHdpbGwoaGF2ZSkgY3JlYXRlKGQpIGEgbmV3IFVVSUQgYW55d2F5cy4uLiAqLwogCQkJZXhfdG9fc3RyaW5nID0gInBlZXIgaXMgdW5yZWFjaGFibGUsIGFzc3VtZWQgdG8gYmUgZGVhZCI7CiAJCQltYXNrLnBkc2sgPSBEX01BU0s7CkBAIC00NzAsNzAgKzQ4NCw3MCBAQAogCQkgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGFuIHVuY29ubmVjdGVkIFJfU0VDT05EQVJZIGlzIGFza2VkIHRvCiAJCSAqIGJlY29tZSBSX1BSSU1BUlksIGJ1dCBmaW5kcyB0aGUgb3RoZXIgcGVlciBiZWluZyBhY3RpdmUuICovCiAJCWV4X3RvX3N0cmluZyA9ICJwZWVyIGlzIGFjdGl2ZSI7Ci0JCWNvbm5fd2Fybih0Y29ubiwgIlBlZXIgaXMgcHJpbWFyeSwgb3V0ZGF0aW5nIG15c2VsZi5cbiIpOworCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgIlBlZXIgaXMgcHJpbWFyeSwgb3V0ZGF0aW5nIG15c2VsZi5cbiIpOwogCQltYXNrLmRpc2sgPSBEX01BU0s7CiAJCXZhbC5kaXNrID0gRF9PVVREQVRFRDsKIAkJYnJlYWs7CiAJY2FzZSA3OgogCQlpZiAoZnAgIT0gRlBfU1RPTklUSCkKLQkJCWNvbm5fZXJyKHRjb25uLCAiZmVuY2UtcGVlcigpID0gNyAmJiBmZW5jaW5nICE9IFN0b25pdGggISEhXG4iKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJmZW5jZS1wZWVyKCkgPSA3ICYmIGZlbmNpbmcgIT0gU3Rvbml0aCAhISFcbiIpOwogCQlleF90b19zdHJpbmcgPSAicGVlciB3YXMgc3Rvbml0aGVkIjsKIAkJbWFzay5wZHNrID0gRF9NQVNLOwogCQl2YWwucGRzayA9IERfT1VUREFURUQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIFRoZSBzY3JpcHQgaXMgYnJva2VuIC4uLiAqLwotCQljb25uX2Vycih0Y29ubiwgImZlbmNlLXBlZXIgaGVscGVyIGJyb2tlbiwgcmV0dXJuZWQgJWRcbiIsIChyPj44KSYweGZmKTsKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImZlbmNlLXBlZXIgaGVscGVyIGJyb2tlbiwgcmV0dXJuZWQgJWRcbiIsIChyPj44KSYweGZmKTsKIAkJcmV0dXJuIGZhbHNlOyAvKiBFdmVudHVhbGx5IGxlYXZlIElPIGZyb3plbiAqLwogCX0KIAotCWNvbm5faW5mbyh0Y29ubiwgImZlbmNlLXBlZXIgaGVscGVyIHJldHVybmVkICVkICglcylcbiIsCisJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJmZW5jZS1wZWVyIGhlbHBlciByZXR1cm5lZCAlZCAoJXMpXG4iLAogCQkgIChyPj44KSAmIDB4ZmYsIGV4X3RvX3N0cmluZyk7CiAKICBvdXQ6CiAKIAkvKiBOb3QgdXNpbmcKLQkgICBjb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIG1hc2ssIHZhbCwgQ1NfVkVSQk9TRSk7CisJICAgY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIG1hc2ssIHZhbCwgQ1NfVkVSQk9TRSk7CiAJICAgaGVyZSwgYmVjYXVzZSB3ZSBtaWdodCB3ZXJlIGFibGUgdG8gcmUtZXN0YWJsaXNoIHRoZSBjb25uZWN0aW9uIGluIHRoZQogCSAgIG1lYW50aW1lLiAqLwotCXNwaW5fbG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7Ci0JaWYgKHRjb25uLT5jc3RhdGUgPCBDX1dGX1JFUE9SVF9QQVJBTVMgJiYgIXRlc3RfYml0KFNUQVRFX1NFTlQsICZ0Y29ubi0+ZmxhZ3MpKSB7Ci0JCWlmICh0Y29ubi0+Y29ubmVjdF9jbnQgIT0gY29ubmVjdF9jbnQpCisJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlIDwgQ19XRl9SRVBPUlRfUEFSQU1TICYmICF0ZXN0X2JpdChTVEFURV9TRU5ULCAmY29ubmVjdGlvbi0+ZmxhZ3MpKSB7CisJCWlmIChjb25uZWN0aW9uLT5jb25uZWN0X2NudCAhPSBjb25uZWN0X2NudCkKIAkJCS8qIEluIGNhc2UgdGhlIGNvbm5lY3Rpb24gd2FzIGVzdGFibGlzaGVkIGFuZCBkcm9wZWQKIAkJCSAgIHdoaWxlIHRoZSBmZW5jZS1wZWVyIGhhbmRsZXIgd2FzIHJ1bm5pbmcsIGlnbm9yZSBpdCAqLwotCQkJY29ubl9pbmZvKHRjb25uLCAiSWdub3JpbmcgZmVuY2UtcGVlciBleGl0IGNvZGVcbiIpOworCQkJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJJZ25vcmluZyBmZW5jZS1wZWVyIGV4aXQgY29kZVxuIik7CiAJCWVsc2UKLQkJCV9jb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIG1hc2ssIHZhbCwgQ1NfVkVSQk9TRSk7CisJCQlfY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIG1hc2ssIHZhbCwgQ1NfVkVSQk9TRSk7CiAJfQotCXNwaW5fdW5sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiAKLQlyZXR1cm4gY29ubl9oaWdoZXN0X3Bkc2sodGNvbm4pIDw9IERfT1VUREFURUQ7CisJcmV0dXJuIGNvbm5faGlnaGVzdF9wZHNrKGNvbm5lY3Rpb24pIDw9IERfT1VUREFURUQ7CiB9CiAKIHN0YXRpYyBpbnQgX3RyeV9vdXRkYXRlX3BlZXJfYXN5bmModm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSAoc3RydWN0IGRyYmRfdGNvbm4gKilkYXRhOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSAoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqKWRhdGE7CiAKLQljb25uX3RyeV9vdXRkYXRlX3BlZXIodGNvbm4pOworCWNvbm5fdHJ5X291dGRhdGVfcGVlcihjb25uZWN0aW9uKTsKIAotCWtyZWZfcHV0KCZ0Y29ubi0+a3JlZiwgJmNvbm5fZGVzdHJveSk7CisJa3JlZl9wdXQoJmNvbm5lY3Rpb24tPmtyZWYsIGRyYmRfZGVzdHJveV9jb25uZWN0aW9uKTsKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBjb25uX3RyeV9vdXRkYXRlX3BlZXJfYXN5bmMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQordm9pZCBjb25uX3RyeV9vdXRkYXRlX3BlZXJfYXN5bmMoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm9wYTsKIAotCWtyZWZfZ2V0KCZ0Y29ubi0+a3JlZik7Ci0Jb3BhID0ga3RocmVhZF9ydW4oX3RyeV9vdXRkYXRlX3BlZXJfYXN5bmMsIHRjb25uLCAiZHJiZF9hc3luY19oIik7CisJa3JlZl9nZXQoJmNvbm5lY3Rpb24tPmtyZWYpOworCW9wYSA9IGt0aHJlYWRfcnVuKF90cnlfb3V0ZGF0ZV9wZWVyX2FzeW5jLCBjb25uZWN0aW9uLCAiZHJiZF9hc3luY19oIik7CiAJaWYgKElTX0VSUihvcGEpKSB7Ci0JCWNvbm5fZXJyKHRjb25uLCAib3V0IG9mIG1lbSwgZmFpbGVkIHRvIGludm9rZSBmZW5jZS1wZWVyIGhlbHBlclxuIik7Ci0JCWtyZWZfcHV0KCZ0Y29ubi0+a3JlZiwgJmNvbm5fZGVzdHJveSk7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJvdXQgb2YgbWVtLCBmYWlsZWQgdG8gaW52b2tlIGZlbmNlLXBlZXIgaGVscGVyXG4iKTsKKwkJa3JlZl9wdXQoJmNvbm5lY3Rpb24tPmtyZWYsIGRyYmRfZGVzdHJveV9jb25uZWN0aW9uKTsKIAl9CiB9CiAKIGVudW0gZHJiZF9zdGF0ZV9ydgotZHJiZF9zZXRfcm9sZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBlbnVtIGRyYmRfcm9sZSBuZXdfcm9sZSwgaW50IGZvcmNlKQorZHJiZF9zZXRfcm9sZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgZW51bSBkcmJkX3JvbGUgbmV3X3JvbGUsIGludCBmb3JjZSkKIHsKIAljb25zdCBpbnQgbWF4X3RyaWVzID0gNDsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnYgPSBTU19VTktOT1dOX0VSUk9SOwpAQCAtNTQyLDE2ICs1NTYsMjQgQEAKIAlpbnQgZm9yY2VkID0gMDsKIAl1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHZhbDsKIAotCWlmIChuZXdfcm9sZSA9PSBSX1BSSU1BUlkpCi0JCXJlcXVlc3RfcGluZyhtZGV2LT50Y29ubik7IC8qIERldGVjdCBhIGRlYWQgcGVlciBBU0FQICovCisJaWYgKG5ld19yb2xlID09IFJfUFJJTUFSWSkgeworCQlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOwogCi0JbXV0ZXhfbG9jayhtZGV2LT5zdGF0ZV9tdXRleCk7CisJCS8qIERldGVjdCBkZWFkIHBlZXJzIGFzIHNvb24gYXMgcG9zc2libGUuICAqLworCisJCXJjdV9yZWFkX2xvY2soKTsKKwkJZm9yX2VhY2hfY29ubmVjdGlvbihjb25uZWN0aW9uLCBkZXZpY2UtPnJlc291cmNlKQorCQkJcmVxdWVzdF9waW5nKGNvbm5lY3Rpb24pOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9CisKKwltdXRleF9sb2NrKGRldmljZS0+c3RhdGVfbXV0ZXgpOwogCiAJbWFzay5pID0gMDsgbWFzay5yb2xlID0gUl9NQVNLOwogCXZhbC5pICA9IDA7IHZhbC5yb2xlICA9IG5ld19yb2xlOwogCiAJd2hpbGUgKHRyeSsrIDwgbWF4X3RyaWVzKSB7Ci0JCXJ2ID0gX2RyYmRfcmVxdWVzdF9zdGF0ZShtZGV2LCBtYXNrLCB2YWwsIENTX1dBSVRfQ09NUExFVEUpOworCQlydiA9IF9kcmJkX3JlcXVlc3Rfc3RhdGUoZGV2aWNlLCBtYXNrLCB2YWwsIENTX1dBSVRfQ09NUExFVEUpOwogCiAJCS8qIGluIGNhc2Ugd2UgZmlyc3Qgc3VjY2VlZGVkIHRvIG91dGRhdGUsCiAJCSAqIGJ1dCBub3cgc3VkZGVubHkgY291bGQgZXN0YWJsaXNoIGEgY29ubmVjdGlvbiAqLwpAQCAtNTYyLDggKzU4NCw4IEBACiAJCX0KIAogCQlpZiAocnYgPT0gU1NfTk9fVVBfVE9fREFURV9ESVNLICYmIGZvcmNlICYmCi0JCSAgICAobWRldi0+c3RhdGUuZGlzayA8IERfVVBfVE9fREFURSAmJgotCQkgICAgIG1kZXYtPnN0YXRlLmRpc2sgPj0gRF9JTkNPTlNJU1RFTlQpKSB7CisJCSAgICAoZGV2aWNlLT5zdGF0ZS5kaXNrIDwgRF9VUF9UT19EQVRFICYmCisJCSAgICAgZGV2aWNlLT5zdGF0ZS5kaXNrID49IERfSU5DT05TSVNURU5UKSkgewogCQkJbWFzay5kaXNrID0gRF9NQVNLOwogCQkJdmFsLmRpc2sgID0gRF9VUF9UT19EQVRFOwogCQkJZm9yY2VkID0gMTsKQEAgLTU3MSwxMCArNTkzLDEwIEBACiAJCX0KIAogCQlpZiAocnYgPT0gU1NfTk9fVVBfVE9fREFURV9ESVNLICYmCi0JCSAgICBtZGV2LT5zdGF0ZS5kaXNrID09IERfQ09OU0lTVEVOVCAmJiBtYXNrLnBkc2sgPT0gMCkgewotCQkJRF9BU1NFUlQobWRldi0+c3RhdGUucGRzayA9PSBEX1VOS05PV04pOworCQkgICAgZGV2aWNlLT5zdGF0ZS5kaXNrID09IERfQ09OU0lTVEVOVCAmJiBtYXNrLnBkc2sgPT0gMCkgeworCQkJRF9BU1NFUlQoZGV2aWNlLCBkZXZpY2UtPnN0YXRlLnBkc2sgPT0gRF9VTktOT1dOKTsKIAotCQkJaWYgKGNvbm5fdHJ5X291dGRhdGVfcGVlcihtZGV2LT50Y29ubikpIHsKKwkJCWlmIChjb25uX3RyeV9vdXRkYXRlX3BlZXIoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbikpIHsKIAkJCQl2YWwuZGlzayA9IERfVVBfVE9fREFURTsKIAkJCQltYXNrLmRpc2sgPSBEX01BU0s7CiAJCQl9CkBAIC01ODQsOCArNjA2LDggQEAKIAkJaWYgKHJ2ID09IFNTX05PVEhJTkdfVE9fRE8pCiAJCQlnb3RvIG91dDsKIAkJaWYgKHJ2ID09IFNTX1BSSU1BUllfTk9QICYmIG1hc2sucGRzayA9PSAwKSB7Ci0JCQlpZiAoIWNvbm5fdHJ5X291dGRhdGVfcGVlcihtZGV2LT50Y29ubikgJiYgZm9yY2UpIHsKLQkJCQlkZXZfd2FybihERVYsICJGb3JjZWQgaW50byBzcGxpdCBicmFpbiBzaXR1YXRpb24hXG4iKTsKKwkJCWlmICghY29ubl90cnlfb3V0ZGF0ZV9wZWVyKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pICYmIGZvcmNlKSB7CisJCQkJZHJiZF93YXJuKGRldmljZSwgIkZvcmNlZCBpbnRvIHNwbGl0IGJyYWluIHNpdHVhdGlvbiFcbiIpOwogCQkJCW1hc2sucGRzayA9IERfTUFTSzsKIAkJCQl2YWwucGRzayAgPSBEX09VVERBVEVEOwogCkBAIC01OTcsNyArNjE5LDcgQEAKIAkJCSAgIHJldHJ5IGF0IG1vc3Qgb25jZSBtb3JlIGluIHRoaXMgY2FzZS4gKi8KIAkJCWludCB0aW1lbzsKIAkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCW5jID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZik7CisJCQluYyA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJCQl0aW1lbyA9IG5jID8gKG5jLT5waW5nX3RpbWVvICsgMSkgKiBIWiAvIDEwIDogMTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHRpbWVvKTsKQEAgLTYwNiw3ICs2MjgsNyBAQAogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKHJ2IDwgU1NfU1VDQ0VTUykgewotCQkJcnYgPSBfZHJiZF9yZXF1ZXN0X3N0YXRlKG1kZXYsIG1hc2ssIHZhbCwKKwkJCXJ2ID0gX2RyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIG1hc2ssIHZhbCwKIAkJCQkJCUNTX1ZFUkJPU0UgKyBDU19XQUlUX0NPTVBMRVRFKTsKIAkJCWlmIChydiA8IFNTX1NVQ0NFU1MpCiAJCQkJZ290byBvdXQ7CkBAIC02MTgsNTMgKzY0MCw1MyBAQAogCQlnb3RvIG91dDsKIAogCWlmIChmb3JjZWQpCi0JCWRldl93YXJuKERFViwgIkZvcmNlZCB0byBjb25zaWRlciBsb2NhbCBkYXRhIGFzIFVwVG9EYXRlIVxuIik7CisJCWRyYmRfd2FybihkZXZpY2UsICJGb3JjZWQgdG8gY29uc2lkZXIgbG9jYWwgZGF0YSBhcyBVcFRvRGF0ZSFcbiIpOwogCiAJLyogV2FpdCB1bnRpbCBub3RoaW5nIGlzIG9uIHRoZSBmbHkgOikgKi8KLQl3YWl0X2V2ZW50KG1kZXYtPm1pc2Nfd2FpdCwgYXRvbWljX3JlYWQoJm1kZXYtPmFwX3BlbmRpbmdfY250KSA9PSAwKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+bWlzY193YWl0LCBhdG9taWNfcmVhZCgmZGV2aWNlLT5hcF9wZW5kaW5nX2NudCkgPT0gMCk7CiAKIAkvKiBGSVhNRSBhbHNvIHdhaXQgZm9yIGFsbCBwZW5kaW5nIFBfQkFSUklFUl9BQ0s/ICovCiAKIAlpZiAobmV3X3JvbGUgPT0gUl9TRUNPTkRBUlkpIHsKLQkJc2V0X2Rpc2tfcm8obWRldi0+dmRpc2ssIHRydWUpOwotCQlpZiAoZ2V0X2xkZXYobWRldikpIHsKLQkJCW1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0gJj0gfih1NjQpMTsKLQkJCXB1dF9sZGV2KG1kZXYpOworCQlzZXRfZGlza19ybyhkZXZpY2UtPnZkaXNrLCB0cnVlKTsKKwkJaWYgKGdldF9sZGV2KGRldmljZSkpIHsKKwkJCWRldmljZS0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSAmPSB+KHU2NCkxOworCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJfQogCX0gZWxzZSB7Ci0JCW11dGV4X2xvY2soJm1kZXYtPnRjb25uLT5jb25mX3VwZGF0ZSk7Ci0JCW5jID0gbWRldi0+dGNvbm4tPm5ldF9jb25mOworCQltdXRleF9sb2NrKCZkZXZpY2UtPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CisJCW5jID0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+bmV0X2NvbmY7CiAJCWlmIChuYykKIAkJCW5jLT5kaXNjYXJkX215X2RhdGEgPSAwOyAvKiB3aXRob3V0IGNvcHk7IHNpbmdsZSBiaXQgb3AgaXMgYXRvbWljICovCi0JCW11dGV4X3VubG9jaygmbWRldi0+dGNvbm4tPmNvbmZfdXBkYXRlKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CiAKLQkJc2V0X2Rpc2tfcm8obWRldi0+dmRpc2ssIGZhbHNlKTsKLQkJaWYgKGdldF9sZGV2KG1kZXYpKSB7Ci0JCQlpZiAoKChtZGV2LT5zdGF0ZS5jb25uIDwgQ19DT05ORUNURUQgfHwKLQkJCSAgICAgICBtZGV2LT5zdGF0ZS5wZHNrIDw9IERfRkFJTEVEKQotCQkJICAgICAgJiYgbWRldi0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdID09IDApIHx8IGZvcmNlZCkKLQkJCQlkcmJkX3V1aWRfbmV3X2N1cnJlbnQobWRldik7CisJCXNldF9kaXNrX3JvKGRldmljZS0+dmRpc2ssIGZhbHNlKTsKKwkJaWYgKGdldF9sZGV2KGRldmljZSkpIHsKKwkJCWlmICgoKGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEIHx8CisJCQkgICAgICAgZGV2aWNlLT5zdGF0ZS5wZHNrIDw9IERfRkFJTEVEKQorCQkJICAgICAgJiYgZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPT0gMCkgfHwgZm9yY2VkKQorCQkJCWRyYmRfdXVpZF9uZXdfY3VycmVudChkZXZpY2UpOwogCi0JCQltZGV2LT5sZGV2LT5tZC51dWlkW1VJX0NVUlJFTlRdIHw9ICAodTY0KTE7Ci0JCQlwdXRfbGRldihtZGV2KTsKKwkJCWRldmljZS0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSB8PSAgKHU2NCkxOworCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJfQogCX0KIAogCS8qIHdyaXRlb3V0IG9mIGFjdGl2aXR5IGxvZyBjb3ZlcmVkIGFyZWFzIG9mIHRoZSBiaXRtYXAKIAkgKiB0byBzdGFibGUgc3RvcmFnZSBkb25lIGluIGFmdGVyIHN0YXRlIGNoYW5nZSBhbHJlYWR5ICovCiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID49IENfV0ZfUkVQT1JUX1BBUkFNUykgewogCQkvKiBpZiB0aGlzIHdhcyBmb3JjZWQsIHdlIHNob3VsZCBjb25zaWRlciBzeW5jICovCiAJCWlmIChmb3JjZWQpCi0JCQlkcmJkX3NlbmRfdXVpZHMobWRldik7Ci0JCWRyYmRfc2VuZF9jdXJyZW50X3N0YXRlKG1kZXYpOworCQkJZHJiZF9zZW5kX3V1aWRzKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSkpOworCQlkcmJkX3NlbmRfY3VycmVudF9zdGF0ZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpKTsKIAl9CiAKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAKLQlrb2JqZWN0X3VldmVudCgmZGlza190b19kZXYobWRldi0+dmRpc2spLT5rb2JqLCBLT0JKX0NIQU5HRSk7CisJa29iamVjdF91ZXZlbnQoJmRpc2tfdG9fZGV2KGRldmljZS0+dmRpc2spLT5rb2JqLCBLT0JKX0NIQU5HRSk7CiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKG1kZXYtPnN0YXRlX211dGV4KTsKKwltdXRleF91bmxvY2soZGV2aWNlLT5zdGF0ZV9tdXRleCk7CiAJcmV0dXJuIHJ2OwogfQogCkBAIC02OTksOSArNzIxLDkgQEAKIAl9CiAKIAlpZiAoaW5mby0+Z2VubGhkci0+Y21kID09IERSQkRfQURNX1BSSU1BUlkpCi0JCXJldGNvZGUgPSBkcmJkX3NldF9yb2xlKGFkbV9jdHgubWRldiwgUl9QUklNQVJZLCBwYXJtcy5hc3N1bWVfdXB0b2RhdGUpOworCQlyZXRjb2RlID0gZHJiZF9zZXRfcm9sZShhZG1fY3R4LmRldmljZSwgUl9QUklNQVJZLCBwYXJtcy5hc3N1bWVfdXB0b2RhdGUpOwogCWVsc2UKLQkJcmV0Y29kZSA9IGRyYmRfc2V0X3JvbGUoYWRtX2N0eC5tZGV2LCBSX1NFQ09OREFSWSwgMCk7CisJCXJldGNvZGUgPSBkcmJkX3NldF9yb2xlKGFkbV9jdHguZGV2aWNlLCBSX1NFQ09OREFSWSwgMCk7CiBvdXQ6CiAJZHJiZF9hZG1fZmluaXNoKGluZm8sIHJldGNvZGUpOwogCXJldHVybiAwOwpAQCAtNzI4LDcgKzc1MCw3IEBACiAgKiAgQWN0aXZpdHkgbG9nIHNpemUgdXNlZCB0byBiZSBmaXhlZCAzMmtCLAogICogIGJ1dCBpcyBhYm91dCB0byBiZWNvbWUgY29uZmlndXJhYmxlLgogICovCi1zdGF0aWMgdm9pZCBkcmJkX21kX3NldF9zZWN0b3Jfb2Zmc2V0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIHZvaWQgZHJiZF9tZF9zZXRfc2VjdG9yX29mZnNldHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkJICAgICAgIHN0cnVjdCBkcmJkX2JhY2tpbmdfZGV2ICpiZGV2KQogewogCXNlY3Rvcl90IG1kX3NpemVfc2VjdCA9IDA7CkBAIC04MDQsMzUgKzgyNiwzNSBAQAogICogZHJiZF9hZG1fc3VzcGVuZF9pby9kcmJkX2FkbV9yZXN1bWVfaW8sCiAgKiB3aGljaCBhcmUgKHN1Yikgc3RhdGUgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgYWRtaW4gKGRyYmRzZXR1cCksCiAgKiBhbmQgY2FuIGJlIGxvbmcgbGl2ZWQuCi0gKiBUaGlzIGNoYW5nZXMgYW4gbWRldi0+ZmxhZywgaXMgdHJpZ2dlcmVkIGJ5IGRyYmQgaW50ZXJuYWxzLAorICogVGhpcyBjaGFuZ2VzIGFuIGRldmljZS0+ZmxhZywgaXMgdHJpZ2dlcmVkIGJ5IGRyYmQgaW50ZXJuYWxzLAogICogYW5kIHNob3VsZCBiZSBzaG9ydC1saXZlZC4gKi8KLXZvaWQgZHJiZF9zdXNwZW5kX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkIGRyYmRfc3VzcGVuZF9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzZXRfYml0KFNVU1BFTkRfSU8sICZtZGV2LT5mbGFncyk7Ci0JaWYgKGRyYmRfc3VzcGVuZGVkKG1kZXYpKQorCXNldF9iaXQoU1VTUEVORF9JTywgJmRldmljZS0+ZmxhZ3MpOworCWlmIChkcmJkX3N1c3BlbmRlZChkZXZpY2UpKQogCQlyZXR1cm47Ci0Jd2FpdF9ldmVudChtZGV2LT5taXNjX3dhaXQsICFhdG9taWNfcmVhZCgmbWRldi0+YXBfYmlvX2NudCkpOworCXdhaXRfZXZlbnQoZGV2aWNlLT5taXNjX3dhaXQsICFhdG9taWNfcmVhZCgmZGV2aWNlLT5hcF9iaW9fY250KSk7CiB9CiAKLXZvaWQgZHJiZF9yZXN1bWVfaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgZHJiZF9yZXN1bWVfaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JY2xlYXJfYml0KFNVU1BFTkRfSU8sICZtZGV2LT5mbGFncyk7Ci0Jd2FrZV91cCgmbWRldi0+bWlzY193YWl0KTsKKwljbGVhcl9iaXQoU1VTUEVORF9JTywgJmRldmljZS0+ZmxhZ3MpOworCXdha2VfdXAoJmRldmljZS0+bWlzY193YWl0KTsKIH0KIAogLyoqCiAgKiBkcmJkX2RldGVybWluZV9kZXZfc2l6ZSgpIC0gIFNldHMgdGhlIHJpZ2h0IGRldmljZSBzaXplIG9iZXlpbmcgYWxsIGNvbnN0cmFpbnRzCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgcmV0dXJuIHZhbHVlcyBpbmRpY2F0ZSBlcnJvcnMuCiAgKiBZb3Ugc2hvdWxkIGNhbGwgZHJiZF9tZF9zeW5jKCkgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogICovCiBlbnVtIGRldGVybWluZV9kZXZfc2l6ZQotZHJiZF9kZXRlcm1pbmVfZGV2X3NpemUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkZHNfZmxhZ3MgZmxhZ3MsIHN0cnVjdCByZXNpemVfcGFybXMgKnJzKSBfX211c3RfaG9sZChsb2NhbCkKK2RyYmRfZGV0ZXJtaW5lX2Rldl9zaXplKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBlbnVtIGRkc19mbGFncyBmbGFncywgc3RydWN0IHJlc2l6ZV9wYXJtcyAqcnMpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCXNlY3Rvcl90IHByZXZfZmlyc3Rfc2VjdCwgcHJldl9zaXplOyAvKiBwcmV2aW91cyBtZXRhIGxvY2F0aW9uICovCiAJc2VjdG9yX3QgbGFfc2l6ZV9zZWN0LCB1X3NpemU7Ci0Jc3RydWN0IGRyYmRfbWQgKm1kID0gJm1kZXYtPmxkZXYtPm1kOworCXN0cnVjdCBkcmJkX21kICptZCA9ICZkZXZpY2UtPmxkZXYtPm1kOwogCXUzMiBwcmV2X2FsX3N0cmlwZV9zaXplXzRrOwogCXUzMiBwcmV2X2FsX3N0cmlwZXM7CiAJc2VjdG9yX3Qgc2l6ZTsKQEAgLTg1MSwxOSArODczLDE5IEBACiAJICogU3VzcGVuZCBJTyByaWdodCBoZXJlLgogCSAqIHN0aWxsIGxvY2sgdGhlIGFjdF9sb2cgdG8gbm90IHRyaWdnZXIgQVNTRVJUcyB0aGVyZS4KIAkgKi8KLQlkcmJkX3N1c3BlbmRfaW8obWRldik7Ci0JYnVmZmVyID0gZHJiZF9tZF9nZXRfYnVmZmVyKG1kZXYpOyAvKiBMb2NrIG1ldGEtZGF0YSBJTyAqLworCWRyYmRfc3VzcGVuZF9pbyhkZXZpY2UpOworCWJ1ZmZlciA9IGRyYmRfbWRfZ2V0X2J1ZmZlcihkZXZpY2UpOyAvKiBMb2NrIG1ldGEtZGF0YSBJTyAqLwogCWlmICghYnVmZmVyKSB7Ci0JCWRyYmRfcmVzdW1lX2lvKG1kZXYpOworCQlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogCQlyZXR1cm4gRFNfRVJST1I7CiAJfQogCiAJLyogbm8gd2FpdCBuZWNlc3NhcnkgYW55bW9yZSwgYWN0dWFsbHkgd2UgY291bGQgYXNzZXJ0IHRoYXQgKi8KLQl3YWl0X2V2ZW50KG1kZXYtPmFsX3dhaXQsIGxjX3RyeV9sb2NrKG1kZXYtPmFjdF9sb2cpKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+YWxfd2FpdCwgbGNfdHJ5X2xvY2soZGV2aWNlLT5hY3RfbG9nKSk7CiAKLQlwcmV2X2ZpcnN0X3NlY3QgPSBkcmJkX21kX2ZpcnN0X3NlY3RvcihtZGV2LT5sZGV2KTsKLQlwcmV2X3NpemUgPSBtZGV2LT5sZGV2LT5tZC5tZF9zaXplX3NlY3Q7Ci0JbGFfc2l6ZV9zZWN0ID0gbWRldi0+bGRldi0+bWQubGFfc2l6ZV9zZWN0OworCXByZXZfZmlyc3Rfc2VjdCA9IGRyYmRfbWRfZmlyc3Rfc2VjdG9yKGRldmljZS0+bGRldik7CisJcHJldl9zaXplID0gZGV2aWNlLT5sZGV2LT5tZC5tZF9zaXplX3NlY3Q7CisJbGFfc2l6ZV9zZWN0ID0gZGV2aWNlLT5sZGV2LT5tZC5sYV9zaXplX3NlY3Q7CiAKIAlpZiAocnMpIHsKIAkJLyogcnMgaXMgbm9uIE5VTEwgaWYgd2Ugc2hvdWxkIGNoYW5nZSB0aGUgQUwgbGF5b3V0IG9ubHkgKi8KQEAgLTg3NiwxOCArODk4LDE4IEBACiAJCW1kLT5hbF9zaXplXzRrID0gKHU2NClycy0+YWxfc3RyaXBlcyAqIHJzLT5hbF9zdHJpcGVfc2l6ZSAvIDQ7CiAJfQogCi0JZHJiZF9tZF9zZXRfc2VjdG9yX29mZnNldHMobWRldiwgbWRldi0+bGRldik7CisJZHJiZF9tZF9zZXRfc2VjdG9yX29mZnNldHMoZGV2aWNlLCBkZXZpY2UtPmxkZXYpOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCXVfc2l6ZSA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5kaXNrX3NpemU7CisJdV9zaXplID0gcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+bGRldi0+ZGlza19jb25mKS0+ZGlza19zaXplOwogCXJjdV9yZWFkX3VubG9jaygpOwotCXNpemUgPSBkcmJkX25ld19kZXZfc2l6ZShtZGV2LCBtZGV2LT5sZGV2LCB1X3NpemUsIGZsYWdzICYgRERTRl9GT1JDRUQpOworCXNpemUgPSBkcmJkX25ld19kZXZfc2l6ZShkZXZpY2UsIGRldmljZS0+bGRldiwgdV9zaXplLCBmbGFncyAmIEREU0ZfRk9SQ0VEKTsKIAogCWlmIChzaXplIDwgbGFfc2l6ZV9zZWN0KSB7CiAJCWlmIChycyAmJiB1X3NpemUgPT0gMCkgewogCQkJLyogUmVtb3ZlICJycyAmJiIgbGF0ZXIuIFRoaXMgY2hlY2sgc2hvdWxkIGFsd2F5cyBiZSBhY3RpdmUsIGJ1dAogCQkJICAgcmlnaHQgbm93IHRoZSByZWNlaXZlciBleHBlY3RzIHRoZSBwZXJtaXNzaXZlIGJlaGF2aW9yICovCi0JCQlkZXZfd2FybihERVYsICJJbXBsaWNpdCBzaHJpbmsgbm90IGFsbG93ZWQuICIKKwkJCWRyYmRfd2FybihkZXZpY2UsICJJbXBsaWNpdCBzaHJpbmsgbm90IGFsbG93ZWQuICIKIAkJCQkgIlVzZSAtLXNpemU9JWxsdXMgZm9yIGV4cGxpY2l0IHNocmluay5cbiIsCiAJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpc2l6ZSk7CiAJCQlydiA9IERTX0VSUk9SX1NIUklOSzsKQEAgLTg5OCw2MCArOTIwLDYwIEBACiAJCQlnb3RvIGVycl9vdXQ7CiAJfQogCi0JaWYgKGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldikgIT0gc2l6ZSB8fAotCSAgICBkcmJkX2JtX2NhcGFjaXR5KG1kZXYpICE9IHNpemUpIHsKKwlpZiAoZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT50aGlzX2JkZXYpICE9IHNpemUgfHwKKwkgICAgZHJiZF9ibV9jYXBhY2l0eShkZXZpY2UpICE9IHNpemUpIHsKIAkJaW50IGVycjsKLQkJZXJyID0gZHJiZF9ibV9yZXNpemUobWRldiwgc2l6ZSwgIShmbGFncyAmIEREU0ZfTk9fUkVTWU5DKSk7CisJCWVyciA9IGRyYmRfYm1fcmVzaXplKGRldmljZSwgc2l6ZSwgIShmbGFncyAmIEREU0ZfTk9fUkVTWU5DKSk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCQkvKiBjdXJyZW50bHkgdGhlcmUgaXMgb25seSBvbmUgZXJyb3I6IEVOT01FTSEgKi8KLQkJCXNpemUgPSBkcmJkX2JtX2NhcGFjaXR5KG1kZXYpPj4xOworCQkJc2l6ZSA9IGRyYmRfYm1fY2FwYWNpdHkoZGV2aWNlKT4+MTsKIAkJCWlmIChzaXplID09IDApIHsKLQkJCQlkZXZfZXJyKERFViwgIk9VVCBPRiBNRU1PUlkhICIKKwkJCQlkcmJkX2VycihkZXZpY2UsICJPVVQgT0YgTUVNT1JZISAiCiAJCQkJICAgICJDb3VsZCBub3QgYWxsb2NhdGUgYml0bWFwIVxuIik7CiAJCQl9IGVsc2UgewotCQkJCWRldl9lcnIoREVWLCAiQk0gcmVzaXppbmcgZmFpbGVkLiAiCisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiQk0gcmVzaXppbmcgZmFpbGVkLiAiCiAJCQkJICAgICJMZWF2aW5nIHNpemUgdW5jaGFuZ2VkIGF0IHNpemUgPSAlbHUgS0JcbiIsCiAJCQkJICAgICh1bnNpZ25lZCBsb25nKXNpemUpOwogCQkJfQogCQkJcnYgPSBEU19FUlJPUjsKIAkJfQogCQkvKiByYWN5LCBzZWUgY29tbWVudHMgYWJvdmUuICovCi0JCWRyYmRfc2V0X215X2NhcGFjaXR5KG1kZXYsIHNpemUpOwotCQltZGV2LT5sZGV2LT5tZC5sYV9zaXplX3NlY3QgPSBzaXplOwotCQlkZXZfaW5mbyhERVYsICJzaXplID0gJXMgKCVsbHUgS0IpXG4iLCBwcHNpemUocHBiLCBzaXplPj4xKSwKKwkJZHJiZF9zZXRfbXlfY2FwYWNpdHkoZGV2aWNlLCBzaXplKTsKKwkJZGV2aWNlLT5sZGV2LT5tZC5sYV9zaXplX3NlY3QgPSBzaXplOworCQlkcmJkX2luZm8oZGV2aWNlLCAic2l6ZSA9ICVzICglbGx1IEtCKVxuIiwgcHBzaXplKHBwYiwgc2l6ZT4+MSksCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzaXplPj4xKTsKIAl9CiAJaWYgKHJ2IDw9IERTX0VSUk9SKQogCQlnb3RvIGVycl9vdXQ7CiAKLQlsYV9zaXplX2NoYW5nZWQgPSAobGFfc2l6ZV9zZWN0ICE9IG1kZXYtPmxkZXYtPm1kLmxhX3NpemVfc2VjdCk7CisJbGFfc2l6ZV9jaGFuZ2VkID0gKGxhX3NpemVfc2VjdCAhPSBkZXZpY2UtPmxkZXYtPm1kLmxhX3NpemVfc2VjdCk7CiAKLQltZF9tb3ZlZCA9IHByZXZfZmlyc3Rfc2VjdCAhPSBkcmJkX21kX2ZpcnN0X3NlY3RvcihtZGV2LT5sZGV2KQotCQl8fCBwcmV2X3NpemUJICAgIT0gbWRldi0+bGRldi0+bWQubWRfc2l6ZV9zZWN0OworCW1kX21vdmVkID0gcHJldl9maXJzdF9zZWN0ICE9IGRyYmRfbWRfZmlyc3Rfc2VjdG9yKGRldmljZS0+bGRldikKKwkJfHwgcHJldl9zaXplCSAgICE9IGRldmljZS0+bGRldi0+bWQubWRfc2l6ZV9zZWN0OwogCiAJaWYgKGxhX3NpemVfY2hhbmdlZCB8fCBtZF9tb3ZlZCB8fCBycykgewogCQl1MzIgcHJldl9mbGFnczsKIAotCQlkcmJkX2FsX3NocmluayhtZGV2KTsgLyogQWxsIGV4dGVudHMgaW5hY3RpdmUuICovCisJCWRyYmRfYWxfc2hyaW5rKGRldmljZSk7IC8qIEFsbCBleHRlbnRzIGluYWN0aXZlLiAqLwogCiAJCXByZXZfZmxhZ3MgPSBtZC0+ZmxhZ3M7CiAJCW1kLT5mbGFncyAmPSB+TURGX1BSSU1BUllfSU5EOwotCQlkcmJkX21kX3dyaXRlKG1kZXYsIGJ1ZmZlcik7CisJCWRyYmRfbWRfd3JpdGUoZGV2aWNlLCBidWZmZXIpOwogCi0JCWRldl9pbmZvKERFViwgIldyaXRpbmcgdGhlIHdob2xlIGJpdG1hcCwgJXNcbiIsCisJCWRyYmRfaW5mbyhkZXZpY2UsICJXcml0aW5nIHRoZSB3aG9sZSBiaXRtYXAsICVzXG4iLAogCQkJIGxhX3NpemVfY2hhbmdlZCAmJiBtZF9tb3ZlZCA/ICJzaXplIGNoYW5nZWQgYW5kIG1kIG1vdmVkIiA6CiAJCQkgbGFfc2l6ZV9jaGFuZ2VkID8gInNpemUgY2hhbmdlZCIgOiAibWQgbW92ZWQiKTsKIAkJLyogbmV4dCBsaW5lIGltcGxpY2l0bHkgZG9lcyBkcmJkX3N1c3BlbmRfaW8oKStkcmJkX3Jlc3VtZV9pbygpICovCi0JCWRyYmRfYml0bWFwX2lvKG1kZXYsIG1kX21vdmVkID8gJmRyYmRfYm1fd3JpdGVfYWxsIDogJmRyYmRfYm1fd3JpdGUsCisJCWRyYmRfYml0bWFwX2lvKGRldmljZSwgbWRfbW92ZWQgPyAmZHJiZF9ibV93cml0ZV9hbGwgOiAmZHJiZF9ibV93cml0ZSwKIAkJCSAgICAgICAic2l6ZSBjaGFuZ2VkIiwgQk1fTE9DS0VEX01BU0spOwotCQlkcmJkX2luaXRpYWxpemVfYWwobWRldiwgYnVmZmVyKTsKKwkJZHJiZF9pbml0aWFsaXplX2FsKGRldmljZSwgYnVmZmVyKTsKIAogCQltZC0+ZmxhZ3MgPSBwcmV2X2ZsYWdzOwotCQlkcmJkX21kX3dyaXRlKG1kZXYsIGJ1ZmZlcik7CisJCWRyYmRfbWRfd3JpdGUoZGV2aWNlLCBidWZmZXIpOwogCiAJCWlmIChycykKLQkJCWRldl9pbmZvKERFViwgIkNoYW5nZWQgQUwgbGF5b3V0IHRvIGFsLXN0cmlwZXMgPSAlZCwgYWwtc3RyaXBlLXNpemUta0IgPSAlZFxuIiwKLQkJCQkgbWQtPmFsX3N0cmlwZXMsIG1kLT5hbF9zdHJpcGVfc2l6ZV80ayAqIDQpOworCQkJZHJiZF9pbmZvKGRldmljZSwgIkNoYW5nZWQgQUwgbGF5b3V0IHRvIGFsLXN0cmlwZXMgPSAlZCwgYWwtc3RyaXBlLXNpemUta0IgPSAlZFxuIiwKKwkJCQkgIG1kLT5hbF9zdHJpcGVzLCBtZC0+YWxfc3RyaXBlX3NpemVfNGsgKiA0KTsKIAl9CiAKIAlpZiAoc2l6ZSA+IGxhX3NpemVfc2VjdCkKQEAgLTk2NiwzMCArOTg4LDMwIEBACiAJCQltZC0+YWxfc3RyaXBlX3NpemVfNGsgPSBwcmV2X2FsX3N0cmlwZV9zaXplXzRrOwogCQkJbWQtPmFsX3NpemVfNGsgPSAodTY0KXByZXZfYWxfc3RyaXBlcyAqIHByZXZfYWxfc3RyaXBlX3NpemVfNGs7CiAKLQkJCWRyYmRfbWRfc2V0X3NlY3Rvcl9vZmZzZXRzKG1kZXYsIG1kZXYtPmxkZXYpOworCQkJZHJiZF9tZF9zZXRfc2VjdG9yX29mZnNldHMoZGV2aWNlLCBkZXZpY2UtPmxkZXYpOwogCQl9CiAJfQotCWxjX3VubG9jayhtZGV2LT5hY3RfbG9nKTsKLQl3YWtlX3VwKCZtZGV2LT5hbF93YWl0KTsKLQlkcmJkX21kX3B1dF9idWZmZXIobWRldik7Ci0JZHJiZF9yZXN1bWVfaW8obWRldik7CisJbGNfdW5sb2NrKGRldmljZS0+YWN0X2xvZyk7CisJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKKwlkcmJkX21kX3B1dF9idWZmZXIoZGV2aWNlKTsKKwlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogCiAJcmV0dXJuIHJ2OwogfQogCiBzZWN0b3JfdAotZHJiZF9uZXdfZGV2X3NpemUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsCitkcmJkX25ld19kZXZfc2l6ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsCiAJCSAgc2VjdG9yX3QgdV9zaXplLCBpbnQgYXNzdW1lX3BlZXJfaGFzX3NwYWNlKQogewotCXNlY3Rvcl90IHBfc2l6ZSA9IG1kZXYtPnBfc2l6ZTsgICAvKiBwYXJ0bmVyJ3MgZGlzayBzaXplLiAqLworCXNlY3Rvcl90IHBfc2l6ZSA9IGRldmljZS0+cF9zaXplOyAgIC8qIHBhcnRuZXIncyBkaXNrIHNpemUuICovCiAJc2VjdG9yX3QgbGFfc2l6ZV9zZWN0ID0gYmRldi0+bWQubGFfc2l6ZV9zZWN0OyAvKiBsYXN0IGFncmVlZCBzaXplLiAqLwogCXNlY3Rvcl90IG1fc2l6ZTsgLyogbXkgc2l6ZSAqLwogCXNlY3Rvcl90IHNpemUgPSAwOwogCiAJbV9zaXplID0gZHJiZF9nZXRfbWF4X2NhcGFjaXR5KGJkZXYpOwogCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCAmJiBhc3N1bWVfcGVlcl9oYXNfc3BhY2UpIHsKLQkJZGV2X3dhcm4oREVWLCAiUmVzaXplIHdoaWxlIG5vdCBjb25uZWN0ZWQgd2FzIGZvcmNlZCBieSB0aGUgdXNlciFcbiIpOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCAmJiBhc3N1bWVfcGVlcl9oYXNfc3BhY2UpIHsKKwkJZHJiZF93YXJuKGRldmljZSwgIlJlc2l6ZSB3aGlsZSBub3QgY29ubmVjdGVkIHdhcyBmb3JjZWQgYnkgdGhlIHVzZXIhXG4iKTsKIAkJcF9zaXplID0gbV9zaXplOwogCX0KIApAQCAtMTAxMSwxMSArMTAzMywxMSBAQAogCX0KIAogCWlmIChzaXplID09IDApCi0JCWRldl9lcnIoREVWLCAiQm90aCBub2RlcyBkaXNrbGVzcyFcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJCb3RoIG5vZGVzIGRpc2tsZXNzIVxuIik7CiAKIAlpZiAodV9zaXplKSB7CiAJCWlmICh1X3NpemUgPiBzaXplKQotCQkJZGV2X2VycihERVYsICJSZXF1ZXN0ZWQgZGlzayBzaXplIGlzIHRvbyBiaWcgKCVsdSA+ICVsdSlcbiIsCisJCQlkcmJkX2VycihkZXZpY2UsICJSZXF1ZXN0ZWQgZGlzayBzaXplIGlzIHRvbyBiaWcgKCVsdSA+ICVsdSlcbiIsCiAJCQkgICAgKHVuc2lnbmVkIGxvbmcpdV9zaXplPj4xLCAodW5zaWduZWQgbG9uZylzaXplPj4xKTsKIAkJZWxzZQogCQkJc2l6ZSA9IHVfc2l6ZTsKQEAgLTEwMjYsNzEgKzEwNDgsNzEgQEAKIAogLyoqCiAgKiBkcmJkX2NoZWNrX2FsX3NpemUoKSAtIEVuc3VyZXMgdGhhdCB0aGUgQUwgaXMgb2YgdGhlIHJpZ2h0IHNpemUKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIFJldHVybnMgLUVCVVNZIGlmIGN1cnJlbnQgYWwgbHJ1IGlzIHN0aWxsIHVzZWQsIC1FTk9NRU0gd2hlbiBhbGxvY2F0aW9uCiAgKiBmYWlsZWQsIGFuZCAwIG9uIHN1Y2Nlc3MuIFlvdSBzaG91bGQgY2FsbCBkcmJkX21kX3N5bmMoKSBhZnRlciB5b3UgY2FsbGVkCiAgKiB0aGlzIGZ1bmN0aW9uLgogICovCi1zdGF0aWMgaW50IGRyYmRfY2hlY2tfYWxfc2l6ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZGlza19jb25mICpkYykKK3N0YXRpYyBpbnQgZHJiZF9jaGVja19hbF9zaXplKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZGlza19jb25mICpkYykKIHsKIAlzdHJ1Y3QgbHJ1X2NhY2hlICpuLCAqdDsKIAlzdHJ1Y3QgbGNfZWxlbWVudCAqZTsKIAl1bnNpZ25lZCBpbnQgaW5fdXNlOwogCWludCBpOwogCi0JaWYgKG1kZXYtPmFjdF9sb2cgJiYKLQkgICAgbWRldi0+YWN0X2xvZy0+bnJfZWxlbWVudHMgPT0gZGMtPmFsX2V4dGVudHMpCisJaWYgKGRldmljZS0+YWN0X2xvZyAmJgorCSAgICBkZXZpY2UtPmFjdF9sb2ctPm5yX2VsZW1lbnRzID09IGRjLT5hbF9leHRlbnRzKQogCQlyZXR1cm4gMDsKIAogCWluX3VzZSA9IDA7Ci0JdCA9IG1kZXYtPmFjdF9sb2c7CisJdCA9IGRldmljZS0+YWN0X2xvZzsKIAluID0gbGNfY3JlYXRlKCJhY3RfbG9nIiwgZHJiZF9hbF9leHRfY2FjaGUsIEFMX1VQREFURVNfUEVSX1RSQU5TQUNUSU9OLAogCQlkYy0+YWxfZXh0ZW50cywgc2l6ZW9mKHN0cnVjdCBsY19lbGVtZW50KSwgMCk7CiAKIAlpZiAobiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoREVWLCAiQ2Fubm90IGFsbG9jYXRlIGFjdF9sb2cgbHJ1IVxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkNhbm5vdCBhbGxvY2F0ZSBhY3RfbG9nIGxydSFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAlpZiAodCkgewogCQlmb3IgKGkgPSAwOyBpIDwgdC0+bnJfZWxlbWVudHM7IGkrKykgewogCQkJZSA9IGxjX2VsZW1lbnRfYnlfaW5kZXgodCwgaSk7CiAJCQlpZiAoZS0+cmVmY250KQotCQkJCWRldl9lcnIoREVWLCAicmVmY250KCVkKT09JWRcbiIsCisJCQkJZHJiZF9lcnIoZGV2aWNlLCAicmVmY250KCVkKT09JWRcbiIsCiAJCQkJICAgIGUtPmxjX251bWJlciwgZS0+cmVmY250KTsKIAkJCWluX3VzZSArPSBlLT5yZWZjbnQ7CiAJCX0KIAl9CiAJaWYgKCFpbl91c2UpCi0JCW1kZXYtPmFjdF9sb2cgPSBuOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJCWRldmljZS0+YWN0X2xvZyA9IG47CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPmFsX2xvY2spOwogCWlmIChpbl91c2UpIHsKLQkJZGV2X2VycihERVYsICJBY3Rpdml0eSBsb2cgc3RpbGwgaW4gdXNlIVxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkFjdGl2aXR5IGxvZyBzdGlsbCBpbiB1c2UhXG4iKTsKIAkJbGNfZGVzdHJveShuKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9IGVsc2UgewogCQlpZiAodCkKIAkJCWxjX2Rlc3Ryb3kodCk7CiAJfQotCWRyYmRfbWRfbWFya19kaXJ0eShtZGV2KTsgLyogd2UgY2hhbmdlZCBtZGV2LT5hY3RfbG9nLT5ucl9lbGVtZW5zICovCisJZHJiZF9tZF9tYXJrX2RpcnR5KGRldmljZSk7IC8qIHdlIGNoYW5nZWQgZGV2aWNlLT5hY3RfbG9nLT5ucl9lbGVtZW5zICovCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGRyYmRfc2V0dXBfcXVldWVfcGFyYW0oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgaW50IG1heF9iaW9fc2l6ZSkKK3N0YXRpYyB2b2lkIGRyYmRfc2V0dXBfcXVldWVfcGFyYW0oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGludCBtYXhfYmlvX3NpemUpCiB7Ci0Jc3RydWN0IHJlcXVlc3RfcXVldWUgKiBjb25zdCBxID0gbWRldi0+cnFfcXVldWU7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKiBjb25zdCBxID0gZGV2aWNlLT5ycV9xdWV1ZTsKIAl1bnNpZ25lZCBpbnQgbWF4X2h3X3NlY3RvcnMgPSBtYXhfYmlvX3NpemUgPj4gOTsKIAl1bnNpZ25lZCBpbnQgbWF4X3NlZ21lbnRzID0gMDsKIAotCWlmIChnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0FUVEFDSElORykpIHsKLQkJc3RydWN0IHJlcXVlc3RfcXVldWUgKiBjb25zdCBiID0gbWRldi0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9kaXNrLT5xdWV1ZTsKKwlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0FUVEFDSElORykpIHsKKwkJc3RydWN0IHJlcXVlc3RfcXVldWUgKiBjb25zdCBiID0gZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXYtPmJkX2Rpc2stPnF1ZXVlOwogCiAJCW1heF9od19zZWN0b3JzID0gbWluKHF1ZXVlX21heF9od19zZWN0b3JzKGIpLCBtYXhfYmlvX3NpemUgPj4gOSk7CiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJbWF4X3NlZ21lbnRzID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZiktPm1heF9iaW9fYnZlY3M7CisJCW1heF9zZWdtZW50cyA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPm1heF9iaW9fYnZlY3M7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKIAlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKHEsIDUxMik7CkBAIC0xMDk5LDQ2ICsxMTIxLDQ2IEBACiAJYmxrX3F1ZXVlX21heF9zZWdtZW50cyhxLCBtYXhfc2VnbWVudHMgPyBtYXhfc2VnbWVudHMgOiBCTEtfTUFYX1NFR01FTlRTKTsKIAlibGtfcXVldWVfc2VnbWVudF9ib3VuZGFyeShxLCBQQUdFX0NBQ0hFX1NJWkUtMSk7CiAKLQlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9BVFRBQ0hJTkcpKSB7Ci0JCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICogY29uc3QgYiA9IG1kZXYtPmxkZXYtPmJhY2tpbmdfYmRldi0+YmRfZGlzay0+cXVldWU7CisJaWYgKGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9BVFRBQ0hJTkcpKSB7CisJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICogY29uc3QgYiA9IGRldmljZS0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9kaXNrLT5xdWV1ZTsKIAogCQlibGtfcXVldWVfc3RhY2tfbGltaXRzKHEsIGIpOwogCiAJCWlmIChxLT5iYWNraW5nX2Rldl9pbmZvLnJhX3BhZ2VzICE9IGItPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXMpIHsKLQkJCWRldl9pbmZvKERFViwgIkFkanVzdGluZyBteSByYV9wYWdlcyB0byBiYWNraW5nIGRldmljZSdzICglbHUgLT4gJWx1KVxuIiwKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJBZGp1c3RpbmcgbXkgcmFfcGFnZXMgdG8gYmFja2luZyBkZXZpY2UncyAoJWx1IC0+ICVsdSlcbiIsCiAJCQkJIHEtPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXMsCiAJCQkJIGItPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXMpOwogCQkJcS0+YmFja2luZ19kZXZfaW5mby5yYV9wYWdlcyA9IGItPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXM7CiAJCX0KLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogfQogCi12b2lkIGRyYmRfcmVjb25zaWRlcl9tYXhfYmlvX3NpemUoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgZHJiZF9yZWNvbnNpZGVyX21heF9iaW9fc2l6ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAl1bnNpZ25lZCBpbnQgbm93LCBuZXcsIGxvY2FsLCBwZWVyOwogCi0Jbm93ID0gcXVldWVfbWF4X2h3X3NlY3RvcnMobWRldi0+cnFfcXVldWUpIDw8IDk7Ci0JbG9jYWwgPSBtZGV2LT5sb2NhbF9tYXhfYmlvX3NpemU7IC8qIEV2ZW50dWFsbHkgbGFzdCBrbm93biB2YWx1ZSwgZnJvbSB2b2xhdGlsZSBtZW1vcnkgKi8KLQlwZWVyID0gbWRldi0+cGVlcl9tYXhfYmlvX3NpemU7IC8qIEV2ZW50dWFsbHkgbGFzdCBrbm93biB2YWx1ZSwgZnJvbSBtZXRhIGRhdGEgKi8KKwlub3cgPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhkZXZpY2UtPnJxX3F1ZXVlKSA8PCA5OworCWxvY2FsID0gZGV2aWNlLT5sb2NhbF9tYXhfYmlvX3NpemU7IC8qIEV2ZW50dWFsbHkgbGFzdCBrbm93biB2YWx1ZSwgZnJvbSB2b2xhdGlsZSBtZW1vcnkgKi8KKwlwZWVyID0gZGV2aWNlLT5wZWVyX21heF9iaW9fc2l6ZTsgLyogRXZlbnR1YWxseSBsYXN0IGtub3duIHZhbHVlLCBmcm9tIG1ldGEgZGF0YSAqLwogCi0JaWYgKGdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfQVRUQUNISU5HKSkgewotCQlsb2NhbCA9IHF1ZXVlX21heF9od19zZWN0b3JzKG1kZXYtPmxkZXYtPmJhY2tpbmdfYmRldi0+YmRfZGlzay0+cXVldWUpIDw8IDk7Ci0JCW1kZXYtPmxvY2FsX21heF9iaW9fc2l6ZSA9IGxvY2FsOwotCQlwdXRfbGRldihtZGV2KTsKKwlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0FUVEFDSElORykpIHsKKwkJbG9jYWwgPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhkZXZpY2UtPmxkZXYtPmJhY2tpbmdfYmRldi0+YmRfZGlzay0+cXVldWUpIDw8IDk7CisJCWRldmljZS0+bG9jYWxfbWF4X2Jpb19zaXplID0gbG9jYWw7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCWxvY2FsID0gbWluKGxvY2FsLCBEUkJEX01BWF9CSU9fU0laRSk7CiAKIAkvKiBXZSBtYXkgaWdub3JlIHBlZXIgbGltaXRzIGlmIHRoZSBwZWVyIGlzIG1vZGVybiBlbm91Z2guCiAJICAgQmVjYXVzZSBuZXcgZnJvbSA4LjMuOCBvbndhcmRzIHRoZSBwZWVyIGNhbiB1c2UgbXVsdGlwbGUKIAkgICBCSU9zIGZvciBhIHNpbmdsZSBwZWVyX3JlcXVlc3QgKi8KLQlpZiAobWRldi0+c3RhdGUuY29ubiA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKLQkJaWYgKG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5NCkKLQkJCXBlZXIgPSBtaW4obWRldi0+cGVlcl9tYXhfYmlvX3NpemUsIERSQkRfTUFYX1NJWkVfSDgwX1BBQ0tFVCk7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKKwkJaWYgKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk0KQorCQkJcGVlciA9IG1pbihkZXZpY2UtPnBlZXJfbWF4X2Jpb19zaXplLCBEUkJEX01BWF9TSVpFX0g4MF9QQUNLRVQpOwogCQkJLyogQ29ycmVjdCBvbGQgZHJiZCAodXAgdG8gOC4zLjcpIGlmIGl0IGJlbGlldmVzIGl0IGNhbiBkbyBtb3JlIHRoYW4gMzJLaUIgKi8KLQkJZWxzZSBpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA9PSA5NCkKKwkJZWxzZSBpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID09IDk0KQogCQkJcGVlciA9IERSQkRfTUFYX1NJWkVfSDgwX1BBQ0tFVDsKLQkJZWxzZSBpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDEwMCkKKwkJZWxzZSBpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgMTAwKQogCQkJcGVlciA9IERSQkRfTUFYX0JJT19TSVpFX1A5NTsgIC8qIGRyYmQgOC4zLjggb253YXJkcywgYmVmb3JlIDguNC4wICovCiAJCWVsc2UKIAkJCXBlZXIgPSBEUkJEX01BWF9CSU9fU0laRTsKQEAgLTExNDYsNTcgKzExNjgsNTcgQEAKIAogCW5ldyA9IG1pbihsb2NhbCwgcGVlcik7CiAKLQlpZiAobWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkgJiYgbmV3IDwgbm93KQotCQlkZXZfZXJyKERFViwgIkFTU0VSVCBGQUlMRUQgbmV3IDwgbm93OyAoJXUgPCAldSlcbiIsIG5ldywgbm93KTsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSAmJiBuZXcgPCBub3cpCisJCWRyYmRfZXJyKGRldmljZSwgIkFTU0VSVCBGQUlMRUQgbmV3IDwgbm93OyAoJXUgPCAldSlcbiIsIG5ldywgbm93KTsKIAogCWlmIChuZXcgIT0gbm93KQotCQlkZXZfaW5mbyhERVYsICJtYXggQklPIHNpemUgPSAldVxuIiwgbmV3KTsKKwkJZHJiZF9pbmZvKGRldmljZSwgIm1heCBCSU8gc2l6ZSA9ICV1XG4iLCBuZXcpOwogCi0JZHJiZF9zZXR1cF9xdWV1ZV9wYXJhbShtZGV2LCBuZXcpOworCWRyYmRfc2V0dXBfcXVldWVfcGFyYW0oZGV2aWNlLCBuZXcpOwogfQogCiAvKiBTdGFydHMgdGhlIHdvcmtlciB0aHJlYWQgKi8KLXN0YXRpYyB2b2lkIGNvbm5fcmVjb25maWdfc3RhcnQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIHZvaWQgY29ubl9yZWNvbmZpZ19zdGFydChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCWRyYmRfdGhyZWFkX3N0YXJ0KCZ0Y29ubi0+d29ya2VyKTsKLQljb25uX2ZsdXNoX3dvcmtxdWV1ZSh0Y29ubik7CisJZHJiZF90aHJlYWRfc3RhcnQoJmNvbm5lY3Rpb24tPndvcmtlcik7CisJZHJiZF9mbHVzaF93b3JrcXVldWUoJmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrKTsKIH0KIAogLyogaWYgc3RpbGwgdW5jb25maWd1cmVkLCBzdG9wcyB3b3JrZXIgYWdhaW4uICovCi1zdGF0aWMgdm9pZCBjb25uX3JlY29uZmlnX2RvbmUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIHZvaWQgY29ubl9yZWNvbmZpZ19kb25lKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7CiAJYm9vbCBzdG9wX3RocmVhZHM7Ci0Jc3Bpbl9sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKLQlzdG9wX3RocmVhZHMgPSBjb25uX2FsbF92b2xzX3VuY29uZih0Y29ubikgJiYKLQkJdGNvbm4tPmNzdGF0ZSA9PSBDX1NUQU5EQUxPTkU7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CisJc3RvcF90aHJlYWRzID0gY29ubl9hbGxfdm9sc191bmNvbmYoY29ubmVjdGlvbikgJiYKKwkJY29ubmVjdGlvbi0+Y3N0YXRlID09IENfU1RBTkRBTE9ORTsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiAJaWYgKHN0b3BfdGhyZWFkcykgewogCQkvKiBhc2VuZGVyIGlzIGltcGxpY2l0bHkgc3RvcHBlZCBieSByZWNlaXZlcgogCQkgKiBpbiBjb25uX2Rpc2Nvbm5lY3QoKSAqLwotCQlkcmJkX3RocmVhZF9zdG9wKCZ0Y29ubi0+cmVjZWl2ZXIpOwotCQlkcmJkX3RocmVhZF9zdG9wKCZ0Y29ubi0+d29ya2VyKTsKKwkJZHJiZF90aHJlYWRfc3RvcCgmY29ubmVjdGlvbi0+cmVjZWl2ZXIpOworCQlkcmJkX3RocmVhZF9zdG9wKCZjb25uZWN0aW9uLT53b3JrZXIpOwogCX0KIH0KIAogLyogTWFrZSBzdXJlIElPIGlzIHN1c3BlbmRlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uKCkuICovCi1zdGF0aWMgdm9pZCBkcmJkX3N1c3BlbmRfYWwoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyB2b2lkIGRyYmRfc3VzcGVuZF9hbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgcyA9IDA7CiAKLQlpZiAoIWxjX3RyeV9sb2NrKG1kZXYtPmFjdF9sb2cpKSB7Ci0JCWRldl93YXJuKERFViwgIkZhaWxlZCB0byBsb2NrIGFsIGluIGRyYmRfc3VzcGVuZF9hbCgpXG4iKTsKKwlpZiAoIWxjX3RyeV9sb2NrKGRldmljZS0+YWN0X2xvZykpIHsKKwkJZHJiZF93YXJuKGRldmljZSwgIkZhaWxlZCB0byBsb2NrIGFsIGluIGRyYmRfc3VzcGVuZF9hbCgpXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCWRyYmRfYWxfc2hyaW5rKG1kZXYpOwotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCkKLQkJcyA9ICF0ZXN0X2FuZF9zZXRfYml0KEFMX1NVU1BFTkRFRCwgJm1kZXYtPmZsYWdzKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JbGNfdW5sb2NrKG1kZXYtPmFjdF9sb2cpOworCWRyYmRfYWxfc2hyaW5rKGRldmljZSk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCkKKwkJcyA9ICF0ZXN0X2FuZF9zZXRfYml0KEFMX1NVU1BFTkRFRCwgJmRldmljZS0+ZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCWxjX3VubG9jayhkZXZpY2UtPmFjdF9sb2cpOwogCiAJaWYgKHMpCi0JCWRldl9pbmZvKERFViwgIlN1c3BlbmRlZCBBTCB1cGRhdGVzXG4iKTsKKwkJZHJiZF9pbmZvKGRldmljZSwgIlN1c3BlbmRlZCBBTCB1cGRhdGVzXG4iKTsKIH0KIAogCkBAIC0xMjM3LDcgKzEyNTksNyBAQAogaW50IGRyYmRfYWRtX2Rpc2tfb3B0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewogCWVudW0gZHJiZF9yZXRfY29kZSByZXRjb2RlOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IGRpc2tfY29uZiAqbmV3X2Rpc2tfY29uZiwgKm9sZF9kaXNrX2NvbmY7CiAJc3RydWN0IGZpZm9fYnVmZmVyICpvbGRfcGxhbiA9IE5VTEwsICpuZXdfcGxhbiA9IE5VTEw7CiAJaW50IGVyciwgZmlmb19zaXplOwpAQCAtMTI0OCwxMSArMTI3MCwxMSBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dDsKIAotCW1kZXYgPSBhZG1fY3R4Lm1kZXY7CisJZGV2aWNlID0gYWRtX2N0eC5kZXZpY2U7CiAKIAkvKiB3ZSBhbHNvIG5lZWQgYSBkaXNrCiAJICogdG8gY2hhbmdlIHRoZSBvcHRpb25zIG9uICovCi0JaWYgKCFnZXRfbGRldihtZGV2KSkgeworCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkgewogCQlyZXRjb2RlID0gRVJSX05PX0RJU0s7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTEyNjMsOCArMTI4NSw4IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQltdXRleF9sb2NrKCZtZGV2LT50Y29ubi0+Y29uZl91cGRhdGUpOwotCW9sZF9kaXNrX2NvbmYgPSBtZGV2LT5sZGV2LT5kaXNrX2NvbmY7CisJbXV0ZXhfbG9jaygmZGV2aWNlLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOworCW9sZF9kaXNrX2NvbmYgPSBkZXZpY2UtPmxkZXYtPmRpc2tfY29uZjsKIAkqbmV3X2Rpc2tfY29uZiA9ICpvbGRfZGlza19jb25mOwogCWlmIChzaG91bGRfc2V0X2RlZmF1bHRzKGluZm8pKQogCQlzZXRfZGlza19jb25mX2RlZmF1bHRzKG5ld19kaXNrX2NvbmYpOwpAQCAtMTI3Myw2ICsxMjk1LDcgQEAKIAlpZiAoZXJyICYmIGVyciAhPSAtRU5PTVNHKSB7CiAJCXJldGNvZGUgPSBFUlJfTUFOREFUT1JZX1RBRzsKIAkJZHJiZF9tc2dfcHV0X2luZm8oZnJvbV9hdHRyc19lcnJfdG9fdHh0KGVycikpOworCQlnb3RvIGZhaWxfdW5sb2NrOwogCX0KIAogCWlmICghZXhwZWN0KG5ld19kaXNrX2NvbmYtPnJlc3luY19yYXRlID49IDEpKQpAQCAtMTI4MCwyOSArMTMwMywyOSBAQAogCiAJaWYgKG5ld19kaXNrX2NvbmYtPmFsX2V4dGVudHMgPCBEUkJEX0FMX0VYVEVOVFNfTUlOKQogCQluZXdfZGlza19jb25mLT5hbF9leHRlbnRzID0gRFJCRF9BTF9FWFRFTlRTX01JTjsKLQlpZiAobmV3X2Rpc2tfY29uZi0+YWxfZXh0ZW50cyA+IGRyYmRfYWxfZXh0ZW50c19tYXgobWRldi0+bGRldikpCi0JCW5ld19kaXNrX2NvbmYtPmFsX2V4dGVudHMgPSBkcmJkX2FsX2V4dGVudHNfbWF4KG1kZXYtPmxkZXYpOworCWlmIChuZXdfZGlza19jb25mLT5hbF9leHRlbnRzID4gZHJiZF9hbF9leHRlbnRzX21heChkZXZpY2UtPmxkZXYpKQorCQluZXdfZGlza19jb25mLT5hbF9leHRlbnRzID0gZHJiZF9hbF9leHRlbnRzX21heChkZXZpY2UtPmxkZXYpOwogCiAJaWYgKG5ld19kaXNrX2NvbmYtPmNfcGxhbl9haGVhZCA+IERSQkRfQ19QTEFOX0FIRUFEX01BWCkKIAkJbmV3X2Rpc2tfY29uZi0+Y19wbGFuX2FoZWFkID0gRFJCRF9DX1BMQU5fQUhFQURfTUFYOwogCiAJZmlmb19zaXplID0gKG5ld19kaXNrX2NvbmYtPmNfcGxhbl9haGVhZCAqIDEwICogU0xFRVBfVElNRSkgLyBIWjsKLQlpZiAoZmlmb19zaXplICE9IG1kZXYtPnJzX3BsYW5fcy0+c2l6ZSkgeworCWlmIChmaWZvX3NpemUgIT0gZGV2aWNlLT5yc19wbGFuX3MtPnNpemUpIHsKIAkJbmV3X3BsYW4gPSBmaWZvX2FsbG9jKGZpZm9fc2l6ZSk7CiAJCWlmICghbmV3X3BsYW4pIHsKLQkJCWRldl9lcnIoREVWLCAia21hbGxvYyBvZiBmaWZvX2J1ZmZlciBmYWlsZWQiKTsKKwkJCWRyYmRfZXJyKGRldmljZSwgImttYWxsb2Mgb2YgZmlmb19idWZmZXIgZmFpbGVkIik7CiAJCQlyZXRjb2RlID0gRVJSX05PTUVNOwogCQkJZ290byBmYWlsX3VubG9jazsKIAkJfQogCX0KIAotCWRyYmRfc3VzcGVuZF9pbyhtZGV2KTsKLQl3YWl0X2V2ZW50KG1kZXYtPmFsX3dhaXQsIGxjX3RyeV9sb2NrKG1kZXYtPmFjdF9sb2cpKTsKLQlkcmJkX2FsX3NocmluayhtZGV2KTsKLQllcnIgPSBkcmJkX2NoZWNrX2FsX3NpemUobWRldiwgbmV3X2Rpc2tfY29uZik7Ci0JbGNfdW5sb2NrKG1kZXYtPmFjdF9sb2cpOwotCXdha2VfdXAoJm1kZXYtPmFsX3dhaXQpOwotCWRyYmRfcmVzdW1lX2lvKG1kZXYpOworCWRyYmRfc3VzcGVuZF9pbyhkZXZpY2UpOworCXdhaXRfZXZlbnQoZGV2aWNlLT5hbF93YWl0LCBsY190cnlfbG9jayhkZXZpY2UtPmFjdF9sb2cpKTsKKwlkcmJkX2FsX3NocmluayhkZXZpY2UpOworCWVyciA9IGRyYmRfY2hlY2tfYWxfc2l6ZShkZXZpY2UsIG5ld19kaXNrX2NvbmYpOworCWxjX3VubG9jayhkZXZpY2UtPmFjdF9sb2cpOworCXdha2VfdXAoJmRldmljZS0+YWxfd2FpdCk7CisJZHJiZF9yZXN1bWVfaW8oZGV2aWNlKTsKIAogCWlmIChlcnIpIHsKIAkJcmV0Y29kZSA9IEVSUl9OT01FTTsKQEAgLTEzMTAsMTAgKzEzMzMsMTAgQEAKIAl9CiAKIAl3cml0ZV9sb2NrX2lycSgmZ2xvYmFsX3N0YXRlX2xvY2spOwotCXJldGNvZGUgPSBkcmJkX3Jlc3luY19hZnRlcl92YWxpZChtZGV2LCBuZXdfZGlza19jb25mLT5yZXN5bmNfYWZ0ZXIpOworCXJldGNvZGUgPSBkcmJkX3Jlc3luY19hZnRlcl92YWxpZChkZXZpY2UsIG5ld19kaXNrX2NvbmYtPnJlc3luY19hZnRlcik7CiAJaWYgKHJldGNvZGUgPT0gTk9fRVJST1IpIHsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKG1kZXYtPmxkZXYtPmRpc2tfY29uZiwgbmV3X2Rpc2tfY29uZik7Ci0JCWRyYmRfcmVzeW5jX2FmdGVyX2NoYW5nZWQobWRldik7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiwgbmV3X2Rpc2tfY29uZik7CisJCWRyYmRfcmVzeW5jX2FmdGVyX2NoYW5nZWQoZGV2aWNlKTsKIAl9CiAJd3JpdGVfdW5sb2NrX2lycSgmZ2xvYmFsX3N0YXRlX2xvY2spOwogCkBAIC0xMzIxLDQyICsxMzQ0LDQ2IEBACiAJCWdvdG8gZmFpbF91bmxvY2s7CiAKIAlpZiAobmV3X3BsYW4pIHsKLQkJb2xkX3BsYW4gPSBtZGV2LT5yc19wbGFuX3M7Ci0JCXJjdV9hc3NpZ25fcG9pbnRlcihtZGV2LT5yc19wbGFuX3MsIG5ld19wbGFuKTsKKwkJb2xkX3BsYW4gPSBkZXZpY2UtPnJzX3BsYW5fczsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGRldmljZS0+cnNfcGxhbl9zLCBuZXdfcGxhbik7CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCZtZGV2LT50Y29ubi0+Y29uZl91cGRhdGUpOworCW11dGV4X3VubG9jaygmZGV2aWNlLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOwogCiAJaWYgKG5ld19kaXNrX2NvbmYtPmFsX3VwZGF0ZXMpCi0JCW1kZXYtPmxkZXYtPm1kLmZsYWdzICY9IH5NREZfQUxfRElTQUJMRUQ7CisJCWRldmljZS0+bGRldi0+bWQuZmxhZ3MgJj0gfk1ERl9BTF9ESVNBQkxFRDsKIAllbHNlCi0JCW1kZXYtPmxkZXYtPm1kLmZsYWdzIHw9IE1ERl9BTF9ESVNBQkxFRDsKKwkJZGV2aWNlLT5sZGV2LT5tZC5mbGFncyB8PSBNREZfQUxfRElTQUJMRUQ7CiAKIAlpZiAobmV3X2Rpc2tfY29uZi0+bWRfZmx1c2hlcykKLQkJY2xlYXJfYml0KE1EX05PX0ZVQSwgJm1kZXYtPmZsYWdzKTsKKwkJY2xlYXJfYml0KE1EX05PX0ZVQSwgJmRldmljZS0+ZmxhZ3MpOwogCWVsc2UKLQkJc2V0X2JpdChNRF9OT19GVUEsICZtZGV2LT5mbGFncyk7CisJCXNldF9iaXQoTURfTk9fRlVBLCAmZGV2aWNlLT5mbGFncyk7CiAKLQlkcmJkX2J1bXBfd3JpdGVfb3JkZXJpbmcobWRldi0+dGNvbm4sIFdPX2JkZXZfZmx1c2gpOworCWRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLCBXT19iZGV2X2ZsdXNoKTsKIAotCWRyYmRfbWRfc3luYyhtZGV2KTsKKwlkcmJkX21kX3N5bmMoZGV2aWNlKTsKIAotCWlmIChtZGV2LT5zdGF0ZS5jb25uID49IENfQ09OTkVDVEVEKQotCQlkcmJkX3NlbmRfc3luY19wYXJhbShtZGV2KTsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID49IENfQ09OTkVDVEVEKSB7CisJCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKworCQlmb3JfZWFjaF9wZWVyX2RldmljZShwZWVyX2RldmljZSwgZGV2aWNlKQorCQkJZHJiZF9zZW5kX3N5bmNfcGFyYW0ocGVlcl9kZXZpY2UpOworCX0KIAogCXN5bmNocm9uaXplX3JjdSgpOwogCWtmcmVlKG9sZF9kaXNrX2NvbmYpOwogCWtmcmVlKG9sZF9wbGFuKTsKLQltb2RfdGltZXIoJm1kZXYtPnJlcXVlc3RfdGltZXIsIGppZmZpZXMgKyBIWik7CisJbW9kX3RpbWVyKCZkZXZpY2UtPnJlcXVlc3RfdGltZXIsIGppZmZpZXMgKyBIWik7CiAJZ290byBzdWNjZXNzOwogCiBmYWlsX3VubG9jazoKLQltdXRleF91bmxvY2soJm1kZXYtPnRjb25uLT5jb25mX3VwZGF0ZSk7CisJbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CiAgZmFpbDoKIAlrZnJlZShuZXdfZGlza19jb25mKTsKIAlrZnJlZShuZXdfcGxhbik7CiBzdWNjZXNzOgotCXB1dF9sZGV2KG1kZXYpOworCXB1dF9sZGV2KGRldmljZSk7CiAgb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKQEAgLTEzNjQsNyArMTM5MSw3IEBACiAKIGludCBkcmJkX2FkbV9hdHRhY2goc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCWludCBlcnI7CiAJZW51bSBkcmJkX3JldF9jb2RlIHJldGNvZGU7CiAJZW51bSBkZXRlcm1pbmVfZGV2X3NpemUgZGQ7CkBAIC0xMzg1LDExICsxNDEyLDExIEBACiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gZmluaXNoOwogCi0JbWRldiA9IGFkbV9jdHgubWRldjsKLQljb25uX3JlY29uZmlnX3N0YXJ0KG1kZXYtPnRjb25uKTsKKwlkZXZpY2UgPSBhZG1fY3R4LmRldmljZTsKKwljb25uX3JlY29uZmlnX3N0YXJ0KGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pOwogCiAJLyogaWYgeW91IHdhbnQgdG8gcmVjb25maWd1cmUsIHBsZWFzZSB0ZWFyIGRvd24gZmlyc3QgKi8KLQlpZiAobWRldi0+c3RhdGUuZGlzayA+IERfRElTS0xFU1MpIHsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrID4gRF9ESVNLTEVTUykgewogCQlyZXRjb2RlID0gRVJSX0RJU0tfQ09ORklHVVJFRDsKIAkJZ290byBmYWlsOwogCX0KQEAgLTEzOTcsMTcgKzE0MjQsMTcgQEAKIAkgKiBkcmJkX2xkZXZfZGVzdHJveSBpcyBkb25lIGFscmVhZHksIHdlIG1heSBlbmQgdXAgaGVyZSB2ZXJ5IGZhc3QsCiAJICogZS5nLiBpZiBzb21lb25lIGNhbGxzIGF0dGFjaCBmcm9tIHRoZSBvbi1pby1lcnJvciBoYW5kbGVyLAogCSAqIHRvIHJlYWxpemUgYSAiaG90IHNwYXJlIiBmZWF0dXJlIChub3QgdGhhdCBJJ2QgcmVjb21tZW5kIHRoYXQpICovCi0Jd2FpdF9ldmVudChtZGV2LT5taXNjX3dhaXQsICFhdG9taWNfcmVhZCgmbWRldi0+bG9jYWxfY250KSk7CisJd2FpdF9ldmVudChkZXZpY2UtPm1pc2Nfd2FpdCwgIWF0b21pY19yZWFkKCZkZXZpY2UtPmxvY2FsX2NudCkpOwogCiAJLyogbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGxlZnRvdmVyIGZyb20gcHJldmlvdXMgZm9yY2UtZGV0YWNoIGF0dGVtcHRzICovCi0JY2xlYXJfYml0KEZPUkNFX0RFVEFDSCwgJm1kZXYtPmZsYWdzKTsKLQljbGVhcl9iaXQoV0FTX0lPX0VSUk9SLCAmbWRldi0+ZmxhZ3MpOwotCWNsZWFyX2JpdChXQVNfUkVBRF9FUlJPUiwgJm1kZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoRk9SQ0VfREVUQUNILCAmZGV2aWNlLT5mbGFncyk7CisJY2xlYXJfYml0KFdBU19JT19FUlJPUiwgJmRldmljZS0+ZmxhZ3MpOworCWNsZWFyX2JpdChXQVNfUkVBRF9FUlJPUiwgJmRldmljZS0+ZmxhZ3MpOwogCiAJLyogYW5kIG5vIGxlZnRvdmVyIGZyb20gcHJldmlvdXNseSBhYm9ydGVkIHJlc3luYyBvciB2ZXJpZnksIGVpdGhlciAqLwotCW1kZXYtPnJzX3RvdGFsID0gMDsKLQltZGV2LT5yc19mYWlsZWQgPSAwOwotCWF0b21pY19zZXQoJm1kZXYtPnJzX3BlbmRpbmdfY250LCAwKTsKKwlkZXZpY2UtPnJzX3RvdGFsID0gMDsKKwlkZXZpY2UtPnJzX2ZhaWxlZCA9IDA7CisJYXRvbWljX3NldCgmZGV2aWNlLT5yc19wZW5kaW5nX2NudCwgMCk7CiAKIAkvKiBhbGxvY2F0aW9uIG5vdCBpbiB0aGUgSU8gcGF0aCwgZHJiZHNldHVwIGNvbnRleHQgKi8KIAluYmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiksIEdGUF9LRVJORUwpOwpAQCAtMTQ0NywxMyArMTQ3NCwxMyBAQAogCX0KIAogCXdyaXRlX2xvY2tfaXJxKCZnbG9iYWxfc3RhdGVfbG9jayk7Ci0JcmV0Y29kZSA9IGRyYmRfcmVzeW5jX2FmdGVyX3ZhbGlkKG1kZXYsIG5ld19kaXNrX2NvbmYtPnJlc3luY19hZnRlcik7CisJcmV0Y29kZSA9IGRyYmRfcmVzeW5jX2FmdGVyX3ZhbGlkKGRldmljZSwgbmV3X2Rpc2tfY29uZi0+cmVzeW5jX2FmdGVyKTsKIAl3cml0ZV91bmxvY2tfaXJxKCZnbG9iYWxfc3RhdGVfbG9jayk7CiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gZmFpbDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQluYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpOworCW5jID0gcmN1X2RlcmVmZXJlbmNlKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPm5ldF9jb25mKTsKIAlpZiAobmMpIHsKIAkJaWYgKG5ld19kaXNrX2NvbmYtPmZlbmNpbmcgPT0gRlBfU1RPTklUSCAmJiBuYy0+d2lyZV9wcm90b2NvbCA9PSBEUkJEX1BST1RfQSkgewogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0xNDY0LDkgKzE0OTEsOSBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJYmRldiA9IGJsa2Rldl9nZXRfYnlfcGF0aChuZXdfZGlza19jb25mLT5iYWNraW5nX2RldiwKLQkJCQkgIEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSB8IEZNT0RFX0VYQ0wsIG1kZXYpOworCQkJCSAgRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFIHwgRk1PREVfRVhDTCwgZGV2aWNlKTsKIAlpZiAoSVNfRVJSKGJkZXYpKSB7Ci0JCWRldl9lcnIoREVWLCAib3BlbihcIiVzXCIpIGZhaWxlZCB3aXRoICVsZFxuIiwgbmV3X2Rpc2tfY29uZi0+YmFja2luZ19kZXYsCisJCWRyYmRfZXJyKGRldmljZSwgIm9wZW4oXCIlc1wiKSBmYWlsZWQgd2l0aCAlbGRcbiIsIG5ld19kaXNrX2NvbmYtPmJhY2tpbmdfZGV2LAogCQkJUFRSX0VSUihiZGV2KSk7CiAJCXJldGNvZGUgPSBFUlJfT1BFTl9ESVNLOwogCQlnb3RvIGZhaWw7CkBAIC0xNDg0LDkgKzE1MTEsOSBAQAogCWJkZXYgPSBibGtkZXZfZ2V0X2J5X3BhdGgobmV3X2Rpc2tfY29uZi0+bWV0YV9kZXYsCiAJCQkJICBGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUgfCBGTU9ERV9FWENMLAogCQkJCSAgKG5ld19kaXNrX2NvbmYtPm1ldGFfZGV2X2lkeCA8IDApID8KLQkJCQkgICh2b2lkICopbWRldiA6ICh2b2lkICopZHJiZF9tX2hvbGRlcik7CisJCQkJICAodm9pZCAqKWRldmljZSA6ICh2b2lkICopZHJiZF9tX2hvbGRlcik7CiAJaWYgKElTX0VSUihiZGV2KSkgewotCQlkZXZfZXJyKERFViwgIm9wZW4oXCIlc1wiKSBmYWlsZWQgd2l0aCAlbGRcbiIsIG5ld19kaXNrX2NvbmYtPm1ldGFfZGV2LAorCQlkcmJkX2VycihkZXZpY2UsICJvcGVuKFwiJXNcIikgZmFpbGVkIHdpdGggJWxkXG4iLCBuZXdfZGlza19jb25mLT5tZXRhX2RldiwKIAkJCVBUUl9FUlIoYmRldikpOwogCQlyZXRjb2RlID0gRVJSX09QRU5fTURfRElTSzsKIAkJZ290byBmYWlsOwpAQCAtMTUxMCw3ICsxNTM3LDcgQEAKIAogCS8qIFJlYWQgb3VyIG1ldGEgZGF0YSBzdXBlciBibG9jayBlYXJseS4KIAkgKiBUaGlzIGFsc28gc2V0cyBvdGhlciBvbi1kaXNrIG9mZnNldHMuICovCi0JcmV0Y29kZSA9IGRyYmRfbWRfcmVhZChtZGV2LCBuYmMpOworCXJldGNvZGUgPSBkcmJkX21kX3JlYWQoZGV2aWNlLCBuYmMpOwogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIGZhaWw7CiAKQEAgLTE1MjAsNyArMTU0Nyw3IEBACiAJCW5ld19kaXNrX2NvbmYtPmFsX2V4dGVudHMgPSBkcmJkX2FsX2V4dGVudHNfbWF4KG5iYyk7CiAKIAlpZiAoZHJiZF9nZXRfbWF4X2NhcGFjaXR5KG5iYykgPCBuZXdfZGlza19jb25mLT5kaXNrX3NpemUpIHsKLQkJZGV2X2VycihERVYsICJtYXggY2FwYWNpdHkgJWxsdSBzbWFsbGVyIHRoYW4gZGlzayBzaXplICVsbHVcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgIm1heCBjYXBhY2l0eSAlbGx1IHNtYWxsZXIgdGhhbiBkaXNrIHNpemUgJWxsdVxuIiwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGRyYmRfZ2V0X21heF9jYXBhY2l0eShuYmMpLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgbmV3X2Rpc2tfY29uZi0+ZGlza19zaXplKTsKIAkJcmV0Y29kZSA9IEVSUl9ESVNLX1RPT19TTUFMTDsKQEAgLTE1MzgsNyArMTU2NSw3IEBACiAKIAlpZiAoZHJiZF9nZXRfY2FwYWNpdHkobmJjLT5tZF9iZGV2KSA8IG1pbl9tZF9kZXZpY2Vfc2VjdG9ycykgewogCQlyZXRjb2RlID0gRVJSX01EX0RJU0tfVE9PX1NNQUxMOwotCQlkZXZfd2FybihERVYsICJyZWZ1c2luZyBhdHRhY2g6IG1kLWRldmljZSB0b28gc21hbGwsICIKKwkJZHJiZF93YXJuKGRldmljZSwgInJlZnVzaW5nIGF0dGFjaDogbWQtZGV2aWNlIHRvbyBzbWFsbCwgIgogCQkgICAgICJhdCBsZWFzdCAlbGx1IHNlY3RvcnMgbmVlZGVkIGZvciB0aGlzIG1ldGEtZGlzayB0eXBlXG4iLAogCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG1pbl9tZF9kZXZpY2Vfc2VjdG9ycyk7CiAJCWdvdG8gZmFpbDsKQEAgLTE1NDcsNyArMTU3NCw3IEBACiAJLyogTWFrZSBzdXJlIHRoZSBuZXcgZGlzayBpcyBiaWcgZW5vdWdoCiAJICogKHdlIG1heSBjdXJyZW50bHkgYmUgUl9QUklNQVJZIHdpdGggbm8gbG9jYWwgZGlzay4uLikgKi8KIAlpZiAoZHJiZF9nZXRfbWF4X2NhcGFjaXR5KG5iYykgPAotCSAgICBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYpKSB7CisJICAgIGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KSkgewogCQlyZXRjb2RlID0gRVJSX0RJU0tfVE9PX1NNQUxMOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtMTU1NSwxNSArMTU4MiwxNSBAQAogCW5iYy0+a25vd25fc2l6ZSA9IGRyYmRfZ2V0X2NhcGFjaXR5KG5iYy0+YmFja2luZ19iZGV2KTsKIAogCWlmIChuYmMtPmtub3duX3NpemUgPiBtYXhfcG9zc2libGVfc2VjdG9ycykgewotCQlkZXZfd2FybihERVYsICI9PT4gdHJ1bmNhdGluZyB2ZXJ5IGJpZyBsb3dlciBsZXZlbCBkZXZpY2UgIgorCQlkcmJkX3dhcm4oZGV2aWNlLCAiPT0+IHRydW5jYXRpbmcgdmVyeSBiaWcgbG93ZXIgbGV2ZWwgZGV2aWNlICIKIAkJCSJ0byBjdXJyZW50bHkgbWF4aW11bSBwb3NzaWJsZSAlbGx1IHNlY3RvcnMgPD09XG4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgbWF4X3Bvc3NpYmxlX3NlY3RvcnMpOwogCQlpZiAobmV3X2Rpc2tfY29uZi0+bWV0YV9kZXZfaWR4ID49IDApCi0JCQlkZXZfd2FybihERVYsICI9PT4+IHVzaW5nIGludGVybmFsIG9yIGZsZXhpYmxlICIKKwkJCWRyYmRfd2FybihkZXZpY2UsICI9PT4+IHVzaW5nIGludGVybmFsIG9yIGZsZXhpYmxlICIKIAkJCQkgICAgICAibWV0YSBkYXRhIG1heSBoZWxwIDw8PT1cbiIpOwogCX0KIAotCWRyYmRfc3VzcGVuZF9pbyhtZGV2KTsKKwlkcmJkX3N1c3BlbmRfaW8oZGV2aWNlKTsKIAkvKiBhbHNvIHdhaXQgZm9yIHRoZSBsYXN0IGJhcnJpZXIgYWNrLiAqLwogCS8qIEZJWE1FIHNlZSBhbHNvIGh0dHBzOi8vZGFpcXVpcmkubGluYml0L2NnaS1iaW4vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE3MQogCSAqIFdlIG5lZWQgYSB3YXkgdG8gZWl0aGVyIGlnbm9yZSBiYXJyaWVyIGFja3MgZm9yIGJhcnJpZXJzIHNlbnQgYmVmb3JlIGEgZGV2aWNlCkBAIC0xNTcxLDQ1ICsxNTk4LDQ1IEBACiAJICogQXMgYmFycmllcnMgYXJlIGNvdW50ZWQgcGVyIHJlc291cmNlLAogCSAqIHdlJ2QgbmVlZCB0byBzdXNwZW5kIGlvIG9uIGFsbCBkZXZpY2VzIG9mIGEgcmVzb3VyY2UuCiAJICovCi0Jd2FpdF9ldmVudChtZGV2LT5taXNjX3dhaXQsICFhdG9taWNfcmVhZCgmbWRldi0+YXBfcGVuZGluZ19jbnQpIHx8IGRyYmRfc3VzcGVuZGVkKG1kZXYpKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+bWlzY193YWl0LCAhYXRvbWljX3JlYWQoJmRldmljZS0+YXBfcGVuZGluZ19jbnQpIHx8IGRyYmRfc3VzcGVuZGVkKGRldmljZSkpOwogCS8qIGFuZCBmb3IgYW55IG90aGVyIHByZXZpb3VzbHkgcXVldWVkIHdvcmsgKi8KLQlkcmJkX2ZsdXNoX3dvcmtxdWV1ZShtZGV2KTsKKwlkcmJkX2ZsdXNoX3dvcmtxdWV1ZSgmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmspOwogCi0JcnYgPSBfZHJiZF9yZXF1ZXN0X3N0YXRlKG1kZXYsIE5TKGRpc2ssIERfQVRUQUNISU5HKSwgQ1NfVkVSQk9TRSk7CisJcnYgPSBfZHJiZF9yZXF1ZXN0X3N0YXRlKGRldmljZSwgTlMoZGlzaywgRF9BVFRBQ0hJTkcpLCBDU19WRVJCT1NFKTsKIAlyZXRjb2RlID0gcnY7ICAvKiBGSVhNRTogVHlwZSBtaXNtYXRjaC4gKi8KLQlkcmJkX3Jlc3VtZV9pbyhtZGV2KTsKKwlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogCWlmIChydiA8IFNTX1NVQ0NFU1MpCiAJCWdvdG8gZmFpbDsKIAotCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9BVFRBQ0hJTkcpKQorCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0FUVEFDSElORykpCiAJCWdvdG8gZm9yY2VfZGlza2xlc3M7CiAKLQlpZiAoIW1kZXYtPmJpdG1hcCkgewotCQlpZiAoZHJiZF9ibV9pbml0KG1kZXYpKSB7CisJaWYgKCFkZXZpY2UtPmJpdG1hcCkgeworCQlpZiAoZHJiZF9ibV9pbml0KGRldmljZSkpIHsKIAkJCXJldGNvZGUgPSBFUlJfTk9NRU07CiAJCQlnb3RvIGZvcmNlX2Rpc2tsZXNzX2RlYzsKIAkJfQogCX0KIAotCWlmIChtZGV2LT5zdGF0ZS5jb25uIDwgQ19DT05ORUNURUQgJiYKLQkgICAgbWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkgJiYKLQkgICAgKG1kZXYtPmVkX3V1aWQgJiB+KCh1NjQpMSkpICE9IChuYmMtPm1kLnV1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSkpKSB7Ci0JCWRldl9lcnIoREVWLCAiQ2FuIG9ubHkgYXR0YWNoIHRvIGRhdGEgd2l0aCBjdXJyZW50IFVVSUQ9JTAxNmxsWFxuIiwKLQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbWRldi0+ZWRfdXVpZCk7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEICYmCisJICAgIGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkgJiYKKwkgICAgKGRldmljZS0+ZWRfdXVpZCAmIH4oKHU2NCkxKSkgIT0gKG5iYy0+bWQudXVpZFtVSV9DVVJSRU5UXSAmIH4oKHU2NCkxKSkpIHsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiQ2FuIG9ubHkgYXR0YWNoIHRvIGRhdGEgd2l0aCBjdXJyZW50IFVVSUQ9JTAxNmxsWFxuIiwKKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2aWNlLT5lZF91dWlkKTsKIAkJcmV0Y29kZSA9IEVSUl9EQVRBX05PVF9DVVJSRU5UOwogCQlnb3RvIGZvcmNlX2Rpc2tsZXNzX2RlYzsKIAl9CiAKIAkvKiBTaW5jZSB3ZSBhcmUgZGlza2xlc3MsIGZpeCB0aGUgYWN0aXZpdHkgbG9nIGZpcnN0Li4uICovCi0JaWYgKGRyYmRfY2hlY2tfYWxfc2l6ZShtZGV2LCBuZXdfZGlza19jb25mKSkgeworCWlmIChkcmJkX2NoZWNrX2FsX3NpemUoZGV2aWNlLCBuZXdfZGlza19jb25mKSkgewogCQlyZXRjb2RlID0gRVJSX05PTUVNOwogCQlnb3RvIGZvcmNlX2Rpc2tsZXNzX2RlYzsKIAl9CiAKIAkvKiBQcmV2ZW50IHNocmlua2luZyBvZiBjb25zaXN0ZW50IGRldmljZXMgISAqLwogCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhuYmMsIE1ERl9DT05TSVNURU5UKSAmJgotCSAgICBkcmJkX25ld19kZXZfc2l6ZShtZGV2LCBuYmMsIG5iYy0+ZGlza19jb25mLT5kaXNrX3NpemUsIDApIDwgbmJjLT5tZC5sYV9zaXplX3NlY3QpIHsKLQkJZGV2X3dhcm4oREVWLCAicmVmdXNpbmcgdG8gdHJ1bmNhdGUgYSBjb25zaXN0ZW50IGRldmljZVxuIik7CisJICAgIGRyYmRfbmV3X2Rldl9zaXplKGRldmljZSwgbmJjLCBuYmMtPmRpc2tfY29uZi0+ZGlza19zaXplLCAwKSA8IG5iYy0+bWQubGFfc2l6ZV9zZWN0KSB7CisJCWRyYmRfd2FybihkZXZpY2UsICJyZWZ1c2luZyB0byB0cnVuY2F0ZSBhIGNvbnNpc3RlbnQgZGV2aWNlXG4iKTsKIAkJcmV0Y29kZSA9IEVSUl9ESVNLX1RPT19TTUFMTDsKIAkJZ290byBmb3JjZV9kaXNrbGVzc19kZWM7CiAJfQpAQCAtMTYxNyw0MCArMTY0NCw0MCBAQAogCS8qIFJlc2V0IHRoZSAiYmFycmllcnMgZG9uJ3Qgd29yayIgYml0cyBoZXJlLCB0aGVuIGZvcmNlIG1ldGEgZGF0YSB0bwogCSAqIGJlIHdyaXR0ZW4sIHRvIGVuc3VyZSB3ZSBkZXRlcm1pbmUgaWYgYmFycmllcnMgYXJlIHN1cHBvcnRlZC4gKi8KIAlpZiAobmV3X2Rpc2tfY29uZi0+bWRfZmx1c2hlcykKLQkJY2xlYXJfYml0KE1EX05PX0ZVQSwgJm1kZXYtPmZsYWdzKTsKKwkJY2xlYXJfYml0KE1EX05PX0ZVQSwgJmRldmljZS0+ZmxhZ3MpOwogCWVsc2UKLQkJc2V0X2JpdChNRF9OT19GVUEsICZtZGV2LT5mbGFncyk7CisJCXNldF9iaXQoTURfTk9fRlVBLCAmZGV2aWNlLT5mbGFncyk7CiAKIAkvKiBQb2ludCBvZiBubyByZXR1cm4gcmVhY2hlZC4KIAkgKiBEZXZpY2VzIGFuZCBtZW1vcnkgYXJlIG5vIGxvbmdlciByZWxlYXNlZCBieSBlcnJvciBjbGVhbnVwIGJlbG93LgotCSAqIG5vdyBtZGV2IHRha2VzIG92ZXIgcmVzcG9uc2liaWxpdHksIGFuZCB0aGUgc3RhdGUgZW5naW5lIHNob3VsZAorCSAqIG5vdyBkZXZpY2UgdGFrZXMgb3ZlciByZXNwb25zaWJpbGl0eSwgYW5kIHRoZSBzdGF0ZSBlbmdpbmUgc2hvdWxkCiAJICogY2xlYW4gaXQgdXAgc29tZXdoZXJlLiAgKi8KLQlEX0FTU0VSVChtZGV2LT5sZGV2ID09IE5VTEwpOwotCW1kZXYtPmxkZXYgPSBuYmM7Ci0JbWRldi0+cmVzeW5jID0gcmVzeW5jX2xydTsKLQltZGV2LT5yc19wbGFuX3MgPSBuZXdfcGxhbjsKKwlEX0FTU0VSVChkZXZpY2UsIGRldmljZS0+bGRldiA9PSBOVUxMKTsKKwlkZXZpY2UtPmxkZXYgPSBuYmM7CisJZGV2aWNlLT5yZXN5bmMgPSByZXN5bmNfbHJ1OworCWRldmljZS0+cnNfcGxhbl9zID0gbmV3X3BsYW47CiAJbmJjID0gTlVMTDsKIAlyZXN5bmNfbHJ1ID0gTlVMTDsKIAluZXdfZGlza19jb25mID0gTlVMTDsKIAluZXdfcGxhbiA9IE5VTEw7CiAKLQlkcmJkX2J1bXBfd3JpdGVfb3JkZXJpbmcobWRldi0+dGNvbm4sIFdPX2JkZXZfZmx1c2gpOworCWRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLCBXT19iZGV2X2ZsdXNoKTsKIAotCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhtZGV2LT5sZGV2LCBNREZfQ1JBU0hFRF9QUklNQVJZKSkKLQkJc2V0X2JpdChDUkFTSEVEX1BSSU1BUlksICZtZGV2LT5mbGFncyk7CisJaWYgKGRyYmRfbWRfdGVzdF9mbGFnKGRldmljZS0+bGRldiwgTURGX0NSQVNIRURfUFJJTUFSWSkpCisJCXNldF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmZGV2aWNlLT5mbGFncyk7CiAJZWxzZQotCQljbGVhcl9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmbWRldi0+ZmxhZ3MpOworCQljbGVhcl9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmZGV2aWNlLT5mbGFncyk7CiAKLQlpZiAoZHJiZF9tZF90ZXN0X2ZsYWcobWRldi0+bGRldiwgTURGX1BSSU1BUllfSU5EKSAmJgotCSAgICAhKG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZICYmIG1kZXYtPnRjb25uLT5zdXNwX25vZCkpCi0JCXNldF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmbWRldi0+ZmxhZ3MpOworCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhkZXZpY2UtPmxkZXYsIE1ERl9QUklNQVJZX0lORCkgJiYKKwkgICAgIShkZXZpY2UtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZICYmIGRldmljZS0+cmVzb3VyY2UtPnN1c3Bfbm9kKSkKKwkJc2V0X2JpdChDUkFTSEVEX1BSSU1BUlksICZkZXZpY2UtPmZsYWdzKTsKIAotCW1kZXYtPnNlbmRfY250ID0gMDsKLQltZGV2LT5yZWN2X2NudCA9IDA7Ci0JbWRldi0+cmVhZF9jbnQgPSAwOwotCW1kZXYtPndyaXRfY250ID0gMDsKKwlkZXZpY2UtPnNlbmRfY250ID0gMDsKKwlkZXZpY2UtPnJlY3ZfY250ID0gMDsKKwlkZXZpY2UtPnJlYWRfY250ID0gMDsKKwlkZXZpY2UtPndyaXRfY250ID0gMDsKIAotCWRyYmRfcmVjb25zaWRlcl9tYXhfYmlvX3NpemUobWRldik7CisJZHJiZF9yZWNvbnNpZGVyX21heF9iaW9fc2l6ZShkZXZpY2UpOwogCiAJLyogSWYgSSBhbSBjdXJyZW50bHkgbm90IFJfUFJJTUFSWSwKIAkgKiBidXQgbWV0YSBkYXRhIHByaW1hcnkgaW5kaWNhdG9yIGlzIHNldCwKQEAgLTE2NjYsNTAgKzE2OTMsNTAgQEAKIAkgKiBzbyB3ZSBjYW4gYXV0b21hdGljYWxseSByZWNvdmVyIGZyb20gYSBjcmFzaCBvZiBhCiAJICogZGVncmFkZWQgYnV0IGFjdGl2ZSAiY2x1c3RlciIgYWZ0ZXIgYSBjZXJ0YWluIHRpbWVvdXQuCiAJICovCi0JY2xlYXJfYml0KFVTRV9ERUdSX1dGQ19ULCAmbWRldi0+ZmxhZ3MpOwotCWlmIChtZGV2LT5zdGF0ZS5yb2xlICE9IFJfUFJJTUFSWSAmJgotCSAgICAgZHJiZF9tZF90ZXN0X2ZsYWcobWRldi0+bGRldiwgTURGX1BSSU1BUllfSU5EKSAmJgotCSAgICAhZHJiZF9tZF90ZXN0X2ZsYWcobWRldi0+bGRldiwgTURGX0NPTk5FQ1RFRF9JTkQpKQotCQlzZXRfYml0KFVTRV9ERUdSX1dGQ19ULCAmbWRldi0+ZmxhZ3MpOworCWNsZWFyX2JpdChVU0VfREVHUl9XRkNfVCwgJmRldmljZS0+ZmxhZ3MpOworCWlmIChkZXZpY2UtPnN0YXRlLnJvbGUgIT0gUl9QUklNQVJZICYmCisJICAgICBkcmJkX21kX3Rlc3RfZmxhZyhkZXZpY2UtPmxkZXYsIE1ERl9QUklNQVJZX0lORCkgJiYKKwkgICAgIWRyYmRfbWRfdGVzdF9mbGFnKGRldmljZS0+bGRldiwgTURGX0NPTk5FQ1RFRF9JTkQpKQorCQlzZXRfYml0KFVTRV9ERUdSX1dGQ19ULCAmZGV2aWNlLT5mbGFncyk7CiAKLQlkZCA9IGRyYmRfZGV0ZXJtaW5lX2Rldl9zaXplKG1kZXYsIDAsIE5VTEwpOworCWRkID0gZHJiZF9kZXRlcm1pbmVfZGV2X3NpemUoZGV2aWNlLCAwLCBOVUxMKTsKIAlpZiAoZGQgPD0gRFNfRVJST1IpIHsKIAkJcmV0Y29kZSA9IEVSUl9OT01FTV9CSVRNQVA7CiAJCWdvdG8gZm9yY2VfZGlza2xlc3NfZGVjOwogCX0gZWxzZSBpZiAoZGQgPT0gRFNfR1JFVykKLQkJc2V0X2JpdChSRVNZTkNfQUZURVJfTkVHLCAmbWRldi0+ZmxhZ3MpOworCQlzZXRfYml0KFJFU1lOQ19BRlRFUl9ORUcsICZkZXZpY2UtPmZsYWdzKTsKIAotCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhtZGV2LT5sZGV2LCBNREZfRlVMTF9TWU5DKSB8fAotCSAgICAodGVzdF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmbWRldi0+ZmxhZ3MpICYmCi0JICAgICBkcmJkX21kX3Rlc3RfZmxhZyhtZGV2LT5sZGV2LCBNREZfQUxfRElTQUJMRUQpKSkgewotCQlkZXZfaW5mbyhERVYsICJBc3N1bWluZyB0aGF0IGFsbCBibG9ja3MgYXJlIG91dCBvZiBzeW5jICIKKwlpZiAoZHJiZF9tZF90ZXN0X2ZsYWcoZGV2aWNlLT5sZGV2LCBNREZfRlVMTF9TWU5DKSB8fAorCSAgICAodGVzdF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmZGV2aWNlLT5mbGFncykgJiYKKwkgICAgIGRyYmRfbWRfdGVzdF9mbGFnKGRldmljZS0+bGRldiwgTURGX0FMX0RJU0FCTEVEKSkpIHsKKwkJZHJiZF9pbmZvKGRldmljZSwgIkFzc3VtaW5nIHRoYXQgYWxsIGJsb2NrcyBhcmUgb3V0IG9mIHN5bmMgIgogCQkgICAgICIoYWthIEZ1bGxTeW5jKVxuIik7Ci0JCWlmIChkcmJkX2JpdG1hcF9pbyhtZGV2LCAmZHJiZF9ibWlvX3NldF9uX3dyaXRlLAorCQlpZiAoZHJiZF9iaXRtYXBfaW8oZGV2aWNlLCAmZHJiZF9ibWlvX3NldF9uX3dyaXRlLAogCQkJInNldF9uX3dyaXRlIGZyb20gYXR0YWNoaW5nIiwgQk1fTE9DS0VEX01BU0spKSB7CiAJCQlyZXRjb2RlID0gRVJSX0lPX01EX0RJU0s7CiAJCQlnb3RvIGZvcmNlX2Rpc2tsZXNzX2RlYzsKIAkJfQogCX0gZWxzZSB7Ci0JCWlmIChkcmJkX2JpdG1hcF9pbyhtZGV2LCAmZHJiZF9ibV9yZWFkLAorCQlpZiAoZHJiZF9iaXRtYXBfaW8oZGV2aWNlLCAmZHJiZF9ibV9yZWFkLAogCQkJInJlYWQgZnJvbSBhdHRhY2hpbmciLCBCTV9MT0NLRURfTUFTSykpIHsKIAkJCXJldGNvZGUgPSBFUlJfSU9fTURfRElTSzsKIAkJCWdvdG8gZm9yY2VfZGlza2xlc3NfZGVjOwogCQl9CiAJfQogCi0JaWYgKF9kcmJkX2JtX3RvdGFsX3dlaWdodChtZGV2KSA9PSBkcmJkX2JtX2JpdHMobWRldikpCi0JCWRyYmRfc3VzcGVuZF9hbChtZGV2KTsgLyogSU8gaXMgc3RpbGwgc3VzcGVuZGVkIGhlcmUuLi4gKi8KKwlpZiAoX2RyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSkgPT0gZHJiZF9ibV9iaXRzKGRldmljZSkpCisJCWRyYmRfc3VzcGVuZF9hbChkZXZpY2UpOyAvKiBJTyBpcyBzdGlsbCBzdXNwZW5kZWQgaGVyZS4uLiAqLwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlvcyA9IGRyYmRfcmVhZF9zdGF0ZShtZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJb3MgPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKTsKIAlucyA9IG9zOwogCS8qIElmIE1ERl9DT05TSVNURU5UIGlzIG5vdCBzZXQgZ28gaW50byBpbmNvbnNpc3RlbnQgc3RhdGUsCiAJICAgb3RoZXJ3aXNlIGludmVzdGlnYXRlIE1ERl9XYXNVcFRvRGF0ZS4uLgogCSAgIElmIE1ERl9XQVNfVVBfVE9fREFURSBpcyBub3Qgc2V0IGdvIGludG8gRF9PVVREQVRFRCBkaXNrIHN0YXRlLAogCSAgIG90aGVyd2lzZSBpbnRvIERfQ09OU0lTVEVOVCBzdGF0ZS4KIAkqLwotCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhtZGV2LT5sZGV2LCBNREZfQ09OU0lTVEVOVCkpIHsKLQkJaWYgKGRyYmRfbWRfdGVzdF9mbGFnKG1kZXYtPmxkZXYsIE1ERl9XQVNfVVBfVE9fREFURSkpCisJaWYgKGRyYmRfbWRfdGVzdF9mbGFnKGRldmljZS0+bGRldiwgTURGX0NPTlNJU1RFTlQpKSB7CisJCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhkZXZpY2UtPmxkZXYsIE1ERl9XQVNfVVBfVE9fREFURSkpCiAJCQlucy5kaXNrID0gRF9DT05TSVNURU5UOwogCQllbHNlCiAJCQlucy5kaXNrID0gRF9PVVREQVRFRDsKQEAgLTE3MTcsMTIgKzE3NDQsMTIgQEAKIAkJbnMuZGlzayA9IERfSU5DT05TSVNURU5UOwogCX0KIAotCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhtZGV2LT5sZGV2LCBNREZfUEVFUl9PVVRfREFURUQpKQorCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhkZXZpY2UtPmxkZXYsIE1ERl9QRUVSX09VVF9EQVRFRCkpCiAJCW5zLnBkc2sgPSBEX09VVERBVEVEOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCWlmIChucy5kaXNrID09IERfQ09OU0lTVEVOVCAmJgotCSAgICAobnMucGRzayA9PSBEX09VVERBVEVEIHx8IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5mZW5jaW5nID09IEZQX0RPTlRfQ0FSRSkpCisJICAgIChucy5wZHNrID09IERfT1VUREFURUQgfHwgcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+bGRldi0+ZGlza19jb25mKS0+ZmVuY2luZyA9PSBGUF9ET05UX0NBUkUpKQogCQlucy5kaXNrID0gRF9VUF9UT19EQVRFOwogCiAJLyogQWxsIHRlc3RzIG9uIE1ERl9QUklNQVJZX0lORCwgTURGX0NPTk5FQ1RFRF9JTkQsCkBAIC0xNzMwLDU2ICsxNzU3LDU2IEBACiAJICAgdGhpcyBwb2ludCwgYmVjYXVzZSBkcmJkX3JlcXVlc3Rfc3RhdGUoKSBtb2RpZmllcyB0aGVzZQogCSAgIGZsYWdzLiAqLwogCi0JaWYgKHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5hbF91cGRhdGVzKQotCQltZGV2LT5sZGV2LT5tZC5mbGFncyAmPSB+TURGX0FMX0RJU0FCTEVEOworCWlmIChyY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5hbF91cGRhdGVzKQorCQlkZXZpY2UtPmxkZXYtPm1kLmZsYWdzICY9IH5NREZfQUxfRElTQUJMRUQ7CiAJZWxzZQotCQltZGV2LT5sZGV2LT5tZC5mbGFncyB8PSBNREZfQUxfRElTQUJMRUQ7CisJCWRldmljZS0+bGRldi0+bWQuZmxhZ3MgfD0gTURGX0FMX0RJU0FCTEVEOwogCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkvKiBJbiBjYXNlIHdlIGFyZSBDX0NPTk5FQ1RFRCBwb3N0cG9uZSBhbnkgZGVjaXNpb24gb24gdGhlIG5ldyBkaXNrCiAJICAgc3RhdGUgYWZ0ZXIgdGhlIG5lZ290aWF0aW9uIHBoYXNlLiAqLwotCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfQ09OTkVDVEVEKSB7Ci0JCW1kZXYtPm5ld19zdGF0ZV90bXAuaSA9IG5zLmk7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX0NPTk5FQ1RFRCkgeworCQlkZXZpY2UtPm5ld19zdGF0ZV90bXAuaSA9IG5zLmk7CiAJCW5zLmkgPSBvcy5pOwogCQlucy5kaXNrID0gRF9ORUdPVElBVElORzsKIAogCQkvKiBXZSBleHBlY3QgdG8gcmVjZWl2ZSB1cC10by1kYXRlIFVVSURzIHNvb24uCiAJCSAgIFRvIGF2b2lkIGEgcmFjZSBpbiByZWNlaXZlX3N0YXRlLCBmcmVlIHBfdXVpZCB3aGlsZQogCQkgICBob2xkaW5nIHJlcV9sb2NrLiBJLmUuIGF0b21pYyB3aXRoIHRoZSBzdGF0ZSBjaGFuZ2UgKi8KLQkJa2ZyZWUobWRldi0+cF91dWlkKTsKLQkJbWRldi0+cF91dWlkID0gTlVMTDsKKwkJa2ZyZWUoZGV2aWNlLT5wX3V1aWQpOworCQlkZXZpY2UtPnBfdXVpZCA9IE5VTEw7CiAJfQogCi0JcnYgPSBfZHJiZF9zZXRfc3RhdGUobWRldiwgbnMsIENTX1ZFUkJPU0UsIE5VTEwpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlydiA9IF9kcmJkX3NldF9zdGF0ZShkZXZpY2UsIG5zLCBDU19WRVJCT1NFLCBOVUxMKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAogCWlmIChydiA8IFNTX1NVQ0NFU1MpCiAJCWdvdG8gZm9yY2VfZGlza2xlc3NfZGVjOwogCi0JbW9kX3RpbWVyKCZtZGV2LT5yZXF1ZXN0X3RpbWVyLCBqaWZmaWVzICsgSFopOworCW1vZF90aW1lcigmZGV2aWNlLT5yZXF1ZXN0X3RpbWVyLCBqaWZmaWVzICsgSFopOwogCi0JaWYgKG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKQotCQltZGV2LT5sZGV2LT5tZC51dWlkW1VJX0NVUlJFTlRdIHw9ICAodTY0KTE7CisJaWYgKGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkpCisJCWRldmljZS0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSB8PSAgKHU2NCkxOwogCWVsc2UKLQkJbWRldi0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSAmPSB+KHU2NCkxOworCQlkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0gJj0gfih1NjQpMTsKIAotCWRyYmRfbWRfbWFya19kaXJ0eShtZGV2KTsKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9tYXJrX2RpcnR5KGRldmljZSk7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAKLQlrb2JqZWN0X3VldmVudCgmZGlza190b19kZXYobWRldi0+dmRpc2spLT5rb2JqLCBLT0JKX0NIQU5HRSk7Ci0JcHV0X2xkZXYobWRldik7Ci0JY29ubl9yZWNvbmZpZ19kb25lKG1kZXYtPnRjb25uKTsKKwlrb2JqZWN0X3VldmVudCgmZGlza190b19kZXYoZGV2aWNlLT52ZGlzayktPmtvYmosIEtPQkpfQ0hBTkdFKTsKKwlwdXRfbGRldihkZXZpY2UpOworCWNvbm5fcmVjb25maWdfZG9uZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uKTsKIAlkcmJkX2FkbV9maW5pc2goaW5mbywgcmV0Y29kZSk7CiAJcmV0dXJuIDA7CiAKICBmb3JjZV9kaXNrbGVzc19kZWM6Ci0JcHV0X2xkZXYobWRldik7CisJcHV0X2xkZXYoZGV2aWNlKTsKICBmb3JjZV9kaXNrbGVzczoKLQlkcmJkX2ZvcmNlX3N0YXRlKG1kZXYsIE5TKGRpc2ssIERfRElTS0xFU1MpKTsKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9mb3JjZV9zdGF0ZShkZXZpY2UsIE5TKGRpc2ssIERfRElTS0xFU1MpKTsKKwlkcmJkX21kX3N5bmMoZGV2aWNlKTsKICBmYWlsOgotCWNvbm5fcmVjb25maWdfZG9uZShtZGV2LT50Y29ubik7CisJY29ubl9yZWNvbmZpZ19kb25lKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pOwogCWlmIChuYmMpIHsKIAkJaWYgKG5iYy0+YmFja2luZ19iZGV2KQogCQkJYmxrZGV2X3B1dChuYmMtPmJhY2tpbmdfYmRldiwKQEAgLTE3OTgsMjYgKzE4MjUsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhZG1fZGV0YWNoKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBmb3JjZSkKK3N0YXRpYyBpbnQgYWRtX2RldGFjaChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IGZvcmNlKQogewogCWVudW0gZHJiZF9zdGF0ZV9ydiByZXRjb2RlOwogCWludCByZXQ7CiAKIAlpZiAoZm9yY2UpIHsKLQkJc2V0X2JpdChGT1JDRV9ERVRBQ0gsICZtZGV2LT5mbGFncyk7Ci0JCWRyYmRfZm9yY2Vfc3RhdGUobWRldiwgTlMoZGlzaywgRF9GQUlMRUQpKTsKKwkJc2V0X2JpdChGT1JDRV9ERVRBQ0gsICZkZXZpY2UtPmZsYWdzKTsKKwkJZHJiZF9mb3JjZV9zdGF0ZShkZXZpY2UsIE5TKGRpc2ssIERfRkFJTEVEKSk7CiAJCXJldGNvZGUgPSBTU19TVUNDRVNTOwogCQlnb3RvIG91dDsKIAl9CiAKLQlkcmJkX3N1c3BlbmRfaW8obWRldik7IC8qIHNvIG5vLW9uZSBpcyBzdHVjayBpbiBkcmJkX2FsX2JlZ2luX2lvICovCi0JZHJiZF9tZF9nZXRfYnVmZmVyKG1kZXYpOyAvKiBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gaW4tZmxpZ2h0IG1ldGEtZGF0YSBJTyAqLwotCXJldGNvZGUgPSBkcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgTlMoZGlzaywgRF9GQUlMRUQpKTsKLQlkcmJkX21kX3B1dF9idWZmZXIobWRldik7CisJZHJiZF9zdXNwZW5kX2lvKGRldmljZSk7IC8qIHNvIG5vLW9uZSBpcyBzdHVjayBpbiBkcmJkX2FsX2JlZ2luX2lvICovCisJZHJiZF9tZF9nZXRfYnVmZmVyKGRldmljZSk7IC8qIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBpbi1mbGlnaHQgbWV0YS1kYXRhIElPICovCisJcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGRpc2ssIERfRkFJTEVEKSk7CisJZHJiZF9tZF9wdXRfYnVmZmVyKGRldmljZSk7CiAJLyogRF9GQUlMRUQgd2lsbCB0cmFuc2l0aW9uIHRvIERJU0tMRVNTLiAqLwotCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShtZGV2LT5taXNjX3dhaXQsCi0JCQltZGV2LT5zdGF0ZS5kaXNrICE9IERfRkFJTEVEKTsKLQlkcmJkX3Jlc3VtZV9pbyhtZGV2KTsKKwlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2aWNlLT5taXNjX3dhaXQsCisJCQlkZXZpY2UtPnN0YXRlLmRpc2sgIT0gRF9GQUlMRUQpOworCWRyYmRfcmVzdW1lX2lvKGRldmljZSk7CiAJaWYgKChpbnQpcmV0Y29kZSA9PSAoaW50KVNTX0lTX0RJU0tMRVNTKQogCQlyZXRjb2RlID0gU1NfTk9USElOR19UT19ETzsKIAlpZiAocmV0KQpAQCAtMTg1MiwyNCArMTg3OSwyNSBAQAogCQl9CiAJfQogCi0JcmV0Y29kZSA9IGFkbV9kZXRhY2goYWRtX2N0eC5tZGV2LCBwYXJtcy5mb3JjZV9kZXRhY2gpOworCXJldGNvZGUgPSBhZG1fZGV0YWNoKGFkbV9jdHguZGV2aWNlLCBwYXJtcy5mb3JjZV9kZXRhY2gpOwogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGJvb2wgY29ubl9yZXN5bmNfcnVubmluZyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitzdGF0aWMgYm9vbCBjb25uX3Jlc3luY19ydW5uaW5nKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJYm9vbCBydiA9IGZhbHNlOwogCWludCB2bnI7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKSB7Ci0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfU1lOQ19TT1VSQ0UgfHwKLQkJICAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19TWU5DX1RBUkdFVCB8fAotCQkgICAgbWRldi0+c3RhdGUuY29ubiA9PSBDX1BBVVNFRF9TWU5DX1MgfHwKLQkJICAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19QQVVTRURfU1lOQ19UKSB7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1lOQ19TT1VSQ0UgfHwKKwkJICAgIGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1NZTkNfVEFSR0VUIHx8CisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19QQVVTRURfU1lOQ19TIHx8CisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19QQVVTRURfU1lOQ19UKSB7CiAJCQlydiA9IHRydWU7CiAJCQlicmVhazsKIAkJfQpAQCAtMTg3OSwxNiArMTkwNywxNyBAQAogCXJldHVybiBydjsKIH0KIAotc3RhdGljIGJvb2wgY29ubl9vdl9ydW5uaW5nKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3N0YXRpYyBib29sIGNvbm5fb3ZfcnVubmluZyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCWJvb2wgcnYgPSBmYWxzZTsKIAlpbnQgdm5yOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikgewotCQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9TIHx8Ci0JCSAgICBtZGV2LT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpIHsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUyB8fAorCQkgICAgZGV2aWNlLT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpIHsKIAkJCXJ2ID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xODk5LDYzICsxOTI4LDY1IEBACiB9CiAKIHN0YXRpYyBlbnVtIGRyYmRfcmV0X2NvZGUKLV9jaGVja19uZXRfb3B0aW9ucyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBuZXRfY29uZiAqb2xkX2NvbmYsIHN0cnVjdCBuZXRfY29uZiAqbmV3X2NvbmYpCitfY2hlY2tfbmV0X29wdGlvbnMoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IG5ldF9jb25mICpvbGRfbmV0X2NvbmYsIHN0cnVjdCBuZXRfY29uZiAqbmV3X25ldF9jb25mKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCWludCBpOwogCi0JaWYgKG9sZF9jb25mICYmIHRjb25uLT5jc3RhdGUgPT0gQ19XRl9SRVBPUlRfUEFSQU1TICYmIHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDApIHsKLQkJaWYgKG5ld19jb25mLT53aXJlX3Byb3RvY29sICE9IG9sZF9jb25mLT53aXJlX3Byb3RvY29sKQorCWlmIChvbGRfbmV0X2NvbmYgJiYgY29ubmVjdGlvbi0+Y3N0YXRlID09IENfV0ZfUkVQT1JUX1BBUkFNUyAmJiBjb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDApIHsKKwkJaWYgKG5ld19uZXRfY29uZi0+d2lyZV9wcm90b2NvbCAhPSBvbGRfbmV0X2NvbmYtPndpcmVfcHJvdG9jb2wpCiAJCQlyZXR1cm4gRVJSX05FRURfQVBWXzEwMDsKIAotCQlpZiAobmV3X2NvbmYtPnR3b19wcmltYXJpZXMgIT0gb2xkX2NvbmYtPnR3b19wcmltYXJpZXMpCisJCWlmIChuZXdfbmV0X2NvbmYtPnR3b19wcmltYXJpZXMgIT0gb2xkX25ldF9jb25mLT50d29fcHJpbWFyaWVzKQogCQkJcmV0dXJuIEVSUl9ORUVEX0FQVl8xMDA7CiAKLQkJaWYgKHN0cmNtcChuZXdfY29uZi0+aW50ZWdyaXR5X2FsZywgb2xkX2NvbmYtPmludGVncml0eV9hbGcpKQorCQlpZiAoc3RyY21wKG5ld19uZXRfY29uZi0+aW50ZWdyaXR5X2FsZywgb2xkX25ldF9jb25mLT5pbnRlZ3JpdHlfYWxnKSkKIAkJCXJldHVybiBFUlJfTkVFRF9BUFZfMTAwOwogCX0KIAotCWlmICghbmV3X2NvbmYtPnR3b19wcmltYXJpZXMgJiYKLQkgICAgY29ubl9oaWdoZXN0X3JvbGUodGNvbm4pID09IFJfUFJJTUFSWSAmJgotCSAgICBjb25uX2hpZ2hlc3RfcGVlcih0Y29ubikgPT0gUl9QUklNQVJZKQorCWlmICghbmV3X25ldF9jb25mLT50d29fcHJpbWFyaWVzICYmCisJICAgIGNvbm5faGlnaGVzdF9yb2xlKGNvbm5lY3Rpb24pID09IFJfUFJJTUFSWSAmJgorCSAgICBjb25uX2hpZ2hlc3RfcGVlcihjb25uZWN0aW9uKSA9PSBSX1BSSU1BUlkpCiAJCXJldHVybiBFUlJfTkVFRF9BTExPV19UV09fUFJJOwogCi0JaWYgKG5ld19jb25mLT50d29fcHJpbWFyaWVzICYmCi0JICAgIChuZXdfY29uZi0+d2lyZV9wcm90b2NvbCAhPSBEUkJEX1BST1RfQykpCisJaWYgKG5ld19uZXRfY29uZi0+dHdvX3ByaW1hcmllcyAmJgorCSAgICAobmV3X25ldF9jb25mLT53aXJlX3Byb3RvY29sICE9IERSQkRfUFJPVF9DKSkKIAkJcmV0dXJuIEVSUl9OT1RfUFJPVE9fQzsKIAotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIGkpIHsKLQkJaWYgKGdldF9sZGV2KG1kZXYpKSB7Ci0JCQllbnVtIGRyYmRfZmVuY2luZ19wIGZwID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZiktPmZlbmNpbmc7Ci0JCQlwdXRfbGRldihtZGV2KTsKLQkJCWlmIChuZXdfY29uZi0+d2lyZV9wcm90b2NvbCA9PSBEUkJEX1BST1RfQSAmJiBmcCA9PSBGUF9TVE9OSVRIKQorCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgaSkgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CisJCQllbnVtIGRyYmRfZmVuY2luZ19wIGZwID0gcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+bGRldi0+ZGlza19jb25mKS0+ZmVuY2luZzsKKwkJCXB1dF9sZGV2KGRldmljZSk7CisJCQlpZiAobmV3X25ldF9jb25mLT53aXJlX3Byb3RvY29sID09IERSQkRfUFJPVF9BICYmIGZwID09IEZQX1NUT05JVEgpCiAJCQkJcmV0dXJuIEVSUl9TVE9OSVRIX0FORF9QUk9UX0E7CiAJCX0KLQkJaWYgKG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZICYmIG5ld19jb25mLT5kaXNjYXJkX215X2RhdGEpCisJCWlmIChkZXZpY2UtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZICYmIG5ld19uZXRfY29uZi0+ZGlzY2FyZF9teV9kYXRhKQogCQkJcmV0dXJuIEVSUl9ESVNDQVJEX0lNUE9TU0lCTEU7CiAJfQogCi0JaWYgKG5ld19jb25mLT5vbl9jb25nZXN0aW9uICE9IE9DX0JMT0NLICYmIG5ld19jb25mLT53aXJlX3Byb3RvY29sICE9IERSQkRfUFJPVF9BKQorCWlmIChuZXdfbmV0X2NvbmYtPm9uX2Nvbmdlc3Rpb24gIT0gT0NfQkxPQ0sgJiYgbmV3X25ldF9jb25mLT53aXJlX3Byb3RvY29sICE9IERSQkRfUFJPVF9BKQogCQlyZXR1cm4gRVJSX0NPTkdfTk9UX1BST1RPX0E7CiAKIAlyZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXRpYyBlbnVtIGRyYmRfcmV0X2NvZGUKLWNoZWNrX25ldF9vcHRpb25zKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IG5ldF9jb25mICpuZXdfY29uZikKK2NoZWNrX25ldF9vcHRpb25zKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBuZXRfY29uZiAqbmV3X25ldF9jb25mKQogewogCXN0YXRpYyBlbnVtIGRyYmRfcmV0X2NvZGUgcnY7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IGk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JcnYgPSBfY2hlY2tfbmV0X29wdGlvbnModGNvbm4sIHJjdV9kZXJlZmVyZW5jZSh0Y29ubi0+bmV0X2NvbmYpLCBuZXdfY29uZik7CisJcnYgPSBfY2hlY2tfbmV0X29wdGlvbnMoY29ubmVjdGlvbiwgcmN1X2RlcmVmZXJlbmNlKGNvbm5lY3Rpb24tPm5ldF9jb25mKSwgbmV3X25ldF9jb25mKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCS8qIHRjb25uLT52b2x1bWVzIHByb3RlY3RlZCBieSBnZW5sX2xvY2soKSBoZXJlICovCi0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgaSkgewotCQlpZiAoIW1kZXYtPmJpdG1hcCkgewotCQkJaWYoZHJiZF9ibV9pbml0KG1kZXYpKQorCS8qIGNvbm5lY3Rpb24tPnZvbHVtZXMgcHJvdGVjdGVkIGJ5IGdlbmxfbG9jaygpIGhlcmUgKi8KKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIGkpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQlpZiAoIWRldmljZS0+Yml0bWFwKSB7CisJCQlpZiAoZHJiZF9ibV9pbml0KGRldmljZSkpCiAJCQkJcmV0dXJuIEVSUl9OT01FTTsKIAkJfQogCX0KQEAgLTE5ODYsMjYgKzIwMTcsMjYgQEAKIH0KIAogc3RhdGljIGVudW0gZHJiZF9yZXRfY29kZQotYWxsb2NfY3J5cHRvKHN0cnVjdCBjcnlwdG8gKmNyeXB0bywgc3RydWN0IG5ldF9jb25mICpuZXdfY29uZikKK2FsbG9jX2NyeXB0byhzdHJ1Y3QgY3J5cHRvICpjcnlwdG8sIHN0cnVjdCBuZXRfY29uZiAqbmV3X25ldF9jb25mKQogewogCWNoYXIgaG1hY19uYW1lW0NSWVBUT19NQVhfQUxHX05BTUVdOwogCWVudW0gZHJiZF9yZXRfY29kZSBydjsKIAotCXJ2ID0gYWxsb2NfaGFzaCgmY3J5cHRvLT5jc3Vtc190Zm0sIG5ld19jb25mLT5jc3Vtc19hbGcsCisJcnYgPSBhbGxvY19oYXNoKCZjcnlwdG8tPmNzdW1zX3RmbSwgbmV3X25ldF9jb25mLT5jc3Vtc19hbGcsCiAJCSAgICAgICBFUlJfQ1NVTVNfQUxHKTsKIAlpZiAocnYgIT0gTk9fRVJST1IpCiAJCXJldHVybiBydjsKLQlydiA9IGFsbG9jX2hhc2goJmNyeXB0by0+dmVyaWZ5X3RmbSwgbmV3X2NvbmYtPnZlcmlmeV9hbGcsCisJcnYgPSBhbGxvY19oYXNoKCZjcnlwdG8tPnZlcmlmeV90Zm0sIG5ld19uZXRfY29uZi0+dmVyaWZ5X2FsZywKIAkJICAgICAgIEVSUl9WRVJJRllfQUxHKTsKIAlpZiAocnYgIT0gTk9fRVJST1IpCiAJCXJldHVybiBydjsKLQlydiA9IGFsbG9jX2hhc2goJmNyeXB0by0+aW50ZWdyaXR5X3RmbSwgbmV3X2NvbmYtPmludGVncml0eV9hbGcsCisJcnYgPSBhbGxvY19oYXNoKCZjcnlwdG8tPmludGVncml0eV90Zm0sIG5ld19uZXRfY29uZi0+aW50ZWdyaXR5X2FsZywKIAkJICAgICAgIEVSUl9JTlRFR1JJVFlfQUxHKTsKIAlpZiAocnYgIT0gTk9fRVJST1IpCiAJCXJldHVybiBydjsKLQlpZiAobmV3X2NvbmYtPmNyYW1faG1hY19hbGdbMF0gIT0gMCkgeworCWlmIChuZXdfbmV0X2NvbmYtPmNyYW1faG1hY19hbGdbMF0gIT0gMCkgewogCQlzbnByaW50ZihobWFjX25hbWUsIENSWVBUT19NQVhfQUxHX05BTUUsICJobWFjKCVzKSIsCi0JCQkgbmV3X2NvbmYtPmNyYW1faG1hY19hbGcpOworCQkJIG5ld19uZXRfY29uZi0+Y3JhbV9obWFjX2FsZyk7CiAKIAkJcnYgPSBhbGxvY19oYXNoKCZjcnlwdG8tPmNyYW1faG1hY190Zm0sIGhtYWNfbmFtZSwKIAkJCSAgICAgICBFUlJfQVVUSF9BTEcpOwpAQCAtMjAyNSw4ICsyMDU2LDggQEAKIGludCBkcmJkX2FkbV9uZXRfb3B0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewogCWVudW0gZHJiZF9yZXRfY29kZSByZXRjb2RlOwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubjsKLQlzdHJ1Y3QgbmV0X2NvbmYgKm9sZF9jb25mLCAqbmV3X2NvbmYgPSBOVUxMOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJc3RydWN0IG5ldF9jb25mICpvbGRfbmV0X2NvbmYsICpuZXdfbmV0X2NvbmYgPSBOVUxMOwogCWludCBlcnI7CiAJaW50IG92cjsgLyogb25saW5lIHZlcmlmeSBydW5uaW5nICovCiAJaW50IHJzcjsgLyogcmUtc3luYyBydW5uaW5nICovCkBAIC0yMDM4LDk4ICsyMDY5LDEwMyBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dDsKIAotCXRjb25uID0gYWRtX2N0eC50Y29ubjsKKwljb25uZWN0aW9uID0gYWRtX2N0eC5jb25uZWN0aW9uOwogCi0JbmV3X2NvbmYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0X2NvbmYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5ld19jb25mKSB7CisJbmV3X25ldF9jb25mID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5ldF9jb25mKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfbmV0X2NvbmYpIHsKIAkJcmV0Y29kZSA9IEVSUl9OT01FTTsKIAkJZ290byBvdXQ7CiAJfQogCi0JY29ubl9yZWNvbmZpZ19zdGFydCh0Y29ubik7CisJY29ubl9yZWNvbmZpZ19zdGFydChjb25uZWN0aW9uKTsKIAotCW11dGV4X2xvY2soJnRjb25uLT5kYXRhLm11dGV4KTsKLQltdXRleF9sb2NrKCZ0Y29ubi0+Y29uZl91cGRhdGUpOwotCW9sZF9jb25mID0gdGNvbm4tPm5ldF9jb25mOworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPmRhdGEubXV0ZXgpOworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CisJb2xkX25ldF9jb25mID0gY29ubmVjdGlvbi0+bmV0X2NvbmY7CiAKLQlpZiAoIW9sZF9jb25mKSB7CisJaWYgKCFvbGRfbmV0X2NvbmYpIHsKIAkJZHJiZF9tc2dfcHV0X2luZm8oIm5ldCBjb25mIG1pc3NpbmcsIHRyeSBjb25uZWN0Iik7CiAJCXJldGNvZGUgPSBFUlJfSU5WQUxJRF9SRVFVRVNUOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JKm5ld19jb25mID0gKm9sZF9jb25mOworCSpuZXdfbmV0X2NvbmYgPSAqb2xkX25ldF9jb25mOwogCWlmIChzaG91bGRfc2V0X2RlZmF1bHRzKGluZm8pKQotCQlzZXRfbmV0X2NvbmZfZGVmYXVsdHMobmV3X2NvbmYpOworCQlzZXRfbmV0X2NvbmZfZGVmYXVsdHMobmV3X25ldF9jb25mKTsKIAotCWVyciA9IG5ldF9jb25mX2Zyb21fYXR0cnNfZm9yX2NoYW5nZShuZXdfY29uZiwgaW5mbyk7CisJZXJyID0gbmV0X2NvbmZfZnJvbV9hdHRyc19mb3JfY2hhbmdlKG5ld19uZXRfY29uZiwgaW5mbyk7CiAJaWYgKGVyciAmJiBlcnIgIT0gLUVOT01TRykgewogCQlyZXRjb2RlID0gRVJSX01BTkRBVE9SWV9UQUc7CiAJCWRyYmRfbXNnX3B1dF9pbmZvKGZyb21fYXR0cnNfZXJyX3RvX3R4dChlcnIpKTsKIAkJZ290byBmYWlsOwogCX0KIAotCXJldGNvZGUgPSBjaGVja19uZXRfb3B0aW9ucyh0Y29ubiwgbmV3X2NvbmYpOworCXJldGNvZGUgPSBjaGVja19uZXRfb3B0aW9ucyhjb25uZWN0aW9uLCBuZXdfbmV0X2NvbmYpOwogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIGZhaWw7CiAKIAkvKiByZS1zeW5jIHJ1bm5pbmcgKi8KLQlyc3IgPSBjb25uX3Jlc3luY19ydW5uaW5nKHRjb25uKTsKLQlpZiAocnNyICYmIHN0cmNtcChuZXdfY29uZi0+Y3N1bXNfYWxnLCBvbGRfY29uZi0+Y3N1bXNfYWxnKSkgeworCXJzciA9IGNvbm5fcmVzeW5jX3J1bm5pbmcoY29ubmVjdGlvbik7CisJaWYgKHJzciAmJiBzdHJjbXAobmV3X25ldF9jb25mLT5jc3Vtc19hbGcsIG9sZF9uZXRfY29uZi0+Y3N1bXNfYWxnKSkgewogCQlyZXRjb2RlID0gRVJSX0NTVU1TX1JFU1lOQ19SVU5OSU5HOwogCQlnb3RvIGZhaWw7CiAJfQogCiAJLyogb25saW5lIHZlcmlmeSBydW5uaW5nICovCi0Jb3ZyID0gY29ubl9vdl9ydW5uaW5nKHRjb25uKTsKLQlpZiAob3ZyICYmIHN0cmNtcChuZXdfY29uZi0+dmVyaWZ5X2FsZywgb2xkX2NvbmYtPnZlcmlmeV9hbGcpKSB7CisJb3ZyID0gY29ubl9vdl9ydW5uaW5nKGNvbm5lY3Rpb24pOworCWlmIChvdnIgJiYgc3RyY21wKG5ld19uZXRfY29uZi0+dmVyaWZ5X2FsZywgb2xkX25ldF9jb25mLT52ZXJpZnlfYWxnKSkgewogCQlyZXRjb2RlID0gRVJSX1ZFUklGWV9SVU5OSU5HOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JcmV0Y29kZSA9IGFsbG9jX2NyeXB0bygmY3J5cHRvLCBuZXdfY29uZik7CisJcmV0Y29kZSA9IGFsbG9jX2NyeXB0bygmY3J5cHRvLCBuZXdfbmV0X2NvbmYpOwogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIGZhaWw7CiAKLQlyY3VfYXNzaWduX3BvaW50ZXIodGNvbm4tPm5ldF9jb25mLCBuZXdfY29uZik7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGNvbm5lY3Rpb24tPm5ldF9jb25mLCBuZXdfbmV0X2NvbmYpOwogCiAJaWYgKCFyc3IpIHsKLQkJY3J5cHRvX2ZyZWVfaGFzaCh0Y29ubi0+Y3N1bXNfdGZtKTsKLQkJdGNvbm4tPmNzdW1zX3RmbSA9IGNyeXB0by5jc3Vtc190Zm07CisJCWNyeXB0b19mcmVlX2hhc2goY29ubmVjdGlvbi0+Y3N1bXNfdGZtKTsKKwkJY29ubmVjdGlvbi0+Y3N1bXNfdGZtID0gY3J5cHRvLmNzdW1zX3RmbTsKIAkJY3J5cHRvLmNzdW1zX3RmbSA9IE5VTEw7CiAJfQogCWlmICghb3ZyKSB7Ci0JCWNyeXB0b19mcmVlX2hhc2godGNvbm4tPnZlcmlmeV90Zm0pOwotCQl0Y29ubi0+dmVyaWZ5X3RmbSA9IGNyeXB0by52ZXJpZnlfdGZtOworCQljcnlwdG9fZnJlZV9oYXNoKGNvbm5lY3Rpb24tPnZlcmlmeV90Zm0pOworCQljb25uZWN0aW9uLT52ZXJpZnlfdGZtID0gY3J5cHRvLnZlcmlmeV90Zm07CiAJCWNyeXB0by52ZXJpZnlfdGZtID0gTlVMTDsKIAl9CiAKLQljcnlwdG9fZnJlZV9oYXNoKHRjb25uLT5pbnRlZ3JpdHlfdGZtKTsKLQl0Y29ubi0+aW50ZWdyaXR5X3RmbSA9IGNyeXB0by5pbnRlZ3JpdHlfdGZtOwotCWlmICh0Y29ubi0+Y3N0YXRlID49IENfV0ZfUkVQT1JUX1BBUkFNUyAmJiB0Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDEwMCkKLQkJLyogRG8gdGhpcyB3aXRob3V0IHRyeWluZyB0byB0YWtlIHRjb25uLT5kYXRhLm11dGV4IGFnYWluLiAgKi8KLQkJX19kcmJkX3NlbmRfcHJvdG9jb2wodGNvbm4sIFBfUFJPVE9DT0xfVVBEQVRFKTsKKwljcnlwdG9fZnJlZV9oYXNoKGNvbm5lY3Rpb24tPmludGVncml0eV90Zm0pOworCWNvbm5lY3Rpb24tPmludGVncml0eV90Zm0gPSBjcnlwdG8uaW50ZWdyaXR5X3RmbTsKKwlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlID49IENfV0ZfUkVQT1JUX1BBUkFNUyAmJiBjb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gMTAwKQorCQkvKiBEbyB0aGlzIHdpdGhvdXQgdHJ5aW5nIHRvIHRha2UgY29ubmVjdGlvbi0+ZGF0YS5tdXRleCBhZ2Fpbi4gICovCisJCV9fZHJiZF9zZW5kX3Byb3RvY29sKGNvbm5lY3Rpb24sIFBfUFJPVE9DT0xfVVBEQVRFKTsKIAotCWNyeXB0b19mcmVlX2hhc2godGNvbm4tPmNyYW1faG1hY190Zm0pOwotCXRjb25uLT5jcmFtX2htYWNfdGZtID0gY3J5cHRvLmNyYW1faG1hY190Zm07CisJY3J5cHRvX2ZyZWVfaGFzaChjb25uZWN0aW9uLT5jcmFtX2htYWNfdGZtKTsKKwljb25uZWN0aW9uLT5jcmFtX2htYWNfdGZtID0gY3J5cHRvLmNyYW1faG1hY190Zm07CiAKLQltdXRleF91bmxvY2soJnRjb25uLT5jb25mX3VwZGF0ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZ0Y29ubi0+ZGF0YS5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOworCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+ZGF0YS5tdXRleCk7CiAJc3luY2hyb25pemVfcmN1KCk7Ci0Ja2ZyZWUob2xkX2NvbmYpOworCWtmcmVlKG9sZF9uZXRfY29uZik7CiAKLQlpZiAodGNvbm4tPmNzdGF0ZSA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpCi0JCWRyYmRfc2VuZF9zeW5jX3BhcmFtKG1pbm9yX3RvX21kZXYoY29ubl9sb3dlc3RfbWlub3IodGNvbm4pKSk7CisJaWYgKGNvbm5lY3Rpb24tPmNzdGF0ZSA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKKwkJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCQlpbnQgdm5yOworCisJCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKQorCQkJZHJiZF9zZW5kX3N5bmNfcGFyYW0ocGVlcl9kZXZpY2UpOworCX0KIAogCWdvdG8gZG9uZTsKIAogIGZhaWw6Ci0JbXV0ZXhfdW5sb2NrKCZ0Y29ubi0+Y29uZl91cGRhdGUpOwotCW11dGV4X3VubG9jaygmdGNvbm4tPmRhdGEubXV0ZXgpOworCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+cmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKKwltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPmRhdGEubXV0ZXgpOwogCWZyZWVfY3J5cHRvKCZjcnlwdG8pOwotCWtmcmVlKG5ld19jb25mKTsKKwlrZnJlZShuZXdfbmV0X2NvbmYpOwogIGRvbmU6Ci0JY29ubl9yZWNvbmZpZ19kb25lKHRjb25uKTsKKwljb25uX3JlY29uZmlnX2RvbmUoY29ubmVjdGlvbik7CiAgb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKQEAgLTIxMzcsMTAgKzIxNzMsMTEgQEAKIAogaW50IGRyYmRfYWRtX2Nvbm5lY3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OwotCXN0cnVjdCBuZXRfY29uZiAqb2xkX2NvbmYsICpuZXdfY29uZiA9IE5VTEw7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCXN0cnVjdCBuZXRfY29uZiAqb2xkX25ldF9jb25mLCAqbmV3X25ldF9jb25mID0gTlVMTDsKIAlzdHJ1Y3QgY3J5cHRvIGNyeXB0byA9IHsgfTsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm47CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CiAJZW51bSBkcmJkX3JldF9jb2RlIHJldGNvZGU7CiAJaW50IGk7CiAJaW50IGVycjsKQEAgLTIxNjAsMTA2ICsyMTk3LDExMSBAQAogCS8qIE5vIG5lZWQgZm9yIF9yY3UgaGVyZS4gQWxsIHJlY29uZmlndXJhdGlvbiBpcwogCSAqIHN0cmljdGx5IHNlcmlhbGl6ZWQgb24gZ2VubF9sb2NrKCkuIFdlIGFyZSBwcm90ZWN0ZWQgYWdhaW5zdAogCSAqIGNvbmN1cnJlbnQgcmVjb25maWd1cmF0aW9uL2FkZGl0aW9uL2RlbGV0aW9uICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0Y29ubiwgJmRyYmRfdGNvbm5zLCBhbGxfdGNvbm4pIHsKLQkJaWYgKG5sYV9sZW4oYWRtX2N0eC5teV9hZGRyKSA9PSB0Y29ubi0+bXlfYWRkcl9sZW4gJiYKLQkJICAgICFtZW1jbXAobmxhX2RhdGEoYWRtX2N0eC5teV9hZGRyKSwgJnRjb25uLT5teV9hZGRyLCB0Y29ubi0+bXlfYWRkcl9sZW4pKSB7Ci0JCQlyZXRjb2RlID0gRVJSX0xPQ0FMX0FERFI7Ci0JCQlnb3RvIG91dDsKLQkJfQorCWZvcl9lYWNoX3Jlc291cmNlKHJlc291cmNlLCAmZHJiZF9yZXNvdXJjZXMpIHsKKwkJZm9yX2VhY2hfY29ubmVjdGlvbihjb25uZWN0aW9uLCByZXNvdXJjZSkgeworCQkJaWYgKG5sYV9sZW4oYWRtX2N0eC5teV9hZGRyKSA9PSBjb25uZWN0aW9uLT5teV9hZGRyX2xlbiAmJgorCQkJICAgICFtZW1jbXAobmxhX2RhdGEoYWRtX2N0eC5teV9hZGRyKSwgJmNvbm5lY3Rpb24tPm15X2FkZHIsCisJCQkJICAgIGNvbm5lY3Rpb24tPm15X2FkZHJfbGVuKSkgeworCQkJCXJldGNvZGUgPSBFUlJfTE9DQUxfQUREUjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KIAotCQlpZiAobmxhX2xlbihhZG1fY3R4LnBlZXJfYWRkcikgPT0gdGNvbm4tPnBlZXJfYWRkcl9sZW4gJiYKLQkJICAgICFtZW1jbXAobmxhX2RhdGEoYWRtX2N0eC5wZWVyX2FkZHIpLCAmdGNvbm4tPnBlZXJfYWRkciwgdGNvbm4tPnBlZXJfYWRkcl9sZW4pKSB7Ci0JCQlyZXRjb2RlID0gRVJSX1BFRVJfQUREUjsKLQkJCWdvdG8gb3V0OworCQkJaWYgKG5sYV9sZW4oYWRtX2N0eC5wZWVyX2FkZHIpID09IGNvbm5lY3Rpb24tPnBlZXJfYWRkcl9sZW4gJiYKKwkJCSAgICAhbWVtY21wKG5sYV9kYXRhKGFkbV9jdHgucGVlcl9hZGRyKSwgJmNvbm5lY3Rpb24tPnBlZXJfYWRkciwKKwkJCQkgICAgY29ubmVjdGlvbi0+cGVlcl9hZGRyX2xlbikpIHsKKwkJCQlyZXRjb2RlID0gRVJSX1BFRVJfQUREUjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KIAkJfQogCX0KIAotCXRjb25uID0gYWRtX2N0eC50Y29ubjsKLQljb25uX3JlY29uZmlnX3N0YXJ0KHRjb25uKTsKKwljb25uZWN0aW9uID0gZmlyc3RfY29ubmVjdGlvbihhZG1fY3R4LnJlc291cmNlKTsKKwljb25uX3JlY29uZmlnX3N0YXJ0KGNvbm5lY3Rpb24pOwogCi0JaWYgKHRjb25uLT5jc3RhdGUgPiBDX1NUQU5EQUxPTkUpIHsKKwlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlID4gQ19TVEFOREFMT05FKSB7CiAJCXJldGNvZGUgPSBFUlJfTkVUX0NPTkZJR1VSRUQ7CiAJCWdvdG8gZmFpbDsKIAl9CiAKIAkvKiBhbGxvY2F0aW9uIG5vdCBpbiB0aGUgSU8gcGF0aCwgZHJiZHNldHVwIC8gbmV0bGluayBwcm9jZXNzIGNvbnRleHQgKi8KLQluZXdfY29uZiA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdfY29uZiksIEdGUF9LRVJORUwpOwotCWlmICghbmV3X2NvbmYpIHsKKwluZXdfbmV0X2NvbmYgPSBremFsbG9jKHNpemVvZigqbmV3X25ldF9jb25mKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfbmV0X2NvbmYpIHsKIAkJcmV0Y29kZSA9IEVSUl9OT01FTTsKIAkJZ290byBmYWlsOwogCX0KIAotCXNldF9uZXRfY29uZl9kZWZhdWx0cyhuZXdfY29uZik7CisJc2V0X25ldF9jb25mX2RlZmF1bHRzKG5ld19uZXRfY29uZik7CiAKLQllcnIgPSBuZXRfY29uZl9mcm9tX2F0dHJzKG5ld19jb25mLCBpbmZvKTsKKwllcnIgPSBuZXRfY29uZl9mcm9tX2F0dHJzKG5ld19uZXRfY29uZiwgaW5mbyk7CiAJaWYgKGVyciAmJiBlcnIgIT0gLUVOT01TRykgewogCQlyZXRjb2RlID0gRVJSX01BTkRBVE9SWV9UQUc7CiAJCWRyYmRfbXNnX3B1dF9pbmZvKGZyb21fYXR0cnNfZXJyX3RvX3R4dChlcnIpKTsKIAkJZ290byBmYWlsOwogCX0KIAotCXJldGNvZGUgPSBjaGVja19uZXRfb3B0aW9ucyh0Y29ubiwgbmV3X2NvbmYpOworCXJldGNvZGUgPSBjaGVja19uZXRfb3B0aW9ucyhjb25uZWN0aW9uLCBuZXdfbmV0X2NvbmYpOwogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIGZhaWw7CiAKLQlyZXRjb2RlID0gYWxsb2NfY3J5cHRvKCZjcnlwdG8sIG5ld19jb25mKTsKKwlyZXRjb2RlID0gYWxsb2NfY3J5cHRvKCZjcnlwdG8sIG5ld19uZXRfY29uZik7CiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gZmFpbDsKIAotCSgoY2hhciAqKW5ld19jb25mLT5zaGFyZWRfc2VjcmV0KVtTSEFSRURfU0VDUkVUX01BWC0xXSA9IDA7CisJKChjaGFyICopbmV3X25ldF9jb25mLT5zaGFyZWRfc2VjcmV0KVtTSEFSRURfU0VDUkVUX01BWC0xXSA9IDA7CiAKLQljb25uX2ZsdXNoX3dvcmtxdWV1ZSh0Y29ubik7CisJZHJiZF9mbHVzaF93b3JrcXVldWUoJmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrKTsKIAotCW11dGV4X2xvY2soJnRjb25uLT5jb25mX3VwZGF0ZSk7Ci0Jb2xkX2NvbmYgPSB0Y29ubi0+bmV0X2NvbmY7Ci0JaWYgKG9sZF9jb25mKSB7CisJbXV0ZXhfbG9jaygmYWRtX2N0eC5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOworCW9sZF9uZXRfY29uZiA9IGNvbm5lY3Rpb24tPm5ldF9jb25mOworCWlmIChvbGRfbmV0X2NvbmYpIHsKIAkJcmV0Y29kZSA9IEVSUl9ORVRfQ09ORklHVVJFRDsKLQkJbXV0ZXhfdW5sb2NrKCZ0Y29ubi0+Y29uZl91cGRhdGUpOworCQltdXRleF91bmxvY2soJmFkbV9jdHgucmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKIAkJZ290byBmYWlsOwogCX0KLQlyY3VfYXNzaWduX3BvaW50ZXIodGNvbm4tPm5ldF9jb25mLCBuZXdfY29uZik7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGNvbm5lY3Rpb24tPm5ldF9jb25mLCBuZXdfbmV0X2NvbmYpOwogCi0JY29ubl9mcmVlX2NyeXB0byh0Y29ubik7Ci0JdGNvbm4tPmNyYW1faG1hY190Zm0gPSBjcnlwdG8uY3JhbV9obWFjX3RmbTsKLQl0Y29ubi0+aW50ZWdyaXR5X3RmbSA9IGNyeXB0by5pbnRlZ3JpdHlfdGZtOwotCXRjb25uLT5jc3Vtc190Zm0gPSBjcnlwdG8uY3N1bXNfdGZtOwotCXRjb25uLT52ZXJpZnlfdGZtID0gY3J5cHRvLnZlcmlmeV90Zm07CisJY29ubl9mcmVlX2NyeXB0byhjb25uZWN0aW9uKTsKKwljb25uZWN0aW9uLT5jcmFtX2htYWNfdGZtID0gY3J5cHRvLmNyYW1faG1hY190Zm07CisJY29ubmVjdGlvbi0+aW50ZWdyaXR5X3RmbSA9IGNyeXB0by5pbnRlZ3JpdHlfdGZtOworCWNvbm5lY3Rpb24tPmNzdW1zX3RmbSA9IGNyeXB0by5jc3Vtc190Zm07CisJY29ubmVjdGlvbi0+dmVyaWZ5X3RmbSA9IGNyeXB0by52ZXJpZnlfdGZtOwogCi0JdGNvbm4tPm15X2FkZHJfbGVuID0gbmxhX2xlbihhZG1fY3R4Lm15X2FkZHIpOwotCW1lbWNweSgmdGNvbm4tPm15X2FkZHIsIG5sYV9kYXRhKGFkbV9jdHgubXlfYWRkciksIHRjb25uLT5teV9hZGRyX2xlbik7Ci0JdGNvbm4tPnBlZXJfYWRkcl9sZW4gPSBubGFfbGVuKGFkbV9jdHgucGVlcl9hZGRyKTsKLQltZW1jcHkoJnRjb25uLT5wZWVyX2FkZHIsIG5sYV9kYXRhKGFkbV9jdHgucGVlcl9hZGRyKSwgdGNvbm4tPnBlZXJfYWRkcl9sZW4pOworCWNvbm5lY3Rpb24tPm15X2FkZHJfbGVuID0gbmxhX2xlbihhZG1fY3R4Lm15X2FkZHIpOworCW1lbWNweSgmY29ubmVjdGlvbi0+bXlfYWRkciwgbmxhX2RhdGEoYWRtX2N0eC5teV9hZGRyKSwgY29ubmVjdGlvbi0+bXlfYWRkcl9sZW4pOworCWNvbm5lY3Rpb24tPnBlZXJfYWRkcl9sZW4gPSBubGFfbGVuKGFkbV9jdHgucGVlcl9hZGRyKTsKKwltZW1jcHkoJmNvbm5lY3Rpb24tPnBlZXJfYWRkciwgbmxhX2RhdGEoYWRtX2N0eC5wZWVyX2FkZHIpLCBjb25uZWN0aW9uLT5wZWVyX2FkZHJfbGVuKTsKIAotCW11dGV4X3VubG9jaygmdGNvbm4tPmNvbmZfdXBkYXRlKTsKKwltdXRleF91bmxvY2soJmFkbV9jdHgucmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCBpKSB7Ci0JCW1kZXYtPnNlbmRfY250ID0gMDsKLQkJbWRldi0+cmVjdl9jbnQgPSAwOworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgaSkgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCWRldmljZS0+c2VuZF9jbnQgPSAwOworCQlkZXZpY2UtPnJlY3ZfY250ID0gMDsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlyZXRjb2RlID0gY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX1VOQ09OTkVDVEVEKSwgQ1NfVkVSQk9TRSk7CisJcmV0Y29kZSA9IGNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX1VOQ09OTkVDVEVEKSwgQ1NfVkVSQk9TRSk7CiAKLQljb25uX3JlY29uZmlnX2RvbmUodGNvbm4pOworCWNvbm5fcmVjb25maWdfZG9uZShjb25uZWN0aW9uKTsKIAlkcmJkX2FkbV9maW5pc2goaW5mbywgcmV0Y29kZSk7CiAJcmV0dXJuIDA7CiAKIGZhaWw6CiAJZnJlZV9jcnlwdG8oJmNyeXB0byk7Ci0Ja2ZyZWUobmV3X2NvbmYpOworCWtmcmVlKG5ld19uZXRfY29uZik7CiAKLQljb25uX3JlY29uZmlnX2RvbmUodGNvbm4pOworCWNvbm5fcmVjb25maWdfZG9uZShjb25uZWN0aW9uKTsKIG91dDoKIAlkcmJkX2FkbV9maW5pc2goaW5mbywgcmV0Y29kZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBlbnVtIGRyYmRfc3RhdGVfcnYgY29ubl90cnlfZGlzY29ubmVjdChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGJvb2wgZm9yY2UpCitzdGF0aWMgZW51bSBkcmJkX3N0YXRlX3J2IGNvbm5fdHJ5X2Rpc2Nvbm5lY3Qoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgYm9vbCBmb3JjZSkKIHsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnY7CiAKLQlydiA9IGNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwKKwlydiA9IGNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLAogCQkJZm9yY2UgPyBDU19IQVJEIDogMCk7CiAKIAlzd2l0Y2ggKHJ2KSB7CkBAIC0yMjY5LDE4ICsyMzExLDE4IEBACiAJCXJldHVybiBTU19TVUNDRVNTOwogCWNhc2UgU1NfUFJJTUFSWV9OT1A6CiAJCS8qIE91ciBzdGF0ZSBjaGVja2luZyBjb2RlIHdhbnRzIHRvIHNlZSB0aGUgcGVlciBvdXRkYXRlZC4gKi8KLQkJcnYgPSBjb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TMihjb25uLCBDX0RJU0NPTk5FQ1RJTkcsIHBkc2ssIERfT1VUREFURUQpLCAwKTsKKwkJcnYgPSBjb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMyKGNvbm4sIENfRElTQ09OTkVDVElORywgcGRzaywgRF9PVVREQVRFRCksIDApOwogCiAJCWlmIChydiA9PSBTU19PVVREQVRFX1dPX0NPTk4pIC8qIGxvc3QgY29ubmVjdGlvbiBiZWZvcmUgZ3JhY2VmdWwgZGlzY29ubmVjdCBzdWNjZWVkZWQgKi8KLQkJCXJ2ID0gY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19WRVJCT1NFKTsKKwkJCXJ2ID0gY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX1ZFUkJPU0UpOwogCiAJCWJyZWFrOwogCWNhc2UgU1NfQ1dfRkFJTEVEX0JZX1BFRVI6CiAJCS8qIFRoZSBwZWVyIHByb2JhYmx5IHdhbnRzIHRvIHNlZSB1cyBvdXRkYXRlZC4gKi8KLQkJcnYgPSBjb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TMihjb25uLCBDX0RJU0NPTk5FQ1RJTkcsCisJCXJ2ID0gY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TMihjb25uLCBDX0RJU0NPTk5FQ1RJTkcsCiAJCQkJCQkJZGlzaywgRF9PVVREQVRFRCksIDApOwogCQlpZiAocnYgPT0gU1NfSVNfRElTS0xFU1MgfHwgcnYgPT0gU1NfTE9XRVJfVEhBTl9PVVREQVRFRCkgewotCQkJcnYgPSBjb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksCisJCQlydiA9IGNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLAogCQkJCQlDU19IQVJEKTsKIAkJfQogCQlicmVhazsKQEAgLTIyOTQsMTggKzIzMzYsMTggQEAKIAkJICogVGhlIHN0YXRlIGhhbmRsaW5nIG9ubHkgdXNlcyBkcmJkX3RocmVhZF9zdG9wX25vd2FpdCgpLAogCQkgKiB3ZSB3YW50IHRvIHJlYWxseSB3YWl0IGhlcmUgdW50aWwgdGhlIHJlY2VpdmVyIGlzIG5vIG1vcmUuCiAJCSAqLwotCQlkcmJkX3RocmVhZF9zdG9wKCZhZG1fY3R4LnRjb25uLT5yZWNlaXZlcik7CisJCWRyYmRfdGhyZWFkX3N0b3AoJmNvbm5lY3Rpb24tPnJlY2VpdmVyKTsKIAogCQkvKiBSYWNlIGJyZWFrZXIuICBUaGlzIGFkZGl0aW9uYWwgc3RhdGUgY2hhbmdlIHJlcXVlc3QgbWF5IGJlCiAJCSAqIG5lY2Vzc2FyeSwgaWYgdGhpcyB3YXMgYSBmb3JjZWQgZGlzY29ubmVjdCBkdXJpbmcgYSByZWNlaXZlcgogCQkgKiByZXN0YXJ0LiAgV2UgbWF5IGhhdmUgImtpbGxlZCIgdGhlIHJlY2VpdmVyIHRocmVhZCBqdXN0Ci0JCSAqIGFmdGVyIGRyYmRkX2luaXQoKSByZXR1cm5lZC4gIFR5cGljYWxseSwgd2Ugc2hvdWxkIGJlCisJCSAqIGFmdGVyIGRyYmRfcmVjZWl2ZXIoKSByZXR1cm5lZC4gIFR5cGljYWxseSwgd2Ugc2hvdWxkIGJlCiAJCSAqIENfU1RBTkRBTE9ORSBhbHJlYWR5LCBub3csIGFuZCB0aGlzIGJlY29tZXMgYSBuby1vcC4KIAkJICovCi0JCXJ2MiA9IGNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19TVEFOREFMT05FKSwKKwkJcnYyID0gY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfU1RBTkRBTE9ORSksCiAJCQkJQ1NfVkVSQk9TRSB8IENTX0hBUkQpOwogCQlpZiAocnYyIDwgU1NfU1VDQ0VTUykKLQkJCWNvbm5fZXJyKHRjb25uLAorCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwKIAkJCQkidW5leHBlY3RlZCBydjI9JWQgaW4gY29ubl90cnlfZGlzY29ubmVjdCgpXG4iLAogCQkJCXJ2Mik7CiAJfQpAQCAtMjMxNSw3ICsyMzU3LDcgQEAKIGludCBkcmJkX2FkbV9kaXNjb25uZWN0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGRpc2Nvbm5lY3RfcGFybXMgcGFybXM7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CiAJZW51bSBkcmJkX3N0YXRlX3J2IHJ2OwogCWVudW0gZHJiZF9yZXRfY29kZSByZXRjb2RlOwogCWludCBlcnI7CkBAIC0yMzI2LDcgKzIzNjgsNyBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIGZhaWw7CiAKLQl0Y29ubiA9IGFkbV9jdHgudGNvbm47CisJY29ubmVjdGlvbiA9IGFkbV9jdHguY29ubmVjdGlvbjsKIAltZW1zZXQoJnBhcm1zLCAwLCBzaXplb2YocGFybXMpKTsKIAlpZiAoaW5mby0+YXR0cnNbRFJCRF9OTEFfRElTQ09OTkVDVF9QQVJNU10pIHsKIAkJZXJyID0gZGlzY29ubmVjdF9wYXJtc19mcm9tX2F0dHJzKCZwYXJtcywgaW5mbyk7CkBAIC0yMzM3LDcgKzIzNzksNyBAQAogCQl9CiAJfQogCi0JcnYgPSBjb25uX3RyeV9kaXNjb25uZWN0KHRjb25uLCBwYXJtcy5mb3JjZV9kaXNjb25uZWN0KTsKKwlydiA9IGNvbm5fdHJ5X2Rpc2Nvbm5lY3QoY29ubmVjdGlvbiwgcGFybXMuZm9yY2VfZGlzY29ubmVjdCk7CiAJaWYgKHJ2IDwgU1NfU1VDQ0VTUykKIAkJcmV0Y29kZSA9IHJ2OyAgLyogRklYTUU6IFR5cGUgbWlzbWF0Y2guICovCiAJZWxzZQpAQCAtMjM0NywyNyArMjM4OSwyNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHJlc3luY19hZnRlcl9vbmxpbmVfZ3JvdyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCByZXN5bmNfYWZ0ZXJfb25saW5lX2dyb3coc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IGlhc3M7IC8qIEkgYW0gc3luYyBzb3VyY2UgKi8KIAotCWRldl9pbmZvKERFViwgIlJlc3luYyBvZiBuZXcgc3RvcmFnZSBhZnRlciBvbmxpbmUgZ3Jvd1xuIik7Ci0JaWYgKG1kZXYtPnN0YXRlLnJvbGUgIT0gbWRldi0+c3RhdGUucGVlcikKLQkJaWFzcyA9IChtZGV2LT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSk7CisJZHJiZF9pbmZvKGRldmljZSwgIlJlc3luYyBvZiBuZXcgc3RvcmFnZSBhZnRlciBvbmxpbmUgZ3Jvd1xuIik7CisJaWYgKGRldmljZS0+c3RhdGUucm9sZSAhPSBkZXZpY2UtPnN0YXRlLnBlZXIpCisJCWlhc3MgPSAoZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSk7CiAJZWxzZQotCQlpYXNzID0gdGVzdF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZtZGV2LT50Y29ubi0+ZmxhZ3MpOworCQlpYXNzID0gdGVzdF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5mbGFncyk7CiAKIAlpZiAoaWFzcykKLQkJZHJiZF9zdGFydF9yZXN5bmMobWRldiwgQ19TWU5DX1NPVVJDRSk7CisJCWRyYmRfc3RhcnRfcmVzeW5jKGRldmljZSwgQ19TWU5DX1NPVVJDRSk7CiAJZWxzZQotCQlfZHJiZF9yZXF1ZXN0X3N0YXRlKG1kZXYsIE5TKGNvbm4sIENfV0ZfU1lOQ19VVUlEKSwgQ1NfVkVSQk9TRSArIENTX1NFUklBTElaRSk7CisJCV9kcmJkX3JlcXVlc3Rfc3RhdGUoZGV2aWNlLCBOUyhjb25uLCBDX1dGX1NZTkNfVVVJRCksIENTX1ZFUkJPU0UgKyBDU19TRVJJQUxJWkUpOwogfQogCiBpbnQgZHJiZF9hZG1fcmVzaXplKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGRpc2tfY29uZiAqb2xkX2Rpc2tfY29uZiwgKm5ld19kaXNrX2NvbmYgPSBOVUxMOwogCXN0cnVjdCByZXNpemVfcGFybXMgcnM7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAllbnVtIGRyYmRfcmV0X2NvZGUgcmV0Y29kZTsKIAllbnVtIGRldGVybWluZV9kZXZfc2l6ZSBkZDsKIAlib29sIGNoYW5nZV9hbF9sYXlvdXQgPSBmYWxzZTsKQEAgLTIzODEsMTUgKzI0MjMsMTUgQEAKIAlpZiAocmV0Y29kZSAhPSBOT19FUlJPUikKIAkJZ290byBmYWlsOwogCi0JbWRldiA9IGFkbV9jdHgubWRldjsKLQlpZiAoIWdldF9sZGV2KG1kZXYpKSB7CisJZGV2aWNlID0gYWRtX2N0eC5kZXZpY2U7CisJaWYgKCFnZXRfbGRldihkZXZpY2UpKSB7CiAJCXJldGNvZGUgPSBFUlJfTk9fRElTSzsKIAkJZ290byBmYWlsOwogCX0KIAogCW1lbXNldCgmcnMsIDAsIHNpemVvZihzdHJ1Y3QgcmVzaXplX3Bhcm1zKSk7Ci0JcnMuYWxfc3RyaXBlcyA9IG1kZXYtPmxkZXYtPm1kLmFsX3N0cmlwZXM7Ci0JcnMuYWxfc3RyaXBlX3NpemUgPSBtZGV2LT5sZGV2LT5tZC5hbF9zdHJpcGVfc2l6ZV80ayAqIDQ7CisJcnMuYWxfc3RyaXBlcyA9IGRldmljZS0+bGRldi0+bWQuYWxfc3RyaXBlczsKKwlycy5hbF9zdHJpcGVfc2l6ZSA9IGRldmljZS0+bGRldi0+bWQuYWxfc3RyaXBlX3NpemVfNGsgKiA0OwogCWlmIChpbmZvLT5hdHRyc1tEUkJEX05MQV9SRVNJWkVfUEFSTVNdKSB7CiAJCWVyciA9IHJlc2l6ZV9wYXJtc19mcm9tX2F0dHJzKCZycywgaW5mbyk7CiAJCWlmIChlcnIpIHsKQEAgLTIzOTksMjQgKzI0NDEsMjQgQEAKIAkJfQogCX0KIAotCWlmIChtZGV2LT5zdGF0ZS5jb25uID4gQ19DT05ORUNURUQpIHsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID4gQ19DT05ORUNURUQpIHsKIAkJcmV0Y29kZSA9IEVSUl9SRVNJWkVfUkVTWU5DOwogCQlnb3RvIGZhaWxfbGRldjsKIAl9CiAKLQlpZiAobWRldi0+c3RhdGUucm9sZSA9PSBSX1NFQ09OREFSWSAmJgotCSAgICBtZGV2LT5zdGF0ZS5wZWVyID09IFJfU0VDT05EQVJZKSB7CisJaWYgKGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1NFQ09OREFSWSAmJgorCSAgICBkZXZpY2UtPnN0YXRlLnBlZXIgPT0gUl9TRUNPTkRBUlkpIHsKIAkJcmV0Y29kZSA9IEVSUl9OT19QUklNQVJZOwogCQlnb3RvIGZhaWxfbGRldjsKIAl9CiAKLQlpZiAocnMubm9fcmVzeW5jICYmIG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5MykgeworCWlmIChycy5ub19yZXN5bmMgJiYgZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTMpIHsKIAkJcmV0Y29kZSA9IEVSUl9ORUVEX0FQVl85MzsKIAkJZ290byBmYWlsX2xkZXY7CiAJfQogCiAJcmN1X3JlYWRfbG9jaygpOwotCXVfc2l6ZSA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5kaXNrX3NpemU7CisJdV9zaXplID0gcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+bGRldi0+ZGlza19jb25mKS0+ZGlza19zaXplOwogCXJjdV9yZWFkX3VubG9jaygpOwogCWlmICh1X3NpemUgIT0gKHNlY3Rvcl90KXJzLnJlc2l6ZV9zaXplKSB7CiAJCW5ld19kaXNrX2NvbmYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGlza19jb25mKSwgR0ZQX0tFUk5FTCk7CkBAIC0yNDI2LDggKzI0NjgsOCBAQAogCQl9CiAJfQogCi0JaWYgKG1kZXYtPmxkZXYtPm1kLmFsX3N0cmlwZXMgIT0gcnMuYWxfc3RyaXBlcyB8fAotCSAgICBtZGV2LT5sZGV2LT5tZC5hbF9zdHJpcGVfc2l6ZV80ayAhPSBycy5hbF9zdHJpcGVfc2l6ZSAvIDQpIHsKKwlpZiAoZGV2aWNlLT5sZGV2LT5tZC5hbF9zdHJpcGVzICE9IHJzLmFsX3N0cmlwZXMgfHwKKwkgICAgZGV2aWNlLT5sZGV2LT5tZC5hbF9zdHJpcGVfc2l6ZV80ayAhPSBycy5hbF9zdHJpcGVfc2l6ZSAvIDQpIHsKIAkJdTMyIGFsX3NpemVfayA9IHJzLmFsX3N0cmlwZXMgKiBycy5hbF9zdHJpcGVfc2l6ZTsKIAogCQlpZiAoYWxfc2l6ZV9rID4gKDE2ICogMTAyNCAqIDEwMjQpKSB7CkBAIC0yNDQwLDcgKzI0ODIsNyBAQAogCQkJZ290byBmYWlsX2xkZXY7CiAJCX0KIAotCQlpZiAobWRldi0+c3RhdGUuY29ubiAhPSBDX0NPTk5FQ1RFRCkgeworCQlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uICE9IENfQ09OTkVDVEVEKSB7CiAJCQlyZXRjb2RlID0gRVJSX01EX0xBWU9VVF9DT05ORUNURUQ7CiAJCQlnb3RvIGZhaWxfbGRldjsKIAkJfQpAQCAtMjQ0OCwyNCArMjQ5MCwyNCBAQAogCQljaGFuZ2VfYWxfbGF5b3V0ID0gdHJ1ZTsKIAl9CiAKLQlpZiAobWRldi0+bGRldi0+a25vd25fc2l6ZSAhPSBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT5sZGV2LT5iYWNraW5nX2JkZXYpKQotCQltZGV2LT5sZGV2LT5rbm93bl9zaXplID0gZHJiZF9nZXRfY2FwYWNpdHkobWRldi0+bGRldi0+YmFja2luZ19iZGV2KTsKKwlpZiAoZGV2aWNlLT5sZGV2LT5rbm93bl9zaXplICE9IGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+bGRldi0+YmFja2luZ19iZGV2KSkKKwkJZGV2aWNlLT5sZGV2LT5rbm93bl9zaXplID0gZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXYpOwogCiAJaWYgKG5ld19kaXNrX2NvbmYpIHsKLQkJbXV0ZXhfbG9jaygmbWRldi0+dGNvbm4tPmNvbmZfdXBkYXRlKTsKLQkJb2xkX2Rpc2tfY29uZiA9IG1kZXYtPmxkZXYtPmRpc2tfY29uZjsKKwkJbXV0ZXhfbG9jaygmZGV2aWNlLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOworCQlvbGRfZGlza19jb25mID0gZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmY7CiAJCSpuZXdfZGlza19jb25mID0gKm9sZF9kaXNrX2NvbmY7CiAJCW5ld19kaXNrX2NvbmYtPmRpc2tfc2l6ZSA9IChzZWN0b3JfdClycy5yZXNpemVfc2l6ZTsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKG1kZXYtPmxkZXYtPmRpc2tfY29uZiwgbmV3X2Rpc2tfY29uZik7Ci0JCW11dGV4X3VubG9jaygmbWRldi0+dGNvbm4tPmNvbmZfdXBkYXRlKTsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGRldmljZS0+bGRldi0+ZGlza19jb25mLCBuZXdfZGlza19jb25mKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CiAJCXN5bmNocm9uaXplX3JjdSgpOwogCQlrZnJlZShvbGRfZGlza19jb25mKTsKIAl9CiAKIAlkZHNmID0gKHJzLnJlc2l6ZV9mb3JjZSA/IEREU0ZfRk9SQ0VEIDogMCkgfCAocnMubm9fcmVzeW5jID8gRERTRl9OT19SRVNZTkMgOiAwKTsKLQlkZCA9IGRyYmRfZGV0ZXJtaW5lX2Rldl9zaXplKG1kZXYsIGRkc2YsIGNoYW5nZV9hbF9sYXlvdXQgPyAmcnMgOiBOVUxMKTsKLQlkcmJkX21kX3N5bmMobWRldik7Ci0JcHV0X2xkZXYobWRldik7CisJZGQgPSBkcmJkX2RldGVybWluZV9kZXZfc2l6ZShkZXZpY2UsIGRkc2YsIGNoYW5nZV9hbF9sYXlvdXQgPyAmcnMgOiBOVUxMKTsKKwlkcmJkX21kX3N5bmMoZGV2aWNlKTsKKwlwdXRfbGRldihkZXZpY2UpOwogCWlmIChkZCA9PSBEU19FUlJPUikgewogCQlyZXRjb2RlID0gRVJSX05PTUVNX0JJVE1BUDsKIAkJZ290byBmYWlsOwpAQCAtMjQ3NywxMiArMjUxOSwxMiBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19DT05ORUNURUQpIHsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfQ09OTkVDVEVEKSB7CiAJCWlmIChkZCA9PSBEU19HUkVXKQotCQkJc2V0X2JpdChSRVNJWkVfUEVORElORywgJm1kZXYtPmZsYWdzKTsKKwkJCXNldF9iaXQoUkVTSVpFX1BFTkRJTkcsICZkZXZpY2UtPmZsYWdzKTsKIAotCQlkcmJkX3NlbmRfdXVpZHMobWRldik7Ci0JCWRyYmRfc2VuZF9zaXplcyhtZGV2LCAxLCBkZHNmKTsKKwkJZHJiZF9zZW5kX3V1aWRzKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSkpOworCQlkcmJkX3NlbmRfc2l6ZXMoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgMSwgZGRzZik7CiAJfQogCiAgZmFpbDoKQEAgLTI0OTAsMTQgKzI1MzIsMTMgQEAKIAlyZXR1cm4gMDsKIAogIGZhaWxfbGRldjoKLQlwdXRfbGRldihtZGV2KTsKKwlwdXRfbGRldihkZXZpY2UpOwogCWdvdG8gZmFpbDsKIH0KIAogaW50IGRyYmRfYWRtX3Jlc291cmNlX29wdHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKIAllbnVtIGRyYmRfcmV0X2NvZGUgcmV0Y29kZTsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm47CiAJc3RydWN0IHJlc19vcHRzIHJlc19vcHRzOwogCWludCBlcnI7CiAKQEAgLTI1MDYsOSArMjU0Nyw4IEBACiAJCXJldHVybiByZXRjb2RlOwogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIGZhaWw7Ci0JdGNvbm4gPSBhZG1fY3R4LnRjb25uOwogCi0JcmVzX29wdHMgPSB0Y29ubi0+cmVzX29wdHM7CisJcmVzX29wdHMgPSBhZG1fY3R4LnJlc291cmNlLT5yZXNfb3B0czsKIAlpZiAoc2hvdWxkX3NldF9kZWZhdWx0cyhpbmZvKSkKIAkJc2V0X3Jlc19vcHRzX2RlZmF1bHRzKCZyZXNfb3B0cyk7CiAKQEAgLTI1MTksNyArMjU1OSw3IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQllcnIgPSBzZXRfcmVzb3VyY2Vfb3B0aW9ucyh0Y29ubiwgJnJlc19vcHRzKTsKKwllcnIgPSBzZXRfcmVzb3VyY2Vfb3B0aW9ucyhhZG1fY3R4LnJlc291cmNlLCAmcmVzX29wdHMpOwogCWlmIChlcnIpIHsKIAkJcmV0Y29kZSA9IEVSUl9JTlZBTElEX1JFUVVFU1Q7CiAJCWlmIChlcnIgPT0gLUVOT01FTSkKQEAgLTI1MzMsNyArMjU3Myw3IEBACiAKIGludCBkcmJkX2FkbV9pbnZhbGlkYXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlpbnQgcmV0Y29kZTsgLyogZW51bSBkcmJkX3JldF9jb2RlIHJzcC4gZW51bSBkcmJkX3N0YXRlX3J2ICovCiAKIAlyZXRjb2RlID0gZHJiZF9hZG1fcHJlcGFyZShza2IsIGluZm8sIERSQkRfQURNX05FRURfTUlOT1IpOwpAQCAtMjU0MiwyOSArMjU4MiwyOSBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dDsKIAotCW1kZXYgPSBhZG1fY3R4Lm1kZXY7CisJZGV2aWNlID0gYWRtX2N0eC5kZXZpY2U7CiAKIAkvKiBJZiB0aGVyZSBpcyBzdGlsbCBiaXRtYXAgSU8gcGVuZGluZywgcHJvYmFibHkgYmVjYXVzZSBvZiBhIHByZXZpb3VzCiAJICogcmVzeW5jIGp1c3QgYmVpbmcgZmluaXNoZWQsIHdhaXQgZm9yIGl0IGJlZm9yZSByZXF1ZXN0aW5nIGEgbmV3IHJlc3luYy4KIAkgKiBBbHNvIHdhaXQgZm9yIGl0J3MgYWZ0ZXJfc3RhdGVfY2goKS4gKi8KLQlkcmJkX3N1c3BlbmRfaW8obWRldik7Ci0Jd2FpdF9ldmVudChtZGV2LT5taXNjX3dhaXQsICF0ZXN0X2JpdChCSVRNQVBfSU8sICZtZGV2LT5mbGFncykpOwotCWRyYmRfZmx1c2hfd29ya3F1ZXVlKG1kZXYpOworCWRyYmRfc3VzcGVuZF9pbyhkZXZpY2UpOworCXdhaXRfZXZlbnQoZGV2aWNlLT5taXNjX3dhaXQsICF0ZXN0X2JpdChCSVRNQVBfSU8sICZkZXZpY2UtPmZsYWdzKSk7CisJZHJiZF9mbHVzaF93b3JrcXVldWUoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrKTsKIAogCS8qIElmIHdlIGhhcHBlbiB0byBiZSBDX1NUQU5EQUxPTkUgUl9TRUNPTkRBUlksIGp1c3QgY2hhbmdlIHRvCiAJICogRF9JTkNPTlNJU1RFTlQsIGFuZCBzZXQgYWxsIGJpdHMgaW4gdGhlIGJpdG1hcC4gIE90aGVyd2lzZSwKIAkgKiB0cnkgdG8gc3RhcnQgYSByZXN5bmMgaGFuZHNoYWtlIGFzIHN5bmMgdGFyZ2V0IGZvciBmdWxsIHN5bmMuCiAJICovCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19TVEFOREFMT05FICYmIG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9TRUNPTkRBUlkpIHsKLQkJcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShtZGV2LCBOUyhkaXNrLCBEX0lOQ09OU0lTVEVOVCkpOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19TVEFOREFMT05FICYmIGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1NFQ09OREFSWSkgeworCQlyZXRjb2RlID0gZHJiZF9yZXF1ZXN0X3N0YXRlKGRldmljZSwgTlMoZGlzaywgRF9JTkNPTlNJU1RFTlQpKTsKIAkJaWYgKHJldGNvZGUgPj0gU1NfU1VDQ0VTUykgewotCQkJaWYgKGRyYmRfYml0bWFwX2lvKG1kZXYsICZkcmJkX2JtaW9fc2V0X25fd3JpdGUsCisJCQlpZiAoZHJiZF9iaXRtYXBfaW8oZGV2aWNlLCAmZHJiZF9ibWlvX3NldF9uX3dyaXRlLAogCQkJCSJzZXRfbl93cml0ZSBmcm9tIGludmFsaWRhdGUiLCBCTV9MT0NLRURfTUFTSykpCiAJCQkJcmV0Y29kZSA9IEVSUl9JT19NRF9ESVNLOwogCQl9CiAJfSBlbHNlCi0JCXJldGNvZGUgPSBkcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgTlMoY29ubiwgQ19TVEFSVElOR19TWU5DX1QpKTsKLQlkcmJkX3Jlc3VtZV9pbyhtZGV2KTsKKwkJcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfU1RBUlRJTkdfU1lOQ19UKSk7CisJZHJiZF9yZXN1bWVfaW8oZGV2aWNlKTsKIAogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKQEAgLTI1ODIsMjUgKzI2MjIsMjUgQEAKIAlpZiAocmV0Y29kZSAhPSBOT19FUlJPUikKIAkJZ290byBvdXQ7CiAKLQlyZXRjb2RlID0gZHJiZF9yZXF1ZXN0X3N0YXRlKGFkbV9jdHgubWRldiwgbWFzaywgdmFsKTsKKwlyZXRjb2RlID0gZHJiZF9yZXF1ZXN0X3N0YXRlKGFkbV9jdHguZGV2aWNlLCBtYXNrLCB2YWwpOwogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkcmJkX2JtaW9fc2V0X3N1c3BfYWwoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbnQgZHJiZF9ibWlvX3NldF9zdXNwX2FsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWludCBydjsKIAotCXJ2ID0gZHJiZF9ibWlvX3NldF9uX3dyaXRlKG1kZXYpOwotCWRyYmRfc3VzcGVuZF9hbChtZGV2KTsKKwlydiA9IGRyYmRfYm1pb19zZXRfbl93cml0ZShkZXZpY2UpOworCWRyYmRfc3VzcGVuZF9hbChkZXZpY2UpOwogCXJldHVybiBydjsKIH0KIAogaW50IGRyYmRfYWRtX2ludmFsaWRhdGVfcGVlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewogCWludCByZXRjb2RlOyAvKiBkcmJkX3JldF9jb2RlLCBkcmJkX3N0YXRlX3J2ICovCi0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAogCXJldGNvZGUgPSBkcmJkX2FkbV9wcmVwYXJlKHNrYiwgaW5mbywgRFJCRF9BRE1fTkVFRF9NSU5PUik7CiAJaWYgKCFhZG1fY3R4LnJlcGx5X3NrYikKQEAgLTI2MDgsMzIgKzI2NDgsMzIgQEAKIAlpZiAocmV0Y29kZSAhPSBOT19FUlJPUikKIAkJZ290byBvdXQ7CiAKLQltZGV2ID0gYWRtX2N0eC5tZGV2OworCWRldmljZSA9IGFkbV9jdHguZGV2aWNlOwogCiAJLyogSWYgdGhlcmUgaXMgc3RpbGwgYml0bWFwIElPIHBlbmRpbmcsIHByb2JhYmx5IGJlY2F1c2Ugb2YgYSBwcmV2aW91cwogCSAqIHJlc3luYyBqdXN0IGJlaW5nIGZpbmlzaGVkLCB3YWl0IGZvciBpdCBiZWZvcmUgcmVxdWVzdGluZyBhIG5ldyByZXN5bmMuCiAJICogQWxzbyB3YWl0IGZvciBpdCdzIGFmdGVyX3N0YXRlX2NoKCkuICovCi0JZHJiZF9zdXNwZW5kX2lvKG1kZXYpOwotCXdhaXRfZXZlbnQobWRldi0+bWlzY193YWl0LCAhdGVzdF9iaXQoQklUTUFQX0lPLCAmbWRldi0+ZmxhZ3MpKTsKLQlkcmJkX2ZsdXNoX3dvcmtxdWV1ZShtZGV2KTsKKwlkcmJkX3N1c3BlbmRfaW8oZGV2aWNlKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+bWlzY193YWl0LCAhdGVzdF9iaXQoQklUTUFQX0lPLCAmZGV2aWNlLT5mbGFncykpOworCWRyYmRfZmx1c2hfd29ya3F1ZXVlKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yayk7CiAKIAkvKiBJZiB3ZSBoYXBwZW4gdG8gYmUgQ19TVEFOREFMT05FIFJfUFJJTUFSWSwganVzdCBzZXQgYWxsIGJpdHMKIAkgKiBpbiB0aGUgYml0bWFwLiAgT3RoZXJ3aXNlLCB0cnkgdG8gc3RhcnQgYSByZXN5bmMgaGFuZHNoYWtlCiAJICogYXMgc3luYyBzb3VyY2UgZm9yIGZ1bGwgc3luYy4KIAkgKi8KLQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1NUQU5EQUxPTkUgJiYgbWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkpIHsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1RBTkRBTE9ORSAmJiBkZXZpY2UtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKSB7CiAJCS8qIFRoZSBwZWVyIHdpbGwgZ2V0IGEgcmVzeW5jIHVwb24gY29ubmVjdCBhbnl3YXlzLiBKdXN0IG1ha2UgdGhhdAogCQkgICBpbnRvIGEgZnVsbCByZXN5bmMuICovCi0JCXJldGNvZGUgPSBkcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgTlMocGRzaywgRF9JTkNPTlNJU1RFTlQpKTsKKwkJcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKHBkc2ssIERfSU5DT05TSVNURU5UKSk7CiAJCWlmIChyZXRjb2RlID49IFNTX1NVQ0NFU1MpIHsKLQkJCWlmIChkcmJkX2JpdG1hcF9pbyhtZGV2LCAmZHJiZF9ibWlvX3NldF9zdXNwX2FsLAorCQkJaWYgKGRyYmRfYml0bWFwX2lvKGRldmljZSwgJmRyYmRfYm1pb19zZXRfc3VzcF9hbCwKIAkJCQkic2V0X25fd3JpdGUgZnJvbSBpbnZhbGlkYXRlX3BlZXIiLAogCQkJCUJNX0xPQ0tFRF9TRVRfQUxMT1dFRCkpCiAJCQkJcmV0Y29kZSA9IEVSUl9JT19NRF9ESVNLOwogCQl9CiAJfSBlbHNlCi0JCXJldGNvZGUgPSBkcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgTlMoY29ubiwgQ19TVEFSVElOR19TWU5DX1MpKTsKLQlkcmJkX3Jlc3VtZV9pbyhtZGV2KTsKKwkJcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfU1RBUlRJTkdfU1lOQ19TKSk7CisJZHJiZF9yZXN1bWVfaW8oZGV2aWNlKTsKIAogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKQEAgLTI2NTAsNyArMjY5MCw3IEBACiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gb3V0OwogCi0JaWYgKGRyYmRfcmVxdWVzdF9zdGF0ZShhZG1fY3R4Lm1kZXYsIE5TKHVzZXJfaXNwLCAxKSkgPT0gU1NfTk9USElOR19UT19ETykKKwlpZiAoZHJiZF9yZXF1ZXN0X3N0YXRlKGFkbV9jdHguZGV2aWNlLCBOUyh1c2VyX2lzcCwgMSkpID09IFNTX05PVEhJTkdfVE9fRE8pCiAJCXJldGNvZGUgPSBFUlJfUEFVU0VfSVNfU0VUOwogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKQEAgLTI2NjgsOCArMjcwOCw4IEBACiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gb3V0OwogCi0JaWYgKGRyYmRfcmVxdWVzdF9zdGF0ZShhZG1fY3R4Lm1kZXYsIE5TKHVzZXJfaXNwLCAwKSkgPT0gU1NfTk9USElOR19UT19ETykgewotCQlzID0gYWRtX2N0eC5tZGV2LT5zdGF0ZTsKKwlpZiAoZHJiZF9yZXF1ZXN0X3N0YXRlKGFkbV9jdHguZGV2aWNlLCBOUyh1c2VyX2lzcCwgMCkpID09IFNTX05PVEhJTkdfVE9fRE8pIHsKKwkJcyA9IGFkbV9jdHguZGV2aWNlLT5zdGF0ZTsKIAkJaWYgKHMuY29ubiA9PSBDX1BBVVNFRF9TWU5DX1MgfHwgcy5jb25uID09IENfUEFVU0VEX1NZTkNfVCkgewogCQkJcmV0Y29kZSA9IHMuYWZ0cl9pc3AgPyBFUlJfUElDX0FGVEVSX0RFUCA6CiAJCQkJICBzLnBlZXJfaXNwID8gRVJSX1BJQ19QRUVSX0RFUCA6IEVSUl9QQVVTRV9JU19DTEVBUjsKQEAgLTI2OTAsNyArMjczMCw3IEBACiAKIGludCBkcmJkX2FkbV9yZXN1bWVfaW8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCWludCByZXRjb2RlOyAvKiBlbnVtIGRyYmRfcmV0X2NvZGUgcnNwLiBlbnVtIGRyYmRfc3RhdGVfcnYgKi8KIAogCXJldGNvZGUgPSBkcmJkX2FkbV9wcmVwYXJlKHNrYiwgaW5mbywgRFJCRF9BRE1fTkVFRF9NSU5PUik7CkBAIC0yNjk5LDIwICsyNzM5LDIwIEBACiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gb3V0OwogCi0JbWRldiA9IGFkbV9jdHgubWRldjsKLQlpZiAodGVzdF9iaXQoTkVXX0NVUl9VVUlELCAmbWRldi0+ZmxhZ3MpKSB7Ci0JCWRyYmRfdXVpZF9uZXdfY3VycmVudChtZGV2KTsKLQkJY2xlYXJfYml0KE5FV19DVVJfVVVJRCwgJm1kZXYtPmZsYWdzKTsKKwlkZXZpY2UgPSBhZG1fY3R4LmRldmljZTsKKwlpZiAodGVzdF9iaXQoTkVXX0NVUl9VVUlELCAmZGV2aWNlLT5mbGFncykpIHsKKwkJZHJiZF91dWlkX25ld19jdXJyZW50KGRldmljZSk7CisJCWNsZWFyX2JpdChORVdfQ1VSX1VVSUQsICZkZXZpY2UtPmZsYWdzKTsKIAl9Ci0JZHJiZF9zdXNwZW5kX2lvKG1kZXYpOwotCXJldGNvZGUgPSBkcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgTlMzKHN1c3AsIDAsIHN1c3Bfbm9kLCAwLCBzdXNwX2ZlbiwgMCkpOworCWRyYmRfc3VzcGVuZF9pbyhkZXZpY2UpOworCXJldGNvZGUgPSBkcmJkX3JlcXVlc3Rfc3RhdGUoZGV2aWNlLCBOUzMoc3VzcCwgMCwgc3VzcF9ub2QsIDAsIHN1c3BfZmVuLCAwKSk7CiAJaWYgKHJldGNvZGUgPT0gU1NfU1VDQ0VTUykgewotCQlpZiAobWRldi0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKQotCQkJdGxfY2xlYXIobWRldi0+dGNvbm4pOwotCQlpZiAobWRldi0+c3RhdGUuZGlzayA9PSBEX0RJU0tMRVNTIHx8IG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9GQUlMRUQpCi0JCQl0bF9yZXN0YXJ0KG1kZXYtPnRjb25uLCBGQUlMX0ZST1pFTl9ESVNLX0lPKTsKKwkJaWYgKGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKQorCQkJdGxfY2xlYXIoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbik7CisJCWlmIChkZXZpY2UtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUyB8fCBkZXZpY2UtPnN0YXRlLmRpc2sgPT0gRF9GQUlMRUQpCisJCQl0bF9yZXN0YXJ0KGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24sIEZBSUxfRlJPWkVOX0RJU0tfSU8pOwogCX0KLQlkcmJkX3Jlc3VtZV9pbyhtZGV2KTsKKwlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogCiBvdXQ6CiAJZHJiZF9hZG1fZmluaXNoKGluZm8sIHJldGNvZGUpOwpAQCAtMjcyNCwyMyArMjc2NCwyOCBAQAogCXJldHVybiBkcmJkX2FkbV9zaW1wbGVfcmVxdWVzdF9zdGF0ZShza2IsIGluZm8sIE5TKGRpc2ssIERfT1VUREFURUQpKTsKIH0KIAotaW50IG5sYV9wdXRfZHJiZF9jZmdfY29udGV4dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHVuc2lnbmVkIHZucikKK3N0YXRpYyBpbnQgbmxhX3B1dF9kcmJkX2NmZ19jb250ZXh0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgIHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSwKKwkJCQkgICAgc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkgICAgc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IG5sYXR0ciAqbmxhOwogCW5sYSA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgRFJCRF9OTEFfQ0ZHX0NPTlRFWFQpOwogCWlmICghbmxhKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQlpZiAodm5yICE9IFZPTFVNRV9VTlNQRUNJRklFRCAmJgotCSAgICBubGFfcHV0X3UzMihza2IsIFRfY3R4X3ZvbHVtZSwgdm5yKSkKKwlpZiAoZGV2aWNlICYmCisJICAgIG5sYV9wdXRfdTMyKHNrYiwgVF9jdHhfdm9sdW1lLCBkZXZpY2UtPnZucikpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCWlmIChubGFfcHV0X3N0cmluZyhza2IsIFRfY3R4X3Jlc291cmNlX25hbWUsIHRjb25uLT5uYW1lKSkKKwlpZiAobmxhX3B1dF9zdHJpbmcoc2tiLCBUX2N0eF9yZXNvdXJjZV9uYW1lLCByZXNvdXJjZS0+bmFtZSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCWlmICh0Y29ubi0+bXlfYWRkcl9sZW4gJiYKLQkgICAgbmxhX3B1dChza2IsIFRfY3R4X215X2FkZHIsIHRjb25uLT5teV9hZGRyX2xlbiwgJnRjb25uLT5teV9hZGRyKSkKLQkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0JaWYgKHRjb25uLT5wZWVyX2FkZHJfbGVuICYmCi0JICAgIG5sYV9wdXQoc2tiLCBUX2N0eF9wZWVyX2FkZHIsIHRjb25uLT5wZWVyX2FkZHJfbGVuLCAmdGNvbm4tPnBlZXJfYWRkcikpCi0JCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmIChjb25uZWN0aW9uKSB7CisJCWlmIChjb25uZWN0aW9uLT5teV9hZGRyX2xlbiAmJgorCQkgICAgbmxhX3B1dChza2IsIFRfY3R4X215X2FkZHIsIGNvbm5lY3Rpb24tPm15X2FkZHJfbGVuLCAmY29ubmVjdGlvbi0+bXlfYWRkcikpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwkJaWYgKGNvbm5lY3Rpb24tPnBlZXJfYWRkcl9sZW4gJiYKKwkJICAgIG5sYV9wdXQoc2tiLCBUX2N0eF9wZWVyX2FkZHIsIGNvbm5lY3Rpb24tPnBlZXJfYWRkcl9sZW4sICZjb25uZWN0aW9uLT5wZWVyX2FkZHIpKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJfQogCW5sYV9uZXN0X2VuZChza2IsIG5sYSk7CiAJcmV0dXJuIDA7CiAKQEAgLTI3NTAsOSArMjc5NSwyMiBAQAogCXJldHVybiAtRU1TR1NJWkU7CiB9CiAKLWludCBubGFfcHV0X3N0YXR1c19pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCisvKgorICogUmV0dXJuIHRoZSBjb25uZWN0aW9uIG9mIEByZXNvdXJjZSBpZiBAcmVzb3VyY2UgaGFzIGV4YWN0bHkgb25lIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICp0aGVfb25seV9jb25uZWN0aW9uKHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjb25uZWN0aW9ucyA9ICZyZXNvdXJjZS0+Y29ubmVjdGlvbnM7CisKKwlpZiAobGlzdF9lbXB0eShjb25uZWN0aW9ucykgfHwgY29ubmVjdGlvbnMtPm5leHQtPm5leHQgIT0gY29ubmVjdGlvbnMpCisJCXJldHVybiBOVUxMOworCXJldHVybiBsaXN0X2ZpcnN0X2VudHJ5KCZyZXNvdXJjZS0+Y29ubmVjdGlvbnMsIHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24sIGNvbm5lY3Rpb25zKTsKK30KKworaW50IG5sYV9wdXRfc3RhdHVzX2luZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCWNvbnN0IHN0cnVjdCBzaWJfaW5mbyAqc2liKQogeworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSA9IGRldmljZS0+cmVzb3VyY2U7CiAJc3RydWN0IHN0YXRlX2luZm8gKnNpID0gTlVMTDsgLyogZm9yIHNpemVvZihzaS0+bWVtYmVyKTsgKi8KIAlzdHJ1Y3QgbmxhdHRyICpubGE7CiAJaW50IGdvdF9sZGV2OwpAQCAtMjc3MiwyNyArMjgzMCwyNyBAQAogCSAqIGFsd2F5cyBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVjZWl2aW5nIHByb2Nlc3MgKi8KIAlleGNsdWRlX3NlbnNpdGl2ZSA9IHNpYiB8fCAhY2FwYWJsZShDQVBfU1lTX0FETUlOKTsKIAotCWdvdF9sZGV2ID0gZ2V0X2xkZXYobWRldik7CisJZ290X2xkZXYgPSBnZXRfbGRldihkZXZpY2UpOwogCiAJLyogV2UgbmVlZCB0byBhZGQgY29ubmVjdGlvbiBuYW1lIGFuZCB2b2x1bWUgbnVtYmVyIGluZm9ybWF0aW9uIHN0aWxsLgogCSAqIE1pbm9yIG51bWJlciBpcyBpbiBkcmJkX2dlbmxtc2doZHIuICovCi0JaWYgKG5sYV9wdXRfZHJiZF9jZmdfY29udGV4dChza2IsIG1kZXYtPnRjb25uLCBtZGV2LT52bnIpKQorCWlmIChubGFfcHV0X2RyYmRfY2ZnX2NvbnRleHQoc2tiLCByZXNvdXJjZSwgdGhlX29ubHlfY29ubmVjdGlvbihyZXNvdXJjZSksIGRldmljZSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JaWYgKHJlc19vcHRzX3RvX3NrYihza2IsICZtZGV2LT50Y29ubi0+cmVzX29wdHMsIGV4Y2x1ZGVfc2Vuc2l0aXZlKSkKKwlpZiAocmVzX29wdHNfdG9fc2tiKHNrYiwgJmRldmljZS0+cmVzb3VyY2UtPnJlc19vcHRzLCBleGNsdWRlX3NlbnNpdGl2ZSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCWlmIChnb3RfbGRldikgewogCQlzdHJ1Y3QgZGlza19jb25mICpkaXNrX2NvbmY7CiAKLQkJZGlza19jb25mID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZik7CisJCWRpc2tfY29uZiA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZik7CiAJCWVyciA9IGRpc2tfY29uZl90b19za2Ioc2tiLCBkaXNrX2NvbmYsIGV4Y2x1ZGVfc2Vuc2l0aXZlKTsKIAl9CiAJaWYgKCFlcnIpIHsKIAkJc3RydWN0IG5ldF9jb25mICpuYzsKIAotCQluYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpOworCQluYyA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJCWlmIChuYykKIAkJCWVyciA9IG5ldF9jb25mX3RvX3NrYihza2IsIG5jLCBleGNsdWRlX3NlbnNpdGl2ZSk7CiAJfQpAQCAtMjgwNCwzOCArMjg2MiwzOCBAQAogCWlmICghbmxhKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlpZiAobmxhX3B1dF91MzIoc2tiLCBUX3NpYl9yZWFzb24sIHNpYiA/IHNpYi0+c2liX3JlYXNvbiA6IFNJQl9HRVRfU1RBVFVTX1JFUExZKSB8fAotCSAgICBubGFfcHV0X3UzMihza2IsIFRfY3VycmVudF9zdGF0ZSwgbWRldi0+c3RhdGUuaSkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX2VkX3V1aWQsIG1kZXYtPmVkX3V1aWQpIHx8Ci0JICAgIG5sYV9wdXRfdTY0KHNrYiwgVF9jYXBhY2l0eSwgZHJiZF9nZXRfY2FwYWNpdHkobWRldi0+dGhpc19iZGV2KSkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX3NlbmRfY250LCBtZGV2LT5zZW5kX2NudCkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX3JlY3ZfY250LCBtZGV2LT5yZWN2X2NudCkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX3JlYWRfY250LCBtZGV2LT5yZWFkX2NudCkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX3dyaXRfY250LCBtZGV2LT53cml0X2NudCkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX2FsX3dyaXRfY250LCBtZGV2LT5hbF93cml0X2NudCkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX2JtX3dyaXRfY250LCBtZGV2LT5ibV93cml0X2NudCkgfHwKLQkgICAgbmxhX3B1dF91MzIoc2tiLCBUX2FwX2Jpb19jbnQsIGF0b21pY19yZWFkKCZtZGV2LT5hcF9iaW9fY250KSkgfHwKLQkgICAgbmxhX3B1dF91MzIoc2tiLCBUX2FwX3BlbmRpbmdfY250LCBhdG9taWNfcmVhZCgmbWRldi0+YXBfcGVuZGluZ19jbnQpKSB8fAotCSAgICBubGFfcHV0X3UzMihza2IsIFRfcnNfcGVuZGluZ19jbnQsIGF0b21pY19yZWFkKCZtZGV2LT5yc19wZW5kaW5nX2NudCkpKQorCSAgICBubGFfcHV0X3UzMihza2IsIFRfY3VycmVudF9zdGF0ZSwgZGV2aWNlLT5zdGF0ZS5pKSB8fAorCSAgICBubGFfcHV0X3U2NChza2IsIFRfZWRfdXVpZCwgZGV2aWNlLT5lZF91dWlkKSB8fAorCSAgICBubGFfcHV0X3U2NChza2IsIFRfY2FwYWNpdHksIGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KSkgfHwKKwkgICAgbmxhX3B1dF91NjQoc2tiLCBUX3NlbmRfY250LCBkZXZpY2UtPnNlbmRfY250KSB8fAorCSAgICBubGFfcHV0X3U2NChza2IsIFRfcmVjdl9jbnQsIGRldmljZS0+cmVjdl9jbnQpIHx8CisJICAgIG5sYV9wdXRfdTY0KHNrYiwgVF9yZWFkX2NudCwgZGV2aWNlLT5yZWFkX2NudCkgfHwKKwkgICAgbmxhX3B1dF91NjQoc2tiLCBUX3dyaXRfY250LCBkZXZpY2UtPndyaXRfY250KSB8fAorCSAgICBubGFfcHV0X3U2NChza2IsIFRfYWxfd3JpdF9jbnQsIGRldmljZS0+YWxfd3JpdF9jbnQpIHx8CisJICAgIG5sYV9wdXRfdTY0KHNrYiwgVF9ibV93cml0X2NudCwgZGV2aWNlLT5ibV93cml0X2NudCkgfHwKKwkgICAgbmxhX3B1dF91MzIoc2tiLCBUX2FwX2Jpb19jbnQsIGF0b21pY19yZWFkKCZkZXZpY2UtPmFwX2Jpb19jbnQpKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsIFRfYXBfcGVuZGluZ19jbnQsIGF0b21pY19yZWFkKCZkZXZpY2UtPmFwX3BlbmRpbmdfY250KSkgfHwKKwkgICAgbmxhX3B1dF91MzIoc2tiLCBUX3JzX3BlbmRpbmdfY250LCBhdG9taWNfcmVhZCgmZGV2aWNlLT5yc19wZW5kaW5nX2NudCkpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCWlmIChnb3RfbGRldikgewogCQlpbnQgZXJyOwogCi0JCXNwaW5fbG9ja19pcnEoJm1kZXYtPmxkZXYtPm1kLnV1aWRfbG9jayk7Ci0JCWVyciA9IG5sYV9wdXQoc2tiLCBUX3V1aWRzLCBzaXplb2Yoc2ktPnV1aWRzKSwgbWRldi0+bGRldi0+bWQudXVpZCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+bGRldi0+bWQudXVpZF9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5sZGV2LT5tZC51dWlkX2xvY2spOworCQllcnIgPSBubGFfcHV0KHNrYiwgVF91dWlkcywgc2l6ZW9mKHNpLT51dWlkcyksIGRldmljZS0+bGRldi0+bWQudXVpZCk7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5sZGV2LT5tZC51dWlkX2xvY2spOwogCiAJCWlmIChlcnIpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAotCQlpZiAobmxhX3B1dF91MzIoc2tiLCBUX2Rpc2tfZmxhZ3MsIG1kZXYtPmxkZXYtPm1kLmZsYWdzKSB8fAotCQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX2JpdHNfdG90YWwsIGRyYmRfYm1fYml0cyhtZGV2KSkgfHwKLQkJICAgIG5sYV9wdXRfdTY0KHNrYiwgVF9iaXRzX29vcywgZHJiZF9ibV90b3RhbF93ZWlnaHQobWRldikpKQorCQlpZiAobmxhX3B1dF91MzIoc2tiLCBUX2Rpc2tfZmxhZ3MsIGRldmljZS0+bGRldi0+bWQuZmxhZ3MpIHx8CisJCSAgICBubGFfcHV0X3U2NChza2IsIFRfYml0c190b3RhbCwgZHJiZF9ibV9iaXRzKGRldmljZSkpIHx8CisJCSAgICBubGFfcHV0X3U2NChza2IsIFRfYml0c19vb3MsIGRyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSkpKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0JCWlmIChDX1NZTkNfU09VUkNFIDw9IG1kZXYtPnN0YXRlLmNvbm4gJiYKLQkJICAgIENfUEFVU0VEX1NZTkNfVCA+PSBtZGV2LT5zdGF0ZS5jb25uKSB7Ci0JCQlpZiAobmxhX3B1dF91NjQoc2tiLCBUX2JpdHNfcnNfdG90YWwsIG1kZXYtPnJzX3RvdGFsKSB8fAotCQkJICAgIG5sYV9wdXRfdTY0KHNrYiwgVF9iaXRzX3JzX2ZhaWxlZCwgbWRldi0+cnNfZmFpbGVkKSkKKwkJaWYgKENfU1lOQ19TT1VSQ0UgPD0gZGV2aWNlLT5zdGF0ZS5jb25uICYmCisJCSAgICBDX1BBVVNFRF9TWU5DX1QgPj0gZGV2aWNlLT5zdGF0ZS5jb25uKSB7CisJCQlpZiAobmxhX3B1dF91NjQoc2tiLCBUX2JpdHNfcnNfdG90YWwsIGRldmljZS0+cnNfdG90YWwpIHx8CisJCQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX2JpdHNfcnNfZmFpbGVkLCBkZXZpY2UtPnJzX2ZhaWxlZCkpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCX0KIAl9CkBAIC0yODY3LDcgKzI5MjUsNyBAQAogbmxhX3B1dF9mYWlsdXJlOgogCQllcnIgPSAtRU1TR1NJWkU7CiAJaWYgKGdvdF9sZGV2KQotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yODgyLDcgKzI5NDAsNyBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dDsKIAotCWVyciA9IG5sYV9wdXRfc3RhdHVzX2luZm8oYWRtX2N0eC5yZXBseV9za2IsIGFkbV9jdHgubWRldiwgTlVMTCk7CisJZXJyID0gbmxhX3B1dF9zdGF0dXNfaW5mbyhhZG1fY3R4LnJlcGx5X3NrYiwgYWRtX2N0eC5kZXZpY2UsIE5VTEwpOwogCWlmIChlcnIpIHsKIAkJbmxtc2dfZnJlZShhZG1fY3R4LnJlcGx5X3NrYik7CiAJCXJldHVybiBlcnI7CkBAIC0yODkyLDIyICsyOTUwLDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBnZXRfb25lX3N0YXR1cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCitzdGF0aWMgaW50IGdldF9vbmVfc3RhdHVzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBkcmJkX2dlbmxtc2doZHIgKmRoOwotCXN0cnVjdCBkcmJkX3Rjb25uICpwb3MgPSAoc3RydWN0IGRyYmRfdGNvbm4qKWNiLT5hcmdzWzBdOwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IE5VTEw7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRtcDsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcG9zID0gKHN0cnVjdCBkcmJkX3Jlc291cmNlICopY2ItPmFyZ3NbMF07CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlID0gTlVMTDsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqdG1wOwogCXVuc2lnbmVkIHZvbHVtZSA9IGNiLT5hcmdzWzFdOwogCiAJLyogT3BlbiBjb2RlZCwgZGVmZXJyZWQsIGl0ZXJhdGlvbjoKLQkgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGNvbm4sIHRtcCwgJmRyYmRfdGNvbm5zLCBhbGxfdGNvbm4pIHsKLQkgKglpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCBpKSB7CisJICogZm9yX2VhY2hfcmVzb3VyY2Vfc2FmZShyZXNvdXJjZSwgdG1wLCAmZHJiZF9yZXNvdXJjZXMpIHsKKwkgKiAgICAgIGNvbm5lY3Rpb24gPSAiZmlyc3QgY29ubmVjdGlvbiBvZiByZXNvdXJjZSBvciB1bmRlZmluZWQiOworCSAqCWlkcl9mb3JfZWFjaF9lbnRyeSgmcmVzb3VyY2UtPmRldmljZXMsIGRldmljZSwgaSkgewogCSAqCSAgLi4uCiAJICoJfQogCSAqIH0KLQkgKiB3aGVyZSB0Y29ubiBpcyBjYi0+YXJnc1swXTsKKwkgKiB3aGVyZSByZXNvdXJjZSBpcyBjYi0+YXJnc1swXTsKIAkgKiBhbmQgaSBpcyBjYi0+YXJnc1sxXTsKIAkgKgogCSAqIGNiLT5hcmdzWzJdIGluZGljYXRlcyBpZiB3ZSBzaGFsbCBsb29wIG92ZXIgYWxsIHJlc291cmNlcywKQEAgLTI5MTYsNDQgKzI5NzUsNDQgQEAKIAkgKiBUaGlzIG1heSBtaXNzIGVudHJpZXMgaW5zZXJ0ZWQgYWZ0ZXIgdGhpcyBkdW1wIHN0YXJ0ZWQsCiAJICogb3IgZW50cmllcyBkZWxldGVkIGJlZm9yZSB0aGV5IGFyZSByZWFjaGVkLgogCSAqCi0JICogV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIG1kZXYgd29uJ3QgZGlzYXBwZWFyIHdoaWxlCisJICogV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGRldmljZSB3b24ndCBkaXNhcHBlYXIgd2hpbGUKIAkgKiB3ZSBhcmUgbG9va2luZyBhdCBpdCwgYW5kIHJldmFsaWRhdGUgb3VyIGl0ZXJhdG9ycwogCSAqIG9uIGVhY2ggaXRlcmF0aW9uLgogCSAqLwogCi0JLyogc3luY2hyb25pemUgd2l0aCBjb25uX2NyZWF0ZSgpL2Nvbm5fZGVzdHJveSgpICovCisJLyogc3luY2hyb25pemUgd2l0aCBjb25uX2NyZWF0ZSgpL2RyYmRfZGVzdHJveV9jb25uZWN0aW9uKCkgKi8KIAlyY3VfcmVhZF9sb2NrKCk7CiAJLyogcmV2YWxpZGF0ZSBpdGVyYXRvciBwb3NpdGlvbiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHRtcCwgJmRyYmRfdGNvbm5zLCBhbGxfdGNvbm4pIHsKKwlmb3JfZWFjaF9yZXNvdXJjZV9yY3UodG1wLCAmZHJiZF9yZXNvdXJjZXMpIHsKIAkJaWYgKHBvcyA9PSBOVUxMKSB7CiAJCQkvKiBmaXJzdCBpdGVyYXRpb24gKi8KIAkJCXBvcyA9IHRtcDsKLQkJCXRjb25uID0gcG9zOworCQkJcmVzb3VyY2UgPSBwb3M7CiAJCQlicmVhazsKIAkJfQogCQlpZiAodG1wID09IHBvcykgewotCQkJdGNvbm4gPSBwb3M7CisJCQlyZXNvdXJjZSA9IHBvczsKIAkJCWJyZWFrOwogCQl9CiAJfQotCWlmICh0Y29ubikgewotbmV4dF90Y29ubjoKLQkJbWRldiA9IGlkcl9nZXRfbmV4dCgmdGNvbm4tPnZvbHVtZXMsICZ2b2x1bWUpOwotCQlpZiAoIW1kZXYpIHsKLQkJCS8qIE5vIG1vcmUgdm9sdW1lcyB0byBkdW1wIG9uIHRoaXMgdGNvbm4uCi0JCQkgKiBBZHZhbmNlIHRjb25uIGl0ZXJhdG9yLiAqLwotCQkJcG9zID0gbGlzdF9lbnRyeV9yY3UodGNvbm4tPmFsbF90Y29ubi5uZXh0LAotCQkJCQkgICAgIHN0cnVjdCBkcmJkX3Rjb25uLCBhbGxfdGNvbm4pOwotCQkJLyogRGlkIHdlIGR1bXAgYW55IHZvbHVtZSBvbiB0aGlzIHRjb25uIHlldD8gKi8KKwlpZiAocmVzb3VyY2UpIHsKK25leHRfcmVzb3VyY2U6CisJCWRldmljZSA9IGlkcl9nZXRfbmV4dCgmcmVzb3VyY2UtPmRldmljZXMsICZ2b2x1bWUpOworCQlpZiAoIWRldmljZSkgeworCQkJLyogTm8gbW9yZSB2b2x1bWVzIHRvIGR1bXAgb24gdGhpcyByZXNvdXJjZS4KKwkJCSAqIEFkdmFuY2UgcmVzb3VyY2UgaXRlcmF0b3IuICovCisJCQlwb3MgPSBsaXN0X2VudHJ5X3JjdShyZXNvdXJjZS0+cmVzb3VyY2VzLm5leHQsCisJCQkJCSAgICAgc3RydWN0IGRyYmRfcmVzb3VyY2UsIHJlc291cmNlcyk7CisJCQkvKiBEaWQgd2UgZHVtcCBhbnkgdm9sdW1lIG9mIHRoaXMgcmVzb3VyY2UgeWV0PyAqLwogCQkJaWYgKHZvbHVtZSAhPSAwKSB7CiAJCQkJLyogSWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsaXN0LAogCQkJCSAqIG9yIG9ubHkgYSBzaW5nbGUgcmVzb3VyY2UgZHVtcCB3YXMgcmVxdWVzdGVkLAogCQkJCSAqIHdlIGFyZSBkb25lLiAqLwotCQkJCWlmICgmcG9zLT5hbGxfdGNvbm4gPT0gJmRyYmRfdGNvbm5zIHx8IGNiLT5hcmdzWzJdKQorCQkJCWlmICgmcG9zLT5yZXNvdXJjZXMgPT0gJmRyYmRfcmVzb3VyY2VzIHx8IGNiLT5hcmdzWzJdKQogCQkJCQlnb3RvIG91dDsKIAkJCQl2b2x1bWUgPSAwOwotCQkJCXRjb25uID0gcG9zOwotCQkJCWdvdG8gbmV4dF90Y29ubjsKKwkJCQlyZXNvdXJjZSA9IHBvczsKKwkJCQlnb3RvIG5leHRfcmVzb3VyY2U7CiAJCQl9CiAJCX0KIApAQCAtMjk2Myw0MyArMzAyMiw0OSBAQAogCQlpZiAoIWRoKQogCQkJZ290byBvdXQ7CiAKLQkJaWYgKCFtZGV2KSB7Ci0JCQkvKiBUaGlzIGlzIGEgdGNvbm4gd2l0aG91dCBhIHNpbmdsZSB2b2x1bWUuCisJCWlmICghZGV2aWNlKSB7CisJCQkvKiBUaGlzIGlzIGEgY29ubmVjdGlvbiB3aXRob3V0IGEgc2luZ2xlIHZvbHVtZS4KIAkJCSAqIFN1cHJpc2luZ2x5IGVub3VnaCwgaXQgbWF5IGhhdmUgYSBuZXR3b3JrCiAJCQkgKiBjb25maWd1cmF0aW9uLiAqLwotCQkJc3RydWN0IG5ldF9jb25mICpuYzsKKwkJCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKIAkJCWRoLT5taW5vciA9IC0xVTsKIAkJCWRoLT5yZXRfY29kZSA9IE5PX0VSUk9SOwotCQkJaWYgKG5sYV9wdXRfZHJiZF9jZmdfY29udGV4dChza2IsIHRjb25uLCBWT0xVTUVfVU5TUEVDSUZJRUQpKQorCQkJY29ubmVjdGlvbiA9IHRoZV9vbmx5X2Nvbm5lY3Rpb24ocmVzb3VyY2UpOworCQkJaWYgKG5sYV9wdXRfZHJiZF9jZmdfY29udGV4dChza2IsIHJlc291cmNlLCBjb25uZWN0aW9uLCBOVUxMKSkKIAkJCQlnb3RvIGNhbmNlbDsKLQkJCW5jID0gcmN1X2RlcmVmZXJlbmNlKHRjb25uLT5uZXRfY29uZik7Ci0JCQlpZiAobmMgJiYgbmV0X2NvbmZfdG9fc2tiKHNrYiwgbmMsIDEpICE9IDApCi0JCQkJZ290byBjYW5jZWw7CisJCQlpZiAoY29ubmVjdGlvbikgeworCQkJCXN0cnVjdCBuZXRfY29uZiAqbmM7CisKKwkJCQluYyA9IHJjdV9kZXJlZmVyZW5jZShjb25uZWN0aW9uLT5uZXRfY29uZik7CisJCQkJaWYgKG5jICYmIG5ldF9jb25mX3RvX3NrYihza2IsIG5jLCAxKSAhPSAwKQorCQkJCQlnb3RvIGNhbmNlbDsKKwkJCX0KIAkJCWdvdG8gZG9uZTsKIAkJfQogCi0JCURfQVNTRVJUKG1kZXYtPnZuciA9PSB2b2x1bWUpOwotCQlEX0FTU0VSVChtZGV2LT50Y29ubiA9PSB0Y29ubik7CisJCURfQVNTRVJUKGRldmljZSwgZGV2aWNlLT52bnIgPT0gdm9sdW1lKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCBkZXZpY2UtPnJlc291cmNlID09IHJlc291cmNlKTsKIAotCQlkaC0+bWlub3IgPSBtZGV2X3RvX21pbm9yKG1kZXYpOworCQlkaC0+bWlub3IgPSBkZXZpY2VfdG9fbWlub3IoZGV2aWNlKTsKIAkJZGgtPnJldF9jb2RlID0gTk9fRVJST1I7CiAKLQkJaWYgKG5sYV9wdXRfc3RhdHVzX2luZm8oc2tiLCBtZGV2LCBOVUxMKSkgeworCQlpZiAobmxhX3B1dF9zdGF0dXNfaW5mbyhza2IsIGRldmljZSwgTlVMTCkpIHsKIGNhbmNlbDoKIAkJCWdlbmxtc2dfY2FuY2VsKHNrYiwgZGgpOwogCQkJZ290byBvdXQ7CiAJCX0KIGRvbmU6CiAJCWdlbmxtc2dfZW5kKHNrYiwgZGgpOwotICAgICAgICB9CisJfQogCiBvdXQ6CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJLyogd2hlcmUgdG8gc3RhcnQgdGhlIG5leHQgaXRlcmF0aW9uICovCi0gICAgICAgIGNiLT5hcmdzWzBdID0gKGxvbmcpcG9zOwotICAgICAgICBjYi0+YXJnc1sxXSA9IChwb3MgPT0gdGNvbm4pID8gdm9sdW1lICsgMSA6IDA7CisJY2ItPmFyZ3NbMF0gPSAobG9uZylwb3M7CisJY2ItPmFyZ3NbMV0gPSAocG9zID09IHJlc291cmNlKSA/IHZvbHVtZSArIDEgOiAwOwogCi0JLyogTm8gbW9yZSB0Y29ubnMvdm9sdW1lcy9taW5vcnMgZm91bmQgcmVzdWx0cyBpbiBhbiBlbXB0eSBza2IuCisJLyogTm8gbW9yZSByZXNvdXJjZXMvdm9sdW1lcy9taW5vcnMgZm91bmQgcmVzdWx0cyBpbiBhbiBlbXB0eSBza2IuCiAJICogV2hpY2ggd2lsbCB0ZXJtaW5hdGUgdGhlIGR1bXAuICovCiAgICAgICAgIHJldHVybiBza2ItPmxlbjsKIH0KQEAgLTMwMTksNyArMzA4NCw3IEBACiAJY29uc3QgdW5zaWduZWQgaGRybGVuID0gR0VOTF9IRFJMRU4gKyBHRU5MX01BR0lDX0ZBTUlMWV9IRFJTWjsKIAlzdHJ1Y3QgbmxhdHRyICpubGE7CiAJY29uc3QgY2hhciAqcmVzb3VyY2VfbmFtZTsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm47CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlOwogCWludCBtYXh0eXBlOwogCiAJLyogSXMgdGhpcyBhIGZvbGxvd3VwIGNhbGw/ICovCkBAIC0zMDQ4LDE4ICszMTEzLDE5IEBACiAJaWYgKCFubGEpCiAJCXJldHVybiAtRUlOVkFMOwogCXJlc291cmNlX25hbWUgPSBubGFfZGF0YShubGEpOwotCXRjb25uID0gY29ubl9nZXRfYnlfbmFtZShyZXNvdXJjZV9uYW1lKTsKLQotCWlmICghdGNvbm4pCisJaWYgKCEqcmVzb3VyY2VfbmFtZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmVzb3VyY2UgPSBkcmJkX2ZpbmRfcmVzb3VyY2UocmVzb3VyY2VfbmFtZSk7CisJaWYgKCFyZXNvdXJjZSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlrcmVmX3B1dCgmdGNvbm4tPmtyZWYsICZjb25uX2Rlc3Ryb3kpOyAvKiBnZXRfb25lX3N0YXR1cygpIChyZSl2YWxpZGF0ZXMgdGNvbm4gYnkgaXRzZWxmICovCisJa3JlZl9wdXQoJnJlc291cmNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2UpOyAvKiBnZXRfb25lX3N0YXR1cygpIHJldmFsaWRhdGVzIHRoZSByZXNvdXJjZSAqLwogCiAJLyogcHJpbWUgaXRlcmF0b3JzLCBhbmQgc2V0ICJmaWx0ZXIiIG1vZGUgbWFyazoKLQkgKiBvbmx5IGR1bXAgdGhpcyB0Y29ubi4gKi8KLQljYi0+YXJnc1swXSA9IChsb25nKXRjb25uOworCSAqIG9ubHkgZHVtcCB0aGlzIGNvbm5lY3Rpb24uICovCisJY2ItPmFyZ3NbMF0gPSAobG9uZylyZXNvdXJjZTsKIAkvKiBjYi0+YXJnc1sxXSA9IDA7IHBhc3NlZCBpbiB0aGlzIHdheS4gKi8KLQljYi0+YXJnc1syXSA9IChsb25nKXRjb25uOworCWNiLT5hcmdzWzJdID0gKGxvbmcpcmVzb3VyY2U7CiAKIGR1bXA6CiAJcmV0dXJuIGdldF9vbmVfc3RhdHVzKHNrYiwgY2IpOwpAQCAtMzA3OCw4ICszMTQ0LDggQEAKIAkJZ290byBvdXQ7CiAKIAl0cC50aW1lb3V0X3R5cGUgPQotCQlhZG1fY3R4Lm1kZXYtPnN0YXRlLnBkc2sgPT0gRF9PVVREQVRFRCA/IFVUX1BFRVJfT1VUREFURUQgOgotCQl0ZXN0X2JpdChVU0VfREVHUl9XRkNfVCwgJmFkbV9jdHgubWRldi0+ZmxhZ3MpID8gVVRfREVHUkFERUQgOgorCQlhZG1fY3R4LmRldmljZS0+c3RhdGUucGRzayA9PSBEX09VVERBVEVEID8gVVRfUEVFUl9PVVREQVRFRCA6CisJCXRlc3RfYml0KFVTRV9ERUdSX1dGQ19ULCAmYWRtX2N0eC5kZXZpY2UtPmZsYWdzKSA/IFVUX0RFR1JBREVEIDoKIAkJVVRfREVGQVVMVDsKIAogCWVyciA9IHRpbWVvdXRfcGFybXNfdG9fcHJpdl9za2IoYWRtX2N0eC5yZXBseV9za2IsICZ0cCk7CkBAIC0zMDk0LDcgKzMxNjAsNyBAQAogCiBpbnQgZHJiZF9hZG1fc3RhcnRfb3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCWVudW0gZHJiZF9yZXRfY29kZSByZXRjb2RlOwogCXN0cnVjdCBzdGFydF9vdl9wYXJtcyBwYXJtczsKIApAQCAtMzEwNCwxMCArMzE3MCwxMCBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dDsKIAotCW1kZXYgPSBhZG1fY3R4Lm1kZXY7CisJZGV2aWNlID0gYWRtX2N0eC5kZXZpY2U7CiAKIAkvKiByZXN1bWUgZnJvbSBsYXN0IGtub3duIHBvc2l0aW9uLCBpZiBwb3NzaWJsZSAqLwotCXBhcm1zLm92X3N0YXJ0X3NlY3RvciA9IG1kZXYtPm92X3N0YXJ0X3NlY3RvcjsKKwlwYXJtcy5vdl9zdGFydF9zZWN0b3IgPSBkZXZpY2UtPm92X3N0YXJ0X3NlY3RvcjsKIAlwYXJtcy5vdl9zdG9wX3NlY3RvciA9IFVMTE9OR19NQVg7CiAJaWYgKGluZm8tPmF0dHJzW0RSQkRfTkxBX1NUQVJUX09WX1BBUk1TXSkgewogCQlpbnQgZXJyID0gc3RhcnRfb3ZfcGFybXNfZnJvbV9hdHRycygmcGFybXMsIGluZm8pOwpAQCAtMzExOCwxNSArMzE4NCwxNSBAQAogCQl9CiAJfQogCS8qIHdfbWFrZV9vdl9yZXF1ZXN0IGV4cGVjdHMgcG9zaXRpb24gdG8gYmUgYWxpZ25lZCAqLwotCW1kZXYtPm92X3N0YXJ0X3NlY3RvciA9IHBhcm1zLm92X3N0YXJ0X3NlY3RvciAmIH4oQk1fU0VDVF9QRVJfQklULTEpOwotCW1kZXYtPm92X3N0b3Bfc2VjdG9yID0gcGFybXMub3Zfc3RvcF9zZWN0b3I7CisJZGV2aWNlLT5vdl9zdGFydF9zZWN0b3IgPSBwYXJtcy5vdl9zdGFydF9zZWN0b3IgJiB+KEJNX1NFQ1RfUEVSX0JJVC0xKTsKKwlkZXZpY2UtPm92X3N0b3Bfc2VjdG9yID0gcGFybXMub3Zfc3RvcF9zZWN0b3I7CiAKIAkvKiBJZiB0aGVyZSBpcyBzdGlsbCBiaXRtYXAgSU8gcGVuZGluZywgZS5nLiBwcmV2aW91cyByZXN5bmMgb3IgdmVyaWZ5CiAJICoganVzdCBiZWluZyBmaW5pc2hlZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHJlcXVlc3RpbmcgYSBuZXcgcmVzeW5jLiAqLwotCWRyYmRfc3VzcGVuZF9pbyhtZGV2KTsKLQl3YWl0X2V2ZW50KG1kZXYtPm1pc2Nfd2FpdCwgIXRlc3RfYml0KEJJVE1BUF9JTywgJm1kZXYtPmZsYWdzKSk7Ci0JcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShtZGV2LE5TKGNvbm4sQ19WRVJJRllfUykpOwotCWRyYmRfcmVzdW1lX2lvKG1kZXYpOworCWRyYmRfc3VzcGVuZF9pbyhkZXZpY2UpOworCXdhaXRfZXZlbnQoZGV2aWNlLT5taXNjX3dhaXQsICF0ZXN0X2JpdChCSVRNQVBfSU8sICZkZXZpY2UtPmZsYWdzKSk7CisJcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfVkVSSUZZX1MpKTsKKwlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKQEAgLTMxMzUsNyArMzIwMSw3IEBACiAKIGludCBkcmJkX2FkbV9uZXdfY191dWlkKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAllbnVtIGRyYmRfcmV0X2NvZGUgcmV0Y29kZTsKIAlpbnQgc2tpcF9pbml0aWFsX3N5bmMgPSAwOwogCWludCBlcnI7CkBAIC0zMTQ3LDcgKzMyMTMsNyBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dF9ub2xvY2s7CiAKLQltZGV2ID0gYWRtX2N0eC5tZGV2OworCWRldmljZSA9IGFkbV9jdHguZGV2aWNlOwogCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKIAlpZiAoaW5mby0+YXR0cnNbRFJCRF9OTEFfTkVXX0NfVVVJRF9QQVJNU10pIHsKIAkJZXJyID0gbmV3X2NfdXVpZF9wYXJtc19mcm9tX2F0dHJzKCZhcmdzLCBpbmZvKTsKQEAgLTMxNTgsNDkgKzMyMjQsNTAgQEAKIAkJfQogCX0KIAotCW11dGV4X2xvY2sobWRldi0+c3RhdGVfbXV0ZXgpOyAvKiBQcm90ZWN0cyB1cyBhZ2FpbnN0IHNlcmlhbGl6ZWQgc3RhdGUgY2hhbmdlcy4gKi8KKwltdXRleF9sb2NrKGRldmljZS0+c3RhdGVfbXV0ZXgpOyAvKiBQcm90ZWN0cyB1cyBhZ2FpbnN0IHNlcmlhbGl6ZWQgc3RhdGUgY2hhbmdlcy4gKi8KIAotCWlmICghZ2V0X2xkZXYobWRldikpIHsKKwlpZiAoIWdldF9sZGV2KGRldmljZSkpIHsKIAkJcmV0Y29kZSA9IEVSUl9OT19ESVNLOwogCQlnb3RvIG91dDsKIAl9CiAKIAkvKiB0aGlzIGlzICJza2lwIGluaXRpYWwgc3luYyIsIGFzc3VtZSB0byBiZSBjbGVhbiAqLwotCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfQ09OTkVDVEVEICYmIG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gOTAgJiYKLQkgICAgbWRldi0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSA9PSBVVUlEX0pVU1RfQ1JFQVRFRCAmJiBhcmdzLmNsZWFyX2JtKSB7Ci0JCWRldl9pbmZvKERFViwgIlByZXBhcmluZyB0byBza2lwIGluaXRpYWwgc3luY1xuIik7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX0NPTk5FQ1RFRCAmJgorCSAgICBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gOTAgJiYKKwkgICAgZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0NVUlJFTlRdID09IFVVSURfSlVTVF9DUkVBVEVEICYmIGFyZ3MuY2xlYXJfYm0pIHsKKwkJZHJiZF9pbmZvKGRldmljZSwgIlByZXBhcmluZyB0byBza2lwIGluaXRpYWwgc3luY1xuIik7CiAJCXNraXBfaW5pdGlhbF9zeW5jID0gMTsKLQl9IGVsc2UgaWYgKG1kZXYtPnN0YXRlLmNvbm4gIT0gQ19TVEFOREFMT05FKSB7CisJfSBlbHNlIGlmIChkZXZpY2UtPnN0YXRlLmNvbm4gIT0gQ19TVEFOREFMT05FKSB7CiAJCXJldGNvZGUgPSBFUlJfQ09OTkVDVEVEOwogCQlnb3RvIG91dF9kZWM7CiAJfQogCi0JZHJiZF91dWlkX3NldChtZGV2LCBVSV9CSVRNQVAsIDApOyAvKiBSb3RhdGUgVUlfQklUTUFQIHRvIEhpc3RvcnkgMSwgZXRjLi4uICovCi0JZHJiZF91dWlkX25ld19jdXJyZW50KG1kZXYpOyAvKiBOZXcgY3VycmVudCwgcHJldmlvdXMgdG8gVUlfQklUTUFQICovCisJZHJiZF91dWlkX3NldChkZXZpY2UsIFVJX0JJVE1BUCwgMCk7IC8qIFJvdGF0ZSBVSV9CSVRNQVAgdG8gSGlzdG9yeSAxLCBldGMuLi4gKi8KKwlkcmJkX3V1aWRfbmV3X2N1cnJlbnQoZGV2aWNlKTsgLyogTmV3IGN1cnJlbnQsIHByZXZpb3VzIHRvIFVJX0JJVE1BUCAqLwogCiAJaWYgKGFyZ3MuY2xlYXJfYm0pIHsKLQkJZXJyID0gZHJiZF9iaXRtYXBfaW8obWRldiwgJmRyYmRfYm1pb19jbGVhcl9uX3dyaXRlLAorCQllcnIgPSBkcmJkX2JpdG1hcF9pbyhkZXZpY2UsICZkcmJkX2JtaW9fY2xlYXJfbl93cml0ZSwKIAkJCSJjbGVhcl9uX3dyaXRlIGZyb20gbmV3X2NfdXVpZCIsIEJNX0xPQ0tFRF9NQVNLKTsKIAkJaWYgKGVycikgewotCQkJZGV2X2VycihERVYsICJXcml0aW5nIGJpdG1hcCBmYWlsZWQgd2l0aCAlZFxuIixlcnIpOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiV3JpdGluZyBiaXRtYXAgZmFpbGVkIHdpdGggJWRcbiIsIGVycik7CiAJCQlyZXRjb2RlID0gRVJSX0lPX01EX0RJU0s7CiAJCX0KIAkJaWYgKHNraXBfaW5pdGlhbF9zeW5jKSB7Ci0JCQlkcmJkX3NlbmRfdXVpZHNfc2tpcF9pbml0aWFsX3N5bmMobWRldik7Ci0JCQlfZHJiZF91dWlkX3NldChtZGV2LCBVSV9CSVRNQVAsIDApOwotCQkJZHJiZF9wcmludF91dWlkcyhtZGV2LCAiY2xlYXJlZCBiaXRtYXAgVVVJRCIpOwotCQkJc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQkJCV9kcmJkX3NldF9zdGF0ZShfTlMyKG1kZXYsIGRpc2ssIERfVVBfVE9fREFURSwgcGRzaywgRF9VUF9UT19EQVRFKSwKKwkJCWRyYmRfc2VuZF91dWlkc19za2lwX2luaXRpYWxfc3luYyhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpKTsKKwkJCV9kcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfQklUTUFQLCAwKTsKKwkJCWRyYmRfcHJpbnRfdXVpZHMoZGV2aWNlLCAiY2xlYXJlZCBiaXRtYXAgVVVJRCIpOworCQkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCQkJX2RyYmRfc2V0X3N0YXRlKF9OUzIoZGV2aWNlLCBkaXNrLCBEX1VQX1RPX0RBVEUsIHBkc2ssIERfVVBfVE9fREFURSksCiAJCQkJCUNTX1ZFUkJPU0UsIE5VTEwpOwotCQkJc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCQkJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJCX0KIAl9CiAKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiBvdXRfZGVjOgotCXB1dF9sZGV2KG1kZXYpOworCXB1dF9sZGV2KGRldmljZSk7CiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKG1kZXYtPnN0YXRlX211dGV4KTsKKwltdXRleF91bmxvY2soZGV2aWNlLT5zdGF0ZV9tdXRleCk7CiBvdXRfbm9sb2NrOgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKQEAgLTMyNDYsNyArMzMxMyw3IEBACiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gb3V0OwogCi0JaWYgKGFkbV9jdHgudGNvbm4pIHsKKwlpZiAoYWRtX2N0eC5yZXNvdXJjZSkgewogCQlpZiAoaW5mby0+bmxoZHItPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRVhDTCkgewogCQkJcmV0Y29kZSA9IEVSUl9JTlZBTElEX1JFUVVFU1Q7CiAJCQlkcmJkX21zZ19wdXRfaW5mbygicmVzb3VyY2UgZXhpc3RzIik7CkBAIC0zMjYyLDcgKzMzMjksNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZHJiZF9hZG1fYWRkX21pbm9yKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCitpbnQgZHJiZF9hZG1fbmV3X21pbm9yKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGRyYmRfZ2VubG1zZ2hkciAqZGggPSBpbmZvLT51c2VyaGRyOwogCWVudW0gZHJiZF9yZXRfY29kZSByZXRjb2RlOwpAQCAtMzI4NSw0MSArMzM1MiwzNiBAQAogCX0KIAogCS8qIGRyYmRfYWRtX3ByZXBhcmUgbWFkZSBzdXJlIGFscmVhZHkKLQkgKiB0aGF0IG1kZXYtPnRjb25uIGFuZCBtZGV2LT52bnIgbWF0Y2ggdGhlIHJlcXVlc3QuICovCi0JaWYgKGFkbV9jdHgubWRldikgeworCSAqIHRoYXQgZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbiBhbmQgZGV2aWNlLT52bnIgbWF0Y2ggdGhlIHJlcXVlc3QuICovCisJaWYgKGFkbV9jdHguZGV2aWNlKSB7CiAJCWlmIChpbmZvLT5ubGhkci0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9FWENMKQogCQkJcmV0Y29kZSA9IEVSUl9NSU5PUl9FWElTVFM7CiAJCS8qIGVsc2U6IHN0aWxsIE5PX0VSUk9SICovCiAJCWdvdG8gb3V0OwogCX0KIAotCXJldGNvZGUgPSBjb25uX25ld19taW5vcihhZG1fY3R4LnRjb25uLCBkaC0+bWlub3IsIGFkbV9jdHgudm9sdW1lKTsKKwlyZXRjb2RlID0gZHJiZF9jcmVhdGVfZGV2aWNlKGFkbV9jdHgucmVzb3VyY2UsIGRoLT5taW5vciwgYWRtX2N0eC52b2x1bWUpOwogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGVudW0gZHJiZF9yZXRfY29kZSBhZG1fZGVsZXRlX21pbm9yKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgZW51bSBkcmJkX3JldF9jb2RlIGFkbV9kZWxfbWlub3Ioc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaWYgKG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUyAmJgotCSAgICAvKiBubyBuZWVkIHRvIGJlIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19TVEFOREFMT05FICYmCisJaWYgKGRldmljZS0+c3RhdGUuZGlzayA9PSBEX0RJU0tMRVNTICYmCisJICAgIC8qIG5vIG5lZWQgdG8gYmUgZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1RBTkRBTE9ORSAmJgogCSAgICAgKiB3ZSBtYXkgd2FudCB0byBkZWxldGUgYSBtaW5vciBmcm9tIGEgbGl2ZSByZXBsaWNhdGlvbiBncm91cC4KIAkgICAgICovCi0JICAgIG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9TRUNPTkRBUlkpIHsKLQkJX2RyYmRfcmVxdWVzdF9zdGF0ZShtZGV2LCBOUyhjb25uLCBDX1dGX1JFUE9SVF9QQVJBTVMpLAorCSAgICBkZXZpY2UtPnN0YXRlLnJvbGUgPT0gUl9TRUNPTkRBUlkpIHsKKwkJX2RyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfV0ZfUkVQT1JUX1BBUkFNUyksCiAJCQkJICAgIENTX1ZFUkJPU0UgKyBDU19XQUlUX0NPTVBMRVRFKTsKLQkJaWRyX3JlbW92ZSgmbWRldi0+dGNvbm4tPnZvbHVtZXMsIG1kZXYtPnZucik7Ci0JCWlkcl9yZW1vdmUoJm1pbm9ycywgbWRldl90b19taW5vcihtZGV2KSk7Ci0JCWRlc3Ryb3lfd29ya3F1ZXVlKG1kZXYtPnN1Ym1pdC53cSk7Ci0JCWRlbF9nZW5kaXNrKG1kZXYtPnZkaXNrKTsKLQkJc3luY2hyb25pemVfcmN1KCk7Ci0JCWtyZWZfcHV0KCZtZGV2LT5rcmVmLCAmZHJiZF9taW5vcl9kZXN0cm95KTsKKwkJZHJiZF9kZWxldGVfZGV2aWNlKGRldmljZSk7CiAJCXJldHVybiBOT19FUlJPUjsKIAl9IGVsc2UKIAkJcmV0dXJuIEVSUl9NSU5PUl9DT05GSUdVUkVEOwogfQogCi1pbnQgZHJiZF9hZG1fZGVsZXRlX21pbm9yKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCitpbnQgZHJiZF9hZG1fZGVsX21pbm9yKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJZW51bSBkcmJkX3JldF9jb2RlIHJldGNvZGU7CiAKQEAgLTMzMjksNyArMzM5MSw3IEBACiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gb3V0OwogCi0JcmV0Y29kZSA9IGFkbV9kZWxldGVfbWlub3IoYWRtX2N0eC5tZGV2KTsKKwlyZXRjb2RlID0gYWRtX2RlbF9taW5vcihhZG1fY3R4LmRldmljZSk7CiBvdXQ6CiAJZHJiZF9hZG1fZmluaXNoKGluZm8sIHJldGNvZGUpOwogCXJldHVybiAwOwpAQCAtMzMzNyw1NSArMzM5OSw1OCBAQAogCiBpbnQgZHJiZF9hZG1fZG93bihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogeworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCWludCByZXRjb2RlOyAvKiBlbnVtIGRyYmRfcmV0X2NvZGUgcnNwLiBlbnVtIGRyYmRfc3RhdGVfcnYgKi8KLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OwogCXVuc2lnbmVkIGk7CiAKLQlyZXRjb2RlID0gZHJiZF9hZG1fcHJlcGFyZShza2IsIGluZm8sIDApOworCXJldGNvZGUgPSBkcmJkX2FkbV9wcmVwYXJlKHNrYiwgaW5mbywgRFJCRF9BRE1fTkVFRF9SRVNPVVJDRSk7CiAJaWYgKCFhZG1fY3R4LnJlcGx5X3NrYikKIAkJcmV0dXJuIHJldGNvZGU7CiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gb3V0OwogCi0JaWYgKCFhZG1fY3R4LnRjb25uKSB7Ci0JCXJldGNvZGUgPSBFUlJfUkVTX05PVF9LTk9XTjsKLQkJZ290byBvdXQ7Ci0JfQotCisJcmVzb3VyY2UgPSBhZG1fY3R4LnJlc291cmNlOwogCS8qIGRlbW90ZSAqLwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmYWRtX2N0eC50Y29ubi0+dm9sdW1lcywgbWRldiwgaSkgewotCQlyZXRjb2RlID0gZHJiZF9zZXRfcm9sZShtZGV2LCBSX1NFQ09OREFSWSwgMCk7CisJZm9yX2VhY2hfY29ubmVjdGlvbihjb25uZWN0aW9uLCByZXNvdXJjZSkgeworCQlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CisKKwkJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCBpKSB7CisJCQlyZXRjb2RlID0gZHJiZF9zZXRfcm9sZShwZWVyX2RldmljZS0+ZGV2aWNlLCBSX1NFQ09OREFSWSwgMCk7CisJCQlpZiAocmV0Y29kZSA8IFNTX1NVQ0NFU1MpIHsKKwkJCQlkcmJkX21zZ19wdXRfaW5mbygiZmFpbGVkIHRvIGRlbW90ZSIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisKKwkJcmV0Y29kZSA9IGNvbm5fdHJ5X2Rpc2Nvbm5lY3QoY29ubmVjdGlvbiwgMCk7CiAJCWlmIChyZXRjb2RlIDwgU1NfU1VDQ0VTUykgewotCQkJZHJiZF9tc2dfcHV0X2luZm8oImZhaWxlZCB0byBkZW1vdGUiKTsKKwkJCWRyYmRfbXNnX3B1dF9pbmZvKCJmYWlsZWQgdG8gZGlzY29ubmVjdCIpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKLQlyZXRjb2RlID0gY29ubl90cnlfZGlzY29ubmVjdChhZG1fY3R4LnRjb25uLCAwKTsKLQlpZiAocmV0Y29kZSA8IFNTX1NVQ0NFU1MpIHsKLQkJZHJiZF9tc2dfcHV0X2luZm8oImZhaWxlZCB0byBkaXNjb25uZWN0Iik7Ci0JCWdvdG8gb3V0OwotCX0KLQogCS8qIGRldGFjaCAqLwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmYWRtX2N0eC50Y29ubi0+dm9sdW1lcywgbWRldiwgaSkgewotCQlyZXRjb2RlID0gYWRtX2RldGFjaChtZGV2LCAwKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJnJlc291cmNlLT5kZXZpY2VzLCBkZXZpY2UsIGkpIHsKKwkJcmV0Y29kZSA9IGFkbV9kZXRhY2goZGV2aWNlLCAwKTsKIAkJaWYgKHJldGNvZGUgPCBTU19TVUNDRVNTIHx8IHJldGNvZGUgPiBOT19FUlJPUikgewogCQkJZHJiZF9tc2dfcHV0X2luZm8oImZhaWxlZCB0byBkZXRhY2giKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQogCi0JLyogSWYgd2UgcmVhY2ggdGhpcywgYWxsIHZvbHVtZXMgKG9mIHRoaXMgdGNvbm4pIGFyZSBTZWNvbmRhcnksCisJLyogSWYgd2UgcmVhY2ggdGhpcywgYWxsIHZvbHVtZXMgKG9mIHRoaXMgY29ubmVjdGlvbikgYXJlIFNlY29uZGFyeSwKIAkgKiBEaXNjb25uZWN0ZWQsIERpc2tsZXNzLCBha2EgVW5jb25maWd1cmVkLiBNYWtlIHN1cmUgYWxsIHRocmVhZHMgaGF2ZQogCSAqIGFjdHVhbGx5IHN0b3BwZWQsIHN0YXRlIGhhbmRsaW5nIG9ubHkgZG9lcyBkcmJkX3RocmVhZF9zdG9wX25vd2FpdCgpLiAqLwotCWRyYmRfdGhyZWFkX3N0b3AoJmFkbV9jdHgudGNvbm4tPndvcmtlcik7CisJZm9yX2VhY2hfY29ubmVjdGlvbihjb25uZWN0aW9uLCByZXNvdXJjZSkKKwkJZHJiZF90aHJlYWRfc3RvcCgmY29ubmVjdGlvbi0+d29ya2VyKTsKIAogCS8qIE5vdywgbm90aGluZyBjYW4gZmFpbCBhbnltb3JlICovCiAKIAkvKiBkZWxldGUgdm9sdW1lcyAqLwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmYWRtX2N0eC50Y29ubi0+dm9sdW1lcywgbWRldiwgaSkgewotCQlyZXRjb2RlID0gYWRtX2RlbGV0ZV9taW5vcihtZGV2KTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJnJlc291cmNlLT5kZXZpY2VzLCBkZXZpY2UsIGkpIHsKKwkJcmV0Y29kZSA9IGFkbV9kZWxfbWlub3IoZGV2aWNlKTsKIAkJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpIHsKIAkJCS8qICJjYW4gbm90IGhhcHBlbiIgKi8KIAkJCWRyYmRfbXNnX3B1dF9pbmZvKCJmYWlsZWQgdG8gZGVsZXRlIHZvbHVtZSIpOwpAQCAtMzM5MywxOSArMzQ1OCwxMSBAQAogCQl9CiAJfQogCi0JLyogZGVsZXRlIGNvbm5lY3Rpb24gKi8KLQlpZiAoY29ubl9sb3dlc3RfbWlub3IoYWRtX2N0eC50Y29ubikgPCAwKSB7Ci0JCWxpc3RfZGVsX3JjdSgmYWRtX2N0eC50Y29ubi0+YWxsX3Rjb25uKTsKLQkJc3luY2hyb25pemVfcmN1KCk7Ci0JCWtyZWZfcHV0KCZhZG1fY3R4LnRjb25uLT5rcmVmLCAmY29ubl9kZXN0cm95KTsKKwlsaXN0X2RlbF9yY3UoJnJlc291cmNlLT5yZXNvdXJjZXMpOworCXN5bmNocm9uaXplX3JjdSgpOworCWRyYmRfZnJlZV9yZXNvdXJjZShyZXNvdXJjZSk7CisJcmV0Y29kZSA9IE5PX0VSUk9SOwogCi0JCXJldGNvZGUgPSBOT19FUlJPUjsKLQl9IGVsc2UgewotCQkvKiAiY2FuIG5vdCBoYXBwZW4iICovCi0JCXJldGNvZGUgPSBFUlJfUkVTX0lOX1VTRTsKLQkJZHJiZF9tc2dfcHV0X2luZm8oImZhaWxlZCB0byBkZWxldGUgY29ubmVjdGlvbiIpOwotCX0KLQlnb3RvIG91dDsKIG91dDoKIAlkcmJkX2FkbV9maW5pc2goaW5mbywgcmV0Y29kZSk7CiAJcmV0dXJuIDA7CkBAIC0zNDEzLDYgKzM0NzAsOCBAQAogCiBpbnQgZHJiZF9hZG1fZGVsX3Jlc291cmNlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CiAJZW51bSBkcmJkX3JldF9jb2RlIHJldGNvZGU7CiAKIAlyZXRjb2RlID0gZHJiZF9hZG1fcHJlcGFyZShza2IsIGluZm8sIERSQkRfQURNX05FRURfUkVTT1VSQ0UpOwpAQCAtMzQyMSwyNCArMzQ4MCwzMCBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dDsKIAotCWlmIChjb25uX2xvd2VzdF9taW5vcihhZG1fY3R4LnRjb25uKSA8IDApIHsKLQkJbGlzdF9kZWxfcmN1KCZhZG1fY3R4LnRjb25uLT5hbGxfdGNvbm4pOwotCQlzeW5jaHJvbml6ZV9yY3UoKTsKLQkJa3JlZl9wdXQoJmFkbV9jdHgudGNvbm4tPmtyZWYsICZjb25uX2Rlc3Ryb3kpOwotCi0JCXJldGNvZGUgPSBOT19FUlJPUjsKLQl9IGVsc2UgeworCXJlc291cmNlID0gYWRtX2N0eC5yZXNvdXJjZTsKKwlmb3JfZWFjaF9jb25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlc291cmNlKSB7CisJCWlmIChjb25uZWN0aW9uLT5jc3RhdGUgPiBDX1NUQU5EQUxPTkUpIHsKKwkJCXJldGNvZGUgPSBFUlJfTkVUX0NPTkZJR1VSRUQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlpZiAoIWlkcl9pc19lbXB0eSgmcmVzb3VyY2UtPmRldmljZXMpKSB7CiAJCXJldGNvZGUgPSBFUlJfUkVTX0lOX1VTRTsKKwkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHJldGNvZGUgPT0gTk9fRVJST1IpCi0JCWRyYmRfdGhyZWFkX3N0b3AoJmFkbV9jdHgudGNvbm4tPndvcmtlcik7CisJbGlzdF9kZWxfcmN1KCZyZXNvdXJjZS0+cmVzb3VyY2VzKTsKKwlmb3JfZWFjaF9jb25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlc291cmNlKQorCQlkcmJkX3RocmVhZF9zdG9wKCZjb25uZWN0aW9uLT53b3JrZXIpOworCXN5bmNocm9uaXplX3JjdSgpOworCWRyYmRfZnJlZV9yZXNvdXJjZShyZXNvdXJjZSk7CisJcmV0Y29kZSA9IE5PX0VSUk9SOwogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBkcmJkX2JjYXN0X2V2ZW50KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IHN0cnVjdCBzaWJfaW5mbyAqc2liKQordm9pZCBkcmJkX2JjYXN0X2V2ZW50KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCBzdHJ1Y3Qgc2liX2luZm8gKnNpYikKIHsKIAlzdGF0aWMgYXRvbWljX3QgZHJiZF9nZW5sX3NlcSA9IEFUT01JQ19JTklUKDIpOyAvKiB0d28uICovCiAJc3RydWN0IHNrX2J1ZmYgKm1zZzsKQEAgLTM0NDcsOCArMzUxMiw4IEBACiAJaW50IGVyciA9IC1FTk9NRU07CiAKIAlpZiAoc2liLT5zaWJfcmVhc29uID09IFNJQl9TWU5DX1BST0dSRVNTKSB7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIG1kZXYtPnJzX2xhc3RfYmNhc3QgKyBIWikpCi0JCQltZGV2LT5yc19sYXN0X2JjYXN0ID0gamlmZmllczsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGV2aWNlLT5yc19sYXN0X2JjYXN0ICsgSFopKQorCQkJZGV2aWNlLT5yc19sYXN0X2JjYXN0ID0gamlmZmllczsKIAkJZWxzZQogCQkJcmV0dXJuOwogCX0KQEAgLTM0NjIsMTAgKzM1MjcsMTAgQEAKIAlkX291dCA9IGdlbmxtc2dfcHV0KG1zZywgMCwgc2VxLCAmZHJiZF9nZW5sX2ZhbWlseSwgMCwgRFJCRF9FVkVOVCk7CiAJaWYgKCFkX291dCkgLyogY2Fubm90IGhhcHBlbiwgYnV0IGFueXdheXMuICovCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCWRfb3V0LT5taW5vciA9IG1kZXZfdG9fbWlub3IobWRldik7CisJZF9vdXQtPm1pbm9yID0gZGV2aWNlX3RvX21pbm9yKGRldmljZSk7CiAJZF9vdXQtPnJldF9jb2RlID0gTk9fRVJST1I7CiAKLQlpZiAobmxhX3B1dF9zdGF0dXNfaW5mbyhtc2csIG1kZXYsIHNpYikpCisJaWYgKG5sYV9wdXRfc3RhdHVzX2luZm8obXNnLCBkZXZpY2UsIHNpYikpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCWdlbmxtc2dfZW5kKG1zZywgZF9vdXQpOwogCWVyciA9IGRyYmRfZ2VubF9tdWx0aWNhc3RfZXZlbnRzKG1zZywgMCk7CkBAIC0zNDc4LDcgKzM1NDMsNyBAQAogbmxhX3B1dF9mYWlsdXJlOgogCW5sbXNnX2ZyZWUobXNnKTsKIGZhaWxlZDoKLQlkZXZfZXJyKERFViwgIkVycm9yICVkIHdoaWxlIGJyb2FkY2FzdGluZyBldmVudC4gIgorCWRyYmRfZXJyKGRldmljZSwgIkVycm9yICVkIHdoaWxlIGJyb2FkY2FzdGluZyBldmVudC4gIgogCQkJIkV2ZW50IHNlcToldSBzaWJfcmVhc29uOiV1XG4iLAogCQkJZXJyLCBzZXEsIHNpYi0+c2liX3JlYXNvbik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9wcm9jLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9wcm9jLmMKaW5kZXggYmYzMWQ0MS4uMmYyNmU4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcHJvYy5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3Byb2MuYwpAQCAtNDYsNyArNDYsNyBAQAogCS5yZWxlYXNlCT0gZHJiZF9wcm9jX3JlbGVhc2UsCiB9OwogCi12b2lkIHNlcV9wcmludGZfd2l0aF90aG91c2FuZHNfZ3JvdXBpbmcoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvbmcgdikKK3N0YXRpYyB2b2lkIHNlcV9wcmludGZfd2l0aF90aG91c2FuZHNfZ3JvdXBpbmcoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvbmcgdikKIHsKIAkvKiB2IGlzIGluIGtCL3NlYy4gV2UgZG9uJ3QgZXhwZWN0IFRpQnl0ZS9zZWMgeWV0LiAqLwogCWlmICh1bmxpa2VseSh2ID49IDEwMDAwMDApKSB7CkBAIC02NiwxNCArNjYsMTQgQEAKICAqCVs9PT09PT4uLi4uLi4uLi4uLi4uLl0gMzMuNSUgKDIzNDU2LzEyMzQ1NikKICAqCWZpbmlzaDogMjoyMDoyMCBzcGVlZDogNiwzNDUgKDYsNDU2KSBLL3NlYwogICovCi1zdGF0aWMgdm9pZCBkcmJkX3N5bmNlcl9wcm9ncmVzcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3N0YXRpYyB2b2lkIGRyYmRfc3luY2VyX3Byb2dyZXNzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKIHsKIAl1bnNpZ25lZCBsb25nIGRiLCBkdCwgZGJkdCwgcnQsIHJzX2xlZnQ7CiAJdW5zaWduZWQgaW50IHJlczsKIAlpbnQgaSwgeCwgeTsKIAlpbnQgc3RhbGxlZCA9IDA7CiAKLQlkcmJkX2dldF9zeW5jZXJfcHJvZ3Jlc3MobWRldiwgJnJzX2xlZnQsICZyZXMpOworCWRyYmRfZ2V0X3N5bmNlcl9wcm9ncmVzcyhkZXZpY2UsICZyc19sZWZ0LCAmcmVzKTsKIAogCXggPSByZXMvNTA7CiAJeSA9IDIwLXg7CkBAIC04NSwyMSArODUsMjEgQEAKIAkJc2VxX3ByaW50ZihzZXEsICIuIik7CiAJc2VxX3ByaW50ZihzZXEsICJdICIpOwogCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUyB8fCBtZGV2LT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpCisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9TIHx8IGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9UKQogCQlzZXFfcHJpbnRmKHNlcSwgInZlcmlmaWVkOiIpOwogCWVsc2UKIAkJc2VxX3ByaW50ZihzZXEsICJzeW5jJ2VkOiIpOwogCXNlcV9wcmludGYoc2VxLCAiJTN1LiV1JSUgIiwgcmVzIC8gMTAsIHJlcyAlIDEwKTsKIAogCS8qIGlmIG1vcmUgdGhhbiBhIGZldyBHQiwgZGlzcGxheSBpbiBNQiAqLwotCWlmIChtZGV2LT5yc190b3RhbCA+ICg0VUwgPDwgKDMwIC0gQk1fQkxPQ0tfU0hJRlQpKSkKKwlpZiAoZGV2aWNlLT5yc190b3RhbCA+ICg0VUwgPDwgKDMwIC0gQk1fQkxPQ0tfU0hJRlQpKSkKIAkJc2VxX3ByaW50ZihzZXEsICIoJWx1LyVsdSlNIiwKIAkJCSAgICAodW5zaWduZWQgbG9uZykgQml0MktCKHJzX2xlZnQgPj4gMTApLAotCQkJICAgICh1bnNpZ25lZCBsb25nKSBCaXQyS0IobWRldi0+cnNfdG90YWwgPj4gMTApKTsKKwkJCSAgICAodW5zaWduZWQgbG9uZykgQml0MktCKGRldmljZS0+cnNfdG90YWwgPj4gMTApKTsKIAllbHNlCiAJCXNlcV9wcmludGYoc2VxLCAiKCVsdS8lbHUpS1xuXHQiLAogCQkJICAgICh1bnNpZ25lZCBsb25nKSBCaXQyS0IocnNfbGVmdCksCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpIEJpdDJLQihtZGV2LT5yc190b3RhbCkpOworCQkJICAgICh1bnNpZ25lZCBsb25nKSBCaXQyS0IoZGV2aWNlLT5yc190b3RhbCkpOwogCiAJLyogc2VlIGRyaXZlcnMvbWQvbWQuYwogCSAqIFdlIGRvIG5vdCB3YW50IHRvIG92ZXJmbG93LCBzbyB0aGUgb3JkZXIgb2Ygb3BlcmFuZHMgYW5kCkBAIC0xMTQsMTQgKzExNCwxNCBAQAogCSAqIGF0IGxlYXN0IChEUkJEX1NZTkNfTUFSS1MtMikqRFJCRF9TWU5DX01BUktfU1RFUCBvbGQsIGFuZCBoYXMgYXQKIAkgKiBsZWFzdCBEUkJEX1NZTkNfTUFSS19TVEVQIHRpbWUgYmVmb3JlIGl0IHdpbGwgYmUgbW9kaWZpZWQuICovCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIH4xOHMgYXZlcmFnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQlpID0gKG1kZXYtPnJzX2xhc3RfbWFyayArIDIpICUgRFJCRF9TWU5DX01BUktTOwotCWR0ID0gKGppZmZpZXMgLSBtZGV2LT5yc19tYXJrX3RpbWVbaV0pIC8gSFo7CisJaSA9IChkZXZpY2UtPnJzX2xhc3RfbWFyayArIDIpICUgRFJCRF9TWU5DX01BUktTOworCWR0ID0gKGppZmZpZXMgLSBkZXZpY2UtPnJzX21hcmtfdGltZVtpXSkgLyBIWjsKIAlpZiAoZHQgPiAoRFJCRF9TWU5DX01BUktfU1RFUCAqIERSQkRfU1lOQ19NQVJLUykpCiAJCXN0YWxsZWQgPSAxOwogCiAJaWYgKCFkdCkKIAkJZHQrKzsKLQlkYiA9IG1kZXYtPnJzX21hcmtfbGVmdFtpXSAtIHJzX2xlZnQ7CisJZGIgPSBkZXZpY2UtPnJzX21hcmtfbGVmdFtpXSAtIHJzX2xlZnQ7CiAJcnQgPSAoZHQgKiAocnNfbGVmdCAvIChkYi8xMDArMSkpKS8xMDA7IC8qIHNlY29uZHMgKi8KIAogCXNlcV9wcmludGYoc2VxLCAiZmluaXNoOiAlbHU6JTAybHU6JTAybHUiLApAQCAtMTM0LDExICsxMzQsMTEgQEAKIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIH4zcyBhdmVyYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCWlmIChwcm9jX2RldGFpbHMgPj0gMSkgewogCQkvKiB0aGlzIGlzIHdoYXQgZHJiZF9yc19zaG91bGRfc2xvd19kb3duKCkgdXNlcyAqLwotCQlpID0gKG1kZXYtPnJzX2xhc3RfbWFyayArIERSQkRfU1lOQ19NQVJLUy0xKSAlIERSQkRfU1lOQ19NQVJLUzsKLQkJZHQgPSAoamlmZmllcyAtIG1kZXYtPnJzX21hcmtfdGltZVtpXSkgLyBIWjsKKwkJaSA9IChkZXZpY2UtPnJzX2xhc3RfbWFyayArIERSQkRfU1lOQ19NQVJLUy0xKSAlIERSQkRfU1lOQ19NQVJLUzsKKwkJZHQgPSAoamlmZmllcyAtIGRldmljZS0+cnNfbWFya190aW1lW2ldKSAvIEhaOwogCQlpZiAoIWR0KQogCQkJZHQrKzsKLQkJZGIgPSBtZGV2LT5yc19tYXJrX2xlZnRbaV0gLSByc19sZWZ0OworCQlkYiA9IGRldmljZS0+cnNfbWFya19sZWZ0W2ldIC0gcnNfbGVmdDsKIAkJZGJkdCA9IEJpdDJLQihkYi9kdCk7CiAJCXNlcV9wcmludGZfd2l0aF90aG91c2FuZHNfZ3JvdXBpbmcoc2VxLCBkYmR0KTsKIAkJc2VxX3ByaW50ZihzZXEsICIgLS0gIik7CkBAIC0xNDcsMzQgKzE0NywzNCBAQAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsb25nIHRlcm0gYXZlcmFnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJLyogbWVhbiBzcGVlZCBzaW5jZSBzeW5jZXIgc3RhcnRlZAogCSAqIHdlIGRvIGFjY291bnQgZm9yIFBhdXNlZFN5bmMgcGVyaW9kcyAqLwotCWR0ID0gKGppZmZpZXMgLSBtZGV2LT5yc19zdGFydCAtIG1kZXYtPnJzX3BhdXNlZCkgLyBIWjsKKwlkdCA9IChqaWZmaWVzIC0gZGV2aWNlLT5yc19zdGFydCAtIGRldmljZS0+cnNfcGF1c2VkKSAvIEhaOwogCWlmIChkdCA9PSAwKQogCQlkdCA9IDE7Ci0JZGIgPSBtZGV2LT5yc190b3RhbCAtIHJzX2xlZnQ7CisJZGIgPSBkZXZpY2UtPnJzX3RvdGFsIC0gcnNfbGVmdDsKIAlkYmR0ID0gQml0MktCKGRiL2R0KTsKIAlzZXFfcHJpbnRmX3dpdGhfdGhvdXNhbmRzX2dyb3VwaW5nKHNlcSwgZGJkdCk7CiAJc2VxX3ByaW50ZihzZXEsICIpIik7CiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1NZTkNfVEFSR0VUIHx8Ci0JICAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUykgeworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19TWU5DX1RBUkdFVCB8fAorCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUykgewogCQlzZXFfcHJpbnRmKHNlcSwgIiB3YW50OiAiKTsKLQkJc2VxX3ByaW50Zl93aXRoX3Rob3VzYW5kc19ncm91cGluZyhzZXEsIG1kZXYtPmNfc3luY19yYXRlKTsKKwkJc2VxX3ByaW50Zl93aXRoX3Rob3VzYW5kc19ncm91cGluZyhzZXEsIGRldmljZS0+Y19zeW5jX3JhdGUpOwogCX0KIAlzZXFfcHJpbnRmKHNlcSwgIiBLL3NlYyVzXG4iLCBzdGFsbGVkID8gIiAoc3RhbGxlZCkiIDogIiIpOwogCiAJaWYgKHByb2NfZGV0YWlscyA+PSAxKSB7CiAJCS8qIDY0IGJpdDoKIAkJICogd2UgY29udmVydCB0byBzZWN0b3JzIGluIHRoZSBkaXNwbGF5IGJlbG93LiAqLwotCQl1bnNpZ25lZCBsb25nIGJtX2JpdHMgPSBkcmJkX2JtX2JpdHMobWRldik7CisJCXVuc2lnbmVkIGxvbmcgYm1fYml0cyA9IGRyYmRfYm1fYml0cyhkZXZpY2UpOwogCQl1bnNpZ25lZCBsb25nIGJpdF9wb3M7CiAJCXVuc2lnbmVkIGxvbmcgbG9uZyBzdG9wX3NlY3RvciA9IDA7Ci0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1MgfHwKLQkJICAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfVCkgewotCQkJYml0X3BvcyA9IGJtX2JpdHMgLSBtZGV2LT5vdl9sZWZ0OwotCQkJaWYgKHZlcmlmeV9jYW5fZG9fc3RvcF9zZWN0b3IobWRldikpCi0JCQkJc3RvcF9zZWN0b3IgPSBtZGV2LT5vdl9zdG9wX3NlY3RvcjsKKwkJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9TIHx8CisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfVCkgeworCQkJYml0X3BvcyA9IGJtX2JpdHMgLSBkZXZpY2UtPm92X2xlZnQ7CisJCQlpZiAodmVyaWZ5X2Nhbl9kb19zdG9wX3NlY3RvcihkZXZpY2UpKQorCQkJCXN0b3Bfc2VjdG9yID0gZGV2aWNlLT5vdl9zdG9wX3NlY3RvcjsKIAkJfSBlbHNlCi0JCQliaXRfcG9zID0gbWRldi0+Ym1fcmVzeW5jX2ZvOworCQkJYml0X3BvcyA9IGRldmljZS0+Ym1fcmVzeW5jX2ZvOwogCQkvKiBUb3RhbCBzZWN0b3JzIG1heSBiZSBzbGlnaHRseSBvZmYgZm9yIG9kZGx5CiAJCSAqIHNpemVkIGRldmljZXMuIFNvIHdoYXQuICovCiAJCXNlcV9wcmludGYoc2VxLApAQCAtMjAyLDcgKzIwMiw3IEBACiB7CiAJaW50IGksIHByZXZfaSA9IC0xOwogCWNvbnN0IGNoYXIgKnNuOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAljaGFyIHdwOwogCkBAIC0yMzYsNzIgKzIzNiw3MiBAQAogCSovCiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZtaW5vcnMsIG1kZXYsIGkpIHsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmRyYmRfZGV2aWNlcywgZGV2aWNlLCBpKSB7CiAJCWlmIChwcmV2X2kgIT0gaSAtIDEpCiAJCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CiAJCXByZXZfaSA9IGk7CiAKLQkJc24gPSBkcmJkX2Nvbm5fc3RyKG1kZXYtPnN0YXRlLmNvbm4pOworCQlzbiA9IGRyYmRfY29ubl9zdHIoZGV2aWNlLT5zdGF0ZS5jb25uKTsKIAotCQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1NUQU5EQUxPTkUgJiYKLQkJICAgIG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUyAmJgotCQkgICAgbWRldi0+c3RhdGUucm9sZSA9PSBSX1NFQ09OREFSWSkgeworCQlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1RBTkRBTE9ORSAmJgorCQkgICAgZGV2aWNlLT5zdGF0ZS5kaXNrID09IERfRElTS0xFU1MgJiYKKwkJICAgIGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1NFQ09OREFSWSkgewogCQkJc2VxX3ByaW50ZihzZXEsICIlMmQ6IGNzOlVuY29uZmlndXJlZFxuIiwgaSk7CiAJCX0gZWxzZSB7Ci0JCQkvKiByZXNldCBtZGV2LT5jb25nZXN0aW9uX3JlYXNvbiAqLwotCQkJYmRpX3J3X2Nvbmdlc3RlZCgmbWRldi0+cnFfcXVldWUtPmJhY2tpbmdfZGV2X2luZm8pOworCQkJLyogcmVzZXQgZGV2aWNlLT5jb25nZXN0aW9uX3JlYXNvbiAqLworCQkJYmRpX3J3X2Nvbmdlc3RlZCgmZGV2aWNlLT5ycV9xdWV1ZS0+YmFja2luZ19kZXZfaW5mbyk7CiAKLQkJCW5jID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZik7CisJCQluYyA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJCQl3cCA9IG5jID8gbmMtPndpcmVfcHJvdG9jb2wgLSBEUkJEX1BST1RfQSArICdBJyA6ICcgJzsKIAkJCXNlcV9wcmludGYoc2VxLAogCQkJICAgIiUyZDogY3M6JXMgcm86JXMvJXMgZHM6JXMvJXMgJWMgJWMlYyVjJWMlYyVjXG4iCiAJCQkgICAiICAgIG5zOiV1IG5yOiV1IGR3OiV1IGRyOiV1IGFsOiV1IGJtOiV1ICIKIAkJCSAgICJsbzolZCBwZTolZCB1YTolZCBhcDolZCBlcDolZCB3bzolYyIsCiAJCQkgICBpLCBzbiwKLQkJCSAgIGRyYmRfcm9sZV9zdHIobWRldi0+c3RhdGUucm9sZSksCi0JCQkgICBkcmJkX3JvbGVfc3RyKG1kZXYtPnN0YXRlLnBlZXIpLAotCQkJICAgZHJiZF9kaXNrX3N0cihtZGV2LT5zdGF0ZS5kaXNrKSwKLQkJCSAgIGRyYmRfZGlza19zdHIobWRldi0+c3RhdGUucGRzayksCisJCQkgICBkcmJkX3JvbGVfc3RyKGRldmljZS0+c3RhdGUucm9sZSksCisJCQkgICBkcmJkX3JvbGVfc3RyKGRldmljZS0+c3RhdGUucGVlciksCisJCQkgICBkcmJkX2Rpc2tfc3RyKGRldmljZS0+c3RhdGUuZGlzayksCisJCQkgICBkcmJkX2Rpc2tfc3RyKGRldmljZS0+c3RhdGUucGRzayksCiAJCQkgICB3cCwKLQkJCSAgIGRyYmRfc3VzcGVuZGVkKG1kZXYpID8gJ3MnIDogJ3InLAotCQkJICAgbWRldi0+c3RhdGUuYWZ0cl9pc3AgPyAnYScgOiAnLScsCi0JCQkgICBtZGV2LT5zdGF0ZS5wZWVyX2lzcCA/ICdwJyA6ICctJywKLQkJCSAgIG1kZXYtPnN0YXRlLnVzZXJfaXNwID8gJ3UnIDogJy0nLAotCQkJICAgbWRldi0+Y29uZ2VzdGlvbl9yZWFzb24gPzogJy0nLAotCQkJICAgdGVzdF9iaXQoQUxfU1VTUEVOREVELCAmbWRldi0+ZmxhZ3MpID8gJ3MnIDogJy0nLAotCQkJICAgbWRldi0+c2VuZF9jbnQvMiwKLQkJCSAgIG1kZXYtPnJlY3ZfY250LzIsCi0JCQkgICBtZGV2LT53cml0X2NudC8yLAotCQkJICAgbWRldi0+cmVhZF9jbnQvMiwKLQkJCSAgIG1kZXYtPmFsX3dyaXRfY250LAotCQkJICAgbWRldi0+Ym1fd3JpdF9jbnQsCi0JCQkgICBhdG9taWNfcmVhZCgmbWRldi0+bG9jYWxfY250KSwKLQkJCSAgIGF0b21pY19yZWFkKCZtZGV2LT5hcF9wZW5kaW5nX2NudCkgKwotCQkJICAgYXRvbWljX3JlYWQoJm1kZXYtPnJzX3BlbmRpbmdfY250KSwKLQkJCSAgIGF0b21pY19yZWFkKCZtZGV2LT51bmFja2VkX2NudCksCi0JCQkgICBhdG9taWNfcmVhZCgmbWRldi0+YXBfYmlvX2NudCksCi0JCQkgICBtZGV2LT50Y29ubi0+ZXBvY2hzLAotCQkJICAgd3JpdGVfb3JkZXJpbmdfY2hhcnNbbWRldi0+dGNvbm4tPndyaXRlX29yZGVyaW5nXQorCQkJICAgZHJiZF9zdXNwZW5kZWQoZGV2aWNlKSA/ICdzJyA6ICdyJywKKwkJCSAgIGRldmljZS0+c3RhdGUuYWZ0cl9pc3AgPyAnYScgOiAnLScsCisJCQkgICBkZXZpY2UtPnN0YXRlLnBlZXJfaXNwID8gJ3AnIDogJy0nLAorCQkJICAgZGV2aWNlLT5zdGF0ZS51c2VyX2lzcCA/ICd1JyA6ICctJywKKwkJCSAgIGRldmljZS0+Y29uZ2VzdGlvbl9yZWFzb24gPzogJy0nLAorCQkJICAgdGVzdF9iaXQoQUxfU1VTUEVOREVELCAmZGV2aWNlLT5mbGFncykgPyAncycgOiAnLScsCisJCQkgICBkZXZpY2UtPnNlbmRfY250LzIsCisJCQkgICBkZXZpY2UtPnJlY3ZfY250LzIsCisJCQkgICBkZXZpY2UtPndyaXRfY250LzIsCisJCQkgICBkZXZpY2UtPnJlYWRfY250LzIsCisJCQkgICBkZXZpY2UtPmFsX3dyaXRfY250LAorCQkJICAgZGV2aWNlLT5ibV93cml0X2NudCwKKwkJCSAgIGF0b21pY19yZWFkKCZkZXZpY2UtPmxvY2FsX2NudCksCisJCQkgICBhdG9taWNfcmVhZCgmZGV2aWNlLT5hcF9wZW5kaW5nX2NudCkgKworCQkJICAgYXRvbWljX3JlYWQoJmRldmljZS0+cnNfcGVuZGluZ19jbnQpLAorCQkJICAgYXRvbWljX3JlYWQoJmRldmljZS0+dW5hY2tlZF9jbnQpLAorCQkJICAgYXRvbWljX3JlYWQoJmRldmljZS0+YXBfYmlvX2NudCksCisJCQkgICBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5lcG9jaHMsCisJCQkgICB3cml0ZV9vcmRlcmluZ19jaGFyc1tmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT53cml0ZV9vcmRlcmluZ10KIAkJCSk7CiAJCQlzZXFfcHJpbnRmKHNlcSwgIiBvb3M6JWxsdVxuIiwKIAkJCQkgICBCaXQyS0IoKHVuc2lnbmVkIGxvbmcgbG9uZykKLQkJCQkJICAgZHJiZF9ibV90b3RhbF93ZWlnaHQobWRldikpKTsKKwkJCQkJICAgZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKSkpOwogCQl9Ci0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfU1lOQ19TT1VSQ0UgfHwKLQkJICAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19TWU5DX1RBUkdFVCB8fAotCQkgICAgbWRldi0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9TIHx8Ci0JCSAgICBtZGV2LT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpCi0JCQlkcmJkX3N5bmNlcl9wcm9ncmVzcyhtZGV2LCBzZXEpOworCQlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1lOQ19TT1VSQ0UgfHwKKwkJICAgIGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1NZTkNfVEFSR0VUIHx8CisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUyB8fAorCQkgICAgZGV2aWNlLT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpCisJCQlkcmJkX3N5bmNlcl9wcm9ncmVzcyhkZXZpY2UsIHNlcSk7CiAKLQkJaWYgKHByb2NfZGV0YWlscyA+PSAxICYmIGdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfRkFJTEVEKSkgewotCQkJbGNfc2VxX3ByaW50Zl9zdGF0cyhzZXEsIG1kZXYtPnJlc3luYyk7Ci0JCQlsY19zZXFfcHJpbnRmX3N0YXRzKHNlcSwgbWRldi0+YWN0X2xvZyk7Ci0JCQlwdXRfbGRldihtZGV2KTsKKwkJaWYgKHByb2NfZGV0YWlscyA+PSAxICYmIGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKSB7CisJCQlsY19zZXFfcHJpbnRmX3N0YXRzKHNlcSwgZGV2aWNlLT5yZXN5bmMpOworCQkJbGNfc2VxX3ByaW50Zl9zdGF0cyhzZXEsIGRldmljZS0+YWN0X2xvZyk7CisJCQlwdXRfbGRldihkZXZpY2UpOwogCQl9CiAKIAkJaWYgKHByb2NfZGV0YWlscyA+PSAyKSB7Ci0JCQlpZiAobWRldi0+cmVzeW5jKSB7Ci0JCQkJbGNfc2VxX2R1bXBfZGV0YWlscyhzZXEsIG1kZXYtPnJlc3luYywgInJzX2xlZnQiLAorCQkJaWYgKGRldmljZS0+cmVzeW5jKSB7CisJCQkJbGNfc2VxX2R1bXBfZGV0YWlscyhzZXEsIGRldmljZS0+cmVzeW5jLCAicnNfbGVmdCIsCiAJCQkJCXJlc3luY19kdW1wX2RldGFpbCk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3Byb3RvY29sLmggYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMDRlYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9wcm90b2NvbC5oCkBAIC0wLDAgKzEsMjk1IEBACisjaWZuZGVmIF9fRFJCRF9QUk9UT0NPTF9ICisjZGVmaW5lIF9fRFJCRF9QUk9UT0NPTF9ICisKK2VudW0gZHJiZF9wYWNrZXQgeworCS8qIHJlY2VpdmVyIChkYXRhIHNvY2tldCkgKi8KKwlQX0RBVEEJCSAgICAgID0gMHgwMCwKKwlQX0RBVEFfUkVQTFkJICAgICAgPSAweDAxLCAvKiBSZXNwb25zZSB0byBQX0RBVEFfUkVRVUVTVCAqLworCVBfUlNfREFUQV9SRVBMWQkgICAgICA9IDB4MDIsIC8qIFJlc3BvbnNlIHRvIFBfUlNfREFUQV9SRVFVRVNUICovCisJUF9CQVJSSUVSCSAgICAgID0gMHgwMywKKwlQX0JJVE1BUAkgICAgICA9IDB4MDQsCisJUF9CRUNPTUVfU1lOQ19UQVJHRVQgID0gMHgwNSwKKwlQX0JFQ09NRV9TWU5DX1NPVVJDRSAgPSAweDA2LAorCVBfVU5QTFVHX1JFTU9URQkgICAgICA9IDB4MDcsIC8qIFVzZWQgYXQgdmFyaW91cyB0aW1lcyB0byBoaW50IHRoZSBwZWVyICovCisJUF9EQVRBX1JFUVVFU1QJICAgICAgPSAweDA4LCAvKiBVc2VkIHRvIGFzayBmb3IgYSBkYXRhIGJsb2NrICovCisJUF9SU19EQVRBX1JFUVVFU1QgICAgID0gMHgwOSwgLyogVXNlZCB0byBhc2sgZm9yIGEgZGF0YSBibG9jayBmb3IgcmVzeW5jICovCisJUF9TWU5DX1BBUkFNCSAgICAgID0gMHgwYSwKKwlQX1BST1RPQ09MCSAgICAgID0gMHgwYiwKKwlQX1VVSURTCQkgICAgICA9IDB4MGMsCisJUF9TSVpFUwkJICAgICAgPSAweDBkLAorCVBfU1RBVEUJCSAgICAgID0gMHgwZSwKKwlQX1NZTkNfVVVJRAkgICAgICA9IDB4MGYsCisJUF9BVVRIX0NIQUxMRU5HRSAgICAgID0gMHgxMCwKKwlQX0FVVEhfUkVTUE9OU0UJICAgICAgPSAweDExLAorCVBfU1RBVEVfQ0hHX1JFUQkgICAgICA9IDB4MTIsCisKKwkvKiBhc2VuZGVyIChtZXRhIHNvY2tldCAqLworCVBfUElORwkJICAgICAgPSAweDEzLAorCVBfUElOR19BQ0sJICAgICAgPSAweDE0LAorCVBfUkVDVl9BQ0sJICAgICAgPSAweDE1LCAvKiBVc2VkIGluIHByb3RvY29sIEIgKi8KKwlQX1dSSVRFX0FDSwkgICAgICA9IDB4MTYsIC8qIFVzZWQgaW4gcHJvdG9jb2wgQyAqLworCVBfUlNfV1JJVEVfQUNLCSAgICAgID0gMHgxNywgLyogSXMgYSBQX1dSSVRFX0FDSywgYWRkaXRpb25hbGx5IGNhbGwgc2V0X2luX3N5bmMoKS4gKi8KKwlQX1NVUEVSU0VERUQJICAgICAgPSAweDE4LCAvKiBVc2VkIGluIHByb3RvIEMsIHR3by1wcmltYXJpZXMgY29uZmxpY3QgZGV0ZWN0aW9uICovCisJUF9ORUdfQUNLCSAgICAgID0gMHgxOSwgLyogU2VudCBpZiBsb2NhbCBkaXNrIGlzIHVudXNhYmxlICovCisJUF9ORUdfRFJFUExZCSAgICAgID0gMHgxYSwgLyogTG9jYWwgZGlzayBpcyBicm9rZW4uLi4gKi8KKwlQX05FR19SU19EUkVQTFkJICAgICAgPSAweDFiLCAvKiBMb2NhbCBkaXNrIGlzIGJyb2tlbi4uLiAqLworCVBfQkFSUklFUl9BQ0sJICAgICAgPSAweDFjLAorCVBfU1RBVEVfQ0hHX1JFUExZICAgICA9IDB4MWQsCisKKwkvKiAibmV3IiBjb21tYW5kcywgbm8gbG9uZ2VyIGZpdHRpbmcgaW50byB0aGUgb3JkZXJpbmcgc2NoZW1lIGFib3ZlICovCisKKwlQX09WX1JFUVVFU1QJICAgICAgPSAweDFlLCAvKiBkYXRhIHNvY2tldCAqLworCVBfT1ZfUkVQTFkJICAgICAgPSAweDFmLAorCVBfT1ZfUkVTVUxUCSAgICAgID0gMHgyMCwgLyogbWV0YSBzb2NrZXQgKi8KKwlQX0NTVU1fUlNfUkVRVUVTVCAgICAgPSAweDIxLCAvKiBkYXRhIHNvY2tldCAqLworCVBfUlNfSVNfSU5fU1lOQwkgICAgICA9IDB4MjIsIC8qIG1ldGEgc29ja2V0ICovCisJUF9TWU5DX1BBUkFNODkJICAgICAgPSAweDIzLCAvKiBkYXRhIHNvY2tldCwgcHJvdG9jb2wgdmVyc2lvbiA4OSByZXBsYWNlbWVudCBmb3IgUF9TWU5DX1BBUkFNICovCisJUF9DT01QUkVTU0VEX0JJVE1BUCAgID0gMHgyNCwgLyogY29tcHJlc3NlZCBvciBvdGhlcndpc2UgZW5jb2RlZCBiaXRtYXAgdHJhbnNmZXIgKi8KKwkvKiBQX0NLUFRfRkVOQ0VfUkVRICAgICAgPSAweDI1LCAqIGN1cnJlbnRseSByZXNlcnZlZCBmb3IgcHJvdG9jb2wgRCAqLworCS8qIFBfQ0tQVF9ESVNBQkxFX1JFUSAgICA9IDB4MjYsICogY3VycmVudGx5IHJlc2VydmVkIGZvciBwcm90b2NvbCBEICovCisJUF9ERUxBWV9QUk9CRSAgICAgICAgID0gMHgyNywgLyogaXMgdXNlZCBvbiBCT1RIIHNvY2tldHMgKi8KKwlQX09VVF9PRl9TWU5DICAgICAgICAgPSAweDI4LCAvKiBNYXJrIGFzIG91dCBvZiBzeW5jIChPdXRydW5uaW5nKSwgZGF0YSBzb2NrZXQgKi8KKwlQX1JTX0NBTkNFTCAgICAgICAgICAgPSAweDI5LCAvKiBtZXRhOiBVc2VkIHRvIGNhbmNlbCBSU19EQVRBX1JFUVVFU1QgcGFja2V0IGJ5IFN5bmNTb3VyY2UgKi8KKwlQX0NPTk5fU1RfQ0hHX1JFUSAgICAgPSAweDJhLCAvKiBkYXRhIHNvY2s6IENvbm5lY3Rpb24gd2lkZSBzdGF0ZSByZXF1ZXN0ICovCisJUF9DT05OX1NUX0NIR19SRVBMWSAgID0gMHgyYiwgLyogbWV0YSBzb2NrOiBDb25uZWN0aW9uIHNpZGUgc3RhdGUgcmVxIHJlcGx5ICovCisJUF9SRVRSWV9XUklURQkgICAgICA9IDB4MmMsIC8qIFByb3RvY29sIEM6IHJldHJ5IGNvbmZsaWN0aW5nIHdyaXRlIHJlcXVlc3QgKi8KKwlQX1BST1RPQ09MX1VQREFURSAgICAgPSAweDJkLCAvKiBkYXRhIHNvY2s6IGlzIHVzZWQgaW4gZXN0YWJsaXNoZWQgY29ubmVjdGlvbnMgKi8KKworCVBfTUFZX0lHTk9SRQkgICAgICA9IDB4MTAwLCAvKiBGbGFnIHRvIHRlc3QgaWYgKGNtZCA+IFBfTUFZX0lHTk9SRSkgLi4uICovCisJUF9NQVhfT1BUX0NNRAkgICAgICA9IDB4MTAxLAorCisJLyogc3BlY2lhbCBjb21tYW5kIGlkcyBmb3IgaGFuZHNoYWtlICovCisKKwlQX0lOSVRJQUxfTUVUQQkgICAgICA9IDB4ZmZmMSwgLyogRmlyc3QgUGFja2V0IG9uIHRoZSBNZXRhU29jayAqLworCVBfSU5JVElBTF9EQVRBCSAgICAgID0gMHhmZmYyLCAvKiBGaXJzdCBQYWNrZXQgb24gdGhlIFNvY2tldCAqLworCisJUF9DT05ORUNUSU9OX0ZFQVRVUkVTID0gMHhmZmZlCS8qIEZJWEVEIGZvciB0aGUgbmV4dCBjZW50dXJ5ISAqLworfTsKKworI2lmbmRlZiBfX3BhY2tlZAorI2RlZmluZSBfX3BhY2tlZCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorI2VuZGlmCisKKy8qIFRoaXMgaXMgdGhlIGxheW91dCBmb3IgYSBwYWNrZXQgb24gdGhlIHdpcmUuCisgKiBUaGUgYnl0ZW9yZGVyIGlzIHRoZSBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKiAgICAgKGV4Y2VwdCBibG9ja19pZCBhbmQgYmFycmllciBmaWVsZHMuCisgKgl0aGVzZSBhcmUgcG9pbnRlcnMgdG8gbG9jYWwgc3RydWN0cworICoJYW5kIGhhdmUgbm8gcmVsZXZhbmNlIGZvciB0aGUgcGFydG5lciwKKyAqCXdoaWNoIGp1c3QgZWNob2VzIHRoZW0gYXMgcmVjZWl2ZWQuKQorICoKKyAqIE5PVEUgdGhhdCB0aGUgcGF5bG9hZCBzdGFydHMgYXQgYSBsb25nIGFsaWduZWQgb2Zmc2V0LAorICogcmVnYXJkbGVzcyBvZiAzMiBvciA2NCBiaXQgYXJjaCEKKyAqLworc3RydWN0IHBfaGVhZGVyODAgeworCXUzMgkgIG1hZ2ljOworCXUxNgkgIGNvbW1hbmQ7CisJdTE2CSAgbGVuZ3RoOwkvKiBieXRlcyBvZiBkYXRhIGFmdGVyIHRoaXMgaGVhZGVyICovCit9IF9fcGFja2VkOworCisvKiBIZWFkZXIgZm9yIGJpZyBwYWNrZXRzLCBVc2VkIGZvciBkYXRhIHBhY2tldHMgZXhjZWVkaW5nIDY0a0IgKi8KK3N0cnVjdCBwX2hlYWRlcjk1IHsKKwl1MTYJICBtYWdpYzsJLyogdXNlIERSQkRfTUFHSUNfQklHIGhlcmUgKi8KKwl1MTYJICBjb21tYW5kOworCXUzMgkgIGxlbmd0aDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX2hlYWRlcjEwMCB7CisJdTMyCSAgbWFnaWM7CisJdTE2CSAgdm9sdW1lOworCXUxNgkgIGNvbW1hbmQ7CisJdTMyCSAgbGVuZ3RoOworCXUzMgkgIHBhZDsKK30gX19wYWNrZWQ7CisKKy8qIHRoZXNlIGRlZmluZXMgbXVzdCBub3QgYmUgY2hhbmdlZCB3aXRob3V0IGNoYW5naW5nIHRoZSBwcm90b2NvbCB2ZXJzaW9uICovCisjZGVmaW5lIERQX0hBUkRCQVJSSUVSCSAgICAgIDEgLyogZGVwcmljYXRlZCAqLworI2RlZmluZSBEUF9SV19TWU5DCSAgICAgIDIgLyogZXF1YWxzIFJFUV9TWU5DICAgICovCisjZGVmaW5lIERQX01BWV9TRVRfSU5fU1lOQyAgICA0CisjZGVmaW5lIERQX1VOUExVRyAgICAgICAgICAgICA4IC8qIG5vdCB1c2VkIGFueW1vcmUgICAqLworI2RlZmluZSBEUF9GVUEgICAgICAgICAgICAgICAxNiAvKiBlcXVhbHMgUkVRX0ZVQSAgICAgKi8KKyNkZWZpbmUgRFBfRkxVU0ggICAgICAgICAgICAgMzIgLyogZXF1YWxzIFJFUV9GTFVTSCAgICovCisjZGVmaW5lIERQX0RJU0NBUkQgICAgICAgICAgIDY0IC8qIGVxdWFscyBSRVFfRElTQ0FSRCAqLworI2RlZmluZSBEUF9TRU5EX1JFQ0VJVkVfQUNLIDEyOCAvKiBUaGlzIGlzIGEgcHJvdG8gQiB3cml0ZSByZXF1ZXN0ICovCisjZGVmaW5lIERQX1NFTkRfV1JJVEVfQUNLICAgMjU2IC8qIFRoaXMgaXMgYSBwcm90byBDIHdyaXRlIHJlcXVlc3QgKi8KKworc3RydWN0IHBfZGF0YSB7CisJdTY0CSAgICBzZWN0b3I7ICAgIC8qIDY0IGJpdHMgc2VjdG9yIG51bWJlciAqLworCXU2NAkgICAgYmxvY2tfaWQ7ICAvKiB0byBpZGVudGlmeSB0aGUgcmVxdWVzdCBpbiBwcm90b2NvbCBCJkMgKi8KKwl1MzIJICAgIHNlcV9udW07CisJdTMyCSAgICBkcF9mbGFnczsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBjb21tYW5kcyB3aGljaCBzaGFyZSBhIHN0cnVjdDoKKyAqICBwX2Jsb2NrX2FjazoKKyAqICAgUF9SRUNWX0FDSyAocHJvdG8gQiksIFBfV1JJVEVfQUNLIChwcm90byBDKSwKKyAqICAgUF9TVVBFUlNFREVEIChwcm90byBDLCB0d28tcHJpbWFyaWVzIGNvbmZsaWN0IGRldGVjdGlvbikKKyAqICBwX2Jsb2NrX3JlcToKKyAqICAgUF9EQVRBX1JFUVVFU1QsIFBfUlNfREFUQV9SRVFVRVNUCisgKi8KK3N0cnVjdCBwX2Jsb2NrX2FjayB7CisJdTY0CSAgICBzZWN0b3I7CisJdTY0CSAgICBibG9ja19pZDsKKwl1MzIJICAgIGJsa3NpemU7CisJdTMyCSAgICBzZXFfbnVtOworfSBfX3BhY2tlZDsKKworc3RydWN0IHBfYmxvY2tfcmVxIHsKKwl1NjQgc2VjdG9yOworCXU2NCBibG9ja19pZDsKKwl1MzIgYmxrc2l6ZTsKKwl1MzIgcGFkOwkvKiB0byBtdWx0aXBsZSBvZiA4IEJ5dGUgKi8KK30gX19wYWNrZWQ7CisKKy8qCisgKiBjb21tYW5kcyB3aXRoIHRoZWlyIG93biBzdHJ1Y3QgZm9yIGFkZGl0aW9uYWwgZmllbGRzOgorICogICBQX0NPTk5FQ1RJT05fRkVBVFVSRVMKKyAqICAgUF9CQVJSSUVSCisgKiAgIFBfQkFSUklFUl9BQ0sKKyAqICAgUF9TWU5DX1BBUkFNCisgKiAgIFJlcG9ydFBhcmFtcworICovCisKK3N0cnVjdCBwX2Nvbm5lY3Rpb25fZmVhdHVyZXMgeworCXUzMiBwcm90b2NvbF9taW47CisJdTMyIGZlYXR1cmVfZmxhZ3M7CisJdTMyIHByb3RvY29sX21heDsKKworCS8qIHNob3VsZCBiZSBtb3JlIHRoYW4gZW5vdWdoIGZvciBmdXR1cmUgZW5oYW5jZW1lbnRzCisJICogZm9yIG5vdywgZmVhdHVyZV9mbGFncyBhbmQgdGhlIHJlc2VydmVkIGFycmF5IHNoYWxsIGJlIHplcm8uCisJICovCisKKwl1MzIgX3BhZDsKKwl1NjQgcmVzZXJ2ZWRbN107Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcF9iYXJyaWVyIHsKKwl1MzIgYmFycmllcjsJLyogYmFycmllciBudW1iZXIgX2hhbmRsZV8gb25seSAqLworCXUzMiBwYWQ7CS8qIHRvIG11bHRpcGxlIG9mIDggQnl0ZSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IHBfYmFycmllcl9hY2sgeworCXUzMiBiYXJyaWVyOworCXUzMiBzZXRfc2l6ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX3JzX3BhcmFtIHsKKwl1MzIgcmVzeW5jX3JhdGU7CisKKwkgICAgICAvKiBTaW5jZSBwcm90b2NvbCB2ZXJzaW9uIDg4IGFuZCBoaWdoZXIuICovCisJY2hhciB2ZXJpZnlfYWxnWzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHBfcnNfcGFyYW1fODkgeworCXUzMiByZXN5bmNfcmF0ZTsKKwkvKiBwcm90b2NvbCB2ZXJzaW9uIDg5OiAqLworCWNoYXIgdmVyaWZ5X2FsZ1tTSEFSRURfU0VDUkVUX01BWF07CisJY2hhciBjc3Vtc19hbGdbU0hBUkVEX1NFQ1JFVF9NQVhdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHBfcnNfcGFyYW1fOTUgeworCXUzMiByZXN5bmNfcmF0ZTsKKwljaGFyIHZlcmlmeV9hbGdbU0hBUkVEX1NFQ1JFVF9NQVhdOworCWNoYXIgY3N1bXNfYWxnW1NIQVJFRF9TRUNSRVRfTUFYXTsKKwl1MzIgY19wbGFuX2FoZWFkOworCXUzMiBjX2RlbGF5X3RhcmdldDsKKwl1MzIgY19maWxsX3RhcmdldDsKKwl1MzIgY19tYXhfcmF0ZTsKK30gX19wYWNrZWQ7CisKK2VudW0gZHJiZF9jb25uX2ZsYWdzIHsKKwlDRl9ESVNDQVJEX01ZX0RBVEEgPSAxLAorCUNGX0RSWV9SVU4gPSAyLAorfTsKKworc3RydWN0IHBfcHJvdG9jb2wgeworCXUzMiBwcm90b2NvbDsKKwl1MzIgYWZ0ZXJfc2JfMHA7CisJdTMyIGFmdGVyX3NiXzFwOworCXUzMiBhZnRlcl9zYl8ycDsKKwl1MzIgY29ubl9mbGFnczsKKwl1MzIgdHdvX3ByaW1hcmllczsKKworCS8qIFNpbmNlIHByb3RvY29sIHZlcnNpb24gODcgYW5kIGhpZ2hlci4gKi8KKwljaGFyIGludGVncml0eV9hbGdbMF07CisKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX3V1aWRzIHsKKwl1NjQgdXVpZFtVSV9FWFRFTkRFRF9TSVpFXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX3JzX3V1aWQgeworCXU2NAkgICAgdXVpZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX3NpemVzIHsKKwl1NjQJICAgIGRfc2l6ZTsgIC8qIHNpemUgb2YgZGlzayAqLworCXU2NAkgICAgdV9zaXplOyAgLyogdXNlciByZXF1ZXN0ZWQgc2l6ZSAqLworCXU2NAkgICAgY19zaXplOyAgLyogY3VycmVudCBleHBvcnRlZCBzaXplICovCisJdTMyCSAgICBtYXhfYmlvX3NpemU7ICAvKiBNYXhpbWFsIHNpemUgb2YgYSBCSU8gKi8KKwl1MTYJICAgIHF1ZXVlX29yZGVyX3R5cGU7ICAvKiBub3QgeWV0IGltcGxlbWVudGVkIGluIERSQkQqLworCXUxNgkgICAgZGRzX2ZsYWdzOyAvKiB1c2UgZW51bSBkZHNfZmxhZ3MgaGVyZS4gKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX3N0YXRlIHsKKwl1MzIJICAgIHN0YXRlOworfSBfX3BhY2tlZDsKKworc3RydWN0IHBfcmVxX3N0YXRlIHsKKwl1MzIJICAgIG1hc2s7CisJdTMyCSAgICB2YWw7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcF9yZXFfc3RhdGVfcmVwbHkgeworCXUzMgkgICAgcmV0Y29kZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX2RyYmQwNl9wYXJhbSB7CisJdTY0CSAgc2l6ZTsKKwl1MzIJICBzdGF0ZTsKKwl1MzIJICBibGtzaXplOworCXUzMgkgIHByb3RvY29sOworCXUzMgkgIHZlcnNpb247CisJdTMyCSAgZ2VuX2NudFs1XTsKKwl1MzIJICBiaXRfbWFwX2dlbls1XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX2Jsb2NrX2Rlc2MgeworCXU2NCBzZWN0b3I7CisJdTMyIGJsa3NpemU7CisJdTMyIHBhZDsJLyogdG8gbXVsdGlwbGUgb2YgOCBCeXRlICovCit9IF9fcGFja2VkOworCisvKiBWYWxpZCB2YWx1ZXMgZm9yIHRoZSBlbmNvZGluZyBmaWVsZC4KKyAqIEJ1bXAgcHJvdG8gdmVyc2lvbiB3aGVuIGNoYW5naW5nIHRoaXMuICovCitlbnVtIGRyYmRfYml0bWFwX2NvZGUgeworCS8qIFJMRV9WTElfQnl0ZXMgPSAwLAorCSAqIGFuZCBvdGhlciBiaXQgdmFyaWFudHMgaGFkIGJlZW4gZGVmaW5lZCBkdXJpbmcKKwkgKiBhbGdvcml0aG0gZXZhbHVhdGlvbi4gKi8KKwlSTEVfVkxJX0JpdHMgPSAyLAorfTsKKworc3RydWN0IHBfY29tcHJlc3NlZF9ibSB7CisJLyogKGVuY29kaW5nICYgMHgwZik6IGFjdHVhbCBlbmNvZGluZywgc2VlIGVudW0gZHJiZF9iaXRtYXBfY29kZQorCSAqIChlbmNvZGluZyAmIDB4ODApOiBwb2xhcml0eSAoc2V0L3Vuc2V0KSBvZiBmaXJzdCBydW5sZW5ndGgKKwkgKiAoKGVuY29kaW5nID4+IDQpICYgMHgwNyk6IHBhZF9iaXRzLCBudW1iZXIgb2YgdHJhaWxpbmcgemVybyBiaXRzCisJICogdXNlZCB0byBwYWQgdXAgdG8gaGVhZC5sZW5ndGggYnl0ZXMKKwkgKi8KKwl1OCBlbmNvZGluZzsKKworCXU4IGNvZGVbMF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcF9kZWxheV9wcm9iZTkzIHsKKwl1MzIgICAgIHNlcV9udW07IC8qIHNlcXVlbmNlIG51bWJlciB0byBtYXRjaCB0aGUgdHdvIHByb2JlIHBhY2tldHMgKi8KKwl1MzIgICAgIG9mZnNldDsgIC8qIHVzZWNzIHRoZSBwcm9iZSBnb3Qgc2VudCBhZnRlciB0aGUgcmVmZXJlbmNlIHRpbWUgcG9pbnQgKi8KK30gX19wYWNrZWQ7CisKKy8qCisgKiBCaXRtYXAgcGFja2V0cyBuZWVkIHRvIGZpdCB3aXRoaW4gYSBzaW5nbGUgcGFnZSBvbiB0aGUgc2VuZGVyIGFuZCByZWNlaXZlciwKKyAqIHNvIHdlIGFyZSBsaW1pdGVkIHRvIDQgS2lCIChhbmQgbm90IHRvIFBBR0VfU0laRSwgd2hpY2ggY2FuIGJlIGJpZ2dlcikuCisgKi8KKyNkZWZpbmUgRFJCRF9TT0NLRVRfQlVGRkVSX1NJWkUgNDA5NgorCisjZW5kaWYgIC8qIF9fRFJCRF9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVjZWl2ZXIuYwppbmRleCBkMDczMzA1Li4xOGM3NmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlY2VpdmVyLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgImRyYmRfaW50LmgiCisjaW5jbHVkZSAiZHJiZF9wcm90b2NvbC5oIgogI2luY2x1ZGUgImRyYmRfcmVxLmgiCiAKICNpbmNsdWRlICJkcmJkX3ZsaS5oIgpAQCAtNjEsMTEgKzYyLDExIEBACiAJRkVfUkVDWUNMRUQsCiB9OwogCi1zdGF0aWMgaW50IGRyYmRfZG9fZmVhdHVyZXMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKLXN0YXRpYyBpbnQgZHJiZF9kb19hdXRoKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1zdGF0aWMgaW50IGRyYmRfZGlzY29ubmVjdGVkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOworc3RhdGljIGludCBkcmJkX2RvX2ZlYXR1cmVzKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworc3RhdGljIGludCBkcmJkX2RvX2F1dGgoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitzdGF0aWMgaW50IGRyYmRfZGlzY29ubmVjdGVkKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICopOwogCi1zdGF0aWMgZW51bSBmaW5pc2hfZXBvY2ggZHJiZF9tYXlfZmluaXNoX2Vwb2NoKHN0cnVjdCBkcmJkX3Rjb25uICosIHN0cnVjdCBkcmJkX2Vwb2NoICosIGVudW0gZXBvY2hfZXZlbnQpOworc3RhdGljIGVudW0gZmluaXNoX2Vwb2NoIGRyYmRfbWF5X2ZpbmlzaF9lcG9jaChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICosIHN0cnVjdCBkcmJkX2Vwb2NoICosIGVudW0gZXBvY2hfZXZlbnQpOwogc3RhdGljIGludCBlX2VuZF9ibG9jayhzdHJ1Y3QgZHJiZF93b3JrICosIGludCk7CiAKIApAQCAtMTUwLDcgKzE1MSw3IEBACiAJKmhlYWQgPSBjaGFpbl9maXJzdDsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICpfX2RyYmRfYWxsb2NfcGFnZXMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqX19kcmJkX2FsbG9jX3BhZ2VzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbnVtYmVyKQogewogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKQEAgLTE5Niw0MSArMTk3LDM5IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIHJlY2xhaW1fZmluaXNoZWRfbmV0X3BlZXJfcmVxcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIHZvaWQgcmVjbGFpbV9maW5pc2hlZF9uZXRfcGVlcl9yZXFzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICp0b19iZV9mcmVlZCkKIHsKLQlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxOwotCXN0cnVjdCBsaXN0X2hlYWQgKmxlLCAqdGxlOworCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEsICp0bXA7CiAKIAkvKiBUaGUgRUVzIGFyZSBhbHdheXMgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gU2luY2UKIAkgICB0aGV5IGFyZSBzZW50IGluIG9yZGVyIG92ZXIgdGhlIHdpcmUsIHRoZXkgaGF2ZSB0byBmaW5pc2gKIAkgICBpbiBvcmRlci4gQXMgc29vbiBhcyB3ZSBzZWUgdGhlIGZpcnN0IG5vdCBmaW5pc2hlZCB3ZSBjYW4KIAkgICBzdG9wIHRvIGV4YW1pbmUgdGhlIGxpc3QuLi4gKi8KIAotCWxpc3RfZm9yX2VhY2hfc2FmZShsZSwgdGxlLCAmbWRldi0+bmV0X2VlKSB7Ci0JCXBlZXJfcmVxID0gbGlzdF9lbnRyeShsZSwgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0LCB3Lmxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwZWVyX3JlcSwgdG1wLCAmZGV2aWNlLT5uZXRfZWUsIHcubGlzdCkgewogCQlpZiAoZHJiZF9wZWVyX3JlcV9oYXNfYWN0aXZlX3BhZ2UocGVlcl9yZXEpKQogCQkJYnJlYWs7Ci0JCWxpc3RfbW92ZShsZSwgdG9fYmVfZnJlZWQpOworCQlsaXN0X21vdmUoJnBlZXJfcmVxLT53Lmxpc3QsIHRvX2JlX2ZyZWVkKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGRyYmRfa2lja19sb19hbmRfcmVjbGFpbV9uZXQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyB2b2lkIGRyYmRfa2lja19sb19hbmRfcmVjbGFpbV9uZXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJTElTVF9IRUFEKHJlY2xhaW1lZCk7CiAJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSwgKnQ7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCXJlY2xhaW1fZmluaXNoZWRfbmV0X3BlZXJfcmVxcyhtZGV2LCAmcmVjbGFpbWVkKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCXJlY2xhaW1fZmluaXNoZWRfbmV0X3BlZXJfcmVxcyhkZXZpY2UsICZyZWNsYWltZWQpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBlZXJfcmVxLCB0LCAmcmVjbGFpbWVkLCB3Lmxpc3QpCi0JCWRyYmRfZnJlZV9uZXRfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOworCQlkcmJkX2ZyZWVfbmV0X3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOwogfQogCiAvKioKICAqIGRyYmRfYWxsb2NfcGFnZXMoKSAtIFJldHVybnMgQG51bWJlciBwYWdlcywgcmV0cmllcyBmb3JldmVyIChvciB1bnRpbCBzaWduYWxsZWQpCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBudW1iZXI6CW51bWJlciBvZiBwYWdlcyByZXF1ZXN0ZWQKICAqIEByZXRyeToJd2hldGhlciB0byByZXRyeSwgaWYgbm90IGVub3VnaCBwYWdlcyBhcmUgYXZhaWxhYmxlIHJpZ2h0IG5vdwogICoKQEAgLTI0MCw5ICsyMzksMTAgQEAKICAqCiAgKiBSZXR1cm5zIGEgcGFnZSBjaGFpbiBsaW5rZWQgdmlhIHBhZ2UtPnByaXZhdGUuCiAgKi8KLXN0cnVjdCBwYWdlICpkcmJkX2FsbG9jX3BhZ2VzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGludCBudW1iZXIsCitzdHJ1Y3QgcGFnZSAqZHJiZF9hbGxvY19wYWdlcyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHVuc2lnbmVkIGludCBudW1iZXIsCiAJCQkgICAgICBib29sIHJldHJ5KQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAlERUZJTkVfV0FJVCh3YWl0KTsKQEAgLTI1MSwyMCArMjUxLDIwIEBACiAJLyogWWVzLCB3ZSBtYXkgcnVuIHVwIHRvIEBudW1iZXIgb3ZlciBtYXhfYnVmZmVycy4gSWYgd2UKIAkgKiBmb2xsb3cgaXQgc3RyaWN0bHksIHRoZSBhZG1pbiB3aWxsIGdldCBpdCB3cm9uZyBhbnl3YXlzLiAqLwogCXJjdV9yZWFkX2xvY2soKTsKLQluYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpOworCW5jID0gcmN1X2RlcmVmZXJlbmNlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJbXhiID0gbmMgPyBuYy0+bWF4X2J1ZmZlcnMgOiAxMDAwMDAwOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JaWYgKGF0b21pY19yZWFkKCZtZGV2LT5wcF9pbl91c2UpIDwgbXhiKQotCQlwYWdlID0gX19kcmJkX2FsbG9jX3BhZ2VzKG1kZXYsIG51bWJlcik7CisJaWYgKGF0b21pY19yZWFkKCZkZXZpY2UtPnBwX2luX3VzZSkgPCBteGIpCisJCXBhZ2UgPSBfX2RyYmRfYWxsb2NfcGFnZXMoZGV2aWNlLCBudW1iZXIpOwogCiAJd2hpbGUgKHBhZ2UgPT0gTlVMTCkgewogCQlwcmVwYXJlX3RvX3dhaXQoJmRyYmRfcHBfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CiAKLQkJZHJiZF9raWNrX2xvX2FuZF9yZWNsYWltX25ldChtZGV2KTsKKwkJZHJiZF9raWNrX2xvX2FuZF9yZWNsYWltX25ldChkZXZpY2UpOwogCi0JCWlmIChhdG9taWNfcmVhZCgmbWRldi0+cHBfaW5fdXNlKSA8IG14YikgewotCQkJcGFnZSA9IF9fZHJiZF9hbGxvY19wYWdlcyhtZGV2LCBudW1iZXIpOworCQlpZiAoYXRvbWljX3JlYWQoJmRldmljZS0+cHBfaW5fdXNlKSA8IG14YikgeworCQkJcGFnZSA9IF9fZHJiZF9hbGxvY19wYWdlcyhkZXZpY2UsIG51bWJlcik7CiAJCQlpZiAocGFnZSkKIAkJCQlicmVhazsKIAkJfQpAQCAtMjczLDcgKzI3Myw3IEBACiAJCQlicmVhazsKIAogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCWRldl93YXJuKERFViwgImRyYmRfYWxsb2NfcGFnZXMgaW50ZXJydXB0ZWQhXG4iKTsKKwkJCWRyYmRfd2FybihkZXZpY2UsICJkcmJkX2FsbG9jX3BhZ2VzIGludGVycnVwdGVkIVxuIik7CiAJCQlicmVhazsKIAkJfQogCkBAIC0yODIsMTcgKzI4MiwxNyBAQAogCWZpbmlzaF93YWl0KCZkcmJkX3BwX3dhaXQsICZ3YWl0KTsKIAogCWlmIChwYWdlKQotCQlhdG9taWNfYWRkKG51bWJlciwgJm1kZXYtPnBwX2luX3VzZSk7CisJCWF0b21pY19hZGQobnVtYmVyLCAmZGV2aWNlLT5wcF9pbl91c2UpOwogCXJldHVybiBwYWdlOwogfQogCiAvKiBNdXN0IG5vdCBiZSB1c2VkIGZyb20gaXJxLCBhcyB0aGF0IG1heSBkZWFkbG9jazogc2VlIGRyYmRfYWxsb2NfcGFnZXMuCi0gKiBJcyBhbHNvIHVzZWQgZnJvbSBpbnNpZGUgYW4gb3RoZXIgc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKyAqIElzIGFsc28gdXNlZCBmcm9tIGluc2lkZSBhbiBvdGhlciBzcGluX2xvY2tfaXJxKCZyZXNvdXJjZS0+cmVxX2xvY2spOwogICogRWl0aGVyIGxpbmtzIHRoZSBwYWdlIGNoYWluIGJhY2sgdG8gdGhlIGdsb2JhbCBwb29sLAogICogb3IgcmV0dXJucyBhbGwgcGFnZXMgdG8gdGhlIHN5c3RlbS4gKi8KLXN0YXRpYyB2b2lkIGRyYmRfZnJlZV9wYWdlcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGlzX25ldCkKK3N0YXRpYyB2b2lkIGRyYmRfZnJlZV9wYWdlcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBpc19uZXQpCiB7Ci0JYXRvbWljX3QgKmEgPSBpc19uZXQgPyAmbWRldi0+cHBfaW5fdXNlX2J5X25ldCA6ICZtZGV2LT5wcF9pbl91c2U7CisJYXRvbWljX3QgKmEgPSBpc19uZXQgPyAmZGV2aWNlLT5wcF9pbl91c2VfYnlfbmV0IDogJmRldmljZS0+cHBfaW5fdXNlOwogCWludCBpOwogCiAJaWYgKHBhZ2UgPT0gTlVMTCkKQEAgLTMxMCw3ICszMTAsNyBAQAogCX0KIAlpID0gYXRvbWljX3N1Yl9yZXR1cm4oaSwgYSk7CiAJaWYgKGkgPCAwKQotCQlkZXZfd2FybihERVYsICJBU1NFUlRJT04gRkFJTEVEOiAlczogJWQgPCAwXG4iLAorCQlkcmJkX3dhcm4oZGV2aWNlLCAiQVNTRVJUSU9OIEZBSUxFRDogJXM6ICVkIDwgMFxuIiwKIAkJCWlzX25ldCA/ICJwcF9pbl91c2VfYnlfbmV0IiA6ICJwcF9pbl91c2UiLCBpKTsKIAl3YWtlX3VwKCZkcmJkX3BwX3dhaXQpOwogfQpAQCAtMzMwLDI1ICszMzAsMjYgQEAKICovCiAKIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqCi1kcmJkX2FsbG9jX3BlZXJfcmVxKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHU2NCBpZCwgc2VjdG9yX3Qgc2VjdG9yLAorZHJiZF9hbGxvY19wZWVyX3JlcShzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHU2NCBpZCwgc2VjdG9yX3Qgc2VjdG9yLAogCQkgICAgdW5zaWduZWQgaW50IGRhdGFfc2l6ZSwgZ2ZwX3QgZ2ZwX21hc2spIF9fbXVzdF9ob2xkKGxvY2FsKQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxOwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAl1bnNpZ25lZCBucl9wYWdlcyA9IChkYXRhX3NpemUgKyBQQUdFX1NJWkUgLTEpID4+IFBBR0VfU0hJRlQ7CiAKLQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQobWRldiwgRFJCRF9GQVVMVF9BTF9FRSkpCisJaWYgKGRyYmRfaW5zZXJ0X2ZhdWx0KGRldmljZSwgRFJCRF9GQVVMVF9BTF9FRSkpCiAJCXJldHVybiBOVUxMOwogCiAJcGVlcl9yZXEgPSBtZW1wb29sX2FsbG9jKGRyYmRfZWVfbWVtcG9vbCwgZ2ZwX21hc2sgJiB+X19HRlBfSElHSE1FTSk7CiAJaWYgKCFwZWVyX3JlcSkgewogCQlpZiAoIShnZnBfbWFzayAmIF9fR0ZQX05PV0FSTikpCi0JCQlkZXZfZXJyKERFViwgIiVzOiBhbGxvY2F0aW9uIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiJXM6IGFsbG9jYXRpb24gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCWlmIChkYXRhX3NpemUpIHsKLQkJcGFnZSA9IGRyYmRfYWxsb2NfcGFnZXMobWRldiwgbnJfcGFnZXMsIChnZnBfbWFzayAmIF9fR0ZQX1dBSVQpKTsKKwkJcGFnZSA9IGRyYmRfYWxsb2NfcGFnZXMocGVlcl9kZXZpY2UsIG5yX3BhZ2VzLCAoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKSk7CiAJCWlmICghcGFnZSkKIAkJCWdvdG8gZmFpbDsKIAl9CkBAIC0zNjAsNyArMzYxLDcgQEAKIAlwZWVyX3JlcS0+aS53YWl0aW5nID0gZmFsc2U7CiAKIAlwZWVyX3JlcS0+ZXBvY2ggPSBOVUxMOwotCXBlZXJfcmVxLT53Lm1kZXYgPSBtZGV2OworCXBlZXJfcmVxLT5wZWVyX2RldmljZSA9IHBlZXJfZGV2aWNlOwogCXBlZXJfcmVxLT5wYWdlcyA9IHBhZ2U7CiAJYXRvbWljX3NldCgmcGVlcl9yZXEtPnBlbmRpbmdfYmlvcywgMCk7CiAJcGVlcl9yZXEtPmZsYWdzID0gMDsKQEAgLTM3NywzMCArMzc4LDMwIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgX19kcmJkX2ZyZWVfcGVlcl9yZXEoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSwKK3ZvaWQgX19kcmJkX2ZyZWVfcGVlcl9yZXEoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEsCiAJCSAgICAgICBpbnQgaXNfbmV0KQogewogCWlmIChwZWVyX3JlcS0+ZmxhZ3MgJiBFRV9IQVNfRElHRVNUKQogCQlrZnJlZShwZWVyX3JlcS0+ZGlnZXN0KTsKLQlkcmJkX2ZyZWVfcGFnZXMobWRldiwgcGVlcl9yZXEtPnBhZ2VzLCBpc19uZXQpOwotCURfQVNTRVJUKGF0b21pY19yZWFkKCZwZWVyX3JlcS0+cGVuZGluZ19iaW9zKSA9PSAwKTsKLQlEX0FTU0VSVChkcmJkX2ludGVydmFsX2VtcHR5KCZwZWVyX3JlcS0+aSkpOworCWRyYmRfZnJlZV9wYWdlcyhkZXZpY2UsIHBlZXJfcmVxLT5wYWdlcywgaXNfbmV0KTsKKwlEX0FTU0VSVChkZXZpY2UsIGF0b21pY19yZWFkKCZwZWVyX3JlcS0+cGVuZGluZ19iaW9zKSA9PSAwKTsKKwlEX0FTU0VSVChkZXZpY2UsIGRyYmRfaW50ZXJ2YWxfZW1wdHkoJnBlZXJfcmVxLT5pKSk7CiAJbWVtcG9vbF9mcmVlKHBlZXJfcmVxLCBkcmJkX2VlX21lbXBvb2wpOwogfQogCi1pbnQgZHJiZF9mcmVlX3BlZXJfcmVxcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoraW50IGRyYmRfZnJlZV9wZWVyX3JlcXMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCiB7CiAJTElTVF9IRUFEKHdvcmtfbGlzdCk7CiAJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSwgKnQ7CiAJaW50IGNvdW50ID0gMDsKLQlpbnQgaXNfbmV0ID0gbGlzdCA9PSAmbWRldi0+bmV0X2VlOworCWludCBpc19uZXQgPSBsaXN0ID09ICZkZXZpY2UtPm5ldF9lZTsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCWxpc3Rfc3BsaWNlX2luaXQobGlzdCwgJndvcmtfbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBlZXJfcmVxLCB0LCAmd29ya19saXN0LCB3Lmxpc3QpIHsKLQkJX19kcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEsIGlzX25ldCk7CisJCV9fZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEsIGlzX25ldCk7CiAJCWNvdW50Kys7CiAJfQogCXJldHVybiBjb3VudDsKQEAgLTQwOSwyMCArNDEwLDIwIEBACiAvKgogICogU2VlIGFsc28gY29tbWVudHMgaW4gX3JlcV9tb2QoLEJBUlJJRVJfQUNLRUQpIGFuZCByZWNlaXZlX0JhcnJpZXIuCiAgKi8KLXN0YXRpYyBpbnQgZHJiZF9maW5pc2hfcGVlcl9yZXFzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW50IGRyYmRfZmluaXNoX3BlZXJfcmVxcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAlMSVNUX0hFQUQod29ya19saXN0KTsKIAlMSVNUX0hFQUQocmVjbGFpbWVkKTsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxLCAqdDsKIAlpbnQgZXJyID0gMDsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JcmVjbGFpbV9maW5pc2hlZF9uZXRfcGVlcl9yZXFzKG1kZXYsICZyZWNsYWltZWQpOwotCWxpc3Rfc3BsaWNlX2luaXQoJm1kZXYtPmRvbmVfZWUsICZ3b3JrX2xpc3QpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJcmVjbGFpbV9maW5pc2hlZF9uZXRfcGVlcl9yZXFzKGRldmljZSwgJnJlY2xhaW1lZCk7CisJbGlzdF9zcGxpY2VfaW5pdCgmZGV2aWNlLT5kb25lX2VlLCAmd29ya19saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwZWVyX3JlcSwgdCwgJnJlY2xhaW1lZCwgdy5saXN0KQotCQlkcmJkX2ZyZWVfbmV0X3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKKwkJZHJiZF9mcmVlX25ldF9wZWVyX3JlcShkZXZpY2UsIHBlZXJfcmVxKTsKIAogCS8qIHBvc3NpYmxlIGNhbGxiYWNrcyBoZXJlOgogCSAqIGVfZW5kX2Jsb2NrLCBhbmQgZV9lbmRfcmVzeW5jX2Jsb2NrLCBlX3NlbmRfc3VwZXJzZWRlZC4KQEAgLTQzNSwxNCArNDM2LDE0IEBACiAJCWVycjIgPSBwZWVyX3JlcS0+dy5jYigmcGVlcl9yZXEtPncsICEhZXJyKTsKIAkJaWYgKCFlcnIpCiAJCQllcnIgPSBlcnIyOwotCQlkcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOworCQlkcmJkX2ZyZWVfcGVlcl9yZXEoZGV2aWNlLCBwZWVyX3JlcSk7CiAJfQotCXdha2VfdXAoJm1kZXYtPmVlX3dhaXQpOworCXdha2VfdXAoJmRldmljZS0+ZWVfd2FpdCk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBfZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3N0YXRpYyB2b2lkIF9kcmJkX3dhaXRfZWVfbGlzdF9lbXB0eShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7CiAJREVGSU5FX1dBSVQod2FpdCk7CkBAIC00NTAsMjAgKzQ1MSwyMCBAQAogCS8qIGF2b2lkcyBzcGluX2xvY2svdW5sb2NrCiAJICogYW5kIGNhbGxpbmcgcHJlcGFyZV90b193YWl0IGluIHRoZSBmYXN0IHBhdGggKi8KIAl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKLQkJcHJlcGFyZV90b193YWl0KCZtZGV2LT5lZV93YWl0LCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJCXByZXBhcmVfdG9fd2FpdCgmZGV2aWNlLT5lZV93YWl0LCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJaW9fc2NoZWR1bGUoKTsKLQkJZmluaXNoX3dhaXQoJm1kZXYtPmVlX3dhaXQsICZ3YWl0KTsKLQkJc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwkJZmluaXNoX3dhaXQoJmRldmljZS0+ZWVfd2FpdCwgJndhaXQpOworCQlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBkcmJkX3dhaXRfZWVfbGlzdF9lbXB0eShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIHZvaWQgZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlfZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkobWRldiwgaGVhZCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlfZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkoZGV2aWNlLCBoZWFkKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIH0KIAogc3RhdGljIGludCBkcmJkX3JlY3Zfc2hvcnQoc3RydWN0IHNvY2tldCAqc29jaywgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQpAQCAtNDg4LDQ0ICs0ODksNDQgQEAKIAlyZXR1cm4gcnY7CiB9CiAKLXN0YXRpYyBpbnQgZHJiZF9yZWN2KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBpbnQgZHJiZF9yZWN2KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJaW50IHJ2OwogCi0JcnYgPSBkcmJkX3JlY3Zfc2hvcnQodGNvbm4tPmRhdGEuc29ja2V0LCBidWYsIHNpemUsIDApOworCXJ2ID0gZHJiZF9yZWN2X3Nob3J0KGNvbm5lY3Rpb24tPmRhdGEuc29ja2V0LCBidWYsIHNpemUsIDApOwogCiAJaWYgKHJ2IDwgMCkgewogCQlpZiAocnYgPT0gLUVDT05OUkVTRVQpCi0JCQljb25uX2luZm8odGNvbm4sICJzb2NrIHdhcyByZXNldCBieSBwZWVyXG4iKTsKKwkJCWRyYmRfaW5mbyhjb25uZWN0aW9uLCAic29jayB3YXMgcmVzZXQgYnkgcGVlclxuIik7CiAJCWVsc2UgaWYgKHJ2ICE9IC1FUkVTVEFSVFNZUykKLQkJCWNvbm5fZXJyKHRjb25uLCAic29ja19yZWN2bXNnIHJldHVybmVkICVkXG4iLCBydik7CisJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAic29ja19yZWN2bXNnIHJldHVybmVkICVkXG4iLCBydik7CiAJfSBlbHNlIGlmIChydiA9PSAwKSB7Ci0JCWlmICh0ZXN0X2JpdChESVNDT05ORUNUX1NFTlQsICZ0Y29ubi0+ZmxhZ3MpKSB7CisJCWlmICh0ZXN0X2JpdChESVNDT05ORUNUX1NFTlQsICZjb25uZWN0aW9uLT5mbGFncykpIHsKIAkJCWxvbmcgdDsKIAkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCXQgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKS0+cGluZ190aW1lbyAqIEhaLzEwOworCQkJdCA9IHJjdV9kZXJlZmVyZW5jZShjb25uZWN0aW9uLT5uZXRfY29uZiktPnBpbmdfdGltZW8gKiBIWi8xMDsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCi0JCQl0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRjb25uLT5waW5nX3dhaXQsIHRjb25uLT5jc3RhdGUgPCBDX1dGX1JFUE9SVF9QQVJBTVMsIHQpOworCQkJdCA9IHdhaXRfZXZlbnRfdGltZW91dChjb25uZWN0aW9uLT5waW5nX3dhaXQsIGNvbm5lY3Rpb24tPmNzdGF0ZSA8IENfV0ZfUkVQT1JUX1BBUkFNUywgdCk7CiAKIAkJCWlmICh0KQogCQkJCWdvdG8gb3V0OwogCQl9Ci0JCWNvbm5faW5mbyh0Y29ubiwgInNvY2sgd2FzIHNodXQgZG93biBieSBwZWVyXG4iKTsKKwkJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJzb2NrIHdhcyBzaHV0IGRvd24gYnkgcGVlclxuIik7CiAJfQogCiAJaWYgKHJ2ICE9IHNpemUpCi0JCWNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19CUk9LRU5fUElQRSksIENTX0hBUkQpOworCQljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19CUk9LRU5fUElQRSksIENTX0hBUkQpOwogCiBvdXQ6CiAJcmV0dXJuIHJ2OwogfQogCi1zdGF0aWMgaW50IGRyYmRfcmVjdl9hbGwoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB2b2lkICpidWYsIHNpemVfdCBzaXplKQorc3RhdGljIGludCBkcmJkX3JlY3ZfYWxsKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IGRyYmRfcmVjdih0Y29ubiwgYnVmLCBzaXplKTsKKwllcnIgPSBkcmJkX3JlY3YoY29ubmVjdGlvbiwgYnVmLCBzaXplKTsKIAlpZiAoZXJyICE9IHNpemUpIHsKIAkJaWYgKGVyciA+PSAwKQogCQkJZXJyID0gLUVJTzsKQEAgLTUzNCwxMyArNTM1LDEzIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBkcmJkX3JlY3ZfYWxsX3dhcm4oc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB2b2lkICpidWYsIHNpemVfdCBzaXplKQorc3RhdGljIGludCBkcmJkX3JlY3ZfYWxsX3dhcm4oc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0gZHJiZF9yZWN2X2FsbCh0Y29ubiwgYnVmLCBzaXplKTsKKwllcnIgPSBkcmJkX3JlY3ZfYWxsKGNvbm5lY3Rpb24sIGJ1Ziwgc2l6ZSk7CiAJaWYgKGVyciAmJiAhc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCWNvbm5fd2Fybih0Y29ubiwgInNob3J0IHJlYWQgKGV4cGVjdGVkIHNpemUgJWQpXG4iLCAoaW50KXNpemUpOworCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgInNob3J0IHJlYWQgKGV4cGVjdGVkIHNpemUgJWQpXG4iLCAoaW50KXNpemUpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTU2Myw3ICs1NjQsNyBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBzb2NrZXQgKmRyYmRfdHJ5X2Nvbm5lY3Qoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIHN0cnVjdCBzb2NrZXQgKmRyYmRfdHJ5X2Nvbm5lY3Qoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAljb25zdCBjaGFyICp3aGF0OwogCXN0cnVjdCBzb2NrZXQgKnNvY2s7CkBAIC01NzUsNyArNTc2LDcgQEAKIAlpbnQgZGlzY29ubmVjdF9vbl9lcnJvciA9IDE7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbmMgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKTsKKwluYyA9IHJjdV9kZXJlZmVyZW5jZShjb25uZWN0aW9uLT5uZXRfY29uZik7CiAJaWYgKCFuYykgewogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC01ODUsMTYgKzU4NiwxNiBAQAogCWNvbm5lY3RfaW50ID0gbmMtPmNvbm5lY3RfaW50OwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JbXlfYWRkcl9sZW4gPSBtaW5fdChpbnQsIHRjb25uLT5teV9hZGRyX2xlbiwgc2l6ZW9mKHNyY19pbjYpKTsKLQltZW1jcHkoJnNyY19pbjYsICZ0Y29ubi0+bXlfYWRkciwgbXlfYWRkcl9sZW4pOworCW15X2FkZHJfbGVuID0gbWluX3QoaW50LCBjb25uZWN0aW9uLT5teV9hZGRyX2xlbiwgc2l6ZW9mKHNyY19pbjYpKTsKKwltZW1jcHkoJnNyY19pbjYsICZjb25uZWN0aW9uLT5teV9hZGRyLCBteV9hZGRyX2xlbik7CiAKLQlpZiAoKChzdHJ1Y3Qgc29ja2FkZHIgKikmdGNvbm4tPm15X2FkZHIpLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpCisJaWYgKCgoc3RydWN0IHNvY2thZGRyICopJmNvbm5lY3Rpb24tPm15X2FkZHIpLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpCiAJCXNyY19pbjYuc2luNl9wb3J0ID0gMDsKIAllbHNlCiAJCSgoc3RydWN0IHNvY2thZGRyX2luICopJnNyY19pbjYpLT5zaW5fcG9ydCA9IDA7IC8qIEFGX0lORVQgJiBBRl9TQ0kgKi8KIAotCXBlZXJfYWRkcl9sZW4gPSBtaW5fdChpbnQsIHRjb25uLT5wZWVyX2FkZHJfbGVuLCBzaXplb2Yoc3JjX2luNikpOwotCW1lbWNweSgmcGVlcl9pbjYsICZ0Y29ubi0+cGVlcl9hZGRyLCBwZWVyX2FkZHJfbGVuKTsKKwlwZWVyX2FkZHJfbGVuID0gbWluX3QoaW50LCBjb25uZWN0aW9uLT5wZWVyX2FkZHJfbGVuLCBzaXplb2Yoc3JjX2luNikpOworCW1lbWNweSgmcGVlcl9pbjYsICZjb25uZWN0aW9uLT5wZWVyX2FkZHIsIHBlZXJfYWRkcl9sZW4pOwogCiAJd2hhdCA9ICJzb2NrX2NyZWF0ZV9rZXJuIjsKIAllcnIgPSBzb2NrX2NyZWF0ZV9rZXJuKCgoc3RydWN0IHNvY2thZGRyICopJnNyY19pbjYpLT5zYV9mYW1pbHksCkBAIC02NDIsMTcgKzY0MywxNyBAQAogCQkJZGlzY29ubmVjdF9vbl9lcnJvciA9IDA7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWNvbm5fZXJyKHRjb25uLCAiJXMgZmFpbGVkLCBlcnIgPSAlZFxuIiwgd2hhdCwgZXJyKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICIlcyBmYWlsZWQsIGVyciA9ICVkXG4iLCB3aGF0LCBlcnIpOwogCQl9CiAJCWlmIChkaXNjb25uZWN0X29uX2Vycm9yKQotCQkJY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKKwkJCWNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKIAl9CiAKIAlyZXR1cm4gc29jazsKIH0KIAogc3RydWN0IGFjY2VwdF93YWl0X2RhdGEgewotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubjsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOwogCXN0cnVjdCBzb2NrZXQgKnNfbGlzdGVuOwogCXN0cnVjdCBjb21wbGV0aW9uIGRvb3JfYmVsbDsKIAl2b2lkICgqb3JpZ2luYWxfc2tfc3RhdGVfY2hhbmdlKShzdHJ1Y3Qgc29jayAqc2spOwpAQCAtNjcwLDcgKzY3MSw3IEBACiAJc3RhdGVfY2hhbmdlKHNrKTsKIH0KIAotc3RhdGljIGludCBwcmVwYXJlX2xpc3Rlbl9zb2NrZXQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgYWNjZXB0X3dhaXRfZGF0YSAqYWQpCitzdGF0aWMgaW50IHByZXBhcmVfbGlzdGVuX3NvY2tldChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgYWNjZXB0X3dhaXRfZGF0YSAqYWQpCiB7CiAJaW50IGVyciwgc25kYnVmX3NpemUsIHJjdmJ1Zl9zaXplLCBteV9hZGRyX2xlbjsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW42IG15X2FkZHI7CkBAIC02NzksNyArNjgwLDcgQEAKIAljb25zdCBjaGFyICp3aGF0OwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW5jID0gcmN1X2RlcmVmZXJlbmNlKHRjb25uLT5uZXRfY29uZik7CisJbmMgPSByY3VfZGVyZWZlcmVuY2UoY29ubmVjdGlvbi0+bmV0X2NvbmYpOwogCWlmICghbmMpIHsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAtRUlPOwpAQCAtNjg4LDggKzY4OSw4IEBACiAJcmN2YnVmX3NpemUgPSBuYy0+cmN2YnVmX3NpemU7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlteV9hZGRyX2xlbiA9IG1pbl90KGludCwgdGNvbm4tPm15X2FkZHJfbGVuLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOwotCW1lbWNweSgmbXlfYWRkciwgJnRjb25uLT5teV9hZGRyLCBteV9hZGRyX2xlbik7CisJbXlfYWRkcl9sZW4gPSBtaW5fdChpbnQsIGNvbm5lY3Rpb24tPm15X2FkZHJfbGVuLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworCW1lbWNweSgmbXlfYWRkciwgJmNvbm5lY3Rpb24tPm15X2FkZHIsIG15X2FkZHJfbGVuKTsKIAogCXdoYXQgPSAic29ja19jcmVhdGVfa2VybiI7CiAJZXJyID0gc29ja19jcmVhdGVfa2VybigoKHN0cnVjdCBzb2NrYWRkciAqKSZteV9hZGRyKS0+c2FfZmFtaWx5LApAQCAtNzI1LDggKzcyNiw4IEBACiAJCXNvY2tfcmVsZWFzZShzX2xpc3Rlbik7CiAJaWYgKGVyciA8IDApIHsKIAkJaWYgKGVyciAhPSAtRUFHQUlOICYmIGVyciAhPSAtRUlOVFIgJiYgZXJyICE9IC1FUkVTVEFSVFNZUykgewotCQkJY29ubl9lcnIodGNvbm4sICIlcyBmYWlsZWQsIGVyciA9ICVkXG4iLCB3aGF0LCBlcnIpOwotCQkJY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICIlcyBmYWlsZWQsIGVyciA9ICVkXG4iLCB3aGF0LCBlcnIpOworCQkJY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOwogCQl9CiAJfQogCkBAIC03NDEsMTQgKzc0MiwxNCBAQAogCXdyaXRlX3VubG9ja19iaCgmc2stPnNrX2NhbGxiYWNrX2xvY2spOwogfQogCi1zdGF0aWMgc3RydWN0IHNvY2tldCAqZHJiZF93YWl0X2Zvcl9jb25uZWN0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IGFjY2VwdF93YWl0X2RhdGEgKmFkKQorc3RhdGljIHN0cnVjdCBzb2NrZXQgKmRyYmRfd2FpdF9mb3JfY29ubmVjdChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgYWNjZXB0X3dhaXRfZGF0YSAqYWQpCiB7CiAJaW50IHRpbWVvLCBjb25uZWN0X2ludCwgZXJyID0gMDsKIAlzdHJ1Y3Qgc29ja2V0ICpzX2VzdGFiID0gTlVMTDsKIAlzdHJ1Y3QgbmV0X2NvbmYgKm5jOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW5jID0gcmN1X2RlcmVmZXJlbmNlKHRjb25uLT5uZXRfY29uZik7CisJbmMgPSByY3VfZGVyZWZlcmVuY2UoY29ubmVjdGlvbi0+bmV0X2NvbmYpOwogCWlmICghbmMpIHsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiBOVUxMOwpAQCAtNzY3LDggKzc2OCw4IEBACiAJZXJyID0ga2VybmVsX2FjY2VwdChhZC0+c19saXN0ZW4sICZzX2VzdGFiLCAwKTsKIAlpZiAoZXJyIDwgMCkgewogCQlpZiAoZXJyICE9IC1FQUdBSU4gJiYgZXJyICE9IC1FSU5UUiAmJiBlcnIgIT0gLUVSRVNUQVJUU1lTKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgImFjY2VwdCBmYWlsZWQsIGVyciA9ICVkXG4iLCBlcnIpOwotCQkJY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJhY2NlcHQgZmFpbGVkLCBlcnIgPSAlZFxuIiwgZXJyKTsKKwkJCWNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKIAkJfQogCX0KIApAQCAtNzc4LDI5ICs3NzksMjkgQEAKIAlyZXR1cm4gc19lc3RhYjsKIH0KIAotc3RhdGljIGludCBkZWNvZGVfaGVhZGVyKHN0cnVjdCBkcmJkX3Rjb25uICosIHZvaWQgKiwgc3RydWN0IHBhY2tldF9pbmZvICopOworc3RhdGljIGludCBkZWNvZGVfaGVhZGVyKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKiwgdm9pZCAqLCBzdHJ1Y3QgcGFja2V0X2luZm8gKik7CiAKLXN0YXRpYyBpbnQgc2VuZF9maXJzdF9wYWNrZXQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2ssCitzdGF0aWMgaW50IHNlbmRfZmlyc3RfcGFja2V0KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBkcmJkX3NvY2tldCAqc29jaywKIAkJCSAgICAgZW51bSBkcmJkX3BhY2tldCBjbWQpCiB7Ci0JaWYgKCFjb25uX3ByZXBhcmVfY29tbWFuZCh0Y29ubiwgc29jaykpCisJaWYgKCFjb25uX3ByZXBhcmVfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrKSkKIAkJcmV0dXJuIC1FSU87Ci0JcmV0dXJuIGNvbm5fc2VuZF9jb21tYW5kKHRjb25uLCBzb2NrLCBjbWQsIDAsIE5VTEwsIDApOworCXJldHVybiBjb25uX3NlbmRfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrLCBjbWQsIDAsIE5VTEwsIDApOwogfQogCi1zdGF0aWMgaW50IHJlY2VpdmVfZmlyc3RfcGFja2V0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHNvY2tldCAqc29jaykKK3N0YXRpYyBpbnQgcmVjZWl2ZV9maXJzdF9wYWNrZXQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHNvY2tldCAqc29jaykKIHsKLQl1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBkcmJkX2hlYWRlcl9zaXplKHRjb25uKTsKKwl1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBkcmJkX2hlYWRlcl9zaXplKGNvbm5lY3Rpb24pOwogCXN0cnVjdCBwYWNrZXRfaW5mbyBwaTsKIAlpbnQgZXJyOwogCi0JZXJyID0gZHJiZF9yZWN2X3Nob3J0KHNvY2ssIHRjb25uLT5kYXRhLnJidWYsIGhlYWRlcl9zaXplLCAwKTsKKwllcnIgPSBkcmJkX3JlY3Zfc2hvcnQoc29jaywgY29ubmVjdGlvbi0+ZGF0YS5yYnVmLCBoZWFkZXJfc2l6ZSwgMCk7CiAJaWYgKGVyciAhPSBoZWFkZXJfc2l6ZSkgewogCQlpZiAoZXJyID49IDApCiAJCQllcnIgPSAtRUlPOwogCQlyZXR1cm4gZXJyOwogCX0KLQllcnIgPSBkZWNvZGVfaGVhZGVyKHRjb25uLCB0Y29ubi0+ZGF0YS5yYnVmLCAmcGkpOworCWVyciA9IGRlY29kZV9oZWFkZXIoY29ubmVjdGlvbiwgY29ubmVjdGlvbi0+ZGF0YS5yYnVmLCAmcGkpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAJcmV0dXJuIHBpLmNtZDsKQEAgLTgzMCwyOCArODMxLDI5IEBACiB9CiAvKiBHZXRzIGNhbGxlZCBpZiBhIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQsIG9yIGlmIGEgbmV3IG1pbm9yIGdldHMgY3JlYXRlZAogICAgaW4gYSBjb25uZWN0aW9uICovCi1pbnQgZHJiZF9jb25uZWN0ZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK2ludCBkcmJkX2Nvbm5lY3RlZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCWludCBlcnI7CiAKLQlhdG9taWNfc2V0KCZtZGV2LT5wYWNrZXRfc2VxLCAwKTsKLQltZGV2LT5wZWVyX3NlcSA9IDA7CisJYXRvbWljX3NldCgmZGV2aWNlLT5wYWNrZXRfc2VxLCAwKTsKKwlkZXZpY2UtPnBlZXJfc2VxID0gMDsKIAotCW1kZXYtPnN0YXRlX211dGV4ID0gbWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDEwMCA/Ci0JCSZtZGV2LT50Y29ubi0+Y3N0YXRlX211dGV4IDoKLQkJJm1kZXYtPm93bl9zdGF0ZV9tdXRleDsKKwlkZXZpY2UtPnN0YXRlX211dGV4ID0gcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDEwMCA/CisJCSZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+Y3N0YXRlX211dGV4IDoKKwkJJmRldmljZS0+b3duX3N0YXRlX211dGV4OwogCi0JZXJyID0gZHJiZF9zZW5kX3N5bmNfcGFyYW0obWRldik7CisJZXJyID0gZHJiZF9zZW5kX3N5bmNfcGFyYW0ocGVlcl9kZXZpY2UpOwogCWlmICghZXJyKQotCQllcnIgPSBkcmJkX3NlbmRfc2l6ZXMobWRldiwgMCwgMCk7CisJCWVyciA9IGRyYmRfc2VuZF9zaXplcyhwZWVyX2RldmljZSwgMCwgMCk7CiAJaWYgKCFlcnIpCi0JCWVyciA9IGRyYmRfc2VuZF91dWlkcyhtZGV2KTsKKwkJZXJyID0gZHJiZF9zZW5kX3V1aWRzKHBlZXJfZGV2aWNlKTsKIAlpZiAoIWVycikKLQkJZXJyID0gZHJiZF9zZW5kX2N1cnJlbnRfc3RhdGUobWRldik7Ci0JY2xlYXJfYml0KFVTRV9ERUdSX1dGQ19ULCAmbWRldi0+ZmxhZ3MpOwotCWNsZWFyX2JpdChSRVNJWkVfUEVORElORywgJm1kZXYtPmZsYWdzKTsKLQlhdG9taWNfc2V0KCZtZGV2LT5hcF9pbl9mbGlnaHQsIDApOwotCW1vZF90aW1lcigmbWRldi0+cmVxdWVzdF90aW1lciwgamlmZmllcyArIEhaKTsgLyoganVzdCBzdGFydCBpdCBoZXJlLiAqLworCQllcnIgPSBkcmJkX3NlbmRfY3VycmVudF9zdGF0ZShwZWVyX2RldmljZSk7CisJY2xlYXJfYml0KFVTRV9ERUdSX1dGQ19ULCAmZGV2aWNlLT5mbGFncyk7CisJY2xlYXJfYml0KFJFU0laRV9QRU5ESU5HLCAmZGV2aWNlLT5mbGFncyk7CisJYXRvbWljX3NldCgmZGV2aWNlLT5hcF9pbl9mbGlnaHQsIDApOworCW1vZF90aW1lcigmZGV2aWNlLT5yZXF1ZXN0X3RpbWVyLCBqaWZmaWVzICsgSFopOyAvKiBqdXN0IHN0YXJ0IGl0IGhlcmUuICovCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtODYzLDU5ICs4NjUsNTkgQEAKICAqICAgICBubyBwb2ludCBpbiB0cnlpbmcgYWdhaW4sIHBsZWFzZSBnbyBzdGFuZGFsb25lLgogICogIC0yIFdlIGRvIG5vdCBoYXZlIGEgbmV0d29yayBjb25maWcuLi4KICAqLwotc3RhdGljIGludCBjb25uX2Nvbm5lY3Qoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIGludCBjb25uX2Nvbm5lY3Qoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgc29jaywgbXNvY2s7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAlpbnQgdm5yLCB0aW1lb3V0LCBoLCBvazsKIAlib29sIGRpc2NhcmRfbXlfZGF0YTsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnY7CiAJc3RydWN0IGFjY2VwdF93YWl0X2RhdGEgYWQgPSB7Ci0JCS50Y29ubiA9IHRjb25uLAorCQkuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sCiAJCS5kb29yX2JlbGwgPSBDT01QTEVUSU9OX0lOSVRJQUxJWkVSX09OU1RBQ0soYWQuZG9vcl9iZWxsKSwKIAl9OwogCi0JY2xlYXJfYml0KERJU0NPTk5FQ1RfU0VOVCwgJnRjb25uLT5mbGFncyk7Ci0JaWYgKGNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19XRl9DT05ORUNUSU9OKSwgQ1NfVkVSQk9TRSkgPCBTU19TVUNDRVNTKQorCWNsZWFyX2JpdChESVNDT05ORUNUX1NFTlQsICZjb25uZWN0aW9uLT5mbGFncyk7CisJaWYgKGNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX1dGX0NPTk5FQ1RJT04pLCBDU19WRVJCT1NFKSA8IFNTX1NVQ0NFU1MpCiAJCXJldHVybiAtMjsKIAogCW11dGV4X2luaXQoJnNvY2subXV0ZXgpOwotCXNvY2suc2J1ZiA9IHRjb25uLT5kYXRhLnNidWY7Ci0Jc29jay5yYnVmID0gdGNvbm4tPmRhdGEucmJ1ZjsKKwlzb2NrLnNidWYgPSBjb25uZWN0aW9uLT5kYXRhLnNidWY7CisJc29jay5yYnVmID0gY29ubmVjdGlvbi0+ZGF0YS5yYnVmOwogCXNvY2suc29ja2V0ID0gTlVMTDsKIAltdXRleF9pbml0KCZtc29jay5tdXRleCk7Ci0JbXNvY2suc2J1ZiA9IHRjb25uLT5tZXRhLnNidWY7Ci0JbXNvY2sucmJ1ZiA9IHRjb25uLT5tZXRhLnJidWY7CisJbXNvY2suc2J1ZiA9IGNvbm5lY3Rpb24tPm1ldGEuc2J1ZjsKKwltc29jay5yYnVmID0gY29ubmVjdGlvbi0+bWV0YS5yYnVmOwogCW1zb2NrLnNvY2tldCA9IE5VTEw7CiAKIAkvKiBBc3N1bWUgdGhhdCB0aGUgcGVlciBvbmx5IHVuZGVyc3RhbmRzIHByb3RvY29sIDgwIHVudGlsIHdlIGtub3cgYmV0dGVyLiAgKi8KLQl0Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uID0gODA7CisJY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID0gODA7CiAKLQlpZiAocHJlcGFyZV9saXN0ZW5fc29ja2V0KHRjb25uLCAmYWQpKQorCWlmIChwcmVwYXJlX2xpc3Rlbl9zb2NrZXQoY29ubmVjdGlvbiwgJmFkKSkKIAkJcmV0dXJuIDA7CiAKIAlkbyB7CiAJCXN0cnVjdCBzb2NrZXQgKnM7CiAKLQkJcyA9IGRyYmRfdHJ5X2Nvbm5lY3QodGNvbm4pOworCQlzID0gZHJiZF90cnlfY29ubmVjdChjb25uZWN0aW9uKTsKIAkJaWYgKHMpIHsKIAkJCWlmICghc29jay5zb2NrZXQpIHsKIAkJCQlzb2NrLnNvY2tldCA9IHM7Ci0JCQkJc2VuZF9maXJzdF9wYWNrZXQodGNvbm4sICZzb2NrLCBQX0lOSVRJQUxfREFUQSk7CisJCQkJc2VuZF9maXJzdF9wYWNrZXQoY29ubmVjdGlvbiwgJnNvY2ssIFBfSU5JVElBTF9EQVRBKTsKIAkJCX0gZWxzZSBpZiAoIW1zb2NrLnNvY2tldCkgewotCQkJCWNsZWFyX2JpdChSRVNPTFZFX0NPTkZMSUNUUywgJnRjb25uLT5mbGFncyk7CisJCQkJY2xlYXJfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmY29ubmVjdGlvbi0+ZmxhZ3MpOwogCQkJCW1zb2NrLnNvY2tldCA9IHM7Ci0JCQkJc2VuZF9maXJzdF9wYWNrZXQodGNvbm4sICZtc29jaywgUF9JTklUSUFMX01FVEEpOworCQkJCXNlbmRfZmlyc3RfcGFja2V0KGNvbm5lY3Rpb24sICZtc29jaywgUF9JTklUSUFMX01FVEEpOwogCQkJfSBlbHNlIHsKLQkJCQljb25uX2Vycih0Y29ubiwgIkxvZ2ljIGVycm9yIGluIGNvbm5fY29ubmVjdCgpXG4iKTsKKwkJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiTG9naWMgZXJyb3IgaW4gY29ubl9jb25uZWN0KClcbiIpOwogCQkJCWdvdG8gb3V0X3JlbGVhc2Vfc29ja2V0czsKIAkJCX0KIAkJfQogCiAJCWlmIChzb2NrLnNvY2tldCAmJiBtc29jay5zb2NrZXQpIHsKIAkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCW5jID0gcmN1X2RlcmVmZXJlbmNlKHRjb25uLT5uZXRfY29uZik7CisJCQluYyA9IHJjdV9kZXJlZmVyZW5jZShjb25uZWN0aW9uLT5uZXRfY29uZik7CiAJCQl0aW1lb3V0ID0gbmMtPnBpbmdfdGltZW8gKiBIWiAvIDEwOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7CkBAIC05MjYsMTUgKzkyOCwxNSBAQAogCQl9CiAKIHJldHJ5OgotCQlzID0gZHJiZF93YWl0X2Zvcl9jb25uZWN0KHRjb25uLCAmYWQpOworCQlzID0gZHJiZF93YWl0X2Zvcl9jb25uZWN0KGNvbm5lY3Rpb24sICZhZCk7CiAJCWlmIChzKSB7Ci0JCQlpbnQgZnAgPSByZWNlaXZlX2ZpcnN0X3BhY2tldCh0Y29ubiwgcyk7CisJCQlpbnQgZnAgPSByZWNlaXZlX2ZpcnN0X3BhY2tldChjb25uZWN0aW9uLCBzKTsKIAkJCWRyYmRfc29ja2V0X29rYXkoJnNvY2suc29ja2V0KTsKIAkJCWRyYmRfc29ja2V0X29rYXkoJm1zb2NrLnNvY2tldCk7CiAJCQlzd2l0Y2ggKGZwKSB7CiAJCQljYXNlIFBfSU5JVElBTF9EQVRBOgogCQkJCWlmIChzb2NrLnNvY2tldCkgewotCQkJCQljb25uX3dhcm4odGNvbm4sICJpbml0aWFsIHBhY2tldCBTIGNyb3NzZWRcbiIpOworCQkJCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgImluaXRpYWwgcGFja2V0IFMgY3Jvc3NlZFxuIik7CiAJCQkJCXNvY2tfcmVsZWFzZShzb2NrLnNvY2tldCk7CiAJCQkJCXNvY2suc29ja2V0ID0gczsKIAkJCQkJZ290byByYW5kb21pemU7CkBAIC05NDIsOSArOTQ0LDkgQEAKIAkJCQlzb2NrLnNvY2tldCA9IHM7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFBfSU5JVElBTF9NRVRBOgotCQkJCXNldF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZ0Y29ubi0+ZmxhZ3MpOworCQkJCXNldF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZjb25uZWN0aW9uLT5mbGFncyk7CiAJCQkJaWYgKG1zb2NrLnNvY2tldCkgewotCQkJCQljb25uX3dhcm4odGNvbm4sICJpbml0aWFsIHBhY2tldCBNIGNyb3NzZWRcbiIpOworCQkJCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgImluaXRpYWwgcGFja2V0IE0gY3Jvc3NlZFxuIik7CiAJCQkJCXNvY2tfcmVsZWFzZShtc29jay5zb2NrZXQpOwogCQkJCQltc29jay5zb2NrZXQgPSBzOwogCQkJCQlnb3RvIHJhbmRvbWl6ZTsKQEAgLTk1Miw3ICs5NTQsNyBAQAogCQkJCW1zb2NrLnNvY2tldCA9IHM7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCWNvbm5fd2Fybih0Y29ubiwgIkVycm9yIHJlY2VpdmluZyBpbml0aWFsIHBhY2tldFxuIik7CisJCQkJZHJiZF93YXJuKGNvbm5lY3Rpb24sICJFcnJvciByZWNlaXZpbmcgaW5pdGlhbCBwYWNrZXRcbiIpOwogCQkJCXNvY2tfcmVsZWFzZShzKTsKIHJhbmRvbWl6ZToKIAkJCQlpZiAocHJhbmRvbV91MzIoKSAmIDEpCkBAIC05NjAsMTIgKzk2MiwxMiBAQAogCQkJfQogCQl9CiAKLQkJaWYgKHRjb25uLT5jc3RhdGUgPD0gQ19ESVNDT05ORUNUSU5HKQorCQlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlIDw9IENfRElTQ09OTkVDVElORykKIAkJCWdvdG8gb3V0X3JlbGVhc2Vfc29ja2V0czsKIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwogCQkJc21wX3JtYigpOwotCQkJaWYgKGdldF90X3N0YXRlKCZ0Y29ubi0+cmVjZWl2ZXIpID09IEVYSVRJTkcpCisJCQlpZiAoZ2V0X3Rfc3RhdGUoJmNvbm5lY3Rpb24tPnJlY2VpdmVyKSA9PSBFWElUSU5HKQogCQkJCWdvdG8gb3V0X3JlbGVhc2Vfc29ja2V0czsKIAkJfQogCkBAIC05ODYsMTIgKzk4OCwxMiBAQAogCW1zb2NrLnNvY2tldC0+c2stPnNrX3ByaW9yaXR5ID0gVENfUFJJT19JTlRFUkFDVElWRTsKIAogCS8qIE5PVCBZRVQgLi4uCi0JICogc29jay5zb2NrZXQtPnNrLT5za19zbmR0aW1lbyA9IHRjb25uLT5uZXRfY29uZi0+dGltZW91dCpIWi8xMDsKKwkgKiBzb2NrLnNvY2tldC0+c2stPnNrX3NuZHRpbWVvID0gY29ubmVjdGlvbi0+bmV0X2NvbmYtPnRpbWVvdXQqSFovMTA7CiAJICogc29jay5zb2NrZXQtPnNrLT5za19yY3Z0aW1lbyA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwogCSAqIGZpcnN0IHNldCBpdCB0byB0aGUgUF9DT05ORUNUSU9OX0ZFQVRVUkVTIHRpbWVvdXQsCiAJICogd2hpY2ggd2Ugc2V0IHRvIDR4IHRoZSBjb25maWd1cmVkIHBpbmdfdGltZW91dC4gKi8KIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbmMgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKTsKKwluYyA9IHJjdV9kZXJlZmVyZW5jZShjb25uZWN0aW9uLT5uZXRfY29uZik7CiAKIAlzb2NrLnNvY2tldC0+c2stPnNrX3NuZHRpbWVvID0KIAlzb2NrLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvID0gbmMtPnBpbmdfdGltZW8qNCpIWi8xMDsKQEAgLTEwMDgsMzcgKzEwMTAsMzggQEAKIAlkcmJkX3RjcF9ub2RlbGF5KHNvY2suc29ja2V0KTsKIAlkcmJkX3RjcF9ub2RlbGF5KG1zb2NrLnNvY2tldCk7CiAKLQl0Y29ubi0+ZGF0YS5zb2NrZXQgPSBzb2NrLnNvY2tldDsKLQl0Y29ubi0+bWV0YS5zb2NrZXQgPSBtc29jay5zb2NrZXQ7Ci0JdGNvbm4tPmxhc3RfcmVjZWl2ZWQgPSBqaWZmaWVzOworCWNvbm5lY3Rpb24tPmRhdGEuc29ja2V0ID0gc29jay5zb2NrZXQ7CisJY29ubmVjdGlvbi0+bWV0YS5zb2NrZXQgPSBtc29jay5zb2NrZXQ7CisJY29ubmVjdGlvbi0+bGFzdF9yZWNlaXZlZCA9IGppZmZpZXM7CiAKLQloID0gZHJiZF9kb19mZWF0dXJlcyh0Y29ubik7CisJaCA9IGRyYmRfZG9fZmVhdHVyZXMoY29ubmVjdGlvbik7CiAJaWYgKGggPD0gMCkKIAkJcmV0dXJuIGg7CiAKLQlpZiAodGNvbm4tPmNyYW1faG1hY190Zm0pIHsKLQkJLyogZHJiZF9yZXF1ZXN0X3N0YXRlKG1kZXYsIE5TKGNvbm4sIFdGQXV0aCkpOyAqLwotCQlzd2l0Y2ggKGRyYmRfZG9fYXV0aCh0Y29ubikpIHsKKwlpZiAoY29ubmVjdGlvbi0+Y3JhbV9obWFjX3RmbSkgeworCQkvKiBkcmJkX3JlcXVlc3Rfc3RhdGUoZGV2aWNlLCBOUyhjb25uLCBXRkF1dGgpKTsgKi8KKwkJc3dpdGNoIChkcmJkX2RvX2F1dGgoY29ubmVjdGlvbikpIHsKIAkJY2FzZSAtMToKLQkJCWNvbm5fZXJyKHRjb25uLCAiQXV0aGVudGljYXRpb24gb2YgcGVlciBmYWlsZWRcbiIpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIkF1dGhlbnRpY2F0aW9uIG9mIHBlZXIgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtMTsKIAkJY2FzZSAwOgotCQkJY29ubl9lcnIodGNvbm4sICJBdXRoZW50aWNhdGlvbiBvZiBwZWVyIGZhaWxlZCwgdHJ5aW5nIGFnYWluLlxuIik7CisJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiQXV0aGVudGljYXRpb24gb2YgcGVlciBmYWlsZWQsIHRyeWluZyBhZ2Fpbi5cbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAKLQl0Y29ubi0+ZGF0YS5zb2NrZXQtPnNrLT5za19zbmR0aW1lbyA9IHRpbWVvdXQ7Ci0JdGNvbm4tPmRhdGEuc29ja2V0LT5zay0+c2tfcmN2dGltZW8gPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwljb25uZWN0aW9uLT5kYXRhLnNvY2tldC0+c2stPnNrX3NuZHRpbWVvID0gdGltZW91dDsKKwljb25uZWN0aW9uLT5kYXRhLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CiAKLQlpZiAoZHJiZF9zZW5kX3Byb3RvY29sKHRjb25uKSA9PSAtRU9QTk9UU1VQUCkKKwlpZiAoZHJiZF9zZW5kX3Byb3RvY29sKGNvbm5lY3Rpb24pID09IC1FT1BOT1RTVVBQKQogCQlyZXR1cm4gLTE7CiAKLQlzZXRfYml0KFNUQVRFX1NFTlQsICZ0Y29ubi0+ZmxhZ3MpOworCXNldF9iaXQoU1RBVEVfU0VOVCwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJa3JlZl9nZXQoJm1kZXYtPmtyZWYpOworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKSB7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJa3JlZl9nZXQoJmRldmljZS0+a3JlZik7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCiAJCS8qIFByZXZlbnQgYSByYWNlIGJldHdlZW4gcmVzeW5jLWhhbmRzaGFrZSBhbmQKQEAgLTEwNDgsMzUgKzEwNTEsMzUgQEAKIAkJICogZHJiZF9zZXRfcm9sZSgpIGlzIGZpbmlzaGVkLCBhbmQgYW55IGluY29taW5nIGRyYmRfc2V0X3JvbGUKIAkJICogd2lsbCBzZWUgdGhlIFNUQVRFX1NFTlQgZmxhZywgYW5kIHdhaXQgZm9yIGl0IHRvIGJlIGNsZWFyZWQuCiAJCSAqLwotCQltdXRleF9sb2NrKG1kZXYtPnN0YXRlX211dGV4KTsKLQkJbXV0ZXhfdW5sb2NrKG1kZXYtPnN0YXRlX211dGV4KTsKKwkJbXV0ZXhfbG9jayhkZXZpY2UtPnN0YXRlX211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKGRldmljZS0+c3RhdGVfbXV0ZXgpOwogCiAJCWlmIChkaXNjYXJkX215X2RhdGEpCi0JCQlzZXRfYml0KERJU0NBUkRfTVlfREFUQSwgJm1kZXYtPmZsYWdzKTsKKwkJCXNldF9iaXQoRElTQ0FSRF9NWV9EQVRBLCAmZGV2aWNlLT5mbGFncyk7CiAJCWVsc2UKLQkJCWNsZWFyX2JpdChESVNDQVJEX01ZX0RBVEEsICZtZGV2LT5mbGFncyk7CisJCQljbGVhcl9iaXQoRElTQ0FSRF9NWV9EQVRBLCAmZGV2aWNlLT5mbGFncyk7CiAKLQkJZHJiZF9jb25uZWN0ZWQobWRldik7Ci0JCWtyZWZfcHV0KCZtZGV2LT5rcmVmLCAmZHJiZF9taW5vcl9kZXN0cm95KTsKKwkJZHJiZF9jb25uZWN0ZWQocGVlcl9kZXZpY2UpOworCQlrcmVmX3B1dCgmZGV2aWNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKTsKIAkJcmN1X3JlYWRfbG9jaygpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCXJ2ID0gY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX1dGX1JFUE9SVF9QQVJBTVMpLCBDU19WRVJCT1NFKTsKLQlpZiAocnYgPCBTU19TVUNDRVNTIHx8IHRjb25uLT5jc3RhdGUgIT0gQ19XRl9SRVBPUlRfUEFSQU1TKSB7Ci0JCWNsZWFyX2JpdChTVEFURV9TRU5ULCAmdGNvbm4tPmZsYWdzKTsKKwlydiA9IGNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX1dGX1JFUE9SVF9QQVJBTVMpLCBDU19WRVJCT1NFKTsKKwlpZiAocnYgPCBTU19TVUNDRVNTIHx8IGNvbm5lY3Rpb24tPmNzdGF0ZSAhPSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKKwkJY2xlYXJfYml0KFNUQVRFX1NFTlQsICZjb25uZWN0aW9uLT5mbGFncyk7CiAJCXJldHVybiAwOwogCX0KIAotCWRyYmRfdGhyZWFkX3N0YXJ0KCZ0Y29ubi0+YXNlbmRlcik7CisJZHJiZF90aHJlYWRfc3RhcnQoJmNvbm5lY3Rpb24tPmFzZW5kZXIpOwogCi0JbXV0ZXhfbG9jaygmdGNvbm4tPmNvbmZfdXBkYXRlKTsKKwltdXRleF9sb2NrKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOwogCS8qIFRoZSBkaXNjYXJkX215X2RhdGEgZmxhZyBpcyBhIHNpbmdsZS1zaG90IG1vZGlmaWVyIHRvIHRoZSBuZXh0CiAJICogY29ubmVjdGlvbiBhdHRlbXB0LCB0aGUgaGFuZHNoYWtlIG9mIHdoaWNoIGlzIG5vdyB3ZWxsIHVuZGVyd2F5LgogCSAqIE5vIG5lZWQgZm9yIHJjdSBzdHlsZSBjb3B5aW5nIG9mIHRoZSB3aG9sZSBzdHJ1Y3QKIAkgKiBqdXN0IHRvIGNsZWFyIGEgc2luZ2xlIHZhbHVlLiAqLwotCXRjb25uLT5uZXRfY29uZi0+ZGlzY2FyZF9teV9kYXRhID0gMDsKLQltdXRleF91bmxvY2soJnRjb25uLT5jb25mX3VwZGF0ZSk7CisJY29ubmVjdGlvbi0+bmV0X2NvbmYtPmRpc2NhcmRfbXlfZGF0YSA9IDA7CisJbXV0ZXhfdW5sb2NrKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOwogCiAJcmV0dXJuIGg7CiAKQEAgLTEwOTAsMTUgKzEwOTMsMTUgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgZGVjb2RlX2hlYWRlcihzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHZvaWQgKmhlYWRlciwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgZGVjb2RlX2hlYWRlcihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB2b2lkICpoZWFkZXIsIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7Ci0JdW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gZHJiZF9oZWFkZXJfc2l6ZSh0Y29ubik7CisJdW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gZHJiZF9oZWFkZXJfc2l6ZShjb25uZWN0aW9uKTsKIAogCWlmIChoZWFkZXJfc2l6ZSA9PSBzaXplb2Yoc3RydWN0IHBfaGVhZGVyMTAwKSAmJgogCSAgICAqKF9fYmUzMiAqKWhlYWRlciA9PSBjcHVfdG9fYmUzMihEUkJEX01BR0lDXzEwMCkpIHsKIAkJc3RydWN0IHBfaGVhZGVyMTAwICpoID0gaGVhZGVyOwogCQlpZiAoaC0+cGFkICE9IDApIHsKLQkJCWNvbm5fZXJyKHRjb25uLCAiSGVhZGVyIHBhZGRpbmcgaXMgbm90IHplcm9cbiIpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIkhlYWRlciBwYWRkaW5nIGlzIG5vdCB6ZXJvXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCXBpLT52bnIgPSBiZTE2X3RvX2NwdShoLT52b2x1bWUpOwpAQCAtMTExNyw1NSArMTEyMCw1NyBAQAogCQlwaS0+c2l6ZSA9IGJlMTZfdG9fY3B1KGgtPmxlbmd0aCk7CiAJCXBpLT52bnIgPSAwOwogCX0gZWxzZSB7Ci0JCWNvbm5fZXJyKHRjb25uLCAiV3JvbmcgbWFnaWMgdmFsdWUgMHglMDh4IGluIHByb3RvY29sIHZlcnNpb24gJWRcbiIsCisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJXcm9uZyBtYWdpYyB2YWx1ZSAweCUwOHggaW4gcHJvdG9jb2wgdmVyc2lvbiAlZFxuIiwKIAkJCSBiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKWhlYWRlciksCi0JCQkgdGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbik7CisJCQkgY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXBpLT5kYXRhID0gaGVhZGVyICsgaGVhZGVyX3NpemU7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHJiZF9yZWN2X2hlYWRlcihzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IGRyYmRfcmVjdl9oZWFkZXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQl2b2lkICpidWZmZXIgPSB0Y29ubi0+ZGF0YS5yYnVmOworCXZvaWQgKmJ1ZmZlciA9IGNvbm5lY3Rpb24tPmRhdGEucmJ1ZjsKIAlpbnQgZXJyOwogCi0JZXJyID0gZHJiZF9yZWN2X2FsbF93YXJuKHRjb25uLCBidWZmZXIsIGRyYmRfaGVhZGVyX3NpemUodGNvbm4pKTsKKwllcnIgPSBkcmJkX3JlY3ZfYWxsX3dhcm4oY29ubmVjdGlvbiwgYnVmZmVyLCBkcmJkX2hlYWRlcl9zaXplKGNvbm5lY3Rpb24pKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JZXJyID0gZGVjb2RlX2hlYWRlcih0Y29ubiwgYnVmZmVyLCBwaSk7Ci0JdGNvbm4tPmxhc3RfcmVjZWl2ZWQgPSBqaWZmaWVzOworCWVyciA9IGRlY29kZV9oZWFkZXIoY29ubmVjdGlvbiwgYnVmZmVyLCBwaSk7CisJY29ubmVjdGlvbi0+bGFzdF9yZWNlaXZlZCA9IGppZmZpZXM7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBkcmJkX2ZsdXNoKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3N0YXRpYyB2b2lkIGRyYmRfZmx1c2goc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlpbnQgcnY7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZucjsKIAotCWlmICh0Y29ubi0+d3JpdGVfb3JkZXJpbmcgPj0gV09fYmRldl9mbHVzaCkgeworCWlmIChjb25uZWN0aW9uLT53cml0ZV9vcmRlcmluZyA+PSBXT19iZGV2X2ZsdXNoKSB7CiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKSB7Ci0JCQlpZiAoIWdldF9sZGV2KG1kZXYpKQorCQlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCisJCQlpZiAoIWdldF9sZGV2KGRldmljZSkpCiAJCQkJY29udGludWU7Ci0JCQlrcmVmX2dldCgmbWRldi0+a3JlZik7CisJCQlrcmVmX2dldCgmZGV2aWNlLT5rcmVmKTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCi0JCQlydiA9IGJsa2Rldl9pc3N1ZV9mbHVzaChtZGV2LT5sZGV2LT5iYWNraW5nX2JkZXYsCisJCQlydiA9IGJsa2Rldl9pc3N1ZV9mbHVzaChkZXZpY2UtPmxkZXYtPmJhY2tpbmdfYmRldiwKIAkJCQkJR0ZQX05PSU8sIE5VTEwpOwogCQkJaWYgKHJ2KSB7Ci0JCQkJZGV2X2luZm8oREVWLCAibG9jYWwgZGlzayBmbHVzaCBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIsIHJ2KTsKKwkJCQlkcmJkX2luZm8oZGV2aWNlLCAibG9jYWwgZGlzayBmbHVzaCBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIsIHJ2KTsKIAkJCQkvKiB3b3VsZCByYXRoZXIgY2hlY2sgb24gRU9QTk9UU1VQUCwgYnV0IHRoYXQgaXMgbm90IHJlbGlhYmxlLgogCQkJCSAqIGRvbid0IHRyeSBhZ2FpbiBmb3IgQU5ZIHJldHVybiB2YWx1ZSAhPSAwCiAJCQkJICogaWYgKHJ2ID09IC1FT1BOT1RTVVBQKSAqLwotCQkJCWRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyh0Y29ubiwgV09fZHJhaW5faW8pOworCQkJCWRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyhjb25uZWN0aW9uLCBXT19kcmFpbl9pbyk7CiAJCQl9Ci0JCQlwdXRfbGRldihtZGV2KTsKLQkJCWtyZWZfcHV0KCZtZGV2LT5rcmVmLCAmZHJiZF9taW5vcl9kZXN0cm95KTsKKwkJCXB1dF9sZGV2KGRldmljZSk7CisJCQlrcmVmX3B1dCgmZGV2aWNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKTsKIAogCQkJcmN1X3JlYWRfbG9jaygpOwogCQkJaWYgKHJ2KQpAQCAtMTE3NywxMSArMTE4MiwxMSBAQAogCiAvKioKICAqIGRyYmRfbWF5X2ZpbmlzaF9lcG9jaCgpIC0gQXBwbGllcyBhbiBlcG9jaF9ldmVudCB0byB0aGUgZXBvY2gncyBzdGF0ZSwgZXZlbnR1YWxseSBmaW5pc2hlcyBpdC4KLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQGVwb2NoOglFcG9jaCBvYmplY3QuCiAgKiBAZXY6CQlFcG9jaCBldmVudC4KICAqLwotc3RhdGljIGVudW0gZmluaXNoX2Vwb2NoIGRyYmRfbWF5X2ZpbmlzaF9lcG9jaChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sCitzdGF0aWMgZW51bSBmaW5pc2hfZXBvY2ggZHJiZF9tYXlfZmluaXNoX2Vwb2NoKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCiAJCQkJCSAgICAgICBzdHJ1Y3QgZHJiZF9lcG9jaCAqZXBvY2gsCiAJCQkJCSAgICAgICBlbnVtIGVwb2NoX2V2ZW50IGV2KQogewpAQCAtMTE4OSw3ICsxMTk0LDcgQEAKIAlzdHJ1Y3QgZHJiZF9lcG9jaCAqbmV4dF9lcG9jaDsKIAllbnVtIGZpbmlzaF9lcG9jaCBydiA9IEZFX1NUSUxMX0xJVkU7CiAKLQlzcGluX2xvY2soJnRjb25uLT5lcG9jaF9sb2NrKTsKKwlzcGluX2xvY2soJmNvbm5lY3Rpb24tPmVwb2NoX2xvY2spOwogCWRvIHsKIAkJbmV4dF9lcG9jaCA9IE5VTEw7CiAKQEAgLTEyMTEsMjIgKzEyMTYsMjIgQEAKIAkJICAgIGF0b21pY19yZWFkKCZlcG9jaC0+YWN0aXZlKSA9PSAwICYmCiAJCSAgICAodGVzdF9iaXQoREVfSEFWRV9CQVJSSUVSX05VTUJFUiwgJmVwb2NoLT5mbGFncykgfHwgZXYgJiBFVl9DTEVBTlVQKSkgewogCQkJaWYgKCEoZXYgJiBFVl9DTEVBTlVQKSkgewotCQkJCXNwaW5fdW5sb2NrKCZ0Y29ubi0+ZXBvY2hfbG9jayk7Ci0JCQkJZHJiZF9zZW5kX2JfYWNrKGVwb2NoLT50Y29ubiwgZXBvY2gtPmJhcnJpZXJfbnIsIGVwb2NoX3NpemUpOwotCQkJCXNwaW5fbG9jaygmdGNvbm4tPmVwb2NoX2xvY2spOworCQkJCXNwaW5fdW5sb2NrKCZjb25uZWN0aW9uLT5lcG9jaF9sb2NrKTsKKwkJCQlkcmJkX3NlbmRfYl9hY2soZXBvY2gtPmNvbm5lY3Rpb24sIGVwb2NoLT5iYXJyaWVyX25yLCBlcG9jaF9zaXplKTsKKwkJCQlzcGluX2xvY2soJmNvbm5lY3Rpb24tPmVwb2NoX2xvY2spOwogCQkJfQogI2lmIDAKIAkJCS8qIEZJWE1FOiBkZWMgdW5hY2tlZCBvbiBjb25uZWN0aW9uLCBvbmNlIHdlIGhhdmUKIAkJCSAqIHNvbWV0aGluZyB0byBjb3VudCBwZW5kaW5nIGNvbm5lY3Rpb24gcGFja2V0cyBpbi4gKi8KIAkJCWlmICh0ZXN0X2JpdChERV9IQVZFX0JBUlJJRVJfTlVNQkVSLCAmZXBvY2gtPmZsYWdzKSkKLQkJCQlkZWNfdW5hY2tlZChlcG9jaC0+dGNvbm4pOworCQkJCWRlY191bmFja2VkKGVwb2NoLT5jb25uZWN0aW9uKTsKICNlbmRpZgogCi0JCQlpZiAodGNvbm4tPmN1cnJlbnRfZXBvY2ggIT0gZXBvY2gpIHsKKwkJCWlmIChjb25uZWN0aW9uLT5jdXJyZW50X2Vwb2NoICE9IGVwb2NoKSB7CiAJCQkJbmV4dF9lcG9jaCA9IGxpc3RfZW50cnkoZXBvY2gtPmxpc3QubmV4dCwgc3RydWN0IGRyYmRfZXBvY2gsIGxpc3QpOwogCQkJCWxpc3RfZGVsKCZlcG9jaC0+bGlzdCk7CiAJCQkJZXYgPSBFVl9CRUNBTUVfTEFTVCB8IChldiAmIEVWX0NMRUFOVVApOwotCQkJCXRjb25uLT5lcG9jaHMtLTsKKwkJCQljb25uZWN0aW9uLT5lcG9jaHMtLTsKIAkJCQlrZnJlZShlcG9jaCk7CiAKIAkJCQlpZiAocnYgPT0gRkVfU1RJTExfTElWRSkKQEAgLTEyNDYsMjAgKzEyNTEsMjAgQEAKIAkJZXBvY2ggPSBuZXh0X2Vwb2NoOwogCX0gd2hpbGUgKDEpOwogCi0Jc3Bpbl91bmxvY2soJnRjb25uLT5lcG9jaF9sb2NrKTsKKwlzcGluX3VubG9jaygmY29ubmVjdGlvbi0+ZXBvY2hfbG9jayk7CiAKIAlyZXR1cm4gcnY7CiB9CiAKIC8qKgogICogZHJiZF9idW1wX3dyaXRlX29yZGVyaW5nKCkgLSBGYWxsIGJhY2sgdG8gYW4gb3RoZXIgd3JpdGUgb3JkZXJpbmcgbWV0aG9kCi0gKiBAdGNvbm46CURSQkQgY29ubmVjdGlvbi4KKyAqIEBjb25uZWN0aW9uOglEUkJEIGNvbm5lY3Rpb24uCiAgKiBAd286CQlXcml0ZSBvcmRlcmluZyBtZXRob2QgdG8gdHJ5LgogICovCi12b2lkIGRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGVudW0gd3JpdGVfb3JkZXJpbmdfZSB3bykKK3ZvaWQgZHJiZF9idW1wX3dyaXRlX29yZGVyaW5nKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGVudW0gd3JpdGVfb3JkZXJpbmdfZSB3bykKIHsKIAlzdHJ1Y3QgZGlza19jb25mICpkYzsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAllbnVtIHdyaXRlX29yZGVyaW5nX2UgcHdvOwogCWludCB2bnI7CiAJc3RhdGljIGNoYXIgKndyaXRlX29yZGVyaW5nX3N0cltdID0gewpAQCAtMTI2OCwyOSArMTI3MywzMSBAQAogCQlbV09fYmRldl9mbHVzaF0gPSAiZmx1c2giLAogCX07CiAKLQlwd28gPSB0Y29ubi0+d3JpdGVfb3JkZXJpbmc7CisJcHdvID0gY29ubmVjdGlvbi0+d3JpdGVfb3JkZXJpbmc7CiAJd28gPSBtaW4ocHdvLCB3byk7CiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikgewotCQlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfQVRUQUNISU5HKSkKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisKKwkJaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfQVRUQUNISU5HKSkKIAkJCWNvbnRpbnVlOwotCQlkYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpOworCQlkYyA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZik7CiAKIAkJaWYgKHdvID09IFdPX2JkZXZfZmx1c2ggJiYgIWRjLT5kaXNrX2ZsdXNoZXMpCiAJCQl3byA9IFdPX2RyYWluX2lvOwogCQlpZiAod28gPT0gV09fZHJhaW5faW8gJiYgIWRjLT5kaXNrX2RyYWluKQogCQkJd28gPSBXT19ub25lOwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JdGNvbm4tPndyaXRlX29yZGVyaW5nID0gd287Ci0JaWYgKHB3byAhPSB0Y29ubi0+d3JpdGVfb3JkZXJpbmcgfHwgd28gPT0gV09fYmRldl9mbHVzaCkKLQkJY29ubl9pbmZvKHRjb25uLCAiTWV0aG9kIHRvIGVuc3VyZSB3cml0ZSBvcmRlcmluZzogJXNcbiIsIHdyaXRlX29yZGVyaW5nX3N0clt0Y29ubi0+d3JpdGVfb3JkZXJpbmddKTsKKwljb25uZWN0aW9uLT53cml0ZV9vcmRlcmluZyA9IHdvOworCWlmIChwd28gIT0gY29ubmVjdGlvbi0+d3JpdGVfb3JkZXJpbmcgfHwgd28gPT0gV09fYmRldl9mbHVzaCkKKwkJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJNZXRob2QgdG8gZW5zdXJlIHdyaXRlIG9yZGVyaW5nOiAlc1xuIiwgd3JpdGVfb3JkZXJpbmdfc3RyW2Nvbm5lY3Rpb24tPndyaXRlX29yZGVyaW5nXSk7CiB9CiAKIC8qKgogICogZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KCkKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQHBlZXJfcmVxOglwZWVyIHJlcXVlc3QKICAqIEBydzoJCWZsYWcgZmllbGQsIHNlZSBiaW8tPmJpX3J3CiAgKgpAQCAtMTMwNSw3ICsxMzEyLDcgQEAKICAqICBvbiBjZXJ0YWluIFhlbiBkZXBsb3ltZW50cy4KICAqLwogLyogVE9ETyBhbGxvY2F0ZSBmcm9tIG91ciBvd24gYmlvX3NldC4gKi8KLWludCBkcmJkX3N1Ym1pdF9wZWVyX3JlcXVlc3Qoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK2ludCBkcmJkX3N1Ym1pdF9wZWVyX3JlcXVlc3Qoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkgICAgIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEsCiAJCQkgICAgIGNvbnN0IHVuc2lnbmVkIHJ3LCBjb25zdCBpbnQgZmF1bHRfdHlwZSkKIHsKQEAgLTEzMjksMTIgKzEzMzYsMTIgQEAKIG5leHRfYmlvOgogCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9JTywgbnJfcGFnZXMpOwogCWlmICghYmlvKSB7Ci0JCWRldl9lcnIoREVWLCAic3VibWl0X2VlOiBBbGxvY2F0aW9uIG9mIGEgYmlvIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgInN1Ym1pdF9lZTogQWxsb2NhdGlvbiBvZiBhIGJpbyBmYWlsZWRcbiIpOwogCQlnb3RvIGZhaWw7CiAJfQogCS8qID4gcGVlcl9yZXEtPmkuc2VjdG9yLCB1bmxlc3MgdGhpcyBpcyB0aGUgZmlyc3QgYmlvICovCiAJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IHNlY3RvcjsKLQliaW8tPmJpX2JkZXYgPSBtZGV2LT5sZGV2LT5iYWNraW5nX2JkZXY7CisJYmlvLT5iaV9iZGV2ID0gZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXY7CiAJYmlvLT5iaV9ydyA9IHJ3OwogCWJpby0+YmlfcHJpdmF0ZSA9IHBlZXJfcmVxOwogCWJpby0+YmlfZW5kX2lvID0gZHJiZF9wZWVyX3JlcXVlc3RfZW5kaW87CkBAIC0xMzUwLDcgKzEzNTcsNyBAQAogCQkJICogQnV0IGluIGNhc2UgaXQgZmFpbHMgYW55d2F5cywKIAkJCSAqIHdlIGRlYWwgd2l0aCBpdCwgYW5kIGNvbXBsYWluIChiZWxvdykuICovCiAJCQlpZiAoYmlvLT5iaV92Y250ID09IDApIHsKLQkJCQlkZXZfZXJyKERFViwKKwkJCQlkcmJkX2VycihkZXZpY2UsCiAJCQkJCSJiaW9fYWRkX3BhZ2UgZmFpbGVkIGZvciBsZW49JXUsICIKIAkJCQkJImJpX3ZjbnQ9MCAoYmlfc2VjdG9yPSVsbHUpXG4iLAogCQkJCQlsZW4sICh1aW50NjRfdCliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKQEAgLTEzNjMsOCArMTM3MCw4IEBACiAJCXNlY3RvciArPSBsZW4gPj4gOTsKIAkJLS1ucl9wYWdlczsKIAl9Ci0JRF9BU1NFUlQocGFnZSA9PSBOVUxMKTsKLQlEX0FTU0VSVChkcyA9PSAwKTsKKwlEX0FTU0VSVChkZXZpY2UsIHBhZ2UgPT0gTlVMTCk7CisJRF9BU1NFUlQoZGV2aWNlLCBkcyA9PSAwKTsKIAogCWF0b21pY19zZXQoJnBlZXJfcmVxLT5wZW5kaW5nX2Jpb3MsIG5fYmlvcyk7CiAJZG8gewpAQCAtMTM3Miw3ICsxMzc5LDcgQEAKIAkJYmlvcyA9IGJpb3MtPmJpX25leHQ7CiAJCWJpby0+YmlfbmV4dCA9IE5VTEw7CiAKLQkJZHJiZF9nZW5lcmljX21ha2VfcmVxdWVzdChtZGV2LCBmYXVsdF90eXBlLCBiaW8pOworCQlkcmJkX2dlbmVyaWNfbWFrZV9yZXF1ZXN0KGRldmljZSwgZmF1bHRfdHlwZSwgYmlvKTsKIAl9IHdoaWxlIChiaW9zKTsKIAlyZXR1cm4gMDsKIApAQCAtMTM4NSwzNiArMTM5Miw0NCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIGRyYmRfcmVtb3ZlX2Vwb2NoX2VudHJ5X2ludGVydmFsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgdm9pZCBkcmJkX3JlbW92ZV9lcG9jaF9lbnRyeV9pbnRlcnZhbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJCQkJICAgICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQogewogCXN0cnVjdCBkcmJkX2ludGVydmFsICppID0gJnBlZXJfcmVxLT5pOwogCi0JZHJiZF9yZW1vdmVfaW50ZXJ2YWwoJm1kZXYtPndyaXRlX3JlcXVlc3RzLCBpKTsKKwlkcmJkX3JlbW92ZV9pbnRlcnZhbCgmZGV2aWNlLT53cml0ZV9yZXF1ZXN0cywgaSk7CiAJZHJiZF9jbGVhcl9pbnRlcnZhbChpKTsKIAogCS8qIFdha2UgdXAgYW55IHByb2Nlc3NlcyB3YWl0aW5nIGZvciB0aGlzIHBlZXIgcmVxdWVzdCB0byBjb21wbGV0ZS4gICovCiAJaWYgKGktPndhaXRpbmcpCi0JCXdha2VfdXAoJm1kZXYtPm1pc2Nfd2FpdCk7CisJCXdha2VfdXAoJmRldmljZS0+bWlzY193YWl0KTsKIH0KIAotdm9pZCBjb25uX3dhaXRfYWN0aXZlX2VlX2VtcHR5KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3N0YXRpYyB2b2lkIGNvbm5fd2FpdF9hY3RpdmVfZWVfZW1wdHkoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikgewotCQlrcmVmX2dldCgmbWRldi0+a3JlZik7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCisJCWtyZWZfZ2V0KCZkZXZpY2UtPmtyZWYpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkobWRldiwgJm1kZXYtPmFjdGl2ZV9lZSk7Ci0JCWtyZWZfcHV0KCZtZGV2LT5rcmVmLCAmZHJiZF9taW5vcl9kZXN0cm95KTsKKwkJZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkoZGV2aWNlLCAmZGV2aWNlLT5hY3RpdmVfZWUpOworCQlrcmVmX3B1dCgmZGV2aWNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKTsKIAkJcmN1X3JlYWRfbG9jaygpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX0JhcnJpZXIoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICoKK2Nvbm5fcGVlcl9kZXZpY2Uoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IHZvbHVtZV9udW1iZXIpCit7CisJcmV0dXJuIGlkcl9maW5kKCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHZvbHVtZV9udW1iZXIpOworfQorCitzdGF0aWMgaW50IHJlY2VpdmVfQmFycmllcihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewogCWludCBydjsKIAlzdHJ1Y3QgcF9iYXJyaWVyICpwID0gcGktPmRhdGE7CkBAIC0xNDIzLDE2ICsxNDM4LDE2IEBACiAJLyogRklYTUUgdGhlc2UgYXJlIHVuYWNrZWQgb24gY29ubmVjdGlvbiwKIAkgKiBub3QgYSBzcGVjaWZpYyAocGVlcilkZXZpY2UuCiAJICovCi0JdGNvbm4tPmN1cnJlbnRfZXBvY2gtPmJhcnJpZXJfbnIgPSBwLT5iYXJyaWVyOwotCXRjb25uLT5jdXJyZW50X2Vwb2NoLT50Y29ubiA9IHRjb25uOwotCXJ2ID0gZHJiZF9tYXlfZmluaXNoX2Vwb2NoKHRjb25uLCB0Y29ubi0+Y3VycmVudF9lcG9jaCwgRVZfR09UX0JBUlJJRVJfTlIpOworCWNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmJhcnJpZXJfbnIgPSBwLT5iYXJyaWVyOworCWNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCXJ2ID0gZHJiZF9tYXlfZmluaXNoX2Vwb2NoKGNvbm5lY3Rpb24sIGNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gsIEVWX0dPVF9CQVJSSUVSX05SKTsKIAogCS8qIFBfQkFSUklFUl9BQ0sgbWF5IGltcGx5IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgZXh0ZW50IGlzIGRyb3BwZWQgZnJvbQogCSAqIHRoZSBhY3Rpdml0eSBsb2csIHdoaWNoIG1lYW5zIGl0IHdvdWxkIG5vdCBiZSByZXN5bmNlZCBpbiBjYXNlIHRoZQogCSAqIFJfUFJJTUFSWSBjcmFzaGVzIG5vdy4KIAkgKiBUaGVyZWZvcmUgd2UgbXVzdCBzZW5kIHRoZSBiYXJyaWVyX2FjayBhZnRlciB0aGUgYmFycmllciByZXF1ZXN0IHdhcwogCSAqIGNvbXBsZXRlZC4gKi8KLQlzd2l0Y2ggKHRjb25uLT53cml0ZV9vcmRlcmluZykgeworCXN3aXRjaCAoY29ubmVjdGlvbi0+d3JpdGVfb3JkZXJpbmcpIHsKIAljYXNlIFdPX25vbmU6CiAJCWlmIChydiA9PSBGRV9SRUNZQ0xFRCkKIAkJCXJldHVybiAwOwpAQCAtMTQ0MywxNSArMTQ1OCwxNSBAQAogCQlpZiAoZXBvY2gpCiAJCQlicmVhazsKIAkJZWxzZQotCQkJY29ubl93YXJuKHRjb25uLCAiQWxsb2NhdGlvbiBvZiBhbiBlcG9jaCBmYWlsZWQsIHNsb3dpbmcgZG93blxuIik7CisJCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgIkFsbG9jYXRpb24gb2YgYW4gZXBvY2ggZmFpbGVkLCBzbG93aW5nIGRvd25cbiIpOwogCQkJLyogRmFsbCB0aHJvdWdoICovCiAKIAljYXNlIFdPX2JkZXZfZmx1c2g6CiAJY2FzZSBXT19kcmFpbl9pbzoKLQkJY29ubl93YWl0X2FjdGl2ZV9lZV9lbXB0eSh0Y29ubik7Ci0JCWRyYmRfZmx1c2godGNvbm4pOworCQljb25uX3dhaXRfYWN0aXZlX2VlX2VtcHR5KGNvbm5lY3Rpb24pOworCQlkcmJkX2ZsdXNoKGNvbm5lY3Rpb24pOwogCi0JCWlmIChhdG9taWNfcmVhZCgmdGNvbm4tPmN1cnJlbnRfZXBvY2gtPmVwb2NoX3NpemUpKSB7CisJCWlmIChhdG9taWNfcmVhZCgmY29ubmVjdGlvbi0+Y3VycmVudF9lcG9jaC0+ZXBvY2hfc2l6ZSkpIHsKIAkJCWVwb2NoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfZXBvY2gpLCBHRlBfTk9JTyk7CiAJCQlpZiAoZXBvY2gpCiAJCQkJYnJlYWs7CkBAIC0xNDU5LDcgKzE0NzQsNyBAQAogCiAJCXJldHVybiAwOwogCWRlZmF1bHQ6Ci0JCWNvbm5fZXJyKHRjb25uLCAiU3RyYW5nZW5lc3MgaW4gdGNvbm4tPndyaXRlX29yZGVyaW5nICVkXG4iLCB0Y29ubi0+d3JpdGVfb3JkZXJpbmcpOworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiU3RyYW5nZW5lc3MgaW4gY29ubmVjdGlvbi0+d3JpdGVfb3JkZXJpbmcgJWRcbiIsIGNvbm5lY3Rpb24tPndyaXRlX29yZGVyaW5nKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0xNDY3LDE2ICsxNDgyLDE2IEBACiAJYXRvbWljX3NldCgmZXBvY2gtPmVwb2NoX3NpemUsIDApOwogCWF0b21pY19zZXQoJmVwb2NoLT5hY3RpdmUsIDApOwogCi0Jc3Bpbl9sb2NrKCZ0Y29ubi0+ZXBvY2hfbG9jayk7Ci0JaWYgKGF0b21pY19yZWFkKCZ0Y29ubi0+Y3VycmVudF9lcG9jaC0+ZXBvY2hfc2l6ZSkpIHsKLQkJbGlzdF9hZGQoJmVwb2NoLT5saXN0LCAmdGNvbm4tPmN1cnJlbnRfZXBvY2gtPmxpc3QpOwotCQl0Y29ubi0+Y3VycmVudF9lcG9jaCA9IGVwb2NoOwotCQl0Y29ubi0+ZXBvY2hzKys7CisJc3Bpbl9sb2NrKCZjb25uZWN0aW9uLT5lcG9jaF9sb2NrKTsKKwlpZiAoYXRvbWljX3JlYWQoJmNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmVwb2NoX3NpemUpKSB7CisJCWxpc3RfYWRkKCZlcG9jaC0+bGlzdCwgJmNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmxpc3QpOworCQljb25uZWN0aW9uLT5jdXJyZW50X2Vwb2NoID0gZXBvY2g7CisJCWNvbm5lY3Rpb24tPmVwb2NocysrOwogCX0gZWxzZSB7CiAJCS8qIFRoZSBjdXJyZW50X2Vwb2NoIGdvdCByZWN5Y2xlZCB3aGlsZSB3ZSBhbGxvY2F0ZWQgdGhpcyBvbmUuLi4gKi8KIAkJa2ZyZWUoZXBvY2gpOwogCX0KLQlzcGluX3VubG9jaygmdGNvbm4tPmVwb2NoX2xvY2spOworCXNwaW5fdW5sb2NrKCZjb25uZWN0aW9uLT5lcG9jaF9sb2NrKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTQ4NCwyNSArMTQ5OSwyNiBAQAogLyogdXNlZCBmcm9tIHJlY2VpdmVfUlNEYXRhUmVwbHkgKHJlY3ZfcmVzeW5jX3JlYWQpCiAgKiBhbmQgZnJvbSByZWNlaXZlX0RhdGEgKi8KIHN0YXRpYyBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKgotcmVhZF9pbl9ibG9jayhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1NjQgaWQsIHNlY3Rvcl90IHNlY3RvciwKK3JlYWRfaW5fYmxvY2soc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCB1NjQgaWQsIHNlY3Rvcl90IHNlY3RvciwKIAkgICAgICBpbnQgZGF0YV9zaXplKSBfX211c3RfaG9sZChsb2NhbCkKIHsKLQljb25zdCBzZWN0b3JfdCBjYXBhY2l0eSA9IGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldik7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCWNvbnN0IHNlY3Rvcl90IGNhcGFjaXR5ID0gZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT50aGlzX2JkZXYpOwogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXE7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50IGRncywgZHMsIGVycjsKLQl2b2lkICpkaWdfaW4gPSBtZGV2LT50Y29ubi0+aW50X2RpZ19pbjsKLQl2b2lkICpkaWdfdnYgPSBtZGV2LT50Y29ubi0+aW50X2RpZ192djsKKwl2b2lkICpkaWdfaW4gPSBwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+aW50X2RpZ19pbjsKKwl2b2lkICpkaWdfdnYgPSBwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+aW50X2RpZ192djsKIAl1bnNpZ25lZCBsb25nICpkYXRhOwogCiAJZGdzID0gMDsKLQlpZiAobWRldi0+dGNvbm4tPnBlZXJfaW50ZWdyaXR5X3RmbSkgewotCQlkZ3MgPSBjcnlwdG9faGFzaF9kaWdlc3RzaXplKG1kZXYtPnRjb25uLT5wZWVyX2ludGVncml0eV90Zm0pOworCWlmIChwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+cGVlcl9pbnRlZ3JpdHlfdGZtKSB7CisJCWRncyA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnBlZXJfaW50ZWdyaXR5X3RmbSk7CiAJCS8qCiAJCSAqIEZJWE1FOiBSZWNlaXZlIHRoZSBpbmNvbWluZyBkaWdlc3QgaW50byB0aGUgcmVjZWl2ZSBidWZmZXIKIAkJICoJICBoZXJlLCB0b2dldGhlciB3aXRoIGl0cyBzdHJ1Y3QgcF9kYXRhPwogCQkgKi8KLQkJZXJyID0gZHJiZF9yZWN2X2FsbF93YXJuKG1kZXYtPnRjb25uLCBkaWdfaW4sIGRncyk7CisJCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgZGlnX2luLCBkZ3MpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIE5VTEw7CiAJCWRhdGFfc2l6ZSAtPSBkZ3M7CkBAIC0xNTE2LDcgKzE1MzIsNyBAQAogCS8qIGV2ZW4gdGhvdWdoIHdlIHRydXN0IG91dCBwZWVyLAogCSAqIHdlIHNvbWV0aW1lcyBoYXZlIHRvIGRvdWJsZSBjaGVjay4gKi8KIAlpZiAoc2VjdG9yICsgKGRhdGFfc2l6ZT4+OSkgPiBjYXBhY2l0eSkgewotCQlkZXZfZXJyKERFViwgInJlcXVlc3QgZnJvbSBwZWVyIGJleW9uZCBlbmQgb2YgbG9jYWwgZGlzazogIgorCQlkcmJkX2VycihkZXZpY2UsICJyZXF1ZXN0IGZyb20gcGVlciBiZXlvbmQgZW5kIG9mIGxvY2FsIGRpc2s6ICIKIAkJCSJjYXBhY2l0eTogJWxsdXMgPCBzZWN0b3I6ICVsbHVzICsgc2l6ZTogJXVcbiIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKWNhcGFjaXR5LAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IsIGRhdGFfc2l6ZSk7CkBAIC0xNTI2LDcgKzE1NDIsNyBAQAogCS8qIEdGUF9OT0lPLCBiZWNhdXNlIHdlIG11c3Qgbm90IGNhdXNlIGFyYml0cmFyeSB3cml0ZS1vdXQ6IGluIGEgRFJCRAogCSAqICJjcmlzcy1jcm9zcyIgc2V0dXAsIHRoYXQgbWlnaHQgY2F1c2Ugd3JpdGUtb3V0IG9uIHNvbWUgb3RoZXIgRFJCRCwKIAkgKiB3aGljaCBpbiB0dXJuIG1pZ2h0IGJsb2NrIG9uIHRoZSBvdGhlciBub2RlIGF0IHRoaXMgdmVyeSBwbGFjZS4gICovCi0JcGVlcl9yZXEgPSBkcmJkX2FsbG9jX3BlZXJfcmVxKG1kZXYsIGlkLCBzZWN0b3IsIGRhdGFfc2l6ZSwgR0ZQX05PSU8pOworCXBlZXJfcmVxID0gZHJiZF9hbGxvY19wZWVyX3JlcShwZWVyX2RldmljZSwgaWQsIHNlY3RvciwgZGF0YV9zaXplLCBHRlBfTk9JTyk7CiAJaWYgKCFwZWVyX3JlcSkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTE1MzgsMzYgKzE1NTQsMzYgQEAKIAlwYWdlX2NoYWluX2Zvcl9lYWNoKHBhZ2UpIHsKIAkJdW5zaWduZWQgbGVuID0gbWluX3QoaW50LCBkcywgUEFHRV9TSVpFKTsKIAkJZGF0YSA9IGttYXAocGFnZSk7Ci0JCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihtZGV2LT50Y29ubiwgZGF0YSwgbGVuKTsKLQkJaWYgKGRyYmRfaW5zZXJ0X2ZhdWx0KG1kZXYsIERSQkRfRkFVTFRfUkVDRUlWRSkpIHsKLQkJCWRldl9lcnIoREVWLCAiRmF1bHQgaW5qZWN0aW9uOiBDb3JydXB0aW5nIGRhdGEgb24gcmVjZWl2ZVxuIik7CisJCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgZGF0YSwgbGVuKTsKKwkJaWYgKGRyYmRfaW5zZXJ0X2ZhdWx0KGRldmljZSwgRFJCRF9GQVVMVF9SRUNFSVZFKSkgeworCQkJZHJiZF9lcnIoZGV2aWNlLCAiRmF1bHQgaW5qZWN0aW9uOiBDb3JydXB0aW5nIGRhdGEgb24gcmVjZWl2ZVxuIik7CiAJCQlkYXRhWzBdID0gZGF0YVswXSBeICh1bnNpZ25lZCBsb25nKS0xOwogCQl9CiAJCWt1bm1hcChwYWdlKTsKIAkJaWYgKGVycikgewotCQkJZHJiZF9mcmVlX3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKKwkJCWRyYmRfZnJlZV9wZWVyX3JlcShkZXZpY2UsIHBlZXJfcmVxKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCWRzIC09IGxlbjsKIAl9CiAKIAlpZiAoZGdzKSB7Ci0JCWRyYmRfY3N1bV9lZShtZGV2LCBtZGV2LT50Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtLCBwZWVyX3JlcSwgZGlnX3Z2KTsKKwkJZHJiZF9jc3VtX2VlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5wZWVyX2ludGVncml0eV90Zm0sIHBlZXJfcmVxLCBkaWdfdnYpOwogCQlpZiAobWVtY21wKGRpZ19pbiwgZGlnX3Z2LCBkZ3MpKSB7Ci0JCQlkZXZfZXJyKERFViwgIkRpZ2VzdCBpbnRlZ3JpdHkgY2hlY2sgRkFJTEVEOiAlbGx1cyArJXVcbiIsCisJCQlkcmJkX2VycihkZXZpY2UsICJEaWdlc3QgaW50ZWdyaXR5IGNoZWNrIEZBSUxFRDogJWxsdXMgKyV1XG4iLAogCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLCBkYXRhX3NpemUpOwotCQkJZHJiZF9mcmVlX3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKKwkJCWRyYmRfZnJlZV9wZWVyX3JlcShkZXZpY2UsIHBlZXJfcmVxKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJfQotCW1kZXYtPnJlY3ZfY250ICs9IGRhdGFfc2l6ZT4+OTsKKwlkZXZpY2UtPnJlY3ZfY250ICs9IGRhdGFfc2l6ZT4+OTsKIAlyZXR1cm4gcGVlcl9yZXE7CiB9CiAKIC8qIGRyYmRfZHJhaW5fYmxvY2soKSBqdXN0IHRha2VzIGEgZGF0YSBibG9jawogICogb3V0IG9mIHRoZSBzb2NrZXQgaW5wdXQgYnVmZmVyLCBhbmQgZGlzY2FyZHMgaXQuCiAgKi8KLXN0YXRpYyBpbnQgZHJiZF9kcmFpbl9ibG9jayhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgZGF0YV9zaXplKQorc3RhdGljIGludCBkcmJkX2RyYWluX2Jsb2NrKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgaW50IGRhdGFfc2l6ZSkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlpbnQgZXJyID0gMDsKQEAgLTE1NzYsMzYgKzE1OTIsMzYgQEAKIAlpZiAoIWRhdGFfc2l6ZSkKIAkJcmV0dXJuIDA7CiAKLQlwYWdlID0gZHJiZF9hbGxvY19wYWdlcyhtZGV2LCAxLCAxKTsKKwlwYWdlID0gZHJiZF9hbGxvY19wYWdlcyhwZWVyX2RldmljZSwgMSwgMSk7CiAKIAlkYXRhID0ga21hcChwYWdlKTsKIAl3aGlsZSAoZGF0YV9zaXplKSB7CiAJCXVuc2lnbmVkIGludCBsZW4gPSBtaW5fdChpbnQsIGRhdGFfc2l6ZSwgUEFHRV9TSVpFKTsKIAotCQllcnIgPSBkcmJkX3JlY3ZfYWxsX3dhcm4obWRldi0+dGNvbm4sIGRhdGEsIGxlbik7CisJCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgZGF0YSwgbGVuKTsKIAkJaWYgKGVycikKIAkJCWJyZWFrOwogCQlkYXRhX3NpemUgLT0gbGVuOwogCX0KIAlrdW5tYXAocGFnZSk7Ci0JZHJiZF9mcmVlX3BhZ2VzKG1kZXYsIHBhZ2UsIDApOworCWRyYmRfZnJlZV9wYWdlcyhwZWVyX2RldmljZS0+ZGV2aWNlLCBwYWdlLCAwKTsKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHJlY3ZfZGxlc3NfcmVhZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEsCitzdGF0aWMgaW50IHJlY3ZfZGxlc3NfcmVhZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSwKIAkJCSAgIHNlY3Rvcl90IHNlY3RvciwgaW50IGRhdGFfc2l6ZSkKIHsKIAlzdHJ1Y3QgYmlvX3ZlYyBidmVjOwogCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKIAlzdHJ1Y3QgYmlvICpiaW87CiAJaW50IGRncywgZXJyLCBleHBlY3Q7Ci0Jdm9pZCAqZGlnX2luID0gbWRldi0+dGNvbm4tPmludF9kaWdfaW47Ci0Jdm9pZCAqZGlnX3Z2ID0gbWRldi0+dGNvbm4tPmludF9kaWdfdnY7CisJdm9pZCAqZGlnX2luID0gcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmludF9kaWdfaW47CisJdm9pZCAqZGlnX3Z2ID0gcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmludF9kaWdfdnY7CiAKIAlkZ3MgPSAwOwotCWlmIChtZGV2LT50Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtKSB7Ci0JCWRncyA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUobWRldi0+dGNvbm4tPnBlZXJfaW50ZWdyaXR5X3RmbSk7Ci0JCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihtZGV2LT50Y29ubiwgZGlnX2luLCBkZ3MpOworCWlmIChwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+cGVlcl9pbnRlZ3JpdHlfdGZtKSB7CisJCWRncyA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnBlZXJfaW50ZWdyaXR5X3RmbSk7CisJCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgZGlnX2luLCBkZ3MpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAkJZGF0YV9zaXplIC09IGRnczsKQEAgLTE2MTMsMTUgKzE2MjksMTUgQEAKIAogCS8qIG9wdGltaXN0aWNhbGx5IHVwZGF0ZSByZWN2X2NudC4gIGlmIHJlY2VpdmluZyBmYWlscyBiZWxvdywKIAkgKiB3ZSBkaXNjb25uZWN0IGFueXdheXMsIGFuZCBjb3VudGVycyB3aWxsIGJlIHJlc2V0LiAqLwotCW1kZXYtPnJlY3ZfY250ICs9IGRhdGFfc2l6ZT4+OTsKKwlwZWVyX2RldmljZS0+ZGV2aWNlLT5yZWN2X2NudCArPSBkYXRhX3NpemU+Pjk7CiAKIAliaW8gPSByZXEtPm1hc3Rlcl9iaW87Ci0JRF9BU1NFUlQoc2VjdG9yID09IGJpby0+YmlfaXRlci5iaV9zZWN0b3IpOworCURfQVNTRVJUKHBlZXJfZGV2aWNlLT5kZXZpY2UsIHNlY3RvciA9PSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKIAogCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaXRlcikgewogCQl2b2lkICptYXBwZWQgPSBrbWFwKGJ2ZWMuYnZfcGFnZSkgKyBidmVjLmJ2X29mZnNldDsKIAkJZXhwZWN0ID0gbWluX3QoaW50LCBkYXRhX3NpemUsIGJ2ZWMuYnZfbGVuKTsKLQkJZXJyID0gZHJiZF9yZWN2X2FsbF93YXJuKG1kZXYtPnRjb25uLCBtYXBwZWQsIGV4cGVjdCk7CisJCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgbWFwcGVkLCBleHBlY3QpOwogCQlrdW5tYXAoYnZlYy5idl9wYWdlKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CkBAIC0xNjI5LDE0ICsxNjQ1LDE0IEBACiAJfQogCiAJaWYgKGRncykgewotCQlkcmJkX2NzdW1fYmlvKG1kZXYsIG1kZXYtPnRjb25uLT5wZWVyX2ludGVncml0eV90Zm0sIGJpbywgZGlnX3Z2KTsKKwkJZHJiZF9jc3VtX2JpbyhwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+cGVlcl9pbnRlZ3JpdHlfdGZtLCBiaW8sIGRpZ192dik7CiAJCWlmIChtZW1jbXAoZGlnX2luLCBkaWdfdnYsIGRncykpIHsKLQkJCWRldl9lcnIoREVWLCAiRGlnZXN0IGludGVncml0eSBjaGVjayBGQUlMRUQuIEJyb2tlbiBOSUNzP1xuIik7CisJCQlkcmJkX2VycihwZWVyX2RldmljZSwgIkRpZ2VzdCBpbnRlZ3JpdHkgY2hlY2sgRkFJTEVELiBCcm9rZW4gTklDcz9cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CiAKLQlEX0FTU0VSVChkYXRhX3NpemUgPT0gMCk7CisJRF9BU1NFUlQocGVlcl9kZXZpY2UtPmRldmljZSwgZGF0YV9zaXplID09IDApOwogCXJldHVybiAwOwogfQogCkBAIC0xNjQ4LDY0ICsxNjY0LDY3IEBACiB7CiAJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSA9CiAJCWNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QsIHcpOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSA9IHBlZXJfcmVxLT5wZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAJc2VjdG9yX3Qgc2VjdG9yID0gcGVlcl9yZXEtPmkuc2VjdG9yOwogCWludCBlcnI7CiAKLQlEX0FTU0VSVChkcmJkX2ludGVydmFsX2VtcHR5KCZwZWVyX3JlcS0+aSkpOworCURfQVNTRVJUKGRldmljZSwgZHJiZF9pbnRlcnZhbF9lbXB0eSgmcGVlcl9yZXEtPmkpKTsKIAogCWlmIChsaWtlbHkoKHBlZXJfcmVxLT5mbGFncyAmIEVFX1dBU19FUlJPUikgPT0gMCkpIHsKLQkJZHJiZF9zZXRfaW5fc3luYyhtZGV2LCBzZWN0b3IsIHBlZXJfcmVxLT5pLnNpemUpOwotCQllcnIgPSBkcmJkX3NlbmRfYWNrKG1kZXYsIFBfUlNfV1JJVEVfQUNLLCBwZWVyX3JlcSk7CisJCWRyYmRfc2V0X2luX3N5bmMoZGV2aWNlLCBzZWN0b3IsIHBlZXJfcmVxLT5pLnNpemUpOworCQllcnIgPSBkcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBQX1JTX1dSSVRFX0FDSywgcGVlcl9yZXEpOwogCX0gZWxzZSB7CiAJCS8qIFJlY29yZCBmYWlsdXJlIHRvIHN5bmMgKi8KLQkJZHJiZF9yc19mYWlsZWRfaW8obWRldiwgc2VjdG9yLCBwZWVyX3JlcS0+aS5zaXplKTsKKwkJZHJiZF9yc19mYWlsZWRfaW8oZGV2aWNlLCBzZWN0b3IsIHBlZXJfcmVxLT5pLnNpemUpOwogCi0JCWVyciAgPSBkcmJkX3NlbmRfYWNrKG1kZXYsIFBfTkVHX0FDSywgcGVlcl9yZXEpOworCQllcnIgID0gZHJiZF9zZW5kX2FjayhwZWVyX2RldmljZSwgUF9ORUdfQUNLLCBwZWVyX3JlcSk7CiAJfQotCWRlY191bmFja2VkKG1kZXYpOworCWRlY191bmFja2VkKGRldmljZSk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHJlY3ZfcmVzeW5jX3JlYWQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgZGF0YV9zaXplKSBfX3JlbGVhc2VzKGxvY2FsKQorc3RhdGljIGludCByZWN2X3Jlc3luY19yZWFkKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgc2VjdG9yX3Qgc2VjdG9yLAorCQkJICAgIGludCBkYXRhX3NpemUpIF9fcmVsZWFzZXMobG9jYWwpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXE7CiAKLQlwZWVyX3JlcSA9IHJlYWRfaW5fYmxvY2sobWRldiwgSURfU1lOQ0VSLCBzZWN0b3IsIGRhdGFfc2l6ZSk7CisJcGVlcl9yZXEgPSByZWFkX2luX2Jsb2NrKHBlZXJfZGV2aWNlLCBJRF9TWU5DRVIsIHNlY3RvciwgZGF0YV9zaXplKTsKIAlpZiAoIXBlZXJfcmVxKQogCQlnb3RvIGZhaWw7CiAKLQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKKwlkZWNfcnNfcGVuZGluZyhkZXZpY2UpOwogCi0JaW5jX3VuYWNrZWQobWRldik7CisJaW5jX3VuYWNrZWQoZGV2aWNlKTsKIAkvKiBjb3JyZXNwb25kaW5nIGRlY191bmFja2VkKCkgaW4gZV9lbmRfcmVzeW5jX2Jsb2NrKCkKIAkgKiByZXNwZWN0aXZlIF9kcmJkX2NsZWFyX2RvbmVfZWUgKi8KIAogCXBlZXJfcmVxLT53LmNiID0gZV9lbmRfcmVzeW5jX2Jsb2NrOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlsaXN0X2FkZCgmcGVlcl9yZXEtPncubGlzdCwgJm1kZXYtPnN5bmNfZWUpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJbGlzdF9hZGQoJnBlZXJfcmVxLT53Lmxpc3QsICZkZXZpY2UtPnN5bmNfZWUpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCi0JYXRvbWljX2FkZChkYXRhX3NpemUgPj4gOSwgJm1kZXYtPnJzX3NlY3RfZXYpOwotCWlmIChkcmJkX3N1Ym1pdF9wZWVyX3JlcXVlc3QobWRldiwgcGVlcl9yZXEsIFdSSVRFLCBEUkJEX0ZBVUxUX1JTX1dSKSA9PSAwKQorCWF0b21pY19hZGQoZGF0YV9zaXplID4+IDksICZkZXZpY2UtPnJzX3NlY3RfZXYpOworCWlmIChkcmJkX3N1Ym1pdF9wZWVyX3JlcXVlc3QoZGV2aWNlLCBwZWVyX3JlcSwgV1JJVEUsIERSQkRfRkFVTFRfUlNfV1IpID09IDApCiAJCXJldHVybiAwOwogCiAJLyogZG9uJ3QgY2FyZSBmb3IgdGhlIHJlYXNvbiBoZXJlICovCi0JZGV2X2VycihERVYsICJzdWJtaXQgZmFpbGVkLCB0cmlnZ2VyaW5nIHJlLWNvbm5lY3RcbiIpOwotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJZHJiZF9lcnIoZGV2aWNlLCAic3VibWl0IGZhaWxlZCwgdHJpZ2dlcmluZyByZS1jb25uZWN0XG4iKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJbGlzdF9kZWwoJnBlZXJfcmVxLT53Lmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAotCWRyYmRfZnJlZV9wZWVyX3JlcShtZGV2LCBwZWVyX3JlcSk7CisJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOwogZmFpbDoKLQlwdXRfbGRldihtZGV2KTsKKwlwdXRfbGRldihkZXZpY2UpOwogCXJldHVybiAtRUlPOwogfQogCiBzdGF0aWMgc3RydWN0IGRyYmRfcmVxdWVzdCAqCi1maW5kX3JlcXVlc3Qoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCBpZCwKK2ZpbmRfcmVxdWVzdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCBpZCwKIAkgICAgIHNlY3Rvcl90IHNlY3RvciwgYm9vbCBtaXNzaW5nX29rLCBjb25zdCBjaGFyICpmdW5jKQogewogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcTsKQEAgLTE3MTUsMzYgKzE3MzQsMzggQEAKIAlpZiAoZHJiZF9jb250YWluc19pbnRlcnZhbChyb290LCBzZWN0b3IsICZyZXEtPmkpICYmIHJlcS0+aS5sb2NhbCkKIAkJcmV0dXJuIHJlcTsKIAlpZiAoIW1pc3Npbmdfb2spIHsKLQkJZGV2X2VycihERVYsICIlczogZmFpbGVkIHRvIGZpbmQgcmVxdWVzdCAweCVseCwgc2VjdG9yICVsbHVzXG4iLCBmdW5jLAorCQlkcmJkX2VycihkZXZpY2UsICIlczogZmFpbGVkIHRvIGZpbmQgcmVxdWVzdCAweCVseCwgc2VjdG9yICVsbHVzXG4iLCBmdW5jLAogCQkJKHVuc2lnbmVkIGxvbmcpaWQsICh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yKTsKIAl9CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9EYXRhUmVwbHkoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCByZWNlaXZlX0RhdGFSZXBseShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcTsKIAlzZWN0b3JfdCBzZWN0b3I7CiAJaW50IGVycjsKIAlzdHJ1Y3QgcF9kYXRhICpwID0gcGktPmRhdGE7CiAKLQltZGV2ID0gdm5yX3RvX21kZXYodGNvbm4sIHBpLT52bnIpOwotCWlmICghbWRldikKKwlwZWVyX2RldmljZSA9IGNvbm5fcGVlcl9kZXZpY2UoY29ubmVjdGlvbiwgcGktPnZucik7CisJaWYgKCFwZWVyX2RldmljZSkKIAkJcmV0dXJuIC1FSU87CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAogCXNlY3RvciA9IGJlNjRfdG9fY3B1KHAtPnNlY3Rvcik7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCXJlcSA9IGZpbmRfcmVxdWVzdChtZGV2LCAmbWRldi0+cmVhZF9yZXF1ZXN0cywgcC0+YmxvY2tfaWQsIHNlY3RvciwgZmFsc2UsIF9fZnVuY19fKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCXJlcSA9IGZpbmRfcmVxdWVzdChkZXZpY2UsICZkZXZpY2UtPnJlYWRfcmVxdWVzdHMsIHAtPmJsb2NrX2lkLCBzZWN0b3IsIGZhbHNlLCBfX2Z1bmNfXyk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJaWYgKHVubGlrZWx5KCFyZXEpKQogCQlyZXR1cm4gLUVJTzsKIAogCS8qIGhsaXN0X2RlbCgmcmVxLT5jb2xsaXNpb24pIGlzIGRvbmUgaW4gX3JlcV9tYXlfYmVfZG9uZSwgdG8gYXZvaWQKIAkgKiBzcGVjaWFsIGNhc2luZyBpdCB0aGVyZSBmb3IgdGhlIHZhcmlvdXMgZmFpbHVyZSBjYXNlcy4KIAkgKiBzdGlsbCBubyByYWNlIHdpdGggZHJiZF9mYWlsX3BlbmRpbmdfcmVhZHMgKi8KLQllcnIgPSByZWN2X2RsZXNzX3JlYWQobWRldiwgcmVxLCBzZWN0b3IsIHBpLT5zaXplKTsKKwllcnIgPSByZWN2X2RsZXNzX3JlYWQocGVlcl9kZXZpY2UsIHJlcSwgc2VjdG9yLCBwaS0+c2l6ZSk7CiAJaWYgKCFlcnIpCiAJCXJlcV9tb2QocmVxLCBEQVRBX1JFQ0VJVkVEKTsKIAkvKiBlbHNlOiBub3RoaW5nLiBoYW5kbGVkIGZyb20gZHJiZF9kaXNjb25uZWN0Li4uCkBAIC0xNzU0LDQ2ICsxNzc1LDQ4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX1JTRGF0YVJlcGx5KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV9SU0RhdGFSZXBseShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXNlY3Rvcl90IHNlY3RvcjsKIAlpbnQgZXJyOwogCXN0cnVjdCBwX2RhdGEgKnAgPSBwaS0+ZGF0YTsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQorCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQogCQlyZXR1cm4gLUVJTzsKKwlkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCiAJc2VjdG9yID0gYmU2NF90b19jcHUocC0+c2VjdG9yKTsKLQlEX0FTU0VSVChwLT5ibG9ja19pZCA9PSBJRF9TWU5DRVIpOworCURfQVNTRVJUKGRldmljZSwgcC0+YmxvY2tfaWQgPT0gSURfU1lOQ0VSKTsKIAotCWlmIChnZXRfbGRldihtZGV2KSkgeworCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CiAJCS8qIGRhdGEgaXMgc3VibWl0dGVkIHRvIGRpc2sgd2l0aGluIHJlY3ZfcmVzeW5jX3JlYWQuCiAJCSAqIGNvcnJlc3BvbmRpbmcgcHV0X2xkZXYgZG9uZSBiZWxvdyBvbiBlcnJvciwKIAkJICogb3IgaW4gZHJiZF9wZWVyX3JlcXVlc3RfZW5kaW8uICovCi0JCWVyciA9IHJlY3ZfcmVzeW5jX3JlYWQobWRldiwgc2VjdG9yLCBwaS0+c2l6ZSk7CisJCWVyciA9IHJlY3ZfcmVzeW5jX3JlYWQocGVlcl9kZXZpY2UsIHNlY3RvciwgcGktPnNpemUpOwogCX0gZWxzZSB7CiAJCWlmIChfX3JhdGVsaW1pdCgmZHJiZF9yYXRlbGltaXRfc3RhdGUpKQotCQkJZGV2X2VycihERVYsICJDYW4gbm90IHdyaXRlIHJlc3luYyBkYXRhIHRvIGxvY2FsIGRpc2suXG4iKTsKKwkJCWRyYmRfZXJyKGRldmljZSwgIkNhbiBub3Qgd3JpdGUgcmVzeW5jIGRhdGEgdG8gbG9jYWwgZGlzay5cbiIpOwogCi0JCWVyciA9IGRyYmRfZHJhaW5fYmxvY2sobWRldiwgcGktPnNpemUpOworCQllcnIgPSBkcmJkX2RyYWluX2Jsb2NrKHBlZXJfZGV2aWNlLCBwaS0+c2l6ZSk7CiAKLQkJZHJiZF9zZW5kX2Fja19kcChtZGV2LCBQX05FR19BQ0ssIHAsIHBpLT5zaXplKTsKKwkJZHJiZF9zZW5kX2Fja19kcChwZWVyX2RldmljZSwgUF9ORUdfQUNLLCBwLCBwaS0+c2l6ZSk7CiAJfQogCi0JYXRvbWljX2FkZChwaS0+c2l6ZSA+PiA5LCAmbWRldi0+cnNfc2VjdF9pbik7CisJYXRvbWljX2FkZChwaS0+c2l6ZSA+PiA5LCAmZGV2aWNlLT5yc19zZWN0X2luKTsKIAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIHJlc3RhcnRfY29uZmxpY3Rpbmdfd3JpdGVzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgdm9pZCByZXN0YXJ0X2NvbmZsaWN0aW5nX3dyaXRlcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJCQkgICAgICAgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaTsKIAlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXE7CiAKLQlkcmJkX2Zvcl9lYWNoX292ZXJsYXAoaSwgJm1kZXYtPndyaXRlX3JlcXVlc3RzLCBzZWN0b3IsIHNpemUpIHsKKwlkcmJkX2Zvcl9lYWNoX292ZXJsYXAoaSwgJmRldmljZS0+d3JpdGVfcmVxdWVzdHMsIHNlY3Rvciwgc2l6ZSkgewogCQlpZiAoIWktPmxvY2FsKQogCQkJY29udGludWU7CiAJCXJlcSA9IGNvbnRhaW5lcl9vZihpLCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0LCBpKTsKQEAgLTE4MTMsNTIgKzE4MzYsNTMgQEAKIHsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxID0KIAkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCwgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzZWN0b3JfdCBzZWN0b3IgPSBwZWVyX3JlcS0+aS5zZWN0b3I7CiAJaW50IGVyciA9IDAsIHBjbWQ7CiAKIAlpZiAocGVlcl9yZXEtPmZsYWdzICYgRUVfU0VORF9XUklURV9BQ0spIHsKIAkJaWYgKGxpa2VseSgocGVlcl9yZXEtPmZsYWdzICYgRUVfV0FTX0VSUk9SKSA9PSAwKSkgewotCQkJcGNtZCA9IChtZGV2LT5zdGF0ZS5jb25uID49IENfU1lOQ19TT1VSQ0UgJiYKLQkJCQltZGV2LT5zdGF0ZS5jb25uIDw9IENfUEFVU0VEX1NZTkNfVCAmJgorCQkJcGNtZCA9IChkZXZpY2UtPnN0YXRlLmNvbm4gPj0gQ19TWU5DX1NPVVJDRSAmJgorCQkJCWRldmljZS0+c3RhdGUuY29ubiA8PSBDX1BBVVNFRF9TWU5DX1QgJiYKIAkJCQlwZWVyX3JlcS0+ZmxhZ3MgJiBFRV9NQVlfU0VUX0lOX1NZTkMpID8KIAkJCQlQX1JTX1dSSVRFX0FDSyA6IFBfV1JJVEVfQUNLOwotCQkJZXJyID0gZHJiZF9zZW5kX2FjayhtZGV2LCBwY21kLCBwZWVyX3JlcSk7CisJCQllcnIgPSBkcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBwY21kLCBwZWVyX3JlcSk7CiAJCQlpZiAocGNtZCA9PSBQX1JTX1dSSVRFX0FDSykKLQkJCQlkcmJkX3NldF9pbl9zeW5jKG1kZXYsIHNlY3RvciwgcGVlcl9yZXEtPmkuc2l6ZSk7CisJCQkJZHJiZF9zZXRfaW5fc3luYyhkZXZpY2UsIHNlY3RvciwgcGVlcl9yZXEtPmkuc2l6ZSk7CiAJCX0gZWxzZSB7Ci0JCQllcnIgPSBkcmJkX3NlbmRfYWNrKG1kZXYsIFBfTkVHX0FDSywgcGVlcl9yZXEpOworCQkJZXJyID0gZHJiZF9zZW5kX2FjayhwZWVyX2RldmljZSwgUF9ORUdfQUNLLCBwZWVyX3JlcSk7CiAJCQkvKiB3ZSBleHBlY3QgaXQgdG8gYmUgbWFya2VkIG91dCBvZiBzeW5jIGFueXdheXMuLi4KIAkJCSAqIG1heWJlIGFzc2VydCB0aGlzPyAgKi8KIAkJfQotCQlkZWNfdW5hY2tlZChtZGV2KTsKKwkJZGVjX3VuYWNrZWQoZGV2aWNlKTsKIAl9CiAJLyogd2UgZGVsZXRlIGZyb20gdGhlIGNvbmZsaWN0IGRldGVjdGlvbiBoYXNoIF9hZnRlcl8gd2Ugc2VudCBvdXQgdGhlCiAJICogUF9XUklURV9BQ0sgLyBQX05FR19BQ0ssIHRvIGdldCB0aGUgc2VxdWVuY2UgbnVtYmVyIHJpZ2h0LiAgKi8KIAlpZiAocGVlcl9yZXEtPmZsYWdzICYgRUVfSU5fSU5URVJWQUxfVFJFRSkgewotCQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCQlEX0FTU0VSVCghZHJiZF9pbnRlcnZhbF9lbXB0eSgmcGVlcl9yZXEtPmkpKTsKLQkJZHJiZF9yZW1vdmVfZXBvY2hfZW50cnlfaW50ZXJ2YWwobWRldiwgcGVlcl9yZXEpOworCQlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJCURfQVNTRVJUKGRldmljZSwgIWRyYmRfaW50ZXJ2YWxfZW1wdHkoJnBlZXJfcmVxLT5pKSk7CisJCWRyYmRfcmVtb3ZlX2Vwb2NoX2VudHJ5X2ludGVydmFsKGRldmljZSwgcGVlcl9yZXEpOwogCQlpZiAocGVlcl9yZXEtPmZsYWdzICYgRUVfUkVTVEFSVF9SRVFVRVNUUykKLQkJCXJlc3RhcnRfY29uZmxpY3Rpbmdfd3JpdGVzKG1kZXYsIHNlY3RvciwgcGVlcl9yZXEtPmkuc2l6ZSk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwkJCXJlc3RhcnRfY29uZmxpY3Rpbmdfd3JpdGVzKGRldmljZSwgc2VjdG9yLCBwZWVyX3JlcS0+aS5zaXplKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJfSBlbHNlCi0JCURfQVNTRVJUKGRyYmRfaW50ZXJ2YWxfZW1wdHkoJnBlZXJfcmVxLT5pKSk7CisJCURfQVNTRVJUKGRldmljZSwgZHJiZF9pbnRlcnZhbF9lbXB0eSgmcGVlcl9yZXEtPmkpKTsKIAotCWRyYmRfbWF5X2ZpbmlzaF9lcG9jaChtZGV2LT50Y29ubiwgcGVlcl9yZXEtPmVwb2NoLCBFVl9QVVQgKyAoY2FuY2VsID8gRVZfQ0xFQU5VUCA6IDApKTsKKwlkcmJkX21heV9maW5pc2hfZXBvY2goZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbiwgcGVlcl9yZXEtPmVwb2NoLCBFVl9QVVQgKyAoY2FuY2VsID8gRVZfQ0xFQU5VUCA6IDApKTsKIAogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgZV9zZW5kX2FjayhzdHJ1Y3QgZHJiZF93b3JrICp3LCBlbnVtIGRyYmRfcGFja2V0IGFjaykKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxID0KIAkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCwgdyk7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlOwogCWludCBlcnI7CiAKLQllcnIgPSBkcmJkX3NlbmRfYWNrKG1kZXYsIGFjaywgcGVlcl9yZXEpOwotCWRlY191bmFja2VkKG1kZXYpOworCWVyciA9IGRyYmRfc2VuZF9hY2socGVlcl9kZXZpY2UsIGFjaywgcGVlcl9yZXEpOworCWRlY191bmFja2VkKHBlZXJfZGV2aWNlLT5kZXZpY2UpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTE4NzAsOSArMTg5NCwxMSBAQAogCiBzdGF0aWMgaW50IGVfc2VuZF9yZXRyeV93cml0ZShzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgdW51c2VkKQogewotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IHctPm1kZXYtPnRjb25uOworCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEgPQorCQljb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0LCB3KTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uOwogCi0JcmV0dXJuIGVfc2VuZF9hY2sodywgdGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSAxMDAgPworCXJldHVybiBlX3NlbmRfYWNrKHcsIGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSAxMDAgPwogCQkJICAgICBQX1JFVFJZX1dSSVRFIDogUF9TVVBFUlNFREVEKTsKIH0KIApAQCAtMTg5MSwxOCArMTkxNywxOSBAQAogCXJldHVybiBzZXFfZ3JlYXRlcihhLCBiKSA/IGEgOiBiOwogfQogCi1zdGF0aWMgdm9pZCB1cGRhdGVfcGVlcl9zZXEoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgaW50IHBlZXJfc2VxKQorc3RhdGljIHZvaWQgdXBkYXRlX3BlZXJfc2VxKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgdW5zaWduZWQgaW50IHBlZXJfc2VxKQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAl1bnNpZ25lZCBpbnQgbmV3ZXN0X3BlZXJfc2VxOwogCi0JaWYgKHRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmbWRldi0+dGNvbm4tPmZsYWdzKSkgewotCQlzcGluX2xvY2soJm1kZXYtPnBlZXJfc2VxX2xvY2spOwotCQluZXdlc3RfcGVlcl9zZXEgPSBzZXFfbWF4KG1kZXYtPnBlZXJfc2VxLCBwZWVyX3NlcSk7Ci0JCW1kZXYtPnBlZXJfc2VxID0gbmV3ZXN0X3BlZXJfc2VxOwotCQlzcGluX3VubG9jaygmbWRldi0+cGVlcl9zZXFfbG9jayk7Ci0JCS8qIHdha2UgdXAgb25seSBpZiB3ZSBhY3R1YWxseSBjaGFuZ2VkIG1kZXYtPnBlZXJfc2VxICovCisJaWYgKHRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmZsYWdzKSkgeworCQlzcGluX2xvY2soJmRldmljZS0+cGVlcl9zZXFfbG9jayk7CisJCW5ld2VzdF9wZWVyX3NlcSA9IHNlcV9tYXgoZGV2aWNlLT5wZWVyX3NlcSwgcGVlcl9zZXEpOworCQlkZXZpY2UtPnBlZXJfc2VxID0gbmV3ZXN0X3BlZXJfc2VxOworCQlzcGluX3VubG9jaygmZGV2aWNlLT5wZWVyX3NlcV9sb2NrKTsKKwkJLyogd2FrZSB1cCBvbmx5IGlmIHdlIGFjdHVhbGx5IGNoYW5nZWQgZGV2aWNlLT5wZWVyX3NlcSAqLwogCQlpZiAocGVlcl9zZXEgPT0gbmV3ZXN0X3BlZXJfc2VxKQotCQkJd2FrZV91cCgmbWRldi0+c2VxX3dhaXQpOworCQkJd2FrZV91cCgmZGV2aWNlLT5zZXFfd2FpdCk7CiAJfQogfQogCkBAIC0xOTEyLDIwICsxOTM5LDIwIEBACiB9CiAKIC8qIG1heWJlIGNoYW5nZSBzeW5jX2VlIGludG8gaW50ZXJ2YWwgdHJlZXMgYXMgd2VsbD8gKi8KLXN0YXRpYyBib29sIG92ZXJsYXBwaW5nX3Jlc3luY193cml0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQorc3RhdGljIGJvb2wgb3ZlcmxhcHBpbmdfcmVzeW5jX3dyaXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQogewogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcnNfcmVxOwogCWJvb2wgcnYgPSAwOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJzX3JlcSwgJm1kZXYtPnN5bmNfZWUsIHcubGlzdCkgeworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJzX3JlcSwgJmRldmljZS0+c3luY19lZSwgdy5saXN0KSB7CiAJCWlmIChvdmVybGFwcyhwZWVyX3JlcS0+aS5zZWN0b3IsIHBlZXJfcmVxLT5pLnNpemUsCiAJCQkgICAgIHJzX3JlcS0+aS5zZWN0b3IsIHJzX3JlcS0+aS5zaXplKSkgewogCQkJcnYgPSAxOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJcmV0dXJuIHJ2OwogfQpAQCAtMTkzOSw5ICsxOTY2LDkgQEAKICAqCiAgKiBOb3RlOiB3ZSBkb24ndCBjYXJlIGZvciBBY2sgcGFja2V0cyBvdmVydGFraW5nIFBfREFUQSBwYWNrZXRzLgogICoKLSAqIEluIGNhc2UgcGFja2V0X3NlcSBpcyBsYXJnZXIgdGhhbiBtZGV2LT5wZWVyX3NlcSBudW1iZXIsIHRoZXJlIGFyZQorICogSW4gY2FzZSBwYWNrZXRfc2VxIGlzIGxhcmdlciB0aGFuIGRldmljZS0+cGVlcl9zZXEgbnVtYmVyLCB0aGVyZSBhcmUKICAqIG91dHN0YW5kaW5nIHBhY2tldHMgb24gdGhlIG1zb2NrLiBXZSB3YWl0IGZvciB0aGVtIHRvIGFycml2ZS4KLSAqIEluIGNhc2Ugd2UgYXJlIHRoZSBsb2dpY2FsbHkgbmV4dCBwYWNrZXQsIHdlIHVwZGF0ZSBtZGV2LT5wZWVyX3NlcQorICogSW4gY2FzZSB3ZSBhcmUgdGhlIGxvZ2ljYWxseSBuZXh0IHBhY2tldCwgd2UgdXBkYXRlIGRldmljZS0+cGVlcl9zZXEKICAqIG91cnNlbHZlcy4gQ29ycmVjdGx5IGhhbmRsZXMgMzJiaXQgd3JhcCBhcm91bmQuCiAgKgogICogQXNzdW1lIHdlIGhhdmUgYSAxMCBHQml0IGNvbm5lY3Rpb24sIHRoYXQgaXMgYWJvdXQgMTw8MzAgYnl0ZSBwZXIgc2Vjb25kLApAQCAtMTk1MSwxOSArMTk3OCwyMCBAQAogICoKICAqIHJldHVybnMgMCBpZiB3ZSBtYXkgcHJvY2VzcyB0aGUgcGFja2V0LAogICogLUVSRVNUQVJUU1lTIGlmIHdlIHdlcmUgaW50ZXJydXB0ZWQgKGJ5IGRpc2Nvbm5lY3Qgc2lnbmFsKS4gKi8KLXN0YXRpYyBpbnQgd2FpdF9mb3JfYW5kX3VwZGF0ZV9wZWVyX3NlcShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCB1MzIgcGVlcl9zZXEpCitzdGF0aWMgaW50IHdhaXRfZm9yX2FuZF91cGRhdGVfcGVlcl9zZXEoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBjb25zdCB1MzIgcGVlcl9zZXEpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCURFRklORV9XQUlUKHdhaXQpOwogCWxvbmcgdGltZW91dDsKIAlpbnQgcmV0ID0gMCwgdHA7CiAKLQlpZiAoIXRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmbWRldi0+dGNvbm4tPmZsYWdzKSkKKwlpZiAoIXRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmZsYWdzKSkKIAkJcmV0dXJuIDA7CiAKLQlzcGluX2xvY2soJm1kZXYtPnBlZXJfc2VxX2xvY2spOworCXNwaW5fbG9jaygmZGV2aWNlLT5wZWVyX3NlcV9sb2NrKTsKIAlmb3IgKDs7KSB7Ci0JCWlmICghc2VxX2dyZWF0ZXIocGVlcl9zZXEgLSAxLCBtZGV2LT5wZWVyX3NlcSkpIHsKLQkJCW1kZXYtPnBlZXJfc2VxID0gc2VxX21heChtZGV2LT5wZWVyX3NlcSwgcGVlcl9zZXEpOworCQlpZiAoIXNlcV9ncmVhdGVyKHBlZXJfc2VxIC0gMSwgZGV2aWNlLT5wZWVyX3NlcSkpIHsKKwkJCWRldmljZS0+cGVlcl9zZXEgPSBzZXFfbWF4KGRldmljZS0+cGVlcl9zZXEsIHBlZXJfc2VxKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTE5NzMsMzUgKzIwMDEsMzUgQEAKIAkJfQogCiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJdHAgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKS0+dHdvX3ByaW1hcmllczsKKwkJdHAgPSByY3VfZGVyZWZlcmVuY2UoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpLT50d29fcHJpbWFyaWVzOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAogCQlpZiAoIXRwKQogCQkJYnJlYWs7CiAKIAkJLyogT25seSBuZWVkIHRvIHdhaXQgaWYgdHdvX3ByaW1hcmllcyBpcyBlbmFibGVkICovCi0JCXByZXBhcmVfdG9fd2FpdCgmbWRldi0+c2VxX3dhaXQsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzcGluX3VubG9jaygmbWRldi0+cGVlcl9zZXFfbG9jayk7CisJCXByZXBhcmVfdG9fd2FpdCgmZGV2aWNlLT5zZXFfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrKCZkZXZpY2UtPnBlZXJfc2VxX2xvY2spOwogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXRpbWVvdXQgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKS0+cGluZ190aW1lbypIWi8xMDsKKwkJdGltZW91dCA9IHJjdV9kZXJlZmVyZW5jZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpLT5waW5nX3RpbWVvKkhaLzEwOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0JCXNwaW5fbG9jaygmbWRldi0+cGVlcl9zZXFfbG9jayk7CisJCXNwaW5fbG9jaygmZGV2aWNlLT5wZWVyX3NlcV9sb2NrKTsKIAkJaWYgKCF0aW1lb3V0KSB7CiAJCQlyZXQgPSAtRVRJTUVET1VUOwotCQkJZGV2X2VycihERVYsICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgbWlzc2luZyBhY2sgcGFja2V0czsgZGlzY29ubmVjdGluZ1xuIik7CisJCQlkcmJkX2VycihkZXZpY2UsICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgbWlzc2luZyBhY2sgcGFja2V0czsgZGlzY29ubmVjdGluZ1xuIik7CiAJCQlicmVhazsKIAkJfQogCX0KLQlzcGluX3VubG9jaygmbWRldi0+cGVlcl9zZXFfbG9jayk7Ci0JZmluaXNoX3dhaXQoJm1kZXYtPnNlcV93YWl0LCAmd2FpdCk7CisJc3Bpbl91bmxvY2soJmRldmljZS0+cGVlcl9zZXFfbG9jayk7CisJZmluaXNoX3dhaXQoJmRldmljZS0+c2VxX3dhaXQsICZ3YWl0KTsKIAlyZXR1cm4gcmV0OwogfQogCiAvKiBzZWUgYWxzbyBiaW9fZmxhZ3NfdG9fd2lyZSgpCiAgKiBEUkJEX1JFUV8qLCBiZWNhdXNlIHdlIG5lZWQgdG8gc2VtYW50aWNhbGx5IG1hcCB0aGUgZmxhZ3MgdG8gZGF0YSBwYWNrZXQKICAqIGZsYWdzIGFuZCBiYWNrLiBXZSBtYXkgcmVwbGljYXRlIHRvIG90aGVyIGtlcm5lbCB2ZXJzaW9ucy4gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHdpcmVfZmxhZ3NfdG9fYmlvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHUzMiBkcGYpCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3aXJlX2ZsYWdzX3RvX2Jpbyh1MzIgZHBmKQogewogCXJldHVybiAgKGRwZiAmIERQX1JXX1NZTkMgPyBSRVFfU1lOQyA6IDApIHwKIAkJKGRwZiAmIERQX0ZVQSA/IFJFUV9GVUEgOiAwKSB8CkBAIC0yMDA5LDEzICsyMDM3LDEzIEBACiAJCShkcGYgJiBEUF9ESVNDQVJEID8gUkVRX0RJU0NBUkQgOiAwKTsKIH0KIAotc3RhdGljIHZvaWQgZmFpbF9wb3N0cG9uZWRfcmVxdWVzdHMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yLAorc3RhdGljIHZvaWQgZmFpbF9wb3N0cG9uZWRfcmVxdWVzdHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvciwKIAkJCQkgICAgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJc3RydWN0IGRyYmRfaW50ZXJ2YWwgKmk7CiAKICAgICByZXBlYXQ6Ci0JZHJiZF9mb3JfZWFjaF9vdmVybGFwKGksICZtZGV2LT53cml0ZV9yZXF1ZXN0cywgc2VjdG9yLCBzaXplKSB7CisJZHJiZF9mb3JfZWFjaF9vdmVybGFwKGksICZkZXZpY2UtPndyaXRlX3JlcXVlc3RzLCBzZWN0b3IsIHNpemUpIHsKIAkJc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxOwogCQlzdHJ1Y3QgYmlvX2FuZF9lcnJvciBtOwogCkBAIC0yMDI2LDE5ICsyMDU0LDE5IEBACiAJCQljb250aW51ZTsKIAkJcmVxLT5ycV9zdGF0ZSAmPSB+UlFfUE9TVFBPTkVEOwogCQlfX3JlcV9tb2QocmVxLCBORUdfQUNLRUQsICZtKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJaWYgKG0uYmlvKQotCQkJY29tcGxldGVfbWFzdGVyX2JpbyhtZGV2LCAmbSk7Ci0JCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJCQljb21wbGV0ZV9tYXN0ZXJfYmlvKGRldmljZSwgJm0pOworCQlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJCWdvdG8gcmVwZWF0OwogCX0KIH0KIAotc3RhdGljIGludCBoYW5kbGVfd3JpdGVfY29uZmxpY3RzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgaW50IGhhbmRsZV93cml0ZV9jb25mbGljdHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkJICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQogewotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IG1kZXYtPnRjb25uOwotCWJvb2wgcmVzb2x2ZV9jb25mbGljdHMgPSB0ZXN0X2JpdChSRVNPTFZFX0NPTkZMSUNUUywgJnRjb25uLT5mbGFncyk7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IHBlZXJfcmVxLT5wZWVyX2RldmljZS0+Y29ubmVjdGlvbjsKKwlib29sIHJlc29sdmVfY29uZmxpY3RzID0gdGVzdF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZjb25uZWN0aW9uLT5mbGFncyk7CiAJc2VjdG9yX3Qgc2VjdG9yID0gcGVlcl9yZXEtPmkuc2VjdG9yOwogCWNvbnN0IHVuc2lnbmVkIGludCBzaXplID0gcGVlcl9yZXEtPmkuc2l6ZTsKIAlzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaTsKQEAgLTIwNDksMTAgKzIwNzcsMTAgQEAKIAkgKiBJbnNlcnRpbmcgdGhlIHBlZXIgcmVxdWVzdCBpbnRvIHRoZSB3cml0ZV9yZXF1ZXN0cyB0cmVlIHdpbGwgcHJldmVudAogCSAqIG5ldyBjb25mbGljdGluZyBsb2NhbCByZXF1ZXN0cyBmcm9tIGJlaW5nIGFkZGVkLgogCSAqLwotCWRyYmRfaW5zZXJ0X2ludGVydmFsKCZtZGV2LT53cml0ZV9yZXF1ZXN0cywgJnBlZXJfcmVxLT5pKTsKKwlkcmJkX2luc2VydF9pbnRlcnZhbCgmZGV2aWNlLT53cml0ZV9yZXF1ZXN0cywgJnBlZXJfcmVxLT5pKTsKIAogICAgIHJlcGVhdDoKLQlkcmJkX2Zvcl9lYWNoX292ZXJsYXAoaSwgJm1kZXYtPndyaXRlX3JlcXVlc3RzLCBzZWN0b3IsIHNpemUpIHsKKwlkcmJkX2Zvcl9lYWNoX292ZXJsYXAoaSwgJmRldmljZS0+d3JpdGVfcmVxdWVzdHMsIHNlY3Rvciwgc2l6ZSkgewogCQlpZiAoaSA9PSAmcGVlcl9yZXEtPmkpCiAJCQljb250aW51ZTsKIApAQCAtMjA2Miw3ICsyMDkwLDcgQEAKIAkJCSAqIHNob3VsZCBub3QgaGFwcGVuIGluIGEgdHdvLW5vZGUgc2V0dXAuICBXYWl0IGZvciB0aGUKIAkJCSAqIGVhcmxpZXIgcGVlciByZXF1ZXN0IHRvIGNvbXBsZXRlLgogCQkJICovCi0JCQllcnIgPSBkcmJkX3dhaXRfbWlzYyhtZGV2LCBpKTsKKwkJCWVyciA9IGRyYmRfd2FpdF9taXNjKGRldmljZSwgaSk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gb3V0OwogCQkJZ290byByZXBlYXQ7CkBAIC0yMDgwLDE4ICsyMTA4LDE4IEBACiAJCQkJICAgICAgIChpLT5zaXplID4+IDkpID49IHNlY3RvciArIChzaXplID4+IDkpOwogCiAJCQlpZiAoIWVxdWFsKQotCQkJCWRldl9hbGVydChERVYsICJDb25jdXJyZW50IHdyaXRlcyBkZXRlY3RlZDogIgorCQkJCWRyYmRfYWxlcnQoZGV2aWNlLCAiQ29uY3VycmVudCB3cml0ZXMgZGV0ZWN0ZWQ6ICIKIAkJCQkJICAgICAgICJsb2NhbD0lbGx1cyArJXUsIHJlbW90ZT0lbGx1cyArJXUsICIKIAkJCQkJICAgICAgICJhc3N1bWluZyAlcyBjYW1lIGZpcnN0XG4iLAogCQkJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpaS0+c2VjdG9yLCBpLT5zaXplLAogCQkJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLCBzaXplLAogCQkJCQkgIHN1cGVyc2VkZWQgPyAibG9jYWwiIDogInJlbW90ZSIpOwogCi0JCQlpbmNfdW5hY2tlZChtZGV2KTsKKwkJCWluY191bmFja2VkKGRldmljZSk7CiAJCQlwZWVyX3JlcS0+dy5jYiA9IHN1cGVyc2VkZWQgPyBlX3NlbmRfc3VwZXJzZWRlZCA6CiAJCQkJCQkgICBlX3NlbmRfcmV0cnlfd3JpdGU7Ci0JCQlsaXN0X2FkZF90YWlsKCZwZWVyX3JlcS0+dy5saXN0LCAmbWRldi0+ZG9uZV9lZSk7Ci0JCQl3YWtlX2FzZW5kZXIobWRldi0+dGNvbm4pOworCQkJbGlzdF9hZGRfdGFpbCgmcGVlcl9yZXEtPncubGlzdCwgJmRldmljZS0+ZG9uZV9lZSk7CisJCQl3YWtlX2FzZW5kZXIoY29ubmVjdGlvbik7CiAKIAkJCWVyciA9IC1FTk9FTlQ7CiAJCQlnb3RvIG91dDsKQEAgLTIxMDAsNyArMjEyOCw3IEBACiAJCQkJY29udGFpbmVyX29mKGksIHN0cnVjdCBkcmJkX3JlcXVlc3QsIGkpOwogCiAJCQlpZiAoIWVxdWFsKQotCQkJCWRldl9hbGVydChERVYsICJDb25jdXJyZW50IHdyaXRlcyBkZXRlY3RlZDogIgorCQkJCWRyYmRfYWxlcnQoZGV2aWNlLCAiQ29uY3VycmVudCB3cml0ZXMgZGV0ZWN0ZWQ6ICIKIAkJCQkJICAgICAgICJsb2NhbD0lbGx1cyArJXUsIHJlbW90ZT0lbGx1cyArJXVcbiIsCiAJCQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylpLT5zZWN0b3IsIGktPnNpemUsCiAJCQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IsIHNpemUpOwpAQCAtMjExOCwxMiArMjE0NiwxMCBAQAogCQkJCSAqIHJlcXVlc3QgdG8gZmluaXNoIGxvY2FsbHkgYmVmb3JlIHN1Ym1pdHRpbmcKIAkJCQkgKiB0aGUgY29uZmxpY3RpbmcgcGVlciByZXF1ZXN0LgogCQkJCSAqLwotCQkJCWVyciA9IGRyYmRfd2FpdF9taXNjKG1kZXYsICZyZXEtPmkpOworCQkJCWVyciA9IGRyYmRfd2FpdF9taXNjKGRldmljZSwgJnJlcS0+aSk7CiAJCQkJaWYgKGVycikgewotCQkJCQlfY29ubl9yZXF1ZXN0X3N0YXRlKG1kZXYtPnRjb25uLAotCQkJCQkJCSAgICBOUyhjb25uLCBDX1RJTUVPVVQpLAotCQkJCQkJCSAgICBDU19IQVJEKTsKLQkJCQkJZmFpbF9wb3N0cG9uZWRfcmVxdWVzdHMobWRldiwgc2VjdG9yLCBzaXplKTsKKwkJCQkJX2Nvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX1RJTUVPVVQpLCBDU19IQVJEKTsKKwkJCQkJZmFpbF9wb3N0cG9uZWRfcmVxdWVzdHMoZGV2aWNlLCBzZWN0b3IsIHNpemUpOwogCQkJCQlnb3RvIG91dDsKIAkJCQl9CiAJCQkJZ290byByZXBlYXQ7CkBAIC0yMTM5LDE0ICsyMTY1LDE1IEBACiAKICAgICBvdXQ6CiAJaWYgKGVycikKLQkJZHJiZF9yZW1vdmVfZXBvY2hfZW50cnlfaW50ZXJ2YWwobWRldiwgcGVlcl9yZXEpOworCQlkcmJkX3JlbW92ZV9lcG9jaF9lbnRyeV9pbnRlcnZhbChkZXZpY2UsIHBlZXJfcmVxKTsKIAlyZXR1cm4gZXJyOwogfQogCiAvKiBtaXJyb3JlZCB3cml0ZSAqLwotc3RhdGljIGludCByZWNlaXZlX0RhdGEoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCByZWNlaXZlX0RhdGEoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzZWN0b3JfdCBzZWN0b3I7CiAJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcTsKIAlzdHJ1Y3QgcF9kYXRhICpwID0gcGktPmRhdGE7CkBAIC0yMTU1LDE3ICsyMTgyLDE4IEBACiAJdTMyIGRwX2ZsYWdzOwogCWludCBlcnIsIHRwOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCisJcGVlcl9kZXZpY2UgPSBjb25uX3BlZXJfZGV2aWNlKGNvbm5lY3Rpb24sIHBpLT52bnIpOworCWlmICghcGVlcl9kZXZpY2UpCiAJCXJldHVybiAtRUlPOworCWRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAKLQlpZiAoIWdldF9sZGV2KG1kZXYpKSB7CisJaWYgKCFnZXRfbGRldihkZXZpY2UpKSB7CiAJCWludCBlcnIyOwogCi0JCWVyciA9IHdhaXRfZm9yX2FuZF91cGRhdGVfcGVlcl9zZXEobWRldiwgcGVlcl9zZXEpOwotCQlkcmJkX3NlbmRfYWNrX2RwKG1kZXYsIFBfTkVHX0FDSywgcCwgcGktPnNpemUpOwotCQlhdG9taWNfaW5jKCZ0Y29ubi0+Y3VycmVudF9lcG9jaC0+ZXBvY2hfc2l6ZSk7Ci0JCWVycjIgPSBkcmJkX2RyYWluX2Jsb2NrKG1kZXYsIHBpLT5zaXplKTsKKwkJZXJyID0gd2FpdF9mb3JfYW5kX3VwZGF0ZV9wZWVyX3NlcShwZWVyX2RldmljZSwgcGVlcl9zZXEpOworCQlkcmJkX3NlbmRfYWNrX2RwKHBlZXJfZGV2aWNlLCBQX05FR19BQ0ssIHAsIHBpLT5zaXplKTsKKwkJYXRvbWljX2luYygmY29ubmVjdGlvbi0+Y3VycmVudF9lcG9jaC0+ZXBvY2hfc2l6ZSk7CisJCWVycjIgPSBkcmJkX2RyYWluX2Jsb2NrKHBlZXJfZGV2aWNlLCBwaS0+c2l6ZSk7CiAJCWlmICghZXJyKQogCQkJZXJyID0gZXJyMjsKIAkJcmV0dXJuIGVycjsKQEAgLTIxNzgsNjEgKzIyMDYsNjEgQEAKIAkgKi8KIAogCXNlY3RvciA9IGJlNjRfdG9fY3B1KHAtPnNlY3Rvcik7Ci0JcGVlcl9yZXEgPSByZWFkX2luX2Jsb2NrKG1kZXYsIHAtPmJsb2NrX2lkLCBzZWN0b3IsIHBpLT5zaXplKTsKKwlwZWVyX3JlcSA9IHJlYWRfaW5fYmxvY2socGVlcl9kZXZpY2UsIHAtPmJsb2NrX2lkLCBzZWN0b3IsIHBpLT5zaXplKTsKIAlpZiAoIXBlZXJfcmVxKSB7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlwZWVyX3JlcS0+dy5jYiA9IGVfZW5kX2Jsb2NrOwogCiAJZHBfZmxhZ3MgPSBiZTMyX3RvX2NwdShwLT5kcF9mbGFncyk7Ci0JcncgfD0gd2lyZV9mbGFnc190b19iaW8obWRldiwgZHBfZmxhZ3MpOworCXJ3IHw9IHdpcmVfZmxhZ3NfdG9fYmlvKGRwX2ZsYWdzKTsKIAlpZiAocGVlcl9yZXEtPnBhZ2VzID09IE5VTEwpIHsKLQkJRF9BU1NFUlQocGVlcl9yZXEtPmkuc2l6ZSA9PSAwKTsKLQkJRF9BU1NFUlQoZHBfZmxhZ3MgJiBEUF9GTFVTSCk7CisJCURfQVNTRVJUKGRldmljZSwgcGVlcl9yZXEtPmkuc2l6ZSA9PSAwKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCBkcF9mbGFncyAmIERQX0ZMVVNIKTsKIAl9CiAKIAlpZiAoZHBfZmxhZ3MgJiBEUF9NQVlfU0VUX0lOX1NZTkMpCiAJCXBlZXJfcmVxLT5mbGFncyB8PSBFRV9NQVlfU0VUX0lOX1NZTkM7CiAKLQlzcGluX2xvY2soJnRjb25uLT5lcG9jaF9sb2NrKTsKLQlwZWVyX3JlcS0+ZXBvY2ggPSB0Y29ubi0+Y3VycmVudF9lcG9jaDsKKwlzcGluX2xvY2soJmNvbm5lY3Rpb24tPmVwb2NoX2xvY2spOworCXBlZXJfcmVxLT5lcG9jaCA9IGNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2g7CiAJYXRvbWljX2luYygmcGVlcl9yZXEtPmVwb2NoLT5lcG9jaF9zaXplKTsKIAlhdG9taWNfaW5jKCZwZWVyX3JlcS0+ZXBvY2gtPmFjdGl2ZSk7Ci0Jc3Bpbl91bmxvY2soJnRjb25uLT5lcG9jaF9sb2NrKTsKKwlzcGluX3VubG9jaygmY29ubmVjdGlvbi0+ZXBvY2hfbG9jayk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JdHAgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKS0+dHdvX3ByaW1hcmllczsKKwl0cCA9IHJjdV9kZXJlZmVyZW5jZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpLT50d29fcHJpbWFyaWVzOwogCXJjdV9yZWFkX3VubG9jaygpOwogCWlmICh0cCkgewogCQlwZWVyX3JlcS0+ZmxhZ3MgfD0gRUVfSU5fSU5URVJWQUxfVFJFRTsKLQkJZXJyID0gd2FpdF9mb3JfYW5kX3VwZGF0ZV9wZWVyX3NlcShtZGV2LCBwZWVyX3NlcSk7CisJCWVyciA9IHdhaXRfZm9yX2FuZF91cGRhdGVfcGVlcl9zZXEocGVlcl9kZXZpY2UsIHBlZXJfc2VxKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0X2ludGVycnVwdGVkOwotCQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCQllcnIgPSBoYW5kbGVfd3JpdGVfY29uZmxpY3RzKG1kZXYsIHBlZXJfcmVxKTsKKwkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCQllcnIgPSBoYW5kbGVfd3JpdGVfY29uZmxpY3RzKGRldmljZSwgcGVlcl9yZXEpOwogCQlpZiAoZXJyKSB7Ci0JCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJCWlmIChlcnIgPT0gLUVOT0VOVCkgewotCQkJCXB1dF9sZGV2KG1kZXYpOworCQkJCXB1dF9sZGV2KGRldmljZSk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlnb3RvIG91dF9pbnRlcnJ1cHRlZDsKIAkJfQogCX0gZWxzZSB7Ci0JCXVwZGF0ZV9wZWVyX3NlcShtZGV2LCBwZWVyX3NlcSk7Ci0JCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJCXVwZGF0ZV9wZWVyX3NlcShwZWVyX2RldmljZSwgcGVlcl9zZXEpOworCQlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJfQotCWxpc3RfYWRkKCZwZWVyX3JlcS0+dy5saXN0LCAmbWRldi0+YWN0aXZlX2VlKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJbGlzdF9hZGQoJnBlZXJfcmVxLT53Lmxpc3QsICZkZXZpY2UtPmFjdGl2ZV9lZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1NZTkNfVEFSR0VUKQotCQl3YWl0X2V2ZW50KG1kZXYtPmVlX3dhaXQsICFvdmVybGFwcGluZ19yZXN5bmNfd3JpdGUobWRldiwgcGVlcl9yZXEpKTsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1lOQ19UQVJHRVQpCisJCXdhaXRfZXZlbnQoZGV2aWNlLT5lZV93YWl0LCAhb3ZlcmxhcHBpbmdfcmVzeW5jX3dyaXRlKGRldmljZSwgcGVlcl9yZXEpKTsKIAotCWlmIChtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgMTAwKSB7CisJaWYgKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDApIHsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQlzd2l0Y2ggKHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpLT53aXJlX3Byb3RvY29sKSB7CisJCXN3aXRjaCAocmN1X2RlcmVmZXJlbmNlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5uZXRfY29uZiktPndpcmVfcHJvdG9jb2wpIHsKIAkJY2FzZSBEUkJEX1BST1RfQzoKIAkJCWRwX2ZsYWdzIHw9IERQX1NFTkRfV1JJVEVfQUNLOwogCQkJYnJlYWs7CkBAIC0yMjQ1LDcgKzIyNzMsNyBAQAogCiAJaWYgKGRwX2ZsYWdzICYgRFBfU0VORF9XUklURV9BQ0spIHsKIAkJcGVlcl9yZXEtPmZsYWdzIHw9IEVFX1NFTkRfV1JJVEVfQUNLOwotCQlpbmNfdW5hY2tlZChtZGV2KTsKKwkJaW5jX3VuYWNrZWQoZGV2aWNlKTsKIAkJLyogY29ycmVzcG9uZGluZyBkZWNfdW5hY2tlZCgpIGluIGVfZW5kX2Jsb2NrKCkKIAkJICogcmVzcGVjdGl2ZSBfZHJiZF9jbGVhcl9kb25lX2VlICovCiAJfQpAQCAtMjI1MywzNCArMjI4MSwzNCBAQAogCWlmIChkcF9mbGFncyAmIERQX1NFTkRfUkVDRUlWRV9BQ0spIHsKIAkJLyogSSByZWFsbHkgZG9uJ3QgbGlrZSBpdCB0aGF0IHRoZSByZWNlaXZlciB0aHJlYWQKIAkJICogc2VuZHMgb24gdGhlIG1zb2NrLCBidXQgYW55d2F5cyAqLwotCQlkcmJkX3NlbmRfYWNrKG1kZXYsIFBfUkVDVl9BQ0ssIHBlZXJfcmVxKTsKKwkJZHJiZF9zZW5kX2FjayhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBQX1JFQ1ZfQUNLLCBwZWVyX3JlcSk7CiAJfQogCi0JaWYgKG1kZXYtPnN0YXRlLnBkc2sgPCBEX0lOQ09OU0lTVEVOVCkgeworCWlmIChkZXZpY2UtPnN0YXRlLnBkc2sgPCBEX0lOQ09OU0lTVEVOVCkgewogCQkvKiBJbiBjYXNlIHdlIGhhdmUgdGhlIG9ubHkgZGlzayBvZiB0aGUgY2x1c3RlciwgKi8KLQkJZHJiZF9zZXRfb3V0X29mX3N5bmMobWRldiwgcGVlcl9yZXEtPmkuc2VjdG9yLCBwZWVyX3JlcS0+aS5zaXplKTsKKwkJZHJiZF9zZXRfb3V0X29mX3N5bmMoZGV2aWNlLCBwZWVyX3JlcS0+aS5zZWN0b3IsIHBlZXJfcmVxLT5pLnNpemUpOwogCQlwZWVyX3JlcS0+ZmxhZ3MgfD0gRUVfQ0FMTF9BTF9DT01QTEVURV9JTzsKIAkJcGVlcl9yZXEtPmZsYWdzICY9IH5FRV9NQVlfU0VUX0lOX1NZTkM7Ci0JCWRyYmRfYWxfYmVnaW5faW8obWRldiwgJnBlZXJfcmVxLT5pLCB0cnVlKTsKKwkJZHJiZF9hbF9iZWdpbl9pbyhkZXZpY2UsICZwZWVyX3JlcS0+aSwgdHJ1ZSk7CiAJfQogCi0JZXJyID0gZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KG1kZXYsIHBlZXJfcmVxLCBydywgRFJCRF9GQVVMVF9EVF9XUik7CisJZXJyID0gZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KGRldmljZSwgcGVlcl9yZXEsIHJ3LCBEUkJEX0ZBVUxUX0RUX1dSKTsKIAlpZiAoIWVycikKIAkJcmV0dXJuIDA7CiAKIAkvKiBkb24ndCBjYXJlIGZvciB0aGUgcmVhc29uIGhlcmUgKi8KLQlkZXZfZXJyKERFViwgInN1Ym1pdCBmYWlsZWQsIHRyaWdnZXJpbmcgcmUtY29ubmVjdFxuIik7Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlkcmJkX2VycihkZXZpY2UsICJzdWJtaXQgZmFpbGVkLCB0cmlnZ2VyaW5nIHJlLWNvbm5lY3RcbiIpOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAlsaXN0X2RlbCgmcGVlcl9yZXEtPncubGlzdCk7Ci0JZHJiZF9yZW1vdmVfZXBvY2hfZW50cnlfaW50ZXJ2YWwobWRldiwgcGVlcl9yZXEpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlkcmJkX3JlbW92ZV9lcG9jaF9lbnRyeV9pbnRlcnZhbChkZXZpY2UsIHBlZXJfcmVxKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAlpZiAocGVlcl9yZXEtPmZsYWdzICYgRUVfQ0FMTF9BTF9DT01QTEVURV9JTykKLQkJZHJiZF9hbF9jb21wbGV0ZV9pbyhtZGV2LCAmcGVlcl9yZXEtPmkpOworCQlkcmJkX2FsX2NvbXBsZXRlX2lvKGRldmljZSwgJnBlZXJfcmVxLT5pKTsKIAogb3V0X2ludGVycnVwdGVkOgotCWRyYmRfbWF5X2ZpbmlzaF9lcG9jaCh0Y29ubiwgcGVlcl9yZXEtPmVwb2NoLCBFVl9QVVQgKyBFVl9DTEVBTlVQKTsKLQlwdXRfbGRldihtZGV2KTsKLQlkcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOworCWRyYmRfbWF5X2ZpbmlzaF9lcG9jaChjb25uZWN0aW9uLCBwZWVyX3JlcS0+ZXBvY2gsIEVWX1BVVCArIEVWX0NMRUFOVVApOworCXB1dF9sZGV2KGRldmljZSk7CisJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTIyOTUsOSArMjMyMyw5IEBACiAgKiBUaGUgY3VycmVudCBzeW5jIHJhdGUgdXNlZCBoZXJlIHVzZXMgb25seSB0aGUgbW9zdCByZWNlbnQgdHdvIHN0ZXAgbWFya3MsCiAgKiB0byBoYXZlIGEgc2hvcnQgdGltZSBhdmVyYWdlIHNvIHdlIGNhbiByZWFjdCBmYXN0ZXIuCiAgKi8KLWludCBkcmJkX3JzX3Nob3VsZF9zbG93X2Rvd24oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yKQoraW50IGRyYmRfcnNfc2hvdWxkX3Nsb3dfZG93bihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yKQogewotCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gbWRldi0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9jb250YWlucy0+YmRfZGlzazsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGRldmljZS0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9jb250YWlucy0+YmRfZGlzazsKIAl1bnNpZ25lZCBsb25nIGRiLCBkdCwgZGJkdDsKIAlzdHJ1Y3QgbGNfZWxlbWVudCAqdG1wOwogCWludCBjdXJyX2V2ZW50czsKQEAgLTIzMDUsNDggKzIzMzMsNDggQEAKIAl1bnNpZ25lZCBpbnQgY19taW5fcmF0ZTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQljX21pbl9yYXRlID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZiktPmNfbWluX3JhdGU7CisJY19taW5fcmF0ZSA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPmNfbWluX3JhdGU7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkvKiBmZWF0dXJlIGRpc2FibGVkPyAqLwogCWlmIChjX21pbl9yYXRlID09IDApCiAJCXJldHVybiAwOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7Ci0JdG1wID0gbGNfZmluZChtZGV2LT5yZXN5bmMsIEJNX1NFQ1RfVE9fRVhUKHNlY3RvcikpOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CisJdG1wID0gbGNfZmluZChkZXZpY2UtPnJlc3luYywgQk1fU0VDVF9UT19FWFQoc2VjdG9yKSk7CiAJaWYgKHRtcCkgewogCQlzdHJ1Y3QgYm1fZXh0ZW50ICpibV9leHQgPSBsY19lbnRyeSh0bXAsIHN0cnVjdCBibV9leHRlbnQsIGxjZSk7CiAJCWlmICh0ZXN0X2JpdChCTUVfUFJJT1JJVFksICZibV9leHQtPmZsYWdzKSkgewotCQkJc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5hbF9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCS8qIERvIG5vdCBzbG93IGRvd24gaWYgYXBwIElPIGlzIGFscmVhZHkgd2FpdGluZyBmb3IgdGhpcyBleHRlbnQgKi8KIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5hbF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAKIAljdXJyX2V2ZW50cyA9IChpbnQpcGFydF9zdGF0X3JlYWQoJmRpc2stPnBhcnQwLCBzZWN0b3JzWzBdKSArCiAJCSAgICAgIChpbnQpcGFydF9zdGF0X3JlYWQoJmRpc2stPnBhcnQwLCBzZWN0b3JzWzFdKSAtCi0JCQlhdG9taWNfcmVhZCgmbWRldi0+cnNfc2VjdF9ldik7CisJCQlhdG9taWNfcmVhZCgmZGV2aWNlLT5yc19zZWN0X2V2KTsKIAotCWlmICghbWRldi0+cnNfbGFzdF9ldmVudHMgfHwgY3Vycl9ldmVudHMgLSBtZGV2LT5yc19sYXN0X2V2ZW50cyA+IDY0KSB7CisJaWYgKCFkZXZpY2UtPnJzX2xhc3RfZXZlbnRzIHx8IGN1cnJfZXZlbnRzIC0gZGV2aWNlLT5yc19sYXN0X2V2ZW50cyA+IDY0KSB7CiAJCXVuc2lnbmVkIGxvbmcgcnNfbGVmdDsKIAkJaW50IGk7CiAKLQkJbWRldi0+cnNfbGFzdF9ldmVudHMgPSBjdXJyX2V2ZW50czsKKwkJZGV2aWNlLT5yc19sYXN0X2V2ZW50cyA9IGN1cnJfZXZlbnRzOwogCiAJCS8qIHN5bmMgc3BlZWQgYXZlcmFnZSBvdmVyIHRoZSBsYXN0IDIqRFJCRF9TWU5DX01BUktfU1RFUCwKIAkJICogYXBwcm94LiAqLwotCQlpID0gKG1kZXYtPnJzX2xhc3RfbWFyayArIERSQkRfU1lOQ19NQVJLUy0xKSAlIERSQkRfU1lOQ19NQVJLUzsKKwkJaSA9IChkZXZpY2UtPnJzX2xhc3RfbWFyayArIERSQkRfU1lOQ19NQVJLUy0xKSAlIERSQkRfU1lOQ19NQVJLUzsKIAotCQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9TIHx8IG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfVCkKLQkJCXJzX2xlZnQgPSBtZGV2LT5vdl9sZWZ0OworCQlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1MgfHwgZGV2aWNlLT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpCisJCQlyc19sZWZ0ID0gZGV2aWNlLT5vdl9sZWZ0OwogCQllbHNlCi0JCQlyc19sZWZ0ID0gZHJiZF9ibV90b3RhbF93ZWlnaHQobWRldikgLSBtZGV2LT5yc19mYWlsZWQ7CisJCQlyc19sZWZ0ID0gZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKSAtIGRldmljZS0+cnNfZmFpbGVkOwogCi0JCWR0ID0gKChsb25nKWppZmZpZXMgLSAobG9uZyltZGV2LT5yc19tYXJrX3RpbWVbaV0pIC8gSFo7CisJCWR0ID0gKChsb25nKWppZmZpZXMgLSAobG9uZylkZXZpY2UtPnJzX21hcmtfdGltZVtpXSkgLyBIWjsKIAkJaWYgKCFkdCkKIAkJCWR0Kys7Ci0JCWRiID0gbWRldi0+cnNfbWFya19sZWZ0W2ldIC0gcnNfbGVmdDsKKwkJZGIgPSBkZXZpY2UtPnJzX21hcmtfbGVmdFtpXSAtIHJzX2xlZnQ7CiAJCWRiZHQgPSBCaXQyS0IoZGIvZHQpOwogCiAJCWlmIChkYmR0ID4gY19taW5fcmF0ZSkKQEAgLTIzNTYsOSArMjM4NCwxMCBAQAogfQogCiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9EYXRhUmVxdWVzdChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IHJlY2VpdmVfRGF0YVJlcXVlc3Qoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzZWN0b3JfdCBzZWN0b3I7CiAJc2VjdG9yX3QgY2FwYWNpdHk7CiAJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcTsKQEAgLTIzNjcsNTggKzIzOTYsNTkgQEAKIAl1bnNpZ25lZCBpbnQgZmF1bHRfdHlwZTsKIAlzdHJ1Y3QgcF9ibG9ja19yZXEgKnAgPQlwaS0+ZGF0YTsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQorCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQogCQlyZXR1cm4gLUVJTzsKLQljYXBhY2l0eSA9IGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldik7CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwljYXBhY2l0eSA9IGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KTsKIAogCXNlY3RvciA9IGJlNjRfdG9fY3B1KHAtPnNlY3Rvcik7CiAJc2l6ZSAgID0gYmUzMl90b19jcHUocC0+Ymxrc2l6ZSk7CiAKIAlpZiAoc2l6ZSA8PSAwIHx8ICFJU19BTElHTkVEKHNpemUsIDUxMikgfHwgc2l6ZSA+IERSQkRfTUFYX0JJT19TSVpFKSB7Ci0JCWRldl9lcnIoREVWLCAiJXM6JWQ6IHNlY3RvcjogJWxsdXMsIHNpemU6ICV1XG4iLCBfX0ZJTEVfXywgX19MSU5FX18sCisJCWRyYmRfZXJyKGRldmljZSwgIiVzOiVkOiBzZWN0b3I6ICVsbHVzLCBzaXplOiAldVxuIiwgX19GSUxFX18sIF9fTElORV9fLAogCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLCBzaXplKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChzZWN0b3IgKyAoc2l6ZT4+OSkgPiBjYXBhY2l0eSkgewotCQlkZXZfZXJyKERFViwgIiVzOiVkOiBzZWN0b3I6ICVsbHVzLCBzaXplOiAldVxuIiwgX19GSUxFX18sIF9fTElORV9fLAorCQlkcmJkX2VycihkZXZpY2UsICIlczolZDogc2VjdG9yOiAlbGx1cywgc2l6ZTogJXVcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKXNlY3Rvciwgc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9VUF9UT19EQVRFKSkgeworCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX1VQX1RPX0RBVEUpKSB7CiAJCXZlcmIgPSAxOwogCQlzd2l0Y2ggKHBpLT5jbWQpIHsKIAkJY2FzZSBQX0RBVEFfUkVRVUVTVDoKLQkJCWRyYmRfc2VuZF9hY2tfcnAobWRldiwgUF9ORUdfRFJFUExZLCBwKTsKKwkJCWRyYmRfc2VuZF9hY2tfcnAocGVlcl9kZXZpY2UsIFBfTkVHX0RSRVBMWSwgcCk7CiAJCQlicmVhazsKIAkJY2FzZSBQX1JTX0RBVEFfUkVRVUVTVDoKIAkJY2FzZSBQX0NTVU1fUlNfUkVRVUVTVDoKIAkJY2FzZSBQX09WX1JFUVVFU1Q6Ci0JCQlkcmJkX3NlbmRfYWNrX3JwKG1kZXYsIFBfTkVHX1JTX0RSRVBMWSAsIHApOworCQkJZHJiZF9zZW5kX2Fja19ycChwZWVyX2RldmljZSwgUF9ORUdfUlNfRFJFUExZICwgcCk7CiAJCQlicmVhazsKIAkJY2FzZSBQX09WX1JFUExZOgogCQkJdmVyYiA9IDA7Ci0JCQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKLQkJCWRyYmRfc2VuZF9hY2tfZXgobWRldiwgUF9PVl9SRVNVTFQsIHNlY3Rvciwgc2l6ZSwgSURfSU5fU1lOQyk7CisJCQlkZWNfcnNfcGVuZGluZyhkZXZpY2UpOworCQkJZHJiZF9zZW5kX2Fja19leChwZWVyX2RldmljZSwgUF9PVl9SRVNVTFQsIHNlY3Rvciwgc2l6ZSwgSURfSU5fU1lOQyk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCUJVRygpOwogCQl9CiAJCWlmICh2ZXJiICYmIF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpCi0JCQlkZXZfZXJyKERFViwgIkNhbiBub3Qgc2F0aXNmeSBwZWVyJ3MgcmVhZCByZXF1ZXN0LCAiCisJCQlkcmJkX2VycihkZXZpY2UsICJDYW4gbm90IHNhdGlzZnkgcGVlcidzIHJlYWQgcmVxdWVzdCwgIgogCQkJICAgICJubyBsb2NhbCBkYXRhLlxuIik7CiAKIAkJLyogZHJhaW4gcG9zc2libHkgcGF5bG9hZCAqLwotCQlyZXR1cm4gZHJiZF9kcmFpbl9ibG9jayhtZGV2LCBwaS0+c2l6ZSk7CisJCXJldHVybiBkcmJkX2RyYWluX2Jsb2NrKHBlZXJfZGV2aWNlLCBwaS0+c2l6ZSk7CiAJfQogCiAJLyogR0ZQX05PSU8sIGJlY2F1c2Ugd2UgbXVzdCBub3QgY2F1c2UgYXJiaXRyYXJ5IHdyaXRlLW91dDogaW4gYSBEUkJECiAJICogImNyaXNzLWNyb3NzIiBzZXR1cCwgdGhhdCBtaWdodCBjYXVzZSB3cml0ZS1vdXQgb24gc29tZSBvdGhlciBEUkJELAogCSAqIHdoaWNoIGluIHR1cm4gbWlnaHQgYmxvY2sgb24gdGhlIG90aGVyIG5vZGUgYXQgdGhpcyB2ZXJ5IHBsYWNlLiAgKi8KLQlwZWVyX3JlcSA9IGRyYmRfYWxsb2NfcGVlcl9yZXEobWRldiwgcC0+YmxvY2tfaWQsIHNlY3Rvciwgc2l6ZSwgR0ZQX05PSU8pOworCXBlZXJfcmVxID0gZHJiZF9hbGxvY19wZWVyX3JlcShwZWVyX2RldmljZSwgcC0+YmxvY2tfaWQsIHNlY3Rvciwgc2l6ZSwgR0ZQX05PSU8pOwogCWlmICghcGVlcl9yZXEpIHsKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMjQzMyw3ICsyNDYzLDcgQEAKIAkJcGVlcl9yZXEtPncuY2IgPSB3X2VfZW5kX3JzZGF0YV9yZXE7CiAJCWZhdWx0X3R5cGUgPSBEUkJEX0ZBVUxUX1JTX1JEOwogCQkvKiB1c2VkIGluIHRoZSBzZWN0b3Igb2Zmc2V0IHByb2dyZXNzIGRpc3BsYXkgKi8KLQkJbWRldi0+Ym1fcmVzeW5jX2ZvID0gQk1fU0VDVF9UT19CSVQoc2VjdG9yKTsKKwkJZGV2aWNlLT5ibV9yZXN5bmNfZm8gPSBCTV9TRUNUX1RPX0JJVChzZWN0b3IpOwogCQlicmVhazsKIAogCWNhc2UgUF9PVl9SRVBMWToKQEAgLTI0NDksMTkgKzI0NzksMTkgQEAKIAkJcGVlcl9yZXEtPmRpZ2VzdCA9IGRpOwogCQlwZWVyX3JlcS0+ZmxhZ3MgfD0gRUVfSEFTX0RJR0VTVDsKIAotCQlpZiAoZHJiZF9yZWN2X2FsbChtZGV2LT50Y29ubiwgZGktPmRpZ2VzdCwgcGktPnNpemUpKQorCQlpZiAoZHJiZF9yZWN2X2FsbChwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgZGktPmRpZ2VzdCwgcGktPnNpemUpKQogCQkJZ290byBvdXRfZnJlZV9lOwogCiAJCWlmIChwaS0+Y21kID09IFBfQ1NVTV9SU19SRVFVRVNUKSB7Ci0JCQlEX0FTU0VSVChtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDg5KTsKKwkJCURfQVNTRVJUKGRldmljZSwgcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA4OSk7CiAJCQlwZWVyX3JlcS0+dy5jYiA9IHdfZV9lbmRfY3N1bV9yc19yZXE7CiAJCQkvKiB1c2VkIGluIHRoZSBzZWN0b3Igb2Zmc2V0IHByb2dyZXNzIGRpc3BsYXkgKi8KLQkJCW1kZXYtPmJtX3Jlc3luY19mbyA9IEJNX1NFQ1RfVE9fQklUKHNlY3Rvcik7CisJCQlkZXZpY2UtPmJtX3Jlc3luY19mbyA9IEJNX1NFQ1RfVE9fQklUKHNlY3Rvcik7CiAJCX0gZWxzZSBpZiAocGktPmNtZCA9PSBQX09WX1JFUExZKSB7CiAJCQkvKiB0cmFjayBwcm9ncmVzcywgd2UgbWF5IG5lZWQgdG8gdGhyb3R0bGUgKi8KLQkJCWF0b21pY19hZGQoc2l6ZSA+PiA5LCAmbWRldi0+cnNfc2VjdF9pbik7CisJCQlhdG9taWNfYWRkKHNpemUgPj4gOSwgJmRldmljZS0+cnNfc2VjdF9pbik7CiAJCQlwZWVyX3JlcS0+dy5jYiA9IHdfZV9lbmRfb3ZfcmVwbHk7Ci0JCQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKKwkJCWRlY19yc19wZW5kaW5nKGRldmljZSk7CiAJCQkvKiBkcmJkX3JzX2JlZ2luX2lvIGRvbmUgd2hlbiB3ZSBzZW50IHRoaXMgcmVxdWVzdCwKIAkJCSAqIGJ1dCBhY2NvdW50aW5nIHN0aWxsIG5lZWRzIHRvIGJlIGRvbmUuICovCiAJCQlnb3RvIHN1Ym1pdF9mb3JfcmVzeW5jOwpAQCAtMjQ2OSwxOSArMjQ5OSwxOSBAQAogCQlicmVhazsKIAogCWNhc2UgUF9PVl9SRVFVRVNUOgotCQlpZiAobWRldi0+b3Zfc3RhcnRfc2VjdG9yID09IH4oc2VjdG9yX3QpMCAmJgotCQkgICAgbWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA5MCkgeworCQlpZiAoZGV2aWNlLT5vdl9zdGFydF9zZWN0b3IgPT0gfihzZWN0b3JfdCkwICYmCisJCSAgICBwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDkwKSB7CiAJCQl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CiAJCQlpbnQgaTsKLQkJCW1kZXYtPm92X3N0YXJ0X3NlY3RvciA9IHNlY3RvcjsKLQkJCW1kZXYtPm92X3Bvc2l0aW9uID0gc2VjdG9yOwotCQkJbWRldi0+b3ZfbGVmdCA9IGRyYmRfYm1fYml0cyhtZGV2KSAtIEJNX1NFQ1RfVE9fQklUKHNlY3Rvcik7Ci0JCQltZGV2LT5yc190b3RhbCA9IG1kZXYtPm92X2xlZnQ7CisJCQlkZXZpY2UtPm92X3N0YXJ0X3NlY3RvciA9IHNlY3RvcjsKKwkJCWRldmljZS0+b3ZfcG9zaXRpb24gPSBzZWN0b3I7CisJCQlkZXZpY2UtPm92X2xlZnQgPSBkcmJkX2JtX2JpdHMoZGV2aWNlKSAtIEJNX1NFQ1RfVE9fQklUKHNlY3Rvcik7CisJCQlkZXZpY2UtPnJzX3RvdGFsID0gZGV2aWNlLT5vdl9sZWZ0OwogCQkJZm9yIChpID0gMDsgaSA8IERSQkRfU1lOQ19NQVJLUzsgaSsrKSB7Ci0JCQkJbWRldi0+cnNfbWFya19sZWZ0W2ldID0gbWRldi0+b3ZfbGVmdDsKLQkJCQltZGV2LT5yc19tYXJrX3RpbWVbaV0gPSBub3c7CisJCQkJZGV2aWNlLT5yc19tYXJrX2xlZnRbaV0gPSBkZXZpY2UtPm92X2xlZnQ7CisJCQkJZGV2aWNlLT5yc19tYXJrX3RpbWVbaV0gPSBub3c7CiAJCQl9Ci0JCQlkZXZfaW5mbyhERVYsICJPbmxpbmUgVmVyaWZ5IHN0YXJ0IHNlY3RvcjogJWxsdVxuIiwKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJPbmxpbmUgVmVyaWZ5IHN0YXJ0IHNlY3RvcjogJWxsdVxuIiwKIAkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IpOwogCQl9CiAJCXBlZXJfcmVxLT53LmNiID0gd19lX2VuZF9vdl9yZXE7CkBAIC0yNTE0LDU3ICsyNTQ0LDYxIEBACiAJICogd2Ugd291bGQgYWxzbyB0aHJvdHRsZSBpdHMgYXBwbGljYXRpb24gcmVhZHMuCiAJICogSW4gdGhhdCBjYXNlLCB0aHJvdHRsaW5nIGlzIGRvbmUgb24gdGhlIFN5bmNUYXJnZXQgb25seS4KIAkgKi8KLQlpZiAobWRldi0+c3RhdGUucGVlciAhPSBSX1BSSU1BUlkgJiYgZHJiZF9yc19zaG91bGRfc2xvd19kb3duKG1kZXYsIHNlY3RvcikpCisJaWYgKGRldmljZS0+c3RhdGUucGVlciAhPSBSX1BSSU1BUlkgJiYgZHJiZF9yc19zaG91bGRfc2xvd19kb3duKGRldmljZSwgc2VjdG9yKSkKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoSFovMTApOwotCWlmIChkcmJkX3JzX2JlZ2luX2lvKG1kZXYsIHNlY3RvcikpCisJaWYgKGRyYmRfcnNfYmVnaW5faW8oZGV2aWNlLCBzZWN0b3IpKQogCQlnb3RvIG91dF9mcmVlX2U7CiAKIHN1Ym1pdF9mb3JfcmVzeW5jOgotCWF0b21pY19hZGQoc2l6ZSA+PiA5LCAmbWRldi0+cnNfc2VjdF9ldik7CisJYXRvbWljX2FkZChzaXplID4+IDksICZkZXZpY2UtPnJzX3NlY3RfZXYpOwogCiBzdWJtaXQ6Ci0JaW5jX3VuYWNrZWQobWRldik7Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZwZWVyX3JlcS0+dy5saXN0LCAmbWRldi0+cmVhZF9lZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCWluY191bmFja2VkKGRldmljZSk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJnBlZXJfcmVxLT53Lmxpc3QsICZkZXZpY2UtPnJlYWRfZWUpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCi0JaWYgKGRyYmRfc3VibWl0X3BlZXJfcmVxdWVzdChtZGV2LCBwZWVyX3JlcSwgUkVBRCwgZmF1bHRfdHlwZSkgPT0gMCkKKwlpZiAoZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KGRldmljZSwgcGVlcl9yZXEsIFJFQUQsIGZhdWx0X3R5cGUpID09IDApCiAJCXJldHVybiAwOwogCiAJLyogZG9uJ3QgY2FyZSBmb3IgdGhlIHJlYXNvbiBoZXJlICovCi0JZGV2X2VycihERVYsICJzdWJtaXQgZmFpbGVkLCB0cmlnZ2VyaW5nIHJlLWNvbm5lY3RcbiIpOwotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJZHJiZF9lcnIoZGV2aWNlLCAic3VibWl0IGZhaWxlZCwgdHJpZ2dlcmluZyByZS1jb25uZWN0XG4iKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJbGlzdF9kZWwoJnBlZXJfcmVxLT53Lmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkvKiBubyBkcmJkX3JzX2NvbXBsZXRlX2lvKCksIHdlIGFyZSBkcm9wcGluZyB0aGUgY29ubmVjdGlvbiBhbnl3YXlzICovCiAKIG91dF9mcmVlX2U6Ci0JcHV0X2xkZXYobWRldik7Ci0JZHJiZF9mcmVlX3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKKwlwdXRfbGRldihkZXZpY2UpOworCWRyYmRfZnJlZV9wZWVyX3JlcShkZXZpY2UsIHBlZXJfcmVxKTsKIAlyZXR1cm4gLUVJTzsKIH0KIAotc3RhdGljIGludCBkcmJkX2FzYl9yZWNvdmVyXzBwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpIF9fbXVzdF9ob2xkKGxvY2FsKQorLyoqCisgKiBkcmJkX2FzYl9yZWNvdmVyXzBwICAtICBSZWNvdmVyIGFmdGVyIHNwbGl0LWJyYWluIHdpdGggbm8gcmVtYWluaW5nIHByaW1hcmllcworICovCitzdGF0aWMgaW50IGRyYmRfYXNiX3JlY292ZXJfMHAoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlKSBfX211c3RfaG9sZChsb2NhbCkKIHsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAJaW50IHNlbGYsIHBlZXIsIHJ2ID0gLTEwMDsKIAl1bnNpZ25lZCBsb25nIGNoX3NlbGYsIGNoX3BlZXI7CiAJZW51bSBkcmJkX2FmdGVyX3NiX3AgYWZ0ZXJfc2JfMHA7CiAKLQlzZWxmID0gbWRldi0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdICYgMTsKLQlwZWVyID0gbWRldi0+cF91dWlkW1VJX0JJVE1BUF0gJiAxOworCXNlbGYgPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIDE7CisJcGVlciA9IGRldmljZS0+cF91dWlkW1VJX0JJVE1BUF0gJiAxOwogCi0JY2hfcGVlciA9IG1kZXYtPnBfdXVpZFtVSV9TSVpFXTsKLQljaF9zZWxmID0gbWRldi0+Y29tbV9ibV9zZXQ7CisJY2hfcGVlciA9IGRldmljZS0+cF91dWlkW1VJX1NJWkVdOworCWNoX3NlbGYgPSBkZXZpY2UtPmNvbW1fYm1fc2V0OwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWFmdGVyX3NiXzBwID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZiktPmFmdGVyX3NiXzBwOworCWFmdGVyX3NiXzBwID0gcmN1X2RlcmVmZXJlbmNlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5uZXRfY29uZiktPmFmdGVyX3NiXzBwOwogCXJjdV9yZWFkX3VubG9jaygpOwogCXN3aXRjaCAoYWZ0ZXJfc2JfMHApIHsKIAljYXNlIEFTQl9DT05TRU5TVVM6CiAJY2FzZSBBU0JfRElTQ0FSRF9TRUNPTkRBUlk6CiAJY2FzZSBBU0JfQ0FMTF9IRUxQRVI6CiAJY2FzZSBBU0JfVklPTEVOVExZOgotCQlkZXZfZXJyKERFViwgIkNvbmZpZ3VyYXRpb24gZXJyb3IuXG4iKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiQ29uZmlndXJhdGlvbiBlcnJvci5cbiIpOwogCQlicmVhazsKIAljYXNlIEFTQl9ESVNDT05ORUNUOgogCQlicmVhazsKQEAgLTI1ODgsMTEgKzI2MjIsMTEgQEAKIAkJCWJyZWFrOwogCQl9CiAJCS8qIEVsc2UgZmFsbCB0aHJvdWdoIHRvIG9uZSBvZiB0aGUgb3RoZXIgc3RyYXRlZ2llcy4uLiAqLwotCQlkZXZfd2FybihERVYsICJEaXNjYXJkIHlvdW5nZXIvb2xkZXIgcHJpbWFyeSBkaWQgbm90IGZpbmQgYSBkZWNpc2lvblxuIgorCQlkcmJkX3dhcm4oZGV2aWNlLCAiRGlzY2FyZCB5b3VuZ2VyL29sZGVyIHByaW1hcnkgZGlkIG5vdCBmaW5kIGEgZGVjaXNpb25cbiIKIAkJICAgICAiVXNpbmcgZGlzY2FyZC1sZWFzdC1jaGFuZ2VzIGluc3RlYWRcbiIpOwogCWNhc2UgQVNCX0RJU0NBUkRfWkVST19DSEc6CiAJCWlmIChjaF9wZWVyID09IDAgJiYgY2hfc2VsZiA9PSAwKSB7Ci0JCQlydiA9IHRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmbWRldi0+dGNvbm4tPmZsYWdzKQorCQkJcnYgPSB0ZXN0X2JpdChSRVNPTFZFX0NPTkZMSUNUUywgJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5mbGFncykKIAkJCQk/IC0xIDogMTsKIAkJCWJyZWFrOwogCQl9IGVsc2UgewpAQCAtMjYwOCw3ICsyNjQyLDcgQEAKIAkJCXJ2ID0gIDE7CiAJCWVsc2UgLyogKCBjaF9zZWxmID09IGNoX3BlZXIgKSAqLwogCQkgICAgIC8qIFdlbGwsIHRoZW4gdXNlIHNvbWV0aGluZyBlbHNlLiAqLwotCQkJcnYgPSB0ZXN0X2JpdChSRVNPTFZFX0NPTkZMSUNUUywgJm1kZXYtPnRjb25uLT5mbGFncykKKwkJCXJ2ID0gdGVzdF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZmxhZ3MpCiAJCQkJPyAtMSA6IDE7CiAJCWJyZWFrOwogCWNhc2UgQVNCX0RJU0NBUkRfTE9DQUw6CkBAIC0yNjIxLDEzICsyNjU1LDE3IEBACiAJcmV0dXJuIHJ2OwogfQogCi1zdGF0aWMgaW50IGRyYmRfYXNiX3JlY292ZXJfMXAoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpCisvKioKKyAqIGRyYmRfYXNiX3JlY292ZXJfMXAgIC0gIFJlY292ZXIgYWZ0ZXIgc3BsaXQtYnJhaW4gd2l0aCBvbmUgcmVtYWluaW5nIHByaW1hcnkKKyAqLworc3RhdGljIGludCBkcmJkX2FzYl9yZWNvdmVyXzFwKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSkgX19tdXN0X2hvbGQobG9jYWwpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCWludCBoZywgcnYgPSAtMTAwOwogCWVudW0gZHJiZF9hZnRlcl9zYl9wIGFmdGVyX3NiXzFwOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWFmdGVyX3NiXzFwID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZiktPmFmdGVyX3NiXzFwOworCWFmdGVyX3NiXzFwID0gcmN1X2RlcmVmZXJlbmNlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5uZXRfY29uZiktPmFmdGVyX3NiXzFwOwogCXJjdV9yZWFkX3VubG9jaygpOwogCXN3aXRjaCAoYWZ0ZXJfc2JfMXApIHsKIAljYXNlIEFTQl9ESVNDQVJEX1lPVU5HRVJfUFJJOgpAQCAtMjYzNiwzNSArMjY3NCwzNSBAQAogCWNhc2UgQVNCX0RJU0NBUkRfTE9DQUw6CiAJY2FzZSBBU0JfRElTQ0FSRF9SRU1PVEU6CiAJY2FzZSBBU0JfRElTQ0FSRF9aRVJPX0NIRzoKLQkJZGV2X2VycihERVYsICJDb25maWd1cmF0aW9uIGVycm9yLlxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkNvbmZpZ3VyYXRpb24gZXJyb3IuXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBBU0JfRElTQ09OTkVDVDoKIAkJYnJlYWs7CiAJY2FzZSBBU0JfQ09OU0VOU1VTOgotCQloZyA9IGRyYmRfYXNiX3JlY292ZXJfMHAobWRldik7Ci0JCWlmIChoZyA9PSAtMSAmJiBtZGV2LT5zdGF0ZS5yb2xlID09IFJfU0VDT05EQVJZKQorCQloZyA9IGRyYmRfYXNiX3JlY292ZXJfMHAocGVlcl9kZXZpY2UpOworCQlpZiAoaGcgPT0gLTEgJiYgZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfU0VDT05EQVJZKQogCQkJcnYgPSBoZzsKLQkJaWYgKGhnID09IDEgICYmIG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKQorCQlpZiAoaGcgPT0gMSAgJiYgZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSkKIAkJCXJ2ID0gaGc7CiAJCWJyZWFrOwogCWNhc2UgQVNCX1ZJT0xFTlRMWToKLQkJcnYgPSBkcmJkX2FzYl9yZWNvdmVyXzBwKG1kZXYpOworCQlydiA9IGRyYmRfYXNiX3JlY292ZXJfMHAocGVlcl9kZXZpY2UpOwogCQlicmVhazsKIAljYXNlIEFTQl9ESVNDQVJEX1NFQ09OREFSWToKLQkJcmV0dXJuIG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZID8gMSA6IC0xOworCQlyZXR1cm4gZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSA/IDEgOiAtMTsKIAljYXNlIEFTQl9DQUxMX0hFTFBFUjoKLQkJaGcgPSBkcmJkX2FzYl9yZWNvdmVyXzBwKG1kZXYpOwotCQlpZiAoaGcgPT0gLTEgJiYgbWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkpIHsKKwkJaGcgPSBkcmJkX2FzYl9yZWNvdmVyXzBwKHBlZXJfZGV2aWNlKTsKKwkJaWYgKGhnID09IC0xICYmIGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkpIHsKIAkJCWVudW0gZHJiZF9zdGF0ZV9ydiBydjI7CiAKIAkJCSAvKiBkcmJkX2NoYW5nZV9zdGF0ZSgpIGRvZXMgbm90IHNsZWVwIHdoaWxlIGluIFNTX0lOX1RSQU5TSUVOVF9TVEFURSwKIAkJCSAgKiB3ZSBtaWdodCBiZSBoZXJlIGluIENfV0ZfUkVQT1JUX1BBUkFNUyB3aGljaCBpcyB0cmFuc2llbnQuCiAJCQkgICogd2UgZG8gbm90IG5lZWQgdG8gd2FpdCBmb3IgdGhlIGFmdGVyIHN0YXRlIGNoYW5nZSB3b3JrIGVpdGhlci4gKi8KLQkJCXJ2MiA9IGRyYmRfY2hhbmdlX3N0YXRlKG1kZXYsIENTX1ZFUkJPU0UsIE5TKHJvbGUsIFJfU0VDT05EQVJZKSk7CisJCQlydjIgPSBkcmJkX2NoYW5nZV9zdGF0ZShkZXZpY2UsIENTX1ZFUkJPU0UsIE5TKHJvbGUsIFJfU0VDT05EQVJZKSk7CiAJCQlpZiAocnYyICE9IFNTX1NVQ0NFU1MpIHsKLQkJCQlkcmJkX2toZWxwZXIobWRldiwgInByaS1sb3N0LWFmdGVyLXNiIik7CisJCQkJZHJiZF9raGVscGVyKGRldmljZSwgInByaS1sb3N0LWFmdGVyLXNiIik7CiAJCQl9IGVsc2UgewotCQkJCWRldl93YXJuKERFViwgIlN1Y2Nlc3NmdWxseSBnYXZlIHVwIHByaW1hcnkgcm9sZS5cbiIpOworCQkJCWRyYmRfd2FybihkZXZpY2UsICJTdWNjZXNzZnVsbHkgZ2F2ZSB1cCBwcmltYXJ5IHJvbGUuXG4iKTsKIAkJCQlydiA9IGhnOwogCQkJfQogCQl9IGVsc2UKQEAgLTI2NzQsMTMgKzI3MTIsMTcgQEAKIAlyZXR1cm4gcnY7CiB9CiAKLXN0YXRpYyBpbnQgZHJiZF9hc2JfcmVjb3Zlcl8ycChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KSBfX211c3RfaG9sZChsb2NhbCkKKy8qKgorICogZHJiZF9hc2JfcmVjb3Zlcl8ycCAgLSAgUmVjb3ZlciBhZnRlciBzcGxpdC1icmFpbiB3aXRoIHR3byByZW1haW5pbmcgcHJpbWFyaWVzCisgKi8KK3N0YXRpYyBpbnQgZHJiZF9hc2JfcmVjb3Zlcl8ycChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UpIF9fbXVzdF9ob2xkKGxvY2FsKQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlpbnQgaGcsIHJ2ID0gLTEwMDsKIAllbnVtIGRyYmRfYWZ0ZXJfc2JfcCBhZnRlcl9zYl8ycDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlhZnRlcl9zYl8ycCA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpLT5hZnRlcl9zYl8ycDsKKwlhZnRlcl9zYl8ycCA9IHJjdV9kZXJlZmVyZW5jZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpLT5hZnRlcl9zYl8ycDsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAlzd2l0Y2ggKGFmdGVyX3NiXzJwKSB7CiAJY2FzZSBBU0JfRElTQ0FSRF9ZT1VOR0VSX1BSSToKQEAgLTI2OTEsMjYgKzI3MzMsMjYgQEAKIAljYXNlIEFTQl9DT05TRU5TVVM6CiAJY2FzZSBBU0JfRElTQ0FSRF9TRUNPTkRBUlk6CiAJY2FzZSBBU0JfRElTQ0FSRF9aRVJPX0NIRzoKLQkJZGV2X2VycihERVYsICJDb25maWd1cmF0aW9uIGVycm9yLlxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkNvbmZpZ3VyYXRpb24gZXJyb3IuXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBBU0JfVklPTEVOVExZOgotCQlydiA9IGRyYmRfYXNiX3JlY292ZXJfMHAobWRldik7CisJCXJ2ID0gZHJiZF9hc2JfcmVjb3Zlcl8wcChwZWVyX2RldmljZSk7CiAJCWJyZWFrOwogCWNhc2UgQVNCX0RJU0NPTk5FQ1Q6CiAJCWJyZWFrOwogCWNhc2UgQVNCX0NBTExfSEVMUEVSOgotCQloZyA9IGRyYmRfYXNiX3JlY292ZXJfMHAobWRldik7CisJCWhnID0gZHJiZF9hc2JfcmVjb3Zlcl8wcChwZWVyX2RldmljZSk7CiAJCWlmIChoZyA9PSAtMSkgewogCQkJZW51bSBkcmJkX3N0YXRlX3J2IHJ2MjsKIAogCQkJIC8qIGRyYmRfY2hhbmdlX3N0YXRlKCkgZG9lcyBub3Qgc2xlZXAgd2hpbGUgaW4gU1NfSU5fVFJBTlNJRU5UX1NUQVRFLAogCQkJICAqIHdlIG1pZ2h0IGJlIGhlcmUgaW4gQ19XRl9SRVBPUlRfUEFSQU1TIHdoaWNoIGlzIHRyYW5zaWVudC4KIAkJCSAgKiB3ZSBkbyBub3QgbmVlZCB0byB3YWl0IGZvciB0aGUgYWZ0ZXIgc3RhdGUgY2hhbmdlIHdvcmsgZWl0aGVyLiAqLwotCQkJcnYyID0gZHJiZF9jaGFuZ2Vfc3RhdGUobWRldiwgQ1NfVkVSQk9TRSwgTlMocm9sZSwgUl9TRUNPTkRBUlkpKTsKKwkJCXJ2MiA9IGRyYmRfY2hhbmdlX3N0YXRlKGRldmljZSwgQ1NfVkVSQk9TRSwgTlMocm9sZSwgUl9TRUNPTkRBUlkpKTsKIAkJCWlmIChydjIgIT0gU1NfU1VDQ0VTUykgewotCQkJCWRyYmRfa2hlbHBlcihtZGV2LCAicHJpLWxvc3QtYWZ0ZXItc2IiKTsKKwkJCQlkcmJkX2toZWxwZXIoZGV2aWNlLCAicHJpLWxvc3QtYWZ0ZXItc2IiKTsKIAkJCX0gZWxzZSB7Ci0JCQkJZGV2X3dhcm4oREVWLCAiU3VjY2Vzc2Z1bGx5IGdhdmUgdXAgcHJpbWFyeSByb2xlLlxuIik7CisJCQkJZHJiZF93YXJuKGRldmljZSwgIlN1Y2Nlc3NmdWxseSBnYXZlIHVwIHByaW1hcnkgcm9sZS5cbiIpOwogCQkJCXJ2ID0gaGc7CiAJCQl9CiAJCX0gZWxzZQpAQCAtMjcyMCwxNCArMjc2MiwxNCBAQAogCXJldHVybiBydjsKIH0KIAotc3RhdGljIHZvaWQgZHJiZF91dWlkX2R1bXAoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgY2hhciAqdGV4dCwgdTY0ICp1dWlkLAorc3RhdGljIHZvaWQgZHJiZF91dWlkX2R1bXAoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNoYXIgKnRleHQsIHU2NCAqdXVpZCwKIAkJCSAgIHU2NCBiaXRzLCB1NjQgZmxhZ3MpCiB7CiAJaWYgKCF1dWlkKSB7Ci0JCWRldl9pbmZvKERFViwgIiVzIHV1aWQgaW5mbyB2YW5pc2hlZCB3aGlsZSBJIHdhcyBsb29raW5nIVxuIiwgdGV4dCk7CisJCWRyYmRfaW5mbyhkZXZpY2UsICIlcyB1dWlkIGluZm8gdmFuaXNoZWQgd2hpbGUgSSB3YXMgbG9va2luZyFcbiIsIHRleHQpOwogCQlyZXR1cm47CiAJfQotCWRldl9pbmZvKERFViwgIiVzICUwMTZsbFg6JTAxNmxsWDolMDE2bGxYOiUwMTZsbFggYml0czolbGx1IGZsYWdzOiVsbFhcbiIsCisJZHJiZF9pbmZvKGRldmljZSwgIiVzICUwMTZsbFg6JTAxNmxsWDolMDE2bGxYOiUwMTZsbFggYml0czolbGx1IGZsYWdzOiVsbFhcbiIsCiAJICAgICB0ZXh0LAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl1dWlkW1VJX0NVUlJFTlRdLAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl1dWlkW1VJX0JJVE1BUF0sCkBAIC0yNzQ5LDEzICsyNzkxLDEzIEBACiAtMTA5MSAgIHJlcXVpcmVzIHByb3RvIDkxCiAtMTA5NiAgIHJlcXVpcmVzIHByb3RvIDk2CiAgKi8KLXN0YXRpYyBpbnQgZHJiZF91dWlkX2NvbXBhcmUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50ICpydWxlX25yKSBfX211c3RfaG9sZChsb2NhbCkKK3N0YXRpYyBpbnQgZHJiZF91dWlkX2NvbXBhcmUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCAqcnVsZV9ucikgX19tdXN0X2hvbGQobG9jYWwpCiB7CiAJdTY0IHNlbGYsIHBlZXI7CiAJaW50IGksIGo7CiAKLQlzZWxmID0gbWRldi0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSAmIH4oKHU2NCkxKTsKLQlwZWVyID0gbWRldi0+cF91dWlkW1VJX0NVUlJFTlRdICYgfigodTY0KTEpOworCXNlbGYgPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSk7CisJcGVlciA9IGRldmljZS0+cF91dWlkW1VJX0NVUlJFTlRdICYgfigodTY0KTEpOwogCiAJKnJ1bGVfbnIgPSAxMDsKIAlpZiAoc2VsZiA9PSBVVUlEX0pVU1RfQ1JFQVRFRCAmJiBwZWVyID09IFVVSURfSlVTVF9DUkVBVEVEKQpAQCAtMjc3NCw0NiArMjgxNiw0NiBAQAogCWlmIChzZWxmID09IHBlZXIpIHsKIAkJaW50IHJjdCwgZGM7IC8qIHJvbGVzIGF0IGNyYXNoIHRpbWUgKi8KIAotCQlpZiAobWRldi0+cF91dWlkW1VJX0JJVE1BUF0gPT0gKHU2NCkwICYmIG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAhPSAodTY0KTApIHsKKwkJaWYgKGRldmljZS0+cF91dWlkW1VJX0JJVE1BUF0gPT0gKHU2NCkwICYmIGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdICE9ICh1NjQpMCkgewogCi0JCQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkxKQorCQkJaWYgKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkxKQogCQkJCXJldHVybiAtMTA5MTsKIAotCQkJaWYgKChtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gJiB+KCh1NjQpMSkpID09IChtZGV2LT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSkpICYmCi0JCQkgICAgKG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSkpID09IChtZGV2LT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVCArIDFdICYgfigodTY0KTEpKSkgewotCQkJCWRldl9pbmZvKERFViwgIndhcyBTeW5jU291cmNlLCBtaXNzZWQgdGhlIHJlc3luYyBmaW5pc2hlZCBldmVudCwgY29ycmVjdGVkIG15c2VsZjpcbiIpOwotCQkJCWRyYmRfdXVpZF9tb3ZlX2hpc3RvcnkobWRldik7Ci0JCQkJbWRldi0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUXSA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXTsKLQkJCQltZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPSAwOworCQkJaWYgKChkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKSkgPT0gKGRldmljZS0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlRdICYgfigodTY0KTEpKSAmJgorCQkJICAgIChkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSkpID09IChkZXZpY2UtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV0gJiB+KCh1NjQpMSkpKSB7CisJCQkJZHJiZF9pbmZvKGRldmljZSwgIndhcyBTeW5jU291cmNlLCBtaXNzZWQgdGhlIHJlc3luYyBmaW5pc2hlZCBldmVudCwgY29ycmVjdGVkIG15c2VsZjpcbiIpOworCQkJCWRyYmRfdXVpZF9tb3ZlX2hpc3RvcnkoZGV2aWNlKTsKKwkJCQlkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0gPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXTsKKwkJCQlkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9IDA7CiAKLQkJCQlkcmJkX3V1aWRfZHVtcChtZGV2LCAic2VsZiIsIG1kZXYtPmxkZXYtPm1kLnV1aWQsCi0JCQkJCSAgICAgICBtZGV2LT5zdGF0ZS5kaXNrID49IERfTkVHT1RJQVRJTkcgPyBkcmJkX2JtX3RvdGFsX3dlaWdodChtZGV2KSA6IDAsIDApOworCQkJCWRyYmRfdXVpZF9kdW1wKGRldmljZSwgInNlbGYiLCBkZXZpY2UtPmxkZXYtPm1kLnV1aWQsCisJCQkJCSAgICAgICBkZXZpY2UtPnN0YXRlLmRpc2sgPj0gRF9ORUdPVElBVElORyA/IGRyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSkgOiAwLCAwKTsKIAkJCQkqcnVsZV9uciA9IDM0OwogCQkJfSBlbHNlIHsKLQkJCQlkZXZfaW5mbyhERVYsICJ3YXMgU3luY1NvdXJjZSAocGVlciBmYWlsZWQgdG8gd3JpdGUgc3luY191dWlkKVxuIik7CisJCQkJZHJiZF9pbmZvKGRldmljZSwgIndhcyBTeW5jU291cmNlIChwZWVyIGZhaWxlZCB0byB3cml0ZSBzeW5jX3V1aWQpXG4iKTsKIAkJCQkqcnVsZV9uciA9IDM2OwogCQkJfQogCiAJCQlyZXR1cm4gMTsKIAkJfQogCi0JCWlmIChtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPT0gKHU2NCkwICYmIG1kZXYtPnBfdXVpZFtVSV9CSVRNQVBdICE9ICh1NjQpMCkgeworCQlpZiAoZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPT0gKHU2NCkwICYmIGRldmljZS0+cF91dWlkW1VJX0JJVE1BUF0gIT0gKHU2NCkwKSB7CiAKLQkJCWlmIChtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTEpCisJCQlpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTEpCiAJCQkJcmV0dXJuIC0xMDkxOwogCi0JCQlpZiAoKG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSkpID09IChtZGV2LT5wX3V1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKSkgJiYKLQkJCSAgICAobWRldi0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV0gJiB+KCh1NjQpMSkpID09IChtZGV2LT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSkpKSB7Ci0JCQkJZGV2X2luZm8oREVWLCAid2FzIFN5bmNUYXJnZXQsIHBlZXIgbWlzc2VkIHRoZSByZXN5bmMgZmluaXNoZWQgZXZlbnQsIGNvcnJlY3RlZCBwZWVyOlxuIik7CisJCQlpZiAoKGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUXSAmIH4oKHU2NCkxKSkgPT0gKGRldmljZS0+cF91dWlkW1VJX0JJVE1BUF0gJiB+KCh1NjQpMSkpICYmCisJCQkgICAgKGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV0gJiB+KCh1NjQpMSkpID09IChkZXZpY2UtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUXSAmIH4oKHU2NCkxKSkpIHsKKwkJCQlkcmJkX2luZm8oZGV2aWNlLCAid2FzIFN5bmNUYXJnZXQsIHBlZXIgbWlzc2VkIHRoZSByZXN5bmMgZmluaXNoZWQgZXZlbnQsIGNvcnJlY3RlZCBwZWVyOlxuIik7CiAKLQkJCQltZGV2LT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVCArIDFdID0gbWRldi0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlRdOwotCQkJCW1kZXYtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUXSA9IG1kZXYtPnBfdXVpZFtVSV9CSVRNQVBdOwotCQkJCW1kZXYtPnBfdXVpZFtVSV9CSVRNQVBdID0gMFVMOworCQkJCWRldmljZS0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlQgKyAxXSA9IGRldmljZS0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlRdOworCQkJCWRldmljZS0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlRdID0gZGV2aWNlLT5wX3V1aWRbVUlfQklUTUFQXTsKKwkJCQlkZXZpY2UtPnBfdXVpZFtVSV9CSVRNQVBdID0gMFVMOwogCi0JCQkJZHJiZF91dWlkX2R1bXAobWRldiwgInBlZXIiLCBtZGV2LT5wX3V1aWQsIG1kZXYtPnBfdXVpZFtVSV9TSVpFXSwgbWRldi0+cF91dWlkW1VJX0ZMQUdTXSk7CisJCQkJZHJiZF91dWlkX2R1bXAoZGV2aWNlLCAicGVlciIsIGRldmljZS0+cF91dWlkLCBkZXZpY2UtPnBfdXVpZFtVSV9TSVpFXSwgZGV2aWNlLT5wX3V1aWRbVUlfRkxBR1NdKTsKIAkJCQkqcnVsZV9uciA9IDM1OwogCQkJfSBlbHNlIHsKLQkJCQlkZXZfaW5mbyhERVYsICJ3YXMgU3luY1RhcmdldCAoZmFpbGVkIHRvIHdyaXRlIHN5bmNfdXVpZClcbiIpOworCQkJCWRyYmRfaW5mbyhkZXZpY2UsICJ3YXMgU3luY1RhcmdldCAoZmFpbGVkIHRvIHdyaXRlIHN5bmNfdXVpZClcbiIpOwogCQkJCSpydWxlX25yID0gMzc7CiAJCQl9CiAKQEAgLTI4MjEsOCArMjg2Myw4IEBACiAJCX0KIAogCQkvKiBDb21tb24gcG93ZXIgW29mZnxmYWlsdXJlXSAqLwotCQlyY3QgPSAodGVzdF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmbWRldi0+ZmxhZ3MpID8gMSA6IDApICsKLQkJCShtZGV2LT5wX3V1aWRbVUlfRkxBR1NdICYgMik7CisJCXJjdCA9ICh0ZXN0X2JpdChDUkFTSEVEX1BSSU1BUlksICZkZXZpY2UtPmZsYWdzKSA/IDEgOiAwKSArCisJCQkoZGV2aWNlLT5wX3V1aWRbVUlfRkxBR1NdICYgMik7CiAJCS8qIGxvd2VzdCBiaXQgaXMgc2V0IHdoZW4gd2Ugd2VyZSBwcmltYXJ5LAogCQkgKiBuZXh0IGJpdCAod2VpZ2h0IDIpIGlzIHNldCB3aGVuIHBlZXIgd2FzIHByaW1hcnkgKi8KIAkJKnJ1bGVfbnIgPSA0MDsKQEAgLTI4MzIsNzIgKzI4NzQsNzIgQEAKIAkJY2FzZSAxOiAvKiAgc2VsZl9wcmkgJiYgIXBlZXJfcHJpICovIHJldHVybiAxOwogCQljYXNlIDI6IC8qICFzZWxmX3ByaSAmJiAgcGVlcl9wcmkgKi8gcmV0dXJuIC0xOwogCQljYXNlIDM6IC8qICBzZWxmX3ByaSAmJiAgcGVlcl9wcmkgKi8KLQkJCWRjID0gdGVzdF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZtZGV2LT50Y29ubi0+ZmxhZ3MpOworCQkJZGMgPSB0ZXN0X2JpdChSRVNPTFZFX0NPTkZMSUNUUywgJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmZsYWdzKTsKIAkJCXJldHVybiBkYyA/IC0xIDogMTsKIAkJfQogCX0KIAogCSpydWxlX25yID0gNTA7Ci0JcGVlciA9IG1kZXYtPnBfdXVpZFtVSV9CSVRNQVBdICYgfigodTY0KTEpOworCXBlZXIgPSBkZXZpY2UtPnBfdXVpZFtVSV9CSVRNQVBdICYgfigodTY0KTEpOwogCWlmIChzZWxmID09IHBlZXIpCiAJCXJldHVybiAtMTsKIAogCSpydWxlX25yID0gNTE7Ci0JcGVlciA9IG1kZXYtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUXSAmIH4oKHU2NCkxKTsKKwlwZWVyID0gZGV2aWNlLT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSk7CiAJaWYgKHNlbGYgPT0gcGVlcikgewotCQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk2ID8KLQkJICAgIChtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0hJU1RPUllfU1RBUlRdICYgfigodTY0KTEpKSA9PQotCQkgICAgKG1kZXYtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV0gJiB+KCh1NjQpMSkpIDoKLQkJICAgIHBlZXIgKyBVVUlEX05FV19CTV9PRkZTRVQgPT0gKG1kZXYtPnBfdXVpZFtVSV9CSVRNQVBdICYgfigodTY0KTEpKSkgeworCQlpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTYgPworCQkgICAgKGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUXSAmIH4oKHU2NCkxKSkgPT0KKwkJICAgIChkZXZpY2UtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV0gJiB+KCh1NjQpMSkpIDoKKwkJICAgIHBlZXIgKyBVVUlEX05FV19CTV9PRkZTRVQgPT0gKGRldmljZS0+cF91dWlkW1VJX0JJVE1BUF0gJiB+KCh1NjQpMSkpKSB7CiAJCQkvKiBUaGUgbGFzdCBQX1NZTkNfVVVJRCBkaWQgbm90IGdldCB0aG91Z2guIFVuZG8gdGhlIGxhc3Qgc3RhcnQgb2YKIAkJCSAgIHJlc3luYyBhcyBzeW5jIHNvdXJjZSBtb2RpZmljYXRpb25zIG9mIHRoZSBwZWVyJ3MgVVVJRHMuICovCiAKLQkJCWlmIChtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTEpCisJCQlpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTEpCiAJCQkJcmV0dXJuIC0xMDkxOwogCi0JCQltZGV2LT5wX3V1aWRbVUlfQklUTUFQXSA9IG1kZXYtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUXTsKLQkJCW1kZXYtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUXSA9IG1kZXYtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV07CisJCQlkZXZpY2UtPnBfdXVpZFtVSV9CSVRNQVBdID0gZGV2aWNlLT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVF07CisJCQlkZXZpY2UtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUXSA9IGRldmljZS0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlQgKyAxXTsKIAotCQkJZGV2X2luZm8oREVWLCAiTG9zdCBsYXN0IHN5bmNVVUlEIHBhY2tldCwgY29ycmVjdGVkOlxuIik7Ci0JCQlkcmJkX3V1aWRfZHVtcChtZGV2LCAicGVlciIsIG1kZXYtPnBfdXVpZCwgbWRldi0+cF91dWlkW1VJX1NJWkVdLCBtZGV2LT5wX3V1aWRbVUlfRkxBR1NdKTsKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJMb3N0IGxhc3Qgc3luY1VVSUQgcGFja2V0LCBjb3JyZWN0ZWQ6XG4iKTsKKwkJCWRyYmRfdXVpZF9kdW1wKGRldmljZSwgInBlZXIiLCBkZXZpY2UtPnBfdXVpZCwgZGV2aWNlLT5wX3V1aWRbVUlfU0laRV0sIGRldmljZS0+cF91dWlkW1VJX0ZMQUdTXSk7CiAKIAkJCXJldHVybiAtMTsKIAkJfQogCX0KIAogCSpydWxlX25yID0gNjA7Ci0Jc2VsZiA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSk7CisJc2VsZiA9IGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSAmIH4oKHU2NCkxKTsKIAlmb3IgKGkgPSBVSV9ISVNUT1JZX1NUQVJUOyBpIDw9IFVJX0hJU1RPUllfRU5EOyBpKyspIHsKLQkJcGVlciA9IG1kZXYtPnBfdXVpZFtpXSAmIH4oKHU2NCkxKTsKKwkJcGVlciA9IGRldmljZS0+cF91dWlkW2ldICYgfigodTY0KTEpOwogCQlpZiAoc2VsZiA9PSBwZWVyKQogCQkJcmV0dXJuIC0yOwogCX0KIAogCSpydWxlX25yID0gNzA7Ci0Jc2VsZiA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKTsKLQlwZWVyID0gbWRldi0+cF91dWlkW1VJX0NVUlJFTlRdICYgfigodTY0KTEpOworCXNlbGYgPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKTsKKwlwZWVyID0gZGV2aWNlLT5wX3V1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSk7CiAJaWYgKHNlbGYgPT0gcGVlcikKIAkJcmV0dXJuIDE7CiAKIAkqcnVsZV9uciA9IDcxOwotCXNlbGYgPSBtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0hJU1RPUllfU1RBUlRdICYgfigodTY0KTEpOworCXNlbGYgPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSk7CiAJaWYgKHNlbGYgPT0gcGVlcikgewotCQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk2ID8KLQkJICAgIChtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0hJU1RPUllfU1RBUlQgKyAxXSAmIH4oKHU2NCkxKSkgPT0KLQkJICAgIChtZGV2LT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSkpIDoKLQkJICAgIHNlbGYgKyBVVUlEX05FV19CTV9PRkZTRVQgPT0gKG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKSkpIHsKKwkJaWYgKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk2ID8KKwkJICAgIChkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVCArIDFdICYgfigodTY0KTEpKSA9PQorCQkgICAgKGRldmljZS0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlRdICYgfigodTY0KTEpKSA6CisJCSAgICBzZWxmICsgVVVJRF9ORVdfQk1fT0ZGU0VUID09IChkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKSkpIHsKIAkJCS8qIFRoZSBsYXN0IFBfU1lOQ19VVUlEIGRpZCBub3QgZ2V0IHRob3VnaC4gVW5kbyB0aGUgbGFzdCBzdGFydCBvZgogCQkJICAgcmVzeW5jIGFzIHN5bmMgc291cmNlIG1vZGlmaWNhdGlvbnMgb2Ygb3VyIFVVSURzLiAqLwogCi0JCQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkxKQorCQkJaWYgKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkxKQogCQkJCXJldHVybiAtMTA5MTsKIAotCQkJX19kcmJkX3V1aWRfc2V0KG1kZXYsIFVJX0JJVE1BUCwgbWRldi0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUXSk7Ci0JCQlfX2RyYmRfdXVpZF9zZXQobWRldiwgVUlfSElTVE9SWV9TVEFSVCwgbWRldi0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV0pOworCQkJX19kcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfQklUTUFQLCBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0pOworCQkJX19kcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfSElTVE9SWV9TVEFSVCwgZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0hJU1RPUllfU1RBUlQgKyAxXSk7CiAKLQkJCWRldl9pbmZvKERFViwgIkxhc3Qgc3luY1VVSUQgZGlkIG5vdCBnZXQgdGhyb3VnaCwgY29ycmVjdGVkOlxuIik7Ci0JCQlkcmJkX3V1aWRfZHVtcChtZGV2LCAic2VsZiIsIG1kZXYtPmxkZXYtPm1kLnV1aWQsCi0JCQkJICAgICAgIG1kZXYtPnN0YXRlLmRpc2sgPj0gRF9ORUdPVElBVElORyA/IGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpIDogMCwgMCk7CisJCQlkcmJkX2luZm8oZGV2aWNlLCAiTGFzdCBzeW5jVVVJRCBkaWQgbm90IGdldCB0aHJvdWdoLCBjb3JyZWN0ZWQ6XG4iKTsKKwkJCWRyYmRfdXVpZF9kdW1wKGRldmljZSwgInNlbGYiLCBkZXZpY2UtPmxkZXYtPm1kLnV1aWQsCisJCQkJICAgICAgIGRldmljZS0+c3RhdGUuZGlzayA+PSBEX05FR09USUFUSU5HID8gZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKSA6IDAsIDApOwogCiAJCQlyZXR1cm4gMTsKIAkJfQpAQCAtMjkwNSwyNCArMjk0NywyNCBAQAogCiAKIAkqcnVsZV9uciA9IDgwOwotCXBlZXIgPSBtZGV2LT5wX3V1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSk7CisJcGVlciA9IGRldmljZS0+cF91dWlkW1VJX0NVUlJFTlRdICYgfigodTY0KTEpOwogCWZvciAoaSA9IFVJX0hJU1RPUllfU1RBUlQ7IGkgPD0gVUlfSElTVE9SWV9FTkQ7IGkrKykgewotCQlzZWxmID0gbWRldi0+bGRldi0+bWQudXVpZFtpXSAmIH4oKHU2NCkxKTsKKwkJc2VsZiA9IGRldmljZS0+bGRldi0+bWQudXVpZFtpXSAmIH4oKHU2NCkxKTsKIAkJaWYgKHNlbGYgPT0gcGVlcikKIAkJCXJldHVybiAyOwogCX0KIAogCSpydWxlX25yID0gOTA7Ci0Jc2VsZiA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKTsKLQlwZWVyID0gbWRldi0+cF91dWlkW1VJX0JJVE1BUF0gJiB+KCh1NjQpMSk7CisJc2VsZiA9IGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdICYgfigodTY0KTEpOworCXBlZXIgPSBkZXZpY2UtPnBfdXVpZFtVSV9CSVRNQVBdICYgfigodTY0KTEpOwogCWlmIChzZWxmID09IHBlZXIgJiYgc2VsZiAhPSAoKHU2NCkwKSkKIAkJcmV0dXJuIDEwMDsKIAogCSpydWxlX25yID0gMTAwOwogCWZvciAoaSA9IFVJX0hJU1RPUllfU1RBUlQ7IGkgPD0gVUlfSElTVE9SWV9FTkQ7IGkrKykgewotCQlzZWxmID0gbWRldi0+bGRldi0+bWQudXVpZFtpXSAmIH4oKHU2NCkxKTsKKwkJc2VsZiA9IGRldmljZS0+bGRldi0+bWQudXVpZFtpXSAmIH4oKHU2NCkxKTsKIAkJZm9yIChqID0gVUlfSElTVE9SWV9TVEFSVDsgaiA8PSBVSV9ISVNUT1JZX0VORDsgaisrKSB7Ci0JCQlwZWVyID0gbWRldi0+cF91dWlkW2pdICYgfigodTY0KTEpOworCQkJcGVlciA9IGRldmljZS0+cF91dWlkW2pdICYgfigodTY0KTEpOwogCQkJaWYgKHNlbGYgPT0gcGVlcikKIAkJCQlyZXR1cm4gLTEwMDsKIAkJfQpAQCAtMjkzNCwzNiArMjk3NiwzOCBAQAogLyogZHJiZF9zeW5jX2hhbmRzaGFrZSgpIHJldHVybnMgdGhlIG5ldyBjb25uIHN0YXRlIG9uIHN1Y2Nlc3MsIG9yCiAgICBDT05OX01BU0sgKC0xKSBvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgZW51bSBkcmJkX2Nvbm5zIGRyYmRfc3luY19oYW5kc2hha2Uoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX3JvbGUgcGVlcl9yb2xlLAorc3RhdGljIGVudW0gZHJiZF9jb25ucyBkcmJkX3N5bmNfaGFuZHNoYWtlKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwKKwkJCQkJICAgZW51bSBkcmJkX3JvbGUgcGVlcl9yb2xlLAogCQkJCQkgICBlbnVtIGRyYmRfZGlza19zdGF0ZSBwZWVyX2Rpc2spIF9fbXVzdF9ob2xkKGxvY2FsKQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAllbnVtIGRyYmRfY29ubnMgcnYgPSBDX01BU0s7CiAJZW51bSBkcmJkX2Rpc2tfc3RhdGUgbXlkaXNrOwogCXN0cnVjdCBuZXRfY29uZiAqbmM7CiAJaW50IGhnLCBydWxlX25yLCBycl9jb25mbGljdCwgdGVudGF0aXZlOwogCi0JbXlkaXNrID0gbWRldi0+c3RhdGUuZGlzazsKKwlteWRpc2sgPSBkZXZpY2UtPnN0YXRlLmRpc2s7CiAJaWYgKG15ZGlzayA9PSBEX05FR09USUFUSU5HKQotCQlteWRpc2sgPSBtZGV2LT5uZXdfc3RhdGVfdG1wLmRpc2s7CisJCW15ZGlzayA9IGRldmljZS0+bmV3X3N0YXRlX3RtcC5kaXNrOwogCi0JZGV2X2luZm8oREVWLCAiZHJiZF9zeW5jX2hhbmRzaGFrZTpcbiIpOworCWRyYmRfaW5mbyhkZXZpY2UsICJkcmJkX3N5bmNfaGFuZHNoYWtlOlxuIik7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT5sZGV2LT5tZC51dWlkX2xvY2spOwotCWRyYmRfdXVpZF9kdW1wKG1kZXYsICJzZWxmIiwgbWRldi0+bGRldi0+bWQudXVpZCwgbWRldi0+Y29tbV9ibV9zZXQsIDApOwotCWRyYmRfdXVpZF9kdW1wKG1kZXYsICJwZWVyIiwgbWRldi0+cF91dWlkLAotCQkgICAgICAgbWRldi0+cF91dWlkW1VJX1NJWkVdLCBtZGV2LT5wX3V1aWRbVUlfRkxBR1NdKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jayk7CisJZHJiZF91dWlkX2R1bXAoZGV2aWNlLCAic2VsZiIsIGRldmljZS0+bGRldi0+bWQudXVpZCwgZGV2aWNlLT5jb21tX2JtX3NldCwgMCk7CisJZHJiZF91dWlkX2R1bXAoZGV2aWNlLCAicGVlciIsIGRldmljZS0+cF91dWlkLAorCQkgICAgICAgZGV2aWNlLT5wX3V1aWRbVUlfU0laRV0sIGRldmljZS0+cF91dWlkW1VJX0ZMQUdTXSk7CiAKLQloZyA9IGRyYmRfdXVpZF9jb21wYXJlKG1kZXYsICZydWxlX25yKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmxkZXYtPm1kLnV1aWRfbG9jayk7CisJaGcgPSBkcmJkX3V1aWRfY29tcGFyZShkZXZpY2UsICZydWxlX25yKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+bGRldi0+bWQudXVpZF9sb2NrKTsKIAotCWRldl9pbmZvKERFViwgInV1aWRfY29tcGFyZSgpPSVkIGJ5IHJ1bGUgJWRcbiIsIGhnLCBydWxlX25yKTsKKwlkcmJkX2luZm8oZGV2aWNlLCAidXVpZF9jb21wYXJlKCk9JWQgYnkgcnVsZSAlZFxuIiwgaGcsIHJ1bGVfbnIpOwogCiAJaWYgKGhnID09IC0xMDAwKSB7Ci0JCWRldl9hbGVydChERVYsICJVbnJlbGF0ZWQgZGF0YSwgYWJvcnRpbmchXG4iKTsKKwkJZHJiZF9hbGVydChkZXZpY2UsICJVbnJlbGF0ZWQgZGF0YSwgYWJvcnRpbmchXG4iKTsKIAkJcmV0dXJuIENfTUFTSzsKIAl9CiAJaWYgKGhnIDwgLTEwMDApIHsKLQkJZGV2X2FsZXJ0KERFViwgIlRvIHJlc29sdmUgdGhpcyBib3RoIHNpZGVzIGhhdmUgdG8gc3VwcG9ydCBhdCBsZWFzdCBwcm90b2NvbCAlZFxuIiwgLWhnIC0gMTAwMCk7CisJCWRyYmRfYWxlcnQoZGV2aWNlLCAiVG8gcmVzb2x2ZSB0aGlzIGJvdGggc2lkZXMgaGF2ZSB0byBzdXBwb3J0IGF0IGxlYXN0IHByb3RvY29sICVkXG4iLCAtaGcgLSAxMDAwKTsKIAkJcmV0dXJuIENfTUFTSzsKIAl9CiAKQEAgLTI5NzMsMzggKzMwMTcsMzggQEAKIAkJaGcgPSBteWRpc2sgPiBEX0lOQ09OU0lTVEVOVCA/IDEgOiAtMTsKIAkJaWYgKGYpCiAJCQloZyA9IGhnKjI7Ci0JCWRldl9pbmZvKERFViwgIkJlY29taW5nIHN5bmMgJXMgZHVlIHRvIGRpc2sgc3RhdGVzLlxuIiwKKwkJZHJiZF9pbmZvKGRldmljZSwgIkJlY29taW5nIHN5bmMgJXMgZHVlIHRvIGRpc2sgc3RhdGVzLlxuIiwKIAkJICAgICBoZyA+IDAgPyAic291cmNlIiA6ICJ0YXJnZXQiKTsKIAl9CiAKIAlpZiAoYWJzKGhnKSA9PSAxMDApCi0JCWRyYmRfa2hlbHBlcihtZGV2LCAiaW5pdGlhbC1zcGxpdC1icmFpbiIpOworCQlkcmJkX2toZWxwZXIoZGV2aWNlLCAiaW5pdGlhbC1zcGxpdC1icmFpbiIpOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW5jID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZik7CisJbmMgPSByY3VfZGVyZWZlcmVuY2UocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPm5ldF9jb25mKTsKIAogCWlmIChoZyA9PSAxMDAgfHwgKGhnID09IC0xMDAgJiYgbmMtPmFsd2F5c19hc2JwKSkgewotCQlpbnQgcGNvdW50ID0gKG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKQorCQlpbnQgcGNvdW50ID0gKGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkpCiAJCQkgICArIChwZWVyX3JvbGUgPT0gUl9QUklNQVJZKTsKIAkJaW50IGZvcmNlZCA9IChoZyA9PSAtMTAwKTsKIAogCQlzd2l0Y2ggKHBjb3VudCkgewogCQljYXNlIDA6Ci0JCQloZyA9IGRyYmRfYXNiX3JlY292ZXJfMHAobWRldik7CisJCQloZyA9IGRyYmRfYXNiX3JlY292ZXJfMHAocGVlcl9kZXZpY2UpOwogCQkJYnJlYWs7CiAJCWNhc2UgMToKLQkJCWhnID0gZHJiZF9hc2JfcmVjb3Zlcl8xcChtZGV2KTsKKwkJCWhnID0gZHJiZF9hc2JfcmVjb3Zlcl8xcChwZWVyX2RldmljZSk7CiAJCQlicmVhazsKIAkJY2FzZSAyOgotCQkJaGcgPSBkcmJkX2FzYl9yZWNvdmVyXzJwKG1kZXYpOworCQkJaGcgPSBkcmJkX2FzYl9yZWNvdmVyXzJwKHBlZXJfZGV2aWNlKTsKIAkJCWJyZWFrOwogCQl9CiAJCWlmIChhYnMoaGcpIDwgMTAwKSB7Ci0JCQlkZXZfd2FybihERVYsICJTcGxpdC1CcmFpbiBkZXRlY3RlZCwgJWQgcHJpbWFyaWVzLCAiCisJCQlkcmJkX3dhcm4oZGV2aWNlLCAiU3BsaXQtQnJhaW4gZGV0ZWN0ZWQsICVkIHByaW1hcmllcywgIgogCQkJICAgICAiYXV0b21hdGljYWxseSBzb2x2ZWQuIFN5bmMgZnJvbSAlcyBub2RlXG4iLAogCQkJICAgICBwY291bnQsIChoZyA8IDApID8gInBlZXIiIDogInRoaXMiKTsKIAkJCWlmIChmb3JjZWQpIHsKLQkJCQlkZXZfd2FybihERVYsICJEb2luZyBhIGZ1bGwgc3luYywgc2luY2UiCisJCQkJZHJiZF93YXJuKGRldmljZSwgIkRvaW5nIGEgZnVsbCBzeW5jLCBzaW5jZSIKIAkJCQkgICAgICIgVVVJRHMgd2hlcmUgYW1iaWd1b3VzLlxuIik7CiAJCQkJaGcgPSBoZyoyOwogCQkJfQpAQCAtMzAxMiwxMyArMzA1NiwxMyBAQAogCX0KIAogCWlmIChoZyA9PSAtMTAwKSB7Ci0JCWlmICh0ZXN0X2JpdChESVNDQVJEX01ZX0RBVEEsICZtZGV2LT5mbGFncykgJiYgIShtZGV2LT5wX3V1aWRbVUlfRkxBR1NdJjEpKQorCQlpZiAodGVzdF9iaXQoRElTQ0FSRF9NWV9EQVRBLCAmZGV2aWNlLT5mbGFncykgJiYgIShkZXZpY2UtPnBfdXVpZFtVSV9GTEFHU10mMSkpCiAJCQloZyA9IC0xOwotCQlpZiAoIXRlc3RfYml0KERJU0NBUkRfTVlfREFUQSwgJm1kZXYtPmZsYWdzKSAmJiAobWRldi0+cF91dWlkW1VJX0ZMQUdTXSYxKSkKKwkJaWYgKCF0ZXN0X2JpdChESVNDQVJEX01ZX0RBVEEsICZkZXZpY2UtPmZsYWdzKSAmJiAoZGV2aWNlLT5wX3V1aWRbVUlfRkxBR1NdJjEpKQogCQkJaGcgPSAxOwogCiAJCWlmIChhYnMoaGcpIDwgMTAwKQotCQkJZGV2X3dhcm4oREVWLCAiU3BsaXQtQnJhaW4gZGV0ZWN0ZWQsIG1hbnVhbGx5IHNvbHZlZC4gIgorCQkJZHJiZF93YXJuKGRldmljZSwgIlNwbGl0LUJyYWluIGRldGVjdGVkLCBtYW51YWxseSBzb2x2ZWQuICIKIAkJCSAgICAgIlN5bmMgZnJvbSAlcyBub2RlXG4iLAogCQkJICAgICAoaGcgPCAwKSA/ICJwZWVyIiA6ICJ0aGlzIik7CiAJfQpAQCAtMzAzMSw0NCArMzA3NSw0NCBAQAogCQkgKiBhZnRlciBhbiBhdHRlbXB0ZWQgYXR0YWNoIG9uIGEgZGlza2xlc3Mgbm9kZS4KIAkJICogV2UganVzdCByZWZ1c2UgdG8gYXR0YWNoIC0tIHdlbGwsIHdlIGRyb3AgdGhlICJjb25uZWN0aW9uIgogCQkgKiB0byB0aGF0IGRpc2ssIGluIGEgd2F5Li4uICovCi0JCWRldl9hbGVydChERVYsICJTcGxpdC1CcmFpbiBkZXRlY3RlZCBidXQgdW5yZXNvbHZlZCwgZHJvcHBpbmcgY29ubmVjdGlvbiFcbiIpOwotCQlkcmJkX2toZWxwZXIobWRldiwgInNwbGl0LWJyYWluIik7CisJCWRyYmRfYWxlcnQoZGV2aWNlLCAiU3BsaXQtQnJhaW4gZGV0ZWN0ZWQgYnV0IHVucmVzb2x2ZWQsIGRyb3BwaW5nIGNvbm5lY3Rpb24hXG4iKTsKKwkJZHJiZF9raGVscGVyKGRldmljZSwgInNwbGl0LWJyYWluIik7CiAJCXJldHVybiBDX01BU0s7CiAJfQogCiAJaWYgKGhnID4gMCAmJiBteWRpc2sgPD0gRF9JTkNPTlNJU1RFTlQpIHsKLQkJZGV2X2VycihERVYsICJJIHNoYWxsIGJlY29tZSBTeW5jU291cmNlLCBidXQgSSBhbSBpbmNvbnNpc3RlbnQhXG4iKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiSSBzaGFsbCBiZWNvbWUgU3luY1NvdXJjZSwgYnV0IEkgYW0gaW5jb25zaXN0ZW50IVxuIik7CiAJCXJldHVybiBDX01BU0s7CiAJfQogCiAJaWYgKGhnIDwgMCAmJiAvKiBieSBpbnRlbnRpb24gd2UgZG8gbm90IHVzZSBteWRpc2sgaGVyZS4gKi8KLQkgICAgbWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkgJiYgbWRldi0+c3RhdGUuZGlzayA+PSBEX0NPTlNJU1RFTlQpIHsKKwkgICAgZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSAmJiBkZXZpY2UtPnN0YXRlLmRpc2sgPj0gRF9DT05TSVNURU5UKSB7CiAJCXN3aXRjaCAocnJfY29uZmxpY3QpIHsKIAkJY2FzZSBBU0JfQ0FMTF9IRUxQRVI6Ci0JCQlkcmJkX2toZWxwZXIobWRldiwgInByaS1sb3N0Iik7CisJCQlkcmJkX2toZWxwZXIoZGV2aWNlLCAicHJpLWxvc3QiKTsKIAkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQljYXNlIEFTQl9ESVNDT05ORUNUOgotCQkJZGV2X2VycihERVYsICJJIHNoYWxsIGJlY29tZSBTeW5jVGFyZ2V0LCBidXQgSSBhbSBwcmltYXJ5IVxuIik7CisJCQlkcmJkX2VycihkZXZpY2UsICJJIHNoYWxsIGJlY29tZSBTeW5jVGFyZ2V0LCBidXQgSSBhbSBwcmltYXJ5IVxuIik7CiAJCQlyZXR1cm4gQ19NQVNLOwogCQljYXNlIEFTQl9WSU9MRU5UTFk6Ci0JCQlkZXZfd2FybihERVYsICJCZWNvbWluZyBTeW5jVGFyZ2V0LCB2aW9sYXRpbmcgdGhlIHN0YWJsZS1kYXRhIgorCQkJZHJiZF93YXJuKGRldmljZSwgIkJlY29taW5nIFN5bmNUYXJnZXQsIHZpb2xhdGluZyB0aGUgc3RhYmxlLWRhdGEiCiAJCQkgICAgICJhc3N1bXB0aW9uXG4iKTsKIAkJfQogCX0KIAotCWlmICh0ZW50YXRpdmUgfHwgdGVzdF9iaXQoQ09OTl9EUllfUlVOLCAmbWRldi0+dGNvbm4tPmZsYWdzKSkgeworCWlmICh0ZW50YXRpdmUgfHwgdGVzdF9iaXQoQ09OTl9EUllfUlVOLCAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmZsYWdzKSkgewogCQlpZiAoaGcgPT0gMCkKLQkJCWRldl9pbmZvKERFViwgImRyeS1ydW4gY29ubmVjdDogTm8gcmVzeW5jLCB3b3VsZCBiZWNvbWUgQ29ubmVjdGVkIGltbWVkaWF0ZWx5LlxuIik7CisJCQlkcmJkX2luZm8oZGV2aWNlLCAiZHJ5LXJ1biBjb25uZWN0OiBObyByZXN5bmMsIHdvdWxkIGJlY29tZSBDb25uZWN0ZWQgaW1tZWRpYXRlbHkuXG4iKTsKIAkJZWxzZQotCQkJZGV2X2luZm8oREVWLCAiZHJ5LXJ1biBjb25uZWN0OiBXb3VsZCBiZWNvbWUgJXMsIGRvaW5nIGEgJXMgcmVzeW5jLiIsCisJCQlkcmJkX2luZm8oZGV2aWNlLCAiZHJ5LXJ1biBjb25uZWN0OiBXb3VsZCBiZWNvbWUgJXMsIGRvaW5nIGEgJXMgcmVzeW5jLiIsCiAJCQkJIGRyYmRfY29ubl9zdHIoaGcgPiAwID8gQ19TWU5DX1NPVVJDRSA6IENfU1lOQ19UQVJHRVQpLAogCQkJCSBhYnMoaGcpID49IDIgPyAiZnVsbCIgOiAiYml0LW1hcCBiYXNlZCIpOwogCQlyZXR1cm4gQ19NQVNLOwogCX0KIAogCWlmIChhYnMoaGcpID49IDIpIHsKLQkJZGV2X2luZm8oREVWLCAiV3JpdGluZyB0aGUgd2hvbGUgYml0bWFwLCBmdWxsIHN5bmMgcmVxdWlyZWQgYWZ0ZXIgZHJiZF9zeW5jX2hhbmRzaGFrZS5cbiIpOwotCQlpZiAoZHJiZF9iaXRtYXBfaW8obWRldiwgJmRyYmRfYm1pb19zZXRfbl93cml0ZSwgInNldF9uX3dyaXRlIGZyb20gc3luY19oYW5kc2hha2UiLAorCQlkcmJkX2luZm8oZGV2aWNlLCAiV3JpdGluZyB0aGUgd2hvbGUgYml0bWFwLCBmdWxsIHN5bmMgcmVxdWlyZWQgYWZ0ZXIgZHJiZF9zeW5jX2hhbmRzaGFrZS5cbiIpOworCQlpZiAoZHJiZF9iaXRtYXBfaW8oZGV2aWNlLCAmZHJiZF9ibWlvX3NldF9uX3dyaXRlLCAic2V0X25fd3JpdGUgZnJvbSBzeW5jX2hhbmRzaGFrZSIsCiAJCQkJCUJNX0xPQ0tFRF9TRVRfQUxMT1dFRCkpCiAJCQlyZXR1cm4gQ19NQVNLOwogCX0KQEAgLTMwNzksOSArMzEyMyw5IEBACiAJCXJ2ID0gQ19XRl9CSVRNQVBfVDsKIAl9IGVsc2UgewogCQlydiA9IENfQ09OTkVDVEVEOwotCQlpZiAoZHJiZF9ibV90b3RhbF93ZWlnaHQobWRldikpIHsKLQkJCWRldl9pbmZvKERFViwgIk5vIHJlc3luYywgYnV0ICVsdSBiaXRzIGluIGJpdG1hcCFcbiIsCi0JCQkgICAgIGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpKTsKKwkJaWYgKGRyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSkpIHsKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJObyByZXN5bmMsIGJ1dCAlbHUgYml0cyBpbiBiaXRtYXAhXG4iLAorCQkJICAgICBkcmJkX2JtX3RvdGFsX3dlaWdodChkZXZpY2UpKTsKIAkJfQogCX0KIApAQCAtMzEwMiw3ICszMTQ2LDcgQEAKIAlyZXR1cm4gcGVlcjsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX3Byb3RvY29sKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV9wcm90b2NvbChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewogCXN0cnVjdCBwX3Byb3RvY29sICpwID0gcGktPmRhdGE7CiAJZW51bSBkcmJkX2FmdGVyX3NiX3AgcF9hZnRlcl9zYl8wcCwgcF9hZnRlcl9zYl8xcCwgcF9hZnRlcl9zYl8ycDsKQEAgLTMxMjAsNTggKzMxNjQsNTggQEAKIAljZgkJPSBiZTMyX3RvX2NwdShwLT5jb25uX2ZsYWdzKTsKIAlwX2Rpc2NhcmRfbXlfZGF0YSA9IGNmICYgQ0ZfRElTQ0FSRF9NWV9EQVRBOwogCi0JaWYgKHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gODcpIHsKKwlpZiAoY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDg3KSB7CiAJCWludCBlcnI7CiAKIAkJaWYgKHBpLT5zaXplID4gc2l6ZW9mKGludGVncml0eV9hbGcpKQogCQkJcmV0dXJuIC1FSU87Ci0JCWVyciA9IGRyYmRfcmVjdl9hbGwodGNvbm4sIGludGVncml0eV9hbGcsIHBpLT5zaXplKTsKKwkJZXJyID0gZHJiZF9yZWN2X2FsbChjb25uZWN0aW9uLCBpbnRlZ3JpdHlfYWxnLCBwaS0+c2l6ZSk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCQlpbnRlZ3JpdHlfYWxnW1NIQVJFRF9TRUNSRVRfTUFYIC0gMV0gPSAwOwogCX0KIAogCWlmIChwaS0+Y21kICE9IFBfUFJPVE9DT0xfVVBEQVRFKSB7Ci0JCWNsZWFyX2JpdChDT05OX0RSWV9SVU4sICZ0Y29ubi0+ZmxhZ3MpOworCQljbGVhcl9iaXQoQ09OTl9EUllfUlVOLCAmY29ubmVjdGlvbi0+ZmxhZ3MpOwogCiAJCWlmIChjZiAmIENGX0RSWV9SVU4pCi0JCQlzZXRfYml0KENPTk5fRFJZX1JVTiwgJnRjb25uLT5mbGFncyk7CisJCQlzZXRfYml0KENPTk5fRFJZX1JVTiwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCW5jID0gcmN1X2RlcmVmZXJlbmNlKHRjb25uLT5uZXRfY29uZik7CisJCW5jID0gcmN1X2RlcmVmZXJlbmNlKGNvbm5lY3Rpb24tPm5ldF9jb25mKTsKIAogCQlpZiAocF9wcm90byAhPSBuYy0+d2lyZV9wcm90b2NvbCkgewotCQkJY29ubl9lcnIodGNvbm4sICJpbmNvbXBhdGlibGUgJXMgc2V0dGluZ3NcbiIsICJwcm90b2NvbCIpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgInByb3RvY29sIik7CiAJCQlnb3RvIGRpc2Nvbm5lY3RfcmN1X3VubG9jazsKIAkJfQogCiAJCWlmIChjb252ZXJ0X2FmdGVyX3NiKHBfYWZ0ZXJfc2JfMHApICE9IG5jLT5hZnRlcl9zYl8wcCkgewotCQkJY29ubl9lcnIodGNvbm4sICJpbmNvbXBhdGlibGUgJXMgc2V0dGluZ3NcbiIsICJhZnRlci1zYi0wcHJpIik7CisJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiaW5jb21wYXRpYmxlICVzIHNldHRpbmdzXG4iLCAiYWZ0ZXItc2ItMHByaSIpOwogCQkJZ290byBkaXNjb25uZWN0X3JjdV91bmxvY2s7CiAJCX0KIAogCQlpZiAoY29udmVydF9hZnRlcl9zYihwX2FmdGVyX3NiXzFwKSAhPSBuYy0+YWZ0ZXJfc2JfMXApIHsKLQkJCWNvbm5fZXJyKHRjb25uLCAiaW5jb21wYXRpYmxlICVzIHNldHRpbmdzXG4iLCAiYWZ0ZXItc2ItMXByaSIpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImFmdGVyLXNiLTFwcmkiKTsKIAkJCWdvdG8gZGlzY29ubmVjdF9yY3VfdW5sb2NrOwogCQl9CiAKIAkJaWYgKGNvbnZlcnRfYWZ0ZXJfc2IocF9hZnRlcl9zYl8ycCkgIT0gbmMtPmFmdGVyX3NiXzJwKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImFmdGVyLXNiLTJwcmkiKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJpbmNvbXBhdGlibGUgJXMgc2V0dGluZ3NcbiIsICJhZnRlci1zYi0ycHJpIik7CiAJCQlnb3RvIGRpc2Nvbm5lY3RfcmN1X3VubG9jazsKIAkJfQogCiAJCWlmIChwX2Rpc2NhcmRfbXlfZGF0YSAmJiBuYy0+ZGlzY2FyZF9teV9kYXRhKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImRpc2NhcmQtbXktZGF0YSIpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImRpc2NhcmQtbXktZGF0YSIpOwogCQkJZ290byBkaXNjb25uZWN0X3JjdV91bmxvY2s7CiAJCX0KIAogCQlpZiAocF90d29fcHJpbWFyaWVzICE9IG5jLT50d29fcHJpbWFyaWVzKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImFsbG93LXR3by1wcmltYXJpZXMiKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJpbmNvbXBhdGlibGUgJXMgc2V0dGluZ3NcbiIsICJhbGxvdy10d28tcHJpbWFyaWVzIik7CiAJCQlnb3RvIGRpc2Nvbm5lY3RfcmN1X3VubG9jazsKIAkJfQogCiAJCWlmIChzdHJjbXAoaW50ZWdyaXR5X2FsZywgbmMtPmludGVncml0eV9hbGcpKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImRhdGEtaW50ZWdyaXR5LWFsZyIpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImRhdGEtaW50ZWdyaXR5LWFsZyIpOwogCQkJZ290byBkaXNjb25uZWN0X3JjdV91bmxvY2s7CiAJCX0KIApAQCAtMzE5Miw3ICszMjM2LDcgQEAKIAogCQlwZWVyX2ludGVncml0eV90Zm0gPSBjcnlwdG9fYWxsb2NfaGFzaChpbnRlZ3JpdHlfYWxnLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKIAkJaWYgKCFwZWVyX2ludGVncml0eV90Zm0pIHsKLQkJCWNvbm5fZXJyKHRjb25uLCAicGVlciBkYXRhLWludGVncml0eS1hbGcgJXMgbm90IHN1cHBvcnRlZFxuIiwKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJwZWVyIGRhdGEtaW50ZWdyaXR5LWFsZyAlcyBub3Qgc3VwcG9ydGVkXG4iLAogCQkJCSBpbnRlZ3JpdHlfYWxnKTsKIAkJCWdvdG8gZGlzY29ubmVjdDsKIAkJfQpAQCAtMzIwMSwyMCArMzI0NSwyMCBAQAogCQlpbnRfZGlnX2luID0ga21hbGxvYyhoYXNoX3NpemUsIEdGUF9LRVJORUwpOwogCQlpbnRfZGlnX3Z2ID0ga21hbGxvYyhoYXNoX3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIShpbnRfZGlnX2luICYmIGludF9kaWdfdnYpKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgIkFsbG9jYXRpb24gb2YgYnVmZmVycyBmb3IgZGF0YSBpbnRlZ3JpdHkgY2hlY2tpbmcgZmFpbGVkXG4iKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJBbGxvY2F0aW9uIG9mIGJ1ZmZlcnMgZm9yIGRhdGEgaW50ZWdyaXR5IGNoZWNraW5nIGZhaWxlZFxuIik7CiAJCQlnb3RvIGRpc2Nvbm5lY3Q7CiAJCX0KIAl9CiAKIAluZXdfbmV0X2NvbmYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0X2NvbmYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ld19uZXRfY29uZikgewotCQljb25uX2Vycih0Y29ubiwgIkFsbG9jYXRpb24gb2YgbmV3IG5ldF9jb25mIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJBbGxvY2F0aW9uIG9mIG5ldyBuZXRfY29uZiBmYWlsZWRcbiIpOwogCQlnb3RvIGRpc2Nvbm5lY3Q7CiAJfQogCi0JbXV0ZXhfbG9jaygmdGNvbm4tPmRhdGEubXV0ZXgpOwotCW11dGV4X2xvY2soJnRjb25uLT5jb25mX3VwZGF0ZSk7Ci0Jb2xkX25ldF9jb25mID0gdGNvbm4tPm5ldF9jb25mOworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPmRhdGEubXV0ZXgpOworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CisJb2xkX25ldF9jb25mID0gY29ubmVjdGlvbi0+bmV0X2NvbmY7CiAJKm5ld19uZXRfY29uZiA9ICpvbGRfbmV0X2NvbmY7CiAKIAluZXdfbmV0X2NvbmYtPndpcmVfcHJvdG9jb2wgPSBwX3Byb3RvOwpAQCAtMzIyMywxOSArMzI2NywxOSBAQAogCW5ld19uZXRfY29uZi0+YWZ0ZXJfc2JfMnAgPSBjb252ZXJ0X2FmdGVyX3NiKHBfYWZ0ZXJfc2JfMnApOwogCW5ld19uZXRfY29uZi0+dHdvX3ByaW1hcmllcyA9IHBfdHdvX3ByaW1hcmllczsKIAotCXJjdV9hc3NpZ25fcG9pbnRlcih0Y29ubi0+bmV0X2NvbmYsIG5ld19uZXRfY29uZik7Ci0JbXV0ZXhfdW5sb2NrKCZ0Y29ubi0+Y29uZl91cGRhdGUpOwotCW11dGV4X3VubG9jaygmdGNvbm4tPmRhdGEubXV0ZXgpOworCXJjdV9hc3NpZ25fcG9pbnRlcihjb25uZWN0aW9uLT5uZXRfY29uZiwgbmV3X25ldF9jb25mKTsKKwltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CisJbXV0ZXhfdW5sb2NrKCZjb25uZWN0aW9uLT5kYXRhLm11dGV4KTsKIAotCWNyeXB0b19mcmVlX2hhc2godGNvbm4tPnBlZXJfaW50ZWdyaXR5X3RmbSk7Ci0Ja2ZyZWUodGNvbm4tPmludF9kaWdfaW4pOwotCWtmcmVlKHRjb25uLT5pbnRfZGlnX3Z2KTsKLQl0Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtID0gcGVlcl9pbnRlZ3JpdHlfdGZtOwotCXRjb25uLT5pbnRfZGlnX2luID0gaW50X2RpZ19pbjsKLQl0Y29ubi0+aW50X2RpZ192diA9IGludF9kaWdfdnY7CisJY3J5cHRvX2ZyZWVfaGFzaChjb25uZWN0aW9uLT5wZWVyX2ludGVncml0eV90Zm0pOworCWtmcmVlKGNvbm5lY3Rpb24tPmludF9kaWdfaW4pOworCWtmcmVlKGNvbm5lY3Rpb24tPmludF9kaWdfdnYpOworCWNvbm5lY3Rpb24tPnBlZXJfaW50ZWdyaXR5X3RmbSA9IHBlZXJfaW50ZWdyaXR5X3RmbTsKKwljb25uZWN0aW9uLT5pbnRfZGlnX2luID0gaW50X2RpZ19pbjsKKwljb25uZWN0aW9uLT5pbnRfZGlnX3Z2ID0gaW50X2RpZ192djsKIAogCWlmIChzdHJjbXAob2xkX25ldF9jb25mLT5pbnRlZ3JpdHlfYWxnLCBpbnRlZ3JpdHlfYWxnKSkKLQkJY29ubl9pbmZvKHRjb25uLCAicGVlciBkYXRhLWludGVncml0eS1hbGc6ICVzXG4iLAorCQlkcmJkX2luZm8oY29ubmVjdGlvbiwgInBlZXIgZGF0YS1pbnRlZ3JpdHktYWxnOiAlc1xuIiwKIAkJCSAgaW50ZWdyaXR5X2FsZ1swXSA/IGludGVncml0eV9hbGcgOiAiKG5vbmUpIik7CiAKIAlzeW5jaHJvbml6ZV9yY3UoKTsKQEAgLTMyNDgsNyArMzI5Miw3IEBACiAJY3J5cHRvX2ZyZWVfaGFzaChwZWVyX2ludGVncml0eV90Zm0pOwogCWtmcmVlKGludF9kaWdfaW4pOwogCWtmcmVlKGludF9kaWdfdnYpOwotCWNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CisJY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOwogCXJldHVybiAtRUlPOwogfQogCkBAIC0zMjU3LDcgKzMzMDEsOCBAQAogICogcmV0dXJuOiBOVUxMIChhbGcgbmFtZSB3YXMgIiIpCiAgKiAgICAgICAgIEVSUl9QVFIoZXJyb3IpIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCiAgKiAgICAgICAgIG9yIHRoZSBjcnlwdG8gaGFzaCBwdHIsIGlmIGl0IHdvcmtlZCBvdXQgb2suICovCi1zdHJ1Y3QgY3J5cHRvX2hhc2ggKmRyYmRfY3J5cHRvX2FsbG9jX2RpZ2VzdF9zYWZlKGNvbnN0IHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMKK3N0cnVjdCBjcnlwdG9faGFzaCAqZHJiZF9jcnlwdG9fYWxsb2NfZGlnZXN0X3NhZmUoY29uc3Qgc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCWNvbnN0IGNoYXIgKmFsZywgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbTsKQEAgLTMyNjcsMjEgKzMzMTIsMjEgQEAKIAogCXRmbSA9IGNyeXB0b19hbGxvY19oYXNoKGFsZywgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CiAJaWYgKElTX0VSUih0Zm0pKSB7Ci0JCWRldl9lcnIoREVWLCAiQ2FuIG5vdCBhbGxvY2F0ZSBcIiVzXCIgYXMgJXMgKHJlYXNvbjogJWxkKVxuIiwKKwkJZHJiZF9lcnIoZGV2aWNlLCAiQ2FuIG5vdCBhbGxvY2F0ZSBcIiVzXCIgYXMgJXMgKHJlYXNvbjogJWxkKVxuIiwKIAkJCWFsZywgbmFtZSwgUFRSX0VSUih0Zm0pKTsKIAkJcmV0dXJuIHRmbTsKIAl9CiAJcmV0dXJuIHRmbTsKIH0KIAotc3RhdGljIGludCBpZ25vcmVfcmVtYWluaW5nX3BhY2tldChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IGlnbm9yZV9yZW1haW5pbmdfcGFja2V0KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7Ci0Jdm9pZCAqYnVmZmVyID0gdGNvbm4tPmRhdGEucmJ1ZjsKKwl2b2lkICpidWZmZXIgPSBjb25uZWN0aW9uLT5kYXRhLnJidWY7CiAJaW50IHNpemUgPSBwaS0+c2l6ZTsKIAogCXdoaWxlIChzaXplKSB7CiAJCWludCBzID0gbWluX3QoaW50LCBzaXplLCBEUkJEX1NPQ0tFVF9CVUZGRVJfU0laRSk7Ci0JCXMgPSBkcmJkX3JlY3YodGNvbm4sIGJ1ZmZlciwgcyk7CisJCXMgPSBkcmJkX3JlY3YoY29ubmVjdGlvbiwgYnVmZmVyLCBzKTsKIAkJaWYgKHMgPD0gMCkgewogCQkJaWYgKHMgPCAwKQogCQkJCXJldHVybiBzOwpAQCAtMzMwNSwzMCArMzM1MCwzMiBAQAogICoKICAqIChXZSBjYW4gYWxzbyBlbmQgdXAgaGVyZSBpZiBkcmJkIGlzIG1pc2NvbmZpZ3VyZWQuKQogICovCi1zdGF0aWMgaW50IGNvbmZpZ191bmtub3duX3ZvbHVtZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IGNvbmZpZ191bmtub3duX3ZvbHVtZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewotCWNvbm5fd2Fybih0Y29ubiwgIiVzIHBhY2tldCByZWNlaXZlZCBmb3Igdm9sdW1lICV1LCB3aGljaCBpcyBub3QgY29uZmlndXJlZCBsb2NhbGx5XG4iLAorCWRyYmRfd2Fybihjb25uZWN0aW9uLCAiJXMgcGFja2V0IHJlY2VpdmVkIGZvciB2b2x1bWUgJXUsIHdoaWNoIGlzIG5vdCBjb25maWd1cmVkIGxvY2FsbHlcbiIsCiAJCSAgY21kbmFtZShwaS0+Y21kKSwgcGktPnZucik7Ci0JcmV0dXJuIGlnbm9yZV9yZW1haW5pbmdfcGFja2V0KHRjb25uLCBwaSk7CisJcmV0dXJuIGlnbm9yZV9yZW1haW5pbmdfcGFja2V0KGNvbm5lY3Rpb24sIHBpKTsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX1N5bmNQYXJhbShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IHJlY2VpdmVfU3luY1BhcmFtKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IHBfcnNfcGFyYW1fOTUgKnA7CiAJdW5zaWduZWQgaW50IGhlYWRlcl9zaXplLCBkYXRhX3NpemUsIGV4cF9tYXhfc3o7CiAJc3RydWN0IGNyeXB0b19oYXNoICp2ZXJpZnlfdGZtID0gTlVMTDsKIAlzdHJ1Y3QgY3J5cHRvX2hhc2ggKmNzdW1zX3RmbSA9IE5VTEw7CiAJc3RydWN0IG5ldF9jb25mICpvbGRfbmV0X2NvbmYsICpuZXdfbmV0X2NvbmYgPSBOVUxMOwogCXN0cnVjdCBkaXNrX2NvbmYgKm9sZF9kaXNrX2NvbmYgPSBOVUxMLCAqbmV3X2Rpc2tfY29uZiA9IE5VTEw7Ci0JY29uc3QgaW50IGFwdiA9IHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb247CisJY29uc3QgaW50IGFwdiA9IGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbjsKIAlzdHJ1Y3QgZmlmb19idWZmZXIgKm9sZF9wbGFuID0gTlVMTCwgKm5ld19wbGFuID0gTlVMTDsKIAlpbnQgZmlmb19zaXplID0gMDsKIAlpbnQgZXJyOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCi0JCXJldHVybiBjb25maWdfdW5rbm93bl92b2x1bWUodGNvbm4sIHBpKTsKKwlwZWVyX2RldmljZSA9IGNvbm5fcGVlcl9kZXZpY2UoY29ubmVjdGlvbiwgcGktPnZucik7CisJaWYgKCFwZWVyX2RldmljZSkKKwkJcmV0dXJuIGNvbmZpZ191bmtub3duX3ZvbHVtZShjb25uZWN0aW9uLCBwaSk7CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAogCWV4cF9tYXhfc3ogID0gYXB2IDw9IDg3ID8gc2l6ZW9mKHN0cnVjdCBwX3JzX3BhcmFtKQogCQkgICAgOiBhcHYgPT0gODggPyBzaXplb2Yoc3RydWN0IHBfcnNfcGFyYW0pCkBAIC0zMzM3LDcgKzMzODQsNyBAQAogCQkgICAgOiAvKiBhcHYgPj0gOTUgKi8gc2l6ZW9mKHN0cnVjdCBwX3JzX3BhcmFtXzk1KTsKIAogCWlmIChwaS0+c2l6ZSA+IGV4cF9tYXhfc3opIHsKLQkJZGV2X2VycihERVYsICJTeW5jUGFyYW0gcGFja2V0IHRvbyBsb25nOiByZWNlaXZlZCAldSwgZXhwZWN0ZWQgPD0gJXUgYnl0ZXNcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgIlN5bmNQYXJhbSBwYWNrZXQgdG9vIGxvbmc6IHJlY2VpdmVkICV1LCBleHBlY3RlZCA8PSAldSBieXRlc1xuIiwKIAkJICAgIHBpLT5zaXplLCBleHBfbWF4X3N6KTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMzM0OCwzMyArMzM5NSwzMyBAQAogCX0gZWxzZSBpZiAoYXB2IDw9IDk0KSB7CiAJCWhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBwX3JzX3BhcmFtXzg5KTsKIAkJZGF0YV9zaXplID0gcGktPnNpemUgLSBoZWFkZXJfc2l6ZTsKLQkJRF9BU1NFUlQoZGF0YV9zaXplID09IDApOworCQlEX0FTU0VSVChkZXZpY2UsIGRhdGFfc2l6ZSA9PSAwKTsKIAl9IGVsc2UgewogCQloZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcF9yc19wYXJhbV85NSk7CiAJCWRhdGFfc2l6ZSA9IHBpLT5zaXplIC0gaGVhZGVyX3NpemU7Ci0JCURfQVNTRVJUKGRhdGFfc2l6ZSA9PSAwKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCBkYXRhX3NpemUgPT0gMCk7CiAJfQogCiAJLyogaW5pdGlhbGl6ZSB2ZXJpZnlfYWxnIGFuZCBjc3Vtc19hbGcgKi8KIAlwID0gcGktPmRhdGE7CiAJbWVtc2V0KHAtPnZlcmlmeV9hbGcsIDAsIDIgKiBTSEFSRURfU0VDUkVUX01BWCk7CiAKLQllcnIgPSBkcmJkX3JlY3ZfYWxsKG1kZXYtPnRjb25uLCBwLCBoZWFkZXJfc2l6ZSk7CisJZXJyID0gZHJiZF9yZWN2X2FsbChwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgcCwgaGVhZGVyX3NpemUpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQltdXRleF9sb2NrKCZtZGV2LT50Y29ubi0+Y29uZl91cGRhdGUpOwotCW9sZF9uZXRfY29uZiA9IG1kZXYtPnRjb25uLT5uZXRfY29uZjsKLQlpZiAoZ2V0X2xkZXYobWRldikpIHsKKwltdXRleF9sb2NrKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOworCW9sZF9uZXRfY29uZiA9IHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5uZXRfY29uZjsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgewogCQluZXdfZGlza19jb25mID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRpc2tfY29uZiksIEdGUF9LRVJORUwpOwogCQlpZiAoIW5ld19kaXNrX2NvbmYpIHsKLQkJCXB1dF9sZGV2KG1kZXYpOwotCQkJbXV0ZXhfdW5sb2NrKCZtZGV2LT50Y29ubi0+Y29uZl91cGRhdGUpOwotCQkJZGV2X2VycihERVYsICJBbGxvY2F0aW9uIG9mIG5ldyBkaXNrX2NvbmYgZmFpbGVkXG4iKTsKKwkJCXB1dF9sZGV2KGRldmljZSk7CisJCQltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CisJCQlkcmJkX2VycihkZXZpY2UsICJBbGxvY2F0aW9uIG9mIG5ldyBkaXNrX2NvbmYgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKLQkJb2xkX2Rpc2tfY29uZiA9IG1kZXYtPmxkZXYtPmRpc2tfY29uZjsKKwkJb2xkX2Rpc2tfY29uZiA9IGRldmljZS0+bGRldi0+ZGlza19jb25mOwogCQkqbmV3X2Rpc2tfY29uZiA9ICpvbGRfZGlza19jb25mOwogCiAJCW5ld19kaXNrX2NvbmYtPnJlc3luY19yYXRlID0gYmUzMl90b19jcHUocC0+cmVzeW5jX3JhdGUpOwpAQCAtMzM4MywzNyArMzQzMCwzNyBAQAogCWlmIChhcHYgPj0gODgpIHsKIAkJaWYgKGFwdiA9PSA4OCkgewogCQkJaWYgKGRhdGFfc2l6ZSA+IFNIQVJFRF9TRUNSRVRfTUFYIHx8IGRhdGFfc2l6ZSA9PSAwKSB7Ci0JCQkJZGV2X2VycihERVYsICJ2ZXJpZnktYWxnIG9mIHdyb25nIHNpemUsICIKKwkJCQlkcmJkX2VycihkZXZpY2UsICJ2ZXJpZnktYWxnIG9mIHdyb25nIHNpemUsICIKIAkJCQkJInBlZXIgd2FudHMgJXUsIGFjY2VwdGluZyBvbmx5IHVwIHRvICV1IGJ5dGVcbiIsCiAJCQkJCWRhdGFfc2l6ZSwgU0hBUkVEX1NFQ1JFVF9NQVgpOwogCQkJCWVyciA9IC1FSU87CiAJCQkJZ290byByZWNvbm5lY3Q7CiAJCQl9CiAKLQkJCWVyciA9IGRyYmRfcmVjdl9hbGwobWRldi0+dGNvbm4sIHAtPnZlcmlmeV9hbGcsIGRhdGFfc2l6ZSk7CisJCQllcnIgPSBkcmJkX3JlY3ZfYWxsKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBwLT52ZXJpZnlfYWxnLCBkYXRhX3NpemUpOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIHJlY29ubmVjdDsKIAkJCS8qIHdlIGV4cGVjdCBOVUwgdGVybWluYXRlZCBzdHJpbmcgKi8KIAkJCS8qIGJ1dCBqdXN0IGluIGNhc2Ugc29tZW9uZSB0cmllcyB0byBiZSBldmlsICovCi0JCQlEX0FTU0VSVChwLT52ZXJpZnlfYWxnW2RhdGFfc2l6ZS0xXSA9PSAwKTsKKwkJCURfQVNTRVJUKGRldmljZSwgcC0+dmVyaWZ5X2FsZ1tkYXRhX3NpemUtMV0gPT0gMCk7CiAJCQlwLT52ZXJpZnlfYWxnW2RhdGFfc2l6ZS0xXSA9IDA7CiAKIAkJfSBlbHNlIC8qIGFwdiA+PSA4OSAqLyB7CiAJCQkvKiB3ZSBzdGlsbCBleHBlY3QgTlVMIHRlcm1pbmF0ZWQgc3RyaW5ncyAqLwogCQkJLyogYnV0IGp1c3QgaW4gY2FzZSBzb21lb25lIHRyaWVzIHRvIGJlIGV2aWwgKi8KLQkJCURfQVNTRVJUKHAtPnZlcmlmeV9hbGdbU0hBUkVEX1NFQ1JFVF9NQVgtMV0gPT0gMCk7Ci0JCQlEX0FTU0VSVChwLT5jc3Vtc19hbGdbU0hBUkVEX1NFQ1JFVF9NQVgtMV0gPT0gMCk7CisJCQlEX0FTU0VSVChkZXZpY2UsIHAtPnZlcmlmeV9hbGdbU0hBUkVEX1NFQ1JFVF9NQVgtMV0gPT0gMCk7CisJCQlEX0FTU0VSVChkZXZpY2UsIHAtPmNzdW1zX2FsZ1tTSEFSRURfU0VDUkVUX01BWC0xXSA9PSAwKTsKIAkJCXAtPnZlcmlmeV9hbGdbU0hBUkVEX1NFQ1JFVF9NQVgtMV0gPSAwOwogCQkJcC0+Y3N1bXNfYWxnW1NIQVJFRF9TRUNSRVRfTUFYLTFdID0gMDsKIAkJfQogCiAJCWlmIChzdHJjbXAob2xkX25ldF9jb25mLT52ZXJpZnlfYWxnLCBwLT52ZXJpZnlfYWxnKSkgewotCQkJaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19XRl9SRVBPUlRfUEFSQU1TKSB7Ci0JCQkJZGV2X2VycihERVYsICJEaWZmZXJlbnQgdmVyaWZ5LWFsZyBzZXR0aW5ncy4gbWU9XCIlc1wiIHBlZXI9XCIlc1wiXG4iLAorCQkJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKKwkJCQlkcmJkX2VycihkZXZpY2UsICJEaWZmZXJlbnQgdmVyaWZ5LWFsZyBzZXR0aW5ncy4gbWU9XCIlc1wiIHBlZXI9XCIlc1wiXG4iLAogCQkJCSAgICBvbGRfbmV0X2NvbmYtPnZlcmlmeV9hbGcsIHAtPnZlcmlmeV9hbGcpOwogCQkJCWdvdG8gZGlzY29ubmVjdDsKIAkJCX0KLQkJCXZlcmlmeV90Zm0gPSBkcmJkX2NyeXB0b19hbGxvY19kaWdlc3Rfc2FmZShtZGV2LAorCQkJdmVyaWZ5X3RmbSA9IGRyYmRfY3J5cHRvX2FsbG9jX2RpZ2VzdF9zYWZlKGRldmljZSwKIAkJCQkJcC0+dmVyaWZ5X2FsZywgInZlcmlmeS1hbGciKTsKIAkJCWlmIChJU19FUlIodmVyaWZ5X3RmbSkpIHsKIAkJCQl2ZXJpZnlfdGZtID0gTlVMTDsKQEAgLTM0MjIsMTIgKzM0NjksMTIgQEAKIAkJfQogCiAJCWlmIChhcHYgPj0gODkgJiYgc3RyY21wKG9sZF9uZXRfY29uZi0+Y3N1bXNfYWxnLCBwLT5jc3Vtc19hbGcpKSB7Ci0JCQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKLQkJCQlkZXZfZXJyKERFViwgIkRpZmZlcmVudCBjc3Vtcy1hbGcgc2V0dGluZ3MuIG1lPVwiJXNcIiBwZWVyPVwiJXNcIlxuIiwKKwkJCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19XRl9SRVBPUlRfUEFSQU1TKSB7CisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiRGlmZmVyZW50IGNzdW1zLWFsZyBzZXR0aW5ncy4gbWU9XCIlc1wiIHBlZXI9XCIlc1wiXG4iLAogCQkJCSAgICBvbGRfbmV0X2NvbmYtPmNzdW1zX2FsZywgcC0+Y3N1bXNfYWxnKTsKIAkJCQlnb3RvIGRpc2Nvbm5lY3Q7CiAJCQl9Ci0JCQljc3Vtc190Zm0gPSBkcmJkX2NyeXB0b19hbGxvY19kaWdlc3Rfc2FmZShtZGV2LAorCQkJY3N1bXNfdGZtID0gZHJiZF9jcnlwdG9fYWxsb2NfZGlnZXN0X3NhZmUoZGV2aWNlLAogCQkJCQlwLT5jc3Vtc19hbGcsICJjc3Vtcy1hbGciKTsKIAkJCWlmIChJU19FUlIoY3N1bXNfdGZtKSkgewogCQkJCWNzdW1zX3RmbSA9IE5VTEw7CkBAIC0zNDQyLDExICszNDg5LDExIEBACiAJCQluZXdfZGlza19jb25mLT5jX21heF9yYXRlID0gYmUzMl90b19jcHUocC0+Y19tYXhfcmF0ZSk7CiAKIAkJCWZpZm9fc2l6ZSA9IChuZXdfZGlza19jb25mLT5jX3BsYW5fYWhlYWQgKiAxMCAqIFNMRUVQX1RJTUUpIC8gSFo7Ci0JCQlpZiAoZmlmb19zaXplICE9IG1kZXYtPnJzX3BsYW5fcy0+c2l6ZSkgeworCQkJaWYgKGZpZm9fc2l6ZSAhPSBkZXZpY2UtPnJzX3BsYW5fcy0+c2l6ZSkgewogCQkJCW5ld19wbGFuID0gZmlmb19hbGxvYyhmaWZvX3NpemUpOwogCQkJCWlmICghbmV3X3BsYW4pIHsKLQkJCQkJZGV2X2VycihERVYsICJrbWFsbG9jIG9mIGZpZm9fYnVmZmVyIGZhaWxlZCIpOwotCQkJCQlwdXRfbGRldihtZGV2KTsKKwkJCQkJZHJiZF9lcnIoZGV2aWNlLCAia21hbGxvYyBvZiBmaWZvX2J1ZmZlciBmYWlsZWQiKTsKKwkJCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJCQkJZ290byBkaXNjb25uZWN0OwogCQkJCX0KIAkJCX0KQEAgLTM0NTUsNyArMzUwMiw3IEBACiAJCWlmICh2ZXJpZnlfdGZtIHx8IGNzdW1zX3RmbSkgewogCQkJbmV3X25ldF9jb25mID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5ldF9jb25mKSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIW5ld19uZXRfY29uZikgewotCQkJCWRldl9lcnIoREVWLCAiQWxsb2NhdGlvbiBvZiBuZXcgbmV0X2NvbmYgZmFpbGVkXG4iKTsKKwkJCQlkcmJkX2VycihkZXZpY2UsICJBbGxvY2F0aW9uIG9mIG5ldyBuZXRfY29uZiBmYWlsZWRcbiIpOwogCQkJCWdvdG8gZGlzY29ubmVjdDsKIAkJCX0KIApAQCAtMzQ2NCwzMiArMzUxMSwzMiBAQAogCQkJaWYgKHZlcmlmeV90Zm0pIHsKIAkJCQlzdHJjcHkobmV3X25ldF9jb25mLT52ZXJpZnlfYWxnLCBwLT52ZXJpZnlfYWxnKTsKIAkJCQluZXdfbmV0X2NvbmYtPnZlcmlmeV9hbGdfbGVuID0gc3RybGVuKHAtPnZlcmlmeV9hbGcpICsgMTsKLQkJCQljcnlwdG9fZnJlZV9oYXNoKG1kZXYtPnRjb25uLT52ZXJpZnlfdGZtKTsKLQkJCQltZGV2LT50Y29ubi0+dmVyaWZ5X3RmbSA9IHZlcmlmeV90Zm07Ci0JCQkJZGV2X2luZm8oREVWLCAidXNpbmcgdmVyaWZ5LWFsZzogXCIlc1wiXG4iLCBwLT52ZXJpZnlfYWxnKTsKKwkJCQljcnlwdG9fZnJlZV9oYXNoKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT52ZXJpZnlfdGZtKTsKKwkJCQlwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+dmVyaWZ5X3RmbSA9IHZlcmlmeV90Zm07CisJCQkJZHJiZF9pbmZvKGRldmljZSwgInVzaW5nIHZlcmlmeS1hbGc6IFwiJXNcIlxuIiwgcC0+dmVyaWZ5X2FsZyk7CiAJCQl9CiAJCQlpZiAoY3N1bXNfdGZtKSB7CiAJCQkJc3RyY3B5KG5ld19uZXRfY29uZi0+Y3N1bXNfYWxnLCBwLT5jc3Vtc19hbGcpOwogCQkJCW5ld19uZXRfY29uZi0+Y3N1bXNfYWxnX2xlbiA9IHN0cmxlbihwLT5jc3Vtc19hbGcpICsgMTsKLQkJCQljcnlwdG9fZnJlZV9oYXNoKG1kZXYtPnRjb25uLT5jc3Vtc190Zm0pOwotCQkJCW1kZXYtPnRjb25uLT5jc3Vtc190Zm0gPSBjc3Vtc190Zm07Ci0JCQkJZGV2X2luZm8oREVWLCAidXNpbmcgY3N1bXMtYWxnOiBcIiVzXCJcbiIsIHAtPmNzdW1zX2FsZyk7CisJCQkJY3J5cHRvX2ZyZWVfaGFzaChwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+Y3N1bXNfdGZtKTsKKwkJCQlwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+Y3N1bXNfdGZtID0gY3N1bXNfdGZtOworCQkJCWRyYmRfaW5mbyhkZXZpY2UsICJ1c2luZyBjc3Vtcy1hbGc6IFwiJXNcIlxuIiwgcC0+Y3N1bXNfYWxnKTsKIAkJCX0KLQkJCXJjdV9hc3NpZ25fcG9pbnRlcih0Y29ubi0+bmV0X2NvbmYsIG5ld19uZXRfY29uZik7CisJCQlyY3VfYXNzaWduX3BvaW50ZXIoY29ubmVjdGlvbi0+bmV0X2NvbmYsIG5ld19uZXRfY29uZik7CiAJCX0KIAl9CiAKIAlpZiAobmV3X2Rpc2tfY29uZikgewotCQlyY3VfYXNzaWduX3BvaW50ZXIobWRldi0+bGRldi0+ZGlza19jb25mLCBuZXdfZGlza19jb25mKTsKLQkJcHV0X2xkZXYobWRldik7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiwgbmV3X2Rpc2tfY29uZik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJaWYgKG5ld19wbGFuKSB7Ci0JCW9sZF9wbGFuID0gbWRldi0+cnNfcGxhbl9zOwotCQlyY3VfYXNzaWduX3BvaW50ZXIobWRldi0+cnNfcGxhbl9zLCBuZXdfcGxhbik7CisJCW9sZF9wbGFuID0gZGV2aWNlLT5yc19wbGFuX3M7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihkZXZpY2UtPnJzX3BsYW5fcywgbmV3X3BsYW4pOwogCX0KIAotCW11dGV4X3VubG9jaygmbWRldi0+dGNvbm4tPmNvbmZfdXBkYXRlKTsKKwltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CiAJc3luY2hyb25pemVfcmN1KCk7CiAJaWYgKG5ld19uZXRfY29uZikKIAkJa2ZyZWUob2xkX25ldF9jb25mKTsKQEAgLTM1MDAsMzAgKzM1NDcsMzAgQEAKIAogcmVjb25uZWN0OgogCWlmIChuZXdfZGlza19jb25mKSB7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCQlrZnJlZShuZXdfZGlza19jb25mKTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZtZGV2LT50Y29ubi0+Y29uZl91cGRhdGUpOworCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+cmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKIAlyZXR1cm4gLUVJTzsKIAogZGlzY29ubmVjdDoKIAlrZnJlZShuZXdfcGxhbik7CiAJaWYgKG5ld19kaXNrX2NvbmYpIHsKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJCWtmcmVlKG5ld19kaXNrX2NvbmYpOwogCX0KLQltdXRleF91bmxvY2soJm1kZXYtPnRjb25uLT5jb25mX3VwZGF0ZSk7CisJbXV0ZXhfdW5sb2NrKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOwogCS8qIGp1c3QgZm9yIGNvbXBsZXRlbmVzczogYWN0dWFsbHkgbm90IG5lZWRlZCwKIAkgKiBhcyB0aGlzIGlzIG5vdCByZWFjaGVkIGlmIGNzdW1zX3RmbSB3YXMgb2suICovCiAJY3J5cHRvX2ZyZWVfaGFzaChjc3Vtc190Zm0pOwogCS8qIGJ1dCBmcmVlIHRoZSB2ZXJpZnlfdGZtIGFnYWluLCBpZiBjc3Vtc190Zm0gZGlkIG5vdCB3b3JrIG91dCAqLwogCWNyeXB0b19mcmVlX2hhc2godmVyaWZ5X3RmbSk7Ci0JY29ubl9yZXF1ZXN0X3N0YXRlKG1kZXYtPnRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKKwljb25uX3JlcXVlc3Rfc3RhdGUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOwogCXJldHVybiAtRUlPOwogfQogCiAvKiB3YXJuIGlmIHRoZSBhcmd1bWVudHMgZGlmZmVyIGJ5IG1vcmUgdGhhbiAxMi41JSAqLwotc3RhdGljIHZvaWQgd2Fybl9pZl9kaWZmZXJfY29uc2lkZXJhYmx5KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgdm9pZCB3YXJuX2lmX2RpZmZlcl9jb25zaWRlcmFibHkoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJY29uc3QgY2hhciAqcywgc2VjdG9yX3QgYSwgc2VjdG9yX3QgYikKIHsKIAlzZWN0b3JfdCBkOwpAQCAtMzUzMSw1NCArMzU3OCw1NiBAQAogCQlyZXR1cm47CiAJZCA9IChhID4gYikgPyAoYSAtIGIpIDogKGIgLSBhKTsKIAlpZiAoZCA+IChhPj4zKSB8fCBkID4gKGI+PjMpKQotCQlkZXZfd2FybihERVYsICJDb25zaWRlcmFibGUgZGlmZmVyZW5jZSBpbiAlczogJWxsdXMgdnMuICVsbHVzXG4iLCBzLAorCQlkcmJkX3dhcm4oZGV2aWNlLCAiQ29uc2lkZXJhYmxlIGRpZmZlcmVuY2UgaW4gJXM6ICVsbHVzIHZzLiAlbGx1c1xuIiwgcywKIAkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWEsICh1bnNpZ25lZCBsb25nIGxvbmcpYik7CiB9CiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9zaXplcyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IHJlY2VpdmVfc2l6ZXMoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9zaXplcyAqcCA9IHBpLT5kYXRhOwogCWVudW0gZGV0ZXJtaW5lX2Rldl9zaXplIGRkID0gRFNfVU5DSEFOR0VEOwogCXNlY3Rvcl90IHBfc2l6ZSwgcF91c2l6ZSwgbXlfdXNpemU7CiAJaW50IGxkc2MgPSAwOyAvKiBsb2NhbCBkaXNrIHNpemUgY2hhbmdlZCAqLwogCWVudW0gZGRzX2ZsYWdzIGRkc2Y7CiAKLQltZGV2ID0gdm5yX3RvX21kZXYodGNvbm4sIHBpLT52bnIpOwotCWlmICghbWRldikKLQkJcmV0dXJuIGNvbmZpZ191bmtub3duX3ZvbHVtZSh0Y29ubiwgcGkpOworCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQorCQlyZXR1cm4gY29uZmlnX3Vua25vd25fdm9sdW1lKGNvbm5lY3Rpb24sIHBpKTsKKwlkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCiAJcF9zaXplID0gYmU2NF90b19jcHUocC0+ZF9zaXplKTsKIAlwX3VzaXplID0gYmU2NF90b19jcHUocC0+dV9zaXplKTsKIAogCS8qIGp1c3Qgc3RvcmUgdGhlIHBlZXIncyBkaXNrIHNpemUgZm9yIG5vdy4KIAkgKiB3ZSBzdGlsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hldGhlciB3ZSBhY2NlcHQgdGhhdC4gKi8KLQltZGV2LT5wX3NpemUgPSBwX3NpemU7CisJZGV2aWNlLT5wX3NpemUgPSBwX3NpemU7CiAKLQlpZiAoZ2V0X2xkZXYobWRldikpIHsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgewogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCW15X3VzaXplID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZiktPmRpc2tfc2l6ZTsKKwkJbXlfdXNpemUgPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5kaXNrX3NpemU7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCi0JCXdhcm5faWZfZGlmZmVyX2NvbnNpZGVyYWJseShtZGV2LCAibG93ZXIgbGV2ZWwgZGV2aWNlIHNpemVzIiwKLQkJCSAgIHBfc2l6ZSwgZHJiZF9nZXRfbWF4X2NhcGFjaXR5KG1kZXYtPmxkZXYpKTsKLQkJd2Fybl9pZl9kaWZmZXJfY29uc2lkZXJhYmx5KG1kZXYsICJ1c2VyIHJlcXVlc3RlZCBzaXplIiwKKwkJd2Fybl9pZl9kaWZmZXJfY29uc2lkZXJhYmx5KGRldmljZSwgImxvd2VyIGxldmVsIGRldmljZSBzaXplcyIsCisJCQkgICBwX3NpemUsIGRyYmRfZ2V0X21heF9jYXBhY2l0eShkZXZpY2UtPmxkZXYpKTsKKwkJd2Fybl9pZl9kaWZmZXJfY29uc2lkZXJhYmx5KGRldmljZSwgInVzZXIgcmVxdWVzdGVkIHNpemUiLAogCQkJCQkgICAgcF91c2l6ZSwgbXlfdXNpemUpOwogCiAJCS8qIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNvbm5lY3QsIG9yIGFuIG90aGVyd2lzZSBleHBlY3RlZAogCQkgKiBwYXJhbSBleGNoYW5nZSwgY2hvb3NlIHRoZSBtaW5pbXVtICovCi0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfV0ZfUkVQT1JUX1BBUkFNUykKKwkJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpCiAJCQlwX3VzaXplID0gbWluX25vdF96ZXJvKG15X3VzaXplLCBwX3VzaXplKTsKIAogCQkvKiBOZXZlciBzaHJpbmsgYSBkZXZpY2Ugd2l0aCB1c2FibGUgZGF0YSBkdXJpbmcgY29ubmVjdC4KIAkJICAgQnV0IGFsbG93IG9ubGluZSBzaHJpbmtpbmcgaWYgd2UgYXJlIGNvbm5lY3RlZC4gKi8KLQkJaWYgKGRyYmRfbmV3X2Rldl9zaXplKG1kZXYsIG1kZXYtPmxkZXYsIHBfdXNpemUsIDApIDwKLQkJICAgIGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldikgJiYKLQkJICAgIG1kZXYtPnN0YXRlLmRpc2sgPj0gRF9PVVREQVRFRCAmJgotCQkgICAgbWRldi0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKSB7Ci0JCQlkZXZfZXJyKERFViwgIlRoZSBwZWVyJ3MgZGlzayBzaXplIGlzIHRvbyBzbWFsbCFcbiIpOwotCQkJY29ubl9yZXF1ZXN0X3N0YXRlKG1kZXYtPnRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKLQkJCXB1dF9sZGV2KG1kZXYpOworCQlpZiAoZHJiZF9uZXdfZGV2X3NpemUoZGV2aWNlLCBkZXZpY2UtPmxkZXYsIHBfdXNpemUsIDApIDwKKwkJICAgIGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KSAmJgorCQkgICAgZGV2aWNlLT5zdGF0ZS5kaXNrID49IERfT1VUREFURUQgJiYKKwkJICAgIGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKSB7CisJCQlkcmJkX2VycihkZXZpY2UsICJUaGUgcGVlcidzIGRpc2sgc2l6ZSBpcyB0b28gc21hbGwhXG4iKTsKKwkJCWNvbm5fcmVxdWVzdF9zdGF0ZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CisJCQlwdXRfbGRldihkZXZpY2UpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIApAQCAtMzU4NywxNDUgKzM2MzYsMTQ3IEBACiAKIAkJCW5ld19kaXNrX2NvbmYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGlza19jb25mKSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIW5ld19kaXNrX2NvbmYpIHsKLQkJCQlkZXZfZXJyKERFViwgIkFsbG9jYXRpb24gb2YgbmV3IGRpc2tfY29uZiBmYWlsZWRcbiIpOwotCQkJCXB1dF9sZGV2KG1kZXYpOworCQkJCWRyYmRfZXJyKGRldmljZSwgIkFsbG9jYXRpb24gb2YgbmV3IGRpc2tfY29uZiBmYWlsZWRcbiIpOworCQkJCXB1dF9sZGV2KGRldmljZSk7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CiAKLQkJCW11dGV4X2xvY2soJm1kZXYtPnRjb25uLT5jb25mX3VwZGF0ZSk7Ci0JCQlvbGRfZGlza19jb25mID0gbWRldi0+bGRldi0+ZGlza19jb25mOworCQkJbXV0ZXhfbG9jaygmY29ubmVjdGlvbi0+cmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKKwkJCW9sZF9kaXNrX2NvbmYgPSBkZXZpY2UtPmxkZXYtPmRpc2tfY29uZjsKIAkJCSpuZXdfZGlza19jb25mID0gKm9sZF9kaXNrX2NvbmY7CiAJCQluZXdfZGlza19jb25mLT5kaXNrX3NpemUgPSBwX3VzaXplOwogCi0JCQlyY3VfYXNzaWduX3BvaW50ZXIobWRldi0+bGRldi0+ZGlza19jb25mLCBuZXdfZGlza19jb25mKTsKLQkJCW11dGV4X3VubG9jaygmbWRldi0+dGNvbm4tPmNvbmZfdXBkYXRlKTsKKwkJCXJjdV9hc3NpZ25fcG9pbnRlcihkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiwgbmV3X2Rpc2tfY29uZik7CisJCQltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CiAJCQlzeW5jaHJvbml6ZV9yY3UoKTsKIAkJCWtmcmVlKG9sZF9kaXNrX2NvbmYpOwogCi0JCQlkZXZfaW5mbyhERVYsICJQZWVyIHNldHMgdV9zaXplIHRvICVsdSBzZWN0b3JzXG4iLAorCQkJZHJiZF9pbmZvKGRldmljZSwgIlBlZXIgc2V0cyB1X3NpemUgdG8gJWx1IHNlY3RvcnNcbiIsCiAJCQkJICh1bnNpZ25lZCBsb25nKW15X3VzaXplKTsKIAkJfQogCi0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAogCWRkc2YgPSBiZTE2X3RvX2NwdShwLT5kZHNfZmxhZ3MpOwotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQlkZCA9IGRyYmRfZGV0ZXJtaW5lX2Rldl9zaXplKG1kZXYsIGRkc2YsIE5VTEwpOwotCQlwdXRfbGRldihtZGV2KTsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlkZCA9IGRyYmRfZGV0ZXJtaW5lX2Rldl9zaXplKGRldmljZSwgZGRzZiwgTlVMTCk7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJCWlmIChkZCA9PSBEU19FUlJPUikKIAkJCXJldHVybiAtRUlPOwotCQlkcmJkX21kX3N5bmMobWRldik7CisJCWRyYmRfbWRfc3luYyhkZXZpY2UpOwogCX0gZWxzZSB7CiAJCS8qIEkgYW0gZGlza2xlc3MsIG5lZWQgdG8gYWNjZXB0IHRoZSBwZWVyJ3Mgc2l6ZS4gKi8KLQkJZHJiZF9zZXRfbXlfY2FwYWNpdHkobWRldiwgcF9zaXplKTsKKwkJZHJiZF9zZXRfbXlfY2FwYWNpdHkoZGV2aWNlLCBwX3NpemUpOwogCX0KIAotCW1kZXYtPnBlZXJfbWF4X2Jpb19zaXplID0gYmUzMl90b19jcHUocC0+bWF4X2Jpb19zaXplKTsKLQlkcmJkX3JlY29uc2lkZXJfbWF4X2Jpb19zaXplKG1kZXYpOworCWRldmljZS0+cGVlcl9tYXhfYmlvX3NpemUgPSBiZTMyX3RvX2NwdShwLT5tYXhfYmlvX3NpemUpOworCWRyYmRfcmVjb25zaWRlcl9tYXhfYmlvX3NpemUoZGV2aWNlKTsKIAotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQlpZiAobWRldi0+bGRldi0+a25vd25fc2l6ZSAhPSBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT5sZGV2LT5iYWNraW5nX2JkZXYpKSB7Ci0JCQltZGV2LT5sZGV2LT5rbm93bl9zaXplID0gZHJiZF9nZXRfY2FwYWNpdHkobWRldi0+bGRldi0+YmFja2luZ19iZGV2KTsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlpZiAoZGV2aWNlLT5sZGV2LT5rbm93bl9zaXplICE9IGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+bGRldi0+YmFja2luZ19iZGV2KSkgeworCQkJZGV2aWNlLT5sZGV2LT5rbm93bl9zaXplID0gZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXYpOwogCQkJbGRzYyA9IDE7CiAJCX0KIAotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA+IENfV0ZfUkVQT1JUX1BBUkFNUykgeworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPiBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKIAkJaWYgKGJlNjRfdG9fY3B1KHAtPmNfc2l6ZSkgIT0KLQkJICAgIGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldikgfHwgbGRzYykgeworCQkgICAgZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT50aGlzX2JkZXYpIHx8IGxkc2MpIHsKIAkJCS8qIHdlIGhhdmUgZGlmZmVyZW50IHNpemVzLCBwcm9iYWJseSBwZWVyCiAJCQkgKiBuZWVkcyB0byBrbm93IG15IG5ldyBzaXplLi4uICovCi0JCQlkcmJkX3NlbmRfc2l6ZXMobWRldiwgMCwgZGRzZik7CisJCQlkcmJkX3NlbmRfc2l6ZXMocGVlcl9kZXZpY2UsIDAsIGRkc2YpOwogCQl9Ci0JCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUkVTSVpFX1BFTkRJTkcsICZtZGV2LT5mbGFncykgfHwKLQkJICAgIChkZCA9PSBEU19HUkVXICYmIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19DT05ORUNURUQpKSB7Ci0JCQlpZiAobWRldi0+c3RhdGUucGRzayA+PSBEX0lOQ09OU0lTVEVOVCAmJgotCQkJICAgIG1kZXYtPnN0YXRlLmRpc2sgPj0gRF9JTkNPTlNJU1RFTlQpIHsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSRVNJWkVfUEVORElORywgJmRldmljZS0+ZmxhZ3MpIHx8CisJCSAgICAoZGQgPT0gRFNfR1JFVyAmJiBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19DT05ORUNURUQpKSB7CisJCQlpZiAoZGV2aWNlLT5zdGF0ZS5wZHNrID49IERfSU5DT05TSVNURU5UICYmCisJCQkgICAgZGV2aWNlLT5zdGF0ZS5kaXNrID49IERfSU5DT05TSVNURU5UKSB7CiAJCQkJaWYgKGRkc2YgJiBERFNGX05PX1JFU1lOQykKLQkJCQkJZGV2X2luZm8oREVWLCAiUmVzeW5jIG9mIG5ldyBzdG9yYWdlIHN1cHByZXNzZWQgd2l0aCAtLWFzc3VtZS1jbGVhblxuIik7CisJCQkJCWRyYmRfaW5mbyhkZXZpY2UsICJSZXN5bmMgb2YgbmV3IHN0b3JhZ2Ugc3VwcHJlc3NlZCB3aXRoIC0tYXNzdW1lLWNsZWFuXG4iKTsKIAkJCQllbHNlCi0JCQkJCXJlc3luY19hZnRlcl9vbmxpbmVfZ3JvdyhtZGV2KTsKKwkJCQkJcmVzeW5jX2FmdGVyX29ubGluZV9ncm93KGRldmljZSk7CiAJCQl9IGVsc2UKLQkJCQlzZXRfYml0KFJFU1lOQ19BRlRFUl9ORUcsICZtZGV2LT5mbGFncyk7CisJCQkJc2V0X2JpdChSRVNZTkNfQUZURVJfTkVHLCAmZGV2aWNlLT5mbGFncyk7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX3V1aWRzKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV91dWlkcyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBwX3V1aWRzICpwID0gcGktPmRhdGE7CiAJdTY0ICpwX3V1aWQ7CiAJaW50IGksIHVwZGF0ZWRfdXVpZHMgPSAwOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCi0JCXJldHVybiBjb25maWdfdW5rbm93bl92b2x1bWUodGNvbm4sIHBpKTsKKwlwZWVyX2RldmljZSA9IGNvbm5fcGVlcl9kZXZpY2UoY29ubmVjdGlvbiwgcGktPnZucik7CisJaWYgKCFwZWVyX2RldmljZSkKKwkJcmV0dXJuIGNvbmZpZ191bmtub3duX3ZvbHVtZShjb25uZWN0aW9uLCBwaSk7CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAogCXBfdXVpZCA9IGttYWxsb2Moc2l6ZW9mKHU2NCkqVUlfRVhURU5ERURfU0laRSwgR0ZQX05PSU8pOwogCWlmICghcF91dWlkKSB7Ci0JCWRldl9lcnIoREVWLCAia21hbGxvYyBvZiBwX3V1aWQgZmFpbGVkXG4iKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAia21hbGxvYyBvZiBwX3V1aWQgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCWZvciAoaSA9IFVJX0NVUlJFTlQ7IGkgPCBVSV9FWFRFTkRFRF9TSVpFOyBpKyspCiAJCXBfdXVpZFtpXSA9IGJlNjRfdG9fY3B1KHAtPnV1aWRbaV0pOwogCi0Ja2ZyZWUobWRldi0+cF91dWlkKTsKLQltZGV2LT5wX3V1aWQgPSBwX3V1aWQ7CisJa2ZyZWUoZGV2aWNlLT5wX3V1aWQpOworCWRldmljZS0+cF91dWlkID0gcF91dWlkOwogCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCAmJgotCSAgICBtZGV2LT5zdGF0ZS5kaXNrIDwgRF9JTkNPTlNJU1RFTlQgJiYKLQkgICAgbWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkgJiYKLQkgICAgKG1kZXYtPmVkX3V1aWQgJiB+KCh1NjQpMSkpICE9IChwX3V1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSkpKSB7Ci0JCWRldl9lcnIoREVWLCAiQ2FuIG9ubHkgY29ubmVjdCB0byBkYXRhIHdpdGggY3VycmVudCBVVUlEPSUwMTZsbFhcbiIsCi0JCSAgICAodW5zaWduZWQgbG9uZyBsb25nKW1kZXYtPmVkX3V1aWQpOwotCQljb25uX3JlcXVlc3Rfc3RhdGUobWRldi0+dGNvbm4sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCAmJgorCSAgICBkZXZpY2UtPnN0YXRlLmRpc2sgPCBEX0lOQ09OU0lTVEVOVCAmJgorCSAgICBkZXZpY2UtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZICYmCisJICAgIChkZXZpY2UtPmVkX3V1aWQgJiB+KCh1NjQpMSkpICE9IChwX3V1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSkpKSB7CisJCWRyYmRfZXJyKGRldmljZSwgIkNhbiBvbmx5IGNvbm5lY3QgdG8gZGF0YSB3aXRoIGN1cnJlbnQgVVVJRD0lMDE2bGxYXG4iLAorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkZXZpY2UtPmVkX3V1aWQpOworCQljb25uX3JlcXVlc3Rfc3RhdGUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlpZiAoZ2V0X2xkZXYobWRldikpIHsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgewogCQlpbnQgc2tpcF9pbml0aWFsX3N5bmMgPQotCQkJbWRldi0+c3RhdGUuY29ubiA9PSBDX0NPTk5FQ1RFRCAmJgotCQkJbWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA5MCAmJgotCQkJbWRldi0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSA9PSBVVUlEX0pVU1RfQ1JFQVRFRCAmJgorCQkJZGV2aWNlLT5zdGF0ZS5jb25uID09IENfQ09OTkVDVEVEICYmCisJCQlwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDkwICYmCisJCQlkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0gPT0gVVVJRF9KVVNUX0NSRUFURUQgJiYKIAkJCShwX3V1aWRbVUlfRkxBR1NdICYgOCk7CiAJCWlmIChza2lwX2luaXRpYWxfc3luYykgewotCQkJZGV2X2luZm8oREVWLCAiQWNjZXB0ZWQgbmV3IGN1cnJlbnQgVVVJRCwgcHJlcGFyaW5nIHRvIHNraXAgaW5pdGlhbCBzeW5jXG4iKTsKLQkJCWRyYmRfYml0bWFwX2lvKG1kZXYsICZkcmJkX2JtaW9fY2xlYXJfbl93cml0ZSwKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJBY2NlcHRlZCBuZXcgY3VycmVudCBVVUlELCBwcmVwYXJpbmcgdG8gc2tpcCBpbml0aWFsIHN5bmNcbiIpOworCQkJZHJiZF9iaXRtYXBfaW8oZGV2aWNlLCAmZHJiZF9ibWlvX2NsZWFyX25fd3JpdGUsCiAJCQkJCSJjbGVhcl9uX3dyaXRlIGZyb20gcmVjZWl2ZV91dWlkcyIsCiAJCQkJCUJNX0xPQ0tFRF9URVNUX0FMTE9XRUQpOwotCQkJX2RyYmRfdXVpZF9zZXQobWRldiwgVUlfQ1VSUkVOVCwgcF91dWlkW1VJX0NVUlJFTlRdKTsKLQkJCV9kcmJkX3V1aWRfc2V0KG1kZXYsIFVJX0JJVE1BUCwgMCk7Ci0JCQlfZHJiZF9zZXRfc3RhdGUoX05TMihtZGV2LCBkaXNrLCBEX1VQX1RPX0RBVEUsIHBkc2ssIERfVVBfVE9fREFURSksCisJCQlfZHJiZF91dWlkX3NldChkZXZpY2UsIFVJX0NVUlJFTlQsIHBfdXVpZFtVSV9DVVJSRU5UXSk7CisJCQlfZHJiZF91dWlkX3NldChkZXZpY2UsIFVJX0JJVE1BUCwgMCk7CisJCQlfZHJiZF9zZXRfc3RhdGUoX05TMihkZXZpY2UsIGRpc2ssIERfVVBfVE9fREFURSwgcGRzaywgRF9VUF9UT19EQVRFKSwKIAkJCQkJQ1NfVkVSQk9TRSwgTlVMTCk7Ci0JCQlkcmJkX21kX3N5bmMobWRldik7CisJCQlkcmJkX21kX3N5bmMoZGV2aWNlKTsKIAkJCXVwZGF0ZWRfdXVpZHMgPSAxOwogCQl9Ci0JCXB1dF9sZGV2KG1kZXYpOwotCX0gZWxzZSBpZiAobWRldi0+c3RhdGUuZGlzayA8IERfSU5DT05TSVNURU5UICYmCi0JCSAgIG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKSB7CisJCXB1dF9sZGV2KGRldmljZSk7CisJfSBlbHNlIGlmIChkZXZpY2UtPnN0YXRlLmRpc2sgPCBEX0lOQ09OU0lTVEVOVCAmJgorCQkgICBkZXZpY2UtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKSB7CiAJCS8qIEkgYW0gYSBkaXNrbGVzcyBwcmltYXJ5LCB0aGUgcGVlciBqdXN0IGNyZWF0ZWQgYSBuZXcgY3VycmVudCBVVUlECiAJCSAgIGZvciBtZS4gKi8KLQkJdXBkYXRlZF91dWlkcyA9IGRyYmRfc2V0X2VkX3V1aWQobWRldiwgcF91dWlkW1VJX0NVUlJFTlRdKTsKKwkJdXBkYXRlZF91dWlkcyA9IGRyYmRfc2V0X2VkX3V1aWQoZGV2aWNlLCBwX3V1aWRbVUlfQ1VSUkVOVF0pOwogCX0KIAogCS8qIEJlZm9yZSB3ZSB0ZXN0IGZvciB0aGUgZGlzayBzdGF0ZSwgd2Ugc2hvdWxkIHdhaXQgdW50aWwgYW4gZXZlbnR1YWxseQogCSAgIG9uZ29pbmcgY2x1c3RlciB3aWRlIHN0YXRlIGNoYW5nZSBpcyBmaW5pc2hlZC4gVGhhdCBpcyBpbXBvcnRhbnQgaWYKIAkgICB3ZSBhcmUgcHJpbWFyeSBhbmQgYXJlIGRldGFjaGluZyBmcm9tIG91ciBkaXNrLiBXZSBuZWVkIHRvIHNlZSB0aGUKIAkgICBuZXcgZGlzayBzdGF0ZS4uLiAqLwotCW11dGV4X2xvY2sobWRldi0+c3RhdGVfbXV0ZXgpOwotCW11dGV4X3VubG9jayhtZGV2LT5zdGF0ZV9tdXRleCk7Ci0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPj0gQ19DT05ORUNURUQgJiYgbWRldi0+c3RhdGUuZGlzayA8IERfSU5DT05TSVNURU5UKQotCQl1cGRhdGVkX3V1aWRzIHw9IGRyYmRfc2V0X2VkX3V1aWQobWRldiwgcF91dWlkW1VJX0NVUlJFTlRdKTsKKwltdXRleF9sb2NrKGRldmljZS0+c3RhdGVfbXV0ZXgpOworCW11dGV4X3VubG9jayhkZXZpY2UtPnN0YXRlX211dGV4KTsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID49IENfQ09OTkVDVEVEICYmIGRldmljZS0+c3RhdGUuZGlzayA8IERfSU5DT05TSVNURU5UKQorCQl1cGRhdGVkX3V1aWRzIHw9IGRyYmRfc2V0X2VkX3V1aWQoZGV2aWNlLCBwX3V1aWRbVUlfQ1VSUkVOVF0pOwogCiAJaWYgKHVwZGF0ZWRfdXVpZHMpCi0JCWRyYmRfcHJpbnRfdXVpZHMobWRldiwgInJlY2VpdmVyIHVwZGF0ZWQgVVVJRHMgdG8iKTsKKwkJZHJiZF9wcmludF91dWlkcyhkZXZpY2UsICJyZWNlaXZlciB1cGRhdGVkIFVVSURzIHRvIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM3NjEsMzggKzM4MTIsNDAgQEAKIAlyZXR1cm4gbXM7CiB9CiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9yZXFfc3RhdGUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCByZWNlaXZlX3JlcV9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBwX3JlcV9zdGF0ZSAqcCA9IHBpLT5kYXRhOwogCXVuaW9uIGRyYmRfc3RhdGUgbWFzaywgdmFsOwogCWVudW0gZHJiZF9zdGF0ZV9ydiBydjsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQorCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQogCQlyZXR1cm4gLUVJTzsKKwlkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCiAJbWFzay5pID0gYmUzMl90b19jcHUocC0+bWFzayk7CiAJdmFsLmkgPSBiZTMyX3RvX2NwdShwLT52YWwpOwogCi0JaWYgKHRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmbWRldi0+dGNvbm4tPmZsYWdzKSAmJgotCSAgICBtdXRleF9pc19sb2NrZWQobWRldi0+c3RhdGVfbXV0ZXgpKSB7Ci0JCWRyYmRfc2VuZF9zcl9yZXBseShtZGV2LCBTU19DT05DVVJSRU5UX1NUX0NIRyk7CisJaWYgKHRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmZsYWdzKSAmJgorCSAgICBtdXRleF9pc19sb2NrZWQoZGV2aWNlLT5zdGF0ZV9tdXRleCkpIHsKKwkJZHJiZF9zZW5kX3NyX3JlcGx5KHBlZXJfZGV2aWNlLCBTU19DT05DVVJSRU5UX1NUX0NIRyk7CiAJCXJldHVybiAwOwogCX0KIAogCW1hc2sgPSBjb252ZXJ0X3N0YXRlKG1hc2spOwogCXZhbCA9IGNvbnZlcnRfc3RhdGUodmFsKTsKIAotCXJ2ID0gZHJiZF9jaGFuZ2Vfc3RhdGUobWRldiwgQ1NfVkVSQk9TRSwgbWFzaywgdmFsKTsKLQlkcmJkX3NlbmRfc3JfcmVwbHkobWRldiwgcnYpOworCXJ2ID0gZHJiZF9jaGFuZ2Vfc3RhdGUoZGV2aWNlLCBDU19WRVJCT1NFLCBtYXNrLCB2YWwpOworCWRyYmRfc2VuZF9zcl9yZXBseShwZWVyX2RldmljZSwgcnYpOwogCi0JZHJiZF9tZF9zeW5jKG1kZXYpOworCWRyYmRfbWRfc3luYyhkZXZpY2UpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9yZXFfY29ubl9zdGF0ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IHJlY2VpdmVfcmVxX2Nvbm5fc3RhdGUoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKIAlzdHJ1Y3QgcF9yZXFfc3RhdGUgKnAgPSBwaS0+ZGF0YTsKIAl1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHZhbDsKQEAgLTM4MDEsNDYgKzM4NTQsNDggQEAKIAltYXNrLmkgPSBiZTMyX3RvX2NwdShwLT5tYXNrKTsKIAl2YWwuaSA9IGJlMzJfdG9fY3B1KHAtPnZhbCk7CiAKLQlpZiAodGVzdF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZ0Y29ubi0+ZmxhZ3MpICYmCi0JICAgIG11dGV4X2lzX2xvY2tlZCgmdGNvbm4tPmNzdGF0ZV9tdXRleCkpIHsKLQkJY29ubl9zZW5kX3NyX3JlcGx5KHRjb25uLCBTU19DT05DVVJSRU5UX1NUX0NIRyk7CisJaWYgKHRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmY29ubmVjdGlvbi0+ZmxhZ3MpICYmCisJICAgIG11dGV4X2lzX2xvY2tlZCgmY29ubmVjdGlvbi0+Y3N0YXRlX211dGV4KSkgeworCQljb25uX3NlbmRfc3JfcmVwbHkoY29ubmVjdGlvbiwgU1NfQ09OQ1VSUkVOVF9TVF9DSEcpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAltYXNrID0gY29udmVydF9zdGF0ZShtYXNrKTsKIAl2YWwgPSBjb252ZXJ0X3N0YXRlKHZhbCk7CiAKLQlydiA9IGNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgbWFzaywgdmFsLCBDU19WRVJCT1NFIHwgQ1NfTE9DQUxfT05MWSB8IENTX0lHTl9PVVREX0ZBSUwpOwotCWNvbm5fc2VuZF9zcl9yZXBseSh0Y29ubiwgcnYpOworCXJ2ID0gY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIG1hc2ssIHZhbCwgQ1NfVkVSQk9TRSB8IENTX0xPQ0FMX09OTFkgfCBDU19JR05fT1VURF9GQUlMKTsKKwljb25uX3NlbmRfc3JfcmVwbHkoY29ubmVjdGlvbiwgcnYpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9zdGF0ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IHJlY2VpdmVfc3RhdGUoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9zdGF0ZSAqcCA9IHBpLT5kYXRhOwogCXVuaW9uIGRyYmRfc3RhdGUgb3MsIG5zLCBwZWVyX3N0YXRlOwogCWVudW0gZHJiZF9kaXNrX3N0YXRlIHJlYWxfcGVlcl9kaXNrOwogCWVudW0gY2hnX3N0YXRlX2ZsYWdzIGNzX2ZsYWdzOwogCWludCBydjsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQotCQlyZXR1cm4gY29uZmlnX3Vua25vd25fdm9sdW1lKHRjb25uLCBwaSk7CisJcGVlcl9kZXZpY2UgPSBjb25uX3BlZXJfZGV2aWNlKGNvbm5lY3Rpb24sIHBpLT52bnIpOworCWlmICghcGVlcl9kZXZpY2UpCisJCXJldHVybiBjb25maWdfdW5rbm93bl92b2x1bWUoY29ubmVjdGlvbiwgcGkpOworCWRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAKIAlwZWVyX3N0YXRlLmkgPSBiZTMyX3RvX2NwdShwLT5zdGF0ZSk7CiAKIAlyZWFsX3BlZXJfZGlzayA9IHBlZXJfc3RhdGUuZGlzazsKIAlpZiAocGVlcl9zdGF0ZS5kaXNrID09IERfTkVHT1RJQVRJTkcpIHsKLQkJcmVhbF9wZWVyX2Rpc2sgPSBtZGV2LT5wX3V1aWRbVUlfRkxBR1NdICYgNCA/IERfSU5DT05TSVNURU5UIDogRF9DT05TSVNURU5UOwotCQlkZXZfaW5mbyhERVYsICJyZWFsIHBlZXIgZGlzayBzdGF0ZSA9ICVzXG4iLCBkcmJkX2Rpc2tfc3RyKHJlYWxfcGVlcl9kaXNrKSk7CisJCXJlYWxfcGVlcl9kaXNrID0gZGV2aWNlLT5wX3V1aWRbVUlfRkxBR1NdICYgNCA/IERfSU5DT05TSVNURU5UIDogRF9DT05TSVNURU5UOworCQlkcmJkX2luZm8oZGV2aWNlLCAicmVhbCBwZWVyIGRpc2sgc3RhdGUgPSAlc1xuIiwgZHJiZF9kaXNrX3N0cihyZWFsX3BlZXJfZGlzaykpOwogCX0KIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogIHJldHJ5OgotCW9zID0gbnMgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCW9zID0gbnMgPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAogCS8qIElmIHNvbWUgb3RoZXIgcGFydCBvZiB0aGUgY29kZSAoYXNlbmRlciB0aHJlYWQsIHRpbWVvdXQpCiAJICogYWxyZWFkeSBkZWNpZGVkIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGFnYWluLApAQCAtMzg3Miw4ICszOTI3LDggQEAKIAkJICogTWF5YmUgd2Ugc2hvdWxkIGZpbmlzaCBpdCB1cCwgdG9vPyAqLwogCQllbHNlIGlmIChvcy5jb25uID49IENfU1lOQ19TT1VSQ0UgJiYKIAkJCSBwZWVyX3N0YXRlLmNvbm4gPT0gQ19DT05ORUNURUQpIHsKLQkJCWlmIChkcmJkX2JtX3RvdGFsX3dlaWdodChtZGV2KSA8PSBtZGV2LT5yc19mYWlsZWQpCi0JCQkJZHJiZF9yZXN5bmNfZmluaXNoZWQobWRldik7CisJCQlpZiAoZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKSA8PSBkZXZpY2UtPnJzX2ZhaWxlZCkKKwkJCQlkcmJkX3Jlc3luY19maW5pc2hlZChkZXZpY2UpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC0zODgxLDggKzM5MzYsOCBAQAogCS8qIGV4cGxpY2l0IHZlcmlmeSBmaW5pc2hlZCBub3RpZmljYXRpb24sIHN0b3Agc2VjdG9yIHJlYWNoZWQuICovCiAJaWYgKG9zLmNvbm4gPT0gQ19WRVJJRllfVCAmJiBvcy5kaXNrID09IERfVVBfVE9fREFURSAmJgogCSAgICBwZWVyX3N0YXRlLmNvbm4gPT0gQ19DT05ORUNURUQgJiYgcmVhbF9wZWVyX2Rpc2sgPT0gRF9VUF9UT19EQVRFKSB7Ci0JCW92X291dF9vZl9zeW5jX3ByaW50KG1kZXYpOwotCQlkcmJkX3Jlc3luY19maW5pc2hlZChtZGV2KTsKKwkJb3Zfb3V0X29mX3N5bmNfcHJpbnQoZGV2aWNlKTsKKwkJZHJiZF9yZXN5bmNfZmluaXNoZWQoZGV2aWNlKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zOTAxLDggKzM5NTYsOCBAQAogCWlmIChwZWVyX3N0YXRlLmNvbm4gPT0gQ19BSEVBRCkKIAkJbnMuY29ubiA9IENfQkVISU5EOwogCi0JaWYgKG1kZXYtPnBfdXVpZCAmJiBwZWVyX3N0YXRlLmRpc2sgPj0gRF9ORUdPVElBVElORyAmJgotCSAgICBnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX05FR09USUFUSU5HKSkgeworCWlmIChkZXZpY2UtPnBfdXVpZCAmJiBwZWVyX3N0YXRlLmRpc2sgPj0gRF9ORUdPVElBVElORyAmJgorCSAgICBnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfTkVHT1RJQVRJTkcpKSB7CiAJCWludCBjcjsgLyogY29uc2lkZXIgcmVzeW5jICovCiAKIAkJLyogaWYgd2UgZXN0YWJsaXNoZWQgYSBuZXcgY29ubmVjdGlvbiAqLwpAQCAtMzkxNCw3ICszOTY5LDcgQEAKIAkJCW9zLmRpc2sgPT0gRF9ORUdPVElBVElORykpOwogCQkvKiBpZiB3ZSBoYXZlIGJvdGggYmVlbiBpbmNvbnNpc3RlbnQsIGFuZCB0aGUgcGVlciBoYXMgYmVlbgogCQkgKiBmb3JjZWQgdG8gYmUgVXBUb0RhdGUgd2l0aCAtLW92ZXJ3cml0ZS1kYXRhICovCi0JCWNyIHw9IHRlc3RfYml0KENPTlNJREVSX1JFU1lOQywgJm1kZXYtPmZsYWdzKTsKKwkJY3IgfD0gdGVzdF9iaXQoQ09OU0lERVJfUkVTWU5DLCAmZGV2aWNlLT5mbGFncyk7CiAJCS8qIGlmIHdlIGhhZCBiZWVuIHBsYWluIGNvbm5lY3RlZCwgYW5kIHRoZSBhZG1pbiByZXF1ZXN0ZWQgdG8KIAkJICogc3RhcnQgYSBzeW5jIGJ5ICJpbnZhbGlkYXRlIiBvciAiaW52YWxpZGF0ZS1yZW1vdGUiICovCiAJCWNyIHw9IChvcy5jb25uID09IENfQ09OTkVDVEVEICYmCkBAIC0zOTIyLDU1ICszOTc3LDU1IEBACiAJCQkJIHBlZXJfc3RhdGUuY29ubiA8PSBDX1dGX0JJVE1BUF9UKSk7CiAKIAkJaWYgKGNyKQotCQkJbnMuY29ubiA9IGRyYmRfc3luY19oYW5kc2hha2UobWRldiwgcGVlcl9zdGF0ZS5yb2xlLCByZWFsX3BlZXJfZGlzayk7CisJCQlucy5jb25uID0gZHJiZF9zeW5jX2hhbmRzaGFrZShwZWVyX2RldmljZSwgcGVlcl9zdGF0ZS5yb2xlLCByZWFsX3BlZXJfZGlzayk7CiAKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJCWlmIChucy5jb25uID09IENfTUFTSykgewogCQkJbnMuY29ubiA9IENfQ09OTkVDVEVEOwotCQkJaWYgKG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9ORUdPVElBVElORykgewotCQkJCWRyYmRfZm9yY2Vfc3RhdGUobWRldiwgTlMoZGlzaywgRF9GQUlMRUQpKTsKKwkJCWlmIChkZXZpY2UtPnN0YXRlLmRpc2sgPT0gRF9ORUdPVElBVElORykgeworCQkJCWRyYmRfZm9yY2Vfc3RhdGUoZGV2aWNlLCBOUyhkaXNrLCBEX0ZBSUxFRCkpOwogCQkJfSBlbHNlIGlmIChwZWVyX3N0YXRlLmRpc2sgPT0gRF9ORUdPVElBVElORykgewotCQkJCWRldl9lcnIoREVWLCAiRGlzayBhdHRhY2ggcHJvY2VzcyBvbiB0aGUgcGVlciBub2RlIHdhcyBhYm9ydGVkLlxuIik7CisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiRGlzayBhdHRhY2ggcHJvY2VzcyBvbiB0aGUgcGVlciBub2RlIHdhcyBhYm9ydGVkLlxuIik7CiAJCQkJcGVlcl9zdGF0ZS5kaXNrID0gRF9ESVNLTEVTUzsKIAkJCQlyZWFsX3BlZXJfZGlzayA9IERfRElTS0xFU1M7CiAJCQl9IGVsc2UgewotCQkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ09OTl9EUllfUlVOLCAmbWRldi0+dGNvbm4tPmZsYWdzKSkKKwkJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENPTk5fRFJZX1JVTiwgJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5mbGFncykpCiAJCQkJCXJldHVybiAtRUlPOwotCQkJCURfQVNTRVJUKG9zLmNvbm4gPT0gQ19XRl9SRVBPUlRfUEFSQU1TKTsKLQkJCQljb25uX3JlcXVlc3Rfc3RhdGUobWRldi0+dGNvbm4sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOworCQkJCURfQVNTRVJUKGRldmljZSwgb3MuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpOworCQkJCWNvbm5fcmVxdWVzdF9zdGF0ZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CiAJCX0KIAl9CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCWlmIChvcy5pICE9IGRyYmRfcmVhZF9zdGF0ZShtZGV2KS5pKQorCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlpZiAob3MuaSAhPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKS5pKQogCQlnb3RvIHJldHJ5OwotCWNsZWFyX2JpdChDT05TSURFUl9SRVNZTkMsICZtZGV2LT5mbGFncyk7CisJY2xlYXJfYml0KENPTlNJREVSX1JFU1lOQywgJmRldmljZS0+ZmxhZ3MpOwogCW5zLnBlZXIgPSBwZWVyX3N0YXRlLnJvbGU7CiAJbnMucGRzayA9IHJlYWxfcGVlcl9kaXNrOwogCW5zLnBlZXJfaXNwID0gKHBlZXJfc3RhdGUuYWZ0cl9pc3AgfCBwZWVyX3N0YXRlLnVzZXJfaXNwKTsKIAlpZiAoKG5zLmNvbm4gPT0gQ19DT05ORUNURUQgfHwgbnMuY29ubiA9PSBDX1dGX0JJVE1BUF9TKSAmJiBucy5kaXNrID09IERfTkVHT1RJQVRJTkcpCi0JCW5zLmRpc2sgPSBtZGV2LT5uZXdfc3RhdGVfdG1wLmRpc2s7CisJCW5zLmRpc2sgPSBkZXZpY2UtPm5ld19zdGF0ZV90bXAuZGlzazsKIAljc19mbGFncyA9IENTX1ZFUkJPU0UgKyAob3MuY29ubiA8IENfQ09OTkVDVEVEICYmIG5zLmNvbm4gPj0gQ19DT05ORUNURUQgPyAwIDogQ1NfSEFSRCk7Ci0JaWYgKG5zLnBkc2sgPT0gRF9DT05TSVNURU5UICYmIGRyYmRfc3VzcGVuZGVkKG1kZXYpICYmIG5zLmNvbm4gPT0gQ19DT05ORUNURUQgJiYgb3MuY29ubiA8IENfQ09OTkVDVEVEICYmCi0JICAgIHRlc3RfYml0KE5FV19DVVJfVVVJRCwgJm1kZXYtPmZsYWdzKSkgeworCWlmIChucy5wZHNrID09IERfQ09OU0lTVEVOVCAmJiBkcmJkX3N1c3BlbmRlZChkZXZpY2UpICYmIG5zLmNvbm4gPT0gQ19DT05ORUNURUQgJiYgb3MuY29ubiA8IENfQ09OTkVDVEVEICYmCisJICAgIHRlc3RfYml0KE5FV19DVVJfVVVJRCwgJmRldmljZS0+ZmxhZ3MpKSB7CiAJCS8qIERvIG5vdCBhbGxvdyB0bF9yZXN0YXJ0KFJFU0VORCkgZm9yIGEgcmVib290ZWQgcGVlci4gV2UgY2FuIG9ubHkgYWxsb3cgdGhpcwogCQkgICBmb3IgdGVtcG9yYWwgbmV0d29yayBvdXRhZ2VzISAqLwotCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JCWRldl9lcnIoREVWLCAiQWJvcnRpbmcgQ29ubmVjdCwgY2FuIG5vdCB0aGF3IElPIHdpdGggYW4gb25seSBDb25zaXN0ZW50IHBlZXJcbiIpOwotCQl0bF9jbGVhcihtZGV2LT50Y29ubik7Ci0JCWRyYmRfdXVpZF9uZXdfY3VycmVudChtZGV2KTsKLQkJY2xlYXJfYml0KE5FV19DVVJfVVVJRCwgJm1kZXYtPmZsYWdzKTsKLQkJY29ubl9yZXF1ZXN0X3N0YXRlKG1kZXYtPnRjb25uLCBOUzIoY29ubiwgQ19QUk9UT0NPTF9FUlJPUiwgc3VzcCwgMCksIENTX0hBUkQpOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiQWJvcnRpbmcgQ29ubmVjdCwgY2FuIG5vdCB0aGF3IElPIHdpdGggYW4gb25seSBDb25zaXN0ZW50IHBlZXJcbiIpOworCQl0bF9jbGVhcihwZWVyX2RldmljZS0+Y29ubmVjdGlvbik7CisJCWRyYmRfdXVpZF9uZXdfY3VycmVudChkZXZpY2UpOworCQljbGVhcl9iaXQoTkVXX0NVUl9VVUlELCAmZGV2aWNlLT5mbGFncyk7CisJCWNvbm5fcmVxdWVzdF9zdGF0ZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgTlMyKGNvbm4sIENfUFJPVE9DT0xfRVJST1IsIHN1c3AsIDApLCBDU19IQVJEKTsKIAkJcmV0dXJuIC1FSU87CiAJfQotCXJ2ID0gX2RyYmRfc2V0X3N0YXRlKG1kZXYsIG5zLCBjc19mbGFncywgTlVMTCk7Ci0JbnMgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXJ2ID0gX2RyYmRfc2V0X3N0YXRlKGRldmljZSwgbnMsIGNzX2ZsYWdzLCBOVUxMKTsKKwlucyA9IGRyYmRfcmVhZF9zdGF0ZShkZXZpY2UpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJaWYgKHJ2IDwgU1NfU1VDQ0VTUykgewotCQljb25uX3JlcXVlc3Rfc3RhdGUobWRldi0+dGNvbm4sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOworCQljb25uX3JlcXVlc3Rfc3RhdGUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTM5ODAsNDcgKzQwMzUsNDkgQEAKIAkJCS8qIHdlIHdhbnQgcmVzeW5jLCBwZWVyIGhhcyBub3QgeWV0IGRlY2lkZWQgdG8gc3luYy4uLiAqLwogCQkJLyogTm93YWRheXMgb25seSB1c2VkIHdoZW4gZm9yY2luZyBhIG5vZGUgaW50byBwcmltYXJ5IHJvbGUgYW5kCiAJCQkgICBzZXR0aW5nIGl0cyBkaXNrIHRvIFVwVG9EYXRlIHdpdGggdGhhdCAqLwotCQkJZHJiZF9zZW5kX3V1aWRzKG1kZXYpOwotCQkJZHJiZF9zZW5kX2N1cnJlbnRfc3RhdGUobWRldik7CisJCQlkcmJkX3NlbmRfdXVpZHMocGVlcl9kZXZpY2UpOworCQkJZHJiZF9zZW5kX2N1cnJlbnRfc3RhdGUocGVlcl9kZXZpY2UpOwogCQl9CiAJfQogCi0JY2xlYXJfYml0KERJU0NBUkRfTVlfREFUQSwgJm1kZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoRElTQ0FSRF9NWV9EQVRBLCAmZGV2aWNlLT5mbGFncyk7CiAKLQlkcmJkX21kX3N5bmMobWRldik7IC8qIHVwZGF0ZSBjb25uZWN0ZWQgaW5kaWNhdG9yLCBsYV9zaXplX3NlY3QsIC4uLiAqLworCWRyYmRfbWRfc3luYyhkZXZpY2UpOyAvKiB1cGRhdGUgY29ubmVjdGVkIGluZGljYXRvciwgbGFfc2l6ZV9zZWN0LCAuLi4gKi8KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJlY2VpdmVfc3luY191dWlkKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV9zeW5jX3V1aWQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9yc191dWlkICpwID0gcGktPmRhdGE7CiAKLQltZGV2ID0gdm5yX3RvX21kZXYodGNvbm4sIHBpLT52bnIpOwotCWlmICghbWRldikKKwlwZWVyX2RldmljZSA9IGNvbm5fcGVlcl9kZXZpY2UoY29ubmVjdGlvbiwgcGktPnZucik7CisJaWYgKCFwZWVyX2RldmljZSkKIAkJcmV0dXJuIC1FSU87CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAotCXdhaXRfZXZlbnQobWRldi0+bWlzY193YWl0LAotCQkgICBtZGV2LT5zdGF0ZS5jb25uID09IENfV0ZfU1lOQ19VVUlEIHx8Ci0JCSAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19CRUhJTkQgfHwKLQkJICAgbWRldi0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEIHx8Ci0JCSAgIG1kZXYtPnN0YXRlLmRpc2sgPCBEX05FR09USUFUSU5HKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+bWlzY193YWl0LAorCQkgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19XRl9TWU5DX1VVSUQgfHwKKwkJICAgZGV2aWNlLT5zdGF0ZS5jb25uID09IENfQkVISU5EIHx8CisJCSAgIGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEIHx8CisJCSAgIGRldmljZS0+c3RhdGUuZGlzayA8IERfTkVHT1RJQVRJTkcpOwogCi0JLyogRF9BU1NFUlQoIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19XRl9TWU5DX1VVSUQgKTsgKi8KKwkvKiBEX0FTU0VSVChkZXZpY2UsICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19XRl9TWU5DX1VVSUQgKTsgKi8KIAogCS8qIEhlcmUgdGhlIF9kcmJkX3V1aWRfIGZ1bmN0aW9ucyBhcmUgcmlnaHQsIGN1cnJlbnQgc2hvdWxkCiAJICAgX25vdF8gYmUgcm90YXRlZCBpbnRvIHRoZSBoaXN0b3J5ICovCi0JaWYgKGdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfTkVHT1RJQVRJTkcpKSB7Ci0JCV9kcmJkX3V1aWRfc2V0KG1kZXYsIFVJX0NVUlJFTlQsIGJlNjRfdG9fY3B1KHAtPnV1aWQpKTsKLQkJX2RyYmRfdXVpZF9zZXQobWRldiwgVUlfQklUTUFQLCAwVUwpOworCWlmIChnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfTkVHT1RJQVRJTkcpKSB7CisJCV9kcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfQ1VSUkVOVCwgYmU2NF90b19jcHUocC0+dXVpZCkpOworCQlfZHJiZF91dWlkX3NldChkZXZpY2UsIFVJX0JJVE1BUCwgMFVMKTsKIAotCQlkcmJkX3ByaW50X3V1aWRzKG1kZXYsICJ1cGRhdGVkIHN5bmMgdXVpZCIpOwotCQlkcmJkX3N0YXJ0X3Jlc3luYyhtZGV2LCBDX1NZTkNfVEFSR0VUKTsKKwkJZHJiZF9wcmludF91dWlkcyhkZXZpY2UsICJ1cGRhdGVkIHN5bmMgdXVpZCIpOworCQlkcmJkX3N0YXJ0X3Jlc3luYyhkZXZpY2UsIENfU1lOQ19UQVJHRVQpOwogCi0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0gZWxzZQotCQlkZXZfZXJyKERFViwgIklnbm9yaW5nIFN5bmNVVUlEIHBhY2tldCFcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJJZ25vcmluZyBTeW5jVVVJRCBwYWNrZXQhXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDAzMiwyNyArNDA4OSwyNyBAQAogICogY29kZSB1cG9uIGZhaWx1cmUuCiAgKi8KIHN0YXRpYyBpbnQKLXJlY2VpdmVfYml0bWFwX3BsYWluKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGludCBzaXplLAorcmVjZWl2ZV9iaXRtYXBfcGxhaW4oc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCB1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJICAgICB1bnNpZ25lZCBsb25nICpwLCBzdHJ1Y3QgYm1feGZlcl9jdHggKmMpCiB7CiAJdW5zaWduZWQgaW50IGRhdGFfc2l6ZSA9IERSQkRfU09DS0VUX0JVRkZFUl9TSVpFIC0KLQkJCQkgZHJiZF9oZWFkZXJfc2l6ZShtZGV2LT50Y29ubik7CisJCQkJIGRyYmRfaGVhZGVyX3NpemUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24pOwogCXVuc2lnbmVkIGludCBudW1fd29yZHMgPSBtaW5fdChzaXplX3QsIGRhdGFfc2l6ZSAvIHNpemVvZigqcCksCiAJCQkJICAgICAgIGMtPmJtX3dvcmRzIC0gYy0+d29yZF9vZmZzZXQpOwogCXVuc2lnbmVkIGludCB3YW50ID0gbnVtX3dvcmRzICogc2l6ZW9mKCpwKTsKIAlpbnQgZXJyOwogCiAJaWYgKHdhbnQgIT0gc2l6ZSkgewotCQlkZXZfZXJyKERFViwgIiVzOndhbnQgKCV1KSAhPSBzaXplICgldSlcbiIsIF9fZnVuY19fLCB3YW50LCBzaXplKTsKKwkJZHJiZF9lcnIocGVlcl9kZXZpY2UsICIlczp3YW50ICgldSkgIT0gc2l6ZSAoJXUpXG4iLCBfX2Z1bmNfXywgd2FudCwgc2l6ZSk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAod2FudCA9PSAwKQogCQlyZXR1cm4gMDsKLQllcnIgPSBkcmJkX3JlY3ZfYWxsKG1kZXYtPnRjb25uLCBwLCB3YW50KTsKKwllcnIgPSBkcmJkX3JlY3ZfYWxsKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBwLCB3YW50KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JZHJiZF9ibV9tZXJnZV9sZWwobWRldiwgYy0+d29yZF9vZmZzZXQsIG51bV93b3JkcywgcCk7CisJZHJiZF9ibV9tZXJnZV9sZWwocGVlcl9kZXZpY2UtPmRldmljZSwgYy0+d29yZF9vZmZzZXQsIG51bV93b3JkcywgcCk7CiAKIAljLT53b3JkX29mZnNldCArPSBudW1fd29yZHM7CiAJYy0+Yml0X29mZnNldCA9IGMtPndvcmRfb2Zmc2V0ICogQklUU19QRVJfTE9ORzsKQEAgLTQwODQsNyArNDE0MSw3IEBACiAgKiBjb2RlIHVwb24gZmFpbHVyZS4KICAqLwogc3RhdGljIGludAotcmVjdl9ibV9ybGVfYml0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorcmVjdl9ibV9ybGVfYml0cyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsCiAJCXN0cnVjdCBwX2NvbXByZXNzZWRfYm0gKnAsCiAJCSBzdHJ1Y3QgYm1feGZlcl9jdHggKmMsCiAJCSB1bnNpZ25lZCBpbnQgbGVuKQpAQCAtNDExMywxNCArNDE3MCwxNCBAQAogCQlpZiAodG9nZ2xlKSB7CiAJCQllID0gcyArIHJsIC0xOwogCQkJaWYgKGUgPj0gYy0+Ym1fYml0cykgewotCQkJCWRldl9lcnIoREVWLCAiYml0bWFwIG92ZXJmbG93IChlOiVsdSkgd2hpbGUgZGVjb2RpbmcgYm0gUkxFIHBhY2tldFxuIiwgZSk7CisJCQkJZHJiZF9lcnIocGVlcl9kZXZpY2UsICJiaXRtYXAgb3ZlcmZsb3cgKGU6JWx1KSB3aGlsZSBkZWNvZGluZyBibSBSTEUgcGFja2V0XG4iLCBlKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KLQkJCV9kcmJkX2JtX3NldF9iaXRzKG1kZXYsIHMsIGUpOworCQkJX2RyYmRfYm1fc2V0X2JpdHMocGVlcl9kZXZpY2UtPmRldmljZSwgcywgZSk7CiAJCX0KIAogCQlpZiAoaGF2ZSA8IGJpdHMpIHsKLQkJCWRldl9lcnIoREVWLCAiYml0bWFwIGRlY29kaW5nIGVycm9yOiBoOiVkIGI6JWQgbGE6MHglMDhsbHggbDoldS8ldVxuIiwKKwkJCWRyYmRfZXJyKHBlZXJfZGV2aWNlLCAiYml0bWFwIGRlY29kaW5nIGVycm9yOiBoOiVkIGI6JWQgbGE6MHglMDhsbHggbDoldS8ldVxuIiwKIAkJCQloYXZlLCBiaXRzLCBsb29rX2FoZWFkLAogCQkJCSh1bnNpZ25lZCBpbnQpKGJzLmN1ci5iIC0gcC0+Y29kZSksCiAJCQkJKHVuc2lnbmVkIGludClicy5idWZfbGVuKTsKQEAgLTQxNTMsMjggKzQyMTAsMjggQEAKICAqIGNvZGUgdXBvbiBmYWlsdXJlLgogICovCiBzdGF0aWMgaW50Ci1kZWNvZGVfYml0bWFwX2Moc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK2RlY29kZV9iaXRtYXBfYyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsCiAJCXN0cnVjdCBwX2NvbXByZXNzZWRfYm0gKnAsCiAJCXN0cnVjdCBibV94ZmVyX2N0eCAqYywKIAkJdW5zaWduZWQgaW50IGxlbikKIHsKIAlpZiAoZGNicF9nZXRfY29kZShwKSA9PSBSTEVfVkxJX0JpdHMpCi0JCXJldHVybiByZWN2X2JtX3JsZV9iaXRzKG1kZXYsIHAsIGMsIGxlbiAtIHNpemVvZigqcCkpOworCQlyZXR1cm4gcmVjdl9ibV9ybGVfYml0cyhwZWVyX2RldmljZSwgcCwgYywgbGVuIC0gc2l6ZW9mKCpwKSk7CiAKIAkvKiBvdGhlciB2YXJpYW50cyBoYWQgYmVlbiBpbXBsZW1lbnRlZCBmb3IgZXZhbHVhdGlvbiwKIAkgKiBidXQgaGF2ZSBiZWVuIGRyb3BwZWQgYXMgdGhpcyBvbmUgdHVybmVkIG91dCB0byBiZSAiYmVzdCIKIAkgKiBkdXJpbmcgYWxsIG91ciB0ZXN0cy4gKi8KIAotCWRldl9lcnIoREVWLCAicmVjZWl2ZV9iaXRtYXBfYzogdW5rbm93biBlbmNvZGluZyAldVxuIiwgcC0+ZW5jb2RpbmcpOwotCWNvbm5fcmVxdWVzdF9zdGF0ZShtZGV2LT50Y29ubiwgTlMoY29ubiwgQ19QUk9UT0NPTF9FUlJPUiksIENTX0hBUkQpOworCWRyYmRfZXJyKHBlZXJfZGV2aWNlLCAicmVjZWl2ZV9iaXRtYXBfYzogdW5rbm93biBlbmNvZGluZyAldVxuIiwgcC0+ZW5jb2RpbmcpOworCWNvbm5fcmVxdWVzdF9zdGF0ZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgTlMoY29ubiwgQ19QUk9UT0NPTF9FUlJPUiksIENTX0hBUkQpOwogCXJldHVybiAtRUlPOwogfQogCi12b2lkIElORk9fYm1feGZlcl9zdGF0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAordm9pZCBJTkZPX2JtX3hmZXJfc3RhdHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCWNvbnN0IGNoYXIgKmRpcmVjdGlvbiwgc3RydWN0IGJtX3hmZXJfY3R4ICpjKQogewogCS8qIHdoYXQgd291bGQgaXQgdGFrZSB0byB0cmFuc2ZlciBpdCAicGxhaW50ZXh0IiAqLwotCXVuc2lnbmVkIGludCBoZWFkZXJfc2l6ZSA9IGRyYmRfaGVhZGVyX3NpemUobWRldi0+dGNvbm4pOworCXVuc2lnbmVkIGludCBoZWFkZXJfc2l6ZSA9IGRyYmRfaGVhZGVyX3NpemUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbik7CiAJdW5zaWduZWQgaW50IGRhdGFfc2l6ZSA9IERSQkRfU09DS0VUX0JVRkZFUl9TSVpFIC0gaGVhZGVyX3NpemU7CiAJdW5zaWduZWQgaW50IHBsYWluID0KIAkJaGVhZGVyX3NpemUgKiAoRElWX1JPVU5EX1VQKGMtPmJtX3dvcmRzLCBkYXRhX3NpemUpICsgMSkgKwpAQCAtNDE5OCw3ICs0MjU1LDcgQEAKIAkJciA9IDEwMDA7CiAKIAlyID0gMTAwMCAtIHI7Ci0JZGV2X2luZm8oREVWLCAiJXMgYml0bWFwIHN0YXRzIFtCeXRlcyhwYWNrZXRzKV06IHBsYWluICV1KCV1KSwgUkxFICV1KCV1KSwgIgorCWRyYmRfaW5mbyhkZXZpY2UsICIlcyBiaXRtYXAgc3RhdHMgW0J5dGVzKHBhY2tldHMpXTogcGxhaW4gJXUoJXUpLCBSTEUgJXUoJXUpLCAiCiAJICAgICAidG90YWwgJXU7IGNvbXByZXNzaW9uOiAldS4ldSUlXG4iLAogCQkJZGlyZWN0aW9uLAogCQkJYy0+Ynl0ZXNbMV0sIGMtPnBhY2tldHNbMV0sCkBAIC00MjE0LDEyOSArNDI3MSwxMzMgQEAKICAgIGluIG9yZGVyIHRvIGJlIGFnbm9zdGljIHRvIHRoZSAzMiB2cyA2NCBiaXRzIGlzc3VlLgogCiAgICByZXR1cm5zIDAgb24gZmFpbHVyZSwgMSBpZiB3ZSBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgaXQuICovCi1zdGF0aWMgaW50IHJlY2VpdmVfYml0bWFwKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV9iaXRtYXAoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgYm1feGZlcl9jdHggYzsKIAlpbnQgZXJyOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCisJcGVlcl9kZXZpY2UgPSBjb25uX3BlZXJfZGV2aWNlKGNvbm5lY3Rpb24sIHBpLT52bnIpOworCWlmICghcGVlcl9kZXZpY2UpCiAJCXJldHVybiAtRUlPOworCWRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAKLQlkcmJkX2JtX2xvY2sobWRldiwgInJlY2VpdmUgYml0bWFwIiwgQk1fTE9DS0VEX1NFVF9BTExPV0VEKTsKKwlkcmJkX2JtX2xvY2soZGV2aWNlLCAicmVjZWl2ZSBiaXRtYXAiLCBCTV9MT0NLRURfU0VUX0FMTE9XRUQpOwogCS8qIHlvdSBhcmUgc3VwcG9zZWQgdG8gc2VuZCBhZGRpdGlvbmFsIG91dC1vZi1zeW5jIGluZm9ybWF0aW9uCiAJICogaWYgeW91IGFjdHVhbGx5IHNldCBiaXRzIGR1cmluZyB0aGlzIHBoYXNlICovCiAKIAljID0gKHN0cnVjdCBibV94ZmVyX2N0eCkgewotCQkuYm1fYml0cyA9IGRyYmRfYm1fYml0cyhtZGV2KSwKLQkJLmJtX3dvcmRzID0gZHJiZF9ibV93b3JkcyhtZGV2KSwKKwkJLmJtX2JpdHMgPSBkcmJkX2JtX2JpdHMoZGV2aWNlKSwKKwkJLmJtX3dvcmRzID0gZHJiZF9ibV93b3JkcyhkZXZpY2UpLAogCX07CiAKIAlmb3IoOzspIHsKIAkJaWYgKHBpLT5jbWQgPT0gUF9CSVRNQVApCi0JCQllcnIgPSByZWNlaXZlX2JpdG1hcF9wbGFpbihtZGV2LCBwaS0+c2l6ZSwgcGktPmRhdGEsICZjKTsKKwkJCWVyciA9IHJlY2VpdmVfYml0bWFwX3BsYWluKHBlZXJfZGV2aWNlLCBwaS0+c2l6ZSwgcGktPmRhdGEsICZjKTsKIAkJZWxzZSBpZiAocGktPmNtZCA9PSBQX0NPTVBSRVNTRURfQklUTUFQKSB7CiAJCQkvKiBNQVlCRTogc2FuaXR5IGNoZWNrIHRoYXQgd2Ugc3BlYWsgcHJvdG8gPj0gOTAsCiAJCQkgKiBhbmQgdGhlIGZlYXR1cmUgaXMgZW5hYmxlZCEgKi8KIAkJCXN0cnVjdCBwX2NvbXByZXNzZWRfYm0gKnAgPSBwaS0+ZGF0YTsKIAotCQkJaWYgKHBpLT5zaXplID4gRFJCRF9TT0NLRVRfQlVGRkVSX1NJWkUgLSBkcmJkX2hlYWRlcl9zaXplKHRjb25uKSkgewotCQkJCWRldl9lcnIoREVWLCAiUmVwb3J0Q0JpdG1hcCBwYWNrZXQgdG9vIGxhcmdlXG4iKTsKKwkJCWlmIChwaS0+c2l6ZSA+IERSQkRfU09DS0VUX0JVRkZFUl9TSVpFIC0gZHJiZF9oZWFkZXJfc2l6ZShjb25uZWN0aW9uKSkgeworCQkJCWRyYmRfZXJyKGRldmljZSwgIlJlcG9ydENCaXRtYXAgcGFja2V0IHRvbyBsYXJnZVxuIik7CiAJCQkJZXJyID0gLUVJTzsKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCWlmIChwaS0+c2l6ZSA8PSBzaXplb2YoKnApKSB7Ci0JCQkJZGV2X2VycihERVYsICJSZXBvcnRDQml0bWFwIHBhY2tldCB0b28gc21hbGwgKGw6JXUpXG4iLCBwaS0+c2l6ZSk7CisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiUmVwb3J0Q0JpdG1hcCBwYWNrZXQgdG9vIHNtYWxsIChsOiV1KVxuIiwgcGktPnNpemUpOwogCQkJCWVyciA9IC1FSU87CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQllcnIgPSBkcmJkX3JlY3ZfYWxsKG1kZXYtPnRjb25uLCBwLCBwaS0+c2l6ZSk7CisJCQllcnIgPSBkcmJkX3JlY3ZfYWxsKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBwLCBwaS0+c2l6ZSk7CiAJCQlpZiAoZXJyKQogCQkJICAgICAgIGdvdG8gb3V0OwotCQkJZXJyID0gZGVjb2RlX2JpdG1hcF9jKG1kZXYsIHAsICZjLCBwaS0+c2l6ZSk7CisJCQllcnIgPSBkZWNvZGVfYml0bWFwX2MocGVlcl9kZXZpY2UsIHAsICZjLCBwaS0+c2l6ZSk7CiAJCX0gZWxzZSB7Ci0JCQlkZXZfd2FybihERVYsICJyZWNlaXZlX2JpdG1hcDogY21kIG5laXRoZXIgUmVwb3J0Qml0TWFwIG5vciBSZXBvcnRDQml0TWFwIChpcyAweCV4KSIsIHBpLT5jbWQpOworCQkJZHJiZF93YXJuKGRldmljZSwgInJlY2VpdmVfYml0bWFwOiBjbWQgbmVpdGhlciBSZXBvcnRCaXRNYXAgbm9yIFJlcG9ydENCaXRNYXAgKGlzIDB4JXgpIiwgcGktPmNtZCk7CiAJCQllcnIgPSAtRUlPOwogCQkJZ290byBvdXQ7CiAJCX0KIAogCQljLnBhY2tldHNbcGktPmNtZCA9PSBQX0JJVE1BUF0rKzsKLQkJYy5ieXRlc1twaS0+Y21kID09IFBfQklUTUFQXSArPSBkcmJkX2hlYWRlcl9zaXplKHRjb25uKSArIHBpLT5zaXplOworCQljLmJ5dGVzW3BpLT5jbWQgPT0gUF9CSVRNQVBdICs9IGRyYmRfaGVhZGVyX3NpemUoY29ubmVjdGlvbikgKyBwaS0+c2l6ZTsKIAogCQlpZiAoZXJyIDw9IDApIHsKIAkJCWlmIChlcnIgPCAwKQogCQkJCWdvdG8gb3V0OwogCQkJYnJlYWs7CiAJCX0KLQkJZXJyID0gZHJiZF9yZWN2X2hlYWRlcihtZGV2LT50Y29ubiwgcGkpOworCQllcnIgPSBkcmJkX3JlY3ZfaGVhZGVyKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBwaSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAl9CiAKLQlJTkZPX2JtX3hmZXJfc3RhdHMobWRldiwgInJlY2VpdmUiLCAmYyk7CisJSU5GT19ibV94ZmVyX3N0YXRzKGRldmljZSwgInJlY2VpdmUiLCAmYyk7CiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1dGX0JJVE1BUF9UKSB7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1dGX0JJVE1BUF9UKSB7CiAJCWVudW0gZHJiZF9zdGF0ZV9ydiBydjsKIAotCQllcnIgPSBkcmJkX3NlbmRfYml0bWFwKG1kZXYpOworCQllcnIgPSBkcmJkX3NlbmRfYml0bWFwKGRldmljZSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAkJLyogT21pdCBDU19PUkRFUkVEIHdpdGggdGhpcyBzdGF0ZSB0cmFuc2l0aW9uIHRvIGF2b2lkIGRlYWRsb2Nrcy4gKi8KLQkJcnYgPSBfZHJiZF9yZXF1ZXN0X3N0YXRlKG1kZXYsIE5TKGNvbm4sIENfV0ZfU1lOQ19VVUlEKSwgQ1NfVkVSQk9TRSk7Ci0JCURfQVNTRVJUKHJ2ID09IFNTX1NVQ0NFU1MpOwotCX0gZWxzZSBpZiAobWRldi0+c3RhdGUuY29ubiAhPSBDX1dGX0JJVE1BUF9TKSB7CisJCXJ2ID0gX2RyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfV0ZfU1lOQ19VVUlEKSwgQ1NfVkVSQk9TRSk7CisJCURfQVNTRVJUKGRldmljZSwgcnYgPT0gU1NfU1VDQ0VTUyk7CisJfSBlbHNlIGlmIChkZXZpY2UtPnN0YXRlLmNvbm4gIT0gQ19XRl9CSVRNQVBfUykgewogCQkvKiBhZG1pbiBtYXkgaGF2ZSByZXF1ZXN0ZWQgQ19ESVNDT05ORUNUSU5HLAogCQkgKiBvdGhlciB0aHJlYWRzIG1heSBoYXZlIG5vdGljZWQgbmV0d29yayBlcnJvcnMgKi8KLQkJZGV2X2luZm8oREVWLCAidW5leHBlY3RlZCBjc3RhdGUgKCVzKSBpbiByZWNlaXZlX2JpdG1hcFxuIiwKLQkJICAgIGRyYmRfY29ubl9zdHIobWRldi0+c3RhdGUuY29ubikpOworCQlkcmJkX2luZm8oZGV2aWNlLCAidW5leHBlY3RlZCBjc3RhdGUgKCVzKSBpbiByZWNlaXZlX2JpdG1hcFxuIiwKKwkJICAgIGRyYmRfY29ubl9zdHIoZGV2aWNlLT5zdGF0ZS5jb25uKSk7CiAJfQogCWVyciA9IDA7CiAKICBvdXQ6Ci0JZHJiZF9ibV91bmxvY2sobWRldik7Ci0JaWYgKCFlcnIgJiYgbWRldi0+c3RhdGUuY29ubiA9PSBDX1dGX0JJVE1BUF9TKQotCQlkcmJkX3N0YXJ0X3Jlc3luYyhtZGV2LCBDX1NZTkNfU09VUkNFKTsKKwlkcmJkX2JtX3VubG9jayhkZXZpY2UpOworCWlmICghZXJyICYmIGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1dGX0JJVE1BUF9TKQorCQlkcmJkX3N0YXJ0X3Jlc3luYyhkZXZpY2UsIENfU1lOQ19TT1VSQ0UpOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9za2lwKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV9za2lwKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7Ci0JY29ubl93YXJuKHRjb25uLCAic2tpcHBpbmcgdW5rbm93biBvcHRpb25hbCBwYWNrZXQgdHlwZSAlZCwgbDogJWQhXG4iLAorCWRyYmRfd2Fybihjb25uZWN0aW9uLCAic2tpcHBpbmcgdW5rbm93biBvcHRpb25hbCBwYWNrZXQgdHlwZSAlZCwgbDogJWQhXG4iLAogCQkgcGktPmNtZCwgcGktPnNpemUpOwogCi0JcmV0dXJuIGlnbm9yZV9yZW1haW5pbmdfcGFja2V0KHRjb25uLCBwaSk7CisJcmV0dXJuIGlnbm9yZV9yZW1haW5pbmdfcGFja2V0KGNvbm5lY3Rpb24sIHBpKTsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX1VucGx1Z1JlbW90ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IHJlY2VpdmVfVW5wbHVnUmVtb3RlKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7CiAJLyogTWFrZSBzdXJlIHdlJ3ZlIGFja2VkIGFsbCB0aGUgVENQIGRhdGEgYXNzb2NpYXRlZAogCSAqIHdpdGggdGhlIGRhdGEgcmVxdWVzdHMgYmVpbmcgdW5wbHVnZ2VkICovCi0JZHJiZF90Y3BfcXVpY2thY2sodGNvbm4tPmRhdGEuc29ja2V0KTsKKwlkcmJkX3RjcF9xdWlja2Fjayhjb25uZWN0aW9uLT5kYXRhLnNvY2tldCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX291dF9vZl9zeW5jKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV9vdXRfb2Zfc3luYyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBwX2Jsb2NrX2Rlc2MgKnAgPSBwaS0+ZGF0YTsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQorCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQogCQlyZXR1cm4gLUVJTzsKKwlkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCi0Jc3dpdGNoIChtZGV2LT5zdGF0ZS5jb25uKSB7CisJc3dpdGNoIChkZXZpY2UtPnN0YXRlLmNvbm4pIHsKIAljYXNlIENfV0ZfU1lOQ19VVUlEOgogCWNhc2UgQ19XRl9CSVRNQVBfVDoKIAljYXNlIENfQkVISU5EOgogCQkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycihERVYsICJBU1NFUlQgRkFJTEVEIGNzdGF0ZSA9ICVzLCBleHBlY3RlZDogV0ZTeW5jVVVJRHxXRkJpdE1hcFR8QmVoaW5kXG4iLAotCQkJCWRyYmRfY29ubl9zdHIobWRldi0+c3RhdGUuY29ubikpOworCQlkcmJkX2VycihkZXZpY2UsICJBU1NFUlQgRkFJTEVEIGNzdGF0ZSA9ICVzLCBleHBlY3RlZDogV0ZTeW5jVVVJRHxXRkJpdE1hcFR8QmVoaW5kXG4iLAorCQkJCWRyYmRfY29ubl9zdHIoZGV2aWNlLT5zdGF0ZS5jb25uKSk7CiAJfQogCi0JZHJiZF9zZXRfb3V0X29mX3N5bmMobWRldiwgYmU2NF90b19jcHUocC0+c2VjdG9yKSwgYmUzMl90b19jcHUocC0+Ymxrc2l6ZSkpOworCWRyYmRfc2V0X291dF9vZl9zeW5jKGRldmljZSwgYmU2NF90b19jcHUocC0+c2VjdG9yKSwgYmUzMl90b19jcHUocC0+Ymxrc2l6ZSkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MzQ0LDcgKzQ0MDUsNyBAQAogc3RydWN0IGRhdGFfY21kIHsKIAlpbnQgZXhwZWN0X3BheWxvYWQ7CiAJc2l6ZV90IHBrdF9zaXplOwotCWludCAoKmZuKShzdHJ1Y3QgZHJiZF90Y29ubiAqLCBzdHJ1Y3QgcGFja2V0X2luZm8gKik7CisJaW50ICgqZm4pKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKiwgc3RydWN0IHBhY2tldF9pbmZvICopOwogfTsKIAogc3RhdGljIHN0cnVjdCBkYXRhX2NtZCBkcmJkX2NtZF9oYW5kbGVyW10gPSB7CkBAIC00Mzc0LDQzICs0NDM1LDQzIEBACiAJW1BfUFJPVE9DT0xfVVBEQVRFXSA9IHsgMSwgc2l6ZW9mKHN0cnVjdCBwX3Byb3RvY29sKSwgcmVjZWl2ZV9wcm90b2NvbCB9LAogfTsKIAotc3RhdGljIHZvaWQgZHJiZGQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIHZvaWQgZHJiZGQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlzdHJ1Y3QgcGFja2V0X2luZm8gcGk7CiAJc2l6ZV90IHNoczsgLyogc3ViIGhlYWRlciBzaXplICovCiAJaW50IGVycjsKIAotCXdoaWxlIChnZXRfdF9zdGF0ZSgmdGNvbm4tPnJlY2VpdmVyKSA9PSBSVU5OSU5HKSB7CisJd2hpbGUgKGdldF90X3N0YXRlKCZjb25uZWN0aW9uLT5yZWNlaXZlcikgPT0gUlVOTklORykgewogCQlzdHJ1Y3QgZGF0YV9jbWQgKmNtZDsKIAotCQlkcmJkX3RocmVhZF9jdXJyZW50X3NldF9jcHUoJnRjb25uLT5yZWNlaXZlcik7Ci0JCWlmIChkcmJkX3JlY3ZfaGVhZGVyKHRjb25uLCAmcGkpKQorCQlkcmJkX3RocmVhZF9jdXJyZW50X3NldF9jcHUoJmNvbm5lY3Rpb24tPnJlY2VpdmVyKTsKKwkJaWYgKGRyYmRfcmVjdl9oZWFkZXIoY29ubmVjdGlvbiwgJnBpKSkKIAkJCWdvdG8gZXJyX291dDsKIAogCQljbWQgPSAmZHJiZF9jbWRfaGFuZGxlcltwaS5jbWRdOwogCQlpZiAodW5saWtlbHkocGkuY21kID49IEFSUkFZX1NJWkUoZHJiZF9jbWRfaGFuZGxlcikgfHwgIWNtZC0+Zm4pKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgIlVuZXhwZWN0ZWQgZGF0YSBwYWNrZXQgJXMgKDB4JTA0eCkiLAorCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIlVuZXhwZWN0ZWQgZGF0YSBwYWNrZXQgJXMgKDB4JTA0eCkiLAogCQkJCSBjbWRuYW1lKHBpLmNtZCksIHBpLmNtZCk7CiAJCQlnb3RvIGVycl9vdXQ7CiAJCX0KIAogCQlzaHMgPSBjbWQtPnBrdF9zaXplOwogCQlpZiAocGkuc2l6ZSA+IHNocyAmJiAhY21kLT5leHBlY3RfcGF5bG9hZCkgewotCQkJY29ubl9lcnIodGNvbm4sICJObyBwYXlsb2FkIGV4cGVjdGVkICVzIGw6JWRcbiIsCisJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiTm8gcGF5bG9hZCBleHBlY3RlZCAlcyBsOiVkXG4iLAogCQkJCSBjbWRuYW1lKHBpLmNtZCksIHBpLnNpemUpOwogCQkJZ290byBlcnJfb3V0OwogCQl9CiAKIAkJaWYgKHNocykgewotCQkJZXJyID0gZHJiZF9yZWN2X2FsbF93YXJuKHRjb25uLCBwaS5kYXRhLCBzaHMpOworCQkJZXJyID0gZHJiZF9yZWN2X2FsbF93YXJuKGNvbm5lY3Rpb24sIHBpLmRhdGEsIHNocyk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gZXJyX291dDsKIAkJCXBpLnNpemUgLT0gc2hzOwogCQl9CiAKLQkJZXJyID0gY21kLT5mbih0Y29ubiwgJnBpKTsKKwkJZXJyID0gY21kLT5mbihjb25uZWN0aW9uLCAmcGkpOwogCQlpZiAoZXJyKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgImVycm9yIHJlY2VpdmluZyAlcywgZTogJWQgbDogJWQhXG4iLAorCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImVycm9yIHJlY2VpdmluZyAlcywgZTogJWQgbDogJWQhXG4iLAogCQkJCSBjbWRuYW1lKHBpLmNtZCksIGVyciwgcGkuc2l6ZSk7CiAJCQlnb3RvIGVycl9vdXQ7CiAJCX0KQEAgLTQ0MTgsMjcgKzQ0NzksMTYgQEAKIAlyZXR1cm47CiAKICAgICBlcnJfb3V0OgotCWNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19QUk9UT0NPTF9FUlJPUiksIENTX0hBUkQpOworCWNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX1BST1RPQ09MX0VSUk9SKSwgQ1NfSEFSRCk7CiB9CiAKLXZvaWQgY29ubl9mbHVzaF93b3JrcXVldWUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIHZvaWQgY29ubl9kaXNjb25uZWN0KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0Jc3RydWN0IGRyYmRfd3FfYmFycmllciBiYXJyOwotCi0JYmFyci53LmNiID0gd19wcmV2X3dvcmtfZG9uZTsKLQliYXJyLncudGNvbm4gPSB0Y29ubjsKLQlpbml0X2NvbXBsZXRpb24oJmJhcnIuZG9uZSk7Ci0JZHJiZF9xdWV1ZV93b3JrKCZ0Y29ubi0+c2VuZGVyX3dvcmssICZiYXJyLncpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmJhcnIuZG9uZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbm5fZGlzY29ubmVjdChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCi17Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJZW51bSBkcmJkX2Nvbm5zIG9jOwogCWludCB2bnI7CiAKLQlpZiAodGNvbm4tPmNzdGF0ZSA9PSBDX1NUQU5EQUxPTkUpCisJaWYgKGNvbm5lY3Rpb24tPmNzdGF0ZSA9PSBDX1NUQU5EQUxPTkUpCiAJCXJldHVybjsKIAogCS8qIFdlIGFyZSBhYm91dCB0byBzdGFydCB0aGUgY2xlYW51cCBhZnRlciBjb25uZWN0aW9uIGxvc3MuCkBAIC00NDQ2LDU0ICs0NDk2LDU2IEBACiAJICogVXN1YWxseSB3ZSBzaG91bGQgYmUgaW4gc29tZSBuZXR3b3JrIGZhaWx1cmUgc3RhdGUgYWxyZWFkeSwKIAkgKiBidXQganVzdCBpbiBjYXNlIHdlIGFyZSBub3QsIHdlIGZpeCBpdCB1cCBoZXJlLgogCSAqLwotCWNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19ORVRXT1JLX0ZBSUxVUkUpLCBDU19IQVJEKTsKKwljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19ORVRXT1JLX0ZBSUxVUkUpLCBDU19IQVJEKTsKIAogCS8qIGFzZW5kZXIgZG9lcyBub3QgY2xlYW4gdXAgYW55dGhpbmcuIGl0IG11c3Qgbm90IGludGVyZmVyZSwgZWl0aGVyICovCi0JZHJiZF90aHJlYWRfc3RvcCgmdGNvbm4tPmFzZW5kZXIpOwotCWRyYmRfZnJlZV9zb2NrKHRjb25uKTsKKwlkcmJkX3RocmVhZF9zdG9wKCZjb25uZWN0aW9uLT5hc2VuZGVyKTsKKwlkcmJkX2ZyZWVfc29jayhjb25uZWN0aW9uKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJa3JlZl9nZXQoJm1kZXYtPmtyZWYpOworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKSB7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJa3JlZl9nZXQoJmRldmljZS0+a3JlZik7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlkcmJkX2Rpc2Nvbm5lY3RlZChtZGV2KTsKLQkJa3JlZl9wdXQoJm1kZXYtPmtyZWYsICZkcmJkX21pbm9yX2Rlc3Ryb3kpOworCQlkcmJkX2Rpc2Nvbm5lY3RlZChwZWVyX2RldmljZSk7CisJCWtyZWZfcHV0KCZkZXZpY2UtPmtyZWYsIGRyYmRfZGVzdHJveV9kZXZpY2UpOwogCQlyY3VfcmVhZF9sb2NrKCk7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JaWYgKCFsaXN0X2VtcHR5KCZ0Y29ubi0+Y3VycmVudF9lcG9jaC0+bGlzdCkpCi0JCWNvbm5fZXJyKHRjb25uLCAiQVNTRVJUSU9OIEZBSUxFRDogdGNvbm4tPmN1cnJlbnRfZXBvY2gtPmxpc3Qgbm90IGVtcHR5XG4iKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmxpc3QpKQorCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiQVNTRVJUSU9OIEZBSUxFRDogY29ubmVjdGlvbi0+Y3VycmVudF9lcG9jaC0+bGlzdCBub3QgZW1wdHlcbiIpOwogCS8qIG9rLCBubyBtb3JlIGVlJ3Mgb24gdGhlIGZseSwgaXQgaXMgc2FmZSB0byByZXNldCB0aGUgZXBvY2hfc2l6ZSAqLwotCWF0b21pY19zZXQoJnRjb25uLT5jdXJyZW50X2Vwb2NoLT5lcG9jaF9zaXplLCAwKTsKLQl0Y29ubi0+c2VuZC5zZWVuX2FueV93cml0ZV95ZXQgPSBmYWxzZTsKKwlhdG9taWNfc2V0KCZjb25uZWN0aW9uLT5jdXJyZW50X2Vwb2NoLT5lcG9jaF9zaXplLCAwKTsKKwljb25uZWN0aW9uLT5zZW5kLnNlZW5fYW55X3dyaXRlX3lldCA9IGZhbHNlOwogCi0JY29ubl9pbmZvKHRjb25uLCAiQ29ubmVjdGlvbiBjbG9zZWRcbiIpOworCWRyYmRfaW5mbyhjb25uZWN0aW9uLCAiQ29ubmVjdGlvbiBjbG9zZWRcbiIpOwogCi0JaWYgKGNvbm5faGlnaGVzdF9yb2xlKHRjb25uKSA9PSBSX1BSSU1BUlkgJiYgY29ubl9oaWdoZXN0X3Bkc2sodGNvbm4pID49IERfVU5LTk9XTikKLQkJY29ubl90cnlfb3V0ZGF0ZV9wZWVyX2FzeW5jKHRjb25uKTsKKwlpZiAoY29ubl9oaWdoZXN0X3JvbGUoY29ubmVjdGlvbikgPT0gUl9QUklNQVJZICYmIGNvbm5faGlnaGVzdF9wZHNrKGNvbm5lY3Rpb24pID49IERfVU5LTk9XTikKKwkJY29ubl90cnlfb3V0ZGF0ZV9wZWVyX2FzeW5jKGNvbm5lY3Rpb24pOwogCi0Jc3Bpbl9sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKLQlvYyA9IHRjb25uLT5jc3RhdGU7CisJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlvYyA9IGNvbm5lY3Rpb24tPmNzdGF0ZTsKIAlpZiAob2MgPj0gQ19VTkNPTk5FQ1RFRCkKLQkJX2Nvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19VTkNPTk5FQ1RFRCksIENTX1ZFUkJPU0UpOworCQlfY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfVU5DT05ORUNURUQpLCBDU19WRVJCT1NFKTsKIAotCXNwaW5fdW5sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiAKIAlpZiAob2MgPT0gQ19ESVNDT05ORUNUSU5HKQotCQljb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TKGNvbm4sIENfU1RBTkRBTE9ORSksIENTX1ZFUkJPU0UgfCBDU19IQVJEKTsKKwkJY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfU1RBTkRBTE9ORSksIENTX1ZFUkJPU0UgfCBDU19IQVJEKTsKIH0KIAotc3RhdGljIGludCBkcmJkX2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGludCBkcmJkX2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXVuc2lnbmVkIGludCBpOwogCiAJLyogd2FpdCBmb3IgY3VycmVudCBhY3Rpdml0eSB0byBjZWFzZS4gKi8KLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCV9kcmJkX3dhaXRfZWVfbGlzdF9lbXB0eShtZGV2LCAmbWRldi0+YWN0aXZlX2VlKTsKLQlfZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkobWRldiwgJm1kZXYtPnN5bmNfZWUpOwotCV9kcmJkX3dhaXRfZWVfbGlzdF9lbXB0eShtZGV2LCAmbWRldi0+cmVhZF9lZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlfZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkoZGV2aWNlLCAmZGV2aWNlLT5hY3RpdmVfZWUpOworCV9kcmJkX3dhaXRfZWVfbGlzdF9lbXB0eShkZXZpY2UsICZkZXZpY2UtPnN5bmNfZWUpOworCV9kcmJkX3dhaXRfZWVfbGlzdF9lbXB0eShkZXZpY2UsICZkZXZpY2UtPnJlYWRfZWUpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJLyogV2UgZG8gbm90IGhhdmUgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgd291bGQgYWxsb3cgdXMgdG8KIAkgKiBnZXQgdGhlIHJzX3BlbmRpbmdfY250IGRvd24gdG8gMCBhZ2Fpbi4KQEAgLTQ1MDUsNDIgKzQ1NTcsNDIgQEAKIAkgKiAgcmVzeW5jX0xSVS4gVGhlIHJlc3luY19MUlUgdHJhY2tzIHRoZSB3aG9sZSBvcGVyYXRpb24gaW5jbHVkaW5nCiAJICogIHRoZSBkaXNrLUlPLCB3aGlsZSB0aGUgcnNfcGVuZGluZ19jbnQgb25seSB0cmFja3MgdGhlIGJsb2NrcwogCSAqICBvbiB0aGUgZmx5LiAqLwotCWRyYmRfcnNfY2FuY2VsX2FsbChtZGV2KTsKLQltZGV2LT5yc190b3RhbCA9IDA7Ci0JbWRldi0+cnNfZmFpbGVkID0gMDsKLQlhdG9taWNfc2V0KCZtZGV2LT5yc19wZW5kaW5nX2NudCwgMCk7Ci0Jd2FrZV91cCgmbWRldi0+bWlzY193YWl0KTsKKwlkcmJkX3JzX2NhbmNlbF9hbGwoZGV2aWNlKTsKKwlkZXZpY2UtPnJzX3RvdGFsID0gMDsKKwlkZXZpY2UtPnJzX2ZhaWxlZCA9IDA7CisJYXRvbWljX3NldCgmZGV2aWNlLT5yc19wZW5kaW5nX2NudCwgMCk7CisJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOwogCi0JZGVsX3RpbWVyX3N5bmMoJm1kZXYtPnJlc3luY190aW1lcik7Ci0JcmVzeW5jX3RpbWVyX2ZuKCh1bnNpZ25lZCBsb25nKW1kZXYpOworCWRlbF90aW1lcl9zeW5jKCZkZXZpY2UtPnJlc3luY190aW1lcik7CisJcmVzeW5jX3RpbWVyX2ZuKCh1bnNpZ25lZCBsb25nKWRldmljZSk7CiAKIAkvKiB3YWl0IGZvciBhbGwgd19lX2VuZF9kYXRhX3JlcSwgd19lX2VuZF9yc2RhdGFfcmVxLCB3X3NlbmRfYmFycmllciwKIAkgKiB3X21ha2VfcmVzeW5jX3JlcXVlc3QgZXRjLiB3aGljaCBtYXkgc3RpbGwgYmUgb24gdGhlIHdvcmtlciBxdWV1ZQogCSAqIHRvIGJlICJjYW5jZWxlZCIgKi8KLQlkcmJkX2ZsdXNoX3dvcmtxdWV1ZShtZGV2KTsKKwlkcmJkX2ZsdXNoX3dvcmtxdWV1ZSgmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrKTsKIAotCWRyYmRfZmluaXNoX3BlZXJfcmVxcyhtZGV2KTsKKwlkcmJkX2ZpbmlzaF9wZWVyX3JlcXMoZGV2aWNlKTsKIAogCS8qIFRoaXMgc2Vjb25kIHdvcmtxdWV1ZSBmbHVzaCBpcyBuZWNlc3NhcnksIHNpbmNlIGRyYmRfZmluaXNoX3BlZXJfcmVxcygpCiAJICAgbWlnaHQgaGF2ZSBpc3N1ZWQgYSB3b3JrIGFnYWluLiBUaGUgb25lIGJlZm9yZSBkcmJkX2ZpbmlzaF9wZWVyX3JlcXMoKSBpcwogCSAgIG5lY2Vzc2FyeSB0byByZWNsYWluIG5ldF9lZSBpbiBkcmJkX2ZpbmlzaF9wZWVyX3JlcXMoKS4gKi8KLQlkcmJkX2ZsdXNoX3dvcmtxdWV1ZShtZGV2KTsKKwlkcmJkX2ZsdXNoX3dvcmtxdWV1ZSgmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrKTsKIAogCS8qIG5lZWQgdG8gZG8gaXQgYWdhaW4sIGRyYmRfZmluaXNoX3BlZXJfcmVxcygpIG1heSBoYXZlIHBvcHVsYXRlZCBpdAogCSAqIGFnYWluIHZpYSBkcmJkX3RyeV9jbGVhcl9vbl9kaXNrX2JtKCkuICovCi0JZHJiZF9yc19jYW5jZWxfYWxsKG1kZXYpOworCWRyYmRfcnNfY2FuY2VsX2FsbChkZXZpY2UpOwogCi0Ja2ZyZWUobWRldi0+cF91dWlkKTsKLQltZGV2LT5wX3V1aWQgPSBOVUxMOworCWtmcmVlKGRldmljZS0+cF91dWlkKTsKKwlkZXZpY2UtPnBfdXVpZCA9IE5VTEw7CiAKLQlpZiAoIWRyYmRfc3VzcGVuZGVkKG1kZXYpKQotCQl0bF9jbGVhcihtZGV2LT50Y29ubik7CisJaWYgKCFkcmJkX3N1c3BlbmRlZChkZXZpY2UpKQorCQl0bF9jbGVhcihwZWVyX2RldmljZS0+Y29ubmVjdGlvbik7CiAKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAKIAkvKiBzZXJpYWxpemUgd2l0aCBiaXRtYXAgd3JpdGVvdXQgdHJpZ2dlcmVkIGJ5IHRoZSBzdGF0ZSBjaGFuZ2UsCiAJICogaWYgYW55LiAqLwotCXdhaXRfZXZlbnQobWRldi0+bWlzY193YWl0LCAhdGVzdF9iaXQoQklUTUFQX0lPLCAmbWRldi0+ZmxhZ3MpKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+bWlzY193YWl0LCAhdGVzdF9iaXQoQklUTUFQX0lPLCAmZGV2aWNlLT5mbGFncykpOwogCiAJLyogdGNwX2Nsb3NlIGFuZCByZWxlYXNlIG9mIHNlbmRwYWdlIHBhZ2VzIGNhbiBiZSBkZWZlcnJlZC4gIEkgZG9uJ3QKIAkgKiB3YW50IHRvIHVzZSBTT19MSU5HRVIsIGJlY2F1c2UgYXBwYXJlbnRseSBpdCBjYW4gYmUgZGVmZXJyZWQgZm9yCkBAIC00NTQ5LDIwICs0NjAxLDIwIEBACiAJICogQWN0dWFsbHkgd2UgZG9uJ3QgY2FyZSBmb3IgZXhhY3RseSB3aGVuIHRoZSBuZXR3b3JrIHN0YWNrIGRvZXMgaXRzCiAJICogcHV0X3BhZ2UoKSwgYnV0IHJlbGVhc2Ugb3VyIHJlZmVyZW5jZSBvbiB0aGVzZSBwYWdlcyByaWdodCBoZXJlLgogCSAqLwotCWkgPSBkcmJkX2ZyZWVfcGVlcl9yZXFzKG1kZXYsICZtZGV2LT5uZXRfZWUpOworCWkgPSBkcmJkX2ZyZWVfcGVlcl9yZXFzKGRldmljZSwgJmRldmljZS0+bmV0X2VlKTsKIAlpZiAoaSkKLQkJZGV2X2luZm8oREVWLCAibmV0X2VlIG5vdCBlbXB0eSwga2lsbGVkICV1IGVudHJpZXNcbiIsIGkpOwotCWkgPSBhdG9taWNfcmVhZCgmbWRldi0+cHBfaW5fdXNlX2J5X25ldCk7CisJCWRyYmRfaW5mbyhkZXZpY2UsICJuZXRfZWUgbm90IGVtcHR5LCBraWxsZWQgJXUgZW50cmllc1xuIiwgaSk7CisJaSA9IGF0b21pY19yZWFkKCZkZXZpY2UtPnBwX2luX3VzZV9ieV9uZXQpOwogCWlmIChpKQotCQlkZXZfaW5mbyhERVYsICJwcF9pbl91c2VfYnlfbmV0ID0gJWQsIGV4cGVjdGVkIDBcbiIsIGkpOwotCWkgPSBhdG9taWNfcmVhZCgmbWRldi0+cHBfaW5fdXNlKTsKKwkJZHJiZF9pbmZvKGRldmljZSwgInBwX2luX3VzZV9ieV9uZXQgPSAlZCwgZXhwZWN0ZWQgMFxuIiwgaSk7CisJaSA9IGF0b21pY19yZWFkKCZkZXZpY2UtPnBwX2luX3VzZSk7CiAJaWYgKGkpCi0JCWRldl9pbmZvKERFViwgInBwX2luX3VzZSA9ICVkLCBleHBlY3RlZCAwXG4iLCBpKTsKKwkJZHJiZF9pbmZvKGRldmljZSwgInBwX2luX3VzZSA9ICVkLCBleHBlY3RlZCAwXG4iLCBpKTsKIAotCURfQVNTRVJUKGxpc3RfZW1wdHkoJm1kZXYtPnJlYWRfZWUpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5hY3RpdmVfZWUpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5zeW5jX2VlKSk7Ci0JRF9BU1NFUlQobGlzdF9lbXB0eSgmbWRldi0+ZG9uZV9lZSkpOworCURfQVNTRVJUKGRldmljZSwgbGlzdF9lbXB0eSgmZGV2aWNlLT5yZWFkX2VlKSk7CisJRF9BU1NFUlQoZGV2aWNlLCBsaXN0X2VtcHR5KCZkZXZpY2UtPmFjdGl2ZV9lZSkpOworCURfQVNTRVJUKGRldmljZSwgbGlzdF9lbXB0eSgmZGV2aWNlLT5zeW5jX2VlKSk7CisJRF9BU1NFUlQoZGV2aWNlLCBsaXN0X2VtcHR5KCZkZXZpY2UtPmRvbmVfZWUpKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDU3NiwxOSArNDYyOCwxOSBAQAogICoKICAqIGZvciBub3csIHRoZXkgYXJlIGV4cGVjdGVkIHRvIGJlIHplcm8sIGJ1dCBpZ25vcmVkLgogICovCi1zdGF0aWMgaW50IGRyYmRfc2VuZF9mZWF0dXJlcyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitzdGF0aWMgaW50IGRyYmRfc2VuZF9mZWF0dXJlcyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAlzdHJ1Y3QgcF9jb25uZWN0aW9uX2ZlYXR1cmVzICpwOwogCi0Jc29jayA9ICZ0Y29ubi0+ZGF0YTsKLQlwID0gY29ubl9wcmVwYXJlX2NvbW1hbmQodGNvbm4sIHNvY2spOworCXNvY2sgPSAmY29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gY29ubl9wcmVwYXJlX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jayk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTzsKIAltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CiAJcC0+cHJvdG9jb2xfbWluID0gY3B1X3RvX2JlMzIoUFJPX1ZFUlNJT05fTUlOKTsKIAlwLT5wcm90b2NvbF9tYXggPSBjcHVfdG9fYmUzMihQUk9fVkVSU0lPTl9NQVgpOwotCXJldHVybiBjb25uX3NlbmRfY29tbWFuZCh0Y29ubiwgc29jaywgUF9DT05ORUNUSU9OX0ZFQVRVUkVTLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKKwlyZXR1cm4gY29ubl9zZW5kX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jaywgUF9DT05ORUNUSU9OX0ZFQVRVUkVTLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAogLyoKQEAgLTQ1OTgsMzYgKzQ2NTAsMzYgQEAKICAqICAtMSBwZWVyIHRhbGtzIGRpZmZlcmVudCBsYW5ndWFnZSwKICAqICAgICBubyBwb2ludCBpbiB0cnlpbmcgYWdhaW4sIHBsZWFzZSBnbyBzdGFuZGFsb25lLgogICovCi1zdGF0aWMgaW50IGRyYmRfZG9fZmVhdHVyZXMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIGludCBkcmJkX2RvX2ZlYXR1cmVzKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0JLyogQVNTRVJUIGN1cnJlbnQgPT0gdGNvbm4tPnJlY2VpdmVyIC4uLiAqLworCS8qIEFTU0VSVCBjdXJyZW50ID09IGNvbm5lY3Rpb24tPnJlY2VpdmVyIC4uLiAqLwogCXN0cnVjdCBwX2Nvbm5lY3Rpb25fZmVhdHVyZXMgKnA7CiAJY29uc3QgaW50IGV4cGVjdCA9IHNpemVvZihzdHJ1Y3QgcF9jb25uZWN0aW9uX2ZlYXR1cmVzKTsKIAlzdHJ1Y3QgcGFja2V0X2luZm8gcGk7CiAJaW50IGVycjsKIAotCWVyciA9IGRyYmRfc2VuZF9mZWF0dXJlcyh0Y29ubik7CisJZXJyID0gZHJiZF9zZW5kX2ZlYXR1cmVzKGNvbm5lY3Rpb24pOwogCWlmIChlcnIpCiAJCXJldHVybiAwOwogCi0JZXJyID0gZHJiZF9yZWN2X2hlYWRlcih0Y29ubiwgJnBpKTsKKwllcnIgPSBkcmJkX3JlY3ZfaGVhZGVyKGNvbm5lY3Rpb24sICZwaSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIDA7CiAKIAlpZiAocGkuY21kICE9IFBfQ09OTkVDVElPTl9GRUFUVVJFUykgewotCQljb25uX2Vycih0Y29ubiwgImV4cGVjdGVkIENvbm5lY3Rpb25GZWF0dXJlcyBwYWNrZXQsIHJlY2VpdmVkOiAlcyAoMHglMDR4KVxuIiwKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImV4cGVjdGVkIENvbm5lY3Rpb25GZWF0dXJlcyBwYWNrZXQsIHJlY2VpdmVkOiAlcyAoMHglMDR4KVxuIiwKIAkJCSBjbWRuYW1lKHBpLmNtZCksIHBpLmNtZCk7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAocGkuc2l6ZSAhPSBleHBlY3QpIHsKLQkJY29ubl9lcnIodGNvbm4sICJleHBlY3RlZCBDb25uZWN0aW9uRmVhdHVyZXMgbGVuZ3RoOiAldSwgcmVjZWl2ZWQ6ICV1XG4iLAorCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiZXhwZWN0ZWQgQ29ubmVjdGlvbkZlYXR1cmVzIGxlbmd0aDogJXUsIHJlY2VpdmVkOiAldVxuIiwKIAkJICAgICBleHBlY3QsIHBpLnNpemUpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJcCA9IHBpLmRhdGE7Ci0JZXJyID0gZHJiZF9yZWN2X2FsbF93YXJuKHRjb25uLCBwLCBleHBlY3QpOworCWVyciA9IGRyYmRfcmVjdl9hbGxfd2Fybihjb25uZWN0aW9uLCBwLCBleHBlY3QpOwogCWlmIChlcnIpCiAJCXJldHVybiAwOwogCkBAIC00NjQwLDE1ICs0NjkyLDE1IEBACiAJICAgIFBST19WRVJTSU9OX01JTiA+IHAtPnByb3RvY29sX21heCkKIAkJZ290byBpbmNvbXBhdDsKIAotCXRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPSBtaW5fdChpbnQsIFBST19WRVJTSU9OX01BWCwgcC0+cHJvdG9jb2xfbWF4KTsKKwljb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPSBtaW5fdChpbnQsIFBST19WRVJTSU9OX01BWCwgcC0+cHJvdG9jb2xfbWF4KTsKIAotCWNvbm5faW5mbyh0Y29ubiwgIkhhbmRzaGFrZSBzdWNjZXNzZnVsOiAiCi0JICAgICAiQWdyZWVkIG5ldHdvcmsgcHJvdG9jb2wgdmVyc2lvbiAlZFxuIiwgdGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbik7CisJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJIYW5kc2hha2Ugc3VjY2Vzc2Z1bDogIgorCSAgICAgIkFncmVlZCBuZXR3b3JrIHByb3RvY29sIHZlcnNpb24gJWRcbiIsIGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbik7CiAKIAlyZXR1cm4gMTsKIAogIGluY29tcGF0OgotCWNvbm5fZXJyKHRjb25uLCAiaW5jb21wYXRpYmxlIERSQkQgZGlhbGVjdHM6ICIKKwlkcmJkX2Vycihjb25uZWN0aW9uLCAiaW5jb21wYXRpYmxlIERSQkQgZGlhbGVjdHM6ICIKIAkgICAgIkkgc3VwcG9ydCAlZC0lZCwgcGVlciBzdXBwb3J0cyAlZC0lZFxuIiwKIAkgICAgUFJPX1ZFUlNJT05fTUlOLCBQUk9fVkVSU0lPTl9NQVgsCiAJICAgIHAtPnByb3RvY29sX21pbiwgcC0+cHJvdG9jb2xfbWF4KTsKQEAgLTQ2NTYsMTAgKzQ3MDgsMTAgQEAKIH0KIAogI2lmICFkZWZpbmVkKENPTkZJR19DUllQVE9fSE1BQykgJiYgIWRlZmluZWQoQ09ORklHX0NSWVBUT19ITUFDX01PRFVMRSkKLXN0YXRpYyBpbnQgZHJiZF9kb19hdXRoKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3N0YXRpYyBpbnQgZHJiZF9kb19hdXRoKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0JY29ubl9lcnIodGNvbm4sICJUaGlzIGtlcm5lbCB3YXMgYnVpbGQgd2l0aG91dCBDT05GSUdfQ1JZUFRPX0hNQUMuXG4iKTsKLQljb25uX2Vycih0Y29ubiwgIllvdSBuZWVkIHRvIGRpc2FibGUgJ2NyYW0taG1hYy1hbGcnIGluIGRyYmQuY29uZi5cbiIpOworCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJUaGlzIGtlcm5lbCB3YXMgYnVpbGQgd2l0aG91dCBDT05GSUdfQ1JZUFRPX0hNQUMuXG4iKTsKKwlkcmJkX2Vycihjb25uZWN0aW9uLCAiWW91IG5lZWQgdG8gZGlzYWJsZSAnY3JhbS1obWFjLWFsZycgaW4gZHJiZC5jb25mLlxuIik7CiAJcmV0dXJuIC0xOwogfQogI2Vsc2UKQEAgLTQ2NzEsNyArNDcyMyw3IEBACiAJLTEgLSBhdXRoIGZhaWxlZCwgZG9uJ3QgdHJ5IGFnYWluLgogKi8KIAotc3RhdGljIGludCBkcmJkX2RvX2F1dGgoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIGludCBkcmJkX2RvX2F1dGgoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJY2hhciBteV9jaGFsbGVuZ2VbQ0hBTExFTkdFX0xFTl07ICAvKiA2NCBCeXRlcy4uLiAqLwpAQCAtNDY5MCw2OSArNDc0Miw2OSBAQAogCS8qIEZJWE1FOiBQdXQgdGhlIGNoYWxsZW5nZS9yZXNwb25zZSBpbnRvIHRoZSBwcmVhbGxvY2F0ZWQgc29ja2V0IGJ1ZmZlci4gICovCiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbmMgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKTsKKwluYyA9IHJjdV9kZXJlZmVyZW5jZShjb25uZWN0aW9uLT5uZXRfY29uZik7CiAJa2V5X2xlbiA9IHN0cmxlbihuYy0+c2hhcmVkX3NlY3JldCk7CiAJbWVtY3B5KHNlY3JldCwgbmMtPnNoYXJlZF9zZWNyZXQsIGtleV9sZW4pOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JZGVzYy50Zm0gPSB0Y29ubi0+Y3JhbV9obWFjX3RmbTsKKwlkZXNjLnRmbSA9IGNvbm5lY3Rpb24tPmNyYW1faG1hY190Zm07CiAJZGVzYy5mbGFncyA9IDA7CiAKLQlydiA9IGNyeXB0b19oYXNoX3NldGtleSh0Y29ubi0+Y3JhbV9obWFjX3RmbSwgKHU4ICopc2VjcmV0LCBrZXlfbGVuKTsKKwlydiA9IGNyeXB0b19oYXNoX3NldGtleShjb25uZWN0aW9uLT5jcmFtX2htYWNfdGZtLCAodTggKilzZWNyZXQsIGtleV9sZW4pOwogCWlmIChydikgewotCQljb25uX2Vycih0Y29ubiwgImNyeXB0b19oYXNoX3NldGtleSgpIGZhaWxlZCB3aXRoICVkXG4iLCBydik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJjcnlwdG9faGFzaF9zZXRrZXkoKSBmYWlsZWQgd2l0aCAlZFxuIiwgcnYpOwogCQlydiA9IC0xOwogCQlnb3RvIGZhaWw7CiAJfQogCiAJZ2V0X3JhbmRvbV9ieXRlcyhteV9jaGFsbGVuZ2UsIENIQUxMRU5HRV9MRU4pOwogCi0Jc29jayA9ICZ0Y29ubi0+ZGF0YTsKLQlpZiAoIWNvbm5fcHJlcGFyZV9jb21tYW5kKHRjb25uLCBzb2NrKSkgeworCXNvY2sgPSAmY29ubmVjdGlvbi0+ZGF0YTsKKwlpZiAoIWNvbm5fcHJlcGFyZV9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2spKSB7CiAJCXJ2ID0gMDsKIAkJZ290byBmYWlsOwogCX0KLQlydiA9ICFjb25uX3NlbmRfY29tbWFuZCh0Y29ubiwgc29jaywgUF9BVVRIX0NIQUxMRU5HRSwgMCwKKwlydiA9ICFjb25uX3NlbmRfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrLCBQX0FVVEhfQ0hBTExFTkdFLCAwLAogCQkJCW15X2NoYWxsZW5nZSwgQ0hBTExFTkdFX0xFTik7CiAJaWYgKCFydikKIAkJZ290byBmYWlsOwogCi0JZXJyID0gZHJiZF9yZWN2X2hlYWRlcih0Y29ubiwgJnBpKTsKKwllcnIgPSBkcmJkX3JlY3ZfaGVhZGVyKGNvbm5lY3Rpb24sICZwaSk7CiAJaWYgKGVycikgewogCQlydiA9IDA7CiAJCWdvdG8gZmFpbDsKIAl9CiAKIAlpZiAocGkuY21kICE9IFBfQVVUSF9DSEFMTEVOR0UpIHsKLQkJY29ubl9lcnIodGNvbm4sICJleHBlY3RlZCBBdXRoQ2hhbGxlbmdlIHBhY2tldCwgcmVjZWl2ZWQ6ICVzICgweCUwNHgpXG4iLAorCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiZXhwZWN0ZWQgQXV0aENoYWxsZW5nZSBwYWNrZXQsIHJlY2VpdmVkOiAlcyAoMHglMDR4KVxuIiwKIAkJCSBjbWRuYW1lKHBpLmNtZCksIHBpLmNtZCk7CiAJCXJ2ID0gMDsKIAkJZ290byBmYWlsOwogCX0KIAogCWlmIChwaS5zaXplID4gQ0hBTExFTkdFX0xFTiAqIDIpIHsKLQkJY29ubl9lcnIodGNvbm4sICJleHBlY3RlZCBBdXRoQ2hhbGxlbmdlIHBheWxvYWQgdG9vIGJpZy5cbiIpOworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiZXhwZWN0ZWQgQXV0aENoYWxsZW5nZSBwYXlsb2FkIHRvbyBiaWcuXG4iKTsKIAkJcnYgPSAtMTsKIAkJZ290byBmYWlsOwogCX0KIAogCXBlZXJzX2NoID0ga21hbGxvYyhwaS5zaXplLCBHRlBfTk9JTyk7CiAJaWYgKHBlZXJzX2NoID09IE5VTEwpIHsKLQkJY29ubl9lcnIodGNvbm4sICJrbWFsbG9jIG9mIHBlZXJzX2NoIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJrbWFsbG9jIG9mIHBlZXJzX2NoIGZhaWxlZFxuIik7CiAJCXJ2ID0gLTE7CiAJCWdvdG8gZmFpbDsKIAl9CiAKLQllcnIgPSBkcmJkX3JlY3ZfYWxsX3dhcm4odGNvbm4sIHBlZXJzX2NoLCBwaS5zaXplKTsKKwllcnIgPSBkcmJkX3JlY3ZfYWxsX3dhcm4oY29ubmVjdGlvbiwgcGVlcnNfY2gsIHBpLnNpemUpOwogCWlmIChlcnIpIHsKIAkJcnYgPSAwOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JcmVzcF9zaXplID0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZSh0Y29ubi0+Y3JhbV9obWFjX3RmbSk7CisJcmVzcF9zaXplID0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShjb25uZWN0aW9uLT5jcmFtX2htYWNfdGZtKTsKIAlyZXNwb25zZSA9IGttYWxsb2MocmVzcF9zaXplLCBHRlBfTk9JTyk7CiAJaWYgKHJlc3BvbnNlID09IE5VTEwpIHsKLQkJY29ubl9lcnIodGNvbm4sICJrbWFsbG9jIG9mIHJlc3BvbnNlIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJrbWFsbG9jIG9mIHJlc3BvbnNlIGZhaWxlZFxuIik7CiAJCXJ2ID0gLTE7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC00NzYyLDQwICs0ODE0LDQwIEBACiAKIAlydiA9IGNyeXB0b19oYXNoX2RpZ2VzdCgmZGVzYywgJnNnLCBzZy5sZW5ndGgsIHJlc3BvbnNlKTsKIAlpZiAocnYpIHsKLQkJY29ubl9lcnIodGNvbm4sICJjcnlwdG9faGFzaF9kaWdlc3QoKSBmYWlsZWQgd2l0aCAlZFxuIiwgcnYpOworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiY3J5cHRvX2hhc2hfZGlnZXN0KCkgZmFpbGVkIHdpdGggJWRcbiIsIHJ2KTsKIAkJcnYgPSAtMTsKIAkJZ290byBmYWlsOwogCX0KIAotCWlmICghY29ubl9wcmVwYXJlX2NvbW1hbmQodGNvbm4sIHNvY2spKSB7CisJaWYgKCFjb25uX3ByZXBhcmVfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrKSkgewogCQlydiA9IDA7CiAJCWdvdG8gZmFpbDsKIAl9Ci0JcnYgPSAhY29ubl9zZW5kX2NvbW1hbmQodGNvbm4sIHNvY2ssIFBfQVVUSF9SRVNQT05TRSwgMCwKKwlydiA9ICFjb25uX3NlbmRfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrLCBQX0FVVEhfUkVTUE9OU0UsIDAsCiAJCQkJcmVzcG9uc2UsIHJlc3Bfc2l6ZSk7CiAJaWYgKCFydikKIAkJZ290byBmYWlsOwogCi0JZXJyID0gZHJiZF9yZWN2X2hlYWRlcih0Y29ubiwgJnBpKTsKKwllcnIgPSBkcmJkX3JlY3ZfaGVhZGVyKGNvbm5lY3Rpb24sICZwaSk7CiAJaWYgKGVycikgewogCQlydiA9IDA7CiAJCWdvdG8gZmFpbDsKIAl9CiAKIAlpZiAocGkuY21kICE9IFBfQVVUSF9SRVNQT05TRSkgewotCQljb25uX2Vycih0Y29ubiwgImV4cGVjdGVkIEF1dGhSZXNwb25zZSBwYWNrZXQsIHJlY2VpdmVkOiAlcyAoMHglMDR4KVxuIiwKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImV4cGVjdGVkIEF1dGhSZXNwb25zZSBwYWNrZXQsIHJlY2VpdmVkOiAlcyAoMHglMDR4KVxuIiwKIAkJCSBjbWRuYW1lKHBpLmNtZCksIHBpLmNtZCk7CiAJCXJ2ID0gMDsKIAkJZ290byBmYWlsOwogCX0KIAogCWlmIChwaS5zaXplICE9IHJlc3Bfc2l6ZSkgewotCQljb25uX2Vycih0Y29ubiwgImV4cGVjdGVkIEF1dGhSZXNwb25zZSBwYXlsb2FkIG9mIHdyb25nIHNpemVcbiIpOworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiZXhwZWN0ZWQgQXV0aFJlc3BvbnNlIHBheWxvYWQgb2Ygd3Jvbmcgc2l6ZVxuIik7CiAJCXJ2ID0gMDsKIAkJZ290byBmYWlsOwogCX0KIAotCWVyciA9IGRyYmRfcmVjdl9hbGxfd2Fybih0Y29ubiwgcmVzcG9uc2UgLCByZXNwX3NpemUpOworCWVyciA9IGRyYmRfcmVjdl9hbGxfd2Fybihjb25uZWN0aW9uLCByZXNwb25zZSAsIHJlc3Bfc2l6ZSk7CiAJaWYgKGVycikgewogCQlydiA9IDA7CiAJCWdvdG8gZmFpbDsKQEAgLTQ4MDMsNyArNDg1NSw3IEBACiAKIAlyaWdodF9yZXNwb25zZSA9IGttYWxsb2MocmVzcF9zaXplLCBHRlBfTk9JTyk7CiAJaWYgKHJpZ2h0X3Jlc3BvbnNlID09IE5VTEwpIHsKLQkJY29ubl9lcnIodGNvbm4sICJrbWFsbG9jIG9mIHJpZ2h0X3Jlc3BvbnNlIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJrbWFsbG9jIG9mIHJpZ2h0X3Jlc3BvbnNlIGZhaWxlZFxuIik7CiAJCXJ2ID0gLTE7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC00ODEyLDcgKzQ4NjQsNyBAQAogCiAJcnYgPSBjcnlwdG9faGFzaF9kaWdlc3QoJmRlc2MsICZzZywgc2cubGVuZ3RoLCByaWdodF9yZXNwb25zZSk7CiAJaWYgKHJ2KSB7Ci0JCWNvbm5fZXJyKHRjb25uLCAiY3J5cHRvX2hhc2hfZGlnZXN0KCkgZmFpbGVkIHdpdGggJWRcbiIsIHJ2KTsKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImNyeXB0b19oYXNoX2RpZ2VzdCgpIGZhaWxlZCB3aXRoICVkXG4iLCBydik7CiAJCXJ2ID0gLTE7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC00ODIwLDcgKzQ4NzIsNyBAQAogCXJ2ID0gIW1lbWNtcChyZXNwb25zZSwgcmlnaHRfcmVzcG9uc2UsIHJlc3Bfc2l6ZSk7CiAKIAlpZiAocnYpCi0JCWNvbm5faW5mbyh0Y29ubiwgIlBlZXIgYXV0aGVudGljYXRlZCB1c2luZyAlZCBieXRlcyBITUFDXG4iLAorCQlkcmJkX2luZm8oY29ubmVjdGlvbiwgIlBlZXIgYXV0aGVudGljYXRlZCB1c2luZyAlZCBieXRlcyBITUFDXG4iLAogCQkgICAgIHJlc3Bfc2l6ZSk7CiAJZWxzZQogCQlydiA9IC0xOwpAQCAtNDgzNCwxNjMgKzQ4ODYsMTY5IEBACiB9CiAjZW5kaWYKIAotaW50IGRyYmRkX2luaXQoc3RydWN0IGRyYmRfdGhyZWFkICp0aGkpCitpbnQgZHJiZF9yZWNlaXZlcihzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSkKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSB0aGktPnRjb25uOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSB0aGktPmNvbm5lY3Rpb247CiAJaW50IGg7CiAKLQljb25uX2luZm8odGNvbm4sICJyZWNlaXZlciAocmUpc3RhcnRlZFxuIik7CisJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJyZWNlaXZlciAocmUpc3RhcnRlZFxuIik7CiAKIAlkbyB7Ci0JCWggPSBjb25uX2Nvbm5lY3QodGNvbm4pOworCQloID0gY29ubl9jb25uZWN0KGNvbm5lY3Rpb24pOwogCQlpZiAoaCA9PSAwKSB7Ci0JCQljb25uX2Rpc2Nvbm5lY3QodGNvbm4pOworCQkJY29ubl9kaXNjb25uZWN0KGNvbm5lY3Rpb24pOwogCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKEhaKTsKIAkJfQogCQlpZiAoaCA9PSAtMSkgewotCQkJY29ubl93YXJuKHRjb25uLCAiRGlzY2FyZGluZyBuZXR3b3JrIGNvbmZpZ3VyYXRpb24uXG4iKTsKLQkJCWNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CisJCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgIkRpc2NhcmRpbmcgbmV0d29yayBjb25maWd1cmF0aW9uLlxuIik7CisJCQljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CiAJCX0KIAl9IHdoaWxlIChoID09IDApOwogCiAJaWYgKGggPiAwKQotCQlkcmJkZCh0Y29ubik7CisJCWRyYmRkKGNvbm5lY3Rpb24pOwogCi0JY29ubl9kaXNjb25uZWN0KHRjb25uKTsKKwljb25uX2Rpc2Nvbm5lY3QoY29ubmVjdGlvbik7CiAKLQljb25uX2luZm8odGNvbm4sICJyZWNlaXZlciB0ZXJtaW5hdGVkXG4iKTsKKwlkcmJkX2luZm8oY29ubmVjdGlvbiwgInJlY2VpdmVyIHRlcm1pbmF0ZWRcbiIpOwogCXJldHVybiAwOwogfQogCiAvKiAqKioqKioqKiogYWNrbm93bGVkZ2Ugc2VuZGVyICoqKioqKioqICovCiAKLXN0YXRpYyBpbnQgZ290X2Nvbm5fUnFTUmVwbHkoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCBnb3RfY29ubl9ScVNSZXBseShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewogCXN0cnVjdCBwX3JlcV9zdGF0ZV9yZXBseSAqcCA9IHBpLT5kYXRhOwogCWludCByZXRjb2RlID0gYmUzMl90b19jcHUocC0+cmV0Y29kZSk7CiAKIAlpZiAocmV0Y29kZSA+PSBTU19TVUNDRVNTKSB7Ci0JCXNldF9iaXQoQ09OTl9XRF9TVF9DSEdfT0tBWSwgJnRjb25uLT5mbGFncyk7CisJCXNldF9iaXQoQ09OTl9XRF9TVF9DSEdfT0tBWSwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAl9IGVsc2UgewotCQlzZXRfYml0KENPTk5fV0RfU1RfQ0hHX0ZBSUwsICZ0Y29ubi0+ZmxhZ3MpOwotCQljb25uX2Vycih0Y29ubiwgIlJlcXVlc3RlZCBzdGF0ZSBjaGFuZ2UgZmFpbGVkIGJ5IHBlZXI6ICVzICglZClcbiIsCisJCXNldF9iaXQoQ09OTl9XRF9TVF9DSEdfRkFJTCwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIlJlcXVlc3RlZCBzdGF0ZSBjaGFuZ2UgZmFpbGVkIGJ5IHBlZXI6ICVzICglZClcbiIsCiAJCQkgZHJiZF9zZXRfc3RfZXJyX3N0cihyZXRjb2RlKSwgcmV0Y29kZSk7CiAJfQotCXdha2VfdXAoJnRjb25uLT5waW5nX3dhaXQpOworCXdha2VfdXAoJmNvbm5lY3Rpb24tPnBpbmdfd2FpdCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnb3RfUnFTUmVwbHkoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCBnb3RfUnFTUmVwbHkoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9yZXFfc3RhdGVfcmVwbHkgKnAgPSBwaS0+ZGF0YTsKIAlpbnQgcmV0Y29kZSA9IGJlMzJfdG9fY3B1KHAtPnJldGNvZGUpOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCisJcGVlcl9kZXZpY2UgPSBjb25uX3BlZXJfZGV2aWNlKGNvbm5lY3Rpb24sIHBpLT52bnIpOworCWlmICghcGVlcl9kZXZpY2UpCiAJCXJldHVybiAtRUlPOworCWRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAKLQlpZiAodGVzdF9iaXQoQ09OTl9XRF9TVF9DSEdfUkVRLCAmdGNvbm4tPmZsYWdzKSkgewotCQlEX0FTU0VSVCh0Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgMTAwKTsKLQkJcmV0dXJuIGdvdF9jb25uX1JxU1JlcGx5KHRjb25uLCBwaSk7CisJaWYgKHRlc3RfYml0KENPTk5fV0RfU1RfQ0hHX1JFUSwgJmNvbm5lY3Rpb24tPmZsYWdzKSkgeworCQlEX0FTU0VSVChkZXZpY2UsIGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDEwMCk7CisJCXJldHVybiBnb3RfY29ubl9ScVNSZXBseShjb25uZWN0aW9uLCBwaSk7CiAJfQogCiAJaWYgKHJldGNvZGUgPj0gU1NfU1VDQ0VTUykgewotCQlzZXRfYml0KENMX1NUX0NIR19TVUNDRVNTLCAmbWRldi0+ZmxhZ3MpOworCQlzZXRfYml0KENMX1NUX0NIR19TVUNDRVNTLCAmZGV2aWNlLT5mbGFncyk7CiAJfSBlbHNlIHsKLQkJc2V0X2JpdChDTF9TVF9DSEdfRkFJTCwgJm1kZXYtPmZsYWdzKTsKLQkJZGV2X2VycihERVYsICJSZXF1ZXN0ZWQgc3RhdGUgY2hhbmdlIGZhaWxlZCBieSBwZWVyOiAlcyAoJWQpXG4iLAorCQlzZXRfYml0KENMX1NUX0NIR19GQUlMLCAmZGV2aWNlLT5mbGFncyk7CisJCWRyYmRfZXJyKGRldmljZSwgIlJlcXVlc3RlZCBzdGF0ZSBjaGFuZ2UgZmFpbGVkIGJ5IHBlZXI6ICVzICglZClcbiIsCiAJCQlkcmJkX3NldF9zdF9lcnJfc3RyKHJldGNvZGUpLCByZXRjb2RlKTsKIAl9Ci0Jd2FrZV91cCgmbWRldi0+c3RhdGVfd2FpdCk7CisJd2FrZV91cCgmZGV2aWNlLT5zdGF0ZV93YWl0KTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdvdF9QaW5nKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgZ290X1Bpbmcoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlyZXR1cm4gZHJiZF9zZW5kX3BpbmdfYWNrKHRjb25uKTsKKwlyZXR1cm4gZHJiZF9zZW5kX3BpbmdfYWNrKGNvbm5lY3Rpb24pOwogCiB9CiAKLXN0YXRpYyBpbnQgZ290X1BpbmdBY2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCBnb3RfUGluZ0FjayhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewogCS8qIHJlc3RvcmUgaWRsZSB0aW1lb3V0ICovCi0JdGNvbm4tPm1ldGEuc29ja2V0LT5zay0+c2tfcmN2dGltZW8gPSB0Y29ubi0+bmV0X2NvbmYtPnBpbmdfaW50KkhaOwotCWlmICghdGVzdF9hbmRfc2V0X2JpdChHT1RfUElOR19BQ0ssICZ0Y29ubi0+ZmxhZ3MpKQotCQl3YWtlX3VwKCZ0Y29ubi0+cGluZ193YWl0KTsKKwljb25uZWN0aW9uLT5tZXRhLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvID0gY29ubmVjdGlvbi0+bmV0X2NvbmYtPnBpbmdfaW50KkhaOworCWlmICghdGVzdF9hbmRfc2V0X2JpdChHT1RfUElOR19BQ0ssICZjb25uZWN0aW9uLT5mbGFncykpCisJCXdha2VfdXAoJmNvbm5lY3Rpb24tPnBpbmdfd2FpdCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnb3RfSXNJblN5bmMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCBnb3RfSXNJblN5bmMoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9ibG9ja19hY2sgKnAgPSBwaS0+ZGF0YTsKIAlzZWN0b3JfdCBzZWN0b3IgPSBiZTY0X3RvX2NwdShwLT5zZWN0b3IpOwogCWludCBibGtzaXplID0gYmUzMl90b19jcHUocC0+Ymxrc2l6ZSk7CiAKLQltZGV2ID0gdm5yX3RvX21kZXYodGNvbm4sIHBpLT52bnIpOwotCWlmICghbWRldikKKwlwZWVyX2RldmljZSA9IGNvbm5fcGVlcl9kZXZpY2UoY29ubmVjdGlvbiwgcGktPnZucik7CisJaWYgKCFwZWVyX2RldmljZSkKIAkJcmV0dXJuIC1FSU87CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAotCURfQVNTRVJUKG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gODkpOworCURfQVNTRVJUKGRldmljZSwgcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA4OSk7CiAKLQl1cGRhdGVfcGVlcl9zZXEobWRldiwgYmUzMl90b19jcHUocC0+c2VxX251bSkpOworCXVwZGF0ZV9wZWVyX3NlcShwZWVyX2RldmljZSwgYmUzMl90b19jcHUocC0+c2VxX251bSkpOwogCi0JaWYgKGdldF9sZGV2KG1kZXYpKSB7Ci0JCWRyYmRfcnNfY29tcGxldGVfaW8obWRldiwgc2VjdG9yKTsKLQkJZHJiZF9zZXRfaW5fc3luYyhtZGV2LCBzZWN0b3IsIGJsa3NpemUpOworCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CisJCWRyYmRfcnNfY29tcGxldGVfaW8oZGV2aWNlLCBzZWN0b3IpOworCQlkcmJkX3NldF9pbl9zeW5jKGRldmljZSwgc2VjdG9yLCBibGtzaXplKTsKIAkJLyogcnNfc2FtZV9jc3VtcyBpcyBzdXBwb3NlZCB0byBjb3VudCBpbiB1bml0cyBvZiBCTV9CTE9DS19TSVpFICovCi0JCW1kZXYtPnJzX3NhbWVfY3N1bSArPSAoYmxrc2l6ZSA+PiBCTV9CTE9DS19TSElGVCk7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlkZXZpY2UtPnJzX3NhbWVfY3N1bSArPSAoYmxrc2l6ZSA+PiBCTV9CTE9DS19TSElGVCk7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQotCWRlY19yc19wZW5kaW5nKG1kZXYpOwotCWF0b21pY19hZGQoYmxrc2l6ZSA+PiA5LCAmbWRldi0+cnNfc2VjdF9pbik7CisJZGVjX3JzX3BlbmRpbmcoZGV2aWNlKTsKKwlhdG9taWNfYWRkKGJsa3NpemUgPj4gOSwgJmRldmljZS0+cnNfc2VjdF9pbik7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAotdmFsaWRhdGVfcmVxX2NoYW5nZV9yZXFfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdTY0IGlkLCBzZWN0b3JfdCBzZWN0b3IsCit2YWxpZGF0ZV9yZXFfY2hhbmdlX3JlcV9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdTY0IGlkLCBzZWN0b3JfdCBzZWN0b3IsCiAJCQkgICAgICBzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgY29uc3QgY2hhciAqZnVuYywKIAkJCSAgICAgIGVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCwgYm9vbCBtaXNzaW5nX29rKQogewogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcTsKIAlzdHJ1Y3QgYmlvX2FuZF9lcnJvciBtOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlyZXEgPSBmaW5kX3JlcXVlc3QobWRldiwgcm9vdCwgaWQsIHNlY3RvciwgbWlzc2luZ19vaywgZnVuYyk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCXJlcSA9IGZpbmRfcmVxdWVzdChkZXZpY2UsIHJvb3QsIGlkLCBzZWN0b3IsIG1pc3Npbmdfb2ssIGZ1bmMpOwogCWlmICh1bmxpa2VseSghcmVxKSkgewotCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJX19yZXFfbW9kKHJlcSwgd2hhdCwgJm0pOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAogCWlmIChtLmJpbykKLQkJY29tcGxldGVfbWFzdGVyX2JpbyhtZGV2LCAmbSk7CisJCWNvbXBsZXRlX21hc3Rlcl9iaW8oZGV2aWNlLCAmbSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ290X0Jsb2NrQWNrKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgZ290X0Jsb2NrQWNrKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IHBfYmxvY2tfYWNrICpwID0gcGktPmRhdGE7CiAJc2VjdG9yX3Qgc2VjdG9yID0gYmU2NF90b19jcHUocC0+c2VjdG9yKTsKIAlpbnQgYmxrc2l6ZSA9IGJlMzJfdG9fY3B1KHAtPmJsa3NpemUpOwogCWVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdDsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQorCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQogCQlyZXR1cm4gLUVJTzsKKwlkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCi0JdXBkYXRlX3BlZXJfc2VxKG1kZXYsIGJlMzJfdG9fY3B1KHAtPnNlcV9udW0pKTsKKwl1cGRhdGVfcGVlcl9zZXEocGVlcl9kZXZpY2UsIGJlMzJfdG9fY3B1KHAtPnNlcV9udW0pKTsKIAogCWlmIChwLT5ibG9ja19pZCA9PSBJRF9TWU5DRVIpIHsKLQkJZHJiZF9zZXRfaW5fc3luYyhtZGV2LCBzZWN0b3IsIGJsa3NpemUpOwotCQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKKwkJZHJiZF9zZXRfaW5fc3luYyhkZXZpY2UsIHNlY3RvciwgYmxrc2l6ZSk7CisJCWRlY19yc19wZW5kaW5nKGRldmljZSk7CiAJCXJldHVybiAwOwogCX0KIAlzd2l0Y2ggKHBpLT5jbWQpIHsKQEAgLTUwMTMsMzMgKzUwNzEsMzUgQEAKIAkJQlVHKCk7CiAJfQogCi0JcmV0dXJuIHZhbGlkYXRlX3JlcV9jaGFuZ2VfcmVxX3N0YXRlKG1kZXYsIHAtPmJsb2NrX2lkLCBzZWN0b3IsCi0JCQkJCSAgICAgJm1kZXYtPndyaXRlX3JlcXVlc3RzLCBfX2Z1bmNfXywKKwlyZXR1cm4gdmFsaWRhdGVfcmVxX2NoYW5nZV9yZXFfc3RhdGUoZGV2aWNlLCBwLT5ibG9ja19pZCwgc2VjdG9yLAorCQkJCQkgICAgICZkZXZpY2UtPndyaXRlX3JlcXVlc3RzLCBfX2Z1bmNfXywKIAkJCQkJICAgICB3aGF0LCBmYWxzZSk7CiB9CiAKLXN0YXRpYyBpbnQgZ290X05lZ0FjayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IGdvdF9OZWdBY2soc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9ibG9ja19hY2sgKnAgPSBwaS0+ZGF0YTsKIAlzZWN0b3JfdCBzZWN0b3IgPSBiZTY0X3RvX2NwdShwLT5zZWN0b3IpOwogCWludCBzaXplID0gYmUzMl90b19jcHUocC0+Ymxrc2l6ZSk7CiAJaW50IGVycjsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQorCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQogCQlyZXR1cm4gLUVJTzsKKwlkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCi0JdXBkYXRlX3BlZXJfc2VxKG1kZXYsIGJlMzJfdG9fY3B1KHAtPnNlcV9udW0pKTsKKwl1cGRhdGVfcGVlcl9zZXEocGVlcl9kZXZpY2UsIGJlMzJfdG9fY3B1KHAtPnNlcV9udW0pKTsKIAogCWlmIChwLT5ibG9ja19pZCA9PSBJRF9TWU5DRVIpIHsKLQkJZGVjX3JzX3BlbmRpbmcobWRldik7Ci0JCWRyYmRfcnNfZmFpbGVkX2lvKG1kZXYsIHNlY3Rvciwgc2l6ZSk7CisJCWRlY19yc19wZW5kaW5nKGRldmljZSk7CisJCWRyYmRfcnNfZmFpbGVkX2lvKGRldmljZSwgc2VjdG9yLCBzaXplKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JZXJyID0gdmFsaWRhdGVfcmVxX2NoYW5nZV9yZXFfc3RhdGUobWRldiwgcC0+YmxvY2tfaWQsIHNlY3RvciwKLQkJCQkJICAgICZtZGV2LT53cml0ZV9yZXF1ZXN0cywgX19mdW5jX18sCisJZXJyID0gdmFsaWRhdGVfcmVxX2NoYW5nZV9yZXFfc3RhdGUoZGV2aWNlLCBwLT5ibG9ja19pZCwgc2VjdG9yLAorCQkJCQkgICAgJmRldmljZS0+d3JpdGVfcmVxdWVzdHMsIF9fZnVuY19fLAogCQkJCQkgICAgTkVHX0FDS0VELCB0cnVlKTsKIAlpZiAoZXJyKSB7CiAJCS8qIFByb3RvY29sIEEgaGFzIG5vIFBfV1JJVEVfQUNLcywgYnV0IGhhcyBQX05FR19BQ0tzLgpAQCAtNTA0Nyw4MCArNTEwNyw4NiBAQAogCQkgICByZXF1ZXN0IGlzIG5vIGxvbmdlciBpbiB0aGUgY29sbGlzaW9uIGhhc2guICovCiAJCS8qIEluIFByb3RvY29sIEIgd2UgbWlnaHQgYWxyZWFkeSBoYXZlIGdvdCBhIFBfUkVDVl9BQ0sKIAkJICAgYnV0IHRoZW4gZ2V0IGEgUF9ORUdfQUNLIGFmdGVyd2FyZHMuICovCi0JCWRyYmRfc2V0X291dF9vZl9zeW5jKG1kZXYsIHNlY3Rvciwgc2l6ZSk7CisJCWRyYmRfc2V0X291dF9vZl9zeW5jKGRldmljZSwgc2VjdG9yLCBzaXplKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ290X05lZ0RSZXBseShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IGdvdF9OZWdEUmVwbHkoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9ibG9ja19hY2sgKnAgPSBwaS0+ZGF0YTsKIAlzZWN0b3JfdCBzZWN0b3IgPSBiZTY0X3RvX2NwdShwLT5zZWN0b3IpOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCisJcGVlcl9kZXZpY2UgPSBjb25uX3BlZXJfZGV2aWNlKGNvbm5lY3Rpb24sIHBpLT52bnIpOworCWlmICghcGVlcl9kZXZpY2UpCiAJCXJldHVybiAtRUlPOworCWRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAKLQl1cGRhdGVfcGVlcl9zZXEobWRldiwgYmUzMl90b19jcHUocC0+c2VxX251bSkpOworCXVwZGF0ZV9wZWVyX3NlcShwZWVyX2RldmljZSwgYmUzMl90b19jcHUocC0+c2VxX251bSkpOwogCi0JZGV2X2VycihERVYsICJHb3QgTmVnRFJlcGx5OyBTZWN0b3IgJWxsdXMsIGxlbiAldS5cbiIsCisJZHJiZF9lcnIoZGV2aWNlLCAiR290IE5lZ0RSZXBseTsgU2VjdG9yICVsbHVzLCBsZW4gJXUuXG4iLAogCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXNlY3RvciwgYmUzMl90b19jcHUocC0+Ymxrc2l6ZSkpOwogCi0JcmV0dXJuIHZhbGlkYXRlX3JlcV9jaGFuZ2VfcmVxX3N0YXRlKG1kZXYsIHAtPmJsb2NrX2lkLCBzZWN0b3IsCi0JCQkJCSAgICAgJm1kZXYtPnJlYWRfcmVxdWVzdHMsIF9fZnVuY19fLAorCXJldHVybiB2YWxpZGF0ZV9yZXFfY2hhbmdlX3JlcV9zdGF0ZShkZXZpY2UsIHAtPmJsb2NrX2lkLCBzZWN0b3IsCisJCQkJCSAgICAgJmRldmljZS0+cmVhZF9yZXF1ZXN0cywgX19mdW5jX18sCiAJCQkJCSAgICAgTkVHX0FDS0VELCBmYWxzZSk7CiB9CiAKLXN0YXRpYyBpbnQgZ290X05lZ1JTRFJlcGx5KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgZ290X05lZ1JTRFJlcGx5KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJc2VjdG9yX3Qgc2VjdG9yOwogCWludCBzaXplOwogCXN0cnVjdCBwX2Jsb2NrX2FjayAqcCA9IHBpLT5kYXRhOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCisJcGVlcl9kZXZpY2UgPSBjb25uX3BlZXJfZGV2aWNlKGNvbm5lY3Rpb24sIHBpLT52bnIpOworCWlmICghcGVlcl9kZXZpY2UpCiAJCXJldHVybiAtRUlPOworCWRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAKIAlzZWN0b3IgPSBiZTY0X3RvX2NwdShwLT5zZWN0b3IpOwogCXNpemUgPSBiZTMyX3RvX2NwdShwLT5ibGtzaXplKTsKIAotCXVwZGF0ZV9wZWVyX3NlcShtZGV2LCBiZTMyX3RvX2NwdShwLT5zZXFfbnVtKSk7CisJdXBkYXRlX3BlZXJfc2VxKHBlZXJfZGV2aWNlLCBiZTMyX3RvX2NwdShwLT5zZXFfbnVtKSk7CiAKLQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKKwlkZWNfcnNfcGVuZGluZyhkZXZpY2UpOwogCi0JaWYgKGdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfRkFJTEVEKSkgewotCQlkcmJkX3JzX2NvbXBsZXRlX2lvKG1kZXYsIHNlY3Rvcik7CisJaWYgKGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKSB7CisJCWRyYmRfcnNfY29tcGxldGVfaW8oZGV2aWNlLCBzZWN0b3IpOwogCQlzd2l0Y2ggKHBpLT5jbWQpIHsKIAkJY2FzZSBQX05FR19SU19EUkVQTFk6Ci0JCQlkcmJkX3JzX2ZhaWxlZF9pbyhtZGV2LCBzZWN0b3IsIHNpemUpOworCQkJZHJiZF9yc19mYWlsZWRfaW8oZGV2aWNlLCBzZWN0b3IsIHNpemUpOwogCQljYXNlIFBfUlNfQ0FOQ0VMOgogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlCVUcoKTsKIAkJfQotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnb3RfQmFycmllckFjayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IGdvdF9CYXJyaWVyQWNrKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7CiAJc3RydWN0IHBfYmFycmllcl9hY2sgKnAgPSBwaS0+ZGF0YTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yOwogCi0JdGxfcmVsZWFzZSh0Y29ubiwgcC0+YmFycmllciwgYmUzMl90b19jcHUocC0+c2V0X3NpemUpKTsKKwl0bF9yZWxlYXNlKGNvbm5lY3Rpb24sIHAtPmJhcnJpZXIsIGJlMzJfdG9fY3B1KHAtPnNldF9zaXplKSk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKSB7Ci0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfQUhFQUQgJiYKLQkJICAgIGF0b21pY19yZWFkKCZtZGV2LT5hcF9pbl9mbGlnaHQpID09IDAgJiYKLQkJICAgICF0ZXN0X2FuZF9zZXRfYml0KEFIRUFEX1RPX1NZTkNfU09VUkNFLCAmbWRldi0+ZmxhZ3MpKSB7Ci0JCQltZGV2LT5zdGFydF9yZXN5bmNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKLQkJCWFkZF90aW1lcigmbWRldi0+c3RhcnRfcmVzeW5jX3RpbWVyKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisKKwkJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX0FIRUFEICYmCisJCSAgICBhdG9taWNfcmVhZCgmZGV2aWNlLT5hcF9pbl9mbGlnaHQpID09IDAgJiYKKwkJICAgICF0ZXN0X2FuZF9zZXRfYml0KEFIRUFEX1RPX1NZTkNfU09VUkNFLCAmZGV2aWNlLT5mbGFncykpIHsKKwkJCWRldmljZS0+c3RhcnRfcmVzeW5jX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJCQlhZGRfdGltZXIoJmRldmljZS0+c3RhcnRfcmVzeW5jX3RpbWVyKTsKIAkJfQogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTUxMjgsOTAgKzUxOTQsOTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnb3RfT1ZSZXN1bHQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCBnb3RfT1ZSZXN1bHQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9ibG9ja19hY2sgKnAgPSBwaS0+ZGF0YTsKLQlzdHJ1Y3QgZHJiZF93b3JrICp3OworCXN0cnVjdCBkcmJkX2RldmljZV93b3JrICpkdzsKIAlzZWN0b3JfdCBzZWN0b3I7CiAJaW50IHNpemU7CiAKLQltZGV2ID0gdm5yX3RvX21kZXYodGNvbm4sIHBpLT52bnIpOwotCWlmICghbWRldikKKwlwZWVyX2RldmljZSA9IGNvbm5fcGVlcl9kZXZpY2UoY29ubmVjdGlvbiwgcGktPnZucik7CisJaWYgKCFwZWVyX2RldmljZSkKIAkJcmV0dXJuIC1FSU87CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAogCXNlY3RvciA9IGJlNjRfdG9fY3B1KHAtPnNlY3Rvcik7CiAJc2l6ZSA9IGJlMzJfdG9fY3B1KHAtPmJsa3NpemUpOwogCi0JdXBkYXRlX3BlZXJfc2VxKG1kZXYsIGJlMzJfdG9fY3B1KHAtPnNlcV9udW0pKTsKKwl1cGRhdGVfcGVlcl9zZXEocGVlcl9kZXZpY2UsIGJlMzJfdG9fY3B1KHAtPnNlcV9udW0pKTsKIAogCWlmIChiZTY0X3RvX2NwdShwLT5ibG9ja19pZCkgPT0gSURfT1VUX09GX1NZTkMpCi0JCWRyYmRfb3Zfb3V0X29mX3N5bmNfZm91bmQobWRldiwgc2VjdG9yLCBzaXplKTsKKwkJZHJiZF9vdl9vdXRfb2Zfc3luY19mb3VuZChkZXZpY2UsIHNlY3Rvciwgc2l6ZSk7CiAJZWxzZQotCQlvdl9vdXRfb2Zfc3luY19wcmludChtZGV2KTsKKwkJb3Zfb3V0X29mX3N5bmNfcHJpbnQoZGV2aWNlKTsKIAotCWlmICghZ2V0X2xkZXYobWRldikpCisJaWYgKCFnZXRfbGRldihkZXZpY2UpKQogCQlyZXR1cm4gMDsKIAotCWRyYmRfcnNfY29tcGxldGVfaW8obWRldiwgc2VjdG9yKTsKLQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKKwlkcmJkX3JzX2NvbXBsZXRlX2lvKGRldmljZSwgc2VjdG9yKTsKKwlkZWNfcnNfcGVuZGluZyhkZXZpY2UpOwogCi0JLS1tZGV2LT5vdl9sZWZ0OworCS0tZGV2aWNlLT5vdl9sZWZ0OwogCiAJLyogbGV0J3MgYWR2YW5jZSBwcm9ncmVzcyBzdGVwIG1hcmtzIG9ubHkgZm9yIGV2ZXJ5IG90aGVyIG1lZ2FieXRlICovCi0JaWYgKChtZGV2LT5vdl9sZWZ0ICYgMHgyMDApID09IDB4MjAwKQotCQlkcmJkX2FkdmFuY2VfcnNfbWFya3MobWRldiwgbWRldi0+b3ZfbGVmdCk7CisJaWYgKChkZXZpY2UtPm92X2xlZnQgJiAweDIwMCkgPT0gMHgyMDApCisJCWRyYmRfYWR2YW5jZV9yc19tYXJrcyhkZXZpY2UsIGRldmljZS0+b3ZfbGVmdCk7CiAKLQlpZiAobWRldi0+b3ZfbGVmdCA9PSAwKSB7Ci0JCXcgPSBrbWFsbG9jKHNpemVvZigqdyksIEdGUF9OT0lPKTsKLQkJaWYgKHcpIHsKLQkJCXctPmNiID0gd19vdl9maW5pc2hlZDsKLQkJCXctPm1kZXYgPSBtZGV2OwotCQkJZHJiZF9xdWV1ZV93b3JrKCZtZGV2LT50Y29ubi0+c2VuZGVyX3dvcmssIHcpOworCWlmIChkZXZpY2UtPm92X2xlZnQgPT0gMCkgeworCQlkdyA9IGttYWxsb2Moc2l6ZW9mKCpkdyksIEdGUF9OT0lPKTsKKwkJaWYgKGR3KSB7CisJCQlkdy0+dy5jYiA9IHdfb3ZfZmluaXNoZWQ7CisJCQlkdy0+ZGV2aWNlID0gZGV2aWNlOworCQkJZHJiZF9xdWV1ZV93b3JrKCZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssICZkdy0+dyk7CiAJCX0gZWxzZSB7Ci0JCQlkZXZfZXJyKERFViwgImttYWxsb2ModykgZmFpbGVkLiIpOwotCQkJb3Zfb3V0X29mX3N5bmNfcHJpbnQobWRldik7Ci0JCQlkcmJkX3Jlc3luY19maW5pc2hlZChtZGV2KTsKKwkJCWRyYmRfZXJyKGRldmljZSwgImttYWxsb2MoZHcpIGZhaWxlZC4iKTsKKwkJCW92X291dF9vZl9zeW5jX3ByaW50KGRldmljZSk7CisJCQlkcmJkX3Jlc3luY19maW5pc2hlZChkZXZpY2UpOwogCQl9CiAJfQotCXB1dF9sZGV2KG1kZXYpOworCXB1dF9sZGV2KGRldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ290X3NraXAoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCBnb3Rfc2tpcChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHRjb25uX2ZpbmlzaF9wZWVyX3JlcXMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIGludCBjb25uZWN0aW9uX2ZpbmlzaF9wZWVyX3JlcXMoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yLCBub3RfZW1wdHkgPSAwOwogCiAJZG8gewotCQljbGVhcl9iaXQoU0lHTkFMX0FTRU5ERVIsICZ0Y29ubi0+ZmxhZ3MpOworCQljbGVhcl9iaXQoU0lHTkFMX0FTRU5ERVIsICZjb25uZWN0aW9uLT5mbGFncyk7CiAJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CiAKIAkJcmN1X3JlYWRfbG9jaygpOwotCQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJCWtyZWZfZ2V0KCZtZGV2LT5rcmVmKTsKKwkJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJCWtyZWZfZ2V0KCZkZXZpY2UtPmtyZWYpOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCQlpZiAoZHJiZF9maW5pc2hfcGVlcl9yZXFzKG1kZXYpKSB7Ci0JCQkJa3JlZl9wdXQoJm1kZXYtPmtyZWYsICZkcmJkX21pbm9yX2Rlc3Ryb3kpOworCQkJaWYgKGRyYmRfZmluaXNoX3BlZXJfcmVxcyhkZXZpY2UpKSB7CisJCQkJa3JlZl9wdXQoJmRldmljZS0+a3JlZiwgZHJiZF9kZXN0cm95X2RldmljZSk7CiAJCQkJcmV0dXJuIDE7CiAJCQl9Ci0JCQlrcmVmX3B1dCgmbWRldi0+a3JlZiwgJmRyYmRfbWlub3JfZGVzdHJveSk7CisJCQlrcmVmX3B1dCgmZGV2aWNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKTsKIAkJCXJjdV9yZWFkX2xvY2soKTsKIAkJfQotCQlzZXRfYml0KFNJR05BTF9BU0VOREVSLCAmdGNvbm4tPmZsYWdzKTsKKwkJc2V0X2JpdChTSUdOQUxfQVNFTkRFUiwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAotCQlzcGluX2xvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJCW5vdF9lbXB0eSA9ICFsaXN0X2VtcHR5KCZtZGV2LT5kb25lX2VlKTsKKwkJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwkJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJCW5vdF9lbXB0eSA9ICFsaXN0X2VtcHR5KCZkZXZpY2UtPmRvbmVfZWUpOwogCQkJaWYgKG5vdF9lbXB0eSkKIAkJCQlicmVhazsKIAkJfQotCQlzcGluX3VubG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfSB3aGlsZSAobm90X2VtcHR5KTsKIApAQCAtNTIyMCw3ICs1MjkwLDcgQEAKIAogc3RydWN0IGFzZW5kZXJfY21kIHsKIAlzaXplX3QgcGt0X3NpemU7Ci0JaW50ICgqZm4pKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICopOworCWludCAoKmZuKShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKik7CiB9OwogCiBzdGF0aWMgc3RydWN0IGFzZW5kZXJfY21kIGFzZW5kZXJfdGJsW10gPSB7CkBAIC01MjQ1LDEzICs1MzE1LDEzIEBACiAKIGludCBkcmJkX2FzZW5kZXIoc3RydWN0IGRyYmRfdGhyZWFkICp0aGkpCiB7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uID0gdGhpLT50Y29ubjsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gdGhpLT5jb25uZWN0aW9uOwogCXN0cnVjdCBhc2VuZGVyX2NtZCAqY21kID0gTlVMTDsKIAlzdHJ1Y3QgcGFja2V0X2luZm8gcGk7CiAJaW50IHJ2OwotCXZvaWQgKmJ1ZiAgICA9IHRjb25uLT5tZXRhLnJidWY7CisJdm9pZCAqYnVmICAgID0gY29ubmVjdGlvbi0+bWV0YS5yYnVmOwogCWludCByZWNlaXZlZCA9IDA7Ci0JdW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gZHJiZF9oZWFkZXJfc2l6ZSh0Y29ubik7CisJdW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gZHJiZF9oZWFkZXJfc2l6ZShjb25uZWN0aW9uKTsKIAlpbnQgZXhwZWN0ICAgPSBoZWFkZXJfc2l6ZTsKIAlib29sIHBpbmdfdGltZW91dF9hY3RpdmUgPSBmYWxzZTsKIAlzdHJ1Y3QgbmV0X2NvbmYgKm5jOwpAQCAtNTI2MCw0NSArNTMzMCw0NSBAQAogCiAJcnYgPSBzY2hlZF9zZXRzY2hlZHVsZXIoY3VycmVudCwgU0NIRURfUlIsICZwYXJhbSk7CiAJaWYgKHJ2IDwgMCkKLQkJY29ubl9lcnIodGNvbm4sICJkcmJkX2FzZW5kZXI6IEVSUk9SIHNldCBwcmlvcml0eSwgcmV0PSVkXG4iLCBydik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJkcmJkX2FzZW5kZXI6IEVSUk9SIHNldCBwcmlvcml0eSwgcmV0PSVkXG4iLCBydik7CiAKIAl3aGlsZSAoZ2V0X3Rfc3RhdGUodGhpKSA9PSBSVU5OSU5HKSB7CiAJCWRyYmRfdGhyZWFkX2N1cnJlbnRfc2V0X2NwdSh0aGkpOwogCiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJbmMgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKTsKKwkJbmMgPSByY3VfZGVyZWZlcmVuY2UoY29ubmVjdGlvbi0+bmV0X2NvbmYpOwogCQlwaW5nX3RpbWVvID0gbmMtPnBpbmdfdGltZW87CiAJCXRjcF9jb3JrID0gbmMtPnRjcF9jb3JrOwogCQlwaW5nX2ludCA9IG5jLT5waW5nX2ludDsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTRU5EX1BJTkcsICZ0Y29ubi0+ZmxhZ3MpKSB7Ci0JCQlpZiAoZHJiZF9zZW5kX3BpbmcodGNvbm4pKSB7Ci0JCQkJY29ubl9lcnIodGNvbm4sICJkcmJkX3NlbmRfcGluZyBoYXMgZmFpbGVkXG4iKTsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTRU5EX1BJTkcsICZjb25uZWN0aW9uLT5mbGFncykpIHsKKwkJCWlmIChkcmJkX3NlbmRfcGluZyhjb25uZWN0aW9uKSkgeworCQkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJkcmJkX3NlbmRfcGluZyBoYXMgZmFpbGVkXG4iKTsKIAkJCQlnb3RvIHJlY29ubmVjdDsKIAkJCX0KLQkJCXRjb25uLT5tZXRhLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvID0gcGluZ190aW1lbyAqIEhaIC8gMTA7CisJCQljb25uZWN0aW9uLT5tZXRhLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvID0gcGluZ190aW1lbyAqIEhaIC8gMTA7CiAJCQlwaW5nX3RpbWVvdXRfYWN0aXZlID0gdHJ1ZTsKIAkJfQogCiAJCS8qIFRPRE86IGNvbmRpdGlvbmFsbHkgY29yazsgaXQgbWF5IGh1cnQgbGF0ZW5jeSBpZiB3ZSBjb3JrIHdpdGhvdXQKIAkJICAgbXVjaCB0byBzZW5kICovCiAJCWlmICh0Y3BfY29yaykKLQkJCWRyYmRfdGNwX2NvcmsodGNvbm4tPm1ldGEuc29ja2V0KTsKLQkJaWYgKHRjb25uX2ZpbmlzaF9wZWVyX3JlcXModGNvbm4pKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgInRjb25uX2ZpbmlzaF9wZWVyX3JlcXMoKSBmYWlsZWRcbiIpOworCQkJZHJiZF90Y3BfY29yayhjb25uZWN0aW9uLT5tZXRhLnNvY2tldCk7CisJCWlmIChjb25uZWN0aW9uX2ZpbmlzaF9wZWVyX3JlcXMoY29ubmVjdGlvbikpIHsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJjb25uZWN0aW9uX2ZpbmlzaF9wZWVyX3JlcXMoKSBmYWlsZWRcbiIpOwogCQkJZ290byByZWNvbm5lY3Q7CiAJCX0KIAkJLyogYnV0IHVuY29uZGl0aW9uYWxseSB1bmNvcmsgdW5sZXNzIGRpc2FibGVkICovCiAJCWlmICh0Y3BfY29yaykKLQkJCWRyYmRfdGNwX3VuY29yayh0Y29ubi0+bWV0YS5zb2NrZXQpOworCQkJZHJiZF90Y3BfdW5jb3JrKGNvbm5lY3Rpb24tPm1ldGEuc29ja2V0KTsKIAogCQkvKiBzaG9ydCBjaXJjdWl0LCByZWN2X21zZyB3b3VsZCByZXR1cm4gRUlOVFIgYW55d2F5cy4gKi8KIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJY29udGludWU7CiAKLQkJcnYgPSBkcmJkX3JlY3Zfc2hvcnQodGNvbm4tPm1ldGEuc29ja2V0LCBidWYsIGV4cGVjdC1yZWNlaXZlZCwgMCk7Ci0JCWNsZWFyX2JpdChTSUdOQUxfQVNFTkRFUiwgJnRjb25uLT5mbGFncyk7CisJCXJ2ID0gZHJiZF9yZWN2X3Nob3J0KGNvbm5lY3Rpb24tPm1ldGEuc29ja2V0LCBidWYsIGV4cGVjdC1yZWNlaXZlZCwgMCk7CisJCWNsZWFyX2JpdChTSUdOQUxfQVNFTkRFUiwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAogCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwogCkBAIC01MzE2LDUxICs1Mzg2LDUxIEBACiAJCQlyZWNlaXZlZCArPSBydjsKIAkJCWJ1ZgkgKz0gcnY7CiAJCX0gZWxzZSBpZiAocnYgPT0gMCkgewotCQkJaWYgKHRlc3RfYml0KERJU0NPTk5FQ1RfU0VOVCwgJnRjb25uLT5mbGFncykpIHsKKwkJCWlmICh0ZXN0X2JpdChESVNDT05ORUNUX1NFTlQsICZjb25uZWN0aW9uLT5mbGFncykpIHsKIAkJCQlsb25nIHQ7CiAJCQkJcmN1X3JlYWRfbG9jaygpOwotCQkJCXQgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKS0+cGluZ190aW1lbyAqIEhaLzEwOworCQkJCXQgPSByY3VfZGVyZWZlcmVuY2UoY29ubmVjdGlvbi0+bmV0X2NvbmYpLT5waW5nX3RpbWVvICogSFovMTA7CiAJCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQkJCQl0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRjb25uLT5waW5nX3dhaXQsCi0JCQkJCQkgICAgICAgdGNvbm4tPmNzdGF0ZSA8IENfV0ZfUkVQT1JUX1BBUkFNUywKKwkJCQl0ID0gd2FpdF9ldmVudF90aW1lb3V0KGNvbm5lY3Rpb24tPnBpbmdfd2FpdCwKKwkJCQkJCSAgICAgICBjb25uZWN0aW9uLT5jc3RhdGUgPCBDX1dGX1JFUE9SVF9QQVJBTVMsCiAJCQkJCQkgICAgICAgdCk7CiAJCQkJaWYgKHQpCiAJCQkJCWJyZWFrOwogCQkJfQotCQkJY29ubl9lcnIodGNvbm4sICJtZXRhIGNvbm5lY3Rpb24gc2h1dCBkb3duIGJ5IHBlZXIuXG4iKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJtZXRhIGNvbm5lY3Rpb24gc2h1dCBkb3duIGJ5IHBlZXIuXG4iKTsKIAkJCWdvdG8gcmVjb25uZWN0OwogCQl9IGVsc2UgaWYgKHJ2ID09IC1FQUdBSU4pIHsKIAkJCS8qIElmIHRoZSBkYXRhIHNvY2tldCByZWNlaXZlZCBzb21ldGhpbmcgbWVhbndoaWxlLAogCQkJICogdGhhdCBpcyBnb29kIGVub3VnaDogcGVlciBpcyBzdGlsbCBhbGl2ZS4gKi8KLQkJCWlmICh0aW1lX2FmdGVyKHRjb25uLT5sYXN0X3JlY2VpdmVkLAotCQkJCWppZmZpZXMgLSB0Y29ubi0+bWV0YS5zb2NrZXQtPnNrLT5za19yY3Z0aW1lbykpCisJCQlpZiAodGltZV9hZnRlcihjb25uZWN0aW9uLT5sYXN0X3JlY2VpdmVkLAorCQkJCWppZmZpZXMgLSBjb25uZWN0aW9uLT5tZXRhLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvKSkKIAkJCQljb250aW51ZTsKIAkJCWlmIChwaW5nX3RpbWVvdXRfYWN0aXZlKSB7Ci0JCQkJY29ubl9lcnIodGNvbm4sICJQaW5nQWNrIGRpZCBub3QgYXJyaXZlIGluIHRpbWUuXG4iKTsKKwkJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiUGluZ0FjayBkaWQgbm90IGFycml2ZSBpbiB0aW1lLlxuIik7CiAJCQkJZ290byByZWNvbm5lY3Q7CiAJCQl9Ci0JCQlzZXRfYml0KFNFTkRfUElORywgJnRjb25uLT5mbGFncyk7CisJCQlzZXRfYml0KFNFTkRfUElORywgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAkJCWNvbnRpbnVlOwogCQl9IGVsc2UgaWYgKHJ2ID09IC1FSU5UUikgewogCQkJY29udGludWU7CiAJCX0gZWxzZSB7Ci0JCQljb25uX2Vycih0Y29ubiwgInNvY2tfcmVjdm1zZyByZXR1cm5lZCAlZFxuIiwgcnYpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgInNvY2tfcmVjdm1zZyByZXR1cm5lZCAlZFxuIiwgcnYpOwogCQkJZ290byByZWNvbm5lY3Q7CiAJCX0KIAogCQlpZiAocmVjZWl2ZWQgPT0gZXhwZWN0ICYmIGNtZCA9PSBOVUxMKSB7Ci0JCQlpZiAoZGVjb2RlX2hlYWRlcih0Y29ubiwgdGNvbm4tPm1ldGEucmJ1ZiwgJnBpKSkKKwkJCWlmIChkZWNvZGVfaGVhZGVyKGNvbm5lY3Rpb24sIGNvbm5lY3Rpb24tPm1ldGEucmJ1ZiwgJnBpKSkKIAkJCQlnb3RvIHJlY29ubmVjdDsKIAkJCWNtZCA9ICZhc2VuZGVyX3RibFtwaS5jbWRdOwogCQkJaWYgKHBpLmNtZCA+PSBBUlJBWV9TSVpFKGFzZW5kZXJfdGJsKSB8fCAhY21kLT5mbikgewotCQkJCWNvbm5fZXJyKHRjb25uLCAiVW5leHBlY3RlZCBtZXRhIHBhY2tldCAlcyAoMHglMDR4KVxuIiwKKwkJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiVW5leHBlY3RlZCBtZXRhIHBhY2tldCAlcyAoMHglMDR4KVxuIiwKIAkJCQkJIGNtZG5hbWUocGkuY21kKSwgcGkuY21kKTsKIAkJCQlnb3RvIGRpc2Nvbm5lY3Q7CiAJCQl9CiAJCQlleHBlY3QgPSBoZWFkZXJfc2l6ZSArIGNtZC0+cGt0X3NpemU7CiAJCQlpZiAocGkuc2l6ZSAhPSBleHBlY3QgLSBoZWFkZXJfc2l6ZSkgewotCQkJCWNvbm5fZXJyKHRjb25uLCAiV3JvbmcgcGFja2V0IHNpemUgb24gbWV0YSAoYzogJWQsIGw6ICVkKVxuIiwKKwkJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiV3JvbmcgcGFja2V0IHNpemUgb24gbWV0YSAoYzogJWQsIGw6ICVkKVxuIiwKIAkJCQkJcGkuY21kLCBwaS5zaXplKTsKIAkJCQlnb3RvIHJlY29ubmVjdDsKIAkJCX0KQEAgLTUzNjgsMjEgKzU0MzgsMjEgQEAKIAkJaWYgKHJlY2VpdmVkID09IGV4cGVjdCkgewogCQkJYm9vbCBlcnI7CiAKLQkJCWVyciA9IGNtZC0+Zm4odGNvbm4sICZwaSk7CisJCQllcnIgPSBjbWQtPmZuKGNvbm5lY3Rpb24sICZwaSk7CiAJCQlpZiAoZXJyKSB7Ci0JCQkJY29ubl9lcnIodGNvbm4sICIlcGYgZmFpbGVkXG4iLCBjbWQtPmZuKTsKKwkJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiJXBmIGZhaWxlZFxuIiwgY21kLT5mbik7CiAJCQkJZ290byByZWNvbm5lY3Q7CiAJCQl9CiAKLQkJCXRjb25uLT5sYXN0X3JlY2VpdmVkID0gamlmZmllczsKKwkJCWNvbm5lY3Rpb24tPmxhc3RfcmVjZWl2ZWQgPSBqaWZmaWVzOwogCiAJCQlpZiAoY21kID09ICZhc2VuZGVyX3RibFtQX1BJTkdfQUNLXSkgewogCQkJCS8qIHJlc3RvcmUgaWRsZSB0aW1lb3V0ICovCi0JCQkJdGNvbm4tPm1ldGEuc29ja2V0LT5zay0+c2tfcmN2dGltZW8gPSBwaW5nX2ludCAqIEhaOworCQkJCWNvbm5lY3Rpb24tPm1ldGEuc29ja2V0LT5zay0+c2tfcmN2dGltZW8gPSBwaW5nX2ludCAqIEhaOwogCQkJCXBpbmdfdGltZW91dF9hY3RpdmUgPSBmYWxzZTsKIAkJCX0KIAotCQkJYnVmCSA9IHRjb25uLT5tZXRhLnJidWY7CisJCQlidWYJID0gY29ubmVjdGlvbi0+bWV0YS5yYnVmOwogCQkJcmVjZWl2ZWQgPSAwOwogCQkJZXhwZWN0CSA9IGhlYWRlcl9zaXplOwogCQkJY21kCSA9IE5VTEw7CkBAIC01MzkxLDE2ICs1NDYxLDE2IEBACiAKIAlpZiAoMCkgewogcmVjb25uZWN0OgotCQljb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TKGNvbm4sIENfTkVUV09SS19GQUlMVVJFKSwgQ1NfSEFSRCk7Ci0JCWNvbm5fbWRfc3luYyh0Y29ubik7CisJCWNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX05FVFdPUktfRkFJTFVSRSksIENTX0hBUkQpOworCQljb25uX21kX3N5bmMoY29ubmVjdGlvbik7CiAJfQogCWlmICgwKSB7CiBkaXNjb25uZWN0OgotCQljb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOworCQljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CiAJfQotCWNsZWFyX2JpdChTSUdOQUxfQVNFTkRFUiwgJnRjb25uLT5mbGFncyk7CisJY2xlYXJfYml0KFNJR05BTF9BU0VOREVSLCAmY29ubmVjdGlvbi0+ZmxhZ3MpOwogCi0JY29ubl9pbmZvKHRjb25uLCAiYXNlbmRlciB0ZXJtaW5hdGVkXG4iKTsKKwlkcmJkX2luZm8oY29ubmVjdGlvbiwgImFzZW5kZXIgdGVybWluYXRlZFxuIik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlcS5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmMKaW5kZXggMTA0YTA0MC4uMzc3OWM4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmMKQEAgLTMxLDM3ICszMSwzNyBAQAogI2luY2x1ZGUgImRyYmRfcmVxLmgiCiAKIAotc3RhdGljIGJvb2wgZHJiZF9tYXlfZG9fbG9jYWxfcmVhZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplKTsKK3N0YXRpYyBib29sIGRyYmRfbWF5X2RvX2xvY2FsX3JlYWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUpOwogCiAvKiBVcGRhdGUgZGlzayBzdGF0cyBhdCBzdGFydCBvZiBJL08gcmVxdWVzdCAqLwotc3RhdGljIHZvaWQgX2RyYmRfc3RhcnRfaW9fYWNjdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpCitzdGF0aWMgdm9pZCBfZHJiZF9zdGFydF9pb19hY2N0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpCiB7CiAJY29uc3QgaW50IHJ3ID0gYmlvX2RhdGFfZGlyKHJlcS0+bWFzdGVyX2Jpbyk7CiAJaW50IGNwdTsKIAljcHUgPSBwYXJ0X3N0YXRfbG9jaygpOwotCXBhcnRfcm91bmRfc3RhdHMoY3B1LCAmbWRldi0+dmRpc2stPnBhcnQwKTsKLQlwYXJ0X3N0YXRfaW5jKGNwdSwgJm1kZXYtPnZkaXNrLT5wYXJ0MCwgaW9zW3J3XSk7Ci0JcGFydF9zdGF0X2FkZChjcHUsICZtZGV2LT52ZGlzay0+cGFydDAsIHNlY3RvcnNbcnddLCByZXEtPmkuc2l6ZSA+PiA5KTsKKwlwYXJ0X3JvdW5kX3N0YXRzKGNwdSwgJmRldmljZS0+dmRpc2stPnBhcnQwKTsKKwlwYXJ0X3N0YXRfaW5jKGNwdSwgJmRldmljZS0+dmRpc2stPnBhcnQwLCBpb3NbcnddKTsKKwlwYXJ0X3N0YXRfYWRkKGNwdSwgJmRldmljZS0+dmRpc2stPnBhcnQwLCBzZWN0b3JzW3J3XSwgcmVxLT5pLnNpemUgPj4gOSk7CiAJKHZvaWQpIGNwdTsgLyogVGhlIG1hY3JvIGludm9jYXRpb25zIGFib3ZlIHdhbnQgdGhlIGNwdSBhcmd1bWVudCwgSSBkbyBub3QgbGlrZQogCQkgICAgICAgdGhlIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgY3B1IG9ubHkgYXNzaWduZWQgYnV0IG5ldmVyIHVzZWQuLi4gKi8KLQlwYXJ0X2luY19pbl9mbGlnaHQoJm1kZXYtPnZkaXNrLT5wYXJ0MCwgcncpOworCXBhcnRfaW5jX2luX2ZsaWdodCgmZGV2aWNlLT52ZGlzay0+cGFydDAsIHJ3KTsKIAlwYXJ0X3N0YXRfdW5sb2NrKCk7CiB9CiAKIC8qIFVwZGF0ZSBkaXNrIHN0YXRzIHdoZW4gY29tcGxldGluZyByZXF1ZXN0IHVwd2FyZHMgKi8KLXN0YXRpYyB2b2lkIF9kcmJkX2VuZF9pb19hY2N0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKK3N0YXRpYyB2b2lkIF9kcmJkX2VuZF9pb19hY2N0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpCiB7CiAJaW50IHJ3ID0gYmlvX2RhdGFfZGlyKHJlcS0+bWFzdGVyX2Jpbyk7CiAJdW5zaWduZWQgbG9uZyBkdXJhdGlvbiA9IGppZmZpZXMgLSByZXEtPnN0YXJ0X3RpbWU7CiAJaW50IGNwdTsKIAljcHUgPSBwYXJ0X3N0YXRfbG9jaygpOwotCXBhcnRfc3RhdF9hZGQoY3B1LCAmbWRldi0+dmRpc2stPnBhcnQwLCB0aWNrc1tyd10sIGR1cmF0aW9uKTsKLQlwYXJ0X3JvdW5kX3N0YXRzKGNwdSwgJm1kZXYtPnZkaXNrLT5wYXJ0MCk7Ci0JcGFydF9kZWNfaW5fZmxpZ2h0KCZtZGV2LT52ZGlzay0+cGFydDAsIHJ3KTsKKwlwYXJ0X3N0YXRfYWRkKGNwdSwgJmRldmljZS0+dmRpc2stPnBhcnQwLCB0aWNrc1tyd10sIGR1cmF0aW9uKTsKKwlwYXJ0X3JvdW5kX3N0YXRzKGNwdSwgJmRldmljZS0+dmRpc2stPnBhcnQwKTsKKwlwYXJ0X2RlY19pbl9mbGlnaHQoJmRldmljZS0+dmRpc2stPnBhcnQwLCBydyk7CiAJcGFydF9zdGF0X3VubG9jaygpOwogfQogCi1zdGF0aWMgc3RydWN0IGRyYmRfcmVxdWVzdCAqZHJiZF9yZXFfbmV3KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgc3RydWN0IGRyYmRfcmVxdWVzdCAqZHJiZF9yZXFfbmV3KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCQkgICAgICAgc3RydWN0IGJpbyAqYmlvX3NyYykKIHsKIAlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXE7CkBAIC03Miw3ICs3Miw3IEBACiAKIAlkcmJkX3JlcV9tYWtlX3ByaXZhdGVfYmlvKHJlcSwgYmlvX3NyYyk7CiAJcmVxLT5ycV9zdGF0ZSAgICA9IGJpb19kYXRhX2RpcihiaW9fc3JjKSA9PSBXUklURSA/IFJRX1dSSVRFIDogMDsKLQlyZXEtPncubWRldiAgICAgID0gbWRldjsKKwlyZXEtPmRldmljZSAgID0gZGV2aWNlOwogCXJlcS0+bWFzdGVyX2JpbyAgPSBiaW9fc3JjOwogCXJlcS0+ZXBvY2ggICAgICAgPSAwOwogCkBAIC05NSwxNCArOTUsMTQgQEAKIHZvaWQgZHJiZF9yZXFfZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZikKIHsKIAlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRyYmRfcmVxdWVzdCwga3JlZik7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJY29uc3QgdW5zaWduZWQgcyA9IHJlcS0+cnFfc3RhdGU7CiAKIAlpZiAoKHJlcS0+bWFzdGVyX2JpbyAmJiAhKHMgJiBSUV9QT1NUUE9ORUQpKSB8fAogCQlhdG9taWNfcmVhZCgmcmVxLT5jb21wbGV0aW9uX3JlZikgfHwKIAkJKHMgJiBSUV9MT0NBTF9QRU5ESU5HKSB8fAogCQkoKHMgJiBSUV9ORVRfTUFTSykgJiYgIShzICYgUlFfTkVUX0RPTkUpKSkgewotCQlkZXZfZXJyKERFViwgImRyYmRfcmVxX2Rlc3Ryb3k6IExvZ2ljIEJVRyBycV9zdGF0ZSA9IDB4JXgsIGNvbXBsZXRpb25fcmVmID0gJWRcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfcmVxX2Rlc3Ryb3k6IExvZ2ljIEJVRyBycV9zdGF0ZSA9IDB4JXgsIGNvbXBsZXRpb25fcmVmID0gJWRcbiIsCiAJCQkJcywgYXRvbWljX3JlYWQoJnJlcS0+Y29tcGxldGlvbl9yZWYpKTsKIAkJcmV0dXJuOwogCX0KQEAgLTEzMiwxMCArMTMyLDEwIEBACiAJCSAqLwogCQlpZiAoKHMgJiAoUlFfUE9TVFBPTkVEfFJRX0xPQ0FMX01BU0t8UlFfTkVUX01BU0spKSAhPSBSUV9QT1NUUE9ORUQpIHsKIAkJCWlmICghKHMgJiBSUV9ORVRfT0spIHx8ICEocyAmIFJRX0xPQ0FMX09LKSkKLQkJCQlkcmJkX3NldF9vdXRfb2Zfc3luYyhtZGV2LCByZXEtPmkuc2VjdG9yLCByZXEtPmkuc2l6ZSk7CisJCQkJZHJiZF9zZXRfb3V0X29mX3N5bmMoZGV2aWNlLCByZXEtPmkuc2VjdG9yLCByZXEtPmkuc2l6ZSk7CiAKIAkJCWlmICgocyAmIFJRX05FVF9PSykgJiYgKHMgJiBSUV9MT0NBTF9PSykgJiYgKHMgJiBSUV9ORVRfU0lTKSkKLQkJCQlkcmJkX3NldF9pbl9zeW5jKG1kZXYsIHJlcS0+aS5zZWN0b3IsIHJlcS0+aS5zaXplKTsKKwkJCQlkcmJkX3NldF9pbl9zeW5jKGRldmljZSwgcmVxLT5pLnNlY3RvciwgcmVxLT5pLnNpemUpOwogCQl9CiAKIAkJLyogb25lIG1pZ2h0IGJlIHRlbXB0ZWQgdG8gbW92ZSB0aGUgZHJiZF9hbF9jb21wbGV0ZV9pbwpAQCAtMTQ5LDExICsxNDksMTEgQEAKIAkJICogd2Ugd291bGQgZm9yZ2V0IHRvIHJlc3luYyB0aGUgY29ycmVzcG9uZGluZyBleHRlbnQuCiAJCSAqLwogCQlpZiAocyAmIFJRX0lOX0FDVF9MT0cpIHsKLQkJCWlmIChnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0ZBSUxFRCkpIHsKLQkJCQlkcmJkX2FsX2NvbXBsZXRlX2lvKG1kZXYsICZyZXEtPmkpOwotCQkJCXB1dF9sZGV2KG1kZXYpOworCQkJaWYgKGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKSB7CisJCQkJZHJiZF9hbF9jb21wbGV0ZV9pbyhkZXZpY2UsICZyZXEtPmkpOworCQkJCXB1dF9sZGV2KGRldmljZSk7CiAJCQl9IGVsc2UgaWYgKF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpIHsKLQkJCQlkZXZfd2FybihERVYsICJTaG91bGQgaGF2ZSBjYWxsZWQgZHJiZF9hbF9jb21wbGV0ZV9pbygsICVsbHUsICV1KSwgIgorCQkJCWRyYmRfd2FybihkZXZpY2UsICJTaG91bGQgaGF2ZSBjYWxsZWQgZHJiZF9hbF9jb21wbGV0ZV9pbygsICVsbHUsICV1KSwgIgogCQkJCQkgImJ1dCBteSBEaXNrIHNlZW1zIHRvIGhhdmUgZmFpbGVkIDooXG4iLAogCQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgcmVxLT5pLnNlY3RvciwgcmVxLT5pLnNpemUpOwogCQkJfQpAQCAtMTYzLDQxICsxNjMsNDIgQEAKIAltZW1wb29sX2ZyZWUocmVxLCBkcmJkX3JlcXVlc3RfbWVtcG9vbCk7CiB9CiAKLXN0YXRpYyB2b2lkIHdha2VfYWxsX3NlbmRlcnMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKSB7Ci0Jd2FrZV91cCgmdGNvbm4tPnNlbmRlcl93b3JrLnFfd2FpdCk7CitzdGF0aWMgdm9pZCB3YWtlX2FsbF9zZW5kZXJzKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJd2FrZV91cCgmY29ubmVjdGlvbi0+c2VuZGVyX3dvcmsucV93YWl0KTsKIH0KIAogLyogbXVzdCBob2xkIHJlc291cmNlLT5yZXFfbG9jayAqLwotdm9pZCBzdGFydF9uZXdfdGxfZXBvY2goc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQordm9pZCBzdGFydF9uZXdfdGxfZXBvY2goc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAkvKiBubyBwb2ludCBjbG9zaW5nIGFuIGVwb2NoLCBpZiBpdCBpcyBlbXB0eSwgYW55d2F5cy4gKi8KLQlpZiAodGNvbm4tPmN1cnJlbnRfdGxlX3dyaXRlcyA9PSAwKQorCWlmIChjb25uZWN0aW9uLT5jdXJyZW50X3RsZV93cml0ZXMgPT0gMCkKIAkJcmV0dXJuOwogCi0JdGNvbm4tPmN1cnJlbnRfdGxlX3dyaXRlcyA9IDA7Ci0JYXRvbWljX2luYygmdGNvbm4tPmN1cnJlbnRfdGxlX25yKTsKLQl3YWtlX2FsbF9zZW5kZXJzKHRjb25uKTsKKwljb25uZWN0aW9uLT5jdXJyZW50X3RsZV93cml0ZXMgPSAwOworCWF0b21pY19pbmMoJmNvbm5lY3Rpb24tPmN1cnJlbnRfdGxlX25yKTsKKwl3YWtlX2FsbF9zZW5kZXJzKGNvbm5lY3Rpb24pOwogfQogCi12b2lkIGNvbXBsZXRlX21hc3Rlcl9iaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3ZvaWQgY29tcGxldGVfbWFzdGVyX2JpbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJc3RydWN0IGJpb19hbmRfZXJyb3IgKm0pCiB7CiAJYmlvX2VuZGlvKG0tPmJpbywgbS0+ZXJyb3IpOwotCWRlY19hcF9iaW8obWRldik7CisJZGVjX2FwX2JpbyhkZXZpY2UpOwogfQogCiAKIHN0YXRpYyB2b2lkIGRyYmRfcmVtb3ZlX3JlcXVlc3RfaW50ZXJ2YWwoc3RydWN0IHJiX3Jvb3QgKnJvb3QsCiAJCQkJCSBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJc3RydWN0IGRyYmRfaW50ZXJ2YWwgKmkgPSAmcmVxLT5pOwogCiAJZHJiZF9yZW1vdmVfaW50ZXJ2YWwocm9vdCwgaSk7CiAKIAkvKiBXYWtlIHVwIGFueSBwcm9jZXNzZXMgd2FpdGluZyBmb3IgdGhpcyByZXF1ZXN0IHRvIGNvbXBsZXRlLiAgKi8KIAlpZiAoaS0+d2FpdGluZykKLQkJd2FrZV91cCgmbWRldi0+bWlzY193YWl0KTsKKwkJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOwogfQogCiAvKiBIZWxwZXIgZm9yIF9fcmVxX21vZCgpLgpAQCAtMjEwLDcgKzIxMSw3IEBACiB2b2lkIGRyYmRfcmVxX2NvbXBsZXRlKHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSwgc3RydWN0IGJpb19hbmRfZXJyb3IgKm0pCiB7CiAJY29uc3QgdW5zaWduZWQgcyA9IHJlcS0+cnFfc3RhdGU7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJaW50IHJ3OwogCWludCBlcnJvciwgb2s7CiAKQEAgLTIyNiwxMiArMjI3LDEyIEBACiAJaWYgKChzICYgUlFfTE9DQUxfUEVORElORyAmJiAhKHMgJiBSUV9MT0NBTF9BQk9SVEVEKSkgfHwKIAkgICAgKHMgJiBSUV9ORVRfUVVFVUVEKSB8fCAocyAmIFJRX05FVF9QRU5ESU5HKSB8fAogCSAgICAocyAmIFJRX0NPTVBMRVRJT05fU1VTUCkpIHsKLQkJZGV2X2VycihERVYsICJkcmJkX3JlcV9jb21wbGV0ZTogTG9naWMgQlVHIHJxX3N0YXRlID0gMHgleFxuIiwgcyk7CisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfcmVxX2NvbXBsZXRlOiBMb2dpYyBCVUcgcnFfc3RhdGUgPSAweCV4XG4iLCBzKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICghcmVxLT5tYXN0ZXJfYmlvKSB7Ci0JCWRldl9lcnIoREVWLCAiZHJiZF9yZXFfY29tcGxldGU6IExvZ2ljIEJVRywgbWFzdGVyX2JpbyA9PSBOVUxMIVxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfcmVxX2NvbXBsZXRlOiBMb2dpYyBCVUcsIG1hc3Rlcl9iaW8gPT0gTlVMTCFcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yNTksOSArMjYwLDkgQEAKIAkJc3RydWN0IHJiX3Jvb3QgKnJvb3Q7CiAKIAkJaWYgKHJ3ID09IFdSSVRFKQotCQkJcm9vdCA9ICZtZGV2LT53cml0ZV9yZXF1ZXN0czsKKwkJCXJvb3QgPSAmZGV2aWNlLT53cml0ZV9yZXF1ZXN0czsKIAkJZWxzZQotCQkJcm9vdCA9ICZtZGV2LT5yZWFkX3JlcXVlc3RzOworCQkJcm9vdCA9ICZkZXZpY2UtPnJlYWRfcmVxdWVzdHM7CiAJCWRyYmRfcmVtb3ZlX3JlcXVlc3RfaW50ZXJ2YWwocm9vdCwgcmVxKTsKIAl9CiAKQEAgLTI3MywxMSArMjc0LDExIEBACiAJICogYW5kIHJlc2V0IHRoZSB0cmFuc2ZlciBsb2cgZXBvY2ggd3JpdGVfY250LgogCSAqLwogCWlmIChydyA9PSBXUklURSAmJgotCSAgICByZXEtPmVwb2NoID09IGF0b21pY19yZWFkKCZtZGV2LT50Y29ubi0+Y3VycmVudF90bGVfbnIpKQotCQlzdGFydF9uZXdfdGxfZXBvY2gobWRldi0+dGNvbm4pOworCSAgICByZXEtPmVwb2NoID09IGF0b21pY19yZWFkKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5jdXJyZW50X3RsZV9ucikpCisJCXN0YXJ0X25ld190bF9lcG9jaChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uKTsKIAogCS8qIFVwZGF0ZSBkaXNrIHN0YXRzICovCi0JX2RyYmRfZW5kX2lvX2FjY3QobWRldiwgcmVxKTsKKwlfZHJiZF9lbmRfaW9fYWNjdChkZXZpY2UsIHJlcSk7CiAKIAkvKiBJZiBSRUFEIGZhaWxlZCwKIAkgKiBoYXZlIGl0IGJlIHB1c2hlZCBiYWNrIHRvIHRoZSByZXRyeSB3b3JrIHF1ZXVlLApAQCAtMzA1LDggKzMwNiw4IEBACiAKIHN0YXRpYyBpbnQgZHJiZF9yZXFfcHV0X2NvbXBsZXRpb25fcmVmKHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSwgc3RydWN0IGJpb19hbmRfZXJyb3IgKm0sIGludCBwdXQpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OwotCURfQVNTRVJUKG0gfHwgKHJlcS0+cnFfc3RhdGUgJiBSUV9QT1NUUE9ORUQpKTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOworCURfQVNTRVJUKGRldmljZSwgbSB8fCAocmVxLT5ycV9zdGF0ZSAmIFJRX1BPU1RQT05FRCkpOwogCiAJaWYgKCFhdG9taWNfc3ViX2FuZF90ZXN0KHB1dCwgJnJlcS0+Y29tcGxldGlvbl9yZWYpKQogCQlyZXR1cm4gMDsKQEAgLTMyOCwxMiArMzI5LDEyIEBACiBzdGF0aWMgdm9pZCBtb2RfcnFfc3RhdGUoc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgYmlvX2FuZF9lcnJvciAqbSwKIAkJaW50IGNsZWFyLCBpbnQgc2V0KQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSByZXEtPncubWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOwogCXVuc2lnbmVkIHMgPSByZXEtPnJxX3N0YXRlOwogCWludCBjX3B1dCA9IDA7CiAJaW50IGtfcHV0ID0gMDsKIAotCWlmIChkcmJkX3N1c3BlbmRlZChtZGV2KSAmJiAhKChzIHwgY2xlYXIpICYgUlFfQ09NUExFVElPTl9TVVNQKSkKKwlpZiAoZHJiZF9zdXNwZW5kZWQoZGV2aWNlKSAmJiAhKChzIHwgY2xlYXIpICYgUlFfQ09NUExFVElPTl9TVVNQKSkKIAkJc2V0IHw9IFJRX0NPTVBMRVRJT05fU1VTUDsKIAogCS8qIGFwcGx5ICovCkBAIC0zNTEsNyArMzUyLDcgQEAKIAkJYXRvbWljX2luYygmcmVxLT5jb21wbGV0aW9uX3JlZik7CiAKIAlpZiAoIShzICYgUlFfTkVUX1BFTkRJTkcpICYmIChzZXQgJiBSUV9ORVRfUEVORElORykpIHsKLQkJaW5jX2FwX3BlbmRpbmcobWRldik7CisJCWluY19hcF9wZW5kaW5nKGRldmljZSk7CiAJCWF0b21pY19pbmMoJnJlcS0+Y29tcGxldGlvbl9yZWYpOwogCX0KIApAQCAtMzYyLDcgKzM2Myw3IEBACiAJCWtyZWZfZ2V0KCZyZXEtPmtyZWYpOyAvKiB3YWl0IGZvciB0aGUgRE9ORSAqLwogCiAJaWYgKCEocyAmIFJRX05FVF9TRU5UKSAmJiAoc2V0ICYgUlFfTkVUX1NFTlQpKQotCQlhdG9taWNfYWRkKHJlcS0+aS5zaXplID4+IDksICZtZGV2LT5hcF9pbl9mbGlnaHQpOworCQlhdG9taWNfYWRkKHJlcS0+aS5zaXplID4+IDksICZkZXZpY2UtPmFwX2luX2ZsaWdodCk7CiAKIAlpZiAoIShzICYgUlFfQ09NUExFVElPTl9TVVNQKSAmJiAoc2V0ICYgUlFfQ09NUExFVElPTl9TVVNQKSkKIAkJYXRvbWljX2luYygmcmVxLT5jb21wbGV0aW9uX3JlZik7CkBAIC0zNzMsNyArMzc0LDcgQEAKIAkJKytjX3B1dDsKIAogCWlmICghKHMgJiBSUV9MT0NBTF9BQk9SVEVEKSAmJiAoc2V0ICYgUlFfTE9DQUxfQUJPUlRFRCkpIHsKLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX0xPQ0FMX1BFTkRJTkcpOworCQlEX0FTU0VSVChkZXZpY2UsIHJlcS0+cnFfc3RhdGUgJiBSUV9MT0NBTF9QRU5ESU5HKTsKIAkJLyogbG9jYWwgY29tcGxldGlvbiBtYXkgc3RpbGwgY29tZSBpbiBsYXRlciwKIAkJICogd2UgbmVlZCB0byBrZWVwIHRoZSByZXEgb2JqZWN0IGFyb3VuZC4gKi8KIAkJa3JlZl9nZXQoJnJlcS0+a3JlZik7CkBAIC0zODgsNyArMzg5LDcgQEAKIAl9CiAKIAlpZiAoKHMgJiBSUV9ORVRfUEVORElORykgJiYgKGNsZWFyICYgUlFfTkVUX1BFTkRJTkcpKSB7Ci0JCWRlY19hcF9wZW5kaW5nKG1kZXYpOworCQlkZWNfYXBfcGVuZGluZyhkZXZpY2UpOwogCQkrK2NfcHV0OwogCX0KIApAQCAtMzk3LDcgKzM5OCw3IEBACiAKIAlpZiAoKHMgJiBSUV9FWFBfQkFSUl9BQ0spICYmICEocyAmIFJRX05FVF9ET05FKSAmJiAoc2V0ICYgUlFfTkVUX0RPTkUpKSB7CiAJCWlmIChyZXEtPnJxX3N0YXRlICYgUlFfTkVUX1NFTlQpCi0JCQlhdG9taWNfc3ViKHJlcS0+aS5zaXplID4+IDksICZtZGV2LT5hcF9pbl9mbGlnaHQpOworCQkJYXRvbWljX3N1YihyZXEtPmkuc2l6ZSA+PiA5LCAmZGV2aWNlLT5hcF9pbl9mbGlnaHQpOwogCQkrK2tfcHV0OwogCX0KIApAQCAtNDA5LDE0ICs0MTAsMTQgQEAKIAkJaW50IGF0X2xlYXN0ID0ga19wdXQgKyAhIWNfcHV0OwogCQlpbnQgcmVmY291bnQgPSBhdG9taWNfcmVhZCgmcmVxLT5rcmVmLnJlZmNvdW50KTsKIAkJaWYgKHJlZmNvdW50IDwgYXRfbGVhc3QpCi0JCQlkZXZfZXJyKERFViwKKwkJCWRyYmRfZXJyKGRldmljZSwKIAkJCQkibW9kX3JxX3N0YXRlOiBMb2dpYyBCVUc6ICV4IC0+ICV4OiByZWZjb3VudCA9ICVkLCBzaG91bGQgYmUgPj0gJWRcbiIsCiAJCQkJcywgcmVxLT5ycV9zdGF0ZSwgcmVmY291bnQsIGF0X2xlYXN0KTsKIAl9CiAKIAkvKiBJZiB3ZSBtYWRlIHByb2dyZXNzLCByZXRyeSBjb25mbGljdGluZyBwZWVyIHJlcXVlc3RzLCBpZiBhbnkuICovCiAJaWYgKHJlcS0+aS53YWl0aW5nKQotCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCQl3YWtlX3VwKCZkZXZpY2UtPm1pc2Nfd2FpdCk7CiAKIAlpZiAoY19wdXQpCiAJCWtfcHV0ICs9IGRyYmRfcmVxX3B1dF9jb21wbGV0aW9uX3JlZihyZXEsIG0sIGNfcHV0KTsKQEAgLTQyNCwxOCArNDI1LDE4IEBACiAJCWtyZWZfc3ViKCZyZXEtPmtyZWYsIGtfcHV0LCBkcmJkX3JlcV9kZXN0cm95KTsKIH0KIAotc3RhdGljIHZvaWQgZHJiZF9yZXBvcnRfaW9fZXJyb3Ioc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKQorc3RhdGljIHZvaWQgZHJiZF9yZXBvcnRfaW9fZXJyb3Ioc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKIHsKICAgICAgICAgY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCiAJaWYgKCFfX3JhdGVsaW1pdCgmZHJiZF9yYXRlbGltaXRfc3RhdGUpKQogCQlyZXR1cm47CiAKLQlkZXZfd2FybihERVYsICJsb2NhbCAlcyBJTyBlcnJvciBzZWN0b3IgJWxsdSsldSBvbiAlc1xuIiwKKwlkcmJkX3dhcm4oZGV2aWNlLCAibG9jYWwgJXMgSU8gZXJyb3Igc2VjdG9yICVsbHUrJXUgb24gJXNcbiIsCiAJCQkocmVxLT5ycV9zdGF0ZSAmIFJRX1dSSVRFKSA/ICJXUklURSIgOiAiUkVBRCIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlcS0+aS5zZWN0b3IsCiAJCQlyZXEtPmkuc2l6ZSA+PiA5LAotCQkJYmRldm5hbWUobWRldi0+bGRldi0+YmFja2luZ19iZGV2LCBiKSk7CisJCQliZGV2bmFtZShkZXZpY2UtPmxkZXYtPmJhY2tpbmdfYmRldiwgYikpOwogfQogCiAvKiBvYnZpb3VzbHkgdGhpcyBjb3VsZCBiZSBjb2RlZCBhcyBtYW55IHNpbmdsZSBmdW5jdGlvbnMKQEAgLTQ1Myw3ICs0NTQsNyBAQAogaW50IF9fcmVxX21vZChzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEsIGVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCwKIAkJc3RydWN0IGJpb19hbmRfZXJyb3IgKm0pCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAlpbnQgcCwgcnYgPSAwOwogCkBAIC00NjIsNyArNDYzLDcgQEAKIAogCXN3aXRjaCAod2hhdCkgewogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoREVWLCAiTE9HSUMgQlVHIGluICVzOiV1XG4iLCBfX0ZJTEVfXyAsIF9fTElORV9fKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiTE9HSUMgQlVHIGluICVzOiV1XG4iLCBfX0ZJTEVfXyAsIF9fTElORV9fKTsKIAkJYnJlYWs7CiAKIAkvKiBkb2VzIG5vdCBoYXBwZW4uLi4KQEAgLTQ3NCw5ICs0NzUsOSBAQAogCWNhc2UgVE9fQkVfU0VOVDogLyogdmlhIG5ldHdvcmsgKi8KIAkJLyogcmVhY2hlZCB2aWEgX19kcmJkX21ha2VfcmVxdWVzdAogCQkgKiBhbmQgZnJvbSB3X3JlYWRfcmV0cnlfcmVtb3RlICovCi0JCURfQVNTRVJUKCEocmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9NQVNLKSk7CisJCURfQVNTRVJUKGRldmljZSwgIShyZXEtPnJxX3N0YXRlICYgUlFfTkVUX01BU0spKTsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQluYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpOworCQluYyA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJCXAgPSBuYy0+d2lyZV9wcm90b2NvbDsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJlcS0+cnFfc3RhdGUgfD0KQEAgLTQ4NywxNSArNDg4LDE1IEBACiAKIAljYXNlIFRPX0JFX1NVQk1JVFRFRDogLyogbG9jYWxseSAqLwogCQkvKiByZWFjaGVkIHZpYSBfX2RyYmRfbWFrZV9yZXF1ZXN0ICovCi0JCURfQVNTRVJUKCEocmVxLT5ycV9zdGF0ZSAmIFJRX0xPQ0FMX01BU0spKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCAhKHJlcS0+cnFfc3RhdGUgJiBSUV9MT0NBTF9NQVNLKSk7CiAJCW1vZF9ycV9zdGF0ZShyZXEsIG0sIDAsIFJRX0xPQ0FMX1BFTkRJTkcpOwogCQlicmVhazsKIAogCWNhc2UgQ09NUExFVEVEX09LOgogCQlpZiAocmVxLT5ycV9zdGF0ZSAmIFJRX1dSSVRFKQotCQkJbWRldi0+d3JpdF9jbnQgKz0gcmVxLT5pLnNpemUgPj4gOTsKKwkJCWRldmljZS0+d3JpdF9jbnQgKz0gcmVxLT5pLnNpemUgPj4gOTsKIAkJZWxzZQotCQkJbWRldi0+cmVhZF9jbnQgKz0gcmVxLT5pLnNpemUgPj4gOTsKKwkJCWRldmljZS0+cmVhZF9jbnQgKz0gcmVxLT5pLnNpemUgPj4gOTsKIAogCQltb2RfcnFfc3RhdGUocmVxLCBtLCBSUV9MT0NBTF9QRU5ESU5HLAogCQkJCVJRX0xPQ0FMX0NPTVBMRVRFRHxSUV9MT0NBTF9PSyk7CkBAIC01MDYsMTUgKzUwNywxNSBAQAogCQlicmVhazsKIAogCWNhc2UgV1JJVEVfQ09NUExFVEVEX1dJVEhfRVJST1I6Ci0JCWRyYmRfcmVwb3J0X2lvX2Vycm9yKG1kZXYsIHJlcSk7Ci0JCV9fZHJiZF9jaGtfaW9fZXJyb3IobWRldiwgRFJCRF9XUklURV9FUlJPUik7CisJCWRyYmRfcmVwb3J0X2lvX2Vycm9yKGRldmljZSwgcmVxKTsKKwkJX19kcmJkX2Noa19pb19lcnJvcihkZXZpY2UsIERSQkRfV1JJVEVfRVJST1IpOwogCQltb2RfcnFfc3RhdGUocmVxLCBtLCBSUV9MT0NBTF9QRU5ESU5HLCBSUV9MT0NBTF9DT01QTEVURUQpOwogCQlicmVhazsKIAogCWNhc2UgUkVBRF9DT01QTEVURURfV0lUSF9FUlJPUjoKLQkJZHJiZF9zZXRfb3V0X29mX3N5bmMobWRldiwgcmVxLT5pLnNlY3RvciwgcmVxLT5pLnNpemUpOwotCQlkcmJkX3JlcG9ydF9pb19lcnJvcihtZGV2LCByZXEpOwotCQlfX2RyYmRfY2hrX2lvX2Vycm9yKG1kZXYsIERSQkRfUkVBRF9FUlJPUik7CisJCWRyYmRfc2V0X291dF9vZl9zeW5jKGRldmljZSwgcmVxLT5pLnNlY3RvciwgcmVxLT5pLnNpemUpOworCQlkcmJkX3JlcG9ydF9pb19lcnJvcihkZXZpY2UsIHJlcSk7CisJCV9fZHJiZF9jaGtfaW9fZXJyb3IoZGV2aWNlLCBEUkJEX1JFQURfRVJST1IpOwogCQkvKiBmYWxsIHRocm91Z2guICovCiAJY2FzZSBSRUFEX0FIRUFEX0NPTVBMRVRFRF9XSVRIX0VSUk9SOgogCQkvKiBpdCBpcyBsZWdhbCB0byBmYWlsIFJFQURBLCBubyBfX2RyYmRfY2hrX2lvX2Vycm9yIGluIHRoYXQgY2FzZS4gKi8KQEAgLTUzMiwxNiArNTMzLDE3IEBACiAJCS8qIFNvIHdlIGNhbiB2ZXJpZnkgdGhlIGhhbmRsZSBpbiB0aGUgYW5zd2VyIHBhY2tldC4KIAkJICogQ29ycmVzcG9uZGluZyBkcmJkX3JlbW92ZV9yZXF1ZXN0X2ludGVydmFsIGlzIGluCiAJCSAqIGRyYmRfcmVxX2NvbXBsZXRlKCkgKi8KLQkJRF9BU1NFUlQoZHJiZF9pbnRlcnZhbF9lbXB0eSgmcmVxLT5pKSk7Ci0JCWRyYmRfaW5zZXJ0X2ludGVydmFsKCZtZGV2LT5yZWFkX3JlcXVlc3RzLCAmcmVxLT5pKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCBkcmJkX2ludGVydmFsX2VtcHR5KCZyZXEtPmkpKTsKKwkJZHJiZF9pbnNlcnRfaW50ZXJ2YWwoJmRldmljZS0+cmVhZF9yZXF1ZXN0cywgJnJlcS0+aSk7CiAKLQkJc2V0X2JpdChVTlBMVUdfUkVNT1RFLCAmbWRldi0+ZmxhZ3MpOworCQlzZXRfYml0KFVOUExVR19SRU1PVEUsICZkZXZpY2UtPmZsYWdzKTsKIAotCQlEX0FTU0VSVChyZXEtPnJxX3N0YXRlICYgUlFfTkVUX1BFTkRJTkcpOwotCQlEX0FTU0VSVCgocmVxLT5ycV9zdGF0ZSAmIFJRX0xPQ0FMX01BU0spID09IDApOworCQlEX0FTU0VSVChkZXZpY2UsIHJlcS0+cnFfc3RhdGUgJiBSUV9ORVRfUEVORElORyk7CisJCURfQVNTRVJUKGRldmljZSwgKHJlcS0+cnFfc3RhdGUgJiBSUV9MT0NBTF9NQVNLKSA9PSAwKTsKIAkJbW9kX3JxX3N0YXRlKHJlcSwgbSwgMCwgUlFfTkVUX1FVRVVFRCk7CiAJCXJlcS0+dy5jYiA9IHdfc2VuZF9yZWFkX3JlcTsKLQkJZHJiZF9xdWV1ZV93b3JrKCZtZGV2LT50Y29ubi0+c2VuZGVyX3dvcmssICZyZXEtPncpOworCQlkcmJkX3F1ZXVlX3dvcmsoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLAorCQkJCSZyZXEtPncpOwogCQlicmVhazsKIAogCWNhc2UgUVVFVUVfRk9SX05FVF9XUklURToKQEAgLTU1MCw4ICs1NTIsOCBAQAogCiAJCS8qIENvcnJlc3BvbmRpbmcgZHJiZF9yZW1vdmVfcmVxdWVzdF9pbnRlcnZhbCBpcyBpbgogCQkgKiBkcmJkX3JlcV9jb21wbGV0ZSgpICovCi0JCURfQVNTRVJUKGRyYmRfaW50ZXJ2YWxfZW1wdHkoJnJlcS0+aSkpOwotCQlkcmJkX2luc2VydF9pbnRlcnZhbCgmbWRldi0+d3JpdGVfcmVxdWVzdHMsICZyZXEtPmkpOworCQlEX0FTU0VSVChkZXZpY2UsIGRyYmRfaW50ZXJ2YWxfZW1wdHkoJnJlcS0+aSkpOworCQlkcmJkX2luc2VydF9pbnRlcnZhbCgmZGV2aWNlLT53cml0ZV9yZXF1ZXN0cywgJnJlcS0+aSk7CiAKIAkJLyogTk9URQogCQkgKiBJbiBjYXNlIHRoZSByZXEgZW5kZWQgdXAgb24gdGhlIHRyYW5zZmVyIGxvZyBiZWZvcmUgYmVpbmcKQEAgLTU3MCwyOCArNTcyLDMwIEBACiAJCS8qIG90aGVyd2lzZSB3ZSBtYXkgbG9zZSBhbiB1bnBsdWcsIHdoaWNoIG1heSBjYXVzZSBzb21lIHJlbW90ZQogCQkgKiBpby1zY2hlZHVsZXIgdGltZW91dCB0byBleHBpcmUsIGluY3JlYXNpbmcgbWF4aW11bSBsYXRlbmN5LAogCQkgKiBodXJ0aW5nIHBlcmZvcm1hbmNlLiAqLwotCQlzZXRfYml0KFVOUExVR19SRU1PVEUsICZtZGV2LT5mbGFncyk7CisJCXNldF9iaXQoVU5QTFVHX1JFTU9URSwgJmRldmljZS0+ZmxhZ3MpOwogCiAJCS8qIHF1ZXVlIHdvcmsgaXRlbSB0byBzZW5kIGRhdGEgKi8KLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9QRU5ESU5HKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCByZXEtPnJxX3N0YXRlICYgUlFfTkVUX1BFTkRJTkcpOwogCQltb2RfcnFfc3RhdGUocmVxLCBtLCAwLCBSUV9ORVRfUVVFVUVEfFJRX0VYUF9CQVJSX0FDSyk7CiAJCXJlcS0+dy5jYiA9ICB3X3NlbmRfZGJsb2NrOwotCQlkcmJkX3F1ZXVlX3dvcmsoJm1kZXYtPnRjb25uLT5zZW5kZXJfd29yaywgJnJlcS0+dyk7CisJCWRyYmRfcXVldWVfd29yaygmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkJJnJlcS0+dyk7CiAKIAkJLyogY2xvc2UgdGhlIGVwb2NoLCBpbiBjYXNlIGl0IG91dGdyZXcgdGhlIGxpbWl0ICovCiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJbmMgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKTsKKwkJbmMgPSByY3VfZGVyZWZlcmVuY2UoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpOwogCQlwID0gbmMtPm1heF9lcG9jaF9zaXplOwogCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJaWYgKG1kZXYtPnRjb25uLT5jdXJyZW50X3RsZV93cml0ZXMgPj0gcCkKLQkJCXN0YXJ0X25ld190bF9lcG9jaChtZGV2LT50Y29ubik7CisJCWlmIChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5jdXJyZW50X3RsZV93cml0ZXMgPj0gcCkKKwkJCXN0YXJ0X25ld190bF9lcG9jaChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uKTsKIAogCQlicmVhazsKIAogCWNhc2UgUVVFVUVfRk9SX1NFTkRfT09TOgogCQltb2RfcnFfc3RhdGUocmVxLCBtLCAwLCBSUV9ORVRfUVVFVUVEKTsKIAkJcmVxLT53LmNiID0gIHdfc2VuZF9vdXRfb2Zfc3luYzsKLQkJZHJiZF9xdWV1ZV93b3JrKCZtZGV2LT50Y29ubi0+c2VuZGVyX3dvcmssICZyZXEtPncpOworCQlkcmJkX3F1ZXVlX3dvcmsoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLAorCQkJCSZyZXEtPncpOwogCQlicmVhazsKIAogCWNhc2UgUkVBRF9SRVRSWV9SRU1PVEVfQ0FOQ0VMRUQ6CkBAIC02MzksMTUgKzY0MywxNSBAQAogCQkgKiBJZiB0aGlzIHJlcXVlc3QgaGFkIGJlZW4gbWFya2VkIGFzIFJRX1BPU1RQT05FRCBiZWZvcmUsCiAJCSAqIGl0IHdpbGwgYWN0dWFsbHkgbm90IGJlIGNvbXBsZXRlZCwgYnV0ICJyZXN0YXJ0ZWQiLAogCQkgKiByZXN1Ym1pdHRlZCBmcm9tIHRoZSByZXRyeSB3b3JrZXIgY29udGV4dC4gKi8KLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9QRU5ESU5HKTsKLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX0VYUF9XUklURV9BQ0spOworCQlEX0FTU0VSVChkZXZpY2UsIHJlcS0+cnFfc3RhdGUgJiBSUV9ORVRfUEVORElORyk7CisJCURfQVNTRVJUKGRldmljZSwgcmVxLT5ycV9zdGF0ZSAmIFJRX0VYUF9XUklURV9BQ0spOwogCQltb2RfcnFfc3RhdGUocmVxLCBtLCBSUV9ORVRfUEVORElORywgUlFfTkVUX0RPTkV8UlFfTkVUX09LKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdSSVRFX0FDS0VEX0JZX1BFRVJfQU5EX1NJUzoKIAkJcmVxLT5ycV9zdGF0ZSB8PSBSUV9ORVRfU0lTOwogCWNhc2UgV1JJVEVfQUNLRURfQllfUEVFUjoKLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX0VYUF9XUklURV9BQ0spOworCQlEX0FTU0VSVChkZXZpY2UsIHJlcS0+cnFfc3RhdGUgJiBSUV9FWFBfV1JJVEVfQUNLKTsKIAkJLyogcHJvdG9jb2wgQzsgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4gb24gcGVlci4KIAkJICogTm90aGluZyBtb3JlIHRvIGRvIGhlcmUuCiAJCSAqIFdlIHdhbnQgdG8ga2VlcCB0aGUgdGwgaW4gcGxhY2UgZm9yIGFsbCBwcm90b2NvbHMsIHRvIGNhdGVyCkBAIC02NTUsMjUgKzY1OSwyNSBAQAogCiAJCWdvdG8gYWNrX2NvbW1vbjsKIAljYXNlIFJFQ1ZfQUNLRURfQllfUEVFUjoKLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX0VYUF9SRUNFSVZFX0FDSyk7CisJCURfQVNTRVJUKGRldmljZSwgcmVxLT5ycV9zdGF0ZSAmIFJRX0VYUF9SRUNFSVZFX0FDSyk7CiAJCS8qIHByb3RvY29sIEI7IHByZXRlbmRzIHRvIGJlIHN1Y2Nlc3NmdWxseSB3cml0dGVuIG9uIHBlZXIuCiAJCSAqIHNlZSBhbHNvIG5vdGVzIGFib3ZlIGluIEhBTkRFRF9PVkVSX1RPX05FVFdPUksgYWJvdXQKIAkJICogcHJvdG9jb2wgIT0gQyAqLwogCWFja19jb21tb246Ci0JCURfQVNTRVJUKHJlcS0+cnFfc3RhdGUgJiBSUV9ORVRfUEVORElORyk7CisJCURfQVNTRVJUKGRldmljZSwgcmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9QRU5ESU5HKTsKIAkJbW9kX3JxX3N0YXRlKHJlcSwgbSwgUlFfTkVUX1BFTkRJTkcsIFJRX05FVF9PSyk7CiAJCWJyZWFrOwogCiAJY2FzZSBQT1NUUE9ORV9XUklURToKLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX0VYUF9XUklURV9BQ0spOworCQlEX0FTU0VSVChkZXZpY2UsIHJlcS0+cnFfc3RhdGUgJiBSUV9FWFBfV1JJVEVfQUNLKTsKIAkJLyogSWYgdGhpcyBub2RlIGhhcyBhbHJlYWR5IGRldGVjdGVkIHRoZSB3cml0ZSBjb25mbGljdCwgdGhlCiAJCSAqIHdvcmtlciB3aWxsIGJlIHdhaXRpbmcgb24gbWlzY193YWl0LiAgV2FrZSBpdCB1cCBvbmNlIHRoaXMKIAkJICogcmVxdWVzdCBoYXMgY29tcGxldGVkIGxvY2FsbHkuCiAJCSAqLwotCQlEX0FTU0VSVChyZXEtPnJxX3N0YXRlICYgUlFfTkVUX1BFTkRJTkcpOworCQlEX0FTU0VSVChkZXZpY2UsIHJlcS0+cnFfc3RhdGUgJiBSUV9ORVRfUEVORElORyk7CiAJCXJlcS0+cnFfc3RhdGUgfD0gUlFfUE9TVFBPTkVEOwogCQlpZiAocmVxLT5pLndhaXRpbmcpCi0JCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCQkJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOwogCQkvKiBEbyBub3QgY2xlYXIgUlFfTkVUX1BFTkRJTkcuIFRoaXMgcmVxdWVzdCB3aWxsIG1ha2UgZnVydGhlcgogCQkgKiBwcm9ncmVzcyB2aWEgcmVzdGFydF9jb25mbGljdGluZ193cml0ZXMoKSBvcgogCQkgKiBmYWlsX3Bvc3Rwb25lZF9yZXF1ZXN0cygpLiBIb3BlZnVsbHkuICovCkBAIC03MDEsOSArNzA1LDEwIEBACiAJCWlmIChiaW9fZGF0YV9kaXIocmVxLT5tYXN0ZXJfYmlvKSA9PSBXUklURSkKIAkJCXJ2ID0gTVJfV1JJVEU7CiAKLQkJZ2V0X2xkZXYobWRldik7IC8qIGFsd2F5cyBzdWNjZWVkcyBpbiB0aGlzIGNhbGwgcGF0aCAqLworCQlnZXRfbGRldihkZXZpY2UpOyAvKiBhbHdheXMgc3VjY2VlZHMgaW4gdGhpcyBjYWxsIHBhdGggKi8KIAkJcmVxLT53LmNiID0gd19yZXN0YXJ0X2Rpc2tfaW87Ci0JCWRyYmRfcXVldWVfd29yaygmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmcmVxLT53KTsKKwkJZHJiZF9xdWV1ZV93b3JrKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yaywKKwkJCQkmcmVxLT53KTsKIAkJYnJlYWs7CiAKIAljYXNlIFJFU0VORDoKQEAgLTcxOSwxMiArNzI0LDEzIEBACiAJCSAgIFRocm93aW5nIHRoZW0gb3V0IG9mIHRoZSBUTCBoZXJlIGJ5IHByZXRlbmRpbmcgd2UgZ290IGEgQkFSUklFUl9BQ0suCiAJCSAgIER1cmluZyBjb25uZWN0aW9uIGhhbmRzaGFrZSwgd2UgZW5zdXJlIHRoYXQgdGhlIHBlZXIgd2FzIG5vdCByZWJvb3RlZC4gKi8KIAkJaWYgKCEocmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9PSykpIHsKLQkJCS8qIEZJWE1FIGNvdWxkIHRoaXMgcG9zc2libHkgYmUgYSByZXEtPncuY2IgPT0gd19zZW5kX291dF9vZl9zeW5jPworCQkJLyogRklYTUUgY291bGQgdGhpcyBwb3NzaWJseSBiZSBhIHJlcS0+ZHcuY2IgPT0gd19zZW5kX291dF9vZl9zeW5jPwogCQkJICogaW4gdGhhdCBjYXNlIHdlIG11c3Qgbm90IHNldCBSUV9ORVRfUEVORElORy4gKi8KIAogCQkJbW9kX3JxX3N0YXRlKHJlcSwgbSwgUlFfQ09NUExFVElPTl9TVVNQLCBSUV9ORVRfUVVFVUVEfFJRX05FVF9QRU5ESU5HKTsKIAkJCWlmIChyZXEtPncuY2IpIHsKLQkJCQlkcmJkX3F1ZXVlX3dvcmsoJm1kZXYtPnRjb25uLT5zZW5kZXJfd29yaywgJnJlcS0+dyk7CisJCQkJZHJiZF9xdWV1ZV93b3JrKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yaywKKwkJCQkJCSZyZXEtPncpOwogCQkJCXJ2ID0gcmVxLT5ycV9zdGF0ZSAmIFJRX1dSSVRFID8gTVJfV1JJVEUgOiBNUl9SRUFEOwogCQkJfSAvKiBlbHNlOiBGSVhNRSBjYW4gdGhpcyBoYXBwZW4/ICovCiAJCQlicmVhazsKQEAgLTc0MCw3ICs3NDYsNyBAQAogCQkJLyogYmFycmllciBjYW1lIGluIGJlZm9yZSBhbGwgcmVxdWVzdHMgd2VyZSBhY2tlZC4KIAkJCSAqIHRoaXMgaXMgYmFkLCBiZWNhdXNlIGlmIHRoZSBjb25uZWN0aW9uIGlzIGxvc3Qgbm93LAogCQkJICogd2Ugd29uJ3QgYmUgYWJsZSB0byBjbGVhbiB0aGVtIHVwLi4uICovCi0JCQlkZXZfZXJyKERFViwgIkZJWE1FIChCQVJSSUVSX0FDS0VEIGJ1dCBwZW5kaW5nKVxuIik7CisJCQlkcmJkX2VycihkZXZpY2UsICJGSVhNRSAoQkFSUklFUl9BQ0tFRCBidXQgcGVuZGluZylcbiIpOwogCQl9CiAJCS8qIEFsbG93ZWQgdG8gY29tcGxldGUgcmVxdWVzdHMsIGV2ZW4gd2hpbGUgc3VzcGVuZGVkLgogCQkgKiBBcyB0aGlzIGlzIGNhbGxlZCBmb3IgYWxsIHJlcXVlc3RzIHdpdGhpbiBhIG1hdGNoaW5nIGVwb2NoLApAQCAtNzUxLDEyICs3NTcsMTIgQEAKIAkJYnJlYWs7CiAKIAljYXNlIERBVEFfUkVDRUlWRUQ6Ci0JCURfQVNTRVJUKHJlcS0+cnFfc3RhdGUgJiBSUV9ORVRfUEVORElORyk7CisJCURfQVNTRVJUKGRldmljZSwgcmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9QRU5ESU5HKTsKIAkJbW9kX3JxX3N0YXRlKHJlcSwgbSwgUlFfTkVUX1BFTkRJTkcsIFJRX05FVF9PS3xSUV9ORVRfRE9ORSk7CiAJCWJyZWFrOwogCiAJY2FzZSBRVUVVRV9BU19EUkJEX0JBUlJJRVI6Ci0JCXN0YXJ0X25ld190bF9lcG9jaChtZGV2LT50Y29ubik7CisJCXN0YXJ0X25ld190bF9lcG9jaChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uKTsKIAkJbW9kX3JxX3N0YXRlKHJlcSwgbSwgMCwgUlFfTkVUX09LfFJRX05FVF9ET05FKTsKIAkJYnJlYWs7CiAJfTsKQEAgLTc3MSwyNyArNzc3LDI3IEBACiAgKiAgIHNpbmNlIHNpemUgbWF5IGJlIGJpZ2dlciB0aGFuIEJNX0JMT0NLX1NJWkUsCiAgKiAgIHdlIG1heSBuZWVkIHRvIGNoZWNrIHNldmVyYWwgYml0cy4KICAqLwotc3RhdGljIGJvb2wgZHJiZF9tYXlfZG9fbG9jYWxfcmVhZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplKQorc3RhdGljIGJvb2wgZHJiZF9tYXlfZG9fbG9jYWxfcmVhZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSkKIHsKIAl1bnNpZ25lZCBsb25nIHNibnIsIGVibnI7CiAJc2VjdG9yX3QgZXNlY3RvciwgbnJfc2VjdG9yczsKIAotCWlmIChtZGV2LT5zdGF0ZS5kaXNrID09IERfVVBfVE9fREFURSkKKwlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrID09IERfVVBfVE9fREFURSkKIAkJcmV0dXJuIHRydWU7Ci0JaWYgKG1kZXYtPnN0YXRlLmRpc2sgIT0gRF9JTkNPTlNJU1RFTlQpCisJaWYgKGRldmljZS0+c3RhdGUuZGlzayAhPSBEX0lOQ09OU0lTVEVOVCkKIAkJcmV0dXJuIGZhbHNlOwogCWVzZWN0b3IgPSBzZWN0b3IgKyAoc2l6ZSA+PiA5KSAtIDE7Ci0JbnJfc2VjdG9ycyA9IGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldik7Ci0JRF9BU1NFUlQoc2VjdG9yICA8IG5yX3NlY3RvcnMpOwotCURfQVNTRVJUKGVzZWN0b3IgPCBucl9zZWN0b3JzKTsKKwlucl9zZWN0b3JzID0gZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT50aGlzX2JkZXYpOworCURfQVNTRVJUKGRldmljZSwgc2VjdG9yICA8IG5yX3NlY3RvcnMpOworCURfQVNTRVJUKGRldmljZSwgZXNlY3RvciA8IG5yX3NlY3RvcnMpOwogCiAJc2JuciA9IEJNX1NFQ1RfVE9fQklUKHNlY3Rvcik7CiAJZWJuciA9IEJNX1NFQ1RfVE9fQklUKGVzZWN0b3IpOwogCi0JcmV0dXJuIGRyYmRfYm1fY291bnRfYml0cyhtZGV2LCBzYm5yLCBlYm5yKSA9PSAwOworCXJldHVybiBkcmJkX2JtX2NvdW50X2JpdHMoZGV2aWNlLCBzYm5yLCBlYm5yKSA9PSAwOwogfQogCi1zdGF0aWMgYm9vbCByZW1vdGVfZHVlX3RvX3JlYWRfYmFsYW5jaW5nKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHNlY3Rvcl90IHNlY3RvciwKK3N0YXRpYyBib29sIHJlbW90ZV9kdWVfdG9fcmVhZF9iYWxhbmNpbmcoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvciwKIAkJZW51bSBkcmJkX3JlYWRfYmFsYW5jaW5nIHJibSkKIHsKIAlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpOwpAQCAtNzk5LDExICs4MDUsMTEgQEAKIAogCXN3aXRjaCAocmJtKSB7CiAJY2FzZSBSQl9DT05HRVNURURfUkVNT1RFOgotCQliZGkgPSAmbWRldi0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9kaXNrLT5xdWV1ZS0+YmFja2luZ19kZXZfaW5mbzsKKwkJYmRpID0gJmRldmljZS0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9kaXNrLT5xdWV1ZS0+YmFja2luZ19kZXZfaW5mbzsKIAkJcmV0dXJuIGJkaV9yZWFkX2Nvbmdlc3RlZChiZGkpOwogCWNhc2UgUkJfTEVBU1RfUEVORElORzoKLQkJcmV0dXJuIGF0b21pY19yZWFkKCZtZGV2LT5sb2NhbF9jbnQpID4KLQkJCWF0b21pY19yZWFkKCZtZGV2LT5hcF9wZW5kaW5nX2NudCkgKyBhdG9taWNfcmVhZCgmbWRldi0+cnNfcGVuZGluZ19jbnQpOworCQlyZXR1cm4gYXRvbWljX3JlYWQoJmRldmljZS0+bG9jYWxfY250KSA+CisJCQlhdG9taWNfcmVhZCgmZGV2aWNlLT5hcF9wZW5kaW5nX2NudCkgKyBhdG9taWNfcmVhZCgmZGV2aWNlLT5yc19wZW5kaW5nX2NudCk7CiAJY2FzZSBSQl8zMktfU1RSSVBJTkc6ICAvKiBzdHJpcGVfc2hpZnQgPSAxNSAqLwogCWNhc2UgUkJfNjRLX1NUUklQSU5HOgogCWNhc2UgUkJfMTI4S19TVFJJUElORzoKQEAgLTgxMyw3ICs4MTksNyBAQAogCQlzdHJpcGVfc2hpZnQgPSAocmJtIC0gUkJfMzJLX1NUUklQSU5HICsgMTUpOwogCQlyZXR1cm4gKHNlY3RvciA+PiAoc3RyaXBlX3NoaWZ0IC0gOSkpICYgMTsKIAljYXNlIFJCX1JPVU5EX1JPQklOOgotCQlyZXR1cm4gdGVzdF9hbmRfY2hhbmdlX2JpdChSRUFEX0JBTEFOQ0VfUlIsICZtZGV2LT5mbGFncyk7CisJCXJldHVybiB0ZXN0X2FuZF9jaGFuZ2VfYml0KFJFQURfQkFMQU5DRV9SUiwgJmRldmljZS0+ZmxhZ3MpOwogCWNhc2UgUkJfUFJFRkVSX1JFTU9URToKIAkJcmV0dXJuIHRydWU7CiAJY2FzZSBSQl9QUkVGRVJfTE9DQUw6CkBAIC04MzQsNzMgKzg0MCw3MyBAQAogc3RhdGljIHZvaWQgY29tcGxldGVfY29uZmxpY3Rpbmdfd3JpdGVzKHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKIHsKIAlERUZJTkVfV0FJVCh3YWl0KTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gcmVxLT53Lm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSByZXEtPmRldmljZTsKIAlzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaTsKIAlzZWN0b3JfdCBzZWN0b3IgPSByZXEtPmkuc2VjdG9yOwogCWludCBzaXplID0gcmVxLT5pLnNpemU7CiAKLQlpID0gZHJiZF9maW5kX292ZXJsYXAoJm1kZXYtPndyaXRlX3JlcXVlc3RzLCBzZWN0b3IsIHNpemUpOworCWkgPSBkcmJkX2ZpbmRfb3ZlcmxhcCgmZGV2aWNlLT53cml0ZV9yZXF1ZXN0cywgc2VjdG9yLCBzaXplKTsKIAlpZiAoIWkpCiAJCXJldHVybjsKIAogCWZvciAoOzspIHsKLQkJcHJlcGFyZV90b193YWl0KCZtZGV2LT5taXNjX3dhaXQsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCWkgPSBkcmJkX2ZpbmRfb3ZlcmxhcCgmbWRldi0+d3JpdGVfcmVxdWVzdHMsIHNlY3Rvciwgc2l6ZSk7CisJCXByZXBhcmVfdG9fd2FpdCgmZGV2aWNlLT5taXNjX3dhaXQsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCWkgPSBkcmJkX2ZpbmRfb3ZlcmxhcCgmZGV2aWNlLT53cml0ZV9yZXF1ZXN0cywgc2VjdG9yLCBzaXplKTsKIAkJaWYgKCFpKQogCQkJYnJlYWs7CiAJCS8qIEluZGljYXRlIHRvIHdha2UgdXAgZGV2aWNlLT5taXNjX3dhaXQgb24gcHJvZ3Jlc3MuICAqLwogCQlpLT53YWl0aW5nID0gdHJ1ZTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJc2NoZWR1bGUoKTsKLQkJc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCX0KLQlmaW5pc2hfd2FpdCgmbWRldi0+bWlzY193YWl0LCAmd2FpdCk7CisJZmluaXNoX3dhaXQoJmRldmljZS0+bWlzY193YWl0LCAmd2FpdCk7CiB9CiAKIC8qIGNhbGxlZCB3aXRoaW4gcmVxX2xvY2sgYW5kIHJjdV9yZWFkX2xvY2soKSAqLwotc3RhdGljIHZvaWQgbWF5YmVfcHVsbF9haGVhZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIHZvaWQgbWF5YmVfcHVsbF9haGVhZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSBtZGV2LT50Y29ubjsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbjsKIAlzdHJ1Y3QgbmV0X2NvbmYgKm5jOwogCWJvb2wgY29uZ2VzdGVkID0gZmFsc2U7CiAJZW51bSBkcmJkX29uX2Nvbmdlc3Rpb24gb25fY29uZ2VzdGlvbjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQluYyA9IHJjdV9kZXJlZmVyZW5jZSh0Y29ubi0+bmV0X2NvbmYpOworCW5jID0gcmN1X2RlcmVmZXJlbmNlKGNvbm5lY3Rpb24tPm5ldF9jb25mKTsKIAlvbl9jb25nZXN0aW9uID0gbmMgPyBuYy0+b25fY29uZ2VzdGlvbiA6IE9DX0JMT0NLOwogCXJjdV9yZWFkX3VubG9jaygpOwogCWlmIChvbl9jb25nZXN0aW9uID09IE9DX0JMT0NLIHx8Ci0JICAgIHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5NikKKwkgICAgY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTYpCiAJCXJldHVybjsKIAogCS8qIElmIEkgZG9uJ3QgZXZlbiBoYXZlIGdvb2QgbG9jYWwgc3RvcmFnZSwgd2UgY2FuIG5vdCByZWFzb25hYmx5IHRyeQogCSAqIHRvIHB1bGwgYWhlYWQgb2YgdGhlIHBlZXIuIFdlIGFsc28gbmVlZCB0aGUgbG9jYWwgcmVmZXJlbmNlIHRvIG1ha2UKLQkgKiBzdXJlIG1kZXYtPmFjdF9sb2cgaXMgdGhlcmUuCisJICogc3VyZSBkZXZpY2UtPmFjdF9sb2cgaXMgdGhlcmUuCiAJICovCi0JaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX1VQX1RPX0RBVEUpKQorCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX1VQX1RPX0RBVEUpKQogCQlyZXR1cm47CiAKIAlpZiAobmMtPmNvbmdfZmlsbCAmJgotCSAgICBhdG9taWNfcmVhZCgmbWRldi0+YXBfaW5fZmxpZ2h0KSA+PSBuYy0+Y29uZ19maWxsKSB7Ci0JCWRldl9pbmZvKERFViwgIkNvbmdlc3Rpb24tZmlsbCB0aHJlc2hvbGQgcmVhY2hlZFxuIik7CisJICAgIGF0b21pY19yZWFkKCZkZXZpY2UtPmFwX2luX2ZsaWdodCkgPj0gbmMtPmNvbmdfZmlsbCkgeworCQlkcmJkX2luZm8oZGV2aWNlLCAiQ29uZ2VzdGlvbi1maWxsIHRocmVzaG9sZCByZWFjaGVkXG4iKTsKIAkJY29uZ2VzdGVkID0gdHJ1ZTsKIAl9CiAKLQlpZiAobWRldi0+YWN0X2xvZy0+dXNlZCA+PSBuYy0+Y29uZ19leHRlbnRzKSB7Ci0JCWRldl9pbmZvKERFViwgIkNvbmdlc3Rpb24tZXh0ZW50cyB0aHJlc2hvbGQgcmVhY2hlZFxuIik7CisJaWYgKGRldmljZS0+YWN0X2xvZy0+dXNlZCA+PSBuYy0+Y29uZ19leHRlbnRzKSB7CisJCWRyYmRfaW5mbyhkZXZpY2UsICJDb25nZXN0aW9uLWV4dGVudHMgdGhyZXNob2xkIHJlYWNoZWRcbiIpOwogCQljb25nZXN0ZWQgPSB0cnVlOwogCX0KIAogCWlmIChjb25nZXN0ZWQpIHsKIAkJLyogc3RhcnQgYSBuZXcgZXBvY2ggZm9yIG5vbi1taXJyb3JlZCB3cml0ZXMgKi8KLQkJc3RhcnRfbmV3X3RsX2Vwb2NoKG1kZXYtPnRjb25uKTsKKwkJc3RhcnRfbmV3X3RsX2Vwb2NoKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pOwogCiAJCWlmIChvbl9jb25nZXN0aW9uID09IE9DX1BVTExfQUhFQUQpCi0JCQlfZHJiZF9zZXRfc3RhdGUoX05TKG1kZXYsIGNvbm4sIENfQUhFQUQpLCAwLCBOVUxMKTsKKwkJCV9kcmJkX3NldF9zdGF0ZShfTlMoZGV2aWNlLCBjb25uLCBDX0FIRUFEKSwgMCwgTlVMTCk7CiAJCWVsc2UgIC8qbmMtPm9uX2Nvbmdlc3Rpb24gPT0gT0NfRElTQ09OTkVDVCAqLwotCQkJX2RyYmRfc2V0X3N0YXRlKF9OUyhtZGV2LCBjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCAwLCBOVUxMKTsKKwkJCV9kcmJkX3NldF9zdGF0ZShfTlMoZGV2aWNlLCBjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCAwLCBOVUxMKTsKIAl9Ci0JcHV0X2xkZXYobWRldik7CisJcHV0X2xkZXYoZGV2aWNlKTsKIH0KIAogLyogSWYgdGhpcyByZXR1cm5zIGZhbHNlLCBhbmQgcmVxLT5wcml2YXRlX2JpbyBpcyBzdGlsbCBzZXQsCkBAIC05MTQsMTkgKzkyMCwxOSBAQAogICovCiBzdGF0aWMgYm9vbCBkb19yZW1vdGVfcmVhZChzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJZW51bSBkcmJkX3JlYWRfYmFsYW5jaW5nIHJibTsKIAogCWlmIChyZXEtPnByaXZhdGVfYmlvKSB7Ci0JCWlmICghZHJiZF9tYXlfZG9fbG9jYWxfcmVhZChtZGV2LAorCQlpZiAoIWRyYmRfbWF5X2RvX2xvY2FsX3JlYWQoZGV2aWNlLAogCQkJCQlyZXEtPmkuc2VjdG9yLCByZXEtPmkuc2l6ZSkpIHsKIAkJCWJpb19wdXQocmVxLT5wcml2YXRlX2Jpbyk7CiAJCQlyZXEtPnByaXZhdGVfYmlvID0gTlVMTDsKLQkJCXB1dF9sZGV2KG1kZXYpOworCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJfQogCX0KIAotCWlmIChtZGV2LT5zdGF0ZS5wZHNrICE9IERfVVBfVE9fREFURSkKKwlpZiAoZGV2aWNlLT5zdGF0ZS5wZHNrICE9IERfVVBfVE9fREFURSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKHJlcS0+cHJpdmF0ZV9iaW8gPT0gTlVMTCkKQEAgLTkzNiwxNyArOTQyLDE3IEBACiAJICogcHJvdG9jb2wsIHBlbmRpbmcgcmVxdWVzdHMgZXRjLiAqLwogCiAJcmN1X3JlYWRfbG9jaygpOwotCXJibSA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5yZWFkX2JhbGFuY2luZzsKKwlyYm0gPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5yZWFkX2JhbGFuY2luZzsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCWlmIChyYm0gPT0gUkJfUFJFRkVSX0xPQ0FMICYmIHJlcS0+cHJpdmF0ZV9iaW8pCiAJCXJldHVybiBmYWxzZTsgLyogc3VibWl0IGxvY2FsbHkgKi8KIAotCWlmIChyZW1vdGVfZHVlX3RvX3JlYWRfYmFsYW5jaW5nKG1kZXYsIHJlcS0+aS5zZWN0b3IsIHJibSkpIHsKKwlpZiAocmVtb3RlX2R1ZV90b19yZWFkX2JhbGFuY2luZyhkZXZpY2UsIHJlcS0+aS5zZWN0b3IsIHJibSkpIHsKIAkJaWYgKHJlcS0+cHJpdmF0ZV9iaW8pIHsKIAkJCWJpb19wdXQocmVxLT5wcml2YXRlX2Jpbyk7CiAJCQlyZXEtPnByaXZhdGVfYmlvID0gTlVMTDsKLQkJCXB1dF9sZGV2KG1kZXYpOworCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJfQogCQlyZXR1cm4gdHJ1ZTsKIAl9CkBAIC05NTksMTEgKzk2NSwxMSBAQAogICogd2hpY2ggZG9lcyBOT1QgaW5jbHVkZSB0aG9zZSB0aGF0IHdlIGFyZSBMX0FIRUFEIGZvci4gKi8KIHN0YXRpYyBpbnQgZHJiZF9wcm9jZXNzX3dyaXRlX3JlcXVlc3Qoc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSByZXEtPncubWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOwogCWludCByZW1vdGUsIHNlbmRfb29zOwogCi0JcmVtb3RlID0gZHJiZF9zaG91bGRfZG9fcmVtb3RlKG1kZXYtPnN0YXRlKTsKLQlzZW5kX29vcyA9IGRyYmRfc2hvdWxkX3NlbmRfb3V0X29mX3N5bmMobWRldi0+c3RhdGUpOworCXJlbW90ZSA9IGRyYmRfc2hvdWxkX2RvX3JlbW90ZShkZXZpY2UtPnN0YXRlKTsKKwlzZW5kX29vcyA9IGRyYmRfc2hvdWxkX3NlbmRfb3V0X29mX3N5bmMoZGV2aWNlLT5zdGF0ZSk7CiAKIAkvKiBOZWVkIHRvIHJlcGxpY2F0ZSB3cml0ZXMuICBVbmxlc3MgaXQgaXMgYW4gZW1wdHkgZmx1c2gsCiAJICogd2hpY2ggaXMgYmV0dGVyIG1hcHBlZCB0byBhIERSQkQgUF9CQVJSSUVSIHBhY2tldCwKQEAgLTk3Myw3ICs5NzksNyBAQAogCSAqIHJlcGxpY2F0aW5nLCBpbiB3aGljaCBjYXNlIHRoZXJlIGlzIG5vIHBvaW50LiAqLwogCWlmICh1bmxpa2VseShyZXEtPmkuc2l6ZSA9PSAwKSkgewogCQkvKiBUaGUgb25seSBzaXplPT0wIGJpb3Mgd2UgZXhwZWN0IGFyZSBlbXB0eSBmbHVzaGVzLiAqLwotCQlEX0FTU0VSVChyZXEtPm1hc3Rlcl9iaW8tPmJpX3J3ICYgUkVRX0ZMVVNIKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCByZXEtPm1hc3Rlcl9iaW8tPmJpX3J3ICYgUkVRX0ZMVVNIKTsKIAkJaWYgKHJlbW90ZSkKIAkJCV9yZXFfbW9kKHJlcSwgUVVFVUVfQVNfRFJCRF9CQVJSSUVSKTsKIAkJcmV0dXJuIHJlbW90ZTsKQEAgLTk4MiwxMiArOTg4LDEyIEBACiAJaWYgKCFyZW1vdGUgJiYgIXNlbmRfb29zKQogCQlyZXR1cm4gMDsKIAotCURfQVNTRVJUKCEocmVtb3RlICYmIHNlbmRfb29zKSk7CisJRF9BU1NFUlQoZGV2aWNlLCAhKHJlbW90ZSAmJiBzZW5kX29vcykpOwogCiAJaWYgKHJlbW90ZSkgewogCQlfcmVxX21vZChyZXEsIFRPX0JFX1NFTlQpOwogCQlfcmVxX21vZChyZXEsIFFVRVVFX0ZPUl9ORVRfV1JJVEUpOwotCX0gZWxzZSBpZiAoZHJiZF9zZXRfb3V0X29mX3N5bmMobWRldiwgcmVxLT5pLnNlY3RvciwgcmVxLT5pLnNpemUpKQorCX0gZWxzZSBpZiAoZHJiZF9zZXRfb3V0X29mX3N5bmMoZGV2aWNlLCByZXEtPmkuc2VjdG9yLCByZXEtPmkuc2l6ZSkpCiAJCV9yZXFfbW9kKHJlcSwgUVVFVUVfRk9SX1NFTkRfT09TKTsKIAogCXJldHVybiByZW1vdGU7CkBAIC05OTYsMzYgKzEwMDIsMzYgQEAKIHN0YXRpYyB2b2lkCiBkcmJkX3N1Ym1pdF9yZXFfcHJpdmF0ZV9iaW8oc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSByZXEtPncubWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOwogCXN0cnVjdCBiaW8gKmJpbyA9IHJlcS0+cHJpdmF0ZV9iaW87CiAJY29uc3QgaW50IHJ3ID0gYmlvX3J3KGJpbyk7CiAKLQliaW8tPmJpX2JkZXYgPSBtZGV2LT5sZGV2LT5iYWNraW5nX2JkZXY7CisJYmlvLT5iaV9iZGV2ID0gZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXY7CiAKIAkvKiBTdGF0ZSBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHdlIGdyYWJiZWQgb3VyIHJlZmVyZW5jZSBvbiB0aGUKIAkgKiAtPmxkZXYgbWVtYmVyLiBEb3VibGUgY2hlY2ssIGFuZCBzaG9ydC1jaXJjdWl0IHRvIGVuZGlvLgogCSAqIEluIGNhc2UgdGhlIGxhc3QgYWN0aXZpdHkgbG9nIHRyYW5zYWN0aW9uIGZhaWxlZCB0byBnZXQgb24KIAkgKiBzdGFibGUgc3RvcmFnZSwgYW5kIHRoaXMgaXMgYSBXUklURSwgd2UgbWF5IG5vdCBldmVuIHN1Ym1pdAogCSAqIHRoaXMgYmlvLiAqLwotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQobWRldiwKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQoZGV2aWNlLAogCQkJCSAgICAgIHJ3ID09IFdSSVRFID8gRFJCRF9GQVVMVF9EVF9XUgogCQkJCSAgICA6IHJ3ID09IFJFQUQgID8gRFJCRF9GQVVMVF9EVF9SRAogCQkJCSAgICA6ICAgICAgICAgICAgICAgRFJCRF9GQVVMVF9EVF9SQSkpCiAJCQliaW9fZW5kaW8oYmlvLCAtRUlPKTsKIAkJZWxzZQogCQkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmlvKTsKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfSBlbHNlCiAJCWJpb19lbmRpbyhiaW8sIC1FSU8pOwogfQogCi1zdGF0aWMgdm9pZCBkcmJkX3F1ZXVlX3dyaXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKK3N0YXRpYyB2b2lkIGRyYmRfcXVldWVfd3JpdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKIHsKLQlzcGluX2xvY2soJm1kZXYtPnN1Ym1pdC5sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZyZXEtPnRsX3JlcXVlc3RzLCAmbWRldi0+c3VibWl0LndyaXRlcyk7Ci0Jc3Bpbl91bmxvY2soJm1kZXYtPnN1Ym1pdC5sb2NrKTsKLQlxdWV1ZV93b3JrKG1kZXYtPnN1Ym1pdC53cSwgJm1kZXYtPnN1Ym1pdC53b3JrZXIpOworCXNwaW5fbG9jaygmZGV2aWNlLT5zdWJtaXQubG9jayk7CisJbGlzdF9hZGRfdGFpbCgmcmVxLT50bF9yZXF1ZXN0cywgJmRldmljZS0+c3VibWl0LndyaXRlcyk7CisJc3Bpbl91bmxvY2soJmRldmljZS0+c3VibWl0LmxvY2spOworCXF1ZXVlX3dvcmsoZGV2aWNlLT5zdWJtaXQud3EsICZkZXZpY2UtPnN1Ym1pdC53b3JrZXIpOwogfQogCiAvKiByZXR1cm5zIHRoZSBuZXcgZHJiZF9yZXF1ZXN0IHBvaW50ZXIsIGlmIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8KQEAgLTEwMzMsMzYgKzEwMzksMzYgQEAKICAqIHJlcXVlc3Qgb24gdGhlIHN1Ym1pdHRlciB0aHJlYWQuCiAgKiBSZXR1cm5zIEVSUl9QVFIoLUVOT01FTSkgaWYgd2UgY2Fubm90IGFsbG9jYXRlIGEgZHJiZF9yZXF1ZXN0LgogICovCi1zdHJ1Y3QgZHJiZF9yZXF1ZXN0ICoKLWRyYmRfcmVxdWVzdF9wcmVwYXJlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgbG9uZyBzdGFydF90aW1lKQorc3RhdGljIHN0cnVjdCBkcmJkX3JlcXVlc3QgKgorZHJiZF9yZXF1ZXN0X3ByZXBhcmUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgbG9uZyBzdGFydF90aW1lKQogewogCWNvbnN0IGludCBydyA9IGJpb19kYXRhX2RpcihiaW8pOwogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcTsKIAogCS8qIGFsbG9jYXRlIG91dHNpZGUgb2YgYWxsIGxvY2tzOyAqLwotCXJlcSA9IGRyYmRfcmVxX25ldyhtZGV2LCBiaW8pOworCXJlcSA9IGRyYmRfcmVxX25ldyhkZXZpY2UsIGJpbyk7CiAJaWYgKCFyZXEpIHsKLQkJZGVjX2FwX2JpbyhtZGV2KTsKKwkJZGVjX2FwX2JpbyhkZXZpY2UpOwogCQkvKiBvbmx5IHBhc3MgdGhlIGVycm9yIHRvIHRoZSB1cHBlciBsYXllcnMuCiAJCSAqIGlmIHVzZXIgY2Fubm90IGhhbmRsZSBpbyBlcnJvcnMsIHRoYXQncyBub3Qgb3VyIGJ1c2luZXNzLiAqLwotCQlkZXZfZXJyKERFViwgImNvdWxkIG5vdCBrbWFsbG9jKCkgcmVxXG4iKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiY291bGQgbm90IGttYWxsb2MoKSByZXFcbiIpOwogCQliaW9fZW5kaW8oYmlvLCAtRU5PTUVNKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCXJlcS0+c3RhcnRfdGltZSA9IHN0YXJ0X3RpbWU7CiAKLQlpZiAoIWdldF9sZGV2KG1kZXYpKSB7CisJaWYgKCFnZXRfbGRldihkZXZpY2UpKSB7CiAJCWJpb19wdXQocmVxLT5wcml2YXRlX2Jpbyk7CiAJCXJlcS0+cHJpdmF0ZV9iaW8gPSBOVUxMOwogCX0KIAogCS8qIFVwZGF0ZSBkaXNrIHN0YXRzICovCi0JX2RyYmRfc3RhcnRfaW9fYWNjdChtZGV2LCByZXEpOworCV9kcmJkX3N0YXJ0X2lvX2FjY3QoZGV2aWNlLCByZXEpOwogCiAJaWYgKHJ3ID09IFdSSVRFICYmIHJlcS0+cHJpdmF0ZV9iaW8gJiYgcmVxLT5pLnNpemUKLQkmJiAhdGVzdF9iaXQoQUxfU1VTUEVOREVELCAmbWRldi0+ZmxhZ3MpKSB7Ci0JCWlmICghZHJiZF9hbF9iZWdpbl9pb19mYXN0cGF0aChtZGV2LCAmcmVxLT5pKSkgewotCQkJZHJiZF9xdWV1ZV93cml0ZShtZGV2LCByZXEpOworCSYmICF0ZXN0X2JpdChBTF9TVVNQRU5ERUQsICZkZXZpY2UtPmZsYWdzKSkgeworCQlpZiAoIWRyYmRfYWxfYmVnaW5faW9fZmFzdHBhdGgoZGV2aWNlLCAmcmVxLT5pKSkgeworCQkJZHJiZF9xdWV1ZV93cml0ZShkZXZpY2UsIHJlcSk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQlyZXEtPnJxX3N0YXRlIHw9IFJRX0lOX0FDVF9MT0c7CkBAIC0xMDcxLDEzICsxMDc3LDEzIEBACiAJcmV0dXJuIHJlcTsKIH0KIAotc3RhdGljIHZvaWQgZHJiZF9zZW5kX2FuZF9zdWJtaXQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKQorc3RhdGljIHZvaWQgZHJiZF9zZW5kX2FuZF9zdWJtaXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKIHsKIAljb25zdCBpbnQgcncgPSBiaW9fcncocmVxLT5tYXN0ZXJfYmlvKTsKIAlzdHJ1Y3QgYmlvX2FuZF9lcnJvciBtID0geyBOVUxMLCB9OwogCWJvb2wgbm9fcmVtb3RlID0gZmFsc2U7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAlpZiAocncgPT0gV1JJVEUpIHsKIAkJLyogVGhpcyBtYXkgdGVtcG9yYXJpbHkgZ2l2ZSB1cCB0aGUgcmVxX2xvY2ssCiAJCSAqIGJ1dCB3aWxsIHJlLWFxdWlyZSBpdCBiZWZvcmUgaXQgcmV0dXJucyBoZXJlLgpAQCAtMTA4NywxNyArMTA5MywxNyBAQAogCiAJCS8qIGNoZWNrIGZvciBjb25nZXN0aW9uLCBhbmQgcG90ZW50aWFsbHkgc3RvcCBzZW5kaW5nCiAJCSAqIGZ1bGwgZGF0YSB1cGRhdGVzLCBidXQgc3RhcnQgc2VuZGluZyAiZGlydHkgYml0cyIgb25seS4gKi8KLQkJbWF5YmVfcHVsbF9haGVhZChtZGV2KTsKKwkJbWF5YmVfcHVsbF9haGVhZChkZXZpY2UpOwogCX0KIAogCi0JaWYgKGRyYmRfc3VzcGVuZGVkKG1kZXYpKSB7CisJaWYgKGRyYmRfc3VzcGVuZGVkKGRldmljZSkpIHsKIAkJLyogcHVzaCBiYWNrIGFuZCByZXRyeTogKi8KIAkJcmVxLT5ycV9zdGF0ZSB8PSBSUV9QT1NUUE9ORUQ7CiAJCWlmIChyZXEtPnByaXZhdGVfYmlvKSB7CiAJCQliaW9fcHV0KHJlcS0+cHJpdmF0ZV9iaW8pOwogCQkJcmVxLT5wcml2YXRlX2JpbyA9IE5VTEw7Ci0JCQlwdXRfbGRldihtZGV2KTsKKwkJCXB1dF9sZGV2KGRldmljZSk7CiAJCX0KIAkJZ290byBvdXQ7CiAJfQpAQCAtMTExMSwxNSArMTExNywxNSBAQAogCX0KIAogCS8qIHdoaWNoIHRyYW5zZmVyIGxvZyBlcG9jaCBkb2VzIHRoaXMgYmVsb25nIHRvPyAqLwotCXJlcS0+ZXBvY2ggPSBhdG9taWNfcmVhZCgmbWRldi0+dGNvbm4tPmN1cnJlbnRfdGxlX25yKTsKKwlyZXEtPmVwb2NoID0gYXRvbWljX3JlYWQoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmN1cnJlbnRfdGxlX25yKTsKIAogCS8qIG5vIHBvaW50IGluIGFkZGluZyBlbXB0eSBmbHVzaGVzIHRvIHRoZSB0cmFuc2ZlciBsb2csCiAJICogdGhleSBhcmUgbWFwcGVkIHRvIGRyYmQgYmFycmllcnMgYWxyZWFkeS4gKi8KIAlpZiAobGlrZWx5KHJlcS0+aS5zaXplIT0wKSkgewogCQlpZiAocncgPT0gV1JJVEUpCi0JCQltZGV2LT50Y29ubi0+Y3VycmVudF90bGVfd3JpdGVzKys7CisJCQlmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5jdXJyZW50X3RsZV93cml0ZXMrKzsKIAotCQlsaXN0X2FkZF90YWlsKCZyZXEtPnRsX3JlcXVlc3RzLCAmbWRldi0+dGNvbm4tPnRyYW5zZmVyX2xvZyk7CisJCWxpc3RfYWRkX3RhaWwoJnJlcS0+dGxfcmVxdWVzdHMsICZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT50cmFuc2Zlcl9sb2cpOwogCX0KIAogCWlmIChydyA9PSBXUklURSkgewpAQCAtMTEzOSwxMyArMTE0NSwxMyBAQAogCQkvKiBuZWVkcyB0byBiZSBtYXJrZWQgd2l0aGluIHRoZSBzYW1lIHNwaW5sb2NrICovCiAJCV9yZXFfbW9kKHJlcSwgVE9fQkVfU1VCTUlUVEVEKTsKIAkJLyogYnV0IHdlIG5lZWQgdG8gZ2l2ZSB1cCB0aGUgc3BpbmxvY2sgdG8gc3VibWl0ICovCi0JCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJCWRyYmRfc3VibWl0X3JlcV9wcml2YXRlX2JpbyhyZXEpOwotCQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCQlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJfSBlbHNlIGlmIChub19yZW1vdGUpIHsKIG5vZGF0YToKIAkJaWYgKF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpCi0JCQlkZXZfZXJyKERFViwgIklPIEVSUk9SOiBuZWl0aGVyIGxvY2FsIG5vciByZW1vdGUgZGF0YSwgc2VjdG9yICVsbHUrJXVcbiIsCisJCQlkcmJkX2VycihkZXZpY2UsICJJTyBFUlJPUjogbmVpdGhlciBsb2NhbCBub3IgcmVtb3RlIGRhdGEsIHNlY3RvciAlbGx1KyV1XG4iLAogCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlcS0+aS5zZWN0b3IsIHJlcS0+aS5zaXplID4+IDkpOwogCQkvKiBBIHdyaXRlIG1heSBoYXZlIGJlZW4gcXVldWVkIGZvciBzZW5kX29vcywgaG93ZXZlci4KIAkJICogU28gd2UgY2FuIG5vdCBzaW1wbHkgZnJlZSBpdCwgd2UgbXVzdCBnbyB0aHJvdWdoIGRyYmRfcmVxX3B1dF9jb21wbGV0aW9uX3JlZigpICovCkBAIC0xMTU0LDIxICsxMTYwLDIxIEBACiBvdXQ6CiAJaWYgKGRyYmRfcmVxX3B1dF9jb21wbGV0aW9uX3JlZihyZXEsICZtLCAxKSkKIAkJa3JlZl9wdXQoJnJlcS0+a3JlZiwgZHJiZF9yZXFfZGVzdHJveSk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJaWYgKG0uYmlvKQotCQljb21wbGV0ZV9tYXN0ZXJfYmlvKG1kZXYsICZtKTsKKwkJY29tcGxldGVfbWFzdGVyX2JpbyhkZXZpY2UsICZtKTsKIH0KIAotdm9pZCBfX2RyYmRfbWFrZV9yZXF1ZXN0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgbG9uZyBzdGFydF90aW1lKQordm9pZCBfX2RyYmRfbWFrZV9yZXF1ZXN0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZSkKIHsKLQlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEgPSBkcmJkX3JlcXVlc3RfcHJlcGFyZShtZGV2LCBiaW8sIHN0YXJ0X3RpbWUpOworCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSA9IGRyYmRfcmVxdWVzdF9wcmVwYXJlKGRldmljZSwgYmlvLCBzdGFydF90aW1lKTsKIAlpZiAoSVNfRVJSX09SX05VTEwocmVxKSkKIAkJcmV0dXJuOwotCWRyYmRfc2VuZF9hbmRfc3VibWl0KG1kZXYsIHJlcSk7CisJZHJiZF9zZW5kX2FuZF9zdWJtaXQoZGV2aWNlLCByZXEpOwogfQogCi1zdGF0aWMgdm9pZCBzdWJtaXRfZmFzdF9wYXRoKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBsaXN0X2hlYWQgKmluY29taW5nKQorc3RhdGljIHZvaWQgc3VibWl0X2Zhc3RfcGF0aChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGxpc3RfaGVhZCAqaW5jb21pbmcpCiB7CiAJc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxLCAqdG1wOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHRtcCwgaW5jb21pbmcsIHRsX3JlcXVlc3RzKSB7CkBAIC0xMTc2LDE5ICsxMTgyLDE5IEBACiAKIAkJaWYgKHJ3ID09IFdSSVRFIC8qIHJ3ICE9IFdSSVRFIHNob3VsZCBub3QgZXZlbiBlbmQgdXAgaGVyZSEgKi8KIAkJJiYgcmVxLT5wcml2YXRlX2JpbyAmJiByZXEtPmkuc2l6ZQotCQkmJiAhdGVzdF9iaXQoQUxfU1VTUEVOREVELCAmbWRldi0+ZmxhZ3MpKSB7Ci0JCQlpZiAoIWRyYmRfYWxfYmVnaW5faW9fZmFzdHBhdGgobWRldiwgJnJlcS0+aSkpCisJCSYmICF0ZXN0X2JpdChBTF9TVVNQRU5ERUQsICZkZXZpY2UtPmZsYWdzKSkgeworCQkJaWYgKCFkcmJkX2FsX2JlZ2luX2lvX2Zhc3RwYXRoKGRldmljZSwgJnJlcS0+aSkpCiAJCQkJY29udGludWU7CiAKIAkJCXJlcS0+cnFfc3RhdGUgfD0gUlFfSU5fQUNUX0xPRzsKIAkJfQogCiAJCWxpc3RfZGVsX2luaXQoJnJlcS0+dGxfcmVxdWVzdHMpOwotCQlkcmJkX3NlbmRfYW5kX3N1Ym1pdChtZGV2LCByZXEpOworCQlkcmJkX3NlbmRfYW5kX3N1Ym1pdChkZXZpY2UsIHJlcSk7CiAJfQogfQogCi1zdGF0aWMgYm9vbCBwcmVwYXJlX2FsX3RyYW5zYWN0aW9uX25vbmJsb2NrKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgYm9vbCBwcmVwYXJlX2FsX3RyYW5zYWN0aW9uX25vbmJsb2NrKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqaW5jb21pbmcsCiAJCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpwZW5kaW5nKQogewpAQCAtMTE5Niw5ICsxMjAyLDkgQEAKIAlpbnQgd2FrZSA9IDA7CiAJaW50IGVycjsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgdG1wLCBpbmNvbWluZywgdGxfcmVxdWVzdHMpIHsKLQkJZXJyID0gZHJiZF9hbF9iZWdpbl9pb19ub25ibG9jayhtZGV2LCAmcmVxLT5pKTsKKwkJZXJyID0gZHJiZF9hbF9iZWdpbl9pb19ub25ibG9jayhkZXZpY2UsICZyZXEtPmkpOwogCQlpZiAoZXJyID09IC1FQlVTWSkKIAkJCXdha2UgPSAxOwogCQlpZiAoZXJyKQpAQCAtMTIwNiwzMCArMTIxMiwzMCBAQAogCQlyZXEtPnJxX3N0YXRlIHw9IFJRX0lOX0FDVF9MT0c7CiAJCWxpc3RfbW92ZV90YWlsKCZyZXEtPnRsX3JlcXVlc3RzLCBwZW5kaW5nKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5hbF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAJaWYgKHdha2UpCi0JCXdha2VfdXAoJm1kZXYtPmFsX3dhaXQpOworCQl3YWtlX3VwKCZkZXZpY2UtPmFsX3dhaXQpOwogCiAJcmV0dXJuICFsaXN0X2VtcHR5KHBlbmRpbmcpOwogfQogCiB2b2lkIGRvX3N1Ym1pdChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndzKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSBjb250YWluZXJfb2Yod3MsIHN0cnVjdCBkcmJkX2NvbmYsIHN1Ym1pdC53b3JrZXIpOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gY29udGFpbmVyX29mKHdzLCBzdHJ1Y3QgZHJiZF9kZXZpY2UsIHN1Ym1pdC53b3JrZXIpOwogCUxJU1RfSEVBRChpbmNvbWluZyk7CiAJTElTVF9IRUFEKHBlbmRpbmcpOwogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSwgKnRtcDsKIAogCWZvciAoOzspIHsKLQkJc3Bpbl9sb2NrKCZtZGV2LT5zdWJtaXQubG9jayk7Ci0JCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmbWRldi0+c3VibWl0LndyaXRlcywgJmluY29taW5nKTsKLQkJc3Bpbl91bmxvY2soJm1kZXYtPnN1Ym1pdC5sb2NrKTsKKwkJc3Bpbl9sb2NrKCZkZXZpY2UtPnN1Ym1pdC5sb2NrKTsKKwkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZkZXZpY2UtPnN1Ym1pdC53cml0ZXMsICZpbmNvbWluZyk7CisJCXNwaW5fdW5sb2NrKCZkZXZpY2UtPnN1Ym1pdC5sb2NrKTsKIAotCQlzdWJtaXRfZmFzdF9wYXRoKG1kZXYsICZpbmNvbWluZyk7CisJCXN1Ym1pdF9mYXN0X3BhdGgoZGV2aWNlLCAmaW5jb21pbmcpOwogCQlpZiAobGlzdF9lbXB0eSgmaW5jb21pbmcpKQogCQkJYnJlYWs7CiAKLQkJd2FpdF9ldmVudChtZGV2LT5hbF93YWl0LCBwcmVwYXJlX2FsX3RyYW5zYWN0aW9uX25vbmJsb2NrKG1kZXYsICZpbmNvbWluZywgJnBlbmRpbmcpKTsKKwkJd2FpdF9ldmVudChkZXZpY2UtPmFsX3dhaXQsIHByZXBhcmVfYWxfdHJhbnNhY3Rpb25fbm9uYmxvY2soZGV2aWNlLCAmaW5jb21pbmcsICZwZW5kaW5nKSk7CiAJCS8qIE1heWJlIG1vcmUgd2FzIHF1ZXVlZCwgd2hpbGUgd2UgcHJlcGFyZWQgdGhlIHRyYW5zYWN0aW9uPwogCQkgKiBUcnkgdG8gc3R1ZmYgdGhlbSBpbnRvIHRoaXMgdHJhbnNhY3Rpb24gYXMgd2VsbC4KIAkJICogQmUgc3RyaWN0bHkgbm9uLWJsb2NraW5nIGhlcmUsIG5vIHdhaXRfZXZlbnQsIHdlIGFscmVhZHkKQEAgLTEyNDMsMTcgKzEyNDksMTcgQEAKIAogCQkJLyogSXQgaXMgb2sgdG8gbG9vayBvdXRzaWRlIHRoZSBsb2NrLAogCQkJICogaXQncyBvbmx5IGFuIG9wdGltaXphdGlvbiBhbnl3YXlzICovCi0JCQlpZiAobGlzdF9lbXB0eSgmbWRldi0+c3VibWl0LndyaXRlcykpCisJCQlpZiAobGlzdF9lbXB0eSgmZGV2aWNlLT5zdWJtaXQud3JpdGVzKSkKIAkJCQlicmVhazsKIAotCQkJc3Bpbl9sb2NrKCZtZGV2LT5zdWJtaXQubG9jayk7Ci0JCQlsaXN0X3NwbGljZV90YWlsX2luaXQoJm1kZXYtPnN1Ym1pdC53cml0ZXMsICZtb3JlX2luY29taW5nKTsKLQkJCXNwaW5fdW5sb2NrKCZtZGV2LT5zdWJtaXQubG9jayk7CisJCQlzcGluX2xvY2soJmRldmljZS0+c3VibWl0LmxvY2spOworCQkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZkZXZpY2UtPnN1Ym1pdC53cml0ZXMsICZtb3JlX2luY29taW5nKTsKKwkJCXNwaW5fdW5sb2NrKCZkZXZpY2UtPnN1Ym1pdC5sb2NrKTsKIAogCQkJaWYgKGxpc3RfZW1wdHkoJm1vcmVfaW5jb21pbmcpKQogCQkJCWJyZWFrOwogCi0JCQltYWRlX3Byb2dyZXNzID0gcHJlcGFyZV9hbF90cmFuc2FjdGlvbl9ub25ibG9jayhtZGV2LCAmbW9yZV9pbmNvbWluZywgJm1vcmVfcGVuZGluZyk7CisJCQltYWRlX3Byb2dyZXNzID0gcHJlcGFyZV9hbF90cmFuc2FjdGlvbl9ub25ibG9jayhkZXZpY2UsICZtb3JlX2luY29taW5nLCAmbW9yZV9wZW5kaW5nKTsKIAogCQkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZtb3JlX3BlbmRpbmcsICZwZW5kaW5nKTsKIAkJCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmbW9yZV9pbmNvbWluZywgJmluY29taW5nKTsKQEAgLTEyNjEsMTggKzEyNjcsMTggQEAKIAkJCWlmICghbWFkZV9wcm9ncmVzcykKIAkJCQlicmVhazsKIAkJfQotCQlkcmJkX2FsX2JlZ2luX2lvX2NvbW1pdChtZGV2LCBmYWxzZSk7CisJCWRyYmRfYWxfYmVnaW5faW9fY29tbWl0KGRldmljZSwgZmFsc2UpOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHRtcCwgJnBlbmRpbmcsIHRsX3JlcXVlc3RzKSB7CiAJCQlsaXN0X2RlbF9pbml0KCZyZXEtPnRsX3JlcXVlc3RzKTsKLQkJCWRyYmRfc2VuZF9hbmRfc3VibWl0KG1kZXYsIHJlcSk7CisJCQlkcmJkX3NlbmRfYW5kX3N1Ym1pdChkZXZpY2UsIHJlcSk7CiAJCX0KIAl9CiB9CiAKIHZvaWQgZHJiZF9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gKHN0cnVjdCBkcmJkX2NvbmYgKikgcS0+cXVldWVkYXRhOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gKHN0cnVjdCBkcmJkX2RldmljZSAqKSBxLT5xdWV1ZWRhdGE7CiAJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOwogCiAJc3RhcnRfdGltZSA9IGppZmZpZXM7CkBAIC0xMjgwLDEwICsxMjg2LDEwIEBACiAJLyoKIAkgKiB3aGF0IHdlICJibGluZGx5IiBhc3N1bWU6CiAJICovCi0JRF9BU1NFUlQoSVNfQUxJR05FRChiaW8tPmJpX2l0ZXIuYmlfc2l6ZSwgNTEyKSk7CisJRF9BU1NFUlQoZGV2aWNlLCBJU19BTElHTkVEKGJpby0+YmlfaXRlci5iaV9zaXplLCA1MTIpKTsKIAotCWluY19hcF9iaW8obWRldik7Ci0JX19kcmJkX21ha2VfcmVxdWVzdChtZGV2LCBiaW8sIHN0YXJ0X3RpbWUpOworCWluY19hcF9iaW8oZGV2aWNlKTsKKwlfX2RyYmRfbWFrZV9yZXF1ZXN0KGRldmljZSwgYmlvLCBzdGFydF90aW1lKTsKIH0KIAogLyogVGhpcyBpcyBjYWxsZWQgYnkgYmlvX2FkZF9wYWdlKCkuCkBAIC0xMzAwLDMyICsxMzA2LDMyIEBACiAgKi8KIGludCBkcmJkX21lcmdlX2J2ZWMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBidmVjX21lcmdlX2RhdGEgKmJ2bSwgc3RydWN0IGJpb192ZWMgKmJ2ZWMpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IChzdHJ1Y3QgZHJiZF9jb25mICopIHEtPnF1ZXVlZGF0YTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IChzdHJ1Y3QgZHJiZF9kZXZpY2UgKikgcS0+cXVldWVkYXRhOwogCXVuc2lnbmVkIGludCBiaW9fc2l6ZSA9IGJ2bS0+Ymlfc2l6ZTsKIAlpbnQgbGltaXQgPSBEUkJEX01BWF9CSU9fU0laRTsKIAlpbnQgYmFja2luZ19saW1pdDsKIAotCWlmIChiaW9fc2l6ZSAmJiBnZXRfbGRldihtZGV2KSkgeworCWlmIChiaW9fc2l6ZSAmJiBnZXRfbGRldihkZXZpY2UpKSB7CiAJCXVuc2lnbmVkIGludCBtYXhfaHdfc2VjdG9ycyA9IHF1ZXVlX21heF9od19zZWN0b3JzKHEpOwogCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqIGNvbnN0IGIgPQotCQkJbWRldi0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9kaXNrLT5xdWV1ZTsKKwkJCWRldmljZS0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9kaXNrLT5xdWV1ZTsKIAkJaWYgKGItPm1lcmdlX2J2ZWNfZm4pIHsKIAkJCWJhY2tpbmdfbGltaXQgPSBiLT5tZXJnZV9idmVjX2ZuKGIsIGJ2bSwgYnZlYyk7CiAJCQlsaW1pdCA9IG1pbihsaW1pdCwgYmFja2luZ19saW1pdCk7CiAJCX0KLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJCWlmICgobGltaXQgPj4gOSkgPiBtYXhfaHdfc2VjdG9ycykKIAkJCWxpbWl0ID0gbWF4X2h3X3NlY3RvcnMgPDwgOTsKIAl9CiAJcmV0dXJuIGxpbWl0OwogfQogCi1zdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpmaW5kX29sZGVzdF9yZXF1ZXN0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3N0YXRpYyBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpmaW5kX29sZGVzdF9yZXF1ZXN0KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7CiAJLyogV2FsayB0aGUgdHJhbnNmZXIgbG9nLAogCSAqIGFuZCBmaW5kIHRoZSBvbGRlc3Qgbm90IHlldCBjb21wbGV0ZWQgcmVxdWVzdCAqLwogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnI7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShyLCAmdGNvbm4tPnRyYW5zZmVyX2xvZywgdGxfcmVxdWVzdHMpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHIsICZjb25uZWN0aW9uLT50cmFuc2Zlcl9sb2csIHRsX3JlcXVlc3RzKSB7CiAJCWlmIChhdG9taWNfcmVhZCgmci0+Y29tcGxldGlvbl9yZWYpKQogCQkJcmV0dXJuIHI7CiAJfQpAQCAtMTMzNCwyMSArMTM0MCwyMSBAQAogCiB2b2lkIHJlcXVlc3RfdGltZXJfZm4odW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSAoc3RydWN0IGRyYmRfY29uZiAqKSBkYXRhOwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IG1kZXYtPnRjb25uOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gKHN0cnVjdCBkcmJkX2RldmljZSAqKSBkYXRhOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uOwogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcTsgLyogb2xkZXN0IHJlcXVlc3QgKi8KIAlzdHJ1Y3QgbmV0X2NvbmYgKm5jOwogCXVuc2lnbmVkIGxvbmcgZW50ID0gMCwgZHQgPSAwLCBldCwgbnQ7IC8qIGVmZmVjdGl2ZSB0aW1lb3V0ID0ga29fY291bnQgKiB0aW1lb3V0ICovCiAJdW5zaWduZWQgbG9uZyBub3c7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbmMgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKTsKLQlpZiAobmMgJiYgbWRldi0+c3RhdGUuY29ubiA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpCisJbmMgPSByY3VfZGVyZWZlcmVuY2UoY29ubmVjdGlvbi0+bmV0X2NvbmYpOworCWlmIChuYyAmJiBkZXZpY2UtPnN0YXRlLmNvbm4gPj0gQ19XRl9SRVBPUlRfUEFSQU1TKQogCQllbnQgPSBuYy0+dGltZW91dCAqIEhaLzEwICogbmMtPmtvX2NvdW50OwogCi0JaWYgKGdldF9sZGV2KG1kZXYpKSB7IC8qIGltcGxpY2l0IHN0YXRlLmRpc2sgPj0gRF9JTkNPTlNJU1RFTlQgKi8KLQkJZHQgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKS0+ZGlza190aW1lb3V0ICogSFogLyAxMDsKLQkJcHV0X2xkZXYobWRldik7CisJaWYgKGdldF9sZGV2KGRldmljZSkpIHsgLyogaW1wbGljaXQgc3RhdGUuZGlzayA+PSBEX0lOQ09OU0lTVEVOVCAqLworCQlkdCA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPmRpc2tfdGltZW91dCAqIEhaIC8gMTA7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCkBAIC0xMzU5LDExICsxMzY1LDExIEBACiAKIAlub3cgPSBqaWZmaWVzOwogCi0Jc3Bpbl9sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKLQlyZXEgPSBmaW5kX29sZGVzdF9yZXF1ZXN0KHRjb25uKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJcmVxID0gZmluZF9vbGRlc3RfcmVxdWVzdChjb25uZWN0aW9uKTsKIAlpZiAoIXJlcSkgewotCQlzcGluX3VubG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7Ci0JCW1vZF90aW1lcigmbWRldi0+cmVxdWVzdF90aW1lciwgbm93ICsgZXQpOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwkJbW9kX3RpbWVyKCZkZXZpY2UtPnJlcXVlc3RfdGltZXIsIG5vdyArIGV0KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTM4NSwxNyArMTM5MSwxNyBAQAogCSAqLwogCWlmIChlbnQgJiYgcmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9QRU5ESU5HICYmCiAJCSB0aW1lX2FmdGVyKG5vdywgcmVxLT5zdGFydF90aW1lICsgZW50KSAmJgotCQkhdGltZV9pbl9yYW5nZShub3csIHRjb25uLT5sYXN0X3JlY29ubmVjdF9qaWYsIHRjb25uLT5sYXN0X3JlY29ubmVjdF9qaWYgKyBlbnQpKSB7Ci0JCWRldl93YXJuKERFViwgIlJlbW90ZSBmYWlsZWQgdG8gZmluaXNoIGEgcmVxdWVzdCB3aXRoaW4ga28tY291bnQgKiB0aW1lb3V0XG4iKTsKLQkJX2RyYmRfc2V0X3N0YXRlKF9OUyhtZGV2LCBjb25uLCBDX1RJTUVPVVQpLCBDU19WRVJCT1NFIHwgQ1NfSEFSRCwgTlVMTCk7CisJCSF0aW1lX2luX3JhbmdlKG5vdywgY29ubmVjdGlvbi0+bGFzdF9yZWNvbm5lY3RfamlmLCBjb25uZWN0aW9uLT5sYXN0X3JlY29ubmVjdF9qaWYgKyBlbnQpKSB7CisJCWRyYmRfd2FybihkZXZpY2UsICJSZW1vdGUgZmFpbGVkIHRvIGZpbmlzaCBhIHJlcXVlc3Qgd2l0aGluIGtvLWNvdW50ICogdGltZW91dFxuIik7CisJCV9kcmJkX3NldF9zdGF0ZShfTlMoZGV2aWNlLCBjb25uLCBDX1RJTUVPVVQpLCBDU19WRVJCT1NFIHwgQ1NfSEFSRCwgTlVMTCk7CiAJfQotCWlmIChkdCAmJiByZXEtPnJxX3N0YXRlICYgUlFfTE9DQUxfUEVORElORyAmJiByZXEtPncubWRldiA9PSBtZGV2ICYmCisJaWYgKGR0ICYmIHJlcS0+cnFfc3RhdGUgJiBSUV9MT0NBTF9QRU5ESU5HICYmIHJlcS0+ZGV2aWNlID09IGRldmljZSAmJgogCQkgdGltZV9hZnRlcihub3csIHJlcS0+c3RhcnRfdGltZSArIGR0KSAmJgotCQkhdGltZV9pbl9yYW5nZShub3csIG1kZXYtPmxhc3RfcmVhdHRhY2hfamlmLCBtZGV2LT5sYXN0X3JlYXR0YWNoX2ppZiArIGR0KSkgewotCQlkZXZfd2FybihERVYsICJMb2NhbCBiYWNraW5nIGRldmljZSBmYWlsZWQgdG8gbWVldCB0aGUgZGlzay10aW1lb3V0XG4iKTsKLQkJX19kcmJkX2Noa19pb19lcnJvcihtZGV2LCBEUkJEX0ZPUkNFX0RFVEFDSCk7CisJCSF0aW1lX2luX3JhbmdlKG5vdywgZGV2aWNlLT5sYXN0X3JlYXR0YWNoX2ppZiwgZGV2aWNlLT5sYXN0X3JlYXR0YWNoX2ppZiArIGR0KSkgeworCQlkcmJkX3dhcm4oZGV2aWNlLCAiTG9jYWwgYmFja2luZyBkZXZpY2UgZmFpbGVkIHRvIG1lZXQgdGhlIGRpc2stdGltZW91dFxuIik7CisJCV9fZHJiZF9jaGtfaW9fZXJyb3IoZGV2aWNlLCBEUkJEX0ZPUkNFX0RFVEFDSCk7CiAJfQogCW50ID0gKHRpbWVfYWZ0ZXIobm93LCByZXEtPnN0YXJ0X3RpbWUgKyBldCkgPyBub3cgOiByZXEtPnN0YXJ0X3RpbWUpICsgZXQ7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCW1vZF90aW1lcigmbWRldi0+cmVxdWVzdF90aW1lciwgbnQpOworCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwltb2RfdGltZXIoJmRldmljZS0+cmVxdWVzdF90aW1lciwgbnQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmggYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZXEuaAppbmRleCAyOGUxNWQ5Li5jNjg0Yzk2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmgKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmgKQEAgLTI3NSwxNyArMjc1LDE3IEBACiAJaW50IGVycm9yOwogfTsKIAotZXh0ZXJuIHZvaWQgc3RhcnRfbmV3X3RsX2Vwb2NoKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7CitleHRlcm4gdm9pZCBzdGFydF9uZXdfdGxfZXBvY2goc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CiBleHRlcm4gdm9pZCBkcmJkX3JlcV9kZXN0cm95KHN0cnVjdCBrcmVmICprcmVmKTsKIGV4dGVybiB2b2lkIF9yZXFfbWF5X2JlX2RvbmUoc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxLAogCQlzdHJ1Y3QgYmlvX2FuZF9lcnJvciAqbSk7CiBleHRlcm4gaW50IF9fcmVxX21vZChzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEsIGVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCwKIAkJc3RydWN0IGJpb19hbmRfZXJyb3IgKm0pOwotZXh0ZXJuIHZvaWQgY29tcGxldGVfbWFzdGVyX2JpbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorZXh0ZXJuIHZvaWQgY29tcGxldGVfbWFzdGVyX2JpbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJc3RydWN0IGJpb19hbmRfZXJyb3IgKm0pOwogZXh0ZXJuIHZvaWQgcmVxdWVzdF90aW1lcl9mbih1bnNpZ25lZCBsb25nIGRhdGEpOwotZXh0ZXJuIHZvaWQgdGxfcmVzdGFydChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCk7Ci1leHRlcm4gdm9pZCBfdGxfcmVzdGFydChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCk7CitleHRlcm4gdm9pZCB0bF9yZXN0YXJ0KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCk7CitleHRlcm4gdm9pZCBfdGxfcmVzdGFydChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBlbnVtIGRyYmRfcmVxX2V2ZW50IHdoYXQpOwogCiAvKiB0aGlzIGlzIGluIGRyYmRfbWFpbi5jICovCiBleHRlcm4gdm9pZCBkcmJkX3Jlc3RhcnRfcmVxdWVzdChzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpOwpAQCAtMjk0LDE0ICsyOTQsMTQgQEAKICAqIG91dHNpZGUgdGhlIHNwaW5sb2NrLCBlLmcuIHdoZW4gd2Fsa2luZyBzb21lIGxpc3Qgb24gY2xlYW51cC4gKi8KIHN0YXRpYyBpbmxpbmUgaW50IF9yZXFfbW9kKHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSwgZW51bSBkcmJkX3JlcV9ldmVudCB3aGF0KQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSByZXEtPncubWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOwogCXN0cnVjdCBiaW9fYW5kX2Vycm9yIG07CiAJaW50IHJ2OwogCiAJLyogX19yZXFfbW9kIHBvc3NpYmx5IGZyZWVzIHJlcSwgZG8gbm90IHRvdWNoIHJlcSBhZnRlciB0aGF0ISAqLwogCXJ2ID0gX19yZXFfbW9kKHJlcSwgd2hhdCwgJm0pOwogCWlmIChtLmJpbykKLQkJY29tcGxldGVfbWFzdGVyX2JpbyhtZGV2LCAmbSk7CisJCWNvbXBsZXRlX21hc3Rlcl9iaW8oZGV2aWNlLCAmbSk7CiAKIAlyZXR1cm4gcnY7CiB9CkBAIC0zMTQsMTYgKzMxNCwxNiBAQAogCQllbnVtIGRyYmRfcmVxX2V2ZW50IHdoYXQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gcmVxLT53Lm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSByZXEtPmRldmljZTsKIAlzdHJ1Y3QgYmlvX2FuZF9lcnJvciBtOwogCWludCBydjsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKIAlydiA9IF9fcmVxX21vZChyZXEsIHdoYXQsICZtKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOwogCiAJaWYgKG0uYmlvKQotCQljb21wbGV0ZV9tYXN0ZXJfYmlvKG1kZXYsICZtKTsKKwkJY29tcGxldGVfbWFzdGVyX2JpbyhkZXZpY2UsICZtKTsKIAogCXJldHVybiBydjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3N0YXRlLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9zdGF0ZS5jCmluZGV4IDIxNmQ0N2IuLjFhODQzNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3N0YXRlLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfc3RhdGUuYwpAQCAtMjcsMTMgKzI3LDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC9kcmJkX2xpbWl0cy5oPgogI2luY2x1ZGUgImRyYmRfaW50LmgiCisjaW5jbHVkZSAiZHJiZF9wcm90b2NvbC5oIgogI2luY2x1ZGUgImRyYmRfcmVxLmgiCiAKLS8qIGluIGRyYmRfbWFpbi5jICovCi1leHRlcm4gdm9pZCB0bF9hYm9ydF9kaXNrX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotCiBzdHJ1Y3QgYWZ0ZXJfc3RhdGVfY2hnX3dvcmsgewogCXN0cnVjdCBkcmJkX3dvcmsgdzsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAl1bmlvbiBkcmJkX3N0YXRlIG9zOwogCXVuaW9uIGRyYmRfc3RhdGUgbnM7CiAJZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3M7CkBAIC01MCwxMiArNDksMTIgQEAKIH07CiAKIHN0YXRpYyBpbnQgd19hZnRlcl9zdGF0ZV9jaChzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgdW51c2VkKTsKLXN0YXRpYyB2b2lkIGFmdGVyX3N0YXRlX2NoKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgb3MsCitzdGF0aWMgdm9pZCBhZnRlcl9zdGF0ZV9jaChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5pb24gZHJiZF9zdGF0ZSBvcywKIAkJCSAgIHVuaW9uIGRyYmRfc3RhdGUgbnMsIGVudW0gY2hnX3N0YXRlX2ZsYWdzIGZsYWdzKTsKLXN0YXRpYyBlbnVtIGRyYmRfc3RhdGVfcnYgaXNfdmFsaWRfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqLCB1bmlvbiBkcmJkX3N0YXRlKTsKLXN0YXRpYyBlbnVtIGRyYmRfc3RhdGVfcnYgaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKHVuaW9uIGRyYmRfc3RhdGUsIHVuaW9uIGRyYmRfc3RhdGUsIHN0cnVjdCBkcmJkX3Rjb25uICopOworc3RhdGljIGVudW0gZHJiZF9zdGF0ZV9ydiBpc192YWxpZF9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgdW5pb24gZHJiZF9zdGF0ZSk7CitzdGF0aWMgZW51bSBkcmJkX3N0YXRlX3J2IGlzX3ZhbGlkX3NvZnRfdHJhbnNpdGlvbih1bmlvbiBkcmJkX3N0YXRlLCB1bmlvbiBkcmJkX3N0YXRlLCBzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICopOwogc3RhdGljIGVudW0gZHJiZF9zdGF0ZV9ydiBpc192YWxpZF90cmFuc2l0aW9uKHVuaW9uIGRyYmRfc3RhdGUgb3MsIHVuaW9uIGRyYmRfc3RhdGUgbnMpOwotc3RhdGljIHVuaW9uIGRyYmRfc3RhdGUgc2FuaXRpemVfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5pb24gZHJiZF9zdGF0ZSBucywKK3N0YXRpYyB1bmlvbiBkcmJkX3N0YXRlIHNhbml0aXplX3N0YXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bmlvbiBkcmJkX3N0YXRlIG5zLAogCQkJCSAgICAgICBlbnVtIHNhbml0aXplX3N0YXRlX3dhcm5pbmdzICp3YXJuKTsKIAogc3RhdGljIGlubGluZSBib29sIGlzX3N1c3AodW5pb24gZHJiZF9zdGF0ZSBzKQpAQCAtNjMsMTcgKzYyLDE4IEBACiAgICAgICAgIHJldHVybiBzLnN1c3AgfHwgcy5zdXNwX25vZCB8fCBzLnN1c3BfZmVuOwogfQogCi1ib29sIGNvbm5fYWxsX3ZvbHNfdW5jb25mKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK2Jvb2wgY29ubl9hbGxfdm9sc191bmNvbmYoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlib29sIHJ2ID0gdHJ1ZTsKIAlpbnQgdm5yOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikgewotCQlpZiAobWRldi0+c3RhdGUuZGlzayAhPSBEX0RJU0tMRVNTIHx8Ci0JCSAgICBtZGV2LT5zdGF0ZS5jb25uICE9IENfU1RBTkRBTE9ORSB8fAotCQkgICAgbWRldi0+c3RhdGUucm9sZSAhPSBSX1NFQ09OREFSWSkgeworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKSB7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJaWYgKGRldmljZS0+c3RhdGUuZGlzayAhPSBEX0RJU0tMRVNTIHx8CisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gIT0gQ19TVEFOREFMT05FIHx8CisJCSAgICBkZXZpY2UtPnN0YXRlLnJvbGUgIT0gUl9TRUNPTkRBUlkpIHsKIAkJCXJ2ID0gZmFsc2U7CiAJCQlicmVhazsKIAkJfQpAQCAtMTAyLDk5ICsxMDIsMTExIEBACiAJcmV0dXJuIFJfUFJJTUFSWTsKIH0KIAotZW51bSBkcmJkX3JvbGUgY29ubl9oaWdoZXN0X3JvbGUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorZW51bSBkcmJkX3JvbGUgY29ubl9oaWdoZXN0X3JvbGUoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAllbnVtIGRyYmRfcm9sZSByb2xlID0gUl9VTktOT1dOOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCWludCB2bnI7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKQotCQlyb2xlID0gbWF4X3JvbGUocm9sZSwgbWRldi0+c3RhdGUucm9sZSk7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQlyb2xlID0gbWF4X3JvbGUocm9sZSwgZGV2aWNlLT5zdGF0ZS5yb2xlKTsKKwl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyZXR1cm4gcm9sZTsKIH0KIAotZW51bSBkcmJkX3JvbGUgY29ubl9oaWdoZXN0X3BlZXIoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorZW51bSBkcmJkX3JvbGUgY29ubl9oaWdoZXN0X3BlZXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAllbnVtIGRyYmRfcm9sZSBwZWVyID0gUl9VTktOT1dOOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCWludCB2bnI7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKQotCQlwZWVyID0gbWF4X3JvbGUocGVlciwgbWRldi0+c3RhdGUucGVlcik7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQlwZWVyID0gbWF4X3JvbGUocGVlciwgZGV2aWNlLT5zdGF0ZS5wZWVyKTsKKwl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyZXR1cm4gcGVlcjsKIH0KIAotZW51bSBkcmJkX2Rpc2tfc3RhdGUgY29ubl9oaWdoZXN0X2Rpc2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorZW51bSBkcmJkX2Rpc2tfc3RhdGUgY29ubl9oaWdoZXN0X2Rpc2soc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAllbnVtIGRyYmRfZGlza19zdGF0ZSBkcyA9IERfRElTS0xFU1M7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZucjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpCi0JCWRzID0gbWF4X3QoZW51bSBkcmJkX2Rpc2tfc3RhdGUsIGRzLCBtZGV2LT5zdGF0ZS5kaXNrKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCWRzID0gbWF4X3QoZW51bSBkcmJkX2Rpc2tfc3RhdGUsIGRzLCBkZXZpY2UtPnN0YXRlLmRpc2spOworCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCXJldHVybiBkczsKIH0KIAotZW51bSBkcmJkX2Rpc2tfc3RhdGUgY29ubl9sb3dlc3RfZGlzayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitlbnVtIGRyYmRfZGlza19zdGF0ZSBjb25uX2xvd2VzdF9kaXNrKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7CiAJZW51bSBkcmJkX2Rpc2tfc3RhdGUgZHMgPSBEX01BU0s7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZucjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpCi0JCWRzID0gbWluX3QoZW51bSBkcmJkX2Rpc2tfc3RhdGUsIGRzLCBtZGV2LT5zdGF0ZS5kaXNrKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCWRzID0gbWluX3QoZW51bSBkcmJkX2Rpc2tfc3RhdGUsIGRzLCBkZXZpY2UtPnN0YXRlLmRpc2spOworCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCXJldHVybiBkczsKIH0KIAotZW51bSBkcmJkX2Rpc2tfc3RhdGUgY29ubl9oaWdoZXN0X3Bkc2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorZW51bSBkcmJkX2Rpc2tfc3RhdGUgY29ubl9oaWdoZXN0X3Bkc2soc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAllbnVtIGRyYmRfZGlza19zdGF0ZSBkcyA9IERfRElTS0xFU1M7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZucjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpCi0JCWRzID0gbWF4X3QoZW51bSBkcmJkX2Rpc2tfc3RhdGUsIGRzLCBtZGV2LT5zdGF0ZS5wZHNrKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCWRzID0gbWF4X3QoZW51bSBkcmJkX2Rpc2tfc3RhdGUsIGRzLCBkZXZpY2UtPnN0YXRlLnBkc2spOworCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCXJldHVybiBkczsKIH0KIAotZW51bSBkcmJkX2Nvbm5zIGNvbm5fbG93ZXN0X2Nvbm4oc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorZW51bSBkcmJkX2Nvbm5zIGNvbm5fbG93ZXN0X2Nvbm4oc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAllbnVtIGRyYmRfY29ubnMgY29ubiA9IENfTUFTSzsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikKLQkJY29ubiA9IG1pbl90KGVudW0gZHJiZF9jb25ucywgY29ubiwgbWRldi0+c3RhdGUuY29ubik7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQljb25uID0gbWluX3QoZW51bSBkcmJkX2Nvbm5zLCBjb25uLCBkZXZpY2UtPnN0YXRlLmNvbm4pOworCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCXJldHVybiBjb25uOwogfQogCi1zdGF0aWMgYm9vbCBub19wZWVyX3dmX3JlcG9ydF9wYXJhbXMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIGJvb2wgbm9fcGVlcl93Zl9yZXBvcnRfcGFyYW1zKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZucjsKIAlib29sIHJ2ID0gdHJ1ZTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpCi0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfV0ZfUkVQT1JUX1BBUkFNUykgeworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKQorCQlpZiAocGVlcl9kZXZpY2UtPmRldmljZS0+c3RhdGUuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKIAkJCXJ2ID0gZmFsc2U7CiAJCQlicmVhazsKIAkJfQpAQCAtMjA2LDExICsyMTgsMTEgQEAKIAogLyoqCiAgKiBjbF93aWRlX3N0X2NoZygpIC0gdHJ1ZSBpZiB0aGUgc3RhdGUgY2hhbmdlIGlzIGEgY2x1c3RlciB3aWRlIG9uZQotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAb3M6CQlvbGQgKGN1cnJlbnQpIHN0YXRlLgogICogQG5zOgkJbmV3ICh3YW50ZWQpIHN0YXRlLgogICovCi1zdGF0aWMgaW50IGNsX3dpZGVfc3RfY2hnKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgaW50IGNsX3dpZGVfc3RfY2hnKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJICB1bmlvbiBkcmJkX3N0YXRlIG9zLCB1bmlvbiBkcmJkX3N0YXRlIG5zKQogewogCXJldHVybiAob3MuY29ubiA+PSBDX0NPTk5FQ1RFRCAmJiBucy5jb25uID49IENfQ09OTkVDVEVEICYmCkBAIC0yMzIsNzIgKzI0NCw3MiBAQAogfQogCiBlbnVtIGRyYmRfc3RhdGVfcnYKLWRyYmRfY2hhbmdlX3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gY2hnX3N0YXRlX2ZsYWdzIGYsCitkcmJkX2NoYW5nZV9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZiwKIAkJICB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5pb24gZHJiZF9zdGF0ZSBuczsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnY7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7Ci0JbnMgPSBhcHBseV9tYXNrX3ZhbChkcmJkX3JlYWRfc3RhdGUobWRldiksIG1hc2ssIHZhbCk7Ci0JcnYgPSBfZHJiZF9zZXRfc3RhdGUobWRldiwgbnMsIGYsIE5VTEwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPnRjb25uLT5yZXFfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOworCW5zID0gYXBwbHlfbWFza192YWwoZHJiZF9yZWFkX3N0YXRlKGRldmljZSksIG1hc2ssIHZhbCk7CisJcnYgPSBfZHJiZF9zZXRfc3RhdGUoZGV2aWNlLCBucywgZiwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiBydjsKIH0KIAogLyoqCiAgKiBkcmJkX2ZvcmNlX3N0YXRlKCkgLSBJbXBvc2UgYSBjaGFuZ2Ugd2hpY2ggaGFwcGVucyBvdXRzaWRlIG91ciBjb250cm9sIG9uIG91ciBzdGF0ZQotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAbWFzazoJbWFzayBvZiBzdGF0ZSBiaXRzIHRvIGNoYW5nZS4KICAqIEB2YWw6CXZhbHVlIG9mIG5ldyBzdGF0ZSBiaXRzLgogICovCi12b2lkIGRyYmRfZm9yY2Vfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3ZvaWQgZHJiZF9mb3JjZV9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAl1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsKQogewotCWRyYmRfY2hhbmdlX3N0YXRlKG1kZXYsIENTX0hBUkQsIG1hc2ssIHZhbCk7CisJZHJiZF9jaGFuZ2Vfc3RhdGUoZGV2aWNlLCBDU19IQVJELCBtYXNrLCB2YWwpOwogfQogCiBzdGF0aWMgZW51bSBkcmJkX3N0YXRlX3J2Ci1fcmVxX3N0X2NvbmQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLAorX3JlcV9zdF9jb25kKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssCiAJICAgICB1bmlvbiBkcmJkX3N0YXRlIHZhbCkKIHsKIAl1bmlvbiBkcmJkX3N0YXRlIG9zLCBuczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWVudW0gZHJiZF9zdGF0ZV9ydiBydjsKIAotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ0xfU1RfQ0hHX1NVQ0NFU1MsICZtZGV2LT5mbGFncykpCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDTF9TVF9DSEdfU1VDQ0VTUywgJmRldmljZS0+ZmxhZ3MpKQogCQlyZXR1cm4gU1NfQ1dfU1VDQ0VTUzsKIAotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ0xfU1RfQ0hHX0ZBSUwsICZtZGV2LT5mbGFncykpCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDTF9TVF9DSEdfRkFJTCwgJmRldmljZS0+ZmxhZ3MpKQogCQlyZXR1cm4gU1NfQ1dfRkFJTEVEX0JZX1BFRVI7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7Ci0Jb3MgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7Ci0JbnMgPSBzYW5pdGl6ZV9zdGF0ZShtZGV2LCBhcHBseV9tYXNrX3ZhbChvcywgbWFzaywgdmFsKSwgTlVMTCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CisJb3MgPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKTsKKwlucyA9IHNhbml0aXplX3N0YXRlKGRldmljZSwgYXBwbHlfbWFza192YWwob3MsIG1hc2ssIHZhbCksIE5VTEwpOwogCXJ2ID0gaXNfdmFsaWRfdHJhbnNpdGlvbihvcywgbnMpOwogCWlmIChydiA+PSBTU19TVUNDRVNTKQogCQlydiA9IFNTX1VOS05PV05fRVJST1I7ICAvKiBjb250IHdhaXRpbmcsIG90aGVyd2lzZSBmYWlsLiAqLwogCi0JaWYgKCFjbF93aWRlX3N0X2NoZyhtZGV2LCBvcywgbnMpKQorCWlmICghY2xfd2lkZV9zdF9jaGcoZGV2aWNlLCBvcywgbnMpKQogCQlydiA9IFNTX0NXX05PX05FRUQ7CiAJaWYgKHJ2ID09IFNTX1VOS05PV05fRVJST1IpIHsKLQkJcnYgPSBpc192YWxpZF9zdGF0ZShtZGV2LCBucyk7CisJCXJ2ID0gaXNfdmFsaWRfc3RhdGUoZGV2aWNlLCBucyk7CiAJCWlmIChydiA+PSBTU19TVUNDRVNTKSB7Ci0JCQlydiA9IGlzX3ZhbGlkX3NvZnRfdHJhbnNpdGlvbihvcywgbnMsIG1kZXYtPnRjb25uKTsKKwkJCXJ2ID0gaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKG9zLCBucywgZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbik7CiAJCQlpZiAocnYgPj0gU1NfU1VDQ0VTUykKIAkJCQlydiA9IFNTX1VOS05PV05fRVJST1I7IC8qIGNvbnQgd2FpdGluZywgb3RoZXJ3aXNlIGZhaWwuICovCiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiBydjsKIH0KIAogLyoqCiAgKiBkcmJkX3JlcV9zdGF0ZSgpIC0gUGVyZm9ybSBhbiBldmVudHVhbGx5IGNsdXN0ZXIgd2lkZSBzdGF0ZSBjaGFuZ2UKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQG1hc2s6CW1hc2sgb2Ygc3RhdGUgYml0cyB0byBjaGFuZ2UuCiAgKiBAdmFsOgl2YWx1ZSBvZiBuZXcgc3RhdGUgYml0cy4KICAqIEBmOgkJZmxhZ3MKQEAgLTMwNiw3ICszMTgsNyBAQAogICogX2RyYmRfcmVxdWVzdF9zdGF0ZSgpLgogICovCiBzdGF0aWMgZW51bSBkcmJkX3N0YXRlX3J2Ci1kcmJkX3JlcV9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssCitkcmJkX3JlcV9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLAogCSAgICAgICB1bmlvbiBkcmJkX3N0YXRlIHZhbCwgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZikKIHsKIAlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOwpAQCAtMzE3LDY4ICszMjksNjggQEAKIAlpbml0X2NvbXBsZXRpb24oJmRvbmUpOwogCiAJaWYgKGYgJiBDU19TRVJJQUxJWkUpCi0JCW11dGV4X2xvY2sobWRldi0+c3RhdGVfbXV0ZXgpOworCQltdXRleF9sb2NrKGRldmljZS0+c3RhdGVfbXV0ZXgpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPnRjb25uLT5yZXFfbG9jaywgZmxhZ3MpOwotCW9zID0gZHJiZF9yZWFkX3N0YXRlKG1kZXYpOwotCW5zID0gc2FuaXRpemVfc3RhdGUobWRldiwgYXBwbHlfbWFza192YWwob3MsIG1hc2ssIHZhbCksIE5VTEwpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOworCW9zID0gZHJiZF9yZWFkX3N0YXRlKGRldmljZSk7CisJbnMgPSBzYW5pdGl6ZV9zdGF0ZShkZXZpY2UsIGFwcGx5X21hc2tfdmFsKG9zLCBtYXNrLCB2YWwpLCBOVUxMKTsKIAlydiA9IGlzX3ZhbGlkX3RyYW5zaXRpb24ob3MsIG5zKTsKIAlpZiAocnYgPCBTU19TVUNDRVNTKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPnRjb25uLT5yZXFfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOwogCQlnb3RvIGFib3J0OwogCX0KIAotCWlmIChjbF93aWRlX3N0X2NoZyhtZGV2LCBvcywgbnMpKSB7Ci0JCXJ2ID0gaXNfdmFsaWRfc3RhdGUobWRldiwgbnMpOworCWlmIChjbF93aWRlX3N0X2NoZyhkZXZpY2UsIG9zLCBucykpIHsKKwkJcnYgPSBpc192YWxpZF9zdGF0ZShkZXZpY2UsIG5zKTsKIAkJaWYgKHJ2ID09IFNTX1NVQ0NFU1MpCi0JCQlydiA9IGlzX3ZhbGlkX3NvZnRfdHJhbnNpdGlvbihvcywgbnMsIG1kZXYtPnRjb25uKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7CisJCQlydiA9IGlzX3ZhbGlkX3NvZnRfdHJhbnNpdGlvbihvcywgbnMsIGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOwogCiAJCWlmIChydiA8IFNTX1NVQ0NFU1MpIHsKIAkJCWlmIChmICYgQ1NfVkVSQk9TRSkKLQkJCQlwcmludF9zdF9lcnIobWRldiwgb3MsIG5zLCBydik7CisJCQkJcHJpbnRfc3RfZXJyKGRldmljZSwgb3MsIG5zLCBydik7CiAJCQlnb3RvIGFib3J0OwogCQl9CiAKLQkJaWYgKGRyYmRfc2VuZF9zdGF0ZV9yZXEobWRldiwgbWFzaywgdmFsKSkgeworCQlpZiAoZHJiZF9zZW5kX3N0YXRlX3JlcShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBtYXNrLCB2YWwpKSB7CiAJCQlydiA9IFNTX0NXX0ZBSUxFRF9CWV9QRUVSOwogCQkJaWYgKGYgJiBDU19WRVJCT1NFKQotCQkJCXByaW50X3N0X2VycihtZGV2LCBvcywgbnMsIHJ2KTsKKwkJCQlwcmludF9zdF9lcnIoZGV2aWNlLCBvcywgbnMsIHJ2KTsKIAkJCWdvdG8gYWJvcnQ7CiAJCX0KIAotCQl3YWl0X2V2ZW50KG1kZXYtPnN0YXRlX3dhaXQsCi0JCQkocnYgPSBfcmVxX3N0X2NvbmQobWRldiwgbWFzaywgdmFsKSkpOworCQl3YWl0X2V2ZW50KGRldmljZS0+c3RhdGVfd2FpdCwKKwkJCShydiA9IF9yZXFfc3RfY29uZChkZXZpY2UsIG1hc2ssIHZhbCkpKTsKIAogCQlpZiAocnYgPCBTU19TVUNDRVNTKSB7CiAJCQlpZiAoZiAmIENTX1ZFUkJPU0UpCi0JCQkJcHJpbnRfc3RfZXJyKG1kZXYsIG9zLCBucywgcnYpOworCQkJCXByaW50X3N0X2VycihkZXZpY2UsIG9zLCBucywgcnYpOwogCQkJZ290byBhYm9ydDsKIAkJfQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7Ci0JCW5zID0gYXBwbHlfbWFza192YWwoZHJiZF9yZWFkX3N0YXRlKG1kZXYpLCBtYXNrLCB2YWwpOwotCQlydiA9IF9kcmJkX3NldF9zdGF0ZShtZGV2LCBucywgZiwgJmRvbmUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKKwkJbnMgPSBhcHBseV9tYXNrX3ZhbChkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKSwgbWFzaywgdmFsKTsKKwkJcnYgPSBfZHJiZF9zZXRfc3RhdGUoZGV2aWNlLCBucywgZiwgJmRvbmUpOwogCX0gZWxzZSB7Ci0JCXJ2ID0gX2RyYmRfc2V0X3N0YXRlKG1kZXYsIG5zLCBmLCAmZG9uZSk7CisJCXJ2ID0gX2RyYmRfc2V0X3N0YXRlKGRldmljZSwgbnMsIGYsICZkb25lKTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGYgJiBDU19XQUlUX0NPTVBMRVRFICYmIHJ2ID09IFNTX1NVQ0NFU1MpIHsKLQkJRF9BU1NFUlQoY3VycmVudCAhPSBtZGV2LT50Y29ubi0+d29ya2VyLnRhc2spOworCQlEX0FTU0VSVChkZXZpY2UsIGN1cnJlbnQgIT0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+d29ya2VyLnRhc2spOwogCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkb25lKTsKIAl9CiAKIGFib3J0OgogCWlmIChmICYgQ1NfU0VSSUFMSVpFKQotCQltdXRleF91bmxvY2sobWRldi0+c3RhdGVfbXV0ZXgpOworCQltdXRleF91bmxvY2soZGV2aWNlLT5zdGF0ZV9tdXRleCk7CiAKIAlyZXR1cm4gcnY7CiB9CiAKIC8qKgogICogX2RyYmRfcmVxdWVzdF9zdGF0ZSgpIC0gUmVxdWVzdCBhIHN0YXRlIGNoYW5nZSAod2l0aCBmbGFncykKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQG1hc2s6CW1hc2sgb2Ygc3RhdGUgYml0cyB0byBjaGFuZ2UuCiAgKiBAdmFsOgl2YWx1ZSBvZiBuZXcgc3RhdGUgYml0cy4KICAqIEBmOgkJZmxhZ3MKQEAgLTM4NywyMCArMzk5LDIwIEBACiAgKiBmbGFnLCBvciB3aGVuIGxvZ2dpbmcgb2YgZmFpbGVkIHN0YXRlIGNoYW5nZSByZXF1ZXN0cyBpcyBub3QgZGVzaXJlZC4KICAqLwogZW51bSBkcmJkX3N0YXRlX3J2Ci1fZHJiZF9yZXF1ZXN0X3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywKK19kcmJkX3JlcXVlc3Rfc3RhdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywKIAkJICAgIHVuaW9uIGRyYmRfc3RhdGUgdmFsLCBlbnVtIGNoZ19zdGF0ZV9mbGFncyBmKQogewogCWVudW0gZHJiZF9zdGF0ZV9ydiBydjsKIAotCXdhaXRfZXZlbnQobWRldi0+c3RhdGVfd2FpdCwKLQkJICAgKHJ2ID0gZHJiZF9yZXFfc3RhdGUobWRldiwgbWFzaywgdmFsLCBmKSkgIT0gU1NfSU5fVFJBTlNJRU5UX1NUQVRFKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+c3RhdGVfd2FpdCwKKwkJICAgKHJ2ID0gZHJiZF9yZXFfc3RhdGUoZGV2aWNlLCBtYXNrLCB2YWwsIGYpKSAhPSBTU19JTl9UUkFOU0lFTlRfU1RBVEUpOwogCiAJcmV0dXJuIHJ2OwogfQogCi1zdGF0aWMgdm9pZCBwcmludF9zdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjaGFyICpuYW1lLCB1bmlvbiBkcmJkX3N0YXRlIG5zKQorc3RhdGljIHZvaWQgcHJpbnRfc3Qoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNoYXIgKm5hbWUsIHVuaW9uIGRyYmRfc3RhdGUgbnMpCiB7Ci0JZGV2X2VycihERVYsICIgJXMgPSB7IGNzOiVzIHJvOiVzLyVzIGRzOiVzLyVzICVjJWMlYyVjJWMlYyB9XG4iLAorCWRyYmRfZXJyKGRldmljZSwgIiAlcyA9IHsgY3M6JXMgcm86JXMvJXMgZHM6JXMvJXMgJWMlYyVjJWMlYyVjIH1cbiIsCiAJICAgIG5hbWUsCiAJICAgIGRyYmRfY29ubl9zdHIobnMuY29ubiksCiAJICAgIGRyYmRfcm9sZV9zdHIobnMucm9sZSksCkBAIC00MTYsMTQgKzQyOCwxNCBAQAogCSAgICApOwogfQogCi12b2lkIHByaW50X3N0X2VycihzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bmlvbiBkcmJkX3N0YXRlIG9zLAordm9pZCBwcmludF9zdF9lcnIoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuaW9uIGRyYmRfc3RhdGUgb3MsCiAJICAgICAgICAgIHVuaW9uIGRyYmRfc3RhdGUgbnMsIGVudW0gZHJiZF9zdGF0ZV9ydiBlcnIpCiB7CiAJaWYgKGVyciA9PSBTU19JTl9UUkFOU0lFTlRfU1RBVEUpCiAJCXJldHVybjsKLQlkZXZfZXJyKERFViwgIlN0YXRlIGNoYW5nZSBmYWlsZWQ6ICVzXG4iLCBkcmJkX3NldF9zdF9lcnJfc3RyKGVycikpOwotCXByaW50X3N0KG1kZXYsICIgc3RhdGUiLCBvcyk7Ci0JcHJpbnRfc3QobWRldiwgIndhbnRlZCIsIG5zKTsKKwlkcmJkX2VycihkZXZpY2UsICJTdGF0ZSBjaGFuZ2UgZmFpbGVkOiAlc1xuIiwgZHJiZF9zZXRfc3RfZXJyX3N0cihlcnIpKTsKKwlwcmludF9zdChkZXZpY2UsICIgc3RhdGUiLCBvcyk7CisJcHJpbnRfc3QoZGV2aWNlLCAid2FudGVkIiwgbnMpOwogfQogCiBzdGF0aWMgbG9uZyBwcmludF9zdGF0ZV9jaGFuZ2UoY2hhciAqcGIsIHVuaW9uIGRyYmRfc3RhdGUgb3MsIHVuaW9uIGRyYmRfc3RhdGUgbnMsCkBAIC00NTcsNyArNDY5LDcgQEAKIAlyZXR1cm4gcGJwIC0gcGI7CiB9CiAKLXN0YXRpYyB2b2lkIGRyYmRfcHJfc3RhdGVfY2hhbmdlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgb3MsIHVuaW9uIGRyYmRfc3RhdGUgbnMsCitzdGF0aWMgdm9pZCBkcmJkX3ByX3N0YXRlX2NoYW5nZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5pb24gZHJiZF9zdGF0ZSBvcywgdW5pb24gZHJiZF9zdGF0ZSBucywKIAkJCQkgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3MpCiB7CiAJY2hhciBwYlszMDBdOwpAQCAtNDc5LDEwICs0OTEsMTAgQEAKIAkJCSAgICAgICBucy51c2VyX2lzcCk7CiAKIAlpZiAocGJwICE9IHBiKQotCQlkZXZfaW5mbyhERVYsICIlc1xuIiwgcGIpOworCQlkcmJkX2luZm8oZGV2aWNlLCAiJXNcbiIsIHBiKTsKIH0KIAotc3RhdGljIHZvaWQgY29ubl9wcl9zdGF0ZV9jaGFuZ2Uoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bmlvbiBkcmJkX3N0YXRlIG9zLCB1bmlvbiBkcmJkX3N0YXRlIG5zLAorc3RhdGljIHZvaWQgY29ubl9wcl9zdGF0ZV9jaGFuZ2Uoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdW5pb24gZHJiZF9zdGF0ZSBvcywgdW5pb24gZHJiZF9zdGF0ZSBucywKIAkJCQkgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3MpCiB7CiAJY2hhciBwYlszMDBdOwpAQCAtNDk2LDE3ICs1MDgsMTcgQEAKIAkJCSAgICAgICBpc19zdXNwKG5zKSk7CiAKIAlpZiAocGJwICE9IHBiKQotCQljb25uX2luZm8odGNvbm4sICIlc1xuIiwgcGIpOworCQlkcmJkX2luZm8oY29ubmVjdGlvbiwgIiVzXG4iLCBwYik7CiB9CiAKIAogLyoqCiAgKiBpc192YWxpZF9zdGF0ZSgpIC0gUmV0dXJucyBhbiBTU18gZXJyb3IgY29kZSBpZiBucyBpcyBub3QgdmFsaWQKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQG5zOgkJU3RhdGUgdG8gY29uc2lkZXIuCiAgKi8KIHN0YXRpYyBlbnVtIGRyYmRfc3RhdGVfcnYKLWlzX3ZhbGlkX3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgbnMpCitpc192YWxpZF9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5pb24gZHJiZF9zdGF0ZSBucykKIHsKIAkvKiBTZWUgZHJiZF9zdGF0ZV9zd19lcnJvcnMgaW4gZHJiZF9zdHJpbmdzLmMgKi8KIApAQCAtNTE2LDI0ICs1MjgsMjQgQEAKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlmcCA9IEZQX0RPTlRfQ0FSRTsKLQlpZiAoZ2V0X2xkZXYobWRldikpIHsKLQkJZnAgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKS0+ZmVuY2luZzsKLQkJcHV0X2xkZXYobWRldik7CisJaWYgKGdldF9sZGV2KGRldmljZSkpIHsKKwkJZnAgPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5mZW5jaW5nOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAotCW5jID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZik7CisJbmMgPSByY3VfZGVyZWZlcmVuY2UoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpOwogCWlmIChuYykgewogCQlpZiAoIW5jLT50d29fcHJpbWFyaWVzICYmIG5zLnJvbGUgPT0gUl9QUklNQVJZKSB7CiAJCQlpZiAobnMucGVlciA9PSBSX1BSSU1BUlkpCiAJCQkJcnYgPSBTU19UV09fUFJJTUFSSUVTOwotCQkJZWxzZSBpZiAoY29ubl9oaWdoZXN0X3BlZXIobWRldi0+dGNvbm4pID09IFJfUFJJTUFSWSkKKwkJCWVsc2UgaWYgKGNvbm5faGlnaGVzdF9wZWVyKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pID09IFJfUFJJTUFSWSkKIAkJCQlydiA9IFNTX09fVk9MX1BFRVJfUFJJOwogCQl9CiAJfQogCiAJaWYgKHJ2IDw9IDApCiAJCS8qIGFscmVhZHkgZm91bmQgYSByZWFzb24gdG8gYWJvcnQgKi87Ci0JZWxzZSBpZiAobnMucm9sZSA9PSBSX1NFQ09OREFSWSAmJiBtZGV2LT5vcGVuX2NudCkKKwllbHNlIGlmIChucy5yb2xlID09IFJfU0VDT05EQVJZICYmIGRldmljZS0+b3Blbl9jbnQpCiAJCXJ2ID0gU1NfREVWSUNFX0lOX1VTRTsKIAogCWVsc2UgaWYgKG5zLnJvbGUgPT0gUl9QUklNQVJZICYmIG5zLmNvbm4gPCBDX0NPTk5FQ1RFRCAmJiBucy5kaXNrIDwgRF9VUF9UT19EQVRFKQpAQCAtNTY3LDcgKzU3OSw3IEBACiAJCXJ2ID0gU1NfTk9fVkVSSUZZX0FMRzsKIAogCWVsc2UgaWYgKChucy5jb25uID09IENfVkVSSUZZX1MgfHwgbnMuY29ubiA9PSBDX1ZFUklGWV9UKSAmJgotCQkgIG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA4OCkKKwkJICBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA4OCkKIAkJcnYgPSBTU19OT1RfU1VQUE9SVEVEOwogCiAJZWxzZSBpZiAobnMucm9sZSA9PSBSX1BSSU1BUlkgJiYgbnMuZGlzayA8IERfVVBfVE9fREFURSAmJiBucy5wZHNrIDwgRF9VUF9UT19EQVRFKQpAQCAtNTg5LDEyICs2MDEsMTIgQEAKICAqIGlzX3ZhbGlkX3NvZnRfdHJhbnNpdGlvbigpIC0gUmV0dXJucyBhbiBTU18gZXJyb3IgY29kZSBpZiB0aGUgc3RhdGUgdHJhbnNpdGlvbiBpcyBub3QgcG9zc2libGUKICAqIFRoaXMgZnVuY3Rpb24gbGltaXRzIHN0YXRlIHRyYW5zaXRpb25zIHRoYXQgbWF5IGJlIGRlY2xpbmVkIGJ5IERSQkQuIEkuZS4KICAqIHVzZXIgcmVxdWVzdHMgKGFrYSBzb2Z0IHRyYW5zaXRpb25zKS4KLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQG5zOgkJbmV3IHN0YXRlLgogICogQG9zOgkJb2xkIHN0YXRlLgogICovCiBzdGF0aWMgZW51bSBkcmJkX3N0YXRlX3J2Ci1pc192YWxpZF9zb2Z0X3RyYW5zaXRpb24odW5pb24gZHJiZF9zdGF0ZSBvcywgdW5pb24gZHJiZF9zdGF0ZSBucywgc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQoraXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKHVuaW9uIGRyYmRfc3RhdGUgb3MsIHVuaW9uIGRyYmRfc3RhdGUgbnMsIHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7CiAJZW51bSBkcmJkX3N0YXRlX3J2IHJ2ID0gU1NfU1VDQ0VTUzsKIApAQCAtNjIyLDcgKzYzNCw3IEBACiAKIAkvKiBXaGlsZSBlc3RhYmxpc2hpbmcgYSBjb25uZWN0aW9uIG9ubHkgYWxsb3cgY3N0YXRlIHRvIGNoYW5nZS4KIAkgICBEZWxheS9yZWZ1c2Ugcm9sZSBjaGFuZ2VzLCBkZXRhY2ggYXR0YWNoIGV0Yy4uLiAqLwotCWlmICh0ZXN0X2JpdChTVEFURV9TRU5ULCAmdGNvbm4tPmZsYWdzKSAmJgorCWlmICh0ZXN0X2JpdChTVEFURV9TRU5ULCAmY29ubmVjdGlvbi0+ZmxhZ3MpICYmCiAJICAgICEob3MuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMgfHwKIAkgICAgICAobnMuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMgJiYgb3MuY29ubiA9PSBDX1dGX0NPTk5FQ1RJT04pKSkKIAkJcnYgPSBTU19JTl9UUkFOU0lFTlRfU1RBVEU7CkBAIC03MDMsNyArNzE1LDcgQEAKIAlyZXR1cm4gcnY7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X3Nhbml0aXplX3dhcm5pbmdzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gc2FuaXRpemVfc3RhdGVfd2FybmluZ3Mgd2FybikKK3N0YXRpYyB2b2lkIHByaW50X3Nhbml0aXplX3dhcm5pbmdzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBlbnVtIHNhbml0aXplX3N0YXRlX3dhcm5pbmdzIHdhcm4pCiB7CiAJc3RhdGljIGNvbnN0IGNoYXIgKm1zZ190YWJsZVtdID0gewogCQlbTk9fV0FSTklOR10gPSAiIiwKQEAgLTcxNSwxMiArNzI3LDEyIEBACiAJfTsKIAogCWlmICh3YXJuICE9IE5PX1dBUk5JTkcpCi0JCWRldl93YXJuKERFViwgIiVzXG4iLCBtc2dfdGFibGVbd2Fybl0pOworCQlkcmJkX3dhcm4oZGV2aWNlLCAiJXNcbiIsIG1zZ190YWJsZVt3YXJuXSk7CiB9CiAKIC8qKgogICogc2FuaXRpemVfc3RhdGUoKSAtIFJlc29sdmVzIGltcGxpY2l0bHkgbmVjZXNzYXJ5IGFkZGl0aW9uYWwgY2hhbmdlcyB0byBhIHN0YXRlIHRyYW5zaXRpb24KLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQG9zOgkJb2xkIHN0YXRlLgogICogQG5zOgkJbmV3IHN0YXRlLgogICogQHdhcm5fc3luY19hYm9ydDoKQEAgLTcyOCw3ICs3NDAsNyBAQAogICogV2hlbiB3ZSBsb29zZSBjb25uZWN0aW9uLCB3ZSBoYXZlIHRvIHNldCB0aGUgc3RhdGUgb2YgdGhlIHBlZXJzIGRpc2sgKHBkc2spCiAgKiB0byBEX1VOS05PV04uIFRoaXMgcnVsZSBhbmQgbWFueSBtb3JlIGFsb25nIHRob3NlIGxpbmVzIGFyZSBpbiB0aGlzIGZ1bmN0aW9uLgogICovCi1zdGF0aWMgdW5pb24gZHJiZF9zdGF0ZSBzYW5pdGl6ZV9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bmlvbiBkcmJkX3N0YXRlIG5zLAorc3RhdGljIHVuaW9uIGRyYmRfc3RhdGUgc2FuaXRpemVfc3RhdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuaW9uIGRyYmRfc3RhdGUgbnMsCiAJCQkJICAgICAgIGVudW0gc2FuaXRpemVfc3RhdGVfd2FybmluZ3MgKndhcm4pCiB7CiAJZW51bSBkcmJkX2ZlbmNpbmdfcCBmcDsKQEAgLTczOCwxMSArNzUwLDExIEBACiAJCSp3YXJuID0gTk9fV0FSTklORzsKIAogCWZwID0gRlBfRE9OVF9DQVJFOwotCWlmIChnZXRfbGRldihtZGV2KSkgeworCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJZnAgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKS0+ZmVuY2luZzsKKwkJZnAgPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5mZW5jaW5nOwogCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJLyogSW1wbGljYXRpb25zIGZyb20gY29ubmVjdGlvbiB0byBwZWVyIGFuZCBwZWVyX2lzcCAqLwpAQCAtNzY4LDE3ICs3ODAsMTcgQEAKIAogCS8qIENvbm5lY3Rpb24gYnJlYWtzIGRvd24gYmVmb3JlIHdlIGZpbmlzaGVkICJOZWdvdGlhdGluZyIgKi8KIAlpZiAobnMuY29ubiA8IENfQ09OTkVDVEVEICYmIG5zLmRpc2sgPT0gRF9ORUdPVElBVElORyAmJgotCSAgICBnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX05FR09USUFUSU5HKSkgewotCQlpZiAobWRldi0+ZWRfdXVpZCA9PSBtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0NVUlJFTlRdKSB7Ci0JCQlucy5kaXNrID0gbWRldi0+bmV3X3N0YXRlX3RtcC5kaXNrOwotCQkJbnMucGRzayA9IG1kZXYtPm5ld19zdGF0ZV90bXAucGRzazsKKwkgICAgZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX05FR09USUFUSU5HKSkgeworCQlpZiAoZGV2aWNlLT5lZF91dWlkID09IGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSkgeworCQkJbnMuZGlzayA9IGRldmljZS0+bmV3X3N0YXRlX3RtcC5kaXNrOworCQkJbnMucGRzayA9IGRldmljZS0+bmV3X3N0YXRlX3RtcC5wZHNrOwogCQl9IGVsc2UgewogCQkJaWYgKHdhcm4pCiAJCQkJKndhcm4gPSBDT05ORUNUSU9OX0xPU1RfTkVHT1RJQVRJTkc7CiAJCQlucy5kaXNrID0gRF9ESVNLTEVTUzsKIAkJCW5zLnBkc2sgPSBEX1VOS05PV047CiAJCX0KLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJLyogRF9DT05TSVNURU5UIGFuZCBEX09VVERBVEVEIHZhbmlzaCB3aGVuIHdlIGdldCBjb25uZWN0ZWQgKi8KQEAgLTg3Myw3ICs4ODUsNyBAQAogCSAgICAobnMucm9sZSA9PSBSX1BSSU1BUlkgJiYgbnMuY29ubiA8IENfQ09OTkVDVEVEICYmIG5zLnBkc2sgPiBEX09VVERBVEVEKSkKIAkJbnMuc3VzcF9mZW4gPSAxOyAvKiBTdXNwZW5kIElPIHdoaWxlIGZlbmNlLXBlZXIgaGFuZGxlciBydW5zIChwZWVyIGxvc3QpICovCiAKLQlpZiAobWRldi0+dGNvbm4tPnJlc19vcHRzLm9uX25vX2RhdGEgPT0gT05EX1NVU1BFTkRfSU8gJiYKKwlpZiAoZGV2aWNlLT5yZXNvdXJjZS0+cmVzX29wdHMub25fbm9fZGF0YSA9PSBPTkRfU1VTUEVORF9JTyAmJgogCSAgICAobnMucm9sZSA9PSBSX1BSSU1BUlkgJiYgbnMuZGlzayA8IERfVVBfVE9fREFURSAmJiBucy5wZHNrIDwgRF9VUF9UT19EQVRFKSkKIAkJbnMuc3VzcF9ub2QgPSAxOyAvKiBTdXNwZW5kIElPIHdoaWxlIG5vIGRhdGEgYXZhaWxhYmxlIChubyBhY2Nlc3NpYmxlIGRhdGEgYXZhaWxhYmxlKSAqLwogCkBAIC04OTIsNDIgKzkwNCw0MiBAQAogCXJldHVybiBuczsKIH0KIAotdm9pZCBkcmJkX3Jlc3VtZV9hbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX3Jlc3VtZV9hbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFMX1NVU1BFTkRFRCwgJm1kZXYtPmZsYWdzKSkKLQkJZGV2X2luZm8oREVWLCAiUmVzdW1lZCBBTCB1cGRhdGVzXG4iKTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFMX1NVU1BFTkRFRCwgJmRldmljZS0+ZmxhZ3MpKQorCQlkcmJkX2luZm8oZGV2aWNlLCAiUmVzdW1lZCBBTCB1cGRhdGVzXG4iKTsKIH0KIAogLyogaGVscGVyIGZvciBfX2RyYmRfc2V0X3N0YXRlICovCi1zdGF0aWMgdm9pZCBzZXRfb3ZfcG9zaXRpb24oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX2Nvbm5zIGNzKQorc3RhdGljIHZvaWQgc2V0X292X3Bvc2l0aW9uKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBlbnVtIGRyYmRfY29ubnMgY3MpCiB7Ci0JaWYgKG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5MCkKLQkJbWRldi0+b3Zfc3RhcnRfc2VjdG9yID0gMDsKLQltZGV2LT5yc190b3RhbCA9IGRyYmRfYm1fYml0cyhtZGV2KTsKLQltZGV2LT5vdl9wb3NpdGlvbiA9IDA7CisJaWYgKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkwKQorCQlkZXZpY2UtPm92X3N0YXJ0X3NlY3RvciA9IDA7CisJZGV2aWNlLT5yc190b3RhbCA9IGRyYmRfYm1fYml0cyhkZXZpY2UpOworCWRldmljZS0+b3ZfcG9zaXRpb24gPSAwOwogCWlmIChjcyA9PSBDX1ZFUklGWV9UKSB7CiAJCS8qIHN0YXJ0aW5nIG9ubGluZSB2ZXJpZnkgZnJvbSBhbiBhcmJpdHJhcnkgcG9zaXRpb24KIAkJICogZG9lcyBub3QgZml0IHdlbGwgaW50byB0aGUgZXhpc3RpbmcgcHJvdG9jb2wuCiAJCSAqIG9uIENfVkVSSUZZX1QsIHdlIGluaXRpYWxpemUgb3ZfbGVmdCBhbmQgZnJpZW5kcwogCQkgKiBpbXBsaWNpdGx5IGluIHJlY2VpdmVfRGF0YVJlcXVlc3Qgb25jZSB0aGUKIAkJICogZmlyc3QgUF9PVl9SRVFVRVNUIGlzIHJlY2VpdmVkICovCi0JCW1kZXYtPm92X3N0YXJ0X3NlY3RvciA9IH4oc2VjdG9yX3QpMDsKKwkJZGV2aWNlLT5vdl9zdGFydF9zZWN0b3IgPSB+KHNlY3Rvcl90KTA7CiAJfSBlbHNlIHsKLQkJdW5zaWduZWQgbG9uZyBiaXQgPSBCTV9TRUNUX1RPX0JJVChtZGV2LT5vdl9zdGFydF9zZWN0b3IpOwotCQlpZiAoYml0ID49IG1kZXYtPnJzX3RvdGFsKSB7Ci0JCQltZGV2LT5vdl9zdGFydF9zZWN0b3IgPQotCQkJCUJNX0JJVF9UT19TRUNUKG1kZXYtPnJzX3RvdGFsIC0gMSk7Ci0JCQltZGV2LT5yc190b3RhbCA9IDE7CisJCXVuc2lnbmVkIGxvbmcgYml0ID0gQk1fU0VDVF9UT19CSVQoZGV2aWNlLT5vdl9zdGFydF9zZWN0b3IpOworCQlpZiAoYml0ID49IGRldmljZS0+cnNfdG90YWwpIHsKKwkJCWRldmljZS0+b3Zfc3RhcnRfc2VjdG9yID0KKwkJCQlCTV9CSVRfVE9fU0VDVChkZXZpY2UtPnJzX3RvdGFsIC0gMSk7CisJCQlkZXZpY2UtPnJzX3RvdGFsID0gMTsKIAkJfSBlbHNlCi0JCQltZGV2LT5yc190b3RhbCAtPSBiaXQ7Ci0JCW1kZXYtPm92X3Bvc2l0aW9uID0gbWRldi0+b3Zfc3RhcnRfc2VjdG9yOworCQkJZGV2aWNlLT5yc190b3RhbCAtPSBiaXQ7CisJCWRldmljZS0+b3ZfcG9zaXRpb24gPSBkZXZpY2UtPm92X3N0YXJ0X3NlY3RvcjsKIAl9Ci0JbWRldi0+b3ZfbGVmdCA9IG1kZXYtPnJzX3RvdGFsOworCWRldmljZS0+b3ZfbGVmdCA9IGRldmljZS0+cnNfdG90YWw7CiB9CiAKIC8qKgogICogX19kcmJkX3NldF9zdGF0ZSgpIC0gU2V0IGEgbmV3IERSQkQgc3RhdGUKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQG5zOgkJbmV3IHN0YXRlLgogICogQGZsYWdzOglGbGFncwogICogQGRvbmU6CU9wdGlvbmFsIGNvbXBsZXRpb24sIHRoYXQgd2lsbCBnZXQgY29tcGxldGVkIGFmdGVyIHRoZSBhZnRlcl9zdGF0ZV9jaCgpIGZpbmlzaGVkCkBAIC05MzUsNyArOTQ3LDcgQEAKICAqIENhbGxlciBuZWVkcyB0byBob2xkIHJlcV9sb2NrLCBhbmQgZ2xvYmFsX3N0YXRlX2xvY2suIERvIG5vdCBjYWxsIGRpcmVjdGx5LgogICovCiBlbnVtIGRyYmRfc3RhdGVfcnYKLV9fZHJiZF9zZXRfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5pb24gZHJiZF9zdGF0ZSBucywKK19fZHJiZF9zZXRfc3RhdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuaW9uIGRyYmRfc3RhdGUgbnMsCiAJICAgICAgICAgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3MsIHN0cnVjdCBjb21wbGV0aW9uICpkb25lKQogewogCXVuaW9uIGRyYmRfc3RhdGUgb3M7CkBAIC05NDQsOSArOTU2LDkgQEAKIAlzdHJ1Y3QgYWZ0ZXJfc3RhdGVfY2hnX3dvcmsgKmFzY3c7CiAJYm9vbCBkaWRfcmVtb3RlLCBzaG91bGRfZG9fcmVtb3RlOwogCi0Jb3MgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7CisJb3MgPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKTsKIAotCW5zID0gc2FuaXRpemVfc3RhdGUobWRldiwgbnMsICZzc3cpOworCW5zID0gc2FuaXRpemVfc3RhdGUoZGV2aWNlLCBucywgJnNzdyk7CiAJaWYgKG5zLmkgPT0gb3MuaSkKIAkJcmV0dXJuIFNTX05PVEhJTkdfVE9fRE87CiAKQEAgLTk1OCwzMiArOTcwLDMzIEBACiAJCS8qICBwcmUtc3RhdGUtY2hhbmdlIGNoZWNrcyA7IG9ubHkgbG9vayBhdCBucyAgKi8KIAkJLyogU2VlIGRyYmRfc3RhdGVfc3dfZXJyb3JzIGluIGRyYmRfc3RyaW5ncy5jICovCiAKLQkJcnYgPSBpc192YWxpZF9zdGF0ZShtZGV2LCBucyk7CisJCXJ2ID0gaXNfdmFsaWRfc3RhdGUoZGV2aWNlLCBucyk7CiAJCWlmIChydiA8IFNTX1NVQ0NFU1MpIHsKIAkJCS8qIElmIHRoZSBvbGQgc3RhdGUgd2FzIGlsbGVnYWwgYXMgd2VsbCwgdGhlbiBsZXQKIAkJCSAgIHRoaXMgaGFwcGVuLi4uKi8KIAotCQkJaWYgKGlzX3ZhbGlkX3N0YXRlKG1kZXYsIG9zKSA9PSBydikKLQkJCQlydiA9IGlzX3ZhbGlkX3NvZnRfdHJhbnNpdGlvbihvcywgbnMsIG1kZXYtPnRjb25uKTsKKwkJCWlmIChpc192YWxpZF9zdGF0ZShkZXZpY2UsIG9zKSA9PSBydikKKwkJCQlydiA9IGlzX3ZhbGlkX3NvZnRfdHJhbnNpdGlvbihvcywgbnMsIGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pOwogCQl9IGVsc2UKLQkJCXJ2ID0gaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKG9zLCBucywgbWRldi0+dGNvbm4pOworCQkJcnYgPSBpc192YWxpZF9zb2Z0X3RyYW5zaXRpb24ob3MsIG5zLCBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uKTsKIAl9CiAKIAlpZiAocnYgPCBTU19TVUNDRVNTKSB7CiAJCWlmIChmbGFncyAmIENTX1ZFUkJPU0UpCi0JCQlwcmludF9zdF9lcnIobWRldiwgb3MsIG5zLCBydik7CisJCQlwcmludF9zdF9lcnIoZGV2aWNlLCBvcywgbnMsIHJ2KTsKIAkJcmV0dXJuIHJ2OwogCX0KIAotCXByaW50X3Nhbml0aXplX3dhcm5pbmdzKG1kZXYsIHNzdyk7CisJcHJpbnRfc2FuaXRpemVfd2FybmluZ3MoZGV2aWNlLCBzc3cpOwogCi0JZHJiZF9wcl9zdGF0ZV9jaGFuZ2UobWRldiwgb3MsIG5zLCBmbGFncyk7CisJZHJiZF9wcl9zdGF0ZV9jaGFuZ2UoZGV2aWNlLCBvcywgbnMsIGZsYWdzKTsKIAogCS8qIERpc3BsYXkgY2hhbmdlcyB0byB0aGUgc3VzcCogZmxhZ3MgdGhhdCB3aGVyZSBjYXVzZWQgYnkgdGhlIGNhbGwgdG8KIAkgICBzYW5pdGl6ZV9zdGF0ZSgpLiBPbmx5IGRpc3BsYXkgaXQgaGVyZSBpZiB3ZSB3aGVyZSBub3QgY2FsbGVkIGZyb20KIAkgICBfY29ubl9yZXF1ZXN0X3N0YXRlKCkgKi8KIAlpZiAoIShmbGFncyAmIENTX0RDX1NVU1ApKQotCQljb25uX3ByX3N0YXRlX2NoYW5nZShtZGV2LT50Y29ubiwgb3MsIG5zLCAoZmxhZ3MgJiB+Q1NfRENfTUFTSykgfCBDU19EQ19TVVNQKTsKKwkJY29ubl9wcl9zdGF0ZV9jaGFuZ2UoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbiwgb3MsIG5zLAorCQkJCSAgICAgKGZsYWdzICYgfkNTX0RDX01BU0spIHwgQ1NfRENfU1VTUCk7CiAKIAkvKiBpZiB3ZSBhcmUgZ29pbmcgLT4gRF9GQUlMRUQgb3IgRF9ESVNLTEVTUywgZ3JhYiBvbmUgZXh0cmEgcmVmZXJlbmNlCiAJICogb24gdGhlIGxkZXYgaGVyZSwgdG8gYmUgc3VyZSB0aGUgdHJhbnNpdGlvbiAtPiBEX0RJU0tMRVNTIHJlc3AuCkBAIC05OTEsNTUgKzEwMDQsNTUgQEAKIAkgKiBhZnRlcl9zdGF0ZV9jaCB3b3JrcyBydW4sIHdoZXJlIHdlIHB1dF9sZGV2IGFnYWluLiAqLwogCWlmICgob3MuZGlzayAhPSBEX0ZBSUxFRCAmJiBucy5kaXNrID09IERfRkFJTEVEKSB8fAogCSAgICAob3MuZGlzayAhPSBEX0RJU0tMRVNTICYmIG5zLmRpc2sgPT0gRF9ESVNLTEVTUykpCi0JCWF0b21pY19pbmMoJm1kZXYtPmxvY2FsX2NudCk7CisJCWF0b21pY19pbmMoJmRldmljZS0+bG9jYWxfY250KTsKIAotCWRpZF9yZW1vdGUgPSBkcmJkX3Nob3VsZF9kb19yZW1vdGUobWRldi0+c3RhdGUpOwotCW1kZXYtPnN0YXRlLmkgPSBucy5pOwotCXNob3VsZF9kb19yZW1vdGUgPSBkcmJkX3Nob3VsZF9kb19yZW1vdGUobWRldi0+c3RhdGUpOwotCW1kZXYtPnRjb25uLT5zdXNwID0gbnMuc3VzcDsKLQltZGV2LT50Y29ubi0+c3VzcF9ub2QgPSBucy5zdXNwX25vZDsKLQltZGV2LT50Y29ubi0+c3VzcF9mZW4gPSBucy5zdXNwX2ZlbjsKKwlkaWRfcmVtb3RlID0gZHJiZF9zaG91bGRfZG9fcmVtb3RlKGRldmljZS0+c3RhdGUpOworCWRldmljZS0+c3RhdGUuaSA9IG5zLmk7CisJc2hvdWxkX2RvX3JlbW90ZSA9IGRyYmRfc2hvdWxkX2RvX3JlbW90ZShkZXZpY2UtPnN0YXRlKTsKKwlkZXZpY2UtPnJlc291cmNlLT5zdXNwID0gbnMuc3VzcDsKKwlkZXZpY2UtPnJlc291cmNlLT5zdXNwX25vZCA9IG5zLnN1c3Bfbm9kOworCWRldmljZS0+cmVzb3VyY2UtPnN1c3BfZmVuID0gbnMuc3VzcF9mZW47CiAKIAkvKiBwdXQgcmVwbGljYXRlZCB2cyBub3QtcmVwbGljYXRlZCByZXF1ZXN0cyBpbiBzZXBlcmF0ZSBlcG9jaHMgKi8KIAlpZiAoZGlkX3JlbW90ZSAhPSBzaG91bGRfZG9fcmVtb3RlKQotCQlzdGFydF9uZXdfdGxfZXBvY2gobWRldi0+dGNvbm4pOworCQlzdGFydF9uZXdfdGxfZXBvY2goZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbik7CiAKIAlpZiAob3MuZGlzayA9PSBEX0FUVEFDSElORyAmJiBucy5kaXNrID49IERfTkVHT1RJQVRJTkcpCi0JCWRyYmRfcHJpbnRfdXVpZHMobWRldiwgImF0dGFjaGVkIHRvIFVVSURzIik7CisJCWRyYmRfcHJpbnRfdXVpZHMoZGV2aWNlLCAiYXR0YWNoZWQgdG8gVVVJRHMiKTsKIAogCS8qIFdha2UgdXAgcm9sZSBjaGFuZ2VzLCB0aGF0IHdlcmUgZGVsYXllZCBiZWNhdXNlIG9mIGNvbm5lY3Rpb24gZXN0YWJsaXNoaW5nICovCiAJaWYgKG9zLmNvbm4gPT0gQ19XRl9SRVBPUlRfUEFSQU1TICYmIG5zLmNvbm4gIT0gQ19XRl9SRVBPUlRfUEFSQU1TICYmCi0JICAgIG5vX3BlZXJfd2ZfcmVwb3J0X3BhcmFtcyhtZGV2LT50Y29ubikpCi0JCWNsZWFyX2JpdChTVEFURV9TRU5ULCAmbWRldi0+dGNvbm4tPmZsYWdzKTsKKwkgICAgbm9fcGVlcl93Zl9yZXBvcnRfcGFyYW1zKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pKQorCQljbGVhcl9iaXQoU1RBVEVfU0VOVCwgJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmZsYWdzKTsKIAotCXdha2VfdXAoJm1kZXYtPm1pc2Nfd2FpdCk7Ci0Jd2FrZV91cCgmbWRldi0+c3RhdGVfd2FpdCk7Ci0Jd2FrZV91cCgmbWRldi0+dGNvbm4tPnBpbmdfd2FpdCk7CisJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOworCXdha2VfdXAoJmRldmljZS0+c3RhdGVfd2FpdCk7CisJd2FrZV91cCgmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+cGluZ193YWl0KTsKIAogCS8qIEFib3J0ZWQgdmVyaWZ5IHJ1biwgb3Igd2UgcmVhY2hlZCB0aGUgc3RvcCBzZWN0b3IuCiAJICogTG9nIHRoZSBsYXN0IHBvc2l0aW9uLCB1bmxlc3MgZW5kLW9mLWRldmljZS4gKi8KIAlpZiAoKG9zLmNvbm4gPT0gQ19WRVJJRllfUyB8fCBvcy5jb25uID09IENfVkVSSUZZX1QpICYmCiAJICAgIG5zLmNvbm4gPD0gQ19DT05ORUNURUQpIHsKLQkJbWRldi0+b3Zfc3RhcnRfc2VjdG9yID0KLQkJCUJNX0JJVF9UT19TRUNUKGRyYmRfYm1fYml0cyhtZGV2KSAtIG1kZXYtPm92X2xlZnQpOwotCQlpZiAobWRldi0+b3ZfbGVmdCkKLQkJCWRldl9pbmZvKERFViwgIk9ubGluZSBWZXJpZnkgcmVhY2hlZCBzZWN0b3IgJWxsdVxuIiwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1kZXYtPm92X3N0YXJ0X3NlY3Rvcik7CisJCWRldmljZS0+b3Zfc3RhcnRfc2VjdG9yID0KKwkJCUJNX0JJVF9UT19TRUNUKGRyYmRfYm1fYml0cyhkZXZpY2UpIC0gZGV2aWNlLT5vdl9sZWZ0KTsKKwkJaWYgKGRldmljZS0+b3ZfbGVmdCkKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJPbmxpbmUgVmVyaWZ5IHJlYWNoZWQgc2VjdG9yICVsbHVcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkZXZpY2UtPm92X3N0YXJ0X3NlY3Rvcik7CiAJfQogCiAJaWYgKChvcy5jb25uID09IENfUEFVU0VEX1NZTkNfVCB8fCBvcy5jb25uID09IENfUEFVU0VEX1NZTkNfUykgJiYKIAkgICAgKG5zLmNvbm4gPT0gQ19TWU5DX1RBUkdFVCAgfHwgbnMuY29ubiA9PSBDX1NZTkNfU09VUkNFKSkgewotCQlkZXZfaW5mbyhERVYsICJTeW5jZXIgY29udGludWVzLlxuIik7Ci0JCW1kZXYtPnJzX3BhdXNlZCArPSAobG9uZylqaWZmaWVzCi0JCQkJICAtKGxvbmcpbWRldi0+cnNfbWFya190aW1lW21kZXYtPnJzX2xhc3RfbWFya107CisJCWRyYmRfaW5mbyhkZXZpY2UsICJTeW5jZXIgY29udGludWVzLlxuIik7CisJCWRldmljZS0+cnNfcGF1c2VkICs9IChsb25nKWppZmZpZXMKKwkJCQkgIC0obG9uZylkZXZpY2UtPnJzX21hcmtfdGltZVtkZXZpY2UtPnJzX2xhc3RfbWFya107CiAJCWlmIChucy5jb25uID09IENfU1lOQ19UQVJHRVQpCi0JCQltb2RfdGltZXIoJm1kZXYtPnJlc3luY190aW1lciwgamlmZmllcyk7CisJCQltb2RfdGltZXIoJmRldmljZS0+cmVzeW5jX3RpbWVyLCBqaWZmaWVzKTsKIAl9CiAKIAlpZiAoKG9zLmNvbm4gPT0gQ19TWU5DX1RBUkdFVCAgfHwgb3MuY29ubiA9PSBDX1NZTkNfU09VUkNFKSAmJgogCSAgICAobnMuY29ubiA9PSBDX1BBVVNFRF9TWU5DX1QgfHwgbnMuY29ubiA9PSBDX1BBVVNFRF9TWU5DX1MpKSB7Ci0JCWRldl9pbmZvKERFViwgIlJlc3luYyBzdXNwZW5kZWRcbiIpOwotCQltZGV2LT5yc19tYXJrX3RpbWVbbWRldi0+cnNfbGFzdF9tYXJrXSA9IGppZmZpZXM7CisJCWRyYmRfaW5mbyhkZXZpY2UsICJSZXN5bmMgc3VzcGVuZGVkXG4iKTsKKwkJZGV2aWNlLT5yc19tYXJrX3RpbWVbZGV2aWNlLT5yc19sYXN0X21hcmtdID0gamlmZmllczsKIAl9CiAKIAlpZiAob3MuY29ubiA9PSBDX0NPTk5FQ1RFRCAmJgpAQCAtMTA0Nyw3NyArMTA2MCw3NyBAQAogCQl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CiAJCWludCBpOwogCi0JCXNldF9vdl9wb3NpdGlvbihtZGV2LCBucy5jb25uKTsKLQkJbWRldi0+cnNfc3RhcnQgPSBub3c7Ci0JCW1kZXYtPnJzX2xhc3RfZXZlbnRzID0gMDsKLQkJbWRldi0+cnNfbGFzdF9zZWN0X2V2ID0gMDsKLQkJbWRldi0+b3ZfbGFzdF9vb3Nfc2l6ZSA9IDA7Ci0JCW1kZXYtPm92X2xhc3Rfb29zX3N0YXJ0ID0gMDsKKwkJc2V0X292X3Bvc2l0aW9uKGRldmljZSwgbnMuY29ubik7CisJCWRldmljZS0+cnNfc3RhcnQgPSBub3c7CisJCWRldmljZS0+cnNfbGFzdF9ldmVudHMgPSAwOworCQlkZXZpY2UtPnJzX2xhc3Rfc2VjdF9ldiA9IDA7CisJCWRldmljZS0+b3ZfbGFzdF9vb3Nfc2l6ZSA9IDA7CisJCWRldmljZS0+b3ZfbGFzdF9vb3Nfc3RhcnQgPSAwOwogCiAJCWZvciAoaSA9IDA7IGkgPCBEUkJEX1NZTkNfTUFSS1M7IGkrKykgewotCQkJbWRldi0+cnNfbWFya19sZWZ0W2ldID0gbWRldi0+b3ZfbGVmdDsKLQkJCW1kZXYtPnJzX21hcmtfdGltZVtpXSA9IG5vdzsKKwkJCWRldmljZS0+cnNfbWFya19sZWZ0W2ldID0gZGV2aWNlLT5vdl9sZWZ0OworCQkJZGV2aWNlLT5yc19tYXJrX3RpbWVbaV0gPSBub3c7CiAJCX0KIAotCQlkcmJkX3JzX2NvbnRyb2xsZXJfcmVzZXQobWRldik7CisJCWRyYmRfcnNfY29udHJvbGxlcl9yZXNldChkZXZpY2UpOwogCiAJCWlmIChucy5jb25uID09IENfVkVSSUZZX1MpIHsKLQkJCWRldl9pbmZvKERFViwgIlN0YXJ0aW5nIE9ubGluZSBWZXJpZnkgZnJvbSBzZWN0b3IgJWxsdVxuIiwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyltZGV2LT5vdl9wb3NpdGlvbik7Ci0JCQltb2RfdGltZXIoJm1kZXYtPnJlc3luY190aW1lciwgamlmZmllcyk7CisJCQlkcmJkX2luZm8oZGV2aWNlLCAiU3RhcnRpbmcgT25saW5lIFZlcmlmeSBmcm9tIHNlY3RvciAlbGx1XG4iLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWRldmljZS0+b3ZfcG9zaXRpb24pOworCQkJbW9kX3RpbWVyKCZkZXZpY2UtPnJlc3luY190aW1lciwgamlmZmllcyk7CiAJCX0KIAl9CiAKLQlpZiAoZ2V0X2xkZXYobWRldikpIHsKLQkJdTMyIG1kZiA9IG1kZXYtPmxkZXYtPm1kLmZsYWdzICYgfihNREZfQ09OU0lTVEVOVHxNREZfUFJJTUFSWV9JTkR8CisJaWYgKGdldF9sZGV2KGRldmljZSkpIHsKKwkJdTMyIG1kZiA9IGRldmljZS0+bGRldi0+bWQuZmxhZ3MgJiB+KE1ERl9DT05TSVNURU5UfE1ERl9QUklNQVJZX0lORHwKIAkJCQkJCSBNREZfQ09OTkVDVEVEX0lORHxNREZfV0FTX1VQX1RPX0RBVEV8CiAJCQkJCQkgTURGX1BFRVJfT1VUX0RBVEVEfE1ERl9DUkFTSEVEX1BSSU1BUlkpOwogCiAJCW1kZiAmPSB+TURGX0FMX0NMRUFOOwotCQlpZiAodGVzdF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmbWRldi0+ZmxhZ3MpKQorCQlpZiAodGVzdF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmZGV2aWNlLT5mbGFncykpCiAJCQltZGYgfD0gTURGX0NSQVNIRURfUFJJTUFSWTsKLQkJaWYgKG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZIHx8Ci0JCSAgICAobWRldi0+c3RhdGUucGRzayA8IERfSU5DT05TSVNURU5UICYmIG1kZXYtPnN0YXRlLnBlZXIgPT0gUl9QUklNQVJZKSkKKwkJaWYgKGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkgfHwKKwkJICAgIChkZXZpY2UtPnN0YXRlLnBkc2sgPCBEX0lOQ09OU0lTVEVOVCAmJiBkZXZpY2UtPnN0YXRlLnBlZXIgPT0gUl9QUklNQVJZKSkKIAkJCW1kZiB8PSBNREZfUFJJTUFSWV9JTkQ7Ci0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID4gQ19XRl9SRVBPUlRfUEFSQU1TKQorCQlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID4gQ19XRl9SRVBPUlRfUEFSQU1TKQogCQkJbWRmIHw9IE1ERl9DT05ORUNURURfSU5EOwotCQlpZiAobWRldi0+c3RhdGUuZGlzayA+IERfSU5DT05TSVNURU5UKQorCQlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrID4gRF9JTkNPTlNJU1RFTlQpCiAJCQltZGYgfD0gTURGX0NPTlNJU1RFTlQ7Ci0JCWlmIChtZGV2LT5zdGF0ZS5kaXNrID4gRF9PVVREQVRFRCkKKwkJaWYgKGRldmljZS0+c3RhdGUuZGlzayA+IERfT1VUREFURUQpCiAJCQltZGYgfD0gTURGX1dBU19VUF9UT19EQVRFOwotCQlpZiAobWRldi0+c3RhdGUucGRzayA8PSBEX09VVERBVEVEICYmIG1kZXYtPnN0YXRlLnBkc2sgPj0gRF9JTkNPTlNJU1RFTlQpCisJCWlmIChkZXZpY2UtPnN0YXRlLnBkc2sgPD0gRF9PVVREQVRFRCAmJiBkZXZpY2UtPnN0YXRlLnBkc2sgPj0gRF9JTkNPTlNJU1RFTlQpCiAJCQltZGYgfD0gTURGX1BFRVJfT1VUX0RBVEVEOwotCQlpZiAobWRmICE9IG1kZXYtPmxkZXYtPm1kLmZsYWdzKSB7Ci0JCQltZGV2LT5sZGV2LT5tZC5mbGFncyA9IG1kZjsKLQkJCWRyYmRfbWRfbWFya19kaXJ0eShtZGV2KTsKKwkJaWYgKG1kZiAhPSBkZXZpY2UtPmxkZXYtPm1kLmZsYWdzKSB7CisJCQlkZXZpY2UtPmxkZXYtPm1kLmZsYWdzID0gbWRmOworCQkJZHJiZF9tZF9tYXJrX2RpcnR5KGRldmljZSk7CiAJCX0KIAkJaWYgKG9zLmRpc2sgPCBEX0NPTlNJU1RFTlQgJiYgbnMuZGlzayA+PSBEX0NPTlNJU1RFTlQpCi0JCQlkcmJkX3NldF9lZF91dWlkKG1kZXYsIG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0pOwotCQlwdXRfbGRldihtZGV2KTsKKwkJCWRyYmRfc2V0X2VkX3V1aWQoZGV2aWNlLCBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0pOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAogCS8qIFBlZXIgd2FzIGZvcmNlZCBEX1VQX1RPX0RBVEUgJiBSX1BSSU1BUlksIGNvbnNpZGVyIHRvIHJlc3luYyAqLwogCWlmIChvcy5kaXNrID09IERfSU5DT05TSVNURU5UICYmIG9zLnBkc2sgPT0gRF9JTkNPTlNJU1RFTlQgJiYKIAkgICAgb3MucGVlciA9PSBSX1NFQ09OREFSWSAmJiBucy5wZWVyID09IFJfUFJJTUFSWSkKLQkJc2V0X2JpdChDT05TSURFUl9SRVNZTkMsICZtZGV2LT5mbGFncyk7CisJCXNldF9iaXQoQ09OU0lERVJfUkVTWU5DLCAmZGV2aWNlLT5mbGFncyk7CiAKIAkvKiBSZWNlaXZlciBzaG91bGQgY2xlYW4gdXAgaXRzZWxmICovCiAJaWYgKG9zLmNvbm4gIT0gQ19ESVNDT05ORUNUSU5HICYmIG5zLmNvbm4gPT0gQ19ESVNDT05ORUNUSU5HKQotCQlkcmJkX3RocmVhZF9zdG9wX25vd2FpdCgmbWRldi0+dGNvbm4tPnJlY2VpdmVyKTsKKwkJZHJiZF90aHJlYWRfc3RvcF9ub3dhaXQoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPnJlY2VpdmVyKTsKIAogCS8qIE5vdyB0aGUgcmVjZWl2ZXIgZmluaXNoZWQgY2xlYW5pbmcgdXAgaXRzZWxmLCBpdCBzaG91bGQgZGllICovCiAJaWYgKG9zLmNvbm4gIT0gQ19TVEFOREFMT05FICYmIG5zLmNvbm4gPT0gQ19TVEFOREFMT05FKQotCQlkcmJkX3RocmVhZF9zdG9wX25vd2FpdCgmbWRldi0+dGNvbm4tPnJlY2VpdmVyKTsKKwkJZHJiZF90aHJlYWRfc3RvcF9ub3dhaXQoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPnJlY2VpdmVyKTsKIAogCS8qIFVwb24gbmV0d29yayBmYWlsdXJlLCB3ZSBuZWVkIHRvIHJlc3RhcnQgdGhlIHJlY2VpdmVyLiAqLwogCWlmIChvcy5jb25uID4gQ19XRl9DT05ORUNUSU9OICYmCiAJICAgIG5zLmNvbm4gPD0gQ19URUFSX0RPV04gJiYgbnMuY29ubiA+PSBDX1RJTUVPVVQpCi0JCWRyYmRfdGhyZWFkX3Jlc3RhcnRfbm93YWl0KCZtZGV2LT50Y29ubi0+cmVjZWl2ZXIpOworCQlkcmJkX3RocmVhZF9yZXN0YXJ0X25vd2FpdCgmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+cmVjZWl2ZXIpOwogCiAJLyogUmVzdW1lIEFMIHdyaXRpbmcgaWYgd2UgZ2V0IGEgY29ubmVjdGlvbiAqLwogCWlmIChvcy5jb25uIDwgQ19DT05ORUNURUQgJiYgbnMuY29ubiA+PSBDX0NPTk5FQ1RFRCkgewotCQlkcmJkX3Jlc3VtZV9hbChtZGV2KTsKLQkJbWRldi0+dGNvbm4tPmNvbm5lY3RfY250Kys7CisJCWRyYmRfcmVzdW1lX2FsKGRldmljZSk7CisJCWZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmNvbm5lY3RfY250Kys7CiAJfQogCiAJLyogcmVtZW1iZXIgbGFzdCBhdHRhY2ggdGltZSBzbyByZXF1ZXN0X3RpbWVyX2ZuKCkgd29uJ3QKQEAgLTExMjUsNyArMTEzOCw3IEBACiAJICogcHJldmlvdXNseSBmcm96ZW4gSU8gKi8KIAlpZiAoKG9zLmRpc2sgPT0gRF9BVFRBQ0hJTkcgfHwgb3MuZGlzayA9PSBEX05FR09USUFUSU5HKSAmJgogCSAgICBucy5kaXNrID4gRF9ORUdPVElBVElORykKLQkJbWRldi0+bGFzdF9yZWF0dGFjaF9qaWYgPSBqaWZmaWVzOworCQlkZXZpY2UtPmxhc3RfcmVhdHRhY2hfamlmID0gamlmZmllczsKIAogCWFzY3cgPSBrbWFsbG9jKHNpemVvZigqYXNjdyksIEdGUF9BVE9NSUMpOwogCWlmIChhc2N3KSB7CkBAIC0xMTMzLDExICsxMTQ2LDEyIEBACiAJCWFzY3ctPm5zID0gbnM7CiAJCWFzY3ctPmZsYWdzID0gZmxhZ3M7CiAJCWFzY3ctPncuY2IgPSB3X2FmdGVyX3N0YXRlX2NoOwotCQlhc2N3LT53Lm1kZXYgPSBtZGV2OworCQlhc2N3LT5kZXZpY2UgPSBkZXZpY2U7CiAJCWFzY3ctPmRvbmUgPSBkb25lOwotCQlkcmJkX3F1ZXVlX3dvcmsoJm1kZXYtPnRjb25uLT5zZW5kZXJfd29yaywgJmFzY3ctPncpOworCQlkcmJkX3F1ZXVlX3dvcmsoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLAorCQkJCSZhc2N3LT53KTsKIAl9IGVsc2UgewotCQlkZXZfZXJyKERFViwgIkNvdWxkIG5vdCBrbWFsbG9jIGFuIGFzY3dcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJDb3VsZCBub3Qga21hbGxvYyBhbiBhc2N3XG4iKTsKIAl9CiAKIAlyZXR1cm4gcnY7CkBAIC0xMTQ3LDY2ICsxMTYxLDY1IEBACiB7CiAJc3RydWN0IGFmdGVyX3N0YXRlX2NoZ193b3JrICphc2N3ID0KIAkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBhZnRlcl9zdGF0ZV9jaGdfd29yaywgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBhc2N3LT5kZXZpY2U7CiAKLQlhZnRlcl9zdGF0ZV9jaChtZGV2LCBhc2N3LT5vcywgYXNjdy0+bnMsIGFzY3ctPmZsYWdzKTsKLQlpZiAoYXNjdy0+ZmxhZ3MgJiBDU19XQUlUX0NPTVBMRVRFKSB7Ci0JCURfQVNTRVJUKGFzY3ctPmRvbmUgIT0gTlVMTCk7CisJYWZ0ZXJfc3RhdGVfY2goZGV2aWNlLCBhc2N3LT5vcywgYXNjdy0+bnMsIGFzY3ctPmZsYWdzKTsKKwlpZiAoYXNjdy0+ZmxhZ3MgJiBDU19XQUlUX0NPTVBMRVRFKQogCQljb21wbGV0ZShhc2N3LT5kb25lKTsKLQl9CiAJa2ZyZWUoYXNjdyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYWJ3X3N0YXJ0X3N5bmMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IHJ2KQorc3RhdGljIHZvaWQgYWJ3X3N0YXJ0X3N5bmMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCBydikKIHsKIAlpZiAocnYpIHsKLQkJZGV2X2VycihERVYsICJXcml0aW5nIHRoZSBiaXRtYXAgZmFpbGVkIG5vdCBzdGFydGluZyByZXN5bmMuXG4iKTsKLQkJX2RyYmRfcmVxdWVzdF9zdGF0ZShtZGV2LCBOUyhjb25uLCBDX0NPTk5FQ1RFRCksIENTX1ZFUkJPU0UpOworCQlkcmJkX2VycihkZXZpY2UsICJXcml0aW5nIHRoZSBiaXRtYXAgZmFpbGVkIG5vdCBzdGFydGluZyByZXN5bmMuXG4iKTsKKwkJX2RyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfQ09OTkVDVEVEKSwgQ1NfVkVSQk9TRSk7CiAJCXJldHVybjsKIAl9CiAKLQlzd2l0Y2ggKG1kZXYtPnN0YXRlLmNvbm4pIHsKKwlzd2l0Y2ggKGRldmljZS0+c3RhdGUuY29ubikgewogCWNhc2UgQ19TVEFSVElOR19TWU5DX1Q6Ci0JCV9kcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgTlMoY29ubiwgQ19XRl9TWU5DX1VVSUQpLCBDU19WRVJCT1NFKTsKKwkJX2RyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfV0ZfU1lOQ19VVUlEKSwgQ1NfVkVSQk9TRSk7CiAJCWJyZWFrOwogCWNhc2UgQ19TVEFSVElOR19TWU5DX1M6Ci0JCWRyYmRfc3RhcnRfcmVzeW5jKG1kZXYsIENfU1lOQ19TT1VSQ0UpOworCQlkcmJkX3N0YXJ0X3Jlc3luYyhkZXZpY2UsIENfU1lOQ19TT1VSQ0UpOwogCQlicmVhazsKIAl9CiB9CiAKLWludCBkcmJkX2JpdG1hcF9pb19mcm9tX3dvcmtlcihzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAotCQlpbnQgKCppb19mbikoc3RydWN0IGRyYmRfY29uZiAqKSwKK2ludCBkcmJkX2JpdG1hcF9pb19mcm9tX3dvcmtlcihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKKwkJaW50ICgqaW9fZm4pKHN0cnVjdCBkcmJkX2RldmljZSAqKSwKIAkJY2hhciAqd2h5LCBlbnVtIGJtX2ZsYWcgZmxhZ3MpCiB7CiAJaW50IHJ2OwogCi0JRF9BU1NFUlQoY3VycmVudCA9PSBtZGV2LT50Y29ubi0+d29ya2VyLnRhc2spOworCURfQVNTRVJUKGRldmljZSwgY3VycmVudCA9PSBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT53b3JrZXIudGFzayk7CiAKLQkvKiBvcGVuIGNvZGVkIG5vbi1ibG9ja2luZyBkcmJkX3N1c3BlbmRfaW8obWRldik7ICovCi0Jc2V0X2JpdChTVVNQRU5EX0lPLCAmbWRldi0+ZmxhZ3MpOworCS8qIG9wZW4gY29kZWQgbm9uLWJsb2NraW5nIGRyYmRfc3VzcGVuZF9pbyhkZXZpY2UpOyAqLworCXNldF9iaXQoU1VTUEVORF9JTywgJmRldmljZS0+ZmxhZ3MpOwogCi0JZHJiZF9ibV9sb2NrKG1kZXYsIHdoeSwgZmxhZ3MpOwotCXJ2ID0gaW9fZm4obWRldik7Ci0JZHJiZF9ibV91bmxvY2sobWRldik7CisJZHJiZF9ibV9sb2NrKGRldmljZSwgd2h5LCBmbGFncyk7CisJcnYgPSBpb19mbihkZXZpY2UpOworCWRyYmRfYm1fdW5sb2NrKGRldmljZSk7CiAKLQlkcmJkX3Jlc3VtZV9pbyhtZGV2KTsKKwlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogCiAJcmV0dXJuIHJ2OwogfQogCiAvKioKICAqIGFmdGVyX3N0YXRlX2NoKCkgLSBQZXJmb3JtIGFmdGVyIHN0YXRlIGNoYW5nZSBhY3Rpb25zIHRoYXQgbWF5IHNsZWVwCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBvczoJCW9sZCBzdGF0ZS4KICAqIEBuczoJCW5ldyBzdGF0ZS4KICAqIEBmbGFnczoJRmxhZ3MKICAqLwotc3RhdGljIHZvaWQgYWZ0ZXJfc3RhdGVfY2goc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5pb24gZHJiZF9zdGF0ZSBvcywKK3N0YXRpYyB2b2lkIGFmdGVyX3N0YXRlX2NoKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bmlvbiBkcmJkX3N0YXRlIG9zLAogCQkJICAgdW5pb24gZHJiZF9zdGF0ZSBucywgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3MpCiB7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlID0gZGV2aWNlLT5yZXNvdXJjZTsKIAlzdHJ1Y3Qgc2liX2luZm8gc2liOwogCiAJc2liLnNpYl9yZWFzb24gPSBTSUJfU1RBVEVfQ0hBTkdFOwpAQCAtMTIxNCw2MyArMTIyNyw2MyBAQAogCXNpYi5ucyA9IG5zOwogCiAJaWYgKG9zLmNvbm4gIT0gQ19DT05ORUNURUQgJiYgbnMuY29ubiA9PSBDX0NPTk5FQ1RFRCkgewotCQljbGVhcl9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmbWRldi0+ZmxhZ3MpOwotCQlpZiAobWRldi0+cF91dWlkKQotCQkJbWRldi0+cF91dWlkW1VJX0ZMQUdTXSAmPSB+KCh1NjQpMik7CisJCWNsZWFyX2JpdChDUkFTSEVEX1BSSU1BUlksICZkZXZpY2UtPmZsYWdzKTsKKwkJaWYgKGRldmljZS0+cF91dWlkKQorCQkJZGV2aWNlLT5wX3V1aWRbVUlfRkxBR1NdICY9IH4oKHU2NCkyKTsKIAl9CiAKIAkvKiBJbmZvcm0gdXNlcnNwYWNlIGFib3V0IHRoZSBjaGFuZ2UuLi4gKi8KLQlkcmJkX2JjYXN0X2V2ZW50KG1kZXYsICZzaWIpOworCWRyYmRfYmNhc3RfZXZlbnQoZGV2aWNlLCAmc2liKTsKIAogCWlmICghKG9zLnJvbGUgPT0gUl9QUklNQVJZICYmIG9zLmRpc2sgPCBEX1VQX1RPX0RBVEUgJiYgb3MucGRzayA8IERfVVBfVE9fREFURSkgJiYKIAkgICAgKG5zLnJvbGUgPT0gUl9QUklNQVJZICYmIG5zLmRpc2sgPCBEX1VQX1RPX0RBVEUgJiYgbnMucGRzayA8IERfVVBfVE9fREFURSkpCi0JCWRyYmRfa2hlbHBlcihtZGV2LCAicHJpLW9uLWluY29uLWRlZ3IiKTsKKwkJZHJiZF9raGVscGVyKGRldmljZSwgInByaS1vbi1pbmNvbi1kZWdyIik7CiAKIAkvKiBIZXJlIHdlIGhhdmUgdGhlIGFjdGlvbnMgdGhhdCBhcmUgcGVyZm9ybWVkIGFmdGVyIGEKIAkgICBzdGF0ZSBjaGFuZ2UuIFRoaXMgZnVuY3Rpb24gbWlnaHQgc2xlZXAgKi8KIAogCWlmIChucy5zdXNwX25vZCkgewotCQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSBtZGV2LT50Y29ubjsKKwkJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb247CiAJCWVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCA9IE5PVEhJTkc7CiAKLQkJc3Bpbl9sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKLQkJaWYgKG9zLmNvbm4gPCBDX0NPTk5FQ1RFRCAmJiBjb25uX2xvd2VzdF9jb25uKHRjb25uKSA+PSBDX0NPTk5FQ1RFRCkKKwkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCQlpZiAob3MuY29ubiA8IENfQ09OTkVDVEVEICYmIGNvbm5fbG93ZXN0X2Nvbm4oY29ubmVjdGlvbikgPj0gQ19DT05ORUNURUQpCiAJCQl3aGF0ID0gUkVTRU5EOwogCiAJCWlmICgob3MuZGlzayA9PSBEX0FUVEFDSElORyB8fCBvcy5kaXNrID09IERfTkVHT1RJQVRJTkcpICYmCi0JCSAgICBjb25uX2xvd2VzdF9kaXNrKHRjb25uKSA+IERfTkVHT1RJQVRJTkcpCisJCSAgICBjb25uX2xvd2VzdF9kaXNrKGNvbm5lY3Rpb24pID4gRF9ORUdPVElBVElORykKIAkJCXdoYXQgPSBSRVNUQVJUX0ZST1pFTl9ESVNLX0lPOwogCi0JCWlmICh0Y29ubi0+c3VzcF9ub2QgJiYgd2hhdCAhPSBOT1RISU5HKSB7Ci0JCQlfdGxfcmVzdGFydCh0Y29ubiwgd2hhdCk7Ci0JCQlfY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLAorCQlpZiAocmVzb3VyY2UtPnN1c3Bfbm9kICYmIHdoYXQgIT0gTk9USElORykgeworCQkJX3RsX3Jlc3RhcnQoY29ubmVjdGlvbiwgd2hhdCk7CisJCQlfY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sCiAJCQkJCSAgICAodW5pb24gZHJiZF9zdGF0ZSkgeyB7IC5zdXNwX25vZCA9IDEgfSB9LAogCQkJCQkgICAgKHVuaW9uIGRyYmRfc3RhdGUpIHsgeyAuc3VzcF9ub2QgPSAwIH0gfSwKIAkJCQkJICAgIENTX1ZFUkJPU0UpOwogCQl9Ci0JCXNwaW5fdW5sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJfQogCiAJaWYgKG5zLnN1c3BfZmVuKSB7Ci0JCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IG1kZXYtPnRjb25uOworCQlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbjsKIAotCQlzcGluX2xvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCQlpZiAodGNvbm4tPnN1c3BfZmVuICYmIGNvbm5fbG93ZXN0X2Nvbm4odGNvbm4pID49IENfQ09OTkVDVEVEKSB7CisJCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwkJaWYgKHJlc291cmNlLT5zdXNwX2ZlbiAmJiBjb25uX2xvd2VzdF9jb25uKGNvbm5lY3Rpb24pID49IENfQ09OTkVDVEVEKSB7CiAJCQkvKiBjYXNlMjogVGhlIGNvbm5lY3Rpb24gd2FzIGVzdGFibGlzaGVkIGFnYWluOiAqLwotCQkJc3RydWN0IGRyYmRfY29uZiAqb2RldjsKKwkJCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAkJCWludCB2bnI7CiAKIAkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG9kZXYsIHZucikKLQkJCQljbGVhcl9iaXQoTkVXX0NVUl9VVUlELCAmb2Rldi0+ZmxhZ3MpOworCQkJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpCisJCQkJY2xlYXJfYml0KE5FV19DVVJfVVVJRCwgJnBlZXJfZGV2aWNlLT5kZXZpY2UtPmZsYWdzKTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJX3RsX3Jlc3RhcnQodGNvbm4sIFJFU0VORCk7Ci0JCQlfY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLAorCQkJX3RsX3Jlc3RhcnQoY29ubmVjdGlvbiwgUkVTRU5EKTsKKwkJCV9jb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwKIAkJCQkJICAgICh1bmlvbiBkcmJkX3N0YXRlKSB7IHsgLnN1c3BfZmVuID0gMSB9IH0sCiAJCQkJCSAgICAodW5pb24gZHJiZF9zdGF0ZSkgeyB7IC5zdXNwX2ZlbiA9IDAgfSB9LAogCQkJCQkgICAgQ1NfVkVSQk9TRSk7CiAJCX0KLQkJc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAl9CiAKIAkvKiBCZWNhbWUgc3luYyBzb3VyY2UuICBXaXRoIHByb3RvY29sID49IDk2LCB3ZSBzdGlsbCBuZWVkIHRvIHNlbmQgb3V0CkBAIC0xMjc5LDkgKzEyOTIsOSBAQAogCSAqIHdoaWNoIGlzIHVuZXhwZWN0ZWQuICovCiAJaWYgKChvcy5jb25uICE9IENfU1lOQ19TT1VSQ0UgJiYgb3MuY29ubiAhPSBDX1BBVVNFRF9TWU5DX1MpICYmCiAJICAgIChucy5jb25uID09IENfU1lOQ19TT1VSQ0UgfHwgbnMuY29ubiA9PSBDX1BBVVNFRF9TWU5DX1MpICYmCi0JICAgIG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gOTYgJiYgZ2V0X2xkZXYobWRldikpIHsKLQkJZHJiZF9nZW5fYW5kX3NlbmRfc3luY191dWlkKG1kZXYpOwotCQlwdXRfbGRldihtZGV2KTsKKwkgICAgZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDk2ICYmIGdldF9sZGV2KGRldmljZSkpIHsKKwkJZHJiZF9nZW5fYW5kX3NlbmRfc3luY191dWlkKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSkpOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAogCS8qIERvIG5vdCBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZSBpZiBhYm92ZSBhbmQgdGhlIHR3byBiZWxvdy4uLiAqLwpAQCAtMTI4OSwyMCArMTMwMiwyMCBAQAogCSAgICBucy5wZHNrID4gRF9ESVNLTEVTUyAmJiBucy5wZHNrICE9IERfVU5LTk9XTikgeyAgICAgIC8qIGF0dGFjaCBvbiB0aGUgcGVlciAqLwogCQkvKiB3ZSBwcm9iYWJseSB3aWxsIHN0YXJ0IGEgcmVzeW5jIHNvb24uCiAJCSAqIG1ha2Ugc3VyZSB0aG9zZSB0aGluZ3MgYXJlIHByb3Blcmx5IHJlc2V0LiAqLwotCQltZGV2LT5yc190b3RhbCA9IDA7Ci0JCW1kZXYtPnJzX2ZhaWxlZCA9IDA7Ci0JCWF0b21pY19zZXQoJm1kZXYtPnJzX3BlbmRpbmdfY250LCAwKTsKLQkJZHJiZF9yc19jYW5jZWxfYWxsKG1kZXYpOworCQlkZXZpY2UtPnJzX3RvdGFsID0gMDsKKwkJZGV2aWNlLT5yc19mYWlsZWQgPSAwOworCQlhdG9taWNfc2V0KCZkZXZpY2UtPnJzX3BlbmRpbmdfY250LCAwKTsKKwkJZHJiZF9yc19jYW5jZWxfYWxsKGRldmljZSk7CiAKLQkJZHJiZF9zZW5kX3V1aWRzKG1kZXYpOwotCQlkcmJkX3NlbmRfc3RhdGUobWRldiwgbnMpOworCQlkcmJkX3NlbmRfdXVpZHMoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSk7CisJCWRyYmRfc2VuZF9zdGF0ZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBucyk7CiAJfQogCS8qIE5vIHBvaW50IGluIHF1ZXVpbmcgc2VuZF9iaXRtYXAgaWYgd2UgZG9uJ3QgaGF2ZSBhIGNvbm5lY3Rpb24KIAkgKiBhbnltb3JlLCBzbyBjaGVjayBhbHNvIHRoZSBfY3VycmVudF8gc3RhdGUsIG5vdCBvbmx5IHRoZSBuZXcgc3RhdGUKIAkgKiBhdCB0aGUgdGltZSB0aGlzIHdvcmsgd2FzIHF1ZXVlZC4gKi8KIAlpZiAob3MuY29ubiAhPSBDX1dGX0JJVE1BUF9TICYmIG5zLmNvbm4gPT0gQ19XRl9CSVRNQVBfUyAmJgotCSAgICBtZGV2LT5zdGF0ZS5jb25uID09IENfV0ZfQklUTUFQX1MpCi0JCWRyYmRfcXVldWVfYml0bWFwX2lvKG1kZXYsICZkcmJkX3NlbmRfYml0bWFwLCBOVUxMLAorCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19XRl9CSVRNQVBfUykKKwkJZHJiZF9xdWV1ZV9iaXRtYXBfaW8oZGV2aWNlLCAmZHJiZF9zZW5kX2JpdG1hcCwgTlVMTCwKIAkJCQkic2VuZF9iaXRtYXAgKFdGQml0TWFwUykiLAogCQkJCUJNX0xPQ0tFRF9URVNUX0FMTE9XRUQpOwogCkBAIC0xMzEzLDgwICsxMzI2LDgwIEBACiAJJiYgIChucy5wZHNrIDwgRF9JTkNPTlNJU1RFTlQgfHwKIAkgICAgIG5zLnBkc2sgPT0gRF9VTktOT1dOIHx8CiAJICAgICBucy5wZHNrID09IERfT1VUREFURUQpKSB7Ci0JCWlmIChnZXRfbGRldihtZGV2KSkgeworCQlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgewogCQkJaWYgKChucy5yb2xlID09IFJfUFJJTUFSWSB8fCBucy5wZWVyID09IFJfUFJJTUFSWSkgJiYKLQkJCSAgICBtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPT0gMCAmJiBucy5kaXNrID49IERfVVBfVE9fREFURSkgewotCQkJCWlmIChkcmJkX3N1c3BlbmRlZChtZGV2KSkgewotCQkJCQlzZXRfYml0KE5FV19DVVJfVVVJRCwgJm1kZXYtPmZsYWdzKTsKKwkJCSAgICBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9PSAwICYmIG5zLmRpc2sgPj0gRF9VUF9UT19EQVRFKSB7CisJCQkJaWYgKGRyYmRfc3VzcGVuZGVkKGRldmljZSkpIHsKKwkJCQkJc2V0X2JpdChORVdfQ1VSX1VVSUQsICZkZXZpY2UtPmZsYWdzKTsKIAkJCQl9IGVsc2UgewotCQkJCQlkcmJkX3V1aWRfbmV3X2N1cnJlbnQobWRldik7Ci0JCQkJCWRyYmRfc2VuZF91dWlkcyhtZGV2KTsKKwkJCQkJZHJiZF91dWlkX25ld19jdXJyZW50KGRldmljZSk7CisJCQkJCWRyYmRfc2VuZF91dWlkcyhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpKTsKIAkJCQl9CiAJCQl9Ci0JCQlwdXRfbGRldihtZGV2KTsKKwkJCXB1dF9sZGV2KGRldmljZSk7CiAJCX0KIAl9CiAKLQlpZiAobnMucGRzayA8IERfSU5DT05TSVNURU5UICYmIGdldF9sZGV2KG1kZXYpKSB7CisJaWYgKG5zLnBkc2sgPCBEX0lOQ09OU0lTVEVOVCAmJiBnZXRfbGRldihkZXZpY2UpKSB7CiAJCWlmIChvcy5wZWVyID09IFJfU0VDT05EQVJZICYmIG5zLnBlZXIgPT0gUl9QUklNQVJZICYmCi0JCSAgICBtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPT0gMCAmJiBucy5kaXNrID49IERfVVBfVE9fREFURSkgewotCQkJZHJiZF91dWlkX25ld19jdXJyZW50KG1kZXYpOwotCQkJZHJiZF9zZW5kX3V1aWRzKG1kZXYpOworCQkgICAgZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPT0gMCAmJiBucy5kaXNrID49IERfVVBfVE9fREFURSkgeworCQkJZHJiZF91dWlkX25ld19jdXJyZW50KGRldmljZSk7CisJCQlkcmJkX3NlbmRfdXVpZHMoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSk7CiAJCX0KIAkJLyogRF9ESVNLTEVTUyBQZWVyIGJlY29tZXMgc2Vjb25kYXJ5ICovCiAJCWlmIChvcy5wZWVyID09IFJfUFJJTUFSWSAmJiBucy5wZWVyID09IFJfU0VDT05EQVJZKQogCQkJLyogV2UgbWF5IHN0aWxsIGJlIFByaW1hcnkgb3Vyc2VsdmVzLgogCQkJICogTm8gaGFybSBkb25lIGlmIHRoZSBiaXRtYXAgc3RpbGwgY2hhbmdlcywKIAkJCSAqIHJlZGlydGllZCBwYWdlcyB3aWxsIGZvbGxvdyBsYXRlci4gKi8KLQkJCWRyYmRfYml0bWFwX2lvX2Zyb21fd29ya2VyKG1kZXYsICZkcmJkX2JtX3dyaXRlLAorCQkJZHJiZF9iaXRtYXBfaW9fZnJvbV93b3JrZXIoZGV2aWNlLCAmZHJiZF9ibV93cml0ZSwKIAkJCQkiZGVtb3RlIGRpc2tsZXNzIHBlZXIiLCBCTV9MT0NLRURfU0VUX0FMTE9XRUQpOwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKIAkvKiBXcml0ZSBvdXQgYWxsIGNoYW5nZWQgYml0cyBvbiBkZW1vdGUuCiAJICogVGhvdWdoLCBubyBuZWVkIHRvIGRhIHRoYXQganVzdCB5ZXQKIAkgKiBpZiB0aGVyZSBpcyBhIHJlc3luYyBnb2luZyBvbiBzdGlsbCAqLwogCWlmIChvcy5yb2xlID09IFJfUFJJTUFSWSAmJiBucy5yb2xlID09IFJfU0VDT05EQVJZICYmCi0JCW1kZXYtPnN0YXRlLmNvbm4gPD0gQ19DT05ORUNURUQgJiYgZ2V0X2xkZXYobWRldikpIHsKKwkJZGV2aWNlLT5zdGF0ZS5jb25uIDw9IENfQ09OTkVDVEVEICYmIGdldF9sZGV2KGRldmljZSkpIHsKIAkJLyogTm8gY2hhbmdlcyB0byB0aGUgYml0bWFwIGV4cGVjdGVkIHRoaXMgdGltZSwgc28gYXNzZXJ0IHRoYXQsCiAJCSAqIGV2ZW4gdGhvdWdoIG5vIGhhcm0gd2FzIGRvbmUgaWYgaXQgZGlkIGNoYW5nZS4gKi8KLQkJZHJiZF9iaXRtYXBfaW9fZnJvbV93b3JrZXIobWRldiwgJmRyYmRfYm1fd3JpdGUsCisJCWRyYmRfYml0bWFwX2lvX2Zyb21fd29ya2VyKGRldmljZSwgJmRyYmRfYm1fd3JpdGUsCiAJCQkJImRlbW90ZSIsIEJNX0xPQ0tFRF9URVNUX0FMTE9XRUQpOwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKIAkvKiBMYXN0IHBhcnQgb2YgdGhlIGF0dGFjaGluZyBwcm9jZXNzIC4uLiAqLwogCWlmIChucy5jb25uID49IENfQ09OTkVDVEVEICYmCiAJICAgIG9zLmRpc2sgPT0gRF9BVFRBQ0hJTkcgJiYgbnMuZGlzayA9PSBEX05FR09USUFUSU5HKSB7Ci0JCWRyYmRfc2VuZF9zaXplcyhtZGV2LCAwLCAwKTsgIC8qIHRvIHN0YXJ0IHN5bmMuLi4gKi8KLQkJZHJiZF9zZW5kX3V1aWRzKG1kZXYpOwotCQlkcmJkX3NlbmRfc3RhdGUobWRldiwgbnMpOworCQlkcmJkX3NlbmRfc2l6ZXMoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgMCwgMCk7ICAvKiB0byBzdGFydCBzeW5jLi4uICovCisJCWRyYmRfc2VuZF91dWlkcyhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpKTsKKwkJZHJiZF9zZW5kX3N0YXRlKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIG5zKTsKIAl9CiAKIAkvKiBXZSB3YW50IHRvIHBhdXNlL2NvbnRpbnVlIHJlc3luYywgdGVsbCBwZWVyLiAqLwogCWlmIChucy5jb25uID49IENfQ09OTkVDVEVEICYmCiAJICAgICAoKG9zLmFmdHJfaXNwICE9IG5zLmFmdHJfaXNwKSB8fAogCSAgICAgIChvcy51c2VyX2lzcCAhPSBucy51c2VyX2lzcCkpKQotCQlkcmJkX3NlbmRfc3RhdGUobWRldiwgbnMpOworCQlkcmJkX3NlbmRfc3RhdGUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgbnMpOwogCiAJLyogSW4gY2FzZSBvbmUgb2YgdGhlIGlzcCBiaXRzIGdvdCBzZXQsIHN1c3BlbmQgb3RoZXIgZGV2aWNlcy4gKi8KIAlpZiAoKCFvcy5hZnRyX2lzcCAmJiAhb3MucGVlcl9pc3AgJiYgIW9zLnVzZXJfaXNwKSAmJgogCSAgICAobnMuYWZ0cl9pc3AgfHwgbnMucGVlcl9pc3AgfHwgbnMudXNlcl9pc3ApKQotCQlzdXNwZW5kX290aGVyX3NnKG1kZXYpOworCQlzdXNwZW5kX290aGVyX3NnKGRldmljZSk7CiAKIAkvKiBNYWtlIHN1cmUgdGhlIHBlZXIgZ2V0cyBpbmZvcm1lZCBhYm91dCBldmVudHVhbCBzdGF0ZQogCSAgIGNoYW5nZXMgKElTUCBiaXRzKSB3aGlsZSB3ZSB3ZXJlIGluIFdGUmVwb3J0UGFyYW1zLiAqLwogCWlmIChvcy5jb25uID09IENfV0ZfUkVQT1JUX1BBUkFNUyAmJiBucy5jb25uID49IENfQ09OTkVDVEVEKQotCQlkcmJkX3NlbmRfc3RhdGUobWRldiwgbnMpOworCQlkcmJkX3NlbmRfc3RhdGUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgbnMpOwogCiAJaWYgKG9zLmNvbm4gIT0gQ19BSEVBRCAmJiBucy5jb25uID09IENfQUhFQUQpCi0JCWRyYmRfc2VuZF9zdGF0ZShtZGV2LCBucyk7CisJCWRyYmRfc2VuZF9zdGF0ZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBucyk7CiAKIAkvKiBXZSBhcmUgaW4gdGhlIHByb2dyZXNzIHRvIHN0YXJ0IGEgZnVsbCBzeW5jLi4uICovCiAJaWYgKChvcy5jb25uICE9IENfU1RBUlRJTkdfU1lOQ19UICYmIG5zLmNvbm4gPT0gQ19TVEFSVElOR19TWU5DX1QpIHx8CiAJICAgIChvcy5jb25uICE9IENfU1RBUlRJTkdfU1lOQ19TICYmIG5zLmNvbm4gPT0gQ19TVEFSVElOR19TWU5DX1MpKQogCQkvKiBubyBvdGhlciBiaXRtYXAgY2hhbmdlcyBleHBlY3RlZCBkdXJpbmcgdGhpcyBwaGFzZSAqLwotCQlkcmJkX3F1ZXVlX2JpdG1hcF9pbyhtZGV2LAorCQlkcmJkX3F1ZXVlX2JpdG1hcF9pbyhkZXZpY2UsCiAJCQkmZHJiZF9ibWlvX3NldF9uX3dyaXRlLCAmYWJ3X3N0YXJ0X3N5bmMsCiAJCQkic2V0X25fd3JpdGUgZnJvbSBTdGFydGluZ1N5bmMiLCBCTV9MT0NLRURfVEVTVF9BTExPV0VEKTsKIApAQCAtMTM5OSwxNSArMTQxMiwxNSBAQAogCQkgKiBvdXIgY2xlYW51cCBoZXJlIHdpdGggdGhlIHRyYW5zaXRpb24gdG8gRF9ESVNLTEVTUy4KIAkJICogQnV0IGlzIGlzIHN0aWxsIG5vdCBzYXZlIHRvIGRyZWZlcmVuY2UgbGRldiBoZXJlLCBzaW5jZQogCQkgKiB3ZSBtaWdodCBjb21lIGZyb20gYW4gZmFpbGVkIEF0dGFjaCBiZWZvcmUgbGRldiB3YXMgc2V0LiAqLwotCQlpZiAobWRldi0+bGRldikgeworCQlpZiAoZGV2aWNlLT5sZGV2KSB7CiAJCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCQllaCA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5vbl9pb19lcnJvcjsKKwkJCWVoID0gcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+bGRldi0+ZGlza19jb25mKS0+b25faW9fZXJyb3I7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAotCQkJd2FzX2lvX2Vycm9yID0gdGVzdF9hbmRfY2xlYXJfYml0KFdBU19JT19FUlJPUiwgJm1kZXYtPmZsYWdzKTsKKwkJCXdhc19pb19lcnJvciA9IHRlc3RfYW5kX2NsZWFyX2JpdChXQVNfSU9fRVJST1IsICZkZXZpY2UtPmZsYWdzKTsKIAogCQkJaWYgKHdhc19pb19lcnJvciAmJiBlaCA9PSBFUF9DQUxMX0hFTFBFUikKLQkJCQlkcmJkX2toZWxwZXIobWRldiwgImxvY2FsLWlvLWVycm9yIik7CisJCQkJZHJiZF9raGVscGVyKGRldmljZSwgImxvY2FsLWlvLWVycm9yIik7CiAKIAkJCS8qIEltbWVkaWF0ZWx5IGFsbG93IGNvbXBsZXRpb24gb2YgYWxsIGFwcGxpY2F0aW9uIElPLAogCQkJICogdGhhdCB3YWl0cyBmb3IgY29tcGxldGlvbiBmcm9tIHRoZSBsb2NhbCBkaXNrLApAQCAtMTQyMiw3NiArMTQzNSw3NiBAQAogCQkJICogU28gYWJvcnRpbmcgbG9jYWwgcmVxdWVzdHMgbWF5IGNhdXNlIGNyYXNoZXMsCiAJCQkgKiBvciBldmVuIHdvcnNlLCBzaWxlbnQgZGF0YSBjb3JydXB0aW9uLgogCQkJICovCi0JCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEZPUkNFX0RFVEFDSCwgJm1kZXYtPmZsYWdzKSkKLQkJCQl0bF9hYm9ydF9kaXNrX2lvKG1kZXYpOworCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChGT1JDRV9ERVRBQ0gsICZkZXZpY2UtPmZsYWdzKSkKKwkJCQl0bF9hYm9ydF9kaXNrX2lvKGRldmljZSk7CiAKIAkJCS8qIGN1cnJlbnQgc3RhdGUgc3RpbGwgaGFzIHRvIGJlIERfRkFJTEVELAogCQkJICogdGhlcmUgaXMgb25seSBvbmUgd2F5IG91dDogdG8gRF9ESVNLTEVTUywKIAkJCSAqIGFuZCB0aGF0IG1heSBvbmx5IGhhcHBlbiBhZnRlciBvdXIgcHV0X2xkZXYgYmVsb3cuICovCi0JCQlpZiAobWRldi0+c3RhdGUuZGlzayAhPSBEX0ZBSUxFRCkKLQkJCQlkZXZfZXJyKERFViwKKwkJCWlmIChkZXZpY2UtPnN0YXRlLmRpc2sgIT0gRF9GQUlMRUQpCisJCQkJZHJiZF9lcnIoZGV2aWNlLAogCQkJCQkiQVNTRVJUIEZBSUxFRDogZGlzayBpcyAlcyBkdXJpbmcgZGV0YWNoXG4iLAotCQkJCQlkcmJkX2Rpc2tfc3RyKG1kZXYtPnN0YXRlLmRpc2spKTsKKwkJCQkJZHJiZF9kaXNrX3N0cihkZXZpY2UtPnN0YXRlLmRpc2spKTsKIAogCQkJaWYgKG5zLmNvbm4gPj0gQ19DT05ORUNURUQpCi0JCQkJZHJiZF9zZW5kX3N0YXRlKG1kZXYsIG5zKTsKKwkJCQlkcmJkX3NlbmRfc3RhdGUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgbnMpOwogCi0JCQlkcmJkX3JzX2NhbmNlbF9hbGwobWRldik7CisJCQlkcmJkX3JzX2NhbmNlbF9hbGwoZGV2aWNlKTsKIAogCQkJLyogSW4gY2FzZSB3ZSB3YW50IHRvIGdldCBzb21ldGhpbmcgdG8gc3RhYmxlIHN0b3JhZ2Ugc3RpbGwsCiAJCQkgKiB0aGlzIG1heSBiZSB0aGUgbGFzdCBjaGFuY2UuCiAJCQkgKiBGb2xsb3dpbmcgcHV0X2xkZXYgbWF5IHRyYW5zaXRpb24gdG8gRF9ESVNLTEVTUy4gKi8KLQkJCWRyYmRfbWRfc3luYyhtZGV2KTsKKwkJCWRyYmRfbWRfc3luYyhkZXZpY2UpOwogCQl9Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAotICAgICAgICAvKiBzZWNvbmQgaGFsZiBvZiBsb2NhbCBJTyBlcnJvciwgZmFpbHVyZSB0byBhdHRhY2gsCi0gICAgICAgICAqIG9yIGFkbWluaXN0cmF0aXZlIGRldGFjaCwKLSAgICAgICAgICogYWZ0ZXIgbG9jYWxfY250IHJlZmVyZW5jZXMgaGF2ZSByZWFjaGVkIHplcm8gYWdhaW4gKi8KLSAgICAgICAgaWYgKG9zLmRpc2sgIT0gRF9ESVNLTEVTUyAmJiBucy5kaXNrID09IERfRElTS0xFU1MpIHsKLSAgICAgICAgICAgICAgICAvKiBXZSBtdXN0IHN0aWxsIGJlIGRpc2tsZXNzLAotICAgICAgICAgICAgICAgICAqIHJlLWF0dGFjaCBoYXMgdG8gYmUgc2VyaWFsaXplZCB3aXRoIHRoaXMhICovCi0gICAgICAgICAgICAgICAgaWYgKG1kZXYtPnN0YXRlLmRpc2sgIT0gRF9ESVNLTEVTUykKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoREVWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVNTRVJUIEZBSUxFRDogZGlzayBpcyAlcyB3aGlsZSBnb2luZyBkaXNrbGVzc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJiZF9kaXNrX3N0cihtZGV2LT5zdGF0ZS5kaXNrKSk7CisJLyogc2Vjb25kIGhhbGYgb2YgbG9jYWwgSU8gZXJyb3IsIGZhaWx1cmUgdG8gYXR0YWNoLAorCSAqIG9yIGFkbWluaXN0cmF0aXZlIGRldGFjaCwKKwkgKiBhZnRlciBsb2NhbF9jbnQgcmVmZXJlbmNlcyBoYXZlIHJlYWNoZWQgemVybyBhZ2FpbiAqLworCWlmIChvcy5kaXNrICE9IERfRElTS0xFU1MgJiYgbnMuZGlzayA9PSBEX0RJU0tMRVNTKSB7CisJCS8qIFdlIG11c3Qgc3RpbGwgYmUgZGlza2xlc3MsCisJCSAqIHJlLWF0dGFjaCBoYXMgdG8gYmUgc2VyaWFsaXplZCB3aXRoIHRoaXMhICovCisJCWlmIChkZXZpY2UtPnN0YXRlLmRpc2sgIT0gRF9ESVNLTEVTUykKKwkJCWRyYmRfZXJyKGRldmljZSwKKwkJCQkgIkFTU0VSVCBGQUlMRUQ6IGRpc2sgaXMgJXMgd2hpbGUgZ29pbmcgZGlza2xlc3NcbiIsCisJCQkJIGRyYmRfZGlza19zdHIoZGV2aWNlLT5zdGF0ZS5kaXNrKSk7CiAKIAkJaWYgKG5zLmNvbm4gPj0gQ19DT05ORUNURUQpCi0JCQlkcmJkX3NlbmRfc3RhdGUobWRldiwgbnMpOworCQkJZHJiZF9zZW5kX3N0YXRlKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIG5zKTsKIAkJLyogY29ycmVzcG9uZGluZyBnZXRfbGRldiBpbiBfX2RyYmRfc2V0X3N0YXRlCiAJCSAqIHRoaXMgbWF5IGZpbmFsbHkgdHJpZ2dlciBkcmJkX2xkZXZfZGVzdHJveS4gKi8KLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJLyogTm90aWZ5IHBlZXIgdGhhdCBJIGhhZCBhIGxvY2FsIElPIGVycm9yLCBhbmQgZGlkIG5vdCBkZXRhY2hlZC4uICovCiAJaWYgKG9zLmRpc2sgPT0gRF9VUF9UT19EQVRFICYmIG5zLmRpc2sgPT0gRF9JTkNPTlNJU1RFTlQgJiYgbnMuY29ubiA+PSBDX0NPTk5FQ1RFRCkKLQkJZHJiZF9zZW5kX3N0YXRlKG1kZXYsIG5zKTsKKwkJZHJiZF9zZW5kX3N0YXRlKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIG5zKTsKIAogCS8qIERpc2tzIGdvdCBiaWdnZXIgd2hpbGUgdGhleSB3ZXJlIGRldGFjaGVkICovCiAJaWYgKG5zLmRpc2sgPiBEX05FR09USUFUSU5HICYmIG5zLnBkc2sgPiBEX05FR09USUFUSU5HICYmCi0JICAgIHRlc3RfYW5kX2NsZWFyX2JpdChSRVNZTkNfQUZURVJfTkVHLCAmbWRldi0+ZmxhZ3MpKSB7CisJICAgIHRlc3RfYW5kX2NsZWFyX2JpdChSRVNZTkNfQUZURVJfTkVHLCAmZGV2aWNlLT5mbGFncykpIHsKIAkJaWYgKG5zLmNvbm4gPT0gQ19DT05ORUNURUQpCi0JCQlyZXN5bmNfYWZ0ZXJfb25saW5lX2dyb3cobWRldik7CisJCQlyZXN5bmNfYWZ0ZXJfb25saW5lX2dyb3coZGV2aWNlKTsKIAl9CiAKIAkvKiBBIHJlc3luYyBmaW5pc2hlZCBvciBhYm9ydGVkLCB3YWtlIHBhdXNlZCBkZXZpY2VzLi4uICovCiAJaWYgKChvcy5jb25uID4gQ19DT05ORUNURUQgJiYgbnMuY29ubiA8PSBDX0NPTk5FQ1RFRCkgfHwKIAkgICAgKG9zLnBlZXJfaXNwICYmICFucy5wZWVyX2lzcCkgfHwKIAkgICAgKG9zLnVzZXJfaXNwICYmICFucy51c2VyX2lzcCkpCi0JCXJlc3VtZV9uZXh0X3NnKG1kZXYpOworCQlyZXN1bWVfbmV4dF9zZyhkZXZpY2UpOwogCiAJLyogc3luYyB0YXJnZXQgZG9uZSB3aXRoIHJlc3luYy4gIEV4cGxpY2l0bHkgbm90aWZ5IHBlZXIsIGV2ZW4gdGhvdWdoCiAJICogaXQgc2hvdWxkIChhdCBsZWFzdCBmb3Igbm9uLWVtcHR5IHJlc3luY3MpIGFscmVhZHkga25vdyBpdHNlbGYuICovCiAJaWYgKG9zLmRpc2sgPCBEX1VQX1RPX0RBVEUgJiYgb3MuY29ubiA+PSBDX1NZTkNfU09VUkNFICYmIG5zLmNvbm4gPT0gQ19DT05ORUNURUQpCi0JCWRyYmRfc2VuZF9zdGF0ZShtZGV2LCBucyk7CisJCWRyYmRfc2VuZF9zdGF0ZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBucyk7CiAKIAkvKiBWZXJpZnkgZmluaXNoZWQsIG9yIHJlYWNoZWQgc3RvcCBzZWN0b3IuICBQZWVyIGRpZCBub3Qga25vdyBhYm91dAogCSAqIHRoZSBzdG9wIHNlY3RvciwgYW5kIHdlIG1heSBldmVuIGhhdmUgY2hhbmdlZCB0aGUgc3RvcCBzZWN0b3IgZHVyaW5nCiAJICogdmVyaWZ5IHRvIGludGVycnVwdC9zdG9wIGVhcmx5LiAgU2VuZCB0aGUgbmV3IHN0YXRlLiAqLwogCWlmIChvcy5jb25uID09IENfVkVSSUZZX1MgJiYgbnMuY29ubiA9PSBDX0NPTk5FQ1RFRAotCSYmIHZlcmlmeV9jYW5fZG9fc3RvcF9zZWN0b3IobWRldikpCi0JCWRyYmRfc2VuZF9zdGF0ZShtZGV2LCBucyk7CisJJiYgdmVyaWZ5X2Nhbl9kb19zdG9wX3NlY3RvcihkZXZpY2UpKQorCQlkcmJkX3NlbmRfc3RhdGUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgbnMpOwogCiAJLyogVGhpcyB0cmlnZ2VycyBiaXRtYXAgd3JpdGVvdXQgb2YgcG90ZW50aWFsbHkgc3RpbGwgdW53cml0dGVuIHBhZ2VzCiAJICogaWYgdGhlIHJlc3luYyBmaW5pc2hlZCBjbGVhbmx5LCBvciBhYm9ydGVkIGJlY2F1c2Ugb2YgcGVlciBkaXNrCkBAIC0xNTAwLDU2ICsxNTEzLDU3IEBACiAJICogYW55IGJpdG1hcCB3cml0ZW91dCBhbnltb3JlLgogCSAqIE5vIGhhcm0gZG9uZSBpZiBzb21lIGJpdHMgY2hhbmdlIGR1cmluZyB0aGlzIHBoYXNlLgogCSAqLwotCWlmIChvcy5jb25uID4gQ19DT05ORUNURUQgJiYgbnMuY29ubiA8PSBDX0NPTk5FQ1RFRCAmJiBnZXRfbGRldihtZGV2KSkgewotCQlkcmJkX3F1ZXVlX2JpdG1hcF9pbyhtZGV2LCAmZHJiZF9ibV93cml0ZV9jb3B5X3BhZ2VzLCBOVUxMLAorCWlmIChvcy5jb25uID4gQ19DT05ORUNURUQgJiYgbnMuY29ubiA8PSBDX0NPTk5FQ1RFRCAmJiBnZXRfbGRldihkZXZpY2UpKSB7CisJCWRyYmRfcXVldWVfYml0bWFwX2lvKGRldmljZSwgJmRyYmRfYm1fd3JpdGVfY29weV9wYWdlcywgTlVMTCwKIAkJCSJ3cml0ZSBmcm9tIHJlc3luY19maW5pc2hlZCIsIEJNX0xPQ0tFRF9DSEFOR0VfQUxMT1dFRCk7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAogCWlmIChucy5kaXNrID09IERfRElTS0xFU1MgJiYKIAkgICAgbnMuY29ubiA9PSBDX1NUQU5EQUxPTkUgJiYKIAkgICAgbnMucm9sZSA9PSBSX1NFQ09OREFSWSkgewogCQlpZiAob3MuYWZ0cl9pc3AgIT0gbnMuYWZ0cl9pc3ApCi0JCQlyZXN1bWVfbmV4dF9zZyhtZGV2KTsKKwkJCXJlc3VtZV9uZXh0X3NnKGRldmljZSk7CiAJfQogCi0JZHJiZF9tZF9zeW5jKG1kZXYpOworCWRyYmRfbWRfc3luYyhkZXZpY2UpOwogfQogCiBzdHJ1Y3QgYWZ0ZXJfY29ubl9zdGF0ZV9jaGdfd29yayB7CiAJc3RydWN0IGRyYmRfd29yayB3OwogCWVudW0gZHJiZF9jb25ucyBvYzsKIAl1bmlvbiBkcmJkX3N0YXRlIG5zX21pbjsKLQl1bmlvbiBkcmJkX3N0YXRlIG5zX21heDsgLyogbmV3LCBtYXggc3RhdGUsIG92ZXIgYWxsIG1kZXZzICovCisJdW5pb24gZHJiZF9zdGF0ZSBuc19tYXg7IC8qIG5ldywgbWF4IHN0YXRlLCBvdmVyIGFsbCBkZXZpY2VzICovCiAJZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3M7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKIH07CiAKIHN0YXRpYyBpbnQgd19hZnRlcl9jb25uX3N0YXRlX2NoKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCB1bnVzZWQpCiB7CiAJc3RydWN0IGFmdGVyX2Nvbm5fc3RhdGVfY2hnX3dvcmsgKmFjc2N3ID0KIAkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBhZnRlcl9jb25uX3N0YXRlX2NoZ193b3JrLCB3KTsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSB3LT50Y29ubjsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gYWNzY3ctPmNvbm5lY3Rpb247CiAJZW51bSBkcmJkX2Nvbm5zIG9jID0gYWNzY3ctPm9jOwogCXVuaW9uIGRyYmRfc3RhdGUgbnNfbWF4ID0gYWNzY3ctPm5zX21heDsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yOwogCiAJa2ZyZWUoYWNzY3cpOwogCiAJLyogVXBvbiBuZXR3b3JrIGNvbmZpZ3VyYXRpb24sIHdlIG5lZWQgdG8gc3RhcnQgdGhlIHJlY2VpdmVyICovCiAJaWYgKG9jID09IENfU1RBTkRBTE9ORSAmJiBuc19tYXguY29ubiA9PSBDX1VOQ09OTkVDVEVEKQotCQlkcmJkX3RocmVhZF9zdGFydCgmdGNvbm4tPnJlY2VpdmVyKTsKKwkJZHJiZF90aHJlYWRfc3RhcnQoJmNvbm5lY3Rpb24tPnJlY2VpdmVyKTsKIAogCWlmIChvYyA9PSBDX0RJU0NPTk5FQ1RJTkcgJiYgbnNfbWF4LmNvbm4gPT0gQ19TVEFOREFMT05FKSB7CiAJCXN0cnVjdCBuZXRfY29uZiAqb2xkX2NvbmY7CiAKLQkJbXV0ZXhfbG9jaygmdGNvbm4tPmNvbmZfdXBkYXRlKTsKLQkJb2xkX2NvbmYgPSB0Y29ubi0+bmV0X2NvbmY7Ci0JCXRjb25uLT5teV9hZGRyX2xlbiA9IDA7Ci0JCXRjb25uLT5wZWVyX2FkZHJfbGVuID0gMDsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKHRjb25uLT5uZXRfY29uZiwgTlVMTCk7Ci0JCWNvbm5fZnJlZV9jcnlwdG8odGNvbm4pOwotCQltdXRleF91bmxvY2soJnRjb25uLT5jb25mX3VwZGF0ZSk7CisJCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CisJCW9sZF9jb25mID0gY29ubmVjdGlvbi0+bmV0X2NvbmY7CisJCWNvbm5lY3Rpb24tPm15X2FkZHJfbGVuID0gMDsKKwkJY29ubmVjdGlvbi0+cGVlcl9hZGRyX2xlbiA9IDA7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihjb25uZWN0aW9uLT5uZXRfY29uZiwgTlVMTCk7CisJCWNvbm5fZnJlZV9jcnlwdG8oY29ubmVjdGlvbik7CisJCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+cmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKIAogCQlzeW5jaHJvbml6ZV9yY3UoKTsKIAkJa2ZyZWUob2xkX2NvbmYpOwpAQCAtMTU1OSw0NSArMTU3Myw0NyBAQAogCQkvKiBjYXNlMTogVGhlIG91dGRhdGUgcGVlciBoYW5kbGVyIGlzIHN1Y2Nlc3NmdWw6ICovCiAJCWlmIChuc19tYXgucGRzayA8PSBEX09VVERBVEVEKSB7CiAJCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJCQlpZiAodGVzdF9iaXQoTkVXX0NVUl9VVUlELCAmbWRldi0+ZmxhZ3MpKSB7Ci0JCQkJCWRyYmRfdXVpZF9uZXdfY3VycmVudChtZGV2KTsKLQkJCQkJY2xlYXJfYml0KE5FV19DVVJfVVVJRCwgJm1kZXYtPmZsYWdzKTsKKwkJCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKSB7CisJCQkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQkJCWlmICh0ZXN0X2JpdChORVdfQ1VSX1VVSUQsICZkZXZpY2UtPmZsYWdzKSkgeworCQkJCQlkcmJkX3V1aWRfbmV3X2N1cnJlbnQoZGV2aWNlKTsKKwkJCQkJY2xlYXJfYml0KE5FV19DVVJfVVVJRCwgJmRldmljZS0+ZmxhZ3MpOwogCQkJCX0KIAkJCX0KIAkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJc3Bpbl9sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKLQkJCV90bF9yZXN0YXJ0KHRjb25uLCBDT05ORUNUSU9OX0xPU1RfV0hJTEVfUEVORElORyk7Ci0JCQlfY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLAorCQkJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwkJCV90bF9yZXN0YXJ0KGNvbm5lY3Rpb24sIENPTk5FQ1RJT05fTE9TVF9XSElMRV9QRU5ESU5HKTsKKwkJCV9jb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwKIAkJCQkJICAgICh1bmlvbiBkcmJkX3N0YXRlKSB7IHsgLnN1c3BfZmVuID0gMSB9IH0sCiAJCQkJCSAgICAodW5pb24gZHJiZF9zdGF0ZSkgeyB7IC5zdXNwX2ZlbiA9IDAgfSB9LAogCQkJCQkgICAgQ1NfVkVSQk9TRSk7Ci0JCQlzcGluX3VubG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7CisJCQlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiAJCX0KIAl9Ci0Ja3JlZl9wdXQoJnRjb25uLT5rcmVmLCAmY29ubl9kZXN0cm95KTsKKwlrcmVmX3B1dCgmY29ubmVjdGlvbi0+a3JlZiwgZHJiZF9kZXN0cm95X2Nvbm5lY3Rpb24pOwogCi0JY29ubl9tZF9zeW5jKHRjb25uKTsKKwljb25uX21kX3N5bmMoY29ubmVjdGlvbik7CiAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBjb25uX29sZF9jb21tb25fc3RhdGUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bmlvbiBkcmJkX3N0YXRlICpwY3MsIGVudW0gY2hnX3N0YXRlX2ZsYWdzICpwZikKK3ZvaWQgY29ubl9vbGRfY29tbW9uX3N0YXRlKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHVuaW9uIGRyYmRfc3RhdGUgKnBjcywgZW51bSBjaGdfc3RhdGVfZmxhZ3MgKnBmKQogewogCWVudW0gY2hnX3N0YXRlX2ZsYWdzIGZsYWdzID0gfjA7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZuciwgZmlyc3Rfdm9sID0gMTsKIAl1bmlvbiBkcmJkX2Rldl9zdGF0ZSBvcywgY3MgPSB7CiAJCXsgLnJvbGUgPSBSX1NFQ09OREFSWSwKIAkJICAucGVlciA9IFJfVU5LTk9XTiwKLQkJICAuY29ubiA9IHRjb25uLT5jc3RhdGUsCisJCSAgLmNvbm4gPSBjb25uZWN0aW9uLT5jc3RhdGUsCiAJCSAgLmRpc2sgPSBEX0RJU0tMRVNTLAogCQkgIC5wZHNrID0gRF9VTktOT1dOLAogCQl9IH07CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKSB7Ci0JCW9zID0gbWRldi0+c3RhdGU7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQlvcyA9IGRldmljZS0+c3RhdGU7CiAKIAkJaWYgKGZpcnN0X3ZvbCkgewogCQkJY3MgPSBvczsKQEAgLTE2MjgsMTggKzE2NDQsMTkgQEAKIH0KIAogc3RhdGljIGVudW0gZHJiZF9zdGF0ZV9ydgotY29ubl9pc192YWxpZF90cmFuc2l0aW9uKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLCB1bmlvbiBkcmJkX3N0YXRlIHZhbCwKK2Nvbm5faXNfdmFsaWRfdHJhbnNpdGlvbihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsLAogCQkJIGVudW0gY2hnX3N0YXRlX2ZsYWdzIGZsYWdzKQogewogCWVudW0gZHJiZF9zdGF0ZV9ydiBydiA9IFNTX1NVQ0NFU1M7CiAJdW5pb24gZHJiZF9zdGF0ZSBucywgb3M7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZucjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJb3MgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7Ci0JCW5zID0gc2FuaXRpemVfc3RhdGUobWRldiwgYXBwbHlfbWFza192YWwob3MsIG1hc2ssIHZhbCksIE5VTEwpOworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKSB7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJb3MgPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKTsKKwkJbnMgPSBzYW5pdGl6ZV9zdGF0ZShkZXZpY2UsIGFwcGx5X21hc2tfdmFsKG9zLCBtYXNrLCB2YWwpLCBOVUxMKTsKIAogCQlpZiAoZmxhZ3MgJiBDU19JR05fT1VURF9GQUlMICYmIG5zLmRpc2sgPT0gRF9PVVREQVRFRCAmJiBvcy5kaXNrIDwgRF9PVVREQVRFRCkKIAkJCW5zLmRpc2sgPSBvcy5kaXNrOwpAQCAtMTY0OCwzMCArMTY2NSwyOSBAQAogCQkJY29udGludWU7CiAKIAkJcnYgPSBpc192YWxpZF90cmFuc2l0aW9uKG9zLCBucyk7Ci0JCWlmIChydiA8IFNTX1NVQ0NFU1MpCi0JCQlicmVhazsKIAotCQlpZiAoIShmbGFncyAmIENTX0hBUkQpKSB7Ci0JCQlydiA9IGlzX3ZhbGlkX3N0YXRlKG1kZXYsIG5zKTsKKwkJaWYgKHJ2ID49IFNTX1NVQ0NFU1MgJiYgIShmbGFncyAmIENTX0hBUkQpKSB7CisJCQlydiA9IGlzX3ZhbGlkX3N0YXRlKGRldmljZSwgbnMpOwogCQkJaWYgKHJ2IDwgU1NfU1VDQ0VTUykgewotCQkJCWlmIChpc192YWxpZF9zdGF0ZShtZGV2LCBvcykgPT0gcnYpCi0JCQkJCXJ2ID0gaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKG9zLCBucywgdGNvbm4pOworCQkJCWlmIChpc192YWxpZF9zdGF0ZShkZXZpY2UsIG9zKSA9PSBydikKKwkJCQkJcnYgPSBpc192YWxpZF9zb2Z0X3RyYW5zaXRpb24ob3MsIG5zLCBjb25uZWN0aW9uKTsKIAkJCX0gZWxzZQotCQkJCXJ2ID0gaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKG9zLCBucywgdGNvbm4pOworCQkJCXJ2ID0gaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKG9zLCBucywgY29ubmVjdGlvbik7CiAJCX0KLQkJaWYgKHJ2IDwgU1NfU1VDQ0VTUykKKworCQlpZiAocnYgPCBTU19TVUNDRVNTKSB7CisJCQlpZiAoZmxhZ3MgJiBDU19WRVJCT1NFKQorCQkJCXByaW50X3N0X2VycihkZXZpY2UsIG9zLCBucywgcnYpOwogCQkJYnJlYWs7CisJCX0KIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlpZiAocnYgPCBTU19TVUNDRVNTICYmIGZsYWdzICYgQ1NfVkVSQk9TRSkKLQkJcHJpbnRfc3RfZXJyKG1kZXYsIG9zLCBucywgcnYpOwotCiAJcmV0dXJuIHJ2OwogfQogCiB2b2lkCi1jb25uX3NldF9zdGF0ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywgdW5pb24gZHJiZF9zdGF0ZSB2YWwsCitjb25uX3NldF9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsLAogCSAgICAgICB1bmlvbiBkcmJkX3N0YXRlICpwbnNfbWluLCB1bmlvbiBkcmJkX3N0YXRlICpwbnNfbWF4LCBlbnVtIGNoZ19zdGF0ZV9mbGFncyBmbGFncykKIHsKIAl1bmlvbiBkcmJkX3N0YXRlIG5zLCBvcywgbnNfbWF4ID0geyB9OwpAQCAtMTY4Miw3ICsxNjk4LDcgQEAKIAkJICAuZGlzayA9IERfTUFTSywKIAkJICAucGRzayA9IERfTUFTSwogCQl9IH07Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJZW51bSBkcmJkX3N0YXRlX3J2IHJ2OwogCWludCB2bnIsIG51bWJlcl9vZl92b2x1bWVzID0gMDsKIApAQCAtMTY5MCwyNyArMTcwNiwyOCBAQAogCQkvKiByZW1lbWJlciBsYXN0IGNvbm5lY3QgdGltZSBzbyByZXF1ZXN0X3RpbWVyX2ZuKCkgd29uJ3QKIAkJICoga2lsbCBuZXdseSBlc3RhYmxpc2hlZCBzZXNzaW9ucyB3aGlsZSB3ZSBhcmUgc3RpbGwgdHJ5aW5nIHRvIHRoYXcKIAkJICogcHJldmlvdXNseSBmcm96ZW4gSU8gKi8KLQkJaWYgKHRjb25uLT5jc3RhdGUgIT0gQ19XRl9SRVBPUlRfUEFSQU1TICYmIHZhbC5jb25uID09IENfV0ZfUkVQT1JUX1BBUkFNUykKLQkJCXRjb25uLT5sYXN0X3JlY29ubmVjdF9qaWYgPSBqaWZmaWVzOworCQlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlICE9IENfV0ZfUkVQT1JUX1BBUkFNUyAmJiB2YWwuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpCisJCQljb25uZWN0aW9uLT5sYXN0X3JlY29ubmVjdF9qaWYgPSBqaWZmaWVzOwogCi0JCXRjb25uLT5jc3RhdGUgPSB2YWwuY29ubjsKKwkJY29ubmVjdGlvbi0+Y3N0YXRlID0gdmFsLmNvbm47CiAJfQogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikgeworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKSB7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAkJbnVtYmVyX29mX3ZvbHVtZXMrKzsKLQkJb3MgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7CisJCW9zID0gZHJiZF9yZWFkX3N0YXRlKGRldmljZSk7CiAJCW5zID0gYXBwbHlfbWFza192YWwob3MsIG1hc2ssIHZhbCk7Ci0JCW5zID0gc2FuaXRpemVfc3RhdGUobWRldiwgbnMsIE5VTEwpOworCQlucyA9IHNhbml0aXplX3N0YXRlKGRldmljZSwgbnMsIE5VTEwpOwogCiAJCWlmIChmbGFncyAmIENTX0lHTl9PVVREX0ZBSUwgJiYgbnMuZGlzayA9PSBEX09VVERBVEVEICYmIG9zLmRpc2sgPCBEX09VVERBVEVEKQogCQkJbnMuZGlzayA9IG9zLmRpc2s7CiAKLQkJcnYgPSBfX2RyYmRfc2V0X3N0YXRlKG1kZXYsIG5zLCBmbGFncywgTlVMTCk7CisJCXJ2ID0gX19kcmJkX3NldF9zdGF0ZShkZXZpY2UsIG5zLCBmbGFncywgTlVMTCk7CiAJCWlmIChydiA8IFNTX1NVQ0NFU1MpCiAJCQlCVUcoKTsKIAotCQlucy5pID0gbWRldi0+c3RhdGUuaTsKKwkJbnMuaSA9IGRldmljZS0+c3RhdGUuaTsKIAkJbnNfbWF4LnJvbGUgPSBtYXhfcm9sZShucy5yb2xlLCBuc19tYXgucm9sZSk7CiAJCW5zX21heC5wZWVyID0gbWF4X3JvbGUobnMucGVlciwgbnNfbWF4LnBlZXIpOwogCQluc19tYXguY29ubiA9IG1heF90KGVudW0gZHJiZF9jb25ucywgbnMuY29ubiwgbnNfbWF4LmNvbm4pOwpAQCAtMTczNSwzOSArMTc1MiwzOSBAQAogCQkJfSB9OwogCX0KIAotCW5zX21pbi5zdXNwID0gbnNfbWF4LnN1c3AgPSB0Y29ubi0+c3VzcDsKLQluc19taW4uc3VzcF9ub2QgPSBuc19tYXguc3VzcF9ub2QgPSB0Y29ubi0+c3VzcF9ub2Q7Ci0JbnNfbWluLnN1c3BfZmVuID0gbnNfbWF4LnN1c3BfZmVuID0gdGNvbm4tPnN1c3BfZmVuOworCW5zX21pbi5zdXNwID0gbnNfbWF4LnN1c3AgPSBjb25uZWN0aW9uLT5yZXNvdXJjZS0+c3VzcDsKKwluc19taW4uc3VzcF9ub2QgPSBuc19tYXguc3VzcF9ub2QgPSBjb25uZWN0aW9uLT5yZXNvdXJjZS0+c3VzcF9ub2Q7CisJbnNfbWluLnN1c3BfZmVuID0gbnNfbWF4LnN1c3BfZmVuID0gY29ubmVjdGlvbi0+cmVzb3VyY2UtPnN1c3BfZmVuOwogCiAJKnBuc19taW4gPSBuc19taW47CiAJKnBuc19tYXggPSBuc19tYXg7CiB9CiAKIHN0YXRpYyBlbnVtIGRyYmRfc3RhdGVfcnYKLV9jb25uX3JxX2NvbmQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsKQorX2Nvbm5fcnFfY29uZChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsKQogewogCWVudW0gZHJiZF9zdGF0ZV9ydiBydjsKIAotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ09OTl9XRF9TVF9DSEdfT0tBWSwgJnRjb25uLT5mbGFncykpCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDT05OX1dEX1NUX0NIR19PS0FZLCAmY29ubmVjdGlvbi0+ZmxhZ3MpKQogCQlyZXR1cm4gU1NfQ1dfU1VDQ0VTUzsKIAotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ09OTl9XRF9TVF9DSEdfRkFJTCwgJnRjb25uLT5mbGFncykpCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDT05OX1dEX1NUX0NIR19GQUlMLCAmY29ubmVjdGlvbi0+ZmxhZ3MpKQogCQlyZXR1cm4gU1NfQ1dfRkFJTEVEX0JZX1BFRVI7CiAKLQlydiA9IGNvbm5faXNfdmFsaWRfdHJhbnNpdGlvbih0Y29ubiwgbWFzaywgdmFsLCAwKTsKLQlpZiAocnYgPT0gU1NfU1VDQ0VTUyAmJiB0Y29ubi0+Y3N0YXRlID09IENfV0ZfUkVQT1JUX1BBUkFNUykKKwlydiA9IGNvbm5faXNfdmFsaWRfdHJhbnNpdGlvbihjb25uZWN0aW9uLCBtYXNrLCB2YWwsIDApOworCWlmIChydiA9PSBTU19TVUNDRVNTICYmIGNvbm5lY3Rpb24tPmNzdGF0ZSA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpCiAJCXJ2ID0gU1NfVU5LTk9XTl9FUlJPUjsgLyogY29udGludWUgd2FpdGluZyAqLwogCiAJcmV0dXJuIHJ2OwogfQogCiBlbnVtIGRyYmRfc3RhdGVfcnYKLV9jb25uX3JlcXVlc3Rfc3RhdGUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsLAorX2Nvbm5fcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsLAogCQkgICAgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3MpCiB7CiAJZW51bSBkcmJkX3N0YXRlX3J2IHJ2ID0gU1NfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWZ0ZXJfY29ubl9zdGF0ZV9jaGdfd29yayAqYWNzY3c7Ci0JZW51bSBkcmJkX2Nvbm5zIG9jID0gdGNvbm4tPmNzdGF0ZTsKKwllbnVtIGRyYmRfY29ubnMgb2MgPSBjb25uZWN0aW9uLT5jc3RhdGU7CiAJdW5pb24gZHJiZF9zdGF0ZSBuc19tYXgsIG5zX21pbiwgb3M7CiAJYm9vbCBoYXZlX211dGV4ID0gZmFsc2U7CiAKQEAgLTE3NzcsNyArMTc5NCw3IEBACiAJCQlnb3RvIGFib3J0OwogCX0KIAotCXJ2ID0gY29ubl9pc192YWxpZF90cmFuc2l0aW9uKHRjb25uLCBtYXNrLCB2YWwsIGZsYWdzKTsKKwlydiA9IGNvbm5faXNfdmFsaWRfdHJhbnNpdGlvbihjb25uZWN0aW9uLCBtYXNrLCB2YWwsIGZsYWdzKTsKIAlpZiAocnYgPCBTU19TVUNDRVNTKQogCQlnb3RvIGFib3J0OwogCkBAIC0xNzg3LDM4ICsxODA0LDM4IEBACiAJCS8qIFRoaXMgd2lsbCBiZSBhIGNsdXN0ZXItd2lkZSBzdGF0ZSBjaGFuZ2UuCiAJCSAqIE5lZWQgdG8gZ2l2ZSB1cCB0aGUgc3BpbmxvY2ssIGdyYWIgdGhlIG11dGV4LAogCQkgKiB0aGVuIHNlbmQgdGhlIHN0YXRlIGNoYW5nZSByZXF1ZXN0LCAuLi4gKi8KLQkJc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCQltdXRleF9sb2NrKCZ0Y29ubi0+Y3N0YXRlX211dGV4KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCQltdXRleF9sb2NrKCZjb25uZWN0aW9uLT5jc3RhdGVfbXV0ZXgpOwogCQloYXZlX211dGV4ID0gdHJ1ZTsKIAotCQlzZXRfYml0KENPTk5fV0RfU1RfQ0hHX1JFUSwgJnRjb25uLT5mbGFncyk7Ci0JCWlmIChjb25uX3NlbmRfc3RhdGVfcmVxKHRjb25uLCBtYXNrLCB2YWwpKSB7CisJCXNldF9iaXQoQ09OTl9XRF9TVF9DSEdfUkVRLCAmY29ubmVjdGlvbi0+ZmxhZ3MpOworCQlpZiAoY29ubl9zZW5kX3N0YXRlX3JlcShjb25uZWN0aW9uLCBtYXNrLCB2YWwpKSB7CiAJCQkvKiBzZW5kaW5nIGZhaWxlZC4gKi8KLQkJCWNsZWFyX2JpdChDT05OX1dEX1NUX0NIR19SRVEsICZ0Y29ubi0+ZmxhZ3MpOworCQkJY2xlYXJfYml0KENPTk5fV0RfU1RfQ0hHX1JFUSwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAkJCXJ2ID0gU1NfQ1dfRkFJTEVEX0JZX1BFRVI7CiAJCQkvKiBuZWVkIHRvIHJlLWFxdWlyZSB0aGUgc3BpbiBsb2NrLCB0aG91Z2ggKi8KIAkJCWdvdG8gYWJvcnRfdW5sb2NrZWQ7CiAJCX0KIAogCQlpZiAodmFsLmNvbm4gPT0gQ19ESVNDT05ORUNUSU5HKQotCQkJc2V0X2JpdChESVNDT05ORUNUX1NFTlQsICZ0Y29ubi0+ZmxhZ3MpOworCQkJc2V0X2JpdChESVNDT05ORUNUX1NFTlQsICZjb25uZWN0aW9uLT5mbGFncyk7CiAKIAkJLyogLi4uIGFuZCByZS1hcXVpcmUgdGhlIHNwaW5sb2NrLgogCQkgKiBJZiBfY29ubl9ycV9jb25kKCkgcmV0dXJuZWQgPj0gU1NfU1VDQ0VTUywgd2UgbXVzdCBjYWxsCiAJCSAqIGNvbm5fc2V0X3N0YXRlKCkgd2l0aGluIHRoZSBzYW1lIHNwaW5sb2NrLiAqLwotCQlzcGluX2xvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCQl3YWl0X2V2ZW50X2xvY2tfaXJxKHRjb25uLT5waW5nX3dhaXQsCi0JCQkJKHJ2ID0gX2Nvbm5fcnFfY29uZCh0Y29ubiwgbWFzaywgdmFsKSksCi0JCQkJdGNvbm4tPnJlcV9sb2NrKTsKLQkJY2xlYXJfYml0KENPTk5fV0RfU1RfQ0hHX1JFUSwgJnRjb25uLT5mbGFncyk7CisJCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CisJCXdhaXRfZXZlbnRfbG9ja19pcnEoY29ubmVjdGlvbi0+cGluZ193YWl0LAorCQkJCShydiA9IF9jb25uX3JxX2NvbmQoY29ubmVjdGlvbiwgbWFzaywgdmFsKSksCisJCQkJY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwkJY2xlYXJfYml0KENPTk5fV0RfU1RfQ0hHX1JFUSwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAkJaWYgKHJ2IDwgU1NfU1VDQ0VTUykKIAkJCWdvdG8gYWJvcnQ7CiAJfQogCi0JY29ubl9vbGRfY29tbW9uX3N0YXRlKHRjb25uLCAmb3MsICZmbGFncyk7CisJY29ubl9vbGRfY29tbW9uX3N0YXRlKGNvbm5lY3Rpb24sICZvcywgJmZsYWdzKTsKIAlmbGFncyB8PSBDU19EQ19TVVNQOwotCWNvbm5fc2V0X3N0YXRlKHRjb25uLCBtYXNrLCB2YWwsICZuc19taW4sICZuc19tYXgsIGZsYWdzKTsKLQljb25uX3ByX3N0YXRlX2NoYW5nZSh0Y29ubiwgb3MsIG5zX21heCwgZmxhZ3MpOworCWNvbm5fc2V0X3N0YXRlKGNvbm5lY3Rpb24sIG1hc2ssIHZhbCwgJm5zX21pbiwgJm5zX21heCwgZmxhZ3MpOworCWNvbm5fcHJfc3RhdGVfY2hhbmdlKGNvbm5lY3Rpb24sIG9zLCBuc19tYXgsIGZsYWdzKTsKIAogCWFjc2N3ID0ga21hbGxvYyhzaXplb2YoKmFjc2N3KSwgR0ZQX0FUT01JQyk7CiAJaWYgKGFjc2N3KSB7CkBAIC0xODI3LDM5ICsxODQ0LDM5IEBACiAJCWFjc2N3LT5uc19tYXggPSBuc19tYXg7CiAJCWFjc2N3LT5mbGFncyA9IGZsYWdzOwogCQlhY3Njdy0+dy5jYiA9IHdfYWZ0ZXJfY29ubl9zdGF0ZV9jaDsKLQkJa3JlZl9nZXQoJnRjb25uLT5rcmVmKTsKLQkJYWNzY3ctPncudGNvbm4gPSB0Y29ubjsKLQkJZHJiZF9xdWV1ZV93b3JrKCZ0Y29ubi0+c2VuZGVyX3dvcmssICZhY3Njdy0+dyk7CisJCWtyZWZfZ2V0KCZjb25uZWN0aW9uLT5rcmVmKTsKKwkJYWNzY3ctPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCQlkcmJkX3F1ZXVlX3dvcmsoJmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLCAmYWNzY3ctPncpOwogCX0gZWxzZSB7Ci0JCWNvbm5fZXJyKHRjb25uLCAiQ291bGQgbm90IGttYWxsb2MgYW4gYWNzY3dcbiIpOworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiQ291bGQgbm90IGttYWxsb2MgYW4gYWNzY3dcbiIpOwogCX0KIAogIGFib3J0OgogCWlmIChoYXZlX211dGV4KSB7CiAJCS8qIG11dGV4X3VubG9jaygpICIuLi4gbXVzdCBub3QgYmUgdXNlZCBpbiBpbnRlcnJ1cHQgY29udGV4dC4iLAogCQkgKiBzbyBnaXZlIHVwIHRoZSBzcGlubG9jaywgdGhlbiByZS1hcXVpcmUgaXQgKi8KLQkJc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiAgYWJvcnRfdW5sb2NrZWQ6Ci0JCW11dGV4X3VubG9jaygmdGNvbm4tPmNzdGF0ZV9tdXRleCk7Ci0JCXNwaW5fbG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7CisJCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+Y3N0YXRlX211dGV4KTsKKwkJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAl9CiAJaWYgKHJ2IDwgU1NfU1VDQ0VTUyAmJiBmbGFncyAmIENTX1ZFUkJPU0UpIHsKLQkJY29ubl9lcnIodGNvbm4sICJTdGF0ZSBjaGFuZ2UgZmFpbGVkOiAlc1xuIiwgZHJiZF9zZXRfc3RfZXJyX3N0cihydikpOwotCQljb25uX2Vycih0Y29ubiwgIiBtYXNrID0gMHgleCB2YWwgPSAweCV4XG4iLCBtYXNrLmksIHZhbC5pKTsKLQkJY29ubl9lcnIodGNvbm4sICIgb2xkX2Nvbm46JXMgd2FudGVkX2Nvbm46JXNcbiIsIGRyYmRfY29ubl9zdHIob2MpLCBkcmJkX2Nvbm5fc3RyKHZhbC5jb25uKSk7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJTdGF0ZSBjaGFuZ2UgZmFpbGVkOiAlc1xuIiwgZHJiZF9zZXRfc3RfZXJyX3N0cihydikpOworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiIG1hc2sgPSAweCV4IHZhbCA9IDB4JXhcbiIsIG1hc2suaSwgdmFsLmkpOworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiIG9sZF9jb25uOiVzIHdhbnRlZF9jb25uOiVzXG4iLCBkcmJkX2Nvbm5fc3RyKG9jKSwgZHJiZF9jb25uX3N0cih2YWwuY29ubikpOwogCX0KIAlyZXR1cm4gcnY7CiB9CiAKIGVudW0gZHJiZF9zdGF0ZV9ydgotY29ubl9yZXF1ZXN0X3N0YXRlKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLCB1bmlvbiBkcmJkX3N0YXRlIHZhbCwKK2Nvbm5fcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsLAogCQkgICBlbnVtIGNoZ19zdGF0ZV9mbGFncyBmbGFncykKIHsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnY7CiAKLQlzcGluX2xvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCXJ2ID0gX2Nvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgbWFzaywgdmFsLCBmbGFncyk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CisJcnYgPSBfY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIG1hc2ssIHZhbCwgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAogCXJldHVybiBydjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3N0YXRlLmggYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9zdGF0ZS5oCmluZGV4IGEzYzM2MWIuLmNjNDE2MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3N0YXRlLmgKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfc3RhdGUuaApAQCAtMSw4ICsxLDggQEAKICNpZm5kZWYgRFJCRF9TVEFURV9ICiAjZGVmaW5lIERSQkRfU1RBVEVfSAogCi1zdHJ1Y3QgZHJiZF9jb25mOwotc3RydWN0IGRyYmRfdGNvbm47CitzdHJ1Y3QgZHJiZF9kZXZpY2U7CitzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uOwogCiAvKioKICAqIERPQzogRFJCRCBTdGF0ZSBtYWNyb3MKQEAgLTEwNywzNiArMTA3LDM2IEBACiAJdW5zaWduZWQgaW50IGk7CiB9OwogCi1leHRlcm4gZW51bSBkcmJkX3N0YXRlX3J2IGRyYmRfY2hhbmdlX3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitleHRlcm4gZW51bSBkcmJkX3N0YXRlX3J2IGRyYmRfY2hhbmdlX3N0YXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCQkgICAgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZiwKIAkJCQkJICAgIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywKIAkJCQkJICAgIHVuaW9uIGRyYmRfc3RhdGUgdmFsKTsKLWV4dGVybiB2b2lkIGRyYmRfZm9yY2Vfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqLCB1bmlvbiBkcmJkX3N0YXRlLAorZXh0ZXJuIHZvaWQgZHJiZF9mb3JjZV9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgdW5pb24gZHJiZF9zdGF0ZSwKIAkJCXVuaW9uIGRyYmRfc3RhdGUpOwotZXh0ZXJuIGVudW0gZHJiZF9zdGF0ZV9ydiBfZHJiZF9yZXF1ZXN0X3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKiwKK2V4dGVybiBlbnVtIGRyYmRfc3RhdGVfcnYgX2RyYmRfcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwKIAkJCQkJICAgICAgdW5pb24gZHJiZF9zdGF0ZSwKIAkJCQkJICAgICAgdW5pb24gZHJiZF9zdGF0ZSwKIAkJCQkJICAgICAgZW51bSBjaGdfc3RhdGVfZmxhZ3MpOwotZXh0ZXJuIGVudW0gZHJiZF9zdGF0ZV9ydiBfX2RyYmRfc2V0X3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKiwgdW5pb24gZHJiZF9zdGF0ZSwKK2V4dGVybiBlbnVtIGRyYmRfc3RhdGVfcnYgX19kcmJkX3NldF9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgdW5pb24gZHJiZF9zdGF0ZSwKIAkJCQkJICAgZW51bSBjaGdfc3RhdGVfZmxhZ3MsCiAJCQkJCSAgIHN0cnVjdCBjb21wbGV0aW9uICpkb25lKTsKLWV4dGVybiB2b2lkIHByaW50X3N0X2VycihzdHJ1Y3QgZHJiZF9jb25mICosIHVuaW9uIGRyYmRfc3RhdGUsCitleHRlcm4gdm9pZCBwcmludF9zdF9lcnIoc3RydWN0IGRyYmRfZGV2aWNlICosIHVuaW9uIGRyYmRfc3RhdGUsCiAJCQl1bmlvbiBkcmJkX3N0YXRlLCBpbnQpOwogCiBlbnVtIGRyYmRfc3RhdGVfcnYKLV9jb25uX3JlcXVlc3Rfc3RhdGUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsLAorX2Nvbm5fcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsLAogCQkgICAgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3MpOwogCiBlbnVtIGRyYmRfc3RhdGVfcnYKLWNvbm5fcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywgdW5pb24gZHJiZF9zdGF0ZSB2YWwsCitjb25uX3JlcXVlc3Rfc3RhdGUoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLCB1bmlvbiBkcmJkX3N0YXRlIHZhbCwKIAkJICAgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3MpOwogCi1leHRlcm4gdm9pZCBkcmJkX3Jlc3VtZV9hbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiBib29sIGNvbm5fYWxsX3ZvbHNfdW5jb25mKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7CitleHRlcm4gdm9pZCBkcmJkX3Jlc3VtZV9hbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gYm9vbCBjb25uX2FsbF92b2xzX3VuY29uZihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKIAogLyoqCiAgKiBkcmJkX3JlcXVlc3Rfc3RhdGUoKSAtIFJlcWVzdCBhIHN0YXRlIGNoYW5nZQotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAbWFzazoJbWFzayBvZiBzdGF0ZSBiaXRzIHRvIGNoYW5nZS4KICAqIEB2YWw6CXZhbHVlIG9mIG5ldyBzdGF0ZSBiaXRzLgogICoKQEAgLTE0NCwxOCArMTQ0LDE4IEBACiAgKiBxdWl0ZSB2ZXJib3NlIGluIGNhc2UgdGhlIHN0YXRlIGNoYW5nZSBpcyBub3QgcG9zc2libGUsIGFuZCBhbGwgdGhvc2UKICAqIHN0YXRlIGNoYW5nZXMgYXJlIGdsb2JhbGx5IHNlcmlhbGl6ZWQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGRyYmRfcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIGlubGluZSBpbnQgZHJiZF9yZXF1ZXN0X3N0YXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCSAgICAgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLAogCQkJCSAgICAgdW5pb24gZHJiZF9zdGF0ZSB2YWwpCiB7Ci0JcmV0dXJuIF9kcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgbWFzaywgdmFsLCBDU19WRVJCT1NFICsgQ1NfT1JERVJFRCk7CisJcmV0dXJuIF9kcmJkX3JlcXVlc3Rfc3RhdGUoZGV2aWNlLCBtYXNrLCB2YWwsIENTX1ZFUkJPU0UgKyBDU19PUkRFUkVEKTsKIH0KIAotZW51bSBkcmJkX3JvbGUgY29ubl9oaWdoZXN0X3JvbGUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKLWVudW0gZHJiZF9yb2xlIGNvbm5faGlnaGVzdF9wZWVyKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1lbnVtIGRyYmRfZGlza19zdGF0ZSBjb25uX2hpZ2hlc3RfZGlzayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pOwotZW51bSBkcmJkX2Rpc2tfc3RhdGUgY29ubl9sb3dlc3RfZGlzayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pOwotZW51bSBkcmJkX2Rpc2tfc3RhdGUgY29ubl9oaWdoZXN0X3Bkc2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKLWVudW0gZHJiZF9jb25ucyBjb25uX2xvd2VzdF9jb25uKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7CitlbnVtIGRyYmRfcm9sZSBjb25uX2hpZ2hlc3Rfcm9sZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2VudW0gZHJiZF9yb2xlIGNvbm5faGlnaGVzdF9wZWVyKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZW51bSBkcmJkX2Rpc2tfc3RhdGUgY29ubl9oaWdoZXN0X2Rpc2soc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitlbnVtIGRyYmRfZGlza19zdGF0ZSBjb25uX2xvd2VzdF9kaXNrKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZW51bSBkcmJkX2Rpc2tfc3RhdGUgY29ubl9oaWdoZXN0X3Bkc2soc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitlbnVtIGRyYmRfY29ubnMgY29ubl9sb3dlc3RfY29ubihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9zdHJpbmdzLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9zdHJpbmdzLmMKaW5kZXggNThlMDhmZi4uODBiMGY2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfc3RyaW5ncy5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3N0cmluZ3MuYwpAQCAtMjQsNiArMjQsNyBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RyYmQuaD4KKyNpbmNsdWRlICJkcmJkX3N0cmluZ3MuaCIKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyYmRfY29ubl9zX25hbWVzW10gPSB7CiAJW0NfU1RBTkRBTE9ORV0gICAgICAgPSAiU3RhbmRBbG9uZSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9zdHJpbmdzLmggYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9zdHJpbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk5MjNjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3N0cmluZ3MuaApAQCAtMCwwICsxLDkgQEAKKyNpZm5kZWYgX19EUkJEX1NUUklOR1NfSAorI2RlZmluZSBfX0RSQkRfU1RSSU5HU19ICisKK2V4dGVybiBjb25zdCBjaGFyICpkcmJkX2Nvbm5fc3RyKGVudW0gZHJiZF9jb25ucyk7CitleHRlcm4gY29uc3QgY2hhciAqZHJiZF9yb2xlX3N0cihlbnVtIGRyYmRfcm9sZSk7CitleHRlcm4gY29uc3QgY2hhciAqZHJiZF9kaXNrX3N0cihlbnVtIGRyYmRfZGlza19zdGF0ZSk7CitleHRlcm4gY29uc3QgY2hhciAqZHJiZF9zZXRfc3RfZXJyX3N0cihlbnVtIGRyYmRfc3RhdGVfcnYpOworCisjZW5kaWYgIC8qIF9fRFJCRF9TVFJJTkdTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3dvcmtlci5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfd29ya2VyLmMKaW5kZXggODRkMzE3NS4uMmM0Y2U0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfd29ya2VyLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfd29ya2VyLmMKQEAgLTIxLDcgKzIxLDcgQEAKICAgIGFsb25nIHdpdGggZHJiZDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KIAotICovCisqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZHJiZC5oPgpAQCAtMzYsMTAgKzM2LDExIEBACiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KIAogI2luY2x1ZGUgImRyYmRfaW50LmgiCisjaW5jbHVkZSAiZHJiZF9wcm90b2NvbC5oIgogI2luY2x1ZGUgImRyYmRfcmVxLmgiCiAKLXN0YXRpYyBpbnQgd19tYWtlX292X3JlcXVlc3Qoc3RydWN0IGRyYmRfd29yayAqdywgaW50IGNhbmNlbCk7Ci0KK3N0YXRpYyBpbnQgbWFrZV9vdl9yZXF1ZXN0KHN0cnVjdCBkcmJkX2RldmljZSAqLCBpbnQpOworc3RhdGljIGludCBtYWtlX3Jlc3luY19yZXF1ZXN0KHN0cnVjdCBkcmJkX2RldmljZSAqLCBpbnQpOwogCiAvKiBlbmRpbyBoYW5kbGVyczoKICAqICAgZHJiZF9tZF9pb19jb21wbGV0ZSAoZGVmaW5lZCBoZXJlKQpAQCAtNjcsMTAgKzY4LDEwIEBACiB2b2lkIGRyYmRfbWRfaW9fY29tcGxldGUoc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyb3IpCiB7CiAJc3RydWN0IGRyYmRfbWRfaW8gKm1kX2lvOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAKIAltZF9pbyA9IChzdHJ1Y3QgZHJiZF9tZF9pbyAqKWJpby0+YmlfcHJpdmF0ZTsKLQltZGV2ID0gY29udGFpbmVyX29mKG1kX2lvLCBzdHJ1Y3QgZHJiZF9jb25mLCBtZF9pbyk7CisJZGV2aWNlID0gY29udGFpbmVyX29mKG1kX2lvLCBzdHJ1Y3QgZHJiZF9kZXZpY2UsIG1kX2lvKTsKIAogCW1kX2lvLT5lcnJvciA9IGVycm9yOwogCkBAIC04MywzNSArODQsMzYgQEAKIAkgKiBNYWtlIHN1cmUgd2UgZmlyc3QgZHJvcCB0aGUgcmVmZXJlbmNlLCBhbmQgb25seSB0aGVuIHNpZ25hbAogCSAqIGNvbXBsZXRpb24sIG9yIHdlIG1heSAoaW4gZHJiZF9hbF9yZWFkX2xvZygpKSBjeWNsZSBzbyBmYXN0IGludG8gdGhlCiAJICogbmV4dCBkcmJkX21kX3N5bmNfcGFnZV9pbygpLCB0aGF0IHdlIHRyaWdnZXIgdGhlCi0JICogQVNTRVJUKGF0b21pY19yZWFkKCZtZGV2LT5tZF9pb19pbl91c2UpID09IDEpIHRoZXJlLgorCSAqIEFTU0VSVChhdG9taWNfcmVhZCgmZGV2aWNlLT5tZF9pb19pbl91c2UpID09IDEpIHRoZXJlLgogCSAqLwotCWRyYmRfbWRfcHV0X2J1ZmZlcihtZGV2KTsKKwlkcmJkX21kX3B1dF9idWZmZXIoZGV2aWNlKTsKIAltZF9pby0+ZG9uZSA9IDE7Ci0Jd2FrZV91cCgmbWRldi0+bWlzY193YWl0KTsKKwl3YWtlX3VwKCZkZXZpY2UtPm1pc2Nfd2FpdCk7CiAJYmlvX3B1dChiaW8pOwotCWlmIChtZGV2LT5sZGV2KSAvKiBzcGVjaWFsIGNhc2U6IGRyYmRfbWRfcmVhZCgpIGR1cmluZyBkcmJkX2FkbV9hdHRhY2goKSAqLwotCQlwdXRfbGRldihtZGV2KTsKKwlpZiAoZGV2aWNlLT5sZGV2KSAvKiBzcGVjaWFsIGNhc2U6IGRyYmRfbWRfcmVhZCgpIGR1cmluZyBkcmJkX2FkbV9hdHRhY2goKSAqLworCQlwdXRfbGRldihkZXZpY2UpOwogfQogCiAvKiByZWFkcyBvbiBiZWhhbGYgb2YgdGhlIHBhcnRuZXIsCiAgKiAic3VibWl0dGVkIiBieSB0aGUgcmVjZWl2ZXIKICAqLwotdm9pZCBkcmJkX2VuZGlvX3JlYWRfc2VjX2ZpbmFsKHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEpIF9fcmVsZWFzZXMobG9jYWwpCitzdGF0aWMgdm9pZCBkcmJkX2VuZGlvX3JlYWRfc2VjX2ZpbmFsKHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEpIF9fcmVsZWFzZXMobG9jYWwpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHBlZXJfcmVxLT53Lm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKLQltZGV2LT5yZWFkX2NudCArPSBwZWVyX3JlcS0+aS5zaXplID4+IDk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CisJZGV2aWNlLT5yZWFkX2NudCArPSBwZWVyX3JlcS0+aS5zaXplID4+IDk7CiAJbGlzdF9kZWwoJnBlZXJfcmVxLT53Lmxpc3QpOwotCWlmIChsaXN0X2VtcHR5KCZtZGV2LT5yZWFkX2VlKSkKLQkJd2FrZV91cCgmbWRldi0+ZWVfd2FpdCk7CisJaWYgKGxpc3RfZW1wdHkoJmRldmljZS0+cmVhZF9lZSkpCisJCXdha2VfdXAoJmRldmljZS0+ZWVfd2FpdCk7CiAJaWYgKHRlc3RfYml0KF9fRUVfV0FTX0VSUk9SLCAmcGVlcl9yZXEtPmZsYWdzKSkKLQkJX19kcmJkX2Noa19pb19lcnJvcihtZGV2LCBEUkJEX1JFQURfRVJST1IpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPnRjb25uLT5yZXFfbG9jaywgZmxhZ3MpOworCQlfX2RyYmRfY2hrX2lvX2Vycm9yKGRldmljZSwgRFJCRF9SRUFEX0VSUk9SKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOwogCi0JZHJiZF9xdWV1ZV93b3JrKCZtZGV2LT50Y29ubi0+c2VuZGVyX3dvcmssICZwZWVyX3JlcS0+dyk7Ci0JcHV0X2xkZXYobWRldik7CisJZHJiZF9xdWV1ZV93b3JrKCZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssICZwZWVyX3JlcS0+dyk7CisJcHV0X2xkZXYoZGV2aWNlKTsKIH0KIAogLyogd3JpdGVzIG9uIGJlaGFsZiBvZiB0aGUgcGFydG5lciwgb3IgcmVzeW5jIHdyaXRlcywKQEAgLTExOSw3ICsxMjEsOCBAQAogc3RhdGljIHZvaWQgZHJiZF9lbmRpb193cml0ZV9zZWNfZmluYWwoc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSkgX19yZWxlYXNlcyhsb2NhbCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gcGVlcl9yZXEtPncubWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UgPSBwZWVyX3JlcS0+cGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXN0cnVjdCBkcmJkX2ludGVydmFsIGk7CiAJaW50IGRvX3dha2U7CiAJdTY0IGJsb2NrX2lkOwpAQCAtMTMzLDM1ICsxMzYsMzUgQEAKIAlkb19hbF9jb21wbGV0ZV9pbyA9IHBlZXJfcmVxLT5mbGFncyAmIEVFX0NBTExfQUxfQ09NUExFVEVfSU87CiAJYmxvY2tfaWQgPSBwZWVyX3JlcS0+YmxvY2tfaWQ7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7Ci0JbWRldi0+d3JpdF9jbnQgKz0gcGVlcl9yZXEtPmkuc2l6ZSA+PiA5OwotCWxpc3RfbW92ZV90YWlsKCZwZWVyX3JlcS0+dy5saXN0LCAmbWRldi0+ZG9uZV9lZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CisJZGV2aWNlLT53cml0X2NudCArPSBwZWVyX3JlcS0+aS5zaXplID4+IDk7CisJbGlzdF9tb3ZlX3RhaWwoJnBlZXJfcmVxLT53Lmxpc3QsICZkZXZpY2UtPmRvbmVfZWUpOwogCiAJLyoKIAkgKiBEbyBub3QgcmVtb3ZlIGZyb20gdGhlIHdyaXRlX3JlcXVlc3RzIHRyZWUgaGVyZTogd2UgZGlkIG5vdCBzZW5kIHRoZQogCSAqIEFjayB5ZXQgYW5kIGRpZCBub3Qgd2FrZSBwb3NzaWJseSB3YWl0aW5nIGNvbmZsaWN0aW5nIHJlcXVlc3RzLgogCSAqIFJlbW92ZWQgZnJvbSB0aGUgdHJlZSBmcm9tICJkcmJkX3Byb2Nlc3NfZG9uZV9lZSIgd2l0aGluIHRoZQotCSAqIGFwcHJvcHJpYXRlIHcuY2IgKGVfZW5kX2Jsb2NrL2VfZW5kX3Jlc3luY19ibG9jaykgb3IgZnJvbQorCSAqIGFwcHJvcHJpYXRlIGR3LmNiIChlX2VuZF9ibG9jay9lX2VuZF9yZXN5bmNfYmxvY2spIG9yIGZyb20KIAkgKiBfZHJiZF9jbGVhcl9kb25lX2VlLgogCSAqLwogCi0JZG9fd2FrZSA9IGxpc3RfZW1wdHkoYmxvY2tfaWQgPT0gSURfU1lOQ0VSID8gJm1kZXYtPnN5bmNfZWUgOiAmbWRldi0+YWN0aXZlX2VlKTsKKwlkb193YWtlID0gbGlzdF9lbXB0eShibG9ja19pZCA9PSBJRF9TWU5DRVIgPyAmZGV2aWNlLT5zeW5jX2VlIDogJmRldmljZS0+YWN0aXZlX2VlKTsKIAogCWlmICh0ZXN0X2JpdChfX0VFX1dBU19FUlJPUiwgJnBlZXJfcmVxLT5mbGFncykpCi0JCV9fZHJiZF9jaGtfaW9fZXJyb3IobWRldiwgRFJCRF9XUklURV9FUlJPUik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7CisJCV9fZHJiZF9jaGtfaW9fZXJyb3IoZGV2aWNlLCBEUkJEX1dSSVRFX0VSUk9SKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGJsb2NrX2lkID09IElEX1NZTkNFUikKLQkJZHJiZF9yc19jb21wbGV0ZV9pbyhtZGV2LCBpLnNlY3Rvcik7CisJCWRyYmRfcnNfY29tcGxldGVfaW8oZGV2aWNlLCBpLnNlY3Rvcik7CiAKIAlpZiAoZG9fd2FrZSkKLQkJd2FrZV91cCgmbWRldi0+ZWVfd2FpdCk7CisJCXdha2VfdXAoJmRldmljZS0+ZWVfd2FpdCk7CiAKIAlpZiAoZG9fYWxfY29tcGxldGVfaW8pCi0JCWRyYmRfYWxfY29tcGxldGVfaW8obWRldiwgJmkpOworCQlkcmJkX2FsX2NvbXBsZXRlX2lvKGRldmljZSwgJmkpOwogCi0Jd2FrZV9hc2VuZGVyKG1kZXYtPnRjb25uKTsKLQlwdXRfbGRldihtZGV2KTsKKwl3YWtlX2FzZW5kZXIocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24pOworCXB1dF9sZGV2KGRldmljZSk7CiB9CiAKIC8qIHdyaXRlcyBvbiBiZWhhbGYgb2YgdGhlIHBhcnRuZXIsIG9yIHJlc3luYyB3cml0ZXMsCkBAIC0xNzAsMTcgKzE3MywxNyBAQAogdm9pZCBkcmJkX3BlZXJfcmVxdWVzdF9lbmRpbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnJvcikKIHsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxID0gYmlvLT5iaV9wcml2YXRlOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSBwZWVyX3JlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlLT5kZXZpY2U7CiAJaW50IHVwdG9kYXRlID0gYmlvX2ZsYWdnZWQoYmlvLCBCSU9fVVBUT0RBVEUpOwogCWludCBpc193cml0ZSA9IGJpb19kYXRhX2RpcihiaW8pID09IFdSSVRFOwogCiAJaWYgKGVycm9yICYmIF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpCi0JCWRldl93YXJuKERFViwgIiVzOiBlcnJvcj0lZCBzPSVsbHVzXG4iLAorCQlkcmJkX3dhcm4oZGV2aWNlLCAiJXM6IGVycm9yPSVkIHM9JWxsdXNcbiIsCiAJCQkJaXNfd3JpdGUgPyAid3JpdGUiIDogInJlYWQiLCBlcnJvciwKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKXBlZXJfcmVxLT5pLnNlY3Rvcik7CiAJaWYgKCFlcnJvciAmJiAhdXB0b2RhdGUpIHsKIAkJaWYgKF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpCi0JCQlkZXZfd2FybihERVYsICIlczogc2V0dGluZyBlcnJvciB0byAtRUlPIHM9JWxsdXNcbiIsCisJCQlkcmJkX3dhcm4oZGV2aWNlLCAiJXM6IHNldHRpbmcgZXJyb3IgdG8gLUVJTyBzPSVsbHVzXG4iLAogCQkJCQlpc193cml0ZSA/ICJ3cml0ZSIgOiAicmVhZCIsCiAJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGVlcl9yZXEtPmkuc2VjdG9yKTsKIAkJLyogc3RyYW5nZSBiZWhhdmlvciBvZiBzb21lIGxvd2VyIGxldmVsIGRyaXZlcnMuLi4KQEAgLTIwNywxMyArMjEwLDEzIEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEgPSBiaW8tPmJpX3ByaXZhdGU7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJc3RydWN0IGJpb19hbmRfZXJyb3IgbTsKIAllbnVtIGRyYmRfcmVxX2V2ZW50IHdoYXQ7CiAJaW50IHVwdG9kYXRlID0gYmlvX2ZsYWdnZWQoYmlvLCBCSU9fVVBUT0RBVEUpOwogCiAJaWYgKCFlcnJvciAmJiAhdXB0b2RhdGUpIHsKLQkJZGV2X3dhcm4oREVWLCAicCAlczogc2V0dGluZyBlcnJvciB0byAtRUlPXG4iLAorCQlkcmJkX3dhcm4oZGV2aWNlLCAicCAlczogc2V0dGluZyBlcnJvciB0byAtRUlPXG4iLAogCQkJIGJpb19kYXRhX2RpcihiaW8pID09IFdSSVRFID8gIndyaXRlIiA6ICJyZWFkIik7CiAJCS8qIHN0cmFuZ2UgYmVoYXZpb3Igb2Ygc29tZSBsb3dlciBsZXZlbCBkcml2ZXJzLi4uCiAJCSAqIGZhaWwgdGhlIHJlcXVlc3QgYnkgY2xlYXJpbmcgdGhlIHVwdG9kYXRlIGZsYWcsCkBAIC0yNTIsNyArMjU1LDcgQEAKIAkgKi8KIAlpZiAodW5saWtlbHkocmVxLT5ycV9zdGF0ZSAmIFJRX0xPQ0FMX0FCT1JURUQpKSB7CiAJCWlmIChfX3JhdGVsaW1pdCgmZHJiZF9yYXRlbGltaXRfc3RhdGUpKQotCQkJZGV2X2VtZXJnKERFViwgImRlbGF5ZWQgY29tcGxldGlvbiBvZiBhYm9ydGVkIGxvY2FsIHJlcXVlc3Q7IGRpc2stdGltZW91dCBtYXkgYmUgdG9vIGFnZ3Jlc3NpdmVcbiIpOworCQkJZHJiZF9lbWVyZyhkZXZpY2UsICJkZWxheWVkIGNvbXBsZXRpb24gb2YgYWJvcnRlZCBsb2NhbCByZXF1ZXN0OyBkaXNrLXRpbWVvdXQgbWF5IGJlIHRvbyBhZ2dyZXNzaXZlXG4iKTsKIAogCQlpZiAoIWVycm9yKQogCQkJcGFuaWMoInBvc3NpYmxlIHJhbmRvbSBtZW1vcnkgY29ycnVwdGlvbiBjYXVzZWQgYnkgZGVsYXllZCBjb21wbGV0aW9uIG9mIGFib3J0ZWQgbG9jYWwgcmVxdWVzdFxuIik7CkBAIC0yNzIsMTcgKzI3NSwxNiBAQAogCXJlcS0+cHJpdmF0ZV9iaW8gPSBFUlJfUFRSKGVycm9yKTsKIAogCS8qIG5vdCByZXFfbW9kKCksIHdlIG5lZWQgaXJxc2F2ZSBoZXJlISAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKIAlfX3JlcV9tb2QocmVxLCB3aGF0LCAmbSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7Ci0JcHV0X2xkZXYobWRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKKwlwdXRfbGRldihkZXZpY2UpOwogCiAJaWYgKG0uYmlvKQotCQljb21wbGV0ZV9tYXN0ZXJfYmlvKG1kZXYsICZtKTsKKwkJY29tcGxldGVfbWFzdGVyX2JpbyhkZXZpY2UsICZtKTsKIH0KIAotdm9pZCBkcmJkX2NzdW1fZWUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGNyeXB0b19oYXNoICp0Zm0sCi0JCSAgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSwgdm9pZCAqZGlnZXN0KQordm9pZCBkcmJkX2NzdW1fZWUoc3RydWN0IGNyeXB0b19oYXNoICp0Zm0sIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEsIHZvaWQgKmRpZ2VzdCkKIHsKIAlzdHJ1Y3QgaGFzaF9kZXNjIGRlc2M7CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwpAQCAtMzA5LDcgKzMxMSw3IEBACiAJY3J5cHRvX2hhc2hfZmluYWwoJmRlc2MsIGRpZ2VzdCk7CiB9CiAKLXZvaWQgZHJiZF9jc3VtX2JpbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSwgc3RydWN0IGJpbyAqYmlvLCB2b2lkICpkaWdlc3QpCit2b2lkIGRyYmRfY3N1bV9iaW8oc3RydWN0IGNyeXB0b19oYXNoICp0Zm0sIHN0cnVjdCBiaW8gKmJpbywgdm9pZCAqZGlnZXN0KQogewogCXN0cnVjdCBoYXNoX2Rlc2MgZGVzYzsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CkBAIC0zMzMsNyArMzM1LDggQEAKIHN0YXRpYyBpbnQgd19lX3NlbmRfY3N1bShzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0LCB3KTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UgPSBwZWVyX3JlcS0+cGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCWludCBkaWdlc3Rfc2l6ZTsKIAl2b2lkICpkaWdlc3Q7CiAJaW50IGVyciA9IDA7CkBAIC0zNDQsODkgKzM0Nyw5MiBAQAogCWlmICh1bmxpa2VseSgocGVlcl9yZXEtPmZsYWdzICYgRUVfV0FTX0VSUk9SKSAhPSAwKSkKIAkJZ290byBvdXQ7CiAKLQlkaWdlc3Rfc2l6ZSA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUobWRldi0+dGNvbm4tPmNzdW1zX3RmbSk7CisJZGlnZXN0X3NpemUgPSBjcnlwdG9faGFzaF9kaWdlc3RzaXplKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5jc3Vtc190Zm0pOwogCWRpZ2VzdCA9IGttYWxsb2MoZGlnZXN0X3NpemUsIEdGUF9OT0lPKTsKIAlpZiAoZGlnZXN0KSB7CiAJCXNlY3Rvcl90IHNlY3RvciA9IHBlZXJfcmVxLT5pLnNlY3RvcjsKIAkJdW5zaWduZWQgaW50IHNpemUgPSBwZWVyX3JlcS0+aS5zaXplOwotCQlkcmJkX2NzdW1fZWUobWRldiwgbWRldi0+dGNvbm4tPmNzdW1zX3RmbSwgcGVlcl9yZXEsIGRpZ2VzdCk7CisJCWRyYmRfY3N1bV9lZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+Y3N1bXNfdGZtLCBwZWVyX3JlcSwgZGlnZXN0KTsKIAkJLyogRnJlZSBwZWVyX3JlcSBhbmQgcGFnZXMgYmVmb3JlIHNlbmQuCiAJCSAqIEluIGNhc2Ugd2UgYmxvY2sgb24gY29uZ2VzdGlvbiwgd2UgY291bGQgb3RoZXJ3aXNlIHJ1biBpbnRvCiAJCSAqIHNvbWUgZGlzdHJpYnV0ZWQgZGVhZGxvY2ssIGlmIHRoZSBvdGhlciBzaWRlIGJsb2NrcyBvbgogCQkgKiBjb25nZXN0aW9uIGFzIHdlbGwsIGJlY2F1c2Ugb3VyIHJlY2VpdmVyIGJsb2NrcyBpbgogCQkgKiBkcmJkX2FsbG9jX3BhZ2VzIGR1ZSB0byBwcF9pbl91c2UgPiBtYXhfYnVmZmVycy4gKi8KLQkJZHJiZF9mcmVlX3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKKwkJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOwogCQlwZWVyX3JlcSA9IE5VTEw7Ci0JCWluY19yc19wZW5kaW5nKG1kZXYpOwotCQllcnIgPSBkcmJkX3NlbmRfZHJlcXVlc3RfY3N1bShtZGV2LCBzZWN0b3IsIHNpemUsCisJCWluY19yc19wZW5kaW5nKGRldmljZSk7CisJCWVyciA9IGRyYmRfc2VuZF9kcmVxdWVzdF9jc3VtKHBlZXJfZGV2aWNlLCBzZWN0b3IsIHNpemUsCiAJCQkJCSAgICAgIGRpZ2VzdCwgZGlnZXN0X3NpemUsCiAJCQkJCSAgICAgIFBfQ1NVTV9SU19SRVFVRVNUKTsKIAkJa2ZyZWUoZGlnZXN0KTsKIAl9IGVsc2UgewotCQlkZXZfZXJyKERFViwgImttYWxsb2MoKSBvZiBkaWdlc3QgZmFpbGVkLlxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgImttYWxsb2MoKSBvZiBkaWdlc3QgZmFpbGVkLlxuIik7CiAJCWVyciA9IC1FTk9NRU07CiAJfQogCiBvdXQ6CiAJaWYgKHBlZXJfcmVxKQotCQlkcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOworCQlkcmJkX2ZyZWVfcGVlcl9yZXEoZGV2aWNlLCBwZWVyX3JlcSk7CiAKIAlpZiAodW5saWtlbHkoZXJyKSkKLQkJZGV2X2VycihERVYsICJkcmJkX3NlbmRfZHJlcXVlc3QoLi4uLCBjc3VtKSBmYWlsZWRcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJkcmJkX3NlbmRfZHJlcXVlc3QoLi4uLCBjc3VtKSBmYWlsZWRcbiIpOwogCXJldHVybiBlcnI7CiB9CiAKICNkZWZpbmUgR0ZQX1RSWQkoX19HRlBfSElHSE1FTSB8IF9fR0ZQX05PV0FSTikKIAotc3RhdGljIGludCByZWFkX2Zvcl9jc3VtKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUpCitzdGF0aWMgaW50IHJlYWRfZm9yX2NzdW0oc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplKQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxOwogCi0JaWYgKCFnZXRfbGRldihtZGV2KSkKKwlpZiAoIWdldF9sZGV2KGRldmljZSkpCiAJCXJldHVybiAtRUlPOwogCi0JaWYgKGRyYmRfcnNfc2hvdWxkX3Nsb3dfZG93bihtZGV2LCBzZWN0b3IpKQorCWlmIChkcmJkX3JzX3Nob3VsZF9zbG93X2Rvd24oZGV2aWNlLCBzZWN0b3IpKQogCQlnb3RvIGRlZmVyOwogCiAJLyogR0ZQX1RSWSwgYmVjYXVzZSBpZiB0aGVyZSBpcyBubyBtZW1vcnkgYXZhaWxhYmxlIHJpZ2h0IG5vdywgdGhpcyBtYXkKIAkgKiBiZSByZXNjaGVkdWxlZCBmb3IgbGF0ZXIuIEl0IGlzICJvbmx5IiBiYWNrZ3JvdW5kIHJlc3luYywgYWZ0ZXIgYWxsLiAqLwotCXBlZXJfcmVxID0gZHJiZF9hbGxvY19wZWVyX3JlcShtZGV2LCBJRF9TWU5DRVIgLyogdW51c2VkICovLCBzZWN0b3IsCisJcGVlcl9yZXEgPSBkcmJkX2FsbG9jX3BlZXJfcmVxKHBlZXJfZGV2aWNlLCBJRF9TWU5DRVIgLyogdW51c2VkICovLCBzZWN0b3IsCiAJCQkJICAgICAgIHNpemUsIEdGUF9UUlkpOwogCWlmICghcGVlcl9yZXEpCiAJCWdvdG8gZGVmZXI7CiAKIAlwZWVyX3JlcS0+dy5jYiA9IHdfZV9zZW5kX2NzdW07Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlsaXN0X2FkZCgmcGVlcl9yZXEtPncubGlzdCwgJm1kZXYtPnJlYWRfZWUpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJbGlzdF9hZGQoJnBlZXJfcmVxLT53Lmxpc3QsICZkZXZpY2UtPnJlYWRfZWUpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCi0JYXRvbWljX2FkZChzaXplID4+IDksICZtZGV2LT5yc19zZWN0X2V2KTsKLQlpZiAoZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KG1kZXYsIHBlZXJfcmVxLCBSRUFELCBEUkJEX0ZBVUxUX1JTX1JEKSA9PSAwKQorCWF0b21pY19hZGQoc2l6ZSA+PiA5LCAmZGV2aWNlLT5yc19zZWN0X2V2KTsKKwlpZiAoZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KGRldmljZSwgcGVlcl9yZXEsIFJFQUQsIERSQkRfRkFVTFRfUlNfUkQpID09IDApCiAJCXJldHVybiAwOwogCiAJLyogSWYgaXQgZmFpbGVkIGJlY2F1c2Ugb2YgRU5PTUVNLCByZXRyeSBzaG91bGQgaGVscC4gIElmIGl0IGZhaWxlZAogCSAqIGJlY2F1c2UgYmlvX2FkZF9wYWdlIGZhaWxlZCAocHJvYmFibHkgYnJva2VuIGxvd2VyIGxldmVsIGRyaXZlciksCiAJICogcmV0cnkgbWF5IG9yIG1heSBub3QgaGVscC4KIAkgKiBJZiBpdCBkb2VzIG5vdCwgeW91IG1heSBuZWVkIHRvIGZvcmNlIGRpc2Nvbm5lY3QuICovCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJbGlzdF9kZWwoJnBlZXJfcmVxLT53Lmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAotCWRyYmRfZnJlZV9wZWVyX3JlcShtZGV2LCBwZWVyX3JlcSk7CisJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOwogZGVmZXI6Ci0JcHV0X2xkZXYobWRldik7CisJcHV0X2xkZXYoZGV2aWNlKTsKIAlyZXR1cm4gLUVBR0FJTjsKIH0KIAogaW50IHdfcmVzeW5jX3RpbWVyKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7Ci0Jc3dpdGNoIChtZGV2LT5zdGF0ZS5jb25uKSB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPQorCQljb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfZGV2aWNlLCByZXN5bmNfd29yayk7CisKKwlzd2l0Y2ggKGRldmljZS0+c3RhdGUuY29ubikgewogCWNhc2UgQ19WRVJJRllfUzoKLQkJd19tYWtlX292X3JlcXVlc3QodywgY2FuY2VsKTsKKwkJbWFrZV9vdl9yZXF1ZXN0KGRldmljZSwgY2FuY2VsKTsKIAkJYnJlYWs7CiAJY2FzZSBDX1NZTkNfVEFSR0VUOgotCQl3X21ha2VfcmVzeW5jX3JlcXVlc3QodywgY2FuY2VsKTsKKwkJbWFrZV9yZXN5bmNfcmVxdWVzdChkZXZpY2UsIGNhbmNlbCk7CiAJCWJyZWFrOwogCX0KIApAQCAtNDM1LDEwICs0NDEsMTEgQEAKIAogdm9pZCByZXN5bmNfdGltZXJfZm4odW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSAoc3RydWN0IGRyYmRfY29uZiAqKSBkYXRhOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gKHN0cnVjdCBkcmJkX2RldmljZSAqKSBkYXRhOwogCi0JaWYgKGxpc3RfZW1wdHkoJm1kZXYtPnJlc3luY193b3JrLmxpc3QpKQotCQlkcmJkX3F1ZXVlX3dvcmsoJm1kZXYtPnRjb25uLT5zZW5kZXJfd29yaywgJm1kZXYtPnJlc3luY193b3JrKTsKKwlpZiAobGlzdF9lbXB0eSgmZGV2aWNlLT5yZXN5bmNfd29yay5saXN0KSkKKwkJZHJiZF9xdWV1ZV93b3JrKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yaywKKwkJCQkmZGV2aWNlLT5yZXN5bmNfd29yayk7CiB9CiAKIHN0YXRpYyB2b2lkIGZpZm9fc2V0KHN0cnVjdCBmaWZvX2J1ZmZlciAqZmIsIGludCB2YWx1ZSkKQEAgLTQ4NSw3ICs0OTIsNyBAQAogCXJldHVybiBmYjsKIH0KIAotc3RhdGljIGludCBkcmJkX3JzX2NvbnRyb2xsZXIoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbnQgZHJiZF9yc19jb250cm9sbGVyKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBkaXNrX2NvbmYgKmRjOwogCXVuc2lnbmVkIGludCBzZWN0X2luOyAgLyogTnVtYmVyIG9mIHNlY3RvcnMgdGhhdCBjYW1lIGluIHNpbmNlIHRoZSBsYXN0IHR1cm4gKi8KQEAgLTQ5OCwyMiArNTA1LDIyIEBACiAJaW50IG1heF9zZWN0OwogCXN0cnVjdCBmaWZvX2J1ZmZlciAqcGxhbjsKIAotCXNlY3RfaW4gPSBhdG9taWNfeGNoZygmbWRldi0+cnNfc2VjdF9pbiwgMCk7IC8qIE51bWJlciBvZiBzZWN0b3JzIHRoYXQgY2FtZSBpbiAqLwotCW1kZXYtPnJzX2luX2ZsaWdodCAtPSBzZWN0X2luOworCXNlY3RfaW4gPSBhdG9taWNfeGNoZygmZGV2aWNlLT5yc19zZWN0X2luLCAwKTsgLyogTnVtYmVyIG9mIHNlY3RvcnMgdGhhdCBjYW1lIGluICovCisJZGV2aWNlLT5yc19pbl9mbGlnaHQgLT0gc2VjdF9pbjsKIAotCWRjID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZik7Ci0JcGxhbiA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5yc19wbGFuX3MpOworCWRjID0gcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+bGRldi0+ZGlza19jb25mKTsKKwlwbGFuID0gcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+cnNfcGxhbl9zKTsKIAogCXN0ZXBzID0gcGxhbi0+c2l6ZTsgLyogKGRjLT5jX3BsYW5fYWhlYWQgKiAxMCAqIFNMRUVQX1RJTUUpIC8gSFo7ICovCiAKLQlpZiAobWRldi0+cnNfaW5fZmxpZ2h0ICsgc2VjdF9pbiA9PSAwKSB7IC8qIEF0IHN0YXJ0IG9mIHJlc3luYyAqLworCWlmIChkZXZpY2UtPnJzX2luX2ZsaWdodCArIHNlY3RfaW4gPT0gMCkgeyAvKiBBdCBzdGFydCBvZiByZXN5bmMgKi8KIAkJd2FudCA9ICgoZGMtPnJlc3luY19yYXRlICogMiAqIFNMRUVQX1RJTUUpIC8gSFopICogc3RlcHM7CiAJfSBlbHNlIHsgLyogbm9ybWFsIHBhdGggKi8KIAkJd2FudCA9IGRjLT5jX2ZpbGxfdGFyZ2V0ID8gZGMtPmNfZmlsbF90YXJnZXQgOgogCQkJc2VjdF9pbiAqIGRjLT5jX2RlbGF5X3RhcmdldCAqIEhaIC8gKFNMRUVQX1RJTUUgKiAxMCk7CiAJfQogCi0JY29ycmVjdGlvbiA9IHdhbnQgLSBtZGV2LT5yc19pbl9mbGlnaHQgLSBwbGFuLT50b3RhbDsKKwljb3JyZWN0aW9uID0gd2FudCAtIGRldmljZS0+cnNfaW5fZmxpZ2h0IC0gcGxhbi0+dG90YWw7CiAKIAkvKiBQbGFuIGFoZWFkICovCiAJY3BzID0gY29ycmVjdGlvbiAvIHN0ZXBzOwpAQCAtNTMzLDI1ICs1NDAsMjUgQEAKIAkJcmVxX3NlY3QgPSBtYXhfc2VjdDsKIAogCS8qCi0JZGV2X3dhcm4oREVWLCAic2k9JXUgaWY9JWQgd2E9JXUgY289JWQgc3Q9JWQgY3BzPSVkIHBsPSVkIGNjPSVkIHJzPSVkXG4iLAotCQkgc2VjdF9pbiwgbWRldi0+cnNfaW5fZmxpZ2h0LCB3YW50LCBjb3JyZWN0aW9uLAotCQkgc3RlcHMsIGNwcywgbWRldi0+cnNfcGxhbmVkLCBjdXJyX2NvcnIsIHJlcV9zZWN0KTsKKwlkcmJkX3dhcm4oZGV2aWNlLCAic2k9JXUgaWY9JWQgd2E9JXUgY289JWQgc3Q9JWQgY3BzPSVkIHBsPSVkIGNjPSVkIHJzPSVkXG4iLAorCQkgc2VjdF9pbiwgZGV2aWNlLT5yc19pbl9mbGlnaHQsIHdhbnQsIGNvcnJlY3Rpb24sCisJCSBzdGVwcywgY3BzLCBkZXZpY2UtPnJzX3BsYW5lZCwgY3Vycl9jb3JyLCByZXFfc2VjdCk7CiAJKi8KIAogCXJldHVybiByZXFfc2VjdDsKIH0KIAotc3RhdGljIGludCBkcmJkX3JzX251bWJlcl9yZXF1ZXN0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGludCBkcmJkX3JzX251bWJlcl9yZXF1ZXN0cyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgbnVtYmVyOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlmIChyY3VfZGVyZWZlcmVuY2UobWRldi0+cnNfcGxhbl9zKS0+c2l6ZSkgewotCQludW1iZXIgPSBkcmJkX3JzX2NvbnRyb2xsZXIobWRldikgPj4gKEJNX0JMT0NLX1NISUZUIC0gOSk7Ci0JCW1kZXYtPmNfc3luY19yYXRlID0gbnVtYmVyICogSFogKiAoQk1fQkxPQ0tfU0laRSAvIDEwMjQpIC8gU0xFRVBfVElNRTsKKwlpZiAocmN1X2RlcmVmZXJlbmNlKGRldmljZS0+cnNfcGxhbl9zKS0+c2l6ZSkgeworCQludW1iZXIgPSBkcmJkX3JzX2NvbnRyb2xsZXIoZGV2aWNlKSA+PiAoQk1fQkxPQ0tfU0hJRlQgLSA5KTsKKwkJZGV2aWNlLT5jX3N5bmNfcmF0ZSA9IG51bWJlciAqIEhaICogKEJNX0JMT0NLX1NJWkUgLyAxMDI0KSAvIFNMRUVQX1RJTUU7CiAJfSBlbHNlIHsKLQkJbWRldi0+Y19zeW5jX3JhdGUgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKS0+cmVzeW5jX3JhdGU7Ci0JCW51bWJlciA9IFNMRUVQX1RJTUUgKiBtZGV2LT5jX3N5bmNfcmF0ZSAgLyAoKEJNX0JMT0NLX1NJWkUgLyAxMDI0KSAqIEhaKTsKKwkJZGV2aWNlLT5jX3N5bmNfcmF0ZSA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPnJlc3luY19yYXRlOworCQludW1iZXIgPSBTTEVFUF9USU1FICogZGV2aWNlLT5jX3N5bmNfcmF0ZSAgLyAoKEJNX0JMT0NLX1NJWkUgLyAxMDI0KSAqIEhaKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKQEAgLTU2MCwxMiArNTY3LDExIEBACiAJcmV0dXJuIG51bWJlcjsKIH0KIAotaW50IHdfbWFrZV9yZXN5bmNfcmVxdWVzdChzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQorc3RhdGljIGludCBtYWtlX3Jlc3luY19yZXF1ZXN0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgY2FuY2VsKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OwogCXVuc2lnbmVkIGxvbmcgYml0OwogCXNlY3Rvcl90IHNlY3RvcjsKLQljb25zdCBzZWN0b3JfdCBjYXBhY2l0eSA9IGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldik7CisJY29uc3Qgc2VjdG9yX3QgY2FwYWNpdHkgPSBkcmJkX2dldF9jYXBhY2l0eShkZXZpY2UtPnRoaXNfYmRldik7CiAJaW50IG1heF9iaW9fc2l6ZTsKIAlpbnQgbnVtYmVyLCByb2xsYmFja19pLCBzaXplOwogCWludCBhbGlnbiwgcXVldWVkLCBzbmRidWY7CkBAIC01NzQsNjEgKzU4MCw2MSBAQAogCWlmICh1bmxpa2VseShjYW5jZWwpKQogCQlyZXR1cm4gMDsKIAotCWlmIChtZGV2LT5yc190b3RhbCA9PSAwKSB7CisJaWYgKGRldmljZS0+cnNfdG90YWwgPT0gMCkgewogCQkvKiBlbXB0eSByZXN5bmM/ICovCi0JCWRyYmRfcmVzeW5jX2ZpbmlzaGVkKG1kZXYpOworCQlkcmJkX3Jlc3luY19maW5pc2hlZChkZXZpY2UpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIWdldF9sZGV2KG1kZXYpKSB7Ci0JCS8qIFNpbmNlIHdlIG9ubHkgbmVlZCB0byBhY2Nlc3MgbWRldi0+cnN5bmMgYQotCQkgICBnZXRfbGRldl9pZl9zdGF0ZShtZGV2LERfRkFJTEVEKSB3b3VsZCBiZSBzdWZmaWNpZW50LCBidXQKKwlpZiAoIWdldF9sZGV2KGRldmljZSkpIHsKKwkJLyogU2luY2Ugd2Ugb25seSBuZWVkIHRvIGFjY2VzcyBkZXZpY2UtPnJzeW5jIGEKKwkJICAgZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLERfRkFJTEVEKSB3b3VsZCBiZSBzdWZmaWNpZW50LCBidXQKIAkJICAgdG8gY29udGludWUgcmVzeW5jIHdpdGggYSBicm9rZW4gZGlzayBtYWtlcyBubyBzZW5zZSBhdAogCQkgICBhbGwgKi8KLQkJZGV2X2VycihERVYsICJEaXNrIGJyb2tlIGRvd24gZHVyaW5nIHJlc3luYyFcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJEaXNrIGJyb2tlIGRvd24gZHVyaW5nIHJlc3luYyFcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQltYXhfYmlvX3NpemUgPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhtZGV2LT5ycV9xdWV1ZSkgPDwgOTsKLQludW1iZXIgPSBkcmJkX3JzX251bWJlcl9yZXF1ZXN0cyhtZGV2KTsKKwltYXhfYmlvX3NpemUgPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhkZXZpY2UtPnJxX3F1ZXVlKSA8PCA5OworCW51bWJlciA9IGRyYmRfcnNfbnVtYmVyX3JlcXVlc3RzKGRldmljZSk7CiAJaWYgKG51bWJlciA9PSAwKQogCQlnb3RvIHJlcXVldWU7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKIAkJLyogU3RvcCBnZW5lcmF0aW5nIFJTIHJlcXVlc3RzLCB3aGVuIGhhbGYgb2YgdGhlIHNlbmQgYnVmZmVyIGlzIGZpbGxlZCAqLwotCQltdXRleF9sb2NrKCZtZGV2LT50Y29ubi0+ZGF0YS5tdXRleCk7Ci0JCWlmIChtZGV2LT50Y29ubi0+ZGF0YS5zb2NrZXQpIHsKLQkJCXF1ZXVlZCA9IG1kZXYtPnRjb25uLT5kYXRhLnNvY2tldC0+c2stPnNrX3dtZW1fcXVldWVkOwotCQkJc25kYnVmID0gbWRldi0+dGNvbm4tPmRhdGEuc29ja2V0LT5zay0+c2tfc25kYnVmOworCQltdXRleF9sb2NrKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5kYXRhLm11dGV4KTsKKwkJaWYgKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmRhdGEuc29ja2V0KSB7CisJCQlxdWV1ZWQgPSBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5kYXRhLnNvY2tldC0+c2stPnNrX3dtZW1fcXVldWVkOworCQkJc25kYnVmID0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+ZGF0YS5zb2NrZXQtPnNrLT5za19zbmRidWY7CiAJCX0gZWxzZSB7CiAJCQlxdWV1ZWQgPSAxOwogCQkJc25kYnVmID0gMDsKIAkJfQotCQltdXRleF91bmxvY2soJm1kZXYtPnRjb25uLT5kYXRhLm11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5kYXRhLm11dGV4KTsKIAkJaWYgKHF1ZXVlZCA+IHNuZGJ1ZiAvIDIpCiAJCQlnb3RvIHJlcXVldWU7CiAKIG5leHRfc2VjdG9yOgogCQlzaXplID0gQk1fQkxPQ0tfU0laRTsKLQkJYml0ICA9IGRyYmRfYm1fZmluZF9uZXh0KG1kZXYsIG1kZXYtPmJtX3Jlc3luY19mbyk7CisJCWJpdCAgPSBkcmJkX2JtX2ZpbmRfbmV4dChkZXZpY2UsIGRldmljZS0+Ym1fcmVzeW5jX2ZvKTsKIAogCQlpZiAoYml0ID09IERSQkRfRU5EX09GX0JJVE1BUCkgewotCQkJbWRldi0+Ym1fcmVzeW5jX2ZvID0gZHJiZF9ibV9iaXRzKG1kZXYpOwotCQkJcHV0X2xkZXYobWRldik7CisJCQlkZXZpY2UtPmJtX3Jlc3luY19mbyA9IGRyYmRfYm1fYml0cyhkZXZpY2UpOworCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJCXJldHVybiAwOwogCQl9CiAKIAkJc2VjdG9yID0gQk1fQklUX1RPX1NFQ1QoYml0KTsKIAotCQlpZiAoZHJiZF9yc19zaG91bGRfc2xvd19kb3duKG1kZXYsIHNlY3RvcikgfHwKLQkJICAgIGRyYmRfdHJ5X3JzX2JlZ2luX2lvKG1kZXYsIHNlY3RvcikpIHsKLQkJCW1kZXYtPmJtX3Jlc3luY19mbyA9IGJpdDsKKwkJaWYgKGRyYmRfcnNfc2hvdWxkX3Nsb3dfZG93bihkZXZpY2UsIHNlY3RvcikgfHwKKwkJICAgIGRyYmRfdHJ5X3JzX2JlZ2luX2lvKGRldmljZSwgc2VjdG9yKSkgeworCQkJZGV2aWNlLT5ibV9yZXN5bmNfZm8gPSBiaXQ7CiAJCQlnb3RvIHJlcXVldWU7CiAJCX0KLQkJbWRldi0+Ym1fcmVzeW5jX2ZvID0gYml0ICsgMTsKKwkJZGV2aWNlLT5ibV9yZXN5bmNfZm8gPSBiaXQgKyAxOwogCi0JCWlmICh1bmxpa2VseShkcmJkX2JtX3Rlc3RfYml0KG1kZXYsIGJpdCkgPT0gMCkpIHsKLQkJCWRyYmRfcnNfY29tcGxldGVfaW8obWRldiwgc2VjdG9yKTsKKwkJaWYgKHVubGlrZWx5KGRyYmRfYm1fdGVzdF9iaXQoZGV2aWNlLCBiaXQpID09IDApKSB7CisJCQlkcmJkX3JzX2NvbXBsZXRlX2lvKGRldmljZSwgc2VjdG9yKTsKIAkJCWdvdG8gbmV4dF9zZWN0b3I7CiAJCX0KIApAQCAtNjU3LDcgKzY2Myw3IEBACiAJCQkgKiBvYnNjdXJlIHJlYXNvbjsgKCBiID09IDAgKSB3b3VsZCBnZXQgdGhlIG91dC1vZi1iYW5kCiAJCQkgKiBvbmx5IGFjY2lkZW50YWxseSByaWdodCBiZWNhdXNlIG9mIHRoZSAib2RkbHkgc2l6ZWQiCiAJCQkgKiBhZGp1c3RtZW50IGJlbG93ICovCi0JCQlpZiAoZHJiZF9ibV90ZXN0X2JpdChtZGV2LCBiaXQrMSkgIT0gMSkKKwkJCWlmIChkcmJkX2JtX3Rlc3RfYml0KGRldmljZSwgYml0KzEpICE9IDEpCiAJCQkJYnJlYWs7CiAJCQliaXQrKzsKIAkJCXNpemUgKz0gQk1fQkxPQ0tfU0laRTsKQEAgLTY2OCwyMCArNjc0LDIxIEBACiAJCS8qIGlmIHdlIG1lcmdlZCBzb21lLAogCQkgKiByZXNldCB0aGUgb2Zmc2V0IHRvIHN0YXJ0IHRoZSBuZXh0IGRyYmRfYm1fZmluZF9uZXh0IGZyb20gKi8KIAkJaWYgKHNpemUgPiBCTV9CTE9DS19TSVpFKQotCQkJbWRldi0+Ym1fcmVzeW5jX2ZvID0gYml0ICsgMTsKKwkJCWRldmljZS0+Ym1fcmVzeW5jX2ZvID0gYml0ICsgMTsKICNlbmRpZgogCiAJCS8qIGFkanVzdCB2ZXJ5IGxhc3Qgc2VjdG9ycywgaW4gY2FzZSB3ZSBhcmUgb2RkbHkgc2l6ZWQgKi8KIAkJaWYgKHNlY3RvciArIChzaXplPj45KSA+IGNhcGFjaXR5KQogCQkJc2l6ZSA9IChjYXBhY2l0eS1zZWN0b3IpPDw5OwotCQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA4OSAmJiBtZGV2LT50Y29ubi0+Y3N1bXNfdGZtKSB7Ci0JCQlzd2l0Y2ggKHJlYWRfZm9yX2NzdW0obWRldiwgc2VjdG9yLCBzaXplKSkgeworCQlpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDg5ICYmCisJCSAgICBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5jc3Vtc190Zm0pIHsKKwkJCXN3aXRjaCAocmVhZF9mb3JfY3N1bShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBzZWN0b3IsIHNpemUpKSB7CiAJCQljYXNlIC1FSU86IC8qIERpc2sgZmFpbHVyZSAqLwotCQkJCXB1dF9sZGV2KG1kZXYpOworCQkJCXB1dF9sZGV2KGRldmljZSk7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQljYXNlIC1FQUdBSU46IC8qIGFsbG9jYXRpb24gZmFpbGVkLCBvciBsZGV2IGJ1c3kgKi8KLQkJCQlkcmJkX3JzX2NvbXBsZXRlX2lvKG1kZXYsIHNlY3Rvcik7Ci0JCQkJbWRldi0+Ym1fcmVzeW5jX2ZvID0gQk1fU0VDVF9UT19CSVQoc2VjdG9yKTsKKwkJCQlkcmJkX3JzX2NvbXBsZXRlX2lvKGRldmljZSwgc2VjdG9yKTsKKwkJCQlkZXZpY2UtPmJtX3Jlc3luY19mbyA9IEJNX1NFQ1RfVE9fQklUKHNlY3Rvcik7CiAJCQkJaSA9IHJvbGxiYWNrX2k7CiAJCQkJZ290byByZXF1ZXVlOwogCQkJY2FzZSAwOgpAQCAtNjkzLDUwICs3MDAsNDkgQEAKIAkJfSBlbHNlIHsKIAkJCWludCBlcnI7CiAKLQkJCWluY19yc19wZW5kaW5nKG1kZXYpOwotCQkJZXJyID0gZHJiZF9zZW5kX2RyZXF1ZXN0KG1kZXYsIFBfUlNfREFUQV9SRVFVRVNULAorCQkJaW5jX3JzX3BlbmRpbmcoZGV2aWNlKTsKKwkJCWVyciA9IGRyYmRfc2VuZF9kcmVxdWVzdChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBQX1JTX0RBVEFfUkVRVUVTVCwKIAkJCQkJCSBzZWN0b3IsIHNpemUsIElEX1NZTkNFUik7CiAJCQlpZiAoZXJyKSB7Ci0JCQkJZGV2X2VycihERVYsICJkcmJkX3NlbmRfZHJlcXVlc3QoKSBmYWlsZWQsIGFib3J0aW5nLi4uXG4iKTsKLQkJCQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKLQkJCQlwdXRfbGRldihtZGV2KTsKKwkJCQlkcmJkX2VycihkZXZpY2UsICJkcmJkX3NlbmRfZHJlcXVlc3QoKSBmYWlsZWQsIGFib3J0aW5nLi4uXG4iKTsKKwkJCQlkZWNfcnNfcGVuZGluZyhkZXZpY2UpOworCQkJCXB1dF9sZGV2KGRldmljZSk7CiAJCQkJcmV0dXJuIGVycjsKIAkJCX0KIAkJfQogCX0KIAotCWlmIChtZGV2LT5ibV9yZXN5bmNfZm8gPj0gZHJiZF9ibV9iaXRzKG1kZXYpKSB7CisJaWYgKGRldmljZS0+Ym1fcmVzeW5jX2ZvID49IGRyYmRfYm1fYml0cyhkZXZpY2UpKSB7CiAJCS8qIGxhc3Qgc3luY2VyIF9yZXF1ZXN0XyB3YXMgc2VudCwKIAkJICogYnV0IHRoZSBQX1JTX0RBVEFfUkVQTFkgbm90IHlldCByZWNlaXZlZC4gIHN5bmMgd2lsbCBlbmQgKGFuZAogCQkgKiBuZXh0IHN5bmMgZ3JvdXAgd2lsbCByZXN1bWUpLCBhcyBzb29uIGFzIHdlIHJlY2VpdmUgdGhlIGxhc3QKIAkJICogcmVzeW5jIGRhdGEgYmxvY2ssIGFuZCB0aGUgbGFzdCBiaXQgaXMgY2xlYXJlZC4KIAkJICogdW50aWwgdGhlbiByZXN5bmMgIndvcmsiIGlzICJpbmFjdGl2ZSIgLi4uCiAJCSAqLwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAgcmVxdWV1ZToKLQltZGV2LT5yc19pbl9mbGlnaHQgKz0gKGkgPDwgKEJNX0JMT0NLX1NISUZUIC0gOSkpOwotCW1vZF90aW1lcigmbWRldi0+cmVzeW5jX3RpbWVyLCBqaWZmaWVzICsgU0xFRVBfVElNRSk7Ci0JcHV0X2xkZXYobWRldik7CisJZGV2aWNlLT5yc19pbl9mbGlnaHQgKz0gKGkgPDwgKEJNX0JMT0NLX1NISUZUIC0gOSkpOworCW1vZF90aW1lcigmZGV2aWNlLT5yZXN5bmNfdGltZXIsIGppZmZpZXMgKyBTTEVFUF9USU1FKTsKKwlwdXRfbGRldihkZXZpY2UpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdfbWFrZV9vdl9yZXF1ZXN0KHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCitzdGF0aWMgaW50IG1ha2Vfb3ZfcmVxdWVzdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IGNhbmNlbCkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKIAlpbnQgbnVtYmVyLCBpLCBzaXplOwogCXNlY3Rvcl90IHNlY3RvcjsKLQljb25zdCBzZWN0b3JfdCBjYXBhY2l0eSA9IGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldik7CisJY29uc3Qgc2VjdG9yX3QgY2FwYWNpdHkgPSBkcmJkX2dldF9jYXBhY2l0eShkZXZpY2UtPnRoaXNfYmRldik7CiAJYm9vbCBzdG9wX3NlY3Rvcl9yZWFjaGVkID0gZmFsc2U7CiAKIAlpZiAodW5saWtlbHkoY2FuY2VsKSkKIAkJcmV0dXJuIDE7CiAKLQludW1iZXIgPSBkcmJkX3JzX251bWJlcl9yZXF1ZXN0cyhtZGV2KTsKKwludW1iZXIgPSBkcmJkX3JzX251bWJlcl9yZXF1ZXN0cyhkZXZpY2UpOwogCi0Jc2VjdG9yID0gbWRldi0+b3ZfcG9zaXRpb247CisJc2VjdG9yID0gZGV2aWNlLT5vdl9wb3NpdGlvbjsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKIAkJaWYgKHNlY3RvciA+PSBjYXBhY2l0eSkKIAkJCXJldHVybiAxOwpAQCAtNzQ1LDExNiArNzUxLDEyMSBAQAogCQkgKiB3X2VfZW5kX292X3JlcGx5KCkuCiAJCSAqIFdlIG5lZWQgdG8gc2VuZCBhdCBsZWFzdCBvbmUgcmVxdWVzdCBvdXQuICovCiAJCXN0b3Bfc2VjdG9yX3JlYWNoZWQgPSBpID4gMAotCQkJJiYgdmVyaWZ5X2Nhbl9kb19zdG9wX3NlY3RvcihtZGV2KQotCQkJJiYgc2VjdG9yID49IG1kZXYtPm92X3N0b3Bfc2VjdG9yOworCQkJJiYgdmVyaWZ5X2Nhbl9kb19zdG9wX3NlY3RvcihkZXZpY2UpCisJCQkmJiBzZWN0b3IgPj0gZGV2aWNlLT5vdl9zdG9wX3NlY3RvcjsKIAkJaWYgKHN0b3Bfc2VjdG9yX3JlYWNoZWQpCiAJCQlicmVhazsKIAogCQlzaXplID0gQk1fQkxPQ0tfU0laRTsKIAotCQlpZiAoZHJiZF9yc19zaG91bGRfc2xvd19kb3duKG1kZXYsIHNlY3RvcikgfHwKLQkJICAgIGRyYmRfdHJ5X3JzX2JlZ2luX2lvKG1kZXYsIHNlY3RvcikpIHsKLQkJCW1kZXYtPm92X3Bvc2l0aW9uID0gc2VjdG9yOworCQlpZiAoZHJiZF9yc19zaG91bGRfc2xvd19kb3duKGRldmljZSwgc2VjdG9yKSB8fAorCQkgICAgZHJiZF90cnlfcnNfYmVnaW5faW8oZGV2aWNlLCBzZWN0b3IpKSB7CisJCQlkZXZpY2UtPm92X3Bvc2l0aW9uID0gc2VjdG9yOwogCQkJZ290byByZXF1ZXVlOwogCQl9CiAKIAkJaWYgKHNlY3RvciArIChzaXplPj45KSA+IGNhcGFjaXR5KQogCQkJc2l6ZSA9IChjYXBhY2l0eS1zZWN0b3IpPDw5OwogCi0JCWluY19yc19wZW5kaW5nKG1kZXYpOwotCQlpZiAoZHJiZF9zZW5kX292X3JlcXVlc3QobWRldiwgc2VjdG9yLCBzaXplKSkgewotCQkJZGVjX3JzX3BlbmRpbmcobWRldik7CisJCWluY19yc19wZW5kaW5nKGRldmljZSk7CisJCWlmIChkcmJkX3NlbmRfb3ZfcmVxdWVzdChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBzZWN0b3IsIHNpemUpKSB7CisJCQlkZWNfcnNfcGVuZGluZyhkZXZpY2UpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJc2VjdG9yICs9IEJNX1NFQ1RfUEVSX0JJVDsKIAl9Ci0JbWRldi0+b3ZfcG9zaXRpb24gPSBzZWN0b3I7CisJZGV2aWNlLT5vdl9wb3NpdGlvbiA9IHNlY3RvcjsKIAogIHJlcXVldWU6Ci0JbWRldi0+cnNfaW5fZmxpZ2h0ICs9IChpIDw8IChCTV9CTE9DS19TSElGVCAtIDkpKTsKKwlkZXZpY2UtPnJzX2luX2ZsaWdodCArPSAoaSA8PCAoQk1fQkxPQ0tfU0hJRlQgLSA5KSk7CiAJaWYgKGkgPT0gMCB8fCAhc3RvcF9zZWN0b3JfcmVhY2hlZCkKLQkJbW9kX3RpbWVyKCZtZGV2LT5yZXN5bmNfdGltZXIsIGppZmZpZXMgKyBTTEVFUF9USU1FKTsKKwkJbW9kX3RpbWVyKCZkZXZpY2UtPnJlc3luY190aW1lciwgamlmZmllcyArIFNMRUVQX1RJTUUpOwogCXJldHVybiAxOwogfQogCiBpbnQgd19vdl9maW5pc2hlZChzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OwotCWtmcmVlKHcpOwotCW92X291dF9vZl9zeW5jX3ByaW50KG1kZXYpOwotCWRyYmRfcmVzeW5jX2ZpbmlzaGVkKG1kZXYpOworCXN0cnVjdCBkcmJkX2RldmljZV93b3JrICpkdyA9CisJCWNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9kZXZpY2Vfd29yaywgdyk7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBkdy0+ZGV2aWNlOworCWtmcmVlKGR3KTsKKwlvdl9vdXRfb2Zfc3luY19wcmludChkZXZpY2UpOworCWRyYmRfcmVzeW5jX2ZpbmlzaGVkKGRldmljZSk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB3X3Jlc3luY19maW5pc2hlZChzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OwotCWtmcmVlKHcpOworCXN0cnVjdCBkcmJkX2RldmljZV93b3JrICpkdyA9CisJCWNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9kZXZpY2Vfd29yaywgdyk7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBkdy0+ZGV2aWNlOworCWtmcmVlKGR3KTsKIAotCWRyYmRfcmVzeW5jX2ZpbmlzaGVkKG1kZXYpOworCWRyYmRfcmVzeW5jX2ZpbmlzaGVkKGRldmljZSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcGluZ19wZWVyKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgdm9pZCBwaW5nX3BlZXIoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uID0gbWRldi0+dGNvbm47CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb247CiAKLQljbGVhcl9iaXQoR09UX1BJTkdfQUNLLCAmdGNvbm4tPmZsYWdzKTsKLQlyZXF1ZXN0X3BpbmcodGNvbm4pOwotCXdhaXRfZXZlbnQodGNvbm4tPnBpbmdfd2FpdCwKLQkJICAgdGVzdF9iaXQoR09UX1BJTkdfQUNLLCAmdGNvbm4tPmZsYWdzKSB8fCBtZGV2LT5zdGF0ZS5jb25uIDwgQ19DT05ORUNURUQpOworCWNsZWFyX2JpdChHT1RfUElOR19BQ0ssICZjb25uZWN0aW9uLT5mbGFncyk7CisJcmVxdWVzdF9waW5nKGNvbm5lY3Rpb24pOworCXdhaXRfZXZlbnQoY29ubmVjdGlvbi0+cGluZ193YWl0LAorCQkgICB0ZXN0X2JpdChHT1RfUElOR19BQ0ssICZjb25uZWN0aW9uLT5mbGFncykgfHwgZGV2aWNlLT5zdGF0ZS5jb25uIDwgQ19DT05ORUNURUQpOwogfQogCi1pbnQgZHJiZF9yZXN5bmNfZmluaXNoZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK2ludCBkcmJkX3Jlc3luY19maW5pc2hlZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAl1bnNpZ25lZCBsb25nIGRiLCBkdCwgZGJkdDsKIAl1bnNpZ25lZCBsb25nIG5fb29zOwogCXVuaW9uIGRyYmRfc3RhdGUgb3MsIG5zOwotCXN0cnVjdCBkcmJkX3dvcmsgKnc7CisJc3RydWN0IGRyYmRfZGV2aWNlX3dvcmsgKmR3OwogCWNoYXIgKmtoZWxwZXJfY21kID0gTlVMTDsKIAlpbnQgdmVyaWZ5X2RvbmUgPSAwOwogCiAJLyogUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoZSByZXN5bmMgTFJVLiBTaW5jZSBmdXR1cmUgYWN0aW9ucwogCSAqIG1pZ2h0IHNldCBiaXRzIGluIHRoZSAobWFpbikgYml0bWFwLCB0aGVuIHRoZSBlbnRyaWVzIGluIHRoZQogCSAqIHJlc3luYyBMUlUgd291bGQgYmUgd3JvbmcuICovCi0JaWYgKGRyYmRfcnNfZGVsX2FsbChtZGV2KSkgeworCWlmIChkcmJkX3JzX2RlbF9hbGwoZGV2aWNlKSkgewogCQkvKiBJbiBjYXNlIHRoaXMgaXMgbm90IHBvc3NpYmxlIG5vdywgbW9zdCBwcm9iYWJseSBiZWNhdXNlCiAJCSAqIHRoZXJlIGFyZSBQX1JTX0RBVEFfUkVQTFkgUGFja2V0cyBsaW5nZXJpbmcgb24gdGhlIHdvcmtlcidzCiAJCSAqIHF1ZXVlIChvciBldmVuIHRoZSByZWFkIG9wZXJhdGlvbnMgZm9yIHRob3NlIHBhY2tldHMKIAkJICogaXMgbm90IGZpbmlzaGVkIGJ5IG5vdykuICAgUmV0cnkgaW4gMTAwbXMuICovCiAKIAkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKEhaIC8gMTApOwotCQl3ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfd29yayksIEdGUF9BVE9NSUMpOwotCQlpZiAodykgewotCQkJdy0+Y2IgPSB3X3Jlc3luY19maW5pc2hlZDsKLQkJCXctPm1kZXYgPSBtZGV2OwotCQkJZHJiZF9xdWV1ZV93b3JrKCZtZGV2LT50Y29ubi0+c2VuZGVyX3dvcmssIHcpOworCQlkdyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkcmJkX2RldmljZV93b3JrKSwgR0ZQX0FUT01JQyk7CisJCWlmIChkdykgeworCQkJZHctPncuY2IgPSB3X3Jlc3luY19maW5pc2hlZDsKKwkJCWR3LT5kZXZpY2UgPSBkZXZpY2U7CisJCQlkcmJkX3F1ZXVlX3dvcmsoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLAorCQkJCQkmZHctPncpOwogCQkJcmV0dXJuIDE7CiAJCX0KLQkJZGV2X2VycihERVYsICJXYXJuIGZhaWxlZCB0byBkcmJkX3JzX2RlbF9hbGwoKSBhbmQgdG8ga21hbGxvYyh3KS5cbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJXYXJuIGZhaWxlZCB0byBkcmJkX3JzX2RlbF9hbGwoKSBhbmQgdG8ga21hbGxvYyhkdykuXG4iKTsKIAl9CiAKLQlkdCA9IChqaWZmaWVzIC0gbWRldi0+cnNfc3RhcnQgLSBtZGV2LT5yc19wYXVzZWQpIC8gSFo7CisJZHQgPSAoamlmZmllcyAtIGRldmljZS0+cnNfc3RhcnQgLSBkZXZpY2UtPnJzX3BhdXNlZCkgLyBIWjsKIAlpZiAoZHQgPD0gMCkKIAkJZHQgPSAxOwotCQotCWRiID0gbWRldi0+cnNfdG90YWw7CisKKwlkYiA9IGRldmljZS0+cnNfdG90YWw7CiAJLyogYWRqdXN0IGZvciB2ZXJpZnkgc3RhcnQgYW5kIHN0b3Agc2VjdG9ycywgcmVzcGVjdGl2ZSByZWFjaGVkIHBvc2l0aW9uICovCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUyB8fCBtZGV2LT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpCi0JCWRiIC09IG1kZXYtPm92X2xlZnQ7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9TIHx8IGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9UKQorCQlkYiAtPSBkZXZpY2UtPm92X2xlZnQ7CiAKIAlkYmR0ID0gQml0MktCKGRiL2R0KTsKLQltZGV2LT5yc19wYXVzZWQgLz0gSFo7CisJZGV2aWNlLT5yc19wYXVzZWQgLz0gSFo7CiAKLQlpZiAoIWdldF9sZGV2KG1kZXYpKQorCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkKIAkJZ290byBvdXQ7CiAKLQlwaW5nX3BlZXIobWRldik7CisJcGluZ19wZWVyKGRldmljZSk7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCW9zID0gZHJiZF9yZWFkX3N0YXRlKG1kZXYpOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlvcyA9IGRyYmRfcmVhZF9zdGF0ZShkZXZpY2UpOwogCiAJdmVyaWZ5X2RvbmUgPSAob3MuY29ubiA9PSBDX1ZFUklGWV9TIHx8IG9zLmNvbm4gPT0gQ19WRVJJRllfVCk7CiAKQEAgLTg2Niw0MSArODc3LDQxIEBACiAJbnMgPSBvczsKIAlucy5jb25uID0gQ19DT05ORUNURUQ7CiAKLQlkZXZfaW5mbyhERVYsICIlcyBkb25lICh0b3RhbCAlbHUgc2VjOyBwYXVzZWQgJWx1IHNlYzsgJWx1IEsvc2VjKVxuIiwKKwlkcmJkX2luZm8oZGV2aWNlLCAiJXMgZG9uZSAodG90YWwgJWx1IHNlYzsgcGF1c2VkICVsdSBzZWM7ICVsdSBLL3NlYylcbiIsCiAJICAgICB2ZXJpZnlfZG9uZSA/ICJPbmxpbmUgdmVyaWZ5IiA6ICJSZXN5bmMiLAotCSAgICAgZHQgKyBtZGV2LT5yc19wYXVzZWQsIG1kZXYtPnJzX3BhdXNlZCwgZGJkdCk7CisJICAgICBkdCArIGRldmljZS0+cnNfcGF1c2VkLCBkZXZpY2UtPnJzX3BhdXNlZCwgZGJkdCk7CiAKLQluX29vcyA9IGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpOworCW5fb29zID0gZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKTsKIAogCWlmIChvcy5jb25uID09IENfVkVSSUZZX1MgfHwgb3MuY29ubiA9PSBDX1ZFUklGWV9UKSB7CiAJCWlmIChuX29vcykgewotCQkJZGV2X2FsZXJ0KERFViwgIk9ubGluZSB2ZXJpZnkgZm91bmQgJWx1ICVkayBibG9jayBvdXQgb2Ygc3luYyFcbiIsCisJCQlkcmJkX2FsZXJ0KGRldmljZSwgIk9ubGluZSB2ZXJpZnkgZm91bmQgJWx1ICVkayBibG9jayBvdXQgb2Ygc3luYyFcbiIsCiAJCQkgICAgICBuX29vcywgQml0MktCKDEpKTsKIAkJCWtoZWxwZXJfY21kID0gIm91dC1vZi1zeW5jIjsKIAkJfQogCX0gZWxzZSB7Ci0JCURfQVNTRVJUKChuX29vcyAtIG1kZXYtPnJzX2ZhaWxlZCkgPT0gMCk7CisJCURfQVNTRVJUKGRldmljZSwgKG5fb29zIC0gZGV2aWNlLT5yc19mYWlsZWQpID09IDApOwogCiAJCWlmIChvcy5jb25uID09IENfU1lOQ19UQVJHRVQgfHwgb3MuY29ubiA9PSBDX1BBVVNFRF9TWU5DX1QpCiAJCQlraGVscGVyX2NtZCA9ICJhZnRlci1yZXN5bmMtdGFyZ2V0IjsKIAotCQlpZiAobWRldi0+dGNvbm4tPmNzdW1zX3RmbSAmJiBtZGV2LT5yc190b3RhbCkgewotCQkJY29uc3QgdW5zaWduZWQgbG9uZyBzID0gbWRldi0+cnNfc2FtZV9jc3VtOwotCQkJY29uc3QgdW5zaWduZWQgbG9uZyB0ID0gbWRldi0+cnNfdG90YWw7CisJCWlmIChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5jc3Vtc190Zm0gJiYgZGV2aWNlLT5yc190b3RhbCkgeworCQkJY29uc3QgdW5zaWduZWQgbG9uZyBzID0gZGV2aWNlLT5yc19zYW1lX2NzdW07CisJCQljb25zdCB1bnNpZ25lZCBsb25nIHQgPSBkZXZpY2UtPnJzX3RvdGFsOwogCQkJY29uc3QgaW50IHJhdGlvID0KIAkJCQkodCA9PSAwKSAgICAgPyAwIDoKIAkJCSh0IDwgMTAwMDAwKSA/ICgocyoxMDApL3QpIDogKHMvKHQvMTAwKSk7Ci0JCQlkZXZfaW5mbyhERVYsICIldSAlJSBoYWQgZXF1YWwgY2hlY2tzdW1zLCBlbGltaW5hdGVkOiAlbHVLOyAiCisJCQlkcmJkX2luZm8oZGV2aWNlLCAiJXUgJSUgaGFkIGVxdWFsIGNoZWNrc3VtcywgZWxpbWluYXRlZDogJWx1SzsgIgogCQkJICAgICAidHJhbnNmZXJyZWQgJWx1SyB0b3RhbCAlbHVLXG4iLAogCQkJICAgICByYXRpbywKLQkJCSAgICAgQml0MktCKG1kZXYtPnJzX3NhbWVfY3N1bSksCi0JCQkgICAgIEJpdDJLQihtZGV2LT5yc190b3RhbCAtIG1kZXYtPnJzX3NhbWVfY3N1bSksCi0JCQkgICAgIEJpdDJLQihtZGV2LT5yc190b3RhbCkpOworCQkJICAgICBCaXQyS0IoZGV2aWNlLT5yc19zYW1lX2NzdW0pLAorCQkJICAgICBCaXQyS0IoZGV2aWNlLT5yc190b3RhbCAtIGRldmljZS0+cnNfc2FtZV9jc3VtKSwKKwkJCSAgICAgQml0MktCKGRldmljZS0+cnNfdG90YWwpKTsKIAkJfQogCX0KIAotCWlmIChtZGV2LT5yc19mYWlsZWQpIHsKLQkJZGV2X2luZm8oREVWLCAiICAgICAgICAgICAgJWx1IGZhaWxlZCBibG9ja3NcbiIsIG1kZXYtPnJzX2ZhaWxlZCk7CisJaWYgKGRldmljZS0+cnNfZmFpbGVkKSB7CisJCWRyYmRfaW5mbyhkZXZpY2UsICIgICAgICAgICAgICAlbHUgZmFpbGVkIGJsb2Nrc1xuIiwgZGV2aWNlLT5yc19mYWlsZWQpOwogCiAJCWlmIChvcy5jb25uID09IENfU1lOQ19UQVJHRVQgfHwgb3MuY29ubiA9PSBDX1BBVVNFRF9TWU5DX1QpIHsKIAkJCW5zLmRpc2sgPSBEX0lOQ09OU0lTVEVOVDsKQEAgLTkxNCwxNzkgKzkyNSwxODEgQEAKIAkJbnMucGRzayA9IERfVVBfVE9fREFURTsKIAogCQlpZiAob3MuY29ubiA9PSBDX1NZTkNfVEFSR0VUIHx8IG9zLmNvbm4gPT0gQ19QQVVTRURfU1lOQ19UKSB7Ci0JCQlpZiAobWRldi0+cF91dWlkKSB7CisJCQlpZiAoZGV2aWNlLT5wX3V1aWQpIHsKIAkJCQlpbnQgaTsKIAkJCQlmb3IgKGkgPSBVSV9CSVRNQVAgOyBpIDw9IFVJX0hJU1RPUllfRU5EIDsgaSsrKQotCQkJCQlfZHJiZF91dWlkX3NldChtZGV2LCBpLCBtZGV2LT5wX3V1aWRbaV0pOwotCQkJCWRyYmRfdXVpZF9zZXQobWRldiwgVUlfQklUTUFQLCBtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0NVUlJFTlRdKTsKLQkJCQlfZHJiZF91dWlkX3NldChtZGV2LCBVSV9DVVJSRU5ULCBtZGV2LT5wX3V1aWRbVUlfQ1VSUkVOVF0pOworCQkJCQlfZHJiZF91dWlkX3NldChkZXZpY2UsIGksIGRldmljZS0+cF91dWlkW2ldKTsKKwkJCQlkcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfQklUTUFQLCBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0pOworCQkJCV9kcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfQ1VSUkVOVCwgZGV2aWNlLT5wX3V1aWRbVUlfQ1VSUkVOVF0pOwogCQkJfSBlbHNlIHsKLQkJCQlkZXZfZXJyKERFViwgIm1kZXYtPnBfdXVpZCBpcyBOVUxMISBCVUdcbiIpOworCQkJCWRyYmRfZXJyKGRldmljZSwgImRldmljZS0+cF91dWlkIGlzIE5VTEwhIEJVR1xuIik7CiAJCQl9CiAJCX0KIAogCQlpZiAoIShvcy5jb25uID09IENfVkVSSUZZX1MgfHwgb3MuY29ubiA9PSBDX1ZFUklGWV9UKSkgewogCQkJLyogZm9yIHZlcmlmeSBydW5zLCB3ZSBkb24ndCB1cGRhdGUgdXVpZHMgaGVyZSwKIAkJCSAqIHNvIHRoZXJlIHdvdWxkIGJlIG5vdGhpbmcgdG8gcmVwb3J0LiAqLwotCQkJZHJiZF91dWlkX3NldF9ibShtZGV2LCAwVUwpOwotCQkJZHJiZF9wcmludF91dWlkcyhtZGV2LCAidXBkYXRlZCBVVUlEcyIpOwotCQkJaWYgKG1kZXYtPnBfdXVpZCkgeworCQkJZHJiZF91dWlkX3NldF9ibShkZXZpY2UsIDBVTCk7CisJCQlkcmJkX3ByaW50X3V1aWRzKGRldmljZSwgInVwZGF0ZWQgVVVJRHMiKTsKKwkJCWlmIChkZXZpY2UtPnBfdXVpZCkgewogCQkJCS8qIE5vdyB0aGUgdHdvIFVVSUQgc2V0cyBhcmUgZXF1YWwsIHVwZGF0ZSB3aGF0IHdlCiAJCQkJICoga25vdyBvZiB0aGUgcGVlci4gKi8KIAkJCQlpbnQgaTsKIAkJCQlmb3IgKGkgPSBVSV9DVVJSRU5UIDsgaSA8PSBVSV9ISVNUT1JZX0VORCA7IGkrKykKLQkJCQkJbWRldi0+cF91dWlkW2ldID0gbWRldi0+bGRldi0+bWQudXVpZFtpXTsKKwkJCQkJZGV2aWNlLT5wX3V1aWRbaV0gPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbaV07CiAJCQl9CiAJCX0KIAl9CiAKLQlfZHJiZF9zZXRfc3RhdGUobWRldiwgbnMsIENTX1ZFUkJPU0UsIE5VTEwpOworCV9kcmJkX3NldF9zdGF0ZShkZXZpY2UsIG5zLCBDU19WRVJCT1NFLCBOVUxMKTsKIG91dF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCXB1dF9sZGV2KG1kZXYpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCXB1dF9sZGV2KGRldmljZSk7CiBvdXQ6Ci0JbWRldi0+cnNfdG90YWwgID0gMDsKLQltZGV2LT5yc19mYWlsZWQgPSAwOwotCW1kZXYtPnJzX3BhdXNlZCA9IDA7CisJZGV2aWNlLT5yc190b3RhbCAgPSAwOworCWRldmljZS0+cnNfZmFpbGVkID0gMDsKKwlkZXZpY2UtPnJzX3BhdXNlZCA9IDA7CiAKIAkvKiByZXNldCBzdGFydCBzZWN0b3IsIGlmIHdlIHJlYWNoZWQgZW5kIG9mIGRldmljZSAqLwotCWlmICh2ZXJpZnlfZG9uZSAmJiBtZGV2LT5vdl9sZWZ0ID09IDApCi0JCW1kZXYtPm92X3N0YXJ0X3NlY3RvciA9IDA7CisJaWYgKHZlcmlmeV9kb25lICYmIGRldmljZS0+b3ZfbGVmdCA9PSAwKQorCQlkZXZpY2UtPm92X3N0YXJ0X3NlY3RvciA9IDA7CiAKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAKIAlpZiAoa2hlbHBlcl9jbWQpCi0JCWRyYmRfa2hlbHBlcihtZGV2LCBraGVscGVyX2NtZCk7CisJCWRyYmRfa2hlbHBlcihkZXZpY2UsIGtoZWxwZXJfY21kKTsKIAogCXJldHVybiAxOwogfQogCiAvKiBoZWxwZXIgKi8KLXN0YXRpYyB2b2lkIG1vdmVfdG9fbmV0X2VlX29yX2ZyZWUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSkKK3N0YXRpYyB2b2lkIG1vdmVfdG9fbmV0X2VlX29yX2ZyZWUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEpCiB7CiAJaWYgKGRyYmRfcGVlcl9yZXFfaGFzX2FjdGl2ZV9wYWdlKHBlZXJfcmVxKSkgewogCQkvKiBUaGlzIG1pZ2h0IGhhcHBlbiBpZiBzZW5kcGFnZSgpIGhhcyBub3QgZmluaXNoZWQgKi8KIAkJaW50IGkgPSAocGVlcl9yZXEtPmkuc2l6ZSArIFBBR0VfU0laRSAtMSkgPj4gUEFHRV9TSElGVDsKLQkJYXRvbWljX2FkZChpLCAmbWRldi0+cHBfaW5fdXNlX2J5X25ldCk7Ci0JCWF0b21pY19zdWIoaSwgJm1kZXYtPnBwX2luX3VzZSk7Ci0JCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JCWxpc3RfYWRkX3RhaWwoJnBlZXJfcmVxLT53Lmxpc3QsICZtZGV2LT5uZXRfZWUpOwotCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJCWF0b21pY19hZGQoaSwgJmRldmljZS0+cHBfaW5fdXNlX2J5X25ldCk7CisJCWF0b21pY19zdWIoaSwgJmRldmljZS0+cHBfaW5fdXNlKTsKKwkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCQlsaXN0X2FkZF90YWlsKCZwZWVyX3JlcS0+dy5saXN0LCAmZGV2aWNlLT5uZXRfZWUpOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJd2FrZV91cCgmZHJiZF9wcF93YWl0KTsKIAl9IGVsc2UKLQkJZHJiZF9mcmVlX3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKKwkJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOwogfQogCiAvKioKICAqIHdfZV9lbmRfZGF0YV9yZXEoKSAtIFdvcmtlciBjYWxsYmFjaywgdG8gc2VuZCBhIFBfREFUQV9SRVBMWSBwYWNrZXQgaW4gcmVzcG9uc2UgdG8gYSBQX0RBVEFfUkVRVUVTVAotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAdzoJCXdvcmsgb2JqZWN0LgogICogQGNhbmNlbDoJVGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQgYW55d2F5cwogICovCiBpbnQgd19lX2VuZF9kYXRhX3JlcShzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0LCB3KTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UgPSBwZWVyX3JlcS0+cGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCWludCBlcnI7CiAKIAlpZiAodW5saWtlbHkoY2FuY2VsKSkgewotCQlkcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOwotCQlkZWNfdW5hY2tlZChtZGV2KTsKKwkJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOworCQlkZWNfdW5hY2tlZChkZXZpY2UpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAobGlrZWx5KChwZWVyX3JlcS0+ZmxhZ3MgJiBFRV9XQVNfRVJST1IpID09IDApKSB7Ci0JCWVyciA9IGRyYmRfc2VuZF9ibG9jayhtZGV2LCBQX0RBVEFfUkVQTFksIHBlZXJfcmVxKTsKKwkJZXJyID0gZHJiZF9zZW5kX2Jsb2NrKHBlZXJfZGV2aWNlLCBQX0RBVEFfUkVQTFksIHBlZXJfcmVxKTsKIAl9IGVsc2UgewogCQlpZiAoX19yYXRlbGltaXQoJmRyYmRfcmF0ZWxpbWl0X3N0YXRlKSkKLQkJCWRldl9lcnIoREVWLCAiU2VuZGluZyBOZWdEUmVwbHkuIHNlY3Rvcj0lbGx1cy5cbiIsCisJCQlkcmJkX2VycihkZXZpY2UsICJTZW5kaW5nIE5lZ0RSZXBseS4gc2VjdG9yPSVsbHVzLlxuIiwKIAkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXBlZXJfcmVxLT5pLnNlY3Rvcik7CiAKLQkJZXJyID0gZHJiZF9zZW5kX2FjayhtZGV2LCBQX05FR19EUkVQTFksIHBlZXJfcmVxKTsKKwkJZXJyID0gZHJiZF9zZW5kX2FjayhwZWVyX2RldmljZSwgUF9ORUdfRFJFUExZLCBwZWVyX3JlcSk7CiAJfQogCi0JZGVjX3VuYWNrZWQobWRldik7CisJZGVjX3VuYWNrZWQoZGV2aWNlKTsKIAotCW1vdmVfdG9fbmV0X2VlX29yX2ZyZWUobWRldiwgcGVlcl9yZXEpOworCW1vdmVfdG9fbmV0X2VlX29yX2ZyZWUoZGV2aWNlLCBwZWVyX3JlcSk7CiAKIAlpZiAodW5saWtlbHkoZXJyKSkKLQkJZGV2X2VycihERVYsICJkcmJkX3NlbmRfYmxvY2soKSBmYWlsZWRcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJkcmJkX3NlbmRfYmxvY2soKSBmYWlsZWRcbiIpOwogCXJldHVybiBlcnI7CiB9CiAKIC8qKgogICogd19lX2VuZF9yc2RhdGFfcmVxKCkgLSBXb3JrZXIgY2FsbGJhY2sgdG8gc2VuZCBhIFBfUlNfREFUQV9SRVBMWSBwYWNrZXQgaW4gcmVzcG9uc2UgdG8gYSBQX1JTX0RBVEFfUkVRVUVTVAotICogQG1kZXY6CURSQkQgZGV2aWNlLgogICogQHc6CQl3b3JrIG9iamVjdC4KICAqIEBjYW5jZWw6CVRoZSBjb25uZWN0aW9uIHdpbGwgYmUgY2xvc2VkIGFueXdheXMKICAqLwogaW50IHdfZV9lbmRfcnNkYXRhX3JlcShzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0LCB3KTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UgPSBwZWVyX3JlcS0+cGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCWludCBlcnI7CiAKIAlpZiAodW5saWtlbHkoY2FuY2VsKSkgewotCQlkcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOwotCQlkZWNfdW5hY2tlZChtZGV2KTsKKwkJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOworCQlkZWNfdW5hY2tlZChkZXZpY2UpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9GQUlMRUQpKSB7Ci0JCWRyYmRfcnNfY29tcGxldGVfaW8obWRldiwgcGVlcl9yZXEtPmkuc2VjdG9yKTsKLQkJcHV0X2xkZXYobWRldik7CisJaWYgKGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKSB7CisJCWRyYmRfcnNfY29tcGxldGVfaW8oZGV2aWNlLCBwZWVyX3JlcS0+aS5zZWN0b3IpOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAotCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfQUhFQUQpIHsKLQkJZXJyID0gZHJiZF9zZW5kX2FjayhtZGV2LCBQX1JTX0NBTkNFTCwgcGVlcl9yZXEpOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19BSEVBRCkgeworCQllcnIgPSBkcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBQX1JTX0NBTkNFTCwgcGVlcl9yZXEpOwogCX0gZWxzZSBpZiAobGlrZWx5KChwZWVyX3JlcS0+ZmxhZ3MgJiBFRV9XQVNfRVJST1IpID09IDApKSB7Ci0JCWlmIChsaWtlbHkobWRldi0+c3RhdGUucGRzayA+PSBEX0lOQ09OU0lTVEVOVCkpIHsKLQkJCWluY19yc19wZW5kaW5nKG1kZXYpOwotCQkJZXJyID0gZHJiZF9zZW5kX2Jsb2NrKG1kZXYsIFBfUlNfREFUQV9SRVBMWSwgcGVlcl9yZXEpOworCQlpZiAobGlrZWx5KGRldmljZS0+c3RhdGUucGRzayA+PSBEX0lOQ09OU0lTVEVOVCkpIHsKKwkJCWluY19yc19wZW5kaW5nKGRldmljZSk7CisJCQllcnIgPSBkcmJkX3NlbmRfYmxvY2socGVlcl9kZXZpY2UsIFBfUlNfREFUQV9SRVBMWSwgcGVlcl9yZXEpOwogCQl9IGVsc2UgewogCQkJaWYgKF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpCi0JCQkJZGV2X2VycihERVYsICJOb3Qgc2VuZGluZyBSU0RhdGFSZXBseSwgIgorCQkJCWRyYmRfZXJyKGRldmljZSwgIk5vdCBzZW5kaW5nIFJTRGF0YVJlcGx5LCAiCiAJCQkJICAgICJwYXJ0bmVyIERJU0tMRVNTIVxuIik7CiAJCQllcnIgPSAwOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpCi0JCQlkZXZfZXJyKERFViwgIlNlbmRpbmcgTmVnUlNEUmVwbHkuIHNlY3RvciAlbGx1cy5cbiIsCisJCQlkcmJkX2VycihkZXZpY2UsICJTZW5kaW5nIE5lZ1JTRFJlcGx5LiBzZWN0b3IgJWxsdXMuXG4iLAogCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGVlcl9yZXEtPmkuc2VjdG9yKTsKIAotCQllcnIgPSBkcmJkX3NlbmRfYWNrKG1kZXYsIFBfTkVHX1JTX0RSRVBMWSwgcGVlcl9yZXEpOworCQllcnIgPSBkcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBQX05FR19SU19EUkVQTFksIHBlZXJfcmVxKTsKIAogCQkvKiB1cGRhdGUgcmVzeW5jIGRhdGEgd2l0aCBmYWlsdXJlICovCi0JCWRyYmRfcnNfZmFpbGVkX2lvKG1kZXYsIHBlZXJfcmVxLT5pLnNlY3RvciwgcGVlcl9yZXEtPmkuc2l6ZSk7CisJCWRyYmRfcnNfZmFpbGVkX2lvKGRldmljZSwgcGVlcl9yZXEtPmkuc2VjdG9yLCBwZWVyX3JlcS0+aS5zaXplKTsKIAl9CiAKLQlkZWNfdW5hY2tlZChtZGV2KTsKKwlkZWNfdW5hY2tlZChkZXZpY2UpOwogCi0JbW92ZV90b19uZXRfZWVfb3JfZnJlZShtZGV2LCBwZWVyX3JlcSk7CisJbW92ZV90b19uZXRfZWVfb3JfZnJlZShkZXZpY2UsIHBlZXJfcmVxKTsKIAogCWlmICh1bmxpa2VseShlcnIpKQotCQlkZXZfZXJyKERFViwgImRyYmRfc2VuZF9ibG9jaygpIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfc2VuZF9ibG9jaygpIGZhaWxlZFxuIik7CiAJcmV0dXJuIGVycjsKIH0KIAogaW50IHdfZV9lbmRfY3N1bV9yc19yZXEoc3RydWN0IGRyYmRfd29yayAqdywgaW50IGNhbmNlbCkKIHsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCwgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzdHJ1Y3QgZGlnZXN0X2luZm8gKmRpOwogCWludCBkaWdlc3Rfc2l6ZTsKIAl2b2lkICpkaWdlc3QgPSBOVUxMOwogCWludCBlcnIsIGVxID0gMDsKIAogCWlmICh1bmxpa2VseShjYW5jZWwpKSB7Ci0JCWRyYmRfZnJlZV9wZWVyX3JlcShtZGV2LCBwZWVyX3JlcSk7Ci0JCWRlY191bmFja2VkKG1kZXYpOworCQlkcmJkX2ZyZWVfcGVlcl9yZXEoZGV2aWNlLCBwZWVyX3JlcSk7CisJCWRlY191bmFja2VkKGRldmljZSk7CiAJCXJldHVybiAwOwogCX0KIAotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQlkcmJkX3JzX2NvbXBsZXRlX2lvKG1kZXYsIHBlZXJfcmVxLT5pLnNlY3Rvcik7Ci0JCXB1dF9sZGV2KG1kZXYpOworCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CisJCWRyYmRfcnNfY29tcGxldGVfaW8oZGV2aWNlLCBwZWVyX3JlcS0+aS5zZWN0b3IpOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAogCWRpID0gcGVlcl9yZXEtPmRpZ2VzdDsKQEAgLTEwOTUsNDcgKzExMDgsNDggQEAKIAkJLyogcXVpY2sgaGFjayB0byB0cnkgdG8gYXZvaWQgYSByYWNlIGFnYWluc3QgcmVjb25maWd1cmF0aW9uLgogCQkgKiBhIHJlYWwgZml4IHdvdWxkIGJlIG11Y2ggbW9yZSBpbnZvbHZlZCwKIAkJICogaW50cm9kdWNpbmcgbW9yZSBsb2NraW5nIG1lY2hhbmlzbXMgKi8KLQkJaWYgKG1kZXYtPnRjb25uLT5jc3Vtc190Zm0pIHsKLQkJCWRpZ2VzdF9zaXplID0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShtZGV2LT50Y29ubi0+Y3N1bXNfdGZtKTsKLQkJCURfQVNTRVJUKGRpZ2VzdF9zaXplID09IGRpLT5kaWdlc3Rfc2l6ZSk7CisJCWlmIChwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+Y3N1bXNfdGZtKSB7CisJCQlkaWdlc3Rfc2l6ZSA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmNzdW1zX3RmbSk7CisJCQlEX0FTU0VSVChkZXZpY2UsIGRpZ2VzdF9zaXplID09IGRpLT5kaWdlc3Rfc2l6ZSk7CiAJCQlkaWdlc3QgPSBrbWFsbG9jKGRpZ2VzdF9zaXplLCBHRlBfTk9JTyk7CiAJCX0KIAkJaWYgKGRpZ2VzdCkgewotCQkJZHJiZF9jc3VtX2VlKG1kZXYsIG1kZXYtPnRjb25uLT5jc3Vtc190Zm0sIHBlZXJfcmVxLCBkaWdlc3QpOworCQkJZHJiZF9jc3VtX2VlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5jc3Vtc190Zm0sIHBlZXJfcmVxLCBkaWdlc3QpOwogCQkJZXEgPSAhbWVtY21wKGRpZ2VzdCwgZGktPmRpZ2VzdCwgZGlnZXN0X3NpemUpOwogCQkJa2ZyZWUoZGlnZXN0KTsKIAkJfQogCiAJCWlmIChlcSkgewotCQkJZHJiZF9zZXRfaW5fc3luYyhtZGV2LCBwZWVyX3JlcS0+aS5zZWN0b3IsIHBlZXJfcmVxLT5pLnNpemUpOworCQkJZHJiZF9zZXRfaW5fc3luYyhkZXZpY2UsIHBlZXJfcmVxLT5pLnNlY3RvciwgcGVlcl9yZXEtPmkuc2l6ZSk7CiAJCQkvKiByc19zYW1lX2NzdW1zIHVuaXQgaXMgQk1fQkxPQ0tfU0laRSAqLwotCQkJbWRldi0+cnNfc2FtZV9jc3VtICs9IHBlZXJfcmVxLT5pLnNpemUgPj4gQk1fQkxPQ0tfU0hJRlQ7Ci0JCQllcnIgPSBkcmJkX3NlbmRfYWNrKG1kZXYsIFBfUlNfSVNfSU5fU1lOQywgcGVlcl9yZXEpOworCQkJZGV2aWNlLT5yc19zYW1lX2NzdW0gKz0gcGVlcl9yZXEtPmkuc2l6ZSA+PiBCTV9CTE9DS19TSElGVDsKKwkJCWVyciA9IGRyYmRfc2VuZF9hY2socGVlcl9kZXZpY2UsIFBfUlNfSVNfSU5fU1lOQywgcGVlcl9yZXEpOwogCQl9IGVsc2UgewotCQkJaW5jX3JzX3BlbmRpbmcobWRldik7CisJCQlpbmNfcnNfcGVuZGluZyhkZXZpY2UpOwogCQkJcGVlcl9yZXEtPmJsb2NrX2lkID0gSURfU1lOQ0VSOyAvKiBCeSBzZXR0aW5nIGJsb2NrX2lkLCBkaWdlc3QgcG9pbnRlciBiZWNvbWVzIGludmFsaWQhICovCiAJCQlwZWVyX3JlcS0+ZmxhZ3MgJj0gfkVFX0hBU19ESUdFU1Q7IC8qIFRoaXMgcGVlciByZXF1ZXN0IG5vIGxvbmdlciBoYXMgYSBkaWdlc3QgcG9pbnRlciAqLwogCQkJa2ZyZWUoZGkpOwotCQkJZXJyID0gZHJiZF9zZW5kX2Jsb2NrKG1kZXYsIFBfUlNfREFUQV9SRVBMWSwgcGVlcl9yZXEpOworCQkJZXJyID0gZHJiZF9zZW5kX2Jsb2NrKHBlZXJfZGV2aWNlLCBQX1JTX0RBVEFfUkVQTFksIHBlZXJfcmVxKTsKIAkJfQogCX0gZWxzZSB7Ci0JCWVyciA9IGRyYmRfc2VuZF9hY2sobWRldiwgUF9ORUdfUlNfRFJFUExZLCBwZWVyX3JlcSk7CisJCWVyciA9IGRyYmRfc2VuZF9hY2socGVlcl9kZXZpY2UsIFBfTkVHX1JTX0RSRVBMWSwgcGVlcl9yZXEpOwogCQlpZiAoX19yYXRlbGltaXQoJmRyYmRfcmF0ZWxpbWl0X3N0YXRlKSkKLQkJCWRldl9lcnIoREVWLCAiU2VuZGluZyBOZWdEUmVwbHkuIEkgZ3Vlc3MgaXQgZ2V0cyBtZXNzeS5cbiIpOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiU2VuZGluZyBOZWdEUmVwbHkuIEkgZ3Vlc3MgaXQgZ2V0cyBtZXNzeS5cbiIpOwogCX0KIAotCWRlY191bmFja2VkKG1kZXYpOwotCW1vdmVfdG9fbmV0X2VlX29yX2ZyZWUobWRldiwgcGVlcl9yZXEpOworCWRlY191bmFja2VkKGRldmljZSk7CisJbW92ZV90b19uZXRfZWVfb3JfZnJlZShkZXZpY2UsIHBlZXJfcmVxKTsKIAogCWlmICh1bmxpa2VseShlcnIpKQotCQlkZXZfZXJyKERFViwgImRyYmRfc2VuZF9ibG9jay9hY2soKSBmYWlsZWRcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJkcmJkX3NlbmRfYmxvY2svYWNrKCkgZmFpbGVkXG4iKTsKIAlyZXR1cm4gZXJyOwogfQogCiBpbnQgd19lX2VuZF9vdl9yZXEoc3RydWN0IGRyYmRfd29yayAqdywgaW50IGNhbmNlbCkKIHsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCwgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzZWN0b3JfdCBzZWN0b3IgPSBwZWVyX3JlcS0+aS5zZWN0b3I7CiAJdW5zaWduZWQgaW50IHNpemUgPSBwZWVyX3JlcS0+aS5zaXplOwogCWludCBkaWdlc3Rfc2l6ZTsKQEAgLTExNDUsNyArMTE1OSw3IEBACiAJaWYgKHVubGlrZWx5KGNhbmNlbCkpCiAJCWdvdG8gb3V0OwogCi0JZGlnZXN0X3NpemUgPSBjcnlwdG9faGFzaF9kaWdlc3RzaXplKG1kZXYtPnRjb25uLT52ZXJpZnlfdGZtKTsKKwlkaWdlc3Rfc2l6ZSA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnZlcmlmeV90Zm0pOwogCWRpZ2VzdCA9IGttYWxsb2MoZGlnZXN0X3NpemUsIEdGUF9OT0lPKTsKIAlpZiAoIWRpZ2VzdCkgewogCQllcnIgPSAxOwkvKiB0ZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24gaW4gY2FzZSB0aGUgYWxsb2NhdGlvbiBmYWlsZWQgKi8KQEAgLTExNTMsNyArMTE2Nyw3IEBACiAJfQogCiAJaWYgKGxpa2VseSghKHBlZXJfcmVxLT5mbGFncyAmIEVFX1dBU19FUlJPUikpKQotCQlkcmJkX2NzdW1fZWUobWRldiwgbWRldi0+dGNvbm4tPnZlcmlmeV90Zm0sIHBlZXJfcmVxLCBkaWdlc3QpOworCQlkcmJkX2NzdW1fZWUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnZlcmlmeV90Zm0sIHBlZXJfcmVxLCBkaWdlc3QpOwogCWVsc2UKIAkJbWVtc2V0KGRpZ2VzdCwgMCwgZGlnZXN0X3NpemUpOwogCkBAIC0xMTYyLDM2ICsxMTc2LDM3IEBACiAJICogc29tZSBkaXN0cmlidXRlZCBkZWFkbG9jaywgaWYgdGhlIG90aGVyIHNpZGUgYmxvY2tzIG9uCiAJICogY29uZ2VzdGlvbiBhcyB3ZWxsLCBiZWNhdXNlIG91ciByZWNlaXZlciBibG9ja3MgaW4KIAkgKiBkcmJkX2FsbG9jX3BhZ2VzIGR1ZSB0byBwcF9pbl91c2UgPiBtYXhfYnVmZmVycy4gKi8KLQlkcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOworCWRyYmRfZnJlZV9wZWVyX3JlcShkZXZpY2UsIHBlZXJfcmVxKTsKIAlwZWVyX3JlcSA9IE5VTEw7Ci0JaW5jX3JzX3BlbmRpbmcobWRldik7Ci0JZXJyID0gZHJiZF9zZW5kX2RyZXF1ZXN0X2NzdW0obWRldiwgc2VjdG9yLCBzaXplLCBkaWdlc3QsIGRpZ2VzdF9zaXplLCBQX09WX1JFUExZKTsKKwlpbmNfcnNfcGVuZGluZyhkZXZpY2UpOworCWVyciA9IGRyYmRfc2VuZF9kcmVxdWVzdF9jc3VtKHBlZXJfZGV2aWNlLCBzZWN0b3IsIHNpemUsIGRpZ2VzdCwgZGlnZXN0X3NpemUsIFBfT1ZfUkVQTFkpOwogCWlmIChlcnIpCi0JCWRlY19yc19wZW5kaW5nKG1kZXYpOworCQlkZWNfcnNfcGVuZGluZyhkZXZpY2UpOwogCWtmcmVlKGRpZ2VzdCk7CiAKIG91dDoKIAlpZiAocGVlcl9yZXEpCi0JCWRyYmRfZnJlZV9wZWVyX3JlcShtZGV2LCBwZWVyX3JlcSk7Ci0JZGVjX3VuYWNrZWQobWRldik7CisJCWRyYmRfZnJlZV9wZWVyX3JlcShkZXZpY2UsIHBlZXJfcmVxKTsKKwlkZWNfdW5hY2tlZChkZXZpY2UpOwogCXJldHVybiBlcnI7CiB9CiAKLXZvaWQgZHJiZF9vdl9vdXRfb2Zfc3luY19mb3VuZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplKQordm9pZCBkcmJkX292X291dF9vZl9zeW5jX2ZvdW5kKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplKQogewotCWlmIChtZGV2LT5vdl9sYXN0X29vc19zdGFydCArIG1kZXYtPm92X2xhc3Rfb29zX3NpemUgPT0gc2VjdG9yKSB7Ci0JCW1kZXYtPm92X2xhc3Rfb29zX3NpemUgKz0gc2l6ZT4+OTsKKwlpZiAoZGV2aWNlLT5vdl9sYXN0X29vc19zdGFydCArIGRldmljZS0+b3ZfbGFzdF9vb3Nfc2l6ZSA9PSBzZWN0b3IpIHsKKwkJZGV2aWNlLT5vdl9sYXN0X29vc19zaXplICs9IHNpemU+Pjk7CiAJfSBlbHNlIHsKLQkJbWRldi0+b3ZfbGFzdF9vb3Nfc3RhcnQgPSBzZWN0b3I7Ci0JCW1kZXYtPm92X2xhc3Rfb29zX3NpemUgPSBzaXplPj45OworCQlkZXZpY2UtPm92X2xhc3Rfb29zX3N0YXJ0ID0gc2VjdG9yOworCQlkZXZpY2UtPm92X2xhc3Rfb29zX3NpemUgPSBzaXplPj45OwogCX0KLQlkcmJkX3NldF9vdXRfb2Zfc3luYyhtZGV2LCBzZWN0b3IsIHNpemUpOworCWRyYmRfc2V0X291dF9vZl9zeW5jKGRldmljZSwgc2VjdG9yLCBzaXplKTsKIH0KIAogaW50IHdfZV9lbmRfb3ZfcmVwbHkoc3RydWN0IGRyYmRfd29yayAqdywgaW50IGNhbmNlbCkKIHsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCwgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzdHJ1Y3QgZGlnZXN0X2luZm8gKmRpOwogCXZvaWQgKmRpZ2VzdDsKIAlzZWN0b3JfdCBzZWN0b3IgPSBwZWVyX3JlcS0+aS5zZWN0b3I7CkBAIC0xMjAxLDI3ICsxMjE2LDI3IEBACiAJYm9vbCBzdG9wX3NlY3Rvcl9yZWFjaGVkID0gZmFsc2U7CiAKIAlpZiAodW5saWtlbHkoY2FuY2VsKSkgewotCQlkcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOwotCQlkZWNfdW5hY2tlZChtZGV2KTsKKwkJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOworCQlkZWNfdW5hY2tlZChkZXZpY2UpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiBhZnRlciAiY2FuY2VsIiwgYmVjYXVzZSBhZnRlciBkcmJkX2Rpc2Nvbm5lY3QvZHJiZF9yc19jYW5jZWxfYWxsCiAJICogdGhlIHJlc3luYyBscnUgaGFzIGJlZW4gY2xlYW5lZCB1cCBhbHJlYWR5ICovCi0JaWYgKGdldF9sZGV2KG1kZXYpKSB7Ci0JCWRyYmRfcnNfY29tcGxldGVfaW8obWRldiwgcGVlcl9yZXEtPmkuc2VjdG9yKTsKLQkJcHV0X2xkZXYobWRldik7CisJaWYgKGdldF9sZGV2KGRldmljZSkpIHsKKwkJZHJiZF9yc19jb21wbGV0ZV9pbyhkZXZpY2UsIHBlZXJfcmVxLT5pLnNlY3Rvcik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJZGkgPSBwZWVyX3JlcS0+ZGlnZXN0OwogCiAJaWYgKGxpa2VseSgocGVlcl9yZXEtPmZsYWdzICYgRUVfV0FTX0VSUk9SKSA9PSAwKSkgewotCQlkaWdlc3Rfc2l6ZSA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUobWRldi0+dGNvbm4tPnZlcmlmeV90Zm0pOworCQlkaWdlc3Rfc2l6ZSA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnZlcmlmeV90Zm0pOwogCQlkaWdlc3QgPSBrbWFsbG9jKGRpZ2VzdF9zaXplLCBHRlBfTk9JTyk7CiAJCWlmIChkaWdlc3QpIHsKLQkJCWRyYmRfY3N1bV9lZShtZGV2LCBtZGV2LT50Y29ubi0+dmVyaWZ5X3RmbSwgcGVlcl9yZXEsIGRpZ2VzdCk7CisJCQlkcmJkX2NzdW1fZWUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnZlcmlmeV90Zm0sIHBlZXJfcmVxLCBkaWdlc3QpOwogCi0JCQlEX0FTU0VSVChkaWdlc3Rfc2l6ZSA9PSBkaS0+ZGlnZXN0X3NpemUpOworCQkJRF9BU1NFUlQoZGV2aWNlLCBkaWdlc3Rfc2l6ZSA9PSBkaS0+ZGlnZXN0X3NpemUpOwogCQkJZXEgPSAhbWVtY21wKGRpZ2VzdCwgZGktPmRpZ2VzdCwgZGlnZXN0X3NpemUpOwogCQkJa2ZyZWUoZGlnZXN0KTsKIAkJfQpAQCAtMTIzMiwxMDIgKzEyNDcsOTUgQEAKIAkgKiBzb21lIGRpc3RyaWJ1dGVkIGRlYWRsb2NrLCBpZiB0aGUgb3RoZXIgc2lkZSBibG9ja3Mgb24KIAkgKiBjb25nZXN0aW9uIGFzIHdlbGwsIGJlY2F1c2Ugb3VyIHJlY2VpdmVyIGJsb2NrcyBpbgogCSAqIGRyYmRfYWxsb2NfcGFnZXMgZHVlIHRvIHBwX2luX3VzZSA+IG1heF9idWZmZXJzLiAqLwotCWRyYmRfZnJlZV9wZWVyX3JlcShtZGV2LCBwZWVyX3JlcSk7CisJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOwogCWlmICghZXEpCi0JCWRyYmRfb3Zfb3V0X29mX3N5bmNfZm91bmQobWRldiwgc2VjdG9yLCBzaXplKTsKKwkJZHJiZF9vdl9vdXRfb2Zfc3luY19mb3VuZChkZXZpY2UsIHNlY3Rvciwgc2l6ZSk7CiAJZWxzZQotCQlvdl9vdXRfb2Zfc3luY19wcmludChtZGV2KTsKKwkJb3Zfb3V0X29mX3N5bmNfcHJpbnQoZGV2aWNlKTsKIAotCWVyciA9IGRyYmRfc2VuZF9hY2tfZXgobWRldiwgUF9PVl9SRVNVTFQsIHNlY3Rvciwgc2l6ZSwKKwllcnIgPSBkcmJkX3NlbmRfYWNrX2V4KHBlZXJfZGV2aWNlLCBQX09WX1JFU1VMVCwgc2VjdG9yLCBzaXplLAogCQkJICAgICAgIGVxID8gSURfSU5fU1lOQyA6IElEX09VVF9PRl9TWU5DKTsKIAotCWRlY191bmFja2VkKG1kZXYpOworCWRlY191bmFja2VkKGRldmljZSk7CiAKLQktLW1kZXYtPm92X2xlZnQ7CisJLS1kZXZpY2UtPm92X2xlZnQ7CiAKIAkvKiBsZXQncyBhZHZhbmNlIHByb2dyZXNzIHN0ZXAgbWFya3Mgb25seSBmb3IgZXZlcnkgb3RoZXIgbWVnYWJ5dGUgKi8KLQlpZiAoKG1kZXYtPm92X2xlZnQgJiAweDIwMCkgPT0gMHgyMDApCi0JCWRyYmRfYWR2YW5jZV9yc19tYXJrcyhtZGV2LCBtZGV2LT5vdl9sZWZ0KTsKKwlpZiAoKGRldmljZS0+b3ZfbGVmdCAmIDB4MjAwKSA9PSAweDIwMCkKKwkJZHJiZF9hZHZhbmNlX3JzX21hcmtzKGRldmljZSwgZGV2aWNlLT5vdl9sZWZ0KTsKIAotCXN0b3Bfc2VjdG9yX3JlYWNoZWQgPSB2ZXJpZnlfY2FuX2RvX3N0b3Bfc2VjdG9yKG1kZXYpICYmCi0JCShzZWN0b3IgKyAoc2l6ZT4+OSkpID49IG1kZXYtPm92X3N0b3Bfc2VjdG9yOworCXN0b3Bfc2VjdG9yX3JlYWNoZWQgPSB2ZXJpZnlfY2FuX2RvX3N0b3Bfc2VjdG9yKGRldmljZSkgJiYKKwkJKHNlY3RvciArIChzaXplPj45KSkgPj0gZGV2aWNlLT5vdl9zdG9wX3NlY3RvcjsKIAotCWlmIChtZGV2LT5vdl9sZWZ0ID09IDAgfHwgc3RvcF9zZWN0b3JfcmVhY2hlZCkgewotCQlvdl9vdXRfb2Zfc3luY19wcmludChtZGV2KTsKLQkJZHJiZF9yZXN5bmNfZmluaXNoZWQobWRldik7CisJaWYgKGRldmljZS0+b3ZfbGVmdCA9PSAwIHx8IHN0b3Bfc2VjdG9yX3JlYWNoZWQpIHsKKwkJb3Zfb3V0X29mX3N5bmNfcHJpbnQoZGV2aWNlKTsKKwkJZHJiZF9yZXN5bmNfZmluaXNoZWQoZGV2aWNlKTsKIAl9CiAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgd19wcmV2X3dvcmtfZG9uZShzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQotewotCXN0cnVjdCBkcmJkX3dxX2JhcnJpZXIgKmIgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfd3FfYmFycmllciwgdyk7Ci0KLQljb21wbGV0ZSgmYi0+ZG9uZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KIC8qIEZJWE1FCiAgKiBXZSBuZWVkIHRvIHRyYWNrIHRoZSBudW1iZXIgb2YgcGVuZGluZyBiYXJyaWVyIGFja3MsCiAgKiBhbmQgdG8gYmUgYWJsZSB0byB3YWl0IGZvciB0aGVtLgogICogU2VlIGFsc28gY29tbWVudCBpbiBkcmJkX2FkbV9hdHRhY2ggYmVmb3JlIGRyYmRfc3VzcGVuZF9pby4KICAqLwotaW50IGRyYmRfc2VuZF9iYXJyaWVyKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3N0YXRpYyBpbnQgZHJiZF9zZW5kX2JhcnJpZXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlzdHJ1Y3QgcF9iYXJyaWVyICpwOwogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAotCXNvY2sgPSAmdGNvbm4tPmRhdGE7Ci0JcCA9IGNvbm5fcHJlcGFyZV9jb21tYW5kKHRjb25uLCBzb2NrKTsKKwlzb2NrID0gJmNvbm5lY3Rpb24tPmRhdGE7CisJcCA9IGNvbm5fcHJlcGFyZV9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87Ci0JcC0+YmFycmllciA9IHRjb25uLT5zZW5kLmN1cnJlbnRfZXBvY2hfbnI7CisJcC0+YmFycmllciA9IGNvbm5lY3Rpb24tPnNlbmQuY3VycmVudF9lcG9jaF9ucjsKIAlwLT5wYWQgPSAwOwotCXRjb25uLT5zZW5kLmN1cnJlbnRfZXBvY2hfd3JpdGVzID0gMDsKKwljb25uZWN0aW9uLT5zZW5kLmN1cnJlbnRfZXBvY2hfd3JpdGVzID0gMDsKIAotCXJldHVybiBjb25uX3NlbmRfY29tbWFuZCh0Y29ubiwgc29jaywgUF9CQVJSSUVSLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKKwlyZXR1cm4gY29ubl9zZW5kX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jaywgUF9CQVJSSUVSLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAogaW50IHdfc2VuZF93cml0ZV9oaW50KHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPQorCQljb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfZGV2aWNlLCB1bnBsdWdfd29yayk7CiAJc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrOwogCiAJaWYgKGNhbmNlbCkKIAkJcmV0dXJuIDA7Ci0Jc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQlpZiAoIWRyYmRfcHJlcGFyZV9jb21tYW5kKG1kZXYsIHNvY2spKQorCXNvY2sgPSAmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwlpZiAoIWRyYmRfcHJlcGFyZV9jb21tYW5kKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIHNvY2spKQogCQlyZXR1cm4gLUVJTzsKLQlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQobWRldiwgc29jaywgUF9VTlBMVUdfUkVNT1RFLCAwLCBOVUxMLCAwKTsKKwlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgc29jaywgUF9VTlBMVUdfUkVNT1RFLCAwLCBOVUxMLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgcmVfaW5pdF9pZl9maXJzdF93cml0ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHVuc2lnbmVkIGludCBlcG9jaCkKK3N0YXRpYyB2b2lkIHJlX2luaXRfaWZfZmlyc3Rfd3JpdGUoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdW5zaWduZWQgaW50IGVwb2NoKQogewotCWlmICghdGNvbm4tPnNlbmQuc2Vlbl9hbnlfd3JpdGVfeWV0KSB7Ci0JCXRjb25uLT5zZW5kLnNlZW5fYW55X3dyaXRlX3lldCA9IHRydWU7Ci0JCXRjb25uLT5zZW5kLmN1cnJlbnRfZXBvY2hfbnIgPSBlcG9jaDsKLQkJdGNvbm4tPnNlbmQuY3VycmVudF9lcG9jaF93cml0ZXMgPSAwOworCWlmICghY29ubmVjdGlvbi0+c2VuZC5zZWVuX2FueV93cml0ZV95ZXQpIHsKKwkJY29ubmVjdGlvbi0+c2VuZC5zZWVuX2FueV93cml0ZV95ZXQgPSB0cnVlOworCQljb25uZWN0aW9uLT5zZW5kLmN1cnJlbnRfZXBvY2hfbnIgPSBlcG9jaDsKKwkJY29ubmVjdGlvbi0+c2VuZC5jdXJyZW50X2Vwb2NoX3dyaXRlcyA9IDA7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBtYXliZV9zZW5kX2JhcnJpZXIoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bnNpZ25lZCBpbnQgZXBvY2gpCitzdGF0aWMgdm9pZCBtYXliZV9zZW5kX2JhcnJpZXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdW5zaWduZWQgaW50IGVwb2NoKQogewogCS8qIHJlLWluaXQgaWYgZmlyc3Qgd3JpdGUgb24gdGhpcyBjb25uZWN0aW9uICovCi0JaWYgKCF0Y29ubi0+c2VuZC5zZWVuX2FueV93cml0ZV95ZXQpCisJaWYgKCFjb25uZWN0aW9uLT5zZW5kLnNlZW5fYW55X3dyaXRlX3lldCkKIAkJcmV0dXJuOwotCWlmICh0Y29ubi0+c2VuZC5jdXJyZW50X2Vwb2NoX25yICE9IGVwb2NoKSB7Ci0JCWlmICh0Y29ubi0+c2VuZC5jdXJyZW50X2Vwb2NoX3dyaXRlcykKLQkJCWRyYmRfc2VuZF9iYXJyaWVyKHRjb25uKTsKLQkJdGNvbm4tPnNlbmQuY3VycmVudF9lcG9jaF9uciA9IGVwb2NoOworCWlmIChjb25uZWN0aW9uLT5zZW5kLmN1cnJlbnRfZXBvY2hfbnIgIT0gZXBvY2gpIHsKKwkJaWYgKGNvbm5lY3Rpb24tPnNlbmQuY3VycmVudF9lcG9jaF93cml0ZXMpCisJCQlkcmJkX3NlbmRfYmFycmllcihjb25uZWN0aW9uKTsKKwkJY29ubmVjdGlvbi0+c2VuZC5jdXJyZW50X2Vwb2NoX25yID0gZXBvY2g7CiAJfQogfQogCiBpbnQgd19zZW5kX291dF9vZl9zeW5jKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCiB7CiAJc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX3JlcXVlc3QsIHcpOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IG1kZXYtPnRjb25uOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb247CiAJaW50IGVycjsKIAogCWlmICh1bmxpa2VseShjYW5jZWwpKSB7CkBAIC0xMzM1LDEzICsxMzQzLDEzIEBACiAJCXJldHVybiAwOwogCX0KIAotCS8qIHRoaXMgdGltZSwgbm8gdGNvbm4tPnNlbmQuY3VycmVudF9lcG9jaF93cml0ZXMrKzsKKwkvKiB0aGlzIHRpbWUsIG5vIGNvbm5lY3Rpb24tPnNlbmQuY3VycmVudF9lcG9jaF93cml0ZXMrKzsKIAkgKiBJZiBpdCB3YXMgc2VudCwgaXQgd2FzIHRoZSBjbG9zaW5nIGJhcnJpZXIgZm9yIHRoZSBsYXN0CiAJICogcmVwbGljYXRlZCBlcG9jaCwgYmVmb3JlIHdlIHdlbnQgaW50byBBSEVBRCBtb2RlLgogCSAqIE5vIG1vcmUgYmFycmllcnMgd2lsbCBiZSBzZW50LCB1bnRpbCB3ZSBsZWF2ZSBBSEVBRCBtb2RlIGFnYWluLiAqLwotCW1heWJlX3NlbmRfYmFycmllcih0Y29ubiwgcmVxLT5lcG9jaCk7CisJbWF5YmVfc2VuZF9iYXJyaWVyKGNvbm5lY3Rpb24sIHJlcS0+ZXBvY2gpOwogCi0JZXJyID0gZHJiZF9zZW5kX291dF9vZl9zeW5jKG1kZXYsIHJlcSk7CisJZXJyID0gZHJiZF9zZW5kX291dF9vZl9zeW5jKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIHJlcSk7CiAJcmVxX21vZChyZXEsIE9PU19IQU5ERURfVE9fTkVUV09SSyk7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTM0OSwxNSArMTM1NywxNCBAQAogCiAvKioKICAqIHdfc2VuZF9kYmxvY2soKSAtIFdvcmtlciBjYWxsYmFjayB0byBzZW5kIGEgUF9EQVRBIHBhY2tldCBpbiBvcmRlciB0byBtaXJyb3IgYSB3cml0ZSByZXF1ZXN0Ci0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCiAgKiBAdzoJCXdvcmsgb2JqZWN0LgogICogQGNhbmNlbDoJVGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQgYW55d2F5cwogICovCiBpbnQgd19zZW5kX2RibG9jayhzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0LCB3KTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSBtZGV2LT50Y29ubjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uOwogCWludCBlcnI7CiAKIAlpZiAodW5saWtlbHkoY2FuY2VsKSkgewpAQCAtMTM2NSwxMSArMTM3MiwxMSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlyZV9pbml0X2lmX2ZpcnN0X3dyaXRlKHRjb25uLCByZXEtPmVwb2NoKTsKLQltYXliZV9zZW5kX2JhcnJpZXIodGNvbm4sIHJlcS0+ZXBvY2gpOwotCXRjb25uLT5zZW5kLmN1cnJlbnRfZXBvY2hfd3JpdGVzKys7CisJcmVfaW5pdF9pZl9maXJzdF93cml0ZShjb25uZWN0aW9uLCByZXEtPmVwb2NoKTsKKwltYXliZV9zZW5kX2JhcnJpZXIoY29ubmVjdGlvbiwgcmVxLT5lcG9jaCk7CisJY29ubmVjdGlvbi0+c2VuZC5jdXJyZW50X2Vwb2NoX3dyaXRlcysrOwogCi0JZXJyID0gZHJiZF9zZW5kX2RibG9jayhtZGV2LCByZXEpOworCWVyciA9IGRyYmRfc2VuZF9kYmxvY2soZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgcmVxKTsKIAlyZXFfbW9kKHJlcSwgZXJyID8gU0VORF9GQUlMRUQgOiBIQU5ERURfT1ZFUl9UT19ORVRXT1JLKTsKIAogCXJldHVybiBlcnI7CkBAIC0xMzc3LDE1ICsxMzg0LDE0IEBACiAKIC8qKgogICogd19zZW5kX3JlYWRfcmVxKCkgLSBXb3JrZXIgY2FsbGJhY2sgdG8gc2VuZCBhIHJlYWQgcmVxdWVzdCAoUF9EQVRBX1JFUVVFU1QpIHBhY2tldAotICogQG1kZXY6CURSQkQgZGV2aWNlLgogICogQHc6CQl3b3JrIG9iamVjdC4KICAqIEBjYW5jZWw6CVRoZSBjb25uZWN0aW9uIHdpbGwgYmUgY2xvc2VkIGFueXdheXMKICAqLwogaW50IHdfc2VuZF9yZWFkX3JlcShzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0LCB3KTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSBtZGV2LT50Y29ubjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uOwogCWludCBlcnI7CiAKIAlpZiAodW5saWtlbHkoY2FuY2VsKSkgewpAQCAtMTM5NSw5ICsxNDAxLDkgQEAKIAogCS8qIEV2ZW4gcmVhZCByZXF1ZXN0cyBtYXkgY2xvc2UgYSB3cml0ZSBlcG9jaCwKIAkgKiBpZiB0aGVyZSB3YXMgYW55IHlldC4gKi8KLQltYXliZV9zZW5kX2JhcnJpZXIodGNvbm4sIHJlcS0+ZXBvY2gpOworCW1heWJlX3NlbmRfYmFycmllcihjb25uZWN0aW9uLCByZXEtPmVwb2NoKTsKIAotCWVyciA9IGRyYmRfc2VuZF9kcmVxdWVzdChtZGV2LCBQX0RBVEFfUkVRVUVTVCwgcmVxLT5pLnNlY3RvciwgcmVxLT5pLnNpemUsCisJZXJyID0gZHJiZF9zZW5kX2RyZXF1ZXN0KGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIFBfREFUQV9SRVFVRVNULCByZXEtPmkuc2VjdG9yLCByZXEtPmkuc2l6ZSwKIAkJCQkgKHVuc2lnbmVkIGxvbmcpcmVxKTsKIAogCXJlcV9tb2QocmVxLCBlcnIgPyBTRU5EX0ZBSUxFRCA6IEhBTkRFRF9PVkVSX1RPX05FVFdPUkspOwpAQCAtMTQwOCwyMSArMTQxNCwyMSBAQAogaW50IHdfcmVzdGFydF9kaXNrX2lvKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCiB7CiAJc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX3JlcXVlc3QsIHcpOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAKIAlpZiAoYmlvX2RhdGFfZGlyKHJlcS0+bWFzdGVyX2JpbykgPT0gV1JJVEUgJiYgcmVxLT5ycV9zdGF0ZSAmIFJRX0lOX0FDVF9MT0cpCi0JCWRyYmRfYWxfYmVnaW5faW8obWRldiwgJnJlcS0+aSwgZmFsc2UpOworCQlkcmJkX2FsX2JlZ2luX2lvKGRldmljZSwgJnJlcS0+aSwgZmFsc2UpOwogCiAJZHJiZF9yZXFfbWFrZV9wcml2YXRlX2JpbyhyZXEsIHJlcS0+bWFzdGVyX2Jpbyk7Ci0JcmVxLT5wcml2YXRlX2Jpby0+YmlfYmRldiA9IG1kZXYtPmxkZXYtPmJhY2tpbmdfYmRldjsKKwlyZXEtPnByaXZhdGVfYmlvLT5iaV9iZGV2ID0gZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXY7CiAJZ2VuZXJpY19tYWtlX3JlcXVlc3QocmVxLT5wcml2YXRlX2Jpbyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfZHJiZF9tYXlfc3luY19ub3coc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbnQgX2RyYmRfbWF5X3N5bmNfbm93KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm9kZXYgPSBtZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqb2RldiA9IGRldmljZTsKIAlpbnQgcmVzeW5jX2FmdGVyOwogCiAJd2hpbGUgKDEpIHsKQEAgLTE0MzMsNyArMTQzOSw3IEBACiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQlpZiAocmVzeW5jX2FmdGVyID09IC0xKQogCQkJcmV0dXJuIDE7Ci0JCW9kZXYgPSBtaW5vcl90b19tZGV2KHJlc3luY19hZnRlcik7CisJCW9kZXYgPSBtaW5vcl90b19kZXZpY2UocmVzeW5jX2FmdGVyKTsKIAkJaWYgKCFvZGV2KQogCQkJcmV0dXJuIDE7CiAJCWlmICgob2Rldi0+c3RhdGUuY29ubiA+PSBDX1NZTkNfU09VUkNFICYmCkBAIC0xNDQ2LDE3ICsxNDUyLDE3IEBACiAKIC8qKgogICogX2RyYmRfcGF1c2VfYWZ0ZXIoKSAtIFBhdXNlIHJlc3luYyBvbiBhbGwgZGV2aWNlcyB0aGF0IG1heSBub3QgcmVzeW5jIG5vdwotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKgogICogQ2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0IG9ubHkgKGFkbWluIGNvbW1hbmQgYW5kIGFmdGVyX3N0YXRlX2NoKS4KICAqLwotc3RhdGljIGludCBfZHJiZF9wYXVzZV9hZnRlcihzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGludCBfZHJiZF9wYXVzZV9hZnRlcihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICpvZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqb2RldjsKIAlpbnQgaSwgcnYgPSAwOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmbWlub3JzLCBvZGV2LCBpKSB7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZkcmJkX2RldmljZXMsIG9kZXYsIGkpIHsKIAkJaWYgKG9kZXYtPnN0YXRlLmNvbm4gPT0gQ19TVEFOREFMT05FICYmIG9kZXYtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUykKIAkJCWNvbnRpbnVlOwogCQlpZiAoIV9kcmJkX21heV9zeW5jX25vdyhvZGV2KSkKQEAgLTE0NzAsMTcgKzE0NzYsMTcgQEAKIAogLyoqCiAgKiBfZHJiZF9yZXN1bWVfbmV4dCgpIC0gUmVzdW1lIHJlc3luYyBvbiBhbGwgZGV2aWNlcyB0aGF0IG1heSByZXN5bmMgbm93Ci0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBDYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQgb25seSAoYWRtaW4gY29tbWFuZCBhbmQgd29ya2VyKS4KICAqLwotc3RhdGljIGludCBfZHJiZF9yZXN1bWVfbmV4dChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGludCBfZHJiZF9yZXN1bWVfbmV4dChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICpvZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqb2RldjsKIAlpbnQgaSwgcnYgPSAwOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmbWlub3JzLCBvZGV2LCBpKSB7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZkcmJkX2RldmljZXMsIG9kZXYsIGkpIHsKIAkJaWYgKG9kZXYtPnN0YXRlLmNvbm4gPT0gQ19TVEFOREFMT05FICYmIG9kZXYtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUykKIAkJCWNvbnRpbnVlOwogCQlpZiAob2Rldi0+c3RhdGUuYWZ0cl9pc3ApIHsKQEAgLTE0OTQsMjQgKzE1MDAsMjQgQEAKIAlyZXR1cm4gcnY7CiB9CiAKLXZvaWQgcmVzdW1lX25leHRfc2coc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgcmVzdW1lX25leHRfc2coc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJd3JpdGVfbG9ja19pcnEoJmdsb2JhbF9zdGF0ZV9sb2NrKTsKLQlfZHJiZF9yZXN1bWVfbmV4dChtZGV2KTsKKwlfZHJiZF9yZXN1bWVfbmV4dChkZXZpY2UpOwogCXdyaXRlX3VubG9ja19pcnEoJmdsb2JhbF9zdGF0ZV9sb2NrKTsKIH0KIAotdm9pZCBzdXNwZW5kX290aGVyX3NnKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkIHN1c3BlbmRfb3RoZXJfc2coc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJd3JpdGVfbG9ja19pcnEoJmdsb2JhbF9zdGF0ZV9sb2NrKTsKLQlfZHJiZF9wYXVzZV9hZnRlcihtZGV2KTsKKwlfZHJiZF9wYXVzZV9hZnRlcihkZXZpY2UpOwogCXdyaXRlX3VubG9ja19pcnEoJmdsb2JhbF9zdGF0ZV9sb2NrKTsKIH0KIAogLyogY2FsbGVyIG11c3QgaG9sZCBnbG9iYWxfc3RhdGVfbG9jayAqLwotZW51bSBkcmJkX3JldF9jb2RlIGRyYmRfcmVzeW5jX2FmdGVyX3ZhbGlkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBvX21pbm9yKQorZW51bSBkcmJkX3JldF9jb2RlIGRyYmRfcmVzeW5jX2FmdGVyX3ZhbGlkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgb19taW5vcikKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICpvZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqb2RldjsKIAlpbnQgcmVzeW5jX2FmdGVyOwogCiAJaWYgKG9fbWlub3IgPT0gLTEpCkBAIC0xNTIwLDkgKzE1MjYsOSBAQAogCQlyZXR1cm4gRVJSX1JFU1lOQ19BRlRFUjsKIAogCS8qIGNoZWNrIGZvciBsb29wcyAqLwotCW9kZXYgPSBtaW5vcl90b19tZGV2KG9fbWlub3IpOworCW9kZXYgPSBtaW5vcl90b19kZXZpY2Uob19taW5vcik7CiAJd2hpbGUgKDEpIHsKLQkJaWYgKG9kZXYgPT0gbWRldikKKwkJaWYgKG9kZXYgPT0gZGV2aWNlKQogCQkJcmV0dXJuIEVSUl9SRVNZTkNfQUZURVJfQ1lDTEU7CiAKIAkJLyogWW91IGFyZSBmcmVlIHRvIGRlcGVuZCBvbiBkaXNrbGVzcywgbm9uLWV4aXN0aW5nLApAQCAtMTU0MiwzNSArMTU0OCwzNSBAQAogCQkJcmV0dXJuIE5PX0VSUk9SOwogCiAJCS8qIGZvbGxvdyB0aGUgZGVwZW5kZW5jeSBjaGFpbiAqLwotCQlvZGV2ID0gbWlub3JfdG9fbWRldihyZXN5bmNfYWZ0ZXIpOworCQlvZGV2ID0gbWlub3JfdG9fZGV2aWNlKHJlc3luY19hZnRlcik7CiAJfQogfQogCiAvKiBjYWxsZXIgbXVzdCBob2xkIGdsb2JhbF9zdGF0ZV9sb2NrICovCi12b2lkIGRyYmRfcmVzeW5jX2FmdGVyX2NoYW5nZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgZHJiZF9yZXN5bmNfYWZ0ZXJfY2hhbmdlZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgY2hhbmdlczsKIAogCWRvIHsKLQkJY2hhbmdlcyAgPSBfZHJiZF9wYXVzZV9hZnRlcihtZGV2KTsKLQkJY2hhbmdlcyB8PSBfZHJiZF9yZXN1bWVfbmV4dChtZGV2KTsKKwkJY2hhbmdlcyAgPSBfZHJiZF9wYXVzZV9hZnRlcihkZXZpY2UpOworCQljaGFuZ2VzIHw9IF9kcmJkX3Jlc3VtZV9uZXh0KGRldmljZSk7CiAJfSB3aGlsZSAoY2hhbmdlcyk7CiB9CiAKLXZvaWQgZHJiZF9yc19jb250cm9sbGVyX3Jlc2V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkIGRyYmRfcnNfY29udHJvbGxlcl9yZXNldChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgZmlmb19idWZmZXIgKnBsYW47CiAKLQlhdG9taWNfc2V0KCZtZGV2LT5yc19zZWN0X2luLCAwKTsKLQlhdG9taWNfc2V0KCZtZGV2LT5yc19zZWN0X2V2LCAwKTsKLQltZGV2LT5yc19pbl9mbGlnaHQgPSAwOworCWF0b21pY19zZXQoJmRldmljZS0+cnNfc2VjdF9pbiwgMCk7CisJYXRvbWljX3NldCgmZGV2aWNlLT5yc19zZWN0X2V2LCAwKTsKKwlkZXZpY2UtPnJzX2luX2ZsaWdodCA9IDA7CiAKIAkvKiBVcGRhdGluZyB0aGUgUkNVIHByb3RlY3RlZCBvYmplY3QgaW4gcGxhY2UgaXMgbmVjZXNzYXJ5IHNpbmNlCiAJICAgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBmcm9tIGF0b21pYyBjb250ZXh0LgogCSAgIEl0IGlzIHZhbGlkIHNpbmNlIGFsbCBvdGhlciB1cGRhdGVzIGFsc28gbGVhZCB0byBhbiBjb21wbGV0ZWx5CiAJICAgZW1wdHkgZmlmbyAqLwogCXJjdV9yZWFkX2xvY2soKTsKLQlwbGFuID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnJzX3BsYW5fcyk7CisJcGxhbiA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPnJzX3BsYW5fcyk7CiAJcGxhbi0+dG90YWwgPSAwOwogCWZpZm9fc2V0KHBsYW4sIDApOwogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtMTU3OCwxMDEgKzE1ODQsMTA0IEBACiAKIHZvaWQgc3RhcnRfcmVzeW5jX3RpbWVyX2ZuKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gKHN0cnVjdCBkcmJkX2NvbmYgKikgZGF0YTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IChzdHJ1Y3QgZHJiZF9kZXZpY2UgKikgZGF0YTsKIAotCWRyYmRfcXVldWVfd29yaygmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmbWRldi0+c3RhcnRfcmVzeW5jX3dvcmspOworCWRyYmRfcXVldWVfd29yaygmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkmZGV2aWNlLT5zdGFydF9yZXN5bmNfd29yayk7CiB9CiAKIGludCB3X3N0YXJ0X3Jlc3luYyhzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0KKwkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX2RldmljZSwgc3RhcnRfcmVzeW5jX3dvcmspOwogCi0JaWYgKGF0b21pY19yZWFkKCZtZGV2LT51bmFja2VkX2NudCkgfHwgYXRvbWljX3JlYWQoJm1kZXYtPnJzX3BlbmRpbmdfY250KSkgewotCQlkZXZfd2FybihERVYsICJ3X3N0YXJ0X3Jlc3luYyBsYXRlci4uLlxuIik7Ci0JCW1kZXYtPnN0YXJ0X3Jlc3luY190aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaLzEwOwotCQlhZGRfdGltZXIoJm1kZXYtPnN0YXJ0X3Jlc3luY190aW1lcik7CisJaWYgKGF0b21pY19yZWFkKCZkZXZpY2UtPnVuYWNrZWRfY250KSB8fCBhdG9taWNfcmVhZCgmZGV2aWNlLT5yc19wZW5kaW5nX2NudCkpIHsKKwkJZHJiZF93YXJuKGRldmljZSwgIndfc3RhcnRfcmVzeW5jIGxhdGVyLi4uXG4iKTsKKwkJZGV2aWNlLT5zdGFydF9yZXN5bmNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWi8xMDsKKwkJYWRkX3RpbWVyKCZkZXZpY2UtPnN0YXJ0X3Jlc3luY190aW1lcik7CiAJCXJldHVybiAwOwogCX0KIAotCWRyYmRfc3RhcnRfcmVzeW5jKG1kZXYsIENfU1lOQ19TT1VSQ0UpOwotCWNsZWFyX2JpdChBSEVBRF9UT19TWU5DX1NPVVJDRSwgJm1kZXYtPmZsYWdzKTsKKwlkcmJkX3N0YXJ0X3Jlc3luYyhkZXZpY2UsIENfU1lOQ19TT1VSQ0UpOworCWNsZWFyX2JpdChBSEVBRF9UT19TWU5DX1NPVVJDRSwgJmRldmljZS0+ZmxhZ3MpOwogCXJldHVybiAwOwogfQogCiAvKioKICAqIGRyYmRfc3RhcnRfcmVzeW5jKCkgLSBTdGFydCB0aGUgcmVzeW5jIHByb2Nlc3MKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQHNpZGU6CUVpdGhlciBDX1NZTkNfU09VUkNFIG9yIENfU1lOQ19UQVJHRVQKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIG1pZ2h0IGJyaW5nIHlvdSBkaXJlY3RseSBpbnRvIG9uZSBvZiB0aGUKICAqIENfUEFVU0VEX1NZTkNfKiBzdGF0ZXMuCiAgKi8KLXZvaWQgZHJiZF9zdGFydF9yZXN5bmMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX2Nvbm5zIHNpZGUpCit2b2lkIGRyYmRfc3RhcnRfcmVzeW5jKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBlbnVtIGRyYmRfY29ubnMgc2lkZSkKIHsKIAl1bmlvbiBkcmJkX3N0YXRlIG5zOwogCWludCByOwogCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPj0gQ19TWU5DX1NPVVJDRSAmJiBtZGV2LT5zdGF0ZS5jb25uIDwgQ19BSEVBRCkgewotCQlkZXZfZXJyKERFViwgIlJlc3luYyBhbHJlYWR5IHJ1bm5pbmchXG4iKTsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID49IENfU1lOQ19TT1VSQ0UgJiYgZGV2aWNlLT5zdGF0ZS5jb25uIDwgQ19BSEVBRCkgeworCQlkcmJkX2VycihkZXZpY2UsICJSZXN5bmMgYWxyZWFkeSBydW5uaW5nIVxuIik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoIXRlc3RfYml0KEJfUlNfSF9ET05FLCAmbWRldi0+ZmxhZ3MpKSB7CisJaWYgKCF0ZXN0X2JpdChCX1JTX0hfRE9ORSwgJmRldmljZS0+ZmxhZ3MpKSB7CiAJCWlmIChzaWRlID09IENfU1lOQ19UQVJHRVQpIHsKIAkJCS8qIFNpbmNlIGFwcGxpY2F0aW9uIElPIHdhcyBsb2NrZWQgb3V0IGR1cmluZyBDX1dGX0JJVE1BUF9UIGFuZAogCQkJICAgQ19XRl9TWU5DX1VVSUQgd2UgYXJlIHN0aWxsIHVubW9kaWZpZWQuIEJlZm9yZSBnb2luZyB0byBDX1NZTkNfVEFSR0VUCiAJCQkgICB3ZSBjaGVjayB0aGF0IHdlIG1pZ2h0IG1ha2UgdGhlIGRhdGEgaW5jb25zaXN0ZW50LiAqLwotCQkJciA9IGRyYmRfa2hlbHBlcihtZGV2LCAiYmVmb3JlLXJlc3luYy10YXJnZXQiKTsKKwkJCXIgPSBkcmJkX2toZWxwZXIoZGV2aWNlLCAiYmVmb3JlLXJlc3luYy10YXJnZXQiKTsKIAkJCXIgPSAociA+PiA4KSAmIDB4ZmY7CiAJCQlpZiAociA+IDApIHsKLQkJCQlkZXZfaW5mbyhERVYsICJiZWZvcmUtcmVzeW5jLXRhcmdldCBoYW5kbGVyIHJldHVybmVkICVkLCAiCisJCQkJZHJiZF9pbmZvKGRldmljZSwgImJlZm9yZS1yZXN5bmMtdGFyZ2V0IGhhbmRsZXIgcmV0dXJuZWQgJWQsICIKIAkJCQkJICJkcm9wcGluZyBjb25uZWN0aW9uLlxuIiwgcik7Ci0JCQkJY29ubl9yZXF1ZXN0X3N0YXRlKG1kZXYtPnRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKKwkJCQljb25uX3JlcXVlc3Rfc3RhdGUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CiAJCQkJcmV0dXJuOwogCQkJfQogCQl9IGVsc2UgLyogQ19TWU5DX1NPVVJDRSAqLyB7Ci0JCQlyID0gZHJiZF9raGVscGVyKG1kZXYsICJiZWZvcmUtcmVzeW5jLXNvdXJjZSIpOworCQkJciA9IGRyYmRfa2hlbHBlcihkZXZpY2UsICJiZWZvcmUtcmVzeW5jLXNvdXJjZSIpOwogCQkJciA9IChyID4+IDgpICYgMHhmZjsKIAkJCWlmIChyID4gMCkgewogCQkJCWlmIChyID09IDMpIHsKLQkJCQkJZGV2X2luZm8oREVWLCAiYmVmb3JlLXJlc3luYy1zb3VyY2UgaGFuZGxlciByZXR1cm5lZCAlZCwgIgorCQkJCQlkcmJkX2luZm8oZGV2aWNlLCAiYmVmb3JlLXJlc3luYy1zb3VyY2UgaGFuZGxlciByZXR1cm5lZCAlZCwgIgogCQkJCQkJICJpZ25vcmluZy4gT2xkIHVzZXJsYW5kIHRvb2xzPyIsIHIpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCWRldl9pbmZvKERFViwgImJlZm9yZS1yZXN5bmMtc291cmNlIGhhbmRsZXIgcmV0dXJuZWQgJWQsICIKKwkJCQkJZHJiZF9pbmZvKGRldmljZSwgImJlZm9yZS1yZXN5bmMtc291cmNlIGhhbmRsZXIgcmV0dXJuZWQgJWQsICIKIAkJCQkJCSAiZHJvcHBpbmcgY29ubmVjdGlvbi5cbiIsIHIpOwotCQkJCQljb25uX3JlcXVlc3Rfc3RhdGUobWRldi0+dGNvbm4sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOworCQkJCQljb25uX3JlcXVlc3Rfc3RhdGUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbiwKKwkJCQkJCQkgICBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKIAkJCQkJcmV0dXJuOwogCQkJCX0KIAkJCX0KIAkJfQogCX0KIAotCWlmIChjdXJyZW50ID09IG1kZXYtPnRjb25uLT53b3JrZXIudGFzaykgeworCWlmIChjdXJyZW50ID09IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPndvcmtlci50YXNrKSB7CiAJCS8qIFRoZSB3b3JrZXIgc2hvdWxkIG5vdCBzbGVlcCB3YWl0aW5nIGZvciBzdGF0ZV9tdXRleCwKIAkJICAgdGhhdCBjYW4gdGFrZSBsb25nICovCi0JCWlmICghbXV0ZXhfdHJ5bG9jayhtZGV2LT5zdGF0ZV9tdXRleCkpIHsKLQkJCXNldF9iaXQoQl9SU19IX0RPTkUsICZtZGV2LT5mbGFncyk7Ci0JCQltZGV2LT5zdGFydF9yZXN5bmNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWi81OwotCQkJYWRkX3RpbWVyKCZtZGV2LT5zdGFydF9yZXN5bmNfdGltZXIpOworCQlpZiAoIW11dGV4X3RyeWxvY2soZGV2aWNlLT5zdGF0ZV9tdXRleCkpIHsKKwkJCXNldF9iaXQoQl9SU19IX0RPTkUsICZkZXZpY2UtPmZsYWdzKTsKKwkJCWRldmljZS0+c3RhcnRfcmVzeW5jX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFovNTsKKwkJCWFkZF90aW1lcigmZGV2aWNlLT5zdGFydF9yZXN5bmNfdGltZXIpOwogCQkJcmV0dXJuOwogCQl9CiAJfSBlbHNlIHsKLQkJbXV0ZXhfbG9jayhtZGV2LT5zdGF0ZV9tdXRleCk7CisJCW11dGV4X2xvY2soZGV2aWNlLT5zdGF0ZV9tdXRleCk7CiAJfQotCWNsZWFyX2JpdChCX1JTX0hfRE9ORSwgJm1kZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoQl9SU19IX0RPTkUsICZkZXZpY2UtPmZsYWdzKTsKIAogCXdyaXRlX2xvY2tfaXJxKCZnbG9iYWxfc3RhdGVfbG9jayk7CiAJLyogRGlkIHNvbWUgY29ubmVjdGlvbiBicmVha2FnZSBvciBJTyBlcnJvciByYWNlIHdpdGggdXM/ICovCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRAotCXx8ICFnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX05FR09USUFUSU5HKSkgeworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRAorCXx8ICFnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfTkVHT1RJQVRJTkcpKSB7CiAJCXdyaXRlX3VubG9ja19pcnEoJmdsb2JhbF9zdGF0ZV9sb2NrKTsKLQkJbXV0ZXhfdW5sb2NrKG1kZXYtPnN0YXRlX211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKGRldmljZS0+c3RhdGVfbXV0ZXgpOwogCQlyZXR1cm47CiAJfQogCi0JbnMgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7CisJbnMgPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKTsKIAotCW5zLmFmdHJfaXNwID0gIV9kcmJkX21heV9zeW5jX25vdyhtZGV2KTsKKwlucy5hZnRyX2lzcCA9ICFfZHJiZF9tYXlfc3luY19ub3coZGV2aWNlKTsKIAogCW5zLmNvbm4gPSBzaWRlOwogCkBAIC0xNjgxLDQzICsxNjkwLDQzIEBACiAJZWxzZSAvKiBzaWRlID09IENfU1lOQ19TT1VSQ0UgKi8KIAkJbnMucGRzayA9IERfSU5DT05TSVNURU5UOwogCi0JciA9IF9fZHJiZF9zZXRfc3RhdGUobWRldiwgbnMsIENTX1ZFUkJPU0UsIE5VTEwpOwotCW5zID0gZHJiZF9yZWFkX3N0YXRlKG1kZXYpOworCXIgPSBfX2RyYmRfc2V0X3N0YXRlKGRldmljZSwgbnMsIENTX1ZFUkJPU0UsIE5VTEwpOworCW5zID0gZHJiZF9yZWFkX3N0YXRlKGRldmljZSk7CiAKIAlpZiAobnMuY29ubiA8IENfQ09OTkVDVEVEKQogCQlyID0gU1NfVU5LTk9XTl9FUlJPUjsKIAogCWlmIChyID09IFNTX1NVQ0NFU1MpIHsKLQkJdW5zaWduZWQgbG9uZyB0dyA9IGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpOworCQl1bnNpZ25lZCBsb25nIHR3ID0gZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKTsKIAkJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwogCQlpbnQgaTsKIAotCQltZGV2LT5yc19mYWlsZWQgICAgPSAwOwotCQltZGV2LT5yc19wYXVzZWQgICAgPSAwOwotCQltZGV2LT5yc19zYW1lX2NzdW0gPSAwOwotCQltZGV2LT5yc19sYXN0X2V2ZW50cyA9IDA7Ci0JCW1kZXYtPnJzX2xhc3Rfc2VjdF9ldiA9IDA7Ci0JCW1kZXYtPnJzX3RvdGFsICAgICA9IHR3OwotCQltZGV2LT5yc19zdGFydCAgICAgPSBub3c7CisJCWRldmljZS0+cnNfZmFpbGVkICAgID0gMDsKKwkJZGV2aWNlLT5yc19wYXVzZWQgICAgPSAwOworCQlkZXZpY2UtPnJzX3NhbWVfY3N1bSA9IDA7CisJCWRldmljZS0+cnNfbGFzdF9ldmVudHMgPSAwOworCQlkZXZpY2UtPnJzX2xhc3Rfc2VjdF9ldiA9IDA7CisJCWRldmljZS0+cnNfdG90YWwgICAgID0gdHc7CisJCWRldmljZS0+cnNfc3RhcnQgICAgID0gbm93OwogCQlmb3IgKGkgPSAwOyBpIDwgRFJCRF9TWU5DX01BUktTOyBpKyspIHsKLQkJCW1kZXYtPnJzX21hcmtfbGVmdFtpXSA9IHR3OwotCQkJbWRldi0+cnNfbWFya190aW1lW2ldID0gbm93OworCQkJZGV2aWNlLT5yc19tYXJrX2xlZnRbaV0gPSB0dzsKKwkJCWRldmljZS0+cnNfbWFya190aW1lW2ldID0gbm93OwogCQl9Ci0JCV9kcmJkX3BhdXNlX2FmdGVyKG1kZXYpOworCQlfZHJiZF9wYXVzZV9hZnRlcihkZXZpY2UpOwogCX0KIAl3cml0ZV91bmxvY2tfaXJxKCZnbG9iYWxfc3RhdGVfbG9jayk7CiAKIAlpZiAociA9PSBTU19TVUNDRVNTKSB7CiAJCS8qIHJlc2V0IHJzX2xhc3RfYmNhc3Qgd2hlbiBhIHJlc3luYyBvciB2ZXJpZnkgaXMgc3RhcnRlZCwKIAkJICogdG8gZGVhbCB3aXRoIHBvdGVudGlhbCBqaWZmaWVzIHdyYXAuICovCi0JCW1kZXYtPnJzX2xhc3RfYmNhc3QgPSBqaWZmaWVzIC0gSFo7CisJCWRldmljZS0+cnNfbGFzdF9iY2FzdCA9IGppZmZpZXMgLSBIWjsKIAotCQlkZXZfaW5mbyhERVYsICJCZWdhbiByZXN5bmMgYXMgJXMgKHdpbGwgc3luYyAlbHUgS0IgWyVsdSBiaXRzIHNldF0pLlxuIiwKKwkJZHJiZF9pbmZvKGRldmljZSwgIkJlZ2FuIHJlc3luYyBhcyAlcyAod2lsbCBzeW5jICVsdSBLQiBbJWx1IGJpdHMgc2V0XSkuXG4iLAogCQkgICAgIGRyYmRfY29ubl9zdHIobnMuY29ubiksCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpIG1kZXYtPnJzX3RvdGFsIDw8IChCTV9CTE9DS19TSElGVC0xMCksCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpIG1kZXYtPnJzX3RvdGFsKTsKKwkJICAgICAodW5zaWduZWQgbG9uZykgZGV2aWNlLT5yc190b3RhbCA8PCAoQk1fQkxPQ0tfU0hJRlQtMTApLAorCQkgICAgICh1bnNpZ25lZCBsb25nKSBkZXZpY2UtPnJzX3RvdGFsKTsKIAkJaWYgKHNpZGUgPT0gQ19TWU5DX1RBUkdFVCkKLQkJCW1kZXYtPmJtX3Jlc3luY19mbyA9IDA7CisJCQlkZXZpY2UtPmJtX3Jlc3luY19mbyA9IDA7CiAKIAkJLyogU2luY2UgcHJvdG9jb2wgOTYsIHdlIG11c3Qgc2VyaWFsaXplIGRyYmRfZ2VuX2FuZF9zZW5kX3N5bmNfdXVpZAogCQkgKiB3aXRoIHdfc2VuZF9vb3MsIG9yIHRoZSBzeW5jIHRhcmdldCB3aWxsIGdldCBjb25mdXNlZCBhcyB0bwpAQCAtMTcyNiwxMCArMTczNSwxMiBAQAogCQkgKiBkcmJkX3Jlc3luY19maW5pc2hlZCBmcm9tIGhlcmUgaW4gdGhhdCBjYXNlLgogCQkgKiBXZSBkcmJkX2dlbl9hbmRfc2VuZF9zeW5jX3V1aWQgaGVyZSBmb3IgcHJvdG9jb2wgPCA5NiwKIAkJICogYW5kIGZyb20gYWZ0ZXJfc3RhdGVfY2ggb3RoZXJ3aXNlLiAqLwotCQlpZiAoc2lkZSA9PSBDX1NZTkNfU09VUkNFICYmIG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5NikKLQkJCWRyYmRfZ2VuX2FuZF9zZW5kX3N5bmNfdXVpZChtZGV2KTsKKwkJaWYgKHNpZGUgPT0gQ19TWU5DX1NPVVJDRSAmJgorCQkgICAgZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTYpCisJCQlkcmJkX2dlbl9hbmRfc2VuZF9zeW5jX3V1aWQoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSk7CiAKLQkJaWYgKG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5NSAmJiBtZGV2LT5yc190b3RhbCA9PSAwKSB7CisJCWlmIChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5NSAmJgorCQkgICAgZGV2aWNlLT5yc190b3RhbCA9PSAwKSB7CiAJCQkvKiBUaGlzIHN0aWxsIGhhcyBhIHJhY2UgKGFib3V0IHdoZW4gZXhhY3RseSB0aGUgcGVlcnMKIAkJCSAqIGRldGVjdCBjb25uZWN0aW9uIGxvc3MpIHRoYXQgY2FuIGxlYWQgdG8gYSBmdWxsIHN5bmMKIAkJCSAqIG9uIG5leHQgaGFuZHNoYWtlLiBJbiA4LjMuOSB3ZSBmaXhlZCB0aGlzIHdpdGggZXhwbGljaXQKQEAgLTE3NDUsMzMgKzE3NTYsMzMgQEAKIAkJCQlpbnQgdGltZW87CiAKIAkJCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCQkJbmMgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKTsKKwkJCQluYyA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJCQkJdGltZW8gPSBuYy0+cGluZ19pbnQgKiBIWiArIG5jLT5waW5nX3RpbWVvICogSFogLyA5OwogCQkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aW1lbyk7CiAJCQl9Ci0JCQlkcmJkX3Jlc3luY19maW5pc2hlZChtZGV2KTsKKwkJCWRyYmRfcmVzeW5jX2ZpbmlzaGVkKGRldmljZSk7CiAJCX0KIAotCQlkcmJkX3JzX2NvbnRyb2xsZXJfcmVzZXQobWRldik7Ci0JCS8qIG5zLmNvbm4gbWF5IGFscmVhZHkgYmUgIT0gbWRldi0+c3RhdGUuY29ubiwKKwkJZHJiZF9yc19jb250cm9sbGVyX3Jlc2V0KGRldmljZSk7CisJCS8qIG5zLmNvbm4gbWF5IGFscmVhZHkgYmUgIT0gZGV2aWNlLT5zdGF0ZS5jb25uLAogCQkgKiB3ZSBtYXkgaGF2ZSBiZWVuIHBhdXNlZCBpbiBiZXR3ZWVuLCBvciBiZWNvbWUgcGF1c2VkIHVudGlsCiAJCSAqIHRoZSB0aW1lciB0cmlnZ2Vycy4KIAkJICogTm8gbWF0dGVyLCB0aGF0IGlzIGhhbmRsZWQgaW4gcmVzeW5jX3RpbWVyX2ZuKCkgKi8KIAkJaWYgKG5zLmNvbm4gPT0gQ19TWU5DX1RBUkdFVCkKLQkJCW1vZF90aW1lcigmbWRldi0+cmVzeW5jX3RpbWVyLCBqaWZmaWVzKTsKKwkJCW1vZF90aW1lcigmZGV2aWNlLT5yZXN5bmNfdGltZXIsIGppZmZpZXMpOwogCi0JCWRyYmRfbWRfc3luYyhtZGV2KTsKKwkJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAJfQotCXB1dF9sZGV2KG1kZXYpOwotCW11dGV4X3VubG9jayhtZGV2LT5zdGF0ZV9tdXRleCk7CisJcHV0X2xkZXYoZGV2aWNlKTsKKwltdXRleF91bmxvY2soZGV2aWNlLT5zdGF0ZV9tdXRleCk7CiB9CiAKIC8qIElmIHRoZSByZXNvdXJjZSBhbHJlYWR5IGNsb3NlZCB0aGUgY3VycmVudCBlcG9jaCwgYnV0IHdlIGRpZCBub3QKICAqIChiZWNhdXNlIHdlIGhhdmUgbm90IHlldCBzZWVuIG5ldyByZXF1ZXN0cyksIHdlIHNob3VsZCBzZW5kIHRoZQogICogY29ycmVzcG9uZGluZyBiYXJyaWVyIG5vdy4gIE11c3QgYmUgY2hlY2tlZCB3aXRoaW4gdGhlIHNhbWUgc3BpbmxvY2sKICAqIHRoYXQgaXMgdXNlZCB0byBjaGVjayBmb3IgbmV3IHJlcXVlc3RzLiAqLwotYm9vbCBuZWVkX3RvX3NlbmRfYmFycmllcihzdHJ1Y3QgZHJiZF90Y29ubiAqY29ubmVjdGlvbikKK3N0YXRpYyBib29sIG5lZWRfdG9fc2VuZF9iYXJyaWVyKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7CiAJaWYgKCFjb25uZWN0aW9uLT5zZW5kLnNlZW5fYW55X3dyaXRlX3lldCkKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTc5NSw3ICsxODA2LDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBkZXF1ZXVlX3dvcmtfYmF0Y2goc3RydWN0IGRyYmRfd29ya19xdWV1ZSAqcXVldWUsIHN0cnVjdCBsaXN0X2hlYWQgKndvcmtfbGlzdCkKK3N0YXRpYyBib29sIGRlcXVldWVfd29ya19iYXRjaChzdHJ1Y3QgZHJiZF93b3JrX3F1ZXVlICpxdWV1ZSwgc3RydWN0IGxpc3RfaGVhZCAqd29ya19saXN0KQogewogCXNwaW5fbG9ja19pcnEoJnF1ZXVlLT5xX2xvY2spOwogCWxpc3Rfc3BsaWNlX2luaXQoJnF1ZXVlLT5xLCB3b3JrX2xpc3QpOwpAQCAtMTgwMyw3ICsxODE0LDcgQEAKIAlyZXR1cm4gIWxpc3RfZW1wdHkod29ya19saXN0KTsKIH0KIAotYm9vbCBkZXF1ZXVlX3dvcmtfaXRlbShzdHJ1Y3QgZHJiZF93b3JrX3F1ZXVlICpxdWV1ZSwgc3RydWN0IGxpc3RfaGVhZCAqd29ya19saXN0KQorc3RhdGljIGJvb2wgZGVxdWV1ZV93b3JrX2l0ZW0oc3RydWN0IGRyYmRfd29ya19xdWV1ZSAqcXVldWUsIHN0cnVjdCBsaXN0X2hlYWQgKndvcmtfbGlzdCkKIHsKIAlzcGluX2xvY2tfaXJxKCZxdWV1ZS0+cV9sb2NrKTsKIAlpZiAoIWxpc3RfZW1wdHkoJnF1ZXVlLT5xKSkKQEAgLTE4MTIsNyArMTgyMyw3IEBACiAJcmV0dXJuICFsaXN0X2VtcHR5KHdvcmtfbGlzdCk7CiB9CiAKLXZvaWQgd2FpdF9mb3Jfd29yayhzdHJ1Y3QgZHJiZF90Y29ubiAqY29ubmVjdGlvbiwgc3RydWN0IGxpc3RfaGVhZCAqd29ya19saXN0KQorc3RhdGljIHZvaWQgd2FpdF9mb3Jfd29yayhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgbGlzdF9oZWFkICp3b3JrX2xpc3QpCiB7CiAJREVGSU5FX1dBSVQod2FpdCk7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKQEAgLTE4NDIsNyArMTg1Myw3IEBACiAJZm9yICg7OykgewogCQlpbnQgc2VuZF9iYXJyaWVyOwogCQlwcmVwYXJlX3RvX3dhaXQoJmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLnFfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlcV9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJc3Bpbl9sb2NrKCZjb25uZWN0aW9uLT5zZW5kZXJfd29yay5xX2xvY2spOwkvKiBGSVhNRSBnZXQgcmlkIG9mIHRoaXMgb25lPyAqLwogCQkvKiBkZXF1ZXVlIHNpbmdsZSBpdGVtIG9ubHksCiAJCSAqIHdlIHN0aWxsIHVzZSBkcmJkX3F1ZXVlX3dvcmtfZnJvbnQoKSBpbiBzb21lIHBsYWNlcyAqLwpAQCAtMTg1MCwxMSArMTg2MSwxMSBAQAogCQkJbGlzdF9tb3ZlKGNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLnEubmV4dCwgd29ya19saXN0KTsKIAkJc3Bpbl91bmxvY2soJmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLnFfbG9jayk7CS8qIEZJWE1FIGdldCByaWQgb2YgdGhpcyBvbmU/ICovCiAJCWlmICghbGlzdF9lbXB0eSh3b3JrX2xpc3QpIHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlcV9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJCWJyZWFrOwogCQl9CiAJCXNlbmRfYmFycmllciA9IG5lZWRfdG9fc2VuZF9iYXJyaWVyKGNvbm5lY3Rpb24pOwotCQlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlcV9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCQlpZiAoc2VuZF9iYXJyaWVyKSB7CiAJCQlkcmJkX3NlbmRfYmFycmllcihjb25uZWN0aW9uKTsKIAkJCWNvbm5lY3Rpb24tPnNlbmQuY3VycmVudF9lcG9jaF9ucisrOwpAQCAtMTg4Myw5ICsxODk0LDkgQEAKIAogaW50IGRyYmRfd29ya2VyKHN0cnVjdCBkcmJkX3RocmVhZCAqdGhpKQogewotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IHRoaS0+dGNvbm47CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IHRoaS0+Y29ubmVjdGlvbjsKIAlzdHJ1Y3QgZHJiZF93b3JrICp3ID0gTlVMTDsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlMSVNUX0hFQUQod29ya19saXN0KTsKIAlpbnQgdm5yOwogCkBAIC0xODk1LDEyICsxOTA2LDEyIEBACiAJCS8qIGFzIGxvbmcgYXMgd2UgdXNlIGRyYmRfcXVldWVfd29ya19mcm9udCgpLAogCQkgKiB3ZSBtYXkgb25seSBkZXF1ZXVlIHNpbmdsZSB3b3JrIGl0ZW1zIGhlcmUsIG5vdCBiYXRjaGVzLiAqLwogCQlpZiAobGlzdF9lbXB0eSgmd29ya19saXN0KSkKLQkJCXdhaXRfZm9yX3dvcmsodGNvbm4sICZ3b3JrX2xpc3QpOworCQkJd2FpdF9mb3Jfd29yayhjb25uZWN0aW9uLCAmd29ya19saXN0KTsKIAogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKIAkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CiAJCQlpZiAoZ2V0X3Rfc3RhdGUodGhpKSA9PSBSVU5OSU5HKSB7Ci0JCQkJY29ubl93YXJuKHRjb25uLCAiV29ya2VyIGdvdCBhbiB1bmV4cGVjdGVkIHNpZ25hbFxuIik7CisJCQkJZHJiZF93YXJuKGNvbm5lY3Rpb24sICJXb3JrZXIgZ290IGFuIHVuZXhwZWN0ZWQgc2lnbmFsXG4iKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMTkxMiwxMCArMTkyMywxMCBAQAogCQl3aGlsZSAoIWxpc3RfZW1wdHkoJndvcmtfbGlzdCkpIHsKIAkJCXcgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ3b3JrX2xpc3QsIHN0cnVjdCBkcmJkX3dvcmssIGxpc3QpOwogCQkJbGlzdF9kZWxfaW5pdCgmdy0+bGlzdCk7Ci0JCQlpZiAody0+Y2IodywgdGNvbm4tPmNzdGF0ZSA8IENfV0ZfUkVQT1JUX1BBUkFNUykgPT0gMCkKKwkJCWlmICh3LT5jYih3LCBjb25uZWN0aW9uLT5jc3RhdGUgPCBDX1dGX1JFUE9SVF9QQVJBTVMpID09IDApCiAJCQkJY29udGludWU7Ci0JCQlpZiAodGNvbm4tPmNzdGF0ZSA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpCi0JCQkJY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX05FVFdPUktfRkFJTFVSRSksIENTX0hBUkQpOworCQkJaWYgKGNvbm5lY3Rpb24tPmNzdGF0ZSA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpCisJCQkJY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfTkVUV09SS19GQUlMVVJFKSwgQ1NfSEFSRCk7CiAJCX0KIAl9CiAKQEAgLTE5MjUsMTYgKzE5MzYsMTcgQEAKIAkJCWxpc3RfZGVsX2luaXQoJnctPmxpc3QpOwogCQkJdy0+Y2IodywgMSk7CiAJCX0KLQkJZGVxdWV1ZV93b3JrX2JhdGNoKCZ0Y29ubi0+c2VuZGVyX3dvcmssICZ3b3JrX2xpc3QpOworCQlkZXF1ZXVlX3dvcmtfYmF0Y2goJmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLCAmd29ya19saXN0KTsKIAl9IHdoaWxlICghbGlzdF9lbXB0eSgmd29ya19saXN0KSk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKSB7Ci0JCURfQVNTRVJUKG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUyAmJiBtZGV2LT5zdGF0ZS5jb25uID09IENfU1RBTkRBTE9ORSk7Ci0JCWtyZWZfZ2V0KCZtZGV2LT5rcmVmKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCURfQVNTRVJUKGRldmljZSwgZGV2aWNlLT5zdGF0ZS5kaXNrID09IERfRElTS0xFU1MgJiYgZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1RBTkRBTE9ORSk7CisJCWtyZWZfZ2V0KCZkZXZpY2UtPmtyZWYpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJZHJiZF9tZGV2X2NsZWFudXAobWRldik7Ci0JCWtyZWZfcHV0KCZtZGV2LT5rcmVmLCAmZHJiZF9taW5vcl9kZXN0cm95KTsKKwkJZHJiZF9kZXZpY2VfY2xlYW51cChkZXZpY2UpOworCQlrcmVmX3B1dCgmZGV2aWNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKTsKIAkJcmN1X3JlYWRfbG9jaygpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3dyYXBwZXJzLmggYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF93cmFwcGVycy5oCmluZGV4IDMyOGYxOGUuLjNkYjllYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3dyYXBwZXJzLmgKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfd3JhcHBlcnMuaApAQCAtOSwxMiArOSwxMiBAQAogZXh0ZXJuIGNoYXIgKmRyYmRfc2VjX2hvbGRlcjsKIAogLyogc2V0cyB0aGUgbnVtYmVyIG9mIDUxMiBieXRlIHNlY3RvcnMgb2Ygb3VyIHZpcnR1YWwgZGV2aWNlICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZHJiZF9zZXRfbXlfY2FwYWNpdHkoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcmJkX3NldF9teV9jYXBhY2l0eShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJCQkJc2VjdG9yX3Qgc2l6ZSkKIHsKLQkvKiBzZXRfY2FwYWNpdHkobWRldi0+dGhpc19iZGV2LT5iZF9kaXNrLCBzaXplKTsgKi8KLQlzZXRfY2FwYWNpdHkobWRldi0+dmRpc2ssIHNpemUpOwotCW1kZXYtPnRoaXNfYmRldi0+YmRfaW5vZGUtPmlfc2l6ZSA9IChsb2ZmX3Qpc2l6ZSA8PCA5OworCS8qIHNldF9jYXBhY2l0eShkZXZpY2UtPnRoaXNfYmRldi0+YmRfZGlzaywgc2l6ZSk7ICovCisJc2V0X2NhcGFjaXR5KGRldmljZS0+dmRpc2ssIHNpemUpOworCWRldmljZS0+dGhpc19iZGV2LT5iZF9pbm9kZS0+aV9zaXplID0gKGxvZmZfdClzaXplIDw8IDk7CiB9CiAKICNkZWZpbmUgZHJiZF9iaW9fdXB0b2RhdGUoYmlvKSBiaW9fZmxhZ2dlZChiaW8sIEJJT19VUFRPREFURSkKQEAgLTI3LDIwICsyNywyMCBAQAogLyoKICAqIHVzZWQgdG8gc3VibWl0IG91ciBwcml2YXRlIGJpbwogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZHJiZF9nZW5lcmljX21ha2VfcmVxdWVzdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIGlubGluZSB2b2lkIGRyYmRfZ2VuZXJpY19tYWtlX3JlcXVlc3Qoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkJCSAgICAgaW50IGZhdWx0X3R5cGUsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlfX3JlbGVhc2UobG9jYWwpOwogCWlmICghYmlvLT5iaV9iZGV2KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZHJiZCVkOiBkcmJkX2dlbmVyaWNfbWFrZV9yZXF1ZXN0OiAiCiAJCQkJImJpby0+YmlfYmRldiA9PSBOVUxMXG4iLAotCQkgICAgICAgbWRldl90b19taW5vcihtZGV2KSk7CisJCSAgICAgICBkZXZpY2VfdG9fbWlub3IoZGV2aWNlKSk7CiAJCWR1bXBfc3RhY2soKTsKIAkJYmlvX2VuZGlvKGJpbywgLUVOT0RFVik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQobWRldiwgZmF1bHRfdHlwZSkpCisJaWYgKGRyYmRfaW5zZXJ0X2ZhdWx0KGRldmljZSwgZmF1bHRfdHlwZSkpCiAJCWJpb19lbmRpbyhiaW8sIC1FSU8pOwogCWVsc2UKIAkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmlvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbXRpcDMyeHgvbXRpcDMyeHguYyBiL2RyaXZlcnMvYmxvY2svbXRpcDMyeHgvbXRpcDMyeHguYwppbmRleCBkNzc3YmI3Li41OWM1YWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL210aXAzMnh4L210aXAzMnh4LmMKKysrIGIvZHJpdmVycy9ibG9jay9tdGlwMzJ4eC9tdGlwMzJ4eC5jCkBAIC0yNTIsMzggKzI1Miw0NSBAQAogCQkJCXZvaWQgKmRhdGEsCiAJCQkJaW50IHN0YXR1cykKIHsKLQlzdHJ1Y3QgbXRpcF9jbWQgKmNvbW1hbmQ7CisJc3RydWN0IG10aXBfY21kICpjbWQ7CiAJc3RydWN0IGRyaXZlcl9kYXRhICpkZCA9IGRhdGE7Ci0JaW50IGNiX3N0YXR1cyA9IHN0YXR1cyA/IC1FSU8gOiAwOworCWludCB1bmFsaWduZWQsIGNiX3N0YXR1cyA9IHN0YXR1cyA/IC1FSU8gOiAwOworCXZvaWQgKCpmdW5jKSh2b2lkICosIGludCk7CiAKIAlpZiAodW5saWtlbHkoIWRkKSB8fCB1bmxpa2VseSghcG9ydCkpCiAJCXJldHVybjsKIAotCWNvbW1hbmQgPSAmcG9ydC0+Y29tbWFuZHNbdGFnXTsKKwljbWQgPSAmcG9ydC0+Y29tbWFuZHNbdGFnXTsKIAogCWlmICh1bmxpa2VseShzdGF0dXMgPT0gUE9SVF9JUlFfVEZfRVJSKSkgewogCQlkZXZfd2FybigmcG9ydC0+ZGQtPnBkZXYtPmRldiwKIAkJCSJDb21tYW5kIHRhZyAlZCBmYWlsZWQgZHVlIHRvIFRGRVxuIiwgdGFnKTsKIAl9CiAKLQkvKiBVcHBlciBsYXllciBjYWxsYmFjayAqLwotCWlmIChsaWtlbHkoY29tbWFuZC0+YXN5bmNfY2FsbGJhY2spKQotCQljb21tYW5kLT5hc3luY19jYWxsYmFjayhjb21tYW5kLT5hc3luY19kYXRhLCBjYl9zdGF0dXMpOwotCi0JY29tbWFuZC0+YXN5bmNfY2FsbGJhY2sgPSBOVUxMOwotCWNvbW1hbmQtPmNvbXBfZnVuYyA9IE5VTEw7Ci0KLQkvKiBVbm1hcCB0aGUgRE1BIHNjYXR0ZXIgbGlzdCBlbnRyaWVzICovCi0JZG1hX3VubWFwX3NnKCZkZC0+cGRldi0+ZGV2LAotCQljb21tYW5kLT5zZywKLQkJY29tbWFuZC0+c2NhdHRlcl9lbnRzLAotCQljb21tYW5kLT5kaXJlY3Rpb24pOwotCi0JLyogQ2xlYXIgdGhlIGFsbG9jYXRlZCBhbmQgYWN0aXZlIGJpdHMgZm9yIHRoZSBjb21tYW5kICovCisJLyogQ2xlYXIgdGhlIGFjdGl2ZSBmbGFnICovCiAJYXRvbWljX3NldCgmcG9ydC0+Y29tbWFuZHNbdGFnXS5hY3RpdmUsIDApOwotCXJlbGVhc2Vfc2xvdChwb3J0LCB0YWcpOwogCi0JdXAoJnBvcnQtPmNtZF9zbG90KTsKKwkvKiBVcHBlciBsYXllciBjYWxsYmFjayAqLworCWZ1bmMgPSBjbWQtPmFzeW5jX2NhbGxiYWNrOworCWlmIChsaWtlbHkoZnVuYyAmJiBjbXB4Y2hnKCZjbWQtPmFzeW5jX2NhbGxiYWNrLCBmdW5jLCAwKSA9PSBmdW5jKSkgeworCisJCS8qIFVubWFwIHRoZSBETUEgc2NhdHRlciBsaXN0IGVudHJpZXMgKi8KKwkJZG1hX3VubWFwX3NnKCZkZC0+cGRldi0+ZGV2LAorCQkJY21kLT5zZywKKwkJCWNtZC0+c2NhdHRlcl9lbnRzLAorCQkJY21kLT5kaXJlY3Rpb24pOworCisJCWZ1bmMoY21kLT5hc3luY19kYXRhLCBjYl9zdGF0dXMpOworCQl1bmFsaWduZWQgPSBjbWQtPnVuYWxpZ25lZDsKKworCQkvKiBDbGVhciB0aGUgYWxsb2NhdGVkIGJpdCBmb3IgdGhlIGNvbW1hbmQgKi8KKwkJcmVsZWFzZV9zbG90KHBvcnQsIHRhZyk7CisKKwkJaWYgKHVubGlrZWx5KHVuYWxpZ25lZCkpCisJCQl1cCgmcG9ydC0+Y21kX3Nsb3RfdW5hbCk7CisJCWVsc2UKKwkJCXVwKCZwb3J0LT5jbWRfc2xvdCk7CisJfQogfQogCiAvKgpAQCAtNjYwLDExICs2NjcsMTIgQEAKIHsKIAlzdHJ1Y3QgbXRpcF9wb3J0ICpwb3J0ID0gKHN0cnVjdCBtdGlwX3BvcnQgKikgZGF0YTsKIAlzdHJ1Y3QgaG9zdF90b19kZXZfZmlzICpmaXM7Ci0Jc3RydWN0IG10aXBfY21kICpjb21tYW5kOwotCWludCB0YWcsIGNtZHRvX2NudCA9IDA7CisJc3RydWN0IG10aXBfY21kICpjbWQ7CisJaW50IHVuYWxpZ25lZCwgdGFnLCBjbWR0b19jbnQgPSAwOwogCXVuc2lnbmVkIGludCBiaXQsIGdyb3VwOwogCXVuc2lnbmVkIGludCBudW1fY29tbWFuZF9zbG90czsKIAl1bnNpZ25lZCBsb25nIHRvLCB0YWdhY2N1bVtTTE9UQklUU19JTl9MT05HU107CisJdm9pZCAoKmZ1bmMpKHZvaWQgKiwgaW50KTsKIAogCWlmICh1bmxpa2VseSghcG9ydCkpCiAJCXJldHVybjsKQEAgLTY5NCw4ICs3MDIsOCBAQAogCQkJZ3JvdXAgPSB0YWcgPj4gNTsKIAkJCWJpdCA9IHRhZyAmIDB4MUY7CiAKLQkJCWNvbW1hbmQgPSAmcG9ydC0+Y29tbWFuZHNbdGFnXTsKLQkJCWZpcyA9IChzdHJ1Y3QgaG9zdF90b19kZXZfZmlzICopIGNvbW1hbmQtPmNvbW1hbmQ7CisJCQljbWQgPSAmcG9ydC0+Y29tbWFuZHNbdGFnXTsKKwkJCWZpcyA9IChzdHJ1Y3QgaG9zdF90b19kZXZfZmlzICopIGNtZC0+Y29tbWFuZDsKIAogCQkJc2V0X2JpdCh0YWcsIHRhZ2FjY3VtKTsKIAkJCWNtZHRvX2NudCsrOwpAQCAtNzA5LDI3ICs3MTcsMzAgQEAKIAkJCSAqLwogCQkJd3JpdGVsKDEgPDwgYml0LCBwb3J0LT5jb21wbGV0ZWRbZ3JvdXBdKTsKIAotCQkJLyogQ2FsbCB0aGUgYXN5bmMgY29tcGxldGlvbiBjYWxsYmFjay4gKi8KLQkJCWlmIChsaWtlbHkoY29tbWFuZC0+YXN5bmNfY2FsbGJhY2spKQotCQkJCWNvbW1hbmQtPmFzeW5jX2NhbGxiYWNrKGNvbW1hbmQtPmFzeW5jX2RhdGEsCi0JCQkJCQkJIC1FSU8pOwotCQkJY29tbWFuZC0+YXN5bmNfY2FsbGJhY2sgPSBOVUxMOwotCQkJY29tbWFuZC0+Y29tcF9mdW5jID0gTlVMTDsKLQotCQkJLyogVW5tYXAgdGhlIERNQSBzY2F0dGVyIGxpc3QgZW50cmllcyAqLwotCQkJZG1hX3VubWFwX3NnKCZwb3J0LT5kZC0+cGRldi0+ZGV2LAotCQkJCQljb21tYW5kLT5zZywKLQkJCQkJY29tbWFuZC0+c2NhdHRlcl9lbnRzLAotCQkJCQljb21tYW5kLT5kaXJlY3Rpb24pOwotCi0JCQkvKgotCQkJICogQ2xlYXIgdGhlIGFsbG9jYXRlZCBiaXQgYW5kIGFjdGl2ZSB0YWcgZm9yIHRoZQotCQkJICogY29tbWFuZC4KLQkJCSAqLworCQkJLyogQ2xlYXIgdGhlIGFjdGl2ZSBmbGFnIGZvciB0aGUgY29tbWFuZCAqLwogCQkJYXRvbWljX3NldCgmcG9ydC0+Y29tbWFuZHNbdGFnXS5hY3RpdmUsIDApOwotCQkJcmVsZWFzZV9zbG90KHBvcnQsIHRhZyk7CiAKLQkJCXVwKCZwb3J0LT5jbWRfc2xvdCk7CisJCQlmdW5jID0gY21kLT5hc3luY19jYWxsYmFjazsKKwkJCWlmIChmdW5jICYmCisJCQkgICAgY21weGNoZygmY21kLT5hc3luY19jYWxsYmFjaywgZnVuYywgMCkgPT0gZnVuYykgeworCisJCQkJLyogVW5tYXAgdGhlIERNQSBzY2F0dGVyIGxpc3QgZW50cmllcyAqLworCQkJCWRtYV91bm1hcF9zZygmcG9ydC0+ZGQtPnBkZXYtPmRldiwKKwkJCQkJCWNtZC0+c2csCisJCQkJCQljbWQtPnNjYXR0ZXJfZW50cywKKwkJCQkJCWNtZC0+ZGlyZWN0aW9uKTsKKworCQkJCWZ1bmMoY21kLT5hc3luY19kYXRhLCAtRUlPKTsKKwkJCQl1bmFsaWduZWQgPSBjbWQtPnVuYWxpZ25lZDsKKworCQkJCS8qIENsZWFyIHRoZSBhbGxvY2F0ZWQgYml0IGZvciB0aGUgY29tbWFuZC4gKi8KKwkJCQlyZWxlYXNlX3Nsb3QocG9ydCwgdGFnKTsKKworCQkJCWlmICh1bmFsaWduZWQpCisJCQkJCXVwKCZwb3J0LT5jbWRfc2xvdF91bmFsKTsKKwkJCQllbHNlCisJCQkJCXVwKCZwb3J0LT5jbWRfc2xvdCk7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTQyMTMsNiArNDIyNCw3IEBACiAJYmxrX3F1ZXVlX21heF9od19zZWN0b3JzKGRkLT5xdWV1ZSwgMHhmZmZmKTsKIAlibGtfcXVldWVfbWF4X3NlZ21lbnRfc2l6ZShkZC0+cXVldWUsIDB4NDAwMDAwKTsKIAlibGtfcXVldWVfaW9fbWluKGRkLT5xdWV1ZSwgNDA5Nik7CisJYmxrX3F1ZXVlX2JvdW5jZV9saW1pdChkZC0+cXVldWUsIGRkLT5wZGV2LT5kbWFfbWFzayk7CiAKIAkvKgogCSAqIHdyaXRlIGJhY2sgY2FjaGUgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgZGV2aWNlLiBGVUEgZGVwZW5kcyBvbgpAQCAtNDYxNSw3ICs0NjI3LDcgQEAKIAlpZiAocnYpIHsKIAkJZGV2X3dhcm4oJnBkZXYtPmRldiwKIAkJCSJVbmFibGUgdG8gZW5hYmxlIE1TSSBpbnRlcnJ1cHQuXG4iKTsKLQkJZ290byBibG9ja19pbml0aWFsaXplX2VycjsKKwkJZ290byBtc2lfaW5pdGlhbGl6ZV9lcnI7CiAJfQogCiAJLyogSW5pdGlhbGl6ZSB0aGUgYmxvY2sgbGF5ZXIuICovCkBAIC00NjQ1LDYgKzQ2NTcsOCBAQAogCiBibG9ja19pbml0aWFsaXplX2VycjoKIAlwY2lfZGlzYWJsZV9tc2kocGRldik7CisKK21zaV9pbml0aWFsaXplX2VycjoKIAlpZiAoZGQtPmlzcl93b3JrcSkgewogCQlmbHVzaF93b3JrcXVldWUoZGQtPmlzcl93b3JrcSk7CiAJCWRlc3Ryb3lfd29ya3F1ZXVlKGRkLT5pc3Jfd29ya3EpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9tdGlwMzJ4eC9tdGlwMzJ4eC5oIGIvZHJpdmVycy9ibG9jay9tdGlwMzJ4eC9tdGlwMzJ4eC5oCmluZGV4IDU0MTc0Y2IuLmZmYjk1NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbXRpcDMyeHgvbXRpcDMyeHguaAorKysgYi9kcml2ZXJzL2Jsb2NrL210aXAzMnh4L210aXAzMnh4LmgKQEAgLTkyLDcgKzkyLDcgQEAKIAogLyogRHJpdmVyIG5hbWUgYW5kIHZlcnNpb24gc3RyaW5ncyAqLwogI2RlZmluZSBNVElQX0RSVl9OQU1FCQkibXRpcDMyeHgiCi0jZGVmaW5lIE1USVBfRFJWX1ZFUlNJT04JIjEuMy4wIgorI2RlZmluZSBNVElQX0RSVl9WRVJTSU9OCSIxLjMuMSIKIAogLyogTWF4aW11bSBudW1iZXIgb2YgbWlub3IgZGV2aWNlIG51bWJlcnMgcGVyIGRldmljZS4gKi8KICNkZWZpbmUgTVRJUF9NQVhfTUlOT1JTCQkxNgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9udm1lLWNvcmUuYyBiL2RyaXZlcnMvYmxvY2svbnZtZS1jb3JlLmMKaW5kZXggODQ1OWU0ZS4uZGEwODVmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9udm1lLWNvcmUuYworKysgYi9kcml2ZXJzL2Jsb2NrL252bWUtY29yZS5jCkBAIC0xODM2LDMxICsxODM2LDE2IEBACiAJLyogRGVyZWdpc3RlciB0aGUgYWRtaW4gcXVldWUncyBpbnRlcnJ1cHQgKi8KIAlmcmVlX2lycShkZXYtPmVudHJ5WzBdLnZlY3RvciwgYWRtaW5xKTsKIAotCXZlY3MgPSBucl9pb19xdWV1ZXM7Ci0JZm9yIChpID0gMDsgaSA8IHZlY3M7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgbnJfaW9fcXVldWVzOyBpKyspCiAJCWRldi0+ZW50cnlbaV0uZW50cnkgPSBpOwotCWZvciAoOzspIHsKLQkJcmVzdWx0ID0gcGNpX2VuYWJsZV9tc2l4KHBkZXYsIGRldi0+ZW50cnksIHZlY3MpOwotCQlpZiAocmVzdWx0IDw9IDApCi0JCQlicmVhazsKLQkJdmVjcyA9IHJlc3VsdDsKLQl9Ci0KLQlpZiAocmVzdWx0IDwgMCkgewotCQl2ZWNzID0gbnJfaW9fcXVldWVzOwotCQlpZiAodmVjcyA+IDMyKQotCQkJdmVjcyA9IDMyOwotCQlmb3IgKDs7KSB7Ci0JCQlyZXN1bHQgPSBwY2lfZW5hYmxlX21zaV9ibG9jayhwZGV2LCB2ZWNzKTsKLQkJCWlmIChyZXN1bHQgPT0gMCkgewotCQkJCWZvciAoaSA9IDA7IGkgPCB2ZWNzOyBpKyspCi0JCQkJCWRldi0+ZW50cnlbaV0udmVjdG9yID0gaSArIHBkZXYtPmlycTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAocmVzdWx0IDwgMCkgewotCQkJCXZlY3MgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQkJdmVjcyA9IHJlc3VsdDsKKwl2ZWNzID0gcGNpX2VuYWJsZV9tc2l4X3JhbmdlKHBkZXYsIGRldi0+ZW50cnksIDEsIG5yX2lvX3F1ZXVlcyk7CisJaWYgKHZlY3MgPCAwKSB7CisJCXZlY3MgPSBwY2lfZW5hYmxlX21zaV9yYW5nZShwZGV2LCAxLCBtaW4obnJfaW9fcXVldWVzLCAzMikpOworCQlpZiAodmVjcyA8IDApIHsKKwkJCXZlY3MgPSAxOworCQl9IGVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IHZlY3M7IGkrKykKKwkJCQlkZXYtPmVudHJ5W2ldLnZlY3RvciA9IGkgKyBwZGV2LT5pcnE7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svc2tkX21haW4uYyBiL2RyaXZlcnMvYmxvY2svc2tkX21haW4uYwppbmRleCBlYjZlMWUwZS4uYTY5ZGQ5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9za2RfbWFpbi5jCisrKyBiL2RyaXZlcnMvYmxvY2svc2tkX21haW4uYwpAQCAtMzkxMCwxOCArMzkxMCwyMiBAQAogCXN0cnVjdCBza2RfbXNpeF9lbnRyeSAqcWVudHJ5OwogCWludCBpOwogCi0JaWYgKHNrZGV2LT5tc2l4X2VudHJpZXMgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWZvciAoaSA9IDA7IGkgPCBza2Rldi0+bXNpeF9jb3VudDsgaSsrKSB7Ci0JCXFlbnRyeSA9ICZza2Rldi0+bXNpeF9lbnRyaWVzW2ldOwotCQlza2RldiA9IHFlbnRyeS0+cnNwOworCWlmIChza2Rldi0+bXNpeF9lbnRyaWVzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBza2Rldi0+bXNpeF9jb3VudDsgaSsrKSB7CisJCQlxZW50cnkgPSAmc2tkZXYtPm1zaXhfZW50cmllc1tpXTsKKwkJCXNrZGV2ID0gcWVudHJ5LT5yc3A7CiAKLQkJaWYgKHFlbnRyeS0+aGF2ZV9pcnEpCi0JCQlkZXZtX2ZyZWVfaXJxKCZza2Rldi0+cGRldi0+ZGV2LAotCQkJCSAgICAgIHFlbnRyeS0+dmVjdG9yLCBxZW50cnktPnJzcCk7CisJCQlpZiAocWVudHJ5LT5oYXZlX2lycSkKKwkJCQlkZXZtX2ZyZWVfaXJxKCZza2Rldi0+cGRldi0+ZGV2LAorCQkJCQkgICAgICBxZW50cnktPnZlY3RvciwgcWVudHJ5LT5yc3ApOworCQl9CisKKwkJa2ZyZWUoc2tkZXYtPm1zaXhfZW50cmllcyk7CiAJfQotCXBjaV9kaXNhYmxlX21zaXgoc2tkZXYtPnBkZXYpOwotCWtmcmVlKHNrZGV2LT5tc2l4X2VudHJpZXMpOworCisJaWYgKHNrZGV2LT5tc2l4X2NvdW50KQorCQlwY2lfZGlzYWJsZV9tc2l4KHNrZGV2LT5wZGV2KTsKKwogCXNrZGV2LT5tc2l4X2NvdW50ID0gMDsKIAlza2Rldi0+bXNpeF9lbnRyaWVzID0gTlVMTDsKIH0KQEAgLTM5MjksMTIgKzM5MzMsMTAgQEAKIHN0YXRpYyBpbnQgc2tkX2FjcXVpcmVfbXNpeChzdHJ1Y3Qgc2tkX2RldmljZSAqc2tkZXYpCiB7CiAJaW50IGksIHJjOwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXN0cnVjdCBtc2l4X2VudHJ5ICplbnRyaWVzID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHNrZGV2LT5wZGV2OworCXN0cnVjdCBtc2l4X2VudHJ5ICplbnRyaWVzOwogCXN0cnVjdCBza2RfbXNpeF9lbnRyeSAqcWVudHJ5OwogCi0JcGRldiA9IHNrZGV2LT5wZGV2OwotCXNrZGV2LT5tc2l4X2NvdW50ID0gU0tEX01BWF9NU0lYX0NPVU5UOwogCWVudHJpZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNpeF9lbnRyeSkgKiBTS0RfTUFYX01TSVhfQ09VTlQsCiAJCQkgIEdGUF9LRVJORUwpOwogCWlmICghZW50cmllcykKQEAgLTM5NDMsNDAgKzM5NDUsMjYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgU0tEX01BWF9NU0lYX0NPVU5UOyBpKyspCiAJCWVudHJpZXNbaV0uZW50cnkgPSBpOwogCi0JcmMgPSBwY2lfZW5hYmxlX21zaXgocGRldiwgZW50cmllcywgU0tEX01BWF9NU0lYX0NPVU5UKTsKLQlpZiAocmMgPCAwKQorCXJjID0gcGNpX2VuYWJsZV9tc2l4X3JhbmdlKHBkZXYsIGVudHJpZXMsCisJCQkJICAgU0tEX01JTl9NU0lYX0NPVU5ULCBTS0RfTUFYX01TSVhfQ09VTlQpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIoJXMpOiBmYWlsZWQgdG8gZW5hYmxlIE1TSS1YICVkXG4iLAorCQkgICAgICAgc2tkX25hbWUoc2tkZXYpLCByYyk7CiAJCWdvdG8gbXNpeF9vdXQ7Ci0JaWYgKHJjKSB7Ci0JCWlmIChyYyA8IFNLRF9NSU5fTVNJWF9DT1VOVCkgewotCQkJcHJfZXJyKCIoJXMpOiBmYWlsZWQgdG8gZW5hYmxlIE1TSS1YICVkXG4iLAotCQkJICAgICAgIHNrZF9uYW1lKHNrZGV2KSwgcmMpOwotCQkJZ290byBtc2l4X291dDsKLQkJfQotCQlwcl9kZWJ1ZygiJXM6JXM6JWQgJXM6IDwlcz4gYWxsb2NhdGVkICVkIE1TSS1YIHZlY3RvcnNcbiIsCi0JCQkgc2tkZXYtPm5hbWUsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJCSBwY2lfbmFtZShwZGV2KSwgc2tkZXYtPm5hbWUsIHJjKTsKLQotCQlza2Rldi0+bXNpeF9jb3VudCA9IHJjOwotCQlyYyA9IHBjaV9lbmFibGVfbXNpeChwZGV2LCBlbnRyaWVzLCBza2Rldi0+bXNpeF9jb3VudCk7Ci0JCWlmIChyYykgewotCQkJcHJfZXJyKCIoJXMpOiBmYWlsZWQgdG8gZW5hYmxlIE1TSS1YICIKLQkJCSAgICAgICAic3VwcG9ydCAoJWQpICVkXG4iLAotCQkJICAgICAgIHNrZF9uYW1lKHNrZGV2KSwgc2tkZXYtPm1zaXhfY291bnQsIHJjKTsKLQkJCWdvdG8gbXNpeF9vdXQ7Ci0JCX0KIAl9CisKKwlza2Rldi0+bXNpeF9jb3VudCA9IHJjOwogCXNrZGV2LT5tc2l4X2VudHJpZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2tkX21zaXhfZW50cnkpICoKIAkJCQkgICAgICBza2Rldi0+bXNpeF9jb3VudCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFza2Rldi0+bXNpeF9lbnRyaWVzKSB7CiAJCXJjID0gLUVOT01FTTsKLQkJc2tkZXYtPm1zaXhfY291bnQgPSAwOwogCQlwcl9lcnIoIiglcyk6IG1zaXggdGFibGUgYWxsb2NhdGlvbiBlcnJvclxuIiwKIAkJICAgICAgIHNrZF9uYW1lKHNrZGV2KSk7CiAJCWdvdG8gbXNpeF9vdXQ7CiAJfQogCi0JcWVudHJ5ID0gc2tkZXYtPm1zaXhfZW50cmllczsKIAlmb3IgKGkgPSAwOyBpIDwgc2tkZXYtPm1zaXhfY291bnQ7IGkrKykgeworCQlxZW50cnkgPSAmc2tkZXYtPm1zaXhfZW50cmllc1tpXTsKIAkJcWVudHJ5LT52ZWN0b3IgPSBlbnRyaWVzW2ldLnZlY3RvcjsKIAkJcWVudHJ5LT5lbnRyeSA9IGVudHJpZXNbaV0uZW50cnk7CiAJCXFlbnRyeS0+cnNwID0gTlVMTDsKQEAgLTM5ODUsMTEgKzM5NzMsMTAgQEAKIAkJCSBza2Rldi0+bmFtZSwgX19mdW5jX18sIF9fTElORV9fLAogCQkJIHBjaV9uYW1lKHBkZXYpLCBza2Rldi0+bmFtZSwKIAkJCSBpLCBxZW50cnktPnZlY3RvciwgcWVudHJ5LT5lbnRyeSk7Ci0JCXFlbnRyeSsrOwogCX0KIAogCS8qIEVuYWJsZSBNU0ktWCB2ZWN0b3JzIGZvciB0aGUgYmFzZSBxdWV1ZSAqLwotCWZvciAoaSA9IDA7IGkgPCBTS0RfTUFYX01TSVhfQ09VTlQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBza2Rldi0+bXNpeF9jb3VudDsgaSsrKSB7CiAJCXFlbnRyeSA9ICZza2Rldi0+bXNpeF9lbnRyaWVzW2ldOwogCQlzbnByaW50ZihxZW50cnktPmlzcl9uYW1lLCBzaXplb2YocWVudHJ5LT5pc3JfbmFtZSksCiAJCQkgIiVzJWQtbXNpeCAlcyIsIERSVl9OQU1FLCBza2Rldi0+ZGV2bm8sCkBAIC00MDQ1LDggKzQwMzIsOCBAQAogCWNhc2UgU0tEX0lSUV9NU0k6CiAJCXNucHJpbnRmKHNrZGV2LT5pc3JfbmFtZSwgc2l6ZW9mKHNrZGV2LT5pc3JfbmFtZSksICIlcyVkLW1zaSIsCiAJCQkgRFJWX05BTUUsIHNrZGV2LT5kZXZubyk7Ci0JCXJjID0gcGNpX2VuYWJsZV9tc2kocGRldik7Ci0JCWlmICghcmMpIHsKKwkJcmMgPSBwY2lfZW5hYmxlX21zaV9yYW5nZShwZGV2LCAxLCAxKTsKKwkJaWYgKHJjID4gMCkgewogCQkJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIHBkZXYtPmlycSwgc2tkX2lzciwgMCwKIAkJCQkJICAgICAgc2tkZXYtPmlzcl9uYW1lLCBza2Rldik7CiAJCQlpZiAocmMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svc3dpbTMuYyBiL2RyaXZlcnMvYmxvY2svc3dpbTMuYwppbmRleCAyMGUwNjFjMy4uYzc0ZjdiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9zd2ltMy5jCisrKyBiL2RyaXZlcnMvYmxvY2svc3dpbTMuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2RiZG1hLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KQEAgLTg0MCwxNCArODQxLDE3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnN3aW0zX2xvY2ssIGZsYWdzKTsKIAlpZiAoZnMtPnN0YXRlICE9IGlkbGUgJiYgZnMtPnN0YXRlICE9IGF2YWlsYWJsZSkgewogCQkrK2ZzLT53YW50ZWQ7Ci0JCXdoaWxlIChmcy0+c3RhdGUgIT0gYXZhaWxhYmxlKSB7CisJCS8qIHRoaXMgd2lsbCBlbmFibGUgaXJxcyBpbiBvcmRlciB0byBzbGVlcCAqLworCQlpZiAoIWludGVycnVwdGlibGUpCisJCQl3YWl0X2V2ZW50X2xvY2tfaXJxKGZzLT53YWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLT5zdGF0ZSA9PSBhdmFpbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpbTNfbG9jayk7CisJCWVsc2UgaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV9sb2NrX2lycShmcy0+d2FpdCwKKwkJCQkJZnMtPnN0YXRlID09IGF2YWlsYWJsZSwKKwkJCQkJc3dpbTNfbG9jaykpIHsKKwkJCS0tZnMtPndhbnRlZDsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN3aW0zX2xvY2ssIGZsYWdzKTsKLQkJCWlmIChpbnRlcnJ1cHRpYmxlICYmIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJLS1mcy0+d2FudGVkOwotCQkJCXJldHVybiAtRUlOVFI7Ci0JCQl9Ci0JCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZmcy0+d2FpdCk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3dpbTNfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC1FSU5UUjsKIAkJfQogCQktLWZzLT53YW50ZWQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMgYi9kcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYwppbmRleCBiMWNiM2Y0Li4wZWFjZTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYworKysgYi9kcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYwpAQCAtNDkwLDEzICs0OTAsMTQgQEAKIAkuZmxhZ3MJCT0gQkxLX01RX0ZfU0hPVUxEX01FUkdFLAogfTsKIAotc3RhdGljIHZvaWQgdmlydGJsa19pbml0X3Zicih2b2lkICpkYXRhLCBzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eCwKK3N0YXRpYyBpbnQgdmlydGJsa19pbml0X3Zicih2b2lkICpkYXRhLCBzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eCwKIAkJCSAgICAgc3RydWN0IHJlcXVlc3QgKnJxLCB1bnNpZ25lZCBpbnQgbnIpCiB7CiAJc3RydWN0IHZpcnRpb19ibGsgKnZibGsgPSBkYXRhOwogCXN0cnVjdCB2aXJ0YmxrX3JlcSAqdmJyID0gcnEtPnNwZWNpYWw7CiAKIAlzZ19pbml0X3RhYmxlKHZici0+c2csIHZibGstPnNnX2VsZW1zKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB2aXJ0YmxrX3Byb2JlKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9idXMvbXZlYnUtbWJ1cy5jIGIvZHJpdmVycy9idXMvbXZlYnUtbWJ1cy5jCmluZGV4IDcyNWM0NjEuLjJhYzc1NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYnVzL212ZWJ1LW1idXMuYworKysgYi9kcml2ZXJzL2J1cy9tdmVidS1tYnVzLmMKQEAgLTg3MCwxNCArODcwLDE0IEBACiAJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkobnAsICJwY2llLW1lbS1hcGVydHVyZSIsIHJlZywgQVJSQVlfU0laRShyZWcpKTsKIAlpZiAoIXJldCkgewogCQltZW0tPnN0YXJ0ID0gcmVnWzBdOwotCQltZW0tPmVuZCA9IG1lbS0+c3RhcnQgKyByZWdbMV07CisJCW1lbS0+ZW5kID0gbWVtLT5zdGFydCArIHJlZ1sxXSAtIDE7CiAJCW1lbS0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKIAl9CiAKIAlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShucCwgInBjaWUtaW8tYXBlcnR1cmUiLCByZWcsIEFSUkFZX1NJWkUocmVnKSk7CiAJaWYgKCFyZXQpIHsKIAkJaW8tPnN0YXJ0ID0gcmVnWzBdOwotCQlpby0+ZW5kID0gaW8tPnN0YXJ0ICsgcmVnWzFdOworCQlpby0+ZW5kID0gaW8tPnN0YXJ0ICsgcmVnWzFdIC0gMTsKIAkJaW8tPmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2Zyb250ZW5kLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2Zyb250ZW5kLmMKaW5kZXggMWIxOTIzOS4uODEyMWI0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9mcm9udGVuZC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvZnJvbnRlbmQuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvYWdwZ2FydC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9nZW5lcmljLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYwppbmRleCBmMzk0MzdhLi4wZmJjY2NlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYwpAQCAtMjksNyArMjksNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtZ3R0LmMgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWd0dC5jCmluZGV4IDVjODUzNTAuLjlhMDI0ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtZ3R0LmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1ndHQuYwpAQCAtMTcsNyArMTcsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9hZ3BfYmFja2VuZC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9zZ2ktYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL3NnaS1hZ3AuYwppbmRleCAwNWI4ZDAyLi4zMDUxYzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL3NnaS1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL3NnaS1hZ3AuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KICNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KICNpbmNsdWRlIDxhc20vc24vaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vYmNtMjgzNS1ybmcuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vYmNtMjgzNS1ybmcuYwppbmRleCA0MzU3N2NhLi44YzNiMjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2JjbTI4MzUtcm5nLmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9iY20yODM1LXJuZy5jCkBAIC04LDcgKzgsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9od19yYW5kb20uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vY29yZS5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9jb3JlLmMKaW5kZXggYTBmNzcyNC4uYjk0OTVhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9jb3JlLmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9jb3JlLmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vZXh5bm9zLXJuZy5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9leHlub3Mtcm5nLmMKaW5kZXggNDAyY2NmYi4uOWY4Mjc3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9leHlub3Mtcm5nLmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9leHlub3Mtcm5nLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9od19yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vbjItZHJ2LmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL24yLWRydi5jCmluZGV4IGY5YmVlZDUuLjQzMjIzMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vbjItZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9uMi1kcnYuYwpAQCAtNyw3ICs3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL25vbWFkaWstcm5nLmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL25vbWFkaWstcm5nLmMKaW5kZXggMjMyYjg3Zi4uMDBlOWQyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9ub21hZGlrLXJuZy5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vbm9tYWRpay1ybmcuYwpAQCAtMTAsNyArMTAsNiBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvaHdfcmFuZG9tLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL29jdGVvbi1ybmcuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vb2N0ZW9uLXJuZy5jCmluZGV4IGYyODg1ZGIuLmI1Y2MzNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vb2N0ZW9uLXJuZy5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vb2N0ZW9uLXJuZy5jCkBAIC0xMCw3ICsxMCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9od19yYW5kb20uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKaW5kZXggMDNmNDE4OS4uYjdlZmQzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKQEAgLTYxLDcgKzYxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pcG1pX3NtaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgImlwbWlfc2lfc20uaCIKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tZW0uYyBiL2RyaXZlcnMvY2hhci9tZW0uYwppbmRleCA5MmM1OTM3Li45MTc0MDNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWVtLmMKKysrIGIvZHJpdmVycy9jaGFyL21lbS5jCkBAIC05OSw2ICs5OSw5IEBACiAJc3NpemVfdCByZWFkLCBzejsKIAljaGFyICpwdHI7CiAKKwlpZiAocCAhPSAqcHBvcykKKwkJcmV0dXJuIDA7CisKIAlpZiAoIXZhbGlkX3BoeXNfYWRkcl9yYW5nZShwLCBjb3VudCkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJlYWQgPSAwOwpAQCAtMTU3LDYgKzE2MCw5IEBACiAJdW5zaWduZWQgbG9uZyBjb3BpZWQ7CiAJdm9pZCAqcHRyOwogCisJaWYgKHAgIT0gKnBwb3MpCisJCXJldHVybiAtRUZCSUc7CisKIAlpZiAoIXZhbGlkX3BoeXNfYWRkcl9yYW5nZShwLCBjb3VudCkpCiAJCXJldHVybiAtRUZBVUxUOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvMzc4MGkuYyBiL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jCmluZGV4IDg4MWM5ZTUuLjI4NzQwMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jCkBAIC01MCw3ICs1MCw2IEBACiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JLyogY29uZF9yZXNjaGVkKCkgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RpbGUtc3JvbS5jIGIvZHJpdmVycy9jaGFyL3RpbGUtc3JvbS5jCmluZGV4IDBlNTA2YmEuLmJkMzc3NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90aWxlLXNyb20uYworKysgYi9kcml2ZXJzL2NoYXIvdGlsZS1zcm9tLmMKQEAgLTIwLDcgKzIwLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBwcmludGsoKSAqLwogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JCS8qIGttYWxsb2MoKSAqLwogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CQkvKiBldmVyeXRoaW5nLi4uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9pMmNfaW5maW5lb24uYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX2kyY19pbmZpbmVvbi5jCmluZGV4IDUyYjliMmIuLjQ3MmFmNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vdHBtX2kyY19pbmZpbmVvbi5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX2kyY19pbmZpbmVvbi5jCkBAIC0yMSw3ICsyMSw2IEBACiAgKgogICoKICAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9pMmNfc3RtX3N0MzMuYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX2kyY19zdG1fc3QzMy5jCmluZGV4IDViMGRkOGUuLjNiN2JmMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vdHBtX2kyY19zdG1fc3QzMy5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX2kyY19zdG1fc3QzMy5jCkBAIC0zOCw3ICszOCw2IEBACiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZwppbmRleCBjZDY5NTBmLi41MmU5MzI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL0tjb25maWcKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9LY29uZmlnCkBAIC0xNDAsMyArMTQwLDUxIEBACiAJYm9vbAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIFBlcmlvZCBJbnRlcnJ1cHQgVGltZXIgb24gRnJlZXNjYWxlIFZ5YnJpZCBGYW1pbHkgU29Dcy4KKworY29uZmlnIFNZU19TVVBQT1JUU19TSF9DTVQKKyAgICAgICAgYm9vbAorCitjb25maWcgU1lTX1NVUFBPUlRTX1NIX01UVTIKKyAgICAgICAgYm9vbAorCitjb25maWcgU1lTX1NVUFBPUlRTX1NIX1RNVQorICAgICAgICBib29sCisKK2NvbmZpZyBTWVNfU1VQUE9SVFNfRU1fU1RJCisgICAgICAgIGJvb2wKKworY29uZmlnIFNIX1RJTUVSX0NNVAorCWJvb2wgIlJlbmVzYXMgQ01UIHRpbWVyIGRyaXZlciIgaWYgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBHRU5FUklDX0NMT0NLRVZFTlRTCisJZGVmYXVsdCBTWVNfU1VQUE9SVFNfU0hfQ01UCisJaGVscAorCSAgVGhpcyBlbmFibGVzIGJ1aWxkIG9mIGEgY2xvY2tzb3VyY2UgYW5kIGNsb2NrZXZlbnQgZHJpdmVyIGZvcgorCSAgdGhlIENvbXBhcmUgTWF0Y2ggVGltZXIgKENNVCkgaGFyZHdhcmUgYXZhaWxhYmxlIGluIDE2LzMyLzQ4LWJpdAorCSAgdmFyaWFudHMgb24gYSB3aWRlIHJhbmdlIG9mIE1vYmlsZSBhbmQgQXV0b21vdGl2ZSBTb0NzIGZyb20gUmVuZXNhcy4KKworY29uZmlnIFNIX1RJTUVSX01UVTIKKwlib29sICJSZW5lc2FzIE1UVTIgdGltZXIgZHJpdmVyIiBpZiBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKKwlkZWZhdWx0IFNZU19TVVBQT1JUU19TSF9NVFUyCisJaGVscAorCSAgVGhpcyBlbmFibGVzIGJ1aWxkIG9mIGEgY2xvY2tldmVudCBkcml2ZXIgZm9yIHRoZSBNdWx0aS1GdW5jdGlvbgorCSAgVGltZXIgUHVsc2UgVW5pdCAyIChUTVUyKSBoYXJkd2FyZSBhdmFpbGFibGUgb24gU29DcyBmcm9tIFJlbmVzYXMuCisJICBUaGlzIGhhcmR3YXJlIGNvbWVzIHdpdGggMTYgYml0LXRpbWVyIHJlZ2lzdGVycy4KKworY29uZmlnIFNIX1RJTUVSX1RNVQorCWJvb2wgIlJlbmVzYXMgVE1VIHRpbWVyIGRyaXZlciIgaWYgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBHRU5FUklDX0NMT0NLRVZFTlRTCisJZGVmYXVsdCBTWVNfU1VQUE9SVFNfU0hfVE1VCisJaGVscAorCSAgVGhpcyBlbmFibGVzIGJ1aWxkIG9mIGEgY2xvY2tzb3VyY2UgYW5kIGNsb2NrZXZlbnQgZHJpdmVyIGZvcgorCSAgdGhlIDMyLWJpdCBUaW1lciBVbml0IChUTVUpIGhhcmR3YXJlIGF2YWlsYWJsZSBvbiBhIHdpZGUgcmFuZ2UKKwkgIFNvQ3MgZnJvbSBSZW5lc2FzLgorCitjb25maWcgRU1fVElNRVJfU1RJCisJYm9vbCAiUmVuZXNhcyBTVEkgdGltZXIgZHJpdmVyIiBpZiBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKKwlkZWZhdWx0IFNZU19TVVBQT1JUU19FTV9TVEkKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgYnVpbGQgb2YgYSBjbG9ja3NvdXJjZSBhbmQgY2xvY2tldmVudCBkcml2ZXIgZm9yCisJICB0aGUgNDgtYml0IFN5c3RlbSBUaW1lciAoU1RJKSBoYXJkd2FyZSBhdmFpbGFibGUgb24gYSBTb0NzCisJICBzdWNoIGFzIEVNRVYyIGZyb20gZm9ybWVyIE5FQyBFbGVjdHJvbmljcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvTWFrZWZpbGUgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL01ha2VmaWxlCmluZGV4IGM3Y2E1MGEuLmYzZmU0Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9NYWtlZmlsZQpAQCAtMSw2ICsxLDUgQEAKIG9iai0kKENPTkZJR19DTEtTUkNfT0YpCSs9IGNsa3NyYy1vZi5vCiBvYmotJChDT05GSUdfQVRNRUxfVENCX0NMS1NSQykJKz0gdGNiX2Nsa3NyYy5vCi1vYmotJChDT05GSUdfWDg2X0NZQ0xPTkVfVElNRVIpCSs9IGN5Y2xvbmUubwogb2JqLSQoQ09ORklHX1g4Nl9QTV9USU1FUikJKz0gYWNwaV9wbS5vCiBvYmotJChDT05GSUdfU0N4MjAwSFJfVElNRVIpCSs9IHNjeDIwMF9ocnQubwogb2JqLSQoQ09ORklHX0NTNTUzNV9DTE9DS19FVkVOVF9TUkMpCSs9IGNzNTUzNS1jbG9ja2V2dC5vCkBAIC0yMSw2ICsyMCw3IEBACiBvYmotJChDT05GSUdfQVJDSF9NT1hBUlQpCSs9IG1veGFydF90aW1lci5vCiBvYmotJChDT05GSUdfQVJDSF9NWFMpCQkrPSBteHNfdGltZXIubwogb2JqLSQoQ09ORklHX0FSQ0hfUFJJTUEyKQkrPSB0aW1lci1wcmltYTIubworb2JqLSQoQ09ORklHX0FSQ0hfVTMwMCkJCSs9IHRpbWVyLXUzMDAubwogb2JqLSQoQ09ORklHX1NVTjRJX1RJTUVSKQkrPSBzdW40aV90aW1lci5vCiBvYmotJChDT05GSUdfU1VONUlfSFNUSU1FUikJKz0gdGltZXItc3VuNWkubwogb2JqLSQoQ09ORklHX0FSQ0hfVEVHUkEpCSs9IHRlZ3JhMjBfdGltZXIubwpAQCAtMzcsMyArMzcsNCBAQAogb2JqLSQoQ09ORklHX0FSTV9HTE9CQUxfVElNRVIpCQkrPSBhcm1fZ2xvYmFsX3RpbWVyLm8KIG9iai0kKENPTkZJR19DTEtTUkNfTUVUQUdfR0VORVJJQykJKz0gbWV0YWdfZ2VuZXJpYy5vCiBvYmotJChDT05GSUdfQVJDSF9IQVNfVElDS19CUk9BRENBU1QpCSs9IGR1bW15X3RpbWVyLm8KK29iai0kKENPTkZJR19BUkNIX0tFWVNUT05FKQkJKz0gdGltZXIta2V5c3RvbmUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9hcm1fYXJjaF90aW1lci5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9hcm1fYXJjaF90aW1lci5jCmluZGV4IDk1ZmI5NDQuLjU3ZTgyM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvYXJtX2FyY2hfdGltZXIuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2FybV9hcmNoX3RpbWVyLmMKQEAgLTI3Nyw2ICsyNzcsNyBAQAogCQkJY2xrLT5zZXRfbmV4dF9ldmVudCA9IGFyY2hfdGltZXJfc2V0X25leHRfZXZlbnRfcGh5czsKIAkJfQogCX0gZWxzZSB7CisJCWNsay0+ZmVhdHVyZXMgfD0gQ0xPQ0tfRVZUX0ZFQVRfRFlOSVJROwogCQljbGstPm5hbWUgPSAiYXJjaF9tZW1fdGltZXIiOwogCQljbGstPnJhdGluZyA9IDQwMDsKIAkJY2xrLT5jcHVtYXNrID0gY3B1X2FsbF9tYXNrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9jYWRlbmNlX3R0Y190aW1lci5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9jYWRlbmNlX3R0Y190aW1lci5jCmluZGV4IDYzZjE3NmQuLjQ5ZmJlMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvY2FkZW5jZV90dGNfdGltZXIuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2NhZGVuY2VfdHRjX3RpbWVyLmMKQEAgLTE2LDYgKzE2LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KQEAgLTUyLDYgKzUzLDggQEAKICNkZWZpbmUgVFRDX0NOVF9DTlRSTF9ESVNBQkxFX01BU0sJMHgxCiAKICNkZWZpbmUgVFRDX0NMS19DTlRSTF9DU1JDX01BU0sJCSgxIDw8IDUpCS8qIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBUVENfQ0xLX0NOVFJMX1BTVl9NQVNLCQkweDFlCisjZGVmaW5lIFRUQ19DTEtfQ05UUkxfUFNWX1NISUZUCQkxCiAKIC8qCiAgKiBTZXR1cCB0aGUgdGltZXJzIHRvIHVzZSBwcmUtc2NhbGluZywgdXNpbmcgYSBmaXhlZCB2YWx1ZSBmb3Igbm93IHRoYXQgd2lsbApAQCAtNjMsNiArNjYsOCBAQAogI2RlZmluZSBDTEtfQ05UUkxfUFJFU0NBTEVfRU4JMQogI2RlZmluZSBDTlRfQ05UUkxfUkVTRVQJCSgxIDw8IDQpCiAKKyNkZWZpbmUgTUFYX0ZfRVJSIDUwCisKIC8qKgogICogc3RydWN0IHR0Y190aW1lciAtIFRoaXMgZGVmaW5pdGlvbiBkZWZpbmVzIGxvY2FsIHRpbWVyIHN0cnVjdHVyZQogICoKQEAgLTgyLDYgKzg3LDggQEAKIAkJY29udGFpbmVyX29mKHgsIHN0cnVjdCB0dGNfdGltZXIsIGNsa19yYXRlX2NoYW5nZV9uYikKIAogc3RydWN0IHR0Y190aW1lcl9jbG9ja3NvdXJjZSB7CisJdTMyCQkJc2NhbGVfY2xrX2N0cmxfcmVnX29sZDsKKwl1MzIJCQlzY2FsZV9jbGtfY3RybF9yZWdfbmV3OwogCXN0cnVjdCB0dGNfdGltZXIJdHRjOwogCXN0cnVjdCBjbG9ja3NvdXJjZQljczsKIH07CkBAIC0yMjksMzIgKzIzNiw4OSBAQAogCQkJc3RydWN0IHR0Y190aW1lcl9jbG9ja3NvdXJjZSwgdHRjKTsKIAogCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFBPU1RfUkFURV9DSEFOR0U6Ci0JCS8qCi0JCSAqIERvIHdoYXRldmVyIGlzIG5lY2Vzc2FyeSB0byBtYWludGFpbiBhIHByb3BlciB0aW1lIGJhc2UKLQkJICoKLQkJICogSSBjYW5ub3QgZmluZCBhIHdheSB0byBhZGp1c3QgdGhlIGN1cnJlbnRseSB1c2VkIGNsb2Nrc291cmNlCi0JCSAqIHRvIHRoZSBuZXcgZnJlcXVlbmN5LiBfX2Nsb2Nrc291cmNlX3VwZGF0ZWZyZXFfaHooKSBzb3VuZHMKLQkJICogZ29vZCwgYnV0IGRvZXMgbm90IHdvcmsuIE5vdCBzdXJlIHdoYXQncyB0aGF0IG1pc3NpbmcuCi0JCSAqCi0JCSAqIFRoaXMgYXBwcm9hY2ggd29ya3MsIGJ1dCB0cmlnZ2VycyB0d28gY2xvY2tzb3VyY2Ugc3dpdGNoZXMuCi0JCSAqIFRoZSBmaXJzdCBhZnRlciB1bnJlZ2lzdGVyIHRvIGNsb2Nrc291cmNlIGppZmZpZXMuIEFuZAotCQkgKiBhbm90aGVyIG9uZSBhZnRlciB0aGUgcmVnaXN0ZXIgdG8gdGhlIG5ld2x5IHJlZ2lzdGVyZWQgdGltZXIuCi0JCSAqCi0JCSAqIEFsdGVybmF0aXZlbHkgd2UgY291bGQgJ3dhc3RlJyBhbm90aGVyIEhXIHRpbWVyIHRvIHBpbmcgcG9uZwotCQkgKiBiZXR3ZWVuIGNsb2NrIHNvdXJjZXMuIFRoYXQgd291bGQgYWxzbyB1c2Ugb25lIHJlZ2lzdGVyIGFuZAotCQkgKiBvbmUgdW5yZWdpc3RlciBjYWxsLCBidXQgb25seSB0cmlnZ2VyIG9uZSBjbG9ja3NvdXJjZSBzd2l0Y2gKLQkJICogZm9yIHRoZSBjb3N0IG9mIGFub3RoZXIgSFcgdGltZXIgdXNlZCBieSB0aGUgT1MuCi0JCSAqLwotCQljbG9ja3NvdXJjZV91bnJlZ2lzdGVyKCZ0dGNjcy0+Y3MpOwotCQljbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmdHRjY3MtPmNzLAotCQkJCW5kYXRhLT5uZXdfcmF0ZSAvIFBSRVNDQUxFKTsKLQkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBQUkVfUkFURV9DSEFOR0U6CisJeworCQl1MzIgcHN2OworCQl1bnNpZ25lZCBsb25nIGZhY3RvciwgcmF0ZV9sb3csIHJhdGVfaGlnaDsKKworCQlpZiAobmRhdGEtPm5ld19yYXRlID4gbmRhdGEtPm9sZF9yYXRlKSB7CisJCQlmYWN0b3IgPSBESVZfUk9VTkRfQ0xPU0VTVChuZGF0YS0+bmV3X3JhdGUsCisJCQkJCW5kYXRhLT5vbGRfcmF0ZSk7CisJCQlyYXRlX2xvdyA9IG5kYXRhLT5vbGRfcmF0ZTsKKwkJCXJhdGVfaGlnaCA9IG5kYXRhLT5uZXdfcmF0ZTsKKwkJfSBlbHNlIHsKKwkJCWZhY3RvciA9IERJVl9ST1VORF9DTE9TRVNUKG5kYXRhLT5vbGRfcmF0ZSwKKwkJCQkJbmRhdGEtPm5ld19yYXRlKTsKKwkJCXJhdGVfbG93ID0gbmRhdGEtPm5ld19yYXRlOworCQkJcmF0ZV9oaWdoID0gbmRhdGEtPm9sZF9yYXRlOworCQl9CisKKwkJaWYgKCFpc19wb3dlcl9vZl8yKGZhY3RvcikpCisJCQkJcmV0dXJuIE5PVElGWV9CQUQ7CisKKwkJaWYgKGFicyhyYXRlX2hpZ2ggLSAoZmFjdG9yICogcmF0ZV9sb3cpKSA+IE1BWF9GX0VSUikKKwkJCXJldHVybiBOT1RJRllfQkFEOworCisJCWZhY3RvciA9IF9faWxvZzJfdTMyKGZhY3Rvcik7CisKKwkJLyoKKwkJICogc3RvcmUgdGltZXIgY2xvY2sgY3RybCByZWdpc3RlciBzbyB3ZSBjYW4gcmVzdG9yZSBpdCBpbiBjYXNlCisJCSAqIG9mIGFuIGFib3J0LgorCQkgKi8KKwkJdHRjY3MtPnNjYWxlX2Nsa19jdHJsX3JlZ19vbGQgPQorCQkJX19yYXdfcmVhZGwodHRjY3MtPnR0Yy5iYXNlX2FkZHIgKworCQkJCQlUVENfQ0xLX0NOVFJMX09GRlNFVCk7CisKKwkJcHN2ID0gKHR0Y2NzLT5zY2FsZV9jbGtfY3RybF9yZWdfb2xkICYKKwkJCQlUVENfQ0xLX0NOVFJMX1BTVl9NQVNLKSA+PgorCQkJCVRUQ19DTEtfQ05UUkxfUFNWX1NISUZUOworCQlpZiAobmRhdGEtPm5ld19yYXRlIDwgbmRhdGEtPm9sZF9yYXRlKQorCQkJcHN2IC09IGZhY3RvcjsKKwkJZWxzZQorCQkJcHN2ICs9IGZhY3RvcjsKKworCQkvKiBwcmVzY2FsZXIgd2l0aGluIGxlZ2FsIHJhbmdlPyAqLworCQlpZiAocHN2ICYgfihUVENfQ0xLX0NOVFJMX1BTVl9NQVNLID4+IFRUQ19DTEtfQ05UUkxfUFNWX1NISUZUKSkKKwkJCXJldHVybiBOT1RJRllfQkFEOworCisJCXR0Y2NzLT5zY2FsZV9jbGtfY3RybF9yZWdfbmV3ID0gdHRjY3MtPnNjYWxlX2Nsa19jdHJsX3JlZ19vbGQgJgorCQkJflRUQ19DTEtfQ05UUkxfUFNWX01BU0s7CisJCXR0Y2NzLT5zY2FsZV9jbGtfY3RybF9yZWdfbmV3IHw9IHBzdiA8PCBUVENfQ0xLX0NOVFJMX1BTVl9TSElGVDsKKworCisJCS8qIHNjYWxlIGRvd246IGFkanVzdCBkaXZpZGVyIGluIHBvc3QtY2hhbmdlIG5vdGlmaWNhdGlvbiAqLworCQlpZiAobmRhdGEtPm5ld19yYXRlIDwgbmRhdGEtPm9sZF9yYXRlKQorCQkJcmV0dXJuIE5PVElGWV9ET05FOworCisJCS8qIHNjYWxlIHVwOiBhZGp1c3QgZGl2aWRlciBub3cgLSBiZWZvcmUgZnJlcXVlbmN5IGNoYW5nZSAqLworCQlfX3Jhd193cml0ZWwodHRjY3MtPnNjYWxlX2Nsa19jdHJsX3JlZ19uZXcsCisJCQkJdHRjY3MtPnR0Yy5iYXNlX2FkZHIgKyBUVENfQ0xLX0NOVFJMX09GRlNFVCk7CisJCWJyZWFrOworCX0KKwljYXNlIFBPU1RfUkFURV9DSEFOR0U6CisJCS8qIHNjYWxlIHVwOiBwcmUtY2hhbmdlIG5vdGlmaWNhdGlvbiBkaWQgdGhlIGFkanVzdG1lbnQgKi8KKwkJaWYgKG5kYXRhLT5uZXdfcmF0ZSA+IG5kYXRhLT5vbGRfcmF0ZSkKKwkJCXJldHVybiBOT1RJRllfT0s7CisKKwkJLyogc2NhbGUgZG93bjogYWRqdXN0IGRpdmlkZXIgbm93IC0gYWZ0ZXIgZnJlcXVlbmN5IGNoYW5nZSAqLworCQlfX3Jhd193cml0ZWwodHRjY3MtPnNjYWxlX2Nsa19jdHJsX3JlZ19uZXcsCisJCQkJdHRjY3MtPnR0Yy5iYXNlX2FkZHIgKyBUVENfQ0xLX0NOVFJMX09GRlNFVCk7CisJCWJyZWFrOworCiAJY2FzZSBBQk9SVF9SQVRFX0NIQU5HRToKKwkJLyogd2UgaGF2ZSB0byB1bmRvIHRoZSBhZGp1c3RtZW50IGluIGNhc2Ugd2Ugc2NhbGUgdXAgKi8KKwkJaWYgKG5kYXRhLT5uZXdfcmF0ZSA8IG5kYXRhLT5vbGRfcmF0ZSkKKwkJCXJldHVybiBOT1RJRllfT0s7CisKKwkJLyogcmVzdG9yZSBvcmlnaW5hbCByZWdpc3RlciB2YWx1ZSAqLworCQlfX3Jhd193cml0ZWwodHRjY3MtPnNjYWxlX2Nsa19jdHJsX3JlZ19vbGQsCisJCQkJdHRjY3MtPnR0Yy5iYXNlX2FkZHIgKyBUVENfQ0xLX0NOVFJMX09GRlNFVCk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWRlZmF1bHQ6CiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCB0dGNfc2V0dXBfY2xvY2tzb3VyY2Uoc3RydWN0IGNsayAqY2xrLCB2b2lkIF9faW9tZW0gKmJhc2UpCkBAIC0zMjEsMjUgKzM4NSwxMiBAQAogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgUE9TVF9SQVRFX0NIQU5HRToKLQl7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJLyoKLQkJICogY2xvY2tldmVudHNfdXBkYXRlX2ZyZXEgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIElSUSBkaXNhYmxlZCBvbgotCQkgKiB0aGUgQ1BVIHRoZSB0aW1lciBwcm92aWRlcyBldmVudHMgZm9yLiBUaGUgdGltZXIgd2UgdXNlIGlzCi0JCSAqIGNvbW1vbiB0byBib3RoIENQVXMsIG5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gcnVuIG9uIGJvdGgKLQkJICogY29yZXMuCi0JCSAqLwotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCWNsb2NrZXZlbnRzX3VwZGF0ZV9mcmVxKCZ0dGNjZS0+Y2UsCi0JCQkJbmRhdGEtPm5ld19yYXRlIC8gUFJFU0NBTEUpOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KIAkJLyogdXBkYXRlIGNhY2hlZCBmcmVxdWVuY3kgKi8KIAkJdHRjLT5mcmVxID0gbmRhdGEtPm5ld19yYXRlOwogCisJCWNsb2NrZXZlbnRzX3VwZGF0ZV9mcmVxKCZ0dGNjZS0+Y2UsIG5kYXRhLT5uZXdfcmF0ZSAvIFBSRVNDQUxFKTsKKwogCQkvKiBmYWxsIHRocm91Z2ggKi8KLQl9CiAJY2FzZSBQUkVfUkFURV9DSEFOR0U6CiAJY2FzZSBBQk9SVF9SQVRFX0NIQU5HRToKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9jeWNsb25lLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2N5Y2xvbmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwOTk4Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2N5Y2xvbmUuYworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoX3RpbWVyLmg+Ci0KLSNkZWZpbmUgQ1lDTE9ORV9DQkFSX0FERFIJMHhGRUIwMENEMAkvKiBiYXNlIGFkZHJlc3MgcHRyICovCi0jZGVmaW5lIENZQ0xPTkVfUE1DQ19PRkZTRVQJMHg1MUEwCQkvKiBvZmZzZXQgdG8gY29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZSBDWUNMT05FX01QQ1NfT0ZGU0VUCTB4NTFBOAkJLyogb2Zmc2V0IHRvIHNlbGVjdCByZWdpc3RlciAqLwotI2RlZmluZSBDWUNMT05FX01QTUNfT0ZGU0VUCTB4NTFEMAkJLyogb2Zmc2V0IHRvIGNvdW50IHJlZ2lzdGVyICovCi0jZGVmaW5lIENZQ0xPTkVfVElNRVJfRlJFUQk5OTc4MDAwMAkvKiAxMDBNaHosIGJ1dCBub3QgcmVhbGx5ICovCi0jZGVmaW5lIENZQ0xPTkVfVElNRVJfTUFTSwlDTE9DS1NPVVJDRV9NQVNLKDMyKSAvKiAzMiBiaXQgbWFzayAqLwotCi1pbnQgdXNlX2N5Y2xvbmUgPSAwOwotc3RhdGljIHZvaWQgX19pb21lbSAqY3ljbG9uZV9wdHI7Ci0KLXN0YXRpYyBjeWNsZV90IHJlYWRfY3ljbG9uZShzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQotewotCXJldHVybiAoY3ljbGVfdClyZWFkbChjeWNsb25lX3B0cik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tzb3VyY2UgY2xvY2tzb3VyY2VfY3ljbG9uZSA9IHsKLQkubmFtZQkJPSAiY3ljbG9uZSIsCi0JLnJhdGluZwkJPSAyNTAsCi0JLnJlYWQJCT0gcmVhZF9jeWNsb25lLAotCS5tYXNrCQk9IENZQ0xPTkVfVElNRVJfTUFTSywKLQkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X2N5Y2xvbmVfY2xvY2tzb3VyY2Uodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGJhc2U7CS8qIHNhdmVkIHZhbHVlIGZyb20gQ0JBUiAqLwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXUzMiBfX2lvbWVtKiB2b2xhdGlsZSBjeWNsb25lX3RpbWVyOwkvKiBDeWNsb25lIE1QTUMwIHJlZ2lzdGVyICovCi0JdTMyIF9faW9tZW0qIHJlZzsKLQlpbnQgaTsKLQotCS8qIG1ha2Ugc3VyZSB3ZSdyZSBvbiBhIHN1bW1pdCBib3g6ICovCi0JaWYgKCF1c2VfY3ljbG9uZSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJTdW1taXQgY2hpcHNldDogU3RhcnRpbmcgQ3ljbG9uZSBDb3VudGVyLlxuIik7Ci0KLQkvKiBmaW5kIGJhc2UgYWRkcmVzczogKi8KLQlvZmZzZXQgPSBDWUNMT05FX0NCQVJfQUREUjsKLQlyZWcgPSBpb3JlbWFwX25vY2FjaGUob2Zmc2V0LCBzaXplb2YocmVnKSk7Ci0JaWYgKCFyZWcpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgQ0JBUiByZWdpc3Rlci5cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JLyogZXZlbiBvbiA2NGJpdCBzeXN0ZW1zLCB0aGlzIGlzIG9ubHkgMzJiaXRzOiAqLwotCWJhc2UgPSByZWFkbChyZWcpOwotCWlvdW5tYXAocmVnKTsKLQlpZiAoIWJhc2UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgQ0JBUiB2YWx1ZS5cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKiBzZXR1cCBQTUNDOiAqLwotCW9mZnNldCA9IGJhc2UgKyBDWUNMT05FX1BNQ0NfT0ZGU0VUOwotCXJlZyA9IGlvcmVtYXBfbm9jYWNoZShvZmZzZXQsIHNpemVvZihyZWcpKTsKLQlpZiAoIXJlZykgewotCQlwcmludGsoS0VSTl9FUlIgIlN1bW1pdCBjaGlwc2V0OiBDb3VsZCBub3QgZmluZCB2YWxpZCBQTUNDIHJlZ2lzdGVyLlxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQl3cml0ZWwoMHgwMDAwMDAwMSxyZWcpOwotCWlvdW5tYXAocmVnKTsKLQotCS8qIHNldHVwIE1QQ1M6ICovCi0Jb2Zmc2V0ID0gYmFzZSArIENZQ0xPTkVfTVBDU19PRkZTRVQ7Ci0JcmVnID0gaW9yZW1hcF9ub2NhY2hlKG9mZnNldCwgc2l6ZW9mKHJlZykpOwotCWlmICghcmVnKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU3VtbWl0IGNoaXBzZXQ6IENvdWxkIG5vdCBmaW5kIHZhbGlkIE1QQ1MgcmVnaXN0ZXIuXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXdyaXRlbCgweDAwMDAwMDAxLHJlZyk7Ci0JaW91bm1hcChyZWcpOwotCi0JLyogbWFwIGluIGN5Y2xvbmVfdGltZXI6ICovCi0Jb2Zmc2V0ID0gYmFzZSArIENZQ0xPTkVfTVBNQ19PRkZTRVQ7Ci0JY3ljbG9uZV90aW1lciA9IGlvcmVtYXBfbm9jYWNoZShvZmZzZXQsIHNpemVvZih1NjQpKTsKLQlpZiAoIWN5Y2xvbmVfdGltZXIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgTVBNQyByZWdpc3Rlci5cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKiBxdWljayB0ZXN0IHRvIG1ha2Ugc3VyZSBpdHMgdGlja2luZzogKi8KLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKXsKLQkJdTMyIG9sZCA9IHJlYWRsKGN5Y2xvbmVfdGltZXIpOwotCQlpbnQgc3RhbGwgPSAxMDA7Ci0KLQkJd2hpbGUgKHN0YWxsLS0pCi0JCQliYXJyaWVyKCk7Ci0KLQkJaWYgKHJlYWRsKGN5Y2xvbmVfdGltZXIpID09IG9sZCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bnRlciBub3QgY291bnRpbmchIERJU0FCTEVEXG4iKTsKLQkJCWlvdW5tYXAoY3ljbG9uZV90aW1lcik7Ci0JCQljeWNsb25lX3RpbWVyID0gTlVMTDsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQotCWN5Y2xvbmVfcHRyID0gY3ljbG9uZV90aW1lcjsKLQotCXJldHVybiBjbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmY2xvY2tzb3VyY2VfY3ljbG9uZSwKLQkJCQkJQ1lDTE9ORV9USU1FUl9GUkVRKTsKLX0KLQotYXJjaF9pbml0Y2FsbChpbml0X2N5Y2xvbmVfY2xvY2tzb3VyY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9leHlub3NfbWN0LmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2V4eW5vc19tY3QuYwppbmRleCA0OGY3NmJjLi5jMmUzOTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2V4eW5vc19tY3QuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2V4eW5vc19tY3QuYwpAQCAtNDEwLDcgKzQxMCw3IEBACiAJbWV2dCA9IGNvbnRhaW5lcl9vZihldnQsIHN0cnVjdCBtY3RfY2xvY2tfZXZlbnRfZGV2aWNlLCBldnQpOwogCiAJbWV2dC0+YmFzZSA9IEVYWU5PUzRfTUNUX0xfQkFTRShjcHUpOwotCXNwcmludGYobWV2dC0+bmFtZSwgIm1jdF90aWNrJWQiLCBjcHUpOworCXNucHJpbnRmKG1ldnQtPm5hbWUsIHNpemVvZihtZXZ0LT5uYW1lKSwgIm1jdF90aWNrJWQiLCBjcHUpOwogCiAJZXZ0LT5uYW1lID0gbWV2dC0+bmFtZTsKIAlldnQtPmNwdW1hc2sgPSBjcHVtYXNrX29mKGNwdSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3N1bjRpX3RpbWVyLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3N1bjRpX3RpbWVyLmMKaW5kZXggYmY0OTdhZi4uZWZiMTdjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9zdW40aV90aW1lci5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc3VuNGlfdGltZXIuYwpAQCAtMTk2LDUgKzE5Niw1IEBACiAJY2xvY2tldmVudHNfY29uZmlnX2FuZF9yZWdpc3Rlcigmc3VuNGlfY2xvY2tldmVudCwgcmF0ZSwKIAkJCQkJVElNRVJfU1lOQ19USUNLUywgMHhmZmZmZmZmZik7CiB9Ci1DTE9DS1NPVVJDRV9PRl9ERUNMQVJFKHN1bjRpLCAiYWxsd2lubmVyLHN1bjRpLXRpbWVyIiwKK0NMT0NLU09VUkNFX09GX0RFQ0xBUkUoc3VuNGksICJhbGx3aW5uZXIsc3VuNGktYTEwLXRpbWVyIiwKIAkJICAgICAgIHN1bjRpX3RpbWVyX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lLWFybWFkYS0zNzAteHAuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZS1hcm1hZGEtMzcwLXhwLmMKaW5kZXggZWU4NjkxYi4uMDQ1MWU2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lLWFybWFkYS0zNzAteHAuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWUtYXJtYWRhLTM3MC14cC5jCkBAIC04NSwxMiArODUsNiBAQAogCiBzdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBfX3BlcmNwdSAqYXJtYWRhXzM3MF94cF9ldnQ7CiAKLXN0YXRpYyB2b2lkIHRpbWVyX2N0cmxfY2xyc2V0KHUzMiBjbHIsIHUzMiBzZXQpCi17Ci0Jd3JpdGVsKChyZWFkbCh0aW1lcl9iYXNlICsgVElNRVJfQ1RSTF9PRkYpICYgfmNscikgfCBzZXQsCi0JCXRpbWVyX2Jhc2UgKyBUSU1FUl9DVFJMX09GRik7Ci19Ci0KIHN0YXRpYyB2b2lkIGxvY2FsX3RpbWVyX2N0cmxfY2xyc2V0KHUzMiBjbHIsIHUzMiBzZXQpCiB7CiAJd3JpdGVsKChyZWFkbChsb2NhbF9iYXNlICsgVElNRVJfQ1RSTF9PRkYpICYgfmNscikgfCBzZXQsCkBAIC0yNDUsNyArMjM5LDcgQEAKIAkJY2xyID0gVElNRVIwXzI1TUhaOwogCQllbmFibGVfbWFzayA9IFRJTUVSMF9FTiB8IFRJTUVSMF9ESVYoVElNRVJfRElWSURFUl9TSElGVCk7CiAJfQotCXRpbWVyX2N0cmxfY2xyc2V0KGNsciwgc2V0KTsKKwlhdG9taWNfaW9fbW9kaWZ5KHRpbWVyX2Jhc2UgKyBUSU1FUl9DVFJMX09GRiwgY2xyIHwgc2V0LCBzZXQpOwogCWxvY2FsX3RpbWVyX2N0cmxfY2xyc2V0KGNsciwgc2V0KTsKIAogCS8qCkBAIC0yNjMsNyArMjU3LDkgQEAKIAl3cml0ZWwoMHhmZmZmZmZmZiwgdGltZXJfYmFzZSArIFRJTUVSMF9WQUxfT0ZGKTsKIAl3cml0ZWwoMHhmZmZmZmZmZiwgdGltZXJfYmFzZSArIFRJTUVSMF9SRUxPQURfT0ZGKTsKIAotCXRpbWVyX2N0cmxfY2xyc2V0KDAsIFRJTUVSMF9SRUxPQURfRU4gfCBlbmFibGVfbWFzayk7CisJYXRvbWljX2lvX21vZGlmeSh0aW1lcl9iYXNlICsgVElNRVJfQ1RSTF9PRkYsCisJCVRJTUVSMF9SRUxPQURfRU4gfCBlbmFibGVfbWFzaywKKwkJVElNRVIwX1JFTE9BRF9FTiB8IGVuYWJsZV9tYXNrKTsKIAogCS8qCiAJICogU2V0IHNjYWxlIGFuZCB0aW1lciBmb3Igc2NoZWRfY2xvY2suCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWUtb3Jpb24uYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZS1vcmlvbi5jCmluZGV4IDIwMDY2MjIuLjBiM2NlMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZS1vcmlvbi5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZS1vcmlvbi5jCkBAIC0zNSwyMCArMzUsNiBAQAogI2RlZmluZSBPUklPTl9PTkVTSE9UX01BWAkweGZmZmZmZmZlCiAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKnRpbWVyX2Jhc2U7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHRpbWVyX2N0cmxfbG9jayk7Ci0KLS8qCi0gKiBUaHJlYWQtc2FmZSBhY2Nlc3MgdG8gVElNRVJfQ1RSTCByZWdpc3RlcgotICogKHNoYXJlZCB3aXRoIHdhdGNoZG9nIHRpbWVyKQotICovCi12b2lkIG9yaW9uX3RpbWVyX2N0cmxfY2xyc2V0KHUzMiBjbHIsIHUzMiBzZXQpCi17Ci0Jc3Bpbl9sb2NrKCZ0aW1lcl9jdHJsX2xvY2spOwotCXdyaXRlbCgocmVhZGwodGltZXJfYmFzZSArIFRJTUVSX0NUUkwpICYgfmNscikgfCBzZXQsCi0JCXRpbWVyX2Jhc2UgKyBUSU1FUl9DVFJMKTsKLQlzcGluX3VubG9jaygmdGltZXJfY3RybF9sb2NrKTsKLX0KLUVYUE9SVF9TWU1CT0wob3Jpb25fdGltZXJfY3RybF9jbHJzZXQpOwogCiAvKgogICogRnJlZS1ydW5uaW5nIGNsb2Nrc291cmNlIGhhbmRsaW5nLgpAQCAtNjgsNyArNTQsOCBAQAogewogCS8qIHNldHVwIGFuZCBlbmFibGUgb25lLXNob3QgdGltZXIgKi8KIAl3cml0ZWwoZGVsdGEsIHRpbWVyX2Jhc2UgKyBUSU1FUjFfVkFMKTsKLQlvcmlvbl90aW1lcl9jdHJsX2NscnNldChUSU1FUjFfUkVMT0FEX0VOLCBUSU1FUjFfRU4pOworCWF0b21pY19pb19tb2RpZnkodGltZXJfYmFzZSArIFRJTUVSX0NUUkwsCisJCVRJTUVSMV9SRUxPQURfRU4gfCBUSU1FUjFfRU4sIFRJTUVSMV9FTik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTgwLDEwICs2NywxMyBAQAogCQkvKiBzZXR1cCBhbmQgZW5hYmxlIHBlcmlvZGljIHRpbWVyIGF0IDEvSFogaW50ZXJ2YWxzICovCiAJCXdyaXRlbCh0aWNrc19wZXJfamlmZnkgLSAxLCB0aW1lcl9iYXNlICsgVElNRVIxX1JFTE9BRCk7CiAJCXdyaXRlbCh0aWNrc19wZXJfamlmZnkgLSAxLCB0aW1lcl9iYXNlICsgVElNRVIxX1ZBTCk7Ci0JCW9yaW9uX3RpbWVyX2N0cmxfY2xyc2V0KDAsIFRJTUVSMV9SRUxPQURfRU4gfCBUSU1FUjFfRU4pOworCQlhdG9taWNfaW9fbW9kaWZ5KHRpbWVyX2Jhc2UgKyBUSU1FUl9DVFJMLAorCQkJVElNRVIxX1JFTE9BRF9FTiB8IFRJTUVSMV9FTiwKKwkJCVRJTUVSMV9SRUxPQURfRU4gfCBUSU1FUjFfRU4pOwogCX0gZWxzZSB7CiAJCS8qIGRpc2FibGUgdGltZXIgKi8KLQkJb3Jpb25fdGltZXJfY3RybF9jbHJzZXQoVElNRVIxX1JFTE9BRF9FTiB8IFRJTUVSMV9FTiwgMCk7CisJCWF0b21pY19pb19tb2RpZnkodGltZXJfYmFzZSArIFRJTUVSX0NUUkwsCisJCQlUSU1FUjFfUkVMT0FEX0VOIHwgVElNRVIxX0VOLCAwKTsKIAl9CiB9CiAKQEAgLTEzMSw3ICsxMjEsOSBAQAogCS8qIHNldHVwIHRpbWVyMCBhcyBmcmVlLXJ1bm5pbmcgY2xvY2tzb3VyY2UgKi8KIAl3cml0ZWwofjAsIHRpbWVyX2Jhc2UgKyBUSU1FUjBfVkFMKTsKIAl3cml0ZWwofjAsIHRpbWVyX2Jhc2UgKyBUSU1FUjBfUkVMT0FEKTsKLQlvcmlvbl90aW1lcl9jdHJsX2NscnNldCgwLCBUSU1FUjBfUkVMT0FEX0VOIHwgVElNRVIwX0VOKTsKKwlhdG9taWNfaW9fbW9kaWZ5KHRpbWVyX2Jhc2UgKyBUSU1FUl9DVFJMLAorCQlUSU1FUjBfUkVMT0FEX0VOIHwgVElNRVIwX0VOLAorCQlUSU1FUjBfUkVMT0FEX0VOIHwgVElNRVIwX0VOKTsKIAljbG9ja3NvdXJjZV9tbWlvX2luaXQodGltZXJfYmFzZSArIFRJTUVSMF9WQUwsICJvcmlvbl9jbG9ja3NvdXJjZSIsCiAJCQkgICAgICBjbGtfZ2V0X3JhdGUoY2xrKSwgMzAwLCAzMiwKIAkJCSAgICAgIGNsb2Nrc291cmNlX21taW9fcmVhZGxfZG93bik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLWtleXN0b25lLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLWtleXN0b25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1MDM1NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXIta2V5c3RvbmUuYwpAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqIEtleXN0b25lIGJyb2FkY2FzdCBjbG9jay1ldmVudAorICoKKyAqIENvcHlyaWdodCAyMDEzIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogQXV0aG9yOiBJdmFuIEtob3JvbnpodWsgPGl2YW4ua2hvcm9uemh1a0B0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKworI2RlZmluZSBUSU1FUl9OQU1FCQkJInRpbWVyLWtleXN0b25lIgorCisvKiBUaW1lciByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIFRJTTEyCQkJCTB4MTAKKyNkZWZpbmUgVElNMzQJCQkJMHgxNAorI2RlZmluZSBQUkQxMgkJCQkweDE4CisjZGVmaW5lIFBSRDM0CQkJCTB4MWMKKyNkZWZpbmUgVENSCQkJCTB4MjAKKyNkZWZpbmUgVEdDUgkJCQkweDI0CisjZGVmaW5lIElOVENUTFNUQVQJCQkweDQ0CisKKy8qIFRpbWVyIHJlZ2lzdGVyIGJpdGZpZWxkcyAqLworI2RlZmluZSBUQ1JfRU5BTU9ERV9NQVNLCQkweEMwCisjZGVmaW5lIFRDUl9FTkFNT0RFX09ORVNIT1RfTUFTSwkweDQwCisjZGVmaW5lIFRDUl9FTkFNT0RFX1BFUklPRElDX01BU0sJMHg4MAorCisjZGVmaW5lIFRHQ1JfVElNX1VOUkVTRVRfTUFTSwkJMHgwMworI2RlZmluZSBJTlRDVExTVEFUX0VOSU5UX01BU0sJCTB4MDEKKworLyoqCisgKiBzdHJ1Y3Qga2V5c3RvbmVfdGltZXI6IGhvbGRzIHRpbWVyJ3MgZGF0YQorICogQGJhc2U6IHRpbWVyIG1lbW9yeSBiYXNlIGFkZHJlc3MKKyAqIEBoel9wZXJpb2Q6IGN5Y2xlcyBwZXIgSFogcGVyaW9kCisgKiBAZXZlbnRfZGV2OiBldmVudCBkZXZpY2UgYmFzZWQgb24gdGltZXIKKyAqLworc3RhdGljIHN0cnVjdCBrZXlzdG9uZV90aW1lciB7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXVuc2lnbmVkIGxvbmcgaHpfcGVyaW9kOworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgZXZlbnRfZGV2OworfSB0aW1lcjsKKworc3RhdGljIGlubGluZSB1MzIga2V5c3RvbmVfdGltZXJfcmVhZGwodW5zaWduZWQgbG9uZyByZykKK3sKKwlyZXR1cm4gcmVhZGxfcmVsYXhlZCh0aW1lci5iYXNlICsgcmcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQga2V5c3RvbmVfdGltZXJfd3JpdGVsKHUzMiB2YWwsIHVuc2lnbmVkIGxvbmcgcmcpCit7CisJd3JpdGVsX3JlbGF4ZWQodmFsLCB0aW1lci5iYXNlICsgcmcpOworfQorCisvKioKKyAqIGtleXN0b25lX3RpbWVyX2JhcnJpZXI6IHdyaXRlIG1lbW9yeSBiYXJyaWVyCisgKiB1c2UgZXhwbGljaXQgYmFycmllciB0byBhdm9pZCB1c2luZyByZWFkbC93cml0ZWwgbm9uIHJlbGF4ZWQgZnVuY3Rpb24KKyAqIHZhcmlhbnRzLCBiZWNhdXNlIGluIG91ciBjYXNlIG5vbiByZWxheGVkIHZhcmlhbnRzIGhpZGUgdGhlIHRydWUgcGxhY2VzCisgKiB3aGVyZSBiYXJyaWVyIGlzIG5lZWRlZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGtleXN0b25lX3RpbWVyX2JhcnJpZXIodm9pZCkKK3sKKwlfX2lvd21iKCk7Cit9CisKKy8qKgorICoga2V5c3RvbmVfdGltZXJfY29uZmlnOiBjb25maWd1cmVzIHRpbWVyIHRvIHdvcmsgaW4gb25lc2hvdC9wZXJpb2RpYyBtb2Rlcy4KKyAqIEAgbW9kZTogbW9kZSB0byBjb25maWd1cmUKKyAqIEAgcGVyaW9kOiBjeWNsZXMgbnVtYmVyIHRvIGNvbmZpZ3VyZSBmb3IKKyAqLworc3RhdGljIGludCBrZXlzdG9uZV90aW1lcl9jb25maWcodTY0IHBlcmlvZCwgZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUpCit7CisJdTMyIHRjcjsKKwl1MzIgb2ZmOworCisJdGNyID0ga2V5c3RvbmVfdGltZXJfcmVhZGwoVENSKTsKKwlvZmYgPSB0Y3IgJiB+KFRDUl9FTkFNT0RFX01BU0spOworCisJLyogc2V0IGVuYWJsZSBtb2RlICovCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgorCQl0Y3IgfD0gVENSX0VOQU1PREVfT05FU0hPVF9NQVNLOworCQlicmVhazsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1BFUklPRElDOgorCQl0Y3IgfD0gVENSX0VOQU1PREVfUEVSSU9ESUNfTUFTSzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGRpc2FibGUgdGltZXIgKi8KKwlrZXlzdG9uZV90aW1lcl93cml0ZWwob2ZmLCBUQ1IpOworCS8qIGhlcmUgd2UgaGF2ZSB0byBiZSBzdXJlIHRoZSB0aW1lciBoYXMgYmVlbiBkaXNhYmxlZCAqLworCWtleXN0b25lX3RpbWVyX2JhcnJpZXIoKTsKKworCS8qIHJlc2V0IGNvdW50ZXIgdG8gemVybywgc2V0IG5ldyBwZXJpb2QgKi8KKwlrZXlzdG9uZV90aW1lcl93cml0ZWwoMCwgVElNMTIpOworCWtleXN0b25lX3RpbWVyX3dyaXRlbCgwLCBUSU0zNCk7CisJa2V5c3RvbmVfdGltZXJfd3JpdGVsKHBlcmlvZCAmIDB4ZmZmZmZmZmYsIFBSRDEyKTsKKwlrZXlzdG9uZV90aW1lcl93cml0ZWwocGVyaW9kID4+IDMyLCBQUkQzNCk7CisKKwkvKgorCSAqIGVuYWJsZSB0aW1lcgorCSAqIGhlcmUgd2UgaGF2ZSB0byBiZSBzdXJlIHRoYXQgQ05UTE8sIENOVEhJLCBQUkRMTywgUFJESEkgcmVnaXN0ZXJzCisJICogaGF2ZSBiZWVuIHdyaXR0ZW4uCisJICovCisJa2V5c3RvbmVfdGltZXJfYmFycmllcigpOworCWtleXN0b25lX3RpbWVyX3dyaXRlbCh0Y3IsIFRDUik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGtleXN0b25lX3RpbWVyX2Rpc2FibGUodm9pZCkKK3sKKwl1MzIgdGNyOworCisJdGNyID0ga2V5c3RvbmVfdGltZXJfcmVhZGwoVENSKTsKKworCS8qIGRpc2FibGUgdGltZXIgKi8KKwl0Y3IgJj0gfihUQ1JfRU5BTU9ERV9NQVNLKTsKKwlrZXlzdG9uZV90aW1lcl93cml0ZWwodGNyLCBUQ1IpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qga2V5c3RvbmVfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSBkZXZfaWQ7CisKKwlldnQtPmV2ZW50X2hhbmRsZXIoZXZ0KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQga2V5c3RvbmVfc2V0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBjeWNsZXMsCisJCQkJICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJcmV0dXJuIGtleXN0b25lX3RpbWVyX2NvbmZpZyhjeWNsZXMsIGV2dC0+bW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGtleXN0b25lX3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCQkJICAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQzoKKwkJa2V5c3RvbmVfdGltZXJfY29uZmlnKHRpbWVyLmh6X3BlcmlvZCwgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUMpOworCQlicmVhazsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKKwljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfT05FU0hPVDoKKwkJa2V5c3RvbmVfdGltZXJfZGlzYWJsZSgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBrZXlzdG9uZV90aW1lcl9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZlbnRfZGV2ID0gJnRpbWVyLmV2ZW50X2RldjsKKwl1bnNpZ25lZCBsb25nIHJhdGU7CisJc3RydWN0IGNsayAqY2xrOworCWludCBpcnEsIGVycm9yOworCisJaXJxICA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKKwlpZiAoaXJxID09IE5PX0lSUSkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gbWFwIGludGVycnVwdHNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXRpbWVyLmJhc2UgPSBvZl9pb21hcChucCwgMCk7CisJaWYgKCF0aW1lci5iYXNlKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBtYXAgcmVnaXN0ZXJzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwljbGsgPSBvZl9jbGtfZ2V0KG5wLCAwKTsKKwlpZiAoSVNfRVJSKGNsaykpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBjbG9ja1xuIiwgX19mdW5jX18pOworCQlpb3VubWFwKHRpbWVyLmJhc2UpOworCQlyZXR1cm47CisJfQorCisJZXJyb3IgPSBjbGtfcHJlcGFyZV9lbmFibGUoY2xrKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGVuYWJsZSBjbG9ja1xuIiwgX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9CisKKwlyYXRlID0gY2xrX2dldF9yYXRlKGNsayk7CisKKwkvKiBkaXNhYmxlLCB1c2UgaW50ZXJuYWwgY2xvY2sgc291cmNlICovCisJa2V5c3RvbmVfdGltZXJfd3JpdGVsKDAsIFRDUik7CisJLyogaGVyZSB3ZSBoYXZlIHRvIGJlIHN1cmUgdGhlIHRpbWVyIGhhcyBiZWVuIGRpc2FibGVkICovCisJa2V5c3RvbmVfdGltZXJfYmFycmllcigpOworCisJLyogcmVzZXQgdGltZXIgYXMgNjQtYml0LCBubyBwcmUtc2NhbGVyLCBwbHVzIGZlYXR1cmVzIGFyZSBkaXNhYmxlZCAqLworCWtleXN0b25lX3RpbWVyX3dyaXRlbCgwLCBUR0NSKTsKKworCS8qIHVucmVzZXQgdGltZXIgKi8KKwlrZXlzdG9uZV90aW1lcl93cml0ZWwoVEdDUl9USU1fVU5SRVNFVF9NQVNLLCBUR0NSKTsKKworCS8qIGluaXQgY291bnRlciB0byB6ZXJvICovCisJa2V5c3RvbmVfdGltZXJfd3JpdGVsKDAsIFRJTTEyKTsKKwlrZXlzdG9uZV90aW1lcl93cml0ZWwoMCwgVElNMzQpOworCisJdGltZXIuaHpfcGVyaW9kID0gRElWX1JPVU5EX1VQKHJhdGUsIEhaKTsKKworCS8qIGVuYWJsZSB0aW1lciBpbnRlcnJ1cHRzICovCisJa2V5c3RvbmVfdGltZXJfd3JpdGVsKElOVENUTFNUQVRfRU5JTlRfTUFTSywgSU5UQ1RMU1RBVCk7CisKKwllcnJvciA9IHJlcXVlc3RfaXJxKGlycSwga2V5c3RvbmVfdGltZXJfaW50ZXJydXB0LCBJUlFGX1RJTUVSLAorCQkJICAgIFRJTUVSX05BTUUsIGV2ZW50X2Rldik7CisJaWYgKGVycm9yKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXR1cCBpcnFcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogc2V0dXAgY2xvY2tldmVudCAqLworCWV2ZW50X2Rldi0+ZmVhdHVyZXMgPSBDTE9DS19FVlRfRkVBVF9QRVJJT0RJQyB8IENMT0NLX0VWVF9GRUFUX09ORVNIT1Q7CisJZXZlbnRfZGV2LT5zZXRfbmV4dF9ldmVudCA9IGtleXN0b25lX3NldF9uZXh0X2V2ZW50OworCWV2ZW50X2Rldi0+c2V0X21vZGUgPSBrZXlzdG9uZV9zZXRfbW9kZTsKKwlldmVudF9kZXYtPmNwdW1hc2sgPSBjcHVfYWxsX21hc2s7CisJZXZlbnRfZGV2LT5vd25lciA9IFRISVNfTU9EVUxFOworCWV2ZW50X2Rldi0+bmFtZSA9IFRJTUVSX05BTUU7CisJZXZlbnRfZGV2LT5pcnEgPSBpcnE7CisKKwljbG9ja2V2ZW50c19jb25maWdfYW5kX3JlZ2lzdGVyKGV2ZW50X2RldiwgcmF0ZSwgMSwgVUxPTkdfTUFYKTsKKworCXByX2luZm8oImtleXN0b25lIHRpbWVyIGNsb2NrIEAlbHUgSHpcbiIsIHJhdGUpOworCXJldHVybjsKK2VycjoKKwljbGtfcHV0KGNsayk7CisJaW91bm1hcCh0aW1lci5iYXNlKTsKK30KKworQ0xPQ0tTT1VSQ0VfT0ZfREVDTEFSRShrZXlzdG9uZV90aW1lciwgInRpLGtleXN0b25lLXRpbWVyIiwKKwkJCQkJa2V5c3RvbmVfdGltZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvdGltZXIuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXItdTMwMC5jCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtdTMwMC90aW1lci5jCnJlbmFtZSB0byBkcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLXUzMDAuYwppbmRleCBmZTA4ZmQzLi5lNjNkNDY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXUzMDAvdGltZXIuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLXUzMDAuYwpAQCAtMSw4ICsxLDQgQEAKIC8qCi0gKgotICogYXJjaC9hcm0vbWFjaC11MzAwL3RpbWVyLmMKLSAqCi0gKgogICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgU1QtRXJpY3Nzb24gQUIKICAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgogICogVGltZXIgQ09IIDkwMSAzMjgsIHJ1bnMgdGhlIE9TIHRpbWVyIGludGVycnVwdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29ubmVjdG9yL2NuX3Byb2MuYyBiL2RyaXZlcnMvY29ubmVjdG9yL2NuX3Byb2MuYwppbmRleCAxOGM1YjliLi4xNDhkNzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nvbm5lY3Rvci9jbl9wcm9jLmMKKysrIGIvZHJpdmVycy9jb25uZWN0b3IvY25fcHJvYy5jCkBAIC05NSw3ICs5NSw3IEBACiAJbXNnLT5sZW4gPSBzaXplb2YoKmV2KTsKIAltc2ctPmZsYWdzID0gMDsgLyogbm90IHVzZWQgKi8KIAkvKiAgSWYgY25fbmV0bGlua19zZW5kKCkgZmFpbGVkLCB0aGUgZGF0YSBpcyBub3Qgc2VudCAqLwotCWNuX25ldGxpbmtfc2VuZChtc2csIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKKwljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CiB9CiAKIHZvaWQgcHJvY19leGVjX2Nvbm5lY3RvcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCkBAIC0xMjIsNyArMTIyLDcgQEAKIAltc2ctPmFjayA9IDA7IC8qIG5vdCB1c2VkICovCiAJbXNnLT5sZW4gPSBzaXplb2YoKmV2KTsKIAltc2ctPmZsYWdzID0gMDsgLyogbm90IHVzZWQgKi8KLQljbl9uZXRsaW5rX3NlbmQobXNnLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CisJY25fbmV0bGlua19zZW5kKG1zZywgMCwgQ05fSURYX1BST0MsIEdGUF9LRVJORUwpOwogfQogCiB2b2lkIHByb2NfaWRfY29ubmVjdG9yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHdoaWNoX2lkKQpAQCAtMTYzLDcgKzE2Myw3IEBACiAJbXNnLT5hY2sgPSAwOyAvKiBub3QgdXNlZCAqLwogCW1zZy0+bGVuID0gc2l6ZW9mKCpldik7CiAJbXNnLT5mbGFncyA9IDA7IC8qIG5vdCB1c2VkICovCi0JY25fbmV0bGlua19zZW5kKG1zZywgQ05fSURYX1BST0MsIEdGUF9LRVJORUwpOworCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKIH0KIAogdm9pZCBwcm9jX3NpZF9jb25uZWN0b3Ioc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQpAQCAtMTkwLDcgKzE5MCw3IEBACiAJbXNnLT5hY2sgPSAwOyAvKiBub3QgdXNlZCAqLwogCW1zZy0+bGVuID0gc2l6ZW9mKCpldik7CiAJbXNnLT5mbGFncyA9IDA7IC8qIG5vdCB1c2VkICovCi0JY25fbmV0bGlua19zZW5kKG1zZywgQ05fSURYX1BST0MsIEdGUF9LRVJORUwpOworCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKIH0KIAogdm9pZCBwcm9jX3B0cmFjZV9jb25uZWN0b3Ioc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgcHRyYWNlX2lkKQpAQCAtMjI1LDcgKzIyNSw3IEBACiAJbXNnLT5hY2sgPSAwOyAvKiBub3QgdXNlZCAqLwogCW1zZy0+bGVuID0gc2l6ZW9mKCpldik7CiAJbXNnLT5mbGFncyA9IDA7IC8qIG5vdCB1c2VkICovCi0JY25fbmV0bGlua19zZW5kKG1zZywgQ05fSURYX1BST0MsIEdGUF9LRVJORUwpOworCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKIH0KIAogdm9pZCBwcm9jX2NvbW1fY29ubmVjdG9yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKQEAgLTI1Myw3ICsyNTMsNyBAQAogCW1zZy0+YWNrID0gMDsgLyogbm90IHVzZWQgKi8KIAltc2ctPmxlbiA9IHNpemVvZigqZXYpOwogCW1zZy0+ZmxhZ3MgPSAwOyAvKiBub3QgdXNlZCAqLwotCWNuX25ldGxpbmtfc2VuZChtc2csIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKKwljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CiB9CiAKIHZvaWQgcHJvY19jb3JlZHVtcF9jb25uZWN0b3Ioc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQpAQCAtMjgwLDcgKzI4MCw3IEBACiAJbXNnLT5hY2sgPSAwOyAvKiBub3QgdXNlZCAqLwogCW1zZy0+bGVuID0gc2l6ZW9mKCpldik7CiAJbXNnLT5mbGFncyA9IDA7IC8qIG5vdCB1c2VkICovCi0JY25fbmV0bGlua19zZW5kKG1zZywgQ05fSURYX1BST0MsIEdGUF9LRVJORUwpOworCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKIH0KIAogdm9pZCBwcm9jX2V4aXRfY29ubmVjdG9yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKQEAgLTMwOSw3ICszMDksNyBAQAogCW1zZy0+YWNrID0gMDsgLyogbm90IHVzZWQgKi8KIAltc2ctPmxlbiA9IHNpemVvZigqZXYpOwogCW1zZy0+ZmxhZ3MgPSAwOyAvKiBub3QgdXNlZCAqLwotCWNuX25ldGxpbmtfc2VuZChtc2csIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKKwljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CiB9CiAKIC8qCkBAIC0zNDMsNyArMzQzLDcgQEAKIAltc2ctPmFjayA9IHJjdmRfYWNrICsgMTsKIAltc2ctPmxlbiA9IHNpemVvZigqZXYpOwogCW1zZy0+ZmxhZ3MgPSAwOyAvKiBub3QgdXNlZCAqLwotCWNuX25ldGxpbmtfc2VuZChtc2csIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKKwljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMgYi9kcml2ZXJzL2Nvbm5lY3Rvci9jb25uZWN0b3IuYwppbmRleCBhMzY3NDlmLi43N2FmZTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nvbm5lY3Rvci9jb25uZWN0b3IuYworKysgYi9kcml2ZXJzL2Nvbm5lY3Rvci9jb25uZWN0b3IuYwpAQCAtNTAsNyArNTAsNyBAQAogICoKICAqIFNlcXVlbmNlIG51bWJlciBpcyBpbmNyZW1lbnRlZCB3aXRoIGVhY2ggbWVzc2FnZSB0byBiZSBzZW50LgogICoKLSAqIElmIHdlIGV4cGVjdCByZXBseSB0byBvdXIgbWVzc2FnZSB0aGVuIHRoZSBzZXF1ZW5jZSBudW1iZXIgaW4KKyAqIElmIHdlIGV4cGVjdCBhIHJlcGx5IHRvIG91ciBtZXNzYWdlIHRoZW4gdGhlIHNlcXVlbmNlIG51bWJlciBpbgogICogcmVjZWl2ZWQgbWVzc2FnZSBNVVNUIGJlIHRoZSBzYW1lIGFzIGluIG9yaWdpbmFsIG1lc3NhZ2UsIGFuZAogICogYWNrbm93bGVkZ2UgbnVtYmVyIE1VU1QgYmUgdGhlIHNhbWUgKyAxLgogICoKQEAgLTYyLDggKzYyLDExIEBACiAgKiB0aGUgYWNrbm93bGVkZ2VtZW50IG51bWJlciBpbiB0aGUgb3JpZ2luYWwgbWVzc2FnZSArIDEsIHRoZW4gaXQgaXMKICAqIGEgbmV3IG1lc3NhZ2UuCiAgKgorICogVGhlIG1lc3NhZ2UgaXMgc2VudCB0bywgdGhlIHBvcnRpZCBpZiBnaXZlbiwgdGhlIGdyb3VwIGlmIGdpdmVuLCBib3RoIGlmCisgKiBib3RoLCBvciBpZiBib3RoIGFyZSB6ZXJvIHRoZW4gdGhlIGdyb3VwIGlzIGxvb2tlZCB1cCBhbmQgc2VudCB0aGVyZS4KICAqLwotaW50IGNuX25ldGxpbmtfc2VuZChzdHJ1Y3QgY25fbXNnICptc2csIHUzMiBfX2dyb3VwLCBnZnBfdCBnZnBfbWFzaykKK2ludCBjbl9uZXRsaW5rX3NlbmQoc3RydWN0IGNuX21zZyAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgX19ncm91cCwKKwlnZnBfdCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3QgY25fY2FsbGJhY2tfZW50cnkgKl9fY2JxOwogCXVuc2lnbmVkIGludCBzaXplOwpAQCAtNzQsNyArNzcsOSBAQAogCXUzMiBncm91cCA9IDA7CiAJaW50IGZvdW5kID0gMDsKIAotCWlmICghX19ncm91cCkgeworCWlmIChwb3J0aWQgfHwgX19ncm91cCkgeworCQlncm91cCA9IF9fZ3JvdXA7CisJfSBlbHNlIHsKIAkJc3Bpbl9sb2NrX2JoKCZkZXYtPmNiZGV2LT5xdWV1ZV9sb2NrKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShfX2NicSwgJmRldi0+Y2JkZXYtPnF1ZXVlX2xpc3QsCiAJCQkJICAgIGNhbGxiYWNrX2VudHJ5KSB7CkBAIC04OCwxMSArOTMsOSBAQAogCiAJCWlmICghZm91bmQpCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQl9IGVsc2UgewotCQlncm91cCA9IF9fZ3JvdXA7CiAJfQogCi0JaWYgKCFuZXRsaW5rX2hhc19saXN0ZW5lcnMoZGV2LT5ubHMsIGdyb3VwKSkKKwlpZiAoIXBvcnRpZCAmJiAhbmV0bGlua19oYXNfbGlzdGVuZXJzKGRldi0+bmxzLCBncm91cCkpCiAJCXJldHVybiAtRVNSQ0g7CiAKIAlzaXplID0gc2l6ZW9mKCptc2cpICsgbXNnLT5sZW47CkBAIC0xMTMsNyArMTE2LDEwIEBACiAKIAlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwID0gZ3JvdXA7CiAKLQlyZXR1cm4gbmV0bGlua19icm9hZGNhc3QoZGV2LT5ubHMsIHNrYiwgMCwgZ3JvdXAsIGdmcF9tYXNrKTsKKwlpZiAoZ3JvdXApCisJCXJldHVybiBuZXRsaW5rX2Jyb2FkY2FzdChkZXYtPm5scywgc2tiLCBwb3J0aWQsIGdyb3VwLAorCQkJCQkgZ2ZwX21hc2spOworCXJldHVybiBuZXRsaW5rX3VuaWNhc3QoZGV2LT5ubHMsIHNrYiwgcG9ydGlkLCAhKGdmcF9tYXNrJl9fR0ZQX1dBSVQpKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNuX25ldGxpbmtfc2VuZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnLmFybSBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnLmFybQppbmRleCAzMTI5NzQ5Li45ZmI2MjcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZy5hcm0KKysrIGIvZHJpdmVycy9jcHVmcmVxL0tjb25maWcuYXJtCkBAIC0yLDYgKzIsNyBAQAogIyBBUk0gQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nIGRyaXZlcnMKICMKIAorIyBiaWcgTElUVExFIGNvcmUgbGF5ZXIgYW5kIGdsdWUgZHJpdmVycwogY29uZmlnIEFSTV9CSUdfTElUVExFX0NQVUZSRVEKIAl0cmlzdGF0ZSAiR2VuZXJpYyBBUk0gYmlnIExJVFRMRSBDUFVmcmVxIGRyaXZlciIKIAlkZXBlbmRzIG9uIEFSTSAmJiBCSUdfTElUVExFICYmIEFSTV9DUFVfVE9QT0xPR1kgJiYgSEFWRV9DTEsKQEAgLTE2LDYgKzE3LDE0IEBACiAJICBUaGlzIGVuYWJsZXMgcHJvYmluZyB2aWEgRFQgZm9yIEdlbmVyaWMgQ1BVZnJlcSBkcml2ZXIgZm9yIEFSTQogCSAgYmlnLkxJVFRMRSBwbGF0Zm9ybS4gVGhpcyBnZXRzIGZyZXF1ZW5jeSB0YWJsZXMgZnJvbSBEVC4KIAorY29uZmlnIEFSTV9WRVhQUkVTU19TUENfQ1BVRlJFUQorICAgICAgICB0cmlzdGF0ZSAiVmVyc2F0aWxlIEV4cHJlc3MgU1BDIGJhc2VkIENQVWZyZXEgZHJpdmVyIgorCWRlcGVuZHMgb24gQVJNX0JJR19MSVRUTEVfQ1BVRlJFUSAmJiBBUkNIX1ZFWFBSRVNTX1NQQworICAgICAgICBoZWxwCisgICAgICAgICAgVGhpcyBhZGQgdGhlIENQVWZyZXEgZHJpdmVyIHN1cHBvcnQgZm9yIFZlcnNhdGlsZSBFeHByZXNzCisJICBiaWcuTElUVExFIHBsYXRmb3JtcyB1c2luZyBTUEMgZm9yIHBvd2VyIG1hbmFnZW1lbnQuCisKKwogY29uZmlnIEFSTV9FWFlOT1NfQ1BVRlJFUQogCWJvb2wKIApAQCAtMjQxLDExICsyNTAsMyBAQAogCWRlZmF1bHQgeQogCWhlbHAKIAkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgc3VwcG9ydCBmb3IgVEVHUkEgU09Dcy4KLQotY29uZmlnIEFSTV9WRVhQUkVTU19TUENfQ1BVRlJFUQotICAgICAgICB0cmlzdGF0ZSAiVmVyc2F0aWxlIEV4cHJlc3MgU1BDIGJhc2VkIENQVWZyZXEgZHJpdmVyIgotICAgICAgICBzZWxlY3QgQVJNX0JJR19MSVRUTEVfQ1BVRlJFUQotICAgICAgICBkZXBlbmRzIG9uIEFSQ0hfVkVYUFJFU1NfU1BDCi0gICAgICAgIGhlbHAKLSAgICAgICAgICBUaGlzIGFkZCB0aGUgQ1BVZnJlcSBkcml2ZXIgc3VwcG9ydCBmb3IgVmVyc2F0aWxlIEV4cHJlc3MKLQkgIGJpZy5MSVRUTEUgcGxhdGZvcm1zIHVzaW5nIFNQQyBmb3IgcG93ZXIgbWFuYWdlbWVudC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwppbmRleCAxODQ0OGE3Li44MjJjYTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCkBAIC04NTUsNyArODU1LDYgQEAKIAlwcl9kZWJ1ZygiYWNwaV9jcHVmcmVxX2NwdV9leGl0XG4iKTsKIAogCWlmIChkYXRhKSB7Ci0JCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsKIAkJcGVyX2NwdShhY2ZyZXFfZGF0YSwgcG9saWN5LT5jcHUpID0gTlVMTDsKIAkJYWNwaV9wcm9jZXNzb3JfdW5yZWdpc3Rlcl9wZXJmb3JtYW5jZShkYXRhLT5hY3BpX2RhdGEsCiAJCQkJCQkgICAgICBwb2xpY3ktPmNwdSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvYXJtX2JpZ19saXR0bGUuYyBiL2RyaXZlcnMvY3B1ZnJlcS9hcm1fYmlnX2xpdHRsZS5jCmluZGV4IDcyZjg3ZTkuLmJhZDJlZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9hcm1fYmlnX2xpdHRsZS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9hcm1fYmlnX2xpdHRsZS5jCkBAIC00NDYsOSArNDQ2LDEyIEBACiAJfQogCiAJaWYgKGN1cl9jbHVzdGVyIDwgTUFYX0NMVVNURVJTKSB7CisJCWludCBjcHU7CisKIAkJY3B1bWFza19jb3B5KHBvbGljeS0+Y3B1cywgdG9wb2xvZ3lfY29yZV9jcHVtYXNrKHBvbGljeS0+Y3B1KSk7CiAKLQkJcGVyX2NwdShwaHlzaWNhbF9jbHVzdGVyLCBwb2xpY3ktPmNwdSkgPSBjdXJfY2x1c3RlcjsKKwkJZm9yX2VhY2hfY3B1KGNwdSwgcG9saWN5LT5jcHVzKQorCQkJcGVyX2NwdShwaHlzaWNhbF9jbHVzdGVyLCBjcHUpID0gY3VyX2NsdXN0ZXI7CiAJfSBlbHNlIHsKIAkJLyogQXNzdW1wdGlvbjogZHVyaW5nIGluaXQsIHdlIGFyZSBhbHdheXMgcnVubmluZyBvbiBBMTUgKi8KIAkJcGVyX2NwdShwaHlzaWNhbF9jbHVzdGVyLCBwb2xpY3ktPmNwdSkgPSBBMTVfQ0xVU1RFUjsKQEAgLTQ3OCw3ICs0ODEsNiBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2xpY3ktPmNwdSk7CiAJcHV0X2NsdXN0ZXJfY2xrX2FuZF9mcmVxX3RhYmxlKGNwdV9kZXYpOwogCWRldl9kYmcoY3B1X2RldiwgIiVzOiBFeGl0ZWQsIGNwdTogJWRcbiIsIF9fZnVuY19fLCBwb2xpY3ktPmNwdSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9ibGFja2Zpbi1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvYmxhY2tmaW4tY3B1ZnJlcS5jCmluZGV4IGU5ZTYzZmMuLmE5ZjhlNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9ibGFja2Zpbi1jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2JsYWNrZmluLWNwdWZyZXEuYwpAQCAtMTk1LDcgKzE5NSw2IEBACiAJLnRhcmdldF9pbmRleCA9IGJmaW5fdGFyZ2V0LAogCS5nZXQgPSBiZmluX2dldGZyZXFfa2h6LAogCS5pbml0ID0gX19iZmluX2NwdV9pbml0LAotCS5leGl0ID0gY3B1ZnJlcV9nZW5lcmljX2V4aXQsCiAJLm5hbWUgPSAiYmZpbiBjcHVmcmVxIiwKIAkuYXR0ciA9IGNwdWZyZXFfZ2VuZXJpY19hdHRyLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLWNwdTAuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLWNwdTAuYwppbmRleCAwYzEyZmZjLi4xYmY2YmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS1jcHUwLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEtY3B1MC5jCkBAIC0xMDksNyArMTA5LDYgQEAKIAkudGFyZ2V0X2luZGV4ID0gY3B1MF9zZXRfdGFyZ2V0LAogCS5nZXQgPSBjcHVmcmVxX2dlbmVyaWNfZ2V0LAogCS5pbml0ID0gY3B1MF9jcHVmcmVxX2luaXQsCi0JLmV4aXQgPSBjcHVmcmVxX2dlbmVyaWNfZXhpdCwKIAkubmFtZSA9ICJnZW5lcmljX2NwdTAiLAogCS5hdHRyID0gY3B1ZnJlcV9nZW5lcmljX2F0dHIsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKaW5kZXggMTk5YjUyYi4uM2FhN2E3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvdGljay5oPgogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9wb3dlci5oPgogCkBAIC00MiwxMCArNDIsMTEgQEAKIERFRklORV9NVVRFWChjcHVmcmVxX2dvdmVybm9yX2xvY2spOwogc3RhdGljIExJU1RfSEVBRChjcHVmcmVxX3BvbGljeV9saXN0KTsKIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogLyogVGhpcyBvbmUga2VlcHMgdHJhY2sgb2YgdGhlIHByZXZpb3VzbHkgc2V0IGdvdmVybm9yIG9mIGEgcmVtb3ZlZCBDUFUgKi8KIHN0YXRpYyBERUZJTkVfUEVSX0NQVShjaGFyW0NQVUZSRVFfTkFNRV9MRU5dLCBjcHVmcmVxX2NwdV9nb3Zlcm5vcik7Ci0jZW5kaWYKKworLyogRmxhZyB0byBzdXNwZW5kL3Jlc3VtZSBDUFVGcmVxIGdvdmVybm9ycyAqLworc3RhdGljIGJvb2wgY3B1ZnJlcV9zdXNwZW5kZWQ7CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBoYXNfdGFyZ2V0KHZvaWQpCiB7CkBAIC0xODEsOCArMTgyLDggQEAKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSA9IHBlcl9jcHUoY3B1ZnJlcV9jcHVfZGF0YSwgY3B1KTsKIAogCWlmICghcG9saWN5IHx8IElTX0VSUihwb2xpY3ktPmNsaykpIHsKLQkJcHJfZXJyKCIlczogTm8gJXMgYXNzb2NpYXRlZCB0byBjcHU6ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQlwb2xpY3kgPyAiY2xrIiA6ICJwb2xpY3kiLCBjcHUpOworCQlwcl9lcnIoIiVzOiBObyAlcyBhc3NvY2lhdGVkIHRvIGNwdTogJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcG9saWN5ID8gImNsayIgOiAicG9saWN5IiwgY3B1KTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xOTAsNiArMTkxLDEyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcHVmcmVxX2dlbmVyaWNfZ2V0KTsKIAorLyogT25seSBmb3IgY3B1ZnJlcSBjb3JlIGludGVybmFsIHVzZSAqLworc3RydWN0IGNwdWZyZXFfcG9saWN5ICpjcHVmcmVxX2NwdV9nZXRfcmF3KHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIHBlcl9jcHUoY3B1ZnJlcV9jcHVfZGF0YSwgY3B1KTsKK30KKwogc3RydWN0IGNwdWZyZXFfcG9saWN5ICpjcHVmcmVxX2NwdV9nZXQodW5zaWduZWQgaW50IGNwdSkKIHsKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSA9IE5VTEw7CkBAIC0yNTQsMTUgKzI2MSwxNCBAQAogCWlmICghbF9wX2pfcmVmX2ZyZXEpIHsKIAkJbF9wX2pfcmVmID0gbG9vcHNfcGVyX2ppZmZ5OwogCQlsX3Bfal9yZWZfZnJlcSA9IGNpLT5vbGQ7Ci0JCXByX2RlYnVnKCJzYXZpbmcgJWx1IGFzIHJlZmVyZW5jZSB2YWx1ZSBmb3IgbG9vcHNfcGVyX2ppZmZ5OyAiCi0JCQkiZnJlcSBpcyAldSBrSHpcbiIsIGxfcF9qX3JlZiwgbF9wX2pfcmVmX2ZyZXEpOworCQlwcl9kZWJ1Zygic2F2aW5nICVsdSBhcyByZWZlcmVuY2UgdmFsdWUgZm9yIGxvb3BzX3Blcl9qaWZmeTsgZnJlcSBpcyAldSBrSHpcbiIsCisJCQkgbF9wX2pfcmVmLCBsX3Bfal9yZWZfZnJlcSk7CiAJfQotCWlmICgodmFsID09IENQVUZSRVFfUE9TVENIQU5HRSAmJiBjaS0+b2xkICE9IGNpLT5uZXcpIHx8Ci0JICAgICh2YWwgPT0gQ1BVRlJFUV9SRVNVTUVDSEFOR0UgfHwgdmFsID09IENQVUZSRVFfU1VTUEVORENIQU5HRSkpIHsKKwlpZiAodmFsID09IENQVUZSRVFfUE9TVENIQU5HRSAmJiBjaS0+b2xkICE9IGNpLT5uZXcpIHsKIAkJbG9vcHNfcGVyX2ppZmZ5ID0gY3B1ZnJlcV9zY2FsZShsX3Bfal9yZWYsIGxfcF9qX3JlZl9mcmVxLAogCQkJCQkJCQljaS0+bmV3KTsKLQkJcHJfZGVidWcoInNjYWxpbmcgbG9vcHNfcGVyX2ppZmZ5IHRvICVsdSAiCi0JCQkiZm9yIGZyZXF1ZW5jeSAldSBrSHpcbiIsIGxvb3BzX3Blcl9qaWZmeSwgY2ktPm5ldyk7CisJCXByX2RlYnVnKCJzY2FsaW5nIGxvb3BzX3Blcl9qaWZmeSB0byAlbHUgZm9yIGZyZXF1ZW5jeSAldSBrSHpcbiIsCisJCQkgbG9vcHNfcGVyX2ppZmZ5LCBjaS0+bmV3KTsKIAl9CiB9CiAjZWxzZQpAQCAtMjgyLDcgKzI4OCw3IEBACiAKIAlmcmVxcy0+ZmxhZ3MgPSBjcHVmcmVxX2RyaXZlci0+ZmxhZ3M7CiAJcHJfZGVidWcoIm5vdGlmaWNhdGlvbiAldSBvZiBmcmVxdWVuY3kgdHJhbnNpdGlvbiB0byAldSBrSHpcbiIsCi0JCXN0YXRlLCBmcmVxcy0+bmV3KTsKKwkJIHN0YXRlLCBmcmVxcy0+bmV3KTsKIAogCXN3aXRjaCAoc3RhdGUpIHsKIApAQCAtMjk0LDkgKzMwMCw4IEBACiAJCWlmICghKGNwdWZyZXFfZHJpdmVyLT5mbGFncyAmIENQVUZSRVFfQ09OU1RfTE9PUFMpKSB7CiAJCQlpZiAoKHBvbGljeSkgJiYgKHBvbGljeS0+Y3B1ID09IGZyZXFzLT5jcHUpICYmCiAJCQkgICAgKHBvbGljeS0+Y3VyKSAmJiAocG9saWN5LT5jdXIgIT0gZnJlcXMtPm9sZCkpIHsKLQkJCQlwcl9kZWJ1ZygiV2FybmluZzogQ1BVIGZyZXF1ZW5jeSBpcyIKLQkJCQkJIiAldSwgY3B1ZnJlcSBhc3N1bWVkICV1IGtIei5cbiIsCi0JCQkJCWZyZXFzLT5vbGQsIHBvbGljeS0+Y3VyKTsKKwkJCQlwcl9kZWJ1ZygiV2FybmluZzogQ1BVIGZyZXF1ZW5jeSBpcyAldSwgY3B1ZnJlcSBhc3N1bWVkICV1IGtIelxuIiwKKwkJCQkJIGZyZXFzLT5vbGQsIHBvbGljeS0+Y3VyKTsKIAkJCQlmcmVxcy0+b2xkID0gcG9saWN5LT5jdXI7CiAJCQl9CiAJCX0KQEAgLTMwNyw4ICszMTIsOCBAQAogCiAJY2FzZSBDUFVGUkVRX1BPU1RDSEFOR0U6CiAJCWFkanVzdF9qaWZmaWVzKENQVUZSRVFfUE9TVENIQU5HRSwgZnJlcXMpOwotCQlwcl9kZWJ1ZygiRlJFUTogJWx1IC0gQ1BVOiAlbHUiLCAodW5zaWduZWQgbG9uZylmcmVxcy0+bmV3LAotCQkJKHVuc2lnbmVkIGxvbmcpZnJlcXMtPmNwdSk7CisJCXByX2RlYnVnKCJGUkVROiAlbHUgLSBDUFU6ICVsdVxuIiwKKwkJCSAodW5zaWduZWQgbG9uZylmcmVxcy0+bmV3LCAodW5zaWduZWQgbG9uZylmcmVxcy0+Y3B1KTsKIAkJdHJhY2VfY3B1X2ZyZXF1ZW5jeShmcmVxcy0+bmV3LCBmcmVxcy0+Y3B1KTsKIAkJc3JjdV9ub3RpZmllcl9jYWxsX2NoYWluKCZjcHVmcmVxX3RyYW5zaXRpb25fbm90aWZpZXJfbGlzdCwKIAkJCQlDUFVGUkVRX1BPU1RDSEFOR0UsIGZyZXFzKTsKQEAgLTM1Miw3ICszNTcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgICAgICAgIFNZU0ZTIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXNzaXplX3Qgc2hvd19ib29zdChzdHJ1Y3Qga29iamVjdCAqa29iaiwKK3N0YXRpYyBzc2l6ZV90IHNob3dfYm9vc3Qoc3RydWN0IGtvYmplY3QgKmtvYmosCiAJCQkJIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY3B1ZnJlcV9kcml2ZXItPmJvb3N0X2VuYWJsZWQpOwpAQCAtMzY4LDEzICszNzMsMTMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoY3B1ZnJlcV9ib29zdF90cmlnZ2VyX3N0YXRlKGVuYWJsZSkpIHsKLQkJcHJfZXJyKCIlczogQ2Fubm90ICVzIEJPT1NUIVxuIiwgX19mdW5jX18sCi0JCSAgICAgICBlbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7CisJCXByX2VycigiJXM6IENhbm5vdCAlcyBCT09TVCFcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwcl9kZWJ1ZygiJXM6IGNwdWZyZXEgQk9PU1QgJXNcbiIsIF9fZnVuY19fLAotCQkgZW5hYmxlID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJcHJfZGVidWcoIiVzOiBjcHVmcmVxIEJPT1NUICVzXG4iLAorCQkgX19mdW5jX18sIGVuYWJsZSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwogCiAJcmV0dXJuIGNvdW50OwogfQpAQCAtODc5LDE4ICs4ODQsMjUgQEAKIAogc3RhdGljIHZvaWQgY3B1ZnJlcV9pbml0X3BvbGljeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKKwlzdHJ1Y3QgY3B1ZnJlcV9nb3Zlcm5vciAqZ292ID0gTlVMTDsKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgbmV3X3BvbGljeTsKIAlpbnQgcmV0ID0gMDsKIAogCW1lbWNweSgmbmV3X3BvbGljeSwgcG9saWN5LCBzaXplb2YoKnBvbGljeSkpOwogCisJLyogVXBkYXRlIGdvdmVybm9yIG9mIG5ld19wb2xpY3kgdG8gdGhlIGdvdmVybm9yIHVzZWQgYmVmb3JlIGhvdHBsdWcgKi8KKwlnb3YgPSBfX2ZpbmRfZ292ZXJub3IocGVyX2NwdShjcHVmcmVxX2NwdV9nb3Zlcm5vciwgcG9saWN5LT5jcHUpKTsKKwlpZiAoZ292KQorCQlwcl9kZWJ1ZygiUmVzdG9yaW5nIGdvdmVybm9yICVzIGZvciBjcHUgJWRcbiIsCisJCQkJcG9saWN5LT5nb3Zlcm5vci0+bmFtZSwgcG9saWN5LT5jcHUpOworCWVsc2UKKwkJZ292ID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCisJbmV3X3BvbGljeS5nb3Zlcm5vciA9IGdvdjsKKwogCS8qIFVzZSB0aGUgZGVmYXVsdCBwb2xpY3kgaWYgaXRzIHZhbGlkLiAqLwogCWlmIChjcHVmcmVxX2RyaXZlci0+c2V0cG9saWN5KQotCQljcHVmcmVxX3BhcnNlX2dvdmVybm9yKHBvbGljeS0+Z292ZXJub3ItPm5hbWUsCi0JCQkJCSZuZXdfcG9saWN5LnBvbGljeSwgTlVMTCk7Ci0KLQkvKiBhc3N1cmUgdGhhdCB0aGUgc3RhcnRpbmcgc2VxdWVuY2UgaXMgcnVuIGluIGNwdWZyZXFfc2V0X3BvbGljeSAqLwotCXBvbGljeS0+Z292ZXJub3IgPSBOVUxMOworCQljcHVmcmVxX3BhcnNlX2dvdmVybm9yKGdvdi0+bmFtZSwgJm5ld19wb2xpY3kucG9saWN5LCBOVUxMKTsKIAogCS8qIHNldCBkZWZhdWx0IHBvbGljeSAqLwogCXJldCA9IGNwdWZyZXFfc2V0X3BvbGljeShwb2xpY3ksICZuZXdfcG9saWN5KTsKQEAgLTkyNyw4ICs5MzksMTEgQEAKIAl1cF93cml0ZSgmcG9saWN5LT5yd3NlbSk7CiAKIAlpZiAoaGFzX3RhcmdldCgpKSB7Ci0JCWlmICgocmV0ID0gX19jcHVmcmVxX2dvdmVybm9yKHBvbGljeSwgQ1BVRlJFUV9HT1ZfU1RBUlQpKSB8fAotCQkJKHJldCA9IF9fY3B1ZnJlcV9nb3Zlcm5vcihwb2xpY3ksIENQVUZSRVFfR09WX0xJTUlUUykpKSB7CisJCXJldCA9IF9fY3B1ZnJlcV9nb3Zlcm5vcihwb2xpY3ksIENQVUZSRVFfR09WX1NUQVJUKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBfX2NwdWZyZXFfZ292ZXJub3IocG9saWN5LCBDUFVGUkVRX0dPVl9MSU1JVFMpOworCisJCWlmIChyZXQpIHsKIAkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzdGFydCBnb3Zlcm5vclxuIiwgX19mdW5jX18pOwogCQkJcmV0dXJuIHJldDsKIAkJfQpAQCAtOTQ5LDYgKzk2NCw4IEBACiAKIAlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZjcHVmcmVxX2RyaXZlcl9sb2NrLCBmbGFncyk7CiAKKwlwb2xpY3ktPmdvdmVybm9yID0gTlVMTDsKKwogCXJldHVybiBwb2xpY3k7CiB9CiAKQEAgLTEwMjIsMjEgKzEwMzksMTkgQEAKIAogCXVwX3dyaXRlKCZwb2xpY3ktPnJ3c2VtKTsKIAotCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3VwZGF0ZV9wb2xpY3lfY3B1KHBvbGljeSk7CiAJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmY3B1ZnJlcV9wb2xpY3lfbm90aWZpZXJfbGlzdCwKIAkJCUNQVUZSRVFfVVBEQVRFX1BPTElDWV9DUFUsIHBvbGljeSk7CiB9CiAKLXN0YXRpYyBpbnQgX19jcHVmcmVxX2FkZF9kZXYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc3Vic3lzX2ludGVyZmFjZSAqc2lmLAotCQkJICAgICBib29sIGZyb3plbikKK3N0YXRpYyBpbnQgX19jcHVmcmVxX2FkZF9kZXYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc3Vic3lzX2ludGVyZmFjZSAqc2lmKQogewogCXVuc2lnbmVkIGludCBqLCBjcHUgPSBkZXYtPmlkOwogCWludCByZXQgPSAtRU5PTUVNOwogCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCByZWNvdmVyX3BvbGljeSA9IGNwdWZyZXFfc3VzcGVuZGVkOwogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqdHBvbGljeTsKLQlzdHJ1Y3QgY3B1ZnJlcV9nb3Zlcm5vciAqZ292OwogI2VuZGlmCiAKIAlpZiAoY3B1X2lzX29mZmxpbmUoY3B1KSkKQEAgLTEwNzUsOSArMTA5MCw5IEBACiAJICogUmVzdG9yZSB0aGUgc2F2ZWQgcG9saWN5IHdoZW4gZG9pbmcgbGlnaHQtd2VpZ2h0IGluaXQgYW5kIGZhbGwgYmFjawogCSAqIHRvIHRoZSBmdWxsIGluaXQgaWYgdGhhdCBmYWlscy4KIAkgKi8KLQlwb2xpY3kgPSBmcm96ZW4gPyBjcHVmcmVxX3BvbGljeV9yZXN0b3JlKGNwdSkgOiBOVUxMOworCXBvbGljeSA9IHJlY292ZXJfcG9saWN5ID8gY3B1ZnJlcV9wb2xpY3lfcmVzdG9yZShjcHUpIDogTlVMTDsKIAlpZiAoIXBvbGljeSkgewotCQlmcm96ZW4gPSBmYWxzZTsKKwkJcmVjb3Zlcl9wb2xpY3kgPSBmYWxzZTsKIAkJcG9saWN5ID0gY3B1ZnJlcV9wb2xpY3lfYWxsb2MoKTsKIAkJaWYgKCFwb2xpY3kpCiAJCQlnb3RvIG5vbWVtX291dDsKQEAgLTEwODksMTIgKzExMDQsMTEgQEAKIAkgKiB0aGUgY3JlYXRpb24gb2YgYSBicmFuZCBuZXcgb25lLiBTbyB3ZSBuZWVkIHRvIHBlcmZvcm0gdGhpcyB1cGRhdGUKIAkgKiBieSBpbnZva2luZyB1cGRhdGVfcG9saWN5X2NwdSgpLgogCSAqLwotCWlmIChmcm96ZW4gJiYgY3B1ICE9IHBvbGljeS0+Y3B1KQorCWlmIChyZWNvdmVyX3BvbGljeSAmJiBjcHUgIT0gcG9saWN5LT5jcHUpCiAJCXVwZGF0ZV9wb2xpY3lfY3B1KHBvbGljeSwgY3B1KTsKIAllbHNlCiAJCXBvbGljeS0+Y3B1ID0gY3B1OwogCi0JcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKIAljcHVtYXNrX2NvcHkocG9saWN5LT5jcHVzLCBjcHVtYXNrX29mKGNwdSkpOwogCiAJaW5pdF9jb21wbGV0aW9uKCZwb2xpY3ktPmtvYmpfdW5yZWdpc3Rlcik7CkBAIC0xMTE4LDcgKzExMzIsNyBAQAogCSAqLwogCWNwdW1hc2tfYW5kKHBvbGljeS0+Y3B1cywgcG9saWN5LT5jcHVzLCBjcHVfb25saW5lX21hc2spOwogCi0JaWYgKCFmcm96ZW4pIHsKKwlpZiAoIXJlY292ZXJfcG9saWN5KSB7CiAJCXBvbGljeS0+dXNlcl9wb2xpY3kubWluID0gcG9saWN5LT5taW47CiAJCXBvbGljeS0+dXNlcl9wb2xpY3kubWF4ID0gcG9saWN5LT5tYXg7CiAJfQpAQCAtMTE4MCwxNiArMTE5NCw3IEBACiAJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmY3B1ZnJlcV9wb2xpY3lfbm90aWZpZXJfbGlzdCwKIAkJCQkgICAgIENQVUZSRVFfU1RBUlQsIHBvbGljeSk7CiAKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLQlnb3YgPSBfX2ZpbmRfZ292ZXJub3IocGVyX2NwdShjcHVmcmVxX2NwdV9nb3Zlcm5vciwgY3B1KSk7Ci0JaWYgKGdvdikgewotCQlwb2xpY3ktPmdvdmVybm9yID0gZ292OwotCQlwcl9kZWJ1ZygiUmVzdG9yaW5nIGdvdmVybm9yICVzIGZvciBjcHUgJWRcbiIsCi0JCSAgICAgICBwb2xpY3ktPmdvdmVybm9yLT5uYW1lLCBjcHUpOwotCX0KLSNlbmRpZgotCi0JaWYgKCFmcm96ZW4pIHsKKwlpZiAoIXJlY292ZXJfcG9saWN5KSB7CiAJCXJldCA9IGNwdWZyZXFfYWRkX2Rldl9pbnRlcmZhY2UocG9saWN5LCBkZXYpOwogCQlpZiAocmV0KQogCQkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXI7CkBAIC0xMjAzLDcgKzEyMDgsNyBAQAogCiAJY3B1ZnJlcV9pbml0X3BvbGljeShwb2xpY3kpOwogCi0JaWYgKCFmcm96ZW4pIHsKKwlpZiAoIXJlY292ZXJfcG9saWN5KSB7CiAJCXBvbGljeS0+dXNlcl9wb2xpY3kucG9saWN5ID0gcG9saWN5LT5wb2xpY3k7CiAJCXBvbGljeS0+dXNlcl9wb2xpY3kuZ292ZXJub3IgPSBwb2xpY3ktPmdvdmVybm9yOwogCX0KQEAgLTEyMjYsNyArMTIzMSw3IEBACiAJaWYgKGNwdWZyZXFfZHJpdmVyLT5leGl0KQogCQljcHVmcmVxX2RyaXZlci0+ZXhpdChwb2xpY3kpOwogZXJyX3NldF9wb2xpY3lfY3B1OgotCWlmIChmcm96ZW4pIHsKKwlpZiAocmVjb3Zlcl9wb2xpY3kpIHsKIAkJLyogRG8gbm90IGxlYXZlIHN0YWxlIGZhbGxiYWNrIGRhdGEgYmVoaW5kLiAqLwogCQlwZXJfY3B1KGNwdWZyZXFfY3B1X2RhdGFfZmFsbGJhY2ssIGNwdSkgPSBOVUxMOwogCQljcHVmcmVxX3BvbGljeV9wdXRfa29iaihwb2xpY3kpOwpAQCAtMTI1MCw3ICsxMjU1LDcgQEAKICAqLwogc3RhdGljIGludCBjcHVmcmVxX2FkZF9kZXYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc3Vic3lzX2ludGVyZmFjZSAqc2lmKQogewotCXJldHVybiBfX2NwdWZyZXFfYWRkX2RldihkZXYsIHNpZiwgZmFsc2UpOworCXJldHVybiBfX2NwdWZyZXFfYWRkX2RldihkZXYsIHNpZik7CiB9CiAKIHN0YXRpYyBpbnQgY3B1ZnJlcV9ub21pbmF0ZV9uZXdfcG9saWN5X2NwdShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKQEAgLTEyNjUsNyArMTI3MCw3IEBACiAJc3lzZnNfcmVtb3ZlX2xpbmsoJmNwdV9kZXYtPmtvYmosICJjcHVmcmVxIik7CiAJcmV0ID0ga29iamVjdF9tb3ZlKCZwb2xpY3ktPmtvYmosICZjcHVfZGV2LT5rb2JqKTsKIAlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEZhaWxlZCB0byBtb3ZlIGtvYmo6ICVkIiwgX19mdW5jX18sIHJldCk7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byBtb3ZlIGtvYmo6ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAogCQlkb3duX3dyaXRlKCZwb2xpY3ktPnJ3c2VtKTsKIAkJY3B1bWFza19zZXRfY3B1KG9sZF9jcHUsIHBvbGljeS0+Y3B1cyk7CkBAIC0xMjgxLDggKzEyODYsNyBAQAogfQogCiBzdGF0aWMgaW50IF9fY3B1ZnJlcV9yZW1vdmVfZGV2X3ByZXBhcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQlzdHJ1Y3Qgc3Vic3lzX2ludGVyZmFjZSAqc2lmLAotCQkJCQlib29sIGZyb3plbikKKwkJCQkJc3RydWN0IHN1YnN5c19pbnRlcmZhY2UgKnNpZikKIHsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gZGV2LT5pZCwgY3B1czsKIAlpbnQgbmV3X2NwdSwgcmV0OwpAQCAtMTI5Niw3ICsxMzAwLDcgQEAKIAlwb2xpY3kgPSBwZXJfY3B1KGNwdWZyZXFfY3B1X2RhdGEsIGNwdSk7CiAKIAkvKiBTYXZlIHRoZSBwb2xpY3kgc29tZXdoZXJlIHdoZW4gZG9pbmcgYSBsaWdodC13ZWlnaHQgdGVhci1kb3duICovCi0JaWYgKGZyb3plbikKKwlpZiAoY3B1ZnJlcV9zdXNwZW5kZWQpCiAJCXBlcl9jcHUoY3B1ZnJlcV9jcHVfZGF0YV9mYWxsYmFjaywgY3B1KSA9IHBvbGljeTsKIAogCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZjcHVmcmVxX2RyaXZlcl9sb2NrLCBmbGFncyk7CkBAIC0xMzE0LDExICsxMzE4LDkgQEAKIAkJfQogCX0KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogCWlmICghY3B1ZnJlcV9kcml2ZXItPnNldHBvbGljeSkKIAkJc3RybmNweShwZXJfY3B1KGNwdWZyZXFfY3B1X2dvdmVybm9yLCBjcHUpLAogCQkJcG9saWN5LT5nb3Zlcm5vci0+bmFtZSwgQ1BVRlJFUV9OQU1FX0xFTik7Ci0jZW5kaWYKIAogCWRvd25fcmVhZCgmcG9saWN5LT5yd3NlbSk7CiAJY3B1cyA9IGNwdW1hc2tfd2VpZ2h0KHBvbGljeS0+Y3B1cyk7CkBAIC0xMzMxLDE5ICsxMzMzLDE5IEBACiAJCWlmIChuZXdfY3B1ID49IDApIHsKIAkJCXVwZGF0ZV9wb2xpY3lfY3B1KHBvbGljeSwgbmV3X2NwdSk7CiAKLQkJCWlmICghZnJvemVuKSB7CisJCQlpZiAoIWNwdWZyZXFfc3VzcGVuZGVkKQogCQkJCXByX2RlYnVnKCIlczogcG9saWN5IEtvYmplY3QgbW92ZWQgdG8gY3B1OiAlZCBmcm9tOiAlZFxuIiwKLQkJCQkJCV9fZnVuY19fLCBuZXdfY3B1LCBjcHUpOwotCQkJfQorCQkJCQkgX19mdW5jX18sIG5ld19jcHUsIGNwdSk7CiAJCX0KKwl9IGVsc2UgaWYgKGNwdWZyZXFfZHJpdmVyLT5zdG9wX2NwdSAmJiBjcHVmcmVxX2RyaXZlci0+c2V0cG9saWN5KSB7CisJCWNwdWZyZXFfZHJpdmVyLT5zdG9wX2NwdShwb2xpY3kpOwogCX0KIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9fY3B1ZnJlcV9yZW1vdmVfZGV2X2ZpbmlzaChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBzdWJzeXNfaW50ZXJmYWNlICpzaWYsCi0JCQkJICAgICAgIGJvb2wgZnJvemVuKQorCQkJCSAgICAgICBzdHJ1Y3Qgc3Vic3lzX2ludGVyZmFjZSAqc2lmKQogewogCXVuc2lnbmVkIGludCBjcHUgPSBkZXYtPmlkLCBjcHVzOwogCWludCByZXQ7CkBAIC0xMzczLDEyICsxMzc1LDEyIEBACiAJCQkJCUNQVUZSRVFfR09WX1BPTElDWV9FWElUKTsKIAkJCWlmIChyZXQpIHsKIAkJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gZXhpdCBnb3Zlcm5vclxuIiwKLQkJCQkJCV9fZnVuY19fKTsKKwkJCQkgICAgICAgX19mdW5jX18pOwogCQkJCXJldHVybiByZXQ7CiAJCQl9CiAJCX0KIAotCQlpZiAoIWZyb3plbikKKwkJaWYgKCFjcHVmcmVxX3N1c3BlbmRlZCkKIAkJCWNwdWZyZXFfcG9saWN5X3B1dF9rb2JqKHBvbGljeSk7CiAKIAkJLyoKQEAgLTEzOTQsMTYgKzEzOTYsMTYgQEAKIAkJbGlzdF9kZWwoJnBvbGljeS0+cG9saWN5X2xpc3QpOwogCQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmY3B1ZnJlcV9kcml2ZXJfbG9jaywgZmxhZ3MpOwogCi0JCWlmICghZnJvemVuKQorCQlpZiAoIWNwdWZyZXFfc3VzcGVuZGVkKQogCQkJY3B1ZnJlcV9wb2xpY3lfZnJlZShwb2xpY3kpOwotCX0gZWxzZSB7Ci0JCWlmIChoYXNfdGFyZ2V0KCkpIHsKLQkJCWlmICgocmV0ID0gX19jcHVmcmVxX2dvdmVybm9yKHBvbGljeSwgQ1BVRlJFUV9HT1ZfU1RBUlQpKSB8fAotCQkJCQkocmV0ID0gX19jcHVmcmVxX2dvdmVybm9yKHBvbGljeSwgQ1BVRlJFUV9HT1ZfTElNSVRTKSkpIHsKLQkJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc3RhcnQgZ292ZXJub3JcbiIsCi0JCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KKwl9IGVsc2UgaWYgKGhhc190YXJnZXQoKSkgeworCQlyZXQgPSBfX2NwdWZyZXFfZ292ZXJub3IocG9saWN5LCBDUFVGUkVRX0dPVl9TVEFSVCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gX19jcHVmcmVxX2dvdmVybm9yKHBvbGljeSwgQ1BVRlJFUV9HT1ZfTElNSVRTKTsKKworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc3RhcnQgZ292ZXJub3JcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAl9CiAKQEAgLTE0MjQsMTAgKzE0MjYsMTAgQEAKIAlpZiAoY3B1X2lzX29mZmxpbmUoY3B1KSkKIAkJcmV0dXJuIDA7CiAKLQlyZXQgPSBfX2NwdWZyZXFfcmVtb3ZlX2Rldl9wcmVwYXJlKGRldiwgc2lmLCBmYWxzZSk7CisJcmV0ID0gX19jcHVmcmVxX3JlbW92ZV9kZXZfcHJlcGFyZShkZXYsIHNpZik7CiAKIAlpZiAoIXJldCkKLQkJcmV0ID0gX19jcHVmcmVxX3JlbW92ZV9kZXZfZmluaXNoKGRldiwgc2lmLCBmYWxzZSk7CisJCXJldCA9IF9fY3B1ZnJlcV9yZW1vdmVfZGV2X2ZpbmlzaChkZXYsIHNpZik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTQ1OCw4ICsxNDYwLDggQEAKIAlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JcHJfZGVidWcoIldhcm5pbmc6IENQVSBmcmVxdWVuY3kgb3V0IG9mIHN5bmM6IGNwdWZyZXEgYW5kIHRpbWluZyAiCi0JICAgICAgICJjb3JlIHRoaW5rcyBvZiAldSwgaXMgJXUga0h6LlxuIiwgb2xkX2ZyZXEsIG5ld19mcmVxKTsKKwlwcl9kZWJ1ZygiV2FybmluZzogQ1BVIGZyZXF1ZW5jeSBvdXQgb2Ygc3luYzogY3B1ZnJlcSBhbmQgdGltaW5nIGNvcmUgdGhpbmtzIG9mICV1LCBpcyAldSBrSHpcbiIsCisJCSBvbGRfZnJlcSwgbmV3X2ZyZXEpOwogCiAJZnJlcXMub2xkID0gb2xkX2ZyZXE7CiAJZnJlcXMubmV3ID0gbmV3X2ZyZXE7CkBAIC0xNTcwLDgzICsxNTcyLDEwNCBAQAogCS5yZW1vdmVfZGV2CT0gY3B1ZnJlcV9yZW1vdmVfZGV2LAogfTsKIAotLyoqCi0gKiBjcHVmcmVxX2JwX3N1c3BlbmQgLSBQcmVwYXJlIHRoZSBib290IENQVSBmb3Igc3lzdGVtIHN1c3BlbmQuCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIGZvciB0aGUgYm9vdCBwcm9jZXNzb3IuICBUaGUgb3RoZXIgQ1BVcwotICogaGF2ZSBiZWVuIHB1dCBvZmZsaW5lIGJ5IG1lYW5zIG9mIENQVSBob3RwbHVnLgorLyoKKyAqIEluIGNhc2UgcGxhdGZvcm0gd2FudHMgc29tZSBzcGVjaWZpYyBmcmVxdWVuY3kgdG8gYmUgY29uZmlndXJlZAorICogZHVyaW5nIHN1c3BlbmQuLgogICovCi1zdGF0aWMgaW50IGNwdWZyZXFfYnBfc3VzcGVuZCh2b2lkKQoraW50IGNwdWZyZXFfZ2VuZXJpY19zdXNwZW5kKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQogewotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5OwotCi0JcHJfZGVidWcoInN1c3BlbmRpbmcgY3B1ICV1XG4iLCBjcHUpOwotCi0JLyogSWYgdGhlcmUncyBubyBwb2xpY3kgZm9yIHRoZSBib290IENQVSwgd2UgaGF2ZSBub3RoaW5nIHRvIGRvLiAqLwotCXBvbGljeSA9IGNwdWZyZXFfY3B1X2dldChjcHUpOwotCWlmICghcG9saWN5KQotCQlyZXR1cm4gMDsKLQotCWlmIChjcHVmcmVxX2RyaXZlci0+c3VzcGVuZCkgewotCQlyZXQgPSBjcHVmcmVxX2RyaXZlci0+c3VzcGVuZChwb2xpY3kpOwotCQlpZiAocmV0KQotCQkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBzdXNwZW5kIGZhaWxlZCBpbiAtPnN1c3BlbmQgIgotCQkJCQkic3RlcCBvbiBDUFUgJXVcbiIsIHBvbGljeS0+Y3B1KTsKKwlpZiAoIXBvbGljeS0+c3VzcGVuZF9mcmVxKSB7CisJCXByX2VycigiJXM6IHN1c3BlbmRfZnJlcSBjYW4ndCBiZSB6ZXJvXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWNwdWZyZXFfY3B1X3B1dChwb2xpY3kpOworCXByX2RlYnVnKCIlczogU2V0dGluZyBzdXNwZW5kLWZyZXE6ICV1XG4iLCBfX2Z1bmNfXywKKwkJCXBvbGljeS0+c3VzcGVuZF9mcmVxKTsKKworCXJldCA9IF9fY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KHBvbGljeSwgcG9saWN5LT5zdXNwZW5kX2ZyZXEsCisJCQlDUFVGUkVRX1JFTEFUSU9OX0gpOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IHVuYWJsZSB0byBzZXQgc3VzcGVuZC1mcmVxOiAldS4gZXJyOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcG9saWN5LT5zdXNwZW5kX2ZyZXEsIHJldCk7CisKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTChjcHVmcmVxX2dlbmVyaWNfc3VzcGVuZCk7CiAKIC8qKgotICogY3B1ZnJlcV9icF9yZXN1bWUgLSBSZXN0b3JlIHByb3BlciBmcmVxdWVuY3kgaGFuZGxpbmcgb2YgdGhlIGJvb3QgQ1BVLgorICogY3B1ZnJlcV9zdXNwZW5kKCkgLSBTdXNwZW5kIENQVUZyZXEgZ292ZXJub3JzCiAgKgotICoJMS4pIHJlc3VtZSBDUFVmcmVxIGhhcmR3YXJlIHN1cHBvcnQgKGNwdWZyZXFfZHJpdmVyLT5yZXN1bWUoKSkKLSAqCTIuKSBzY2hlZHVsZSBjYWxsIGNwdWZyZXFfdXBkYXRlX3BvbGljeSgpIEFTQVAgYXMgaW50ZXJydXB0cyBhcmUKLSAqCSAgICByZXN0b3JlZC4gSXQgd2lsbCB2ZXJpZnkgdGhhdCB0aGUgY3VycmVudCBmcmVxIGlzIGluIHN5bmMgd2l0aAotICoJICAgIHdoYXQgd2UgYmVsaWV2ZSBpdCB0byBiZS4gVGhpcyBpcyBhIGJpdCBsYXRlciB0aGFuIHdoZW4gaXQKLSAqCSAgICBzaG91bGQgYmUsIGJ1dCBub25ldGh0ZWxlc3MgaXQncyBiZXR0ZXIgdGhhbiBjYWxsaW5nCi0gKgkgICAgY3B1ZnJlcV9kcml2ZXItPmdldCgpIGhlcmUgd2hpY2ggbWlnaHQgcmUtZW5hYmxlIGludGVycnVwdHMuLi4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgZm9yIHRoZSBib290IENQVS4gIFRoZSBvdGhlciBDUFVzIGhhdmUgbm90Ci0gKiBiZWVuIHR1cm5lZCBvbiB5ZXQuCisgKiBDYWxsZWQgZHVyaW5nIHN5c3RlbSB3aWRlIFN1c3BlbmQvSGliZXJuYXRlIGN5Y2xlcyBmb3Igc3VzcGVuZGluZyBnb3Zlcm5vcnMKKyAqIGFzIHNvbWUgcGxhdGZvcm1zIGNhbid0IGNoYW5nZSBmcmVxdWVuY3kgYWZ0ZXIgdGhpcyBwb2ludCBpbiBzdXNwZW5kIGN5Y2xlLgorICogQmVjYXVzZSBzb21lIG9mIHRoZSBkZXZpY2VzIChsaWtlOiBpMmMsIHJlZ3VsYXRvcnMsIGV0YykgdGhleSB1c2UgZm9yCisgKiBjaGFuZ2luZyBmcmVxdWVuY3kgYXJlIHN1c3BlbmRlZCBxdWlja2x5IGFmdGVyIHRoaXMgcG9pbnQuCiAgKi8KLXN0YXRpYyB2b2lkIGNwdWZyZXFfYnBfcmVzdW1lKHZvaWQpCit2b2lkIGNwdWZyZXFfc3VzcGVuZCh2b2lkKQogewotCWludCByZXQgPSAwOwotCi0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeTsKIAotCXByX2RlYnVnKCJyZXN1bWluZyBjcHUgJXVcbiIsIGNwdSk7Ci0KLQkvKiBJZiB0aGVyZSdzIG5vIHBvbGljeSBmb3IgdGhlIGJvb3QgQ1BVLCB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8uICovCi0JcG9saWN5ID0gY3B1ZnJlcV9jcHVfZ2V0KGNwdSk7Ci0JaWYgKCFwb2xpY3kpCisJaWYgKCFjcHVmcmVxX2RyaXZlcikKIAkJcmV0dXJuOwogCi0JaWYgKGNwdWZyZXFfZHJpdmVyLT5yZXN1bWUpIHsKLQkJcmV0ID0gY3B1ZnJlcV9kcml2ZXItPnJlc3VtZShwb2xpY3kpOwotCQlpZiAocmV0KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImNwdWZyZXE6IHJlc3VtZSBmYWlsZWQgaW4gLT5yZXN1bWUgIgotCQkJCQkic3RlcCBvbiBDUFUgJXVcbiIsIHBvbGljeS0+Y3B1KTsKLQkJCWdvdG8gZmFpbDsKLQkJfQorCWlmICghaGFzX3RhcmdldCgpKQorCQlyZXR1cm47CisKKwlwcl9kZWJ1ZygiJXM6IFN1c3BlbmRpbmcgR292ZXJub3JzXG4iLCBfX2Z1bmNfXyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvbGljeSwgJmNwdWZyZXFfcG9saWN5X2xpc3QsIHBvbGljeV9saXN0KSB7CisJCWlmIChfX2NwdWZyZXFfZ292ZXJub3IocG9saWN5LCBDUFVGUkVRX0dPVl9TVE9QKSkKKwkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzdG9wIGdvdmVybm9yIGZvciBwb2xpY3k6ICVwXG4iLAorCQkJCV9fZnVuY19fLCBwb2xpY3kpOworCQllbHNlIGlmIChjcHVmcmVxX2RyaXZlci0+c3VzcGVuZAorCQkgICAgJiYgY3B1ZnJlcV9kcml2ZXItPnN1c3BlbmQocG9saWN5KSkKKwkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzdXNwZW5kIGRyaXZlcjogJXBcbiIsIF9fZnVuY19fLAorCQkJCXBvbGljeSk7CiAJfQogCi0Jc2NoZWR1bGVfd29yaygmcG9saWN5LT51cGRhdGUpOwotCi1mYWlsOgotCWNwdWZyZXFfY3B1X3B1dChwb2xpY3kpOworCWNwdWZyZXFfc3VzcGVuZGVkID0gdHJ1ZTsKIH0KIAotc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBjcHVmcmVxX3N5c2NvcmVfb3BzID0gewotCS5zdXNwZW5kCT0gY3B1ZnJlcV9icF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gY3B1ZnJlcV9icF9yZXN1bWUsCi19OworLyoqCisgKiBjcHVmcmVxX3Jlc3VtZSgpIC0gUmVzdW1lIENQVUZyZXEgZ292ZXJub3JzCisgKgorICogQ2FsbGVkIGR1cmluZyBzeXN0ZW0gd2lkZSBTdXNwZW5kL0hpYmVybmF0ZSBjeWNsZSBmb3IgcmVzdW1pbmcgZ292ZXJub3JzIHRoYXQKKyAqIGFyZSBzdXNwZW5kZWQgd2l0aCBjcHVmcmVxX3N1c3BlbmQoKS4KKyAqLwordm9pZCBjcHVmcmVxX3Jlc3VtZSh2b2lkKQoreworCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5OworCisJaWYgKCFjcHVmcmVxX2RyaXZlcikKKwkJcmV0dXJuOworCisJaWYgKCFoYXNfdGFyZ2V0KCkpCisJCXJldHVybjsKKworCXByX2RlYnVnKCIlczogUmVzdW1pbmcgR292ZXJub3JzXG4iLCBfX2Z1bmNfXyk7CisKKwljcHVmcmVxX3N1c3BlbmRlZCA9IGZhbHNlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb2xpY3ksICZjcHVmcmVxX3BvbGljeV9saXN0LCBwb2xpY3lfbGlzdCkgeworCQlpZiAoX19jcHVmcmVxX2dvdmVybm9yKHBvbGljeSwgQ1BVRlJFUV9HT1ZfU1RBUlQpCisJCSAgICB8fCBfX2NwdWZyZXFfZ292ZXJub3IocG9saWN5LCBDUFVGUkVRX0dPVl9MSU1JVFMpKQorCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHN0YXJ0IGdvdmVybm9yIGZvciBwb2xpY3k6ICVwXG4iLAorCQkJCV9fZnVuY19fLCBwb2xpY3kpOworCQllbHNlIGlmIChjcHVmcmVxX2RyaXZlci0+cmVzdW1lCisJCSAgICAmJiBjcHVmcmVxX2RyaXZlci0+cmVzdW1lKHBvbGljeSkpCisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gcmVzdW1lIGRyaXZlcjogJXBcbiIsIF9fZnVuY19fLAorCQkJCXBvbGljeSk7CisKKwkJLyoKKwkJICogc2NoZWR1bGUgY2FsbCBjcHVmcmVxX3VwZGF0ZV9wb2xpY3koKSBmb3IgYm9vdCBDUFUsIGkuZS4gbGFzdAorCQkgKiBwb2xpY3kgaW4gbGlzdC4gSXQgd2lsbCB2ZXJpZnkgdGhhdCB0aGUgY3VycmVudCBmcmVxIGlzIGluCisJCSAqIHN5bmMgd2l0aCB3aGF0IHdlIGJlbGlldmUgaXQgdG8gYmUuCisJCSAqLworCQlpZiAobGlzdF9pc19sYXN0KCZwb2xpY3ktPnBvbGljeV9saXN0LCAmY3B1ZnJlcV9wb2xpY3lfbGlzdCkpCisJCQlzY2hlZHVsZV93b3JrKCZwb2xpY3ktPnVwZGF0ZSk7CisJfQorfQogCiAvKioKICAqCWNwdWZyZXFfZ2V0X2N1cnJlbnRfZHJpdmVyIC0gcmV0dXJuIGN1cnJlbnQgZHJpdmVyJ3MgbmFtZQpAQCAtMTc2Miw3ICsxNzg1LDcgQEAKIAkJdGFyZ2V0X2ZyZXEgPSBwb2xpY3ktPm1pbjsKIAogCXByX2RlYnVnKCJ0YXJnZXQgZm9yIENQVSAldTogJXUga0h6LCByZWxhdGlvbiAldSwgcmVxdWVzdGVkICV1IGtIelxuIiwKLQkJCXBvbGljeS0+Y3B1LCB0YXJnZXRfZnJlcSwgcmVsYXRpb24sIG9sZF90YXJnZXRfZnJlcSk7CisJCSBwb2xpY3ktPmNwdSwgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCBvbGRfdGFyZ2V0X2ZyZXEpOwogCiAJLyoKIAkgKiBUaGlzIG1pZ2h0IGxvb2sgbGlrZSBhIHJlZHVuZGFudCBjYWxsIGFzIHdlIGFyZSBjaGVja2luZyBpdCBhZ2FpbgpAQCAtMTgwNyw4ICsxODMwLDcgQEAKIAkJCWZyZXFzLmZsYWdzID0gMDsKIAogCQkJcHJfZGVidWcoIiVzOiBjcHU6ICVkLCBvbGRmcmVxOiAldSwgbmV3IGZyZXE6ICV1XG4iLAotCQkJCQlfX2Z1bmNfXywgcG9saWN5LT5jcHUsIGZyZXFzLm9sZCwKLQkJCQkJZnJlcXMubmV3KTsKKwkJCQkgX19mdW5jX18sIHBvbGljeS0+Y3B1LCBmcmVxcy5vbGQsIGZyZXFzLm5ldyk7CiAKIAkJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24ocG9saWN5LCAmZnJlcXMsCiAJCQkJCUNQVUZSRVFfUFJFQ0hBTkdFKTsKQEAgLTE4MTcsNyArMTgzOSw3IEBACiAJCXJldHZhbCA9IGNwdWZyZXFfZHJpdmVyLT50YXJnZXRfaW5kZXgocG9saWN5LCBpbmRleCk7CiAJCWlmIChyZXR2YWwpCiAJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gY2hhbmdlIGNwdSBmcmVxdWVuY3k6ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmV0dmFsKTsKKwkJCSAgICAgICBfX2Z1bmNfXywgcmV0dmFsKTsKIAogCQlpZiAobm90aWZ5KQogCQkJY3B1ZnJlcV9ub3RpZnlfcG9zdF90cmFuc2l0aW9uKHBvbGljeSwgJmZyZXFzLCByZXR2YWwpOwpAQCAtMTg2MywxNyArMTg4NSwxOCBAQAogCXN0cnVjdCBjcHVmcmVxX2dvdmVybm9yICpnb3YgPSBOVUxMOwogI2VuZGlmCiAKKwkvKiBEb24ndCBzdGFydCBhbnkgZ292ZXJub3Igb3BlcmF0aW9ucyBpZiB3ZSBhcmUgZW50ZXJpbmcgc3VzcGVuZCAqLworCWlmIChjcHVmcmVxX3N1c3BlbmRlZCkKKwkJcmV0dXJuIDA7CisKIAlpZiAocG9saWN5LT5nb3Zlcm5vci0+bWF4X3RyYW5zaXRpb25fbGF0ZW5jeSAmJgogCSAgICBwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID4KIAkgICAgcG9saWN5LT5nb3Zlcm5vci0+bWF4X3RyYW5zaXRpb25fbGF0ZW5jeSkgewogCQlpZiAoIWdvdikKIAkJCXJldHVybiAtRUlOVkFMOwogCQllbHNlIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIGdvdmVybm9yIGZhaWxlZCwgdG9vIGxvbmciCi0JCQkgICAgICAgIiB0cmFuc2l0aW9uIGxhdGVuY3kgb2YgSFcsIGZhbGxiYWNrIgotCQkJICAgICAgICIgdG8gJXMgZ292ZXJub3JcbiIsCi0JCQkgICAgICAgcG9saWN5LT5nb3Zlcm5vci0+bmFtZSwKLQkJCSAgICAgICBnb3YtPm5hbWUpOworCQkJcHJfd2FybigiJXMgZ292ZXJub3IgZmFpbGVkLCB0b28gbG9uZyB0cmFuc2l0aW9uIGxhdGVuY3kgb2YgSFcsIGZhbGxiYWNrIHRvICVzIGdvdmVybm9yXG4iLAorCQkJCXBvbGljeS0+Z292ZXJub3ItPm5hbWUsIGdvdi0+bmFtZSk7CiAJCQlwb2xpY3ktPmdvdmVybm9yID0gZ292OwogCQl9CiAJfQpAQCAtMTg4Myw3ICsxOTA2LDcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJcHJfZGVidWcoIl9fY3B1ZnJlcV9nb3Zlcm5vciBmb3IgQ1BVICV1LCBldmVudCAldVxuIiwKLQkJCQkJCXBvbGljeS0+Y3B1LCBldmVudCk7CisJCSBwb2xpY3ktPmNwdSwgZXZlbnQpOwogCiAJbXV0ZXhfbG9jaygmY3B1ZnJlcV9nb3Zlcm5vcl9sb2NrKTsKIAlpZiAoKHBvbGljeS0+Z292ZXJub3JfZW5hYmxlZCAmJiBldmVudCA9PSBDUFVGUkVRX0dPVl9TVEFSVCkKQEAgLTE5NTAsOSArMTk3Myw3IEBACiAKIHZvaWQgY3B1ZnJlcV91bnJlZ2lzdGVyX2dvdmVybm9yKHN0cnVjdCBjcHVmcmVxX2dvdmVybm9yICpnb3Zlcm5vcikKIHsKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAlpbnQgY3B1OwotI2VuZGlmCiAKIAlpZiAoIWdvdmVybm9yKQogCQlyZXR1cm47CkBAIC0xOTYwLDE0ICsxOTgxLDEyIEBACiAJaWYgKGNwdWZyZXFfZGlzYWJsZWQoKSkKIAkJcmV0dXJuOwogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CiAJCWlmIChjcHVfb25saW5lKGNwdSkpCiAJCQljb250aW51ZTsKIAkJaWYgKCFzdHJjbXAocGVyX2NwdShjcHVmcmVxX2NwdV9nb3Zlcm5vciwgY3B1KSwgZ292ZXJub3ItPm5hbWUpKQogCQkJc3RyY3B5KHBlcl9jcHUoY3B1ZnJlcV9jcHVfZ292ZXJub3IsIGNwdSksICJcMCIpOwogCX0KLSNlbmRpZgogCiAJbXV0ZXhfbG9jaygmY3B1ZnJlcV9nb3Zlcm5vcl9tdXRleCk7CiAJbGlzdF9kZWwoJmdvdmVybm9yLT5nb3Zlcm5vcl9saXN0KTsKQEAgLTIwMTIsMjIgKzIwMzEsMjEgQEAKIHN0YXRpYyBpbnQgY3B1ZnJlcV9zZXRfcG9saWN5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAogCQkJCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqbmV3X3BvbGljeSkKIHsKLQlpbnQgcmV0ID0gMCwgZmFpbGVkID0gMTsKKwlzdHJ1Y3QgY3B1ZnJlcV9nb3Zlcm5vciAqb2xkX2dvdjsKKwlpbnQgcmV0OwogCi0JcHJfZGVidWcoInNldHRpbmcgbmV3IHBvbGljeSBmb3IgQ1BVICV1OiAldSAtICV1IGtIelxuIiwgbmV3X3BvbGljeS0+Y3B1LAotCQluZXdfcG9saWN5LT5taW4sIG5ld19wb2xpY3ktPm1heCk7CisJcHJfZGVidWcoInNldHRpbmcgbmV3IHBvbGljeSBmb3IgQ1BVICV1OiAldSAtICV1IGtIelxuIiwKKwkJIG5ld19wb2xpY3ktPmNwdSwgbmV3X3BvbGljeS0+bWluLCBuZXdfcG9saWN5LT5tYXgpOwogCiAJbWVtY3B5KCZuZXdfcG9saWN5LT5jcHVpbmZvLCAmcG9saWN5LT5jcHVpbmZvLCBzaXplb2YocG9saWN5LT5jcHVpbmZvKSk7CiAKLQlpZiAobmV3X3BvbGljeS0+bWluID4gcG9saWN5LT5tYXggfHwgbmV3X3BvbGljeS0+bWF4IDwgcG9saWN5LT5taW4pIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJvcl9vdXQ7Ci0JfQorCWlmIChuZXdfcG9saWN5LT5taW4gPiBwb2xpY3ktPm1heCB8fCBuZXdfcG9saWN5LT5tYXggPCBwb2xpY3ktPm1pbikKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiB2ZXJpZnkgdGhlIGNwdSBzcGVlZCBjYW4gYmUgc2V0IHdpdGhpbiB0aGlzIGxpbWl0ICovCiAJcmV0ID0gY3B1ZnJlcV9kcml2ZXItPnZlcmlmeShuZXdfcG9saWN5KTsKIAlpZiAocmV0KQotCQlnb3RvIGVycm9yX291dDsKKwkJcmV0dXJuIHJldDsKIAogCS8qIGFkanVzdCBpZiBuZWNlc3NhcnkgLSBhbGwgcmVhc29ucyAqLwogCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmNwdWZyZXFfcG9saWN5X25vdGlmaWVyX2xpc3QsCkBAIC0yMDQzLDcgKzIwNjEsNyBAQAogCSAqLwogCXJldCA9IGNwdWZyZXFfZHJpdmVyLT52ZXJpZnkobmV3X3BvbGljeSk7CiAJaWYgKHJldCkKLQkJZ290byBlcnJvcl9vdXQ7CisJCXJldHVybiByZXQ7CiAKIAkvKiBub3RpZmljYXRpb24gb2YgdGhlIG5ldyBwb2xpY3kgKi8KIAlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZjcHVmcmVxX3BvbGljeV9ub3RpZmllcl9saXN0LApAQCAtMjA1Myw2MyArMjA3MSw1MyBAQAogCXBvbGljeS0+bWF4ID0gbmV3X3BvbGljeS0+bWF4OwogCiAJcHJfZGVidWcoIm5ldyBtaW4gYW5kIG1heCBmcmVxcyBhcmUgJXUgLSAldSBrSHpcbiIsCi0JCQkJCXBvbGljeS0+bWluLCBwb2xpY3ktPm1heCk7CisJCSBwb2xpY3ktPm1pbiwgcG9saWN5LT5tYXgpOwogCiAJaWYgKGNwdWZyZXFfZHJpdmVyLT5zZXRwb2xpY3kpIHsKIAkJcG9saWN5LT5wb2xpY3kgPSBuZXdfcG9saWN5LT5wb2xpY3k7CiAJCXByX2RlYnVnKCJzZXR0aW5nIHJhbmdlXG4iKTsKLQkJcmV0ID0gY3B1ZnJlcV9kcml2ZXItPnNldHBvbGljeShuZXdfcG9saWN5KTsKLQl9IGVsc2UgewotCQlpZiAobmV3X3BvbGljeS0+Z292ZXJub3IgIT0gcG9saWN5LT5nb3Zlcm5vcikgewotCQkJLyogc2F2ZSBvbGQsIHdvcmtpbmcgdmFsdWVzICovCi0JCQlzdHJ1Y3QgY3B1ZnJlcV9nb3Zlcm5vciAqb2xkX2dvdiA9IHBvbGljeS0+Z292ZXJub3I7Ci0KLQkJCXByX2RlYnVnKCJnb3Zlcm5vciBzd2l0Y2hcbiIpOwotCi0JCQkvKiBlbmQgb2xkIGdvdmVybm9yICovCi0JCQlpZiAocG9saWN5LT5nb3Zlcm5vcikgewotCQkJCV9fY3B1ZnJlcV9nb3Zlcm5vcihwb2xpY3ksIENQVUZSRVFfR09WX1NUT1ApOwotCQkJCXVwX3dyaXRlKCZwb2xpY3ktPnJ3c2VtKTsKLQkJCQlfX2NwdWZyZXFfZ292ZXJub3IocG9saWN5LAotCQkJCQkJQ1BVRlJFUV9HT1ZfUE9MSUNZX0VYSVQpOwotCQkJCWRvd25fd3JpdGUoJnBvbGljeS0+cndzZW0pOwotCQkJfQotCi0JCQkvKiBzdGFydCBuZXcgZ292ZXJub3IgKi8KLQkJCXBvbGljeS0+Z292ZXJub3IgPSBuZXdfcG9saWN5LT5nb3Zlcm5vcjsKLQkJCWlmICghX19jcHVmcmVxX2dvdmVybm9yKHBvbGljeSwgQ1BVRlJFUV9HT1ZfUE9MSUNZX0lOSVQpKSB7Ci0JCQkJaWYgKCFfX2NwdWZyZXFfZ292ZXJub3IocG9saWN5LCBDUFVGUkVRX0dPVl9TVEFSVCkpIHsKLQkJCQkJZmFpbGVkID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQl1cF93cml0ZSgmcG9saWN5LT5yd3NlbSk7Ci0JCQkJCV9fY3B1ZnJlcV9nb3Zlcm5vcihwb2xpY3ksCi0JCQkJCQkJQ1BVRlJFUV9HT1ZfUE9MSUNZX0VYSVQpOwotCQkJCQlkb3duX3dyaXRlKCZwb2xpY3ktPnJ3c2VtKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChmYWlsZWQpIHsKLQkJCQkvKiBuZXcgZ292ZXJub3IgZmFpbGVkLCBzbyByZS1zdGFydCBvbGQgb25lICovCi0JCQkJcHJfZGVidWcoInN0YXJ0aW5nIGdvdmVybm9yICVzIGZhaWxlZFxuIiwKLQkJCQkJCQlwb2xpY3ktPmdvdmVybm9yLT5uYW1lKTsKLQkJCQlpZiAob2xkX2dvdikgewotCQkJCQlwb2xpY3ktPmdvdmVybm9yID0gb2xkX2dvdjsKLQkJCQkJX19jcHVmcmVxX2dvdmVybm9yKHBvbGljeSwKLQkJCQkJCQlDUFVGUkVRX0dPVl9QT0xJQ1lfSU5JVCk7Ci0JCQkJCV9fY3B1ZnJlcV9nb3Zlcm5vcihwb2xpY3ksCi0JCQkJCQkJICAgQ1BVRlJFUV9HT1ZfU1RBUlQpOwotCQkJCX0KLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWdvdG8gZXJyb3Jfb3V0OwotCQkJfQotCQkJLyogbWlnaHQgYmUgYSBwb2xpY3kgY2hhbmdlLCB0b28sIHNvIGZhbGwgdGhyb3VnaCAqLwotCQl9Ci0JCXByX2RlYnVnKCJnb3Zlcm5vcjogY2hhbmdlIG9yIHVwZGF0ZSBsaW1pdHNcbiIpOwotCQlyZXQgPSBfX2NwdWZyZXFfZ292ZXJub3IocG9saWN5LCBDUFVGUkVRX0dPVl9MSU1JVFMpOworCQlyZXR1cm4gY3B1ZnJlcV9kcml2ZXItPnNldHBvbGljeShuZXdfcG9saWN5KTsKIAl9CiAKLWVycm9yX291dDoKLQlyZXR1cm4gcmV0OworCWlmIChuZXdfcG9saWN5LT5nb3Zlcm5vciA9PSBwb2xpY3ktPmdvdmVybm9yKQorCQlnb3RvIG91dDsKKworCXByX2RlYnVnKCJnb3Zlcm5vciBzd2l0Y2hcbiIpOworCisJLyogc2F2ZSBvbGQsIHdvcmtpbmcgdmFsdWVzICovCisJb2xkX2dvdiA9IHBvbGljeS0+Z292ZXJub3I7CisJLyogZW5kIG9sZCBnb3Zlcm5vciAqLworCWlmIChvbGRfZ292KSB7CisJCV9fY3B1ZnJlcV9nb3Zlcm5vcihwb2xpY3ksIENQVUZSRVFfR09WX1NUT1ApOworCQl1cF93cml0ZSgmcG9saWN5LT5yd3NlbSk7CisJCV9fY3B1ZnJlcV9nb3Zlcm5vcihwb2xpY3ksIENQVUZSRVFfR09WX1BPTElDWV9FWElUKTsKKwkJZG93bl93cml0ZSgmcG9saWN5LT5yd3NlbSk7CisJfQorCisJLyogc3RhcnQgbmV3IGdvdmVybm9yICovCisJcG9saWN5LT5nb3Zlcm5vciA9IG5ld19wb2xpY3ktPmdvdmVybm9yOworCWlmICghX19jcHVmcmVxX2dvdmVybm9yKHBvbGljeSwgQ1BVRlJFUV9HT1ZfUE9MSUNZX0lOSVQpKSB7CisJCWlmICghX19jcHVmcmVxX2dvdmVybm9yKHBvbGljeSwgQ1BVRlJFUV9HT1ZfU1RBUlQpKQorCQkJZ290byBvdXQ7CisKKwkJdXBfd3JpdGUoJnBvbGljeS0+cndzZW0pOworCQlfX2NwdWZyZXFfZ292ZXJub3IocG9saWN5LCBDUFVGUkVRX0dPVl9QT0xJQ1lfRVhJVCk7CisJCWRvd25fd3JpdGUoJnBvbGljeS0+cndzZW0pOworCX0KKworCS8qIG5ldyBnb3Zlcm5vciBmYWlsZWQsIHNvIHJlLXN0YXJ0IG9sZCBvbmUgKi8KKwlwcl9kZWJ1Zygic3RhcnRpbmcgZ292ZXJub3IgJXMgZmFpbGVkXG4iLCBwb2xpY3ktPmdvdmVybm9yLT5uYW1lKTsKKwlpZiAob2xkX2dvdikgeworCQlwb2xpY3ktPmdvdmVybm9yID0gb2xkX2dvdjsKKwkJX19jcHVmcmVxX2dvdmVybm9yKHBvbGljeSwgQ1BVRlJFUV9HT1ZfUE9MSUNZX0lOSVQpOworCQlfX2NwdWZyZXFfZ292ZXJub3IocG9saWN5LCBDUFVGUkVRX0dPVl9TVEFSVCk7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7CisKKyBvdXQ6CisJcHJfZGVidWcoImdvdmVybm9yOiBjaGFuZ2Ugb3IgdXBkYXRlIGxpbWl0c1xuIik7CisJcmV0dXJuIF9fY3B1ZnJlcV9nb3Zlcm5vcihwb2xpY3ksIENQVUZSRVFfR09WX0xJTUlUUyk7CiB9CiAKIC8qKgpAQCAtMjE0NSw4ICsyMTUzLDEzIEBACiAJICovCiAJaWYgKGNwdWZyZXFfZHJpdmVyLT5nZXQgJiYgIWNwdWZyZXFfZHJpdmVyLT5zZXRwb2xpY3kpIHsKIAkJbmV3X3BvbGljeS5jdXIgPSBjcHVmcmVxX2RyaXZlci0+Z2V0KGNwdSk7CisJCWlmIChXQVJOX09OKCFuZXdfcG9saWN5LmN1cikpIHsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIG5vX3BvbGljeTsKKwkJfQorCiAJCWlmICghcG9saWN5LT5jdXIpIHsKLQkJCXByX2RlYnVnKCJEcml2ZXIgZGlkIG5vdCBpbml0aWFsaXplIGN1cnJlbnQgZnJlcSIpOworCQkJcHJfZGVidWcoIkRyaXZlciBkaWQgbm90IGluaXRpYWxpemUgY3VycmVudCBmcmVxXG4iKTsKIAkJCXBvbGljeS0+Y3VyID0gbmV3X3BvbGljeS5jdXI7CiAJCX0gZWxzZSB7CiAJCQlpZiAocG9saWN5LT5jdXIgIT0gbmV3X3BvbGljeS5jdXIgJiYgaGFzX3RhcmdldCgpKQpAQCAtMjE3MCwzMCArMjE4MywyNCBAQAogewogCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OwogCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlib29sIGZyb3plbiA9IGZhbHNlOwogCiAJZGV2ID0gZ2V0X2NwdV9kZXZpY2UoY3B1KTsKIAlpZiAoZGV2KSB7Ci0KLQkJaWYgKGFjdGlvbiAmIENQVV9UQVNLU19GUk9aRU4pCi0JCQlmcm96ZW4gPSB0cnVlOwotCiAJCXN3aXRjaCAoYWN0aW9uICYgfkNQVV9UQVNLU19GUk9aRU4pIHsKIAkJY2FzZSBDUFVfT05MSU5FOgotCQkJX19jcHVmcmVxX2FkZF9kZXYoZGV2LCBOVUxMLCBmcm96ZW4pOwotCQkJY3B1ZnJlcV91cGRhdGVfcG9saWN5KGNwdSk7CisJCQlfX2NwdWZyZXFfYWRkX2RldihkZXYsIE5VTEwpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCQkJX19jcHVmcmVxX3JlbW92ZV9kZXZfcHJlcGFyZShkZXYsIE5VTEwsIGZyb3plbik7CisJCQlfX2NwdWZyZXFfcmVtb3ZlX2Rldl9wcmVwYXJlKGRldiwgTlVMTCk7CiAJCQlicmVhazsKIAogCQljYXNlIENQVV9QT1NUX0RFQUQ6Ci0JCQlfX2NwdWZyZXFfcmVtb3ZlX2Rldl9maW5pc2goZGV2LCBOVUxMLCBmcm96ZW4pOworCQkJX19jcHVmcmVxX3JlbW92ZV9kZXZfZmluaXNoKGRldiwgTlVMTCk7CiAJCQlicmVhazsKIAogCQljYXNlIENQVV9ET1dOX0ZBSUxFRDoKLQkJCV9fY3B1ZnJlcV9hZGRfZGV2KGRldiwgTlVMTCwgZnJvemVuKTsKKwkJCV9fY3B1ZnJlcV9hZGRfZGV2KGRldiwgTlVMTCk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTIyNDksOCArMjI1Niw4IEBACiAJCWNwdWZyZXFfZHJpdmVyLT5ib29zdF9lbmFibGVkID0gIXN0YXRlOwogCQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmY3B1ZnJlcV9kcml2ZXJfbG9jaywgZmxhZ3MpOwogCi0JCXByX2VycigiJXM6IENhbm5vdCAlcyBCT09TVFxuIiwgX19mdW5jX18sCi0JCSAgICAgICBzdGF0ZSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKwkJcHJfZXJyKCIlczogQ2Fubm90ICVzIEJPT1NUXG4iLAorCQkgICAgICAgX19mdW5jX18sIHN0YXRlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0yMjk1LDcgKzIzMDIsOSBAQAogCiAJaWYgKCFkcml2ZXJfZGF0YSB8fCAhZHJpdmVyX2RhdGEtPnZlcmlmeSB8fCAhZHJpdmVyX2RhdGEtPmluaXQgfHwKIAkgICAgIShkcml2ZXJfZGF0YS0+c2V0cG9saWN5IHx8IGRyaXZlcl9kYXRhLT50YXJnZXRfaW5kZXggfHwKLQkJICAgIGRyaXZlcl9kYXRhLT50YXJnZXQpKQorCQkgICAgZHJpdmVyX2RhdGEtPnRhcmdldCkgfHwKKwkgICAgIChkcml2ZXJfZGF0YS0+c2V0cG9saWN5ICYmIChkcml2ZXJfZGF0YS0+dGFyZ2V0X2luZGV4IHx8CisJCSAgICBkcml2ZXJfZGF0YS0+dGFyZ2V0KSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcHJfZGVidWcoInRyeWluZyB0byByZWdpc3RlciBkcml2ZXIgJXNcbiIsIGRyaXZlcl9kYXRhLT5uYW1lKTsKQEAgLTIzMjIsNyArMjMzMSw3IEBACiAJCXJldCA9IGNwdWZyZXFfc3lzZnNfY3JlYXRlX2ZpbGUoJmJvb3N0LmF0dHIpOwogCQlpZiAocmV0KSB7CiAJCQlwcl9lcnIoIiVzOiBjYW5ub3QgcmVnaXN0ZXIgZ2xvYmFsIEJPT1NUIHN5c2ZzIGZpbGVcbiIsCi0JCQkJX19mdW5jX18pOworCQkJICAgICAgIF9fZnVuY19fKTsKIAkJCWdvdG8gZXJyX251bGxfZHJpdmVyOwogCQl9CiAJfQpAQCAtMjM0NSw3ICsyMzU0LDcgQEAKIAkJLyogaWYgYWxsIC0+aW5pdCgpIGNhbGxzIGZhaWxlZCwgdW5yZWdpc3RlciAqLwogCQlpZiAocmV0KSB7CiAJCQlwcl9kZWJ1Zygibm8gQ1BVIGluaXRpYWxpemVkIGZvciBkcml2ZXIgJXNcbiIsCi0JCQkJCQkJZHJpdmVyX2RhdGEtPm5hbWUpOworCQkJCSBkcml2ZXJfZGF0YS0+bmFtZSk7CiAJCQlnb3RvIGVycl9pZl91bnJlZzsKIAkJfQogCX0KQEAgLTI0MDksNyArMjQxOCw2IEBACiAKIAljcHVmcmVxX2dsb2JhbF9rb2JqZWN0ID0ga29iamVjdF9jcmVhdGUoKTsKIAlCVUdfT04oIWNwdWZyZXFfZ2xvYmFsX2tvYmplY3QpOwotCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZjcHVmcmVxX3N5c2NvcmVfb3BzKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMKaW5kZXggNTc5M2UxNC4uZWNhYWViZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxhc20vY3B1dGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdXRpbWUuaD4KIAogc3RhdGljIHNwaW5sb2NrX3QgY3B1ZnJlcV9zdGF0c19sb2NrOwogCkBAIC0xODAsMjcgKzE4MCwyNSBAQAogCWNwdWZyZXFfY3B1X3B1dChwb2xpY3kpOwogfQogCi1zdGF0aWMgaW50IF9fY3B1ZnJlcV9zdGF0c19jcmVhdGVfdGFibGUoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCi0JCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqdGFibGUpCitzdGF0aWMgaW50IF9fY3B1ZnJlcV9zdGF0c19jcmVhdGVfdGFibGUoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7CiAJdW5zaWduZWQgaW50IGksIGosIGNvdW50ID0gMCwgcmV0ID0gMDsKIAlzdHJ1Y3QgY3B1ZnJlcV9zdGF0cyAqc3RhdDsKLQlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKmN1cnJlbnRfcG9saWN5OwogCXVuc2lnbmVkIGludCBhbGxvY19zaXplOwogCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnRhYmxlOworCisJdGFibGUgPSBjcHVmcmVxX2ZyZXF1ZW5jeV9nZXRfdGFibGUoY3B1KTsKKwlpZiAodW5saWtlbHkoIXRhYmxlKSkKKwkJcmV0dXJuIDA7CisKIAlpZiAocGVyX2NwdShjcHVmcmVxX3N0YXRzX3RhYmxlLCBjcHUpKQogCQlyZXR1cm4gLUVCVVNZOwogCXN0YXQgPSBremFsbG9jKHNpemVvZigqc3RhdCksIEdGUF9LRVJORUwpOwogCWlmICgoc3RhdCkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQljdXJyZW50X3BvbGljeSA9IGNwdWZyZXFfY3B1X2dldChjcHUpOwotCWlmIChjdXJyZW50X3BvbGljeSA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyb3JfZ2V0X2ZhaWw7Ci0JfQotCi0JcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjdXJyZW50X3BvbGljeS0+a29iaiwgJnN0YXRzX2F0dHJfZ3JvdXApOworCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcG9saWN5LT5rb2JqLCAmc3RhdHNfYXR0cl9ncm91cCk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9vdXQ7CiAKQEAgLTIyMyw3ICsyMjEsNyBAQAogCXN0YXQtPnRpbWVfaW5fc3RhdGUgPSBremFsbG9jKGFsbG9jX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghc3RhdC0+dGltZV9pbl9zdGF0ZSkgewogCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX291dDsKKwkJZ290byBlcnJvcl9hbGxvYzsKIAl9CiAJc3RhdC0+ZnJlcV90YWJsZSA9ICh1bnNpZ25lZCBpbnQgKikoc3RhdC0+dGltZV9pbl9zdGF0ZSArIGNvdW50KTsKIApAQCAtMjQzLDExICsyNDEsMTAgQEAKIAlzdGF0LT5sYXN0X3RpbWUgPSBnZXRfamlmZmllc182NCgpOwogCXN0YXQtPmxhc3RfaW5kZXggPSBmcmVxX3RhYmxlX2dldF9pbmRleChzdGF0LCBwb2xpY3ktPmN1cik7CiAJc3Bpbl91bmxvY2soJmNwdWZyZXFfc3RhdHNfbG9jayk7Ci0JY3B1ZnJlcV9jcHVfcHV0KGN1cnJlbnRfcG9saWN5KTsKIAlyZXR1cm4gMDsKK2Vycm9yX2FsbG9jOgorCXN5c2ZzX3JlbW92ZV9ncm91cCgmcG9saWN5LT5rb2JqLCAmc3RhdHNfYXR0cl9ncm91cCk7CiBlcnJvcl9vdXQ6Ci0JY3B1ZnJlcV9jcHVfcHV0KGN1cnJlbnRfcG9saWN5KTsKLWVycm9yX2dldF9mYWlsOgogCWtmcmVlKHN0YXQpOwogCXBlcl9jcHUoY3B1ZnJlcV9zdGF0c190YWJsZSwgY3B1KSA9IE5VTEw7CiAJcmV0dXJuIHJldDsKQEAgLTI1Niw3ICsyNTMsNiBAQAogc3RhdGljIHZvaWQgY3B1ZnJlcV9zdGF0c19jcmVhdGVfdGFibGUodW5zaWduZWQgaW50IGNwdSkKIHsKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeTsKLQlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnRhYmxlOwogCiAJLyoKIAkgKiAibGlrZWx5KCFwb2xpY3kpIiBiZWNhdXNlIG5vcm1hbGx5IGNwdWZyZXFfc3RhdHMgd2lsbCBiZSByZWdpc3RlcmVkCkBAIC0yNjYsOSArMjYyLDcgQEAKIAlpZiAobGlrZWx5KCFwb2xpY3kpKQogCQlyZXR1cm47CiAKLQl0YWJsZSA9IGNwdWZyZXFfZnJlcXVlbmN5X2dldF90YWJsZShwb2xpY3ktPmNwdSk7Ci0JaWYgKGxpa2VseSh0YWJsZSkpCi0JCV9fY3B1ZnJlcV9zdGF0c19jcmVhdGVfdGFibGUocG9saWN5LCB0YWJsZSk7CisJX19jcHVmcmVxX3N0YXRzX2NyZWF0ZV90YWJsZShwb2xpY3kpOwogCiAJY3B1ZnJlcV9jcHVfcHV0KHBvbGljeSk7CiB9CkBAIC0yOTEsMjAgKzI4NSwxNCBAQAogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5ID0gZGF0YTsKLQlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnRhYmxlOwotCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKIAogCWlmICh2YWwgPT0gQ1BVRlJFUV9VUERBVEVfUE9MSUNZX0NQVSkgewogCQljcHVmcmVxX3N0YXRzX3VwZGF0ZV9wb2xpY3lfY3B1KHBvbGljeSk7CiAJCXJldHVybiAwOwogCX0KIAotCXRhYmxlID0gY3B1ZnJlcV9mcmVxdWVuY3lfZ2V0X3RhYmxlKGNwdSk7Ci0JaWYgKCF0YWJsZSkKLQkJcmV0dXJuIDA7Ci0KIAlpZiAodmFsID09IENQVUZSRVFfQ1JFQVRFX1BPTElDWSkKLQkJcmV0ID0gX19jcHVmcmVxX3N0YXRzX2NyZWF0ZV90YWJsZShwb2xpY3ksIHRhYmxlKTsKKwkJcmV0ID0gX19jcHVmcmVxX3N0YXRzX2NyZWF0ZV90YWJsZShwb2xpY3kpOwogCWVsc2UgaWYgKHZhbCA9PSBDUFVGUkVRX1JFTU9WRV9QT0xJQ1kpCiAJCV9fY3B1ZnJlcV9zdGF0c19mcmVlX3RhYmxlKHBvbGljeSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcmlzLWFydHBlYzMtY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL2NyaXMtYXJ0cGVjMy1jcHVmcmVxLmMKaW5kZXggODY1NTkwNC4uZDQ1NzMwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NyaXMtYXJ0cGVjMy1jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NyaXMtYXJ0cGVjMy1jcHVmcmVxLmMKQEAgLTU3LDcgKzU3LDYgQEAKIAkudmVyaWZ5CT0gY3B1ZnJlcV9nZW5lcmljX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnksCiAJLnRhcmdldF9pbmRleCA9IGNyaXNfZnJlcV90YXJnZXQsCiAJLmluaXQJPSBjcmlzX2ZyZXFfY3B1X2luaXQsCi0JLmV4aXQJPSBjcHVmcmVxX2dlbmVyaWNfZXhpdCwKIAkubmFtZQk9ICJjcmlzX2ZyZXEiLAogCS5hdHRyCT0gY3B1ZnJlcV9nZW5lcmljX2F0dHIsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NyaXMtZXRyYXhmcy1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3Jpcy1ldHJheGZzLWNwdWZyZXEuYwppbmRleCAyNmQ5NDBkLi4xM2MzMzYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3Jpcy1ldHJheGZzLWNwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3Jpcy1ldHJheGZzLWNwdWZyZXEuYwpAQCAtNTcsNyArNTcsNiBAQAogCS52ZXJpZnkgPSBjcHVmcmVxX2dlbmVyaWNfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeSwKIAkudGFyZ2V0X2luZGV4ID0gY3Jpc19mcmVxX3RhcmdldCwKIAkuaW5pdCA9IGNyaXNfZnJlcV9jcHVfaW5pdCwKLQkuZXhpdCA9IGNwdWZyZXFfZ2VuZXJpY19leGl0LAogCS5uYW1lID0gImNyaXNfZnJlcSIsCiAJLmF0dHIgPSBjcHVmcmVxX2dlbmVyaWNfYXR0ciwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvZGF2aW5jaS1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvZGF2aW5jaS1jcHVmcmVxLmMKaW5kZXggMmNmMzM4NC4uMjhhMTZkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2RhdmluY2ktY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9kYXZpbmNpLWNwdWZyZXEuYwpAQCAtMTI1LDcgKzEyNSw2IEBACiAJLnRhcmdldF9pbmRleAk9IGRhdmluY2lfdGFyZ2V0LAogCS5nZXQJCT0gY3B1ZnJlcV9nZW5lcmljX2dldCwKIAkuaW5pdAkJPSBkYXZpbmNpX2NwdV9pbml0LAotCS5leGl0CQk9IGNwdWZyZXFfZ2VuZXJpY19leGl0LAogCS5uYW1lCQk9ICJkYXZpbmNpIiwKIAkuYXR0cgkJPSBjcHVmcmVxX2dlbmVyaWNfYXR0ciwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvZV9wb3dlcnNhdmVyLmMgYi9kcml2ZXJzL2NwdWZyZXEvZV9wb3dlcnNhdmVyLmMKaW5kZXggOTAxMmI4Yi4uYTBkMmE0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2VfcG93ZXJzYXZlci5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9lX3Bvd2Vyc2F2ZXIuYwpAQCAtMzgyLDcgKzM4Miw2IEBACiAJdW5zaWduZWQgaW50IGNwdSA9IHBvbGljeS0+Y3B1OwogCiAJLyogQnllICovCi0JY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOwogCWtmcmVlKGVwc19jcHVbY3B1XSk7CiAJZXBzX2NwdVtjcHVdID0gTlVMTDsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9lbGFuZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL2VsYW5mcmVxLmMKaW5kZXggZGUwOGFjZi4uYzk4N2U5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2VsYW5mcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2VsYW5mcmVxLmMKQEAgLTE5OCw3ICsxOTgsNiBAQAogCS52ZXJpZnkJCT0gY3B1ZnJlcV9nZW5lcmljX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnksCiAJLnRhcmdldF9pbmRleAk9IGVsYW5mcmVxX3RhcmdldCwKIAkuaW5pdAkJPSBlbGFuZnJlcV9jcHVfaW5pdCwKLQkuZXhpdAkJPSBjcHVmcmVxX2dlbmVyaWNfZXhpdCwKIAkubmFtZQkJPSAiZWxhbmZyZXEiLAogCS5hdHRyCQk9IGNwdWZyZXFfZ2VuZXJpY19hdHRyLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9leHlub3MtY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL2V4eW5vcy1jcHVmcmVxLmMKaW5kZXggZmNkMjkxNC4uZjk5Y2ZlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2V4eW5vcy1jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2V4eW5vcy1jcHVmcmVxLmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgotI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CkBAIC0yNCwxMiArMjMsOCBAQAogI2luY2x1ZGUgImV4eW5vcy1jcHVmcmVxLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgZXh5bm9zX2R2ZnNfaW5mbyAqZXh5bm9zX2luZm87Ci0KIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yICphcm1fcmVndWxhdG9yOwotCiBzdGF0aWMgdW5zaWduZWQgaW50IGxvY2tpbmdfZnJlcXVlbmN5Owotc3RhdGljIGJvb2wgZnJlcXVlbmN5X2xvY2tlZDsKLXN0YXRpYyBERUZJTkVfTVVURVgoY3B1ZnJlcV9sb2NrKTsKIAogc3RhdGljIGludCBleHlub3NfY3B1ZnJlcV9nZXRfaW5kZXgodW5zaWduZWQgaW50IGZyZXEpCiB7CkBAIC0xMzQsODMgKzEyOSwxMyBAQAogCiBzdGF0aWMgaW50IGV4eW5vc190YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIHVuc2lnbmVkIGludCBpbmRleCkKIHsKLQlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKmZyZXFfdGFibGUgPSBleHlub3NfaW5mby0+ZnJlcV90YWJsZTsKLQlpbnQgcmV0ID0gMDsKLQotCW11dGV4X2xvY2soJmNwdWZyZXFfbG9jayk7Ci0KLQlpZiAoZnJlcXVlbmN5X2xvY2tlZCkKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSBleHlub3NfY3B1ZnJlcV9zY2FsZShmcmVxX3RhYmxlW2luZGV4XS5mcmVxdWVuY3kpOwotCi1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZjcHVmcmVxX2xvY2spOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZXh5bm9zX2NwdWZyZXFfc2NhbGUoZXh5bm9zX2luZm8tPmZyZXFfdGFibGVbaW5kZXhdLmZyZXF1ZW5jeSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgZXh5bm9zX2NwdWZyZXFfc3VzcGVuZChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBleHlub3NfY3B1ZnJlcV9yZXN1bWUoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotLyoqCi0gKiBleHlub3NfY3B1ZnJlcV9wbV9ub3RpZmllciAtIGJsb2NrIENQVUZSRVEncyBhY3Rpdml0aWVzIGluIHN1c3BlbmQtcmVzdW1lCi0gKgkJCWNvbnRleHQKLSAqIEBub3RpZmllcgotICogQHBtX2V2ZW50Ci0gKiBAdgotICoKLSAqIFdoaWxlIGZyZXF1ZW5jeV9sb2NrZWQgPT0gdHJ1ZSwgdGFyZ2V0KCkgaWdub3JlcyBldmVyeSBmcmVxdWVuY3kgYnV0Ci0gKiBsb2NraW5nX2ZyZXF1ZW5jeS4gVGhlIGxvY2tpbmdfZnJlcXVlbmN5IHZhbHVlIGlzIHRoZSBpbml0aWFsIGZyZXF1ZW5jeSwKLSAqIHdoaWNoIGlzIHNldCBieSB0aGUgYm9vdGxvYWRlci4gSW4gb3JkZXIgdG8gZWxpbWluYXRlIHBvc3NpYmxlCi0gKiBpbmNvbnNpc3RlbmN5IGluIGNsb2NrIHZhbHVlcywgd2Ugc2F2ZSBhbmQgcmVzdG9yZSBmcmVxdWVuY2llcyBkdXJpbmcKLSAqIHN1c3BlbmQgYW5kIHJlc3VtZSBhbmQgYmxvY2sgQ1BVRlJFUSBhY3Rpdml0aWVzLiBOb3RlIHRoYXQgdGhlIHN0YW5kYXJkCi0gKiBzdXNwZW5kL3Jlc3VtZSBjYW5ub3QgYmUgdXNlZCBhcyB0aGV5IGFyZSB0b28gZGVlcCAoc3lzY29yZV9vcHMpIGZvcgotICogcmVndWxhdG9yIGFjdGlvbnMuCi0gKi8KLXN0YXRpYyBpbnQgZXh5bm9zX2NwdWZyZXFfcG1fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllciwKLQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBwbV9ldmVudCwgdm9pZCAqdikKLXsKLQlpbnQgcmV0OwotCi0Jc3dpdGNoIChwbV9ldmVudCkgewotCWNhc2UgUE1fU1VTUEVORF9QUkVQQVJFOgotCQltdXRleF9sb2NrKCZjcHVmcmVxX2xvY2spOwotCQlmcmVxdWVuY3lfbG9ja2VkID0gdHJ1ZTsKLQkJbXV0ZXhfdW5sb2NrKCZjcHVmcmVxX2xvY2spOwotCi0JCXJldCA9IGV4eW5vc19jcHVmcmVxX3NjYWxlKGxvY2tpbmdfZnJlcXVlbmN5KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gTk9USUZZX0JBRDsKLQotCQlicmVhazsKLQotCWNhc2UgUE1fUE9TVF9TVVNQRU5EOgotCQltdXRleF9sb2NrKCZjcHVmcmVxX2xvY2spOwotCQlmcmVxdWVuY3lfbG9ja2VkID0gZmFsc2U7Ci0JCW11dGV4X3VubG9jaygmY3B1ZnJlcV9sb2NrKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBleHlub3NfY3B1ZnJlcV9uYiA9IHsKLQkubm90aWZpZXJfY2FsbCA9IGV4eW5vc19jcHVmcmVxX3BtX25vdGlmaWVyLAotfTsKLQogc3RhdGljIGludCBleHlub3NfY3B1ZnJlcV9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKIAlwb2xpY3ktPmNsayA9IGV4eW5vc19pbmZvLT5jcHVfY2xrOworCXBvbGljeS0+c3VzcGVuZF9mcmVxID0gbG9ja2luZ19mcmVxdWVuY3k7CiAJcmV0dXJuIGNwdWZyZXFfZ2VuZXJpY19pbml0KHBvbGljeSwgZXh5bm9zX2luZm8tPmZyZXFfdGFibGUsIDEwMDAwMCk7CiB9CiAKQEAgLTIyMCwxNSArMTQ1LDEzIEBACiAJLnRhcmdldF9pbmRleAk9IGV4eW5vc190YXJnZXQsCiAJLmdldAkJPSBjcHVmcmVxX2dlbmVyaWNfZ2V0LAogCS5pbml0CQk9IGV4eW5vc19jcHVmcmVxX2NwdV9pbml0LAotCS5leGl0CQk9IGNwdWZyZXFfZ2VuZXJpY19leGl0LAogCS5uYW1lCQk9ICJleHlub3NfY3B1ZnJlcSIsCiAJLmF0dHIJCT0gY3B1ZnJlcV9nZW5lcmljX2F0dHIsCiAjaWZkZWYgQ09ORklHX0FSTV9FWFlOT1NfQ1BVX0ZSRVFfQk9PU1RfU1cKIAkuYm9vc3Rfc3VwcG9ydGVkID0gdHJ1ZSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCT0gZXh5bm9zX2NwdWZyZXFfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGV4eW5vc19jcHVmcmVxX3Jlc3VtZSwKKwkuc3VzcGVuZAk9IGNwdWZyZXFfZ2VuZXJpY19zdXNwZW5kLAogI2VuZGlmCiB9OwogCkBAIC0yNjMsMTkgKzE4NiwxMyBAQAogCQlnb3RvIGVycl92ZGRfYXJtOwogCX0KIAorCS8qIERvbmUgaGVyZSBhcyB3ZSB3YW50IHRvIGNhcHR1cmUgYm9vdCBmcmVxdWVuY3kgKi8KIAlsb2NraW5nX2ZyZXF1ZW5jeSA9IGNsa19nZXRfcmF0ZShleHlub3NfaW5mby0+Y3B1X2NsaykgLyAxMDAwOwogCi0JcmVnaXN0ZXJfcG1fbm90aWZpZXIoJmV4eW5vc19jcHVmcmVxX25iKTsKKwlpZiAoIWNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZleHlub3NfZHJpdmVyKSkKKwkJcmV0dXJuIDA7CiAKLQlpZiAoY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmV4eW5vc19kcml2ZXIpKSB7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byByZWdpc3RlciBjcHVmcmVxIGRyaXZlclxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVycl9jcHVmcmVxOwotCX0KLQotCXJldHVybiAwOwotZXJyX2NwdWZyZXE6Ci0JdW5yZWdpc3Rlcl9wbV9ub3RpZmllcigmZXh5bm9zX2NwdWZyZXFfbmIpOwotCisJcHJfZXJyKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGNwdWZyZXEgZHJpdmVyXG4iLCBfX2Z1bmNfXyk7CiAJcmVndWxhdG9yX3B1dChhcm1fcmVndWxhdG9yKTsKIGVycl92ZGRfYXJtOgogCWtmcmVlKGV4eW5vc19pbmZvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9leHlub3M1NDQwLWNwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9leHlub3M1NDQwLWNwdWZyZXEuYwppbmRleCA0OWI3NTYwMS4uN2Y3NzZhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2V4eW5vczU0NDAtY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9leHlub3M1NDQwLWNwdWZyZXEuYwpAQCAtMzEyLDcgKzMxMiw2IEBACiAJLnRhcmdldF9pbmRleAk9IGV4eW5vc190YXJnZXQsCiAJLmdldAkJPSBjcHVmcmVxX2dlbmVyaWNfZ2V0LAogCS5pbml0CQk9IGV4eW5vc19jcHVmcmVxX2NwdV9pbml0LAotCS5leGl0CQk9IGNwdWZyZXFfZ2VuZXJpY19leGl0LAogCS5uYW1lCQk9IENQVUZSRVFfTkFNRSwKIAkuYXR0cgkJPSBjcHVmcmVxX2dlbmVyaWNfYXR0ciwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvZnJlcV90YWJsZS5jIGIvZHJpdmVycy9jcHVmcmVxL2ZyZXFfdGFibGUuYwppbmRleCA4ZTU0Zjk3Li42NWE0NzcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvZnJlcV90YWJsZS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9mcmVxX3RhYmxlLmMKQEAgLTkxLDggKzkxLDggQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeSk7CiAKIC8qCi0gKiBHZW5lcmljIHJvdXRpbmUgdG8gdmVyaWZ5IHBvbGljeSAmIGZyZXF1ZW5jeSB0YWJsZSwgcmVxdWlyZXMgZHJpdmVyIHRvIGNhbGwKLSAqIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKCkgcHJpb3IgdG8gaXQuCisgKiBHZW5lcmljIHJvdXRpbmUgdG8gdmVyaWZ5IHBvbGljeSAmIGZyZXF1ZW5jeSB0YWJsZSwgcmVxdWlyZXMgZHJpdmVyIHRvIHNldAorICogcG9saWN5LT5mcmVxX3RhYmxlIHByaW9yIHRvIGl0LgogICovCiBpbnQgY3B1ZnJlcV9nZW5lcmljX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7CkBAIC0yMDMsOCArMjAzLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9pbmRleCk7CiAKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKiwgY3B1ZnJlcV9zaG93X3RhYmxlKTsKLQogLyoqCiAgKiBzaG93X2F2YWlsYWJsZV9mcmVxcyAtIHNob3cgYXZhaWxhYmxlIGZyZXF1ZW5jaWVzIGZvciB0aGUgc3BlY2lmaWVkIENQVQogICovCkBAIC0yMTIsMTUgKzIxMCwxMiBAQAogCQkJCSAgICBib29sIHNob3dfYm9vc3QpCiB7CiAJdW5zaWduZWQgaW50IGkgPSAwOwotCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKIAlzc2l6ZV90IGNvdW50ID0gMDsKLQlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnRhYmxlOworCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqdGFibGUgPSBwb2xpY3ktPmZyZXFfdGFibGU7CiAKLQlpZiAoIXBlcl9jcHUoY3B1ZnJlcV9zaG93X3RhYmxlLCBjcHUpKQorCWlmICghdGFibGUpCiAJCXJldHVybiAtRU5PREVWOwogCi0JdGFibGUgPSBwZXJfY3B1KGNwdWZyZXFfc2hvd190YWJsZSwgY3B1KTsKLQogCWZvciAoaSA9IDA7ICh0YWJsZVtpXS5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQpOyBpKyspIHsKIAkJaWYgKHRhYmxlW2ldLmZyZXF1ZW5jeSA9PSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQpCiAJCQljb250aW51ZTsKQEAgLTI4Myw0OSArMjc4LDI0IEBACiB9OwogRVhQT1JUX1NZTUJPTF9HUEwoY3B1ZnJlcV9nZW5lcmljX2F0dHIpOwogCi0vKgotICogaWYgeW91IHVzZSB0aGVzZSwgeW91IG11c3QgYXNzdXJlIHRoYXQgdGhlIGZyZXF1ZW5jeSB0YWJsZSBpcyB2YWxpZAotICogYWxsIHRoZSB0aW1lIGJldHdlZW4gZ2V0X2F0dHIgYW5kIHB1dF9hdHRyIQotICovCi12b2lkIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqdGFibGUsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IGNwdSkKLXsKLQlwcl9kZWJ1Zygic2V0dGluZyBzaG93X3RhYmxlIGZvciBjcHUgJXUgdG8gJXBcbiIsIGNwdSwgdGFibGUpOwotCXBlcl9jcHUoY3B1ZnJlcV9zaG93X3RhYmxlLCBjcHUpID0gdGFibGU7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cik7Ci0KLXZvaWQgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIodW5zaWduZWQgaW50IGNwdSkKLXsKLQlwcl9kZWJ1ZygiY2xlYXJpbmcgc2hvd190YWJsZSBmb3IgY3B1ICV1XG4iLCBjcHUpOwotCXBlcl9jcHUoY3B1ZnJlcV9zaG93X3RhYmxlLCBjcHUpID0gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKTsKLQogaW50IGNwdWZyZXFfdGFibGVfdmFsaWRhdGVfYW5kX3Nob3coc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCiAJCQkJICAgICAgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICp0YWJsZSkKIHsKIAlpbnQgcmV0ID0gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksIHRhYmxlKTsKIAogCWlmICghcmV0KQotCQljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cih0YWJsZSwgcG9saWN5LT5jcHUpOworCQlwb2xpY3ktPmZyZXFfdGFibGUgPSB0YWJsZTsKIAogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcHVmcmVxX3RhYmxlX3ZhbGlkYXRlX2FuZF9zaG93KTsKIAotdm9pZCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV91cGRhdGVfcG9saWN5X2NwdShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKLXsKLQlwcl9kZWJ1ZygiVXBkYXRpbmcgc2hvd190YWJsZSBmb3IgbmV3X2NwdSAldSBmcm9tIGxhc3RfY3B1ICV1XG4iLAotCQkJcG9saWN5LT5jcHUsIHBvbGljeS0+bGFzdF9jcHUpOwotCXBlcl9jcHUoY3B1ZnJlcV9zaG93X3RhYmxlLCBwb2xpY3ktPmNwdSkgPSBwZXJfY3B1KGNwdWZyZXFfc2hvd190YWJsZSwKLQkJCXBvbGljeS0+bGFzdF9jcHUpOwotCXBlcl9jcHUoY3B1ZnJlcV9zaG93X3RhYmxlLCBwb2xpY3ktPmxhc3RfY3B1KSA9IE5VTEw7Ci19CitzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKmNwdWZyZXFfY3B1X2dldF9yYXcodW5zaWduZWQgaW50IGNwdSk7CiAKIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqY3B1ZnJlcV9mcmVxdWVuY3lfZ2V0X3RhYmxlKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JcmV0dXJuIHBlcl9jcHUoY3B1ZnJlcV9zaG93X3RhYmxlLCBjcHUpOworCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5ID0gY3B1ZnJlcV9jcHVfZ2V0X3JhdyhjcHUpOworCXJldHVybiBwb2xpY3kgPyBwb2xpY3ktPmZyZXFfdGFibGUgOiBOVUxMOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3B1ZnJlcV9mcmVxdWVuY3lfZ2V0X3RhYmxlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2lhNjQtYWNwaS1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvaWE2NC1hY3BpLWNwdWZyZXEuYwppbmRleCA1M2M2YWM2Li5hMjJiNWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvaWE2NC1hY3BpLWNwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvaWE2NC1hY3BpLWNwdWZyZXEuYwpAQCAtMzMyLDcgKzMzMiw2IEBACiAJcHJfZGVidWcoImFjcGlfY3B1ZnJlcV9jcHVfZXhpdFxuIik7CiAKIAlpZiAoZGF0YSkgewotCQljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2xpY3ktPmNwdSk7CiAJCWFjcGlfaW9fZGF0YVtwb2xpY3ktPmNwdV0gPSBOVUxMOwogCQlhY3BpX3Byb2Nlc3Nvcl91bnJlZ2lzdGVyX3BlcmZvcm1hbmNlKCZkYXRhLT5hY3BpX2RhdGEsCiAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5LT5jcHUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2lteDZxLWNwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9pbXg2cS1jcHVmcmVxLmMKaW5kZXggY2U2OTA1OS4uZTI3ZmNhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2lteDZxLWNwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvaW14NnEtY3B1ZnJlcS5jCkBAIC0xNDQsNyArMTQ0LDYgQEAKIAkudGFyZ2V0X2luZGV4ID0gaW14NnFfc2V0X3RhcmdldCwKIAkuZ2V0ID0gY3B1ZnJlcV9nZW5lcmljX2dldCwKIAkuaW5pdCA9IGlteDZxX2NwdWZyZXFfaW5pdCwKLQkuZXhpdCA9IGNwdWZyZXFfZ2VuZXJpY19leGl0LAogCS5uYW1lID0gImlteDZxLWNwdWZyZXEiLAogCS5hdHRyID0gY3B1ZnJlcV9nZW5lcmljX2F0dHIsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2ludGVsX3BzdGF0ZS5jIGIvZHJpdmVycy9jcHVmcmVxL2ludGVsX3BzdGF0ZS5jCmluZGV4IDJjZDM2YjkuLmJjYjlhNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9pbnRlbF9wc3RhdGUuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvaW50ZWxfcHN0YXRlLmMKQEAgLTk5LDggKzk5LDcgQEAKIAl1NjQJcHJldl9hcGVyZjsKIAl1NjQJcHJldl9tcGVyZjsKIAl1bnNpZ25lZCBsb25nIGxvbmcgcHJldl90c2M7Ci0JaW50CXNhbXBsZV9wdHI7Ci0Jc3RydWN0IHNhbXBsZSBzYW1wbGVzW1NBTVBMRV9DT1VOVF07CisJc3RydWN0IHNhbXBsZSBzYW1wbGU7CiB9OwogCiBzdGF0aWMgc3RydWN0IGNwdWRhdGEgKiphbGxfY3B1X2RhdGE7CkBAIC0xNTQsNyArMTUzLDcgQEAKIAlwaWQtPnNldHBvaW50ID0gc2V0cG9pbnQ7CiAJcGlkLT5kZWFkYmFuZCAgPSBkZWFkYmFuZDsKIAlwaWQtPmludGVncmFsICA9IGludF90b2ZwKGludGVncmFsKTsKLQlwaWQtPmxhc3RfZXJyICA9IHNldHBvaW50IC0gYnVzeTsKKwlwaWQtPmxhc3RfZXJyICA9IGludF90b2ZwKHNldHBvaW50KSAtIGludF90b2ZwKGJ1c3kpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcGlkX3BfZ2Fpbl9zZXQoc3RydWN0IF9waWQgKnBpZCwgaW50IHBlcmNlbnQpCkBAIC00NDcsNyArNDQ2LDcgQEAKIAlpZiAobGltaXRzLm5vX3R1cmJvKQogCQl2YWwgfD0gKHU2NCkxIDw8IDMyOwogCi0Jd3Jtc3JsKE1TUl9JQTMyX1BFUkZfQ1RMLCB2YWwpOworCXdybXNybF9vbl9jcHUoY3B1ZGF0YS0+Y3B1LCBNU1JfSUEzMl9QRVJGX0NUTCwgdmFsKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjcHVfZGVmYXVsdHMgY29yZV9wYXJhbXMgPSB7CkBAIC01ODYsMTUgKzU4NSwxNCBAQAogCW1wZXJmID0gbXBlcmYgPj4gRlJBQ19CSVRTOwogCXRzYyA9IHRzYyA+PiBGUkFDX0JJVFM7CiAKLQljcHUtPnNhbXBsZV9wdHIgPSAoY3B1LT5zYW1wbGVfcHRyICsgMSkgJSBTQU1QTEVfQ09VTlQ7Ci0JY3B1LT5zYW1wbGVzW2NwdS0+c2FtcGxlX3B0cl0uYXBlcmYgPSBhcGVyZjsKLQljcHUtPnNhbXBsZXNbY3B1LT5zYW1wbGVfcHRyXS5tcGVyZiA9IG1wZXJmOwotCWNwdS0+c2FtcGxlc1tjcHUtPnNhbXBsZV9wdHJdLnRzYyA9IHRzYzsKLQljcHUtPnNhbXBsZXNbY3B1LT5zYW1wbGVfcHRyXS5hcGVyZiAtPSBjcHUtPnByZXZfYXBlcmY7Ci0JY3B1LT5zYW1wbGVzW2NwdS0+c2FtcGxlX3B0cl0ubXBlcmYgLT0gY3B1LT5wcmV2X21wZXJmOwotCWNwdS0+c2FtcGxlc1tjcHUtPnNhbXBsZV9wdHJdLnRzYyAtPSBjcHUtPnByZXZfdHNjOworCWNwdS0+c2FtcGxlLmFwZXJmID0gYXBlcmY7CisJY3B1LT5zYW1wbGUubXBlcmYgPSBtcGVyZjsKKwljcHUtPnNhbXBsZS50c2MgPSB0c2M7CisJY3B1LT5zYW1wbGUuYXBlcmYgLT0gY3B1LT5wcmV2X2FwZXJmOworCWNwdS0+c2FtcGxlLm1wZXJmIC09IGNwdS0+cHJldl9tcGVyZjsKKwljcHUtPnNhbXBsZS50c2MgLT0gY3B1LT5wcmV2X3RzYzsKIAotCWludGVsX3BzdGF0ZV9jYWxjX2J1c3koY3B1LCAmY3B1LT5zYW1wbGVzW2NwdS0+c2FtcGxlX3B0cl0pOworCWludGVsX3BzdGF0ZV9jYWxjX2J1c3koY3B1LCAmY3B1LT5zYW1wbGUpOwogCiAJY3B1LT5wcmV2X2FwZXJmID0gYXBlcmY7CiAJY3B1LT5wcmV2X21wZXJmID0gbXBlcmY7CkBAIC02MTQsNyArNjEyLDcgQEAKIHsKIAlpbnQzMl90IGNvcmVfYnVzeSwgbWF4X3BzdGF0ZSwgY3VycmVudF9wc3RhdGU7CiAKLQljb3JlX2J1c3kgPSBjcHUtPnNhbXBsZXNbY3B1LT5zYW1wbGVfcHRyXS5jb3JlX3BjdF9idXN5OworCWNvcmVfYnVzeSA9IGNwdS0+c2FtcGxlLmNvcmVfcGN0X2J1c3k7CiAJbWF4X3BzdGF0ZSA9IGludF90b2ZwKGNwdS0+cHN0YXRlLm1heF9wc3RhdGUpOwogCWN1cnJlbnRfcHN0YXRlID0gaW50X3RvZnAoY3B1LT5wc3RhdGUuY3VycmVudF9wc3RhdGUpOwogCWNvcmVfYnVzeSA9IG11bF9mcChjb3JlX2J1c3ksIGRpdl9mcChtYXhfcHN0YXRlLCBjdXJyZW50X3BzdGF0ZSkpOwpAQCAtNjQ4LDcgKzY0Niw3IEBACiAKIAlpbnRlbF9wc3RhdGVfc2FtcGxlKGNwdSk7CiAKLQlzYW1wbGUgPSAmY3B1LT5zYW1wbGVzW2NwdS0+c2FtcGxlX3B0cl07CisJc2FtcGxlID0gJmNwdS0+c2FtcGxlOwogCiAJaW50ZWxfcHN0YXRlX2FkanVzdF9idXN5X3BzdGF0ZShjcHUpOwogCkBAIC03MjksNyArNzI3LDcgQEAKIAljcHUgPSBhbGxfY3B1X2RhdGFbY3B1X251bV07CiAJaWYgKCFjcHUpCiAJCXJldHVybiAwOwotCXNhbXBsZSA9ICZjcHUtPnNhbXBsZXNbY3B1LT5zYW1wbGVfcHRyXTsKKwlzYW1wbGUgPSAmY3B1LT5zYW1wbGU7CiAJcmV0dXJuIHNhbXBsZS0+ZnJlcTsKIH0KIApAQCAtNzczLDE0ICs3NzEsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpbnRlbF9wc3RhdGVfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCitzdGF0aWMgdm9pZCBpbnRlbF9wc3RhdGVfc3RvcF9jcHUoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7Ci0JaW50IGNwdSA9IHBvbGljeS0+Y3B1OworCWludCBjcHVfbnVtID0gcG9saWN5LT5jcHU7CisJc3RydWN0IGNwdWRhdGEgKmNwdSA9IGFsbF9jcHVfZGF0YVtjcHVfbnVtXTsKIAotCWRlbF90aW1lcigmYWxsX2NwdV9kYXRhW2NwdV0tPnRpbWVyKTsKLQlrZnJlZShhbGxfY3B1X2RhdGFbY3B1XSk7Ci0JYWxsX2NwdV9kYXRhW2NwdV0gPSBOVUxMOwotCXJldHVybiAwOworCXByX2luZm8oImludGVsX3BzdGF0ZSBDUFUgJWQgZXhpdGluZ1xuIiwgY3B1X251bSk7CisKKwlkZWxfdGltZXIoJmFsbF9jcHVfZGF0YVtjcHVfbnVtXS0+dGltZXIpOworCWludGVsX3BzdGF0ZV9zZXRfcHN0YXRlKGNwdSwgY3B1LT5wc3RhdGUubWluX3BzdGF0ZSk7CisJa2ZyZWUoYWxsX2NwdV9kYXRhW2NwdV9udW1dKTsKKwlhbGxfY3B1X2RhdGFbY3B1X251bV0gPSBOVUxMOwogfQogCiBzdGF0aWMgaW50IGludGVsX3BzdGF0ZV9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKQEAgLTgxOCw3ICs4MTksNyBAQAogCS5zZXRwb2xpY3kJPSBpbnRlbF9wc3RhdGVfc2V0X3BvbGljeSwKIAkuZ2V0CQk9IGludGVsX3BzdGF0ZV9nZXQsCiAJLmluaXQJCT0gaW50ZWxfcHN0YXRlX2NwdV9pbml0LAotCS5leGl0CQk9IGludGVsX3BzdGF0ZV9jcHVfZXhpdCwKKwkuc3RvcF9jcHUJPSBpbnRlbF9wc3RhdGVfc3RvcF9jcHUsCiAJLm5hbWUJCT0gImludGVsX3BzdGF0ZSIsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEva2lya3dvb2QtY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL2tpcmt3b29kLWNwdWZyZXEuYwppbmRleCBlYjdhYmUzLi4zZDExNGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEva2lya3dvb2QtY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9raXJrd29vZC1jcHVmcmVxLmMKQEAgLTEwMiw3ICsxMDIsNiBAQAogCS52ZXJpZnkJPSBjcHVmcmVxX2dlbmVyaWNfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeSwKIAkudGFyZ2V0X2luZGV4ID0ga2lya3dvb2RfY3B1ZnJlcV90YXJnZXQsCiAJLmluaXQJPSBraXJrd29vZF9jcHVmcmVxX2NwdV9pbml0LAotCS5leGl0CT0gY3B1ZnJlcV9nZW5lcmljX2V4aXQsCiAJLm5hbWUJPSAia2lya3dvb2QtY3B1ZnJlcSIsCiAJLmF0dHIJPSBjcHVmcmVxX2dlbmVyaWNfYXR0ciwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvbG9uZ2hhdWwuYyBiL2RyaXZlcnMvY3B1ZnJlcS9sb25naGF1bC5jCmluZGV4IDQ1YmFmZGQuLjdiOTRkYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9sb25naGF1bC5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9sb25naGF1bC5jCkBAIC05MTMsNyArOTEzLDYgQEAKIAkudGFyZ2V0X2luZGV4ID0gbG9uZ2hhdWxfdGFyZ2V0LAogCS5nZXQJPSBsb25naGF1bF9nZXQsCiAJLmluaXQJPSBsb25naGF1bF9jcHVfaW5pdCwKLQkuZXhpdAk9IGNwdWZyZXFfZ2VuZXJpY19leGl0LAogCS5uYW1lCT0gImxvbmdoYXVsIiwKIAkuYXR0cgk9IGNwdWZyZXFfZ2VuZXJpY19hdHRyLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9sb29uZ3NvbjJfY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL2xvb25nc29uMl9jcHVmcmVxLmMKaW5kZXggYjY1ODFhYi4uYTM1ODhkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2xvb25nc29uMl9jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2xvb25nc29uMl9jcHVmcmVxLmMKQEAgLTEwNCw3ICsxMDQsNiBAQAogCiBzdGF0aWMgaW50IGxvb25nc29uMl9jcHVmcmVxX2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7Ci0JY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOwogCWNsa19wdXQocG9saWN5LT5jbGspOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL29tYXAtY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL29tYXAtY3B1ZnJlcS5jCmluZGV4IDU5MGY1YjYuLjVmNjljOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9vbWFwLWNwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvb21hcC1jcHVmcmVxLmMKQEAgLTE0Myw3ICsxNDMsNiBAQAogCiBzdGF0aWMgaW50IG9tYXBfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7Ci0JY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOwogCWZyZXFfdGFibGVfZnJlZSgpOwogCWNsa19wdXQocG9saWN5LT5jbGspOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL3A0LWNsb2NrbW9kLmMgYi9kcml2ZXJzL2NwdWZyZXEvcDQtY2xvY2ttb2QuYwppbmRleCAzZDFjYmE5Li43NGY1OTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvcDQtY2xvY2ttb2QuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvcDQtY2xvY2ttb2QuYwpAQCAtMjM3LDcgKzIzNyw2IEBACiAJLnZlcmlmeQkJPSBjcHVmcmVxX2dlbmVyaWNfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeSwKIAkudGFyZ2V0X2luZGV4CT0gY3B1ZnJlcV9wNF90YXJnZXQsCiAJLmluaXQJCT0gY3B1ZnJlcV9wNF9jcHVfaW5pdCwKLQkuZXhpdAkJPSBjcHVmcmVxX2dlbmVyaWNfZXhpdCwKIAkuZ2V0CQk9IGNwdWZyZXFfcDRfZ2V0LAogCS5uYW1lCQk9ICJwNC1jbG9ja21vZCIsCiAJLmF0dHIJCT0gY3B1ZnJlcV9nZW5lcmljX2F0dHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvcGFzZW1pLWNwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9wYXNlbWktY3B1ZnJlcS5jCmluZGV4IDA0MjYwMDguLjZhMmI3ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9wYXNlbWktY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9wYXNlbWktY3B1ZnJlcS5jCkBAIC0yMzQsNyArMjM0LDYgQEAKIAlpZiAoc2RjcHdyX21hcGJhc2UpCiAJCWlvdW5tYXAoc2RjcHdyX21hcGJhc2UpOwogCi0JY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvcG93ZXJub3ctazYuYyBiL2RyaXZlcnMvY3B1ZnJlcS9wb3dlcm5vdy1rNi5jCmluZGV4IGI5YTQ0NGUuLmNlMjdlNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9wb3dlcm5vdy1rNi5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9wb3dlcm5vdy1rNi5jCkBAIC0yMzEsNyArMjMxLDYgQEAKIAkJaWYgKGkgPT0gbWF4X211bHRpcGxpZXIpCiAJCQlwb3dlcm5vd19rNl90YXJnZXQocG9saWN5LCBpKTsKIAl9Ci0JY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvcG93ZXJub3ctazcuYyBiL2RyaXZlcnMvY3B1ZnJlcS9wb3dlcm5vdy1rNy5jCmluZGV4IDk0NjcwOGEuLjBlNjhlMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9wb3dlcm5vdy1rNy5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9wb3dlcm5vdy1rNy5jCkBAIC02NjQsOCArNjY0LDYgQEAKIAogc3RhdGljIGludCBwb3dlcm5vd19jcHVfZXhpdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKLQljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2xpY3ktPmNwdSk7Ci0KICNpZmRlZiBDT05GSUdfWDg2X1BPV0VSTk9XX0s3X0FDUEkKIAlpZiAoYWNwaV9wcm9jZXNzb3JfcGVyZikgewogCQlhY3BpX3Byb2Nlc3Nvcl91bnJlZ2lzdGVyX3BlcmZvcm1hbmNlKGFjcGlfcHJvY2Vzc29yX3BlcmYsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL3Bvd2Vybm93LWs4LmMgYi9kcml2ZXJzL2NwdWZyZXEvcG93ZXJub3ctazguYwppbmRleCA2Njg0ZTAzLi4yN2ViMmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvcG93ZXJub3ctazguYworKysgYi9kcml2ZXJzL2NwdWZyZXEvcG93ZXJub3ctazguYwpAQCAtMTE2NCw4ICsxMTY0LDYgQEAKIAogCXBvd2Vybm93X2s4X2NwdV9leGl0X2FjcGkoZGF0YSk7CiAKLQljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2wtPmNwdSk7Ci0KIAlrZnJlZShkYXRhLT5wb3dlcm5vd190YWJsZSk7CiAJa2ZyZWUoZGF0YSk7CiAJZm9yX2VhY2hfY3B1KGNwdSwgcG9sLT5jcHVzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL3BwYy1jb3JlbmV0LWNwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9wcGMtY29yZW5ldC1jcHVmcmVxLmMKaW5kZXggMDUxMDAwZi4uM2JkOTEyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL3BwYy1jb3JlbmV0LWNwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvcHBjLWNvcmVuZXQtY3B1ZnJlcS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KIAogLyoqCiAgKiBzdHJ1Y3QgY3B1X2RhdGEgLSBwZXIgQ1BVIGRhdGEgc3RydWN0CkBAIC0yMDUsNyArMjA2LDggQEAKIAlmb3JfZWFjaF9jcHUoaSwgcGVyX2NwdShjcHVfbWFzaywgY3B1KSkKIAkJcGVyX2NwdShjcHVfZGF0YSwgaSkgPSBkYXRhOwogCi0JcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IENQVUZSRVFfRVRFUk5BTDsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0KKwkJCQkoMTIgKiBOU0VDX1BFUl9TRUMpIC8gZnNsX2dldF9zeXNfZnJlcSgpOwogCW9mX25vZGVfcHV0KG5wKTsKIAogCXJldHVybiAwOwpAQCAtMjI4LDcgKzIzMCw2IEBACiAJc3RydWN0IGNwdV9kYXRhICpkYXRhID0gcGVyX2NwdShjcHVfZGF0YSwgcG9saWN5LT5jcHUpOwogCXVuc2lnbmVkIGludCBjcHU7CiAKLQljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2xpY3ktPmNwdSk7CiAJb2Zfbm9kZV9wdXQoZGF0YS0+cGFyZW50KTsKIAlrZnJlZShkYXRhLT50YWJsZSk7CiAJa2ZyZWUoZGF0YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvcHBjX2NiZV9jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvcHBjX2NiZV9jcHVmcmVxLmMKaW5kZXggZTQyY2E5Yy4uYWY3YjFjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL3BwY19jYmVfY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9wcGNfY2JlX2NwdWZyZXEuYwpAQCAtMTQxLDcgKzE0MSw2IEBACiAJLnZlcmlmeQkJPSBjcHVmcmVxX2dlbmVyaWNfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeSwKIAkudGFyZ2V0X2luZGV4CT0gY2JlX2NwdWZyZXFfdGFyZ2V0LAogCS5pbml0CQk9IGNiZV9jcHVmcmVxX2NwdV9pbml0LAotCS5leGl0CQk9IGNwdWZyZXFfZ2VuZXJpY19leGl0LAogCS5uYW1lCQk9ICJjYmUtY3B1ZnJlcSIsCiAJLmZsYWdzCQk9IENQVUZSRVFfQ09OU1RfTE9PUFMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL3B4YTJ4eC1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvcHhhMnh4LWNwdWZyZXEuYwppbmRleCBhOTE5NWE4Li5lMjQyNjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvcHhhMnh4LWNwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvcHhhMnh4LWNwdWZyZXEuYwpAQCAtNDI3LDcgKzQyNyw2IEBACiAJLnZlcmlmeQk9IGNwdWZyZXFfZ2VuZXJpY19mcmVxdWVuY3lfdGFibGVfdmVyaWZ5LAogCS50YXJnZXRfaW5kZXggPSBweGFfc2V0X3RhcmdldCwKIAkuaW5pdAk9IHB4YV9jcHVmcmVxX2luaXQsCi0JLmV4aXQJPSBjcHVmcmVxX2dlbmVyaWNfZXhpdCwKIAkuZ2V0CT0gcHhhX2NwdWZyZXFfZ2V0LAogCS5uYW1lCT0gIlBYQTJ4eCIsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL3B4YTN4eC1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvcHhhM3h4LWNwdWZyZXEuYwppbmRleCAzNzg1Njg3Li5hMDEyNzU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvcHhhM3h4LWNwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvcHhhM3h4LWNwdWZyZXEuYwpAQCAtMjA1LDcgKzIwNSw2IEBACiAJLnZlcmlmeQkJPSBjcHVmcmVxX2dlbmVyaWNfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeSwKIAkudGFyZ2V0X2luZGV4CT0gcHhhM3h4X2NwdWZyZXFfc2V0LAogCS5pbml0CQk9IHB4YTN4eF9jcHVmcmVxX2luaXQsCi0JLmV4aXQJCT0gY3B1ZnJlcV9nZW5lcmljX2V4aXQsCiAJLmdldAkJPSBweGEzeHhfY3B1ZnJlcV9nZXQsCiAJLm5hbWUJCT0gInB4YTN4eC1jcHVmcmVxIiwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvczVwdjIxMC1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvczVwdjIxMC1jcHVmcmVxLmMKaW5kZXggNTVhOGU5Zi4uNzI0MjE1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL3M1cHYyMTAtY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9zNXB2MjEwLWNwdWZyZXEuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAKICNpbmNsdWRlIDxtYWNoL21hcC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgpAQCAtNDM1LDE4ICs0MzQsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgczVwdjIxMF9jcHVmcmVxX3N1c3BlbmQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgczVwdjIxMF9jcHVmcmVxX3Jlc3VtZShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW50IGNoZWNrX21lbV90eXBlKHZvaWQgX19pb21lbSAqZG1jX3JlZykKIHsKIAl1bnNpZ25lZCBsb25nIHZhbDsKQEAgLTUwMiw2ICs0ODksNyBAQAogCXM1cHYyMTBfZHJhbV9jb25mWzFdLnJlZnJlc2ggPSAoX19yYXdfcmVhZGwoUzVQX1ZBX0RNQzEgKyAweDMwKSAqIDEwMDApOwogCXM1cHYyMTBfZHJhbV9jb25mWzFdLmZyZXEgPSBjbGtfZ2V0X3JhdGUoZG1jMV9jbGspOwogCisJcG9saWN5LT5zdXNwZW5kX2ZyZXEgPSBTTEVFUF9GUkVROwogCXJldHVybiBjcHVmcmVxX2dlbmVyaWNfaW5pdChwb2xpY3ksIHM1cHYyMTBfZnJlcV90YWJsZSwgNDAwMDApOwogCiBvdXRfZG1jMToKQEAgLTUxMSwzMiArNDk5LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHM1cHYyMTBfY3B1ZnJlcV9ub3RpZmllcl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCi0JCQkJCSAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQotewotCWludCByZXQ7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBQTV9TVVNQRU5EX1BSRVBBUkU6Ci0JCXJldCA9IGNwdWZyZXFfZHJpdmVyX3RhcmdldChjcHVmcmVxX2NwdV9nZXQoMCksIFNMRUVQX0ZSRVEsIDApOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiBOT1RJRllfQkFEOwotCi0JCS8qIERpc2FibGUgdXBkYXRpb24gb2YgY3B1IGZyZXF1ZW5jeSAqLwotCQlub19jcHVmcmVxX2FjY2VzcyA9IHRydWU7Ci0JCXJldHVybiBOT1RJRllfT0s7Ci0JY2FzZSBQTV9QT1NUX1JFU1RPUkU6Ci0JY2FzZSBQTV9QT1NUX1NVU1BFTkQ6Ci0JCS8qIEVuYWJsZSB1cGRhdGlvbiBvZiBjcHUgZnJlcXVlbmN5ICovCi0JCW5vX2NwdWZyZXFfYWNjZXNzID0gZmFsc2U7Ci0JCWNwdWZyZXFfZHJpdmVyX3RhcmdldChjcHVmcmVxX2NwdV9nZXQoMCksIFNMRUVQX0ZSRVEsIDApOwotCi0JCXJldHVybiBOT1RJRllfT0s7Ci0JfQotCi0JcmV0dXJuIE5PVElGWV9ET05FOwotfQotCiBzdGF0aWMgaW50IHM1cHYyMTBfY3B1ZnJlcV9yZWJvb3Rfbm90aWZpZXJfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAogCQkJCQkJIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKIHsKQEAgLTU1OCwxNSArNTIwLDExIEBACiAJLmluaXQJCT0gczVwdjIxMF9jcHVfaW5pdCwKIAkubmFtZQkJPSAiczVwdjIxMCIsCiAjaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQJPSBzNXB2MjEwX2NwdWZyZXFfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHM1cHYyMTBfY3B1ZnJlcV9yZXN1bWUsCisJLnN1c3BlbmQJPSBjcHVmcmVxX2dlbmVyaWNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGNwdWZyZXFfZ2VuZXJpY19zdXNwZW5kLCAvKiBXZSBuZWVkIHRvIHNldCBTTEVFUCBGUkVRIGFnYWluICovCiAjZW5kaWYKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgczVwdjIxMF9jcHVmcmVxX25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gczVwdjIxMF9jcHVmcmVxX25vdGlmaWVyX2V2ZW50LAotfTsKLQogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzNXB2MjEwX2NwdWZyZXFfcmVib290X25vdGlmaWVyID0gewogCS5ub3RpZmllcl9jYWxsID0gczVwdjIxMF9jcHVmcmVxX3JlYm9vdF9ub3RpZmllcl9ldmVudCwKIH07CkBAIC01ODYsNyArNTQ0LDYgQEAKIAkJcmV0dXJuIFBUUl9FUlIoaW50X3JlZ3VsYXRvcik7CiAJfQogCi0JcmVnaXN0ZXJfcG1fbm90aWZpZXIoJnM1cHYyMTBfY3B1ZnJlcV9ub3RpZmllcik7CiAJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZzNXB2MjEwX2NwdWZyZXFfcmVib290X25vdGlmaWVyKTsKIAogCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmczVwdjIxMF9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL3NjNTIwX2ZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9zYzUyMF9mcmVxLmMKaW5kZXggNmFkYjM1NC4uNjkzNzFiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL3NjNTIwX2ZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvc2M1MjBfZnJlcS5jCkBAIC05Myw3ICs5Myw2IEBACiAJLnZlcmlmeQk9IGNwdWZyZXFfZ2VuZXJpY19mcmVxdWVuY3lfdGFibGVfdmVyaWZ5LAogCS50YXJnZXRfaW5kZXggPSBzYzUyMF9mcmVxX3RhcmdldCwKIAkuaW5pdAk9IHNjNTIwX2ZyZXFfY3B1X2luaXQsCi0JLmV4aXQJPSBjcHVmcmVxX2dlbmVyaWNfZXhpdCwKIAkubmFtZQk9ICJzYzUyMF9mcmVxIiwKIAkuYXR0cgk9IGNwdWZyZXFfZ2VuZXJpY19hdHRyLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9zaC1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvc2gtY3B1ZnJlcS5jCmluZGV4IDM4N2FmMTIuLjY5NjE3MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9zaC1jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL3NoLWNwdWZyZXEuYwpAQCAtMTQzLDcgKzE0Myw2IEBACiAJdW5zaWduZWQgaW50IGNwdSA9IHBvbGljeS0+Y3B1OwogCXN0cnVjdCBjbGsgKmNwdWNsayA9ICZwZXJfY3B1KHNoX2NwdWNsaywgY3B1KTsKIAotCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKGNwdSk7CiAJY2xrX3B1dChjcHVjbGspOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvc3BhcmMtdXMyZS1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvc3BhcmMtdXMyZS1jcHVmcmVxLmMKaW5kZXggNjJhYTIzZS4uYjczZmVlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL3NwYXJjLXVzMmUtY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9zcGFyYy11czJlLWNwdWZyZXEuYwpAQCAtMzAxLDEwICszMDEsOCBAQAogCiBzdGF0aWMgaW50IHVzMmVfZnJlcV9jcHVfZXhpdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKLQlpZiAoY3B1ZnJlcV91czJlX2RyaXZlcikgewotCQljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2xpY3ktPmNwdSk7CisJaWYgKGNwdWZyZXFfdXMyZV9kcml2ZXIpCiAJCXVzMmVfZnJlcV90YXJnZXQocG9saWN5LCAwKTsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9zcGFyYy11czMtY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL3NwYXJjLXVzMy1jcHVmcmVxLmMKaW5kZXggNzI0ZmZiZC4uOWJiNDJiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL3NwYXJjLXVzMy1jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL3NwYXJjLXVzMy1jcHVmcmVxLmMKQEAgLTE1NiwxMCArMTU2LDggQEAKIAogc3RhdGljIGludCB1czNfZnJlcV9jcHVfZXhpdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKLQlpZiAoY3B1ZnJlcV91czNfZHJpdmVyKSB7Ci0JCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsKKwlpZiAoY3B1ZnJlcV91czNfZHJpdmVyKQogCQl1czNfZnJlcV90YXJnZXQocG9saWN5LCAwKTsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9zcGVhci1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvc3BlYXItY3B1ZnJlcS5jCmluZGV4IDVjODZlM2YuLjRjZmRjZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9zcGVhci1jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL3NwZWFyLWNwdWZyZXEuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIApAQCAtMTYzLDExICsxNjQsMTAgQEAKIAkudGFyZ2V0X2luZGV4CT0gc3BlYXJfY3B1ZnJlcV90YXJnZXQsCiAJLmdldAkJPSBjcHVmcmVxX2dlbmVyaWNfZ2V0LAogCS5pbml0CQk9IHNwZWFyX2NwdWZyZXFfaW5pdCwKLQkuZXhpdAkJPSBjcHVmcmVxX2dlbmVyaWNfZXhpdCwKIAkuYXR0cgkJPSBjcHVmcmVxX2dlbmVyaWNfYXR0ciwKIH07CiAKLXN0YXRpYyBpbnQgc3BlYXJfY3B1ZnJlcV9kcml2ZXJfaW5pdCh2b2lkKQorc3RhdGljIGludCBzcGVhcl9jcHVmcmVxX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAljb25zdCBzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CkBAIC0yMzUsNyArMjM1LDE1IEBACiAJb2Zfbm9kZV9wdXQobnApOwogCXJldHVybiByZXQ7CiB9Ci1sYXRlX2luaXRjYWxsKHNwZWFyX2NwdWZyZXFfZHJpdmVyX2luaXQpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzcGVhcl9jcHVmcmVxX3BsYXRkcnYgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAic3BlYXItY3B1ZnJlcSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHNwZWFyX2NwdWZyZXFfcHJvYmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzcGVhcl9jcHVmcmVxX3BsYXRkcnYpOwogCiBNT0RVTEVfQVVUSE9SKCJEZWVwYWsgU2lrcmkgPGRlZXBhay5zaWtyaUBzdC5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNQRUFyIENQVUZyZXEgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMgYi9kcml2ZXJzL2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKaW5kZXggNGUxZGFjYS4uNjcyM2YwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYwpAQCAtNDA2LDggKzQwNiw2IEBACiAJaWYgKCFwZXJfY3B1KGNlbnRyaW5vX21vZGVsLCBjcHUpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKGNwdSk7Ci0KIAlwZXJfY3B1KGNlbnRyaW5vX21vZGVsLCBjcHUpID0gTlVMTDsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL3NwZWVkc3RlcC1pY2guYyBiL2RyaXZlcnMvY3B1ZnJlcS9zcGVlZHN0ZXAtaWNoLmMKaW5kZXggNzYzOWIyYi4uMzk0YWMxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL3NwZWVkc3RlcC1pY2guYworKysgYi9kcml2ZXJzL2NwdWZyZXEvc3BlZWRzdGVwLWljaC5jCkBAIC0zMTEsNyArMzExLDYgQEAKIAkudmVyaWZ5CT0gY3B1ZnJlcV9nZW5lcmljX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnksCiAJLnRhcmdldF9pbmRleCA9IHNwZWVkc3RlcF90YXJnZXQsCiAJLmluaXQJPSBzcGVlZHN0ZXBfY3B1X2luaXQsCi0JLmV4aXQJPSBjcHVmcmVxX2dlbmVyaWNfZXhpdCwKIAkuZ2V0CT0gc3BlZWRzdGVwX2dldCwKIAkuYXR0cgk9IGNwdWZyZXFfZ2VuZXJpY19hdHRyLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMgYi9kcml2ZXJzL2NwdWZyZXEvc3BlZWRzdGVwLXNtaS5jCmluZGV4IDk5OGMxN2IuLmRiNWQyNzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvc3BlZWRzdGVwLXNtaS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMKQEAgLTI4MCw3ICsyODAsNiBAQAogCS52ZXJpZnkJCT0gY3B1ZnJlcV9nZW5lcmljX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnksCiAJLnRhcmdldF9pbmRleAk9IHNwZWVkc3RlcF90YXJnZXQsCiAJLmluaXQJCT0gc3BlZWRzdGVwX2NwdV9pbml0LAotCS5leGl0CQk9IGNwdWZyZXFfZ2VuZXJpY19leGl0LAogCS5nZXQJCT0gc3BlZWRzdGVwX2dldCwKIAkucmVzdW1lCQk9IHNwZWVkc3RlcF9yZXN1bWUsCiAJLmF0dHIJCT0gY3B1ZnJlcV9nZW5lcmljX2F0dHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvdGVncmEtY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL3RlZ3JhLWNwdWZyZXEuYwppbmRleCBlNjUyYzFiLi42M2YwMDU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvdGVncmEtY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS90ZWdyYS1jcHVmcmVxLmMKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KIAogc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBmcmVxX3RhYmxlW10gPSB7CiAJeyAuZnJlcXVlbmN5ID0gMjE2MDAwIH0sCkBAIC00Nyw5ICs0Niw2IEBACiBzdGF0aWMgc3RydWN0IGNsayAqcGxsX3BfY2xrOwogc3RhdGljIHN0cnVjdCBjbGsgKmVtY19jbGs7CiAKLXN0YXRpYyBERUZJTkVfTVVURVgodGVncmFfY3B1X2xvY2spOwotc3RhdGljIGJvb2wgaXNfc3VzcGVuZGVkOwotCiBzdGF0aWMgaW50IHRlZ3JhX2NwdV9jbGtfc2V0X3JhdGUodW5zaWduZWQgbG9uZyByYXRlKQogewogCWludCByZXQ7CkBAIC0xMTIsNDIgKzEwOCw5IEBACiAKIHN0YXRpYyBpbnQgdGVncmFfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCB1bnNpZ25lZCBpbnQgaW5kZXgpCiB7Ci0JaW50IHJldCA9IC1FQlVTWTsKLQotCW11dGV4X2xvY2soJnRlZ3JhX2NwdV9sb2NrKTsKLQotCWlmICghaXNfc3VzcGVuZGVkKQotCQlyZXQgPSB0ZWdyYV91cGRhdGVfY3B1X3NwZWVkKHBvbGljeSwKLQkJCQlmcmVxX3RhYmxlW2luZGV4XS5mcmVxdWVuY3kpOwotCi0JbXV0ZXhfdW5sb2NrKCZ0ZWdyYV9jcHVfbG9jayk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gdGVncmFfdXBkYXRlX2NwdV9zcGVlZChwb2xpY3ksIGZyZXFfdGFibGVbaW5kZXhdLmZyZXF1ZW5jeSk7CiB9CiAKLXN0YXRpYyBpbnQgdGVncmFfcG1fbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgZXZlbnQsCi0Jdm9pZCAqZHVtbXkpCi17Ci0JbXV0ZXhfbG9jaygmdGVncmFfY3B1X2xvY2spOwotCWlmIChldmVudCA9PSBQTV9TVVNQRU5EX1BSRVBBUkUpIHsKLQkJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kgPSBjcHVmcmVxX2NwdV9nZXQoMCk7Ci0JCWlzX3N1c3BlbmRlZCA9IHRydWU7Ci0JCXByX2luZm8oIlRlZ3JhIGNwdWZyZXEgc3VzcGVuZDogc2V0dGluZyBmcmVxdWVuY3kgdG8gJWQga0h6XG4iLAotCQkJZnJlcV90YWJsZVswXS5mcmVxdWVuY3kpOwotCQlpZiAoY2xrX2dldF9yYXRlKGNwdV9jbGspIC8gMTAwMCAhPSBmcmVxX3RhYmxlWzBdLmZyZXF1ZW5jeSkKLQkJCXRlZ3JhX3VwZGF0ZV9jcHVfc3BlZWQocG9saWN5LCBmcmVxX3RhYmxlWzBdLmZyZXF1ZW5jeSk7Ci0JCWNwdWZyZXFfY3B1X3B1dChwb2xpY3kpOwotCX0gZWxzZSBpZiAoZXZlbnQgPT0gUE1fUE9TVF9TVVNQRU5EKSB7Ci0JCWlzX3N1c3BlbmRlZCA9IGZhbHNlOwotCX0KLQltdXRleF91bmxvY2soJnRlZ3JhX2NwdV9sb2NrKTsKLQotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdGVncmFfY3B1X3BtX25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gdGVncmFfcG1fbm90aWZ5LAotfTsKLQogc3RhdGljIGludCB0ZWdyYV9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKIAlpbnQgcmV0OwpAQCAtMTY2LDE2ICsxMjksMTMgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAocG9saWN5LT5jcHUgPT0gMCkKLQkJcmVnaXN0ZXJfcG1fbm90aWZpZXIoJnRlZ3JhX2NwdV9wbV9ub3RpZmllcik7Ci0KIAlwb2xpY3ktPmNsayA9IGNwdV9jbGs7CisJcG9saWN5LT5zdXNwZW5kX2ZyZXEgPSBmcmVxX3RhYmxlWzBdLmZyZXF1ZW5jeTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB0ZWdyYV9jcHVfZXhpdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKLQljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2xpY3ktPmNwdSk7CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNwdV9jbGspOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShlbWNfY2xrKTsKIAlyZXR1cm4gMDsKQEAgLTE5MCw2ICsxNTAsOSBAQAogCS5leGl0CQk9IHRlZ3JhX2NwdV9leGl0LAogCS5uYW1lCQk9ICJ0ZWdyYSIsCiAJLmF0dHIJCT0gY3B1ZnJlcV9nZW5lcmljX2F0dHIsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBjcHVmcmVxX2dlbmVyaWNfc3VzcGVuZCwKKyNlbmRpZgogfTsKIAogc3RhdGljIGludCBfX2luaXQgdGVncmFfY3B1ZnJlcV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvY291cGxlZC5jIGIvZHJpdmVycy9jcHVpZGxlL2NvdXBsZWQuYwppbmRleCBlOTUyOTM2Li5jYjY2NTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvY291cGxlZC5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9jb3VwbGVkLmMKQEAgLTMyMyw3ICszMjMsNyBAQAogCXN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhICpjc2QgPSAmcGVyX2NwdShjcHVpZGxlX2NvdXBsZWRfcG9rZV9jYiwgY3B1KTsKIAogCWlmICghY3B1bWFza190ZXN0X2FuZF9zZXRfY3B1KGNwdSwgJmNwdWlkbGVfY291cGxlZF9wb2tlX3BlbmRpbmcpKQotCQlfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGNzZCwgMCk7CisJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9hc3luYyhjcHUsIGNzZCk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuYyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmMKaW5kZXggYTU1ZTY4Zi4uY2IyMGZkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuYworKysgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jCkBAIC04NSw3ICs4NSw4IEBACiAKIAl0aW1lX2VuZCA9IGt0aW1lX2dldCgpOwogCi0JbG9jYWxfaXJxX2VuYWJsZSgpOworCWlmICghY3B1aWRsZV9zdGF0ZV9pc19jb3VwbGVkKGRldiwgZHJ2LCBlbnRlcmVkX3N0YXRlKSkKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJZGlmZiA9IGt0aW1lX3RvX3VzKGt0aW1lX3N1Yih0aW1lX2VuZCwgdGltZV9zdGFydCkpOwogCWlmIChkaWZmID4gSU5UX01BWCkKQEAgLTE0MCwxMiArMTQxLDE0IEBACiAJCXJldHVybiAwOwogCX0KIAotCXRyYWNlX2NwdV9pZGxlX3JjdWlkbGUobmV4dF9zdGF0ZSwgZGV2LT5jcHUpOwotCiAJYnJvYWRjYXN0ID0gISEoZHJ2LT5zdGF0ZXNbbmV4dF9zdGF0ZV0uZmxhZ3MgJiBDUFVJRExFX0ZMQUdfVElNRVJfU1RPUCk7CiAKLQlpZiAoYnJvYWRjYXN0KQotCQljbG9ja2V2ZW50c19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVIsICZkZXYtPmNwdSk7CisJaWYgKGJyb2FkY2FzdCAmJgorCSAgICBjbG9ja2V2ZW50c19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVIsICZkZXYtPmNwdSkpCisJCXJldHVybiAtRUJVU1k7CisKKworCXRyYWNlX2NwdV9pZGxlX3JjdWlkbGUobmV4dF9zdGF0ZSwgZGV2LT5jcHUpOwogCiAJaWYgKGNwdWlkbGVfc3RhdGVfaXNfY291cGxlZChkZXYsIGRydiwgbmV4dF9zdGF0ZSkpCiAJCWVudGVyZWRfc3RhdGUgPSBjcHVpZGxlX2VudGVyX3N0YXRlX2NvdXBsZWQoZGV2LCBkcnYsCkBAIC0xNTMsMTEgKzE1NiwxMSBAQAogCWVsc2UKIAkJZW50ZXJlZF9zdGF0ZSA9IGNwdWlkbGVfZW50ZXJfc3RhdGUoZGV2LCBkcnYsIG5leHRfc3RhdGUpOwogCisJdHJhY2VfY3B1X2lkbGVfcmN1aWRsZShQV1JfRVZFTlRfRVhJVCwgZGV2LT5jcHUpOworCiAJaWYgKGJyb2FkY2FzdCkKIAkJY2xvY2tldmVudHNfbm90aWZ5KENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX0VYSVQsICZkZXYtPmNwdSk7CiAKLQl0cmFjZV9jcHVfaWRsZV9yY3VpZGxlKFBXUl9FVkVOVF9FWElULCBkZXYtPmNwdSk7Ci0KIAkvKiBnaXZlIHRoZSBnb3Zlcm5vciBhbiBvcHBvcnR1bml0eSB0byByZWZsZWN0IG9uIHRoZSBvdXRjb21lICovCiAJaWYgKGNwdWlkbGVfY3Vycl9nb3Zlcm5vci0+cmVmbGVjdCkKIAkJY3B1aWRsZV9jdXJyX2dvdmVybm9yLT5yZWZsZWN0KGRldiwgZW50ZXJlZF9zdGF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvZHJpdmVyLmMgYi9kcml2ZXJzL2NwdWlkbGUvZHJpdmVyLmMKaW5kZXggMDZkYmU3Yy4uMTM2ZDZhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9kcml2ZXIuYwpAQCAtMjA5LDcgKzIwOSw3IEBACiAJc3RhdGUtPmV4aXRfbGF0ZW5jeSA9IDA7CiAJc3RhdGUtPnRhcmdldF9yZXNpZGVuY3kgPSAwOwogCXN0YXRlLT5wb3dlcl91c2FnZSA9IC0xOwotCXN0YXRlLT5mbGFncyA9IDA7CisJc3RhdGUtPmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQ7CiAJc3RhdGUtPmVudGVyID0gcG9sbF9pZGxlOwogCXN0YXRlLT5kaXNhYmxlZCA9IGZhbHNlOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVpZGxlL2dvdmVybm9ycy9tZW51LmMgYi9kcml2ZXJzL2NwdWlkbGUvZ292ZXJub3JzL21lbnUuYwppbmRleCBjZjdmMmYwLi43MWI1MjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvZ292ZXJub3JzL21lbnUuYworKysgYi9kcml2ZXJzL2NwdWlkbGUvZ292ZXJub3JzL21lbnUuYwpAQCAtMTIyLDkgKzEyMiw4IEBACiAJaW50CQlsYXN0X3N0YXRlX2lkeDsKIAlpbnQgICAgICAgICAgICAgbmVlZHNfdXBkYXRlOwogCi0JdW5zaWduZWQgaW50CWV4cGVjdGVkX3VzOworCXVuc2lnbmVkIGludAluZXh0X3RpbWVyX3VzOwogCXVuc2lnbmVkIGludAlwcmVkaWN0ZWRfdXM7Ci0JdW5zaWduZWQgaW50CWV4aXRfdXM7CiAJdW5zaWduZWQgaW50CWJ1Y2tldDsKIAl1bnNpZ25lZCBpbnQJY29ycmVjdGlvbl9mYWN0b3JbQlVDS0VUU107CiAJdW5zaWduZWQgaW50CWludGVydmFsc1tJTlRFUlZBTFNdOwpAQCAtMjU3LDcgKzI1Niw3IEBACiAJCXN0ZGRldiA9IGludF9zcXJ0KHN0ZGRldik7CiAJCWlmICgoKGF2ZyA+IHN0ZGRldiAqIDYpICYmIChkaXZpc29yICogNCA+PSBJTlRFUlZBTFMgKiAzKSkKIAkJCQkJCQl8fCBzdGRkZXYgPD0gMjApIHsKLQkJCWlmIChkYXRhLT5leHBlY3RlZF91cyA+IGF2ZykKKwkJCWlmIChkYXRhLT5uZXh0X3RpbWVyX3VzID4gYXZnKQogCQkJCWRhdGEtPnByZWRpY3RlZF91cyA9IGF2ZzsKIAkJCXJldHVybjsKIAkJfQpAQCAtMjg5LDcgKzI4OCw3IEBACiAJc3RydWN0IG1lbnVfZGV2aWNlICpkYXRhID0gJl9fZ2V0X2NwdV92YXIobWVudV9kZXZpY2VzKTsKIAlpbnQgbGF0ZW5jeV9yZXEgPSBwbV9xb3NfcmVxdWVzdChQTV9RT1NfQ1BVX0RNQV9MQVRFTkNZKTsKIAlpbnQgaTsKLQlpbnQgbXVsdGlwbGllcjsKKwl1bnNpZ25lZCBpbnQgaW50ZXJhY3Rpdml0eV9yZXE7CiAJc3RydWN0IHRpbWVzcGVjIHQ7CiAKIAlpZiAoZGF0YS0+bmVlZHNfdXBkYXRlKSB7CkBAIC0yOTgsNyArMjk3LDYgQEAKIAl9CiAKIAlkYXRhLT5sYXN0X3N0YXRlX2lkeCA9IDA7Ci0JZGF0YS0+ZXhpdF91cyA9IDA7CiAKIAkvKiBTcGVjaWFsIGNhc2Ugd2hlbiB1c2VyIGhhcyBzZXQgdmVyeSBzdHJpY3QgbGF0ZW5jeSByZXF1aXJlbWVudCAqLwogCWlmICh1bmxpa2VseShsYXRlbmN5X3JlcSA9PSAwKSkKQEAgLTMwNiwxMyArMzA0LDExIEBACiAKIAkvKiBkZXRlcm1pbmUgdGhlIGV4cGVjdGVkIHJlc2lkZW5jeSB0aW1lLCByb3VuZCB1cCAqLwogCXQgPSBrdGltZV90b190aW1lc3BlYyh0aWNrX25vaHpfZ2V0X3NsZWVwX2xlbmd0aCgpKTsKLQlkYXRhLT5leHBlY3RlZF91cyA9CisJZGF0YS0+bmV4dF90aW1lcl91cyA9CiAJCXQudHZfc2VjICogVVNFQ19QRVJfU0VDICsgdC50dl9uc2VjIC8gTlNFQ19QRVJfVVNFQzsKIAogCi0JZGF0YS0+YnVja2V0ID0gd2hpY2hfYnVja2V0KGRhdGEtPmV4cGVjdGVkX3VzKTsKLQotCW11bHRpcGxpZXIgPSBwZXJmb3JtYW5jZV9tdWx0aXBsaWVyKCk7CisJZGF0YS0+YnVja2V0ID0gd2hpY2hfYnVja2V0KGRhdGEtPm5leHRfdGltZXJfdXMpOwogCiAJLyoKIAkgKiBpZiB0aGUgY29ycmVjdGlvbiBmYWN0b3IgaXMgMCAoZWcgZmlyc3QgdGltZSBpbml0IG9yIGNwdSBob3RwbHVnCkBAIC0zMjYsMTcgKzMyMiwyNiBAQAogCSAqIG9wZXJhbmRzIGFyZSAzMiBiaXRzLgogCSAqIE1ha2Ugc3VyZSB0byByb3VuZCB1cCBmb3IgaGFsZiBtaWNyb3NlY29uZHMuCiAJICovCi0JZGF0YS0+cHJlZGljdGVkX3VzID0gZGl2X3JvdW5kNjQoKHVpbnQ2NF90KWRhdGEtPmV4cGVjdGVkX3VzICoKKwlkYXRhLT5wcmVkaWN0ZWRfdXMgPSBkaXZfcm91bmQ2NCgodWludDY0X3QpZGF0YS0+bmV4dF90aW1lcl91cyAqCiAJCQkJCSBkYXRhLT5jb3JyZWN0aW9uX2ZhY3RvcltkYXRhLT5idWNrZXRdLAogCQkJCQkgUkVTT0xVVElPTiAqIERFQ0FZKTsKIAogCWdldF90eXBpY2FsX2ludGVydmFsKGRhdGEpOwogCiAJLyoKKwkgKiBQZXJmb3JtYW5jZSBtdWx0aXBsaWVyIGRlZmluZXMgYSBtaW5pbXVtIHByZWRpY3RlZCBpZGxlCisJICogZHVyYXRpb24gLyBsYXRlbmN5IHJhdGlvLiBBZGp1c3QgdGhlIGxhdGVuY3kgbGltaXQgaWYKKwkgKiBuZWNlc3NhcnkuCisJICovCisJaW50ZXJhY3Rpdml0eV9yZXEgPSBkYXRhLT5wcmVkaWN0ZWRfdXMgLyBwZXJmb3JtYW5jZV9tdWx0aXBsaWVyKCk7CisJaWYgKGxhdGVuY3lfcmVxID4gaW50ZXJhY3Rpdml0eV9yZXEpCisJCWxhdGVuY3lfcmVxID0gaW50ZXJhY3Rpdml0eV9yZXE7CisKKwkvKgogCSAqIFdlIHdhbnQgdG8gZGVmYXVsdCB0byBDMSAoaGx0KSwgbm90IHRvIGJ1c3kgcG9sbGluZwogCSAqIHVubGVzcyB0aGUgdGltZXIgaXMgaGFwcGVuaW5nIHJlYWxseSByZWFsbHkgc29vbi4KIAkgKi8KLQlpZiAoZGF0YS0+ZXhwZWN0ZWRfdXMgPiA1ICYmCisJaWYgKGRhdGEtPm5leHRfdGltZXJfdXMgPiA1ICYmCiAJICAgICFkcnYtPnN0YXRlc1tDUFVJRExFX0RSSVZFUl9TVEFURV9TVEFSVF0uZGlzYWJsZWQgJiYKIAkJZGV2LT5zdGF0ZXNfdXNhZ2VbQ1BVSURMRV9EUklWRVJfU1RBVEVfU1RBUlRdLmRpc2FibGUgPT0gMCkKIAkJZGF0YS0+bGFzdF9zdGF0ZV9pZHggPSBDUFVJRExFX0RSSVZFUl9TVEFURV9TVEFSVDsKQEAgLTM1NSwxMSArMzYwLDggQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAocy0+ZXhpdF9sYXRlbmN5ID4gbGF0ZW5jeV9yZXEpCiAJCQljb250aW51ZTsKLQkJaWYgKHMtPmV4aXRfbGF0ZW5jeSAqIG11bHRpcGxpZXIgPiBkYXRhLT5wcmVkaWN0ZWRfdXMpCi0JCQljb250aW51ZTsKIAogCQlkYXRhLT5sYXN0X3N0YXRlX2lkeCA9IGk7Ci0JCWRhdGEtPmV4aXRfdXMgPSBzLT5leGl0X2xhdGVuY3k7CiAJfQogCiAJcmV0dXJuIGRhdGEtPmxhc3Rfc3RhdGVfaWR4OwpAQCAtMzkwLDM2ICszOTIsNDcgQEAKIHsKIAlzdHJ1Y3QgbWVudV9kZXZpY2UgKmRhdGEgPSAmX19nZXRfY3B1X3ZhcihtZW51X2RldmljZXMpOwogCWludCBsYXN0X2lkeCA9IGRhdGEtPmxhc3Rfc3RhdGVfaWR4OwotCXVuc2lnbmVkIGludCBsYXN0X2lkbGVfdXMgPSBjcHVpZGxlX2dldF9sYXN0X3Jlc2lkZW5jeShkZXYpOwogCXN0cnVjdCBjcHVpZGxlX3N0YXRlICp0YXJnZXQgPSAmZHJ2LT5zdGF0ZXNbbGFzdF9pZHhdOwogCXVuc2lnbmVkIGludCBtZWFzdXJlZF91czsKIAl1bnNpZ25lZCBpbnQgbmV3X2ZhY3RvcjsKIAogCS8qCi0JICogVWdoLCB0aGlzIGlkbGUgc3RhdGUgZG9lc24ndCBzdXBwb3J0IHJlc2lkZW5jeSBtZWFzdXJlbWVudHMsIHNvIHdlCi0JICogYXJlIGJhc2ljYWxseSBsb3N0IGluIHRoZSBkYXJrLiAgQXMgYSBjb21wcm9taXNlLCBhc3N1bWUgd2Ugc2xlcHQKLQkgKiBmb3IgdGhlIHdob2xlIGV4cGVjdGVkIHRpbWUuCisJICogVHJ5IHRvIGZpZ3VyZSBvdXQgaG93IG11Y2ggdGltZSBwYXNzZWQgYmV0d2VlbiBlbnRyeSB0byBsb3cKKwkgKiBwb3dlciBzdGF0ZSBhbmQgb2NjdXJyZW5jZSBvZiB0aGUgd2FrZXVwIGV2ZW50LgorCSAqCisJICogSWYgdGhlIGVudGVyZWQgaWRsZSBzdGF0ZSBkaWRuJ3Qgc3VwcG9ydCByZXNpZGVuY3kgbWVhc3VyZW1lbnRzLAorCSAqIHdlIGFyZSBiYXNpY2FsbHkgbG9zdCBpbiB0aGUgZGFyayBob3cgbXVjaCB0aW1lIHBhc3NlZC4KKwkgKiBBcyBhIGNvbXByb21pc2UsIGFzc3VtZSB3ZSBzbGVwdCBmb3IgdGhlIHdob2xlIGV4cGVjdGVkIHRpbWUuCisJICoKKwkgKiBBbnkgbWVhc3VyZWQgYW1vdW50IG9mIHRpbWUgd2lsbCBpbmNsdWRlIHRoZSBleGl0IGxhdGVuY3kuCisJICogU2luY2Ugd2UgYXJlIGludGVyZXN0ZWQgaW4gd2hlbiB0aGUgd2FrZXVwIGJlZ3VuLCBub3Qgd2hlbiBpdAorCSAqIHdhcyBjb21wbGV0ZWQsIHdlIG11c3Qgc3Vic3RyYWN0IHRoZSBleGl0IGxhdGVuY3kuIEhvd2V2ZXIsIGlmCisJICogdGhlIG1lYXN1cmVkIGFtb3VudCBvZiB0aW1lIGlzIGxlc3MgdGhhbiB0aGUgZXhpdCBsYXRlbmN5LAorCSAqIGFzc3VtZSB0aGUgc3RhdGUgd2FzIG5ldmVyIHJlYWNoZWQgYW5kIHRoZSBleGl0IGxhdGVuY3kgaXMgMC4KIAkgKi8KLQlpZiAodW5saWtlbHkoISh0YXJnZXQtPmZsYWdzICYgQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQpKSkKLQkJbGFzdF9pZGxlX3VzID0gZGF0YS0+ZXhwZWN0ZWRfdXM7CisJaWYgKHVubGlrZWx5KCEodGFyZ2V0LT5mbGFncyAmIENQVUlETEVfRkxBR19USU1FX1ZBTElEKSkpIHsKKwkJLyogVXNlIHRpbWVyIHZhbHVlIGFzIGlzICovCisJCW1lYXN1cmVkX3VzID0gZGF0YS0+bmV4dF90aW1lcl91czsKIAorCX0gZWxzZSB7CisJCS8qIFVzZSBtZWFzdXJlZCB2YWx1ZSAqLworCQltZWFzdXJlZF91cyA9IGNwdWlkbGVfZ2V0X2xhc3RfcmVzaWRlbmN5KGRldik7CiAKLQltZWFzdXJlZF91cyA9IGxhc3RfaWRsZV91czsKKwkJLyogRGVkdWN0IGV4aXQgbGF0ZW5jeSAqLworCQlpZiAobWVhc3VyZWRfdXMgPiB0YXJnZXQtPmV4aXRfbGF0ZW5jeSkKKwkJCW1lYXN1cmVkX3VzIC09IHRhcmdldC0+ZXhpdF9sYXRlbmN5OwogCi0JLyoKLQkgKiBXZSBjb3JyZWN0IGZvciB0aGUgZXhpdCBsYXRlbmN5OyB3ZSBhcmUgYXNzdW1pbmcgaGVyZSB0aGF0IHRoZQotCSAqIGV4aXQgbGF0ZW5jeSBoYXBwZW5zIGFmdGVyIHRoZSBldmVudCB0aGF0IHdlJ3JlIGludGVyZXN0ZWQgaW4uCi0JICovCi0JaWYgKG1lYXN1cmVkX3VzID4gZGF0YS0+ZXhpdF91cykKLQkJbWVhc3VyZWRfdXMgLT0gZGF0YS0+ZXhpdF91czsKLQorCQkvKiBNYWtlIHN1cmUgb3VyIGNvZWZmaWNpZW50cyBkbyBub3QgZXhjZWVkIHVuaXR5ICovCisJCWlmIChtZWFzdXJlZF91cyA+IGRhdGEtPm5leHRfdGltZXJfdXMpCisJCQltZWFzdXJlZF91cyA9IGRhdGEtPm5leHRfdGltZXJfdXM7CisJfQogCiAJLyogVXBkYXRlIG91ciBjb3JyZWN0aW9uIHJhdGlvICovCiAJbmV3X2ZhY3RvciA9IGRhdGEtPmNvcnJlY3Rpb25fZmFjdG9yW2RhdGEtPmJ1Y2tldF07CiAJbmV3X2ZhY3RvciAtPSBuZXdfZmFjdG9yIC8gREVDQVk7CiAKLQlpZiAoZGF0YS0+ZXhwZWN0ZWRfdXMgPiAwICYmIG1lYXN1cmVkX3VzIDwgTUFYX0lOVEVSRVNUSU5HKQotCQluZXdfZmFjdG9yICs9IFJFU09MVVRJT04gKiBtZWFzdXJlZF91cyAvIGRhdGEtPmV4cGVjdGVkX3VzOworCWlmIChkYXRhLT5uZXh0X3RpbWVyX3VzID4gMCAmJiBtZWFzdXJlZF91cyA8IE1BWF9JTlRFUkVTVElORykKKwkJbmV3X2ZhY3RvciArPSBSRVNPTFVUSU9OICogbWVhc3VyZWRfdXMgLyBkYXRhLT5uZXh0X3RpbWVyX3VzOwogCWVsc2UKIAkJLyoKIAkJICogd2Ugd2VyZSBpZGxlIHNvIGxvbmcgdGhhdCB3ZSBjb3VudCBpdCBhcyBhIHBlcmZlY3QKQEAgLTQzOSw3ICs0NTIsNyBAQAogCWRhdGEtPmNvcnJlY3Rpb25fZmFjdG9yW2RhdGEtPmJ1Y2tldF0gPSBuZXdfZmFjdG9yOwogCiAJLyogdXBkYXRlIHRoZSByZXBlYXRpbmctcGF0dGVybiBkYXRhICovCi0JZGF0YS0+aW50ZXJ2YWxzW2RhdGEtPmludGVydmFsX3B0cisrXSA9IGxhc3RfaWRsZV91czsKKwlkYXRhLT5pbnRlcnZhbHNbZGF0YS0+aW50ZXJ2YWxfcHRyKytdID0gbWVhc3VyZWRfdXM7CiAJaWYgKGRhdGEtPmludGVydmFsX3B0ciA+PSBJTlRFUlZBTFMpCiAJCWRhdGEtPmludGVydmFsX3B0ciA9IDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvZGV2ZnJlcS5jIGIvZHJpdmVycy9kZXZmcmVxL2RldmZyZXEuYwppbmRleCBhMGIyZjdlLi4yMDQyZWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RldmZyZXEvZGV2ZnJlcS5jCisrKyBiL2RyaXZlcnMvZGV2ZnJlcS9kZXZmcmVxLmMKQEAgLTkxLDI2ICs5MSwzNSBAQAogICovCiBzdGF0aWMgaW50IGRldmZyZXFfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgZGV2ZnJlcSAqZGV2ZnJlcSwgdW5zaWduZWQgbG9uZyBmcmVxKQogewotCWludCBsZXYsIHByZXZfbGV2OworCWludCBsZXYsIHByZXZfbGV2LCByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgY3VyX3RpbWU7CiAKLQlsZXYgPSBkZXZmcmVxX2dldF9mcmVxX2xldmVsKGRldmZyZXEsIGZyZXEpOwotCWlmIChsZXYgPCAwKQotCQlyZXR1cm4gbGV2OwotCiAJY3VyX3RpbWUgPSBqaWZmaWVzOwotCWRldmZyZXEtPnRpbWVfaW5fc3RhdGVbbGV2XSArPQorCisJcHJldl9sZXYgPSBkZXZmcmVxX2dldF9mcmVxX2xldmVsKGRldmZyZXEsIGRldmZyZXEtPnByZXZpb3VzX2ZyZXEpOworCWlmIChwcmV2X2xldiA8IDApIHsKKwkJcmV0ID0gcHJldl9sZXY7CisJCWdvdG8gb3V0OworCX0KKworCWRldmZyZXEtPnRpbWVfaW5fc3RhdGVbcHJldl9sZXZdICs9CiAJCQkgY3VyX3RpbWUgLSBkZXZmcmVxLT5sYXN0X3N0YXRfdXBkYXRlZDsKLQlpZiAoZnJlcSAhPSBkZXZmcmVxLT5wcmV2aW91c19mcmVxKSB7Ci0JCXByZXZfbGV2ID0gZGV2ZnJlcV9nZXRfZnJlcV9sZXZlbChkZXZmcmVxLAotCQkJCQkJZGV2ZnJlcS0+cHJldmlvdXNfZnJlcSk7CisKKwlsZXYgPSBkZXZmcmVxX2dldF9mcmVxX2xldmVsKGRldmZyZXEsIGZyZXEpOworCWlmIChsZXYgPCAwKSB7CisJCXJldCA9IGxldjsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGxldiAhPSBwcmV2X2xldikgewogCQlkZXZmcmVxLT50cmFuc190YWJsZVsocHJldl9sZXYgKgogCQkJCWRldmZyZXEtPnByb2ZpbGUtPm1heF9zdGF0ZSkgKyBsZXZdKys7CiAJCWRldmZyZXEtPnRvdGFsX3RyYW5zKys7CiAJfQotCWRldmZyZXEtPmxhc3Rfc3RhdF91cGRhdGVkID0gY3VyX3RpbWU7CiAKLQlyZXR1cm4gMDsKK291dDoKKwlkZXZmcmVxLT5sYXN0X3N0YXRfdXBkYXRlZCA9IGN1cl90aW1lOworCXJldHVybiByZXQ7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmMKaW5kZXggOThlMTRlZS4uZjhiZjAwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jCkBAIC0xMjM5LDkgKzEyMzksMTcgQEAKIAlpZiAobnVtX2RjdHNfaW50bHYgPT0gMikgewogCQlzZWxlY3QgPSAoc3lzX2FkZHIgPj4gOCkgJiAweDM7CiAJCWNoYW5uZWwgPSBzZWxlY3QgPyAweDMgOiAwOwotCX0gZWxzZSBpZiAobnVtX2RjdHNfaW50bHYgPT0gNCkKLQkJY2hhbm5lbCA9IChzeXNfYWRkciA+PiA4KSAmIDB4NzsKLQorCX0gZWxzZSBpZiAobnVtX2RjdHNfaW50bHYgPT0gNCkgeworCQl1OCBpbnRsdl9hZGRyID0gZGN0X3NlbF9pbnRlcmxlYXZlX2FkZHIocHZ0KTsKKwkJc3dpdGNoIChpbnRsdl9hZGRyKSB7CisJCWNhc2UgMHg0OgorCQkJY2hhbm5lbCA9IChzeXNfYWRkciA+PiA4KSAmIDB4MzsKKwkJCWJyZWFrOworCQljYXNlIDB4NToKKwkJCWNoYW5uZWwgPSAoc3lzX2FkZHIgPj4gOSkgJiAweDM7CisJCQlicmVhazsKKwkJfQorCX0KIAlyZXR1cm4gY2hhbm5lbDsKIH0KIApAQCAtMTc5OSw2ICsxODA3LDE3IEBACiAJCQkucmVhZF9kY3RfcGNpX2NmZwk9IGYxMF9yZWFkX2RjdF9wY2lfY2ZnLAogCQl9CiAJfSwKKwlbRjE2X00zMEhfQ1BVU10gPSB7CisJCS5jdGxfbmFtZSA9ICJGMTZoX00zMGgiLAorCQkuZjFfaWQgPSBQQ0lfREVWSUNFX0lEX0FNRF8xNkhfTTMwSF9OQl9GMSwKKwkJLmYzX2lkID0gUENJX0RFVklDRV9JRF9BTURfMTZIX00zMEhfTkJfRjMsCisJCS5vcHMgPSB7CisJCQkuZWFybHlfY2hhbm5lbF9jb3VudAk9IGYxeF9lYXJseV9jaGFubmVsX2NvdW50LAorCQkJLm1hcF9zeXNhZGRyX3RvX2Nzcm93CT0gZjF4X21hcF9zeXNhZGRyX3RvX2Nzcm93LAorCQkJLmRiYW1fdG9fY3MJCT0gZjE2X2RiYW1fdG9fY2hpcF9zZWxlY3QsCisJCQkucmVhZF9kY3RfcGNpX2NmZwk9IGYxMF9yZWFkX2RjdF9wY2lfY2ZnLAorCQl9CisJfSwKIH07CiAKIC8qCkBAIC0yNTc4LDYgKzI1OTcsMTEgQEAKIAkJYnJlYWs7CiAKIAljYXNlIDB4MTY6CisJCWlmIChwdnQtPm1vZGVsID09IDB4MzApIHsKKwkJCWZhbV90eXBlID0gJmZhbWlseV90eXBlc1tGMTZfTTMwSF9DUFVTXTsKKwkJCXB2dC0+b3BzID0gJmZhbWlseV90eXBlc1tGMTZfTTMwSF9DUFVTXS5vcHM7CisJCQlicmVhazsKKwkJfQogCQlmYW1fdHlwZQk9ICZmYW1pbHlfdHlwZXNbRjE2X0NQVVNdOwogCQlwdnQtPm9wcwk9ICZmYW1pbHlfdHlwZXNbRjE2X0NQVVNdLm9wczsKIAkJYnJlYWs7CkBAIC0yODMwLDYgKzI4NTQsMTQgQEAKIAkJLmNsYXNzCQk9IDAsCiAJCS5jbGFzc19tYXNrCT0gMCwKIAl9LAorCXsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0FNRCwKKwkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX0FNRF8xNkhfTTMwSF9OQl9GMiwKKwkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCQkuY2xhc3MJCT0gMCwKKwkJLmNsYXNzX21hc2sJPSAwLAorCX0sCiAKIAl7MCwgfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmggYi9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5oCmluZGV4IDZkYzFmY2MuLmQ5MDNlMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmgKKysrIGIvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuaApAQCAtMTY4LDYgKzE2OCw4IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzE1SF9OQl9GMgkweDE2MDIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTZIX05CX0YxCTB4MTUzMQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF8xNkhfTkJfRjIJMHgxNTMyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzE2SF9NMzBIX05CX0YxIDB4MTU4MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF8xNkhfTTMwSF9OQl9GMiAweDE1ODIKIAogLyoKICAqIEZ1bmN0aW9uIDEgLSBBZGRyZXNzIE1hcApAQCAtMzAwLDYgKzMwMiw3IEBACiAJRjE1X0NQVVMsCiAJRjE1X00zMEhfQ1BVUywKIAlGMTZfQ1BVUywKKwlGMTZfTTMwSF9DUFVTLAogCU5VTV9GQU1JTElFUywKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9hbWQ4MTExX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9hbWQ4MTExX2VkYWMuYwppbmRleCBkZGQ4OTAwLi4yYjYzZjdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvYW1kODExMV9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL2FtZDgxMTFfZWRhYy5jCkBAIC0zNTAsNiArMzUwLDcgQEAKIAkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGFtZDgxMTFfZGV2X2luZm8gKmRldl9pbmZvID0gJmFtZDgxMTFfZGV2aWNlc1tpZC0+ZHJpdmVyX2RhdGFdOworCWludCByZXQgPSAtRU5PREVWOwogCiAJZGV2X2luZm8tPmRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQU1ELAogCQkJCQlkZXZfaW5mby0+ZXJyX2RldiwgTlVMTCk7CkBAIC0zNTksMTYgKzM2MCwxNSBAQAogCQkJInZlbmRvciAleCwgZGV2aWNlICV4LCBuYW1lICVzXG4iLAogCQkJUENJX1ZFTkRPUl9JRF9BTUQsIGRldl9pbmZvLT5lcnJfZGV2LAogCQkJZGV2X2luZm8tPmN0bF9uYW1lKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCWdvdG8gZXJyOwogCX0KIAogCWlmIChwY2lfZW5hYmxlX2RldmljZShkZXZfaW5mby0+ZGV2KSkgewotCQlwY2lfZGV2X3B1dChkZXZfaW5mby0+ZGV2KTsKIAkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gZW5hYmxlOiIKIAkJCSJ2ZW5kb3IgJXgsIGRldmljZSAleCwgbmFtZSAlc1xuIiwKIAkJCVBDSV9WRU5ET1JfSURfQU1ELCBkZXZfaW5mby0+ZXJyX2RldiwKIAkJCWRldl9pbmZvLT5jdGxfbmFtZSk7Ci0JCXJldHVybiAtRU5PREVWOworCQlnb3RvIGVycl9kZXZfcHV0OwogCX0KIAogCS8qCkBAIC0zODEsOCArMzgxLDEwIEBACiAJCWVkYWNfZGV2aWNlX2FsbG9jX2N0bF9pbmZvKDAsIGRldl9pbmZvLT5jdGxfbmFtZSwgMSwKIAkJCQkJICAgTlVMTCwgMCwgMCwKIAkJCQkJICAgTlVMTCwgMCwgZGV2X2luZm8tPmVkYWNfaWR4KTsKLQlpZiAoIWRldl9pbmZvLT5lZGFjX2RldikKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCFkZXZfaW5mby0+ZWRhY19kZXYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfZGV2X3B1dDsKKwl9CiAKIAlkZXZfaW5mby0+ZWRhY19kZXYtPnB2dF9pbmZvID0gZGV2X2luZm87CiAJZGV2X2luZm8tPmVkYWNfZGV2LT5kZXYgPSAmZGV2X2luZm8tPmRldi0+ZGV2OwpAQCAtMzk5LDggKzQwMSw3IEBACiAJaWYgKGVkYWNfZGV2aWNlX2FkZF9kZXZpY2UoZGV2X2luZm8tPmVkYWNfZGV2KSA+IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gYWRkIGVkYWNfZGV2IGZvciAlc1xuIiwKIAkJCWRldl9pbmZvLT5jdGxfbmFtZSk7Ci0JCWVkYWNfZGV2aWNlX2ZyZWVfY3RsX2luZm8oZGV2X2luZm8tPmVkYWNfZGV2KTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCWdvdG8gZXJyX2VkYWNfZnJlZV9jdGw7CiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyAiYWRkZWQgb25lIGVkYWNfZGV2IG9uIEFNRDgxMTEgIgpAQCAtNDA5LDYgKzQxMCwxMyBAQAogCQlkZXZfaW5mby0+Y3RsX25hbWUpOwogCiAJcmV0dXJuIDA7CisKK2Vycl9lZGFjX2ZyZWVfY3RsOgorCWVkYWNfZGV2aWNlX2ZyZWVfY3RsX2luZm8oZGV2X2luZm8tPmVkYWNfZGV2KTsKK2Vycl9kZXZfcHV0OgorCXBjaV9kZXZfcHV0KGRldl9pbmZvLT5kZXYpOworZXJyOgorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGFtZDgxMTFfZGV2X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQpAQCAtNDM3LDYgKzQ0NSw3IEBACiAJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBhbWQ4MTExX3BjaV9pbmZvICpwY2lfaW5mbyA9ICZhbWQ4MTExX3BjaXNbaWQtPmRyaXZlcl9kYXRhXTsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKIAogCXBjaV9pbmZvLT5kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FNRCwKIAkJCQkJcGNpX2luZm8tPmVycl9kZXYsIE5VTEwpOwpAQCAtNDQ2LDE2ICs0NTUsMTUgQEAKIAkJCSJ2ZW5kb3IgJXgsIGRldmljZSAleCwgbmFtZSAlc1xuIiwKIAkJCVBDSV9WRU5ET1JfSURfQU1ELCBwY2lfaW5mby0+ZXJyX2RldiwKIAkJCXBjaV9pbmZvLT5jdGxfbmFtZSk7Ci0JCXJldHVybiAtRU5PREVWOworCQlnb3RvIGVycjsKIAl9CiAKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2luZm8tPmRldikpIHsKLQkJcGNpX2Rldl9wdXQocGNpX2luZm8tPmRldik7CiAJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGVuYWJsZToiCiAJCQkidmVuZG9yICV4LCBkZXZpY2UgJXgsIG5hbWUgJXNcbiIsCiAJCQlQQ0lfVkVORE9SX0lEX0FNRCwgcGNpX2luZm8tPmVycl9kZXYsCiAJCQlwY2lfaW5mby0+Y3RsX25hbWUpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZ290byBlcnJfZGV2X3B1dDsKIAl9CiAKIAkvKgpAQCAtNDY1LDggKzQ3MywxMCBAQAogCSovCiAJcGNpX2luZm8tPmVkYWNfaWR4ID0gZWRhY19wY2lfYWxsb2NfaW5kZXgoKTsKIAlwY2lfaW5mby0+ZWRhY19kZXYgPSBlZGFjX3BjaV9hbGxvY19jdGxfaW5mbygwLCBwY2lfaW5mby0+Y3RsX25hbWUpOwotCWlmICghcGNpX2luZm8tPmVkYWNfZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIXBjaV9pbmZvLT5lZGFjX2RldikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kZXZfcHV0OworCX0KIAogCXBjaV9pbmZvLT5lZGFjX2Rldi0+cHZ0X2luZm8gPSBwY2lfaW5mbzsKIAlwY2lfaW5mby0+ZWRhY19kZXYtPmRldiA9ICZwY2lfaW5mby0+ZGV2LT5kZXY7CkBAIC00ODMsOCArNDkzLDcgQEAKIAlpZiAoZWRhY19wY2lfYWRkX2RldmljZShwY2lfaW5mby0+ZWRhY19kZXYsIHBjaV9pbmZvLT5lZGFjX2lkeCkgPiAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGFkZCBlZGFjX3BjaSBmb3IgJXNcbiIsCiAJCQlwY2lfaW5mby0+Y3RsX25hbWUpOwotCQllZGFjX3BjaV9mcmVlX2N0bF9pbmZvKHBjaV9pbmZvLT5lZGFjX2Rldik7Ci0JCXJldHVybiAtRU5PREVWOworCQlnb3RvIGVycl9lZGFjX2ZyZWVfY3RsOwogCX0KIAogCXByaW50ayhLRVJOX0lORk8gImFkZGVkIG9uZSBlZGFjX3BjaSBvbiBBTUQ4MTExICIKQEAgLTQ5Myw2ICs1MDIsMTMgQEAKIAkJcGNpX2luZm8tPmN0bF9uYW1lKTsKIAogCXJldHVybiAwOworCitlcnJfZWRhY19mcmVlX2N0bDoKKwllZGFjX3BjaV9mcmVlX2N0bF9pbmZvKHBjaV9pbmZvLT5lZGFjX2Rldik7CitlcnJfZGV2X3B1dDoKKwlwY2lfZGV2X3B1dChwY2lfaW5mby0+ZGV2KTsKK2VycjoKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBhbWQ4MTExX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lNzUyeF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvZTc1MnhfZWRhYy5jCmluZGV4IDkyZDU0ZmEuLmIyZDcxMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lNzUyeF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL2U3NTJ4X2VkYWMuYwpAQCAtMjA5LDcgKzIwOSw2IEBACiAgKi8KIAogc3RydWN0IGU3NTJ4X3B2dCB7Ci0Jc3RydWN0IHBjaV9kZXYgKmJyaWRnZV9jazsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2X2QwZjA7CiAJc3RydWN0IHBjaV9kZXYgKmRldl9kMGYxOwogCXUzMiB0b2xtOwpAQCAtODkxLDcgKzg5MCw3IEBACiAJCQkJCWluZm8tPmJ1Zl9mZXJyKTsKIAogCQlpZiAoaW5mby0+ZHJhbV9mZXJyKQotCQkJcGNpX3dyaXRlX2JpdHMxNihwdnQtPmJyaWRnZV9jaywgRTc1MlhfRFJBTV9GRVJSLAorCQkJcGNpX3dyaXRlX2JpdHMxNihwdnQtPmRldl9kMGYxLCBFNzUyWF9EUkFNX0ZFUlIsCiAJCQkJCSBpbmZvLT5kcmFtX2ZlcnIsIGluZm8tPmRyYW1fZmVycik7CiAKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIEU3NTJYX0ZFUlJfR0xPQkFMLApAQCAtOTM2LDcgKzkzNSw3IEBACiAJCQkJCWluZm8tPmJ1Zl9uZXJyKTsKIAogCQlpZiAoaW5mby0+ZHJhbV9uZXJyKQotCQkJcGNpX3dyaXRlX2JpdHMxNihwdnQtPmJyaWRnZV9jaywgRTc1MlhfRFJBTV9ORVJSLAorCQkJcGNpX3dyaXRlX2JpdHMxNihwdnQtPmRldl9kMGYxLCBFNzUyWF9EUkFNX05FUlIsCiAJCQkJCSBpbmZvLT5kcmFtX25lcnIsIGluZm8tPmRyYW1fbmVycik7CiAKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIEU3NTJYX05FUlJfR0xPQkFMLApAQCAtMTE3NywzOCArMTE3NiwzMyBAQAogc3RhdGljIGludCBlNzUyeF9nZXRfZGV2cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGRldl9pZHgsCiAJCQlzdHJ1Y3QgZTc1MnhfcHZ0ICpwdnQpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldjsKKwlwdnQtPmRldl9kMGYxID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCQlwdnQtPmRldl9pbmZvLT5lcnJfZGV2LCBOVUxMKTsKIAotCXB2dC0+YnJpZGdlX2NrID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkJCQlwdnQtPmRldl9pbmZvLT5lcnJfZGV2LCBwdnQtPmJyaWRnZV9jayk7Ci0KLQlpZiAocHZ0LT5icmlkZ2VfY2sgPT0gTlVMTCkgewotCQlwdnQtPmJyaWRnZV9jayA9IHBjaV9zY2FuX3NpbmdsZV9kZXZpY2UocGRldi0+YnVzLAorCWlmIChwdnQtPmRldl9kMGYxID09IE5VTEwpIHsKKwkJcHZ0LT5kZXZfZDBmMSA9IHBjaV9zY2FuX3NpbmdsZV9kZXZpY2UocGRldi0+YnVzLAogCQkJCQkJCVBDSV9ERVZGTigwLCAxKSk7Ci0JCXBjaV9kZXZfZ2V0KHB2dC0+YnJpZGdlX2NrKTsKKwkJcGNpX2Rldl9nZXQocHZ0LT5kZXZfZDBmMSk7CiAJfQogCi0JaWYgKHB2dC0+YnJpZGdlX2NrID09IE5VTEwpIHsKKwlpZiAocHZ0LT5kZXZfZDBmMSA9PSBOVUxMKSB7CiAJCWU3NTJ4X3ByaW50ayhLRVJOX0VSUiwgImVycm9yIHJlcG9ydGluZyBkZXZpY2Ugbm90IGZvdW5kOiIKIAkJCSJ2ZW5kb3IgJXggZGV2aWNlIDB4JXggKGJyb2tlbiBCSU9TPylcbiIsCiAJCQlQQ0lfVkVORE9SX0lEX0lOVEVMLCBlNzUyeF9kZXZzW2Rldl9pZHhdLmVycl9kZXYpOwogCQlyZXR1cm4gMTsKIAl9CiAKLQlkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCXB2dC0+ZGV2X2QwZjAgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAogCQkJCWU3NTJ4X2RldnNbZGV2X2lkeF0uY3RsX2RldiwKIAkJCQlOVUxMKTsKIAotCWlmIChkZXYgPT0gTlVMTCkKKwlpZiAocHZ0LT5kZXZfZDBmMCA9PSBOVUxMKQogCQlnb3RvIGZhaWw7CiAKLQlwdnQtPmRldl9kMGYwID0gZGV2OwotCXB2dC0+ZGV2X2QwZjEgPSBwY2lfZGV2X2dldChwdnQtPmJyaWRnZV9jayk7Ci0KIAlyZXR1cm4gMDsKIAogZmFpbDoKLQlwY2lfZGV2X3B1dChwdnQtPmJyaWRnZV9jayk7CisJcGNpX2Rldl9wdXQocHZ0LT5kZXZfZDBmMSk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTEzODUsNyArMTM3OSw2IEBACiBmYWlsOgogCXBjaV9kZXZfcHV0KHB2dC0+ZGV2X2QwZjApOwogCXBjaV9kZXZfcHV0KHB2dC0+ZGV2X2QwZjEpOwotCXBjaV9kZXZfcHV0KHB2dC0+YnJpZGdlX2NrKTsKIAllZGFjX21jX2ZyZWUobWNpKTsKIAogCXJldHVybiAtRU5PREVWOwpAQCAtMTQxOSw3ICsxNDEyLDYgQEAKIAlwdnQgPSAoc3RydWN0IGU3NTJ4X3B2dCAqKW1jaS0+cHZ0X2luZm87CiAJcGNpX2Rldl9wdXQocHZ0LT5kZXZfZDBmMCk7CiAJcGNpX2Rldl9wdXQocHZ0LT5kZXZfZDBmMSk7Ci0JcGNpX2Rldl9wdXQocHZ0LT5icmlkZ2VfY2spOwogCWVkYWNfbWNfZnJlZShtY2kpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvaTMyMDBfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2kzMjAwX2VkYWMuYwppbmRleCBmYTEzMjZlLi4wMjJhNzAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvaTMyMDBfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9pMzIwMF9lZGFjLmMKQEAgLTQ2NCw2ICs0NjQsOCBAQAogCWlvdW5tYXAocHJpdi0+d2luZG93KTsKIAogCWVkYWNfbWNfZnJlZShtY2kpOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgaTMyMDBfcGNpX3RibFtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2k1MTAwX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9pNTEwMF9lZGFjLmMKaW5kZXggMzZhMzhlZS4uNjI0N2QxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2k1MTAwX2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvaTUxMDBfZWRhYy5jCkBAIC04NjksMTYgKzg2OSwxMyBAQAogCQkJICAgICAgIGNoYW4sIHJhbmssIDApOwogCiAJCWRpbW0tPm5yX3BhZ2VzID0gbnBhZ2VzOwotCQlpZiAobnBhZ2VzKSB7Ci0JCQlkaW1tLT5ncmFpbiA9IDMyOwotCQkJZGltbS0+ZHR5cGUgPSAocHJpdi0+bXRyW2NoYW5dW3JhbmtdLndpZHRoID09IDQpID8KLQkJCQkJREVWX1g0IDogREVWX1g4OwotCQkJZGltbS0+bXR5cGUgPSBNRU1fUkREUjI7Ci0JCQlkaW1tLT5lZGFjX21vZGUgPSBFREFDX1NFQ0RFRDsKLQkJCXNucHJpbnRmKGRpbW0tPmxhYmVsLCBzaXplb2YoZGltbS0+bGFiZWwpLAotCQkJCSJESU1NJXUiLAotCQkJCWk1MTAwX3JhbmtfdG9fc2xvdChtY2ksIGNoYW4sIHJhbmspKTsKLQkJfQorCQlkaW1tLT5ncmFpbiA9IDMyOworCQlkaW1tLT5kdHlwZSA9IChwcml2LT5tdHJbY2hhbl1bcmFua10ud2lkdGggPT0gNCkgPworCQkJCURFVl9YNCA6IERFVl9YODsKKwkJZGltbS0+bXR5cGUgPSBNRU1fUkREUjI7CisJCWRpbW0tPmVkYWNfbW9kZSA9IEVEQUNfU0VDREVEOworCQlzbnByaW50ZihkaW1tLT5sYWJlbCwgc2l6ZW9mKGRpbW0tPmxhYmVsKSwgIkRJTU0ldSIsCisJCQkgaTUxMDBfcmFua190b19zbG90KG1jaSwgY2hhbiwgcmFuaykpOwogCiAJCWVkYWNfZGJnKDIsICJkaW1tIGNoYW5uZWwgJWQsIHJhbmsgJWQsIHNpemUgJWxkXG4iLAogCQkJIGNoYW4sIHJhbmssIChsb25nKVBBR0VTX1RPX01pQihucGFnZXMpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9pNTQwMF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvaTU0MDBfZWRhYy5jCmluZGV4IGUwODBjYmYuLjUzODFlOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9pNTQwMF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL2k1NDAwX2VkYWMuYwpAQCAtMTQwOCw2ICsxNDA4LDggQEAKIAkvKiByZXRyaWV2ZSByZWZlcmVuY2VzIHRvIHJlc291cmNlcywgYW5kIGZyZWUgdGhvc2UgcmVzb3VyY2VzICovCiAJaTU0MDBfcHV0X2RldmljZXMobWNpKTsKIAorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwogCWVkYWNfbWNfZnJlZShtY2kpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvaTdjb3JlX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9pN2NvcmVfZWRhYy5jCmluZGV4IGQ4NzEyNzUuLjhiYzgzYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9pN2NvcmVfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9pN2NvcmVfZWRhYy5jCkBAIC0xNzA4LDcgKzE3MDgsNyBAQAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgbWNlICptKQogewogCXN0cnVjdCBpN2NvcmVfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOwotCWNoYXIgKnR5cGUsICpvcHR5cGUsICplcnI7CisJY2hhciAqb3B0eXBlLCAqZXJyOwogCWVudW0gaHdfZXZlbnRfbWNfZXJyX3R5cGUgdHBfZXZlbnQ7CiAJdW5zaWduZWQgbG9uZyBlcnJvciA9IG0tPnN0YXR1cyAmIDB4MWZmMDAwMGw7CiAJYm9vbCB1bmNvcnJlY3RlZF9lcnJvciA9IG0tPm1jZ3N0YXR1cyAmIDFsbCA8PCA2MTsKQEAgLTE3MjEsMTUgKzE3MjEsMTEgQEAKIAl1MzIgZXJybnVtID0gZmluZF9maXJzdF9iaXQoJmVycm9yLCAzMik7CiAKIAlpZiAodW5jb3JyZWN0ZWRfZXJyb3IpIHsKLQkJaWYgKHJpcHYpIHsKLQkJCXR5cGUgPSAiRkFUQUwiOworCQlpZiAocmlwdikKIAkJCXRwX2V2ZW50ID0gSFdfRVZFTlRfRVJSX0ZBVEFMOwotCQl9IGVsc2UgewotCQkJdHlwZSA9ICJOT05fRkFUQUwiOworCQllbHNlCiAJCQl0cF9ldmVudCA9IEhXX0VWRU5UX0VSUl9VTkNPUlJFQ1RFRDsKLQkJfQogCX0gZWxzZSB7Ci0JCXR5cGUgPSAiQ09SUkVDVEVEIjsKIAkJdHBfZXZlbnQgPSBIV19FVkVOVF9FUlJfQ09SUkVDVEVEOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2k4Mjg3NXBfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2k4Mjg3NXBfZWRhYy5jCmluZGV4IDgwNTczZGYuLjhkMDQ1MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9pODI4NzVwX2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvaTgyODc1cF9lZGFjLmMKQEAgLTQwNiw4ICs0MDYsNiBAQAogCiAJZWRhY19kYmcoMCwgIlxuIik7CiAKLQlvdnJmbF9wZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRfREVWKElOVEVMLCA4Mjg3NV82KSwgTlVMTCk7Ci0KIAlpZiAoaTgyODc1cF9zZXR1cF9vdmVyZmxfZGV2KHBkZXYsICZvdnJmbF9wZGV2LCAmb3ZyZmxfd2luZG93KSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJZHJjID0gcmVhZGwob3ZyZmxfd2luZG93ICsgSTgyODc1UF9EUkMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL21jZV9hbWQuYyBiL2RyaXZlcnMvZWRhYy9tY2VfYW1kLmMKaW5kZXggMzBmNzMwOS4uNTFiOWNhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL21jZV9hbWQuYworKysgYi9kcml2ZXJzL2VkYWMvbWNlX2FtZC5jCkBAIC03NDEsNiArNzQxLDM2IEBACiAJaWYgKGFtZF9maWx0ZXJfbWNlKG0pKQogCQlyZXR1cm4gTk9USUZZX1NUT1A7CiAKKwlwcl9lbWVyZyhIV19FUlIgIiVzXG4iLCBkZWNvZGVfZXJyb3Jfc3RhdHVzKG0pKTsKKworCXByX2VtZXJnKEhXX0VSUiAiQ1BVOiVkICgleDoleDoleCkgTUMlZF9TVEFUVVNbJXN8JXN8JXN8JXN8JXMiLAorCQltLT5leHRjcHUsCisJCWMtPng4NiwgYy0+eDg2X21vZGVsLCBjLT54ODZfbWFzaywKKwkJbS0+YmFuaywKKwkJKChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX09WRVIpCT8gIk92ZXIiICA6ICItIiksCisJCSgobS0+c3RhdHVzICYgTUNJX1NUQVRVU19VQykJPyAiVUUiCSAgOiAiQ0UiKSwKKwkJKChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX01JU0NWKQk/ICJNaXNjViIgOiAiLSIpLAorCQkoKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfUENDKQk/ICJQQ0MiCSAgOiAiLSIpLAorCQkoKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfQUREUlYpCT8gIkFkZHJWIiA6ICItIikpOworCisJaWYgKGMtPng4NiA9PSAweDE1IHx8IGMtPng4NiA9PSAweDE2KQorCQlwcl9jb250KCJ8JXN8JXMiLAorCQkJKChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX0RFRkVSUkVEKSA/ICJEZWZlcnJlZCIgOiAiLSIpLAorCQkJKChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX1BPSVNPTikgICA/ICJQb2lzb24iICAgOiAiLSIpKTsKKworCS8qIGRvIHRoZSB0d28gYml0c1sxNDoxM10gdG9nZXRoZXIgKi8KKwllY2MgPSAobS0+c3RhdHVzID4+IDQ1KSAmIDB4MzsKKwlpZiAoZWNjKQorCQlwcl9jb250KCJ8JXNFQ0MiLCAoKGVjYyA9PSAyKSA/ICJDIiA6ICJVIikpOworCisJcHJfY29udCgiXTogMHglMDE2bGx4XG4iLCBtLT5zdGF0dXMpOworCisJaWYgKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfQUREUlYpCisJCXByX2VtZXJnKEhXX0VSUiAiTUMlZF9BRERSOiAweCUwMTZsbHhcbiIsIG0tPmJhbmssIG0tPmFkZHIpOworCisJaWYgKCFmYW1fb3BzKQorCQlnb3RvIGVycl9jb2RlOworCiAJc3dpdGNoIChtLT5iYW5rKSB7CiAJY2FzZSAwOgogCQlkZWNvZGVfbWMwX21jZShtKTsKQEAgLTc3NCwzMyArODA0LDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JcHJfZW1lcmcoSFdfRVJSICJFcnJvciBTdGF0dXM6ICVzXG4iLCBkZWNvZGVfZXJyb3Jfc3RhdHVzKG0pKTsKLQotCXByX2VtZXJnKEhXX0VSUiAiQ1BVOiVkICgleDoleDoleCkgTUMlZF9TVEFUVVNbJXN8JXN8JXN8JXN8JXMiLAotCQltLT5leHRjcHUsCi0JCWMtPng4NiwgYy0+eDg2X21vZGVsLCBjLT54ODZfbWFzaywKLQkJbS0+YmFuaywKLQkJKChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX09WRVIpCT8gIk92ZXIiICA6ICItIiksCi0JCSgobS0+c3RhdHVzICYgTUNJX1NUQVRVU19VQykJPyAiVUUiCSAgOiAiQ0UiKSwKLQkJKChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX01JU0NWKQk/ICJNaXNjViIgOiAiLSIpLAotCQkoKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfUENDKQk/ICJQQ0MiCSAgOiAiLSIpLAotCQkoKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfQUREUlYpCT8gIkFkZHJWIiA6ICItIikpOwotCi0JaWYgKGMtPng4NiA9PSAweDE1IHx8IGMtPng4NiA9PSAweDE2KQotCQlwcl9jb250KCJ8JXN8JXMiLAotCQkJKChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX0RFRkVSUkVEKSA/ICJEZWZlcnJlZCIgOiAiLSIpLAotCQkJKChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX1BPSVNPTikgICA/ICJQb2lzb24iICAgOiAiLSIpKTsKLQotCS8qIGRvIHRoZSB0d28gYml0c1sxNDoxM10gdG9nZXRoZXIgKi8KLQllY2MgPSAobS0+c3RhdHVzID4+IDQ1KSAmIDB4MzsKLQlpZiAoZWNjKQotCQlwcl9jb250KCJ8JXNFQ0MiLCAoKGVjYyA9PSAyKSA/ICJDIiA6ICJVIikpOwotCi0JcHJfY29udCgiXTogMHglMDE2bGx4XG4iLCBtLT5zdGF0dXMpOwotCi0JaWYgKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfQUREUlYpCi0JCXByX2VtZXJnKEhXX0VSUiAiTUMlZF9BRERSOiAweCUwMTZsbHhcbiIsIG0tPmJhbmssIG0tPmFkZHIpOwotCisgZXJyX2NvZGU6CiAJYW1kX2RlY29kZV9lcnJfY29kZShtLT5zdGF0dXMgJiAweGZmZmYpOwogCiAJcmV0dXJuIE5PVElGWV9TVE9QOwpAQCAtODE2LDEwICs4MjAsNyBAQAogCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZib290X2NwdV9kYXRhOwogCiAJaWYgKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9BTUQpCi0JCXJldHVybiAwOwotCi0JaWYgKGMtPng4NiA8IDB4ZiB8fCBjLT54ODYgPiAweDE2KQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlmYW1fb3BzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFtZF9kZWNvZGVyX29wcyksIEdGUF9LRVJORUwpOwogCWlmICghZmFtX29wcykKQEAgLTg3NCw3ICs4NzUsNyBAQAogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkh1aD8gV2hhdCBmYW1pbHkgaXMgaXQ6IDB4JXg/IVxuIiwgYy0+eDg2KTsKIAkJa2ZyZWUoZmFtX29wcyk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlmYW1fb3BzID0gTlVMTDsKIAl9CiAKIAlwcl9pbmZvKCJNQ0U6IEluLWtlcm5lbCBNQ0UgZGVjb2RpbmcgZW5hYmxlZC5cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5jIGIvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5jCmluZGV4IDhmOTE4MjEuLmY0YWVjMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMKQEAgLTM1Nyw3ICszNTcsNyBAQAogCQlwZGF0YS0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob3AtPmRldi5vZl9ub2RlLCAwKTsKIAkJcmVzID0gZGV2bV9yZXF1ZXN0X2lycSgmb3AtPmRldiwgcGRhdGEtPmlycSwKIAkJCQkgICAgICAgbXBjODV4eF9wY2lfaXNyLAotCQkJCSAgICAgICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisJCQkJICAgICAgIElSUUZfU0hBUkVELAogCQkJCSAgICAgICAiW0VEQUNdIFBDSSBlcnIiLCBwY2kpOwogCQlpZiAocmVzIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSCkBAIC02MzMsNyArNjMzLDcgQEAKIAlpZiAoZWRhY19vcF9zdGF0ZSA9PSBFREFDX09QU1RBVEVfSU5UKSB7CiAJCXBkYXRhLT5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChvcC0+ZGV2Lm9mX25vZGUsIDApOwogCQlyZXMgPSBkZXZtX3JlcXVlc3RfaXJxKCZvcC0+ZGV2LCBwZGF0YS0+aXJxLAotCQkJCSAgICAgICBtcGM4NXh4X2wyX2lzciwgSVJRRl9ESVNBQkxFRCwKKwkJCQkgICAgICAgbXBjODV4eF9sMl9pc3IsIDAsCiAJCQkJICAgICAgICJbRURBQ10gTDIgZXJyIiwgZWRhY19kZXYpOwogCQlpZiAocmVzIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSCkBAIC0xMTMzLDcgKzExMzMsNyBAQAogCQlwZGF0YS0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob3AtPmRldi5vZl9ub2RlLCAwKTsKIAkJcmVzID0gZGV2bV9yZXF1ZXN0X2lycSgmb3AtPmRldiwgcGRhdGEtPmlycSwKIAkJCQkgICAgICAgbXBjODV4eF9tY19pc3IsCi0JCQkJCUlSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKwkJCQkgICAgICAgSVJRRl9TSEFSRUQsCiAJCQkJICAgICAgICJbRURBQ10gTUMgZXJyIiwgbWNpKTsKIAkJaWYgKHJlcyA8IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byByZXF1ZXN0IGlycSAlZCBmb3IgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL3NiX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9zYl9lZGFjLmMKaW5kZXggNTRlMmFiZS4uMzQ3YzdhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL3NiX2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvc2JfZWRhYy5jCkBAIC0xMjYzLDcgKzEyNjMsNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKIAl1OCBidXMgPSAwOwogCi0Jc2JyaWRnZV9wcmludGsoS0VSTl9JTkZPLAorCXNicmlkZ2VfcHJpbnRrKEtFUk5fREVCVUcsCiAJCSJTZWVraW5nIGZvcjogZGV2ICUwMnguJWQgUENJIElEICUwNHg6JTA0eFxuIiwKIAkJZGV2X2Rlc2NyLT5kZXYsIGRldl9kZXNjci0+ZnVuYywKIAkJUENJX1ZFTkRPUl9JRF9JTlRFTCwgZGV2X2Rlc2NyLT5kZXZfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vS2NvbmZpZyBiL2RyaXZlcnMvZXh0Y29uL0tjb25maWcKaW5kZXggYmRiNWEwMC4uYmU1NmU4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9leHRjb24vS2NvbmZpZworKysgYi9kcml2ZXJzL2V4dGNvbi9LY29uZmlnCkBAIC0xNCwxMCArMTQsNiBAQAogCiBjb21tZW50ICJFeHRjb24gRGV2aWNlIERyaXZlcnMiCiAKLWNvbmZpZyBPRl9FWFRDT04KLQlkZWZfdHJpc3RhdGUgeQotCWRlcGVuZHMgb24gT0YKLQogY29uZmlnIEVYVENPTl9HUElPCiAJdHJpc3RhdGUgIkdQSU8gZXh0Y29uIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBHUElPTElCCmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9NYWtlZmlsZSBiL2RyaXZlcnMvZXh0Y29uL01ha2VmaWxlCmluZGV4IDQzZWNjYzAuLmJmNzg2MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZXh0Y29uL01ha2VmaWxlCkBAIC0yLDggKzIsNiBAQAogIyBNYWtlZmlsZSBmb3IgZXh0ZXJuYWwgY29ubmVjdG9yIGNsYXNzIChleHRjb24pIGRldmljZXMKICMKIAotb2JqLSQoQ09ORklHX09GX0VYVENPTikJCSs9IG9mX2V4dGNvbi5vCi0KIG9iai0kKENPTkZJR19FWFRDT04pCQkrPSBleHRjb24tY2xhc3Mubwogb2JqLSQoQ09ORklHX0VYVENPTl9HUElPKQkrPSBleHRjb24tZ3Bpby5vCiBvYmotJChDT05GSUdfRVhUQ09OX0FEQ19KQUNLKQkrPSBleHRjb24tYWRjLWphY2subwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vZXh0Y29uLWNsYXNzLmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tY2xhc3MuYwppbmRleCA3NjMyMjMzLi43YWIyMWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tY2xhc3MuYworKysgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tY2xhc3MuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V4dGNvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAKIC8qCiAgKiBleHRjb25fY2FibGVfbmFtZSBzdWdnZXN0cyB0aGUgc3RhbmRhcmQgY2FibGUgbmFtZXMgZm9yIGNvbW1vbmx5IHVzZWQKQEAgLTgxOCw2ICs4MTksNDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGV4dGNvbl9kZXZfdW5yZWdpc3Rlcik7CiAKKyNpZmRlZiBDT05GSUdfT0YKKy8qCisgKiBleHRjb25fZ2V0X2VkZXZfYnlfcGhhbmRsZSAtIEdldCB0aGUgZXh0Y29uIGRldmljZSBmcm9tIGRldmljZXRyZWUKKyAqIEBkZXYgLSBpbnN0YW5jZSB0byB0aGUgZ2l2ZW4gZGV2aWNlCisgKiBAaW5kZXggLSBpbmRleCBpbnRvIGxpc3Qgb2YgZXh0Y29uX2RldgorICoKKyAqIHJldHVybiB0aGUgaW5zdGFuY2Ugb2YgZXh0Y29uIGRldmljZQorICovCitzdHJ1Y3QgZXh0Y29uX2RldiAqZXh0Y29uX2dldF9lZGV2X2J5X3BoYW5kbGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaW5kZXgpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlOworCXN0cnVjdCBleHRjb25fZGV2ICplZGV2OworCisJaWYgKCFkZXYtPm9mX25vZGUpIHsKKwkJZGV2X2VycihkZXYsICJkZXZpY2UgZG9lcyBub3QgaGF2ZSBhIGRldmljZSBub2RlIGVudHJ5XG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUoZGV2LT5vZl9ub2RlLCAiZXh0Y29uIiwgaW5kZXgpOworCWlmICghbm9kZSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgcGhhbmRsZSBpbiAlcyBub2RlXG4iLAorCQkJZGV2LT5vZl9ub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwl9CisKKwllZGV2ID0gZXh0Y29uX2dldF9leHRjb25fZGV2KG5vZGUtPm5hbWUpOworCWlmICghZWRldikgeworCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBnZXQgZXh0Y29uIGRldmljZSA6ICVzXG4iLCBub2RlLT5uYW1lKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisJfQorCisJcmV0dXJuIGVkZXY7Cit9CisjZWxzZQorc3RydWN0IGV4dGNvbl9kZXYgKmV4dGNvbl9nZXRfZWRldl9ieV9waGFuZGxlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGluZGV4KQoreworCXJldHVybiBFUlJfUFRSKC1FTk9TWVMpOworfQorI2VuZGlmIC8qIENPTkZJR19PRiAqLworRVhQT1JUX1NZTUJPTF9HUEwoZXh0Y29uX2dldF9lZGV2X2J5X3BoYW5kbGUpOworCiBzdGF0aWMgaW50IF9faW5pdCBleHRjb25fY2xhc3NfaW5pdCh2b2lkKQogewogCXJldHVybiBjcmVhdGVfZXh0Y29uX2NsYXNzKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tZ3Bpby5jIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLWdwaW8uYwppbmRleCBhNjNhNmIyLi4xM2Q1MjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tZ3Bpby5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1ncGlvLmMKQEAgLTE3Niw5ICsxNzYsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBncGlvX2V4dGNvbl9wbV9vcHMgPSB7Ci0JU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMoTlVMTCwgZ3Bpb19leHRjb25fcmVzdW1lKQotfTsKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhncGlvX2V4dGNvbl9wbV9vcHMsIE5VTEwsIGdwaW9fZXh0Y29uX3Jlc3VtZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdwaW9fZXh0Y29uX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gZ3Bpb19leHRjb25fcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tcGFsbWFzLmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tcGFsbWFzLmMKaW5kZXggMmFlYTRiYy4uZGRmZjJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9leHRjb24vZXh0Y29uLXBhbG1hcy5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1wYWxtYXMuYwpAQCAtMjcxLDEwICsyNzEsNyBAQAogfTsKICNlbmRpZgogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgcGFsbWFzX3BtX29wcyA9IHsKLQlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhwYWxtYXNfdXNiX3N1c3BlbmQsCi0JCQkJcGFsbWFzX3VzYl9yZXN1bWUpCi19Oworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHBhbG1hc19wbV9vcHMsIHBhbG1hc191c2Jfc3VzcGVuZCwgcGFsbWFzX3VzYl9yZXN1bWUpOwogCiBzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBvZl9wYWxtYXNfbWF0Y2hfdGJsW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJ0aSxwYWxtYXMtdXNiIiwgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL29mX2V4dGNvbi5jIGIvZHJpdmVycy9leHRjb24vb2ZfZXh0Y29uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMTczZWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9leHRjb24vb2ZfZXh0Y29uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogT0YgaGVscGVycyBmb3IgRXh0ZXJuYWwgY29ubmVjdG9yIChleHRjb24pIGZyYW1ld29yawotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgotICogS2lzaG9uIFZpamF5IEFicmFoYW0gSSA8a2lzaG9uQHRpLmNvbT4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgU2Ftc3VuZyBFbGVjdHJvbmljcwotICogQ2hhbndvbyBDaG9pIDxjdzAwLmNob2lAc2Ftc3VuZy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2V4dGNvbi5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxsaW51eC9leHRjb24vb2ZfZXh0Y29uLmg+Ci0KLS8qCi0gKiBvZl9leHRjb25fZ2V0X2V4dGNvbl9kZXYgLSBHZXQgdGhlIG5hbWUgb2YgZXh0Y29uIGRldmljZSBmcm9tIGRldmljZXRyZWUKLSAqIEBkZXYgLSBpbnN0YW5jZSB0byB0aGUgZ2l2ZW4gZGV2aWNlCi0gKiBAaW5kZXggLSBpbmRleCBpbnRvIGxpc3Qgb2YgZXh0Y29uX2RldgotICoKLSAqIHJldHVybiB0aGUgaW5zdGFuY2Ugb2YgZXh0Y29uIGRldmljZQotICovCi1zdHJ1Y3QgZXh0Y29uX2RldiAqb2ZfZXh0Y29uX2dldF9leHRjb25fZGV2KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGluZGV4KQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKLQlzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldjsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpleHRjb25fcGFyZW50X2RldjsKLQotCWlmICghZGV2LT5vZl9ub2RlKSB7Ci0JCWRldl9kYmcoZGV2LCAiZGV2aWNlIGRvZXMgbm90IGhhdmUgYSBkZXZpY2Ugbm9kZSBlbnRyeVxuIik7Ci0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCX0KLQotCW5vZGUgPSBvZl9wYXJzZV9waGFuZGxlKGRldi0+b2Zfbm9kZSwgImV4dGNvbiIsIGluZGV4KTsKLQlpZiAoIW5vZGUpIHsKLQkJZGV2X2RiZyhkZXYsICJmYWlsZWQgdG8gZ2V0IHBoYW5kbGUgaW4gJXMgbm9kZVxuIiwKLQkJCWRldi0+b2Zfbm9kZS0+ZnVsbF9uYW1lKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Ci0JfQotCi0JZXh0Y29uX3BhcmVudF9kZXYgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKG5vZGUpOwotCWlmICghZXh0Y29uX3BhcmVudF9kZXYpIHsKLQkJZGV2X2RiZyhkZXYsICJ1bmFibGUgdG8gZmluZCBkZXZpY2UgYnkgbm9kZVxuIik7Ci0JCXJldHVybiBFUlJfUFRSKC1FUFJPQkVfREVGRVIpOwotCX0KLQotCWVkZXYgPSBleHRjb25fZ2V0X2V4dGNvbl9kZXYoZGV2X25hbWUoJmV4dGNvbl9wYXJlbnRfZGV2LT5kZXYpKTsKLQlpZiAoIWVkZXYpIHsKLQkJZGV2X2RiZyhkZXYsICJ1bmFibGUgdG8gZ2V0IGV4dGNvbiBkZXZpY2UgOiAlc1xuIiwKLQkJCQlkZXZfbmFtZSgmZXh0Y29uX3BhcmVudF9kZXYtPmRldikpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKLQl9Ci0KLQlyZXR1cm4gZWRldjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG9mX2V4dGNvbl9nZXRfZXh0Y29uX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9nc21pLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9nc21pLmMKaW5kZXggZTVhNjdiMi4uZjFhYjA1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvZ3NtaS5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL2dzbWkuYwpAQCAtODkyLDEzICs4OTIsNiBAQAogCQlnb3RvIG91dF9yZW1vdmVfc3lzZnNfZmlsZXM7CiAJfQogCi0JcmV0ID0gZWZpdmFyc19zeXNmc19pbml0KCk7Ci0JaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9JTkZPICJnc21pOiBGYWlsZWQgdG8gY3JlYXRlIGVmaXZhcnMgZmlsZXNcbiIpOwotCQllZml2YXJzX3VucmVnaXN0ZXIoJmVmaXZhcnMpOwotCQlnb3RvIG91dF9yZW1vdmVfc3lzZnNfZmlsZXM7Ci0JfQotCiAJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZnc21pX3JlYm9vdF9ub3RpZmllcik7CiAJcmVnaXN0ZXJfZGllX25vdGlmaWVyKCZnc21pX2RpZV9ub3RpZmllcik7CiAJYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvbWVtY29uc29sZS5jIGIvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvbWVtY29uc29sZS5jCmluZGV4IDJhOTBiYTYuLjJmNTY5YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL21lbWNvbnNvbGUuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9tZW1jb25zb2xlLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vYmlvc19lYmRhLmg+CiAKICNkZWZpbmUgQklPU19NRU1DT05TT0xFX1YxX01BR0lDCTB4REVBREJBQkUKQEAgLTQxLDE1ICs0MiwyNSBAQAogCX07CiB9IF9fcGFja2VkOwogCi1zdGF0aWMgY2hhciAqbWVtY29uc29sZV9iYXNlYWRkcjsKK3N0YXRpYyB1MzIgbWVtY29uc29sZV9iYXNlYWRkcjsKIHN0YXRpYyBzaXplX3QgbWVtY29uc29sZV9sZW5ndGg7CiAKIHN0YXRpYyBzc2l6ZV90IG1lbWNvbnNvbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYnAsCiAJCQkgICAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLCBjaGFyICpidWYsCiAJCQkgICAgICAgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KQogewotCXJldHVybiBtZW1vcnlfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCAmcG9zLCBtZW1jb25zb2xlX2Jhc2VhZGRyLAotCQkJCSAgICAgICBtZW1jb25zb2xlX2xlbmd0aCk7CisJY2hhciAqbWVtY29uc29sZTsKKwlzc2l6ZV90IHJldDsKKworCW1lbWNvbnNvbGUgPSBpb3JlbWFwX2NhY2hlKG1lbWNvbnNvbGVfYmFzZWFkZHIsIG1lbWNvbnNvbGVfbGVuZ3RoKTsKKwlpZiAoIW1lbWNvbnNvbGUpIHsKKwkJcHJfZXJyKCJtZW1jb25zb2xlOiBpb3JlbWFwX2NhY2hlIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXQgPSBtZW1vcnlfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCAmcG9zLCBtZW1jb25zb2xlLAorCQkJCSAgICAgIG1lbWNvbnNvbGVfbGVuZ3RoKTsKKwlpb3VubWFwKG1lbWNvbnNvbGUpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBtZW1jb25zb2xlX2Jpbl9hdHRyID0gewpAQCAtNTgsNDMgKzY5LDQyIEBACiB9OwogCiAKLXN0YXRpYyB2b2lkIGZvdW5kX3YxX2hlYWRlcihzdHJ1Y3QgYmlvc21lbWNvbl9lYmRhICpoZHIpCitzdGF0aWMgdm9pZCBfX2luaXQgZm91bmRfdjFfaGVhZGVyKHN0cnVjdCBiaW9zbWVtY29uX2ViZGEgKmhkcikKIHsKLQlwcmludGsoS0VSTl9JTkZPICJCSU9TIGNvbnNvbGUgdjEgRUJEQSBzdHJ1Y3R1cmUgZm91bmQgYXQgJXBcbiIsIGhkcik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQklPUyBjb25zb2xlIGJ1ZmZlciBhdCAweCUuOHgsICIKKwlwcl9pbmZvKCJCSU9TIGNvbnNvbGUgdjEgRUJEQSBzdHJ1Y3R1cmUgZm91bmQgYXQgJXBcbiIsIGhkcik7CisJcHJfaW5mbygiQklPUyBjb25zb2xlIGJ1ZmZlciBhdCAweCUuOHgsICIKIAkgICAgICAgInN0YXJ0ID0gJWQsIGVuZCA9ICVkLCBudW0gPSAlZFxuIiwKIAkgICAgICAgaGRyLT52MS5idWZmZXJfYWRkciwgaGRyLT52MS5zdGFydCwKIAkgICAgICAgaGRyLT52MS5lbmQsIGhkci0+djEubnVtX2NoYXJzKTsKIAogCW1lbWNvbnNvbGVfbGVuZ3RoID0gaGRyLT52MS5udW1fY2hhcnM7Ci0JbWVtY29uc29sZV9iYXNlYWRkciA9IHBoeXNfdG9fdmlydChoZHItPnYxLmJ1ZmZlcl9hZGRyKTsKKwltZW1jb25zb2xlX2Jhc2VhZGRyID0gaGRyLT52MS5idWZmZXJfYWRkcjsKIH0KIAotc3RhdGljIHZvaWQgZm91bmRfdjJfaGVhZGVyKHN0cnVjdCBiaW9zbWVtY29uX2ViZGEgKmhkcikKK3N0YXRpYyB2b2lkIF9faW5pdCBmb3VuZF92Ml9oZWFkZXIoc3RydWN0IGJpb3NtZW1jb25fZWJkYSAqaGRyKQogewotCXByaW50ayhLRVJOX0lORk8gIkJJT1MgY29uc29sZSB2MiBFQkRBIHN0cnVjdHVyZSBmb3VuZCBhdCAlcFxuIiwgaGRyKTsKLQlwcmludGsoS0VSTl9JTkZPICJCSU9TIGNvbnNvbGUgYnVmZmVyIGF0IDB4JS44eCwgIgorCXByX2luZm8oIkJJT1MgY29uc29sZSB2MiBFQkRBIHN0cnVjdHVyZSBmb3VuZCBhdCAlcFxuIiwgaGRyKTsKKwlwcl9pbmZvKCJCSU9TIGNvbnNvbGUgYnVmZmVyIGF0IDB4JS44eCwgIgogCSAgICAgICAic3RhcnQgPSAlZCwgZW5kID0gJWQsIG51bV9ieXRlcyA9ICVkXG4iLAogCSAgICAgICBoZHItPnYyLmJ1ZmZlcl9hZGRyLCBoZHItPnYyLnN0YXJ0LAogCSAgICAgICBoZHItPnYyLmVuZCwgaGRyLT52Mi5udW1fYnl0ZXMpOwogCiAJbWVtY29uc29sZV9sZW5ndGggPSBoZHItPnYyLmVuZCAtIGhkci0+djIuc3RhcnQ7Ci0JbWVtY29uc29sZV9iYXNlYWRkciA9IHBoeXNfdG9fdmlydChoZHItPnYyLmJ1ZmZlcl9hZGRyCi0JCQkJCSAgICsgaGRyLT52Mi5zdGFydCk7CisJbWVtY29uc29sZV9iYXNlYWRkciA9IGhkci0+djIuYnVmZmVyX2FkZHIgKyBoZHItPnYyLnN0YXJ0OwogfQogCiAvKgogICogU2VhcmNoIHRocm91Z2ggdGhlIEVCREEgZm9yIHRoZSBCSU9TIE1lbW9yeSBDb25zb2xlLCBhbmQKICAqIHNldCB0aGUgZ2xvYmFsIHZhcmlhYmxlcyB0byBwb2ludCB0byBpdC4gIFJldHVybiB0cnVlIGlmIGZvdW5kLgogICovCi1zdGF0aWMgYm9vbCBmb3VuZF9tZW1jb25zb2xlKHZvaWQpCitzdGF0aWMgYm9vbCBfX2luaXQgZm91bmRfbWVtY29uc29sZSh2b2lkKQogewogCXVuc2lnbmVkIGludCBhZGRyZXNzOwogCXNpemVfdCBsZW5ndGgsIGN1cjsKIAogCWFkZHJlc3MgPSBnZXRfYmlvc19lYmRhKCk7CiAJaWYgKCFhZGRyZXNzKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkJJT1MgRUJEQSBub24tZXhpc3RlbnQuXG4iKTsKKwkJcHJfaW5mbygiQklPUyBFQkRBIG5vbi1leGlzdGVudC5cbiIpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC0xMjIsNyArMTMyLDcgQEAKIAkJfQogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIkJJT1MgY29uc29sZSBFQkRBIHN0cnVjdHVyZSBub3QgZm91bmQhXG4iKTsKKwlwcl9pbmZvKCJCSU9TIGNvbnNvbGUgRUJEQSBzdHJ1Y3R1cmUgbm90IGZvdW5kIVxuIik7CiAJcmV0dXJuIGZhbHNlOwogfQogCkBAIC0xMzksOCArMTQ5LDYgQEAKIAogc3RhdGljIGludCBfX2luaXQgbWVtY29uc29sZV9pbml0KHZvaWQpCiB7Ci0JaW50IHJldDsKLQogCWlmICghZG1pX2NoZWNrX3N5c3RlbShtZW1jb25zb2xlX2RtaV90YWJsZSkpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC0xNDgsMTAgKzE1Niw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJbWVtY29uc29sZV9iaW5fYXR0ci5zaXplID0gbWVtY29uc29sZV9sZW5ndGg7Ci0KLQlyZXQgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoZmlybXdhcmVfa29iaiwgJm1lbWNvbnNvbGVfYmluX2F0dHIpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKGZpcm13YXJlX2tvYmosICZtZW1jb25zb2xlX2Jpbl9hdHRyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG1lbWNvbnNvbGVfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mbWMvZm1jLWNvcmUuYyBiL2RyaXZlcnMvZm1jL2ZtYy1jb3JlLmMKaW5kZXggMjRkNTI0OS4uMzUzZmM1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9mbWMvZm1jLWNvcmUuYworKysgYi9kcml2ZXJzL2ZtYy9mbWMtY29yZS5jCkBAIC05OSwxMCArOTksMjMgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGZtY193cml0ZV9lZXByb20oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGZtY19kZXZpY2UgKmZtYzsKKworCWRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlmbWMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgZm1jX2RldmljZSwgZGV2KTsKKwlyZXR1cm4gZm1jLT5vcC0+d3JpdGVfZWUoZm1jLCBvZmYsIGJ1ZiwgY291bnQpOworfQorCiBzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgZm1jX2VlcHJvbV9hdHRyID0gewotCS5hdHRyID0geyAubmFtZSA9ICJlZXByb20iLCAubW9kZSA9IFNfSVJVR08sIH0sCisJLmF0dHIgPSB7IC5uYW1lID0gImVlcHJvbSIsIC5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IsIH0sCiAJLnNpemUgPSA4MTkyLCAvKiBtb3JlIG9yIGxlc3Mgc3RhbmRhcmQgKi8KIAkucmVhZCA9IGZtY19yZWFkX2VlcHJvbSwKKwkud3JpdGUgPSBmbWNfd3JpdGVfZWVwcm9tLAogfTsKIAogLyoKQEAgLTE1NCw3ICsxNjcsNyBAQAogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmIChmbWMtPmZsYWdzID09IEZNQ19ERVZJQ0VfTk9fTUVaWkFOSU5FKSB7CisJCWlmIChmbWMtPmZsYWdzICYgRk1DX0RFVklDRV9OT19NRVpaQU5JTkUpIHsKIAkJCWRldl9pbmZvKGZtYy0+aHdkZXYsICJhYnNlbnQgbWV6emFuaW5lIGluIHNsb3QgJWRcbiIsCiAJCQkJIGZtYy0+c2xvdF9pZCk7CiAJCQljb250aW51ZTsKQEAgLTE4OSw5ICsyMDIsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKIAkJZm1jID0gZGV2YXJyYXlbaV07CiAKLQkJaWYgKGZtYy0+ZmxhZ3MgPT0gRk1DX0RFVklDRV9OT19NRVpaQU5JTkUpCi0JCQljb250aW51ZTsgLyogZGV2X2luZm8gYWxyZWFkeSBkb25lIGFib3ZlICovCi0KIAkJZm1jLT5ucl9zbG90cyA9IG47IC8qIGVhY2ggc2xvdCBtdXN0IGtub3cgaG93IG1hbnkgYXJlIHRoZXJlICovCiAJCWZtYy0+ZGV2YXJyYXkgPSBkZXZhcnJheTsKIApAQCAtMjYzLDggKzI3Myw2IEBACiAJa2ZyZWUoZGV2c1swXS0+ZGV2YXJyYXkpOwogCiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlpZiAoZGV2c1tpXS0+ZmxhZ3MgPT0gRk1DX0RFVklDRV9OT19NRVpaQU5JTkUpCi0JCQljb250aW51ZTsKIAkJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZkZXZzW2ldLT5kZXYua29iaiwgJmZtY19lZXByb21fYXR0cik7CiAJCWRldmljZV9kZWwoJmRldnNbaV0tPmRldik7CiAJCWZtY19mcmVlX2lkX2luZm8oZGV2c1tpXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZtYy9mbWMtc2RiLmMgYi9kcml2ZXJzL2ZtYy9mbWMtc2RiLmMKaW5kZXggNzlhZGMzOS4uNDYwM2ZkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9mbWMvZm1jLXNkYi5jCisrKyBiL2RyaXZlcnMvZm1jL2ZtYy1zZGIuYwpAQCAtMTUwLDIzICsxNTAsMzYgQEAKIH0KIEVYUE9SVF9TWU1CT0woZm1jX3JlcHJvZ3JhbSk7CiAKK3N0YXRpYyBjaGFyICpfX3N0cmlwX3RyYWlsaW5nX3NwYWNlKGNoYXIgKmJ1ZiwgY2hhciAqc3RyLCBpbnQgbGVuKQoreworCWludCBpID0gbGVuIC0gMTsKKworCW1lbWNweShidWYsIHN0ciwgbGVuKTsKKwl3aGlsZShpID49IDAgJiYgYnVmW2ldID09ICcgJykKKwkJYnVmW2ktLV0gPSAnXDAnOworCXJldHVybiBidWY7Cit9CisKKyNkZWZpbmUgX19zZGJfc3RyaW5nKGJ1ZiwgZmllbGQpICh7CQkJXAorCUJVSUxEX0JVR19PTihzaXplb2YoYnVmKSA8IHNpemVvZihmaWVsZCkpOwlcCisJX19zdHJpcF90cmFpbGluZ19zcGFjZShidWYsICh2b2lkICopKGZpZWxkKSwgc2l6ZW9mKGZpZWxkKSk7CVwKKwkJfSkKKwogc3RhdGljIHZvaWQgX19mbWNfc2hvd19zZGJfdHJlZShjb25zdCBzdHJ1Y3QgZm1jX2RldmljZSAqZm1jLAogCQkJCWNvbnN0IHN0cnVjdCBzZGJfYXJyYXkgKmFycikKIHsKKwl1bnNpZ25lZCBsb25nIGJhc2UgPSBhcnItPmJhc2VhZGRyOwogCWludCBpLCBqLCBuID0gYXJyLT5sZW4sIGxldmVsID0gYXJyLT5sZXZlbDsKLQljb25zdCBzdHJ1Y3Qgc2RiX2FycmF5ICphcDsKKwljaGFyIGJ1Zls2NF07CiAKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgYmFzZTsKIAkJdW5pb24gIHNkYl9yZWNvcmQgKnI7CiAJCXN0cnVjdCBzZGJfcHJvZHVjdCAqcDsKIAkJc3RydWN0IHNkYl9jb21wb25lbnQgKmM7CiAJCXIgPSAmYXJyLT5yZWNvcmRbaV07CiAJCWMgPSAmci0+ZGV2LnNkYl9jb21wb25lbnQ7CiAJCXAgPSAmYy0+cHJvZHVjdDsKLQkJYmFzZSA9IDA7Ci0JCWZvciAoYXAgPSBhcnI7IGFwOyBhcCA9IGFwLT5wYXJlbnQpCi0JCQliYXNlICs9IGFwLT5iYXNlYWRkcjsKKwogCQlkZXZfaW5mbygmZm1jLT5kZXYsICJTREI6ICIpOwogCiAJCWZvciAoaiA9IDA7IGogPCBsZXZlbDsgaisrKQpAQCAtMTkzLDggKzIwNiw4IEBACiAJCQkgICAgICAgcC0+bmFtZSwKIAkJCSAgICAgICBfX2JlNjRfdG9fY3B1KGMtPmFkZHJfZmlyc3QpICsgYmFzZSk7CiAJCQlpZiAoSVNfRVJSKGFyci0+c3VidHJlZVtpXSkpIHsKLQkJCQlwcmludGsoS0VSTl9DT05UICIoYnJpZGdlIGVycm9yICVsaSlcbiIsCi0JCQkJICAgICAgIFBUUl9FUlIoYXJyLT5zdWJ0cmVlW2ldKSk7CisJCQkJZGV2X2luZm8oJmZtYy0+ZGV2LCAiU0RCOiAoYnJpZGdlIGVycm9yICVsaSlcbiIsCisJCQkJCSBQVFJfRVJSKGFyci0+c3VidHJlZVtpXSkpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJX19mbWNfc2hvd19zZGJfdHJlZShmbWMsIGFyci0+c3VidHJlZVtpXSk7CkBAIC0yMDMsMTAgKzIxNiwyMCBAQAogCQkJcHJpbnRrKEtFUk5fQ09OVCAiaW50ZWdyYXRpb25cbiIpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc2RiX3R5cGVfcmVwb191cmw6Ci0JCQlwcmludGsoS0VSTl9DT05UICJyZXBvLXVybFxuIik7CisJCQlwcmludGsoS0VSTl9DT05UICJTeW50aGVzaXMgcmVwb3NpdG9yeTogJXNcbiIsCisJCQkgICAgICAgX19zZGJfc3RyaW5nKGJ1Ziwgci0+cmVwb191cmwucmVwb191cmwpKTsKIAkJCWJyZWFrOwogCQljYXNlIHNkYl90eXBlX3N5bnRoZXNpczoKLQkJCXByaW50ayhLRVJOX0NPTlQgInN5bnRoZXNpcy1pbmZvXG4iKTsKKwkJCXByaW50ayhLRVJOX0NPTlQgIkJpdHN0cmVhbSAnJXMnICIsCisJCQkgICAgICAgX19zZGJfc3RyaW5nKGJ1Ziwgci0+c3ludGhlc2lzLnN5bl9uYW1lKSk7CisJCQlwcmludGsoS0VSTl9DT05UICJzeW50aGVzaXplZCAlMDh4IGJ5ICVzICIsCisJCQkgICAgICAgX19iZTMyX3RvX2NwdShyLT5zeW50aGVzaXMuZGF0ZSksCisJCQkgICAgICAgX19zZGJfc3RyaW5nKGJ1Ziwgci0+c3ludGhlc2lzLnVzZXJfbmFtZSkpOworCQkJcHJpbnRrKEtFUk5fQ09OVCAiKCVzIHZlcnNpb24gJXgpLCAiLAorCQkJICAgICAgIF9fc2RiX3N0cmluZyhidWYsIHItPnN5bnRoZXNpcy50b29sX25hbWUpLAorCQkJICAgICAgIF9fYmUzMl90b19jcHUoci0+c3ludGhlc2lzLnRvb2xfdmVyc2lvbikpOworCQkJcHJpbnRrKEtFUk5fQ09OVCAiY29tbWl0ICVwbVxuIiwKKwkJCSAgICAgICByLT5zeW50aGVzaXMuY29tbWl0X2lkKTsKIAkJCWJyZWFrOwogCQljYXNlIHNkYl90eXBlX2VtcHR5OgogCQkJcHJpbnRrKEtFUk5fQ09OVCAiZW1wdHlcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYwppbmRleCA3ZjJhZjlhLi4zMDkwMjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYwpAQCAtMzE5LDcgKzMxOSw4IEBACiAJCQlwY2lfZGV2X3B1dChwY2lfZGV2KTsKIAkJfQogCQlpZiAoIWRldi0+aG9zZSkgewotCQkJc3RydWN0IHBjaV9idXMgKmIgPSBwY2lfYnVzX2IocGNpX3Jvb3RfYnVzZXMubmV4dCk7CisJCQlzdHJ1Y3QgcGNpX2J1cyAqYiA9IGxpc3RfZW50cnkocGNpX3Jvb3RfYnVzZXMubmV4dCwKKwkJCQlzdHJ1Y3QgcGNpX2J1cywgbm9kZSk7CiAJCQlpZiAoYikKIAkJCQlkZXYtPmhvc2UgPSBiLT5zeXNkYXRhOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3ByaW1lLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3ByaW1lLmMKaW5kZXggNTY4MDVjMy4uYmI1MTZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9wcmltZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcHJpbWUuYwpAQCAtNDcxLDcgKzQ3MSw3IEBACiAJZ2V0X2RtYV9idWYoZG1hX2J1Zik7CiAKIAlzZ3QgPSBkbWFfYnVmX21hcF9hdHRhY2htZW50KGF0dGFjaCwgRE1BX0JJRElSRUNUSU9OQUwpOwotCWlmIChJU19FUlJfT1JfTlVMTChzZ3QpKSB7CisJaWYgKElTX0VSUihzZ3QpKSB7CiAJCXJldCA9IFBUUl9FUlIoc2d0KTsKIAkJZ290byBmYWlsX2RldGFjaDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZG1hYnVmLmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZG1hYnVmLmMKaW5kZXggNTk4MjdjYy4uYzc4NmNkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2RtYWJ1Zi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kbWFidWYuYwpAQCAtMjI0LDcgKzIyNCw3IEBACiAJZ2V0X2RtYV9idWYoZG1hX2J1Zik7CiAKIAlzZ3QgPSBkbWFfYnVmX21hcF9hdHRhY2htZW50KGF0dGFjaCwgRE1BX0JJRElSRUNUSU9OQUwpOwotCWlmIChJU19FUlJfT1JfTlVMTChzZ3QpKSB7CisJaWYgKElTX0VSUihzZ3QpKSB7CiAJCXJldCA9IFBUUl9FUlIoc2d0KTsKIAkJZ290byBlcnJfYnVmX2RldGFjaDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL0tjb25maWcKaW5kZXggNTA4Y2Y5OS4uMTdmOTI4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvS2NvbmZpZwpAQCAtMTAsNyArMTAsNiBAQAogCSMgR01BNTAwIGRlcGVuZHMgb24gQUNQSV9WSURFTyB3aGVuIEFDUEkgaXMgZW5hYmxlZCwganVzdCBsaWtlIGk5MTUKIAlzZWxlY3QgQUNQSV9WSURFTyBpZiBBQ1BJCiAJc2VsZWN0IEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UgaWYgQUNQSQotCXNlbGVjdCBWSURFT19PVVRQVVRfQ09OVFJPTCBpZiBBQ1BJCiAJc2VsZWN0IElOUFVUIGlmIEFDUEkKIAloZWxwCiAJICBTYXkgeWVzIGZvciBhbiBleHBlcmltZW50YWwgMkQgS01TIGZyYW1lYnVmZmVyIGRyaXZlciBmb3IgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL21tdS5jIGIvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9tbXUuYwppbmRleCA0OWJhYzQxLi5jM2U2N2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL21tdS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvbW11LmMKQEAgLTUyMCw3ICs1MjAsNyBAQAogCiAJZHJpdmVyLT5oYXNfY2xmbHVzaCA9IDA7CiAKLQlpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0NMRkxTSCkpIHsKKwlpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0NMRkxVU0gpKSB7CiAJCXVpbnQzMl90IHRmbXMsIG1pc2MsIGNhcDAsIGNhcDQsIGNsZmx1c2hfc2l6ZTsKIAogCQkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L0tjb25maWcKaW5kZXggNzNlZDU5ZS4uYmVhMmQ2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9LY29uZmlnCkBAIC0xNCw3ICsxNCw2IEBACiAJIyBidXQgZm9yIHNlbGVjdCB0byB3b3JrLCBuZWVkIHRvIHNlbGVjdCBBQ1BJX1ZJREVPJ3MgZGVwZW5kZW5jaWVzLCBpY2sKIAlzZWxlY3QgQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlmIEFDUEkKIAlzZWxlY3QgQkFDS0xJR0hUX0NMQVNTX0RFVklDRSBpZiBBQ1BJCi0Jc2VsZWN0IFZJREVPX09VVFBVVF9DT05UUk9MIGlmIEFDUEkKIAlzZWxlY3QgSU5QVVQgaWYgQUNQSQogCXNlbGVjdCBBQ1BJX1ZJREVPIGlmIEFDUEkKIAlzZWxlY3QgQUNQSV9CVVRUT04gaWYgQUNQSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L0tjb25maWcKaW5kZXggN2NmNzg3ZC4uNjM3YzI5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9LY29uZmlnCkBAIC0xMSw3ICsxMSw3IEBACiAJc2VsZWN0IEZCCiAJc2VsZWN0IEZSQU1FQlVGRkVSX0NPTlNPTEUgaWYgIUVYUEVSVAogCXNlbGVjdCBGQl9CQUNLTElHSFQgaWYgRFJNX05PVVZFQVVfQkFDS0xJR0hUCi0Jc2VsZWN0IEFDUElfVklERU8gaWYgQUNQSSAmJiBYODYgJiYgQkFDS0xJR0hUX0NMQVNTX0RFVklDRSAmJiBWSURFT19PVVRQVVRfQ09OVFJPTCAmJiBJTlBVVAorCXNlbGVjdCBBQ1BJX1ZJREVPIGlmIEFDUEkgJiYgWDg2ICYmIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UgJiYgSU5QVVQKIAlzZWxlY3QgWDg2X1BMQVRGT1JNX0RFVklDRVMgaWYgQUNQSSAmJiBYODYKIAlzZWxlY3QgQUNQSV9XTUkgaWYgQUNQSSAmJiBYODYKIAlzZWxlY3QgTVhNX1dNSSBpZiBBQ1BJICYmIFg4NgpAQCAtMTksNyArMTksNiBAQAogCSMgU2ltaWxhciB0byBpOTE1LCB3ZSBuZWVkIHRvIHNlbGVjdCBBQ1BJX1ZJREVPIGFuZCBpdCdzIGRlcGVuZGVuY2llcwogCXNlbGVjdCBCQUNLTElHSFRfTENEX1NVUFBPUlQgaWYgQUNQSSAmJiBYODYKIAlzZWxlY3QgQkFDS0xJR0hUX0NMQVNTX0RFVklDRSBpZiBBQ1BJICYmIFg4NgotCXNlbGVjdCBWSURFT19PVVRQVVRfQ09OVFJPTCBpZiBBQ1BJICYmIFg4NgogCXNlbGVjdCBJTlBVVCBpZiBBQ1BJICYmIFg4NgogCXNlbGVjdCBUSEVSTUFMIGlmIEFDUEkgJiYgWDg2CiAJc2VsZWN0IEFDUElfVklERU8gaWYgQUNQSSAmJiBYODYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCmluZGV4IGNjMzJhNmYuLjI0NDhkNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWNvcmUuYwpAQCAtMjI3OCw2ICsyMjc4LDcgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0lTRUdST1VQLCBVU0JfREVWSUNFX0lEXzFfUEhJREdFVFNFUlZPXzIwKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAsIFVTQl9ERVZJQ0VfSURfOF84XzRfSUZfS0lUKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9ZRUFMSU5LLCBVU0JfREVWSUNFX0lEX1lFQUxJTktfUDFLX1A0S19CMkspIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1JJU09fS0FHQUtVLCBVU0JfREVWSUNFX0lEX1JJX0tBX1dFQk1BSUwpIH0sCiAJeyB9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtaWRzLmggYi9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKaW5kZXggMjJmMjhkNi4uODMwZGU2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWlkcy5oCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1pZHMuaApAQCAtOTYxLDQgKzk2MSw3IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUFJJTUFYX0tFWUJPQVJECTB4NGUwNQogCiAKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9SSVNPX0tBR0FLVQkweDEyOTQJLyogUmlzbyBLYWdha3UgQ29ycC4gKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9SSV9LQV9XRUJNQUlMCTB4MTMyMAkvKiBXZWJtYWlsIE5vdGlmaWVyICovCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXByb2Rpa2V5cy5jIGIvZHJpdmVycy9oaWQvaGlkLXByb2Rpa2V5cy5jCmluZGV4IDdlZDgyODAuLjkxZmFiOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1wcm9kaWtleXMuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcHJvZGlrZXlzLmMKQEAgLTYyNCw3ICs2MjQsOCBAQAogCiAJLyogU2V0dXAgc291bmQgY2FyZCAqLwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwbS0+cGstPmhkZXYtPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwKKwkJCSAgIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJcGtfZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgcGMtbWlkaSBzb3VuZCBjYXJkXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKQEAgLTY2MCw4ICs2NjEsNiBAQAogCXNuZF9yYXdtaWRpX3NldF9vcHMocndtaWRpLCBTTkRSVl9SQVdNSURJX1NUUkVBTV9JTlBVVCwKIAkJJnBjbWlkaV9pbl9vcHMpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcG0tPnBrLT5oZGV2LT5kZXYpOwotCiAJLyogY3JlYXRlIHN5c2ZzIHZhcmlhYmxlcyAqLwogCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmcG0tPnBrLT5oZGV2LT5kZXYsCiAJCQkJIHN5c2ZzX2RldmljZV9hdHRyX2NoYW5uZWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9NYWtlZmlsZSBiL2RyaXZlcnMvaHYvTWFrZWZpbGUKaW5kZXggMGE3NGI1Ni4uNWU0ZGZhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2h2L01ha2VmaWxlCkBAIC01LDQgKzUsNCBAQAogaHZfdm1idXMteSA6PSB2bWJ1c19kcnYubyBcCiAJCSBodi5vIGNvbm5lY3Rpb24ubyBjaGFubmVsLm8gXAogCQkgY2hhbm5lbF9tZ210Lm8gcmluZ19idWZmZXIubwotaHZfdXRpbHMteSA6PSBodl91dGlsLm8gaHZfa3ZwLm8gaHZfc25hcHNob3QubworaHZfdXRpbHMteSA6PSBodl91dGlsLm8gaHZfa3ZwLm8gaHZfc25hcHNob3QubyBodl9mY29weS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L2NoYW5uZWwuYyBiL2RyaXZlcnMvaHYvY2hhbm5lbC5jCmluZGV4IDY5ZWEzNmYuLjYwMmNhODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHYvY2hhbm5lbC5jCisrKyBiL2RyaXZlcnMvaHYvY2hhbm5lbC5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2h5cGVydi5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogCiAjaW5jbHVkZSAiaHlwZXJ2X3ZtYnVzLmgiCiAKQEAgLTU1NCwxNCArNTU1LDE0IEBACiAgKgogICogTWFpbmx5IHVzZWQgYnkgSHlwZXItViBkcml2ZXJzLgogICovCi1pbnQgdm1idXNfc2VuZHBhY2tldChzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCwgY29uc3Qgdm9pZCAqYnVmZmVyLAoraW50IHZtYnVzX3NlbmRwYWNrZXQoc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwsIHZvaWQgKmJ1ZmZlciwKIAkJCSAgIHUzMiBidWZmZXJsZW4sIHU2NCByZXF1ZXN0aWQsCiAJCQkgICBlbnVtIHZtYnVzX3BhY2tldF90eXBlIHR5cGUsIHUzMiBmbGFncykKIHsKIAlzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvciBkZXNjOwogCXUzMiBwYWNrZXRsZW4gPSBzaXplb2Yoc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IpICsgYnVmZmVybGVuOwogCXUzMiBwYWNrZXRsZW5fYWxpZ25lZCA9IEFMSUdOKHBhY2tldGxlbiwgc2l6ZW9mKHU2NCkpOwotCXN0cnVjdCBzY2F0dGVybGlzdCBidWZmZXJsaXN0WzNdOworCXN0cnVjdCBrdmVjIGJ1ZmZlcmxpc3RbM107CiAJdTY0IGFsaWduZWRfZGF0YSA9IDA7CiAJaW50IHJldDsKIAlib29sIHNpZ25hbCA9IGZhbHNlOwpAQCAtNTc1LDExICs1NzYsMTIgQEAKIAlkZXNjLmxlbjggPSAodTE2KShwYWNrZXRsZW5fYWxpZ25lZCA+PiAzKTsKIAlkZXNjLnRyYW5zX2lkID0gcmVxdWVzdGlkOwogCi0Jc2dfaW5pdF90YWJsZShidWZmZXJsaXN0LCAzKTsKLQlzZ19zZXRfYnVmKCZidWZmZXJsaXN0WzBdLCAmZGVzYywgc2l6ZW9mKHN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yKSk7Ci0Jc2dfc2V0X2J1ZigmYnVmZmVybGlzdFsxXSwgYnVmZmVyLCBidWZmZXJsZW4pOwotCXNnX3NldF9idWYoJmJ1ZmZlcmxpc3RbMl0sICZhbGlnbmVkX2RhdGEsCi0JCSAgIHBhY2tldGxlbl9hbGlnbmVkIC0gcGFja2V0bGVuKTsKKwlidWZmZXJsaXN0WzBdLmlvdl9iYXNlID0gJmRlc2M7CisJYnVmZmVybGlzdFswXS5pb3ZfbGVuID0gc2l6ZW9mKHN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yKTsKKwlidWZmZXJsaXN0WzFdLmlvdl9iYXNlID0gYnVmZmVyOworCWJ1ZmZlcmxpc3RbMV0uaW92X2xlbiA9IGJ1ZmZlcmxlbjsKKwlidWZmZXJsaXN0WzJdLmlvdl9iYXNlID0gJmFsaWduZWRfZGF0YTsKKwlidWZmZXJsaXN0WzJdLmlvdl9sZW4gPSAocGFja2V0bGVuX2FsaWduZWQgLSBwYWNrZXRsZW4pOwogCiAJcmV0ID0gaHZfcmluZ2J1ZmZlcl93cml0ZSgmY2hhbm5lbC0+b3V0Ym91bmQsIGJ1ZmZlcmxpc3QsIDMsICZzaWduYWwpOwogCkBAIC02MDUsNyArNjA3LDcgQEAKIAl1MzIgZGVzY3NpemU7CiAJdTMyIHBhY2tldGxlbjsKIAl1MzIgcGFja2V0bGVuX2FsaWduZWQ7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0IGJ1ZmZlcmxpc3RbM107CisJc3RydWN0IGt2ZWMgYnVmZmVybGlzdFszXTsKIAl1NjQgYWxpZ25lZF9kYXRhID0gMDsKIAlib29sIHNpZ25hbCA9IGZhbHNlOwogCkBAIC02MzcsMTEgKzYzOSwxMiBAQAogCQlkZXNjLnJhbmdlW2ldLnBmbgkgPSBwYWdlYnVmZmVyc1tpXS5wZm47CiAJfQogCi0Jc2dfaW5pdF90YWJsZShidWZmZXJsaXN0LCAzKTsKLQlzZ19zZXRfYnVmKCZidWZmZXJsaXN0WzBdLCAmZGVzYywgZGVzY3NpemUpOwotCXNnX3NldF9idWYoJmJ1ZmZlcmxpc3RbMV0sIGJ1ZmZlciwgYnVmZmVybGVuKTsKLQlzZ19zZXRfYnVmKCZidWZmZXJsaXN0WzJdLCAmYWxpZ25lZF9kYXRhLAotCQlwYWNrZXRsZW5fYWxpZ25lZCAtIHBhY2tldGxlbik7CisJYnVmZmVybGlzdFswXS5pb3ZfYmFzZSA9ICZkZXNjOworCWJ1ZmZlcmxpc3RbMF0uaW92X2xlbiA9IGRlc2NzaXplOworCWJ1ZmZlcmxpc3RbMV0uaW92X2Jhc2UgPSBidWZmZXI7CisJYnVmZmVybGlzdFsxXS5pb3ZfbGVuID0gYnVmZmVybGVuOworCWJ1ZmZlcmxpc3RbMl0uaW92X2Jhc2UgPSAmYWxpZ25lZF9kYXRhOworCWJ1ZmZlcmxpc3RbMl0uaW92X2xlbiA9IChwYWNrZXRsZW5fYWxpZ25lZCAtIHBhY2tldGxlbik7CiAKIAlyZXQgPSBodl9yaW5nYnVmZmVyX3dyaXRlKCZjaGFubmVsLT5vdXRib3VuZCwgYnVmZmVybGlzdCwgMywgJnNpZ25hbCk7CiAKQEAgLTY2NSw3ICs2NjgsNyBAQAogCXUzMiBkZXNjc2l6ZTsKIAl1MzIgcGFja2V0bGVuOwogCXUzMiBwYWNrZXRsZW5fYWxpZ25lZDsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgYnVmZmVybGlzdFszXTsKKwlzdHJ1Y3Qga3ZlYyBidWZmZXJsaXN0WzNdOwogCXU2NCBhbGlnbmVkX2RhdGEgPSAwOwogCWJvb2wgc2lnbmFsID0gZmFsc2U7CiAJdTMyIHBmbmNvdW50ID0gTlVNX1BBR0VTX1NQQU5ORUQobXVsdGlfcGFnZWJ1ZmZlci0+b2Zmc2V0LApAQCAtNzAwLDExICs3MDMsMTIgQEAKIAltZW1jcHkoZGVzYy5yYW5nZS5wZm5fYXJyYXksIG11bHRpX3BhZ2VidWZmZXItPnBmbl9hcnJheSwKIAkgICAgICAgcGZuY291bnQgKiBzaXplb2YodTY0KSk7CiAKLQlzZ19pbml0X3RhYmxlKGJ1ZmZlcmxpc3QsIDMpOwotCXNnX3NldF9idWYoJmJ1ZmZlcmxpc3RbMF0sICZkZXNjLCBkZXNjc2l6ZSk7Ci0Jc2dfc2V0X2J1ZigmYnVmZmVybGlzdFsxXSwgYnVmZmVyLCBidWZmZXJsZW4pOwotCXNnX3NldF9idWYoJmJ1ZmZlcmxpc3RbMl0sICZhbGlnbmVkX2RhdGEsCi0JCXBhY2tldGxlbl9hbGlnbmVkIC0gcGFja2V0bGVuKTsKKwlidWZmZXJsaXN0WzBdLmlvdl9iYXNlID0gJmRlc2M7CisJYnVmZmVybGlzdFswXS5pb3ZfbGVuID0gZGVzY3NpemU7CisJYnVmZmVybGlzdFsxXS5pb3ZfYmFzZSA9IGJ1ZmZlcjsKKwlidWZmZXJsaXN0WzFdLmlvdl9sZW4gPSBidWZmZXJsZW47CisJYnVmZmVybGlzdFsyXS5pb3ZfYmFzZSA9ICZhbGlnbmVkX2RhdGE7CisJYnVmZmVybGlzdFsyXS5pb3ZfbGVuID0gKHBhY2tldGxlbl9hbGlnbmVkIC0gcGFja2V0bGVuKTsKIAogCXJldCA9IGh2X3JpbmdidWZmZXJfd3JpdGUoJmNoYW5uZWwtPm91dGJvdW5kLCBidWZmZXJsaXN0LCAzLCAmc2lnbmFsKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9odl9iYWxsb29uLmMgYi9kcml2ZXJzL2h2L2h2X2JhbGxvb24uYwppbmRleCA3ZTE3YTU0Li43ZTZkNzhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L2h2X2JhbGxvb24uYworKysgYi9kcml2ZXJzL2h2L2h2X2JhbGxvb24uYwpAQCAtMTE3MSw3ICsxMTcxLDggQEAKIAlpbnQgdDsKIAogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmRtX2RldmljZS5jb25maWdfZXZlbnQsIDEqSFopOworCQl0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisJCQkJCQkmZG1fZGV2aWNlLmNvbmZpZ19ldmVudCwgMSpIWik7CiAJCS8qCiAJCSAqIFRoZSBob3N0IGV4cGVjdHMgdXMgdG8gcG9zdCBpbmZvcm1hdGlvbiBvbiB0aGUgbWVtb3J5CiAJCSAqIHByZXNzdXJlIGV2ZXJ5IHNlY29uZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvaHZfZmNvcHkuYyBiL2RyaXZlcnMvaHYvaHZfZmNvcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWFhM2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9odi9odl9mY29weS5jCkBAIC0wLDAgKzEsNDE0IEBACisvKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgZmlsZSBjb3B5IHNlcnZpY2UuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0LCBNaWNyb3NvZnQsIEluYy4KKyAqCisgKiBBdXRob3IgOiBLLiBZLiBTcmluaXZhc2FuIDxrc3Jpbml2YXNhbkBub3ZlbGwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaHlwZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorCisjaW5jbHVkZSAiaHlwZXJ2X3ZtYnVzLmgiCisKKyNkZWZpbmUgV0lOOF9TUlZfTUFKT1IJCTEKKyNkZWZpbmUgV0lOOF9TUlZfTUlOT1IJCTEKKyNkZWZpbmUgV0lOOF9TUlZfVkVSU0lPTgkoV0lOOF9TUlZfTUFKT1IgPDwgMTYgfCBXSU44X1NSVl9NSU5PUikKKworLyoKKyAqIEdsb2JhbCBzdGF0ZSBtYWludGFpbmVkIGZvciB0cmFuc2FjdGlvbiB0aGF0IGlzIGJlaW5nIHByb2Nlc3NlZC4KKyAqIEZvciBhIGNsYXNzIG9mIGludGVncmF0aW9uIHNlcnZpY2VzLCBpbmNsdWRpbmcgdGhlICJmaWxlIGNvcHkgc2VydmljZSIsCisgKiB0aGUgc3BlY2lmaWVkIHByb3RvY29sIGlzIGEgInJlcXVlc3QvcmVzcG9uc2UiIHByb3RvY29sIHdoaWNoIG1lYW5zIHRoYXQKKyAqIHRoZXJlIGNhbiBvbmx5IGJlIHNpbmdsZSBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbiBmcm9tIHRoZSBob3N0IGF0IGFueQorICogZ2l2ZW4gcG9pbnQgaW4gdGltZS4gV2UgdXNlIHRoaXMgdG8gc2ltcGxpZnkgbWVtb3J5IG1hbmFnZW1lbnQgaW4gdGhpcworICogZHJpdmVyIC0gd2UgY2FjaGUgYW5kIHByb2Nlc3Mgb25seSBvbmUgbWVzc2FnZSBhdCBhIHRpbWUuCisgKgorICogV2hpbGUgdGhlIHJlcXVlc3QvcmVzcG9uc2UgcHJvdG9jb2wgaXMgZ3VhcmFudGVlZCBieSB0aGUgaG9zdCwgd2UgZnVydGhlcgorICogZW5zdXJlIHRoaXMgYnkgc2VyaWFsaXppbmcgcGFja2V0IHByb2Nlc3NpbmcgaW4gdGhpcyBkcml2ZXIgLSB3ZSBkbyBub3QKKyAqIHJlYWQgYWRkaXRpb25hbCBwYWNrZXRzIGZyb20gdGhlIFZNQlVzIHVudGlsIHRoZSBjdXJyZW50IHBhY2tldCBpcyBmdWxseQorICogaGFuZGxlZC4KKyAqCisgKiBUaGUgdHJhbnNhY3Rpb24gImFjdGl2ZSIgc3RhdGUgaXMgc2V0IHdoZW4gd2UgcmVjZWl2ZSBhIHJlcXVlc3QgZnJvbSB0aGUKKyAqIGhvc3QgYW5kIHdlIGNsZWFudXAgdGhpcyBzdGF0ZSB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZWQgLSB3aGVuIHdlCisgKiByZXNwb25kIHRvIHRoZSBob3N0IHdpdGggb3VyIHJlc3BvbnNlLiBXaGVuIHRoZSB0cmFuc2FjdGlvbiBhY3RpdmUgc3RhdGUgaXMKKyAqIHNldCwgd2UgZGVmZXIgaGFuZGxpbmcgaW5jb21pbmcgcGFja2V0cy4KKyAqLworCitzdGF0aWMgc3RydWN0IHsKKwlib29sIGFjdGl2ZTsgLyogdHJhbnNhY3Rpb24gc3RhdHVzIC0gYWN0aXZlIG9yIG5vdCAqLworCWludCByZWN2X2xlbjsgLyogbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLiAqLworCXN0cnVjdCBodl9mY29weV9oZHIgICpmY29weV9tc2c7IC8qIGN1cnJlbnQgbWVzc2FnZSAqLworCXN0cnVjdCBodl9zdGFydF9mY29weSAgbWVzc2FnZTsgLyogIHNlbnQgdG8gZGFlbW9uICovCisJc3RydWN0IHZtYnVzX2NoYW5uZWwgKnJlY3ZfY2hhbm5lbDsgLyogY2huIHdlIGdvdCB0aGUgcmVxdWVzdCAqLworCXU2NCByZWN2X3JlcV9pZDsgLyogcmVxdWVzdCBJRC4gKi8KKwl2b2lkICpmY29weV9jb250ZXh0OyAvKiBmb3IgdGhlIGNoYW5uZWwgY2FsbGJhY2sgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIHJlYWRfc2VtYTsKK30gZmNvcHlfdHJhbnNhY3Rpb247CisKK3N0YXRpYyBib29sIG9wZW5lZDsgLyogY3VycmVudGx5IGRldmljZSBvcGVuZWQgKi8KKworLyoKKyAqIEJlZm9yZSB3ZSBjYW4gYWNjZXB0IGNvcHkgbWVzc2FnZXMgZnJvbSB0aGUgaG9zdCwgd2UgbmVlZAorICogdG8gaGFuZHNoYWtlIHdpdGggdGhlIHVzZXIgbGV2ZWwgZGFlbW9uLiBUaGlzIHN0YXRlIHRyYWNrcworICogaWYgd2UgYXJlIGluIHRoZSBoYW5kc2hha2UgcGhhc2UuCisgKi8KK3N0YXRpYyBib29sIGluX2hhbmRfc2hha2UgPSB0cnVlOworc3RhdGljIHZvaWQgZmNvcHlfc2VuZF9kYXRhKHZvaWQpOworc3RhdGljIHZvaWQgZmNvcHlfcmVzcG9uZF90b19ob3N0KGludCBlcnJvcik7CitzdGF0aWMgdm9pZCBmY29weV93b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICpkdW1teSk7CitzdGF0aWMgREVDTEFSRV9ERUxBWUVEX1dPUksoZmNvcHlfd29yaywgZmNvcHlfd29ya19mdW5jKTsKK3N0YXRpYyB1OCAqcmVjdl9idWZmZXI7CisKK3N0YXRpYyB2b2lkIGZjb3B5X3dvcmtfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmR1bW15KQoreworCS8qCisJICogSWYgdGhlIHRpbWVyIGZpcmVzLCB0aGUgdXNlci1tb2RlIGNvbXBvbmVudCBoYXMgbm90IHJlc3BvbmRlZDsKKwkgKiBwcm9jZXNzIHRoZSBwZW5kaW5nIHRyYW5zYWN0aW9uLgorCSAqLworCWZjb3B5X3Jlc3BvbmRfdG9faG9zdChIVl9FX0ZBSUwpOworfQorCitzdGF0aWMgaW50IGZjb3B5X2hhbmRsZV9oYW5kc2hha2UodTMyIHZlcnNpb24pCit7CisJc3dpdGNoICh2ZXJzaW9uKSB7CisJY2FzZSBGQ09QWV9DVVJSRU5UX1ZFUlNJT046CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qCisJCSAqIEZvciBub3cgd2Ugd2lsbCBmYWlsIHRoZSByZWdpc3RyYXRpb24uCisJCSAqIElmIGFuZCB3aGVuIHdlIGhhdmUgbXVsdGlwbGUgdmVyc2lvbnMgdG8KKwkJICogZGVhbCB3aXRoLCB3ZSB3aWxsIGJlIGJhY2t3YXJkIGNvbXBhdGlibGUuCisJCSAqIFdlIHdpbGwgYWRkIHRoaXMgY29kZSB3aGVuIG5lZWRlZC4KKwkJICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcl9pbmZvKCJGQ1A6IHVzZXItbW9kZSByZWdpc3RlcmluZyBkb25lLiBEYWVtb24gdmVyc2lvbjogJWRcbiIsCisJCXZlcnNpb24pOworCWZjb3B5X3RyYW5zYWN0aW9uLmFjdGl2ZSA9IGZhbHNlOworCWlmIChmY29weV90cmFuc2FjdGlvbi5mY29weV9jb250ZXh0KQorCQlodl9mY29weV9vbmNoYW5uZWxjYWxsYmFjayhmY29weV90cmFuc2FjdGlvbi5mY29weV9jb250ZXh0KTsKKwlpbl9oYW5kX3NoYWtlID0gZmFsc2U7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZjb3B5X3NlbmRfZGF0YSh2b2lkKQoreworCXN0cnVjdCBodl9zdGFydF9mY29weSAqc21zZ19vdXQgPSAmZmNvcHlfdHJhbnNhY3Rpb24ubWVzc2FnZTsKKwlpbnQgb3BlcmF0aW9uID0gZmNvcHlfdHJhbnNhY3Rpb24uZmNvcHlfbXNnLT5vcGVyYXRpb247CisJc3RydWN0IGh2X3N0YXJ0X2Zjb3B5ICpzbXNnX2luOworCisJLyoKKwkgKiBUaGUgIHN0cmluZ3Mgc2VudCBmcm9tIHRoZSBob3N0IGFyZSBlbmNvZGVkIGluCisJICogaW4gdXRmMTY7IGNvbnZlcnQgaXQgdG8gdXRmOCBzdHJpbmdzLgorCSAqIFRoZSBob3N0IGFzc3VyZXMgdXMgdGhhdCB0aGUgdXRmMTYgc3RyaW5ncyB3aWxsIG5vdCBleGNlZWQKKwkgKiB0aGUgbWF4IGxlbmd0aHMgc3BlY2lmaWVkLiBXZSB3aWxsIGhvd2V2ZXIsIHJlc2VydmUgcm9vbQorCSAqIGZvciB0aGUgc3RyaW5nIHRlcm1pbmF0aW5nIGNoYXJhY3RlciAtIGluIHRoZSB1dGYxNnNfdXRmOHMoKQorCSAqIGZ1bmN0aW9uIHdlIGxpbWl0IHRoZSBzaXplIG9mIHRoZSBidWZmZXIgd2hlcmUgdGhlIGNvbnZlcnRlZAorCSAqIHN0cmluZyBpcyBwbGFjZWQgdG8gV19NQVhfUEFUSCAtMSB0byBndWFyYW50ZWUKKwkgKiB0aGF0IHRoZSBzdHJpbmdzIGNhbiBiZSBwcm9wZXJseSB0ZXJtaW5hdGVkIQorCSAqLworCisJc3dpdGNoIChvcGVyYXRpb24pIHsKKwljYXNlIFNUQVJUX0ZJTEVfQ09QWToKKwkJbWVtc2V0KHNtc2dfb3V0LCAwLCBzaXplb2Yoc3RydWN0IGh2X3N0YXJ0X2Zjb3B5KSk7CisJCXNtc2dfb3V0LT5oZHIub3BlcmF0aW9uID0gb3BlcmF0aW9uOworCQlzbXNnX2luID0gKHN0cnVjdCBodl9zdGFydF9mY29weSAqKWZjb3B5X3RyYW5zYWN0aW9uLmZjb3B5X21zZzsKKworCQl1dGYxNnNfdG9fdXRmOHMoKHdjaGFyX3QgKilzbXNnX2luLT5maWxlX25hbWUsIFdfTUFYX1BBVEgsCisJCQkJVVRGMTZfTElUVExFX0VORElBTiwKKwkJCQkoX191OCAqKXNtc2dfb3V0LT5maWxlX25hbWUsIFdfTUFYX1BBVEggLSAxKTsKKworCQl1dGYxNnNfdG9fdXRmOHMoKHdjaGFyX3QgKilzbXNnX2luLT5wYXRoX25hbWUsIFdfTUFYX1BBVEgsCisJCQkJVVRGMTZfTElUVExFX0VORElBTiwKKwkJCQkoX191OCAqKXNtc2dfb3V0LT5wYXRoX25hbWUsIFdfTUFYX1BBVEggLSAxKTsKKworCQlzbXNnX291dC0+Y29weV9mbGFncyA9IHNtc2dfaW4tPmNvcHlfZmxhZ3M7CisJCXNtc2dfb3V0LT5maWxlX3NpemUgPSBzbXNnX2luLT5maWxlX3NpemU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXVwKCZmY29weV90cmFuc2FjdGlvbi5yZWFkX3NlbWEpOworCXJldHVybjsKK30KKworLyoKKyAqIFNlbmQgYSByZXNwb25zZSBiYWNrIHRvIHRoZSBob3N0LgorICovCisKK3N0YXRpYyB2b2lkCitmY29weV9yZXNwb25kX3RvX2hvc3QoaW50IGVycm9yKQoreworCXN0cnVjdCBpY21zZ19oZHIgKmljbXNnaGRyOworCXUzMiBidWZfbGVuOworCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsOworCXU2NCByZXFfaWQ7CisKKwkvKgorCSAqIENvcHkgdGhlIGdsb2JhbCBzdGF0ZSBmb3IgY29tcGxldGluZyB0aGUgdHJhbnNhY3Rpb24uIE5vdGUgdGhhdAorCSAqIG9ubHkgb25lIHRyYW5zYWN0aW9uIGNhbiBiZSBhY3RpdmUgYXQgYSB0aW1lLiBUaGlzIGlzIGd1YXJhbnRlZWQKKwkgKiBieSB0aGUgZmlsZSBjb3B5IHByb3RvY29sIGltcGxlbWVudGVkIGJ5IHRoZSBob3N0LiBGdXJ0aGVybW9yZSwKKwkgKiB0aGUgInRyYW5zYWN0aW9uIGFjdGl2ZSIgc3RhdGUgd2UgbWFpbnRhaW4gZW5zdXJlcyB0aGF0IHRoZXJlIGNhbgorCSAqIG9ubHkgYmUgb25lIGFjdGl2ZSB0cmFuc2FjdGlvbiBhdCBhIHRpbWUuCisJICovCisKKwlidWZfbGVuID0gZmNvcHlfdHJhbnNhY3Rpb24ucmVjdl9sZW47CisJY2hhbm5lbCA9IGZjb3B5X3RyYW5zYWN0aW9uLnJlY3ZfY2hhbm5lbDsKKwlyZXFfaWQgPSBmY29weV90cmFuc2FjdGlvbi5yZWN2X3JlcV9pZDsKKworCWZjb3B5X3RyYW5zYWN0aW9uLmFjdGl2ZSA9IGZhbHNlOworCisJaWNtc2doZHIgPSAoc3RydWN0IGljbXNnX2hkciAqKQorCQkJJnJlY3ZfYnVmZmVyW3NpemVvZihzdHJ1Y3Qgdm1idXNwaXBlX2hkcildOworCisJaWYgKGNoYW5uZWwtPm9uY2hhbm5lbF9jYWxsYmFjayA9PSBOVUxMKQorCQkvKgorCQkgKiBXZSBoYXZlIHJhY2VkIHdpdGggdXRpbCBkcml2ZXIgYmVpbmcgdW5sb2FkZWQ7CisJCSAqIHNpbGVudGx5IHJldHVybi4KKwkJICovCisJCXJldHVybjsKKworCWljbXNnaGRyLT5zdGF0dXMgPSBlcnJvcjsKKwlpY21zZ2hkci0+aWNmbGFncyA9IElDTVNHSERSRkxBR19UUkFOU0FDVElPTiB8IElDTVNHSERSRkxBR19SRVNQT05TRTsKKwl2bWJ1c19zZW5kcGFja2V0KGNoYW5uZWwsIHJlY3ZfYnVmZmVyLCBidWZfbGVuLCByZXFfaWQsCisJCQkJVk1fUEtUX0RBVEFfSU5CQU5ELCAwKTsKK30KKwordm9pZCBodl9mY29weV9vbmNoYW5uZWxjYWxsYmFjayh2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsID0gY29udGV4dDsKKwl1MzIgcmVjdmxlbjsKKwl1NjQgcmVxdWVzdGlkOworCXN0cnVjdCBodl9mY29weV9oZHIgKmZjb3B5X21zZzsKKwlzdHJ1Y3QgaWNtc2dfaGRyICppY21zZ2hkcjsKKwlzdHJ1Y3QgaWNtc2dfbmVnb3RpYXRlICpuZWdvcCA9IE5VTEw7CisJaW50IHV0aWxfZndfdmVyc2lvbjsKKwlpbnQgZmNvcHlfc3J2X3ZlcnNpb247CisKKwlpZiAoZmNvcHlfdHJhbnNhY3Rpb24uYWN0aXZlKSB7CisJCS8qCisJCSAqIFdlIHdpbGwgZGVmZXIgcHJvY2Vzc2luZyB0aGlzIGNhbGxiYWNrIG9uY2UKKwkJICogdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCisJCSAqLworCQlmY29weV90cmFuc2FjdGlvbi5mY29weV9jb250ZXh0ID0gY29udGV4dDsKKwkJcmV0dXJuOworCX0KKworCXZtYnVzX3JlY3ZwYWNrZXQoY2hhbm5lbCwgcmVjdl9idWZmZXIsIFBBR0VfU0laRSAqIDIsICZyZWN2bGVuLAorCQkJICZyZXF1ZXN0aWQpOworCWlmIChyZWN2bGVuIDw9IDApCisJCXJldHVybjsKKworCWljbXNnaGRyID0gKHN0cnVjdCBpY21zZ19oZHIgKikmcmVjdl9idWZmZXJbCisJCQlzaXplb2Yoc3RydWN0IHZtYnVzcGlwZV9oZHIpXTsKKwlpZiAoaWNtc2doZHItPmljbXNndHlwZSA9PSBJQ01TR1RZUEVfTkVHT1RJQVRFKSB7CisJCXV0aWxfZndfdmVyc2lvbiA9IFVUSUxfRldfVkVSU0lPTjsKKwkJZmNvcHlfc3J2X3ZlcnNpb24gPSBXSU44X1NSVl9WRVJTSU9OOworCQl2bWJ1c19wcmVwX25lZ290aWF0ZV9yZXNwKGljbXNnaGRyLCBuZWdvcCwgcmVjdl9idWZmZXIsCisJCQkJdXRpbF9md192ZXJzaW9uLCBmY29weV9zcnZfdmVyc2lvbik7CisJfSBlbHNlIHsKKwkJZmNvcHlfbXNnID0gKHN0cnVjdCBodl9mY29weV9oZHIgKikmcmVjdl9idWZmZXJbCisJCQkJc2l6ZW9mKHN0cnVjdCB2bWJ1c3BpcGVfaGRyKSArCisJCQkJc2l6ZW9mKHN0cnVjdCBpY21zZ19oZHIpXTsKKworCQkvKgorCQkgKiBTdGFzaCBhd2F5IHRoaXMgZ2xvYmFsIHN0YXRlIGZvciBjb21wbGV0aW5nIHRoZQorCQkgKiB0cmFuc2FjdGlvbjsgbm90ZSB0cmFuc2FjdGlvbnMgYXJlIHNlcmlhbGl6ZWQuCisJCSAqLworCisJCWZjb3B5X3RyYW5zYWN0aW9uLmFjdGl2ZSA9IHRydWU7CisJCWZjb3B5X3RyYW5zYWN0aW9uLnJlY3ZfbGVuID0gcmVjdmxlbjsKKwkJZmNvcHlfdHJhbnNhY3Rpb24ucmVjdl9jaGFubmVsID0gY2hhbm5lbDsKKwkJZmNvcHlfdHJhbnNhY3Rpb24ucmVjdl9yZXFfaWQgPSByZXF1ZXN0aWQ7CisJCWZjb3B5X3RyYW5zYWN0aW9uLmZjb3B5X21zZyA9IGZjb3B5X21zZzsKKworCQkvKgorCQkgKiBTZW5kIHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgdXNlci1sZXZlbCBkYWVtb24uCisJCSAqLworCQlmY29weV9zZW5kX2RhdGEoKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZmY29weV93b3JrLCA1KkhaKTsKKwkJcmV0dXJuOworCX0KKwlpY21zZ2hkci0+aWNmbGFncyA9IElDTVNHSERSRkxBR19UUkFOU0FDVElPTiB8IElDTVNHSERSRkxBR19SRVNQT05TRTsKKwl2bWJ1c19zZW5kcGFja2V0KGNoYW5uZWwsIHJlY3ZfYnVmZmVyLCByZWN2bGVuLCByZXF1ZXN0aWQsCisJCQlWTV9QS1RfREFUQV9JTkJBTkQsIDApOworfQorCisvKgorICogQ3JlYXRlIGEgY2hhciBkZXZpY2UgdGhhdCBjYW4gc3VwcG9ydCByZWFkL3dyaXRlIGZvciBwYXNzaW5nCisgKiB0aGUgcGF5bG9hZC4KKyAqLworCitzdGF0aWMgc3NpemVfdCBmY29weV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl2b2lkICpzcmM7CisJc2l6ZV90IGNvcHlfc2l6ZTsKKwlpbnQgb3BlcmF0aW9uOworCisJLyoKKwkgKiBXYWl0IHVudGlsIHRoZXJlIGlzIHNvbWV0aGluZyB0byBiZSByZWFkLgorCSAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmZjb3B5X3RyYW5zYWN0aW9uLnJlYWRfc2VtYSkpCisJCXJldHVybiAtRUlOVFI7CisKKwkvKgorCSAqIFRoZSBjaGFubmVsIG1heSBiZSByZXNjaW5kZWQgYW5kIGluIHRoaXMgY2FzZSwgd2Ugd2lsbCB3YWtldXAgdGhlCisJICogdGhlIHRocmVhZCBibG9ja2VkIG9uIHRoZSBzZW1hcGhvcmUgYW5kIHdlIHdpbGwgdXNlIHRoZSBvcGVuZWQKKwkgKiBzdGF0ZSB0byBjb3JyZWN0bHkgaGFuZGxlIHRoaXMgY2FzZS4KKwkgKi8KKwlpZiAoIW9wZW5lZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvcGVyYXRpb24gPSBmY29weV90cmFuc2FjdGlvbi5mY29weV9tc2ctPm9wZXJhdGlvbjsKKworCWlmIChvcGVyYXRpb24gPT0gU1RBUlRfRklMRV9DT1BZKSB7CisJCXNyYyA9ICZmY29weV90cmFuc2FjdGlvbi5tZXNzYWdlOworCQljb3B5X3NpemUgPSBzaXplb2Yoc3RydWN0IGh2X3N0YXJ0X2Zjb3B5KTsKKwkJaWYgKGNvdW50IDwgY29weV9zaXplKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJc3JjID0gZmNvcHlfdHJhbnNhY3Rpb24uZmNvcHlfbXNnOworCQljb3B5X3NpemUgPSBzaXplb2Yoc3RydWN0IGh2X2RvX2Zjb3B5KTsKKwkJaWYgKGNvdW50IDwgY29weV9zaXplKQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBzcmMsIGNvcHlfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGNvcHlfc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3QgZmNvcHlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcmVzcG9uc2UgPSAwOworCisJaWYgKGNvdW50ICE9IHNpemVvZihpbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVzcG9uc2UsIGJ1Ziwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChpbl9oYW5kX3NoYWtlKSB7CisJCWlmIChmY29weV9oYW5kbGVfaGFuZHNoYWtlKHJlc3BvbnNlKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gc2l6ZW9mKGludCk7CisJfQorCisJLyoKKwkgKiBDb21wbGV0ZSB0aGUgdHJhbnNhY3Rpb24gYnkgZm9yd2FyZGluZyB0aGUgcmVzdWx0CisJICogdG8gdGhlIGhvc3QuIEJ1dCBmaXJzdCwgY2FuY2VsIHRoZSB0aW1lb3V0LgorCSAqLworCWlmIChjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmZjb3B5X3dvcmspKQorCQlmY29weV9yZXNwb25kX3RvX2hvc3QocmVzcG9uc2UpOworCisJcmV0dXJuIHNpemVvZihpbnQpOworfQorCitzdGF0aWMgaW50IGZjb3B5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmYpCit7CisJLyoKKwkgKiBUaGUgdXNlciBsZXZlbCBkYWVtb24gdGhhdCB3aWxsIG9wZW4gdGhpcyBkZXZpY2UgaXMKKwkgKiByZWFsbHkgYW4gZXh0ZW5zaW9uIG9mIHRoaXMgZHJpdmVyLiBXZSBjYW4gaGF2ZSBvbmx5CisJICogYWN0aXZlIG9wZW4gYXQgYSB0aW1lLgorCSAqLworCWlmIChvcGVuZWQpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKgorCSAqIFRoZSBkYWVtb24gaXMgYWxpdmU7IHNldHVwIHRoZSBzdGF0ZS4KKwkgKi8KKwlvcGVuZWQgPSB0cnVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZjb3B5X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmYpCit7CisJLyoKKwkgKiBUaGUgZGFlbW9uIGhhcyBleGl0ZWQ7IHJlc2V0IHRoZSBzdGF0ZS4KKwkgKi8KKwlpbl9oYW5kX3NoYWtlID0gdHJ1ZTsKKwlvcGVuZWQgPSBmYWxzZTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmY29weV9mb3BzID0geworCS5yZWFkICAgICAgICAgICA9IGZjb3B5X3JlYWQsCisJLndyaXRlICAgICAgICAgID0gZmNvcHlfd3JpdGUsCisJLnJlbGVhc2UJPSBmY29weV9yZWxlYXNlLAorCS5vcGVuCQk9IGZjb3B5X29wZW4sCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgZmNvcHlfbWlzYyA9IHsKKwkubWlub3IgICAgICAgICAgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUgICAgICAgICAgID0gInZtYnVzL2h2X2Zjb3B5IiwKKwkuZm9wcyAgICAgICAgICAgPSAmZmNvcHlfZm9wcywKK307CisKK3N0YXRpYyBpbnQgZmNvcHlfZGV2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gbWlzY19yZWdpc3RlcigmZmNvcHlfbWlzYyk7Cit9CisKK3N0YXRpYyB2b2lkIGZjb3B5X2Rldl9kZWluaXQodm9pZCkKK3sKKworCS8qCisJICogVGhlIGRldmljZSBpcyBnb2luZyBhd2F5IC0gcGVyaGFwcyBiZWNhdXNlIHRoZQorCSAqIGhvc3QgaGFzIHJlc2NpbmRlZCB0aGUgY2hhbm5lbC4gU2V0dXAgc3RhdGUgc28gdGhhdAorCSAqIHVzZXIgbGV2ZWwgZGFlbW9uIGNhbiBncmFjZWZ1bGx5IGV4aXQgaWYgaXQgaXMgYmxvY2tlZAorCSAqIG9uIHRoZSByZWFkIHNlbWFwaG9yZS4KKwkgKi8KKwlvcGVuZWQgPSBmYWxzZTsKKwkvKgorCSAqIFNpZ25hbCB0aGUgc2VtYXBob3JlIGFzIHRoZSBkZXZpY2UgaXMKKwkgKiBnb2luZyBhd2F5LgorCSAqLworCXVwKCZmY29weV90cmFuc2FjdGlvbi5yZWFkX3NlbWEpOworCW1pc2NfZGVyZWdpc3RlcigmZmNvcHlfbWlzYyk7Cit9CisKK2ludCBodl9mY29weV9pbml0KHN0cnVjdCBodl91dGlsX3NlcnZpY2UgKnNydikKK3sKKwlyZWN2X2J1ZmZlciA9IHNydi0+cmVjdl9idWZmZXI7CisKKwkvKgorCSAqIFdoZW4gdGhpcyBkcml2ZXIgbG9hZHMsIHRoZSB1c2VyIGxldmVsIGRhZW1vbiB0aGF0CisJICogcHJvY2Vzc2VzIHRoZSBob3N0IHJlcXVlc3RzIG1heSBub3QgeWV0IGJlIHJ1bm5pbmcuCisJICogRGVmZXIgcHJvY2Vzc2luZyBjaGFubmVsIGNhbGxiYWNrcyB1bnRpbCB0aGUgZGFlbW9uCisJICogaGFzIHJlZ2lzdGVyZWQuCisJICovCisJZmNvcHlfdHJhbnNhY3Rpb24uYWN0aXZlID0gdHJ1ZTsKKwlzZW1hX2luaXQoJmZjb3B5X3RyYW5zYWN0aW9uLnJlYWRfc2VtYSwgMCk7CisKKwlyZXR1cm4gZmNvcHlfZGV2X2luaXQoKTsKK30KKwordm9pZCBodl9mY29weV9kZWluaXQodm9pZCkKK3sKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmZjb3B5X3dvcmspOworCWZjb3B5X2Rldl9kZWluaXQoKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvaHZfa3ZwLmMgYi9kcml2ZXJzL2h2L2h2X2t2cC5jCmluZGV4IDA5OTg4YjIuLmVhODUyNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHYvaHZfa3ZwLmMKKysrIGIvZHJpdmVycy9odi9odl9rdnAuYwpAQCAtMTEzLDcgKzExMyw3IEBACiAJCWt2cF9tc2ctPmt2cF9oZHIub3BlcmF0aW9uID0gcmVnX3ZhbHVlOwogCQlzdHJjcHkodmVyc2lvbiwgSFZfRFJWX1ZFUlNJT04pOwogCQltc2ctPmxlbiA9IHNpemVvZihzdHJ1Y3QgaHZfa3ZwX21zZyk7Ci0JCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIEdGUF9BVE9NSUMpOworCQljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCAwLCBHRlBfQVRPTUlDKTsKIAkJa2ZyZWUobXNnKTsKIAl9CiB9CkBAIC00MzUsNyArNDM1LDcgQEAKIAl9CiAKIAltc2ctPmxlbiA9IHNpemVvZihzdHJ1Y3QgaHZfa3ZwX21zZyk7Ci0JY25fbmV0bGlua19zZW5kKG1zZywgMCwgR0ZQX0FUT01JQyk7CisJY25fbmV0bGlua19zZW5kKG1zZywgMCwgMCwgR0ZQX0FUT01JQyk7CiAJa2ZyZWUobXNnKTsKIAogCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvaHZfc25hcHNob3QuYyBiL2RyaXZlcnMvaHYvaHZfc25hcHNob3QuYwppbmRleCAwYzM1NDYyLi4zNGYxNGZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L2h2X3NuYXBzaG90LmMKKysrIGIvZHJpdmVycy9odi9odl9zbmFwc2hvdC5jCkBAIC05OCw3ICs5OCw3IEBACiAJdnNzX21zZy0+dnNzX2hkci5vcGVyYXRpb24gPSBvcDsKIAltc2ctPmxlbiA9IHNpemVvZihzdHJ1Y3QgaHZfdnNzX21zZyk7CiAKLQljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBHRlBfQVRPTUlDKTsKKwljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCAwLCBHRlBfQVRPTUlDKTsKIAlrZnJlZShtc2cpOwogCiAJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9odl91dGlsLmMgYi9kcml2ZXJzL2h2L2h2X3V0aWwuYwppbmRleCA2MmRmZDI0Ni4uZGQ3NjE4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9odl91dGlsLmMKKysrIGIvZHJpdmVycy9odi9odl91dGlsLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9oeXBlcnYuaD4KIAorI2luY2x1ZGUgImh5cGVydl92bWJ1cy5oIgogCiAjZGVmaW5lIFNEX01BSk9SCTMKICNkZWZpbmUgU0RfTUlOT1IJMApAQCAtODIsNiArODMsMTIgQEAKIAkudXRpbF9kZWluaXQgPSBodl92c3NfZGVpbml0LAogfTsKIAorc3RhdGljIHN0cnVjdCBodl91dGlsX3NlcnZpY2UgdXRpbF9mY29weSA9IHsKKwkudXRpbF9jYiA9IGh2X2Zjb3B5X29uY2hhbm5lbGNhbGxiYWNrLAorCS51dGlsX2luaXQgPSBodl9mY29weV9pbml0LAorCS51dGlsX2RlaW5pdCA9IGh2X2Zjb3B5X2RlaW5pdCwKK307CisKIHN0YXRpYyB2b2lkIHBlcmZvcm1fc2h1dGRvd24oc3RydWN0IHdvcmtfc3RydWN0ICpkdW1teSkKIHsKIAlvcmRlcmx5X3Bvd2Vyb2ZmKHRydWUpOwpAQCAtNDAxLDYgKzQwOCwxMCBAQAogCXsgSFZfVlNTX0dVSUQsCiAJICAuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykmdXRpbF92c3MKIAl9LAorCS8qIEZpbGUgY29weSBHVUlEICovCisJeyBIVl9GQ09QWV9HVUlELAorCSAgLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpJnV0aWxfZmNvcHkKKwl9LAogCXsgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvaHlwZXJ2X3ZtYnVzLmggYi9kcml2ZXJzL2h2L2h5cGVydl92bWJ1cy5oCmluZGV4IGUwNTUxNzYuLjg2MDEzNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHYvaHlwZXJ2X3ZtYnVzLmgKKysrIGIvZHJpdmVycy9odi9oeXBlcnZfdm1idXMuaApAQCAtNTU5LDggKzU1OSw4IEBACiB2b2lkIGh2X3JpbmdidWZmZXJfY2xlYW51cChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvKTsKIAogaW50IGh2X3JpbmdidWZmZXJfd3JpdGUoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbywKLQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAotCQkgICAgdTMyIHNnY291bnQsIGJvb2wgKnNpZ25hbCk7CisJCSAgICBzdHJ1Y3Qga3ZlYyAqa3ZfbGlzdCwKKwkJICAgIHUzMiBrdl9jb3VudCwgYm9vbCAqc2lnbmFsKTsKIAogaW50IGh2X3JpbmdidWZmZXJfcGVlayhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvLCB2b2lkICpidWZmZXIsCiAJCSAgIHUzMiBidWZsZW4pOwpAQCAtNjY5LDUgKzY2OSw5IEBACiAKIHZvaWQgdm1idXNfb25fZXZlbnQodW5zaWduZWQgbG9uZyBkYXRhKTsKIAoraW50IGh2X2Zjb3B5X2luaXQoc3RydWN0IGh2X3V0aWxfc2VydmljZSAqKTsKK3ZvaWQgaHZfZmNvcHlfZGVpbml0KHZvaWQpOwordm9pZCBodl9mY29weV9vbmNoYW5uZWxjYWxsYmFjayh2b2lkICopOworCiAKICNlbmRpZiAvKiBfSFlQRVJWX1ZNQlVTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvcmluZ19idWZmZXIuYyBiL2RyaXZlcnMvaHYvcmluZ19idWZmZXIuYwppbmRleCAyNmM5M2NmLi4xNWRiNjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L3JpbmdfYnVmZmVyLmMKKysrIGIvZHJpdmVycy9odi9yaW5nX2J1ZmZlci5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9oeXBlcnYuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KIAogI2luY2x1ZGUgImh5cGVydl92bWJ1cy5oIgogCkBAIC0zODcsMjMgKzM4OCwyMCBAQAogICoKICAqLwogaW50IGh2X3JpbmdidWZmZXJfd3JpdGUoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKm91dHJpbmdfaW5mbywKLQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LCB1MzIgc2djb3VudCwgYm9vbCAqc2lnbmFsKQorCQkgICAgc3RydWN0IGt2ZWMgKmt2X2xpc3QsIHUzMiBrdl9jb3VudCwgYm9vbCAqc2lnbmFsKQogewogCWludCBpID0gMDsKIAl1MzIgYnl0ZXNfYXZhaWxfdG93cml0ZTsKIAl1MzIgYnl0ZXNfYXZhaWxfdG9yZWFkOwogCXUzMiB0b3RhbGJ5dGVzX3Rvd3JpdGUgPSAwOwogCi0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIAl1MzIgbmV4dF93cml0ZV9sb2NhdGlvbjsKIAl1MzIgb2xkX3dyaXRlOwogCXU2NCBwcmV2X2luZGljZXMgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlmb3JfZWFjaF9zZyhzZ2xpc3QsIHNnLCBzZ2NvdW50LCBpKQotCXsKLQkJdG90YWxieXRlc190b3dyaXRlICs9IHNnLT5sZW5ndGg7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBrdl9jb3VudDsgaSsrKQorCQl0b3RhbGJ5dGVzX3Rvd3JpdGUgKz0ga3ZfbGlzdFtpXS5pb3ZfbGVuOwogCiAJdG90YWxieXRlc190b3dyaXRlICs9IHNpemVvZih1NjQpOwogCkBAIC00MjcsMTIgKzQyNSwxMSBAQAogCiAJb2xkX3dyaXRlID0gbmV4dF93cml0ZV9sb2NhdGlvbjsKIAotCWZvcl9lYWNoX3NnKHNnbGlzdCwgc2csIHNnY291bnQsIGkpCi0JeworCWZvciAoaSA9IDA7IGkgPCBrdl9jb3VudDsgaSsrKSB7CiAJCW5leHRfd3JpdGVfbG9jYXRpb24gPSBodl9jb3B5dG9fcmluZ2J1ZmZlcihvdXRyaW5nX2luZm8sCiAJCQkJCQkgICAgIG5leHRfd3JpdGVfbG9jYXRpb24sCi0JCQkJCQkgICAgIHNnX3ZpcnQoc2cpLAotCQkJCQkJICAgICBzZy0+bGVuZ3RoKTsKKwkJCQkJCSAgICAga3ZfbGlzdFtpXS5pb3ZfYmFzZSwKKwkJCQkJCSAgICAga3ZfbGlzdFtpXS5pb3ZfbGVuKTsKIAl9CiAKIAkvKiBTZXQgcHJldmlvdXMgcGFja2V0IHN0YXJ0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L3ZtYnVzX2Rydi5jIGIvZHJpdmVycy9odi92bWJ1c19kcnYuYwppbmRleCAwNzdiYjFiLi44ZTUzYTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L3ZtYnVzX2Rydi5jCisrKyBiL2RyaXZlcnMvaHYvdm1idXNfZHJ2LmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNDQsNiArNDMsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgY29tcGxldGlvbiBwcm9iZV9ldmVudDsKIHN0YXRpYyBpbnQgaXJxOwogCitzdHJ1Y3QgcmVzb3VyY2UgaHlwZXJ2X21taW8gPSB7CisJLm5hbWUgID0gImh5cGVydiBtbWlvIiwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChoeXBlcnZfbW1pbyk7CisKIHN0YXRpYyBpbnQgdm1idXNfZXhpc3RzKHZvaWQpCiB7CiAJaWYgKGh2X2FjcGlfZGV2ID09IE5VTEwpCkBAIC01NTgsOSArNTYzLDYgQEAKIAkuZGV2X2dyb3VwcyA9CQl2bWJ1c19ncm91cHMsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqZHJpdmVyX25hbWUgPSAiaHlwZXJ2IjsKLQotCiBzdHJ1Y3Qgb25tZXNzYWdlX3dvcmtfY29udGV4dCB7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJc3RydWN0IGh2X21lc3NhZ2UgbXNnOwpAQCAtNjE5LDcgKzYyMSw3IEBACiAJfQogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3Qgdm1idXNfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3N0YXRpYyB2b2lkIHZtYnVzX2lzcih2b2lkKQogewogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJdm9pZCAqcGFnZV9hZGRyOwpAQCAtNjI5LDcgKzYzMSw3IEBACiAKIAlwYWdlX2FkZHIgPSBodl9jb250ZXh0LnN5bmljX2V2ZW50X3BhZ2VbY3B1XTsKIAlpZiAocGFnZV9hZGRyID09IE5VTEwpCi0JCXJldHVybiBJUlFfTk9ORTsKKwkJcmV0dXJuOwogCiAJZXZlbnQgPSAodW5pb24gaHZfc3luaWNfZXZlbnRfZmxhZ3MgKilwYWdlX2FkZHIgKwogCQkJCQkgVk1CVVNfTUVTU0FHRV9TSU5UOwpAQCAtNjY1LDI4ICs2NjcsOCBAQAogCW1zZyA9IChzdHJ1Y3QgaHZfbWVzc2FnZSAqKXBhZ2VfYWRkciArIFZNQlVTX01FU1NBR0VfU0lOVDsKIAogCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBhY3R1YWwgbXNncyB0byBiZSBwcm9jZXNzZWQgKi8KLQlpZiAobXNnLT5oZWFkZXIubWVzc2FnZV90eXBlICE9IEhWTVNHX05PTkUpIHsKLQkJaGFuZGxlZCA9IHRydWU7CisJaWYgKG1zZy0+aGVhZGVyLm1lc3NhZ2VfdHlwZSAhPSBIVk1TR19OT05FKQogCQl0YXNrbGV0X3NjaGVkdWxlKCZtc2dfZHBjKTsKLQl9Ci0KLQlpZiAoaGFuZGxlZCkKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCWVsc2UKLQkJcmV0dXJuIElSUV9OT05FOwotfQotCi0vKgotICogdm1idXMgaW50ZXJydXB0IGZsb3cgaGFuZGxlcjoKLSAqIHZtYnVzIGludGVycnVwdHMgY2FuIGNvbmN1cnJlbnRseSBvY2N1ciBvbiBtdWx0aXBsZSBDUFVzIGFuZAotICogY2FuIGJlIGhhbmRsZWQgY29uY3VycmVudGx5LgotICovCi0KLXN0YXRpYyB2b2lkIHZtYnVzX2Zsb3dfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCi17Ci0Ja3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgZGVzYyk7Ci0KLQlkZXNjLT5hY3Rpb24tPmhhbmRsZXIoaXJxLCBkZXNjLT5hY3Rpb24tPmRldl9pZCk7CiB9CiAKIC8qCkBAIC03MTUsMjUgKzY5Nyw3IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfY2xlYW51cDsKIAotCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgdm1idXNfaXNyLCAwLCBkcml2ZXJfbmFtZSwgaHZfYWNwaV9kZXYpOwotCi0JaWYgKHJldCAhPSAwKSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIHJlcXVlc3QgSVJRICVkXG4iLAotCQkJICAgaXJxKTsKLQkJZ290byBlcnJfdW5yZWdpc3RlcjsKLQl9Ci0KLQkvKgotCSAqIFZtYnVzIGludGVycnVwdHMgY2FuIGJlIGhhbmRsZWQgY29uY3VycmVudGx5IG9uCi0JICogZGlmZmVyZW50IENQVXMuIEVzdGFibGlzaCBhbiBhcHByb3ByaWF0ZSBpbnRlcnJ1cHQgZmxvdwotCSAqIGhhbmRsZXIgdGhhdCBjYW4gc3VwcG9ydCB0aGlzIG1vZGVsLgotCSAqLwotCWlycV9zZXRfaGFuZGxlcihpcnEsIHZtYnVzX2Zsb3dfaGFuZGxlcik7Ci0KLQkvKgotCSAqIFJlZ2lzdGVyIG91ciBpbnRlcnJ1cHQgaGFuZGxlci4KLQkgKi8KLQlodl9yZWdpc3Rlcl92bWJ1c19oYW5kbGVyKGlycSwgdm1idXNfaXNyKTsKKwlodl9zZXR1cF92bWJ1c19pcnEodm1idXNfaXNyKTsKIAogCXJldCA9IGh2X3N5bmljX2FsbG9jKCk7CiAJaWYgKHJldCkKQEAgLTc1Myw5ICs3MTcsOCBAQAogCiBlcnJfYWxsb2M6CiAJaHZfc3luaWNfZnJlZSgpOwotCWZyZWVfaXJxKGlycSwgaHZfYWNwaV9kZXYpOworCWh2X3JlbW92ZV92bWJ1c19pcnEoKTsKIAotZXJyX3VucmVnaXN0ZXI6CiAJYnVzX3VucmVnaXN0ZXIoJmh2X2J1cyk7CiAKIGVycl9jbGVhbnVwOgpAQCAtODg2LDE4ICs4NDksMjEgQEAKIAogCiAvKgotICogVk1CVVMgaXMgYW4gYWNwaSBlbnVtZXJhdGVkIGRldmljZS4gR2V0IHRoZSB0aGUgSVJRIGluZm9ybWF0aW9uCi0gKiBmcm9tIERTRFQuCisgKiBWTUJVUyBpcyBhbiBhY3BpIGVudW1lcmF0ZWQgZGV2aWNlLiBHZXQgdGhlIHRoZSBpbmZvcm1hdGlvbiB3ZQorICogbmVlZCBmcm9tIERTRFQuCiAgKi8KIAotc3RhdGljIGFjcGlfc3RhdHVzIHZtYnVzX3dhbGtfcmVzb3VyY2VzKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXMsIHZvaWQgKmlycSkKK3N0YXRpYyBhY3BpX3N0YXR1cyB2bWJ1c193YWxrX3Jlc291cmNlcyhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzLCB2b2lkICpjdHgpCiB7CisJc3dpdGNoIChyZXMtPnR5cGUpIHsKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9JUlE6CisJCWlycSA9IHJlcy0+ZGF0YS5pcnEuaW50ZXJydXB0c1swXTsKKwkJYnJlYWs7CiAKLQlpZiAocmVzLT50eXBlID09IEFDUElfUkVTT1VSQ0VfVFlQRV9JUlEpIHsKLQkJc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxICppcnFwOwotCQlpcnFwID0gJnJlcy0+ZGF0YS5pcnE7Ci0KLQkJKigodW5zaWduZWQgaW50ICopaXJxKSA9IGlycXAtPmludGVycnVwdHNbMF07CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzY0OgorCQloeXBlcnZfbW1pby5zdGFydCA9IHJlcy0+ZGF0YS5hZGRyZXNzNjQubWluaW11bTsKKwkJaHlwZXJ2X21taW8uZW5kID0gcmVzLT5kYXRhLmFkZHJlc3M2NC5tYXhpbXVtOworCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gQUVfT0s7CkBAIC05MDYsMTggKzg3MiwzNCBAQAogc3RhdGljIGludCB2bWJ1c19hY3BpX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlhY3BpX3N0YXR1cyByZXN1bHQ7CisJaW50IHJldF92YWwgPSAtRU5PREVWOwogCiAJaHZfYWNwaV9kZXYgPSBkZXZpY2U7CiAKIAlyZXN1bHQgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGRldmljZS0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAotCQkJCQl2bWJ1c193YWxrX3Jlc291cmNlcywgJmlycSk7CisJCQkJCXZtYnVzX3dhbGtfcmVzb3VyY2VzLCBOVUxMKTsKIAotCWlmIChBQ1BJX0ZBSUxVUkUocmVzdWx0KSkgewotCQljb21wbGV0ZSgmcHJvYmVfZXZlbnQpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoQUNQSV9GQUlMVVJFKHJlc3VsdCkpCisJCWdvdG8gYWNwaV93YWxrX2VycjsKKwkvKgorCSAqIFRoZSBwYXJlbnQgb2YgdGhlIHZtYnVzIGFjcGkgZGV2aWNlIChHZW4yIGZpcm13YXJlKSBpcyB0aGUgVk1PRCB0aGF0CisJICogaGFzIHRoZSBtbWlvIHJhbmdlcy4gR2V0IHRoYXQuCisJICovCisJaWYgKGRldmljZS0+cGFyZW50KSB7CisJCXJlc3VsdCA9IGFjcGlfd2Fsa19yZXNvdXJjZXMoZGV2aWNlLT5wYXJlbnQtPmhhbmRsZSwKKwkJCQkJTUVUSE9EX05BTUVfX0NSUywKKwkJCQkJdm1idXNfd2Fsa19yZXNvdXJjZXMsIE5VTEwpOworCisJCWlmIChBQ1BJX0ZBSUxVUkUocmVzdWx0KSkKKwkJCWdvdG8gYWNwaV93YWxrX2VycjsKKwkJaWYgKGh5cGVydl9tbWlvLnN0YXJ0ICYmIGh5cGVydl9tbWlvLmVuZCkKKwkJCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmaHlwZXJ2X21taW8pOwogCX0KKwlyZXRfdmFsID0gMDsKKworYWNwaV93YWxrX2VycjoKIAljb21wbGV0ZSgmcHJvYmVfZXZlbnQpOwotCXJldHVybiAwOworCXJldHVybiByZXRfdmFsOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHZtYnVzX2FjcGlfZGV2aWNlX2lkc1tdID0gewpAQCAtOTQ3LDcgKzkyOSw2IEBACiAJLyoKIAkgKiBHZXQgaXJxIHJlc291cmNlcyBmaXJzdC4KIAkgKi8KLQogCXJldCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmdm1idXNfYWNwaV9kcml2ZXIpOwogCiAJaWYgKHJldCkKQEAgLTk3OCw4ICs5NTksNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgdm1idXNfZXhpdCh2b2lkKQogewotCi0JZnJlZV9pcnEoaXJxLCBodl9hY3BpX2Rldik7CisJaHZfcmVtb3ZlX3ZtYnVzX2lycSgpOwogCXZtYnVzX2ZyZWVfY2hhbm5lbHMoKTsKIAlidXNfdW5yZWdpc3RlcigmaHZfYnVzKTsKIAlodl9jbGVhbnVwKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL0tjb25maWcgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKaW5kZXggNWNlNDNkOC4uZjI4OGI2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwpAQCAtMTExLDIyICsxMTEsNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBhZDc0MTguCiAKLWNvbmZpZyBTRU5TT1JTX0FEQ1hYCi0JdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgQURDeHh4U3h4eCIKLQlkZXBlbmRzIG9uIFNQSV9NQVNURVIKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKLQkgIEFEQzxiYj48Yz5TPHNzcz4gY2hpcCBmYW1pbHksIHdoZXJlCi0JICAqIGJiICBpcyB0aGUgcmVzb2x1dGlvbiBpbiBudW1iZXIgb2YgYml0cyAoOCwgMTAsIDEyKQotCSAgKiBjICAgaXMgdGhlIG51bWJlciBvZiBjaGFubmVscyAoMSwgMiwgNCwgOCkKLQkgICogc3NzIGlzIHRoZSBtYXhpbXVtIGNvbnZlcnNpb24gc3BlZWQgKDAyMSBmb3IgMjAwIGtTUFMsIDA1MSBmb3IgNTAwCi0JICAgIGtTUFMgYW5kIDEwMSBmb3IgMSBNU1BTKQotCi0JICBFeGFtcGxlcyA6IEFEQzA4MVMxMDEsIEFEQzEyNFM1MDEsIC4uLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBhZGN4eC4KLQogY29uZmlnIFNFTlNPUlNfQURNMTAyMQogCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE0xMDIxIGFuZCBjb21wYXRpYmxlcyIKIAlkZXBlbmRzIG9uIEkyQwpAQCAtMzEyLDYgKzI5NiwzMSBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgZmFtMTVoX3Bvd2VyLgogCitjb25maWcgU0VOU09SU19BUFBMRVNNQworCXRyaXN0YXRlICJBcHBsZSBTTUMgKE1vdGlvbiBzZW5zb3IsIGxpZ2h0IHNlbnNvciwga2V5Ym9hcmQgYmFja2xpZ2h0KSIKKwlkZXBlbmRzIG9uIElOUFVUICYmIFg4NgorCXNlbGVjdCBORVdfTEVEUworCXNlbGVjdCBMRURTX0NMQVNTCisJc2VsZWN0IElOUFVUX1BPTExERVYKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIGRyaXZlciBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgQXBwbGUgU3lzdGVtIE1hbmFnZW1lbnQKKwkgIENvbnRyb2xsZXIsIHdoaWNoIHByb3ZpZGVzIGFuIGFjY2VsZXJvbWV0ZXIgKEFwcGxlIFN1ZGRlbiBNb3Rpb24KKwkgIFNlbnNvciksIGxpZ2h0IHNlbnNvcnMsIHRlbXBlcmF0dXJlIHNlbnNvcnMsIGtleWJvYXJkIGJhY2tsaWdodAorCSAgY29udHJvbCBhbmQgZmFuIGNvbnRyb2wuCisKKwkgIE9ubHkgSW50ZWwtYmFzZWQgQXBwbGUncyBjb21wdXRlcnMgYXJlIHN1cHBvcnRlZCAoTWFjQm9vayBQcm8sCisJICBNYWNCb29rLCBNYWNNaW5pKS4KKworCSAgRGF0YSBmcm9tIHRoZSBkaWZmZXJlbnQgc2Vuc29ycywga2V5Ym9hcmQgYmFja2xpZ2h0IGNvbnRyb2wgYW5kIGZhbgorCSAgY29udHJvbCBhcmUgYWNjZXNzaWJsZSB2aWEgc3lzZnMuCisKKwkgIFRoaXMgZHJpdmVyIGFsc28gcHJvdmlkZXMgYW4gYWJzb2x1dGUgaW5wdXQgY2xhc3MgZGV2aWNlLCBhbGxvd2luZworCSAgdGhlIGxhcHRvcCB0byBhY3QgYXMgYSBwaW5iYWxsIG1hY2hpbmUtZXNxdWUgam95c3RpY2suCisKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYW4gYXBwbGljYWJsZSBsYXB0b3AgYW5kIHdhbnQgdG8gZXhwZXJpZW5jZQorCSAgdGhlIGF3ZXNvbWUgcG93ZXIgb2YgYXBwbGVzbWMuCisKIGNvbmZpZyBTRU5TT1JTX0FTQjEwMAogCXRyaXN0YXRlICJBc3VzIEFTQjEwMCBCYWNoIgogCWRlcGVuZHMgb24gWDg2ICYmIEkyQwpAQCAtNDM1LDYgKzQ0NCwxMiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgZjc1Mzc1cy4KIAorY29uZmlnIFNFTlNPUlNfTUMxMzc4M19BREMKKyAgICAgICAgdHJpc3RhdGUgIkZyZWVzY2FsZSBNQzEzNzgzL01DMTM4OTIgQURDIgorICAgICAgICBkZXBlbmRzIG9uIE1GRF9NQzEzWFhYCisgICAgICAgIGhlbHAKKyAgICAgICAgICBTdXBwb3J0IGZvciB0aGUgQS9EIGNvbnZlcnRlciBvbiBNQzEzNzgzIGFuZCBNQzEzODkyIFBNSUMuCisKIGNvbmZpZyBTRU5TT1JTX0ZTQ0hNRAogCXRyaXN0YXRlICJGdWppdHN1IFNpZW1lbnMgQ29tcHV0ZXJzIHNlbnNvciBjaGlwcyIKIAlkZXBlbmRzIG9uIFg4NiAmJiBJMkMKQEAgLTQ1MSwyNiArNDY2LDYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGZzY2htZC4KIAotY29uZmlnIFNFTlNPUlNfRzc2MEEKLQl0cmlzdGF0ZSAiR01UIEc3NjBBIgotCWRlcGVuZHMgb24gSTJDCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEdsb2JhbCBNaXhlZC1tb2RlCi0JICBUZWNobm9sb2d5IEluYyBHNzYwQSBmYW4gc3BlZWQgUFdNIGNvbnRyb2xsZXIgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGc3NjBhLgotCi1jb25maWcgU0VOU09SU19HNzYyCi0JdHJpc3RhdGUgIkdNVCBHNzYyIGFuZCBHNzYzIgotCWRlcGVuZHMgb24gSTJDCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEdsb2JhbCBNaXhlZC1tb2RlCi0JICBUZWNobm9sb2d5IEluYyBHNzYyIGFuZCBHNzYzIGZhbiBzcGVlZCBQV00gY29udHJvbGxlciBjaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgZzc2Mi4KLQogY29uZmlnIFNFTlNPUlNfR0w1MThTTQogCXRyaXN0YXRlICJHZW5lc3lzIExvZ2ljIEdMNTE4U00iCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTQ5Miw2ICs0ODcsMjYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGdsNTIwc20uCiAKK2NvbmZpZyBTRU5TT1JTX0c3NjBBCisJdHJpc3RhdGUgIkdNVCBHNzYwQSIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBHbG9iYWwgTWl4ZWQtbW9kZQorCSAgVGVjaG5vbG9neSBJbmMgRzc2MEEgZmFuIHNwZWVkIFBXTSBjb250cm9sbGVyIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBnNzYwYS4KKworY29uZmlnIFNFTlNPUlNfRzc2MgorCXRyaXN0YXRlICJHTVQgRzc2MiBhbmQgRzc2MyIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBHbG9iYWwgTWl4ZWQtbW9kZQorCSAgVGVjaG5vbG9neSBJbmMgRzc2MiBhbmQgRzc2MyBmYW4gc3BlZWQgUFdNIGNvbnRyb2xsZXIgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGc3NjIuCisKIGNvbmZpZyBTRU5TT1JTX0dQSU9fRkFOCiAJdHJpc3RhdGUgIkdQSU8gZmFuIgogCWRlcGVuZHMgb24gR1BJT0xJQgpAQCAtNTExLDI0ICs1MjYsNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgaGloNjEzMC4KIAotY29uZmlnIFNFTlNPUlNfSFRVMjEKLQl0cmlzdGF0ZSAiTWVhc3VyZW1lbnQgU3BlY2lhbHRpZXMgSFRVMjFEIGh1bWlkaXR5L3RlbXBlcmF0dXJlIHNlbnNvcnMiCi0JZGVwZW5kcyBvbiBJMkMKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE1lYXN1cmVtZW50IFNwZWNpYWx0aWVzCi0JICBIVFUyMUQgaHVtaWRpdHkgYW5kIHRlbXBlcmF0dXJlIHNlbnNvcnMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGh0dTIxLgotCi1jb25maWcgU0VOU09SU19DT1JFVEVNUAotCXRyaXN0YXRlICJJbnRlbCBDb3JlL0NvcmUyL0F0b20gdGVtcGVyYXR1cmUgc2Vuc29yIgotCWRlcGVuZHMgb24gWDg2Ci0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSB0ZW1wZXJhdHVyZQotCSAgc2Vuc29yIGluc2lkZSB5b3VyIENQVS4gTW9zdCBvZiB0aGUgZmFtaWx5IDYgQ1BVcwotCSAgYXJlIHN1cHBvcnRlZC4gQ2hlY2sgRG9jdW1lbnRhdGlvbi9od21vbi9jb3JldGVtcCBmb3IgZGV0YWlscy4KLQogY29uZmlnIFNFTlNPUlNfSUJNQUVNCiAJdHJpc3RhdGUgIklCTSBBY3RpdmUgRW5lcmd5IE1hbmFnZXIgdGVtcGVyYXR1cmUvcG93ZXIgc2Vuc29ycyBhbmQgY29udHJvbCIKIAlzZWxlY3QgSVBNSV9TSQpAQCAtNTY2LDYgKzU2MywxNCBAQAogCSAgZm9yIHRob3NlIGNoYW5uZWxzIHNwZWNpZmllZCBpbiB0aGUgbWFwLiAgVGhpcyBtYXAgY2FuIGJlIHByb3ZpZGVkCiAJICBlaXRoZXIgdmlhIHBsYXRmb3JtIGRhdGEgb3IgdGhlIGRldmljZSB0cmVlIGJpbmRpbmdzLgogCitjb25maWcgU0VOU09SU19DT1JFVEVNUAorCXRyaXN0YXRlICJJbnRlbCBDb3JlL0NvcmUyL0F0b20gdGVtcGVyYXR1cmUgc2Vuc29yIgorCWRlcGVuZHMgb24gWDg2CisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSB0ZW1wZXJhdHVyZQorCSAgc2Vuc29yIGluc2lkZSB5b3VyIENQVS4gTW9zdCBvZiB0aGUgZmFtaWx5IDYgQ1BVcworCSAgYXJlIHN1cHBvcnRlZC4gQ2hlY2sgRG9jdW1lbnRhdGlvbi9od21vbi9jb3JldGVtcCBmb3IgZGV0YWlscy4KKwogY29uZmlnIFNFTlNPUlNfSVQ4NwogCXRyaXN0YXRlICJJVEUgSVQ4N3h4IGFuZCBjb21wYXRpYmxlcyIKIAlkZXBlbmRzIG9uICFQUEMKQEAgLTYxNCw2ICs2MTksMjE5IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBsaW5lYWdlLXBlbS4KIAorY29uZmlnIFNFTlNPUlNfTFRDMjk0NQorCXRyaXN0YXRlICJMaW5lYXIgVGVjaG5vbG9neSBMVEMyOTQ1IgorCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IFJFR01BUF9JMkMKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDMjk0NQorCSAgSTJDIFN5c3RlbSBNb25pdG9yLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGx0YzI5NDUuCisKK2NvbmZpZyBTRU5TT1JTX0xUQzQxNTEKKwl0cmlzdGF0ZSAiTGluZWFyIFRlY2hub2xvZ3kgTFRDNDE1MSIKKwlkZXBlbmRzIG9uIEkyQworCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MTUxCisJICBIaWdoIFZvbHRhZ2UgSTJDIEN1cnJlbnQgYW5kIFZvbHRhZ2UgTW9uaXRvciBpbnRlcmZhY2UuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbHRjNDE1MS4KKworY29uZmlnIFNFTlNPUlNfTFRDNDIxNQorCXRyaXN0YXRlICJMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjE1IgorCWRlcGVuZHMgb24gSTJDCisJZGVmYXVsdCBuCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIExpbmVhciBUZWNobm9sb2d5IExUQzQyMTUKKwkgIEhvdCBTd2FwIENvbnRyb2xsZXIgSTJDIGludGVyZmFjZS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBsdGM0MjE1LgorCitjb25maWcgU0VOU09SU19MVEM0MjIyCisJdHJpc3RhdGUgIkxpbmVhciBUZWNobm9sb2d5IExUQzQyMjIiCisJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgUkVHTUFQX0kyQworCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjIyCisJICBEdWFsIEhvdCBTd2FwIENvbnRyb2xsZXIgSTJDIGludGVyZmFjZS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBsdGM0MjIyLgorCitjb25maWcgU0VOU09SU19MVEM0MjQ1CisJdHJpc3RhdGUgIkxpbmVhciBUZWNobm9sb2d5IExUQzQyNDUiCisJZGVwZW5kcyBvbiBJMkMKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDNDI0NQorCSAgTXVsdGlwbGUgU3VwcGx5IEhvdCBTd2FwIENvbnRyb2xsZXIgSTJDIGludGVyZmFjZS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBsdGM0MjQ1LgorCitjb25maWcgU0VOU09SU19MVEM0MjYwCisJdHJpc3RhdGUgIkxpbmVhciBUZWNobm9sb2d5IExUQzQyNjAiCisJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgUkVHTUFQX0kyQworCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjYwCisJICBQb3NpdGl2ZSBWb2x0YWdlIEhvdCBTd2FwIENvbnRyb2xsZXIgSTJDIGludGVyZmFjZS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBsdGM0MjYwLgorCitjb25maWcgU0VOU09SU19MVEM0MjYxCisJdHJpc3RhdGUgIkxpbmVhciBUZWNobm9sb2d5IExUQzQyNjEiCisJZGVwZW5kcyBvbiBJMkMKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDNDI2MQorCSAgTmVnYXRpdmUgVm9sdGFnZSBIb3QgU3dhcCBDb250cm9sbGVyIEkyQyBpbnRlcmZhY2UuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbHRjNDI2MS4KKworY29uZmlnIFNFTlNPUlNfTUFYMTExMQorCXRyaXN0YXRlICJNYXhpbSBNQVgxMTExIFNlcmlhbCA4LWJpdCBBREMgY2hpcCBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSCisJaGVscAorCSAgU2F5IHkgaGVyZSB0byBzdXBwb3J0IE1heGltJ3MgTUFYMTExMCwgTUFYMTExMSwgTUFYMTExMiwgYW5kIE1BWDExMTMKKwkgIEFEQyBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWF4MTExMS4KKworY29uZmlnIFNFTlNPUlNfTUFYMTYwNjUKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYMTYwNjUgU3lzdGVtIE1hbmFnZXIgYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIGhhcmR3YXJlIG1vbml0b3JpbmcKKwkgIGNhcGFiaWxpdGllcyBvZiB0aGUgZm9sbG93aW5nIE1heGltIFN5c3RlbSBNYW5hZ2VyIGNoaXBzLgorCSAgICBNQVgxNjA2NQorCSAgICBNQVgxNjA2NgorCSAgICBNQVgxNjA2NworCSAgICBNQVgxNjA2OAorCSAgICBNQVgxNjA3MAorCSAgICBNQVgxNjA3MQorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtYXgxNjA2NS4KKworY29uZmlnIFNFTlNPUlNfTUFYMTYxOQorCXRyaXN0YXRlICJNYXhpbSBNQVgxNjE5IHNlbnNvciBjaGlwIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE1BWDE2MTkgc2Vuc29yIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1heDE2MTkuCisKK2NvbmZpZyBTRU5TT1JTX01BWDE2NjgKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYMTY2OCBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTUFYMTY2OCwgTUFYMTk4OSBhbmQKKwkgIE1BWDE4MDUgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1heDE2NjguCisKK2NvbmZpZyBTRU5TT1JTX01BWDE5NworCXRyaXN0YXRlICJNYXhpbSBNQVgxOTcgYW5kIGNvbXBhdGlibGVzIgorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHRoZSBNYXhpbSBNQVgxOTcgQS9EIGNvbnZlcnRlci4KKwkgIFN1cHBvcnQgd2lsbCBpbmNsdWRlLCBidXQgbm90IGJlIGxpbWl0ZWQgdG8sIE1BWDE5NywgYW5kIE1BWDE5OS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtYXgxOTcuCisKK2NvbmZpZyBTRU5TT1JTX01BWDY2MzkKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYNjYzOSBzZW5zb3IgY2hpcCIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgTUFYNjYzOQorCSAgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtYXg2NjM5LgorCitjb25maWcgU0VOU09SU19NQVg2NjQyCisJdHJpc3RhdGUgIk1heGltIE1BWDY2NDIgc2Vuc29yIGNoaXAiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTUFYNjY0MiBzZW5zb3IgY2hpcC4KKwkgIE1BWDY2NDIgaXMgYSBTTUJ1cy1Db21wYXRpYmxlIFJlbW90ZS9Mb2NhbCBUZW1wZXJhdHVyZSBTZW5zb3IKKwkgIHdpdGggT3ZlcnRlbXBlcmF0dXJlIEFsYXJtIGZyb20gTWF4aW0uCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1heDY2NDIuCisKK2NvbmZpZyBTRU5TT1JTX01BWDY2NTAKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYNjY1MCBzZW5zb3IgY2hpcCIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgTUFYNjY1MCAvIE1BWDY2NTEKKwkgIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWF4NjY1MC4KKworY29uZmlnIFNFTlNPUlNfTUFYNjY5NworCXRyaXN0YXRlICJNYXhpbSBNQVg2Njk3IGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBNQVg2NTgxLCBNQVg2NjAyLCBNQVg2NjIyLAorCSAgTUFYNjYzNiwgTUFYNjY4OSwgTUFYNjY5MywgTUFYNjY5NCwgTUFYNjY5NywgTUFYNjY5OCwgYW5kIE1BWDY2OTkKKwkgIHRlbXBlcmF0dXJlIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWF4NjY5Ny4KKworY29uZmlnIFNFTlNPUlNfSFRVMjEKKwl0cmlzdGF0ZSAiTWVhc3VyZW1lbnQgU3BlY2lhbHRpZXMgSFRVMjFEIGh1bWlkaXR5L3RlbXBlcmF0dXJlIHNlbnNvcnMiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE1lYXN1cmVtZW50IFNwZWNpYWx0aWVzCisJICBIVFUyMUQgaHVtaWRpdHkgYW5kIHRlbXBlcmF0dXJlIHNlbnNvcnMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGh0dTIxLgorCitjb25maWcgU0VOU09SU19NQ1AzMDIxCisJdHJpc3RhdGUgIk1pY3JvY2hpcCBNQ1AzMDIxIGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBNQ1AzMDIxIGFuZCBNQ1AzMjIxLgorCSAgVGhlIE1DUDMwMjEgaXMgYSBBL0QgY29udmVydGVyIChBREMpIHdpdGggMTAtYml0IGFuZCB0aGUgTUNQMzIyMQorCSAgd2l0aCAxMi1iaXQgcmVzb2x1dGlvbi4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWNwMzAyMS4KKworY29uZmlnIFNFTlNPUlNfQURDWFgKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBBREN4eHhTeHh4IgorCWRlcGVuZHMgb24gU1BJX01BU1RFUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcgorCSAgQURDPGJiPjxjPlM8c3NzPiBjaGlwIGZhbWlseSwgd2hlcmUKKwkgICogYmIgIGlzIHRoZSByZXNvbHV0aW9uIGluIG51bWJlciBvZiBiaXRzICg4LCAxMCwgMTIpCisJICAqIGMgICBpcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzICgxLCAyLCA0LCA4KQorCSAgKiBzc3MgaXMgdGhlIG1heGltdW0gY29udmVyc2lvbiBzcGVlZCAoMDIxIGZvciAyMDAga1NQUywgMDUxIGZvciA1MDAKKwkgICAga1NQUyBhbmQgMTAxIGZvciAxIE1TUFMpCisKKwkgIEV4YW1wbGVzIDogQURDMDgxUzEwMSwgQURDMTI0UzUwMSwgLi4uCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFkY3h4LgorCiBjb25maWcgU0VOU09SU19MTTYzCiAJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE02MyBhbmQgY29tcGF0aWJsZXMiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTc3Niw1MCArOTk0LDYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGxtOTMuCiAKLWNvbmZpZyBTRU5TT1JTX0xUQzQxNTEKLQl0cmlzdGF0ZSAiTGluZWFyIFRlY2hub2xvZ3kgTFRDNDE1MSIKLQlkZXBlbmRzIG9uIEkyQwotCWRlZmF1bHQgbgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MTUxCi0JICBIaWdoIFZvbHRhZ2UgSTJDIEN1cnJlbnQgYW5kIFZvbHRhZ2UgTW9uaXRvciBpbnRlcmZhY2UuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgbHRjNDE1MS4KLQotY29uZmlnIFNFTlNPUlNfTFRDNDIxNQotCXRyaXN0YXRlICJMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjE1IgotCWRlcGVuZHMgb24gSTJDCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIExpbmVhciBUZWNobm9sb2d5IExUQzQyMTUKLQkgIEhvdCBTd2FwIENvbnRyb2xsZXIgSTJDIGludGVyZmFjZS4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKLQkgIGJlIGNhbGxlZCBsdGM0MjE1LgotCi1jb25maWcgU0VOU09SU19MVEM0MjQ1Ci0JdHJpc3RhdGUgIkxpbmVhciBUZWNobm9sb2d5IExUQzQyNDUiCi0JZGVwZW5kcyBvbiBJMkMKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDNDI0NQotCSAgTXVsdGlwbGUgU3VwcGx5IEhvdCBTd2FwIENvbnRyb2xsZXIgSTJDIGludGVyZmFjZS4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKLQkgIGJlIGNhbGxlZCBsdGM0MjQ1LgotCi1jb25maWcgU0VOU09SU19MVEM0MjYxCi0JdHJpc3RhdGUgIkxpbmVhciBUZWNobm9sb2d5IExUQzQyNjEiCi0JZGVwZW5kcyBvbiBJMkMKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDNDI2MQotCSAgTmVnYXRpdmUgVm9sdGFnZSBIb3QgU3dhcCBDb250cm9sbGVyIEkyQyBpbnRlcmZhY2UuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgbHRjNDI2MS4KLQogY29uZmlnIFNFTlNPUlNfTE05NTIzNAogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTUyMzQiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTg0OSwxNDAgKzEwMjMsNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgbG05NTI0NS4KIAotY29uZmlnIFNFTlNPUlNfTUFYMTExMQotCXRyaXN0YXRlICJNYXhpbSBNQVgxMTExIFNlcmlhbCA4LWJpdCBBREMgY2hpcCBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiBTUElfTUFTVEVSCi0JaGVscAotCSAgU2F5IHkgaGVyZSB0byBzdXBwb3J0IE1heGltJ3MgTUFYMTExMCwgTUFYMTExMSwgTUFYMTExMiwgYW5kIE1BWDExMTMKLQkgIEFEQyBjaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgbWF4MTExMS4KLQotY29uZmlnIFNFTlNPUlNfTUFYMTYwNjUKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYMTYwNjUgU3lzdGVtIE1hbmFnZXIgYW5kIGNvbXBhdGlibGVzIgotCWRlcGVuZHMgb24gSTJDCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIGhhcmR3YXJlIG1vbml0b3JpbmcKLQkgIGNhcGFiaWxpdGllcyBvZiB0aGUgZm9sbG93aW5nIE1heGltIFN5c3RlbSBNYW5hZ2VyIGNoaXBzLgotCSAgICBNQVgxNjA2NQotCSAgICBNQVgxNjA2NgotCSAgICBNQVgxNjA2NwotCSAgICBNQVgxNjA2OAotCSAgICBNQVgxNjA3MAotCSAgICBNQVgxNjA3MQotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBtYXgxNjA2NS4KLQotY29uZmlnIFNFTlNPUlNfTUFYMTYxOQotCXRyaXN0YXRlICJNYXhpbSBNQVgxNjE5IHNlbnNvciBjaGlwIgotCWRlcGVuZHMgb24gSTJDCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE1BWDE2MTkgc2Vuc29yIGNoaXAuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIG1heDE2MTkuCi0KLWNvbmZpZyBTRU5TT1JTX01BWDE2NjgKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYMTY2OCBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiBJMkMKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTUFYMTY2OCwgTUFYMTk4OSBhbmQKLQkgIE1BWDE4MDUgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIG1heDE2NjguCi0KLWNvbmZpZyBTRU5TT1JTX01BWDE5NwotCXRyaXN0YXRlICJNYXhpbSBNQVgxOTcgYW5kIGNvbXBhdGlibGVzIgotCWhlbHAKLQkgIFN1cHBvcnQgZm9yIHRoZSBNYXhpbSBNQVgxOTcgQS9EIGNvbnZlcnRlci4KLQkgIFN1cHBvcnQgd2lsbCBpbmNsdWRlLCBidXQgbm90IGJlIGxpbWl0ZWQgdG8sIE1BWDE5NywgYW5kIE1BWDE5OS4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBtYXgxOTcuCi0KLWNvbmZpZyBTRU5TT1JTX01BWDY2MzkKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYNjYzOSBzZW5zb3IgY2hpcCIKLQlkZXBlbmRzIG9uIEkyQwotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgTUFYNjYzOQotCSAgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBtYXg2NjM5LgotCi1jb25maWcgU0VOU09SU19NQVg2NjQyCi0JdHJpc3RhdGUgIk1heGltIE1BWDY2NDIgc2Vuc29yIGNoaXAiCi0JZGVwZW5kcyBvbiBJMkMKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTUFYNjY0MiBzZW5zb3IgY2hpcC4KLQkgIE1BWDY2NDIgaXMgYSBTTUJ1cy1Db21wYXRpYmxlIFJlbW90ZS9Mb2NhbCBUZW1wZXJhdHVyZSBTZW5zb3IKLQkgIHdpdGggT3ZlcnRlbXBlcmF0dXJlIEFsYXJtIGZyb20gTWF4aW0uCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIG1heDY2NDIuCi0KLWNvbmZpZyBTRU5TT1JTX01BWDY2NTAKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYNjY1MCBzZW5zb3IgY2hpcCIKLQlkZXBlbmRzIG9uIEkyQwotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgTUFYNjY1MCAvIE1BWDY2NTEKLQkgIHNlbnNvciBjaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgbWF4NjY1MC4KLQotY29uZmlnIFNFTlNPUlNfTUFYNjY5NwotCXRyaXN0YXRlICJNYXhpbSBNQVg2Njk3IGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQwotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBNQVg2NTgxLCBNQVg2NjAyLCBNQVg2NjIyLAotCSAgTUFYNjYzNiwgTUFYNjY4OSwgTUFYNjY5MywgTUFYNjY5NCwgTUFYNjY5NywgTUFYNjY5OCwgYW5kIE1BWDY2OTkKLQkgIHRlbXBlcmF0dXJlIHNlbnNvciBjaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgbWF4NjY5Ny4KLQotY29uZmlnIFNFTlNPUlNfTUNQMzAyMQotCXRyaXN0YXRlICJNaWNyb2NoaXAgTUNQMzAyMSBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiBJMkMKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTUNQMzAyMSBhbmQgTUNQMzIyMS4KLQkgIFRoZSBNQ1AzMDIxIGlzIGEgQS9EIGNvbnZlcnRlciAoQURDKSB3aXRoIDEwLWJpdCBhbmQgdGhlIE1DUDMyMjEKLQkgIHdpdGggMTItYml0IHJlc29sdXRpb24uCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIG1jcDMwMjEuCi0KLWNvbmZpZyBTRU5TT1JTX05DVDY3NzUKLQl0cmlzdGF0ZSAiTnV2b3RvbiBOQ1Q2Nzc1RiBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiAhUFBDCi0Jc2VsZWN0IEhXTU9OX1ZJRAotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaGFyZHdhcmUgbW9uaXRvcmluZwotCSAgZnVuY3Rpb25hbGl0eSBvZiB0aGUgTnV2b3RvbiBOQ1Q2Nzc1RiwgTkNUNjc3NkYsIE5DVDY3NzlECi0JICBhbmQgY29tcGF0aWJsZSBTdXBlci1JL08gY2hpcHMuIFRoaXMgZHJpdmVyIHJlcGxhY2VzIHRoZQotCSAgdzgzNjI3ZWhmIGRyaXZlciBmb3IgTkNUNjc3NUYgYW5kIE5DVDY3NzZGLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBuY3Q2Nzc1LgotCi1jb25maWcgU0VOU09SU19OVENfVEhFUk1JU1RPUgotCXRyaXN0YXRlICJOVEMgdGhlcm1pc3RvciBzdXBwb3J0IgotCWRlcGVuZHMgb24gKCFPRiAmJiAhSUlPKSB8fCAoT0YgJiYgSUlPKQotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE5UQyB0aGVybWlzdG9ycyBzZW5zb3IgcmVhZGluZyBhbmQgaXRzCi0JICBpbnRlcnByZXRhdGlvbi4gVGhlIGRyaXZlciBjYW4gYWxzbyBtb25pdG9yIHRoZSB0ZW1wZXJhdHVyZSBhbmQKLQkgIHNlbmQgbm90aWZpY2F0aW9ucyBhYm91dCB0aGUgdGVtcGVyYXR1cmUuCi0KLQkgIEN1cnJlbnRseSwgdGhpcyBkcml2ZXIgc3VwcG9ydHMKLQkgIE5DUDE1V0I0NzMsIE5DUDE4V0I0NzMsIE5DUDIxV0I0NzMsIE5DUDAzV0I0NzMsIGFuZCBOQ1AxNVdMMzMzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBudGMtdGhlcm1pc3Rvci4KLQogY29uZmlnIFNFTlNPUlNfUEM4NzM2MAogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIFBDODczNjAgZmFtaWx5IgogCWRlcGVuZHMgb24gIVBQQwpAQCAtMTAxMSw2ICsxMDUxLDMzIEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBwYzg3NDI3LgogCitjb25maWcgU0VOU09SU19OVENfVEhFUk1JU1RPUgorCXRyaXN0YXRlICJOVEMgdGhlcm1pc3RvciBzdXBwb3J0IgorCWRlcGVuZHMgb24gKCFPRiAmJiAhSUlPKSB8fCAoT0YgJiYgSUlPKQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE5UQyB0aGVybWlzdG9ycyBzZW5zb3IgcmVhZGluZyBhbmQgaXRzCisJICBpbnRlcnByZXRhdGlvbi4gVGhlIGRyaXZlciBjYW4gYWxzbyBtb25pdG9yIHRoZSB0ZW1wZXJhdHVyZSBhbmQKKwkgIHNlbmQgbm90aWZpY2F0aW9ucyBhYm91dCB0aGUgdGVtcGVyYXR1cmUuCisKKwkgIEN1cnJlbnRseSwgdGhpcyBkcml2ZXIgc3VwcG9ydHMKKwkgIE5DUDE1V0I0NzMsIE5DUDE4V0I0NzMsIE5DUDIxV0I0NzMsIE5DUDAzV0I0NzMsIGFuZCBOQ1AxNVdMMzMzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBudGMtdGhlcm1pc3Rvci4KKworY29uZmlnIFNFTlNPUlNfTkNUNjc3NQorCXRyaXN0YXRlICJOdXZvdG9uIE5DVDY3NzVGIGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uICFQUEMKKwlzZWxlY3QgSFdNT05fVklECisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBoYXJkd2FyZSBtb25pdG9yaW5nCisJICBmdW5jdGlvbmFsaXR5IG9mIHRoZSBOdXZvdG9uIE5DVDY3NzVGLCBOQ1Q2Nzc2RiwgTkNUNjc3OUQKKwkgIGFuZCBjb21wYXRpYmxlIFN1cGVyLUkvTyBjaGlwcy4gVGhpcyBkcml2ZXIgcmVwbGFjZXMgdGhlCisJICB3ODM2MjdlaGYgZHJpdmVyIGZvciBOQ1Q2Nzc1RiBhbmQgTkNUNjc3NkYuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG5jdDY3NzUuCisKIGNvbmZpZyBTRU5TT1JTX1BDRjg1OTEKIAl0cmlzdGF0ZSAiUGhpbGlwcyBQQ0Y4NTkxIEFEQy9EQUMiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTEwNzQsMjEgKzExNDEsNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgc2lzNTU5NS4KIAotY29uZmlnIFNFTlNPUlNfU01NNjY1Ci0JdHJpc3RhdGUgIlN1bW1pdCBNaWNyb2VsZWN0cm9uaWNzIFNNTTY2NSIKLQlkZXBlbmRzIG9uIEkyQwotCWRlZmF1bHQgbgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaGFyZHdhcmUgbW9uaXRvcmluZwotCSAgZmVhdHVyZXMgb2YgdGhlIFN1bW1pdCBNaWNyb2VsZWN0cm9uaWNzIFNNTTY2NS9TTU02NjVCIFNpeC1DaGFubmVsCi0JICBBY3RpdmUgREMgT3V0cHV0IENvbnRyb2xsZXIgLyBNb25pdG9yLgotCi0JICBPdGhlciBzdXBwb3J0ZWQgY2hpcHMgYXJlIFNNTTQ2NSwgU01NNjY1QywgU01NNzY0LCBhbmQgU01NNzY2LgotCSAgU3VwcG9ydCBmb3IgdGhvc2UgY2hpcHMgaXMgdW50ZXN0ZWQuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgc21tNjY1LgotCiBjb25maWcgU0VOU09SU19ETUUxNzM3CiAJdHJpc3RhdGUgIlNNU0MgRE1FMTczNywgU0NIMzExeCBhbmQgY29tcGF0aWJsZXMiCiAJZGVwZW5kcyBvbiBJMkMgJiYgIVBQQwpAQCAtMTIxMCw2ICsxMjYyLDMxIEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBzY2g1NjM2LgogCitjb25maWcgU0VOU09SU19TTU02NjUKKwl0cmlzdGF0ZSAiU3VtbWl0IE1pY3JvZWxlY3Ryb25pY3MgU01NNjY1IgorCWRlcGVuZHMgb24gSTJDCisJZGVmYXVsdCBuCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBoYXJkd2FyZSBtb25pdG9yaW5nCisJICBmZWF0dXJlcyBvZiB0aGUgU3VtbWl0IE1pY3JvZWxlY3Ryb25pY3MgU01NNjY1L1NNTTY2NUIgU2l4LUNoYW5uZWwKKwkgIEFjdGl2ZSBEQyBPdXRwdXQgQ29udHJvbGxlciAvIE1vbml0b3IuCisKKwkgIE90aGVyIHN1cHBvcnRlZCBjaGlwcyBhcmUgU01NNDY1LCBTTU02NjVDLCBTTU03NjQsIGFuZCBTTU03NjYuCisJICBTdXBwb3J0IGZvciB0aG9zZSBjaGlwcyBpcyB1bnRlc3RlZC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBzbW02NjUuCisKK2NvbmZpZyBTRU5TT1JTX0FEQzEyOEQ4MTgKKwl0cmlzdGF0ZSAiVGV4YXMgSW5zdHJ1bWVudHMgQURDMTI4RDgxOCIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgVGV4YXMgSW5zdHJ1bWVudHMKKwkgIEFEQzEyOEQ4MTggU3lzdGVtIE1vbml0b3Igd2l0aCBUZW1wZXJhdHVyZSBTZW5zb3IgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhZGMxMjhkODE4LgorCiBjb25maWcgU0VOU09SU19BRFMxMDE1CiAJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIEFEUzEwMTUiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTE1MjUsMzcgKzE2MDIsNiBAQAogCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIFVsdHJhNDUgd29ya3N0YXRpb24gZW52aXJvbm1lbnRhbAogCSAgc2Vuc29ycy4KIAotY29uZmlnIFNFTlNPUlNfQVBQTEVTTUMKLQl0cmlzdGF0ZSAiQXBwbGUgU01DIChNb3Rpb24gc2Vuc29yLCBsaWdodCBzZW5zb3IsIGtleWJvYXJkIGJhY2tsaWdodCkiCi0JZGVwZW5kcyBvbiBJTlBVVCAmJiBYODYKLQlzZWxlY3QgTkVXX0xFRFMKLQlzZWxlY3QgTEVEU19DTEFTUwotCXNlbGVjdCBJTlBVVF9QT0xMREVWCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIEFwcGxlIFN5c3RlbSBNYW5hZ2VtZW50Ci0JICBDb250cm9sbGVyLCB3aGljaCBwcm92aWRlcyBhbiBhY2NlbGVyb21ldGVyIChBcHBsZSBTdWRkZW4gTW90aW9uCi0JICBTZW5zb3IpLCBsaWdodCBzZW5zb3JzLCB0ZW1wZXJhdHVyZSBzZW5zb3JzLCBrZXlib2FyZCBiYWNrbGlnaHQKLQkgIGNvbnRyb2wgYW5kIGZhbiBjb250cm9sLgotCi0JICBPbmx5IEludGVsLWJhc2VkIEFwcGxlJ3MgY29tcHV0ZXJzIGFyZSBzdXBwb3J0ZWQgKE1hY0Jvb2sgUHJvLAotCSAgTWFjQm9vaywgTWFjTWluaSkuCi0KLQkgIERhdGEgZnJvbSB0aGUgZGlmZmVyZW50IHNlbnNvcnMsIGtleWJvYXJkIGJhY2tsaWdodCBjb250cm9sIGFuZCBmYW4KLQkgIGNvbnRyb2wgYXJlIGFjY2Vzc2libGUgdmlhIHN5c2ZzLgotCi0JICBUaGlzIGRyaXZlciBhbHNvIHByb3ZpZGVzIGFuIGFic29sdXRlIGlucHV0IGNsYXNzIGRldmljZSwgYWxsb3dpbmcKLQkgIHRoZSBsYXB0b3AgdG8gYWN0IGFzIGEgcGluYmFsbCBtYWNoaW5lLWVzcXVlIGpveXN0aWNrLgotCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIGFwcGxpY2FibGUgbGFwdG9wIGFuZCB3YW50IHRvIGV4cGVyaWVuY2UKLQkgIHRoZSBhd2Vzb21lIHBvd2VyIG9mIGFwcGxlc21jLgotCi1jb25maWcgU0VOU09SU19NQzEzNzgzX0FEQwotICAgICAgICB0cmlzdGF0ZSAiRnJlZXNjYWxlIE1DMTM3ODMvTUMxMzg5MiBBREMiCi0gICAgICAgIGRlcGVuZHMgb24gTUZEX01DMTNYWFgKLSAgICAgICAgaGVscAotICAgICAgICAgIFN1cHBvcnQgZm9yIHRoZSBBL0QgY29udmVydGVyIG9uIE1DMTM3ODMgYW5kIE1DMTM4OTIgUE1JQy4KLQogaWYgQUNQSQogCiBjb21tZW50ICJBQ1BJIGRyaXZlcnMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQppbmRleCBlYzdjZGUwLi5jNDhmOTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKQEAgLTI1LDYgKzI1LDcgQEAKIG9iai0kKENPTkZJR19TRU5TT1JTX0FENzMxNCkJKz0gYWQ3MzE0Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0FENzQxNCkJKz0gYWQ3NDE0Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0FENzQxOCkJKz0gYWQ3NDE4Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0FEQzEyOEQ4MTgpICs9IGFkYzEyOGQ4MTgubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQURDWFgpCSs9IGFkY3h4Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0FETTEwMjEpCSs9IGFkbTEwMjEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQURNMTAyNSkJKz0gYWRtMTAyNS5vCkBAIC05NSw5ICs5NiwxMiBAQAogb2JqLSQoQ09ORklHX1NFTlNPUlNfTE05NTIzNCkJKz0gbG05NTIzNC5vCiBvYmotJChDT05GSUdfU0VOU09SU19MTTk1MjQxKQkrPSBsbTk1MjQxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xNOTUyNDUpCSs9IGxtOTUyNDUubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTFRDMjk0NSkJKz0gbHRjMjk0NS5vCiBvYmotJChDT05GSUdfU0VOU09SU19MVEM0MTUxKQkrPSBsdGM0MTUxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xUQzQyMTUpCSs9IGx0YzQyMTUubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTFRDNDIyMikJKz0gbHRjNDIyMi5vCiBvYmotJChDT05GSUdfU0VOU09SU19MVEM0MjQ1KQkrPSBsdGM0MjQ1Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xUQzQyNjApCSs9IGx0YzQyNjAubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTFRDNDI2MSkJKz0gbHRjNDI2MS5vCiBvYmotJChDT05GSUdfU0VOU09SU19NQVgxMTExKQkrPSBtYXgxMTExLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX01BWDE2MDY1KQkrPSBtYXgxNjA2NS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkYzEyOGQ4MTguYyBiL2RyaXZlcnMvaHdtb24vYWRjMTI4ZDgxOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZmQ4MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL2FkYzEyOGQ4MTguYwpAQCAtMCwwICsxLDQ5MSBAQAorLyoKKyAqIERyaXZlciBmb3IgVEkgQURDMTI4RDgxOCBTeXN0ZW0gTW9uaXRvciB3aXRoIFRlbXBlcmF0dXJlIFNlbnNvcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBHdWVudGVyIFJvZWNrCisgKgorICogRGVyaXZlZCBmcm9tIGxtODAuYworICogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5ICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+CisgKgkJCSAgICAgYW5kIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKKy8qIEFkZHJlc3NlcyB0byBzY2FuCisgKiBUaGUgY2hpcCBhbHNvIHN1cHBvcnRzIGFkZHJlc3NlcyAweDM1Li4weDM3LiBEb24ndCBzY2FuIHRob3NlIGFkZHJlc3NlcworICogc2luY2UgdGhleSBhcmUgYWxzbyB1c2VkIGJ5IHNvbWUgRUVQUk9Ncywgd2hpY2ggbWF5IHJlc3VsdCBpbiBmYWxzZQorICogcG9zaXRpdmVzLgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geworCTB4MWQsIDB4MWUsIDB4MWYsIDB4MmQsIDB4MmUsIDB4MmYsIEkyQ19DTElFTlRfRU5EIH07CisKKy8qIHJlZ2lzdGVycyAqLworI2RlZmluZSBBREMxMjhfUkVHX0lOX01BWChucikJCSgweDJhICsgKG5yKSAqIDIpCisjZGVmaW5lIEFEQzEyOF9SRUdfSU5fTUlOKG5yKQkJKDB4MmIgKyAobnIpICogMikKKyNkZWZpbmUgQURDMTI4X1JFR19JTihucikJCSgweDIwICsgKG5yKSkKKworI2RlZmluZSBBREMxMjhfUkVHX1RFTVAJCQkweDI3CisjZGVmaW5lIEFEQzEyOF9SRUdfVEVNUF9NQVgJCTB4MzgKKyNkZWZpbmUgQURDMTI4X1JFR19URU1QX0hZU1QJCTB4MzkKKworI2RlZmluZSBBREMxMjhfUkVHX0NPTkZJRwkJMHgwMAorI2RlZmluZSBBREMxMjhfUkVHX0FMQVJNCQkweDAxCisjZGVmaW5lIEFEQzEyOF9SRUdfTUFTSwkJCTB4MDMKKyNkZWZpbmUgQURDMTI4X1JFR19DT05WX1JBVEUJCTB4MDcKKyNkZWZpbmUgQURDMTI4X1JFR19PTkVTSE9UCQkweDA5CisjZGVmaW5lIEFEQzEyOF9SRUdfU0hVVERPV04JCTB4MGEKKyNkZWZpbmUgQURDMTI4X1JFR19DT05GSUdfQURWCQkweDBiCisjZGVmaW5lIEFEQzEyOF9SRUdfQlVTWV9TVEFUVVMJCTB4MGMKKworI2RlZmluZSBBREMxMjhfUkVHX01BTl9JRAkJMHgzZQorI2RlZmluZSBBREMxMjhfUkVHX0RFVl9JRAkJMHgzZgorCitzdHJ1Y3QgYWRjMTI4X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yOworCWludCB2cmVmOwkJLyogUmVmZXJlbmNlIHZvbHRhZ2UgaW4gbVYgKi8KKwlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CisJYm9vbCB2YWxpZDsJCS8qIHRydWUgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCisJdTE2IGluWzNdWzddOwkJLyogUmVnaXN0ZXIgdmFsdWUsIG5vcm1hbGl6ZWQgdG8gMTIgYml0CisJCQkJICogMDogaW5wdXQgdm9sdGFnZQorCQkJCSAqIDE6IG1pbiBsaW1pdAorCQkJCSAqIDI6IG1heCBsaW1pdAorCQkJCSAqLworCXMxNiB0ZW1wWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUsIG5vcm1hbGl6ZWQgdG8gOSBiaXQKKwkJCQkgKiAwOiBzZW5zb3IgMTogbGltaXQgMjogaHlzdAorCQkJCSAqLworCXU4IGFsYXJtczsJCS8qIGFsYXJtIHJlZ2lzdGVyIHZhbHVlICovCit9OworCitzdGF0aWMgc3RydWN0IGFkYzEyOF9kYXRhICphZGMxMjhfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFkYzEyOF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlzdHJ1Y3QgYWRjMTI4X2RhdGEgKnJldCA9IGRhdGE7CisJaW50IGksIHJ2OworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFopIHx8ICFkYXRhLT52YWxpZCkgeworCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCQlydiA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsCisJCQkJCQkJIEFEQzEyOF9SRUdfSU4oaSkpOworCQkJaWYgKHJ2IDwgMCkKKwkJCQlnb3RvIGFib3J0OworCQkJZGF0YS0+aW5bMF1baV0gPSBydiA+PiA0OworCisJCQlydiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQkgICAgICBBREMxMjhfUkVHX0lOX01JTihpKSk7CisJCQlpZiAocnYgPCAwKQorCQkJCWdvdG8gYWJvcnQ7CisJCQlkYXRhLT5pblsxXVtpXSA9IHJ2IDw8IDQ7CisKKwkJCXJ2ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCSAgICAgIEFEQzEyOF9SRUdfSU5fTUFYKGkpKTsKKwkJCWlmIChydiA8IDApCisJCQkJZ290byBhYm9ydDsKKwkJCWRhdGEtPmluWzJdW2ldID0gcnYgPDwgNDsKKwkJfQorCisJCXJ2ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgQURDMTI4X1JFR19URU1QKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCWdvdG8gYWJvcnQ7CisJCWRhdGEtPnRlbXBbMF0gPSBydiA+PiA3OworCisJCXJ2ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURDMTI4X1JFR19URU1QX01BWCk7CisJCWlmIChydiA8IDApCisJCQlnb3RvIGFib3J0OworCQlkYXRhLT50ZW1wWzFdID0gcnYgPDwgMTsKKworCQlydiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEQzEyOF9SRUdfVEVNUF9IWVNUKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCWdvdG8gYWJvcnQ7CisJCWRhdGEtPnRlbXBbMl0gPSBydiA8PCAxOworCisJCXJ2ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURDMTI4X1JFR19BTEFSTSk7CisJCWlmIChydiA8IDApCisJCQlnb3RvIGFib3J0OworCQlkYXRhLT5hbGFybXMgfD0gcnY7CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSB0cnVlOworCX0KKwlnb3RvIGRvbmU7CisKK2Fib3J0OgorCXJldCA9IEVSUl9QVFIocnYpOworCWRhdGEtPnZhbGlkID0gZmFsc2U7Citkb25lOgorCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkYzEyOF9zaG93X2luKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGFkYzEyOF9kYXRhICpkYXRhID0gYWRjMTI4X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0ciktPm5yOworCWludCB2YWw7CisKKwlpZiAoSVNfRVJSKGRhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKKworCXZhbCA9IERJVl9ST1VORF9DTE9TRVNUKGRhdGEtPmluW2luZGV4XVtucl0gKiBkYXRhLT52cmVmLCA0MDk1KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRjMTI4X3NldF9pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYWRjMTI4X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0ciktPm5yOworCXU4IHJlZywgcmVndmFsOworCWxvbmcgdmFsOworCWludCBlcnI7CisKKwllcnIgPSBrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCS8qIDEwIG1WIExTQiBvbiBsaW1pdCByZWdpc3RlcnMgKi8KKwlyZWd2YWwgPSBjbGFtcF92YWwoRElWX1JPVU5EX0NMT1NFU1QodmFsLCAxMCksIDAsIDI1NSk7CisJZGF0YS0+aW5baW5kZXhdW25yXSA9IHJlZ3ZhbCA8PCA0OworCXJlZyA9IGluZGV4ID09IDEgPyBBREMxMjhfUkVHX0lOX01JTihucikgOiBBREMxMjhfUkVHX0lOX01BWChucik7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIHJlZywgcmVndmFsKTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgYWRjMTI4X3Nob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRjMTI4X2RhdGEgKmRhdGEgPSBhZGMxMjhfdXBkYXRlX2RldmljZShkZXYpOworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJaW50IHRlbXA7CisKKwlpZiAoSVNfRVJSKGRhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKKworCXRlbXAgPSAoZGF0YS0+dGVtcFtpbmRleF0gPDwgNykgPj4gNzsJLyogc2lnbiBleHRlbmQgKi8KKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCAqIDUwMCk7LyogMC41IGRlZ3JlZXMgQyByZXNvbHV0aW9uICovCit9CisKK3N0YXRpYyBzc2l6ZV90IGFkYzEyOF9zZXRfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGFkYzEyOF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlsb25nIHZhbDsKKwlpbnQgZXJyOworCXM4IHJlZ3ZhbDsKKworCWVyciA9IGtzdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmVndmFsID0gY2xhbXBfdmFsKERJVl9ST1VORF9DTE9TRVNUKHZhbCwgMTAwMCksIC0xMjgsIDEyNyk7CisJZGF0YS0+dGVtcFtpbmRleF0gPSByZWd2YWwgPDwgMTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQkgIGluZGV4ID09IDEgPyBBREMxMjhfUkVHX1RFTVBfTUFYCisJCQkJCSAgICAgOiBBREMxMjhfUkVHX1RFTVBfSFlTVCwKKwkJCQkgIHJlZ3ZhbCk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkYzEyOF9zaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRjMTI4X2RhdGEgKmRhdGEgPSBhZGMxMjhfdXBkYXRlX2RldmljZShkZXYpOworCWludCBtYXNrID0gMSA8PCB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXU4IGFsYXJtczsKKworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOworCisJLyoKKwkgKiBDbGVhciBhbiBhbGFybSBhZnRlciByZXBvcnRpbmcgaXQgdG8gdXNlciBzcGFjZS4gSWYgaXQgaXMgc3RpbGwKKwkgKiBhY3RpdmUsIHRoZSBuZXh0IHVwZGF0ZSBzZXF1ZW5jZSB3aWxsIHNldCB0aGUgYWxhcm0gYml0IGFnYWluLgorCSAqLworCWFsYXJtcyA9IGRhdGEtPmFsYXJtczsKKwlkYXRhLT5hbGFybXMgJj0gfm1hc2s7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgISEoYWxhcm1zICYgbWFzaykpOworfQorCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4wX2lucHV0LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgMCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4wX21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDAsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMF9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCAwLCAyKTsKKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMV9pbnB1dCwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDEsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMV9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCAxLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgMSwgMik7CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjJfaW5wdXQsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCAyLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjJfbWluLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgMiwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4yX21heCwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDIsIDIpOworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4zX2lucHV0LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgMywgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4zX21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDMsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluM19tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCAzLCAyKTsKKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluNF9pbnB1dCwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDQsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluNF9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCA0LCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjRfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgNCwgMik7CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjVfaW5wdXQsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCA1LCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjVfbWluLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgNSwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW41X21heCwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDUsIDIpOworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW42X2lucHV0LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgNiwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW42X21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDYsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluNl9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCA2LCAyKTsKKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgYWRjMTI4X3Nob3dfdGVtcCwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgIGFkYzEyOF9zaG93X3RlbXAsIGFkYzEyOF9zZXRfdGVtcCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgYWRjMTI4X3Nob3dfdGVtcCwgYWRjMTI4X3NldF90ZW1wLCAyKTsKKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjBfYWxhcm0sIFNfSVJVR08sIGFkYzEyOF9zaG93X2FsYXJtLCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX2FsYXJtLCBTX0lSVUdPLCBhZGMxMjhfc2hvd19hbGFybSwgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9hbGFybSwgU19JUlVHTywgYWRjMTI4X3Nob3dfYWxhcm0sIE5VTEwsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjNfYWxhcm0sIFNfSVJVR08sIGFkYzEyOF9zaG93X2FsYXJtLCBOVUxMLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW40X2FsYXJtLCBTX0lSVUdPLCBhZGMxMjhfc2hvd19hbGFybSwgTlVMTCwgNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNV9hbGFybSwgU19JUlVHTywgYWRjMTI4X3Nob3dfYWxhcm0sIE5VTEwsIDUpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjZfYWxhcm0sIFNfSVJVR08sIGFkYzEyOF9zaG93X2FsYXJtLCBOVUxMLCA2KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4X2FsYXJtLCBTX0lSVUdPLCBhZGMxMjhfc2hvd19hbGFybSwgTlVMTCwgNyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGMxMjhfYXR0cnNbXSA9IHsKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNV9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNl9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW40X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjVfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4X2h5c3QuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW40X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjVfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKK0FUVFJJQlVURV9HUk9VUFMoYWRjMTI4KTsKKworc3RhdGljIGludCBhZGMxMjhfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKK3sKKwlpbnQgbWFuX2lkLCBkZXZfaWQ7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKKwkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8CisJCQkJICAgICBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEQzEyOF9SRUdfTUFOX0lEKTsKKwlkZXZfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBREMxMjhfUkVHX0RFVl9JRCk7CisJaWYgKG1hbl9pZCAhPSAweDAxIHx8IGRldl9pZCAhPSAweDA5KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIENoZWNrIHVudXNlZCBiaXRzIGZvciBjb25maXJtYXRpb24gKi8KKwlpZiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURDMTI4X1JFR19DT05GSUcpICYgMHhmNCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEQzEyOF9SRUdfQ09OVl9SQVRFKSAmIDB4ZmUpCisJCXJldHVybiAtRU5PREVWOworCWlmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBREMxMjhfUkVHX09ORVNIT1QpICYgMHhmZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEQzEyOF9SRUdfU0hVVERPV04pICYgMHhmZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEQzEyOF9SRUdfQ09ORklHX0FEVikgJiAweGY4KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURDMTI4X1JFR19CVVNZX1NUQVRVUykgJiAweGZjKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN0cmxjcHkoaW5mby0+dHlwZSwgImFkYzEyOGQ4MTgiLCBJMkNfTkFNRV9TSVpFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYzEyOF9pbml0X2NsaWVudChzdHJ1Y3QgYWRjMTI4X2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlpbnQgZXJyOworCisJLyoKKwkgKiBSZXNldCBjaGlwIHRvIGRlZmF1bHRzLgorCSAqIFRoaXMgbWFrZXMgbW9zdCBvdGhlciBpbml0aWFsaXphdGlvbnMgdW5uZWNlc3NhcnkuCisJICovCisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEQzEyOF9SRUdfQ09ORklHLCAweDgwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogU3RhcnQgbW9uaXRvcmluZyAqLworCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBREMxMjhfUkVHX0NPTkZJRywgMHgwMSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIElmIGV4dGVybmFsIHZyZWYgaXMgc2VsZWN0ZWQsIGNvbmZpZ3VyZSB0aGUgY2hpcCB0byB1c2UgaXQgKi8KKwlpZiAoZGF0YS0+cmVndWxhdG9yKSB7CisJCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJQURDMTI4X1JFR19DT05GSUdfQURWLCAweDAxKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRjMTI4X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OworCXN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvcjsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJc3RydWN0IGFkYzEyOF9kYXRhICpkYXRhOworCWludCBlcnIsIHZyZWY7CisKKwlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBhZGMxMjhfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiB2cmVmIGlzIG9wdGlvbmFsLiBJZiBzcGVjaWZpZWQsIGlzIHVzZWQgYXMgY2hpcCByZWZlcmVuY2Ugdm9sdGFnZSAqLworCXJlZ3VsYXRvciA9IGRldm1fcmVndWxhdG9yX2dldF9vcHRpb25hbChkZXYsICJ2cmVmIik7CisJaWYgKCFJU19FUlIocmVndWxhdG9yKSkgeworCQlkYXRhLT5yZWd1bGF0b3IgPSByZWd1bGF0b3I7CisJCWVyciA9IHJlZ3VsYXRvcl9lbmFibGUocmVndWxhdG9yKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQl2cmVmID0gcmVndWxhdG9yX2dldF92b2x0YWdlKHJlZ3VsYXRvcik7CisJCWlmICh2cmVmIDwgMCkgeworCQkJZXJyID0gdnJlZjsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZGF0YS0+dnJlZiA9IERJVl9ST1VORF9DTE9TRVNUKHZyZWYsIDEwMDApOworCX0gZWxzZSB7CisJCWRhdGEtPnZyZWYgPSAyNTYwOwkvKiAyLjU2ViwgaW4gbVYgKi8KKwl9CisKKwlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CisJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY2hpcCAqLworCWVyciA9IGFkYzEyOF9pbml0X2NsaWVudChkYXRhKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKworCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgY2xpZW50LT5uYW1lLAorCQkJCQkJCSAgIGRhdGEsIGFkYzEyOF9ncm91cHMpOworCWlmIChJU19FUlIoaHdtb25fZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGh3bW9uX2Rldik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWlmIChkYXRhLT5yZWd1bGF0b3IpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGRhdGEtPnJlZ3VsYXRvcik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhZGMxMjhfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFkYzEyOF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpZiAoZGF0YS0+cmVndWxhdG9yKQorCQlyZWd1bGF0b3JfZGlzYWJsZShkYXRhLT5yZWd1bGF0b3IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZGMxMjhfaWRbXSA9IHsKKwl7ICJhZGMxMjhkODE4IiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZGMxMjhfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWRjMTI4X2RyaXZlciA9IHsKKwkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImFkYzEyOGQ4MTgiLAorCX0sCisJLnByb2JlCQk9IGFkYzEyOF9wcm9iZSwKKwkucmVtb3ZlCQk9IGFkYzEyOF9yZW1vdmUsCisJLmlkX3RhYmxlCT0gYWRjMTI4X2lkLAorCS5kZXRlY3QJCT0gYWRjMTI4X2RldGVjdCwKKwkuYWRkcmVzc19saXN0CT0gbm9ybWFsX2kyYywKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKGFkYzEyOF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJHdWVudGVyIFJvZWNrIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgQURDMTI4RDgxOCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9jb3JldGVtcC5jIGIvZHJpdmVycy9od21vbi9jb3JldGVtcC5jCmluZGV4IGJiYjBiMGQuLmYzMWJjNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYworKysgYi9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMKQEAgLTk0LDYgKzk0LDggQEAKIAlib29sIHZhbGlkOwogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZF9hdHRyc1tUT1RBTF9BVFRSU107CiAJY2hhciBhdHRyX25hbWVbVE9UQUxfQVRUUlNdW0NPUkVURU1QX05BTUVfTEVOR1RIXTsKKwlzdHJ1Y3QgYXR0cmlidXRlICphdHRyc1tUT1RBTF9BVFRSUyArIDFdOworCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYXR0cl9ncm91cDsKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CiB9OwogCkBAIC0xMTQsMTIgKzExNiw2IEBACiBzdGF0aWMgTElTVF9IRUFEKHBkZXZfbGlzdCk7CiBzdGF0aWMgREVGSU5FX01VVEVYKHBkZXZfbGlzdF9tdXRleCk7CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQotewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBEUlZOQU1FKTsKLX0KLQogc3RhdGljIHNzaXplX3Qgc2hvd19sYWJlbChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKIHsKQEAgLTM5MywyMCArMzg5LDEwIEBACiAJcmV0dXJuIGFkanVzdF90am1heChjLCBpZCwgZGV2KTsKIH0KIAotc3RhdGljIGludCBjcmVhdGVfbmFtZV9hdHRyKHN0cnVjdCBwbGF0Zm9ybV9kYXRhICpwZGF0YSwKLQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3lzZnNfYXR0cl9pbml0KCZwZGF0YS0+bmFtZV9hdHRyLmF0dHIpOwotCXBkYXRhLT5uYW1lX2F0dHIuYXR0ci5uYW1lID0gIm5hbWUiOwotCXBkYXRhLT5uYW1lX2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTzsKLQlwZGF0YS0+bmFtZV9hdHRyLnNob3cgPSBzaG93X25hbWU7Ci0JcmV0dXJuIGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZwZGF0YS0+bmFtZV9hdHRyKTsKLX0KLQogc3RhdGljIGludCBjcmVhdGVfY29yZV9hdHRycyhzdHJ1Y3QgdGVtcF9kYXRhICp0ZGF0YSwgc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICBpbnQgYXR0cl9ubykKIHsKLQlpbnQgZXJyLCBpOworCWludCBpOwogCXN0YXRpYyBzc2l6ZV90ICgqY29uc3QgcmRfcHRyW1RPVEFMX0FUVFJTXSkgKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpID0gewogCQkJc2hvd19sYWJlbCwgc2hvd19jcml0X2FsYXJtLCBzaG93X3RlbXAsIHNob3dfdGptYXgsCkBAIC00MjQsMTYgKzQxMCwxMCBAQAogCQl0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTzsKIAkJdGRhdGEtPnNkX2F0dHJzW2ldLmRldl9hdHRyLnNob3cgPSByZF9wdHJbaV07CiAJCXRkYXRhLT5zZF9hdHRyc1tpXS5pbmRleCA9IGF0dHJfbm87Ci0JCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZ0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIpOwotCQlpZiAoZXJyKQotCQkJZ290byBleGl0X2ZyZWU7CisJCXRkYXRhLT5hdHRyc1tpXSA9ICZ0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIuYXR0cjsKIAl9Ci0JcmV0dXJuIDA7Ci0KLWV4aXRfZnJlZToKLQl3aGlsZSAoLS1pID49IDApCi0JCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZ0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIpOwotCXJldHVybiBlcnI7CisJdGRhdGEtPmF0dHJfZ3JvdXAuYXR0cnMgPSB0ZGF0YS0+YXR0cnM7CisJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLCAmdGRhdGEtPmF0dHJfZ3JvdXApOwogfQogCiAKQEAgLTU0OCw3ICs1MjgsNyBAQAogCXBkYXRhLT5jb3JlX2RhdGFbYXR0cl9ub10gPSB0ZGF0YTsKIAogCS8qIENyZWF0ZSBzeXNmcyBpbnRlcmZhY2VzICovCi0JZXJyID0gY3JlYXRlX2NvcmVfYXR0cnModGRhdGEsICZwZGV2LT5kZXYsIGF0dHJfbm8pOworCWVyciA9IGNyZWF0ZV9jb3JlX2F0dHJzKHRkYXRhLCBwZGF0YS0+aHdtb25fZGV2LCBhdHRyX25vKTsKIAlpZiAoZXJyKQogCQlnb3RvIGV4aXRfZnJlZTsKIApAQCAtNTczLDE0ICs1NTMsMTIgQEAKIH0KIAogc3RhdGljIHZvaWQgY29yZXRlbXBfcmVtb3ZlX2NvcmUoc3RydWN0IHBsYXRmb3JtX2RhdGEgKnBkYXRhLAotCQkJCXN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGluZHgpCisJCQkJIGludCBpbmR4KQogewotCWludCBpOwogCXN0cnVjdCB0ZW1wX2RhdGEgKnRkYXRhID0gcGRhdGEtPmNvcmVfZGF0YVtpbmR4XTsKIAogCS8qIFJlbW92ZSB0aGUgc3lzZnMgYXR0cmlidXRlcyAqLwotCWZvciAoaSA9IDA7IGkgPCB0ZGF0YS0+YXR0cl9zaXplOyBpKyspCi0JCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZ0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRhdGEtPmh3bW9uX2Rldi0+a29iaiwgJnRkYXRhLT5hdHRyX2dyb3VwKTsKIAogCWtmcmVlKHBkYXRhLT5jb3JlX2RhdGFbaW5keF0pOwogCXBkYXRhLT5jb3JlX2RhdGFbaW5keF0gPSBOVUxMOwpAQCAtNTg4LDM0ICs1NjYsMjAgQEAKIAogc3RhdGljIGludCBjb3JldGVtcF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJc3RydWN0IHBsYXRmb3JtX2RhdGEgKnBkYXRhOwotCWludCBlcnI7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBwZXItcGFja2FnZSBkYXRhIHN0cnVjdHVyZXMgKi8KLQlwZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbGF0Zm9ybV9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJcGRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IHBsYXRmb3JtX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWVyciA9IGNyZWF0ZV9uYW1lX2F0dHIocGRhdGEsICZwZGV2LT5kZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gZXhpdF9mcmVlOwotCiAJcGRhdGEtPnBoeXNfcHJvY19pZCA9IHBkZXYtPmlkOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKIAotCXBkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJnBkZXYtPmRldik7Ci0JaWYgKElTX0VSUihwZGF0YS0+aHdtb25fZGV2KSkgewotCQllcnIgPSBQVFJfRVJSKHBkYXRhLT5od21vbl9kZXYpOwotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDbGFzcyByZWdpc3RyYXRpb24gZmFpbGVkICglZClcbiIsIGVycik7Ci0JCWdvdG8gZXhpdF9uYW1lOwotCX0KLQlyZXR1cm4gMDsKLQotZXhpdF9uYW1lOgotCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmcGRhdGEtPm5hbWVfYXR0cik7Ci1leGl0X2ZyZWU6Ci0Ja2ZyZWUocGRhdGEpOwotCXJldHVybiBlcnI7CisJcGRhdGEtPmh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgRFJWTkFNRSwKKwkJCQkJCQkJICBwZGF0YSwgTlVMTCk7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhwZGF0YS0+aHdtb25fZGV2KTsKIH0KIAogc3RhdGljIGludCBjb3JldGVtcF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTYyNSwxMSArNTg5LDggQEAKIAogCWZvciAoaSA9IE1BWF9DT1JFX0RBVEEgLSAxOyBpID49IDA7IC0taSkKIAkJaWYgKHBkYXRhLT5jb3JlX2RhdGFbaV0pCi0JCQljb3JldGVtcF9yZW1vdmVfY29yZShwZGF0YSwgJnBkZXYtPmRldiwgaSk7CisJCQljb3JldGVtcF9yZW1vdmVfY29yZShwZGF0YSwgaSk7CiAKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJnBkYXRhLT5uYW1lX2F0dHIpOwotCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKHBkYXRhLT5od21vbl9kZXYpOwotCWtmcmVlKHBkYXRhKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzc3LDcgKzczOCw3IEBACiAJCXJldHVybjsKIAogCWlmIChwZGF0YS0+Y29yZV9kYXRhW2luZHhdICYmIHBkYXRhLT5jb3JlX2RhdGFbaW5keF0tPmNwdSA9PSBjcHUpCi0JCWNvcmV0ZW1wX3JlbW92ZV9jb3JlKHBkYXRhLCAmcGRldi0+ZGV2LCBpbmR4KTsKKwkJY29yZXRlbXBfcmVtb3ZlX2NvcmUocGRhdGEsIGluZHgpOwogCiAJLyoKIAkgKiBJZiBhIEhUIHNpYmxpbmcgb2YgYSBjb3JlIGlzIHRha2VuIG9mZmxpbmUsIGJ1dCBhbm90aGVyIEhUIHNpYmxpbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZW1jMjEwMy5jIGIvZHJpdmVycy9od21vbi9lbWMyMTAzLmMKaW5kZXggMmMxMzdiMi4uZmQ4OTJkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9lbWMyMTAzLmMKKysrIGIvZHJpdmVycy9od21vbi9lbWMyMTAzLmMKQEAgLTM0OSw3ICszNDksNyBAQAogCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgInJlZyAweCUwMngsIGVyciAlZFxuIiwKIAkJCVJFR19GQU5fQ09ORjEsIHN0YXR1cyk7CiAJCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIHN0YXR1czsKIAl9CiAJc3RhdHVzICY9IDB4OUY7CiAJc3RhdHVzIHw9IChuZXdfcmFuZ2VfYml0cyA8PCA1KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaHdtb24uYyBiL2RyaXZlcnMvaHdtb24vaHdtb24uYwppbmRleCBlMTc2YTQzLi5hMjZjMzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2h3bW9uLmMKKysrIGIvZHJpdmVycy9od21vbi9od21vbi5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KIAogI2RlZmluZSBIV01PTl9JRF9QUkVGSVggImh3bW9uIgogI2RlZmluZSBIV01PTl9JRF9GT1JNQVQgSFdNT05fSURfUFJFRklYICIlZCIKQEAgLTk5LDYgKzEwMCwxMCBAQAogCXN0cnVjdCBod21vbl9kZXZpY2UgKmh3ZGV2OwogCWludCBlcnIsIGlkOwogCisJLyogRG8gbm90IGFjY2VwdCBpbnZhbGlkIGNoYXJhY3RlcnMgaW4gaHdtb24gbmFtZSBhdHRyaWJ1dGUgKi8KKwlpZiAobmFtZSAmJiAoIXN0cmxlbihuYW1lKSB8fCBzdHJwYnJrKG5hbWUsICItKiBcdFxuIikpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwogCWlkID0gaWRhX3NpbXBsZV9nZXQoJmh3bW9uX2lkYSwgMCwgMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKGlkIDwgMCkKIAkJcmV0dXJuIEVSUl9QVFIoaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9paW9faHdtb24uYyBiL2RyaXZlcnMvaHdtb24vaWlvX2h3bW9uLmMKaW5kZXggNzA4MDgxYi4uOWZiYjFiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9paW9faHdtb24uYworKysgYi9kcml2ZXJzL2h3bW9uL2lpb19od21vbi5jCkBAIC0zMSw2ICszMSw3IEBACiAJaW50IG51bV9jaGFubmVsczsKIAlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CiAJc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhdHRyX2dyb3VwOworCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmdyb3Vwc1syXTsKIAlzdHJ1Y3QgYXR0cmlidXRlICoqYXR0cnM7CiB9OwogCkBAIC01NiwxOSArNTcsNiBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZXN1bHQpOwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSBjaGFyICpidWYpCi17Ci0JY29uc3QgY2hhciAqbmFtZSA9ICJpaW9faHdtb24iOwotCi0JaWYgKGRldi0+b2Zfbm9kZSAmJiBkZXYtPm9mX25vZGUtPm5hbWUpCi0JCW5hbWUgPSBkZXYtPm9mX25vZGUtPm5hbWU7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgbmFtZSk7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93X25hbWUsIE5VTEwpOwotCiBzdGF0aWMgaW50IGlpb19od21vbl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CkBAIC03OCw2ICs2NiwxMCBAQAogCWludCBpbl9pID0gMSwgdGVtcF9pID0gMSwgY3Vycl9pID0gMTsKIAllbnVtIGlpb19jaGFuX3R5cGUgdHlwZTsKIAlzdHJ1Y3QgaWlvX2NoYW5uZWwgKmNoYW5uZWxzOworCWNvbnN0IGNoYXIgKm5hbWUgPSAiaWlvX2h3bW9uIjsKKworCWlmIChkZXYtPm9mX25vZGUgJiYgZGV2LT5vZl9ub2RlLT5uYW1lKQorCQluYW1lID0gZGV2LT5vZl9ub2RlLT5uYW1lOwogCiAJY2hhbm5lbHMgPSBpaW9fY2hhbm5lbF9nZXRfYWxsKGRldik7CiAJaWYgKElTX0VSUihjaGFubmVscykpCkBAIC05Niw3ICs4OCw3IEBACiAJCXN0LT5udW1fY2hhbm5lbHMrKzsKIAogCXN0LT5hdHRycyA9IGRldm1fa3phbGxvYyhkZXYsCi0JCQkJIHNpemVvZigqc3QtPmF0dHJzKSAqIChzdC0+bnVtX2NoYW5uZWxzICsgMiksCisJCQkJIHNpemVvZigqc3QtPmF0dHJzKSAqIChzdC0+bnVtX2NoYW5uZWxzICsgMSksCiAJCQkJIEdGUF9LRVJORUwpOwogCWlmIChzdC0+YXR0cnMgPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PTUVNOwpAQCAtMTQ0LDIyICsxMzYsMTggQEAKIAkJYS0+aW5kZXggPSBpOwogCQlzdC0+YXR0cnNbaV0gPSAmYS0+ZGV2X2F0dHIuYXR0cjsKIAl9Ci0Jc3QtPmF0dHJzW3N0LT5udW1fY2hhbm5lbHNdID0gJmRldl9hdHRyX25hbWUuYXR0cjsKLQlzdC0+YXR0cl9ncm91cC5hdHRycyA9IHN0LT5hdHRyczsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzdCk7Ci0JcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosICZzdC0+YXR0cl9ncm91cCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3JfcmVsZWFzZV9jaGFubmVsczsKIAotCXN0LT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoZGV2KTsKKwlzdC0+YXR0cl9ncm91cC5hdHRycyA9IHN0LT5hdHRyczsKKwlzdC0+Z3JvdXBzWzBdID0gJnN0LT5hdHRyX2dyb3VwOworCXN0LT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBuYW1lLCBzdCwKKwkJCQkJCQkgIHN0LT5ncm91cHMpOwogCWlmIChJU19FUlIoc3QtPmh3bW9uX2RldikpIHsKIAkJcmV0ID0gUFRSX0VSUihzdC0+aHdtb25fZGV2KTsKLQkJZ290byBlcnJvcl9yZW1vdmVfZ3JvdXA7CisJCWdvdG8gZXJyb3JfcmVsZWFzZV9jaGFubmVsczsKIAl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgc3QpOwogCXJldHVybiAwOwogCi1lcnJvcl9yZW1vdmVfZ3JvdXA6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosICZzdC0+YXR0cl9ncm91cCk7CiBlcnJvcl9yZWxlYXNlX2NoYW5uZWxzOgogCWlpb19jaGFubmVsX3JlbGVhc2VfYWxsKGNoYW5uZWxzKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTcwLDcgKzE1OCw2IEBACiAJc3RydWN0IGlpb19od21vbl9zdGF0ZSAqc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKHN0LT5od21vbl9kZXYpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZzdC0+YXR0cl9ncm91cCk7CiAJaWlvX2NoYW5uZWxfcmVsZWFzZV9hbGwoc3QtPmNoYW5uZWxzKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9qejQ3NDAtaHdtb24uYyBiL2RyaXZlcnMvaHdtb24vano0NzQwLWh3bW9uLmMKaW5kZXggYTE4M2U0OC4uNzQ4OGUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9qejQ3NDAtaHdtb24uYworKysgYi9kcml2ZXJzL2h3bW9uL2p6NDc0MC1od21vbi5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KIAogc3RydWN0IGp6NDc0MF9od21vbiB7Ci0Jc3RydWN0IHJlc291cmNlICptZW07CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCiAJaW50IGlycTsKQEAgLTEwNiw2ICsxMDUsNyBAQAogewogCWludCByZXQ7CiAJc3RydWN0IGp6NDc0MF9od21vbiAqaHdtb247CisJc3RydWN0IHJlc291cmNlICptZW07CiAKIAlod21vbiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmh3bW9uKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFod21vbikKQEAgLTEyMCwyNSArMTIwLDEwIEBACiAJCXJldHVybiBod21vbi0+aXJxOwogCX0KIAotCWh3bW9uLT5tZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghaHdtb24tPm1lbSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IHBsYXRmb3JtIG1taW8gcmVzb3VyY2VcbiIpOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9Ci0KLQlod21vbi0+bWVtID0gZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgaHdtb24tPm1lbS0+c3RhcnQsCi0JCQlyZXNvdXJjZV9zaXplKGh3bW9uLT5tZW0pLCBwZGV2LT5uYW1lKTsKLQlpZiAoIWh3bW9uLT5tZW0pIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgbW1pbyBtZW1vcnkgcmVnaW9uXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlod21vbi0+YmFzZSA9IGRldm1faW9yZW1hcF9ub2NhY2hlKCZwZGV2LT5kZXYsIGh3bW9uLT5tZW0tPnN0YXJ0LAotCQkJCQkgICByZXNvdXJjZV9zaXplKGh3bW9uLT5tZW0pKTsKLQlpZiAoIWh3bW9uLT5iYXNlKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBpb3JlbWFwIG1taW8gbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9CisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlod21vbi0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCBtZW0pOworCWlmIChJU19FUlIoaHdtb24tPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihod21vbi0+YmFzZSk7CiAKIAlpbml0X2NvbXBsZXRpb24oJmh3bW9uLT5yZWFkX2NvbXBsZXRpb24pOwogCW11dGV4X2luaXQoJmh3bW9uLT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jIGIvZHJpdmVycy9od21vbi9sbTk1MjQxLmMKaW5kZXggNGI2OGZiMi4uY2RmMTlhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTk1MjQxLmMKKysrIGIvZHJpdmVycy9od21vbi9sbTk1MjQxLmMKQEAgLTg5LDcgKzg5LDcgQEAKIAogLyogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikgKi8KIHN0cnVjdCBsbTk1MjQxX2RhdGEgewotCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZCwgaW50ZXJ2YWw7CS8qIGluIGppZmZpZXMgKi8KIAljaGFyIHZhbGlkOwkJLyogemVybyB1bnRpbCBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLwpAQCAtMTEzLDggKzExMyw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbG05NTI0MV9kYXRhICpsbTk1MjQxX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCkBAIC0xMjIsNyArMTIyLDcgQEAKIAkgICAgIWRhdGEtPnZhbGlkKSB7CiAJCWludCBpOwogCi0JCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiVXBkYXRpbmcgbG05NTI0MSBkYXRhLlxuIik7CisJCWRldl9kYmcoZGV2LCAiVXBkYXRpbmcgbG05NTI0MSBkYXRhLlxuIik7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxtOTUyNDFfcmVnX2FkZHJlc3MpOyBpKyspCiAJCQlkYXRhLT50ZW1wW2ldCiAJCQkgID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKQEAgLTE1Myw4ICsxNTMsNyBAQAogc3RhdGljIHNzaXplX3Qgc2hvd190eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgY2hhciAqYnVmKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsCiAJCWRhdGEtPm1vZGVsICYgdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleCA/ICIxXG4iIDogIjJcbiIpOwpAQCAtMTYzLDggKzE2Miw4IEBACiBzdGF0aWMgc3NpemVfdCBzZXRfdHlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAJaW50IHNoaWZ0OwogCXU4IG1hc2sgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwpAQCAtMjAxLDggKzIwMCw3IEBACiBzdGF0aWMgc3NpemVfdCBzaG93X21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJY2hhciAqYnVmKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsCiAJCQlkYXRhLT5jb25maWcgJiB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4ID8KQEAgLTIxMiw4ICsyMTAsNyBAQAogc3RhdGljIHNzaXplX3Qgc2V0X21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWxvbmcgdmFsOwogCiAJaWYgKGtzdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKQpAQCAtMjI5LDcgKzIyNiw4IEBACiAJCWRhdGEtPmNvbmZpZyAmPSB+dG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAlkYXRhLT52YWxpZCA9IDA7CiAKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLCBkYXRhLT5jb25maWcpOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBMTTk1MjQxX1JFR19SV19DT05GSUcsCisJCQkJICBkYXRhLT5jb25maWcpOwogCiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKQEAgLTIzOSw4ICsyMzcsNyBAQAogc3RhdGljIHNzaXplX3Qgc2hvd19tYXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCWNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLAogCQkJZGF0YS0+Y29uZmlnICYgdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleCA/CkBAIC0yNTAsOCArMjQ3LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHNldF9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlsb25nIHZhbDsKIAogCWlmIChrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKQEAgLTI2Nyw3ICsyNjMsOCBAQAogCQlkYXRhLT5jb25maWcgJj0gfnRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CiAJZGF0YS0+dmFsaWQgPSAwOwogCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX0NPTkZJRywgZGF0YS0+Y29uZmlnKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLAorCQkJCSAgZGF0YS0+Y29uZmlnKTsKIAogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCkBAIC0yODYsOCArMjgzLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHNldF9pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAogCWlmIChrc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCkBAIC0zMTYsNyArMzEyLDcgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUih1cGRhdGVfaW50ZXJ2YWwsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2ludGVydmFsLAogCQkgICBzZXRfaW50ZXJ2YWwpOwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbG05NTI0MV9hdHRyaWJ1dGVzW10gPSB7CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbG05NTI0MV9hdHRyc1tdID0gewogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19pbnB1dC5kZXZfYXR0ci5hdHRyLApAQCAtMzI5LDEwICszMjUsNyBAQAogCSZkZXZfYXR0cl91cGRhdGVfaW50ZXJ2YWwuYXR0ciwKIAlOVUxMCiB9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsbTk1MjQxX2dyb3VwID0gewotCS5hdHRycyA9IGxtOTUyNDFfYXR0cmlidXRlcywKLX07CitBVFRSSUJVVEVfR1JPVVBTKGxtOTUyNDEpOwogCiAvKiBSZXR1cm4gMCBpZiBkZXRlY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgLUVOT0RFViBvdGhlcndpc2UgKi8KIHN0YXRpYyBpbnQgbG05NTI0MV9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQsCkBAIC0zNjYsMTQgKzM1OSwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBsbTk1MjQxX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgdm9pZCBsbTk1MjQxX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KIAlkYXRhLT5pbnRlcnZhbCA9IEhaOwkvKiAxIHNlYyBkZWZhdWx0ICovCi0JZGF0YS0+dmFsaWQgPSAwOwogCWRhdGEtPmNvbmZpZyA9IENGR19DUjAwNzY7Ci0JZGF0YS0+bW9kZWwgPSAwOwogCWRhdGEtPnRydXRoZXJtID0gKFRUX09GRiA8PCBUVDFfU0hJRlQpIHwgKFRUX09GRiA8PCBUVDJfU0hJRlQpOwogCiAJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX0NPTkZJRywgZGF0YS0+Y29uZmlnKTsKQEAgLTM4NSw0OSArMzc1LDI3IEBACiAJCQkJICBkYXRhLT5tb2RlbCk7CiB9CiAKLXN0YXRpYyBpbnQgbG05NTI0MV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCwKK3N0YXRpYyBpbnQgbG05NTI0MV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YTsKLQlpbnQgZXJyOworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIAotCWRhdGEgPSBkZXZtX2t6YWxsb2MoJm5ld19jbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBsbTk1MjQxX2RhdGEpLAotCQkJICAgIEdGUF9LRVJORUwpOworCWRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IGxtOTUyNDFfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OwogCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIExNOTUyNDEgY2hpcCAqLwotCWxtOTUyNDFfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisJbG05NTI0MV9pbml0X2NsaWVudChjbGllbnQsIGRhdGEpOwogCi0JLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KLQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmbG05NTI0MV9ncm91cCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKLQlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKLQkJZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOwotCQlnb3RvIGV4aXRfcmVtb3ZlX2ZpbGVzOwotCX0KLQotCXJldHVybiAwOwotCi1leGl0X3JlbW92ZV9maWxlczoKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmbG05NTI0MV9ncm91cCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBsbTk1MjQxX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbG05NTI0MV9ncm91cCk7Ci0KLQlyZXR1cm4gMDsKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgICBkYXRhLAorCQkJCQkJCSAgIGxtOTUyNDFfZ3JvdXBzKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7CiB9CiAKIC8qIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpICovCkBAIC00NDQsNyArNDEyLDYgQEAKIAkJLm5hbWUJPSBERVZOQU1FLAogCX0sCiAJLnByb2JlCQk9IGxtOTUyNDFfcHJvYmUsCi0JLnJlbW92ZQkJPSBsbTk1MjQxX3JlbW92ZSwKIAkuaWRfdGFibGUJPSBsbTk1MjQxX2lkLAogCS5kZXRlY3QJCT0gbG05NTI0MV9kZXRlY3QsCiAJLmFkZHJlc3NfbGlzdAk9IG5vcm1hbF9pMmMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTUyNDUuYyBiL2RyaXZlcnMvaHdtb24vbG05NTI0NS5jCmluZGV4IGE2Yzg1ZjAuLjBhZTBkZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG05NTI0NS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG05NTI0NS5jCkBAIC0xMTUsNyArMTE1LDcgQEAKIAogLyogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikgKi8KIHN0cnVjdCBsbTk1MjQ1X2RhdGEgewotCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogaW4gamlmZmllcyAqLwogCXVuc2lnbmVkIGxvbmcgaW50ZXJ2YWw7CS8qIGluIG1zZWNzICovCkBAIC0xNDAsOCArMTQwLDggQEAKIAogc3RhdGljIHN0cnVjdCBsbTk1MjQ1X2RhdGEgKmxtOTUyNDVfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKQEAgLTE0OSw3ICsxNDksNiBAQAogCQkrIG1zZWNzX3RvX2ppZmZpZXMoZGF0YS0+aW50ZXJ2YWwpKSB8fCAhZGF0YS0+dmFsaWQpIHsKIAkJaW50IGk7CiAKLQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJVcGRhdGluZyBsbTk1MjQ1IGRhdGEuXG4iKTsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobG05NTI0NV9yZWdfYWRkcmVzcyk7IGkrKykKIAkJCWRhdGEtPnJlZ3NbaV0KIAkJCSAgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LApAQCAtMjQ5LDkgKzI0OCw5IEBACiBzdGF0aWMgc3NpemVfdCBzZXRfbGltaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAKIAlpZiAoa3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQpAQCAtMjcyLDI3ICsyNzEsMzggQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IHNob3dfY3JpdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGxtOTUyNDVfdXBkYXRlX2RldmljZShkZXYpOworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJaW50IGh5c3QgPSBkYXRhLT5yZWdzW2luZGV4XSAtIGRhdGEtPnJlZ3NbOF07CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLCAiJWRcbiIsIGh5c3QgKiAxMDAwKTsKK30KKwogc3RhdGljIHNzaXplX3Qgc2V0X2NyaXRfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgaHlzdCwgbGltaXQ7CiAKIAlpZiAoa3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXZhbCAvPSAxMDAwOwotCi0JdmFsID0gY2xhbXBfdmFsKHZhbCwgMCwgMzEpOwotCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCi0JZGF0YS0+dmFsaWQgPSAwOworCWxpbWl0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgbG05NTI0NV9yZWdfYWRkcmVzc1tpbmRleF0pOworCWh5c3QgPSBsaW1pdCAtIHZhbCAvIDEwMDA7CisJaHlzdCA9IGNsYW1wX3ZhbChoeXN0LCAwLCAzMSk7CisJZGF0YS0+cmVnc1s4XSA9IGh5c3Q7CiAKIAkvKiBzaGFyZWQgY3JpdCBoeXN0ZXJlc2lzICovCiAJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDVfUkVHX1JXX0NPTU1PTl9IWVNURVJFU0lTLAotCQl2YWwpOworCQloeXN0KTsKIAogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCkBAIC0zMDIsOCArMzEyLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHNob3dfdHlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLAogCQlkYXRhLT5jb25maWcyICYgQ0ZHMl9SRU1PVEVfVFQgPyAiMVxuIiA6ICIyXG4iKTsKQEAgLTMxMiw4ICszMjEsOCBAQAogc3RhdGljIHNzaXplX3Qgc2V0X3R5cGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXVuc2lnbmVkIGxvbmcgdmFsOwogCiAJaWYgKGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKQEAgLTM1OSw4ICszNjgsOCBAQAogc3RhdGljIHNzaXplX3Qgc2V0X2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAKIAlpZiAoa3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQpAQCAtMzc4LDE2ICszODcsMTUgQEAKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5wdXQsIE5VTEwsIDApOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19saW1pdCwKIAkJc2V0X2xpbWl0LCA2KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19saW1pdCwKLQkJc2V0X2NyaXRfaHlzdCwgOCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXRfaHlzdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfY3JpdF9oeXN0LAorCQlzZXRfY3JpdF9oeXN0LCA2KTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKIAkJU1RBVFVTMV9MT0MpOwogCiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X2lucHV0LCBOVUxMLCAyKTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfY3JpdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbGltaXQsCiAJCXNldF9saW1pdCwgNyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2NyaXRfaHlzdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbGltaXQsCi0JCXNldF9jcml0X2h5c3QsIDgpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9jcml0X2h5c3QsIFNfSVJVR08sIHNob3dfY3JpdF9oeXN0LCBOVUxMLCA3KTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfY3JpdF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKIAkJU1RBVFVTMV9SVENSSVQpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl90eXBlLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190eXBlLApAQCAtMzk4LDcgKzQwNiw3IEBACiBzdGF0aWMgREVWSUNFX0FUVFIodXBkYXRlX2ludGVydmFsLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbnRlcnZhbCwKIAkJc2V0X2ludGVydmFsKTsKIAotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxtOTUyNDVfYXR0cmlidXRlc1tdID0geworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxtOTUyNDVfYXR0cnNbXSA9IHsKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9jcml0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9jcml0X2h5c3QuZGV2X2F0dHIuYXR0ciwKQEAgLTQxMiwxMCArNDIwLDcgQEAKIAkmZGV2X2F0dHJfdXBkYXRlX2ludGVydmFsLmF0dHIsCiAJTlVMTAogfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbG05NTI0NV9ncm91cCA9IHsKLQkuYXR0cnMgPSBsbTk1MjQ1X2F0dHJpYnV0ZXMsCi19OworQVRUUklCVVRFX0dST1VQUyhsbTk1MjQ1KTsKIAogLyogUmV0dXJuIDAgaWYgZGV0ZWN0aW9uIGlzIHN1Y2Nlc3NmdWwsIC1FTk9ERVYgb3RoZXJ3aXNlICovCiBzdGF0aWMgaW50IGxtOTUyNDVfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50LApAQCAtNDM2LDExICs0NDEsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBsbTk1MjQ1X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgdm9pZCBsbTk1MjQ1X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlkYXRhLT52YWxpZCA9IDA7CiAJZGF0YS0+aW50ZXJ2YWwgPSBsbTk1MjQ1X3JlYWRfY29udmVyc2lvbl9yYXRlKGNsaWVudCk7CiAKIAlkYXRhLT5jb25maWcxID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKQEAgLTQ1Niw0OSArNDU5LDI3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGxtOTUyNDVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQsCitzdGF0aWMgaW50IGxtOTUyNDVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OwogCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGE7Ci0JaW50IGVycjsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CiAKLQlkYXRhID0gZGV2bV9remFsbG9jKCZuZXdfY2xpZW50LT5kZXYsIHNpemVvZihzdHJ1Y3QgbG05NTI0NV9kYXRhKSwKLQkJCSAgICBHRlBfS0VSTkVMKTsKKwlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBsbTk1MjQ1X2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCWRhdGEtPmNsaWVudCA9IGNsaWVudDsKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBMTTk1MjQ1IGNoaXAgKi8KLQlsbTk1MjQ1X2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCWxtOTUyNDVfaW5pdF9jbGllbnQoY2xpZW50LCBkYXRhKTsKIAotCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCi0JZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJmxtOTUyNDVfZ3JvdXApOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7Ci0JaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7Ci0JCWVyciA9IFBUUl9FUlIoZGF0YS0+aHdtb25fZGV2KTsKLQkJZ290byBleGl0X3JlbW92ZV9maWxlczsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZXhpdF9yZW1vdmVfZmlsZXM6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJmxtOTUyNDVfZ3JvdXApOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgbG05NTI0NV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmxtOTUyNDVfZ3JvdXApOwotCi0JcmV0dXJuIDA7CisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBjbGllbnQtPm5hbWUsCisJCQkJCQkJICAgZGF0YSwKKwkJCQkJCQkgICBsbTk1MjQ1X2dyb3Vwcyk7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhod21vbl9kZXYpOwogfQogCiAvKiBEcml2ZXIgZGF0YSAoY29tbW9uIHRvIGFsbCBjbGllbnRzKSAqLwpAQCAtNTE0LDcgKzQ5NSw2IEBACiAJCS5uYW1lCT0gREVWTkFNRSwKIAl9LAogCS5wcm9iZQkJPSBsbTk1MjQ1X3Byb2JlLAotCS5yZW1vdmUJCT0gbG05NTI0NV9yZW1vdmUsCiAJLmlkX3RhYmxlCT0gbG05NTI0NV9pZCwKIAkuZGV0ZWN0CQk9IGxtOTUyNDVfZGV0ZWN0LAogCS5hZGRyZXNzX2xpc3QJPSBub3JtYWxfaTJjLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sdGMyOTQ1LmMgYi9kcml2ZXJzL2h3bW9uL2x0YzI5NDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTA0Y2MzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9sdGMyOTQ1LmMKQEAgLTAsMCArMSw1MTkgQEAKKy8qCisgKiBEcml2ZXIgZm9yIExpbmVhciBUZWNobm9sb2d5IExUQzI5NDUgSTJDIFBvd2VyIE1vbml0b3IKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgR3VlbnRlciBSb2VjaworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKy8qIGNoaXAgcmVnaXN0ZXJzICovCisjZGVmaW5lIExUQzI5NDVfQ09OVFJPTAkJCTB4MDAKKyNkZWZpbmUgTFRDMjk0NV9BTEVSVAkJCTB4MDEKKyNkZWZpbmUgTFRDMjk0NV9TVEFUVVMJCQkweDAyCisjZGVmaW5lIExUQzI5NDVfRkFVTFQJCQkweDAzCisjZGVmaW5lIExUQzI5NDVfUE9XRVJfSAkJCTB4MDUKKyNkZWZpbmUgTFRDMjk0NV9NQVhfUE9XRVJfSAkJMHgwOAorI2RlZmluZSBMVEMyOTQ1X01JTl9QT1dFUl9ICQkweDBiCisjZGVmaW5lIExUQzI5NDVfTUFYX1BPV0VSX1RIUkVTX0gJMHgwZQorI2RlZmluZSBMVEMyOTQ1X01JTl9QT1dFUl9USFJFU19ICTB4MTEKKyNkZWZpbmUgTFRDMjk0NV9TRU5TRV9ICQkJMHgxNAorI2RlZmluZSBMVEMyOTQ1X01BWF9TRU5TRV9ICQkweDE2CisjZGVmaW5lIExUQzI5NDVfTUlOX1NFTlNFX0gJCTB4MTgKKyNkZWZpbmUgTFRDMjk0NV9NQVhfU0VOU0VfVEhSRVNfSAkweDFhCisjZGVmaW5lIExUQzI5NDVfTUlOX1NFTlNFX1RIUkVTX0gJMHgxYworI2RlZmluZSBMVEMyOTQ1X1ZJTl9ICQkJMHgxZQorI2RlZmluZSBMVEMyOTQ1X01BWF9WSU5fSAkJMHgyMAorI2RlZmluZSBMVEMyOTQ1X01JTl9WSU5fSAkJMHgyMgorI2RlZmluZSBMVEMyOTQ1X01BWF9WSU5fVEhSRVNfSAkJMHgyNAorI2RlZmluZSBMVEMyOTQ1X01JTl9WSU5fVEhSRVNfSAkJMHgyNgorI2RlZmluZSBMVEMyOTQ1X0FESU5fSAkJCTB4MjgKKyNkZWZpbmUgTFRDMjk0NV9NQVhfQURJTl9ICQkweDJhCisjZGVmaW5lIExUQzI5NDVfTUlOX0FESU5fSAkJMHgyYworI2RlZmluZSBMVEMyOTQ1X01BWF9BRElOX1RIUkVTX0gJMHgyZQorI2RlZmluZSBMVEMyOTQ1X01JTl9BRElOX1RIUkVTX0gJMHgzMAorI2RlZmluZSBMVEMyOTQ1X01JTl9BRElOX1RIUkVTX0wJMHgzMQorCisvKiBGYXVsdCByZWdpc3RlciBiaXRzICovCisKKyNkZWZpbmUgRkFVTFRfQURJTl9VVgkJKDEgPDwgMCkKKyNkZWZpbmUgRkFVTFRfQURJTl9PVgkJKDEgPDwgMSkKKyNkZWZpbmUgRkFVTFRfVklOX1VWCQkoMSA8PCAyKQorI2RlZmluZSBGQVVMVF9WSU5fT1YJCSgxIDw8IDMpCisjZGVmaW5lIEZBVUxUX1NFTlNFX1VWCQkoMSA8PCA0KQorI2RlZmluZSBGQVVMVF9TRU5TRV9PVgkJKDEgPDwgNSkKKyNkZWZpbmUgRkFVTFRfUE9XRVJfVVYJCSgxIDw8IDYpCisjZGVmaW5lIEZBVUxUX1BPV0VSX09WCQkoMSA8PCA3KQorCisvKiBDb250cm9sIHJlZ2lzdGVyIGJpdHMgKi8KKworI2RlZmluZSBDT05UUk9MX01VTFRfU0VMRUNUCSgxIDw8IDApCisjZGVmaW5lIENPTlRST0xfVEVTVF9NT0RFCSgxIDw8IDQpCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19wb3dlcl9yZWcodTggcmVnKQoreworCXJldHVybiByZWcgPCBMVEMyOTQ1X1NFTlNFX0g7Cit9CisKKy8qIFJldHVybiB0aGUgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gcmVnaXN0ZXIgaW4gdVcsIG1WLCBvciBtQSAqLworc3RhdGljIGxvbmcgbG9uZyBsdGMyOTQ1X3JlZ190b192YWwoc3RydWN0IGRldmljZSAqZGV2LCB1OCByZWcpCit7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IGNvbnRyb2w7CisJdTggYnVmWzNdOworCWxvbmcgbG9uZyB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF9idWxrX3JlYWQocmVnbWFwLCByZWcsIGJ1ZiwKKwkJCSAgICAgICBpc19wb3dlcl9yZWcocmVnKSA/IDMgOiAyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChpc19wb3dlcl9yZWcocmVnKSkgeworCQkvKiBwb3dlciAqLworCQl2YWwgPSAoYnVmWzBdIDw8IDE2KSArIChidWZbMV0gPDwgOCkgKyBidWZbMl07CisJfSBlbHNlIHsKKwkJLyogY3VycmVudCwgdm9sdGFnZSAqLworCQl2YWwgPSAoYnVmWzBdIDw8IDQpICsgKGJ1ZlsxXSA+PiA0KTsKKwl9CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTFRDMjk0NV9QT1dFUl9IOgorCWNhc2UgTFRDMjk0NV9NQVhfUE9XRVJfSDoKKwljYXNlIExUQzI5NDVfTUlOX1BPV0VSX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9QT1dFUl9USFJFU19IOgorCWNhc2UgTFRDMjk0NV9NSU5fUE9XRVJfVEhSRVNfSDoKKwkJLyoKKwkJICogQ29udmVydCB0byB1VyBieSBhc3N1bWluZyBjdXJyZW50IGlzIG1lYXN1cmVkIHdpdGgKKwkJICogYW4gMW1PaG0gc2Vuc2UgcmVzaXN0b3IsIHNpbWlsYXIgdG8gY3VycmVudAorCQkgKiBtZWFzdXJlbWVudHMuCisJCSAqIENvbnRyb2wgcmVnaXN0ZXIgYml0IDAgc2VsZWN0cyBpZiB2b2x0YWdlIGF0IFNFTlNFKy9WREQKKwkJICogb3Igdm9sdGFnZSBhdCBBRElOIGlzIHVzZWQgdG8gbWVhc3VyZSBwb3dlci4KKwkJICovCisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTFRDMjk0NV9DT05UUk9MLCAmY29udHJvbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKGNvbnRyb2wgJiBDT05UUk9MX01VTFRfU0VMRUNUKSB7CisJCQkvKiAyNSBtViAqIDI1IHVWID0gMC42MjUgdVYgcmVzb2x1dGlvbi4gKi8KKwkJCXZhbCAqPSA2MjVMTDsKKwkJfSBlbHNlIHsKKwkJCS8qIDAuNSBtViAqIDI1IHVWID0gMC4wMTI1IHVWIHJlc29sdXRpb24uICovCisJCQl2YWwgPSAodmFsICogMjVMTCkgPj4gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIExUQzI5NDVfVklOX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9WSU5fSDoKKwljYXNlIExUQzI5NDVfTUlOX1ZJTl9IOgorCWNhc2UgTFRDMjk0NV9NQVhfVklOX1RIUkVTX0g6CisJY2FzZSBMVEMyOTQ1X01JTl9WSU5fVEhSRVNfSDoKKwkJLyogMjUgbVYgcmVzb2x1dGlvbi4gQ29udmVydCB0byBtVi4gKi8KKwkJdmFsICo9IDI1OworCQlicmVhazsKKwljYXNlIExUQzI5NDVfQURJTl9IOgorCWNhc2UgTFRDMjk0NV9NQVhfQURJTl9IOgorCWNhc2UgTFRDMjk0NV9NSU5fQURJTl9USFJFU19IOgorCWNhc2UgTFRDMjk0NV9NQVhfQURJTl9USFJFU19IOgorCWNhc2UgTFRDMjk0NV9NSU5fQURJTl9IOgorCQkvKiAwLjVtViByZXNvbHV0aW9uLiBDb252ZXJ0IHRvIG1WLiAqLworCQl2YWwgPSB2YWwgPj4gMTsKKwkJYnJlYWs7CisJY2FzZSBMVEMyOTQ1X1NFTlNFX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9TRU5TRV9IOgorCWNhc2UgTFRDMjk0NV9NSU5fU0VOU0VfSDoKKwljYXNlIExUQzI5NDVfTUFYX1NFTlNFX1RIUkVTX0g6CisJY2FzZSBMVEMyOTQ1X01JTl9TRU5TRV9USFJFU19IOgorCQkvKgorCQkgKiAyNSB1ViByZXNvbHV0aW9uLiBDb252ZXJ0IHRvIGN1cnJlbnQgYXMgbWVhc3VyZWQgd2l0aAorCQkgKiBhbiAxIG1PaG0gc2Vuc2UgcmVzaXN0b3IsIGluIG1BLiBJZiBhIGRpZmZlcmVudCBzZW5zZQorCQkgKiByZXNpc3RvciBpcyBpbnN0YWxsZWQsIGNhbGN1bGF0ZSB0aGUgYWN0dWFsIGN1cnJlbnQgYnkKKwkJICogZGl2aWRpbmcgdGhlIHJlcG9ydGVkIGN1cnJlbnQgYnkgdGhlIHNlbnNlIHJlc2lzdG9yIHZhbHVlCisJCSAqIGluIG1PaG0uCisJCSAqLworCQl2YWwgKj0gMjU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IGx0YzI5NDVfdmFsX3RvX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IHJlZywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGludCBjb250cm9sOworCWludCByZXQ7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTFRDMjk0NV9QT1dFUl9IOgorCWNhc2UgTFRDMjk0NV9NQVhfUE9XRVJfSDoKKwljYXNlIExUQzI5NDVfTUlOX1BPV0VSX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9QT1dFUl9USFJFU19IOgorCWNhc2UgTFRDMjk0NV9NSU5fUE9XRVJfVEhSRVNfSDoKKwkJLyoKKwkJICogQ29udmVydCB0byByZWdpc3RlciB2YWx1ZSBieSBhc3N1bWluZyBjdXJyZW50IGlzIG1lYXN1cmVkCisJCSAqIHdpdGggYW4gMW1PaG0gc2Vuc2UgcmVzaXN0b3IsIHNpbWlsYXIgdG8gY3VycmVudAorCQkgKiBtZWFzdXJlbWVudHMuCisJCSAqIENvbnRyb2wgcmVnaXN0ZXIgYml0IDAgc2VsZWN0cyBpZiB2b2x0YWdlIGF0IFNFTlNFKy9WREQKKwkJICogb3Igdm9sdGFnZSBhdCBBRElOIGlzIHVzZWQgdG8gbWVhc3VyZSBwb3dlciwgd2hpY2ggaW4gdHVybgorCQkgKiBkZXRlcm1pbmVzIHJlZ2lzdGVyIGNhbGN1bGF0aW9ucy4KKwkJICovCisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTFRDMjk0NV9DT05UUk9MLCAmY29udHJvbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKGNvbnRyb2wgJiBDT05UUk9MX01VTFRfU0VMRUNUKSB7CisJCQkvKiAyNSBtViAqIDI1IHVWID0gMC42MjUgdVYgcmVzb2x1dGlvbi4gKi8KKwkJCXZhbCA9IERJVl9ST1VORF9DTE9TRVNUKHZhbCwgNjI1KTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiAwLjUgbVYgKiAyNSB1ViA9IDAuMDEyNSB1ViByZXNvbHV0aW9uLgorCQkJICogRGl2aWRlIGZpcnN0IHRvIGF2b2lkIG92ZXJmbG93OworCQkJICogYWNjZXB0IGxvc3Mgb2YgYWNjdXJhY3kuCisJCQkgKi8KKwkJCXZhbCA9IERJVl9ST1VORF9DTE9TRVNUKHZhbCwgMjUpICogMjsKKwkJfQorCQlicmVhazsKKwljYXNlIExUQzI5NDVfVklOX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9WSU5fSDoKKwljYXNlIExUQzI5NDVfTUlOX1ZJTl9IOgorCWNhc2UgTFRDMjk0NV9NQVhfVklOX1RIUkVTX0g6CisJY2FzZSBMVEMyOTQ1X01JTl9WSU5fVEhSRVNfSDoKKwkJLyogMjUgbVYgcmVzb2x1dGlvbi4gKi8KKwkJdmFsIC89IDI1OworCQlicmVhazsKKwljYXNlIExUQzI5NDVfQURJTl9IOgorCWNhc2UgTFRDMjk0NV9NQVhfQURJTl9IOgorCWNhc2UgTFRDMjk0NV9NSU5fQURJTl9USFJFU19IOgorCWNhc2UgTFRDMjk0NV9NQVhfQURJTl9USFJFU19IOgorCWNhc2UgTFRDMjk0NV9NSU5fQURJTl9IOgorCQkvKiAwLjVtViByZXNvbHV0aW9uLiAqLworCQl2YWwgKj0gMjsKKwkJYnJlYWs7CisJY2FzZSBMVEMyOTQ1X1NFTlNFX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9TRU5TRV9IOgorCWNhc2UgTFRDMjk0NV9NSU5fU0VOU0VfSDoKKwljYXNlIExUQzI5NDVfTUFYX1NFTlNFX1RIUkVTX0g6CisJY2FzZSBMVEMyOTQ1X01JTl9TRU5TRV9USFJFU19IOgorCQkvKgorCQkgKiAyNSB1ViByZXNvbHV0aW9uLiBDb252ZXJ0IHRvIGN1cnJlbnQgYXMgbWVhc3VyZWQgd2l0aAorCQkgKiBhbiAxIG1PaG0gc2Vuc2UgcmVzaXN0b3IsIGluIG1BLiBJZiBhIGRpZmZlcmVudCBzZW5zZQorCQkgKiByZXNpc3RvciBpcyBpbnN0YWxsZWQsIGNhbGN1bGF0ZSB0aGUgYWN0dWFsIGN1cnJlbnQgYnkKKwkJICogZGl2aWRpbmcgdGhlIHJlcG9ydGVkIGN1cnJlbnQgYnkgdGhlIHNlbnNlIHJlc2lzdG9yIHZhbHVlCisJCSAqIGluIG1PaG0uCisJCSAqLworCQl2YWwgPSBESVZfUk9VTkRfQ0xPU0VTVCh2YWwsIDI1KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzI5NDVfc2hvd192YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGEpOworCWxvbmcgbG9uZyB2YWx1ZTsKKworCXZhbHVlID0gbHRjMjk0NV9yZWdfdG9fdmFsKGRldiwgYXR0ci0+aW5kZXgpOworCWlmICh2YWx1ZSA8IDApCisJCXJldHVybiB2YWx1ZTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGxkXG4iLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzI5NDVfc2V0X3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTggcmVnID0gYXR0ci0+aW5kZXg7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJdTggcmVnYnVmWzNdOworCWludCBudW1fcmVnczsKKwlpbnQgcmVndmFsOworCWludCByZXQ7CisKKwlyZXQgPSBrc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogY29udmVydCB0byByZWdpc3RlciB2YWx1ZSwgdGhlbiBjbGFtcCBhbmQgd3JpdGUgcmVzdWx0ICovCisJcmVndmFsID0gbHRjMjk0NV92YWxfdG9fcmVnKGRldiwgcmVnLCB2YWwpOworCWlmIChpc19wb3dlcl9yZWcocmVnKSkgeworCQlyZWd2YWwgPSBjbGFtcF92YWwocmVndmFsLCAwLCAweGZmZmZmZik7CisJCXJlZ2J1ZlswXSA9IHJlZ3ZhbCA+PiAxNjsKKwkJcmVnYnVmWzFdID0gKHJlZ3ZhbCA+PiA4KSAmIDB4ZmY7CisJCXJlZ2J1ZlsyXSA9IHJlZ3ZhbDsKKwkJbnVtX3JlZ3MgPSAzOworCX0gZWxzZSB7CisJCXJlZ3ZhbCA9IGNsYW1wX3ZhbChyZWd2YWwsIDAsIDB4ZmZmKSA8PCA0OworCQlyZWdidWZbMF0gPSByZWd2YWwgPj4gODsKKwkJcmVnYnVmWzFdID0gcmVndmFsICYgMHhmZjsKKwkJbnVtX3JlZ3MgPSAyOworCX0KKwlyZXQgPSByZWdtYXBfYnVsa193cml0ZShyZWdtYXAsIHJlZywgcmVnYnVmLCBudW1fcmVncyk7CisJcmV0dXJuIHJldCA8IDAgPyByZXQgOiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgbHRjMjk0NV9yZXNldF9oaXN0b3J5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTggcmVnID0gYXR0ci0+aW5kZXg7CisJaW50IG51bV9yZWdzID0gaXNfcG93ZXJfcmVnKHJlZykgPyAzIDogMjsKKwl1OCBidWZfbWluWzNdID0geyAweGZmLCAweGZmLCAweGZmIH07CisJdTggYnVmX21heFszXSA9IHsgMCwgMCwgMCB9OworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBrc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmICh2YWwgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCBMVEMyOTQ1X0NPTlRST0wsIENPTlRST0xfVEVTVF9NT0RFLAorCQkJCSBDT05UUk9MX1RFU1RfTU9ERSk7CisKKwkvKiBSZXNldCBtaW5pbXVtICovCisJcmV0ID0gcmVnbWFwX2J1bGtfd3JpdGUocmVnbWFwLCByZWcsIGJ1Zl9taW4sIG51bV9yZWdzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIExUQzI5NDVfTUlOX1BPV0VSX0g6CisJCXJlZyA9IExUQzI5NDVfTUFYX1BPV0VSX0g7CisJCWJyZWFrOworCWNhc2UgTFRDMjk0NV9NSU5fU0VOU0VfSDoKKwkJcmVnID0gTFRDMjk0NV9NQVhfU0VOU0VfSDsKKwkJYnJlYWs7CisJY2FzZSBMVEMyOTQ1X01JTl9WSU5fSDoKKwkJcmVnID0gTFRDMjk0NV9NQVhfVklOX0g7CisJCWJyZWFrOworCWNhc2UgTFRDMjk0NV9NSU5fQURJTl9IOgorCQlyZWcgPSBMVEMyOTQ1X01BWF9BRElOX0g7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlicmVhazsKKwl9CisJLyogUmVzZXQgbWF4aW11bSAqLworCXJldCA9IHJlZ21hcF9idWxrX3dyaXRlKHJlZ21hcCwgcmVnLCBidWZfbWF4LCBudW1fcmVncyk7CisKKwkvKiBUcnkgcmVzZXR0aW5nIHRlc3QgbW9kZSBldmVuIGlmIHRoZXJlIHdhcyBhbiBlcnJvciAqLworCXJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIExUQzI5NDVfQ09OVFJPTCwgQ09OVFJPTF9URVNUX01PREUsIDApOworCisJcmV0dXJuIHJldCA/IDogY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzI5NDVfc2hvd19ib29sKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgZmF1bHQ7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTFRDMjk0NV9GQVVMVCwgJmZhdWx0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZhdWx0ICY9IGF0dHItPmluZGV4OworCWlmIChmYXVsdCkJCS8qIENsZWFyIHJlcG9ydGVkIGZhdWx0cyBpbiBjaGlwIHJlZ2lzdGVyICovCisJCXJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIExUQzI5NDVfRkFVTFQsIGF0dHItPmluZGV4LCAwKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAhIWZhdWx0KTsKK30KKworLyogSW5wdXQgdm9sdGFnZXMgKi8KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfaW5wdXQsIFNfSVJVR08sIGx0YzI5NDVfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDMjk0NV9WSU5fSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9taW4sIFNfSVJVR08gfCBTX0lXVVNSLCBsdGMyOTQ1X3Nob3dfdmFsdWUsCisJCQkgIGx0YzI5NDVfc2V0X3ZhbHVlLCBMVEMyOTQ1X01JTl9WSU5fVEhSRVNfSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBsdGMyOTQ1X3Nob3dfdmFsdWUsCisJCQkgIGx0YzI5NDVfc2V0X3ZhbHVlLCBMVEMyOTQ1X01BWF9WSU5fVEhSRVNfSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9sb3dlc3QsIFNfSVJVR08sIGx0YzI5NDVfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDMjk0NV9NSU5fVklOX0gpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfaGlnaGVzdCwgU19JUlVHTywgbHRjMjk0NV9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEMyOTQ1X01BWF9WSU5fSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9yZXNldF9oaXN0b3J5LCBTX0lXVVNSLCBOVUxMLAorCQkJICBsdGMyOTQ1X3Jlc2V0X2hpc3RvcnksIExUQzI5NDVfTUlOX1ZJTl9IKTsKKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfaW5wdXQsIFNfSVJVR08sIGx0YzI5NDVfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDMjk0NV9BRElOX0gpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgbHRjMjk0NV9zaG93X3ZhbHVlLAorCQkJICBsdGMyOTQ1X3NldF92YWx1ZSwgTFRDMjk0NV9NSU5fQURJTl9USFJFU19IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIGx0YzI5NDVfc2hvd192YWx1ZSwKKwkJCSAgbHRjMjk0NV9zZXRfdmFsdWUsIExUQzI5NDVfTUFYX0FESU5fVEhSRVNfSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9sb3dlc3QsIFNfSVJVR08sIGx0YzI5NDVfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDMjk0NV9NSU5fQURJTl9IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX2hpZ2hlc3QsIFNfSVJVR08sIGx0YzI5NDVfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDMjk0NV9NQVhfQURJTl9IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX3Jlc2V0X2hpc3RvcnksIFNfSVdVU1IsIE5VTEwsCisJCQkgIGx0YzI5NDVfcmVzZXRfaGlzdG9yeSwgTFRDMjk0NV9NSU5fQURJTl9IKTsKKworLyogVm9sdGFnZSBhbGFybXMgKi8KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfbWluX2FsYXJtLCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgRkFVTFRfVklOX1VWKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX21heF9hbGFybSwgU19JUlVHTywgbHRjMjk0NV9zaG93X2Jvb2wsIE5VTEwsCisJCQkgIEZBVUxUX1ZJTl9PVik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9taW5fYWxhcm0sIFNfSVJVR08sIGx0YzI5NDVfc2hvd19ib29sLCBOVUxMLAorCQkJICBGQVVMVF9BRElOX1VWKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX21heF9hbGFybSwgU19JUlVHTywgbHRjMjk0NV9zaG93X2Jvb2wsIE5VTEwsCisJCQkgIEZBVUxUX0FESU5fT1YpOworCisvKiBDdXJyZW50cyAodmlhIHNlbnNlIHJlc2lzdG9yKSAqLworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGN1cnIxX2lucHV0LCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfdmFsdWUsIE5VTEwsCisJCQkgIExUQzI5NDVfU0VOU0VfSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGN1cnIxX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIGx0YzI5NDVfc2hvd192YWx1ZSwKKwkJCSAgbHRjMjk0NV9zZXRfdmFsdWUsIExUQzI5NDVfTUlOX1NFTlNFX1RIUkVTX0gpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihjdXJyMV9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBsdGMyOTQ1X3Nob3dfdmFsdWUsCisJCQkgIGx0YzI5NDVfc2V0X3ZhbHVlLCBMVEMyOTQ1X01BWF9TRU5TRV9USFJFU19IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoY3VycjFfbG93ZXN0LCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfdmFsdWUsIE5VTEwsCisJCQkgIExUQzI5NDVfTUlOX1NFTlNFX0gpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihjdXJyMV9oaWdoZXN0LCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfdmFsdWUsIE5VTEwsCisJCQkgIExUQzI5NDVfTUFYX1NFTlNFX0gpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihjdXJyMV9yZXNldF9oaXN0b3J5LCBTX0lXVVNSLCBOVUxMLAorCQkJICBsdGMyOTQ1X3Jlc2V0X2hpc3RvcnksIExUQzI5NDVfTUlOX1NFTlNFX0gpOworCisvKiBDdXJyZW50IGFsYXJtcyAqLworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGN1cnIxX21pbl9hbGFybSwgU19JUlVHTywgbHRjMjk0NV9zaG93X2Jvb2wsIE5VTEwsCisJCQkgIEZBVUxUX1NFTlNFX1VWKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoY3VycjFfbWF4X2FsYXJtLCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgRkFVTFRfU0VOU0VfT1YpOworCisvKiBQb3dlciAqLworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHBvd2VyMV9pbnB1dCwgU19JUlVHTywgbHRjMjk0NV9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEMyOTQ1X1BPV0VSX0gpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwb3dlcjFfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgbHRjMjk0NV9zaG93X3ZhbHVlLAorCQkJICBsdGMyOTQ1X3NldF92YWx1ZSwgTFRDMjk0NV9NSU5fUE9XRVJfVEhSRVNfSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHBvd2VyMV9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBsdGMyOTQ1X3Nob3dfdmFsdWUsCisJCQkgIGx0YzI5NDVfc2V0X3ZhbHVlLCBMVEMyOTQ1X01BWF9QT1dFUl9USFJFU19IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocG93ZXIxX2lucHV0X2xvd2VzdCwgU19JUlVHTywgbHRjMjk0NV9zaG93X3ZhbHVlLAorCQkJICBOVUxMLCBMVEMyOTQ1X01JTl9QT1dFUl9IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocG93ZXIxX2lucHV0X2hpZ2hlc3QsIFNfSVJVR08sIGx0YzI5NDVfc2hvd192YWx1ZSwKKwkJCSAgTlVMTCwgTFRDMjk0NV9NQVhfUE9XRVJfSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHBvd2VyMV9yZXNldF9oaXN0b3J5LCBTX0lXVVNSLCBOVUxMLAorCQkJICBsdGMyOTQ1X3Jlc2V0X2hpc3RvcnksIExUQzI5NDVfTUlOX1BPV0VSX0gpOworCisvKiBQb3dlciBhbGFybXMgKi8KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwb3dlcjFfbWluX2FsYXJtLCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgRkFVTFRfUE9XRVJfVVYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwb3dlcjFfbWF4X2FsYXJtLCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgRkFVTFRfUE9XRVJfT1YpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbHRjMjk0NV9hdHRyc1tdID0geworCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbG93ZXN0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfaGlnaGVzdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX3Jlc2V0X2hpc3RvcnkuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKworCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfbG93ZXN0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfaGlnaGVzdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX3Jlc2V0X2hpc3RvcnkuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKworCSZzZW5zb3JfZGV2X2F0dHJfY3VycjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfY3VycjFfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9jdXJyMV9sb3dlc3QuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX2hpZ2hlc3QuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX3Jlc2V0X2hpc3RvcnkuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfY3VycjFfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisKKwkmc2Vuc29yX2Rldl9hdHRyX3Bvd2VyMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXIxX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXIxX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXIxX2lucHV0X2xvd2VzdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXIxX2lucHV0X2hpZ2hlc3QuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3Bvd2VyMV9yZXNldF9oaXN0b3J5LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wb3dlcjFfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wb3dlcjFfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisKKwlOVUxMLAorfTsKK0FUVFJJQlVURV9HUk9VUFMobHRjMjk0NSk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBsdGMyOTQ1X3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSA4LAorCS5tYXhfcmVnaXN0ZXIgPSBMVEMyOTQ1X01JTl9BRElOX1RIUkVTX0wsCit9OworCitzdGF0aWMgaW50IGx0YzI5NDVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisKKwlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZsdGMyOTQ1X3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIocmVnbWFwKSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXBcbiIpOworCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOworCX0KKworCS8qIENsZWFyIGZhdWx0cyAqLworCXJlZ21hcF93cml0ZShyZWdtYXAsIExUQzI5NDVfRkFVTFQsIDB4MDApOworCisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBjbGllbnQtPm5hbWUsCisJCQkJCQkJICAgcmVnbWFwLAorCQkJCQkJCSAgIGx0YzI5NDVfZ3JvdXBzKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsdGMyOTQ1X2lkW10gPSB7CisJeyJsdGMyOTQ1IiwgMH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbHRjMjk0NV9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsdGMyOTQ1X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJsdGMyOTQ1IiwKKwkJICAgfSwKKwkucHJvYmUgPSBsdGMyOTQ1X3Byb2JlLAorCS5pZF90YWJsZSA9IGx0YzI5NDVfaWQsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihsdGMyOTQ1X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkd1ZW50ZXIgUm9lY2sgPGxpbnV4QHJvZWNrLXVzLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTFRDMjk0NSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbHRjNDIxNS5jIGIvZHJpdmVycy9od21vbi9sdGM0MjE1LmMKaW5kZXggOGExNDI5Ni4uYzhhOWJkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sdGM0MjE1LmMKKysrIGIvZHJpdmVycy9od21vbi9sdGM0MjE1LmMKQEAgLTMzLDcgKzMzLDcgQEAKIH07CiAKIHN0cnVjdCBsdGM0MjE1X2RhdGEgewotCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCiAJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOwogCWJvb2wgdmFsaWQ7CkBAIC00NSw4ICs0NSw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbHRjNDIxNV9kYXRhICpsdGM0MjE1X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGx0YzQyMTVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBsdGM0MjE1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXMzMiB2YWw7CiAJaW50IGk7CiAKQEAgLTIxNCw3ICsyMTQsNyBAQAogICogRmluYWxseSwgY29uc3RydWN0IGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIG1lbWJlcnMgb2YgdGhlIGFib3ZlIG9iamVjdHMsCiAgKiBhcyByZXF1aXJlZCBmb3Igc3lzZnNfY3JlYXRlX2dyb3VwKCkKICAqLwotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmx0YzQyMTVfYXR0cmlidXRlc1tdID0geworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmx0YzQyMTVfYXR0cnNbXSA9IHsKIAkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9jdXJyMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIApAQCAtMjI5LDU3ICsyMjksMzMgQEAKIAogCU5VTEwsCiB9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsdGM0MjE1X2dyb3VwID0gewotCS5hdHRycyA9IGx0YzQyMTVfYXR0cmlidXRlcywKLX07CitBVFRSSUJVVEVfR1JPVVBTKGx0YzQyMTUpOwogCiBzdGF0aWMgaW50IGx0YzQyMTVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKIAlzdHJ1Y3QgbHRjNDIxNV9kYXRhICpkYXRhOwotCWludCByZXQ7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWRhdGEgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOworCWRhdGEtPmNsaWVudCA9IGNsaWVudDsKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBMVEM0MjE1IGNoaXAgKi8KIAlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTFRDNDIxNV9GQVVMVCwgMHgwMCk7CiAKLQkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwotCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmx0YzQyMTVfZ3JvdXApOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKLQlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKLQkJcmV0ID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOwotCQlnb3RvIG91dF9od21vbl9kZXZpY2VfcmVnaXN0ZXI7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLW91dF9od21vbl9kZXZpY2VfcmVnaXN0ZXI6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbHRjNDIxNV9ncm91cCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBsdGM0MjE1X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBsdGM0MjE1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbHRjNDIxNV9ncm91cCk7Ci0KLQlyZXR1cm4gMDsKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgICBkYXRhLAorCQkJCQkJCSAgIGx0YzQyMTVfZ3JvdXBzKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsdGM0MjE1X2lkW10gPSB7CkBAIC0yOTQsNyArMjcwLDYgQEAKIAkJLm5hbWUJPSAibHRjNDIxNSIsCiAJfSwKIAkucHJvYmUJCT0gbHRjNDIxNV9wcm9iZSwKLQkucmVtb3ZlCQk9IGx0YzQyMTVfcmVtb3ZlLAogCS5pZF90YWJsZQk9IGx0YzQyMTVfaWQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2x0YzQyMjIuYyBiL2RyaXZlcnMvaHdtb24vbHRjNDIyMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzI1NjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL2x0YzQyMjIuYwpAQCAtMCwwICsxLDIzNyBAQAorLyoKKyAqIERyaXZlciBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDNDIyMiBEdWFsIEhvdCBTd2FwIGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgR3VlbnRlciBSb2VjaworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKy8qIGNoaXAgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTFRDNDIyMl9DT05UUk9MMQkweGQwCisjZGVmaW5lIExUQzQyMjJfQUxFUlQxCQkweGQxCisjZGVmaW5lIExUQzQyMjJfU1RBVFVTMQkJMHhkMgorI2RlZmluZSBMVEM0MjIyX0ZBVUxUMQkJMHhkMworI2RlZmluZSBMVEM0MjIyX0NPTlRST0wyCTB4ZDQKKyNkZWZpbmUgTFRDNDIyMl9BTEVSVDIJCTB4ZDUKKyNkZWZpbmUgTFRDNDIyMl9TVEFUVVMyCQkweGQ2CisjZGVmaW5lIExUQzQyMjJfRkFVTFQyCQkweGQ3CisjZGVmaW5lIExUQzQyMjJfU09VUkNFMQkJMHhkOAorI2RlZmluZSBMVEM0MjIyX1NPVVJDRTIJCTB4ZGEKKyNkZWZpbmUgTFRDNDIyMl9BRElOMQkJMHhkYworI2RlZmluZSBMVEM0MjIyX0FESU4yCQkweGRlCisjZGVmaW5lIExUQzQyMjJfU0VOU0UxCQkweGUwCisjZGVmaW5lIExUQzQyMjJfU0VOU0UyCQkweGUyCisjZGVmaW5lIExUQzQyMjJfQURDX0NPTlRST0wJMHhlNAorCisvKgorICogRmF1bHQgcmVnaXN0ZXIgYml0cworICovCisjZGVmaW5lIEZBVUxUX09WCUJJVCgwKQorI2RlZmluZSBGQVVMVF9VVglCSVQoMSkKKyNkZWZpbmUgRkFVTFRfT0MJQklUKDIpCisjZGVmaW5lIEZBVUxUX1BPV0VSX0JBRAlCSVQoMykKKyNkZWZpbmUgRkFVTFRfRkVUX0JBRAlCSVQoNSkKKworLyogUmV0dXJuIHRoZSB2b2x0YWdlIGZyb20gdGhlIGdpdmVuIHJlZ2lzdGVyIGluIG1WIG9yIG1BICovCitzdGF0aWMgaW50IGx0YzQyMjJfZ2V0X3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggcmVnKQoreworCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGludCB2YWw7CisJdTggYnVmWzJdOworCWludCByZXQ7CisKKwlyZXQgPSByZWdtYXBfYnVsa19yZWFkKHJlZ21hcCwgcmVnLCBidWYsIDIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJdmFsID0gKChidWZbMF0gPDwgOCkgKyBidWZbMV0pID4+IDY7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTFRDNDIyMl9BRElOMToKKwljYXNlIExUQzQyMjJfQURJTjI6CisJCS8qIDEuMjUgbVYgcmVzb2x1dGlvbi4gQ29udmVydCB0byBtVi4gKi8KKwkJdmFsID0gRElWX1JPVU5EX0NMT1NFU1QodmFsICogNSwgNCk7CisJCWJyZWFrOworCWNhc2UgTFRDNDIyMl9TT1VSQ0UxOgorCWNhc2UgTFRDNDIyMl9TT1VSQ0UyOgorCQkvKiAzMS4yNSBtViByZXNvbHV0aW9uLiBDb252ZXJ0IHRvIG1WLiAqLworCQl2YWwgPSBESVZfUk9VTkRfQ0xPU0VTVCh2YWwgKiAxMjUsIDQpOworCQlicmVhazsKKwljYXNlIExUQzQyMjJfU0VOU0UxOgorCWNhc2UgTFRDNDIyMl9TRU5TRTI6CisJCS8qCisJCSAqIDYyLjUgdVYgcmVzb2x1dGlvbi4gQ29udmVydCB0byBjdXJyZW50IGFzIG1lYXN1cmVkIHdpdGgKKwkJICogYW4gMSBtT2htIHNlbnNlIHJlc2lzdG9yLCBpbiBtQS4gSWYgYSBkaWZmZXJlbnQgc2Vuc2UKKwkJICogcmVzaXN0b3IgaXMgaW5zdGFsbGVkLCBjYWxjdWxhdGUgdGhlIGFjdHVhbCBjdXJyZW50IGJ5CisJCSAqIGRpdmlkaW5nIHRoZSByZXBvcnRlZCBjdXJyZW50IGJ5IHRoZSBzZW5zZSByZXNpc3RvciB2YWx1ZQorCQkgKiBpbiBtT2htLgorCQkgKi8KKwkJdmFsID0gRElWX1JPVU5EX0NMT1NFU1QodmFsICogMTI1LCAyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzQyMjJfc2hvd192YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGEpOworCWludCB2YWx1ZTsKKworCXZhbHVlID0gbHRjNDIyMl9nZXRfdmFsdWUoZGV2LCBhdHRyLT5pbmRleCk7CisJaWYgKHZhbHVlIDwgMCkKKwkJcmV0dXJuIHZhbHVlOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzQyMjJfc2hvd19ib29sKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkYSk7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IGZhdWx0OworCWludCByZXQ7CisKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIGF0dHItPm5yLCAmZmF1bHQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWZhdWx0ICY9IGF0dHItPmluZGV4OworCWlmIChmYXVsdCkJCS8qIENsZWFyIHJlcG9ydGVkIGZhdWx0cyBpbiBjaGlwIHJlZ2lzdGVyICovCisJCXJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIGF0dHItPm5yLCBhdHRyLT5pbmRleCwgMCk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgISFmYXVsdCk7Cit9CisKKy8qIFZvbHRhZ2VzICovCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9pbnB1dCwgU19JUlVHTywgbHRjNDIyMl9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEM0MjIyX1NPVVJDRTEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfaW5wdXQsIFNfSVJVR08sIGx0YzQyMjJfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDNDIyMl9BRElOMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluM19pbnB1dCwgU19JUlVHTywgbHRjNDIyMl9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEM0MjIyX1NPVVJDRTIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjRfaW5wdXQsIFNfSVJVR08sIGx0YzQyMjJfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDNDIyMl9BRElOMik7CisKKy8qCisgKiBWb2x0YWdlIGFsYXJtcworICogVVYvT1YgZmF1bHRzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0IHZvbHRhZ2UsIGFuZCBwb3dlciBiYWQgYW5kIGZldAorICogZmF1bHRzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIG91dHB1dCB2b2x0YWdlLgorICovCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4xX21pbl9hbGFybSwgU19JUlVHTywgbHRjNDIyMl9zaG93X2Jvb2wsIE5VTEwsCisJCQkgICAgTFRDNDIyMl9GQVVMVDEsIEZBVUxUX1VWKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjFfbWF4X2FsYXJtLCBTX0lSVUdPLCBsdGM0MjIyX3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgICBMVEM0MjIyX0ZBVUxUMSwgRkFVTFRfT1YpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMl9hbGFybSwgU19JUlVHTywgbHRjNDIyMl9zaG93X2Jvb2wsIE5VTEwsCisJCQkgICAgTFRDNDIyMl9GQVVMVDEsIEZBVUxUX1BPV0VSX0JBRCB8IEZBVUxUX0ZFVF9CQUQpOworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4zX21pbl9hbGFybSwgU19JUlVHTywgbHRjNDIyMl9zaG93X2Jvb2wsIE5VTEwsCisJCQkgICAgTFRDNDIyMl9GQVVMVDIsIEZBVUxUX1VWKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjNfbWF4X2FsYXJtLCBTX0lSVUdPLCBsdGM0MjIyX3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgICBMVEM0MjIyX0ZBVUxUMiwgRkFVTFRfT1YpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluNF9hbGFybSwgU19JUlVHTywgbHRjNDIyMl9zaG93X2Jvb2wsIE5VTEwsCisJCQkgICAgTFRDNDIyMl9GQVVMVDIsIEZBVUxUX1BPV0VSX0JBRCB8IEZBVUxUX0ZFVF9CQUQpOworCisvKiBDdXJyZW50ICh2aWEgc2Vuc2UgcmVzaXN0b3IpICovCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGN1cnIxX2lucHV0LCBTX0lSVUdPLCBsdGM0MjIyX3Nob3dfdmFsdWUsIE5VTEwsCisJCQkgIExUQzQyMjJfU0VOU0UxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoY3VycjJfaW5wdXQsIFNfSVJVR08sIGx0YzQyMjJfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDNDIyMl9TRU5TRTIpOworCisvKiBPdmVyY3VycmVudCBhbGFybSAqLworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGN1cnIxX21heF9hbGFybSwgU19JUlVHTywgbHRjNDIyMl9zaG93X2Jvb2wsIE5VTEwsCisJCQkgICAgTFRDNDIyMl9GQVVMVDEsIEZBVUxUX09DKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihjdXJyMl9tYXhfYWxhcm0sIFNfSVJVR08sIGx0YzQyMjJfc2hvd19ib29sLCBOVUxMLAorCQkJICAgIExUQzQyMjJfRkFVTFQyLCBGQVVMVF9PQyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsdGM0MjIyX2F0dHJzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW40X2FsYXJtLmRldl9hdHRyLmF0dHIsCisKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9jdXJyMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIyX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9jdXJyMl9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKworCU5VTEwsCit9OworQVRUUklCVVRFX0dST1VQUyhsdGM0MjIyKTsKKworc3RhdGljIHN0cnVjdCByZWdtYXBfY29uZmlnIGx0YzQyMjJfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisJLm1heF9yZWdpc3RlciA9IExUQzQyMjJfQURDX0NPTlRST0wsCit9OworCitzdGF0aWMgaW50IGx0YzQyMjJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisKKwlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZsdGM0MjIyX3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIocmVnbWFwKSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXBcbiIpOworCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOworCX0KKworCS8qIENsZWFyIGZhdWx0cyAqLworCXJlZ21hcF93cml0ZShyZWdtYXAsIExUQzQyMjJfRkFVTFQxLCAweDAwKTsKKwlyZWdtYXBfd3JpdGUocmVnbWFwLCBMVEM0MjIyX0ZBVUxUMiwgMHgwMCk7CisKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgICByZWdtYXAsCisJCQkJCQkJICAgbHRjNDIyMl9ncm91cHMpOworCXJldHVybiBQVFJfRVJSX09SX1pFUk8oaHdtb25fZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGx0YzQyMjJfaWRbXSA9IHsKKwl7Imx0YzQyMjIiLCAwfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBsdGM0MjIyX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGx0YzQyMjJfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gImx0YzQyMjIiLAorCQkgICB9LAorCS5wcm9iZSA9IGx0YzQyMjJfcHJvYmUsCisJLmlkX3RhYmxlID0gbHRjNDIyMl9pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKGx0YzQyMjJfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiR3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMVEM0MjIyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sdGM0MjQ1LmMgYi9kcml2ZXJzL2h3bW9uL2x0YzQyNDUuYwppbmRleCBkNDE3MjkzMy4uNjgxYjViNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sdGM0MjQ1LmMKKysrIGIvZHJpdmVycy9od21vbi9sdGM0MjQ1LmMKQEAgLTk1LDcgKzk1LDYgQEAKIAkgKiByZWFkaW5ncyBhcyBzdGFsZSBieSBzZXR0aW5nIHRoZW0gdG8gLUVBR0FJTgogCSAqLwogCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIDUgKiBIWikpIHsKLQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJNYXJraW5nIEdQSU9zIGludmFsaWRcbiIpOwogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYXRhLT5ncGlvcyk7IGkrKykKIAkJCWRhdGEtPmdwaW9zW2ldID0gLUVBR0FJTjsKIAl9CkBAIC0xNDEsOCArMTQwLDYgQEAKIAogCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaKSB8fCAhZGF0YS0+dmFsaWQpIHsKIAotCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlN0YXJ0aW5nIGx0YzQyNDUgdXBkYXRlXG4iKTsKLQogCQkvKiBSZWFkIGNvbnRyb2wgcmVnaXN0ZXJzIC0tIDB4MDAgdG8gMHgwNyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYXRhLT5jcmVncyk7IGkrKykgewogCQkJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgaSk7CkBAIC00NzAsMTkgKzQ2NywxNSBAQAogc3RhdGljIGJvb2wgbHRjNDI0NV91c2VfZXh0cmFfZ3Bpb3Moc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgbHRjNDI0NV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJmNsaWVudC0+ZGV2KTsKLSNpZmRlZiBDT05GSUdfT0YKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gY2xpZW50LT5kZXYub2Zfbm9kZTsKLSNlbmRpZgogCiAJLyogcHJlZmVyIHBsYXRmb3JtIGRhdGEgKi8KIAlpZiAocGRhdGEpCiAJCXJldHVybiBwZGF0YS0+dXNlX2V4dHJhX2dwaW9zOwogCi0jaWZkZWYgQ09ORklHX09GCiAJLyogZmFsbGJhY2sgb24gT0YgKi8KIAlpZiAob2ZfZmluZF9wcm9wZXJ0eShucCwgImx0YzQyNDUsdXNlLWV4dHJhLWdwaW9zIiwgTlVMTCkpCiAJCXJldHVybiB0cnVlOwotI2VuZGlmCiAKIAlyZXR1cm4gZmFsc2U7CiB9CkBAIC01MTIsMjQgKzUwNSwxMCBAQAogCS8qIEFkZCBzeXNmcyBob29rcyAqLwogCWx0YzQyNDVfc3lzZnNfYWRkX2dyb3VwcyhkYXRhKTsKIAotCWh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcygmY2xpZW50LT5kZXYsCi0JCQkJCQkgICAgICBjbGllbnQtPm5hbWUsIGRhdGEsCi0JCQkJCQkgICAgICBkYXRhLT5ncm91cHMpOwotCWlmIChJU19FUlIoaHdtb25fZGV2KSkKLQkJcmV0dXJuIFBUUl9FUlIoaHdtb25fZGV2KTsKLQotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGh3bW9uX2Rldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBsdGM0MjQ1X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoaHdtb25fZGV2KTsKLQotCXJldHVybiAwOworCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKCZjbGllbnQtPmRldiwKKwkJCQkJCQkgICBjbGllbnQtPm5hbWUsIGRhdGEsCisJCQkJCQkJICAgZGF0YS0+Z3JvdXBzKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsdGM0MjQ1X2lkW10gPSB7CkBAIC01NDQsNyArNTIzLDYgQEAKIAkJLm5hbWUJPSAibHRjNDI0NSIsCiAJfSwKIAkucHJvYmUJCT0gbHRjNDI0NV9wcm9iZSwKLQkucmVtb3ZlCQk9IGx0YzQyNDVfcmVtb3ZlLAogCS5pZF90YWJsZQk9IGx0YzQyNDVfaWQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2x0YzQyNjAuYyBiL2RyaXZlcnMvaHdtb24vbHRjNDI2MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1M2EyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL2x0YzQyNjAuYwpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIERyaXZlciBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDNDI2MCBJMkMgUG9zaXRpdmUgVm9sdGFnZSBIb3QgU3dhcCBDb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0IEd1ZW50ZXIgUm9lY2sKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisvKiBjaGlwIHJlZ2lzdGVycyAqLworI2RlZmluZSBMVEM0MjYwX0NPTlRST0wJMHgwMAorI2RlZmluZSBMVEM0MjYwX0FMRVJUCTB4MDEKKyNkZWZpbmUgTFRDNDI2MF9TVEFUVVMJMHgwMgorI2RlZmluZSBMVEM0MjYwX0ZBVUxUCTB4MDMKKyNkZWZpbmUgTFRDNDI2MF9TRU5TRQkweDA0CisjZGVmaW5lIExUQzQyNjBfU09VUkNFCTB4MDUKKyNkZWZpbmUgTFRDNDI2MF9BRElOCTB4MDYKKworLyoKKyAqIEZhdWx0IHJlZ2lzdGVyIGJpdHMKKyAqLworI2RlZmluZSBGQVVMVF9PVgkoMSA8PCAwKQorI2RlZmluZSBGQVVMVF9VVgkoMSA8PCAxKQorI2RlZmluZSBGQVVMVF9PQwkoMSA8PCAyKQorI2RlZmluZSBGQVVMVF9QT1dFUl9CQUQJKDEgPDwgMykKKyNkZWZpbmUgRkFVTFRfRkVUX1NIT1JUCSgxIDw8IDUpCisKKy8qIFJldHVybiB0aGUgdm9sdGFnZSBmcm9tIHRoZSBnaXZlbiByZWdpc3RlciBpbiBtViBvciBtQSAqLworc3RhdGljIGludCBsdGM0MjYwX2dldF92YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IHJlZykKK3sKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIHJlZywgJnZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTFRDNDI2MF9BRElOOgorCQkvKiAxMCBtViByZXNvbHV0aW9uLiBDb252ZXJ0IHRvIG1WLiAqLworCQl2YWwgPSB2YWwgKiAxMDsKKwkJYnJlYWs7CisJY2FzZSBMVEM0MjYwX1NPVVJDRToKKwkJLyogNDAwIG1WIHJlc29sdXRpb24uIENvbnZlcnQgdG8gbVYuICovCisJCXZhbCA9IHZhbCAqIDQwMDsKKwkJYnJlYWs7CisJY2FzZSBMVEM0MjYwX1NFTlNFOgorCQkvKgorCQkgKiAzMDAgdVYgcmVzb2x1dGlvbi4gQ29udmVydCB0byBjdXJyZW50IGFzIG1lYXN1cmVkIHdpdGgKKwkJICogYW4gMSBtT2htIHNlbnNlIHJlc2lzdG9yLCBpbiBtQS4gSWYgYSBkaWZmZXJlbnQgc2Vuc2UKKwkJICogcmVzaXN0b3IgaXMgaW5zdGFsbGVkLCBjYWxjdWxhdGUgdGhlIGFjdHVhbCBjdXJyZW50IGJ5CisJCSAqIGRpdmlkaW5nIHRoZSByZXBvcnRlZCBjdXJyZW50IGJ5IHRoZSBzZW5zZSByZXNpc3RvciB2YWx1ZQorCQkgKiBpbiBtT2htLgorCQkgKi8KKwkJdmFsID0gdmFsICogMzAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgc3NpemVfdCBsdGM0MjYwX3Nob3dfdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKKwlpbnQgdmFsdWU7CisKKwl2YWx1ZSA9IGx0YzQyNjBfZ2V0X3ZhbHVlKGRldiwgYXR0ci0+aW5kZXgpOworCWlmICh2YWx1ZSA8IDApCisJCXJldHVybiB2YWx1ZTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgdmFsdWUpOworfQorCitzdGF0aWMgc3NpemVfdCBsdGM0MjYwX3Nob3dfYm9vbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IGZhdWx0OworCWludCByZXQ7CisKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIExUQzQyNjBfRkFVTFQsICZmYXVsdCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmYXVsdCAmPSBhdHRyLT5pbmRleDsKKwlpZiAoZmF1bHQpCQkvKiBDbGVhciByZXBvcnRlZCBmYXVsdHMgaW4gY2hpcCByZWdpc3RlciAqLworCQlyZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCBMVEM0MjYwX0ZBVUxULCBhdHRyLT5pbmRleCwgMCk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgISFmYXVsdCk7Cit9CisKKy8qIFZvbHRhZ2VzICovCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9pbnB1dCwgU19JUlVHTywgbHRjNDI2MF9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEM0MjYwX1NPVVJDRSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9pbnB1dCwgU19JUlVHTywgbHRjNDI2MF9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEM0MjYwX0FESU4pOworCisvKgorICogVm9sdGFnZSBhbGFybXMKKyAqIFVWL09WIGZhdWx0cyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCB2b2x0YWdlLCBhbmQgdGhlIFBPV0VSIEJBRCBhbmQKKyAqIEZFVCBTSE9SVCBmYXVsdHMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3V0cHV0IHZvbHRhZ2UuCisgKi8KK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX21pbl9hbGFybSwgU19JUlVHTywgbHRjNDI2MF9zaG93X2Jvb2wsIE5VTEwsCisJCQkgIEZBVUxUX1VWKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX21heF9hbGFybSwgU19JUlVHTywgbHRjNDI2MF9zaG93X2Jvb2wsIE5VTEwsCisJCQkgIEZBVUxUX09WKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX2FsYXJtLCBTX0lSVUdPLCBsdGM0MjYwX3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgRkFVTFRfUE9XRVJfQkFEIHwgRkFVTFRfRkVUX1NIT1JUKTsKKworLyogQ3VycmVudCAodmlhIHNlbnNlIHJlc2lzdG9yKSAqLworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihjdXJyMV9pbnB1dCwgU19JUlVHTywgbHRjNDI2MF9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEM0MjYwX1NFTlNFKTsKKworLyogT3ZlcmN1cnJlbnQgYWxhcm0gKi8KK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoY3VycjFfbWF4X2FsYXJtLCBTX0lSVUdPLCBsdGM0MjYwX3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgRkFVTFRfT0MpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbHRjNDI2MF9hdHRyc1tdID0geworCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCisJJnNlbnNvcl9kZXZfYXR0cl9jdXJyMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfY3VycjFfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisKKwlOVUxMLAorfTsKK0FUVFJJQlVURV9HUk9VUFMobHRjNDI2MCk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBsdGM0MjYwX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSA4LAorCS5tYXhfcmVnaXN0ZXIgPSBMVEM0MjYwX0FESU4sCit9OworCitzdGF0aWMgaW50IGx0YzQyNjBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisKKwlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZsdGM0MjYwX3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIocmVnbWFwKSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXBcbiIpOworCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOworCX0KKworCS8qIENsZWFyIGZhdWx0cyAqLworCXJlZ21hcF93cml0ZShyZWdtYXAsIExUQzQyNjBfRkFVTFQsIDB4MDApOworCisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBjbGllbnQtPm5hbWUsCisJCQkJCQkJICAgcmVnbWFwLAorCQkJCQkJCSAgIGx0YzQyNjBfZ3JvdXBzKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsdGM0MjYwX2lkW10gPSB7CisJeyJsdGM0MjYwIiwgMH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbHRjNDI2MF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsdGM0MjYwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJsdGM0MjYwIiwKKwkJICAgfSwKKwkucHJvYmUgPSBsdGM0MjYwX3Byb2JlLAorCS5pZF90YWJsZSA9IGx0YzQyNjBfaWQsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihsdGM0MjYwX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkd1ZW50ZXIgUm9lY2sgPGxpbnV4QHJvZWNrLXVzLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTFRDNDI2MCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbWF4MTY2OC5jIGIvZHJpdmVycy9od21vbi9tYXgxNjY4LmMKaW5kZXggMDI5YjY1ZS4uZTNlZDBhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9tYXgxNjY4LmMKKysrIGIvZHJpdmVycy9od21vbi9tYXgxNjY4LmMKQEAgLTY2LDcgKzY2LDggQEAKIGVudW0gY2hpcHMgeyBtYXgxNjY4LCBtYXgxODA1LCBtYXgxOTg5IH07CiAKIHN0cnVjdCBtYXgxNjY4X2RhdGEgewotCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmdyb3Vwc1szXTsKIAllbnVtIGNoaXBzIHR5cGU7CiAKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CkBAIC04Miw4ICs4Myw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWF4MTY2OF9kYXRhICptYXgxNjY4X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXN0cnVjdCBtYXgxNjY4X2RhdGEgKnJldCA9IGRhdGE7CiAJczMyIHZhbDsKIAlpbnQgaTsKQEAgLTIwNSw4ICsyMDYsOCBAQAogCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbWF4MTY2OF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJbG9uZyB0ZW1wOwogCWludCByZXQ7CiAKQEAgLTIxNiwxMCArMjE3LDExIEBACiAKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJZGF0YS0+dGVtcF9tYXhbaW5kZXhdID0gY2xhbXBfdmFsKHRlbXAvMTAwMCwgLTEyOCwgMTI3KTsKLQlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCiAJCQkJCU1BWDE2NjhfUkVHX0xJTUhfV1IoaW5kZXgpLAotCQkJCQlkYXRhLT50ZW1wX21heFtpbmRleF0pKQotCQljb3VudCA9IC1FSU87CisJCQkJCWRhdGEtPnRlbXBfbWF4W2luZGV4XSk7CisJaWYgKHJldCA8IDApCisJCWNvdW50ID0gcmV0OwogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJcmV0dXJuIGNvdW50OwpAQCAtMjMwLDggKzIzMiw4IEBACiAJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbWF4MTY2OF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAlsb25nIHRlbXA7CiAJaW50IHJldDsKIApAQCAtMjQxLDEwICsyNDMsMTEgQEAKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlkYXRhLT50ZW1wX21pbltpbmRleF0gPSBjbGFtcF92YWwodGVtcC8xMDAwLCAtMTI4LCAxMjcpOwotCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKIAkJCQkJTUFYMTY2OF9SRUdfTElNTF9XUihpbmRleCksCi0JCQkJCWRhdGEtPnRlbXBfbWluW2luZGV4XSkpCi0JCWNvdW50ID0gLUVJTzsKKwkJCQkJZGF0YS0+dGVtcF9taW5baW5kZXhdKTsKKwlpZiAocmV0IDwgMCkKKwkJY291bnQgPSByZXQ7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC00MDUsNjAgKzQwOCwyOSBAQAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIAlzdHJ1Y3QgbWF4MTY2OF9kYXRhICpkYXRhOwotCWludCBlcnI7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGF0YSA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZihzdHJ1Y3QgbWF4MTY2OF9kYXRhKSwKLQkJCSAgICBHRlBfS0VSTkVMKTsKKwlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBtYXgxNjY4X2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OwogCWRhdGEtPnR5cGUgPSBpZC0+ZHJpdmVyX2RhdGE7CiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCi0JLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KLQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZtYXgxNjY4X2dyb3VwX2NvbW1vbik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmIChkYXRhLT50eXBlID09IG1heDE2NjggfHwgZGF0YS0+dHlwZSA9PSBtYXgxOTg5KSB7Ci0JCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwKLQkJCQkJICZtYXgxNjY4X2dyb3VwX3VuaXF1ZSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycm9yX3N5c3JlbTA7Ci0JfQotCi0JZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldik7Ci0JaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7Ci0JCWVyciA9IFBUUl9FUlIoZGF0YS0+aHdtb25fZGV2KTsKLQkJZ290byBlcnJvcl9zeXNyZW0xOwotCX0KLQotCXJldHVybiAwOwotCi1lcnJvcl9zeXNyZW0xOgorCS8qIHN5c2ZzIGhvb2tzICovCisJZGF0YS0+Z3JvdXBzWzBdID0gJm1heDE2NjhfZ3JvdXBfY29tbW9uOwogCWlmIChkYXRhLT50eXBlID09IG1heDE2NjggfHwgZGF0YS0+dHlwZSA9PSBtYXgxOTg5KQotCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZtYXgxNjY4X2dyb3VwX3VuaXF1ZSk7Ci1lcnJvcl9zeXNyZW0wOgotCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDE2NjhfZ3JvdXBfY29tbW9uKTsKLQlyZXR1cm4gZXJyOwotfQorCQlkYXRhLT5ncm91cHNbMV0gPSAmbWF4MTY2OF9ncm91cF91bmlxdWU7CiAKLXN0YXRpYyBpbnQgbWF4MTY2OF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbWF4MTY2OF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwotCWlmIChkYXRhLT50eXBlID09IG1heDE2NjggfHwgZGF0YS0+dHlwZSA9PSBtYXgxOTg5KQotCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZtYXgxNjY4X2dyb3VwX3VuaXF1ZSk7Ci0KLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZtYXgxNjY4X2dyb3VwX2NvbW1vbik7Ci0KLQlyZXR1cm4gMDsKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgICBkYXRhLCBkYXRhLT5ncm91cHMpOworCXJldHVybiBQVFJfRVJSX09SX1pFUk8oaHdtb25fZGV2KTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG1heDE2NjhfaWRbXSA9IHsKQEAgLTQ3Niw3ICs0NDgsNiBAQAogCQkgIC5uYW1lCT0gIm1heDE2NjgiLAogCQkgIH0sCiAJLnByb2JlID0gbWF4MTY2OF9wcm9iZSwKLQkucmVtb3ZlCT0gbWF4MTY2OF9yZW1vdmUsCiAJLmlkX3RhYmxlID0gbWF4MTY2OF9pZCwKIAkuZGV0ZWN0CT0gbWF4MTY2OF9kZXRlY3QsCiAJLmFkZHJlc3NfbGlzdCA9IG1heDE2NjhfYWRkcl9saXN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9tYXg2NjM5LmMgYi9kcml2ZXJzL2h3bW9uL21heDY2MzkuYwppbmRleCAwNjZlNTg3Li43MDY1MGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL21heDY2MzkuYworKysgYi9kcml2ZXJzL2h3bW9uL21heDY2MzkuYwpAQCAtODAsNyArODAsNyBAQAogICogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikKICAqLwogc3RydWN0IG1heDY2MzlfZGF0YSB7Ci0Jc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOwogCWNoYXIgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLwpAQCAtMTA0LDggKzEwNCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWF4NjYzOV9kYXRhICptYXg2NjM5X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXN0cnVjdCBtYXg2NjM5X2RhdGEgKnJldCA9IGRhdGE7CiAJaW50IGk7CiAJaW50IHN0YXR1c19yZWc7CkBAIC0xOTEsOSArMTkxLDggQEAKIHN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2X2F0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2X2F0dHIpOworCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoZGF0YS0+dGVtcF90aGVybVthdHRyLT5pbmRleF0gKiAxMDAwKSk7CiB9CkBAIC0yMDIsOSArMjAxLDkgQEAKIAkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2X2F0dHIsCiAJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldl9hdHRyKTsKKwlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAlpbnQgcmVzOwogCkBAIC0yMjQsOSArMjIzLDggQEAKIHN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9jcml0KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZfYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZfYXR0cik7CisJc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChkYXRhLT50ZW1wX2FsZXJ0W2F0dHItPmluZGV4XSAqIDEwMDApKTsKIH0KQEAgLTIzNSw5ICsyMzMsOSBAQAogCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2X2F0dHIsCiAJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZfYXR0cik7CisJc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAJaW50IHJlczsKIApAQCAtMjU4LDkgKzI1Niw4IEBACiAJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldl9hdHRyLAogCQkJCSAgIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2X2F0dHIpOworCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoZGF0YS0+dGVtcF9vdFthdHRyLT5pbmRleF0gKiAxMDAwKSk7CiB9CkBAIC0yNjksOSArMjY2LDkgQEAKIAkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZfYXR0ciwKIAkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZfYXR0cik7CisJc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAJaW50IHJlczsKIApAQCAtMjkxLDkgKzI4OCw4IEBACiBzdGF0aWMgc3NpemVfdCBzaG93X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2X2F0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2X2F0dHIpOworCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5wd21bYXR0ci0+aW5kZXhdICogMjU1IC8gMTIwKTsKIH0KQEAgLTMwMiw5ICsyOTgsOSBAQAogCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldl9hdHRyLAogCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldl9hdHRyKTsKKwlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAlpbnQgcmVzOwogCkBAIC0zNzgsNyArMzc0LDcgQEAKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfZW1lcmdlbmN5X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA0KTsKIAogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbWF4NjYzOV9hdHRyaWJ1dGVzW10gPSB7CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbWF4NjYzOV9hdHRyc1tdID0gewogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9mYXVsdC5kZXZfYXR0ci5hdHRyLApAQCAtNDAzLDEwICszOTksNyBAQAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfZW1lcmdlbmN5X2FsYXJtLmRldl9hdHRyLmF0dHIsCiAJTlVMTAogfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbWF4NjYzOV9ncm91cCA9IHsKLQkuYXR0cnMgPSBtYXg2NjM5X2F0dHJpYnV0ZXMsCi19OworQVRUUklCVVRFX0dST1VQUyhtYXg2NjM5KTsKIAogLyoKICAqICByZXR1cm5zIHJlc3BlY3RpdmUgaW5kZXggaW4gcnBtX3JhbmdlcyB0YWJsZQpAQCAtNDI0LDkgKzQxNyw5IEBACiAJcmV0dXJuIDE7IC8qIGRlZmF1bHQ6IDQwMDAgUlBNICovCiB9CiAKLXN0YXRpYyBpbnQgbWF4NjYzOV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBtYXg2NjM5X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgICAgc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IG1heDY2MzlfcGxhdGZvcm1fZGF0YSAqbWF4NjYzOV9pbmZvID0KIAkJZGV2X2dldF9wbGF0ZGF0YSgmY2xpZW50LT5kZXYpOwogCWludCBpOwpAQCAtNTQ1LDUwICs1MzgsMjcgQEAKIHN0YXRpYyBpbnQgbWF4NjYzOV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CiAJaW50IGVycjsKIAotCWRhdGEgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IG1heDY2MzlfZGF0YSksCi0JCQkgICAgR0ZQX0tFUk5FTCk7CisJZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgbWF4NjYzOV9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOworCWRhdGEtPmNsaWVudCA9IGNsaWVudDsKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBtYXg2NjM5IGNoaXAgKi8KLQllcnIgPSBtYXg2NjM5X2luaXRfY2xpZW50KGNsaWVudCk7CisJZXJyID0gbWF4NjYzOV9pbml0X2NsaWVudChjbGllbnQsIGRhdGEpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KLQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZtYXg2NjM5X2dyb3VwKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldik7Ci0JaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7Ci0JCWVyciA9IFBUUl9FUlIoZGF0YS0+aHdtb25fZGV2KTsKLQkJZ290byBlcnJvcl9yZW1vdmU7Ci0JfQotCi0JZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAidGVtcGVyYXR1cmUgc2Vuc29yIGFuZCBmYW4gY29udHJvbCBmb3VuZFxuIik7Ci0KLQlyZXR1cm4gMDsKLQotZXJyb3JfcmVtb3ZlOgotCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDY2MzlfZ3JvdXApOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4NjYzOV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDY2MzlfZ3JvdXApOwotCi0JcmV0dXJuIDA7CisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBjbGllbnQtPm5hbWUsCisJCQkJCQkJICAgZGF0YSwKKwkJCQkJCQkgICBtYXg2NjM5X2dyb3Vwcyk7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhod21vbl9kZXYpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCkBAIC02MjIsOSArNTkyLDcgQEAKIAogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG1heDY2MzlfaWQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgbWF4NjYzOV9wbV9vcHMgPSB7Ci0JU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMobWF4NjYzOV9zdXNwZW5kLCBtYXg2NjM5X3Jlc3VtZSkKLX07CitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMobWF4NjYzOV9wbV9vcHMsIG1heDY2Mzlfc3VzcGVuZCwgbWF4NjYzOV9yZXN1bWUpOwogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWF4NjYzOV9kcml2ZXIgPSB7CiAJLmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OLApAQCAtNjMzLDcgKzYwMSw2IEBACiAJCSAgIC5wbSA9ICZtYXg2NjM5X3BtX29wcywKIAkJICAgfSwKIAkucHJvYmUgPSBtYXg2NjM5X3Byb2JlLAotCS5yZW1vdmUgPSBtYXg2NjM5X3JlbW92ZSwKIAkuaWRfdGFibGUgPSBtYXg2NjM5X2lkLAogCS5kZXRlY3QgPSBtYXg2NjM5X2RldGVjdCwKIAkuYWRkcmVzc19saXN0ID0gbm9ybWFsX2kyYywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbWF4NjY1MC5jIGIvZHJpdmVycy9od21vbi9tYXg2NjUwLmMKaW5kZXggMGNhZmMzOS4uMTYyYTUyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9tYXg2NjUwLmMKKysrIGIvZHJpdmVycy9od21vbi9tYXg2NjUwLmMKQEAgLTEwNSwzOCArMTA1LDEzIEBACiAKICNkZWZpbmUgRElWX0ZST01fUkVHKHJlZykgKDEgPDwgKHJlZyAmIDcpKQogCi1zdGF0aWMgaW50IG1heDY2NTBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpOwotc3RhdGljIGludCBtYXg2NjUwX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwotc3RhdGljIGludCBtYXg2NjUwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKLXN0YXRpYyBzdHJ1Y3QgbWF4NjY1MF9kYXRhICptYXg2NjUwX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKLQotLyoKLSAqIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpCi0gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG1heDY2NTBfaWRbXSA9IHsKLQl7ICJtYXg2NjUwIiwgMSB9LAotCXsgIm1heDY2NTEiLCA0IH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG1heDY2NTBfaWQpOwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWF4NjY1MF9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAibWF4NjY1MCIsCi0JfSwKLQkucHJvYmUJCT0gbWF4NjY1MF9wcm9iZSwKLQkucmVtb3ZlCQk9IG1heDY2NTBfcmVtb3ZlLAotCS5pZF90YWJsZQk9IG1heDY2NTBfaWQsCi19OwotCiAvKgogICogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikKICAqLwogCiBzdHJ1Y3QgbWF4NjY1MF9kYXRhIHsKLQlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwljb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpncm91cHNbM107CiAJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOwogCWludCBucl9mYW5zOwogCWNoYXIgdmFsaWQ7IC8qIHplcm8gdW50aWwgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KQEAgLTE1MSw2ICsxMjYsNTEgQEAKIAl1OCBhbGFybTsKIH07CiAKK3N0YXRpYyBjb25zdCB1OCB0YWNoX3JlZ1tdID0geworCU1BWDY2NTBfUkVHX1RBQ0gwLAorCU1BWDY2NTBfUkVHX1RBQ0gxLAorCU1BWDY2NTBfUkVHX1RBQ0gyLAorCU1BWDY2NTBfUkVHX1RBQ0gzLAorfTsKKworc3RhdGljIHN0cnVjdCBtYXg2NjUwX2RhdGEgKm1heDY2NTBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWikgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWRhdGEtPnNwZWVkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCSAgICAgICBNQVg2NjUwX1JFR19TUEVFRCk7CisJCWRhdGEtPmNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQkJTUFYNjY1MF9SRUdfQ09ORklHKTsKKwkJZm9yIChpID0gMDsgaSA8IGRhdGEtPm5yX2ZhbnM7IGkrKykgeworCQkJZGF0YS0+dGFjaFtpXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQkJCSB0YWNoX3JlZ1tpXSk7CisJCX0KKwkJZGF0YS0+Y291bnQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJCU1BWDY2NTBfUkVHX0NPVU5UKTsKKwkJZGF0YS0+ZGFjID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYNjY1MF9SRUdfREFDKTsKKworCQkvKgorCQkgKiBBbGFybXMgYXJlIGNsZWFyZWQgb24gcmVhZCBpbiBjYXNlIHRoZSBjb25kaXRpb24gdGhhdAorCQkgKiBjYXVzZWQgdGhlIGFsYXJtIGlzIHJlbW92ZWQuIEtlZXAgdGhlIHZhbHVlIGxhdGNoZWQgaGVyZQorCQkgKiBmb3IgcHJvdmlkaW5nIHRoZSByZWdpc3RlciB0aHJvdWdoIGRpZmZlcmVudCBhbGFybSBmaWxlcy4KKwkJICovCisJCWRhdGEtPmFsYXJtIHw9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQkJTUFYNjY1MF9SRUdfQUxBUk0pOworCisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCiBzdGF0aWMgc3NpemVfdCBnZXRfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCiAJCSAgICAgICBjaGFyICpidWYpCiB7CkBAIC0yMzUsOCArMjU1LDggQEAKIHN0YXRpYyBzc2l6ZV90IHNldF90YXJnZXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKIAkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAlpbnQga3NjYWxlLCBrdGFjaDsKIAl1bnNpZ25lZCBsb25nIHJwbTsKIAlpbnQgZXJyOwpAQCAtMzA0LDggKzMyNCw4IEBACiBzdGF0aWMgc3NpemVfdCBzZXRfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCiAJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAl1bnNpZ25lZCBsb25nIHB3bTsKIAlpbnQgZXJyOwogCkBAIC0zNTAsOCArMzcwLDggQEAKIHN0YXRpYyBzc2l6ZV90IHNldF9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKIAkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJaW50IG1heDY2NTBfbW9kZXNbM10gPSB7MCwgMywgMn07CiAJdW5zaWduZWQgbG9uZyBtb2RlOwogCWludCBlcnI7CkBAIC00MDAsOCArNDIwLDggQEAKIHN0YXRpYyBzc2l6ZV90IHNldF9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKIAkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXVuc2lnbmVkIGxvbmcgZGl2OwogCWludCBlcnI7CiAKQEAgLTQ0Niw3ICs0NjYsNyBAQAogewogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKIAlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gbWF4NjY1MF91cGRhdGVfZGV2aWNlKGRldik7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCWludCBhbGFybSA9IDA7CiAKIAlpZiAoZGF0YS0+YWxhcm0gJiBhdHRyLT5pbmRleCkgewpAQCAtNDg0LDcgKzUwNCw4IEBACiAJCQkJICAgIGludCBuKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXU4IGFsYXJtX2VuID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYNjY1MF9SRUdfQUxBUk1fRU4pOwogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyOwogCkBAIC01MTksNyArNTQwLDcgQEAKIAlOVUxMCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYXg2NjUwX2F0dHJfZ3JwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbWF4NjY1MF9ncm91cCA9IHsKIAkuYXR0cnMgPSBtYXg2NjUwX2F0dHJzLAogCS5pc192aXNpYmxlID0gbWF4NjY1MF9hdHRyc192aXNpYmxlLAogfTsKQEAgLTUzMSw3ICs1NTIsNyBAQAogCU5VTEwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1heDY2NTFfYXR0cl9ncnAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYXg2NjUxX2dyb3VwID0gewogCS5hdHRycyA9IG1heDY2NTFfYXR0cnMsCiB9OwogCkBAIC01MzksNzQgKzU2MCwxNyBAQAogICogUmVhbCBjb2RlCiAgKi8KIAotc3RhdGljIGludCBtYXg2NjUwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQorc3RhdGljIGludCBtYXg2NjUwX2luaXRfY2xpZW50KHN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEsCisJCQkgICAgICAgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhOwotCWludCBlcnI7Ci0KLQlkYXRhID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBtYXg2NjUwX2RhdGEpLAotCQkJICAgIEdGUF9LRVJORUwpOwotCWlmICghZGF0YSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIm91dCBvZiBtZW1vcnkuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7Ci0JbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwotCWRhdGEtPm5yX2ZhbnMgPSBpZC0+ZHJpdmVyX2RhdGE7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgdGhlIG1heDY2NTAgY2hpcAotCSAqLwotCWVyciA9IG1heDY2NTBfaW5pdF9jbGllbnQoY2xpZW50KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbWF4NjY1MF9hdHRyX2dycCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQkvKiAzIGFkZGl0aW9uYWwgZmFuIGlucHV0cyBmb3IgdGhlIE1BWDY2NTEgKi8KLQlpZiAoZGF0YS0+bnJfZmFucyA9PSA0KSB7Ci0JCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDY2NTFfYXR0cl9ncnApOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfcmVtb3ZlOwotCX0KLQotCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYpOwotCWlmICghSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpCi0JCXJldHVybiAwOwotCi0JZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOwotCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZXJyb3IgcmVnaXN0ZXJpbmcgaHdtb24gZGV2aWNlLlxuIik7Ci0JaWYgKGRhdGEtPm5yX2ZhbnMgPT0gNCkKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbWF4NjY1MV9hdHRyX2dycCk7Ci1lcnJfcmVtb3ZlOgotCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDY2NTBfYXR0cl9ncnApOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4NjY1MF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwotCWlmIChkYXRhLT5ucl9mYW5zID09IDQpCi0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDY2NTFfYXR0cl9ncnApOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDY2NTBfYXR0cl9ncnApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1heDY2NTBfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OwogCWludCBjb25maWc7CiAJaW50IGVyciA9IC1FSU87CiAKIAljb25maWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjUwX1JFR19DT05GSUcpOwogCiAJaWYgKGNvbmZpZyA8IDApIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJFcnJvciByZWFkaW5nIGNvbmZpZywgYWJvcnRpbmcuXG4iKTsKKwkJZGV2X2VycihkZXYsICJFcnJvciByZWFkaW5nIGNvbmZpZywgYWJvcnRpbmcuXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTYyMCwxMSArNTg0LDExIEBACiAJCWNvbmZpZyB8PSBNQVg2NjUwX0NGR19WMTI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaWxsZWdhbCB2YWx1ZSBmb3IgZmFuX3ZvbHRhZ2UgKCVkKVxuIiwKKwkJZGV2X2VycihkZXYsICJpbGxlZ2FsIHZhbHVlIGZvciBmYW5fdm9sdGFnZSAoJWQpXG4iLAogCQkJZmFuX3ZvbHRhZ2UpOwogCX0KIAotCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIkZhbiB2b2x0YWdlIGlzIHNldCB0byAlZFYuXG4iLAorCWRldl9pbmZvKGRldiwgIkZhbiB2b2x0YWdlIGlzIHNldCB0byAlZFYuXG4iLAogCQkgKGNvbmZpZyAmIE1BWDY2NTBfQ0ZHX1YxMikgPyAxMiA6IDUpOwogCiAJc3dpdGNoIChwcmVzY2FsZXIpIHsKQEAgLTY1MCwxMSArNjE0LDEwIEBACiAJCQkgfCBNQVg2NjUwX0NGR19QUkVTQ0FMRVJfMTY7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaWxsZWdhbCB2YWx1ZSBmb3IgcHJlc2NhbGVyICglZClcbiIsCi0JCQlwcmVzY2FsZXIpOworCQlkZXZfZXJyKGRldiwgImlsbGVnYWwgdmFsdWUgZm9yIHByZXNjYWxlciAoJWQpXG4iLCBwcmVzY2FsZXIpOwogCX0KIAotCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIlByZXNjYWxlciBpcyBzZXQgdG8gJWQuXG4iLAorCWRldl9pbmZvKGRldiwgIlByZXNjYWxlciBpcyBzZXQgdG8gJWQuXG4iLAogCQkgMSA8PCAoY29uZmlnICYgTUFYNjY1MF9DRkdfUFJFU0NBTEVSX01BU0spKTsKIAogCS8qCkBAIC02NjQsMTcgKzYyNywxNyBAQAogCSAqLwogCiAJaWYgKChjb25maWcgJiBNQVg2NjUwX0NGR19NT0RFX01BU0spID09IE1BWDY2NTBfQ0ZHX01PREVfT0ZGKSB7Ci0JCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiQ2hhbmdlIG1vZGUgdG8gb3BlbiBsb29wLCBmdWxsIG9mZi5cbiIpOworCQlkZXZfZGJnKGRldiwgIkNoYW5nZSBtb2RlIHRvIG9wZW4gbG9vcCwgZnVsbCBvZmYuXG4iKTsKIAkJY29uZmlnID0gKGNvbmZpZyAmIH5NQVg2NjUwX0NGR19NT0RFX01BU0spCiAJCQkgfCBNQVg2NjUwX0NGR19NT0RFX09QRU5fTE9PUDsKIAkJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjUwX1JFR19EQUMsIDI1NSkpIHsKLQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiREFDIHdyaXRlIGVycm9yLCBhYm9ydGluZy5cbiIpOworCQkJZGV2X2VycihkZXYsICJEQUMgd3JpdGUgZXJyb3IsIGFib3J0aW5nLlxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQogCiAJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjUwX1JFR19DT05GSUcsIGNvbmZpZykpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDb25maWcgd3JpdGUgZXJyb3IsIGFib3J0aW5nLlxuIik7CisJCWRldl9lcnIoZGV2LCAiQ29uZmlnIHdyaXRlIGVycm9yLCBhYm9ydGluZy5cbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNjg0LDUxICs2NDcsNTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHU4IHRhY2hfcmVnW10gPSB7Ci0JTUFYNjY1MF9SRUdfVEFDSDAsCi0JTUFYNjY1MF9SRUdfVEFDSDEsCi0JTUFYNjY1MF9SRUdfVEFDSDIsCi0JTUFYNjY1MF9SRUdfVEFDSDMsCi19OwotCi1zdGF0aWMgc3RydWN0IG1heDY2NTBfZGF0YSAqbWF4NjY1MF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgbWF4NjY1MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKLQlpbnQgaTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CisJc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJaW50IGVycjsKIAotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBtYXg2NjUwX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFopIHx8ICFkYXRhLT52YWxpZCkgewotCQlkYXRhLT5zcGVlZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJCQkgICAgICAgTUFYNjY1MF9SRUdfU1BFRUQpOwotCQlkYXRhLT5jb25maWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQkJCQkJCU1BWDY2NTBfUkVHX0NPTkZJRyk7Ci0JCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5ucl9mYW5zOyBpKyspIHsKLQkJCWRhdGEtPnRhY2hbaV0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQkJCQkJCQkgdGFjaF9yZWdbaV0pOwotCQl9Ci0JCWRhdGEtPmNvdW50ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCQlNQVg2NjUwX1JFR19DT1VOVCk7Ci0JCWRhdGEtPmRhYyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1BWDY2NTBfUkVHX0RBQyk7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5ucl9mYW5zID0gaWQtPmRyaXZlcl9kYXRhOwogCi0JCS8qCi0JCSAqIEFsYXJtcyBhcmUgY2xlYXJlZCBvbiByZWFkIGluIGNhc2UgdGhlIGNvbmRpdGlvbiB0aGF0Ci0JCSAqIGNhdXNlZCB0aGUgYWxhcm0gaXMgcmVtb3ZlZC4gS2VlcCB0aGUgdmFsdWUgbGF0Y2hlZCBoZXJlCi0JCSAqIGZvciBwcm92aWRpbmcgdGhlIHJlZ2lzdGVyIHRocm91Z2ggZGlmZmVyZW50IGFsYXJtIGZpbGVzLgotCQkgKi8KLQkJZGF0YS0+YWxhcm0gfD0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCQlNQVg2NjUwX1JFR19BTEFSTSk7CisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBtYXg2NjUwIGNoaXAKKwkgKi8KKwllcnIgPSBtYXg2NjUwX2luaXRfY2xpZW50KGRhdGEsIGNsaWVudCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOwotCQlkYXRhLT52YWxpZCA9IDE7Ci0JfQorCWRhdGEtPmdyb3Vwc1swXSA9ICZtYXg2NjUwX2dyb3VwOworCS8qIDMgYWRkaXRpb25hbCBmYW4gaW5wdXRzIGZvciB0aGUgTUFYNjY1MSAqLworCWlmIChkYXRhLT5ucl9mYW5zID09IDQpCisJCWRhdGEtPmdyb3Vwc1sxXSA9ICZtYXg2NjUxX2dyb3VwOwogCi0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlyZXR1cm4gZGF0YTsKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsCisJCQkJCQkJICAgY2xpZW50LT5uYW1lLCBkYXRhLAorCQkJCQkJCSAgIGRhdGEtPmdyb3Vwcyk7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhod21vbl9kZXYpOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbWF4NjY1MF9pZFtdID0geworCXsgIm1heDY2NTAiLCAxIH0sCisJeyAibWF4NjY1MSIsIDQgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbWF4NjY1MF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtYXg2NjUwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJtYXg2NjUwIiwKKwl9LAorCS5wcm9iZQkJPSBtYXg2NjUwX3Byb2JlLAorCS5pZF90YWJsZQk9IG1heDY2NTBfaWQsCit9OworCiBtb2R1bGVfaTJjX2RyaXZlcihtYXg2NjUwX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIkhhbnMgSi4gS29jaCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9wbWJ1cy9sdGMyOTc4LmMgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL2x0YzI5NzguYwppbmRleCBkZTNjMTUyLi5lMjRlZDUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3BtYnVzL2x0YzI5NzguYworKysgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL2x0YzI5NzguYwpAQCAtMSw5ICsxLDkgQEAKIC8qCiAgKiBIYXJkd2FyZSBtb25pdG9yaW5nIGRyaXZlciBmb3IgTFRDMjk3NCwgTFRDMjk3NywgTFRDMjk3OCwgTFRDMzg4MCwKLSAqIGFuZCBMVEMzODgzCisgKiBMVEMzODgzLCBhbmQgTFRNNDY3NgogICoKICAqIENvcHlyaWdodCAoYykgMjAxMSBFcmljc3NvbiBBQi4KLSAqIENvcHlyaWdodCAoYykgMjAxMyBHdWVudGVyIFJvZWNrCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTQgR3VlbnRlciBSb2VjawogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTQsMTAgKzE0LDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0yOCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSAicG1idXMuaCIKIAotZW51bSBjaGlwcyB7IGx0YzI5NzQsIGx0YzI5NzcsIGx0YzI5NzgsIGx0YzM4ODAsIGx0YzM4ODMgfTsKK2VudW0gY2hpcHMgeyBsdGMyOTc0LCBsdGMyOTc3LCBsdGMyOTc4LCBsdGMzODgwLCBsdGMzODgzLCBsdG00Njc2IH07CiAKIC8qIENvbW1vbiBmb3IgYWxsIGNoaXBzICovCiAjZGVmaW5lIExUQzI5NzhfTUZSX1ZPVVRfUEVBSwkJMHhkZApAQCAtNDUsNyArNDEsNyBAQAogI2RlZmluZSBMVEMyOTc0X01GUl9JT1VUX1BFQUsJCTB4ZDcKICNkZWZpbmUgTFRDMjk3NF9NRlJfSU9VVF9NSU4JCTB4ZDgKIAotLyogTFRDMzg4MCBhbmQgTFRDMzg4MyAqLworLyogTFRDMzg4MCwgTFRDMzg4MywgYW5kIExUTTQ2NzYgKi8KICNkZWZpbmUgTFRDMzg4MF9NRlJfSU9VVF9QRUFLCQkweGQ3CiAjZGVmaW5lIExUQzM4ODBfTUZSX0NMRUFSX1BFQUtTCQkweGUzCiAjZGVmaW5lIExUQzM4ODBfTUZSX1RFTVBFUkFUVVJFMl9QRUFLCTB4ZjQKQEAgLTUzLDcgKzQ5LDggQEAKIC8qIExUQzM4ODMgb25seSAqLwogI2RlZmluZSBMVEMzODgzX01GUl9JSU5fUEVBSwkJMHhlMQogCi0jZGVmaW5lIExUQzI5NzRfSUQJCQkweDAyMTIKKyNkZWZpbmUgTFRDMjk3NF9JRF9SRVYxCQkJMHgwMjEyCisjZGVmaW5lIExUQzI5NzRfSURfUkVWMgkJCTB4MDIxMwogI2RlZmluZSBMVEMyOTc3X0lECQkJMHgwMTMwCiAjZGVmaW5lIExUQzI5NzhfSURfUkVWMQkJCTB4MDEyMQogI2RlZmluZSBMVEMyOTc4X0lEX1JFVjIJCQkweDAxMjIKQEAgLTYyLDYgKzU5LDggQEAKICNkZWZpbmUgTFRDMzg4MF9JRF9NQVNLCQkJMHhmZjAwCiAjZGVmaW5lIExUQzM4ODNfSUQJCQkweDQzMDAKICNkZWZpbmUgTFRDMzg4M19JRF9NQVNLCQkJMHhmZjAwCisjZGVmaW5lIExUTTQ2NzZfSUQJCQkweDQ0ODAJLyogZGF0YXNoZWV0IGNsYWltcyAweDQ0MFggKi8KKyNkZWZpbmUgTFRNNDY3Nl9JRF9NQVNLCQkJMHhmZmYwCiAKICNkZWZpbmUgTFRDMjk3NF9OVU1fUEFHRVMJCTQKICNkZWZpbmUgTFRDMjk3OF9OVU1fUEFHRVMJCTgKQEAgLTM3MCw2ICszNjksNyBAQAogCXsibHRjMjk3OCIsIGx0YzI5Nzh9LAogCXsibHRjMzg4MCIsIGx0YzM4ODB9LAogCXsibHRjMzg4MyIsIGx0YzM4ODN9LAorCXsibHRtNDY3NiIsIGx0bTQ2NzZ9LAogCXt9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGx0YzI5NzhfaWQpOwpAQCAtMzk0LDcgKzM5NCw3IEBACiAJaWYgKGNoaXBfaWQgPCAwKQogCQlyZXR1cm4gY2hpcF9pZDsKIAotCWlmIChjaGlwX2lkID09IExUQzI5NzRfSUQpIHsKKwlpZiAoY2hpcF9pZCA9PSBMVEMyOTc0X0lEX1JFVjEgfHwgY2hpcF9pZCA9PSBMVEMyOTc0X0lEX1JFVjIpIHsKIAkJZGF0YS0+aWQgPSBsdGMyOTc0OwogCX0gZWxzZSBpZiAoY2hpcF9pZCA9PSBMVEMyOTc3X0lEKSB7CiAJCWRhdGEtPmlkID0gbHRjMjk3NzsKQEAgLTQwNSw2ICs0MDUsOCBAQAogCQlkYXRhLT5pZCA9IGx0YzM4ODA7CiAJfSBlbHNlIGlmICgoY2hpcF9pZCAmIExUQzM4ODNfSURfTUFTSykgPT0gTFRDMzg4M19JRCkgewogCQlkYXRhLT5pZCA9IGx0YzM4ODM7CisJfSBlbHNlIGlmICgoY2hpcF9pZCAmIExUTTQ2NzZfSURfTUFTSykgPT0gTFRNNDY3Nl9JRCkgeworCQlkYXRhLT5pZCA9IGx0bTQ2NzY7CiAJfSBlbHNlIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJVbnN1cHBvcnRlZCBjaGlwIElEIDB4JXhcbiIsIGNoaXBfaWQpOwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTQ1OCw2ICs0NjAsNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgbHRjMzg4MDoKKwljYXNlIGx0bTQ2NzY6CiAJCWluZm8tPnJlYWRfd29yZF9kYXRhID0gbHRjMzg4MF9yZWFkX3dvcmRfZGF0YTsKIAkJaW5mby0+cGFnZXMgPSBMVEMzODgwX05VTV9QQUdFUzsKIAkJaW5mby0+ZnVuY1swXSA9IFBNQlVTX0hBVkVfVklOIHwgUE1CVVNfSEFWRV9JSU4KQEAgLTUwMCw1ICs1MDMsNSBAQAogbW9kdWxlX2kyY19kcml2ZXIobHRjMjk3OF9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJHdWVudGVyIFJvZWNrIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlBNQnVzIGRyaXZlciBmb3IgTFRDMjk3NCwgTFRDMjk3OCwgTFRDMzg4MCwgYW5kIExUQzM4ODMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUE1CdXMgZHJpdmVyIGZvciBMVEMyOTc0LCBMVEMyOTc4LCBMVEMzODgwLCBMVEMzODgzLCBhbmQgTFRNNDY3NiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zbW02NjUuYyBiL2RyaXZlcnMvaHdtb24vc21tNjY1LmMKaW5kZXggZDllMWI3ZC4uNGVmNTgwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zbW02NjUuYworKysgYi9kcml2ZXJzL2h3bW9uL3NtbTY2NS5jCkBAIC0yMjIsNyArMjIyLDcgQEAKIAlydiA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIDApOwogCWlmIChydiA8IDApIHsKIAkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gcmVhZCBBREMgdmFsdWU6IGVycm9yICVkIiwgcnYpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiBydjsKIAl9CiAJLyoKIAkgKiBWYWxpZGF0ZS92ZXJpZnkgcmVhZGJhY2sgYWRjIGNoYW5uZWwgKGluIGJpdCAxMS4uMTQpLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvYm1hMTgwLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9ibWExODAuYwppbmRleCBiZmVjMzEzLi5hN2U2OGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hY2NlbC9ibWExODAuYworKysgYi9kcml2ZXJzL2lpby9hY2NlbC9ibWExODAuYwpAQCAtNDUxLDkgKzQ1MSw5IEBACiAJLnR5cGUgPSBJSU9fQUNDRUwsCQkJCQkJXAogCS5tb2RpZmllZCA9IDEsCQkJCQkJCVwKIAkuY2hhbm5lbDIgPSBJSU9fTU9EXyMjX2F4aXMsCQkJCQlcCi0JLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfAkJCVwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJCQlcCisJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSB8CQlcCiAJCUJJVChJSU9fQ0hBTl9JTkZPX0xPV19QQVNTX0ZJTFRFUl8zREJfRlJFUVVFTkNZKSwJXAotCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCQlcCiAJLnNjYW5faW5kZXggPSBBWElTXyMjX2F4aXMsCQkJCQlcCiAJLnNjYW5fdHlwZSA9IHsJCQkJCQkJXAogCQkuc2lnbiA9ICdzJywJCQkJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnCmluZGV4IDIyMDlmMjguLjRiZjRjMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnCkBAIC0xNTUsNiArMTU1LDE2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQogCSAgY2FsbGVkIG1jcDM0MjIuCiAKK2NvbmZpZyBNRU5fWjE4OF9BREMKKwl0cmlzdGF0ZSAiTUVOIDE2ejE4OCBBREMgSVAgQ29yZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTUNCCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgTUVOIDE2ejE4OCBBREMgSVAtQ29yZSBvbiBhIE1DQgorCSAgY2Fycmllci4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBtZW5fejE4OF9hZGMuCisKIGNvbmZpZyBOQVU3ODAyCiAJdHJpc3RhdGUgIk51dm90b24gTkFVNzgwMiBBREMgZHJpdmVyIgogCWRlcGVuZHMgb24gSTJDCkBAIC0xOTcsNiArMjA3LDE2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQogCSAgY2FsbGVkIHR3bDYwMzAtZ3BhZGMuCiAKK2NvbmZpZyBWRjYxMF9BREMKKwl0cmlzdGF0ZSAiRnJlZXNjYWxlIHZmNjEwIEFEQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBPRgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBzdXBwb3J0IGZvciBWeWJyaWQgYm9hcmQgYW5hbG9nLXRvLWRpZ2l0YWwgY29udmVydGVyLgorCSAgU2luY2UgdGhlIElQIGlzIHVzZWQgZm9yIGkuTVg2U0xYLCB0aGUgZHJpdmVyIGFsc28gc3VwcG9ydCBpLk1YNlNMWC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCB2ZjYxMF9hZGMuCisKIGNvbmZpZyBWSVBFUkJPQVJEX0FEQwogCXRyaXN0YXRlICJWaXBlcmJvYXJkIEFEQyBzdXBwb3J0IgogCWRlcGVuZHMgb24gTUZEX1ZJUEVSQk9BUkQgJiYgVVNCCkBAIC0yMDQsNCArMjI0LDE3IEBACiAJICBTYXkgeWVzIGhlcmUgdG8gYWNjZXNzIHRoZSBBREMgcGFydCBvZiB0aGUgTmFubyBSaXZlcgogCSAgVGVjaG5vbG9naWVzIFZpcGVyYm9hcmQuCiAKK2NvbmZpZyBYSUxJTlhfWEFEQworCXRyaXN0YXRlICJYaWxpbnggWEFEQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBBUkNIX1pZTlEgfHwgTUlDUk9CTEFaRSB8fCBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIEhBU19JT01FTQorCXNlbGVjdCBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSRURfQlVGRkVSCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGhhdmUgc3VwcG9ydCBmb3IgdGhlIFhpbGlueCBYQURDLiBUaGUgZHJpdmVyIGRvZXMgc3VwcG9ydAorCSAgYm90aCB0aGUgWllOUSBpbnRlcmZhY2UgdG8gdGhlIFhBREMgYXMgd2VsbCBhcyB0aGUgQVhJLVhBREMgaW50ZXJmYWNlLgorCisJICBUaGUgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWxkIGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgeGlsaW54LXhhZGMuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9NYWtlZmlsZSBiL2RyaXZlcnMvaWlvL2FkYy9NYWtlZmlsZQppbmRleCBiYTlhMTBhLi5iYjI1MjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9paW8vYWRjL01ha2VmaWxlCkBAIC0xNyw4ICsxNywxMiBAQAogb2JqLSQoQ09ORklHX01BWDEzNjMpICs9IG1heDEzNjMubwogb2JqLSQoQ09ORklHX01DUDMyMFgpICs9IG1jcDMyMHgubwogb2JqLSQoQ09ORklHX01DUDM0MjIpICs9IG1jcDM0MjIubworb2JqLSQoQ09ORklHX01FTl9aMTg4X0FEQykgKz0gbWVuX3oxODhfYWRjLm8KIG9iai0kKENPTkZJR19OQVU3ODAyKSArPSBuYXU3ODAyLm8KIG9iai0kKENPTkZJR19USV9BREMwODFDKSArPSB0aS1hZGMwODFjLm8KIG9iai0kKENPTkZJR19USV9BTTMzNVhfQURDKSArPSB0aV9hbTMzNXhfYWRjLm8KIG9iai0kKENPTkZJR19UV0w2MDMwX0dQQURDKSArPSB0d2w2MDMwLWdwYWRjLm8KK29iai0kKENPTkZJR19WRjYxMF9BREMpICs9IHZmNjEwX2FkYy5vCiBvYmotJChDT05GSUdfVklQRVJCT0FSRF9BREMpICs9IHZpcGVyYm9hcmRfYWRjLm8KK3hpbGlueC14YWRjLXkgOj0geGlsaW54LXhhZGMtY29yZS5vIHhpbGlueC14YWRjLWV2ZW50cy5vCitvYmotJChDT05GSUdfWElMSU5YX1hBREMpICs9IHhpbGlueC14YWRjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9tYXgxMzYzLmMgYi9kcml2ZXJzL2lpby9hZGMvbWF4MTM2My5jCmluZGV4IDM2MDI1OTIuLjljZjMyMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy9tYXgxMzYzLmMKKysrIGIvZHJpdmVycy9paW8vYWRjL21heDEzNjMuYwpAQCAtOCwxNyArOCwxMSBAQAogICAqIGJhc2VkIG9uIGxpbnV4L2RyaXZlcnMvYWNyb24vY2hhci9wY2Y4NTgzLmMKICAgKiBDb3B5cmlnaHQgKEMpIDIwMDAgUnVzc2VsbCBLaW5nCiAgICoKKyAgKiBEcml2ZXIgZm9yIG1heDEzNjMgYW5kIHNpbWlsYXIgY2hpcHMuCisgICoKICAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gICoKLSAgKiBtYXgxMzYzLmMKLSAgKgotICAqIFBhcnRpYWwgc3VwcG9ydCBmb3IgbWF4MTM2MyBhbmQgc2ltaWxhciBjaGlwcy4KLSAgKgotICAqIE5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuCi0gICoKLSAgKiAtIENvbnRyb2wgb2YgaW50ZXJuYWwgcmVmZXJlbmNlLgogICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0xMjUzLDcgKzEyNDcsNyBAQAogCX0sCiAJW21heDExNjA0XSA9IHsKIAkJLmJpdHMgPSA4LAotCQkuaW50X3ZyZWZfbXYgPSA0MDk4LAorCQkuaW50X3ZyZWZfbXYgPSA0MDk2LAogCQkubW9kZV9saXN0ID0gbWF4MTIzOF9tb2RlX2xpc3QsCiAJCS5udW1fbW9kZXMgPSBBUlJBWV9TSVpFKG1heDEyMzhfbW9kZV9saXN0KSwKIAkJLmRlZmF1bHRfbW9kZSA9IHMwdG8xMSwKQEAgLTEzMTMsNyArMTMwNyw3IEBACiAJfSwKIAlbbWF4MTE2MTBdID0gewogCQkuYml0cyA9IDEwLAotCQkuaW50X3ZyZWZfbXYgPSA0MDk4LAorCQkuaW50X3ZyZWZfbXYgPSA0MDk2LAogCQkubW9kZV9saXN0ID0gbWF4MTIzOF9tb2RlX2xpc3QsCiAJCS5udW1fbW9kZXMgPSBBUlJBWV9TSVpFKG1heDEyMzhfbW9kZV9saXN0KSwKIAkJLmRlZmF1bHRfbW9kZSA9IHMwdG8xMSwKQEAgLTEzNzMsNyArMTM2Nyw3IEBACiAJfSwKIAlbbWF4MTE2MTZdID0gewogCQkuYml0cyA9IDEyLAotCQkuaW50X3ZyZWZfbXYgPSA0MDk4LAorCQkuaW50X3ZyZWZfbXYgPSA0MDk2LAogCQkubW9kZV9saXN0ID0gbWF4MTIzOF9tb2RlX2xpc3QsCiAJCS5udW1fbW9kZXMgPSBBUlJBWV9TSVpFKG1heDEyMzhfbW9kZV9saXN0KSwKIAkJLmRlZmF1bHRfbW9kZSA9IHMwdG8xMSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9tZW5fejE4OF9hZGMuYyBiL2RyaXZlcnMvaWlvL2FkYy9tZW5fejE4OF9hZGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTg5YzE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWRjL21lbl96MTg4X2FkYy5jCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogTUVOIDE2ejE4OCBBbmFsb2cgdG8gRGlnaWFsIENvbnZlcnRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBNRU4gTWlrcm9lbGVrdHJvbmlrIEdtYkggKHd3dy5tZW4uZGUpCisgKiBBdXRob3I6IEpvaGFubmVzIFRodW1zaGlybiA8am9oYW5uZXMudGh1bXNoaXJuQG1lbi5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWNiLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisKKyNkZWZpbmUgWjE4OF9BRENfTUFYX0NIQU4JOAorI2RlZmluZSBaMTg4X0FEQ19HQUlOCQkweDA3MDAwMDAKKyNkZWZpbmUgWjE4OF9NT0RFX1ZPTFRBR0UJQklUKDI3KQorI2RlZmluZSBaMTg4X0NGR19BVVRPCQkweDEKKyNkZWZpbmUgWjE4OF9DVFJMX1JFRwkJMHg0MAorCisjZGVmaW5lIEFEQ19EQVRBKHgpICgoKHgpID4+IDIpICYgMHg3ZmZmZmMpCisjZGVmaW5lIEFEQ19PVlIoeCkgKCh4KSAmIDB4MSkKKworc3RydWN0IHoxODhfYWRjIHsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKwl2b2lkIF9faW9tZW0gKmJhc2U7Cit9OworCisjZGVmaW5lIFoxODhfQURDX0NIQU5ORUwoaWR4KSB7CQkJCQlcCisJCS50eXBlID0gSUlPX1ZPTFRBR0UsCQkJCVwKKwkJLmluZGV4ZWQgPSAxLAkJCQkJXAorCQkuY2hhbm5lbCA9IChpZHgpLAkJCQlcCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLCAgIFwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHoxODhfYWRjX2lpb19jaGFubmVsc1tdID0geworCVoxODhfQURDX0NIQU5ORUwoMCksCisJWjE4OF9BRENfQ0hBTk5FTCgxKSwKKwlaMTg4X0FEQ19DSEFOTkVMKDIpLAorCVoxODhfQURDX0NIQU5ORUwoMyksCisJWjE4OF9BRENfQ0hBTk5FTCg0KSwKKwlaMTg4X0FEQ19DSEFOTkVMKDUpLAorCVoxODhfQURDX0NIQU5ORUwoNiksCisJWjE4OF9BRENfQ0hBTk5FTCg3KSwKK307CisKK3N0YXRpYyBpbnQgejE4OF9paW9fcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmlpb19kZXYsCisJCQlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCWludCAqdmFsLAorCQkJaW50ICp2YWwyLAorCQkJbG9uZyBpbmZvKQoreworCXN0cnVjdCB6MTg4X2FkYyAqYWRjID0gaWlvX3ByaXYoaWlvX2Rldik7CisJaW50IHJldDsKKwl1MTYgdG1wOworCisJc3dpdGNoIChpbmZvKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJdG1wID0gcmVhZHcoYWRjLT5iYXNlICsgY2hhbi0+Y2hhbm5lbCAqIDQpOworCisJCWlmIChBRENfT1ZSKHRtcCkpIHsKKwkJCWRldl9pbmZvKCZpaW9fZGV2LT5kZXYsCisJCQkJIk92ZXJzYW1wbGluZyBlcnJvciBvbiBBREMgY2hhbm5lbCAlZFxuIiwKKwkJCQljaGFuLT5jaGFubmVsKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCSp2YWwgPSBBRENfREFUQSh0bXApOworCQlyZXQgPSBJSU9fVkFMX0lOVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBpaW9faW5mbyB6MTg4X2FkY19pbmZvID0geworCS5yZWFkX3JhdyA9ICZ6MTg4X2lpb19yZWFkX3JhdywKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHZvaWQgbWVuX3oxODhfY29uZmlnX2NoYW5uZWxzKHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlpbnQgaTsKKwl1MzIgY2ZnOworCXUzMiBjdGw7CisKKwljdGwgPSByZWFkbChhZGRyICsgWjE4OF9DVFJMX1JFRyk7CisJY3RsIHw9IFoxODhfQ0ZHX0FVVE87CisJd3JpdGVsKGN0bCwgYWRkciArIFoxODhfQ1RSTF9SRUcpOworCisJZm9yIChpID0gMDsgaSA8IFoxODhfQURDX01BWF9DSEFOOyBpKyspIHsKKwkJY2ZnID0gcmVhZGwoYWRkciArIGkpOworCQljZmcgJj0gfloxODhfQURDX0dBSU47CisJCWNmZyB8PSBaMTg4X01PREVfVk9MVEFHRTsKKwkJd3JpdGVsKGNmZywgYWRkciArIGkpOworCX0KK30KKworc3RhdGljIGludCBtZW5fejE4OF9wcm9iZShzdHJ1Y3QgbWNiX2RldmljZSAqZGV2LAorCQkJY29uc3Qgc3RydWN0IG1jYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB6MTg4X2FkYyAqYWRjOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IHJlc291cmNlICptZW07CisKKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJmRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHoxODhfYWRjKSk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJYWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbmRpb19kZXYtPm5hbWUgPSAiejE4OC1hZGMiOworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKKwlpbmRpb19kZXYtPmluZm8gPSAmejE4OF9hZGNfaW5mbzsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IHoxODhfYWRjX2lpb19jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoejE4OF9hZGNfaWlvX2NoYW5uZWxzKTsKKworCW1lbSA9IG1jYl9yZXF1ZXN0X21lbShkZXYsICJ6MTg4LWFkYyIpOworCWlmICghbWVtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFkYy0+YmFzZSA9IGlvcmVtYXAobWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKKwlpZiAoYWRjLT5iYXNlID09IE5VTEwpCisJCWdvdG8gZXJyOworCisJbWVuX3oxODhfY29uZmlnX2NoYW5uZWxzKGFkYy0+YmFzZSk7CisKKwlhZGMtPm1lbSA9IG1lbTsKKwltY2Jfc2V0X2RydmRhdGEoZGV2LCBpbmRpb19kZXYpOworCisJcmV0dXJuIGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKworZXJyOgorCW1jYl9yZWxlYXNlX21lbShtZW0pOworCXJldHVybiAtRU5YSU87Cit9CisKK3N0YXRpYyB2b2lkIG1lbl96MTg4X3JlbW92ZShzdHJ1Y3QgbWNiX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgID0gbWNiX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHoxODhfYWRjICphZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaW91bm1hcChhZGMtPmJhc2UpOworCW1jYl9yZWxlYXNlX21lbShhZGMtPm1lbSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWNiX2RldmljZV9pZCBtZW5fejE4OF9pZHNbXSA9IHsKKwl7IC5kZXZpY2UgPSAweGJjIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShtY2IsIG1lbl96MTg4X2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgbWNiX2RyaXZlciBtZW5fejE4OF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiejE4OC1hZGMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IG1lbl96MTg4X3Byb2JlLAorCS5yZW1vdmUgPSBtZW5fejE4OF9yZW1vdmUsCisJLmlkX3RhYmxlID0gbWVuX3oxODhfaWRzLAorfTsKK21vZHVsZV9tY2JfZHJpdmVyKG1lbl96MTg4X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkpvaGFubmVzIFRodW1zaGlybiA8am9oYW5uZXMudGh1bXNoaXJuQG1lbi5kZT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSUlPIEFEQyBkcml2ZXIgZm9yIE1FTiAxNnoxODggQURDIENvcmUiKTsKK01PRFVMRV9BTElBUygibWNiOjE2ejE4OCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3RpX2FtMzM1eF9hZGMuYyBiL2RyaXZlcnMvaWlvL2FkYy90aV9hbTMzNXhfYWRjLmMKaW5kZXggMzFlNzg2ZS4uYTRkYjMwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL3RpX2FtMzM1eF9hZGMuYworKysgYi9kcml2ZXJzL2lpby9hZGMvdGlfYW0zMzV4X2FkYy5jCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvdHdsNjAzMC1ncGFkYy5jIGIvZHJpdmVycy9paW8vYWRjL3R3bDYwMzAtZ3BhZGMuYwppbmRleCA1M2EyNGViLi4xNTI4MmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvdHdsNjAzMC1ncGFkYy5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy90d2w2MDMwLWdwYWRjLmMKQEAgLTI4LDcgKzI4LDYgQEAKICAqIDAyMTEwLTEzMDEgVVNBCiAgKgogICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3ZmNjEwX2FkYy5jIGIvZHJpdmVycy9paW8vYWRjL3ZmNjEwX2FkYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0Nzk5ZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWRjL3ZmNjEwX2FkYy5jCkBAIC0wLDAgKzEsNzExIEBACisvKgorICogRnJlZXNjYWxlIFZ5YnJpZCB2ZjYxMCBBREMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTMgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2RyaXZlci5oPgorCisvKiBUaGlzIHdpbGwgYmUgdGhlIGRyaXZlciBuYW1lIHRoZSBrZXJuZWwgcmVwb3J0cyAqLworI2RlZmluZSBEUklWRVJfTkFNRSAidmY2MTAtYWRjIgorCisvKiBWeWJyaWQvSU1YIEFEQyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgVkY2MTBfUkVHX0FEQ19IQzAJCTB4MDAKKyNkZWZpbmUgVkY2MTBfUkVHX0FEQ19IQzEJCTB4MDQKKyNkZWZpbmUgVkY2MTBfUkVHX0FEQ19IUwkJMHgwOAorI2RlZmluZSBWRjYxMF9SRUdfQURDX1IwCQkweDBjCisjZGVmaW5lIFZGNjEwX1JFR19BRENfUjEJCTB4MTAKKyNkZWZpbmUgVkY2MTBfUkVHX0FEQ19DRkcJCTB4MTQKKyNkZWZpbmUgVkY2MTBfUkVHX0FEQ19HQwkJMHgxOAorI2RlZmluZSBWRjYxMF9SRUdfQURDX0dTCQkweDFjCisjZGVmaW5lIFZGNjEwX1JFR19BRENfQ1YJCTB4MjAKKyNkZWZpbmUgVkY2MTBfUkVHX0FEQ19PRlMJCTB4MjQKKyNkZWZpbmUgVkY2MTBfUkVHX0FEQ19DQUwJCTB4MjgKKyNkZWZpbmUgVkY2MTBfUkVHX0FEQ19QQ1RMCQkweDMwCisKKy8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgZmllbGQgZGVmaW5lICovCisjZGVmaW5lIFZGNjEwX0FEQ19NT0RFX0JJVDgJCTB4MDAKKyNkZWZpbmUgVkY2MTBfQURDX01PREVfQklUMTAJCTB4MDQKKyNkZWZpbmUgVkY2MTBfQURDX01PREVfQklUMTIJCTB4MDgKKyNkZWZpbmUgVkY2MTBfQURDX01PREVfTUFTSwkJMHgwYworI2RlZmluZSBWRjYxMF9BRENfQlVTQ0xLMl9TRUwJCTB4MDEKKyNkZWZpbmUgVkY2MTBfQURDX0FMVENMS19TRUwJCTB4MDIKKyNkZWZpbmUgVkY2MTBfQURDX0FEQUNLX1NFTAkJMHgwMworI2RlZmluZSBWRjYxMF9BRENfQURDQ0xLX01BU0sJCTB4MDMKKyNkZWZpbmUgVkY2MTBfQURDX0NMS19ESVYyCQkweDIwCisjZGVmaW5lIFZGNjEwX0FEQ19DTEtfRElWNAkJMHg0MAorI2RlZmluZSBWRjYxMF9BRENfQ0xLX0RJVjgJCTB4NjAKKyNkZWZpbmUgVkY2MTBfQURDX0NMS19NQVNLCQkweDYwCisjZGVmaW5lIFZGNjEwX0FEQ19BRExTTVBfTE9ORwkJMHgxMAorI2RlZmluZSBWRjYxMF9BRENfQURTVFNfTUFTSwkJMHgzMDAKKyNkZWZpbmUgVkY2MTBfQURDX0FETFBDX0VOCQkweDgwCisjZGVmaW5lIFZGNjEwX0FEQ19BREhTQ19FTgkJMHg0MDAKKyNkZWZpbmUgVkY2MTBfQURDX1JFRlNFTF9WQUxUCQkweDEwMAorI2RlZmluZSBWRjYxMF9BRENfUkVGU0VMX1ZCRwkJMHgxMDAwCisjZGVmaW5lIFZGNjEwX0FEQ19BRFRSR19IQVJECQkweDIwMDAKKyNkZWZpbmUgVkY2MTBfQURDX0FWR1NfOAkJMHg0MDAwCisjZGVmaW5lIFZGNjEwX0FEQ19BVkdTXzE2CQkweDgwMDAKKyNkZWZpbmUgVkY2MTBfQURDX0FWR1NfMzIJCTB4QzAwMAorI2RlZmluZSBWRjYxMF9BRENfQVZHU19NQVNLCQkweEMwMDAKKyNkZWZpbmUgVkY2MTBfQURDX09WV1JFTgkJMHgxMDAwMAorCisvKiBHZW5lcmFsIGNvbnRyb2wgcmVnaXN0ZXIgZmllbGQgZGVmaW5lICovCisjZGVmaW5lIFZGNjEwX0FEQ19BREFDS0VOCQkweDEKKyNkZWZpbmUgVkY2MTBfQURDX0RNQUVOCQkJMHgyCisjZGVmaW5lIFZGNjEwX0FEQ19BQ1JFTgkJCTB4NAorI2RlZmluZSBWRjYxMF9BRENfQUNGR1QJCQkweDgKKyNkZWZpbmUgVkY2MTBfQURDX0FDRkUJCQkweDEwCisjZGVmaW5lIFZGNjEwX0FEQ19BVkdFTgkJCTB4MjAKKyNkZWZpbmUgVkY2MTBfQURDX0FEQ09OCQkJMHg0MAorI2RlZmluZSBWRjYxMF9BRENfQ0FMCQkJMHg4MAorCisvKiBPdGhlciBmaWVsZCBkZWZpbmUgKi8KKyNkZWZpbmUgVkY2MTBfQURDX0FEQ0hDKHgpCQkoKHgpICYgMHhGKQorI2RlZmluZSBWRjYxMF9BRENfQUlFTgkJCSgweDEgPDwgNykKKyNkZWZpbmUgVkY2MTBfQURDX0NPTlZfRElTQUJMRQkJMHgxRgorI2RlZmluZSBWRjYxMF9BRENfSFNfQ09DTzAJCTB4MQorI2RlZmluZSBWRjYxMF9BRENfQ0FMRgkJCTB4MgorI2RlZmluZSBWRjYxMF9BRENfVElNRU9VVAkJbXNlY3NfdG9famlmZmllcygxMDApCisKK2VudW0gY2xrX3NlbCB7CisJVkY2MTBfQURDSU9DX0JVU0NMS19TRVQsCisJVkY2MTBfQURDSU9DX0FMVENMS19TRVQsCisJVkY2MTBfQURDSU9DX0FEQUNLX1NFVCwKK307CisKK2VudW0gdm9sX3JlZiB7CisJVkY2MTBfQURDSU9DX1ZSX1ZSRUZfU0VULAorCVZGNjEwX0FEQ0lPQ19WUl9WQUxUX1NFVCwKKwlWRjYxMF9BRENJT0NfVlJfVkJHX1NFVCwKK307CisKK2VudW0gYXZlcmFnZV9zZWwgeworCVZGNjEwX0FEQ19TQU1QTEVfMSwKKwlWRjYxMF9BRENfU0FNUExFXzQsCisJVkY2MTBfQURDX1NBTVBMRV84LAorCVZGNjEwX0FEQ19TQU1QTEVfMTYsCisJVkY2MTBfQURDX1NBTVBMRV8zMiwKK307CisKK3N0cnVjdCB2ZjYxMF9hZGNfZmVhdHVyZSB7CisJZW51bSBjbGtfc2VsCWNsa19zZWw7CisJZW51bSB2b2xfcmVmCXZvbF9yZWY7CisKKwlpbnQJY2xrX2RpdjsKKwlpbnQgICAgIHNhbXBsZV9yYXRlOworCWludAlyZXNfbW9kZTsKKworCWJvb2wJbHBtOworCWJvb2wJY2FsaWJyYXRpb247CisJYm9vbAlvdndyZW47Cit9OworCitzdHJ1Y3QgdmY2MTBfYWRjIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJdm9pZCBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBjbGsgKmNsazsKKworCXUzMiB2cmVmX3V2OworCXUzMiB2YWx1ZTsKKwlzdHJ1Y3QgcmVndWxhdG9yICp2cmVmOworCXN0cnVjdCB2ZjYxMF9hZGNfZmVhdHVyZSBhZGNfZmVhdHVyZTsKKworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247Cit9OworCisjZGVmaW5lIFZGNjEwX0FEQ19DSEFOKF9pZHgsIF9jaGFuX3R5cGUpIHsJCQlcCisJLnR5cGUgPSAoX2NoYW5fdHlwZSksCQkJCQlcCisJLmluZGV4ZWQgPSAxLAkJCQkJCVwKKwkuY2hhbm5lbCA9IChfaWR4KSwJCQkJCVwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJCVwKKwkuaW5mb19tYXNrX3NoYXJlZF9ieV90eXBlID0gQklUKElJT19DSEFOX0lORk9fU0NBTEUpIHwJXAorCQkJCUJJVChJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUSksCVwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHZmNjEwX2FkY19paW9fY2hhbm5lbHNbXSA9IHsKKwlWRjYxMF9BRENfQ0hBTigwLCBJSU9fVk9MVEFHRSksCisJVkY2MTBfQURDX0NIQU4oMSwgSUlPX1ZPTFRBR0UpLAorCVZGNjEwX0FEQ19DSEFOKDIsIElJT19WT0xUQUdFKSwKKwlWRjYxMF9BRENfQ0hBTigzLCBJSU9fVk9MVEFHRSksCisJVkY2MTBfQURDX0NIQU4oNCwgSUlPX1ZPTFRBR0UpLAorCVZGNjEwX0FEQ19DSEFOKDUsIElJT19WT0xUQUdFKSwKKwlWRjYxMF9BRENfQ0hBTig2LCBJSU9fVk9MVEFHRSksCisJVkY2MTBfQURDX0NIQU4oNywgSUlPX1ZPTFRBR0UpLAorCVZGNjEwX0FEQ19DSEFOKDgsIElJT19WT0xUQUdFKSwKKwlWRjYxMF9BRENfQ0hBTig5LCBJSU9fVk9MVEFHRSksCisJVkY2MTBfQURDX0NIQU4oMTAsIElJT19WT0xUQUdFKSwKKwlWRjYxMF9BRENfQ0hBTigxMSwgSUlPX1ZPTFRBR0UpLAorCVZGNjEwX0FEQ19DSEFOKDEyLCBJSU9fVk9MVEFHRSksCisJVkY2MTBfQURDX0NIQU4oMTMsIElJT19WT0xUQUdFKSwKKwlWRjYxMF9BRENfQ0hBTigxNCwgSUlPX1ZPTFRBR0UpLAorCVZGNjEwX0FEQ19DSEFOKDE1LCBJSU9fVk9MVEFHRSksCisJLyogc2VudGluZWwgKi8KK307CisKKy8qCisgKiBBREMgc2FtcGxlIGZyZXF1ZW5jeSwgdW5pdCBpcyBBRENLIGN5Y2xlcy4KKyAqIEFEQyBjbGsgc291cmNlIGlzIGlwZyBjbG9jaywgd2hpY2ggaXMgdGhlIHNhbWUgYXMgYnVzIGNsb2NrLgorICoKKyAqIEFEQyBjb252ZXJzaW9uIHRpbWUgPSBTRkNBZGRlciArIEF2ZXJhZ2VOdW0geCAoQkNUICsgTFNUQWRkZXIpCisgKiBTRkNBZGRlcjogZml4ZWQgdG8gNiBBRENLIGN5Y2xlcworICogQXZlcmFnZU51bTogMSwgNCwgOCwgMTYsIDMyIHNhbXBsZXMgZm9yIGhhcmR3YXJlIGF2ZXJhZ2UuCisgKiBCQ1QgKEJhc2UgQ29udmVyc2lvbiBUaW1lKTogZml4ZWQgdG8gMjUgQURDSyBjeWNsZXMgZm9yIDEyIGJpdCBtb2RlCisgKiBMU1RBZGRlcihMb25nIFNhbXBsZSBUaW1lKTogZml4ZWQgdG8gMyBBRENLIGN5Y2xlcworICoKKyAqIEJ5IGRlZmF1bHQsIGVuYWJsZSAxMiBiaXQgcmVzb2x1dGlvbiBtb2RlLCBjbG9jayBzb3VyY2UKKyAqIHNldCB0byBpcGcgY2xvY2ssIFNvIGdldCBiZWxvdyBmcmVxdWVuY3kgZ3JvdXA6CisgKi8KK3N0YXRpYyBjb25zdCB1MzIgdmY2MTBfc2FtcGxlX2ZyZXFfYXZhaWxbNV0gPQorezE5NDExNzYsIDU1OTMzMiwgMjg2OTU3LCAxNDUzNzQsIDczMTcxfTsKKworc3RhdGljIGlubGluZSB2b2lkIHZmNjEwX2FkY19jZmdfaW5pdChzdHJ1Y3QgdmY2MTBfYWRjICppbmZvKQoreworCS8qIHNldCBkZWZhdWx0IENvbmZpZ3VyYXRpb24gZm9yIEFEQyBjb250cm9sbGVyICovCisJaW5mby0+YWRjX2ZlYXR1cmUuY2xrX3NlbCA9IFZGNjEwX0FEQ0lPQ19CVVNDTEtfU0VUOworCWluZm8tPmFkY19mZWF0dXJlLnZvbF9yZWYgPSBWRjYxMF9BRENJT0NfVlJfVlJFRl9TRVQ7CisKKwlpbmZvLT5hZGNfZmVhdHVyZS5jYWxpYnJhdGlvbiA9IHRydWU7CisJaW5mby0+YWRjX2ZlYXR1cmUub3Z3cmVuID0gdHJ1ZTsKKworCWluZm8tPmFkY19mZWF0dXJlLmNsa19kaXYgPSAxOworCWluZm8tPmFkY19mZWF0dXJlLnJlc19tb2RlID0gMTI7CisJaW5mby0+YWRjX2ZlYXR1cmUuc2FtcGxlX3JhdGUgPSAxOworCWluZm8tPmFkY19mZWF0dXJlLmxwbSA9IHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHZmNjEwX2FkY19jZmdfcG9zdF9zZXQoc3RydWN0IHZmNjEwX2FkYyAqaW5mbykKK3sKKwlzdHJ1Y3QgdmY2MTBfYWRjX2ZlYXR1cmUgKmFkY19mZWF0dXJlID0gJmluZm8tPmFkY19mZWF0dXJlOworCWludCBjZmdfZGF0YSA9IDA7CisJaW50IGdjX2RhdGEgPSAwOworCisJc3dpdGNoIChhZGNfZmVhdHVyZS0+Y2xrX3NlbCkgeworCWNhc2UgVkY2MTBfQURDSU9DX0FMVENMS19TRVQ6CisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19BTFRDTEtfU0VMOworCQlicmVhazsKKwljYXNlIFZGNjEwX0FEQ0lPQ19BREFDS19TRVQ6CisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19BREFDS19TRUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qIGxvdyBwb3dlciBzZXQgZm9yIGNhbGlicmF0aW9uICovCisJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX0FETFBDX0VOOworCisJLyogZW5hYmxlIGhpZ2ggc3BlZWQgZm9yIGNhbGlicmF0aW9uICovCisJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX0FESFNDX0VOOworCisJLyogdm9sdGFnZSByZWZlcmVuY2UgKi8KKwlzd2l0Y2ggKGFkY19mZWF0dXJlLT52b2xfcmVmKSB7CisJY2FzZSBWRjYxMF9BRENJT0NfVlJfVlJFRl9TRVQ6CisJCWJyZWFrOworCWNhc2UgVkY2MTBfQURDSU9DX1ZSX1ZBTFRfU0VUOgorCQljZmdfZGF0YSB8PSBWRjYxMF9BRENfUkVGU0VMX1ZBTFQ7CisJCWJyZWFrOworCWNhc2UgVkY2MTBfQURDSU9DX1ZSX1ZCR19TRVQ6CisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19SRUZTRUxfVkJHOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGluZm8tPmRldiwgImVycm9yIHZvbHRhZ2UgcmVmZXJlbmNlXG4iKTsKKwl9CisKKwkvKiBkYXRhIG92ZXJ3cml0ZSBlbmFibGUgKi8KKwlpZiAoYWRjX2ZlYXR1cmUtPm92d3JlbikKKwkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX09WV1JFTjsKKworCXdyaXRlbChjZmdfZGF0YSwgaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfQ0ZHKTsKKwl3cml0ZWwoZ2NfZGF0YSwgaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfR0MpOworfQorCitzdGF0aWMgdm9pZCB2ZjYxMF9hZGNfY2FsaWJyYXRpb24oc3RydWN0IHZmNjEwX2FkYyAqaW5mbykKK3sKKwlpbnQgYWRjX2djLCBoY19jZmc7CisJaW50IHRpbWVvdXQ7CisKKwlpZiAoIWluZm8tPmFkY19mZWF0dXJlLmNhbGlicmF0aW9uKQorCQlyZXR1cm47CisKKwkvKiBlbmFibGUgY2FsaWJyYXRpb24gaW50ZXJydXB0ICovCisJaGNfY2ZnID0gVkY2MTBfQURDX0FJRU4gfCBWRjYxMF9BRENfQ09OVl9ESVNBQkxFOworCXdyaXRlbChoY19jZmcsIGluZm8tPnJlZ3MgKyBWRjYxMF9SRUdfQURDX0hDMCk7CisKKwlhZGNfZ2MgPSByZWFkbChpbmZvLT5yZWdzICsgVkY2MTBfUkVHX0FEQ19HQyk7CisJd3JpdGVsKGFkY19nYyB8IFZGNjEwX0FEQ19DQUwsIGluZm8tPnJlZ3MgKyBWRjYxMF9SRUdfQURDX0dDKTsKKworCXRpbWVvdXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQKKwkJCSgmaW5mby0+Y29tcGxldGlvbiwgVkY2MTBfQURDX1RJTUVPVVQpOworCWlmICh0aW1lb3V0ID09IDApCisJCWRldl9lcnIoaW5mby0+ZGV2LCAiVGltZW91dCBmb3IgYWRjIGNhbGlicmF0aW9uXG4iKTsKKworCWFkY19nYyA9IHJlYWRsKGluZm8tPnJlZ3MgKyBWRjYxMF9SRUdfQURDX0dTKTsKKwlpZiAoYWRjX2djICYgVkY2MTBfQURDX0NBTEYpCisJCWRldl9lcnIoaW5mby0+ZGV2LCAiQURDIGNhbGlicmF0aW9uIGZhaWxlZFxuIik7CisKKwlpbmZvLT5hZGNfZmVhdHVyZS5jYWxpYnJhdGlvbiA9IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCB2ZjYxMF9hZGNfY2ZnX3NldChzdHJ1Y3QgdmY2MTBfYWRjICppbmZvKQoreworCXN0cnVjdCB2ZjYxMF9hZGNfZmVhdHVyZSAqYWRjX2ZlYXR1cmUgPSAmKGluZm8tPmFkY19mZWF0dXJlKTsKKwlpbnQgY2ZnX2RhdGE7CisKKwljZmdfZGF0YSA9IHJlYWRsKGluZm8tPnJlZ3MgKyBWRjYxMF9SRUdfQURDX0NGRyk7CisKKwkvKiBsb3cgcG93ZXIgY29uZmlndXJhdGlvbiAqLworCWNmZ19kYXRhICY9IH5WRjYxMF9BRENfQURMUENfRU47CisJaWYgKGFkY19mZWF0dXJlLT5scG0pCisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19BRExQQ19FTjsKKworCS8qIGRpc2FibGUgaGlnaCBzcGVlZCAqLworCWNmZ19kYXRhICY9IH5WRjYxMF9BRENfQURIU0NfRU47CisKKwl3cml0ZWwoY2ZnX2RhdGEsIGluZm8tPnJlZ3MgKyBWRjYxMF9SRUdfQURDX0NGRyk7Cit9CisKK3N0YXRpYyB2b2lkIHZmNjEwX2FkY19zYW1wbGVfc2V0KHN0cnVjdCB2ZjYxMF9hZGMgKmluZm8pCit7CisJc3RydWN0IHZmNjEwX2FkY19mZWF0dXJlICphZGNfZmVhdHVyZSA9ICYoaW5mby0+YWRjX2ZlYXR1cmUpOworCWludCBjZmdfZGF0YSwgZ2NfZGF0YTsKKworCWNmZ19kYXRhID0gcmVhZGwoaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfQ0ZHKTsKKwlnY19kYXRhID0gcmVhZGwoaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfR0MpOworCisJLyogcmVzb2x1dGlvbiBtb2RlICovCisJY2ZnX2RhdGEgJj0gflZGNjEwX0FEQ19NT0RFX01BU0s7CisJc3dpdGNoIChhZGNfZmVhdHVyZS0+cmVzX21vZGUpIHsKKwljYXNlIDg6CisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19NT0RFX0JJVDg7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19NT0RFX0JJVDEwOworCQlicmVhazsKKwljYXNlIDEyOgorCQljZmdfZGF0YSB8PSBWRjYxMF9BRENfTU9ERV9CSVQxMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihpbmZvLT5kZXYsICJlcnJvciByZXNvbHV0aW9uIG1vZGVcbiIpOworCQlicmVhazsKKwl9CisKKwkvKiBjbG9jayBzZWxlY3QgYW5kIGNsb2NrIGRpdmlkZXIgKi8KKwljZmdfZGF0YSAmPSB+KFZGNjEwX0FEQ19DTEtfTUFTSyB8IFZGNjEwX0FEQ19BRENDTEtfTUFTSyk7CisJc3dpdGNoIChhZGNfZmVhdHVyZS0+Y2xrX2RpdikgeworCWNhc2UgMToKKwkJYnJlYWs7CisJY2FzZSAyOgorCQljZmdfZGF0YSB8PSBWRjYxMF9BRENfQ0xLX0RJVjI7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX0NMS19ESVY0OworCQlicmVhazsKKwljYXNlIDg6CisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19DTEtfRElWODsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJc3dpdGNoIChhZGNfZmVhdHVyZS0+Y2xrX3NlbCkgeworCQljYXNlIFZGNjEwX0FEQ0lPQ19CVVNDTEtfU0VUOgorCQkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX0JVU0NMSzJfU0VMIHwgVkY2MTBfQURDX0NMS19ESVY4OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKGluZm8tPmRldiwgImVycm9yIGNsayBkaXZpZGVyXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCS8qIFVzZSB0aGUgc2hvcnQgc2FtcGxlIG1vZGUgKi8KKwljZmdfZGF0YSAmPSB+KFZGNjEwX0FEQ19BRExTTVBfTE9ORyB8IFZGNjEwX0FEQ19BRFNUU19NQVNLKTsKKworCS8qIHVwZGF0ZSBoYXJkd2FyZSBhdmVyYWdlIHNlbGVjdGlvbiAqLworCWNmZ19kYXRhICY9IH5WRjYxMF9BRENfQVZHU19NQVNLOworCWdjX2RhdGEgJj0gflZGNjEwX0FEQ19BVkdFTjsKKwlzd2l0Y2ggKGFkY19mZWF0dXJlLT5zYW1wbGVfcmF0ZSkgeworCWNhc2UgVkY2MTBfQURDX1NBTVBMRV8xOgorCQlicmVhazsKKwljYXNlIFZGNjEwX0FEQ19TQU1QTEVfNDoKKwkJZ2NfZGF0YSB8PSBWRjYxMF9BRENfQVZHRU47CisJCWJyZWFrOworCWNhc2UgVkY2MTBfQURDX1NBTVBMRV84OgorCQlnY19kYXRhIHw9IFZGNjEwX0FEQ19BVkdFTjsKKwkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX0FWR1NfODsKKwkJYnJlYWs7CisJY2FzZSBWRjYxMF9BRENfU0FNUExFXzE2OgorCQlnY19kYXRhIHw9IFZGNjEwX0FEQ19BVkdFTjsKKwkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX0FWR1NfMTY7CisJCWJyZWFrOworCWNhc2UgVkY2MTBfQURDX1NBTVBMRV8zMjoKKwkJZ2NfZGF0YSB8PSBWRjYxMF9BRENfQVZHRU47CisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19BVkdTXzMyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGluZm8tPmRldiwKKwkJCSJlcnJvciBoYXJkd2FyZSBzYW1wbGUgYXZlcmFnZSBzZWxlY3RcbiIpOworCX0KKworCXdyaXRlbChjZmdfZGF0YSwgaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfQ0ZHKTsKKwl3cml0ZWwoZ2NfZGF0YSwgaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfR0MpOworfQorCitzdGF0aWMgdm9pZCB2ZjYxMF9hZGNfaHdfaW5pdChzdHJ1Y3QgdmY2MTBfYWRjICppbmZvKQoreworCS8qIENGRzogRmVhdHVyZSBzZXQgKi8KKwl2ZjYxMF9hZGNfY2ZnX3Bvc3Rfc2V0KGluZm8pOworCXZmNjEwX2FkY19zYW1wbGVfc2V0KGluZm8pOworCisJLyogYWRjIGNhbGlicmF0aW9uICovCisJdmY2MTBfYWRjX2NhbGlicmF0aW9uKGluZm8pOworCisJLyogQ0ZHOiBwb3dlciBhbmQgc3BlZWQgc2V0ICovCisJdmY2MTBfYWRjX2NmZ19zZXQoaW5mbyk7Cit9CisKK3N0YXRpYyBpbnQgdmY2MTBfYWRjX3JlYWRfZGF0YShzdHJ1Y3QgdmY2MTBfYWRjICppbmZvKQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSByZWFkbChpbmZvLT5yZWdzICsgVkY2MTBfUkVHX0FEQ19SMCk7CisKKwlzd2l0Y2ggKGluZm8tPmFkY19mZWF0dXJlLnJlc19tb2RlKSB7CisJY2FzZSA4OgorCQlyZXN1bHQgJj0gMHhGRjsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJcmVzdWx0ICY9IDB4M0ZGOworCQlicmVhazsKKwljYXNlIDEyOgorCQlyZXN1bHQgJj0gMHhGRkY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2ZjYxMF9hZGNfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgdmY2MTBfYWRjICppbmZvID0gKHN0cnVjdCB2ZjYxMF9hZGMgKilkZXZfaWQ7CisJaW50IGNvY287CisKKwljb2NvID0gcmVhZGwoaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfSFMpOworCWlmIChjb2NvICYgVkY2MTBfQURDX0hTX0NPQ08wKSB7CisJCWluZm8tPnZhbHVlID0gdmY2MTBfYWRjX3JlYWRfZGF0YShpbmZvKTsKKwkJY29tcGxldGUoJmluZm8tPmNvbXBsZXRpb24pOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIElJT19DT05TVF9BVFRSX1NBTVBfRlJFUV9BVkFJTCgiMTk0MTE3NiwgNTU5MzMyLCAyODY5NTcsIDE0NTM3NCwgNzMxNzEiKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnZmNjEwX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHZmNjEwX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSB2ZjYxMF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCB2ZjYxMF9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQlpbnQgKnZhbCwKKwkJCWludCAqdmFsMiwKKwkJCWxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgdmY2MTBfYWRjICppbmZvID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBpbnQgaGNfY2ZnOworCWxvbmcgcmV0OworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCXJlaW5pdF9jb21wbGV0aW9uKCZpbmZvLT5jb21wbGV0aW9uKTsKKworCQloY19jZmcgPSBWRjYxMF9BRENfQURDSEMoY2hhbi0+Y2hhbm5lbCk7CisJCWhjX2NmZyB8PSBWRjYxMF9BRENfQUlFTjsKKwkJd3JpdGVsKGhjX2NmZywgaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfSEMwKTsKKwkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQKKwkJCQkoJmluZm8tPmNvbXBsZXRpb24sIFZGNjEwX0FEQ19USU1FT1VUKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwkJaWYgKHJldCA8IDApIHsKKwkJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJKnZhbCA9IGluZm8tPnZhbHVlOworCQltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisKKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCSp2YWwgPSBpbmZvLT52cmVmX3V2IC8gMTAwMDsKKwkJKnZhbDIgPSBpbmZvLT5hZGNfZmVhdHVyZS5yZXNfbW9kZTsKKwkJcmV0dXJuIElJT19WQUxfRlJBQ1RJT05BTF9MT0cyOworCisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUToKKwkJKnZhbCA9IHZmNjEwX3NhbXBsZV9mcmVxX2F2YWlsW2luZm8tPmFkY19mZWF0dXJlLnNhbXBsZV9yYXRlXTsKKwkJKnZhbDIgPSAwOworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2ZjYxMF93cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJaW50IHZhbCwKKwkJCWludCB2YWwyLAorCQkJbG9uZyBtYXNrKQoreworCXN0cnVjdCB2ZjYxMF9hZGMgKmluZm8gPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCBpOworCisJc3dpdGNoIChtYXNrKSB7CisJCWNhc2UgSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVE6CisJCQlmb3IgKGkgPSAwOworCQkJCWkgPCBBUlJBWV9TSVpFKHZmNjEwX3NhbXBsZV9mcmVxX2F2YWlsKTsKKwkJCQlpKyspCisJCQkJaWYgKHZhbCA9PSB2ZjYxMF9zYW1wbGVfZnJlcV9hdmFpbFtpXSkgeworCQkJCQlpbmZvLT5hZGNfZmVhdHVyZS5zYW1wbGVfcmF0ZSA9IGk7CisJCQkJCXZmNjEwX2FkY19zYW1wbGVfc2V0KGluZm8pOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmY2MTBfYWRjX3JlZ19hY2Nlc3Moc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCXVuc2lnbmVkIHJlZywgdW5zaWduZWQgd3JpdGV2YWwsCisJCQl1bnNpZ25lZCAqcmVhZHZhbCkKK3sKKwlzdHJ1Y3QgdmY2MTBfYWRjICppbmZvID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWlmICgocmVhZHZhbCA9PSBOVUxMKSB8fAorCQkoIShyZWcgJSA0KSB8fCAocmVnID4gVkY2MTBfUkVHX0FEQ19QQ1RMKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJKnJlYWR2YWwgPSByZWFkbChpbmZvLT5yZWdzICsgcmVnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIHZmNjEwX2FkY19paW9faW5mbyA9IHsKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCS5yZWFkX3JhdyA9ICZ2ZjYxMF9yZWFkX3JhdywKKwkud3JpdGVfcmF3ID0gJnZmNjEwX3dyaXRlX3JhdywKKwkuZGVidWdmc19yZWdfYWNjZXNzID0gJnZmNjEwX2FkY19yZWdfYWNjZXNzLAorCS5hdHRycyA9ICZ2ZjYxMF9hdHRyaWJ1dGVfZ3JvdXAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB2ZjYxMF9hZGNfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCx2ZjYxMC1hZGMiLCB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHZmNjEwX2FkY19tYXRjaCk7CisKK3N0YXRpYyBpbnQgdmY2MTBfYWRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZmNjEwX2FkYyAqaW5mbzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCByZXNvdXJjZSAqbWVtOworCWludCBpcnE7CisJaW50IHJldDsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHZmNjEwX2FkYykpOworCWlmICghaW5kaW9fZGV2KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCBhbGxvY2F0aW5nIGlpbyBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpbmZvID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbmZvLT5kZXYgPSAmcGRldi0+ZGV2OworCisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpbmZvLT5yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIG1lbSk7CisJaWYgKElTX0VSUihpbmZvLT5yZWdzKSkKKwkJcmV0dXJuIFBUUl9FUlIoaW5mby0+cmVncyk7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPD0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBpcnEgcmVzb3VyY2U/XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShpbmZvLT5kZXYsIGlycSwKKwkJCQl2ZjYxMF9hZGNfaXNyLCAwLAorCQkJCWRldl9uYW1lKCZwZGV2LT5kZXYpLCBpbmZvKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgcmVxdWVzdGluZyBpcnEsIGlycSA9ICVkXG4iLCBpcnEpOworCQlyZXR1cm4gcmV0OworCX0KKworCWluZm8tPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiYWRjIik7CisJaWYgKElTX0VSUihpbmZvLT5jbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCBnZXR0aW5nIGNsb2NrLCBlcnIgPSAlbGRcbiIsCisJCQkJCQlQVFJfRVJSKGluZm8tPmNsaykpOworCQlyZXQgPSBQVFJfRVJSKGluZm8tPmNsayk7CisJCXJldHVybiByZXQ7CisJfQorCisJaW5mby0+dnJlZiA9IGRldm1fcmVndWxhdG9yX2dldCgmcGRldi0+ZGV2LCAidnJlZiIpOworCWlmIChJU19FUlIoaW5mby0+dnJlZikpCisJCXJldHVybiBQVFJfRVJSKGluZm8tPnZyZWYpOworCisJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShpbmZvLT52cmVmKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaW5mby0+dnJlZl91diA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZShpbmZvLT52cmVmKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZGlvX2Rldik7CisKKwlpbml0X2NvbXBsZXRpb24oJmluZm8tPmNvbXBsZXRpb24pOworCisJaW5kaW9fZGV2LT5uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7CisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKwlpbmRpb19kZXYtPmRldi5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJaW5kaW9fZGV2LT5pbmZvID0gJnZmNjEwX2FkY19paW9faW5mbzsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IHZmNjEwX2FkY19paW9fY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHZmNjEwX2FkY19paW9fY2hhbm5lbHMpOworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGluZm8tPmNsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiQ291bGQgbm90IHByZXBhcmUgb3IgZW5hYmxlIHRoZSBjbG9jay5cbiIpOworCQlnb3RvIGVycm9yX2FkY19jbGtfZW5hYmxlOworCX0KKworCXZmNjEwX2FkY19jZmdfaW5pdChpbmZvKTsKKwl2ZjYxMF9hZGNfaHdfaW5pdChpbmZvKTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkbid0IHJlZ2lzdGVyIHRoZSBkZXZpY2UuXG4iKTsKKwkJZ290byBlcnJvcl9paW9fZGV2aWNlX3JlZ2lzdGVyOworCX0KKworCXJldHVybiAwOworCisKK2Vycm9yX2lpb19kZXZpY2VfcmVnaXN0ZXI6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGluZm8tPmNsayk7CitlcnJvcl9hZGNfY2xrX2VuYWJsZToKKwlyZWd1bGF0b3JfZGlzYWJsZShpbmZvLT52cmVmKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmY2MTBfYWRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdmY2MTBfYWRjICppbmZvID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCXJlZ3VsYXRvcl9kaXNhYmxlKGluZm8tPnZyZWYpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShpbmZvLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgdmY2MTBfYWRjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdmY2MTBfYWRjICppbmZvID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgaGNfY2ZnOworCisJLyogQURDIGNvbnRyb2xsZXIgZW50ZXJzIHRvIHN0b3AgbW9kZSAqLworCWhjX2NmZyA9IHJlYWRsKGluZm8tPnJlZ3MgKyBWRjYxMF9SRUdfQURDX0hDMCk7CisJaGNfY2ZnIHw9IFZGNjEwX0FEQ19DT05WX0RJU0FCTEU7CisJd3JpdGVsKGhjX2NmZywgaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfSEMwKTsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShpbmZvLT5jbGspOworCXJlZ3VsYXRvcl9kaXNhYmxlKGluZm8tPnZyZWYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmY2MTBfYWRjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB2ZjYxMF9hZGMgKmluZm8gPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisKKwlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGluZm8tPnZyZWYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoaW5mby0+Y2xrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdmY2MTBfYWRjX2h3X2luaXQoaW5mbyk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFModmY2MTBfYWRjX3BtX29wcywKKwkJCXZmNjEwX2FkY19zdXNwZW5kLAorCQkJdmY2MTBfYWRjX3Jlc3VtZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHZmNjEwX2FkY19kcml2ZXIgPSB7CisJLnByb2JlICAgICAgICAgID0gdmY2MTBfYWRjX3Byb2JlLAorCS5yZW1vdmUgICAgICAgICA9IHZmNjEwX2FkY19yZW1vdmUsCisJLmRyaXZlciAgICAgICAgID0geworCQkubmFtZSAgID0gRFJJVkVSX05BTUUsCisJCS5vd25lciAgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gdmY2MTBfYWRjX21hdGNoLAorCQkucG0gICAgID0gJnZmNjEwX2FkY19wbV9vcHMsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodmY2MTBfYWRjX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkZ1Z2FuZyBEdWFuIDxCMzg2MTFAZnJlZXNjYWxlLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRnJlZXNjYWxlIFZGNjEwIEFEQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy92aXBlcmJvYXJkX2FkYy5jIGIvZHJpdmVycy9paW8vYWRjL3ZpcGVyYm9hcmRfYWRjLmMKaW5kZXggZDBhZGQ4Zi4uOWFjZjZiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL3ZpcGVyYm9hcmRfYWRjLmMKKysrIGIvZHJpdmVycy9paW8vYWRjL3ZpcGVyYm9hcmRfYWRjLmMKQEAgLTEzOSw4ICsxMzksNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZGlvX2Rldik7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3hpbGlueC14YWRjLWNvcmUuYyBiL2RyaXZlcnMvaWlvL2FkYy94aWxpbngteGFkYy1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI1MmJlMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2FkYy94aWxpbngteGFkYy1jb3JlLmMKQEAgLTAsMCArMSwxMzMzIEBACisvKgorICogWGlsaW54IFhBREMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTMtMjAxNCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgQXV0aG9yOiBMYXJzLVBldGVyIENsYXVlbiA8bGFyc0BtZXRhZm9vLmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqCisgKiBEb2N1bWVudGF0aW9uIGZvciB0aGUgcGFydHMgY2FuIGJlIGZvdW5kIGF0OgorICogIC0gWEFEQyBoYXJkbWFjcm86IFhpbGlueCBVRzQ4MAorICogIC0gWllOUSBYQURDIGludGVyZmFjZTogWGlsaW54IFVHNTg1CisgKiAgLSBBWEkgWEFEQyBpbnRlcmZhY2U6IFhpbGlueCBQRzAxOQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9paW8vYnVmZmVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2V2ZW50cy5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyX2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJlZF9idWZmZXIuaD4KKworI2luY2x1ZGUgInhpbGlueC14YWRjLmgiCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgWEFEQ19aWU5RX1VOTUFTS19USU1FT1VUID0gNTAwOworCisvKiBaWU5RIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIFhBRENfWllOUV9SRUdfQ0ZHCTB4MDAKKyNkZWZpbmUgWEFEQ19aWU5RX1JFR19JTlRTVFMJMHgwNAorI2RlZmluZSBYQURDX1pZTlFfUkVHX0lOVE1TSwkweDA4CisjZGVmaW5lIFhBRENfWllOUV9SRUdfU1RBVFVTCTB4MGMKKyNkZWZpbmUgWEFEQ19aWU5RX1JFR19DRklGTwkweDEwCisjZGVmaW5lIFhBRENfWllOUV9SRUdfREZJRk8JMHgxNAorI2RlZmluZSBYQURDX1pZTlFfUkVHX0NUTAkJMHgxOAorCisjZGVmaW5lIFhBRENfWllOUV9DRkdfRU5BQkxFCQlCSVQoMzEpCisjZGVmaW5lIFhBRENfWllOUV9DRkdfQ0ZJRk9USF9NQVNLCSgweGYgPDwgMjApCisjZGVmaW5lIFhBRENfWllOUV9DRkdfQ0ZJRk9USF9PRkZTRVQJMjAKKyNkZWZpbmUgWEFEQ19aWU5RX0NGR19ERklGT1RIX01BU0sJKDB4ZiA8PCAxNikKKyNkZWZpbmUgWEFEQ19aWU5RX0NGR19ERklGT1RIX09GRlNFVAkxNgorI2RlZmluZSBYQURDX1pZTlFfQ0ZHX1dFREdFCQlCSVQoMTMpCisjZGVmaW5lIFhBRENfWllOUV9DRkdfUkVER0UJCUJJVCgxMikKKyNkZWZpbmUgWEFEQ19aWU5RX0NGR19UQ0tSQVRFX01BU0sJKDB4MyA8PCA4KQorI2RlZmluZSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfRElWMgkoMHgwIDw8IDgpCisjZGVmaW5lIFhBRENfWllOUV9DRkdfVENLUkFURV9ESVY0CSgweDEgPDwgOCkKKyNkZWZpbmUgWEFEQ19aWU5RX0NGR19UQ0tSQVRFX0RJVjgJKDB4MiA8PCA4KQorI2RlZmluZSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfRElWMTYJKDB4MyA8PCA4KQorI2RlZmluZSBYQURDX1pZTlFfQ0ZHX0lHQVBfTUFTSwkJMHgxZgorI2RlZmluZSBYQURDX1pZTlFfQ0ZHX0lHQVAoeCkJCSh4KQorCisjZGVmaW5lIFhBRENfWllOUV9JTlRfQ0ZJRk9fTFRICQlCSVQoOSkKKyNkZWZpbmUgWEFEQ19aWU5RX0lOVF9ERklGT19HVEgJCUJJVCg4KQorI2RlZmluZSBYQURDX1pZTlFfSU5UX0FMQVJNX01BU0sJMHhmZgorI2RlZmluZSBYQURDX1pZTlFfSU5UX0FMQVJNX09GRlNFVAkwCisKKyNkZWZpbmUgWEFEQ19aWU5RX1NUQVRVU19DRklGT19MVkxfTUFTSwkoMHhmIDw8IDE2KQorI2RlZmluZSBYQURDX1pZTlFfU1RBVFVTX0NGSUZPX0xWTF9PRkZTRVQJMTYKKyNkZWZpbmUgWEFEQ19aWU5RX1NUQVRVU19ERklGT19MVkxfTUFTSwkoMHhmIDw8IDEyKQorI2RlZmluZSBYQURDX1pZTlFfU1RBVFVTX0RGSUZPX0xWTF9PRkZTRVQJMTIKKyNkZWZpbmUgWEFEQ19aWU5RX1NUQVRVU19DRklGT0YJCUJJVCgxMSkKKyNkZWZpbmUgWEFEQ19aWU5RX1NUQVRVU19DRklGT0UJCUJJVCgxMCkKKyNkZWZpbmUgWEFEQ19aWU5RX1NUQVRVU19ERklGT0YJCUJJVCg5KQorI2RlZmluZSBYQURDX1pZTlFfU1RBVFVTX0RGSUZPRQkJQklUKDgpCisjZGVmaW5lIFhBRENfWllOUV9TVEFUVVNfT1QJCUJJVCg3KQorI2RlZmluZSBYQURDX1pZTlFfU1RBVFVTX0FMTSh4KQkJQklUKHgpCisKKyNkZWZpbmUgWEFEQ19aWU5RX0NUTF9SRVNFVAkJQklUKDQpCisKKyNkZWZpbmUgWEFEQ19aWU5RX0NNRF9OT1AJCTB4MDAKKyNkZWZpbmUgWEFEQ19aWU5RX0NNRF9SRUFECQkweDAxCisjZGVmaW5lIFhBRENfWllOUV9DTURfV1JJVEUJCTB4MDIKKworI2RlZmluZSBYQURDX1pZTlFfQ01EKGNtZCwgYWRkciwgZGF0YSkgKCgoY21kKSA8PCAyNikgfCAoKGFkZHIpIDw8IDE2KSB8IChkYXRhKSkKKworLyogQVhJIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIFhBRENfQVhJX1JFR19SRVNFVAkJMHgwMAorI2RlZmluZSBYQURDX0FYSV9SRUdfU1RBVFVTCQkweDA0CisjZGVmaW5lIFhBRENfQVhJX1JFR19BTEFSTV9TVEFUVVMJMHgwOAorI2RlZmluZSBYQURDX0FYSV9SRUdfQ09OVlNUCQkweDBjCisjZGVmaW5lIFhBRENfQVhJX1JFR19YQURDX1JFU0VUCQkweDEwCisjZGVmaW5lIFhBRENfQVhJX1JFR19HSUVSCQkweDVjCisjZGVmaW5lIFhBRENfQVhJX1JFR19JUElTUgkJMHg2MAorI2RlZmluZSBYQURDX0FYSV9SRUdfSVBJRVIJCTB4NjgKKyNkZWZpbmUgWEFEQ19BWElfQURDX1JFR19PRkZTRVQJCTB4MjAwCisKKyNkZWZpbmUgWEFEQ19BWElfUkVTRVRfTUFHSUMJCTB4YQorI2RlZmluZSBYQURDX0FYSV9HSUVSX0VOQUJMRQkJQklUKDMxKQorCisjZGVmaW5lIFhBRENfQVhJX0lOVF9FT1MJCUJJVCg0KQorI2RlZmluZSBYQURDX0FYSV9JTlRfQUxBUk1fTUFTSwkJMHgzYzBmCisKKyNkZWZpbmUgWEFEQ19GTEFHU19CVUZGRVJFRCBCSVQoMCkKKworc3RhdGljIHZvaWQgeGFkY193cml0ZV9yZWcoc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCByZWcsCisJdWludDMyX3QgdmFsKQoreworCXdyaXRlbCh2YWwsIHhhZGMtPmJhc2UgKyByZWcpOworfQorCitzdGF0aWMgdm9pZCB4YWRjX3JlYWRfcmVnKHN0cnVjdCB4YWRjICp4YWRjLCB1bnNpZ25lZCBpbnQgcmVnLAorCXVpbnQzMl90ICp2YWwpCit7CisJKnZhbCA9IHJlYWRsKHhhZGMtPmJhc2UgKyByZWcpOworfQorCisvKgorICogVGhlIFpZTlEgaW50ZXJmYWNlIHVzZXMgdHdvIGFzeW5jaHJvbm91cyBGSUZPcyBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZQorICogWEFEQy4gUmVhZHMgYW5kIHdyaXRlcyB0byB0aGUgWEFEQyByZWdpc3RlciBhcmUgcGVyZm9ybWVkIGJ5IHN1Ym1pdHRpbmcgYQorICogcmVxdWVzdCB0byB0aGUgY29tbWFuZCBGSUZPIChDRklGTyksIG9uY2UgdGhlIHJlcXVlc3QgaGFzIGJlZW4gY29tcGxldGVkIHRoZQorICogcmVzdWx0IGNhbiBiZSByZWFkIGZyb20gdGhlIGRhdGEgRklGTyAoREZJRk8pLiBUaGUgbWV0aG9kIGN1cnJlbnRseSB1c2VkIGluCisgKiB0aGlzIGRyaXZlciBpcyB0byBzdWJtaXQgdGhlIHJlcXVlc3QgZm9yIGEgcmVhZC93cml0ZSBvcGVyYXRpb24sIHRoZW4gZ28gdG8KKyAqIHNsZWVwIGFuZCB3YWl0IGZvciBhbiBpbnRlcnJ1cHQgdGhhdCBzaWduYWxzIHRoYXQgYSByZXNwb25zZSBpcyBhdmFpbGFibGUgaW4KKyAqIHRoZSBkYXRhIEZJRk8uCisgKi8KKworc3RhdGljIHZvaWQgeGFkY196eW5xX3dyaXRlX2ZpZm8oc3RydWN0IHhhZGMgKnhhZGMsIHVpbnQzMl90ICpjbWQsCisJdW5zaWduZWQgaW50IG4pCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQl4YWRjX3dyaXRlX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0NGSUZPLCBjbWRbaV0pOworfQorCitzdGF0aWMgdm9pZCB4YWRjX3p5bnFfZHJhaW5fZmlmbyhzdHJ1Y3QgeGFkYyAqeGFkYykKK3sKKwl1aW50MzJfdCBzdGF0dXMsIHRtcDsKKworCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19TVEFUVVMsICZzdGF0dXMpOworCisJd2hpbGUgKCEoc3RhdHVzICYgWEFEQ19aWU5RX1NUQVRVU19ERklGT0UpKSB7CisJCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19ERklGTywgJnRtcCk7CisJCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19TVEFUVVMsICZzdGF0dXMpOworCX0KK30KKworc3RhdGljIHZvaWQgeGFkY196eW5xX3VwZGF0ZV9pbnRtc2soc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCBtYXNrLAorCXVuc2lnbmVkIGludCB2YWwpCit7CisJeGFkYy0+enlucV9pbnRtYXNrICY9IH5tYXNrOworCXhhZGMtPnp5bnFfaW50bWFzayB8PSB2YWw7CisKKwl4YWRjX3dyaXRlX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0lOVE1TSywKKwkJeGFkYy0+enlucV9pbnRtYXNrIHwgeGFkYy0+enlucV9tYXNrZWRfYWxhcm0pOworfQorCitzdGF0aWMgaW50IHhhZGNfenlucV93cml0ZV9hZGNfcmVnKHN0cnVjdCB4YWRjICp4YWRjLCB1bnNpZ25lZCBpbnQgcmVnLAorCXVpbnQxNl90IHZhbCkKK3sKKwl1aW50MzJfdCBjbWRbMV07CisJdWludDMyX3QgdG1wOworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxKCZ4YWRjLT5sb2NrKTsKKwl4YWRjX3p5bnFfdXBkYXRlX2ludG1zayh4YWRjLCBYQURDX1pZTlFfSU5UX0RGSUZPX0dUSCwKKwkJCVhBRENfWllOUV9JTlRfREZJRk9fR1RIKTsKKworCXJlaW5pdF9jb21wbGV0aW9uKCZ4YWRjLT5jb21wbGV0aW9uKTsKKworCWNtZFswXSA9IFhBRENfWllOUV9DTUQoWEFEQ19aWU5RX0NNRF9XUklURSwgcmVnLCB2YWwpOworCXhhZGNfenlucV93cml0ZV9maWZvKHhhZGMsIGNtZCwgQVJSQVlfU0laRShjbWQpKTsKKwl4YWRjX3JlYWRfcmVnKHhhZGMsIFhBRENfWllOUV9SRUdfQ0ZHLCAmdG1wKTsKKwl0bXAgJj0gflhBRENfWllOUV9DRkdfREZJRk9USF9NQVNLOworCXRtcCB8PSAwIDw8IFhBRENfWllOUV9DRkdfREZJRk9USF9PRkZTRVQ7CisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19DRkcsIHRtcCk7CisKKwl4YWRjX3p5bnFfdXBkYXRlX2ludG1zayh4YWRjLCBYQURDX1pZTlFfSU5UX0RGSUZPX0dUSCwgMCk7CisJc3Bpbl91bmxvY2tfaXJxKCZ4YWRjLT5sb2NrKTsKKworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZ4YWRjLT5jb21wbGV0aW9uLCBIWik7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSAtRUlPOworCWVsc2UKKwkJcmV0ID0gMDsKKworCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19ERklGTywgJnRtcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHhhZGNfenlucV9yZWFkX2FkY19yZWcoc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCByZWcsCisJdWludDE2X3QgKnZhbCkKK3sKKwl1aW50MzJfdCBjbWRbMl07CisJdWludDMyX3QgcmVzcCwgdG1wOworCWludCByZXQ7CisKKwljbWRbMF0gPSBYQURDX1pZTlFfQ01EKFhBRENfWllOUV9DTURfUkVBRCwgcmVnLCAwKTsKKwljbWRbMV0gPSBYQURDX1pZTlFfQ01EKFhBRENfWllOUV9DTURfTk9QLCAwLCAwKTsKKworCXNwaW5fbG9ja19pcnEoJnhhZGMtPmxvY2spOworCXhhZGNfenlucV91cGRhdGVfaW50bXNrKHhhZGMsIFhBRENfWllOUV9JTlRfREZJRk9fR1RILAorCQkJWEFEQ19aWU5RX0lOVF9ERklGT19HVEgpOworCXhhZGNfenlucV9kcmFpbl9maWZvKHhhZGMpOworCXJlaW5pdF9jb21wbGV0aW9uKCZ4YWRjLT5jb21wbGV0aW9uKTsKKworCXhhZGNfenlucV93cml0ZV9maWZvKHhhZGMsIGNtZCwgQVJSQVlfU0laRShjbWQpKTsKKwl4YWRjX3JlYWRfcmVnKHhhZGMsIFhBRENfWllOUV9SRUdfQ0ZHLCAmdG1wKTsKKwl0bXAgJj0gflhBRENfWllOUV9DRkdfREZJRk9USF9NQVNLOworCXRtcCB8PSAxIDw8IFhBRENfWllOUV9DRkdfREZJRk9USF9PRkZTRVQ7CisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19DRkcsIHRtcCk7CisKKwl4YWRjX3p5bnFfdXBkYXRlX2ludG1zayh4YWRjLCBYQURDX1pZTlFfSU5UX0RGSUZPX0dUSCwgMCk7CisJc3Bpbl91bmxvY2tfaXJxKCZ4YWRjLT5sb2NrKTsKKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmeGFkYy0+Y29tcGxldGlvbiwgSFopOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gLUVJTzsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19ERklGTywgJnJlc3ApOworCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19ERklGTywgJnJlc3ApOworCisJKnZhbCA9IHJlc3AgJiAweGZmZmY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB4YWRjX3p5bnFfdHJhbnNmb3JtX2FsYXJtKHVuc2lnbmVkIGludCBhbGFybSkKK3sKKwlyZXR1cm4gKChhbGFybSAmIDB4ODApID4+IDQpIHwKKwkJKChhbGFybSAmIDB4NzgpIDw8IDEpIHwKKwkJKGFsYXJtICYgMHgwNyk7Cit9CisKKy8qCisgKiBUaGUgWllOUSB0aHJlc2hvbGQgaW50ZXJydXB0cyBhcmUgbGV2ZWwgc2Vuc2l0aXZlLiBTaW5jZSB3ZSBjYW4ndCBtYWtlIHRoZQorICogdGhyZXNob2xkIGNvbmRpdGlvbiBnbyB3YXkgZnJvbSB3aXRoaW4gdGhlIGludGVycnVwdCBoYW5kbGVyLCB0aGlzIG1lYW5zIGFzCisgKiBzb29uIGFzIGEgdGhyZXNob2xkIGNvbmRpdGlvbiBpcyBwcmVzZW50IHdlIHdvdWxkIGVudGVyIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgorICogYWdhaW4gYW5kIGFnYWluLiBUbyB3b3JrIGFyb3VuZCB0aGlzIHdlIG1hc2sgYWxsIGFjdGl2ZSB0aHJlc2hvbGRzIGludGVycnVwdHMKKyAqIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgc3RhcnQgYSB0aW1lci4gSW4gdGhpcyB0aW1lciB3ZSBwb2xsIHRoZQorICogaW50ZXJydXB0IHN0YXR1cyBhbmQgb25seSBpZiB0aGUgaW50ZXJydXB0IGlzIGluYWN0aXZlIHdlIHVubWFzayBpdCBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgeGFkY196eW5xX3VubWFza193b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB4YWRjICp4YWRjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB4YWRjLCB6eW5xX3VubWFza193b3JrLndvcmspOworCXVuc2lnbmVkIGludCBtaXNjX3N0cywgdW5tYXNrOworCisJeGFkY19yZWFkX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX1NUQVRVUywgJm1pc2Nfc3RzKTsKKworCW1pc2Nfc3RzICY9IFhBRENfWllOUV9JTlRfQUxBUk1fTUFTSzsKKworCXNwaW5fbG9ja19pcnEoJnhhZGMtPmxvY2spOworCisJLyogQ2xlYXIgdGhvc2UgYml0cyB3aGljaCBhcmUgbm90IGFjdGl2ZSBhbnltb3JlICovCisJdW5tYXNrID0gKHhhZGMtPnp5bnFfbWFza2VkX2FsYXJtIF4gbWlzY19zdHMpICYgeGFkYy0+enlucV9tYXNrZWRfYWxhcm07CisJeGFkYy0+enlucV9tYXNrZWRfYWxhcm0gJj0gbWlzY19zdHM7CisKKwkvKiBBbHNvIGNsZWFyIHRob3NlIHdoaWNoIGFyZSBtYXNrZWQgb3V0IGFueXdheSAqLworCXhhZGMtPnp5bnFfbWFza2VkX2FsYXJtICY9IH54YWRjLT56eW5xX2ludG1hc2s7CisKKwkvKiBDbGVhciB0aGUgaW50ZXJydXB0cyBiZWZvcmUgd2UgdW5tYXNrIHRoZW0gKi8KKwl4YWRjX3dyaXRlX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0lOVFNUUywgdW5tYXNrKTsKKworCXhhZGNfenlucV91cGRhdGVfaW50bXNrKHhhZGMsIDAsIDApOworCisJc3Bpbl91bmxvY2tfaXJxKCZ4YWRjLT5sb2NrKTsKKworCS8qIGlmIHN0aWxsIHBlbmRpbmcgc29tZSBhbGFybSByZS10cmlnZ2VyIHRoZSB0aW1lciAqLworCWlmICh4YWRjLT56eW5xX21hc2tlZF9hbGFybSkgeworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnhhZGMtPnp5bnFfdW5tYXNrX3dvcmssCisJCQkJbXNlY3NfdG9famlmZmllcyhYQURDX1pZTlFfVU5NQVNLX1RJTUVPVVQpKTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB4YWRjX3p5bnFfdGhyZWFkZWRfaW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldmlkOworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBpbnQgYWxhcm07CisKKwlzcGluX2xvY2tfaXJxKCZ4YWRjLT5sb2NrKTsKKwlhbGFybSA9IHhhZGMtPnp5bnFfYWxhcm07CisJeGFkYy0+enlucV9hbGFybSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZ4YWRjLT5sb2NrKTsKKworCXhhZGNfaGFuZGxlX2V2ZW50cyhpbmRpb19kZXYsIHhhZGNfenlucV90cmFuc2Zvcm1fYWxhcm0oYWxhcm0pKTsKKworCS8qIHVubWFzayB0aGUgcmVxdWlyZWQgaW50ZXJydXB0cyBpbiB0aW1lci4gKi8KKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnhhZGMtPnp5bnFfdW5tYXNrX3dvcmssCisJCQltc2Vjc190b19qaWZmaWVzKFhBRENfWllOUV9VTk1BU0tfVElNRU9VVCkpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgeGFkY196eW5xX2ludGVycnVwdF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldmlkKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZpZDsKKwlzdHJ1Y3QgeGFkYyAqeGFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX0hBTkRMRUQ7CisJdWludDMyX3Qgc3RhdHVzOworCisJeGFkY19yZWFkX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0lOVFNUUywgJnN0YXR1cyk7CisKKwlzdGF0dXMgJj0gfih4YWRjLT56eW5xX2ludG1hc2sgfCB4YWRjLT56eW5xX21hc2tlZF9hbGFybSk7CisKKwlpZiAoIXN0YXR1cykKKwkJcmV0dXJuIElSUV9OT05FOworCisJc3Bpbl9sb2NrKCZ4YWRjLT5sb2NrKTsKKworCXhhZGNfd3JpdGVfcmVnKHhhZGMsIFhBRENfWllOUV9SRUdfSU5UU1RTLCBzdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIFhBRENfWllOUV9JTlRfREZJRk9fR1RIKSB7CisJCXhhZGNfenlucV91cGRhdGVfaW50bXNrKHhhZGMsIFhBRENfWllOUV9JTlRfREZJRk9fR1RILAorCQkJWEFEQ19aWU5RX0lOVF9ERklGT19HVEgpOworCQljb21wbGV0ZSgmeGFkYy0+Y29tcGxldGlvbik7CisJfQorCisJc3RhdHVzICY9IFhBRENfWllOUV9JTlRfQUxBUk1fTUFTSzsKKwlpZiAoc3RhdHVzKSB7CisJCXhhZGMtPnp5bnFfYWxhcm0gfD0gc3RhdHVzOworCQl4YWRjLT56eW5xX21hc2tlZF9hbGFybSB8PSBzdGF0dXM7CisJCS8qCisJCSAqIG1hc2sgdGhlIGN1cnJlbnQgZXZlbnQgaW50ZXJydXB0LAorCQkgKiB1bm1hc2sgaXQgd2hlbiB0aGUgaW50ZXJydXB0IGlzIG5vIG1vcmUgYWN0aXZlLgorCQkgKi8KKwkJeGFkY196eW5xX3VwZGF0ZV9pbnRtc2soeGFkYywgMCwgMCk7CisJCXJldCA9IElSUV9XQUtFX1RIUkVBRDsKKwl9CisJc3Bpbl91bmxvY2soJnhhZGMtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBYQURDX1pZTlFfVENLX1JBVEVfTUFYIDUwMDAwMDAwCisjZGVmaW5lIFhBRENfWllOUV9JR0FQX0RFRkFVTFQgMjAKKworc3RhdGljIGludCB4YWRjX3p5bnFfc2V0dXAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBpbnQgaXJxKQoreworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBsb25nIHBjYXBfcmF0ZTsKKwl1bnNpZ25lZCBpbnQgdGNrX2RpdjsKKwl1bnNpZ25lZCBpbnQgZGl2OworCXVuc2lnbmVkIGludCBpZ2FwOworCXVuc2lnbmVkIGludCB0Y2tfcmF0ZTsKKworCS8qIFRPRE86IEZpZ3VyZSBvdXQgaG93IHRvIG1ha2UgaWdhcCBhbmQgdGNrX3JhdGUgY29uZmlndXJhYmxlICovCisJaWdhcCA9IFhBRENfWllOUV9JR0FQX0RFRkFVTFQ7CisJdGNrX3JhdGUgPSBYQURDX1pZTlFfVENLX1JBVEVfTUFYOworCisJeGFkYy0+enlucV9pbnRtYXNrID0gfjA7CisKKwlwY2FwX3JhdGUgPSBjbGtfZ2V0X3JhdGUoeGFkYy0+Y2xrKTsKKworCWlmICh0Y2tfcmF0ZSA+IFhBRENfWllOUV9UQ0tfUkFURV9NQVgpCisJCXRja19yYXRlID0gWEFEQ19aWU5RX1RDS19SQVRFX01BWDsKKwlpZiAodGNrX3JhdGUgPiBwY2FwX3JhdGUgLyAyKSB7CisJCWRpdiA9IDI7CisJfSBlbHNlIHsKKwkJZGl2ID0gcGNhcF9yYXRlIC8gdGNrX3JhdGU7CisJCWlmIChwY2FwX3JhdGUgLyBkaXYgPiBYQURDX1pZTlFfVENLX1JBVEVfTUFYKQorCQkJZGl2Kys7CisJfQorCisJaWYgKGRpdiA8PSAzKQorCQl0Y2tfZGl2ID0gWEFEQ19aWU5RX0NGR19UQ0tSQVRFX0RJVjI7CisJZWxzZSBpZiAoZGl2IDw9IDcpCisJCXRja19kaXYgPSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfRElWNDsKKwllbHNlIGlmIChkaXYgPD0gMTUpCisJCXRja19kaXYgPSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfRElWODsKKwllbHNlCisJCXRja19kaXYgPSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfRElWMTY7CisKKwl4YWRjX3dyaXRlX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0NUTCwgWEFEQ19aWU5RX0NUTF9SRVNFVCk7CisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19DVEwsIDApOworCXhhZGNfd3JpdGVfcmVnKHhhZGMsIFhBRENfWllOUV9SRUdfSU5UU1RTLCB+MCk7CisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19JTlRNU0ssIHhhZGMtPnp5bnFfaW50bWFzayk7CisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19DRkcsIFhBRENfWllOUV9DRkdfRU5BQkxFIHwKKwkJCVhBRENfWllOUV9DRkdfUkVER0UgfCBYQURDX1pZTlFfQ0ZHX1dFREdFIHwKKwkJCXRja19kaXYgfCBYQURDX1pZTlFfQ0ZHX0lHQVAoaWdhcCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHhhZGNfenlucV9nZXRfZGNsa19yYXRlKHN0cnVjdCB4YWRjICp4YWRjKQoreworCXVuc2lnbmVkIGludCBkaXY7CisJdWludDMyX3QgdmFsOworCisJeGFkY19yZWFkX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0NGRywgJnZhbCk7CisKKwlzd2l0Y2ggKHZhbCAmIFhBRENfWllOUV9DRkdfVENLUkFURV9NQVNLKSB7CisJY2FzZSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfRElWNDoKKwkJZGl2ID0gNDsKKwkJYnJlYWs7CisJY2FzZSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfRElWODoKKwkJZGl2ID0gODsKKwkJYnJlYWs7CisJY2FzZSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfRElWMTY6CisJCWRpdiA9IDE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkaXYgPSAyOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gY2xrX2dldF9yYXRlKHhhZGMtPmNsaykgLyBkaXY7Cit9CisKK3N0YXRpYyB2b2lkIHhhZGNfenlucV91cGRhdGVfYWxhcm0oc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCBhbGFybSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVpbnQzMl90IHN0YXR1czsKKworCS8qIE1vdmUgT1QgdG8gYml0IDcgKi8KKwlhbGFybSA9ICgoYWxhcm0gJiAweDA4KSA8PCA0KSB8ICgoYWxhcm0gJiAweGYwKSA+PiAxKSB8IChhbGFybSAmIDB4MDcpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnhhZGMtPmxvY2ssIGZsYWdzKTsKKworCS8qIENsZWFyIHByZXZpb3VzIGludGVycnVwdHMgaWYgYW55LiAqLworCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19JTlRTVFMsICZzdGF0dXMpOworCXhhZGNfd3JpdGVfcmVnKHhhZGMsIFhBRENfWllOUV9SRUdfSU5UU1RTLCBzdGF0dXMgJiBhbGFybSk7CisKKwl4YWRjX3p5bnFfdXBkYXRlX2ludG1zayh4YWRjLCBYQURDX1pZTlFfSU5UX0FMQVJNX01BU0ssCisJCX5hbGFybSAmIFhBRENfWllOUV9JTlRfQUxBUk1fTUFTSyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4YWRjLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGFkY19vcHMgeGFkY196eW5xX29wcyA9IHsKKwkucmVhZCA9IHhhZGNfenlucV9yZWFkX2FkY19yZWcsCisJLndyaXRlID0geGFkY196eW5xX3dyaXRlX2FkY19yZWcsCisJLnNldHVwID0geGFkY196eW5xX3NldHVwLAorCS5nZXRfZGNsa19yYXRlID0geGFkY196eW5xX2dldF9kY2xrX3JhdGUsCisJLmludGVycnVwdF9oYW5kbGVyID0geGFkY196eW5xX2ludGVycnVwdF9oYW5kbGVyLAorCS50aHJlYWRlZF9pbnRlcnJ1cHRfaGFuZGxlciA9IHhhZGNfenlucV90aHJlYWRlZF9pbnRlcnJ1cHRfaGFuZGxlciwKKwkudXBkYXRlX2FsYXJtID0geGFkY196eW5xX3VwZGF0ZV9hbGFybSwKK307CisKK3N0YXRpYyBpbnQgeGFkY19heGlfcmVhZF9hZGNfcmVnKHN0cnVjdCB4YWRjICp4YWRjLCB1bnNpZ25lZCBpbnQgcmVnLAorCXVpbnQxNl90ICp2YWwpCit7CisJdWludDMyX3QgdmFsMzI7CisKKwl4YWRjX3JlYWRfcmVnKHhhZGMsIFhBRENfQVhJX0FEQ19SRUdfT0ZGU0VUICsgcmVnICogNCwgJnZhbDMyKTsKKwkqdmFsID0gdmFsMzIgJiAweGZmZmY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4YWRjX2F4aV93cml0ZV9hZGNfcmVnKHN0cnVjdCB4YWRjICp4YWRjLCB1bnNpZ25lZCBpbnQgcmVnLAorCXVpbnQxNl90IHZhbCkKK3sKKwl4YWRjX3dyaXRlX3JlZyh4YWRjLCBYQURDX0FYSV9BRENfUkVHX09GRlNFVCArIHJlZyAqIDQsIHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4YWRjX2F4aV9zZXR1cChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGludCBpcnEpCit7CisJc3RydWN0IHhhZGMgKnhhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19BWElfUkVHX1JFU0VULCBYQURDX0FYSV9SRVNFVF9NQUdJQyk7CisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19BWElfUkVHX0dJRVIsIFhBRENfQVhJX0dJRVJfRU5BQkxFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgeGFkY19heGlfaW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldmlkOworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1aW50MzJfdCBzdGF0dXMsIG1hc2s7CisJdW5zaWduZWQgaW50IGV2ZW50czsKKworCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19BWElfUkVHX0lQSVNSLCAmc3RhdHVzKTsKKwl4YWRjX3JlYWRfcmVnKHhhZGMsIFhBRENfQVhJX1JFR19JUElFUiwgJm1hc2spOworCXN0YXR1cyAmPSBtYXNrOworCisJaWYgKCFzdGF0dXMpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWlmICgoc3RhdHVzICYgWEFEQ19BWElfSU5UX0VPUykgJiYgeGFkYy0+dHJpZ2dlcikKKwkJaWlvX3RyaWdnZXJfcG9sbCh4YWRjLT50cmlnZ2VyLCAwKTsKKworCWlmIChzdGF0dXMgJiBYQURDX0FYSV9JTlRfQUxBUk1fTUFTSykgeworCQkvKgorCQkgKiBUaGUgb3JkZXIgb2YgdGhlIGJpdHMgaW4gdGhlIEFYSS1YQURDIHN0YXR1cyByZWdpc3RlciBkb2VzCisJCSAqIG5vdCBtYXRjaCB0aGUgb3JkZXIgb2YgdGhlIGJpdHMgaW4gdGhlIFhBREMgYWxhcm0gZW5hYmxlCisJCSAqIHJlZ2lzdGVyLiB4YWRjX2hhbmRsZV9ldmVudHMoKSBleHBlY3RzIHRoZSBldmVudHMgdG8gYmUgaW4KKwkJICogdGhlIHNhbWUgb3JkZXIgYXMgdGhlIFhBREMgYWxhcm0gZW5hYmxlIHJlZ2lzdGVyLgorCQkgKi8KKwkJZXZlbnRzID0gKHN0YXR1cyAmIDB4MDAwZSkgPj4gMTsKKwkJZXZlbnRzIHw9IChzdGF0dXMgJiAweDAwMDEpIDw8IDM7CisJCWV2ZW50cyB8PSAoc3RhdHVzICYgMHgzYzAwKSA+PiA2OworCQl4YWRjX2hhbmRsZV9ldmVudHMoaW5kaW9fZGV2LCBldmVudHMpOworCX0KKworCXhhZGNfd3JpdGVfcmVnKHhhZGMsIFhBRENfQVhJX1JFR19JUElTUiwgc3RhdHVzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgeGFkY19heGlfdXBkYXRlX2FsYXJtKHN0cnVjdCB4YWRjICp4YWRjLCB1bnNpZ25lZCBpbnQgYWxhcm0pCit7CisJdWludDMyX3QgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIFRoZSBvcmRlciBvZiB0aGUgYml0cyBpbiB0aGUgQVhJLVhBREMgc3RhdHVzIHJlZ2lzdGVyIGRvZXMgbm90IG1hdGNoCisJICogdGhlIG9yZGVyIG9mIHRoZSBiaXRzIGluIHRoZSBYQURDIGFsYXJtIGVuYWJsZSByZWdpc3Rlci4gV2UgZ2V0CisJICogcGFzc2VkIHRoZSBhbGFybSBtYXNrIGluIHRoZSBzYW1lIG9yZGVyIGFzIGluIHRoZSBYQURDIGFsYXJtIGVuYWJsZQorCSAqIHJlZ2lzdGVyLgorCSAqLworCWFsYXJtID0gKChhbGFybSAmIDB4MDcpIDw8IDEpIHwgKChhbGFybSAmIDB4MDgpID4+IDMpIHwKKwkJCSgoYWxhcm0gJiAweGYwKSA8PCA2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ4YWRjLT5sb2NrLCBmbGFncyk7CisJeGFkY19yZWFkX3JlZyh4YWRjLCBYQURDX0FYSV9SRUdfSVBJRVIsICZ2YWwpOworCXZhbCAmPSB+WEFEQ19BWElfSU5UX0FMQVJNX01BU0s7CisJdmFsIHw9IGFsYXJtOworCXhhZGNfd3JpdGVfcmVnKHhhZGMsIFhBRENfQVhJX1JFR19JUElFUiwgdmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4YWRjLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHhhZGNfYXhpX2dldF9kY2xrKHN0cnVjdCB4YWRjICp4YWRjKQoreworCXJldHVybiBjbGtfZ2V0X3JhdGUoeGFkYy0+Y2xrKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB4YWRjX29wcyB4YWRjX2F4aV9vcHMgPSB7CisJLnJlYWQgPSB4YWRjX2F4aV9yZWFkX2FkY19yZWcsCisJLndyaXRlID0geGFkY19heGlfd3JpdGVfYWRjX3JlZywKKwkuc2V0dXAgPSB4YWRjX2F4aV9zZXR1cCwKKwkuZ2V0X2RjbGtfcmF0ZSA9IHhhZGNfYXhpX2dldF9kY2xrLAorCS51cGRhdGVfYWxhcm0gPSB4YWRjX2F4aV91cGRhdGVfYWxhcm0sCisJLmludGVycnVwdF9oYW5kbGVyID0geGFkY19heGlfaW50ZXJydXB0X2hhbmRsZXIsCisJLmZsYWdzID0gWEFEQ19GTEFHU19CVUZGRVJFRCwKK307CisKK3N0YXRpYyBpbnQgX3hhZGNfdXBkYXRlX2FkY19yZWcoc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCByZWcsCisJdWludDE2X3QgbWFzaywgdWludDE2X3QgdmFsKQoreworCXVpbnQxNl90IHRtcDsKKwlpbnQgcmV0OworCisJcmV0ID0gX3hhZGNfcmVhZF9hZGNfcmVnKHhhZGMsIHJlZywgJnRtcCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBfeGFkY193cml0ZV9hZGNfcmVnKHhhZGMsIHJlZywgKHRtcCAmIH5tYXNrKSB8IHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgeGFkY191cGRhdGVfYWRjX3JlZyhzdHJ1Y3QgeGFkYyAqeGFkYywgdW5zaWduZWQgaW50IHJlZywKKwl1aW50MTZfdCBtYXNrLCB1aW50MTZfdCB2YWwpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnhhZGMtPm11dGV4KTsKKwlyZXQgPSBfeGFkY191cGRhdGVfYWRjX3JlZyh4YWRjLCByZWcsIG1hc2ssIHZhbCk7CisJbXV0ZXhfdW5sb2NrKCZ4YWRjLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB4YWRjX2dldF9kY2xrX3JhdGUoc3RydWN0IHhhZGMgKnhhZGMpCit7CisJcmV0dXJuIHhhZGMtPm9wcy0+Z2V0X2RjbGtfcmF0ZSh4YWRjKTsKK30KKworc3RhdGljIGludCB4YWRjX3VwZGF0ZV9zY2FuX21vZGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwljb25zdCB1bnNpZ25lZCBsb25nICptYXNrKQoreworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBpbnQgbjsKKworCW4gPSBiaXRtYXBfd2VpZ2h0KG1hc2ssIGluZGlvX2Rldi0+bWFza2xlbmd0aCk7CisKKwlrZnJlZSh4YWRjLT5kYXRhKTsKKwl4YWRjLT5kYXRhID0ga2NhbGxvYyhuLCBzaXplb2YoKnhhZGMtPmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXhhZGMtPmRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgeGFkY19zY2FuX2luZGV4X3RvX2NoYW5uZWwodW5zaWduZWQgaW50IHNjYW5faW5kZXgpCit7CisJc3dpdGNoIChzY2FuX2luZGV4KSB7CisJY2FzZSA1OgorCQlyZXR1cm4gWEFEQ19SRUdfVkNDUElOVDsKKwljYXNlIDY6CisJCXJldHVybiBYQURDX1JFR19WQ0NQQVVYOworCWNhc2UgNzoKKwkJcmV0dXJuIFhBRENfUkVHX1ZDQ09fRERSOworCWNhc2UgODoKKwkJcmV0dXJuIFhBRENfUkVHX1RFTVA7CisJY2FzZSA5OgorCQlyZXR1cm4gWEFEQ19SRUdfVkNDSU5UOworCWNhc2UgMTA6CisJCXJldHVybiBYQURDX1JFR19WQ0NBVVg7CisJY2FzZSAxMToKKwkJcmV0dXJuIFhBRENfUkVHX1ZQVk47CisJY2FzZSAxMjoKKwkJcmV0dXJuIFhBRENfUkVHX1ZSRUZQOworCWNhc2UgMTM6CisJCXJldHVybiBYQURDX1JFR19WUkVGTjsKKwljYXNlIDE0OgorCQlyZXR1cm4gWEFEQ19SRUdfVkNDQlJBTTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gWEFEQ19SRUdfVkFVWChzY2FuX2luZGV4IC0gMTYpOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHhhZGNfdHJpZ2dlcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnApCit7CisJc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmID0gcDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPmluZGlvX2RldjsKKwlzdHJ1Y3QgeGFkYyAqeGFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdW5zaWduZWQgaW50IGNoYW47CisJaW50IGksIGo7CisKKwlpZiAoIXhhZGMtPmRhdGEpCisJCWdvdG8gb3V0OworCisJaiA9IDA7CisJZm9yX2VhY2hfc2V0X2JpdChpLCBpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2ssCisJCWluZGlvX2Rldi0+bWFza2xlbmd0aCkgeworCQljaGFuID0geGFkY19zY2FuX2luZGV4X3RvX2NoYW5uZWwoaSk7CisJCXhhZGNfcmVhZF9hZGNfcmVnKHhhZGMsIGNoYW4sICZ4YWRjLT5kYXRhW2pdKTsKKwkJaisrOworCX0KKworCWlpb19wdXNoX3RvX2J1ZmZlcnMoaW5kaW9fZGV2LCB4YWRjLT5kYXRhKTsKKworb3V0OgorCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKGluZGlvX2Rldi0+dHJpZyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgeGFkY190cmlnZ2VyX3NldF9zdGF0ZShzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWdnZXIsIGJvb2wgc3RhdGUpCit7CisJc3RydWN0IHhhZGMgKnhhZGMgPSBpaW9fdHJpZ2dlcl9nZXRfZHJ2ZGF0YSh0cmlnZ2VyKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBjb252c3Q7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJnhhZGMtPm11dGV4KTsKKworCWlmIChzdGF0ZSkgeworCQkvKiBPbmx5IG9uZSBvZiB0aGUgdHdvIHRyaWdnZXJzIGNhbiBiZSBhY3RpdmUgYXQgdGhlIGEgdGltZS4gKi8KKwkJaWYgKHhhZGMtPnRyaWdnZXIgIT0gTlVMTCkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBlcnJfb3V0OworCQl9IGVsc2UgeworCQkJeGFkYy0+dHJpZ2dlciA9IHRyaWdnZXI7CisJCQlpZiAodHJpZ2dlciA9PSB4YWRjLT5jb252c3RfdHJpZ2dlcikKKwkJCQljb252c3QgPSBYQURDX0NPTkYwX0VDOworCQkJZWxzZQorCQkJCWNvbnZzdCA9IDA7CisJCX0KKwkJcmV0ID0gX3hhZGNfdXBkYXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfQ09ORjEsIFhBRENfQ09ORjBfRUMsCisJCQkJCWNvbnZzdCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9vdXQ7CisJfSBlbHNlIHsKKwkJeGFkYy0+dHJpZ2dlciA9IE5VTEw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnhhZGMtPmxvY2ssIGZsYWdzKTsKKwl4YWRjX3JlYWRfcmVnKHhhZGMsIFhBRENfQVhJX1JFR19JUElFUiwgJnZhbCk7CisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19BWElfUkVHX0lQSVNSLCB2YWwgJiBYQURDX0FYSV9JTlRfRU9TKTsKKwlpZiAoc3RhdGUpCisJCXZhbCB8PSBYQURDX0FYSV9JTlRfRU9TOworCWVsc2UKKwkJdmFsICY9IH5YQURDX0FYSV9JTlRfRU9TOworCXhhZGNfd3JpdGVfcmVnKHhhZGMsIFhBRENfQVhJX1JFR19JUElFUiwgdmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4YWRjLT5sb2NrLCBmbGFncyk7CisKK2Vycl9vdXQ6CisJbXV0ZXhfdW5sb2NrKCZ4YWRjLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb190cmlnZ2VyX29wcyB4YWRjX3RyaWdnZXJfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5zZXRfdHJpZ2dlcl9zdGF0ZSA9ICZ4YWRjX3RyaWdnZXJfc2V0X3N0YXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBpaW9fdHJpZ2dlciAqeGFkY19hbGxvY190cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWc7CisJaW50IHJldDsKKworCXRyaWcgPSBpaW9fdHJpZ2dlcl9hbGxvYygiJXMlZC0lcyIsIGluZGlvX2Rldi0+bmFtZSwKKwkJCQlpbmRpb19kZXYtPmlkLCBuYW1lKTsKKwlpZiAodHJpZyA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXRyaWctPmRldi5wYXJlbnQgPSBpbmRpb19kZXYtPmRldi5wYXJlbnQ7CisJdHJpZy0+b3BzID0gJnhhZGNfdHJpZ2dlcl9vcHM7CisJaWlvX3RyaWdnZXJfc2V0X2RydmRhdGEodHJpZywgaWlvX3ByaXYoaW5kaW9fZGV2KSk7CisKKwlyZXQgPSBpaW9fdHJpZ2dlcl9yZWdpc3Rlcih0cmlnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfdHJpZzsKKworCXJldHVybiB0cmlnOworCitlcnJvcl9mcmVlX3RyaWc6CisJaWlvX3RyaWdnZXJfZnJlZSh0cmlnKTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCitzdGF0aWMgaW50IHhhZGNfcG93ZXJfYWRjX2Ioc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCBzZXFfbW9kZSkKK3sKKwl1aW50MTZfdCB2YWw7CisKKwlzd2l0Y2ggKHNlcV9tb2RlKSB7CisJY2FzZSBYQURDX0NPTkYxX1NFUV9TSU1VTFRBTkVPVVM6CisJY2FzZSBYQURDX0NPTkYxX1NFUV9JTkRFUEVOREVOVDoKKwkJdmFsID0gWEFEQ19DT05GMl9QRF9BRENfQjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmFsID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHhhZGNfdXBkYXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfQ09ORjIsIFhBRENfQ09ORjJfUERfTUFTSywKKwkJdmFsKTsKK30KKworc3RhdGljIGludCB4YWRjX2dldF9zZXFfbW9kZShzdHJ1Y3QgeGFkYyAqeGFkYywgdW5zaWduZWQgbG9uZyBzY2FuX21vZGUpCit7CisJdW5zaWduZWQgaW50IGF1eF9zY2FuX21vZGUgPSBzY2FuX21vZGUgPj4gMTY7CisKKwlpZiAoeGFkYy0+ZXh0ZXJuYWxfbXV4X21vZGUgPT0gWEFEQ19FWFRFUk5BTF9NVVhfRFVBTCkKKwkJcmV0dXJuIFhBRENfQ09ORjFfU0VRX1NJTVVMVEFORU9VUzsKKworCWlmICgoYXV4X3NjYW5fbW9kZSAmIDB4ZmYwMCkgPT0gMCB8fAorCQkoYXV4X3NjYW5fbW9kZSAmIDB4MDBmZikgPT0gMCkKKwkJcmV0dXJuIFhBRENfQ09ORjFfU0VRX0NPTlRJTlVPVVM7CisKKwlyZXR1cm4gWEFEQ19DT05GMV9TRVFfU0lNVUxUQU5FT1VTOworfQorCitzdGF0aWMgaW50IHhhZGNfcG9zdGRpc2FibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgeGFkYyAqeGFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdW5zaWduZWQgbG9uZyBzY2FuX21hc2s7CisJaW50IHJldDsKKwlpbnQgaTsKKworCXNjYW5fbWFzayA9IDE7IC8qIFJ1biBjYWxpYnJhdGlvbiBhcyBwYXJ0IG9mIHRoZSBzZXF1ZW5jZSAqLworCWZvciAoaSA9IDA7IGkgPCBpbmRpb19kZXYtPm51bV9jaGFubmVsczsgaSsrKQorCQlzY2FuX21hc2sgfD0gQklUKGluZGlvX2Rldi0+Y2hhbm5lbHNbaV0uc2Nhbl9pbmRleCk7CisKKwkvKiBFbmFibGUgYWxsIGNoYW5uZWxzIGFuZCBjYWxpYnJhdGlvbiAqLworCXJldCA9IHhhZGNfd3JpdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19TRVEoMCksIHNjYW5fbWFzayAmIDB4ZmZmZik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHhhZGNfd3JpdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19TRVEoMSksIHNjYW5fbWFzayA+PiAxNik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHhhZGNfdXBkYXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfQ09ORjEsIFhBRENfQ09ORjFfU0VRX01BU0ssCisJCVhBRENfQ09ORjFfU0VRX0NPTlRJTlVPVVMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4geGFkY19wb3dlcl9hZGNfYih4YWRjLCBYQURDX0NPTkYxX1NFUV9DT05USU5VT1VTKTsKK30KKworc3RhdGljIGludCB4YWRjX3ByZWVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBsb25nIHNjYW5fbWFzazsKKwlpbnQgc2VxX21vZGU7CisJaW50IHJldDsKKworCXJldCA9IHhhZGNfdXBkYXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfQ09ORjEsIFhBRENfQ09ORjFfU0VRX01BU0ssCisJCVhBRENfQ09ORjFfU0VRX0RFRkFVTFQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJc2Nhbl9tYXNrID0gKmluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzazsKKwlzZXFfbW9kZSA9IHhhZGNfZ2V0X3NlcV9tb2RlKHhhZGMsIHNjYW5fbWFzayk7CisKKwlyZXQgPSB4YWRjX3dyaXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfU0VRKDApLCBzY2FuX21hc2sgJiAweGZmZmYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0geGFkY193cml0ZV9hZGNfcmVnKHhhZGMsIFhBRENfUkVHX1NFUSgxKSwgc2Nhbl9tYXNrID4+IDE2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IHhhZGNfcG93ZXJfYWRjX2IoeGFkYywgc2VxX21vZGUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0geGFkY191cGRhdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19DT05GMSwgWEFEQ19DT05GMV9TRVFfTUFTSywKKwkJc2VxX21vZGUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CitlcnI6CisJeGFkY19wb3N0ZGlzYWJsZShpbmRpb19kZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgeGFkY19idWZmZXJfb3BzID0geworCS5wcmVlbmFibGUgPSAmeGFkY19wcmVlbmFibGUsCisJLnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZSwKKwkucHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlLAorCS5wb3N0ZGlzYWJsZSA9ICZ4YWRjX3Bvc3RkaXNhYmxlLAorfTsKKworc3RhdGljIGludCB4YWRjX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sIGludCAqdmFsLCBpbnQgKnZhbDIsIGxvbmcgaW5mbykKK3sKKwlzdHJ1Y3QgeGFkYyAqeGFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdW5zaWduZWQgaW50IGRpdjsKKwl1aW50MTZfdCB2YWwxNjsKKwlpbnQgcmV0OworCisJc3dpdGNoIChpbmZvKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0ID0geGFkY19yZWFkX2FkY19yZWcoeGFkYywgY2hhbi0+YWRkcmVzcywgJnZhbDE2KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXZhbDE2ID4+PSA0OworCQlpZiAoY2hhbi0+c2Nhbl90eXBlLnNpZ24gPT0gJ3UnKQorCQkJKnZhbCA9IHZhbDE2OworCQllbHNlCisJCQkqdmFsID0gc2lnbl9leHRlbmQzMih2YWwxNiwgMTEpOworCisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCXN3aXRjaCAoY2hhbi0+dHlwZSkgeworCQljYXNlIElJT19WT0xUQUdFOgorCQkJLyogViA9ICh2YWwgKiAzLjApIC8gNDA5NiAqLworCQkJc3dpdGNoIChjaGFuLT5hZGRyZXNzKSB7CisJCQljYXNlIFhBRENfUkVHX1ZDQ0lOVDoKKwkJCWNhc2UgWEFEQ19SRUdfVkNDQVVYOgorCQkJY2FzZSBYQURDX1JFR19WQ0NCUkFNOgorCQkJY2FzZSBYQURDX1JFR19WQ0NQSU5UOgorCQkJY2FzZSBYQURDX1JFR19WQ0NQQVVYOgorCQkJY2FzZSBYQURDX1JFR19WQ0NPX0REUjoKKwkJCQkqdmFsID0gMzAwMDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJKnZhbCA9IDEwMDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQkqdmFsMiA9IDEyOworCQkJcmV0dXJuIElJT19WQUxfRlJBQ1RJT05BTF9MT0cyOworCQljYXNlIElJT19URU1QOgorCQkJLyogVGVtcCBpbiBDID0gKHZhbCAqIDUwMy45NzUpIC8gNDA5NiAtIDI3My4xNSAqLworCQkJKnZhbCA9IDUwMzk3NTsKKwkJCSp2YWwyID0gMTI7CisJCQlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMX0xPRzI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCWNhc2UgSUlPX0NIQU5fSU5GT19PRkZTRVQ6CisJCS8qIE9ubHkgdGhlIHRlbXBlcmF0dXJlIGNoYW5uZWwgaGFzIGFuIG9mZnNldCAqLworCQkqdmFsID0gLSgoMjczMTUwIDw8IDEyKSAvIDUwMzk3NSk7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlIElJT19DSEFOX0lORk9fU0FNUF9GUkVROgorCQlyZXQgPSB4YWRjX3JlYWRfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19DT05GMiwgJnZhbDE2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJZGl2ID0gKHZhbDE2ICYgWEFEQ19DT05GMl9ESVZfTUFTSykgPj4gWEFEQ19DT05GMl9ESVZfT0ZGU0VUOworCQlpZiAoZGl2IDwgMikKKwkJCWRpdiA9IDI7CisKKwkJKnZhbCA9IHhhZGNfZ2V0X2RjbGtfcmF0ZSh4YWRjKSAvIGRpdiAvIDI2OworCisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgeGFkY193cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwgaW50IHZhbCwgaW50IHZhbDIsIGxvbmcgaW5mbykKK3sKKwlzdHJ1Y3QgeGFkYyAqeGFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdW5zaWduZWQgbG9uZyBjbGtfcmF0ZSA9IHhhZGNfZ2V0X2RjbGtfcmF0ZSh4YWRjKTsKKwl1bnNpZ25lZCBpbnQgZGl2OworCisJaWYgKGluZm8gIT0gSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZhbCA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE1heC4gMTUwIGtTUFMgKi8KKwlpZiAodmFsID4gMTUwMDAwKQorCQl2YWwgPSAxNTAwMDA7CisKKwl2YWwgKj0gMjY7CisKKwkvKiBNaW4gMU1IeiAqLworCWlmICh2YWwgPCAxMDAwMDAwKQorCQl2YWwgPSAxMDAwMDAwOworCisJLyoKKwkgKiBXZSB3YW50IHRvIHJvdW5kIGRvd24sIGJ1dCBvbmx5IGlmIHdlIGRvIG5vdCBleGNlZWQgdGhlIDE1MCBrU1BTCisJICogbGltaXQuCisJICovCisJZGl2ID0gY2xrX3JhdGUgLyB2YWw7CisJaWYgKGNsa19yYXRlIC8gZGl2IC8gMjYgPiAxNTAwMDApCisJCWRpdisrOworCWlmIChkaXYgPCAyKQorCQlkaXYgPSAyOworCWVsc2UgaWYgKGRpdiA+IDB4ZmYpCisJCWRpdiA9IDB4ZmY7CisKKwlyZXR1cm4geGFkY191cGRhdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19DT05GMiwgWEFEQ19DT05GMl9ESVZfTUFTSywKKwkJZGl2IDw8IFhBRENfQ09ORjJfRElWX09GRlNFVCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2V2ZW50X3NwZWMgeGFkY190ZW1wX2V2ZW50c1tdID0geworCXsKKwkJLnR5cGUgPSBJSU9fRVZfVFlQRV9USFJFU0gsCisJCS5kaXIgPSBJSU9fRVZfRElSX1JJU0lORywKKwkJLm1hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0VWX0lORk9fRU5BQkxFKSB8CisJCQkJQklUKElJT19FVl9JTkZPX1ZBTFVFKSB8CisJCQkJQklUKElJT19FVl9JTkZPX0hZU1RFUkVTSVMpLAorCX0sCit9OworCisvKiBTZXBhcmF0ZSB2YWx1ZXMgZm9yIHVwcGVyIGFuZCBsb3dlciB0aHJlc2hvbGRzLCBidXQgb25seSBhIHNoYXJlZCBlbmFibGVkICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19ldmVudF9zcGVjIHhhZGNfdm9sdGFnZV9ldmVudHNbXSA9IHsKKwl7CisJCS50eXBlID0gSUlPX0VWX1RZUEVfVEhSRVNILAorCQkuZGlyID0gSUlPX0VWX0RJUl9SSVNJTkcsCisJCS5tYXNrX3NlcGFyYXRlID0gQklUKElJT19FVl9JTkZPX1ZBTFVFKSwKKwl9LCB7CisJCS50eXBlID0gSUlPX0VWX1RZUEVfVEhSRVNILAorCQkuZGlyID0gSUlPX0VWX0RJUl9GQUxMSU5HLAorCQkubWFza19zZXBhcmF0ZSA9IEJJVChJSU9fRVZfSU5GT19WQUxVRSksCisJfSwgeworCQkudHlwZSA9IElJT19FVl9UWVBFX1RIUkVTSCwKKwkJLmRpciA9IElJT19FVl9ESVJfRUlUSEVSLAorCQkubWFza19zZXBhcmF0ZSA9IEJJVChJSU9fRVZfSU5GT19FTkFCTEUpLAorCX0sCit9OworCisjZGVmaW5lIFhBRENfQ0hBTl9URU1QKF9jaGFuLCBfc2Nhbl9pbmRleCwgX2FkZHIpIHsgXAorCS50eXBlID0gSUlPX1RFTVAsIFwKKwkuaW5kZXhlZCA9IDEsIFwKKwkuY2hhbm5lbCA9IChfY2hhbiksIFwKKwkuYWRkcmVzcyA9IChfYWRkciksIFwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSB8IFwKKwkJQklUKElJT19DSEFOX0lORk9fU0NBTEUpIHwgXAorCQlCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpLCBcCisJLmluZm9fbWFza19zaGFyZWRfYnlfYWxsID0gQklUKElJT19DSEFOX0lORk9fU0FNUF9GUkVRKSwgXAorCS5ldmVudF9zcGVjID0geGFkY190ZW1wX2V2ZW50cywgXAorCS5udW1fZXZlbnRfc3BlY3MgPSBBUlJBWV9TSVpFKHhhZGNfdGVtcF9ldmVudHMpLCBcCisJLnNjYW5faW5kZXggPSAoX3NjYW5faW5kZXgpLCBcCisJLnNjYW5fdHlwZSA9IHsgXAorCQkuc2lnbiA9ICd1JywgXAorCQkucmVhbGJpdHMgPSAxMiwgXAorCQkuc3RvcmFnZWJpdHMgPSAxNiwgXAorCQkuc2hpZnQgPSA0LCBcCisJCS5lbmRpYW5uZXNzID0gSUlPX0NQVSwgXAorCX0sIFwKK30KKworI2RlZmluZSBYQURDX0NIQU5fVk9MVEFHRShfY2hhbiwgX3NjYW5faW5kZXgsIF9hZGRyLCBfZXh0LCBfYWxhcm0pIHsgXAorCS50eXBlID0gSUlPX1ZPTFRBR0UsIFwKKwkuaW5kZXhlZCA9IDEsIFwKKwkuY2hhbm5lbCA9IChfY2hhbiksIFwKKwkuYWRkcmVzcyA9IChfYWRkciksIFwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSB8IFwKKwkJQklUKElJT19DSEFOX0lORk9fU0NBTEUpLCBcCisJLmluZm9fbWFza19zaGFyZWRfYnlfYWxsID0gQklUKElJT19DSEFOX0lORk9fU0FNUF9GUkVRKSwgXAorCS5ldmVudF9zcGVjID0gKF9hbGFybSkgPyB4YWRjX3ZvbHRhZ2VfZXZlbnRzIDogTlVMTCwgXAorCS5udW1fZXZlbnRfc3BlY3MgPSAoX2FsYXJtKSA/IEFSUkFZX1NJWkUoeGFkY192b2x0YWdlX2V2ZW50cykgOiAwLCBcCisJLnNjYW5faW5kZXggPSAoX3NjYW5faW5kZXgpLCBcCisJLnNjYW5fdHlwZSA9IHsgXAorCQkuc2lnbiA9ICd1JywgXAorCQkucmVhbGJpdHMgPSAxMiwgXAorCQkuc3RvcmFnZWJpdHMgPSAxNiwgXAorCQkuc2hpZnQgPSA0LCBcCisJCS5lbmRpYW5uZXNzID0gSUlPX0NQVSwgXAorCX0sIFwKKwkuZXh0ZW5kX25hbWUgPSBfZXh0LCBcCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyB4YWRjX2NoYW5uZWxzW10gPSB7CisJWEFEQ19DSEFOX1RFTVAoMCwgOCwgWEFEQ19SRUdfVEVNUCksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMCwgOSwgWEFEQ19SRUdfVkNDSU5ULCAidmNjaW50IiwgdHJ1ZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMSwgMTAsIFhBRENfUkVHX1ZDQ0lOVCwgInZjY2F1eCIsIHRydWUpLAorCVhBRENfQ0hBTl9WT0xUQUdFKDIsIDE0LCBYQURDX1JFR19WQ0NCUkFNLCAidmNjYnJhbSIsIHRydWUpLAorCVhBRENfQ0hBTl9WT0xUQUdFKDMsIDUsIFhBRENfUkVHX1ZDQ1BJTlQsICJ2Y2NwaW50IiwgdHJ1ZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoNCwgNiwgWEFEQ19SRUdfVkNDUEFVWCwgInZjY3BhdXgiLCB0cnVlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSg1LCA3LCBYQURDX1JFR19WQ0NPX0REUiwgInZjY29kZHIiLCB0cnVlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSg2LCAxMiwgWEFEQ19SRUdfVlJFRlAsICJ2cmVmcCIsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSg3LCAxMywgWEFEQ19SRUdfVlJFRk4sICJ2cmVmbiIsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSg4LCAxMSwgWEFEQ19SRUdfVlBWTiwgTlVMTCwgZmFsc2UpLAorCVhBRENfQ0hBTl9WT0xUQUdFKDksIDE2LCBYQURDX1JFR19WQVVYKDApLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTAsIDE3LCBYQURDX1JFR19WQVVYKDEpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTEsIDE4LCBYQURDX1JFR19WQVVYKDIpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTIsIDE5LCBYQURDX1JFR19WQVVYKDMpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTMsIDIwLCBYQURDX1JFR19WQVVYKDQpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTQsIDIxLCBYQURDX1JFR19WQVVYKDUpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTUsIDIyLCBYQURDX1JFR19WQVVYKDYpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTYsIDIzLCBYQURDX1JFR19WQVVYKDcpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTcsIDI0LCBYQURDX1JFR19WQVVYKDgpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTgsIDI1LCBYQURDX1JFR19WQVVYKDkpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTksIDI2LCBYQURDX1JFR19WQVVYKDEwKSwgTlVMTCwgZmFsc2UpLAorCVhBRENfQ0hBTl9WT0xUQUdFKDIwLCAyNywgWEFEQ19SRUdfVkFVWCgxMSksIE5VTEwsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSgyMSwgMjgsIFhBRENfUkVHX1ZBVVgoMTIpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMjIsIDI5LCBYQURDX1JFR19WQVVYKDEzKSwgTlVMTCwgZmFsc2UpLAorCVhBRENfQ0hBTl9WT0xUQUdFKDIzLCAzMCwgWEFEQ19SRUdfVkFVWCgxNCksIE5VTEwsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSgyNCwgMzEsIFhBRENfUkVHX1ZBVVgoMTUpLCBOVUxMLCBmYWxzZSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIHhhZGNfaW5mbyA9IHsKKwkucmVhZF9yYXcgPSAmeGFkY19yZWFkX3JhdywKKwkud3JpdGVfcmF3ID0gJnhhZGNfd3JpdGVfcmF3LAorCS5yZWFkX2V2ZW50X2NvbmZpZyA9ICZ4YWRjX3JlYWRfZXZlbnRfY29uZmlnLAorCS53cml0ZV9ldmVudF9jb25maWcgPSAmeGFkY193cml0ZV9ldmVudF9jb25maWcsCisJLnJlYWRfZXZlbnRfdmFsdWUgPSAmeGFkY19yZWFkX2V2ZW50X3ZhbHVlLAorCS53cml0ZV9ldmVudF92YWx1ZSA9ICZ4YWRjX3dyaXRlX2V2ZW50X3ZhbHVlLAorCS51cGRhdGVfc2Nhbl9tb2RlID0gJnhhZGNfdXBkYXRlX3NjYW5fbW9kZSwKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgeGFkY19vZl9tYXRjaF90YWJsZVtdID0geworCXsgLmNvbXBhdGlibGUgPSAieGxueCx6eW5xLXhhZGMtMS4wMC5hIiwgKHZvaWQgKikmeGFkY196eW5xX29wcyB9LAorCXsgLmNvbXBhdGlibGUgPSAieGxueCxheGkteGFkYy0xLjAwLmEiLCAodm9pZCAqKSZ4YWRjX2F4aV9vcHMgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgeGFkY19vZl9tYXRjaF90YWJsZSk7CisKK3N0YXRpYyBpbnQgeGFkY19wYXJzZV9kdChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCXVuc2lnbmVkIGludCAqY29uZikKK3sKKwlzdHJ1Y3QgeGFkYyAqeGFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisJc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzLCAqY2hhbjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoYW5fbm9kZSwgKmNoaWxkOworCXVuc2lnbmVkIGludCBudW1fY2hhbm5lbHM7CisJY29uc3QgY2hhciAqZXh0ZXJuYWxfbXV4OworCXUzMiBleHRfbXV4X2NoYW47CisJaW50IHJlZzsKKwlpbnQgcmV0OworCisJKmNvbmYgPSAwOworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJ4bG54LGV4dGVybmFsLW11eCIsICZleHRlcm5hbF9tdXgpOworCWlmIChyZXQgPCAwIHx8IHN0cmNhc2VjbXAoZXh0ZXJuYWxfbXV4LCAibm9uZSIpID09IDApCisJCXhhZGMtPmV4dGVybmFsX211eF9tb2RlID0gWEFEQ19FWFRFUk5BTF9NVVhfTk9ORTsKKwllbHNlIGlmIChzdHJjYXNlY21wKGV4dGVybmFsX211eCwgInNpbmdsZSIpID09IDApCisJCXhhZGMtPmV4dGVybmFsX211eF9tb2RlID0gWEFEQ19FWFRFUk5BTF9NVVhfU0lOR0xFOworCWVsc2UgaWYgKHN0cmNhc2VjbXAoZXh0ZXJuYWxfbXV4LCAiZHVhbCIpID09IDApCisJCXhhZGMtPmV4dGVybmFsX211eF9tb2RlID0gWEFEQ19FWFRFUk5BTF9NVVhfRFVBTDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHhhZGMtPmV4dGVybmFsX211eF9tb2RlICE9IFhBRENfRVhURVJOQUxfTVVYX05PTkUpIHsKKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJ4bG54LGV4dGVybmFsLW11eC1jaGFubmVsIiwKKwkJCQkJJmV4dF9tdXhfY2hhbik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAoeGFkYy0+ZXh0ZXJuYWxfbXV4X21vZGUgPT0gWEFEQ19FWFRFUk5BTF9NVVhfU0lOR0xFKSB7CisJCQlpZiAoZXh0X211eF9jaGFuID09IDApCisJCQkJZXh0X211eF9jaGFuID0gWEFEQ19SRUdfVlBWTjsKKwkJCWVsc2UgaWYgKGV4dF9tdXhfY2hhbiA8PSAxNikKKwkJCQlleHRfbXV4X2NoYW4gPSBYQURDX1JFR19WQVVYKGV4dF9tdXhfY2hhbiAtIDEpOworCQkJZWxzZQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgeworCQkJaWYgKGV4dF9tdXhfY2hhbiA+IDAgJiYgZXh0X211eF9jaGFuIDw9IDgpCisJCQkJZXh0X211eF9jaGFuID0gWEFEQ19SRUdfVkFVWChleHRfbXV4X2NoYW4gLSAxKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCSpjb25mIHw9IFhBRENfQ09ORjBfTVVYIHwgWEFEQ19DT05GMF9DSEFOKGV4dF9tdXhfY2hhbik7CisJfQorCisJY2hhbm5lbHMgPSBrbWVtZHVwKHhhZGNfY2hhbm5lbHMsIHNpemVvZih4YWRjX2NoYW5uZWxzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGFubmVscykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwludW1fY2hhbm5lbHMgPSA5OworCWNoYW4gPSAmY2hhbm5lbHNbOV07CisKKwljaGFuX25vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShucCwgInhsbngsY2hhbm5lbHMiKTsKKwlpZiAoY2hhbl9ub2RlKSB7CisJCWZvcl9lYWNoX2NoaWxkX29mX25vZGUoY2hhbl9ub2RlLCBjaGlsZCkgeworCQkJaWYgKG51bV9jaGFubmVscyA+PSBBUlJBWV9TSVpFKHhhZGNfY2hhbm5lbHMpKSB7CisJCQkJb2Zfbm9kZV9wdXQoY2hpbGQpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihjaGlsZCwgInJlZyIsICZyZWcpOworCQkJaWYgKHJldCB8fCByZWcgPiAxNikKKwkJCQljb250aW51ZTsKKworCQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChjaGlsZCwgInhsbngsYmlwb2xhciIpKQorCQkJCWNoYW4tPnNjYW5fdHlwZS5zaWduID0gJ3MnOworCisJCQlpZiAocmVnID09IDApIHsKKwkJCQljaGFuLT5zY2FuX2luZGV4ID0gMTE7CisJCQkJY2hhbi0+YWRkcmVzcyA9IFhBRENfUkVHX1ZQVk47CisJCQl9IGVsc2UgeworCQkJCWNoYW4tPnNjYW5faW5kZXggPSAxNSArIHJlZzsKKwkJCQljaGFuLT5zY2FuX2luZGV4ID0gWEFEQ19SRUdfVkFVWChyZWcgLSAxKTsKKwkJCX0KKwkJCW51bV9jaGFubmVscysrOworCQkJY2hhbisrOworCQl9CisJfQorCW9mX25vZGVfcHV0KGNoYW5fbm9kZSk7CisKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IG51bV9jaGFubmVsczsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0ga3JlYWxsb2MoY2hhbm5lbHMsIHNpemVvZigqY2hhbm5lbHMpICoKKwkJCQkJbnVtX2NoYW5uZWxzLCBHRlBfS0VSTkVMKTsKKwkvKiBJZiB3ZSBjYW4ndCByZXNpemUgdGhlIGNoYW5uZWxzIGFycmF5LCBqdXN0IHVzZSB0aGUgb3JpZ2luYWwgKi8KKwlpZiAoIWluZGlvX2Rldi0+Y2hhbm5lbHMpCisJCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhhZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXVuc2lnbmVkIGludCBiaXBvbGFyX21hc2s7CisJc3RydWN0IHJlc291cmNlICptZW07CisJdW5zaWduZWQgaW50IGNvbmYwOworCXN0cnVjdCB4YWRjICp4YWRjOworCWludCByZXQ7CisJaW50IGlycTsKKwlpbnQgaTsKKworCWlmICghcGRldi0+ZGV2Lm9mX25vZGUpCisJCXJldHVybiAtRU5PREVWOworCisJaWQgPSBvZl9tYXRjaF9ub2RlKHhhZGNfb2ZfbWF0Y2hfdGFibGUsIHBkZXYtPmRldi5vZl9ub2RlKTsKKwlpZiAoIWlkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8PSAwKQorCQlyZXR1cm4gLUVOWElPOworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqeGFkYykpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXhhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXhhZGMtPm9wcyA9IGlkLT5kYXRhOworCWluaXRfY29tcGxldGlvbigmeGFkYy0+Y29tcGxldGlvbik7CisJbXV0ZXhfaW5pdCgmeGFkYy0+bXV0ZXgpOworCXNwaW5fbG9ja19pbml0KCZ4YWRjLT5sb2NrKTsKKwlJTklUX0RFTEFZRURfV09SSygmeGFkYy0+enlucV91bm1hc2tfd29yaywgeGFkY196eW5xX3VubWFza193b3JrZXIpOworCisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwl4YWRjLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIG1lbSk7CisJaWYgKElTX0VSUih4YWRjLT5iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoeGFkYy0+YmFzZSk7CisKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCWluZGlvX2Rldi0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlpbmRpb19kZXYtPm5hbWUgPSAieGFkYyI7CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCWluZGlvX2Rldi0+aW5mbyA9ICZ4YWRjX2luZm87CisKKwlyZXQgPSB4YWRjX3BhcnNlX2R0KGluZGlvX2RldiwgcGRldi0+ZGV2Lm9mX25vZGUsICZjb25mMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZGV2aWNlX2ZyZWU7CisKKwlpZiAoeGFkYy0+b3BzLT5mbGFncyAmIFhBRENfRkxBR1NfQlVGRkVSRUQpIHsKKwkJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LAorCQkJJmlpb19wb2xsZnVuY19zdG9yZV90aW1lLCAmeGFkY190cmlnZ2VyX2hhbmRsZXIsCisJCQkmeGFkY19idWZmZXJfb3BzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2RldmljZV9mcmVlOworCisJCXhhZGMtPmNvbnZzdF90cmlnZ2VyID0geGFkY19hbGxvY190cmlnZ2VyKGluZGlvX2RldiwgImNvbnZzdCIpOworCQlpZiAoSVNfRVJSKHhhZGMtPmNvbnZzdF90cmlnZ2VyKSkKKwkJCWdvdG8gZXJyX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cDsKKwkJeGFkYy0+c2FtcGxlcmF0ZV90cmlnZ2VyID0geGFkY19hbGxvY190cmlnZ2VyKGluZGlvX2RldiwKKwkJCSJzYW1wbGVyYXRlIik7CisJCWlmIChJU19FUlIoeGFkYy0+c2FtcGxlcmF0ZV90cmlnZ2VyKSkKKwkJCWdvdG8gZXJyX2ZyZWVfY29udnN0X3RyaWdnZXI7CisJfQorCisJeGFkYy0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIoeGFkYy0+Y2xrKSkgeworCQlyZXQgPSBQVFJfRVJSKHhhZGMtPmNsayk7CisJCWdvdG8gZXJyX2ZyZWVfc2FtcGxlcmF0ZV90cmlnZ2VyOworCX0KKwljbGtfcHJlcGFyZV9lbmFibGUoeGFkYy0+Y2xrKTsKKworCXJldCA9IHhhZGMtPm9wcy0+c2V0dXAocGRldiwgaW5kaW9fZGV2LCBpcnEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWVfc2FtcGxlcmF0ZV90cmlnZ2VyOworCisJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoaXJxLCB4YWRjLT5vcHMtPmludGVycnVwdF9oYW5kbGVyLAorCQkJCXhhZGMtPm9wcy0+dGhyZWFkZWRfaW50ZXJydXB0X2hhbmRsZXIsCisJCQkJMCwgZGV2X25hbWUoJnBkZXYtPmRldiksIGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfY2xrX2Rpc2FibGVfdW5wcmVwYXJlOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXhhZGNfcmVhZF9hZGNfcmVnKHhhZGMsIFhBRENfUkVHX1RIUkVTSE9MRChpKSwKKwkJCSZ4YWRjLT50aHJlc2hvbGRbaV0pOworCisJcmV0ID0geGFkY193cml0ZV9hZGNfcmVnKHhhZGMsIFhBRENfUkVHX0NPTkYwLCBjb25mMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZnJlZV9pcnE7CisKKwliaXBvbGFyX21hc2sgPSAwOworCWZvciAoaSA9IDA7IGkgPCBpbmRpb19kZXYtPm51bV9jaGFubmVsczsgaSsrKSB7CisJCWlmIChpbmRpb19kZXYtPmNoYW5uZWxzW2ldLnNjYW5fdHlwZS5zaWduID09ICdzJykKKwkJCWJpcG9sYXJfbWFzayB8PSBCSVQoaW5kaW9fZGV2LT5jaGFubmVsc1tpXS5zY2FuX2luZGV4KTsKKwl9CisKKwlyZXQgPSB4YWRjX3dyaXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfSU5QVVRfTU9ERSgwKSwgYmlwb2xhcl9tYXNrKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlX2lycTsKKwlyZXQgPSB4YWRjX3dyaXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfSU5QVVRfTU9ERSgxKSwKKwkJYmlwb2xhcl9tYXNrID4+IDE2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlX2lycTsKKworCS8qIERpc2FibGUgYWxsIGFsYXJtcyAqLworCXhhZGNfdXBkYXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfQ09ORjEsIFhBRENfQ09ORjFfQUxBUk1fTUFTSywKKwkJWEFEQ19DT05GMV9BTEFSTV9NQVNLKTsKKworCS8qIFNldCB0aHJlc2hvbGRzIHRvIG1pbi9tYXggKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkvKgorCQkgKiBTZXQgbWF4IHZvbHRhZ2UgdGhyZXNob2xkIGFuZCBib3RoIHRlbXBlcmF0dXJlIHRocmVzaG9sZHMgdG8KKwkJICogMHhmZmZmLCBtaW4gdm9sdGFnZSB0aHJlc2hvbGQgdG8gMC4KKwkJICovCisJCWlmIChpICUgOCA8IDQgfHwgaSA9PSA3KQorCQkJeGFkYy0+dGhyZXNob2xkW2ldID0gMHhmZmZmOworCQllbHNlCisJCQl4YWRjLT50aHJlc2hvbGRbaV0gPSAwOworCQl4YWRjX3dyaXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfVEhSRVNIT0xEKGkpLAorCQkJeGFkYy0+dGhyZXNob2xkW2ldKTsKKwl9CisKKwkvKiBHbyB0byBub24tYnVmZmVyZWQgbW9kZSAqLworCXhhZGNfcG9zdGRpc2FibGUoaW5kaW9fZGV2KTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlX2lycTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZGlvX2Rldik7CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGlycSwgaW5kaW9fZGV2KTsKK2Vycl9mcmVlX3NhbXBsZXJhdGVfdHJpZ2dlcjoKKwlpZiAoeGFkYy0+b3BzLT5mbGFncyAmIFhBRENfRkxBR1NfQlVGRkVSRUQpCisJCWlpb190cmlnZ2VyX2ZyZWUoeGFkYy0+c2FtcGxlcmF0ZV90cmlnZ2VyKTsKK2Vycl9mcmVlX2NvbnZzdF90cmlnZ2VyOgorCWlmICh4YWRjLT5vcHMtPmZsYWdzICYgWEFEQ19GTEFHU19CVUZGRVJFRCkKKwkJaWlvX3RyaWdnZXJfZnJlZSh4YWRjLT5jb252c3RfdHJpZ2dlcik7CitlcnJfdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwOgorCWlmICh4YWRjLT5vcHMtPmZsYWdzICYgWEFEQ19GTEFHU19CVUZGRVJFRCkKKwkJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworZXJyX2Nsa19kaXNhYmxlX3VucHJlcGFyZToKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoeGFkYy0+Y2xrKTsKK2Vycl9kZXZpY2VfZnJlZToKKwlrZnJlZShpbmRpb19kZXYtPmNoYW5uZWxzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgeGFkY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHhhZGMgKnhhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCBpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHhhZGMtPm9wcy0+ZmxhZ3MgJiBYQURDX0ZMQUdTX0JVRkZFUkVEKSB7CisJCWlpb190cmlnZ2VyX2ZyZWUoeGFkYy0+c2FtcGxlcmF0ZV90cmlnZ2VyKTsKKwkJaWlvX3RyaWdnZXJfZnJlZSh4YWRjLT5jb252c3RfdHJpZ2dlcik7CisJCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKKwl9CisJZnJlZV9pcnEoaXJxLCBpbmRpb19kZXYpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZSh4YWRjLT5jbGspOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnhhZGMtPnp5bnFfdW5tYXNrX3dvcmspOworCWtmcmVlKHhhZGMtPmRhdGEpOworCWtmcmVlKGluZGlvX2Rldi0+Y2hhbm5lbHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHhhZGNfZHJpdmVyID0geworCS5wcm9iZSA9IHhhZGNfcHJvYmUsCisJLnJlbW92ZSA9IHhhZGNfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInhhZGMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0geGFkY19vZl9tYXRjaF90YWJsZSwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoeGFkY19kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKCJMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiWGlsaW54IFhBREMgSUlPIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3hpbGlueC14YWRjLWV2ZW50cy5jIGIvZHJpdmVycy9paW8vYWRjL3hpbGlueC14YWRjLWV2ZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlN2YwZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9hZGMveGlsaW54LXhhZGMtZXZlbnRzLmMKQEAgLTAsMCArMSwyNTQgQEAKKy8qCisgKiBYaWxpbnggWEFEQyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgQXV0aG9yOiBMYXJzLVBldGVyIENsYXVlbiA8bGFyc0BtZXRhZm9vLmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaWlvL2V2ZW50cy5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgInhpbGlueC14YWRjLmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqeGFkY19ldmVudF90b19jaGFubmVsKAorCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHVuc2lnbmVkIGludCBldmVudCkKK3sKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBYQURDX1RIUkVTSE9MRF9PVF9NQVg6CisJY2FzZSBYQURDX1RIUkVTSE9MRF9URU1QX01BWDoKKwkJcmV0dXJuICZpbmRpb19kZXYtPmNoYW5uZWxzWzBdOworCWNhc2UgWEFEQ19USFJFU0hPTERfVkNDSU5UX01BWDoKKwljYXNlIFhBRENfVEhSRVNIT0xEX1ZDQ0FVWF9NQVg6CisJCXJldHVybiAmaW5kaW9fZGV2LT5jaGFubmVsc1tldmVudF07CisJZGVmYXVsdDoKKwkJcmV0dXJuICZpbmRpb19kZXYtPmNoYW5uZWxzW2V2ZW50LTFdOworCX0KK30KKworc3RhdGljIHZvaWQgeGFkY19oYW5kbGVfZXZlbnQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdW5zaWduZWQgaW50IGV2ZW50KQoreworCWNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuOworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisKKwkvKiBUZW1wZXJhdHVyZSB0aHJlc2hvbGQgZXJyb3IsIHdlIGRvbid0IGhhbmRsZSB0aGlzIHlldCAqLworCWlmIChldmVudCA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAoZXZlbnQgPCA0KQorCQlvZmZzZXQgPSBldmVudDsKKwllbHNlCisJCW9mZnNldCA9IGV2ZW50ICsgNDsKKworCWNoYW4gPSB4YWRjX2V2ZW50X3RvX2NoYW5uZWwoaW5kaW9fZGV2LCBldmVudCk7CisKKwlpZiAoY2hhbi0+dHlwZSA9PSBJSU9fVEVNUCkgeworCQkvKgorCQkgKiBUaGUgdGVtcGVyYXR1cmUgY2hhbm5lbCBvbmx5IHN1cHBvcnRzIG92ZXItdGVtcGVyYXR1cmUKKwkJICogZXZlbnRzLgorCQkgKi8KKwkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LAorCQkJSUlPX1VOTU9EX0VWRU5UX0NPREUoY2hhbi0+dHlwZSwgY2hhbi0+Y2hhbm5lbCwKKwkJCQlJSU9fRVZfVFlQRV9USFJFU0gsIElJT19FVl9ESVJfUklTSU5HKSwKKwkJCWlpb19nZXRfdGltZV9ucygpKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBGb3Igb3RoZXIgY2hhbm5lbHMgd2UgZG9uJ3Qga25vdyB3aGV0aGVyIGl0IGlzIGEgdXBwZXIgb3IKKwkJICogbG93ZXIgdGhyZXNob2xkIGV2ZW50LiBVc2Vyc3BhY2Ugd2lsbCBoYXZlIHRvIGNoZWNrIHRoZQorCQkgKiBjaGFubmVsIHZhbHVlIGlmIGl0IHdhbnRzIHRvIGtub3cuCisJCSAqLworCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsCisJCQlJSU9fVU5NT0RfRVZFTlRfQ09ERShjaGFuLT50eXBlLCBjaGFuLT5jaGFubmVsLAorCQkJCUlJT19FVl9UWVBFX1RIUkVTSCwgSUlPX0VWX0RJUl9FSVRIRVIpLAorCQkJaWlvX2dldF90aW1lX25zKCkpOworCX0KK30KKwordm9pZCB4YWRjX2hhbmRsZV9ldmVudHMoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdW5zaWduZWQgbG9uZyBldmVudHMpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3JfZWFjaF9zZXRfYml0KGksICZldmVudHMsIDgpCisJCXhhZGNfaGFuZGxlX2V2ZW50KGluZGlvX2RldiwgaSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCB4YWRjX2dldF90aHJlc2hvbGRfb2Zmc2V0KGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuLAorCWVudW0gaWlvX2V2ZW50X2RpcmVjdGlvbiBkaXIpCit7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKworCWlmIChjaGFuLT50eXBlID09IElJT19URU1QKSB7CisJCW9mZnNldCA9IFhBRENfVEhSRVNIT0xEX09UX01BWDsKKwl9IGVsc2UgeworCQlpZiAoY2hhbi0+Y2hhbm5lbCA8IDIpCisJCQlvZmZzZXQgPSBjaGFuLT5jaGFubmVsICsgMTsKKwkJZWxzZQorCQkJb2Zmc2V0ID0gY2hhbi0+Y2hhbm5lbCArIDY7CisJfQorCisJaWYgKGRpciA9PSBJSU9fRVZfRElSX0ZBTExJTkcpCisJCW9mZnNldCArPSA0OworCisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB4YWRjX2dldF9hbGFybV9tYXNrKGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuKQoreworCWlmIChjaGFuLT50eXBlID09IElJT19URU1QKSB7CisJCXJldHVybiBYQURDX0FMQVJNX09UX01BU0s7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChjaGFuLT5jaGFubmVsKSB7CisJCWNhc2UgMDoKKwkJCXJldHVybiBYQURDX0FMQVJNX1ZDQ0lOVF9NQVNLOworCQljYXNlIDE6CisJCQlyZXR1cm4gWEFEQ19BTEFSTV9WQ0NBVVhfTUFTSzsKKwkJY2FzZSAyOgorCQkJcmV0dXJuIFhBRENfQUxBUk1fVkNDQlJBTV9NQVNLOworCQljYXNlIDM6CisJCQlyZXR1cm4gWEFEQ19BTEFSTV9WQ0NQSU5UX01BU0s7CisJCWNhc2UgNDoKKwkJCXJldHVybiBYQURDX0FMQVJNX1ZDQ1BBVVhfTUFTSzsKKwkJY2FzZSA1OgorCQkJcmV0dXJuIFhBRENfQUxBUk1fVkNDT0REUl9NQVNLOworCQlkZWZhdWx0OgorCQkJLyogV2Ugd2lsbCBuZXZlciBnZXQgaGVyZSAqLworCQkJcmV0dXJuIDA7CisJCX0KKwl9Cit9CisKK2ludCB4YWRjX3JlYWRfZXZlbnRfY29uZmlnKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW4sIGVudW0gaWlvX2V2ZW50X3R5cGUgdHlwZSwKKwllbnVtIGlpb19ldmVudF9kaXJlY3Rpb24gZGlyKQoreworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXJldHVybiAoYm9vbCkoeGFkYy0+YWxhcm1fbWFzayAmIHhhZGNfZ2V0X2FsYXJtX21hc2soY2hhbikpOworfQorCitpbnQgeGFkY193cml0ZV9ldmVudF9jb25maWcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbiwgZW51bSBpaW9fZXZlbnRfdHlwZSB0eXBlLAorCWVudW0gaWlvX2V2ZW50X2RpcmVjdGlvbiBkaXIsIGludCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgYWxhcm0gPSB4YWRjX2dldF9hbGFybV9tYXNrKGNoYW4pOworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1aW50MTZfdCBjZmcsIG9sZF9jZmc7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnhhZGMtPm11dGV4KTsKKworCWlmIChzdGF0ZSkKKwkJeGFkYy0+YWxhcm1fbWFzayB8PSBhbGFybTsKKwllbHNlCisJCXhhZGMtPmFsYXJtX21hc2sgJj0gfmFsYXJtOworCisJeGFkYy0+b3BzLT51cGRhdGVfYWxhcm0oeGFkYywgeGFkYy0+YWxhcm1fbWFzayk7CisKKwlyZXQgPSBfeGFkY19yZWFkX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfQ09ORjEsICZjZmcpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dDsKKworCW9sZF9jZmcgPSBjZmc7CisJY2ZnIHw9IFhBRENfQ09ORjFfQUxBUk1fTUFTSzsKKwljZmcgJj0gfigoeGFkYy0+YWxhcm1fbWFzayAmIDB4ZjApIDw8IDQpOyAvKiBicmFtLCBwaW50LCBwYXV4LCBkZHIgKi8KKwljZmcgJj0gfigoeGFkYy0+YWxhcm1fbWFzayAmIDB4MDgpID4+IDMpOyAvKiBvdCAqLworCWNmZyAmPSB+KCh4YWRjLT5hbGFybV9tYXNrICYgMHgwNykgPDwgMSk7IC8qIHRlbXAsIHZjY2ludCwgdmNjYXV4ICovCisJaWYgKG9sZF9jZmcgIT0gY2ZnKQorCQlyZXQgPSBfeGFkY193cml0ZV9hZGNfcmVnKHhhZGMsIFhBRENfUkVHX0NPTkYxLCBjZmcpOworCitlcnJfb3V0OgorCW11dGV4X3VubG9jaygmeGFkYy0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworLyogUmVnaXN0ZXIgdmFsdWUgaXMgbXNiIGFsaWduZWQsIHRoZSBsb3dlciA0IGJpdHMgYXJlIGlnbm9yZWQgKi8KKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfVkFMVUVfU0hJRlQgNAorCitpbnQgeGFkY19yZWFkX2V2ZW50X3ZhbHVlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW4sIGVudW0gaWlvX2V2ZW50X3R5cGUgdHlwZSwKKwllbnVtIGlpb19ldmVudF9kaXJlY3Rpb24gZGlyLCBlbnVtIGlpb19ldmVudF9pbmZvIGluZm8sCisJaW50ICp2YWwsIGludCAqdmFsMikKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0geGFkY19nZXRfdGhyZXNob2xkX29mZnNldChjaGFuLCBkaXIpOworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXN3aXRjaCAoaW5mbykgeworCWNhc2UgSUlPX0VWX0lORk9fVkFMVUU6CisJCSp2YWwgPSB4YWRjLT50aHJlc2hvbGRbb2Zmc2V0XTsKKwkJYnJlYWs7CisJY2FzZSBJSU9fRVZfSU5GT19IWVNURVJFU0lTOgorCQkqdmFsID0geGFkYy0+dGVtcF9oeXN0ZXJlc2lzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqdmFsID4+PSBYQURDX1RIUkVTSE9MRF9WQUxVRV9TSElGVDsKKworCXJldHVybiBJSU9fVkFMX0lOVDsKK30KKworaW50IHhhZGNfd3JpdGVfZXZlbnRfdmFsdWUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbiwgZW51bSBpaW9fZXZlbnRfdHlwZSB0eXBlLAorCWVudW0gaWlvX2V2ZW50X2RpcmVjdGlvbiBkaXIsIGVudW0gaWlvX2V2ZW50X2luZm8gaW5mbywKKwlpbnQgdmFsLCBpbnQgdmFsMikKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0geGFkY19nZXRfdGhyZXNob2xkX29mZnNldChjaGFuLCBkaXIpOworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCXZhbCA8PD0gWEFEQ19USFJFU0hPTERfVkFMVUVfU0hJRlQ7CisKKwlpZiAodmFsIDwgMCB8fCB2YWwgPiAweGZmZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmeGFkYy0+bXV0ZXgpOworCisJc3dpdGNoIChpbmZvKSB7CisJY2FzZSBJSU9fRVZfSU5GT19WQUxVRToKKwkJeGFkYy0+dGhyZXNob2xkW29mZnNldF0gPSB2YWw7CisJCWJyZWFrOworCWNhc2UgSUlPX0VWX0lORk9fSFlTVEVSRVNJUzoKKwkJeGFkYy0+dGVtcF9oeXN0ZXJlc2lzID0gdmFsOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltdXRleF91bmxvY2soJnhhZGMtPm11dGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNoYW4tPnR5cGUgPT0gSUlPX1RFTVApIHsKKwkJLyoKKwkJICogQWNjb3JkaW5nIHRvIHRoZSBkYXRhc2hlZXQgd2UgbmVlZCB0byBzZXQgdGhlIGxvd2VyIDQgYml0cyB0bworCQkgKiAweDMsIG90aGVyd2lzZSAxMjUgZGVncmVlIGNlbHNpdXMgd2lsbCBiZSB1c2VkIGFzIHRoZQorCQkgKiB0aHJlc2hvbGQuCisJCSAqLworCQl2YWwgfD0gMHgzOworCisJCS8qCisJCSAqIFNpbmNlIHdlIHN0b3JlIHRoZSBoeXN0ZXJlc2lzIGFzIHJlbGF0aXZlICh0byB0aGUgdGhyZXNob2xkKQorCQkgKiB2YWx1ZSwgYnV0IHRoZSBoYXJkd2FyZSBleHBlY3RzIGFuIGFic29sdXRlIHZhbHVlIHdlIG5lZWQgdG8KKwkJICogcmVjYWxjdWFsdGUgdGhpcyB2YWx1ZSB3aGVuZXZlciB0aGUgaHlzdGVyZXNpcyBvciB0aGUKKwkJICogdGhyZXNob2xkIGNoYW5nZXMuCisJCSAqLworCQlpZiAoeGFkYy0+dGhyZXNob2xkW29mZnNldF0gPCB4YWRjLT50ZW1wX2h5c3RlcmVzaXMpCisJCQl4YWRjLT50aHJlc2hvbGRbb2Zmc2V0ICsgNF0gPSAwOworCQllbHNlCisJCQl4YWRjLT50aHJlc2hvbGRbb2Zmc2V0ICsgNF0gPSB4YWRjLT50aHJlc2hvbGRbb2Zmc2V0XSAtCisJCQkJCXhhZGMtPnRlbXBfaHlzdGVyZXNpczsKKwkJcmV0ID0gX3hhZGNfd3JpdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19USFJFU0hPTEQob2Zmc2V0ICsgNCksCisJCQl4YWRjLT50aHJlc2hvbGRbb2Zmc2V0ICsgNF0pOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWlmIChpbmZvID09IElJT19FVl9JTkZPX1ZBTFVFKQorCQlyZXQgPSBfeGFkY193cml0ZV9hZGNfcmVnKHhhZGMsIFhBRENfUkVHX1RIUkVTSE9MRChvZmZzZXQpLCB2YWwpOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmeGFkYy0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy94aWxpbngteGFkYy5oIGIvZHJpdmVycy9paW8vYWRjL3hpbGlueC14YWRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc0ODdlOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2FkYy94aWxpbngteGFkYy5oCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogWGlsaW54IFhBREMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTMgQW5hbG9nIERldmljZXMgSW5jLgorICogIEF1dGhvcjogTGFycy1QZXRlciBDbGF1ZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIuCisgKi8KKworI2lmbmRlZiBfX0lJT19YSUxJTlhfWEFEQ19fCisjZGVmaW5lIF9fSUlPX1hJTElOWF9YQURDX18KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworc3RydWN0IGlpb19kZXY7CitzdHJ1Y3QgY2xrOworc3RydWN0IHhhZGNfb3BzOworc3RydWN0IHBsYXRmb3JtX2RldmljZTsKKwordm9pZCB4YWRjX2hhbmRsZV9ldmVudHMoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdW5zaWduZWQgbG9uZyBldmVudHMpOworCitpbnQgeGFkY19yZWFkX2V2ZW50X2NvbmZpZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCWNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuLCBlbnVtIGlpb19ldmVudF90eXBlIHR5cGUsCisJZW51bSBpaW9fZXZlbnRfZGlyZWN0aW9uIGRpcik7CitpbnQgeGFkY193cml0ZV9ldmVudF9jb25maWcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbiwgZW51bSBpaW9fZXZlbnRfdHlwZSB0eXBlLAorCWVudW0gaWlvX2V2ZW50X2RpcmVjdGlvbiBkaXIsIGludCBzdGF0ZSk7CitpbnQgeGFkY19yZWFkX2V2ZW50X3ZhbHVlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW4sIGVudW0gaWlvX2V2ZW50X3R5cGUgdHlwZSwKKwllbnVtIGlpb19ldmVudF9kaXJlY3Rpb24gZGlyLCBlbnVtIGlpb19ldmVudF9pbmZvIGluZm8sCisJaW50ICp2YWwsIGludCAqdmFsMik7CitpbnQgeGFkY193cml0ZV9ldmVudF92YWx1ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCWNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuLCBlbnVtIGlpb19ldmVudF90eXBlIHR5cGUsCisJZW51bSBpaW9fZXZlbnRfZGlyZWN0aW9uIGRpciwgZW51bSBpaW9fZXZlbnRfaW5mbyBpbmZvLAorCWludCB2YWwsIGludCB2YWwyKTsKKworZW51bSB4YWRjX2V4dGVybmFsX211eF9tb2RlIHsKKwlYQURDX0VYVEVSTkFMX01VWF9OT05FLAorCVhBRENfRVhURVJOQUxfTVVYX1NJTkdMRSwKKwlYQURDX0VYVEVSTkFMX01VWF9EVUFMLAorfTsKKworc3RydWN0IHhhZGMgeworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisKKwljb25zdCBzdHJ1Y3QgeGFkY19vcHMgKm9wczsKKworCXVpbnQxNl90IHRocmVzaG9sZFsxNl07CisJdWludDE2X3QgdGVtcF9oeXN0ZXJlc2lzOworCXVuc2lnbmVkIGludCBhbGFybV9tYXNrOworCisJdWludDE2X3QgKmRhdGE7CisKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWdnZXI7CisJc3RydWN0IGlpb190cmlnZ2VyICpjb252c3RfdHJpZ2dlcjsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKnNhbXBsZXJhdGVfdHJpZ2dlcjsKKworCWVudW0geGFkY19leHRlcm5hbF9tdXhfbW9kZSBleHRlcm5hbF9tdXhfbW9kZTsKKworCXVuc2lnbmVkIGludCB6eW5xX2FsYXJtOworCXVuc2lnbmVkIGludCB6eW5xX21hc2tlZF9hbGFybTsKKwl1bnNpZ25lZCBpbnQgenlucV9pbnRtYXNrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgenlucV91bm1hc2tfd29yazsKKworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlzcGlubG9ja190IGxvY2s7CisKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOworfTsKKworc3RydWN0IHhhZGNfb3BzIHsKKwlpbnQgKCpyZWFkKShzdHJ1Y3QgeGFkYyAqLCB1bnNpZ25lZCBpbnQsIHVpbnQxNl90ICopOworCWludCAoKndyaXRlKShzdHJ1Y3QgeGFkYyAqLCB1bnNpZ25lZCBpbnQsIHVpbnQxNl90KTsKKwlpbnQgKCpzZXR1cCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCWludCBpcnEpOworCXZvaWQgKCp1cGRhdGVfYWxhcm0pKHN0cnVjdCB4YWRjICosIHVuc2lnbmVkIGludCk7CisJdW5zaWduZWQgbG9uZyAoKmdldF9kY2xrX3JhdGUpKHN0cnVjdCB4YWRjICopOworCWlycXJldHVybl90ICgqaW50ZXJydXB0X2hhbmRsZXIpKGludCwgdm9pZCAqKTsKKwlpcnFyZXR1cm5fdCAoKnRocmVhZGVkX2ludGVycnVwdF9oYW5kbGVyKShpbnQsIHZvaWQgKik7CisKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7Cit9OworCitzdGF0aWMgaW5saW5lIGludCBfeGFkY19yZWFkX2FkY19yZWcoc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCByZWcsCisJdWludDE2X3QgKnZhbCkKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZ4YWRjLT5tdXRleCk7CisJcmV0dXJuIHhhZGMtPm9wcy0+cmVhZCh4YWRjLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF94YWRjX3dyaXRlX2FkY19yZWcoc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCByZWcsCisJdWludDE2X3QgdmFsKQoreworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnhhZGMtPm11dGV4KTsKKwlyZXR1cm4geGFkYy0+b3BzLT53cml0ZSh4YWRjLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHhhZGNfcmVhZF9hZGNfcmVnKHN0cnVjdCB4YWRjICp4YWRjLCB1bnNpZ25lZCBpbnQgcmVnLAorCXVpbnQxNl90ICp2YWwpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnhhZGMtPm11dGV4KTsKKwlyZXQgPSBfeGFkY19yZWFkX2FkY19yZWcoeGFkYywgcmVnLCB2YWwpOworCW11dGV4X3VubG9jaygmeGFkYy0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHhhZGNfd3JpdGVfYWRjX3JlZyhzdHJ1Y3QgeGFkYyAqeGFkYywgdW5zaWduZWQgaW50IHJlZywKKwl1aW50MTZfdCB2YWwpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnhhZGMtPm11dGV4KTsKKwlyZXQgPSBfeGFkY193cml0ZV9hZGNfcmVnKHhhZGMsIHJlZywgdmFsKTsKKwltdXRleF91bmxvY2soJnhhZGMtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBYQURDIGhhcmRtYWNybyByZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBYQURDX1JFR19URU1QCQkweDAwCisjZGVmaW5lIFhBRENfUkVHX1ZDQ0lOVAkJMHgwMQorI2RlZmluZSBYQURDX1JFR19WQ0NBVVgJCTB4MDIKKyNkZWZpbmUgWEFEQ19SRUdfVlBWTgkJMHgwMworI2RlZmluZSBYQURDX1JFR19WUkVGUAkJMHgwNAorI2RlZmluZSBYQURDX1JFR19WUkVGTgkJMHgwNQorI2RlZmluZSBYQURDX1JFR19WQ0NCUkFNCTB4MDYKKworI2RlZmluZSBYQURDX1JFR19WQ0NQSU5UCTB4MGQKKyNkZWZpbmUgWEFEQ19SRUdfVkNDUEFVWAkweDBlCisjZGVmaW5lIFhBRENfUkVHX1ZDQ09fRERSCTB4MGYKKyNkZWZpbmUgWEFEQ19SRUdfVkFVWCh4KQkoMHgxMCArICh4KSkKKworI2RlZmluZSBYQURDX1JFR19NQVhfVEVNUAkweDIwCisjZGVmaW5lIFhBRENfUkVHX01BWF9WQ0NJTlQJMHgyMQorI2RlZmluZSBYQURDX1JFR19NQVhfVkNDQVVYCTB4MjIKKyNkZWZpbmUgWEFEQ19SRUdfTUFYX1ZDQ0JSQU0JMHgyMworI2RlZmluZSBYQURDX1JFR19NSU5fVEVNUAkweDI0CisjZGVmaW5lIFhBRENfUkVHX01JTl9WQ0NJTlQJMHgyNQorI2RlZmluZSBYQURDX1JFR19NSU5fVkNDQVVYCTB4MjYKKyNkZWZpbmUgWEFEQ19SRUdfTUlOX1ZDQ0JSQU0JMHgyNworI2RlZmluZSBYQURDX1JFR19NQVhfVkNDUElOVAkweDI4CisjZGVmaW5lIFhBRENfUkVHX01BWF9WQ0NQQVVYCTB4MjkKKyNkZWZpbmUgWEFEQ19SRUdfTUFYX1ZDQ09fRERSCTB4MmEKKyNkZWZpbmUgWEFEQ19SRUdfTUlOX1ZDQ1BJTlQJMHgyYgorI2RlZmluZSBYQURDX1JFR19NSU5fVkNDUEFVWAkweDJjCisjZGVmaW5lIFhBRENfUkVHX01JTl9WQ0NPX0REUgkweDJkCisKKyNkZWZpbmUgWEFEQ19SRUdfQ09ORjAJCTB4NDAKKyNkZWZpbmUgWEFEQ19SRUdfQ09ORjEJCTB4NDEKKyNkZWZpbmUgWEFEQ19SRUdfQ09ORjIJCTB4NDIKKyNkZWZpbmUgWEFEQ19SRUdfU0VRKHgpCQkoMHg0OCArICh4KSkKKyNkZWZpbmUgWEFEQ19SRUdfSU5QVVRfTU9ERSh4KQkoMHg0YyArICh4KSkKKyNkZWZpbmUgWEFEQ19SRUdfVEhSRVNIT0xEKHgpCSgweDUwICsgKHgpKQorCisjZGVmaW5lIFhBRENfUkVHX0ZMQUcJCTB4M2YKKworI2RlZmluZSBYQURDX0NPTkYwX0VDCQkJQklUKDkpCisjZGVmaW5lIFhBRENfQ09ORjBfQUNRCQkJQklUKDgpCisjZGVmaW5lIFhBRENfQ09ORjBfTVVYCQkJQklUKDExKQorI2RlZmluZSBYQURDX0NPTkYwX0NIQU4oeCkJCSh4KQorCisjZGVmaW5lIFhBRENfQ09ORjFfU0VRX01BU0sJCSgweGYgPDwgMTIpCisjZGVmaW5lIFhBRENfQ09ORjFfU0VRX0RFRkFVTFQJCSgwIDw8IDEyKQorI2RlZmluZSBYQURDX0NPTkYxX1NFUV9TSU5HTEVfUEFTUwkoMSA8PCAxMikKKyNkZWZpbmUgWEFEQ19DT05GMV9TRVFfQ09OVElOVU9VUwkoMiA8PCAxMikKKyNkZWZpbmUgWEFEQ19DT05GMV9TRVFfU0lOR0xFX0NIQU5ORUwJKDMgPDwgMTIpCisjZGVmaW5lIFhBRENfQ09ORjFfU0VRX1NJTVVMVEFORU9VUwkoNCA8PCAxMikKKyNkZWZpbmUgWEFEQ19DT05GMV9TRVFfSU5ERVBFTkRFTlQJKDggPDwgMTIpCisjZGVmaW5lIFhBRENfQ09ORjFfQUxBUk1fTUFTSwkJMHgwZjBmCisKKyNkZWZpbmUgWEFEQ19DT05GMl9ESVZfTUFTSwkweGZmMDAKKyNkZWZpbmUgWEFEQ19DT05GMl9ESVZfT0ZGU0VUCTgKKworI2RlZmluZSBYQURDX0NPTkYyX1BEX01BU0sJKDB4MyA8PCA0KQorI2RlZmluZSBYQURDX0NPTkYyX1BEX05PTkUJKDB4MCA8PCA0KQorI2RlZmluZSBYQURDX0NPTkYyX1BEX0FEQ19CCSgweDIgPDwgNCkKKyNkZWZpbmUgWEFEQ19DT05GMl9QRF9CT1RICSgweDMgPDwgNCkKKworI2RlZmluZSBYQURDX0FMQVJNX1RFTVBfTUFTSwkJQklUKDApCisjZGVmaW5lIFhBRENfQUxBUk1fVkNDSU5UX01BU0sJCUJJVCgxKQorI2RlZmluZSBYQURDX0FMQVJNX1ZDQ0FVWF9NQVNLCQlCSVQoMikKKyNkZWZpbmUgWEFEQ19BTEFSTV9PVF9NQVNLCQlCSVQoMykKKyNkZWZpbmUgWEFEQ19BTEFSTV9WQ0NCUkFNX01BU0sJCUJJVCg0KQorI2RlZmluZSBYQURDX0FMQVJNX1ZDQ1BJTlRfTUFTSwkJQklUKDUpCisjZGVmaW5lIFhBRENfQUxBUk1fVkNDUEFVWF9NQVNLCQlCSVQoNikKKyNkZWZpbmUgWEFEQ19BTEFSTV9WQ0NPRERSX01BU0sJCUJJVCg3KQorCisjZGVmaW5lIFhBRENfVEhSRVNIT0xEX1RFTVBfTUFYCQkweDAKKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfVkNDSU5UX01BWAkweDEKKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfVkNDQVVYX01BWAkweDIKKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfT1RfTUFYCQkweDMKKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfVEVNUF9NSU4JCTB4NAorI2RlZmluZSBYQURDX1RIUkVTSE9MRF9WQ0NJTlRfTUlOCTB4NQorI2RlZmluZSBYQURDX1RIUkVTSE9MRF9WQ0NBVVhfTUlOCTB4NgorI2RlZmluZSBYQURDX1RIUkVTSE9MRF9PVF9NSU4JCTB4NworI2RlZmluZSBYQURDX1RIUkVTSE9MRF9WQ0NCUkFNX01BWAkweDgKKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfVkNDUElOVF9NQVgJMHg5CisjZGVmaW5lIFhBRENfVEhSRVNIT0xEX1ZDQ1BBVVhfTUFYCTB4YQorI2RlZmluZSBYQURDX1RIUkVTSE9MRF9WQ0NPRERSX01BWAkweGIKKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfVkNDQlJBTV9NSU4JMHhjCisjZGVmaW5lIFhBRENfVEhSRVNIT0xEX1ZDQ1BJTlRfTUlOCTB4ZAorI2RlZmluZSBYQURDX1RIUkVTSE9MRF9WQ0NQQVVYX01JTgkweGUKKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfVkNDT0REUl9NSU4JMHhmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYnVmZmVyX2NiLmMgYi9kcml2ZXJzL2lpby9idWZmZXJfY2IuYwppbmRleCAyZDljNmY4Li5lYjQ2ZTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9idWZmZXJfY2IuYworKysgYi9kcml2ZXJzL2lpby9idWZmZXJfY2IuYwpAQCAtNDYsMTAgKzQ2LDggQEAKIAlzdHJ1Y3QgaWlvX2NoYW5uZWwgKmNoYW47CiAKIAljYl9idWZmID0ga3phbGxvYyhzaXplb2YoKmNiX2J1ZmYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoY2JfYnVmZiA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfcmV0OwotCX0KKwlpZiAoY2JfYnVmZiA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCWlpb19idWZmZXJfaW5pdCgmY2JfYnVmZi0+YnVmZmVyKTsKIApAQCAtOTEsNyArODksNiBAQAogCWlpb19jaGFubmVsX3JlbGVhc2VfYWxsKGNiX2J1ZmYtPmNoYW5uZWxzKTsKIGVycm9yX2ZyZWVfY2JfYnVmZjoKIAlrZnJlZShjYl9idWZmKTsKLWVycm9yX3JldDoKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWlvX2NoYW5uZWxfZ2V0X2FsbF9jYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9kYWMvYWQ3MzAzLmMgYi9kcml2ZXJzL2lpby9kYWMvYWQ3MzAzLmMKaW5kZXggZDA1MDVmZC4uZmEyODEwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vZGFjL2FkNzMwMy5jCisrKyBiL2RyaXZlcnMvaWlvL2RhYy9hZDczMDMuYwpAQCAtOTIsNyArOTIsNyBAQAogCWFkNzMwM193cml0ZShzdCwgY2hhbi0+Y2hhbm5lbCwgc3QtPmRhY19jYWNoZVtjaGFuLT5jaGFubmVsXSk7CiAKIAltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOwotCXJldHVybiByZXQgPyByZXQgOiBsZW47CisJcmV0dXJuIGxlbjsKIH0KIAogc3RhdGljIGludCBhZDczMDNfZ2V0X3ZyZWYoc3RydWN0IGFkNzMwM19zdGF0ZSAqc3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9kYWMvbWF4NTE3LmMgYi9kcml2ZXJzL2lpby9kYWMvbWF4NTE3LmMKaW5kZXggZGU3NmU2YS4uOWE4MmE3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vZGFjL21heDUxNy5jCisrKyBiL2RyaXZlcnMvaWlvL2RhYy9tYXg1MTcuYwpAQCAtMTksNyArMTksNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2RhYy9tY3A0NzI1LmMgYi9kcml2ZXJzL2lpby9kYWMvbWNwNDcyNS5jCmluZGV4IDdkOWY1YzMuLjQzZDE0NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2RhYy9tY3A0NzI1LmMKKysrIGIvZHJpdmVycy9paW8vZGFjL21jcDQ3MjUuYwpAQCAtMTUsNyArMTUsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2h1bWlkaXR5L0tjb25maWcgYi9kcml2ZXJzL2lpby9odW1pZGl0eS9LY29uZmlnCmluZGV4IDQ2M2M0ZDkuLmUxMTZiZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2h1bWlkaXR5L0tjb25maWcKKysrIGIvZHJpdmVycy9paW8vaHVtaWRpdHkvS2NvbmZpZwpAQCAtMTIsNCArMTIsMTQgQEAKIAkgIE90aGVyIHNlbnNvcnMgc2hvdWxkIHdvcmsgYXMgd2VsbCBhcyBsb25nIGFzIHRoZXkgc3BlYWsgdGhlCiAJICBzYW1lIHByb3RvY29sLgogCitjb25maWcgU0k3MDA1CisJdHJpc3RhdGUgIlNJNzAwNSByZWxhdGl2ZSBodW1pZGl0eSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29yIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBTaWxhYnMgU2k3MDA1IHJlbGF0aXZlCisJICBodW1pZGl0eSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29yLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzaTcwMDUuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2h1bWlkaXR5L01ha2VmaWxlIGIvZHJpdmVycy9paW8vaHVtaWRpdHkvTWFrZWZpbGUKaW5kZXggZDVkMzZjMC4uZTNmM2Q5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaHVtaWRpdHkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9paW8vaHVtaWRpdHkvTWFrZWZpbGUKQEAgLTMsMyArMyw0IEBACiAjCiAKIG9iai0kKENPTkZJR19ESFQxMSkgKz0gZGh0MTEubworb2JqLSQoQ09ORklHX1NJNzAwNSkgKz0gc2k3MDA1Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2h1bWlkaXR5L3NpNzAwNS5jIGIvZHJpdmVycy9paW8vaHVtaWRpdHkvc2k3MDA1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkNTg2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2h1bWlkaXR5L3NpNzAwNS5jCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogc2k3MDA1LmMgLSBTdXBwb3J0IGZvciBTaWxhYnMgU2k3MDA1IGh1bWlkaXR5IGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3IKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgUGV0ZXIgTWVlcndhbGQgPHBtZWVyd0BwbWVlcncubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluCisgKiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogKDctYml0IEkyQyBzbGF2ZSBhZGRyZXNzIDB4NDApCisgKgorICogVE9ETzogaGVhdGVyLCBmYXN0IG1vZGUsIHByb2Nlc3NlZCBtb2RlICh0ZW1wLiAvIGxpbmVhcml0eSBjb21wZW5zYXRpb24pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKworI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vc3lzZnMuaD4KKworI2RlZmluZSBTSTcwMDVfU1RBVFVTIDB4MDAKKyNkZWZpbmUgU0k3MDA1X0RBVEEgMHgwMSAvKiAxNi1iaXQsIE1TQiAqLworI2RlZmluZSBTSTcwMDVfQ09ORklHIDB4MDMKKyNkZWZpbmUgU0k3MDA1X0lEIDB4MTEKKworI2RlZmluZSBTSTcwMDVfU1RBVFVTX05SRFkgQklUKDApCisjZGVmaW5lIFNJNzAwNV9DT05GSUdfVEVNUCBCSVQoNCkKKyNkZWZpbmUgU0k3MDA1X0NPTkZJR19TVEFSVCBCSVQoMCkKKworI2RlZmluZSBTSTcwMDVfSURfNzAwNSAweDUwCisjZGVmaW5lIFNJNzAwNV9JRF83MDE1IDB4ZjAKKworc3RydWN0IHNpNzAwNV9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBtdXRleCBsb2NrOworCXU4IGNvbmZpZzsKK307CisKK3N0YXRpYyBpbnQgc2k3MDA1X3JlYWRfbWVhc3VyZW1lbnQoc3RydWN0IHNpNzAwNV9kYXRhICpkYXRhLCBib29sIHRlbXApCit7CisJaW50IHRyaWVzID0gNTA7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIFNJNzAwNV9DT05GSUcsCisJCWRhdGEtPmNvbmZpZyB8IFNJNzAwNV9DT05GSUdfU1RBUlQgfAorCQkodGVtcCA/IFNJNzAwNV9DT05GSUdfVEVNUCA6IDApKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBkb25lOworCisJd2hpbGUgKHRyaWVzLS0gPiAwKSB7CisJCW1zbGVlcCgyMCk7CisJCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIFNJNzAwNV9TVEFUVVMpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZG9uZTsKKwkJaWYgKCEocmV0ICYgU0k3MDA1X1NUQVRVU19OUkRZKSkKKwkJCWJyZWFrOworCX0KKwlpZiAodHJpZXMgPCAwKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoZGF0YS0+Y2xpZW50LCBTSTcwMDVfREFUQSk7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2k3MDA1X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sIGludCAqdmFsLAorCQkJICAgIGludCAqdmFsMiwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBzaTcwMDVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6CisJCXJldCA9IHNpNzAwNV9yZWFkX21lYXN1cmVtZW50KGRhdGEsIGNoYW4tPnR5cGUgPT0gSUlPX1RFTVApOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCSp2YWwgPSByZXQ7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCWlmIChjaGFuLT50eXBlID09IElJT19URU1QKSB7CisJCQkqdmFsID0gNzsKKwkJCSp2YWwyID0gODEyNTAwOworCQl9IGVsc2UgeworCQkJKnZhbCA9IDM7CisJCQkqdmFsMiA9IDkwNjI1MDsKKwkJfQorCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKKwljYXNlIElJT19DSEFOX0lORk9fT0ZGU0VUOgorCQlpZiAoY2hhbi0+dHlwZSA9PSBJSU9fVEVNUCkKKwkJCSp2YWwgPSAtNTAgKiAzMiAqIDQ7CisJCWVsc2UKKwkJCSp2YWwgPSAtMjQgKiAxNiAqIDE2OworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzaTcwMDVfY2hhbm5lbHNbXSA9IHsKKwl7CisJCS50eXBlID0gSUlPX0hVTUlESVRZUkVMQVRJVkUsCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwKKwkJCUJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSB8IEJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCksCisJfSwKKwl7CisJCS50eXBlID0gSUlPX1RFTVAsCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwKKwkJCUJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSB8IEJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCksCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBzaTcwMDVfaW5mbyA9IHsKKwkucmVhZF9yYXcgPSBzaTcwMDVfcmVhZF9yYXcsCisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgc2k3MDA1X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IHNpNzAwNV9kYXRhICpkYXRhOworCWludCByZXQ7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmRhdGEpKTsKKwlpZiAoIWluZGlvX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBpbmRpb19kZXYpOworCWRhdGEtPmNsaWVudCA9IGNsaWVudDsKKwltdXRleF9pbml0KCZkYXRhLT5sb2NrKTsKKworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwlpbmRpb19kZXYtPm5hbWUgPSBkZXZfbmFtZSgmY2xpZW50LT5kZXYpOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPmluZm8gPSAmc2k3MDA1X2luZm87CisKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gc2k3MDA1X2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShzaTcwMDVfY2hhbm5lbHMpOworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgU0k3MDA1X0lEKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAocmV0ICE9IFNJNzAwNV9JRF83MDA1ICYmIHJldCAhPSBTSTcwMDVfSURfNzAxNSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBTSTcwMDVfQ09ORklHKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlkYXRhLT5jb25maWcgPSByZXQ7CisKKwlyZXR1cm4gZGV2bV9paW9fZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgaW5kaW9fZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHNpNzAwNV9pZFtdID0geworCXsgInNpNzAwNSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgc2k3MDA1X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHNpNzAwNV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAic2k3MDA1IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBzaTcwMDVfcHJvYmUsCisJLmlkX3RhYmxlID0gc2k3MDA1X2lkLAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKHNpNzAwNV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJQZXRlciBNZWVyd2FsZCA8cG1lZXJ3QHBtZWVydy5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNpbGFicyBTaTcwMDUgaHVtaWRpdHkgYW5kIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2ltdS9LY29uZmlnIGIvZHJpdmVycy9paW8vaW11L0tjb25maWcKaW5kZXggNjYzZTg4YS4uMmIwZTQ1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaW11L0tjb25maWcKKysrIGIvZHJpdmVycy9paW8vaW11L0tjb25maWcKQEAgLTI1LDYgKzI1LDggQEAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRElTMTYzNzUsIEFESVMxNjQ4MCwKIAkgIEFESVMxNjQ4NSwgQURJUzE2NDg4IGluZXJ0aWFsIHNlbnNvcnMuCiAKK3NvdXJjZSAiZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL0tjb25maWciCisKIGVuZG1lbnUKIAogY29uZmlnIElJT19BRElTX0xJQgpAQCAtMzgsNSArNDAsMyBAQAogCWhlbHAKIAkgIEEgc2V0IG9mIGJ1ZmZlciBoZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgQW5hbG9nIERldmljZXMgQURJUyogZGV2aWNlCiAJICBmYW1pbHkuCi0KLXNvdXJjZSAiZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9pbXUvYWRpczE2NDAwX2NvcmUuYyBiL2RyaXZlcnMvaWlvL2ltdS9hZGlzMTY0MDBfY29yZS5jCmluZGV4IDdjNTgyZjcuLjQzMzU4M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2ltdS9hZGlzMTY0MDBfY29yZS5jCisrKyBiL2RyaXZlcnMvaWlvL2ltdS9hZGlzMTY0MDBfY29yZS5jCkBAIC0yODEsNyArMjgxLDcgQEAKIAlzdC0+dmFyaWFudC0+c2V0X2ZyZXEoc3QsIHZhbCk7CiAJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKIAotCXJldHVybiByZXQgPyByZXQgOiBsZW47CisJcmV0dXJuIGxlbjsKIH0KIAogLyogUG93ZXIgZG93biB0aGUgZGV2aWNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvaW52X21wdV9jb3JlLmMgYi9kcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvaW52X21wdV9jb3JlLmMKaW5kZXggZGY3ZjFlMS4uY2I5Zjk2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfY29yZS5jCisrKyBiL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X2NvcmUuYwpAQCAtMTIsNyArMTIsNiBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CkBAIC0xMTcsNyArMTE2LDcgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAogCWlmIChlbikgewotCQkvKiBXYWl0IGZvciBvdXRwdXQgc3RhYmxpemUgKi8KKwkJLyogV2FpdCBmb3Igb3V0cHV0IHN0YWJpbGl6ZSAqLwogCQltc2xlZXAoSU5WX01QVTYwNTBfVEVNUF9VUF9USU1FKTsKIAkJaWYgKElOVl9NUFU2MDUwX0JJVF9QV1JfR1lST19TVEJZID09IG1hc2spIHsKIAkJCS8qIHN3aXRjaCBpbnRlcm5hbCBjbG9jayB0byBQTEwgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X2lpby5oIGIvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfaWlvLmgKaW5kZXggZjM4Mzk1NS4uMGFiMzgyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfaWlvLmgKKysrIGIvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfaWlvLmgKQEAgLTEyNiwzNSArMTI2LDM1IEBACiAjZGVmaW5lIElOVl9NUFU2MDUwX1JFR19TQU1QTEVfUkFURV9ESVYgICAgIDB4MTkKICNkZWZpbmUgSU5WX01QVTYwNTBfUkVHX0NPTkZJRyAgICAgICAgICAgICAgMHgxQQogI2RlZmluZSBJTlZfTVBVNjA1MF9SRUdfR1lST19DT05GSUcgICAgICAgICAweDFCCi0jZGVmaW5lIElOVl9NUFU2MDUwX1JFR19BQ0NFTF9DT05GSUcJICAgIDB4MUMKKyNkZWZpbmUgSU5WX01QVTYwNTBfUkVHX0FDQ0VMX0NPTkZJRyAgICAgICAgMHgxQwogCiAjZGVmaW5lIElOVl9NUFU2MDUwX1JFR19GSUZPX0VOICAgICAgICAgICAgIDB4MjMKLSNkZWZpbmUgSU5WX01QVTYwNTBfQklUX0FDQ0VMX09VVCAgICAgICAgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIElOVl9NUFU2MDUwX0JJVFNfR1lST19PVVQgICAgICAgICAgICAgICAgICAgMHg3MAorI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfQUNDRUxfT1VUICAgICAgICAgICAweDA4CisjZGVmaW5lIElOVl9NUFU2MDUwX0JJVFNfR1lST19PVVQgICAgICAgICAgIDB4NzAKIAogI2RlZmluZSBJTlZfTVBVNjA1MF9SRUdfSU5UX0VOQUJMRSAgICAgICAgICAweDM4Ci0jZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9EQVRBX1JEWV9FTiAgICAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfRE1QX0lOVF9FTiAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgSU5WX01QVTYwNTBfQklUX0RBVEFfUkRZX0VOICAgICAgICAgMHgwMQorI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfRE1QX0lOVF9FTiAgICAgICAgICAweDAyCiAKICNkZWZpbmUgSU5WX01QVTYwNTBfUkVHX1JBV19BQ0NFTCAgICAgICAgICAgMHgzQgogI2RlZmluZSBJTlZfTVBVNjA1MF9SRUdfVEVNUEVSQVRVUkUgICAgICAgICAweDQxCiAjZGVmaW5lIElOVl9NUFU2MDUwX1JFR19SQVdfR1lSTyAgICAgICAgICAgIDB4NDMKIAogI2RlZmluZSBJTlZfTVBVNjA1MF9SRUdfVVNFUl9DVFJMICAgICAgICAgICAweDZBCi0jZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9GSUZPX1JTVCAgICAgICAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfRE1QX1JTVCAgICAgICAgICAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgSU5WX01QVTYwNTBfQklUX0kyQ19NU1RfRU4gICAgICAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9GSUZPX0VOICAgICAgICAgICAgICAgICAgICAgMHg0MAotI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfRE1QX0VOICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgSU5WX01QVTYwNTBfQklUX0ZJRk9fUlNUICAgICAgICAgICAgMHgwNAorI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfRE1QX1JTVCAgICAgICAgICAgICAweDA4CisjZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9JMkNfTVNUX0VOICAgICAgICAgIDB4MjAKKyNkZWZpbmUgSU5WX01QVTYwNTBfQklUX0ZJRk9fRU4gICAgICAgICAgICAgMHg0MAorI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfRE1QX0VOICAgICAgICAgICAgICAweDgwCiAKICNkZWZpbmUgSU5WX01QVTYwNTBfUkVHX1BXUl9NR01UXzEgICAgICAgICAgMHg2QgotI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfSF9SRVNFVCAgICAgICAgICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgSU5WX01QVTYwNTBfQklUX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9DTEtfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg3CisjZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9IX1JFU0VUICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgSU5WX01QVTYwNTBfQklUX1NMRUVQICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfQ0xLX01BU0sgICAgICAgICAgICAweDcKIAogI2RlZmluZSBJTlZfTVBVNjA1MF9SRUdfUFdSX01HTVRfMiAgICAgICAgICAweDZDCi0jZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9QV1JfQUNDTF9TVEJZICAgICAgICAgICAgICAgMHgzOAotI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfUFdSX0dZUk9fU1RCWSAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgSU5WX01QVTYwNTBfQklUX1BXUl9BQ0NMX1NUQlkgICAgICAgMHgzOAorI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfUFdSX0dZUk9fU1RCWSAgICAgICAweDA3CiAKICNkZWZpbmUgSU5WX01QVTYwNTBfUkVHX0ZJRk9fQ09VTlRfSCAgICAgICAgMHg3MgogI2RlZmluZSBJTlZfTVBVNjA1MF9SRUdfRklGT19SX1cgICAgICAgICAgICAweDc0CkBAIC0xODAsMTAgKzE4MCwxMCBAQAogCiAvKiBpbml0IHBhcmFtZXRlcnMgKi8KICNkZWZpbmUgSU5WX01QVTYwNTBfSU5JVF9GSUZPX1JBVEUgICAgICAgICAgIDUwCi0jZGVmaW5lIElOVl9NUFU2MDUwX1RJTUVfU1RBTVBfVE9SICAgICAgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBJTlZfTVBVNjA1MF9NQVhfRklGT19SQVRFICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAKLSNkZWZpbmUgSU5WX01QVTYwNTBfTUlOX0ZJRk9fUkFURSAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIElOVl9NUFU2MDUwX09ORV9LX0haICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMAorI2RlZmluZSBJTlZfTVBVNjA1MF9USU1FX1NUQU1QX1RPUiAgICAgICAgICAgNQorI2RlZmluZSBJTlZfTVBVNjA1MF9NQVhfRklGT19SQVRFICAgICAgICAgICAgMTAwMAorI2RlZmluZSBJTlZfTVBVNjA1MF9NSU5fRklGT19SQVRFICAgICAgICAgICAgNAorI2RlZmluZSBJTlZfTVBVNjA1MF9PTkVfS19IWiAgICAgICAgICAgICAgICAgMTAwMAogCiAvKiBzY2FuIGVsZW1lbnQgZGVmaW5pdGlvbiAqLwogZW51bSBpbnZfbXB1NjA1MF9zY2FuIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X3JpbmcuYyBiL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X3JpbmcuYwppbmRleCA0Mjk1MTcxLi4wY2QzMDZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvaW52X21wdV9yaW5nLmMKKysrIGIvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfcmluZy5jCkBAIC0xMiw3ICsxMiw2IEBACiAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1idWZmZXIuYyBiL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1idWZmZXIuYwppbmRleCBjNjdkODNiLi5lMTA4ZjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tYnVmZmVyLmMKKysrIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jCkBAIC0yNjQsNyArMjY0LDcgQEAKIAkJCQkgICAgICZpbmRpb19kZXYtPmRldiwKIAkJCQkgICAgICZidWZmZXItPnNjYW5fZWxfZGV2X2F0dHJfbGlzdCk7CiAJaWYgKHJldCkKLQkJZ290byBlcnJvcl9yZXQ7CisJCXJldHVybiByZXQ7CiAJYXR0cmNvdW50Kys7CiAJcmV0ID0gX19paW9fYWRkX2NoYW5fZGV2YXR0cigidHlwZSIsCiAJCQkJICAgICBjaGFuLApAQCAtMjc1LDcgKzI3NSw3IEBACiAJCQkJICAgICAmaW5kaW9fZGV2LT5kZXYsCiAJCQkJICAgICAmYnVmZmVyLT5zY2FuX2VsX2Rldl9hdHRyX2xpc3QpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfcmV0OworCQlyZXR1cm4gcmV0OwogCWF0dHJjb3VudCsrOwogCWlmIChjaGFuLT50eXBlICE9IElJT19USU1FU1RBTVApCiAJCXJldCA9IF9faWlvX2FkZF9jaGFuX2RldmF0dHIoImVuIiwKQEAgLTI5NiwxMCArMjk2LDkgQEAKIAkJCQkJICAgICAmaW5kaW9fZGV2LT5kZXYsCiAJCQkJCSAgICAgJmJ1ZmZlci0+c2Nhbl9lbF9kZXZfYXR0cl9saXN0KTsKIAlpZiAocmV0KQotCQlnb3RvIGVycm9yX3JldDsKKwkJcmV0dXJuIHJldDsKIAlhdHRyY291bnQrKzsKIAlyZXQgPSBhdHRyY291bnQ7Ci1lcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTUzLDEzICs1NTIsMTMgQEAKIAkJaWYgKGluZGlvX2Rldi0+c2V0dXBfb3BzLT5wcmVkaXNhYmxlKSB7CiAJCQlyZXQgPSBpbmRpb19kZXYtPnNldHVwX29wcy0+cHJlZGlzYWJsZShpbmRpb19kZXYpOwogCQkJaWYgKHJldCkKLQkJCQlnb3RvIGVycm9yX3JldDsKKwkJCQlyZXR1cm4gcmV0OwogCQl9CiAJCWluZGlvX2Rldi0+Y3VycmVudG1vZGUgPSBJTkRJT19ESVJFQ1RfTU9ERTsKIAkJaWYgKGluZGlvX2Rldi0+c2V0dXBfb3BzLT5wb3N0ZGlzYWJsZSkgewogCQkJcmV0ID0gaW5kaW9fZGV2LT5zZXR1cF9vcHMtPnBvc3RkaXNhYmxlKGluZGlvX2Rldik7CiAJCQlpZiAocmV0KQotCQkJCWdvdG8gZXJyb3JfcmV0OworCQkJCXJldHVybiByZXQ7CiAJCX0KIAl9CiAJLyogS2VlcCBhIGNvcHkgb2YgY3VycmVudCBzZXR1cCB0byBhbGxvdyByb2xsIGJhY2sgKi8KQEAgLTYxMyw3ICs2MTIsNyBAQAogCQkJZWxzZSB7CiAJCQkJa2ZyZWUoY29tcG91bmRfbWFzayk7CiAJCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlnb3RvIGVycm9yX3JldDsKKwkJCQlyZXR1cm4gcmV0OwogCQkJfQogCQl9CiAJfSBlbHNlIHsKQEAgLTY5NiwxMyArNjk1LDEwIEBACiAJaWYgKGluZGlvX2Rldi0+c2V0dXBfb3BzLT5wb3N0ZGlzYWJsZSkKIAkJaW5kaW9fZGV2LT5zZXR1cF9vcHMtPnBvc3RkaXNhYmxlKGluZGlvX2Rldik7CiBlcnJvcl9yZW1vdmVfaW5zZXJ0ZWQ6Ci0KIAlpZiAoaW5zZXJ0X2J1ZmZlcikKIAkJaWlvX2J1ZmZlcl9kZWFjdGl2YXRlKGluc2VydF9idWZmZXIpOwogCWluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzayA9IG9sZF9tYXNrOwogCWtmcmVlKGNvbXBvdW5kX21hc2spOwotZXJyb3JfcmV0OgotCiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWNvcmUuYyBiL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1jb3JlLmMKaW5kZXggYWNjOTExYS4uZWRlMTZhZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1jb3JlLmMKKysrIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWNvcmUuYwpAQCAtNTQwLDcgKzU0MCw3IEBACiAJCQkgICBlbnVtIGlpb19zaGFyZWRfYnkgc2hhcmVkX2J5KQogewogCWludCByZXQgPSAwOwotCWNoYXIgKm5hbWVfZm9ybWF0ID0gTlVMTDsKKwljaGFyICpuYW1lID0gTlVMTDsKIAljaGFyICpmdWxsX3Bvc3RmaXg7CiAJc3lzZnNfYXR0cl9pbml0KCZkZXZfYXR0ci0+YXR0cik7CiAKQEAgLTU1OCw3ICs1NTgsNyBAQAogCQkJCQkJCQkgICAgLT5jaGFubmVsMl0sCiAJCQkJCQkgcG9zdGZpeCk7CiAJfSBlbHNlIHsKLQkJaWYgKGNoYW4tPmV4dGVuZF9uYW1lID09IE5VTEwpCisJCWlmIChjaGFuLT5leHRlbmRfbmFtZSA9PSBOVUxMIHx8IHNoYXJlZF9ieSAhPSBJSU9fU0VQQVJBVEUpCiAJCQlmdWxsX3Bvc3RmaXggPSBrc3RyZHVwKHBvc3RmaXgsIEdGUF9LRVJORUwpOwogCQllbHNlCiAJCQlmdWxsX3Bvc3RmaXggPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwKQEAgLTU3MiwxNiArNTcyLDE1IEBACiAJaWYgKGNoYW4tPmRpZmZlcmVudGlhbCkgeyAvKiBEaWZmZXJlbnRpYWwgY2FuIG5vdCBoYXZlIG1vZGlmaWVyICovCiAJCXN3aXRjaCAoc2hhcmVkX2J5KSB7CiAJCWNhc2UgSUlPX1NIQVJFRF9CWV9BTEw6Ci0JCQluYW1lX2Zvcm1hdCA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMiLCBmdWxsX3Bvc3RmaXgpOworCQkJbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMiLCBmdWxsX3Bvc3RmaXgpOwogCQkJYnJlYWs7CiAJCWNhc2UgSUlPX1NIQVJFRF9CWV9ESVI6Ci0JCQluYW1lX2Zvcm1hdCA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfJXMiLAorCQkJbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfJXMiLAogCQkJCQkJaWlvX2RpcmVjdGlvbltjaGFuLT5vdXRwdXRdLAogCQkJCQkJZnVsbF9wb3N0Zml4KTsKIAkJCWJyZWFrOwogCQljYXNlIElJT19TSEFSRURfQllfVFlQRToKLQkJCW5hbWVfZm9ybWF0Ci0JCQkJPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzXyVzLSVzXyVzIiwKKwkJCW5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzXyVzLSVzXyVzIiwKIAkJCQkJICAgIGlpb19kaXJlY3Rpb25bY2hhbi0+b3V0cHV0XSwKIAkJCQkJICAgIGlpb19jaGFuX3R5cGVfbmFtZV9zcGVjW2NoYW4tPnR5cGVdLAogCQkJCQkgICAgaWlvX2NoYW5fdHlwZV9uYW1lX3NwZWNbY2hhbi0+dHlwZV0sCkBAIC01OTMsOCArNTkyLDcgQEAKIAkJCQlyZXQgPSAtRUlOVkFMOwogCQkJCWdvdG8gZXJyb3JfZnJlZV9mdWxsX3Bvc3RmaXg7CiAJCQl9Ci0JCQluYW1lX2Zvcm1hdAotCQkJCT0ga2FzcHJpbnRmKEdGUF9LRVJORUwsCisJCQluYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsCiAJCQkJCSAgICAiJXNfJXMlZC0lcyVkXyVzIiwKIAkJCQkJICAgIGlpb19kaXJlY3Rpb25bY2hhbi0+b3V0cHV0XSwKIAkJCQkJICAgIGlpb19jaGFuX3R5cGVfbmFtZV9zcGVjW2NoYW4tPnR5cGVdLApAQCAtNjA3LDE2ICs2MDUsMTUgQEAKIAl9IGVsc2UgeyAvKiBTaW5nbGUgZW5kZWQgKi8KIAkJc3dpdGNoIChzaGFyZWRfYnkpIHsKIAkJY2FzZSBJSU9fU0hBUkVEX0JZX0FMTDoKLQkJCW5hbWVfZm9ybWF0ID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlcyIsIGZ1bGxfcG9zdGZpeCk7CisJCQluYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlcyIsIGZ1bGxfcG9zdGZpeCk7CiAJCQlicmVhazsKIAkJY2FzZSBJSU9fU0hBUkVEX0JZX0RJUjoKLQkJCW5hbWVfZm9ybWF0ID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lcyIsCisJCQluYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lcyIsCiAJCQkJCQlpaW9fZGlyZWN0aW9uW2NoYW4tPm91dHB1dF0sCiAJCQkJCQlmdWxsX3Bvc3RmaXgpOwogCQkJYnJlYWs7CiAJCWNhc2UgSUlPX1NIQVJFRF9CWV9UWVBFOgotCQkJbmFtZV9mb3JtYXQKLQkJCQk9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfJXNfJXMiLAorCQkJbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfJXNfJXMiLAogCQkJCQkgICAgaWlvX2RpcmVjdGlvbltjaGFuLT5vdXRwdXRdLAogCQkJCQkgICAgaWlvX2NoYW5fdHlwZV9uYW1lX3NwZWNbY2hhbi0+dHlwZV0sCiAJCQkJCSAgICBmdWxsX3Bvc3RmaXgpOwpAQCAtNjI0LDMzICs2MjEsMjQgQEAKIAogCQljYXNlIElJT19TRVBBUkFURToKIAkJCWlmIChjaGFuLT5pbmRleGVkKQotCQkJCW5hbWVfZm9ybWF0Ci0JCQkJCT0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lcyVkXyVzIiwKKwkJCQluYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lcyVkXyVzIiwKIAkJCQkJCSAgICBpaW9fZGlyZWN0aW9uW2NoYW4tPm91dHB1dF0sCiAJCQkJCQkgICAgaWlvX2NoYW5fdHlwZV9uYW1lX3NwZWNbY2hhbi0+dHlwZV0sCiAJCQkJCQkgICAgY2hhbi0+Y2hhbm5lbCwKIAkJCQkJCSAgICBmdWxsX3Bvc3RmaXgpOwogCQkJZWxzZQotCQkJCW5hbWVfZm9ybWF0Ci0JCQkJCT0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lc18lcyIsCisJCQkJbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfJXNfJXMiLAogCQkJCQkJICAgIGlpb19kaXJlY3Rpb25bY2hhbi0+b3V0cHV0XSwKIAkJCQkJCSAgICBpaW9fY2hhbl90eXBlX25hbWVfc3BlY1tjaGFuLT50eXBlXSwKIAkJCQkJCSAgICBmdWxsX3Bvc3RmaXgpOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JaWYgKG5hbWVfZm9ybWF0ID09IE5VTEwpIHsKKwlpZiAobmFtZSA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfZnJlZV9mdWxsX3Bvc3RmaXg7CiAJfQotCWRldl9hdHRyLT5hdHRyLm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwKLQkJCQkJbmFtZV9mb3JtYXQsCi0JCQkJCWNoYW4tPmNoYW5uZWwsCi0JCQkJCWNoYW4tPmNoYW5uZWwyKTsKLQlpZiAoZGV2X2F0dHItPmF0dHIubmFtZSA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfZnJlZV9uYW1lX2Zvcm1hdDsKLQl9CisJZGV2X2F0dHItPmF0dHIubmFtZSA9IG5hbWU7CiAKIAlpZiAocmVhZGZ1bmMpIHsKIAkJZGV2X2F0dHItPmF0dHIubW9kZSB8PSBTX0lSVUdPOwpAQCAtNjYxLDggKzY0OSw3IEBACiAJCWRldl9hdHRyLT5hdHRyLm1vZGUgfD0gU19JV1VTUjsKIAkJZGV2X2F0dHItPnN0b3JlID0gd3JpdGVmdW5jOwogCX0KLWVycm9yX2ZyZWVfbmFtZV9mb3JtYXQ6Ci0Ja2ZyZWUobmFtZV9mb3JtYXQpOworCiBlcnJvcl9mcmVlX2Z1bGxfcG9zdGZpeDoKIAlrZnJlZShmdWxsX3Bvc3RmaXgpOwogCkBAIC02OTIsMTAgKzY3OSw4IEBACiAJc3RydWN0IGlpb19kZXZfYXR0ciAqaWlvX2F0dHIsICp0OwogCiAJaWlvX2F0dHIgPSBremFsbG9jKHNpemVvZigqaWlvX2F0dHIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoaWlvX2F0dHIgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX3JldDsKLQl9CisJaWYgKGlpb19hdHRyID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOwogCXJldCA9IF9faWlvX2RldmljZV9hdHRyX2luaXQoJmlpb19hdHRyLT5kZXZfYXR0ciwKIAkJCQkgICAgIHBvc3RmaXgsIGNoYW4sCiAJCQkJICAgICByZWFkZnVuYywgd3JpdGVmdW5jLCBzaGFyZWRfYnkpOwpAQCAtNzIwLDcgKzcwNSw2IEBACiAJX19paW9fZGV2aWNlX2F0dHJfZGVpbml0KCZpaW9fYXR0ci0+ZGV2X2F0dHIpOwogZXJyb3JfaWlvX2Rldl9hdHRyX2ZyZWU6CiAJa2ZyZWUoaWlvX2F0dHIpOwotZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTExMzQsNyArMTExOCw3IEBACiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGluZGlvX2Rldi0+ZGV2LnBhcmVudCwKIAkJCSJGYWlsZWQgdG8gcmVnaXN0ZXIgZGVidWdmcyBpbnRlcmZhY2VzXG4iKTsKLQkJZ290byBlcnJvcl9yZXQ7CisJCXJldHVybiByZXQ7CiAJfQogCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXJfc3lzZnMoaW5kaW9fZGV2KTsKIAlpZiAocmV0KSB7CkBAIC0xMTc1LDcgKzExNTksNiBAQAogCWlpb19kZXZpY2VfdW5yZWdpc3Rlcl9zeXNmcyhpbmRpb19kZXYpOwogZXJyb3JfdW5yZWdfZGVidWdmczoKIAlpaW9fZGV2aWNlX3VucmVnaXN0ZXJfZGVidWdmcyhpbmRpb19kZXYpOwotZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGlpb19kZXZpY2VfcmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWV2ZW50LmMgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tZXZlbnQuYwppbmRleCBjOWMxNDE5Li5lYTZlMDZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tZXZlbnQuYworKysgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tZXZlbnQuYwpAQCAtNDAsNiArNDAsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJZGV2X2F0dHJfbGlzdDsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwCWdyb3VwOworCXN0cnVjdCBtdXRleAkJcmVhZF9sb2NrOwogfTsKIAogLyoqCkBAIC00NywxNiArNDgsMTcgQEAKICAqIEBpbmRpb19kZXY6CQlJSU8gZGV2aWNlIHN0cnVjdHVyZQogICogQGV2X2NvZGU6CQlXaGF0IGV2ZW50CiAgKiBAdGltZXN0YW1wOgkJV2hlbiB0aGUgZXZlbnQgb2NjdXJyZWQKKyAqCisgKiBOb3RlOiBUaGUgY2FsbGVyIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBub3QgcnVubmluZworICogY29uY3VycmVudGx5IGZvciB0aGUgc2FtZSBpbmRpb19kZXYgbW9yZSB0aGFuIG9uY2UuCiAgKiovCiBpbnQgaWlvX3B1c2hfZXZlbnQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdTY0IGV2X2NvZGUsIHM2NCB0aW1lc3RhbXApCiB7CiAJc3RydWN0IGlpb19ldmVudF9pbnRlcmZhY2UgKmV2X2ludCA9IGluZGlvX2Rldi0+ZXZlbnRfaW50ZXJmYWNlOwogCXN0cnVjdCBpaW9fZXZlbnRfZGF0YSBldjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBjb3BpZWQ7CiAKIAkvKiBEb2VzIGFueW9uZSBjYXJlPyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZldl9pbnQtPndhaXQubG9jaywgZmxhZ3MpOwogCWlmICh0ZXN0X2JpdChJSU9fQlVTWV9CSVRfUE9TLCAmZXZfaW50LT5mbGFncykpIHsKIAogCQlldi5pZCA9IGV2X2NvZGU7CkBAIC02NCw5ICs2Niw4IEBACiAKIAkJY29waWVkID0ga2ZpZm9fcHV0KCZldl9pbnQtPmRldF9ldmVudHMsIGV2KTsKIAkJaWYgKGNvcGllZCAhPSAwKQotCQkJd2FrZV91cF9sb2NrZWRfcG9sbCgmZXZfaW50LT53YWl0LCBQT0xMSU4pOworCQkJd2FrZV91cF9wb2xsKCZldl9pbnQtPndhaXQsIFBPTExJTik7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2X2ludC0+d2FpdC5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg3LDEwICs4OCw4IEBACiAKIAlwb2xsX3dhaXQoZmlsZXAsICZldl9pbnQtPndhaXQsIHdhaXQpOwogCi0Jc3Bpbl9sb2NrX2lycSgmZXZfaW50LT53YWl0LmxvY2spOwogCWlmICgha2ZpZm9faXNfZW1wdHkoJmV2X2ludC0+ZGV0X2V2ZW50cykpCiAJCWV2ZW50cyA9IFBPTExJTiB8IFBPTExSRE5PUk07Ci0Jc3Bpbl91bmxvY2tfaXJxKCZldl9pbnQtPndhaXQubG9jayk7CiAKIAlyZXR1cm4gZXZlbnRzOwogfQpAQCAtMTExLDMxICsxMTAsNDAgQEAKIAlpZiAoY291bnQgPCBzaXplb2Yoc3RydWN0IGlpb19ldmVudF9kYXRhKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcGluX2xvY2tfaXJxKCZldl9pbnQtPndhaXQubG9jayk7Ci0JaWYgKGtmaWZvX2lzX2VtcHR5KCZldl9pbnQtPmRldF9ldmVudHMpKSB7Ci0JCWlmIChmaWxlcC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJCXJldCA9IC1FQUdBSU47Ci0JCQlnb3RvIGVycm9yX3VubG9jazsKLQkJfQotCQkvKiBCbG9ja2luZyBvbiBkZXZpY2U7IHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBiZSB0aGVyZSAqLwotCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfbG9ja2VkX2lycShldl9pbnQtPndhaXQsCisJZG8geworCQlpZiAoa2ZpZm9faXNfZW1wdHkoJmV2X2ludC0+ZGV0X2V2ZW50cykpIHsKKwkJCWlmIChmaWxlcC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkJcmV0dXJuIC1FQUdBSU47CisKKwkJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShldl9pbnQtPndhaXQsCiAJCQkJCSFrZmlmb19pc19lbXB0eSgmZXZfaW50LT5kZXRfZXZlbnRzKSB8fAogCQkJCQlpbmRpb19kZXYtPmluZm8gPT0gTlVMTCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycm9yX3VubG9jazsKLQkJaWYgKGluZGlvX2Rldi0+aW5mbyA9PSBOVUxMKSB7Ci0JCQlyZXQgPSAtRU5PREVWOwotCQkJZ290byBlcnJvcl91bmxvY2s7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAoaW5kaW9fZGV2LT5pbmZvID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KLQkJLyogU2luZ2xlIGFjY2VzcyBkZXZpY2Ugc28gbm8gb25lIGVsc2UgY2FuIGdldCB0aGUgZGF0YSAqLwotCX0KIAotCXJldCA9IGtmaWZvX3RvX3VzZXIoJmV2X2ludC0+ZGV0X2V2ZW50cywgYnVmLCBjb3VudCwgJmNvcGllZCk7CisJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmV2X2ludC0+cmVhZF9sb2NrKSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCXJldCA9IGtmaWZvX3RvX3VzZXIoJmV2X2ludC0+ZGV0X2V2ZW50cywgYnVmLCBjb3VudCwgJmNvcGllZCk7CisJCW11dGV4X3VubG9jaygmZXZfaW50LT5yZWFkX2xvY2spOwogCi1lcnJvcl91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxKCZldl9pbnQtPndhaXQubG9jayk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCi0JcmV0dXJuIHJldCA/IHJldCA6IGNvcGllZDsKKwkJLyoKKwkJICogSWYgd2UgY291bGRuJ3QgcmVhZCBhbnl0aGluZyBmcm9tIHRoZSBmaWZvIChhIGRpZmZlcmVudAorCQkgKiB0aHJlYWQgbWlnaHQgaGF2ZSBiZWVuIGZhc3Rlcikgd2UgZWl0aGVyIHJldHVybiAtRUFHQUlOIGlmCisJCSAqIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgbm9uLWJsb2NraW5nLCBvdGhlcndpc2Ugd2UgZ28gYmFjayB0bworCQkgKiBzbGVlcCBhbmQgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS4KKwkJICovCisJCWlmIChjb3BpZWQgPT0gMCAmJiAoZmlsZXAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKKwkJCXJldHVybiAtRUFHQUlOOworCisJfSB3aGlsZSAoY29waWVkID09IDApOworCisJcmV0dXJuIGNvcGllZDsKIH0KIAogc3RhdGljIGludCBpaW9fZXZlbnRfY2hyZGV2X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwKQpAQCAtMTQzLDE1ICsxNTEsNyBAQAogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBmaWxlcC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBpaW9fZXZlbnRfaW50ZXJmYWNlICpldl9pbnQgPSBpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZTsKIAotCXNwaW5fbG9ja19pcnEoJmV2X2ludC0+d2FpdC5sb2NrKTsKLQlfX2NsZWFyX2JpdChJSU9fQlVTWV9CSVRfUE9TLCAmZXZfaW50LT5mbGFncyk7Ci0JLyoKLQkgKiBJbiBvcmRlciB0byBtYWludGFpbiBhIGNsZWFuIHN0YXRlIGZvciByZW9wZW5pbmcsCi0JICogY2xlYXIgb3V0IGFueSBhd2FpdGluZyBldmVudHMuIFRoZSBtYXNrIHdpbGwgcHJldmVudAotCSAqIGFueSBuZXcgX19paW9fcHVzaF9ldmVudCBjYWxscyBydW5uaW5nLgotCSAqLwotCWtmaWZvX3Jlc2V0X291dCgmZXZfaW50LT5kZXRfZXZlbnRzKTsKLQlzcGluX3VubG9ja19pcnEoJmV2X2ludC0+d2FpdC5sb2NrKTsKKwljbGVhcl9iaXQoSUlPX0JVU1lfQklUX1BPUywgJmV2X2ludC0+ZmxhZ3MpOwogCiAJaWlvX2RldmljZV9wdXQoaW5kaW9fZGV2KTsKIApAQCAtMTc0LDIyICsxNzQsMjAgQEAKIAlpZiAoZXZfaW50ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jc3Bpbl9sb2NrX2lycSgmZXZfaW50LT53YWl0LmxvY2spOwotCWlmIChfX3Rlc3RfYW5kX3NldF9iaXQoSUlPX0JVU1lfQklUX1BPUywgJmV2X2ludC0+ZmxhZ3MpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycSgmZXZfaW50LT53YWl0LmxvY2spOworCWlmICh0ZXN0X2FuZF9zZXRfYml0KElJT19CVVNZX0JJVF9QT1MsICZldl9pbnQtPmZsYWdzKSkKIAkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZldl9pbnQtPndhaXQubG9jayk7CisKIAlpaW9fZGV2aWNlX2dldChpbmRpb19kZXYpOwogCiAJZmQgPSBhbm9uX2lub2RlX2dldGZkKCJpaW86ZXZlbnQiLCAmaWlvX2V2ZW50X2NocmRldl9maWxlb3BzLAogCQkJCWluZGlvX2RldiwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwogCWlmIChmZCA8IDApIHsKLQkJc3Bpbl9sb2NrX2lycSgmZXZfaW50LT53YWl0LmxvY2spOwotCQlfX2NsZWFyX2JpdChJSU9fQlVTWV9CSVRfUE9TLCAmZXZfaW50LT5mbGFncyk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmZXZfaW50LT53YWl0LmxvY2spOworCQljbGVhcl9iaXQoSUlPX0JVU1lfQklUX1BPUywgJmV2X2ludC0+ZmxhZ3MpOwogCQlpaW9fZGV2aWNlX3B1dChpbmRpb19kZXYpOworCX0gZWxzZSB7CisJCWtmaWZvX3Jlc2V0X291dCgmZXZfaW50LT5kZXRfZXZlbnRzKTsKIAl9CisKIAlyZXR1cm4gZmQ7CiB9CiAKQEAgLTM2NiwzMiArMzY0LDMxIEBACiAJCXJldCA9IGlpb19kZXZpY2VfYWRkX2V2ZW50KGluZGlvX2RldiwgY2hhbiwgaSwgdHlwZSwgZGlyLAogCQkJSUlPX1NFUEFSQVRFLCAmY2hhbi0+ZXZlbnRfc3BlY1tpXS5tYXNrX3NlcGFyYXRlKTsKIAkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGVycm9yX3JldDsKKwkJCXJldHVybiByZXQ7CiAJCWF0dHJjb3VudCArPSByZXQ7CiAKIAkJcmV0ID0gaWlvX2RldmljZV9hZGRfZXZlbnQoaW5kaW9fZGV2LCBjaGFuLCBpLCB0eXBlLCBkaXIsCiAJCQlJSU9fU0hBUkVEX0JZX1RZUEUsCiAJCQkmY2hhbi0+ZXZlbnRfc3BlY1tpXS5tYXNrX3NoYXJlZF9ieV90eXBlKTsKIAkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGVycm9yX3JldDsKKwkJCXJldHVybiByZXQ7CiAJCWF0dHJjb3VudCArPSByZXQ7CiAKIAkJcmV0ID0gaWlvX2RldmljZV9hZGRfZXZlbnQoaW5kaW9fZGV2LCBjaGFuLCBpLCB0eXBlLCBkaXIsCiAJCQlJSU9fU0hBUkVEX0JZX0RJUiwKIAkJCSZjaGFuLT5ldmVudF9zcGVjW2ldLm1hc2tfc2hhcmVkX2J5X2Rpcik7CiAJCWlmIChyZXQgPCAwKQotCQkJZ290byBlcnJvcl9yZXQ7CisJCQlyZXR1cm4gcmV0OwogCQlhdHRyY291bnQgKz0gcmV0OwogCiAJCXJldCA9IGlpb19kZXZpY2VfYWRkX2V2ZW50KGluZGlvX2RldiwgY2hhbiwgaSwgdHlwZSwgZGlyLAogCQkJSUlPX1NIQVJFRF9CWV9BTEwsCiAJCQkmY2hhbi0+ZXZlbnRfc3BlY1tpXS5tYXNrX3NoYXJlZF9ieV9hbGwpOwogCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXJyb3JfcmV0OworCQkJcmV0dXJuIHJldDsKIAkJYXR0cmNvdW50ICs9IHJldDsKIAl9CiAJcmV0ID0gYXR0cmNvdW50OwotZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQyNSw2ICs0MjIsNyBAQAogewogCUlOSVRfS0ZJRk8oZXZfaW50LT5kZXRfZXZlbnRzKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZldl9pbnQtPndhaXQpOworCW11dGV4X2luaXQoJmV2X2ludC0+cmVhZF9sb2NrKTsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKmlpb19ldmVudF9ncm91cF9uYW1lID0gImV2ZW50cyI7CkBAIC00NDAsMTAgKzQzOCw4IEBACiAKIAlpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZSA9CiAJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpaW9fZXZlbnRfaW50ZXJmYWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGluZGlvX2Rldi0+ZXZlbnRfaW50ZXJmYWNlID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9yZXQ7Ci0JfQorCWlmIChpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCUlOSVRfTElTVF9IRUFEKCZpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZS0+ZGV2X2F0dHJfbGlzdCk7CiAKQEAgLTQ4OSw4ICs0ODUsNiBAQAogZXJyb3JfZnJlZV9zZXR1cF9ldmVudF9saW5lczoKIAlpaW9fZnJlZV9jaGFuX2RldmF0dHJfbGlzdCgmaW5kaW9fZGV2LT5ldmVudF9pbnRlcmZhY2UtPmRldl9hdHRyX2xpc3QpOwogCWtmcmVlKGluZGlvX2Rldi0+ZXZlbnRfaW50ZXJmYWNlKTsKLWVycm9yX3JldDoKLQogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby10cmlnZ2VyLmMgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tdHJpZ2dlci5jCmluZGV4IDc2NmZhYjIuLjMzODNiMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby10cmlnZ2VyLmMKKysrIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLXRyaWdnZXIuYwpAQCAtNjIsMTAgKzYyLDkgQEAKIAlpbnQgcmV0OwogCiAJdHJpZ19pbmZvLT5pZCA9IGlkYV9zaW1wbGVfZ2V0KCZpaW9fdHJpZ2dlcl9pZGEsIDAsIDAsIEdGUF9LRVJORUwpOwotCWlmICh0cmlnX2luZm8tPmlkIDwgMCkgewotCQlyZXQgPSB0cmlnX2luZm8tPmlkOwotCQlnb3RvIGVycm9yX3JldDsKLQl9CisJaWYgKHRyaWdfaW5mby0+aWQgPCAwKQorCQlyZXR1cm4gdHJpZ19pbmZvLT5pZDsKKwogCS8qIFNldCB0aGUgbmFtZSB1c2VkIGZvciB0aGUgc3lzZnMgZGlyZWN0b3J5IGV0YyAqLwogCWRldl9zZXRfbmFtZSgmdHJpZ19pbmZvLT5kZXYsICJ0cmlnZ2VyJWxkIiwKIAkJICAgICAodW5zaWduZWQgbG9uZykgdHJpZ19pbmZvLT5pZCk7CkBAIC04Myw3ICs4Miw2IEBACiAKIGVycm9yX3VucmVnaXN0ZXJfaWQ6CiAJaWRhX3NpbXBsZV9yZW1vdmUoJmlpb190cmlnZ2VyX2lkYSwgdHJpZ19pbmZvLT5pZCk7Ci1lcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woaWlvX3RyaWdnZXJfcmVnaXN0ZXIpOwpAQCAtMjM0LDEzICsyMzIsMTIgQEAKIAlpZiAodHJpZy0+b3BzICYmIHRyaWctPm9wcy0+c2V0X3RyaWdnZXJfc3RhdGUgJiYgbm9fb3RoZXJfdXNlcnMpIHsKIAkJcmV0ID0gdHJpZy0+b3BzLT5zZXRfdHJpZ2dlcl9zdGF0ZSh0cmlnLCBmYWxzZSk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIGVycm9yX3JldDsKKwkJCXJldHVybiByZXQ7CiAJfQogCWlpb190cmlnZ2VyX3B1dF9pcnEodHJpZywgcGYtPmlycSk7CiAJZnJlZV9pcnEocGYtPmlycSwgcGYpOwogCW1vZHVsZV9wdXQocGYtPmluZGlvX2Rldi0+aW5mby0+ZHJpdmVyX21vZHVsZSk7CiAKLWVycm9yX3JldDoKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9saWdodC9LY29uZmlnIGIvZHJpdmVycy9paW8vbGlnaHQvS2NvbmZpZwppbmRleCBkMTJiMmEwLi5jODk3NDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9saWdodC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L0tjb25maWcKQEAgLTczLDYgKzczLDIwIEBACiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIEhJRCBTRU5TT1IKIAkgIEFtYmllbnQgbGlnaHQgc2Vuc29yLgogCitjb25maWcgSElEX1NFTlNPUl9QUk9YCisJZGVwZW5kcyBvbiBISURfU0VOU09SX0hVQgorCXNlbGVjdCBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSRURfQlVGRkVSCisJc2VsZWN0IEhJRF9TRU5TT1JfSUlPX0NPTU1PTgorCXNlbGVjdCBISURfU0VOU09SX0lJT19UUklHR0VSCisJdHJpc3RhdGUgIkhJRCBQUk9YIgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgSElEIFNFTlNPUgorCSAgUHJveGltaXR5IHNlbnNvci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaGlkLXNlbnNvci1wcm94LgorCiBjb25maWcgU0VOU09SU19MTTM1MzMKIAl0cmlzdGF0ZSAiTE0zNTMzIGFtYmllbnQgbGlnaHQgc2Vuc29yIgogCWRlcGVuZHMgb24gTUZEX0xNMzUzMwpAQCAtOTAsNiArMTA0LDE4IEBACiAJICBjaGFuZ2VzLiBUaGUgQUxTLWNvbnRyb2wgb3V0cHV0IHZhbHVlcyBjYW4gYmUgc2V0IHBlciB6b25lIGZvciB0aGUKIAkgIHRocmVlIGN1cnJlbnQgb3V0cHV0IGNoYW5uZWxzLgogCitjb25maWcgTFRSNTAxCisJdHJpc3RhdGUgIkxUUi01MDFBTFMtMDEgbGlnaHQgc2Vuc29yIgorCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVJFRF9CVUZGRVIKKwloZWxwCisJIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgTGl0ZS1PbiBMVFItNTAxQUxTLTAxCisJIGFtYmllbnQgbGlnaHQgYW5kIHByb3hpbWl0eSBzZW5zb3IuCisKKwkgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorICAgICAgICAgd2lsbCBiZSBjYWxsZWQgbHRyNTAxLgorCiBjb25maWcgVENTMzQ3MgogCXRyaXN0YXRlICJUQU9TIFRDUzM0NzIgY29sb3IgbGlnaHQtdG8tZGlnaXRhbCBjb252ZXJ0ZXIiCiAJZGVwZW5kcyBvbiBJMkMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2xpZ2h0L01ha2VmaWxlIGIvZHJpdmVycy9paW8vbGlnaHQvTWFrZWZpbGUKaW5kZXggNjBlMzVhYy4uM2ViMzZlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbGlnaHQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9paW8vbGlnaHQvTWFrZWZpbGUKQEAgLTksNyArOSw5IEBACiBvYmotJChDT05GSUdfQ00zNjY1MSkJCSs9IGNtMzY2NTEubwogb2JqLSQoQ09ORklHX0dQMkFQMDIwQTAwRikJKz0gZ3AyYXAwMjBhMDBmLm8KIG9iai0kKENPTkZJR19ISURfU0VOU09SX0FMUykJKz0gaGlkLXNlbnNvci1hbHMubworb2JqLSQoQ09ORklHX0hJRF9TRU5TT1JfUFJPWCkJKz0gaGlkLXNlbnNvci1wcm94Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xNMzUzMykJKz0gbG0zNTMzLWFscy5vCitvYmotJChDT05GSUdfTFRSNTAxKQkJKz0gbHRyNTAxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1RTTDI1NjMpCSs9IHRzbDI1NjMubwogb2JqLSQoQ09ORklHX1RDUzM0NzIpCQkrPSB0Y3MzNDcyLm8KIG9iai0kKENPTkZJR19UU0w0NTMxKQkJKz0gdHNsNDUzMS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9saWdodC9hZGpkX3MzMTEuYyBiL2RyaXZlcnMvaWlvL2xpZ2h0L2FkamRfczMxMS5jCmluZGV4IGYzMDY4NDcuLjA5YWQ1ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2xpZ2h0L2FkamRfczMxMS5jCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L2FkamRfczMxMS5jCkBAIC0xNCw3ICsxNCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xMjAsNyArMTE5LDYgQEAKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPmluZGlvX2RldjsKIAlzdHJ1Y3QgYWRqZF9zMzExX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCXM2NCB0aW1lX25zID0gaWlvX2dldF90aW1lX25zKCk7Ci0JaW50IGxlbiA9IDA7CiAJaW50IGksIGogPSAwOwogCiAJaW50IHJldCA9IGFkamRfczMxMV9yZXFfZGF0YShpbmRpb19kZXYpOwpAQCAtMTM1LDcgKzEzMyw2IEBACiAJCQlnb3RvIGRvbmU7CiAKIAkJZGF0YS0+YnVmZmVyW2orK10gPSByZXQgJiBBREpEX1MzMTFfREFUQV9NQVNLOwotCQlsZW4gKz0gMjsKIAl9CiAKIAlpaW9fcHVzaF90b19idWZmZXJzX3dpdGhfdGltZXN0YW1wKGluZGlvX2RldiwgZGF0YS0+YnVmZmVyLCB0aW1lX25zKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2xpZ2h0L2hpZC1zZW5zb3ItcHJveC5jIGIvZHJpdmVycy9paW8vbGlnaHQvaGlkLXNlbnNvci1wcm94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5NGFiMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L2hpZC1zZW5zb3ItcHJveC5jCkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogSElEIFNlbnNvcnMgRHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC1zZW5zb3ItaHViLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcl9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmg+CisjaW5jbHVkZSAiLi4vY29tbW9uL2hpZC1zZW5zb3JzL2hpZC1zZW5zb3ItdHJpZ2dlci5oIgorCisjZGVmaW5lIENIQU5ORUxfU0NBTl9JTkRFWF9QUkVTRU5DRSAwCisKK3N0cnVjdCBwcm94X3N0YXRlIHsKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9odWJfY2FsbGJhY2tzIGNhbGxiYWNrczsKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9jb21tb24gY29tbW9uX2F0dHJpYnV0ZXM7CisJc3RydWN0IGhpZF9zZW5zb3JfaHViX2F0dHJpYnV0ZV9pbmZvIHByb3hfYXR0cjsKKwl1MzIgaHVtYW5fcHJlc2VuY2U7Cit9OworCisvKiBDaGFubmVsIGRlZmluaXRpb25zICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgcHJveF9jaGFubmVsc1tdID0geworCXsKKwkJLnR5cGUgPSBJSU9fUFJPWElNSVRZLAorCQkubW9kaWZpZWQgPSAxLAorCQkuY2hhbm5lbDIgPSBJSU9fTk9fTU9ELAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwKKwkJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCkgfAorCQlCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSkgfAorCQlCSVQoSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVEpIHwKKwkJQklUKElJT19DSEFOX0lORk9fSFlTVEVSRVNJUyksCisJCS5zY2FuX2luZGV4ID0gQ0hBTk5FTF9TQ0FOX0lOREVYX1BSRVNFTkNFLAorCX0KK307CisKKy8qIEFkanVzdCBjaGFubmVsIHJlYWwgYml0cyBiYXNlZCBvbiByZXBvcnQgZGVzY3JpcHRvciAqLworc3RhdGljIHZvaWQgcHJveF9hZGp1c3RfY2hhbm5lbF9iaXRfbWFzayhzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbm5lbHMsCisJCQkJCWludCBjaGFubmVsLCBpbnQgc2l6ZSkKK3sKKwljaGFubmVsc1tjaGFubmVsXS5zY2FuX3R5cGUuc2lnbiA9ICdzJzsKKwkvKiBSZWFsIHN0b3JhZ2UgYml0cyB3aWxsIGNoYW5nZSBiYXNlZCBvbiB0aGUgcmVwb3J0IGRlc2MuICovCisJY2hhbm5lbHNbY2hhbm5lbF0uc2Nhbl90eXBlLnJlYWxiaXRzID0gc2l6ZSAqIDg7CisJLyogTWF4aW11bSBzaXplIG9mIGEgc2FtcGxlIHRvIGNhcHR1cmUgaXMgdTMyICovCisJY2hhbm5lbHNbY2hhbm5lbF0uc2Nhbl90eXBlLnN0b3JhZ2ViaXRzID0gc2l6ZW9mKHUzMikgKiA4OworfQorCisvKiBDaGFubmVsIHJlYWRfcmF3IGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgcHJveF9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgICBpbnQgKnZhbCwgaW50ICp2YWwyLAorCQkJICAgICAgbG9uZyBtYXNrKQoreworCXN0cnVjdCBwcm94X3N0YXRlICpwcm94X3N0YXRlID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmVwb3J0X2lkID0gLTE7CisJdTMyIGFkZHJlc3M7CisJaW50IHJldDsKKwlpbnQgcmV0X3R5cGU7CisKKwkqdmFsID0gMDsKKwkqdmFsMiA9IDA7CisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJc3dpdGNoIChjaGFuLT5zY2FuX2luZGV4KSB7CisJCWNhc2UgIENIQU5ORUxfU0NBTl9JTkRFWF9QUkVTRU5DRToKKwkJCXJlcG9ydF9pZCA9IHByb3hfc3RhdGUtPnByb3hfYXR0ci5yZXBvcnRfaWQ7CisJCQlhZGRyZXNzID0KKwkJCUhJRF9VU0FHRV9TRU5TT1JfSFVNQU5fUFJFU0VOQ0U7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlcG9ydF9pZCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJlcG9ydF9pZCA+PSAwKQorCQkJKnZhbCA9IHNlbnNvcl9odWJfaW5wdXRfYXR0cl9nZXRfcmF3X3ZhbHVlKAorCQkJCXByb3hfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLmhzZGV2LAorCQkJCUhJRF9VU0FHRV9TRU5TT1JfUFJPWCwgYWRkcmVzcywKKwkJCQlyZXBvcnRfaWQpOworCQllbHNlIHsKKwkJCSp2YWwgPSAwOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmV0X3R5cGUgPSBJSU9fVkFMX0lOVDsKKwkJYnJlYWs7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgorCQkqdmFsID0gcHJveF9zdGF0ZS0+cHJveF9hdHRyLnVuaXRzOworCQlyZXRfdHlwZSA9IElJT19WQUxfSU5UOworCQlicmVhazsKKwljYXNlIElJT19DSEFOX0lORk9fT0ZGU0VUOgorCQkqdmFsID0gaGlkX3NlbnNvcl9jb252ZXJ0X2V4cG9uZW50KAorCQkJCXByb3hfc3RhdGUtPnByb3hfYXR0ci51bml0X2V4cG8pOworCQlyZXRfdHlwZSA9IElJT19WQUxfSU5UOworCQlicmVhazsKKwljYXNlIElJT19DSEFOX0lORk9fU0FNUF9GUkVROgorCQlyZXQgPSBoaWRfc2Vuc29yX3JlYWRfc2FtcF9mcmVxX3ZhbHVlKAorCQkJCSZwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcywgdmFsLCB2YWwyKTsKKwkJcmV0X3R5cGUgPSBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQlicmVhazsKKwljYXNlIElJT19DSEFOX0lORk9fSFlTVEVSRVNJUzoKKwkJcmV0ID0gaGlkX3NlbnNvcl9yZWFkX3Jhd19oeXN0X3ZhbHVlKAorCQkJCSZwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcywgdmFsLCB2YWwyKTsKKwkJcmV0X3R5cGUgPSBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXRfdHlwZSA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXRfdHlwZTsKK30KKworLyogQ2hhbm5lbCB3cml0ZV9yYXcgaGFuZGxlciAqLworc3RhdGljIGludCBwcm94X3dyaXRlX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgICAgIGludCB2YWwsCisJCQkgICAgICAgaW50IHZhbDIsCisJCQkgICAgICAgbG9uZyBtYXNrKQoreworCXN0cnVjdCBwcm94X3N0YXRlICpwcm94X3N0YXRlID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVE6CisJCXJldCA9IGhpZF9zZW5zb3Jfd3JpdGVfc2FtcF9mcmVxX3ZhbHVlKAorCQkJCSZwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcywgdmFsLCB2YWwyKTsKKwkJYnJlYWs7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX0hZU1RFUkVTSVM6CisJCXJldCA9IGhpZF9zZW5zb3Jfd3JpdGVfcmF3X2h5c3RfdmFsdWUoCisJCQkJJnByb3hfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLCB2YWwsIHZhbDIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gcHJveF9pbmZvID0geworCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCisJLnJlYWRfcmF3ID0gJnByb3hfcmVhZF9yYXcsCisJLndyaXRlX3JhdyA9ICZwcm94X3dyaXRlX3JhdywKK307CisKKy8qIEZ1bmN0aW9uIHRvIHB1c2ggZGF0YSB0byBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIGhpZF9zZW5zb3JfcHVzaF9kYXRhKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCWludCBsZW4pCit7CisJZGV2X2RiZygmaW5kaW9fZGV2LT5kZXYsICJoaWRfc2Vuc29yX3B1c2hfZGF0YVxuIik7CisJaWlvX3B1c2hfdG9fYnVmZmVycyhpbmRpb19kZXYsIGRhdGEpOworfQorCisvKiBDYWxsYmFjayBoYW5kbGVyIHRvIHNlbmQgZXZlbnQgYWZ0ZXIgYWxsIHNhbXBsZXMgYXJlIHJlY2VpdmVkIGFuZCBjYXB0dXJlZCAqLworc3RhdGljIGludCBwcm94X3Byb2NfZXZlbnQoc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYsCisJCQkJdW5zaWduZWQgdXNhZ2VfaWQsCisJCQkJdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocHJpdik7CisJc3RydWN0IHByb3hfc3RhdGUgKnByb3hfc3RhdGUgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJZGV2X2RiZygmaW5kaW9fZGV2LT5kZXYsICJwcm94X3Byb2NfZXZlbnQgWyVkXVxuIiwKKwkJCQlwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5kYXRhX3JlYWR5KTsKKwlpZiAocHJveF9zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMuZGF0YV9yZWFkeSkKKwkJaGlkX3NlbnNvcl9wdXNoX2RhdGEoaW5kaW9fZGV2LAorCQkJCSZwcm94X3N0YXRlLT5odW1hbl9wcmVzZW5jZSwKKwkJCQlzaXplb2YocHJveF9zdGF0ZS0+aHVtYW5fcHJlc2VuY2UpKTsKKworCXJldHVybiAwOworfQorCisvKiBDYXB0dXJlIHNhbXBsZXMgaW4gbG9jYWwgc3RvcmFnZSAqLworc3RhdGljIGludCBwcm94X2NhcHR1cmVfc2FtcGxlKHN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9kZXZpY2UgKmhzZGV2LAorCQkJCXVuc2lnbmVkIHVzYWdlX2lkLAorCQkJCXNpemVfdCByYXdfbGVuLCBjaGFyICpyYXdfZGF0YSwKKwkJCQl2b2lkICpwcml2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwcml2KTsKKwlzdHJ1Y3QgcHJveF9zdGF0ZSAqcHJveF9zdGF0ZSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlzd2l0Y2ggKHVzYWdlX2lkKSB7CisJY2FzZSBISURfVVNBR0VfU0VOU09SX0hVTUFOX1BSRVNFTkNFOgorCQlwcm94X3N0YXRlLT5odW1hbl9wcmVzZW5jZSA9ICoodTMyICopcmF3X2RhdGE7CisJCXJldCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIFBhcnNlIHJlcG9ydCB3aGljaCBpcyBzcGVjaWZpYyB0byBhbiB1c2FnZSBpZCovCitzdGF0aWMgaW50IHByb3hfcGFyc2VfcmVwb3J0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYsCisJCQkJc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzLAorCQkJCXVuc2lnbmVkIHVzYWdlX2lkLAorCQkJCXN0cnVjdCBwcm94X3N0YXRlICpzdCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc2Vuc29yX2h1Yl9pbnB1dF9nZXRfYXR0cmlidXRlX2luZm8oaHNkZXYsIEhJRF9JTlBVVF9SRVBPUlQsCisJCQl1c2FnZV9pZCwKKwkJCUhJRF9VU0FHRV9TRU5TT1JfSFVNQU5fUFJFU0VOQ0UsCisJCQkmc3QtPnByb3hfYXR0cik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcHJveF9hZGp1c3RfY2hhbm5lbF9iaXRfbWFzayhjaGFubmVscywgQ0hBTk5FTF9TQ0FOX0lOREVYX1BSRVNFTkNFLAorCQkJCQlzdC0+cHJveF9hdHRyLnNpemUpOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAicHJveCAleDoleFxuIiwgc3QtPnByb3hfYXR0ci5pbmRleCwKKwkJCXN0LT5wcm94X2F0dHIucmVwb3J0X2lkKTsKKworCS8qIFNldCBTZW5zaXRpdml0eSBmaWVsZCBpZHMsIHdoZW4gdGhlcmUgaXMgbm8gaW5kaXZpZHVhbCBtb2RpZmllciAqLworCWlmIChzdC0+Y29tbW9uX2F0dHJpYnV0ZXMuc2Vuc2l0aXZpdHkuaW5kZXggPCAwKSB7CisJCXNlbnNvcl9odWJfaW5wdXRfZ2V0X2F0dHJpYnV0ZV9pbmZvKGhzZGV2LAorCQkJSElEX0ZFQVRVUkVfUkVQT1JULCB1c2FnZV9pZCwKKwkJCUhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQ0hBTkdFX1NFTlNJVElWSVRZX0FCUyB8CisJCQlISURfVVNBR0VfU0VOU09SX0RBVEFfUFJFU0VOQ0UsCisJCQkmc3QtPmNvbW1vbl9hdHRyaWJ1dGVzLnNlbnNpdGl2aXR5KTsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiU2Vuc2l0aXZpdHkgaW5kZXg6cmVwb3J0ICVkOiVkXG4iLAorCQkJc3QtPmNvbW1vbl9hdHRyaWJ1dGVzLnNlbnNpdGl2aXR5LmluZGV4LAorCQkJc3QtPmNvbW1vbl9hdHRyaWJ1dGVzLnNlbnNpdGl2aXR5LnJlcG9ydF9pZCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIHByb2Nlc3NpbmcgZm9yIHVzYWdlIGlkICovCitzdGF0aWMgaW50IGhpZF9wcm94X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldCA9IDA7CisJc3RhdGljIGNvbnN0IGNoYXIgKm5hbWUgPSAicHJveCI7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgcHJveF9zdGF0ZSAqcHJveF9zdGF0ZTsKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9odWJfZGV2aWNlICpoc2RldiA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFubmVsczsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmcGRldi0+ZGV2LAorCQkJCXNpemVvZihzdHJ1Y3QgcHJveF9zdGF0ZSkpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmRpb19kZXYpOworCisJcHJveF9zdGF0ZSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJcHJveF9zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMuaHNkZXYgPSBoc2RldjsKKwlwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5wZGV2ID0gcGRldjsKKworCXJldCA9IGhpZF9zZW5zb3JfcGFyc2VfY29tbW9uX2F0dHJpYnV0ZXMoaHNkZXYsIEhJRF9VU0FHRV9TRU5TT1JfUFJPWCwKKwkJCQkJJnByb3hfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBzZXR1cCBjb21tb24gYXR0cmlidXRlc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJY2hhbm5lbHMgPSBrbWVtZHVwKHByb3hfY2hhbm5lbHMsIHNpemVvZihwcm94X2NoYW5uZWxzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGFubmVscykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZHVwbGljYXRlIGNoYW5uZWxzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gcHJveF9wYXJzZV9yZXBvcnQocGRldiwgaHNkZXYsIGNoYW5uZWxzLAorCQkJCUhJRF9VU0FHRV9TRU5TT1JfUFJPWCwgcHJveF9zdGF0ZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gc2V0dXAgYXR0cmlidXRlc1xuIik7CisJCWdvdG8gZXJyb3JfZnJlZV9kZXZfbWVtOworCX0KKworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9CisJCQkJQVJSQVlfU0laRShwcm94X2NoYW5uZWxzKTsKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCWluZGlvX2Rldi0+aW5mbyA9ICZwcm94X2luZm87CisJaW5kaW9fZGV2LT5uYW1lID0gbmFtZTsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsICZpaW9fcG9sbGZ1bmNfc3RvcmVfdGltZSwKKwkJTlVMTCwgTlVMTCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0cmlnZ2VyIGJ1ZmZlclxuIik7CisJCWdvdG8gZXJyb3JfZnJlZV9kZXZfbWVtOworCX0KKwlwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5kYXRhX3JlYWR5ID0gZmFsc2U7CisJcmV0ID0gaGlkX3NlbnNvcl9zZXR1cF90cmlnZ2VyKGluZGlvX2RldiwgbmFtZSwKKwkJCQkmcHJveF9zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidHJpZ2dlciBzZXR1cCBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX3VucmVnX2J1ZmZlcl9mdW5jczsKKwl9CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJkZXZpY2UgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcl9yZW1vdmVfdHJpZ2dlcjsKKwl9CisKKwlwcm94X3N0YXRlLT5jYWxsYmFja3Muc2VuZF9ldmVudCA9IHByb3hfcHJvY19ldmVudDsKKwlwcm94X3N0YXRlLT5jYWxsYmFja3MuY2FwdHVyZV9zYW1wbGUgPSBwcm94X2NhcHR1cmVfc2FtcGxlOworCXByb3hfc3RhdGUtPmNhbGxiYWNrcy5wZGV2ID0gcGRldjsKKwlyZXQgPSBzZW5zb3JfaHViX3JlZ2lzdGVyX2NhbGxiYWNrKGhzZGV2LCBISURfVVNBR0VfU0VOU09SX1BST1gsCisJCQkJCSZwcm94X3N0YXRlLT5jYWxsYmFja3MpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbGxiYWNrIHJlZyBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX2lpb191bnJlZzsKKwl9CisKKwlyZXR1cm4gcmV0OworCitlcnJvcl9paW9fdW5yZWc6CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CitlcnJvcl9yZW1vdmVfdHJpZ2dlcjoKKwloaWRfc2Vuc29yX3JlbW92ZV90cmlnZ2VyKCZwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcyk7CitlcnJvcl91bnJlZ19idWZmZXJfZnVuY3M6CisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXZfbWVtOgorCWtmcmVlKGluZGlvX2Rldi0+Y2hhbm5lbHMpOworCXJldHVybiByZXQ7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGRlaW5pdGlhbGl6ZSB0aGUgcHJvY2Vzc2luZyBmb3IgdXNhZ2UgaWQgKi8KK3N0YXRpYyBpbnQgaGlkX3Byb3hfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHByb3hfc3RhdGUgKnByb3hfc3RhdGUgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJc2Vuc29yX2h1Yl9yZW1vdmVfY2FsbGJhY2soaHNkZXYsIEhJRF9VU0FHRV9TRU5TT1JfUFJPWCk7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaGlkX3NlbnNvcl9yZW1vdmVfdHJpZ2dlcigmcHJveF9zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMpOworCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKKwlrZnJlZShpbmRpb19kZXYtPmNoYW5uZWxzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBoaWRfcHJveF9pZHNbXSA9IHsKKwl7CisJCS8qIEZvcm1hdDogSElELVNFTlNPUi11c2FnZV9pZF9pbl9oZXhfbG93ZXJjYXNlICovCisJCS5uYW1lID0gIkhJRC1TRU5TT1ItMjAwMDExIiwKKwl9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIGhpZF9wcm94X2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGhpZF9wcm94X3BsYXRmb3JtX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSBoaWRfcHJveF9pZHMsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSBLQlVJTERfTU9ETkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gaGlkX3Byb3hfcHJvYmUsCisJLnJlbW92ZQkJPSBoaWRfcHJveF9yZW1vdmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihoaWRfcHJveF9wbGF0Zm9ybV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkhJRCBTZW5zb3IgUHJveGltaXR5Iik7CitNT0RVTEVfQVVUSE9SKCJBcmNoYW5hIFBhdG5pIDxhcmNoYW5hLnBhdG5pQGludGVsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2xpZ2h0L2x0cjUwMS5jIGIvZHJpdmVycy9paW8vbGlnaHQvbHRyNTAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJiNzA3MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L2x0cjUwMS5jCkBAIC0wLDAgKzEsNDQ1IEBACisvKgorICogbHRyNTAxLmMgLSBTdXBwb3J0IGZvciBMaXRlLU9uIExUUjUwMSBhbWJpZW50IGxpZ2h0IGFuZCBwcm94aW1pdHkgc2Vuc29yCisgKgorICogQ29weXJpZ2h0IDIwMTQgUGV0ZXIgTWVlcndhbGQgPHBtZWVyd0BwbWVlcncubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluCisgKiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogNy1iaXQgSTJDIHNsYXZlIGFkZHJlc3MgMHgyMworICoKKyAqIFRPRE86IGludGVycnVwdCwgdGhyZXNob2xkLCBtZWFzdXJlbWVudCByYXRlLCBJUiBMRUQgY2hhcmFjdGVyaXN0aWNzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJfY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vYnVmZmVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJlZF9idWZmZXIuaD4KKworI2RlZmluZSBMVFI1MDFfRFJWX05BTUUgImx0cjUwMSIKKworI2RlZmluZSBMVFI1MDFfQUxTX0NPTlRSIDB4ODAgLyogQUxTIG9wZXJhdGlvbiBtb2RlLCBTVyByZXNldCAqLworI2RlZmluZSBMVFI1MDFfUFNfQ09OVFIgMHg4MSAvKiBQUyBvcGVyYXRpb24gbW9kZSAqLworI2RlZmluZSBMVFI1MDFfUEFSVF9JRCAweDg2CisjZGVmaW5lIExUUjUwMV9NQU5VRkFDX0lEIDB4ODcKKyNkZWZpbmUgTFRSNTAxX0FMU19EQVRBMSAweDg4IC8qIDE2LWJpdCwgbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBMVFI1MDFfQUxTX0RBVEEwIDB4OGEgLyogMTYtYml0LCBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIExUUjUwMV9BTFNfUFNfU1RBVFVTIDB4OGMKKyNkZWZpbmUgTFRSNTAxX1BTX0RBVEEgMHg4ZCAvKiAxNi1iaXQsIGxpdHRsZSBlbmRpYW4gKi8KKworI2RlZmluZSBMVFI1MDFfQUxTX0NPTlRSX1NXX1JFU0VUIEJJVCgyKQorI2RlZmluZSBMVFI1MDFfQ09OVFJfUFNfR0FJTl9NQVNLIChCSVQoMykgfCBCSVQoMikpCisjZGVmaW5lIExUUjUwMV9DT05UUl9QU19HQUlOX1NISUZUIDIKKyNkZWZpbmUgTFRSNTAxX0NPTlRSX0FMU19HQUlOX01BU0sgQklUKDMpCisjZGVmaW5lIExUUjUwMV9DT05UUl9BQ1RJVkUgQklUKDEpCisKKyNkZWZpbmUgTFRSNTAxX1NUQVRVU19BTFNfUkRZIEJJVCgyKQorI2RlZmluZSBMVFI1MDFfU1RBVFVTX1BTX1JEWSBCSVQoMCkKKworI2RlZmluZSBMVFI1MDFfUFNfREFUQV9NQVNLIDB4N2ZmCisKK3N0cnVjdCBsdHI1MDFfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgbXV0ZXggbG9ja19hbHMsIGxvY2tfcHM7CisJdTggYWxzX2NvbnRyLCBwc19jb250cjsKK307CisKK3N0YXRpYyBpbnQgbHRyNTAxX2RyZHkoc3RydWN0IGx0cjUwMV9kYXRhICpkYXRhLCB1OCBkcmR5X21hc2spCit7CisJaW50IHRyaWVzID0gMTAwOworCWludCByZXQ7CisKKwl3aGlsZSAodHJpZXMtLSkgeworCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJTFRSNTAxX0FMU19QU19TVEFUVVMpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWlmICgocmV0ICYgZHJkeV9tYXNrKSA9PSBkcmR5X21hc2spCisJCQlyZXR1cm4gMDsKKwkJbXNsZWVwKDI1KTsKKwl9CisKKwlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwgImx0cjUwMV9kcmR5KCkgZmFpbGVkLCBkYXRhIG5vdCByZWFkeVxuIik7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgbHRyNTAxX3JlYWRfYWxzKHN0cnVjdCBsdHI1MDFfZGF0YSAqZGF0YSwgX19sZTE2IGJ1ZlsyXSkKK3sKKwlpbnQgcmV0ID0gbHRyNTAxX2RyZHkoZGF0YSwgTFRSNTAxX1NUQVRVU19BTFNfUkRZKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkvKiBhbHdheXMgcmVhZCBib3RoIEFMUyBjaGFubmVscyBpbiBnaXZlbiBvcmRlciAqLworCXJldHVybiBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShkYXRhLT5jbGllbnQsCisJCUxUUjUwMV9BTFNfREFUQTEsIDIgKiBzaXplb2YoX19sZTE2KSwgKHU4ICopIGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgbHRyNTAxX3JlYWRfcHMoc3RydWN0IGx0cjUwMV9kYXRhICpkYXRhKQoreworCWludCByZXQgPSBsdHI1MDFfZHJkeShkYXRhLCBMVFI1MDFfU1RBVFVTX1BTX1JEWSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShkYXRhLT5jbGllbnQsIExUUjUwMV9QU19EQVRBKTsKK30KKworI2RlZmluZSBMVFI1MDFfSU5URU5TSVRZX0NIQU5ORUwoX2lkeCwgX2FkZHIsIF9tb2QsIF9zaGFyZWQpIHsgXAorCS50eXBlID0gSUlPX0lOVEVOU0lUWSwgXAorCS5tb2RpZmllZCA9IDEsIFwKKwkuYWRkcmVzcyA9IChfYWRkciksIFwKKwkuY2hhbm5lbDIgPSAoX21vZCksIFwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwgXAorCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSAoX3NoYXJlZCksIFwKKwkuc2Nhbl9pbmRleCA9IChfaWR4KSwgXAorCS5zY2FuX3R5cGUgPSB7IFwKKwkJLnNpZ24gPSAndScsIFwKKwkJLnJlYWxiaXRzID0gMTYsIFwKKwkJLnN0b3JhZ2ViaXRzID0gMTYsIFwKKwkJLmVuZGlhbm5lc3MgPSBJSU9fQ1BVLCBcCisJfSBcCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBsdHI1MDFfY2hhbm5lbHNbXSA9IHsKKwlMVFI1MDFfSU5URU5TSVRZX0NIQU5ORUwoMCwgTFRSNTAxX0FMU19EQVRBMCwgSUlPX01PRF9MSUdIVF9CT1RILCAwKSwKKwlMVFI1MDFfSU5URU5TSVRZX0NIQU5ORUwoMSwgTFRSNTAxX0FMU19EQVRBMSwgSUlPX01PRF9MSUdIVF9JUiwKKwkJQklUKElJT19DSEFOX0lORk9fU0NBTEUpKSwKKwl7CisJCS50eXBlID0gSUlPX1BST1hJTUlUWSwKKwkJLmFkZHJlc3MgPSBMVFI1MDFfUFNfREFUQSwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfAorCQkJQklUKElJT19DSEFOX0lORk9fU0NBTEUpLAorCQkuc2Nhbl9pbmRleCA9IDIsCisJCS5zY2FuX3R5cGUgPSB7CisJCQkuc2lnbiA9ICd1JywKKwkJCS5yZWFsYml0cyA9IDExLAorCQkJLnN0b3JhZ2ViaXRzID0gMTYsCisJCQkuZW5kaWFubmVzcyA9IElJT19DUFUsCisJCX0sCisJfSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCgzKSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgbHRyNTAxX3BzX2dhaW5bNF1bMl0gPSB7CisJezEsIDB9LCB7MCwgMjUwMDAwfSwgezAsIDEyNTAwMH0sIHswLCA2MjUwMH0KK307CisKK3N0YXRpYyBpbnQgbHRyNTAxX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkJaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBsdHI1MDFfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJX19sZTE2IGJ1ZlsyXTsKKwlpbnQgcmV0LCBpOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fSU5URU5TSVRZOgorCQkJbXV0ZXhfbG9jaygmZGF0YS0+bG9ja19hbHMpOworCQkJcmV0ID0gbHRyNTAxX3JlYWRfYWxzKGRhdGEsIGJ1Zik7CisJCQltdXRleF91bmxvY2soJmRhdGEtPmxvY2tfYWxzKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQkqdmFsID0gbGUxNl90b19jcHUoY2hhbi0+YWRkcmVzcyA9PSBMVFI1MDFfQUxTX0RBVEExID8KKwkJCQlidWZbMF0gOiBidWZbMV0pOworCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQljYXNlIElJT19QUk9YSU1JVFk6CisJCQltdXRleF9sb2NrKCZkYXRhLT5sb2NrX3BzKTsKKwkJCXJldCA9IGx0cjUwMV9yZWFkX3BzKGRhdGEpOworCQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrX3BzKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQkqdmFsID0gcmV0ICYgTFRSNTAxX1BTX0RBVEFfTUFTSzsKKwkJCXJldHVybiBJSU9fVkFMX0lOVDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgorCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fSU5URU5TSVRZOgorCQkJaWYgKGRhdGEtPmFsc19jb250ciAmIExUUjUwMV9DT05UUl9BTFNfR0FJTl9NQVNLKSB7CisJCQkJKnZhbCA9IDA7CisJCQkJKnZhbDIgPSA1MDAwOworCQkJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQkJfSBlbHNlIHsKKwkJCQkqdmFsID0gMTsKKwkJCQkqdmFsMiA9IDA7CisJCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQkJfQorCQljYXNlIElJT19QUk9YSU1JVFk6CisJCQlpID0gKGRhdGEtPnBzX2NvbnRyICYgTFRSNTAxX0NPTlRSX1BTX0dBSU5fTUFTSykgPj4KKwkJCQlMVFI1MDFfQ09OVFJfUFNfR0FJTl9TSElGVDsKKwkJCSp2YWwgPSBsdHI1MDFfcHNfZ2FpbltpXVswXTsKKwkJCSp2YWwyID0gbHRyNTAxX3BzX2dhaW5baV1bMV07CisJCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGx0cjUwMV9nZXRfcHNfZ2Fpbl9pbmRleChpbnQgdmFsLCBpbnQgdmFsMikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGx0cjUwMV9wc19nYWluKTsgaSsrKQorCQlpZiAodmFsID09IGx0cjUwMV9wc19nYWluW2ldWzBdICYmIHZhbDIgPT0gbHRyNTAxX3BzX2dhaW5baV1bMV0pCisJCQlyZXR1cm4gaTsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBsdHI1MDFfd3JpdGVfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgICAgaW50IHZhbCwgaW50IHZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgbHRyNTAxX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCBpOworCisJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgorCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fSU5URU5TSVRZOgorCQkJaWYgKHZhbCA9PSAwICYmIHZhbDIgPT0gNTAwMCkKKwkJCQlkYXRhLT5hbHNfY29udHIgfD0gTFRSNTAxX0NPTlRSX0FMU19HQUlOX01BU0s7CisJCQllbHNlIGlmICh2YWwgPT0gMSAmJiB2YWwyID09IDApCisJCQkJZGF0YS0+YWxzX2NvbnRyICY9IH5MVFI1MDFfQ09OVFJfQUxTX0dBSU5fTUFTSzsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQlMVFI1MDFfQUxTX0NPTlRSLCBkYXRhLT5hbHNfY29udHIpOworCQljYXNlIElJT19QUk9YSU1JVFk6CisJCQlpID0gbHRyNTAxX2dldF9wc19nYWluX2luZGV4KHZhbCwgdmFsMik7CisJCQlpZiAoaSA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlkYXRhLT5wc19jb250ciAmPSB+TFRSNTAxX0NPTlRSX1BTX0dBSU5fTUFTSzsKKwkJCWRhdGEtPnBzX2NvbnRyIHw9IGkgPDwgTFRSNTAxX0NPTlRSX1BTX0dBSU5fU0hJRlQ7CisJCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCQkJTFRSNTAxX1BTX0NPTlRSLCBkYXRhLT5wc19jb250cik7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19DT05TVF9BVFRSKGluX3Byb3hpbWl0eV9zY2FsZV9hdmFpbGFibGUsICIxIDAuMjUgMC4xMjUgMC4wNjI1Iik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW5faW50ZW5zaXR5X3NjYWxlX2F2YWlsYWJsZSwgIjEgMC4wMDUiKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmx0cjUwMV9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19jb25zdF9hdHRyX2luX3Byb3hpbWl0eV9zY2FsZV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5faW50ZW5zaXR5X3NjYWxlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGx0cjUwMV9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gbHRyNTAxX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGx0cjUwMV9pbmZvID0geworCS5yZWFkX3JhdyA9IGx0cjUwMV9yZWFkX3JhdywKKwkud3JpdGVfcmF3ID0gbHRyNTAxX3dyaXRlX3JhdywKKwkuYXR0cnMgPSAmbHRyNTAxX2F0dHJpYnV0ZV9ncm91cCwKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBsdHI1MDFfd3JpdGVfY29udHIoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggYWxzX3ZhbCwgdTggcHNfdmFsKQoreworCWludCByZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTFRSNTAxX0FMU19DT05UUiwgYWxzX3ZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExUUjUwMV9QU19DT05UUiwgcHNfdmFsKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGx0cjUwMV90cmlnZ2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYgPSBwOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwZi0+aW5kaW9fZGV2OworCXN0cnVjdCBsdHI1MDFfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdTE2IGJ1Zls4XTsKKwlfX2xlMTYgYWxzX2J1ZlsyXTsKKwl1OCBtYXNrID0gMDsKKwlpbnQgaiA9IDA7CisJaW50IHJldDsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKworCS8qIGZpZ3VyZSBvdXQgd2hpY2ggZGF0YSBuZWVkcyB0byBiZSByZWFkeSAqLworCWlmICh0ZXN0X2JpdCgwLCBpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2spIHx8CisJCXRlc3RfYml0KDEsIGluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzaykpCisJCW1hc2sgfD0gTFRSNTAxX1NUQVRVU19BTFNfUkRZOworCWlmICh0ZXN0X2JpdCgyLCBpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2spKQorCQltYXNrIHw9IExUUjUwMV9TVEFUVVNfUFNfUkRZOworCisJcmV0ID0gbHRyNTAxX2RyZHkoZGF0YSwgbWFzayk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZG9uZTsKKworCWlmIChtYXNrICYgTFRSNTAxX1NUQVRVU19BTFNfUkRZKSB7CisJCXJldCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGRhdGEtPmNsaWVudCwKKwkJCUxUUjUwMV9BTFNfREFUQTEsIHNpemVvZihhbHNfYnVmKSwgKHU4ICopIGFsc19idWYpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWlmICh0ZXN0X2JpdCgwLCBpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2spKQorCQkJYnVmW2orK10gPSBsZTE2X3RvX2NwdShhbHNfYnVmWzFdKTsKKwkJaWYgKHRlc3RfYml0KDEsIGluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzaykpCisJCQlidWZbaisrXSA9IGxlMTZfdG9fY3B1KGFsc19idWZbMF0pOworCX0KKworCWlmIChtYXNrICYgTFRSNTAxX1NUQVRVU19QU19SRFkpIHsKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGRhdGEtPmNsaWVudCwgTFRSNTAxX1BTX0RBVEEpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZG9uZTsKKwkJYnVmW2orK10gPSByZXQgJiBMVFI1MDFfUFNfREFUQV9NQVNLOworCX0KKworCWlpb19wdXNoX3RvX2J1ZmZlcnNfd2l0aF90aW1lc3RhbXAoaW5kaW9fZGV2LCBidWYsCisJCWlpb19nZXRfdGltZV9ucygpKTsKKworZG9uZToKKwlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShpbmRpb19kZXYtPnRyaWcpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGx0cjUwMV9pbml0KHN0cnVjdCBsdHI1MDFfZGF0YSAqZGF0YSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgTFRSNTAxX0FMU19DT05UUik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJZGF0YS0+YWxzX2NvbnRyID0gcmV0IHwgTFRSNTAxX0NPTlRSX0FDVElWRTsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIExUUjUwMV9QU19DT05UUik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJZGF0YS0+cHNfY29udHIgPSByZXQgfCBMVFI1MDFfQ09OVFJfQUNUSVZFOworCisJcmV0dXJuIGx0cjUwMV93cml0ZV9jb250cihkYXRhLT5jbGllbnQsIGRhdGEtPmFsc19jb250ciwKKwkJZGF0YS0+cHNfY29udHIpOworfQorCitzdGF0aWMgaW50IGx0cjUwMV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGx0cjUwMV9kYXRhICpkYXRhOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJaW50IHJldDsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqZGF0YSkpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGluZGlvX2Rldik7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCW11dGV4X2luaXQoJmRhdGEtPmxvY2tfYWxzKTsKKwltdXRleF9pbml0KCZkYXRhLT5sb2NrX3BzKTsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIExUUjUwMV9QQVJUX0lEKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoKHJldCA+PiA0KSAhPSAweDgpCisJCXJldHVybiAtRU5PREVWOworCisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWluZGlvX2Rldi0+aW5mbyA9ICZsdHI1MDFfaW5mbzsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gbHRyNTAxX2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShsdHI1MDFfY2hhbm5lbHMpOworCWluZGlvX2Rldi0+bmFtZSA9IExUUjUwMV9EUlZfTkFNRTsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBsdHI1MDFfaW5pdChkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKGluZGlvX2RldiwgTlVMTCwKKwkJbHRyNTAxX3RyaWdnZXJfaGFuZGxlciwgTlVMTCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VucmVnX2J1ZmZlcjsKKworCXJldHVybiAwOworCitlcnJvcl91bnJlZ19idWZmZXI6CisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbHRyNTAxX3Bvd2VyZG93bihzdHJ1Y3QgbHRyNTAxX2RhdGEgKmRhdGEpCit7CisJcmV0dXJuIGx0cjUwMV93cml0ZV9jb250cihkYXRhLT5jbGllbnQsCisJCWRhdGEtPmFsc19jb250ciAmIH5MVFI1MDFfQ09OVFJfQUNUSVZFLAorCQlkYXRhLT5wc19jb250ciAmIH5MVFI1MDFfQ09OVFJfQUNUSVZFKTsKK30KKworc3RhdGljIGludCBsdHI1MDFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworCWx0cjUwMV9wb3dlcmRvd24oaWlvX3ByaXYoaW5kaW9fZGV2KSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBsdHI1MDFfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGx0cjUwMV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaTJjX2dldF9jbGllbnRkYXRhKAorCQl0b19pMmNfY2xpZW50KGRldikpKTsKKwlyZXR1cm4gbHRyNTAxX3Bvd2VyZG93bihkYXRhKTsKK30KKworc3RhdGljIGludCBsdHI1MDFfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbHRyNTAxX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpMmNfZ2V0X2NsaWVudGRhdGEoCisJCXRvX2kyY19jbGllbnQoZGV2KSkpOworCisJcmV0dXJuIGx0cjUwMV93cml0ZV9jb250cihkYXRhLT5jbGllbnQsIGRhdGEtPmFsc19jb250ciwKKwkJZGF0YS0+cHNfY29udHIpOworfQorI2VuZGlmCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhsdHI1MDFfcG1fb3BzLCBsdHI1MDFfc3VzcGVuZCwgbHRyNTAxX3Jlc3VtZSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsdHI1MDFfaWRbXSA9IHsKKwl7ICJsdHI1MDEiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGx0cjUwMV9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsdHI1MDFfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lICAgPSBMVFI1MDFfRFJWX05BTUUsCisJCS5wbQk9ICZsdHI1MDFfcG1fb3BzLAorCQkub3duZXIgID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgID0gbHRyNTAxX3Byb2JlLAorCS5yZW1vdmUJPSBsdHI1MDFfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGx0cjUwMV9pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKGx0cjUwMV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJQZXRlciBNZWVyd2FsZCA8cG1lZXJ3QHBtZWVydy5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxpdGUtT24gTFRSNTAxIGFtYmllbnQgbGlnaHQgYW5kIHByb3hpbWl0eSBzZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9saWdodC90Y3MzNDcyLmMgYi9kcml2ZXJzL2lpby9saWdodC90Y3MzNDcyLmMKaW5kZXggODg3ZmVjZi4uZmUwNjNhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbGlnaHQvdGNzMzQ3Mi5jCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L3RjczM0NzIuYwpAQCAtMTc5LDcgKzE3OSw2IEBACiAJc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmID0gcDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPmluZGlvX2RldjsKIAlzdHJ1Y3QgdGNzMzQ3Ml9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQlpbnQgbGVuID0gMDsKIAlpbnQgaSwgaiA9IDA7CiAKIAlpbnQgcmV0ID0gdGNzMzQ3Ml9yZXFfZGF0YShkYXRhKTsKQEAgLTE5NCw3ICsxOTMsNiBAQAogCQkJZ290byBkb25lOwogCiAJCWRhdGEtPmJ1ZmZlcltqKytdID0gcmV0OwotCQlsZW4gKz0gMjsKIAl9CiAKIAlpaW9fcHVzaF90b19idWZmZXJzX3dpdGhfdGltZXN0YW1wKGluZGlvX2RldiwgZGF0YS0+YnVmZmVyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL2FrODk3NS5jIGIvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL2FrODk3NS5jCmluZGV4IDA1NDIzNTQuLjc0ODY2ZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9hazg5NzUuYworKysgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvYWs4OTc1LmMKQEAgLTUxMyw2ICs1MTMsNyBAQAogCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBhazg5NzVfY2hhbm5lbHM7CiAJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGFrODk3NV9jaGFubmVscyk7CiAJaW5kaW9fZGV2LT5pbmZvID0gJmFrODk3NV9pbmZvOworCWluZGlvX2Rldi0+bmFtZSA9IGlkLT5uYW1lOwogCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKIAogCWVyciA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9tYWczMTEwLmMgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvbWFnMzExMC5jCmluZGV4IGY2Njk1NWYuLjhiNzc3ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9tYWczMTEwLmMKKysrIGIvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL21hZzMxMTAuYwpAQCAtMTgzLDkgKzE4MywxNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6Ci0JCSp2YWwgPSAwOwotCQkqdmFsMiA9IDEwMDA7Ci0JCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fTUFHTjoKKwkJCSp2YWwgPSAwOworCQkJKnZhbDIgPSAxMDAwOworCQkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJCWNhc2UgSUlPX1RFTVA6CisJCQkqdmFsID0gMTAwMDsKKwkJCXJldHVybiBJSU9fVkFMX0lOVDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUToKIAkJaSA9IGRhdGEtPmN0cmxfcmVnMSA+PiBNQUczMTEwX0NUUkxfRFJfU0hJRlQ7CiAJCSp2YWwgPSBtYWczMTEwX3NhbXBfZnJlcVtpXVswXTsKQEAgLTI3MCw3ICsyNzgsOCBAQAogCU1BRzMxMTBfQ0hBTk5FTChaLCAyKSwKIAl7CiAJCS50eXBlID0gSUlPX1RFTVAsCi0JCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSB8CisJCQlCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCiAJCS5zY2FuX2luZGV4ID0gMywKIAkJLnNjYW5fdHlwZSA9IHsKIAkJCS5zaWduID0gJ3MnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL0tjb25maWcKaW5kZXggYThiOWNhZS4uZDg4ZmYxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9LY29uZmlnCkBAIC01LDYgKzUsMjAgQEAKIAogbWVudSAiUHJlc3N1cmUgc2Vuc29ycyIKIAorY29uZmlnIEhJRF9TRU5TT1JfUFJFU1MKKwlkZXBlbmRzIG9uIEhJRF9TRU5TT1JfSFVCCisJc2VsZWN0IElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVJFRF9CVUZGRVIKKwlzZWxlY3QgSElEX1NFTlNPUl9JSU9fQ09NTU9OCisJc2VsZWN0IEhJRF9TRU5TT1JfSUlPX1RSSUdHRVIKKwl0cmlzdGF0ZSAiSElEIFBSRVNTIgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgSElEIFNFTlNPUgorCSAgUHJlc3N1cmUgZHJpdmVyCisKKyAgICAgICAgICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisgICAgICAgICAgd2lsbCBiZSBjYWxsZWQgaGlkLXNlbnNvci1wcmVzcy4KKwogY29uZmlnIE1QTDMxMTUKIAl0cmlzdGF0ZSAiRnJlZXNjYWxlIE1QTDMxMTVBMiBwcmVzc3VyZSBzZW5zb3IgZHJpdmVyIgogCWRlcGVuZHMgb24gSTJDCkBAIC0yNiw3ICs0MCw3IEBACiAJc2VsZWN0IElJT19UUklHR0VSRURfQlVGRkVSIGlmIChJSU9fQlVGRkVSKQogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBTVE1pY3JvZWxlY3Ryb25pY3MgcHJlc3N1cmUKLQkgIHNlbnNvcnM6IExQUzAwMVdQLCBMUFMzMzFBUC4KKwkgIHNlbnNvcnM6IExQUzAwMVdQLCBMUFMyNUgsIExQUzMzMUFQLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZXNlIG1vZHVsZXMKIAkgIHdpbGwgYmUgY3JlYXRlZDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL01ha2VmaWxlIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvTWFrZWZpbGUKaW5kZXggNDJiYjlmYy4uNGE1N2JmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvTWFrZWZpbGUKQEAgLTMsNiArMyw3IEBACiAjCiAKICMgV2hlbiBhZGRpbmcgbmV3IGVudHJpZXMga2VlcCB0aGUgbGlzdCBpbiBhbHBoYWJldGljYWwgb3JkZXIKK29iai0kKENPTkZJR19ISURfU0VOU09SX1BSRVNTKSAgICs9IGhpZC1zZW5zb3ItcHJlc3Mubwogb2JqLSQoQ09ORklHX01QTDMxMTUpICs9IG1wbDMxMTUubwogb2JqLSQoQ09ORklHX0lJT19TVF9QUkVTUykgKz0gc3RfcHJlc3N1cmUubwogc3RfcHJlc3N1cmUteSA6PSBzdF9wcmVzc3VyZV9jb3JlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL2hpZC1zZW5zb3ItcHJlc3MuYyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL2hpZC1zZW5zb3ItcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGU2NDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvaGlkLXNlbnNvci1wcmVzcy5jCkBAIC0wLDAgKzEsMzc2IEBACisvKgorICogSElEIFNlbnNvcnMgRHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC1zZW5zb3ItaHViLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcl9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmg+CisjaW5jbHVkZSAiLi4vY29tbW9uL2hpZC1zZW5zb3JzL2hpZC1zZW5zb3ItdHJpZ2dlci5oIgorCisjZGVmaW5lIENIQU5ORUxfU0NBTl9JTkRFWF9QUkVTU1VSRSAwCisKK3N0cnVjdCBwcmVzc19zdGF0ZSB7CisJc3RydWN0IGhpZF9zZW5zb3JfaHViX2NhbGxiYWNrcyBjYWxsYmFja3M7CisJc3RydWN0IGhpZF9zZW5zb3JfY29tbW9uIGNvbW1vbl9hdHRyaWJ1dGVzOworCXN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9hdHRyaWJ1dGVfaW5mbyBwcmVzc19hdHRyOworCXUzMiBwcmVzc19kYXRhOworfTsKKworLyogQ2hhbm5lbCBkZWZpbml0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHByZXNzX2NoYW5uZWxzW10gPSB7CisJeworCQkudHlwZSA9IElJT19QUkVTU1VSRSwKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmNoYW5uZWwyID0gSUlPX05PX01PRCwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCisJCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSBCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpIHwKKwkJQklUKElJT19DSEFOX0lORk9fU0NBTEUpIHwKKwkJQklUKElJT19DSEFOX0lORk9fU0FNUF9GUkVRKSB8CisJCUJJVChJSU9fQ0hBTl9JTkZPX0hZU1RFUkVTSVMpLAorCQkuc2Nhbl9pbmRleCA9IENIQU5ORUxfU0NBTl9JTkRFWF9QUkVTU1VSRSwKKwl9Cit9OworCisvKiBBZGp1c3QgY2hhbm5lbCByZWFsIGJpdHMgYmFzZWQgb24gcmVwb3J0IGRlc2NyaXB0b3IgKi8KK3N0YXRpYyB2b2lkIHByZXNzX2FkanVzdF9jaGFubmVsX2JpdF9tYXNrKHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFubmVscywKKwkJCQkJaW50IGNoYW5uZWwsIGludCBzaXplKQoreworCWNoYW5uZWxzW2NoYW5uZWxdLnNjYW5fdHlwZS5zaWduID0gJ3MnOworCS8qIFJlYWwgc3RvcmFnZSBiaXRzIHdpbGwgY2hhbmdlIGJhc2VkIG9uIHRoZSByZXBvcnQgZGVzYy4gKi8KKwljaGFubmVsc1tjaGFubmVsXS5zY2FuX3R5cGUucmVhbGJpdHMgPSBzaXplICogODsKKwkvKiBNYXhpbXVtIHNpemUgb2YgYSBzYW1wbGUgdG8gY2FwdHVyZSBpcyB1MzIgKi8KKwljaGFubmVsc1tjaGFubmVsXS5zY2FuX3R5cGUuc3RvcmFnZWJpdHMgPSBzaXplb2YodTMyKSAqIDg7Cit9CisKKy8qIENoYW5uZWwgcmVhZF9yYXcgaGFuZGxlciAqLworc3RhdGljIGludCBwcmVzc19yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgICBpbnQgKnZhbCwgaW50ICp2YWwyLAorCQkJICAgICAgbG9uZyBtYXNrKQoreworCXN0cnVjdCBwcmVzc19zdGF0ZSAqcHJlc3Nfc3RhdGUgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXBvcnRfaWQgPSAtMTsKKwl1MzIgYWRkcmVzczsKKwlpbnQgcmV0OworCWludCByZXRfdHlwZTsKKworCSp2YWwgPSAwOworCSp2YWwyID0gMDsKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQlzd2l0Y2ggKGNoYW4tPnNjYW5faW5kZXgpIHsKKwkJY2FzZSAgQ0hBTk5FTF9TQ0FOX0lOREVYX1BSRVNTVVJFOgorCQkJcmVwb3J0X2lkID0gcHJlc3Nfc3RhdGUtPnByZXNzX2F0dHIucmVwb3J0X2lkOworCQkJYWRkcmVzcyA9CisJCQlISURfVVNBR0VfU0VOU09SX0FUTU9TUEhFUklDX1BSRVNTVVJFOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXBvcnRfaWQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChyZXBvcnRfaWQgPj0gMCkKKwkJCSp2YWwgPSBzZW5zb3JfaHViX2lucHV0X2F0dHJfZ2V0X3Jhd192YWx1ZSgKKwkJCQlwcmVzc19zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMuaHNkZXYsCisJCQkJSElEX1VTQUdFX1NFTlNPUl9QUkVTU1VSRSwgYWRkcmVzcywKKwkJCQlyZXBvcnRfaWQpOworCQllbHNlIHsKKwkJCSp2YWwgPSAwOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmV0X3R5cGUgPSBJSU9fVkFMX0lOVDsKKwkJYnJlYWs7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgorCQkqdmFsID0gcHJlc3Nfc3RhdGUtPnByZXNzX2F0dHIudW5pdHM7CisJCXJldF90eXBlID0gSUlPX1ZBTF9JTlQ7CisJCWJyZWFrOworCWNhc2UgSUlPX0NIQU5fSU5GT19PRkZTRVQ6CisJCSp2YWwgPSBoaWRfc2Vuc29yX2NvbnZlcnRfZXhwb25lbnQoCisJCQkJcHJlc3Nfc3RhdGUtPnByZXNzX2F0dHIudW5pdF9leHBvKTsKKwkJcmV0X3R5cGUgPSBJSU9fVkFMX0lOVDsKKwkJYnJlYWs7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUToKKwkJcmV0ID0gaGlkX3NlbnNvcl9yZWFkX3NhbXBfZnJlcV92YWx1ZSgKKwkJCQkmcHJlc3Nfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLCB2YWwsIHZhbDIpOworCQlyZXRfdHlwZSA9IElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJCWJyZWFrOworCWNhc2UgSUlPX0NIQU5fSU5GT19IWVNURVJFU0lTOgorCQlyZXQgPSBoaWRfc2Vuc29yX3JlYWRfcmF3X2h5c3RfdmFsdWUoCisJCQkJJnByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcywgdmFsLCB2YWwyKTsKKwkJcmV0X3R5cGUgPSBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXRfdHlwZSA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXRfdHlwZTsKK30KKworLyogQ2hhbm5lbCB3cml0ZV9yYXcgaGFuZGxlciAqLworc3RhdGljIGludCBwcmVzc193cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgICAgICBpbnQgdmFsLAorCQkJICAgICAgIGludCB2YWwyLAorCQkJICAgICAgIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgcHJlc3Nfc3RhdGUgKnByZXNzX3N0YXRlID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVE6CisJCXJldCA9IGhpZF9zZW5zb3Jfd3JpdGVfc2FtcF9mcmVxX3ZhbHVlKAorCQkJCSZwcmVzc19zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMsIHZhbCwgdmFsMik7CisJCWJyZWFrOworCWNhc2UgSUlPX0NIQU5fSU5GT19IWVNURVJFU0lTOgorCQlyZXQgPSBoaWRfc2Vuc29yX3dyaXRlX3Jhd19oeXN0X3ZhbHVlKAorCQkJCSZwcmVzc19zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMsIHZhbCwgdmFsMik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBwcmVzc19pbmZvID0geworCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCisJLnJlYWRfcmF3ID0gJnByZXNzX3JlYWRfcmF3LAorCS53cml0ZV9yYXcgPSAmcHJlc3Nfd3JpdGVfcmF3LAorfTsKKworLyogRnVuY3Rpb24gdG8gcHVzaCBkYXRhIHRvIGJ1ZmZlciAqLworc3RhdGljIHZvaWQgaGlkX3NlbnNvcl9wdXNoX2RhdGEoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJaW50IGxlbikKK3sKKwlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgImhpZF9zZW5zb3JfcHVzaF9kYXRhXG4iKTsKKwlpaW9fcHVzaF90b19idWZmZXJzKGluZGlvX2RldiwgZGF0YSk7Cit9CisKKy8qIENhbGxiYWNrIGhhbmRsZXIgdG8gc2VuZCBldmVudCBhZnRlciBhbGwgc2FtcGxlcyBhcmUgcmVjZWl2ZWQgYW5kIGNhcHR1cmVkICovCitzdGF0aWMgaW50IHByZXNzX3Byb2NfZXZlbnQoc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYsCisJCQkJdW5zaWduZWQgdXNhZ2VfaWQsCisJCQkJdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocHJpdik7CisJc3RydWN0IHByZXNzX3N0YXRlICpwcmVzc19zdGF0ZSA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgInByZXNzX3Byb2NfZXZlbnQgWyVkXVxuIiwKKwkJCQlwcmVzc19zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMuZGF0YV9yZWFkeSk7CisJaWYgKHByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5kYXRhX3JlYWR5KQorCQloaWRfc2Vuc29yX3B1c2hfZGF0YShpbmRpb19kZXYsCisJCQkJJnByZXNzX3N0YXRlLT5wcmVzc19kYXRhLAorCQkJCXNpemVvZihwcmVzc19zdGF0ZS0+cHJlc3NfZGF0YSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENhcHR1cmUgc2FtcGxlcyBpbiBsb2NhbCBzdG9yYWdlICovCitzdGF0aWMgaW50IHByZXNzX2NhcHR1cmVfc2FtcGxlKHN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9kZXZpY2UgKmhzZGV2LAorCQkJCXVuc2lnbmVkIHVzYWdlX2lkLAorCQkJCXNpemVfdCByYXdfbGVuLCBjaGFyICpyYXdfZGF0YSwKKwkJCQl2b2lkICpwcml2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwcml2KTsKKwlzdHJ1Y3QgcHJlc3Nfc3RhdGUgKnByZXNzX3N0YXRlID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCXN3aXRjaCAodXNhZ2VfaWQpIHsKKwljYXNlIEhJRF9VU0FHRV9TRU5TT1JfQVRNT1NQSEVSSUNfUFJFU1NVUkU6CisJCXByZXNzX3N0YXRlLT5wcmVzc19kYXRhID0gKih1MzIgKilyYXdfZGF0YTsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogUGFyc2UgcmVwb3J0IHdoaWNoIGlzIHNwZWNpZmljIHRvIGFuIHVzYWdlIGlkKi8KK3N0YXRpYyBpbnQgcHJlc3NfcGFyc2VfcmVwb3J0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYsCisJCQkJc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzLAorCQkJCXVuc2lnbmVkIHVzYWdlX2lkLAorCQkJCXN0cnVjdCBwcmVzc19zdGF0ZSAqc3QpCit7CisJaW50IHJldDsKKworCXJldCA9IHNlbnNvcl9odWJfaW5wdXRfZ2V0X2F0dHJpYnV0ZV9pbmZvKGhzZGV2LCBISURfSU5QVVRfUkVQT1JULAorCQkJdXNhZ2VfaWQsCisJCQlISURfVVNBR0VfU0VOU09SX0FUTU9TUEhFUklDX1BSRVNTVVJFLAorCQkJJnN0LT5wcmVzc19hdHRyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlwcmVzc19hZGp1c3RfY2hhbm5lbF9iaXRfbWFzayhjaGFubmVscywgQ0hBTk5FTF9TQ0FOX0lOREVYX1BSRVNTVVJFLAorCQkJCQlzdC0+cHJlc3NfYXR0ci5zaXplKTsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgInByZXNzICV4OiV4XG4iLCBzdC0+cHJlc3NfYXR0ci5pbmRleCwKKwkJCXN0LT5wcmVzc19hdHRyLnJlcG9ydF9pZCk7CisKKwkvKiBTZXQgU2Vuc2l0aXZpdHkgZmllbGQgaWRzLCB3aGVuIHRoZXJlIGlzIG5vIGluZGl2aWR1YWwgbW9kaWZpZXIgKi8KKwlpZiAoc3QtPmNvbW1vbl9hdHRyaWJ1dGVzLnNlbnNpdGl2aXR5LmluZGV4IDwgMCkgeworCQlzZW5zb3JfaHViX2lucHV0X2dldF9hdHRyaWJ1dGVfaW5mbyhoc2RldiwKKwkJCUhJRF9GRUFUVVJFX1JFUE9SVCwgdXNhZ2VfaWQsCisJCQlISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX0NIQU5HRV9TRU5TSVRJVklUWV9BQlMgfAorCQkJSElEX1VTQUdFX1NFTlNPUl9EQVRBX0FUTU9TUEhFUklDX1BSRVNTVVJFLAorCQkJJnN0LT5jb21tb25fYXR0cmlidXRlcy5zZW5zaXRpdml0eSk7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIlNlbnNpdGl2aXR5IGluZGV4OnJlcG9ydCAlZDolZFxuIiwKKwkJCXN0LT5jb21tb25fYXR0cmlidXRlcy5zZW5zaXRpdml0eS5pbmRleCwKKwkJCXN0LT5jb21tb25fYXR0cmlidXRlcy5zZW5zaXRpdml0eS5yZXBvcnRfaWQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBGdW5jdGlvbiB0byBpbml0aWFsaXplIHRoZSBwcm9jZXNzaW5nIGZvciB1c2FnZSBpZCAqLworc3RhdGljIGludCBoaWRfcHJlc3NfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdGF0aWMgY29uc3QgY2hhciAqbmFtZSA9ICJwcmVzcyI7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgcHJlc3Nfc3RhdGUgKnByZXNzX3N0YXRlOworCXN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9kZXZpY2UgKmhzZGV2ID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzOworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZwZGV2LT5kZXYsCisJCQkJc2l6ZW9mKHN0cnVjdCBwcmVzc19zdGF0ZSkpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmRpb19kZXYpOworCisJcHJlc3Nfc3RhdGUgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5oc2RldiA9IGhzZGV2OworCXByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5wZGV2ID0gcGRldjsKKworCXJldCA9IGhpZF9zZW5zb3JfcGFyc2VfY29tbW9uX2F0dHJpYnV0ZXMoaHNkZXYsCisJCQkJCUhJRF9VU0FHRV9TRU5TT1JfUFJFU1NVUkUsCisJCQkJCSZwcmVzc19zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHNldHVwIGNvbW1vbiBhdHRyaWJ1dGVzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljaGFubmVscyA9IGttZW1kdXAocHJlc3NfY2hhbm5lbHMsIHNpemVvZihwcmVzc19jaGFubmVscyksIEdGUF9LRVJORUwpOworCWlmICghY2hhbm5lbHMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGR1cGxpY2F0ZSBjaGFubmVsc1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldCA9IHByZXNzX3BhcnNlX3JlcG9ydChwZGV2LCBoc2RldiwgY2hhbm5lbHMsCisJCQkJSElEX1VTQUdFX1NFTlNPUl9QUkVTU1VSRSwgcHJlc3Nfc3RhdGUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHNldHVwIGF0dHJpYnV0ZXNcbiIpOworCQlnb3RvIGVycm9yX2ZyZWVfZGV2X21lbTsKKwl9CisKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPQorCQkJCUFSUkFZX1NJWkUocHJlc3NfY2hhbm5lbHMpOworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJaW5kaW9fZGV2LT5pbmZvID0gJnByZXNzX2luZm87CisJaW5kaW9fZGV2LT5uYW1lID0gbmFtZTsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsICZpaW9fcG9sbGZ1bmNfc3RvcmVfdGltZSwKKwkJTlVMTCwgTlVMTCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0cmlnZ2VyIGJ1ZmZlclxuIik7CisJCWdvdG8gZXJyb3JfZnJlZV9kZXZfbWVtOworCX0KKwlwcmVzc19zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMuZGF0YV9yZWFkeSA9IGZhbHNlOworCXJldCA9IGhpZF9zZW5zb3Jfc2V0dXBfdHJpZ2dlcihpbmRpb19kZXYsIG5hbWUsCisJCQkJJnByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ0cmlnZ2VyIHNldHVwIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfYnVmZmVyX2Z1bmNzOworCX0KKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImRldmljZSByZWdpc3RlciBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCX0KKworCXByZXNzX3N0YXRlLT5jYWxsYmFja3Muc2VuZF9ldmVudCA9IHByZXNzX3Byb2NfZXZlbnQ7CisJcHJlc3Nfc3RhdGUtPmNhbGxiYWNrcy5jYXB0dXJlX3NhbXBsZSA9IHByZXNzX2NhcHR1cmVfc2FtcGxlOworCXByZXNzX3N0YXRlLT5jYWxsYmFja3MucGRldiA9IHBkZXY7CisJcmV0ID0gc2Vuc29yX2h1Yl9yZWdpc3Rlcl9jYWxsYmFjayhoc2RldiwgSElEX1VTQUdFX1NFTlNPUl9QUkVTU1VSRSwKKwkJCQkJJnByZXNzX3N0YXRlLT5jYWxsYmFja3MpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbGxiYWNrIHJlZyBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX2lpb191bnJlZzsKKwl9CisKKwlyZXR1cm4gcmV0OworCitlcnJvcl9paW9fdW5yZWc6CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CitlcnJvcl9yZW1vdmVfdHJpZ2dlcjoKKwloaWRfc2Vuc29yX3JlbW92ZV90cmlnZ2VyKCZwcmVzc19zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMpOworZXJyb3JfdW5yZWdfYnVmZmVyX2Z1bmNzOgorCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZGV2X21lbToKKwlrZnJlZShpbmRpb19kZXYtPmNoYW5uZWxzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBGdW5jdGlvbiB0byBkZWluaXRpYWxpemUgdGhlIHByb2Nlc3NpbmcgZm9yIHVzYWdlIGlkICovCitzdGF0aWMgaW50IGhpZF9wcmVzc19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9odWJfZGV2aWNlICpoc2RldiA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcHJlc3Nfc3RhdGUgKnByZXNzX3N0YXRlID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXNlbnNvcl9odWJfcmVtb3ZlX2NhbGxiYWNrKGhzZGV2LCBISURfVVNBR0VfU0VOU09SX1BSRVNTVVJFKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwloaWRfc2Vuc29yX3JlbW92ZV90cmlnZ2VyKCZwcmVzc19zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMpOworCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKKwlrZnJlZShpbmRpb19kZXYtPmNoYW5uZWxzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBoaWRfcHJlc3NfaWRzW10gPSB7CisJeworCQkvKiBGb3JtYXQ6IEhJRC1TRU5TT1ItdXNhZ2VfaWRfaW5faGV4X2xvd2VyY2FzZSAqLworCQkubmFtZSA9ICJISUQtU0VOU09SLTIwMDAzMSIsCisJfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBoaWRfcHJlc3NfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaGlkX3ByZXNzX3BsYXRmb3JtX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSBoaWRfcHJlc3NfaWRzLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gS0JVSUxEX01PRE5BTUUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGhpZF9wcmVzc19wcm9iZSwKKwkucmVtb3ZlCQk9IGhpZF9wcmVzc19yZW1vdmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihoaWRfcHJlc3NfcGxhdGZvcm1fZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJISUQgU2Vuc29yIFByZXNzdXJlIik7CitNT0RVTEVfQVVUSE9SKCJBcmNoYW5hIFBhdG5pIDxhcmNoYW5hLnBhdG5pQGludGVsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21wbDMxMTUuYyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21wbDMxMTUuYwppbmRleCBhYzhjOGFiLi5iYTZkMGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9tcGwzMTE1LmMKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvbXBsMzExNS5jCkBAIC03Nyw3ICs3Nyw3IEBACiAJCQkgICAgaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQogewogCXN0cnVjdCBtcGwzMTE1X2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXMzMiB0bXAgPSAwOworCV9fYmUzMiB0bXAgPSAwOwogCWludCByZXQ7CiAKIAlzd2l0Y2ggKG1hc2spIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3N0X3ByZXNzdXJlLmggYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9zdF9wcmVzc3VyZS5oCmluZGV4IDA0OWMyMWEuLjI0Mjk0M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3N0X3ByZXNzdXJlLmgKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmUuaApAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lpby9jb21tb24vc3Rfc2Vuc29ycy5oPgogCiAjZGVmaW5lIExQUzAwMVdQX1BSRVNTX0RFVl9OQU1FCQkibHBzMDAxd3AiCisjZGVmaW5lIExQUzI1SF9QUkVTU19ERVZfTkFNRQkJImxwczI1aCIKICNkZWZpbmUgTFBTMzMxQVBfUFJFU1NfREVWX05BTUUJCSJscHMzMzFhcCIKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9zdF9wcmVzc3VyZV9jb3JlLmMgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9zdF9wcmVzc3VyZV9jb3JlLmMKaW5kZXggNTgwODNmOS4uNzQxODc2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmVfY29yZS5jCisrKyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3N0X3ByZXNzdXJlX2NvcmUuYwpAQCAtNDAsNiArNDAsOSBAQAogLyogRlVMTFNDQUxFICovCiAjZGVmaW5lIFNUX1BSRVNTX0ZTX0FWTF8xMjYwTUIJCQkxMjYwCiAKKyNkZWZpbmUgU1RfUFJFU1NfMV9PVVRfWExfQUREUgkJCTB4MjgKKyNkZWZpbmUgU1RfVEVNUF8xX09VVF9MX0FERFIJCQkweDJiCisKIC8qIENVU1RPTSBWQUxVRVMgRk9SIExQUzMzMUFQIFNFTlNPUiAqLwogI2RlZmluZSBTVF9QUkVTU19MUFMzMzFBUF9XQUlfRVhQCQkweGJiCiAjZGVmaW5lIFNUX1BSRVNTX0xQUzMzMUFQX09EUl9BRERSCQkweDIwCkBAIC02Miw4ICs2NSw2IEBACiAjZGVmaW5lIFNUX1BSRVNTX0xQUzMzMUFQX0RSRFlfSVJRX0lOVDJfTUFTSwkweDIwCiAjZGVmaW5lIFNUX1BSRVNTX0xQUzMzMUFQX01VTFRJUkVBRF9CSVQJCXRydWUKICNkZWZpbmUgU1RfUFJFU1NfTFBTMzMxQVBfVEVNUF9PRkZTRVQJCTQyNTAwCi0jZGVmaW5lIFNUX1BSRVNTX0xQUzMzMUFQX09VVF9YTF9BRERSCQkweDI4Ci0jZGVmaW5lIFNUX1RFTVBfTFBTMzMxQVBfT1VUX0xfQUREUgkJMHgyYgogCiAvKiBDVVNUT00gVkFMVUVTIEZPUiBMUFMwMDFXUCBTRU5TT1IgKi8KICNkZWZpbmUgU1RfUFJFU1NfTFBTMDAxV1BfV0FJX0VYUAkJMHhiYQpAQCAtODAsMTEgKzgxLDM2IEBACiAjZGVmaW5lIFNUX1BSRVNTX0xQUzAwMVdQX09VVF9MX0FERFIJCTB4MjgKICNkZWZpbmUgU1RfVEVNUF9MUFMwMDFXUF9PVVRfTF9BRERSCQkweDJhCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzdF9wcmVzc19scHMzMzFhcF9jaGFubmVsc1tdID0geworLyogQ1VTVE9NIFZBTFVFUyBGT1IgTFBTMjVIIFNFTlNPUiAqLworI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfV0FJX0VYUAkJCTB4YmQKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX09EUl9BRERSCQkweDIwCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9PRFJfTUFTSwkJMHg3MAorI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfT0RSX0FWTF8xSFpfVkFMCQkweDAxCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9PRFJfQVZMXzdIWl9WQUwJCTB4MDIKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX09EUl9BVkxfMTNIWl9WQUwJMHgwMworI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfT0RSX0FWTF8yNUhaX1ZBTAkweDA0CisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9QV19BRERSCQkJMHgyMAorI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfUFdfTUFTSwkJCTB4ODAKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX0ZTX0FERFIJCQkweDAwCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9GU19NQVNLCQkJMHgwMAorI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfRlNfQVZMXzEyNjBfVkFMCQkweDAwCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9GU19BVkxfMTI2MF9HQUlOCVNUX1BSRVNTX0tQQVNDQUxfTkFOT19TQ0FMRQorI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfRlNfQVZMX1RFTVBfR0FJTglTVF9QUkVTU19DRUxTSVVTX05BTk9fU0NBTEUKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX0JEVV9BRERSCQkweDIwCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9CRFVfTUFTSwkJMHgwNAorI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfRFJEWV9JUlFfQUREUgkJMHgyMworI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfRFJEWV9JUlFfSU5UMV9NQVNLCTB4MDEKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX0RSRFlfSVJRX0lOVDJfTUFTSwkweDEwCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9NVUxUSVJFQURfQklUCQl0cnVlCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9URU1QX09GRlNFVAkJNDI1MDAKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX09VVF9YTF9BRERSCQkweDI4CisjZGVmaW5lIFNUX1RFTVBfTFBTMjVIX09VVF9MX0FERFIJCTB4MmIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHN0X3ByZXNzXzFfY2hhbm5lbHNbXSA9IHsKIAl7CiAJCS50eXBlID0gSUlPX1BSRVNTVVJFLAogCQkuY2hhbm5lbDIgPSBJSU9fTk9fTU9ELAotCQkuYWRkcmVzcyA9IFNUX1BSRVNTX0xQUzMzMUFQX09VVF9YTF9BRERSLAorCQkuYWRkcmVzcyA9IFNUX1BSRVNTXzFfT1VUX1hMX0FERFIsCiAJCS5zY2FuX2luZGV4ID0gU1RfU0VOU09SU19TQ0FOX1gsCiAJCS5zY2FuX3R5cGUgPSB7CiAJCQkuc2lnbiA9ICd1JywKQEAgLTk5LDcgKzEyNSw3IEBACiAJewogCQkudHlwZSA9IElJT19URU1QLAogCQkuY2hhbm5lbDIgPSBJSU9fTk9fTU9ELAotCQkuYWRkcmVzcyA9IFNUX1RFTVBfTFBTMzMxQVBfT1VUX0xfQUREUiwKKwkJLmFkZHJlc3MgPSBTVF9URU1QXzFfT1VUX0xfQUREUiwKIAkJLnNjYW5faW5kZXggPSAtMSwKIAkJLnNjYW5fdHlwZSA9IHsKIAkJCS5zaWduID0gJ3UnLApAQCAtMTU2LDggKzE4Miw4IEBACiAJCS5zZW5zb3JzX3N1cHBvcnRlZCA9IHsKIAkJCVswXSA9IExQUzMzMUFQX1BSRVNTX0RFVl9OQU1FLAogCQl9LAotCQkuY2ggPSAoc3RydWN0IGlpb19jaGFuX3NwZWMgKilzdF9wcmVzc19scHMzMzFhcF9jaGFubmVscywKLQkJLm51bV9jaCA9IEFSUkFZX1NJWkUoc3RfcHJlc3NfbHBzMzMxYXBfY2hhbm5lbHMpLAorCQkuY2ggPSAoc3RydWN0IGlpb19jaGFuX3NwZWMgKilzdF9wcmVzc18xX2NoYW5uZWxzLAorCQkubnVtX2NoID0gQVJSQVlfU0laRShzdF9wcmVzc18xX2NoYW5uZWxzKSwKIAkJLm9kciA9IHsKIAkJCS5hZGRyID0gU1RfUFJFU1NfTFBTMzMxQVBfT0RSX0FERFIsCiAJCQkubWFzayA9IFNUX1BSRVNTX0xQUzMzMUFQX09EUl9NQVNLLApAQCAtMjMzLDYgKzI1OSw1MyBAQAogCQkubXVsdGlfcmVhZF9iaXQgPSBTVF9QUkVTU19MUFMwMDFXUF9NVUxUSVJFQURfQklULAogCQkuYm9vdGltZSA9IDIsCiAJfSwKKwl7CisJCS53YWkgPSBTVF9QUkVTU19MUFMyNUhfV0FJX0VYUCwKKwkJLnNlbnNvcnNfc3VwcG9ydGVkID0geworCQkJWzBdID0gTFBTMjVIX1BSRVNTX0RFVl9OQU1FLAorCQl9LAorCQkuY2ggPSAoc3RydWN0IGlpb19jaGFuX3NwZWMgKilzdF9wcmVzc18xX2NoYW5uZWxzLAorCQkubnVtX2NoID0gQVJSQVlfU0laRShzdF9wcmVzc18xX2NoYW5uZWxzKSwKKwkJLm9kciA9IHsKKwkJCS5hZGRyID0gU1RfUFJFU1NfTFBTMjVIX09EUl9BRERSLAorCQkJLm1hc2sgPSBTVF9QUkVTU19MUFMyNUhfT0RSX01BU0ssCisJCQkub2RyX2F2bCA9IHsKKwkJCQl7IDEsIFNUX1BSRVNTX0xQUzI1SF9PRFJfQVZMXzFIWl9WQUwsIH0sCisJCQkJeyA3LCBTVF9QUkVTU19MUFMyNUhfT0RSX0FWTF83SFpfVkFMLCB9LAorCQkJCXsgMTMsIFNUX1BSRVNTX0xQUzI1SF9PRFJfQVZMXzEzSFpfVkFMLCB9LAorCQkJCXsgMjUsIFNUX1BSRVNTX0xQUzI1SF9PRFJfQVZMXzI1SFpfVkFMLCB9LAorCQkJfSwKKwkJfSwKKwkJLnB3ID0geworCQkJLmFkZHIgPSBTVF9QUkVTU19MUFMyNUhfUFdfQUREUiwKKwkJCS5tYXNrID0gU1RfUFJFU1NfTFBTMjVIX1BXX01BU0ssCisJCQkudmFsdWVfb24gPSBTVF9TRU5TT1JTX0RFRkFVTFRfUE9XRVJfT05fVkFMVUUsCisJCQkudmFsdWVfb2ZmID0gU1RfU0VOU09SU19ERUZBVUxUX1BPV0VSX09GRl9WQUxVRSwKKwkJfSwKKwkJLmZzID0geworCQkJLmFkZHIgPSBTVF9QUkVTU19MUFMyNUhfRlNfQUREUiwKKwkJCS5tYXNrID0gU1RfUFJFU1NfTFBTMjVIX0ZTX01BU0ssCisJCQkuZnNfYXZsID0geworCQkJCVswXSA9IHsKKwkJCQkJLm51bSA9IFNUX1BSRVNTX0ZTX0FWTF8xMjYwTUIsCisJCQkJCS52YWx1ZSA9IFNUX1BSRVNTX0xQUzI1SF9GU19BVkxfMTI2MF9WQUwsCisJCQkJCS5nYWluID0gU1RfUFJFU1NfTFBTMjVIX0ZTX0FWTF8xMjYwX0dBSU4sCisJCQkJCS5nYWluMiA9IFNUX1BSRVNTX0xQUzI1SF9GU19BVkxfVEVNUF9HQUlOLAorCQkJCX0sCisJCQl9LAorCQl9LAorCQkuYmR1ID0geworCQkJLmFkZHIgPSBTVF9QUkVTU19MUFMyNUhfQkRVX0FERFIsCisJCQkubWFzayA9IFNUX1BSRVNTX0xQUzI1SF9CRFVfTUFTSywKKwkJfSwKKwkJLmRyZHlfaXJxID0geworCQkJLmFkZHIgPSBTVF9QUkVTU19MUFMyNUhfRFJEWV9JUlFfQUREUiwKKwkJCS5tYXNrX2ludDEgPSBTVF9QUkVTU19MUFMyNUhfRFJEWV9JUlFfSU5UMV9NQVNLLAorCQkJLm1hc2tfaW50MiA9IFNUX1BSRVNTX0xQUzI1SF9EUkRZX0lSUV9JTlQyX01BU0ssCisJCX0sCisJCS5tdWx0aV9yZWFkX2JpdCA9IFNUX1BSRVNTX0xQUzI1SF9NVUxUSVJFQURfQklULAorCQkuYm9vdGltZSA9IDIsCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgc3RfcHJlc3NfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3N0X3ByZXNzdXJlX2kyYy5jIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmVfaTJjLmMKaW5kZXggNTFlYWI3Zi4uM2NkNzNlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmVfaTJjLmMKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmVfaTJjLmMKQEAgLTUwLDYgKzUwLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHN0X3ByZXNzX2lkX3RhYmxlW10gPSB7CiAJeyBMUFMwMDFXUF9QUkVTU19ERVZfTkFNRSB9LAorCXsgTFBTMjVIX1BSRVNTX0RFVl9OQU1FIH0sCiAJeyBMUFMzMzFBUF9QUkVTU19ERVZfTkFNRSB9LAogCXt9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3N0X3ByZXNzdXJlX3NwaS5jIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmVfc3BpLmMKaW5kZXggMjczMjJhZi4uZjQ1ZDQzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmVfc3BpLmMKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmVfc3BpLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIHN0X3ByZXNzX2lkX3RhYmxlW10gPSB7CiAJeyBMUFMwMDFXUF9QUkVTU19ERVZfTkFNRSB9LAorCXsgTFBTMjVIX1BSRVNTX0RFVl9OQU1FIH0sCiAJeyBMUFMzMzFBUF9QUkVTU19ERVZfTkFNRSB9LAogCXt9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vc3QxMjMyLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3N0MTIzMi5jCmluZGV4IDVjMzQyYjMuLjNjMGY1N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vc3QxMjMyLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9zdDEyMzIuYwpAQCAtMTM0LDcgKzEzNCw4IEBACiAJfSBlbHNlIGlmICghdHMtPmxvd19sYXRlbmN5X3JlcS5kZXYpIHsKIAkJLyogRmlyc3QgY29udGFjdCwgcmVxdWVzdCAxMDAgdXMgbGF0ZW5jeS4gKi8KIAkJZGV2X3BtX3Fvc19hZGRfYW5jZXN0b3JfcmVxdWVzdCgmdHMtPmNsaWVudC0+ZGV2LAotCQkJCQkJJnRzLT5sb3dfbGF0ZW5jeV9yZXEsIDEwMCk7CisJCQkJCQkmdHMtPmxvd19sYXRlbmN5X3JlcSwKKwkJCQkJCURFVl9QTV9RT1NfUkVTVU1FX0xBVEVOQ1ksIDEwMCk7CiAJfQogCiAJLyogU1lOX1JFUE9SVCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfdHlwZXMuaCBiL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11X3R5cGVzLmgKaW5kZXggZTQwMGZiZS4uY2ZmMDM5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfdHlwZXMuaAorKysgYi9kcml2ZXJzL2lvbW11L2FtZF9pb21tdV90eXBlcy5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CiAKIC8qCiAgKiBNYXhpbXVtIG51bWJlciBvZiBJT01NVXMgc3VwcG9ydGVkCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvTWFrZWZpbGUgYi9kcml2ZXJzL2lycWNoaXAvTWFrZWZpbGUKaW5kZXggNTE5NGFmYi4uMWMwYzE1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9NYWtlZmlsZQpAQCAtMTIsNiArMTIsNyBAQAogb2JqLSQoQ09ORklHX0FSQ0hfTU9YQVJUKQkJKz0gaXJxLW1veGFydC5vCiBvYmotJChDT05GSUdfT1JJT05fSVJRQ0hJUCkJCSs9IGlycS1vcmlvbi5vCiBvYmotJChDT05GSUdfQVJDSF9TVU5YSSkJCSs9IGlycS1zdW40aS5vCitvYmotJChDT05GSUdfQVJDSF9TVU5YSSkJCSs9IGlycS1zdW54aS1ubWkubwogb2JqLSQoQ09ORklHX0FSQ0hfU1BFQVIzWFgpCQkrPSBzcGVhci1zaGlycS5vCiBvYmotJChDT05GSUdfQVJNX0dJQykJCQkrPSBpcnEtZ2ljLm8KIG9iai0kKENPTkZJR19BUk1fTlZJQykJCQkrPSBpcnEtbnZpYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWFybWFkYS0zNzAteHAuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXJtYWRhLTM3MC14cC5jCmluZGV4IDU0MDk1NjQuLjQxYmU4OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXJtYWRhLTM3MC14cC5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXJtYWRhLTM3MC14cC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvY2hhaW5lZF9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KQEAgLTQyLDYgKzQzLDcgQEAKICNkZWZpbmUgQVJNQURBXzM3MF9YUF9JTlRfU09VUkNFX0NUTChpcnEpCSgweDEwMCArIGlycSo0KQogCiAjZGVmaW5lIEFSTUFEQV8zNzBfWFBfQ1BVX0lOVEFDS19PRkZTCQkoMHg0NCkKKyNkZWZpbmUgQVJNQURBXzM3NV9QUElfQ0FVU0UJCQkoMHgxMCkKIAogI2RlZmluZSBBUk1BREFfMzcwX1hQX1NXX1RSSUdfSU5UX09GRlMgICAgICAgICAgICgweDQpCiAjZGVmaW5lIEFSTUFEQV8zNzBfWFBfSU5fRFJCRUxfTVNLX09GRlMgICAgICAgICAgKDB4YykKQEAgLTM1Miw3ICszNTQsNjMgQEAKIAkueGxhdGUgPSBpcnFfZG9tYWluX3hsYXRlX29uZWNlbGwsCiB9OwogCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeQorI2lmZGVmIENPTkZJR19QQ0lfTVNJCitzdGF0aWMgdm9pZCBhcm1hZGFfMzcwX3hwX2hhbmRsZV9tc2lfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBib29sIGlzX2NoYWluZWQpCit7CisJdTMyIG1zaW1hc2ssIG1zaW5yOworCisJbXNpbWFzayA9IHJlYWRsX3JlbGF4ZWQocGVyX2NwdV9pbnRfYmFzZSArCisJCQkJQVJNQURBXzM3MF9YUF9JTl9EUkJFTF9DQVVTRV9PRkZTKQorCQkmIFBDSV9NU0lfRE9PUkJFTExfTUFTSzsKKworCXdyaXRlbCh+bXNpbWFzaywgcGVyX2NwdV9pbnRfYmFzZSArCisJICAgICAgIEFSTUFEQV8zNzBfWFBfSU5fRFJCRUxfQ0FVU0VfT0ZGUyk7CisKKwlmb3IgKG1zaW5yID0gUENJX01TSV9ET09SQkVMTF9TVEFSVDsKKwkgICAgIG1zaW5yIDwgUENJX01TSV9ET09SQkVMTF9FTkQ7IG1zaW5yKyspIHsKKwkJaW50IGlycTsKKworCQlpZiAoIShtc2ltYXNrICYgQklUKG1zaW5yKSkpCisJCQljb250aW51ZTsKKworCQlpcnEgPSBpcnFfZmluZF9tYXBwaW5nKGFybWFkYV8zNzBfeHBfbXNpX2RvbWFpbiwKKwkJCQkgICAgICAgbXNpbnIgLSAxNik7CisKKwkJaWYgKGlzX2NoYWluZWQpCisJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKKwkJZWxzZQorCQkJaGFuZGxlX0lSUShpcnEsIHJlZ3MpOworCX0KK30KKyNlbHNlCitzdGF0aWMgdm9pZCBhcm1hZGFfMzcwX3hwX2hhbmRsZV9tc2lfaXJxKHN0cnVjdCBwdF9yZWdzICpyLCBib29sIGIpIHt9CisjZW5kaWYKKworc3RhdGljIHZvaWQgYXJtYWRhXzM3MF94cF9tcGljX2hhbmRsZV9jYXNjYWRlX2lycSh1bnNpZ25lZCBpbnQgaXJxLAorCQkJCQkJICBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2dldF9jaGlwKGlycSk7CisJdW5zaWduZWQgbG9uZyBpcnFtYXAsIGlycW47CisJdW5zaWduZWQgaW50IGNhc2NhZGVfaXJxOworCisJY2hhaW5lZF9pcnFfZW50ZXIoY2hpcCwgZGVzYyk7CisKKwlpcnFtYXAgPSByZWFkbF9yZWxheGVkKHBlcl9jcHVfaW50X2Jhc2UgKyBBUk1BREFfMzc1X1BQSV9DQVVTRSk7CisKKwlpZiAoaXJxbWFwICYgQklUKDApKSB7CisJCWFybWFkYV8zNzBfeHBfaGFuZGxlX21zaV9pcnEoTlVMTCwgdHJ1ZSk7CisJCWlycW1hcCAmPSB+QklUKDApOworCX0KKworCWZvcl9lYWNoX3NldF9iaXQoaXJxbiwgJmlycW1hcCwgQklUU19QRVJfTE9ORykgeworCQljYXNjYWRlX2lycSA9IGlycV9maW5kX21hcHBpbmcoYXJtYWRhXzM3MF94cF9tcGljX2RvbWFpbiwgaXJxbik7CisJCWdlbmVyaWNfaGFuZGxlX2lycShjYXNjYWRlX2lycSk7CisJfQorCisJY2hhaW5lZF9pcnFfZXhpdChjaGlwLCBkZXNjKTsKK30KKworc3RhdGljIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5CiBhcm1hZGFfMzcwX3hwX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdTMyIGlycXN0YXQsIGlycW5yOwpAQCAtMzcyLDMxICs0MzAsOSBAQAogCQkJY29udGludWU7CiAJCX0KIAotI2lmZGVmIENPTkZJR19QQ0lfTVNJCiAJCS8qIE1TSSBoYW5kbGluZyAqLwotCQlpZiAoaXJxbnIgPT0gMSkgewotCQkJdTMyIG1zaW1hc2ssIG1zaW5yOwotCi0JCQltc2ltYXNrID0gcmVhZGxfcmVsYXhlZChwZXJfY3B1X2ludF9iYXNlICsKLQkJCQkJCUFSTUFEQV8zNzBfWFBfSU5fRFJCRUxfQ0FVU0VfT0ZGUykKLQkJCQkmIFBDSV9NU0lfRE9PUkJFTExfTUFTSzsKLQotCQkJd3JpdGVsKH5tc2ltYXNrLCBwZXJfY3B1X2ludF9iYXNlICsKLQkJCSAgICAgICBBUk1BREFfMzcwX1hQX0lOX0RSQkVMX0NBVVNFX09GRlMpOwotCi0JCQlmb3IgKG1zaW5yID0gUENJX01TSV9ET09SQkVMTF9TVEFSVDsKLQkJCSAgICAgbXNpbnIgPCBQQ0lfTVNJX0RPT1JCRUxMX0VORDsgbXNpbnIrKykgewotCQkJCWludCBpcnE7Ci0KLQkJCQlpZiAoIShtc2ltYXNrICYgQklUKG1zaW5yKSkpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaXJxID0gaXJxX2ZpbmRfbWFwcGluZyhhcm1hZGFfMzcwX3hwX21zaV9kb21haW4sCi0JCQkJCQkgICAgICAgbXNpbnIgLSAxNik7Ci0JCQkJaGFuZGxlX0lSUShpcnEsIHJlZ3MpOwotCQkJfQotCQl9Ci0jZW5kaWYKKwkJaWYgKGlycW5yID09IDEpCisJCQlhcm1hZGFfMzcwX3hwX2hhbmRsZV9tc2lfaXJxKHJlZ3MsIGZhbHNlKTsKIAogI2lmZGVmIENPTkZJR19TTVAKIAkJLyogSVBJIEhhbmRsaW5nICovCkBAIC00MjcsNiArNDYzLDcgQEAKIAkJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCkKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgbWFpbl9pbnRfcmVzLCBwZXJfY3B1X2ludF9yZXM7CisJaW50IHBhcmVudF9pcnE7CiAJdTMyIGNvbnRyb2w7CiAKIAlCVUdfT04ob2ZfYWRkcmVzc190b19yZXNvdXJjZShub2RlLCAwLCAmbWFpbl9pbnRfcmVzKSk7CkBAIC00NTUsOCArNDkyLDYgQEAKIAogCUJVR19PTighYXJtYWRhXzM3MF94cF9tcGljX2RvbWFpbik7CiAKLQlpcnFfc2V0X2RlZmF1bHRfaG9zdChhcm1hZGFfMzcwX3hwX21waWNfZG9tYWluKTsKLQogI2lmZGVmIENPTkZJR19TTVAKIAlhcm1hZGFfeHBfbXBpY19zbXBfY3B1X2luaXQoKTsKIApAQCAtNDcyLDcgKzUwNywxNCBAQAogCiAJYXJtYWRhXzM3MF94cF9tc2lfaW5pdChub2RlLCBtYWluX2ludF9yZXMuc3RhcnQpOwogCi0Jc2V0X2hhbmRsZV9pcnEoYXJtYWRhXzM3MF94cF9oYW5kbGVfaXJxKTsKKwlwYXJlbnRfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobm9kZSwgMCk7CisJaWYgKHBhcmVudF9pcnEgPD0gMCkgeworCQlpcnFfc2V0X2RlZmF1bHRfaG9zdChhcm1hZGFfMzcwX3hwX21waWNfZG9tYWluKTsKKwkJc2V0X2hhbmRsZV9pcnEoYXJtYWRhXzM3MF94cF9oYW5kbGVfaXJxKTsKKwl9IGVsc2UgeworCQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihwYXJlbnRfaXJxLAorCQkJCQlhcm1hZGFfMzcwX3hwX21waWNfaGFuZGxlX2Nhc2NhZGVfaXJxKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtYmNtMjgzNS5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1iY20yODM1LmMKaW5kZXggMTY5M2I4ZS4uNTkxNmQ2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1iY20yODM1LmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1iY20yODM1LmMKQEAgLTk1LDcgKzk1LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXJtY3RybF9pYyBpbnRjIF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMgYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSBiY20yODM1X2hhbmRsZV9pcnEoCitzdGF0aWMgdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgYmNtMjgzNV9oYW5kbGVfaXJxKAogCXN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAogc3RhdGljIHZvaWQgYXJtY3RybF9tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCkBAIC0xOTYsNyArMTk2LDcgQEAKIAloYW5kbGVfSVJRKGlycV9saW5lYXJfcmV2bWFwKGludGMuZG9tYWluLCBpcnEpLCByZWdzKTsKIH0KIAotc3RhdGljIGFzbWxpbmthZ2Ugdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgYmNtMjgzNV9oYW5kbGVfaXJxKAorc3RhdGljIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IGJjbTI4MzVfaGFuZGxlX2lycSgKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1MzIgc3RhdCwgaXJxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLmMKaW5kZXggMzQxYzYwMS4uNTMxNzY5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy5jCkBAIC01MCw3ICs1MCw3IEBACiAKIHVuaW9uIGdpY19iYXNlIHsKIAl2b2lkIF9faW9tZW0gKmNvbW1vbl9iYXNlOwotCXZvaWQgX19wZXJjcHUgX19pb21lbSAqKnBlcmNwdV9iYXNlOworCXZvaWQgX19wZXJjcHUgKiBfX2lvbWVtICpwZXJjcHVfYmFzZTsKIH07CiAKIHN0cnVjdCBnaWNfY2hpcF9kYXRhIHsKQEAgLTI3OSw3ICsyNzksNyBAQAogI2RlZmluZSBnaWNfc2V0X3dha2UJTlVMTAogI2VuZGlmCiAKLXN0YXRpYyBhc21saW5rYWdlIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IGdpY19oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IGdpY19oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXUzMiBpcnFzdGF0LCBpcnFucjsKIAlzdHJ1Y3QgZ2ljX2NoaXBfZGF0YSAqZ2ljID0gJmdpY19kYXRhWzBdOwpAQCAtNjQ4LDcgKzY0OCw3IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TTVAKLXZvaWQgZ2ljX3JhaXNlX3NvZnRpcnEoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBnaWNfcmFpc2Vfc29mdGlycShjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywgdW5zaWduZWQgaW50IGlycSkKIHsKIAlpbnQgY3B1OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG1hcCA9IDA7CkBAIC04NjksNyArODY5LDcgQEAKIH07CiAjZW5kaWYKIAotY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzIGdpY19pcnFfZG9tYWluX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgZ2ljX2lycV9kb21haW5fb3BzID0gewogCS5tYXAgPSBnaWNfaXJxX2RvbWFpbl9tYXAsCiAJLnhsYXRlID0gZ2ljX2lycV9kb21haW5feGxhdGUsCiB9OwpAQCAtOTc0LDcgKzk3NCw4IEBACiAjaWZkZWYgQ09ORklHX09GCiBzdGF0aWMgaW50IGdpY19jbnQgX19pbml0ZGF0YTsKIAotaW50IF9faW5pdCBnaWNfb2ZfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50KQorc3RhdGljIGludCBfX2luaXQKK2dpY19vZl9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQpCiB7CiAJdm9pZCBfX2lvbWVtICpjcHVfYmFzZTsKIAl2b2lkIF9faW9tZW0gKmRpc3RfYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtbW1wLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLW1tcC5jCmluZGV4IDJjYjdjZDAuLjNjODgyN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtbW1wLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1tbXAuYwpAQCAtMTk0LDggKzE5NCw3IEBACiAJLmNvbmZfbWFzawk9IDB4N2YsCiB9OwogCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeQotbW1wX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgbW1wX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IGlycSwgaHdpcnE7CiAKQEAgLTIwNyw4ICsyMDYsNyBAQAogCWhhbmRsZV9JUlEoaXJxLCByZWdzKTsKIH0KIAotc3RhdGljIGFzbWxpbmthZ2Ugdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkKLW1tcDJfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSBtbXAyX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IGlycSwgaHdpcnE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtbW94YXJ0LmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLW1veGFydC5jCmluZGV4IDU1NTJmYzIuLjAwYjNjYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtbW94YXJ0LmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1tb3hhcnQuYwpAQCAtNDQsNyArNDQsNyBAQAogCiBzdGF0aWMgc3RydWN0IG1veGFydF9pcnFfZGF0YSBpbnRjOwogCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSBoYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IGhhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdTMyIGlycXN0YXQ7CiAJaW50IGh3aXJxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1vcmlvbi5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1vcmlvbi5jCmluZGV4IDhlNDFiZTYuLmUyNWYyNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtb3Jpb24uYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLW9yaW9uLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFfZG9tYWluICpvcmlvbl9pcnFfZG9tYWluOwogCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkCitzdGF0aWMgdm9pZAogX19leGNlcHRpb25faXJxX2VudHJ5IG9yaW9uX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGlycV9kb21haW5fY2hpcF9nZW5lcmljICpkZ2MgPSBvcmlvbl9pcnFfZG9tYWluLT5nYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtc2lyZnNvYy5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1zaXJmc29jLmMKaW5kZXggM2EwNzBjNS4uNTgxZWVmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1zaXJmc29jLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1zaXJmc29jLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAljdC0+cmVncy5tYXNrID0gU0lSRlNPQ19JTlRfUklTQ19NQVNLMDsKIH0KIAotc3RhdGljIGFzbWxpbmthZ2Ugdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgc2lyZnNvY19oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IHNpcmZzb2NfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBzaXJmc29jX2lycWRvbWFpbi0+aG9zdF9kYXRhOwogCXUzMiBpcnFzdGF0LCBpcnFucjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtc3VuNGkuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtc3VuNGkuYwppbmRleCBhNTQzOGQ4Li42ZmNlZjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLXN1bjRpLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1zdW40aS5jCkBAIC0zNiwxOCArMzYsMTYgQEAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKnN1bjRpX2lycV9iYXNlOwogc3RhdGljIHN0cnVjdCBpcnFfZG9tYWluICpzdW40aV9pcnFfZG9tYWluOwogCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSBzdW40aV9oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSBzdW40aV9oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAogc3RhdGljIHZvaWQgc3VuNGlfaXJxX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmlycWQpCiB7CiAJdW5zaWduZWQgaW50IGlycSA9IGlycWRfdG9faHdpcnEoaXJxZCk7Ci0JdW5zaWduZWQgaW50IGlycV9vZmYgPSBpcnEgJSAzMjsKLQlpbnQgcmVnID0gaXJxIC8gMzI7Ci0JdTMyIHZhbDsKIAotCXZhbCA9IHJlYWRsKHN1bjRpX2lycV9iYXNlICsgU1VONElfSVJRX1BFTkRJTkdfUkVHKHJlZykpOwotCXdyaXRlbCh2YWwgfCAoMSA8PCBpcnFfb2ZmKSwKLQkgICAgICAgc3VuNGlfaXJxX2Jhc2UgKyBTVU40SV9JUlFfUEVORElOR19SRUcocmVnKSk7CisJaWYgKGlycSAhPSAwKQorCQlyZXR1cm47IC8qIE9ubHkgSVJRIDAgLyB0aGUgRU5NSSBuZWVkcyB0byBiZSBhY2tlZCAqLworCisJd3JpdGVsKEJJVCgwKSwgc3VuNGlfaXJxX2Jhc2UgKyBTVU40SV9JUlFfUEVORElOR19SRUcoMCkpOwogfQogCiBzdGF0aWMgdm9pZCBzdW40aV9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmlycWQpCkBAIC03NiwxNiArNzQsMTYgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzdW40aV9pcnFfY2hpcCA9IHsKIAkubmFtZQkJPSAic3VuNGlfaXJxIiwKLQkuaXJxX2Fjawk9IHN1bjRpX2lycV9hY2ssCisJLmlycV9lb2kJPSBzdW40aV9pcnFfYWNrLAogCS5pcnFfbWFzawk9IHN1bjRpX2lycV9tYXNrLAogCS5pcnFfdW5tYXNrCT0gc3VuNGlfaXJxX3VubWFzaywKKwkuZmxhZ3MJCT0gSVJRQ0hJUF9FT0lfVEhSRUFERUQgfCBJUlFDSElQX0VPSV9JRl9IQU5ETEVELAogfTsKIAogc3RhdGljIGludCBzdW40aV9pcnFfbWFwKHN0cnVjdCBpcnFfZG9tYWluICpkLCB1bnNpZ25lZCBpbnQgdmlycSwKIAkJCSBpcnFfaHdfbnVtYmVyX3QgaHcpCiB7Ci0JaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZzdW40aV9pcnFfY2hpcCwKLQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CisJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZzdW40aV9pcnFfY2hpcCwgaGFuZGxlX2Zhc3Rlb2lfaXJxKTsKIAlzZXRfaXJxX2ZsYWdzKHZpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKIAogCXJldHVybiAwOwpAQCAtMTA5LDcgKzEwNyw3IEBACiAJd3JpdGVsKDAsIHN1bjRpX2lycV9iYXNlICsgU1VONElfSVJRX0VOQUJMRV9SRUcoMSkpOwogCXdyaXRlbCgwLCBzdW40aV9pcnFfYmFzZSArIFNVTjRJX0lSUV9FTkFCTEVfUkVHKDIpKTsKIAotCS8qIE1hc2sgYWxsIHRoZSBpbnRlcnJ1cHRzICovCisJLyogVW5tYXNrIGFsbCB0aGUgaW50ZXJydXB0cywgRU5BQkxFX1JFRyh4KSBpcyB1c2VkIGZvciBtYXNraW5nICovCiAJd3JpdGVsKDAsIHN1bjRpX2lycV9iYXNlICsgU1VONElfSVJRX01BU0tfUkVHKDApKTsKIAl3cml0ZWwoMCwgc3VuNGlfaXJxX2Jhc2UgKyBTVU40SV9JUlFfTUFTS19SRUcoMSkpOwogCXdyaXRlbCgwLCBzdW40aV9pcnFfYmFzZSArIFNVTjRJX0lSUV9NQVNLX1JFRygyKSk7CkBAIC0xMzQsMTYgKzEzMiwzMCBAQAogCiAJcmV0dXJuIDA7CiB9Ci1JUlFDSElQX0RFQ0xBUkUoYWxsd2lubmVyX3N1bjRpX2ljLCAiYWxsd2lubmVyLHN1bjRpLWljIiwgc3VuNGlfb2ZfaW5pdCk7CitJUlFDSElQX0RFQ0xBUkUoYWxsd2lubmVyX3N1bjRpX2ljLCAiYWxsd2lubmVyLHN1bjRpLWExMC1pYyIsIHN1bjRpX29mX2luaXQpOwogCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSBzdW40aV9oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IHN1bjRpX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdTMyIGlycSwgaHdpcnE7CiAKKwkvKgorCSAqIGh3aXJxID09IDAgY2FuIG1lYW4gb25lIG9mIDMgdGhpbmdzOgorCSAqIDEpIG5vIG1vcmUgaXJxcyBwZW5kaW5nCisJICogMikgaXJxIDAgcGVuZGluZworCSAqIDMpIHNwdXJpb3VzIGlycQorCSAqIFNvIGlmIHdlIGltbWVkaWF0ZWx5IGdldCBhIHJlYWRpbmcgb2YgMCwgY2hlY2sgdGhlIGlycS1wZW5kaW5nIHJlZworCSAqIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiAyIGFuZCAzLiBXZSBvbmx5IGRvIHRoaXMgb25jZSB0byBhdm9pZAorCSAqIHRoZSBleHRyYSBjaGVjayBpbiB0aGUgY29tbW9uIGNhc2Ugb2YgMSBoYXBlbmluZyBhZnRlciBoYXZpbmcKKwkgKiByZWFkIHRoZSB2ZWN0b3ItcmVnIG9uY2UuCisJICovCiAJaHdpcnEgPSByZWFkbChzdW40aV9pcnFfYmFzZSArIFNVTjRJX0lSUV9WRUNUT1JfUkVHKSA+PiAyOwotCXdoaWxlIChod2lycSAhPSAwKSB7CisJaWYgKGh3aXJxID09IDAgJiYKKwkJICAhKHJlYWRsKHN1bjRpX2lycV9iYXNlICsgU1VONElfSVJRX1BFTkRJTkdfUkVHKDApKSAmIEJJVCgwKSkpCisJCXJldHVybjsKKworCWRvIHsKIAkJaXJxID0gaXJxX2ZpbmRfbWFwcGluZyhzdW40aV9pcnFfZG9tYWluLCBod2lycSk7CiAJCWhhbmRsZV9JUlEoaXJxLCByZWdzKTsKIAkJaHdpcnEgPSByZWFkbChzdW40aV9pcnFfYmFzZSArIFNVTjRJX0lSUV9WRUNUT1JfUkVHKSA+PiAyOwotCX0KKwl9IHdoaWxlIChod2lycSAhPSAwKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtc3VueGktbm1pLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXN1bnhpLW5taS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZjU0N2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXN1bnhpLW5taS5jCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogQWxsd2lubmVyIEEyMC9BMzEgU29DcyBOTUkgSVJRIGNoaXAgZHJpdmVyLgorICoKKyAqIENhcmxvIENhaW9uZSA8Y2FybG8uY2Fpb25lQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2NoYWluZWRfaXJxLmg+CisjaW5jbHVkZSAiaXJxY2hpcC5oIgorCisjZGVmaW5lIFNVTlhJX05NSV9TUkNfVFlQRV9NQVNLCTB4MDAwMDAwMDMKKworZW51bSB7CisJU1VOWElfU1JDX1RZUEVfTEVWRUxfTE9XID0gMCwKKwlTVU5YSV9TUkNfVFlQRV9FREdFX0ZBTExJTkcsCisJU1VOWElfU1JDX1RZUEVfTEVWRUxfSElHSCwKKwlTVU5YSV9TUkNfVFlQRV9FREdFX1JJU0lORywKK307CisKK3N0cnVjdCBzdW54aV9zY19ubWlfcmVnX29mZnMgeworCXUzMiBjdHJsOworCXUzMiBwZW5kOworCXUzMiBlbmFibGU7Cit9OworCitzdGF0aWMgc3RydWN0IHN1bnhpX3NjX25taV9yZWdfb2ZmcyBzdW43aV9yZWdfb2ZmcyA9IHsKKwkuY3RybAk9IDB4MDAsCisJLnBlbmQJPSAweDA0LAorCS5lbmFibGUJPSAweDA4LAorfTsKKworc3RhdGljIHN0cnVjdCBzdW54aV9zY19ubWlfcmVnX29mZnMgc3VuNmlfcmVnX29mZnMgPSB7CisJLmN0cmwJPSAweDAwLAorCS5wZW5kCT0gMHgwNCwKKwkuZW5hYmxlCT0gMHgzNCwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdW54aV9zY19ubWlfd3JpdGUoc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjLCB1MzIgb2ZmLAorCQkJCSAgICAgIHUzMiB2YWwpCit7CisJaXJxX3JlZ193cml0ZWwodmFsLCBnYy0+cmVnX2Jhc2UgKyBvZmYpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBzdW54aV9zY19ubWlfcmVhZChzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MsIHUzMiBvZmYpCit7CisJcmV0dXJuIGlycV9yZWdfcmVhZGwoZ2MtPnJlZ19iYXNlICsgb2ZmKTsKK30KKworc3RhdGljIHZvaWQgc3VueGlfc2Nfbm1pX2hhbmRsZV9pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW4gPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOworCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9nZXRfY2hpcChpcnEpOworCXVuc2lnbmVkIGludCB2aXJxID0gaXJxX2ZpbmRfbWFwcGluZyhkb21haW4sIDApOworCisJY2hhaW5lZF9pcnFfZW50ZXIoY2hpcCwgZGVzYyk7CisJZ2VuZXJpY19oYW5kbGVfaXJxKHZpcnEpOworCWNoYWluZWRfaXJxX2V4aXQoY2hpcCwgZGVzYyk7Cit9CisKK3N0YXRpYyBpbnQgc3VueGlfc2Nfbm1pX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IGZsb3dfdHlwZSkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlzdHJ1Y3QgaXJxX2NoaXBfdHlwZSAqY3QgPSBnYy0+Y2hpcF90eXBlczsKKwl1MzIgc3JjX3R5cGVfcmVnOworCXUzMiBjdHJsX29mZiA9IGN0LT5yZWdzLnR5cGU7CisJdW5zaWduZWQgaW50IHNyY190eXBlOworCXVuc2lnbmVkIGludCBpOworCisJaXJxX2djX2xvY2soZ2MpOworCisJc3dpdGNoIChmbG93X3R5cGUgJiBJUlFGX1RSSUdHRVJfTUFTSykgeworCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgorCQlzcmNfdHlwZSA9IFNVTlhJX1NSQ19UWVBFX0VER0VfRkFMTElORzsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKKwkJc3JjX3R5cGUgPSBTVU5YSV9TUkNfVFlQRV9FREdFX1JJU0lORzsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgorCQlzcmNfdHlwZSA9IFNVTlhJX1NSQ19UWVBFX0xFVkVMX0hJR0g7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfTk9ORToKKwljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKKwkJc3JjX3R5cGUgPSBTVU5YSV9TUkNfVFlQRV9MRVZFTF9MT1c7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlycV9nY191bmxvY2soZ2MpOworCQlwcl9lcnIoIiVzOiBDYW5ub3QgYXNzaWduIG11bHRpcGxlIHRyaWdnZXIgbW9kZXMgdG8gSVJRICVkLlxuIiwKKwkJCV9fZnVuY19fLCBkYXRhLT5pcnEpOworCQlyZXR1cm4gLUVCQURSOworCX0KKworCWlycWRfc2V0X3RyaWdnZXJfdHlwZShkYXRhLCBmbG93X3R5cGUpOworCWlycV9zZXR1cF9hbHRfY2hpcChkYXRhLCBmbG93X3R5cGUpOworCisJZm9yIChpID0gMDsgaSA8PSBnYy0+bnVtX2N0OyBpKyssIGN0KyspCisJCWlmIChjdC0+dHlwZSAmIGZsb3dfdHlwZSkKKwkJCWN0cmxfb2ZmID0gY3QtPnJlZ3MudHlwZTsKKworCXNyY190eXBlX3JlZyA9IHN1bnhpX3NjX25taV9yZWFkKGdjLCBjdHJsX29mZik7CisJc3JjX3R5cGVfcmVnICY9IH5TVU5YSV9OTUlfU1JDX1RZUEVfTUFTSzsKKwlzcmNfdHlwZV9yZWcgfD0gc3JjX3R5cGU7CisJc3VueGlfc2Nfbm1pX3dyaXRlKGdjLCBjdHJsX29mZiwgc3JjX3R5cGVfcmVnKTsKKworCWlycV9nY191bmxvY2soZ2MpOworCisJcmV0dXJuIElSUV9TRVRfTUFTS19PSzsKK30KKworc3RhdGljIGludCBfX2luaXQgc3VueGlfc2Nfbm1pX2lycV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkJc3RydWN0IHN1bnhpX3NjX25taV9yZWdfb2ZmcyAqcmVnX29mZnMpCit7CisJc3RydWN0IGlycV9kb21haW4gKmRvbWFpbjsKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2M7CisJdW5zaWduZWQgaW50IGlycTsKKwl1bnNpZ25lZCBpbnQgY2xyID0gSVJRX05PUkVRVUVTVCB8IElSUV9OT1BST0JFIHwgSVJRX05PQVVUT0VOOworCWludCByZXQ7CisKKworCWRvbWFpbiA9IGlycV9kb21haW5fYWRkX2xpbmVhcihub2RlLCAxLCAmaXJxX2dlbmVyaWNfY2hpcF9vcHMsIE5VTEwpOworCWlmICghZG9tYWluKSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCByZWdpc3RlciBpbnRlcnJ1cHQgZG9tYWluLlxuIiwgbm9kZS0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldCA9IGlycV9hbGxvY19kb21haW5fZ2VuZXJpY19jaGlwcyhkb21haW4sIDEsIDIsIG5vZGUtPm5hbWUsCisJCQkJCSAgICAgaGFuZGxlX2Zhc3Rlb2lfaXJxLCBjbHIsIDAsCisJCQkJCSAgICAgSVJRX0dDX0lOSVRfTUFTS19DQUNIRSk7CisJaWYgKHJldCkgeworCQkgcHJfZXJyKCIlczogQ291bGQgbm90IGFsbG9jYXRlIGdlbmVyaWMgaW50ZXJydXB0IGNoaXAuXG4iLAorCQkJIG5vZGUtPm5hbWUpOworCQkgZ290byBmYWlsX2lycWRfcmVtb3ZlOworCX0KKworCWlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5vZGUsIDApOworCWlmIChpcnEgPD0gMCkgeworCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gcGFyc2UgaXJxXG4iLCBub2RlLT5uYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2lycWRfcmVtb3ZlOworCX0KKworCWdjID0gaXJxX2dldF9kb21haW5fZ2VuZXJpY19jaGlwKGRvbWFpbiwgMCk7CisJZ2MtPnJlZ19iYXNlID0gb2ZfaW9tYXAobm9kZSwgMCk7CisJaWYgKCFnYy0+cmVnX2Jhc2UpIHsKKwkJcHJfZXJyKCIlczogdW5hYmxlIHRvIG1hcCByZXNvdXJjZVxuIiwgbm9kZS0+bmFtZSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9pcnFkX3JlbW92ZTsKKwl9CisKKwlnYy0+Y2hpcF90eXBlc1swXS50eXBlCQkJPSBJUlFfVFlQRV9MRVZFTF9NQVNLOworCWdjLT5jaGlwX3R5cGVzWzBdLmNoaXAuaXJxX21hc2sJCT0gaXJxX2djX21hc2tfY2xyX2JpdDsKKwlnYy0+Y2hpcF90eXBlc1swXS5jaGlwLmlycV91bm1hc2sJPSBpcnFfZ2NfbWFza19zZXRfYml0OworCWdjLT5jaGlwX3R5cGVzWzBdLmNoaXAuaXJxX2VvaQkJPSBpcnFfZ2NfYWNrX3NldF9iaXQ7CisJZ2MtPmNoaXBfdHlwZXNbMF0uY2hpcC5pcnFfc2V0X3R5cGUJPSBzdW54aV9zY19ubWlfc2V0X3R5cGU7CisJZ2MtPmNoaXBfdHlwZXNbMF0uY2hpcC5mbGFncwkJPSBJUlFDSElQX0VPSV9USFJFQURFRCB8IElSUUNISVBfRU9JX0lGX0hBTkRMRUQ7CisJZ2MtPmNoaXBfdHlwZXNbMF0ucmVncy5hY2sJCT0gcmVnX29mZnMtPnBlbmQ7CisJZ2MtPmNoaXBfdHlwZXNbMF0ucmVncy5tYXNrCQk9IHJlZ19vZmZzLT5lbmFibGU7CisJZ2MtPmNoaXBfdHlwZXNbMF0ucmVncy50eXBlCQk9IHJlZ19vZmZzLT5jdHJsOworCisJZ2MtPmNoaXBfdHlwZXNbMV0udHlwZQkJCT0gSVJRX1RZUEVfRURHRV9CT1RIOworCWdjLT5jaGlwX3R5cGVzWzFdLmNoaXAubmFtZQkJPSBnYy0+Y2hpcF90eXBlc1swXS5jaGlwLm5hbWU7CisJZ2MtPmNoaXBfdHlwZXNbMV0uY2hpcC5pcnFfYWNrCQk9IGlycV9nY19hY2tfc2V0X2JpdDsKKwlnYy0+Y2hpcF90eXBlc1sxXS5jaGlwLmlycV9tYXNrCQk9IGlycV9nY19tYXNrX2Nscl9iaXQ7CisJZ2MtPmNoaXBfdHlwZXNbMV0uY2hpcC5pcnFfdW5tYXNrCT0gaXJxX2djX21hc2tfc2V0X2JpdDsKKwlnYy0+Y2hpcF90eXBlc1sxXS5jaGlwLmlycV9zZXRfdHlwZQk9IHN1bnhpX3NjX25taV9zZXRfdHlwZTsKKwlnYy0+Y2hpcF90eXBlc1sxXS5yZWdzLmFjawkJPSByZWdfb2Zmcy0+cGVuZDsKKwlnYy0+Y2hpcF90eXBlc1sxXS5yZWdzLm1hc2sJCT0gcmVnX29mZnMtPmVuYWJsZTsKKwlnYy0+Y2hpcF90eXBlc1sxXS5yZWdzLnR5cGUJCT0gcmVnX29mZnMtPmN0cmw7CisJZ2MtPmNoaXBfdHlwZXNbMV0uaGFuZGxlcgkJPSBoYW5kbGVfZWRnZV9pcnE7CisKKwlzdW54aV9zY19ubWlfd3JpdGUoZ2MsIHJlZ19vZmZzLT5lbmFibGUsIDApOworCXN1bnhpX3NjX25taV93cml0ZShnYywgcmVnX29mZnMtPnBlbmQsIDB4MSk7CisKKwlpcnFfc2V0X2hhbmRsZXJfZGF0YShpcnEsIGRvbWFpbik7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoaXJxLCBzdW54aV9zY19ubWlfaGFuZGxlX2lycSk7CisKKwlyZXR1cm4gMDsKKworZmFpbF9pcnFkX3JlbW92ZToKKwlpcnFfZG9tYWluX3JlbW92ZShkb21haW4pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2luaXQgc3VuNmlfc2Nfbm1pX2lycV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQpCit7CisJcmV0dXJuIHN1bnhpX3NjX25taV9pcnFfaW5pdChub2RlLCAmc3VuNmlfcmVnX29mZnMpOworfQorSVJRQ0hJUF9ERUNMQVJFKHN1bjZpX3NjX25taSwgImFsbHdpbm5lcixzdW42aS1hMzEtc2Mtbm1pIiwgc3VuNmlfc2Nfbm1pX2lycV9pbml0KTsKKworc3RhdGljIGludCBfX2luaXQgc3VuN2lfc2Nfbm1pX2lycV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQpCit7CisJcmV0dXJuIHN1bnhpX3NjX25taV9pcnFfaW5pdChub2RlLCAmc3VuN2lfcmVnX29mZnMpOworfQorSVJRQ0hJUF9ERUNMQVJFKHN1bjdpX3NjX25taSwgImFsbHdpbm5lcixzdW43aS1hMjAtc2Mtbm1pIiwgc3VuN2lfc2Nfbm1pX2lycV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtdmljLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXZpYy5jCmluZGV4IDhlMjFhZTAuLjQ3M2YwOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtdmljLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS12aWMuYwpAQCAtMjI4LDcgKzIyOCw3IEBACiAgKiBLZWVwIGl0ZXJhdGluZyBvdmVyIGFsbCByZWdpc3RlcmVkIFZJQydzIHVudGlsIHRoZXJlIGFyZSBubyBwZW5kaW5nCiAgKiBpbnRlcnJ1cHRzLgogICovCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSB2aWNfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSB2aWNfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgaSwgaGFuZGxlZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS12dDg1MDAuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtdnQ4NTAwLmMKaW5kZXggMTg0NmU3ZC4uZWI2ZTkxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS12dDg1MDAuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXZ0ODUwMC5jCkBAIC0xNzgsOCArMTc4LDcgQEAKIAkueGxhdGUgPSBpcnFfZG9tYWluX3hsYXRlX29uZWNlbGwsCiB9OwogCi1zdGF0aWMgYXNtbGlua2FnZQotdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgdnQ4NTAwX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgdnQ4NTAwX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdTMyIHN0YXQsIGk7CiAJaW50IGlycW5yLCB2aXJxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS14dGVuc2EtbXguYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEteHRlbnNhLW14LmMKaW5kZXggZjY5M2YxYi4uZTFjMmY5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS14dGVuc2EtbXguYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXh0ZW5zYS1teC5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIHN0YXRpYyBpbnQgeHRlbnNhX214X2lycV9zZXRfYWZmaW5pdHkoc3RydWN0IGlycV9kYXRhICpkLAogCQljb25zdCBzdHJ1Y3QgY3B1bWFzayAqZGVzdCwgYm9vbCBmb3JjZSkKIHsKLQl1bnNpZ25lZCBtYXNrID0gMXUgPDwgY3B1bWFza19hbnkoZGVzdCk7CisJdW5zaWduZWQgbWFzayA9IDF1IDw8IGNwdW1hc2tfYW55X2FuZChkZXN0LCBjcHVfb25saW5lX21hc2spOwogCiAJc2V0X2VyKG1hc2ssIE1JUk9VVChkLT5od2lycSAtIEhXX0lSUV9NWF9CQVNFKSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLXpldmlvLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXpldmlvLmMKaW5kZXggOGVkMDRjNC4uY2ViM2E0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS16ZXZpby5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtemV2aW8uYwpAQCAtNTAsNyArNTAsNyBAQAogCXJlYWRsKGdjLT5yZWdfYmFzZSArIHJlZ3MtPmFjayk7CiB9CiAKLXN0YXRpYyBhc21saW5rYWdlIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IHpldmlvX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgemV2aW9faGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgaXJxbnI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnFjaGlwLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxY2hpcC5jCmluZGV4IGY0OTZhZmMuLmNhZDNlMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnFjaGlwLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycWNoaXAuYwpAQCAtMTAsOCArMTAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgotCi0jaW5jbHVkZSAiaXJxY2hpcC5oIgorI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAuaD4KIAogLyoKICAqIFRoaXMgc3BlY2lhbCBvZl9kZXZpY2VfaWQgaXMgdGhlIHNlbnRpbmVsIGF0IHRoZSBlbmQgb2YgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21jYi9LY29uZmlnIGIvZHJpdmVycy9tY2IvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWE2OTc2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tY2IvS2NvbmZpZwpAQCAtMCwwICsxLDMxIEBACisjCisjIE1FTiBDaGFtZWxlb24gQnVzIChNQ0IpIHN1cHBvcnQKKyMKKworbWVudWNvbmZpZyBNQ0IKKwkgICB0cmlzdGF0ZSAiTUNCIHN1cHBvcnQiCisJICAgZGVmYXVsdCBuCisJICAgZGVwZW5kcyBvbiBIQVNfSU9NRU0KKwkgICBoZWxwCisKKwkgICBUaGUgTUNCIChNRU4gQ2hhbWVsZW9uIEJ1cykgaXMgYSBCdXMgc3BlY2lmaWMgdG8gTUVOIE1pa3JvZWxla3Ryb25paworCSAgIEZQR0EgYmFzZWQgZGV2aWNlcy4gSXQgaXMgdXNlZCB0byBpZGVudGlmeSBNQ0IgYmFzZWQgSVAtQ29yZXMgd2l0aGluCisJICAgYW4gRlBHQSBhbmQgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGZyYW1ld29yayBmb3IgaW5zdGFudGlhdGluZyBkcml2ZXJzCisJICAgZm9yIHRoZXNlIGRldmljZXMuCisKKwkgICBJZiBidWlsZCBhcyBhIG1vZHVsZSwgdGhlIG1vZHVsZSBpcyBjYWxsZWQgbWNiLmtvCisKK2lmIE1DQgorY29uZmlnIE1DQl9QQ0kKKwkgICB0cmlzdGF0ZSAiUENJIGJhc2VkIE1DQiBjYXJyaWVyIgorCSAgIGRlZmF1bHQgbgorCSAgIGRlcGVuZHMgb24gUENJCisJICAgaGVscAorCisJICAgVGhpcyBpcyBhIE1DQiBjYXJyaWVyIG9uIGEgUENJIGRldmljZS4gQm90aCBQQ0kgYXR0YWNoZWQgb24tYm9hcmQKKwkgICBGUEdBcyBhcyB3ZWxsIGFzIENvbXBhY3RQQ0kgYXR0YWNoZWQgTUNCIEZQR0FzIGFyZSBzdXBwb3J0ZWQgd2l0aAorCSAgIHRoaXMgZHJpdmVyLgorCisJICAgSWYgYnVpbGQgYXMgYSBtb2R1bGUsIHRoZSBtb2R1bGUgaXMgY2FsbGVkIG1jYi1wY2kua28KKworZW5kaWYgIyBNQ0IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWNiL01ha2VmaWxlIGIvZHJpdmVycy9tY2IvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFlMTQxMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWNiL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorCitvYmotJChDT05GSUdfTUNCKSArPSBtY2IubworCittY2IteSArPSBtY2ItY29yZS5vCittY2IteSArPSBtY2ItcGFyc2UubworCitvYmotJChDT05GSUdfTUNCX1BDSSkgKz0gbWNiLXBjaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21jYi9tY2ItY29yZS5jIGIvZHJpdmVycy9tY2IvbWNiLWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmUxMjkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tY2IvbWNiLWNvcmUuYwpAQCAtMCwwICsxLDQxNCBAQAorLyoKKyAqIE1FTiBDaGFtZWxlb24gQnVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBNRU4gTWlrcm9lbGVrdHJvbmlrIEdtYkggKHd3dy5tZW4uZGUpCisgKiBBdXRob3I6IEpvaGFubmVzIFRodW1zaGlybiA8am9oYW5uZXMudGh1bXNoaXJuQG1lbi5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L21jYi5oPgorCitzdGF0aWMgREVGSU5FX0lEQShtY2JfaWRhKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtY2JfZGV2aWNlX2lkICptY2JfbWF0Y2hfaWQoY29uc3Qgc3RydWN0IG1jYl9kZXZpY2VfaWQgKmlkcywKKwkJCQkJCXN0cnVjdCBtY2JfZGV2aWNlICpkZXYpCit7CisJaWYgKGlkcykgeworCQl3aGlsZSAoaWRzLT5kZXZpY2UpIHsKKwkJCWlmIChpZHMtPmRldmljZSA9PSBkZXYtPmlkKQorCQkJCXJldHVybiBpZHM7CisJCQlpZHMrKzsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IG1jYl9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJc3RydWN0IG1jYl9kcml2ZXIgKm1kcnYgPSB0b19tY2JfZHJpdmVyKGRydik7CisJc3RydWN0IG1jYl9kZXZpY2UgKm1kZXYgPSB0b19tY2JfZGV2aWNlKGRldik7CisJY29uc3Qgc3RydWN0IG1jYl9kZXZpY2VfaWQgKmZvdW5kX2lkOworCisJZm91bmRfaWQgPSBtY2JfbWF0Y2hfaWQobWRydi0+aWRfdGFibGUsIG1kZXYpOworCWlmIChmb3VuZF9pZCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtY2JfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQoreworCXN0cnVjdCBtY2JfZGV2aWNlICptZGV2ID0gdG9fbWNiX2RldmljZShkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBhZGRfdWV2ZW50X3ZhcihlbnYsICJNT0RBTElBUz1tY2I6MTZ6JTAzZCIsIG1kZXYtPmlkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1jYl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1jYl9kcml2ZXIgKm1kcnYgPSB0b19tY2JfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlzdHJ1Y3QgbWNiX2RldmljZSAqbWRldiA9IHRvX21jYl9kZXZpY2UoZGV2KTsKKwljb25zdCBzdHJ1Y3QgbWNiX2RldmljZV9pZCAqZm91bmRfaWQ7CisKKwlmb3VuZF9pZCA9IG1jYl9tYXRjaF9pZChtZHJ2LT5pZF90YWJsZSwgbWRldik7CisJaWYgKCFmb3VuZF9pZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gbWRydi0+cHJvYmUobWRldiwgZm91bmRfaWQpOworfQorCitzdGF0aWMgaW50IG1jYl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtY2JfZHJpdmVyICptZHJ2ID0gdG9fbWNiX2RyaXZlcihkZXYtPmRyaXZlcik7CisJc3RydWN0IG1jYl9kZXZpY2UgKm1kZXYgPSB0b19tY2JfZGV2aWNlKGRldik7CisKKwltZHJ2LT5yZW1vdmUobWRldik7CisKKwlwdXRfZGV2aWNlKCZtZGV2LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1jYl9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1jYl9kZXZpY2UgKm1kZXYgPSB0b19tY2JfZGV2aWNlKGRldik7CisJc3RydWN0IG1jYl9kcml2ZXIgKm1kcnYgPSBtZGV2LT5kcml2ZXI7CisKKwlpZiAobWRydiAmJiBtZHJ2LT5zaHV0ZG93bikKKwkJbWRydi0+c2h1dGRvd24obWRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgbWNiX2J1c190eXBlID0geworCS5uYW1lID0gIm1jYiIsCisJLm1hdGNoID0gbWNiX21hdGNoLAorCS51ZXZlbnQgPSBtY2JfdWV2ZW50LAorCS5wcm9iZSA9IG1jYl9wcm9iZSwKKwkucmVtb3ZlID0gbWNiX3JlbW92ZSwKKwkuc2h1dGRvd24gPSBtY2Jfc2h1dGRvd24sCit9OworCisvKioKKyAqIF9fbWNiX3JlZ2lzdGVyX2RyaXZlcigpIC0gUmVnaXN0ZXIgYSBAbWNiX2RyaXZlciBhdCB0aGUgc3lzdGVtCisgKiBAZHJ2OiBUaGUgQG1jYl9kcml2ZXIKKyAqIEBvd25lcjogVGhlIEBtY2JfZHJpdmVyJ3MgbW9kdWxlCisgKiBAbW9kX25hbWU6IFRoZSBuYW1lIG9mIHRoZSBAbWNiX2RyaXZlcidzIG1vZHVsZQorICoKKyAqIFJlZ2lzdGVyIGEgQG1jYl9kcml2ZXIgYXQgdGhlIHN5c3RlbS4gUGVyZm9ybSBzb21lIHNhbml0eSBjaGVja3MsIGlmCisgKiB0aGUgLnByb2JlIGFuZCAucmVtb3ZlIG1ldGhvZHMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBkcml2ZXIuCisgKi8KK2ludCBfX21jYl9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IG1jYl9kcml2ZXIgKmRydiwgc3RydWN0IG1vZHVsZSAqb3duZXIsCisJCQljb25zdCBjaGFyICptb2RfbmFtZSkKK3sKKwlpZiAoIWRydi0+cHJvYmUgfHwgIWRydi0+cmVtb3ZlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRydi0+ZHJpdmVyLm93bmVyID0gb3duZXI7CisJZHJ2LT5kcml2ZXIuYnVzID0gJm1jYl9idXNfdHlwZTsKKwlkcnYtPmRyaXZlci5tb2RfbmFtZSA9IG1vZF9uYW1lOworCisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19tY2JfcmVnaXN0ZXJfZHJpdmVyKTsKKworLyoqCisgKiBtY2JfdW5yZWdpc3Rlcl9kcml2ZXIoKSAtIFVucmVnaXN0ZXIgYSBAbWNiX2RyaXZlciBmcm9tIHRoZSBzeXN0ZW0KKyAqIEBkcnY6IFRoZSBAbWNiX2RyaXZlcgorICoKKyAqIFVucmVnaXN0ZXIgYSBAbWNiX2RyaXZlciBmcm9tIHRoZSBzeXN0ZW0uCisgKi8KK3ZvaWQgbWNiX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBtY2JfZHJpdmVyICpkcnYpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1jYl91bnJlZ2lzdGVyX2RyaXZlcik7CisKK3N0YXRpYyB2b2lkIG1jYl9yZWxlYXNlX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1jYl9kZXZpY2UgKm1kZXYgPSB0b19tY2JfZGV2aWNlKGRldik7CisKKwltY2JfYnVzX3B1dChtZGV2LT5idXMpOworCWtmcmVlKG1kZXYpOworfQorCisvKioKKyAqIG1jYl9kZXZpY2VfcmVnaXN0ZXIoKSAtIFJlZ2lzdGVyIGEgbWNiX2RldmljZQorICogQGJ1czogVGhlIEBtY2JfYnVzIG9mIHRoZSBkZXZpY2UKKyAqIEBkZXY6IFRoZSBAbWNiX2RldmljZQorICoKKyAqIFJlZ2lzdGVyIGEgc3BlY2lmaWMgQG1jYl9kZXZpY2UgYXQgYSBAbWNiX2J1cyBhbmQgdGhlIHN5c3RlbSBpdHNlbGYuCisgKi8KK2ludCBtY2JfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBtY2JfYnVzICpidXMsIHN0cnVjdCBtY2JfZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwlpbnQgZGV2aWNlX2lkOworCisJZGV2aWNlX2luaXRpYWxpemUoJmRldi0+ZGV2KTsKKwlkZXYtPmRldi5idXMgPSAmbWNiX2J1c190eXBlOworCWRldi0+ZGV2LnBhcmVudCA9IGJ1cy0+ZGV2LnBhcmVudDsKKwlkZXYtPmRldi5yZWxlYXNlID0gbWNiX3JlbGVhc2VfZGV2OworCisJZGV2aWNlX2lkID0gZGV2LT5pZDsKKwlkZXZfc2V0X25hbWUoJmRldi0+ZGV2LCAibWNiJWQtMTZ6JTAzZC0lZDolZDolZCIsCisJCWJ1cy0+YnVzX25yLCBkZXZpY2VfaWQsIGRldi0+aW5zdCwgZGV2LT5ncm91cCwgZGV2LT52YXIpOworCisJcmV0ID0gZGV2aWNlX2FkZCgmZGV2LT5kZXYpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiRmFpbGVkIHJlZ2lzdGVyaW5nIGRldmljZSAxNnolMDNkIG9uIGJ1cyBtY2IlZCAoJWQpXG4iLAorCQkJZGV2aWNlX2lkLCBidXMtPmJ1c19uciwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0dXJuIDA7CisKK291dDoKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtY2JfZGV2aWNlX3JlZ2lzdGVyKTsKKworLyoqCisgKiBtY2JfYWxsb2NfYnVzKCkgLSBBbGxvY2F0ZSBhIG5ldyBAbWNiX2J1cworICoKKyAqIEFsbG9jYXRlIGEgbmV3IEBtY2JfYnVzLgorICovCitzdHJ1Y3QgbWNiX2J1cyAqbWNiX2FsbG9jX2J1cyh2b2lkKQoreworCXN0cnVjdCBtY2JfYnVzICpidXM7CisJaW50IGJ1c19ucjsKKworCWJ1cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtY2JfYnVzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidXMpCisJCXJldHVybiBOVUxMOworCisJYnVzX25yID0gaWRhX3NpbXBsZV9nZXQoJm1jYl9pZGEsIDAsIDAsIEdGUF9LRVJORUwpOworCWlmIChidXNfbnIgPCAwKSB7CisJCWtmcmVlKGJ1cyk7CisJCXJldHVybiBFUlJfUFRSKGJ1c19ucik7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJmJ1cy0+Y2hpbGRyZW4pOworCWJ1cy0+YnVzX25yID0gYnVzX25yOworCisJcmV0dXJuIGJ1czsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1jYl9hbGxvY19idXMpOworCitzdGF0aWMgaW50IF9fbWNiX2RldmljZXNfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWNiX2RldmljZXNfdW5yZWdpc3RlcihzdHJ1Y3QgbWNiX2J1cyAqYnVzKQoreworCWJ1c19mb3JfZWFjaF9kZXYoJm1jYl9idXNfdHlwZSwgTlVMTCwgTlVMTCwgX19tY2JfZGV2aWNlc191bnJlZ2lzdGVyKTsKK30KKy8qKgorICogbWNiX3JlbGVhc2VfYnVzKCkgLSBGcmVlIGEgQG1jYl9idXMKKyAqIEBidXM6IFRoZSBAbWNiX2J1cyB0byByZWxlYXNlCisgKgorICogUmVsZWFzZSBhbiBhbGxvY2F0ZWQgQG1jYl9idXMgZnJvbSB0aGUgc3lzdGVtLgorICovCit2b2lkIG1jYl9yZWxlYXNlX2J1cyhzdHJ1Y3QgbWNiX2J1cyAqYnVzKQoreworCW1jYl9kZXZpY2VzX3VucmVnaXN0ZXIoYnVzKTsKKworCWlkYV9zaW1wbGVfcmVtb3ZlKCZtY2JfaWRhLCBidXMtPmJ1c19ucik7CisKKwlrZnJlZShidXMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobWNiX3JlbGVhc2VfYnVzKTsKKworLyoqCisgKiBtY2JfYnVzX3B1dCgpIC0gSW5jcmVtZW50IHJlZmNudAorICogQGJ1czogVGhlIEBtY2JfYnVzCisgKgorICogR2V0IGEgQG1jYl9idXMnIHJlZgorICovCitzdHJ1Y3QgbWNiX2J1cyAqbWNiX2J1c19nZXQoc3RydWN0IG1jYl9idXMgKmJ1cykKK3sKKwlpZiAoYnVzKQorCQlnZXRfZGV2aWNlKCZidXMtPmRldik7CisKKwlyZXR1cm4gYnVzOworfQorRVhQT1JUX1NZTUJPTF9HUEwobWNiX2J1c19nZXQpOworCisvKioKKyAqIG1jYl9idXNfcHV0KCkgLSBEZWNyZW1lbnQgcmVmY250CisgKiBAYnVzOiBUaGUgQG1jYl9idXMKKyAqCisgKiBSZWxlYXNlIGEgQG1jYl9idXMnIHJlZgorICovCit2b2lkIG1jYl9idXNfcHV0KHN0cnVjdCBtY2JfYnVzICpidXMpCit7CisJaWYgKGJ1cykKKwkJcHV0X2RldmljZSgmYnVzLT5kZXYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobWNiX2J1c19wdXQpOworCisvKioKKyAqIG1jYl9hbGxvY19kZXYoKSAtIEFsbG9jYXRlIGEgZGV2aWNlCisgKiBAYnVzOiBUaGUgQG1jYl9idXMgdGhlIGRldmljZSBpcyBwYXJ0IG9mCisgKgorICogQWxsb2NhdGUgYSBAbWNiX2RldmljZSBhbmQgYWRkIGJ1cy4KKyAqLworc3RydWN0IG1jYl9kZXZpY2UgKm1jYl9hbGxvY19kZXYoc3RydWN0IG1jYl9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgbWNiX2RldmljZSAqZGV2OworCisJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1jYl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIE5VTEw7CisKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5idXNfbGlzdCk7CisJZGV2LT5idXMgPSBidXM7CisKKwlyZXR1cm4gZGV2OworfQorRVhQT1JUX1NZTUJPTF9HUEwobWNiX2FsbG9jX2Rldik7CisKKy8qKgorICogbWNiX2ZyZWVfZGV2KCkgLSBGcmVlIEBtY2JfZGV2aWNlCisgKiBAZGV2OiBUaGUgZGV2aWNlIHRvIGZyZWUKKyAqCisgKiBGcmVlIGEgQG1jYl9kZXZpY2UKKyAqLwordm9pZCBtY2JfZnJlZV9kZXYoc3RydWN0IG1jYl9kZXZpY2UgKmRldikKK3sKKwlrZnJlZShkZXYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobWNiX2ZyZWVfZGV2KTsKKworc3RhdGljIGludCBfX21jYl9idXNfYWRkX2RldmljZXMoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBtY2JfZGV2aWNlICptZGV2ID0gdG9fbWNiX2RldmljZShkZXYpOworCWludCByZXR2YWw7CisKKwlpZiAobWRldi0+aXNfYWRkZWQpCisJCXJldHVybiAwOworCisJcmV0dmFsID0gZGV2aWNlX2F0dGFjaChkZXYpOworCWlmIChyZXR2YWwgPCAwKQorCQlkZXZfZXJyKGRldiwgIkVycm9yIGFkZGluZyBkZXZpY2UgKCVkKVxuIiwgcmV0dmFsKTsKKworCW1kZXYtPmlzX2FkZGVkID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fbWNiX2J1c19hZGRfY2hpbGQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBtY2JfZGV2aWNlICptZGV2ID0gdG9fbWNiX2RldmljZShkZXYpOworCXN0cnVjdCBtY2JfYnVzICpjaGlsZDsKKworCUJVR19PTighbWRldi0+aXNfYWRkZWQpOworCWNoaWxkID0gbWRldi0+c3Vib3JkaW5hdGU7CisKKwlpZiAoY2hpbGQpCisJCW1jYl9idXNfYWRkX2RldmljZXMoY2hpbGQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbWNiX2J1c19hZGRfZGV2aWNlcygpIC0gQWRkIGRldmljZXMgaW4gdGhlIGJ1cycgaW50ZXJuYWwgZGV2aWNlIGxpc3QKKyAqIEBidXM6IFRoZSBAbWNiX2J1cyB3ZSBhZGQgdGhlIGRldmljZXMKKyAqCisgKiBBZGQgZGV2aWNlcyBpbiB0aGUgYnVzJyBpbnRlcm5hbCBkZXZpY2UgbGlzdCB0byB0aGUgc3lzdGVtLgorICovCit2b2lkIG1jYl9idXNfYWRkX2RldmljZXMoY29uc3Qgc3RydWN0IG1jYl9idXMgKmJ1cykKK3sKKwlidXNfZm9yX2VhY2hfZGV2KCZtY2JfYnVzX3R5cGUsIE5VTEwsIE5VTEwsIF9fbWNiX2J1c19hZGRfZGV2aWNlcyk7CisJYnVzX2Zvcl9lYWNoX2RldigmbWNiX2J1c190eXBlLCBOVUxMLCBOVUxMLCBfX21jYl9idXNfYWRkX2NoaWxkKTsKKworfQorRVhQT1JUX1NZTUJPTF9HUEwobWNiX2J1c19hZGRfZGV2aWNlcyk7CisKKy8qKgorICogbWNiX3JlcXVlc3RfbWVtKCkgLSBSZXF1ZXN0IG1lbW9yeQorICogQGRldjogVGhlIEBtY2JfZGV2aWNlIHRoZSBtZW1vcnkgaXMgZm9yCisgKiBAbmFtZTogVGhlIG5hbWUgZm9yIHRoZSBtZW1vcnkgcmVmZXJlbmNlLgorICoKKyAqIFJlcXVlc3QgbWVtb3J5IGZvciBhIEBtY2JfZGV2aWNlLiBJZiBAbmFtZSBpcyBOVUxMIHRoZSBkcml2ZXIgbmFtZSB3aWxsCisgKiBiZSB1c2VkLgorICovCitzdHJ1Y3QgcmVzb3VyY2UgKm1jYl9yZXF1ZXN0X21lbShzdHJ1Y3QgbWNiX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCByZXNvdXJjZSAqbWVtOworCXUzMiBzaXplOworCisJaWYgKCFuYW1lKQorCQluYW1lID0gZGV2LT5kZXYuZHJpdmVyLT5uYW1lOworCisJc2l6ZSA9IHJlc291cmNlX3NpemUoJmRldi0+bWVtKTsKKworCW1lbSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihkZXYtPm1lbS5zdGFydCwgc2l6ZSwgbmFtZSk7CisJaWYgKCFtZW0pCisJCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7CisKKwlyZXR1cm4gbWVtOworfQorRVhQT1JUX1NZTUJPTF9HUEwobWNiX3JlcXVlc3RfbWVtKTsKKworLyoqCisgKiBtY2JfcmVsZWFzZV9tZW0oKSAtIFJlbGVhc2UgbWVtb3J5IHJlcXVlc3RlZCBieSBkZXZpY2UKKyAqIEBkZXY6IFRoZSBAbWNiX2RldmljZSB0aGF0IHJlcXVlc3RlZCB0aGUgbWVtb3J5CisgKgorICogUmVsZWFzZSBtZW1vcnkgdGhhdCB3YXMgcHJpb3IgcmVxdWVzdGVkIHZpYSBAbWNiX3JlcXVlc3RfbWVtKCkuCisgKi8KK3ZvaWQgbWNiX3JlbGVhc2VfbWVtKHN0cnVjdCByZXNvdXJjZSAqbWVtKQoreworCXUzMiBzaXplOworCisJc2l6ZSA9IHJlc291cmNlX3NpemUobWVtKTsKKwlyZWxlYXNlX21lbV9yZWdpb24obWVtLT5zdGFydCwgc2l6ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtY2JfcmVsZWFzZV9tZW0pOworCisvKioKKyAqIG1jYl9nZXRfaXJxKCkgLSBHZXQgZGV2aWNlJ3MgSVJRIG51bWJlcgorICogQGRldjogVGhlIEBtY2JfZGV2aWNlIHRoZSBJUlEgaXMgZm9yCisgKgorICogR2V0IHRoZSBJUlEgbnVtYmVyIG9mIGEgZ2l2ZW4gQG1jYl9kZXZpY2UuCisgKi8KK2ludCBtY2JfZ2V0X2lycShzdHJ1Y3QgbWNiX2RldmljZSAqZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqaXJxID0gJmRldi0+aXJxOworCisJcmV0dXJuIGlycS0+c3RhcnQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtY2JfZ2V0X2lycSk7CisKK3N0YXRpYyBpbnQgbWNiX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gYnVzX3JlZ2lzdGVyKCZtY2JfYnVzX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBtY2JfZXhpdCh2b2lkKQoreworCWJ1c191bnJlZ2lzdGVyKCZtY2JfYnVzX3R5cGUpOworfQorCisvKiBtY2IgbXVzdCBiZSBpbml0aWFsaXplZCBhZnRlciBQQ0kgYnV0IGJlZm9yZSB0aGUgY2hhbWVsZW9uIGRyaXZlcnMuCisgKiBUaGF0IG1lYW5zIHdlIG11c3QgdXNlIHNvbWUgaW5pdGNhbGwgYmV0d2VlbiBzdWJzeXNfaW5pdGNhbGwgYW5kCisgKiBkZXZpY2VfaW5pdGNhbGwuCisgKi8KK2ZzX2luaXRjYWxsKG1jYl9pbml0KTsKK21vZHVsZV9leGl0KG1jYl9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJNRU4gQ2hhbWVsZW9uIEJ1cyBEcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkpvaGFubmVzIFRodW1zaGlybiA8am9oYW5uZXMudGh1bXNoaXJuQG1lbi5kZT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWNiL21jYi1pbnRlcm5hbC5oIGIvZHJpdmVycy9tY2IvbWNiLWludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1NmVmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWNiL21jYi1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTE4IEBACisjaWZuZGVmIF9fTUNCX0lOVEVSTkFMCisjZGVmaW5lIF9fTUNCX0lOVEVSTkFMCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTUVOCQkweDFhODgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRU5fQ0hBTUVMRU9OCTB4NGQ0NQorI2RlZmluZSBDSEFNRUxFT05fRklMRU5BTUVfTEVOCQkxMgorI2RlZmluZSBDSEFNRUxFT05WMl9NQUdJQwkJMHhhYmNlCisKK2VudW0gY2hhbWVsZW9uX2Rlc2NyaXB0b3JfdHlwZSB7CisJQ0hBTUVMRU9OX0RUWVBFX0dFTkVSQUwgPSAweDAsCisJQ0hBTUVMRU9OX0RUWVBFX0JSSURHRSA9IDB4MSwKKwlDSEFNRUxFT05fRFRZUEVfQ1BVID0gMHgyLAorCUNIQU1FTEVPTl9EVFlQRV9CQVIgPSAweDMsCisJQ0hBTUVMRU9OX0RUWVBFX0VORCA9IDB4ZiwKK307CisKK2VudW0gY2hhbWVsZW9uX2J1c190eXBlIHsKKwlDSEFNRUxFT05fQlVTX1dJU0hCT05FLAorCUNIQU1FTEVPTl9CVVNfQVZBTE9OLAorCUNIQU1FTEVPTl9CVVNfTFBDLAorCUNIQU1FTEVPTl9CVVNfSVNBLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgY2hhbWVsZW9uX2ZwZ2FfaGVhZGVyCisgKgorICogQHJldmlzaW9uOglSZXZpc29uIG9mIENoYW1lbGVvbiB0YWJsZSBpbiBGUEdBCisgKiBAbW9kZWw6CUNoYW1lbGVvbiB0YWJsZSBtb2RlbCBBU0NJSSBjaGFyCisgKiBAbWlub3I6CVJldmlzaW9uIG1pbm9yCisgKiBAYnVzX3R5cGU6CUJ1cyB0eXBlICh1c3VhbGx5ICVDSEFNRUxFT05fQlVTX1dJU0hCT05FKQorICogQG1hZ2ljOglDaGFtZWxlb24gaGVhZGVyIG1hZ2ljIG51bWJlciAoMHhhYmNlIGZvciB2ZXJzaW9uIDIpCisgKiBAcmVzZXJ2ZWQ6CVJlc2VydmVkCisgKiBAZmlsZW5hbWU6CUZpbGVuYW1lIG9mIEZQR0EgYml0c3RyZWFtCisgKi8KK3N0cnVjdCBjaGFtZWxlb25fZnBnYV9oZWFkZXIgeworCXU4IHJldmlzaW9uOworCWNoYXIgbW9kZWw7CisJdTggbWlub3I7CisJdTggYnVzX3R5cGU7CisJdTE2IG1hZ2ljOworCXUxNiByZXNlcnZlZDsKKwkvKiBUaGlzIG9uZSBoYXMgbm8gJ1wwJyBhdCB0aGUgZW5kISEhICovCisJY2hhciBmaWxlbmFtZVtDSEFNRUxFT05fRklMRU5BTUVfTEVOXTsKK30gX19wYWNrZWQ7CisjZGVmaW5lIEhFQURFUl9NQUdJQ19PRkZTRVQgMHg0CisKKy8qKgorICogc3RydWN0IGNoYW1lbGVvbl9nZGQgLSBDaGFtZWxlb24gR2VuZXJhbCBEZXZpY2UgRGVzY3JpcHRvcgorICoKKyAqIEBpcnE6CXRoZSBwb3NpdGlvbiBpbiB0aGUgRlBHQSdzIElSUSBjb250cm9sbGVyIHZlY3RvcgorICogQHJldjoJdGhlIHJldmlzaW9uIG9mIHRoZSB2YXJpYW50J3MgaW1wbGVtZW50YXRpb24KKyAqIEB2YXI6CXRoZSB2YXJpYW50IG9mIHRoZSBJUCBjb3JlCisgKiBAZGV2Ogl0aGUgZGV2aWNlICB0aGUgSVAgY29yZSBpcworICogQGR0eXBlOglkZXZpY2UgZGVzY3JpcHRvciB0eXBlCisgKiBAYmFyOglCQVIgb2Zmc2V0IHRoYXQgbXVzdCBiZSBhZGRlZCB0byBtb2R1bGUgb2Zmc2V0CisgKiBAaW5zdDoJdGhlIGluc3RhbmNlIG51bWJlciBvZiB0aGUgZGV2aWNlLCAwIGlzIGZpcnN0IGluc3RhbmNlCisgKiBAZ3JvdXA6CXRoZSBncm91cCB0aGUgZGV2aWNlIGJlbG9uZ3MgdG8gKDAgPSBubyBncm91cCkKKyAqIEByZXNlcnZlZDoJcmVzZXJ2ZWQKKyAqIEBvZmZzZXQ6CWJlZ2lubmluZyBvZiB0aGUgYWRkcmVzcyB3aW5kb3cgb2YgZGVzaXJlZCBtb2R1bGUKKyAqIEBzaXplOglzaXplIG9mIHRoZSBtb2R1bGUncyBhZGRyZXNzIHdpbmRvdworICovCitzdHJ1Y3QgY2hhbWVsZW9uX2dkZCB7CisJX19sZTMyIHJlZzE7CisJX19sZTMyIHJlZzI7CisJX19sZTMyIG9mZnNldDsKKwlfX2xlMzIgc2l6ZTsKKworfSBfX3BhY2tlZDsKKworLyogR0REIFJlZ2lzdGVyIDEgZmllbGRzICovCisjZGVmaW5lIEdERF9JUlEoeCkgKCh4KSAmIDB4MWYpCisjZGVmaW5lIEdERF9SRVYoeCkgKCgoeCkgPj4gNSkgJiAweDNmKQorI2RlZmluZSBHRERfVkFSKHgpICgoKHgpID4+IDExKSAmIDB4M2YpCisjZGVmaW5lIEdERF9ERVYoeCkgKCgoeCkgPj4gMTgpICYgMHgzZmYpCisjZGVmaW5lIEdERF9EVFkoeCkgKCgoeCkgPj4gMjgpICYgMHhmKQorCisvKiBHREQgUmVnaXN0ZXIgMiBmaWVsZHMgKi8KKyNkZWZpbmUgR0REX0JBUih4KSAoKHgpICYgMHg3KQorI2RlZmluZSBHRERfSU5TKHgpICgoKHgpID4+IDMpICYgMHgzZikKKyNkZWZpbmUgR0REX0dSUCh4KSAoKCh4KSA+PiA5KSAmIDB4M2YpCisKKy8qKgorICogc3RydWN0IGNoYW1lbGVvbl9iZGQgLSBDaGFtZWxlb24gQnJpZGdlIERldmljZSBEZXNjcmlwdG9yCisgKgorICogQGlycToJdGhlIHBvc2l0aW9uIGluIHRoZSBGUEdBJ3MgSVJRIGNvbnRyb2xsZXIgdmVjdG9yCisgKiBAcmV2Ogl0aGUgcmV2aXNpb24gb2YgdGhlIHZhcmlhbnQncyBpbXBsZW1lbnRhdGlvbgorICogQHZhcjoJdGhlIHZhcmlhbnQgb2YgdGhlIElQIGNvcmUKKyAqIEBkZXY6CXRoZSBkZXZpY2UgIHRoZSBJUCBjb3JlIGlzCisgKiBAZHR5cGU6CWRldmljZSBkZXNjcmlwdG9yIHR5cGUKKyAqIEBiYXI6CUJBUiBvZmZzZXQgdGhhdCBtdXN0IGJlIGFkZGVkIHRvIG1vZHVsZSBvZmZzZXQKKyAqIEBpbnN0Ogl0aGUgaW5zdGFuY2UgbnVtYmVyIG9mIHRoZSBkZXZpY2UsIDAgaXMgZmlyc3QgaW5zdGFuY2UKKyAqIEBkYmFyOglkZXN0aW5hdGlvbiBiYXIgZnJvbSB0aGUgYnVzIF9iZWhpbmRfIHRoZSBicmlkZ2UKKyAqIEBjaGFtb2ZmOglvZmZzZXQgd2l0aGluIHRoZSBCQVIgb2YgdGhlIHNvdXJjZSBidXMKKyAqIEBvZmZzZXQ6CisgKiBAc2l6ZToKKyAqLworc3RydWN0IGNoYW1lbGVvbl9iZGQgeworCXVuc2lnbmVkIGludCBpcnE6NjsKKwl1bnNpZ25lZCBpbnQgcmV2OjY7CisJdW5zaWduZWQgaW50IHZhcjo2OworCXVuc2lnbmVkIGludCBkZXY6MTA7CisJdW5zaWduZWQgaW50IGR0eXBlOjQ7CisJdW5zaWduZWQgaW50IGJhcjozOworCXVuc2lnbmVkIGludCBpbnN0OjY7CisJdW5zaWduZWQgaW50IGRiYXI6MzsKKwl1bnNpZ25lZCBpbnQgZ3JvdXA6NjsKKwl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWQ6MTQ7CisJdTMyIGNoYW1vZmY7CisJdTMyIG9mZnNldDsKKwl1MzIgc2l6ZTsKK30gX19wYWNrZWQ7CisKK2ludCBjaGFtZWxlb25fcGFyc2VfY2VsbHMoc3RydWN0IG1jYl9idXMgKmJ1cywgcGh5c19hZGRyX3QgbWFwYmFzZSwKKwkJCSAgdm9pZCBfX2lvbWVtICpiYXNlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21jYi9tY2ItcGFyc2UuYyBiL2RyaXZlcnMvbWNiL21jYi1wYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMjc4YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21jYi9tY2ItcGFyc2UuYwpAQCAtMCwwICsxLDE1OSBAQAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbWNiLmg+CisKKyNpbmNsdWRlICJtY2ItaW50ZXJuYWwuaCIKKworc3RydWN0IG1jYl9wYXJzZV9wcml2IHsKKwlwaHlzX2FkZHJfdCBtYXBiYXNlOworCXZvaWQgX19pb21lbSAqYmFzZTsKK307CisKKyNkZWZpbmUgZm9yX2VhY2hfY2hhbWVsZW9uX2NlbGwoZHR5cGUsIHApCVwKKwlmb3IgKChkdHlwZSkgPSBnZXRfbmV4dF9kdHlwZSgocCkpOwlcCisJICAgICAoZHR5cGUpICE9IENIQU1FTEVPTl9EVFlQRV9FTkQ7CVwKKwkgICAgIChkdHlwZSkgPSBnZXRfbmV4dF9kdHlwZSgocCkpKQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGdldF9uZXh0X2R0eXBlKHZvaWQgX19pb21lbSAqcCkKK3sKKwl1aW50MzJfdCBkdHlwZTsKKworCWR0eXBlID0gcmVhZGwocCk7CisJcmV0dXJuIGR0eXBlID4+IDI4OworfQorCitzdGF0aWMgaW50IGNoYW1lbGVvbl9wYXJzZV9iZGQoc3RydWN0IG1jYl9idXMgKmJ1cywKKwkJCXBoeXNfYWRkcl90IG1hcGJhc2UsCisJCQl2b2lkIF9faW9tZW0gKmJhc2UpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hhbWVsZW9uX3BhcnNlX2dkZChzdHJ1Y3QgbWNiX2J1cyAqYnVzLAorCQkJcGh5c19hZGRyX3QgbWFwYmFzZSwKKwkJCXZvaWQgX19pb21lbSAqYmFzZSkKK3sKKwlzdHJ1Y3QgY2hhbWVsZW9uX2dkZCBfX2lvbWVtICpnZGQgPQorCQkoc3RydWN0IGNoYW1lbGVvbl9nZGQgX19pb21lbSAqKSBiYXNlOworCXN0cnVjdCBtY2JfZGV2aWNlICptZGV2OworCXUzMiBvZmZzZXQ7CisJdTMyIHNpemU7CisJaW50IHJldDsKKwlfX2xlMzIgcmVnMTsKKwlfX2xlMzIgcmVnMjsKKworCW1kZXYgPSBtY2JfYWxsb2NfZGV2KGJ1cyk7CisJaWYgKCFtZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlZzEgPSByZWFkbCgmZ2RkLT5yZWcxKTsKKwlyZWcyID0gcmVhZGwoJmdkZC0+cmVnMik7CisJb2Zmc2V0ID0gcmVhZGwoJmdkZC0+b2Zmc2V0KTsKKwlzaXplID0gcmVhZGwoJmdkZC0+c2l6ZSk7CisKKwltZGV2LT5pZCA9IEdERF9ERVYocmVnMSk7CisJbWRldi0+cmV2ID0gR0REX1JFVihyZWcxKTsKKwltZGV2LT52YXIgPSBHRERfVkFSKHJlZzEpOworCW1kZXYtPmJhciA9IEdERF9CQVIocmVnMSk7CisJbWRldi0+Z3JvdXAgPSBHRERfR1JQKHJlZzIpOworCW1kZXYtPmluc3QgPSBHRERfSU5TKHJlZzIpOworCisJcHJfZGVidWcoIkZvdW5kIGEgMTZ6JTAzZFxuIiwgbWRldi0+aWQpOworCisJbWRldi0+aXJxLnN0YXJ0ID0gR0REX0lSUShyZWcxKTsKKwltZGV2LT5pcnEuZW5kID0gR0REX0lSUShyZWcxKTsKKwltZGV2LT5pcnEuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKKworCW1kZXYtPm1lbS5zdGFydCA9IG1hcGJhc2UgKyBvZmZzZXQ7CisJbWRldi0+bWVtLmVuZCA9IG1kZXYtPm1lbS5zdGFydCArIHNpemUgLSAxOworCW1kZXYtPm1lbS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCisJbWRldi0+aXNfYWRkZWQgPSBmYWxzZTsKKworCXJldCA9IG1jYl9kZXZpY2VfcmVnaXN0ZXIoYnVzLCBtZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gMDsKKworZXJyOgorCW1jYl9mcmVlX2RldihtZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBjaGFtZWxlb25fcGFyc2VfY2VsbHMoc3RydWN0IG1jYl9idXMgKmJ1cywgcGh5c19hZGRyX3QgbWFwYmFzZSwKKwkJCXZvaWQgX19pb21lbSAqYmFzZSkKK3sKKwljaGFyIF9faW9tZW0gKnAgPSBiYXNlOworCXN0cnVjdCBjaGFtZWxlb25fZnBnYV9oZWFkZXIgKmhlYWRlcjsKKwl1aW50MzJfdCBkdHlwZTsKKwlpbnQgbnVtX2NlbGxzID0gMDsKKwlpbnQgcmV0ID0gMDsKKwl1MzIgaHNpemU7CisKKwloc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY2hhbWVsZW9uX2ZwZ2FfaGVhZGVyKTsKKworCWhlYWRlciA9IGt6YWxsb2MoaHNpemUsIEdGUF9LRVJORUwpOworCWlmICghaGVhZGVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEV4dHJhY3QgaGVhZGVyIGluZm9ybWF0aW9uICovCisJbWVtY3B5X2Zyb21pbyhoZWFkZXIsIHAsIGhzaXplKTsKKwkvKiBXZSBvbmx5IHN1cHBvcnQgY2hhbWVsZW9uIHYyIGF0IHRoZSBtb21lbnQgKi8KKwloZWFkZXItPm1hZ2ljID0gbGUxNl90b19jcHUoaGVhZGVyLT5tYWdpYyk7CisJaWYgKGhlYWRlci0+bWFnaWMgIT0gQ0hBTUVMRU9OVjJfTUFHSUMpIHsKKwkJcHJfZXJyKCJVbnN1cHBvcnRlZCBjaGFtZWxlb24gdmVyc2lvbiAweCV4XG4iLAorCQkJCWhlYWRlci0+bWFnaWMpOworCQlrZnJlZShoZWFkZXIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcCArPSBoc2l6ZTsKKworCXByX2RlYnVnKCJoZWFkZXItPnJldmlzaW9uID0gJWRcbiIsIGhlYWRlci0+cmV2aXNpb24pOworCXByX2RlYnVnKCJoZWFkZXItPm1vZGVsID0gMHgleCAoJyVjJylcbiIsIGhlYWRlci0+bW9kZWwsCisJCWhlYWRlci0+bW9kZWwpOworCXByX2RlYnVnKCJoZWFkZXItPm1pbm9yID0gJWRcbiIsIGhlYWRlci0+bWlub3IpOworCXByX2RlYnVnKCJoZWFkZXItPmJ1c190eXBlID0gMHgleFxuIiwgaGVhZGVyLT5idXNfdHlwZSk7CisKKworCXByX2RlYnVnKCJoZWFkZXItPm1hZ2ljID0gMHgleFxuIiwgaGVhZGVyLT5tYWdpYyk7CisJcHJfZGVidWcoImhlYWRlci0+ZmlsZW5hbWUgPSBcIiUuKnNcIlxuIiwgQ0hBTUVMRU9OX0ZJTEVOQU1FX0xFTiwKKwkJaGVhZGVyLT5maWxlbmFtZSk7CisKKwlmb3JfZWFjaF9jaGFtZWxlb25fY2VsbChkdHlwZSwgcCkgeworCQlzd2l0Y2ggKGR0eXBlKSB7CisJCWNhc2UgQ0hBTUVMRU9OX0RUWVBFX0dFTkVSQUw6CisJCQlyZXQgPSBjaGFtZWxlb25fcGFyc2VfZ2RkKGJ1cywgbWFwYmFzZSwgcCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCXAgKz0gc2l6ZW9mKHN0cnVjdCBjaGFtZWxlb25fZ2RkKTsKKwkJCWJyZWFrOworCQljYXNlIENIQU1FTEVPTl9EVFlQRV9CUklER0U6CisJCQljaGFtZWxlb25fcGFyc2VfYmRkKGJ1cywgbWFwYmFzZSwgcCk7CisJCQlwICs9IHNpemVvZihzdHJ1Y3QgY2hhbWVsZW9uX2JkZCk7CisJCQlicmVhazsKKwkJY2FzZSBDSEFNRUxFT05fRFRZUEVfRU5EOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIkludmFsaWQgY2hhbWVsZW9uIGRlc2NyaXB0b3IgdHlwZSAweCV4XG4iLAorCQkJCWR0eXBlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW51bV9jZWxscysrOworCX0KKworCWlmIChudW1fY2VsbHMgPT0gMCkKKwkJbnVtX2NlbGxzID0gLUVJTlZBTDsKKworCWtmcmVlKGhlYWRlcik7CisJcmV0dXJuIG51bV9jZWxsczsKKworb3V0OgorCWtmcmVlKGhlYWRlcik7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNoYW1lbGVvbl9wYXJzZV9jZWxscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21jYi9tY2ItcGNpLmMgYi9kcml2ZXJzL21jYi9tY2ItcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTljNzQyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWNiL21jYi1wY2kuYwpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIE1FTiBDaGFtZWxlb24gQnVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBNRU4gTWlrcm9lbGVrdHJvbmlrIEdtYkggKHd3dy5tZW4uZGUpCisgKiBBdXRob3I6IEpvaGFubmVzIFRodW1zaGlybiA8am9oYW5uZXMudGh1bXNoaXJuQG1lbi5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbWNiLmg+CisKKyNpbmNsdWRlICJtY2ItaW50ZXJuYWwuaCIKKworc3RydWN0IHByaXYgeworCXN0cnVjdCBtY2JfYnVzICpidXM7CisJdm9pZCBfX2lvbWVtICpiYXNlOworfTsKKworc3RhdGljIGludCBtY2JfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHByaXYgKnByaXY7CisJcGh5c19hZGRyX3QgbWFwYmFzZTsKKwlpbnQgcmV0OworCWludCBudW1fY2VsbHM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXByaXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBQQ0kgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbWFwYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlpZiAoIW1hcGJhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gUENJIHJlc291cmNlXG4iKTsKKwkJZ290byBlcnJfc3RhcnQ7CisJfQorCisJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDAsIEtCVUlMRF9NT0ROQU1FKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IFBDSSBCQVJzXG4iKTsKKwkJZ290byBlcnJfc3RhcnQ7CisJfQorCisJcHJpdi0+YmFzZSA9IHBjaV9pb21hcChwZGV2LCAwLCAwKTsKKwlpZiAoIXByaXYtPmJhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGlvcmVtYXBcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9pb3JlbWFwOworCX0KKworCWZsYWdzID0gcGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApOworCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJcmV0ID0gLUVOT1RTVVBQOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiSU8gbWFwcGVkIFBDSSBkZXZpY2VzIGFyZSBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJZ290byBlcnJfaW9yZW1hcDsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgcHJpdik7CisKKwlwcml2LT5idXMgPSBtY2JfYWxsb2NfYnVzKCk7CisKKwlyZXQgPSBjaGFtZWxlb25fcGFyc2VfY2VsbHMocHJpdi0+YnVzLCBtYXBiYXNlLCBwcml2LT5iYXNlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZHJ2ZGF0YTsKKwludW1fY2VsbHMgPSByZXQ7CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJGb3VuZCAlZCBjZWxsc1xuIiwgbnVtX2NlbGxzKTsKKworCW1jYl9idXNfYWRkX2RldmljZXMocHJpdi0+YnVzKTsKKworZXJyX2RydmRhdGE6CisJcGNpX2lvdW5tYXAocGRldiwgcHJpdi0+YmFzZSk7CitlcnJfaW9yZW1hcDoKKwlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7CitlcnJfc3RhcnQ6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG1jYl9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBwcml2ICpwcml2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJbWNiX3JlbGVhc2VfYnVzKHByaXYtPmJ1cyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBtY2JfcGNpX3RibFtdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01FTiwgUENJX0RFVklDRV9JRF9NRU5fQ0hBTUVMRU9OKSB9LAorCXsgMCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBtY2JfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBtY2JfcGNpX2RyaXZlciA9IHsKKwkubmFtZSA9ICJtY2ItcGNpIiwKKwkuaWRfdGFibGUgPSBtY2JfcGNpX3RibCwKKwkucHJvYmUgPSBtY2JfcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBtY2JfcGNpX3JlbW92ZSwKK307CisKK21vZHVsZV9wY2lfZHJpdmVyKG1jYl9wY2lfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSm9oYW5uZXMgVGh1bXNoaXJuIDxqb2hhbm5lcy50aHVtc2hpcm5AbWVuLmRlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNQ0Igb3ZlciBQQ0kgc3VwcG9ydCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvS2NvbmZpZyBiL2RyaXZlcnMvbWQvYmNhY2hlL0tjb25maWcKaW5kZXggMjYzODQxNy4uNGQyMDA4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvS2NvbmZpZworKysgYi9kcml2ZXJzL21kL2JjYWNoZS9LY29uZmlnCkBAIC0yNCwxMSArMjQsMyBAQAogCUtlZXBzIGFsbCBhY3RpdmUgY2xvc3VyZXMgaW4gYSBsaW5rZWQgbGlzdCBhbmQgcHJvdmlkZXMgYSBkZWJ1Z2ZzCiAJaW50ZXJmYWNlIHRvIGxpc3QgdGhlbSwgd2hpY2ggbWFrZXMgaXQgcG9zc2libGUgdG8gc2VlIGFzeW5jaHJvbm91cwogCW9wZXJhdGlvbnMgdGhhdCBnZXQgc3R1Y2suCi0KLSMgY2dyb3VwIGNvZGUgbmVlZHMgdG8gYmUgdXBkYXRlZDoKLSMKLSNjb25maWcgQ0dST1VQX0JDQUNIRQotIwlib29sICJDZ3JvdXAgY29udHJvbHMgZm9yIGJjYWNoZSIKLSMJZGVwZW5kcyBvbiBCQ0FDSEUgJiYgQkxLX0NHUk9VUAotIwktLS1oZWxwLS0tCi0jCVRPRE8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL2FsbG9jLmMgYi9kcml2ZXJzL21kL2JjYWNoZS9hbGxvYy5jCmluZGV4IGMwZDM3ZDAuLjQ0M2QwM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL2FsbG9jLmMKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvYWxsb2MuYwpAQCAtNzgsMTIgKzc4LDYgQEAKIAljYS0+c2V0LT5uZWVkX2djID0gbWF4KGNhLT5zZXQtPm5lZWRfZ2MsIGJ1Y2tldF9nY19nZW4oYikpOwogCVdBUk5fT05fT05DRShjYS0+c2V0LT5uZWVkX2djID4gQlVDS0VUX0dDX0dFTl9NQVgpOwogCi0JaWYgKENBQ0hFX1NZTkMoJmNhLT5zZXQtPnNiKSkgewotCQljYS0+bmVlZF9zYXZlX3ByaW8gPSBtYXgoY2EtPm5lZWRfc2F2ZV9wcmlvLAotCQkJCQkgYnVja2V0X2Rpc2tfZ2VuKGIpKTsKLQkJV0FSTl9PTl9PTkNFKGNhLT5uZWVkX3NhdmVfcHJpbyA+IEJVQ0tFVF9ESVNLX0dFTl9NQVgpOwotCX0KLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEyMCw1MSArMTE0LDQ1IEBACiAJbXV0ZXhfdW5sb2NrKCZjLT5idWNrZXRfbG9jayk7CiB9CiAKLS8qIEFsbG9jYXRpb24gKi8KKy8qCisgKiBCYWNrZ3JvdW5kIGFsbG9jYXRpb24gdGhyZWFkOiBzY2FucyBmb3IgYnVja2V0cyB0byBiZSBpbnZhbGlkYXRlZCwKKyAqIGludmFsaWRhdGVzIHRoZW0sIHJld3JpdGVzIHByaW9zL2dlbnMgKG1hcmtpbmcgdGhlbSBhcyBpbnZhbGlkYXRlZCBvbiBkaXNrKSwKKyAqIHRoZW4gb3B0aW9uYWxseSBpc3N1ZXMgZGlzY2FyZCBjb21tYW5kcyB0byB0aGUgbmV3bHkgZnJlZSBidWNrZXRzLCB0aGVuIHB1dHMKKyAqIHRoZW0gb24gdGhlIHZhcmlvdXMgZnJlZWxpc3RzLgorICovCiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBjYW5faW5jX2J1Y2tldF9nZW4oc3RydWN0IGJ1Y2tldCAqYikKIHsKLQlyZXR1cm4gYnVja2V0X2djX2dlbihiKSA8IEJVQ0tFVF9HQ19HRU5fTUFYICYmCi0JCWJ1Y2tldF9kaXNrX2dlbihiKSA8IEJVQ0tFVF9ESVNLX0dFTl9NQVg7CisJcmV0dXJuIGJ1Y2tldF9nY19nZW4oYikgPCBCVUNLRVRfR0NfR0VOX01BWDsKIH0KIAotYm9vbCBiY2hfYnVja2V0X2FkZF91bnVzZWQoc3RydWN0IGNhY2hlICpjYSwgc3RydWN0IGJ1Y2tldCAqYikKK2Jvb2wgYmNoX2Nhbl9pbnZhbGlkYXRlX2J1Y2tldChzdHJ1Y3QgY2FjaGUgKmNhLCBzdHJ1Y3QgYnVja2V0ICpiKQogewotCUJVR19PTihHQ19NQVJLKGIpIHx8IEdDX1NFQ1RPUlNfVVNFRChiKSk7CisJQlVHX09OKCFjYS0+c2V0LT5nY19tYXJrX3ZhbGlkKTsKIAotCWlmIChDQUNIRV9SRVBMQUNFTUVOVCgmY2EtPnNiKSA9PSBDQUNIRV9SRVBMQUNFTUVOVF9GSUZPKSB7Ci0JCXVuc2lnbmVkIGk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IFJFU0VSVkVfTk9ORTsgaSsrKQotCQkJaWYgKCFmaWZvX2Z1bGwoJmNhLT5mcmVlW2ldKSkKLQkJCQlnb3RvIGFkZDsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotYWRkOgotCWItPnByaW8gPSAwOwotCi0JaWYgKGNhbl9pbmNfYnVja2V0X2dlbihiKSAmJgotCSAgICBmaWZvX3B1c2goJmNhLT51bnVzZWQsIGIgLSBjYS0+YnVja2V0cykpIHsKLQkJYXRvbWljX2luYygmYi0+cGluKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBjYW5faW52YWxpZGF0ZV9idWNrZXQoc3RydWN0IGNhY2hlICpjYSwgc3RydWN0IGJ1Y2tldCAqYikKLXsKLQlyZXR1cm4gR0NfTUFSSyhiKSA9PSBHQ19NQVJLX1JFQ0xBSU1BQkxFICYmCisJcmV0dXJuICghR0NfTUFSSyhiKSB8fAorCQlHQ19NQVJLKGIpID09IEdDX01BUktfUkVDTEFJTUFCTEUpICYmCiAJCSFhdG9taWNfcmVhZCgmYi0+cGluKSAmJgogCQljYW5faW5jX2J1Y2tldF9nZW4oYik7CiB9CiAKLXN0YXRpYyB2b2lkIGludmFsaWRhdGVfb25lX2J1Y2tldChzdHJ1Y3QgY2FjaGUgKmNhLCBzdHJ1Y3QgYnVja2V0ICpiKQordm9pZCBfX2JjaF9pbnZhbGlkYXRlX29uZV9idWNrZXQoc3RydWN0IGNhY2hlICpjYSwgc3RydWN0IGJ1Y2tldCAqYikKIHsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZjYS0+c2V0LT5idWNrZXRfbG9jayk7CisJQlVHX09OKEdDX01BUksoYikgJiYgR0NfTUFSSyhiKSAhPSBHQ19NQVJLX1JFQ0xBSU1BQkxFKTsKKworCWlmIChHQ19TRUNUT1JTX1VTRUQoYikpCisJCXRyYWNlX2JjYWNoZV9pbnZhbGlkYXRlKGNhLCBiIC0gY2EtPmJ1Y2tldHMpOworCiAJYmNoX2luY19nZW4oY2EsIGIpOwogCWItPnByaW8gPSBJTklUSUFMX1BSSU87CiAJYXRvbWljX2luYygmYi0+cGluKTsKK30KKworc3RhdGljIHZvaWQgYmNoX2ludmFsaWRhdGVfb25lX2J1Y2tldChzdHJ1Y3QgY2FjaGUgKmNhLCBzdHJ1Y3QgYnVja2V0ICpiKQoreworCV9fYmNoX2ludmFsaWRhdGVfb25lX2J1Y2tldChjYSwgYik7CisKIAlmaWZvX3B1c2goJmNhLT5mcmVlX2luYywgYiAtIGNhLT5idWNrZXRzKTsKIH0KIApAQCAtMTk1LDIwICsxODMsNyBAQAogCWNhLT5oZWFwLnVzZWQgPSAwOwogCiAJZm9yX2VhY2hfYnVja2V0KGIsIGNhKSB7Ci0JCS8qCi0JCSAqIElmIHdlIGZpbGwgdXAgdGhlIHVudXNlZCBsaXN0LCBpZiB3ZSB0aGVuIHJldHVybiBiZWZvcmUKLQkJICogYWRkaW5nIGFueXRoaW5nIHRvIHRoZSBmcmVlX2luYyBsaXN0IHdlJ2xsIHNraXAgd3JpdGluZwotCQkgKiBwcmlvcy9nZW5zIGFuZCBqdXN0IGdvIGJhY2sgdG8gYWxsb2NhdGluZyBmcm9tIHRoZSB1bnVzZWQKLQkJICogbGlzdDoKLQkJICovCi0JCWlmIChmaWZvX2Z1bGwoJmNhLT51bnVzZWQpKQotCQkJcmV0dXJuOwotCi0JCWlmICghY2FuX2ludmFsaWRhdGVfYnVja2V0KGNhLCBiKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghR0NfU0VDVE9SU19VU0VEKGIpICYmCi0JCSAgICBiY2hfYnVja2V0X2FkZF91bnVzZWQoY2EsIGIpKQorCQlpZiAoIWJjaF9jYW5faW52YWxpZGF0ZV9idWNrZXQoY2EsIGIpKQogCQkJY29udGludWU7CiAKIAkJaWYgKCFoZWFwX2Z1bGwoJmNhLT5oZWFwKSkKQEAgLTIzMyw3ICsyMDgsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAKLQkJaW52YWxpZGF0ZV9vbmVfYnVja2V0KGNhLCBiKTsKKwkJYmNoX2ludmFsaWRhdGVfb25lX2J1Y2tldChjYSwgYik7CiAJfQogfQogCkBAIC0yNDksOCArMjI0LDggQEAKIAogCQliID0gY2EtPmJ1Y2tldHMgKyBjYS0+Zmlmb19sYXN0X2J1Y2tldCsrOwogCi0JCWlmIChjYW5faW52YWxpZGF0ZV9idWNrZXQoY2EsIGIpKQotCQkJaW52YWxpZGF0ZV9vbmVfYnVja2V0KGNhLCBiKTsKKwkJaWYgKGJjaF9jYW5faW52YWxpZGF0ZV9idWNrZXQoY2EsIGIpKQorCQkJYmNoX2ludmFsaWRhdGVfb25lX2J1Y2tldChjYSwgYik7CiAKIAkJaWYgKCsrY2hlY2tlZCA+PSBjYS0+c2IubmJ1Y2tldHMpIHsKIAkJCWNhLT5pbnZhbGlkYXRlX25lZWRzX2djID0gMTsKQEAgLTI3NCw4ICsyNDksOCBAQAogCiAJCWIgPSBjYS0+YnVja2V0cyArIG47CiAKLQkJaWYgKGNhbl9pbnZhbGlkYXRlX2J1Y2tldChjYSwgYikpCi0JCQlpbnZhbGlkYXRlX29uZV9idWNrZXQoY2EsIGIpOworCQlpZiAoYmNoX2Nhbl9pbnZhbGlkYXRlX2J1Y2tldChjYSwgYikpCisJCQliY2hfaW52YWxpZGF0ZV9vbmVfYnVja2V0KGNhLCBiKTsKIAogCQlpZiAoKytjaGVja2VkID49IGNhLT5zYi5uYnVja2V0cyAvIDIpIHsKIAkJCWNhLT5pbnZhbGlkYXRlX25lZWRzX2djID0gMTsKQEAgLTI4Nyw4ICsyNjIsNyBAQAogCiBzdGF0aWMgdm9pZCBpbnZhbGlkYXRlX2J1Y2tldHMoc3RydWN0IGNhY2hlICpjYSkKIHsKLQlpZiAoY2EtPmludmFsaWRhdGVfbmVlZHNfZ2MpCi0JCXJldHVybjsKKwlCVUdfT04oY2EtPmludmFsaWRhdGVfbmVlZHNfZ2MpOwogCiAJc3dpdGNoIChDQUNIRV9SRVBMQUNFTUVOVCgmY2EtPnNiKSkgewogCWNhc2UgQ0FDSEVfUkVQTEFDRU1FTlRfTFJVOgpAQCAtMzAxLDggKzI3NSw2IEBACiAJCWludmFsaWRhdGVfYnVja2V0c19yYW5kb20oY2EpOwogCQlicmVhazsKIAl9Ci0KLQl0cmFjZV9iY2FjaGVfYWxsb2NfaW52YWxpZGF0ZShjYSk7CiB9CiAKICNkZWZpbmUgYWxsb2NhdG9yX3dhaXQoY2EsIGNvbmQpCQkJCQlcCkBAIC0zNTAsMTcgKzMyMiwxMCBAQAogCQkgKiBwb3NzaWJseSBpc3N1ZSBkaXNjYXJkcyB0byB0aGVtLCB0aGVuIHdlIGFkZCB0aGUgYnVja2V0IHRvCiAJCSAqIHRoZSBmcmVlIGxpc3Q6CiAJCSAqLwotCQl3aGlsZSAoMSkgeworCQl3aGlsZSAoIWZpZm9fZW1wdHkoJmNhLT5mcmVlX2luYykpIHsKIAkJCWxvbmcgYnVja2V0OwogCi0JCQlpZiAoKCFhdG9taWNfcmVhZCgmY2EtPnNldC0+cHJpb19ibG9ja2VkKSB8fAotCQkJICAgICAhQ0FDSEVfU1lOQygmY2EtPnNldC0+c2IpKSAmJgotCQkJICAgICFmaWZvX2VtcHR5KCZjYS0+dW51c2VkKSkKLQkJCQlmaWZvX3BvcCgmY2EtPnVudXNlZCwgYnVja2V0KTsKLQkJCWVsc2UgaWYgKCFmaWZvX2VtcHR5KCZjYS0+ZnJlZV9pbmMpKQotCQkJCWZpZm9fcG9wKCZjYS0+ZnJlZV9pbmMsIGJ1Y2tldCk7Ci0JCQllbHNlCi0JCQkJYnJlYWs7CisJCQlmaWZvX3BvcCgmY2EtPmZyZWVfaW5jLCBidWNrZXQpOwogCiAJCQlpZiAoY2EtPmRpc2NhcmQpIHsKIAkJCQltdXRleF91bmxvY2soJmNhLT5zZXQtPmJ1Y2tldF9sb2NrKTsKQEAgLTM3MSw2ICszMzYsNyBAQAogCQkJfQogCiAJCQlhbGxvY2F0b3Jfd2FpdChjYSwgYmNoX2FsbG9jYXRvcl9wdXNoKGNhLCBidWNrZXQpKTsKKwkJCXdha2VfdXAoJmNhLT5zZXQtPmJ0cmVlX2NhY2hlX3dhaXQpOwogCQkJd2FrZV91cCgmY2EtPnNldC0+YnVja2V0X3dhaXQpOwogCQl9CiAKQEAgLTM4MCw5ICszNDYsOSBAQAogCQkgKiB0aGVtIHRvIHRoZSBmcmVlX2luYyBsaXN0OgogCQkgKi8KIAorcmV0cnlfaW52YWxpZGF0ZToKIAkJYWxsb2NhdG9yX3dhaXQoY2EsIGNhLT5zZXQtPmdjX21hcmtfdmFsaWQgJiYKLQkJCSAgICAgICAoY2EtPm5lZWRfc2F2ZV9wcmlvID4gNjQgfHwKLQkJCQkhY2EtPmludmFsaWRhdGVfbmVlZHNfZ2MpKTsKKwkJCSAgICAgICAhY2EtPmludmFsaWRhdGVfbmVlZHNfZ2MpOwogCQlpbnZhbGlkYXRlX2J1Y2tldHMoY2EpOwogCiAJCS8qCkBAIC0zOTAsMTMgKzM1NiwyOCBAQAogCQkgKiBuZXcgc3R1ZmYgdG8gdGhlbToKIAkJICovCiAJCWFsbG9jYXRvcl93YWl0KGNhLCAhYXRvbWljX3JlYWQoJmNhLT5zZXQtPnByaW9fYmxvY2tlZCkpOwotCQlpZiAoQ0FDSEVfU1lOQygmY2EtPnNldC0+c2IpICYmCi0JCSAgICAoIWZpZm9fZW1wdHkoJmNhLT5mcmVlX2luYykgfHwKLQkJICAgICBjYS0+bmVlZF9zYXZlX3ByaW8gPiA2NCkpCisJCWlmIChDQUNIRV9TWU5DKCZjYS0+c2V0LT5zYikpIHsKKwkJCS8qCisJCQkgKiBUaGlzIGNvdWxkIGRlYWRsb2NrIGlmIGFuIGFsbG9jYXRpb24gd2l0aCBhIGJ0cmVlCisJCQkgKiBub2RlIGxvY2tlZCBldmVyIGJsb2NrZWQgLSBoYXZpbmcgdGhlIGJ0cmVlIG5vZGUKKwkJCSAqIGxvY2tlZCB3b3VsZCBibG9jayBnYXJiYWdlIGNvbGxlY3Rpb24sIGJ1dCBoZXJlIHdlJ3JlCisJCQkgKiB3YWl0aW5nIG9uIGdhcmJhZ2UgY29sbGVjdGlvbiBiZWZvcmUgd2UgaW52YWxpZGF0ZQorCQkJICogYW5kIGZyZWUgYW55dGhpbmcuCisJCQkgKgorCQkJICogQnV0IHRoaXMgc2hvdWxkIGJlIHNhZmUgc2luY2UgdGhlIGJ0cmVlIGNvZGUgYWx3YXlzCisJCQkgKiB1c2VzIGJ0cmVlX2NoZWNrX3Jlc2VydmUoKSBiZWZvcmUgYWxsb2NhdGluZyBub3csIGFuZAorCQkJICogaWYgaXQgZmFpbHMgaXQgYmxvY2tzIHdpdGhvdXQgYnRyZWUgbm9kZXMgbG9ja2VkLgorCQkJICovCisJCQlpZiAoIWZpZm9fZnVsbCgmY2EtPmZyZWVfaW5jKSkKKwkJCQlnb3RvIHJldHJ5X2ludmFsaWRhdGU7CisKIAkJCWJjaF9wcmlvX3dyaXRlKGNhKTsKKwkJfQogCX0KIH0KIAorLyogQWxsb2NhdGlvbiAqLworCiBsb25nIGJjaF9idWNrZXRfYWxsb2Moc3RydWN0IGNhY2hlICpjYSwgdW5zaWduZWQgcmVzZXJ2ZSwgYm9vbCB3YWl0KQogewogCURFRklORV9XQUlUKHcpOwpAQCAtNDA4LDggKzM4OSwxMCBAQAogCSAgICBmaWZvX3BvcCgmY2EtPmZyZWVbcmVzZXJ2ZV0sIHIpKQogCQlnb3RvIG91dDsKIAotCWlmICghd2FpdCkKKwlpZiAoIXdhaXQpIHsKKwkJdHJhY2VfYmNhY2hlX2FsbG9jX2ZhaWwoY2EsIHJlc2VydmUpOwogCQlyZXR1cm4gLTE7CisJfQogCiAJZG8gewogCQlwcmVwYXJlX3RvX3dhaXQoJmNhLT5zZXQtPmJ1Y2tldF93YWl0LCAmdywKQEAgLTQyNSw2ICs0MDgsOCBAQAogb3V0OgogCXdha2VfdXBfcHJvY2VzcyhjYS0+YWxsb2NfdGhyZWFkKTsKIAorCXRyYWNlX2JjYWNoZV9hbGxvYyhjYSwgcmVzZXJ2ZSk7CisKIAlpZiAoZXhwZW5zaXZlX2RlYnVnX2NoZWNrcyhjYS0+c2V0KSkgewogCQlzaXplX3QgaXRlcjsKIAkJbG9uZyBpOwpAQCAtNDM4LDggKzQyMyw2IEBACiAJCQkJQlVHX09OKGkgPT0gcik7CiAJCWZpZm9fZm9yX2VhY2goaSwgJmNhLT5mcmVlX2luYywgaXRlcikKIAkJCUJVR19PTihpID09IHIpOwotCQlmaWZvX2Zvcl9lYWNoKGksICZjYS0+dW51c2VkLCBpdGVyKQotCQkJQlVHX09OKGkgPT0gcik7CiAJfQogCiAJYiA9IGNhLT5idWNrZXRzICsgcjsKQEAgLTQ2MSwxNyArNDQ0LDE5IEBACiAJcmV0dXJuIHI7CiB9CiAKK3ZvaWQgX19iY2hfYnVja2V0X2ZyZWUoc3RydWN0IGNhY2hlICpjYSwgc3RydWN0IGJ1Y2tldCAqYikKK3sKKwlTRVRfR0NfTUFSSyhiLCAwKTsKKwlTRVRfR0NfU0VDVE9SU19VU0VEKGIsIDApOworfQorCiB2b2lkIGJjaF9idWNrZXRfZnJlZShzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBzdHJ1Y3QgYmtleSAqaykKIHsKIAl1bnNpZ25lZCBpOwogCi0JZm9yIChpID0gMDsgaSA8IEtFWV9QVFJTKGspOyBpKyspIHsKLQkJc3RydWN0IGJ1Y2tldCAqYiA9IFBUUl9CVUNLRVQoYywgaywgaSk7Ci0KLQkJU0VUX0dDX01BUksoYiwgR0NfTUFSS19SRUNMQUlNQUJMRSk7Ci0JCVNFVF9HQ19TRUNUT1JTX1VTRUQoYiwgMCk7Ci0JCWJjaF9idWNrZXRfYWRkX3VudXNlZChQVFJfQ0FDSEUoYywgaywgaSksIGIpOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgS0VZX1BUUlMoayk7IGkrKykKKwkJX19iY2hfYnVja2V0X2ZyZWUoUFRSX0NBQ0hFKGMsIGssIGkpLAorCQkJCSAgUFRSX0JVQ0tFVChjLCBrLCBpKSk7CiB9CiAKIGludCBfX2JjaF9idWNrZXRfYWxsb2Nfc2V0KHN0cnVjdCBjYWNoZV9zZXQgKmMsIHVuc2lnbmVkIHJlc2VydmUsCkBAIC03MDksMjUgKzY5NCwzIEBACiAJY2EtPmFsbG9jX3RocmVhZCA9IGs7CiAJcmV0dXJuIDA7CiB9Ci0KLWludCBiY2hfY2FjaGVfYWxsb2NhdG9yX2luaXQoc3RydWN0IGNhY2hlICpjYSkKLXsKLQkvKgotCSAqIFJlc2VydmU6Ci0JICogUHJpby9nZW4gd3JpdGVzIGZpcnN0Ci0JICogVGhlbiA4IGZvciBidHJlZSBhbGxvY2F0aW9ucwotCSAqIFRoZW4gaGFsZiBmb3IgdGhlIG1vdmluZyBnYXJiYWdlIGNvbGxlY3RvcgotCSAqLwotI2lmIDAKLQljYS0+d2F0ZXJtYXJrW1dBVEVSTUFSS19QUklPXSA9IDA7Ci0KLQljYS0+d2F0ZXJtYXJrW1dBVEVSTUFSS19NRVRBREFUQV0gPSBwcmlvX2J1Y2tldHMoY2EpOwotCi0JY2EtPndhdGVybWFya1tXQVRFUk1BUktfTU9WSU5HR0NdID0gOCArCi0JCWNhLT53YXRlcm1hcmtbV0FURVJNQVJLX01FVEFEQVRBXTsKLQotCWNhLT53YXRlcm1hcmtbV0FURVJNQVJLX05PTkVdID0gY2EtPmZyZWUuc2l6ZSAvIDIgKwotCQljYS0+d2F0ZXJtYXJrW1dBVEVSTUFSS19NT1ZJTkdHQ107Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL2JjYWNoZS5oIGIvZHJpdmVycy9tZC9iY2FjaGUvYmNhY2hlLmgKaW5kZXggYTRjNzMwNi4uODJjOWM1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvYmNhY2hlLmgKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvYmNhY2hlLmgKQEAgLTE5NSw5ICsxOTUsNyBAQAogCWF0b21pY190CXBpbjsKIAl1aW50MTZfdAlwcmlvOwogCXVpbnQ4X3QJCWdlbjsKLQl1aW50OF90CQlkaXNrX2dlbjsKIAl1aW50OF90CQlsYXN0X2djOyAvKiBNb3N0IG91dCBvZiBkYXRlIGdlbiBpbiB0aGUgYnRyZWUgKi8KLQl1aW50OF90CQlnY19nZW47CiAJdWludDE2X3QJZ2NfbWFyazsgLyogQml0ZmllbGQgdXNlZCBieSBHQy4gU2VlIGJlbG93IGZvciBmaWVsZCAqLwogfTsKIApAQCAtMjA3LDkgKzIwNSw5IEBACiAgKi8KIAogQklUTUFTSyhHQ19NQVJLLAkgc3RydWN0IGJ1Y2tldCwgZ2NfbWFyaywgMCwgMik7Ci0jZGVmaW5lIEdDX01BUktfUkVDTEFJTUFCTEUJMAotI2RlZmluZSBHQ19NQVJLX0RJUlRZCQkxCi0jZGVmaW5lIEdDX01BUktfTUVUQURBVEEJMgorI2RlZmluZSBHQ19NQVJLX1JFQ0xBSU1BQkxFCTEKKyNkZWZpbmUgR0NfTUFSS19ESVJUWQkJMgorI2RlZmluZSBHQ19NQVJLX01FVEFEQVRBCTMKICNkZWZpbmUgR0NfU0VDVE9SU19VU0VEX1NJWkUJMTMKICNkZWZpbmUgTUFYX0dDX1NFQ1RPUlNfVVNFRAkofih+MFVMTCA8PCBHQ19TRUNUT1JTX1VTRURfU0laRSkpCiBCSVRNQVNLKEdDX1NFQ1RPUlNfVVNFRCwgc3RydWN0IGJ1Y2tldCwgZ2NfbWFyaywgMiwgR0NfU0VDVE9SU19VU0VEX1NJWkUpOwpAQCAtNDI2LDE0ICs0MjQsOSBAQAogCSAqIHRoZWlyIG5ldyBnZW4gdG8gZGlzay4gQWZ0ZXIgcHJpb193cml0ZSgpIGZpbmlzaGVzIHdyaXRpbmcgdGhlIG5ldwogCSAqIGdlbnMvcHJpb3MsIHRoZXknbGwgYmUgbW92ZWQgdG8gdGhlIGZyZWUgbGlzdCAoYW5kIHBvc3NpYmx5IGRpc2NhcmRlZAogCSAqIGluIHRoZSBwcm9jZXNzKQotCSAqCi0JICogdW51c2VkOiBHQyBmb3VuZCBub3RoaW5nIHBvaW50aW5nIGludG8gdGhlc2UgYnVja2V0cyAocG9zc2libHkKLQkgKiBiZWNhdXNlIGFsbCB0aGUgZGF0YSB0aGV5IGNvbnRhaW5lZCB3YXMgb3ZlcndyaXR0ZW4pLCBzbyB3ZSBvbmx5Ci0JICogbmVlZCB0byBkaXNjYXJkIHRoZW0gYmVmb3JlIHRoZXkgY2FuIGJlIG1vdmVkIHRvIHRoZSBmcmVlIGxpc3QuCiAJICovCiAJREVDTEFSRV9GSUZPKGxvbmcsIGZyZWUpW1JFU0VSVkVfTlJdOwogCURFQ0xBUkVfRklGTyhsb25nLCBmcmVlX2luYyk7Ci0JREVDTEFSRV9GSUZPKGxvbmcsIHVudXNlZCk7CiAKIAlzaXplX3QJCQlmaWZvX2xhc3RfYnVja2V0OwogCkBAIC00NDMsMTIgKzQzNiw2IEBACiAJREVDTEFSRV9IRUFQKHN0cnVjdCBidWNrZXQgKiwgaGVhcCk7CiAKIAkvKgotCSAqIG1heChnZW4gLSBkaXNrX2dlbikgZm9yIGFsbCBidWNrZXRzLiBXaGVuIGl0IGdldHMgdG9vIGJpZyB3ZSBoYXZlIHRvCi0JICogY2FsbCBwcmlvX3dyaXRlKCkgdG8ga2VlcCBnZW5zIGZyb20gd3JhcHBpbmcuCi0JICovCi0JdWludDhfdAkJCW5lZWRfc2F2ZV9wcmlvOwotCi0JLyoKIAkgKiBJZiBub256ZXJvLCB3ZSBrbm93IHdlIGFyZW4ndCBnb2luZyB0byBmaW5kIGFueSBidWNrZXRzIHRvIGludmFsaWRhdGUKIAkgKiB1bnRpbCBhIGdjIGZpbmlzaGVzIC0gb3RoZXJ3aXNlIHdlIGNvdWxkIHBvaW50bGVzc2x5IGJ1cm4gYSB0b24gb2YKIAkgKiBjcHUKQEAgLTU2MiwxOSArNTQ5LDE2IEBACiAJc3RydWN0IGxpc3RfaGVhZAlidHJlZV9jYWNoZV9mcmVlZDsKIAogCS8qIE51bWJlciBvZiBlbGVtZW50cyBpbiBidHJlZV9jYWNoZSArIGJ0cmVlX2NhY2hlX2ZyZWVhYmxlIGxpc3RzICovCi0JdW5zaWduZWQJCWJ1Y2tldF9jYWNoZV91c2VkOworCXVuc2lnbmVkCQlidHJlZV9jYWNoZV91c2VkOwogCiAJLyoKIAkgKiBJZiB3ZSBuZWVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBuZXcgYnRyZWUgbm9kZSBhbmQgdGhhdAogCSAqIGFsbG9jYXRpb24gZmFpbHMsIHdlIGNhbiBjYW5uaWJhbGl6ZSBhbm90aGVyIG5vZGUgaW4gdGhlIGJ0cmVlIGNhY2hlCi0JICogdG8gc2F0aXNmeSB0aGUgYWxsb2NhdGlvbi4gSG93ZXZlciwgb25seSBvbmUgdGhyZWFkIGNhbiBiZSBkb2luZyB0aGlzCi0JICogYXQgYSB0aW1lLCBmb3Igb2J2aW91cyByZWFzb25zIC0gdHJ5X2hhcmRlciBhbmQgdHJ5X3dhaXQgYXJlCi0JICogYmFzaWNhbGx5IGEgbG9jayBmb3IgdGhpcyB0aGF0IHdlIGNhbiB3YWl0IG9uIGFzeW5jaHJvbm91c2x5LiBUaGUKLQkgKiBidHJlZV9yb290KCkgbWFjcm8gcmVsZWFzZXMgdGhlIGxvY2sgd2hlbiBpdCByZXR1cm5zLgorCSAqIHRvIHNhdGlzZnkgdGhlIGFsbG9jYXRpb24gLSBsb2NrIHRvIGd1YXJhbnRlZSBvbmx5IG9uZSB0aHJlYWQgZG9lcworCSAqIHRoaXMgYXQgYSB0aW1lOgogCSAqLwotCXN0cnVjdCB0YXNrX3N0cnVjdAkqdHJ5X2hhcmRlcjsKLQl3YWl0X3F1ZXVlX2hlYWRfdAl0cnlfd2FpdDsKLQl1aW50NjRfdAkJdHJ5X2hhcmRlcl9zdGFydDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAlidHJlZV9jYWNoZV93YWl0OworCXN0cnVjdCB0YXNrX3N0cnVjdAkqYnRyZWVfY2FjaGVfYWxsb2NfbG9jazsKIAogCS8qCiAJICogV2hlbiB3ZSBmcmVlIGEgYnRyZWUgbm9kZSwgd2UgaW5jcmVtZW50IHRoZSBnZW4gb2YgdGhlIGJ1Y2tldCB0aGUKQEAgLTYwMyw3ICs1ODcsNyBAQAogCXVpbnQxNl90CQltaW5fcHJpbzsKIAogCS8qCi0JICogbWF4KGdlbiAtIGdjX2dlbikgZm9yIGFsbCBidWNrZXRzLiBXaGVuIGl0IGdldHMgdG9vIGJpZyB3ZSBoYXZlIHRvIGdjCisJICogbWF4KGdlbiAtIGxhc3RfZ2MpIGZvciBhbGwgYnVja2V0cy4gV2hlbiBpdCBnZXRzIHRvbyBiaWcgd2UgaGF2ZSB0byBnYwogCSAqIHRvIGtlZXAgZ2VucyBmcm9tIHdyYXBwaW5nIGFyb3VuZC4KIAkgKi8KIAl1aW50OF90CQkJbmVlZF9nYzsKQEAgLTYyOCw2ICs2MTIsOCBAQAogCS8qIE51bWJlciBvZiBtb3ZpbmcgR0MgYmlvcyBpbiBmbGlnaHQgKi8KIAlzdHJ1Y3Qgc2VtYXBob3JlCW1vdmluZ19pbl9mbGlnaHQ7CiAKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkqbW92aW5nX2djX3dxOworCiAJc3RydWN0IGJ0cmVlCQkqcm9vdDsKIAogI2lmZGVmIENPTkZJR19CQ0FDSEVfREVCVUcKQEAgLTY2Nyw3ICs2NTMsNiBAQAogCXN0cnVjdCB0aW1lX3N0YXRzCWJ0cmVlX2djX3RpbWU7CiAJc3RydWN0IHRpbWVfc3RhdHMJYnRyZWVfc3BsaXRfdGltZTsKIAlzdHJ1Y3QgdGltZV9zdGF0cwlidHJlZV9yZWFkX3RpbWU7Ci0Jc3RydWN0IHRpbWVfc3RhdHMJdHJ5X2hhcmRlcl90aW1lOwogCiAJYXRvbWljX2xvbmdfdAkJY2FjaGVfcmVhZF9yYWNlczsKIAlhdG9taWNfbG9uZ190CQl3cml0ZWJhY2tfa2V5c19kb25lOwpAQCAtODUwLDkgKzgzNSw2IEBACiAvKgogICogYnVja2V0X2djX2dlbigpIHJldHVybnMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYnVja2V0J3MgY3VycmVudCBnZW4gYW5kCiAgKiB0aGUgb2xkZXN0IGdlbiBvZiBhbnkgcG9pbnRlciBpbnRvIHRoYXQgYnVja2V0IGluIHRoZSBidHJlZSAobGFzdF9nYykuCi0gKgotICogYnVja2V0X2Rpc2tfZ2VuKCkgcmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IGdlbiBhbmQgdGhlIGdlbgotICogb24gZGlzazsgdGhleSdyZSBib3RoIHVzZWQgdG8gbWFrZSBzdXJlIGdlbnMgZG9uJ3Qgd3JhcCBhcm91bmQuCiAgKi8KIAogc3RhdGljIGlubGluZSB1aW50OF90IGJ1Y2tldF9nY19nZW4oc3RydWN0IGJ1Y2tldCAqYikKQEAgLTg2MCwxMyArODQyLDcgQEAKIAlyZXR1cm4gYi0+Z2VuIC0gYi0+bGFzdF9nYzsKIH0KIAotc3RhdGljIGlubGluZSB1aW50OF90IGJ1Y2tldF9kaXNrX2dlbihzdHJ1Y3QgYnVja2V0ICpiKQotewotCXJldHVybiBiLT5nZW4gLSBiLT5kaXNrX2dlbjsKLX0KLQogI2RlZmluZSBCVUNLRVRfR0NfR0VOX01BWAk5NlUKLSNkZWZpbmUgQlVDS0VUX0RJU0tfR0VOX01BWAk2NFUKIAogI2RlZmluZSBrb2JqX2F0dHJpYnV0ZV93cml0ZShuLCBmbikJCQkJCVwKIAlzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGtzeXNmc18jI24gPSBfX0FUVFIobiwgU19JV1VTUiwgTlVMTCwgZm4pCkBAIC04OTksMTEgKzg3NSwxNCBAQAogCiB1aW50OF90IGJjaF9pbmNfZ2VuKHN0cnVjdCBjYWNoZSAqLCBzdHJ1Y3QgYnVja2V0ICopOwogdm9pZCBiY2hfcmVzY2FsZV9wcmlvcml0aWVzKHN0cnVjdCBjYWNoZV9zZXQgKiwgaW50KTsKLWJvb2wgYmNoX2J1Y2tldF9hZGRfdW51c2VkKHN0cnVjdCBjYWNoZSAqLCBzdHJ1Y3QgYnVja2V0ICopOwogCi1sb25nIGJjaF9idWNrZXRfYWxsb2Moc3RydWN0IGNhY2hlICosIHVuc2lnbmVkLCBib29sKTsKK2Jvb2wgYmNoX2Nhbl9pbnZhbGlkYXRlX2J1Y2tldChzdHJ1Y3QgY2FjaGUgKiwgc3RydWN0IGJ1Y2tldCAqKTsKK3ZvaWQgX19iY2hfaW52YWxpZGF0ZV9vbmVfYnVja2V0KHN0cnVjdCBjYWNoZSAqLCBzdHJ1Y3QgYnVja2V0ICopOworCit2b2lkIF9fYmNoX2J1Y2tldF9mcmVlKHN0cnVjdCBjYWNoZSAqLCBzdHJ1Y3QgYnVja2V0ICopOwogdm9pZCBiY2hfYnVja2V0X2ZyZWUoc3RydWN0IGNhY2hlX3NldCAqLCBzdHJ1Y3QgYmtleSAqKTsKIAorbG9uZyBiY2hfYnVja2V0X2FsbG9jKHN0cnVjdCBjYWNoZSAqLCB1bnNpZ25lZCwgYm9vbCk7CiBpbnQgX19iY2hfYnVja2V0X2FsbG9jX3NldChzdHJ1Y3QgY2FjaGVfc2V0ICosIHVuc2lnbmVkLAogCQkJICAgc3RydWN0IGJrZXkgKiwgaW50LCBib29sKTsKIGludCBiY2hfYnVja2V0X2FsbG9jX3NldChzdHJ1Y3QgY2FjaGVfc2V0ICosIHVuc2lnbmVkLApAQCAtOTU0LDEzICs5MzMsMTAgQEAKIHZvaWQgYmNoX29wZW5fYnVja2V0c19mcmVlKHN0cnVjdCBjYWNoZV9zZXQgKik7CiAKIGludCBiY2hfY2FjaGVfYWxsb2NhdG9yX3N0YXJ0KHN0cnVjdCBjYWNoZSAqY2EpOwotaW50IGJjaF9jYWNoZV9hbGxvY2F0b3JfaW5pdChzdHJ1Y3QgY2FjaGUgKmNhKTsKIAogdm9pZCBiY2hfZGVidWdfZXhpdCh2b2lkKTsKIGludCBiY2hfZGVidWdfaW5pdChzdHJ1Y3Qga29iamVjdCAqKTsKIHZvaWQgYmNoX3JlcXVlc3RfZXhpdCh2b2lkKTsKIGludCBiY2hfcmVxdWVzdF9pbml0KHZvaWQpOwotdm9pZCBiY2hfYnRyZWVfZXhpdCh2b2lkKTsKLWludCBiY2hfYnRyZWVfaW5pdCh2b2lkKTsKIAogI2VuZGlmIC8qIF9CQ0FDSEVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvYnNldC5jIGIvZHJpdmVycy9tZC9iY2FjaGUvYnNldC5jCmluZGV4IDNmNzRiNGIuLjU0NTQxNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL2JzZXQuYworKysgYi9kcml2ZXJzL21kL2JjYWNoZS9ic2V0LmMKQEAgLTIzLDggKzIzLDggQEAKIAlmb3IgKGsgPSBpLT5zdGFydDsgayA8IGJzZXRfYmtleV9sYXN0KGkpOyBrID0gbmV4dCkgewogCQluZXh0ID0gYmtleV9uZXh0KGspOwogCi0JCXByaW50ayhLRVJOX0VSUiAiYmxvY2sgJXUga2V5ICVsaS8ldTogIiwgc2V0LAotCQkgICAgICAgKHVpbnQ2NF90ICopIGsgLSBpLT5kLCBpLT5rZXlzKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJibG9jayAldSBrZXkgJXUvJXU6ICIsIHNldCwKKwkJICAgICAgICh1bnNpZ25lZCkgKCh1NjQgKikgayAtIGktPmQpLCBpLT5rZXlzKTsKIAogCQlpZiAoYi0+b3BzLT5rZXlfZHVtcCkKIAkJCWItPm9wcy0+a2V5X2R1bXAoYiwgayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9ic2V0LmggYi9kcml2ZXJzL21kL2JjYWNoZS9ic2V0LmgKaW5kZXggMDAzMjYwZi4uNWY2NzI4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvYnNldC5oCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL2JzZXQuaApAQCAtNDc4LDYgKzQ3OCwxMiBAQAogCWwtPnRvcF9wID0gbC0+a2V5c19wID0gbC0+aW5saW5lX2tleXM7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY2hfa2V5bGlzdF9pbml0X3NpbmdsZShzdHJ1Y3Qga2V5bGlzdCAqbCwgc3RydWN0IGJrZXkgKmspCit7CisJbC0+a2V5cyA9IGs7CisJbC0+dG9wID0gYmtleV9uZXh0KGspOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgYmNoX2tleWxpc3RfcHVzaChzdHJ1Y3Qga2V5bGlzdCAqbCkKIHsKIAlsLT50b3AgPSBia2V5X25leHQobC0+dG9wKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL2J0cmVlLmMgYi9kcml2ZXJzL21kL2JjYWNoZS9idHJlZS5jCmluZGV4IDVmOWMyYTYuLjczNDdiNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL2J0cmVlLmMKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvYnRyZWUuYwpAQCAtNjgsMTUgKzY4LDExIEBACiAgKiBhbGxvY19idWNrZXQoKSBjYW5ub3QgZmFpbC4gVGhpcyBzaG91bGQgYmUgdHJ1ZSBidXQgaXMgbm90IGNvbXBsZXRlbHkKICAqIG9idmlvdXMuCiAgKgotICogTWFrZSBzdXJlIGFsbCBhbGxvY2F0aW9ucyBnZXQgY2hhcmdlZCB0byB0aGUgcm9vdCBjZ3JvdXAKLSAqCiAgKiBQbHVnZ2luZz8KICAqCiAgKiBJZiBkYXRhIHdyaXRlIGlzIGxlc3MgdGhhbiBoYXJkIHNlY3RvciBzaXplIG9mIHNzZCwgcm91bmQgdXAgb2Zmc2V0IGluIG9wZW4KICAqIGJ1Y2tldCB0byB0aGUgbmV4dCB3aG9sZSBzZWN0b3IKICAqCi0gKiBBbHNvIGxvb2t1cCBieSBjZ3JvdXAgaW4gZ2V0X29wZW5fYnVja2V0KCkKLSAqCiAgKiBTdXBlcmJsb2NrIG5lZWRzIHRvIGJlIGZsZXNoZWQgb3V0IGZvciBtdWx0aXBsZSBjYWNoZSBkZXZpY2VzCiAgKgogICogQWRkIGEgc3lzZnMgdHVuYWJsZSBmb3IgdGhlIG51bWJlciBvZiB3cml0ZWJhY2sgSU9zIGluIGZsaWdodApAQCAtOTcsOCArOTMsNiBAQAogI2RlZmluZSBQVFJfSEFTSChjLCBrKQkJCQkJCQlcCiAJKCgoayktPnB0clswXSA+PiBjLT5idWNrZXRfYml0cykgfCBQVFJfR0VOKGssIDApKQogCi1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJ0cmVlX2lvX3dxOwotCiAjZGVmaW5lIGluc2VydF9sb2NrKHMsIGIpCSgoYiktPmxldmVsIDw9IChzKS0+bG9jaykKIAogLyoKQEAgLTEyMyw3ICsxMTcsNyBAQAogKHsJCQkJCQkJCQlcCiAJaW50IF9yLCBsID0gKGIpLT5sZXZlbCAtIDE7CQkJCQlcCiAJYm9vbCBfdyA9IGwgPD0gKG9wKS0+bG9jazsJCQkJCVwKLQlzdHJ1Y3QgYnRyZWUgKl9jaGlsZCA9IGJjaF9idHJlZV9ub2RlX2dldCgoYiktPmMsIGtleSwgbCwgX3cpOwlcCisJc3RydWN0IGJ0cmVlICpfY2hpbGQgPSBiY2hfYnRyZWVfbm9kZV9nZXQoKGIpLT5jLCBvcCwga2V5LCBsLCBfdyk7XAogCWlmICghSVNfRVJSKF9jaGlsZCkpIHsJCQkJCQlcCiAJCV9jaGlsZC0+cGFyZW50ID0gKGIpOwkJCQkJXAogCQlfciA9IGJjaF9idHJlZV8gIyMgZm4oX2NoaWxkLCBvcCwgIyNfX1ZBX0FSR1NfXyk7CVwKQEAgLTE1MiwxNyArMTQ2LDEyIEBACiAJCQlfciA9IGJjaF9idHJlZV8gIyMgZm4oX2IsIG9wLCAjI19fVkFfQVJHU19fKTsJXAogCQl9CQkJCQkJCVwKIAkJcndfdW5sb2NrKF93LCBfYik7CQkJCQlcCisJCWJjaF9jYW5uaWJhbGl6ZV91bmxvY2soYyk7CQkJCVwKIAkJaWYgKF9yID09IC1FSU5UUikJCQkJCVwKIAkJCXNjaGVkdWxlKCk7CQkJCQlcCi0JCWJjaF9jYW5uaWJhbGl6ZV91bmxvY2soYyk7CQkJCVwKLQkJaWYgKF9yID09IC1FTk9TUEMpIHsJCQkJCVwKLQkJCXdhaXRfZXZlbnQoKGMpLT50cnlfd2FpdCwJCQlcCi0JCQkJICAgIShjKS0+dHJ5X2hhcmRlcik7CQkJXAotCQkJX3IgPSAtRUlOVFI7CQkJCQlcCi0JCX0JCQkJCQkJXAogCX0gd2hpbGUgKF9yID09IC1FSU5UUik7CQkJCQkJXAogCQkJCQkJCQkJXAotCWZpbmlzaF93YWl0KCYoYyktPmJ1Y2tldF93YWl0LCAmKG9wKS0+d2FpdCk7CQkJXAorCWZpbmlzaF93YWl0KCYoYyktPmJ0cmVlX2NhY2hlX3dhaXQsICYob3ApLT53YWl0KTsJCVwKIAlfcjsJCQkJCQkJCVwKIH0pCiAKQEAgLTE3MSw2ICsxNjAsMjAgQEAKIAlyZXR1cm4gKCh2b2lkICopIGJ0cmVlX2JzZXRfZmlyc3QoYikpICsgYi0+d3JpdHRlbiAqIGJsb2NrX2J5dGVzKGItPmMpOwogfQogCitzdGF0aWMgdm9pZCBiY2hfYnRyZWVfaW5pdF9uZXh0KHN0cnVjdCBidHJlZSAqYikKK3sKKwkvKiBJZiBub3QgYSBsZWFmIG5vZGUsIGFsd2F5cyBzb3J0ICovCisJaWYgKGItPmxldmVsICYmIGItPmtleXMubnNldHMpCisJCWJjaF9idHJlZV9zb3J0KCZiLT5rZXlzLCAmYi0+Yy0+c29ydCk7CisJZWxzZQorCQliY2hfYnRyZWVfc29ydF9sYXp5KCZiLT5rZXlzLCAmYi0+Yy0+c29ydCk7CisKKwlpZiAoYi0+d3JpdHRlbiA8IGJ0cmVlX2Jsb2NrcyhiKSkKKwkJYmNoX2JzZXRfaW5pdF9uZXh0KCZiLT5rZXlzLCB3cml0ZV9ibG9jayhiKSwKKwkJCQkgICBic2V0X21hZ2ljKCZiLT5jLT5zYikpOworCit9CisKIC8qIEJ0cmVlIGtleSBtYW5pcHVsYXRpb24gKi8KIAogdm9pZCBia2V5X3B1dChzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBzdHJ1Y3QgYmtleSAqaykKQEAgLTM1Miw4ICszNTUsNyBAQAogCWJ0cmVlX2NvbXBsZXRlX3dyaXRlKGIsIHcpOwogCiAJaWYgKGJ0cmVlX25vZGVfZGlydHkoYikpCi0JCXF1ZXVlX2RlbGF5ZWRfd29yayhidHJlZV9pb193cSwgJmItPndvcmssCi0JCQkJICAgbXNlY3NfdG9famlmZmllcygzMDAwMCkpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmItPndvcmssIDMwICogSFopOwogCiAJY2xvc3VyZV9yZXR1cm5fd2l0aF9kZXN0cnVjdG9yKGNsLCBidHJlZV9ub2RlX3dyaXRlX3VubG9jayk7CiB9CkBAIC00NDIsMTAgKzQ0NCwxMiBAQAogCX0KIH0KIAotdm9pZCBiY2hfYnRyZWVfbm9kZV93cml0ZShzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBjbG9zdXJlICpwYXJlbnQpCit2b2lkIF9fYmNoX2J0cmVlX25vZGVfd3JpdGUoc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3QgY2xvc3VyZSAqcGFyZW50KQogewogCXN0cnVjdCBic2V0ICppID0gYnRyZWVfYnNldF9sYXN0KGIpOwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYi0+d3JpdGVfbG9jayk7CisKIAl0cmFjZV9iY2FjaGVfYnRyZWVfd3JpdGUoYik7CiAKIAlCVUdfT04oY3VycmVudC0+YmlvX2xpc3QpOwpAQCAtNDY5LDIzICs0NzMsMjQgQEAKIAkJCSZQVFJfQ0FDSEUoYi0+YywgJmItPmtleSwgMCktPmJ0cmVlX3NlY3RvcnNfd3JpdHRlbik7CiAKIAliLT53cml0dGVuICs9IHNldF9ibG9ja3MoaSwgYmxvY2tfYnl0ZXMoYi0+YykpOworfQogCi0JLyogSWYgbm90IGEgbGVhZiBub2RlLCBhbHdheXMgc29ydCAqLwotCWlmIChiLT5sZXZlbCAmJiBiLT5rZXlzLm5zZXRzKQotCQliY2hfYnRyZWVfc29ydCgmYi0+a2V5cywgJmItPmMtPnNvcnQpOwotCWVsc2UKLQkJYmNoX2J0cmVlX3NvcnRfbGF6eSgmYi0+a2V5cywgJmItPmMtPnNvcnQpOwordm9pZCBiY2hfYnRyZWVfbm9kZV93cml0ZShzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBjbG9zdXJlICpwYXJlbnQpCit7CisJdW5zaWduZWQgbnNldHMgPSBiLT5rZXlzLm5zZXRzOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYi0+bG9jayk7CisKKwlfX2JjaF9idHJlZV9ub2RlX3dyaXRlKGIsIHBhcmVudCk7CiAKIAkvKgogCSAqIGRvIHZlcmlmeSBpZiB0aGVyZSB3YXMgbW9yZSB0aGFuIG9uZSBzZXQgaW5pdGlhbGx5IChpLmUuIHdlIGRpZCBhCiAJICogc29ydCkgYW5kIHdlIHNvcnRlZCBkb3duIHRvIGEgc2luZ2xlIHNldDoKIAkgKi8KLQlpZiAoaSAhPSBiLT5rZXlzLnNldC0+ZGF0YSAmJiAhYi0+a2V5cy5uc2V0cykKKwlpZiAobnNldHMgJiYgIWItPmtleXMubnNldHMpCiAJCWJjaF9idHJlZV92ZXJpZnkoYik7CiAKLQlpZiAoYi0+d3JpdHRlbiA8IGJ0cmVlX2Jsb2NrcyhiKSkKLQkJYmNoX2JzZXRfaW5pdF9uZXh0KCZiLT5rZXlzLCB3cml0ZV9ibG9jayhiKSwKLQkJCQkgICBic2V0X21hZ2ljKCZiLT5jLT5zYikpOworCWJjaF9idHJlZV9pbml0X25leHQoYik7CiB9CiAKIHN0YXRpYyB2b2lkIGJjaF9idHJlZV9ub2RlX3dyaXRlX3N5bmMoc3RydWN0IGJ0cmVlICpiKQpAQCAtNDkzLDcgKzQ5OCwxMSBAQAogCXN0cnVjdCBjbG9zdXJlIGNsOwogCiAJY2xvc3VyZV9pbml0X3N0YWNrKCZjbCk7CisKKwltdXRleF9sb2NrKCZiLT53cml0ZV9sb2NrKTsKIAliY2hfYnRyZWVfbm9kZV93cml0ZShiLCAmY2wpOworCW11dGV4X3VubG9jaygmYi0+d3JpdGVfbG9jayk7CisKIAljbG9zdXJlX3N5bmMoJmNsKTsKIH0KIApAQCAtNTAxLDExICs1MTAsMTAgQEAKIHsKIAlzdHJ1Y3QgYnRyZWUgKmIgPSBjb250YWluZXJfb2YodG9fZGVsYXllZF93b3JrKHcpLCBzdHJ1Y3QgYnRyZWUsIHdvcmspOwogCi0JcndfbG9jayh0cnVlLCBiLCBiLT5sZXZlbCk7Ci0KKwltdXRleF9sb2NrKCZiLT53cml0ZV9sb2NrKTsKIAlpZiAoYnRyZWVfbm9kZV9kaXJ0eShiKSkKLQkJYmNoX2J0cmVlX25vZGVfd3JpdGUoYiwgTlVMTCk7Ci0JcndfdW5sb2NrKHRydWUsIGIpOworCQlfX2JjaF9idHJlZV9ub2RlX3dyaXRlKGIsIE5VTEwpOworCW11dGV4X3VubG9jaygmYi0+d3JpdGVfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIGJjaF9idHJlZV9sZWFmX2RpcnR5KHN0cnVjdCBidHJlZSAqYiwgYXRvbWljX3QgKmpvdXJuYWxfcmVmKQpAQCAtNTEzLDExICs1MjEsMTMgQEAKIAlzdHJ1Y3QgYnNldCAqaSA9IGJ0cmVlX2JzZXRfbGFzdChiKTsKIAlzdHJ1Y3QgYnRyZWVfd3JpdGUgKncgPSBidHJlZV9jdXJyZW50X3dyaXRlKGIpOwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYi0+d3JpdGVfbG9jayk7CisKIAlCVUdfT04oIWItPndyaXR0ZW4pOwogCUJVR19PTighaS0+a2V5cyk7CiAKIAlpZiAoIWJ0cmVlX25vZGVfZGlydHkoYikpCi0JCXF1ZXVlX2RlbGF5ZWRfd29yayhidHJlZV9pb193cSwgJmItPndvcmssIDMwICogSFopOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmItPndvcmssIDMwICogSFopOwogCiAJc2V0X2J0cmVlX25vZGVfZGlydHkoYik7CiAKQEAgLTU0OCw3ICs1NTgsNyBAQAogI2RlZmluZSBtY2FfcmVzZXJ2ZShjKQkoKChjLT5yb290ICYmIGMtPnJvb3QtPmxldmVsKQkJXAogCQkJICA/IGMtPnJvb3QtPmxldmVsIDogMSkgKiA4ICsgMTYpCiAjZGVmaW5lIG1jYV9jYW5fZnJlZShjKQkJCQkJCVwKLQltYXhfdChpbnQsIDAsIGMtPmJ1Y2tldF9jYWNoZV91c2VkIC0gbWNhX3Jlc2VydmUoYykpCisJbWF4X3QoaW50LCAwLCBjLT5idHJlZV9jYWNoZV91c2VkIC0gbWNhX3Jlc2VydmUoYykpCiAKIHN0YXRpYyB2b2lkIG1jYV9kYXRhX2ZyZWUoc3RydWN0IGJ0cmVlICpiKQogewpAQCAtNTU2LDcgKzU2Niw3IEBACiAKIAliY2hfYnRyZWVfa2V5c19mcmVlKCZiLT5rZXlzKTsKIAotCWItPmMtPmJ1Y2tldF9jYWNoZV91c2VkLS07CisJYi0+Yy0+YnRyZWVfY2FjaGVfdXNlZC0tOwogCWxpc3RfbW92ZSgmYi0+bGlzdCwgJmItPmMtPmJ0cmVlX2NhY2hlX2ZyZWVkKTsKIH0KIApAQCAtNTgxLDcgKzU5MSw3IEBACiAJCQkJCWlsb2cyKGItPmMtPmJ0cmVlX3BhZ2VzKSwKIAkJCQkJYnRyZWVfb3JkZXIoaykpLAogCQkJCSAgZ2ZwKSkgewotCQliLT5jLT5idWNrZXRfY2FjaGVfdXNlZCsrOworCQliLT5jLT5idHJlZV9jYWNoZV91c2VkKys7CiAJCWxpc3RfbW92ZSgmYi0+bGlzdCwgJmItPmMtPmJ0cmVlX2NhY2hlKTsKIAl9IGVsc2UgewogCQlsaXN0X21vdmUoJmItPmxpc3QsICZiLT5jLT5idHJlZV9jYWNoZV9mcmVlZCk7CkBAIC01OTcsNiArNjA3LDggQEAKIAogCWluaXRfcndzZW0oJmItPmxvY2spOwogCWxvY2tkZXBfc2V0X25vdmFsaWRhdGVfY2xhc3MoJmItPmxvY2spOworCW11dGV4X2luaXQoJmItPndyaXRlX2xvY2spOworCWxvY2tkZXBfc2V0X25vdmFsaWRhdGVfY2xhc3MoJmItPndyaXRlX2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZiLT5saXN0KTsKIAlJTklUX0RFTEFZRURfV09SSygmYi0+d29yaywgYnRyZWVfbm9kZV93cml0ZV93b3JrKTsKIAliLT5jID0gYzsKQEAgLTYzMCw4ICs2NDIsMTIgQEAKIAkJdXAoJmItPmlvX211dGV4KTsKIAl9CiAKKwltdXRleF9sb2NrKCZiLT53cml0ZV9sb2NrKTsKIAlpZiAoYnRyZWVfbm9kZV9kaXJ0eShiKSkKLQkJYmNoX2J0cmVlX25vZGVfd3JpdGVfc3luYyhiKTsKKwkJX19iY2hfYnRyZWVfbm9kZV93cml0ZShiLCAmY2wpOworCW11dGV4X3VubG9jaygmYi0+d3JpdGVfbG9jayk7CisKKwljbG9zdXJlX3N5bmMoJmNsKTsKIAogCS8qIHdhaXQgZm9yIGFueSBpbiBmbGlnaHQgYnRyZWUgd3JpdGUgKi8KIAlkb3duKCZiLT5pb19tdXRleCk7CkBAIC02NTQsNyArNjcwLDcgQEAKIAlpZiAoYy0+c2hyaW5rZXJfZGlzYWJsZWQpCiAJCXJldHVybiBTSFJJTktfU1RPUDsKIAotCWlmIChjLT50cnlfaGFyZGVyKQorCWlmIChjLT5idHJlZV9jYWNoZV9hbGxvY19sb2NrKQogCQlyZXR1cm4gU0hSSU5LX1NUT1A7CiAKIAkvKiBSZXR1cm4gLTEgaWYgd2UgY2FuJ3QgZG8gYW55dGhpbmcgcmlnaHQgbm93ICovCkBAIC02ODYsNyArNzAyLDcgQEAKIAkJfQogCX0KIAotCWZvciAoaSA9IDA7IChuci0tKSAmJiBpIDwgYy0+YnVja2V0X2NhY2hlX3VzZWQ7IGkrKykgeworCWZvciAoaSA9IDA7IChuci0tKSAmJiBpIDwgYy0+YnRyZWVfY2FjaGVfdXNlZDsgaSsrKSB7CiAJCWlmIChsaXN0X2VtcHR5KCZjLT5idHJlZV9jYWNoZSkpCiAJCQlnb3RvIG91dDsKIApAQCAtNzE1LDcgKzczMSw3IEBACiAJaWYgKGMtPnNocmlua2VyX2Rpc2FibGVkKQogCQlyZXR1cm4gMDsKIAotCWlmIChjLT50cnlfaGFyZGVyKQorCWlmIChjLT5idHJlZV9jYWNoZV9hbGxvY19sb2NrKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBtY2FfY2FuX2ZyZWUoYykgKiBjLT5idHJlZV9wYWdlczsKQEAgLTgxOSwxNyArODM1LDMwIEBACiAJcmV0dXJuIGI7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYnRyZWUgKm1jYV9jYW5uaWJhbGl6ZShzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBzdHJ1Y3QgYmtleSAqaykKK3N0YXRpYyBpbnQgbWNhX2Nhbm5pYmFsaXplX2xvY2soc3RydWN0IGNhY2hlX3NldCAqYywgc3RydWN0IGJ0cmVlX29wICpvcCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm9sZDsKKworCW9sZCA9IGNtcHhjaGcoJmMtPmJ0cmVlX2NhY2hlX2FsbG9jX2xvY2ssIE5VTEwsIGN1cnJlbnQpOworCWlmIChvbGQgJiYgb2xkICE9IGN1cnJlbnQpIHsKKwkJaWYgKG9wKQorCQkJcHJlcGFyZV90b193YWl0KCZjLT5idHJlZV9jYWNoZV93YWl0LCAmb3AtPndhaXQsCisJCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJcmV0dXJuIC1FSU5UUjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBidHJlZSAqbWNhX2Nhbm5pYmFsaXplKHN0cnVjdCBjYWNoZV9zZXQgKmMsIHN0cnVjdCBidHJlZV9vcCAqb3AsCisJCQkJICAgICBzdHJ1Y3QgYmtleSAqaykKIHsKIAlzdHJ1Y3QgYnRyZWUgKmI7CiAKIAl0cmFjZV9iY2FjaGVfYnRyZWVfY2FjaGVfY2FubmliYWxpemUoYyk7CiAKLQlpZiAoIWMtPnRyeV9oYXJkZXIpIHsKLQkJYy0+dHJ5X2hhcmRlciA9IGN1cnJlbnQ7Ci0JCWMtPnRyeV9oYXJkZXJfc3RhcnQgPSBsb2NhbF9jbG9jaygpOwotCX0gZWxzZSBpZiAoYy0+dHJ5X2hhcmRlciAhPSBjdXJyZW50KQotCQlyZXR1cm4gRVJSX1BUUigtRU5PU1BDKTsKKwlpZiAobWNhX2Nhbm5pYmFsaXplX2xvY2soYywgb3ApKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVFIpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGIsICZjLT5idHJlZV9jYWNoZSwgbGlzdCkKIAkJaWYgKCFtY2FfcmVhcChiLCBidHJlZV9vcmRlcihrKSwgZmFsc2UpKQpAQCAtODM5LDYgKzg2OCw3IEBACiAJCWlmICghbWNhX3JlYXAoYiwgYnRyZWVfb3JkZXIoayksIHRydWUpKQogCQkJcmV0dXJuIGI7CiAKKwlXQVJOKDEsICJidHJlZSBjYWNoZSBjYW5uaWJhbGl6ZSBmYWlsZWRcbiIpOwogCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogfQogCkBAIC04NTAsMTQgKzg4MCwxNCBAQAogICovCiBzdGF0aWMgdm9pZCBiY2hfY2FubmliYWxpemVfdW5sb2NrKHN0cnVjdCBjYWNoZV9zZXQgKmMpCiB7Ci0JaWYgKGMtPnRyeV9oYXJkZXIgPT0gY3VycmVudCkgewotCQliY2hfdGltZV9zdGF0c191cGRhdGUoJmMtPnRyeV9oYXJkZXJfdGltZSwgYy0+dHJ5X2hhcmRlcl9zdGFydCk7Ci0JCWMtPnRyeV9oYXJkZXIgPSBOVUxMOwotCQl3YWtlX3VwKCZjLT50cnlfd2FpdCk7CisJaWYgKGMtPmJ0cmVlX2NhY2hlX2FsbG9jX2xvY2sgPT0gY3VycmVudCkgeworCQljLT5idHJlZV9jYWNoZV9hbGxvY19sb2NrID0gTlVMTDsKKwkJd2FrZV91cCgmYy0+YnRyZWVfY2FjaGVfd2FpdCk7CiAJfQogfQogCi1zdGF0aWMgc3RydWN0IGJ0cmVlICptY2FfYWxsb2Moc3RydWN0IGNhY2hlX3NldCAqYywgc3RydWN0IGJrZXkgKmssIGludCBsZXZlbCkKK3N0YXRpYyBzdHJ1Y3QgYnRyZWUgKm1jYV9hbGxvYyhzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBzdHJ1Y3QgYnRyZWVfb3AgKm9wLAorCQkJICAgICAgIHN0cnVjdCBia2V5ICprLCBpbnQgbGV2ZWwpCiB7CiAJc3RydWN0IGJ0cmVlICpiOwogCkBAIC05MjAsNyArOTUwLDcgQEAKIAlpZiAoYikKIAkJcndfdW5sb2NrKHRydWUsIGIpOwogCi0JYiA9IG1jYV9jYW5uaWJhbGl6ZShjLCBrKTsKKwliID0gbWNhX2Nhbm5pYmFsaXplKGMsIG9wLCBrKTsKIAlpZiAoIUlTX0VSUihiKSkKIAkJZ290byBvdXQ7CiAKQEAgLTkzNiw4ICs5NjYsOCBAQAogICogVGhlIGJ0cmVlIG5vZGUgd2lsbCBoYXZlIGVpdGhlciBhIHJlYWQgb3IgYSB3cml0ZSBsb2NrIGhlbGQsIGRlcGVuZGluZyBvbgogICogbGV2ZWwgYW5kIG9wLT5sb2NrLgogICovCi1zdHJ1Y3QgYnRyZWUgKmJjaF9idHJlZV9ub2RlX2dldChzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBzdHJ1Y3QgYmtleSAqaywKLQkJCQkgaW50IGxldmVsLCBib29sIHdyaXRlKQorc3RydWN0IGJ0cmVlICpiY2hfYnRyZWVfbm9kZV9nZXQoc3RydWN0IGNhY2hlX3NldCAqYywgc3RydWN0IGJ0cmVlX29wICpvcCwKKwkJCQkgc3RydWN0IGJrZXkgKmssIGludCBsZXZlbCwgYm9vbCB3cml0ZSkKIHsKIAlpbnQgaSA9IDA7CiAJc3RydWN0IGJ0cmVlICpiOwpAQCAtOTUxLDcgKzk4MSw3IEBACiAJCQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKIAogCQltdXRleF9sb2NrKCZjLT5idWNrZXRfbG9jayk7Ci0JCWIgPSBtY2FfYWxsb2MoYywgaywgbGV2ZWwpOworCQliID0gbWNhX2FsbG9jKGMsIG9wLCBrLCBsZXZlbCk7CiAJCW11dGV4X3VubG9jaygmYy0+YnVja2V0X2xvY2spOwogCiAJCWlmICghYikKQEAgLTk5Nyw3ICsxMDI3LDcgQEAKIAlzdHJ1Y3QgYnRyZWUgKmI7CiAKIAltdXRleF9sb2NrKCZjLT5idWNrZXRfbG9jayk7Ci0JYiA9IG1jYV9hbGxvYyhjLCBrLCBsZXZlbCk7CisJYiA9IG1jYV9hbGxvYyhjLCBOVUxMLCBrLCBsZXZlbCk7CiAJbXV0ZXhfdW5sb2NrKCZjLT5idWNrZXRfbG9jayk7CiAKIAlpZiAoIUlTX0VSUl9PUl9OVUxMKGIpKSB7CkBAIC0xMDEwLDQ2ICsxMDQwLDQxIEBACiAKIHN0YXRpYyB2b2lkIGJ0cmVlX25vZGVfZnJlZShzdHJ1Y3QgYnRyZWUgKmIpCiB7Ci0JdW5zaWduZWQgaTsKLQogCXRyYWNlX2JjYWNoZV9idHJlZV9ub2RlX2ZyZWUoYik7CiAKIAlCVUdfT04oYiA9PSBiLT5jLT5yb290KTsKIAorCW11dGV4X2xvY2soJmItPndyaXRlX2xvY2spOworCiAJaWYgKGJ0cmVlX25vZGVfZGlydHkoYikpCiAJCWJ0cmVlX2NvbXBsZXRlX3dyaXRlKGIsIGJ0cmVlX2N1cnJlbnRfd3JpdGUoYikpOwogCWNsZWFyX2JpdChCVFJFRV9OT0RFX2RpcnR5LCAmYi0+ZmxhZ3MpOwogCisJbXV0ZXhfdW5sb2NrKCZiLT53cml0ZV9sb2NrKTsKKwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJmItPndvcmspOwogCiAJbXV0ZXhfbG9jaygmYi0+Yy0+YnVja2V0X2xvY2spOwotCi0JZm9yIChpID0gMDsgaSA8IEtFWV9QVFJTKCZiLT5rZXkpOyBpKyspIHsKLQkJQlVHX09OKGF0b21pY19yZWFkKCZQVFJfQlVDS0VUKGItPmMsICZiLT5rZXksIGkpLT5waW4pKTsKLQotCQliY2hfaW5jX2dlbihQVFJfQ0FDSEUoYi0+YywgJmItPmtleSwgaSksCi0JCQkgICAgUFRSX0JVQ0tFVChiLT5jLCAmYi0+a2V5LCBpKSk7Ci0JfQotCiAJYmNoX2J1Y2tldF9mcmVlKGItPmMsICZiLT5rZXkpOwogCW1jYV9idWNrZXRfZnJlZShiKTsKIAltdXRleF91bmxvY2soJmItPmMtPmJ1Y2tldF9sb2NrKTsKIH0KIAotc3RydWN0IGJ0cmVlICpiY2hfYnRyZWVfbm9kZV9hbGxvYyhzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBpbnQgbGV2ZWwsIGJvb2wgd2FpdCkKK3N0cnVjdCBidHJlZSAqYmNoX2J0cmVlX25vZGVfYWxsb2Moc3RydWN0IGNhY2hlX3NldCAqYywgc3RydWN0IGJ0cmVlX29wICpvcCwKKwkJCQkgICBpbnQgbGV2ZWwpCiB7CiAJQktFWV9QQURERUQoa2V5KSBrOwogCXN0cnVjdCBidHJlZSAqYiA9IEVSUl9QVFIoLUVBR0FJTik7CiAKIAltdXRleF9sb2NrKCZjLT5idWNrZXRfbG9jayk7CiByZXRyeToKLQlpZiAoX19iY2hfYnVja2V0X2FsbG9jX3NldChjLCBSRVNFUlZFX0JUUkVFLCAmay5rZXksIDEsIHdhaXQpKQorCWlmIChfX2JjaF9idWNrZXRfYWxsb2Nfc2V0KGMsIFJFU0VSVkVfQlRSRUUsICZrLmtleSwgMSwgb3AgIT0gTlVMTCkpCiAJCWdvdG8gZXJyOwogCiAJYmtleV9wdXQoYywgJmsua2V5KTsKIAlTRVRfS0VZX1NJWkUoJmsua2V5LCBjLT5idHJlZV9wYWdlcyAqIFBBR0VfU0VDVE9SUyk7CiAKLQliID0gbWNhX2FsbG9jKGMsICZrLmtleSwgbGV2ZWwpOworCWIgPSBtY2FfYWxsb2MoYywgb3AsICZrLmtleSwgbGV2ZWwpOwogCWlmIChJU19FUlIoYikpCiAJCWdvdG8gZXJyX2ZyZWU7CiAKQEAgLTEwNzUsMTIgKzExMDAsMTUgQEAKIAlyZXR1cm4gYjsKIH0KIAotc3RhdGljIHN0cnVjdCBidHJlZSAqYnRyZWVfbm9kZV9hbGxvY19yZXBsYWNlbWVudChzdHJ1Y3QgYnRyZWUgKmIsIGJvb2wgd2FpdCkKK3N0YXRpYyBzdHJ1Y3QgYnRyZWUgKmJ0cmVlX25vZGVfYWxsb2NfcmVwbGFjZW1lbnQoc3RydWN0IGJ0cmVlICpiLAorCQkJCQkJICBzdHJ1Y3QgYnRyZWVfb3AgKm9wKQogewotCXN0cnVjdCBidHJlZSAqbiA9IGJjaF9idHJlZV9ub2RlX2FsbG9jKGItPmMsIGItPmxldmVsLCB3YWl0KTsKKwlzdHJ1Y3QgYnRyZWUgKm4gPSBiY2hfYnRyZWVfbm9kZV9hbGxvYyhiLT5jLCBvcCwgYi0+bGV2ZWwpOwogCWlmICghSVNfRVJSX09SX05VTEwobikpIHsKKwkJbXV0ZXhfbG9jaygmbi0+d3JpdGVfbG9jayk7CiAJCWJjaF9idHJlZV9zb3J0X2ludG8oJmItPmtleXMsICZuLT5rZXlzLCAmYi0+Yy0+c29ydCk7CiAJCWJrZXlfY29weV9rZXkoJm4tPmtleSwgJmItPmtleSk7CisJCW11dGV4X3VubG9jaygmbi0+d3JpdGVfbG9jayk7CiAJfQogCiAJcmV0dXJuIG47CkBAIC0xMDkwLDQzICsxMTE4LDQ3IEBACiB7CiAJdW5zaWduZWQgaTsKIAorCW11dGV4X2xvY2soJmItPmMtPmJ1Y2tldF9sb2NrKTsKKworCWF0b21pY19pbmMoJmItPmMtPnByaW9fYmxvY2tlZCk7CisKIAlia2V5X2NvcHkoaywgJmItPmtleSk7CiAJYmtleV9jb3B5X2tleShrLCAmWkVST19LRVkpOwogCi0JZm9yIChpID0gMDsgaSA8IEtFWV9QVFJTKGspOyBpKyspIHsKLQkJdWludDhfdCBnID0gUFRSX0JVQ0tFVChiLT5jLCBrLCBpKS0+Z2VuICsgMTsKKwlmb3IgKGkgPSAwOyBpIDwgS0VZX1BUUlMoayk7IGkrKykKKwkJU0VUX1BUUl9HRU4oaywgaSwKKwkJCSAgICBiY2hfaW5jX2dlbihQVFJfQ0FDSEUoYi0+YywgJmItPmtleSwgaSksCisJCQkJCVBUUl9CVUNLRVQoYi0+YywgJmItPmtleSwgaSkpKTsKIAotCQlTRVRfUFRSX0dFTihrLCBpLCBnKTsKLQl9Ci0KLQlhdG9taWNfaW5jKCZiLT5jLT5wcmlvX2Jsb2NrZWQpOworCW11dGV4X3VubG9jaygmYi0+Yy0+YnVja2V0X2xvY2spOwogfQogCiBzdGF0aWMgaW50IGJ0cmVlX2NoZWNrX3Jlc2VydmUoc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3QgYnRyZWVfb3AgKm9wKQogewogCXN0cnVjdCBjYWNoZV9zZXQgKmMgPSBiLT5jOwogCXN0cnVjdCBjYWNoZSAqY2E7Ci0JdW5zaWduZWQgaSwgcmVzZXJ2ZSA9IGMtPnJvb3QtPmxldmVsICogMiArIDE7Ci0JaW50IHJldCA9IDA7CisJdW5zaWduZWQgaSwgcmVzZXJ2ZSA9IChjLT5yb290LT5sZXZlbCAtIGItPmxldmVsKSAqIDIgKyAxOwogCiAJbXV0ZXhfbG9jaygmYy0+YnVja2V0X2xvY2spOwogCiAJZm9yX2VhY2hfY2FjaGUoY2EsIGMsIGkpCiAJCWlmIChmaWZvX3VzZWQoJmNhLT5mcmVlW1JFU0VSVkVfQlRSRUVdKSA8IHJlc2VydmUpIHsKIAkJCWlmIChvcCkKLQkJCQlwcmVwYXJlX3RvX3dhaXQoJmMtPmJ1Y2tldF93YWl0LCAmb3AtPndhaXQsCisJCQkJcHJlcGFyZV90b193YWl0KCZjLT5idHJlZV9jYWNoZV93YWl0LCAmb3AtPndhaXQsCiAJCQkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCQlyZXQgPSAtRUlOVFI7Ci0JCQlicmVhazsKKwkJCW11dGV4X3VubG9jaygmYy0+YnVja2V0X2xvY2spOworCQkJcmV0dXJuIC1FSU5UUjsKIAkJfQogCiAJbXV0ZXhfdW5sb2NrKCZjLT5idWNrZXRfbG9jayk7Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiBtY2FfY2FubmliYWxpemVfbG9jayhiLT5jLCBvcCk7CiB9CiAKIC8qIEdhcmJhZ2UgY29sbGVjdGlvbiAqLwogCi11aW50OF90IF9fYmNoX2J0cmVlX21hcmtfa2V5KHN0cnVjdCBjYWNoZV9zZXQgKmMsIGludCBsZXZlbCwgc3RydWN0IGJrZXkgKmspCitzdGF0aWMgdWludDhfdCBfX2JjaF9idHJlZV9tYXJrX2tleShzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBpbnQgbGV2ZWwsCisJCQkJICAgIHN0cnVjdCBia2V5ICprKQogewogCXVpbnQ4X3Qgc3RhbGUgPSAwOwogCXVuc2lnbmVkIGk7CkBAIC0xMTQ2LDggKzExNzgsOCBAQAogCiAJCWcgPSBQVFJfQlVDS0VUKGMsIGssIGkpOwogCi0JCWlmIChnZW5fYWZ0ZXIoZy0+Z2NfZ2VuLCBQVFJfR0VOKGssIGkpKSkKLQkJCWctPmdjX2dlbiA9IFBUUl9HRU4oaywgaSk7CisJCWlmIChnZW5fYWZ0ZXIoZy0+bGFzdF9nYywgUFRSX0dFTihrLCBpKSkpCisJCQlnLT5sYXN0X2djID0gUFRSX0dFTihrLCBpKTsKIAogCQlpZiAocHRyX3N0YWxlKGMsIGssIGkpKSB7CiAJCQlzdGFsZSA9IG1heChzdGFsZSwgcHRyX3N0YWxlKGMsIGssIGkpKTsKQEAgLTExNjMsNiArMTE5NSw4IEBACiAJCQlTRVRfR0NfTUFSSyhnLCBHQ19NQVJLX01FVEFEQVRBKTsKIAkJZWxzZSBpZiAoS0VZX0RJUlRZKGspKQogCQkJU0VUX0dDX01BUksoZywgR0NfTUFSS19ESVJUWSk7CisJCWVsc2UgaWYgKCFHQ19NQVJLKGcpKQorCQkJU0VUX0dDX01BUksoZywgR0NfTUFSS19SRUNMQUlNQUJMRSk7CiAKIAkJLyogZ3VhcmQgYWdhaW5zdCBvdmVyZmxvdyAqLwogCQlTRVRfR0NfU0VDVE9SU19VU0VEKGcsIG1pbl90KHVuc2lnbmVkLApAQCAtMTE3Nyw2ICsxMjExLDI2IEBACiAKICNkZWZpbmUgYnRyZWVfbWFya19rZXkoYiwgaykJX19iY2hfYnRyZWVfbWFya19rZXkoYi0+YywgYi0+bGV2ZWwsIGspCiAKK3ZvaWQgYmNoX2luaXRpYWxfbWFya19rZXkoc3RydWN0IGNhY2hlX3NldCAqYywgaW50IGxldmVsLCBzdHJ1Y3QgYmtleSAqaykKK3sKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IEtFWV9QVFJTKGspOyBpKyspCisJCWlmIChwdHJfYXZhaWxhYmxlKGMsIGssIGkpICYmCisJCSAgICAhcHRyX3N0YWxlKGMsIGssIGkpKSB7CisJCQlzdHJ1Y3QgYnVja2V0ICpiID0gUFRSX0JVQ0tFVChjLCBrLCBpKTsKKworCQkJYi0+Z2VuID0gUFRSX0dFTihrLCBpKTsKKworCQkJaWYgKGxldmVsICYmIGJrZXlfY21wKGssICZaRVJPX0tFWSkpCisJCQkJYi0+cHJpbyA9IEJUUkVFX1BSSU87CisJCQllbHNlIGlmICghbGV2ZWwgJiYgYi0+cHJpbyA9PSBCVFJFRV9QUklPKQorCQkJCWItPnByaW8gPSBJTklUSUFMX1BSSU87CisJCX0KKworCV9fYmNoX2J0cmVlX21hcmtfa2V5KGMsIGxldmVsLCBrKTsKK30KKwogc3RhdGljIGJvb2wgYnRyZWVfZ2NfbWFya19ub2RlKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGdjX3N0YXQgKmdjKQogewogCXVpbnQ4X3Qgc3RhbGUgPSAwOwpAQCAtMTIzMCwxNCArMTI4NCwxOSBAQAogCQkJCSBzdHJ1Y3Qga2V5bGlzdCAqLCBhdG9taWNfdCAqLCBzdHJ1Y3QgYmtleSAqKTsKIAogc3RhdGljIGludCBidHJlZV9nY19jb2FsZXNjZShzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBidHJlZV9vcCAqb3AsCi0JCQkgICAgIHN0cnVjdCBrZXlsaXN0ICprZXlsaXN0LCBzdHJ1Y3QgZ2Nfc3RhdCAqZ2MsCi0JCQkgICAgIHN0cnVjdCBnY19tZXJnZV9pbmZvICpyKQorCQkJICAgICBzdHJ1Y3QgZ2Nfc3RhdCAqZ2MsIHN0cnVjdCBnY19tZXJnZV9pbmZvICpyKQogewogCXVuc2lnbmVkIGksIG5vZGVzID0gMCwga2V5cyA9IDAsIGJsb2NrczsKIAlzdHJ1Y3QgYnRyZWUgKm5ld19ub2Rlc1tHQ19NRVJHRV9OT0RFU107CisJc3RydWN0IGtleWxpc3Qga2V5bGlzdDsKIAlzdHJ1Y3QgY2xvc3VyZSBjbDsKIAlzdHJ1Y3QgYmtleSAqazsKIAorCWJjaF9rZXlsaXN0X2luaXQoJmtleWxpc3QpOworCisJaWYgKGJ0cmVlX2NoZWNrX3Jlc2VydmUoYiwgTlVMTCkpCisJCXJldHVybiAwOworCiAJbWVtc2V0KG5ld19ub2RlcywgMCwgc2l6ZW9mKG5ld19ub2RlcykpOwogCWNsb3N1cmVfaW5pdF9zdGFjaygmY2wpOwogCkBAIC0xMjUyLDExICsxMzExLDIzIEBACiAJCXJldHVybiAwOwogCiAJZm9yIChpID0gMDsgaSA8IG5vZGVzOyBpKyspIHsKLQkJbmV3X25vZGVzW2ldID0gYnRyZWVfbm9kZV9hbGxvY19yZXBsYWNlbWVudChyW2ldLmIsIGZhbHNlKTsKKwkJbmV3X25vZGVzW2ldID0gYnRyZWVfbm9kZV9hbGxvY19yZXBsYWNlbWVudChyW2ldLmIsIE5VTEwpOwogCQlpZiAoSVNfRVJSX09SX05VTEwobmV3X25vZGVzW2ldKSkKIAkJCWdvdG8gb3V0X25vY29hbGVzY2U7CiAJfQogCisJLyoKKwkgKiBXZSBoYXZlIHRvIGNoZWNrIHRoZSByZXNlcnZlIGhlcmUsIGFmdGVyIHdlJ3ZlIGFsbG9jYXRlZCBvdXIgbmV3CisJICogbm9kZXMsIHRvIG1ha2Ugc3VyZSB0aGUgaW5zZXJ0IGJlbG93IHdpbGwgc3VjY2VlZCAtIHdlIGFsc28gY2hlY2sKKwkgKiBiZWZvcmUgYXMgYW4gb3B0aW1pemF0aW9uIHRvIHBvdGVudGlhbGx5IGF2b2lkIGEgYnVuY2ggb2YgZXhwZW5zaXZlCisJICogYWxsb2NzL3NvcnRzCisJICovCisJaWYgKGJ0cmVlX2NoZWNrX3Jlc2VydmUoYiwgTlVMTCkpCisJCWdvdG8gb3V0X25vY29hbGVzY2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgbm9kZXM7IGkrKykKKwkJbXV0ZXhfbG9jaygmbmV3X25vZGVzW2ldLT53cml0ZV9sb2NrKTsKKwogCWZvciAoaSA9IG5vZGVzIC0gMTsgaSA+IDA7IC0taSkgewogCQlzdHJ1Y3QgYnNldCAqbjEgPSBidHJlZV9ic2V0X2ZpcnN0KG5ld19ub2Rlc1tpXSk7CiAJCXN0cnVjdCBic2V0ICpuMiA9IGJ0cmVlX2JzZXRfZmlyc3QobmV3X25vZGVzW2kgLSAxXSk7CkBAIC0xMzE1LDI4ICsxMzg2LDM0IEBACiAKIAkJbjItPmtleXMgLT0ga2V5czsKIAotCQlpZiAoX19iY2hfa2V5bGlzdF9yZWFsbG9jKGtleWxpc3QsCisJCWlmIChfX2JjaF9rZXlsaXN0X3JlYWxsb2MoJmtleWxpc3QsCiAJCQkJCSAgYmtleV91NjRzKCZuZXdfbm9kZXNbaV0tPmtleSkpKQogCQkJZ290byBvdXRfbm9jb2FsZXNjZTsKIAogCQliY2hfYnRyZWVfbm9kZV93cml0ZShuZXdfbm9kZXNbaV0sICZjbCk7Ci0JCWJjaF9rZXlsaXN0X2FkZChrZXlsaXN0LCAmbmV3X25vZGVzW2ldLT5rZXkpOworCQliY2hfa2V5bGlzdF9hZGQoJmtleWxpc3QsICZuZXdfbm9kZXNbaV0tPmtleSk7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IG5vZGVzOyBpKyspIHsKLQkJaWYgKF9fYmNoX2tleWxpc3RfcmVhbGxvYyhrZXlsaXN0LCBia2V5X3U2NHMoJnJbaV0uYi0+a2V5KSkpCi0JCQlnb3RvIG91dF9ub2NvYWxlc2NlOworCWZvciAoaSA9IDA7IGkgPCBub2RlczsgaSsrKQorCQltdXRleF91bmxvY2soJm5ld19ub2Rlc1tpXS0+d3JpdGVfbG9jayk7CiAKLQkJbWFrZV9idHJlZV9mcmVlaW5nX2tleShyW2ldLmIsIGtleWxpc3QtPnRvcCk7Ci0JCWJjaF9rZXlsaXN0X3B1c2goa2V5bGlzdCk7Ci0JfQorCWNsb3N1cmVfc3luYygmY2wpOwogCiAJLyogV2UgZW1wdGllZCBvdXQgdGhpcyBub2RlICovCiAJQlVHX09OKGJ0cmVlX2JzZXRfZmlyc3QobmV3X25vZGVzWzBdKS0+a2V5cyk7CiAJYnRyZWVfbm9kZV9mcmVlKG5ld19ub2Rlc1swXSk7CiAJcndfdW5sb2NrKHRydWUsIG5ld19ub2Rlc1swXSk7CiAKLQljbG9zdXJlX3N5bmMoJmNsKTsKKwlmb3IgKGkgPSAwOyBpIDwgbm9kZXM7IGkrKykgeworCQlpZiAoX19iY2hfa2V5bGlzdF9yZWFsbG9jKCZrZXlsaXN0LCBia2V5X3U2NHMoJnJbaV0uYi0+a2V5KSkpCisJCQlnb3RvIG91dF9ub2NvYWxlc2NlOworCisJCW1ha2VfYnRyZWVfZnJlZWluZ19rZXkocltpXS5iLCBrZXlsaXN0LnRvcCk7CisJCWJjaF9rZXlsaXN0X3B1c2goJmtleWxpc3QpOworCX0KKworCWJjaF9idHJlZV9pbnNlcnRfbm9kZShiLCBvcCwgJmtleWxpc3QsIE5VTEwsIE5VTEwpOworCUJVR19PTighYmNoX2tleWxpc3RfZW1wdHkoJmtleWxpc3QpKTsKIAogCWZvciAoaSA9IDA7IGkgPCBub2RlczsgaSsrKSB7CiAJCWJ0cmVlX25vZGVfZnJlZShyW2ldLmIpOwpAQCAtMTM0NSwyMiArMTQyMiwyMiBAQAogCQlyW2ldLmIgPSBuZXdfbm9kZXNbaV07CiAJfQogCi0JYmNoX2J0cmVlX2luc2VydF9ub2RlKGIsIG9wLCBrZXlsaXN0LCBOVUxMLCBOVUxMKTsKLQlCVUdfT04oIWJjaF9rZXlsaXN0X2VtcHR5KGtleWxpc3QpKTsKLQogCW1lbW1vdmUociwgciArIDEsIHNpemVvZihyWzBdKSAqIChub2RlcyAtIDEpKTsKIAlyW25vZGVzIC0gMV0uYiA9IEVSUl9QVFIoLUVJTlRSKTsKIAogCXRyYWNlX2JjYWNoZV9idHJlZV9nY19jb2FsZXNjZShub2Rlcyk7CiAJZ2MtPm5vZGVzLS07CiAKKwliY2hfa2V5bGlzdF9mcmVlKCZrZXlsaXN0KTsKKwogCS8qIEludmFsaWRhdGVkIG91ciBpdGVyYXRvciAqLwogCXJldHVybiAtRUlOVFI7CiAKIG91dF9ub2NvYWxlc2NlOgogCWNsb3N1cmVfc3luYygmY2wpOworCWJjaF9rZXlsaXN0X2ZyZWUoJmtleWxpc3QpOwogCi0Jd2hpbGUgKChrID0gYmNoX2tleWxpc3RfcG9wKGtleWxpc3QpKSkKKwl3aGlsZSAoKGsgPSBiY2hfa2V5bGlzdF9wb3AoJmtleWxpc3QpKSkKIAkJaWYgKCFia2V5X2NtcChrLCAmWkVST19LRVkpKQogCQkJYXRvbWljX2RlYygmYi0+Yy0+cHJpb19ibG9ja2VkKTsKIApAQCAtMTM3Miw2ICsxNDQ5LDQyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYnRyZWVfZ2NfcmV3cml0ZV9ub2RlKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGJ0cmVlX29wICpvcCwKKwkJCQkgc3RydWN0IGJ0cmVlICpyZXBsYWNlKQoreworCXN0cnVjdCBrZXlsaXN0IGtleXM7CisJc3RydWN0IGJ0cmVlICpuOworCisJaWYgKGJ0cmVlX2NoZWNrX3Jlc2VydmUoYiwgTlVMTCkpCisJCXJldHVybiAwOworCisJbiA9IGJ0cmVlX25vZGVfYWxsb2NfcmVwbGFjZW1lbnQocmVwbGFjZSwgTlVMTCk7CisKKwkvKiByZWNoZWNrIHJlc2VydmUgYWZ0ZXIgYWxsb2NhdGluZyByZXBsYWNlbWVudCBub2RlICovCisJaWYgKGJ0cmVlX2NoZWNrX3Jlc2VydmUoYiwgTlVMTCkpIHsKKwkJYnRyZWVfbm9kZV9mcmVlKG4pOworCQlyd191bmxvY2sodHJ1ZSwgbik7CisJCXJldHVybiAwOworCX0KKworCWJjaF9idHJlZV9ub2RlX3dyaXRlX3N5bmMobik7CisKKwliY2hfa2V5bGlzdF9pbml0KCZrZXlzKTsKKwliY2hfa2V5bGlzdF9hZGQoJmtleXMsICZuLT5rZXkpOworCisJbWFrZV9idHJlZV9mcmVlaW5nX2tleShyZXBsYWNlLCBrZXlzLnRvcCk7CisJYmNoX2tleWxpc3RfcHVzaCgma2V5cyk7CisKKwliY2hfYnRyZWVfaW5zZXJ0X25vZGUoYiwgb3AsICZrZXlzLCBOVUxMLCBOVUxMKTsKKwlCVUdfT04oIWJjaF9rZXlsaXN0X2VtcHR5KCZrZXlzKSk7CisKKwlidHJlZV9ub2RlX2ZyZWUocmVwbGFjZSk7CisJcndfdW5sb2NrKHRydWUsIG4pOworCisJLyogSW52YWxpZGF0ZWQgb3VyIGl0ZXJhdG9yICovCisJcmV0dXJuIC1FSU5UUjsKK30KKwogc3RhdGljIHVuc2lnbmVkIGJ0cmVlX2djX2NvdW50X2tleXMoc3RydWN0IGJ0cmVlICpiKQogewogCXN0cnVjdCBia2V5ICprOwpAQCAtMTM4NywyNiArMTUwMCwyMyBAQAogc3RhdGljIGludCBidHJlZV9nY19yZWN1cnNlKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGJ0cmVlX29wICpvcCwKIAkJCSAgICBzdHJ1Y3QgY2xvc3VyZSAqd3JpdGVzLCBzdHJ1Y3QgZ2Nfc3RhdCAqZ2MpCiB7Ci0JdW5zaWduZWQgaTsKIAlpbnQgcmV0ID0gMDsKIAlib29sIHNob3VsZF9yZXdyaXRlOwotCXN0cnVjdCBidHJlZSAqbjsKIAlzdHJ1Y3QgYmtleSAqazsKLQlzdHJ1Y3Qga2V5bGlzdCBrZXlzOwogCXN0cnVjdCBidHJlZV9pdGVyIGl0ZXI7CiAJc3RydWN0IGdjX21lcmdlX2luZm8gcltHQ19NRVJHRV9OT0RFU107Ci0Jc3RydWN0IGdjX21lcmdlX2luZm8gKmxhc3QgPSByICsgR0NfTUVSR0VfTk9ERVMgLSAxOworCXN0cnVjdCBnY19tZXJnZV9pbmZvICppLCAqbGFzdCA9IHIgKyBBUlJBWV9TSVpFKHIpIC0gMTsKIAotCWJjaF9rZXlsaXN0X2luaXQoJmtleXMpOwogCWJjaF9idHJlZV9pdGVyX2luaXQoJmItPmtleXMsICZpdGVyLCAmYi0+Yy0+Z2NfZG9uZSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgR0NfTUVSR0VfTk9ERVM7IGkrKykKLQkJcltpXS5iID0gRVJSX1BUUigtRUlOVFIpOworCWZvciAoaSA9IHI7IGkgPCByICsgQVJSQVlfU0laRShyKTsgaSsrKQorCQlpLT5iID0gRVJSX1BUUigtRUlOVFIpOwogCiAJd2hpbGUgKDEpIHsKIAkJayA9IGJjaF9idHJlZV9pdGVyX25leHRfZmlsdGVyKCZpdGVyLCAmYi0+a2V5cywgYmNoX3B0cl9iYWQpOwogCQlpZiAoaykgewotCQkJci0+YiA9IGJjaF9idHJlZV9ub2RlX2dldChiLT5jLCBrLCBiLT5sZXZlbCAtIDEsIHRydWUpOworCQkJci0+YiA9IGJjaF9idHJlZV9ub2RlX2dldChiLT5jLCBvcCwgaywgYi0+bGV2ZWwgLSAxLAorCQkJCQkJICB0cnVlKTsKIAkJCWlmIChJU19FUlIoci0+YikpIHsKIAkJCQlyZXQgPSBQVFJfRVJSKHItPmIpOwogCQkJCWJyZWFrOwpAQCAtMTQxNCw3ICsxNTI0LDcgQEAKIAogCQkJci0+a2V5cyA9IGJ0cmVlX2djX2NvdW50X2tleXMoci0+Yik7CiAKLQkJCXJldCA9IGJ0cmVlX2djX2NvYWxlc2NlKGIsIG9wLCAma2V5cywgZ2MsIHIpOworCQkJcmV0ID0gYnRyZWVfZ2NfY29hbGVzY2UoYiwgb3AsIGdjLCByKTsKIAkJCWlmIChyZXQpCiAJCQkJYnJlYWs7CiAJCX0KQEAgLTE0MjQsMzIgKzE1MzQsMTAgQEAKIAogCQlpZiAoIUlTX0VSUihsYXN0LT5iKSkgewogCQkJc2hvdWxkX3Jld3JpdGUgPSBidHJlZV9nY19tYXJrX25vZGUobGFzdC0+YiwgZ2MpOwotCQkJaWYgKHNob3VsZF9yZXdyaXRlICYmCi0JCQkgICAgIWJ0cmVlX2NoZWNrX3Jlc2VydmUoYiwgTlVMTCkpIHsKLQkJCQluID0gYnRyZWVfbm9kZV9hbGxvY19yZXBsYWNlbWVudChsYXN0LT5iLAotCQkJCQkJCQkgZmFsc2UpOwotCi0JCQkJaWYgKCFJU19FUlJfT1JfTlVMTChuKSkgewotCQkJCQliY2hfYnRyZWVfbm9kZV93cml0ZV9zeW5jKG4pOwotCQkJCQliY2hfa2V5bGlzdF9hZGQoJmtleXMsICZuLT5rZXkpOwotCi0JCQkJCW1ha2VfYnRyZWVfZnJlZWluZ19rZXkobGFzdC0+YiwKLQkJCQkJCQkgICAgICAga2V5cy50b3ApOwotCQkJCQliY2hfa2V5bGlzdF9wdXNoKCZrZXlzKTsKLQotCQkJCQlidHJlZV9ub2RlX2ZyZWUobGFzdC0+Yik7Ci0KLQkJCQkJYmNoX2J0cmVlX2luc2VydF9ub2RlKGIsIG9wLCAma2V5cywKLQkJCQkJCQkgICAgICBOVUxMLCBOVUxMKTsKLQkJCQkJQlVHX09OKCFiY2hfa2V5bGlzdF9lbXB0eSgma2V5cykpOwotCi0JCQkJCXJ3X3VubG9jayh0cnVlLCBsYXN0LT5iKTsKLQkJCQkJbGFzdC0+YiA9IG47Ci0KLQkJCQkJLyogSW52YWxpZGF0ZWQgb3VyIGl0ZXJhdG9yICovCi0JCQkJCXJldCA9IC1FSU5UUjsKKwkJCWlmIChzaG91bGRfcmV3cml0ZSkgeworCQkJCXJldCA9IGJ0cmVlX2djX3Jld3JpdGVfbm9kZShiLCBvcCwgbGFzdC0+Yik7CisJCQkJaWYgKHJldCkKIAkJCQkJYnJlYWs7Ci0JCQkJfQogCQkJfQogCiAJCQlpZiAobGFzdC0+Yi0+bGV2ZWwpIHsKQEAgLTE0NjQsOCArMTU1MiwxMCBAQAogCQkJICogTXVzdCBmbHVzaCBsZWFmIG5vZGVzIGJlZm9yZSBnYyBlbmRzLCBzaW5jZSByZXBsYWNlCiAJCQkgKiBvcGVyYXRpb25zIGFyZW4ndCBqb3VybmFsbGVkCiAJCQkgKi8KKwkJCW11dGV4X2xvY2soJmxhc3QtPmItPndyaXRlX2xvY2spOwogCQkJaWYgKGJ0cmVlX25vZGVfZGlydHkobGFzdC0+YikpCiAJCQkJYmNoX2J0cmVlX25vZGVfd3JpdGUobGFzdC0+Yiwgd3JpdGVzKTsKKwkJCW11dGV4X3VubG9jaygmbGFzdC0+Yi0+d3JpdGVfbG9jayk7CiAJCQlyd191bmxvY2sodHJ1ZSwgbGFzdC0+Yik7CiAJCX0KIApAQCAtMTQ3OCwxNSArMTU2OCwxNSBAQAogCQl9CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IEdDX01FUkdFX05PREVTOyBpKyspCi0JCWlmICghSVNfRVJSX09SX05VTEwocltpXS5iKSkgewotCQkJaWYgKGJ0cmVlX25vZGVfZGlydHkocltpXS5iKSkKLQkJCQliY2hfYnRyZWVfbm9kZV93cml0ZShyW2ldLmIsIHdyaXRlcyk7Ci0JCQlyd191bmxvY2sodHJ1ZSwgcltpXS5iKTsKKwlmb3IgKGkgPSByOyBpIDwgciArIEFSUkFZX1NJWkUocik7IGkrKykKKwkJaWYgKCFJU19FUlJfT1JfTlVMTChpLT5iKSkgeworCQkJbXV0ZXhfbG9jaygmaS0+Yi0+d3JpdGVfbG9jayk7CisJCQlpZiAoYnRyZWVfbm9kZV9kaXJ0eShpLT5iKSkKKwkJCQliY2hfYnRyZWVfbm9kZV93cml0ZShpLT5iLCB3cml0ZXMpOworCQkJbXV0ZXhfdW5sb2NrKCZpLT5iLT53cml0ZV9sb2NrKTsKKwkJCXJ3X3VubG9jayh0cnVlLCBpLT5iKTsKIAkJfQogCi0JYmNoX2tleWxpc3RfZnJlZSgma2V5cyk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNDk5LDEwICsxNTg5LDExIEBACiAKIAlzaG91bGRfcmV3cml0ZSA9IGJ0cmVlX2djX21hcmtfbm9kZShiLCBnYyk7CiAJaWYgKHNob3VsZF9yZXdyaXRlKSB7Ci0JCW4gPSBidHJlZV9ub2RlX2FsbG9jX3JlcGxhY2VtZW50KGIsIGZhbHNlKTsKKwkJbiA9IGJ0cmVlX25vZGVfYWxsb2NfcmVwbGFjZW1lbnQoYiwgTlVMTCk7CiAKIAkJaWYgKCFJU19FUlJfT1JfTlVMTChuKSkgewogCQkJYmNoX2J0cmVlX25vZGVfd3JpdGVfc3luYyhuKTsKKwogCQkJYmNoX2J0cmVlX3NldF9yb290KG4pOwogCQkJYnRyZWVfbm9kZV9mcmVlKGIpOwogCQkJcndfdW5sb2NrKHRydWUsIG4pOwpAQCAtMTUxMSw2ICsxNjAyLDggQEAKIAkJfQogCX0KIAorCV9fYmNoX2J0cmVlX21hcmtfa2V5KGItPmMsIGItPmxldmVsICsgMSwgJmItPmtleSk7CisKIAlpZiAoYi0+bGV2ZWwpIHsKIAkJcmV0ID0gYnRyZWVfZ2NfcmVjdXJzZShiLCBvcCwgd3JpdGVzLCBnYyk7CiAJCWlmIChyZXQpCkBAIC0xNTM4LDkgKzE2MzEsOSBAQAogCiAJZm9yX2VhY2hfY2FjaGUoY2EsIGMsIGkpCiAJCWZvcl9lYWNoX2J1Y2tldChiLCBjYSkgewotCQkJYi0+Z2NfZ2VuID0gYi0+Z2VuOworCQkJYi0+bGFzdF9nYyA9IGItPmdlbjsKIAkJCWlmICghYXRvbWljX3JlYWQoJmItPnBpbikpIHsKLQkJCQlTRVRfR0NfTUFSSyhiLCBHQ19NQVJLX1JFQ0xBSU1BQkxFKTsKKwkJCQlTRVRfR0NfTUFSSyhiLCAwKTsKIAkJCQlTRVRfR0NfU0VDVE9SU19VU0VEKGIsIDApOwogCQkJfQogCQl9CkBAIC0xNTQ4LDcgKzE2NDEsNyBAQAogCW11dGV4X3VubG9jaygmYy0+YnVja2V0X2xvY2spOwogfQogCi1zaXplX3QgYmNoX2J0cmVlX2djX2ZpbmlzaChzdHJ1Y3QgY2FjaGVfc2V0ICpjKQorc3RhdGljIHNpemVfdCBiY2hfYnRyZWVfZ2NfZmluaXNoKHN0cnVjdCBjYWNoZV9zZXQgKmMpCiB7CiAJc2l6ZV90IGF2YWlsYWJsZSA9IDA7CiAJc3RydWN0IGJ1Y2tldCAqYjsKQEAgLTE1NjEsMTEgKzE2NTQsNiBAQAogCWMtPmdjX21hcmtfdmFsaWQgPSAxOwogCWMtPm5lZWRfZ2MJPSAwOwogCi0JaWYgKGMtPnJvb3QpCi0JCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUygmYy0+cm9vdC0+a2V5KTsgaSsrKQotCQkJU0VUX0dDX01BUksoUFRSX0JVQ0tFVChjLCAmYy0+cm9vdC0+a2V5LCBpKSwKLQkJCQkgICAgR0NfTUFSS19NRVRBREFUQSk7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgS0VZX1BUUlMoJmMtPnV1aWRfYnVja2V0KTsgaSsrKQogCQlTRVRfR0NfTUFSSyhQVFJfQlVDS0VUKGMsICZjLT51dWlkX2J1Y2tldCwgaSksCiAJCQkgICAgR0NfTUFSS19NRVRBREFUQSk7CkBAIC0xNjA1LDE1ICsxNjkzLDE1IEBACiAJCQlTRVRfR0NfTUFSSyhjYS0+YnVja2V0cyArICppLCBHQ19NQVJLX01FVEFEQVRBKTsKIAogCQlmb3JfZWFjaF9idWNrZXQoYiwgY2EpIHsKLQkJCWItPmxhc3RfZ2MJPSBiLT5nY19nZW47CiAJCQljLT5uZWVkX2djCT0gbWF4KGMtPm5lZWRfZ2MsIGJ1Y2tldF9nY19nZW4oYikpOwogCi0JCQlpZiAoIWF0b21pY19yZWFkKCZiLT5waW4pICYmCi0JCQkgICAgR0NfTUFSSyhiKSA9PSBHQ19NQVJLX1JFQ0xBSU1BQkxFKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJmItPnBpbikpCisJCQkJY29udGludWU7CisKKwkJCUJVR19PTighR0NfTUFSSyhiKSAmJiBHQ19TRUNUT1JTX1VTRUQoYikpOworCisJCQlpZiAoIUdDX01BUksoYikgfHwgR0NfTUFSSyhiKSA9PSBHQ19NQVJLX1JFQ0xBSU1BQkxFKQogCQkJCWF2YWlsYWJsZSsrOwotCQkJCWlmICghR0NfU0VDVE9SU19VU0VEKGIpKQotCQkJCQliY2hfYnVja2V0X2FkZF91bnVzZWQoY2EsIGIpOwotCQkJfQogCQl9CiAJfQogCkBAIC0xNzA1LDM2ICsxNzkzLDE2IEBACiAKIC8qIEluaXRpYWwgcGFydGlhbCBnYyAqLwogCi1zdGF0aWMgaW50IGJjaF9idHJlZV9jaGVja19yZWN1cnNlKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGJ0cmVlX29wICpvcCwKLQkJCQkgICB1bnNpZ25lZCBsb25nICoqc2VlbikKK3N0YXRpYyBpbnQgYmNoX2J0cmVlX2NoZWNrX3JlY3Vyc2Uoc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3QgYnRyZWVfb3AgKm9wKQogewogCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGk7CiAJc3RydWN0IGJrZXkgKmssICpwID0gTlVMTDsKLQlzdHJ1Y3QgYnVja2V0ICpnOwogCXN0cnVjdCBidHJlZV9pdGVyIGl0ZXI7CiAKLQlmb3JfZWFjaF9rZXlfZmlsdGVyKCZiLT5rZXlzLCBrLCAmaXRlciwgYmNoX3B0cl9pbnZhbGlkKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUyhrKTsgaSsrKSB7Ci0JCQlpZiAoIXB0cl9hdmFpbGFibGUoYi0+YywgaywgaSkpCi0JCQkJY29udGludWU7CisJZm9yX2VhY2hfa2V5X2ZpbHRlcigmYi0+a2V5cywgaywgJml0ZXIsIGJjaF9wdHJfaW52YWxpZCkKKwkJYmNoX2luaXRpYWxfbWFya19rZXkoYi0+YywgYi0+bGV2ZWwsIGspOwogCi0JCQlnID0gUFRSX0JVQ0tFVChiLT5jLCBrLCBpKTsKLQotCQkJaWYgKCFfX3Rlc3RfYW5kX3NldF9iaXQoUFRSX0JVQ0tFVF9OUihiLT5jLCBrLCBpKSwKLQkJCQkJCXNlZW5bUFRSX0RFVihrLCBpKV0pIHx8Ci0JCQkgICAgIXB0cl9zdGFsZShiLT5jLCBrLCBpKSkgewotCQkJCWctPmdlbiA9IFBUUl9HRU4oaywgaSk7Ci0KLQkJCQlpZiAoYi0+bGV2ZWwpCi0JCQkJCWctPnByaW8gPSBCVFJFRV9QUklPOwotCQkJCWVsc2UgaWYgKGctPnByaW8gPT0gQlRSRUVfUFJJTykKLQkJCQkJZy0+cHJpbyA9IElOSVRJQUxfUFJJTzsKLQkJCX0KLQkJfQotCi0JCWJ0cmVlX21hcmtfa2V5KGIsIGspOwotCX0KKwliY2hfaW5pdGlhbF9tYXJrX2tleShiLT5jLCBiLT5sZXZlbCArIDEsICZiLT5rZXkpOwogCiAJaWYgKGItPmxldmVsKSB7CiAJCWJjaF9idHJlZV9pdGVyX2luaXQoJmItPmtleXMsICZpdGVyLCBOVUxMKTsKQEAgLTE3NDYsNDAgKzE4MTQsNTggQEAKIAkJCQlidHJlZV9ub2RlX3ByZWZldGNoKGItPmMsIGssIGItPmxldmVsIC0gMSk7CiAKIAkJCWlmIChwKQotCQkJCXJldCA9IGJ0cmVlKGNoZWNrX3JlY3Vyc2UsIHAsIGIsIG9wLCBzZWVuKTsKKwkJCQlyZXQgPSBidHJlZShjaGVja19yZWN1cnNlLCBwLCBiLCBvcCk7CiAKIAkJCXAgPSBrOwogCQl9IHdoaWxlIChwICYmICFyZXQpOwogCX0KIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIGludCBiY2hfYnRyZWVfY2hlY2soc3RydWN0IGNhY2hlX3NldCAqYykKIHsKLQlpbnQgcmV0ID0gLUVOT01FTTsKLQl1bnNpZ25lZCBpOwotCXVuc2lnbmVkIGxvbmcgKnNlZW5bTUFYX0NBQ0hFU19QRVJfU0VUXTsKIAlzdHJ1Y3QgYnRyZWVfb3Agb3A7CiAKLQltZW1zZXQoc2VlbiwgMCwgc2l6ZW9mKHNlZW4pKTsKIAliY2hfYnRyZWVfb3BfaW5pdCgmb3AsIFNIUlRfTUFYKTsKIAotCWZvciAoaSA9IDA7IGMtPmNhY2hlW2ldOyBpKyspIHsKLQkJc2l6ZV90IG4gPSBESVZfUk9VTkRfVVAoYy0+Y2FjaGVbaV0tPnNiLm5idWNrZXRzLCA4KTsKLQkJc2VlbltpXSA9IGttYWxsb2MobiwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghc2VlbltpXSkKLQkJCWdvdG8gZXJyOworCXJldHVybiBidHJlZV9yb290KGNoZWNrX3JlY3Vyc2UsIGMsICZvcCk7Cit9CiAKLQkJLyogRGlzYWJsZXMgdGhlIHNlZW4gYXJyYXkgdW50aWwgcHJpb19yZWFkKCkgdXNlcyBpdCB0b28gKi8KLQkJbWVtc2V0KHNlZW5baV0sIDB4RkYsIG4pOwordm9pZCBiY2hfaW5pdGlhbF9nY19maW5pc2goc3RydWN0IGNhY2hlX3NldCAqYykKK3sKKwlzdHJ1Y3QgY2FjaGUgKmNhOworCXN0cnVjdCBidWNrZXQgKmI7CisJdW5zaWduZWQgaTsKKworCWJjaF9idHJlZV9nY19maW5pc2goYyk7CisKKwltdXRleF9sb2NrKCZjLT5idWNrZXRfbG9jayk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gcHV0IHNvbWUgdW51c2VkIGJ1Y2tldHMgZGlyZWN0bHkgb24gdGhlIHByaW8gZnJlZWxpc3QgaW4KKwkgKiBvcmRlciB0byBnZXQgdGhlIGFsbG9jYXRvciB0aHJlYWQgc3RhcnRlZCAtIGl0IG5lZWRzIGZyZWVkIGJ1Y2tldHMgaW4KKwkgKiBvcmRlciB0byByZXdyaXRlIHRoZSBwcmlvcyBhbmQgZ2VucywgYW5kIGl0IG5lZWRzIHRvIHJld3JpdGUgcHJpb3MKKwkgKiBhbmQgZ2VucyBpbiBvcmRlciB0byBmcmVlIGJ1Y2tldHMuCisJICoKKwkgKiBUaGlzIGlzIG9ubHkgc2FmZSBmb3IgYnVja2V0cyB0aGF0IGhhdmUgbm8gbGl2ZSBkYXRhIGluIHRoZW0sIHdoaWNoCisJICogdGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBzb21lIG9mLgorCSAqLworCWZvcl9lYWNoX2NhY2hlKGNhLCBjLCBpKSB7CisJCWZvcl9lYWNoX2J1Y2tldChiLCBjYSkgeworCQkJaWYgKGZpZm9fZnVsbCgmY2EtPmZyZWVbUkVTRVJWRV9QUklPXSkpCisJCQkJYnJlYWs7CisKKwkJCWlmIChiY2hfY2FuX2ludmFsaWRhdGVfYnVja2V0KGNhLCBiKSAmJgorCQkJICAgICFHQ19NQVJLKGIpKSB7CisJCQkJX19iY2hfaW52YWxpZGF0ZV9vbmVfYnVja2V0KGNhLCBiKTsKKwkJCQlmaWZvX3B1c2goJmNhLT5mcmVlW1JFU0VSVkVfUFJJT10sCisJCQkJCSAgYiAtIGNhLT5idWNrZXRzKTsKKwkJCX0KKwkJfQogCX0KIAotCXJldCA9IGJ0cmVlX3Jvb3QoY2hlY2tfcmVjdXJzZSwgYywgJm9wLCBzZWVuKTsKLWVycjoKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0NBQ0hFU19QRVJfU0VUOyBpKyspCi0JCWtmcmVlKHNlZW5baV0pOwotCXJldHVybiByZXQ7CisJbXV0ZXhfdW5sb2NrKCZjLT5idWNrZXRfbG9jayk7CiB9CiAKIC8qIEJ0cmVlIGluc2VydGlvbiAqLwpAQCAtMTg3MSwxMSArMTk1NywxNCBAQAogCWNsb3N1cmVfaW5pdF9zdGFjaygmY2wpOwogCWJjaF9rZXlsaXN0X2luaXQoJnBhcmVudF9rZXlzKTsKIAotCWlmICghYi0+bGV2ZWwgJiYKLQkgICAgYnRyZWVfY2hlY2tfcmVzZXJ2ZShiLCBvcCkpCi0JCXJldHVybiAtRUlOVFI7CisJaWYgKGJ0cmVlX2NoZWNrX3Jlc2VydmUoYiwgb3ApKSB7CisJCWlmICghYi0+bGV2ZWwpCisJCQlyZXR1cm4gLUVJTlRSOworCQllbHNlCisJCQlXQVJOKDEsICJpbnN1ZmZpY2llbnQgcmVzZXJ2ZSBmb3Igc3BsaXRcbiIpOworCX0KIAotCW4xID0gYnRyZWVfbm9kZV9hbGxvY19yZXBsYWNlbWVudChiLCB0cnVlKTsKKwluMSA9IGJ0cmVlX25vZGVfYWxsb2NfcmVwbGFjZW1lbnQoYiwgb3ApOwogCWlmIChJU19FUlIobjEpKQogCQlnb3RvIGVycjsKIApAQCAtMTg4NywxNiArMTk3NiwxOSBAQAogCiAJCXRyYWNlX2JjYWNoZV9idHJlZV9ub2RlX3NwbGl0KGIsIGJ0cmVlX2JzZXRfZmlyc3QobjEpLT5rZXlzKTsKIAotCQluMiA9IGJjaF9idHJlZV9ub2RlX2FsbG9jKGItPmMsIGItPmxldmVsLCB0cnVlKTsKKwkJbjIgPSBiY2hfYnRyZWVfbm9kZV9hbGxvYyhiLT5jLCBvcCwgYi0+bGV2ZWwpOwogCQlpZiAoSVNfRVJSKG4yKSkKIAkJCWdvdG8gZXJyX2ZyZWUxOwogCiAJCWlmICghYi0+cGFyZW50KSB7Ci0JCQluMyA9IGJjaF9idHJlZV9ub2RlX2FsbG9jKGItPmMsIGItPmxldmVsICsgMSwgdHJ1ZSk7CisJCQluMyA9IGJjaF9idHJlZV9ub2RlX2FsbG9jKGItPmMsIG9wLCBiLT5sZXZlbCArIDEpOwogCQkJaWYgKElTX0VSUihuMykpCiAJCQkJZ290byBlcnJfZnJlZTI7CiAJCX0KIAorCQltdXRleF9sb2NrKCZuMS0+d3JpdGVfbG9jayk7CisJCW11dGV4X2xvY2soJm4yLT53cml0ZV9sb2NrKTsKKwogCQliY2hfYnRyZWVfaW5zZXJ0X2tleXMobjEsIG9wLCBpbnNlcnRfa2V5cywgcmVwbGFjZV9rZXkpOwogCiAJCS8qCkBAIC0xOTIzLDQ1ICsyMDE1LDQ1IEBACiAKIAkJYmNoX2tleWxpc3RfYWRkKCZwYXJlbnRfa2V5cywgJm4yLT5rZXkpOwogCQliY2hfYnRyZWVfbm9kZV93cml0ZShuMiwgJmNsKTsKKwkJbXV0ZXhfdW5sb2NrKCZuMi0+d3JpdGVfbG9jayk7CiAJCXJ3X3VubG9jayh0cnVlLCBuMik7CiAJfSBlbHNlIHsKIAkJdHJhY2VfYmNhY2hlX2J0cmVlX25vZGVfY29tcGFjdChiLCBidHJlZV9ic2V0X2ZpcnN0KG4xKS0+a2V5cyk7CiAKKwkJbXV0ZXhfbG9jaygmbjEtPndyaXRlX2xvY2spOwogCQliY2hfYnRyZWVfaW5zZXJ0X2tleXMobjEsIG9wLCBpbnNlcnRfa2V5cywgcmVwbGFjZV9rZXkpOwogCX0KIAogCWJjaF9rZXlsaXN0X2FkZCgmcGFyZW50X2tleXMsICZuMS0+a2V5KTsKIAliY2hfYnRyZWVfbm9kZV93cml0ZShuMSwgJmNsKTsKKwltdXRleF91bmxvY2soJm4xLT53cml0ZV9sb2NrKTsKIAogCWlmIChuMykgewogCQkvKiBEZXB0aCBpbmNyZWFzZXMsIG1ha2UgYSBuZXcgcm9vdCAqLworCQltdXRleF9sb2NrKCZuMy0+d3JpdGVfbG9jayk7CiAJCWJrZXlfY29weV9rZXkoJm4zLT5rZXksICZNQVhfS0VZKTsKIAkJYmNoX2J0cmVlX2luc2VydF9rZXlzKG4zLCBvcCwgJnBhcmVudF9rZXlzLCBOVUxMKTsKIAkJYmNoX2J0cmVlX25vZGVfd3JpdGUobjMsICZjbCk7CisJCW11dGV4X3VubG9jaygmbjMtPndyaXRlX2xvY2spOwogCiAJCWNsb3N1cmVfc3luYygmY2wpOwogCQliY2hfYnRyZWVfc2V0X3Jvb3QobjMpOwogCQlyd191bmxvY2sodHJ1ZSwgbjMpOwotCi0JCWJ0cmVlX25vZGVfZnJlZShiKTsKIAl9IGVsc2UgaWYgKCFiLT5wYXJlbnQpIHsKIAkJLyogUm9vdCBmaWxsZWQgdXAgYnV0IGRpZG4ndCBuZWVkIHRvIGJlIHNwbGl0ICovCiAJCWNsb3N1cmVfc3luYygmY2wpOwogCQliY2hfYnRyZWVfc2V0X3Jvb3QobjEpOwotCi0JCWJ0cmVlX25vZGVfZnJlZShiKTsKIAl9IGVsc2UgewogCQkvKiBTcGxpdCBhIG5vbiByb290IG5vZGUgKi8KIAkJY2xvc3VyZV9zeW5jKCZjbCk7CiAJCW1ha2VfYnRyZWVfZnJlZWluZ19rZXkoYiwgcGFyZW50X2tleXMudG9wKTsKIAkJYmNoX2tleWxpc3RfcHVzaCgmcGFyZW50X2tleXMpOwogCi0JCWJ0cmVlX25vZGVfZnJlZShiKTsKLQogCQliY2hfYnRyZWVfaW5zZXJ0X25vZGUoYi0+cGFyZW50LCBvcCwgJnBhcmVudF9rZXlzLCBOVUxMLCBOVUxMKTsKIAkJQlVHX09OKCFiY2hfa2V5bGlzdF9lbXB0eSgmcGFyZW50X2tleXMpKTsKIAl9CiAKKwlidHJlZV9ub2RlX2ZyZWUoYik7CiAJcndfdW5sb2NrKHRydWUsIG4xKTsKIAogCWJjaF90aW1lX3N0YXRzX3VwZGF0ZSgmYi0+Yy0+YnRyZWVfc3BsaXRfdGltZSwgc3RhcnRfdGltZSk7CkBAIC0xOTc2LDcgKzIwNjgsNyBAQAogCWJ0cmVlX25vZGVfZnJlZShuMSk7CiAJcndfdW5sb2NrKHRydWUsIG4xKTsKIGVycjoKLQlXQVJOKDEsICJiY2FjaGU6IGJ0cmVlIHNwbGl0IGZhaWxlZCIpOworCVdBUk4oMSwgImJjYWNoZTogYnRyZWUgc3BsaXQgZmFpbGVkIChsZXZlbCAldSkiLCBiLT5sZXZlbCk7CiAKIAlpZiAobjMgPT0gRVJSX1BUUigtRUFHQUlOKSB8fAogCSAgICBuMiA9PSBFUlJfUFRSKC1FQUdBSU4pIHx8CkBAIC0xOTkxLDMzICsyMDgzLDU0IEBACiAJCQkJIGF0b21pY190ICpqb3VybmFsX3JlZiwKIAkJCQkgc3RydWN0IGJrZXkgKnJlcGxhY2Vfa2V5KQogeworCXN0cnVjdCBjbG9zdXJlIGNsOworCiAJQlVHX09OKGItPmxldmVsICYmIHJlcGxhY2Vfa2V5KTsKIAorCWNsb3N1cmVfaW5pdF9zdGFjaygmY2wpOworCisJbXV0ZXhfbG9jaygmYi0+d3JpdGVfbG9jayk7CisKKwlpZiAod3JpdGVfYmxvY2soYikgIT0gYnRyZWVfYnNldF9sYXN0KGIpICYmCisJICAgIGItPmtleXMubGFzdF9zZXRfdW53cml0dGVuKQorCQliY2hfYnRyZWVfaW5pdF9uZXh0KGIpOyAvKiBqdXN0IHdyb3RlIGEgc2V0ICovCisKIAlpZiAoYmNoX2tleWxpc3RfbmtleXMoaW5zZXJ0X2tleXMpID4gaW5zZXJ0X3U2NHNfcmVtYWluaW5nKGIpKSB7Ci0JCWlmIChjdXJyZW50LT5iaW9fbGlzdCkgewotCQkJb3AtPmxvY2sgPSBiLT5jLT5yb290LT5sZXZlbCArIDE7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJfSBlbHNlIGlmIChvcC0+bG9jayA8PSBiLT5jLT5yb290LT5sZXZlbCkgewotCQkJb3AtPmxvY2sgPSBiLT5jLT5yb290LT5sZXZlbCArIDE7Ci0JCQlyZXR1cm4gLUVJTlRSOwotCQl9IGVsc2UgewotCQkJLyogSW52YWxpZGF0ZWQgYWxsIGl0ZXJhdG9ycyAqLwotCQkJaW50IHJldCA9IGJ0cmVlX3NwbGl0KGIsIG9wLCBpbnNlcnRfa2V5cywgcmVwbGFjZV9rZXkpOworCQltdXRleF91bmxvY2soJmItPndyaXRlX2xvY2spOworCQlnb3RvIHNwbGl0OworCX0KIAotCQkJcmV0dXJuIGJjaF9rZXlsaXN0X2VtcHR5KGluc2VydF9rZXlzKSA/Ci0JCQkJMCA6IHJldCA/OiAtRUlOVFI7Ci0JCX0KKwlCVUdfT04od3JpdGVfYmxvY2soYikgIT0gYnRyZWVfYnNldF9sYXN0KGIpKTsKKworCWlmIChiY2hfYnRyZWVfaW5zZXJ0X2tleXMoYiwgb3AsIGluc2VydF9rZXlzLCByZXBsYWNlX2tleSkpIHsKKwkJaWYgKCFiLT5sZXZlbCkKKwkJCWJjaF9idHJlZV9sZWFmX2RpcnR5KGIsIGpvdXJuYWxfcmVmKTsKKwkJZWxzZQorCQkJYmNoX2J0cmVlX25vZGVfd3JpdGUoYiwgJmNsKTsKKwl9CisKKwltdXRleF91bmxvY2soJmItPndyaXRlX2xvY2spOworCisJLyogd2FpdCBmb3IgYnRyZWUgbm9kZSB3cml0ZSBpZiBuZWNlc3NhcnksIGFmdGVyIHVubG9jayAqLworCWNsb3N1cmVfc3luYygmY2wpOworCisJcmV0dXJuIDA7CitzcGxpdDoKKwlpZiAoY3VycmVudC0+YmlvX2xpc3QpIHsKKwkJb3AtPmxvY2sgPSBiLT5jLT5yb290LT5sZXZlbCArIDE7CisJCXJldHVybiAtRUFHQUlOOworCX0gZWxzZSBpZiAob3AtPmxvY2sgPD0gYi0+Yy0+cm9vdC0+bGV2ZWwpIHsKKwkJb3AtPmxvY2sgPSBiLT5jLT5yb290LT5sZXZlbCArIDE7CisJCXJldHVybiAtRUlOVFI7CiAJfSBlbHNlIHsKLQkJQlVHX09OKHdyaXRlX2Jsb2NrKGIpICE9IGJ0cmVlX2JzZXRfbGFzdChiKSk7CisJCS8qIEludmFsaWRhdGVkIGFsbCBpdGVyYXRvcnMgKi8KKwkJaW50IHJldCA9IGJ0cmVlX3NwbGl0KGIsIG9wLCBpbnNlcnRfa2V5cywgcmVwbGFjZV9rZXkpOwogCi0JCWlmIChiY2hfYnRyZWVfaW5zZXJ0X2tleXMoYiwgb3AsIGluc2VydF9rZXlzLCByZXBsYWNlX2tleSkpIHsKLQkJCWlmICghYi0+bGV2ZWwpCi0JCQkJYmNoX2J0cmVlX2xlYWZfZGlydHkoYiwgam91cm5hbF9yZWYpOwotCQkJZWxzZQotCQkJCWJjaF9idHJlZV9ub2RlX3dyaXRlX3N5bmMoYik7Ci0JCX0KLQotCQlyZXR1cm4gMDsKKwkJaWYgKGJjaF9rZXlsaXN0X2VtcHR5KGluc2VydF9rZXlzKSkKKwkJCXJldHVybiAwOworCQllbHNlIGlmICghcmV0KQorCQkJcmV0dXJuIC1FSU5UUjsKKwkJcmV0dXJuIHJldDsKIAl9CiB9CiAKQEAgLTI0MDMsMTggKzI1MTYsMyBAQAogCXNwaW5fbG9ja19pbml0KCZidWYtPmxvY2spOwogCWFycmF5X2FsbG9jYXRvcl9pbml0KCZidWYtPmZyZWVsaXN0KTsKIH0KLQotdm9pZCBiY2hfYnRyZWVfZXhpdCh2b2lkKQotewotCWlmIChidHJlZV9pb193cSkKLQkJZGVzdHJveV93b3JrcXVldWUoYnRyZWVfaW9fd3EpOwotfQotCi1pbnQgX19pbml0IGJjaF9idHJlZV9pbml0KHZvaWQpCi17Ci0JYnRyZWVfaW9fd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYmNoX2J0cmVlX2lvIik7Ci0JaWYgKCFidHJlZV9pb193cSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL2J0cmVlLmggYi9kcml2ZXJzL21kL2JjYWNoZS9idHJlZS5oCmluZGV4IGFmMDY1ZTkuLjkxZGZhNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL2J0cmVlLmgKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvYnRyZWUuaApAQCAtMTI3LDYgKzEyNyw4IEBACiAJc3RydWN0IGNhY2hlX3NldAkqYzsKIAlzdHJ1Y3QgYnRyZWUJCSpwYXJlbnQ7CiAKKwlzdHJ1Y3QgbXV0ZXgJCXdyaXRlX2xvY2s7CisKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAl1aW50MTZfdAkJd3JpdHRlbjsJLyogd291bGQgYmUgbmljZSB0byBraWxsICovCiAJdWludDhfdAkJCWxldmVsOwpAQCAtMjM2LDExICsyMzgsMTMgQEAKIH0KIAogdm9pZCBiY2hfYnRyZWVfbm9kZV9yZWFkX2RvbmUoc3RydWN0IGJ0cmVlICopOwordm9pZCBfX2JjaF9idHJlZV9ub2RlX3dyaXRlKHN0cnVjdCBidHJlZSAqLCBzdHJ1Y3QgY2xvc3VyZSAqKTsKIHZvaWQgYmNoX2J0cmVlX25vZGVfd3JpdGUoc3RydWN0IGJ0cmVlICosIHN0cnVjdCBjbG9zdXJlICopOwogCiB2b2lkIGJjaF9idHJlZV9zZXRfcm9vdChzdHJ1Y3QgYnRyZWUgKik7Ci1zdHJ1Y3QgYnRyZWUgKmJjaF9idHJlZV9ub2RlX2FsbG9jKHN0cnVjdCBjYWNoZV9zZXQgKiwgaW50LCBib29sKTsKLXN0cnVjdCBidHJlZSAqYmNoX2J0cmVlX25vZGVfZ2V0KHN0cnVjdCBjYWNoZV9zZXQgKiwgc3RydWN0IGJrZXkgKiwgaW50LCBib29sKTsKK3N0cnVjdCBidHJlZSAqYmNoX2J0cmVlX25vZGVfYWxsb2Moc3RydWN0IGNhY2hlX3NldCAqLCBzdHJ1Y3QgYnRyZWVfb3AgKiwgaW50KTsKK3N0cnVjdCBidHJlZSAqYmNoX2J0cmVlX25vZGVfZ2V0KHN0cnVjdCBjYWNoZV9zZXQgKiwgc3RydWN0IGJ0cmVlX29wICosCisJCQkJIHN0cnVjdCBia2V5ICosIGludCwgYm9vbCk7CiAKIGludCBiY2hfYnRyZWVfaW5zZXJ0X2NoZWNrX2tleShzdHJ1Y3QgYnRyZWUgKiwgc3RydWN0IGJ0cmVlX29wICosCiAJCQkgICAgICAgc3RydWN0IGJrZXkgKik7CkBAIC0yNDgsMTAgKzI1MiwxMCBAQAogCQkgICAgIGF0b21pY190ICosIHN0cnVjdCBia2V5ICopOwogCiBpbnQgYmNoX2djX3RocmVhZF9zdGFydChzdHJ1Y3QgY2FjaGVfc2V0ICopOwotc2l6ZV90IGJjaF9idHJlZV9nY19maW5pc2goc3RydWN0IGNhY2hlX3NldCAqKTsKK3ZvaWQgYmNoX2luaXRpYWxfZ2NfZmluaXNoKHN0cnVjdCBjYWNoZV9zZXQgKik7CiB2b2lkIGJjaF9tb3ZpbmdfZ2Moc3RydWN0IGNhY2hlX3NldCAqKTsKIGludCBiY2hfYnRyZWVfY2hlY2soc3RydWN0IGNhY2hlX3NldCAqKTsKLXVpbnQ4X3QgX19iY2hfYnRyZWVfbWFya19rZXkoc3RydWN0IGNhY2hlX3NldCAqLCBpbnQsIHN0cnVjdCBia2V5ICopOwordm9pZCBiY2hfaW5pdGlhbF9tYXJrX2tleShzdHJ1Y3QgY2FjaGVfc2V0ICosIGludCwgc3RydWN0IGJrZXkgKik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3YWtlX3VwX2djKHN0cnVjdCBjYWNoZV9zZXQgKmMpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9leHRlbnRzLmMgYi9kcml2ZXJzL21kL2JjYWNoZS9leHRlbnRzLmMKaW5kZXggNDE2ZDFhMy4uM2EwZGU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvZXh0ZW50cy5jCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL2V4dGVudHMuYwpAQCAtMTk0LDkgKzE5NCw5IEBACiAJbXV0ZXhfdW5sb2NrKCZiLT5jLT5idWNrZXRfbG9jayk7CiAJYmNoX2V4dGVudF90b190ZXh0KGJ1Ziwgc2l6ZW9mKGJ1ZiksIGspOwogCWJ0cmVlX2J1ZyhiLAotImluY29uc2lzdGVudCBidHJlZSBwb2ludGVyICVzOiBidWNrZXQgJXppIHBpbiAlaSBwcmlvICVpIGdlbiAlaSBsYXN0X2djICVpIG1hcmsgJWxsdSBnY19nZW4gJWkiLAorImluY29uc2lzdGVudCBidHJlZSBwb2ludGVyICVzOiBidWNrZXQgJXppIHBpbiAlaSBwcmlvICVpIGdlbiAlaSBsYXN0X2djICVpIG1hcmsgJWxsdSIsCiAJCSAgYnVmLCBQVFJfQlVDS0VUX05SKGItPmMsIGssIGkpLCBhdG9taWNfcmVhZCgmZy0+cGluKSwKLQkJICBnLT5wcmlvLCBnLT5nZW4sIGctPmxhc3RfZ2MsIEdDX01BUksoZyksIGctPmdjX2dlbik7CisJCSAgZy0+cHJpbywgZy0+Z2VuLCBnLT5sYXN0X2djLCBHQ19NQVJLKGcpKTsKIAlyZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMzA4LDYgKzMwOCwxNiBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgdm9pZCBiY2hfc3VidHJhY3RfZGlydHkoc3RydWN0IGJrZXkgKmssCisJCQkgICBzdHJ1Y3QgY2FjaGVfc2V0ICpjLAorCQkJICAgdWludDY0X3Qgb2Zmc2V0LAorCQkJICAgaW50IHNlY3RvcnMpCit7CisJaWYgKEtFWV9ESVJUWShrKSkKKwkJYmNhY2hlX2Rldl9zZWN0b3JzX2RpcnR5X2FkZChjLCBLRVlfSU5PREUoayksCisJCQkJCSAgICAgb2Zmc2V0LCAtc2VjdG9ycyk7Cit9CisKIHN0YXRpYyBib29sIGJjaF9leHRlbnRfaW5zZXJ0X2ZpeHVwKHN0cnVjdCBidHJlZV9rZXlzICpiLAogCQkJCSAgICBzdHJ1Y3QgYmtleSAqaW5zZXJ0LAogCQkJCSAgICBzdHJ1Y3QgYnRyZWVfaXRlciAqaXRlciwKQEAgLTMxNSwxMyArMzI1LDYgQEAKIHsKIAlzdHJ1Y3QgY2FjaGVfc2V0ICpjID0gY29udGFpbmVyX29mKGIsIHN0cnVjdCBidHJlZSwga2V5cyktPmM7CiAKLQl2b2lkIHN1YnRyYWN0X2RpcnR5KHN0cnVjdCBia2V5ICprLCB1aW50NjRfdCBvZmZzZXQsIGludCBzZWN0b3JzKQotCXsKLQkJaWYgKEtFWV9ESVJUWShrKSkKLQkJCWJjYWNoZV9kZXZfc2VjdG9yc19kaXJ0eV9hZGQoYywgS0VZX0lOT0RFKGspLAotCQkJCQkJICAgICBvZmZzZXQsIC1zZWN0b3JzKTsKLQl9Ci0KIAl1aW50NjRfdCBvbGRfb2Zmc2V0OwogCXVuc2lnbmVkIG9sZF9zaXplLCBzZWN0b3JzX2ZvdW5kID0gMDsKIApAQCAtMzk4LDcgKzQwMSw4IEBACiAKIAkJCXN0cnVjdCBia2V5ICp0b3A7CiAKLQkJCXN1YnRyYWN0X2RpcnR5KGssIEtFWV9TVEFSVChpbnNlcnQpLCBLRVlfU0laRShpbnNlcnQpKTsKKwkJCWJjaF9zdWJ0cmFjdF9kaXJ0eShrLCBjLCBLRVlfU1RBUlQoaW5zZXJ0KSwKKwkJCQkgICAgICAgS0VZX1NJWkUoaW5zZXJ0KSk7CiAKIAkJCWlmIChia2V5X3dyaXR0ZW4oYiwgaykpIHsKIAkJCQkvKgpAQCAtNDQ4LDcgKzQ1Miw3IEBACiAJCQl9CiAJCX0KIAotCQlzdWJ0cmFjdF9kaXJ0eShrLCBvbGRfb2Zmc2V0LCBvbGRfc2l6ZSAtIEtFWV9TSVpFKGspKTsKKwkJYmNoX3N1YnRyYWN0X2RpcnR5KGssIGMsIG9sZF9vZmZzZXQsIG9sZF9zaXplIC0gS0VZX1NJWkUoaykpOwogCX0KIAogY2hlY2tfZmFpbGVkOgpAQCAtNDk5LDkgKzUwMyw5IEBACiAKIAlpZiAobXV0ZXhfdHJ5bG9jaygmYi0+Yy0+YnVja2V0X2xvY2spKSB7CiAJCWlmIChiLT5jLT5nY19tYXJrX3ZhbGlkICYmCi0JCSAgICAoKEdDX01BUksoZykgIT0gR0NfTUFSS19ESVJUWSAmJgotCQkgICAgICBLRVlfRElSVFkoaykpIHx8Ci0JCSAgICAgR0NfTUFSSyhnKSA9PSBHQ19NQVJLX01FVEFEQVRBKSkKKwkJICAgICghR0NfTUFSSyhnKSB8fAorCQkgICAgIEdDX01BUksoZykgPT0gR0NfTUFSS19NRVRBREFUQSB8fAorCQkgICAgIChHQ19NQVJLKGcpICE9IEdDX01BUktfRElSVFkgJiYgS0VZX0RJUlRZKGspKSkpCiAJCQlnb3RvIGVycjsKIAogCQlpZiAoZy0+cHJpbyA9PSBCVFJFRV9QUklPKQpAQCAtNTE1LDkgKzUxOSw5IEBACiAJbXV0ZXhfdW5sb2NrKCZiLT5jLT5idWNrZXRfbG9jayk7CiAJYmNoX2V4dGVudF90b190ZXh0KGJ1Ziwgc2l6ZW9mKGJ1ZiksIGspOwogCWJ0cmVlX2J1ZyhiLAotImluY29uc2lzdGVudCBleHRlbnQgcG9pbnRlciAlczpcbmJ1Y2tldCAlenUgcGluICVpIHByaW8gJWkgZ2VuICVpIGxhc3RfZ2MgJWkgbWFyayAlbGx1IGdjX2dlbiAlaSIsCisiaW5jb25zaXN0ZW50IGV4dGVudCBwb2ludGVyICVzOlxuYnVja2V0ICV6dSBwaW4gJWkgcHJpbyAlaSBnZW4gJWkgbGFzdF9nYyAlaSBtYXJrICVsbHUiLAogCQkgIGJ1ZiwgUFRSX0JVQ0tFVF9OUihiLT5jLCBrLCBwdHIpLCBhdG9taWNfcmVhZCgmZy0+cGluKSwKLQkJICBnLT5wcmlvLCBnLT5nZW4sIGctPmxhc3RfZ2MsIEdDX01BUksoZyksIGctPmdjX2dlbik7CisJCSAgZy0+cHJpbywgZy0+Z2VuLCBnLT5sYXN0X2djLCBHQ19NQVJLKGcpKTsKIAlyZXR1cm4gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvam91cm5hbC5jIGIvZHJpdmVycy9tZC9iY2FjaGUvam91cm5hbC5jCmluZGV4IDE4MDM5YWYuLjU5ZTgyMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL2pvdXJuYWwuYworKysgYi9kcml2ZXJzL21kL2JjYWNoZS9qb3VybmFsLmMKQEAgLTIzNyw4ICsyMzcsMTQgQEAKIAkJZm9yIChpID0gMDsgaSA8IGNhLT5zYi5uam91cm5hbF9idWNrZXRzOyBpKyspCiAJCQlpZiAoamEtPnNlcVtpXSA+IHNlcSkgewogCQkJCXNlcSA9IGphLT5zZXFbaV07Ci0JCQkJamEtPmN1cl9pZHggPSBqYS0+ZGlzY2FyZF9pZHggPQotCQkJCQlqYS0+bGFzdF9pZHggPSBpOworCQkJCS8qCisJCQkJICogV2hlbiBqb3VybmFsX3JlY2xhaW0oKSBnb2VzIHRvIGFsbG9jYXRlIGZvcgorCQkJCSAqIHRoZSBmaXJzdCB0aW1lLCBpdCdsbCB1c2UgdGhlIGJ1Y2tldCBhZnRlcgorCQkJCSAqIGphLT5jdXJfaWR4CisJCQkJICovCisJCQkJamEtPmN1cl9pZHggPSBpOworCQkJCWphLT5sYXN0X2lkeCA9IGphLT5kaXNjYXJkX2lkeCA9IChpICsgMSkgJQorCQkJCQljYS0+c2IubmpvdXJuYWxfYnVja2V0czsKIAogCQkJfQogCX0KQEAgLTI4OCwxNiArMjk0LDExIEBACiAJCSAgICAgayA9IGJrZXlfbmV4dChrKSkgewogCQkJdW5zaWduZWQgajsKIAotCQkJZm9yIChqID0gMDsgaiA8IEtFWV9QVFJTKGspOyBqKyspIHsKLQkJCQlzdHJ1Y3QgYnVja2V0ICpnID0gUFRSX0JVQ0tFVChjLCBrLCBqKTsKLQkJCQlhdG9taWNfaW5jKCZnLT5waW4pOworCQkJZm9yIChqID0gMDsgaiA8IEtFWV9QVFJTKGspOyBqKyspCisJCQkJaWYgKHB0cl9hdmFpbGFibGUoYywgaywgaikpCisJCQkJCWF0b21pY19pbmMoJlBUUl9CVUNLRVQoYywgaywgaiktPnBpbik7CiAKLQkJCQlpZiAoZy0+cHJpbyA9PSBCVFJFRV9QUklPICYmCi0JCQkJICAgICFwdHJfc3RhbGUoYywgaywgaikpCi0JCQkJCWctPnByaW8gPSBJTklUSUFMX1BSSU87Ci0JCQl9Ci0KLQkJCV9fYmNoX2J0cmVlX21hcmtfa2V5KGMsIDAsIGspOworCQkJYmNoX2luaXRpYWxfbWFya19rZXkoYywgMCwgayk7CiAJCX0KIAl9CiB9CkBAIC0zMTIsOCArMzEzLDYgQEAKIAl1aW50NjRfdCBzdGFydCA9IGktPmoubGFzdF9zZXEsIGVuZCA9IGktPmouc2VxLCBuID0gc3RhcnQ7CiAJc3RydWN0IGtleWxpc3Qga2V5bGlzdDsKIAotCWJjaF9rZXlsaXN0X2luaXQoJmtleWxpc3QpOwotCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCBsaXN0LCBsaXN0KSB7CiAJCUJVR19PTihpLT5waW4gJiYgYXRvbWljX3JlYWQoaS0+cGluKSAhPSAxKTsKIApAQCAtMzI2LDggKzMyNSw3IEBACiAJCSAgICAgayA9IGJrZXlfbmV4dChrKSkgewogCQkJdHJhY2VfYmNhY2hlX2pvdXJuYWxfcmVwbGF5X2tleShrKTsKIAotCQkJYmtleV9jb3B5KGtleWxpc3QudG9wLCBrKTsKLQkJCWJjaF9rZXlsaXN0X3B1c2goJmtleWxpc3QpOworCQkJYmNoX2tleWxpc3RfaW5pdF9zaW5nbGUoJmtleWxpc3QsIGspOwogCiAJCQlyZXQgPSBiY2hfYnRyZWVfaW5zZXJ0KHMsICZrZXlsaXN0LCBpLT5waW4sIE5VTEwpOwogCQkJaWYgKHJldCkKQEAgLTM4MywxNiArMzgxLDE1IEBACiAKIAliID0gYmVzdDsKIAlpZiAoYikgewotCQlyd19sb2NrKHRydWUsIGIsIGItPmxldmVsKTsKLQorCQltdXRleF9sb2NrKCZiLT53cml0ZV9sb2NrKTsKIAkJaWYgKCFidHJlZV9jdXJyZW50X3dyaXRlKGIpLT5qb3VybmFsKSB7Ci0JCQlyd191bmxvY2sodHJ1ZSwgYik7CisJCQltdXRleF91bmxvY2soJmItPndyaXRlX2xvY2spOwogCQkJLyogV2UgcmFjZWQgKi8KIAkJCWdvdG8gcmV0cnk7CiAJCX0KIAotCQliY2hfYnRyZWVfbm9kZV93cml0ZShiLCBOVUxMKTsKLQkJcndfdW5sb2NrKHRydWUsIGIpOworCQlfX2JjaF9idHJlZV9ub2RlX3dyaXRlKGIsIE5VTEwpOworCQltdXRleF91bmxvY2soJmItPndyaXRlX2xvY2spOwogCX0KIH0KIApAQCAtNTM2LDYgKzUzMyw3IEBACiAJYXRvbWljX3NldCgmZmlmb19iYWNrKCZqLT5waW4pLCAxKTsKIAogCWotPmN1ci0+ZGF0YS0+c2VxCT0gKytqLT5zZXE7CisJai0+Y3VyLT5kaXJ0eQkJPSBmYWxzZTsKIAlqLT5jdXItPm5lZWRfd3JpdGUJPSBmYWxzZTsKIAlqLT5jdXItPmRhdGEtPmtleXMJPSAwOwogCkBAIC03MzEsNyArNzI5LDEwIEBACiAJCQkJCSAgIHN0cnVjdCBjYWNoZV9zZXQsCiAJCQkJCSAgIGpvdXJuYWwud29yayk7CiAJc3Bpbl9sb2NrKCZjLT5qb3VybmFsLmxvY2spOwotCWpvdXJuYWxfdHJ5X3dyaXRlKGMpOworCWlmIChjLT5qb3VybmFsLmN1ci0+ZGlydHkpCisJCWpvdXJuYWxfdHJ5X3dyaXRlKGMpOworCWVsc2UKKwkJc3Bpbl91bmxvY2soJmMtPmpvdXJuYWwubG9jayk7CiB9CiAKIC8qCkBAIC03NjEsNyArNzYyLDggQEAKIAlpZiAocGFyZW50KSB7CiAJCWNsb3N1cmVfd2FpdCgmdy0+d2FpdCwgcGFyZW50KTsKIAkJam91cm5hbF90cnlfd3JpdGUoYyk7Ci0JfSBlbHNlIGlmICghdy0+bmVlZF93cml0ZSkgeworCX0gZWxzZSBpZiAoIXctPmRpcnR5KSB7CisJCXctPmRpcnR5ID0gdHJ1ZTsKIAkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjLT5qb3VybmFsLndvcmssCiAJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhjLT5qb3VybmFsX2RlbGF5X21zKSk7CiAJCXNwaW5fdW5sb2NrKCZjLT5qb3VybmFsLmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvam91cm5hbC5oIGIvZHJpdmVycy9tZC9iY2FjaGUvam91cm5hbC5oCmluZGV4IDkxODBjNDQuLmUzYzM5NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL2pvdXJuYWwuaAorKysgYi9kcml2ZXJzL21kL2JjYWNoZS9qb3VybmFsLmgKQEAgLTk1LDYgKzk1LDcgQEAKIAogCXN0cnVjdCBjYWNoZV9zZXQJKmM7CiAJc3RydWN0IGNsb3N1cmVfd2FpdGxpc3QJd2FpdDsKKwlib29sCQkJZGlydHk7CiAJYm9vbAkJCW5lZWRfd3JpdGU7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9tb3ZpbmdnYy5jIGIvZHJpdmVycy9tZC9iY2FjaGUvbW92aW5nZ2MuYwppbmRleCA5ZWI2MGQxLi5jZDc0OTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9tb3ZpbmdnYy5jCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL21vdmluZ2djLmMKQEAgLTI0LDEyICsyNCwxMCBAQAogCQkJCQkgICBtb3ZpbmdfZ2Nfa2V5cyk7CiAJdW5zaWduZWQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUyhrKTsgaSsrKSB7Ci0JCXN0cnVjdCBidWNrZXQgKmcgPSBQVFJfQlVDS0VUKGMsIGssIGkpOwotCi0JCWlmIChHQ19NT1ZFKGcpKQorCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUyhrKTsgaSsrKQorCQlpZiAocHRyX2F2YWlsYWJsZShjLCBrLCBpKSAmJgorCQkgICAgR0NfTU9WRShQVFJfQlVDS0VUKGMsIGssIGkpKSkKIAkJCXJldHVybiB0cnVlOwotCX0KIAogCXJldHVybiBmYWxzZTsKIH0KQEAgLTExNSw3ICsxMTMsNyBAQAogCQljbG9zdXJlX2NhbGwoJm9wLT5jbCwgYmNoX2RhdGFfaW5zZXJ0LCBOVUxMLCBjbCk7CiAJfQogCi0JY29udGludWVfYXQoY2wsIHdyaXRlX21vdmluZ19maW5pc2gsIHN5c3RlbV93cSk7CisJY29udGludWVfYXQoY2wsIHdyaXRlX21vdmluZ19maW5pc2gsIG9wLT53cSk7CiB9CiAKIHN0YXRpYyB2b2lkIHJlYWRfbW92aW5nX3N1Ym1pdChzdHJ1Y3QgY2xvc3VyZSAqY2wpCkBAIC0xMjUsNyArMTIzLDcgQEAKIAogCWJjaF9zdWJtaXRfYmJpbyhiaW8sIGlvLT5vcC5jLCAmaW8tPnctPmtleSwgMCk7CiAKLQljb250aW51ZV9hdChjbCwgd3JpdGVfbW92aW5nLCBzeXN0ZW1fd3EpOworCWNvbnRpbnVlX2F0KGNsLCB3cml0ZV9tb3ZpbmcsIGlvLT5vcC53cSk7CiB9CiAKIHN0YXRpYyB2b2lkIHJlYWRfbW92aW5nKHN0cnVjdCBjYWNoZV9zZXQgKmMpCkBAIC0xNjAsNiArMTU4LDcgQEAKIAkJaW8tPncJCT0gdzsKIAkJaW8tPm9wLmlub2RlCT0gS0VZX0lOT0RFKCZ3LT5rZXkpOwogCQlpby0+b3AuYwk9IGM7CisJCWlvLT5vcC53cQk9IGMtPm1vdmluZ19nY193cTsKIAogCQltb3ZpbmdfaW5pdChpbyk7CiAJCWJpbyA9ICZpby0+YmlvLmJpbzsKQEAgLTIxNiw3ICsyMTUsMTAgQEAKIAkJY2EtPmhlYXAudXNlZCA9IDA7CiAKIAkJZm9yX2VhY2hfYnVja2V0KGIsIGNhKSB7Ci0JCQlpZiAoIUdDX1NFQ1RPUlNfVVNFRChiKSkKKwkJCWlmIChHQ19NQVJLKGIpID09IEdDX01BUktfTUVUQURBVEEgfHwKKwkJCSAgICAhR0NfU0VDVE9SU19VU0VEKGIpIHx8CisJCQkgICAgR0NfU0VDVE9SU19VU0VEKGIpID09IGNhLT5zYi5idWNrZXRfc2l6ZSB8fAorCQkJICAgIGF0b21pY19yZWFkKCZiLT5waW4pKQogCQkJCWNvbnRpbnVlOwogCiAJCQlpZiAoIWhlYXBfZnVsbCgmY2EtPmhlYXApKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9yZXF1ZXN0LmMgYi9kcml2ZXJzL21kL2JjYWNoZS9yZXF1ZXN0LmMKaW5kZXggNWQ1ZDAzMS4uMTVmZmY0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvcmVxdWVzdC5jCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL3JlcXVlc3QuYwpAQCAtMTIsMTEgKzEyLDkgQEAKICNpbmNsdWRlICJyZXF1ZXN0LmgiCiAjaW5jbHVkZSAid3JpdGViYWNrLmgiCiAKLSNpbmNsdWRlIDxsaW51eC9jZ3JvdXAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Ci0jaW5jbHVkZSAiYmxrLWNncm91cC5oIgogCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2JjYWNoZS5oPgogCkBAIC0yNywxNzEgKzI1LDEzIEBACiAKIHN0YXRpYyB2b2lkIGJjaF9kYXRhX2luc2VydF9zdGFydChzdHJ1Y3QgY2xvc3VyZSAqKTsKIAotLyogQ2dyb3VwIGludGVyZmFjZSAqLwotCi0jaWZkZWYgQ09ORklHX0NHUk9VUF9CQ0FDSEUKLXN0YXRpYyBzdHJ1Y3QgYmNoX2Nncm91cCBiY2FjaGVfZGVmYXVsdF9jZ3JvdXAgPSB7IC5jYWNoZV9tb2RlID0gLTEgfTsKLQotc3RhdGljIHN0cnVjdCBiY2hfY2dyb3VwICpjZ3JvdXBfdG9fYmNhY2hlKHN0cnVjdCBjZ3JvdXAgKmNncm91cCkKLXsKLQlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzOwotCXJldHVybiBjZ3JvdXAgJiYKLQkJKGNzcyA9IGNncm91cF9zdWJzeXNfc3RhdGUoY2dyb3VwLCBiY2FjaGVfc3Vic3lzX2lkKSkKLQkJPyBjb250YWluZXJfb2YoY3NzLCBzdHJ1Y3QgYmNoX2Nncm91cCwgY3NzKQotCQk6ICZiY2FjaGVfZGVmYXVsdF9jZ3JvdXA7Ci19Ci0KLXN0cnVjdCBiY2hfY2dyb3VwICpiY2hfYmlvX3RvX2Nncm91cChzdHJ1Y3QgYmlvICpiaW8pCi17Ci0Jc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcyA9IGJpby0+YmlfY3NzCi0JCT8gY2dyb3VwX3N1YnN5c19zdGF0ZShiaW8tPmJpX2Nzcy0+Y2dyb3VwLCBiY2FjaGVfc3Vic3lzX2lkKQotCQk6IHRhc2tfc3Vic3lzX3N0YXRlKGN1cnJlbnQsIGJjYWNoZV9zdWJzeXNfaWQpOwotCi0JcmV0dXJuIGNzcwotCQk/IGNvbnRhaW5lcl9vZihjc3MsIHN0cnVjdCBiY2hfY2dyb3VwLCBjc3MpCi0JCTogJmJjYWNoZV9kZWZhdWx0X2Nncm91cDsKLX0KLQotc3RhdGljIHNzaXplX3QgY2FjaGVfbW9kZV9yZWFkKHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCBjZnR5cGUgKmNmdCwKLQkJCXN0cnVjdCBmaWxlICpmaWxlLAotCQkJY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQotewotCWNoYXIgdG1wWzEwMjRdOwotCWludCBsZW4gPSBiY2hfc25wcmludF9zdHJpbmdfbGlzdCh0bXAsIFBBR0VfU0laRSwgYmNoX2NhY2hlX21vZGVzLAotCQkJCQkgIGNncm91cF90b19iY2FjaGUoY2dycCktPmNhY2hlX21vZGUgKyAxKTsKLQotCWlmIChsZW4gPCAwKQotCQlyZXR1cm4gbGVuOwotCi0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbmJ5dGVzLCBwcG9zLCB0bXAsIGxlbik7Ci19Ci0KLXN0YXRpYyBpbnQgY2FjaGVfbW9kZV93cml0ZShzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgY2Z0eXBlICpjZnQsCi0JCQkgICAgY29uc3QgY2hhciAqYnVmKQotewotCWludCB2ID0gYmNoX3JlYWRfc3RyaW5nX2xpc3QoYnVmLCBiY2hfY2FjaGVfbW9kZXMpOwotCWlmICh2IDwgMCkKLQkJcmV0dXJuIHY7Ci0KLQljZ3JvdXBfdG9fYmNhY2hlKGNncnApLT5jYWNoZV9tb2RlID0gdiAtIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1NjQgYmNoX3ZlcmlmeV9yZWFkKHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCBjZnR5cGUgKmNmdCkKLXsKLQlyZXR1cm4gY2dyb3VwX3RvX2JjYWNoZShjZ3JwKS0+dmVyaWZ5OwotfQotCi1zdGF0aWMgaW50IGJjaF92ZXJpZnlfd3JpdGUoc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IGNmdHlwZSAqY2Z0LCB1NjQgdmFsKQotewotCWNncm91cF90b19iY2FjaGUoY2dycCktPnZlcmlmeSA9IHZhbDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHU2NCBiY2hfY2FjaGVfaGl0c19yZWFkKHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCBjZnR5cGUgKmNmdCkKLXsKLQlzdHJ1Y3QgYmNoX2Nncm91cCAqYmNhY2hlY2cgPSBjZ3JvdXBfdG9fYmNhY2hlKGNncnApOwotCXJldHVybiBhdG9taWNfcmVhZCgmYmNhY2hlY2ctPnN0YXRzLmNhY2hlX2hpdHMpOwotfQotCi1zdGF0aWMgdTY0IGJjaF9jYWNoZV9taXNzZXNfcmVhZChzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgY2Z0eXBlICpjZnQpCi17Ci0Jc3RydWN0IGJjaF9jZ3JvdXAgKmJjYWNoZWNnID0gY2dyb3VwX3RvX2JjYWNoZShjZ3JwKTsKLQlyZXR1cm4gYXRvbWljX3JlYWQoJmJjYWNoZWNnLT5zdGF0cy5jYWNoZV9taXNzZXMpOwotfQotCi1zdGF0aWMgdTY0IGJjaF9jYWNoZV9ieXBhc3NfaGl0c19yZWFkKHN0cnVjdCBjZ3JvdXAgKmNncnAsCi0JCQkJCSBzdHJ1Y3QgY2Z0eXBlICpjZnQpCi17Ci0Jc3RydWN0IGJjaF9jZ3JvdXAgKmJjYWNoZWNnID0gY2dyb3VwX3RvX2JjYWNoZShjZ3JwKTsKLQlyZXR1cm4gYXRvbWljX3JlYWQoJmJjYWNoZWNnLT5zdGF0cy5jYWNoZV9ieXBhc3NfaGl0cyk7Ci19Ci0KLXN0YXRpYyB1NjQgYmNoX2NhY2hlX2J5cGFzc19taXNzZXNfcmVhZChzdHJ1Y3QgY2dyb3VwICpjZ3JwLAotCQkJCQkgICBzdHJ1Y3QgY2Z0eXBlICpjZnQpCi17Ci0Jc3RydWN0IGJjaF9jZ3JvdXAgKmJjYWNoZWNnID0gY2dyb3VwX3RvX2JjYWNoZShjZ3JwKTsKLQlyZXR1cm4gYXRvbWljX3JlYWQoJmJjYWNoZWNnLT5zdGF0cy5jYWNoZV9ieXBhc3NfbWlzc2VzKTsKLX0KLQotc3RhdGljIHN0cnVjdCBjZnR5cGUgYmNoX2ZpbGVzW10gPSB7Ci0JewotCQkubmFtZQkJPSAiY2FjaGVfbW9kZSIsCi0JCS5yZWFkCQk9IGNhY2hlX21vZGVfcmVhZCwKLQkJLndyaXRlX3N0cmluZwk9IGNhY2hlX21vZGVfd3JpdGUsCi0JfSwKLQl7Ci0JCS5uYW1lCQk9ICJ2ZXJpZnkiLAotCQkucmVhZF91NjQJPSBiY2hfdmVyaWZ5X3JlYWQsCi0JCS53cml0ZV91NjQJPSBiY2hfdmVyaWZ5X3dyaXRlLAotCX0sCi0JewotCQkubmFtZQkJPSAiY2FjaGVfaGl0cyIsCi0JCS5yZWFkX3U2NAk9IGJjaF9jYWNoZV9oaXRzX3JlYWQsCi0JfSwKLQl7Ci0JCS5uYW1lCQk9ICJjYWNoZV9taXNzZXMiLAotCQkucmVhZF91NjQJPSBiY2hfY2FjaGVfbWlzc2VzX3JlYWQsCi0JfSwKLQl7Ci0JCS5uYW1lCQk9ICJjYWNoZV9ieXBhc3NfaGl0cyIsCi0JCS5yZWFkX3U2NAk9IGJjaF9jYWNoZV9ieXBhc3NfaGl0c19yZWFkLAotCX0sCi0JewotCQkubmFtZQkJPSAiY2FjaGVfYnlwYXNzX21pc3NlcyIsCi0JCS5yZWFkX3U2NAk9IGJjaF9jYWNoZV9ieXBhc3NfbWlzc2VzX3JlYWQsCi0JfSwKLQl7IH0JLyogdGVybWluYXRlICovCi19OwotCi1zdGF0aWMgdm9pZCBpbml0X2JjaF9jZ3JvdXAoc3RydWN0IGJjaF9jZ3JvdXAgKmNnKQotewotCWNnLT5jYWNoZV9tb2RlID0gLTE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqYmNhY2hlY2dfY3JlYXRlKHN0cnVjdCBjZ3JvdXAgKmNncm91cCkKLXsKLQlzdHJ1Y3QgYmNoX2Nncm91cCAqY2c7Ci0KLQljZyA9IGt6YWxsb2Moc2l6ZW9mKCpjZyksIEdGUF9LRVJORUwpOwotCWlmICghY2cpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCWluaXRfYmNoX2Nncm91cChjZyk7Ci0JcmV0dXJuICZjZy0+Y3NzOwotfQotCi1zdGF0aWMgdm9pZCBiY2FjaGVjZ19kZXN0cm95KHN0cnVjdCBjZ3JvdXAgKmNncm91cCkKLXsKLQlzdHJ1Y3QgYmNoX2Nncm91cCAqY2cgPSBjZ3JvdXBfdG9fYmNhY2hlKGNncm91cCk7Ci0Ja2ZyZWUoY2cpOwotfQotCi1zdHJ1Y3QgY2dyb3VwX3N1YnN5cyBiY2FjaGVfc3Vic3lzID0gewotCS5jcmVhdGUJCT0gYmNhY2hlY2dfY3JlYXRlLAotCS5kZXN0cm95CT0gYmNhY2hlY2dfZGVzdHJveSwKLQkuc3Vic3lzX2lkCT0gYmNhY2hlX3N1YnN5c19pZCwKLQkubmFtZQkJPSAiYmNhY2hlIiwKLQkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAotfTsKLUVYUE9SVF9TWU1CT0xfR1BMKGJjYWNoZV9zdWJzeXMpOwotI2VuZGlmCi0KIHN0YXRpYyB1bnNpZ25lZCBjYWNoZV9tb2RlKHN0cnVjdCBjYWNoZWRfZGV2ICpkYywgc3RydWN0IGJpbyAqYmlvKQogewotI2lmZGVmIENPTkZJR19DR1JPVVBfQkNBQ0hFCi0JaW50IHIgPSBiY2hfYmlvX3RvX2Nncm91cChiaW8pLT5jYWNoZV9tb2RlOwotCWlmIChyID49IDApCi0JCXJldHVybiByOwotI2VuZGlmCiAJcmV0dXJuIEJERVZfQ0FDSEVfTU9ERSgmZGMtPnNiKTsKIH0KIAogc3RhdGljIGJvb2wgdmVyaWZ5KHN0cnVjdCBjYWNoZWRfZGV2ICpkYywgc3RydWN0IGJpbyAqYmlvKQogewotI2lmZGVmIENPTkZJR19DR1JPVVBfQkNBQ0hFCi0JaWYgKGJjaF9iaW9fdG9fY2dyb3VwKGJpbyktPnZlcmlmeSkKLQkJcmV0dXJuIHRydWU7Ci0jZW5kaWYKIAlyZXR1cm4gZGMtPnZlcmlmeTsKIH0KIApAQCAtMjQ4LDcgKzg4LDcgQEAKIAkJYXRvbWljX2RlY19idWcoam91cm5hbF9yZWYpOwogCiAJaWYgKCFvcC0+aW5zZXJ0X2RhdGFfZG9uZSkKLQkJY29udGludWVfYXQoY2wsIGJjaF9kYXRhX2luc2VydF9zdGFydCwgYmNhY2hlX3dxKTsKKwkJY29udGludWVfYXQoY2wsIGJjaF9kYXRhX2luc2VydF9zdGFydCwgb3AtPndxKTsKIAogCWJjaF9rZXlsaXN0X2ZyZWUoJm9wLT5pbnNlcnRfa2V5cyk7CiAJY2xvc3VyZV9yZXR1cm4oY2wpOwpAQCAtMjk3LDcgKzEzNyw3IEBACiAJb3AtPmluc2VydF9kYXRhX2RvbmUgPSB0cnVlOwogCWJpb19wdXQoYmlvKTsKIG91dDoKLQljb250aW51ZV9hdChjbCwgYmNoX2RhdGFfaW5zZXJ0X2tleXMsIGJjYWNoZV93cSk7CisJY29udGludWVfYXQoY2wsIGJjaF9kYXRhX2luc2VydF9rZXlzLCBvcC0+d3EpOwogfQogCiBzdGF0aWMgdm9pZCBiY2hfZGF0YV9pbnNlcnRfZXJyb3Ioc3RydWN0IGNsb3N1cmUgKmNsKQpAQCAtMzQwLDcgKzE4MCw3IEBACiAJCWlmIChvcC0+d3JpdGViYWNrKQogCQkJb3AtPmVycm9yID0gZXJyb3I7CiAJCWVsc2UgaWYgKCFvcC0+cmVwbGFjZSkKLQkJCXNldF9jbG9zdXJlX2ZuKGNsLCBiY2hfZGF0YV9pbnNlcnRfZXJyb3IsIGJjYWNoZV93cSk7CisJCQlzZXRfY2xvc3VyZV9mbihjbCwgYmNoX2RhdGFfaW5zZXJ0X2Vycm9yLCBvcC0+d3EpOwogCQllbHNlCiAJCQlzZXRfY2xvc3VyZV9mbihjbCwgTlVMTCwgTlVMTCk7CiAJfQpAQCAtMzc2LDcgKzIxNiw3IEBACiAJCWlmIChiY2hfa2V5bGlzdF9yZWFsbG9jKCZvcC0+aW5zZXJ0X2tleXMsCiAJCQkJCTMgKyAob3AtPmNzdW0gPyAxIDogMCksCiAJCQkJCW9wLT5jKSkKLQkJCWNvbnRpbnVlX2F0KGNsLCBiY2hfZGF0YV9pbnNlcnRfa2V5cywgYmNhY2hlX3dxKTsKKwkJCWNvbnRpbnVlX2F0KGNsLCBiY2hfZGF0YV9pbnNlcnRfa2V5cywgb3AtPndxKTsKIAogCQlrID0gb3AtPmluc2VydF9rZXlzLnRvcDsKIAkJYmtleV9pbml0KGspOwpAQCAtNDEzLDcgKzI1Myw3IEBACiAJfSB3aGlsZSAobiAhPSBiaW8pOwogCiAJb3AtPmluc2VydF9kYXRhX2RvbmUgPSB0cnVlOwotCWNvbnRpbnVlX2F0KGNsLCBiY2hfZGF0YV9pbnNlcnRfa2V5cywgYmNhY2hlX3dxKTsKKwljb250aW51ZV9hdChjbCwgYmNoX2RhdGFfaW5zZXJ0X2tleXMsIG9wLT53cSk7CiBlcnI6CiAJLyogYmNoX2FsbG9jX3NlY3RvcnMoKSBibG9ja3MgaWYgcy0+d3JpdGViYWNrID0gdHJ1ZSAqLwogCUJVR19PTihvcC0+d3JpdGViYWNrKTsKQEAgLTQ0Miw3ICsyODIsNyBAQAogCQliaW9fcHV0KGJpbyk7CiAKIAkJaWYgKCFiY2hfa2V5bGlzdF9lbXB0eSgmb3AtPmluc2VydF9rZXlzKSkKLQkJCWNvbnRpbnVlX2F0KGNsLCBiY2hfZGF0YV9pbnNlcnRfa2V5cywgYmNhY2hlX3dxKTsKKwkJCWNvbnRpbnVlX2F0KGNsLCBiY2hfZGF0YV9pbnNlcnRfa2V5cywgb3AtPndxKTsKIAkJZWxzZQogCQkJY2xvc3VyZV9yZXR1cm4oY2wpOwogCX0KQEAgLTgyNCw2ICs2NjQsNyBAQAogCXMtPmlvcC5lcnJvcgkJPSAwOwogCXMtPmlvcC5mbGFncwkJPSAwOwogCXMtPmlvcC5mbHVzaF9qb3VybmFsCT0gKGJpby0+YmlfcncgJiAoUkVRX0ZMVVNIfFJFUV9GVUEpKSAhPSAwOworCXMtPmlvcC53cQkJPSBiY2FjaGVfd3E7CiAKIAlyZXR1cm4gczsKIH0KQEAgLTEyMDMsMjIgKzEwNDQsMTMgQEAKIHN0YXRpYyBpbnQgZmxhc2hfZGV2X2NhY2hlX21pc3Moc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3Qgc2VhcmNoICpzLAogCQkJCXN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgc2VjdG9ycykKIHsKLQlzdHJ1Y3QgYmlvX3ZlYyBidjsKLQlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CisJdW5zaWduZWQgYnl0ZXMgPSBtaW4oc2VjdG9ycywgYmlvX3NlY3RvcnMoYmlvKSkgPDwgOTsKIAotCS8qIFplcm8gZmlsbCBiaW8gKi8KKwlzd2FwKGJpby0+YmlfaXRlci5iaV9zaXplLCBieXRlcyk7CisJemVyb19maWxsX2JpbyhiaW8pOworCXN3YXAoYmlvLT5iaV9pdGVyLmJpX3NpemUsIGJ5dGVzKTsKIAotCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiaW8sIGl0ZXIpIHsKLQkJdW5zaWduZWQgaiA9IG1pbihidi5idl9sZW4gPj4gOSwgc2VjdG9ycyk7Ci0KLQkJdm9pZCAqcCA9IGttYXAoYnYuYnZfcGFnZSk7Ci0JCW1lbXNldChwICsgYnYuYnZfb2Zmc2V0LCAwLCBqIDw8IDkpOwotCQlrdW5tYXAoYnYuYnZfcGFnZSk7Ci0KLQkJc2VjdG9ycwktPSBqOwotCX0KLQotCWJpb19hZHZhbmNlKGJpbywgbWluKHNlY3RvcnMgPDwgOSwgYmlvLT5iaV9pdGVyLmJpX3NpemUpKTsKKwliaW9fYWR2YW5jZShiaW8sIGJ5dGVzKTsKIAogCWlmICghYmlvLT5iaV9pdGVyLmJpX3NpemUpCiAJCXJldHVybiBNQVBfRE9ORTsKQEAgLTEzMTMsOSArMTE0NSw2IEBACiAKIHZvaWQgYmNoX3JlcXVlc3RfZXhpdCh2b2lkKQogewotI2lmZGVmIENPTkZJR19DR1JPVVBfQkNBQ0hFCi0JY2dyb3VwX3VubG9hZF9zdWJzeXMoJmJjYWNoZV9zdWJzeXMpOwotI2VuZGlmCiAJaWYgKGJjaF9zZWFyY2hfY2FjaGUpCiAJCWttZW1fY2FjaGVfZGVzdHJveShiY2hfc2VhcmNoX2NhY2hlKTsKIH0KQEAgLTEzMjYsMTEgKzExNTUsNSBAQAogCWlmICghYmNoX3NlYXJjaF9jYWNoZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLSNpZmRlZiBDT05GSUdfQ0dST1VQX0JDQUNIRQotCWNncm91cF9sb2FkX3N1YnN5cygmYmNhY2hlX3N1YnN5cyk7Ci0JaW5pdF9iY2hfY2dyb3VwKCZiY2FjaGVfZGVmYXVsdF9jZ3JvdXApOwotCi0JY2dyb3VwX2FkZF9jZnR5cGVzKCZiY2FjaGVfc3Vic3lzLCBiY2hfZmlsZXMpOwotI2VuZGlmCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9yZXF1ZXN0LmggYi9kcml2ZXJzL21kL2JjYWNoZS9yZXF1ZXN0LmgKaW5kZXggMzlmMjFkYi4uMWZmMzY4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvcmVxdWVzdC5oCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL3JlcXVlc3QuaApAQCAtMSwxMiArMSwxMSBAQAogI2lmbmRlZiBfQkNBQ0hFX1JFUVVFU1RfSF8KICNkZWZpbmUgX0JDQUNIRV9SRVFVRVNUX0hfCiAKLSNpbmNsdWRlIDxsaW51eC9jZ3JvdXAuaD4KLQogc3RydWN0IGRhdGFfaW5zZXJ0X29wIHsKIAlzdHJ1Y3QgY2xvc3VyZQkJY2w7CiAJc3RydWN0IGNhY2hlX3NldAkqYzsKIAlzdHJ1Y3QgYmlvCQkqYmlvOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKIAogCXVuc2lnbmVkCQlpbm9kZTsKIAl1aW50MTZfdAkJd3JpdGVfcG9pbnQ7CkBAIC00MSwyMCArNDAsNCBAQAogCiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmJjaF9zZWFyY2hfY2FjaGUsICpiY2hfcGFzc3Rocm91Z2hfY2FjaGU7CiAKLXN0cnVjdCBiY2hfY2dyb3VwIHsKLSNpZmRlZiBDT05GSUdfQ0dST1VQX0JDQUNIRQotCXN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlCWNzczsKLSNlbmRpZgotCS8qCi0JICogV2Ugc3VidHJhY3Qgb25lIGZyb20gdGhlIGluZGV4IGludG8gYmNoX2NhY2hlX21vZGVzW10sIHNvIHRoYXQKLQkgKiBkZWZhdWx0ID09IC0xOyB0aGlzIG1ha2VzIGl0IHNvIHRoZSByZXN0IG1hdGNoIHVwIHdpdGggZC0+Y2FjaGVfbW9kZSwKLQkgKiBhbmQgd2UgdXNlIGQtPmNhY2hlX21vZGUgaWYgY2dycC0+Y2FjaGVfbW9kZSA8IDAKLQkgKi8KLQlzaG9ydAkJCQljYWNoZV9tb2RlOwotCWJvb2wJCQkJdmVyaWZ5OwotCXN0cnVjdCBjYWNoZV9zdGF0X2NvbGxlY3RvcglzdGF0czsKLX07Ci0KLXN0cnVjdCBiY2hfY2dyb3VwICpiY2hfYmlvX3RvX2Nncm91cChzdHJ1Y3QgYmlvICpiaW8pOwotCiAjZW5kaWYgLyogX0JDQUNIRV9SRVFVRVNUX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9zdGF0cy5jIGIvZHJpdmVycy9tZC9iY2FjaGUvc3RhdHMuYwppbmRleCA4NGQwNzgyLi4wY2EwNzJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9zdGF0cy5jCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL3N0YXRzLmMKQEAgLTIwMSw5ICsyMDEsNiBAQAogCXN0cnVjdCBjYWNoZWRfZGV2ICpkYyA9IGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgY2FjaGVkX2RldiwgZGlzayk7CiAJbWFya19jYWNoZV9zdGF0cygmZGMtPmFjY291bnRpbmcuY29sbGVjdG9yLCBoaXQsIGJ5cGFzcyk7CiAJbWFya19jYWNoZV9zdGF0cygmYy0+YWNjb3VudGluZy5jb2xsZWN0b3IsIGhpdCwgYnlwYXNzKTsKLSNpZmRlZiBDT05GSUdfQ0dST1VQX0JDQUNIRQotCW1hcmtfY2FjaGVfc3RhdHMoJihiY2hfYmlvX3RvX2Nncm91cChzLT5vcmlnX2JpbyktPnN0YXRzKSwgaGl0LCBieXBhc3MpOwotI2VuZGlmCiB9CiAKIHZvaWQgYmNoX21hcmtfY2FjaGVfcmVhZGFoZWFkKHN0cnVjdCBjYWNoZV9zZXQgKmMsIHN0cnVjdCBiY2FjaGVfZGV2aWNlICpkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvc3VwZXIuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL3N1cGVyLmMKaW5kZXggMjRhM2ExNS4uOTI2ZGVkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvc3VwZXIuYworKysgYi9kcml2ZXJzL21kL2JjYWNoZS9zdXBlci5jCkBAIC01NDEsOSArNTQxLDYgQEAKIAljbG9zdXJlX3N5bmMoY2wpOwogfQogCi0jZGVmaW5lIGJ1Y2tldHNfZnJlZShjKQkiZnJlZSAlenUsIGZyZWVfaW5jICV6dSwgdW51c2VkICV6dSIsCQlcCi0JZmlmb191c2VkKCZjLT5mcmVlKSwgZmlmb191c2VkKCZjLT5mcmVlX2luYyksIGZpZm9fdXNlZCgmYy0+dW51c2VkKQotCiB2b2lkIGJjaF9wcmlvX3dyaXRlKHN0cnVjdCBjYWNoZSAqY2EpCiB7CiAJaW50IGk7CkBAIC01NTQsMTAgKzU1MSw2IEBACiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZjYS0+c2V0LT5idWNrZXRfbG9jayk7CiAKLQlmb3IgKGIgPSBjYS0+YnVja2V0czsKLQkgICAgIGIgPCBjYS0+YnVja2V0cyArIGNhLT5zYi5uYnVja2V0czsgYisrKQotCQliLT5kaXNrX2dlbiA9IGItPmdlbjsKLQogCWNhLT5kaXNrX2J1Y2tldHMtPnNlcSsrOwogCiAJYXRvbWljX2xvbmdfYWRkKGNhLT5zYi5idWNrZXRfc2l6ZSAqIHByaW9fYnVja2V0cyhjYSksCkBAIC02MDEsMTQgKzU5NCwxNyBAQAogCiAJbXV0ZXhfbG9jaygmY2EtPnNldC0+YnVja2V0X2xvY2spOwogCi0JY2EtPm5lZWRfc2F2ZV9wcmlvID0gMDsKLQogCS8qCiAJICogRG9uJ3Qgd2FudCB0aGUgb2xkIHByaW9yaXRpZXMgdG8gZ2V0IGdhcmJhZ2UgY29sbGVjdGVkIHVudGlsIGFmdGVyIHdlCiAJICogZmluaXNoIHdyaXRpbmcgdGhlIG5ldyBvbmVzLCBhbmQgdGhleSdyZSBqb3VybmFsbGVkCiAJICovCi0JZm9yIChpID0gMDsgaSA8IHByaW9fYnVja2V0cyhjYSk7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgcHJpb19idWNrZXRzKGNhKTsgaSsrKSB7CisJCWlmIChjYS0+cHJpb19sYXN0X2J1Y2tldHNbaV0pCisJCQlfX2JjaF9idWNrZXRfZnJlZShjYSwKKwkJCQkmY2EtPmJ1Y2tldHNbY2EtPnByaW9fbGFzdF9idWNrZXRzW2ldXSk7CisKIAkJY2EtPnByaW9fbGFzdF9idWNrZXRzW2ldID0gY2EtPnByaW9fYnVja2V0c1tpXTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHByaW9fcmVhZChzdHJ1Y3QgY2FjaGUgKmNhLCB1aW50NjRfdCBidWNrZXQpCkBAIC02MzksNyArNjM1LDcgQEAKIAkJfQogCiAJCWItPnByaW8gPSBsZTE2X3RvX2NwdShkLT5wcmlvKTsKLQkJYi0+Z2VuID0gYi0+ZGlza19nZW4gPSBiLT5sYXN0X2djID0gYi0+Z2NfZ2VuID0gZC0+Z2VuOworCQliLT5nZW4gPSBiLT5sYXN0X2djID0gZC0+Z2VuOwogCX0KIH0KIApAQCAtODQzLDYgKzgzOSw3IEBACiAJcS0+bGltaXRzLm1heF9zZWdtZW50X3NpemUJPSBVSU5UX01BWDsKIAlxLT5saW1pdHMubWF4X3NlZ21lbnRzCQk9IEJJT19NQVhfUEFHRVM7CiAJcS0+bGltaXRzLm1heF9kaXNjYXJkX3NlY3RvcnMJPSBVSU5UX01BWDsKKwlxLT5saW1pdHMuZGlzY2FyZF9ncmFudWxhcml0eQk9IDUxMjsKIAlxLT5saW1pdHMuaW9fbWluCQk9IGJsb2NrX3NpemU7CiAJcS0+bGltaXRzLmxvZ2ljYWxfYmxvY2tfc2l6ZQk9IGJsb2NrX3NpemU7CiAJcS0+bGltaXRzLnBoeXNpY2FsX2Jsb2NrX3NpemUJPSBibG9ja19zaXplOwpAQCAtMTM1NSw2ICsxMzUyLDggQEAKIAliY2hfYnNldF9zb3J0X3N0YXRlX2ZyZWUoJmMtPnNvcnQpOwogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGMtPnV1aWRzLCBpbG9nMihidWNrZXRfcGFnZXMoYykpKTsKIAorCWlmIChjLT5tb3ZpbmdfZ2Nfd3EpCisJCWRlc3Ryb3lfd29ya3F1ZXVlKGMtPm1vdmluZ19nY193cSk7CiAJaWYgKGMtPmJpb19zcGxpdCkKIAkJYmlvc2V0X2ZyZWUoYy0+YmlvX3NwbGl0KTsKIAlpZiAoYy0+ZmlsbF9pdGVyKQpAQCAtMTM5NSwxNCArMTM5NCwyMSBAQAogCQlsaXN0X2FkZCgmYy0+cm9vdC0+bGlzdCwgJmMtPmJ0cmVlX2NhY2hlKTsKIAogCS8qIFNob3VsZCBza2lwIHRoaXMgaWYgd2UncmUgdW5yZWdpc3RlcmluZyBiZWNhdXNlIG9mIGFuIGVycm9yICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShiLCAmYy0+YnRyZWVfY2FjaGUsIGxpc3QpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShiLCAmYy0+YnRyZWVfY2FjaGUsIGxpc3QpIHsKKwkJbXV0ZXhfbG9jaygmYi0+d3JpdGVfbG9jayk7CiAJCWlmIChidHJlZV9ub2RlX2RpcnR5KGIpKQotCQkJYmNoX2J0cmVlX25vZGVfd3JpdGUoYiwgTlVMTCk7CisJCQlfX2JjaF9idHJlZV9ub2RlX3dyaXRlKGIsIE5VTEwpOworCQltdXRleF91bmxvY2soJmItPndyaXRlX2xvY2spOworCX0KIAogCWZvcl9lYWNoX2NhY2hlKGNhLCBjLCBpKQogCQlpZiAoY2EtPmFsbG9jX3RocmVhZCkKIAkJCWt0aHJlYWRfc3RvcChjYS0+YWxsb2NfdGhyZWFkKTsKIAorCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYy0+am91cm5hbC53b3JrKTsKKwkvKiBmbHVzaCBsYXN0IGpvdXJuYWwgZW50cnkgaWYgbmVlZGVkICovCisJYy0+am91cm5hbC53b3JrLndvcmsuZnVuYygmYy0+am91cm5hbC53b3JrLndvcmspOworCiAJY2xvc3VyZV9yZXR1cm4oY2wpOwogfQogCkBAIC0xNDg1LDE0ICsxNDkxLDEzIEBACiAKIAlzZW1hX2luaXQoJmMtPnNiX3dyaXRlX211dGV4LCAxKTsKIAltdXRleF9pbml0KCZjLT5idWNrZXRfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+dHJ5X3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmMtPmJ0cmVlX2NhY2hlX3dhaXQpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmMtPmJ1Y2tldF93YWl0KTsKIAlzZW1hX2luaXQoJmMtPnV1aWRfd3JpdGVfbXV0ZXgsIDEpOwogCiAJc3Bpbl9sb2NrX2luaXQoJmMtPmJ0cmVlX2djX3RpbWUubG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmMtPmJ0cmVlX3NwbGl0X3RpbWUubG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmMtPmJ0cmVlX3JlYWRfdGltZS5sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYy0+dHJ5X2hhcmRlcl90aW1lLmxvY2spOwogCiAJYmNoX21vdmluZ19pbml0X2NhY2hlX3NldChjKTsKIApAQCAtMTUxNyw2ICsxNTIyLDcgQEAKIAkgICAgIShjLT5maWxsX2l0ZXIgPSBtZW1wb29sX2NyZWF0ZV9rbWFsbG9jX3Bvb2woMSwgaXRlcl9zaXplKSkgfHwKIAkgICAgIShjLT5iaW9fc3BsaXQgPSBiaW9zZXRfY3JlYXRlKDQsIG9mZnNldG9mKHN0cnVjdCBiYmlvLCBiaW8pKSkgfHwKIAkgICAgIShjLT51dWlkcyA9IGFsbG9jX2J1Y2tldF9wYWdlcyhHRlBfS0VSTkVMLCBjKSkgfHwKKwkgICAgIShjLT5tb3ZpbmdfZ2Nfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJiY2FjaGVfZ2MiKSkgfHwKIAkgICAgYmNoX2pvdXJuYWxfYWxsb2MoYykgfHwKIAkgICAgYmNoX2J0cmVlX2NhY2hlX2FsbG9jKGMpIHx8CiAJICAgIGJjaF9vcGVuX2J1Y2tldHNfYWxsb2MoYykgfHwKQEAgLTE1ODAsNyArMTU4Niw3IEBACiAJCQlnb3RvIGVycjsKIAogCQllcnIgPSAiZXJyb3IgcmVhZGluZyBidHJlZSByb290IjsKLQkJYy0+cm9vdCA9IGJjaF9idHJlZV9ub2RlX2dldChjLCBrLCBqLT5idHJlZV9sZXZlbCwgdHJ1ZSk7CisJCWMtPnJvb3QgPSBiY2hfYnRyZWVfbm9kZV9nZXQoYywgTlVMTCwgaywgai0+YnRyZWVfbGV2ZWwsIHRydWUpOwogCQlpZiAoSVNfRVJSX09SX05VTEwoYy0+cm9vdCkpCiAJCQlnb3RvIGVycjsKIApAQCAtMTU5Niw3ICsxNjAyLDcgQEAKIAkJCWdvdG8gZXJyOwogCiAJCWJjaF9qb3VybmFsX21hcmsoYywgJmpvdXJuYWwpOwotCQliY2hfYnRyZWVfZ2NfZmluaXNoKGMpOworCQliY2hfaW5pdGlhbF9nY19maW5pc2goYyk7CiAJCXByX2RlYnVnKCJidHJlZV9jaGVjaygpIGRvbmUiKTsKIAogCQkvKgpAQCAtMTYzOCw3ICsxNjQ0LDcgQEAKIAkJCQljYS0+c2IuZFtqXSA9IGNhLT5zYi5maXJzdF9idWNrZXQgKyBqOwogCQl9CiAKLQkJYmNoX2J0cmVlX2djX2ZpbmlzaChjKTsKKwkJYmNoX2luaXRpYWxfZ2NfZmluaXNoKGMpOwogCiAJCWVyciA9ICJlcnJvciBzdGFydGluZyBhbGxvY2F0b3IgdGhyZWFkIjsKIAkJZm9yX2VhY2hfY2FjaGUoY2EsIGMsIGkpCkBAIC0xNjU1LDEyICsxNjYxLDE0IEBACiAJCQlnb3RvIGVycjsKIAogCQllcnIgPSAiY2Fubm90IGFsbG9jYXRlIG5ldyBidHJlZSByb290IjsKLQkJYy0+cm9vdCA9IGJjaF9idHJlZV9ub2RlX2FsbG9jKGMsIDAsIHRydWUpOworCQljLT5yb290ID0gYmNoX2J0cmVlX25vZGVfYWxsb2MoYywgTlVMTCwgMCk7CiAJCWlmIChJU19FUlJfT1JfTlVMTChjLT5yb290KSkKIAkJCWdvdG8gZXJyOwogCisJCW11dGV4X2xvY2soJmMtPnJvb3QtPndyaXRlX2xvY2spOwogCQlia2V5X2NvcHlfa2V5KCZjLT5yb290LT5rZXksICZNQVhfS0VZKTsKIAkJYmNoX2J0cmVlX25vZGVfd3JpdGUoYy0+cm9vdCwgJmNsKTsKKwkJbXV0ZXhfdW5sb2NrKCZjLT5yb290LT53cml0ZV9sb2NrKTsKIAogCQliY2hfYnRyZWVfc2V0X3Jvb3QoYy0+cm9vdCk7CiAJCXJ3X3VubG9jayh0cnVlLCBjLT5yb290KTsKQEAgLTE3ODIsNyArMTc5MCw2IEBACiAJdmZyZWUoY2EtPmJ1Y2tldHMpOwogCiAJZnJlZV9oZWFwKCZjYS0+aGVhcCk7Ci0JZnJlZV9maWZvKCZjYS0+dW51c2VkKTsKIAlmcmVlX2ZpZm8oJmNhLT5mcmVlX2luYyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgUkVTRVJWRV9OUjsgaSsrKQpAQCAtMTgxOSw3ICsxODI2LDYgQEAKIAkgICAgIWluaXRfZmlmbygmY2EtPmZyZWVbUkVTRVJWRV9NT1ZJTkdHQ10sIGZyZWUsIEdGUF9LRVJORUwpIHx8CiAJICAgICFpbml0X2ZpZm8oJmNhLT5mcmVlW1JFU0VSVkVfTk9ORV0sIGZyZWUsIEdGUF9LRVJORUwpIHx8CiAJICAgICFpbml0X2ZpZm8oJmNhLT5mcmVlX2luYywJZnJlZSA8PCAyLCBHRlBfS0VSTkVMKSB8fAotCSAgICAhaW5pdF9maWZvKCZjYS0+dW51c2VkLAlmcmVlIDw8IDIsIEdGUF9LRVJORUwpIHx8CiAJICAgICFpbml0X2hlYXAoJmNhLT5oZWFwLAlmcmVlIDw8IDMsIEdGUF9LRVJORUwpIHx8CiAJICAgICEoY2EtPmJ1Y2tldHMJPSB2emFsbG9jKHNpemVvZihzdHJ1Y3QgYnVja2V0KSAqCiAJCQkJCSAgY2EtPnNiLm5idWNrZXRzKSkgfHwKQEAgLTE4MzQsMTMgKzE4NDAsNyBAQAogCWZvcl9lYWNoX2J1Y2tldChiLCBjYSkKIAkJYXRvbWljX3NldCgmYi0+cGluLCAwKTsKIAotCWlmIChiY2hfY2FjaGVfYWxsb2NhdG9yX2luaXQoY2EpKQotCQlnb3RvIGVycjsKLQogCXJldHVybiAwOwotZXJyOgotCWtvYmplY3RfcHV0KCZjYS0+a29iaik7Ci0JcmV0dXJuIC1FTk9NRU07CiB9CiAKIHN0YXRpYyB2b2lkIHJlZ2lzdGVyX2NhY2hlKHN0cnVjdCBjYWNoZV9zYiAqc2IsIHN0cnVjdCBwYWdlICpzYl9wYWdlLApAQCAtMTg2OSw3ICsxODY5LDEwIEBACiAJaWYgKGtvYmplY3RfYWRkKCZjYS0+a29iaiwgJnBhcnRfdG9fZGV2KGJkZXYtPmJkX3BhcnQpLT5rb2JqLCAiYmNhY2hlIikpCiAJCWdvdG8gZXJyOwogCisJbXV0ZXhfbG9jaygmYmNoX3JlZ2lzdGVyX2xvY2spOwogCWVyciA9IHJlZ2lzdGVyX2NhY2hlX3NldChjYSk7CisJbXV0ZXhfdW5sb2NrKCZiY2hfcmVnaXN0ZXJfbG9jayk7CisKIAlpZiAoZXJyKQogCQlnb3RvIGVycjsKIApAQCAtMTkzMSw4ICsxOTM0LDYgQEAKIAlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCW11dGV4X2xvY2soJmJjaF9yZWdpc3Rlcl9sb2NrKTsKLQogCWlmICghKHBhdGggPSBrc3RybmR1cChidWZmZXIsIHNpemUsIEdGUF9LRVJORUwpKSB8fAogCSAgICAhKHNiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNhY2hlX3NiKSwgR0ZQX0tFUk5FTCkpKQogCQlnb3RvIGVycjsKQEAgLTE5NjUsNyArMTk2Niw5IEBACiAJCWlmICghZGMpCiAJCQlnb3RvIGVycl9jbG9zZTsKIAorCQltdXRleF9sb2NrKCZiY2hfcmVnaXN0ZXJfbG9jayk7CiAJCXJlZ2lzdGVyX2JkZXYoc2IsIHNiX3BhZ2UsIGJkZXYsIGRjKTsKKwkJbXV0ZXhfdW5sb2NrKCZiY2hfcmVnaXN0ZXJfbG9jayk7CiAJfSBlbHNlIHsKIAkJc3RydWN0IGNhY2hlICpjYSA9IGt6YWxsb2Moc2l6ZW9mKCpjYSksIEdGUF9LRVJORUwpOwogCQlpZiAoIWNhKQpAQCAtMTk3OCw3ICsxOTgxLDYgQEAKIAkJcHV0X3BhZ2Uoc2JfcGFnZSk7CiAJa2ZyZWUoc2IpOwogCWtmcmVlKHBhdGgpOwotCW11dGV4X3VubG9jaygmYmNoX3JlZ2lzdGVyX2xvY2spOwogCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwogCXJldHVybiByZXQ7CiAKQEAgLTIwNTcsNyArMjA1OSw2IEBACiB7CiAJYmNoX2RlYnVnX2V4aXQoKTsKIAliY2hfcmVxdWVzdF9leGl0KCk7Ci0JYmNoX2J0cmVlX2V4aXQoKTsKIAlpZiAoYmNhY2hlX2tvYmopCiAJCWtvYmplY3RfcHV0KGJjYWNoZV9rb2JqKTsKIAlpZiAoYmNhY2hlX3dxKQpAQCAtMjA4Nyw3ICsyMDg4LDYgQEAKIAlpZiAoIShiY2FjaGVfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJiY2FjaGUiKSkgfHwKIAkgICAgIShiY2FjaGVfa29iaiA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoImJjYWNoZSIsIGZzX2tvYmopKSB8fAogCSAgICBzeXNmc19jcmVhdGVfZmlsZXMoYmNhY2hlX2tvYmosIGZpbGVzKSB8fAotCSAgICBiY2hfYnRyZWVfaW5pdCgpIHx8CiAJICAgIGJjaF9yZXF1ZXN0X2luaXQoKSB8fAogCSAgICBiY2hfZGVidWdfaW5pdChiY2FjaGVfa29iaikpCiAJCWdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvc3lzZnMuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL3N5c2ZzLmMKaW5kZXggZDg0NThkNC4uYjNmZjU3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvc3lzZnMuYworKysgYi9kcml2ZXJzL21kL2JjYWNoZS9zeXNmcy5jCkBAIC01NCw3ICs1NCw2IEBACiBzeXNmc190aW1lX3N0YXRzX2F0dHJpYnV0ZShidHJlZV9zcGxpdCwgc2VjLCB1cyk7CiBzeXNmc190aW1lX3N0YXRzX2F0dHJpYnV0ZShidHJlZV9zb3J0LAltcywgIHVzKTsKIHN5c2ZzX3RpbWVfc3RhdHNfYXR0cmlidXRlKGJ0cmVlX3JlYWQsCW1zLCAgdXMpOwotc3lzZnNfdGltZV9zdGF0c19hdHRyaWJ1dGUodHJ5X2hhcmRlciwJbXMsICB1cyk7CiAKIHJlYWRfYXR0cmlidXRlKGJ0cmVlX25vZGVzKTsKIHJlYWRfYXR0cmlidXRlKGJ0cmVlX3VzZWRfcGVyY2VudCk7CkBAIC00MDYsNyArNDA1LDcgQEAKIAlzdHJ1Y3QgYnNldF9zdGF0cyBzdGF0czsKIH07CiAKLXN0YXRpYyBpbnQgYnRyZWVfYnNldF9zdGF0cyhzdHJ1Y3QgYnRyZWVfb3AgKmJfb3AsIHN0cnVjdCBidHJlZSAqYikKK3N0YXRpYyBpbnQgYmNoX2J0cmVlX2JzZXRfc3RhdHMoc3RydWN0IGJ0cmVlX29wICpiX29wLCBzdHJ1Y3QgYnRyZWUgKmIpCiB7CiAJc3RydWN0IGJzZXRfc3RhdHNfb3AgKm9wID0gY29udGFpbmVyX29mKGJfb3AsIHN0cnVjdCBic2V0X3N0YXRzX29wLCBvcCk7CiAKQEAgLTQyNCw3ICs0MjMsNyBAQAogCW1lbXNldCgmb3AsIDAsIHNpemVvZihvcCkpOwogCWJjaF9idHJlZV9vcF9pbml0KCZvcC5vcCwgLTEpOwogCi0JcmV0ID0gYmNoX2J0cmVlX21hcF9ub2Rlcygmb3Aub3AsIGMsICZaRVJPX0tFWSwgYnRyZWVfYnNldF9zdGF0cyk7CisJcmV0ID0gYmNoX2J0cmVlX21hcF9ub2Rlcygmb3Aub3AsIGMsICZaRVJPX0tFWSwgYmNoX2J0cmVlX2JzZXRfc3RhdHMpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC00NDIsODEgKzQ0MSw4MSBAQAogCQkJb3Auc3RhdHMuZmxvYXRzLCBvcC5zdGF0cy5mYWlsZWQpOwogfQogCitzdGF0aWMgdW5zaWduZWQgYmNoX3Jvb3RfdXNhZ2Uoc3RydWN0IGNhY2hlX3NldCAqYykKK3sKKwl1bnNpZ25lZCBieXRlcyA9IDA7CisJc3RydWN0IGJrZXkgKms7CisJc3RydWN0IGJ0cmVlICpiOworCXN0cnVjdCBidHJlZV9pdGVyIGl0ZXI7CisKKwlnb3RvIGxvY2tfcm9vdDsKKworCWRvIHsKKwkJcndfdW5sb2NrKGZhbHNlLCBiKTsKK2xvY2tfcm9vdDoKKwkJYiA9IGMtPnJvb3Q7CisJCXJ3X2xvY2soZmFsc2UsIGIsIGItPmxldmVsKTsKKwl9IHdoaWxlIChiICE9IGMtPnJvb3QpOworCisJZm9yX2VhY2hfa2V5X2ZpbHRlcigmYi0+a2V5cywgaywgJml0ZXIsIGJjaF9wdHJfYmFkKQorCQlieXRlcyArPSBia2V5X2J5dGVzKGspOworCisJcndfdW5sb2NrKGZhbHNlLCBiKTsKKworCXJldHVybiAoYnl0ZXMgKiAxMDApIC8gYnRyZWVfYnl0ZXMoYyk7Cit9CisKK3N0YXRpYyBzaXplX3QgYmNoX2NhY2hlX3NpemUoc3RydWN0IGNhY2hlX3NldCAqYykKK3sKKwlzaXplX3QgcmV0ID0gMDsKKwlzdHJ1Y3QgYnRyZWUgKmI7CisKKwltdXRleF9sb2NrKCZjLT5idWNrZXRfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShiLCAmYy0+YnRyZWVfY2FjaGUsIGxpc3QpCisJCXJldCArPSAxIDw8IChiLT5rZXlzLnBhZ2Vfb3JkZXIgKyBQQUdFX1NISUZUKTsKKworCW11dGV4X3VubG9jaygmYy0+YnVja2V0X2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBiY2hfY2FjaGVfbWF4X2NoYWluKHN0cnVjdCBjYWNoZV9zZXQgKmMpCit7CisJdW5zaWduZWQgcmV0ID0gMDsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaDsKKworCW11dGV4X2xvY2soJmMtPmJ1Y2tldF9sb2NrKTsKKworCWZvciAoaCA9IGMtPmJ1Y2tldF9oYXNoOworCSAgICAgaCA8IGMtPmJ1Y2tldF9oYXNoICsgKDEgPDwgQlVDS0VUX0hBU0hfQklUUyk7CisJICAgICBoKyspIHsKKwkJdW5zaWduZWQgaSA9IDA7CisJCXN0cnVjdCBobGlzdF9ub2RlICpwOworCisJCWhsaXN0X2Zvcl9lYWNoKHAsIGgpCisJCQlpKys7CisKKwkJcmV0ID0gbWF4KHJldCwgaSk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZjLT5idWNrZXRfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGJjaF9idHJlZV91c2VkKHN0cnVjdCBjYWNoZV9zZXQgKmMpCit7CisJcmV0dXJuIGRpdjY0X3U2NChjLT5nY19zdGF0cy5rZXlfYnl0ZXMgKiAxMDAsCisJCQkgKGMtPmdjX3N0YXRzLm5vZGVzID86IDEpICogYnRyZWVfYnl0ZXMoYykpOworfQorCitzdGF0aWMgdW5zaWduZWQgYmNoX2F2ZXJhZ2Vfa2V5X3NpemUoc3RydWN0IGNhY2hlX3NldCAqYykKK3sKKwlyZXR1cm4gYy0+Z2Nfc3RhdHMubmtleXMKKwkJPyBkaXY2NF91NjQoYy0+Z2Nfc3RhdHMuZGF0YSwgYy0+Z2Nfc3RhdHMubmtleXMpCisJCTogMDsKK30KKwogU0hPVyhfX2JjaF9jYWNoZV9zZXQpCiB7Ci0JdW5zaWduZWQgcm9vdF91c2FnZShzdHJ1Y3QgY2FjaGVfc2V0ICpjKQotCXsKLQkJdW5zaWduZWQgYnl0ZXMgPSAwOwotCQlzdHJ1Y3QgYmtleSAqazsKLQkJc3RydWN0IGJ0cmVlICpiOwotCQlzdHJ1Y3QgYnRyZWVfaXRlciBpdGVyOwotCi0JCWdvdG8gbG9ja19yb290OwotCi0JCWRvIHsKLQkJCXJ3X3VubG9jayhmYWxzZSwgYik7Ci1sb2NrX3Jvb3Q6Ci0JCQliID0gYy0+cm9vdDsKLQkJCXJ3X2xvY2soZmFsc2UsIGIsIGItPmxldmVsKTsKLQkJfSB3aGlsZSAoYiAhPSBjLT5yb290KTsKLQotCQlmb3JfZWFjaF9rZXlfZmlsdGVyKCZiLT5rZXlzLCBrLCAmaXRlciwgYmNoX3B0cl9iYWQpCi0JCQlieXRlcyArPSBia2V5X2J5dGVzKGspOwotCi0JCXJ3X3VubG9jayhmYWxzZSwgYik7Ci0KLQkJcmV0dXJuIChieXRlcyAqIDEwMCkgLyBidHJlZV9ieXRlcyhjKTsKLQl9Ci0KLQlzaXplX3QgY2FjaGVfc2l6ZShzdHJ1Y3QgY2FjaGVfc2V0ICpjKQotCXsKLQkJc2l6ZV90IHJldCA9IDA7Ci0JCXN0cnVjdCBidHJlZSAqYjsKLQotCQltdXRleF9sb2NrKCZjLT5idWNrZXRfbG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoYiwgJmMtPmJ0cmVlX2NhY2hlLCBsaXN0KQotCQkJcmV0ICs9IDEgPDwgKGItPmtleXMucGFnZV9vcmRlciArIFBBR0VfU0hJRlQpOwotCi0JCW11dGV4X3VubG9jaygmYy0+YnVja2V0X2xvY2spOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXVuc2lnbmVkIGNhY2hlX21heF9jaGFpbihzdHJ1Y3QgY2FjaGVfc2V0ICpjKQotCXsKLQkJdW5zaWduZWQgcmV0ID0gMDsKLQkJc3RydWN0IGhsaXN0X2hlYWQgKmg7Ci0KLQkJbXV0ZXhfbG9jaygmYy0+YnVja2V0X2xvY2spOwotCi0JCWZvciAoaCA9IGMtPmJ1Y2tldF9oYXNoOwotCQkgICAgIGggPCBjLT5idWNrZXRfaGFzaCArICgxIDw8IEJVQ0tFVF9IQVNIX0JJVFMpOwotCQkgICAgIGgrKykgewotCQkJdW5zaWduZWQgaSA9IDA7Ci0JCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcDsKLQotCQkJaGxpc3RfZm9yX2VhY2gocCwgaCkKLQkJCQlpKys7Ci0KLQkJCXJldCA9IG1heChyZXQsIGkpOwotCQl9Ci0KLQkJbXV0ZXhfdW5sb2NrKCZjLT5idWNrZXRfbG9jayk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JdW5zaWduZWQgYnRyZWVfdXNlZChzdHJ1Y3QgY2FjaGVfc2V0ICpjKQotCXsKLQkJcmV0dXJuIGRpdjY0X3U2NChjLT5nY19zdGF0cy5rZXlfYnl0ZXMgKiAxMDAsCi0JCQkJIChjLT5nY19zdGF0cy5ub2RlcyA/OiAxKSAqIGJ0cmVlX2J5dGVzKGMpKTsKLQl9Ci0KLQl1bnNpZ25lZCBhdmVyYWdlX2tleV9zaXplKHN0cnVjdCBjYWNoZV9zZXQgKmMpCi0JewotCQlyZXR1cm4gYy0+Z2Nfc3RhdHMubmtleXMKLQkJCT8gZGl2NjRfdTY0KGMtPmdjX3N0YXRzLmRhdGEsIGMtPmdjX3N0YXRzLm5rZXlzKQotCQkJOiAwOwotCX0KLQogCXN0cnVjdCBjYWNoZV9zZXQgKmMgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGNhY2hlX3NldCwga29iaik7CiAKIAlzeXNmc19wcmludChzeW5jaHJvbm91cywJCUNBQ0hFX1NZTkMoJmMtPnNiKSk7CkBAIC01MjQsMjEgKzUyMywyMCBAQAogCXN5c2ZzX2hwcmludChidWNrZXRfc2l6ZSwJCWJ1Y2tldF9ieXRlcyhjKSk7CiAJc3lzZnNfaHByaW50KGJsb2NrX3NpemUsCQlibG9ja19ieXRlcyhjKSk7CiAJc3lzZnNfcHJpbnQodHJlZV9kZXB0aCwJCQljLT5yb290LT5sZXZlbCk7Ci0Jc3lzZnNfcHJpbnQocm9vdF91c2FnZV9wZXJjZW50LAkJcm9vdF91c2FnZShjKSk7CisJc3lzZnNfcHJpbnQocm9vdF91c2FnZV9wZXJjZW50LAkJYmNoX3Jvb3RfdXNhZ2UoYykpOwogCi0Jc3lzZnNfaHByaW50KGJ0cmVlX2NhY2hlX3NpemUsCQljYWNoZV9zaXplKGMpKTsKLQlzeXNmc19wcmludChidHJlZV9jYWNoZV9tYXhfY2hhaW4sCWNhY2hlX21heF9jaGFpbihjKSk7CisJc3lzZnNfaHByaW50KGJ0cmVlX2NhY2hlX3NpemUsCQliY2hfY2FjaGVfc2l6ZShjKSk7CisJc3lzZnNfcHJpbnQoYnRyZWVfY2FjaGVfbWF4X2NoYWluLAliY2hfY2FjaGVfbWF4X2NoYWluKGMpKTsKIAlzeXNmc19wcmludChjYWNoZV9hdmFpbGFibGVfcGVyY2VudCwJMTAwIC0gYy0+Z2Nfc3RhdHMuaW5fdXNlKTsKIAogCXN5c2ZzX3ByaW50X3RpbWVfc3RhdHMoJmMtPmJ0cmVlX2djX3RpbWUsCWJ0cmVlX2djLCBzZWMsIG1zKTsKIAlzeXNmc19wcmludF90aW1lX3N0YXRzKCZjLT5idHJlZV9zcGxpdF90aW1lLAlidHJlZV9zcGxpdCwgc2VjLCB1cyk7CiAJc3lzZnNfcHJpbnRfdGltZV9zdGF0cygmYy0+c29ydC50aW1lLAkJYnRyZWVfc29ydCwgbXMsIHVzKTsKIAlzeXNmc19wcmludF90aW1lX3N0YXRzKCZjLT5idHJlZV9yZWFkX3RpbWUsCWJ0cmVlX3JlYWQsIG1zLCB1cyk7Ci0Jc3lzZnNfcHJpbnRfdGltZV9zdGF0cygmYy0+dHJ5X2hhcmRlcl90aW1lLAl0cnlfaGFyZGVyLCBtcywgdXMpOwogCi0Jc3lzZnNfcHJpbnQoYnRyZWVfdXNlZF9wZXJjZW50LAlidHJlZV91c2VkKGMpKTsKKwlzeXNmc19wcmludChidHJlZV91c2VkX3BlcmNlbnQsCWJjaF9idHJlZV91c2VkKGMpKTsKIAlzeXNmc19wcmludChidHJlZV9ub2RlcywJYy0+Z2Nfc3RhdHMubm9kZXMpOwotCXN5c2ZzX2hwcmludChhdmVyYWdlX2tleV9zaXplLAlhdmVyYWdlX2tleV9zaXplKGMpKTsKKwlzeXNmc19ocHJpbnQoYXZlcmFnZV9rZXlfc2l6ZSwJYmNoX2F2ZXJhZ2Vfa2V5X3NpemUoYykpOwogCiAJc3lzZnNfcHJpbnQoY2FjaGVfcmVhZF9yYWNlcywKIAkJICAgIGF0b21pY19sb25nX3JlYWQoJmMtPmNhY2hlX3JlYWRfcmFjZXMpKTsKQEAgLTcwOSw3ICs3MDcsNiBAQAogCXN5c2ZzX3RpbWVfc3RhdHNfYXR0cmlidXRlX2xpc3QoYnRyZWVfc3BsaXQsIHNlYywgdXMpCiAJc3lzZnNfdGltZV9zdGF0c19hdHRyaWJ1dGVfbGlzdChidHJlZV9zb3J0LCBtcywgdXMpCiAJc3lzZnNfdGltZV9zdGF0c19hdHRyaWJ1dGVfbGlzdChidHJlZV9yZWFkLCBtcywgdXMpCi0Jc3lzZnNfdGltZV9zdGF0c19hdHRyaWJ1dGVfbGlzdCh0cnlfaGFyZGVyLCBtcywgdXMpCiAKIAkmc3lzZnNfYnRyZWVfbm9kZXMsCiAJJnN5c2ZzX2J0cmVlX3VzZWRfcGVyY2VudCwKQEAgLTc2MSw3ICs3NTgsOSBAQAogCQlpbnQgY21wKGNvbnN0IHZvaWQgKmwsIGNvbnN0IHZvaWQgKnIpCiAJCXsJcmV0dXJuICooKHVpbnQxNl90ICopIHIpIC0gKigodWludDE2X3QgKikgbCk7IH0KIAotCQlzaXplX3QgbiA9IGNhLT5zYi5uYnVja2V0cywgaSwgdW51c2VkLCBidHJlZTsKKwkJc3RydWN0IGJ1Y2tldCAqYjsKKwkJc2l6ZV90IG4gPSBjYS0+c2IubmJ1Y2tldHMsIGk7CisJCXNpemVfdCB1bnVzZWQgPSAwLCBhdmFpbGFibGUgPSAwLCBkaXJ0eSA9IDAsIG1ldGEgPSAwOwogCQl1aW50NjRfdCBzdW0gPSAwOwogCQkvKiBDb21wdXRlIDMxIHF1YW50aWxlcyAqLwogCQl1aW50MTZfdCBxWzMxXSwgKnAsICpjYWNoZWQ7CkBAIC03NzIsNiArNzcxLDE3IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAogCQltdXRleF9sb2NrKCZjYS0+c2V0LT5idWNrZXRfbG9jayk7CisJCWZvcl9lYWNoX2J1Y2tldChiLCBjYSkgeworCQkJaWYgKCFHQ19TRUNUT1JTX1VTRUQoYikpCisJCQkJdW51c2VkKys7CisJCQlpZiAoR0NfTUFSSyhiKSA9PSBHQ19NQVJLX1JFQ0xBSU1BQkxFKQorCQkJCWF2YWlsYWJsZSsrOworCQkJaWYgKEdDX01BUksoYikgPT0gR0NfTUFSS19ESVJUWSkKKwkJCQlkaXJ0eSsrOworCQkJaWYgKEdDX01BUksoYikgPT0gR0NfTUFSS19NRVRBREFUQSkKKwkJCQltZXRhKys7CisJCX0KKwogCQlmb3IgKGkgPSBjYS0+c2IuZmlyc3RfYnVja2V0OyBpIDwgbjsgaSsrKQogCQkJcFtpXSA9IGNhLT5idWNrZXRzW2ldLnByaW87CiAJCW11dGV4X3VubG9jaygmY2EtPnNldC0+YnVja2V0X2xvY2spOwpAQCAtNzg2LDEwICs3OTYsNyBAQAogCiAJCXdoaWxlIChjYWNoZWQgPCBwICsgbiAmJgogCQkgICAgICAgKmNhY2hlZCA9PSBCVFJFRV9QUklPKQotCQkJY2FjaGVkKys7Ci0KLQkJYnRyZWUgPSBjYWNoZWQgLSBwOwotCQluIC09IGJ0cmVlOworCQkJY2FjaGVkKyssIG4tLTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQogCQkJc3VtICs9IElOSVRJQUxfUFJJTyAtIGNhY2hlZFtpXTsKQEAgLTgwNSwxMiArODEyLDE2IEBACiAKIAkJcmV0ID0gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLAogCQkJCSJVbnVzZWQ6CQklenUlJVxuIgorCQkJCSJDbGVhbjoJCSV6dSUlXG4iCisJCQkJIkRpcnR5OgkJJXp1JSVcbiIKIAkJCQkiTWV0YWRhdGE6CSV6dSUlXG4iCiAJCQkJIkF2ZXJhZ2U6CSVsbHVcbiIKIAkJCQkiU2VjdG9ycyBwZXIgUToJJXp1XG4iCiAJCQkJIlF1YW50aWxlczoJWyIsCiAJCQkJdW51c2VkICogMTAwIC8gKHNpemVfdCkgY2EtPnNiLm5idWNrZXRzLAotCQkJCWJ0cmVlICogMTAwIC8gKHNpemVfdCkgY2EtPnNiLm5idWNrZXRzLCBzdW0sCisJCQkJYXZhaWxhYmxlICogMTAwIC8gKHNpemVfdCkgY2EtPnNiLm5idWNrZXRzLAorCQkJCWRpcnR5ICogMTAwIC8gKHNpemVfdCkgY2EtPnNiLm5idWNrZXRzLAorCQkJCW1ldGEgKiAxMDAgLyAoc2l6ZV90KSBjYS0+c2IubmJ1Y2tldHMsIHN1bSwKIAkJCQluICogY2EtPnNiLmJ1Y2tldF9zaXplIC8gKEFSUkFZX1NJWkUocSkgKyAxKSk7CiAKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocSk7IGkrKykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL3RyYWNlLmMgYi9kcml2ZXJzL21kL2JjYWNoZS90cmFjZS5jCmluZGV4IGFkYmMzZGYuLmI3ODIwYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL3RyYWNlLmMKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvdHJhY2UuYwpAQCAtNDUsNyArNDUsNyBAQAogRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTChiY2FjaGVfYnRyZWVfbm9kZV9jb21wYWN0KTsKIEVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoYmNhY2hlX2J0cmVlX3NldF9yb290KTsKIAotRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTChiY2FjaGVfYWxsb2NfaW52YWxpZGF0ZSk7CitFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMKGJjYWNoZV9pbnZhbGlkYXRlKTsKIEVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoYmNhY2hlX2FsbG9jX2ZhaWwpOwogCiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMKGJjYWNoZV93cml0ZWJhY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1sb2ctdXNlcnNwYWNlLXRyYW5zZmVyLmMgYi9kcml2ZXJzL21kL2RtLWxvZy11c2Vyc3BhY2UtdHJhbnNmZXIuYwppbmRleCAwOGQ5YTIwLi5iNDI4YzBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWxvZy11c2Vyc3BhY2UtdHJhbnNmZXIuYworKysgYi9kcml2ZXJzL21kL2RtLWxvZy11c2Vyc3BhY2UtdHJhbnNmZXIuYwpAQCAtNjYsNyArNjYsNyBAQAogCW1zZy0+c2VxID0gdGZyLT5zZXE7CiAJbXNnLT5sZW4gPSBzaXplb2Yoc3RydWN0IGRtX3Vsb2dfcmVxdWVzdCkgKyB0ZnItPmRhdGFfc2l6ZTsKIAotCXIgPSBjbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBnZnBfYW55KCkpOworCXIgPSBjbl9uZXRsaW5rX3NlbmQobXNnLCAwLCAwLCBnZnBfYW55KCkpOwogCiAJcmV0dXJuIHI7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2kyYy9hZHY3MzQzLmMgYi9kcml2ZXJzL21lZGlhL2kyYy9hZHY3MzQzLmMKaW5kZXggZDRlMTVhNi4uOWQzOGY3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9pMmMvYWR2NzM0My5jCisrKyBiL2RyaXZlcnMvbWVkaWEvaTJjL2FkdjczNDMuYwpAQCAtMjYsMTIgKzI2LDEyIEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3JhcGguaD4KIAogI2luY2x1ZGUgPG1lZGlhL2FkdjczNDMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWFzeW5jLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1vZi5oPgogCiAjaW5jbHVkZSAiYWR2NzM0M19yZWdzLmgiCiAKQEAgLTQxMCw3ICs0MTAsNyBAQAogCWlmICghSVNfRU5BQkxFRChDT05GSUdfT0YpIHx8ICFjbGllbnQtPmRldi5vZl9ub2RlKQogCQlyZXR1cm4gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAotCW5wID0gdjRsMl9vZl9nZXRfbmV4dF9lbmRwb2ludChjbGllbnQtPmRldi5vZl9ub2RlLCBOVUxMKTsKKwlucCA9IG9mX2dyYXBoX2dldF9uZXh0X2VuZHBvaW50KGNsaWVudC0+ZGV2Lm9mX25vZGUsIE5VTEwpOwogCWlmICghbnApCiAJCXJldHVybiBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2kyYy9tdDlwMDMxLmMgYi9kcml2ZXJzL21lZGlhL2kyYy9tdDlwMDMxLmMKaW5kZXggZTVkZGY0Ny4uMTkyYzRhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9pMmMvbXQ5cDAzMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvaTJjL210OXAwMzEuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dyYXBoLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0yOSw3ICszMCw2IEBACiAjaW5jbHVkZSA8bWVkaWEvbXQ5cDAzMS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItb2YuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgogCiAjaW5jbHVkZSAiYXB0aW5hLXBsbC5oIgpAQCAtOTQzLDcgKzk0Myw3IEBACiAJaWYgKCFJU19FTkFCTEVEKENPTkZJR19PRikgfHwgIWNsaWVudC0+ZGV2Lm9mX25vZGUpCiAJCXJldHVybiBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCi0JbnAgPSB2NGwyX29mX2dldF9uZXh0X2VuZHBvaW50KGNsaWVudC0+ZGV2Lm9mX25vZGUsIE5VTEwpOworCW5wID0gb2ZfZ3JhcGhfZ2V0X25leHRfZW5kcG9pbnQoY2xpZW50LT5kZXYub2Zfbm9kZSwgTlVMTCk7CiAJaWYgKCFucCkKIAkJcmV0dXJuIE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvaTJjL3M1azViYWYuYyBiL2RyaXZlcnMvbWVkaWEvaTJjL3M1azViYWYuYwppbmRleCA3N2UxMGUwLi4yZDc2OGVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2kyYy9zNWs1YmFmLmMKKysrIGIvZHJpdmVycy9tZWRpYS9pMmMvczVrNWJhZi5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbWVkaWEuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3JhcGguaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKQEAgLTE4NTUsNyArMTg1Niw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlub2RlX2VwID0gdjRsMl9vZl9nZXRfbmV4dF9lbmRwb2ludChub2RlLCBOVUxMKTsKKwlub2RlX2VwID0gb2ZfZ3JhcGhfZ2V0X25leHRfZW5kcG9pbnQobm9kZSwgTlVMTCk7CiAJaWYgKCFub2RlX2VwKSB7CiAJCWRldl9lcnIoZGV2LCAibm8gZW5kcG9pbnQgZGVmaW5lZCBhdCBub2RlICVzXG4iLAogCQkJbm9kZS0+ZnVsbF9uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvaTJjL3R2cDUxNHguYyBiL2RyaXZlcnMvbWVkaWEvaTJjL3R2cDUxNHguYwppbmRleCA4M2Q4NWRmLi5jYTAwMTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2kyYy90dnA1MTR4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9pMmMvdHZwNTE0eC5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdjRsMi1tZWRpYWJ1cy5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3JhcGguaD4KIAogI2luY2x1ZGUgPG1lZGlhL3Y0bDItYXN5bmMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgpAQCAtMTA2OCw3ICsxMDY5LDcgQEAKIAlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX09GKSB8fCAhY2xpZW50LT5kZXYub2Zfbm9kZSkKIAkJcmV0dXJuIGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKLQllbmRwb2ludCA9IHY0bDJfb2ZfZ2V0X25leHRfZW5kcG9pbnQoY2xpZW50LT5kZXYub2Zfbm9kZSwgTlVMTCk7CisJZW5kcG9pbnQgPSBvZl9ncmFwaF9nZXRfbmV4dF9lbmRwb2ludChjbGllbnQtPmRldi5vZl9ub2RlLCBOVUxMKTsKIAlpZiAoIWVuZHBvaW50KQogCQlyZXR1cm4gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9pMmMvdHZwNzAwMi5jIGIvZHJpdmVycy9tZWRpYS9pMmMvdHZwNzAwMi5jCmluZGV4IDkxMmUxY2MuLmM0ZTFlMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvaTJjL3R2cDcwMDIuYworKysgYi9kcml2ZXJzL21lZGlhL2kyYy90dnA3MDAyLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dyYXBoLmg+CiAjaW5jbHVkZSA8bGludXgvdjRsMi1kdi10aW1pbmdzLmg+CiAjaW5jbHVkZSA8bWVkaWEvdHZwNzAwMi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItYXN5bmMuaD4KQEAgLTk1Nyw3ICs5NTgsNyBAQAogCWlmICghSVNfRU5BQkxFRChDT05GSUdfT0YpIHx8ICFjbGllbnQtPmRldi5vZl9ub2RlKQogCQlyZXR1cm4gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAotCWVuZHBvaW50ID0gdjRsMl9vZl9nZXRfbmV4dF9lbmRwb2ludChjbGllbnQtPmRldi5vZl9ub2RlLCBOVUxMKTsKKwllbmRwb2ludCA9IG9mX2dyYXBoX2dldF9uZXh0X2VuZHBvaW50KGNsaWVudC0+ZGV2Lm9mX25vZGUsIE5VTEwpOwogCWlmICghZW5kcG9pbnQpCiAJCXJldHVybiBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BjaS9jeDE4L2N4MTgtYWxzYS1tYWluLmMgYi9kcml2ZXJzL21lZGlhL3BjaS9jeDE4L2N4MTgtYWxzYS1tYWluLmMKaW5kZXggYjJjOGMzNC4uZWEyNzJiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wY2kvY3gxOC9jeDE4LWFsc2EtbWFpbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL2N4MTgvY3gxOC1hbHNhLW1haW4uYwpAQCAtMTQ1LDExICsxNDUsMTIgQEAKIAkvKiBUaGlzIGlzIGEgbm8tb3AgZm9yIHVzLiAgV2UnbGwgdXNlIHRoZSBjeC0+aW5zdGFuY2UgKi8KIAogCS8qICgyKSBDcmVhdGUgYSBjYXJkIGluc3RhbmNlICovCi0JcmV0ID0gc25kX2NhcmRfY3JlYXRlKFNORFJWX0RFRkFVTFRfSURYMSwgLyogdXNlIGZpcnN0IGF2YWlsYWJsZSBpZCAqLwotCQkJICAgICAgU05EUlZfREVGQVVMVF9TVFIxLCAvKiB4aWQgZnJvbSBlbmQgb2Ygc2hvcnRuYW1lKi8KLQkJCSAgICAgIFRISVNfTU9EVUxFLCAwLCAmc2MpOworCXJldCA9IHNuZF9jYXJkX25ldygmY3gtPnBjaV9kZXYtPmRldiwKKwkJCSAgIFNORFJWX0RFRkFVTFRfSURYMSwgLyogdXNlIGZpcnN0IGF2YWlsYWJsZSBpZCAqLworCQkJICAgU05EUlZfREVGQVVMVF9TVFIxLCAvKiB4aWQgZnJvbSBlbmQgb2Ygc2hvcnRuYW1lKi8KKwkJCSAgIFRISVNfTU9EVUxFLCAwLCAmc2MpOwogCWlmIChyZXQpIHsKLQkJQ1gxOF9BTFNBX0VSUigiJXM6IHNuZF9jYXJkX2NyZWF0ZSgpIGZhaWxlZCB3aXRoIGVyciAlZFxuIiwKKwkJQ1gxOF9BTFNBX0VSUigiJXM6IHNuZF9jYXJkX25ldygpIGZhaWxlZCB3aXRoIGVyciAlZFxuIiwKIAkJCSAgICAgIF9fZnVuY19fLCByZXQpOwogCQlnb3RvIGVycl9leGl0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL2N4MjM4ODUvY3gyMzg4NS1hbHNhLmMgYi9kcml2ZXJzL21lZGlhL3BjaS9jeDIzODg1L2N4MjM4ODUtYWxzYS5jCmluZGV4IGM2YzliZDUuLjU1NDc5OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL2N4MjM4ODUvY3gyMzg4NS1hbHNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvY3gyMzg4NS9jeDIzODg1LWFsc2EuYwpAQCAtNDg5LDcgKzQ4OSw4IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmRldi0+cGNpLT5kZXYsCisJCQkgICBTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKIAkJCVRISVNfTU9EVUxFLCBzaXplb2Yoc3RydWN0IGN4MjM4ODVfYXVkaW9fZGV2KSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm9yOwpAQCAtNTAwLDggKzUwMSw2IEBACiAJY2hpcC0+Y2FyZCA9IGNhcmQ7CiAJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPmxvY2spOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2LT5wY2ktPmRldik7Ci0KIAllcnIgPSBzbmRfY3gyMzg4NV9wY20oY2hpcCwgMCwgIkNYMjM4ODUgRGlnaXRhbCIpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm9yOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvY3gyNTgyMS9jeDI1ODIxLWFsc2EuYyBiL2RyaXZlcnMvbWVkaWEvcGNpL2N4MjU4MjEvY3gyNTgyMS1hbHNhLmMKaW5kZXggYjFlMDhjMy4uMmRkNWJjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wY2kvY3gyNTgyMS9jeDI1ODIxLWFsc2EuYworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCkBAIC02NDUsOCArNjQ1LDkgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldm5vXSwgaWRbZGV2bm9dLCBUSElTX01PRFVMRSwKLQkJCXNpemVvZihzdHJ1Y3QgY3gyNTgyMV9hdWRpb19kZXYpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZkZXYtPnBjaS0+ZGV2LCBpbmRleFtkZXZub10sIGlkW2Rldm5vXSwKKwkJCSAgIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBjeDI1ODIxX2F1ZGlvX2RldiksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewogCQlwcl9pbmZvKCJERUJVRyBFUlJPUjogY2Fubm90IGNyZWF0ZSBzbmRfY2FyZF9uZXcgaW4gJXNcbiIsCiAJCQlfX2Z1bmNfXyk7CkBAIC02ODIsOCArNjgzLDYgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZjaGlwLT5wY2ktPmRldik7Ci0KIAlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiY3gyNTgyMSIpOwogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseCBpcnEgJWQiLCBjaGlwLT5kZXYtPm5hbWUsCiAJCWNoaXAtPmlvYmFzZSwgY2hpcC0+aXJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL2N4ODgvY3g4OC1hbHNhLmMgYi9kcml2ZXJzL21lZGlhL3BjaS9jeDg4L2N4ODgtYWxzYS5jCmluZGV4IGQwMTQyMDZlLi5hNzI1NzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9jeDg4L2N4ODgtYWxzYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL2N4ODgvY3g4OC1hbHNhLmMKQEAgLTg1Miw4ICs4NTIsNiBAQAogCWNoaXAtPmlycSA9IHBjaS0+aXJxOwogCXN5bmNocm9uaXplX2lycShjaGlwLT5pcnEpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJjaGlwID0gY2hpcDsKIAkqY29yZV9wdHIgPSBjb3JlOwogCkBAIC04NzYsOCArODc0LDggQEAKIAkJcmV0dXJuICgtRU5PRU5UKTsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2bm9dLCBpZFtkZXZub10sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHNuZF9jeDg4X2NhcmRfdCksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZub10sIGlkW2Rldm5vXSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc25kX2N4ODhfY2FyZF90KSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BjaS9pdnR2L2l2dHYtYWxzYS1tYWluLmMgYi9kcml2ZXJzL21lZGlhL3BjaS9pdnR2L2l2dHYtYWxzYS1tYWluLmMKaW5kZXggZTk3MGNmYS4uMzliNTI5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wY2kvaXZ0di9pdnR2LWFsc2EtbWFpbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL2l2dHYvaXZ0di1hbHNhLW1haW4uYwpAQCAtMTQ1LDExICsxNDUsMTIgQEAKIAkvKiBUaGlzIGlzIGEgbm8tb3AgZm9yIHVzLiAgV2UnbGwgdXNlIHRoZSBpdHYtPmluc3RhbmNlICovCiAKIAkvKiAoMikgQ3JlYXRlIGEgY2FyZCBpbnN0YW5jZSAqLwotCXJldCA9IHNuZF9jYXJkX2NyZWF0ZShTTkRSVl9ERUZBVUxUX0lEWDEsIC8qIHVzZSBmaXJzdCBhdmFpbGFibGUgaWQgKi8KLQkJCSAgICAgIFNORFJWX0RFRkFVTFRfU1RSMSwgLyogeGlkIGZyb20gZW5kIG9mIHNob3J0bmFtZSovCi0JCQkgICAgICBUSElTX01PRFVMRSwgMCwgJnNjKTsKKwlyZXQgPSBzbmRfY2FyZF9uZXcoJml0di0+cGRldi0+ZGV2LAorCQkJICAgU05EUlZfREVGQVVMVF9JRFgxLCAvKiB1c2UgZmlyc3QgYXZhaWxhYmxlIGlkICovCisJCQkgICBTTkRSVl9ERUZBVUxUX1NUUjEsIC8qIHhpZCBmcm9tIGVuZCBvZiBzaG9ydG5hbWUqLworCQkJICAgVEhJU19NT0RVTEUsIDAsICZzYyk7CiAJaWYgKHJldCkgewotCQlJVlRWX0FMU0FfRVJSKCIlczogc25kX2NhcmRfY3JlYXRlKCkgZmFpbGVkIHdpdGggZXJyICVkXG4iLAorCQlJVlRWX0FMU0FfRVJSKCIlczogc25kX2NhcmRfbmV3KCkgZmFpbGVkIHdpdGggZXJyICVkXG4iLAogCQkJICAgICAgX19mdW5jX18sIHJldCk7CiAJCWdvdG8gZXJyX2V4aXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LWFsc2EuYyBiL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC1hbHNhLmMKaW5kZXggZGQ2N2M4YS4uZTA0YTRkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LWFsc2EuYworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTcxMzQtYWxzYS5jCkBAIC0xMDcyLDggKzEwNzIsOCBAQAogCWlmICghZW5hYmxlW2Rldm51bV0pCiAJCXJldHVybiAtRU5PREVWOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldm51bV0sIGlkW2Rldm51bV0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHNuZF9jYXJkX3NhYTcxMzRfdCksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmRldi0+cGNpLT5kZXYsIGluZGV4W2Rldm51bV0sIGlkW2Rldm51bV0sCisJCQkgICBUSElTX01PRFVMRSwgc2l6ZW9mKHNuZF9jYXJkX3NhYTcxMzRfdCksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMTExNSw4ICsxMTE1LDYgQEAKIAlpZiAoKGVyciA9IHNuZF9jYXJkX3NhYTcxMzRfcGNtKGNoaXAsIDApKSA8IDApCiAJCWdvdG8gX19ub2RldjsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmNoaXAtPnBjaS0+ZGV2KTsKLQogCS8qIEVuZCBvZiAiY3JlYXRpb24iICovCiAKIAlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiU0FBNzEzNCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL2ZpbWMtaXMuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9maW1jLWlzLmMKaW5kZXggMTNhNDIyOC4uOWJkZmE0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL2ZpbWMtaXMuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvZmltYy1pcy5jCkBAIC0yNCwxMyArMjQsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3JhcGguaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLW9mLmg+CiAjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWRtYS1jb250aWcuaD4KIAogI2luY2x1ZGUgIm1lZGlhLWRldi5oIgpAQCAtMTY3LDEwICsxNjcsMTAgQEAKIAl1MzIgdG1wID0gMDsKIAlpbnQgcmV0OwogCi0JbnAgPSB2NGwyX29mX2dldF9uZXh0X2VuZHBvaW50KG5wLCBOVUxMKTsKKwlucCA9IG9mX2dyYXBoX2dldF9uZXh0X2VuZHBvaW50KG5wLCBOVUxMKTsKIAlpZiAoIW5wKQogCQlyZXR1cm4gLUVOWElPOwotCW5wID0gdjRsMl9vZl9nZXRfcmVtb3RlX3BvcnQobnApOworCW5wID0gb2ZfZ3JhcGhfZ2V0X3JlbW90ZV9wb3J0KG5wKTsKIAlpZiAoIW5wKQogCQlyZXR1cm4gLUVOWElPOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvbWVkaWEtZGV2LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvbWVkaWEtZGV2LmMKaW5kZXggYzFiY2UxNy4uMDRkNmVjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL21lZGlhLWRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9tZWRpYS1kZXYuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncmFwaC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtNDY4LDEyICs0NjksMTIgQEAKIAkJcmV0dXJuIDA7CiAKIAl2NGwyX29mX3BhcnNlX2VuZHBvaW50KGVwLCAmZW5kcG9pbnQpOwotCWlmIChXQVJOX09OKGVuZHBvaW50LnBvcnQgPT0gMCkgfHwgaW5kZXggPj0gRklNQ19NQVhfU0VOU09SUykKKwlpZiAoV0FSTl9PTihlbmRwb2ludC5iYXNlLnBvcnQgPT0gMCkgfHwgaW5kZXggPj0gRklNQ19NQVhfU0VOU09SUykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwZC0+bXV4X2lkID0gKGVuZHBvaW50LnBvcnQgLSAxKSAmIDB4MTsKKwlwZC0+bXV4X2lkID0gKGVuZHBvaW50LmJhc2UucG9ydCAtIDEpICYgMHgxOwogCi0JcmVtID0gdjRsMl9vZl9nZXRfcmVtb3RlX3BvcnRfcGFyZW50KGVwKTsKKwlyZW0gPSBvZl9ncmFwaF9nZXRfcmVtb3RlX3BvcnRfcGFyZW50KGVwKTsKIAlvZl9ub2RlX3B1dChlcCk7CiAJaWYgKHJlbSA9PSBOVUxMKSB7CiAJCXY0bDJfaW5mbygmZm1kLT52NGwyX2RldiwgIlJlbW90ZSBkZXZpY2UgYXQgJXMgbm90IGZvdW5kXG4iLApAQCAtNDkzLDEzICs0OTQsMTMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGZpbWNfaW5wdXRfaXNfcGFyYWxsZWwoZW5kcG9pbnQucG9ydCkpIHsKKwlpZiAoZmltY19pbnB1dF9pc19wYXJhbGxlbChlbmRwb2ludC5iYXNlLnBvcnQpKSB7CiAJCWlmIChlbmRwb2ludC5idXNfdHlwZSA9PSBWNEwyX01CVVNfUEFSQUxMRUwpCiAJCQlwZC0+c2Vuc29yX2J1c190eXBlID0gRklNQ19CVVNfVFlQRV9JVFVfNjAxOwogCQllbHNlCiAJCQlwZC0+c2Vuc29yX2J1c190eXBlID0gRklNQ19CVVNfVFlQRV9JVFVfNjU2OwogCQlwZC0+ZmxhZ3MgPSBlbmRwb2ludC5idXMucGFyYWxsZWwuZmxhZ3M7Ci0JfSBlbHNlIGlmIChmaW1jX2lucHV0X2lzX21pcGlfY3NpKGVuZHBvaW50LnBvcnQpKSB7CisJfSBlbHNlIGlmIChmaW1jX2lucHV0X2lzX21pcGlfY3NpKGVuZHBvaW50LmJhc2UucG9ydCkpIHsKIAkJLyoKIAkJICogTUlQSSBDU0ktMjogb25seSBpbnB1dCBtdXggc2VsZWN0aW9uIGFuZAogCQkgKiB0aGUgc2Vuc29yJ3MgY2xvY2sgZnJlcXVlbmN5IGlzIG5lZWRlZC4KQEAgLTUwNyw3ICs1MDgsNyBAQAogCQlwZC0+c2Vuc29yX2J1c190eXBlID0gRklNQ19CVVNfVFlQRV9NSVBJX0NTSTI7CiAJfSBlbHNlIHsKIAkJdjRsMl9lcnIoJmZtZC0+djRsMl9kZXYsICJXcm9uZyBwb3J0IGlkICgldSkgYXQgbm9kZSAlc1xuIiwKLQkJCSBlbmRwb2ludC5wb3J0LCByZW0tPmZ1bGxfbmFtZSk7CisJCQkgZW5kcG9pbnQuYmFzZS5wb3J0LCByZW0tPmZ1bGxfbmFtZSk7CiAJfQogCS8qCiAJICogRm9yIEZJTUMtSVMgaGFuZGxlZCBzZW5zb3JzLCB0aGF0IGFyZSBwbGFjZWQgdW5kZXIgaTJjLWlzcCBkZXZpY2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9taXBpLWNzaXMuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9taXBpLWNzaXMuYwppbmRleCBmM2MzNTkxLi4zNjc4YmE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvbWlwaS1jc2lzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL21pcGktY3Npcy5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbWVtb3J5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncmFwaC5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL21pcGktY3Npcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtNzYyLDcgKzc2Myw3IEBACiAJCQkJICZzdGF0ZS0+bWF4X251bV9sYW5lcykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jbm9kZSA9IHY0bDJfb2ZfZ2V0X25leHRfZW5kcG9pbnQobm9kZSwgTlVMTCk7CisJbm9kZSA9IG9mX2dyYXBoX2dldF9uZXh0X2VuZHBvaW50KG5vZGUsIE5VTEwpOwogCWlmICghbm9kZSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBwb3J0IG5vZGUgYXQgJXNcbiIsCiAJCQkJcGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSk7CkBAIC03NzEsNyArNzcyLDcgQEAKIAkvKiBHZXQgcG9ydCBub2RlIGFuZCB2YWxpZGF0ZSBNSVBJLUNTSSBjaGFubmVsIGlkLiAqLwogCXY0bDJfb2ZfcGFyc2VfZW5kcG9pbnQobm9kZSwgJmVuZHBvaW50KTsKIAotCXN0YXRlLT5pbmRleCA9IGVuZHBvaW50LnBvcnQgLSBGSU1DX0lOUFVUX01JUElfQ1NJMl8wOworCXN0YXRlLT5pbmRleCA9IGVuZHBvaW50LmJhc2UucG9ydCAtIEZJTUNfSU5QVVRfTUlQSV9DU0kyXzA7CiAJaWYgKHN0YXRlLT5pbmRleCA8IDAgfHwgc3RhdGUtPmluZGV4ID49IENTSVNfTUFYX0VOVElUSUVTKQogCQlyZXR1cm4gLUVOWElPOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtYXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvY3gyMzF4eC1hdWRpby5jCmluZGV4IDgxYTFkOTcuLjliOTI1ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvY3gyMzF4eC1hdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvY3gyMzF4eC1hdWRpby5jCkBAIC02NjUsOCArNjY1LDggQEAKIAljeDIzMXh4X2luZm8oImN4MjMxeHgtYXVkaW8uYzogcHJvYmluZyBmb3IgY3gyMzF4eCAiCiAJCSAgICAgIm5vbiBzdGFuZGFyZCB1c2JhdWRpb1xuIik7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2bnJdLCAiQ3gyMzF4eCBBdWRpbyIsIFRISVNfTU9EVUxFLAotCQkJICAgICAgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmZGV2LT51ZGV2LT5kZXYsIGluZGV4W2Rldm5yXSwgIkN4MjMxeHggQXVkaW8iLAorCQkJICAgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtNjgyLDcgKzY4Miw2IEBACiAJcGNtLT5pbmZvX2ZsYWdzID0gMDsKIAlwY20tPnByaXZhdGVfZGF0YSA9IGRldjsKIAlzdHJjcHkocGNtLT5uYW1lLCAiQ29uZXhhbnQgY3gyMzF4eCBDYXB0dXJlIik7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2LT51ZGV2LT5kZXYpOwogCXN0cmNweShjYXJkLT5kcml2ZXIsICJDeDIzMXh4LUF1ZGlvIik7CiAJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIkN4MjMxeHggQXVkaW8iKTsKIAlzdHJjcHkoY2FyZC0+bG9uZ25hbWUsICJDb25leGFudCBjeDIzMXh4IEF1ZGlvIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWF1ZGlvLmMKaW5kZXggMDVlOWJkMS4uMWEyODg5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1hdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtYXVkaW8uYwpAQCAtOTAwLDggKzkwMCw4IEBACiAJcHJpbnRrKEtFUk5fSU5GTwogCSAgICAgICAiZW0yOHh4LWF1ZGlvLmM6IENvcHlyaWdodCAoQykgMjAwNy0yMDE0IE1hdXJvIENhcnZhbGhvIENoZWhhYlxuIik7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2bnJdLCAiRW0yOHh4IEF1ZGlvIiwgVEhJU19NT0RVTEUsIDAsCi0JCQkgICAgICAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZkZXYtPnVkZXYtPmRldiwgaW5kZXhbZGV2bnJdLCAiRW0yOHh4IEF1ZGlvIiwKKwkJCSAgIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTkxOCw3ICs5MTgsNiBAQAogCXBjbS0+cHJpdmF0ZV9kYXRhID0gZGV2OwogCXN0cmNweShwY20tPm5hbWUsICJFbXBpYSAyOHh4IENhcHR1cmUiKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmRldi0+dWRldi0+ZGV2KTsKIAlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiRW0yOHh4LUF1ZGlvIik7CiAJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIkVtMjh4eCBBdWRpbyIpOwogCXN0cmNweShjYXJkLT5sb25nbmFtZSwgIkVtcGlhIEVtMjh4eCBBdWRpbyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2Ivc3RrMTE2MC9zdGsxMTYwLWFjOTcuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL3N0azExNjAvc3RrMTE2MC1hYzk3LmMKaW5kZXggYzg1ODNjMi4uYzQ2YzhiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2Ivc3RrMTE2MC9zdGsxMTYwLWFjOTcuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9zdGsxMTYwL3N0azExNjAtYWM5Ny5jCkBAIC05OCwxMyArOTgsMTEgQEAKIAkgKiBKdXN0IHdhbnQgYSBjYXJkIHRvIGFjY2VzcyBhYzk2IGNvbnRyb2xzLAogCSAqIHRoZSBhY3R1YWwgY2FwdHVyZSBpbnRlcmZhY2Ugd2lsbCBiZSBoYW5kbGVkIGJ5IHNuZC11c2ItYXVkaW8KIAkgKi8KLQlyYyA9IHNuZF9jYXJkX2NyZWF0ZShTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKLQkJCSAgICAgIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJcmMgPSBzbmRfY2FyZF9uZXcoZGV2LT5kZXYsIFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxLAorCQkJICBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2LT5kZXYpOwotCiAJLyogVE9ETzogSSdtIG5vdCBzdXJlIHdoZXJlIHNob3VsZCBJIGdldCB0aGVzZSBuYW1lcyA6LSggKi8KIAlzbnByaW50ZihjYXJkLT5zaG9ydG5hbWUsIHNpemVvZihjYXJkLT5zaG9ydG5hbWUpLAogCQkgInN0azExNjAtbWl4ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL3RsZzIzMDAvcGQtYWxzYS5jIGIvZHJpdmVycy9tZWRpYS91c2IvdGxnMjMwMC9wZC1hbHNhLmMKaW5kZXggM2YzZTE0MS4uZGQ4ZmUxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvdGxnMjMwMC9wZC1hbHNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvdGxnMjMwMC9wZC1hbHNhLmMKQEAgLTMwMCw3ICszMDAsOCBAQAogCXN0cnVjdCBzbmRfcGNtICpwY207CiAJaW50IHJldDsKIAotCXJldCA9IHNuZF9jYXJkX2NyZWF0ZSgtMSwgIlRlbGVnZW50IiwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwlyZXQgPSBzbmRfY2FyZF9uZXcoJnAtPmludGVyZmFjZS0+ZGV2LCAtMSwgIlRlbGVnZW50IiwKKwkJCSAgIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKHJldCAhPSAwKQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi90bTYwMDAvdG02MDAwLWFsc2EuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL3RtNjAwMC90bTYwMDAtYWxzYS5jCmluZGV4IDgxM2MxZWMuLjMyMzljZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL3RtNjAwMC90bTYwMDAtYWxzYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL3RtNjAwMC90bTYwMDAtYWxzYS5jCkBAIC00MzEsNyArNDMxLDggQEAKIAlpZiAoIWVuYWJsZVtkZXZucl0pCiAJCXJldHVybiAtRU5PRU5UOwogCi0JcmMgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2bnJdLCAidG02MDAwIiwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwlyYyA9IHNuZF9jYXJkX25ldygmZGV2LT51ZGV2LT5kZXYsIGluZGV4W2Rldm5yXSwgInRtNjAwMCIsCisJCQkgIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKHJjIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgY3JlYXRlIGNhcmQgaW5zdGFuY2UgJWRcbiIsIGRldm5yKTsKIAkJcmV0dXJuIHJjOwpAQCAtNDQ1LDcgKzQ0Niw2IEBACiAJCWxlMTZfdG9fY3B1KGRldi0+dWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCiAJCWxlMTZfdG9fY3B1KGRldi0+dWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKIAlzbmRfY29tcG9uZW50X2FkZChjYXJkLCBjb21wb25lbnQpOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmRldi0+dWRldi0+ZGV2KTsKIAogCWNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjaGlwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWNvbXBhdC1pb2N0bDMyLmMgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWNvbXBhdC1pb2N0bDMyLmMKaW5kZXggOGY3YTZhNC4uNjE5MTk2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1jb21wYXQtaW9jdGwzMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItY29tcGF0LWlvY3RsMzIuYwpAQCAtNzMzLDcgKzczMyw3IEBACiAJCWNvcHlfdG9fdXNlcigmdXAtPnUsICZrcC0+dSwgc2l6ZW9mKGtwLT51KSkgfHwKIAkJcHV0X3VzZXIoa3AtPnBlbmRpbmcsICZ1cC0+cGVuZGluZykgfHwKIAkJcHV0X3VzZXIoa3AtPnNlcXVlbmNlLCAmdXAtPnNlcXVlbmNlKSB8fAotCQlwdXRfY29tcGF0X3RpbWVzcGVjKCZrcC0+dGltZXN0YW1wLCAmdXAtPnRpbWVzdGFtcCkgfHwKKwkJY29tcGF0X3B1dF90aW1lc3BlYygma3AtPnRpbWVzdGFtcCwgJnVwLT50aW1lc3RhbXApIHx8CiAJCXB1dF91c2VyKGtwLT5pZCwgJnVwLT5pZCkgfHwKIAkJY29weV90b191c2VyKHVwLT5yZXNlcnZlZCwga3AtPnJlc2VydmVkLCA4ICogc2l6ZW9mKF9fdTMyKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItb2YuYyBiL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItb2YuYwppbmRleCA0MmUzZThhLi5iNGVkOWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLW9mLmMKKysrIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1vZi5jCkBAIC0xMjcsMTcgKzEyNyw5IEBACiBpbnQgdjRsMl9vZl9wYXJzZV9lbmRwb2ludChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCiAJCQkgICBzdHJ1Y3QgdjRsMl9vZl9lbmRwb2ludCAqZW5kcG9pbnQpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwb3J0X25vZGUgPSBvZl9nZXRfcGFyZW50KG5vZGUpOwotCi0JbWVtc2V0KGVuZHBvaW50LCAwLCBvZmZzZXRvZihzdHJ1Y3QgdjRsMl9vZl9lbmRwb2ludCwgaGVhZCkpOwotCi0JZW5kcG9pbnQtPmxvY2FsX25vZGUgPSBub2RlOwotCS8qCi0JICogSXQgZG9lc24ndCBtYXR0ZXIgd2hldGhlciB0aGUgdHdvIGNhbGxzIGJlbG93IHN1Y2NlZWQuCi0JICogSWYgdGhleSBkb24ndCB0aGVuIHRoZSBkZWZhdWx0IHZhbHVlIDAgaXMgdXNlZC4KLQkgKi8KLQlvZl9wcm9wZXJ0eV9yZWFkX3UzMihwb3J0X25vZGUsICJyZWciLCAmZW5kcG9pbnQtPnBvcnQpOwotCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJyZWciLCAmZW5kcG9pbnQtPmlkKTsKKwlvZl9ncmFwaF9wYXJzZV9lbmRwb2ludChub2RlLCAmZW5kcG9pbnQtPmJhc2UpOworCWVuZHBvaW50LT5idXNfdHlwZSA9IDA7CisJbWVtc2V0KCZlbmRwb2ludC0+YnVzLCAwLCBzaXplb2YoZW5kcG9pbnQtPmJ1cykpOwogCiAJdjRsMl9vZl9wYXJzZV9jc2lfYnVzKG5vZGUsIGVuZHBvaW50KTsKIAkvKgpAQCAtMTQ3LDEyNSArMTM5LDYgQEAKIAlpZiAoZW5kcG9pbnQtPmJ1cy5taXBpX2NzaTIuZmxhZ3MgPT0gMCkKIAkJdjRsMl9vZl9wYXJzZV9wYXJhbGxlbF9idXMobm9kZSwgZW5kcG9pbnQpOwogCi0Jb2Zfbm9kZV9wdXQocG9ydF9ub2RlKTsKLQogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTCh2NGwyX29mX3BhcnNlX2VuZHBvaW50KTsKLQotLyoqCi0gKiB2NGwyX29mX2dldF9uZXh0X2VuZHBvaW50KCkgLSBnZXQgbmV4dCBlbmRwb2ludCBub2RlCi0gKiBAcGFyZW50OiBwb2ludGVyIHRvIHRoZSBwYXJlbnQgZGV2aWNlIG5vZGUKLSAqIEBwcmV2OiBwcmV2aW91cyBlbmRwb2ludCBub2RlLCBvciBOVUxMIHRvIGdldCBmaXJzdAotICoKLSAqIFJldHVybjogQW4gJ2VuZHBvaW50JyBub2RlIHBvaW50ZXIgd2l0aCByZWZjb3VudCBpbmNyZW1lbnRlZC4gUmVmY291bnQKLSAqIG9mIHRoZSBwYXNzZWQgQHByZXYgbm9kZSBpcyBub3QgZGVjcmVtZW50ZWQsIHRoZSBjYWxsZXIgaGF2ZSB0byB1c2UKLSAqIG9mX25vZGVfcHV0KCkgb24gaXQgd2hlbiBkb25lLgotICovCi1zdHJ1Y3QgZGV2aWNlX25vZGUgKnY0bDJfb2ZfZ2V0X25leHRfZW5kcG9pbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsCi0JCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcHJldikKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmVuZHBvaW50OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcG9ydCA9IE5VTEw7Ci0KLQlpZiAoIXBhcmVudCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoIXByZXYpIHsKLQkJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwotCQkvKgotCQkgKiBJdCdzIHRoZSBmaXJzdCBjYWxsLCB3ZSBoYXZlIHRvIGZpbmQgYSBwb3J0IHN1Ym5vZGUKLQkJICogd2l0aGluIHRoaXMgbm9kZSBvciB3aXRoaW4gYW4gb3B0aW9uYWwgJ3BvcnRzJyBub2RlLgotCQkgKi8KLQkJbm9kZSA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKHBhcmVudCwgInBvcnRzIik7Ci0JCWlmIChub2RlKQotCQkJcGFyZW50ID0gbm9kZTsKLQotCQlwb3J0ID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUocGFyZW50LCAicG9ydCIpOwotCi0JCWlmIChwb3J0KSB7Ci0JCQkvKiBGb3VuZCBhIHBvcnQsIGdldCBhbiBlbmRwb2ludC4gKi8KLQkJCWVuZHBvaW50ID0gb2ZfZ2V0X25leHRfY2hpbGQocG9ydCwgTlVMTCk7Ci0JCQlvZl9ub2RlX3B1dChwb3J0KTsKLQkJfSBlbHNlIHsKLQkJCWVuZHBvaW50ID0gTlVMTDsKLQkJfQotCi0JCWlmICghZW5kcG9pbnQpCi0JCQlwcl9lcnIoIiVzKCk6IG5vIGVuZHBvaW50IG5vZGVzIHNwZWNpZmllZCBmb3IgJXNcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHBhcmVudC0+ZnVsbF9uYW1lKTsKLQkJb2Zfbm9kZV9wdXQobm9kZSk7Ci0JfSBlbHNlIHsKLQkJcG9ydCA9IG9mX2dldF9wYXJlbnQocHJldik7Ci0JCWlmICghcG9ydCkKLQkJCS8qIEhtLCBoYXMgc29tZW9uZSBnaXZlbiB1cyB0aGUgcm9vdCBub2RlID8uLi4gKi8KLQkJCXJldHVybiBOVUxMOwotCi0JCS8qIEF2b2lkIGRyb3BwaW5nIHByZXYgbm9kZSByZWZjb3VudCB0byAwLiAqLwotCQlvZl9ub2RlX2dldChwcmV2KTsKLQkJZW5kcG9pbnQgPSBvZl9nZXRfbmV4dF9jaGlsZChwb3J0LCBwcmV2KTsKLQkJaWYgKGVuZHBvaW50KSB7Ci0JCQlvZl9ub2RlX3B1dChwb3J0KTsKLQkJCXJldHVybiBlbmRwb2ludDsKLQkJfQotCi0JCS8qIE5vIG1vcmUgZW5kcG9pbnRzIHVuZGVyIHRoaXMgcG9ydCwgdHJ5IHRoZSBuZXh0IG9uZS4gKi8KLQkJZG8gewotCQkJcG9ydCA9IG9mX2dldF9uZXh0X2NoaWxkKHBhcmVudCwgcG9ydCk7Ci0JCQlpZiAoIXBvcnQpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0gd2hpbGUgKG9mX25vZGVfY21wKHBvcnQtPm5hbWUsICJwb3J0IikpOwotCi0JCS8qIFBpY2sgdXAgdGhlIGZpcnN0IGVuZHBvaW50IGluIHRoaXMgcG9ydC4gKi8KLQkJZW5kcG9pbnQgPSBvZl9nZXRfbmV4dF9jaGlsZChwb3J0LCBOVUxMKTsKLQkJb2Zfbm9kZV9wdXQocG9ydCk7Ci0JfQotCi0JcmV0dXJuIGVuZHBvaW50OwotfQotRVhQT1JUX1NZTUJPTCh2NGwyX29mX2dldF9uZXh0X2VuZHBvaW50KTsKLQotLyoqCi0gKiB2NGwyX29mX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQoKSAtIGdldCByZW1vdGUgcG9ydCdzIHBhcmVudCBub2RlCi0gKiBAbm9kZTogcG9pbnRlciB0byBhIGxvY2FsIGVuZHBvaW50IGRldmljZV9ub2RlCi0gKgotICogUmV0dXJuOiBSZW1vdGUgZGV2aWNlIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHJlbW90ZSBlbmRwb2ludCBub2RlIGxpbmtlZAotICoJICAgdG8gQG5vZGUuIFVzZSBvZl9ub2RlX3B1dCgpIG9uIGl0IHdoZW4gZG9uZS4KLSAqLwotc3RydWN0IGRldmljZV9ub2RlICp2NGwyX29mX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQoCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0JdW5zaWduZWQgaW50IGRlcHRoOwotCi0JLyogR2V0IHJlbW90ZSBlbmRwb2ludCBub2RlLiAqLwotCW5wID0gb2ZfcGFyc2VfcGhhbmRsZShub2RlLCAicmVtb3RlLWVuZHBvaW50IiwgMCk7Ci0KLQkvKiBXYWxrIDMgbGV2ZWxzIHVwIG9ubHkgaWYgdGhlcmUgaXMgJ3BvcnRzJyBub2RlLiAqLwotCWZvciAoZGVwdGggPSAzOyBkZXB0aCAmJiBucDsgZGVwdGgtLSkgewotCQlucCA9IG9mX2dldF9uZXh0X3BhcmVudChucCk7Ci0JCWlmIChkZXB0aCA9PSAyICYmIG9mX25vZGVfY21wKG5wLT5uYW1lLCAicG9ydHMiKSkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gbnA7Ci19Ci1FWFBPUlRfU1lNQk9MKHY0bDJfb2ZfZ2V0X3JlbW90ZV9wb3J0X3BhcmVudCk7Ci0KLS8qKgotICogdjRsMl9vZl9nZXRfcmVtb3RlX3BvcnQoKSAtIGdldCByZW1vdGUgcG9ydCBub2RlCi0gKiBAbm9kZTogcG9pbnRlciB0byBhIGxvY2FsIGVuZHBvaW50IGRldmljZV9ub2RlCi0gKgotICogUmV0dXJuOiBSZW1vdGUgcG9ydCBub2RlIGFzc29jaWF0ZWQgd2l0aCByZW1vdGUgZW5kcG9pbnQgbm9kZSBsaW5rZWQKLSAqCSAgIHRvIEBub2RlLiBVc2Ugb2Zfbm9kZV9wdXQoKSBvbiBpdCB3aGVuIGRvbmUuCi0gKi8KLXN0cnVjdCBkZXZpY2Vfbm9kZSAqdjRsMl9vZl9nZXRfcmVtb3RlX3BvcnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0KLQkvKiBHZXQgcmVtb3RlIGVuZHBvaW50IG5vZGUuICovCi0JbnAgPSBvZl9wYXJzZV9waGFuZGxlKG5vZGUsICJyZW1vdGUtZW5kcG9pbnQiLCAwKTsKLQlpZiAoIW5wKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gb2ZfZ2V0X25leHRfcGFyZW50KG5wKTsKLX0KLUVYUE9SVF9TWU1CT0wodjRsMl9vZl9nZXRfcmVtb3RlX3BvcnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYyLWRtYS1jb250aWcuYyBiL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3ZpZGVvYnVmMi1kbWEtY29udGlnLmMKaW5kZXggMzNkMzg3MWQuLjg4MGJlMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3ZpZGVvYnVmMi1kbWEtY29udGlnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYyLWRtYS1jb250aWcuYwpAQCAtNzE5LDcgKzcxOSw3IEBACiAKIAkvKiBnZXQgdGhlIGFzc29jaWF0ZWQgc2NhdHRlcmxpc3QgZm9yIHRoaXMgYnVmZmVyICovCiAJc2d0ID0gZG1hX2J1Zl9tYXBfYXR0YWNobWVudChidWYtPmRiX2F0dGFjaCwgYnVmLT5kbWFfZGlyKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoc2d0KSkgeworCWlmIChJU19FUlIoc2d0KSkgewogCQlwcl9lcnIoIkVycm9yIGdldHRpbmcgZG1hYnVmIHNjYXR0ZXJsaXN0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZW1vcnkvS2NvbmZpZyBiL2RyaXZlcnMvbWVtb3J5L0tjb25maWcKaW5kZXggMjlhMTFkYi4uYzU5ZTljOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZW1vcnkvS2NvbmZpZworKysgYi9kcml2ZXJzL21lbW9yeS9LY29uZmlnCkBAIC03LDYgKzcsMTcgQEAKIAogaWYgTUVNT1JZCiAKK2NvbmZpZyBUSV9BRU1JRgorCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBBRU1JRiBkcml2ZXIiCisJZGVwZW5kcyBvbiAoQVJDSF9EQVZJTkNJIHx8IEFSQ0hfS0VZU1RPTkUpICYmIE9GCisJaGVscAorCSAgVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBBRU1JRiBtb2R1bGUgYXZhaWxhYmxlIGluIFRleGFzIEluc3RydW1lbnRzCisJICBTb0NzLiBBRU1JRiBzdGFuZHMgZm9yIEFzeW5jaHJvbm91cyBFeHRlcm5hbCBNZW1vcnkgSW50ZXJmYWNlIGFuZAorCSAgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBhIGdsdWUtbGVzcyBpbnRlcmZhY2UgdG8gYSB2YXJpZXR5IG9mCisJICBhc3luY2hyb251b3VzIG1lbW9yeSBkZXZpY2VzIGxpa2UgQVNSQU0sIE5PUiBhbmQgTkFORCBtZW1vcnkuIEEgdG90YWwKKwkgIG9mIDI1Nk0gYnl0ZXMgb2YgYW55IG9mIHRoZXNlIG1lbW9yaWVzIGNhbiBiZSBhY2Nlc3NlZCBhdCBhIGdpdmVuCisJICB0aW1lIHZpYSBmb3VyIGNoaXAgc2VsZWN0cyB3aXRoIDY0TSBieXRlIGFjY2VzcyBwZXIgY2hpcCBzZWxlY3QuCisKIGNvbmZpZyBUSV9FTUlGCiAJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIEVNSUYgZHJpdmVyIgogCWRlcGVuZHMgb24gQVJDSF9PTUFQMlBMVVMKQEAgLTUwLDQgKzYxLDggQEAKIAkgIGFuYWx5c2lzLCBlc3BlY2lhbGx5IGZvciBJT01NVS9TTU1VKFN5c3RlbSBNZW1vcnkgTWFuYWdlbWVudAogCSAgVW5pdCkgbW9kdWxlLgogCitjb25maWcgRlNMX0lGQworCWJvb2wKKwlkZXBlbmRzIG9uIEZTTF9TT0MKKwogZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtb3J5L01ha2VmaWxlIGIvZHJpdmVycy9tZW1vcnkvTWFrZWZpbGUKaW5kZXggOTY5ZDkyMy4uNzExNjBhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZW1vcnkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZW1vcnkvTWFrZWZpbGUKQEAgLTUsNyArNSw5IEBACiBpZmVxICgkKENPTkZJR19ERFIpLHkpCiBvYmotJChDT05GSUdfT0YpCQkrPSBvZl9tZW1vcnkubwogZW5kaWYKK29iai0kKENPTkZJR19USV9BRU1JRikJCSs9IHRpLWFlbWlmLm8KIG9iai0kKENPTkZJR19USV9FTUlGKQkJKz0gZW1pZi5vCitvYmotJChDT05GSUdfRlNMX0lGQykJCSs9IGZzbF9pZmMubwogb2JqLSQoQ09ORklHX01WRUJVX0RFVkJVUykJKz0gbXZlYnUtZGV2YnVzLm8KIG9iai0kKENPTkZJR19URUdSQTIwX01DKQkrPSB0ZWdyYTIwLW1jLm8KIG9iai0kKENPTkZJR19URUdSQTMwX01DKQkrPSB0ZWdyYTMwLW1jLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2lmYy5jIGIvZHJpdmVycy9tZW1vcnkvZnNsX2lmYy5jCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGFyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2lmYy5jCnJlbmFtZSB0byBkcml2ZXJzL21lbW9yeS9mc2xfaWZjLmMKaW5kZXggZmJjODg1Yi4uM2Q1ZDc5MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfaWZjLmMKKysrIGIvZHJpdmVycy9tZW1vcnkvZnNsX2lmYy5jCkBAIC0yOSw4ICsyOSw4IEBACiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mc2xfaWZjLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vZnNsX2lmYy5oPgogCiBzdHJ1Y3QgZnNsX2lmY19jdHJsICpmc2xfaWZjX2N0cmxfZGV2OwogRVhQT1JUX1NZTUJPTChmc2xfaWZjX2N0cmxfZGV2KTsKQEAgLTI5OCw3ICsyOTgsMTEgQEAKIAkucmVtb3ZlICAgICAgPSBmc2xfaWZjX2N0cmxfcmVtb3ZlLAogfTsKIAotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihmc2xfaWZjX2N0cmxfZHJpdmVyKTsKK3N0YXRpYyBpbnQgX19pbml0IGZzbF9pZmNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmZzbF9pZmNfY3RybF9kcml2ZXIpOworfQorc3Vic3lzX2luaXRjYWxsKGZzbF9pZmNfaW5pdCk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIkZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbW9yeS90aS1hZW1pZi5jIGIvZHJpdmVycy9tZW1vcnkvdGktYWVtaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2RmNzYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZW1vcnkvdGktYWVtaWYuYwpAQCAtMCwwICsxLDQyNyBAQAorLyoKKyAqIFRJIEFFTUlGIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCAtIDIwMTMgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkLiBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBBdXRob3JzOgorICogTXVyYWxpIEthcmljaGVyaSA8bS1rYXJpY2hlcmkyQHRpLmNvbT4KKyAqIEl2YW4gS2hvcm9uemh1ayA8aXZhbi5raG9yb256aHVrQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2RlZmluZSBUQV9TSElGVAkyCisjZGVmaW5lIFJIT0xEX1NISUZUCTQKKyNkZWZpbmUgUlNUUk9CRV9TSElGVAk3CisjZGVmaW5lIFJTRVRVUF9TSElGVAkxMworI2RlZmluZSBXSE9MRF9TSElGVAkxNworI2RlZmluZSBXU1RST0JFX1NISUZUCTIwCisjZGVmaW5lIFdTRVRVUF9TSElGVAkyNgorI2RlZmluZSBFV19TSElGVAkzMAorI2RlZmluZSBTU19TSElGVAkzMQorCisjZGVmaW5lIFRBKHgpCQkoKHgpIDw8IFRBX1NISUZUKQorI2RlZmluZSBSSE9MRCh4KQkoKHgpIDw8IFJIT0xEX1NISUZUKQorI2RlZmluZSBSU1RST0JFKHgpCSgoeCkgPDwgUlNUUk9CRV9TSElGVCkKKyNkZWZpbmUgUlNFVFVQKHgpCSgoeCkgPDwgUlNFVFVQX1NISUZUKQorI2RlZmluZSBXSE9MRCh4KQkoKHgpIDw8IFdIT0xEX1NISUZUKQorI2RlZmluZSBXU1RST0JFKHgpCSgoeCkgPDwgV1NUUk9CRV9TSElGVCkKKyNkZWZpbmUgV1NFVFVQKHgpCSgoeCkgPDwgV1NFVFVQX1NISUZUKQorI2RlZmluZSBFVyh4KQkJKCh4KSA8PCBFV19TSElGVCkKKyNkZWZpbmUgU1MoeCkJCSgoeCkgPDwgU1NfU0hJRlQpCisKKyNkZWZpbmUgQVNJWkVfTUFYCTB4MQorI2RlZmluZSBUQV9NQVgJCTB4MworI2RlZmluZSBSSE9MRF9NQVgJMHg3CisjZGVmaW5lIFJTVFJPQkVfTUFYCTB4M2YKKyNkZWZpbmUgUlNFVFVQX01BWAkweGYKKyNkZWZpbmUgV0hPTERfTUFYCTB4NworI2RlZmluZSBXU1RST0JFX01BWAkweDNmCisjZGVmaW5lIFdTRVRVUF9NQVgJMHhmCisjZGVmaW5lIEVXX01BWAkJMHgxCisjZGVmaW5lIFNTX01BWAkJMHgxCisjZGVmaW5lIE5VTV9DUwkJNAorCisjZGVmaW5lIFRBX1ZBTCh4KQkoKCh4KSAmIFRBKFRBX01BWCkpID4+IFRBX1NISUZUKQorI2RlZmluZSBSSE9MRF9WQUwoeCkJKCgoeCkgJiBSSE9MRChSSE9MRF9NQVgpKSA+PiBSSE9MRF9TSElGVCkKKyNkZWZpbmUgUlNUUk9CRV9WQUwoeCkJKCgoeCkgJiBSU1RST0JFKFJTVFJPQkVfTUFYKSkgPj4gUlNUUk9CRV9TSElGVCkKKyNkZWZpbmUgUlNFVFVQX1ZBTCh4KQkoKCh4KSAmIFJTRVRVUChSU0VUVVBfTUFYKSkgPj4gUlNFVFVQX1NISUZUKQorI2RlZmluZSBXSE9MRF9WQUwoeCkJKCgoeCkgJiBXSE9MRChXSE9MRF9NQVgpKSA+PiBXSE9MRF9TSElGVCkKKyNkZWZpbmUgV1NUUk9CRV9WQUwoeCkJKCgoeCkgJiBXU1RST0JFKFdTVFJPQkVfTUFYKSkgPj4gV1NUUk9CRV9TSElGVCkKKyNkZWZpbmUgV1NFVFVQX1ZBTCh4KQkoKCh4KSAmIFdTRVRVUChXU0VUVVBfTUFYKSkgPj4gV1NFVFVQX1NISUZUKQorI2RlZmluZSBFV19WQUwoeCkJKCgoeCkgJiBFVyhFV19NQVgpKSA+PiBFV19TSElGVCkKKyNkZWZpbmUgU1NfVkFMKHgpCSgoKHgpICYgU1MoU1NfTUFYKSkgPj4gU1NfU0hJRlQpCisKKyNkZWZpbmUgTlJDU1JfT0ZGU0VUCTB4MDAKKyNkZWZpbmUgQVdDQ1JfT0ZGU0VUCTB4MDQKKyNkZWZpbmUgQTFDUl9PRkZTRVQJMHgxMAorCisjZGVmaW5lIEFDUl9BU0laRV9NQVNLCTB4MworI2RlZmluZSBBQ1JfRVdfTUFTSwlCSVQoMzApCisjZGVmaW5lIEFDUl9TU19NQVNLCUJJVCgzMSkKKyNkZWZpbmUgQVNJWkVfMTZCSVQJMQorCisjZGVmaW5lIENPTkZJR19NQVNLCShUQShUQV9NQVgpIHwgXAorCQkJCVJIT0xEKFJIT0xEX01BWCkgfCBcCisJCQkJUlNUUk9CRShSU1RST0JFX01BWCkgfAlcCisJCQkJUlNFVFVQKFJTRVRVUF9NQVgpIHwgXAorCQkJCVdIT0xEKFdIT0xEX01BWCkgfCBcCisJCQkJV1NUUk9CRShXU1RST0JFX01BWCkgfCBcCisJCQkJV1NFVFVQKFdTRVRVUF9NQVgpIHwgXAorCQkJCUVXKEVXX01BWCkgfCBTUyhTU19NQVgpIHwgXAorCQkJCUFTSVpFX01BWCkKKworLyoqCisgKiBzdHJ1Y3QgYWVtaWZfY3NfZGF0YTogc3RydWN0dXJlIHRvIGhvbGQgY3MgcGFyYW1ldGVycworICogQGNzOiBjaGlwLXNlbGVjdCBudW1iZXIKKyAqIEB3c3Ryb2JlOiB3cml0ZSBzdHJvYmUgd2lkdGgsIG5zCisgKiBAcnN0cm9iZTogcmVhZCBzdHJvYmUgd2lkdGgsIG5zCisgKiBAd3NldHVwOiB3cml0ZSBzZXR1cCB3aWR0aCwgbnMKKyAqIEB3aG9sZDogd3JpdGUgaG9sZCB3aWR0aCwgbnMKKyAqIEByc2V0dXA6IHJlYWQgc2V0dXAgd2lkdGgsIG5zCisgKiBAcmhvbGQ6IHJlYWQgaG9sZCB3aWR0aCwgbnMKKyAqIEB0YTogbWluaW11bSB0dXJuIGFyb3VuZCB0aW1lLCBucworICogQGVuYWJsZV9zczogZW5hYmxlL2Rpc2FibGUgc2VsZWN0IHN0cm9iZSBtb2RlCisgKiBAZW5hYmxlX2V3OiBlbmFibGUvZGlzYWJsZSBleHRlbmRlZCB3YWl0IG1vZGUKKyAqIEBhc2l6ZTogd2lkdGggb2YgdGhlIGFzeW5jaHJvbm91cyBkZXZpY2UncyBkYXRhIGJ1cworICovCitzdHJ1Y3QgYWVtaWZfY3NfZGF0YSB7CisJdTgJY3M7CisJdTE2CXdzdHJvYmU7CisJdTE2CXJzdHJvYmU7CisJdTgJd3NldHVwOworCXU4CXdob2xkOworCXU4CXJzZXR1cDsKKwl1OAlyaG9sZDsKKwl1OAl0YTsKKwl1OAllbmFibGVfc3M7CisJdTgJZW5hYmxlX2V3OworCXU4CWFzaXplOworfTsKKworLyoqCisgKiBzdHJ1Y3QgYWVtaWZfZGV2aWNlOiBzdHJ1Y3R1cmUgdG8gaG9sZCBkZXZpY2UgZGF0YQorICogQGJhc2U6IGJhc2UgYWRkcmVzcyBvZiBBRU1JRiByZWdpc3RlcnMKKyAqIEBjbGs6IHNvdXJjZSBjbG9jaworICogQGNsa19yYXRlOiBjbG9jaydzIHJhdGUgaW4ga0h6CisgKiBAbnVtX2NzOiBudW1iZXIgb2YgYXNzaWduZWQgY2hpcC1zZWxlY3RzCisgKiBAY3Nfb2Zmc2V0OiBzdGFydCBudW1iZXIgb2YgY3Mgbm9kZXMKKyAqIEBjc19kYXRhOiBhcnJheSBvZiBjaGlwLXNlbGVjdCBzZXR0aW5ncworICovCitzdHJ1Y3QgYWVtaWZfZGV2aWNlIHsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IGNsayAqY2xrOworCXVuc2lnbmVkIGxvbmcgY2xrX3JhdGU7CisJdTggbnVtX2NzOworCWludCBjc19vZmZzZXQ7CisJc3RydWN0IGFlbWlmX2NzX2RhdGEgY3NfZGF0YVtOVU1fQ1NdOworfTsKKworLyoqCisgKiBhZW1pZl9jYWxjX3JhdGUgLSBjYWxjdWxhdGUgdGltaW5nIGRhdGEuCisgKiBAcGRldjogcGxhdGZvcm0gZGV2aWNlIHRvIGNhbGN1bGF0ZSBmb3IKKyAqIEB3YW50ZWQ6IFRoZSBjeWNsZSB0aW1lIG5lZWRlZCBpbiBuYW5vc2Vjb25kcy4KKyAqIEBjbGs6IFRoZSBpbnB1dCBjbG9jayByYXRlIGluIGtIei4KKyAqIEBtYXg6IFRoZSBtYXhpbXVtIGRpdmlkZXIgdmFsdWUgdGhhdCBjYW4gYmUgcHJvZ3JhbW1lZC4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm5zIHRoZSBjYWxjdWxhdGVkIHRpbWluZyB2YWx1ZSBtaW51cyAxIGZvciBlYXN5CisgKiBwcm9ncmFtbWluZyBpbnRvIEFFTUlGIHRpbWluZyByZWdpc3RlcnMsIGVsc2UgbmVnYXRpdmUgZXJybm8uCisgKi8KK3N0YXRpYyBpbnQgYWVtaWZfY2FsY19yYXRlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCB3YW50ZWQsCisJCQkgICB1bnNpZ25lZCBsb25nIGNsaywgaW50IG1heCkKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gRElWX1JPVU5EX1VQKCh3YW50ZWQgKiBjbGspLCBOU0VDX1BFUl9NU0VDKSAtIDE7CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogcmVzdWx0ICVkIGZyb20gJWxkLCAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCwKKwkJY2xrLCB3YW50ZWQpOworCisJLyogSXQgaXMgZ2VuZXJhbGx5IE9LIHRvIGhhdmUgYSBtb3JlIHJlbGF4ZWQgdGltaW5nIHRoYW4gcmVxdWVzdGVkLi4uICovCisJaWYgKHJlc3VsdCA8IDApCisJCXJlc3VsdCA9IDA7CisKKwkvKiAuLi4gQnV0IGNvbmZpZ3VyaW5nIHRpZ2h0ZXIgdGltaW5ncyBpcyBub3QgYW4gb3B0aW9uLiAqLworCWVsc2UgaWYgKHJlc3VsdCA+IG1heCkKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogYWVtaWZfY29uZmlnX2FidXMgLSBjb25maWd1cmUgYXN5bmMgYnVzIHBhcmFtZXRlcnMKKyAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UgdG8gY29uZmlndXJlIGZvcgorICogQGNzbnVtOiBhZW1pZiBjaGlwIHNlbGVjdCBudW1iZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2dyYW1zIHRoZSBnaXZlbiB0aW1pbmcgdmFsdWVzIChpbiByZWFsIGNsb2NrKSBpbnRvIHRoZQorICogQUVNSUYgcmVnaXN0ZXJzIHRha2luZyB0aGUgQUVNSUYgY2xvY2sgaW50byBhY2NvdW50LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdXNlIGFueSBsb2NraW5nIHdoaWxlIHByb2dyYW1taW5nIHRoZSBBRU1JRgorICogYmVjYXVzZSBpdCBpcyBleHBlY3RlZCB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIHVzZXIgb2YgYSBnaXZlbgorICogY2hpcC1zZWxlY3QuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVsc2UgbmVnYXRpdmUgZXJybm8uCisgKi8KK3N0YXRpYyBpbnQgYWVtaWZfY29uZmlnX2FidXMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IGNzbnVtKQoreworCXN0cnVjdCBhZW1pZl9kZXZpY2UgKmFlbWlmID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGFlbWlmX2NzX2RhdGEgKmRhdGEgPSAmYWVtaWYtPmNzX2RhdGFbY3NudW1dOworCWludCB0YSwgcmhvbGQsIHJzdHJvYmUsIHJzZXR1cCwgd2hvbGQsIHdzdHJvYmUsIHdzZXR1cDsKKwl1bnNpZ25lZCBsb25nIGNsa19yYXRlID0gYWVtaWYtPmNsa19yYXRlOworCXVuc2lnbmVkIG9mZnNldDsKKwl1MzIgc2V0LCB2YWw7CisKKwlvZmZzZXQgPSBBMUNSX09GRlNFVCArIChkYXRhLT5jcyAtIGFlbWlmLT5jc19vZmZzZXQpICogNDsKKworCXRhCT0gYWVtaWZfY2FsY19yYXRlKHBkZXYsIGRhdGEtPnRhLCBjbGtfcmF0ZSwgVEFfTUFYKTsKKwlyaG9sZAk9IGFlbWlmX2NhbGNfcmF0ZShwZGV2LCBkYXRhLT5yaG9sZCwgY2xrX3JhdGUsIFJIT0xEX01BWCk7CisJcnN0cm9iZQk9IGFlbWlmX2NhbGNfcmF0ZShwZGV2LCBkYXRhLT5yc3Ryb2JlLCBjbGtfcmF0ZSwgUlNUUk9CRV9NQVgpOworCXJzZXR1cAk9IGFlbWlmX2NhbGNfcmF0ZShwZGV2LCBkYXRhLT5yc2V0dXAsIGNsa19yYXRlLCBSU0VUVVBfTUFYKTsKKwl3aG9sZAk9IGFlbWlmX2NhbGNfcmF0ZShwZGV2LCBkYXRhLT53aG9sZCwgY2xrX3JhdGUsIFdIT0xEX01BWCk7CisJd3N0cm9iZQk9IGFlbWlmX2NhbGNfcmF0ZShwZGV2LCBkYXRhLT53c3Ryb2JlLCBjbGtfcmF0ZSwgV1NUUk9CRV9NQVgpOworCXdzZXR1cAk9IGFlbWlmX2NhbGNfcmF0ZShwZGV2LCBkYXRhLT53c2V0dXAsIGNsa19yYXRlLCBXU0VUVVBfTUFYKTsKKworCWlmICh0YSA8IDAgfHwgcmhvbGQgPCAwIHx8IHJzdHJvYmUgPCAwIHx8IHJzZXR1cCA8IDAgfHwKKwkgICAgd2hvbGQgPCAwIHx8IHdzdHJvYmUgPCAwIHx8IHdzZXR1cCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGNhbm5vdCBnZXQgc3VpdGFibGUgdGltaW5nc1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2V0ID0gVEEodGEpIHwgUkhPTEQocmhvbGQpIHwgUlNUUk9CRShyc3Ryb2JlKSB8IFJTRVRVUChyc2V0dXApIHwKKwkJV0hPTEQod2hvbGQpIHwgV1NUUk9CRSh3c3Ryb2JlKSB8IFdTRVRVUCh3c2V0dXApOworCisJc2V0IHw9IChkYXRhLT5hc2l6ZSAmIEFDUl9BU0laRV9NQVNLKTsKKwlpZiAoZGF0YS0+ZW5hYmxlX2V3KQorCQlzZXQgfD0gQUNSX0VXX01BU0s7CisJaWYgKGRhdGEtPmVuYWJsZV9zcykKKwkJc2V0IHw9IEFDUl9TU19NQVNLOworCisJdmFsID0gcmVhZGwoYWVtaWYtPmJhc2UgKyBvZmZzZXQpOworCXZhbCAmPSB+Q09ORklHX01BU0s7CisJdmFsIHw9IHNldDsKKwl3cml0ZWwodmFsLCBhZW1pZi0+YmFzZSArIG9mZnNldCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYWVtaWZfY3ljbGVzX3RvX25zZWMoaW50IHZhbCwgdW5zaWduZWQgbG9uZyBjbGtfcmF0ZSkKK3sKKwlyZXR1cm4gKCh2YWwgKyAxKSAqIE5TRUNfUEVSX01TRUMpIC8gY2xrX3JhdGU7Cit9CisKKy8qKgorICogYWVtaWZfZ2V0X2h3X3BhcmFtcyAtIGZ1bmN0aW9uIHRvIHJlYWQgaHcgcmVnaXN0ZXIgdmFsdWVzCisgKiBAcGRldjogcGxhdGZvcm0gZGV2aWNlIHRvIHJlYWQgZm9yCisgKiBAY3NudW06IGFlbWlmIGNoaXAgc2VsZWN0IG51bWJlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGRlZmF1bHRzIGZyb20gdGhlIHJlZ2lzdGVycyBhbmQgdXBkYXRlCisgKiB0aGUgdGltaW5nIHZhbHVlcy4gUmVxdWlyZWQgZm9yIGdldC9zZXQgY29tbWFuZHMgYW5kIGFsc28gZm9yCisgKiB0aGUgY2FzZSB3aGVuIGRyaXZlciBuZWVkcyB0byB1c2UgZGVmYXVsdHMgaW4gaGFyZHdhcmUuCisgKi8KK3N0YXRpYyB2b2lkIGFlbWlmX2dldF9od19wYXJhbXMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IGNzbnVtKQoreworCXN0cnVjdCBhZW1pZl9kZXZpY2UgKmFlbWlmID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGFlbWlmX2NzX2RhdGEgKmRhdGEgPSAmYWVtaWYtPmNzX2RhdGFbY3NudW1dOworCXVuc2lnbmVkIGxvbmcgY2xrX3JhdGUgPSBhZW1pZi0+Y2xrX3JhdGU7CisJdTMyIHZhbCwgb2Zmc2V0OworCisJb2Zmc2V0ID0gQTFDUl9PRkZTRVQgKyAoZGF0YS0+Y3MgLSBhZW1pZi0+Y3Nfb2Zmc2V0KSAqIDQ7CisJdmFsID0gcmVhZGwoYWVtaWYtPmJhc2UgKyBvZmZzZXQpOworCisJZGF0YS0+dGEgPSBhZW1pZl9jeWNsZXNfdG9fbnNlYyhUQV9WQUwodmFsKSwgY2xrX3JhdGUpOworCWRhdGEtPnJob2xkID0gYWVtaWZfY3ljbGVzX3RvX25zZWMoUkhPTERfVkFMKHZhbCksIGNsa19yYXRlKTsKKwlkYXRhLT5yc3Ryb2JlID0gYWVtaWZfY3ljbGVzX3RvX25zZWMoUlNUUk9CRV9WQUwodmFsKSwgY2xrX3JhdGUpOworCWRhdGEtPnJzZXR1cCA9IGFlbWlmX2N5Y2xlc190b19uc2VjKFJTRVRVUF9WQUwodmFsKSwgY2xrX3JhdGUpOworCWRhdGEtPndob2xkID0gYWVtaWZfY3ljbGVzX3RvX25zZWMoV0hPTERfVkFMKHZhbCksIGNsa19yYXRlKTsKKwlkYXRhLT53c3Ryb2JlID0gYWVtaWZfY3ljbGVzX3RvX25zZWMoV1NUUk9CRV9WQUwodmFsKSwgY2xrX3JhdGUpOworCWRhdGEtPndzZXR1cCA9IGFlbWlmX2N5Y2xlc190b19uc2VjKFdTRVRVUF9WQUwodmFsKSwgY2xrX3JhdGUpOworCWRhdGEtPmVuYWJsZV9ldyA9IEVXX1ZBTCh2YWwpOworCWRhdGEtPmVuYWJsZV9zcyA9IFNTX1ZBTCh2YWwpOworCWRhdGEtPmFzaXplID0gdmFsICYgQVNJWkVfTUFYOworfQorCisvKioKKyAqIG9mX2FlbWlmX3BhcnNlX2FidXNfY29uZmlnIC0gcGFyc2UgQ1MgY29uZmlndXJhdGlvbiBmcm9tIERUCisgKiBAcGRldjogcGxhdGZvcm0gZGV2aWNlIHRvIHBhcnNlIGZvcgorICogQG5wOiBkZXZpY2Ugbm9kZSBwdHIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZSB0aGUgZW1pZiBhc3luYyBidXMgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgdmFsdWVzCisgKiBjb25maWd1cmVkIGluIGEgY3MgZGV2aWNlIGJpbmRpbmcgbm9kZS4KKyAqLworc3RhdGljIGludCBvZl9hZW1pZl9wYXJzZV9hYnVzX2NvbmZpZyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IGFlbWlmX2RldmljZSAqYWVtaWYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYWVtaWZfY3NfZGF0YSAqZGF0YTsKKwl1MzIgY3M7CisJdTMyIHZhbDsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInRpLGNzLWNoaXBzZWxlY3QiLCAmY3MpKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNzIHByb3BlcnR5IGlzIHJlcXVpcmVkIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjcyAtIGFlbWlmLT5jc19vZmZzZXQgPj0gTlVNX0NTIHx8IGNzIDwgYWVtaWYtPmNzX29mZnNldCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjcyBudW1iZXIgaXMgaW5jb3JyZWN0ICVkIiwgY3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYWVtaWYtPm51bV9jcyA+PSBOVU1fQ1MpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY3MgY291bnQgaXMgbW9yZSB0aGFuICVkIiwgTlVNX0NTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YSA9ICZhZW1pZi0+Y3NfZGF0YVthZW1pZi0+bnVtX2NzXTsKKwlkYXRhLT5jcyA9IGNzOworCisJLyogcmVhZCB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgaHcgcmVnaXN0ZXIgKi8KKwlhZW1pZl9nZXRfaHdfcGFyYW1zKHBkZXYsIGFlbWlmLT5udW1fY3MrKyk7CisKKwkvKiBvdmVycmlkZSB0aGUgdmFsdWVzIGZyb20gZGV2aWNlIG5vZGUgKi8KKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksY3MtbWluLXR1cm5hcm91bmQtbnMiLCAmdmFsKSkKKwkJZGF0YS0+dGEgPSB2YWw7CisKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksY3MtcmVhZC1ob2xkLW5zIiwgJnZhbCkpCisJCWRhdGEtPnJob2xkID0gdmFsOworCisJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInRpLGNzLXJlYWQtc3Ryb2JlLW5zIiwgJnZhbCkpCisJCWRhdGEtPnJzdHJvYmUgPSB2YWw7CisKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksY3MtcmVhZC1zZXR1cC1ucyIsICZ2YWwpKQorCQlkYXRhLT5yc2V0dXAgPSB2YWw7CisKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksY3Mtd3JpdGUtaG9sZC1ucyIsICZ2YWwpKQorCQlkYXRhLT53aG9sZCA9IHZhbDsKKworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJ0aSxjcy13cml0ZS1zdHJvYmUtbnMiLCAmdmFsKSkKKwkJZGF0YS0+d3N0cm9iZSA9IHZhbDsKKworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJ0aSxjcy13cml0ZS1zZXR1cC1ucyIsICZ2YWwpKQorCQlkYXRhLT53c2V0dXAgPSB2YWw7CisKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksY3MtYnVzLXdpZHRoIiwgJnZhbCkpCisJCWlmICh2YWwgPT0gMTYpCisJCQlkYXRhLT5hc2l6ZSA9IDE7CisJZGF0YS0+ZW5hYmxlX2V3ID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAidGksY3MtZXh0ZW5kZWQtd2FpdC1tb2RlIik7CisJZGF0YS0+ZW5hYmxlX3NzID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAidGksY3Mtc2VsZWN0LXN0cm9iZS1tb2RlIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFlbWlmX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ0aSxkYXZpbmNpLWFlbWlmIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLGRhODUwLWFlbWlmIiwgfSwKKwl7fSwKK307CisKK3N0YXRpYyBpbnQgYWVtaWZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgaTsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZF9ucDsKKwlzdHJ1Y3QgYWVtaWZfZGV2aWNlICphZW1pZjsKKworCWlmIChucCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWFlbWlmID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCphZW1pZiksIEdGUF9LRVJORUwpOworCWlmICghYWVtaWYpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYWVtaWYpOworCisJYWVtaWYtPmNsayA9IGRldm1fY2xrX2dldChkZXYsIE5VTEwpOworCWlmIChJU19FUlIoYWVtaWYtPmNsaykpIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgZ2V0IGNsb2NrICdhZW1pZidcbiIpOworCQlyZXR1cm4gUFRSX0VSUihhZW1pZi0+Y2xrKTsKKwl9CisKKwljbGtfcHJlcGFyZV9lbmFibGUoYWVtaWYtPmNsayk7CisJYWVtaWYtPmNsa19yYXRlID0gY2xrX2dldF9yYXRlKGFlbWlmLT5jbGspIC8gTVNFQ19QRVJfU0VDOworCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAidGksZGE4NTAtYWVtaWYiKSkKKwkJYWVtaWYtPmNzX29mZnNldCA9IDI7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWFlbWlmLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGFlbWlmLT5iYXNlKSkgeworCQlyZXQgPSBQVFJfRVJSKGFlbWlmLT5iYXNlKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKgorCSAqIEZvciBldmVyeSBjb250cm9sbGVyIGRldmljZSBub2RlLCB0aGVyZSBpcyBhIGNzIGRldmljZSBub2RlIHRoYXQKKwkgKiBkZXNjcmliZSB0aGUgYnVzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4gVGhpcyBmdW5jdGlvbnMgaXRlcmF0ZQorCSAqIG92ZXIgdGhlc2Ugbm9kZXMgYW5kIHVwZGF0ZSB0aGUgY3MgZGF0YSBhcnJheS4KKwkgKi8KKwlmb3JfZWFjaF9hdmFpbGFibGVfY2hpbGRfb2Zfbm9kZShucCwgY2hpbGRfbnApIHsKKwkJcmV0ID0gb2ZfYWVtaWZfcGFyc2VfYWJ1c19jb25maWcocGRldiwgY2hpbGRfbnApOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGFlbWlmLT5udW1fY3M7IGkrKykgeworCQlyZXQgPSBhZW1pZl9jb25maWdfYWJ1cyhwZGV2LCBpKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiRXJyb3IgY29uZmlndXJpbmcgY2hpcCBzZWxlY3QgJWRcbiIsCisJCQkJYWVtaWYtPmNzX2RhdGFbaV0uY3MpOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCS8qCisJICogQ3JlYXRlIGEgY2hpbGQgZGV2aWNlcyBleHBsaWNpdGx5IGZyb20gaGVyZSB0bworCSAqIGd1YXJhbnRlZSB0aGF0IHRoZSBjaGlsZCB3aWxsIGJlIHByb2JlZCBhZnRlciB0aGUgQUVNSUYgdGltaW5nCisJICogcGFyYW1ldGVycyBhcmUgc2V0LgorCSAqLworCWZvcl9lYWNoX2F2YWlsYWJsZV9jaGlsZF9vZl9ub2RlKG5wLCBjaGlsZF9ucCkgeworCQlyZXQgPSBvZl9wbGF0Zm9ybV9wb3B1bGF0ZShjaGlsZF9ucCwgTlVMTCwgTlVMTCwgZGV2KTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yOworCX0KKworCXJldHVybiAwOworZXJyb3I6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFlbWlmLT5jbGspOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWVtaWZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFlbWlmX2RldmljZSAqYWVtaWYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShhZW1pZi0+Y2xrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWVtaWZfZHJpdmVyID0geworCS5wcm9iZSA9IGFlbWlmX3Byb2JlLAorCS5yZW1vdmUgPSBhZW1pZl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihhZW1pZl9vZl9tYXRjaCksCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYWVtaWZfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiTXVyYWxpIEthcmljaGVyaSA8bS1rYXJpY2hlcmkyQHRpLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkl2YW4gS2hvcm9uemh1ayA8aXZhbi5raG9yb256aHVrQHRpLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVGV4YXMgSW5zdHJ1bWVudHMgQUVNSUYgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgS0JVSUxEX01PRE5BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMKaW5kZXggYThjMDhmMy4uOTI3NTJmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jCkBAIC02NTIsNiArNjUyLDQ0IEBACiAJcmV0dXJuIGkyb19ocnRfZ2V0KGMpOwogfTsKIAorc3RhdGljIHZvaWQgaTJvX3Jlc19hbGxvYyhzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJaTJvX3N0YXR1c19ibG9jayAqc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZjLT5tZW1fcmVzb3VyY2U7CisJcmVzb3VyY2Vfc2l6ZV90IHNpemUsIGFsaWduOworCWludCBlcnI7CisKKwlyZXMtPm5hbWUgPSBjLT5wZGV2LT5idXMtPm5hbWU7CisJcmVzLT5mbGFncyA9IGZsYWdzOworCXJlcy0+c3RhcnQgPSAwOworCXJlcy0+ZW5kID0gMDsKKwlvc21faW5mbygiJXM6IHJlcXVpcmVzIHByaXZhdGUgbWVtb3J5IHJlc291cmNlcy5cbiIsIGMtPm5hbWUpOworCisJaWYgKGZsYWdzICYgSU9SRVNPVVJDRV9NRU0pIHsKKwkJc2l6ZSA9IHNiLT5kZXNpcmVkX21lbV9zaXplOworCQlhbGlnbiA9IDEgPDwgMjA7CS8qIHVuc3BlY2lmaWVkLCB1c2UgMU1iIGFuZCBwbGF5IHNhZmUgKi8KKwl9IGVsc2UgeworCQlzaXplID0gc2ItPmRlc2lyZWRfaW9fc2l6ZTsKKwkJYWxpZ24gPSAxIDw8IDEyOwkvKiB1bnNwZWNpZmllZCwgdXNlIDRLYiBhbmQgcGxheSBzYWZlICovCisJfQorCisJZXJyID0gcGNpX2J1c19hbGxvY19yZXNvdXJjZShjLT5wZGV2LT5idXMsIHJlcywgc2l6ZSwgYWxpZ24sIDAsIDAsCisJCQkJICAgICBOVUxMLCBOVUxMKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuOworCisJaWYgKGZsYWdzICYgSU9SRVNPVVJDRV9NRU0pIHsKKwkJYy0+bWVtX2FsbG9jID0gMTsKKwkJc2ItPmN1cnJlbnRfbWVtX3NpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CisJCXNiLT5jdXJyZW50X21lbV9iYXNlID0gcmVzLT5zdGFydDsKKwl9IGVsc2UgaWYgKGZsYWdzICYgSU9SRVNPVVJDRV9JTykgeworCQljLT5pb19hbGxvYyA9IDE7CisJCXNiLT5jdXJyZW50X2lvX3NpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CisJCXNiLT5jdXJyZW50X2lvX2Jhc2UgPSByZXMtPnN0YXJ0OworCX0KKwlvc21faW5mbygiJXM6IGFsbG9jYXRlZCBQQ0kgc3BhY2UgJXBSXG4iLCBjLT5uYW1lLCByZXMpOworfQorCiAvKioKICAqCWkyb19pb3Bfc3lzdGFiX3NldCAtIFNldCB0aGUgSTJPIFN5c3RlbSBUYWJsZSBvZiB0aGUgc3BlY2lmaWVkIElPUAogICoJQGM6IEkyTyBjb250cm9sbGVyIHRvIHdoaWNoIHRoZSBzeXN0ZW0gdGFibGUgc2hvdWxkIGJlIHNlbmQKQEAgLTY2NSw1MiArNzAzLDEzIEBACiAJc3RydWN0IGkyb19tZXNzYWdlICptc2c7CiAJaTJvX3N0YXR1c19ibG9jayAqc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYy0+cGRldi0+ZGV2OwotCXN0cnVjdCByZXNvdXJjZSAqcm9vdDsKIAlpbnQgcmM7CiAKLQlpZiAoc2ItPmN1cnJlbnRfbWVtX3NpemUgPCBzYi0+ZGVzaXJlZF9tZW1fc2l6ZSkgewotCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZjLT5tZW1fcmVzb3VyY2U7Ci0JCXJlcy0+bmFtZSA9IGMtPnBkZXYtPmJ1cy0+bmFtZTsKLQkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOwotCQlyZXMtPnN0YXJ0ID0gMDsKLQkJcmVzLT5lbmQgPSAwOwotCQlvc21faW5mbygiJXM6IHJlcXVpcmVzIHByaXZhdGUgbWVtb3J5IHJlc291cmNlcy5cbiIsIGMtPm5hbWUpOwotCQlyb290ID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGMtPnBkZXYsIHJlcyk7Ci0JCWlmIChyb290ID09IE5VTEwpCi0JCQlvc21fd2FybigiJXM6IENhbid0IGZpbmQgcGFyZW50IHJlc291cmNlIVxuIiwgYy0+bmFtZSk7Ci0JCWlmIChyb290ICYmIGFsbG9jYXRlX3Jlc291cmNlKHJvb3QsIHJlcywgc2ItPmRlc2lyZWRfbWVtX3NpemUsIHNiLT5kZXNpcmVkX21lbV9zaXplLCBzYi0+ZGVzaXJlZF9tZW1fc2l6ZSwgMSA8PCAyMCwJLyogVW5zcGVjaWZpZWQsIHNvIHVzZSAxTWIgYW5kIHBsYXkgc2FmZSAqLwotCQkJCQkgICAgICBOVUxMLCBOVUxMKSA+PSAwKSB7Ci0JCQljLT5tZW1fYWxsb2MgPSAxOwotCQkJc2ItPmN1cnJlbnRfbWVtX3NpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7Ci0JCQlzYi0+Y3VycmVudF9tZW1fYmFzZSA9IHJlcy0+c3RhcnQ7Ci0JCQlvc21faW5mbygiJXM6IGFsbG9jYXRlZCAlbGx1IGJ5dGVzIG9mIFBDSSBtZW1vcnkgYXQgIgotCQkJCSIweCUwMTZsbFguXG4iLCBjLT5uYW1lLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmVzb3VyY2Vfc2l6ZShyZXMpLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5zdGFydCk7Ci0JCX0KLQl9CisJaWYgKHNiLT5jdXJyZW50X21lbV9zaXplIDwgc2ItPmRlc2lyZWRfbWVtX3NpemUpCisJCWkyb19yZXNfYWxsb2MoYywgSU9SRVNPVVJDRV9NRU0pOwogCi0JaWYgKHNiLT5jdXJyZW50X2lvX3NpemUgPCBzYi0+ZGVzaXJlZF9pb19zaXplKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmMtPmlvX3Jlc291cmNlOwotCQlyZXMtPm5hbWUgPSBjLT5wZGV2LT5idXMtPm5hbWU7Ci0JCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX0lPOwotCQlyZXMtPnN0YXJ0ID0gMDsKLQkJcmVzLT5lbmQgPSAwOwotCQlvc21faW5mbygiJXM6IHJlcXVpcmVzIHByaXZhdGUgbWVtb3J5IHJlc291cmNlcy5cbiIsIGMtPm5hbWUpOwotCQlyb290ID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGMtPnBkZXYsIHJlcyk7Ci0JCWlmIChyb290ID09IE5VTEwpCi0JCQlvc21fd2FybigiJXM6IENhbid0IGZpbmQgcGFyZW50IHJlc291cmNlIVxuIiwgYy0+bmFtZSk7Ci0JCWlmIChyb290ICYmIGFsbG9jYXRlX3Jlc291cmNlKHJvb3QsIHJlcywgc2ItPmRlc2lyZWRfaW9fc2l6ZSwgc2ItPmRlc2lyZWRfaW9fc2l6ZSwgc2ItPmRlc2lyZWRfaW9fc2l6ZSwgMSA8PCAyMCwJLyogVW5zcGVjaWZpZWQsIHNvIHVzZSAxTWIgYW5kIHBsYXkgc2FmZSAqLwotCQkJCQkgICAgICBOVUxMLCBOVUxMKSA+PSAwKSB7Ci0JCQljLT5pb19hbGxvYyA9IDE7Ci0JCQlzYi0+Y3VycmVudF9pb19zaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwotCQkJc2ItPmN1cnJlbnRfbWVtX2Jhc2UgPSByZXMtPnN0YXJ0OwotCQkJb3NtX2luZm8oIiVzOiBhbGxvY2F0ZWQgJWxsdSBieXRlcyBvZiBQQ0kgSS9PIGF0ICIKLQkJCQkiMHglMDE2bGxYLlxuIiwgYy0+bmFtZSwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlc291cmNlX3NpemUocmVzKSwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+c3RhcnQpOwotCQl9Ci0JfQorCWlmIChzYi0+Y3VycmVudF9pb19zaXplIDwgc2ItPmRlc2lyZWRfaW9fc2l6ZSkKKwkJaTJvX3Jlc19hbGxvYyhjLCBJT1JFU09VUkNFX0lPKTsKIAogCW1zZyA9IGkyb19tc2dfZ2V0X3dhaXQoYywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOwogCWlmIChJU19FUlIobXNnKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FyaXpvbmEtY29yZS5jIGIvZHJpdmVycy9tZmQvYXJpem9uYS1jb3JlLmMKaW5kZXggYTQ1YWFiOS4uMWMzYWU1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvYXJpem9uYS1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvYXJpem9uYS1jb3JlLmMKQEAgLTI1MSw4ICsyNTEsNiBAQAogCXVuc2lnbmVkIGludCBmbGwsIHN5c2NsazsKIAlpbnQgcmV0LCBlcnI7CiAKLQlyZWdjYWNoZV9jYWNoZV9ieXBhc3MoYXJpem9uYS0+cmVnbWFwLCB0cnVlKTsKLQogCS8qIENhY2hlIGV4aXN0aW5nIEZMTCBhbmQgU1lTQ0xLIHNldHRpbmdzICovCiAJcmV0ID0gcmVnbWFwX3JlYWQoYXJpem9uYS0+cmVnbWFwLCBBUklaT05BX0ZMTDFfQ09OVFJPTF8xLCAmZmxsKTsKIAlpZiAocmV0ICE9IDApIHsKQEAgLTMyMiw4ICszMjAsNiBAQAogCQkJZXJyKTsKIAl9CiAKLQlyZWdjYWNoZV9jYWNoZV9ieXBhc3MoYXJpem9uYS0+cmVnbWFwLCBmYWxzZSk7Ci0KIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvc2VjLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3NlYy1jb3JlLmMKaW5kZXggNzE0ZTIxMy4uMjgxYTgyNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3NlYy1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvc2VjLWNvcmUuYwpAQCAtMjYsNyArMjYsOSBAQAogI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvc2Ftc3VuZy9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvc2Ftc3VuZy9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc2Ftc3VuZy9zMm1wYTAxLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3NhbXN1bmcvczJtcHMxMS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL3MybXBzMTQuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvc2Ftc3VuZy9zNW04NzYzLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3NhbXN1bmcvczVtODc2Ny5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgpAQCAtNjksMTggKzcxLDUzIEBACiAJfQogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBtZmRfY2VsbCBzMm1wczE0X2RldnNbXSA9IHsKKwl7CisJCS5uYW1lID0gInMybXBzMTQtcG1pYyIsCisJfSwgeworCQkubmFtZSA9ICJzMm1wczE0LXJ0YyIsCisJfSwgeworCQkubmFtZSA9ICJzMm1wczE0LWNsayIsCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZmRfY2VsbCBzMm1wYTAxX2RldnNbXSA9IHsKKwl7CisJCS5uYW1lID0gInMybXBhMDEtcG1pYyIsCisJfSwKK307CisKICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNlY19kdF9tYXRjaFtdID0gewogCXsJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxzNW04NzY3LXBtaWMiLAogCQkuZGF0YSA9ICh2b2lkICopUzVNODc2N1gsCi0JfSwKLQl7CS5jb21wYXRpYmxlID0gInNhbXN1bmcsczJtcHMxMS1wbWljIiwKKwl9LCB7CisJCS5jb21wYXRpYmxlID0gInNhbXN1bmcsczJtcHMxMS1wbWljIiwKIAkJLmRhdGEgPSAodm9pZCAqKVMyTVBTMTFYLAorCX0sIHsKKwkJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxzMm1wczE0LXBtaWMiLAorCQkuZGF0YSA9ICh2b2lkICopUzJNUFMxNFgsCisJfSwgeworCQkuY29tcGF0aWJsZSA9ICJzYW1zdW5nLHMybXBhMDEtcG1pYyIsCisJCS5kYXRhID0gKHZvaWQgKilTMk1QQTAxLAorCX0sIHsKKwkJLyogU2VudGluZWwgKi8KIAl9LAotCXt9LAogfTsKICNlbmRpZgogCitzdGF0aWMgYm9vbCBzMm1wYTAxX3ZvbGF0aWxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUzJNUEEwMV9SRUdfSU5UMU06CisJY2FzZSBTMk1QQTAxX1JFR19JTlQyTToKKwljYXNlIFMyTVBBMDFfUkVHX0lOVDNNOgorCQlyZXR1cm4gZmFsc2U7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHRydWU7CisJfQorfQorCiBzdGF0aWMgYm9vbCBzMm1wczExX3ZvbGF0aWxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKIHsKIAlzd2l0Y2ggKHJlZykgewpAQCAtMTExLDYgKzE0OCwxNSBAQAogCS52YWxfYml0cyA9IDgsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgczJtcGEwMV9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKKworCS5tYXhfcmVnaXN0ZXIgPSBTMk1QQTAxX1JFR19MRE9fT1ZDQjQsCisJLnZvbGF0aWxlX3JlZyA9IHMybXBhMDFfdm9sYXRpbGUsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHMybXBzMTFfcmVnbWFwX2NvbmZpZyA9IHsKIAkucmVnX2JpdHMgPSA4LAogCS52YWxfYml0cyA9IDgsCkBAIC0xMjAsNiArMTY2LDE1IEBACiAJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHMybXBzMTRfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisKKwkubWF4X3JlZ2lzdGVyID0gUzJNUFMxNF9SRUdfTERPRFNDSDMsCisJLnZvbGF0aWxlX3JlZyA9IHMybXBzMTFfdm9sYXRpbGUsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHM1bTg3NjNfcmVnbWFwX2NvbmZpZyA9IHsKIAkucmVnX2JpdHMgPSA4LAogCS52YWxfYml0cyA9IDgsCkBAIC0xMzgsOSArMTkzLDE4IEBACiAJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHNlY19ydGNfcmVnbWFwX2NvbmZpZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzNW1fcnRjX3JlZ21hcF9jb25maWcgPSB7CiAJLnJlZ19iaXRzID0gOCwKIAkudmFsX2JpdHMgPSA4LAorCisJLm1heF9yZWdpc3RlciA9IFNFQ19SVENfUkVHX01BWCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzMm1wczE0X3J0Y19yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKKworCS5tYXhfcmVnaXN0ZXIgPSBTMk1QU19SVENfUkVHX01BWCwKIH07CiAKICNpZmRlZiBDT05GSUdfT0YKQEAgLTE4MCwyNCArMjQ0LDI0IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSBpbnQgc2VjX2kyY19nZXRfZHJpdmVyX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmkyYywKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzZWNfaTJjX2dldF9kcml2ZXJfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAogCQkJCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogI2lmZGVmIENPTkZJR19PRgogCWlmIChpMmMtPmRldi5vZl9ub2RlKSB7CiAJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCQltYXRjaCA9IG9mX21hdGNoX25vZGUoc2VjX2R0X21hdGNoLCBpMmMtPmRldi5vZl9ub2RlKTsKLQkJcmV0dXJuIChpbnQpbWF0Y2gtPmRhdGE7CisJCXJldHVybiAodW5zaWduZWQgbG9uZyltYXRjaC0+ZGF0YTsKIAl9CiAjZW5kaWYKLQlyZXR1cm4gKGludClpZC0+ZHJpdmVyX2RhdGE7CisJcmV0dXJuIGlkLT5kcml2ZXJfZGF0YTsKIH0KIAogc3RhdGljIGludCBzZWNfcG1pY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAogCQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3Qgc2VjX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmaTJjLT5kZXYpOwotCWNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpyZWdtYXA7CisJY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKnJlZ21hcCwgKnJlZ21hcF9ydGM7CiAJc3RydWN0IHNlY19wbWljX2RldiAqc2VjX3BtaWM7CiAJaW50IHJldDsKIApAQCAtMjI5LDE3ICsyOTMsMzQgQEAKIAl9CiAKIAlzd2l0Y2ggKHNlY19wbWljLT5kZXZpY2VfdHlwZSkgeworCWNhc2UgUzJNUEEwMToKKwkJcmVnbWFwID0gJnMybXBhMDFfcmVnbWFwX2NvbmZpZzsKKwkJYnJlYWs7CiAJY2FzZSBTMk1QUzExWDoKIAkJcmVnbWFwID0gJnMybXBzMTFfcmVnbWFwX2NvbmZpZzsKKwkJLyoKKwkJICogVGhlIHJ0Yy1zNW0gZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgUzJNUFMxMSBhbmQgdGhlcmUKKwkJICogaXMgbm8gbWZkX2NlbGwgZm9yIFMyTVBTMTEgUlRDIGRldmljZS4KKwkJICogSG93ZXZlciB3ZSBtdXN0IHBhc3Mgc29tZXRoaW5nIHRvIGRldm1fcmVnbWFwX2luaXRfaTJjKCkKKwkJICogc28gdXNlIFM1TS1saWtlIHJlZ21hcCBjb25maWcgZXZlbiB0aG91Z2ggaXQgd291bGRuJ3Qgd29yay4KKwkJICovCisJCXJlZ21hcF9ydGMgPSAmczVtX3J0Y19yZWdtYXBfY29uZmlnOworCQlicmVhazsKKwljYXNlIFMyTVBTMTRYOgorCQlyZWdtYXAgPSAmczJtcHMxNF9yZWdtYXBfY29uZmlnOworCQlyZWdtYXBfcnRjID0gJnMybXBzMTRfcnRjX3JlZ21hcF9jb25maWc7CiAJCWJyZWFrOwogCWNhc2UgUzVNODc2M1g6CiAJCXJlZ21hcCA9ICZzNW04NzYzX3JlZ21hcF9jb25maWc7CisJCXJlZ21hcF9ydGMgPSAmczVtX3J0Y19yZWdtYXBfY29uZmlnOwogCQlicmVhazsKIAljYXNlIFM1TTg3NjdYOgogCQlyZWdtYXAgPSAmczVtODc2N19yZWdtYXBfY29uZmlnOworCQlyZWdtYXBfcnRjID0gJnM1bV9ydGNfcmVnbWFwX2NvbmZpZzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmVnbWFwID0gJnNlY19yZWdtYXBfY29uZmlnOworCQlyZWdtYXBfcnRjID0gJnM1bV9ydGNfcmVnbWFwX2NvbmZpZzsKIAkJYnJlYWs7CiAJfQogCkBAIC0yNTIsMTAgKzMzMywxMyBAQAogCX0KIAogCXNlY19wbWljLT5ydGMgPSBpMmNfbmV3X2R1bW15KGkyYy0+YWRhcHRlciwgUlRDX0kyQ19BRERSKTsKKwlpZiAoIXNlY19wbWljLT5ydGMpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgSTJDIGZvciBSVENcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAJaTJjX3NldF9jbGllbnRkYXRhKHNlY19wbWljLT5ydGMsIHNlY19wbWljKTsKIAotCXNlY19wbWljLT5yZWdtYXBfcnRjID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoc2VjX3BtaWMtPnJ0YywKLQkJCSZzZWNfcnRjX3JlZ21hcF9jb25maWcpOworCXNlY19wbWljLT5yZWdtYXBfcnRjID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoc2VjX3BtaWMtPnJ0YywgcmVnbWFwX3J0Yyk7CiAJaWYgKElTX0VSUihzZWNfcG1pYy0+cmVnbWFwX3J0YykpIHsKIAkJcmV0ID0gUFRSX0VSUihzZWNfcG1pYy0+cmVnbWFwX3J0Yyk7CiAJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIFJUQyByZWdpc3RlciBtYXA6ICVkXG4iLApAQCAtMjgzLDEwICszNjcsMTggQEAKIAkJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKHNlY19wbWljLT5kZXYsIC0xLCBzNW04NzY3X2RldnMsCiAJCQkJICAgICAgQVJSQVlfU0laRShzNW04NzY3X2RldnMpLCBOVUxMLCAwLCBOVUxMKTsKIAkJYnJlYWs7CisJY2FzZSBTMk1QQTAxOgorCQlyZXQgPSBtZmRfYWRkX2RldmljZXMoc2VjX3BtaWMtPmRldiwgLTEsIHMybXBhMDFfZGV2cywKKwkJCQkgICAgICBBUlJBWV9TSVpFKHMybXBhMDFfZGV2cyksIE5VTEwsIDAsIE5VTEwpOworCQlicmVhazsKIAljYXNlIFMyTVBTMTFYOgogCQlyZXQgPSBtZmRfYWRkX2RldmljZXMoc2VjX3BtaWMtPmRldiwgLTEsIHMybXBzMTFfZGV2cywKIAkJCQkgICAgICBBUlJBWV9TSVpFKHMybXBzMTFfZGV2cyksIE5VTEwsIDAsIE5VTEwpOwogCQlicmVhazsKKwljYXNlIFMyTVBTMTRYOgorCQlyZXQgPSBtZmRfYWRkX2RldmljZXMoc2VjX3BtaWMtPmRldiwgLTEsIHMybXBzMTRfZGV2cywKKwkJCQkgICAgICBBUlJBWV9TSVpFKHMybXBzMTRfZGV2cyksIE5VTEwsIDAsIE5VTEwpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiBJZiB0aGlzIGhhcHBlbnMgdGhlIHByb2JlIGZ1bmN0aW9uIGlzIHByb2JsZW0gKi8KIAkJQlVHKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9zZWMtaXJxLmMgYi9kcml2ZXJzL21mZC9zZWMtaXJxLmMKaW5kZXggNGRlNDk0Zi4uNjRlNzkxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvc2VjLWlycS5jCisrKyBiL2RyaXZlcnMvbWZkL3NlYy1pcnEuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBzZWMtaXJxLmMKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZAogICogICAgICAgICAgICAgIGh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbWZkL3NhbXN1bmcvY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL3MybXBzMTEuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc2Ftc3VuZy9zMm1wczE0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3NhbXN1bmcvczVtODc2My5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL3M1bTg3NjcuaD4KIApAQCAtNTksMTQgKzYwLDE0IEBACiAJCS5yZWdfb2Zmc2V0ID0gMSwKIAkJLm1hc2sgPSBTMk1QUzExX0lSUV9SVEM2MFNfTUFTSywKIAl9LAorCVtTMk1QUzExX0lSUV9SVENBMF0gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMSwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9SVENBMF9NQVNLLAorCX0sCiAJW1MyTVBTMTFfSVJRX1JUQ0ExXSA9IHsKIAkJLnJlZ19vZmZzZXQgPSAxLAogCQkubWFzayA9IFMyTVBTMTFfSVJRX1JUQ0ExX01BU0ssCiAJfSwKLQlbUzJNUFMxMV9JUlFfUlRDQTJdID0gewotCQkucmVnX29mZnNldCA9IDEsCi0JCS5tYXNrID0gUzJNUFMxMV9JUlFfUlRDQTJfTUFTSywKLQl9LAogCVtTMk1QUzExX0lSUV9TTVBMXSA9IHsKIAkJLnJlZ19vZmZzZXQgPSAxLAogCQkubWFzayA9IFMyTVBTMTFfSVJRX1NNUExfTUFTSywKQEAgLTg5LDYgKzkwLDc2IEBACiAJfSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2lycSBzMm1wczE0X2lycXNbXSA9IHsKKwlbUzJNUFMxNF9JUlFfUFdST05GXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAwLAorCQkubWFzayA9IFMyTVBTMTFfSVJRX1BXUk9ORl9NQVNLLAorCX0sCisJW1MyTVBTMTRfSVJRX1BXUk9OUl0gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMCwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9QV1JPTlJfTUFTSywKKwl9LAorCVtTMk1QUzE0X0lSUV9KSUdPTkJGXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAwLAorCQkubWFzayA9IFMyTVBTMTFfSVJRX0pJR09OQkZfTUFTSywKKwl9LAorCVtTMk1QUzE0X0lSUV9KSUdPTkJSXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAwLAorCQkubWFzayA9IFMyTVBTMTFfSVJRX0pJR09OQlJfTUFTSywKKwl9LAorCVtTMk1QUzE0X0lSUV9BQ09LQkZdID0geworCQkucmVnX29mZnNldCA9IDAsCisJCS5tYXNrID0gUzJNUFMxMV9JUlFfQUNPS0JGX01BU0ssCisJfSwKKwlbUzJNUFMxNF9JUlFfQUNPS0JSXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAwLAorCQkubWFzayA9IFMyTVBTMTFfSVJRX0FDT0tCUl9NQVNLLAorCX0sCisJW1MyTVBTMTRfSVJRX1BXUk9OMVNdID0geworCQkucmVnX29mZnNldCA9IDAsCisJCS5tYXNrID0gUzJNUFMxMV9JUlFfUFdST04xU19NQVNLLAorCX0sCisJW1MyTVBTMTRfSVJRX01SQl0gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMCwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9NUkJfTUFTSywKKwl9LAorCVtTMk1QUzE0X0lSUV9SVEM2MFNdID0geworCQkucmVnX29mZnNldCA9IDEsCisJCS5tYXNrID0gUzJNUFMxMV9JUlFfUlRDNjBTX01BU0ssCisJfSwKKwlbUzJNUFMxNF9JUlFfUlRDQTFdID0geworCQkucmVnX29mZnNldCA9IDEsCisJCS5tYXNrID0gUzJNUFMxMV9JUlFfUlRDQTFfTUFTSywKKwl9LAorCVtTMk1QUzE0X0lSUV9SVENBMF0gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMSwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9SVENBMF9NQVNLLAorCX0sCisJW1MyTVBTMTRfSVJRX1NNUExdID0geworCQkucmVnX29mZnNldCA9IDEsCisJCS5tYXNrID0gUzJNUFMxMV9JUlFfU01QTF9NQVNLLAorCX0sCisJW1MyTVBTMTRfSVJRX1JUQzFTXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAxLAorCQkubWFzayA9IFMyTVBTMTFfSVJRX1JUQzFTX01BU0ssCisJfSwKKwlbUzJNUFMxNF9JUlFfV1RTUl0gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMSwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9XVFNSX01BU0ssCisJfSwKKwlbUzJNUFMxNF9JUlFfSU5UMTIwQ10gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMiwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9JTlQxMjBDX01BU0ssCisJfSwKKwlbUzJNUFMxNF9JUlFfSU5UMTQwQ10gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMiwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9JTlQxNDBDX01BU0ssCisJfSwKKwlbUzJNUFMxNF9JUlFfVFNEXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAyLAorCQkubWFzayA9IFMyTVBTMTRfSVJRX1RTRF9NQVNLLAorCX0sCit9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9pcnEgczVtODc2N19pcnFzW10gPSB7CiAJW1M1TTg3NjdfSVJRX1BXUlJdID0gewpAQCAtMjQ2LDYgKzMxNywxNiBAQAogCS5hY2tfYmFzZSA9IFMyTVBTMTFfUkVHX0lOVDEsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9pcnFfY2hpcCBzMm1wczE0X2lycV9jaGlwID0geworCS5uYW1lID0gInMybXBzMTQiLAorCS5pcnFzID0gczJtcHMxNF9pcnFzLAorCS5udW1faXJxcyA9IEFSUkFZX1NJWkUoczJtcHMxNF9pcnFzKSwKKwkubnVtX3JlZ3MgPSAzLAorCS5zdGF0dXNfYmFzZSA9IFMyTVBTMTRfUkVHX0lOVDEsCisJLm1hc2tfYmFzZSA9IFMyTVBTMTRfUkVHX0lOVDFNLAorCS5hY2tfYmFzZSA9IFMyTVBTMTRfUkVHX0lOVDEsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9pcnFfY2hpcCBzNW04NzY3X2lycV9jaGlwID0gewogCS5uYW1lID0gInM1bTg3NjciLAogCS5pcnFzID0gczVtODc2N19pcnFzLApAQCAtMjk3LDYgKzM3OCwxMiBAQAogCQkJCSAgc2VjX3BtaWMtPmlycV9iYXNlLCAmczJtcHMxMV9pcnFfY2hpcCwKIAkJCQkgICZzZWNfcG1pYy0+aXJxX2RhdGEpOwogCQlicmVhazsKKwljYXNlIFMyTVBTMTRYOgorCQlyZXQgPSByZWdtYXBfYWRkX2lycV9jaGlwKHNlY19wbWljLT5yZWdtYXBfcG1pYywgc2VjX3BtaWMtPmlycSwKKwkJCQkgIElSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9PTkVTSE9ULAorCQkJCSAgc2VjX3BtaWMtPmlycV9iYXNlLCAmczJtcHMxNF9pcnFfY2hpcCwKKwkJCQkgICZzZWNfcG1pYy0+aXJxX2RhdGEpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKHNlY19wbWljLT5kZXYsICJVbmtub3duIGRldmljZSB0eXBlICVkXG4iLAogCQkJc2VjX3BtaWMtPmRldmljZV90eXBlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtNTEwMi10YWJsZXMuYyBiL2RyaXZlcnMvbWZkL3dtNTEwMi10YWJsZXMuYwppbmRleCAxZTlhNGIyLi5iZmZjNTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTUxMDItdGFibGVzLmMKKysrIGIvZHJpdmVycy9tZmQvd201MTAyLXRhYmxlcy5jCkBAIC04MCw4ICs4MCw3IEBACiBpbnQgd201MTAyX3BhdGNoKHN0cnVjdCBhcml6b25hICphcml6b25hKQogewogCWNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqd201MTAyX3BhdGNoOwotCWludCByZXQgPSAwOwotCWludCBpLCBwYXRjaF9zaXplOworCWludCBwYXRjaF9zaXplOwogCiAJc3dpdGNoIChhcml6b25hLT5yZXYpIHsKIAljYXNlIDA6CkBAIC05MiwyMSArOTEsOSBAQAogCQlwYXRjaF9zaXplID0gQVJSQVlfU0laRSh3bTUxMDJfcmV2Yl9wYXRjaCk7CiAJfQogCi0JcmVnY2FjaGVfY2FjaGVfYnlwYXNzKGFyaXpvbmEtPnJlZ21hcCwgdHJ1ZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGF0Y2hfc2l6ZTsgaSsrKSB7Ci0JCXJldCA9IHJlZ21hcF93cml0ZShhcml6b25hLT5yZWdtYXAsIHdtNTEwMl9wYXRjaFtpXS5yZWcsCi0JCQkJICAgd201MTAyX3BhdGNoW2ldLmRlZik7Ci0JCWlmIChyZXQgIT0gMCkgewotCQkJZGV2X2Vycihhcml6b25hLT5kZXYsICJGYWlsZWQgdG8gd3JpdGUgJXggPSAleDogJWRcbiIsCi0JCQkJd201MTAyX3BhdGNoW2ldLnJlZywgd201MTAyX3BhdGNoW2ldLmRlZiwgcmV0KTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi1vdXQ6Ci0JcmVnY2FjaGVfY2FjaGVfYnlwYXNzKGFyaXpvbmEtPnJlZ21hcCwgZmFsc2UpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIHJlZ21hcF9tdWx0aV9yZWdfd3JpdGVfYnlwYXNzZWQoYXJpem9uYS0+cmVnbWFwLAorCQkJCQkgICAgICAgd201MTAyX3BhdGNoLAorCQkJCQkgICAgICAgcGF0Y2hfc2l6ZSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2lycSB3bTUxMDJfYW9kX2lycXNbQVJJWk9OQV9OVU1fSVJRXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9taXNjL0tjb25maWcKaW5kZXggNmNiMzg4ZS4uMWNiNzQwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9taXNjL0tjb25maWcKQEAgLTIzNSw3ICsyMzUsNyBAQAogCiBjb25maWcgQ1M1NTM1X01GR1BUCiAJdHJpc3RhdGUgIkNTNTUzNS9DUzU1MzYgR2VvZGUgTXVsdGktRnVuY3Rpb24gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIChNRkdQVCkgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBDSSAmJiBYODYgJiYgTUZEX0NTNTUzNQorCWRlcGVuZHMgb24gTUZEX0NTNTUzNQogCWRlZmF1bHQgbgogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGFjY2VzcyB0byBNRkdQVCBmdW5jdGlvbmFsaXR5IGZvciBvdGhlcgpAQCAtNTI2LDQgKzUyNiw1IEBACiBzb3VyY2UgImRyaXZlcnMvbWlzYy92bXdfdm1jaS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL21pc2MvbWljL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbWlzYy9nZW53cWUvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9taXNjL2VjaG8vS2NvbmZpZyIKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQppbmRleCA5OWI5NDI0Li43ZWI0YjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCkBAIC01NCwzICs1NCw0IEBACiBvYmotJChDT05GSUdfU1JBTSkJCSs9IHNyYW0ubwogb2JqLXkJCQkJKz0gbWljLwogb2JqLSQoQ09ORklHX0dFTldRRSkJCSs9IGdlbndxZS8KK29iai0kKENPTkZJR19FQ0hPKQkJKz0gZWNoby8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9hZDUyNXhfZHBvdC5jIGIvZHJpdmVycy9taXNjL2FkNTI1eF9kcG90LmMKaW5kZXggZDNlZWUxMS4uYTQzMDUzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2FkNTI1eF9kcG90LmMKKysrIGIvZHJpdmVycy9taXNjL2FkNTI1eF9kcG90LmMKQEAgLTcyLDcgKzcyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9hcGRzOTgwMmFscy5jIGIvZHJpdmVycy9taXNjL2FwZHM5ODAyYWxzLmMKaW5kZXggMGM2ZTAzNy4uYzZjYzNkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2FwZHM5ODAyYWxzLmMKKysrIGIvZHJpdmVycy9taXNjL2FwZHM5ODAyYWxzLmMKQEAgLTIyLDcgKzIyLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9hdG1lbC1zc2MuYyBiL2RyaXZlcnMvbWlzYy9hdG1lbC1zc2MuYwppbmRleCA1YmU4MDg0MC4uMjJkZTEzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2F0bWVsLXNzYy5jCisrKyBiL2RyaXZlcnMvbWlzYy9hdG1lbC1zc2MuYwpAQCAtMTUwLDYgKzE1MCwxMiBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAlzc2MtPnBkYXRhID0gKHN0cnVjdCBhdG1lbF9zc2NfcGxhdGZvcm1fZGF0YSAqKXBsYXRfZGF0OwogCisJaWYgKHBkZXYtPmRldi5vZl9ub2RlKSB7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwkJc3NjLT5jbGtfZnJvbV9ya19waW4gPQorCQkJb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYXRtZWwsY2xrLWZyb20tcmstcGluIik7CisJfQorCiAJcmVncyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJc3NjLT5yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlZ3MpOwogCWlmIChJU19FUlIoc3NjLT5yZWdzKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9ibXAwODUuYyBiL2RyaXZlcnMvbWlzYy9ibXAwODUuYwppbmRleCA4MjBlNTNkLi45YjMxM2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvYm1wMDg1LmMKKysrIGIvZHJpdmVycy9taXNjL2JtcDA4NS5jCkBAIC00Nyw3ICs0Nyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSAiYm1wMDg1LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvY2FybWEvY2FybWEtZnBnYS5jIGIvZHJpdmVycy9taXNjL2Nhcm1hL2Nhcm1hLWZwZ2EuYwppbmRleCA5ZTJiOTg1Li4xNGQ5MGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvY2FybWEvY2FybWEtZnBnYS5jCisrKyBiL2RyaXZlcnMvbWlzYy9jYXJtYS9jYXJtYS1mcGdhLmMKQEAgLTEwMSw3ICsxMDEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2RzMTY4Mi5jIGIvZHJpdmVycy9taXNjL2RzMTY4Mi5jCmluZGV4IDE1NGIwMmUuLjZhNjcyZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9kczE2ODIuYworKysgYi9kcml2ZXJzL21pc2MvZHMxNjgyLmMKQEAgLTMyLDcgKzMyLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL0tjb25maWcgYi9kcml2ZXJzL21pc2MvZWNoby9LY29uZmlnCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZWNoby9LY29uZmlnCnJlbmFtZSB0byBkcml2ZXJzL21pc2MvZWNoby9LY29uZmlnCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWNoby9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9lY2hvL01ha2VmaWxlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZWNoby9NYWtlZmlsZQpyZW5hbWUgdG8gZHJpdmVycy9taXNjL2VjaG8vTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL2VjaG8uYyBiL2RyaXZlcnMvbWlzYy9lY2hvL2VjaG8uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2VjaG8vZWNoby5jCnJlbmFtZSB0byBkcml2ZXJzL21pc2MvZWNoby9lY2hvLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL2VjaG8uaCBiL2RyaXZlcnMvbWlzYy9lY2hvL2VjaG8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2VjaG8vZWNoby5oCnJlbmFtZSB0byBkcml2ZXJzL21pc2MvZWNoby9lY2hvLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL2Zpci5oIGIvZHJpdmVycy9taXNjL2VjaG8vZmlyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9lY2hvL2Zpci5oCnJlbmFtZSB0byBkcml2ZXJzL21pc2MvZWNoby9maXIuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VjaG8vb3NsZWMuaCBiL2RyaXZlcnMvbWlzYy9lY2hvL29zbGVjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9lY2hvL29zbGVjLmgKcmVuYW1lIHRvIGRyaXZlcnMvbWlzYy9lY2hvL29zbGVjLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9lZXByb20vYXQyNS5jIGIvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI1LmMKaW5kZXggNGYzYmNhMS4uNjM0ZjcyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI1LmMKKysrIGIvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI1LmMKQEAgLTEwLDcgKzEwLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2VlcHJvbS9lZXByb20uYyBiL2RyaXZlcnMvbWlzYy9lZXByb20vZWVwcm9tLmMKaW5kZXggZjBmYTRlOC4uMzNmODY3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2VlcHJvbS9lZXByb20uYworKysgYi9kcml2ZXJzL21pc2MvZWVwcm9tL2VlcHJvbS5jCkBAIC0xNyw3ICsxNyw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2VlcHJvbS9lZXByb21fOTN4eDQ2LmMgYi9kcml2ZXJzL21pc2MvZWVwcm9tL2VlcHJvbV85M3h4NDYuYwppbmRleCA3OGU1NWI1Li45ZWJlYWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvZWVwcm9tL2VlcHJvbV85M3h4NDYuYworKysgYi9kcml2ZXJzL21pc2MvZWVwcm9tL2VlcHJvbV85M3h4NDYuYwpAQCAtMTEsNyArMTEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2VlcHJvbS9tYXg2ODc1LmMgYi9kcml2ZXJzL21pc2MvZWVwcm9tL21heDY4NzUuYwppbmRleCBlMzYxNTdkLi41ODBmZjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvZWVwcm9tL21heDY4NzUuYworKysgYi9kcml2ZXJzL21pc2MvZWVwcm9tL21heDY4NzUuYwpAQCAtMjcsNyArMjcsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2VlcHJvbS9zdW54aV9zaWQuYyBiL2RyaXZlcnMvbWlzYy9lZXByb20vc3VueGlfc2lkLmMKaW5kZXggOWMzNGU1Ny4uM2YyYjYyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2VlcHJvbS9zdW54aV9zaWQuYworKysgYi9kcml2ZXJzL21pc2MvZWVwcm9tL3N1bnhpX3NpZC5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CkBAIC05Niw3ICs5NSw3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bnhpX3NpZF9vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLXNpZCIsIC5kYXRhID0gKHZvaWQgKikxNn0sCisJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXNpZCIsIC5kYXRhID0gKHZvaWQgKikxNn0sCiAJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLXNpZCIsIC5kYXRhID0gKHZvaWQgKik1MTJ9LAogCXsvKiBzZW50aW5lbCAqL30sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX2RlYnVnZnMuYyBiL2RyaXZlcnMvbWlzYy9nZW53cWUvY2FyZF9kZWJ1Z2ZzLmMKaW5kZXggM2JmZGMwNy4uNTBkMjA5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX2RlYnVnZnMuYworKysgYi9kcml2ZXJzL21pc2MvZ2Vud3FlL2NhcmRfZGVidWdmcy5jCkBAIC0yNiw3ICsyNiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2htYzYzNTIuYyBiL2RyaXZlcnMvbWlzYy9obWM2MzUyLmMKaW5kZXggMTcwYmQzZC4uOTA1MjBkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2htYzYzNTIuYworKysgYi9kcml2ZXJzL21pc2MvaG1jNjM1Mi5jCkBAIC0yMiw3ICsyMiw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaXNsMjkwMDMuYyBiL2RyaXZlcnMvbWlzYy9pc2wyOTAwMy5jCmluZGV4IGUzMTgzZjIuLjEyYzMwYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pc2wyOTAwMy5jCisrKyBiL2RyaXZlcnMvbWlzYy9pc2wyOTAwMy5jCkBAIC0yNiw3ICsyNiw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pc2wyOTAyMC5jIGIvZHJpdmVycy9taXNjL2lzbDI5MDIwLmMKaW5kZXggYjdmODRkYS4uNGE5YzUwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2lzbDI5MDIwLmMKKysrIGIvZHJpdmVycy9taXNjL2lzbDI5MDIwLmMKQEAgLTIzLDcgKzIzLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9sYXR0aWNlLWVjcDMtY29uZmlnLmMgYi9kcml2ZXJzL21pc2MvbGF0dGljZS1lY3AzLWNvbmZpZy5jCmluZGV4IDYxZmJlNmEuLjBhMTU2NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9sYXR0aWNlLWVjcDMtY29uZmlnLmMKKysrIGIvZHJpdmVycy9taXNjL2xhdHRpY2UtZWNwMy1jb25maWcuYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmQuYyBiL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkLmMKaW5kZXggMDM2ZWZmZS4uM2VmNDYyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmQuYworKysgYi9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZC5jCkBAIC0yMyw3ICsyMyw2IEBACiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkX2kyYy5jIGIvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmRfaTJjLmMKaW5kZXggN2M5NzU1MC4uZDMyNGY4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmRfaTJjLmMKKysrIGIvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmRfaTJjLmMKQEAgLTI2LDcgKzI2LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZF9zcGkuYyBiL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkX3NwaS5jCmluZGV4IDlhYTJiZDIuLmJkMDZkMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkX3NwaS5jCisrKyBiL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkX3NwaS5jCkBAIC0xMCw3ICsxMCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9sa2R0bS5jIGIvZHJpdmVycy9taXNjL2xrZHRtLmMKaW5kZXggNDljN2EyMy4uZDY2YTJmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2xrZHRtLmMKKysrIGIvZHJpdmVycy9taXNjL2xrZHRtLmMKQEAgLTMwLDYgKzMwLDcgQEAKICAqCiAgKiBTZWUgRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vcHJvdm9rZS1jcmFzaGVzLnR4dCBmb3IgaW5zdHJ1Y3Rpb25zCiAgKi8KKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CkBAIC00NSw2ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAogI2lmZGVmIENPTkZJR19JREUKICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KQEAgLTEwMSw2ICsxMDMsNyBAQAogCUNUX0VYRUNfVVNFUlNQQUNFLAogCUNUX0FDQ0VTU19VU0VSU1BBQ0UsCiAJQ1RfV1JJVEVfUk8sCisJQ1RfV1JJVEVfS0VSTiwKIH07CiAKIHN0YXRpYyBjaGFyKiBjcF9uYW1lW10gPSB7CkBAIC0xMzcsNiArMTQwLDcgQEAKIAkiRVhFQ19VU0VSU1BBQ0UiLAogCSJBQ0NFU1NfVVNFUlNQQUNFIiwKIAkiV1JJVEVfUk8iLAorCSJXUklURV9LRVJOIiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QganByb2JlIGxrZHRtOwpAQCAtMzE2LDYgKzMyMCwxMyBAQAogCXJldHVybjsKIH0KIAorLyogTXVzdCBpbW1lZGlhdGVseSBmb2xsb3cgZG9fbm90aGluZyBmb3Igc2l6ZSBjYWxjdWx1YXRpb25zIHRvIHdvcmsgb3V0LiAqLworc3RhdGljIHZvaWQgZG9fb3ZlcndyaXR0ZW4odm9pZCkKK3sKKwlwcl9pbmZvKCJkb19vdmVyd3JpdHRlbiB3YXNuJ3Qgb3ZlcndyaXR0ZW4hXG4iKTsKKwlyZXR1cm47Cit9CisKIHN0YXRpYyBub2lubGluZSB2b2lkIGNvcnJ1cHRfc3RhY2sodm9pZCkKIHsKIAkvKiBVc2UgZGVmYXVsdCBjaGFyIGFycmF5IGxlbmd0aCB0aGF0IHRyaWdnZXJzIHN0YWNrIHByb3RlY3Rpb24uICovCkBAIC0zMjgsNyArMzM5LDEyIEBACiB7CiAJdm9pZCAoKmZ1bmMpKHZvaWQpID0gZHN0OwogCisJcHJfaW5mbygiYXR0ZW1wdGluZyBvayBleGVjdXRpb24gYXQgJXBcbiIsIGRvX25vdGhpbmcpOworCWRvX25vdGhpbmcoKTsKKwogCW1lbWNweShkc3QsIGRvX25vdGhpbmcsIEVYRUNfU0laRSk7CisJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWRzdCwgKHVuc2lnbmVkIGxvbmcpZHN0ICsgRVhFQ19TSVpFKTsKKwlwcl9pbmZvKCJhdHRlbXB0aW5nIGJhZCBleGVjdXRpb24gYXQgJXBcbiIsIGZ1bmMpOwogCWZ1bmMoKTsKIH0KIApAQCAtMzM3LDggKzM1MywxMyBAQAogCS8qIEludGVudGlvbmFsbHkgY3Jvc3Npbmcga2VybmVsL3VzZXIgbWVtb3J5IGJvdW5kYXJ5LiAqLwogCXZvaWQgKCpmdW5jKSh2b2lkKSA9IGRzdDsKIAorCXByX2luZm8oImF0dGVtcHRpbmcgb2sgZXhlY3V0aW9uIGF0ICVwXG4iLCBkb19ub3RoaW5nKTsKKwlkb19ub3RoaW5nKCk7CisKIAlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWRzdCwgZG9fbm90aGluZywgRVhFQ19TSVpFKSkKIAkJcmV0dXJuOworCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylkc3QsICh1bnNpZ25lZCBsb25nKWRzdCArIEVYRUNfU0laRSk7CisJcHJfaW5mbygiYXR0ZW1wdGluZyBiYWQgZXhlY3V0aW9uIGF0ICVwXG4iLCBmdW5jKTsKIAlmdW5jKCk7CiB9CiAKQEAgLTQ2Myw4ICs0ODQsMTIgQEAKIAkJfQogCiAJCXB0ciA9ICh1bnNpZ25lZCBsb25nICopdXNlcl9hZGRyOworCisJCXByX2luZm8oImF0dGVtcHRpbmcgYmFkIHJlYWQgYXQgJXBcbiIsIHB0cik7CiAJCXRtcCA9ICpwdHI7CiAJCXRtcCArPSAweGMwZGVjMGRlOworCisJCXByX2luZm8oImF0dGVtcHRpbmcgYmFkIHdyaXRlIGF0ICVwXG4iLCBwdHIpOwogCQkqcHRyID0gdG1wOwogCiAJCXZtX211bm1hcCh1c2VyX2FkZHIsIFBBR0VfU0laRSk7CkBAIC00NzUsMTAgKzUwMCwyOCBAQAogCQl1bnNpZ25lZCBsb25nICpwdHI7CiAKIAkJcHRyID0gKHVuc2lnbmVkIGxvbmcgKikmcm9kYXRhOworCisJCXByX2luZm8oImF0dGVtcHRpbmcgYmFkIHdyaXRlIGF0ICVwXG4iLCBwdHIpOwogCQkqcHRyIF49IDB4YWJjZDEyMzQ7CiAKIAkJYnJlYWs7CiAJfQorCWNhc2UgQ1RfV1JJVEVfS0VSTjogeworCQlzaXplX3Qgc2l6ZTsKKwkJdW5zaWduZWQgY2hhciAqcHRyOworCisJCXNpemUgPSAodW5zaWduZWQgbG9uZylkb19vdmVyd3JpdHRlbiAtCisJCSAgICAgICAodW5zaWduZWQgbG9uZylkb19ub3RoaW5nOworCQlwdHIgPSAodW5zaWduZWQgY2hhciAqKWRvX292ZXJ3cml0dGVuOworCisJCXByX2luZm8oImF0dGVtcHRpbmcgYmFkICV6dSBieXRlIHdyaXRlIGF0ICVwXG4iLCBzaXplLCBwdHIpOworCQltZW1jcHkocHRyLCAodW5zaWduZWQgY2hhciAqKWRvX25vdGhpbmcsIHNpemUpOworCQlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpcHRyLAorCQkJCSAgICh1bnNpZ25lZCBsb25nKShwdHIgKyBzaXplKSk7CisKKwkJZG9fb3ZlcndyaXR0ZW4oKTsKKwkJYnJlYWs7CisJfQogCWNhc2UgQ1RfTk9ORToKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTQ5Myw4ICs1MzYsOCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNvdW50X2xvY2ssIGZsYWdzKTsKIAljb3VudC0tOwotCXByaW50ayhLRVJOX0lORk8gImxrZHRtOiBDcmFzaCBwb2ludCAlcyBvZiB0eXBlICVzIGhpdCwgdHJpZ2dlciBpbiAlZCByb3VuZHNcbiIsCi0JCQljcF9uYW1lX3RvX3N0cihjcG9pbnQpLCBjcF90eXBlX3RvX3N0cihjcHR5cGUpLCBjb3VudCk7CisJcHJfaW5mbygiQ3Jhc2ggcG9pbnQgJXMgb2YgdHlwZSAlcyBoaXQsIHRyaWdnZXIgaW4gJWQgcm91bmRzXG4iLAorCQljcF9uYW1lX3RvX3N0cihjcG9pbnQpLCBjcF90eXBlX3RvX3N0cihjcHR5cGUpLCBjb3VudCk7CiAKIAlpZiAoY291bnQgPT0gMCkgewogCQlkb19pdCA9IHRydWU7CkBAIC01NTEsMTggKzU5NCwxOCBAQAogCQlsa2R0bS5rcC5zeW1ib2xfbmFtZSA9ICJnZW5lcmljX2lkZV9pb2N0bCI7CiAJCWxrZHRtLmVudHJ5ID0gKGtwcm9iZV9vcGNvZGVfdCopIGpwX2dlbmVyaWNfaWRlX2lvY3RsOwogI2Vsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyAibGtkdG06IENyYXNoIHBvaW50IG5vdCBhdmFpbGFibGVcbiIpOworCQlwcl9pbmZvKCJDcmFzaCBwb2ludCBub3QgYXZhaWxhYmxlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAjZW5kaWYKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fSU5GTyAibGtkdG06IEludmFsaWQgQ3Jhc2ggUG9pbnRcbiIpOworCQlwcl9pbmZvKCJJbnZhbGlkIENyYXNoIFBvaW50XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJY3BvaW50ID0gd2hpY2g7CiAJaWYgKChyZXQgPSByZWdpc3Rlcl9qcHJvYmUoJmxrZHRtKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImxrZHRtOiBDb3VsZG4ndCByZWdpc3RlciBqcHJvYmVcbiIpOworCQlwcl9pbmZvKCJDb3VsZG4ndCByZWdpc3RlciBqcHJvYmVcbiIpOwogCQljcG9pbnQgPSBDTl9JTlZBTElEOwogCX0KIApAQCAtNzA5LDggKzc1Miw3IEBACiAJaWYgKHR5cGUgPT0gQ1RfTk9ORSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwcmludGsoS0VSTl9JTkZPICJsa2R0bTogUGVyZm9ybWluZyBkaXJlY3QgZW50cnkgJXNcbiIsCi0JCQljcF90eXBlX3RvX3N0cih0eXBlKSk7CisJcHJfaW5mbygiUGVyZm9ybWluZyBkaXJlY3QgZW50cnkgJXNcbiIsIGNwX3R5cGVfdG9fc3RyKHR5cGUpKTsKIAlsa2R0bV9kb19hY3Rpb24odHlwZSk7CiAJKm9mZiArPSBjb3VudDsKIApAQCAtNzcyLDcgKzgxNCw3IEBACiAJLyogUmVnaXN0ZXIgZGVidWdmcyBpbnRlcmZhY2UgKi8KIAlsa2R0bV9kZWJ1Z2ZzX3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInByb3Zva2UtY3Jhc2giLCBOVUxMKTsKIAlpZiAoIWxrZHRtX2RlYnVnZnNfcm9vdCkgewotCQlwcmludGsoS0VSTl9FUlIgImxrZHRtOiBjcmVhdGluZyByb290IGRpciBmYWlsZWRcbiIpOworCQlwcl9lcnIoImNyZWF0aW5nIHJvb3QgZGlyIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtNzg3LDI4ICs4MjksMjYgQEAKIAkJZGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGN1ci0+bmFtZSwgMDY0NCwgbGtkdG1fZGVidWdmc19yb290LAogCQkJCU5VTEwsICZjdXItPmZvcHMpOwogCQlpZiAoZGUgPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJsa2R0bTogY291bGQgbm90IGNyZWF0ZSAlc1xuIiwKLQkJCQkJY3VyLT5uYW1lKTsKKwkJCXByX2VycigiY291bGQgbm90IGNyZWF0ZSAlc1xuIiwgY3VyLT5uYW1lKTsKIAkJCWdvdG8gb3V0X2VycjsKIAkJfQogCX0KIAogCWlmIChsa2R0bV9wYXJzZV9jb21tYW5kbGluZSgpID09IC1FSU5WQUwpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAibGtkdG06IEludmFsaWQgY29tbWFuZFxuIik7CisJCXByX2luZm8oIkludmFsaWQgY29tbWFuZFxuIik7CiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKIAlpZiAoY3BvaW50ICE9IENOX0lOVkFMSUQgJiYgY3B0eXBlICE9IENUX05PTkUpIHsKIAkJcmV0ID0gbGtkdG1fcmVnaXN0ZXJfY3BvaW50KGNwb2ludCk7CiAJCWlmIChyZXQgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJsa2R0bTogSW52YWxpZCBjcmFzaCBwb2ludCAlZFxuIiwKLQkJCQkJY3BvaW50KTsKKwkJCXByX2luZm8oIkludmFsaWQgY3Jhc2ggcG9pbnQgJWRcbiIsIGNwb2ludCk7CiAJCQlnb3RvIG91dF9lcnI7CiAJCX0KLQkJcHJpbnRrKEtFUk5fSU5GTyAibGtkdG06IENyYXNoIHBvaW50ICVzIG9mIHR5cGUgJXMgcmVnaXN0ZXJlZFxuIiwKLQkJCQljcG9pbnRfbmFtZSwgY3BvaW50X3R5cGUpOworCQlwcl9pbmZvKCJDcmFzaCBwb2ludCAlcyBvZiB0eXBlICVzIHJlZ2lzdGVyZWRcbiIsCisJCQljcG9pbnRfbmFtZSwgY3BvaW50X3R5cGUpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImxrZHRtOiBObyBjcmFzaCBwb2ludHMgcmVnaXN0ZXJlZCwgZW5hYmxlIHRocm91Z2ggZGVidWdmc1xuIik7CisJCXByX2luZm8oIk5vIGNyYXNoIHBvaW50cyByZWdpc3RlcmVkLCBlbmFibGUgdGhyb3VnaCBkZWJ1Z2ZzXG4iKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTgyMyw3ICs4NjMsNyBAQAogCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShsa2R0bV9kZWJ1Z2ZzX3Jvb3QpOwogCiAJdW5yZWdpc3Rlcl9qcHJvYmUoJmxrZHRtKTsKLQlwcmludGsoS0VSTl9JTkZPICJsa2R0bTogQ3Jhc2ggcG9pbnQgdW5yZWdpc3RlcmVkXG4iKTsKKwlwcl9pbmZvKCJDcmFzaCBwb2ludCB1bnJlZ2lzdGVyZWRcbiIpOwogfQogCiBtb2R1bGVfaW5pdChsa2R0bV9tb2R1bGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL0tjb25maWcgYi9kcml2ZXJzL21pc2MvbWVpL0tjb25maWcKaW5kZXggYzc2ZmEzMS4uZDIzMzg0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvS2NvbmZpZwpAQCAtMzQsMyArMzQsMTIgQEAKIAkgIDgyUTMzIEV4cHJlc3MKIAkgIDgyWDM4L1g0OCBFeHByZXNzCiAKK2NvbmZpZyBJTlRFTF9NRUlfVFhFCisJdHJpc3RhdGUgIkludGVsIFRydXN0ZWQgRXhlY3V0aW9uIEVudmlyb25tZW50IHdpdGggTUUgSW50ZXJmYWNlIgorCXNlbGVjdCBJTlRFTF9NRUkKKwlkZXBlbmRzIG9uIFg4NiAmJiBQQ0kgJiYgV0FUQ0hET0dfQ09SRQorCWhlbHAKKwkgIE1FSSBTdXBwb3J0IGZvciBUcnVzdGVkIEV4ZWN1dGlvbiBFbnZpcm9ubWVudCBkZXZpY2Ugb24gSW50ZWwgU29DcworCisJICBTdXBwb3J0ZWQgU29DczoKKwkgIEludGVsIEJheSBUcmFpbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9tZWkvTWFrZWZpbGUKaW5kZXggMDg2OThhNC4uOGViYzZjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21pc2MvbWVpL01ha2VmaWxlCkBAIC0xLDYgKzEsNiBAQAogIwogIyBNYWtlZmlsZSAtIEludGVsIE1hbmFnZW1lbnQgRW5naW5lIEludGVyZmFjZSAoSW50ZWwgTUVJKSBMaW51eCBkcml2ZXIKLSMgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIEludGVsIENvcnBvcmF0aW9uLgorIyBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24uCiAjCiBvYmotJChDT05GSUdfSU5URUxfTUVJKSArPSBtZWkubwogbWVpLW9ianMgOj0gaW5pdC5vCkBAIC0xNywzICsxNyw3IEBACiBvYmotJChDT05GSUdfSU5URUxfTUVJX01FKSArPSBtZWktbWUubwogbWVpLW1lLW9ianMgOj0gcGNpLW1lLm8KIG1laS1tZS1vYmpzICs9IGh3LW1lLm8KKworb2JqLSQoQ09ORklHX0lOVEVMX01FSV9UWEUpICs9IG1laS10eGUubworbWVpLXR4ZS1vYmpzIDo9IHBjaS10eGUubworbWVpLXR4ZS1vYmpzICs9IGh3LXR4ZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2FtdGhpZi5jIGIvZHJpdmVycy9taXNjL21laS9hbXRoaWYuYwppbmRleCAyZmFkODQ0Li5iOGRlYjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2FtdGhpZi5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvYW10aGlmLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CkBAIC0zNSw3ICszNCw2IEBACiAKICNpbmNsdWRlICJtZWlfZGV2LmgiCiAjaW5jbHVkZSAiaGJtLmgiCi0jaW5jbHVkZSAiaHctbWUuaCIKICNpbmNsdWRlICJjbGllbnQuaCIKIAogY29uc3QgdXVpZF9sZSBtZWlfYW10aGlmX2d1aWQgID0gVVVJRF9MRSgweDEyZjgwMDI4LCAweGI0YjcsIDB4NGIyZCwKQEAgLTc5LDEwICs3Nyw5IEBACiAKIAlpID0gbWVpX21lX2NsX2J5X3V1aWQoZGV2LCAmbWVpX2FtdGhpZl9ndWlkKTsKIAlpZiAoaSA8IDApIHsKLQkJcmV0ID0gaTsKIAkJZGV2X2luZm8oJmRldi0+cGRldi0+ZGV2LAotCQkJImFtdGhpZjogZmFpbGVkIHRvIGZpbmQgdGhlIGNsaWVudCAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKKwkJCSJhbXRoaWY6IGZhaWxlZCB0byBmaW5kIHRoZSBjbGllbnQgJWRcbiIsIGkpOworCQlyZXR1cm4gLUVOT1RUWTsKIAl9CiAKIAljbC0+bWVfY2xpZW50X2lkID0gZGV2LT5tZV9jbGllbnRzW2ldLmNsaWVudF9pZDsKQEAgLTExNiwxNCArMTEzLDExIEBACiAKIAljbC0+c3RhdGUgPSBNRUlfRklMRV9DT05ORUNUSU5HOwogCi0JaWYgKG1laV9oYm1fY2xfY29ubmVjdF9yZXEoZGV2LCBjbCkpIHsKLQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJhbXRoaWY6IEZhaWxlZCB0byBjb25uZWN0IHRvIE1FIGNsaWVudFxuIik7Ci0JCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0RJU0NPTk5FQ1RFRDsKLQkJY2wtPmhvc3RfY2xpZW50X2lkID0gMDsKLQl9IGVsc2UgewotCQljbC0+dGltZXJfY291bnQgPSBNRUlfQ09OTkVDVF9USU1FT1VUOwotCX0KLQlyZXR1cm4gMDsKKwlyZXQgPSBtZWlfY2xfY29ubmVjdChjbCwgTlVMTCk7CisKKwlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9JRExFOworCisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC0xMzcsMTQgKzEzMSwxMiBAQAogc3RydWN0IG1laV9jbF9jYiAqbWVpX2FtdGhpZl9maW5kX3JlYWRfbGlzdF9lbnRyeShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAogCQkJCQkJc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IG1laV9jbF9jYiAqcG9zID0gTlVMTDsKLQlzdHJ1Y3QgbWVpX2NsX2NiICpuZXh0ID0gTlVMTDsKKwlzdHJ1Y3QgbWVpX2NsX2NiICpjYjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG5leHQsCi0JCQkJJmRldi0+YW10aGlmX3JkX2NvbXBsZXRlX2xpc3QubGlzdCwgbGlzdCkgewotCQlpZiAocG9zLT5jbCAmJiBwb3MtPmNsID09ICZkZXYtPmlhbXRoaWZfY2wgJiYKLQkJCXBvcy0+ZmlsZV9vYmplY3QgPT0gZmlsZSkKLQkJCXJldHVybiBwb3M7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjYiwgJmRldi0+YW10aGlmX3JkX2NvbXBsZXRlX2xpc3QubGlzdCwgbGlzdCkgeworCQlpZiAoY2ItPmNsICYmIGNiLT5jbCA9PSAmZGV2LT5pYW10aGlmX2NsICYmCisJCQljYi0+ZmlsZV9vYmplY3QgPT0gZmlsZSkKKwkJCXJldHVybiBjYjsKIAl9CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0xODAsMTQgKzE3MiwxMyBAQAogCS8qIE9ubHkgcG9zc2libGUgaWYgd2UgYXJlIGluIHRpbWVvdXQgKi8KIAlpZiAoIWNsIHx8IGNsICE9ICZkZXYtPmlhbXRoaWZfY2wpIHsKIAkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJiYWQgZmlsZSBleHQuXG4iKTsKLQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCXJldHVybiAtRVRJTUU7CiAJfQogCiAJaSA9IG1laV9tZV9jbF9ieV9pZChkZXYsIGRldi0+aWFtdGhpZl9jbC5tZV9jbGllbnRfaWQpOwotCiAJaWYgKGkgPCAwKSB7CiAJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiYW10aGlmIGNsaWVudCBub3QgZm91bmQuXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiAtRU5PVFRZOwogCX0KIAlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImNoZWNraW5nIGFtdGhpZiBkYXRhXG4iKTsKIAljYiA9IG1laV9hbXRoaWZfZmluZF9yZWFkX2xpc3RfZW50cnkoZGV2LCBmaWxlKTsKQEAgLTIyOCw3ICsyMTksNyBAQAogCQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJhbXRoaWYgVGltZSBvdXRcbiIpOwogCQkJLyogMTUgc2VjIGZvciB0aGUgbWVzc2FnZSBoYXMgZXhwaXJlZCAqLwogCQkJbGlzdF9kZWwoJmNiLT5saXN0KTsKLQkJCXJldHMgPSAtRVRJTUVET1VUOworCQkJcmV0cyA9IC1FVElNRTsKIAkJCWdvdG8gZnJlZTsKIAkJfQogCX0KQEAgLTI1Myw5ICsyNDQsMTAgQEAKIAkgKiB0aGUgYnVmX2lkeCBtYXkgcG9pbnQgYmV5b25kICovCiAJbGVuZ3RoID0gbWluX3Qoc2l6ZV90LCBsZW5ndGgsIChjYi0+YnVmX2lkeCAtICpvZmZzZXQpKTsKIAotCWlmIChjb3B5X3RvX3VzZXIodWJ1ZiwgY2ItPnJlc3BvbnNlX2J1ZmZlci5kYXRhICsgKm9mZnNldCwgbGVuZ3RoKSkKKwlpZiAoY29weV90b191c2VyKHVidWYsIGNiLT5yZXNwb25zZV9idWZmZXIuZGF0YSArICpvZmZzZXQsIGxlbmd0aCkpIHsKKwkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gY29weSBkYXRhIHRvIHVzZXJsYW5kXG4iKTsKIAkJcmV0cyA9IC1FRkFVTFQ7Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJcmV0cyA9IGxlbmd0aDsKIAkJaWYgKCgqb2Zmc2V0ICsgbGVuZ3RoKSA8IGNiLT5idWZfaWR4KSB7CiAJCQkqb2Zmc2V0ICs9IGxlbmd0aDsKQEAgLTMwMiw5ICsyOTQsOCBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKHJldCAmJiBkZXYtPmhidWZfaXNfcmVhZHkpIHsKKwlpZiAocmV0ICYmIG1laV9oYnVmX2FjcXVpcmUoZGV2KSkgewogCQlyZXQgPSAwOwotCQlkZXYtPmhidWZfaXNfcmVhZHkgPSBmYWxzZTsKIAkJaWYgKGNiLT5yZXF1ZXN0X2J1ZmZlci5zaXplID4gbWVpX2hidWZfbWF4X2xlbihkZXYpKSB7CiAJCQltZWlfaGRyLmxlbmd0aCA9IG1laV9oYnVmX21heF9sZW4oZGV2KTsKIAkJCW1laV9oZHIubXNnX2NvbXBsZXRlID0gMDsKQEAgLTMzNiwxMCArMzI3LDYgQEAKIAkJCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmZGV2LT53cml0ZV9saXN0Lmxpc3QpOwogCQl9CiAJfSBlbHNlIHsKLQkJaWYgKCFkZXYtPmhidWZfaXNfcmVhZHkpCi0JCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImhvc3QgYnVmZmVyIGlzIG5vdCBlbXB0eSIpOwotCi0JCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiTm8gZmxvdyBjb250cm9sIGNyZWRlbnRpYWxzLCBzbyBhZGQgaWFtdGhpZiBjYiB0byB3cml0ZSBsaXN0LlxuIik7CiAJCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmZGV2LT53cml0ZV9saXN0Lmxpc3QpOwogCX0KIAlyZXR1cm4gMDsKQEAgLTM2NSw3ICszNTIsNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQljYi0+Zm9wX3R5cGUgPSBNRUlfRk9QX0lPQ1RMOworCWNiLT5mb3BfdHlwZSA9IE1FSV9GT1BfV1JJVEU7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJmRldi0+YW10aGlmX2NtZF9saXN0Lmxpc3QpIHx8CiAJICAgIGRldi0+aWFtdGhpZl9zdGF0ZSAhPSBNRUlfSUFNVEhJRl9JRExFKSB7CkBAIC00NDcsMjMgKzQzNCwyMyBAQAogCiAKIC8qKgotICogbWVpX2FtdGhpZl9pcnFfd3JpdGVfY29tcGxldGVkIC0gcHJvY2Vzc2VzIGNvbXBsZXRlZCBpYW10aGlmIG9wZXJhdGlvbi4KKyAqIG1laV9hbXRoaWZfaXJxX3dyaXRlIC0gd3JpdGUgaWFtdGhpZiBjb21tYW5kIGluIGlycSB0aHJlYWQgY29udGV4dC4KICAqCiAgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KLSAqIEBzbG90czogZnJlZSBzbG90cy4KICAqIEBjYl9wb3M6IGNhbGxiYWNrIGJsb2NrLgogICogQGNsOiBwcml2YXRlIGRhdGEgb2YgdGhlIGZpbGUgb2JqZWN0LgogICogQGNtcGxfbGlzdDogY29tcGxldGUgbGlzdC4KICAqCiAgKiByZXR1cm5zIDAsIE9LOyBvdGhlcndpc2UsIGVycm9yLgogICovCi1pbnQgbWVpX2FtdGhpZl9pcnFfd3JpdGVfY29tcGxldGUoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiLAotCQkJCSAgczMyICpzbG90cywgc3RydWN0IG1laV9jbF9jYiAqY21wbF9saXN0KQoraW50IG1laV9hbXRoaWZfaXJxX3dyaXRlKHN0cnVjdCBtZWlfY2wgKmNsLCBzdHJ1Y3QgbWVpX2NsX2NiICpjYiwKKwkJCSBzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QpCiB7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IGNsLT5kZXY7CiAJc3RydWN0IG1laV9tc2dfaGRyIG1laV9oZHI7CiAJc2l6ZV90IGxlbiA9IGRldi0+aWFtdGhpZl9tc2dfYnVmX3NpemUgLSBkZXYtPmlhbXRoaWZfbXNnX2J1Zl9pbmRleDsKIAl1MzIgbXNnX3Nsb3RzID0gbWVpX2RhdGEyc2xvdHMobGVuKTsKKwlpbnQgc2xvdHM7CiAJaW50IHJldHM7CiAKIAlyZXRzID0gbWVpX2NsX2Zsb3dfY3RybF9jcmVkcyhjbCk7CkBAIC00ODAsMTMgKzQ2NywxNSBAQAogCW1laV9oZHIucmVzZXJ2ZWQgPSAwOwogCW1laV9oZHIuaW50ZXJuYWwgPSAwOwogCi0JaWYgKCpzbG90cyA+PSBtc2dfc2xvdHMpIHsKKwlzbG90cyA9IG1laV9oYnVmX2VtcHR5X3Nsb3RzKGRldik7CisKKwlpZiAoc2xvdHMgPj0gbXNnX3Nsb3RzKSB7CiAJCW1laV9oZHIubGVuZ3RoID0gbGVuOwogCQltZWlfaGRyLm1zZ19jb21wbGV0ZSA9IDE7CiAJLyogU3BsaXQgdGhlIG1lc3NhZ2Ugb25seSBpZiB3ZSBjYW4gd3JpdGUgdGhlIHdob2xlIGhvc3QgYnVmZmVyICovCi0JfSBlbHNlIGlmICgqc2xvdHMgPT0gZGV2LT5oYnVmX2RlcHRoKSB7Ci0JCW1zZ19zbG90cyA9ICpzbG90czsKLQkJbGVuID0gKCpzbG90cyAqIHNpemVvZih1MzIpKSAtIHNpemVvZihzdHJ1Y3QgbWVpX21zZ19oZHIpOworCX0gZWxzZSBpZiAoc2xvdHMgPT0gZGV2LT5oYnVmX2RlcHRoKSB7CisJCW1zZ19zbG90cyA9IHNsb3RzOworCQlsZW4gPSAoc2xvdHMgKiBzaXplb2YodTMyKSkgLSBzaXplb2Yoc3RydWN0IG1laV9tc2dfaGRyKTsKIAkJbWVpX2hkci5sZW5ndGggPSBsZW47CiAJCW1laV9oZHIubXNnX2NvbXBsZXRlID0gMDsKIAl9IGVsc2UgewpAQCAtNDk2LDcgKzQ4NSw2IEBACiAKIAlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgTUVJX0hEUl9GTVQsICBNRUlfSERSX1BSTSgmbWVpX2hkcikpOwogCi0JKnNsb3RzIC09ICBtc2dfc2xvdHM7CiAJcmV0cyA9IG1laV93cml0ZV9tZXNzYWdlKGRldiwgJm1laV9oZHIsCiAJCQlkZXYtPmlhbXRoaWZfbXNnX2J1ZiArIGRldi0+aWFtdGhpZl9tc2dfYnVmX2luZGV4KTsKIAlpZiAocmV0cykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9idXMuYyBiL2RyaXZlcnMvbWlzYy9tZWkvYnVzLmMKaW5kZXggNGJjN2Q2Mi4uZGRjNWFjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9idXMuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL2J1cy5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8bGludXgvbWVpX2NsX2J1cy5oPgogCiAjaW5jbHVkZSAibWVpX2Rldi5oIgotI2luY2x1ZGUgImh3LW1lLmgiCiAjaW5jbHVkZSAiY2xpZW50LmgiCiAKICNkZWZpbmUgdG9fbWVpX2NsX2RyaXZlcihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IG1laV9jbF9kcml2ZXIsIGRyaXZlcikKQEAgLTE0NSw5ICsxNDQsOSBAQAogc3RhdGljIHN0cnVjdCBtZWlfY2wgKm1laV9idXNfZmluZF9tZWlfY2xfYnlfdXVpZChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAogCQkJCQkJdXVpZF9sZSB1dWlkKQogewotCXN0cnVjdCBtZWlfY2wgKmNsLCAqbmV4dDsKKwlzdHJ1Y3QgbWVpX2NsICpjbDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbCwgbmV4dCwgJmRldi0+ZGV2aWNlX2xpc3QsIGRldmljZV9saW5rKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJmRldi0+ZGV2aWNlX2xpc3QsIGRldmljZV9saW5rKSB7CiAJCWlmICghdXVpZF9sZV9jbXAodXVpZCwgY2wtPmRldmljZV91dWlkKSkKIAkJCXJldHVybiBjbDsKIAl9CkBAIC01MjQsNiArNTIzLDIyIEBACiAJc2NoZWR1bGVfd29yaygmZGV2aWNlLT5ldmVudF93b3JrKTsKIH0KIAordm9pZCBtZWlfY2xfYnVzX3JlbW92ZV9kZXZpY2VzKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1laV9jbCAqY2wsICpuZXh0OworCisJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNsLCBuZXh0LCAmZGV2LT5kZXZpY2VfbGlzdCwgZGV2aWNlX2xpbmspIHsKKwkJaWYgKGNsLT5kZXZpY2UpCisJCQltZWlfY2xfcmVtb3ZlX2RldmljZShjbC0+ZGV2aWNlKTsKKworCQlsaXN0X2RlbCgmY2wtPmRldmljZV9saW5rKTsKKwkJbWVpX2NsX3VubGluayhjbCk7CisJCWtmcmVlKGNsKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKK30KKwogaW50IF9faW5pdCBtZWlfY2xfYnVzX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gYnVzX3JlZ2lzdGVyKCZtZWlfY2xfYnVzX3R5cGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9jbGllbnQuYyBiL2RyaXZlcnMvbWlzYy9tZWkvY2xpZW50LmMKaW5kZXggODlhNTU3OS4uOGMwNzhiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9jbGllbnQuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL2NsaWVudC5jCkBAIC0yOSwyMCArMjksMjEgQEAKICAqIG1laV9tZV9jbF9ieV91dWlkIC0gbG9jYXRlIGluZGV4IG9mIG1lIGNsaWVudAogICoKICAqIEBkZXY6IG1laSBkZXZpY2UKKyAqCisgKiBMb2NraW5nOiBjYWxsZWQgdW5kZXIgImRldi0+ZGV2aWNlX2xvY2siIGxvY2sKKyAqCiAgKiByZXR1cm5zIG1lIGNsaWVudCBpbmRleCBvciAtRU5PRU5UIGlmIG5vdCBmb3VuZAogICovCiBpbnQgbWVpX21lX2NsX2J5X3V1aWQoY29uc3Qgc3RydWN0IG1laV9kZXZpY2UgKmRldiwgY29uc3QgdXVpZF9sZSAqdXVpZCkKIHsKLQlpbnQgaSwgcmVzID0gLUVOT0VOVDsKKwlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1lX2NsaWVudHNfbnVtOyArK2kpCiAJCWlmICh1dWlkX2xlX2NtcCgqdXVpZCwKLQkJCQlkZXYtPm1lX2NsaWVudHNbaV0ucHJvcHMucHJvdG9jb2xfbmFtZSkgPT0gMCkgewotCQkJcmVzID0gaTsKLQkJCWJyZWFrOwotCQl9CisJCQkJZGV2LT5tZV9jbGllbnRzW2ldLnByb3BzLnByb3RvY29sX25hbWUpID09IDApCisJCQlyZXR1cm4gaTsKIAotCXJldHVybiByZXM7CisJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKIApAQCAtNjAsMzQgKzYxLDc2IEBACiBpbnQgbWVpX21lX2NsX2J5X2lkKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHU4IGNsaWVudF9pZCkKIHsKIAlpbnQgaTsKKwogCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1lX2NsaWVudHNfbnVtOyBpKyspCiAJCWlmIChkZXYtPm1lX2NsaWVudHNbaV0uY2xpZW50X2lkID09IGNsaWVudF9pZCkKLQkJCWJyZWFrOwotCWlmIChXQVJOX09OKGRldi0+bWVfY2xpZW50c1tpXS5jbGllbnRfaWQgIT0gY2xpZW50X2lkKSkKLQkJcmV0dXJuIC1FTk9FTlQ7CisJCQlyZXR1cm4gaTsKIAotCWlmIChpID09IGRldi0+bWVfY2xpZW50c19udW0pCi0JCXJldHVybiAtRU5PRU5UOwotCi0JcmV0dXJuIGk7CisJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKIAogLyoqCisgKiBtZWlfY2xfY21wX2lkIC0gdGVsbHMgaWYgdGhlIGNsaWVudHMgYXJlIHRoZSBzYW1lCisgKgorICogQGNsMTogaG9zdCBjbGllbnQgMQorICogQGNsMjogaG9zdCBjbGllbnQgMgorICoKKyAqIHJldHVybnMgdHJ1ZSAgLSBpZiB0aGUgY2xpZW50cyBoYXMgc2FtZSBob3N0IGFuZCBtZSBpZHMKKyAqICAgICAgICAgZmFsc2UgLSBvdGhlcndpc2UKKyAqLworc3RhdGljIGlubGluZSBib29sIG1laV9jbF9jbXBfaWQoY29uc3Qgc3RydWN0IG1laV9jbCAqY2wxLAorCQkJCWNvbnN0IHN0cnVjdCBtZWlfY2wgKmNsMikKK3sKKwlyZXR1cm4gY2wxICYmIGNsMiAmJgorCQkoY2wxLT5ob3N0X2NsaWVudF9pZCA9PSBjbDItPmhvc3RfY2xpZW50X2lkKSAmJgorCQkoY2wxLT5tZV9jbGllbnRfaWQgPT0gY2wyLT5tZV9jbGllbnRfaWQpOworfQorCisvKioKKyAqIG1laV9pb19saXN0X2ZsdXNoIC0gcmVtb3ZlcyBjYnMgYmVsb25naW5nIHRvIGNsLgorICoKKyAqIEBsaXN0OiAgYW4gaW5zdGFuY2Ugb2Ygb3VyIGxpc3Qgc3RydWN0dXJlCisgKiBAY2w6ICAgIGhvc3QgY2xpZW50LCBjYW4gYmUgTlVMTCBmb3IgZmx1c2hpbmcgdGhlIHdob2xlIGxpc3QKKyAqIEBmcmVlOiAgd2hldGhlciB0byBmcmVlIHRoZSBjYnMKKyAqLworc3RhdGljIHZvaWQgX19tZWlfaW9fbGlzdF9mbHVzaChzdHJ1Y3QgbWVpX2NsX2NiICpsaXN0LAorCQkJCXN0cnVjdCBtZWlfY2wgKmNsLCBib29sIGZyZWUpCit7CisJc3RydWN0IG1laV9jbF9jYiAqY2I7CisJc3RydWN0IG1laV9jbF9jYiAqbmV4dDsKKworCS8qIGVuYWJsZSByZW1vdmluZyBldmVyeXRoaW5nIGlmIG5vIGNsIGlzIHNwZWNpZmllZCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjYiwgbmV4dCwgJmxpc3QtPmxpc3QsIGxpc3QpIHsKKwkJaWYgKCFjbCB8fCAoY2ItPmNsICYmIG1laV9jbF9jbXBfaWQoY2wsIGNiLT5jbCkpKSB7CisJCQlsaXN0X2RlbCgmY2ItPmxpc3QpOworCQkJaWYgKGZyZWUpCisJCQkJbWVpX2lvX2NiX2ZyZWUoY2IpOworCQl9CisJfQorfQorCisvKioKICAqIG1laV9pb19saXN0X2ZsdXNoIC0gcmVtb3ZlcyBsaXN0IGVudHJ5IGJlbG9uZ2luZyB0byBjbC4KICAqCiAgKiBAbGlzdDogIEFuIGluc3RhbmNlIG9mIG91ciBsaXN0IHN0cnVjdHVyZQogICogQGNsOiBob3N0IGNsaWVudAogICovCi12b2lkIG1laV9pb19saXN0X2ZsdXNoKHN0cnVjdCBtZWlfY2xfY2IgKmxpc3QsIHN0cnVjdCBtZWlfY2wgKmNsKQorc3RhdGljIGlubGluZSB2b2lkIG1laV9pb19saXN0X2ZsdXNoKHN0cnVjdCBtZWlfY2xfY2IgKmxpc3QsIHN0cnVjdCBtZWlfY2wgKmNsKQogewotCXN0cnVjdCBtZWlfY2xfY2IgKmNiOwotCXN0cnVjdCBtZWlfY2xfY2IgKm5leHQ7CisJX19tZWlfaW9fbGlzdF9mbHVzaChsaXN0LCBjbCwgZmFsc2UpOworfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNiLCBuZXh0LCAmbGlzdC0+bGlzdCwgbGlzdCkgewotCQlpZiAoY2ItPmNsICYmIG1laV9jbF9jbXBfaWQoY2wsIGNiLT5jbCkpCi0JCQlsaXN0X2RlbCgmY2ItPmxpc3QpOwotCX0KKworLyoqCisgKiBtZWlfaW9fbGlzdF9mcmVlIC0gcmVtb3ZlcyBjYiBiZWxvbmdpbmcgdG8gY2wgYW5kIGZyZWUgdGhlbQorICoKKyAqIEBsaXN0OiAgQW4gaW5zdGFuY2Ugb2Ygb3VyIGxpc3Qgc3RydWN0dXJlCisgKiBAY2w6IGhvc3QgY2xpZW50CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtZWlfaW9fbGlzdF9mcmVlKHN0cnVjdCBtZWlfY2xfY2IgKmxpc3QsIHN0cnVjdCBtZWlfY2wgKmNsKQoreworCV9fbWVpX2lvX2xpc3RfZmx1c2gobGlzdCwgY2wsIHRydWUpOwogfQogCiAvKioKQEAgLTE5Niw4ICsyMzksOCBAQAogCiAJY2xfZGJnKGRldiwgY2wsICJyZW1vdmUgbGlzdCBlbnRyeSBiZWxvbmdpbmcgdG8gY2xcbiIpOwogCW1laV9pb19saXN0X2ZsdXNoKCZjbC0+ZGV2LT5yZWFkX2xpc3QsIGNsKTsKLQltZWlfaW9fbGlzdF9mbHVzaCgmY2wtPmRldi0+d3JpdGVfbGlzdCwgY2wpOwotCW1laV9pb19saXN0X2ZsdXNoKCZjbC0+ZGV2LT53cml0ZV93YWl0aW5nX2xpc3QsIGNsKTsKKwltZWlfaW9fbGlzdF9mcmVlKCZjbC0+ZGV2LT53cml0ZV9saXN0LCBjbCk7CisJbWVpX2lvX2xpc3RfZnJlZSgmY2wtPmRldi0+d3JpdGVfd2FpdGluZ19saXN0LCBjbCk7CiAJbWVpX2lvX2xpc3RfZmx1c2goJmNsLT5kZXYtPmN0cmxfd3JfbGlzdCwgY2wpOwogCW1laV9pb19saXN0X2ZsdXNoKCZjbC0+ZGV2LT5jdHJsX3JkX2xpc3QsIGNsKTsKIAltZWlfaW9fbGlzdF9mbHVzaCgmY2wtPmRldi0+YW10aGlmX2NtZF9saXN0LCBjbCk7CkBAIC0yNTQsMTAgKzI5Nyw5IEBACiBzdHJ1Y3QgbWVpX2NsX2NiICptZWlfY2xfZmluZF9yZWFkX2NiKHN0cnVjdCBtZWlfY2wgKmNsKQogewogCXN0cnVjdCBtZWlfZGV2aWNlICpkZXYgPSBjbC0+ZGV2OwotCXN0cnVjdCBtZWlfY2xfY2IgKmNiID0gTlVMTDsKLQlzdHJ1Y3QgbWVpX2NsX2NiICpuZXh0ID0gTlVMTDsKKwlzdHJ1Y3QgbWVpX2NsX2NiICpjYjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjYiwgbmV4dCwgJmRldi0+cmVhZF9saXN0Lmxpc3QsIGxpc3QpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjYiwgJmRldi0+cmVhZF9saXN0Lmxpc3QsIGxpc3QpCiAJCWlmIChtZWlfY2xfY21wX2lkKGNsLCBjYi0+Y2wpKQogCQkJcmV0dXJuIGNiOwogCXJldHVybiBOVUxMOwpAQCAtMzc1LDYgKzQxNywyMyBAQAogCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CiB9CiAKKy8qKgorICogbWVpX2hidWZfYWNxdWlyZTogdHJ5IHRvIGFjcXVpcmUgaG9zdCBidWZmZXIKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogcmV0dXJucyB0cnVlIGlmIGhvc3QgYnVmZmVyIHdhcyBhY3F1aXJlZAorICovCitib29sIG1laV9oYnVmX2FjcXVpcmUoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwlpZiAoIWRldi0+aGJ1Zl9pc19yZWFkeSkgeworCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImhidWYgaXMgbm90IHJlYWR5XG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWRldi0+aGJ1Zl9pc19yZWFkeSA9IGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CiAKIC8qKgogICogbWVpX2NsX2Rpc2Nvbm5lY3QgLSBkaXNjb25uZWN0IGhvc3QgY2xpZW50IGZyb20gdGhlIG1lIG9uZQpAQCAtNDA2LDggKzQ2NSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJY2ItPmZvcF90eXBlID0gTUVJX0ZPUF9DTE9TRTsKLQlpZiAoZGV2LT5oYnVmX2lzX3JlYWR5KSB7Ci0JCWRldi0+aGJ1Zl9pc19yZWFkeSA9IGZhbHNlOworCWlmIChtZWlfaGJ1Zl9hY3F1aXJlKGRldikpIHsKIAkJaWYgKG1laV9oYm1fY2xfZGlzY29ubmVjdF9yZXEoZGV2LCBjbCkpIHsKIAkJCXJldHMgPSAtRU5PREVWOwogCQkJY2xfZXJyKGRldiwgY2wsICJmYWlsZWQgdG8gZGlzY29ubmVjdC5cbiIpOwpAQCAtNDYxLDE3ICs1MTksMTcgQEAKIGJvb2wgbWVpX2NsX2lzX290aGVyX2Nvbm5lY3Rpbmcoc3RydWN0IG1laV9jbCAqY2wpCiB7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgbWVpX2NsICpwb3M7Ci0Jc3RydWN0IG1laV9jbCAqbmV4dDsKKwlzdHJ1Y3QgbWVpX2NsICpvY2w7IC8qIHRoZSBvdGhlciBjbGllbnQgKi8KIAogCWlmIChXQVJOX09OKCFjbCB8fCAhY2wtPmRldikpCiAJCXJldHVybiBmYWxzZTsKIAogCWRldiA9IGNsLT5kZXY7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCBuZXh0LCAmZGV2LT5maWxlX2xpc3QsIGxpbmspIHsKLQkJaWYgKChwb3MtPnN0YXRlID09IE1FSV9GSUxFX0NPTk5FQ1RJTkcpICYmCi0JCSAgICAocG9zICE9IGNsKSAmJiBjbC0+bWVfY2xpZW50X2lkID09IHBvcy0+bWVfY2xpZW50X2lkKQorCWxpc3RfZm9yX2VhY2hfZW50cnkob2NsLCAmZGV2LT5maWxlX2xpc3QsIGxpbmspIHsKKwkJaWYgKG9jbC0+c3RhdGUgPT0gTUVJX0ZJTEVfQ09OTkVDVElORyAmJgorCQkgICAgb2NsICE9IGNsICYmCisJCSAgICBjbC0+bWVfY2xpZW50X2lkID09IG9jbC0+bWVfY2xpZW50X2lkKQogCQkJcmV0dXJuIHRydWU7CiAKIAl9CkBAIC01MDUsMTEgKzU2MywxMCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQljYi0+Zm9wX3R5cGUgPSBNRUlfRk9QX0lPQ1RMOworCWNiLT5mb3BfdHlwZSA9IE1FSV9GT1BfQ09OTkVDVDsKIAotCWlmIChkZXYtPmhidWZfaXNfcmVhZHkgJiYgIW1laV9jbF9pc19vdGhlcl9jb25uZWN0aW5nKGNsKSkgewotCQlkZXYtPmhidWZfaXNfcmVhZHkgPSBmYWxzZTsKLQorCS8qIHJ1biBoYnVmIGFjcXVpcmUgbGFzdCBzbyB3ZSBkb24ndCBoYXZlIHRvIHVuZG8gKi8KKwlpZiAoIW1laV9jbF9pc19vdGhlcl9jb25uZWN0aW5nKGNsKSAmJiBtZWlfaGJ1Zl9hY3F1aXJlKGRldikpIHsKIAkJaWYgKG1laV9oYm1fY2xfY29ubmVjdF9yZXEoZGV2LCBjbCkpIHsKIAkJCXJldHMgPSAtRU5PREVWOwogCQkJZ290byBvdXQ7CkBAIC01MjEsMTggKzU3OCwxOSBAQAogCX0KIAogCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7Ci0JcmV0cyA9IHdhaXRfZXZlbnRfdGltZW91dChkZXYtPndhaXRfcmVjdmRfbXNnLAotCQkJCSAoY2wtPnN0YXRlID09IE1FSV9GSUxFX0NPTk5FQ1RFRCB8fAotCQkJCSAgY2wtPnN0YXRlID09IE1FSV9GSUxFX0RJU0NPTk5FQ1RFRCksCi0JCQkJIG1laV9zZWNzX3RvX2ppZmZpZXMoTUVJX0NMX0NPTk5FQ1RfVElNRU9VVCkpOworCXdhaXRfZXZlbnRfdGltZW91dChkZXYtPndhaXRfcmVjdmRfbXNnLAorCQkJKGNsLT5zdGF0ZSA9PSBNRUlfRklMRV9DT05ORUNURUQgfHwKKwkJCSBjbC0+c3RhdGUgPT0gTUVJX0ZJTEVfRElTQ09OTkVDVEVEKSwKKwkJCW1laV9zZWNzX3RvX2ppZmZpZXMoTUVJX0NMX0NPTk5FQ1RfVElNRU9VVCkpOwogCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOwogCiAJaWYgKGNsLT5zdGF0ZSAhPSBNRUlfRklMRV9DT05ORUNURUQpIHsKLQkJcmV0cyA9IC1FRkFVTFQ7CisJCS8qIHNvbWV0aGluZyB3ZW50IHJlYWxseSB3cm9uZyAqLworCQlpZiAoIWNsLT5zdGF0dXMpCisJCQljbC0+c3RhdHVzID0gLUVGQVVMVDsKIAogCQltZWlfaW9fbGlzdF9mbHVzaCgmZGV2LT5jdHJsX3JkX2xpc3QsIGNsKTsKIAkJbWVpX2lvX2xpc3RfZmx1c2goJmRldi0+Y3RybF93cl9saXN0LCBjbCk7Ci0JCWdvdG8gb3V0OwogCX0KIAogCXJldHMgPSBjbC0+c3RhdHVzOwpAQCAtNTU0LDcgKzYxMiw4IEBACiBpbnQgbWVpX2NsX2Zsb3dfY3RybF9jcmVkcyhzdHJ1Y3QgbWVpX2NsICpjbCkKIHsKIAlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2OwotCWludCBpOworCXN0cnVjdCBtZWlfbWVfY2xpZW50ICptZV9jbDsKKwlpbnQgaWQ7CiAKIAlpZiAoV0FSTl9PTighY2wgfHwgIWNsLT5kZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTU2NywxOSArNjI2LDE5IEBACiAJaWYgKGNsLT5tZWlfZmxvd19jdHJsX2NyZWRzID4gMCkKIAkJcmV0dXJuIDE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tZV9jbGllbnRzX251bTsgaSsrKSB7Ci0JCXN0cnVjdCBtZWlfbWVfY2xpZW50ICAqbWVfY2wgPSAmZGV2LT5tZV9jbGllbnRzW2ldOwotCQlpZiAobWVfY2wtPmNsaWVudF9pZCA9PSBjbC0+bWVfY2xpZW50X2lkKSB7Ci0JCQlpZiAobWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMpIHsKLQkJCQlpZiAoV0FSTl9PTihtZV9jbC0+cHJvcHMuc2luZ2xlX3JlY3ZfYnVmID09IDApKQotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KKwlpZCA9IG1laV9tZV9jbF9ieV9pZChkZXYsIGNsLT5tZV9jbGllbnRfaWQpOworCWlmIChpZCA8IDApIHsKKwkJY2xfZXJyKGRldiwgY2wsICJubyBzdWNoIG1lIGNsaWVudCAlZFxuIiwgY2wtPm1lX2NsaWVudF9pZCk7CisJCXJldHVybiBpZDsKIAl9Ci0JcmV0dXJuIC1FTk9FTlQ7CisKKwltZV9jbCA9ICZkZXYtPm1lX2NsaWVudHNbaWRdOworCWlmIChtZV9jbC0+bWVpX2Zsb3dfY3RybF9jcmVkcykgeworCQlpZiAoV0FSTl9PTihtZV9jbC0+cHJvcHMuc2luZ2xlX3JlY3ZfYnVmID09IDApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC01OTUsMzIgKzY1NCwzMSBAQAogaW50IG1laV9jbF9mbG93X2N0cmxfcmVkdWNlKHN0cnVjdCBtZWlfY2wgKmNsKQogewogCXN0cnVjdCBtZWlfZGV2aWNlICpkZXY7Ci0JaW50IGk7CisJc3RydWN0IG1laV9tZV9jbGllbnQgKm1lX2NsOworCWludCBpZDsKIAogCWlmIChXQVJOX09OKCFjbCB8fCAhY2wtPmRldikpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZGV2ID0gY2wtPmRldjsKIAotCWlmICghZGV2LT5tZV9jbGllbnRzX251bSkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tZV9jbGllbnRzX251bTsgaSsrKSB7Ci0JCXN0cnVjdCBtZWlfbWVfY2xpZW50ICAqbWVfY2wgPSAmZGV2LT5tZV9jbGllbnRzW2ldOwotCQlpZiAobWVfY2wtPmNsaWVudF9pZCA9PSBjbC0+bWVfY2xpZW50X2lkKSB7Ci0JCQlpZiAobWVfY2wtPnByb3BzLnNpbmdsZV9yZWN2X2J1ZiAhPSAwKSB7Ci0JCQkJaWYgKFdBUk5fT04obWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMgPD0gMCkpCi0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCWRldi0+bWVfY2xpZW50c1tpXS5tZWlfZmxvd19jdHJsX2NyZWRzLS07Ci0JCQl9IGVsc2UgewotCQkJCWlmIChXQVJOX09OKGNsLT5tZWlfZmxvd19jdHJsX2NyZWRzIDw9IDApKQotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQljbC0+bWVpX2Zsb3dfY3RybF9jcmVkcy0tOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KKwlpZCA9IG1laV9tZV9jbF9ieV9pZChkZXYsIGNsLT5tZV9jbGllbnRfaWQpOworCWlmIChpZCA8IDApIHsKKwkJY2xfZXJyKGRldiwgY2wsICJubyBzdWNoIG1lIGNsaWVudCAlZFxuIiwgY2wtPm1lX2NsaWVudF9pZCk7CisJCXJldHVybiBpZDsKIAl9Ci0JcmV0dXJuIC1FTk9FTlQ7CisKKwltZV9jbCA9ICZkZXYtPm1lX2NsaWVudHNbaWRdOworCWlmIChtZV9jbC0+cHJvcHMuc2luZ2xlX3JlY3ZfYnVmICE9IDApIHsKKwkJaWYgKFdBUk5fT04obWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMgPD0gMCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMtLTsKKwl9IGVsc2UgeworCQlpZiAoV0FSTl9PTihjbC0+bWVpX2Zsb3dfY3RybF9jcmVkcyA8PSAwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQljbC0+bWVpX2Zsb3dfY3RybF9jcmVkcy0tOworCX0KKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC02NTIsNyArNzEwLDcgQEAKIAlpID0gbWVpX21lX2NsX2J5X2lkKGRldiwgY2wtPm1lX2NsaWVudF9pZCk7CiAJaWYgKGkgPCAwKSB7CiAJCWNsX2VycihkZXYsIGNsLCAibm8gc3VjaCBtZSBjbGllbnQgJWRcbiIsIGNsLT5tZV9jbGllbnRfaWQpOwotCQlyZXR1cm4gIC1FTk9ERVY7CisJCXJldHVybiAgLUVOT1RUWTsKIAl9CiAKIAljYiA9IG1laV9pb19jYl9pbml0KGNsLCBOVUxMKTsKQEAgLTY2Niw4ICs3MjQsNyBAQAogCQlnb3RvIGVycjsKIAogCWNiLT5mb3BfdHlwZSA9IE1FSV9GT1BfUkVBRDsKLQlpZiAoZGV2LT5oYnVmX2lzX3JlYWR5KSB7Ci0JCWRldi0+aGJ1Zl9pc19yZWFkeSA9IGZhbHNlOworCWlmIChtZWlfaGJ1Zl9hY3F1aXJlKGRldikpIHsKIAkJaWYgKG1laV9oYm1fY2xfZmxvd19jb250cm9sX3JlcShkZXYsIGNsKSkgewogCQkJY2xfZXJyKGRldiwgY2wsICJmbG93IGNvbnRyb2wgc2VuZCBmYWlsZWRcbiIpOwogCQkJcmV0cyA9IC1FTk9ERVY7CkBAIC02ODcsMjcgKzc0NCwyNiBAQAogfQogCiAvKioKLSAqIG1laV9jbF9pcnFfd3JpdGVfY29tcGxldGUgLSB3cml0ZSBhIG1lc3NhZ2UgdG8gZGV2aWNlCisgKiBtZWlfY2xfaXJxX3dyaXRlIC0gd3JpdGUgYSBtZXNzYWdlIHRvIGRldmljZQogICoJZnJvbSB0aGUgaW50ZXJydXB0IHRocmVhZCBjb250ZXh0CiAgKgogICogQGNsOiBjbGllbnQKICAqIEBjYjogY2FsbGJhY2sgYmxvY2suCi0gKiBAc2xvdHM6IGZyZWUgc2xvdHMuCiAgKiBAY21wbF9saXN0OiBjb21wbGV0ZSBsaXN0LgogICoKICAqIHJldHVybnMgMCwgT0s7IG90aGVyd2lzZSBlcnJvci4KICAqLwotaW50IG1laV9jbF9pcnFfd3JpdGVfY29tcGxldGUoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiLAotCQkJCSAgICAgczMyICpzbG90cywgc3RydWN0IG1laV9jbF9jYiAqY21wbF9saXN0KQoraW50IG1laV9jbF9pcnFfd3JpdGUoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiLAorCQkgICAgIHN0cnVjdCBtZWlfY2xfY2IgKmNtcGxfbGlzdCkKIHsKIAlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2OwogCXN0cnVjdCBtZWlfbXNnX2RhdGEgKmJ1ZjsKIAlzdHJ1Y3QgbWVpX21zZ19oZHIgbWVpX2hkcjsKIAlzaXplX3QgbGVuOwogCXUzMiBtc2dfc2xvdHM7CisJaW50IHNsb3RzOwogCWludCByZXRzOwogCi0KIAlpZiAoV0FSTl9PTighY2wgfHwgIWNsLT5kZXYpKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtNzI0LDYgKzc4MCw3IEBACiAJCXJldHVybiAwOwogCX0KIAorCXNsb3RzID0gbWVpX2hidWZfZW1wdHlfc2xvdHMoZGV2KTsKIAlsZW4gPSBidWYtPnNpemUgLSBjYi0+YnVmX2lkeDsKIAltc2dfc2xvdHMgPSBtZWlfZGF0YTJzbG90cyhsZW4pOwogCkBAIC03MzIsMTMgKzc4OSwxMyBAQAogCW1laV9oZHIucmVzZXJ2ZWQgPSAwOwogCW1laV9oZHIuaW50ZXJuYWwgPSBjYi0+aW50ZXJuYWw7CiAKLQlpZiAoKnNsb3RzID49IG1zZ19zbG90cykgeworCWlmIChzbG90cyA+PSBtc2dfc2xvdHMpIHsKIAkJbWVpX2hkci5sZW5ndGggPSBsZW47CiAJCW1laV9oZHIubXNnX2NvbXBsZXRlID0gMTsKIAkvKiBTcGxpdCB0aGUgbWVzc2FnZSBvbmx5IGlmIHdlIGNhbiB3cml0ZSB0aGUgd2hvbGUgaG9zdCBidWZmZXIgKi8KLQl9IGVsc2UgaWYgKCpzbG90cyA9PSBkZXYtPmhidWZfZGVwdGgpIHsKLQkJbXNnX3Nsb3RzID0gKnNsb3RzOwotCQlsZW4gPSAoKnNsb3RzICogc2l6ZW9mKHUzMikpIC0gc2l6ZW9mKHN0cnVjdCBtZWlfbXNnX2hkcik7CisJfSBlbHNlIGlmIChzbG90cyA9PSBkZXYtPmhidWZfZGVwdGgpIHsKKwkJbXNnX3Nsb3RzID0gc2xvdHM7CisJCWxlbiA9IChzbG90cyAqIHNpemVvZih1MzIpKSAtIHNpemVvZihzdHJ1Y3QgbWVpX21zZ19oZHIpOwogCQltZWlfaGRyLmxlbmd0aCA9IGxlbjsKIAkJbWVpX2hkci5tc2dfY29tcGxldGUgPSAwOwogCX0gZWxzZSB7CkBAIC03NDksNyArODA2LDYgQEAKIAljbF9kYmcoZGV2LCBjbCwgImJ1Zjogc2l6ZSA9ICVkIGlkeCA9ICVsdVxuIiwKIAkJCWNiLT5yZXF1ZXN0X2J1ZmZlci5zaXplLCBjYi0+YnVmX2lkeCk7CiAKLQkqc2xvdHMgLT0gIG1zZ19zbG90czsKIAlyZXRzID0gbWVpX3dyaXRlX21lc3NhZ2UoZGV2LCAmbWVpX2hkciwgYnVmLT5kYXRhICsgY2ItPmJ1Zl9pZHgpOwogCWlmIChyZXRzKSB7CiAJCWNsLT5zdGF0dXMgPSByZXRzOwpAQCAtODAyLDIxICs4NTgsMjkgQEAKIAogCiAJY2ItPmZvcF90eXBlID0gTUVJX0ZPUF9XUklURTsKKwljYi0+YnVmX2lkeCA9IDA7CisJY2wtPndyaXRpbmdfc3RhdGUgPSBNRUlfSURMRTsKKworCW1laV9oZHIuaG9zdF9hZGRyID0gY2wtPmhvc3RfY2xpZW50X2lkOworCW1laV9oZHIubWVfYWRkciA9IGNsLT5tZV9jbGllbnRfaWQ7CisJbWVpX2hkci5yZXNlcnZlZCA9IDA7CisJbWVpX2hkci5tc2dfY29tcGxldGUgPSAwOworCW1laV9oZHIuaW50ZXJuYWwgPSBjYi0+aW50ZXJuYWw7CiAKIAlyZXRzID0gbWVpX2NsX2Zsb3dfY3RybF9jcmVkcyhjbCk7CiAJaWYgKHJldHMgPCAwKQogCQlnb3RvIGVycjsKIAotCS8qIEhvc3QgYnVmZmVyIGlzIG5vdCByZWFkeSwgd2UgcXVldWUgdGhlIHJlcXVlc3QgKi8KLQlpZiAocmV0cyA9PSAwIHx8ICFkZXYtPmhidWZfaXNfcmVhZHkpIHsKLQkJY2ItPmJ1Zl9pZHggPSAwOwotCQkvKiB1bnNldGluZyBjb21wbGV0ZSB3aWxsIGVucXVldWUgdGhlIGNiIGZvciB3cml0ZSAqLwotCQltZWlfaGRyLm1zZ19jb21wbGV0ZSA9IDA7CisJaWYgKHJldHMgPT0gMCkgeworCQljbF9kYmcoZGV2LCBjbCwgIk5vIGZsb3cgY29udHJvbCBjcmVkZW50aWFsczogbm90IHNlbmRpbmcuXG4iKTsKIAkJcmV0cyA9IGJ1Zi0+c2l6ZTsKIAkJZ290byBvdXQ7CiAJfQotCi0JZGV2LT5oYnVmX2lzX3JlYWR5ID0gZmFsc2U7CisJaWYgKCFtZWlfaGJ1Zl9hY3F1aXJlKGRldikpIHsKKwkJY2xfZGJnKGRldiwgY2wsICJDYW5ub3QgYWNxdWlyZSB0aGUgaG9zdCBidWZmZXI6IG5vdCBzZW5kaW5nLlxuIik7CisJCXJldHMgPSBidWYtPnNpemU7CisJCWdvdG8gb3V0OworCX0KIAogCS8qIENoZWNrIGZvciBhIG1heGltdW0gbGVuZ3RoICovCiAJaWYgKGJ1Zi0+c2l6ZSA+IG1laV9oYnVmX21heF9sZW4oZGV2KSkgewpAQCAtODI3LDEyICs4OTEsNiBAQAogCQltZWlfaGRyLm1zZ19jb21wbGV0ZSA9IDE7CiAJfQogCi0JbWVpX2hkci5ob3N0X2FkZHIgPSBjbC0+aG9zdF9jbGllbnRfaWQ7Ci0JbWVpX2hkci5tZV9hZGRyID0gY2wtPm1lX2NsaWVudF9pZDsKLQltZWlfaGRyLnJlc2VydmVkID0gMDsKLQltZWlfaGRyLmludGVybmFsID0gY2ItPmludGVybmFsOwotCi0KIAlyZXRzID0gbWVpX3dyaXRlX21lc3NhZ2UoZGV2LCAmbWVpX2hkciwgYnVmLT5kYXRhKTsKIAlpZiAocmV0cykKIAkJZ290byBlcnI7CkBAIC04NDAsMTMgKzg5OCwxMiBAQAogCWNsLT53cml0aW5nX3N0YXRlID0gTUVJX1dSSVRJTkc7CiAJY2ItPmJ1Zl9pZHggPSBtZWlfaGRyLmxlbmd0aDsKIAotCXJldHMgPSBidWYtPnNpemU7CiBvdXQ6CiAJaWYgKG1laV9oZHIubXNnX2NvbXBsZXRlKSB7Ci0JCWlmIChtZWlfY2xfZmxvd19jdHJsX3JlZHVjZShjbCkpIHsKLQkJCXJldHMgPSAtRU5PREVWOworCQlyZXRzID0gbWVpX2NsX2Zsb3dfY3RybF9yZWR1Y2UoY2wpOworCQlpZiAocmV0cyA8IDApCiAJCQlnb3RvIGVycjsKLQkJfQorCiAJCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmZGV2LT53cml0ZV93YWl0aW5nX2xpc3QubGlzdCk7CiAJfSBlbHNlIHsKIAkJbGlzdF9hZGRfdGFpbCgmY2ItPmxpc3QsICZkZXYtPndyaXRlX2xpc3QubGlzdCk7CkBAIC04NTYsMTUgKzkxMywxOCBAQAogCWlmIChibG9ja2luZyAmJiBjbC0+d3JpdGluZ19zdGF0ZSAhPSBNRUlfV1JJVEVfQ09NUExFVEUpIHsKIAogCQltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOwotCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNsLT50eF93YWl0LAotCQkJY2wtPndyaXRpbmdfc3RhdGUgPT0gTUVJX1dSSVRFX0NPTVBMRVRFKSkgewotCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQkJcmV0cyA9IC1FSU5UUjsKLQkJCQllbHNlCi0JCQkJCXJldHMgPSAtRVJFU1RBUlRTWVM7Ci0JCX0KKwkJcmV0cyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShjbC0+dHhfd2FpdCwKKwkJCQljbC0+d3JpdGluZ19zdGF0ZSA9PSBNRUlfV1JJVEVfQ09NUExFVEUpOwogCQltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKKwkJLyogd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlIHJldHVybnMgLUVSRVNUQVJUU1lTICovCisJCWlmIChyZXRzKSB7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJcmV0cyA9IC1FSU5UUjsKKwkJCWdvdG8gZXJyOworCQl9CiAJfQorCisJcmV0cyA9IGJ1Zi0+c2l6ZTsKIGVycjoKIAlyZXR1cm4gcmV0czsKIH0KQEAgLTkwNSw5ICs5NjUsOSBAQAogCiB2b2lkIG1laV9jbF9hbGxfZGlzY29ubmVjdChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQogewotCXN0cnVjdCBtZWlfY2wgKmNsLCAqbmV4dDsKKwlzdHJ1Y3QgbWVpX2NsICpjbDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbCwgbmV4dCwgJmRldi0+ZmlsZV9saXN0LCBsaW5rKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJmRldi0+ZmlsZV9saXN0LCBsaW5rKSB7CiAJCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0RJU0NPTk5FQ1RFRDsKIAkJY2wtPm1laV9mbG93X2N0cmxfY3JlZHMgPSAwOwogCQljbC0+dGltZXJfY291bnQgPSAwOwpAQCAtOTIyLDggKzk4Miw4IEBACiAgKi8KIHZvaWQgbWVpX2NsX2FsbF93YWtldXAoc3RydWN0IG1laV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbWVpX2NsICpjbCwgKm5leHQ7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNsLCBuZXh0LCAmZGV2LT5maWxlX2xpc3QsIGxpbmspIHsKKwlzdHJ1Y3QgbWVpX2NsICpjbDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsLCAmZGV2LT5maWxlX2xpc3QsIGxpbmspIHsKIAkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmNsLT5yeF93YWl0KSkgewogCQkJY2xfZGJnKGRldiwgY2wsICJXYWtpbmcgdXAgcmVhZGluZyBjbGllbnQhXG4iKTsKIAkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2wtPnJ4X3dhaXQpOwpAQCAtOTQyLDIwICsxMDAyLDggQEAKICAqLwogdm9pZCBtZWlfY2xfYWxsX3dyaXRlX2NsZWFyKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG1laV9jbF9jYiAqY2IsICpuZXh0OwotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Ci0KLQlsaXN0ID0gJmRldi0+d3JpdGVfbGlzdC5saXN0OwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjYiwgbmV4dCwgbGlzdCwgbGlzdCkgewotCQlsaXN0X2RlbCgmY2ItPmxpc3QpOwotCQltZWlfaW9fY2JfZnJlZShjYik7Ci0JfQotCi0JbGlzdCA9ICZkZXYtPndyaXRlX3dhaXRpbmdfbGlzdC5saXN0OwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjYiwgbmV4dCwgbGlzdCwgbGlzdCkgewotCQlsaXN0X2RlbCgmY2ItPmxpc3QpOwotCQltZWlfaW9fY2JfZnJlZShjYik7Ci0JfQorCW1laV9pb19saXN0X2ZyZWUoJmRldi0+d3JpdGVfbGlzdCwgTlVMTCk7CisJbWVpX2lvX2xpc3RfZnJlZSgmZGV2LT53cml0ZV93YWl0aW5nX2xpc3QsIE5VTEwpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvY2xpZW50LmggYi9kcml2ZXJzL21pc2MvbWVpL2NsaWVudC5oCmluZGV4IGM4Mzk2ZTUuLjk2ZDVkZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvY2xpZW50LmgKKysrIGIvZHJpdmVycy9taXNjL21laS9jbGllbnQuaApAQCAtNDUsOCArNDUsNiBAQAogewogCUlOSVRfTElTVF9IRUFEKCZsaXN0LT5saXN0KTsKIH0KLXZvaWQgbWVpX2lvX2xpc3RfZmx1c2goc3RydWN0IG1laV9jbF9jYiAqbGlzdCwgc3RydWN0IG1laV9jbCAqY2wpOwotCiAvKgogICogTUVJIEhvc3QgQ2xpZW50IEZ1bmN0aW9ucwogICovCkBAIC02MSwyMiArNTksNiBAQAogaW50IG1laV9jbF9mbHVzaF9xdWV1ZXMoc3RydWN0IG1laV9jbCAqY2wpOwogc3RydWN0IG1laV9jbF9jYiAqbWVpX2NsX2ZpbmRfcmVhZF9jYihzdHJ1Y3QgbWVpX2NsICpjbCk7CiAKLS8qKgotICogbWVpX2NsX2NtcF9pZCAtIHRlbGxzIGlmIGZpbGUgcHJpdmF0ZSBkYXRhIGhhdmUgc2FtZSBpZAotICoKLSAqIEBmZTE6IHByaXZhdGUgZGF0YSBvZiAxLiBmaWxlIG9iamVjdAotICogQGZlMjogcHJpdmF0ZSBkYXRhIG9mIDIuIGZpbGUgb2JqZWN0Ci0gKgotICogcmV0dXJucyB0cnVlICAtIGlmIGlkcyBhcmUgdGhlIHNhbWUgYW5kIG5vdCBOVUxMCi0gKi8KLXN0YXRpYyBpbmxpbmUgYm9vbCBtZWlfY2xfY21wX2lkKGNvbnN0IHN0cnVjdCBtZWlfY2wgKmNsMSwKLQkJCQljb25zdCBzdHJ1Y3QgbWVpX2NsICpjbDIpCi17Ci0JcmV0dXJuIGNsMSAmJiBjbDIgJiYKLQkJKGNsMS0+aG9zdF9jbGllbnRfaWQgPT0gY2wyLT5ob3N0X2NsaWVudF9pZCkgJiYKLQkJKGNsMS0+bWVfY2xpZW50X2lkID09IGNsMi0+bWVfY2xpZW50X2lkKTsKLX0KLQogCiBpbnQgbWVpX2NsX2Zsb3dfY3RybF9jcmVkcyhzdHJ1Y3QgbWVpX2NsICpjbCk7CiAKQEAgLTg2LDE1ICs2OCwxNSBAQAogICovCiBzdGF0aWMgaW5saW5lIGJvb2wgbWVpX2NsX2lzX2Nvbm5lY3RlZChzdHJ1Y3QgbWVpX2NsICpjbCkKIHsKLQlyZXR1cm4gKGNsLT5kZXYgJiYKKwlyZXR1cm4gIGNsLT5kZXYgJiYKIAkJY2wtPmRldi0+ZGV2X3N0YXRlID09IE1FSV9ERVZfRU5BQkxFRCAmJgotCQljbC0+c3RhdGUgPT0gTUVJX0ZJTEVfQ09OTkVDVEVEKTsKKwkJY2wtPnN0YXRlID09IE1FSV9GSUxFX0NPTk5FQ1RFRDsKIH0KIHN0YXRpYyBpbmxpbmUgYm9vbCBtZWlfY2xfaXNfdHJhbnNpdGlvbmluZyhzdHJ1Y3QgbWVpX2NsICpjbCkKIHsKLQlyZXR1cm4gKE1FSV9GSUxFX0lOSVRJQUxJWklORyA9PSBjbC0+c3RhdGUgfHwKKwlyZXR1cm4gIE1FSV9GSUxFX0lOSVRJQUxJWklORyA9PSBjbC0+c3RhdGUgfHwKIAkJTUVJX0ZJTEVfRElTQ09OTkVDVEVEID09IGNsLT5zdGF0ZSB8fAotCQlNRUlfRklMRV9ESVNDT05ORUNUSU5HID09IGNsLT5zdGF0ZSk7CisJCU1FSV9GSUxFX0RJU0NPTk5FQ1RJTkcgPT0gY2wtPnN0YXRlOwogfQogCiBib29sIG1laV9jbF9pc19vdGhlcl9jb25uZWN0aW5nKHN0cnVjdCBtZWlfY2wgKmNsKTsKQEAgLTEwMiw4ICs4NCw4IEBACiBpbnQgbWVpX2NsX2Nvbm5lY3Qoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBmaWxlICpmaWxlKTsKIGludCBtZWlfY2xfcmVhZF9zdGFydChzdHJ1Y3QgbWVpX2NsICpjbCwgc2l6ZV90IGxlbmd0aCk7CiBpbnQgbWVpX2NsX3dyaXRlKHN0cnVjdCBtZWlfY2wgKmNsLCBzdHJ1Y3QgbWVpX2NsX2NiICpjYiwgYm9vbCBibG9ja2luZyk7Ci1pbnQgbWVpX2NsX2lycV93cml0ZV9jb21wbGV0ZShzdHJ1Y3QgbWVpX2NsICpjbCwgc3RydWN0IG1laV9jbF9jYiAqY2IsCi0JCQkJczMyICpzbG90cywgc3RydWN0IG1laV9jbF9jYiAqY21wbF9saXN0KTsKK2ludCBtZWlfY2xfaXJxX3dyaXRlKHN0cnVjdCBtZWlfY2wgKmNsLCBzdHJ1Y3QgbWVpX2NsX2NiICpjYiwKKwkJICAgICBzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QpOwogCiB2b2lkIG1laV9jbF9jb21wbGV0ZShzdHJ1Y3QgbWVpX2NsICpjbCwgc3RydWN0IG1laV9jbF9jYiAqY2IpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2RlYnVnZnMuYyBiL2RyaXZlcnMvbWlzYy9tZWkvZGVidWdmcy5jCmluZGV4IGEzYWUxNTQuLmNlZDViNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvZGVidWdmcy5jCkBAIC03NSw2ICs3NSw1NCBAQAogCS5sbHNlZWsgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogfTsKIAorc3RhdGljIHNzaXplX3QgbWVpX2RiZ2ZzX3JlYWRfYWN0aXZlKHN0cnVjdCBmaWxlICpmcCwgY2hhciBfX3VzZXIgKnVidWYsCisJCQkJCXNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2ID0gZnAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbWVpX2NsICpjbDsKKwljb25zdCBzaXplX3QgYnVmc3ogPSAxMDI0OworCWNoYXIgKmJ1ZjsKKwlpbnQgaSA9IDA7CisJaW50IHBvcyA9IDA7CisJaW50IHJldDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkiICB8bWV8aG9zdHxzdGF0ZXxyZHx3cnxcbiIpOworCisJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisKKwkvKiAgaWYgdGhlIGRyaXZlciBpcyBub3QgZW5hYmxlZCB0aGUgbGlzdCB3b24ndCBiIGNvbnNpdGVudCAqLworCWlmIChkZXYtPmRldl9zdGF0ZSAhPSBNRUlfREVWX0VOQUJMRUQpCisJCWdvdG8gb3V0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJmRldi0+ZmlsZV9saXN0LCBsaW5rKSB7CisKKwkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJIiUyZHwlMmR8JTRkfCU1ZHwlMmR8JTJkfFxuIiwKKwkJCWksIGNsLT5tZV9jbGllbnRfaWQsIGNsLT5ob3N0X2NsaWVudF9pZCwgY2wtPnN0YXRlLAorCQkJY2wtPnJlYWRpbmdfc3RhdGUsIGNsLT53cml0aW5nX3N0YXRlKTsKKwkJaSsrOworCX0KK291dDoKKwltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIGNudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWVpX2RiZ2ZzX2ZvcHNfYWN0aXZlID0geworCS5vcGVuID0gc2ltcGxlX29wZW4sCisJLnJlYWQgPSBtZWlfZGJnZnNfcmVhZF9hY3RpdmUsCisJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCit9OworCiBzdGF0aWMgc3NpemVfdCBtZWlfZGJnZnNfcmVhZF9kZXZzdGF0ZShzdHJ1Y3QgZmlsZSAqZnAsIGNoYXIgX191c2VyICp1YnVmLAogCQkJCQlzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCiB7CkBAIC0xMjgsNiArMTc2LDEyIEBACiAJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAibWVjbGllbnRzOiByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBlcnI7CiAJfQorCWYgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJhY3RpdmUiLCBTX0lSVVNSLCBkaXIsCisJCQkJZGV2LCAmbWVpX2RiZ2ZzX2ZvcHNfYWN0aXZlKTsKKwlpZiAoIWYpIHsKKwkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJtZWNsaWVudHM6IHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycjsKKwl9CiAJZiA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImRldnN0YXRlIiwgU19JUlVTUiwgZGlyLAogCQkJCWRldiwgJm1laV9kYmdmc19mb3BzX2RldnN0YXRlKTsKIAlpZiAoIWYpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvaGJtLmMgYi9kcml2ZXJzL21pc2MvbWVpL2hibS5jCmluZGV4IDI4Y2Q3NGMuLjQ5NjAyODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvaGJtLmMKKysrIGIvZHJpdmVycy9taXNjL21laS9oYm0uYwpAQCAtMjEsNyArMjEsNDEgQEAKIAogI2luY2x1ZGUgIm1laV9kZXYuaCIKICNpbmNsdWRlICJoYm0uaCIKLSNpbmNsdWRlICJody1tZS5oIgorI2luY2x1ZGUgImNsaWVudC5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqbWVpX2NsX2Nvbm5fc3RhdHVzX3N0cihlbnVtIG1laV9jbF9jb25uZWN0X3N0YXR1cyBzdGF0dXMpCit7CisjZGVmaW5lIE1FSV9DTF9DUyhzdGF0dXMpIGNhc2UgTUVJX0NMX0NPTk5fIyNzdGF0dXM6IHJldHVybiAjc3RhdHVzCisJc3dpdGNoIChzdGF0dXMpIHsKKwlNRUlfQ0xfQ1MoU1VDQ0VTUyk7CisJTUVJX0NMX0NTKE5PVF9GT1VORCk7CisJTUVJX0NMX0NTKEFMUkVBRFlfU1RBUlRFRCk7CisJTUVJX0NMX0NTKE9VVF9PRl9SRVNPVVJDRVMpOworCU1FSV9DTF9DUyhNRVNTQUdFX1NNQUxMKTsKKwlkZWZhdWx0OiByZXR1cm4gInVua25vd24iOworCX0KKyN1bmRlZiBNRUlfQ0xfQ0NTCit9CisKKy8qKgorICogbWVpX2NsX2Nvbm5fc3RhdHVzX3RvX2Vycm5vIC0gY29udmVydCBjbGllbnQgY29ubmVjdCByZXNwb25zZQorICogc3RhdHVzIHRvIGVycm9yIGNvZGUKKyAqCisgKiBAc3RhdHVzOiBjbGllbnQgY29ubmVjdCByZXNwb25zZSBzdGF0dXMKKyAqCisgKiByZXR1cm5zIGNvcnJlc3BvbmRpbmcgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IG1laV9jbF9jb25uX3N0YXR1c190b19lcnJubyhlbnVtIG1laV9jbF9jb25uZWN0X3N0YXR1cyBzdGF0dXMpCit7CisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIE1FSV9DTF9DT05OX1NVQ0NFU1M6ICAgICAgICAgIHJldHVybiAwOworCWNhc2UgTUVJX0NMX0NPTk5fTk9UX0ZPVU5EOiAgICAgICAgcmV0dXJuIC1FTk9UVFk7CisJY2FzZSBNRUlfQ0xfQ09OTl9BTFJFQURZX1NUQVJURUQ6ICByZXR1cm4gLUVCVVNZOworCWNhc2UgTUVJX0NMX0NPTk5fT1VUX09GX1JFU09VUkNFUzogcmV0dXJuIC1FQlVTWTsKKwljYXNlIE1FSV9DTF9DT05OX01FU1NBR0VfU01BTEw6ICAgIHJldHVybiAtRUlOVkFMOworCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJfQorfQogCiAvKioKICAqIG1laV9oYm1fbWVfY2xfYWxsb2NhdGUgLSBhbGxvY2F0ZXMgc3RvcmFnZSBmb3IgbWUgY2xpZW50cwpAQCAtMTAwLDMzICsxMzQsNiBAQAogCiAKIC8qKgotICogaXNfdHJlYXRfc3BlY2lhbGx5X2NsaWVudCAtIGNoZWNrcyBpZiB0aGUgbWVzc2FnZSBiZWxvbmdzCi0gKiB0byB0aGUgZmlsZSBwcml2YXRlIGRhdGEuCi0gKgotICogQGNsOiBwcml2YXRlIGRhdGEgb2YgdGhlIGZpbGUgb2JqZWN0Ci0gKiBAcnM6IGNvbm5lY3QgcmVzcG9uc2UgYnVzIG1lc3NhZ2UKLSAqCi0gKi8KLXN0YXRpYyBib29sIGlzX3RyZWF0X3NwZWNpYWxseV9jbGllbnQoc3RydWN0IG1laV9jbCAqY2wsCi0JCXN0cnVjdCBoYm1fY2xpZW50X2Nvbm5lY3RfcmVzcG9uc2UgKnJzKQotewotCWlmIChtZWlfaGJtX2NsX2FkZHJfZXF1YWwoY2wsIHJzKSkgewotCQlpZiAoIXJzLT5zdGF0dXMpIHsKLQkJCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0NPTk5FQ1RFRDsKLQkJCWNsLT5zdGF0dXMgPSAwOwotCi0JCX0gZWxzZSB7Ci0JCQljbC0+c3RhdGUgPSBNRUlfRklMRV9ESVNDT05ORUNURUQ7Ci0JCQljbC0+c3RhdHVzID0gLUVOT0RFVjsKLQkJfQotCQljbC0+dGltZXJfY291bnQgPSAwOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgogICogbWVpX2hibV9pZGxlIC0gc2V0IGhibSB0byBpZGxlIHN0YXRlCiAgKgogICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTE0NywxMyArMTU0LDEzIEBACiAJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZGV2LT53YWl0X3JlY3ZkX21zZywKIAkJCWRldi0+aGJtX3N0YXRlID09IE1FSV9IQk1fSURMRSB8fAogCQkJZGV2LT5oYm1fc3RhdGUgPj0gTUVJX0hCTV9TVEFSVEVELAotCQkJbWVpX3NlY3NfdG9famlmZmllcyhNRUlfSU5URVJPUF9USU1FT1VUKSk7CisJCQltZWlfc2Vjc190b19qaWZmaWVzKE1FSV9IQk1fVElNRU9VVCkpOwogCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOwogCiAJaWYgKHJldCA8PSAwICYmIChkZXYtPmhibV9zdGF0ZSA8PSBNRUlfSEJNX1NUQVJUKSkgewogCQlkZXYtPmhibV9zdGF0ZSA9IE1FSV9IQk1fSURMRTsKIAkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJ3YWl0aW5nIGZvciBtZWkgc3RhcnQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCXJldHVybiAtRVRJTUU7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMjgzLDE3ICsyOTAsMTggQEAKIH0KIAogLyoqCi0gKiBtZWlfaGJtX3N0b3BfcmVxX3ByZXBhcmUgLSBwcmVwYXJlIHN0b3AgcmVxdWVzdCBtZXNzYWdlCisgKiBtZWlfaGJtX3N0b3BfcmVxIC0gc2VuZCBzdG9wIHJlcXVlc3QgbWVzc2FnZQogICoKICAqIEBkZXYgLSBtZWkgZGV2aWNlCi0gKiBAbWVpX2hkciAtIG1laSBtZXNzYWdlIGhlYWRlcgotICogQGRhdGEgLSBoYm0gbWVzc2FnZSBib2R5IGJ1ZmZlcgorICogQGNsOiBjbGllbnQgaW5mbworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAtRUlPIG9uIHdyaXRlIGZhaWx1cmUKICAqLwotc3RhdGljIHZvaWQgbWVpX2hibV9zdG9wX3JlcV9wcmVwYXJlKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBtZWlfbXNnX2hkciAqbWVpX2hkciwgdW5zaWduZWQgY2hhciAqZGF0YSkKK3N0YXRpYyBpbnQgbWVpX2hibV9zdG9wX3JlcShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQogeworCXN0cnVjdCBtZWlfbXNnX2hkciAqbWVpX2hkciA9ICZkZXYtPndyX21zZy5oZHI7CiAJc3RydWN0IGhibV9ob3N0X3N0b3BfcmVxdWVzdCAqcmVxID0KLQkJCShzdHJ1Y3QgaGJtX2hvc3Rfc3RvcF9yZXF1ZXN0ICopZGF0YTsKKwkJCShzdHJ1Y3QgaGJtX2hvc3Rfc3RvcF9yZXF1ZXN0ICopZGV2LT53cl9tc2cuZGF0YTsKIAljb25zdCBzaXplX3QgbGVuID0gc2l6ZW9mKHN0cnVjdCBoYm1faG9zdF9zdG9wX3JlcXVlc3QpOwogCiAJbWVpX2hibV9oZHIobWVpX2hkciwgbGVuKTsKQEAgLTMwMSw2ICszMDksOCBAQAogCW1lbXNldChyZXEsIDAsIGxlbik7CiAJcmVxLT5oYm1fY21kID0gSE9TVF9TVE9QX1JFUV9DTUQ7CiAJcmVxLT5yZWFzb24gPSBEUklWRVJfU1RPUF9SRVFVRVNUOworCisJcmV0dXJuIG1laV93cml0ZV9tZXNzYWdlKGRldiwgbWVpX2hkciwgZGV2LT53cl9tc2cuZGF0YSk7CiB9CiAKIC8qKgpAQCAtMzE5LDggKzMyOSw3IEBACiAJbWVpX2hibV9oZHIobWVpX2hkciwgbGVuKTsKIAltZWlfaGJtX2NsX2hkcihjbCwgTUVJX0ZMT1dfQ09OVFJPTF9DTUQsIGRldi0+d3JfbXNnLmRhdGEsIGxlbik7CiAKLQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgInNlbmRpbmcgZmxvdyBjb250cm9sIGhvc3QgY2xpZW50ID0gJWQsIE1FIGNsaWVudCA9ICVkXG4iLAotCQljbC0+aG9zdF9jbGllbnRfaWQsIGNsLT5tZV9jbGllbnRfaWQpOworCWNsX2RiZyhkZXYsIGNsLCAic2VuZGluZyBmbG93IGNvbnRyb2xcbiIpOwogCiAJcmV0dXJuIG1laV93cml0ZV9tZXNzYWdlKGRldiwgbWVpX2hkciwgZGV2LT53cl9tc2cuZGF0YSk7CiB9CkBAIC0zMzAsMjcgKzMzOSwzNCBAQAogICoKICAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAZmxvdzogZmxvdyBjb250cm9sLgorICoKKyAqIHJldHVybiAwIG9uIHN1Y2Nlc3MsIDwgMCBvdGhlcndpc2UKICAqLwotc3RhdGljIHZvaWQgbWVpX2hibV9hZGRfc2luZ2xlX2Zsb3dfY3JlZHMoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgbWVpX2hibV9hZGRfc2luZ2xlX2Zsb3dfY3JlZHMoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKIAkJCQkgIHN0cnVjdCBoYm1fZmxvd19jb250cm9sICpmbG93KQogewotCXN0cnVjdCBtZWlfbWVfY2xpZW50ICpjbGllbnQ7Ci0JaW50IGk7CisJc3RydWN0IG1laV9tZV9jbGllbnQgKm1lX2NsOworCWludCBpZDsKIAotCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1lX2NsaWVudHNfbnVtOyBpKyspIHsKLQkJY2xpZW50ID0gJmRldi0+bWVfY2xpZW50c1tpXTsKLQkJaWYgKGNsaWVudCAmJiBmbG93LT5tZV9hZGRyID09IGNsaWVudC0+Y2xpZW50X2lkKSB7Ci0JCQlpZiAoY2xpZW50LT5wcm9wcy5zaW5nbGVfcmVjdl9idWYpIHsKLQkJCQljbGllbnQtPm1laV9mbG93X2N0cmxfY3JlZHMrKzsKLQkJCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgInJlY3YgZmxvdyBjdHJsIG1zZyBNRSAlZCAoc2luZ2xlKS5cbiIsCi0JCQkJICAgIGZsb3ctPm1lX2FkZHIpOwotCQkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiZmxvdyBjb250cm9sIGNyZWRlbnRpYWxzID0lZC5cbiIsCi0JCQkJICAgIGNsaWVudC0+bWVpX2Zsb3dfY3RybF9jcmVkcyk7Ci0JCQl9IGVsc2UgewotCQkJCUJVRygpOwkvKiBlcnJvciBpbiBmbG93IGNvbnRyb2wgKi8KLQkJCX0KLQkJfQorCWlkID0gbWVpX21lX2NsX2J5X2lkKGRldiwgZmxvdy0+bWVfYWRkcik7CisJaWYgKGlkIDwgMCkgeworCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIm5vIHN1Y2ggbWUgY2xpZW50ICVkXG4iLAorCQkJZmxvdy0+bWVfYWRkcik7CisJCXJldHVybiBpZDsKIAl9CisKKwltZV9jbCA9ICZkZXYtPm1lX2NsaWVudHNbaWRdOworCWlmIChtZV9jbC0+cHJvcHMuc2luZ2xlX3JlY3ZfYnVmKSB7CisJCW1lX2NsLT5tZWlfZmxvd19jdHJsX2NyZWRzKys7CisJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAicmVjdiBmbG93IGN0cmwgbXNnIE1FICVkIChzaW5nbGUpLlxuIiwKKwkJICAgIGZsb3ctPm1lX2FkZHIpOworCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImZsb3cgY29udHJvbCBjcmVkZW50aWFscyA9JWQuXG4iLAorCQkgICAgbWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMpOworCX0gZWxzZSB7CisJCUJVRygpOwkvKiBlcnJvciBpbiBmbG93IGNvbnRyb2wgKi8KKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0zNjIsOCArMzc4LDcgQEAKIHN0YXRpYyB2b2lkIG1laV9oYm1fY2xfZmxvd19jb250cm9sX3JlcyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAogCQlzdHJ1Y3QgaGJtX2Zsb3dfY29udHJvbCAqZmxvd19jb250cm9sKQogewotCXN0cnVjdCBtZWlfY2wgKmNsID0gTlVMTDsKLQlzdHJ1Y3QgbWVpX2NsICpuZXh0ID0gTlVMTDsKKwlzdHJ1Y3QgbWVpX2NsICpjbDsKIAogCWlmICghZmxvd19jb250cm9sLT5ob3N0X2FkZHIpIHsKIAkJLyogc2luZ2xlIHJlY2VpdmUgYnVmZmVyICovCkBAIC0zNzIsNyArMzg3LDcgQEAKIAl9CiAKIAkvKiBub3JtYWwgY29ubmVjdGlvbiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbCwgbmV4dCwgJmRldi0+ZmlsZV9saXN0LCBsaW5rKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJmRldi0+ZmlsZV9saXN0LCBsaW5rKSB7CiAJCWlmIChtZWlfaGJtX2NsX2FkZHJfZXF1YWwoY2wsIGZsb3dfY29udHJvbCkpIHsKIAkJCWNsLT5tZWlfZmxvd19jdHJsX2NyZWRzKys7CiAJCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImZsb3cgY3RybCBtc2cgZm9yIGhvc3QgJWQgTUUgJWQuXG4iLApAQCAtNDA1LDYgKzQyMCwyNSBAQAogfQogCiAvKioKKyAqIG1laV9oYm1fY2xfZGlzY29ubmVjdF9yc3AgLSBzZW5kcyBkaXNjb25uZWN0IHJlc3Bvc2UgdG8gdGhlIEZXCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBjbDogYSBjbGllbnQgdG8gZGlzY29ubmVjdCBmcm9tCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIC1FSU8gb24gd3JpdGUgZmFpbHVyZQorICovCitpbnQgbWVpX2hibV9jbF9kaXNjb25uZWN0X3JzcChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgbWVpX2NsICpjbCkKK3sKKwlzdHJ1Y3QgbWVpX21zZ19oZHIgKm1laV9oZHIgPSAmZGV2LT53cl9tc2cuaGRyOworCWNvbnN0IHNpemVfdCBsZW4gPSBzaXplb2Yoc3RydWN0IGhibV9jbGllbnRfY29ubmVjdF9yZXNwb25zZSk7CisKKwltZWlfaGJtX2hkcihtZWlfaGRyLCBsZW4pOworCW1laV9oYm1fY2xfaGRyKGNsLCBDTElFTlRfRElTQ09OTkVDVF9SRVNfQ01ELCBkZXYtPndyX21zZy5kYXRhLCBsZW4pOworCisJcmV0dXJuIG1laV93cml0ZV9tZXNzYWdlKGRldiwgbWVpX2hkciwgZGV2LT53cl9tc2cuZGF0YSk7Cit9CisKKy8qKgogICogbWVpX2hibV9jbF9kaXNjb25uZWN0X3JlcyAtIGRpc2Nvbm5lY3QgcmVzcG9uc2UgZnJvbSBNRQogICoKICAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCkBAIC00MTQsMjkgKzQ0OCwyMyBAQAogCQlzdHJ1Y3QgaGJtX2NsaWVudF9jb25uZWN0X3Jlc3BvbnNlICpycykKIHsKIAlzdHJ1Y3QgbWVpX2NsICpjbDsKLQlzdHJ1Y3QgbWVpX2NsX2NiICpwb3MgPSBOVUxMLCAqbmV4dCA9IE5VTEw7CisJc3RydWN0IG1laV9jbF9jYiAqY2IsICpuZXh0OwogCi0JZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsCi0JCQkiZGlzY29ubmVjdF9yZXNwb25zZTpcbiIKLQkJCSJNRSBDbGllbnQgPSAlZFxuIgotCQkJIkhvc3QgQ2xpZW50ID0gJWRcbiIKLQkJCSJTdGF0dXMgPSAlZFxuIiwKLQkJCXJzLT5tZV9hZGRyLAotCQkJcnMtPmhvc3RfYWRkciwKLQkJCXJzLT5zdGF0dXMpOworCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiaGJtOiBkaXNjb25uZWN0IHJlc3BvbnNlIGNsOmhvc3Q9JTAyZCBtZT0lMDJkIHN0YXR1cz0lZFxuIiwKKwkJCXJzLT5tZV9hZGRyLCBycy0+aG9zdF9hZGRyLCBycy0+c3RhdHVzKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG5leHQsICZkZXYtPmN0cmxfcmRfbGlzdC5saXN0LCBsaXN0KSB7Ci0JCWNsID0gcG9zLT5jbDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2IsIG5leHQsICZkZXYtPmN0cmxfcmRfbGlzdC5saXN0LCBsaXN0KSB7CisJCWNsID0gY2ItPmNsOwogCi0JCWlmICghY2wpIHsKLQkJCWxpc3RfZGVsKCZwb3MtPmxpc3QpOworCQkvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuICovCisJCWlmIChXQVJOX09OKCFjbCkpIHsKKwkJCWxpc3RfZGVsKCZjYi0+bGlzdCk7CiAJCQlyZXR1cm47CiAJCX0KIAotCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSBpbiBjdHJsX3JkX2xpc3QuXG4iKTsKIAkJaWYgKG1laV9oYm1fY2xfYWRkcl9lcXVhbChjbCwgcnMpKSB7Ci0JCQlsaXN0X2RlbCgmcG9zLT5saXN0KTsKLQkJCWlmICghcnMtPnN0YXR1cykKKwkJCWxpc3RfZGVsKCZjYi0+bGlzdCk7CisJCQlpZiAocnMtPnN0YXR1cyA9PSBNRUlfQ0xfRElTQ09OTl9TVUNDRVNTKQogCQkJCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0RJU0NPTk5FQ1RFRDsKIAogCQkJY2wtPnN0YXR1cyA9IDA7CkBAIC00NzYsNDYgKzUwNCw0MSBAQAogewogCiAJc3RydWN0IG1laV9jbCAqY2w7Ci0Jc3RydWN0IG1laV9jbF9jYiAqcG9zID0gTlVMTCwgKm5leHQgPSBOVUxMOworCXN0cnVjdCBtZWlfY2xfY2IgKmNiLCAqbmV4dDsKIAotCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LAotCQkJImNvbm5lY3RfcmVzcG9uc2U6XG4iCi0JCQkiTUUgQ2xpZW50ID0gJWRcbiIKLQkJCSJIb3N0IENsaWVudCA9ICVkXG4iCi0JCQkiU3RhdHVzID0gJWRcbiIsCi0JCQlycy0+bWVfYWRkciwKLQkJCXJzLT5ob3N0X2FkZHIsCi0JCQlycy0+c3RhdHVzKTsKKwlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImhibTogY29ubmVjdCByZXNwb25zZSBjbDpob3N0PSUwMmQgbWU9JTAyZCBzdGF0dXM9JXNcbiIsCisJCQlycy0+bWVfYWRkciwgcnMtPmhvc3RfYWRkciwKKwkJCW1laV9jbF9jb25uX3N0YXR1c19zdHIocnMtPnN0YXR1cykpOwogCi0JLyogaWYgV0Qgb3IgaWFtdGhpZiBjbGllbnQgdHJlYXQgc3BlY2lhbGx5ICovCisJY2wgPSBOVUxMOwogCi0JaWYgKGlzX3RyZWF0X3NwZWNpYWxseV9jbGllbnQoJmRldi0+d2RfY2wsIHJzKSkgewotCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgInN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gV0QgY2xpZW50LlxuIik7Ci0JCW1laV93YXRjaGRvZ19yZWdpc3RlcihkZXYpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjYiwgbmV4dCwgJmRldi0+Y3RybF9yZF9saXN0Lmxpc3QsIGxpc3QpIHsKIAotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlzX3RyZWF0X3NwZWNpYWxseV9jbGllbnQoJmRldi0+aWFtdGhpZl9jbCwgcnMpKSB7Ci0JCWRldi0+aWFtdGhpZl9zdGF0ZSA9IE1FSV9JQU1USElGX0lETEU7Ci0JCXJldHVybjsKLQl9Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgbmV4dCwgJmRldi0+Y3RybF9yZF9saXN0Lmxpc3QsIGxpc3QpIHsKLQotCQljbCA9IHBvcy0+Y2w7Ci0JCWlmICghY2wpIHsKLQkJCWxpc3RfZGVsKCZwb3MtPmxpc3QpOwotCQkJcmV0dXJuOworCQljbCA9IGNiLT5jbDsKKwkJLyogdGhpcyBzaG91bGQgbm90IGhhcHBlbiAqLworCQlpZiAoV0FSTl9PTighY2wpKSB7CisJCQlsaXN0X2RlbF9pbml0KCZjYi0+bGlzdCk7CisJCQljb250aW51ZTsKIAkJfQotCQlpZiAocG9zLT5mb3BfdHlwZSA9PSBNRUlfRk9QX0lPQ1RMKSB7Ci0JCQlpZiAoaXNfdHJlYXRfc3BlY2lhbGx5X2NsaWVudChjbCwgcnMpKSB7Ci0JCQkJbGlzdF9kZWwoJnBvcy0+bGlzdCk7Ci0JCQkJY2wtPnN0YXR1cyA9IDA7Ci0JCQkJY2wtPnRpbWVyX2NvdW50ID0gMDsKLQkJCQlicmVhazsKLQkJCX0KKworCQlpZiAoY2ItPmZvcF90eXBlICE9ICBNRUlfRk9QX0NPTk5FQ1QpCisJCQljb250aW51ZTsKKworCQlpZiAobWVpX2hibV9jbF9hZGRyX2VxdWFsKGNsLCBycykpIHsKKwkJCWxpc3RfZGVsKCZjYi0+bGlzdCk7CisJCQlicmVhazsKIAkJfQogCX0KKworCWlmICghY2wpCisJCXJldHVybjsKKworCWNsLT50aW1lcl9jb3VudCA9IDA7CisJaWYgKHJzLT5zdGF0dXMgPT0gTUVJX0NMX0NPTk5fU1VDQ0VTUykKKwkJY2wtPnN0YXRlID0gTUVJX0ZJTEVfQ09OTkVDVEVEOworCWVsc2UKKwkJY2wtPnN0YXRlID0gTUVJX0ZJTEVfRElTQ09OTkVDVEVEOworCWNsLT5zdGF0dXMgPSBtZWlfY2xfY29ubl9zdGF0dXNfdG9fZXJybm8ocnMtPnN0YXR1cyk7CiB9CiAKIApAQCAtNTI1LDMyICs1NDgsMzQgQEAKICAqCiAgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KICAqIEBkaXNjb25uZWN0X3JlcTogZGlzY29ubmVjdCByZXF1ZXN0IGJ1cyBtZXNzYWdlIGZyb20gdGhlIG1lCisgKgorICogcmV0dXJucyAtRU5PTUVNIG9uIGFsbG9jYXRpb24gZmFpbHVyZQogICovCi1zdGF0aWMgdm9pZCBtZWlfaGJtX2Z3X2Rpc2Nvbm5lY3RfcmVxKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IG1laV9oYm1fZndfZGlzY29ubmVjdF9yZXEoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKIAkJc3RydWN0IGhibV9jbGllbnRfY29ubmVjdF9yZXF1ZXN0ICpkaXNjb25uZWN0X3JlcSkKIHsKLQlzdHJ1Y3QgbWVpX2NsICpjbCwgKm5leHQ7Ci0JY29uc3Qgc2l6ZV90IGxlbiA9IHNpemVvZihzdHJ1Y3QgaGJtX2NsaWVudF9jb25uZWN0X3Jlc3BvbnNlKTsKKwlzdHJ1Y3QgbWVpX2NsICpjbDsKKwlzdHJ1Y3QgbWVpX2NsX2NiICpjYjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbCwgbmV4dCwgJmRldi0+ZmlsZV9saXN0LCBsaW5rKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJmRldi0+ZmlsZV9saXN0LCBsaW5rKSB7CiAJCWlmIChtZWlfaGJtX2NsX2FkZHJfZXF1YWwoY2wsIGRpc2Nvbm5lY3RfcmVxKSkgewogCQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJkaXNjb25uZWN0IHJlcXVlc3QgaG9zdCBjbGllbnQgJWQgTUUgY2xpZW50ICVkLlxuIiwKIAkJCQkJZGlzY29ubmVjdF9yZXEtPmhvc3RfYWRkciwKIAkJCQkJZGlzY29ubmVjdF9yZXEtPm1lX2FkZHIpOwogCQkJY2wtPnN0YXRlID0gTUVJX0ZJTEVfRElTQ09OTkVDVEVEOwogCQkJY2wtPnRpbWVyX2NvdW50ID0gMDsKLQkJCWlmIChjbCA9PSAmZGV2LT53ZF9jbCkKLQkJCQlkZXYtPndkX3BlbmRpbmcgPSBmYWxzZTsKLQkJCWVsc2UgaWYgKGNsID09ICZkZXYtPmlhbXRoaWZfY2wpCi0JCQkJZGV2LT5pYW10aGlmX3RpbWVyID0gMDsKIAotCQkJLyogcHJlcGFyZSBkaXNjb25uZWN0IHJlc3BvbnNlICovCi0JCQltZWlfaGJtX2hkcigmZGV2LT53cl9leHRfbXNnLmhkciwgbGVuKTsKLQkJCW1laV9oYm1fY2xfaGRyKGNsLCBDTElFTlRfRElTQ09OTkVDVF9SRVNfQ01ELAotCQkJCQkgZGV2LT53cl9leHRfbXNnLmRhdGEsIGxlbik7CisJCQljYiA9IG1laV9pb19jYl9pbml0KGNsLCBOVUxMKTsKKwkJCWlmICghY2IpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQljYi0+Zm9wX3R5cGUgPSBNRUlfRk9QX0RJU0NPTk5FQ1RfUlNQOworCQkJY2xfZGJnKGRldiwgY2wsICJhZGQgZGlzY29ubmVjdCByZXNwb25zZSBhcyBmaXJzdFxuIik7CisJCQlsaXN0X2FkZCgmY2ItPmxpc3QsICZkZXYtPmN0cmxfd3JfbGlzdC5saXN0KTsKKwogCQkJYnJlYWs7CiAJCX0KIAl9CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtNjI5LDEwICs2NTQsNyBAQAogCQkJZGV2X3dhcm4oJmRldi0+cGRldi0+ZGV2LCAiaGJtOiBzdGFydDogdmVyc2lvbiBtaXNtYXRjaCAtIHN0b3BwaW5nIHRoZSBkcml2ZXIuXG4iKTsKIAogCQkJZGV2LT5oYm1fc3RhdGUgPSBNRUlfSEJNX1NUT1BQRUQ7Ci0JCQltZWlfaGJtX3N0b3BfcmVxX3ByZXBhcmUoZGV2LCAmZGV2LT53cl9tc2cuaGRyLAotCQkJCQkJZGV2LT53cl9tc2cuZGF0YSk7Ci0JCQlpZiAobWVpX3dyaXRlX21lc3NhZ2UoZGV2LCAmZGV2LT53cl9tc2cuaGRyLAotCQkJCQlkZXYtPndyX21zZy5kYXRhKSkgeworCQkJaWYgKG1laV9oYm1fc3RvcF9yZXEoZGV2KSkgewogCQkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiaGJtOiBzdGFydDogZmFpbGVkIHRvIHNlbmQgc3RvcCByZXF1ZXN0XG4iKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KQEAgLTc3OCwxMCArODAwLDExIEBACiAKIAljYXNlIE1FX1NUT1BfUkVRX0NNRDoKIAkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJoYm06IHN0b3AgcmVxdWVzdDogbWVzc2FnZSByZWNlaXZlZFxuIik7Ci0KIAkJZGV2LT5oYm1fc3RhdGUgPSBNRUlfSEJNX1NUT1BQRUQ7Ci0JCW1laV9oYm1fc3RvcF9yZXFfcHJlcGFyZShkZXYsICZkZXYtPndyX2V4dF9tc2cuaGRyLAotCQkJCQlkZXYtPndyX2V4dF9tc2cuZGF0YSk7CisJCWlmIChtZWlfaGJtX3N0b3BfcmVxKGRldikpIHsKKwkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiaGJtOiBzdGFydDogZmFpbGVkIHRvIHNlbmQgc3RvcCByZXF1ZXN0XG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9oYm0uaCBiL2RyaXZlcnMvbWlzYy9tZWkvaGJtLmgKaW5kZXggNWY5MjE4OC4uMjBlODc4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9oYm0uaAorKysgYi9kcml2ZXJzL21pc2MvbWVpL2hibS5oCkBAIC01NCw2ICs1NCw3IEBACiBpbnQgbWVpX2hibV9zdGFydF93YWl0KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwogaW50IG1laV9oYm1fY2xfZmxvd19jb250cm9sX3JlcShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgbWVpX2NsICpjbCk7CiBpbnQgbWVpX2hibV9jbF9kaXNjb25uZWN0X3JlcShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgbWVpX2NsICpjbCk7CitpbnQgbWVpX2hibV9jbF9kaXNjb25uZWN0X3JzcChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgbWVpX2NsICpjbCk7CiBpbnQgbWVpX2hibV9jbF9jb25uZWN0X3JlcShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgbWVpX2NsICpjbCk7CiBib29sIG1laV9oYm1fdmVyc2lvbl9pc19zdXBwb3J0ZWQoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvaHctbWUuYyBiL2RyaXZlcnMvbWlzYy9tZWkvaHctbWUuYwppbmRleCA2ZjY1NmMwLi44ZGJkYWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2h3LW1lLmMKKysrIGIvZHJpdmVycy9taXNjL21laS9ody1tZS5jCkBAIC0yMCwxMCArMjAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogI2luY2x1ZGUgIm1laV9kZXYuaCIKLSNpbmNsdWRlICJody1tZS5oIgotCiAjaW5jbHVkZSAiaGJtLmgiCiAKKyNpbmNsdWRlICJody1tZS5oIgorI2luY2x1ZGUgImh3LW1lLXJlZ3MuaCIKIAogLyoqCiAgKiBtZWlfbWVfcmVnX3JlYWQgLSBSZWFkcyAzMmJpdCBkYXRhIGZyb20gdGhlIG1laSBkZXZpY2UKQEAgLTI0MCwxMSArMjQwLDExIEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIAllcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChkZXYtPndhaXRfaHdfcmVhZHksCiAJCQlkZXYtPnJlY3ZkX2h3X3JlYWR5LAotCQkJbWVpX3NlY3NfdG9famlmZmllcyhNRUlfSU5URVJPUF9USU1FT1VUKSk7CisJCQltZWlfc2Vjc190b19qaWZmaWVzKE1FSV9IV19SRUFEWV9USU1FT1VUKSk7CiAJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CiAJaWYgKCFlcnIgJiYgIWRldi0+cmVjdmRfaHdfcmVhZHkpIHsKIAkJaWYgKCFlcnIpCi0JCQllcnIgPSAtRVRJTUVET1VUOworCQkJZXJyID0gLUVUSU1FOwogCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwKIAkJCSJ3YWl0IGh3IHJlYWR5IGZhaWxlZC4gc3RhdHVzID0gJWRcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CkBAIC0zMDMsNyArMzAzLDcgQEAKICAqCiAgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQogICoKLSAqIHJldHVybnMgLTEoRVNMT1RTX09WRVJGTE9XKSBpZiBvdmVyZmxvdywgb3RoZXJ3aXNlIGVtcHR5IHNsb3RzIGNvdW50CisgKiByZXR1cm5zIC1FT1ZFUkZMT1cgaWYgb3ZlcmZsb3csIG90aGVyd2lzZSBlbXB0eSBzbG90cyBjb3VudAogICovCiBzdGF0aWMgaW50IG1laV9tZV9oYnVmX2VtcHR5X3Nsb3RzKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCiB7CkBAIC0zMjYsNyArMzI2LDcgQEAKIAogCiAvKioKLSAqIG1laV93cml0ZV9tZXNzYWdlIC0gd3JpdGVzIGEgbWVzc2FnZSB0byBtZWkgZGV2aWNlLgorICogbWVpX21lX3dyaXRlX21lc3NhZ2UgLSB3cml0ZXMgYSBtZXNzYWdlIHRvIG1laSBkZXZpY2UuCiAgKgogICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBoZWFkZXI6IG1laSBIRUNJIGhlYWRlciBvZiBtZXNzYWdlCkBAIC0zNTQsNyArMzU0LDcgQEAKIAogCWR3X2NudCA9IG1laV9kYXRhMnNsb3RzKGxlbmd0aCk7CiAJaWYgKGVtcHR5X3Nsb3RzIDwgMCB8fCBkd19jbnQgPiBlbXB0eV9zbG90cykKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiAtRU1TR1NJWkU7CiAKIAltZWlfbWVfcmVnX3dyaXRlKGh3LCBIX0NCX1dXLCAqKCh1MzIgKikgaGVhZGVyKSk7CiAKQEAgLTM4MSw3ICszODEsNyBAQAogICoKICAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCiAgKgotICogcmV0dXJucyAtMShFU0xPVFNfT1ZFUkZMT1cpIGlmIG92ZXJmbG93LCBvdGhlcndpc2UgZmlsbGVkIHNsb3RzIGNvdW50CisgKiByZXR1cm5zIC1FT1ZFUkZMT1cgaWYgb3ZlcmZsb3csIG90aGVyd2lzZSBmaWxsZWQgc2xvdHMgY291bnQKICAqLwogc3RhdGljIGludCBtZWlfbWVfY291bnRfZnVsbF9yZWFkX3Nsb3RzKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCiB7CkBAIC01MDUsMTcgKzUwNSwyNSBAQAogCS8qIGNoZWNrIHNsb3RzIGF2YWlsYWJsZSBmb3IgcmVhZGluZyAqLwogCXNsb3RzID0gbWVpX2NvdW50X2Z1bGxfcmVhZF9zbG90cyhkZXYpOwogCXdoaWxlIChzbG90cyA+IDApIHsKLQkJLyogd2UgaGF2ZSB1cmdlbnQgZGF0YSB0byBzZW5kIHNvIGJyZWFrIHRoZSByZWFkICovCi0JCWlmIChkZXYtPndyX2V4dF9tc2cuaGRyLmxlbmd0aCkKLQkJCWJyZWFrOwogCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgInNsb3RzIHRvIHJlYWQgPSAlMDh4XG4iLCBzbG90cyk7CiAJCXJldHMgPSBtZWlfaXJxX3JlYWRfaGFuZGxlcihkZXYsICZjb21wbGV0ZV9saXN0LCAmc2xvdHMpOworCQkvKiBUaGVyZSBpcyBhIHJhY2UgYmV0d2VlbiBNRSB3cml0ZSBhbmQgaW50ZXJydXB0IGRlbGl2ZXJ5OgorCQkgKiBOb3QgYWxsIGRhdGEgaXMgYWx3YXlzIGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciB0aGUKKwkJICogaW50ZXJydXB0LCBzbyB0cnkgdG8gcmVhZCBhZ2FpbiBvbiB0aGUgbmV4dCBpbnRlcnJ1cHQuCisJCSAqLworCQlpZiAocmV0cyA9PSAtRU5PREFUQSkKKwkJCWJyZWFrOworCiAJCWlmIChyZXRzICYmIGRldi0+ZGV2X3N0YXRlICE9IE1FSV9ERVZfUkVTRVRUSU5HKSB7CisJCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIm1laV9pcnFfcmVhZF9oYW5kbGVyIHJldCA9ICVkLlxuIiwKKwkJCQkJCXJldHMpOwogCQkJc2NoZWR1bGVfd29yaygmZGV2LT5yZXNldF93b3JrKTsKIAkJCWdvdG8gZW5kOwogCQl9CiAJfQogCisJZGV2LT5oYnVmX2lzX3JlYWR5ID0gbWVpX2hidWZfaXNfcmVhZHkoZGV2KTsKKwogCXJldHMgPSBtZWlfaXJxX3dyaXRlX2hhbmRsZXIoZGV2LCAmY29tcGxldGVfbGlzdCk7CiAKIAlkZXYtPmhidWZfaXNfcmVhZHkgPSBtZWlfaGJ1Zl9pc19yZWFkeShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9ody1tZS5oIGIvZHJpdmVycy9taXNjL21laS9ody1tZS5oCmluZGV4IDgwYmQ4MjkuLjg5M2Q1MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvaHctbWUuaAorKysgYi9kcml2ZXJzL21pc2MvbWVpL2h3LW1lLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNkZWZpbmUgX01FSV9JTlRFUkZBQ0VfSF8KIAogI2luY2x1ZGUgPGxpbnV4L21laS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgogI2luY2x1ZGUgIm1laV9kZXYuaCIKICNpbmNsdWRlICJjbGllbnQuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9ody10eGUtcmVncy5oIGIvZHJpdmVycy9taXNjL21laS9ody10eGUtcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyODNjMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvbWVpL2h3LXR4ZS1yZWdzLmgKQEAgLTAsMCArMSwyOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEludGVsIE1hbmFnZW1lbnQgRW5naW5lIEludGVyZmFjZSAoSW50ZWwgTUVJKSBMaW51eCBkcml2ZXIKKyAqIEludGVsIE1FSSBJbnRlcmZhY2UgSGVhZGVyCisgKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcKKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICoJSW50ZWwgQ29ycG9yYXRpb24uCisgKglsaW51eC1tZWlAbGludXguaW50ZWwuY29tCisgKglodHRwOi8vd3d3LmludGVsLmNvbQorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9NRUlfSFdfVFhFX1JFR1NfSF8KKyNkZWZpbmUgX01FSV9IV19UWEVfUkVHU19IXworCisjaW5jbHVkZSAiaHcuaCIKKworI2RlZmluZSBTRUNfQUxJVkVORVNTX1RJTUVSX1RJTUVPVVQgICAgICAgICg1ICogTVNFQ19QRVJfU0VDKQorI2RlZmluZSBTRUNfQUxJVkVORVNTX1dBSVRfVElNRU9VVCAgICAgICAgICgxICogTVNFQ19QRVJfU0VDKQorI2RlZmluZSBTRUNfUkVTRVRfV0FJVF9USU1FT1VUICAgICAgICAgICAgICgxICogTVNFQ19QRVJfU0VDKQorI2RlZmluZSBTRUNfUkVBRFlfV0FJVF9USU1FT1VUICAgICAgICAgICAgICg1ICogTVNFQ19QRVJfU0VDKQorI2RlZmluZSBTVEFSVF9NRVNTQUdFX1JFU1BPTlNFX1dBSVRfVElNRU9VVCAoNSAqIE1TRUNfUEVSX1NFQykKKyNkZWZpbmUgUkVTRVRfQ0FOQ0VMX1dBSVRfVElNRU9VVCAgICAgICAgICAoMSAqIE1TRUNfUEVSX1NFQykKKworZW51bSB7CisJU0VDX0JBUiwKKwlCUklER0VfQkFSLAorCisJTlVNX09GX01FTV9CQVJTCit9OworCisvKiBTZUMgRlcgU3RhdHVzIFJlZ2lzdGVyCisgKgorICogRlcgdXNlcyB0aGlzIHJlZ2lzdGVyIGluIG9yZGVyIHRvIHJlcG9ydCBpdHMgc3RhdHVzIHRvIGhvc3QuCisgKiBUaGlzIHJlZ2lzdGVyIHJlc2lkZXMgaW4gUENJLUUgY29uZmlnIHNwYWNlLgorICovCisjZGVmaW5lIFBDSV9DRkdfVFhFX0ZXX1NUUzAgICAweDQwCisjICBkZWZpbmUgUENJX0NGR19UWEVfRldfU1RTMF9XUktfU1RfTVNLICAgIDB4MDAwMDAwMEYKKyMgIGRlZmluZSBQQ0lfQ0ZHX1RYRV9GV19TVFMwX09QX1NUX01TSyAgICAgMHgwMDAwMDFDMAorIyAgZGVmaW5lIFBDSV9DRkdfVFhFX0ZXX1NUUzBfRldfSU5JVF9DTVBMVCAweDAwMDAwMjAwCisjICBkZWZpbmUgUENJX0NGR19UWEVfRldfU1RTMF9FUlJfQ09ERV9NU0sgIDB4MDAwMEYwMDAKKyMgIGRlZmluZSBQQ0lfQ0ZHX1RYRV9GV19TVFMwX09QX01PREVfTVNLICAgMHgwMDBGMDAwMAorIyAgZGVmaW5lIFBDSV9DRkdfVFhFX0ZXX1NUUzBfUlNUX0NOVF9NU0sgICAweDAwRjAwMDAwCisKKworI2RlZmluZSBJUENfQkFTRV9BRERSCTB4ODA0MDAgLyogU2VDIElQQyBCYXNlIEFkZHJlc3MgKi8KKworLyogSVBDIElucHV0IERvb3JiZWxsIFJlZ2lzdGVyICovCisjZGVmaW5lIFNFQ19JUENfSU5QVVRfRE9PUkJFTExfUkVHICAgICAgICgweDAwMDAgKyBJUENfQkFTRV9BRERSKQorCisvKiBJUEMgSW5wdXQgU3RhdHVzIFJlZ2lzdGVyCisgKiBUaGlzIHJlZ2lzdGVyIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBwcm9jZXNzaW5nIG9mCisgKiB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCBoYXMgYmVlbiBjb21wbGV0ZWQgYnkgdGhlIFNFQworICogTmV3IGNvbW1hbmRzIGFuZCBwYXlsb2FkcyBzaG91bGQgbm90IGJlIHdyaXR0ZW4gYnkgdGhlIEhvc3QKKyAqIHVudGlsIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHByZXZpb3VzIGNvbW1hbmQgaGFzIGJlZW4gcHJvY2Vzc2VkLgorICovCisjZGVmaW5lIFNFQ19JUENfSU5QVVRfU1RBVFVTX1JFRyAgICAgICAgICgweDAwMDggKyBJUENfQkFTRV9BRERSKQorIyAgZGVmaW5lIFNFQ19JUENfSU5QVVRfU1RBVFVTX1JEWSAgICBCSVQoMCkKKworLyogSVBDIEhvc3QgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBTRUNfSVBDX0hPU1RfSU5UX1NUQVRVU19SRUcgICAgICAoMHgwMDEwICsgSVBDX0JBU0VfQUREUikKKyNkZWZpbmUgICBTRUNfSVBDX0hPU1RfSU5UX1NUQVRVU19PVVRfREIgICAgICAgICAgICAgQklUKDApCisjZGVmaW5lICAgU0VDX0lQQ19IT1NUX0lOVF9TVEFUVVNfSU5fUkRZICAgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSAgIFNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX0hEQ1BfTTBfUkNWRCAgICAgICBCSVQoNSkKKyNkZWZpbmUgICBTRUNfSVBDX0hPU1RfSU5UX1NUQVRVU19JTExfTUVNX0FDQ0VTUyAgICAgQklUKDE3KQorI2RlZmluZSAgIFNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX0FFU19IS0VZX0VSUiAgICAgICBCSVQoMTgpCisjZGVmaW5lICAgU0VDX0lQQ19IT1NUX0lOVF9TVEFUVVNfREVTX0hLRVlfRVJSICAgICAgIEJJVCgxOSkKKyNkZWZpbmUgICBTRUNfSVBDX0hPU1RfSU5UX1NUQVRVU19UTVJNVEJfT1ZFUkZMT1cgICAgQklUKDIxKQorCisvKiBDb252ZW5pZW50IG1hc2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cyAqLworI2RlZmluZSAgIFNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX1BFTkRJTkcgXAorCQkoU0VDX0lQQ19IT1NUX0lOVF9TVEFUVVNfT1VUX0RCfCBcCisJCVNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX0lOX1JEWSkKKworLyogSVBDIEhvc3QgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0VDX0lQQ19IT1NUX0lOVF9NQVNLX1JFRyAgICAgICAgKDB4MDAxNCArIElQQ19CQVNFX0FERFIpCisKKyMgIGRlZmluZSBTRUNfSVBDX0hPU1RfSU5UX01BU0tfT1VUX0RCCUJJVCgwKSAvKiBPdXRwdXQgRG9vcmJlbGwgSW50IE1hc2sgKi8KKyMgIGRlZmluZSBTRUNfSVBDX0hPU1RfSU5UX01BU0tfSU5fUkRZCUJJVCgxKSAvKiBJbnB1dCBSZWFkeSBJbnQgTWFzayAqLworCisvKiBJUEMgSW5wdXQgUGF5bG9hZCBSQU0gKi8KKyNkZWZpbmUgU0VDX0lQQ19JTlBVVF9QQVlMT0FEX1JFRyAgICAgICAgKDB4MDEwMCArIElQQ19CQVNFX0FERFIpCisvKiBJUEMgU2hhcmVkIFBheWxvYWQgUkFNICovCisjZGVmaW5lIElQQ19TSEFSRURfUEFZTE9BRF9SRUcgICAgICAgICAgICgweDAyMDAgKyBJUENfQkFTRV9BRERSKQorCisvKiBTZUMgQWRkcmVzcyBUcmFuc2xhdGlvbiBUYWJsZSBFbnRyeSAyIC0gQ3RybAorICoKKyAqIFRoaXMgcmVnaXN0ZXIgcmVzaWRlcyBhbHNvIGluIFNlQydzIFBDSS1FIE1lbW9yeSBzcGFjZS4KKyAqLworI2RlZmluZSBTQVRUMl9DVFJMX1JFRyAgICAgICAgICAgICAgICAgICAweDEwNDAKKyMgIGRlZmluZSBTQVRUMl9DVFJMX1ZBTElEX01TSyAgICAgICAgICAgIEJJVCgwKQorIyAgZGVmaW5lIFNBVFQyX0NUUkxfQlJfQkFTRV9BRERSX1JFR19TSElGVCA4CisjICBkZWZpbmUgU0FUVDJfQ1RSTF9CUklER0VfSE9TVF9FTl9NU0sgICBCSVQoMTIpCisKKy8qIFNBVFQgVGFibGUgRW50cnkgMiBTQVAgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIFNBVFQyX1NBUF9CQV9SRUcgICAgICAgICAgICAgICAgIDB4MTA0NAorLyogU0FUVCBUYWJsZSBFbnRyeSAyIFNBUCBTaXplIFJlZ2lzdGVyLiAqLworI2RlZmluZSBTQVRUMl9TQVBfU0laRV9SRUcgICAgICAgICAgICAgICAweDEwNDgKKyAvKiBTQVRUIFRhYmxlIEVudHJ5IDIgU0FQIEJyaWRnZSBBZGRyZXNzIC0gTFNCIFJlZ2lzdGVyICovCisjZGVmaW5lIFNBVFQyX0JSR19CQV9MU0JfUkVHICAgICAgICAgICAgIDB4MTA0QworCisvKiBIb3N0IEhpZ2gtbGV2ZWwgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBISElTUl9SRUcgICAgICAgICAgICAgICAgICAgICAgICAweDIwMjAKKy8qIEhvc3QgSGlnaC1sZXZlbCBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyCisgKgorICogUmVzaWRlcyBpbiBQQ0kgbWVtb3J5IHNwYWNlLiBUaGlzIGlzIHRoZSB0b3AgaGllcmFyY2h5IGZvcgorICogaW50ZXJydXB0cyBmcm9tIFNlQyB0byBob3N0LCBhZ2dyZWdhdGluZyBib3RoIGludGVycnVwdHMgdGhhdAorICogYXJyaXZlIHRocm91Z2ggSElDUiByZWdpc3RlcnMgYXMgd2VsbCBhcyBpbnRlcnJ1cHRzCisgKiB0aGF0IGFycml2ZSB2aWEgSVBDLgorICovCisjZGVmaW5lIEhISUVSX1JFRyAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAyNAorI2RlZmluZSAgIElQQ19ISElFUl9TRUMJQklUKDApCisjZGVmaW5lICAgSVBDX0hISUVSX0JSSURHRQlCSVQoMSkKKyNkZWZpbmUgICBJUENfSEhJRVJfTVNLCShJUENfSEhJRVJfU0VDIHwgSVBDX0hISUVSX0JSSURHRSkKKworLyogSG9zdCBIaWdoLWxldmVsIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyLgorICoKKyAqIFJlc2lkZXMgaW4gUENJIG1lbW9yeSBzcGFjZS4KKyAqIFRoaXMgaXMgdGhlIHRvcCBoaWVyYXJjaHkgZm9yIG1hc2tpbmcgaW50ZXJydXB0cyBmcm9tIFNlQyB0byBob3N0LgorICovCisjZGVmaW5lIEhISU1SX1JFRyAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAyOAorI2RlZmluZSAgIElQQ19ISElNUl9TRUMgICAgICAgQklUKDApCisjZGVmaW5lICAgSVBDX0hISU1SX0JSSURHRSAgICBCSVQoMSkKKworLyogSG9zdCBIaWdoLWxldmVsIElSUSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSEhJUlFTUl9SRUcgICAgICAgICAgICAgICAgICAgICAgMHgyMDJDCisKKy8qIEhvc3QgSW50ZXJydXB0IENhdXNlIFJlZ2lzdGVyIDAgLSBTZUMgSVBDIFJlYWRpbmVzcworICoKKyAqIFRoaXMgcmVnaXN0ZXIgaXMgYm90aCBhbiBJQ1IgdG8gSG9zdCBmcm9tIFBDSSBNZW1vcnkgU3BhY2UKKyAqIGFuZCBpdCBpcyBhbHNvIGV4cG9zZWQgaW4gdGhlIFNlQyBtZW1vcnkgc3BhY2UuCisgKiBUaGlzIHJlZ2lzdGVyIGlzIHVzZWQgYnkgU2VDJ3MgSVBDIGRyaXZlciBpbiBvcmRlcgorICogdG8gc3luY2hyb25pemUgd2l0aCBob3N0IGFib3V0IElQQyBpbnRlcmZhY2Ugc3RhdGUuCisgKi8KKyNkZWZpbmUgSElDUl9TRUNfSVBDX1JFQURJTkVTU19SRUcgICAgICAgMHgyMDQwCisjZGVmaW5lICAgSElDUl9TRUNfSVBDX1JFQURJTkVTU19IT1NUX1JEWSAgQklUKDApCisjZGVmaW5lICAgSElDUl9TRUNfSVBDX1JFQURJTkVTU19TRUNfUkRZICAgQklUKDEpCisjZGVmaW5lICAgSElDUl9TRUNfSVBDX1JFQURJTkVTU19TWVNfUkRZICAgICBcCisJICAoSElDUl9TRUNfSVBDX1JFQURJTkVTU19IT1NUX1JEWSB8IFwKKwkgICBISUNSX1NFQ19JUENfUkVBRElORVNTX1NFQ19SRFkpCisjZGVmaW5lICAgSElDUl9TRUNfSVBDX1JFQURJTkVTU19SRFlfQ0xSICAgQklUKDIpCisKKy8qIEhvc3QgSW50ZXJydXB0IENhdXNlIFJlZ2lzdGVyIDEgLSBBbGl2ZW5lc3MgUmVzcG9uc2UgKi8KKy8qIFRoaXMgcmVnaXN0ZXIgaXMgYm90aCBhbiBJQ1IgdG8gSG9zdCBmcm9tIFBDSSBNZW1vcnkgU3BhY2UKKyAqIGFuZCBpdCBpcyBhbHNvIGV4cG9zZWQgaW4gdGhlIFNlQyBtZW1vcnkgc3BhY2UuCisgKiBUaGUgcmVnaXN0ZXIgbWF5IGJlIHVzZWQgYnkgU2VDIHRvIEFDSyBhIGhvc3QgcmVxdWVzdCBmb3IgYWxpdmVuZXNzLgorICovCisjZGVmaW5lIEhJQ1JfSE9TVF9BTElWRU5FU1NfUkVTUF9SRUcgICAgIDB4MjA0NAorI2RlZmluZSAgIEhJQ1JfSE9TVF9BTElWRU5FU1NfUkVTUF9BQ0sgICAgQklUKDApCisKKy8qIEhvc3QgSW50ZXJydXB0IENhdXNlIFJlZ2lzdGVyIDIgLSBTZUMgSVBDIE91dHB1dCBEb29yYmVsbCAqLworI2RlZmluZSBISUNSX1NFQ19JUENfT1VUUFVUX0RPT1JCRUxMX1JFRyAweDIwNDgKKworLyogSG9zdCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyLgorICoKKyAqIFJlc2lkZXMgaW4gUENJIG1lbW9yeSBzcGFjZS4KKyAqIFRoaXMgaXMgdGhlIG1haW4gcmVnaXN0ZXIgaW52b2x2ZWQgaW4gZ2VuZXJhdGluZyBpbnRlcnJ1cHRzCisgKiBmcm9tIFNlQyB0byBob3N0IHZpYSBISUNScy4KKyAqIFRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBydWxlcyBhcmUgYXMgZm9sbG93czoKKyAqIEFuIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuZXZlciBmb3IgYW55IGksCisgKiB0aGVyZSBpcyBhIHRyYW5zaXRpb24gZnJvbSBhIHN0YXRlIHdoZXJlIGF0IGxlYXN0IG9uZSBvZgorICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGRpZCBub3QgaG9sZCwgdG8gYSBzdGF0ZSB3aGVyZQorICogQUxMIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBob2xkOgorICogQSkgSElTUi5JTlRbaV1fU1RTID09IDEuCisgKiBCKSBISUVSLklOVFtpXV9FTiA9PSAxLgorICovCisjZGVmaW5lIEhJU1JfUkVHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA2MAorI2RlZmluZSAgIEhJU1JfSU5UXzBfU1RTICAgICAgQklUKDApCisjZGVmaW5lICAgSElTUl9JTlRfMV9TVFMgICAgICBCSVQoMSkKKyNkZWZpbmUgICBISVNSX0lOVF8yX1NUUyAgICAgIEJJVCgyKQorI2RlZmluZSAgIEhJU1JfSU5UXzNfU1RTICAgICAgQklUKDMpCisjZGVmaW5lICAgSElTUl9JTlRfNF9TVFMgICAgICBCSVQoNCkKKyNkZWZpbmUgICBISVNSX0lOVF81X1NUUyAgICAgIEJJVCg1KQorI2RlZmluZSAgIEhJU1JfSU5UXzZfU1RTICAgICAgQklUKDYpCisjZGVmaW5lICAgSElTUl9JTlRfN19TVFMgICAgICBCSVQoNykKKyNkZWZpbmUgICBISVNSX0lOVF9TVFNfTVNLIFwKKwkoSElTUl9JTlRfMF9TVFMgfCBISVNSX0lOVF8xX1NUUyB8IEhJU1JfSU5UXzJfU1RTKQorCisvKiBIb3N0IEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIuIFJlc2lkZXMgaW4gUENJIG1lbW9yeSBzcGFjZS4gKi8KKyNkZWZpbmUgSElFUl9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDY0CisjZGVmaW5lICAgSElFUl9JTlRfMF9FTiAgICAgIEJJVCgwKQorI2RlZmluZSAgIEhJRVJfSU5UXzFfRU4gICAgICBCSVQoMSkKKyNkZWZpbmUgICBISUVSX0lOVF8yX0VOICAgICAgQklUKDIpCisjZGVmaW5lICAgSElFUl9JTlRfM19FTiAgICAgIEJJVCgzKQorI2RlZmluZSAgIEhJRVJfSU5UXzRfRU4gICAgICBCSVQoNCkKKyNkZWZpbmUgICBISUVSX0lOVF81X0VOICAgICAgQklUKDUpCisjZGVmaW5lICAgSElFUl9JTlRfNl9FTiAgICAgIEJJVCg2KQorI2RlZmluZSAgIEhJRVJfSU5UXzdfRU4gICAgICBCSVQoNykKKworI2RlZmluZSAgIEhJRVJfSU5UX0VOX01TSyBcCisJIChISUVSX0lOVF8wX0VOIHwgSElFUl9JTlRfMV9FTiB8IEhJRVJfSU5UXzJfRU4pCisKKworLyogU0VDIE1lbW9yeSBTcGFjZSBJUEMgb3V0cHV0IHBheWxvYWQuCisgKgorICogVGhpcyByZWdpc3RlciBpcyBwYXJ0IG9mIHRoZSBvdXRwdXQgcGF5bG9hZCB3aGljaCBTRUMgcHJvdmlkZXMgdG8gaG9zdC4KKyAqLworI2RlZmluZSBCUklER0VfSVBDX09VVFBVVF9QQVlMT0FEX1JFRyAgICAweDIwQzAKKworLyogU2VDIEludGVycnVwdCBDYXVzZSBSZWdpc3RlciAtIEhvc3QgQWxpdmVuZXNzIFJlcXVlc3QKKyAqIFRoaXMgcmVnaXN0ZXIgaXMgYm90aCBhbiBJQ1IgdG8gU2VDIGFuZCBpdCBpcyBhbHNvIGV4cG9zZWQKKyAqIGluIHRoZSBob3N0LXZpc2libGUgUENJIG1lbW9yeSBzcGFjZS4KKyAqIFRoZSByZWdpc3RlciBpcyB1c2VkIGJ5IGhvc3QgdG8gcmVxdWVzdCBTZUMgYWxpdmVuZXNzLgorICovCisjZGVmaW5lIFNJQ1JfSE9TVF9BTElWRU5FU1NfUkVRX1JFRyAgICAgIDB4MjE0QworI2RlZmluZSAgIFNJQ1JfSE9TVF9BTElWRU5FU1NfUkVRX1JFUVVFU1RFRCAgICBCSVQoMCkKKworCisvKiBTZUMgSW50ZXJydXB0IENhdXNlIFJlZ2lzdGVyIC0gSG9zdCBJUEMgUmVhZGluZXNzCisgKgorICogVGhpcyByZWdpc3RlciBpcyBib3RoIGFuIElDUiB0byBTZUMgYW5kIGl0IGlzIGFsc28gZXhwb3NlZAorICogaW4gdGhlIGhvc3QtdmlzaWJsZSBQQ0kgbWVtb3J5IHNwYWNlLgorICogVGhpcyByZWdpc3RlciBpcyB1c2VkIGJ5IHRoZSBob3N0J3MgU2VDIGRyaXZlciB1c2VzIGluIG9yZGVyCisgKiB0byBzeW5jaHJvbml6ZSB3aXRoIFNlQyBhYm91dCBJUEMgaW50ZXJmYWNlIHN0YXRlLgorICovCisjZGVmaW5lIFNJQ1JfSE9TVF9JUENfUkVBRElORVNTX1JFUV9SRUcgIDB4MjE1MAorCisKKyNkZWZpbmUgU0lDUl9IT1NUX0lQQ19SRUFESU5FU1NfSE9TVF9SRFkgIEJJVCgwKQorI2RlZmluZSBTSUNSX0hPU1RfSVBDX1JFQURJTkVTU19TRUNfUkRZICAgQklUKDEpCisjZGVmaW5lIFNJQ1JfSE9TVF9JUENfUkVBRElORVNTX1NZU19SRFkgICAgIFwKKwkoU0lDUl9IT1NUX0lQQ19SRUFESU5FU1NfSE9TVF9SRFkgfCBcCisJIFNJQ1JfSE9TVF9JUENfUkVBRElORVNTX1NFQ19SRFkpCisjZGVmaW5lIFNJQ1JfSE9TVF9JUENfUkVBRElORVNTX1JEWV9DTFIgICBCSVQoMikKKworLyogU2VDIEludGVycnVwdCBDYXVzZSBSZWdpc3RlciAtIFNlQyBJUEMgT3V0cHV0IFN0YXR1cworICoKKyAqIFRoaXMgcmVnaXN0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHByb2Nlc3Npbmcgb2YgdGhlIG1vc3QgcmVjZW50CisgKiBjb21tYW5kIGhhcyBiZWVuIGNvbXBsZXRlZCBieSB0aGUgSG9zdC4KKyAqIE5ldyBjb21tYW5kcyBhbmQgcGF5bG9hZHMgc2hvdWxkIG5vdCBiZSB3cml0dGVuIGJ5IFNlQyB1bnRpbCB0aGlzCisgKiByZWdpc3RlciBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJldmlvdXMgY29tbWFuZCBoYXMgYmVlbiBwcm9jZXNzZWQuCisgKi8KKyNkZWZpbmUgU0lDUl9TRUNfSVBDX09VVFBVVF9TVEFUVVNfUkVHICAgMHgyMTU0CisjICBkZWZpbmUgU0VDX0lQQ19PVVRQVVRfU1RBVFVTX1JEWSBCSVQoMCkKKworCisKKy8qICBNRUkgSVBDIE1lc3NhZ2UgcGF5bG9hZCBzaXplIDY0IGJ5dGVzICovCisjZGVmaW5lIFBBWUxPQURfU0laRSAgICAgICAgNjQKKworLyogTUFYIHNpemUgZm9yIFNBVFQgcmFuZ2UgMzJNQiAqLworI2RlZmluZSBTQVRUX1JBTkdFX01BWCAgICAgKDMyIDw8IDIwKQorCisKKyNlbmRpZiAvKiBfTUVJX0hXX1RYRV9SRUdTX0hfICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvaHctdHhlLmMgYi9kcml2ZXJzL21pc2MvbWVpL2h3LXR4ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MDE4MmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvbWVpL2h3LXR4ZS5jCkBAIC0wLDAgKzEsMTEwNyBAQAorLyoKKyAqCisgKiBJbnRlbCBNYW5hZ2VtZW50IEVuZ2luZSBJbnRlcmZhY2UgKEludGVsIE1FSSkgTGludXggZHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZWkuaD4KKworI2luY2x1ZGUgIm1laV9kZXYuaCIKKyNpbmNsdWRlICJody10eGUuaCIKKyNpbmNsdWRlICJjbGllbnQuaCIKKyNpbmNsdWRlICJoYm0uaCIKKworLyoqCisgKiBtZWlfdHhlX3JlZ19yZWFkIC0gUmVhZHMgMzJiaXQgZGF0YSBmcm9tIHRoZSBkZXZpY2UKKyAqCisgKiBAYmFzZV9hZGRyOiByZWdpc3RlcnMgYmFzZSBhZGRyZXNzCisgKiBAb2Zmc2V0OiByZWdpc3RlciBvZmZzZXQKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIG1laV90eGVfcmVnX3JlYWQodm9pZCBfX2lvbWVtICpiYXNlX2FkZHIsCisJCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXJldHVybiBpb3JlYWQzMihiYXNlX2FkZHIgKyBvZmZzZXQpOworfQorCisvKioKKyAqIG1laV90eGVfcmVnX3dyaXRlIC0gV3JpdGVzIDMyYml0IGRhdGEgdG8gdGhlIGRldmljZQorICoKKyAqIEBiYXNlX2FkZHI6IHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MKKyAqIEBvZmZzZXQ6IHJlZ2lzdGVyIG9mZnNldAorICogQHZhbHVlOiB0aGUgdmFsdWUgdG8gd3JpdGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1laV90eGVfcmVnX3dyaXRlKHZvaWQgX19pb21lbSAqYmFzZV9hZGRyLAorCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1MzIgdmFsdWUpCit7CisJaW93cml0ZTMyKHZhbHVlLCBiYXNlX2FkZHIgKyBvZmZzZXQpOworfQorCisvKioKKyAqIG1laV90eGVfc2VjX3JlZ19yZWFkX3NpbGVudCAtIFJlYWRzIDMyYml0IGRhdGEgZnJvbSB0aGUgU2VDIEJBUgorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAb2Zmc2V0OiByZWdpc3RlciBvZmZzZXQKKyAqCisgKiBEb2Vzbid0IGNoZWNrIGZvciBhbGl2ZW5lc3Mgd2hpbGUgUmVhZHMgMzJiaXQgZGF0YSBmcm9tIHRoZSBTZUMgQkFSCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIG1laV90eGVfc2VjX3JlZ19yZWFkX3NpbGVudChzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcsCisJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJcmV0dXJuIG1laV90eGVfcmVnX3JlYWQoaHctPm1lbV9hZGRyW1NFQ19CQVJdLCBvZmZzZXQpOworfQorCisvKioKKyAqIG1laV90eGVfc2VjX3JlZ19yZWFkIC0gUmVhZHMgMzJiaXQgZGF0YSBmcm9tIHRoZSBTZUMgQkFSCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBvZmZzZXQ6IHJlZ2lzdGVyIG9mZnNldAorICoKKyAqIFJlYWRzIDMyYml0IGRhdGEgZnJvbSB0aGUgU2VDIEJBUiBhbmQgc2hvdXQgbG91ZCBpZiBhbGl2ZW5lc3MgaXMgbm90IHNldAorICovCitzdGF0aWMgaW5saW5lIHUzMiBtZWlfdHhlX3NlY19yZWdfcmVhZChzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcsCisJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJV0FSTighaHctPmFsaXZlbmVzcywgInNlYyByZWFkOiBhbGl2ZW5lc3Mgbm90IGFzc2VydGVkXG4iKTsKKwlyZXR1cm4gbWVpX3R4ZV9zZWNfcmVnX3JlYWRfc2lsZW50KGh3LCBvZmZzZXQpOworfQorLyoqCisgKiBtZWlfdHhlX3NlY19yZWdfd3JpdGVfc2lsZW50IC0gV3JpdGVzIDMyYml0IGRhdGEgdG8gdGhlIFNlQyBCQVIKKyAqICAgZG9lc24ndCBjaGVjayBmb3IgYWxpdmVuZXNzCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBvZmZzZXQ6IHJlZ2lzdGVyIG9mZnNldAorICogQHZhbHVlOiB2YWx1ZSB0byB3cml0ZQorICoKKyAqIERvZXNuJ3QgY2hlY2sgZm9yIGFsaXZlbmVzcyB3aGlsZSB3cml0ZXMgMzJiaXQgZGF0YSBmcm9tIHRvIHRoZSBTZUMgQkFSCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtZWlfdHhlX3NlY19yZWdfd3JpdGVfc2lsZW50KHN0cnVjdCBtZWlfdHhlX2h3ICpodywKKwkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCwgdTMyIHZhbHVlKQoreworCW1laV90eGVfcmVnX3dyaXRlKGh3LT5tZW1fYWRkcltTRUNfQkFSXSwgb2Zmc2V0LCB2YWx1ZSk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9zZWNfcmVnX3dyaXRlIC0gV3JpdGVzIDMyYml0IGRhdGEgdG8gdGhlIFNlQyBCQVIKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0CisgKiBAdmFsdWU6IHZhbHVlIHRvIHdyaXRlCisgKgorICogV3JpdGVzIDMyYml0IGRhdGEgZnJvbSB0aGUgU2VDIEJBUiBhbmQgc2hvdXQgbG91ZCBpZiBhbGl2ZW5lc3MgaXMgbm90IHNldAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbWVpX3R4ZV9zZWNfcmVnX3dyaXRlKHN0cnVjdCBtZWlfdHhlX2h3ICpodywKKwkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCwgdTMyIHZhbHVlKQoreworCVdBUk4oIWh3LT5hbGl2ZW5lc3MsICJzZWMgd3JpdGU6IGFsaXZlbmVzcyBub3QgYXNzZXJ0ZWRcbiIpOworCW1laV90eGVfc2VjX3JlZ193cml0ZV9zaWxlbnQoaHcsIG9mZnNldCwgdmFsdWUpOworfQorLyoqCisgKiBtZWlfdHhlX2JyX3JlZ19yZWFkIC0gUmVhZHMgMzJiaXQgZGF0YSBmcm9tIHRoZSBCcmlkZ2UgQkFSCisgKgorICogQGh3OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogQG9mZnNldDogb2Zmc2V0IGZyb20gd2hpY2ggdG8gcmVhZCB0aGUgZGF0YQorICoKKyAqLworc3RhdGljIGlubGluZSB1MzIgbWVpX3R4ZV9icl9yZWdfcmVhZChzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcsCisJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJcmV0dXJuIG1laV90eGVfcmVnX3JlYWQoaHctPm1lbV9hZGRyW0JSSURHRV9CQVJdLCBvZmZzZXQpOworfQorCisvKioKKyAqIG1laV90eGVfYnJfcmVnX3dyaXRlIC0gV3JpdGVzIDMyYml0IGRhdGEgdG8gdGhlIEJyaWRnZSBCQVIKKyAqCisgKiBAaHc6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAb2Zmc2V0OiBvZmZzZXQgZnJvbSB3aGljaCB0byB3cml0ZSB0aGUgZGF0YQorICogQHZhbHVlOiB0aGUgYnl0ZSB0byB3cml0ZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbWVpX3R4ZV9icl9yZWdfd3JpdGUoc3RydWN0IG1laV90eGVfaHcgKmh3LAorCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1MzIgdmFsdWUpCit7CisJbWVpX3R4ZV9yZWdfd3JpdGUoaHctPm1lbV9hZGRyW0JSSURHRV9CQVJdLCBvZmZzZXQsIHZhbHVlKTsKK30KKworLyoqCisgKiBtZWlfdHhlX2FsaXZlbmVzc19zZXQgLSByZXF1ZXN0IGZvciBhbGl2ZW5lc3MgY2hhbmdlCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEByZXE6IHJlcXVlc3RlZCBhbGl2ZW5lc3MgdmFsdWUKKyAqCisgKiBSZXF1ZXN0IGZvciBhbGl2ZW5lc3MgY2hhbmdlIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIGNoYW5nZSBpcworICogICByZWFsbHkgbmVlZGVkIGFuZCBmYWxzZSBpZiBhbGl2ZW5lc3MgaXMgYWxyZWFkeQorICogICBpbiB0aGUgcmVxdWVzdGVkIHN0YXRlCisgKiBSZXF1aXJlcyBkZXZpY2UgbG9jayB0byBiZSBoZWxkCisgKi8KK3N0YXRpYyBib29sIG1laV90eGVfYWxpdmVuZXNzX3NldChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCB1MzIgcmVxKQoreworCisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJYm9vbCBkb19yZXEgPSBody0+YWxpdmVuZXNzICE9IHJlcTsKKworCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiQWxpdmVuZXNzIGN1cnJlbnQ9JWQgcmVxdWVzdD0lZFxuIiwKKwkJCQlody0+YWxpdmVuZXNzLCByZXEpOworCWlmIChkb19yZXEpIHsKKwkJaHctPnJlY3ZkX2FsaXZlbmVzcyA9IGZhbHNlOworCQltZWlfdHhlX2JyX3JlZ193cml0ZShodywgU0lDUl9IT1NUX0FMSVZFTkVTU19SRVFfUkVHLCByZXEpOworCX0KKwlyZXR1cm4gZG9fcmVxOworfQorCisKKy8qKgorICogbWVpX3R4ZV9hbGl2ZW5lc3NfcmVxX2dldCAtIGdldCBhbGl2ZW5lc3MgcmVxdWVzdGVkIHJlZ2lzdGVyIHZhbHVlCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBFeHRyYWN0IEhJQ1JfSE9TVF9BTElWRU5FU1NfUkVTUF9BQ0sgYml0IGZyb20KKyAqIGZyb20gSElDUl9IT1NUX0FMSVZFTkVTU19SRVEgcmVnaXN0ZXIgdmFsdWUKKyAqLworc3RhdGljIHUzMiBtZWlfdHhlX2FsaXZlbmVzc19yZXFfZ2V0KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJdTMyIHJlZzsKKwlyZWcgPSBtZWlfdHhlX2JyX3JlZ19yZWFkKGh3LCBTSUNSX0hPU1RfQUxJVkVORVNTX1JFUV9SRUcpOworCXJldHVybiByZWcgJiBTSUNSX0hPU1RfQUxJVkVORVNTX1JFUV9SRVFVRVNURUQ7Cit9CisKKy8qKgorICogbWVpX3R4ZV9hbGl2ZW5lc3NfZ2V0IC0gZ2V0IGFsaXZlbmVzcyByZXNwb25zZSByZWdpc3RlciB2YWx1ZQorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBFeHRyYWN0IEhJQ1JfSE9TVF9BTElWRU5FU1NfUkVTUF9BQ0sgYml0CisgKiBmcm9tIEhJQ1JfSE9TVF9BTElWRU5FU1NfUkVTUCByZWdpc3RlciB2YWx1ZQorICovCitzdGF0aWMgdTMyIG1laV90eGVfYWxpdmVuZXNzX2dldChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCXUzMiByZWc7CisJcmVnID0gbWVpX3R4ZV9icl9yZWdfcmVhZChodywgSElDUl9IT1NUX0FMSVZFTkVTU19SRVNQX1JFRyk7CisJcmV0dXJuIHJlZyAmIEhJQ1JfSE9TVF9BTElWRU5FU1NfUkVTUF9BQ0s7Cit9CisKKy8qKgorICogbWVpX3R4ZV9hbGl2ZW5lc3NfcG9sbCAtIHdhaXRzIGZvciBhbGl2ZW5lc3MgdG8gc2V0dGxlCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBleHBlY3RlZDogZXhwZWN0ZWQgYWxpdmVuZXNzIHZhbHVlCisgKgorICogUG9sbHMgZm9yIEhJQ1JfSE9TVF9BTElWRU5FU1NfUkVTUC5BTElWRU5FU1NfUkVTUCB0byBiZSBzZXQKKyAqIHJldHVybnMgPiAwIGlmIHRoZSBleHBlY3RlZCB2YWx1ZSB3YXMgcmVjZWl2ZWQsIC1FVElNRSBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBtZWlfdHhlX2FsaXZlbmVzc19wb2xsKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHUzMiBleHBlY3RlZCkKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwlpbnQgdCA9IDA7CisKKwlkbyB7CisJCWh3LT5hbGl2ZW5lc3MgPSBtZWlfdHhlX2FsaXZlbmVzc19nZXQoZGV2KTsKKwkJaWYgKGh3LT5hbGl2ZW5lc3MgPT0gZXhwZWN0ZWQpIHsKKwkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LAorCQkJCSJhbGl2ZW5lc3Mgc2V0dGxlZCBhZnRlciAlZCBtc2Vjc1xuIiwgdCk7CisJCQlyZXR1cm4gdDsKKwkJfQorCQltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCQltc2xlZXAoTVNFQ19QRVJfU0VDIC8gNSk7CisJCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCQl0ICs9IE1TRUNfUEVSX1NFQyAvIDU7CisJfSB3aGlsZSAodCA8IFNFQ19BTElWRU5FU1NfV0FJVF9USU1FT1VUKTsKKworCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiYWxpdmVuZXNzIHRpbWVkIG91dFxuIik7CisJcmV0dXJuIC1FVElNRTsKK30KKworLyoqCisgKiBtZWlfdHhlX2FsaXZlbmVzc193YWl0IC0gd2FpdHMgZm9yIGFsaXZlbmVzcyB0byBzZXR0bGUKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogQGV4cGVjdGVkOiBleHBlY3RlZCBhbGl2ZW5lc3MgdmFsdWUKKyAqCisgKiBXYWl0cyBmb3IgSElDUl9IT1NUX0FMSVZFTkVTU19SRVNQLkFMSVZFTkVTU19SRVNQIHRvIGJlIHNldAorICogcmV0dXJucyByZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgPCAwIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IG1laV90eGVfYWxpdmVuZXNzX3dhaXQoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgdTMyIGV4cGVjdGVkKQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgdGltZW91dCA9CisJCQltc2Vjc190b19qaWZmaWVzKFNFQ19BTElWRU5FU1NfV0FJVF9USU1FT1VUKTsKKwlsb25nIGVycjsKKwlpbnQgcmV0OworCisJaHctPmFsaXZlbmVzcyA9IG1laV90eGVfYWxpdmVuZXNzX2dldChkZXYpOworCWlmIChody0+YWxpdmVuZXNzID09IGV4cGVjdGVkKQorCQlyZXR1cm4gMDsKKworCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisJZXJyID0gd2FpdF9ldmVudF90aW1lb3V0KGh3LT53YWl0X2FsaXZlbmVzcywKKwkJCWh3LT5yZWN2ZF9hbGl2ZW5lc3MsIHRpbWVvdXQpOworCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCisJaHctPmFsaXZlbmVzcyA9IG1laV90eGVfYWxpdmVuZXNzX2dldChkZXYpOworCXJldCA9IGh3LT5hbGl2ZW5lc3MgPT0gZXhwZWN0ZWQgPyAwIDogLUVUSU1FOworCisJaWYgKHJldCkKKwkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJhbGl2ZW5lc3MgdGltZWQgb3V0Iik7CisJZWxzZQorCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImFsaXZlbmVzcyBzZXR0bGVkIGFmdGVyICVkIG1zZWNzXG4iLAorCQkJCWppZmZpZXNfdG9fbXNlY3ModGltZW91dCAtIGVycikpOworCWh3LT5yZWN2ZF9hbGl2ZW5lc3MgPSBmYWxzZTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG1laV90eGVfYWxpdmVuZXNzX3NldF9zeW5jIC0gc2V0cyBhbiB3YWl0IGZvciBhbGl2ZW5lc3MgdG8gY29tcGxldGUKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgcmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIDwgMCBvdGhlcndpc2UKKyAqLworaW50IG1laV90eGVfYWxpdmVuZXNzX3NldF9zeW5jKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHUzMiByZXEpCit7CisJaWYgKG1laV90eGVfYWxpdmVuZXNzX3NldChkZXYsIHJlcSkpCisJCXJldHVybiBtZWlfdHhlX2FsaXZlbmVzc193YWl0KGRldiwgcmVxKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBtZWlfdHhlX2lucHV0X3JlYWR5X2ludGVycnVwdF9lbmFibGUgLSBzZXRzIHRoZSBJbnB1dCBSZWFkeSBJbnRlcnJ1cHQKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBtZWlfdHhlX2lucHV0X3JlYWR5X2ludGVycnVwdF9lbmFibGUoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwl1MzIgaGludG1zazsKKwkvKiBFbmFibGUgdGhlIFNFQ19JUENfSE9TVF9JTlRfTUFTS19JTl9SRFkgaW50ZXJydXB0ICovCisJaGludG1zayA9IG1laV90eGVfc2VjX3JlZ19yZWFkKGh3LCBTRUNfSVBDX0hPU1RfSU5UX01BU0tfUkVHKTsKKwloaW50bXNrIHw9IFNFQ19JUENfSE9TVF9JTlRfTUFTS19JTl9SRFk7CisJbWVpX3R4ZV9zZWNfcmVnX3dyaXRlKGh3LCBTRUNfSVBDX0hPU1RfSU5UX01BU0tfUkVHLCBoaW50bXNrKTsKK30KKworLyoqCisgKiBtZWlfdHhlX2lucHV0X2Rvb3JiZWxsX3NldAorICogICAtIFNldHMgYml0IDAgaW4gU0VDX0lQQ19JTlBVVF9ET09SQkVMTC5JUENfSU5QVVRfRE9PUkJFTEwuCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBtZWlfdHhlX2lucHV0X2Rvb3JiZWxsX3NldChzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcpCit7CisJLyogQ2xlYXIgdGhlIGludGVycnVwdCBjYXVzZSAqLworCWNsZWFyX2JpdChUWEVfSU5UUl9JTl9SRUFEWV9CSVQsICZody0+aW50cl9jYXVzZSk7CisJbWVpX3R4ZV9zZWNfcmVnX3dyaXRlKGh3LCBTRUNfSVBDX0lOUFVUX0RPT1JCRUxMX1JFRywgMSk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9vdXRwdXRfcmVhZHlfc2V0IC0gU2V0cyB0aGUgU0lDUl9TRUNfSVBDX09VVFBVVF9TVEFUVVMgYml0IHRvIDEKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBtZWlfdHhlX291dHB1dF9yZWFkeV9zZXQoc3RydWN0IG1laV90eGVfaHcgKmh3KQoreworCW1laV90eGVfYnJfcmVnX3dyaXRlKGh3LAorCQkJU0lDUl9TRUNfSVBDX09VVFBVVF9TVEFUVVNfUkVHLAorCQkJU0VDX0lQQ19PVVRQVVRfU1RBVFVTX1JEWSk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9pc19pbnB1dF9yZWFkeSAtIGNoZWNrIGlmIFRYRSBpcyByZWFkeSBmb3IgcmVjZWl2aW5nIGRhdGEKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgYm9vbCBtZWlfdHhlX2lzX2lucHV0X3JlYWR5KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJdTMyIHN0YXR1czsKKwlzdGF0dXMgPSBtZWlfdHhlX3NlY19yZWdfcmVhZChodywgU0VDX0lQQ19JTlBVVF9TVEFUVVNfUkVHKTsKKwlyZXR1cm4gISEoU0VDX0lQQ19JTlBVVF9TVEFUVVNfUkRZICYgc3RhdHVzKTsKK30KKworLyoqCisgKiBtZWlfdHhlX2ludHJfY2xlYXIgLSBjbGVhciBhbGwgaW50ZXJydXB0cworICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtZWlfdHhlX2ludHJfY2xlYXIoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwltZWlfdHhlX3NlY19yZWdfd3JpdGVfc2lsZW50KGh3LCBTRUNfSVBDX0hPU1RfSU5UX1NUQVRVU19SRUcsCisJCVNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX1BFTkRJTkcpOworCW1laV90eGVfYnJfcmVnX3dyaXRlKGh3LCBISVNSX1JFRywgSElTUl9JTlRfU1RTX01TSyk7CisJbWVpX3R4ZV9icl9yZWdfd3JpdGUoaHcsIEhISVNSX1JFRywgSVBDX0hISUVSX01TSyk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9pbnRyX2Rpc2FibGUgLSBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgbWVpX3R4ZV9pbnRyX2Rpc2FibGUoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwltZWlfdHhlX2JyX3JlZ193cml0ZShodywgSEhJRVJfUkVHLCAwKTsKKwltZWlfdHhlX2JyX3JlZ193cml0ZShodywgSElFUl9SRUcsIDApOworfQorLyoqCisgKiBtZWlfdHhlX2ludHJfZGlzYWJsZSAtIGVuYWJsZSBhbGwgaW50ZXJydXB0cworICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIG1laV90eGVfaW50cl9lbmFibGUoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwltZWlfdHhlX2JyX3JlZ193cml0ZShodywgSEhJRVJfUkVHLCBJUENfSEhJRVJfTVNLKTsKKwltZWlfdHhlX2JyX3JlZ193cml0ZShodywgSElFUl9SRUcsIEhJRVJfSU5UX0VOX01TSyk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9wZW5kaW5nX2ludGVycnVwdHMgLSBjaGVjayBpZiB0aGVyZSBhcmUgcGVuZGluZyBpbnRlcnJ1cHRzCisgKglvbmx5IEFsaXZlbmVzcywgSW5wdXQgcmVhZHksIGFuZCBvdXRwdXQgZG9vcmJlbGwgYXJlIG9mIHJlbGV2YW5jZQorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogQ2hlY2tzIGlmIHRoZXJlIGFyZSBwZW5kaW5nIGludGVycnVwdHMKKyAqIG9ubHkgQWxpdmVuZXNzLCBSZWFkaW5lc3MsIElucHV0IHJlYWR5LCBhbmQgT3V0cHV0IGRvb3JiZWxsIGFyZSByZWxldmFudAorICovCitzdGF0aWMgYm9vbCBtZWlfdHhlX3BlbmRpbmdfaW50ZXJydXB0cyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJYm9vbCByZXQgPSAoaHctPmludHJfY2F1c2UgJiAoVFhFX0lOVFJfUkVBRElORVNTIHwKKwkJCQkgICAgICBUWEVfSU5UUl9BTElWRU5FU1MgfAorCQkJCSAgICAgIFRYRV9JTlRSX0lOX1JFQURZICB8CisJCQkJICAgICAgVFhFX0lOVFJfT1VUX0RCKSk7CisKKwlpZiAocmV0KSB7CisJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LAorCQkJIlBlbmRpbmcgSW50ZXJydXB0cyBJblJlYWR5PSUwMWQgUmVhZGluZXNzPSUwMWQsIEFsaXZlbmVzcz0lMDFkLCBPdXREb29yPSUwMWRcbiIsCisJCQkhIShody0+aW50cl9jYXVzZSAmIFRYRV9JTlRSX0lOX1JFQURZKSwKKwkJCSEhKGh3LT5pbnRyX2NhdXNlICYgVFhFX0lOVFJfUkVBRElORVNTKSwKKwkJCSEhKGh3LT5pbnRyX2NhdXNlICYgVFhFX0lOVFJfQUxJVkVORVNTKSwKKwkJCSEhKGh3LT5pbnRyX2NhdXNlICYgVFhFX0lOVFJfT1VUX0RCKSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogbWVpX3R4ZV9pbnB1dF9wYXlsb2FkX3dyaXRlIC0gd3JpdGUgYSBkd29yZCB0byB0aGUgaG9zdCBidWZmZXIKKyAqCWF0IG9mZnNldCBpZHgKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogQGlkeDogaW5kZXggaW4gdGhlIGhvc3QgYnVmZmVyCisgKiBAdmFsdWU6IHZhbHVlCisgKi8KK3N0YXRpYyB2b2lkIG1laV90eGVfaW5wdXRfcGF5bG9hZF93cml0ZShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAorCQkJdW5zaWduZWQgbG9uZyBpZHgsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwltZWlfdHhlX3NlY19yZWdfd3JpdGUoaHcsIFNFQ19JUENfSU5QVVRfUEFZTE9BRF9SRUcgKworCQkJKGlkeCAqIHNpemVvZih1MzIpKSwgdmFsdWUpOworfQorCisvKioKKyAqIG1laV90eGVfb3V0X2RhdGFfcmVhZCAtIHJlYWQgZHdvcmQgZnJvbSB0aGUgZGV2aWNlIGJ1ZmZlcgorICoJYXQgb2Zmc2V0IGlkeAorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAaWR4OiBpbmRleCBpbiB0aGUgZGV2aWNlIGJ1ZmZlcgorICoKKyAqIHJldHVybnMgcmVnaXN0ZXIgdmFsdWUgYXQgaW5kZXgKKyAqLworc3RhdGljIHUzMiBtZWlfdHhlX291dF9kYXRhX3JlYWQoY29uc3Qgc3RydWN0IG1laV9kZXZpY2UgKmRldiwKKwkJCQkJdW5zaWduZWQgbG9uZyBpZHgpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJcmV0dXJuIG1laV90eGVfYnJfcmVnX3JlYWQoaHcsCisJCUJSSURHRV9JUENfT1VUUFVUX1BBWUxPQURfUkVHICsgKGlkeCAqIHNpemVvZih1MzIpKSk7Cit9CisKKy8qIFJlYWRpbmVzcyAqLworCisvKioKKyAqIG1laV90eGVfcmVhZGluZXNzX3NldF9ob3N0X3JkeQorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIG1laV90eGVfcmVhZGluZXNzX3NldF9ob3N0X3JkeShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCW1laV90eGVfYnJfcmVnX3dyaXRlKGh3LAorCQlTSUNSX0hPU1RfSVBDX1JFQURJTkVTU19SRVFfUkVHLAorCQlTSUNSX0hPU1RfSVBDX1JFQURJTkVTU19IT1NUX1JEWSk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9yZWFkaW5lc3NfY2xlYXIKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBtZWlfdHhlX3JlYWRpbmVzc19jbGVhcihzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCW1laV90eGVfYnJfcmVnX3dyaXRlKGh3LCBTSUNSX0hPU1RfSVBDX1JFQURJTkVTU19SRVFfUkVHLAorCQkJCVNJQ1JfSE9TVF9JUENfUkVBRElORVNTX1JEWV9DTFIpOworfQorLyoqCisgKiBtZWlfdHhlX3JlYWRpbmVzc19nZXQgLSBSZWFkcyBhbmQgcmV0dXJucworICoJdGhlIEhJQ1JfU0VDX0lQQ19SRUFESU5FU1MgcmVnaXN0ZXIgdmFsdWUKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdTMyIG1laV90eGVfcmVhZGluZXNzX2dldChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCXJldHVybiBtZWlfdHhlX2JyX3JlZ19yZWFkKGh3LCBISUNSX1NFQ19JUENfUkVBRElORVNTX1JFRyk7Cit9CisKKworLyoqCisgKiBtZWlfdHhlX3JlYWRpbmVzc19pc19zZWNfcmR5IC0gY2hlY2sgcmVhZGluZXNzCisgKiAgZm9yIEhJQ1JfU0VDX0lQQ19SRUFESU5FU1NfU0VDX1JEWQorICoKKyAqIEByZWFkaW5lc3MgLSBjYWNoZWQgcmVhZGluZXNzIHN0YXRlCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBtZWlfdHhlX3JlYWRpbmVzc19pc19zZWNfcmR5KHUzMiByZWFkaW5lc3MpCit7CisJcmV0dXJuICEhKHJlYWRpbmVzcyAmIEhJQ1JfU0VDX0lQQ19SRUFESU5FU1NfU0VDX1JEWSk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9od19pc19yZWFkeSAtIGNoZWNrIGlmIHRoZSBodyBpcyByZWFkeQorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyBib29sIG1laV90eGVfaHdfaXNfcmVhZHkoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwl1MzIgcmVhZGluZXNzID0gIG1laV90eGVfcmVhZGluZXNzX2dldChkZXYpOworCXJldHVybiBtZWlfdHhlX3JlYWRpbmVzc19pc19zZWNfcmR5KHJlYWRpbmVzcyk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9ob3N0X2lzX3JlYWR5IC0gY2hlY2sgaWYgdGhlIGhvc3QgaXMgcmVhZHkKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgaW5saW5lIGJvb2wgbWVpX3R4ZV9ob3N0X2lzX3JlYWR5KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJdTMyIHJlZyA9IG1laV90eGVfYnJfcmVnX3JlYWQoaHcsIEhJQ1JfU0VDX0lQQ19SRUFESU5FU1NfUkVHKTsKKwlyZXR1cm4gISEocmVnICYgSElDUl9TRUNfSVBDX1JFQURJTkVTU19IT1NUX1JEWSk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9yZWFkaW5lc3Nfd2FpdCAtIHdhaXQgdGlsbCByZWFkaW5lc3Mgc2V0dGxlcworICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIC1FVElNRSBvbiB0aW1lb3V0CisgKi8KK3N0YXRpYyBpbnQgbWVpX3R4ZV9yZWFkaW5lc3Nfd2FpdChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCWlmIChtZWlfdHhlX2h3X2lzX3JlYWR5KGRldikpCisJCXJldHVybiAwOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKKwl3YWl0X2V2ZW50X3RpbWVvdXQoZGV2LT53YWl0X2h3X3JlYWR5LCBkZXYtPnJlY3ZkX2h3X3JlYWR5LAorCQkJbXNlY3NfdG9famlmZmllcyhTRUNfUkVTRVRfV0FJVF9USU1FT1VUKSk7CisJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisJaWYgKCFkZXYtPnJlY3ZkX2h3X3JlYWR5KSB7CisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAid2FpdCBmb3IgcmVhZGluZXNzIGZhaWxlZFxuIik7CisJCXJldHVybiAtRVRJTUU7CisJfQorCisJZGV2LT5yZWN2ZF9od19yZWFkeSA9IGZhbHNlOworCXJldHVybiAwOworfQorCisvKioKKyAqICBtZWlfdHhlX2h3X2NvbmZpZyAtIGNvbmZpZ3VyZSBoYXJkd2FyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGRldmljZXMKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIENvbmZpZ3VyZSBoYXJkd2FyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGRldmljZSBzaG91bGQgYmUgZG9uZSBvbmx5CisgKiAgIG9uY2UgYXQgdGhlIGRldmljZSBwcm9iZSB0aW1lCisgKi8KK3N0YXRpYyB2b2lkIG1laV90eGVfaHdfY29uZmlnKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwkvKiBEb2Vzbid0IGNoYW5nZSBpbiBydW50aW1lICovCisJZGV2LT5oYnVmX2RlcHRoID0gUEFZTE9BRF9TSVpFIC8gNDsKKworCWh3LT5hbGl2ZW5lc3MgPSBtZWlfdHhlX2FsaXZlbmVzc19nZXQoZGV2KTsKKwlody0+cmVhZGluZXNzID0gbWVpX3R4ZV9yZWFkaW5lc3NfZ2V0KGRldik7CisKKwlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImFsaXZlbmVzc19yZXNwID0gMHglMDh4LCByZWFkaW5lc3MgPSAweCUwOHguXG4iLAorCQlody0+YWxpdmVuZXNzLCBody0+cmVhZGluZXNzKTsKK30KKworCisvKioKKyAqIG1laV90eGVfd3JpdGUgLSB3cml0ZXMgYSBtZXNzYWdlIHRvIGRldmljZS4KKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogQGhlYWRlcjogaGVhZGVyIG9mIG1lc3NhZ2UKKyAqIEBidWY6IG1lc3NhZ2UgYnVmZmVyIHdpbGwgYmUgd3JpdHRlbgorICogcmV0dXJucyAxIGlmIHN1Y2Nlc3MsIDAgLSBvdGhlcndpc2UuCisgKi8KKworc3RhdGljIGludCBtZWlfdHhlX3dyaXRlKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCisJCXN0cnVjdCBtZWlfbXNnX2hkciAqaGVhZGVyLCB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJdW5zaWduZWQgbG9uZyByZW07CisJdW5zaWduZWQgbG9uZyBsZW5ndGg7CisJaW50IHNsb3RzID0gZGV2LT5oYnVmX2RlcHRoOworCXUzMiAqcmVnX2J1ZiA9ICh1MzIgKilidWY7CisJdTMyIGR3X2NudDsKKwlpbnQgaTsKKworCWlmIChXQVJOX09OKCFoZWFkZXIgfHwgIWJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJbGVuZ3RoID0gaGVhZGVyLT5sZW5ndGg7CisKKwlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgTUVJX0hEUl9GTVQsIE1FSV9IRFJfUFJNKGhlYWRlcikpOworCisJZHdfY250ID0gbWVpX2RhdGEyc2xvdHMobGVuZ3RoKTsKKwlpZiAoZHdfY250ID4gc2xvdHMpCisJCXJldHVybiAtRU1TR1NJWkU7CisKKwlpZiAoV0FSTighaHctPmFsaXZlbmVzcywgInR4ZSB3cml0ZTogYWxpdmVuZXNzIG5vdCBhc3NlcnRlZFxuIikpCisJCXJldHVybiAtRUFHQUlOOworCisJLyogRW5hYmxlIElucHV0IFJlYWR5IEludGVycnVwdC4gKi8KKwltZWlfdHhlX2lucHV0X3JlYWR5X2ludGVycnVwdF9lbmFibGUoZGV2KTsKKworCWlmICghbWVpX3R4ZV9pc19pbnB1dF9yZWFkeShkZXYpKSB7CisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiSW5wdXQgaXMgbm90IHJlYWR5Iik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCW1laV90eGVfaW5wdXRfcGF5bG9hZF93cml0ZShkZXYsIDAsICooKHUzMiAqKWhlYWRlcikpOworCisJZm9yIChpID0gMDsgaSA8IGxlbmd0aCAvIDQ7IGkrKykKKwkJbWVpX3R4ZV9pbnB1dF9wYXlsb2FkX3dyaXRlKGRldiwgaSArIDEsIHJlZ19idWZbaV0pOworCisJcmVtID0gbGVuZ3RoICYgMHgzOworCWlmIChyZW0gPiAwKSB7CisJCXUzMiByZWcgPSAwOworCQltZW1jcHkoJnJlZywgJmJ1ZltsZW5ndGggLSByZW1dLCByZW0pOworCQltZWlfdHhlX2lucHV0X3BheWxvYWRfd3JpdGUoZGV2LCBpICsgMSwgcmVnKTsKKwl9CisKKwkvKiBhZnRlciBlYWNoIHdyaXRlIHRoZSB3aG9sZSBidWZmZXIgaXMgY29uc3VtZWQgKi8KKwlody0+c2xvdHMgPSAwOworCisJLyogU2V0IElucHV0LURvb3JiZWxsICovCisJbWVpX3R4ZV9pbnB1dF9kb29yYmVsbF9zZXQoaHcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbWVpX3R4ZV9oYnVmX21heF9sZW4gLSBtaW1pY3MgdGhlIG1lIGhidWYgY2lyY3VsYXIgYnVmZmVyCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zIHRoZSBQQVlMT0FEX1NJWkUgLSA0CisgKi8KK3N0YXRpYyBzaXplX3QgbWVpX3R4ZV9oYnVmX21heF9sZW4oY29uc3Qgc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gUEFZTE9BRF9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBtZWlfbXNnX2hkcik7Cit9CisKKy8qKgorICogbWVpX3R4ZV9oYnVmX2VtcHR5X3Nsb3RzIC0gbWltaWNzIHRoZSBtZSBoYnVmIGNpcmN1bGFyIGJ1ZmZlcgorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyBhbHdheXMgaGJ1Zl9kZXB0aAorICovCitzdGF0aWMgaW50IG1laV90eGVfaGJ1Zl9lbXB0eV9zbG90cyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCXJldHVybiBody0+c2xvdHM7Cit9CisKKy8qKgorICogbWVpX3R4ZV9jb3VudF9mdWxsX3JlYWRfc2xvdHMgLSBtaW1pY3MgdGhlIG1lIGRldmljZSBjaXJjdWxhciBidWZmZXIKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgYWx3YXlzIGJ1ZmZlciBzaXplIGluIGR3b3JkcyBjb3VudAorICovCitzdGF0aWMgaW50IG1laV90eGVfY291bnRfZnVsbF9yZWFkX3Nsb3RzKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJLyogcmVhZCBidWZmZXJzIGhhcyBzdGF0aWMgc2l6ZSAqLworCXJldHVybiAgUEFZTE9BRF9TSVpFIC8gNDsKK30KKworLyoqCisgKiBtZWlfdHhlX3JlYWRfaGRyIC0gcmVhZCBtZXNzYWdlIGhlYWRlciB3aGljaCBpcyBhbHdheXMgaW4gNCBmaXJzdCBieXRlcworICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyBtZWkgbWVzc2FnZSBoZWFkZXIKKyAqLworCitzdGF0aWMgdTMyIG1laV90eGVfcmVhZF9oZHIoY29uc3Qgc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gbWVpX3R4ZV9vdXRfZGF0YV9yZWFkKGRldiwgMCk7Cit9CisvKioKKyAqIG1laV90eGVfcmVhZCAtIHJlYWRzIGEgbWVzc2FnZSBmcm9tIHRoZSB0eGUgZGV2aWNlLgorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVmOiBtZXNzYWdlIGJ1ZmZlciB3aWxsIGJlIHdyaXR0ZW4KKyAqIEBsZW46IG1lc3NhZ2Ugc2l6ZSB3aWxsIGJlIHJlYWQKKyAqCisgKiByZXR1cm5zIC1FSU5WQUwgb24gZXJyb3Igd3JvbmcgYXJndW1lbnQgYW5kIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IG1laV90eGVfcmVhZChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAorCQl1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJdTMyIGk7CisJdTMyICpyZWdfYnVmID0gKHUzMiAqKWJ1ZjsKKwl1MzIgcmVtID0gbGVuICYgMHgzOworCisJaWYgKFdBUk5fT04oIWJ1ZiB8fCAhbGVuKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwKKwkJImJ1ZmZlci1sZW5ndGggPSAlbHUgYnVmWzBdMHglMDhYXG4iLAorCQlsZW4sIG1laV90eGVfb3V0X2RhdGFfcmVhZChkZXYsIDApKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW4gLyA0OyBpKyspIHsKKwkJLyogc2tpcCBoZWFkZXI6IGluZGV4IHN0YXJ0cyBmcm9tIDEgKi8KKwkJdTMyIHJlZyA9IG1laV90eGVfb3V0X2RhdGFfcmVhZChkZXYsIGkgKyAxKTsKKwkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJidWZbJWRdID0gMHglMDhYXG4iLCBpLCByZWcpOworCQkqcmVnX2J1ZisrID0gcmVnOworCX0KKworCWlmIChyZW0pIHsKKwkJdTMyIHJlZyA9IG1laV90eGVfb3V0X2RhdGFfcmVhZChkZXYsIGkgKyAxKTsKKwkJbWVtY3B5KHJlZ19idWYsICZyZWcsIHJlbSk7CisJfQorCisJbWVpX3R4ZV9vdXRwdXRfcmVhZHlfc2V0KGh3KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBtZWlfdHhlX2h3X3Jlc2V0IC0gcmVzZXRzIGhvc3QgYW5kIGZ3LgorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAaW50cl9lbmFibGU6IGlmIGludGVycnVwdCBzaG91bGQgYmUgZW5hYmxlZCBhZnRlciByZXNldC4KKyAqCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgPCAwIGluIGNhc2Ugb2YgZXJyb3IKKyAqLworc3RhdGljIGludCBtZWlfdHhlX2h3X3Jlc2V0KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIGJvb2wgaW50cl9lbmFibGUpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisKKwl1MzIgYWxpdmVuZXNzX3JlcTsKKwkvKgorCSAqIHJlYWQgaW5wdXQgZG9vcmJlbGwgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IGJldHdlZW4gIEJyaWRnZSBhbmQgU2VDCisJICogcmV0dXJuIHZhbHVlIG1pZ2h0IGJlIGdhcmJhZ2UgcmV0dXJuCisJICovCisJKHZvaWQpbWVpX3R4ZV9zZWNfcmVnX3JlYWRfc2lsZW50KGh3LCBTRUNfSVBDX0lOUFVUX0RPT1JCRUxMX1JFRyk7CisKKwlhbGl2ZW5lc3NfcmVxID0gbWVpX3R4ZV9hbGl2ZW5lc3NfcmVxX2dldChkZXYpOworCWh3LT5hbGl2ZW5lc3MgPSBtZWlfdHhlX2FsaXZlbmVzc19nZXQoZGV2KTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBpbiB0aGlzIHN0YWdlIHdlIHdpbGwgcG9sbCAqLworCW1laV90eGVfaW50cl9kaXNhYmxlKGRldik7CisKKwkvKgorCSAqIElmIEFsaXZlbmVzcyBSZXF1ZXN0IGFuZCBBbGl2ZW5lc3MgUmVzcG9uc2UgYXJlIG5vdCBlcXVhbCB0aGVuCisJICogd2FpdCBmb3IgdGhlbSB0byBiZSBlcXVhbAorCSAqIFNpbmNlIHdlIG1pZ2h0IGhhdmUgaW50ZXJydXB0cyBkaXNhYmxlZCAtIHBvbGwgZm9yIGl0CisJICovCisJaWYgKGFsaXZlbmVzc19yZXEgIT0gaHctPmFsaXZlbmVzcykKKwkJaWYgKG1laV90eGVfYWxpdmVuZXNzX3BvbGwoZGV2LCBhbGl2ZW5lc3NfcmVxKSA8IDApIHsKKwkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LAorCQkJCSJ3YWl0IGZvciBhbGl2ZW5lc3Mgc2V0dGxlIGZhaWxlZCAuLi4gYmFpbGluZyBvdXRcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCS8qCisJICogSWYgQWxpdmVuZXNzIFJlcXVlc3QgYW5kIEFsaXZlbmVzcyBSZXNwb25zZSBhcmUgc2V0IHRoZW4gY2xlYXIgdGhlbQorCSAqLworCWlmIChhbGl2ZW5lc3NfcmVxKSB7CisJCW1laV90eGVfYWxpdmVuZXNzX3NldChkZXYsIDApOworCQlpZiAobWVpX3R4ZV9hbGl2ZW5lc3NfcG9sbChkZXYsIDApIDwgMCkgeworCQkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsCisJCQkJIndhaXQgZm9yIGFsaXZlbmVzcyBmYWlsZWQgLi4uIGJhaWxpbmcgb3V0XG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCisJLyoKKwkgKiBTZXQgcmVkaW5lc3MgUkRZX0NMUiBiaXQKKwkgKi8KKwltZWlfdHhlX3JlYWRpbmVzc19jbGVhcihkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbWVpX3R4ZV9od19zdGFydCAtIHN0YXJ0IHRoZSBoYXJkd2FyZSBhZnRlciByZXNldAorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIDwgMCBpbiBjYXNlIG9mIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgbWVpX3R4ZV9od19zdGFydChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCWludCByZXQ7CisKKwl1MzIgaGlzcjsKKworCS8qIGJyaW5nIGJhY2sgaW50ZXJydXB0cyAqLworCW1laV90eGVfaW50cl9lbmFibGUoZGV2KTsKKworCXJldCA9IG1laV90eGVfcmVhZGluZXNzX3dhaXQoZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIndhdGluZyBmb3IgcmVhZGluZXNzIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyoKKwkgKiBJZiBISVNSLklOVDJfU1RTIGludGVycnVwdCBzdGF0dXMgYml0IGlzIHNldCB0aGVuIGNsZWFyIGl0LgorCSAqLworCWhpc3IgPSBtZWlfdHhlX2JyX3JlZ19yZWFkKGh3LCBISVNSX1JFRyk7CisJaWYgKGhpc3IgJiBISVNSX0lOVF8yX1NUUykKKwkJbWVpX3R4ZV9icl9yZWdfd3JpdGUoaHcsIEhJU1JfUkVHLCBISVNSX0lOVF8yX1NUUyk7CisKKwkvKiBDbGVhciB0aGUgaW50ZXJydXB0IGNhdXNlIG9mIE91dHB1dERvb3JiZWxsICovCisJY2xlYXJfYml0KFRYRV9JTlRSX09VVF9EQl9CSVQsICZody0+aW50cl9jYXVzZSk7CisKKwlyZXQgPSBtZWlfdHhlX2FsaXZlbmVzc19zZXRfc3luYyhkZXYsIDEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAid2FpdCBmb3IgYWxpdmVuZXNzIGZhaWxlZCAuLi4gYmFpbGluZyBvdXRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGVuYWJsZSBpbnB1dCByZWFkeSBpbnRlcnJ1cHRzOgorCSAqIFNFQ19JUENfSE9TVF9JTlRfTUFTSy5JUENfSU5QVVRfUkVBRFlfSU5UX01BU0sKKwkgKi8KKwltZWlfdHhlX2lucHV0X3JlYWR5X2ludGVycnVwdF9lbmFibGUoZGV2KTsKKworCisJLyogIFNldCB0aGUgU0lDUl9TRUNfSVBDX09VVFBVVF9TVEFUVVMuSVBDX09VVFBVVF9SRUFEWSBiaXQgKi8KKwltZWlfdHhlX291dHB1dF9yZWFkeV9zZXQoaHcpOworCisJLyogU2V0IGJpdCBTSUNSX0hPU1RfSVBDX1JFQURJTkVTUy5IT1NUX1JEWQorCSAqLworCW1laV90eGVfcmVhZGluZXNzX3NldF9ob3N0X3JkeShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbWVpX3R4ZV9jaGVja19hbmRfYWNrX2ludHJzIC0gdHJhbnNsYXRlIG11bHRpIEJBUiBpbnRlcnJ1cHQgaW50bworICogIHNpbmdsZSBiaXQgbWFzayBhbmQgYWNrbm93bGVkZ2UgdGhlIGludGVycnVwdHMKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogQGRvX2FjazogYWNrbm93bGVkZ2UgaW50ZXJydXB0cworICovCitzdGF0aWMgYm9vbCBtZWlfdHhlX2NoZWNrX2FuZF9hY2tfaW50cnMoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgYm9vbCBkb19hY2spCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJdTMyIGhpc3I7CisJdTMyIGhoaXNyOworCXUzMiBpcGNfaXNyOworCXUzMiBhbGl2ZW5lc3M7CisJYm9vbCBnZW5lcmF0ZWQ7CisKKwkvKiByZWFkIGludGVycnVwdCByZWdpc3RlcnMgKi8KKwloaGlzciA9IG1laV90eGVfYnJfcmVnX3JlYWQoaHcsIEhISVNSX1JFRyk7CisJZ2VuZXJhdGVkID0gKGhoaXNyICYgSVBDX0hISUVSX01TSyk7CisJaWYgKCFnZW5lcmF0ZWQpCisJCWdvdG8gb3V0OworCisJaGlzciA9IG1laV90eGVfYnJfcmVnX3JlYWQoaHcsIEhJU1JfUkVHKTsKKworCWFsaXZlbmVzcyA9IG1laV90eGVfYWxpdmVuZXNzX2dldChkZXYpOworCWlmIChoaGlzciAmIElQQ19ISElFUl9TRUMgJiYgYWxpdmVuZXNzKQorCQlpcGNfaXNyID0gbWVpX3R4ZV9zZWNfcmVnX3JlYWRfc2lsZW50KGh3LAorCQkJCVNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX1JFRyk7CisJZWxzZQorCQlpcGNfaXNyID0gMDsKKworCWdlbmVyYXRlZCA9IGdlbmVyYXRlZCB8fAorCQkoaGlzciAmIEhJU1JfSU5UX1NUU19NU0spIHx8CisJCShpcGNfaXNyICYgU0VDX0lQQ19IT1NUX0lOVF9TVEFUVVNfUEVORElORyk7CisKKwlpZiAoZ2VuZXJhdGVkICYmIGRvX2FjaykgeworCQkvKiBTYXZlIHRoZSBpbnRlcnJ1cHQgY2F1c2VzICovCisJCWh3LT5pbnRyX2NhdXNlIHw9IGhpc3IgJiBISVNSX0lOVF9TVFNfTVNLOworCQlpZiAoaXBjX2lzciAmIFNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX0lOX1JEWSkKKwkJCWh3LT5pbnRyX2NhdXNlIHw9IFRYRV9JTlRSX0lOX1JFQURZOworCisKKwkJbWVpX3R4ZV9pbnRyX2Rpc2FibGUoZGV2KTsKKwkJLyogQ2xlYXIgdGhlIGludGVycnVwdHMgaW4gaGllcmFyY2h5OgorCQkgKiBJUEMgYW5kIEJyaWRnZSwgdGhhbiB0aGUgSGlnaCBMZXZlbCAqLworCQltZWlfdHhlX3NlY19yZWdfd3JpdGVfc2lsZW50KGh3LAorCQkJU0VDX0lQQ19IT1NUX0lOVF9TVEFUVVNfUkVHLCBpcGNfaXNyKTsKKwkJbWVpX3R4ZV9icl9yZWdfd3JpdGUoaHcsIEhJU1JfUkVHLCBoaXNyKTsKKwkJbWVpX3R4ZV9icl9yZWdfd3JpdGUoaHcsIEhISVNSX1JFRywgaGhpc3IpOworCX0KKworb3V0OgorCXJldHVybiBnZW5lcmF0ZWQ7Cit9CisKKy8qKgorICogbWVpX3R4ZV9pcnFfcXVpY2tfaGFuZGxlciAtIFRoZSBJU1Igb2YgdGhlIE1FSSBkZXZpY2UKKyAqCisgKiBAaXJxOiBUaGUgaXJxIG51bWJlcgorICogQGRldl9pZDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgaXJxcmV0dXJuX3QKKyAqLworaXJxcmV0dXJuX3QgbWVpX3R4ZV9pcnFfcXVpY2tfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IGRldl9pZDsKKworCWlmIChtZWlfdHhlX2NoZWNrX2FuZF9hY2tfaW50cnMoZGV2LCB0cnVlKSkKKwkJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKKworLyoqCisgKiBtZWlfdHhlX2lycV90aHJlYWRfaGFuZGxlciAtIHR4ZSBpbnRlcnJ1cHQgdGhyZWFkCisgKgorICogQGlycTogVGhlIGlycSBudW1iZXIKKyAqIEBkZXZfaWQ6IHBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zIGlycXJldHVybl90CisgKgorICovCitpcnFyZXR1cm5fdCBtZWlfdHhlX2lycV90aHJlYWRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbWVpX2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJc3RydWN0IG1laV9jbF9jYiBjb21wbGV0ZV9saXN0OworCXMzMiBzbG90czsKKwlpbnQgcmV0cyA9IDA7CisKKwlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImlycSB0aHJlYWQ6IEludGVycnVwdCBSZWdpc3RlcnMgSEhJU1J8SElTUnxTRUM9JTAyWHwlMDRYfCUwMlhcbiIsCisJCW1laV90eGVfYnJfcmVnX3JlYWQoaHcsIEhISVNSX1JFRyksCisJCW1laV90eGVfYnJfcmVnX3JlYWQoaHcsIEhJU1JfUkVHKSwKKwkJbWVpX3R4ZV9zZWNfcmVnX3JlYWRfc2lsZW50KGh3LCBTRUNfSVBDX0hPU1RfSU5UX1NUQVRVU19SRUcpKTsKKworCisJLyogaW5pdGlhbGl6ZSBvdXIgY29tcGxldGUgbGlzdCAqLworCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCW1laV9pb19saXN0X2luaXQoJmNvbXBsZXRlX2xpc3QpOworCisJaWYgKHBjaV9kZXZfbXNpX2VuYWJsZWQoZGV2LT5wZGV2KSkKKwkJbWVpX3R4ZV9jaGVja19hbmRfYWNrX2ludHJzKGRldiwgdHJ1ZSk7CisKKwkvKiBzaG93IGlycSBldmVudHMgKi8KKwltZWlfdHhlX3BlbmRpbmdfaW50ZXJydXB0cyhkZXYpOworCisJaHctPmFsaXZlbmVzcyA9IG1laV90eGVfYWxpdmVuZXNzX2dldChkZXYpOworCWh3LT5yZWFkaW5lc3MgPSBtZWlfdHhlX3JlYWRpbmVzc19nZXQoZGV2KTsKKworCS8qIFJlYWRpbmVzczoKKwkgKiBEZXRlY3Rpb24gb2YgVFhFIGRyaXZlciBnb2luZyB0aHJvdWdoIHJlc2V0CisJICogb3IgVFhFIGRyaXZlciByZXNldHRpbmcgdGhlIEhFQ0kgaW50ZXJmYWNlLgorCSAqLworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoVFhFX0lOVFJfUkVBRElORVNTX0JJVCwgJmh3LT5pbnRyX2NhdXNlKSkgeworCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgIlJlYWRpbmVzcyBJbnRlcnJ1cHQgd2FzIHJlY2VpdmVkLi4uXG4iKTsKKworCQkvKiBDaGVjayBpZiBTZUMgaXMgZ29pbmcgdGhyb3VnaCByZXNldCAqLworCQlpZiAobWVpX3R4ZV9yZWFkaW5lc3NfaXNfc2VjX3JkeShody0+cmVhZGluZXNzKSkgeworCQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJ3ZSBuZWVkIHRvIHN0YXJ0IHRoZSBkZXYuXG4iKTsKKwkJCWRldi0+cmVjdmRfaHdfcmVhZHkgPSB0cnVlOworCQl9IGVsc2UgeworCQkJZGV2LT5yZWN2ZF9od19yZWFkeSA9IGZhbHNlOworCQkJaWYgKGRldi0+ZGV2X3N0YXRlICE9IE1FSV9ERVZfUkVTRVRUSU5HKSB7CisKKwkJCQlkZXZfd2FybigmZGV2LT5wZGV2LT5kZXYsICJGVyBub3QgcmVhZHk6IHJlc2V0dGluZy5cbiIpOworCQkJCXNjaGVkdWxlX3dvcmsoJmRldi0+cmVzZXRfd29yayk7CisJCQkJZ290byBlbmQ7CisKKwkJCX0KKwkJfQorCQl3YWtlX3VwKCZkZXYtPndhaXRfaHdfcmVhZHkpOworCX0KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyogQ2hlY2sgaW50ZXJydXB0IGNhdXNlOgorCSAqIEFsaXZlbmVzczogRGV0ZWN0aW9uIG9mIFNlQyBhY2tub3dsZWRnZSBvZiBob3N0IHJlcXVlc3QgdGhhdAorCSAqIGl0IHJlbWFpbiBhbGl2ZSBvciBob3N0IGNhbmNlbGxhdGlvbiBvZiB0aGF0IHJlcXVlc3QuCisJICovCisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFRYRV9JTlRSX0FMSVZFTkVTU19CSVQsICZody0+aW50cl9jYXVzZSkpIHsKKwkJLyogQ2xlYXIgdGhlIGludGVycnVwdCBjYXVzZSAqLworCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwKKwkJCSJBbGl2ZW5lc3MgSW50ZXJydXB0OiBTdGF0dXM6ICVkXG4iLCBody0+YWxpdmVuZXNzKTsKKwkJaHctPnJlY3ZkX2FsaXZlbmVzcyA9IHRydWU7CisJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZody0+d2FpdF9hbGl2ZW5lc3MpKQorCQkJd2FrZV91cCgmaHctPndhaXRfYWxpdmVuZXNzKTsKKwl9CisKKworCS8qIE91dHB1dCBEb29yYmVsbDoKKwkgKiBEZXRlY3Rpb24gb2YgU2VDIGhhdmluZyBzZW50IG91dHB1dCB0byBob3N0CisJICovCisJc2xvdHMgPSBtZWlfY291bnRfZnVsbF9yZWFkX3Nsb3RzKGRldik7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChUWEVfSU5UUl9PVVRfREJfQklULCAmaHctPmludHJfY2F1c2UpKSB7CisJCS8qIFJlYWQgZnJvbSBUWEUgKi8KKwkJcmV0cyA9IG1laV9pcnFfcmVhZF9oYW5kbGVyKGRldiwgJmNvbXBsZXRlX2xpc3QsICZzbG90cyk7CisJCWlmIChyZXRzICYmIGRldi0+ZGV2X3N0YXRlICE9IE1FSV9ERVZfUkVTRVRUSU5HKSB7CisJCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwKKwkJCQkibWVpX2lycV9yZWFkX2hhbmRsZXIgcmV0ID0gJWQuXG4iLCByZXRzKTsKKworCQkJc2NoZWR1bGVfd29yaygmZGV2LT5yZXNldF93b3JrKTsKKwkJCWdvdG8gZW5kOworCQl9CisJfQorCS8qIElucHV0IFJlYWR5OiBEZXRlY3Rpb24gaWYgaG9zdCBjYW4gd3JpdGUgdG8gU2VDICovCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChUWEVfSU5UUl9JTl9SRUFEWV9CSVQsICZody0+aW50cl9jYXVzZSkpIHsKKwkJZGV2LT5oYnVmX2lzX3JlYWR5ID0gdHJ1ZTsKKwkJaHctPnNsb3RzID0gZGV2LT5oYnVmX2RlcHRoOworCX0KKworCWlmIChody0+YWxpdmVuZXNzICYmIGRldi0+aGJ1Zl9pc19yZWFkeSkgeworCQkvKiBnZXQgdGhlIHJlYWwgcmVnaXN0ZXIgdmFsdWUgKi8KKwkJZGV2LT5oYnVmX2lzX3JlYWR5ID0gbWVpX2hidWZfaXNfcmVhZHkoZGV2KTsKKwkJcmV0cyA9IG1laV9pcnFfd3JpdGVfaGFuZGxlcihkZXYsICZjb21wbGV0ZV9saXN0KTsKKwkJaWYgKHJldHMgJiYgcmV0cyAhPSAtRU1TR1NJWkUpCisJCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIm1laV9pcnFfd3JpdGVfaGFuZGxlciByZXQgPSAlZC5cbiIsCisJCQkJcmV0cyk7CisJCWRldi0+aGJ1Zl9pc19yZWFkeSA9IG1laV9oYnVmX2lzX3JlYWR5KGRldik7CisJfQorCisJbWVpX2lycV9jb21wbF9oYW5kbGVyKGRldiwgJmNvbXBsZXRlX2xpc3QpOworCitlbmQ6CisJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJpbnRlcnJ1cHQgdGhyZWFkIGVuZCByZXQgPSAlZFxuIiwgcmV0cyk7CisKKwltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCisJbWVpX2VuYWJsZV9pbnRlcnJ1cHRzKGRldik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1laV9od19vcHMgbWVpX3R4ZV9od19vcHMgPSB7CisKKwkuaG9zdF9pc19yZWFkeSA9IG1laV90eGVfaG9zdF9pc19yZWFkeSwKKworCS5od19pc19yZWFkeSA9IG1laV90eGVfaHdfaXNfcmVhZHksCisJLmh3X3Jlc2V0ID0gbWVpX3R4ZV9od19yZXNldCwKKwkuaHdfY29uZmlnID0gbWVpX3R4ZV9od19jb25maWcsCisJLmh3X3N0YXJ0ID0gbWVpX3R4ZV9od19zdGFydCwKKworCS5pbnRyX2NsZWFyID0gbWVpX3R4ZV9pbnRyX2NsZWFyLAorCS5pbnRyX2VuYWJsZSA9IG1laV90eGVfaW50cl9lbmFibGUsCisJLmludHJfZGlzYWJsZSA9IG1laV90eGVfaW50cl9kaXNhYmxlLAorCisJLmhidWZfZnJlZV9zbG90cyA9IG1laV90eGVfaGJ1Zl9lbXB0eV9zbG90cywKKwkuaGJ1Zl9pc19yZWFkeSA9IG1laV90eGVfaXNfaW5wdXRfcmVhZHksCisJLmhidWZfbWF4X2xlbiA9IG1laV90eGVfaGJ1Zl9tYXhfbGVuLAorCisJLndyaXRlID0gbWVpX3R4ZV93cml0ZSwKKworCS5yZGJ1Zl9mdWxsX3Nsb3RzID0gbWVpX3R4ZV9jb3VudF9mdWxsX3JlYWRfc2xvdHMsCisJLnJlYWRfaGRyID0gbWVpX3R4ZV9yZWFkX2hkciwKKworCS5yZWFkID0gbWVpX3R4ZV9yZWFkLAorCit9OworCisvKioKKyAqIG1laV90eGVfZGV2X2luaXQgLSBhbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIHR4ZSBoYXJkd2FyZSBzcGVjaWZpYyBzdHJ1Y3R1cmUKKyAqCisgKiBAcGRldiAtIHBjaSBkZXZpY2UKKyAqIHJldHVybnMgc3RydWN0IG1laV9kZXZpY2UgKiBvbiBzdWNjZXNzIG9yIE5VTEw7CisgKgorICovCitzdHJ1Y3QgbWVpX2RldmljZSAqbWVpX3R4ZV9kZXZfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2OworCXN0cnVjdCBtZWlfdHhlX2h3ICpodzsKKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtZWlfZGV2aWNlKSArCisJCQkgc2l6ZW9mKHN0cnVjdCBtZWlfdHhlX2h3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisJbWVpX2RldmljZV9pbml0KGRldik7CisKKwlodyA9IHRvX3R4ZV9odyhkZXYpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmaHctPndhaXRfYWxpdmVuZXNzKTsKKworCWRldi0+b3BzID0gJm1laV90eGVfaHdfb3BzOworCisJZGV2LT5wZGV2ID0gcGRldjsKKwlyZXR1cm4gZGV2OworfQorCisvKioKKyAqIG1laV90eGVfc2V0dXBfc2F0dDIgLSBTQVRUMiBjb25maWd1cmF0aW9uIGZvciBETUEgc3VwcG9ydC4KKyAqCisgKiBAZGV2OiAgIHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYWRkcjogIHBoeXNpY2FsIGFkZHJlc3Mgc3RhcnQgb2YgdGhlIHJhbmdlCisgKiBAcmFuZ2U6IHBoeXNpY2FsIHJhbmdlIHNpemUKKyAqLworaW50IG1laV90eGVfc2V0dXBfc2F0dDIoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgcGh5c19hZGRyX3QgYWRkciwgdTMyIHJhbmdlKQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCisJdTMyIGxvMzIgPSBsb3dlcl8zMl9iaXRzKGFkZHIpOworCXUzMiBoaTMyID0gdXBwZXJfMzJfYml0cyhhZGRyKTsKKwl1MzIgY3RybDsKKworCS8qIFNBVFQgaXMgbGltaXRlZCB0byAzNiBCaXRzICovCisJaWYgKGhpMzIgJiB+MHhGKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFNBVFQgaGFzIHRvIGJlIDE2Qnl0ZSBhbGlnbmVkICovCisJaWYgKGxvMzIgJiAweEYpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogU0FUVCByYW5nZSBoYXMgdG8gYmUgNEJ5dGVzIGFsaWduZWQgKi8KKwlpZiAocmFuZ2UgJiAweDQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogU0FUVCBpcyBsaW1pdGVkIHRvIDMyIE1CIHJhbmdlKi8KKwlpZiAocmFuZ2UgPiBTQVRUX1JBTkdFX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljdHJsID0gU0FUVDJfQ1RSTF9WQUxJRF9NU0s7CisJY3RybCB8PSBoaTMyICA8PCBTQVRUMl9DVFJMX0JSX0JBU0VfQUREUl9SRUdfU0hJRlQ7CisKKwltZWlfdHhlX2JyX3JlZ193cml0ZShodywgU0FUVDJfU0FQX1NJWkVfUkVHLCByYW5nZSk7CisJbWVpX3R4ZV9icl9yZWdfd3JpdGUoaHcsIFNBVFQyX0JSR19CQV9MU0JfUkVHLCBsbzMyKTsKKwltZWlfdHhlX2JyX3JlZ193cml0ZShodywgU0FUVDJfQ1RSTF9SRUcsIGN0cmwpOworCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiU0FUVDI6IFNBUF9TSVpFX09GRlNFVD0weCUwOFgsIEJSR19CQV9MU0JfT0ZGU0VUPTB4JTA4WCwgQ1RSTF9PRkZTRVQ9MHglMDhYXG4iLAorCQlyYW5nZSwgbG8zMiwgY3RybCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvaHctdHhlLmggYi9kcml2ZXJzL21pc2MvbWVpL2h3LXR4ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTJkOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvbWVpL2h3LXR4ZS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKgorICogSW50ZWwgTWFuYWdlbWVudCBFbmdpbmUgSW50ZXJmYWNlIChJbnRlbCBNRUkpIExpbnV4IGRyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfTUVJX0hXX1RYRV9IXworI2RlZmluZSBfTUVJX0hXX1RYRV9IXworCisjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CisKKyNpbmNsdWRlICJody5oIgorI2luY2x1ZGUgImh3LXR4ZS1yZWdzLmgiCisKKy8qIEZsYXR0ZW4gSGllcmFyY2h5IGludGVycnVwdCBjYXVzZSAqLworI2RlZmluZSBUWEVfSU5UUl9SRUFESU5FU1NfQklUICAwIC8qIEhJU1JfSU5UXzBfU1RTICovCisjZGVmaW5lIFRYRV9JTlRSX1JFQURJTkVTUyAgICAgIEhJU1JfSU5UXzBfU1RTCisjZGVmaW5lIFRYRV9JTlRSX0FMSVZFTkVTU19CSVQgIDEgLyogSElTUl9JTlRfMV9TVFMgKi8KKyNkZWZpbmUgVFhFX0lOVFJfQUxJVkVORVNTICAgICAgSElTUl9JTlRfMV9TVFMKKyNkZWZpbmUgVFhFX0lOVFJfT1VUX0RCX0JJVCAgICAgMiAvKiBISVNSX0lOVF8yX1NUUyAqLworI2RlZmluZSBUWEVfSU5UUl9PVVRfREIgICAgICAgICBISVNSX0lOVF8yX1NUUworI2RlZmluZSBUWEVfSU5UUl9JTl9SRUFEWV9CSVQgICA4IC8qIGJleW9uZCBISVNSICovCisjZGVmaW5lIFRYRV9JTlRSX0lOX1JFQURZICAgICAgIEJJVCg4KQorCisvKioKKyAqIHN0cnVjdCBtZWlfdHhlX2h3IC0gdHhlIGhhcmR3YXJlIHNwZWNpZmljcworICoKKyAqIEBtZW1fYWRkcjogICAgICAgIFNlQyBhbmQgQlJJREdFIGJhcnMKKyAqIEBhbGl2ZW5lc3M6ICAgICAgIGFsaXZlbmVzcyAocG93ZXIgZ2F0aW5nKSBzdGF0ZSBvZiB0aGUgaGFyZHdhcmUKKyAqIEByZWFkaW5lc3M6ICAgICAgIHJlYWRpbmVzcyBzdGF0ZSBvZiB0aGUgaGFyZHdhcmUKKyAqIEB3YWl0X2FsaXZlbmVzczogIGFsaXZlbmVzcyB3YWl0IHF1ZXVlCisgKiBAcmVjdmRfYWxpdmVuZXNzOiBhbGl2ZW5lc3MgaW50ZXJydXB0IHdhcyByZWNpdmVkCisgKiBAaW50cl9jYXVzZTogICAgICB0cmFuc2xhdGVkIGludGVycnVwdCBjYXVzZQorICovCitzdHJ1Y3QgbWVpX3R4ZV9odyB7CisJdm9pZCBfX2lvbWVtICptZW1fYWRkcltOVU1fT0ZfTUVNX0JBUlNdOworCXUzMiBhbGl2ZW5lc3M7CisJdTMyIHJlYWRpbmVzczsKKwl1MzIgc2xvdHM7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X2FsaXZlbmVzczsKKwlib29sIHJlY3ZkX2FsaXZlbmVzczsKKworCXVuc2lnbmVkIGxvbmcgaW50cl9jYXVzZTsKK307CisKKyNkZWZpbmUgdG9fdHhlX2h3KGRldikgKHN0cnVjdCBtZWlfdHhlX2h3ICopKChkZXYpLT5odykKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWVpX2RldmljZSAqaHdfdHhlX3RvX21laShzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZigodm9pZCAqKWh3LCBzdHJ1Y3QgbWVpX2RldmljZSwgaHcpOworfQorCitzdHJ1Y3QgbWVpX2RldmljZSAqbWVpX3R4ZV9kZXZfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldik7CisKK2lycXJldHVybl90IG1laV90eGVfaXJxX3F1aWNrX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKK2lycXJldHVybl90IG1laV90eGVfaXJxX3RocmVhZF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CisKK2ludCBtZWlfdHhlX2FsaXZlbmVzc19zZXRfc3luYyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCB1MzIgcmVxKTsKKworaW50IG1laV90eGVfc2V0dXBfc2F0dDIoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgcGh5c19hZGRyX3QgYWRkciwgdTMyIHJhbmdlKTsKKworCisjZW5kaWYgLyogX01FSV9IV19UWEVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvaHcuaCBiL2RyaXZlcnMvbWlzYy9tZWkvaHcuaAppbmRleCBkZDQ0ZTMzLi42YjQ3NmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2h3LmgKKysrIGIvZHJpdmVycy9taXNjL21laS9ody5oCkBAIC0yMiw3ICsyMiw3IEBACiAvKgogICogVGltZW91dHMgaW4gU2Vjb25kcwogICovCi0jZGVmaW5lIE1FSV9JTlRFUk9QX1RJTUVPVVQgICAgICAgICA3ICAvKiBUaW1lb3V0IG9uIHJlYWR5IG1lc3NhZ2UgKi8KKyNkZWZpbmUgTUVJX0hXX1JFQURZX1RJTUVPVVQgICAgICAgIDIgIC8qIFRpbWVvdXQgb24gcmVhZHkgbWVzc2FnZSAqLwogI2RlZmluZSBNRUlfQ09OTkVDVF9USU1FT1VUICAgICAgICAgMyAgLyogSFBTOiBhdCBsZWFzdCAyIHNlY29uZHMgKi8KIAogI2RlZmluZSBNRUlfQ0xfQ09OTkVDVF9USU1FT1VUICAgICAxNSAgLyogSFBTOiBDbGllbnQgQ29ubmVjdCBUaW1lb3V0ICovCkBAIC0zMSwxMyArMzEsMTMgQEAKICNkZWZpbmUgTUVJX0lBTVRISUZfU1RBTExfVElNRVIgICAgMTIgIC8qIEhQUyAqLwogI2RlZmluZSBNRUlfSUFNVEhJRl9SRUFEX1RJTUVSICAgICAxMCAgLyogSFBTICovCiAKKyNkZWZpbmUgTUVJX0hCTV9USU1FT1VUICAgICAgICAgICAgMSAgIC8qIDEgc2Vjb25kICovCiAKIC8qCiAgKiBNRUkgVmVyc2lvbgogICovCiAjZGVmaW5lIEhCTV9NSU5PUl9WRVJTSU9OICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgSEJNX01BSk9SX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBIQk1fVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIDEgc2Vjb25kICovCiAKIC8qIEhvc3QgYnVzIG1lc3NhZ2UgY29tbWFuZCBvcGNvZGUgKi8KICNkZWZpbmUgTUVJX0hCTV9DTURfT1BfTVNLICAgICAgICAgICAgICAgICAgMHg3ZgpAQCAtODksMTkgKzg5LDE5IEBACiAgKiBDbGllbnQgQ29ubmVjdCBTdGF0dXMKICAqIHVzZWQgYnkgaGJtX2NsaWVudF9jb25uZWN0X3Jlc3BvbnNlLnN0YXR1cwogICovCi1lbnVtIGNsaWVudF9jb25uZWN0X3N0YXR1c190eXBlcyB7Ci0JQ0NTX1NVQ0NFU1MgPSAweDAwLAotCUNDU19OT1RfRk9VTkQgPSAweDAxLAotCUNDU19BTFJFQURZX1NUQVJURUQgPSAweDAyLAotCUNDU19PVVRfT0ZfUkVTT1VSQ0VTID0gMHgwMywKLQlDQ1NfTUVTU0FHRV9TTUFMTCA9IDB4MDQKK2VudW0gbWVpX2NsX2Nvbm5lY3Rfc3RhdHVzIHsKKwlNRUlfQ0xfQ09OTl9TVUNDRVNTICAgICAgICAgID0gMHgwMCwKKwlNRUlfQ0xfQ09OTl9OT1RfRk9VTkQgICAgICAgID0gMHgwMSwKKwlNRUlfQ0xfQ09OTl9BTFJFQURZX1NUQVJURUQgID0gMHgwMiwKKwlNRUlfQ0xfQ09OTl9PVVRfT0ZfUkVTT1VSQ0VTID0gMHgwMywKKwlNRUlfQ0xfQ09OTl9NRVNTQUdFX1NNQUxMICAgID0gMHgwNAogfTsKIAogLyoKICAqIENsaWVudCBEaXNjb25uZWN0IFN0YXR1cwogICovCi1lbnVtIGNsaWVudF9kaXNjb25uZWN0X3N0YXR1c190eXBlcyB7Ci0JQ0RTX1NVQ0NFU1MgPSAweDAwCitlbnVtICBtZWlfY2xfZGlzY29ubmVjdF9zdGF0dXMgeworCU1FSV9DTF9ESVNDT05OX1NVQ0NFU1MgPSAweDAwCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9pbml0LmMgYi9kcml2ZXJzL21pc2MvbWVpL2luaXQuYwppbmRleCBjZGQzMWMyLi40NDYwOTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2luaXQuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL2luaXQuYwpAQCAtMTE2LDcgKzExNiw2IEBACiAJCW1laV9jbF91bmxpbmsoJmRldi0+d2RfY2wpOwogCQltZWlfY2xfdW5saW5rKCZkZXYtPmlhbXRoaWZfY2wpOwogCQltZWlfYW10aGlmX3Jlc2V0X3BhcmFtcyhkZXYpOwotCQltZW1zZXQoJmRldi0+d3JfZXh0X21zZywgMCwgc2l6ZW9mKGRldi0+d3JfZXh0X21zZykpOwogCX0KIAogCkBAIC0xMjYsNyArMTI1LDYgQEAKIAogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJod19yZXNldCBmYWlsZWQgcmV0ID0gJWRcbiIsIHJldCk7Ci0JCWRldi0+ZGV2X3N0YXRlID0gTUVJX0RFVl9ESVNBQkxFRDsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTEzOSw3ICsxMzcsNiBAQAogCXJldCA9IG1laV9od19zdGFydChkZXYpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJod19zdGFydCBmYWlsZWQgcmV0ID0gJWRcbiIsIHJldCk7Ci0JCWRldi0+ZGV2X3N0YXRlID0gTUVJX0RFVl9ESVNBQkxFRDsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTE0OSw3ICsxNDYsNyBAQAogCXJldCA9IG1laV9oYm1fc3RhcnRfcmVxKGRldik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgImhibV9zdGFydCBmYWlsZWQgcmV0ID0gJWRcbiIsIHJldCk7Ci0JCWRldi0+ZGV2X3N0YXRlID0gTUVJX0RFVl9ESVNBQkxFRDsKKwkJZGV2LT5kZXZfc3RhdGUgPSBNRUlfREVWX1JFU0VUVElORzsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTE2Niw2ICsxNjMsNyBAQAogICovCiBpbnQgbWVpX3N0YXJ0KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCiB7CisJaW50IHJldDsKIAltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIAogCS8qIGFja25vd2xlZGdlIGludGVycnVwdCBhbmQgc3RvcCBpbnRlcnJ1cHRzICovCkBAIC0xNzUsMTAgKzE3MywxOCBAQAogCiAJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJyZXNldCBpbiBzdGFydCB0aGUgbWVpIGRldmljZS5cbiIpOwogCi0JZGV2LT5kZXZfc3RhdGUgPSBNRUlfREVWX0lOSVRJQUxJWklORzsKIAlkZXYtPnJlc2V0X2NvdW50ID0gMDsKLQltZWlfcmVzZXQoZGV2KTsKKwlkbyB7CisJCWRldi0+ZGV2X3N0YXRlID0gTUVJX0RFVl9JTklUSUFMSVpJTkc7CisJCXJldCA9IG1laV9yZXNldChkZXYpOwogCisJCWlmIChyZXQgPT0gLUVOT0RFViB8fCBkZXYtPmRldl9zdGF0ZSA9PSBNRUlfREVWX0RJU0FCTEVEKSB7CisJCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgInJlc2V0IGZhaWxlZCByZXQgPSAlZCIsIHJldCk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0gd2hpbGUgKHJldCk7CisKKwkvKiB3ZSBjYW5ub3Qgc3RhcnQgdGhlIGRldmljZSB3L28gaGJtIHN0YXJ0IG1lc3NhZ2UgY29tcGxldGVkICovCiAJaWYgKGRldi0+ZGV2X3N0YXRlID09IE1FSV9ERVZfRElTQUJMRUQpIHsKIAkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJyZXNldCBmYWlsZWQiKTsKIAkJZ290byBlcnI7CkBAIC0yMzgsMjcgKzI0NCw0MCBAQAogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIAotCWlmIChlcnIgfHwgZGV2LT5kZXZfc3RhdGUgPT0gTUVJX0RFVl9ESVNBQkxFRCkKKwlpZiAoZXJyID09IC1FTk9ERVYgfHwgZGV2LT5kZXZfc3RhdGUgPT0gTUVJX0RFVl9ESVNBQkxFRCkgeworCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgImRldmljZSBkaXNhYmxlZCA9ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiB0cnkgdG8gc3RhcnQgYWdhaW4gKi8KKwlpZiAoZXJyKQorCQlzY2hlZHVsZV93b3JrKCZkZXYtPnJlc2V0X3dvcmspOworCiAKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1laV9yZXN0YXJ0KTsKIAotCiBzdGF0aWMgdm9pZCBtZWlfcmVzZXRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbWVpX2RldmljZSwgIHJlc2V0X3dvcmspOworCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIAotCW1laV9yZXNldChkZXYpOworCXJldCA9IG1laV9yZXNldChkZXYpOwogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIAotCWlmIChkZXYtPmRldl9zdGF0ZSA9PSBNRUlfREVWX0RJU0FCTEVEKQotCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgInJlc2V0IGZhaWxlZCIpOworCWlmIChkZXYtPmRldl9zdGF0ZSA9PSBNRUlfREVWX0RJU0FCTEVEKSB7CisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiZGV2aWNlIGRpc2FibGVkID0gJWRcbiIsIHJldCk7CisJCXJldHVybjsKKwl9CisKKwkvKiByZXRyeSByZXNldCBpbiBjYXNlIG9mIGZhaWx1cmUgKi8KKwlpZiAocmV0KQorCQlzY2hlZHVsZV93b3JrKCZkZXYtPnJlc2V0X3dvcmspOwogfQogCiB2b2lkIG1laV9zdG9wKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCkBAIC0yNjksNiArMjg4LDggQEAKIAogCW1laV9uZmNfaG9zdF9leGl0KGRldik7CiAKKwltZWlfY2xfYnVzX3JlbW92ZV9kZXZpY2VzKGRldik7CisKIAltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIAogCW1laV93ZF9zdG9wKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2ludGVycnVwdC5jIGIvZHJpdmVycy9taXNjL21laS9pbnRlcnJ1cHQuYwppbmRleCBmMGZiYjUxLi4yOWI1YWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2ludGVycnVwdC5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvaW50ZXJydXB0LmMKQEAgLTI2LDcgKzI2LDYgQEAKIAogI2luY2x1ZGUgIm1laV9kZXYuaCIKICNpbmNsdWRlICJoYm0uaCIKLSNpbmNsdWRlICJody1tZS5oIgogI2luY2x1ZGUgImNsaWVudC5oIgogCiAKQEAgLTE2MSwyOSArMTYwLDYzIEBACiB9CiAKIC8qKgorICogbWVpX2NsX2lycV9kaXNjb25uZWN0X3JzcCAtIHNlbmQgZGlzY29ubmVjdGlvbiByZXNwb25zZSBtZXNzYWdlCisgKgorICogQGNsOiBjbGllbnQKKyAqIEBjYjogY2FsbGJhY2sgYmxvY2suCisgKiBAY21wbF9saXN0OiBjb21wbGV0ZSBsaXN0LgorICoKKyAqIHJldHVybnMgMCwgT0s7IG90aGVyd2lzZSwgZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgbWVpX2NsX2lycV9kaXNjb25uZWN0X3JzcChzdHJ1Y3QgbWVpX2NsICpjbCwgc3RydWN0IG1laV9jbF9jYiAqY2IsCisJCQkJICAgICBzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QpCit7CisJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IGNsLT5kZXY7CisJdTMyIG1zZ19zbG90czsKKwlpbnQgc2xvdHM7CisJaW50IHJldDsKKworCXNsb3RzID0gbWVpX2hidWZfZW1wdHlfc2xvdHMoZGV2KTsKKwltc2dfc2xvdHMgPSBtZWlfZGF0YTJzbG90cyhzaXplb2Yoc3RydWN0IGhibV9jbGllbnRfY29ubmVjdF9yZXNwb25zZSkpOworCisJaWYgKHNsb3RzIDwgbXNnX3Nsb3RzKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJcmV0ID0gbWVpX2hibV9jbF9kaXNjb25uZWN0X3JzcChkZXYsIGNsKTsKKworCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0RJU0NPTk5FQ1RFRDsKKwljbC0+c3RhdHVzID0gMDsKKwlsaXN0X2RlbCgmY2ItPmxpc3QpOworCW1laV9pb19jYl9mcmVlKGNiKTsKKworCXJldHVybiByZXQ7Cit9CisKKworCisvKioKICAqIG1laV9jbF9pcnFfY2xvc2UgLSBwcm9jZXNzZXMgY2xvc2UgcmVsYXRlZCBvcGVyYXRpb24gZnJvbQogICoJaW50ZXJydXB0IHRocmVhZCBjb250ZXh0IC0gc2VuZCBkaXNjb25uZWN0IHJlcXVlc3QKICAqCiAgKiBAY2w6IGNsaWVudAogICogQGNiOiBjYWxsYmFjayBibG9jay4KLSAqIEBzbG90czogZnJlZSBzbG90cy4KICAqIEBjbXBsX2xpc3Q6IGNvbXBsZXRlIGxpc3QuCiAgKgogICogcmV0dXJucyAwLCBPSzsgb3RoZXJ3aXNlLCBlcnJvci4KICAqLwogc3RhdGljIGludCBtZWlfY2xfaXJxX2Nsb3NlKHN0cnVjdCBtZWlfY2wgKmNsLCBzdHJ1Y3QgbWVpX2NsX2NiICpjYiwKLQkJCXMzMiAqc2xvdHMsIHN0cnVjdCBtZWlfY2xfY2IgKmNtcGxfbGlzdCkKKwkJCSAgICBzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QpCiB7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IGNsLT5kZXY7CisJdTMyIG1zZ19zbG90czsKKwlpbnQgc2xvdHM7CiAKLQl1MzIgbXNnX3Nsb3RzID0KLQkJbWVpX2RhdGEyc2xvdHMoc2l6ZW9mKHN0cnVjdCBoYm1fY2xpZW50X2Nvbm5lY3RfcmVxdWVzdCkpOworCW1zZ19zbG90cyA9IG1laV9kYXRhMnNsb3RzKHNpemVvZihzdHJ1Y3QgaGJtX2NsaWVudF9jb25uZWN0X3JlcXVlc3QpKTsKKwlzbG90cyA9IG1laV9oYnVmX2VtcHR5X3Nsb3RzKGRldik7CiAKLQlpZiAoKnNsb3RzIDwgbXNnX3Nsb3RzKQorCWlmIChzbG90cyA8IG1zZ19zbG90cykKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAotCSpzbG90cyAtPSBtc2dfc2xvdHM7Ci0KIAlpZiAobWVpX2hibV9jbF9kaXNjb25uZWN0X3JlcShkZXYsIGNsKSkgewogCQljbC0+c3RhdHVzID0gMDsKIAkJY2ItPmJ1Zl9pZHggPSAwOwpAQCAtMjA3LDI3ICsyNDAsMjMgQEAKICAqCiAgKiBAY2w6IGNsaWVudAogICogQGNiOiBjYWxsYmFjayBibG9jay4KLSAqIEBzbG90czogZnJlZSBzbG90cy4KICAqIEBjbXBsX2xpc3Q6IGNvbXBsZXRlIGxpc3QuCiAgKgogICogcmV0dXJucyAwLCBPSzsgb3RoZXJ3aXNlLCBlcnJvci4KICAqLwogc3RhdGljIGludCBtZWlfY2xfaXJxX3JlYWQoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiLAotCQkJICAgczMyICpzbG90cywgc3RydWN0IG1laV9jbF9jYiAqY21wbF9saXN0KQorCQkJICAgc3RydWN0IG1laV9jbF9jYiAqY21wbF9saXN0KQogewogCXN0cnVjdCBtZWlfZGV2aWNlICpkZXYgPSBjbC0+ZGV2OwotCXUzMiBtc2dfc2xvdHMgPSBtZWlfZGF0YTJzbG90cyhzaXplb2Yoc3RydWN0IGhibV9mbG93X2NvbnRyb2wpKTsKLQorCXUzMiBtc2dfc2xvdHM7CisJaW50IHNsb3RzOwogCWludCByZXQ7CiAKKwltc2dfc2xvdHMgPSBtZWlfZGF0YTJzbG90cyhzaXplb2Yoc3RydWN0IGhibV9mbG93X2NvbnRyb2wpKTsKKwlzbG90cyA9IG1laV9oYnVmX2VtcHR5X3Nsb3RzKGRldik7CiAKLQlpZiAoKnNsb3RzIDwgbXNnX3Nsb3RzKSB7Ci0JCS8qIHJldHVybiB0aGUgY2FuY2VsIHJvdXRpbmUgKi8KLQkJbGlzdF9kZWwoJmNiLT5saXN0KTsKKwlpZiAoc2xvdHMgPCBtc2dfc2xvdHMpCiAJCXJldHVybiAtRU1TR1NJWkU7Ci0JfQotCi0JKnNsb3RzIC09IG1zZ19zbG90czsKIAogCXJldCA9IG1laV9oYm1fY2xfZmxvd19jb250cm9sX3JlcShkZXYsIGNsKTsKIAlpZiAocmV0KSB7CkBAIC0yNDQsMzIgKzI3MywzMCBAQAogCiAKIC8qKgotICogbWVpX2NsX2lycV9pb2N0bCAtIHByb2Nlc3NlcyBjbGllbnQgaW9jdGwgcmVsYXRlZCBvcGVyYXRpb24gZnJvbSB0aGUKLSAqCWludGVycnVwdCB0aHJlYWQgY29udGV4dCAtICAgc2VuZCBjb25uZWN0aW9uIHJlcXVlc3QKKyAqIG1laV9jbF9pcnFfY29ubmVjdCAtIHNlbmQgY29ubmVjdCByZXF1ZXN0IGluIGlycV90aHJlYWQgY29udGV4dAogICoKICAqIEBjbDogY2xpZW50CiAgKiBAY2I6IGNhbGxiYWNrIGJsb2NrLgotICogQHNsb3RzOiBmcmVlIHNsb3RzLgogICogQGNtcGxfbGlzdDogY29tcGxldGUgbGlzdC4KICAqCiAgKiByZXR1cm5zIDAsIE9LOyBvdGhlcndpc2UsIGVycm9yLgogICovCi1zdGF0aWMgaW50IG1laV9jbF9pcnFfaW9jdGwoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiLAotCQkJICAgczMyICpzbG90cywgc3RydWN0IG1laV9jbF9jYiAqY21wbF9saXN0KQorc3RhdGljIGludCBtZWlfY2xfaXJxX2Nvbm5lY3Qoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiLAorCQkJICAgICAgc3RydWN0IG1laV9jbF9jYiAqY21wbF9saXN0KQogewogCXN0cnVjdCBtZWlfZGV2aWNlICpkZXYgPSBjbC0+ZGV2OworCXUzMiBtc2dfc2xvdHM7CisJaW50IHNsb3RzOwogCWludCByZXQ7CiAKLQl1MzIgbXNnX3Nsb3RzID0KLQkJbWVpX2RhdGEyc2xvdHMoc2l6ZW9mKHN0cnVjdCBoYm1fY2xpZW50X2Nvbm5lY3RfcmVxdWVzdCkpOworCW1zZ19zbG90cyA9IG1laV9kYXRhMnNsb3RzKHNpemVvZihzdHJ1Y3QgaGJtX2NsaWVudF9jb25uZWN0X3JlcXVlc3QpKTsKKwlzbG90cyA9IG1laV9oYnVmX2VtcHR5X3Nsb3RzKGRldik7CiAKLQlpZiAoKnNsb3RzIDwgbXNnX3Nsb3RzKSB7Ci0JCS8qIHJldHVybiB0aGUgY2FuY2VsIHJvdXRpbmUgKi8KLQkJbGlzdF9kZWwoJmNiLT5saXN0KTsKKwlpZiAobWVpX2NsX2lzX290aGVyX2Nvbm5lY3RpbmcoY2wpKQorCQlyZXR1cm4gMDsKKworCWlmIChzbG90cyA8IG1zZ19zbG90cykKIAkJcmV0dXJuIC1FTVNHU0laRTsKLQl9Ci0KLQkqc2xvdHMgLT0gIG1zZ19zbG90czsKIAogCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0NPTk5FQ1RJTkc7CiAKQEAgLTMyMyw3ICszNTAsNyBAQAogCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgImxlc3MgZGF0YSBhdmFpbGFibGUgdGhhbiBsZW5ndGg9JTA4eC5cbiIsCiAJCQkJKnNsb3RzKTsKIAkJLyogd2UgY2FuJ3QgcmVhZCB0aGUgbWVzc2FnZSAqLwotCQlyZXQgPSAtRVJBTkdFOworCQlyZXQgPSAtRU5PREFUQTsKIAkJZ290byBlbmQ7CiAJfQogCkBAIC00MDksMTAgKzQzNiwxMCBAQAogCXMzMiBzbG90czsKIAlpbnQgcmV0OwogCi0JaWYgKCFtZWlfaGJ1Zl9pc19yZWFkeShkZXYpKSB7Ci0JCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiaG9zdCBidWZmZXIgaXMgbm90IGVtcHR5LlxuIik7CisKKwlpZiAoIW1laV9oYnVmX2FjcXVpcmUoZGV2KSkKIAkJcmV0dXJuIDA7Ci0JfQorCiAJc2xvdHMgPSBtZWlfaGJ1Zl9lbXB0eV9zbG90cyhkZXYpOwogCWlmIChzbG90cyA8PSAwKQogCQlyZXR1cm4gLUVNU0dTSVpFOwpAQCAtNDQ3LDI5ICs0NzQsMTYgQEAKIAogCWlmIChkZXYtPndkX3N0YXRlID09IE1FSV9XRF9TVE9QUElORykgewogCQlkZXYtPndkX3N0YXRlID0gTUVJX1dEX0lETEU7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53YWl0X3N0b3Bfd2QpOworCQl3YWtlX3VwKCZkZXYtPndhaXRfc3RvcF93ZCk7CiAJfQogCi0JaWYgKGRldi0+d3JfZXh0X21zZy5oZHIubGVuZ3RoKSB7Ci0JCW1laV93cml0ZV9tZXNzYWdlKGRldiwgJmRldi0+d3JfZXh0X21zZy5oZHIsCi0JCQkJZGV2LT53cl9leHRfbXNnLmRhdGEpOwotCQlzbG90cyAtPSBtZWlfZGF0YTJzbG90cyhkZXYtPndyX2V4dF9tc2cuaGRyLmxlbmd0aCk7Ci0JCWRldi0+d3JfZXh0X21zZy5oZHIubGVuZ3RoID0gMDsKLQl9Ci0JaWYgKGRldi0+ZGV2X3N0YXRlID09IE1FSV9ERVZfRU5BQkxFRCkgeworCWlmIChtZWlfY2xfaXNfY29ubmVjdGVkKCZkZXYtPndkX2NsKSkgewogCQlpZiAoZGV2LT53ZF9wZW5kaW5nICYmCiAJCSAgICBtZWlfY2xfZmxvd19jdHJsX2NyZWRzKCZkZXYtPndkX2NsKSA+IDApIHsKLQkJCWlmIChtZWlfd2Rfc2VuZChkZXYpKQotCQkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAid2Qgc2VuZCBmYWlsZWQuXG4iKTsKLQkJCWVsc2UgaWYgKG1laV9jbF9mbG93X2N0cmxfcmVkdWNlKCZkZXYtPndkX2NsKSkKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQorCQkJcmV0ID0gbWVpX3dkX3NlbmQoZGV2KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKIAkJCWRldi0+d2RfcGVuZGluZyA9IGZhbHNlOwotCi0JCQlpZiAoZGV2LT53ZF9zdGF0ZSA9PSBNRUlfV0RfUlVOTklORykKLQkJCQlzbG90cyAtPSBtZWlfZGF0YTJzbG90cyhNRUlfV0RfU1RBUlRfTVNHX1NJWkUpOwotCQkJZWxzZQotCQkJCXNsb3RzIC09IG1laV9kYXRhMnNsb3RzKE1FSV9XRF9TVE9QX01TR19TSVpFKTsKIAkJfQogCX0KIApAQCAtNDg0LDI4ICs0OTgsMzEgQEAKIAkJc3dpdGNoIChjYi0+Zm9wX3R5cGUpIHsKIAkJY2FzZSBNRUlfRk9QX0NMT1NFOgogCQkJLyogc2VuZCBkaXNjb25uZWN0IG1lc3NhZ2UgKi8KLQkJCXJldCA9IG1laV9jbF9pcnFfY2xvc2UoY2wsIGNiLCAmc2xvdHMsIGNtcGxfbGlzdCk7CisJCQlyZXQgPSBtZWlfY2xfaXJxX2Nsb3NlKGNsLCBjYiwgY21wbF9saXN0KTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKIAogCQkJYnJlYWs7CiAJCWNhc2UgTUVJX0ZPUF9SRUFEOgogCQkJLyogc2VuZCBmbG93IGNvbnRyb2wgbWVzc2FnZSAqLwotCQkJcmV0ID0gbWVpX2NsX2lycV9yZWFkKGNsLCBjYiwgJnNsb3RzLCBjbXBsX2xpc3QpOworCQkJcmV0ID0gbWVpX2NsX2lycV9yZWFkKGNsLCBjYiwgY21wbF9saXN0KTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKIAogCQkJYnJlYWs7Ci0JCWNhc2UgTUVJX0ZPUF9JT0NUTDoKKwkJY2FzZSBNRUlfRk9QX0NPTk5FQ1Q6CiAJCQkvKiBjb25uZWN0IG1lc3NhZ2UgKi8KLQkJCWlmIChtZWlfY2xfaXNfb3RoZXJfY29ubmVjdGluZyhjbCkpCi0JCQkJY29udGludWU7Ci0JCQlyZXQgPSBtZWlfY2xfaXJxX2lvY3RsKGNsLCBjYiwgJnNsb3RzLCBjbXBsX2xpc3QpOworCQkJcmV0ID0gbWVpX2NsX2lycV9jb25uZWN0KGNsLCBjYiwgY21wbF9saXN0KTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKIAogCQkJYnJlYWs7Ci0KKwkJY2FzZSBNRUlfRk9QX0RJU0NPTk5FQ1RfUlNQOgorCQkJLyogc2VuZCBkaXNjb25uZWN0IHJlc3AgKi8KKwkJCXJldCA9IG1laV9jbF9pcnFfZGlzY29ubmVjdF9yc3AoY2wsIGNiLCBjbXBsX2xpc3QpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlCVUcoKTsKIAkJfQpAQCAtNTE4LDExICs1MzUsOSBAQAogCQlpZiAoY2wgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoY2wgPT0gJmRldi0+aWFtdGhpZl9jbCkKLQkJCXJldCA9IG1laV9hbXRoaWZfaXJxX3dyaXRlX2NvbXBsZXRlKGNsLCBjYiwKLQkJCQkJCSZzbG90cywgY21wbF9saXN0KTsKKwkJCXJldCA9IG1laV9hbXRoaWZfaXJxX3dyaXRlKGNsLCBjYiwgY21wbF9saXN0KTsKIAkJZWxzZQotCQkJcmV0ID0gbWVpX2NsX2lycV93cml0ZV9jb21wbGV0ZShjbCwgY2IsCi0JCQkJCQkmc2xvdHMsIGNtcGxfbGlzdCk7CisJCQlyZXQgPSBtZWlfY2xfaXJxX3dyaXRlKGNsLCBjYiwgY21wbF9saXN0KTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtNTQxLDggKzU1Niw3IEBACiB2b2lkIG1laV90aW1lcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCXN0cnVjdCBtZWlfY2wgKmNsX3BvcyA9IE5VTEw7Ci0Jc3RydWN0IG1laV9jbCAqY2xfbmV4dCA9IE5VTEw7CisJc3RydWN0IG1laV9jbCAqY2w7CiAJc3RydWN0IG1laV9jbF9jYiAgKmNiX3BvcyA9IE5VTEw7CiAJc3RydWN0IG1laV9jbF9jYiAgKmNiX25leHQgPSBOVUxMOwogCkBAIC01NzAsOSArNTg0LDkgQEAKIAkJZ290byBvdXQ7CiAKIAkvKioqIGNvbm5lY3QvZGlzY29ubmVjdCB0aW1lb3V0cyAqKiovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNsX3BvcywgY2xfbmV4dCwgJmRldi0+ZmlsZV9saXN0LCBsaW5rKSB7Ci0JCWlmIChjbF9wb3MtPnRpbWVyX2NvdW50KSB7Ci0JCQlpZiAoLS1jbF9wb3MtPnRpbWVyX2NvdW50ID09IDApIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsLCAmZGV2LT5maWxlX2xpc3QsIGxpbmspIHsKKwkJaWYgKGNsLT50aW1lcl9jb3VudCkgeworCQkJaWYgKC0tY2wtPnRpbWVyX2NvdW50ID09IDApIHsKIAkJCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgInRpbWVyOiBjb25uZWN0L2Rpc2Nvbm5lY3QgdGltZW91dC5cbiIpOwogCQkJCW1laV9yZXNldChkZXYpOwogCQkJCWdvdG8gb3V0OwpAQCAtNTgwLDYgKzU5NCw5IEBACiAJCX0KIAl9CiAKKwlpZiAoIW1laV9jbF9pc19jb25uZWN0ZWQoJmRldi0+aWFtdGhpZl9jbCkpCisJCWdvdG8gb3V0OworCiAJaWYgKGRldi0+aWFtdGhpZl9zdGFsbF90aW1lcikgewogCQlpZiAoLS1kZXYtPmlhbXRoaWZfc3RhbGxfdGltZXIgPT0gMCkgewogCQkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJ0aW1lcjogYW10aGlmICBoYW5nZWQuXG4iKTsKQEAgLTYxOSwxMCArNjM2LDEwIEBACiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2JfcG9zLCBjYl9uZXh0LAogCQkJCSZkZXYtPmFtdGhpZl9yZF9jb21wbGV0ZV9saXN0Lmxpc3QsIGxpc3QpIHsKIAotCQkJCWNsX3BvcyA9IGNiX3Bvcy0+ZmlsZV9vYmplY3QtPnByaXZhdGVfZGF0YTsKKwkJCQljbCA9IGNiX3Bvcy0+ZmlsZV9vYmplY3QtPnByaXZhdGVfZGF0YTsKIAogCQkJCS8qIEZpbmRpbmcgdGhlIEFNVEhJIGVudHJ5LiAqLwotCQkJCWlmIChjbF9wb3MgPT0gJmRldi0+aWFtdGhpZl9jbCkKKwkJCQlpZiAoY2wgPT0gJmRldi0+aWFtdGhpZl9jbCkKIAkJCQkJbGlzdF9kZWwoJmNiX3Bvcy0+bGlzdCk7CiAJCQl9CiAJCQltZWlfaW9fY2JfZnJlZShkZXYtPmlhbXRoaWZfY3VycmVudF9jYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL21haW4uYyBiL2RyaXZlcnMvbWlzYy9tZWkvbWFpbi5jCmluZGV4IDU0MjRmOGYuLmIzNTU5NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvbWFpbi5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvbWFpbi5jCkBAIC0xMyw5ICsxMyw2IEBACiAgKiBtb3JlIGRldGFpbHMuCiAgKgogICovCi0KLSNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKLQogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC00MCw3ICszNyw2IEBACiAjaW5jbHVkZSA8bGludXgvbWVpLmg+CiAKICNpbmNsdWRlICJtZWlfZGV2LmgiCi0jaW5jbHVkZSAiaHctbWUuaCIKICNpbmNsdWRlICJjbGllbnQuaCIKIAogLyoqCkBAIC0xMjksMTcgKzEyNSwxMSBAQAogCX0KIAlpZiAoY2wtPnN0YXRlID09IE1FSV9GSUxFX0NPTk5FQ1RFRCkgewogCQljbC0+c3RhdGUgPSBNRUlfRklMRV9ESVNDT05ORUNUSU5HOwotCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwKLQkJCSJkaXNjb25uZWN0aW5nIGNsaWVudCBob3N0IGNsaWVudCA9ICVkLCAiCi0JCSAgICAiTUUgY2xpZW50ID0gJWRcbiIsCi0JCSAgICBjbC0+aG9zdF9jbGllbnRfaWQsCi0JCSAgICBjbC0+bWVfY2xpZW50X2lkKTsKKwkJY2xfZGJnKGRldiwgY2wsICJkaXNjb25uZWN0aW5nXG4iKTsKIAkJcmV0cyA9IG1laV9jbF9kaXNjb25uZWN0KGNsKTsKIAl9CiAJbWVpX2NsX2ZsdXNoX3F1ZXVlcyhjbCk7Ci0JZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJyZW1vdmUgY2xpZW50IGhvc3QgY2xpZW50ID0gJWQsIE1FIGNsaWVudCA9ICVkXG4iLAotCSAgICBjbC0+aG9zdF9jbGllbnRfaWQsCi0JICAgIGNsLT5tZV9jbGllbnRfaWQpOworCWNsX2RiZyhkZXYsIGNsLCAicmVtb3ZpbmdcbiIpOwogCiAJbWVpX2NsX3VubGluayhjbCk7CiAKQEAgLTI4NCw2ICsyNzQsNyBAQAogCWxlbmd0aCA9IG1pbl90KHNpemVfdCwgbGVuZ3RoLCBjYi0+YnVmX2lkeCAtICpvZmZzZXQpOwogCiAJaWYgKGNvcHlfdG9fdXNlcih1YnVmLCBjYi0+cmVzcG9uc2VfYnVmZmVyLmRhdGEgKyAqb2Zmc2V0LCBsZW5ndGgpKSB7CisJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIGNvcHkgZGF0YSB0byB1c2VybGFuZFxuIik7CiAJCXJldHMgPSAtRUZBVUxUOwogCQlnb3RvIGZyZWU7CiAJfQpAQCAtMzQwLDcgKzMzMSw3IEBACiAKIAlpZCA9IG1laV9tZV9jbF9ieV9pZChkZXYsIGNsLT5tZV9jbGllbnRfaWQpOwogCWlmIChpZCA8IDApIHsKLQkJcmV0cyA9IC1FTk9ERVY7CisJCXJldHMgPSAtRU5PVFRZOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTQwNCw3ICszOTUsNyBAQAogCiAJcmV0cyA9IGNvcHlfZnJvbV91c2VyKHdyaXRlX2NiLT5yZXF1ZXN0X2J1ZmZlci5kYXRhLCB1YnVmLCBsZW5ndGgpOwogCWlmIChyZXRzKSB7Ci0JCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIGNvcHkgZGF0YSBmcm9tIHVzZXJsYW5kXG4iKTsKKwkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gY29weSBkYXRhIGZyb20gdXNlcmxhbmRcbiIpOwogCQlyZXRzID0gLUVGQVVMVDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNDcxLDcgKzQ2Miw3IEBACiAJaWYgKGkgPCAwIHx8IGRldi0+bWVfY2xpZW50c1tpXS5wcm9wcy5maXhlZF9hZGRyZXNzKSB7CiAJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiQ2Fubm90IGNvbm5lY3QgdG8gRlcgQ2xpZW50IFVVSUQgPSAlcFVsXG4iLAogCQkJCSZkYXRhLT5pbl9jbGllbnRfdXVpZCk7Ci0JCXJldHMgPSAtRU5PREVWOworCQlyZXRzID0gLUVOT1RUWTsKIAkJZ290byBlbmQ7CiAJfQogCkBAIC01NjksNyArNTYwLDcgQEAKIAlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImNvcHkgY29ubmVjdCBkYXRhIGZyb20gdXNlclxuIik7CiAJaWYgKGNvcHlfZnJvbV91c2VyKGNvbm5lY3RfZGF0YSwgKGNoYXIgX191c2VyICopZGF0YSwKIAkJCQlzaXplb2Yoc3RydWN0IG1laV9jb25uZWN0X2NsaWVudF9kYXRhKSkpIHsKLQkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gY29weSBkYXRhIGZyb20gdXNlcmxhbmRcbiIpOworCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImZhaWxlZCB0byBjb3B5IGRhdGEgZnJvbSB1c2VybGFuZFxuIik7CiAJCXJldHMgPSAtRUZBVUxUOwogCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL21laV9kZXYuaCBiL2RyaXZlcnMvbWlzYy9tZWkvbWVpX2Rldi5oCmluZGV4IGY3ZGU5NWIuLjk0YTUxNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvbWVpX2Rldi5oCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvbWVpX2Rldi5oCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bGludXgvbWVpX2NsX2J1cy5oPgogCiAjaW5jbHVkZSAiaHcuaCIKLSNpbmNsdWRlICJody1tZS1yZWdzLmgiCiAjaW5jbHVkZSAiaGJtLmgiCiAKIC8qCkBAIC0xMzAsMTYgKzEyOSwxOCBAQAogCiAvKioKICAqIGVudW0gbWVpX2NiX2ZpbGVfb3BzICAtIGZpbGUgb3BlcmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGJhY2sKLSAqIEBNRUlfRk9QX1JFQUQgICAtIHJlYWQKLSAqIEBNRUlfRk9QX1dSSVRFICAtIHdyaXRlCi0gKiBATUVJX0ZPUF9JT0NUTCAgLSBpb2N0bAotICogQE1FSV9GT1BfT1BFTiAgIC0gb3BlbgotICogQE1FSV9GT1BfQ0xPU0UgIC0gY2xvc2UKKyAqIEBNRUlfRk9QX1JFQUQgICAgICAtIHJlYWQKKyAqIEBNRUlfRk9QX1dSSVRFICAgICAtIHdyaXRlCisgKiBATUVJX0ZPUF9DT05ORUNUICAgLSBjb25uZWN0CisgKiBATUVJX0ZPUF9ESVNDT05ORUNUX1JTUCAtIGRpc2Nvbm5lY3QgcmVzcG9uc2UKKyAqIEBNRUlfRk9QX09QRU4gICAgICAtIG9wZW4KKyAqIEBNRUlfRk9QX0NMT1NFICAgICAtIGNsb3NlCiAgKi8KIGVudW0gbWVpX2NiX2ZpbGVfb3BzIHsKIAlNRUlfRk9QX1JFQUQgPSAwLAogCU1FSV9GT1BfV1JJVEUsCi0JTUVJX0ZPUF9JT0NUTCwKKwlNRUlfRk9QX0NPTk5FQ1QsCisJTUVJX0ZPUF9ESVNDT05ORUNUX1JTUCwKIAlNRUlfRk9QX09QRU4sCiAJTUVJX0ZPUF9DTE9TRQogfTsKQEAgLTIzNiwyMCArMjM3LDIwIEBACiAgKi8KIHN0cnVjdCBtZWlfaHdfb3BzIHsKIAotCWJvb2wgKCpob3N0X2lzX3JlYWR5KSAoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CisJYm9vbCAoKmhvc3RfaXNfcmVhZHkpKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwogCi0JYm9vbCAoKmh3X2lzX3JlYWR5KSAoc3RydWN0IG1laV9kZXZpY2UgKmRldik7Ci0JaW50ICgqaHdfcmVzZXQpIChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBib29sIGVuYWJsZSk7Ci0JaW50ICAoKmh3X3N0YXJ0KSAoc3RydWN0IG1laV9kZXZpY2UgKmRldik7Ci0Jdm9pZCAoKmh3X2NvbmZpZykgKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOworCWJvb2wgKCpod19pc19yZWFkeSkoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CisJaW50ICgqaHdfcmVzZXQpKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKTsKKwlpbnQgKCpod19zdGFydCkoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CisJdm9pZCAoKmh3X2NvbmZpZykoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CiAKLQl2b2lkICgqaW50cl9jbGVhcikgKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwotCXZvaWQgKCppbnRyX2VuYWJsZSkgKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwotCXZvaWQgKCppbnRyX2Rpc2FibGUpIChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKKwl2b2lkICgqaW50cl9jbGVhcikoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CisJdm9pZCAoKmludHJfZW5hYmxlKShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKKwl2b2lkICgqaW50cl9kaXNhYmxlKShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKIAotCWludCAoKmhidWZfZnJlZV9zbG90cykgKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwotCWJvb2wgKCpoYnVmX2lzX3JlYWR5KSAoc3RydWN0IG1laV9kZXZpY2UgKmRldik7Ci0Jc2l6ZV90ICgqaGJ1Zl9tYXhfbGVuKSAoY29uc3Qgc3RydWN0IG1laV9kZXZpY2UgKmRldik7CisJaW50ICgqaGJ1Zl9mcmVlX3Nsb3RzKShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKKwlib29sICgqaGJ1Zl9pc19yZWFkeSkoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CisJc2l6ZV90ICgqaGJ1Zl9tYXhfbGVuKShjb25zdCBzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKIAogCWludCAoKndyaXRlKShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAogCQkgICAgIHN0cnVjdCBtZWlfbXNnX2hkciAqaGRyLApAQCAtMjU4LDcgKzI1OSw3IEBACiAJaW50ICgqcmRidWZfZnVsbF9zbG90cykoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CiAKIAl1MzIgKCpyZWFkX2hkcikoY29uc3Qgc3RydWN0IG1laV9kZXZpY2UgKmRldik7Ci0JaW50ICgqcmVhZCkgKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCisJaW50ICgqcmVhZCkoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKIAkJICAgICB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuKTsKIH07CiAKQEAgLTI5NCw2ICsyOTUsNyBAQAogaW50IF9fbWVpX2NsX3NlbmQoc3RydWN0IG1laV9jbCAqY2wsIHU4ICpidWYsIHNpemVfdCBsZW5ndGgpOwogaW50IF9fbWVpX2NsX3JlY3Yoc3RydWN0IG1laV9jbCAqY2wsIHU4ICpidWYsIHNpemVfdCBsZW5ndGgpOwogdm9pZCBtZWlfY2xfYnVzX3J4X2V2ZW50KHN0cnVjdCBtZWlfY2wgKmNsKTsKK3ZvaWQgbWVpX2NsX2J1c19yZW1vdmVfZGV2aWNlcyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKIGludCBtZWlfY2xfYnVzX2luaXQodm9pZCk7CiB2b2lkIG1laV9jbF9idXNfZXhpdCh2b2lkKTsKIApAQCAtMzM5LDcgKzM0MSw2IEBACiAgKiBAaGJ1Zl9kZXB0aCAtIGRlcHRoIG9mIGhhcmR3YXJlIGhvc3Qvd3JpdGUgYnVmZmVyIGlzIHNsb3RzCiAgKiBAaGJ1Zl9pc19yZWFkeSAtIHF1ZXJ5IGlmIHRoZSBob3N0IGhvc3Qvd3JpdGUgYnVmZmVyIGlzIHJlYWR5CiAgKiBAd3JfbXNnIC0gdGhlIGJ1ZmZlciBmb3IgaGJtIGNvbnRyb2wgbWVzc2FnZXMKLSAqIEB3cl9leHRfbXNnIC0gdGhlIGJ1ZmZlciBmb3IgaGJtIGNvbnRyb2wgcmVzcG9uc2VzIChzZXQgaW4gcmVhZCBjeWNsZSkKICAqLwogc3RydWN0IG1laV9kZXZpY2UgewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwkvKiBwb2ludGVyIHRvIHBjaSBkZXZpY2Ugc3RydWN0ICovCkBAIC0zOTQsMTEgKzM5NSw2IEBACiAJCXVuc2lnbmVkIGNoYXIgZGF0YVsxMjhdOwogCX0gd3JfbXNnOwogCi0Jc3RydWN0IHsKLQkJc3RydWN0IG1laV9tc2dfaGRyIGhkcjsKLQkJdW5zaWduZWQgY2hhciBkYXRhWzRdOwkvKiBBbGwgSEJNIG1lc3NhZ2VzIGFyZSA0IGJ5dGVzICovCi0JfSB3cl9leHRfbXNnOwkJLyogZm9yIGNvbnRyb2wgcmVzcG9uc2VzICovCi0KIAlzdHJ1Y3QgaGJtX3ZlcnNpb24gdmVyc2lvbjsKIAogCXN0cnVjdCBtZWlfbWVfY2xpZW50ICptZV9jbGllbnRzOyAvKiBOb3RlOiBtZW1vcnkgaGFzIHRvIGJlIGFsbG9jYXRlZCAqLwpAQCAtNTE4LDggKzUxNCw4IEBACiAKIHZvaWQgbWVpX2FtdGhpZl9ydW5fbmV4dF9jbWQoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CiAKLWludCBtZWlfYW10aGlmX2lycV93cml0ZV9jb21wbGV0ZShzdHJ1Y3QgbWVpX2NsICpjbCwgc3RydWN0IG1laV9jbF9jYiAqY2IsCi0JCQkJICBzMzIgKnNsb3RzLCBzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QpOworaW50IG1laV9hbXRoaWZfaXJxX3dyaXRlKHN0cnVjdCBtZWlfY2wgKmNsLCBzdHJ1Y3QgbWVpX2NsX2NiICpjYiwKKwkJCXN0cnVjdCBtZWlfY2xfY2IgKmNtcGxfbGlzdCk7CiAKIHZvaWQgbWVpX2FtdGhpZl9jb21wbGV0ZShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgbWVpX2NsX2NiICpjYik7CiBpbnQgbWVpX2FtdGhpZl9pcnFfcmVhZF9tc2coc3RydWN0IG1laV9kZXZpY2UgKmRldiwKQEAgLTU0Niw3ICs1NDIsNyBAQAogICogICBvbmNlIHdlIGdvdCBjb25uZWN0aW9uIHRvIHRoZSBXRCBDbGllbnQKICAqIEBkZXYgLSBtZWkgZGV2aWNlCiAgKi8KLXZvaWQgbWVpX3dhdGNoZG9nX3JlZ2lzdGVyKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOworaW50IG1laV93YXRjaGRvZ19yZWdpc3RlcihzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKIC8qCiAgKiBtZWlfd2F0Y2hkb2dfdW5yZWdpc3RlciAgLSBVbnJlZ2lzdGVyaW5nIHdhdGNoZG9nIGludGVyZmFjZQogICogQGRldiAtIG1laSBkZXZpY2UKQEAgLTYzMyw2ICs2MjksOCBAQAogCXJldHVybiBkZXYtPm9wcy0+cmRidWZfZnVsbF9zbG90cyhkZXYpOwogfQogCitib29sIG1laV9oYnVmX2FjcXVpcmUoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CisKICNpZiBJU19FTkFCTEVEKENPTkZJR19ERUJVR19GUykKIGludCBtZWlfZGJnZnNfcmVnaXN0ZXIoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSk7CiB2b2lkIG1laV9kYmdmc19kZXJlZ2lzdGVyKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9uZmMuYyBiL2RyaXZlcnMvbWlzYy9tZWkvbmZjLmMKaW5kZXggYTU4MzIwYy4uMzA5NWZjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9uZmMuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL25mYy5jCkBAIC0zNjQsNyArMzY0LDcgQEAKIAlpZiAoIXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KG5kZXYtPnNlbmRfd3EsCiAJCQkJbmRldi0+cmVjdl9yZXFfaWQgPT0gbmRldi0+cmVxX2lkLCBIWikpIHsKIAkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJORkMgTUVJIGNvbW1hbmQgdGltZW91dFxuIik7Ci0JCWVyciA9IC1FVElNRURPVVQ7CisJCWVyciA9IC1FVElNRTsKIAl9IGVsc2UgewogCQluZGV2LT5yZXFfaWQrKzsKIAl9CkBAIC01MDIsNyArNTAyLDcgQEAKIAlpID0gbWVpX21lX2NsX2J5X3V1aWQoZGV2LCAmbWVpX25mY19pbmZvX2d1aWQpOwogCWlmIChpIDwgMCkgewogCQlkZXZfaW5mbygmZGV2LT5wZGV2LT5kZXYsICJuZmM6IGZhaWxlZCB0byBmaW5kIHRoZSBjbGllbnRcbiIpOwotCQlyZXQgPSAtRU5PRU5UOworCQlyZXQgPSAtRU5PVFRZOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTUyMCw3ICs1MjAsNyBAQAogCWkgPSBtZWlfbWVfY2xfYnlfdXVpZChkZXYsICZtZWlfbmZjX2d1aWQpOwogCWlmIChpIDwgMCkgewogCQlkZXZfaW5mbygmZGV2LT5wZGV2LT5kZXYsICJuZmM6IGZhaWxlZCB0byBmaW5kIHRoZSBjbGllbnRcbiIpOwotCQlyZXQgPSAtRU5PRU5UOworCQlyZXQgPSAtRU5PVFRZOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTU1MiwxMyArNTUyLDcgQEAKIHZvaWQgbWVpX25mY19ob3N0X2V4aXQoc3RydWN0IG1laV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbWVpX25mY19kZXYgKm5kZXYgPSAmbmZjX2RldjsKLQogCWNhbmNlbF93b3JrX3N5bmMoJm5kZXYtPmluaXRfd29yayk7Ci0KLQltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKLQlpZiAobmRldi0+Y2wgJiYgbmRldi0+Y2wtPmRldmljZSkKLQkJbWVpX2NsX3JlbW92ZV9kZXZpY2UobmRldi0+Y2wtPmRldmljZSk7Ci0KLQltZWlfbmZjX2ZyZWUobmRldik7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIH0KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL3BjaS1tZS5jIGIvZHJpdmVycy9taXNjL21laS9wY2ktbWUuYwppbmRleCBkZGFkZDA4Li4xYzhmZDNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL3BjaS1tZS5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvcGNpLW1lLmMKQEAgLTEzLDkgKzEzLDYgQEAKICAqIG1vcmUgZGV0YWlscy4KICAqCiAgKi8KLQotI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTI3LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CkBAIC00MCwxMSArMzYsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9tZWkuaD4KIAogI2luY2x1ZGUgIm1laV9kZXYuaCIKLSNpbmNsdWRlICJody1tZS5oIgogI2luY2x1ZGUgImNsaWVudC5oIgorI2luY2x1ZGUgImh3LW1lLXJlZ3MuaCIKKyNpbmNsdWRlICJody1tZS5oIgogCiAvKiBtZWlfcGNpX3RibCAtIFBDSSBEZXZpY2UgSUQgVGFibGUgKi8KLXN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShtZWlfbWVfcGNpX3RibCkgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgbWVpX21lX3BjaV90YmxbXSA9IHsKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBNRUlfREVWX0lEXzgyOTQ2R1opfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBNRUlfREVWX0lEXzgyRzM1KX0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgTUVJX0RFVl9JRF84MlE5NjUpfSwKQEAgLTI3MCw3ICsyNjcsNyBAQAogCiAKIH0KLSNpZmRlZiBDT05GSUdfUE0KKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIHN0YXRpYyBpbnQgbWVpX21lX3BjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKQEAgLTMzMCwxMSArMzI3LDEyIEBACiAKIAlyZXR1cm4gMDsKIH0KKwogc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKG1laV9tZV9wbV9vcHMsIG1laV9tZV9wY2lfc3VzcGVuZCwgbWVpX21lX3BjaV9yZXN1bWUpOwogI2RlZmluZSBNRUlfTUVfUE1fT1BTCSgmbWVpX21lX3BtX29wcykKICNlbHNlCiAjZGVmaW5lIE1FSV9NRV9QTV9PUFMJTlVMTAotI2VuZGlmIC8qIENPTkZJR19QTSAqLworI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLwogLyoKICAqICBQQ0kgZHJpdmVyIHN0cnVjdHVyZQogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL3BjaS10eGUuYyBiL2RyaXZlcnMvbWlzYy9tZWkvcGNpLXR4ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkM2FkYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvbWVpL3BjaS10eGUuYwpAQCAtMCwwICsxLDI5MyBAQAorLyoKKyAqCisgKiBJbnRlbCBNYW5hZ2VtZW50IEVuZ2luZSBJbnRlcmZhY2UgKEludGVsIE1FSSkgTGludXggZHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdXVpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgPGxpbnV4L21laS5oPgorCisKKyNpbmNsdWRlICJtZWlfZGV2LmgiCisjaW5jbHVkZSAiaHctdHhlLmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBtZWlfdHhlX3BjaV90YmxbXSA9IHsKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDBGMTgpfSwgLyogQmF5dHJhaWwgKi8KKwl7MCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBtZWlfdHhlX3BjaV90YmwpOworCisKK3N0YXRpYyB2b2lkIG1laV90eGVfcGNpX2lvdW5tYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBtZWlfdHhlX2h3ICpodykKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSBTRUNfQkFSOyBpIDwgTlVNX09GX01FTV9CQVJTOyBpKyspIHsKKwkJaWYgKGh3LT5tZW1fYWRkcltpXSkgeworCQkJcGNpX2lvdW5tYXAocGRldiwgaHctPm1lbV9hZGRyW2ldKTsKKwkJCWh3LT5tZW1fYWRkcltpXSA9IE5VTEw7CisJCX0KKwl9Cit9CisvKioKKyAqIG1laV9wcm9iZSAtIERldmljZSBJbml0aWFsaXphdGlvbiBSb3V0aW5lCisgKgorICogQHBkZXY6IFBDSSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAZW50OiBlbnRyeSBpbiBtZWlfdHhlX3BjaV90YmwKKyAqCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBtZWlfdHhlX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBtZWlfZGV2aWNlICpkZXY7CisJc3RydWN0IG1laV90eGVfaHcgKmh3OworCWludCBlcnI7CisJaW50IGk7CisKKwkvKiBlbmFibGUgcGNpIGRldiAqLworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBwY2kgZGV2aWNlLlxuIik7CisJCWdvdG8gZW5kOworCX0KKwkvKiBzZXQgUENJIGhvc3QgbWFzdGVyaW5nICAqLworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCS8qIHBjaSByZXF1ZXN0IHJlZ2lvbnMgZm9yIG1laSBkcml2ZXIgKi8KKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIEtCVUlMRF9NT0ROQU1FKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgcGNpIHJlZ2lvbnMuXG4iKTsKKwkJZ290byBkaXNhYmxlX2RldmljZTsKKwl9CisKKwllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzNikpOworCWlmIChlcnIpIHsKKwkJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJaWYgKGVycikgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gc3VpdGFibGUgRE1BIGF2YWlsYWJsZS5cbiIpOworCQkJZ290byByZWxlYXNlX3JlZ2lvbnM7CisJCX0KKwl9CisKKwkvKiBhbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIHRoZSBtZWkgZGV2IHN0cnVjdHVyZSAqLworCWRldiA9IG1laV90eGVfZGV2X2luaXQocGRldik7CisJaWYgKCFkZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byByZWxlYXNlX3JlZ2lvbnM7CisJfQorCWh3ID0gdG9fdHhlX2h3KGRldik7CisKKwkvKiBtYXBwaW5nICBJTyBkZXZpY2UgbWVtb3J5ICovCisJZm9yIChpID0gU0VDX0JBUjsgaSA8IE5VTV9PRl9NRU1fQkFSUzsgaSsrKSB7CisJCWh3LT5tZW1fYWRkcltpXSA9IHBjaV9pb21hcChwZGV2LCBpLCAwKTsKKwkJaWYgKCFody0+bWVtX2FkZHJbaV0pIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIm1hcHBpbmcgSS9PIGRldmljZSBtZW1vcnkgZmFpbHVyZS5cbiIpOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZnJlZV9kZXZpY2U7CisJCX0KKwl9CisKKworCXBjaV9lbmFibGVfbXNpKHBkZXYpOworCisJLyogY2xlYXIgc3B1cmlvdXMgaW50ZXJydXB0cyAqLworCW1laV9jbGVhcl9pbnRlcnJ1cHRzKGRldik7CisKKwkvKiByZXF1ZXN0IGFuZCBlbmFibGUgaW50ZXJydXB0ICAqLworCWlmIChwY2lfZGV2X21zaV9lbmFibGVkKHBkZXYpKQorCQllcnIgPSByZXF1ZXN0X3RocmVhZGVkX2lycShwZGV2LT5pcnEsCisJCQlOVUxMLAorCQkJbWVpX3R4ZV9pcnFfdGhyZWFkX2hhbmRsZXIsCisJCQlJUlFGX09ORVNIT1QsIEtCVUlMRF9NT0ROQU1FLCBkZXYpOworCWVsc2UKKwkJZXJyID0gcmVxdWVzdF90aHJlYWRlZF9pcnEocGRldi0+aXJxLAorCQkJbWVpX3R4ZV9pcnFfcXVpY2tfaGFuZGxlciwKKwkJCW1laV90eGVfaXJxX3RocmVhZF9oYW5kbGVyLAorCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibWVpOiByZXF1ZXN0X3RocmVhZGVkX2lycSBmYWlsdXJlLiBpcnEgPSAlZFxuIiwKKwkJCXBkZXYtPmlycSk7CisJCWdvdG8gZnJlZV9kZXZpY2U7CisJfQorCisJaWYgKG1laV9zdGFydChkZXYpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImluaXQgaHcgZmFpbHVyZS5cbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIHJlbGVhc2VfaXJxOworCX0KKworCWVyciA9IG1laV9yZWdpc3RlcihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gcmVsZWFzZV9pcnE7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCXJldHVybiAwOworCityZWxlYXNlX2lycToKKworCW1laV9jYW5jZWxfd29yayhkZXYpOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJbWVpX2Rpc2FibGVfaW50ZXJydXB0cyhkZXYpOworCisJZnJlZV9pcnEocGRldi0+aXJxLCBkZXYpOworCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKKworZnJlZV9kZXZpY2U6CisJbWVpX3R4ZV9wY2lfaW91bm1hcChwZGV2LCBodyk7CisKKwlrZnJlZShkZXYpOworcmVsZWFzZV9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitkaXNhYmxlX2RldmljZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitlbmQ6CisJZGV2X2VycigmcGRldi0+ZGV2LCAiaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBtZWlfcmVtb3ZlIC0gRGV2aWNlIFJlbW92YWwgUm91dGluZQorICoKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIG1laV9yZW1vdmUgaXMgY2FsbGVkIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtIHRvIGFsZXJ0IHRoZSBkcml2ZXIKKyAqIHRoYXQgaXQgc2hvdWxkIHJlbGVhc2UgYSBQQ0kgZGV2aWNlLgorICovCitzdGF0aWMgdm9pZCBtZWlfdHhlX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2OworCXN0cnVjdCBtZWlfdHhlX2h3ICpodzsKKworCWRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoIWRldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtZWk6IGRldiA9TlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwlodyA9IHRvX3R4ZV9odyhkZXYpOworCisJbWVpX3N0b3AoZGV2KTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCW1laV9kaXNhYmxlX2ludGVycnVwdHMoZGV2KTsKKwlmcmVlX2lycShwZGV2LT5pcnEsIGRldik7CisJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJbWVpX3R4ZV9wY2lfaW91bm1hcChwZGV2LCBodyk7CisKKwltZWlfZGVyZWdpc3RlcihkZXYpOworCisJa2ZyZWUoZGV2KTsKKworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfQorCisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgbWVpX3R4ZV9wY2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldmljZSk7CisJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgInN1c3BlbmRcbiIpOworCisJbWVpX3N0b3AoZGV2KTsKKworCW1laV9kaXNhYmxlX2ludGVycnVwdHMoZGV2KTsKKworCWZyZWVfaXJxKHBkZXYtPmlycSwgZGV2KTsKKwlwY2lfZGlzYWJsZV9tc2kocGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZWlfdHhlX3BjaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXZpY2UpOworCXN0cnVjdCBtZWlfZGV2aWNlICpkZXY7CisJaW50IGVycjsKKworCWRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwY2lfZW5hYmxlX21zaShwZGV2KTsKKworCW1laV9jbGVhcl9pbnRlcnJ1cHRzKGRldik7CisKKwkvKiByZXF1ZXN0IGFuZCBlbmFibGUgaW50ZXJydXB0ICovCisJaWYgKHBjaV9kZXZfbXNpX2VuYWJsZWQocGRldikpCisJCWVyciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHBkZXYtPmlycSwKKwkJCU5VTEwsCisJCQltZWlfdHhlX2lycV90aHJlYWRfaGFuZGxlciwKKwkJCUlSUUZfT05FU0hPVCwgS0JVSUxEX01PRE5BTUUsIGRldik7CisJZWxzZQorCQllcnIgPSByZXF1ZXN0X3RocmVhZGVkX2lycShwZGV2LT5pcnEsCisJCQltZWlfdHhlX2lycV9xdWlja19oYW5kbGVyLAorCQkJbWVpX3R4ZV9pcnFfdGhyZWFkX2hhbmRsZXIsCisJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyZXF1ZXN0X3RocmVhZGVkX2lycSBmYWlsZWQ6IGlycSA9ICVkLlxuIiwKKwkJCQlwZGV2LT5pcnEpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IG1laV9yZXN0YXJ0KGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMobWVpX3R4ZV9wbV9vcHMsCisJCQkgbWVpX3R4ZV9wY2lfc3VzcGVuZCwKKwkJCSBtZWlfdHhlX3BjaV9yZXN1bWUpOworCisjZGVmaW5lIE1FSV9UWEVfUE1fT1BTCSgmbWVpX3R4ZV9wbV9vcHMpCisjZWxzZQorI2RlZmluZSBNRUlfVFhFX1BNX09QUwlOVUxMCisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCisvKgorICogIFBDSSBkcml2ZXIgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBtZWlfdHhlX2RyaXZlciA9IHsKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAorCS5pZF90YWJsZSA9IG1laV90eGVfcGNpX3RibCwKKwkucHJvYmUgPSBtZWlfdHhlX3Byb2JlLAorCS5yZW1vdmUgPSBtZWlfdHhlX3JlbW92ZSwKKwkuc2h1dGRvd24gPSBtZWlfdHhlX3JlbW92ZSwKKwkuZHJpdmVyLnBtID0gTUVJX1RYRV9QTV9PUFMsCit9OworCittb2R1bGVfcGNpX2RyaXZlcihtZWlfdHhlX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkludGVsIENvcnBvcmF0aW9uIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsKFIpIFRydXN0ZWQgRXhlY3V0aW9uIEVudmlyb25tZW50IEludGVyZmFjZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS93ZC5jIGIvZHJpdmVycy9taXNjL21laS93ZC5jCmluZGV4IGY3MDk0NWUuLmViZjFjYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvd2QuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL3dkLmMKQEAgLTI1LDcgKzI1LDYgQEAKIAogI2luY2x1ZGUgIm1laV9kZXYuaCIKICNpbmNsdWRlICJoYm0uaCIKLSNpbmNsdWRlICJody1tZS5oIgogI2luY2x1ZGUgImNsaWVudC5oIgogCiBzdGF0aWMgY29uc3QgdTggbWVpX3N0YXJ0X3dkX3BhcmFtc1tdID0geyAweDAyLCAweDEyLCAweDEzLCAweDEwIH07CkBAIC01Myw3ICs1Miw3IEBACiAgKgogICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKICAqCi0gKiByZXR1cm5zIC1FTkVOVCBpZiB3ZCBjbGllbnQgY2Fubm90IGJlIGZvdW5kCisgKiByZXR1cm5zIC1FTk9UVFkgaWYgd2QgY2xpZW50IGNhbm5vdCBiZSBmb3VuZAogICogICAgICAgICAtRUlPIGlmIHdyaXRlIGhhcyBmYWlsZWQKICAqICAgICAgICAgMCBvbiBzdWNjZXNzCiAgKi8KQEAgLTczLDcgKzcyLDcgQEAKIAlpZCA9IG1laV9tZV9jbF9ieV91dWlkKGRldiwgJm1laV93ZF9ndWlkKTsKIAlpZiAoaWQgPCAwKSB7CiAJCWRldl9pbmZvKCZkZXYtPnBkZXYtPmRldiwgIndkOiBmYWlsZWQgdG8gZmluZCB0aGUgY2xpZW50XG4iKTsKLQkJcmV0dXJuIGlkOworCQlyZXR1cm4gLUVOT1RUWTsKIAl9CiAKIAljbC0+bWVfY2xpZW50X2lkID0gZGV2LT5tZV9jbGllbnRzW2lkXS5jbGllbnRfaWQ7CkBAIC04NywxNSArODYsMjAgQEAKIAogCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0NPTk5FQ1RJTkc7CiAKLQlpZiAobWVpX2hibV9jbF9jb25uZWN0X3JlcShkZXYsIGNsKSkgewotCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIndkOiBmYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgY2xpZW50XG4iKTsKLQkJY2wtPnN0YXRlID0gTUVJX0ZJTEVfRElTQ09OTkVDVEVEOwotCQljbC0+aG9zdF9jbGllbnRfaWQgPSAwOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JY2wtPnRpbWVyX2NvdW50ID0gTUVJX0NPTk5FQ1RfVElNRU9VVDsKKwlyZXQgPSBtZWlfY2xfY29ubmVjdChjbCwgTlVMTCk7CiAKLQlyZXR1cm4gMDsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAid2Q6IGZhaWxlZCB0byBjb25uZWN0ID0gJWRcbiIsIHJldCk7CisJCW1laV9jbF91bmxpbmsoY2wpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IG1laV93YXRjaGRvZ19yZWdpc3RlcihkZXYpOworCWlmIChyZXQpIHsKKwkJbWVpX2NsX2Rpc2Nvbm5lY3QoY2wpOworCQltZWlfY2xfdW5saW5rKGNsKTsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC0xMDYsMTMgKzExMCwxNiBAQAogICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsCiAgKgktRUlPIHdoZW4gbWVzc2FnZSBzZW5kIGZhaWxzCiAgKgktRUlOVkFMIHdoZW4gaW52YWxpZCBtZXNzYWdlIGlzIHRvIGJlIHNlbnQKKyAqCS1FTk9ERVYgb24gZmxvdyBjb250cm9sIGZhaWx1cmUKICAqLwogaW50IG1laV93ZF9zZW5kKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IG1laV9jbCAqY2wgPSAmZGV2LT53ZF9jbDsKIAlzdHJ1Y3QgbWVpX21zZ19oZHIgaGRyOworCWludCByZXQ7CiAKLQloZHIuaG9zdF9hZGRyID0gZGV2LT53ZF9jbC5ob3N0X2NsaWVudF9pZDsKLQloZHIubWVfYWRkciA9IGRldi0+d2RfY2wubWVfY2xpZW50X2lkOworCWhkci5ob3N0X2FkZHIgPSBjbC0+aG9zdF9jbGllbnRfaWQ7CisJaGRyLm1lX2FkZHIgPSBjbC0+bWVfY2xpZW50X2lkOwogCWhkci5tc2dfY29tcGxldGUgPSAxOwogCWhkci5yZXNlcnZlZCA9IDA7CiAJaGRyLmludGVybmFsID0gMDsKQEAgLTEyMSwxMCArMTI4LDI0IEBACiAJCWhkci5sZW5ndGggPSBNRUlfV0RfU1RBUlRfTVNHX1NJWkU7CiAJZWxzZSBpZiAoIW1lbWNtcChkZXYtPndkX2RhdGEsIG1laV9zdG9wX3dkX3BhcmFtcywgTUVJX1dEX0hEUl9TSVpFKSkKIAkJaGRyLmxlbmd0aCA9IE1FSV9XRF9TVE9QX01TR19TSVpFOwotCWVsc2UKKwllbHNlIHsKKwkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJ3ZDogaW52YWxpZCBtZXNzYWdlIGlzIHRvIGJlIHNlbnQsIGFib3J0aW5nXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0JcmV0dXJuIG1laV93cml0ZV9tZXNzYWdlKGRldiwgJmhkciwgZGV2LT53ZF9kYXRhKTsKKwlyZXQgPSBtZWlfd3JpdGVfbWVzc2FnZShkZXYsICZoZHIsIGRldi0+d2RfZGF0YSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIndkOiB3cml0ZSBtZXNzYWdlIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbWVpX2NsX2Zsb3dfY3RybF9yZWR1Y2UoY2wpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJ3ZDogZmxvd19jdHJsX3JlZHVjZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xMzMsOSArMTU0LDExIEBACiAgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQogICogQHByZXNlcnZlOiBpbmRpY2F0ZSBpZiB0byBrZWVwIHRoZSB0aW1lb3V0IHZhbHVlCiAgKgotICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsCi0gKgktRUlPIHdoZW4gbWVzc2FnZSBzZW5kIGZhaWxzCisgKiByZXR1cm5zIDAgaWYgc3VjY2VzcworICogb24gZXJyb3I6CisgKgktRUlPICAgIHdoZW4gbWVzc2FnZSBzZW5kIGZhaWxzCiAgKgktRUlOVkFMIHdoZW4gaW52YWxpZCBtZXNzYWdlIGlzIHRvIGJlIHNlbnQKKyAqCS1FVElNRSAgb24gbWVzc2FnZSB0aW1lb3V0CiAgKi8KIGludCBtZWlfd2Rfc3RvcChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQogewpAQCAtMTUxLDIwICsxNzQsMTIgQEAKIAogCXJldCA9IG1laV9jbF9mbG93X2N0cmxfY3JlZHMoJmRldi0+d2RfY2wpOwogCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKKwkJZ290byBlcnI7CiAKLQlpZiAocmV0ICYmIGRldi0+aGJ1Zl9pc19yZWFkeSkgewotCQlyZXQgPSAwOwotCQlkZXYtPmhidWZfaXNfcmVhZHkgPSBmYWxzZTsKLQotCQlpZiAoIW1laV93ZF9zZW5kKGRldikpIHsKLQkJCXJldCA9IG1laV9jbF9mbG93X2N0cmxfcmVkdWNlKCZkZXYtPndkX2NsKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBvdXQ7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIndkOiBzZW5kIHN0b3AgZmFpbGVkXG4iKTsKLQkJfQotCisJaWYgKHJldCAmJiBtZWlfaGJ1Zl9hY3F1aXJlKGRldikpIHsKKwkJcmV0ID0gbWVpX3dkX3NlbmQoZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOwogCQlkZXYtPndkX3BlbmRpbmcgPSBmYWxzZTsKIAl9IGVsc2UgewogCQlkZXYtPndkX3BlbmRpbmcgPSB0cnVlOwpAQCAtMTcyLDIxICsxODcsMjEgQEAKIAogCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CiAKLQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChkZXYtPndhaXRfc3RvcF93ZCwKLQkJCQkJZGV2LT53ZF9zdGF0ZSA9PSBNRUlfV0RfSURMRSwKLQkJCQkJbXNlY3NfdG9famlmZmllcyhNRUlfV0RfU1RPUF9USU1FT1VUKSk7CisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KGRldi0+d2FpdF9zdG9wX3dkLAorCQkJCWRldi0+d2Rfc3RhdGUgPT0gTUVJX1dEX0lETEUsCisJCQkJbXNlY3NfdG9famlmZmllcyhNRUlfV0RfU1RPUF9USU1FT1VUKSk7CiAJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7Ci0JaWYgKGRldi0+d2Rfc3RhdGUgPT0gTUVJX1dEX0lETEUpIHsKLQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJ3ZDogc3RvcCBjb21wbGV0ZWQgcmV0PSVkLlxuIiwgcmV0KTsKLQkJcmV0ID0gMDsKLQl9IGVsc2UgewotCQlpZiAoIXJldCkKLQkJCXJldCA9IC1FVElNRURPVVQ7CisJaWYgKGRldi0+d2Rfc3RhdGUgIT0gTUVJX1dEX0lETEUpIHsKKwkJLyogdGltZW91dCAqLworCQlyZXQgPSAtRVRJTUU7CiAJCWRldl93YXJuKCZkZXYtPnBkZXYtPmRldiwKIAkJCSJ3ZDogc3RvcCBmYWlsZWQgdG8gY29tcGxldGUgcmV0PSVkLlxuIiwgcmV0KTsKKwkJZ290byBlcnI7CiAJfQotCi1vdXQ6CisJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJ3ZDogc3RvcCBjb21wbGV0ZWQgYWZ0ZXIgJXUgbXNlY1xuIiwKKwkJCU1FSV9XRF9TVE9QX1RJTUVPVVQgLSBqaWZmaWVzX3RvX21zZWNzKHJldCkpOworCXJldHVybiAwOworZXJyOgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI2MCw4ICsyNzUsOCBAQAogICovCiBzdGF0aWMgaW50IG1laV93ZF9vcHNfcGluZyhzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZF9kZXYpCiB7Ci0JaW50IHJldCA9IDA7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldjsKKwlpbnQgcmV0OwogCiAJZGV2ID0gd2F0Y2hkb2dfZ2V0X2RydmRhdGEod2RfZGV2KTsKIAlpZiAoIWRldikKQEAgLTI3NywyNSArMjkyLDE4IEBACiAKIAlkZXYtPndkX3N0YXRlID0gTUVJX1dEX1JVTk5JTkc7CiAKKwlyZXQgPSBtZWlfY2xfZmxvd19jdHJsX2NyZWRzKCZkZXYtPndkX2NsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlbmQ7CiAJLyogQ2hlY2sgaWYgd2UgY2FuIHNlbmQgdGhlIHBpbmcgdG8gSFcqLwotCWlmIChkZXYtPmhidWZfaXNfcmVhZHkgJiYgbWVpX2NsX2Zsb3dfY3RybF9jcmVkcygmZGV2LT53ZF9jbCkgPiAwKSB7CisJaWYgKHJldCAmJiBtZWlfaGJ1Zl9hY3F1aXJlKGRldikpIHsKIAotCQlkZXYtPmhidWZfaXNfcmVhZHkgPSBmYWxzZTsKIAkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJ3ZDogc2VuZGluZyBwaW5nXG4iKTsKIAotCQlpZiAobWVpX3dkX3NlbmQoZGV2KSkgewotCQkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJ3ZDogc2VuZCBmYWlsZWQuXG4iKTsKLQkJCXJldCA9IC1FSU87CisJCXJldCA9IG1laV93ZF9zZW5kKGRldik7CisJCWlmIChyZXQpCiAJCQlnb3RvIGVuZDsKLQkJfQotCi0JCWlmIChtZWlfY2xfZmxvd19jdHJsX3JlZHVjZSgmZGV2LT53ZF9jbCkpIHsKLQkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LAotCQkJCSJ3ZDogbWVpX2NsX2Zsb3dfY3RybF9yZWR1Y2UoKSBmYWlsZWQuXG4iKTsKLQkJCXJldCA9IC1FSU87Ci0JCQlnb3RvIGVuZDsKLQkJfQotCisJCWRldi0+d2RfcGVuZGluZyA9IGZhbHNlOwogCX0gZWxzZSB7CiAJCWRldi0+d2RfcGVuZGluZyA9IHRydWU7CiAJfQpAQCAtMzYzLDE3ICszNzEsMjUgQEAKIH07CiAKIAotdm9pZCBtZWlfd2F0Y2hkb2dfcmVnaXN0ZXIoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK2ludCBtZWlfd2F0Y2hkb2dfcmVnaXN0ZXIoc3RydWN0IG1laV9kZXZpY2UgKmRldikKIHsKLQlpZiAod2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKCZhbXRfd2RfZGV2KSkgewotCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwKLQkJCSJ3ZDogdW5hYmxlIHRvIHJlZ2lzdGVyIHdhdGNoZG9nIGRldmljZS5cbiIpOwotCQlyZXR1cm47CisKKwlpbnQgcmV0OworCisJLyogdW5sb2NrIHRvIHBlcnNlcnZlIGNvcnJlY3QgbG9ja2luZyBvcmRlciAqLworCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisJcmV0ID0gd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKCZhbXRfd2RfZGV2KTsKKwltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAid2Q6IHVuYWJsZSB0byByZWdpc3RlciB3YXRjaGRvZyBkZXZpY2UgPSAlZC5cbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LAogCQkid2Q6IHN1Y2Nlc3NmdWxseSByZWdpc3RlciB3YXRjaGRvZyBpbnRlcmZhY2UuXG4iKTsKIAl3YXRjaGRvZ19zZXRfZHJ2ZGF0YSgmYW10X3dkX2RldiwgZGV2KTsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBtZWlfd2F0Y2hkb2dfdW5yZWdpc3RlcihzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21pYy9jYXJkL21pY19kZXZpY2UuaCBiL2RyaXZlcnMvbWlzYy9taWMvY2FyZC9taWNfZGV2aWNlLmgKaW5kZXggMzQ3YjliMy4uMzA2ZjUwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21pYy9jYXJkL21pY19kZXZpY2UuaAorKysgYi9kcml2ZXJzL21pc2MvbWljL2NhcmQvbWljX2RldmljZS5oCkBAIC0yOSw2ICsyOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgogCiAvKioKICAqIHN0cnVjdCBtaWNfaW50cl9pbmZvIC0gQ29udGFpbnMgaC93IHNwZWNpZmljIGludGVycnVwdCBzb3VyY2VzIGluZm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9taWMvaG9zdC9taWNfZGV2aWNlLmggYi9kcml2ZXJzL21pc2MvbWljL2hvc3QvbWljX2RldmljZS5oCmluZGV4IDFhNmVkY2UuLjAzOThjNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9taWMvaG9zdC9taWNfZGV2aWNlLmgKKysrIGIvZHJpdmVycy9taXNjL21pYy9ob3N0L21pY19kZXZpY2UuaApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgogCiAjaW5jbHVkZSAibWljX2ludHIuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21pYy9ob3N0L21pY19pbnRyLmMgYi9kcml2ZXJzL21pc2MvbWljL2hvc3QvbWljX2ludHIuYwppbmRleCBmOWMyOWJjLi5kYmM1YWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWljL2hvc3QvbWljX2ludHIuYworKysgYi9kcml2ZXJzL21pc2MvbWljL2hvc3QvbWljX2ludHIuYwpAQCAtMTk0LDcgKzE5NCw3IEBACiAJZm9yIChpID0gMDsgaSA8IE1JQ19NSU5fTVNJWDsgaSsrKQogCQltZGV2LT5pcnFfaW5mby5tc2l4X2VudHJpZXNbaV0uZW50cnkgPSBpOwogCi0JcmMgPSBwY2lfZW5hYmxlX21zaXgocGRldiwgbWRldi0+aXJxX2luZm8ubXNpeF9lbnRyaWVzLAorCXJjID0gcGNpX2VuYWJsZV9tc2l4X2V4YWN0KHBkZXYsIG1kZXYtPmlycV9pbmZvLm1zaXhfZW50cmllcywKIAkJTUlDX01JTl9NU0lYKTsKIAlpZiAocmMpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiRXJyb3IgZW5hYmxpbmcgTVNJeC4gcmMgPSAlZFxuIiwgcmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3BjaF9waHViLmMgYi9kcml2ZXJzL21pc2MvcGNoX3BodWIuYwppbmRleCBhNTkyNWY3Zi4uOTU2NTk3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3BjaF9waHViLmMKKysrIGIvZHJpdmVycy9taXNjL3BjaF9waHViLmMKQEAgLTYzNiw2ICs2MzYsNyBAQAogCXU4IG1hY1tFVEhfQUxFTl07CiAJc3NpemVfdCByb21fc2l6ZTsKIAlzdHJ1Y3QgcGNoX3BodWJfcmVnICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKIAogCWlmICghbWFjX3B0b24oYnVmLCBtYWMpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTY0NCw4ICs2NDUsMTAgQEAKIAlpZiAoIWNoaXAtPnBjaF9waHViX2V4dHJvbV9iYXNlX2FkZHJlc3MpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcGNoX3BodWJfd3JpdGVfZ2JlX21hY19hZGRyKGNoaXAsIG1hYyk7CisJcmV0ID0gcGNoX3BodWJfd3JpdGVfZ2JlX21hY19hZGRyKGNoaXAsIG1hYyk7CiAJcGNpX3VubWFwX3JvbShjaGlwLT5wZGV2LCBjaGlwLT5wY2hfcGh1Yl9leHRyb21fYmFzZV9hZGRyZXNzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJcmV0dXJuIGNvdW50OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NyYW0uYyBiL2RyaXZlcnMvbWlzYy9zcmFtLmMKaW5kZXggYWZlNjY1NzEuLjIxMTgxZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zcmFtLmMKKysrIGIvZHJpdmVycy9taXNjL3NyYW0uYwpAQCAtMjQsNiArMjQsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3Rfc29ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpAQCAtMzYsMTQgKzM5LDM1IEBACiAJc3RydWN0IGNsayAqY2xrOwogfTsKIAorc3RydWN0IHNyYW1fcmVzZXJ2ZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXUzMiBzdGFydDsKKwl1MzIgc2l6ZTsKK307CisKK3N0YXRpYyBpbnQgc3JhbV9yZXNlcnZlX2NtcCh2b2lkICpwcml2LCBzdHJ1Y3QgbGlzdF9oZWFkICphLAorCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpiKQoreworCXN0cnVjdCBzcmFtX3Jlc2VydmUgKnJhID0gbGlzdF9lbnRyeShhLCBzdHJ1Y3Qgc3JhbV9yZXNlcnZlLCBsaXN0KTsKKwlzdHJ1Y3Qgc3JhbV9yZXNlcnZlICpyYiA9IGxpc3RfZW50cnkoYiwgc3RydWN0IHNyYW1fcmVzZXJ2ZSwgbGlzdCk7CisKKwlyZXR1cm4gcmEtPnN0YXJ0IC0gcmItPnN0YXJ0OworfQorCiBzdGF0aWMgaW50IHNyYW1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAl2b2lkIF9faW9tZW0gKnZpcnRfYmFzZTsKIAlzdHJ1Y3Qgc3JhbV9kZXYgKnNyYW07CiAJc3RydWN0IHJlc291cmNlICpyZXM7Ci0JdW5zaWduZWQgbG9uZyBzaXplOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZSwgKmNoaWxkOworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgY3VyX3N0YXJ0LCBjdXJfc2l6ZTsKKwlzdHJ1Y3Qgc3JhbV9yZXNlcnZlICpyYmxvY2tzLCAqYmxvY2s7CisJc3RydWN0IGxpc3RfaGVhZCByZXNlcnZlX2xpc3Q7CisJdW5zaWduZWQgaW50IG5ibG9ja3M7CiAJaW50IHJldDsKIAorCUlOSVRfTElTVF9IRUFEKCZyZXNlcnZlX2xpc3QpOworCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAl2aXJ0X2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKIAlpZiAoSVNfRVJSKHZpcnRfYmFzZSkpCkBAIC02NSwxOSArODksMTA2IEBACiAJaWYgKCFzcmFtLT5wb29sKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJldCA9IGdlbl9wb29sX2FkZF92aXJ0KHNyYW0tPnBvb2wsICh1bnNpZ25lZCBsb25nKXZpcnRfYmFzZSwKLQkJCQlyZXMtPnN0YXJ0LCBzaXplLCAtMSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJaWYgKHNyYW0tPmNsaykKLQkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShzcmFtLT5jbGspOwotCQlyZXR1cm4gcmV0OworCS8qCisJICogV2UgbmVlZCBhbiBhZGRpdGlvbmFsIGJsb2NrIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgbWVtb3J5IHJlZ2lvbgorCSAqIGFmdGVyIHRoZSByZXNlcnZlZCBibG9ja3MgZnJvbSB0aGUgZHQgYXJlIHByb2Nlc3NlZC4KKwkgKi8KKwluYmxvY2tzID0gKG5wKSA/IG9mX2dldF9hdmFpbGFibGVfY2hpbGRfY291bnQobnApICsgMSA6IDE7CisJcmJsb2NrcyA9IGttYWxsb2MoKG5ibG9ja3MpICogc2l6ZW9mKCpyYmxvY2tzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyYmxvY2tzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jOwogCX0KIAorCWJsb2NrID0gJnJibG9ja3NbMF07CisJZm9yX2VhY2hfYXZhaWxhYmxlX2NoaWxkX29mX25vZGUobnAsIGNoaWxkKSB7CisJCXN0cnVjdCByZXNvdXJjZSBjaGlsZF9yZXM7CisKKwkJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShjaGlsZCwgMCwgJmNoaWxkX3Jlcyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJImNvdWxkIG5vdCBnZXQgYWRkcmVzcyBmb3Igbm9kZSAlc1xuIiwKKwkJCQljaGlsZC0+ZnVsbF9uYW1lKTsKKwkJCWdvdG8gZXJyX2NodW5rczsKKwkJfQorCisJCWlmIChjaGlsZF9yZXMuc3RhcnQgPCByZXMtPnN0YXJ0IHx8IGNoaWxkX3Jlcy5lbmQgPiByZXMtPmVuZCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJyZXNlcnZlZCBibG9jayAlcyBvdXRzaWRlIHRoZSBzcmFtIGFyZWFcbiIsCisJCQkJY2hpbGQtPmZ1bGxfbmFtZSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfY2h1bmtzOworCQl9CisKKwkJYmxvY2stPnN0YXJ0ID0gY2hpbGRfcmVzLnN0YXJ0IC0gcmVzLT5zdGFydDsKKwkJYmxvY2stPnNpemUgPSByZXNvdXJjZV9zaXplKCZjaGlsZF9yZXMpOworCQlsaXN0X2FkZF90YWlsKCZibG9jay0+bGlzdCwgJnJlc2VydmVfbGlzdCk7CisKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiZm91bmQgcmVzZXJ2ZWQgYmxvY2sgMHgleC0weCV4XG4iLAorCQkJYmxvY2stPnN0YXJ0LAorCQkJYmxvY2stPnN0YXJ0ICsgYmxvY2stPnNpemUpOworCisJCWJsb2NrKys7CisJfQorCisJLyogdGhlIGxhc3QgY2h1bmsgbWFya3MgdGhlIGVuZCBvZiB0aGUgcmVnaW9uICovCisJcmJsb2Nrc1tuYmxvY2tzIC0gMV0uc3RhcnQgPSBzaXplOworCXJibG9ja3NbbmJsb2NrcyAtIDFdLnNpemUgPSAwOworCWxpc3RfYWRkX3RhaWwoJnJibG9ja3NbbmJsb2NrcyAtIDFdLmxpc3QsICZyZXNlcnZlX2xpc3QpOworCisJbGlzdF9zb3J0KE5VTEwsICZyZXNlcnZlX2xpc3QsIHNyYW1fcmVzZXJ2ZV9jbXApOworCisJY3VyX3N0YXJ0ID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmxvY2ssICZyZXNlcnZlX2xpc3QsIGxpc3QpIHsKKwkJLyogY2FuIG9ubHkgaGFwcGVuIGlmIHNlY3Rpb25zIG92ZXJsYXAgKi8KKwkJaWYgKGJsb2NrLT5zdGFydCA8IGN1cl9zdGFydCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJibG9jayBhdCAweCV4IHN0YXJ0cyBhZnRlciBjdXJyZW50IG9mZnNldCAweCVseFxuIiwKKwkJCQlibG9jay0+c3RhcnQsIGN1cl9zdGFydCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfY2h1bmtzOworCQl9CisKKwkJLyogY3VycmVudCBzdGFydCBpcyBpbiBhIHJlc2VydmVkIGJsb2NrLCBzbyBjb250aW51ZSBhZnRlciBpdCAqLworCQlpZiAoYmxvY2stPnN0YXJ0ID09IGN1cl9zdGFydCkgeworCQkJY3VyX3N0YXJ0ID0gYmxvY2stPnN0YXJ0ICsgYmxvY2stPnNpemU7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIGFsbG9jYXRlIHRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBjdXJyZW50IHN0YXJ0aW5nCisJCSAqIGFkZHJlc3MgYW5kIHRoZSBmb2xsb3dpbmcgcmVzZXJ2ZWQgYmxvY2ssIG9yIHRoZQorCQkgKiBlbmQgb2YgdGhlIHJlZ2lvbi4KKwkJICovCisJCWN1cl9zaXplID0gYmxvY2stPnN0YXJ0IC0gY3VyX3N0YXJ0OworCisJCWRldl9kYmcoJnBkZXYtPmRldiwgImFkZGluZyBjaHVuayAweCVseC0weCVseFxuIiwKKwkJCWN1cl9zdGFydCwgY3VyX3N0YXJ0ICsgY3VyX3NpemUpOworCQlyZXQgPSBnZW5fcG9vbF9hZGRfdmlydChzcmFtLT5wb29sLAorCQkJCSh1bnNpZ25lZCBsb25nKXZpcnRfYmFzZSArIGN1cl9zdGFydCwKKwkJCQlyZXMtPnN0YXJ0ICsgY3VyX3N0YXJ0LCBjdXJfc2l6ZSwgLTEpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyX2NodW5rczsKKworCQkvKiBuZXh0IGFsbG9jYXRpb24gYWZ0ZXIgdGhpcyByZXNlcnZlZCBibG9jayAqLworCQljdXJfc3RhcnQgPSBibG9jay0+c3RhcnQgKyBibG9jay0+c2l6ZTsKKwl9CisKKwlrZnJlZShyYmxvY2tzKTsKKwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNyYW0pOwogCiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiU1JBTSBwb29sOiAlbGQgS2lCIEAgMHglcFxuIiwgc2l6ZSAvIDEwMjQsIHZpcnRfYmFzZSk7CiAKIAlyZXR1cm4gMDsKKworZXJyX2NodW5rczoKKwlrZnJlZShyYmxvY2tzKTsKK2Vycl9hbGxvYzoKKwlpZiAoc3JhbS0+Y2xrKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUoc3JhbS0+Y2xrKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHNyYW1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC04Nyw4ICsxOTgsNiBAQAogCWlmIChnZW5fcG9vbF9hdmFpbChzcmFtLT5wb29sKSA8IGdlbl9wb29sX3NpemUoc3JhbS0+cG9vbCkpCiAJCWRldl9kYmcoJnBkZXYtPmRldiwgInJlbW92ZWQgd2hpbGUgU1JBTSBhbGxvY2F0ZWRcbiIpOwogCi0JZ2VuX3Bvb2xfZGVzdHJveShzcmFtLT5wb29sKTsKLQogCWlmIChzcmFtLT5jbGspCiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShzcmFtLT5jbGspOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvdGktc3Qvc3RfY29yZS5jIGIvZHJpdmVycy9taXNjL3RpLXN0L3N0X2NvcmUuYwppbmRleCAzYWVkNTI1Li4xOTcyZDU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvdGktc3Qvc3RfY29yZS5jCisrKyBiL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9jb3JlLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNkZWZpbmUgcHJfZm10KGZtdCkJIihzdGMpOiAiIGZtdAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvdGlfZGFjNzUxMi5jIGIvZHJpdmVycy9taXNjL3RpX2RhYzc1MTIuYwppbmRleCA4M2RhNzExLi5jYjAyODliIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvdGlfZGFjNzUxMi5jCisrKyBiL2RyaXZlcnMvbWlzYy90aV9kYWM3NTEyLmMKQEAgLTIwLDcgKzIwLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvdHNsMjU1MC5jIGIvZHJpdmVycy9taXNjL3RzbDI1NTAuYwppbmRleCA1YmMxMGZhMS4uYjAwMzM1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3RzbDI1NTAuYworKysgYi9kcml2ZXJzL21pc2MvdHNsMjU1MC5jCkBAIC0yMCw3ICsyMCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy92bXdfdm1jaS92bWNpX2d1ZXN0LmMgYi9kcml2ZXJzL21pc2Mvdm13X3ZtY2kvdm1jaV9ndWVzdC5jCmluZGV4IGQzNWNkYTAuLmUwZDUwMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy92bXdfdm1jaS92bWNpX2d1ZXN0LmMKKysrIGIvZHJpdmVycy9taXNjL3Ztd192bWNpL3ZtY2lfZ3Vlc3QuYwpAQCAtMzgzLDExICszODMsMTIgQEAKIAkJdm1jaV9kZXYtPm1zaXhfZW50cmllc1tpXS52ZWN0b3IgPSBpOwogCX0KIAotCXJlc3VsdCA9IHBjaV9lbmFibGVfbXNpeChwZGV2LCB2bWNpX2Rldi0+bXNpeF9lbnRyaWVzLCBWTUNJX01BWF9JTlRSUyk7CisJcmVzdWx0ID0gcGNpX2VuYWJsZV9tc2l4X2V4YWN0KHBkZXYsCisJCQkJICAgICAgIHZtY2lfZGV2LT5tc2l4X2VudHJpZXMsIFZNQ0lfTUFYX0lOVFJTKTsKIAlpZiAocmVzdWx0ID09IDApCiAJCXZtY2lfZGV2LT5leGNsdXNpdmVfdmVjdG9ycyA9IHRydWU7Ci0JZWxzZSBpZiAocmVzdWx0ID4gMCkKLQkJcmVzdWx0ID0gcGNpX2VuYWJsZV9tc2l4KHBkZXYsIHZtY2lfZGV2LT5tc2l4X2VudHJpZXMsIDEpOworCWVsc2UgaWYgKHJlc3VsdCA9PSAtRU5PU1BDKQorCQlyZXN1bHQgPSBwY2lfZW5hYmxlX21zaXhfZXhhY3QocGRldiwgdm1jaV9kZXYtPm1zaXhfZW50cmllcywgMSk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnIGIvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCmluZGV4IDkwZmY0NDcuLmE0YmVlNDFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCkBAIC00MjgsNiArNDI4LDcgQEAKIAl0cmlzdGF0ZSAiTkFORCBzdXBwb3J0IGZvciBGcmVlc2NhbGUgSUZDIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBNVERfTkFORCAmJiBGU0xfU09DCiAJc2VsZWN0IEZTTF9JRkMKKwlzZWxlY3QgTUVNT1JZCiAJaGVscAogCSAgVmFyaW91cyBGcmVlc2NhbGUgY2hpcHMgZS5nIFAxMDEwLCBpbmNsdWRlIGEgTkFORCBGbGFzaCBtYWNoaW5lCiAJICB3aXRoIGJ1aWx0LWluIGhhcmR3YXJlIEVDQyBjYXBhYmlsaXRpZXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2ZzbF9pZmNfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9mc2xfaWZjX25hbmQuYwppbmRleCA5MGNhN2U3Li41MGQ5MTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2ZzbF9pZmNfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvZnNsX2lmY19uYW5kLmMKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfZWNjLmg+Ci0jaW5jbHVkZSA8YXNtL2ZzbF9pZmMuaD4KKyNpbmNsdWRlIDxsaW51eC9mc2xfaWZjLmg+CiAKICNkZWZpbmUgRlNMX0lGQ19WMV8xXzAJMHgwMTAxMDAwMAogI2RlZmluZSBFUlJfQllURQkJMHhGRiAvKiBWYWx1ZSByZXR1cm5lZCBmb3IgcmVhZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9zaF9mbGN0bC5jIGIvZHJpdmVycy9tdGQvbmFuZC9zaF9mbGN0bC5jCmluZGV4IGQ3Mjc4M2QuLmMwNjcwMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvc2hfZmxjdGwuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3NoX2ZsY3RsLmMKQEAgLTg5Nyw3ICs4OTcsNyBAQAogCQlpZiAoIWZsY3RsLT5xb3NfcmVxdWVzdCkgewogCQkJcmV0ID0gZGV2X3BtX3Fvc19hZGRfcmVxdWVzdCgmZmxjdGwtPnBkZXYtPmRldiwKIAkJCQkJCQkmZmxjdGwtPnBtX3FvcywKLQkJCQkJCQlERVZfUE1fUU9TX0xBVEVOQ1ksCisJCQkJCQkJREVWX1BNX1FPU19SRVNVTUVfTEFURU5DWSwKIAkJCQkJCQkxMDApOwogCQkJaWYgKHJldCA8IDApCiAJCQkJZGV2X2VycigmZmxjdGwtPnBkZXYtPmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvYmFzZS5jIGIvZHJpdmVycy9vZi9iYXNlLmMKaW5kZXggODllODg4YS4uNWY4MWJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9iYXNlLmMKKysrIGIvZHJpdmVycy9vZi9iYXNlLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dyYXBoLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgpAQCAtOTA0LDYgKzkwNSwzOCBAQAogRVhQT1JUX1NZTUJPTChvZl9maW5kX25vZGVfYnlfcGhhbmRsZSk7CiAKIC8qKgorICogb2ZfcHJvcGVydHlfY291bnRfZWxlbXNfb2Zfc2l6ZSAtIENvdW50IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSBwcm9wZXJ0eQorICoKKyAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCisgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgorICogQGVsZW1fc2l6ZToJc2l6ZSBvZiB0aGUgaW5kaXZpZHVhbCBlbGVtZW50CisgKgorICogU2VhcmNoIGZvciBhIHByb3BlcnR5IGluIGEgZGV2aWNlIG5vZGUgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YKKyAqIHNpemUgZWxlbV9zaXplIGluIGl0LiBSZXR1cm5zIG51bWJlciBvZiBlbGVtZW50cyBvbiBzdWNlc3MsIC1FSU5WQUwgaWYgdGhlCisgKiBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCBvciBpdHMgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGEgbXVsdGlwbGUgb2YgZWxlbV9zaXplCisgKiBhbmQgLUVOT0RBVEEgaWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZS4KKyAqLworaW50IG9mX3Byb3BlcnR5X2NvdW50X2VsZW1zX29mX3NpemUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQljb25zdCBjaGFyICpwcm9wbmFtZSwgaW50IGVsZW1fc2l6ZSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCBwcm9wbmFtZSwgTlVMTCk7CisKKwlpZiAoIXByb3ApCisJCXJldHVybiAtRUlOVkFMOworCWlmICghcHJvcC0+dmFsdWUpCisJCXJldHVybiAtRU5PREFUQTsKKworCWlmIChwcm9wLT5sZW5ndGggJSBlbGVtX3NpemUgIT0gMCkgeworCQlwcl9lcnIoInNpemUgb2YgJXMgaW4gbm9kZSAlcyBpcyBub3QgYSBtdWx0aXBsZSBvZiAlZFxuIiwKKwkJICAgICAgIHByb3BuYW1lLCBucC0+ZnVsbF9uYW1lLCBlbGVtX3NpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcHJvcC0+bGVuZ3RoIC8gZWxlbV9zaXplOworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfcHJvcGVydHlfY291bnRfZWxlbXNfb2Zfc2l6ZSk7CisKKy8qKgogICogb2ZfZmluZF9wcm9wZXJ0eV92YWx1ZV9vZl9zaXplCiAgKgogICogQG5wOgkJZGV2aWNlIG5vZGUgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdG8gYmUgcmVhZC4KQEAgLTE5ODIsMyArMjAxNSwxNTMgQEAKIAogCXJldHVybiBOVUxMOwogfQorCisvKioKKyAqIG9mX2dyYXBoX3BhcnNlX2VuZHBvaW50KCkgLSBwYXJzZSBjb21tb24gZW5kcG9pbnQgbm9kZSBwcm9wZXJ0aWVzCisgKiBAbm9kZTogcG9pbnRlciB0byBlbmRwb2ludCBkZXZpY2Vfbm9kZQorICogQGVuZHBvaW50OiBwb2ludGVyIHRvIHRoZSBPRiBlbmRwb2ludCBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFRoZSBjYWxsZXIgc2hvdWxkIGhvbGQgYSByZWZlcmVuY2UgdG8gQG5vZGUuCisgKi8KK2ludCBvZl9ncmFwaF9wYXJzZV9lbmRwb2ludChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkgICAgc3RydWN0IG9mX2VuZHBvaW50ICplbmRwb2ludCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBvcnRfbm9kZSA9IG9mX2dldF9wYXJlbnQobm9kZSk7CisKKwlXQVJOX09OQ0UoIXBvcnRfbm9kZSwgIiVzKCk6IGVuZHBvaW50ICVzIGhhcyBubyBwYXJlbnQgbm9kZVxuIiwKKwkJICBfX2Z1bmNfXywgbm9kZS0+ZnVsbF9uYW1lKTsKKworCW1lbXNldChlbmRwb2ludCwgMCwgc2l6ZW9mKCplbmRwb2ludCkpOworCisJZW5kcG9pbnQtPmxvY2FsX25vZGUgPSBub2RlOworCS8qCisJICogSXQgZG9lc24ndCBtYXR0ZXIgd2hldGhlciB0aGUgdHdvIGNhbGxzIGJlbG93IHN1Y2NlZWQuCisJICogSWYgdGhleSBkb24ndCB0aGVuIHRoZSBkZWZhdWx0IHZhbHVlIDAgaXMgdXNlZC4KKwkgKi8KKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihwb3J0X25vZGUsICJyZWciLCAmZW5kcG9pbnQtPnBvcnQpOworCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJyZWciLCAmZW5kcG9pbnQtPmlkKTsKKworCW9mX25vZGVfcHV0KHBvcnRfbm9kZSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wob2ZfZ3JhcGhfcGFyc2VfZW5kcG9pbnQpOworCisvKioKKyAqIG9mX2dyYXBoX2dldF9uZXh0X2VuZHBvaW50KCkgLSBnZXQgbmV4dCBlbmRwb2ludCBub2RlCisgKiBAcGFyZW50OiBwb2ludGVyIHRvIHRoZSBwYXJlbnQgZGV2aWNlIG5vZGUKKyAqIEBwcmV2OiBwcmV2aW91cyBlbmRwb2ludCBub2RlLCBvciBOVUxMIHRvIGdldCBmaXJzdAorICoKKyAqIFJldHVybjogQW4gJ2VuZHBvaW50JyBub2RlIHBvaW50ZXIgd2l0aCByZWZjb3VudCBpbmNyZW1lbnRlZC4gUmVmY291bnQKKyAqIG9mIHRoZSBwYXNzZWQgQHByZXYgbm9kZSBpcyBub3QgZGVjcmVtZW50ZWQsIHRoZSBjYWxsZXIgaGF2ZSB0byB1c2UKKyAqIG9mX25vZGVfcHV0KCkgb24gaXQgd2hlbiBkb25lLgorICovCitzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dyYXBoX2dldF9uZXh0X2VuZHBvaW50KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnByZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICplbmRwb2ludDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBvcnQgPSBOVUxMOworCisJaWYgKCFwYXJlbnQpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFwcmV2KSB7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKwkJLyoKKwkJICogSXQncyB0aGUgZmlyc3QgY2FsbCwgd2UgaGF2ZSB0byBmaW5kIGEgcG9ydCBzdWJub2RlCisJCSAqIHdpdGhpbiB0aGlzIG5vZGUgb3Igd2l0aGluIGFuIG9wdGlvbmFsICdwb3J0cycgbm9kZS4KKwkJICovCisJCW5vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShwYXJlbnQsICJwb3J0cyIpOworCQlpZiAobm9kZSkKKwkJCXBhcmVudCA9IG5vZGU7CisKKwkJcG9ydCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKHBhcmVudCwgInBvcnQiKTsKKworCQlpZiAocG9ydCkgeworCQkJLyogRm91bmQgYSBwb3J0LCBnZXQgYW4gZW5kcG9pbnQuICovCisJCQllbmRwb2ludCA9IG9mX2dldF9uZXh0X2NoaWxkKHBvcnQsIE5VTEwpOworCQkJb2Zfbm9kZV9wdXQocG9ydCk7CisJCX0gZWxzZSB7CisJCQllbmRwb2ludCA9IE5VTEw7CisJCX0KKworCQlpZiAoIWVuZHBvaW50KQorCQkJcHJfZXJyKCIlcygpOiBubyBlbmRwb2ludCBub2RlcyBzcGVjaWZpZWQgZm9yICVzXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBwYXJlbnQtPmZ1bGxfbmFtZSk7CisJCW9mX25vZGVfcHV0KG5vZGUpOworCisJCXJldHVybiBlbmRwb2ludDsKKwl9CisKKwlwb3J0ID0gb2ZfZ2V0X3BhcmVudChwcmV2KTsKKwlpZiAoV0FSTl9PTkNFKCFwb3J0LCAiJXMoKTogZW5kcG9pbnQgJXMgaGFzIG5vIHBhcmVudCBub2RlXG4iLAorCQkgICAgICBfX2Z1bmNfXywgcHJldi0+ZnVsbF9uYW1lKSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBBdm9pZCBkcm9wcGluZyBwcmV2IG5vZGUgcmVmY291bnQgdG8gMC4gKi8KKwlvZl9ub2RlX2dldChwcmV2KTsKKwllbmRwb2ludCA9IG9mX2dldF9uZXh0X2NoaWxkKHBvcnQsIHByZXYpOworCWlmIChlbmRwb2ludCkgeworCQlvZl9ub2RlX3B1dChwb3J0KTsKKwkJcmV0dXJuIGVuZHBvaW50OworCX0KKworCS8qIE5vIG1vcmUgZW5kcG9pbnRzIHVuZGVyIHRoaXMgcG9ydCwgdHJ5IHRoZSBuZXh0IG9uZS4gKi8KKwlkbyB7CisJCXBvcnQgPSBvZl9nZXRfbmV4dF9jaGlsZChwYXJlbnQsIHBvcnQpOworCQlpZiAoIXBvcnQpCisJCQlyZXR1cm4gTlVMTDsKKwl9IHdoaWxlIChvZl9ub2RlX2NtcChwb3J0LT5uYW1lLCAicG9ydCIpKTsKKworCS8qIFBpY2sgdXAgdGhlIGZpcnN0IGVuZHBvaW50IGluIHRoaXMgcG9ydC4gKi8KKwllbmRwb2ludCA9IG9mX2dldF9uZXh0X2NoaWxkKHBvcnQsIE5VTEwpOworCW9mX25vZGVfcHV0KHBvcnQpOworCisJcmV0dXJuIGVuZHBvaW50OworfQorRVhQT1JUX1NZTUJPTChvZl9ncmFwaF9nZXRfbmV4dF9lbmRwb2ludCk7CisKKy8qKgorICogb2ZfZ3JhcGhfZ2V0X3JlbW90ZV9wb3J0X3BhcmVudCgpIC0gZ2V0IHJlbW90ZSBwb3J0J3MgcGFyZW50IG5vZGUKKyAqIEBub2RlOiBwb2ludGVyIHRvIGEgbG9jYWwgZW5kcG9pbnQgZGV2aWNlX25vZGUKKyAqCisgKiBSZXR1cm46IFJlbW90ZSBkZXZpY2Ugbm9kZSBhc3NvY2lhdGVkIHdpdGggcmVtb3RlIGVuZHBvaW50IG5vZGUgbGlua2VkCisgKgkgICB0byBAbm9kZS4gVXNlIG9mX25vZGVfcHV0KCkgb24gaXQgd2hlbiBkb25lLgorICovCitzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQoCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdW5zaWduZWQgaW50IGRlcHRoOworCisJLyogR2V0IHJlbW90ZSBlbmRwb2ludCBub2RlLiAqLworCW5wID0gb2ZfcGFyc2VfcGhhbmRsZShub2RlLCAicmVtb3RlLWVuZHBvaW50IiwgMCk7CisKKwkvKiBXYWxrIDMgbGV2ZWxzIHVwIG9ubHkgaWYgdGhlcmUgaXMgJ3BvcnRzJyBub2RlLiAqLworCWZvciAoZGVwdGggPSAzOyBkZXB0aCAmJiBucDsgZGVwdGgtLSkgeworCQlucCA9IG9mX2dldF9uZXh0X3BhcmVudChucCk7CisJCWlmIChkZXB0aCA9PSAyICYmIG9mX25vZGVfY21wKG5wLT5uYW1lLCAicG9ydHMiKSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gbnA7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQpOworCisvKioKKyAqIG9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydCgpIC0gZ2V0IHJlbW90ZSBwb3J0IG5vZGUKKyAqIEBub2RlOiBwb2ludGVyIHRvIGEgbG9jYWwgZW5kcG9pbnQgZGV2aWNlX25vZGUKKyAqCisgKiBSZXR1cm46IFJlbW90ZSBwb3J0IG5vZGUgYXNzb2NpYXRlZCB3aXRoIHJlbW90ZSBlbmRwb2ludCBub2RlIGxpbmtlZAorICoJICAgdG8gQG5vZGUuIFVzZSBvZl9ub2RlX3B1dCgpIG9uIGl0IHdoZW4gZG9uZS4KKyAqLworc3RydWN0IGRldmljZV9ub2RlICpvZl9ncmFwaF9nZXRfcmVtb3RlX3BvcnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwkvKiBHZXQgcmVtb3RlIGVuZHBvaW50IG5vZGUuICovCisJbnAgPSBvZl9wYXJzZV9waGFuZGxlKG5vZGUsICJyZW1vdGUtZW5kcG9pbnQiLCAwKTsKKwlpZiAoIW5wKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gb2ZfZ2V0X25leHRfcGFyZW50KG5wKTsKK30KK0VYUE9SVF9TWU1CT0wob2ZfZ3JhcGhfZ2V0X3JlbW90ZV9wb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9zaGFyZS5jIGIvZHJpdmVycy9wYXJwb3J0L3NoYXJlLmMKaW5kZXggNmE4M2VlMS4uM2ZhNjYyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L3NoYXJlLmMKKysrIGIvZHJpdmVycy9wYXJwb3J0L3NoYXJlLmMKQEAgLTkwNSw3ICs5MDUsOCBAQAogCQkvKiBJZiBkZXYtPndhaXRpbmcgaXMgY2xlYXIgbm93LCBhbiBpbnRlcnJ1cHQKIAkJICAgZ2F2ZSB1cyB0aGUgcG9ydCBhbmQgd2Ugd291bGQgZGVhZGxvY2sgaWYgd2Ugc2xlcHQuICAqLwogCQlpZiAoZGV2LT53YWl0aW5nKSB7Ci0JCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uICgmZGV2LT53YWl0X3EpOworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRldi0+d2FpdF9xLAorCQkJCQkJICFkZXYtPndhaXRpbmcpOwogCQkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgewogCQkJCXJldHVybiAtRUlOVFI7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9NYWtlZmlsZSBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCmluZGV4IDE3ZDJiMDcuLmUwNGZlMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCkBAIC0zMywyMSArMzMsMTQgQEAKICMKICMgU29tZSBhcmNoaXRlY3R1cmVzIHVzZSB0aGUgZ2VuZXJpYyBQQ0kgc2V0dXAgZnVuY3Rpb25zCiAjCi1vYmotJChDT05GSUdfWDg2KSArPSBzZXR1cC1idXMubwotb2JqLSQoQ09ORklHX0FMUEhBKSArPSBzZXR1cC1idXMubyBzZXR1cC1pcnEubwotb2JqLSQoQ09ORklHX0FSTSkgKz0gc2V0dXAtYnVzLm8gc2V0dXAtaXJxLm8KLW9iai0kKENPTkZJR19VTklDT1JFMzIpICs9IHNldHVwLWJ1cy5vIHNldHVwLWlycS5vCi1vYmotJChDT05GSUdfUEFSSVNDKSArPSBzZXR1cC1idXMubwotb2JqLSQoQ09ORklHX1NVUEVSSCkgKz0gc2V0dXAtYnVzLm8gc2V0dXAtaXJxLm8KLW9iai0kKENPTkZJR19QUEMpICs9IHNldHVwLWJ1cy5vCi1vYmotJChDT05GSUdfRlJWKSArPSBzZXR1cC1idXMubwotb2JqLSQoQ09ORklHX01JUFMpICs9IHNldHVwLWJ1cy5vIHNldHVwLWlycS5vCi1vYmotJChDT05GSUdfWDg2X1ZJU1dTKSArPSBzZXR1cC1pcnEubwotb2JqLSQoQ09ORklHX01OMTAzMDApICs9IHNldHVwLWJ1cy5vCi1vYmotJChDT05GSUdfTUlDUk9CTEFaRSkgKz0gc2V0dXAtYnVzLm8KLW9iai0kKENPTkZJR19USUxFKSArPSBzZXR1cC1idXMubyBzZXR1cC1pcnEubwotb2JqLSQoQ09ORklHX1NQQVJDX0xFT04pICs9IHNldHVwLWJ1cy5vIHNldHVwLWlycS5vCi1vYmotJChDT05GSUdfTTY4SykgKz0gc2V0dXAtYnVzLm8gc2V0dXAtaXJxLm8KK29iai0kKENPTkZJR19BTFBIQSkgKz0gc2V0dXAtaXJxLm8KK29iai0kKENPTkZJR19BUk0pICs9IHNldHVwLWlycS5vCitvYmotJChDT05GSUdfVU5JQ09SRTMyKSArPSBzZXR1cC1pcnEubworb2JqLSQoQ09ORklHX1NVUEVSSCkgKz0gc2V0dXAtaXJxLm8KK29iai0kKENPTkZJR19NSVBTKSArPSBzZXR1cC1pcnEubworb2JqLSQoQ09ORklHX1RJTEUpICs9IHNldHVwLWlycS5vCitvYmotJChDT05GSUdfU1BBUkNfTEVPTikgKz0gc2V0dXAtaXJxLm8KK29iai0kKENPTkZJR19NNjhLKSArPSBzZXR1cC1pcnEubwogCiAjCiAjIEFDUEkgUmVsYXRlZCBQQ0kgRlcgRnVuY3Rpb25zCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9idXMuYyBiL2RyaXZlcnMvcGNpL2J1cy5jCmluZGV4IDM4OTAxNjYuLmZiOGFlZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2J1cy5jCisrKyBiL2RyaXZlcnMvcGNpL2J1cy5jCkBAIC0xMzIsNyArMTMyLDcgQEAKIAogc3RhdGljIGludCBwY2lfYnVzX2FsbG9jX2Zyb21fcmVnaW9uKHN0cnVjdCBwY2lfYnVzICpidXMsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAogCQlyZXNvdXJjZV9zaXplX3Qgc2l6ZSwgcmVzb3VyY2Vfc2l6ZV90IGFsaWduLAotCQlyZXNvdXJjZV9zaXplX3QgbWluLCB1bnNpZ25lZCBpbnQgdHlwZV9tYXNrLAorCQlyZXNvdXJjZV9zaXplX3QgbWluLCB1bnNpZ25lZCBsb25nIHR5cGVfbWFzaywKIAkJcmVzb3VyY2Vfc2l6ZV90ICgqYWxpZ25mKSh2b2lkICosCiAJCQkJCSAgY29uc3Qgc3RydWN0IHJlc291cmNlICosCiAJCQkJCSAgcmVzb3VyY2Vfc2l6ZV90LApAQCAtMTQ0LDcgKzE0NCw3IEBACiAJc3RydWN0IHJlc291cmNlICpyLCBhdmFpbDsKIAlyZXNvdXJjZV9zaXplX3QgbWF4OwogCi0JdHlwZV9tYXNrIHw9IElPUkVTT1VSQ0VfSU8gfCBJT1JFU09VUkNFX01FTTsKKwl0eXBlX21hc2sgfD0gSU9SRVNPVVJDRV9UWVBFX0JJVFM7CiAKIAlwY2lfYnVzX2Zvcl9lYWNoX3Jlc291cmNlKGJ1cywgciwgaSkgewogCQlpZiAoIXIpCkBAIC0yMDAsNyArMjAwLDcgQEAKICAqLwogaW50IHBjaV9idXNfYWxsb2NfcmVzb3VyY2Uoc3RydWN0IHBjaV9idXMgKmJ1cywgc3RydWN0IHJlc291cmNlICpyZXMsCiAJCXJlc291cmNlX3NpemVfdCBzaXplLCByZXNvdXJjZV9zaXplX3QgYWxpZ24sCi0JCXJlc291cmNlX3NpemVfdCBtaW4sIHVuc2lnbmVkIGludCB0eXBlX21hc2ssCisJCXJlc291cmNlX3NpemVfdCBtaW4sIHVuc2lnbmVkIGxvbmcgdHlwZV9tYXNrLAogCQlyZXNvdXJjZV9zaXplX3QgKCphbGlnbmYpKHZvaWQgKiwKIAkJCQkJICBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKiwKIAkJCQkJICByZXNvdXJjZV9zaXplX3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0LWJyaWRnZS5jIGIvZHJpdmVycy9wY2kvaG9zdC1icmlkZ2UuYwppbmRleCAwNmFjZTYyLi40N2FhZjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0LWJyaWRnZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QtYnJpZGdlLmMKQEAgLTMyLDExICszMiw2IEBACiAJYnJpZGdlLT5yZWxlYXNlX2RhdGEgPSByZWxlYXNlX2RhdGE7CiB9CiAKLXN0YXRpYyBib29sIHJlc291cmNlX2NvbnRhaW5zKHN0cnVjdCByZXNvdXJjZSAqcmVzMSwgc3RydWN0IHJlc291cmNlICpyZXMyKQotewotCXJldHVybiByZXMxLT5zdGFydCA8PSByZXMyLT5zdGFydCAmJiByZXMxLT5lbmQgPj0gcmVzMi0+ZW5kOwotfQotCiB2b2lkIHBjaWJpb3NfcmVzb3VyY2VfdG9fYnVzKHN0cnVjdCBwY2lfYnVzICpidXMsIHN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uLAogCQkJICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKIHsKQEAgLTQ1LDkgKzQwLDYgQEAKIAlyZXNvdXJjZV9zaXplX3Qgb2Zmc2V0ID0gMDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkod2luZG93LCAmYnJpZGdlLT53aW5kb3dzLCBsaXN0KSB7Ci0JCWlmIChyZXNvdXJjZV90eXBlKHJlcykgIT0gcmVzb3VyY2VfdHlwZSh3aW5kb3ctPnJlcykpCi0JCQljb250aW51ZTsKLQogCQlpZiAocmVzb3VyY2VfY29udGFpbnMod2luZG93LT5yZXMsIHJlcykpIHsKIAkJCW9mZnNldCA9IHdpbmRvdy0+b2Zmc2V0OwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L0tjb25maWcgYi9kcml2ZXJzL3BjaS9ob3N0L0tjb25maWcKaW5kZXggNDdkNDZjNi4uYTZmNjdlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvS2NvbmZpZwpAQCAtMjcsNyArMjcsNyBAQAogCiBjb25maWcgUENJX1JDQVJfR0VOMgogCWJvb2wgIlJlbmVzYXMgUi1DYXIgR2VuMiBJbnRlcm5hbCBQQ0kgY29udHJvbGxlciIKLQlkZXBlbmRzIG9uIEFSTSAmJiAoQVJDSF9SOEE3NzkwIHx8IEFSQ0hfUjhBNzc5MSB8fCBDT01QSUxFX1RFU1QpCisJZGVwZW5kcyBvbiBBUkNIX1NITU9CSUxFIHx8IChBUk0gJiYgQ09NUElMRV9URVNUKQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgaW50ZXJuYWwgUENJIHN1cHBvcnQgb24gUi1DYXIgR2VuMiBTb0MuCiAJICBUaGVyZSBhcmUgMyBpbnRlcm5hbCBQQ0kgY29udHJvbGxlcnMgYXZhaWxhYmxlIHdpdGggYSBzaW5nbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWlteDYuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWlteDYuYwppbmRleCBlODY2M2E4Li5lZTA4MjUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1pbXg2LmMKKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktaW14Ni5jCkBAIC00MjQsMjAgKzQyNCw0MCBAQAogCiBzdGF0aWMgaW50IGlteDZfcGNpZV9saW5rX3VwKHN0cnVjdCBwY2llX3BvcnQgKnBwKQogewotCXUzMiByYywgbHRzc20sIHJ4X3ZhbGlkOworCXUzMiByYywgZGVidWdfcjAsIHJ4X3ZhbGlkOworCWludCBjb3VudCA9IDU7CiAKIAkvKgotCSAqIFRlc3QgaWYgdGhlIFBIWSByZXBvcnRzIHRoYXQgdGhlIGxpbmsgaXMgdXAgYW5kIGFsc28gdGhhdAotCSAqIHRoZSBsaW5rIHRyYWluaW5nIGZpbmlzaGVkLiAgSXQgbWlnaHQgaGFwcGVuIHRoYXQgdGhlIFBIWQotCSAqIHJlcG9ydHMgdGhlIGxpbmsgaXMgYWxyZWFkeSB1cCwgYnV0IHRoZSBsaW5rIHRyYWluaW5nIGJpdAotCSAqIGlzIHN0aWxsIHNldCwgc28gbWFrZSBzdXJlIHRvIGNoZWNrIHRoZSB0cmFpbmluZyBpcyBkb25lCi0JICogYXMgd2VsbCBoZXJlLgorCSAqIFRlc3QgaWYgdGhlIFBIWSByZXBvcnRzIHRoYXQgdGhlIGxpbmsgaXMgdXAgYW5kIGFsc28gdGhhdCB0aGUgTFRTU00KKwkgKiB0cmFpbmluZyBmaW5pc2hlZC4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0YXRlcyBvZiB0aGUgbGluayB3aGVuCisJICogdGhpcyBjb2RlIGlzIGNhbGxlZDoKKwkgKiAxKSBUaGUgbGluayBpcyBET1dOICh1bmxpa2VseSkKKwkgKiAgICAgVGhlIGxpbmsgZGlkbid0IGNvbWUgdXAgeWV0IGZvciBzb21lIHJlYXNvbi4gVGhpcyB1c3VhbGx5IG1lYW5zCisJICogICAgIHdlIGhhdmUgYSByZWFsIHByb2JsZW0gc29tZXdoZXJlLiBSZXNldCB0aGUgUEhZIGFuZCBleGl0LiBUaGlzCisJICogICAgIHN0YXRlIGNhbGxzIGZvciBpbnNwZWN0aW9uIG9mIHRoZSBERUJVRyByZWdpc3RlcnMuCisJICogMikgVGhlIGxpbmsgaXMgVVAsIGJ1dCBzdGlsbCBpbiBMVFNTTSB0cmFpbmluZworCSAqICAgICBXYWl0IGZvciB0aGUgdHJhaW5pbmcgdG8gZmluaXNoLCB3aGljaCBzaG91bGQgdGFrZSBhIHZlcnkgc2hvcnQKKwkgKiAgICAgdGltZS4gSWYgdGhlIHRyYWluaW5nIGRvZXMgbm90IGZpbmlzaCwgd2UgaGF2ZSBhIHByb2JsZW0gYW5kIHdlCisJICogICAgIG5lZWQgdG8gaW5zcGVjdCB0aGUgREVCVUcgcmVnaXN0ZXJzLiBJZiB0aGUgdHJhaW5pbmcgZG9lcyBmaW5pc2gsCisJICogICAgIHRoZSBsaW5rIGlzIHVwIGFuZCBvcGVyYXRpbmcgY29ycmVjdGx5LgorCSAqIDMpIFRoZSBsaW5rIGlzIFVQIGFuZCBubyBsb25nZXIgaW4gTFRTU00gdHJhaW5pbmcKKwkgKiAgICAgVGhlIGxpbmsgaXMgdXAgYW5kIG9wZXJhdGluZyBjb3JyZWN0bHkuCiAJICovCi0JcmMgPSByZWFkbChwcC0+ZGJpX2Jhc2UgKyBQQ0lFX1BIWV9ERUJVR19SMSk7Ci0JaWYgKChyYyAmIFBDSUVfUEhZX0RFQlVHX1IxX1hNTEhfTElOS19VUCkgJiYKLQkgICAgIShyYyAmIFBDSUVfUEhZX0RFQlVHX1IxX1hNTEhfTElOS19JTl9UUkFJTklORykpCi0JCXJldHVybiAxOwotCisJd2hpbGUgKDEpIHsKKwkJcmMgPSByZWFkbChwcC0+ZGJpX2Jhc2UgKyBQQ0lFX1BIWV9ERUJVR19SMSk7CisJCWlmICghKHJjICYgUENJRV9QSFlfREVCVUdfUjFfWE1MSF9MSU5LX1VQKSkKKwkJCWJyZWFrOworCQlpZiAoIShyYyAmIFBDSUVfUEhZX0RFQlVHX1IxX1hNTEhfTElOS19JTl9UUkFJTklORykpCisJCQlyZXR1cm4gMTsKKwkJaWYgKCFjb3VudC0tKQorCQkJYnJlYWs7CisJCWRldl9kYmcocHAtPmRldiwgIkxpbmsgaXMgdXAsIGJ1dCBzdGlsbCBpbiB0cmFpbmluZ1xuIik7CisJCS8qCisJCSAqIFdhaXQgYSBsaXR0bGUgYml0LCB0aGVuIHJlLWNoZWNrIGlmIHRoZSBsaW5rIGZpbmlzaGVkCisJCSAqIHRoZSB0cmFpbmluZy4KKwkJICovCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwl9CiAJLyoKIAkgKiBGcm9tIEwwLCBpbml0aWF0ZSBNQUMgZW50cnkgdG8gZ2VuMiBpZiBFUC9SQyBzdXBwb3J0cyBnZW4yLgogCSAqIFdhaXQgMm1zIChMVFNTTSB0aW1lb3V0IGlzIDI0bXMsIFBIWSBsb2NrIGlzIH41dXMgaW4gZ2VuMikuCkBAIC00NDYsMTUgKzQ2NiwxNiBAQAogCSAqIHRvIGdlbjIgaXMgc3R1Y2sKIAkgKi8KIAlwY2llX3BoeV9yZWFkKHBwLT5kYmlfYmFzZSwgUENJRV9QSFlfUlhfQVNJQ19PVVQsICZyeF92YWxpZCk7Ci0JbHRzc20gPSByZWFkbChwcC0+ZGJpX2Jhc2UgKyBQQ0lFX1BIWV9ERUJVR19SMCkgJiAweDNGOworCWRlYnVnX3IwID0gcmVhZGwocHAtPmRiaV9iYXNlICsgUENJRV9QSFlfREVCVUdfUjApOwogCiAJaWYgKHJ4X3ZhbGlkICYgMHgwMSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAobHRzc20gIT0gMHgwZCkKKwlpZiAoKGRlYnVnX3IwICYgMHgzZikgIT0gMHgwZCkKIAkJcmV0dXJuIDA7CiAKIAlkZXZfZXJyKHBwLT5kZXYsICJ0cmFuc2l0aW9uIHRvIGdlbjIgaXMgc3R1Y2ssIHJlc2V0IFBIWSFcbiIpOworCWRldl9kYmcocHAtPmRldiwgImRlYnVnX3IwPSUwOHggZGVidWdfcjE9JTA4eFxuIiwgZGVidWdfcjAsIHJjKTsKIAogCWlteDZfcGNpZV9yZXNldF9waHkocHApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1tdmVidS5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktbXZlYnUuYwppbmRleCAwZTc5NjY1Li5kM2QxY2ZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1tdmVidS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLW12ZWJ1LmMKQEAgLTEwMSw3ICsxMDEsOSBAQAogCXN0cnVjdCBtdmVidV9wY2llX3BvcnQgKnBvcnRzOwogCXN0cnVjdCBtc2lfY2hpcCAqbXNpOwogCXN0cnVjdCByZXNvdXJjZSBpbzsKKwljaGFyIGlvX25hbWVbMzBdOwogCXN0cnVjdCByZXNvdXJjZSByZWFsaW87CisJY2hhciBtZW1fbmFtZVszMF07CiAJc3RydWN0IHJlc291cmNlIG1lbTsKIAlzdHJ1Y3QgcmVzb3VyY2UgYnVzbjsKIAlpbnQgbnBvcnRzOwpAQCAtNjcyLDEwICs2NzQsMzAgQEAKIHsKIAlzdHJ1Y3QgbXZlYnVfcGNpZSAqcGNpZSA9IHN5c190b19wY2llKHN5cyk7CiAJaW50IGk7CisJaW50IGRvbWFpbiA9IDA7CiAKLQlpZiAocmVzb3VyY2Vfc2l6ZSgmcGNpZS0+cmVhbGlvKSAhPSAwKQorI2lmZGVmIENPTkZJR19QQ0lfRE9NQUlOUworCWRvbWFpbiA9IHN5cy0+ZG9tYWluOworI2VuZGlmCisKKwlzbnByaW50ZihwY2llLT5tZW1fbmFtZSwgc2l6ZW9mKHBjaWUtPm1lbV9uYW1lKSwgIlBDSSBNRU0gJTA0eCIsCisJCSBkb21haW4pOworCXBjaWUtPm1lbS5uYW1lID0gcGNpZS0+bWVtX25hbWU7CisKKwlzbnByaW50ZihwY2llLT5pb19uYW1lLCBzaXplb2YocGNpZS0+aW9fbmFtZSksICJQQ0kgSS9PICUwNHgiLCBkb21haW4pOworCXBjaWUtPnJlYWxpby5uYW1lID0gcGNpZS0+aW9fbmFtZTsKKworCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJnBjaWUtPm1lbSkpCisJCXJldHVybiAwOworCisJaWYgKHJlc291cmNlX3NpemUoJnBjaWUtPnJlYWxpbykgIT0gMCkgeworCQlpZiAocmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCAmcGNpZS0+cmVhbGlvKSkgeworCQkJcmVsZWFzZV9yZXNvdXJjZSgmcGNpZS0+bWVtKTsKKwkJCXJldHVybiAwOworCQl9CiAJCXBjaV9hZGRfcmVzb3VyY2Vfb2Zmc2V0KCZzeXMtPnJlc291cmNlcywgJnBjaWUtPnJlYWxpbywKIAkJCQkJc3lzLT5pb19vZmZzZXQpOworCX0KIAlwY2lfYWRkX3Jlc291cmNlX29mZnNldCgmc3lzLT5yZXNvdXJjZXMsICZwY2llLT5tZW0sIHN5cy0+bWVtX29mZnNldCk7CiAJcGNpX2FkZF9yZXNvdXJjZSgmc3lzLT5yZXNvdXJjZXMsICZwY2llLT5idXNuKTsKIApAQCAtNzk3LDcgKzgxOSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgbnJhbmdlczsgaSsrKSB7CiAJCXUzMiBmbGFncyA9IG9mX3JlYWRfbnVtYmVyKHJhbmdlLCAxKTsKLQkJdTMyIHNsb3QgPSBvZl9yZWFkX251bWJlcihyYW5nZSwgMik7CisJCXUzMiBzbG90ID0gb2ZfcmVhZF9udW1iZXIocmFuZ2UgKyAxLCAxKTsKIAkJdTY0IGNwdWFkZHIgPSBvZl9yZWFkX251bWJlcihyYW5nZSArIG5hLCBwbmEpOwogCQl1bnNpZ25lZCBsb25nIHJ0eXBlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1yY2FyLWdlbjIuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLXJjYXItZ2VuMi5jCmluZGV4IGNlZWMxNDcuLmZkM2UzYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLXJjYXItZ2VuMi5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLXJjYXItZ2VuMi5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpemVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAvKiBBSEItUENJIEJyaWRnZSBQQ0kgY29tbXVuaWNhdGlvbiByZWdpc3RlcnMgKi8KQEAgLTM5LDkgKzQwLDI2IEBACiAKICNkZWZpbmUgUkNBUl9QQ0lfSU5UX0VOQUJMRV9SRUcJCShSQ0FSX0FIQlBDSV9QQ0lDT01fT0ZGU0VUICsgMHgyMCkKICNkZWZpbmUgUkNBUl9QQ0lfSU5UX1NUQVRVU19SRUcJCShSQ0FSX0FIQlBDSV9QQ0lDT01fT0ZGU0VUICsgMHgyNCkKKyNkZWZpbmUgUkNBUl9QQ0lfSU5UX1NJR1RBQk9SVAkJKDEgPDwgMCkKKyNkZWZpbmUgUkNBUl9QQ0lfSU5UX1NJR1JFVEFCT1JUCSgxIDw8IDEpCisjZGVmaW5lIFJDQVJfUENJX0lOVF9SRU1BQk9SVAkJKDEgPDwgMikKKyNkZWZpbmUgUkNBUl9QQ0lfSU5UX1BFUlIJCSgxIDw8IDMpCisjZGVmaW5lIFJDQVJfUENJX0lOVF9TSUdTRVJSCQkoMSA8PCA0KQorI2RlZmluZSBSQ0FSX1BDSV9JTlRfUkVTRVJSCQkoMSA8PCA1KQorI2RlZmluZSBSQ0FSX1BDSV9JTlRfV0lOMUVSUgkJKDEgPDwgMTIpCisjZGVmaW5lIFJDQVJfUENJX0lOVF9XSU4yRVJSCQkoMSA8PCAxMykKICNkZWZpbmUgUkNBUl9QQ0lfSU5UX0EJCQkoMSA8PCAxNikKICNkZWZpbmUgUkNBUl9QQ0lfSU5UX0IJCQkoMSA8PCAxNykKICNkZWZpbmUgUkNBUl9QQ0lfSU5UX1BNRQkJKDEgPDwgMTkpCisjZGVmaW5lIFJDQVJfUENJX0lOVF9BTExFUlJPUlMgKFJDQVJfUENJX0lOVF9TSUdUQUJPUlQJCXwgXAorCQkJCVJDQVJfUENJX0lOVF9TSUdSRVRBQk9SVAl8IFwKKwkJCQlSQ0FSX1BDSV9JTlRfU0lHUkVUQUJPUlQJfCBcCisJCQkJUkNBUl9QQ0lfSU5UX1JFTUFCT1JUCQl8IFwKKwkJCQlSQ0FSX1BDSV9JTlRfUEVSUgkJfCBcCisJCQkJUkNBUl9QQ0lfSU5UX1NJR1NFUlIJCXwgXAorCQkJCVJDQVJfUENJX0lOVF9SRVNFUlIJCXwgXAorCQkJCVJDQVJfUENJX0lOVF9XSU4xRVJSCQl8IFwKKwkJCQlSQ0FSX1BDSV9JTlRfV0lOMkVSUikKIAogI2RlZmluZSBSQ0FSX0FIQl9CVVNfQ1RSX1JFRwkJKFJDQVJfQUhCUENJX1BDSUNPTV9PRkZTRVQgKyAweDMwKQogI2RlZmluZSBSQ0FSX0FIQl9CVVNfTU1PREVfSFRSQU5TCSgxIDw8IDApCkBAIC03NCw5ICs5Miw2IEBACiAKICNkZWZpbmUgUkNBUl9QQ0lfVU5JVF9SRVZfUkVHCQkoUkNBUl9BSEJQQ0lfUENJQ09NX09GRlNFVCArIDB4NDgpCiAKLS8qIE51bWJlciBvZiBpbnRlcm5hbCBQQ0kgY29udHJvbGxlcnMgKi8KLSNkZWZpbmUgUkNBUl9QQ0lfTlJfQ09OVFJPTExFUlMJCTMKLQogc3RydWN0IHJjYXJfcGNpX3ByaXYgewogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAl2b2lkIF9faW9tZW0gKnJlZzsKQEAgLTg0LDYgKzk5LDcgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgbWVtX3JlczsKIAlzdHJ1Y3QgcmVzb3VyY2UgKmNmZ19yZXM7CiAJaW50IGlycTsKKwl1bnNpZ25lZCBsb25nIHdpbmRvd19zaXplOwogfTsKIAogLyogUENJIGNvbmZpZ3VyYXRpb24gc3BhY2Ugb3BlcmF0aW9ucyAqLwpAQCAtMTAyLDYgKzExOCwxMCBAQAogCWlmIChzbG90ID4gMikKIAkJcmV0dXJuIE5VTEw7CiAKKwkvKiBicmlkZ2UgbG9naWMgb25seSBoYXMgcmVnaXN0ZXJzIHRvIDB4NDAgKi8KKwlpZiAoc2xvdCA9PSAweDAgJiYgd2hlcmUgPj0gMHg0MCkKKwkJcmV0dXJuIE5VTEw7CisKIAl2YWwgPSBzbG90ID8gUkNBUl9BSEJQQ0lfV0lOMV9ERVZJQ0UgfCBSQ0FSX0FIQlBDSV9XSU5fQ1RSX0NGRyA6CiAJCSAgICAgUkNBUl9BSEJQQ0lfV0lOMV9IT1NUIHwgUkNBUl9BSEJQQ0lfV0lOX0NUUl9DRkc7CiAKQEAgLTE1Niw3ICsxNzYsNyBAQAogfQogCiAvKiBQQ0kgaW50ZXJydXB0IG1hcHBpbmcgKi8KLXN0YXRpYyBpbnQgX19pbml0IHJjYXJfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCByY2FyX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMgPSBkZXYtPmJ1cy0+c3lzZGF0YTsKIAlzdHJ1Y3QgcmNhcl9wY2lfcHJpdiAqcHJpdiA9IHN5cy0+cHJpdmF0ZV9kYXRhOwpAQCAtMTY0LDggKzE4NCw0OCBAQAogCXJldHVybiBwcml2LT5pcnE7CiB9CiAKKyNpZmRlZiBDT05GSUdfUENJX0RFQlVHCisvKiBpZiBkZWJ1ZyBlbmFibGVkLCB0aGVuIGF0dGFjaCBhbiBlcnJvciBoYW5kbGVyIGlycSB0byB0aGUgYnJpZGdlICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCByY2FyX3BjaV9lcnJfaXJxKGludCBpcnEsIHZvaWQgKnB3KQoreworCXN0cnVjdCByY2FyX3BjaV9wcml2ICpwcml2ID0gcHc7CisJdTMyIHN0YXR1cyA9IGlvcmVhZDMyKHByaXYtPnJlZyArIFJDQVJfUENJX0lOVF9TVEFUVVNfUkVHKTsKKworCWlmIChzdGF0dXMgJiBSQ0FSX1BDSV9JTlRfQUxMRVJST1JTKSB7CisJCWRldl9lcnIocHJpdi0+ZGV2LCAiZXJyb3IgaXJxOiBzdGF0dXMgJTA4eFxuIiwgc3RhdHVzKTsKKworCQkvKiBjbGVhciB0aGUgZXJyb3IocykgKi8KKwkJaW93cml0ZTMyKHN0YXR1cyAmIFJDQVJfUENJX0lOVF9BTExFUlJPUlMsCisJCQkgIHByaXYtPnJlZyArIFJDQVJfUENJX0lOVF9TVEFUVVNfUkVHKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIHZvaWQgcmNhcl9wY2lfc2V0dXBfZXJyaXJxKHN0cnVjdCByY2FyX3BjaV9wcml2ICpwcml2KQoreworCWludCByZXQ7CisJdTMyIHZhbDsKKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEocHJpdi0+ZGV2LCBwcml2LT5pcnEsIHJjYXJfcGNpX2Vycl9pcnEsCisJCQkgICAgICAgSVJRRl9TSEFSRUQsICJlcnJvciBpcnEiLCBwcml2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIocHJpdi0+ZGV2LCAiY2Fubm90IGNsYWltIElSUSBmb3IgZXJyb3IgaGFuZGxpbmdcbiIpOworCQlyZXR1cm47CisJfQorCisJdmFsID0gaW9yZWFkMzIocHJpdi0+cmVnICsgUkNBUl9QQ0lfSU5UX0VOQUJMRV9SRUcpOworCXZhbCB8PSBSQ0FSX1BDSV9JTlRfQUxMRVJST1JTOworCWlvd3JpdGUzMih2YWwsIHByaXYtPnJlZyArIFJDQVJfUENJX0lOVF9FTkFCTEVfUkVHKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcmNhcl9wY2lfc2V0dXBfZXJyaXJxKHN0cnVjdCByY2FyX3BjaV9wcml2ICpwcml2KSB7IH0KKyNlbmRpZgorCiAvKiBQQ0kgaG9zdCBjb250cm9sbGVyIHNldHVwICovCi1zdGF0aWMgaW50IF9faW5pdCByY2FyX3BjaV9zZXR1cChpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cykKK3N0YXRpYyBpbnQgcmNhcl9wY2lfc2V0dXAoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCiB7CiAJc3RydWN0IHJjYXJfcGNpX3ByaXYgKnByaXYgPSBzeXMtPnByaXZhdGVfZGF0YTsKIAl2b2lkIF9faW9tZW0gKnJlZyA9IHByaXYtPnJlZzsKQEAgLTE4MywxMCArMjQzLDMxIEBACiAJaW93cml0ZTMyKHZhbCwgcmVnICsgUkNBUl9VU0JDVFJfUkVHKTsKIAl1ZGVsYXkoNCk7CiAKLQkvKiBEZS1hc3NlcnQgcmVzZXQgYW5kIHNldCBQQ0lBSEIgd2luZG93MSBzaXplIHRvIDFHQiAqLworCS8qIERlLWFzc2VydCByZXNldCBhbmQgcmVzZXQgUENJQUhCIHdpbmRvdzEgc2l6ZSAqLwogCXZhbCAmPSB+KFJDQVJfVVNCQ1RSX1BDSUFIQl9XSU4xX01BU0sgfCBSQ0FSX1VTQkNUUl9QQ0lDTEtfTUFTSyB8CiAJCSBSQ0FSX1VTQkNUUl9VU0JIX1JTVCB8IFJDQVJfVVNCQ1RSX1BMTF9SU1QpOwotCWlvd3JpdGUzMih2YWwgfCBSQ0FSX1VTQkNUUl9QQ0lBSEJfV0lOMV8xRywgcmVnICsgUkNBUl9VU0JDVFJfUkVHKTsKKworCS8qIFNldHVwIFBDSUFIQiB3aW5kb3cxIHNpemUgKi8KKwlzd2l0Y2ggKHByaXYtPndpbmRvd19zaXplKSB7CisJY2FzZSBTWl8yRzoKKwkJdmFsIHw9IFJDQVJfVVNCQ1RSX1BDSUFIQl9XSU4xXzJHOworCQlicmVhazsKKwljYXNlIFNaXzFHOgorCQl2YWwgfD0gUkNBUl9VU0JDVFJfUENJQUhCX1dJTjFfMUc7CisJCWJyZWFrOworCWNhc2UgU1pfNTEyTToKKwkJdmFsIHw9IFJDQVJfVVNCQ1RSX1BDSUFIQl9XSU4xXzUxMk07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX3dhcm4oInVua25vd24gd2luZG93IHNpemUgJWxkIC0gZGVmYXVsdGluZyB0byAyNTZNXG4iLAorCQkJcHJpdi0+d2luZG93X3NpemUpOworCQlwcml2LT53aW5kb3dfc2l6ZSA9IFNaXzI1Nk07CisJCS8qIGZhbGwtdGhyb3VnaCAqLworCWNhc2UgU1pfMjU2TToKKwkJdmFsIHw9IFJDQVJfVVNCQ1RSX1BDSUFIQl9XSU4xXzI1Nk07CisJCWJyZWFrOworCX0KKwlpb3dyaXRlMzIodmFsLCByZWcgKyBSQ0FSX1VTQkNUUl9SRUcpOwogCiAJLyogQ29uZmlndXJlIEFIQiBtYXN0ZXIgYW5kIHNsYXZlIG1vZGVzICovCiAJaW93cml0ZTMyKFJDQVJfQUhCX0JVU19NT0RFLCByZWcgKyBSQ0FSX0FIQl9CVVNfQ1RSX1JFRyk7CkBAIC0xOTcsNyArMjc4LDcgQEAKIAkgICAgICAgUkNBUl9QQ0lfQVJCSVRFUl9QQ0lCUF9NT0RFOwogCWlvd3JpdGUzMih2YWwsIHJlZyArIFJDQVJfUENJX0FSQklURVJfQ1RSX1JFRyk7CiAKLQkvKiBQQ0ktQUhCIG1hcHBpbmc6IDB4NDAwMDAwMDAtMHg4MDAwMDAwMCAqLworCS8qIFBDSS1BSEIgbWFwcGluZzogMHg0MDAwMDAwMCBiYXNlICovCiAJaW93cml0ZTMyKDB4NDAwMDAwMDAgfCBSQ0FSX1BDSUFIQl9QUkVGRVRDSDE2LAogCQkgIHJlZyArIFJDQVJfUENJQUhCX1dJTjFfQ1RSX1JFRyk7CiAKQEAgLTIyNCwxMCArMzA1LDE1IEBACiAJaW93cml0ZTMyKFJDQVJfUENJX0lOVF9BIHwgUkNBUl9QQ0lfSU5UX0IgfCBSQ0FSX1BDSV9JTlRfUE1FLAogCQkgIHJlZyArIFJDQVJfUENJX0lOVF9FTkFCTEVfUkVHKTsKIAorCWlmIChwcml2LT5pcnEgPiAwKQorCQlyY2FyX3BjaV9zZXR1cF9lcnJpcnEocHJpdik7CisKIAkvKiBBZGQgUENJIHJlc291cmNlcyAqLwogCXBjaV9hZGRfcmVzb3VyY2UoJnN5cy0+cmVzb3VyY2VzLCAmcHJpdi0+aW9fcmVzKTsKIAlwY2lfYWRkX3Jlc291cmNlKCZzeXMtPnJlc291cmNlcywgJnByaXYtPm1lbV9yZXMpOwogCisJLyogU2V0dXAgYnVzIG51bWJlciBiYXNlZCBvbiBwbGF0Zm9ybSBkZXZpY2UgaWQgKi8KKwlzeXMtPmJ1c25yID0gdG9fcGxhdGZvcm1fZGV2aWNlKHByaXYtPmRldiktPmlkOwogCXJldHVybiAxOwogfQogCkBAIC0yMzYsNDggKzMyMiwxMyBAQAogCS53cml0ZQk9IHJjYXJfcGNpX3dyaXRlX2NvbmZpZywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaHdfcGNpIHJjYXJfaHdfcGNpIF9faW5pdGRhdGEgPSB7Ci0JLm1hcF9pcnEJPSByY2FyX3BjaV9tYXBfaXJxLAotCS5vcHMJCT0gJnJjYXJfcGNpX29wcywKLQkuc2V0dXAJCT0gcmNhcl9wY2lfc2V0dXAsCi19OwotCi1zdGF0aWMgaW50IHJjYXJfcGNpX2NvdW50IF9faW5pdGRhdGE7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJjYXJfcGNpX2FkZF9jb250cm9sbGVyKHN0cnVjdCByY2FyX3BjaV9wcml2ICpwcml2KQotewotCXZvaWQgKipwcml2YXRlX2RhdGE7Ci0JaW50IGNvdW50OwotCi0JaWYgKHJjYXJfaHdfcGNpLm5yX2NvbnRyb2xsZXJzIDwgcmNhcl9wY2lfY291bnQpCi0JCWdvdG8gYWRkX3ByaXY7Ci0KLQkvKiAoUmUpYWxsb2NhdGUgcHJpdmF0ZSBkYXRhIHBvaW50ZXIgYXJyYXkgaWYgbmVlZGVkICovCi0JY291bnQgPSByY2FyX3BjaV9jb3VudCArIFJDQVJfUENJX05SX0NPTlRST0xMRVJTOwotCXByaXZhdGVfZGF0YSA9IGt6YWxsb2MoY291bnQgKiBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2YXRlX2RhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmNhcl9wY2lfY291bnQgPSBjb3VudDsKLQlpZiAocmNhcl9od19wY2kucHJpdmF0ZV9kYXRhKSB7Ci0JCW1lbWNweShwcml2YXRlX2RhdGEsIHJjYXJfaHdfcGNpLnByaXZhdGVfZGF0YSwKLQkJICAgICAgIHJjYXJfaHdfcGNpLm5yX2NvbnRyb2xsZXJzICogc2l6ZW9mKHZvaWQgKikpOwotCQlrZnJlZShyY2FyX2h3X3BjaS5wcml2YXRlX2RhdGEpOwotCX0KLQotCXJjYXJfaHdfcGNpLnByaXZhdGVfZGF0YSA9IHByaXZhdGVfZGF0YTsKLQotYWRkX3ByaXY6Ci0JLyogQWRkIHByaXZhdGUgZGF0YSBwb2ludGVyIHRvIHRoZSBhcnJheSAqLwotCXJjYXJfaHdfcGNpLnByaXZhdGVfZGF0YVtyY2FyX2h3X3BjaS5ucl9jb250cm9sbGVycysrXSA9IHByaXY7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJjYXJfcGNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IHJjYXJfcGNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHJlc291cmNlICpjZmdfcmVzLCAqbWVtX3JlczsKIAlzdHJ1Y3QgcmNhcl9wY2lfcHJpdiAqcHJpdjsKIAl2b2lkIF9faW9tZW0gKnJlZzsKKwlzdHJ1Y3QgaHdfcGNpIGh3OworCXZvaWQgKmh3X3ByaXZhdGVbMV07CiAKIAljZmdfcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlyZWcgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgY2ZnX3Jlcyk7CkBAIC0zMDgsMzEgKzM1OSwzNCBAQAogCXByaXYtPnJlZyA9IHJlZzsKIAlwcml2LT5kZXYgPSAmcGRldi0+ZGV2OwogCi0JcmV0dXJuIHJjYXJfcGNpX2FkZF9jb250cm9sbGVyKHByaXYpOworCWlmIChwcml2LT5pcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHZhbGlkIGlycSBmb3VuZFxuIik7CisJCXJldHVybiBwcml2LT5pcnE7CisJfQorCisJcHJpdi0+d2luZG93X3NpemUgPSBTWl8xRzsKKworCWh3X3ByaXZhdGVbMF0gPSBwcml2OworCW1lbXNldCgmaHcsIDAsIHNpemVvZihodykpOworCWh3Lm5yX2NvbnRyb2xsZXJzID0gQVJSQVlfU0laRShod19wcml2YXRlKTsKKwlody5wcml2YXRlX2RhdGEgPSBod19wcml2YXRlOworCWh3Lm1hcF9pcnEgPSByY2FyX3BjaV9tYXBfaXJxOworCWh3Lm9wcyA9ICZyY2FyX3BjaV9vcHM7CisJaHcuc2V0dXAgPSByY2FyX3BjaV9zZXR1cDsKKwlwY2lfY29tbW9uX2luaXRfZGV2KCZwZGV2LT5kZXYsICZodyk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJjYXJfcGNpX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJwY2ktcmNhci1nZW4yIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5zdXBwcmVzc19iaW5kX2F0dHJzID0gdHJ1ZSwKIAl9LAorCS5wcm9iZSA9IHJjYXJfcGNpX3Byb2JlLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgcmNhcl9wY2lfaW5pdCh2b2lkKQotewotCWludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnJjYXJfcGNpX2RyaXZlciwgcmNhcl9wY2lfcHJvYmUpOwotCWlmICghcmV0dmFsKQotCQlwY2lfY29tbW9uX2luaXQoJnJjYXJfaHdfcGNpKTsKLQotCS8qIFByaXZhdGUgZGF0YSBwb2ludGVyIGFycmF5IGlzIG5vdCBuZWVkZWQgYW55IG1vcmUgKi8KLQlrZnJlZShyY2FyX2h3X3BjaS5wcml2YXRlX2RhdGEpOwotCXJjYXJfaHdfcGNpLnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdWJzeXNfaW5pdGNhbGwocmNhcl9wY2lfaW5pdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHJjYXJfcGNpX2RyaXZlcik7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiUmVuZXNhcyBSLUNhciBHZW4yIGludGVybmFsIFBDSSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2llLWRlc2lnbndhcmUuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1kZXNpZ253YXJlLmMKaW5kZXggMTdjZTg4Zi4uNTA5YTI5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2llLWRlc2lnbndhcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtZGVzaWdud2FyZS5jCkBAIC0yOTQsMTQgKzI5NCwxMiBAQAogc3RhdGljIHZvaWQgY2xlYXJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJdW5zaWduZWQgaW50IHBvcywgbnZlYzsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAJc3RydWN0IG1zaV9kZXNjICptc2k7CiAJc3RydWN0IHBjaWVfcG9ydCAqcHA7CiAJc3RydWN0IGlycV9kYXRhICpkYXRhID0gaXJxX2dldF9pcnFfZGF0YShpcnEpOwogCiAJLyogZ2V0IHRoZSBwb3J0IHN0cnVjdHVyZSAqLwotCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwotCW1zaSA9IGlycV9kZXNjX2dldF9tc2lfZGVzYyhkZXNjKTsKKwltc2kgPSBpcnFfZGF0YV9nZXRfbXNpKGRhdGEpOwogCXBwID0gc3lzX3RvX3BjaWUobXNpLT5kZXYtPmJ1cy0+c3lzZGF0YSk7CiAJaWYgKCFwcCkgewogCQlCVUcoKTsKQEAgLTgwMCw3ICs3OTgsNyBAQAogCiAJLyogc2V0dXAgUkMgQkFScyAqLwogCWR3X3BjaWVfd3JpdGVsX3JjKHBwLCAweDAwMDAwMDA0LCBQQ0lfQkFTRV9BRERSRVNTXzApOwotCWR3X3BjaWVfd3JpdGVsX3JjKHBwLCAweDAwMDAwMDA0LCBQQ0lfQkFTRV9BRERSRVNTXzEpOworCWR3X3BjaWVfd3JpdGVsX3JjKHBwLCAweDAwMDAwMDAwLCBQQ0lfQkFTRV9BRERSRVNTXzEpOwogCiAJLyogc2V0dXAgaW50ZXJydXB0IHBpbnMgKi8KIAlkd19wY2llX3JlYWRsX3JjKHBwLCBQQ0lfSU5URVJSVVBUX0xJTkUsICZ2YWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaAppbmRleCBiNjE2MmJlLi4yYjg1OTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaAorKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaApAQCAtOTMsNyArOTMsNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgZnVuY3M7CQkvKiBvbmUgc2xvdCBtYXkgaGF2ZSBkaWZmZXJlbnQKIAkJCQkJICAgb2JqZWN0cyAoaS5lLiBmb3IgZWFjaCBmdW5jdGlvbikgKi8KIAlzdHJ1Y3Qgc2xvdCAqc2xvdDsKLQlzdHJ1Y3QgbXV0ZXggY3JpdF9zZWN0OwogCiAJdTgJCWRldmljZTsJCS8qIHBjaSBkZXZpY2UjICovCiAJdTMyCQlmbGFnczsJCS8qIHNlZSBiZWxvdyAqLwpAQCAtMTE3LDIwICsxMTYsMzAgQEAKIH07CiAKIHN0cnVjdCBhY3BpcGhwX2NvbnRleHQgewotCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlzdHJ1Y3QgYWNwaV9ob3RwbHVnX2NvbnRleHQgaHA7CiAJc3RydWN0IGFjcGlwaHBfZnVuYyBmdW5jOwogCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlOwogCXVuc2lnbmVkIGludCByZWZjb3VudDsKIH07CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGFjcGlwaHBfY29udGV4dCAqdG9fYWNwaXBocF9jb250ZXh0KHN0cnVjdCBhY3BpX2hvdHBsdWdfY29udGV4dCAqaHApCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihocCwgc3RydWN0IGFjcGlwaHBfY29udGV4dCwgaHApOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBhY3BpcGhwX2NvbnRleHQgKmZ1bmNfdG9fY29udGV4dChzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jKQogewogCXJldHVybiBjb250YWluZXJfb2YoZnVuYywgc3RydWN0IGFjcGlwaHBfY29udGV4dCwgZnVuYyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGFjcGlfZGV2aWNlICpmdW5jX3RvX2FjcGlfZGV2aWNlKHN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmMpCit7CisJcmV0dXJuIGZ1bmNfdG9fY29udGV4dChmdW5jKS0+aHAuc2VsZjsKK30KKwogc3RhdGljIGlubGluZSBhY3BpX2hhbmRsZSBmdW5jX3RvX2hhbmRsZShzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jKQogewotCXJldHVybiBmdW5jX3RvX2NvbnRleHQoZnVuYyktPmhhbmRsZTsKKwlyZXR1cm4gZnVuY190b19hY3BpX2RldmljZShmdW5jKS0+aGFuZGxlOwogfQogCiAvKgpAQCAtMTU4LDcgKzE2Nyw2IEBACiAKICNkZWZpbmUgRlVOQ19IQVNfU1RBCQkoMHgwMDAwMDAwMSkKICNkZWZpbmUgRlVOQ19IQVNfRUowCQkoMHgwMDAwMDAwMikKLSNkZWZpbmUgRlVOQ19IQVNfRENLICAgICAgICAgICAgKDB4MDAwMDAwMDQpCiAKIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKaW5kZXggN2M3YTM4OC4uYmNjYzI3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCkBAIC01OCw3MSArNTgsNTkgQEAKIAogc3RhdGljIExJU1RfSEVBRChicmlkZ2VfbGlzdCk7CiBzdGF0aWMgREVGSU5FX01VVEVYKGJyaWRnZV9tdXRleCk7Ci1zdGF0aWMgREVGSU5FX01VVEVYKGFjcGlwaHBfY29udGV4dF9sb2NrKTsKIAotc3RhdGljIHZvaWQgaGFuZGxlX2hvdHBsdWdfZXZlbnQoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgdHlwZSwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IGFjcGlwaHBfaG90cGx1Z19ub3RpZnkoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2LCB1MzIgdHlwZSk7CitzdGF0aWMgdm9pZCBhY3BpcGhwX3Bvc3RfZG9ja19maXh1cChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpOwogc3RhdGljIHZvaWQgYWNwaXBocF9zYW5pdGl6ZV9idXMoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiBzdGF0aWMgdm9pZCBhY3BpcGhwX3NldF9ocHBfdmFsdWVzKHN0cnVjdCBwY2lfYnVzICpidXMpOwotc3RhdGljIHZvaWQgaG90cGx1Z19ldmVudChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiB0eXBlLCB2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIGhvdHBsdWdfZXZlbnQodTMyIHR5cGUsIHN0cnVjdCBhY3BpcGhwX2NvbnRleHQgKmNvbnRleHQpOwogc3RhdGljIHZvaWQgZnJlZV9icmlkZ2Uoc3RydWN0IGtyZWYgKmtyZWYpOwogCi1zdGF0aWMgdm9pZCBhY3BpcGhwX2NvbnRleHRfaGFuZGxlcihhY3BpX2hhbmRsZSBoYW5kbGUsIHZvaWQgKmNvbnRleHQpCi17Ci0JLyogSW50ZW50aW9uYWxseSBlbXB0eS4gKi8KLX0KLQogLyoqCiAgKiBhY3BpcGhwX2luaXRfY29udGV4dCAtIENyZWF0ZSBob3RwbHVnIGNvbnRleHQgYW5kIGdyYWIgYSByZWZlcmVuY2UgdG8gaXQuCi0gKiBAaGFuZGxlOiBBQ1BJIG9iamVjdCBoYW5kbGUgdG8gY3JlYXRlIHRoZSBjb250ZXh0IGZvci4KKyAqIEBhZGV2OiBBQ1BJIGRldmljZSBvYmplY3QgdG8gY3JlYXRlIHRoZSBjb250ZXh0IGZvci4KICAqCi0gKiBDYWxsIHVuZGVyIGFjcGlwaHBfY29udGV4dF9sb2NrLgorICogQ2FsbCB1bmRlciBhY3BpX2hwX2NvbnRleHRfbG9jay4KICAqLwotc3RhdGljIHN0cnVjdCBhY3BpcGhwX2NvbnRleHQgKmFjcGlwaHBfaW5pdF9jb250ZXh0KGFjcGlfaGFuZGxlIGhhbmRsZSkKK3N0YXRpYyBzdHJ1Y3QgYWNwaXBocF9jb250ZXh0ICphY3BpcGhwX2luaXRfY29udGV4dChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpCiB7CiAJc3RydWN0IGFjcGlwaHBfY29udGV4dCAqY29udGV4dDsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAljb250ZXh0ID0ga3phbGxvYyhzaXplb2YoKmNvbnRleHQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNvbnRleHQpCiAJCXJldHVybiBOVUxMOwogCi0JY29udGV4dC0+aGFuZGxlID0gaGFuZGxlOwogCWNvbnRleHQtPnJlZmNvdW50ID0gMTsKLQlzdGF0dXMgPSBhY3BpX2F0dGFjaF9kYXRhKGhhbmRsZSwgYWNwaXBocF9jb250ZXh0X2hhbmRsZXIsIGNvbnRleHQpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlrZnJlZShjb250ZXh0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorCWFjcGlfc2V0X2hwX2NvbnRleHQoYWRldiwgJmNvbnRleHQtPmhwLCBhY3BpcGhwX2hvdHBsdWdfbm90aWZ5LCBOVUxMLAorCQkJICAgIGFjcGlwaHBfcG9zdF9kb2NrX2ZpeHVwKTsKIAlyZXR1cm4gY29udGV4dDsKIH0KIAogLyoqCiAgKiBhY3BpcGhwX2dldF9jb250ZXh0IC0gR2V0IGhvdHBsdWcgY29udGV4dCBhbmQgZ3JhYiBhIHJlZmVyZW5jZSB0byBpdC4KLSAqIEBoYW5kbGU6IEFDUEkgb2JqZWN0IGhhbmRsZSB0byBnZXQgdGhlIGNvbnRleHQgZm9yLgorICogQGFkZXY6IEFDUEkgZGV2aWNlIG9iamVjdCB0byBnZXQgdGhlIGNvbnRleHQgZm9yLgogICoKLSAqIENhbGwgdW5kZXIgYWNwaXBocF9jb250ZXh0X2xvY2suCisgKiBDYWxsIHVuZGVyIGFjcGlfaHBfY29udGV4dF9sb2NrLgogICovCi1zdGF0aWMgc3RydWN0IGFjcGlwaHBfY29udGV4dCAqYWNwaXBocF9nZXRfY29udGV4dChhY3BpX2hhbmRsZSBoYW5kbGUpCitzdGF0aWMgc3RydWN0IGFjcGlwaHBfY29udGV4dCAqYWNwaXBocF9nZXRfY29udGV4dChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpCiB7Ci0Jc3RydWN0IGFjcGlwaHBfY29udGV4dCAqY29udGV4dCA9IE5VTEw7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXZvaWQgKmRhdGE7CisJc3RydWN0IGFjcGlwaHBfY29udGV4dCAqY29udGV4dDsKIAotCXN0YXR1cyA9IGFjcGlfZ2V0X2RhdGEoaGFuZGxlLCBhY3BpcGhwX2NvbnRleHRfaGFuZGxlciwgJmRhdGEpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQljb250ZXh0ID0gZGF0YTsKLQkJY29udGV4dC0+cmVmY291bnQrKzsKLQl9CisJaWYgKCFhZGV2LT5ocCkKKwkJcmV0dXJuIE5VTEw7CisKKwljb250ZXh0ID0gdG9fYWNwaXBocF9jb250ZXh0KGFkZXYtPmhwKTsKKwljb250ZXh0LT5yZWZjb3VudCsrOwogCXJldHVybiBjb250ZXh0OwogfQogCiAvKioKICAqIGFjcGlwaHBfcHV0X2NvbnRleHQgLSBEcm9wIGEgcmVmZXJlbmNlIHRvIEFDUEkgaG90cGx1ZyBjb250ZXh0LgotICogQGhhbmRsZTogQUNQSSBvYmplY3QgaGFuZGxlIHRvIHB1dCB0aGUgY29udGV4dCBmb3IuCisgKiBAY29udGV4dDogQUNQSSBob3RwbHVnIGNvbnRleHQgdG8gZHJvcCBhIHJlZmVyZW5jZSB0by4KICAqCiAgKiBUaGUgY29udGV4dCBvYmplY3QgaXMgcmVtb3ZlZCBpZiB0aGVyZSBhcmUgbm8gbW9yZSByZWZlcmVuY2VzIHRvIGl0LgogICoKLSAqIENhbGwgdW5kZXIgYWNwaXBocF9jb250ZXh0X2xvY2suCisgKiBDYWxsIHVuZGVyIGFjcGlfaHBfY29udGV4dF9sb2NrLgogICovCiBzdGF0aWMgdm9pZCBhY3BpcGhwX3B1dF9jb250ZXh0KHN0cnVjdCBhY3BpcGhwX2NvbnRleHQgKmNvbnRleHQpCiB7CkBAIC0xMzAsNyArMTE4LDcgQEAKIAkJcmV0dXJuOwogCiAJV0FSTl9PTihjb250ZXh0LT5icmlkZ2UpOwotCWFjcGlfZGV0YWNoX2RhdGEoY29udGV4dC0+aGFuZGxlLCBhY3BpcGhwX2NvbnRleHRfaGFuZGxlcik7CisJY29udGV4dC0+aHAuc2VsZi0+aHAgPSBOVUxMOwogCWtmcmVlKGNvbnRleHQpOwogfQogCkBAIC0xNDQsNiArMTMyLDI3IEBACiAJa3JlZl9wdXQoJmJyaWRnZS0+cmVmLCBmcmVlX2JyaWRnZSk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgYWNwaXBocF9jb250ZXh0ICphY3BpcGhwX2dyYWJfY29udGV4dChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpCit7CisJc3RydWN0IGFjcGlwaHBfY29udGV4dCAqY29udGV4dDsKKworCWFjcGlfbG9ja19ocF9jb250ZXh0KCk7CisJY29udGV4dCA9IGFjcGlwaHBfZ2V0X2NvbnRleHQoYWRldik7CisJaWYgKCFjb250ZXh0IHx8IGNvbnRleHQtPmZ1bmMucGFyZW50LT5pc19nb2luZ19hd2F5KSB7CisJCWFjcGlfdW5sb2NrX2hwX2NvbnRleHQoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWdldF9icmlkZ2UoY29udGV4dC0+ZnVuYy5wYXJlbnQpOworCWFjcGlwaHBfcHV0X2NvbnRleHQoY29udGV4dCk7CisJYWNwaV91bmxvY2tfaHBfY29udGV4dCgpOworCXJldHVybiBjb250ZXh0OworfQorCitzdGF0aWMgdm9pZCBhY3BpcGhwX2xldF9jb250ZXh0X2dvKHN0cnVjdCBhY3BpcGhwX2NvbnRleHQgKmNvbnRleHQpCit7CisJcHV0X2JyaWRnZShjb250ZXh0LT5mdW5jLnBhcmVudCk7Cit9CisKIHN0YXRpYyB2b2lkIGZyZWVfYnJpZGdlKHN0cnVjdCBrcmVmICprcmVmKQogewogCXN0cnVjdCBhY3BpcGhwX2NvbnRleHQgKmNvbnRleHQ7CkBAIC0xNTEsNyArMTYwLDcgQEAKIAlzdHJ1Y3QgYWNwaXBocF9zbG90ICpzbG90LCAqbmV4dDsKIAlzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jLCAqdG1wOwogCi0JbXV0ZXhfbG9jaygmYWNwaXBocF9jb250ZXh0X2xvY2spOworCWFjcGlfbG9ja19ocF9jb250ZXh0KCk7CiAKIAlicmlkZ2UgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGFjcGlwaHBfYnJpZGdlLCByZWYpOwogCkBAIC0xNzUsMzEgKzE4NCwzMiBAQAogCXBjaV9kZXZfcHV0KGJyaWRnZS0+cGNpX2Rldik7CiAJa2ZyZWUoYnJpZGdlKTsKIAotCW11dGV4X3VubG9jaygmYWNwaXBocF9jb250ZXh0X2xvY2spOworCWFjcGlfdW5sb2NrX2hwX2NvbnRleHQoKTsKIH0KIAotLyoKLSAqIHRoZSBfRENLIG1ldGhvZCBjYW4gZG8gZnVubnkgdGhpbmdzLi4uIGFuZCBzb21ldGltZXMgbm90Ci0gKiBoYWgtaGFoIGZ1bm55LgorLyoqCisgKiBhY3BpcGhwX3Bvc3RfZG9ja19maXh1cCAtIFBvc3QtZG9jayBmaXh1cHMgZm9yIFBDSSBkZXZpY2VzLgorICogQGFkZXY6IEFDUEkgZGV2aWNlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIGEgUENJIGRldmljZS4KICAqCi0gKiBUQkQgLSBmaWd1cmUgb3V0IGEgd2F5IHRvIG9ubHkgY2FsbCBmaXh1cHMgZm9yCi0gKiBzeXN0ZW1zIHRoYXQgcmVxdWlyZSB0aGVtLgorICogVEJEIC0gZmlndXJlIG91dCBhIHdheSB0byBvbmx5IGNhbGwgZml4dXBzIGZvciBzeXN0ZW1zIHRoYXQgcmVxdWlyZSB0aGVtLgogICovCi1zdGF0aWMgdm9pZCBwb3N0X2RvY2tfZml4dXBzKGFjcGlfaGFuZGxlIG5vdF91c2VkLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBhY3BpcGhwX3Bvc3RfZG9ja19maXh1cChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpCiB7Ci0Jc3RydWN0IGFjcGlwaHBfY29udGV4dCAqY29udGV4dCA9IGRhdGE7Ci0Jc3RydWN0IHBjaV9idXMgKmJ1cyA9IGNvbnRleHQtPmZ1bmMuc2xvdC0+YnVzOworCXN0cnVjdCBhY3BpcGhwX2NvbnRleHQgKmNvbnRleHQgPSBhY3BpcGhwX2dyYWJfY29udGV4dChhZGV2KTsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwogCXUzMiBidXNlczsKIAotCWlmICghYnVzLT5zZWxmKQorCWlmICghY29udGV4dCkKIAkJcmV0dXJuOwogCisJYnVzID0gY29udGV4dC0+ZnVuYy5zbG90LT5idXM7CisJaWYgKCFidXMtPnNlbGYpCisJCWdvdG8gb3V0OworCiAJLyogZml4dXAgYmFkIF9EQ0sgZnVuY3Rpb24gdGhhdCByZXdyaXRlcwogCSAqIHNlY29uZGFyeSBicmlkZ2Ugb24gc2xvdAogCSAqLwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChidXMtPnNlbGYsCi0JCQlQQ0lfUFJJTUFSWV9CVVMsCi0JCQkmYnVzZXMpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChidXMtPnNlbGYsIFBDSV9QUklNQVJZX0JVUywgJmJ1c2VzKTsKIAogCWlmICgoKGJ1c2VzID4+IDgpICYgMHhmZikgIT0gYnVzLT5idXNuX3Jlcy5zdGFydCkgewogCQlidXNlcyA9IChidXNlcyAmIDB4ZmYwMDAwMDApCkBAIC0yMDgsMzMgKzIxOCwxMSBAQAogCQkJfCAoKHVuc2lnbmVkIGludCkoYnVzLT5idXNuX3Jlcy5lbmQpIDw8IDE2KTsKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChidXMtPnNlbGYsIFBDSV9QUklNQVJZX0JVUywgYnVzZXMpOwogCX0KKworIG91dDoKKwlhY3BpcGhwX2xldF9jb250ZXh0X2dvKGNvbnRleHQpOwogfQogCi1zdGF0aWMgdm9pZCBkb2NrX2V2ZW50KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIHR5cGUsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGFjcGlwaHBfY29udGV4dCAqY29udGV4dDsKLQotCW11dGV4X2xvY2soJmFjcGlwaHBfY29udGV4dF9sb2NrKTsKLQljb250ZXh0ID0gYWNwaXBocF9nZXRfY29udGV4dChoYW5kbGUpOwotCWlmICghY29udGV4dCB8fCBXQVJOX09OKGNvbnRleHQtPmhhbmRsZSAhPSBoYW5kbGUpCi0JICAgIHx8IGNvbnRleHQtPmZ1bmMucGFyZW50LT5pc19nb2luZ19hd2F5KSB7Ci0JCW11dGV4X3VubG9jaygmYWNwaXBocF9jb250ZXh0X2xvY2spOwotCQlyZXR1cm47Ci0JfQotCWdldF9icmlkZ2UoY29udGV4dC0+ZnVuYy5wYXJlbnQpOwotCWFjcGlwaHBfcHV0X2NvbnRleHQoY29udGV4dCk7Ci0JbXV0ZXhfdW5sb2NrKCZhY3BpcGhwX2NvbnRleHRfbG9jayk7Ci0KLQlob3RwbHVnX2V2ZW50KGhhbmRsZSwgdHlwZSwgZGF0YSk7Ci0KLQlwdXRfYnJpZGdlKGNvbnRleHQtPmZ1bmMucGFyZW50KTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RvY2tfb3BzIGFjcGlwaHBfZG9ja19vcHMgPSB7Ci0JLmZpeHVwID0gcG9zdF9kb2NrX2ZpeHVwcywKLQkuaGFuZGxlciA9IGRvY2tfZXZlbnQsCi19OwotCiAvKiBDaGVjayB3aGV0aGVyIHRoZSBQQ0kgZGV2aWNlIGlzIG1hbmFnZWQgYnkgbmF0aXZlIFBDSWUgaG90cGx1ZyBkcml2ZXIgKi8KIHN0YXRpYyBib29sIGRldmljZV9pc19tYW5hZ2VkX2J5X25hdGl2ZV9wY2llaHAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CkBAIC0yNjQsMjYgKzI1MiwxOSBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgdm9pZCBhY3BpcGhwX2RvY2tfaW5pdCh2b2lkICpkYXRhKQotewotCXN0cnVjdCBhY3BpcGhwX2NvbnRleHQgKmNvbnRleHQgPSBkYXRhOwotCi0JZ2V0X2JyaWRnZShjb250ZXh0LT5mdW5jLnBhcmVudCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjcGlwaHBfZG9ja19yZWxlYXNlKHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGFjcGlwaHBfY29udGV4dCAqY29udGV4dCA9IGRhdGE7Ci0KLQlwdXRfYnJpZGdlKGNvbnRleHQtPmZ1bmMucGFyZW50KTsKLX0KLQotLyogY2FsbGJhY2sgcm91dGluZSB0byByZWdpc3RlciBlYWNoIEFDUEkgUENJIHNsb3Qgb2JqZWN0ICovCi1zdGF0aWMgYWNwaV9zdGF0dXMgcmVnaXN0ZXJfc2xvdChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsdmwsIHZvaWQgKmRhdGEsCi0JCQkJIHZvaWQgKipydikKKy8qKgorICogYWNwaXBocF9hZGRfY29udGV4dCAtIEFkZCBBQ1BJUEhQIGNvbnRleHQgdG8gYW4gQUNQSSBkZXZpY2Ugb2JqZWN0LgorICogQGhhbmRsZTogQUNQSSBoYW5kbGUgb2YgdGhlIG9iamVjdCB0byBhZGQgYSBjb250ZXh0IHRvLgorICogQGx2bDogTm90IHVzZWQuCisgKiBAZGF0YTogVGhlIG9iamVjdCdzIHBhcmVudCBBQ1BJUEhQIGJyaWRnZS4KKyAqIEBydjogTm90IHVzZWQuCisgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpcGhwX2FkZF9jb250ZXh0KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGx2bCwgdm9pZCAqZGF0YSwKKwkJCQkgICAgICAgdm9pZCAqKnJ2KQogewogCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlID0gZGF0YTsKIAlzdHJ1Y3QgYWNwaXBocF9jb250ZXh0ICpjb250ZXh0OworCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldjsKIAlzdHJ1Y3QgYWNwaXBocF9zbG90ICpzbG90OwogCXN0cnVjdCBhY3BpcGhwX2Z1bmMgKm5ld2Z1bmM7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CkBAIC0yOTMsOSArMjc0LDYgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGJyaWRnZS0+cGNpX2RldjsKIAl1MzIgdmFsOwogCi0JaWYgKHBkZXYgJiYgZGV2aWNlX2lzX21hbmFnZWRfYnlfbmF0aXZlX3BjaWVocChwZGV2KSkKLQkJcmV0dXJuIEFFX09LOwotCiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9BRFIiLCBOVUxMLCAmYWRyKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJaWYgKHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpCkBAIC0zMDMsMzEgKzI4MSwzNCBAQAogCQkJCSJjYW4ndCBldmFsdWF0ZSBfQURSICglI3gpXG4iLCBzdGF0dXMpOwogCQlyZXR1cm4gQUVfT0s7CiAJfQorCWlmIChhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmFkZXYpKQorCQlyZXR1cm4gQUVfT0s7CiAKIAlkZXZpY2UgPSAoYWRyID4+IDE2KSAmIDB4ZmZmZjsKIAlmdW5jdGlvbiA9IGFkciAmIDB4ZmZmZjsKIAotCW11dGV4X2xvY2soJmFjcGlwaHBfY29udGV4dF9sb2NrKTsKLQljb250ZXh0ID0gYWNwaXBocF9pbml0X2NvbnRleHQoaGFuZGxlKTsKKwlhY3BpX2xvY2tfaHBfY29udGV4dCgpOworCWNvbnRleHQgPSBhY3BpcGhwX2luaXRfY29udGV4dChhZGV2KTsKIAlpZiAoIWNvbnRleHQpIHsKLQkJbXV0ZXhfdW5sb2NrKCZhY3BpcGhwX2NvbnRleHRfbG9jayk7CisJCWFjcGlfdW5sb2NrX2hwX2NvbnRleHQoKTsKIAkJYWNwaV9oYW5kbGVfZXJyKGhhbmRsZSwgIk5vIGhvdHBsdWcgY29udGV4dFxuIik7CiAJCXJldHVybiBBRV9OT1RfRVhJU1Q7CiAJfQogCW5ld2Z1bmMgPSAmY29udGV4dC0+ZnVuYzsKIAluZXdmdW5jLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOwogCW5ld2Z1bmMtPnBhcmVudCA9IGJyaWRnZTsKLQltdXRleF91bmxvY2soJmFjcGlwaHBfY29udGV4dF9sb2NrKTsKKwlhY3BpX3VubG9ja19ocF9jb250ZXh0KCk7CiAKLQlpZiAoYWNwaV9oYXNfbWV0aG9kKGhhbmRsZSwgIl9FSjAiKSkKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBkb2NrIGRldmljZSwgaXRzIF9FSjAgc2hvdWxkIGJlIGV4ZWN1dGVkIGJ5IHRoZSBkb2NrCisJICogbm90aWZ5IGhhbmRsZXIgYWZ0ZXIgY2FsbGluZyBfRENLLgorCSAqLworCWlmICghaXNfZG9ja19kZXZpY2UoYWRldikgJiYgYWNwaV9oYXNfbWV0aG9kKGhhbmRsZSwgIl9FSjAiKSkKIAkJbmV3ZnVuYy0+ZmxhZ3MgPSBGVU5DX0hBU19FSjA7CiAKIAlpZiAoYWNwaV9oYXNfbWV0aG9kKGhhbmRsZSwgIl9TVEEiKSkKIAkJbmV3ZnVuYy0+ZmxhZ3MgfD0gRlVOQ19IQVNfU1RBOwogCi0JaWYgKGFjcGlfaGFzX21ldGhvZChoYW5kbGUsICJfRENLIikpCi0JCW5ld2Z1bmMtPmZsYWdzIHw9IEZVTkNfSEFTX0RDSzsKLQogCS8qIHNlYXJjaCBmb3Igb2JqZWN0cyB0aGF0IHNoYXJlIHRoZSBzYW1lIHNsb3QgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNsb3QsICZicmlkZ2UtPnNsb3RzLCBub2RlKQogCQlpZiAoc2xvdC0+ZGV2aWNlID09IGRldmljZSkKQEAgLTMzNSwxOSArMzE2LDI2IEBACiAKIAlzbG90ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlwaHBfc2xvdCksIEdGUF9LRVJORUwpOwogCWlmICghc2xvdCkgewotCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCWdvdG8gZXJyOworCQlhY3BpX2xvY2tfaHBfY29udGV4dCgpOworCQlhY3BpcGhwX3B1dF9jb250ZXh0KGNvbnRleHQpOworCQlhY3BpX3VubG9ja19ocF9jb250ZXh0KCk7CisJCXJldHVybiBBRV9OT19NRU1PUlk7CiAJfQogCiAJc2xvdC0+YnVzID0gYnJpZGdlLT5wY2lfYnVzOwogCXNsb3QtPmRldmljZSA9IGRldmljZTsKIAlJTklUX0xJU1RfSEVBRCgmc2xvdC0+ZnVuY3MpOwotCW11dGV4X2luaXQoJnNsb3QtPmNyaXRfc2VjdCk7CiAKIAlsaXN0X2FkZF90YWlsKCZzbG90LT5ub2RlLCAmYnJpZGdlLT5zbG90cyk7CiAKLQkvKiBSZWdpc3RlciBzbG90cyBmb3IgZWplY3RhYmxlIGZ1bmN0aW9ucyBvbmx5LiAqLwotCWlmIChhY3BpX3BjaV9jaGVja19lamVjdGFibGUocGJ1cywgaGFuZGxlKSAgfHwgaXNfZG9ja19kZXZpY2UoaGFuZGxlKSkgeworCS8qCisJICogRXhwb3NlIHNsb3RzIHRvIHVzZXIgc3BhY2UgZm9yIGZ1bmN0aW9ucyB0aGF0IGhhdmUgX0VKMCBvciBfUk1WIG9yCisJICogYXJlIGxvY2F0ZWQgaW4gZG9jayBzdGF0aW9ucy4gIERvIG5vdCBleHBvc2UgdGhlbSBmb3IgZGV2aWNlcyBoYW5kbGVkCisJICogYnkgdGhlIG5hdGl2ZSBQQ0llIGhvdHBsdWcgKFBDSWVIUCksIGJlY3Vhc2UgdGhhdCBjb2RlIGlzIHN1cHBvc2VkIHRvCisJICogZXhwb3NlIHNsb3RzIHRvIHVzZXIgc3BhY2UgaW4gdGhvc2UgY2FzZXMuCisJICovCisJaWYgKChhY3BpX3BjaV9jaGVja19lamVjdGFibGUocGJ1cywgaGFuZGxlKSB8fCBpc19kb2NrX2RldmljZShhZGV2KSkKKwkgICAgJiYgIShwZGV2ICYmIGRldmljZV9pc19tYW5hZ2VkX2J5X25hdGl2ZV9wY2llaHAocGRldikpKSB7CiAJCXVuc2lnbmVkIGxvbmcgbG9uZyBzdW47CiAJCWludCByZXR2YWw7CiAKQEAgLTM4MSw0NCArMzY5LDE2IEBACiAJCQkJICAgICAgICZ2YWwsIDYwKjEwMDApKQogCQlzbG90LT5mbGFncyB8PSBTTE9UX0VOQUJMRUQ7CiAKLQlpZiAoaXNfZG9ja19kZXZpY2UoaGFuZGxlKSkgewotCQkvKiB3ZSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBkZXZpY2UncyBfRUowCi0JCSAqIGJlY2F1c2Ugd2Ugd2FudCB0aGUgZG9jayBub3RpZnkgaGFuZGxlcgotCQkgKiB0byBjYWxsIGl0IGFmdGVyIGl0IGNhbGxzIF9EQ0sKLQkJICovCi0JCW5ld2Z1bmMtPmZsYWdzICY9IH5GVU5DX0hBU19FSjA7Ci0JCWlmIChyZWdpc3Rlcl9ob3RwbHVnX2RvY2tfZGV2aWNlKGhhbmRsZSwKLQkJCSZhY3BpcGhwX2RvY2tfb3BzLCBjb250ZXh0LAotCQkJYWNwaXBocF9kb2NrX2luaXQsIGFjcGlwaHBfZG9ja19yZWxlYXNlKSkKLQkJCXByX2RlYnVnKCJmYWlsZWQgdG8gcmVnaXN0ZXIgZG9jayBkZXZpY2VcbiIpOwotCX0KLQotCS8qIGluc3RhbGwgbm90aWZ5IGhhbmRsZXIgKi8KLQlpZiAoIShuZXdmdW5jLT5mbGFncyAmIEZVTkNfSEFTX0RDSykpIHsKLQkJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGhhbmRsZSwgQUNQSV9TWVNURU1fTk9USUZZLAotCQkJCQkJICAgICBoYW5kbGVfaG90cGx1Z19ldmVudCwKLQkJCQkJCSAgICAgY29udGV4dCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJCWFjcGlfaGFuZGxlX2VycihoYW5kbGUsCi0JCQkJCSJmYWlsZWQgdG8gaW5zdGFsbCBub3RpZnkgaGFuZGxlclxuIik7Ci0JfQotCiAJcmV0dXJuIEFFX09LOwotCi0gZXJyOgotCW11dGV4X2xvY2soJmFjcGlwaHBfY29udGV4dF9sb2NrKTsKLQlhY3BpcGhwX3B1dF9jb250ZXh0KGNvbnRleHQpOwotCW11dGV4X3VubG9jaygmYWNwaXBocF9jb250ZXh0X2xvY2spOwotCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYWNwaXBocF9icmlkZ2UgKmFjcGlwaHBfaGFuZGxlX3RvX2JyaWRnZShhY3BpX2hhbmRsZSBoYW5kbGUpCitzdGF0aWMgc3RydWN0IGFjcGlwaHBfYnJpZGdlICphY3BpcGhwX2Rldl90b19icmlkZ2Uoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KQogewogCXN0cnVjdCBhY3BpcGhwX2NvbnRleHQgKmNvbnRleHQ7CiAJc3RydWN0IGFjcGlwaHBfYnJpZGdlICpicmlkZ2UgPSBOVUxMOwogCi0JbXV0ZXhfbG9jaygmYWNwaXBocF9jb250ZXh0X2xvY2spOwotCWNvbnRleHQgPSBhY3BpcGhwX2dldF9jb250ZXh0KGhhbmRsZSk7CisJYWNwaV9sb2NrX2hwX2NvbnRleHQoKTsKKwljb250ZXh0ID0gYWNwaXBocF9nZXRfY29udGV4dChhZGV2KTsKIAlpZiAoY29udGV4dCkgewogCQlicmlkZ2UgPSBjb250ZXh0LT5icmlkZ2U7CiAJCWlmIChicmlkZ2UpCkBAIC00MjYsNyArMzg2LDcgQEAKIAogCQlhY3BpcGhwX3B1dF9jb250ZXh0KGNvbnRleHQpOwogCX0KLQltdXRleF91bmxvY2soJmFjcGlwaHBfY29udGV4dF9sb2NrKTsKKwlhY3BpX3VubG9ja19ocF9jb250ZXh0KCk7CiAJcmV0dXJuIGJyaWRnZTsKIH0KIApAQCAtNDM0LDIyICszOTQsMTUgQEAKIHsKIAlzdHJ1Y3QgYWNwaXBocF9zbG90ICpzbG90OwogCXN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmM7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzbG90LCAmYnJpZGdlLT5zbG90cywgbm9kZSkgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZ1bmMsICZzbG90LT5mdW5jcywgc2libGluZykgewotCQkJYWNwaV9oYW5kbGUgaGFuZGxlID0gZnVuY190b19oYW5kbGUoZnVuYyk7CisJCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYgPSBmdW5jX3RvX2FjcGlfZGV2aWNlKGZ1bmMpOwogCi0JCQlpZiAoaXNfZG9ja19kZXZpY2UoaGFuZGxlKSkKLQkJCQl1bnJlZ2lzdGVyX2hvdHBsdWdfZG9ja19kZXZpY2UoaGFuZGxlKTsKLQotCQkJaWYgKCEoZnVuYy0+ZmxhZ3MgJiBGVU5DX0hBU19EQ0spKSB7Ci0JCQkJc3RhdHVzID0gYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoaGFuZGxlLAotCQkJCQkJCUFDUElfU1lTVEVNX05PVElGWSwKLQkJCQkJCQloYW5kbGVfaG90cGx1Z19ldmVudCk7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQkJCQlwcl9lcnIoImZhaWxlZCB0byByZW1vdmUgbm90aWZ5IGhhbmRsZXJcbiIpOwotCQkJfQorCQkJYWNwaV9sb2NrX2hwX2NvbnRleHQoKTsKKwkJCWFkZXYtPmhwLT5ub3RpZnkgPSBOVUxMOworCQkJYWRldi0+aHAtPmZpeHVwID0gTlVMTDsKKwkJCWFjcGlfdW5sb2NrX2hwX2NvbnRleHQoKTsKIAkJfQogCQlzbG90LT5mbGFncyB8PSBTTE9UX0lTX0dPSU5HX0FXQVk7CiAJCWlmIChzbG90LT5zbG90KQpAQCAtNDYwLDkgKzQxMyw5IEBACiAJbGlzdF9kZWwoJmJyaWRnZS0+bGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZicmlkZ2VfbXV0ZXgpOwogCi0JbXV0ZXhfbG9jaygmYWNwaXBocF9jb250ZXh0X2xvY2spOworCWFjcGlfbG9ja19ocF9jb250ZXh0KCk7CiAJYnJpZGdlLT5pc19nb2luZ19hd2F5ID0gdHJ1ZTsKLQltdXRleF91bmxvY2soJmFjcGlwaHBfY29udGV4dF9sb2NrKTsKKwlhY3BpX3VubG9ja19ocF9jb250ZXh0KCk7CiB9CiAKIC8qKgpAQCAtNDcxLDcgKzQyNCw3IEBACiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGFjcGlwaHBfbWF4X2J1c25yKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXN0cnVjdCBwY2lfYnVzICp0bXA7CiAJdW5zaWduZWQgY2hhciBtYXgsIG47CiAKIAkvKgpAQCAtNDg0LDQxICs0MzcsMTQgQEAKIAkgKi8KIAltYXggPSBidXMtPmJ1c25fcmVzLnN0YXJ0OwogCi0JbGlzdF9mb3JfZWFjaCh0bXAsICZidXMtPmNoaWxkcmVuKSB7Ci0JCW4gPSBwY2lfYnVzX21heF9idXNucihwY2lfYnVzX2IodG1wKSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZidXMtPmNoaWxkcmVuLCBub2RlKSB7CisJCW4gPSBwY2lfYnVzX21heF9idXNucih0bXApOwogCQlpZiAobiA+IG1heCkKIAkJCW1heCA9IG47CiAJfQogCXJldHVybiBtYXg7CiB9CiAKLS8qKgotICogYWNwaXBocF9idXNfdHJpbSAtIFRyaW0gZGV2aWNlIG9iamVjdHMgaW4gYW4gQUNQSSBuYW1lc3BhY2Ugc3VidHJlZS4KLSAqIEBoYW5kbGU6IEFDUEkgZGV2aWNlIG9iamVjdCBoYW5kbGUgdG8gc3RhcnQgZnJvbS4KLSAqLwotc3RhdGljIHZvaWQgYWNwaXBocF9idXNfdHJpbShhY3BpX2hhbmRsZSBoYW5kbGUpCi17Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICphZGV2ID0gTlVMTDsKLQotCWFjcGlfYnVzX2dldF9kZXZpY2UoaGFuZGxlLCAmYWRldik7Ci0JaWYgKGFkZXYpCi0JCWFjcGlfYnVzX3RyaW0oYWRldik7Ci19Ci0KLS8qKgotICogYWNwaXBocF9idXNfYWRkIC0gU2NhbiBBQ1BJIG5hbWVzcGFjZSBzdWJ0cmVlLgotICogQGhhbmRsZTogQUNQSSBvYmplY3QgaGFuZGxlIHRvIHN0YXJ0IHRoZSBzY2FuIGZyb20uCi0gKi8KLXN0YXRpYyB2b2lkIGFjcGlwaHBfYnVzX2FkZChhY3BpX2hhbmRsZSBoYW5kbGUpCi17Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICphZGV2ID0gTlVMTDsKLQotCWFjcGlfYnVzX3NjYW4oaGFuZGxlKTsKLQlhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmFkZXYpOwotCWlmIChhY3BpX2RldmljZV9lbnVtZXJhdGVkKGFkZXYpKQotCQlhY3BpX2RldmljZV9zZXRfcG93ZXIoYWRldiwgQUNQSV9TVEFURV9EMCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGFjcGlwaHBfc2V0X2FjcGlfcmVnaW9uKHN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3QpCiB7CiAJc3RydWN0IGFjcGlwaHBfZnVuYyAqZnVuYzsKQEAgLTU1OCw5ICs0ODQsMTMgQEAKIHsKIAlzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShmdW5jLCAmc2xvdC0+ZnVuY3MsIHNpYmxpbmcpCi0JCWFjcGlwaHBfYnVzX2FkZChmdW5jX3RvX2hhbmRsZShmdW5jKSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmdW5jLCAmc2xvdC0+ZnVuY3MsIHNpYmxpbmcpIHsKKwkJc3RydWN0IGFjcGlfZGV2aWNlICphZGV2ID0gZnVuY190b19hY3BpX2RldmljZShmdW5jKTsKIAorCQlhY3BpX2J1c19zY2FuKGFkZXYtPmhhbmRsZSk7CisJCWlmIChhY3BpX2RldmljZV9lbnVtZXJhdGVkKGFkZXYpKQorCQkJYWNwaV9kZXZpY2Vfc2V0X3Bvd2VyKGFkZXYsIEFDUElfU1RBVEVfRDApOworCX0KIAlyZXR1cm4gcGNpX3NjYW5fc2xvdChzbG90LT5idXMsIFBDSV9ERVZGTihzbG90LT5kZXZpY2UsIDApKTsKIH0KIApAQCAtNjI1LDMyICs1NTUsMTUgQEAKIAl9CiB9CiAKLS8qIHJldHVybiBmaXJzdCBkZXZpY2UgaW4gc2xvdCwgYWNxdWlyaW5nIGEgcmVmZXJlbmNlIG9uIGl0ICovCi1zdGF0aWMgc3RydWN0IHBjaV9kZXYgKmRldl9pbl9zbG90KHN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3QpCi17Ci0Jc3RydWN0IHBjaV9idXMgKmJ1cyA9IHNsb3QtPmJ1czsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2OwotCXN0cnVjdCBwY2lfZGV2ICpyZXQgPSBOVUxMOwotCi0JZG93bl9yZWFkKCZwY2lfYnVzX3NlbSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KQotCQlpZiAoUENJX1NMT1QoZGV2LT5kZXZmbikgPT0gc2xvdC0+ZGV2aWNlKSB7Ci0JCQlyZXQgPSBwY2lfZGV2X2dldChkZXYpOwotCQkJYnJlYWs7Ci0JCX0KLQl1cF9yZWFkKCZwY2lfYnVzX3NlbSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCiAvKioKICAqIGRpc2FibGVfc2xvdCAtIGRpc2FibGUgYSBzbG90CiAgKiBAc2xvdDogQUNQSSBQSFAgc2xvdAogICovCiBzdGF0aWMgdm9pZCBkaXNhYmxlX3Nsb3Qoc3RydWN0IGFjcGlwaHBfc2xvdCAqc2xvdCkKIHsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gc2xvdC0+YnVzOworCXN0cnVjdCBwY2lfZGV2ICpkZXYsICpwcmV2OwogCXN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmM7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7CiAKIAkvKgogCSAqIGVuYWJsZV9zbG90KCkgZW51bWVyYXRlcyBhbGwgZnVuY3Rpb25zIGluIHRoaXMgZGV2aWNlIHZpYQpAQCAtNjU4LDIyICs1NzEsMTggQEAKIAkgKiBtZXRob2RzIChfRUowLCBldGMuKSBvciBub3QuICBUaGVyZWZvcmUsIHdlIHJlbW92ZSBhbGwgZnVuY3Rpb25zCiAJICogaGVyZS4KIAkgKi8KLQl3aGlsZSAoKHBkZXYgPSBkZXZfaW5fc2xvdChzbG90KSkpIHsKLQkJcGNpX3N0b3BfYW5kX3JlbW92ZV9idXNfZGV2aWNlKHBkZXYpOwotCQlwY2lfZGV2X3B1dChwZGV2KTsKLQl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UoZGV2LCBwcmV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkKKwkJaWYgKFBDSV9TTE9UKGRldi0+ZGV2Zm4pID09IHNsb3QtPmRldmljZSkKKwkJCXBjaV9zdG9wX2FuZF9yZW1vdmVfYnVzX2RldmljZShkZXYpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmdW5jLCAmc2xvdC0+ZnVuY3MsIHNpYmxpbmcpCi0JCWFjcGlwaHBfYnVzX3RyaW0oZnVuY190b19oYW5kbGUoZnVuYykpOworCQlhY3BpX2J1c190cmltKGZ1bmNfdG9fYWNwaV9kZXZpY2UoZnVuYykpOwogCiAJc2xvdC0+ZmxhZ3MgJj0gKH5TTE9UX0VOQUJMRUQpOwogfQogCi1zdGF0aWMgYm9vbCBhY3BpcGhwX25vX2hvdHBsdWcoYWNwaV9oYW5kbGUgaGFuZGxlKQorc3RhdGljIGJvb2wgYWNwaXBocF9ub19ob3RwbHVnKHN0cnVjdCBhY3BpX2RldmljZSAqYWRldikKIHsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYgPSBOVUxMOwotCi0JYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZhZGV2KTsKIAlyZXR1cm4gYWRldiAmJiBhZGV2LT5mbGFncy5ub19ob3RwbHVnOwogfQogCkBAIC02ODIsNyArNTkxLDcgQEAKIAlzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmdW5jLCAmc2xvdC0+ZnVuY3MsIHNpYmxpbmcpCi0JCWlmIChhY3BpcGhwX25vX2hvdHBsdWcoZnVuY190b19oYW5kbGUoZnVuYykpKQorCQlpZiAoYWNwaXBocF9ub19ob3RwbHVnKGZ1bmNfdG9fYWNwaV9kZXZpY2UoZnVuYykpKQogCQkJcmV0dXJuIHRydWU7CiAKIAlyZXR1cm4gZmFsc2U7CkBAIC03NDcsMjggKzY1NiwyNSBAQAogICovCiBzdGF0aWMgdm9pZCB0cmltX3N0YWxlX2RldmljZXMoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlhY3BpX2hhbmRsZSBoYW5kbGUgPSBBQ1BJX0hBTkRMRSgmZGV2LT5kZXYpOworCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiA9IEFDUElfQ09NUEFOSU9OKCZkZXYtPmRldik7CiAJc3RydWN0IHBjaV9idXMgKmJ1cyA9IGRldi0+c3Vib3JkaW5hdGU7CiAJYm9vbCBhbGl2ZSA9IGZhbHNlOwogCi0JaWYgKGhhbmRsZSkgeworCWlmIChhZGV2KSB7CiAJCWFjcGlfc3RhdHVzIHN0YXR1czsKIAkJdW5zaWduZWQgbG9uZyBsb25nIHN0YTsKIAotCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX1NUQSIsIE5VTEwsICZzdGEpOworCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoYWRldi0+aGFuZGxlLCAiX1NUQSIsIE5VTEwsICZzdGEpOwogCQlhbGl2ZSA9IChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJiBkZXZpY2Vfc3RhdHVzX3ZhbGlkKHN0YSkpCi0JCQl8fCBhY3BpcGhwX25vX2hvdHBsdWcoaGFuZGxlKTsKKwkJCXx8IGFjcGlwaHBfbm9faG90cGx1ZyhhZGV2KTsKIAl9Ci0JaWYgKCFhbGl2ZSkgewotCQl1MzIgdjsKKwlpZiAoIWFsaXZlKQorCQlhbGl2ZSA9IHBjaV9kZXZpY2VfaXNfcHJlc2VudChkZXYpOwogCi0JCS8qIENoZWNrIGlmIHRoZSBkZXZpY2UgcmVzcG9uZHMuICovCi0JCWFsaXZlID0gcGNpX2J1c19yZWFkX2Rldl92ZW5kb3JfaWQoZGV2LT5idXMsIGRldi0+ZGV2Zm4sICZ2LCAwKTsKLQl9CiAJaWYgKCFhbGl2ZSkgewogCQlwY2lfc3RvcF9hbmRfcmVtb3ZlX2J1c19kZXZpY2UoZGV2KTsKLQkJaWYgKGhhbmRsZSkKLQkJCWFjcGlwaHBfYnVzX3RyaW0oaGFuZGxlKTsKKwkJaWYgKGFkZXYpCisJCQlhY3BpX2J1c190cmltKGFkZXYpOwogCX0gZWxzZSBpZiAoYnVzKSB7CiAJCXN0cnVjdCBwY2lfZGV2ICpjaGlsZCwgKnRtcDsKIApAQCAtODAwLDcgKzcwNiw2IEBACiAJCXN0cnVjdCBwY2lfYnVzICpidXMgPSBzbG90LT5idXM7CiAJCXN0cnVjdCBwY2lfZGV2ICpkZXYsICp0bXA7CiAKLQkJbXV0ZXhfbG9jaygmc2xvdC0+Y3JpdF9zZWN0KTsKIAkJaWYgKHNsb3Rfbm9faG90cGx1ZyhzbG90KSkgewogCQkJOyAvKiBkbyBub3RoaW5nICovCiAJCX0gZWxzZSBpZiAoZGV2aWNlX3N0YXR1c192YWxpZChnZXRfc2xvdF9zdGF0dXMoc2xvdCkpKSB7CkBAIC04MTUsNyArNzIwLDYgQEAKIAkJfSBlbHNlIHsKIAkJCWRpc2FibGVfc2xvdChzbG90KTsKIAkJfQotCQltdXRleF91bmxvY2soJnNsb3QtPmNyaXRfc2VjdCk7CiAJfQogfQogCkBAIC04NTUsMTEgKzc1OSwxMSBAQAogICogQUNQSSBldmVudCBoYW5kbGVycwogICovCiAKLXZvaWQgYWNwaXBocF9jaGVja19ob3N0X2JyaWRnZShhY3BpX2hhbmRsZSBoYW5kbGUpCit2b2lkIGFjcGlwaHBfY2hlY2tfaG9zdF9icmlkZ2Uoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KQogewogCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlOwogCi0JYnJpZGdlID0gYWNwaXBocF9oYW5kbGVfdG9fYnJpZGdlKGhhbmRsZSk7CisJYnJpZGdlID0gYWNwaXBocF9kZXZfdG9fYnJpZGdlKGFkZXYpOwogCWlmIChicmlkZ2UpIHsKIAkJcGNpX2xvY2tfcmVzY2FuX3JlbW92ZSgpOwogCkBAIC04NzIsNzMgKzc3Niw1MiBAQAogCiBzdGF0aWMgaW50IGFjcGlwaHBfZGlzYWJsZV9hbmRfZWplY3Rfc2xvdChzdHJ1Y3QgYWNwaXBocF9zbG90ICpzbG90KTsKIAotc3RhdGljIHZvaWQgaG90cGx1Z19ldmVudChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiB0eXBlLCB2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgaG90cGx1Z19ldmVudCh1MzIgdHlwZSwgc3RydWN0IGFjcGlwaHBfY29udGV4dCAqY29udGV4dCkKIHsKLQlzdHJ1Y3QgYWNwaXBocF9jb250ZXh0ICpjb250ZXh0ID0gZGF0YTsKKwlhY3BpX2hhbmRsZSBoYW5kbGUgPSBjb250ZXh0LT5ocC5zZWxmLT5oYW5kbGU7CiAJc3RydWN0IGFjcGlwaHBfZnVuYyAqZnVuYyA9ICZjb250ZXh0LT5mdW5jOworCXN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3QgPSBmdW5jLT5zbG90OwogCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlOwotCWNoYXIgb2JqbmFtZVs2NF07Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgLmxlbmd0aCA9IHNpemVvZihvYmpuYW1lKSwKLQkJCQkgICAgICAucG9pbnRlciA9IG9iam5hbWUgfTsKIAotCW11dGV4X2xvY2soJmFjcGlwaHBfY29udGV4dF9sb2NrKTsKKwlhY3BpX2xvY2tfaHBfY29udGV4dCgpOwogCWJyaWRnZSA9IGNvbnRleHQtPmJyaWRnZTsKIAlpZiAoYnJpZGdlKQogCQlnZXRfYnJpZGdlKGJyaWRnZSk7CiAKLQltdXRleF91bmxvY2soJmFjcGlwaHBfY29udGV4dF9sb2NrKTsKKwlhY3BpX3VubG9ja19ocF9jb250ZXh0KCk7CiAKIAlwY2lfbG9ja19yZXNjYW5fcmVtb3ZlKCk7Ci0JYWNwaV9nZXRfbmFtZShoYW5kbGUsIEFDUElfRlVMTF9QQVRITkFNRSwgJmJ1ZmZlcik7CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIEFDUElfTk9USUZZX0JVU19DSEVDSzoKIAkJLyogYnVzIHJlLWVudW1lcmF0ZSAqLwotCQlwcl9kZWJ1ZygiJXM6IEJ1cyBjaGVjayBub3RpZnkgb24gJXNcbiIsIF9fZnVuY19fLCBvYmpuYW1lKTsKLQkJcHJfZGVidWcoIiVzOiByZS1lbnVtZXJhdGluZyBzbG90cyB1bmRlciAlc1xuIiwKLQkJCSBfX2Z1bmNfXywgb2JqbmFtZSk7Ci0JCWlmIChicmlkZ2UpIHsKKwkJYWNwaV9oYW5kbGVfZGVidWcoaGFuZGxlLCAiQnVzIGNoZWNrIGluICVzKClcbiIsIF9fZnVuY19fKTsKKwkJaWYgKGJyaWRnZSkKIAkJCWFjcGlwaHBfY2hlY2tfYnJpZGdlKGJyaWRnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ1Y3QgYWNwaXBocF9zbG90ICpzbG90ID0gZnVuYy0+c2xvdDsKLQotCQkJaWYgKHNsb3QtPmZsYWdzICYgU0xPVF9JU19HT0lOR19BV0FZKQotCQkJCWJyZWFrOwotCi0JCQltdXRleF9sb2NrKCZzbG90LT5jcml0X3NlY3QpOworCQllbHNlIGlmICghKHNsb3QtPmZsYWdzICYgU0xPVF9JU19HT0lOR19BV0FZKSkKIAkJCWVuYWJsZV9zbG90KHNsb3QpOwotCQkJbXV0ZXhfdW5sb2NrKCZzbG90LT5jcml0X3NlY3QpOwotCQl9CisKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfTk9USUZZX0RFVklDRV9DSEVDSzoKIAkJLyogZGV2aWNlIGNoZWNrICovCi0JCXByX2RlYnVnKCIlczogRGV2aWNlIGNoZWNrIG5vdGlmeSBvbiAlc1xuIiwgX19mdW5jX18sIG9iam5hbWUpOworCQlhY3BpX2hhbmRsZV9kZWJ1ZyhoYW5kbGUsICJEZXZpY2UgY2hlY2sgaW4gJXMoKVxuIiwgX19mdW5jX18pOwogCQlpZiAoYnJpZGdlKSB7CiAJCQlhY3BpcGhwX2NoZWNrX2JyaWRnZShicmlkZ2UpOwotCQl9IGVsc2UgewotCQkJc3RydWN0IGFjcGlwaHBfc2xvdCAqc2xvdCA9IGZ1bmMtPnNsb3Q7Ci0JCQlpbnQgcmV0OwotCi0JCQlpZiAoc2xvdC0+ZmxhZ3MgJiBTTE9UX0lTX0dPSU5HX0FXQVkpCi0JCQkJYnJlYWs7Ci0KKwkJfSBlbHNlIGlmICghKHNsb3QtPmZsYWdzICYgU0xPVF9JU19HT0lOR19BV0FZKSkgewogCQkJLyoKIAkJCSAqIENoZWNrIGlmIGFueXRoaW5nIGhhcyBjaGFuZ2VkIGluIHRoZSBzbG90IGFuZCByZXNjYW4KIAkJCSAqIGZyb20gdGhlIHBhcmVudCBpZiB0aGF0J3MgdGhlIGNhc2UuCiAJCQkgKi8KLQkJCW11dGV4X2xvY2soJnNsb3QtPmNyaXRfc2VjdCk7Ci0JCQlyZXQgPSBhY3BpcGhwX3Jlc2Nhbl9zbG90KHNsb3QpOwotCQkJbXV0ZXhfdW5sb2NrKCZzbG90LT5jcml0X3NlY3QpOwotCQkJaWYgKHJldCkKKwkJCWlmIChhY3BpcGhwX3Jlc2Nhbl9zbG90KHNsb3QpKQogCQkJCWFjcGlwaHBfY2hlY2tfYnJpZGdlKGZ1bmMtPnBhcmVudCk7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfTk9USUZZX0VKRUNUX1JFUVVFU1Q6CiAJCS8qIHJlcXVlc3QgZGV2aWNlIGVqZWN0ICovCi0JCXByX2RlYnVnKCIlczogRGV2aWNlIGVqZWN0IG5vdGlmeSBvbiAlc1xuIiwgX19mdW5jX18sIG9iam5hbWUpOwotCQlhY3BpcGhwX2Rpc2FibGVfYW5kX2VqZWN0X3Nsb3QoZnVuYy0+c2xvdCk7CisJCWFjcGlfaGFuZGxlX2RlYnVnKGhhbmRsZSwgIkVqZWN0IHJlcXVlc3QgaW4gJXMoKVxuIiwgX19mdW5jX18pOworCQlhY3BpcGhwX2Rpc2FibGVfYW5kX2VqZWN0X3Nsb3Qoc2xvdCk7CiAJCWJyZWFrOwogCX0KIApAQCAtOTQ3LDEwNiArODMwLDQxIEBACiAJCXB1dF9icmlkZ2UoYnJpZGdlKTsKIH0KIAotc3RhdGljIHZvaWQgaG90cGx1Z19ldmVudF93b3JrKHZvaWQgKmRhdGEsIHUzMiB0eXBlKQorc3RhdGljIGludCBhY3BpcGhwX2hvdHBsdWdfbm90aWZ5KHN0cnVjdCBhY3BpX2RldmljZSAqYWRldiwgdTMyIHR5cGUpCiB7Ci0Jc3RydWN0IGFjcGlwaHBfY29udGV4dCAqY29udGV4dCA9IGRhdGE7Ci0JYWNwaV9oYW5kbGUgaGFuZGxlID0gY29udGV4dC0+aGFuZGxlOworCXN0cnVjdCBhY3BpcGhwX2NvbnRleHQgKmNvbnRleHQ7CiAKLQlhY3BpX3NjYW5fbG9ja19hY3F1aXJlKCk7CisJY29udGV4dCA9IGFjcGlwaHBfZ3JhYl9jb250ZXh0KGFkZXYpOworCWlmICghY29udGV4dCkKKwkJcmV0dXJuIC1FTk9EQVRBOwogCi0JaG90cGx1Z19ldmVudChoYW5kbGUsIHR5cGUsIGNvbnRleHQpOwotCi0JYWNwaV9zY2FuX2xvY2tfcmVsZWFzZSgpOwotCWFjcGlfZXZhbHVhdGVfaG90cGx1Z19vc3QoaGFuZGxlLCB0eXBlLCBBQ1BJX09TVF9TQ19TVUNDRVNTLCBOVUxMKTsKLQlwdXRfYnJpZGdlKGNvbnRleHQtPmZ1bmMucGFyZW50KTsKKwlob3RwbHVnX2V2ZW50KHR5cGUsIGNvbnRleHQpOworCWFjcGlwaHBfbGV0X2NvbnRleHRfZ28oY29udGV4dCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogaGFuZGxlX2hvdHBsdWdfZXZlbnQgLSBoYW5kbGUgQUNQSSBob3RwbHVnIGV2ZW50Ci0gKiBAaGFuZGxlOiBOb3RpZnkoKSdlZCBhY3BpX2hhbmRsZQotICogQHR5cGU6IE5vdGlmeSBjb2RlCi0gKiBAZGF0YTogcG9pbnRlciB0byBhY3BpcGhwX2NvbnRleHQgc3RydWN0dXJlCisgKiBhY3BpcGhwX2VudW1lcmF0ZV9zbG90cyAtIEVudW1lcmF0ZSBQQ0kgc2xvdHMgZm9yIGEgZ2l2ZW4gYnVzLgorICogQGJ1czogUENJIGJ1cyB0byBlbnVtZXJhdGUgdGhlIHNsb3RzIGZvci4KICAqCi0gKiBIYW5kbGVzIEFDUEkgZXZlbnQgbm90aWZpY2F0aW9uIG9uIHNsb3RzLgotICovCi1zdGF0aWMgdm9pZCBoYW5kbGVfaG90cGx1Z19ldmVudChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiB0eXBlLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBhY3BpcGhwX2NvbnRleHQgKmNvbnRleHQ7Ci0JdTMyIG9zdF9jb2RlID0gQUNQSV9PU1RfU0NfU1VDQ0VTUzsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIEFDUElfTk9USUZZX0JVU19DSEVDSzoKLQljYXNlIEFDUElfTk9USUZZX0RFVklDRV9DSEVDSzoKLQkJYnJlYWs7Ci0JY2FzZSBBQ1BJX05PVElGWV9FSkVDVF9SRVFVRVNUOgotCQlvc3RfY29kZSA9IEFDUElfT1NUX1NDX0VKRUNUX0lOX1BST0dSRVNTOwotCQlhY3BpX2V2YWx1YXRlX2hvdHBsdWdfb3N0KGhhbmRsZSwgdHlwZSwgb3N0X2NvZGUsIE5VTEwpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9OT1RJRllfREVWSUNFX1dBS0U6Ci0JCXJldHVybjsKLQotCWNhc2UgQUNQSV9OT1RJRllfRlJFUVVFTkNZX01JU01BVENIOgotCQlhY3BpX2hhbmRsZV9lcnIoaGFuZGxlLCAiRGV2aWNlIGNhbm5vdCBiZSBjb25maWd1cmVkIGR1ZSAiCi0JCQkJInRvIGEgZnJlcXVlbmN5IG1pc21hdGNoXG4iKTsKLQkJZ290byBvdXQ7Ci0KLQljYXNlIEFDUElfTk9USUZZX0JVU19NT0RFX01JU01BVENIOgotCQlhY3BpX2hhbmRsZV9lcnIoaGFuZGxlLCAiRGV2aWNlIGNhbm5vdCBiZSBjb25maWd1cmVkIGR1ZSAiCi0JCQkJInRvIGEgYnVzIG1vZGUgbWlzbWF0Y2hcbiIpOwotCQlnb3RvIG91dDsKLQotCWNhc2UgQUNQSV9OT1RJRllfUE9XRVJfRkFVTFQ6Ci0JCWFjcGlfaGFuZGxlX2VycihoYW5kbGUsICJEZXZpY2UgaGFzIHN1ZmZlcmVkIGEgcG93ZXIgZmF1bHRcbiIpOwotCQlnb3RvIG91dDsKLQotCWRlZmF1bHQ6Ci0JCWFjcGlfaGFuZGxlX3dhcm4oaGFuZGxlLCAiVW5zdXBwb3J0ZWQgZXZlbnQgdHlwZSAweCV4XG4iLCB0eXBlKTsKLQkJb3N0X2NvZGUgPSBBQ1BJX09TVF9TQ19VTlJFQ09HTklaRURfTk9USUZZOwotCQlnb3RvIG91dDsKLQl9Ci0KLQltdXRleF9sb2NrKCZhY3BpcGhwX2NvbnRleHRfbG9jayk7Ci0JY29udGV4dCA9IGFjcGlwaHBfZ2V0X2NvbnRleHQoaGFuZGxlKTsKLQlpZiAoIWNvbnRleHQgfHwgV0FSTl9PTihjb250ZXh0LT5oYW5kbGUgIT0gaGFuZGxlKQotCSAgICB8fCBjb250ZXh0LT5mdW5jLnBhcmVudC0+aXNfZ29pbmdfYXdheSkKLQkJZ290byBlcnJfb3V0OwotCi0JZ2V0X2JyaWRnZShjb250ZXh0LT5mdW5jLnBhcmVudCk7Ci0JYWNwaXBocF9wdXRfY29udGV4dChjb250ZXh0KTsKLQlzdGF0dXMgPSBhY3BpX2hvdHBsdWdfZXhlY3V0ZShob3RwbHVnX2V2ZW50X3dvcmssIGNvbnRleHQsIHR5cGUpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQltdXRleF91bmxvY2soJmFjcGlwaHBfY29udGV4dF9sb2NrKTsKLQkJcmV0dXJuOwotCX0KLQlwdXRfYnJpZGdlKGNvbnRleHQtPmZ1bmMucGFyZW50KTsKLQotIGVycl9vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZhY3BpcGhwX2NvbnRleHRfbG9jayk7Ci0Jb3N0X2NvZGUgPSBBQ1BJX09TVF9TQ19OT05fU1BFQ0lGSUNfRkFJTFVSRTsKLQotIG91dDoKLQlhY3BpX2V2YWx1YXRlX2hvdHBsdWdfb3N0KGhhbmRsZSwgdHlwZSwgb3N0X2NvZGUsIE5VTEwpOwotfQotCi0vKgotICogQ3JlYXRlIGhvdHBsdWcgc2xvdHMgZm9yIHRoZSBQQ0kgYnVzLgotICogSXQgc2hvdWxkIGFsd2F5cyByZXR1cm4gMCB0byBhdm9pZCBza2lwcGluZyBmb2xsb3dpbmcgbm90aWZpZXJzLgorICogQSAic2xvdCIgaXMgYW4gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIFBDSSBkZXZpY2UgbnVtYmVyLiAgQWxsIGZ1bmN0aW9ucworICogKFBDSSBkZXZpY2VzKSB3aXRoIHRoZSBzYW1lIGJ1cyBhbmQgZGV2aWNlIG51bWJlciBiZWxvbmcgdG8gdGhlIHNhbWUgc2xvdC4KICAqLwogdm9pZCBhY3BpcGhwX2VudW1lcmF0ZV9zbG90cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlOworCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldjsKIAlhY3BpX2hhbmRsZSBoYW5kbGU7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJaWYgKGFjcGlwaHBfZGlzYWJsZWQpCiAJCXJldHVybjsKIAotCWhhbmRsZSA9IEFDUElfSEFORExFKGJ1cy0+YnJpZGdlKTsKLQlpZiAoIWhhbmRsZSkKKwlhZGV2ID0gQUNQSV9DT01QQU5JT04oYnVzLT5icmlkZ2UpOworCWlmICghYWRldikKIAkJcmV0dXJuOwogCisJaGFuZGxlID0gYWRldi0+aGFuZGxlOwogCWJyaWRnZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpcGhwX2JyaWRnZSksIEdGUF9LRVJORUwpOwogCWlmICghYnJpZGdlKSB7CiAJCWFjcGlfaGFuZGxlX2VycihoYW5kbGUsICJObyBtZW1vcnkgZm9yIGJyaWRnZSBvYmplY3RcbiIpOwpAQCAtMTA3NCwxMCArODkyLDEwIEBACiAJCSAqIHBhcmVudCBpcyBnb2luZyB0byBiZSBoYW5kbGVkIGJ5IHBjaWVocCwgaW4gd2hpY2ggY2FzZSB0aGlzCiAJCSAqIGJyaWRnZSBpcyBub3QgaW50ZXJlc3RpbmcgdG8gdXMgZWl0aGVyLgogCQkgKi8KLQkJbXV0ZXhfbG9jaygmYWNwaXBocF9jb250ZXh0X2xvY2spOwotCQljb250ZXh0ID0gYWNwaXBocF9nZXRfY29udGV4dChoYW5kbGUpOworCQlhY3BpX2xvY2tfaHBfY29udGV4dCgpOworCQljb250ZXh0ID0gYWNwaXBocF9nZXRfY29udGV4dChhZGV2KTsKIAkJaWYgKCFjb250ZXh0KSB7Ci0JCQltdXRleF91bmxvY2soJmFjcGlwaHBfY29udGV4dF9sb2NrKTsKKwkJCWFjcGlfdW5sb2NrX2hwX2NvbnRleHQoKTsKIAkJCXB1dF9kZXZpY2UoJmJ1cy0+ZGV2KTsKIAkJCXBjaV9kZXZfcHV0KGJyaWRnZS0+cGNpX2Rldik7CiAJCQlrZnJlZShicmlkZ2UpOwpAQCAtMTA4NywxNyArOTA1LDE3IEBACiAJCWNvbnRleHQtPmJyaWRnZSA9IGJyaWRnZTsKIAkJLyogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgYnJpZGdlLiAqLwogCQlnZXRfYnJpZGdlKGNvbnRleHQtPmZ1bmMucGFyZW50KTsKLQkJbXV0ZXhfdW5sb2NrKCZhY3BpcGhwX2NvbnRleHRfbG9jayk7CisJCWFjcGlfdW5sb2NrX2hwX2NvbnRleHQoKTsKIAl9CiAKLQkvKiBtdXN0IGJlIGFkZGVkIHRvIHRoZSBsaXN0IHByaW9yIHRvIGNhbGxpbmcgcmVnaXN0ZXJfc2xvdCAqLworCS8qIE11c3QgYmUgYWRkZWQgdG8gdGhlIGxpc3QgcHJpb3IgdG8gY2FsbGluZyBhY3BpcGhwX2FkZF9jb250ZXh0KCkuICovCiAJbXV0ZXhfbG9jaygmYnJpZGdlX211dGV4KTsKIAlsaXN0X2FkZCgmYnJpZGdlLT5saXN0LCAmYnJpZGdlX2xpc3QpOwogCW11dGV4X3VubG9jaygmYnJpZGdlX211dGV4KTsKIAogCS8qIHJlZ2lzdGVyIGFsbCBzbG90IG9iamVjdHMgdW5kZXIgdGhpcyBicmlkZ2UgKi8KIAlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIGhhbmRsZSwgMSwKLQkJCQkgICAgIHJlZ2lzdGVyX3Nsb3QsIE5VTEwsIGJyaWRnZSwgTlVMTCk7CisJCQkJICAgICBhY3BpcGhwX2FkZF9jb250ZXh0LCBOVUxMLCBicmlkZ2UsIE5VTEwpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlhY3BpX2hhbmRsZV9lcnIoaGFuZGxlLCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHNsb3RzXG4iKTsKIAkJY2xlYW51cF9icmlkZ2UoYnJpZGdlKTsKQEAgLTExMDUsNyArOTIzLDEwIEBACiAJfQogfQogCi0vKiBEZXN0cm95IGhvdHBsdWcgc2xvdHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBQQ0kgYnVzICovCisvKioKKyAqIGFjcGlwaHBfcmVtb3ZlX3Nsb3RzIC0gUmVtb3ZlIHNsb3Qgb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBidXMuCisgKiBAYnVzOiBQQ0kgYnVzIHRvIHJlbW92ZSB0aGUgc2xvdCBvYmplY3RzIGZvci4KKyAqLwogdm9pZCBhY3BpcGhwX3JlbW92ZV9zbG90cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlOwpAQCAtMTEzNiwxMyArOTU3LDEwIEBACiAJaWYgKHNsb3QtPmZsYWdzICYgU0xPVF9JU19HT0lOR19BV0FZKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCW11dGV4X2xvY2soJnNsb3QtPmNyaXRfc2VjdCk7CiAJLyogY29uZmlndXJlIGFsbCBmdW5jdGlvbnMgKi8KIAlpZiAoIShzbG90LT5mbGFncyAmIFNMT1RfRU5BQkxFRCkpCiAJCWVuYWJsZV9zbG90KHNsb3QpOwogCi0JbXV0ZXhfdW5sb2NrKCZzbG90LT5jcml0X3NlY3QpOwotCiAJcGNpX3VubG9ja19yZXNjYW5fcmVtb3ZlKCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMTU4LDggKzk3Niw2IEBACiAJaWYgKHNsb3QtPmZsYWdzICYgU0xPVF9JU19HT0lOR19BV0FZKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCW11dGV4X2xvY2soJnNsb3QtPmNyaXRfc2VjdCk7Ci0KIAkvKiB1bmNvbmZpZ3VyZSBhbGwgZnVuY3Rpb25zICovCiAJZGlzYWJsZV9zbG90KHNsb3QpOwogCkBAIC0xMTczLDcgKzk4OSw2IEBACiAJCQlicmVhazsKIAkJfQogCi0JbXV0ZXhfdW5sb2NrKCZzbG90LT5jcml0X3NlY3QpOwogCXJldHVybiAwOwogfQogCkBAIC0xMTgxLDkgKzk5NiwxNSBAQAogewogCWludCByZXQ7CiAKKwkvKgorCSAqIEFjcXVpcmUgYWNwaV9zY2FuX2xvY2sgdG8gZW5zdXJlIHRoYXQgdGhlIGV4ZWN1dGlvbiBvZiBfRUowIGluCisJICogYWNwaXBocF9kaXNhYmxlX2FuZF9lamVjdF9zbG90KCkgd2lsbCBiZSBzeW5jaHJvbml6ZWQgcHJvcGVybHkuCisJICovCisJYWNwaV9zY2FuX2xvY2tfYWNxdWlyZSgpOwogCXBjaV9sb2NrX3Jlc2Nhbl9yZW1vdmUoKTsKIAlyZXQgPSBhY3BpcGhwX2Rpc2FibGVfYW5kX2VqZWN0X3Nsb3Qoc2xvdCk7CiAJcGNpX3VubG9ja19yZXNjYW5fcmVtb3ZlKCk7CisJYWNwaV9zY2FuX2xvY2tfcmVsZWFzZSgpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2NvcmUuYwppbmRleCAzMTI3M2UxLi4wMzdlMjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY29yZS5jCkBAIC05MjAsMTIgKzkyMCwxMiBAQAogCQkJCWJ1cy0+bWF4X2J1c19zcGVlZCA9IFBDSV9TUEVFRF8xMDBNSHpfUENJWDsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWlmIChidXNfY2FwICYgMjApIHsKKwkJCWlmIChidXNfY2FwICYgMHgyMCkgewogCQkJCWRiZygiYnVzIG1heCBzdXBwb3J0cyA2Nk1IeiBQQ0ktWFxuIik7CiAJCQkJYnVzLT5tYXhfYnVzX3NwZWVkID0gUENJX1NQRUVEXzY2TUh6X1BDSVg7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlpZiAoYnVzX2NhcCAmIDEwKSB7CisJCQlpZiAoYnVzX2NhcCAmIDB4MTApIHsKIAkJCQlkYmcoImJ1cyBtYXggc3VwcG9ydHMgNjZNSHogUENJXG4iKTsKIAkJCQlidXMtPm1heF9idXNfc3BlZWQgPSBQQ0lfU1BFRURfNjZNSHo7CiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHAuaAppbmRleCA4OGIzN2NhLi44YTY2ODY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmgKQEAgLTc2LDYgKzc2LDcgQEAKIAlzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3Q7CiAJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwkvKiB3b3JrIGZvciBidXR0b24gZXZlbnQgKi8KIAlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgbXV0ZXggaG90cGx1Z19sb2NrOwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKIH07CiAKQEAgLTEwOSw2ICsxMTAsOCBAQAogI2RlZmluZSBJTlRfQlVUVE9OX1BSRVNTCQk3CiAjZGVmaW5lIElOVF9CVVRUT05fUkVMRUFTRQkJOAogI2RlZmluZSBJTlRfQlVUVE9OX0NBTkNFTAkJOQorI2RlZmluZSBJTlRfTElOS19VUAkJCTEwCisjZGVmaW5lIElOVF9MSU5LX0RPV04JCQkxMQogCiAjZGVmaW5lIFNUQVRJQ19TVEFURQkJCTAKICNkZWZpbmUgQkxJTktJTkdPTl9TVEFURQkJMQpAQCAtMTMyLDYgKzEzNSw3IEBACiB1OCBwY2llaHBfaGFuZGxlX3N3aXRjaF9jaGFuZ2Uoc3RydWN0IHNsb3QgKnBfc2xvdCk7CiB1OCBwY2llaHBfaGFuZGxlX3ByZXNlbmNlX2NoYW5nZShzdHJ1Y3Qgc2xvdCAqcF9zbG90KTsKIHU4IHBjaWVocF9oYW5kbGVfcG93ZXJfZmF1bHQoc3RydWN0IHNsb3QgKnBfc2xvdCk7Cit2b2lkIHBjaWVocF9oYW5kbGVfbGlua3N0YXRlX2NoYW5nZShzdHJ1Y3Qgc2xvdCAqcF9zbG90KTsKIGludCBwY2llaHBfY29uZmlndXJlX2RldmljZShzdHJ1Y3Qgc2xvdCAqcF9zbG90KTsKIGludCBwY2llaHBfdW5jb25maWd1cmVfZGV2aWNlKHN0cnVjdCBzbG90ICpwX3Nsb3QpOwogdm9pZCBwY2llaHBfcXVldWVfcHVzaGJ1dHRvbl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CkBAIC0xNTMsNiArMTU3LDcgQEAKIHZvaWQgcGNpZWhwX2dyZWVuX2xlZF9vZmYoc3RydWN0IHNsb3QgKnNsb3QpOwogdm9pZCBwY2llaHBfZ3JlZW5fbGVkX2JsaW5rKHN0cnVjdCBzbG90ICpzbG90KTsKIGludCBwY2llaHBfY2hlY2tfbGlua19zdGF0dXMoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpOworYm9vbCBwY2llaHBfY2hlY2tfbGlua19hY3RpdmUoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpOwogdm9pZCBwY2llaHBfcmVsZWFzZV9jdHJsKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKTsKIGludCBwY2llaHBfcmVzZXRfc2xvdChzdHJ1Y3Qgc2xvdCAqc2xvdCwgaW50IHByb2JlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfYWNwaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfYWNwaS5jCmluZGV4IGVkZGRkZDQuLjIwZmVhNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2FjcGkuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9hY3BpLmMKQEAgLTExMiw2ICsxMTIsNyBAQAogc3RhdGljIGludCBfX2luaXQgc2VsZWN0X2RldGVjdGlvbl9tb2RlKHZvaWQpCiB7CiAJc3RydWN0IGR1bW15X3Nsb3QgKnNsb3QsICp0bXA7CisKIAlpZiAocGNpZV9wb3J0X3NlcnZpY2VfcmVnaXN0ZXIoJmR1bW15X2RyaXZlcikpCiAJCXJldHVybiBQQ0lFSFBfREVURUNUX0FDUEk7CiAJcGNpZV9wb3J0X3NlcnZpY2VfdW5yZWdpc3RlcigmZHVtbXlfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYwppbmRleCA1M2I1OGRlLi4wZTBhMmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jCkBAIC0xMDgsNiArMTA4LDcgQEAKIAlvcHMgPSBremFsbG9jKHNpemVvZigqb3BzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFvcHMpCiAJCWdvdG8gb3V0OworCiAJb3BzLT5lbmFibGVfc2xvdCA9IGVuYWJsZV9zbG90OwogCW9wcy0+ZGlzYWJsZV9zbG90ID0gZGlzYWJsZV9zbG90OwogCW9wcy0+Z2V0X3Bvd2VyX3N0YXR1cyA9IGdldF9wb3dlcl9zdGF0dXM7CkBAIC0yODMsOCArMjg0LDExIEBACiAJc2xvdCA9IGN0cmwtPnNsb3Q7CiAJcGNpZWhwX2dldF9hZGFwdGVyX3N0YXR1cyhzbG90LCAmb2NjdXBpZWQpOwogCXBjaWVocF9nZXRfcG93ZXJfc3RhdHVzKHNsb3QsICZwb3dlcm9uKTsKLQlpZiAob2NjdXBpZWQgJiYgcGNpZWhwX2ZvcmNlKQorCWlmIChvY2N1cGllZCAmJiBwY2llaHBfZm9yY2UpIHsKKwkJbXV0ZXhfbG9jaygmc2xvdC0+aG90cGx1Z19sb2NrKTsKIAkJcGNpZWhwX2VuYWJsZV9zbG90KHNsb3QpOworCQltdXRleF91bmxvY2soJnNsb3QtPmhvdHBsdWdfbG9jayk7CisJfQogCS8qIElmIGVtcHR5IHNsb3QncyBwb3dlciBzdGF0dXMgaXMgb24sIHR1cm4gcG93ZXIgb2ZmICovCiAJaWYgKCFvY2N1cGllZCAmJiBwb3dlcm9uICYmIFBPV0VSX0NUUkwoY3RybCkpCiAJCXBjaWVocF9wb3dlcl9vZmZfc2xvdChzbG90KTsKQEAgLTMyOCwxMCArMzMyLDEyIEBACiAKIAkvKiBDaGVjayBpZiBzbG90IGlzIG9jY3VwaWVkICovCiAJcGNpZWhwX2dldF9hZGFwdGVyX3N0YXR1cyhzbG90LCAmc3RhdHVzKTsKKwltdXRleF9sb2NrKCZzbG90LT5ob3RwbHVnX2xvY2spOwogCWlmIChzdGF0dXMpCiAJCXBjaWVocF9lbmFibGVfc2xvdChzbG90KTsKIAllbHNlCiAJCXBjaWVocF9kaXNhYmxlX3Nsb3Qoc2xvdCk7CisJbXV0ZXhfdW5sb2NrKCZzbG90LT5ob3RwbHVnX2xvY2spOwogCXJldHVybiAwOwogfQogI2VuZGlmIC8qIFBNICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMKaW5kZXggNTA2Mjg0OC4uYzc1ZTZhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYwpAQCAtMTUwLDYgKzE1MCwyNyBAQAogCXJldHVybiAxOwogfQogCit2b2lkIHBjaWVocF9oYW5kbGVfbGlua3N0YXRlX2NoYW5nZShzdHJ1Y3Qgc2xvdCAqcF9zbG90KQoreworCXUzMiBldmVudF90eXBlOworCXN0cnVjdCBjb250cm9sbGVyICpjdHJsID0gcF9zbG90LT5jdHJsOworCisJLyogTGluayBTdGF0dXMgQ2hhbmdlICovCisJY3RybF9kYmcoY3RybCwgIkRhdGEgTGluayBMYXllciBTdGF0ZSBjaGFuZ2VcbiIpOworCisJaWYgKHBjaWVocF9jaGVja19saW5rX2FjdGl2ZShjdHJsKSkgeworCQljdHJsX2luZm8oY3RybCwgInNsb3QoJXMpOiBMaW5rIFVwIGV2ZW50XG4iLAorCQkJICBzbG90X25hbWUocF9zbG90KSk7CisJCWV2ZW50X3R5cGUgPSBJTlRfTElOS19VUDsKKwl9IGVsc2UgeworCQljdHJsX2luZm8oY3RybCwgInNsb3QoJXMpOiBMaW5rIERvd24gZXZlbnRcbiIsCisJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKKwkJZXZlbnRfdHlwZSA9IElOVF9MSU5LX0RPV047CisJfQorCisJcXVldWVfaW50ZXJydXB0X2V2ZW50KHBfc2xvdCwgZXZlbnRfdHlwZSk7Cit9CisKIC8qIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgY29uc3RpdHV0ZSB0aGUgYnVsayBvZiB0aGUKICAgIGhvdHBsdWcgY29udHJvbGxlciBsb2dpYwogICovCkBAIC0yMTIsNyArMjMzLDggQEAKIAlpZiAocmV0dmFsKSB7CiAJCWN0cmxfZXJyKGN0cmwsICJDYW5ub3QgYWRkIGRldmljZSBhdCAlMDR4OiUwMng6MDBcbiIsCiAJCQkgcGNpX2RvbWFpbl9ucihwYXJlbnQpLCBwYXJlbnQtPm51bWJlcik7Ci0JCWdvdG8gZXJyX2V4aXQ7CisJCWlmIChyZXR2YWwgIT0gLUVFWElTVCkKKwkJCWdvdG8gZXJyX2V4aXQ7CiAJfQogCiAJcGNpZWhwX2dyZWVuX2xlZF9vbihwX3Nsb3QpOwpAQCAtMjU1LDYgKzI3Nyw5IEBACiBzdHJ1Y3QgcG93ZXJfd29ya19pbmZvIHsKIAlzdHJ1Y3Qgc2xvdCAqcF9zbG90OwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXVuc2lnbmVkIGludCByZXE7CisjZGVmaW5lIERJU0FCTEVfUkVRIDAKKyNkZWZpbmUgRU5BQkxFX1JFUSAgMQogfTsKIAogLyoqCkBAIC0yNjksMzAgKzI5NCwzOCBAQAogCXN0cnVjdCBwb3dlcl93b3JrX2luZm8gKmluZm8gPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHBvd2VyX3dvcmtfaW5mbywgd29yayk7CiAJc3RydWN0IHNsb3QgKnBfc2xvdCA9IGluZm8tPnBfc2xvdDsKKwlpbnQgcmV0OwogCi0JbXV0ZXhfbG9jaygmcF9zbG90LT5sb2NrKTsKLQlzd2l0Y2ggKHBfc2xvdC0+c3RhdGUpIHsKLQljYXNlIFBPV0VST0ZGX1NUQVRFOgotCQltdXRleF91bmxvY2soJnBfc2xvdC0+bG9jayk7CisJc3dpdGNoIChpbmZvLT5yZXEpIHsKKwljYXNlIERJU0FCTEVfUkVROgogCQljdHJsX2RiZyhwX3Nsb3QtPmN0cmwsCiAJCQkgIkRpc2FibGluZyBkb21haW46YnVzOmRldmljZT0lMDR4OiUwMng6MDBcbiIsCiAJCQkgcGNpX2RvbWFpbl9ucihwX3Nsb3QtPmN0cmwtPnBjaWUtPnBvcnQtPnN1Ym9yZGluYXRlKSwKIAkJCSBwX3Nsb3QtPmN0cmwtPnBjaWUtPnBvcnQtPnN1Ym9yZGluYXRlLT5udW1iZXIpOworCQltdXRleF9sb2NrKCZwX3Nsb3QtPmhvdHBsdWdfbG9jayk7CiAJCXBjaWVocF9kaXNhYmxlX3Nsb3QocF9zbG90KTsKKwkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmhvdHBsdWdfbG9jayk7CiAJCW11dGV4X2xvY2soJnBfc2xvdC0+bG9jayk7CiAJCXBfc2xvdC0+c3RhdGUgPSBTVEFUSUNfU1RBVEU7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJPTl9TVEFURToKIAkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmxvY2spOwotCQlpZiAocGNpZWhwX2VuYWJsZV9zbG90KHBfc2xvdCkpCisJCWJyZWFrOworCWNhc2UgRU5BQkxFX1JFUToKKwkJY3RybF9kYmcocF9zbG90LT5jdHJsLAorCQkJICJFbmFibGluZyBkb21haW46YnVzOmRldmljZT0lMDR4OiUwMng6MDBcbiIsCisJCQkgcGNpX2RvbWFpbl9ucihwX3Nsb3QtPmN0cmwtPnBjaWUtPnBvcnQtPnN1Ym9yZGluYXRlKSwKKwkJCSBwX3Nsb3QtPmN0cmwtPnBjaWUtPnBvcnQtPnN1Ym9yZGluYXRlLT5udW1iZXIpOworCQltdXRleF9sb2NrKCZwX3Nsb3QtPmhvdHBsdWdfbG9jayk7CisJCXJldCA9IHBjaWVocF9lbmFibGVfc2xvdChwX3Nsb3QpOworCQltdXRleF91bmxvY2soJnBfc2xvdC0+aG90cGx1Z19sb2NrKTsKKwkJaWYgKHJldCkKIAkJCXBjaWVocF9ncmVlbl9sZWRfb2ZmKHBfc2xvdCk7CiAJCW11dGV4X2xvY2soJnBfc2xvdC0+bG9jayk7CiAJCXBfc2xvdC0+c3RhdGUgPSBTVEFUSUNfU1RBVEU7CisJCW11dGV4X3VubG9jaygmcF9zbG90LT5sb2NrKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQotCW11dGV4X3VubG9jaygmcF9zbG90LT5sb2NrKTsKIAogCWtmcmVlKGluZm8pOwogfQpAQCAtMzE1LDkgKzM0OCwxMSBAQAogCXN3aXRjaCAocF9zbG90LT5zdGF0ZSkgewogCWNhc2UgQkxJTktJTkdPRkZfU1RBVEU6CiAJCXBfc2xvdC0+c3RhdGUgPSBQT1dFUk9GRl9TVEFURTsKKwkJaW5mby0+cmVxID0gRElTQUJMRV9SRVE7CiAJCWJyZWFrOwogCWNhc2UgQkxJTktJTkdPTl9TVEFURToKIAkJcF9zbG90LT5zdGF0ZSA9IFBPV0VST05fU1RBVEU7CisJCWluZm8tPnJlcSA9IEVOQUJMRV9SRVE7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWtmcmVlKGluZm8pOwpAQCAtMzY0LDExICszOTksMTAgQEAKIAkJICovCiAJCWN0cmxfaW5mbyhjdHJsLCAiQnV0dG9uIGNhbmNlbCBvbiBTbG90KCVzKVxuIiwgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQljYW5jZWxfZGVsYXllZF93b3JrKCZwX3Nsb3QtPndvcmspOwotCQlpZiAocF9zbG90LT5zdGF0ZSA9PSBCTElOS0lOR09GRl9TVEFURSkgeworCQlpZiAocF9zbG90LT5zdGF0ZSA9PSBCTElOS0lOR09GRl9TVEFURSkKIAkJCXBjaWVocF9ncmVlbl9sZWRfb24ocF9zbG90KTsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJcGNpZWhwX2dyZWVuX2xlZF9vZmYocF9zbG90KTsKLQkJfQogCQlwY2llaHBfc2V0X2F0dGVudGlvbl9zdGF0dXMocF9zbG90LCAwKTsKIAkJY3RybF9pbmZvKGN0cmwsICJQQ0kgc2xvdCAjJXMgLSBhY3Rpb24gY2FuY2VsZWQgIgogCQkJICAiZHVlIHRvIGJ1dHRvbiBwcmVzc1xuIiwgc2xvdF9uYW1lKHBfc2xvdCkpOwpAQCAtNDA3LDE0ICs0NDEsODEgQEAKIAlJTklUX1dPUksoJmluZm8tPndvcmssIHBjaWVocF9wb3dlcl90aHJlYWQpOwogCiAJcGNpZWhwX2dldF9hZGFwdGVyX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwotCWlmICghZ2V0c3RhdHVzKQorCWlmICghZ2V0c3RhdHVzKSB7CiAJCXBfc2xvdC0+c3RhdGUgPSBQT1dFUk9GRl9TVEFURTsKLQllbHNlCisJCWluZm8tPnJlcSA9IERJU0FCTEVfUkVROworCX0gZWxzZSB7CiAJCXBfc2xvdC0+c3RhdGUgPSBQT1dFUk9OX1NUQVRFOworCQlpbmZvLT5yZXEgPSBFTkFCTEVfUkVROworCX0KIAogCXF1ZXVlX3dvcmsocF9zbG90LT53cSwgJmluZm8tPndvcmspOwogfQogCisvKgorICogTm90ZTogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIHNsb3QtPmxvY2sgaGVsZAorICovCitzdGF0aWMgdm9pZCBoYW5kbGVfbGlua19ldmVudChzdHJ1Y3Qgc2xvdCAqcF9zbG90LCB1MzIgZXZlbnQpCit7CisJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBwX3Nsb3QtPmN0cmw7CisJc3RydWN0IHBvd2VyX3dvcmtfaW5mbyAqaW5mbzsKKworCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykgeworCQljdHJsX2VycihwX3Nsb3QtPmN0cmwsICIlczogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeVxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJaW5mby0+cF9zbG90ID0gcF9zbG90OworCWluZm8tPnJlcSA9IGV2ZW50ID09IElOVF9MSU5LX1VQID8gRU5BQkxFX1JFUSA6IERJU0FCTEVfUkVROworCUlOSVRfV09SSygmaW5mby0+d29yaywgcGNpZWhwX3Bvd2VyX3RocmVhZCk7CisKKwlzd2l0Y2ggKHBfc2xvdC0+c3RhdGUpIHsKKwljYXNlIEJMSU5LSU5HT05fU1RBVEU6CisJY2FzZSBCTElOS0lOR09GRl9TVEFURToKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcF9zbG90LT53b3JrKTsKKwkJLyogRmFsbCB0aHJvdWdoICovCisJY2FzZSBTVEFUSUNfU1RBVEU6CisJCXBfc2xvdC0+c3RhdGUgPSBldmVudCA9PSBJTlRfTElOS19VUCA/CisJCSAgICBQT1dFUk9OX1NUQVRFIDogUE9XRVJPRkZfU1RBVEU7CisJCXF1ZXVlX3dvcmsocF9zbG90LT53cSwgJmluZm8tPndvcmspOworCQlicmVhazsKKwljYXNlIFBPV0VST05fU1RBVEU6CisJCWlmIChldmVudCA9PSBJTlRfTElOS19VUCkgeworCQkJY3RybF9pbmZvKGN0cmwsCisJCQkJICAiTGluayBVcCBldmVudCBpZ25vcmVkIG9uIHNsb3QoJXMpOiBhbHJlYWR5IHBvd2VyaW5nIG9uXG4iLAorCQkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOworCQkJa2ZyZWUoaW5mbyk7CisJCX0gZWxzZSB7CisJCQljdHJsX2luZm8oY3RybCwKKwkJCQkgICJMaW5rIERvd24gZXZlbnQgcXVldWVkIG9uIHNsb3QoJXMpOiBjdXJyZW50bHkgZ2V0dGluZyBwb3dlcmVkIG9uXG4iLAorCQkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOworCQkJcF9zbG90LT5zdGF0ZSA9IFBPV0VST0ZGX1NUQVRFOworCQkJcXVldWVfd29yayhwX3Nsb3QtPndxLCAmaW5mby0+d29yayk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQT1dFUk9GRl9TVEFURToKKwkJaWYgKGV2ZW50ID09IElOVF9MSU5LX1VQKSB7CisJCQljdHJsX2luZm8oY3RybCwKKwkJCQkgICJMaW5rIFVwIGV2ZW50IHF1ZXVlZCBvbiBzbG90KCVzKTogY3VycmVudGx5IGdldHRpbmcgcG93ZXJlZCBvZmZcbiIsCisJCQkJICBzbG90X25hbWUocF9zbG90KSk7CisJCQlwX3Nsb3QtPnN0YXRlID0gUE9XRVJPTl9TVEFURTsKKwkJCXF1ZXVlX3dvcmsocF9zbG90LT53cSwgJmluZm8tPndvcmspOworCQl9IGVsc2UgeworCQkJY3RybF9pbmZvKGN0cmwsCisJCQkJICAiTGluayBEb3duIGV2ZW50IGlnbm9yZWQgb24gc2xvdCglcyk6IGFscmVhZHkgcG93ZXJpbmcgb2ZmXG4iLAorCQkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOworCQkJa2ZyZWUoaW5mbyk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY3RybF9lcnIoY3RybCwgIk5vdCBhIHZhbGlkIHN0YXRlIG9uIHNsb3QoJXMpXG4iLAorCQkJIHNsb3RfbmFtZShwX3Nsb3QpKTsKKwkJa2ZyZWUoaW5mbyk7CisJCWJyZWFrOworCX0KK30KKwogc3RhdGljIHZvaWQgaW50ZXJydXB0X2V2ZW50X2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBldmVudF9pbmZvICppbmZvID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBldmVudF9pbmZvLCB3b3JrKTsKQEAgLTQzMywxMiArNTM0LDIzIEBACiAJCXBjaWVocF9ncmVlbl9sZWRfb2ZmKHBfc2xvdCk7CiAJCWJyZWFrOwogCWNhc2UgSU5UX1BSRVNFTkNFX09OOgotCWNhc2UgSU5UX1BSRVNFTkNFX09GRjoKIAkJaWYgKCFIUF9TVVBSX1JNKGN0cmwpKQogCQkJYnJlYWs7CisJCWN0cmxfZGJnKGN0cmwsICJTdXJwcmlzZSBJbnNlcnRpb25cbiIpOworCQloYW5kbGVfc3VycHJpc2VfZXZlbnQocF9zbG90KTsKKwkJYnJlYWs7CisJY2FzZSBJTlRfUFJFU0VOQ0VfT0ZGOgorCQkvKgorCQkgKiBSZWdhcmRsZXNzIG9mIHN1cnByaXNlIGNhcGFiaWxpdHksIHdlIG5lZWQgdG8KKwkJICogZGVmaW5pdGVseSByZW1vdmUgYSBjYXJkIHRoYXQgaGFzIGJlZW4gcHVsbGVkIG91dCEKKwkJICovCiAJCWN0cmxfZGJnKGN0cmwsICJTdXJwcmlzZSBSZW1vdmFsXG4iKTsKIAkJaGFuZGxlX3N1cnByaXNlX2V2ZW50KHBfc2xvdCk7CiAJCWJyZWFrOworCWNhc2UgSU5UX0xJTktfVVA6CisJY2FzZSBJTlRfTElOS19ET1dOOgorCQloYW5kbGVfbGlua19ldmVudChwX3Nsb3QsIGluZm8tPmV2ZW50X3R5cGUpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC00NDcsNiArNTU5LDkgQEAKIAlrZnJlZShpbmZvKTsKIH0KIAorLyoKKyAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBzbG90LT5ob3RwbHVnX2xvY2sgaGVsZAorICovCiBpbnQgcGNpZWhwX2VuYWJsZV9zbG90KHN0cnVjdCBzbG90ICpwX3Nsb3QpCiB7CiAJdTggZ2V0c3RhdHVzID0gMDsKQEAgLTQ3OSwxMyArNTk0LDE1IEBACiAJcGNpZWhwX2dldF9sYXRjaF9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKIAogCXJjID0gYm9hcmRfYWRkZWQocF9zbG90KTsKLQlpZiAocmMpIHsKKwlpZiAocmMpCiAJCXBjaWVocF9nZXRfbGF0Y2hfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7Ci0JfQorCiAJcmV0dXJuIHJjOwogfQogCi0KKy8qCisgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggc2xvdC0+aG90cGx1Z19sb2NrIGhlbGQKKyAqLwogaW50IHBjaWVocF9kaXNhYmxlX3Nsb3Qoc3RydWN0IHNsb3QgKnBfc2xvdCkKIHsKIAl1OCBnZXRzdGF0dXMgPSAwOwpAQCAtNDk0LDI0ICs2MTEsNiBAQAogCWlmICghcF9zbG90LT5jdHJsKQogCQlyZXR1cm4gMTsKIAotCWlmICghSFBfU1VQUl9STShwX3Nsb3QtPmN0cmwpKSB7Ci0JCXBjaWVocF9nZXRfYWRhcHRlcl9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKLQkJaWYgKCFnZXRzdGF0dXMpIHsKLQkJCWN0cmxfaW5mbyhjdHJsLCAiTm8gYWRhcHRlciBvbiBzbG90KCVzKVxuIiwKLQkJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQotCi0JaWYgKE1STF9TRU5TKHBfc2xvdC0+Y3RybCkpIHsKLQkJcGNpZWhwX2dldF9sYXRjaF9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKLQkJaWYgKGdldHN0YXR1cykgewotCQkJY3RybF9pbmZvKGN0cmwsICJMYXRjaCBvcGVuIG9uIHNsb3QoJXMpXG4iLAotCQkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQl9Ci0KIAlpZiAoUE9XRVJfQ1RSTChwX3Nsb3QtPmN0cmwpKSB7CiAJCXBjaWVocF9nZXRfcG93ZXJfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7CiAJCWlmICghZ2V0c3RhdHVzKSB7CkBAIC01MzYsNyArNjM1LDkgQEAKIAljYXNlIFNUQVRJQ19TVEFURToKIAkJcF9zbG90LT5zdGF0ZSA9IFBPV0VST05fU1RBVEU7CiAJCW11dGV4X3VubG9jaygmcF9zbG90LT5sb2NrKTsKKwkJbXV0ZXhfbG9jaygmcF9zbG90LT5ob3RwbHVnX2xvY2spOwogCQlyZXR2YWwgPSBwY2llaHBfZW5hYmxlX3Nsb3QocF9zbG90KTsKKwkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmhvdHBsdWdfbG9jayk7CiAJCW11dGV4X2xvY2soJnBfc2xvdC0+bG9jayk7CiAJCXBfc2xvdC0+c3RhdGUgPSBTVEFUSUNfU1RBVEU7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwppbmRleCAxNGFjZmNjLi5kN2QwNThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwpAQCAtMjA2LDcgKzIwNiw3IEBACiAJbXV0ZXhfdW5sb2NrKCZjdHJsLT5jdHJsX2xvY2spOwogfQogCi1zdGF0aWMgYm9vbCBjaGVja19saW5rX2FjdGl2ZShzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKK2Jvb2wgcGNpZWhwX2NoZWNrX2xpbmtfYWN0aXZlKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gY3RybF9kZXYoY3RybCk7CiAJdTE2IGxua19zdGF0dXM7CkBAIC0yMjUsMTIgKzIyNSwxMiBAQAogewogCWludCB0aW1lb3V0ID0gMTAwMDsKIAotCWlmIChjaGVja19saW5rX2FjdGl2ZShjdHJsKSA9PSBhY3RpdmUpCisJaWYgKHBjaWVocF9jaGVja19saW5rX2FjdGl2ZShjdHJsKSA9PSBhY3RpdmUpCiAJCXJldHVybjsKIAl3aGlsZSAodGltZW91dCA+IDApIHsKIAkJbXNsZWVwKDEwKTsKIAkJdGltZW91dCAtPSAxMDsKLQkJaWYgKGNoZWNrX2xpbmtfYWN0aXZlKGN0cmwpID09IGFjdGl2ZSkKKwkJaWYgKHBjaWVocF9jaGVja19saW5rX2FjdGl2ZShjdHJsKSA9PSBhY3RpdmUpCiAJCQlyZXR1cm47CiAJfQogCWN0cmxfZGJnKGN0cmwsICJEYXRhIExpbmsgTGF5ZXIgTGluayBBY3RpdmUgbm90ICVzIGluIDEwMDAgbXNlY1xuIiwKQEAgLTI0MiwxMSArMjQyLDYgQEAKIAlfX3BjaWVfd2FpdF9saW5rX2FjdGl2ZShjdHJsLCB0cnVlKTsKIH0KIAotc3RhdGljIHZvaWQgcGNpZV93YWl0X2xpbmtfbm90X2FjdGl2ZShzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKLXsKLQlfX3BjaWVfd2FpdF9saW5rX2FjdGl2ZShjdHJsLCBmYWxzZSk7Ci19Ci0KIHN0YXRpYyBib29sIHBjaV9idXNfY2hlY2tfZGV2KHN0cnVjdCBwY2lfYnVzICpidXMsIGludCBkZXZmbikKIHsKIAl1MzIgbDsKQEAgLTMzMiwxMSArMzI3LDYgQEAKIAlyZXR1cm4gX19wY2llaHBfbGlua19zZXQoY3RybCwgdHJ1ZSk7CiB9CiAKLXN0YXRpYyBpbnQgcGNpZWhwX2xpbmtfZGlzYWJsZShzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKLXsKLQlyZXR1cm4gX19wY2llaHBfbGlua19zZXQoY3RybCwgZmFsc2UpOwotfQotCiB2b2lkIHBjaWVocF9nZXRfYXR0ZW50aW9uX3N0YXR1cyhzdHJ1Y3Qgc2xvdCAqc2xvdCwgdTggKnN0YXR1cykKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IHNsb3QtPmN0cmw7CkBAIC01MDgsMTQgKzQ5OCw2IEBACiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwogCi0JLyogRGlzYWJsZSB0aGUgbGluayBhdCBmaXJzdCAqLwotCXBjaWVocF9saW5rX2Rpc2FibGUoY3RybCk7Ci0JLyogd2FpdCB0aGUgbGluayBpcyBkb3duICovCi0JaWYgKGN0cmwtPmxpbmtfYWN0aXZlX3JlcG9ydGluZykKLQkJcGNpZV93YWl0X2xpbmtfbm90X2FjdGl2ZShjdHJsKTsKLQllbHNlCi0JCW1zbGVlcCgxMDAwKTsKLQogCXBjaWVfd3JpdGVfY21kKGN0cmwsIFBDSV9FWFBfU0xUQ1RMX1BXUl9PRkYsIFBDSV9FWFBfU0xUQ1RMX1BDQyk7CiAJY3RybF9kYmcoY3RybCwgIiVzOiBTTE9UQ1RSTCAleCB3cml0ZSBjbWQgJXhcbiIsIF9fZnVuY19fLAogCQkgcGNpX3BjaWVfY2FwKGN0cmwtPnBjaWUtPnBvcnQpICsgUENJX0VYUF9TTFRDVEwsCkBAIC01NDAsNyArNTIyLDcgQEAKIAogCQlkZXRlY3RlZCAmPSAoUENJX0VYUF9TTFRTVEFfQUJQIHwgUENJX0VYUF9TTFRTVEFfUEZEIHwKIAkJCSAgICAgUENJX0VYUF9TTFRTVEFfTVJMU0MgfCBQQ0lfRVhQX1NMVFNUQV9QREMgfAotCQkJICAgICBQQ0lfRVhQX1NMVFNUQV9DQyk7CisJCQkgICAgIFBDSV9FWFBfU0xUU1RBX0NDIHwgUENJX0VYUF9TTFRTVEFfRExMU0MpOwogCQlkZXRlY3RlZCAmPSB+aW50cl9sb2M7CiAJCWludHJfbG9jIHw9IGRldGVjdGVkOwogCQlpZiAoIWludHJfbG9jKQpAQCAtNTc5LDYgKzU2MSwxMCBAQAogCQljdHJsLT5wb3dlcl9mYXVsdF9kZXRlY3RlZCA9IDE7CiAJCXBjaWVocF9oYW5kbGVfcG93ZXJfZmF1bHQoc2xvdCk7CiAJfQorCisJaWYgKGludHJfbG9jICYgUENJX0VYUF9TTFRTVEFfRExMU0MpCisJCXBjaWVocF9oYW5kbGVfbGlua3N0YXRlX2NoYW5nZShzbG90KTsKKwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtNTk2LDkgKzU4MiwxNyBAQAogCSAqIHdoZW4gaXQgaXMgY2xlYXJlZCBpbiB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSwgYW5kCiAJICogbmV4dCBwb3dlciBmYXVsdCBkZXRlY3RlZCBpbnRlcnJ1cHQgd2FzIG5vdGlmaWVkIGFnYWluLgogCSAqLwotCWNtZCA9IFBDSV9FWFBfU0xUQ1RMX1BEQ0U7CisKKwkvKgorCSAqIEFsd2F5cyBlbmFibGUgbGluayBldmVudHM6IHRodXMgbGluay11cCBhbmQgbGluay1kb3duIHNoYWxsCisJICogYWx3YXlzIGJlIHRyZWF0ZWQgYXMgaG90cGx1ZyBhbmQgdW5wbHVnIHJlc3BlY3RpdmVseS4gRW5hYmxlCisJICogcHJlc2VuY2UgZGV0ZWN0IG9ubHkgaWYgQXR0ZW50aW9uIEJ1dHRvbiBpcyBub3QgcHJlc2VudC4KKwkgKi8KKwljbWQgPSBQQ0lfRVhQX1NMVENUTF9ETExTQ0U7CiAJaWYgKEFUVE5fQlVUVE4oY3RybCkpCiAJCWNtZCB8PSBQQ0lfRVhQX1NMVENUTF9BQlBFOworCWVsc2UKKwkJY21kIHw9IFBDSV9FWFBfU0xUQ1RMX1BEQ0U7CiAJaWYgKE1STF9TRU5TKGN0cmwpKQogCQljbWQgfD0gUENJX0VYUF9TTFRDVExfTVJMU0NFOwogCWlmICghcGNpZWhwX3BvbGxfbW9kZSkKQEAgLTYwNiw3ICs2MDAsOCBAQAogCiAJbWFzayA9IChQQ0lfRVhQX1NMVENUTF9QRENFIHwgUENJX0VYUF9TTFRDVExfQUJQRSB8CiAJCVBDSV9FWFBfU0xUQ1RMX01STFNDRSB8IFBDSV9FWFBfU0xUQ1RMX1BGREUgfAotCQlQQ0lfRVhQX1NMVENUTF9IUElFIHwgUENJX0VYUF9TTFRDVExfQ0NJRSk7CisJCVBDSV9FWFBfU0xUQ1RMX0hQSUUgfCBQQ0lfRVhQX1NMVENUTF9DQ0lFIHwKKwkJUENJX0VYUF9TTFRDVExfRExMU0NFKTsKIAogCXBjaWVfd3JpdGVfY21kKGN0cmwsIGNtZCwgbWFzayk7CiB9CkBAIC02MjQsMzMgKzYxOSwzOCBAQAogCiAvKgogICogcGNpZWhwIGhhcyBhIDE6MSBidXM6c2xvdCByZWxhdGlvbnNoaXAgc28gd2UgdWx0aW1hdGVseSB3YW50IGEgc2Vjb25kYXJ5Ci0gKiBidXMgcmVzZXQgb2YgdGhlIGJyaWRnZSwgYnV0IGlmIHRoZSBzbG90IHN1cHBvcnRzIHN1cnByaXNlIHJlbW92YWwgd2UgbmVlZAotICogdG8gZGlzYWJsZSBwcmVzZW5jZSBkZXRlY3Rpb24gYXJvdW5kIHRoZSBidXMgcmVzZXQgYW5kIGNsZWFyIGFueSBzcHVyaW91cworICogYnVzIHJlc2V0IG9mIHRoZSBicmlkZ2UsIGJ1dCBhdCB0aGUgc2FtZSB0aW1lIHdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgaXQgaXMKKyAqIG5vdCBzZWVuIGFzIGEgaG90LXVucGx1ZywgZm9sbG93ZWQgYnkgdGhlIGhvdC1wbHVnIG9mIHRoZSBkZXZpY2UuIFRodXMsCisgKiBkaXNhYmxlIGxpbmsgc3RhdGUgbm90aWZpY2F0aW9uIGFuZCBwcmVzZW5jZSBkZXRlY3Rpb24gY2hhbmdlIG5vdGlmaWNhdGlvbgorICogbW9tZW50YXJpbHksIGlmIHdlIHNlZSB0aGF0IHRoZXkgY291bGQgaW50ZXJmZXJlLiBBbHNvLCBjbGVhciBhbnkgc3B1cmlvdXMKICAqIGV2ZW50cyBhZnRlci4KICAqLwogaW50IHBjaWVocF9yZXNldF9zbG90KHN0cnVjdCBzbG90ICpzbG90LCBpbnQgcHJvYmUpCiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gY3RybF9kZXYoY3RybCk7CisJdTE2IHN0YXRfbWFzayA9IDAsIGN0cmxfbWFzayA9IDA7CiAKIAlpZiAocHJvYmUpCiAJCXJldHVybiAwOwogCi0JaWYgKEhQX1NVUFJfUk0oY3RybCkpIHsKLQkJcGNpZV93cml0ZV9jbWQoY3RybCwgMCwgUENJX0VYUF9TTFRDVExfUERDRSk7Ci0JCWlmIChwY2llaHBfcG9sbF9tb2RlKQotCQkJZGVsX3RpbWVyX3N5bmMoJmN0cmwtPnBvbGxfdGltZXIpOworCWlmICghQVRUTl9CVVRUTihjdHJsKSkgeworCQljdHJsX21hc2sgfD0gUENJX0VYUF9TTFRDVExfUERDRTsKKwkJc3RhdF9tYXNrIHw9IFBDSV9FWFBfU0xUU1RBX1BEQzsKIAl9CisJY3RybF9tYXNrIHw9IFBDSV9FWFBfU0xUQ1RMX0RMTFNDRTsKKwlzdGF0X21hc2sgfD0gUENJX0VYUF9TTFRTVEFfRExMU0M7CisKKwlwY2llX3dyaXRlX2NtZChjdHJsLCAwLCBjdHJsX21hc2spOworCWlmIChwY2llaHBfcG9sbF9tb2RlKQorCQlkZWxfdGltZXJfc3luYygmY3RybC0+cG9sbF90aW1lcik7CiAKIAlwY2lfcmVzZXRfYnJpZGdlX3NlY29uZGFyeV9idXMoY3RybC0+cGNpZS0+cG9ydCk7CiAKLQlpZiAoSFBfU1VQUl9STShjdHJsKSkgewotCQlwY2llX2NhcGFiaWxpdHlfd3JpdGVfd29yZChwZGV2LCBQQ0lfRVhQX1NMVFNUQSwKLQkJCQkJICAgUENJX0VYUF9TTFRTVEFfUERDKTsKLQkJcGNpZV93cml0ZV9jbWQoY3RybCwgUENJX0VYUF9TTFRDVExfUERDRSwgUENJX0VYUF9TTFRDVExfUERDRSk7Ci0JCWlmIChwY2llaHBfcG9sbF9tb2RlKQotCQkJaW50X3BvbGxfdGltZW91dChjdHJsLT5wb2xsX3RpbWVyLmRhdGEpOwotCX0KKwlwY2llX2NhcGFiaWxpdHlfd3JpdGVfd29yZChwZGV2LCBQQ0lfRVhQX1NMVFNUQSwgc3RhdF9tYXNrKTsKKwlwY2llX3dyaXRlX2NtZChjdHJsLCBjdHJsX21hc2ssIGN0cmxfbWFzayk7CisJaWYgKHBjaWVocF9wb2xsX21vZGUpCisJCWludF9wb2xsX3RpbWVvdXQoY3RybC0+cG9sbF90aW1lci5kYXRhKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjg3LDYgKzY4Nyw3IEBACiAKIAlzbG90LT5jdHJsID0gY3RybDsKIAltdXRleF9pbml0KCZzbG90LT5sb2NrKTsKKwltdXRleF9pbml0KCZzbG90LT5ob3RwbHVnX2xvY2spOwogCUlOSVRfREVMQVlFRF9XT1JLKCZzbG90LT53b3JrLCBwY2llaHBfcXVldWVfcHVzaGJ1dHRvbl93b3JrKTsKIAljdHJsLT5zbG90ID0gc2xvdDsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX3BjaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfcGNpLmMKaW5kZXggYjA3ZDdjYy4uMWI1MzMwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfcGNpLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAkJCSAiYXQgJTA0eDolMDJ4OjAwLCBjYW5ub3QgaG90LWFkZFxuIiwgcGNpX25hbWUoZGV2KSwKIAkJCSBwY2lfZG9tYWluX25yKHBhcmVudCksIHBhcmVudC0+bnVtYmVyKTsKIAkJcGNpX2Rldl9wdXQoZGV2KTsKLQkJcmV0ID0gLUVJTlZBTDsKKwkJcmV0ID0gLUVFWElTVDsKIAkJZ290byBvdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pb3YuYyBiL2RyaXZlcnMvcGNpL2lvdi5jCmluZGV4IDlkY2U3YzUuLmRlN2E3NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2lvdi5jCisrKyBiL2RyaXZlcnMvcGNpL2lvdi5jCkBAIC0xNzAsOTcgKzE3MCw2IEBACiAJcGNpX2Rldl9wdXQoZGV2KTsKIH0KIAotc3RhdGljIGludCBzcmlvdl9taWdyYXRpb24oc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQl1MTYgc3RhdHVzOwotCXN0cnVjdCBwY2lfc3Jpb3YgKmlvdiA9IGRldi0+c3Jpb3Y7Ci0KLQlpZiAoIWlvdi0+bnVtX1ZGcykKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIShpb3YtPmNhcCAmIFBDSV9TUklPVl9DQVBfVkZNKSkKLQkJcmV0dXJuIDA7Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIGlvdi0+cG9zICsgUENJX1NSSU9WX1NUQVRVUywgJnN0YXR1cyk7Ci0JaWYgKCEoc3RhdHVzICYgUENJX1NSSU9WX1NUQVRVU19WRk0pKQotCQlyZXR1cm4gMDsKLQotCXNjaGVkdWxlX3dvcmsoJmlvdi0+bXRhc2spOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIHNyaW92X21pZ3JhdGlvbl90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlpbnQgaTsKLQl1OCBzdGF0ZTsKLQl1MTYgc3RhdHVzOwotCXN0cnVjdCBwY2lfc3Jpb3YgKmlvdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcGNpX3NyaW92LCBtdGFzayk7Ci0KLQlmb3IgKGkgPSBpb3YtPmluaXRpYWxfVkZzOyBpIDwgaW92LT5udW1fVkZzOyBpKyspIHsKLQkJc3RhdGUgPSByZWFkYihpb3YtPm1zdGF0ZSArIGkpOwotCQlpZiAoc3RhdGUgPT0gUENJX1NSSU9WX1ZGTV9NSSkgewotCQkJd3JpdGViKFBDSV9TUklPVl9WRk1fQVYsIGlvdi0+bXN0YXRlICsgaSk7Ci0JCQlzdGF0ZSA9IHJlYWRiKGlvdi0+bXN0YXRlICsgaSk7Ci0JCQlpZiAoc3RhdGUgPT0gUENJX1NSSU9WX1ZGTV9BVikKLQkJCQl2aXJ0Zm5fYWRkKGlvdi0+c2VsZiwgaSwgMSk7Ci0JCX0gZWxzZSBpZiAoc3RhdGUgPT0gUENJX1NSSU9WX1ZGTV9NTykgewotCQkJdmlydGZuX3JlbW92ZShpb3YtPnNlbGYsIGksIDEpOwotCQkJd3JpdGViKFBDSV9TUklPVl9WRk1fVUEsIGlvdi0+bXN0YXRlICsgaSk7Ci0JCQlzdGF0ZSA9IHJlYWRiKGlvdi0+bXN0YXRlICsgaSk7Ci0JCQlpZiAoc3RhdGUgPT0gUENJX1NSSU9WX1ZGTV9BVikKLQkJCQl2aXJ0Zm5fYWRkKGlvdi0+c2VsZiwgaSwgMCk7Ci0JCX0KLQl9Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChpb3YtPnNlbGYsIGlvdi0+cG9zICsgUENJX1NSSU9WX1NUQVRVUywgJnN0YXR1cyk7Ci0Jc3RhdHVzICY9IH5QQ0lfU1JJT1ZfU1RBVFVTX1ZGTTsKLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaW92LT5zZWxmLCBpb3YtPnBvcyArIFBDSV9TUklPVl9TVEFUVVMsIHN0YXR1cyk7Ci19Ci0KLXN0YXRpYyBpbnQgc3Jpb3ZfZW5hYmxlX21pZ3JhdGlvbihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbnJfdmlydGZuKQotewotCWludCBiaXI7Ci0JdTMyIHRhYmxlOwotCXJlc291cmNlX3NpemVfdCBwYTsKLQlzdHJ1Y3QgcGNpX3NyaW92ICppb3YgPSBkZXYtPnNyaW92OwotCi0JaWYgKG5yX3ZpcnRmbiA8PSBpb3YtPmluaXRpYWxfVkZzKQotCQlyZXR1cm4gMDsKLQotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGlvdi0+cG9zICsgUENJX1NSSU9WX1ZGTSwgJnRhYmxlKTsKLQliaXIgPSBQQ0lfU1JJT1ZfVkZNX0JJUih0YWJsZSk7Ci0JaWYgKGJpciA+IFBDSV9TVERfUkVTT1VSQ0VfRU5EKQotCQlyZXR1cm4gLUVJTzsKLQotCXRhYmxlID0gUENJX1NSSU9WX1ZGTV9PRkZTRVQodGFibGUpOwotCWlmICh0YWJsZSArIG5yX3ZpcnRmbiA+IHBjaV9yZXNvdXJjZV9sZW4oZGV2LCBiaXIpKQotCQlyZXR1cm4gLUVJTzsKLQotCXBhID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgYmlyKSArIHRhYmxlOwotCWlvdi0+bXN0YXRlID0gaW9yZW1hcChwYSwgbnJfdmlydGZuKTsKLQlpZiAoIWlvdi0+bXN0YXRlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCUlOSVRfV09SSygmaW92LT5tdGFzaywgc3Jpb3ZfbWlncmF0aW9uX3Rhc2spOwotCi0JaW92LT5jdHJsIHw9IFBDSV9TUklPVl9DVFJMX1ZGTSB8IFBDSV9TUklPVl9DVFJMX0lOVFI7Ci0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgaW92LT5wb3MgKyBQQ0lfU1JJT1ZfQ1RSTCwgaW92LT5jdHJsKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzcmlvdl9kaXNhYmxlX21pZ3JhdGlvbihzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXN0cnVjdCBwY2lfc3Jpb3YgKmlvdiA9IGRldi0+c3Jpb3Y7Ci0KLQlpb3YtPmN0cmwgJj0gfihQQ0lfU1JJT1ZfQ1RSTF9WRk0gfCBQQ0lfU1JJT1ZfQ1RSTF9JTlRSKTsKLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBpb3YtPnBvcyArIFBDSV9TUklPVl9DVFJMLCBpb3YtPmN0cmwpOwotCi0JY2FuY2VsX3dvcmtfc3luYygmaW92LT5tdGFzayk7Ci0JaW91bm1hcChpb3YtPm1zdGF0ZSk7Ci19Ci0KIHN0YXRpYyBpbnQgc3Jpb3ZfZW5hYmxlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBucl92aXJ0Zm4pCiB7CiAJaW50IHJjOwpAQCAtMzUxLDEyICsyNjAsNiBAQAogCQkJZ290byBmYWlsZWQ7CiAJfQogCi0JaWYgKGlvdi0+Y2FwICYgUENJX1NSSU9WX0NBUF9WRk0pIHsKLQkJcmMgPSBzcmlvdl9lbmFibGVfbWlncmF0aW9uKGRldiwgbnJfdmlydGZuKTsKLQkJaWYgKHJjKQotCQkJZ290byBmYWlsZWQ7Ci0JfQotCiAJa29iamVjdF91ZXZlbnQoJmRldi0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFKTsKIAlpb3YtPm51bV9WRnMgPSBucl92aXJ0Zm47CiAKQEAgLTM4Nyw5ICsyOTAsNiBAQAogCWlmICghaW92LT5udW1fVkZzKQogCQlyZXR1cm47CiAKLQlpZiAoaW92LT5jYXAgJiBQQ0lfU1JJT1ZfQ0FQX1ZGTSkKLQkJc3Jpb3ZfZGlzYWJsZV9taWdyYXRpb24oZGV2KTsKLQogCWZvciAoaSA9IDA7IGkgPCBpb3YtPm51bV9WRnM7IGkrKykKIAkJdmlydGZuX3JlbW92ZShkZXYsIGksIDApOwogCkBAIC02ODgsMjUgKzU4OCw2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChwY2lfZGlzYWJsZV9zcmlvdik7CiAKIC8qKgotICogcGNpX3NyaW92X21pZ3JhdGlvbiAtIG5vdGlmeSBTUi1JT1YgY29yZSBvZiBWaXJ0dWFsIEZ1bmN0aW9uIE1pZ3JhdGlvbgotICogQGRldjogdGhlIFBDSSBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zIElSUV9IQU5ETEVEIGlmIHRoZSBJUlEgaXMgaGFuZGxlZCwgb3IgSVJRX05PTkUgaWYgbm90LgotICoKLSAqIFBoeXNpY2FsIEZ1bmN0aW9uIGRyaXZlciBpcyByZXNwb25zaWJsZSB0byByZWdpc3RlciBJUlEgaGFuZGxlciB1c2luZwotICogVkYgTWlncmF0aW9uIEludGVycnVwdCBNZXNzYWdlIE51bWJlciwgYW5kIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZQotICogaW50ZXJydXB0IGlzIGdlbmVyYXRlZCBieSB0aGUgaGFyZHdhcmUuCi0gKi8KLWlycXJldHVybl90IHBjaV9zcmlvdl9taWdyYXRpb24oc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlpZiAoIWRldi0+aXNfcGh5c2ZuKQotCQlyZXR1cm4gSVJRX05PTkU7Ci0KLQlyZXR1cm4gc3Jpb3ZfbWlncmF0aW9uKGRldikgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOwotfQotRVhQT1JUX1NZTUJPTF9HUEwocGNpX3NyaW92X21pZ3JhdGlvbik7Ci0KLS8qKgogICogcGNpX251bV92ZiAtIHJldHVybiBudW1iZXIgb2YgVkZzIGFzc29jaWF0ZWQgd2l0aCBhIFBGIGRldmljZV9yZWxlYXNlX2RyaXZlcgogICogQGRldjogdGhlIFBDSSBkZXZpY2UKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKaW5kZXggMjVmMGJjNi4uZDkxMWUwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwpAQCAtNjE2LDE1ICs2MTYsMTEgQEAKIAlpbnQgZXJyb3IgPSAwOwogCiAJLyoKLQkgKiBQQ0kgZGV2aWNlcyBzdXNwZW5kZWQgYXQgcnVuIHRpbWUgbmVlZCB0byBiZSByZXN1bWVkIGF0IHRoaXMKLQkgKiBwb2ludCwgYmVjYXVzZSBpbiBnZW5lcmFsIGl0IGlzIG5lY2Vzc2FyeSB0byByZWNvbmZpZ3VyZSB0aGVtIGZvcgotCSAqIHN5c3RlbSBzdXNwZW5kLiAgTmFtZWx5LCBpZiB0aGUgZGV2aWNlIGlzIHN1cHBvc2VkIHRvIHdha2UgdXAgdGhlCi0JICogc3lzdGVtIGZyb20gdGhlIHNsZWVwIHN0YXRlLCB3ZSBtYXkgbmVlZCB0byByZWNvbmZpZ3VyZSBpdCBmb3IgdGhpcwotCSAqIHB1cnBvc2UuICBJbiB0dXJuLCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBzdXBwb3NlZCB0byB3YWtlIHVwIHRoZQotCSAqIHN5c3RlbSBmcm9tIHRoZSBzbGVlcCBzdGF0ZSwgd2UnbGwgaGF2ZSB0byBwcmV2ZW50IGl0IGZyb20gc2lnbmFsaW5nCi0JICogd2FrZS11cC4KKwkgKiBEZXZpY2VzIGhhdmluZyBwb3dlci5pZ25vcmVfY2hpbGRyZW4gc2V0IG1heSBzdGlsbCBiZSBuZWNlc3NhcnkgZm9yCisJICogc3VzcGVuZGluZyB0aGVpciBjaGlsZHJlbiBpbiB0aGUgbmV4dCBwaGFzZSBvZiBkZXZpY2Ugc3VzcGVuZC4KIAkgKi8KLQlwbV9ydW50aW1lX3Jlc3VtZShkZXYpOworCWlmIChkZXYtPnBvd2VyLmlnbm9yZV9jaGlsZHJlbikKKwkJcG1fcnVudGltZV9yZXN1bWUoZGV2KTsKIAogCWlmIChkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT5wcmVwYXJlKQogCQllcnJvciA9IGRydi0+cG0tPnByZXBhcmUoZGV2KTsKQEAgLTY1NCw2ICs2NTAsMTYgQEAKIAkJZ290byBGaXh1cDsKIAl9CiAKKwkvKgorCSAqIFBDSSBkZXZpY2VzIHN1c3BlbmRlZCBhdCBydW4gdGltZSBuZWVkIHRvIGJlIHJlc3VtZWQgYXQgdGhpcyBwb2ludCwKKwkgKiBiZWNhdXNlIGluIGdlbmVyYWwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlY29uZmlndXJlIHRoZW0gZm9yIHN5c3RlbQorCSAqIHN1c3BlbmQuICBOYW1lbHksIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9zZWQgdG8gd2FrZSB1cCB0aGUgc3lzdGVtCisJICogZnJvbSB0aGUgc2xlZXAgc3RhdGUsIHdlIG1heSBuZWVkIHRvIHJlY29uZmlndXJlIGl0IGZvciB0aGlzIHB1cnBvc2UuCisJICogSW4gdHVybiwgaWYgdGhlIGRldmljZSBpcyBub3Qgc3VwcG9zZWQgdG8gd2FrZSB1cCB0aGUgc3lzdGVtIGZyb20gdGhlCisJICogc2xlZXAgc3RhdGUsIHdlJ2xsIGhhdmUgdG8gcHJldmVudCBpdCBmcm9tIHNpZ25hbGluZyB3YWtlLXVwLgorCSAqLworCXBtX3J1bnRpbWVfcmVzdW1lKGRldik7CisKIAlwY2lfZGV2LT5zdGF0ZV9zYXZlZCA9IGZhbHNlOwogCWlmIChwbS0+c3VzcGVuZCkgewogCQlwY2lfcG93ZXJfdCBwcmV2ID0gcGNpX2Rldi0+Y3VycmVudF9zdGF0ZTsKQEAgLTgwOCw2ICs4MTQsMTQgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJLyoKKwkgKiBUaGlzIHVzZWQgdG8gYmUgZG9uZSBpbiBwY2lfcG1fcHJlcGFyZSgpIGZvciBhbGwgZGV2aWNlcyBhbmQgc29tZQorCSAqIGRyaXZlcnMgbWF5IGRlcGVuZCBvbiBpdCwgc28gZG8gaXQgaGVyZS4gIElkZWFsbHksIHJ1bnRpbWUtc3VzcGVuZGVkCisJICogZGV2aWNlcyBzaG91bGQgbm90IGJlIHRvdWNoZWQgZHVyaW5nIGZyZWV6ZS90aGF3IHRyYW5zaXRpb25zLAorCSAqIGhvd2V2ZXIuCisJICovCisJcG1fcnVudGltZV9yZXN1bWUoZGV2KTsKKwogCXBjaV9kZXYtPnN0YXRlX3NhdmVkID0gZmFsc2U7CiAJaWYgKHBtLT5mcmVlemUpIHsKIAkJaW50IGVycm9yOwpAQCAtOTE1LDYgKzkyOSw5IEBACiAJCWdvdG8gRml4dXA7CiAJfQogCisJLyogVGhlIHJlYXNvbiB0byBkbyB0aGF0IGlzIHRoZSBzYW1lIGFzIGluIHBjaV9wbV9zdXNwZW5kKCkuICovCisJcG1fcnVudGltZV9yZXN1bWUoZGV2KTsKKwogCXBjaV9kZXYtPnN0YXRlX3NhdmVkID0gZmFsc2U7CiAJaWYgKHBtLT5wb3dlcm9mZikgewogCQlpbnQgZXJyb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCmluZGV4IDI3NmVmOWMuLjRlMGFjZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCkBAIC0zNTEsMjggKzM1MSwxNyBAQAogCQkJCQkJCShTX0lXVVNSfFNfSVdHUlApLAogCQkJCQkJCU5VTEwsIGRldl9yZXNjYW5fc3RvcmUpOwogCi1zdGF0aWMgdm9pZCByZW1vdmVfY2FsbGJhY2soc3RydWN0IGRldmljZSAqZGV2KQotewotCXBjaV9zdG9wX2FuZF9yZW1vdmVfYnVzX2RldmljZV9sb2NrZWQodG9fcGNpX2RldihkZXYpKTsKLX0KLQogc3RhdGljIHNzaXplX3QKLXJlbW92ZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkdW1teSwKK3JlbW92ZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JaW50IHJldCA9IDA7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAKIAlpZiAoa3N0cnRvdWwoYnVmLCAwLCAmdmFsKSA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogQW4gYXR0cmlidXRlIGNhbm5vdCBiZSB1bnJlZ2lzdGVyZWQgYnkgb25lIG9mIGl0cyBvd24gbWV0aG9kcywKLQkgKiBzbyB3ZSBoYXZlIHRvIHVzZSB0aGlzIHJvdW5kYWJvdXQgYXBwcm9hY2guCi0JICovCi0JaWYgKHZhbCkKLQkJcmV0ID0gZGV2aWNlX3NjaGVkdWxlX2NhbGxiYWNrKGRldiwgcmVtb3ZlX2NhbGxiYWNrKTsKLQlpZiAocmV0KQotCQljb3VudCA9IHJldDsKKwlpZiAodmFsICYmIGRldmljZV9yZW1vdmVfZmlsZV9zZWxmKGRldiwgYXR0cikpCisJCXBjaV9zdG9wX2FuZF9yZW1vdmVfYnVzX2RldmljZV9sb2NrZWQodG9fcGNpX2RldihkZXYpKTsKIAlyZXR1cm4gY291bnQ7CiB9CiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X3JlbW92ZV9hdHRyID0gX19BVFRSKHJlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5jIGIvZHJpdmVycy9wY2kvcGNpLmMKaW5kZXggZmRiYzI5NC4uNzMyNWQ0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLmMKQEAgLTEwOCwxMiArMTA4LDEyIEBACiAgKi8KIHVuc2lnbmVkIGNoYXIgcGNpX2J1c19tYXhfYnVzbnIoc3RydWN0IHBjaV9idXMqIGJ1cykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IHBjaV9idXMgKnRtcDsKIAl1bnNpZ25lZCBjaGFyIG1heCwgbjsKIAogCW1heCA9IGJ1cy0+YnVzbl9yZXMuZW5kOwotCWxpc3RfZm9yX2VhY2godG1wLCAmYnVzLT5jaGlsZHJlbikgewotCQluID0gcGNpX2J1c19tYXhfYnVzbnIocGNpX2J1c19iKHRtcCkpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmYnVzLT5jaGlsZHJlbiwgbm9kZSkgeworCQluID0gcGNpX2J1c19tYXhfYnVzbnIodG1wKTsKIAkJaWYobiA+IG1heCkKIAkJCW1heCA9IG47CiAJfQpAQCAtNDAxLDMzICs0MDEsNDAgQEAKICAqIEByZXM6IGNoaWxkIHJlc291cmNlIHJlY29yZCBmb3Igd2hpY2ggcGFyZW50IGlzIHNvdWdodAogICoKICAqICBGb3IgZ2l2ZW4gcmVzb3VyY2UgcmVnaW9uIG9mIGdpdmVuIGRldmljZSwgcmV0dXJuIHRoZSByZXNvdXJjZQotICogIHJlZ2lvbiBvZiBwYXJlbnQgYnVzIHRoZSBnaXZlbiByZWdpb24gaXMgY29udGFpbmVkIGluIG9yIHdoZXJlCi0gKiAgaXQgc2hvdWxkIGJlIGFsbG9jYXRlZCBmcm9tLgorICogIHJlZ2lvbiBvZiBwYXJlbnQgYnVzIHRoZSBnaXZlbiByZWdpb24gaXMgY29udGFpbmVkIGluLgogICovCiBzdHJ1Y3QgcmVzb3VyY2UgKgogcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQogewogCWNvbnN0IHN0cnVjdCBwY2lfYnVzICpidXMgPSBkZXYtPmJ1czsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAJaW50IGk7Ci0Jc3RydWN0IHJlc291cmNlICpiZXN0ID0gTlVMTCwgKnI7CiAKIAlwY2lfYnVzX2Zvcl9lYWNoX3Jlc291cmNlKGJ1cywgciwgaSkgewogCQlpZiAoIXIpCiAJCQljb250aW51ZTsKLQkJaWYgKHJlcy0+c3RhcnQgJiYgIShyZXMtPnN0YXJ0ID49IHItPnN0YXJ0ICYmIHJlcy0+ZW5kIDw9IHItPmVuZCkpCi0JCQljb250aW51ZTsJLyogTm90IGNvbnRhaW5lZCAqLwotCQlpZiAoKHJlcy0+ZmxhZ3MgXiByLT5mbGFncykgJiAoSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VSQ0VfTUVNKSkKLQkJCWNvbnRpbnVlOwkvKiBXcm9uZyB0eXBlICovCi0JCWlmICghKChyZXMtPmZsYWdzIF4gci0+ZmxhZ3MpICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkpCi0JCQlyZXR1cm4gcjsJLyogRXhhY3QgbWF0Y2ggKi8KLQkJLyogV2UgY2FuJ3QgaW5zZXJ0IGEgbm9uLXByZWZldGNoIHJlc291cmNlIGluc2lkZSBhIHByZWZldGNoYWJsZSBwYXJlbnQgLi4gKi8KLQkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkKLQkJCWNvbnRpbnVlOwotCQkvKiAuLiBidXQgd2UgY2FuIHB1dCBhIHByZWZldGNoYWJsZSByZXNvdXJjZSBpbnNpZGUgYSBub24tcHJlZmV0Y2hhYmxlIG9uZSAqLwotCQlpZiAoIWJlc3QpCi0JCQliZXN0ID0gcjsKKwkJaWYgKHJlcy0+c3RhcnQgJiYgcmVzb3VyY2VfY29udGFpbnMociwgcmVzKSkgeworCisJCQkvKgorCQkJICogSWYgdGhlIHdpbmRvdyBpcyBwcmVmZXRjaGFibGUgYnV0IHRoZSBCQVIgaXMKKwkJCSAqIG5vdCwgdGhlIGFsbG9jYXRvciBtYWRlIGEgbWlzdGFrZS4KKwkJCSAqLworCQkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCAmJgorCQkJICAgICEocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpKQorCQkJCXJldHVybiBOVUxMOworCisJCQkvKgorCQkJICogSWYgd2UncmUgYmVsb3cgYSB0cmFuc3BhcmVudCBicmlkZ2UsIHRoZXJlIG1heQorCQkJICogYmUgYm90aCBhIHBvc2l0aXZlbHktZGVjb2RlZCBhcGVydHVyZSBhbmQgYQorCQkJICogc3VidHJhY3RpdmVseS1kZWNvZGVkIHJlZ2lvbiB0aGF0IGNvbnRhaW4gdGhlIEJBUi4KKwkJCSAqIFdlIHdhbnQgdGhlIHBvc2l0aXZlbHktZGVjb2RlZCBvbmUsIHNvIHRoaXMgZGVwZW5kcworCQkJICogb24gcGNpX2J1c19mb3JfZWFjaF9yZXNvdXJjZSgpIGdpdmluZyB1cyB0aG9zZQorCQkJICogZmlyc3QuCisJCQkgKi8KKwkJCXJldHVybiByOworCQl9CiAJfQotCXJldHVybiBiZXN0OworCXJldHVybiBOVUxMOwogfQogCiAvKioKQEAgLTExNzgsNiArMTE4NSwxMSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocGNpX2xvYWRfYW5kX2ZyZWVfc2F2ZWRfc3RhdGUpOwogCitpbnQgX193ZWFrIHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFycykKK3sKKwlyZXR1cm4gcGNpX2VuYWJsZV9yZXNvdXJjZXMoZGV2LCBiYXJzKTsKK30KKwogc3RhdGljIGludCBkb19wY2lfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFycykKIHsKIAlpbnQgZXJyOwpAQCAtMTYyNCwyOSArMTYzNiwyNyBAQAogCXN0cnVjdCBwY2lfcG1lX2RldmljZSAqcG1lX2RldiwgKm47CiAKIAltdXRleF9sb2NrKCZwY2lfcG1lX2xpc3RfbXV0ZXgpOwotCWlmICghbGlzdF9lbXB0eSgmcGNpX3BtZV9saXN0KSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG1lX2RldiwgbiwgJnBjaV9wbWVfbGlzdCwgbGlzdCkgewotCQkJaWYgKHBtZV9kZXYtPmRldi0+cG1lX3BvbGwpIHsKLQkJCQlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwbWVfZGV2LCBuLCAmcGNpX3BtZV9saXN0LCBsaXN0KSB7CisJCWlmIChwbWVfZGV2LT5kZXYtPnBtZV9wb2xsKSB7CisJCQlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlOwogCi0JCQkJYnJpZGdlID0gcG1lX2Rldi0+ZGV2LT5idXMtPnNlbGY7Ci0JCQkJLyoKLQkJCQkgKiBJZiBicmlkZ2UgaXMgaW4gbG93IHBvd2VyIHN0YXRlLCB0aGUKLQkJCQkgKiBjb25maWd1cmF0aW9uIHNwYWNlIG9mIHN1Ym9yZGluYXRlIGRldmljZXMKLQkJCQkgKiBtYXkgYmUgbm90IGFjY2Vzc2libGUKLQkJCQkgKi8KLQkJCQlpZiAoYnJpZGdlICYmIGJyaWRnZS0+Y3VycmVudF9zdGF0ZSAhPSBQQ0lfRDApCi0JCQkJCWNvbnRpbnVlOwotCQkJCXBjaV9wbWVfd2FrZXVwKHBtZV9kZXYtPmRldiwgTlVMTCk7Ci0JCQl9IGVsc2UgewotCQkJCWxpc3RfZGVsKCZwbWVfZGV2LT5saXN0KTsKLQkJCQlrZnJlZShwbWVfZGV2KTsKLQkJCX0KKwkJCWJyaWRnZSA9IHBtZV9kZXYtPmRldi0+YnVzLT5zZWxmOworCQkJLyoKKwkJCSAqIElmIGJyaWRnZSBpcyBpbiBsb3cgcG93ZXIgc3RhdGUsIHRoZQorCQkJICogY29uZmlndXJhdGlvbiBzcGFjZSBvZiBzdWJvcmRpbmF0ZSBkZXZpY2VzCisJCQkgKiBtYXkgYmUgbm90IGFjY2Vzc2libGUKKwkJCSAqLworCQkJaWYgKGJyaWRnZSAmJiBicmlkZ2UtPmN1cnJlbnRfc3RhdGUgIT0gUENJX0QwKQorCQkJCWNvbnRpbnVlOworCQkJcGNpX3BtZV93YWtldXAocG1lX2Rldi0+ZGV2LCBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCWxpc3RfZGVsKCZwbWVfZGV2LT5saXN0KTsKKwkJCWtmcmVlKHBtZV9kZXYpOwogCQl9Ci0JCWlmICghbGlzdF9lbXB0eSgmcGNpX3BtZV9saXN0KSkKLQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcGNpX3BtZV93b3JrLAotCQkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKFBNRV9USU1FT1VUKSk7CiAJfQorCWlmICghbGlzdF9lbXB0eSgmcGNpX3BtZV9saXN0KSkKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwY2lfcG1lX3dvcmssCisJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhQTUVfVElNRU9VVCkpOwogCW11dGV4X3VubG9jaygmcGNpX3BtZV9saXN0X211dGV4KTsKIH0KIApAQCAtMjE5MywyMSArMjIwMywxOCBAQAogfQogCiAvKioKLSAqIHBjaV9lbmFibGVfYWNzIC0gZW5hYmxlIEFDUyBpZiBoYXJkd2FyZSBzdXBwb3J0IGl0CisgKiBwY2lfc3RkX2VuYWJsZV9hY3MgLSBlbmFibGUgQUNTIG9uIGRldmljZXMgdXNpbmcgc3RhbmRhcmQgQUNTIGNhcGFiaWxpdGVzCiAgKiBAZGV2OiB0aGUgUENJIGRldmljZQogICovCi12b2lkIHBjaV9lbmFibGVfYWNzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgaW50IHBjaV9zdGRfZW5hYmxlX2FjcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCWludCBwb3M7CiAJdTE2IGNhcDsKIAl1MTYgY3RybDsKIAotCWlmICghcGNpX2Fjc19lbmFibGUpCi0JCXJldHVybjsKLQogCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KGRldiwgUENJX0VYVF9DQVBfSURfQUNTKTsKIAlpZiAoIXBvcykKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVOT0RFVjsKIAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0FDU19DQVAsICZjYXApOwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0FDU19DVFJMLCAmY3RybCk7CkBAIC0yMjI1LDYgKzIyMzIsMjMgQEAKIAljdHJsIHw9IChjYXAgJiBQQ0lfQUNTX1VGKTsKIAogCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9BQ1NfQ1RSTCwgY3RybCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwY2lfZW5hYmxlX2FjcyAtIGVuYWJsZSBBQ1MgaWYgaGFyZHdhcmUgc3VwcG9ydCBpdAorICogQGRldjogdGhlIFBDSSBkZXZpY2UKKyAqLwordm9pZCBwY2lfZW5hYmxlX2FjcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWlmICghcGNpX2Fjc19lbmFibGUpCisJCXJldHVybjsKKworCWlmICghcGNpX3N0ZF9lbmFibGVfYWNzKGRldikpCisJCXJldHVybjsKKworCXBjaV9kZXZfc3BlY2lmaWNfZW5hYmxlX2FjcyhkZXYpOwogfQogCiBzdGF0aWMgYm9vbCBwY2lfYWNzX2ZsYWdzX2VuYWJsZWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUxNiBhY3NfZmxhZ3MpCkBAIC00MjUwLDYgKzQyNzQsNyBAQAogCQkJCSJSb3VuZGluZyB1cCBzaXplIG9mIHJlc291cmNlICMlZCB0byAlI2xseC5cbiIsCiAJCQkJaSwgKHVuc2lnbmVkIGxvbmcgbG9uZylzaXplKTsKIAkJfQorCQlyLT5mbGFncyB8PSBJT1JFU09VUkNFX1VOU0VUOwogCQlyLT5lbmQgPSBzaXplIC0gMTsKIAkJci0+c3RhcnQgPSAwOwogCX0KQEAgLTQyNjMsNiArNDI4OCw3IEBACiAJCQlyID0gJmRldi0+cmVzb3VyY2VbaV07CiAJCQlpZiAoIShyLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSkKIAkJCQljb250aW51ZTsKKwkJCXItPmZsYWdzIHw9IElPUkVTT1VSQ0VfVU5TRVQ7CiAJCQlyLT5lbmQgPSByZXNvdXJjZV9zaXplKHIpIC0gMTsKIAkJCXItPnN0YXJ0ID0gMDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmggYi9kcml2ZXJzL3BjaS9wY2kuaAppbmRleCA0ZGYzOGRmLi42YmQwODIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuaAorKysgYi9kcml2ZXJzL3BjaS9wY2kuaApAQCAtMSw4ICsxLDYgQEAKICNpZm5kZWYgRFJJVkVSU19QQ0lfSAogI2RlZmluZSBEUklWRVJTX1BDSV9ICiAKLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLQogI2RlZmluZSBQQ0lfQ0ZHX1NQQUNFX1NJWkUJMjU2CiAjZGVmaW5lIFBDSV9DRkdfU1BBQ0VfRVhQX1NJWkUJNDA5NgogCkBAIC0yNDAsOCArMjM4LDYgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwkvKiBsb3dlc3QgbnVtYmVyZWQgUEYgKi8KIAlzdHJ1Y3QgcGNpX2RldiAqc2VsZjsJLyogdGhpcyBQRiAqLwogCXN0cnVjdCBtdXRleCBsb2NrOwkvKiBsb2NrIGZvciBWRiBidXMgKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbXRhc2s7IC8qIFZGIE1pZ3JhdGlvbiB0YXNrICovCi0JdTggX19pb21lbSAqbXN0YXRlOwkvKiBWRiBNaWdyYXRpb24gU3RhdGUgQXJyYXkgKi8KIH07CiAKICNpZmRlZiBDT05GSUdfUENJX0FUUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYmUuYyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKaW5kZXggNmUzNDQ5OC4uZWYwOWY1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYmUuYworKysgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCkBAIC0yNTIsNiArMjUyLDcgQEAKIAkJCS8qIEFkZHJlc3MgYWJvdmUgMzItYml0IGJvdW5kYXJ5OyBkaXNhYmxlIHRoZSBCQVIgKi8KIAkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBwb3MsIDApOwogCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIDQsIDApOworCQkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX1VOU0VUOwogCQkJcmVnaW9uLnN0YXJ0ID0gMDsKIAkJCXJlZ2lvbi5lbmQgPSBzejY0OwogCQkJYmFyX2Rpc2FibGVkID0gdHJ1ZTsKQEAgLTczMSwyMiArNzMyLDYgQEAKIAlyZXR1cm4gY2hpbGQ7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaV9maXh1cF9wYXJlbnRfc3Vib3JkaW5hdGVfYnVzbnIoc3RydWN0IHBjaV9idXMgKmNoaWxkLCBpbnQgbWF4KQotewotCXN0cnVjdCBwY2lfYnVzICpwYXJlbnQgPSBjaGlsZC0+cGFyZW50OwotCi0JLyogQXR0ZW1wdHMgdG8gZml4IHRoYXQgdXAgYXJlIHJlYWxseSBkYW5nZXJvdXMgdW5sZXNzCi0JICAgd2UncmUgZ29pbmcgdG8gcmUtYXNzaWduIGFsbCBidXMgbnVtYmVycy4gKi8KLQlpZiAoIXBjaWJpb3NfYXNzaWduX2FsbF9idXNzZXMoKSkKLQkJcmV0dXJuOwotCi0Jd2hpbGUgKHBhcmVudC0+cGFyZW50ICYmIHBhcmVudC0+YnVzbl9yZXMuZW5kIDwgbWF4KSB7Ci0JCXBhcmVudC0+YnVzbl9yZXMuZW5kID0gbWF4OwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGFyZW50LT5zZWxmLCBQQ0lfU1VCT1JESU5BVEVfQlVTLCBtYXgpOwotCQlwYXJlbnQgPSBwYXJlbnQtPnBhcmVudDsKLQl9Ci19Ci0KIC8qCiAgKiBJZiBpdCdzIGEgYnJpZGdlLCBjb25maWd1cmUgaXQgYW5kIHNjYW4gdGhlIGJ1cyBiZWhpbmQgaXQuCiAgKiBGb3IgQ2FyZEJ1cyBicmlkZ2VzLCB3ZSBkb24ndCBzY2FuIGJlaGluZCBhcyB0aGUgZGV2aWNlcyB3aWxsCkBAIC03ODIsNyArNzY3LDcgQEAKIAkvKiBDaGVjayBpZiBzZXR1cCBpcyBzZW5zaWJsZSBhdCBhbGwgKi8KIAlpZiAoIXBhc3MgJiYKIAkgICAgKHByaW1hcnkgIT0gYnVzLT5udW1iZXIgfHwgc2Vjb25kYXJ5IDw9IGJ1cy0+bnVtYmVyIHx8Ci0JICAgICBzZWNvbmRhcnkgPiBzdWJvcmRpbmF0ZSkpIHsKKwkgICAgIHNlY29uZGFyeSA+IHN1Ym9yZGluYXRlIHx8IHN1Ym9yZGluYXRlID4gYnVzLT5idXNuX3Jlcy5lbmQpKSB7CiAJCWRldl9pbmZvKCZkZXYtPmRldiwgImJyaWRnZSBjb25maWd1cmF0aW9uIGludmFsaWQgKFtidXMgJTAyeC0lMDJ4XSksIHJlY29uZmlndXJpbmdcbiIsCiAJCQkgc2Vjb25kYXJ5LCBzdWJvcmRpbmF0ZSk7CiAJCWJyb2tlbiA9IDE7CkBAIC04MDUsMTEgKzc5MCwxMCBAQAogCQkJZ290byBvdXQ7CiAKIAkJLyoKLQkJICogSWYgd2UgYWxyZWFkeSBnb3QgdG8gdGhpcyBidXMgdGhyb3VnaCBhIGRpZmZlcmVudCBicmlkZ2UsCi0JCSAqIGRvbid0IHJlLWFkZCBpdC4gVGhpcyBjYW4gaGFwcGVuIHdpdGggdGhlIGk0NTBOWCBjaGlwc2V0LgotCQkgKgotCQkgKiBIb3dldmVyLCB3ZSBjb250aW51ZSB0byBkZXNjZW5kIGRvd24gdGhlIGhpZXJhcmNoeSBhbmQKLQkJICogc2NhbiByZW1haW5pbmcgY2hpbGQgYnVzZXMuCisJCSAqIFRoZSBidXMgbWlnaHQgYWxyZWFkeSBleGlzdCBmb3IgdHdvIHJlYXNvbnM6IEVpdGhlciB3ZSBhcmUKKwkJICogcmVzY2FubmluZyB0aGUgYnVzIG9yIHRoZSBidXMgaXMgcmVhY2hhYmxlIHRocm91Z2ggbW9yZSB0aGFuCisJCSAqIG9uZSBicmlkZ2UuIFRoZSBzZWNvbmQgY2FzZSBjYW4gaGFwcGVuIHdpdGggdGhlIGk0NTBOWAorCQkgKiBjaGlwc2V0LgogCQkgKi8KIAkJY2hpbGQgPSBwY2lfZmluZF9idXMocGNpX2RvbWFpbl9ucihidXMpLCBzZWNvbmRhcnkpOwogCQlpZiAoIWNoaWxkKSB7CkBAIC04MjIsMTcgKzgwNiwxOSBAQAogCQl9CiAKIAkJY21heCA9IHBjaV9zY2FuX2NoaWxkX2J1cyhjaGlsZCk7Ci0JCWlmIChjbWF4ID4gbWF4KQotCQkJbWF4ID0gY21heDsKLQkJaWYgKGNoaWxkLT5idXNuX3Jlcy5lbmQgPiBtYXgpCi0JCQltYXggPSBjaGlsZC0+YnVzbl9yZXMuZW5kOworCQlpZiAoY21heCA+IHN1Ym9yZGluYXRlKQorCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiYnJpZGdlIGhhcyBzdWJvcmRpbmF0ZSAlMDJ4IGJ1dCBtYXggYnVzbiAlMDJ4XG4iLAorCQkJCSBzdWJvcmRpbmF0ZSwgY21heCk7CisJCS8qIHN1Ym9yZGluYXRlIHNob3VsZCBlcXVhbCBjaGlsZC0+YnVzbl9yZXMuZW5kICovCisJCWlmIChzdWJvcmRpbmF0ZSA+IG1heCkKKwkJCW1heCA9IHN1Ym9yZGluYXRlOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIFdlIG5lZWQgdG8gYXNzaWduIGEgbnVtYmVyIHRvIHRoaXMgYnVzIHdoaWNoIHdlIGFsd2F5cwogCQkgKiBkbyBpbiB0aGUgc2Vjb25kIHBhc3MuCiAJCSAqLwogCQlpZiAoIXBhc3MpIHsKLQkJCWlmIChwY2liaW9zX2Fzc2lnbl9hbGxfYnVzc2VzKCkgfHwgYnJva2VuKQorCQkJaWYgKHBjaWJpb3NfYXNzaWduX2FsbF9idXNzZXMoKSB8fCBicm9rZW4gfHwgaXNfY2FyZGJ1cykKIAkJCQkvKiBUZW1wb3JhcmlseSBkaXNhYmxlIGZvcndhcmRpbmcgb2YgdGhlCiAJCQkJICAgY29uZmlndXJhdGlvbiBjeWNsZXMgb24gYWxsIGJyaWRnZXMgaW4KIAkJCQkgICB0aGlzIGJ1cyBzZWdtZW50IHRvIGF2b2lkIHBvc3NpYmxlCkBAIC04NDQsMTkgKzgzMCwyNSBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAorCQlpZiAobWF4ID49IGJ1cy0+YnVzbl9yZXMuZW5kKSB7CisJCQlkZXZfd2FybigmZGV2LT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBjaGlsZCBidXMgJTAyeCBmcm9tICVwUlxuIiwKKwkJCQkgbWF4LCAmYnVzLT5idXNuX3Jlcyk7CisJCQlnb3RvIG91dDsKKwkJfQorCiAJCS8qIENsZWFyIGVycm9ycyAqLwogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfU1RBVFVTLCAweGZmZmYpOwogCi0JCS8qIFByZXZlbnQgYXNzaWduaW5nIGEgYnVzIG51bWJlciB0aGF0IGFscmVhZHkgZXhpc3RzLgotCQkgKiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGJyaWRnZSBpcyBob3QtcGx1Z2dlZCwgc28gaW4KLQkJICogdGhpcyBjYXNlIHdlIG9ubHkgcmUtc2NhbiB0aGlzIGJ1cy4gKi8KKwkJLyogVGhlIGJ1cyB3aWxsIGFscmVhZHkgZXhpc3QgaWYgd2UgYXJlIHJlc2Nhbm5pbmcgKi8KIAkJY2hpbGQgPSBwY2lfZmluZF9idXMocGNpX2RvbWFpbl9ucihidXMpLCBtYXgrMSk7CiAJCWlmICghY2hpbGQpIHsKLQkJCWNoaWxkID0gcGNpX2FkZF9uZXdfYnVzKGJ1cywgZGV2LCArK21heCk7CisJCQljaGlsZCA9IHBjaV9hZGRfbmV3X2J1cyhidXMsIGRldiwgbWF4KzEpOwogCQkJaWYgKCFjaGlsZCkKIAkJCQlnb3RvIG91dDsKLQkJCXBjaV9idXNfaW5zZXJ0X2J1c25fcmVzKGNoaWxkLCBtYXgsIDB4ZmYpOworCQkJcGNpX2J1c19pbnNlcnRfYnVzbl9yZXMoY2hpbGQsIG1heCsxLAorCQkJCQkJYnVzLT5idXNuX3Jlcy5lbmQpOwogCQl9CisJCW1heCsrOwogCQlidXNlcyA9IChidXNlcyAmIDB4ZmYwMDAwMDApCiAJCSAgICAgIHwgKCh1bnNpZ25lZCBpbnQpKGNoaWxkLT5wcmltYXJ5KSAgICAgPDwgIDApCiAJCSAgICAgIHwgKCh1bnNpZ25lZCBpbnQpKGNoaWxkLT5idXNuX3Jlcy5zdGFydCkgICA8PCAgOCkKQEAgLTg3OCwyMCArODcwLDcgQEAKIAogCQlpZiAoIWlzX2NhcmRidXMpIHsKIAkJCWNoaWxkLT5icmlkZ2VfY3RsID0gYmN0bDsKLQkJCS8qCi0JCQkgKiBBZGp1c3Qgc3Vib3JkaW5hdGUgYnVzbnIgaW4gcGFyZW50IGJ1c2VzLgotCQkJICogV2UgZG8gdGhpcyBiZWZvcmUgc2Nhbm5pbmcgZm9yIGNoaWxkcmVuIGJlY2F1c2UKLQkJCSAqIHNvbWUgZGV2aWNlcyBtYXkgbm90IGJlIGRldGVjdGVkIGlmIHRoZSBiaW9zCi0JCQkgKiB3YXMgbGF6eS4KLQkJCSAqLwotCQkJcGNpX2ZpeHVwX3BhcmVudF9zdWJvcmRpbmF0ZV9idXNucihjaGlsZCwgbWF4KTsKLQkJCS8qIE5vdyB3ZSBjYW4gc2NhbiBhbGwgc3Vib3JkaW5hdGUgYnVzZXMuLi4gKi8KIAkJCW1heCA9IHBjaV9zY2FuX2NoaWxkX2J1cyhjaGlsZCk7Ci0JCQkvKgotCQkJICogbm93IGZpeCBpdCB1cCBhZ2FpbiBzaW5jZSB3ZSBoYXZlIGZvdW5kCi0JCQkgKiB0aGUgcmVhbCB2YWx1ZSBvZiBtYXguCi0JCQkgKi8KLQkJCXBjaV9maXh1cF9wYXJlbnRfc3Vib3JkaW5hdGVfYnVzbnIoY2hpbGQsIG1heCk7CiAJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogRm9yIENhcmRCdXMgYnJpZGdlcywgd2UgbGVhdmUgNCBidXMgbnVtYmVycwpAQCAtOTIyLDExICs5MDEsMTUgQEAKIAkJCQl9CiAJCQl9CiAJCQltYXggKz0gaTsKLQkJCXBjaV9maXh1cF9wYXJlbnRfc3Vib3JkaW5hdGVfYnVzbnIoY2hpbGQsIG1heCk7CiAJCX0KIAkJLyoKIAkJICogU2V0IHRoZSBzdWJvcmRpbmF0ZSBidXMgbnVtYmVyIHRvIGl0cyByZWFsIHZhbHVlLgogCQkgKi8KKwkJaWYgKG1heCA+IGJ1cy0+YnVzbl9yZXMuZW5kKSB7CisJCQlkZXZfd2FybigmZGV2LT5kZXYsICJtYXggYnVzbiAlMDJ4IGlzIG91dHNpZGUgJXBSXG4iLAorCQkJCSBtYXgsICZidXMtPmJ1c25fcmVzKTsKKwkJCW1heCA9IGJ1cy0+YnVzbl9yZXMuZW5kOworCQl9CiAJCXBjaV9idXNfdXBkYXRlX2J1c25fcmVzX2VuZChjaGlsZCwgbWF4KTsKIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX1NVQk9SRElOQVRFX0JVUywgbWF4KTsKIAl9CkBAIC0xMTI1LDEwICsxMTA4LDEwIEBACiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX1NVQlNZU1RFTV9JRCwgJmRldi0+c3Vic3lzdGVtX2RldmljZSk7CiAKIAkJLyoKLQkJICoJRG8gdGhlIHVnbHkgbGVnYWN5IG1vZGUgc3R1ZmYgaGVyZSByYXRoZXIgdGhhbiBicm9rZW4gY2hpcAotCQkgKglxdWlyayBjb2RlLiBMZWdhY3kgbW9kZSBBVEEgY29udHJvbGxlcnMgaGF2ZSBmaXhlZAotCQkgKglhZGRyZXNzZXMuIFRoZXNlIGFyZSBub3QgYWx3YXlzIGVjaG9lZCBpbiBCQVIwLTMsIGFuZAotCQkgKglCQVIwLTMgaW4gYSBmZXcgY2FzZXMgY29udGFpbiBqdW5rIQorCQkgKiBEbyB0aGUgdWdseSBsZWdhY3kgbW9kZSBzdHVmZiBoZXJlIHJhdGhlciB0aGFuIGJyb2tlbiBjaGlwCisJCSAqIHF1aXJrIGNvZGUuIExlZ2FjeSBtb2RlIEFUQSBjb250cm9sbGVycyBoYXZlIGZpeGVkCisJCSAqIGFkZHJlc3Nlcy4gVGhlc2UgYXJlIG5vdCBhbHdheXMgZWNob2VkIGluIEJBUjAtMywgYW5kCisJCSAqIEJBUjAtMyBpbiBhIGZldyBjYXNlcyBjb250YWluIGp1bmshCiAJCSAqLwogCQlpZiAoY2xhc3MgPT0gUENJX0NMQVNTX1NUT1JBR0VfSURFKSB7CiAJCQl1OCBwcm9naWY7CkBAIC0xMTM5LDExICsxMTIyLDE1IEBACiAJCQkJcmVzID0gJmRldi0+cmVzb3VyY2VbMF07CiAJCQkJcmVzLT5mbGFncyA9IExFR0FDWV9JT19SRVNPVVJDRTsKIAkJCQlwY2liaW9zX2J1c190b19yZXNvdXJjZShkZXYtPmJ1cywgcmVzLCAmcmVnaW9uKTsKKwkJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJsZWdhY3kgSURFIHF1aXJrOiByZWcgMHgxMDogJXBSXG4iLAorCQkJCQkgcmVzKTsKIAkJCQlyZWdpb24uc3RhcnQgPSAweDNGNjsKIAkJCQlyZWdpb24uZW5kID0gMHgzRjY7CiAJCQkJcmVzID0gJmRldi0+cmVzb3VyY2VbMV07CiAJCQkJcmVzLT5mbGFncyA9IExFR0FDWV9JT19SRVNPVVJDRTsKIAkJCQlwY2liaW9zX2J1c190b19yZXNvdXJjZShkZXYtPmJ1cywgcmVzLCAmcmVnaW9uKTsKKwkJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJsZWdhY3kgSURFIHF1aXJrOiByZWcgMHgxNDogJXBSXG4iLAorCQkJCQkgcmVzKTsKIAkJCX0KIAkJCWlmICgocHJvZ2lmICYgNCkgPT0gMCkgewogCQkJCXJlZ2lvbi5zdGFydCA9IDB4MTcwOwpAQCAtMTE1MSwxMSArMTEzOCwxNSBAQAogCQkJCXJlcyA9ICZkZXYtPnJlc291cmNlWzJdOwogCQkJCXJlcy0+ZmxhZ3MgPSBMRUdBQ1lfSU9fUkVTT1VSQ0U7CiAJCQkJcGNpYmlvc19idXNfdG9fcmVzb3VyY2UoZGV2LT5idXMsIHJlcywgJnJlZ2lvbik7CisJCQkJZGV2X2luZm8oJmRldi0+ZGV2LCAibGVnYWN5IElERSBxdWlyazogcmVnIDB4MTg6ICVwUlxuIiwKKwkJCQkJIHJlcyk7CiAJCQkJcmVnaW9uLnN0YXJ0ID0gMHgzNzY7CiAJCQkJcmVnaW9uLmVuZCA9IDB4Mzc2OwogCQkJCXJlcyA9ICZkZXYtPnJlc291cmNlWzNdOwogCQkJCXJlcy0+ZmxhZ3MgPSBMRUdBQ1lfSU9fUkVTT1VSQ0U7CiAJCQkJcGNpYmlvc19idXNfdG9fcmVzb3VyY2UoZGV2LT5idXMsIHJlcywgJnJlZ2lvbik7CisJCQkJZGV2X2luZm8oJmRldi0+ZGV2LCAibGVnYWN5IElERSBxdWlyazogcmVnIDB4MWM6ICVwUlxuIiwKKwkJCQkJIHJlcyk7CiAJCQl9CiAJCX0KIAkJYnJlYWs7CkBAIC0xODM1LDcgKzE4MjYsNyBAQAogCQlyZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfUENJX0ZJWEVEOwogCX0KIAotCWNvbmZsaWN0ID0gaW5zZXJ0X3Jlc291cmNlX2NvbmZsaWN0KHBhcmVudF9yZXMsIHJlcyk7CisJY29uZmxpY3QgPSByZXF1ZXN0X3Jlc291cmNlX2NvbmZsaWN0KHBhcmVudF9yZXMsIHJlcyk7CiAKIAlpZiAoY29uZmxpY3QpCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmItPmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKaW5kZXggNWNiNzI2Yy4uZTcyOTIwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcXVpcmtzLmMKKysrIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKQEAgLTI5Niw2ICsyOTYsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkZXYtPnJlc291cmNlWzBdOwogCiAJaWYgKChyLT5zdGFydCAmIDB4M2ZmZmZmZikgfHwgci0+ZW5kICE9IHItPnN0YXJ0ICsgMHgzZmZmZmZmKSB7CisJCXItPmZsYWdzIHw9IElPUkVTT1VSQ0VfVU5TRVQ7CiAJCXItPnN0YXJ0ID0gMDsKIAkJci0+ZW5kID0gMHgzZmZmZmZmOwogCX0KQEAgLTkzNyw2ICs5MzgsOCBAQAogc3RhdGljIHZvaWQgcXVpcmtfZHVub3JkKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHJlc291cmNlICpyID0gJmRldi0+cmVzb3VyY2UgWzFdOworCisJci0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9VTlNFVDsKIAlyLT5zdGFydCA9IDA7CiAJci0+ZW5kID0gMHhmZmZmZmY7CiB9CkBAIC0xNzQwLDYgKzE3NDMsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkZXYtPnJlc291cmNlWzBdOwogCiAJaWYgKHItPnN0YXJ0ICYgMHg4KSB7CisJCXItPmZsYWdzIHw9IElPUkVTT1VSQ0VfVU5TRVQ7CiAJCXItPnN0YXJ0ID0gMDsKIAkJci0+ZW5kID0gMHhmOwogCX0KQEAgLTE3NjksNiArMTc3Myw3IEBACiAJCQlkZXZfaW5mbygmZGV2LT5kZXYsCiAJCQkJICJSZS1hbGxvY2F0aW5nIFBMWCBQQ0kgOTA1MCBCQVIgJXUgdG8gbGVuZ3RoIDI1NiB0byBhdm9pZCBiaXQgNyBidWdcbiIsCiAJCQkJIGJhcik7CisJCQlyLT5mbGFncyB8PSBJT1JFU09VUkNFX1VOU0VUOwogCQkJci0+c3RhcnQgPSAwOwogCQkJci0+ZW5kID0gMHhmZjsKIAkJfQpAQCAtMzQyMyw2ICszNDI4LDYxIEBACiAjZW5kaWYKIH0KIAorLyoKKyAqIE1hbnkgSW50ZWwgUENIIHJvb3QgcG9ydHMgZG8gcHJvdmlkZSBBQ1MtbGlrZSBmZWF0dXJlcyB0byBkaXNhYmxlIHBlZXIKKyAqIHRyYW5zYWN0aW9ucyBhbmQgdmFsaWRhdGUgYnVzIG51bWJlcnMgaW4gcmVxdWVzdHMsIGJ1dCBkbyBub3QgcHJvdmlkZSBhbgorICogYWN0dWFsIFBDSWUgQUNTIGNhcGFiaWxpdHkuICBUaGlzIGlzIHRoZSBsaXN0IG9mIGRldmljZSBJRHMga25vd24gdG8gZmFsbAorICogaW50byB0aGF0IGNhdGVnb3J5IGFzIHByb3ZpZGVkIGJ5IEludGVsIGluIFJlZCBIYXQgYnVnemlsbGEgMTAzNzY4NC4KKyAqLworc3RhdGljIGNvbnN0IHUxNiBwY2lfcXVpcmtfaW50ZWxfcGNoX2Fjc19pZHNbXSA9IHsKKwkvKiBJYmV4cGVhayBQQ0ggKi8KKwkweDNiNDIsIDB4M2I0MywgMHgzYjQ0LCAweDNiNDUsIDB4M2I0NiwgMHgzYjQ3LCAweDNiNDgsIDB4M2I0OSwKKwkweDNiNGEsIDB4M2I0YiwgMHgzYjRjLCAweDNiNGQsIDB4M2I0ZSwgMHgzYjRmLCAweDNiNTAsIDB4M2I1MSwKKwkvKiBDb3VnYXJwb2ludCBQQ0ggKi8KKwkweDFjMTAsIDB4MWMxMSwgMHgxYzEyLCAweDFjMTMsIDB4MWMxNCwgMHgxYzE1LCAweDFjMTYsIDB4MWMxNywKKwkweDFjMTgsIDB4MWMxOSwgMHgxYzFhLCAweDFjMWIsIDB4MWMxYywgMHgxYzFkLCAweDFjMWUsIDB4MWMxZiwKKwkvKiBQYW50aGVycG9pbnQgUENIICovCisJMHgxZTEwLCAweDFlMTEsIDB4MWUxMiwgMHgxZTEzLCAweDFlMTQsIDB4MWUxNSwgMHgxZTE2LCAweDFlMTcsCisJMHgxZTE4LCAweDFlMTksIDB4MWUxYSwgMHgxZTFiLCAweDFlMWMsIDB4MWUxZCwgMHgxZTFlLCAweDFlMWYsCisJLyogTHlueHBvaW50LUggUENIICovCisJMHg4YzEwLCAweDhjMTEsIDB4OGMxMiwgMHg4YzEzLCAweDhjMTQsIDB4OGMxNSwgMHg4YzE2LCAweDhjMTcsCisJMHg4YzE4LCAweDhjMTksIDB4OGMxYSwgMHg4YzFiLCAweDhjMWMsIDB4OGMxZCwgMHg4YzFlLCAweDhjMWYsCisJLyogTHlueHBvaW50LUxQIFBDSCAqLworCTB4OWMxMCwgMHg5YzExLCAweDljMTIsIDB4OWMxMywgMHg5YzE0LCAweDljMTUsIDB4OWMxNiwgMHg5YzE3LAorCTB4OWMxOCwgMHg5YzE5LCAweDljMWEsIDB4OWMxYiwKKwkvKiBXaWxkY2F0IFBDSCAqLworCTB4OWM5MCwgMHg5YzkxLCAweDljOTIsIDB4OWM5MywgMHg5Yzk0LCAweDljOTUsIDB4OWM5NiwgMHg5Yzk3LAorCTB4OWM5OCwgMHg5Yzk5LCAweDljOWEsIDB4OWM5YiwKK307CisKK3N0YXRpYyBib29sIHBjaV9xdWlya19pbnRlbF9wY2hfYWNzX21hdGNoKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IGk7CisKKwkvKiBGaWx0ZXIgb3V0IGEgZmV3IG9idmlvdXMgbm9uLW1hdGNoZXMgZmlyc3QgKi8KKwlpZiAoIXBjaV9pc19wY2llKGRldikgfHwgcGNpX3BjaWVfdHlwZShkZXYpICE9IFBDSV9FWFBfVFlQRV9ST09UX1BPUlQpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBjaV9xdWlya19pbnRlbF9wY2hfYWNzX2lkcyk7IGkrKykKKwkJaWYgKHBjaV9xdWlya19pbnRlbF9wY2hfYWNzX2lkc1tpXSA9PSBkZXYtPmRldmljZSkKKwkJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCisjZGVmaW5lIElOVEVMX1BDSF9BQ1NfRkxBR1MgKFBDSV9BQ1NfUlIgfCBQQ0lfQUNTX0NSIHwgUENJX0FDU19VRiB8IFBDSV9BQ1NfU1YpCisKK3N0YXRpYyBpbnQgcGNpX3F1aXJrX2ludGVsX3BjaF9hY3Moc3RydWN0IHBjaV9kZXYgKmRldiwgdTE2IGFjc19mbGFncykKK3sKKwl1MTYgZmxhZ3MgPSBkZXYtPmRldl9mbGFncyAmIFBDSV9ERVZfRkxBR1NfQUNTX0VOQUJMRURfUVVJUksgPworCQkgICAgSU5URUxfUENIX0FDU19GTEFHUyA6IDA7CisKKwlpZiAoIXBjaV9xdWlya19pbnRlbF9wY2hfYWNzX21hdGNoKGRldikpCisJCXJldHVybiAtRU5PVFRZOworCisJcmV0dXJuIGFjc19mbGFncyAmIH5mbGFncyA/IDAgOiAxOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZfYWNzX2VuYWJsZWQgewogCXUxNiB2ZW5kb3I7CiAJdTE2IGRldmljZTsKQEAgLTM0MzQsNiArMzQ5NCw3IEBACiAJeyBQQ0lfVkVORE9SX0lEX0FUSSwgMHg0MzlkLCBwY2lfcXVpcmtfYW1kX3NiX2FjcyB9LAogCXsgUENJX1ZFTkRPUl9JRF9BVEksIDB4NDM4NCwgcGNpX3F1aXJrX2FtZF9zYl9hY3MgfSwKIAl7IFBDSV9WRU5ET1JfSURfQVRJLCAweDQzOTksIHBjaV9xdWlya19hbWRfc2JfYWNzIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfQU5ZX0lELCBwY2lfcXVpcmtfaW50ZWxfcGNoX2FjcyB9LAogCXsgMCB9CiB9OwogCkBAIC0zNDYxLDMgKzM1MjIsMTMyIEBACiAKIAlyZXR1cm4gLUVOT1RUWTsKIH0KKworLyogQ29uZmlnIHNwYWNlIG9mZnNldCBvZiBSb290IENvbXBsZXggQmFzZSBBZGRyZXNzIHJlZ2lzdGVyICovCisjZGVmaW5lIElOVEVMX0xQQ19SQ0JBX1JFRyAweGYwCisvKiAzMToxNCBSQ0JBIGFkZHJlc3MgKi8KKyNkZWZpbmUgSU5URUxfTFBDX1JDQkFfTUFTSyAweGZmZmZjMDAwCisvKiBSQ0JBIEVuYWJsZSAqLworI2RlZmluZSBJTlRFTF9MUENfUkNCQV9FTkFCTEUgKDEgPDwgMCkKKworLyogQmFja2JvbmUgU2NyYXRjaCBQYWQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSU5URUxfQlNQUl9SRUcgMHgxMTA0CisvKiBCYWNrYm9uZSBQZWVyIE5vbi1Qb3N0ZWQgRGlzYWJsZSAqLworI2RlZmluZSBJTlRFTF9CU1BSX1JFR19CUE5QRCAoMSA8PCA4KQorLyogQmFja2JvbmUgUGVlciBQb3N0ZWQgRGlzYWJsZSAqLworI2RlZmluZSBJTlRFTF9CU1BSX1JFR19CUFBEICAoMSA8PCA5KQorCisvKiBVcHN0cmVhbSBQZWVyIERlY29kZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIElOVEVMX1VQRENSX1JFRyAweDExMTQKKy8qIDU6MCBQZWVyIERlY29kZSBFbmFibGUgYml0cyAqLworI2RlZmluZSBJTlRFTF9VUERDUl9SRUdfTUFTSyAweDNmCisKK3N0YXRpYyBpbnQgcGNpX3F1aXJrX2VuYWJsZV9pbnRlbF9scGNfYWNzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTMyIHJjYmEsIGJzcHIsIHVwZGNyOworCXZvaWQgX19pb21lbSAqcmNiYV9tZW07CisKKwkvKgorCSAqIFJlYWQgdGhlIFJDQkEgcmVnaXN0ZXIgZnJvbSB0aGUgTFBDIChEMzE6RjApLiAgUENIIHJvb3QgcG9ydHMKKwkgKiBhcmUgRDI4OkYqIGFuZCB0aGVyZWZvcmUgZ2V0IHByb2JlZCBiZWZvcmUgTFBDLCB0aHVzIHdlIGNhbid0CisJICogdXNlIHBjaV9nZXRfc2xvdC9wY2lfcmVhZF9jb25maWdfZHdvcmQgaGVyZS4KKwkgKi8KKwlwY2lfYnVzX3JlYWRfY29uZmlnX2R3b3JkKGRldi0+YnVzLCBQQ0lfREVWRk4oMzEsIDApLAorCQkJCSAgSU5URUxfTFBDX1JDQkFfUkVHLCAmcmNiYSk7CisJaWYgKCEocmNiYSAmIElOVEVMX0xQQ19SQ0JBX0VOQUJMRSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmNiYV9tZW0gPSBpb3JlbWFwX25vY2FjaGUocmNiYSAmIElOVEVMX0xQQ19SQ0JBX01BU0ssCisJCQkJICAgUEFHRV9BTElHTihJTlRFTF9VUERDUl9SRUcpKTsKKwlpZiAoIXJjYmFfbWVtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogVGhlIEJTUFIgY2FuIGRpc2FsbG93IHBlZXIgY3ljbGVzLCBidXQgaXQncyBzZXQgYnkgc29mdCBzdHJhcCBhbmQKKwkgKiB0aGVyZWZvcmUgcmVhZC1vbmx5LiAgSWYgYm90aCBwb3N0ZWQgYW5kIG5vbi1wb3N0ZWQgcGVlciBjeWNsZXMgYXJlCisJICogZGlzYWxsb3dlZCwgd2UncmUgb2suICBJZiBlaXRoZXIgYXJlIGFsbG93ZWQsIHRoZW4gd2UgbmVlZCB0byB1c2UKKwkgKiB0aGUgVVBEQ1IgdG8gZGlzYWJsZSBwZWVyIGRlY29kZXMgZm9yIGVhY2ggcG9ydC4gIFRoaXMgcHJvdmlkZXMgdGhlCisJICogUENJZSBBQ1MgZXF1aXZhbGVudCBvZiBQQ0lfQUNTX1JSIHwgUENJX0FDU19DUiB8IFBDSV9BQ1NfVUYKKwkgKi8KKwlic3ByID0gcmVhZGwocmNiYV9tZW0gKyBJTlRFTF9CU1BSX1JFRyk7CisJYnNwciAmPSBJTlRFTF9CU1BSX1JFR19CUE5QRCB8IElOVEVMX0JTUFJfUkVHX0JQUEQ7CisJaWYgKGJzcHIgIT0gKElOVEVMX0JTUFJfUkVHX0JQTlBEIHwgSU5URUxfQlNQUl9SRUdfQlBQRCkpIHsKKwkJdXBkY3IgPSByZWFkbChyY2JhX21lbSArIElOVEVMX1VQRENSX1JFRyk7CisJCWlmICh1cGRjciAmIElOVEVMX1VQRENSX1JFR19NQVNLKSB7CisJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJEaXNhYmxpbmcgVVBEQ1IgcGVlciBkZWNvZGVzXG4iKTsKKwkJCXVwZGNyICY9IH5JTlRFTF9VUERDUl9SRUdfTUFTSzsKKwkJCXdyaXRlbCh1cGRjciwgcmNiYV9tZW0gKyBJTlRFTF9VUERDUl9SRUcpOworCQl9CisJfQorCisJaW91bm1hcChyY2JhX21lbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIE1pc2NlbGxhbmVvdXMgUG9ydCBDb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIElOVEVMX01QQ19SRUcgMHhkOAorLyogTVBDOiBJbnZhbGlkIFJlY2VpdmUgQnVzIE51bWJlciBDaGVjayBFbmFibGUgKi8KKyNkZWZpbmUgSU5URUxfTVBDX1JFR19JUkJOQ0UgKDEgPDwgMjYpCisKK3N0YXRpYyB2b2lkIHBjaV9xdWlya19lbmFibGVfaW50ZWxfcnBfbXBjX2FjcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXUzMiBtcGM7CisKKwkvKgorCSAqIFdoZW4gZW5hYmxlZCwgdGhlIElSQk5DRSBiaXQgb2YgdGhlIE1QQyByZWdpc3RlciBlbmFibGVzIHRoZQorCSAqIGVxdWl2YWxlbnQgb2YgUENJIEFDUyBTb3VyY2UgVmFsaWRhdGlvbiAoUENJX0FDU19TViksIHdoaWNoCisJICogZW5zdXJlcyB0aGF0IHJlcXVlc3RlciBJRHMgZmFsbCB3aXRoaW4gdGhlIGJ1cyBudW1iZXIgcmFuZ2UKKwkgKiBvZiB0aGUgYnJpZGdlLiAgRW5hYmxlIGlmIG5vdCBhbHJlYWR5LgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIElOVEVMX01QQ19SRUcsICZtcGMpOworCWlmICghKG1wYyAmIElOVEVMX01QQ19SRUdfSVJCTkNFKSkgeworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJFbmFibGluZyBNUEMgSVJCTkNFXG4iKTsKKwkJbXBjIHw9IElOVEVMX01QQ19SRUdfSVJCTkNFOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBJTlRFTF9NUENfUkVHLCBtcGMpOworCX0KK30KKworc3RhdGljIGludCBwY2lfcXVpcmtfZW5hYmxlX2ludGVsX3BjaF9hY3Moc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpZiAoIXBjaV9xdWlya19pbnRlbF9wY2hfYWNzX21hdGNoKGRldikpCisJCXJldHVybiAtRU5PVFRZOworCisJaWYgKHBjaV9xdWlya19lbmFibGVfaW50ZWxfbHBjX2FjcyhkZXYpKSB7CisJCWRldl93YXJuKCZkZXYtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgSW50ZWwgUENIIEFDUyBxdWlya1xuIik7CisJCXJldHVybiAwOworCX0KKworCXBjaV9xdWlya19lbmFibGVfaW50ZWxfcnBfbXBjX2FjcyhkZXYpOworCisJZGV2LT5kZXZfZmxhZ3MgfD0gUENJX0RFVl9GTEFHU19BQ1NfRU5BQkxFRF9RVUlSSzsKKworCWRldl9pbmZvKCZkZXYtPmRldiwgIkludGVsIFBDSCByb290IHBvcnQgQUNTIHdvcmthcm91bmQgZW5hYmxlZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2X2VuYWJsZV9hY3MgeworCXUxNiB2ZW5kb3I7CisJdTE2IGRldmljZTsKKwlpbnQgKCplbmFibGVfYWNzKShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK30gcGNpX2Rldl9lbmFibGVfYWNzW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfQU5ZX0lELCBwY2lfcXVpcmtfZW5hYmxlX2ludGVsX3BjaF9hY3MgfSwKKwl7IDAgfQorfTsKKwordm9pZCBwY2lfZGV2X3NwZWNpZmljX2VuYWJsZV9hY3Moc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljb25zdCBzdHJ1Y3QgcGNpX2Rldl9lbmFibGVfYWNzICppOworCWludCByZXQ7CisKKwlmb3IgKGkgPSBwY2lfZGV2X2VuYWJsZV9hY3M7IGktPmVuYWJsZV9hY3M7IGkrKykgeworCQlpZiAoKGktPnZlbmRvciA9PSBkZXYtPnZlbmRvciB8fAorCQkgICAgIGktPnZlbmRvciA9PSAodTE2KVBDSV9BTllfSUQpICYmCisJCSAgICAoaS0+ZGV2aWNlID09IGRldi0+ZGV2aWNlIHx8CisJCSAgICAgaS0+ZGV2aWNlID09ICh1MTYpUENJX0FOWV9JRCkpIHsKKwkJCXJldCA9IGktPmVuYWJsZV9hY3MoZGV2KTsKKwkJCWlmIChyZXQgPj0gMCkKKwkJCQlyZXR1cm47CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9yb20uYyBiL2RyaXZlcnMvcGNpL3JvbS5jCmluZGV4IDVkNTk1NzIuLmMxODM5NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3JvbS5jCisrKyBiL2RyaXZlcnMvcGNpL3JvbS5jCkBAIC0xOTcsOCArMTk3LDEwIEBACiB2b2lkIHBjaV9jbGVhbnVwX3JvbShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZwZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXTsKKwogCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9ST01fQ09QWSkgewogCQlrZnJlZSgodm9pZCopKHVuc2lnbmVkIGxvbmcpcmVzLT5zdGFydCk7CisJCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9VTlNFVDsKIAkJcmVzLT5mbGFncyAmPSB+SU9SRVNPVVJDRV9ST01fQ09QWTsKIAkJcmVzLT5zdGFydCA9IDA7CiAJCXJlcy0+ZW5kID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NlYXJjaC5jIGIvZHJpdmVycy9wY2kvc2VhcmNoLmMKaW5kZXggM2ZmMmFjNy4uNGExYjk3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2VhcmNoLmMKKysrIGIvZHJpdmVycy9wY2kvc2VhcmNoLmMKQEAgLTU0LDE0ICs1NCwxNCBAQAogCiBzdGF0aWMgc3RydWN0IHBjaV9idXMgKnBjaV9kb19maW5kX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBjaGFyIGJ1c25yKQogewotCXN0cnVjdCBwY2lfYnVzKiBjaGlsZDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IHBjaV9idXMgKmNoaWxkOworCXN0cnVjdCBwY2lfYnVzICp0bXA7CiAKIAlpZihidXMtPm51bWJlciA9PSBidXNucikKIAkJcmV0dXJuIGJ1czsKIAotCWxpc3RfZm9yX2VhY2godG1wLCAmYnVzLT5jaGlsZHJlbikgewotCQljaGlsZCA9IHBjaV9kb19maW5kX2J1cyhwY2lfYnVzX2IodG1wKSwgYnVzbnIpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmYnVzLT5jaGlsZHJlbiwgbm9kZSkgeworCQljaGlsZCA9IHBjaV9kb19maW5kX2J1cyh0bXAsIGJ1c25yKTsKIAkJaWYoY2hpbGQpCiAJCQlyZXR1cm4gY2hpbGQ7CiAJfQpAQCAtMTExLDcgKzExMSw3IEBACiAJZG93bl9yZWFkKCZwY2lfYnVzX3NlbSk7CiAJbiA9IGZyb20gPyBmcm9tLT5ub2RlLm5leHQgOiBwY2lfcm9vdF9idXNlcy5uZXh0OwogCWlmIChuICE9ICZwY2lfcm9vdF9idXNlcykKLQkJYiA9IHBjaV9idXNfYihuKTsKKwkJYiA9IGxpc3RfZW50cnkobiwgc3RydWN0IHBjaV9idXMsIG5vZGUpOwogCXVwX3JlYWQoJnBjaV9idXNfc2VtKTsKIAlyZXR1cm4gYjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKaW5kZXggNWMwNjBiMS4uN2VlZDY3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKQEAgLTQ0LDYgKzQ0LDkgQEAKIAlpZiAoIXJlcy0+ZmxhZ3MpCiAJCXJldHVybjsKIAorCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9VTlNFVCkKKwkJcmV0dXJuOworCiAJLyoKIAkgKiBJZ25vcmUgbm9uLW1vdmVhYmxlIHJlc291cmNlcy4gIFRoaXMgbWlnaHQgYmUgbGVnYWN5IHJlc291cmNlcyBmb3IKIAkgKiB3aGljaCBubyBmdW5jdGlvbmFsIEJBUiByZWdpc3RlciBleGlzdHMgb3IgYW5vdGhlciBpbXBvcnRhbnQKQEAgLTEwMSwxMSArMTA0LDYgQEAKIAogCWlmIChkaXNhYmxlKQogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKLQotCXJlcy0+ZmxhZ3MgJj0gfklPUkVTT1VSQ0VfVU5TRVQ7Ci0JZGV2X2RiZygmZGV2LT5kZXYsICJCQVIgJWQ6IHNldCB0byAlcFIgKFBDSSBhZGRyZXNzIFslI2xseC0lI2xseF0pXG4iLAotCQlyZXNubywgcmVzLCAodW5zaWduZWQgbG9uZyBsb25nKXJlZ2lvbi5zdGFydCwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZWdpb24uZW5kKTsKIH0KIAogaW50IHBjaV9jbGFpbV9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcmVzb3VyY2UpCkBAIC0xMTMsMTggKzExMSwyMyBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmRldi0+cmVzb3VyY2VbcmVzb3VyY2VdOwogCXN0cnVjdCByZXNvdXJjZSAqcm9vdCwgKmNvbmZsaWN0OwogCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKSB7CisJCWRldl9pbmZvKCZkZXYtPmRldiwgImNhbid0IGNsYWltIEJBUiAlZCAlcFI6IG5vIGFkZHJlc3MgYXNzaWduZWRcbiIsCisJCQkgcmVzb3VyY2UsIHJlcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCXJvb3QgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoZGV2LCByZXMpOwogCWlmICghcm9vdCkgewotCQlkZXZfaW5mbygmZGV2LT5kZXYsICJubyBjb21wYXRpYmxlIGJyaWRnZSB3aW5kb3cgZm9yICVwUlxuIiwKLQkJCSByZXMpOworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJjYW4ndCBjbGFpbSBCQVIgJWQgJXBSOiBubyBjb21wYXRpYmxlIGJyaWRnZSB3aW5kb3dcbiIsCisJCQkgcmVzb3VyY2UsIHJlcyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWNvbmZsaWN0ID0gcmVxdWVzdF9yZXNvdXJjZV9jb25mbGljdChyb290LCByZXMpOwogCWlmIChjb25mbGljdCkgewotCQlkZXZfaW5mbygmZGV2LT5kZXYsCi0JCQkgImFkZHJlc3Mgc3BhY2UgY29sbGlzaW9uOiAlcFIgY29uZmxpY3RzIHdpdGggJXMgJXBSXG4iLAotCQkJIHJlcywgY29uZmxpY3QtPm5hbWUsIGNvbmZsaWN0KTsKKwkJZGV2X2luZm8oJmRldi0+ZGV2LCAiY2FuJ3QgY2xhaW0gQkFSICVkICVwUjogYWRkcmVzcyBjb25mbGljdCB3aXRoICVzICVwUlxuIiwKKwkJCSByZXNvdXJjZSwgcmVzLCBjb25mbGljdC0+bmFtZSwgY29uZmxpY3QpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtMjYzLDYgKzI2Niw3IEBACiAJcmVzb3VyY2Vfc2l6ZV90IGFsaWduLCBzaXplOwogCWludCByZXQ7CiAKKwlyZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfVU5TRVQ7CiAJYWxpZ24gPSBwY2lfcmVzb3VyY2VfYWxpZ25tZW50KGRldiwgcmVzKTsKIAlpZiAoIWFsaWduKSB7CiAJCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYXNzaWduICVwUiAiCkBAIC0yODIsNiArMjg2LDcgQEAKIAkJcmV0ID0gcGNpX3JldmVydF9md19hZGRyZXNzKHJlcywgZGV2LCByZXNubywgc2l6ZSk7CiAKIAlpZiAoIXJldCkgeworCQlyZXMtPmZsYWdzICY9IH5JT1JFU09VUkNFX1VOU0VUOwogCQlyZXMtPmZsYWdzICY9IH5JT1JFU09VUkNFX1NUQVJUQUxJR047CiAJCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogYXNzaWduZWQgJXBSXG4iLCByZXNubywgcmVzKTsKIAkJaWYgKHJlc25vIDwgUENJX0JSSURHRV9SRVNPVVJDRVMpCkBAIC0yOTcsNiArMzAyLDcgQEAKIAlyZXNvdXJjZV9zaXplX3QgbmV3X3NpemU7CiAJaW50IHJldDsKIAorCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9VTlNFVDsKIAlpZiAoIXJlcy0+cGFyZW50KSB7CiAJCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgcmVhc3NpZ24gYW4gdW5hc3NpZ25lZCByZXNvdXJjZSAlcFIgIgogCQkJICJcbiIsIHJlc25vLCByZXMpOwpAQCAtMzA3LDYgKzMxMyw3IEBACiAJbmV3X3NpemUgPSByZXNvdXJjZV9zaXplKHJlcykgKyBhZGRzaXplOwogCXJldCA9IF9wY2lfYXNzaWduX3Jlc291cmNlKGRldiwgcmVzbm8sIG5ld19zaXplLCBtaW5fYWxpZ24pOwogCWlmICghcmV0KSB7CisJCXJlcy0+ZmxhZ3MgJj0gfklPUkVTT1VSQ0VfVU5TRVQ7CiAJCXJlcy0+ZmxhZ3MgJj0gfklPUkVTT1VSQ0VfU1RBUlRBTElHTjsKIAkJZGV2X2luZm8oJmRldi0+ZGV2LCAiQkFSICVkOiByZWFzc2lnbmVkICVwUlxuIiwgcmVzbm8sIHJlcyk7CiAJCWlmIChyZXNubyA8IFBDSV9CUklER0VfUkVTT1VSQ0VTKQpAQCAtMzM2LDkgKzM0MywxNSBAQAogCQkJCSghKHItPmZsYWdzICYgSU9SRVNPVVJDRV9ST01fRU5BQkxFKSkpCiAJCQljb250aW51ZTsKIAorCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKSB7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwgImNhbid0IGVuYWJsZSBkZXZpY2U6IEJBUiAlZCAlcFIgbm90IGFzc2lnbmVkXG4iLAorCQkJCWksIHIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwogCQlpZiAoIXItPnBhcmVudCkgewotCQkJZGV2X2VycigmZGV2LT5kZXYsICJkZXZpY2Ugbm90IGF2YWlsYWJsZSAiCi0JCQkJIihjYW4ndCByZXNlcnZlICVwUilcbiIsIHIpOworCQkJZGV2X2VycigmZGV2LT5kZXYsICJjYW4ndCBlbmFibGUgZGV2aWNlOiBCQVIgJWQgJXBSIG5vdCBjbGFpbWVkXG4iLAorCQkJCWksIHIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc2ExMXh4X2Jhc2UuYyBiL2RyaXZlcnMvcGNtY2lhL3NhMTF4eF9iYXNlLmMKaW5kZXggNmVlY2Q3Yy4uNTRkMzA4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc2ExMXh4X2Jhc2UuYworKysgYi9kcml2ZXJzL3BjbWNpYS9zYTExeHhfYmFzZS5jCkBAIC0xMjUsOSArMTI1LDYgQEAKIAkJaWYgKGZyZXFzLT5uZXcgPCBmcmVxcy0+b2xkKQogCQkJc2ExMTAwX3BjbWNpYV9zZXRfbWVjcihza3QsIGZyZXFzLT5uZXcpOwogCQlicmVhazsKLQljYXNlIENQVUZSRVFfUkVTVU1FQ0hBTkdFOgotCQlzYTExMDBfcGNtY2lhX3NldF9tZWNyKHNrdCwgZnJlcXMtPm5ldyk7Ci0JCWJyZWFrOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEveWVudGFfc29ja2V0LmMgYi9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYwppbmRleCA4NDg1NzYxLi45NDZmOTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYworKysgYi9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYwpAQCAtMTA3Niw3ICsxMDc2LDcgQEAKICAqLwogc3RhdGljIHZvaWQgeWVudGFfZml4dXBfcGFyZW50X2JyaWRnZShzdHJ1Y3QgcGNpX2J1cyAqY2FyZGJ1c19icmlkZ2UpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXN0cnVjdCBwY2lfYnVzICpzaWJsaW5nOwogCXVuc2lnbmVkIGNoYXIgdXBwZXJfbGltaXQ7CiAJLyoKIAkgKiBXZSBvbmx5IGNoZWNrIGFuZCBmaXggdGhlIHBhcmVudCBicmlkZ2U6IEFsbCBzeXN0ZW1zIHdoaWNoIG5lZWQKQEAgLTEwOTUsMTggKzEwOTUsMTggQEAKIAkvKiBzdGF5IHdpdGhpbiB0aGUgbGltaXRzIG9mIHRoZSBidXMgcmFuZ2Ugb2YgdGhlIHBhcmVudDogKi8KIAl1cHBlcl9saW1pdCA9IGJyaWRnZV90b19maXgtPnBhcmVudC0+YnVzbl9yZXMuZW5kOwogCi0JLyogY2hlY2sgdGhlIGJ1cyByYW5nZXMgb2YgYWxsIHNpbGJsaW5nIGJyaWRnZXMgdG8gcHJldmVudCBvdmVybGFwICovCi0JbGlzdF9mb3JfZWFjaCh0bXAsICZicmlkZ2VfdG9fZml4LT5wYXJlbnQtPmNoaWxkcmVuKSB7Ci0JCXN0cnVjdCBwY2lfYnVzICpzaWxibGluZyA9IHBjaV9idXNfYih0bXApOworCS8qIGNoZWNrIHRoZSBidXMgcmFuZ2VzIG9mIGFsbCBzaWJsaW5nIGJyaWRnZXMgdG8gcHJldmVudCBvdmVybGFwICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzaWJsaW5nLCAmYnJpZGdlX3RvX2ZpeC0+cGFyZW50LT5jaGlsZHJlbiwKKwkJCW5vZGUpIHsKIAkJLyoKLQkJICogSWYgdGhlIHNpbGJsaW5nIGhhcyBhIGhpZ2hlciBzZWNvbmRhcnkgYnVzIG51bWJlcgorCQkgKiBJZiB0aGUgc2libGluZyBoYXMgYSBoaWdoZXIgc2Vjb25kYXJ5IGJ1cyBudW1iZXIKIAkJICogYW5kIGl0J3Mgc2Vjb25kYXJ5IGlzIGVxdWFsIG9yIHNtYWxsZXIgdGhhbiBvdXIKIAkJICogY3VycmVudCB1cHBlciBsaW1pdCwgc2V0IHRoZSBuZXcgdXBwZXIgbGltaXQgdG8KLQkJICogdGhlIGJ1cyBudW1iZXIgYmVsb3cgdGhlIHNpbGJsaW5nJ3MgcmFuZ2U6CisJCSAqIHRoZSBidXMgbnVtYmVyIGJlbG93IHRoZSBzaWJsaW5nJ3MgcmFuZ2U6CiAJCSAqLwotCQlpZiAoc2lsYmxpbmctPmJ1c25fcmVzLnN0YXJ0ID4gYnJpZGdlX3RvX2ZpeC0+YnVzbl9yZXMuZW5kCi0JCSAgICAmJiBzaWxibGluZy0+YnVzbl9yZXMuc3RhcnQgPD0gdXBwZXJfbGltaXQpCi0JCQl1cHBlcl9saW1pdCA9IHNpbGJsaW5nLT5idXNuX3Jlcy5zdGFydCAtIDE7CisJCWlmIChzaWJsaW5nLT5idXNuX3Jlcy5zdGFydCA+IGJyaWRnZV90b19maXgtPmJ1c25fcmVzLmVuZAorCQkgICAgJiYgc2libGluZy0+YnVzbl9yZXMuc3RhcnQgPD0gdXBwZXJfbGltaXQpCisJCQl1cHBlcl9saW1pdCA9IHNpYmxpbmctPmJ1c25fcmVzLnN0YXJ0IC0gMTsKIAl9CiAKIAkvKiBTaG93IHRoYXQgdGhlIHdhbnRlZCBzdWJvcmRpbmF0ZSBudW1iZXIgaXMgbm90IHBvc3NpYmxlOiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvS2NvbmZpZyBiL2RyaXZlcnMvcGh5L0tjb25maWcKaW5kZXggYzdhNTUxYy4uOGQzYzQ5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvS2NvbmZpZworKysgYi9kcml2ZXJzL3BoeS9LY29uZmlnCkBAIC0xNiwzMCArMTYsNTYgQEAKIAkgIGZyYW1ld29yayBzaG91bGQgc2VsZWN0IHRoaXMgY29uZmlnLgogCiBjb25maWcgUEhZX0VYWU5PU19NSVBJX1ZJREVPCi0JZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAl0cmlzdGF0ZSAiUzVQL0VYWU5PUyBTb0Mgc2VyaWVzIE1JUEkgQ1NJLTIvRFNJIFBIWSBkcml2ZXIiCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KKwlkZXBlbmRzIG9uIEFSQ0hfUzVQVjIxMCB8fCBBUkNIX0VYWU5PUyB8fCBDT01QSUxFX1RFU1QKKwlzZWxlY3QgR0VORVJJQ19QSFkKKwlkZWZhdWx0IHkgaWYgQVJDSF9TNVBWMjEwIHx8IEFSQ0hfRVhZTk9TCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgTUlQSSBDU0ktMiBhbmQgTUlQSSBEU0kgRFBIWSBmb3VuZCBvbiBTYW1zdW5nIFM1UAogCSAgYW5kIEVYWU5PUyBTb0NzLgogCiBjb25maWcgUEhZX01WRUJVX1NBVEEKIAlkZWZfYm9vbCB5Ci0JZGVwZW5kcyBvbiBBUkNIX0tJUktXT09EIHx8IEFSQ0hfRE9WRQorCWRlcGVuZHMgb24gQVJDSF9LSVJLV09PRCB8fCBBUkNIX0RPVkUgfHwgTUFDSF9ET1ZFCiAJZGVwZW5kcyBvbiBPRgogCXNlbGVjdCBHRU5FUklDX1BIWQogCitjb25maWcgT01BUF9DT05UUk9MX1BIWQorCXRyaXN0YXRlICJPTUFQIENPTlRST0wgUEhZIERyaXZlciIKKwloZWxwCisJICBFbmFibGUgdGhpcyB0byBhZGQgc3VwcG9ydCBmb3IgdGhlIFBIWSBwYXJ0IHByZXNlbnQgaW4gdGhlIGNvbnRyb2wKKwkgIG1vZHVsZS4gVGhpcyBkcml2ZXIgaGFzIEFQSSB0byBwb3dlciBvbiB0aGUgVVNCMiBQSFkgYW5kIHRvIHdyaXRlIHRvCisJICB0aGUgbWFpbGJveC4gVGhlIG1haWxib3ggaXMgcHJlc2VudCBvbmx5IGluIG9tYXA0IGFuZCB0aGUgcmVnaXN0ZXIgdG8KKwkgIHBvd2VyIG9uIHRoZSBVU0IyIFBIWSBpcyBwcmVzZW50IGluIE9NQVA0IGFuZCBPTUFQNS4gT01BUDUgaGFzIGFuCisJICBhZGRpdGlvbmFsIHJlZ2lzdGVyIHRvIHBvd2VyIG9uIFVTQjMgUEhZL1NBVEEgUEhZL1BDSUUgUEhZCisJICAoUElQRTMgUEhZKS4KKwogY29uZmlnIE9NQVBfVVNCMgogCXRyaXN0YXRlICJPTUFQIFVTQjIgUEhZIERyaXZlciIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUDJQTFVTCiAJZGVwZW5kcyBvbiBVU0JfUEhZCiAJc2VsZWN0IEdFTkVSSUNfUEhZCi0Jc2VsZWN0IE9NQVBfQ09OVFJPTF9VU0IKKwlzZWxlY3QgT01BUF9DT05UUk9MX1BIWQorCWRlcGVuZHMgb24gT01BUF9PQ1AyU0NQCiAJaGVscAogCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCB0aGUgdHJhbnNjZWl2ZXIgdGhhdCBpcyBwYXJ0IG9mIFNPQy4gVGhpcwogCSAgZHJpdmVyIHRha2VzIGNhcmUgb2YgYWxsIHRoZSBQSFkgZnVuY3Rpb25hbGl0eSBhcGFydCBmcm9tIGNvbXBhcmF0b3IuCiAJICBUaGUgVVNCIE9URyBjb250cm9sbGVyIGNvbW11bmljYXRlcyB3aXRoIHRoZSBjb21wYXJhdG9yIHVzaW5nIHRoaXMKIAkgIGRyaXZlci4KIAorY29uZmlnIFRJX1BJUEUzCisJdHJpc3RhdGUgIlRJIFBJUEUzIFBIWSBEcml2ZXIiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAyUExVUyB8fCBDT01QSUxFX1RFU1QKKwlzZWxlY3QgR0VORVJJQ19QSFkKKwlzZWxlY3QgT01BUF9DT05UUk9MX1BIWQorCWRlcGVuZHMgb24gT01BUF9PQ1AyU0NQCisJaGVscAorCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCB0aGUgUElQRTMgUEhZIHRoYXQgaXMgcGFydCBvZiBUSSBTT0NzLiBUaGlzCisJICBkcml2ZXIgdGFrZXMgY2FyZSBvZiBhbGwgdGhlIFBIWSBmdW5jdGlvbmFsaXR5IGFwYXJ0IGZyb20gY29tcGFyYXRvci4KKwkgIFRoaXMgZHJpdmVyIGludGVyYWN0cyB3aXRoIHRoZSAiT01BUCBDb250cm9sIFBIWSBEcml2ZXIiIHRvIHBvd2VyCisJICBvbi9vZmYgdGhlIFBIWS4KKwogY29uZmlnIFRXTDQwMzBfVVNCCiAJdHJpc3RhdGUgIlRXTDQwMzAgVVNCIFRyYW5zY2VpdmVyIERyaXZlciIKIAlkZXBlbmRzIG9uIFRXTDQwMzBfQ09SRSAmJiBSRUdVTEFUT1JfVFdMNDAzMCAmJiBVU0JfTVVTQl9PTUFQMlBMVVMKQEAgLTU0LDYgKzgwLDggQEAKIGNvbmZpZyBQSFlfRVhZTk9TX0RQX1ZJREVPCiAJdHJpc3RhdGUgIkVYWU5PUyBTb0Mgc2VyaWVzIERpc3BsYXkgUG9ydCBQSFkgZHJpdmVyIgogCWRlcGVuZHMgb24gT0YKKwlkZXBlbmRzIG9uIEFSQ0hfRVhZTk9TIHx8IENPTVBJTEVfVEVTVAorCWRlZmF1bHQgQVJDSF9FWFlOT1MKIAlzZWxlY3QgR0VORVJJQ19QSFkKIAloZWxwCiAJICBTdXBwb3J0IGZvciBEaXNwbGF5IFBvcnQgUEhZIGZvdW5kIG9uIFNhbXN1bmcgRVhZTk9TIFNvQ3MuCkBAIC02NSw0ICs5Myw3NyBAQAogCWhlbHAKIAkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgdGhlIEJyb2FkY29tIEtvbmEgVVNCIDIuMCBQSFkuCiAKK2NvbmZpZyBQSFlfRVhZTk9TNTI1MF9TQVRBCisJdHJpc3RhdGUgIkV4eW5vczUyNTAgU2F0YSBTZXJEZXMvUEhZIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNPQ19FWFlOT1M1MjUwCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KKwlkZXBlbmRzIG9uIE9GCisJc2VsZWN0IEdFTkVSSUNfUEhZCisJc2VsZWN0IEkyQworCXNlbGVjdCBJMkNfUzNDMjQxMAorCXNlbGVjdCBNRkRfU1lTQ09OCisJaGVscAorCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCBTQVRBIFNlckRlcy9QaHkgZm91bmQgb24gU2Ftc3VuZydzCisJICBFeHlub3M1MjUwIGJhc2VkIFNvQ3MuVGhpcyBTZXJEZXMvUGh5IHN1cHBvcnRzIFNBVEEgMS41IEdiL3MsCisJICBTQVRBIDMuMCBHYi9zLCBTQVRBIDYuMCBHYi9zIHNwZWVkcy4gSXQgc3VwcG9ydHMgb25lIFNBVEEgaG9zdAorCSAgcG9ydCB0byBhY2NlcHQgb25lIFNBVEEgZGV2aWNlLgorCitjb25maWcgUEhZX1NVTjRJX1VTQgorCXRyaXN0YXRlICJBbGx3aW5uZXIgc3VueGkgU29DIFVTQiBQSFkgZHJpdmVyIgorCWRlcGVuZHMgb24gQVJDSF9TVU5YSSAmJiBIQVNfSU9NRU0gJiYgT0YKKwlzZWxlY3QgR0VORVJJQ19QSFkKKwloZWxwCisJICBFbmFibGUgdGhpcyB0byBzdXBwb3J0IHRoZSB0cmFuc2NlaXZlciB0aGF0IGlzIHBhcnQgb2YgQWxsd2lubmVyCisJICBzdW54aSBTb0NzLgorCisJICBUaGlzIGRyaXZlciBjb250cm9scyB0aGUgZW50aXJlIFVTQiBQSFkgYmxvY2ssIGJvdGggdGhlIFVTQiBPVEcKKwkgIHBhcnRzLCBhcyB3ZWxsIGFzIHRoZSAyIHJlZ3VsYXIgVVNCIDIgaG9zdCBQSFlzLgorCitjb25maWcgUEhZX1NBTVNVTkdfVVNCMgorCXRyaXN0YXRlICJTYW1zdW5nIFVTQiAyLjAgUEhZIGRyaXZlciIKKwlzZWxlY3QgR0VORVJJQ19QSFkKKwlzZWxlY3QgTUZEX1NZU0NPTgorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgdGhlIFNhbXN1bmcgVVNCIDIuMCBQSFkgZHJpdmVyIGZvciBTYW1zdW5nCisJICBTb0NzLiBUaGlzIGRyaXZlciBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIGZvciBVU0IgMi4wIFBIWS4gU3VwcG9ydCBmb3IKKwkgIHBhcnRpY3VsYXIgU29DcyBoYXMgdG8gYmUgZW5hYmxlZCBpbiBhZGRpdGlvbiB0byB0aGlzIGRyaXZlci4gTnVtYmVyCisJICBhbmQgdHlwZSBvZiBzdXBwb3J0ZWQgcGh5cyBkZXBlbmRzIG9uIHRoZSBTb0MuCisKK2NvbmZpZyBQSFlfRVhZTk9TNDIxMF9VU0IyCisJYm9vbCAiU3VwcG9ydCBmb3IgRXh5bm9zIDQyMTAiCisJZGVwZW5kcyBvbiBQSFlfU0FNU1VOR19VU0IyCisJZGVwZW5kcyBvbiBDUFVfRVhZTk9TNDIxMAorCWhlbHAKKwkgIEVuYWJsZSBVU0IgUEhZIHN1cHBvcnQgZm9yIEV4eW5vcyA0MjEwLiBUaGlzIG9wdGlvbiByZXF1aXJlcyB0aGF0CisJICBTYW1zdW5nIFVTQiAyLjAgUEhZIGRyaXZlciBpcyBlbmFibGVkIGFuZCBtZWFucyB0aGF0IHN1cHBvcnQgZm9yIHRoaXMKKwkgIHBhcnRpY3VsYXIgU29DIGlzIGNvbXBpbGVkIGluIHRoZSBkcml2ZXIuIEluIGNhc2Ugb2YgRXh5bm9zIDQyMTAgZm91cgorCSAgcGh5cyBhcmUgYXZhaWxhYmxlIC0gZGV2aWNlLCBob3N0LCBIU0lDMCBhbmQgSFNJQzEuCisKK2NvbmZpZyBQSFlfRVhZTk9TNFgxMl9VU0IyCisJYm9vbCAiU3VwcG9ydCBmb3IgRXh5bm9zIDR4MTIiCisJZGVwZW5kcyBvbiBQSFlfU0FNU1VOR19VU0IyCisJZGVwZW5kcyBvbiAoU09DX0VYWU5PUzQyMTIgfHwgU09DX0VYWU5PUzQ0MTIpCisJaGVscAorCSAgRW5hYmxlIFVTQiBQSFkgc3VwcG9ydCBmb3IgRXh5bm9zIDR4MTIuIFRoaXMgb3B0aW9uIHJlcXVpcmVzIHRoYXQKKwkgIFNhbXN1bmcgVVNCIDIuMCBQSFkgZHJpdmVyIGlzIGVuYWJsZWQgYW5kIG1lYW5zIHRoYXQgc3VwcG9ydCBmb3IgdGhpcworCSAgcGFydGljdWxhciBTb0MgaXMgY29tcGlsZWQgaW4gdGhlIGRyaXZlci4gSW4gY2FzZSBvZiBFeHlub3MgNHgxMiBmb3VyCisJICBwaHlzIGFyZSBhdmFpbGFibGUgLSBkZXZpY2UsIGhvc3QsIEhTSUMwIGFuZCBIU0lDMS4KKworY29uZmlnIFBIWV9FWFlOT1M1MjUwX1VTQjIKKwlib29sICJTdXBwb3J0IGZvciBFeHlub3MgNTI1MCIKKwlkZXBlbmRzIG9uIFBIWV9TQU1TVU5HX1VTQjIKKwlkZXBlbmRzIG9uIFNPQ19FWFlOT1M1MjUwCisJaGVscAorCSAgRW5hYmxlIFVTQiBQSFkgc3VwcG9ydCBmb3IgRXh5bm9zIDUyNTAuIFRoaXMgb3B0aW9uIHJlcXVpcmVzIHRoYXQKKwkgIFNhbXN1bmcgVVNCIDIuMCBQSFkgZHJpdmVyIGlzIGVuYWJsZWQgYW5kIG1lYW5zIHRoYXQgc3VwcG9ydCBmb3IgdGhpcworCSAgcGFydGljdWxhciBTb0MgaXMgY29tcGlsZWQgaW4gdGhlIGRyaXZlci4gSW4gY2FzZSBvZiBFeHlub3MgNTI1MCBmb3VyCisJICBwaHlzIGFyZSBhdmFpbGFibGUgLSBkZXZpY2UsIGhvc3QsIEhTSUMwIGFuZCBIU0lDLgorCitjb25maWcgUEhZX1hHRU5FCisJdHJpc3RhdGUgIkFQTSBYLUdlbmUgMTVHYnBzIFBIWSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSEFTX0lPTUVNICYmIE9GICYmIChBUk02NCB8fCBDT01QSUxFX1RFU1QpCisJc2VsZWN0IEdFTkVSSUNfUEhZCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBBUE0gWC1HZW5lIFNvQyBtdWx0aS1wdXJwb3NlIFBIWS4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvTWFrZWZpbGUgYi9kcml2ZXJzL3BoeS9NYWtlZmlsZQppbmRleCBiNTdjMjUzLi4yZmFmNzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BoeS9NYWtlZmlsZQpAQCAtNyw1ICs3LDE0IEBACiBvYmotJChDT05GSUdfUEhZX0VYWU5PU19EUF9WSURFTykJKz0gcGh5LWV4eW5vcy1kcC12aWRlby5vCiBvYmotJChDT05GSUdfUEhZX0VYWU5PU19NSVBJX1ZJREVPKQkrPSBwaHktZXh5bm9zLW1pcGktdmlkZW8ubwogb2JqLSQoQ09ORklHX1BIWV9NVkVCVV9TQVRBKQkJKz0gcGh5LW12ZWJ1LXNhdGEubworb2JqLSQoQ09ORklHX09NQVBfQ09OVFJPTF9QSFkpCQkrPSBwaHktb21hcC1jb250cm9sLm8KIG9iai0kKENPTkZJR19PTUFQX1VTQjIpCQkJKz0gcGh5LW9tYXAtdXNiMi5vCitvYmotJChDT05GSUdfVElfUElQRTMpCQkJKz0gcGh5LXRpLXBpcGUzLm8KIG9iai0kKENPTkZJR19UV0w0MDMwX1VTQikJCSs9IHBoeS10d2w0MDMwLXVzYi5vCitvYmotJChDT05GSUdfUEhZX0VYWU5PUzUyNTBfU0FUQSkJKz0gcGh5LWV4eW5vczUyNTAtc2F0YS5vCitvYmotJChDT05GSUdfUEhZX1NVTjRJX1VTQikJCSs9IHBoeS1zdW40aS11c2Iubworb2JqLSQoQ09ORklHX1BIWV9TQU1TVU5HX1VTQjIpCQkrPSBwaHktc2Ftc3VuZy11c2IyLm8KK29iai0kKENPTkZJR19QSFlfRVhZTk9TNDIxMF9VU0IyKQkrPSBwaHktZXh5bm9zNDIxMC11c2IyLm8KK29iai0kKENPTkZJR19QSFlfRVhZTk9TNFgxMl9VU0IyKQkrPSBwaHktZXh5bm9zNHgxMi11c2IyLm8KK29iai0kKENPTkZJR19QSFlfRVhZTk9TNTI1MF9VU0IyKQkrPSBwaHktZXh5bm9zNTI1MC11c2IyLm8KK29iai0kKENPTkZJR19QSFlfWEdFTkUpCQkJKz0gcGh5LXhnZW5lLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1iY20ta29uYS11c2IyLmMgYi9kcml2ZXJzL3BoeS9waHktYmNtLWtvbmEtdXNiMi5jCmluZGV4IGVmYzVjMWEuLmU5NGY1YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1iY20ta29uYS11c2IyLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LWJjbS1rb25hLXVzYjIuYwpAQCAtMTI4LDEwICsxMjgsOCBAQAogCiAJcGh5X3Byb3ZpZGVyID0gZGV2bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIoZGV2LAogCQkJb2ZfcGh5X3NpbXBsZV94bGF0ZSk7Ci0JaWYgKElTX0VSUihwaHlfcHJvdmlkZXIpKQotCQlyZXR1cm4gUFRSX0VSUihwaHlfcHJvdmlkZXIpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhwaHlfcHJvdmlkZXIpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBiY21fa29uYV91c2IyX2R0X2lkc1tdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LWNvcmUuYyBiL2RyaXZlcnMvcGh5L3BoeS1jb3JlLmMKaW5kZXggNmM3MzgzNy4uNjIzYjcxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LWNvcmUuYworKysgYi9kcml2ZXJzL3BoeS9waHktY29yZS5jCkBAIC0yNzQsOCArMjc0LDggQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHBoeV9wb3dlcl9vZmYpOwogCiAvKioKLSAqIG9mX3BoeV9nZXQoKSAtIGxvb2t1cCBhbmQgb2J0YWluIGEgcmVmZXJlbmNlIHRvIGEgcGh5IGJ5IHBoYW5kbGUKLSAqIEBkZXY6IGRldmljZSB0aGF0IHJlcXVlc3RzIHRoaXMgcGh5CisgKiBfb2ZfcGh5X2dldCgpIC0gbG9va3VwIGFuZCBvYnRhaW4gYSByZWZlcmVuY2UgdG8gYSBwaHkgYnkgcGhhbmRsZQorICogQG5wOiBkZXZpY2Vfbm9kZSBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBwaHkKICAqIEBpbmRleDogdGhlIGluZGV4IG9mIHRoZSBwaHkKICAqCiAgKiBSZXR1cm5zIHRoZSBwaHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwaGFuZGxlIHZhbHVlLApAQCAtMjg0LDIwICsyODQsMTcgQEAKICAqIG5vdCB5ZXQgbG9hZGVkLiBUaGlzIGZ1bmN0aW9uIHVzZXMgb2ZfeGxhdGUgY2FsbCBiYWNrIGZ1bmN0aW9uIHByb3ZpZGVkCiAgKiB3aGlsZSByZWdpc3RlcmluZyB0aGUgcGh5X3Byb3ZpZGVyIHRvIGZpbmQgdGhlIHBoeSBpbnN0YW5jZS4KICAqLwotc3RhdGljIHN0cnVjdCBwaHkgKm9mX3BoeV9nZXQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaW5kZXgpCitzdGF0aWMgc3RydWN0IHBoeSAqX29mX3BoeV9nZXQoc3RydWN0IGRldmljZV9ub2RlICpucCwgaW50IGluZGV4KQogewogCWludCByZXQ7CiAJc3RydWN0IHBoeV9wcm92aWRlciAqcGh5X3Byb3ZpZGVyOwogCXN0cnVjdCBwaHkgKnBoeSA9IE5VTEw7CiAJc3RydWN0IG9mX3BoYW5kbGVfYXJncyBhcmdzOwogCi0JcmV0ID0gb2ZfcGFyc2VfcGhhbmRsZV93aXRoX2FyZ3MoZGV2LT5vZl9ub2RlLCAicGh5cyIsICIjcGh5LWNlbGxzIiwKKwlyZXQgPSBvZl9wYXJzZV9waGFuZGxlX3dpdGhfYXJncyhucCwgInBoeXMiLCAiI3BoeS1jZWxscyIsCiAJCWluZGV4LCAmYXJncyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZGJnKGRldiwgImZhaWxlZCB0byBnZXQgcGh5IGluICVzIG5vZGVcbiIsCi0JCQlkZXYtPm9mX25vZGUtPmZ1bGxfbmFtZSk7CisJaWYgKHJldCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Ci0JfQogCiAJbXV0ZXhfbG9jaygmcGh5X3Byb3ZpZGVyX211dGV4KTsKIAlwaHlfcHJvdmlkZXIgPSBvZl9waHlfcHJvdmlkZXJfbG9va3VwKGFyZ3MubnApOwpAQCAtMzE3LDYgKzMxNCwzNiBAQAogfQogCiAvKioKKyAqIG9mX3BoeV9nZXQoKSAtIGxvb2t1cCBhbmQgb2J0YWluIGEgcmVmZXJlbmNlIHRvIGEgcGh5IHVzaW5nIGEgZGV2aWNlX25vZGUuCisgKiBAbnA6IGRldmljZV9ub2RlIGZvciB3aGljaCB0byBnZXQgdGhlIHBoeQorICogQGNvbl9pZDogbmFtZSBvZiB0aGUgcGh5IGZyb20gZGV2aWNlJ3MgcG9pbnQgb2YgdmlldworICoKKyAqIFJldHVybnMgdGhlIHBoeSBkcml2ZXIsIGFmdGVyIGdldHRpbmcgYSByZWZjb3VudCB0byBpdDsgb3IKKyAqIC1FTk9ERVYgaWYgdGhlcmUgaXMgbm8gc3VjaCBwaHkuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCisgKiBjYWxsaW5nIHBoeV9wdXQoKSB0byByZWxlYXNlIHRoYXQgY291bnQuCisgKi8KK3N0cnVjdCBwaHkgKm9mX3BoeV9nZXQoc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqY29uX2lkKQoreworCXN0cnVjdCBwaHkgKnBoeSA9IE5VTEw7CisJaW50IGluZGV4ID0gMDsKKworCWlmIChjb25faWQpCisJCWluZGV4ID0gb2ZfcHJvcGVydHlfbWF0Y2hfc3RyaW5nKG5wLCAicGh5LW5hbWVzIiwgY29uX2lkKTsKKworCXBoeSA9IF9vZl9waHlfZ2V0KG5wLCBpbmRleCk7CisJaWYgKElTX0VSUihwaHkpKQorCQlyZXR1cm4gcGh5OworCisJaWYgKCF0cnlfbW9kdWxlX2dldChwaHktPm9wcy0+b3duZXIpKQorCQlyZXR1cm4gRVJSX1BUUigtRVBST0JFX0RFRkVSKTsKKworCWdldF9kZXZpY2UoJnBoeS0+ZGV2KTsKKworCXJldHVybiBwaHk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9waHlfZ2V0KTsKKworLyoqCiAgKiBwaHlfcHV0KCkgLSByZWxlYXNlIHRoZSBQSFkKICAqIEBwaHk6IHRoZSBwaHkgcmV0dXJuZWQgYnkgcGh5X2dldCgpCiAgKgpAQCAtNDA3LDcgKzQzNCw3IEBACiAJaWYgKGRldi0+b2Zfbm9kZSkgewogCQlpbmRleCA9IG9mX3Byb3BlcnR5X21hdGNoX3N0cmluZyhkZXYtPm9mX25vZGUsICJwaHktbmFtZXMiLAogCQkJc3RyaW5nKTsKLQkJcGh5ID0gb2ZfcGh5X2dldChkZXYsIGluZGV4KTsKKwkJcGh5ID0gX29mX3BoeV9nZXQoZGV2LT5vZl9ub2RlLCBpbmRleCk7CiAJfSBlbHNlIHsKIAkJcGh5ID0gcGh5X2xvb2t1cChkZXYsIHN0cmluZyk7CiAJfQpAQCAtNDk5LDYgKzUyNiwzNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoZGV2bV9waHlfb3B0aW9uYWxfZ2V0KTsKIAogLyoqCisgKiBkZXZtX29mX3BoeV9nZXQoKSAtIGxvb2t1cCBhbmQgb2J0YWluIGEgcmVmZXJlbmNlIHRvIGEgcGh5LgorICogQGRldjogZGV2aWNlIHRoYXQgcmVxdWVzdHMgdGhpcyBwaHkKKyAqIEBucDogbm9kZSBjb250YWluaW5nIHRoZSBwaHkKKyAqIEBjb25faWQ6IG5hbWUgb2YgdGhlIHBoeSBmcm9tIGRldmljZSdzIHBvaW50IG9mIHZpZXcKKyAqCisgKiBHZXRzIHRoZSBwaHkgdXNpbmcgb2ZfcGh5X2dldCgpLCBhbmQgYXNzb2NpYXRlcyBhIGRldmljZSB3aXRoIGl0IHVzaW5nCisgKiBkZXZyZXMuIE9uIGRyaXZlciBkZXRhY2gsIHJlbGVhc2UgZnVuY3Rpb24gaXMgaW52b2tlZCBvbiB0aGUgZGV2cmVzIGRhdGEsCisgKiB0aGVuLCBkZXZyZXMgZGF0YSBpcyBmcmVlZC4KKyAqLworc3RydWN0IHBoeSAqZGV2bV9vZl9waHlfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCSAgICBjb25zdCBjaGFyICpjb25faWQpCit7CisJc3RydWN0IHBoeSAqKnB0ciwgKnBoeTsKKworCXB0ciA9IGRldnJlc19hbGxvYyhkZXZtX3BoeV9yZWxlYXNlLCBzaXplb2YoKnB0ciksIEdGUF9LRVJORUwpOworCWlmICghcHRyKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXBoeSA9IG9mX3BoeV9nZXQobnAsIGNvbl9pZCk7CisJaWYgKCFJU19FUlIocGh5KSkgeworCQkqcHRyID0gcGh5OworCQlkZXZyZXNfYWRkKGRldiwgcHRyKTsKKwl9IGVsc2UgeworCQlkZXZyZXNfZnJlZShwdHIpOworCX0KKworCXJldHVybiBwaHk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX29mX3BoeV9nZXQpOworCisvKioKICAqIHBoeV9jcmVhdGUoKSAtIGNyZWF0ZSBhIG5ldyBwaHkKICAqIEBkZXY6IGRldmljZSB0aGF0IGlzIGNyZWF0aW5nIHRoZSBuZXcgcGh5CiAgKiBAb3BzOiBmdW5jdGlvbiBwb2ludGVycyBmb3IgcGVyZm9ybWluZyBwaHkgb3BlcmF0aW9ucwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LWV4eW5vczQyMTAtdXNiMi5jIGIvZHJpdmVycy9waHkvcGh5LWV4eW5vczQyMTAtdXNiMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNmE1MmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BoeS9waHktZXh5bm9zNDIxMC11c2IyLmMKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiBTYW1zdW5nIFNvQyBVU0IgMS4xLzIuMCBQSFkgZHJpdmVyIC0gRXh5bm9zIDQyMTAgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQXV0aG9yOiBLYW1pbCBEZWJza2kgPGsuZGVic2tpQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSAicGh5LXNhbXN1bmctdXNiMi5oIgorCisvKiBFeHlub3MgVVNCIFBIWSByZWdpc3RlcnMgKi8KKworLyogUEhZIHBvd2VyIGNvbnRyb2wgKi8KKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWVBXUgkJCTB4MAorCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfUEhZMF9TVVNQRU5ECUJJVCgwKQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZUFdSX1BIWTBfUFdSCQlCSVQoMykKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWVBXUl9QSFkwX09UR19QV1IJQklUKDQpCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfUEhZMF9TTEVFUAkJQklUKDUpCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfUEhZMAkoIFwKKwlFWFlOT1NfNDIxMF9VUEhZUFdSX1BIWTBfU1VTUEVORCB8IFwKKwlFWFlOT1NfNDIxMF9VUEhZUFdSX1BIWTBfUFdSIHwgXAorCUVYWU5PU180MjEwX1VQSFlQV1JfUEhZMF9PVEdfUFdSIHwgXAorCUVYWU5PU180MjEwX1VQSFlQV1JfUEhZMF9TTEVFUCkKKworI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZUFdSX1BIWTFfU1VTUEVORAlCSVQoNikKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWVBXUl9QSFkxX1BXUgkJQklUKDcpCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfUEhZMV9TTEVFUAkJQklUKDgpCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfUEhZMSAoIFwKKwlFWFlOT1NfNDIxMF9VUEhZUFdSX1BIWTFfU1VTUEVORCB8IFwKKwlFWFlOT1NfNDIxMF9VUEhZUFdSX1BIWTFfUFdSIHwgXAorCUVYWU5PU180MjEwX1VQSFlQV1JfUEhZMV9TTEVFUCkKKworI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZUFdSX0hTSUMwX1NVU1BFTkQJQklUKDkpCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfSFNJQzBfU0xFRVAJCUJJVCgxMCkKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWVBXUl9IU0lDMCAoIFwKKwlFWFlOT1NfNDIxMF9VUEhZUFdSX0hTSUMwX1NVU1BFTkQgfCBcCisJRVhZTk9TXzQyMTBfVVBIWVBXUl9IU0lDMF9TTEVFUCkKKworI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZUFdSX0hTSUMxX1NVU1BFTkQJQklUKDExKQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZUFdSX0hTSUMxX1NMRUVQCQlCSVQoMTIpCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfSFNJQzEgKCBcCisJRVhZTk9TXzQyMTBfVVBIWVBXUl9IU0lDMV9TVVNQRU5EIHwgXAorCUVYWU5PU180MjEwX1VQSFlQV1JfSFNJQzFfU0xFRVApCisKKy8qIFBIWSBjbG9jayBjb250cm9sICovCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlDTEsJCQkweDQKKworI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZQ0xLX1BIWUZTRUxfTUFTSwkoMHgzIDw8IDApCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlDTEtfUEhZRlNFTF9PRkZTRVQJMAorI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZQ0xLX1BIWUZTRUxfNDhNSFoJKDB4MCA8PCAwKQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZQ0xLX1BIWUZTRUxfMjRNSFoJKDB4MyA8PCAwKQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZQ0xLX1BIWUZTRUxfMTJNSFoJKDB4MiA8PCAwKQorCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlDTEtfUEhZMF9JRF9QVUxMVVAJQklUKDIpCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlDTEtfUEhZMF9DT01NT05fT04JQklUKDQpCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlDTEtfUEhZMV9DT01NT05fT04JQklUKDcpCisKKy8qIFBIWSByZXNldCBjb250cm9sICovCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlSU1QJCQkweDgKKworI2RlZmluZSBFWFlOT1NfNDIxMF9VUlNUQ09OX1BIWTAJCUJJVCgwKQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUlNUQ09OX09UR19ITElOSwkJQklUKDEpCisjZGVmaW5lIEVYWU5PU180MjEwX1VSU1RDT05fT1RHX1BIWUxJTksJCUJJVCgyKQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUlNUQ09OX1BIWTFfQUxMCQlCSVQoMykKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVJTVENPTl9QSFkxX1AwCQlCSVQoNCkKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVJTVENPTl9QSFkxX1AxUDIJCUJJVCg1KQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUlNUQ09OX0hPU1RfTElOS19BTEwJQklUKDYpCisjZGVmaW5lIEVYWU5PU180MjEwX1VSU1RDT05fSE9TVF9MSU5LX1AwCUJJVCg3KQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUlNUQ09OX0hPU1RfTElOS19QMQlCSVQoOCkKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVJTVENPTl9IT1NUX0xJTktfUDIJQklUKDkpCisKKy8qIElzb2xhdGlvbiwgY29uZmlndXJlZCBpbiB0aGUgcG93ZXIgbWFuYWdlbWVudCB1bml0ICovCisjZGVmaW5lIEVYWU5PU180MjEwX1VTQl9JU09MX0RFVklDRV9PRkZTRVQJMHg3MDQKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVNCX0lTT0xfREVWSUNFCQlCSVQoMCkKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVNCX0lTT0xfSE9TVF9PRkZTRVQJMHg3MDgKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVNCX0lTT0xfSE9TVAkJQklUKDApCisKKy8qIFVTQllQSFkxIEZsb2F0aW5nIHByZXZlbnRpb24gKi8KKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWTFDT04JCQkweDM0CisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFkxQ09OX0ZMT0FUX1BSRVZFTlRJT04JMHgxCisKKy8qIE1vZGUgc3dpdGNoaW5nIFNVQiBEZXZpY2UgPC0+IEhvc3QgKi8KKyNkZWZpbmUgRVhZTk9TXzQyMTBfTU9ERV9TV0lUQ0hfT0ZGU0VUCQkweDIxYworI2RlZmluZSBFWFlOT1NfNDIxMF9NT0RFX1NXSVRDSF9NQVNLCQkxCisjZGVmaW5lIEVYWU5PU180MjEwX01PREVfU1dJVENIX0RFVklDRQkJMAorI2RlZmluZSBFWFlOT1NfNDIxMF9NT0RFX1NXSVRDSF9IT1NUCQkxCisKK2VudW0gZXh5bm9zNDIxMF9waHlfaWQgeworCUVYWU5PUzQyMTBfREVWSUNFLAorCUVYWU5PUzQyMTBfSE9TVCwKKwlFWFlOT1M0MjEwX0hTSUMwLAorCUVYWU5PUzQyMTBfSFNJQzEsCisJRVhZTk9TNDIxMF9OVU1fUEhZUywKK307CisKKy8qCisgKiBleHlub3M0MjEwX3JhdGVfdG9fY2xrKCkgY29udmVydHMgdGhlIHN1cHBsaWVkIGNsb2NrIHJhdGUgdG8gdGhlIHZhbHVlIHRoYXQKKyAqIGNhbiBiZSB3cml0dGVuIHRvIHRoZSBwaHkgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbnQgZXh5bm9zNDIxMF9yYXRlX3RvX2Nsayh1bnNpZ25lZCBsb25nIHJhdGUsIHUzMiAqcmVnKQoreworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgMTIgKiBNSFo6CisJCSpyZWcgPSBFWFlOT1NfNDIxMF9VUEhZQ0xLX1BIWUZTRUxfMTJNSFo7CisJCWJyZWFrOworCWNhc2UgMjQgKiBNSFo6CisJCSpyZWcgPSBFWFlOT1NfNDIxMF9VUEhZQ0xLX1BIWUZTRUxfMjRNSFo7CisJCWJyZWFrOworCWNhc2UgNDggKiBNSFo6CisJCSpyZWcgPSBFWFlOT1NfNDIxMF9VUEhZQ0xLX1BIWUZTRUxfNDhNSFo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBleHlub3M0MjEwX2lzb2woc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKmluc3QsIGJvb2wgb24pCit7CisJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfZHJpdmVyICpkcnYgPSBpbnN0LT5kcnY7CisJdTMyIG9mZnNldDsKKwl1MzIgbWFzazsKKworCXN3aXRjaCAoaW5zdC0+Y2ZnLT5pZCkgeworCWNhc2UgRVhZTk9TNDIxMF9ERVZJQ0U6CisJCW9mZnNldCA9IEVYWU5PU180MjEwX1VTQl9JU09MX0RFVklDRV9PRkZTRVQ7CisJCW1hc2sgPSBFWFlOT1NfNDIxMF9VU0JfSVNPTF9ERVZJQ0U7CisJCWJyZWFrOworCWNhc2UgRVhZTk9TNDIxMF9IT1NUOgorCQlvZmZzZXQgPSBFWFlOT1NfNDIxMF9VU0JfSVNPTF9IT1NUX09GRlNFVDsKKwkJbWFzayA9IEVYWU5PU180MjEwX1VTQl9JU09MX0hPU1Q7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9OworCisJcmVnbWFwX3VwZGF0ZV9iaXRzKGRydi0+cmVnX3BtdSwgb2Zmc2V0LCBtYXNrLCBvbiA/IDAgOiBtYXNrKTsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNDIxMF9waHlfcHdyKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICppbnN0LCBib29sIG9uKQoreworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciAqZHJ2ID0gaW5zdC0+ZHJ2OworCXUzMiByc3RiaXRzID0gMDsKKwl1MzIgcGh5cHdyID0gMDsKKwl1MzIgcnN0OworCXUzMiBwd3I7CisJdTMyIGNsazsKKworCXN3aXRjaCAoaW5zdC0+Y2ZnLT5pZCkgeworCWNhc2UgRVhZTk9TNDIxMF9ERVZJQ0U6CisJCXBoeXB3ciA9CUVYWU5PU180MjEwX1VQSFlQV1JfUEhZMDsKKwkJcnN0Yml0cyA9CUVYWU5PU180MjEwX1VSU1RDT05fUEhZMDsKKwkJYnJlYWs7CisJY2FzZSBFWFlOT1M0MjEwX0hPU1Q6CisJCXBoeXB3ciA9CUVYWU5PU180MjEwX1VQSFlQV1JfUEhZMTsKKwkJcnN0Yml0cyA9CUVYWU5PU180MjEwX1VSU1RDT05fUEhZMV9BTEwgfAorCQkJCUVYWU5PU180MjEwX1VSU1RDT05fUEhZMV9QMCB8CisJCQkJRVhZTk9TXzQyMTBfVVJTVENPTl9QSFkxX1AxUDIgfAorCQkJCUVYWU5PU180MjEwX1VSU1RDT05fSE9TVF9MSU5LX0FMTCB8CisJCQkJRVhZTk9TXzQyMTBfVVJTVENPTl9IT1NUX0xJTktfUDA7CisJCXdyaXRlbChvbiwgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzQyMTBfVVBIWTFDT04pOworCQlicmVhazsKKwljYXNlIEVYWU5PUzQyMTBfSFNJQzA6CisJCXBoeXB3ciA9CUVYWU5PU180MjEwX1VQSFlQV1JfSFNJQzA7CisJCXJzdGJpdHMgPQlFWFlOT1NfNDIxMF9VUlNUQ09OX1BIWTFfUDFQMiB8CisJCQkJRVhZTk9TXzQyMTBfVVJTVENPTl9IT1NUX0xJTktfUDE7CisJCWJyZWFrOworCWNhc2UgRVhZTk9TNDIxMF9IU0lDMToKKwkJcGh5cHdyID0JRVhZTk9TXzQyMTBfVVBIWVBXUl9IU0lDMTsKKwkJcnN0Yml0cyA9CUVYWU5PU180MjEwX1VSU1RDT05fUEhZMV9QMVAyIHwKKwkJCQlFWFlOT1NfNDIxMF9VUlNUQ09OX0hPU1RfTElOS19QMjsKKwkJYnJlYWs7CisJfTsKKworCWlmIChvbikgeworCQljbGsgPSByZWFkbChkcnYtPnJlZ19waHkgKyBFWFlOT1NfNDIxMF9VUEhZQ0xLKTsKKwkJY2xrICY9IH5FWFlOT1NfNDIxMF9VUEhZQ0xLX1BIWUZTRUxfTUFTSzsKKwkJY2xrIHw9IGRydi0+cmVmX3JlZ192YWwgPDwgRVhZTk9TXzQyMTBfVVBIWUNMS19QSFlGU0VMX09GRlNFVDsKKwkJd3JpdGVsKGNsaywgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzQyMTBfVVBIWUNMSyk7CisKKwkJcHdyID0gcmVhZGwoZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzQyMTBfVVBIWVBXUik7CisJCXB3ciAmPSB+cGh5cHdyOworCQl3cml0ZWwocHdyLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNDIxMF9VUEhZUFdSKTsKKworCQlyc3QgPSByZWFkbChkcnYtPnJlZ19waHkgKyBFWFlOT1NfNDIxMF9VUEhZUlNUKTsKKwkJcnN0IHw9IHJzdGJpdHM7CisJCXdyaXRlbChyc3QsIGRydi0+cmVnX3BoeSArIEVYWU5PU180MjEwX1VQSFlSU1QpOworCQl1ZGVsYXkoMTApOworCQlyc3QgJj0gfnJzdGJpdHM7CisJCXdyaXRlbChyc3QsIGRydi0+cmVnX3BoeSArIEVYWU5PU180MjEwX1VQSFlSU1QpOworCQkvKiBUaGUgZm9sbG93aW5nIGRlbGF5IGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHJlc2V0IHNlcXVlbmNlIHRvIGJlCisJCSAqIGNvbXBsZXRlZCAqLworCQl1ZGVsYXkoODApOworCX0gZWxzZSB7CisJCXB3ciA9IHJlYWRsKGRydi0+cmVnX3BoeSArIEVYWU5PU180MjEwX1VQSFlQV1IpOworCQlwd3IgfD0gcGh5cHdyOworCQl3cml0ZWwocHdyLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNDIxMF9VUEhZUFdSKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zNDIxMF9wb3dlcl9vbihzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqaW5zdCkKK3sKKwkvKiBPcmRlciBvZiBpbml0aWFsaXNhdGlvbiBpcyBpbXBvcnRhbnQgLSBmaXJzdCBwb3dlciB0aGVuIGlzb2xhdGlvbiAqLworCWV4eW5vczQyMTBfcGh5X3B3cihpbnN0LCAxKTsKKwlleHlub3M0MjEwX2lzb2woaW5zdCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleHlub3M0MjEwX3Bvd2VyX29mZihzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqaW5zdCkKK3sKKwlleHlub3M0MjEwX2lzb2woaW5zdCwgMSk7CisJZXh5bm9zNDIxMF9waHlfcHdyKGluc3QsIDApOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfY29tbW9uX3BoeSBleHlub3M0MjEwX3BoeXNbXSA9IHsKKwl7CisJCS5sYWJlbAkJPSAiZGV2aWNlIiwKKwkJLmlkCQk9IEVYWU5PUzQyMTBfREVWSUNFLAorCQkucG93ZXJfb24JPSBleHlub3M0MjEwX3Bvd2VyX29uLAorCQkucG93ZXJfb2ZmCT0gZXh5bm9zNDIxMF9wb3dlcl9vZmYsCisJfSwKKwl7CisJCS5sYWJlbAkJPSAiaG9zdCIsCisJCS5pZAkJPSBFWFlOT1M0MjEwX0hPU1QsCisJCS5wb3dlcl9vbgk9IGV4eW5vczQyMTBfcG93ZXJfb24sCisJCS5wb3dlcl9vZmYJPSBleHlub3M0MjEwX3Bvd2VyX29mZiwKKwl9LAorCXsKKwkJLmxhYmVsCQk9ICJoc2ljMCIsCisJCS5pZAkJPSBFWFlOT1M0MjEwX0hTSUMwLAorCQkucG93ZXJfb24JPSBleHlub3M0MjEwX3Bvd2VyX29uLAorCQkucG93ZXJfb2ZmCT0gZXh5bm9zNDIxMF9wb3dlcl9vZmYsCisJfSwKKwl7CisJCS5sYWJlbAkJPSAiaHNpYzEiLAorCQkuaWQJCT0gRVhZTk9TNDIxMF9IU0lDMSwKKwkJLnBvd2VyX29uCT0gZXh5bm9zNDIxMF9wb3dlcl9vbiwKKwkJLnBvd2VyX29mZgk9IGV4eW5vczQyMTBfcG93ZXJfb2ZmLAorCX0sCisJe30sCit9OworCitjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9jb25maWcgZXh5bm9zNDIxMF91c2IyX3BoeV9jb25maWcgPSB7CisJLmhhc19tb2RlX3N3aXRjaAk9IDAsCisJLm51bV9waHlzCQk9IEVYWU5PUzQyMTBfTlVNX1BIWVMsCisJLnBoeXMJCQk9IGV4eW5vczQyMTBfcGh5cywKKwkucmF0ZV90b19jbGsJCT0gZXh5bm9zNDIxMF9yYXRlX3RvX2NsaywKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktZXh5bm9zNHgxMi11c2IyLmMgYi9kcml2ZXJzL3BoeS9waHktZXh5bm9zNHgxMi11c2IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyYTdjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1leHlub3M0eDEyLXVzYjIuYwpAQCAtMCwwICsxLDMyOCBAQAorLyoKKyAqIFNhbXN1bmcgU29DIFVTQiAxLjEvMi4wIFBIWSBkcml2ZXIgLSBFeHlub3MgNHgxMiBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3I6IEthbWlsIERlYnNraSA8ay5kZWJza2lAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlICJwaHktc2Ftc3VuZy11c2IyLmgiCisKKy8qIEV4eW5vcyBVU0IgUEhZIHJlZ2lzdGVycyAqLworCisvKiBQSFkgcG93ZXIgY29udHJvbCAqLworI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZUFdSCQkJMHgwCisKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkwX1NVU1BFTkQJQklUKDApCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlQV1JfUEhZMF9QV1IJCUJJVCgzKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZUFdSX1BIWTBfT1RHX1BXUglCSVQoNCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkwX1NMRUVQCQlCSVQoNSkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkwICggXAorCUVYWU5PU180eDEyX1VQSFlQV1JfUEhZMF9TVVNQRU5EIHwgXAorCUVYWU5PU180eDEyX1VQSFlQV1JfUEhZMF9QV1IgfCBcCisJRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkwX09UR19QV1IgfCBcCisJRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkwX1NMRUVQKQorCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlQV1JfUEhZMV9TVVNQRU5ECUJJVCg2KQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZUFdSX1BIWTFfUFdSCQlCSVQoNykKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkxX1NMRUVQCQlCSVQoOCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkxICggXAorCUVYWU5PU180eDEyX1VQSFlQV1JfUEhZMV9TVVNQRU5EIHwgXAorCUVYWU5PU180eDEyX1VQSFlQV1JfUEhZMV9QV1IgfCBcCisJRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkxX1NMRUVQKQorCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlQV1JfSFNJQzBfU1VTUEVORAlCSVQoOSkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9IU0lDMF9QV1IJCUJJVCgxMCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9IU0lDMF9TTEVFUAkJQklUKDExKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZUFdSX0hTSUMwICggXAorCUVYWU5PU180eDEyX1VQSFlQV1JfSFNJQzBfU1VTUEVORCB8IFwKKwlFWFlOT1NfNHgxMl9VUEhZUFdSX0hTSUMwX1BXUiB8IFwKKwlFWFlOT1NfNHgxMl9VUEhZUFdSX0hTSUMwX1NMRUVQKQorCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlQV1JfSFNJQzFfU1VTUEVORAlCSVQoMTIpCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlQV1JfSFNJQzFfUFdSCQlCSVQoMTMpCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlQV1JfSFNJQzFfU0xFRVAJCUJJVCgxNCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9IU0lDMSAoIFwKKwlFWFlOT1NfNHgxMl9VUEhZUFdSX0hTSUMxX1NVU1BFTkQgfCBcCisJRVhZTk9TXzR4MTJfVVBIWVBXUl9IU0lDMV9QV1IgfCBcCisJRVhZTk9TXzR4MTJfVVBIWVBXUl9IU0lDMV9TTEVFUCkKKworLyogUEhZIGNsb2NrIGNvbnRyb2wgKi8KKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMSwkJCTB4NAorCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF9NQVNLCSgweDcgPDwgMCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19QSFlGU0VMX09GRlNFVAkwCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF85TUhaNgkoMHgwIDw8IDApCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF8xME1IWgkoMHgxIDw8IDApCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF8xMk1IWgkoMHgyIDw8IDApCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF8xOU1IWjIJKDB4MyA8PCAwKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfMjBNSFoJKDB4NCA8PCAwKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfMjRNSFoJKDB4NSA8PCAwKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfNTBNSFoJKDB4NyA8PCAwKQorCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZMF9JRF9QVUxMVVAJQklUKDMpCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZMF9DT01NT05fT04JQklUKDQpCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZMV9DT01NT05fT04JQklUKDcpCisKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19IU0lDX1JFRkNMS19NQVNLCSgweDdmIDw8IDEwKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZQ0xLX0hTSUNfUkVGQ0xLX09GRlNFVCAgMTAKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19IU0lDX1JFRkNMS18xMk1IWgkoMHgyNCA8PCAxMCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19IU0lDX1JFRkNMS18xNU1IWgkoMHgxYyA8PCAxMCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19IU0lDX1JFRkNMS18xNk1IWgkoMHgxYSA8PCAxMCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19IU0lDX1JFRkNMS18xOU1IWjIJKDB4MTUgPDwgMTApCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfSFNJQ19SRUZDTEtfMjBNSFoJKDB4MTQgPDwgMTApCisKKy8qIFBIWSByZXNldCBjb250cm9sICovCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlSU1QJCQkweDgKKworI2RlZmluZSBFWFlOT1NfNHgxMl9VUlNUQ09OX1BIWTAJCUJJVCgwKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUlNUQ09OX09UR19ITElOSwkJQklUKDEpCisjZGVmaW5lIEVYWU5PU180eDEyX1VSU1RDT05fT1RHX1BIWUxJTksJCUJJVCgyKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUlNUQ09OX0hPU1RfUEhZCQlCSVQoMykKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVJTVENPTl9QSFkxCQlCSVQoNCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVJTVENPTl9IU0lDMAkJQklUKDUpCisjZGVmaW5lIEVYWU5PU180eDEyX1VSU1RDT05fSFNJQzEJCUJJVCg2KQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUlNUQ09OX0hPU1RfTElOS19BTEwJQklUKDcpCisjZGVmaW5lIEVYWU5PU180eDEyX1VSU1RDT05fSE9TVF9MSU5LX1AwCUJJVCg4KQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUlNUQ09OX0hPU1RfTElOS19QMQlCSVQoOSkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVJTVENPTl9IT1NUX0xJTktfUDIJQklUKDEwKQorCisvKiBJc29sYXRpb24sIGNvbmZpZ3VyZWQgaW4gdGhlIHBvd2VyIG1hbmFnZW1lbnQgdW5pdCAqLworI2RlZmluZSBFWFlOT1NfNHgxMl9VU0JfSVNPTF9PRkZTRVQJCTB4NzA0CisjZGVmaW5lIEVYWU5PU180eDEyX1VTQl9JU09MX09URwkJQklUKDApCisjZGVmaW5lIEVYWU5PU180eDEyX1VTQl9JU09MX0hTSUMwX09GRlNFVAkweDcwOAorI2RlZmluZSBFWFlOT1NfNHgxMl9VU0JfSVNPTF9IU0lDMAkJQklUKDApCisjZGVmaW5lIEVYWU5PU180eDEyX1VTQl9JU09MX0hTSUMxX09GRlNFVAkweDcwYworI2RlZmluZSBFWFlOT1NfNHgxMl9VU0JfSVNPTF9IU0lDMQkJQklUKDApCisKKy8qIE1vZGUgc3dpdGNoaW5nIFNVQiBEZXZpY2UgPC0+IEhvc3QgKi8KKyNkZWZpbmUgRVhZTk9TXzR4MTJfTU9ERV9TV0lUQ0hfT0ZGU0VUCQkweDIxYworI2RlZmluZSBFWFlOT1NfNHgxMl9NT0RFX1NXSVRDSF9NQVNLCQkxCisjZGVmaW5lIEVYWU5PU180eDEyX01PREVfU1dJVENIX0RFVklDRQkJMAorI2RlZmluZSBFWFlOT1NfNHgxMl9NT0RFX1NXSVRDSF9IT1NUCQkxCisKK2VudW0gZXh5bm9zNHgxMl9waHlfaWQgeworCUVYWU5PUzR4MTJfREVWSUNFLAorCUVYWU5PUzR4MTJfSE9TVCwKKwlFWFlOT1M0eDEyX0hTSUMwLAorCUVYWU5PUzR4MTJfSFNJQzEsCisJRVhZTk9TNHgxMl9OVU1fUEhZUywKK307CisKKy8qCisgKiBleHlub3M0eDEyX3JhdGVfdG9fY2xrKCkgY29udmVydHMgdGhlIHN1cHBsaWVkIGNsb2NrIHJhdGUgdG8gdGhlIHZhbHVlIHRoYXQKKyAqIGNhbiBiZSB3cml0dGVuIHRvIHRoZSBwaHkgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbnQgZXh5bm9zNHgxMl9yYXRlX3RvX2Nsayh1bnNpZ25lZCBsb25nIHJhdGUsIHUzMiAqcmVnKQoreworCS8qIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF9NQVNLICovCisKKwlzd2l0Y2ggKHJhdGUpIHsKKwljYXNlIDk2MDAgKiBLSFo6CisJCSpyZWcgPSBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfOU1IWjY7CisJCWJyZWFrOworCWNhc2UgMTAgKiBNSFo6CisJCSpyZWcgPSBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfMTBNSFo7CisJCWJyZWFrOworCWNhc2UgMTIgKiBNSFo6CisJCSpyZWcgPSBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfMTJNSFo7CisJCWJyZWFrOworCWNhc2UgMTkyMDAgKiBLSFo6CisJCSpyZWcgPSBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfMTlNSFoyOworCQlicmVhazsKKwljYXNlIDIwICogTUhaOgorCQkqcmVnID0gRVhZTk9TXzR4MTJfVVBIWUNMS19QSFlGU0VMXzIwTUhaOworCQlicmVhazsKKwljYXNlIDI0ICogTUhaOgorCQkqcmVnID0gRVhZTk9TXzR4MTJfVVBIWUNMS19QSFlGU0VMXzI0TUhaOworCQlicmVhazsKKwljYXNlIDUwICogTUhaOgorCQkqcmVnID0gRVhZTk9TXzR4MTJfVVBIWUNMS19QSFlGU0VMXzUwTUhaOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNHgxMl9pc29sKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICppbnN0LCBib29sIG9uKQoreworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciAqZHJ2ID0gaW5zdC0+ZHJ2OworCXUzMiBvZmZzZXQ7CisJdTMyIG1hc2s7CisKKwlzd2l0Y2ggKGluc3QtPmNmZy0+aWQpIHsKKwljYXNlIEVYWU5PUzR4MTJfREVWSUNFOgorCWNhc2UgRVhZTk9TNHgxMl9IT1NUOgorCQlvZmZzZXQgPSBFWFlOT1NfNHgxMl9VU0JfSVNPTF9PRkZTRVQ7CisJCW1hc2sgPSBFWFlOT1NfNHgxMl9VU0JfSVNPTF9PVEc7CisJCWJyZWFrOworCWNhc2UgRVhZTk9TNHgxMl9IU0lDMDoKKwkJb2Zmc2V0ID0gRVhZTk9TXzR4MTJfVVNCX0lTT0xfSFNJQzBfT0ZGU0VUOworCQltYXNrID0gRVhZTk9TXzR4MTJfVVNCX0lTT0xfSFNJQzA7CisJCWJyZWFrOworCWNhc2UgRVhZTk9TNHgxMl9IU0lDMToKKwkJb2Zmc2V0ID0gRVhZTk9TXzR4MTJfVVNCX0lTT0xfSFNJQzFfT0ZGU0VUOworCQltYXNrID0gRVhZTk9TXzR4MTJfVVNCX0lTT0xfSFNJQzE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9OworCisJcmVnbWFwX3VwZGF0ZV9iaXRzKGRydi0+cmVnX3BtdSwgb2Zmc2V0LCBtYXNrLCBvbiA/IDAgOiBtYXNrKTsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNHgxMl9zZXR1cF9jbGsoc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKmluc3QpCit7CisJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfZHJpdmVyICpkcnYgPSBpbnN0LT5kcnY7CisJdTMyIGNsazsKKworCWNsayA9IHJlYWRsKGRydi0+cmVnX3BoeSArIEVYWU5PU180eDEyX1VQSFlDTEspOworCWNsayAmPSB+RVhZTk9TXzR4MTJfVVBIWUNMS19QSFlGU0VMX01BU0s7CisJY2xrIHw9IGRydi0+cmVmX3JlZ192YWwgPDwgRVhZTk9TXzR4MTJfVVBIWUNMS19QSFlGU0VMX09GRlNFVDsKKwl3cml0ZWwoY2xrLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNHgxMl9VUEhZQ0xLKTsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNHgxMl9waHlfcHdyKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICppbnN0LCBib29sIG9uKQoreworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciAqZHJ2ID0gaW5zdC0+ZHJ2OworCXUzMiByc3RiaXRzID0gMDsKKwl1MzIgcGh5cHdyID0gMDsKKwl1MzIgcnN0OworCXUzMiBwd3I7CisJdTMyIG1vZGUgPSAwOworCXUzMiBzd2l0Y2hfbW9kZSA9IDA7CisKKwlzd2l0Y2ggKGluc3QtPmNmZy0+aWQpIHsKKwljYXNlIEVYWU5PUzR4MTJfREVWSUNFOgorCQlwaHlwd3IgPQlFWFlOT1NfNHgxMl9VUEhZUFdSX1BIWTA7CisJCXJzdGJpdHMgPQlFWFlOT1NfNHgxMl9VUlNUQ09OX1BIWTA7CisJCW1vZGUgPQkJRVhZTk9TXzR4MTJfTU9ERV9TV0lUQ0hfREVWSUNFOworCQlzd2l0Y2hfbW9kZSA9CTE7CisJCWJyZWFrOworCWNhc2UgRVhZTk9TNHgxMl9IT1NUOgorCQlwaHlwd3IgPQlFWFlOT1NfNHgxMl9VUEhZUFdSX1BIWTE7CisJCXJzdGJpdHMgPQlFWFlOT1NfNHgxMl9VUlNUQ09OX0hPU1RfUEhZOworCQltb2RlID0JCUVYWU5PU180eDEyX01PREVfU1dJVENIX0hPU1Q7CisJCXN3aXRjaF9tb2RlID0JMTsKKwkJYnJlYWs7CisJY2FzZSBFWFlOT1M0eDEyX0hTSUMwOgorCQlwaHlwd3IgPQlFWFlOT1NfNHgxMl9VUEhZUFdSX0hTSUMwOworCQlyc3RiaXRzID0JRVhZTk9TXzR4MTJfVVJTVENPTl9IU0lDMSB8CisJCQkJRVhZTk9TXzR4MTJfVVJTVENPTl9IT1NUX0xJTktfUDAgfAorCQkJCUVYWU5PU180eDEyX1VSU1RDT05fSE9TVF9QSFk7CisJCWJyZWFrOworCWNhc2UgRVhZTk9TNHgxMl9IU0lDMToKKwkJcGh5cHdyID0JRVhZTk9TXzR4MTJfVVBIWVBXUl9IU0lDMTsKKwkJcnN0Yml0cyA9CUVYWU5PU180eDEyX1VSU1RDT05fSFNJQzEgfAorCQkJCUVYWU5PU180eDEyX1VSU1RDT05fSE9TVF9MSU5LX1AxOworCQlicmVhazsKKwl9OworCisJaWYgKG9uKSB7CisJCWlmIChzd2l0Y2hfbW9kZSkKKwkJCXJlZ21hcF91cGRhdGVfYml0cyhkcnYtPnJlZ19zeXMsCisJCQkJCSAgIEVYWU5PU180eDEyX01PREVfU1dJVENIX09GRlNFVCwKKwkJCQkJICAgRVhZTk9TXzR4MTJfTU9ERV9TV0lUQ0hfTUFTSywgbW9kZSk7CisKKwkJcHdyID0gcmVhZGwoZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzR4MTJfVVBIWVBXUik7CisJCXB3ciAmPSB+cGh5cHdyOworCQl3cml0ZWwocHdyLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNHgxMl9VUEhZUFdSKTsKKworCQlyc3QgPSByZWFkbChkcnYtPnJlZ19waHkgKyBFWFlOT1NfNHgxMl9VUEhZUlNUKTsKKwkJcnN0IHw9IHJzdGJpdHM7CisJCXdyaXRlbChyc3QsIGRydi0+cmVnX3BoeSArIEVYWU5PU180eDEyX1VQSFlSU1QpOworCQl1ZGVsYXkoMTApOworCQlyc3QgJj0gfnJzdGJpdHM7CisJCXdyaXRlbChyc3QsIGRydi0+cmVnX3BoeSArIEVYWU5PU180eDEyX1VQSFlSU1QpOworCQkvKiBUaGUgZm9sbG93aW5nIGRlbGF5IGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHJlc2V0IHNlcXVlbmNlIHRvIGJlCisJCSAqIGNvbXBsZXRlZCAqLworCQl1ZGVsYXkoODApOworCX0gZWxzZSB7CisJCXB3ciA9IHJlYWRsKGRydi0+cmVnX3BoeSArIEVYWU5PU180eDEyX1VQSFlQV1IpOworCQlwd3IgfD0gcGh5cHdyOworCQl3cml0ZWwocHdyLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNHgxMl9VUEhZUFdSKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zNHgxMl9wb3dlcl9vbihzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqaW5zdCkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXIgKmRydiA9IGluc3QtPmRydjsKKworCWluc3QtPmVuYWJsZWQgPSAxOworCWV4eW5vczR4MTJfc2V0dXBfY2xrKGluc3QpOworCWV4eW5vczR4MTJfcGh5X3B3cihpbnN0LCAxKTsKKwlleHlub3M0eDEyX2lzb2woaW5zdCwgMCk7CisKKwkvKiBQb3dlciBvbiB0aGUgZGV2aWNlLCBhcyBpdCBpcyBuZWNlc3NhcnkgZm9yIEhTSUMgdG8gd29yayAqLworCWlmIChpbnN0LT5jZmctPmlkID09IEVYWU5PUzR4MTJfSFNJQzApIHsKKwkJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKmRldmljZSA9CisJCQkJCSZkcnYtPmluc3RhbmNlc1tFWFlOT1M0eDEyX0RFVklDRV07CisJCWV4eW5vczR4MTJfcGh5X3B3cihkZXZpY2UsIDEpOworCQlleHlub3M0eDEyX2lzb2woZGV2aWNlLCAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleHlub3M0eDEyX3Bvd2VyX29mZihzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqaW5zdCkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXIgKmRydiA9IGluc3QtPmRydjsKKwlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqZGV2aWNlID0KKwkJCQkJJmRydi0+aW5zdGFuY2VzW0VYWU5PUzR4MTJfREVWSUNFXTsKKworCWluc3QtPmVuYWJsZWQgPSAwOworCWV4eW5vczR4MTJfaXNvbChpbnN0LCAxKTsKKwlleHlub3M0eDEyX3BoeV9wd3IoaW5zdCwgMCk7CisKKwlpZiAoaW5zdC0+Y2ZnLT5pZCA9PSBFWFlOT1M0eDEyX0hTSUMwICYmICFkZXZpY2UtPmVuYWJsZWQpIHsKKwkJZXh5bm9zNHgxMl9pc29sKGRldmljZSwgMSk7CisJCWV4eW5vczR4MTJfcGh5X3B3cihkZXZpY2UsIDApOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ191c2IyX2NvbW1vbl9waHkgZXh5bm9zNHgxMl9waHlzW10gPSB7CisJeworCQkubGFiZWwJCT0gImRldmljZSIsCisJCS5pZAkJPSBFWFlOT1M0eDEyX0RFVklDRSwKKwkJLnBvd2VyX29uCT0gZXh5bm9zNHgxMl9wb3dlcl9vbiwKKwkJLnBvd2VyX29mZgk9IGV4eW5vczR4MTJfcG93ZXJfb2ZmLAorCX0sCisJeworCQkubGFiZWwJCT0gImhvc3QiLAorCQkuaWQJCT0gRVhZTk9TNHgxMl9IT1NULAorCQkucG93ZXJfb24JPSBleHlub3M0eDEyX3Bvd2VyX29uLAorCQkucG93ZXJfb2ZmCT0gZXh5bm9zNHgxMl9wb3dlcl9vZmYsCisJfSwKKwl7CisJCS5sYWJlbAkJPSAiaHNpYzAiLAorCQkuaWQJCT0gRVhZTk9TNHgxMl9IU0lDMCwKKwkJLnBvd2VyX29uCT0gZXh5bm9zNHgxMl9wb3dlcl9vbiwKKwkJLnBvd2VyX29mZgk9IGV4eW5vczR4MTJfcG93ZXJfb2ZmLAorCX0sCisJeworCQkubGFiZWwJCT0gImhzaWMxIiwKKwkJLmlkCQk9IEVYWU5PUzR4MTJfSFNJQzEsCisJCS5wb3dlcl9vbgk9IGV4eW5vczR4MTJfcG93ZXJfb24sCisJCS5wb3dlcl9vZmYJPSBleHlub3M0eDEyX3Bvd2VyX29mZiwKKwl9LAorCXt9LAorfTsKKworY29uc3Qgc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfY29uZmlnIGV4eW5vczR4MTJfdXNiMl9waHlfY29uZmlnID0geworCS5oYXNfbW9kZV9zd2l0Y2gJPSAxLAorCS5udW1fcGh5cwkJPSBFWFlOT1M0eDEyX05VTV9QSFlTLAorCS5waHlzCQkJPSBleHlub3M0eDEyX3BoeXMsCisJLnJhdGVfdG9fY2xrCQk9IGV4eW5vczR4MTJfcmF0ZV90b19jbGssCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LWV4eW5vczUyNTAtc2F0YS5jIGIvZHJpdmVycy9waHkvcGh5LWV4eW5vczUyNTAtc2F0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MzYxYjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BoeS9waHktZXh5bm9zNTI1MC1zYXRhLmMKQEAgLTAsMCArMSwyNTEgQEAKKy8qCisgKiBTYW1zdW5nIFNBVEEgU2VyRGVzKFBIWSkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3JzOiBHaXJpc2ggSyBTIDxrcy5naXJpQHNhbXN1bmcuY29tPgorICogICAgICAgICBZdXZhcmFqIEt1bWFyIEMgRCA8eXV2YXJhai5jZEBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorCisjZGVmaW5lIFNBVEFQSFlfQ09OVFJPTF9PRkZTRVQJCTB4MDcyNAorI2RlZmluZSBFWFlOT1M1X1NBVEFQSFlfUE1VX0VOQUJMRQlCSVQoMCkKKyNkZWZpbmUgRVhZTk9TNV9TQVRBX1JFU0VUCQkweDQKKyNkZWZpbmUgUkVTRVRfR0xPQkFMX1JTVF9OCQlCSVQoMCkKKyNkZWZpbmUgUkVTRVRfQ01OX1JTVF9OCQkJQklUKDEpCisjZGVmaW5lIFJFU0VUX0NNTl9CTE9DS19SU1RfTgkJQklUKDIpCisjZGVmaW5lIFJFU0VUX0NNTl9JMkNfUlNUX04JCUJJVCgzKQorI2RlZmluZSBSRVNFVF9UWF9SWF9QSVBFX1JTVF9OCQlCSVQoNCkKKyNkZWZpbmUgUkVTRVRfVFhfUlhfQkxPQ0tfUlNUX04JCUJJVCg1KQorI2RlZmluZSBSRVNFVF9UWF9SWF9JMkNfUlNUX04JCShCSVQoNikgfCBCSVQoNykpCisjZGVmaW5lIExJTktfUkVTRVQJCQkweGYwMDAwCisjZGVmaW5lIEVYWU5PUzVfU0FUQV9NT0RFMAkJMHgxMAorI2RlZmluZSBTQVRBX1NQRF9HRU4zCQkJQklUKDEpCisjZGVmaW5lIEVYWU5PUzVfU0FUQV9DVFJMMAkJMHgxNAorI2RlZmluZSBDVFJMMF9QMF9QSFlfQ0FMSUJSQVRFRF9TRUwJQklUKDkpCisjZGVmaW5lIENUUkwwX1AwX1BIWV9DQUxJQlJBVEVECQlCSVQoOCkKKyNkZWZpbmUgRVhZTk9TNV9TQVRBX1BIU0FUQV9DVFJMTQkweGUwCisjZGVmaW5lIFBIQ1RSTE1fUkVGX1JBVEUJCUJJVCgxKQorI2RlZmluZSBQSENUUkxNX0hJR0hfU1BFRUQJCUJJVCgwKQorI2RlZmluZSBFWFlOT1M1X1NBVEFfUEhTQVRBX1NUQVRNCTB4ZjAKKyNkZWZpbmUgUEhTVEFUTV9QTExfTE9DS0VECQlCSVQoMCkKKworI2RlZmluZSBQSFlfUExMX1RJTUVPVVQgKHVzZWNzX3RvX2ppZmZpZXMoMTAwMCkpCisKK3N0cnVjdCBleHlub3Nfc2F0YV9waHkgeworCXN0cnVjdCBwaHkgKnBoeTsKKwlzdHJ1Y3QgY2xrICpwaHljbGs7CisJdm9pZCBfX2lvbWVtICpyZWdzOworCXN0cnVjdCByZWdtYXAgKnBtdXJlZzsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworfTsKKworc3RhdGljIGludCB3YWl0X2Zvcl9yZWdfc3RhdHVzKHZvaWQgX19pb21lbSAqYmFzZSwgdTMyIHJlZywgdTMyIGNoZWNrYml0LAorCQkJCXUzMiBzdGF0dXMpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIFBIWV9QTExfVElNRU9VVDsKKworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlpZiAoKHJlYWRsKGJhc2UgKyByZWcpICYgY2hlY2tiaXQpID09IHN0YXR1cykKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUZBVUxUOworfQorCitzdGF0aWMgaW50IGV4eW5vc19zYXRhX3BoeV9wb3dlcl9vbihzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IGV4eW5vc19zYXRhX3BoeSAqc2F0YV9waHkgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoc2F0YV9waHktPnBtdXJlZywgU0FUQVBIWV9DT05UUk9MX09GRlNFVCwKKwkJCUVYWU5PUzVfU0FUQVBIWV9QTVVfRU5BQkxFLCB0cnVlKTsKKworfQorCitzdGF0aWMgaW50IGV4eW5vc19zYXRhX3BoeV9wb3dlcl9vZmYoc3RydWN0IHBoeSAqcGh5KQoreworCXN0cnVjdCBleHlub3Nfc2F0YV9waHkgKnNhdGFfcGh5ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHNhdGFfcGh5LT5wbXVyZWcsIFNBVEFQSFlfQ09OVFJPTF9PRkZTRVQsCisJCQlFWFlOT1M1X1NBVEFQSFlfUE1VX0VOQUJMRSwgZmFsc2UpOworCit9CisKK3N0YXRpYyBpbnQgZXh5bm9zX3NhdGFfcGh5X2luaXQoc3RydWN0IHBoeSAqcGh5KQoreworCXUzMiB2YWwgPSAwOworCWludCByZXQgPSAwOworCXU4IGJ1ZltdID0geyAweDNhLCAweDBiIH07CisJc3RydWN0IGV4eW5vc19zYXRhX3BoeSAqc2F0YV9waHkgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhzYXRhX3BoeS0+cG11cmVnLCBTQVRBUEhZX0NPTlRST0xfT0ZGU0VULAorCQkJRVhZTk9TNV9TQVRBUEhZX1BNVV9FTkFCTEUsIHRydWUpOworCWlmIChyZXQgIT0gMCkKKwkJZGV2X2Vycigmc2F0YV9waHktPnBoeS0+ZGV2LCAicGh5IGluaXQgZmFpbGVkXG4iKTsKKworCXdyaXRlbCh2YWwsIHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX1JFU0VUKTsKKworCXZhbCA9IHJlYWRsKHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX1JFU0VUKTsKKwl2YWwgfD0gUkVTRVRfR0xPQkFMX1JTVF9OIHwgUkVTRVRfQ01OX1JTVF9OIHwgUkVTRVRfQ01OX0JMT0NLX1JTVF9OCisJCXwgUkVTRVRfQ01OX0kyQ19SU1RfTiB8IFJFU0VUX1RYX1JYX1BJUEVfUlNUX04KKwkJfCBSRVNFVF9UWF9SWF9CTE9DS19SU1RfTiB8IFJFU0VUX1RYX1JYX0kyQ19SU1RfTjsKKwl3cml0ZWwodmFsLCBzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9SRVNFVCk7CisKKwl2YWwgPSByZWFkbChzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9SRVNFVCk7CisJdmFsIHw9IExJTktfUkVTRVQ7CisJd3JpdGVsKHZhbCwgc2F0YV9waHktPnJlZ3MgKyBFWFlOT1M1X1NBVEFfUkVTRVQpOworCisJdmFsID0gcmVhZGwoc2F0YV9waHktPnJlZ3MgKyBFWFlOT1M1X1NBVEFfUkVTRVQpOworCXZhbCB8PSBSRVNFVF9DTU5fUlNUX047CisJd3JpdGVsKHZhbCwgc2F0YV9waHktPnJlZ3MgKyBFWFlOT1M1X1NBVEFfUkVTRVQpOworCisJdmFsID0gcmVhZGwoc2F0YV9waHktPnJlZ3MgKyBFWFlOT1M1X1NBVEFfUEhTQVRBX0NUUkxNKTsKKwl2YWwgJj0gflBIQ1RSTE1fUkVGX1JBVEU7CisJd3JpdGVsKHZhbCwgc2F0YV9waHktPnJlZ3MgKyBFWFlOT1M1X1NBVEFfUEhTQVRBX0NUUkxNKTsKKworCS8qIEhpZ2ggc3BlZWQgZW5hYmxlIGZvciBHZW4zICovCisJdmFsID0gcmVhZGwoc2F0YV9waHktPnJlZ3MgKyBFWFlOT1M1X1NBVEFfUEhTQVRBX0NUUkxNKTsKKwl2YWwgfD0gUEhDVFJMTV9ISUdIX1NQRUVEOworCXdyaXRlbCh2YWwsIHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX1BIU0FUQV9DVFJMTSk7CisKKwl2YWwgPSByZWFkbChzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9DVFJMMCk7CisJdmFsIHw9IENUUkwwX1AwX1BIWV9DQUxJQlJBVEVEX1NFTCB8IENUUkwwX1AwX1BIWV9DQUxJQlJBVEVEOworCXdyaXRlbCh2YWwsIHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX0NUUkwwKTsKKworCXZhbCA9IHJlYWRsKHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX01PREUwKTsKKwl2YWwgfD0gU0FUQV9TUERfR0VOMzsKKwl3cml0ZWwodmFsLCBzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9NT0RFMCk7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoc2F0YV9waHktPmNsaWVudCwgYnVmLCBzaXplb2YoYnVmKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiByZWxlYXNlIGNtdSByZXNldCAqLworCXZhbCA9IHJlYWRsKHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX1JFU0VUKTsKKwl2YWwgJj0gflJFU0VUX0NNTl9SU1RfTjsKKwl3cml0ZWwodmFsLCBzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9SRVNFVCk7CisKKwl2YWwgPSByZWFkbChzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9SRVNFVCk7CisJdmFsIHw9IFJFU0VUX0NNTl9SU1RfTjsKKwl3cml0ZWwodmFsLCBzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9SRVNFVCk7CisKKwlyZXQgPSB3YWl0X2Zvcl9yZWdfc3RhdHVzKHNhdGFfcGh5LT5yZWdzLAorCQkJCUVYWU5PUzVfU0FUQV9QSFNBVEFfU1RBVE0sCisJCQkJUEhTVEFUTV9QTExfTE9DS0VELCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycigmc2F0YV9waHktPnBoeS0+ZGV2LAorCQkJIlBIWSBQTEwgbG9ja2luZyBmYWlsZWRcbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGh5X29wcyBleHlub3Nfc2F0YV9waHlfb3BzID0geworCS5pbml0CQk9IGV4eW5vc19zYXRhX3BoeV9pbml0LAorCS5wb3dlcl9vbgk9IGV4eW5vc19zYXRhX3BoeV9wb3dlcl9vbiwKKwkucG93ZXJfb2ZmCT0gZXh5bm9zX3NhdGFfcGh5X3Bvd2VyX29mZiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IGV4eW5vc19zYXRhX3BoeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBleHlub3Nfc2F0YV9waHkgKnNhdGFfcGh5OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IHBoeV9wcm92aWRlciAqcGh5X3Byb3ZpZGVyOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKwlpbnQgcmV0ID0gMDsKKworCXNhdGFfcGh5ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzYXRhX3BoeSksIEdGUF9LRVJORUwpOworCWlmICghc2F0YV9waHkpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKworCXNhdGFfcGh5LT5yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHNhdGFfcGh5LT5yZWdzKSkKKwkJcmV0dXJuIFBUUl9FUlIoc2F0YV9waHktPnJlZ3MpOworCisJc2F0YV9waHktPnBtdXJlZyA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X3BoYW5kbGUoZGV2LT5vZl9ub2RlLAorCQkJCQkic2Ftc3VuZyxzeXNjb24tcGhhbmRsZSIpOworCWlmIChJU19FUlIoc2F0YV9waHktPnBtdXJlZykpIHsKKwkJZGV2X2VycihkZXYsICJzeXNjb24gcmVnbWFwIGxvb2t1cCBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2F0YV9waHktPnBtdXJlZyk7CisJfQorCisJbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUoZGV2LT5vZl9ub2RlLAorCQkJInNhbXN1bmcsZXh5bm9zLXNhdGFwaHktaTJjLXBoYW5kbGUiLCAwKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiAtRUlOVkFMOworCisJc2F0YV9waHktPmNsaWVudCA9IG9mX2ZpbmRfaTJjX2RldmljZV9ieV9ub2RlKG5vZGUpOworCWlmICghc2F0YV9waHktPmNsaWVudCkKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBzYXRhX3BoeSk7CisKKwlzYXRhX3BoeS0+cGh5Y2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgInNhdGFfcGh5Y3RybCIpOworCWlmIChJU19FUlIoc2F0YV9waHktPnBoeWNsaykpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGNsayBmb3IgUEhZXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2F0YV9waHktPnBoeWNsayk7CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHNhdGFfcGh5LT5waHljbGspOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBzb3VyY2UgY2xrXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzYXRhX3BoeS0+cGh5ID0gZGV2bV9waHlfY3JlYXRlKGRldiwgJmV4eW5vc19zYXRhX3BoeV9vcHMsIE5VTEwpOworCWlmIChJU19FUlIoc2F0YV9waHktPnBoeSkpIHsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNhdGFfcGh5LT5waHljbGspOworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjcmVhdGUgUEhZXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2F0YV9waHktPnBoeSk7CisJfQorCisJcGh5X3NldF9kcnZkYXRhKHNhdGFfcGh5LT5waHksIHNhdGFfcGh5KTsKKworCXBoeV9wcm92aWRlciA9IGRldm1fb2ZfcGh5X3Byb3ZpZGVyX3JlZ2lzdGVyKGRldiwKKwkJCQkJb2ZfcGh5X3NpbXBsZV94bGF0ZSk7CisJaWYgKElTX0VSUihwaHlfcHJvdmlkZXIpKSB7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShzYXRhX3BoeS0+cGh5Y2xrKTsKKwkJcmV0dXJuIFBUUl9FUlIocGh5X3Byb3ZpZGVyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZXh5bm9zX3NhdGFfcGh5X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczUyNTAtc2F0YS1waHkiIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGV4eW5vc19zYXRhX3BoeV9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGV4eW5vc19zYXRhX3BoeV9kcml2ZXIgPSB7CisJLnByb2JlCT0gZXh5bm9zX3NhdGFfcGh5X3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5vZl9tYXRjaF90YWJsZQk9IGV4eW5vc19zYXRhX3BoeV9vZl9tYXRjaCwKKwkJLm5hbWUgID0gInNhbXN1bmcsc2F0YS1waHkiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9Cit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihleHlub3Nfc2F0YV9waHlfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIFNlckRlcyBQSFkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIFYyIik7CitNT0RVTEVfQVVUSE9SKCJHaXJpc2ggSyBTIDxrcy5naXJpQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0FVVEhPUigiWXV2YXJhaiBDIEQgPHl1dmFyYWouY2RAc2Ftc3VuZy5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktZXh5bm9zNTI1MC11c2IyLmMgYi9kcml2ZXJzL3BoeS9waHktZXh5bm9zNTI1MC11c2IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxNzlhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1leHlub3M1MjUwLXVzYjIuYwpAQCAtMCwwICsxLDQwNCBAQAorLyoKKyAqIFNhbXN1bmcgU29DIFVTQiAxLjEvMi4wIFBIWSBkcml2ZXIgLSBFeHlub3MgNTI1MCBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3I6IEthbWlsIERlYnNraSA8ay5kZWJza2lAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlICJwaHktc2Ftc3VuZy11c2IyLmgiCisKKy8qIEV4eW5vcyBVU0IgUEhZIHJlZ2lzdGVycyAqLworI2RlZmluZSBFWFlOT1NfNTI1MF9SRUZDTEtTRUxfQ1JZU1RBTAkweDAKKyNkZWZpbmUgRVhZTk9TXzUyNTBfUkVGQ0xLU0VMX1hPCTB4MQorI2RlZmluZSBFWFlOT1NfNTI1MF9SRUZDTEtTRUxfQ0xLQ09SRQkweDIKKworI2RlZmluZSBFWFlOT1NfNTI1MF9GU0VMXzlNSFo2CQkweDAKKyNkZWZpbmUgRVhZTk9TXzUyNTBfRlNFTF8xME1IWgkJMHgxCisjZGVmaW5lIEVYWU5PU181MjUwX0ZTRUxfMTJNSFoJCTB4MgorI2RlZmluZSBFWFlOT1NfNTI1MF9GU0VMXzE5TUhaMgkJMHgzCisjZGVmaW5lIEVYWU5PU181MjUwX0ZTRUxfMjBNSFoJCTB4NAorI2RlZmluZSBFWFlOT1NfNTI1MF9GU0VMXzI0TUhaCQkweDUKKyNkZWZpbmUgRVhZTk9TXzUyNTBfRlNFTF81ME1IWgkJMHg3CisKKy8qIE5vcm1hbCBob3N0ICovCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMAkJCTB4MAorCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9QSFlTV1JTVEFMTAkJQklUKDMxKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfUkVGQ0xLU0VMX1NISUZUCTE5CisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9SRUZDTEtTRUxfTUFTSwlcCisJCSgweDMgPDwgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1JFRkNMS1NFTF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0ZTRUxfU0hJRlQJCTE2CisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9GU0VMX01BU0sgXAorCQkoMHg3IDw8IEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9GU0VMX1NISUZUKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfVEVTVEJVUk5JTgkJQklUKDExKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfUkVURU5BQkxFCQlCSVQoMTApCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9DT01NT05fT05fTgkJQklUKDkpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9WQVRFU1RFTkJfTUFTSwkJKDB4MyA8PCA3KQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfVkFURVNURU5CX0RVQUwJCSgweDAgPDwgNykKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1ZBVEVTVEVOQl9JRDAJCSgweDEgPDwgNykKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1ZBVEVTVEVOQl9BTkFMT0dURVNUCSgweDIgPDwgNykKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1NJRERRCQkJQklUKDYpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9GT1JDRVNMRUVQCQlCSVQoNSkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0ZPUkNFU1VTUEVORAkJQklUKDQpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9XT1JESU5URVJGQUNFCQlCSVQoMykKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1VUTUlTV1JTVAkJQklUKDIpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9MSU5LU1dSU1QJCUJJVCgxKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfUEhZU1dSU1QJCUJJVCgwKQorCisvKiBIU0lDMCAmIEhTSUMxICovCisjZGVmaW5lIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMMQkJCTB4MTAKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkwyCQkJMHgyMAorCisjZGVmaW5lIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9SRUZDTEtTRUxfTUFTSwkJKDB4MyA8PCAyMykKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1JFRkNMS1NFTF9ERUZBVUxUCSgweDIgPDwgMjMpCisjZGVmaW5lIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9SRUZDTEtESVZfTUFTSwkJKDB4N2YgPDwgMTYpCisjZGVmaW5lIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9SRUZDTEtESVZfMTIJCSgweDI0IDw8IDE2KQorI2RlZmluZSBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfUkVGQ0xLRElWXzE1CQkoMHgxYyA8PCAxNikKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1JFRkNMS0RJVl8xNgkJKDB4MWEgPDwgMTYpCisjZGVmaW5lIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9SRUZDTEtESVZfMTlfMgkJKDB4MTUgPDwgMTYpCisjZGVmaW5lIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9SRUZDTEtESVZfMjAJCSgweDE0IDw8IDE2KQorI2RlZmluZSBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfU0lERFEJCQlCSVQoNikKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX0ZPUkNFU0xFRVAJCUJJVCg1KQorI2RlZmluZSBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfRk9SQ0VTVVNQRU5ECQlCSVQoNCkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1dPUkRJTlRFUkZBQ0UJCUJJVCgzKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfVVRNSVNXUlNUCQlCSVQoMikKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1BIWVNXUlNUCQlCSVQoMCkKKworLyogRUhDSSBjb250cm9sICovCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RFSENJQ1RSTAkJCTB4MzAKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0VOQUlOQ1JYQUxJR04JCUJJVCgyOSkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0VOQUlOQ1I0CQlCSVQoMjgpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RFSENJQ1RSTF9FTkFJTkNSOAkJQklUKDI3KQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRU5BSU5DUjE2CQlCSVQoMjYpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RFSENJQ1RSTF9BVVRPUFBET05PVlJDVVJFTglCSVQoMjUpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RFSENJQ1RSTF9GTEFESlZBTDBfU0hJRlQJMTkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0ZMQURKVkFMMF9NQVNLCVwKKwkJKDB4M2YgPDwgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0ZMQURKVkFMMF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0ZMQURKVkFMMV9TSElGVAkxMworI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRkxBREpWQUwxX01BU0sJXAorCQkoMHgzZiA8PCBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRkxBREpWQUwxX1NISUZUKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRkxBREpWQUwyX1NISUZUCTcKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0ZMQURKVkFMMF9NQVNLCVwKKwkJKDB4M2YgPDwgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0ZMQURKVkFMMF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0ZMQURKVkFMSE9TVF9TSElGVAkxCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RFSENJQ1RSTF9GTEFESlZBTEhPU1RfTUFTSyBcCisJCSgweDEgPDwgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0ZMQURKVkFMSE9TVF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX1NJTVVMQVRJT05NT0RFCQlCSVQoMCkKKworLyogT0hDSSBjb250cm9sICovCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RPSENJQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MzQKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVE9IQ0lDVFJMX0ZSQU1FTEVOVkFMX1NISUZUCTEKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVE9IQ0lDVFJMX0ZSQU1FTEVOVkFMX01BU0sgXAorCQkoMHgzZmYgPDwgRVhZTk9TXzUyNTBfSE9TVE9IQ0lDVFJMX0ZSQU1FTEVOVkFMX1NISUZUKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUT0hDSUNUUkxfRlJBTUVMRU5WQUxFTgkJQklUKDApCisKKy8qIFVTQk9URyAqLworI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JPVEdTWVMJCQkJMHgzOAorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfUEhZTElOS19TV19SRVNFVAkJQklUKDE0KQorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfTElOS19TV19SU1RfVU9URwkJQklUKDEzKQorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfUEhZX1NXX1JTVAkJQklUKDEyKQorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfUkVGQ0xLU0VMX1NISUZUCQk5CisjZGVmaW5lIEVYWU5PU181MjUwX1VTQk9UR1NZU19SRUZDTEtTRUxfTUFTSyBcCisJCSgweDMgPDwgRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1JFRkNMS1NFTF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0lEX1BVTExVUAkJCUJJVCg4KQorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfQ09NTU9OX09OCQkJQklUKDcpCisjZGVmaW5lIEVYWU5PU181MjUwX1VTQk9UR1NZU19GU0VMX1NISUZUCQk0CisjZGVmaW5lIEVYWU5PU181MjUwX1VTQk9UR1NZU19GU0VMX01BU0sgXAorCQkoMHgzIDw8IEVYWU5PU181MjUwX1VTQk9UR1NZU19GU0VMX1NISUZUKQorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfRk9SQ0VfU0xFRVAJCUJJVCgzKQorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfT1RHRElTQUJMRQkJQklUKDIpCisjZGVmaW5lIEVYWU5PU181MjUwX1VTQk9UR1NZU19TSUREUV9VT1RHCQlCSVQoMSkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0ZPUkNFX1NVU1BFTkQJCUJJVCgwKQorCisvKiBJc29sYXRpb24sIGNvbmZpZ3VyZWQgaW4gdGhlIHBvd2VyIG1hbmFnZW1lbnQgdW5pdCAqLworI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JfSVNPTF9PVEdfT0ZGU0VUCQkweDcwNAorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JfSVNPTF9PVEcJCUJJVCgwKQorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JfSVNPTF9IT1NUX09GRlNFVAkweDcwOAorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JfSVNPTF9IT1NUCQlCSVQoMCkKKworLyogTW9kZSBzd3RpY2ggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVhZTk9TXzUyNTBfTU9ERV9TV0lUQ0hfT0ZGU0VUCQkweDIzMAorI2RlZmluZSBFWFlOT1NfNTI1MF9NT0RFX1NXSVRDSF9NQVNLCQkxCisjZGVmaW5lIEVYWU5PU181MjUwX01PREVfU1dJVENIX0RFVklDRQkJMAorI2RlZmluZSBFWFlOT1NfNTI1MF9NT0RFX1NXSVRDSF9IT1NUCQkxCisKK2VudW0gZXh5bm9zNHgxMl9waHlfaWQgeworCUVYWU5PUzUyNTBfREVWSUNFLAorCUVYWU5PUzUyNTBfSE9TVCwKKwlFWFlOT1M1MjUwX0hTSUMwLAorCUVYWU5PUzUyNTBfSFNJQzEsCisJRVhZTk9TNTI1MF9OVU1fUEhZUywKK307CisKKy8qCisgKiBleHlub3M1MjUwX3JhdGVfdG9fY2xrKCkgY29udmVydHMgdGhlIHN1cHBsaWVkIGNsb2NrIHJhdGUgdG8gdGhlIHZhbHVlIHRoYXQKKyAqIGNhbiBiZSB3cml0dGVuIHRvIHRoZSBwaHkgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbnQgZXh5bm9zNTI1MF9yYXRlX3RvX2Nsayh1bnNpZ25lZCBsb25nIHJhdGUsIHUzMiAqcmVnKQoreworCS8qIEVYWU5PU181MjUwX0ZTRUxfTUFTSyAqLworCisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSA5NjAwICogS0haOgorCQkqcmVnID0gRVhZTk9TXzUyNTBfRlNFTF85TUhaNjsKKwkJYnJlYWs7CisJY2FzZSAxMCAqIE1IWjoKKwkJKnJlZyA9IEVYWU5PU181MjUwX0ZTRUxfMTBNSFo7CisJCWJyZWFrOworCWNhc2UgMTIgKiBNSFo6CisJCSpyZWcgPSBFWFlOT1NfNTI1MF9GU0VMXzEyTUhaOworCQlicmVhazsKKwljYXNlIDE5MjAwICogS0haOgorCQkqcmVnID0gRVhZTk9TXzUyNTBfRlNFTF8xOU1IWjI7CisJCWJyZWFrOworCWNhc2UgMjAgKiBNSFo6CisJCSpyZWcgPSBFWFlOT1NfNTI1MF9GU0VMXzIwTUhaOworCQlicmVhazsKKwljYXNlIDI0ICogTUhaOgorCQkqcmVnID0gRVhZTk9TXzUyNTBfRlNFTF8yNE1IWjsKKwkJYnJlYWs7CisJY2FzZSA1MCAqIE1IWjoKKwkJKnJlZyA9IEVYWU5PU181MjUwX0ZTRUxfNTBNSFo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBleHlub3M1MjUwX2lzb2woc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKmluc3QsIGJvb2wgb24pCit7CisJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfZHJpdmVyICpkcnYgPSBpbnN0LT5kcnY7CisJdTMyIG9mZnNldDsKKwl1MzIgbWFzazsKKworCXN3aXRjaCAoaW5zdC0+Y2ZnLT5pZCkgeworCWNhc2UgRVhZTk9TNTI1MF9ERVZJQ0U6CisJCW9mZnNldCA9IEVYWU5PU181MjUwX1VTQl9JU09MX09UR19PRkZTRVQ7CisJCW1hc2sgPSBFWFlOT1NfNTI1MF9VU0JfSVNPTF9PVEc7CisJCWJyZWFrOworCWNhc2UgRVhZTk9TNTI1MF9IT1NUOgorCQlvZmZzZXQgPSBFWFlOT1NfNTI1MF9VU0JfSVNPTF9IT1NUX09GRlNFVDsKKwkJbWFzayA9IEVYWU5PU181MjUwX1VTQl9JU09MX0hPU1Q7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9OworCisJcmVnbWFwX3VwZGF0ZV9iaXRzKGRydi0+cmVnX3BtdSwgb2Zmc2V0LCBtYXNrLCBvbiA/IDAgOiBtYXNrKTsKK30KKworc3RhdGljIGludCBleHlub3M1MjUwX3Bvd2VyX29uKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICppbnN0KQoreworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciAqZHJ2ID0gaW5zdC0+ZHJ2OworCXUzMiBjdHJsMDsKKwl1MzIgb3RnOworCXUzMiBlaGNpOworCXUzMiBvaGNpOworCXUzMiBoc2ljOworCisJc3dpdGNoIChpbnN0LT5jZmctPmlkKSB7CisJY2FzZSBFWFlOT1M1MjUwX0RFVklDRToKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGRydi0+cmVnX3N5cywKKwkJCQkgICBFWFlOT1NfNTI1MF9NT0RFX1NXSVRDSF9PRkZTRVQsCisJCQkJICAgRVhZTk9TXzUyNTBfTU9ERV9TV0lUQ0hfTUFTSywKKwkJCQkgICBFWFlOT1NfNTI1MF9NT0RFX1NXSVRDSF9ERVZJQ0UpOworCisJCS8qIE9URyBjb25maWd1cmF0aW9uICovCisJCW90ZyA9IHJlYWRsKGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX1VTQk9UR1NZUyk7CisJCS8qIFRoZSBjbG9jayAqLworCQlvdGcgJj0gfkVYWU5PU181MjUwX1VTQk9UR1NZU19GU0VMX01BU0s7CisJCW90ZyB8PSBkcnYtPnJlZl9yZWdfdmFsIDw8IEVYWU5PU181MjUwX1VTQk9UR1NZU19GU0VMX1NISUZUOworCQkvKiBSZXNldCAqLworCQlvdGcgJj0gfihFWFlOT1NfNTI1MF9VU0JPVEdTWVNfRk9SQ0VfU1VTUEVORCB8CisJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfRk9SQ0VfU0xFRVAgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1NJRERRX1VPVEcpOworCQlvdGcgfD0JRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1BIWV9TV19SU1QgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1BIWUxJTktfU1dfUkVTRVQgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0xJTktfU1dfUlNUX1VPVEcgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX09UR0RJU0FCTEU7CisJCS8qIFJlZiBjbG9jayAqLworCQlvdGcgJj0JfkVYWU5PU181MjUwX1VTQk9UR1NZU19SRUZDTEtTRUxfTUFTSzsKKwkJb3RnIHw9ICBFWFlOT1NfNTI1MF9SRUZDTEtTRUxfQ0xLQ09SRSA8PAorCQkJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfUkVGQ0xLU0VMX1NISUZUOworCQl3cml0ZWwob3RnLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9VU0JPVEdTWVMpOworCQl1ZGVsYXkoMTAwKTsKKwkJb3RnICY9IH4oRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1BIWV9TV19SU1QgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0xJTktfU1dfUlNUX1VPVEcgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1BIWUxJTktfU1dfUkVTRVQgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX09UR0RJU0FCTEUpOworCQl3cml0ZWwob3RnLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9VU0JPVEdTWVMpOworCisKKwkJYnJlYWs7CisJY2FzZSBFWFlOT1M1MjUwX0hPU1Q6CisJY2FzZSBFWFlOT1M1MjUwX0hTSUMwOgorCWNhc2UgRVhZTk9TNTI1MF9IU0lDMToKKwkJLyogSG9zdCByZWdpc3RlcnMgY29uZmlndXJhdGlvbiAqLworCQljdHJsMCA9IHJlYWRsKGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMCk7CisJCS8qIFRoZSBjbG9jayAqLworCQljdHJsMCAmPSB+RVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0ZTRUxfTUFTSzsKKwkJY3RybDAgfD0gZHJ2LT5yZWZfcmVnX3ZhbCA8PAorCQkJCQlFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfRlNFTF9TSElGVDsKKworCQkvKiBSZXNldCAqLworCQljdHJsMCAmPQl+KEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9QSFlTV1JTVCB8CisJCQkJRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1BIWVNXUlNUQUxMIHwKKwkJCQlFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfU0lERFEgfAorCQkJCUVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9GT1JDRVNVU1BFTkQgfAorCQkJCUVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9GT1JDRVNMRUVQKTsKKwkJY3RybDAgfD0JRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0xJTktTV1JTVCB8CisJCQkJRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1VUTUlTV1JTVCB8CisJCQkJRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0NPTU1PTl9PTl9OOworCQl3cml0ZWwoY3RybDAsIGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMCk7CisJCXVkZWxheSgxMCk7CisJCWN0cmwwICY9CX4oRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0xJTktTV1JTVCB8CisJCQkJRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1VUTUlTV1JTVCk7CisJCXdyaXRlbChjdHJsMCwgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwKTsKKworCQkvKiBPVEcgY29uZmlndXJhdGlvbiAqLworCQlvdGcgPSByZWFkbChkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9VU0JPVEdTWVMpOworCQkvKiBUaGUgY2xvY2sgKi8KKwkJb3RnICY9IH5FWFlOT1NfNTI1MF9VU0JPVEdTWVNfRlNFTF9NQVNLOworCQlvdGcgfD0gZHJ2LT5yZWZfcmVnX3ZhbCA8PCBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfRlNFTF9TSElGVDsKKwkJLyogUmVzZXQgKi8KKwkJb3RnICY9IH4oRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0ZPUkNFX1NVU1BFTkQgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0ZPUkNFX1NMRUVQIHwKKwkJCUVYWU5PU181MjUwX1VTQk9UR1NZU19TSUREUV9VT1RHKTsKKwkJb3RnIHw9CUVYWU5PU181MjUwX1VTQk9UR1NZU19QSFlfU1dfUlNUIHwKKwkJCUVYWU5PU181MjUwX1VTQk9UR1NZU19QSFlMSU5LX1NXX1JFU0VUIHwKKwkJCUVYWU5PU181MjUwX1VTQk9UR1NZU19MSU5LX1NXX1JTVF9VT1RHIHwKKwkJCUVYWU5PU181MjUwX1VTQk9UR1NZU19PVEdESVNBQkxFOworCQkvKiBSZWYgY2xvY2sgKi8KKwkJb3RnICY9CX5FWFlOT1NfNTI1MF9VU0JPVEdTWVNfUkVGQ0xLU0VMX01BU0s7CisJCW90ZyB8PSAgRVhZTk9TXzUyNTBfUkVGQ0xLU0VMX0NMS0NPUkUgPDwKKwkJCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1JFRkNMS1NFTF9TSElGVDsKKwkJd3JpdGVsKG90ZywgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfVVNCT1RHU1lTKTsKKwkJdWRlbGF5KDEwKTsKKwkJb3RnICY9IH4oRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1BIWV9TV19SU1QgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0xJTktfU1dfUlNUX1VPVEcgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1BIWUxJTktfU1dfUkVTRVQpOworCisJCS8qIEhTSUMgcGh5IGNvbmZpZ3VyYXRpb24gKi8KKwkJaHNpYyA9IChFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfUkVGQ0xLRElWXzEyIHwKKwkJCQlFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfUkVGQ0xLU0VMX0RFRkFVTFQgfAorCQkJCUVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9QSFlTV1JTVCk7CisJCXdyaXRlbChoc2ljLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTDEpOworCQl3cml0ZWwoaHNpYywgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkwyKTsKKwkJdWRlbGF5KDEwKTsKKwkJaHNpYyAmPSB+RVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1BIWVNXUlNUOworCQl3cml0ZWwoaHNpYywgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkwxKTsKKwkJd3JpdGVsKGhzaWMsIGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMMik7CisJCS8qIFRoZSBmb2xsb3dpbmcgZGVsYXkgaXMgbmVjZXNzYXJ5IGZvciB0aGUgcmVzZXQgc2VxdWVuY2UgdG8gYmUKKwkJICogY29tcGxldGVkICovCisJCXVkZWxheSg4MCk7CisKKwkJLyogRW5hYmxlIEVIQ0kgRE1BIGJ1cnN0ICovCisJCWVoY2kgPSByZWFkbChkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkwpOworCQllaGNpIHw9CUVYWU5PU181MjUwX0hPU1RFSENJQ1RSTF9FTkFJTkNSWEFMSUdOIHwKKwkJCUVYWU5PU181MjUwX0hPU1RFSENJQ1RSTF9FTkFJTkNSNCB8CisJCQlFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRU5BSU5DUjggfAorCQkJRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0VOQUlOQ1IxNjsKKwkJd3JpdGVsKGVoY2ksIGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX0hPU1RFSENJQ1RSTCk7CisKKwkJLyogT0hDSSBzZXR0aW5ncyAqLworCQlvaGNpID0gcmVhZGwoZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfSE9TVE9IQ0lDVFJMKTsKKwkJLyogRm9sbG93aW5nIGNvZGUgaXMgYmFzZWQgb24gdGhlIG9sZCBkcml2ZXIgKi8KKwkJb2hjaSB8PQkweDEgPDwgMzsKKwkJd3JpdGVsKG9oY2ksIGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX0hPU1RPSENJQ1RSTCk7CisKKwkJYnJlYWs7CisJfQorCWluc3QtPmVuYWJsZWQgPSAxOworCWV4eW5vczUyNTBfaXNvbChpbnN0LCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4eW5vczUyNTBfcG93ZXJfb2ZmKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICppbnN0KQoreworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciAqZHJ2ID0gaW5zdC0+ZHJ2OworCXUzMiBjdHJsMDsKKwl1MzIgb3RnOworCXUzMiBoc2ljOworCisJaW5zdC0+ZW5hYmxlZCA9IDA7CisJZXh5bm9zNTI1MF9pc29sKGluc3QsIDEpOworCisJc3dpdGNoIChpbnN0LT5jZmctPmlkKSB7CisJY2FzZSBFWFlOT1M1MjUwX0RFVklDRToKKwkJb3RnID0gcmVhZGwoZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfVVNCT1RHU1lTKTsKKwkJb3RnIHw9IChFWFlOT1NfNTI1MF9VU0JPVEdTWVNfRk9SQ0VfU1VTUEVORCB8CisJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfU0lERFFfVU9URyB8CisJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfRk9SQ0VfU0xFRVApOworCQl3cml0ZWwob3RnLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9VU0JPVEdTWVMpOworCQlicmVhazsKKwljYXNlIEVYWU5PUzUyNTBfSE9TVDoKKwkJY3RybDAgPSByZWFkbChkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDApOworCQljdHJsMCB8PSAoRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1NJRERRIHwKKwkJCQlFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfRk9SQ0VTVVNQRU5EIHwKKwkJCQlFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfRk9SQ0VTTEVFUCB8CisJCQkJRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1BIWVNXUlNUIHwKKwkJCQlFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfUEhZU1dSU1RBTEwpOworCQl3cml0ZWwoY3RybDAsIGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMCk7CisJCWJyZWFrOworCWNhc2UgRVhZTk9TNTI1MF9IU0lDMDoKKwljYXNlIEVYWU5PUzUyNTBfSFNJQzE6CisJCWhzaWMgPSAoRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1JFRkNMS0RJVl8xMiB8CisJCQkJRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1JFRkNMS1NFTF9ERUZBVUxUIHwKKwkJCQlFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfU0lERFEgfAorCQkJCUVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9GT1JDRVNMRUVQIHwKKwkJCQlFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfRk9SQ0VTVVNQRU5ECisJCQkJKTsKKwkJd3JpdGVsKGhzaWMsIGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMMSk7CisJCXdyaXRlbChoc2ljLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTDIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfdXNiMl9jb21tb25fcGh5IGV4eW5vczUyNTBfcGh5c1tdID0geworCXsKKwkJLmxhYmVsCQk9ICJkZXZpY2UiLAorCQkuaWQJCT0gRVhZTk9TNTI1MF9ERVZJQ0UsCisJCS5wb3dlcl9vbgk9IGV4eW5vczUyNTBfcG93ZXJfb24sCisJCS5wb3dlcl9vZmYJPSBleHlub3M1MjUwX3Bvd2VyX29mZiwKKwl9LAorCXsKKwkJLmxhYmVsCQk9ICJob3N0IiwKKwkJLmlkCQk9IEVYWU5PUzUyNTBfSE9TVCwKKwkJLnBvd2VyX29uCT0gZXh5bm9zNTI1MF9wb3dlcl9vbiwKKwkJLnBvd2VyX29mZgk9IGV4eW5vczUyNTBfcG93ZXJfb2ZmLAorCX0sCisJeworCQkubGFiZWwJCT0gImhzaWMwIiwKKwkJLmlkCQk9IEVYWU5PUzUyNTBfSFNJQzAsCisJCS5wb3dlcl9vbgk9IGV4eW5vczUyNTBfcG93ZXJfb24sCisJCS5wb3dlcl9vZmYJPSBleHlub3M1MjUwX3Bvd2VyX29mZiwKKwl9LAorCXsKKwkJLmxhYmVsCQk9ICJoc2ljMSIsCisJCS5pZAkJPSBFWFlOT1M1MjUwX0hTSUMxLAorCQkucG93ZXJfb24JPSBleHlub3M1MjUwX3Bvd2VyX29uLAorCQkucG93ZXJfb2ZmCT0gZXh5bm9zNTI1MF9wb3dlcl9vZmYsCisJfSwKKwl7fSwKK307CisKK2NvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2NvbmZpZyBleHlub3M1MjUwX3VzYjJfcGh5X2NvbmZpZyA9IHsKKwkuaGFzX21vZGVfc3dpdGNoCT0gMSwKKwkubnVtX3BoeXMJCT0gRVhZTk9TNTI1MF9OVU1fUEhZUywKKwkucGh5cwkJCT0gZXh5bm9zNTI1MF9waHlzLAorCS5yYXRlX3RvX2NsawkJPSBleHlub3M1MjUwX3JhdGVfdG9fY2xrLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1vbWFwLWNvbnRyb2wuYyBiL2RyaXZlcnMvcGh5L3BoeS1vbWFwLWNvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTFiNGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waHkvcGh5LW9tYXAtY29udHJvbC5jCkBAIC0wLDAgKzEsMzIwIEBACisvKgorICogb21hcC1jb250cm9sLXBoeS5jIC0gVGhlIFBIWSBwYXJ0IG9mIGNvbnRyb2wgbW9kdWxlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbQorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3I6IEtpc2hvbiBWaWpheSBBYnJhaGFtIEkgPGtpc2hvbkB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L29tYXBfY29udHJvbF9waHkuaD4KKworLyoqCisgKiBvbWFwX2NvbnRyb2xfcGh5X3Bvd2VyIC0gcG93ZXIgb24vb2ZmIHRoZSBwaHkgdXNpbmcgY29udHJvbCBtb2R1bGUgcmVnCisgKiBAZGV2OiB0aGUgY29udHJvbCBtb2R1bGUgZGV2aWNlCisgKiBAb246IDAgb3IgMSwgYmFzZWQgb24gcG93ZXJpbmcgb24gb3Igb2ZmIHRoZSBQSFkKKyAqLwordm9pZCBvbWFwX2NvbnRyb2xfcGh5X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG9uKQoreworCXUzMiB2YWw7CisJdW5zaWduZWQgbG9uZyByYXRlOworCXN0cnVjdCBvbWFwX2NvbnRyb2xfcGh5CSpjb250cm9sX3BoeTsKKworCWlmIChJU19FUlIoZGV2KSB8fCAhZGV2KSB7CisJCXByX2VycigiJXM6IGludmFsaWQgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwljb250cm9sX3BoeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWlmICghY29udHJvbF9waHkpIHsKKwkJZGV2X2VycihkZXYsICIlczogaW52YWxpZCBjb250cm9sIHBoeSBkZXZpY2VcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjb250cm9sX3BoeS0+dHlwZSA9PSBPTUFQX0NUUkxfVFlQRV9PVEdIUykKKwkJcmV0dXJuOworCisJdmFsID0gcmVhZGwoY29udHJvbF9waHktPnBvd2VyKTsKKworCXN3aXRjaCAoY29udHJvbF9waHktPnR5cGUpIHsKKwljYXNlIE9NQVBfQ1RSTF9UWVBFX1VTQjI6CisJCWlmIChvbikKKwkJCXZhbCAmPSB+T01BUF9DVFJMX0RFVl9QSFlfUEQ7CisJCWVsc2UKKwkJCXZhbCB8PSBPTUFQX0NUUkxfREVWX1BIWV9QRDsKKwkJYnJlYWs7CisKKwljYXNlIE9NQVBfQ1RSTF9UWVBFX1BJUEUzOgorCQlyYXRlID0gY2xrX2dldF9yYXRlKGNvbnRyb2xfcGh5LT5zeXNfY2xrKTsKKwkJcmF0ZSA9IHJhdGUvMTAwMDAwMDsKKworCQlpZiAob24pIHsKKwkJCXZhbCAmPSB+KE9NQVBfQ1RSTF9QSVBFM19QSFlfUFdSQ1RMX0NMS19DTURfTUFTSyB8CisJCQkJT01BUF9DVFJMX1BJUEUzX1BIWV9QV1JDVExfQ0xLX0ZSRVFfTUFTSyk7CisJCQl2YWwgfD0gT01BUF9DVFJMX1BJUEUzX1BIWV9UWF9SWF9QT1dFUk9OIDw8CisJCQkJT01BUF9DVFJMX1BJUEUzX1BIWV9QV1JDVExfQ0xLX0NNRF9TSElGVDsKKwkJCXZhbCB8PSByYXRlIDw8CisJCQkJT01BUF9DVFJMX1BJUEUzX1BIWV9QV1JDVExfQ0xLX0ZSRVFfU0hJRlQ7CisJCX0gZWxzZSB7CisJCQl2YWwgJj0gfk9NQVBfQ1RSTF9QSVBFM19QSFlfUFdSQ1RMX0NMS19DTURfTUFTSzsKKwkJCXZhbCB8PSBPTUFQX0NUUkxfUElQRTNfUEhZX1RYX1JYX1BPV0VST0ZGIDw8CisJCQkJT01BUF9DVFJMX1BJUEUzX1BIWV9QV1JDVExfQ0xLX0NNRF9TSElGVDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgT01BUF9DVFJMX1RZUEVfRFJBN1VTQjI6CisJCWlmIChvbikKKwkJCXZhbCAmPSB+T01BUF9DVFJMX1VTQjJfUEhZX1BEOworCQllbHNlCisJCQl2YWwgfD0gT01BUF9DVFJMX1VTQjJfUEhZX1BEOworCQlicmVhazsKKworCWNhc2UgT01BUF9DVFJMX1RZUEVfQU00MzdVU0IyOgorCQlpZiAob24pIHsKKwkJCXZhbCAmPSB+KEFNNDM3WF9DVFJMX1VTQjJfUEhZX1BEIHwKKwkJCQkJQU00MzdYX0NUUkxfVVNCMl9PVEdfUEQpOworCQkJdmFsIHw9IChBTTQzN1hfQ1RSTF9VU0IyX09UR1ZERVRfRU4gfAorCQkJCQlBTTQzN1hfQ1RSTF9VU0IyX09UR1NFU1NFTkRfRU4pOworCQl9IGVsc2UgeworCQkJdmFsICY9IH4oQU00MzdYX0NUUkxfVVNCMl9PVEdWREVUX0VOIHwKKwkJCQkJQU00MzdYX0NUUkxfVVNCMl9PVEdTRVNTRU5EX0VOKTsKKwkJCXZhbCB8PSAoQU00MzdYX0NUUkxfVVNCMl9QSFlfUEQgfAorCQkJCQkgQU00MzdYX0NUUkxfVVNCMl9PVEdfUEQpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiJXM6IHR5cGUgJWQgbm90IHJlY29nbml6ZWRcbiIsCisJCQlfX2Z1bmNfXywgY29udHJvbF9waHktPnR5cGUpOworCQlicmVhazsKKwl9CisKKwl3cml0ZWwodmFsLCBjb250cm9sX3BoeS0+cG93ZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwob21hcF9jb250cm9sX3BoeV9wb3dlcik7CisKKy8qKgorICogb21hcF9jb250cm9sX3VzYl9ob3N0X21vZGUgLSBzZXQgQVZBTElELCBWQlVTVkFMSUQgYW5kIElEIHBpbiBpbiBncm91bmRlZAorICogQGN0cmxfcGh5OiBzdHJ1Y3Qgb21hcF9jb250cm9sX3BoeSAqCisgKgorICogV3JpdGVzIHRvIHRoZSBtYWlsYm94IHJlZ2lzdGVyIHRvIG5vdGlmeSB0aGUgdXNiIGNvcmUgdGhhdCBhIHVzYgorICogZGV2aWNlIGhhcyBiZWVuIGNvbm5lY3RlZC4KKyAqLworc3RhdGljIHZvaWQgb21hcF9jb250cm9sX3VzYl9ob3N0X21vZGUoc3RydWN0IG9tYXBfY29udHJvbF9waHkgKmN0cmxfcGh5KQoreworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbChjdHJsX3BoeS0+b3RnaHNfY29udHJvbCk7CisJdmFsICY9IH4oT01BUF9DVFJMX0RFVl9JRERJRyB8IE9NQVBfQ1RSTF9ERVZfU0VTU0VORCk7CisJdmFsIHw9IE9NQVBfQ1RSTF9ERVZfQVZBTElEIHwgT01BUF9DVFJMX0RFVl9WQlVTVkFMSUQ7CisJd3JpdGVsKHZhbCwgY3RybF9waHktPm90Z2hzX2NvbnRyb2wpOworfQorCisvKioKKyAqIG9tYXBfY29udHJvbF91c2JfZGV2aWNlX21vZGUgLSBzZXQgQVZBTElELCBWQlVTVkFMSUQgYW5kIElEIHBpbiBpbiBoaWdoCisgKiBpbXBlZGFuY2UKKyAqIEBjdHJsX3BoeTogc3RydWN0IG9tYXBfY29udHJvbF9waHkgKgorICoKKyAqIFdyaXRlcyB0byB0aGUgbWFpbGJveCByZWdpc3RlciB0byBub3RpZnkgdGhlIHVzYiBjb3JlIHRoYXQgaXQgaGFzIGJlZW4KKyAqIGNvbm5lY3RlZCB0byBhIHVzYiBob3N0LgorICovCitzdGF0aWMgdm9pZCBvbWFwX2NvbnRyb2xfdXNiX2RldmljZV9tb2RlKHN0cnVjdCBvbWFwX2NvbnRyb2xfcGh5ICpjdHJsX3BoeSkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gcmVhZGwoY3RybF9waHktPm90Z2hzX2NvbnRyb2wpOworCXZhbCAmPSB+T01BUF9DVFJMX0RFVl9TRVNTRU5EOworCXZhbCB8PSBPTUFQX0NUUkxfREVWX0lERElHIHwgT01BUF9DVFJMX0RFVl9BVkFMSUQgfAorCQlPTUFQX0NUUkxfREVWX1ZCVVNWQUxJRDsKKwl3cml0ZWwodmFsLCBjdHJsX3BoeS0+b3RnaHNfY29udHJvbCk7Cit9CisKKy8qKgorICogb21hcF9jb250cm9sX3VzYl9zZXRfc2Vzc2lvbmVuZCAtIEVuYWJsZSBTRVNTSU9ORU5EIGFuZCBJRElHIHRvIGhpZ2gKKyAqIGltcGVkYW5jZQorICogQGN0cmxfcGh5OiBzdHJ1Y3Qgb21hcF9jb250cm9sX3BoeSAqCisgKgorICogV3JpdGVzIHRvIHRoZSBtYWlsYm94IHJlZ2lzdGVyIHRvIG5vdGlmeSB0aGUgdXNiIGNvcmUgaXQncyBub3cgaW4KKyAqIGRpc2Nvbm5lY3RlZCBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgb21hcF9jb250cm9sX3VzYl9zZXRfc2Vzc2lvbmVuZChzdHJ1Y3Qgb21hcF9jb250cm9sX3BoeSAqY3RybF9waHkpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHJlYWRsKGN0cmxfcGh5LT5vdGdoc19jb250cm9sKTsKKwl2YWwgJj0gfihPTUFQX0NUUkxfREVWX0FWQUxJRCB8IE9NQVBfQ1RSTF9ERVZfVkJVU1ZBTElEKTsKKwl2YWwgfD0gT01BUF9DVFJMX0RFVl9JRERJRyB8IE9NQVBfQ1RSTF9ERVZfU0VTU0VORDsKKwl3cml0ZWwodmFsLCBjdHJsX3BoeS0+b3RnaHNfY29udHJvbCk7Cit9CisKKy8qKgorICogb21hcF9jb250cm9sX3VzYl9zZXRfbW9kZSAtIENhbGxzIHRvIGZ1bmN0aW9ucyB0byBzZXQgVVNCIGluIG9uZSBvZiBob3N0IG1vZGUKKyAqIG9yIGRldmljZSBtb2RlIG9yIHRvIGRlbm90ZSBkaXNjb25uZWN0ZWQgc3RhdGUKKyAqIEBkZXY6IHRoZSBjb250cm9sIG1vZHVsZSBkZXZpY2UKKyAqIEBtb2RlOiBUaGUgbW9kZSB0byB3aGljaCB1c2Igc2hvdWxkIGJlIGNvbmZpZ3VyZWQKKyAqCisgKiBUaGlzIGlzIGFuIEFQSSB0byB3cml0ZSB0byB0aGUgbWFpbGJveCByZWdpc3RlciB0byBub3RpZnkgdGhlIHVzYiBjb3JlIHRoYXQKKyAqIGEgdXNiIGRldmljZSBoYXMgYmVlbiBjb25uZWN0ZWQuCisgKi8KK3ZvaWQgb21hcF9jb250cm9sX3VzYl9zZXRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJZW51bSBvbWFwX2NvbnRyb2xfdXNiX21vZGUgbW9kZSkKK3sKKwlzdHJ1Y3Qgb21hcF9jb250cm9sX3BoeQkqY3RybF9waHk7CisKKwlpZiAoSVNfRVJSKGRldikgfHwgIWRldikKKwkJcmV0dXJuOworCisJY3RybF9waHkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghY3RybF9waHkpIHsKKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIGNvbnRyb2wgcGh5IGRldmljZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY3RybF9waHktPnR5cGUgIT0gT01BUF9DVFJMX1RZUEVfT1RHSFMpCisJCXJldHVybjsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgVVNCX01PREVfSE9TVDoKKwkJb21hcF9jb250cm9sX3VzYl9ob3N0X21vZGUoY3RybF9waHkpOworCQlicmVhazsKKwljYXNlIFVTQl9NT0RFX0RFVklDRToKKwkJb21hcF9jb250cm9sX3VzYl9kZXZpY2VfbW9kZShjdHJsX3BoeSk7CisJCWJyZWFrOworCWNhc2UgVVNCX01PREVfRElTQ09OTkVDVDoKKwkJb21hcF9jb250cm9sX3VzYl9zZXRfc2Vzc2lvbmVuZChjdHJsX3BoeSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl92ZGJnKGRldiwgImludmFsaWQgb21hcCBjb250cm9sIHVzYiBtb2RlXG4iKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2NvbnRyb2xfdXNiX3NldF9tb2RlKTsKKworI2lmZGVmIENPTkZJR19PRgorCitzdGF0aWMgY29uc3QgZW51bSBvbWFwX2NvbnRyb2xfcGh5X3R5cGUgb3RnaHNfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX09UR0hTOworc3RhdGljIGNvbnN0IGVudW0gb21hcF9jb250cm9sX3BoeV90eXBlIHVzYjJfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX1VTQjI7CitzdGF0aWMgY29uc3QgZW51bSBvbWFwX2NvbnRyb2xfcGh5X3R5cGUgcGlwZTNfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX1BJUEUzOworc3RhdGljIGNvbnN0IGVudW0gb21hcF9jb250cm9sX3BoeV90eXBlIGRyYTd1c2IyX2RhdGEgPSBPTUFQX0NUUkxfVFlQRV9EUkE3VVNCMjsKK3N0YXRpYyBjb25zdCBlbnVtIG9tYXBfY29udHJvbF9waHlfdHlwZSBhbTQzN3VzYjJfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX0FNNDM3VVNCMjsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb21hcF9jb250cm9sX3BoeV9pZF90YWJsZVtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAidGksY29udHJvbC1waHktb3RnaHMiLAorCQkuZGF0YSA9ICZvdGdoc19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJ0aSxjb250cm9sLXBoeS11c2IyIiwKKwkJLmRhdGEgPSAmdXNiMl9kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJ0aSxjb250cm9sLXBoeS1waXBlMyIsCisJCS5kYXRhID0gJnBpcGUzX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInRpLGNvbnRyb2wtcGh5LXVzYjItZHJhNyIsCisJCS5kYXRhID0gJmRyYTd1c2IyX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInRpLGNvbnRyb2wtcGh5LXVzYjItYW00MzciLAorCQkuZGF0YSA9ICZhbTQzN3VzYjJfZGF0YSwKKwl9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9tYXBfY29udHJvbF9waHlfaWRfdGFibGUpOworI2VuZGlmCisKKworc3RhdGljIGludCBvbWFwX2NvbnRyb2xfcGh5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlCSpyZXM7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQ7CisJc3RydWN0IG9tYXBfY29udHJvbF9waHkgKmNvbnRyb2xfcGh5OworCisJb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2Uob2ZfbWF0Y2hfcHRyKG9tYXBfY29udHJvbF9waHlfaWRfdGFibGUpLAorCQkJCSZwZGV2LT5kZXYpOworCWlmICghb2ZfaWQpCisJCXJldHVybiAtRUlOVkFMOworCisJY29udHJvbF9waHkgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjb250cm9sX3BoeSksCisJCUdGUF9LRVJORUwpOworCWlmICghY29udHJvbF9waHkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jIG1lbW9yeSBmb3IgY29udHJvbCBwaHlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljb250cm9sX3BoeS0+ZGV2ID0gJnBkZXYtPmRldjsKKwljb250cm9sX3BoeS0+dHlwZSA9ICooZW51bSBvbWFwX2NvbnRyb2xfcGh5X3R5cGUgKilvZl9pZC0+ZGF0YTsKKworCWlmIChjb250cm9sX3BoeS0+dHlwZSA9PSBPTUFQX0NUUkxfVFlQRV9PVEdIUykgeworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAorCQkJIm90Z2hzX2NvbnRyb2wiKTsKKwkJY29udHJvbF9waHktPm90Z2hzX2NvbnRyb2wgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoCisJCQkmcGRldi0+ZGV2LCByZXMpOworCQlpZiAoSVNfRVJSKGNvbnRyb2xfcGh5LT5vdGdoc19jb250cm9sKSkKKwkJCXJldHVybiBQVFJfRVJSKGNvbnRyb2xfcGh5LT5vdGdoc19jb250cm9sKTsKKwl9IGVsc2UgeworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAorCQkJCSJwb3dlciIpOworCQljb250cm9sX3BoeS0+cG93ZXIgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwkJaWYgKElTX0VSUihjb250cm9sX3BoeS0+cG93ZXIpKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZG4ndCBnZXQgcG93ZXIgcmVnaXN0ZXJcbiIpOworCQkJcmV0dXJuIFBUUl9FUlIoY29udHJvbF9waHktPnBvd2VyKTsKKwkJfQorCX0KKworCWlmIChjb250cm9sX3BoeS0+dHlwZSA9PSBPTUFQX0NUUkxfVFlQRV9QSVBFMykgeworCQljb250cm9sX3BoeS0+c3lzX2NsayA9IGRldm1fY2xrX2dldChjb250cm9sX3BoeS0+ZGV2LAorCQkJInN5c19jbGtpbiIpOworCQlpZiAoSVNfRVJSKGNvbnRyb2xfcGh5LT5zeXNfY2xrKSkgeworCQkJcHJfZXJyKCIlczogdW5hYmxlIHRvIGdldCBzeXNfY2xraW5cbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJZGV2X3NldF9kcnZkYXRhKGNvbnRyb2xfcGh5LT5kZXYsIGNvbnRyb2xfcGh5KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwX2NvbnRyb2xfcGh5X2RyaXZlciA9IHsKKwkucHJvYmUJCT0gb21hcF9jb250cm9sX3BoeV9wcm9iZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAib21hcC1jb250cm9sLXBoeSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIob21hcF9jb250cm9sX3BoeV9pZF90YWJsZSksCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfY29udHJvbF9waHlfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9tYXBfY29udHJvbF9waHlfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbChvbWFwX2NvbnRyb2xfcGh5X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgb21hcF9jb250cm9sX3BoeV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9tYXBfY29udHJvbF9waHlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG9tYXBfY29udHJvbF9waHlfZXhpdCk7CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06IG9tYXBfY29udHJvbF9waHkiKTsKK01PRFVMRV9BVVRIT1IoIlRleGFzIEluc3RydW1lbnRzIEluYy4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiT01BUCBDb250cm9sIE1vZHVsZSBQSFkgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktb21hcC11c2IyLmMgYi9kcml2ZXJzL3BoeS9waHktb21hcC11c2IyLmMKaW5kZXggNzY5OTc1Mi4uYTIyMDVhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LW9tYXAtdXNiMi5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1vbWFwLXVzYjIuYwpAQCAtMjEsMTYgKzIxLDE5IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC91c2Ivb21hcF91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvb21hcF91c2IuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvcGh5X2NvbXBhbmlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9vbWFwX2NvbnRyb2xfdXNiLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L29tYXBfY29udHJvbF9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KIAorI2RlZmluZSBVU0IyUEhZX0RJU0NPTl9CWVBfTEFUQ0ggKDEgPDwgMzEpCisjZGVmaW5lIFVTQjJQSFlfQU5BX0NPTkZJRzEgMHg0YworCiAvKioKICAqIG9tYXBfdXNiMl9zZXRfY29tcGFyYXRvciAtIGxpbmtzIHRoZSBjb21wYXJhdG9yIHByZXNlbnQgaW4gdGhlIHN5dGVtIHdpdGgKICAqCXRoaXMgcGh5CkBAIC05OCwzMyArMTAxLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb21hcF91c2IyX3N1c3BlbmQoc3RydWN0IHVzYl9waHkgKngsIGludCBzdXNwZW5kKQotewotCXN0cnVjdCBvbWFwX3VzYiAqcGh5ID0gcGh5X3RvX29tYXB1c2IoeCk7Ci0JaW50IHJldDsKLQotCWlmIChzdXNwZW5kICYmICFwaHktPmlzX3N1c3BlbmRlZCkgewotCQlvbWFwX2NvbnRyb2xfdXNiX3BoeV9wb3dlcihwaHktPmNvbnRyb2xfZGV2LCAwKTsKLQkJcG1fcnVudGltZV9wdXRfc3luYyhwaHktPmRldik7Ci0JCXBoeS0+aXNfc3VzcGVuZGVkID0gMTsKLQl9IGVsc2UgaWYgKCFzdXNwZW5kICYmIHBoeS0+aXNfc3VzcGVuZGVkKSB7Ci0JCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMocGh5LT5kZXYpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihwaHktPmRldiwgImdldF9zeW5jIGZhaWxlZCB3aXRoIGVyciAlZFxuIiwgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJb21hcF9jb250cm9sX3VzYl9waHlfcG93ZXIocGh5LT5jb250cm9sX2RldiwgMSk7Ci0JCXBoeS0+aXNfc3VzcGVuZGVkID0gMDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBvbWFwX3VzYl9wb3dlcl9vZmYoc3RydWN0IHBoeSAqeCkKIHsKIAlzdHJ1Y3Qgb21hcF91c2IgKnBoeSA9IHBoeV9nZXRfZHJ2ZGF0YSh4KTsKIAotCW9tYXBfY29udHJvbF91c2JfcGh5X3Bvd2VyKHBoeS0+Y29udHJvbF9kZXYsIDApOworCW9tYXBfY29udHJvbF9waHlfcG93ZXIocGh5LT5jb250cm9sX2RldiwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEzMywzMCArMTE0LDEwMyBAQAogewogCXN0cnVjdCBvbWFwX3VzYiAqcGh5ID0gcGh5X2dldF9kcnZkYXRhKHgpOwogCi0Jb21hcF9jb250cm9sX3VzYl9waHlfcG93ZXIocGh5LT5jb250cm9sX2RldiwgMSk7CisJb21hcF9jb250cm9sX3BoeV9wb3dlcihwaHktPmNvbnRyb2xfZGV2LCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBfdXNiX2luaXQoc3RydWN0IHBoeSAqeCkKK3sKKwlzdHJ1Y3Qgb21hcF91c2IgKnBoeSA9IHBoeV9nZXRfZHJ2ZGF0YSh4KTsKKwl1MzIgdmFsOworCisJaWYgKHBoeS0+ZmxhZ3MgJiBPTUFQX1VTQjJfQ0FMSUJSQVRFX0ZBTFNFX0RJU0NPTk5FQ1QpIHsKKwkJLyoKKwkJICoKKwkJICogUmVkdWNlIHRoZSBzZW5zaXRpdml0eSBvZiBpbnRlcm5hbCBQSFkgYnkgZW5hYmxpbmcgdGhlCisJCSAqIERJU0NPTl9CWVBfTEFUQ0ggb2YgdGhlIFVTQjJQSFlfQU5BX0NPTkZJRzEgcmVnaXN0ZXIuIFRoaXMKKwkJICogcmVzb2x2ZXMgaXNzdWVzIHdpdGggY2VydGFpbiBkZXZpY2VzIHdoaWNoIGNhbiBvdGhlcndpc2UKKwkJICogYmUgcHJvbmUgdG8gZmFsc2UgZGlzY29ubmVjdHMuCisJCSAqCisJCSAqLworCQl2YWwgPSBvbWFwX3VzYl9yZWFkbChwaHktPnBoeV9iYXNlLCBVU0IyUEhZX0FOQV9DT05GSUcxKTsKKwkJdmFsIHw9IFVTQjJQSFlfRElTQ09OX0JZUF9MQVRDSDsKKwkJb21hcF91c2Jfd3JpdGVsKHBoeS0+cGh5X2Jhc2UsIFVTQjJQSFlfQU5BX0NPTkZJRzEsIHZhbCk7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGh5X29wcyBvcHMgPSB7CisJLmluaXQJCT0gb21hcF91c2JfaW5pdCwKIAkucG93ZXJfb24JPSBvbWFwX3VzYl9wb3dlcl9vbiwKIAkucG93ZXJfb2ZmCT0gb21hcF91c2JfcG93ZXJfb2ZmLAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIH07CiAKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX3BoeV9kYXRhIG9tYXBfdXNiMl9kYXRhID0geworCS5sYWJlbCA9ICJvbWFwX3VzYjIiLAorCS5mbGFncyA9IE9NQVBfVVNCMl9IQVNfU1RBUlRfU1JQIHwgT01BUF9VU0IyX0hBU19TRVRfVkJVUywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX3BoeV9kYXRhIG9tYXA1X3VzYjJfZGF0YSA9IHsKKwkubGFiZWwgPSAib21hcDVfdXNiMiIsCisJLmZsYWdzID0gMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX3BoeV9kYXRhIGRyYTd4X3VzYjJfZGF0YSA9IHsKKwkubGFiZWwgPSAiZHJhN3hfdXNiMiIsCisJLmZsYWdzID0gT01BUF9VU0IyX0NBTElCUkFURV9GQUxTRV9ESVNDT05ORUNULAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfcGh5X2RhdGEgYW00Mzd4X3VzYjJfZGF0YSA9IHsKKwkubGFiZWwgPSAiYW00Mzd4X3VzYjIiLAorCS5mbGFncyA9ICAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb21hcF91c2IyX2lkX3RhYmxlW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJ0aSxvbWFwLXVzYjIiLAorCQkuZGF0YSA9ICZvbWFwX3VzYjJfZGF0YSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAidGksb21hcDUtdXNiMiIsCisJCS5kYXRhID0gJm9tYXA1X3VzYjJfZGF0YSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAidGksZHJhN3gtdXNiMiIsCisJCS5kYXRhID0gJmRyYTd4X3VzYjJfZGF0YSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAidGksYW00Mzd4LXVzYjIiLAorCQkuZGF0YSA9ICZhbTQzN3hfdXNiMl9kYXRhLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb21hcF91c2IyX2lkX3RhYmxlKTsKKyNlbmRpZgorCiBzdGF0aWMgaW50IG9tYXBfdXNiMl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBvbWFwX3VzYgkqcGh5OwogCXN0cnVjdCBwaHkgKmdlbmVyaWNfcGh5OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXN0cnVjdCBwaHlfcHJvdmlkZXIgKnBoeV9wcm92aWRlcjsKIAlzdHJ1Y3QgdXNiX290ZyAqb3RnOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbF9ub2RlOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNvbnRyb2xfcGRldjsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZDsKKwlzdHJ1Y3QgdXNiX3BoeV9kYXRhICpwaHlfZGF0YTsKIAotCWlmICghbm9kZSkKKwlvZl9pZCA9IG9mX21hdGNoX2RldmljZShvZl9tYXRjaF9wdHIob21hcF91c2IyX2lkX3RhYmxlKSwgJnBkZXYtPmRldik7CisKKwlpZiAoIW9mX2lkKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCXBoeV9kYXRhID0gKHN0cnVjdCB1c2JfcGh5X2RhdGEgKilvZl9pZC0+ZGF0YTsKKwogCXBoeSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBoeSksIEdGUF9LRVJORUwpOwogCWlmICghcGh5KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFVTQjIgUEhZXG4iKTsKQEAgLTE3MiwxMSArMjI2LDE4IEBACiAJcGh5LT5kZXYJCT0gJnBkZXYtPmRldjsKIAogCXBoeS0+cGh5LmRldgkJPSBwaHktPmRldjsKLQlwaHktPnBoeS5sYWJlbAkJPSAib21hcC11c2IyIjsKLQlwaHktPnBoeS5zZXRfc3VzcGVuZAk9IG9tYXBfdXNiMl9zdXNwZW5kOworCXBoeS0+cGh5LmxhYmVsCQk9IHBoeV9kYXRhLT5sYWJlbDsKIAlwaHktPnBoeS5vdGcJCT0gb3RnOwogCXBoeS0+cGh5LnR5cGUJCT0gVVNCX1BIWV9UWVBFX1VTQjI7CiAKKwlpZiAocGh5X2RhdGEtPmZsYWdzICYgT01BUF9VU0IyX0NBTElCUkFURV9GQUxTRV9ESVNDT05ORUNUKSB7CisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJCXBoeS0+cGh5X2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwkJaWYgKCFwaHktPnBoeV9iYXNlKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXBoeS0+ZmxhZ3MgfD0gT01BUF9VU0IyX0NBTElCUkFURV9GQUxTRV9ESVNDT05ORUNUOworCX0KKwogCWNvbnRyb2xfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobm9kZSwgImN0cmwtbW9kdWxlIiwgMCk7CiAJaWYgKCFjb250cm9sX25vZGUpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBjb250cm9sIGRldmljZSBwaGFuZGxlXG4iKTsKQEAgLTE5MCwxNCArMjUxLDE0IEBACiAJfQogCiAJcGh5LT5jb250cm9sX2RldiA9ICZjb250cm9sX3BkZXYtPmRldjsKLQotCXBoeS0+aXNfc3VzcGVuZGVkCT0gMTsKLQlvbWFwX2NvbnRyb2xfdXNiX3BoeV9wb3dlcihwaHktPmNvbnRyb2xfZGV2LCAwKTsKKwlvbWFwX2NvbnRyb2xfcGh5X3Bvd2VyKHBoeS0+Y29udHJvbF9kZXYsIDApOwogCiAJb3RnLT5zZXRfaG9zdAkJPSBvbWFwX3VzYl9zZXRfaG9zdDsKIAlvdGctPnNldF9wZXJpcGhlcmFsCT0gb21hcF91c2Jfc2V0X3BlcmlwaGVyYWw7Ci0Jb3RnLT5zZXRfdmJ1cwkJPSBvbWFwX3VzYl9zZXRfdmJ1czsKLQlvdGctPnN0YXJ0X3NycAkJPSBvbWFwX3VzYl9zdGFydF9zcnA7CisJaWYgKHBoeV9kYXRhLT5mbGFncyAmIE9NQVBfVVNCMl9IQVNfU0VUX1ZCVVMpCisJCW90Zy0+c2V0X3ZidXMJCT0gb21hcF91c2Jfc2V0X3ZidXM7CisJaWYgKHBoeV9kYXRhLT5mbGFncyAmIE9NQVBfVVNCMl9IQVNfU1RBUlRfU1JQKQorCQlvdGctPnN0YXJ0X3NycAkJPSBvbWFwX3VzYl9zdGFydF9zcnA7CiAJb3RnLT5waHkJCT0gJnBoeS0+cGh5OwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGh5KTsKQEAgLTI5NywxNCArMzU4LDYgQEAKICNkZWZpbmUgREVWX1BNX09QUyAgICAgTlVMTAogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfT0YKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9tYXBfdXNiMl9pZF90YWJsZVtdID0gewotCXsgLmNvbXBhdGlibGUgPSAidGksb21hcC11c2IyIiB9LAotCXt9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb21hcF91c2IyX2lkX3RhYmxlKTsKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwX3VzYjJfZHJpdmVyID0gewogCS5wcm9iZQkJPSBvbWFwX3VzYjJfcHJvYmUsCiAJLnJlbW92ZQkJPSBvbWFwX3VzYjJfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXNhbXN1bmctdXNiMi5jIGIvZHJpdmVycy9waHkvcGh5LXNhbXN1bmctdXNiMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOGM2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BoeS9waHktc2Ftc3VuZy11c2IyLmMKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKiBTYW1zdW5nIFNvQyBVU0IgMS4xLzIuMCBQSFkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3I6IEthbWlsIERlYnNraSA8ay5kZWJza2lAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgInBoeS1zYW1zdW5nLXVzYjIuaCIKKworc3RhdGljIGludCBzYW1zdW5nX3VzYjJfcGh5X3Bvd2VyX29uKHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqaW5zdCA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciAqZHJ2ID0gaW5zdC0+ZHJ2OworCWludCByZXQ7CisKKwlkZXZfZGJnKGRydi0+ZGV2LCAiUmVxdWVzdCB0byBwb3dlcl9vbiBcIiVzXCIgdXNiIHBoeVxuIiwKKwkJaW5zdC0+Y2ZnLT5sYWJlbCk7CisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRydi0+Y2xrKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9tYWluX2NsazsKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZHJ2LT5yZWZfY2xrKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9pbnN0YW5jZV9jbGs7CisJaWYgKGluc3QtPmNmZy0+cG93ZXJfb24pIHsKKwkJc3Bpbl9sb2NrKCZkcnYtPmxvY2spOworCQlyZXQgPSBpbnN0LT5jZmctPnBvd2VyX29uKGluc3QpOworCQlzcGluX3VubG9jaygmZHJ2LT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2luc3RhbmNlX2NsazoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZHJ2LT5jbGspOworZXJyX21haW5fY2xrOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2Ftc3VuZ191c2IyX3BoeV9wb3dlcl9vZmYoc3RydWN0IHBoeSAqcGh5KQoreworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICppbnN0ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfZHJpdmVyICpkcnYgPSBpbnN0LT5kcnY7CisJaW50IHJldCA9IDA7CisKKwlkZXZfZGJnKGRydi0+ZGV2LCAiUmVxdWVzdCB0byBwb3dlcl9vZmYgXCIlc1wiIHVzYiBwaHlcbiIsCisJCWluc3QtPmNmZy0+bGFiZWwpOworCWlmIChpbnN0LT5jZmctPnBvd2VyX29mZikgeworCQlzcGluX2xvY2soJmRydi0+bG9jayk7CisJCXJldCA9IGluc3QtPmNmZy0+cG93ZXJfb2ZmKGluc3QpOworCQlzcGluX3VubG9jaygmZHJ2LT5sb2NrKTsKKwl9CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+cmVmX2Nsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+Y2xrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHBoeV9vcHMgc2Ftc3VuZ191c2IyX3BoeV9vcHMgPSB7CisJLnBvd2VyX29uCT0gc2Ftc3VuZ191c2IyX3BoeV9wb3dlcl9vbiwKKwkucG93ZXJfb2ZmCT0gc2Ftc3VuZ191c2IyX3BoeV9wb3dlcl9vZmYsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCBwaHkgKnNhbXN1bmdfdXNiMl9waHlfeGxhdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICphcmdzKQoreworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciAqZHJ2OworCisJZHJ2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaWYgKCFkcnYpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJaWYgKFdBUk5fT04oYXJncy0+YXJnc1swXSA+PSBkcnYtPmNmZy0+bnVtX3BoeXMpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCXJldHVybiBkcnYtPmluc3RhbmNlc1thcmdzLT5hcmdzWzBdXS5waHk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNhbXN1bmdfdXNiMl9waHlfb2ZfbWF0Y2hbXSA9IHsKKyNpZmRlZiBDT05GSUdfUEhZX0VYWU5PUzQyMTBfVVNCMgorCXsKKwkJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M0MjEwLXVzYjItcGh5IiwKKwkJLmRhdGEgPSAmZXh5bm9zNDIxMF91c2IyX3BoeV9jb25maWcsCisJfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QSFlfRVhZTk9TNFgxMl9VU0IyCisJeworCQkuY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczR4MTItdXNiMi1waHkiLAorCQkuZGF0YSA9ICZleHlub3M0eDEyX3VzYjJfcGh5X2NvbmZpZywKKwl9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1BIWV9FWFlOT1M1MjUwX1VTQjIKKwl7CisJCS5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTI1MC11c2IyLXBoeSIsCisJCS5kYXRhID0gJmV4eW5vczUyNTBfdXNiMl9waHlfY29uZmlnLAorCX0sCisjZW5kaWYKKwl7IH0sCit9OworCitzdGF0aWMgaW50IHNhbXN1bmdfdXNiMl9waHlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKwljb25zdCBzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9jb25maWcgKmNmZzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBwaHlfcHJvdmlkZXIgKnBoeV9wcm92aWRlcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKwlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXIgKmRydjsKKwlpbnQgaSwgcmV0OworCisJaWYgKCFwZGV2LT5kZXYub2Zfbm9kZSkgeworCQlkZXZfZXJyKGRldiwgIlRoaXMgZHJpdmVyIGlzIHJlcXVpcmVkIHRvIGJlIGluc3RhbnRpYXRlZCBmcm9tIGRldmljZSB0cmVlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKHNhbXN1bmdfdXNiMl9waHlfb2ZfbWF0Y2gsIHBkZXYtPmRldi5vZl9ub2RlKTsKKwlpZiAoIW1hdGNoKSB7CisJCWRldl9lcnIoZGV2LCAib2ZfbWF0Y2hfbm9kZSgpIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljZmcgPSBtYXRjaC0+ZGF0YTsKKworCWRydiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXIpICsKKwkJY2ZnLT5udW1fcGh5cyAqIHNpemVvZihzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSksCisJCQkJCQkJCUdGUF9LRVJORUwpOworCWlmICghZHJ2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGRydik7CisJc3Bpbl9sb2NrX2luaXQoJmRydi0+bG9jayk7CisKKwlkcnYtPmNmZyA9IGNmZzsKKwlkcnYtPmRldiA9IGRldjsKKworCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJZHJ2LT5yZWdfcGh5ID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgbWVtKTsKKwlpZiAoSVNfRVJSKGRydi0+cmVnX3BoeSkpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIHJlZ2lzdGVyIG1lbW9yeSAocGh5KVxuIik7CisJCXJldHVybiBQVFJfRVJSKGRydi0+cmVnX3BoeSk7CisJfQorCisJZHJ2LT5yZWdfcG11ID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJInNhbXN1bmcscG11cmVnLXBoYW5kbGUiKTsKKwlpZiAoSVNfRVJSKGRydi0+cmVnX3BtdSkpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIFBNVSByZWdpc3RlcnMgKHZpYSBzeXNjb24pXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZHJ2LT5yZWdfcG11KTsKKwl9CisKKwlpZiAoZHJ2LT5jZmctPmhhc19tb2RlX3N3aXRjaCkgeworCQlkcnYtPnJlZ19zeXMgPSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9waGFuZGxlKAorCQkJCXBkZXYtPmRldi5vZl9ub2RlLCAic2Ftc3VuZyxzeXNyZWctcGhhbmRsZSIpOworCQlpZiAoSVNfRVJSKGRydi0+cmVnX3N5cykpIHsKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIG1hcCBzeXN0ZW0gcmVnaXN0ZXJzICh2aWEgc3lzY29uKVxuIik7CisJCQlyZXR1cm4gUFRSX0VSUihkcnYtPnJlZ19zeXMpOworCQl9CisJfQorCisJZHJ2LT5jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAicGh5Iik7CisJaWYgKElTX0VSUihkcnYtPmNsaykpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IGNsb2NrIG9mIHBoeSBjb250cm9sbGVyXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZHJ2LT5jbGspOworCX0KKworCWRydi0+cmVmX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJyZWYiKTsKKwlpZiAoSVNfRVJSKGRydi0+cmVmX2NsaykpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IHJlZmVyZW5jZSBjbG9jayBmb3IgdGhlIHBoeSBjb250cm9sbGVyXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZHJ2LT5yZWZfY2xrKTsKKwl9CisKKwlkcnYtPnJlZl9yYXRlID0gY2xrX2dldF9yYXRlKGRydi0+cmVmX2Nsayk7CisJaWYgKGRydi0+Y2ZnLT5yYXRlX3RvX2NsaykgeworCQlyZXQgPSBkcnYtPmNmZy0+cmF0ZV90b19jbGsoZHJ2LT5yZWZfcmF0ZSwgJmRydi0+cmVmX3JlZ192YWwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZHJ2LT5jZmctPm51bV9waHlzOyBpKyspIHsKKwkJY2hhciAqbGFiZWwgPSBkcnYtPmNmZy0+cGh5c1tpXS5sYWJlbDsKKwkJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKnAgPSAmZHJ2LT5pbnN0YW5jZXNbaV07CisKKwkJZGV2X2RiZyhkZXYsICJDcmVhdGluZyBwaHkgXCIlc1wiXG4iLCBsYWJlbCk7CisJCXAtPnBoeSA9IGRldm1fcGh5X2NyZWF0ZShkZXYsICZzYW1zdW5nX3VzYjJfcGh5X29wcywgTlVMTCk7CisJCWlmIChJU19FUlIocC0+cGh5KSkgeworCQkJZGV2X2VycihkcnYtPmRldiwgIkZhaWxlZCB0byBjcmVhdGUgdXNiMl9waHkgXCIlc1wiXG4iLAorCQkJCWxhYmVsKTsKKwkJCXJldHVybiBQVFJfRVJSKHAtPnBoeSk7CisJCX0KKworCQlwLT5jZmcgPSAmZHJ2LT5jZmctPnBoeXNbaV07CisJCXAtPmRydiA9IGRydjsKKwkJcGh5X3NldF9idXNfd2lkdGgocC0+cGh5LCA4KTsKKwkJcGh5X3NldF9kcnZkYXRhKHAtPnBoeSwgcCk7CisJfQorCisJcGh5X3Byb3ZpZGVyID0gZGV2bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIoZGV2LAorCQkJCQkJCXNhbXN1bmdfdXNiMl9waHlfeGxhdGUpOworCWlmIChJU19FUlIocGh5X3Byb3ZpZGVyKSkgeworCQlkZXZfZXJyKGRydi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHBoeSBwcm92aWRlclxuIik7CisJCXJldHVybiBQVFJfRVJSKHBoeV9wcm92aWRlcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNhbXN1bmdfdXNiMl9waHlfZHJpdmVyID0geworCS5wcm9iZQk9IHNhbXN1bmdfdXNiMl9waHlfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm9mX21hdGNoX3RhYmxlCT0gc2Ftc3VuZ191c2IyX3BoeV9vZl9tYXRjaCwKKwkJLm5hbWUJCT0gInNhbXN1bmctdXNiMi1waHkiLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJfQorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzYW1zdW5nX3VzYjJfcGh5X2RyaXZlcik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgUzVQL0VYWU5PUyBTb0MgVVNCIFBIWSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkthbWlsIERlYnNraSA8ay5kZWJza2lAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnNhbXN1bmctdXNiMi1waHkiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1zYW1zdW5nLXVzYjIuaCBiL2RyaXZlcnMvcGh5L3BoeS1zYW1zdW5nLXVzYjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWIzMTcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waHkvcGh5LXNhbXN1bmctdXNiMi5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBTYW1zdW5nIFNvQyBVU0IgMS4xLzIuMCBQSFkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3I6IEthbWlsIERlYnNraSA8ay5kZWJza2lAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9QSFlfRVhZTk9TX1VTQjJfSAorI2RlZmluZSBfUEhZX0VYWU5PU19VU0IyX0gKKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjZGVmaW5lIEtIWiAxMDAwCisjZGVmaW5lIE1IWiAoS0haICogS0haKQorCitzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXI7CitzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZTsKK3N0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2NvbmZpZzsKKworc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgeworCWNvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfY29tbW9uX3BoeSAqY2ZnOworCXN0cnVjdCBwaHkgKnBoeTsKKwlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXIgKmRydjsKKwlib29sIGVuYWJsZWQ7Cit9OworCitzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXIgeworCWNvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2NvbmZpZyAqY2ZnOworCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrICpyZWZfY2xrOworCXVuc2lnbmVkIGxvbmcgcmVmX3JhdGU7CisJdTMyIHJlZl9yZWdfdmFsOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl2b2lkIF9faW9tZW0gKnJlZ19waHk7CisJc3RydWN0IHJlZ21hcCAqcmVnX3BtdTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdfc3lzOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSBpbnN0YW5jZXNbMF07Cit9OworCitzdHJ1Y3Qgc2Ftc3VuZ191c2IyX2NvbW1vbl9waHkgeworCWludCAoKnBvd2VyX29uKShzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqKTsKKwlpbnQgKCpwb3dlcl9vZmYpKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICopOworCXVuc2lnbmVkIGludCBpZDsKKwljaGFyICpsYWJlbDsKK307CisKKworc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfY29uZmlnIHsKKwljb25zdCBzdHJ1Y3Qgc2Ftc3VuZ191c2IyX2NvbW1vbl9waHkgKnBoeXM7CisJaW50ICgqcmF0ZV90b19jbGspKHVuc2lnbmVkIGxvbmcsIHUzMiAqKTsKKwl1bnNpZ25lZCBpbnQgbnVtX3BoeXM7CisJYm9vbCBoYXNfbW9kZV9zd2l0Y2g7Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfY29uZmlnIGV4eW5vczQyMTBfdXNiMl9waHlfY29uZmlnOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2NvbmZpZyBleHlub3M0eDEyX3VzYjJfcGh5X2NvbmZpZzsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9jb25maWcgZXh5bm9zNTI1MF91c2IyX3BoeV9jb25maWc7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1zdW40aS11c2IuYyBiL2RyaXZlcnMvcGh5L3BoeS1zdW40aS11c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmU2YzRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waHkvcGh5LXN1bjRpLXVzYi5jCkBAIC0wLDAgKzEsMzMxIEBACisvKgorICogQWxsd2lubmVyIHN1bjRpIFVTQiBwaHkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CisgKgorICogQmFzZWQgb24gY29kZSBmcm9tCisgKiBBbGx3aW5uZXIgVGVjaG5vbG9neSBDby4sIEx0ZC4gPHd3dy5hbGx3aW5uZXJ0ZWNoLmNvbT4KKyAqCisgKiBNb2RlbGxlZCBhZnRlcjogU2Ftc3VuZyBTNVAvRVhZTk9TIFNvQyBzZXJpZXMgTUlQSSBDU0lTL0RTSU0gRFBIWSBkcml2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMyBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQXV0aG9yOiBTeWx3ZXN0ZXIgTmF3cm9ja2kgPHMubmF3cm9ja2lAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CisKKyNkZWZpbmUgUkVHX0lTQ1IJCQkweDAwCisjZGVmaW5lIFJFR19QSFlDVEwJCQkweDA0CisjZGVmaW5lIFJFR19QSFlCSVNUCQkJMHgwOAorI2RlZmluZSBSRUdfUEhZVFVORQkJCTB4MGMKKworI2RlZmluZSBQSFlDVExfREFUQQkJCUJJVCg3KQorCisjZGVmaW5lIFNVTlhJX0FIQl9JQ0hSOF9FTgkJQklUKDEwKQorI2RlZmluZSBTVU5YSV9BSEJfSU5DUjRfQlVSU1RfRU4JQklUKDkpCisjZGVmaW5lIFNVTlhJX0FIQl9JTkNSWF9BTElHTl9FTglCSVQoOCkKKyNkZWZpbmUgU1VOWElfVUxQSV9CWVBBU1NfRU4JCUJJVCgwKQorCisvKiBDb21tb24gQ29udHJvbCBCaXRzIGZvciBCb3RoIFBIWXMgKi8KKyNkZWZpbmUgUEhZX1BMTF9CVwkJCTB4MDMKKyNkZWZpbmUgUEhZX1JFUzQ1X0NBTF9FTgkJMHgwYworCisvKiBQcml2YXRlIENvbnRyb2wgQml0cyBmb3IgRWFjaCBQSFkgKi8KKyNkZWZpbmUgUEhZX1RYX0FNUExJVFVERV9UVU5FCQkweDIwCisjZGVmaW5lIFBIWV9UWF9TTEVXUkFURV9UVU5FCQkweDIyCisjZGVmaW5lIFBIWV9WQlVTVkFMSURfVEhfU0VMCQkweDI1CisjZGVmaW5lIFBIWV9QVUxMVVBfUkVTX1NFTAkJMHgyNworI2RlZmluZSBQSFlfT1RHX0ZVTkNfRU4JCQkweDI4CisjZGVmaW5lIFBIWV9WQlVTX0RFVF9FTgkJCTB4MjkKKyNkZWZpbmUgUEhZX0RJU0NPTl9USF9TRUwJCTB4MmEKKworI2RlZmluZSBNQVhfUEhZUwkJCTMKKworc3RydWN0IHN1bjRpX3VzYl9waHlfZGF0YSB7CisJc3RydWN0IGNsayAqY2xrOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJaW50IG51bV9waHlzOworCXUzMiBkaXNjX3RocmVzaDsKKwlzdHJ1Y3Qgc3VuNGlfdXNiX3BoeSB7CisJCXN0cnVjdCBwaHkgKnBoeTsKKwkJdm9pZCBfX2lvbWVtICpwbXU7CisJCXN0cnVjdCByZWd1bGF0b3IgKnZidXM7CisJCXN0cnVjdCByZXNldF9jb250cm9sICpyZXNldDsKKwkJaW50IGluZGV4OworCX0gcGh5c1tNQVhfUEhZU107Cit9OworCisjZGVmaW5lIHRvX3N1bjRpX3VzYl9waHlfZGF0YShwaHkpIFwKKwljb250YWluZXJfb2YoKHBoeSksIHN0cnVjdCBzdW40aV91c2JfcGh5X2RhdGEsIHBoeXNbKHBoeSktPmluZGV4XSkKKworc3RhdGljIHZvaWQgc3VuNGlfdXNiX3BoeV93cml0ZShzdHJ1Y3Qgc3VuNGlfdXNiX3BoeSAqcGh5LCB1MzIgYWRkciwgdTMyIGRhdGEsCisJCQkJaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9kYXRhICpwaHlfZGF0YSA9IHRvX3N1bjRpX3VzYl9waHlfZGF0YShwaHkpOworCXUzMiB0ZW1wLCB1c2JjX2JpdCA9IEJJVChwaHktPmluZGV4ICogMik7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZwaHlfZGF0YS0+bXV0ZXgpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXRlbXAgPSByZWFkbChwaHlfZGF0YS0+YmFzZSArIFJFR19QSFlDVEwpOworCisJCS8qIGNsZWFyIHRoZSBhZGRyZXNzIHBvcnRpb24gKi8KKwkJdGVtcCAmPSB+KDB4ZmYgPDwgOCk7CisKKwkJLyogc2V0IHRoZSBhZGRyZXNzICovCisJCXRlbXAgfD0gKChhZGRyICsgaSkgPDwgOCk7CisJCXdyaXRlbCh0ZW1wLCBwaHlfZGF0YS0+YmFzZSArIFJFR19QSFlDVEwpOworCisJCS8qIHNldCB0aGUgZGF0YSBiaXQgYW5kIGNsZWFyIHVzYmMgYml0Ki8KKwkJdGVtcCA9IHJlYWRiKHBoeV9kYXRhLT5iYXNlICsgUkVHX1BIWUNUTCk7CisJCWlmIChkYXRhICYgMHgxKQorCQkJdGVtcCB8PSBQSFlDVExfREFUQTsKKwkJZWxzZQorCQkJdGVtcCAmPSB+UEhZQ1RMX0RBVEE7CisJCXRlbXAgJj0gfnVzYmNfYml0OworCQl3cml0ZWIodGVtcCwgcGh5X2RhdGEtPmJhc2UgKyBSRUdfUEhZQ1RMKTsKKworCQkvKiBwdWxzZSB1c2JjX2JpdCAqLworCQl0ZW1wID0gcmVhZGIocGh5X2RhdGEtPmJhc2UgKyBSRUdfUEhZQ1RMKTsKKwkJdGVtcCB8PSB1c2JjX2JpdDsKKwkJd3JpdGViKHRlbXAsIHBoeV9kYXRhLT5iYXNlICsgUkVHX1BIWUNUTCk7CisKKwkJdGVtcCA9IHJlYWRiKHBoeV9kYXRhLT5iYXNlICsgUkVHX1BIWUNUTCk7CisJCXRlbXAgJj0gfnVzYmNfYml0OworCQl3cml0ZWIodGVtcCwgcGh5X2RhdGEtPmJhc2UgKyBSRUdfUEhZQ1RMKTsKKworCQlkYXRhID4+PSAxOworCX0KKwltdXRleF91bmxvY2soJnBoeV9kYXRhLT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIHN1bjRpX3VzYl9waHlfcGFzc2J5KHN0cnVjdCBzdW40aV91c2JfcGh5ICpwaHksIGludCBlbmFibGUpCit7CisJdTMyIGJpdHMsIHJlZ192YWx1ZTsKKworCWlmICghcGh5LT5wbXUpCisJCXJldHVybjsKKworCWJpdHMgPSBTVU5YSV9BSEJfSUNIUjhfRU4gfCBTVU5YSV9BSEJfSU5DUjRfQlVSU1RfRU4gfAorCQlTVU5YSV9BSEJfSU5DUlhfQUxJR05fRU4gfCBTVU5YSV9VTFBJX0JZUEFTU19FTjsKKworCXJlZ192YWx1ZSA9IHJlYWRsKHBoeS0+cG11KTsKKworCWlmIChlbmFibGUpCisJCXJlZ192YWx1ZSB8PSBiaXRzOworCWVsc2UKKwkJcmVnX3ZhbHVlICY9IH5iaXRzOworCisJd3JpdGVsKHJlZ192YWx1ZSwgcGh5LT5wbXUpOworfQorCitzdGF0aWMgaW50IHN1bjRpX3VzYl9waHlfaW5pdChzdHJ1Y3QgcGh5ICpfcGh5KQoreworCXN0cnVjdCBzdW40aV91c2JfcGh5ICpwaHkgPSBwaHlfZ2V0X2RydmRhdGEoX3BoeSk7CisJc3RydWN0IHN1bjRpX3VzYl9waHlfZGF0YSAqZGF0YSA9IHRvX3N1bjRpX3VzYl9waHlfZGF0YShwaHkpOworCWludCByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZGF0YS0+Y2xrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcmVzZXRfY29udHJvbF9kZWFzc2VydChwaHktPnJlc2V0KTsKKwlpZiAocmV0KSB7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShkYXRhLT5jbGspOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEFkanVzdCBQSFkncyBtYWduaXR1ZGUgYW5kIHJhdGUgKi8KKwlzdW40aV91c2JfcGh5X3dyaXRlKHBoeSwgUEhZX1RYX0FNUExJVFVERV9UVU5FLCAweDE0LCA1KTsKKworCS8qIERpc2Nvbm5lY3QgdGhyZXNob2xkIGFkanVzdG1lbnQgKi8KKwlzdW40aV91c2JfcGh5X3dyaXRlKHBoeSwgUEhZX0RJU0NPTl9USF9TRUwsIGRhdGEtPmRpc2NfdGhyZXNoLCAyKTsKKworCXN1bjRpX3VzYl9waHlfcGFzc2J5KHBoeSwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdW40aV91c2JfcGh5X2V4aXQoc3RydWN0IHBoeSAqX3BoeSkKK3sKKwlzdHJ1Y3Qgc3VuNGlfdXNiX3BoeSAqcGh5ID0gcGh5X2dldF9kcnZkYXRhKF9waHkpOworCXN0cnVjdCBzdW40aV91c2JfcGh5X2RhdGEgKmRhdGEgPSB0b19zdW40aV91c2JfcGh5X2RhdGEocGh5KTsKKworCXN1bjRpX3VzYl9waHlfcGFzc2J5KHBoeSwgMCk7CisJcmVzZXRfY29udHJvbF9hc3NlcnQocGh5LT5yZXNldCk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhdGEtPmNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdW40aV91c2JfcGh5X3Bvd2VyX29uKHN0cnVjdCBwaHkgKl9waHkpCit7CisJc3RydWN0IHN1bjRpX3VzYl9waHkgKnBoeSA9IHBoeV9nZXRfZHJ2ZGF0YShfcGh5KTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwaHktPnZidXMpCisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUocGh5LT52YnVzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3VuNGlfdXNiX3BoeV9wb3dlcl9vZmYoc3RydWN0IHBoeSAqX3BoeSkKK3sKKwlzdHJ1Y3Qgc3VuNGlfdXNiX3BoeSAqcGh5ID0gcGh5X2dldF9kcnZkYXRhKF9waHkpOworCisJaWYgKHBoeS0+dmJ1cykKKwkJcmVndWxhdG9yX2Rpc2FibGUocGh5LT52YnVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBoeV9vcHMgc3VuNGlfdXNiX3BoeV9vcHMgPSB7CisJLmluaXQJCT0gc3VuNGlfdXNiX3BoeV9pbml0LAorCS5leGl0CQk9IHN1bjRpX3VzYl9waHlfZXhpdCwKKwkucG93ZXJfb24JPSBzdW40aV91c2JfcGh5X3Bvd2VyX29uLAorCS5wb3dlcl9vZmYJPSBzdW40aV91c2JfcGh5X3Bvd2VyX29mZiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHBoeSAqc3VuNGlfdXNiX3BoeV94bGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmFyZ3MpCit7CisJc3RydWN0IHN1bjRpX3VzYl9waHlfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKFdBUk5fT04oYXJncy0+YXJnc1swXSA9PSAwIHx8IGFyZ3MtPmFyZ3NbMF0gPj0gZGF0YS0+bnVtX3BoeXMpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCXJldHVybiBkYXRhLT5waHlzW2FyZ3MtPmFyZ3NbMF1dLnBoeTsKK30KKworc3RhdGljIGludCBzdW40aV91c2JfcGh5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHN1bjRpX3VzYl9waHlfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJdm9pZCBfX2lvbWVtICpwbXUgPSBOVUxMOworCXN0cnVjdCBwaHlfcHJvdmlkZXIgKnBoeV9wcm92aWRlcjsKKwlzdHJ1Y3QgcmVzZXRfY29udHJvbCAqcmVzZXQ7CisJc3RydWN0IHJlZ3VsYXRvciAqdmJ1czsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgcGh5ICpwaHk7CisJY2hhciBuYW1lWzE2XTsKKwlpbnQgaTsKKworCWRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJbXV0ZXhfaW5pdCgmZGF0YS0+bXV0ZXgpOworCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiYWxsd2lubmVyLHN1bjVpLWExMy11c2ItcGh5IikpCisJCWRhdGEtPm51bV9waHlzID0gMjsKKwllbHNlCisJCWRhdGEtPm51bV9waHlzID0gMzsKKworCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImFsbHdpbm5lcixzdW40aS1hMTAtdXNiLXBoeSIpKQorCQlkYXRhLT5kaXNjX3RocmVzaCA9IDM7CisJZWxzZQorCQlkYXRhLT5kaXNjX3RocmVzaCA9IDI7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAicGh5X2N0cmwiKTsKKwlkYXRhLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGRhdGEtPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5iYXNlKTsKKworCWRhdGEtPmNsayA9IGRldm1fY2xrX2dldChkZXYsICJ1c2JfcGh5Iik7CisJaWYgKElTX0VSUihkYXRhLT5jbGspKSB7CisJCWRldl9lcnIoZGV2LCAiY291bGQgbm90IGdldCB1c2JfcGh5IGNsb2NrXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YS0+Y2xrKTsKKwl9CisKKwkvKiBTa2lwIDAsIDAgaXMgdGhlIHBoeSBmb3Igb3RnIHdoaWNoIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiAqLworCWZvciAoaSA9IDE7IGkgPCBkYXRhLT5udW1fcGh5czsgaSsrKSB7CisJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInVzYiVkX3ZidXMiLCBpKTsKKwkJdmJ1cyA9IGRldm1fcmVndWxhdG9yX2dldF9vcHRpb25hbChkZXYsIG5hbWUpOworCQlpZiAoSVNfRVJSKHZidXMpKSB7CisJCQlpZiAoUFRSX0VSUih2YnVzKSA9PSAtRVBST0JFX0RFRkVSKQorCQkJCXJldHVybiAtRVBST0JFX0RFRkVSOworCQkJdmJ1cyA9IE5VTEw7CisJCX0KKworCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJ1c2IlZF9yZXNldCIsIGkpOworCQlyZXNldCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCBuYW1lKTsKKwkJaWYgKElTX0VSUihyZXNldCkpIHsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCByZXNldCAlc1xuIiwgbmFtZSk7CisJCQlyZXR1cm4gUFRSX0VSUihyZXNldCk7CisJCX0KKworCQlpZiAoaSkgeyAvKiBObyBwbXUgZm9yIHVzYmMwICovCisJCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJwbXUlZCIsIGkpOworCQkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LAorCQkJCQkJCUlPUkVTT1VSQ0VfTUVNLCBuYW1lKTsKKwkJCXBtdSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJCQlpZiAoSVNfRVJSKHBtdSkpCisJCQkJcmV0dXJuIFBUUl9FUlIocG11KTsKKwkJfQorCisJCXBoeSA9IGRldm1fcGh5X2NyZWF0ZShkZXYsICZzdW40aV91c2JfcGh5X29wcywgTlVMTCk7CisJCWlmIChJU19FUlIocGh5KSkgeworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY3JlYXRlIFBIWSAlZFxuIiwgaSk7CisJCQlyZXR1cm4gUFRSX0VSUihwaHkpOworCQl9CisKKwkJZGF0YS0+cGh5c1tpXS5waHkgPSBwaHk7CisJCWRhdGEtPnBoeXNbaV0ucG11ID0gcG11OworCQlkYXRhLT5waHlzW2ldLnZidXMgPSB2YnVzOworCQlkYXRhLT5waHlzW2ldLnJlc2V0ID0gcmVzZXQ7CisJCWRhdGEtPnBoeXNbaV0uaW5kZXggPSBpOworCQlwaHlfc2V0X2RydmRhdGEocGh5LCAmZGF0YS0+cGh5c1tpXSk7CisJfQorCisJZGV2X3NldF9kcnZkYXRhKGRldiwgZGF0YSk7CisJcGh5X3Byb3ZpZGVyID0gZGV2bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIoZGV2LCBzdW40aV91c2JfcGh5X3hsYXRlKTsKKwlpZiAoSVNfRVJSKHBoeV9wcm92aWRlcikpCisJCXJldHVybiBQVFJfRVJSKHBoeV9wcm92aWRlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNGlfdXNiX3BoeV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC11c2ItcGh5IiB9LAorCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy11c2ItcGh5IiB9LAorCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjdpLWEyMC11c2ItcGh5IiB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzdW40aV91c2JfcGh5X29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3VuNGlfdXNiX3BoeV9kcml2ZXIgPSB7CisJLnByb2JlCT0gc3VuNGlfdXNiX3BoeV9wcm9iZSwKKwkuZHJpdmVyID0geworCQkub2ZfbWF0Y2hfdGFibGUJPSBzdW40aV91c2JfcGh5X29mX21hdGNoLAorCQkubmFtZSAgPSAic3VuNGktdXNiLXBoeSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0KK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHN1bjRpX3VzYl9waHlfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbGx3aW5uZXIgc3VuNGkgVVNCIHBoeSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktdGktcGlwZTMuYyBiL2RyaXZlcnMvcGh5L3BoeS10aS1waXBlMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MTM2NzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BoeS9waHktdGktcGlwZTMuYwpAQCAtMCwwICsxLDQ3MCBAQAorLyoKKyAqIHBoeS10aS1waXBlMyAtIFBJUEUzIFBIWSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcjogS2lzaG9uIFZpamF5IEFicmFoYW0gSSA8a2lzaG9uQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGh5L29tYXBfY29udHJvbF9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorCisjZGVmaW5lCVBMTF9TVEFUVVMJCTB4MDAwMDAwMDQKKyNkZWZpbmUJUExMX0dPCQkJMHgwMDAwMDAwOAorI2RlZmluZQlQTExfQ09ORklHVVJBVElPTjEJMHgwMDAwMDAwQworI2RlZmluZQlQTExfQ09ORklHVVJBVElPTjIJMHgwMDAwMDAxMAorI2RlZmluZQlQTExfQ09ORklHVVJBVElPTjMJMHgwMDAwMDAxNAorI2RlZmluZQlQTExfQ09ORklHVVJBVElPTjQJMHgwMDAwMDAyMAorCisjZGVmaW5lCVBMTF9SRUdNX01BU0sJCTB4MDAxRkZFMDAKKyNkZWZpbmUJUExMX1JFR01fU0hJRlQJCTB4OQorI2RlZmluZQlQTExfUkVHTV9GX01BU0sJCTB4MDAwM0ZGRkYKKyNkZWZpbmUJUExMX1JFR01fRl9TSElGVAkweDAKKyNkZWZpbmUJUExMX1JFR05fTUFTSwkJMHgwMDAwMDFGRQorI2RlZmluZQlQTExfUkVHTl9TSElGVAkJMHgxCisjZGVmaW5lCVBMTF9TRUxGUkVRRENPX01BU0sJMHgwMDAwMDAwRQorI2RlZmluZQlQTExfU0VMRlJFUURDT19TSElGVAkweDEKKyNkZWZpbmUJUExMX1NEX01BU0sJCTB4MDAwM0ZDMDAKKyNkZWZpbmUJUExMX1NEX1NISUZUCQkxMAorI2RlZmluZQlTRVRfUExMX0dPCQkweDEKKyNkZWZpbmUgUExMX0xET1BXRE4JCUJJVCgxNSkKKyNkZWZpbmUgUExMX1RJQ09QV0ROCQlCSVQoMTYpCisjZGVmaW5lCVBMTF9MT0NLCQkweDIKKyNkZWZpbmUJUExMX0lETEUJCTB4MQorCisvKgorICogVGhpcyBpcyBhbiBFbXBpcmljYWwgdmFsdWUgdGhhdCB3b3JrcywgbmVlZCB0byBjb25maXJtIHRoZSBhY3R1YWwKKyAqIHZhbHVlIHJlcXVpcmVkIGZvciB0aGUgUElQRTNQSFlfUExMX0NPTkZJR1VSQVRJT04yLlBMTF9JRExFIHN0YXR1cworICogdG8gYmUgY29ycmVjdGx5IHJlZmxlY3RlZCBpbiB0aGUgUElQRTNQSFlfUExMX1NUQVRVUyByZWdpc3Rlci4KKyAqLworI2RlZmluZSBQTExfSURMRV9USU1FCTEwMAkvKiBpbiBtaWxsaXNlY29uZHMgKi8KKyNkZWZpbmUgUExMX0xPQ0tfVElNRQkxMDAJLyogaW4gbWlsbGlzZWNvbmRzICovCisKK3N0cnVjdCBwaXBlM19kcGxsX3BhcmFtcyB7CisJdTE2CW07CisJdTgJbjsKKwl1OAlmcmVxOjM7CisJdTgJc2Q7CisJdTMyCW1mOworfTsKKworc3RydWN0IHBpcGUzX2RwbGxfbWFwIHsKKwl1bnNpZ25lZCBsb25nIHJhdGU7CisJc3RydWN0IHBpcGUzX2RwbGxfcGFyYW1zIHBhcmFtczsKK307CisKK3N0cnVjdCB0aV9waXBlMyB7CisJdm9pZCBfX2lvbWVtCQkqcGxsX2N0cmxfYmFzZTsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBkZXZpY2UJCSpjb250cm9sX2RldjsKKwlzdHJ1Y3QgY2xrCQkqd2t1cGNsazsKKwlzdHJ1Y3QgY2xrCQkqc3lzX2NsazsKKwlzdHJ1Y3QgY2xrCQkqcmVmY2xrOworCXN0cnVjdCBwaXBlM19kcGxsX21hcAkqZHBsbF9tYXA7Cit9OworCitzdGF0aWMgc3RydWN0IHBpcGUzX2RwbGxfbWFwIGRwbGxfbWFwX3VzYltdID0geworCXsxMjAwMDAwMCwgezEyNTAsIDUsIDQsIDIwLCAwfSB9LAkvKiAxMiBNSHogKi8KKwl7MTY4MDAwMDAsIHszMTI1LCAyMCwgNCwgMjAsIDB9IH0sCS8qIDE2LjggTUh6ICovCisJezE5MjAwMDAwLCB7MTE3MiwgOCwgNCwgMjAsIDY1NTM3fSB9LAkvKiAxOS4yIE1IeiAqLworCXsyMDAwMDAwMCwgezEwMDAsIDcsIDQsIDEwLCAwfSB9LAkvKiAyMCBNSHogKi8KKwl7MjYwMDAwMDAsIHsxMjUwLCAxMiwgNCwgMjAsIDB9IH0sCS8qIDI2IE1IeiAqLworCXszODQwMDAwMCwgezMxMjUsIDQ3LCA0LCAyMCwgOTI4NDN9IH0sCS8qIDM4LjQgTUh6ICovCisJeyB9LAkJCQkJLyogVGVybWluYXRvciAqLworfTsKKworc3RhdGljIHN0cnVjdCBwaXBlM19kcGxsX21hcCBkcGxsX21hcF9zYXRhW10gPSB7CisJezEyMDAwMDAwLCB7MTAwMCwgNywgNCwgNiwgMH0gfSwJLyogMTIgTUh6ICovCisJezE2ODAwMDAwLCB7NzE0LCA3LCA0LCA2LCAwfSB9LAkJLyogMTYuOCBNSHogKi8KKwl7MTkyMDAwMDAsIHs2MjUsIDcsIDQsIDYsIDB9IH0sCQkvKiAxOS4yIE1IeiAqLworCXsyMDAwMDAwMCwgezYwMCwgNywgNCwgNiwgMH0gfSwJCS8qIDIwIE1IeiAqLworCXsyNjAwMDAwMCwgezQ2MSwgNywgNCwgNiwgMH0gfSwJCS8qIDI2IE1IeiAqLworCXszODQwMDAwMCwgezMxMiwgNywgNCwgNiwgMH0gfSwJCS8qIDM4LjQgTUh6ICovCisJeyB9LAkJCQkJLyogVGVybWluYXRvciAqLworfTsKKworc3RhdGljIGlubGluZSB1MzIgdGlfcGlwZTNfcmVhZGwodm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKGFkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGlfcGlwZTNfd3JpdGVsKHZvaWQgX19pb21lbSAqYWRkciwgdW5zaWduZWQgb2Zmc2V0LAorCXUzMiBkYXRhKQoreworCV9fcmF3X3dyaXRlbChkYXRhLCBhZGRyICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHN0cnVjdCBwaXBlM19kcGxsX3BhcmFtcyAqdGlfcGlwZTNfZ2V0X2RwbGxfcGFyYW1zKHN0cnVjdCB0aV9waXBlMyAqcGh5KQoreworCXVuc2lnbmVkIGxvbmcgcmF0ZTsKKwlzdHJ1Y3QgcGlwZTNfZHBsbF9tYXAgKmRwbGxfbWFwID0gcGh5LT5kcGxsX21hcDsKKworCXJhdGUgPSBjbGtfZ2V0X3JhdGUocGh5LT5zeXNfY2xrKTsKKworCWZvciAoOyBkcGxsX21hcC0+cmF0ZTsgZHBsbF9tYXArKykgeworCQlpZiAocmF0ZSA9PSBkcGxsX21hcC0+cmF0ZSkKKwkJCXJldHVybiAmZHBsbF9tYXAtPnBhcmFtczsKKwl9CisKKwlkZXZfZXJyKHBoeS0+ZGV2LCAiTm8gRFBMTCBjb25maWd1cmF0aW9uIGZvciAlbHUgSHogU1lTIENMS1xuIiwgcmF0ZSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCB0aV9waXBlM19wb3dlcl9vZmYoc3RydWN0IHBoeSAqeCkKK3sKKwlzdHJ1Y3QgdGlfcGlwZTMgKnBoeSA9IHBoeV9nZXRfZHJ2ZGF0YSh4KTsKKworCW9tYXBfY29udHJvbF9waHlfcG93ZXIocGh5LT5jb250cm9sX2RldiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aV9waXBlM19wb3dlcl9vbihzdHJ1Y3QgcGh5ICp4KQoreworCXN0cnVjdCB0aV9waXBlMyAqcGh5ID0gcGh5X2dldF9kcnZkYXRhKHgpOworCisJb21hcF9jb250cm9sX3BoeV9wb3dlcihwaHktPmNvbnRyb2xfZGV2LCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpX3BpcGUzX2RwbGxfd2FpdF9sb2NrKHN0cnVjdCB0aV9waXBlMyAqcGh5KQoreworCXUzMgkJdmFsOworCXVuc2lnbmVkIGxvbmcJdGltZW91dDsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhQTExfTE9DS19USU1FKTsKKwlkbyB7CisJCWNwdV9yZWxheCgpOworCQl2YWwgPSB0aV9waXBlM19yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9TVEFUVVMpOworCQlpZiAodmFsICYgUExMX0xPQ0spCisJCQlicmVhazsKKwl9IHdoaWxlICghdGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSk7CisKKwlpZiAoISh2YWwgJiBQTExfTE9DSykpIHsKKwkJZGV2X2VycihwaHktPmRldiwgIkRQTEwgZmFpbGVkIHRvIGxvY2tcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpX3BpcGUzX2RwbGxfcHJvZ3JhbShzdHJ1Y3QgdGlfcGlwZTMgKnBoeSkKK3sKKwl1MzIJCQl2YWw7CisJc3RydWN0IHBpcGUzX2RwbGxfcGFyYW1zICpkcGxsX3BhcmFtczsKKworCWRwbGxfcGFyYW1zID0gdGlfcGlwZTNfZ2V0X2RwbGxfcGFyYW1zKHBoeSk7CisJaWYgKCFkcGxsX3BhcmFtcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2YWwgPSB0aV9waXBlM19yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMSk7CisJdmFsICY9IH5QTExfUkVHTl9NQVNLOworCXZhbCB8PSBkcGxsX3BhcmFtcy0+biA8PCBQTExfUkVHTl9TSElGVDsKKwl0aV9waXBlM193cml0ZWwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjEsIHZhbCk7CisKKwl2YWwgPSB0aV9waXBlM19yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMik7CisJdmFsICY9IH5QTExfU0VMRlJFUURDT19NQVNLOworCXZhbCB8PSBkcGxsX3BhcmFtcy0+ZnJlcSA8PCBQTExfU0VMRlJFUURDT19TSElGVDsKKwl0aV9waXBlM193cml0ZWwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjIsIHZhbCk7CisKKwl2YWwgPSB0aV9waXBlM19yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMSk7CisJdmFsICY9IH5QTExfUkVHTV9NQVNLOworCXZhbCB8PSBkcGxsX3BhcmFtcy0+bSA8PCBQTExfUkVHTV9TSElGVDsKKwl0aV9waXBlM193cml0ZWwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjEsIHZhbCk7CisKKwl2YWwgPSB0aV9waXBlM19yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9ONCk7CisJdmFsICY9IH5QTExfUkVHTV9GX01BU0s7CisJdmFsIHw9IGRwbGxfcGFyYW1zLT5tZiA8PCBQTExfUkVHTV9GX1NISUZUOworCXRpX3BpcGUzX3dyaXRlbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9ONCwgdmFsKTsKKworCXZhbCA9IHRpX3BpcGUzX3JlYWRsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04zKTsKKwl2YWwgJj0gflBMTF9TRF9NQVNLOworCXZhbCB8PSBkcGxsX3BhcmFtcy0+c2QgPDwgUExMX1NEX1NISUZUOworCXRpX3BpcGUzX3dyaXRlbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMywgdmFsKTsKKworCXRpX3BpcGUzX3dyaXRlbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9HTywgU0VUX1BMTF9HTyk7CisKKwlyZXR1cm4gdGlfcGlwZTNfZHBsbF93YWl0X2xvY2socGh5KTsKK30KKworc3RhdGljIGludCB0aV9waXBlM19pbml0KHN0cnVjdCBwaHkgKngpCit7CisJc3RydWN0IHRpX3BpcGUzICpwaHkgPSBwaHlfZ2V0X2RydmRhdGEoeCk7CisJdTMyIHZhbDsKKwlpbnQgcmV0ID0gMDsKKworCS8qIEJyaW5nIGl0IG91dCBvZiBJRExFIGlmIGl0IGlzIElETEUgKi8KKwl2YWwgPSB0aV9waXBlM19yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMik7CisJaWYgKHZhbCAmIFBMTF9JRExFKSB7CisJCXZhbCAmPSB+UExMX0lETEU7CisJCXRpX3BpcGUzX3dyaXRlbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMiwgdmFsKTsKKwkJcmV0ID0gdGlfcGlwZTNfZHBsbF93YWl0X2xvY2socGh5KTsKKwl9CisKKwkvKiBQcm9ncmFtIHRoZSBEUExMIG9ubHkgaWYgbm90IGxvY2tlZCAqLworCXZhbCA9IHRpX3BpcGUzX3JlYWRsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX1NUQVRVUyk7CisJaWYgKCEodmFsICYgUExMX0xPQ0spKQorCQlpZiAodGlfcGlwZTNfZHBsbF9wcm9ncmFtKHBoeSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGlfcGlwZTNfZXhpdChzdHJ1Y3QgcGh5ICp4KQoreworCXN0cnVjdCB0aV9waXBlMyAqcGh5ID0gcGh5X2dldF9kcnZkYXRhKHgpOworCXUzMiB2YWw7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogU0FUQSBEUExMIGNhbid0IGJlIHBvd2VyZWQgZG93biBkdWUgdG8gRXJyYXRhIGk3ODMgKi8KKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGh5LT5kZXYtPm9mX25vZGUsICJ0aSxwaHktcGlwZTMtc2F0YSIpKQorCQlyZXR1cm4gMDsKKworCS8qIFB1dCBEUExMIGluIElETEUgbW9kZSAqLworCXZhbCA9IHRpX3BpcGUzX3JlYWRsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04yKTsKKwl2YWwgfD0gUExMX0lETEU7CisJdGlfcGlwZTNfd3JpdGVsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04yLCB2YWwpOworCisJLyogd2FpdCBmb3IgTERPIGFuZCBPc2NpbGxhdG9yIHRvIHBvd2VyIGRvd24gKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoUExMX0lETEVfVElNRSk7CisJZG8geworCQljcHVfcmVsYXgoKTsKKwkJdmFsID0gdGlfcGlwZTNfcmVhZGwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfU1RBVFVTKTsKKwkJaWYgKCh2YWwgJiBQTExfVElDT1BXRE4pICYmICh2YWwgJiBQTExfTERPUFdETikpCisJCQlicmVhazsKKwl9IHdoaWxlICghdGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSk7CisKKwlpZiAoISh2YWwgJiBQTExfVElDT1BXRE4pIHx8ICEodmFsICYgUExMX0xET1BXRE4pKSB7CisJCWRldl9lcnIocGh5LT5kZXYsICJGYWlsZWQgdG8gcG93ZXIgZG93bjogUExMX1NUQVRVUyAweCV4XG4iLAorCQkJdmFsKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBzdHJ1Y3QgcGh5X29wcyBvcHMgPSB7CisJLmluaXQJCT0gdGlfcGlwZTNfaW5pdCwKKwkuZXhpdAkJPSB0aV9waXBlM19leGl0LAorCS5wb3dlcl9vbgk9IHRpX3BpcGUzX3Bvd2VyX29uLAorCS5wb3dlcl9vZmYJPSB0aV9waXBlM19wb3dlcl9vZmYsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGlfcGlwZTNfaWRfdGFibGVbXTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHRpX3BpcGUzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRpX3BpcGUzICpwaHk7CisJc3RydWN0IHBoeSAqZ2VuZXJpY19waHk7CisJc3RydWN0IHBoeV9wcm92aWRlciAqcGh5X3Byb3ZpZGVyOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbF9ub2RlOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNvbnRyb2xfcGRldjsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKworCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKG9mX21hdGNoX3B0cih0aV9waXBlM19pZF90YWJsZSksICZwZGV2LT5kZXYpOworCWlmICghbWF0Y2gpCisJCXJldHVybiAtRUlOVkFMOworCisJcGh5ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGh5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwaHkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jIG1lbSBmb3IgVEkgUElQRTMgUEhZXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGh5LT5kcGxsX21hcCA9IChzdHJ1Y3QgcGlwZTNfZHBsbF9tYXAgKiltYXRjaC0+ZGF0YTsKKwlpZiAoIXBoeS0+ZHBsbF9tYXApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gRFBMTCBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgInBsbF9jdHJsIik7CisJcGh5LT5wbGxfY3RybF9iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihwaHktPnBsbF9jdHJsX2Jhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihwaHktPnBsbF9jdHJsX2Jhc2UpOworCisJcGh5LT5kZXYJCT0gJnBkZXYtPmRldjsKKworCWlmICghb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobm9kZSwgInRpLHBoeS1waXBlMy1zYXRhIikpIHsKKworCQlwaHktPndrdXBjbGsgPSBkZXZtX2Nsa19nZXQocGh5LT5kZXYsICJ3a3VwY2xrIik7CisJCWlmIChJU19FUlIocGh5LT53a3VwY2xrKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCB3a3VwY2xrXG4iKTsKKwkJCXJldHVybiBQVFJfRVJSKHBoeS0+d2t1cGNsayk7CisJCX0KKworCQlwaHktPnJlZmNsayA9IGRldm1fY2xrX2dldChwaHktPmRldiwgInJlZmNsayIpOworCQlpZiAoSVNfRVJSKHBoeS0+cmVmY2xrKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCByZWZjbGtcbiIpOworCQkJcmV0dXJuIFBUUl9FUlIocGh5LT5yZWZjbGspOworCQl9CisJfSBlbHNlIHsKKwkJcGh5LT53a3VwY2xrID0gRVJSX1BUUigtRU5PREVWKTsKKwkJcGh5LT5yZWZjbGsgPSBFUlJfUFRSKC1FTk9ERVYpOworCX0KKworCXBoeS0+c3lzX2NsayA9IGRldm1fY2xrX2dldChwaHktPmRldiwgInN5c2NsayIpOworCWlmIChJU19FUlIocGh5LT5zeXNfY2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gZ2V0IHN5c2Nsa1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNvbnRyb2xfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobm9kZSwgImN0cmwtbW9kdWxlIiwgMCk7CisJaWYgKCFjb250cm9sX25vZGUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBjb250cm9sIGRldmljZSBwaGFuZGxlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY29udHJvbF9wZGV2ID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShjb250cm9sX25vZGUpOworCWlmICghY29udHJvbF9wZGV2KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgY29udHJvbCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwaHktPmNvbnRyb2xfZGV2ID0gJmNvbnRyb2xfcGRldi0+ZGV2OworCisJb21hcF9jb250cm9sX3BoeV9wb3dlcihwaHktPmNvbnRyb2xfZGV2LCAwKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBoeSk7CisJcG1fcnVudGltZV9lbmFibGUocGh5LT5kZXYpOworCisJZ2VuZXJpY19waHkgPSBkZXZtX3BoeV9jcmVhdGUocGh5LT5kZXYsICZvcHMsIE5VTEwpOworCWlmIChJU19FUlIoZ2VuZXJpY19waHkpKQorCQlyZXR1cm4gUFRSX0VSUihnZW5lcmljX3BoeSk7CisKKwlwaHlfc2V0X2RydmRhdGEoZ2VuZXJpY19waHksIHBoeSk7CisJcGh5X3Byb3ZpZGVyID0gZGV2bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIocGh5LT5kZXYsCisJCQlvZl9waHlfc2ltcGxlX3hsYXRlKTsKKwlpZiAoSVNfRVJSKHBoeV9wcm92aWRlcikpCisJCXJldHVybiBQVFJfRVJSKHBoeV9wcm92aWRlcik7CisKKwlwbV9ydW50aW1lX2dldCgmcGRldi0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpX3BpcGUzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWlmICghcG1fcnVudGltZV9zdXNwZW5kZWQoJnBkZXYtPmRldikpCisJCXBtX3J1bnRpbWVfcHV0KCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKKworc3RhdGljIGludCB0aV9waXBlM19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB0aV9waXBlMwkqcGh5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoIUlTX0VSUihwaHktPndrdXBjbGspKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUocGh5LT53a3VwY2xrKTsKKwlpZiAoIUlTX0VSUihwaHktPnJlZmNsaykpCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwaHktPnJlZmNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aV9waXBlM19ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJdTMyIHJldCA9IDA7CisJc3RydWN0IHRpX3BpcGUzCSpwaHkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghSVNfRVJSKHBoeS0+cmVmY2xrKSkgeworCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocGh5LT5yZWZjbGspOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHBoeS0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSByZWZjbGsgJWRcbiIsIHJldCk7CisJCQlnb3RvIGVycjE7CisJCX0KKwl9CisKKwlpZiAoIUlTX0VSUihwaHktPndrdXBjbGspKSB7CisJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShwaHktPndrdXBjbGspOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHBoeS0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSB3a3VwY2xrICVkXG4iLCByZXQpOworCQkJZ290byBlcnIyOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK2VycjI6CisJaWYgKCFJU19FUlIocGh5LT5yZWZjbGspKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUocGh5LT5yZWZjbGspOworCitlcnIxOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB0aV9waXBlM19wbV9vcHMgPSB7CisJU0VUX1JVTlRJTUVfUE1fT1BTKHRpX3BpcGUzX3J1bnRpbWVfc3VzcGVuZCwKKwkJCSAgIHRpX3BpcGUzX3J1bnRpbWVfcmVzdW1lLCBOVUxMKQorfTsKKworI2RlZmluZSBERVZfUE1fT1BTICAgICAoJnRpX3BpcGUzX3BtX29wcykKKyNlbHNlCisjZGVmaW5lIERFVl9QTV9PUFMgICAgIE5VTEwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB0aV9waXBlM19pZF90YWJsZVtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAidGkscGh5LXVzYjMiLAorCQkuZGF0YSA9IGRwbGxfbWFwX3VzYiwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAidGksb21hcC11c2IzIiwKKwkJLmRhdGEgPSBkcGxsX21hcF91c2IsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInRpLHBoeS1waXBlMy1zYXRhIiwKKwkJLmRhdGEgPSBkcGxsX21hcF9zYXRhLAorCX0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB0aV9waXBlM19pZF90YWJsZSk7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGlfcGlwZTNfZHJpdmVyID0geworCS5wcm9iZQkJPSB0aV9waXBlM19wcm9iZSwKKwkucmVtb3ZlCQk9IHRpX3BpcGUzX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAidGktcGlwZTMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gREVWX1BNX09QUywKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHRpX3BpcGUzX2lkX3RhYmxlKSwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0aV9waXBlM19kcml2ZXIpOworCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiB0aV9waXBlMyIpOworTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMgSW5jLiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUSSBQSVBFMyBwaHkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktdHdsNDAzMC11c2IuYyBiL2RyaXZlcnMvcGh5L3BoeS10d2w0MDMwLXVzYi5jCmluZGV4IGMzYWNlMWQuLjJlMGU5YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS10d2w0MDMwLXVzYi5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS10d2w0MDMwLXVzYi5jCkBAIC0zMzgsNyArMzM4LDcgQEAKIAkJZGV2X2Vycih0d2wtPmRldiwgInVuc3VwcG9ydGVkIFQyIHRyYW5zY2VpdmVyIG1vZGUgJWRcbiIsCiAJCQkJbW9kZSk7CiAJCWJyZWFrOwotCX07CisJfQogfQogCiBzdGF0aWMgdm9pZCB0d2w0MDMwX2kyY19hY2Nlc3Moc3RydWN0IHR3bDQwMzBfdXNiICp0d2wsIGludCBvbikKQEAgLTY2MSw3ICs2NjEsNyBAQAogCXN0cnVjdCBwaHlfcHJvdmlkZXIJKnBoeV9wcm92aWRlcjsKIAlzdHJ1Y3QgcGh5X2luaXRfZGF0YQkqaW5pdF9kYXRhID0gTlVMTDsKIAotCXR3bCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YgKnR3bCwgR0ZQX0tFUk5FTCk7CisJdHdsID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqdHdsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0d2wpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC02NzYsNyArNjc2LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0Jb3RnID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZiAqb3RnLCBHRlBfS0VSTkVMKTsKKwlvdGcgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpvdGcpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW90ZykKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS14Z2VuZS5jIGIvZHJpdmVycy9waHkvcGh5LXhnZW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFhMWNjZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BoeS9waHkteGdlbmUuYwpAQCAtMCwwICsxLDE3NTAgQEAKKy8qCisgKiBBcHBsaWVkTWljcm8gWC1HZW5lIE11bHRpLXB1cnBvc2UgUEhZIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgQXBwbGllZCBNaWNybyBDaXJjdWl0cyBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBMb2MgSG8gPGxob0BhcG0uY29tPgorICogICAgICAgICBUdWFuIFBoYW4gPHRwaGFuQGFwbS5jb20+CisgKiAgICAgICAgIFN1bWFuIFRyaXBhdGhpIDxzdHJpcGF0aGlAYXBtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIFRoZSBBUE0gWC1HZW5lIFBIWSBjb25zaXN0cyBvZiB0d28gUExMIGNsb2NrIG1hY3JvJ3MgKENNVSkgYW5kIGxhbmVzLgorICogVGhlIGZpcnN0IFBMTCBjbG9jayBtYWNybyBpcyB1c2VkIGZvciBpbnRlcm5hbCByZWZlcmVuY2UgY2xvY2suIFRoZSBzZWNvbmQKKyAqIFBMTCBjbG9jayBtYWNybyBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIFBIWS4gVGhpcyBkcml2ZXIKKyAqIGNvbmZpZ3VyZXMgdGhlIGZpcnN0IFBMTCBDTVUsIHRoZSBzZWNvbmQgUExMIENNVSwgYW5kIHByb2dyYW1zIHRoZSBQSFkgdG8KKyAqIG9wZXJhdGUgYWNjb3JkaW5nIHRvIHRoZSBtb2RlIG9mIG9wZXJhdGlvbi4gVGhlIGZpcnN0IFBMTCBDTVUgaXMgb25seQorICogcmVxdWlyZWQgaWYgaW50ZXJuYWwgY2xvY2sgaXMgZW5hYmxlZC4KKyAqCisgKiBMb2dpY2FsIExheWVyIE91dCBPZiBIVyBtb2R1bGUgdW5pdHM6CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgSW50ZXJuYWwgICAgICB8ICAgIHwtLS0tLS18CisgKiB8IFJlZiBQTEwgQ01VICAgfC0tLS18ICAgICAgfCAgICAgLS0tLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0KKyAqIC0tLS0tLS0tLS0tLSAtLS0tICAgIHwgTVVYICB8LS0tLS18UEhZIFBMTCBDTVV8LS0tLXwgU2VyZGVzfAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgIHwgICAgICAgICAgIHwgICAgLS0tLS0tLS0tCisgKiBFeHRlcm5hbCBDbG9jayAtLS0tLS18ICAgICAgfCAgICAgLS0tLS0tLS0tLS0tLQorICogICAgICAgICAgICAgICAgICAgICAgfC0tLS0tLXwKKyAqCisgKiBUaGUgUmVmIFBMTCBDTVUgQ1NSIChDb25maWd1cmF0aW9uIFN5c3RlbSBSZWdpc3RlcnMpIGlzIGFjY2Vzc2VkCisgKiBpbmRpcmVjdGx5IGZyb20gdGhlIFNEUyBvZmZzZXQgYXQgMHgyMDAwLiBJdCBpcyBvbmx5IHJlcXVpcmVkIGZvcgorICogaW50ZXJuYWwgcmVmZXJlbmNlIGNsb2NrLgorICogVGhlIFBIWSBQTEwgQ01VIENTUiBpcyBhY2Nlc3NlZCBpbmRpcmVjdGx5IGZyb20gdGhlIFNEUyBvZmZzZXQgYXQgMHgwMDAwLgorICogVGhlIFNlcmRlcyBDU1IgaXMgYWNjZXNzZWQgaW5kaXJlY3RseSBmcm9tIHRoZSBTRFMgb2Zmc2V0IGF0IDB4MDQwMC4KKyAqCisgKiBUaGUgUmVmIFBMTCBDTVUgY2FuIGJlIGxvY2F0ZWQgd2l0aGluIHRoZSBzYW1lIFBIWSBJUCBvciBvdXRzaWRlIHRoZSBQSFkgSVAKKyAqIGR1ZSB0byBzaGFyZWQgUmVmIFBMTCBDTVUuIEZvciBQSFkgd2l0aCBSZWYgUExMIENNVSBzaGFyZWQgd2l0aCBhbm90aGVyIElQLAorICogaXQgaXMgbG9jYXRlZCBvdXRzaWRlIHRoZSBQSFkgSVAuIFRoaXMgaXMgdGhlIGNhc2UgZm9yIHRoZSBQSFkgbG9jYXRlZAorICogYXQgMHgxZjIzYTAwMCAoU0FUQSBQb3J0IDQvNSkuIEZvciBzdWNoIFBIWSwgYW5vdGhlciByZXNvdXJjZSBpcyByZXF1aXJlZAorICogdG8gbG9jYXRlZCB0aGUgU0RTL1JlZiBQTEwgQ01VIG1vZHVsZSBhbmQgaXRzIGNsb2NrIGZvciB0aGF0IElQIGVuYWJsZWQuCisgKgorICogQ3VycmVudGx5LCB0aGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIEdlbjMgU0FUQSBtb2RlIHdpdGggZXh0ZXJuYWwgY2xvY2suCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorCisvKiBNYXggMiBsYW5lcyBwZXIgYSBQSFkgdW5pdCAqLworI2RlZmluZSBNQVhfTEFORQkJCTIKKworLyogUmVnaXN0ZXIgb2Zmc2V0IGluc2lkZSB0aGUgUEhZICovCisjZGVmaW5lIFNFUkRFU19QTExfSU5ESVJFQ1RfT0ZGU0VUCTB4MDAwMAorI2RlZmluZSBTRVJERVNfUExMX1JFRl9JTkRJUkVDVF9PRkZTRVQJMHgyMDAwCisjZGVmaW5lIFNFUkRFU19JTkRJUkVDVF9PRkZTRVQJCTB4MDQwMAorI2RlZmluZSBTRVJERVNfTEFORV9TVFJJREUJCTB4MDIwMAorCisvKiBTb21lIGRlZmF1bHQgU2VyZGVzIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgREVGQVVMVF9TQVRBX1RYQk9PU1RfR0FJTgl7IDB4MWUsIDB4MWUsIDB4MWUgfQorI2RlZmluZSBERUZBVUxUX1NBVEFfVFhFWUVESVJFQ1RJT04JeyAweDAsIDB4MCwgMHgwIH0KKyNkZWZpbmUgREVGQVVMVF9TQVRBX1RYRVlFVFVOSU5HCXsgMHhhLCAweGEsIDB4YSB9CisjZGVmaW5lIERFRkFVTFRfU0FUQV9TUERfU0VMCQl7IDB4MSwgMHgzLCAweDcgfQorI2RlZmluZSBERUZBVUxUX1NBVEFfVFhBTVAJCXsgMHg4LCAweDgsIDB4OCB9CisjZGVmaW5lIERFRkFVTFRfU0FUQV9UWENOMQkJeyAweDIsIDB4MiwgMHgyIH0KKyNkZWZpbmUgREVGQVVMVF9TQVRBX1RYQ04yCQl7IDB4MCwgMHgwLCAweDAgfQorI2RlZmluZSBERUZBVUxUX1NBVEFfVFhDUDEJCXsgMHhhLCAweGEsIDB4YSB9CisKKyNkZWZpbmUgU0FUQV9TUERfU0VMX0dFTjMJCTB4NworI2RlZmluZSBTQVRBX1NQRF9TRUxfR0VOMgkJMHgzCisjZGVmaW5lIFNBVEFfU1BEX1NFTF9HRU4xCQkweDEKKworI2RlZmluZSBTU0NfRElTQUJMRQkJCTAKKyNkZWZpbmUgU1NDX0VOQUJMRQkJCTEKKworI2RlZmluZSBGQkRJVl9WQUxfNTBNCQkJMHg3NworI2RlZmluZSBSRUZESVZfVkFMXzUwTQkJCTB4MQorI2RlZmluZSBGQkRJVl9WQUxfMTAwTQkJCTB4M0IKKyNkZWZpbmUgUkVGRElWX1ZBTF8xMDBNCQkJMHgwCisKKy8qIFNBVEEgQ2xvY2svUmVzZXQgQ1NSICovCisjZGVmaW5lIFNBVEFDTEtFTlJFRwkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgIFNBVEEwX0NPUkVfQ0xLRU4JCTB4MDAwMDAwMDIKKyNkZWZpbmUgIFNBVEExX0NPUkVfQ0xLRU4JCTB4MDAwMDAwMDQKKyNkZWZpbmUgU0FUQVNSRVNFVFJFRwkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgIFNBVEFfTUVNX1JFU0VUX01BU0sJCTB4MDAwMDAwMjAKKyNkZWZpbmUgIFNBVEFfTUVNX1JFU0VUX1JEKHNyYykJCSgoKHNyYykgJiAweDAwMDAwMDIwKSA+PiA1KQorI2RlZmluZSAgU0FUQV9TRFNfUkVTRVRfTUFTSwkJMHgwMDAwMDAwNAorI2RlZmluZSAgU0FUQV9DU1JfUkVTRVRfTUFTSwkJMHgwMDAwMDAwMQorI2RlZmluZSAgU0FUQV9DT1JFX1JFU0VUX01BU0sJCTB4MDAwMDAwMDIKKyNkZWZpbmUgIFNBVEFfUE1DTEtfUkVTRVRfTUFTSwkJMHgwMDAwMDAxMAorI2RlZmluZSAgU0FUQV9QQ0xLX1JFU0VUX01BU0sJCTB4MDAwMDAwMDgKKworLyogU0RTIENTUiB1c2VkIGZvciBQSFkgSW5kaXJlY3QgYWNjZXNzICovCisjZGVmaW5lIFNBVEFfRU5FVF9TRFNfUENTX0NUTDAJCTB4MDAwMDAwMDAKKyNkZWZpbmUgIFJFR1NQRUNfQ0ZHX0lfVFhfV09SRE1PREUwX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwNzAwMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxNikgJiAweDAwMDcwMDAwKSkKKyNkZWZpbmUgIFJFR1NQRUNfQ0ZHX0lfUlhfV09SRE1PREUwX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDBlMDAwMDApIHwgKCgodTMyKSAoc3JjKSA8PCAyMSkgJiAweDAwZTAwMDAwKSkKKyNkZWZpbmUgU0FUQV9FTkVUX1NEU19DVEwwCQkweDAwMDAwMDBjCisjZGVmaW5lICBSRUdTUEVDX0NGR19JX0NVU1RPTUVSX1BJTl9NT0RFMF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDA3ZmZmKSB8ICgoKHUzMikgKHNyYykpICYgMHgwMDAwN2ZmZikpCisjZGVmaW5lIFNBVEFfRU5FVF9TRFNfQ1RMMQkJMHgwMDAwMDAxMAorI2RlZmluZSAgQ0ZHX0lfU1BEX1NFTF9DRFJfT1ZSMV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDBmKSB8ICgoKHUzMikgKHNyYykpICYgMHgwMDAwMDAwZikpCisjZGVmaW5lIFNBVEFfRU5FVF9TRFNfUlNUX0NUTAkJMHgwMDAwMDAyNAorI2RlZmluZSBTQVRBX0VORVRfU0RTX0lORF9DTURfUkVHCTB4MDAwMDAwM2MKKyNkZWZpbmUgIENGR19JTkRfV1JfQ01EX01BU0sJCTB4MDAwMDAwMDEKKyNkZWZpbmUgIENGR19JTkRfUkRfQ01EX01BU0sJCTB4MDAwMDAwMDIKKyNkZWZpbmUgIENGR19JTkRfQ01EX0RPTkVfTUFTSwkJMHgwMDAwMDAwNAorI2RlZmluZSAgQ0ZHX0lORF9BRERSX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAzZmZmZjApIHwgKCgodTMyKSAoc3JjKSA8PCA0KSAmIDB4MDAzZmZmZjApKQorI2RlZmluZSBTQVRBX0VORVRfU0RTX0lORF9SREFUQV9SRUcJMHgwMDAwMDA0MAorI2RlZmluZSBTQVRBX0VORVRfU0RTX0lORF9XREFUQV9SRUcJMHgwMDAwMDA0NAorI2RlZmluZSBTQVRBX0VORVRfQ0xLX01BQ1JPX1JFRwkJMHgwMDAwMDA0YworI2RlZmluZSAgSV9SRVNFVF9CX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDEpIHwgKCgodTMyKSAoc3JjKSkgJiAweDAwMDAwMDAxKSkKKyNkZWZpbmUgIElfUExMX0ZCRElWX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAxZmYwMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMikgJiAweDAwMWZmMDAwKSkKKyNkZWZpbmUgIElfQ1VTVE9NRVJPVl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwZjgwKSB8ICgoKHUzMikgKHNyYykgPDwgNykgJiAweDAwMDAwZjgwKSkKKyNkZWZpbmUgIE9fUExMX0xPQ0tfUkQoc3JjKQkJKCgoc3JjKSAmIDB4NDAwMDAwMDApID4+IDMwKQorI2RlZmluZSAgT19QTExfUkVBRFlfUkQoc3JjKQkJKCgoc3JjKSAmIDB4ODAwMDAwMDApID4+IDMxKQorCisvKiBQTEwgQ2xvY2sgTWFjcm8gVW5pdCAoQ01VKSBDU1IgYWNjZXNzaW5nIGZyb20gU0RTIGluZGlyZWN0bHkgKi8KKyNkZWZpbmUgQ01VX1JFRzAJCQkweDAwMDAwCisjZGVmaW5lICBDTVVfUkVHMF9QTExfUkVGX1NFTF9NQVNLCTB4MDAwMDIwMDAKKyNkZWZpbmUgIENNVV9SRUcwX1BMTF9SRUZfU0VMX1NFVChkc3QsIHNyYykJXAorCQkoKChkc3QpICYgfjB4MDAwMDIwMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMykgJiAweDAwMDAyMDAwKSkKKyNkZWZpbmUgIENNVV9SRUcwX1BET1dOX01BU0sJCTB4MDAwMDQwMDAKKyNkZWZpbmUgIENNVV9SRUcwX0NBTF9DT1VOVF9SRVNPTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMGUwKSB8ICgoKHUzMikgKHNyYykgPDwgNSkgJiAweDAwMDAwMGUwKSkKKyNkZWZpbmUgQ01VX1JFRzEJCQkweDAwMDAyCisjZGVmaW5lICBDTVVfUkVHMV9QTExfQ1BfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwM2MwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDEwKSAmIDB4MDAwMDNjMDApKQorI2RlZmluZSAgQ01VX1JFRzFfUExMX01BTlVBTENBTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDA4KSB8ICgoKHUzMikgKHNyYykgPDwgMykgJiAweDAwMDAwMDA4KSkKKyNkZWZpbmUgIENNVV9SRUcxX1BMTF9DUF9TRUxfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDNlMCkgfCAoKCh1MzIpIChzcmMpIDw8IDUpICYgMHgwMDAwMDNlMCkpCisjZGVmaW5lICBDTVVfUkVHMV9SRUZDTEtfQ01PU19TRUxfTUFTSwkweDAwMDAwMDAxCisjZGVmaW5lICBDTVVfUkVHMV9SRUZDTEtfQ01PU19TRUxfU0VUKGRzdCwgc3JjKQlcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwMSkgfCAoKCh1MzIpIChzcmMpIDw8IDApICYgMHgwMDAwMDAwMSkpCisjZGVmaW5lIENNVV9SRUcyCQkJMHgwMDAwNAorI2RlZmluZSAgQ01VX1JFRzJfUExMX1JFRkRJVl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDBjMDAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTQpICYgMHgwMDAwYzAwMCkpCisjZGVmaW5lICBDTVVfUkVHMl9QTExfTEZSRVNfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAxZSkgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgMHgwMDAwMDAxZSkpCisjZGVmaW5lICBDTVVfUkVHMl9QTExfRkJESVZfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwM2ZlMCkgfCAoKCh1MzIpIChzcmMpIDw8IDUpICYgMHgwMDAwM2ZlMCkpCisjZGVmaW5lIENNVV9SRUczCQkJMHgwMDAwNgorI2RlZmluZSAgQ01VX1JFRzNfVkNPVkFSU0VMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMGYpIHwgKCgodTMyKSAoc3JjKSA8PCAwKSAmIDB4MDAwMDAwMGYpKQorI2RlZmluZSAgQ01VX1JFRzNfVkNPX01PTVNFTF9JTklUX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAzZjApIHwgKCgodTMyKSAoc3JjKSA8PCA0KSAmIDB4MDAwMDAzZjApKQorI2RlZmluZSAgQ01VX1JFRzNfVkNPX01BTk1PTVNFTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDBmYzAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTApICYgMHgwMDAwZmMwMCkpCisjZGVmaW5lIENNVV9SRUc0CQkJMHgwMDAwOAorI2RlZmluZSBDTVVfUkVHNQkJCTB4MDAwMGEKKyNkZWZpbmUgIENNVV9SRUc1X1BMTF9MRlNNQ0FQX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGMwMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxNCkgJiAweDAwMDBjMDAwKSkKKyNkZWZpbmUgIENNVV9SRUc1X1BMTF9MT0NLX1JFU09MVVRJT05fU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwZSkgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgMHgwMDAwMDAwZSkpCisjZGVmaW5lICBDTVVfUkVHNV9QTExfTEZDQVBfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMzAwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDEyKSAmIDB4MDAwMDMwMDApKQorI2RlZmluZSAgQ01VX1JFRzVfUExMX1JFU0VUQl9NQVNLCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ01VX1JFRzYJCQkweDAwMDBjCisjZGVmaW5lICBDTVVfUkVHNl9QTExfVlJFR1RSSU1fU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDYwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDkpICYgMHgwMDAwMDYwMCkpCisjZGVmaW5lICBDTVVfUkVHNl9NQU5fUFZUX0NBTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDA0KSB8ICgoKHUzMikgKHNyYykgPDwgMikgJiAweDAwMDAwMDA0KSkKKyNkZWZpbmUgQ01VX1JFRzcJCQkweDAwMDBlCisjZGVmaW5lICBDTVVfUkVHN19QTExfQ0FMSUJfRE9ORV9SRChzcmMpICgoMHgwMDAwNDAwMCAmICh1MzIpIChzcmMpKSA+PiAxNCkKKyNkZWZpbmUgIENNVV9SRUc3X1ZDT19DQUxfRkFJTF9SRChzcmMpCSgoMHgwMDAwMGMwMCAmICh1MzIpIChzcmMpKSA+PiAxMCkKKyNkZWZpbmUgQ01VX1JFRzgJCQkweDAwMDEwCisjZGVmaW5lIENNVV9SRUc5CQkJMHgwMDAxMgorI2RlZmluZSAgQ01VX1JFRzlfV09SRF9MRU5fOEJJVAkJMHgwMDAKKyNkZWZpbmUgIENNVV9SRUc5X1dPUkRfTEVOXzEwQklUCTB4MDAxCisjZGVmaW5lICBDTVVfUkVHOV9XT1JEX0xFTl8xNkJJVAkweDAwMgorI2RlZmluZSAgQ01VX1JFRzlfV09SRF9MRU5fMjBCSVQJMHgwMDMKKyNkZWZpbmUgIENNVV9SRUc5X1dPUkRfTEVOXzMyQklUCTB4MDA0CisjZGVmaW5lICBDTVVfUkVHOV9XT1JEX0xFTl80MEJJVAkweDAwNQorI2RlZmluZSAgQ01VX1JFRzlfV09SRF9MRU5fNjRCSVQJMHgwMDYKKyNkZWZpbmUgIENNVV9SRUc5X1dPUkRfTEVOXzY2QklUCTB4MDA3CisjZGVmaW5lICBDTVVfUkVHOV9UWF9XT1JEX01PREVfQ0gxX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAzODApIHwgKCgodTMyKSAoc3JjKSA8PCA3KSAmIDB4MDAwMDAzODApKQorI2RlZmluZSAgQ01VX1JFRzlfVFhfV09SRF9NT0RFX0NIMF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDcwKSB8ICgoKHUzMikgKHNyYykgPDwgNCkgJiAweDAwMDAwMDcwKSkKKyNkZWZpbmUgIENNVV9SRUc5X1BMTF9QT1NUX0RJVkJZMl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDA4KSB8ICgoKHUzMikgKHNyYykgPDwgMykgJiAweDAwMDAwMDA4KSkKKyNkZWZpbmUgIENNVV9SRUc5X1ZCR19CWVBBU1NCX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDQpIHwgKCgodTMyKSAoc3JjKSA8PCAyKSAmIDB4MDAwMDAwMDQpKQorI2RlZmluZSAgQ01VX1JFRzlfSUdFTl9CWVBBU1NfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwMikgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgMHgwMDAwMDAwMikpCisjZGVmaW5lIENNVV9SRUcxMAkJCTB4MDAwMTQKKyNkZWZpbmUgIENNVV9SRUcxMF9WUkVHX1JFRlNFTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDAxKSB8ICgoKHUzMikgKHNyYykgPDwgMCkgJiAweDAwMDAwMDAxKSkKKyNkZWZpbmUgQ01VX1JFRzExCQkJMHgwMDAxNgorI2RlZmluZSBDTVVfUkVHMTIJCQkweDAwMDE4CisjZGVmaW5lICBDTVVfUkVHMTJfU1RBVEVfREVMQVk5X1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwZjApIHwgKCgodTMyKSAoc3JjKSA8PCA0KSAmIDB4MDAwMDAwZjApKQorI2RlZmluZSBDTVVfUkVHMTMJCQkweDAwMDFhCisjZGVmaW5lIENNVV9SRUcxNAkJCTB4MDAwMWMKKyNkZWZpbmUgQ01VX1JFRzE1CQkJMHgwMDAxZQorI2RlZmluZSBDTVVfUkVHMTYJCQkweDAwMDIwCisjZGVmaW5lICBDTVVfUkVHMTZfUFZUX0ROX01BTl9FTkFfTUFTSwkweDAwMDAwMDAxCisjZGVmaW5lICBDTVVfUkVHMTZfUFZUX1VQX01BTl9FTkFfTUFTSwkweDAwMDAwMDAyCisjZGVmaW5lICBDTVVfUkVHMTZfVkNPQ0FMX1dBSVRfQlRXX0NPREVfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAxYykgfCAoKCh1MzIpIChzcmMpIDw8IDIpICYgMHgwMDAwMDAxYykpCisjZGVmaW5lICBDTVVfUkVHMTZfQ0FMSUJSQVRJT05fRE9ORV9PVkVSUklERV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDQwKSB8ICgoKHUzMikgKHNyYykgPDwgNikgJiAweDAwMDAwMDQwKSkKKyNkZWZpbmUgIENNVV9SRUcxNl9CWVBBU1NfUExMX0xPQ0tfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAyMCkgfCAoKCh1MzIpIChzcmMpIDw8IDUpICYgMHgwMDAwMDAyMCkpCisjZGVmaW5lIENNVV9SRUcxNwkJCTB4MDAwMjIKKyNkZWZpbmUgIENNVV9SRUcxN19QVlRfQ09ERV9SMkFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwN2YwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDgpICYgMHgwMDAwN2YwMCkpCisjZGVmaW5lICBDTVVfUkVHMTdfUkVTRVJWRURfN19TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMGUwKSB8ICgoKHUzMikgKHNyYykgPDwgNSkgJiAweDAwMDAwMGUwKSkKKyNkZWZpbmUgIENNVV9SRUcxN19QVlRfVEVSTV9NQU5fRU5BX01BU0sJMHgwMDAwODAwMAorI2RlZmluZSBDTVVfUkVHMTgJCQkweDAwMDI0CisjZGVmaW5lIENNVV9SRUcxOQkJCTB4MDAwMjYKKyNkZWZpbmUgQ01VX1JFRzIwCQkJMHgwMDAyOAorI2RlZmluZSBDTVVfUkVHMjEJCQkweDAwMDJhCisjZGVmaW5lIENNVV9SRUcyMgkJCTB4MDAwMmMKKyNkZWZpbmUgQ01VX1JFRzIzCQkJMHgwMDAyZQorI2RlZmluZSBDTVVfUkVHMjQJCQkweDAwMDMwCisjZGVmaW5lIENNVV9SRUcyNQkJCTB4MDAwMzIKKyNkZWZpbmUgQ01VX1JFRzI2CQkJMHgwMDAzNAorI2RlZmluZSAgQ01VX1JFRzI2X0ZPUkNFX1BMTF9MT0NLX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDEpIHwgKCgodTMyKSAoc3JjKSA8PCAwKSAmIDB4MDAwMDAwMDEpKQorI2RlZmluZSBDTVVfUkVHMjcJCQkweDAwMDM2CisjZGVmaW5lIENNVV9SRUcyOAkJCTB4MDAwMzgKKyNkZWZpbmUgQ01VX1JFRzI5CQkJMHgwMDAzYQorI2RlZmluZSBDTVVfUkVHMzAJCQkweDAwMDNjCisjZGVmaW5lICBDTVVfUkVHMzBfTE9DS19DT1VOVF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDA2KSB8ICgoKHUzMikgKHNyYykgPDwgMSkgJiAweDAwMDAwMDA2KSkKKyNkZWZpbmUgIENNVV9SRUczMF9QQ0lFX01PREVfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwOCkgfCAoKCh1MzIpIChzcmMpIDw8IDMpICYgMHgwMDAwMDAwOCkpCisjZGVmaW5lIENNVV9SRUczMQkJCTB4MDAwM2UKKyNkZWZpbmUgQ01VX1JFRzMyCQkJMHgwMDA0MAorI2RlZmluZSAgQ01VX1JFRzMyX0ZPUkNFX1ZDT0NBTF9TVEFSVF9NQVNLCTB4MDAwMDQwMDAKKyNkZWZpbmUgIENNVV9SRUczMl9QVlRfQ0FMX1dBSVRfU0VMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDYpIHwgKCgodTMyKSAoc3JjKSA8PCAxKSAmIDB4MDAwMDAwMDYpKQorI2RlZmluZSAgQ01VX1JFRzMyX0lSRUZfQURKX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAxODApIHwgKCgodTMyKSAoc3JjKSA8PCA3KSAmIDB4MDAwMDAxODApKQorI2RlZmluZSBDTVVfUkVHMzMJCQkweDAwMDQyCisjZGVmaW5lIENNVV9SRUczNAkJCTB4MDAwNDQKKyNkZWZpbmUgIENNVV9SRUczNF9WQ09fQ0FMX1ZUSF9MT19NQVhfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwZikgfCAoKCh1MzIpIChzcmMpIDw8IDApICYgMHgwMDAwMDAwZikpCisjZGVmaW5lICBDTVVfUkVHMzRfVkNPX0NBTF9WVEhfSElfTUFYX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDBmMDApIHwgKCgodTMyKSAoc3JjKSA8PCA4KSAmIDB4MDAwMDBmMDApKQorI2RlZmluZSAgQ01VX1JFRzM0X1ZDT19DQUxfVlRIX0xPX01JTl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMGYwKSB8ICgoKHUzMikgKHNyYykgPDwgNCkgJiAweDAwMDAwMGYwKSkKKyNkZWZpbmUgIENNVV9SRUczNF9WQ09fQ0FMX1ZUSF9ISV9NSU5fU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwZjAwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDEyKSAmIDB4MDAwMGYwMDApKQorI2RlZmluZSBDTVVfUkVHMzUJCQkweDAwMDQ2CisjZGVmaW5lICBDTVVfUkVHMzVfUExMX1NTQ19NT0RfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwZmUwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDkpICYgMHgwMDAwZmUwMCkpCisjZGVmaW5lIENNVV9SRUczNgkJCQkweDAwMDQ4CisjZGVmaW5lICBDTVVfUkVHMzZfUExMX1NTQ19FTl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDEwKSB8ICgoKHUzMikgKHNyYykgPDwgNCkgJiAweDAwMDAwMDEwKSkKKyNkZWZpbmUgIENNVV9SRUczNl9QTExfU1NDX1ZTVEVQX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGZmYzApIHwgKCgodTMyKSAoc3JjKSA8PCA2KSAmIDB4MDAwMGZmYzApKQorI2RlZmluZSAgQ01VX1JFRzM2X1BMTF9TU0NfRFNNU0VMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMjApIHwgKCgodTMyKSAoc3JjKSA8PCA1KSAmIDB4MDAwMDAwMjApKQorI2RlZmluZSBDTVVfUkVHMzcJCQkweDAwMDRhCisjZGVmaW5lIENNVV9SRUczOAkJCTB4MDAwNGMKKyNkZWZpbmUgQ01VX1JFRzM5CQkJMHgwMDA0ZQorCisvKiBQSFkgbGFuZSBDU1IgYWNjZXNzaW5nIGZyb20gU0RTIGluZGlyZWN0bHkgKi8KKyNkZWZpbmUgUlhUWF9SRUcwCQkJMHgwMDAKKyNkZWZpbmUgIFJYVFhfUkVHMF9DVExFX0VRX0hSX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGY4MDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMSkgJiAweDAwMDBmODAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMF9DVExFX0VRX1FSX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDA3YzApIHwgKCgodTMyKSAoc3JjKSA8PCA2KSAmIDB4MDAwMDA3YzApKQorI2RlZmluZSAgUlhUWF9SRUcwX0NUTEVfRVFfRlJfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAzZSkgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgMHgwMDAwMDAzZSkpCisjZGVmaW5lIFJYVFhfUkVHMQkJCTB4MDAyCisjZGVmaW5lICBSWFRYX1JFRzFfUlhBQ1ZDTV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDBmMDAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTIpICYgMHgwMDAwZjAwMCkpCisjZGVmaW5lICBSWFRYX1JFRzFfQ1RMRV9FUV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwZjgwKSB8ICgoKHUzMikgKHNyYykgPDwgNykgJiAweDAwMDAwZjgwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMV9SWFZSRUcxX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwNjApIHwgKCgodTMyKSAoc3JjKSA8PCA1KSAmIDB4MDAwMDAwNjApKQorI2RlZmluZSAgUlhUWF9SRUcxX1JYSVJFRl9BREpfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwNikgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgIDB4MDAwMDAwMDYpKQorI2RlZmluZSBSWFRYX1JFRzIJCQkweDAwNAorI2RlZmluZSAgUlhUWF9SRUcyX1ZUVF9FTkFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDEwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDgpICYgMHgwMDAwMDEwMCkpCisjZGVmaW5lICBSWFRYX1JFRzJfVFhfRklGT19FTkFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAyMCkgfCAoKCh1MzIpIChzcmMpIDw8IDUpICYgMHgwMDAwMDAyMCkpCisjZGVmaW5lICBSWFRYX1JFRzJfVlRUX1NFTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMGMwKSB8ICgoKHUzMikgKHNyYykgPDwgNikgJiAweDAwMDAwMGMwKSkKKyNkZWZpbmUgUlhUWF9SRUc0CQkJMHgwMDgKKyNkZWZpbmUgIFJYVFhfUkVHNF9UWF9MT09QQkFDS19CVUZfRU5fTUFTSwkweDAwMDAwMDQwCisjZGVmaW5lICBSWFRYX1JFRzRfVFhfREFUQV9SQVRFX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGMwMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxNCkgJiAweDAwMDBjMDAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHNF9UWF9XT1JEX01PREVfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMzgwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDExKSAmIDB4MDAwMDM4MDApKQorI2RlZmluZSBSWFRYX1JFRzUJCQkweDAwYQorI2RlZmluZSAgUlhUWF9SRUc1X1RYX0NOMV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDBmODAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTEpICYgMHgwMDAwZjgwMCkpCisjZGVmaW5lICBSWFRYX1JFRzVfVFhfQ1AxX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDA3ZTApIHwgKCgodTMyKSAoc3JjKSA8PCA1KSAmIDB4MDAwMDA3ZTApKQorI2RlZmluZSAgUlhUWF9SRUc1X1RYX0NOMl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDFmKSB8ICgoKHUzMikgKHNyYykgPDwgMCkgJiAweDAwMDAwMDFmKSkKKyNkZWZpbmUgUlhUWF9SRUc2CQkJMHgwMGMKKyNkZWZpbmUgIFJYVFhfUkVHNl9UWEFNUF9DTlRMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDA3ODApIHwgKCgodTMyKSAoc3JjKSA8PCA3KSAmIDB4MDAwMDA3ODApKQorI2RlZmluZSAgUlhUWF9SRUc2X1RYQU1QX0VOQV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDQwKSB8ICgoKHUzMikgKHNyYykgPDwgNikgJiAweDAwMDAwMDQwKSkKKyNkZWZpbmUgIFJYVFhfUkVHNl9SWF9CSVNUX0VSUkNOVF9SRF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDAxKSB8ICgoKHUzMikgKHNyYykgPDwgMCkgJiAweDAwMDAwMDAxKSkKKyNkZWZpbmUgIFJYVFhfUkVHNl9UWF9JRExFX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDgpIHwgKCgodTMyKSAoc3JjKSA8PCAzKSAmIDB4MDAwMDAwMDgpKQorI2RlZmluZSAgUlhUWF9SRUc2X1JYX0JJU1RfUkVTWU5DX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDIpIHwgKCgodTMyKSAoc3JjKSA8PCAxKSAmIDB4MDAwMDAwMDIpKQorI2RlZmluZSBSWFRYX1JFRzcJCQkweDAwZQorI2RlZmluZSAgUlhUWF9SRUc3X1JFU0VUQl9SWERfTUFTSwkweDAwMDAwMTAwCisjZGVmaW5lICBSWFRYX1JFRzdfUkVTRVRCX1JYQV9NQVNLCTB4MDAwMDAwODAKKyNkZWZpbmUgIFJYVFhfUkVHN19CSVNUX0VOQV9SWF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDQwKSB8ICgoKHUzMikgKHNyYykgPDwgNikgJiAweDAwMDAwMDQwKSkKKyNkZWZpbmUgIFJYVFhfUkVHN19SWF9XT1JEX01PREVfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMzgwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDExKSAmIDB4MDAwMDM4MDApKQorI2RlZmluZSBSWFRYX1JFRzgJCQkweDAxMAorI2RlZmluZSAgUlhUWF9SRUc4X0NEUl9MT09QX0VOQV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDA0MDAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTQpICYgMHgwMDAwNDAwMCkpCisjZGVmaW5lICBSWFRYX1JFRzhfQ0RSX0JZUEFTU19SWExPU19TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwODAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTEpICYgMHgwMDAwMDgwMCkpCisjZGVmaW5lICBSWFRYX1JFRzhfU1NDX0VOQUJMRV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMjAwKSB8ICgoKHUzMikgKHNyYykgPDwgOSkgJiAweDAwMDAwMjAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHOF9TRF9WUkVGX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwZjApIHwgKCgodTMyKSAoc3JjKSA8PCA0KSAmIDB4MDAwMDAwZjApKQorI2RlZmluZSAgUlhUWF9SRUc4X1NEX0RJU0FCTEVfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDEwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDgpICYgMHgwMDAwMDEwMCkpCisjZGVmaW5lIFJYVFhfUkVHNwkJCTB4MDBlCisjZGVmaW5lICBSWFRYX1JFRzdfUkVTRVRCX1JYRF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMTAwKSB8ICgoKHUzMikgKHNyYykgPDwgOCkgJiAweDAwMDAwMTAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHN19SRVNFVEJfUlhBX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwODApIHwgKCgodTMyKSAoc3JjKSA8PCA3KSAmIDB4MDAwMDAwODApKQorI2RlZmluZSAgUlhUWF9SRUc3X0xPT1BfQkFDS19FTkFfQ1RMRV9NQVNLCTB4MDAwMDQwMDAKKyNkZWZpbmUgIFJYVFhfUkVHN19MT09QX0JBQ0tfRU5BX0NUTEVfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwNDAwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDE0KSAmIDB4MDAwMDQwMDApKQorI2RlZmluZSBSWFRYX1JFRzExCQkJMHgwMTYKKyNkZWZpbmUgIFJYVFhfUkVHMTFfUEhBU0VfQURKVVNUX0xJTUlUX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGY4MDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMSkgJiAweDAwMDBmODAwKSkKKyNkZWZpbmUgUlhUWF9SRUcxMgkJCTB4MDE4CisjZGVmaW5lICBSWFRYX1JFRzEyX0xBVENIX09GRl9FTkFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMjAwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDEzKSAmIDB4MDAwMDIwMDApKQorI2RlZmluZSAgUlhUWF9SRUcxMl9TVU1PU19FTkFCTEVfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwNCkgfCAoKCh1MzIpIChzcmMpIDw8IDIpICYgMHgwMDAwMDAwNCkpCisjZGVmaW5lICBSWFRYX1JFRzEyX1JYX0RFVF9URVJNX0VOQUJMRV9NQVNLCTB4MDAwMDAwMDIKKyNkZWZpbmUgIFJYVFhfUkVHMTJfUlhfREVUX1RFUk1fRU5BQkxFX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDIpIHwgKCgodTMyKSAoc3JjKSA8PCAxKSAmIDB4MDAwMDAwMDIpKQorI2RlZmluZSBSWFRYX1JFRzEzCQkJMHgwMWEKKyNkZWZpbmUgUlhUWF9SRUcxNAkJCTB4MDFjCisjZGVmaW5lICBSWFRYX1JFRzE0X0NMVEVfTEFUQ0FMX01BTl9QUk9HX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwM2YpIHwgKCgodTMyKSAoc3JjKSA8PCAwKSAmIDB4MDAwMDAwM2YpKQorI2RlZmluZSAgUlhUWF9SRUcxNF9DVExFX0xBVENBTF9NQU5fRU5BX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwNDApIHwgKCgodTMyKSAoc3JjKSA8PCA2KSAmIDB4MDAwMDAwNDApKQorI2RlZmluZSBSWFRYX1JFRzI2CQkJMHgwMzQKKyNkZWZpbmUgIFJYVFhfUkVHMjZfUEVSSU9EX0VSUk9SX0xBVENIX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDM4MDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMSkgJiAweDAwMDAzODAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMjZfQkxXQ19FTkFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwOCkgfCAoKCh1MzIpIChzcmMpIDw8IDMpICYgMHgwMDAwMDAwOCkpCisjZGVmaW5lIFJYVFhfUkVHMjEJCQkweDAyYQorI2RlZmluZSAgUlhUWF9SRUcyMV9ET19MQVRDSF9DQUxPVVRfUkQoc3JjKSAoKDB4MDAwMGZjMDAgJiAodTMyKSAoc3JjKSkgPj4gMTApCisjZGVmaW5lICBSWFRYX1JFRzIxX1hPX0xBVENIX0NBTE9VVF9SRChzcmMpICgoMHgwMDAwMDNmMCAmICh1MzIpIChzcmMpKSA+PiA0KQorI2RlZmluZSAgUlhUWF9SRUcyMV9MQVRDSF9DQUxfRkFJTF9PRERfUkQoc3JjKQkoKDB4MDAwMDAwMGYgJiAodTMyKShzcmMpKSkKKyNkZWZpbmUgUlhUWF9SRUcyMgkJCTB4MDJjCisjZGVmaW5lICBSWFRYX1JFRzIyX1NPX0xBVENIX0NBTE9VVF9SRChzcmMpICgoMHgwMDAwMDNmMCAmICh1MzIpIChzcmMpKSA+PiA0KQorI2RlZmluZSAgUlhUWF9SRUcyMl9FT19MQVRDSF9DQUxPVVRfUkQoc3JjKSAoKDB4MDAwMGZjMDAgJiAodTMyKSAoc3JjKSkgPj4gMTApCisjZGVmaW5lICBSWFRYX1JFRzIyX0xBVENIX0NBTF9GQUlMX0VWRU5fUkQoc3JjKQkoKDB4MDAwMDAwMGYgJiAodTMyKShzcmMpKSkKKyNkZWZpbmUgUlhUWF9SRUcyMwkJCTB4MDJlCisjZGVmaW5lICBSWFRYX1JFRzIzX0RFX0xBVENIX0NBTE9VVF9SRChzcmMpICgoMHgwMDAwZmMwMCAmICh1MzIpIChzcmMpKSA+PiAxMCkKKyNkZWZpbmUgIFJYVFhfUkVHMjNfWEVfTEFUQ0hfQ0FMT1VUX1JEKHNyYykgKCgweDAwMDAwM2YwICYgKHUzMikgKHNyYykpID4+IDQpCisjZGVmaW5lIFJYVFhfUkVHMjQJCQkweDAzMAorI2RlZmluZSAgUlhUWF9SRUcyNF9FRV9MQVRDSF9DQUxPVVRfUkQoc3JjKSAoKDB4MDAwMGZjMDAgJiAodTMyKSAoc3JjKSkgPj4gMTApCisjZGVmaW5lICBSWFRYX1JFRzI0X1NFX0xBVENIX0NBTE9VVF9SRChzcmMpICgoMHgwMDAwMDNmMCAmICh1MzIpIChzcmMpKSA+PiA0KQorI2RlZmluZSBSWFRYX1JFRzI3CQkJMHgwMzYKKyNkZWZpbmUgUlhUWF9SRUcyOAkJCTB4MDM4CisjZGVmaW5lIFJYVFhfUkVHMzEJCQkweDAzZQorI2RlZmluZSBSWFRYX1JFRzM4CQkJMHgwNGMKKyNkZWZpbmUgIFJYVFhfUkVHMzhfQ1VTVE9NRVJfUElOTU9ERV9JTlZfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiAweDAwMDBmZmZlKSB8ICgoKHUzMikgKHNyYykgPDwgMSkgJiAweDAwMDBmZmZlKSkKKyNkZWZpbmUgUlhUWF9SRUczOQkJCTB4MDRlCisjZGVmaW5lIFJYVFhfUkVHNDAJCQkweDA1MAorI2RlZmluZSBSWFRYX1JFRzQxCQkJMHgwNTIKKyNkZWZpbmUgUlhUWF9SRUc0MgkJCTB4MDU0CisjZGVmaW5lIFJYVFhfUkVHNDMJCQkweDA1NgorI2RlZmluZSBSWFRYX1JFRzQ0CQkJMHgwNTgKKyNkZWZpbmUgUlhUWF9SRUc0NQkJCTB4MDVhCisjZGVmaW5lIFJYVFhfUkVHNDYJCQkweDA1YworI2RlZmluZSBSWFRYX1JFRzQ3CQkJMHgwNWUKKyNkZWZpbmUgUlhUWF9SRUc0OAkJCTB4MDYwCisjZGVmaW5lIFJYVFhfUkVHNDkJCQkweDA2MgorI2RlZmluZSBSWFRYX1JFRzUwCQkJMHgwNjQKKyNkZWZpbmUgUlhUWF9SRUc1MQkJCTB4MDY2CisjZGVmaW5lIFJYVFhfUkVHNTIJCQkweDA2OAorI2RlZmluZSBSWFRYX1JFRzUzCQkJMHgwNmEKKyNkZWZpbmUgUlhUWF9SRUc1NAkJCTB4MDZjCisjZGVmaW5lIFJYVFhfUkVHNTUJCQkweDA2ZQorI2RlZmluZSBSWFRYX1JFRzYxCQkJMHgwN2EKKyNkZWZpbmUgIFJYVFhfUkVHNjFfSVNDQU5fSU5CRVJUX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMTApIHwgKCgodTMyKSAoc3JjKSA8PCA0KSAmIDB4MDAwMDAwMTApKQorI2RlZmluZSAgUlhUWF9SRUc2MV9MT0FERlJFUV9TSElGVF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDA4KSB8ICgoKHUzMikgKHNyYykgPDwgMykgJiAweDAwMDAwMDA4KSkKKyNkZWZpbmUgIFJYVFhfUkVHNjFfRVlFX0NPVU5UX1dJRFRIX1NFTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMGMwKSB8ICgoKHUzMikgKHNyYykgPDwgNikgJiAweDAwMDAwMGMwKSkKKyNkZWZpbmUgIFJYVFhfUkVHNjFfU1BEX1NFTF9DRFJfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwM2MwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDEwKSAmIDB4MDAwMDNjMDApKQorI2RlZmluZSBSWFRYX1JFRzYyCQkJMHgwN2MKKyNkZWZpbmUgIFJYVFhfUkVHNjJfUEVSSU9EX0gxX1FMQVRDSF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAzODAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTEpICYgMHgwMDAwMzgwMCkpCisjZGVmaW5lIFJYVFhfUkVHODEJCQkweDBhMgorI2RlZmluZSAgUlhUWF9SRUc4OV9NVV9USDdfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwZjgwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDExKSAmIDB4MDAwMGY4MDApKQorI2RlZmluZSAgUlhUWF9SRUc4OV9NVV9USDhfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDdjMCkgfCAoKCh1MzIpIChzcmMpIDw8IDYpICYgMHgwMDAwMDdjMCkpCisjZGVmaW5lICBSWFRYX1JFRzg5X01VX1RIOV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDNlKSB8ICgoKHUzMikgKHNyYykgPDwgMSkgJiAweDAwMDAwMDNlKSkKKyNkZWZpbmUgUlhUWF9SRUc5NgkJCTB4MGMwCisjZGVmaW5lICBSWFRYX1JFRzk2X01VX0ZSRVExX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGY4MDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMSkgJiAweDAwMDBmODAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHOTZfTVVfRlJFUTJfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDdjMCkgfCAoKCh1MzIpIChzcmMpIDw8IDYpICYgMHgwMDAwMDdjMCkpCisjZGVmaW5lICBSWFRYX1JFRzk2X01VX0ZSRVEzX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwM2UpIHwgKCgodTMyKSAoc3JjKSA8PCAxKSAmIDB4MDAwMDAwM2UpKQorI2RlZmluZSBSWFRYX1JFRzk5CQkJMHgwYzYKKyNkZWZpbmUgIFJYVFhfUkVHOTlfTVVfUEhBU0UxX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGY4MDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMSkgJiAweDAwMDBmODAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHOTlfTVVfUEhBU0UyX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDA3YzApIHwgKCgodTMyKSAoc3JjKSA8PCA2KSAmIDB4MDAwMDA3YzApKQorI2RlZmluZSAgUlhUWF9SRUc5OV9NVV9QSEFTRTNfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAzZSkgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgMHgwMDAwMDAzZSkpCisjZGVmaW5lIFJYVFhfUkVHMTAyCQkJMHgwY2MKKyNkZWZpbmUgIFJYVFhfUkVHMTAyX0ZSRVFMT09QX0xJTUlUX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwNjApIHwgKCgodTMyKSAoc3JjKSA8PCA1KSAmIDB4MDAwMDAwNjApKQorI2RlZmluZSBSWFRYX1JFRzExNAkJCTB4MGU0CisjZGVmaW5lIFJYVFhfUkVHMTIxCQkJMHgwZjIKKyNkZWZpbmUgIFJYVFhfUkVHMTIxX1NVTU9TX0NBTF9DT0RFX1JEKHNyYykgKCgweDAwMDAwMDNlICYgKHUzMikoc3JjKSkgPj4gMHgxKQorI2RlZmluZSBSWFRYX1JFRzEyNQkJCTB4MGZhCisjZGVmaW5lICBSWFRYX1JFRzEyNV9QUV9SRUdfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwZmUwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDkpICYgMHgwMDAwZmUwMCkpCisjZGVmaW5lICBSWFRYX1JFRzEyNV9TSUdOX1BRX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAxMDApIHwgKCgodTMyKSAoc3JjKSA8PCA4KSAmIDB4MDAwMDAxMDApKQorI2RlZmluZSAgUlhUWF9SRUcxMjVfU0lHTl9QUV8yQ19TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDgwKSB8ICgoKHUzMikgKHNyYykgPDwgNykgJiAweDAwMDAwMDgwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMTI1X1BIWl9NQU5VQUxDT0RFX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwN2MpIHwgKCgodTMyKSAoc3JjKSA8PCAyKSAmIDB4MDAwMDAwN2MpKQorI2RlZmluZSAgUlhUWF9SRUcxMjVfUEhaX01BTlVBTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDAyKSB8ICgoKHUzMikgKHNyYykgPDwgMSkgJiAweDAwMDAwMDAyKSkKKyNkZWZpbmUgUlhUWF9SRUcxMjcJCQkweDBmZQorI2RlZmluZSAgUlhUWF9SRUcxMjdfRk9SQ0VfU1VNX0NBTF9TVEFSVF9NQVNLCTB4MDAwMDAwMDIKKyNkZWZpbmUgIFJYVFhfUkVHMTI3X0ZPUkNFX0xBVF9DQUxfU1RBUlRfTUFTSwkweDAwMDAwMDA0CisjZGVmaW5lICBSWFRYX1JFRzEyN19GT1JDRV9TVU1fQ0FMX1NUQVJUX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDIpIHwgKCgodTMyKSAoc3JjKSA8PCAxKSAmIDB4MDAwMDAwMDIpKQorI2RlZmluZSAgUlhUWF9SRUcxMjdfRk9SQ0VfTEFUX0NBTF9TVEFSVF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDA0KSB8ICgoKHUzMikgKHNyYykgPDwgMikgJiAweDAwMDAwMDA0KSkKKyNkZWZpbmUgIFJYVFhfUkVHMTI3X0xBVENIX01BTl9DQUxfRU5BX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDgpIHwgKCgodTMyKSAoc3JjKSA8PCAzKSAmIDB4MDAwMDAwMDgpKQorI2RlZmluZSAgUlhUWF9SRUcxMjdfRE9fTEFUQ0hfTUFOQ0FMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGZjMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMCkgJiAweDAwMDBmYzAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMTI3X1hPX0xBVENIX01BTkNBTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwM2YwKSB8ICgoKHUzMikgKHNyYykgPDwgNCkgJiAweDAwMDAwM2YwKSkKKyNkZWZpbmUgUlhUWF9SRUcxMjgJCQkweDEwMAorI2RlZmluZSAgUlhUWF9SRUcxMjhfTEFUQ0hfQ0FMX1dBSVRfU0VMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMGMpIHwgKCgodTMyKSAoc3JjKSA8PCAyKSAmIDB4MDAwMDAwMGMpKQorI2RlZmluZSAgUlhUWF9SRUcxMjhfRU9fTEFUQ0hfTUFOQ0FMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGZjMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMCkgJiAweDAwMDBmYzAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMTI4X1NPX0xBVENIX01BTkNBTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwM2YwKSB8ICgoKHUzMikgKHNyYykgPDwgNCkgJiAweDAwMDAwM2YwKSkKKyNkZWZpbmUgUlhUWF9SRUcxMjkJCQkweDEwMgorI2RlZmluZSAgUlhUWF9SRUcxMjlfREVfTEFUQ0hfTUFOQ0FMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGZjMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMCkgJiAweDAwMDBmYzAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMTI5X1hFX0xBVENIX01BTkNBTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwM2YwKSB8ICgoKHUzMikgKHNyYykgPDwgNCkgJiAweDAwMDAwM2YwKSkKKyNkZWZpbmUgUlhUWF9SRUcxMzAJCQkweDEwNAorI2RlZmluZSAgUlhUWF9SRUcxMzBfRUVfTEFUQ0hfTUFOQ0FMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGZjMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMCkgJiAweDAwMDBmYzAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMTMwX1NFX0xBVENIX01BTkNBTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwM2YwKSB8ICgoKHUzMikgKHNyYykgPDwgNCkgJiAweDAwMDAwM2YwKSkKKyNkZWZpbmUgUlhUWF9SRUcxNDUJCQkweDEyMgorI2RlZmluZSAgUlhUWF9SRUcxNDVfVFhfSURMRV9TQVRBX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDEpIHwgKCgodTMyKSAoc3JjKSA8PCAwKSAmIDB4MDAwMDAwMDEpKQorI2RlZmluZSAgUlhUWF9SRUcxNDVfUlhFU19FTkFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwMikgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgMHgwMDAwMDAwMikpCisjZGVmaW5lICBSWFRYX1JFRzE0NV9SWERGRV9DT05GSUdfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwYzAwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDE0KSAmIDB4MDAwMGMwMDApKQorI2RlZmluZSAgUlhUWF9SRUcxNDVfUlhWV0VTX0xBVEVOQV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDA0KSB8ICgoKHUzMikgKHNyYykgPDwgMikgJiAweDAwMDAwMDA0KSkKKyNkZWZpbmUgUlhUWF9SRUcxNDcJCQkweDEyNgorI2RlZmluZSBSWFRYX1JFRzE0OAkJCTB4MTI4CisKKy8qIENsb2NrIG1hY3JvIHR5cGUgKi8KK2VudW0gY211X3R5cGVfdCB7CisJUkVGX0NNVSA9IDAsCS8qIENsb2NrIG1hY3JvIGlzIHRoZSBpbnRlcm5hbCByZWZlcmVuY2UgY2xvY2sgKi8KKwlQSFlfQ01VID0gMSwJLyogQ2xvY2sgbWFjcm8gaXMgdGhlIFBMTCBmb3IgdGhlIFNlcmRlcyAqLworfTsKKworZW51bSBtdXhfdHlwZV90IHsKKwlNVVhfU0VMRUNUX0FUQSA9IDAsCS8qIFN3aXRjaCB0aGUgTVVYIHRvIEFUQSAqLworCU1VWF9TRUxFQ1RfU0dNTUlJID0gMCwJLyogU3dpdGNoIHRoZSBNVVggdG8gU0dNSUkgKi8KK307CisKK2VudW0gY2xrX3R5cGVfdCB7CisJQ0xLX0VYVF9ESUZGID0gMCwJLyogRXh0ZXJuYWwgZGlmZmVyZW50aWFsICovCisJQ0xLX0lOVF9ESUZGID0gMSwJLyogSW50ZXJuYWwgZGlmZmVyZW50aWFsICovCisJQ0xLX0lOVF9TSU5HID0gMiwJLyogSW50ZXJuYWwgc2luZ2xlIGVuZGVkICovCit9OworCitlbnVtIHBoeV9tb2RlIHsKKwlNT0RFX1NBVEEJPSAwLAkvKiBMaXN0IHRoZW0gZm9yIHNpbXBsZSByZWZlcmVuY2UgKi8KKwlNT0RFX1NHTUlJCT0gMSwKKwlNT0RFX1BDSUUJPSAyLAorCU1PREVfVVNCCT0gMywKKwlNT0RFX1hGSQk9IDQsCisJTU9ERV9NQVgKK307CisKK3N0cnVjdCB4Z2VuZV9zYXRhX292ZXJyaWRlX3BhcmFtIHsKKwl1MzIgc3BlZWRbTUFYX0xBTkVdOyAvKiBJbmRleCBmb3Igb3ZlcnJpZGUgcGFyYW1ldGVyIHBlciBsYW5lICovCisJdTMyIHR4c3BlZWRbM107CQkJLyogVHggc3BlZWQgKi8KKwl1MzIgdHhib29zdGdhaW5bTUFYX0xBTkUqM107CS8qIFR4IGZyZXEgYm9vc3QgYW5kIGdhaW4gY29udHJvbCAqLworCXUzMiB0eGV5ZXR1bmluZ1tNQVhfTEFORSozXTsJLyogVHggZXllIHR1bmluZyAqLworCXUzMiB0eGV5ZWRpcmVjdGlvbltNQVhfTEFORSozXTsgLyogVHggZXllIHR1bmluZyBkaXJlY3Rpb24gKi8KKwl1MzIgdHhhbXBsaXR1ZGVbTUFYX0xBTkUqM107CS8qIFR4IGFtcGxpdHVkZSBjb250cm9sICovCisJdTMyIHR4cHJlY3Vyc29yX2NuMVtNQVhfTEFORSozXTsgLyogVHggZW1waGFzaXMgdGFwcyAxc3QgcHJlLWN1cnNvciAqLworCXUzMiB0eHByZWN1cnNvcl9jbjJbTUFYX0xBTkUqM107IC8qIFR4IGVtcGhhc2lzIHRhcHMgMm5kIHByZS1jdXJzb3IgKi8KKwl1MzIgdHhwb3N0Y3Vyc29yX2NwMVtNQVhfTEFORSozXTsgLyogVHggZW1waGFzaXMgdGFwcyBwb3N0LWN1cnNvciAqLworfTsKKworc3RydWN0IHhnZW5lX3BoeV9jdHggeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcGh5ICpwaHk7CisJZW51bSBwaHlfbW9kZSBtb2RlOwkJLyogTW9kZSBvZiBvcGVyYXRpb24gKi8KKwllbnVtIGNsa190eXBlX3QgY2xrX3R5cGU7CS8qIElucHV0IGNsb2NrIHNlbGVjdGlvbiAqLworCXZvaWQgX19pb21lbSAqc2RzX2Jhc2U7CQkvKiBQSFkgQ1NSIGJhc2UgYWRkciAqLworCXN0cnVjdCBjbGsgKmNsazsJCS8qIE9wdGlvbmFsIGNsb2NrICovCisKKwkvKiBPdmVycmlkZSBTZXJkZXMgcGFyYW1ldGVycyAqLworCXN0cnVjdCB4Z2VuZV9zYXRhX292ZXJyaWRlX3BhcmFtIHNhdGFfcGFyYW07Cit9OworCisvKgorICogRm9yIGNoaXAgZWFybGllciB0aGFuIEEzIHZlcnNpb24sIGVuYWJsZSB0aGlzIGZsYWcuCisgKiBUbyBlbmFibGUsIHBhc3MgYm9vdCBhcmd1bWVudCBwaHlfeGdlbmUucHJlQTNDaGlwPTEKKyAqLworc3RhdGljIGludCBwcmVBM0NoaXA7CitNT0RVTEVfUEFSTV9ERVNDKHByZUEzQ2hpcCwgIkVuYWJsZSBwcmUtQTMgY2hpcCBzdXBwb3J0ICgxPWVuYWJsZSAwPWRpc2FibGUpIik7Cittb2R1bGVfcGFyYW1fbmFtZWQocHJlQTNDaGlwLCBwcmVBM0NoaXAsIGludCwgMDQ0NCk7CisKK3N0YXRpYyB2b2lkIHNkc193cih2b2lkIF9faW9tZW0gKmNzcl9iYXNlLCB1MzIgaW5kaXJlY3RfY21kX3JlZywKKwkJICAgdTMyIGluZGlyZWN0X2RhdGFfcmVnLCB1MzIgYWRkciwgdTMyIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBkZWFkbGluZSA9IGppZmZpZXMgKyBIWjsKKwl1MzIgdmFsOworCXUzMiBjbWQ7CisKKwljbWQgPSBDRkdfSU5EX1dSX0NNRF9NQVNLIHwgQ0ZHX0lORF9DTURfRE9ORV9NQVNLOworCWNtZCA9IENGR19JTkRfQUREUl9TRVQoY21kLCBhZGRyKTsKKwl3cml0ZWwoZGF0YSwgY3NyX2Jhc2UgKyBpbmRpcmVjdF9kYXRhX3JlZyk7CisJcmVhZGwoY3NyX2Jhc2UgKyBpbmRpcmVjdF9kYXRhX3JlZyk7IC8qIEZvcmNlIGEgYmFycmllciAqLworCXdyaXRlbChjbWQsIGNzcl9iYXNlICsgaW5kaXJlY3RfY21kX3JlZyk7CisJcmVhZGwoY3NyX2Jhc2UgKyBpbmRpcmVjdF9jbWRfcmVnKTsgLyogRm9yY2UgYSBiYXJyaWVyICovCisJZG8geworCQl2YWwgPSByZWFkbChjc3JfYmFzZSArIGluZGlyZWN0X2NtZF9yZWcpOworCX0gd2hpbGUgKCEodmFsICYgQ0ZHX0lORF9DTURfRE9ORV9NQVNLKSAmJgorCQkgdGltZV9iZWZvcmUoamlmZmllcywgZGVhZGxpbmUpKTsKKwlpZiAoISh2YWwgJiBDRkdfSU5EX0NNRF9ET05FX01BU0spKQorCQlwcl9lcnIoIlNEUyBXUiB0aW1lb3V0IGF0IDB4JXAgb2Zmc2V0IDB4JTA4WCB2YWx1ZSAweCUwOFhcbiIsCisJCSAgICAgICBjc3JfYmFzZSArIGluZGlyZWN0X2NtZF9yZWcsIGFkZHIsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBzZHNfcmQodm9pZCBfX2lvbWVtICpjc3JfYmFzZSwgdTMyIGluZGlyZWN0X2NtZF9yZWcsCisJCSAgIHUzMiBpbmRpcmVjdF9kYXRhX3JlZywgdTMyIGFkZHIsIHUzMiAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGRlYWRsaW5lID0gamlmZmllcyArIEhaOworCXUzMiB2YWw7CisJdTMyIGNtZDsKKworCWNtZCA9IENGR19JTkRfUkRfQ01EX01BU0sgfCBDRkdfSU5EX0NNRF9ET05FX01BU0s7CisJY21kID0gQ0ZHX0lORF9BRERSX1NFVChjbWQsIGFkZHIpOworCXdyaXRlbChjbWQsIGNzcl9iYXNlICsgaW5kaXJlY3RfY21kX3JlZyk7CisJcmVhZGwoY3NyX2Jhc2UgKyBpbmRpcmVjdF9jbWRfcmVnKTsgLyogRm9yY2UgYSBiYXJyaWVyICovCisJZG8geworCQl2YWwgPSByZWFkbChjc3JfYmFzZSArIGluZGlyZWN0X2NtZF9yZWcpOworCX0gd2hpbGUgKCEodmFsICYgQ0ZHX0lORF9DTURfRE9ORV9NQVNLKSAmJgorCQkgdGltZV9iZWZvcmUoamlmZmllcywgZGVhZGxpbmUpKTsKKwkqZGF0YSA9IHJlYWRsKGNzcl9iYXNlICsgaW5kaXJlY3RfZGF0YV9yZWcpOworCWlmICghKHZhbCAmIENGR19JTkRfQ01EX0RPTkVfTUFTSykpCisJCXByX2VycigiU0RTIFdSIHRpbWVvdXQgYXQgMHglcCBvZmZzZXQgMHglMDhYIHZhbHVlIDB4JTA4WFxuIiwKKwkJICAgICAgIGNzcl9iYXNlICsgaW5kaXJlY3RfY21kX3JlZywgYWRkciwgKmRhdGEpOworfQorCitzdGF0aWMgdm9pZCBjbXVfd3Ioc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwgZW51bSBjbXVfdHlwZV90IGNtdV90eXBlLAorCQkgICB1MzIgcmVnLCB1MzIgZGF0YSkKK3sKKwl2b2lkIF9faW9tZW0gKnNkc19iYXNlID0gY3R4LT5zZHNfYmFzZTsKKwl1MzIgdmFsOworCisJaWYgKGNtdV90eXBlID09IFJFRl9DTVUpCisJCXJlZyArPSBTRVJERVNfUExMX1JFRl9JTkRJUkVDVF9PRkZTRVQ7CisJZWxzZQorCQlyZWcgKz0gU0VSREVTX1BMTF9JTkRJUkVDVF9PRkZTRVQ7CisJc2RzX3dyKHNkc19iYXNlLCBTQVRBX0VORVRfU0RTX0lORF9DTURfUkVHLAorCQlTQVRBX0VORVRfU0RTX0lORF9XREFUQV9SRUcsIHJlZywgZGF0YSk7CisJc2RzX3JkKHNkc19iYXNlLCBTQVRBX0VORVRfU0RTX0lORF9DTURfUkVHLAorCQlTQVRBX0VORVRfU0RTX0lORF9SREFUQV9SRUcsIHJlZywgJnZhbCk7CisJcHJfZGVidWcoIkNNVSBXUiBhZGRyIDB4JVggdmFsdWUgMHglMDhYIDwtPiAweCUwOFhcbiIsIHJlZywgZGF0YSwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgY211X3JkKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsIGVudW0gY211X3R5cGVfdCBjbXVfdHlwZSwKKwkJICAgdTMyIHJlZywgdTMyICpkYXRhKQoreworCXZvaWQgX19pb21lbSAqc2RzX2Jhc2UgPSBjdHgtPnNkc19iYXNlOworCisJaWYgKGNtdV90eXBlID09IFJFRl9DTVUpCisJCXJlZyArPSBTRVJERVNfUExMX1JFRl9JTkRJUkVDVF9PRkZTRVQ7CisJZWxzZQorCQlyZWcgKz0gU0VSREVTX1BMTF9JTkRJUkVDVF9PRkZTRVQ7CisJc2RzX3JkKHNkc19iYXNlLCBTQVRBX0VORVRfU0RTX0lORF9DTURfUkVHLAorCQlTQVRBX0VORVRfU0RTX0lORF9SREFUQV9SRUcsIHJlZywgZGF0YSk7CisJcHJfZGVidWcoIkNNVSBSRCBhZGRyIDB4JVggdmFsdWUgMHglMDhYXG4iLCByZWcsICpkYXRhKTsKK30KKworc3RhdGljIHZvaWQgY211X3RvZ2dsZTF0bzAoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwgZW51bSBjbXVfdHlwZV90IGNtdV90eXBlLAorCQkJICAgdTMyIHJlZywgdTMyIGJpdHMpCit7CisJdTMyIHZhbDsKKworCWNtdV9yZChjdHgsIGNtdV90eXBlLCByZWcsICZ2YWwpOworCXZhbCB8PSBiaXRzOworCWNtdV93cihjdHgsIGNtdV90eXBlLCByZWcsIHZhbCk7CisJY211X3JkKGN0eCwgY211X3R5cGUsIHJlZywgJnZhbCk7CisJdmFsICY9IH5iaXRzOworCWNtdV93cihjdHgsIGNtdV90eXBlLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGNtdV9jbHJiaXRzKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsIGVudW0gY211X3R5cGVfdCBjbXVfdHlwZSwKKwkJCXUzMiByZWcsIHUzMiBiaXRzKQoreworCXUzMiB2YWw7CisKKwljbXVfcmQoY3R4LCBjbXVfdHlwZSwgcmVnLCAmdmFsKTsKKwl2YWwgJj0gfmJpdHM7CisJY211X3dyKGN0eCwgY211X3R5cGUsIHJlZywgdmFsKTsKK30KKworc3RhdGljIHZvaWQgY211X3NldGJpdHMoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwgZW51bSBjbXVfdHlwZV90IGNtdV90eXBlLAorCQkJdTMyIHJlZywgdTMyIGJpdHMpCit7CisJdTMyIHZhbDsKKworCWNtdV9yZChjdHgsIGNtdV90eXBlLCByZWcsICZ2YWwpOworCXZhbCB8PSBiaXRzOworCWNtdV93cihjdHgsIGNtdV90eXBlLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHNlcmRlc193cihzdHJ1Y3QgeGdlbmVfcGh5X2N0eCAqY3R4LCBpbnQgbGFuZSwgdTMyIHJlZywgdTMyIGRhdGEpCit7CisJdm9pZCBfX2lvbWVtICpzZHNfYmFzZSA9IGN0eC0+c2RzX2Jhc2U7CisJdTMyIHZhbDsKKworCXJlZyArPSBTRVJERVNfSU5ESVJFQ1RfT0ZGU0VUOworCXJlZyArPSBsYW5lICogU0VSREVTX0xBTkVfU1RSSURFOworCXNkc193cihzZHNfYmFzZSwgU0FUQV9FTkVUX1NEU19JTkRfQ01EX1JFRywKKwkgICAgICAgU0FUQV9FTkVUX1NEU19JTkRfV0RBVEFfUkVHLCByZWcsIGRhdGEpOworCXNkc19yZChzZHNfYmFzZSwgU0FUQV9FTkVUX1NEU19JTkRfQ01EX1JFRywKKwkgICAgICAgU0FUQV9FTkVUX1NEU19JTkRfUkRBVEFfUkVHLCByZWcsICZ2YWwpOworCXByX2RlYnVnKCJTRVJERVMgV1IgYWRkciAweCVYIHZhbHVlIDB4JTA4WCA8LT4gMHglMDhYXG4iLCByZWcsIGRhdGEsCisJCSB2YWwpOworfQorCitzdGF0aWMgdm9pZCBzZXJkZXNfcmQoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwgaW50IGxhbmUsIHUzMiByZWcsIHUzMiAqZGF0YSkKK3sKKwl2b2lkIF9faW9tZW0gKnNkc19iYXNlID0gY3R4LT5zZHNfYmFzZTsKKworCXJlZyArPSBTRVJERVNfSU5ESVJFQ1RfT0ZGU0VUOworCXJlZyArPSBsYW5lICogU0VSREVTX0xBTkVfU1RSSURFOworCXNkc19yZChzZHNfYmFzZSwgU0FUQV9FTkVUX1NEU19JTkRfQ01EX1JFRywKKwkgICAgICAgU0FUQV9FTkVUX1NEU19JTkRfUkRBVEFfUkVHLCByZWcsIGRhdGEpOworCXByX2RlYnVnKCJTRVJERVMgUkQgYWRkciAweCVYIHZhbHVlIDB4JTA4WFxuIiwgcmVnLCAqZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHNlcmRlc19jbHJiaXRzKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsIGludCBsYW5lLCB1MzIgcmVnLAorCQkJICAgdTMyIGJpdHMpCit7CisJdTMyIHZhbDsKKworCXNlcmRlc19yZChjdHgsIGxhbmUsIHJlZywgJnZhbCk7CisJdmFsICY9IH5iaXRzOworCXNlcmRlc193cihjdHgsIGxhbmUsIHJlZywgdmFsKTsKK30KKworc3RhdGljIHZvaWQgc2VyZGVzX3NldGJpdHMoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwgaW50IGxhbmUsIHUzMiByZWcsCisJCQkgICB1MzIgYml0cykKK3sKKwl1MzIgdmFsOworCisJc2VyZGVzX3JkKGN0eCwgbGFuZSwgcmVnLCAmdmFsKTsKKwl2YWwgfD0gYml0czsKKwlzZXJkZXNfd3IoY3R4LCBsYW5lLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHhnZW5lX3BoeV9jZmdfY211X2Nsa190eXBlKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsCisJCQkJICAgICAgIGVudW0gY211X3R5cGVfdCBjbXVfdHlwZSwKKwkJCQkgICAgICAgZW51bSBjbGtfdHlwZV90IGNsa190eXBlKQoreworCXUzMiB2YWw7CisKKwkvKiBTZXQgdGhlIHJlc2V0IHNlcXVlbmNlIGRlbGF5IGZvciBUWCByZWFkeSBhc3NlcnRpb24gKi8KKwljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEyLCAmdmFsKTsKKwl2YWwgPSBDTVVfUkVHMTJfU1RBVEVfREVMQVk5X1NFVCh2YWwsIDB4MSk7CisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUcxMiwgdmFsKTsKKwkvKiBTZXQgdGhlIHByb2dyYW1tYWJsZSBzdGFnZSBkZWxheXMgYmV0d2VlbiB2YXJpb3VzIGVuYWJsZSBzdGFnZXMgKi8KKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEzLCAweDAyMjIpOworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTQsIDB4MjIyNSk7CisKKwkvKiBDb25maWd1cmUgY2xvY2sgdHlwZSAqLworCWlmIChjbGtfdHlwZSA9PSBDTEtfRVhUX0RJRkYpIHsKKwkJLyogU2VsZWN0IGV4dGVybmFsIGNsb2NrIG11eCAqLworCQljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzAsICZ2YWwpOworCQl2YWwgPSBDTVVfUkVHMF9QTExfUkVGX1NFTF9TRVQodmFsLCAweDApOworCQljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzAsIHZhbCk7CisJCS8qIFNlbGVjdCBDTU9TIGFzIHJlZmVyZW5jZSBjbG9jayAgKi8KKwkJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcxLCAmdmFsKTsKKwkJdmFsID0gQ01VX1JFRzFfUkVGQ0xLX0NNT1NfU0VMX1NFVCh2YWwsIDB4MCk7CisJCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMSwgdmFsKTsKKwkJZGV2X2RiZyhjdHgtPmRldiwgIlNldCBleHRlcm5hbCByZWZlcmVuY2UgY2xvY2tcbiIpOworCX0gZWxzZSBpZiAoY2xrX3R5cGUgPT0gQ0xLX0lOVF9ESUZGKSB7CisJCS8qIFNlbGVjdCBpbnRlcm5hbCBjbG9jayBtdXggKi8KKwkJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcwLCAmdmFsKTsKKwkJdmFsID0gQ01VX1JFRzBfUExMX1JFRl9TRUxfU0VUKHZhbCwgMHgxKTsKKwkJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUcwLCB2YWwpOworCQkvKiBTZWxlY3QgQ01PUyBhcyByZWZlcmVuY2UgY2xvY2sgICovCisJCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMSwgJnZhbCk7CisJCXZhbCA9IENNVV9SRUcxX1JFRkNMS19DTU9TX1NFTF9TRVQodmFsLCAweDEpOworCQljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEsIHZhbCk7CisJCWRldl9kYmcoY3R4LT5kZXYsICJTZXQgaW50ZXJuYWwgcmVmZXJlbmNlIGNsb2NrXG4iKTsKKwl9IGVsc2UgaWYgKGNsa190eXBlID09IENMS19JTlRfU0lORykgeworCQkvKgorCQkgKiBOT1RFOiBUaGlzIGNsb2NrIHR5cGUgaXMgTk9UIHN1cHBvcnQgZm9yIGNvbnRyb2xsZXIKKwkJICoJIHdob3NlIGludGVybmFsIGNsb2NrIHNoYXJlZCBpbiB0aGUgUENJZSBjb250cm9sbGVyCisJCSAqCisJCSAqIFNlbGVjdCBpbnRlcm5hbCBjbG9jayBtdXgKKwkJICovCisJCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMSwgJnZhbCk7CisJCXZhbCA9IENNVV9SRUcxX1JFRkNMS19DTU9TX1NFTF9TRVQodmFsLCAweDEpOworCQljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEsIHZhbCk7CisJCS8qIFNlbGVjdCBDTUwgYXMgcmVmZXJlbmNlIGNsb2NrICovCisJCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMSwgJnZhbCk7CisJCXZhbCA9IENNVV9SRUcxX1JFRkNMS19DTU9TX1NFTF9TRVQodmFsLCAweDApOworCQljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEsIHZhbCk7CisJCWRldl9kYmcoY3R4LT5kZXYsCisJCQkiU2V0IGludGVybmFsIHNpbmdsZSBlbmRlZCByZWZlcmVuY2UgY2xvY2tcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgeGdlbmVfcGh5X3NhdGFfY2ZnX2NtdV9jb3JlKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsCisJCQkJCWVudW0gY211X3R5cGVfdCBjbXVfdHlwZSwKKwkJCQkJZW51bSBjbGtfdHlwZV90IGNsa190eXBlKQoreworCXUzMiB2YWw7CisJaW50IHJlZl8xMDBNSHo7CisKKwlpZiAoY211X3R5cGUgPT0gUkVGX0NNVSkgeworCQkvKiBTZXQgVkNPIGNhbGlicmF0aW9uIHZvbHRhZ2UgdGhyZXNob2xkICovCisJCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMzQsICZ2YWwpOworCQl2YWwgPSBDTVVfUkVHMzRfVkNPX0NBTF9WVEhfTE9fTUFYX1NFVCh2YWwsIDB4Nyk7CisJCXZhbCA9IENNVV9SRUczNF9WQ09fQ0FMX1ZUSF9ISV9NQVhfU0VUKHZhbCwgMHhjKTsKKwkJdmFsID0gQ01VX1JFRzM0X1ZDT19DQUxfVlRIX0xPX01JTl9TRVQodmFsLCAweDMpOworCQl2YWwgPSBDTVVfUkVHMzRfVkNPX0NBTF9WVEhfSElfTUlOX1NFVCh2YWwsIDB4OCk7CisJCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMzQsIHZhbCk7CisJfQorCisJLyogU2V0IHRoZSBWQ08gY2FsaWJyYXRpb24gY291bnRlciAqLworCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMCwgJnZhbCk7CisJaWYgKGNtdV90eXBlID09IFJFRl9DTVUgfHwgcHJlQTNDaGlwKQorCQl2YWwgPSBDTVVfUkVHMF9DQUxfQ09VTlRfUkVTT0xfU0VUKHZhbCwgMHg0KTsKKwllbHNlCisJCXZhbCA9IENNVV9SRUcwX0NBTF9DT1VOVF9SRVNPTF9TRVQodmFsLCAweDcpOworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMCwgdmFsKTsKKworCS8qIENvbmZpZ3VyZSBQTEwgZm9yIGNhbGlicmF0aW9uICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcxLCAmdmFsKTsKKwl2YWwgPSBDTVVfUkVHMV9QTExfQ1BfU0VUKHZhbCwgMHgxKTsKKwlpZiAoY211X3R5cGUgPT0gUkVGX0NNVSB8fCBwcmVBM0NoaXApCisJCXZhbCA9IENNVV9SRUcxX1BMTF9DUF9TRUxfU0VUKHZhbCwgMHg1KTsKKwllbHNlCisJCXZhbCA9IENNVV9SRUcxX1BMTF9DUF9TRUxfU0VUKHZhbCwgMHgzKTsKKwlpZiAoY211X3R5cGUgPT0gUkVGX0NNVSkKKwkJdmFsID0gQ01VX1JFRzFfUExMX01BTlVBTENBTF9TRVQodmFsLCAweDApOworCWVsc2UKKwkJdmFsID0gQ01VX1JFRzFfUExMX01BTlVBTENBTF9TRVQodmFsLCAweDEpOworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMSwgdmFsKTsKKworCWlmIChjbXVfdHlwZSAhPSBSRUZfQ01VKQorCQljbXVfY2xyYml0cyhjdHgsIGNtdV90eXBlLCBDTVVfUkVHNSwgQ01VX1JFRzVfUExMX1JFU0VUQl9NQVNLKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgUExMIGZvciBlaXRoZXIgMTAwTUh6IG9yIDUwTUh6ICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcyLCAmdmFsKTsKKwlpZiAoY211X3R5cGUgPT0gUkVGX0NNVSkgeworCQl2YWwgPSBDTVVfUkVHMl9QTExfTEZSRVNfU0VUKHZhbCwgMHhhKTsKKwkJcmVmXzEwME1IeiA9IDE7CisJfSBlbHNlIHsKKwkJdmFsID0gQ01VX1JFRzJfUExMX0xGUkVTX1NFVCh2YWwsIDB4Myk7CisJCWlmIChjbGtfdHlwZSA9PSBDTEtfRVhUX0RJRkYpCisJCQlyZWZfMTAwTUh6ID0gMDsKKwkJZWxzZQorCQkJcmVmXzEwME1IeiA9IDE7CisJfQorCWlmIChyZWZfMTAwTUh6KSB7CisJCXZhbCA9IENNVV9SRUcyX1BMTF9GQkRJVl9TRVQodmFsLCBGQkRJVl9WQUxfMTAwTSk7CisJCXZhbCA9IENNVV9SRUcyX1BMTF9SRUZESVZfU0VUKHZhbCwgUkVGRElWX1ZBTF8xMDBNKTsKKwl9IGVsc2UgeworCQl2YWwgPSBDTVVfUkVHMl9QTExfRkJESVZfU0VUKHZhbCwgRkJESVZfVkFMXzUwTSk7CisJCXZhbCA9IENNVV9SRUcyX1BMTF9SRUZESVZfU0VUKHZhbCwgUkVGRElWX1ZBTF81ME0pOworCX0KKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzIsIHZhbCk7CisKKwkvKiBDb25maWd1cmUgdGhlIFZDTyAqLworCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMywgJnZhbCk7CisJaWYgKGNtdV90eXBlID09IFJFRl9DTVUpIHsKKwkJdmFsID0gQ01VX1JFRzNfVkNPVkFSU0VMX1NFVCh2YWwsIDB4Myk7CisJCXZhbCA9IENNVV9SRUczX1ZDT19NT01TRUxfSU5JVF9TRVQodmFsLCAweDEwKTsKKwl9IGVsc2UgeworCQl2YWwgPSBDTVVfUkVHM19WQ09WQVJTRUxfU0VUKHZhbCwgMHhGKTsKKwkJaWYgKHByZUEzQ2hpcCkKKwkJCXZhbCA9IENNVV9SRUczX1ZDT19NT01TRUxfSU5JVF9TRVQodmFsLCAweDE1KTsKKwkJZWxzZQorCQkJdmFsID0gQ01VX1JFRzNfVkNPX01PTVNFTF9JTklUX1NFVCh2YWwsIDB4MWEpOworCQl2YWwgPSBDTVVfUkVHM19WQ09fTUFOTU9NU0VMX1NFVCh2YWwsIDB4MTUpOworCX0KKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzMsIHZhbCk7CisKKwkvKiBEaXNhYmxlIGZvcmNlIFBMTCBsb2NrICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcyNiwgJnZhbCk7CisJdmFsID0gQ01VX1JFRzI2X0ZPUkNFX1BMTF9MT0NLX1NFVCh2YWwsIDB4MCk7CisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUcyNiwgdmFsKTsKKworCS8qIFNldHVwIFBMTCBsb29wIGZpbHRlciAqLworCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHNSwgJnZhbCk7CisJdmFsID0gQ01VX1JFRzVfUExMX0xGU01DQVBfU0VUKHZhbCwgMHgzKTsKKwl2YWwgPSBDTVVfUkVHNV9QTExfTEZDQVBfU0VUKHZhbCwgMHgzKTsKKwlpZiAoY211X3R5cGUgPT0gUkVGX0NNVSB8fCAhcHJlQTNDaGlwKQorCQl2YWwgPSBDTVVfUkVHNV9QTExfTE9DS19SRVNPTFVUSU9OX1NFVCh2YWwsIDB4Nyk7CisJZWxzZQorCQl2YWwgPSBDTVVfUkVHNV9QTExfTE9DS19SRVNPTFVUSU9OX1NFVCh2YWwsIDB4NCk7CisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUc1LCB2YWwpOworCisJLyogRW5hYmxlIG9yIGRpc2FibGUgbWFudWFsIGNhbGlicmF0aW9uICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUc2LCAmdmFsKTsKKwl2YWwgPSBDTVVfUkVHNl9QTExfVlJFR1RSSU1fU0VUKHZhbCwgcHJlQTNDaGlwID8gMHgwIDogMHgyKTsKKwl2YWwgPSBDTVVfUkVHNl9NQU5fUFZUX0NBTF9TRVQodmFsLCBwcmVBM0NoaXAgPyAweDEgOiAweDApOworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHNiwgdmFsKTsKKworCS8qIENvbmZpZ3VyZSBsYW5lIGZvciAyMC1iaXRzICovCisJaWYgKGNtdV90eXBlID09IFBIWV9DTVUpIHsKKwkJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUc5LCAmdmFsKTsKKwkJdmFsID0gQ01VX1JFRzlfVFhfV09SRF9NT0RFX0NIMV9TRVQodmFsLAorCQkJCQkJICAgIENNVV9SRUc5X1dPUkRfTEVOXzIwQklUKTsKKwkJdmFsID0gQ01VX1JFRzlfVFhfV09SRF9NT0RFX0NIMF9TRVQodmFsLAorCQkJCQkJICAgIENNVV9SRUc5X1dPUkRfTEVOXzIwQklUKTsKKwkJdmFsID0gQ01VX1JFRzlfUExMX1BPU1RfRElWQlkyX1NFVCh2YWwsIDB4MSk7CisJCWlmICghcHJlQTNDaGlwKSB7CisJCQl2YWwgPSBDTVVfUkVHOV9WQkdfQllQQVNTQl9TRVQodmFsLCAweDApOworCQkJdmFsID0gQ01VX1JFRzlfSUdFTl9CWVBBU1NfU0VUKHZhbCAsIDB4MCk7CisJCX0KKwkJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUc5LCB2YWwpOworCisJCWlmICghcHJlQTNDaGlwKSB7CisJCQljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEwLCAmdmFsKTsKKwkJCXZhbCA9IENNVV9SRUcxMF9WUkVHX1JFRlNFTF9TRVQodmFsLCAweDEpOworCQkJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUcxMCwgdmFsKTsKKwkJfQorCX0KKworCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTYsICZ2YWwpOworCXZhbCA9IENNVV9SRUcxNl9DQUxJQlJBVElPTl9ET05FX09WRVJSSURFX1NFVCh2YWwsIDB4MSk7CisJdmFsID0gQ01VX1JFRzE2X0JZUEFTU19QTExfTE9DS19TRVQodmFsLCAweDEpOworCWlmIChjbXVfdHlwZSA9PSBSRUZfQ01VIHx8IHByZUEzQ2hpcCkKKwkJdmFsID0gQ01VX1JFRzE2X1ZDT0NBTF9XQUlUX0JUV19DT0RFX1NFVCh2YWwsIDB4NCk7CisJZWxzZQorCQl2YWwgPSBDTVVfUkVHMTZfVkNPQ0FMX1dBSVRfQlRXX0NPREVfU0VUKHZhbCwgMHg3KTsKKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzE2LCB2YWwpOworCisJLyogQ29uZmlndXJlIGZvciBTQVRBICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUczMCwgJnZhbCk7CisJdmFsID0gQ01VX1JFRzMwX1BDSUVfTU9ERV9TRVQodmFsLCAweDApOworCXZhbCA9IENNVV9SRUczMF9MT0NLX0NPVU5UX1NFVCh2YWwsIDB4Myk7CisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUczMCwgdmFsKTsKKworCS8qIERpc2FibGUgc3RhdGUgbWFjaGluZSBieXBhc3MgKi8KKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzMxLCAweEYpOworCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUczMiwgJnZhbCk7CisJdmFsID0gQ01VX1JFRzMyX1BWVF9DQUxfV0FJVF9TRUxfU0VUKHZhbCwgMHgzKTsKKwlpZiAoY211X3R5cGUgPT0gUkVGX0NNVSB8fCBwcmVBM0NoaXApCisJCXZhbCA9IENNVV9SRUczMl9JUkVGX0FESl9TRVQodmFsLCAweDMpOworCWVsc2UKKwkJdmFsID0gQ01VX1JFRzMyX0lSRUZfQURKX1NFVCh2YWwsIDB4MSk7CisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUczMiwgdmFsKTsKKworCS8qIFNldCBWQ08gY2FsaWJyYXRpb24gdGhyZXNob2xkICovCisJaWYgKGNtdV90eXBlICE9IFJFRl9DTVUgJiYgcHJlQTNDaGlwKQorCQljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzM0LCAweDhkMjcpOworCWVsc2UKKwkJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUczNCwgMHg4NzNjKTsKKworCS8qIFNldCBDVExFIE92ZXJyaWRlIGFuZCBvdmVycmlkZSB3YWl0aW5nIGZyb20gc3RhdGUgbWFjaGluZSAqLworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMzcsIDB4RjAwRik7Cit9CisKK3N0YXRpYyB2b2lkIHhnZW5lX3BoeV9zc2NfZW5hYmxlKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsCisJCQkJIGVudW0gY211X3R5cGVfdCBjbXVfdHlwZSkKK3sKKwl1MzIgdmFsOworCisJLyogU2V0IFNTQyBtb2R1bGF0aW9uIHZhbHVlICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUczNSwgJnZhbCk7CisJdmFsID0gQ01VX1JFRzM1X1BMTF9TU0NfTU9EX1NFVCh2YWwsIDk4KTsKKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzM1LCB2YWwpOworCisJLyogRW5hYmxlIFNTQywgc2V0IHZlcnRpY2FsIHN0ZXAgYW5kIERTTSB2YWx1ZSAqLworCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMzYsICZ2YWwpOworCXZhbCA9IENNVV9SRUczNl9QTExfU1NDX1ZTVEVQX1NFVCh2YWwsIDMwKTsKKwl2YWwgPSBDTVVfUkVHMzZfUExMX1NTQ19FTl9TRVQodmFsLCAxKTsKKwl2YWwgPSBDTVVfUkVHMzZfUExMX1NTQ19EU01TRUxfU0VUKHZhbCwgMSk7CisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUczNiwgdmFsKTsKKworCS8qIFJlc2V0IHRoZSBQTEwgKi8KKwljbXVfY2xyYml0cyhjdHgsIGNtdV90eXBlLCBDTVVfUkVHNSwgQ01VX1JFRzVfUExMX1JFU0VUQl9NQVNLKTsKKwljbXVfc2V0Yml0cyhjdHgsIGNtdV90eXBlLCBDTVVfUkVHNSwgQ01VX1JFRzVfUExMX1JFU0VUQl9NQVNLKTsKKworCS8qIEZvcmNlIFZDTyBjYWxpYnJhdGlvbiB0byByZXN0YXJ0ICovCisJY211X3RvZ2dsZTF0bzAoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzMyLAorCQkgICAgICAgQ01VX1JFRzMyX0ZPUkNFX1ZDT0NBTF9TVEFSVF9NQVNLKTsKK30KKworc3RhdGljIHZvaWQgeGdlbmVfcGh5X3NhdGFfY2ZnX2xhbmVzKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgpCit7CisJdTMyIHZhbDsKKwl1MzIgcmVnOworCWludCBpOworCWludCBsYW5lOworCisJZm9yIChsYW5lID0gMDsgbGFuZSA8IE1BWF9MQU5FOyBsYW5lKyspIHsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxNDcsIDB4Nik7CisKKwkJLyogU2V0IGJvb3N0IGNvbnRyb2wgZm9yIHF1YXJ0ZXIsIGhhbGYsIGFuZCBmdWxsIHJhdGUgKi8KKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcwLCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUcwX0NUTEVfRVFfSFJfU0VUKHZhbCwgMHgxMCk7CisJCXZhbCA9IFJYVFhfUkVHMF9DVExFX0VRX1FSX1NFVCh2YWwsIDB4MTApOworCQl2YWwgPSBSWFRYX1JFRzBfQ1RMRV9FUV9GUl9TRVQodmFsLCAweDEwKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcwLCB2YWwpOworCisJCS8qIFNldCBib29zdCBjb250cm9sIHZhbHVlICovCisJCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHMSwgJnZhbCk7CisJCXZhbCA9IFJYVFhfUkVHMV9SWEFDVkNNX1NFVCh2YWwsIDB4Nyk7CisJCXZhbCA9IFJYVFhfUkVHMV9DVExFX0VRX1NFVCh2YWwsCisJCQljdHgtPnNhdGFfcGFyYW0udHhib29zdGdhaW5bbGFuZSAqIDMgKworCQkJY3R4LT5zYXRhX3BhcmFtLnNwZWVkW2xhbmVdXSk7CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMSwgdmFsKTsKKworCQkvKiBMYXRjaCBWVFQgdmFsdWUgYmFzZWQgb24gdGhlIHRlcm1pbmF0aW9uIHRvIGdyb3VuZCBhbmQKKwkJICAgZW5hYmxlIFRYIEZJRk8gKi8KKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcyLCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUcyX1ZUVF9FTkFfU0VUKHZhbCwgMHgxKTsKKwkJdmFsID0gUlhUWF9SRUcyX1ZUVF9TRUxfU0VUKHZhbCwgMHgxKTsKKwkJdmFsID0gUlhUWF9SRUcyX1RYX0ZJRk9fRU5BX1NFVCh2YWwsIDB4MSk7CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMiwgdmFsKTsKKworCQkvKiBDb25maWd1cmUgVHggZm9yIDIwLWJpdHMgKi8KKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUc0LCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUc0X1RYX1dPUkRfTU9ERV9TRVQodmFsLCBDTVVfUkVHOV9XT1JEX0xFTl8yMEJJVCk7CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHNCwgdmFsKTsKKworCQlpZiAoIXByZUEzQ2hpcCkgeworCQkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxLCAmdmFsKTsKKwkJCXZhbCA9IFJYVFhfUkVHMV9SWFZSRUcxX1NFVCh2YWwsIDB4Mik7CisJCQl2YWwgPSBSWFRYX1JFRzFfUlhJUkVGX0FESl9TRVQodmFsLCAweDIpOworCQkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxLCB2YWwpOworCQl9CisKKwkJLyogU2V0IHByZS1lbXBoYXNpcyBmaXJzdCAxIGFuZCAyLCBhbmQgcG9zdC1lbXBoYXNpcyB2YWx1ZXMgKi8KKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUc1LCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUc1X1RYX0NOMV9TRVQodmFsLAorCQkJY3R4LT5zYXRhX3BhcmFtLnR4cHJlY3Vyc29yX2NuMVtsYW5lICogMyArCisJCQljdHgtPnNhdGFfcGFyYW0uc3BlZWRbbGFuZV1dKTsKKwkJdmFsID0gUlhUWF9SRUc1X1RYX0NQMV9TRVQodmFsLAorCQkJY3R4LT5zYXRhX3BhcmFtLnR4cG9zdGN1cnNvcl9jcDFbbGFuZSAqIDMgKworCQkJY3R4LT5zYXRhX3BhcmFtLnNwZWVkW2xhbmVdXSk7CisJCXZhbCA9IFJYVFhfUkVHNV9UWF9DTjJfU0VUKHZhbCwKKwkJCWN0eC0+c2F0YV9wYXJhbS50eHByZWN1cnNvcl9jbjJbbGFuZSAqIDMgKworCQkJY3R4LT5zYXRhX3BhcmFtLnNwZWVkW2xhbmVdXSk7CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHNSwgdmFsKTsKKworCQkvKiBTZXQgVFggYW1wbGl0dWRlIHZhbHVlICovCisJCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHNiwgJnZhbCk7CisJCXZhbCA9IFJYVFhfUkVHNl9UWEFNUF9DTlRMX1NFVCh2YWwsCisJCQljdHgtPnNhdGFfcGFyYW0udHhhbXBsaXR1ZGVbbGFuZSAqIDMgKworCQkJY3R4LT5zYXRhX3BhcmFtLnNwZWVkW2xhbmVdXSk7CisJCXZhbCA9IFJYVFhfUkVHNl9UWEFNUF9FTkFfU0VUKHZhbCwgMHgxKTsKKwkJdmFsID0gUlhUWF9SRUc2X1RYX0lETEVfU0VUKHZhbCwgMHgwKTsKKwkJdmFsID0gUlhUWF9SRUc2X1JYX0JJU1RfUkVTWU5DX1NFVCh2YWwsIDB4MCk7CisJCXZhbCA9IFJYVFhfUkVHNl9SWF9CSVNUX0VSUkNOVF9SRF9TRVQodmFsLCAweDApOworCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzYsIHZhbCk7CisKKwkJLyogQ29uZmlndXJlIFJ4IGZvciAyMC1iaXRzICovCisJCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHNywgJnZhbCk7CisJCXZhbCA9IFJYVFhfUkVHN19CSVNUX0VOQV9SWF9TRVQodmFsLCAweDApOworCQl2YWwgPSBSWFRYX1JFRzdfUlhfV09SRF9NT0RFX1NFVCh2YWwsIENNVV9SRUc5X1dPUkRfTEVOXzIwQklUKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUc3LCB2YWwpOworCisJCS8qIFNldCBDRFIgYW5kIExPUyB2YWx1ZXMgYW5kIGVuYWJsZSBSeCBTU0MgKi8KKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUc4LCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUc4X0NEUl9MT09QX0VOQV9TRVQodmFsLCAweDEpOworCQl2YWwgPSBSWFRYX1JFRzhfQ0RSX0JZUEFTU19SWExPU19TRVQodmFsLCAweDApOworCQl2YWwgPSBSWFRYX1JFRzhfU1NDX0VOQUJMRV9TRVQodmFsLCAweDEpOworCQl2YWwgPSBSWFRYX1JFRzhfU0RfRElTQUJMRV9TRVQodmFsLCAweDApOworCQl2YWwgPSBSWFRYX1JFRzhfU0RfVlJFRl9TRVQodmFsLCAweDQpOworCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzgsIHZhbCk7CisKKwkJLyogU2V0IHBoYXNlIGFkanVzdCB1cHBlci9sb3dlciBsaW1pdHMgKi8KKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxMSwgJnZhbCk7CisJCXZhbCA9IFJYVFhfUkVHMTFfUEhBU0VfQURKVVNUX0xJTUlUX1NFVCh2YWwsIDB4MCk7CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMTEsIHZhbCk7CisKKwkJLyogRW5hYmxlIExhdGNoIE9mZjsgZGlzYWJsZSBTVU1PUyBhbmQgVHggdGVybWluYXRpb24gKi8KKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxMiwgJnZhbCk7CisJCXZhbCA9IFJYVFhfUkVHMTJfTEFUQ0hfT0ZGX0VOQV9TRVQodmFsLCAweDEpOworCQl2YWwgPSBSWFRYX1JFRzEyX1NVTU9TX0VOQUJMRV9TRVQodmFsLCAweDApOworCQl2YWwgPSBSWFRYX1JFRzEyX1JYX0RFVF9URVJNX0VOQUJMRV9TRVQodmFsLCAweDApOworCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzEyLCB2YWwpOworCisJCS8qIFNldCBwZXJpb2QgZXJyb3IgbGF0Y2ggdG8gNTEyVCBhbmQgZW5hYmxlIEJXTCAqLworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzI2LCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUcyNl9QRVJJT0RfRVJST1JfTEFUQ0hfU0VUKHZhbCwgMHgwKTsKKwkJdmFsID0gUlhUWF9SRUcyNl9CTFdDX0VOQV9TRVQodmFsLCAweDEpOworCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzI2LCB2YWwpOworCisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMjgsIDB4MCk7CisKKwkJLyogU2V0IERGRSBsb29wIHByZXNldCB2YWx1ZSAqLworCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzMxLCAweDApOworCisJCS8qIFNldCBFeWUgTW9uaXRvciBjb3VudGVyIHdpZHRoIHRvIDEyLWJpdCAqLworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzYxLCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUc2MV9JU0NBTl9JTkJFUlRfU0VUKHZhbCwgMHgxKTsKKwkJdmFsID0gUlhUWF9SRUc2MV9MT0FERlJFUV9TSElGVF9TRVQodmFsLCAweDApOworCQl2YWwgPSBSWFRYX1JFRzYxX0VZRV9DT1VOVF9XSURUSF9TRUxfU0VUKHZhbCwgMHgwKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUc2MSwgdmFsKTsKKworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzYyLCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUc2Ml9QRVJJT0RfSDFfUUxBVENIX1NFVCh2YWwsIDB4MCk7CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHNjIsIHZhbCk7CisKKwkJLyogU2V0IEJXIHNlbGVjdCB0YXAgWCBmb3IgREZFIGxvb3AgKi8KKwkJZm9yIChpID0gMDsgaSA8IDk7IGkrKykgeworCQkJcmVnID0gUlhUWF9SRUc4MSArIGkgKiAyOworCQkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgcmVnLCAmdmFsKTsKKwkJCXZhbCA9IFJYVFhfUkVHODlfTVVfVEg3X1NFVCh2YWwsIDB4ZSk7CisJCQl2YWwgPSBSWFRYX1JFRzg5X01VX1RIOF9TRVQodmFsLCAweGUpOworCQkJdmFsID0gUlhUWF9SRUc4OV9NVV9USDlfU0VUKHZhbCwgMHhlKTsKKwkJCXNlcmRlc193cihjdHgsIGxhbmUsIHJlZywgdmFsKTsKKwkJfQorCisJCS8qIFNldCBCVyBzZWxlY3QgdGFwIFggZm9yIGZyZXF1ZW5jeSBhZGp1c3QgbG9vcCAqLworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlyZWcgPSBSWFRYX1JFRzk2ICsgaSAqIDI7CisJCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCByZWcsICZ2YWwpOworCQkJdmFsID0gUlhUWF9SRUc5Nl9NVV9GUkVRMV9TRVQodmFsLCAweDEwKTsKKwkJCXZhbCA9IFJYVFhfUkVHOTZfTVVfRlJFUTJfU0VUKHZhbCwgMHgxMCk7CisJCQl2YWwgPSBSWFRYX1JFRzk2X01VX0ZSRVEzX1NFVCh2YWwsIDB4MTApOworCQkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgcmVnLCB2YWwpOworCQl9CisKKwkJLyogU2V0IEJXIHNlbGVjdCB0YXAgWCBmb3IgcGhhc2UgYWRqdXN0IGxvb3AgKi8KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJcmVnID0gUlhUWF9SRUc5OSArIGkgKiAyOworCQkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgcmVnLCAmdmFsKTsKKwkJCXZhbCA9IFJYVFhfUkVHOTlfTVVfUEhBU0UxX1NFVCh2YWwsIDB4Nyk7CisJCQl2YWwgPSBSWFRYX1JFRzk5X01VX1BIQVNFMl9TRVQodmFsLCAweDcpOworCQkJdmFsID0gUlhUWF9SRUc5OV9NVV9QSEFTRTNfU0VUKHZhbCwgMHg3KTsKKwkJCXNlcmRlc193cihjdHgsIGxhbmUsIHJlZywgdmFsKTsKKwkJfQorCisJCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHMTAyLCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUcxMDJfRlJFUUxPT1BfTElNSVRfU0VUKHZhbCwgMHgwKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxMDIsIHZhbCk7CisKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxMTQsIDB4ZmZlMCk7CisKKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjUsICZ2YWwpOworCQl2YWwgPSBSWFRYX1JFRzEyNV9TSUdOX1BRX1NFVCh2YWwsCisJCQljdHgtPnNhdGFfcGFyYW0udHhleWVkaXJlY3Rpb25bbGFuZSAqIDMgKworCQkJY3R4LT5zYXRhX3BhcmFtLnNwZWVkW2xhbmVdXSk7CisJCXZhbCA9IFJYVFhfUkVHMTI1X1BRX1JFR19TRVQodmFsLAorCQkJY3R4LT5zYXRhX3BhcmFtLnR4ZXlldHVuaW5nW2xhbmUgKiAzICsKKwkJCWN0eC0+c2F0YV9wYXJhbS5zcGVlZFtsYW5lXV0pOworCQl2YWwgPSBSWFRYX1JFRzEyNV9QSFpfTUFOVUFMX1NFVCh2YWwsIDB4MSk7CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMTI1LCB2YWwpOworCisJCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHMTI3LCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUcxMjdfTEFUQ0hfTUFOX0NBTF9FTkFfU0VUKHZhbCwgMHgwKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjcsIHZhbCk7CisKKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjgsICZ2YWwpOworCQl2YWwgPSBSWFRYX1JFRzEyOF9MQVRDSF9DQUxfV0FJVF9TRUxfU0VUKHZhbCwgMHgzKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjgsIHZhbCk7CisKKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxNDUsICZ2YWwpOworCQl2YWwgPSBSWFRYX1JFRzE0NV9SWERGRV9DT05GSUdfU0VUKHZhbCwgMHgzKTsKKwkJdmFsID0gUlhUWF9SRUcxNDVfVFhfSURMRV9TQVRBX1NFVCh2YWwsIDB4MCk7CisJCWlmIChwcmVBM0NoaXApIHsKKwkJCXZhbCA9IFJYVFhfUkVHMTQ1X1JYRVNfRU5BX1NFVCh2YWwsIDB4MSk7CisJCQl2YWwgPSBSWFRYX1JFRzE0NV9SWFZXRVNfTEFURU5BX1NFVCh2YWwsIDB4MSk7CisJCX0gZWxzZSB7CisJCQl2YWwgPSBSWFRYX1JFRzE0NV9SWEVTX0VOQV9TRVQodmFsLCAweDApOworCQkJdmFsID0gUlhUWF9SRUcxNDVfUlhWV0VTX0xBVEVOQV9TRVQodmFsLCAweDApOworCQl9CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMTQ1LCB2YWwpOworCisJCS8qCisJCSAqIFNldCBSeCBMT1MgZmlsdGVyIGNsb2NrIHJhdGUsIHNhbXBsZSByYXRlLCBhbmQgdGhyZXNob2xkCisJCSAqIHdpbmRvd3MKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCXJlZyA9IFJYVFhfUkVHMTQ4ICsgaSAqIDI7CisJCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCByZWcsIDB4RkZGRik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfcGh5X2NhbF9yZHlfY2hrKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsCisJCQkJIGVudW0gY211X3R5cGVfdCBjbXVfdHlwZSwKKwkJCQkgZW51bSBjbGtfdHlwZV90IGNsa190eXBlKQoreworCXZvaWQgX19pb21lbSAqY3NyX3NlcmRlcyA9IGN0eC0+c2RzX2Jhc2U7CisJaW50IGxvb3A7CisJdTMyIHZhbDsKKworCS8qIFJlbGVhc2UgUEhZIG1haW4gcmVzZXQgKi8KKwl3cml0ZWwoMHhkZiwgY3NyX3NlcmRlcyArIFNBVEFfRU5FVF9TRFNfUlNUX0NUTCk7CisJcmVhZGwoY3NyX3NlcmRlcyArIFNBVEFfRU5FVF9TRFNfUlNUX0NUTCk7IC8qIEZvcmNlIGEgYmFycmllciAqLworCisJaWYgKGNtdV90eXBlICE9IFJFRl9DTVUpIHsKKwkJY211X3NldGJpdHMoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzUsIENNVV9SRUc1X1BMTF9SRVNFVEJfTUFTSyk7CisJCS8qCisJCSAqIEFzIHBlciBQSFkgZGVzaWduIHNwZWMsIHRoZSBQTEwgcmVzZXQgcmVxdWlyZXMgYSBtaW5pbXVtCisJCSAqIG9mIDgwMHVzLgorCQkgKi8KKwkJdXNsZWVwX3JhbmdlKDgwMCwgMTAwMCk7CisKKwkJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcxLCAmdmFsKTsKKwkJdmFsID0gQ01VX1JFRzFfUExMX01BTlVBTENBTF9TRVQodmFsLCAweDApOworCQljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEsIHZhbCk7CisJCS8qCisJCSAqIEFzIHBlciBQSFkgZGVzaWduIHNwZWMsIHRoZSBQTEwgYXV0byBjYWxpYnJhdGlvbiByZXF1aXJlcworCQkgKiBhIG1pbmltdW0gb2YgODAwdXMuCisJCSAqLworCQl1c2xlZXBfcmFuZ2UoODAwLCAxMDAwKTsKKworCQljbXVfdG9nZ2xlMXRvMChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMzIsCisJCQkgICAgICAgQ01VX1JFRzMyX0ZPUkNFX1ZDT0NBTF9TVEFSVF9NQVNLKTsKKwkJLyoKKwkJICogQXMgcGVyIFBIWSBkZXNpZ24gc3BlYywgdGhlIFBMTCByZXF1aXJlcyBhIG1pbmltdW0gb2YKKwkJICogODAwdXMgdG8gc2V0dGxlLgorCQkgKi8KKwkJdXNsZWVwX3JhbmdlKDgwMCwgMTAwMCk7CisJfQorCisJaWYgKCFwcmVBM0NoaXApCisJCWdvdG8gc2tpcF9tYW51YWxfY2FsOworCisJLyoKKwkgKiBDb25maWd1cmUgdGhlIHRlcm1pbmF0aW9uIHJlc2lzdGVyIGNhbGlicmF0aW9uCisJICogVGhlIHNlcmlhbCByZWNlaXZlIHBpbnMsIFJYUC9SWE4sIGhhdmUgVEVSTWluYXRpb24gcmVzaXN0b3IKKwkgKiB0aGF0IGlzIHJlcXVpcmVkIHRvIGJlIGNhbGlicmF0ZWQuCisJICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcxNywgJnZhbCk7CisJdmFsID0gQ01VX1JFRzE3X1BWVF9DT0RFX1IyQV9TRVQodmFsLCAweDEyKTsKKwl2YWwgPSBDTVVfUkVHMTdfUkVTRVJWRURfN19TRVQodmFsLCAweDApOworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTcsIHZhbCk7CisJY211X3RvZ2dsZTF0bzAoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzE3LAorCQkgICAgICAgQ01VX1JFRzE3X1BWVF9URVJNX01BTl9FTkFfTUFTSyk7CisJLyoKKwkgKiBUaGUgc2VyaWFsIHRyYW5zbWl0IHBpbnMsIFRYUC9UWE4sIGhhdmUgUHVsbC1VUCBhbmQgUHVsbC1ET1dOCisJICogcmVzaXN0b3JzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIHRoZSBjYWxpYnJhdGVkLgorCSAqIENvbmZpZ3VyZSB0aGUgcHVsbCBET1dOIGNhbGlicmF0aW9uCisJICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcxNywgJnZhbCk7CisJdmFsID0gQ01VX1JFRzE3X1BWVF9DT0RFX1IyQV9TRVQodmFsLCAweDI5KTsKKwl2YWwgPSBDTVVfUkVHMTdfUkVTRVJWRURfN19TRVQodmFsLCAweDApOworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTcsIHZhbCk7CisJY211X3RvZ2dsZTF0bzAoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzE2LAorCQkgICAgICAgQ01VX1JFRzE2X1BWVF9ETl9NQU5fRU5BX01BU0spOworCS8qIENvbmZpZ3VyZSB0aGUgcHVsbCBVUCBjYWxpYnJhdGlvbiAqLworCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTcsICZ2YWwpOworCXZhbCA9IENNVV9SRUcxN19QVlRfQ09ERV9SMkFfU0VUKHZhbCwgMHgyOCk7CisJdmFsID0gQ01VX1JFRzE3X1JFU0VSVkVEXzdfU0VUKHZhbCwgMHgwKTsKKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzE3LCB2YWwpOworCWNtdV90b2dnbGUxdG8wKGN0eCwgY211X3R5cGUsIENNVV9SRUcxNiwKKwkJICAgICAgIENNVV9SRUcxNl9QVlRfVVBfTUFOX0VOQV9NQVNLKTsKKworc2tpcF9tYW51YWxfY2FsOgorCS8qIFBvbGwgdGhlIFBMTCBjYWxpYnJhdGlvbiBjb21wbGV0aW9uIHN0YXR1cyBmb3IgYXQgbGVhc3QgMSBtcyAqLworCWxvb3AgPSAxMDA7CisJZG8geworCQljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzcsICZ2YWwpOworCQlpZiAoQ01VX1JFRzdfUExMX0NBTElCX0RPTkVfUkQodmFsKSkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBBcyBwZXIgUEhZIGRlc2lnbiBzcGVjLCBQTEwgY2FsaWJyYXRpb24gc3RhdHVzIHJlcXVpcmVzCisJCSAqIGEgbWluaW11bSBvZiAxMHVzIHRvIGJlIHVwZGF0ZWQuCisJCSAqLworCQl1c2xlZXBfcmFuZ2UoMTAsIDEwMCk7CisJfSB3aGlsZSAoLS1sb29wID4gMCk7CisKKwljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzcsICZ2YWwpOworCWRldl9kYmcoY3R4LT5kZXYsICJQTEwgY2FsaWJyYXRpb24gJXNcbiIsCisJCUNNVV9SRUc3X1BMTF9DQUxJQl9ET05FX1JEKHZhbCkgPyAiZG9uZSIgOiAiZmFpbGVkIik7CisJaWYgKENNVV9SRUc3X1ZDT19DQUxfRkFJTF9SRCh2YWwpKSB7CisJCWRldl9lcnIoY3R4LT5kZXYsCisJCQkiUExMIGNhbGlicmF0aW9uIGZhaWxlZCBkdWUgdG8gVkNPIGZhaWx1cmVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWRldl9kYmcoY3R4LT5kZXYsICJQTEwgY2FsaWJyYXRpb24gc3VjY2Vzc2Z1bFxuIik7CisKKwljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzE1LCAmdmFsKTsKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiUEhZIFR4IGlzICVzcmVhZHlcbiIsIHZhbCAmIDB4MzAwID8gIiIgOiAibm90ICIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4Z2VuZV9waHlfcGR3bl9mb3JjZV92Y28oc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwKKwkJCQkgICAgIGVudW0gY211X3R5cGVfdCBjbXVfdHlwZSwKKwkJCQkgICAgIGVudW0gY2xrX3R5cGVfdCBjbGtfdHlwZSkKK3sKKwl1MzIgdmFsOworCisJZGV2X2RiZyhjdHgtPmRldiwgIlJlc2V0IFZDTyBhbmQgcmUtc3RhcnQgYWdhaW5cbiIpOworCWlmIChjbXVfdHlwZSA9PSBQSFlfQ01VKSB7CisJCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTYsICZ2YWwpOworCQl2YWwgPSBDTVVfUkVHMTZfVkNPQ0FMX1dBSVRfQlRXX0NPREVfU0VUKHZhbCwgMHg3KTsKKwkJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUcxNiwgdmFsKTsKKwl9CisKKwljbXVfdG9nZ2xlMXRvMChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMCwgQ01VX1JFRzBfUERPV05fTUFTSyk7CisJY211X3RvZ2dsZTF0bzAoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzMyLAorCQkgICAgICAgQ01VX1JFRzMyX0ZPUkNFX1ZDT0NBTF9TVEFSVF9NQVNLKTsKK30KKworc3RhdGljIGludCB4Z2VuZV9waHlfaHdfaW5pdF9zYXRhKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsCisJCQkJICBlbnVtIGNsa190eXBlX3QgY2xrX3R5cGUsIGludCBzc2NfZW5hYmxlKQoreworCXZvaWQgX19pb21lbSAqc2RzX2Jhc2UgPSBjdHgtPnNkc19iYXNlOworCXUzMiB2YWw7CisJaW50IGk7CisKKwkvKiBDb25maWd1cmUgdGhlIFBIWSBmb3Igb3BlcmF0aW9uICovCisJZGV2X2RiZyhjdHgtPmRldiwgIlJlc2V0IFBIWVxuIik7CisJLyogUGxhY2UgUEhZIGludG8gcmVzZXQgKi8KKwl3cml0ZWwoMHgwLCBzZHNfYmFzZSArIFNBVEFfRU5FVF9TRFNfUlNUX0NUTCk7CisJdmFsID0gcmVhZGwoc2RzX2Jhc2UgKyBTQVRBX0VORVRfU0RTX1JTVF9DVEwpOwkvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwkvKiBSZWxlYXNlIFBIWSBsYW5lIGZyb20gcmVzZXQgKGFjdGl2ZSBoaWdoKSAqLworCXdyaXRlbCgweDIwLCBzZHNfYmFzZSArIFNBVEFfRU5FVF9TRFNfUlNUX0NUTCk7CisJcmVhZGwoc2RzX2Jhc2UgKyBTQVRBX0VORVRfU0RTX1JTVF9DVEwpOwkvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwkvKiBSZWxlYXNlIGFsbCBQSFkgbW9kdWxlIG91dCBvZiByZXNldCBleGNlcHQgUEhZIG1haW4gcmVzZXQgKi8KKwl3cml0ZWwoMHhkZSwgc2RzX2Jhc2UgKyBTQVRBX0VORVRfU0RTX1JTVF9DVEwpOworCXJlYWRsKHNkc19iYXNlICsgU0FUQV9FTkVUX1NEU19SU1RfQ1RMKTsJLyogRm9yY2UgYSBiYXJyaWVyICovCisKKwkvKiBTZXQgdGhlIG9wZXJhdGlvbiBzcGVlZCAqLworCXZhbCA9IHJlYWRsKHNkc19iYXNlICsgU0FUQV9FTkVUX1NEU19DVEwxKTsKKwl2YWwgPSBDRkdfSV9TUERfU0VMX0NEUl9PVlIxX1NFVCh2YWwsCisJCWN0eC0+c2F0YV9wYXJhbS50eHNwZWVkW2N0eC0+c2F0YV9wYXJhbS5zcGVlZFswXV0pOworCXdyaXRlbCh2YWwsIHNkc19iYXNlICsgU0FUQV9FTkVUX1NEU19DVEwxKTsKKworCWRldl9kYmcoY3R4LT5kZXYsICJTZXQgdGhlIGN1c3RvbWVyIHBpbiBtb2RlIHRvIFNBVEFcbiIpOworCXZhbCA9IHJlYWRsKHNkc19iYXNlICsgU0FUQV9FTkVUX1NEU19DVEwwKTsKKwl2YWwgPSBSRUdTUEVDX0NGR19JX0NVU1RPTUVSX1BJTl9NT0RFMF9TRVQodmFsLCAweDQ0MjEpOworCXdyaXRlbCh2YWwsIHNkc19iYXNlICsgU0FUQV9FTkVUX1NEU19DVEwwKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgY2xvY2sgbWFjcm8gdW5pdCAoQ01VKSBjbG9jayB0eXBlICovCisJeGdlbmVfcGh5X2NmZ19jbXVfY2xrX3R5cGUoY3R4LCBQSFlfQ01VLCBjbGtfdHlwZSk7CisKKwkvKiBDb25maWd1cmUgdGhlIGNsb2NrIG1hY3JvICovCisJeGdlbmVfcGh5X3NhdGFfY2ZnX2NtdV9jb3JlKGN0eCwgUEhZX0NNVSwgY2xrX3R5cGUpOworCisJLyogRW5hYmxlIFNTQyBpZiBlbmFibGVkICovCisJaWYgKHNzY19lbmFibGUpCisJCXhnZW5lX3BoeV9zc2NfZW5hYmxlKGN0eCwgUEhZX0NNVSk7CisKKwkvKiBDb25maWd1cmUgUEhZIGxhbmVzICovCisJeGdlbmVfcGh5X3NhdGFfY2ZnX2xhbmVzKGN0eCk7CisKKwkvKiBTZXQgUngvVHggMjAtYml0ICovCisJdmFsID0gcmVhZGwoc2RzX2Jhc2UgKyBTQVRBX0VORVRfU0RTX1BDU19DVEwwKTsKKwl2YWwgPSBSRUdTUEVDX0NGR19JX1JYX1dPUkRNT0RFMF9TRVQodmFsLCAweDMpOworCXZhbCA9IFJFR1NQRUNfQ0ZHX0lfVFhfV09SRE1PREUwX1NFVCh2YWwsIDB4Myk7CisJd3JpdGVsKHZhbCwgc2RzX2Jhc2UgKyBTQVRBX0VORVRfU0RTX1BDU19DVEwwKTsKKworCS8qIFN0YXJ0IFBMTCBjYWxpYnJhdGlvbiBhbmQgdHJ5IGZvciB0aHJlZSB0aW1lcyAqLworCWkgPSAxMDsKKwlkbyB7CisJCWlmICgheGdlbmVfcGh5X2NhbF9yZHlfY2hrKGN0eCwgUEhZX0NNVSwgY2xrX3R5cGUpKQorCQkJYnJlYWs7CisJCS8qIElmIGZhaWxlZCwgdG9nZ2xlIHRoZSBWQ08gcG93ZXIgc2lnbmFsIGFuZCBzdGFydCBhZ2FpbiAqLworCQl4Z2VuZV9waHlfcGR3bl9mb3JjZV92Y28oY3R4LCBQSFlfQ01VLCBjbGtfdHlwZSk7CisJfSB3aGlsZSAoLS1pID4gMCk7CisJLyogRXZlbiBvbiBmYWlsdXJlLCBhbGxvdyB0byBjb250aW51ZSBhbnkgd2F5ICovCisJaWYgKGkgPD0gMCkKKwkJZGV2X2VycihjdHgtPmRldiwgIlBMTCBjYWxpYnJhdGlvbiBmYWlsZWRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfcGh5X2h3X2luaXRpYWxpemUoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwKKwkJCQkgICBlbnVtIGNsa190eXBlX3QgY2xrX3R5cGUsCisJCQkJICAgaW50IHNzY19lbmFibGUpCit7CisJaW50IHJjOworCisJZGV2X2RiZyhjdHgtPmRldiwgIlBIWSBpbml0IGNsayB0eXBlICVkXG4iLCBjbGtfdHlwZSk7CisKKwlpZiAoY3R4LT5tb2RlID09IE1PREVfU0FUQSkgeworCQlyYyA9IHhnZW5lX3BoeV9od19pbml0X3NhdGEoY3R4LCBjbGtfdHlwZSwgc3NjX2VuYWJsZSk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiVW4tc3VwcG9ydGVkIGN1c3RvbWVyIHBpbiBtb2RlICVkXG4iLAorCQkJY3R4LT5tb2RlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWNlaXZlciBPZmZzZXQgQ2FsaWJyYXRpb246CisgKgorICogQ2FsaWJyYXRlIHRoZSByZWNlaXZlciBzaWduYWwgcGF0aCBvZmZzZXQgaW4gdHdvIHN0ZXBzIC0gc3VtbWFyIGFuZAorICogbGF0Y2ggY2FsaWJyYXRpb25zCisgKi8KK3N0YXRpYyB2b2lkIHhnZW5lX3BoeV9mb3JjZV9sYXRfc3VtbWVyX2NhbChzdHJ1Y3QgeGdlbmVfcGh5X2N0eCAqY3R4LCBpbnQgbGFuZSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgeworCQl1MzIgcmVnOworCQl1MzIgdmFsOworCX0gc2VyZGVzX3JlZ1tdID0geworCQl7UlhUWF9SRUczOCwgMHgwfSwKKwkJe1JYVFhfUkVHMzksIDB4ZmYwMH0sCisJCXtSWFRYX1JFRzQwLCAweGZmZmZ9LAorCQl7UlhUWF9SRUc0MSwgMHhmZmZmfSwKKwkJe1JYVFhfUkVHNDIsIDB4ZmZmZn0sCisJCXtSWFRYX1JFRzQzLCAweGZmZmZ9LAorCQl7UlhUWF9SRUc0NCwgMHhmZmZmfSwKKwkJe1JYVFhfUkVHNDUsIDB4ZmZmZn0sCisJCXtSWFRYX1JFRzQ2LCAweGZmZmZ9LAorCQl7UlhUWF9SRUc0NywgMHhmZmZjfSwKKwkJe1JYVFhfUkVHNDgsIDB4MH0sCisJCXtSWFRYX1JFRzQ5LCAweDB9LAorCQl7UlhUWF9SRUc1MCwgMHgwfSwKKwkJe1JYVFhfUkVHNTEsIDB4MH0sCisJCXtSWFRYX1JFRzUyLCAweDB9LAorCQl7UlhUWF9SRUc1MywgMHgwfSwKKwkJe1JYVFhfUkVHNTQsIDB4MH0sCisJCXtSWFRYX1JFRzU1LCAweDB9LAorCX07CisKKwkvKiBTdGFydCBTVU1NRVIgY2FsaWJyYXRpb24gKi8KKwlzZXJkZXNfc2V0Yml0cyhjdHgsIGxhbmUsIFJYVFhfUkVHMTI3LAorCQkgICAgICAgUlhUWF9SRUcxMjdfRk9SQ0VfU1VNX0NBTF9TVEFSVF9NQVNLKTsKKwkvKgorCSAqIEFzIHBlciBQSFkgZGVzaWduIHNwZWMsIHRoZSBTdW1tZXIgY2FsaWJyYXRpb24gcmVxdWlyZXMgYSBtaW5pbXVtCisJICogb2YgMTAwdXMgdG8gY29tcGxldGUuCisJICovCisJdXNsZWVwX3JhbmdlKDEwMCwgNTAwKTsKKwlzZXJkZXNfY2xyYml0cyhjdHgsIGxhbmUsIFJYVFhfUkVHMTI3LAorCQkJUlhUWF9SRUcxMjdfRk9SQ0VfU1VNX0NBTF9TVEFSVF9NQVNLKTsKKwkvKgorCSAqIEFzIHBlciBQSFkgZGVzaWduIHNwZWMsIHRoZSBhdXRvIGNhbGlicmF0aW9uIHJlcXVpcmVzIGEgbWluaW11bQorCSAqIG9mIDEwMHVzIHRvIGNvbXBsZXRlLgorCSAqLworCXVzbGVlcF9yYW5nZSgxMDAsIDUwMCk7CisKKwkvKiBTdGFydCBsYXRjaCBjYWxpYnJhdGlvbiAqLworCXNlcmRlc19zZXRiaXRzKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjcsCisJCSAgICAgICBSWFRYX1JFRzEyN19GT1JDRV9MQVRfQ0FMX1NUQVJUX01BU0spOworCS8qCisJICogQXMgcGVyIFBIWSBkZXNpZ24gc3BlYywgdGhlIGxhdGNoIGNhbGlicmF0aW9uIHJlcXVpcmVzIGEgbWluaW11bQorCSAqIG9mIDEwMHVzIHRvIGNvbXBsZXRlLgorCSAqLworCXVzbGVlcF9yYW5nZSgxMDAsIDUwMCk7CisJc2VyZGVzX2NscmJpdHMoY3R4LCBsYW5lLCBSWFRYX1JFRzEyNywKKwkJICAgICAgIFJYVFhfUkVHMTI3X0ZPUkNFX0xBVF9DQUxfU1RBUlRfTUFTSyk7CisKKwkvKiBDb25maWd1cmUgdGhlIFBIWSBsYW5lIGZvciBjYWxpYnJhdGlvbiAqLworCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMjgsIDB4Nyk7CisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUczMSwgMHg3ZTAwKTsKKwlzZXJkZXNfY2xyYml0cyhjdHgsIGxhbmUsIFJYVFhfUkVHNCwKKwkJICAgICAgIFJYVFhfUkVHNF9UWF9MT09QQkFDS19CVUZfRU5fTUFTSyk7CisJc2VyZGVzX2NscmJpdHMoY3R4LCBsYW5lLCBSWFRYX1JFRzcsCisJCSAgICAgICBSWFRYX1JFRzdfTE9PUF9CQUNLX0VOQV9DVExFX01BU0spOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNlcmRlc19yZWcpOyBpKyspCisJCXNlcmRlc193cihjdHgsIGxhbmUsIHNlcmRlc19yZWdbaV0ucmVnLAorCQkJICBzZXJkZXNfcmVnW2ldLnZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHhnZW5lX3BoeV9yZXNldF9yeGQoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwgaW50IGxhbmUpCit7CisJLyogUmVzZXQgZGlnaXRhbCBSeCAqLworCXNlcmRlc19jbHJiaXRzKGN0eCwgbGFuZSwgUlhUWF9SRUc3LCBSWFRYX1JFRzdfUkVTRVRCX1JYRF9NQVNLKTsKKwkvKiBBcyBwZXIgUEhZIGRlc2lnbiBzcGVjLCB0aGUgcmVzZXQgcmVxdWlyZXMgYSBtaW5pbXVtIG9mIDEwMHVzLiAqLworCXVzbGVlcF9yYW5nZSgxMDAsIDE1MCk7CisJc2VyZGVzX3NldGJpdHMoY3R4LCBsYW5lLCBSWFRYX1JFRzcsIFJYVFhfUkVHN19SRVNFVEJfUlhEX01BU0spOworfQorCitzdGF0aWMgaW50IHhnZW5lX3BoeV9nZXRfYXZnKGludCBhY2N1bSwgaW50IHNhbXBsZXMpCit7CisJcmV0dXJuIChhY2N1bSArIChzYW1wbGVzIC8gMikpIC8gc2FtcGxlczsKK30KKworc3RhdGljIHZvaWQgeGdlbmVfcGh5X2dlbl9hdmdfdmFsKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsIGludCBsYW5lKQoreworCWludCBtYXhfbG9vcCA9IDEwOworCWludCBhdmdfbG9vcCA9IDA7CisJaW50IGxhdF9kbyA9IDAsIGxhdF94byA9IDAsIGxhdF9lbyA9IDAsIGxhdF9zbyA9IDA7CisJaW50IGxhdF9kZSA9IDAsIGxhdF94ZSA9IDAsIGxhdF9lZSA9IDAsIGxhdF9zZSA9IDA7CisJaW50IHN1bV9jYWwgPSAwOworCWludCBsYXRfZG9faXRyLCBsYXRfeG9faXRyLCBsYXRfZW9faXRyLCBsYXRfc29faXRyOworCWludCBsYXRfZGVfaXRyLCBsYXRfeGVfaXRyLCBsYXRfZWVfaXRyLCBsYXRfc2VfaXRyOworCWludCBzdW1fY2FsX2l0cjsKKwlpbnQgZmFpbF9ldmVuOworCWludCBmYWlsX29kZDsKKwl1MzIgdmFsOworCisJZGV2X2RiZyhjdHgtPmRldiwgIkdlbmVyYXRpbmcgYXZnIGNhbGlicmF0aW9uIHZhbHVlIGZvciBsYW5lICVkXG4iLAorCQlsYW5lKTsKKworCS8qIEVuYWJsZSBSWCBIaS1aIHRlcm1pbmF0aW9uICovCisJc2VyZGVzX3NldGJpdHMoY3R4LCBsYW5lLCBSWFRYX1JFRzEyLAorCQkJUlhUWF9SRUcxMl9SWF9ERVRfVEVSTV9FTkFCTEVfTUFTSyk7CisJLyogVHVybiBvZmYgREZFICovCisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcyOCwgMHgwMDAwKTsKKwkvKiBERkUgUHJlc2V0cyB0byB6ZXJvICovCisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUczMSwgMHgwMDAwKTsKKworCS8qCisJICogUmVjZWl2ZXIgT2Zmc2V0IENhbGlicmF0aW9uOgorCSAqIENhbGlicmF0ZSB0aGUgcmVjZWl2ZXIgc2lnbmFsIHBhdGggb2Zmc2V0IGluIHR3byBzdGVwcyAtIHN1bW1hcgorCSAqIGFuZCBsYXRjaCBjYWxpYnJhdGlvbi4KKwkgKiBSdW5zIHRoZSAiUmVjZWl2ZXIgT2Zmc2V0IENhbGlicmF0aW9uIG11bHRpcGxlIHRpbWVzIHRvIGRldGVybWluZQorCSAqIHRoZSBhdmVyYWdlIHZhbHVlIHRvIHVzZS4KKwkgKi8KKwl3aGlsZSAoYXZnX2xvb3AgPCBtYXhfbG9vcCkgeworCQkvKiBTdGFydCB0aGUgY2FsaWJyYXRpb24gKi8KKwkJeGdlbmVfcGh5X2ZvcmNlX2xhdF9zdW1tZXJfY2FsKGN0eCwgbGFuZSk7CisKKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcyMSwgJnZhbCk7CisJCWxhdF9kb19pdHIgPSBSWFRYX1JFRzIxX0RPX0xBVENIX0NBTE9VVF9SRCh2YWwpOworCQlsYXRfeG9faXRyID0gUlhUWF9SRUcyMV9YT19MQVRDSF9DQUxPVVRfUkQodmFsKTsKKwkJZmFpbF9vZGQgPSBSWFRYX1JFRzIxX0xBVENIX0NBTF9GQUlMX09ERF9SRCh2YWwpOworCisJCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHMjIsICZ2YWwpOworCQlsYXRfZW9faXRyID0gUlhUWF9SRUcyMl9FT19MQVRDSF9DQUxPVVRfUkQodmFsKTsKKwkJbGF0X3NvX2l0ciA9IFJYVFhfUkVHMjJfU09fTEFUQ0hfQ0FMT1VUX1JEKHZhbCk7CisJCWZhaWxfZXZlbiA9IFJYVFhfUkVHMjJfTEFUQ0hfQ0FMX0ZBSUxfRVZFTl9SRCh2YWwpOworCisJCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHMjMsICZ2YWwpOworCQlsYXRfZGVfaXRyID0gUlhUWF9SRUcyM19ERV9MQVRDSF9DQUxPVVRfUkQodmFsKTsKKwkJbGF0X3hlX2l0ciA9IFJYVFhfUkVHMjNfWEVfTEFUQ0hfQ0FMT1VUX1JEKHZhbCk7CisKKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcyNCwgJnZhbCk7CisJCWxhdF9lZV9pdHIgPSBSWFRYX1JFRzI0X0VFX0xBVENIX0NBTE9VVF9SRCh2YWwpOworCQlsYXRfc2VfaXRyID0gUlhUWF9SRUcyNF9TRV9MQVRDSF9DQUxPVVRfUkQodmFsKTsKKworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzEyMSwgJnZhbCk7CisJCXN1bV9jYWxfaXRyID0gUlhUWF9SRUcxMjFfU1VNT1NfQ0FMX0NPREVfUkQodmFsKTsKKworCQkvKiBDaGVjayBmb3IgZmFpbHVyZS4gSWYgcGFzc2VkLCBzdW0gdGhlbSBmb3IgYXZlcmFnaW5nICovCisJCWlmICgoZmFpbF9ldmVuID09IDAgfHwgZmFpbF9ldmVuID09IDEpICYmCisJCSAgICAoZmFpbF9vZGQgPT0gMCB8fCBmYWlsX29kZCA9PSAxKSkgeworCQkJbGF0X2RvICs9IGxhdF9kb19pdHI7CisJCQlsYXRfeG8gKz0gbGF0X3hvX2l0cjsKKwkJCWxhdF9lbyArPSBsYXRfZW9faXRyOworCQkJbGF0X3NvICs9IGxhdF9zb19pdHI7CisJCQlsYXRfZGUgKz0gbGF0X2RlX2l0cjsKKwkJCWxhdF94ZSArPSBsYXRfeGVfaXRyOworCQkJbGF0X2VlICs9IGxhdF9lZV9pdHI7CisJCQlsYXRfc2UgKz0gbGF0X3NlX2l0cjsKKwkJCXN1bV9jYWwgKz0gc3VtX2NhbF9pdHI7CisKKwkJCWRldl9kYmcoY3R4LT5kZXYsICJJdGVyYXRpb24gJWQ6XG4iLCBhdmdfbG9vcCk7CisJCQlkZXZfZGJnKGN0eC0+ZGV2LCAiRE8gMHgleCBYTyAweCV4IEVPIDB4JXggU08gMHgleFxuIiwKKwkJCQlsYXRfZG9faXRyLCBsYXRfeG9faXRyLCBsYXRfZW9faXRyLAorCQkJCWxhdF9zb19pdHIpOworCQkJZGV2X2RiZyhjdHgtPmRldiwgIkRFIDB4JXggWEUgMHgleCBFRSAweCV4IFNFIDB4JXhcbiIsCisJCQkJbGF0X2RlX2l0ciwgbGF0X3hlX2l0ciwgbGF0X2VlX2l0ciwKKwkJCQlsYXRfc2VfaXRyKTsKKwkJCWRldl9kYmcoY3R4LT5kZXYsICJTVU0gMHgleFxuIiwgc3VtX2NhbF9pdHIpOworCQkJKythdmdfbG9vcDsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoY3R4LT5kZXYsCisJCQkJIlJlY2VpdmVyIGNhbGlicmF0aW9uIGZhaWxlZCBhdCAlZCBsb29wXG4iLAorCQkJCWF2Z19sb29wKTsKKwkJfQorCQl4Z2VuZV9waHlfcmVzZXRfcnhkKGN0eCwgbGFuZSk7CisJfQorCisJLyogVXBkYXRlIGxhdGNoIG1hbnVhbCBjYWxpYnJhdGlvbiB3aXRoIGF2ZXJhZ2UgdmFsdWUgKi8KKwlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzEyNywgJnZhbCk7CisJdmFsID0gUlhUWF9SRUcxMjdfRE9fTEFUQ0hfTUFOQ0FMX1NFVCh2YWwsCisJCXhnZW5lX3BoeV9nZXRfYXZnKGxhdF9kbywgbWF4X2xvb3ApKTsKKwl2YWwgPSBSWFRYX1JFRzEyN19YT19MQVRDSF9NQU5DQUxfU0VUKHZhbCwKKwkJeGdlbmVfcGh5X2dldF9hdmcobGF0X3hvLCBtYXhfbG9vcCkpOworCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMTI3LCB2YWwpOworCisJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjgsICZ2YWwpOworCXZhbCA9IFJYVFhfUkVHMTI4X0VPX0xBVENIX01BTkNBTF9TRVQodmFsLAorCQl4Z2VuZV9waHlfZ2V0X2F2ZyhsYXRfZW8sIG1heF9sb29wKSk7CisJdmFsID0gUlhUWF9SRUcxMjhfU09fTEFUQ0hfTUFOQ0FMX1NFVCh2YWwsCisJCXhnZW5lX3BoeV9nZXRfYXZnKGxhdF9zbywgbWF4X2xvb3ApKTsKKwlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzEyOCwgdmFsKTsKKworCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHMTI5LCAmdmFsKTsKKwl2YWwgPSBSWFRYX1JFRzEyOV9ERV9MQVRDSF9NQU5DQUxfU0VUKHZhbCwKKwkJeGdlbmVfcGh5X2dldF9hdmcobGF0X2RlLCBtYXhfbG9vcCkpOworCXZhbCA9IFJYVFhfUkVHMTI5X1hFX0xBVENIX01BTkNBTF9TRVQodmFsLAorCQl4Z2VuZV9waHlfZ2V0X2F2ZyhsYXRfeGUsIG1heF9sb29wKSk7CisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjksIHZhbCk7CisKKwlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzEzMCwgJnZhbCk7CisJdmFsID0gUlhUWF9SRUcxMzBfRUVfTEFUQ0hfTUFOQ0FMX1NFVCh2YWwsCisJCXhnZW5lX3BoeV9nZXRfYXZnKGxhdF9lZSwgbWF4X2xvb3ApKTsKKwl2YWwgPSBSWFRYX1JFRzEzMF9TRV9MQVRDSF9NQU5DQUxfU0VUKHZhbCwKKwkJeGdlbmVfcGh5X2dldF9hdmcobGF0X3NlLCBtYXhfbG9vcCkpOworCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMTMwLCB2YWwpOworCisJLyogVXBkYXRlIFNVTU1FUiBjYWxpYnJhdGlvbiB3aXRoIGF2ZXJhZ2UgdmFsdWUgKi8KKwlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzE0LCAmdmFsKTsKKwl2YWwgPSBSWFRYX1JFRzE0X0NMVEVfTEFUQ0FMX01BTl9QUk9HX1NFVCh2YWwsCisJCXhnZW5lX3BoeV9nZXRfYXZnKHN1bV9jYWwsIG1heF9sb29wKSk7CisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxNCwgdmFsKTsKKworCWRldl9kYmcoY3R4LT5kZXYsICJBdmVyYWdlIFZhbHVlOlxuIik7CisJZGV2X2RiZyhjdHgtPmRldiwgIkRPIDB4JXggWE8gMHgleCBFTyAweCV4IFNPIDB4JXhcbiIsCisJCSB4Z2VuZV9waHlfZ2V0X2F2ZyhsYXRfZG8sIG1heF9sb29wKSwKKwkJIHhnZW5lX3BoeV9nZXRfYXZnKGxhdF94bywgbWF4X2xvb3ApLAorCQkgeGdlbmVfcGh5X2dldF9hdmcobGF0X2VvLCBtYXhfbG9vcCksCisJCSB4Z2VuZV9waHlfZ2V0X2F2ZyhsYXRfc28sIG1heF9sb29wKSk7CisJZGV2X2RiZyhjdHgtPmRldiwgIkRFIDB4JXggWEUgMHgleCBFRSAweCV4IFNFIDB4JXhcbiIsCisJCSB4Z2VuZV9waHlfZ2V0X2F2ZyhsYXRfZGUsIG1heF9sb29wKSwKKwkJIHhnZW5lX3BoeV9nZXRfYXZnKGxhdF94ZSwgbWF4X2xvb3ApLAorCQkgeGdlbmVfcGh5X2dldF9hdmcobGF0X2VlLCBtYXhfbG9vcCksCisJCSB4Z2VuZV9waHlfZ2V0X2F2ZyhsYXRfc2UsIG1heF9sb29wKSk7CisJZGV2X2RiZyhjdHgtPmRldiwgIlNVTSAweCV4XG4iLAorCQl4Z2VuZV9waHlfZ2V0X2F2ZyhzdW1fY2FsLCBtYXhfbG9vcCkpOworCisJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxNCwgJnZhbCk7CisJdmFsID0gUlhUWF9SRUcxNF9DVExFX0xBVENBTF9NQU5fRU5BX1NFVCh2YWwsIDB4MSk7CisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxNCwgdmFsKTsKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiRW5hYmxlIE1hbnVhbCBTdW1tZXIgY2FsaWJyYXRpb25cbiIpOworCisJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjcsICZ2YWwpOworCXZhbCA9IFJYVFhfUkVHMTI3X0xBVENIX01BTl9DQUxfRU5BX1NFVCh2YWwsIDB4MSk7CisJZGV2X2RiZyhjdHgtPmRldiwgIkVuYWJsZSBNYW51YWwgTGF0Y2ggY2FsaWJyYXRpb25cbiIpOworCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMTI3LCB2YWwpOworCisJLyogRGlzYWJsZSBSWCBIaS1aIHRlcm1pbmF0aW9uICovCisJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxMiwgJnZhbCk7CisJdmFsID0gUlhUWF9SRUcxMl9SWF9ERVRfVEVSTV9FTkFCTEVfU0VUKHZhbCwgMCk7CisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxMiwgdmFsKTsKKwkvKiBUdXJuIG9uIERGRSAqLworCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMjgsIDB4MDAwNyk7CisJLyogU2V0IERGRSBwcmVzZXQgKi8KKwlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzMxLCAweDdlMDApOworfQorCitzdGF0aWMgaW50IHhnZW5lX3BoeV9od19pbml0KHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3QgeGdlbmVfcGh5X2N0eCAqY3R4ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisJaW50IHJjOworCWludCBpOworCisJcmMgPSB4Z2VuZV9waHlfaHdfaW5pdGlhbGl6ZShjdHgsIENMS19FWFRfRElGRiwgU1NDX0RJU0FCTEUpOworCWlmIChyYykgeworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiUEhZIGluaXRpYWxpemUgZmFpbGVkICVkXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBTZXR1cCBjbG9jayBwcm9wZXJseSBhZnRlciBQSFkgY29uZmlndXJhdGlvbiAqLworCWlmICghSVNfRVJSKGN0eC0+Y2xrKSkgeworCQkvKiBIVyByZXF1aXJlcyBhbiB0b2dnbGUgb2YgdGhlIGNsb2NrICovCisJCWNsa19wcmVwYXJlX2VuYWJsZShjdHgtPmNsayk7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShjdHgtPmNsayk7CisJCWNsa19wcmVwYXJlX2VuYWJsZShjdHgtPmNsayk7CisJfQorCisJLyogQ29tcHV0ZSBhdmVyYWdlIHZhbHVlICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9MQU5FOyBpKyspCisJCXhnZW5lX3BoeV9nZW5fYXZnX3ZhbChjdHgsIGkpOworCisJZGV2X2RiZyhjdHgtPmRldiwgIlBIWSBpbml0aWFsaXplZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGh5X29wcyB4Z2VuZV9waHlfb3BzID0geworCS5pbml0CQk9IHhnZW5lX3BoeV9od19pbml0LAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5ICp4Z2VuZV9waHlfeGxhdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmFyZ3MpCit7CisJc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGFyZ3MtPmFyZ3NfY291bnQgPD0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKGFyZ3MtPmFyZ3NbMF0gPCBNT0RFX1NBVEEgfHwgYXJncy0+YXJnc1swXSA+PSBNT0RFX01BWCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwljdHgtPm1vZGUgPSBhcmdzLT5hcmdzWzBdOworCXJldHVybiBjdHgtPnBoeTsKK30KKworc3RhdGljIHZvaWQgeGdlbmVfcGh5X2dldF9wYXJhbShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCWNvbnN0IGNoYXIgKm5hbWUsIHUzMiAqYnVmZmVyLAorCQkJCWludCBjb3VudCwgdTMyICpkZWZhdWx0X3ZhbCwKKwkJCQl1MzIgY29udl9mYWN0b3IpCit7CisJaW50IGk7CisKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KHBkZXYtPmRldi5vZl9ub2RlLCBuYW1lLCBidWZmZXIsCisJCQkJCWNvdW50KSkgeworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJCWJ1ZmZlcltpXSAvPSBjb252X2ZhY3RvcjsKKwkJcmV0dXJuOworCX0KKwkvKiBEb2VzIG5vdCBleGlzdCwgbG9hZCBkZWZhdWx0ICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCWJ1ZmZlcltpXSA9IGRlZmF1bHRfdmFsW2kgJSAzXTsKK30KKworc3RhdGljIGludCB4Z2VuZV9waHlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcGh5X3Byb3ZpZGVyICpwaHlfcHJvdmlkZXI7CisJc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmMgPSAwOworCXUzMiBkZWZhdWx0X3NwZFtdID0gREVGQVVMVF9TQVRBX1NQRF9TRUw7CisJdTMyIGRlZmF1bHRfdHhib29zdF9nYWluW10gPSBERUZBVUxUX1NBVEFfVFhCT09TVF9HQUlOOworCXUzMiBkZWZhdWx0X3R4ZXllX2RpcmVjdGlvbltdID0gREVGQVVMVF9TQVRBX1RYRVlFRElSRUNUSU9OOworCXUzMiBkZWZhdWx0X3R4ZXllX3R1bmluZ1tdID0gREVGQVVMVF9TQVRBX1RYRVlFVFVOSU5HOworCXUzMiBkZWZhdWx0X3R4YW1wW10gPSBERUZBVUxUX1NBVEFfVFhBTVA7CisJdTMyIGRlZmF1bHRfdHhjbjFbXSA9IERFRkFVTFRfU0FUQV9UWENOMTsKKwl1MzIgZGVmYXVsdF90eGNuMltdID0gREVGQVVMVF9TQVRBX1RYQ04yOworCXUzMiBkZWZhdWx0X3R4Y3AxW10gPSBERUZBVUxUX1NBVEFfVFhDUDE7CisJaW50IGk7CisKKwljdHggPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljdHgtPmRldiA9ICZwZGV2LT5kZXY7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWN0eC0+c2RzX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGN0eC0+c2RzX2Jhc2UpKSB7CisJCXJjID0gUFRSX0VSUihjdHgtPnNkc19iYXNlKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBSZXRyaWV2ZSBvcHRpb25hbCBjbG9jayAqLworCWN0eC0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKKworCS8qIExvYWQgb3ZlcnJpZGUgcGFyYW1hdGVycyAqLworCXhnZW5lX3BoeV9nZXRfcGFyYW0ocGRldiwgImFwbSx0eC1leWUtdHVuaW5nIiwKKwkJY3R4LT5zYXRhX3BhcmFtLnR4ZXlldHVuaW5nLCA2LCBkZWZhdWx0X3R4ZXllX3R1bmluZywgMSk7CisJeGdlbmVfcGh5X2dldF9wYXJhbShwZGV2LCAiYXBtLHR4LWV5ZS1kaXJlY3Rpb24iLAorCQljdHgtPnNhdGFfcGFyYW0udHhleWVkaXJlY3Rpb24sIDYsIGRlZmF1bHRfdHhleWVfZGlyZWN0aW9uLCAxKTsKKwl4Z2VuZV9waHlfZ2V0X3BhcmFtKHBkZXYsICJhcG0sdHgtYm9vc3QtZ2FpbiIsCisJCWN0eC0+c2F0YV9wYXJhbS50eGJvb3N0Z2FpbiwgNiwgZGVmYXVsdF90eGJvb3N0X2dhaW4sIDEpOworCXhnZW5lX3BoeV9nZXRfcGFyYW0ocGRldiwgImFwbSx0eC1hbXBsaXR1ZGUiLAorCQljdHgtPnNhdGFfcGFyYW0udHhhbXBsaXR1ZGUsIDYsIGRlZmF1bHRfdHhhbXAsIDEzMzAwKTsKKwl4Z2VuZV9waHlfZ2V0X3BhcmFtKHBkZXYsICJhcG0sdHgtcHJlLWN1cnNvcjEiLAorCQljdHgtPnNhdGFfcGFyYW0udHhwcmVjdXJzb3JfY24xLCA2LCBkZWZhdWx0X3R4Y24xLCAxODIwMCk7CisJeGdlbmVfcGh5X2dldF9wYXJhbShwZGV2LCAiYXBtLHR4LXByZS1jdXJzb3IyIiwKKwkJY3R4LT5zYXRhX3BhcmFtLnR4cHJlY3Vyc29yX2NuMiwgNiwgZGVmYXVsdF90eGNuMiwgMTgyMDApOworCXhnZW5lX3BoeV9nZXRfcGFyYW0ocGRldiwgImFwbSx0eC1wb3N0LWN1cnNvciIsCisJCWN0eC0+c2F0YV9wYXJhbS50eHBvc3RjdXJzb3JfY3AxLCA2LCBkZWZhdWx0X3R4Y3AxLCAxODIwMCk7CisJeGdlbmVfcGh5X2dldF9wYXJhbShwZGV2LCAiYXBtLHR4LXNwZWVkIiwKKwkJY3R4LT5zYXRhX3BhcmFtLnR4c3BlZWQsIDMsIGRlZmF1bHRfc3BkLCAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xBTkU7IGkrKykKKwkJY3R4LT5zYXRhX3BhcmFtLnNwZWVkW2ldID0gMjsgLyogRGVmYXVsdCB0byBHZW4zICovCisKKwljdHgtPmRldiA9ICZwZGV2LT5kZXY7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY3R4KTsKKworCWN0eC0+cGh5ID0gZGV2bV9waHlfY3JlYXRlKGN0eC0+ZGV2LCAmeGdlbmVfcGh5X29wcywgTlVMTCk7CisJaWYgKElTX0VSUihjdHgtPnBoeSkpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBQSFlcbiIpOworCQlyYyA9IFBUUl9FUlIoY3R4LT5waHkpOworCQlnb3RvIGVycm9yOworCX0KKwlwaHlfc2V0X2RydmRhdGEoY3R4LT5waHksIGN0eCk7CisKKwlwaHlfcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcihjdHgtPmRldiwKKwkJCQkJCSAgICAgeGdlbmVfcGh5X3hsYXRlKTsKKwlpZiAoSVNfRVJSKHBoeV9wcm92aWRlcikpIHsKKwkJcmMgPSBQVFJfRVJSKHBoeV9wcm92aWRlcik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgeGdlbmVfcGh5X29mX21hdGNoW10gPSB7CisJey5jb21wYXRpYmxlID0gImFwbSx4Z2VuZS1waHkiLH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgeGdlbmVfcGh5X29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgeGdlbmVfcGh5X2RyaXZlciA9IHsKKwkucHJvYmUgPSB4Z2VuZV9waHlfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAieGdlbmUtcGh5IiwKKwkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJCSAgIC5vZl9tYXRjaF90YWJsZSA9IHhnZW5lX3BoeV9vZl9tYXRjaCwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoeGdlbmVfcGh5X2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVBNIFgtR2VuZSBNdWx0aS1QdXJwb3NlIFBIWSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkxvYyBIbyA8bGhvQGFwbS5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfVkVSU0lPTigiMC4xIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvS2NvbmZpZyBiL2RyaXZlcnMvcGluY3RybC9LY29uZmlnCmluZGV4IDFlNGU2OTMuLjA2Y2VlMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGluY3RybC9LY29uZmlnCkBAIC0yMjQsNyArMjI0LDcgQEAKIAogY29uZmlnIFBJTkNUUkxfTVNNOFg3NAogCXRyaXN0YXRlICJRdWFsY29tbSA4eDc0IHBpbiBjb250cm9sbGVyIGRyaXZlciIKLQlkZXBlbmRzIG9uIEdQSU9MSUIgJiYgT0YgJiYgT0ZfSVJRCisJZGVwZW5kcyBvbiBHUElPTElCICYmIE9GCiAJc2VsZWN0IFBJTkNUUkxfTVNNCiAJaGVscAogCSAgVGhpcyBpcyB0aGUgcGluY3RybCwgcGlubXV4LCBwaW5jb25mIGFuZCBncGlvbGliIGRyaXZlciBmb3IgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvZGV2aWNldHJlZS5jIGIvZHJpdmVycy9waW5jdHJsL2RldmljZXRyZWUuYwppbmRleCAzNDBmYjRlLi5lZGExM2RlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvZGV2aWNldHJlZS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9kZXZpY2V0cmVlLmMKQEAgLTE4Niw3ICsxODYsOSBAQAogCiAJLyogQ09ORklHX09GIGVuYWJsZWQsIHAtPmRldiBub3QgaW5zdGFudGlhdGVkIGZyb20gRFQgKi8KIAlpZiAoIW5wKSB7Ci0JCWRldl9kYmcocC0+ZGV2LCAibm8gb2Zfbm9kZTsgbm90IHBhcnNpbmcgcGluY3RybCBEVFxuIik7CisJCWlmIChvZl9oYXZlX3BvcHVsYXRlZF9kdCgpKQorCQkJZGV2X2RiZyhwLT5kZXYsCisJCQkJIm5vIG9mX25vZGU7IG5vdCBwYXJzaW5nIHBpbmN0cmwgRFRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9LY29uZmlnIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L0tjb25maWcKaW5kZXggMzY2ZmE1NC4uY2MyOThmYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9LY29uZmlnCkBAIC04LDYgKzgsNyBAQAogY29uZmlnIFBJTkNUUkxfRE9WRQogCWJvb2wKIAlzZWxlY3QgUElOQ1RSTF9NVkVCVQorCXNlbGVjdCBNRkRfU1lTQ09OCiAKIGNvbmZpZyBQSU5DVFJMX0tJUktXT09ECiAJYm9vbApAQCAtMTcsNiArMTgsMTQgQEAKIAlib29sCiAJc2VsZWN0IFBJTkNUUkxfTVZFQlUKIAorY29uZmlnIFBJTkNUUkxfQVJNQURBXzM3NQorCWJvb2wKKwlzZWxlY3QgUElOQ1RSTF9NVkVCVQorCitjb25maWcgUElOQ1RSTF9BUk1BREFfMzhYCisJYm9vbAorCXNlbGVjdCBQSU5DVFJMX01WRUJVCisKIGNvbmZpZyBQSU5DVFJMX0FSTUFEQV9YUAogCWJvb2wKIAlzZWxlY3QgUElOQ1RSTF9NVkVCVQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L01ha2VmaWxlIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L01ha2VmaWxlCmluZGV4IDM3YzI1MzIuLmJjMWI5ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvTWFrZWZpbGUKQEAgLTIsNCArMiw2IEBACiBvYmotJChDT05GSUdfUElOQ1RSTF9ET1ZFKQkrPSBwaW5jdHJsLWRvdmUubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfS0lSS1dPT0QpCSs9IHBpbmN0cmwta2lya3dvb2Qubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfQVJNQURBXzM3MCkgKz0gcGluY3RybC1hcm1hZGEtMzcwLm8KK29iai0kKENPTkZJR19QSU5DVFJMX0FSTUFEQV8zNzUpICs9IHBpbmN0cmwtYXJtYWRhLTM3NS5vCitvYmotJChDT05GSUdfUElOQ1RSTF9BUk1BREFfMzhYKSArPSBwaW5jdHJsLWFybWFkYS0zOHgubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfQVJNQURBX1hQKSAgKz0gcGluY3RybC1hcm1hZGEteHAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtYXJtYWRhLTM3MC5jIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtYXJtYWRhLTM3MC5jCmluZGV4IGFlMWY3NjAuLjY3MGU1YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS0zNzAuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1hcm1hZGEtMzcwLmMKQEAgLTIzLDYgKzIzLDE4IEBACiAKICNpbmNsdWRlICJwaW5jdHJsLW12ZWJ1LmgiCiAKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm1wcF9iYXNlOworCitzdGF0aWMgaW50IGFybWFkYV8zNzBfbXBwX2N0cmxfZ2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQoreworCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX2dldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOworfQorCitzdGF0aWMgaW50IGFybWFkYV8zNzBfbXBwX2N0cmxfc2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyBjb25maWcpCit7CisJcmV0dXJuIGRlZmF1bHRfbXBwX2N0cmxfc2V0KG1wcF9iYXNlLCBwaWQsIGNvbmZpZyk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgbXZlYnVfbXBwX21vZGUgbXY4OGY2NzEwX21wcF9tb2Rlc1tdID0gewogCU1QUF9NT0RFKDAsCiAJICAgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKQEAgLTM3Myw3ICszODUsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBtdmVidV9tcHBfY3RybCBtdjg4ZjY3MTBfbXBwX2NvbnRyb2xzW10gPSB7Ci0JTVBQX1JFR19DVFJMKDAsIDY1KSwKKwlNUFBfRlVOQ19DVFJMKDAsIDY1LCBOVUxMLCBhcm1hZGFfMzcwX21wcF9jdHJsKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlIG12ODhmNjcxMF9tcHBfZ3Bpb19yYW5nZXNbXSA9IHsKQEAgLTM4NSw2ICszOTcsMTIgQEAKIHN0YXRpYyBpbnQgYXJtYWRhXzM3MF9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG12ZWJ1X3BpbmN0cmxfc29jX2luZm8gKnNvYyA9ICZhcm1hZGFfMzcwX3BpbmN0cmxfaW5mbzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJbXBwX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKG1wcF9iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIobXBwX2Jhc2UpOwogCiAJc29jLT52YXJpYW50ID0gMDsgLyogbm8gdmFyaWFudHMgZm9yIEFybWFkYSAzNzAgKi8KIAlzb2MtPmNvbnRyb2xzID0gbXY4OGY2NzEwX21wcF9jb250cm9sczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS0zNzUuYyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS0zNzUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjA3OGZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtYXJtYWRhLTM3NS5jCkBAIC0wLDAgKzEsNDU5IEBACisvKgorICogTWFydmVsbCBBcm1hZGEgMzc1IHBpbmN0cmwgZHJpdmVyIGJhc2VkIG9uIG12ZWJ1IHBpbmN0cmwgY29yZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBNYXJ2ZWxsCisgKgorICogVGhvbWFzIFBldGF6em9uaSA8dGhvbWFzLnBldGF6em9uaUBmcmVlLWVsZWN0cm9ucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmN0cmwuaD4KKworI2luY2x1ZGUgInBpbmN0cmwtbXZlYnUuaCIKKworc3RhdGljIHZvaWQgX19pb21lbSAqbXBwX2Jhc2U7CisKK3N0YXRpYyBpbnQgYXJtYWRhXzM3NV9tcHBfY3RybF9nZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nICpjb25maWcpCit7CisJcmV0dXJuIGRlZmF1bHRfbXBwX2N0cmxfZ2V0KG1wcF9iYXNlLCBwaWQsIGNvbmZpZyk7Cit9CisKK3N0YXRpYyBpbnQgYXJtYWRhXzM3NV9tcHBfY3RybF9zZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nIGNvbmZpZykKK3sKKwlyZXR1cm4gZGVmYXVsdF9tcHBfY3RybF9zZXQobXBwX2Jhc2UsIHBpZCwgY29uZmlnKTsKK30KKworc3RhdGljIHN0cnVjdCBtdmVidV9tcHBfbW9kZSBtdjg4ZjY3MjBfbXBwX21vZGVzW10gPSB7CisJTVBQX01PREUoMCwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAiZGV2IiwgImFkMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInNwaTAiLCAiY3MxIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic3BpMSIsICJjczEiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJuYW5kIiwgImlvMiIpKSwKKwlNUFBfTU9ERSgxLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJkZXYiLCAiYWQzIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAic3BpMCIsICJtb3NpIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic3BpMSIsICJtb3NpIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibmFuZCIsICJpbzMiKSksCisJTVBQX01PREUoMiwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAiZGV2IiwgImFkNCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInB0cCIsICJldmVudHJlcSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgImxlZCIsICJjMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImF1ZGlvIiwgInNkaSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgIm5hbmQiLCAiaW80IiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAic3BpMSIsICJtb3NpIikpLAorCU1QUF9NT0RFKDMsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImRldiIsICJhZDUiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJwdHAiLCAidHJpZ2dlbiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgImxlZCIsICJwMyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImF1ZGlvIiwgIm1jbGsiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJuYW5kIiwgImlvNSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgInNwaTEiLCAibWlzbyIpKSwKKwlNUFBfTU9ERSg0LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJkZXYiLCAiYWQ2IiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAic3BpMCIsICJtaXNvIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic3BpMSIsICJtaXNvIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibmFuZCIsICJpbzYiKSksCisJTVBQX01PREUoNSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAiZGV2IiwgImFkNyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInNwaTAiLCAiY3MyIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic3BpMSIsICJjczIiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJuYW5kIiwgImlvNyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgInNwaTEiLCAibWlzbyIpKSwKKwlNUFBfTU9ERSg2LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJkZXYiLCAiYWQwIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAibGVkIiwgInAxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAiYXVkaW8iLCAicmNsayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgIm5hbmQiLCAiaW8wIikpLAorCU1QUF9NT0RFKDcsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImRldiIsICJhZDEiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJwdHAiLCAiY2xrIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAibGVkIiwgInAyIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAiYXVkaW8iLCAiZXh0Y2xrIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibmFuZCIsICJpbzEiKSksCisJTVBQX01PREUoOCwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAiZGV2ICIsICJib290Y3MiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJzcGkwIiwgImNzMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNwaTEiLCAiY3MwIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibmFuZCIsICJjZSIpKSwKKwlNUFBfTU9ERSg5LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJuZiIsICJ3ZW4iKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJzcGkwIiwgInNjayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNwaTEiLCAic2NrIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibmFuZCIsICJ3ZSIpKSwKKwlNUFBfTU9ERSgxMCwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAibmYiLCAicmVuIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZHJhbSIsICJ2dHRjdHJsIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAibGVkIiwgImMxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibmFuZCIsICJyZSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgInNwaTEiLCAic2NrIikpLAorCU1QUF9NT0RFKDExLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJkZXYiLCAiYTAiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJsZWQiLCAiYzIiKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJhdWRpbyIsICJzZG8iKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJuYW5kIiwgImNsZSIpKSwKKwlNUFBfTU9ERSgxMiwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAiZGV2IiwgImExIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAiYXVkaW8iLCAiYmNsayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgIm5hbmQiLCAiYWxlIikpLAorCU1QUF9NT0RFKDEzLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJkZXYiLCAicmVhZHluIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAicGNpZTAiLCAicnN0b3V0biIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInBjaWUxIiwgInJzdG91dG4iKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJuYW5kIiwgInJiIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAic3BpMSIsICJtb3NpIikpLAorCU1QUF9NT0RFKDE0LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJpMmMwIiwgInNkYSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInVhcnQxIiwgInR4ZCIpKSwKKwlNUFBfTU9ERSgxNSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiaTJjMCIsICJzY2siKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJ1YXJ0MSIsICJyeGQiKSksCisJTVBQX01PREUoMTYsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInVhcnQwIiwgInR4ZCIpKSwKKwlNUFBfTU9ERSgxNywKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAidWFydDAiLCAicnhkIikpLAorCU1QUF9NT0RFKDE4LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJ0ZG0iLCAiaW50biIpKSwKKwlNUFBfTU9ERSgxOSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAidGRtIiwgInJzdG4iKSksCisJTVBQX01PREUoMjAsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInRkbSIsICJwY2xrIikpLAorCU1QUF9NT0RFKDIxLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJ0ZG0iLCAiZnN5bmMiKSksCisJTVBQX01PREUoMjIsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInRkbSIsICJkcngiKSksCisJTVBQX01PREUoMjMsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInRkbSIsICJkdHgiKSksCisJTVBQX01PREUoMjQsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImxlZCIsICJwMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMSIsICJyeGQwIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic2QiLCAiY21kIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAidWFydDAiLCAicnRzIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAic3BpMCIsICJjczAiKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJkZXYiLCAiY3MxIikpLAorCU1QUF9NT0RFKDI1LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJsZWQiLCAicDIiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTEiLCAicnhkMSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNkIiwgImQwIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAidWFydDAiLCAiY3RzIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAic3BpMCIsICJtb3NpIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImNzMiIpKSwKKwlNUFBfTU9ERSgyNiwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAicGNpZTAiLCAiY2xrcmVxIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UxIiwgInJ4ZDIiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJzZCIsICJkMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgInVhcnQxIiwgInJ0cyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgInNwaTAiLCAiY3MxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAibGVkIiwgImMxIikpLAorCU1QUF9NT0RFKDI3LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJwY2llMSIsICJjbGtyZXEiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTEiLCAicnhkMyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNkIiwgImQxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAidWFydDEiLCAiY3RzIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAic3BpMCIsICJtaXNvIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAibGVkIiwgImMyIikpLAorCU1QUF9NT0RFKDI4LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJsZWQiLCAicDMiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTEiLCAidHhjdGwiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJzZCIsICJjbGsiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJkcmFtIiwgInZ0dGN0cmwiKSksCisJTVBQX01PREUoMjksCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgInBjaWUxIiwgImNsa3JlcSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMSIsICJyeGNsayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNkIiwgImQzIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAic3BpMCIsICJzY2siKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJwY2llMCIsICJyc3RvdXRuIikpLAorCU1QUF9NT0RFKDMwLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTEiLCAidHhkMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNwaTEiLCAiY3MwIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibGVkIiwgInAzIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAicHRwIiwgImV2ZW50cmVxIikpLAorCU1QUF9NT0RFKDMxLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTEiLCAidHhkMSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNwaTEiLCAibW9zaSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgImxlZCIsICJwMCIpKSwKKwlNUFBfTU9ERSgzMiwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UxIiwgInR4ZDIiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJzcGkxIiwgInNjayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgInB0cCIsICJ0cmlnZ2VuIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibGVkIiwgImMwIikpLAorCU1QUF9NT0RFKDMzLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTEiLCAidHhkMyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNwaTEiLCAibWlzbyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgImxlZCIsICJwMiIpKSwKKwlNUFBfTU9ERSgzNCwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UxIiwgInR4Y2xrb3V0IiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic3BpMSIsICJzY2siKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJsZWQiLCAiYzEiKSksCisJTVBQX01PREUoMzUsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMSIsICJyeGN0bCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNwaTEiLCAiY3MxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAic3BpMCIsICJjczIiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJsZWQiLCAicDEiKSksCisJTVBQX01PREUoMzYsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgInBjaWUwIiwgImNsa3JlcSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgImxlZCIsICJjMiIpKSwKKwlNUFBfTU9ERSgzNywKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAicGNpZTAiLCAiY2xrcmVxIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAidGRtIiwgImludG4iKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJnZSIsICJtZGMiKSksCisJTVBQX01PREUoMzgsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgInBjaWUxIiwgImNsa3JlcSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImdlIiwgIm1kaW8iKSksCisJTVBQX01PREUoMzksCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgInJlZiIsICJjbGtvdXQiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJsZWQiLCAicDMiKSksCisJTVBQX01PREUoNDAsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgInVhcnQxIiwgInR4ZCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgImxlZCIsICJwMCIpKSwKKwlNUFBfTU9ERSg0MSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAidWFydDEiLCAicnhkIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibGVkIiwgInAxIikpLAorCU1QUF9NT0RFKDQyLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJzcGkxIiwgImNzMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImxlZCIsICJjMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgInB0cCIsICJjbGsiKSksCisJTVBQX01PREUoNDMsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInNhdGEwIiwgInByc250IiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAiZHJhbSIsICJ2dHRjdHJsIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibGVkIiwgImMxIikpLAorCU1QUF9NT0RFKDQ0LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJzYXRhMCIsICJwcnNudCIpKSwKKwlNUFBfTU9ERSg0NSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAic3BpMCIsICJjczIiKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJwY2llMCIsICJyc3RvdXRuIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibGVkIiwgImMyIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAic3BpMSIsICJjczIiKSksCisJTVBQX01PREUoNDYsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImxlZCIsICJwMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMCIsICJ0eGQwIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAiZ2UxIiwgInR4ZDAiKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJkZXYiLCAid2VuMSIpKSwKKwlNUFBfTU9ERSg0NywKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAibGVkIiwgInAxIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UwIiwgInR4ZDEiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJnZTEiLCAidHhkMSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgInB0cCIsICJ0cmlnZ2VuIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImFsZTAiKSksCisJTVBQX01PREUoNDgsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImxlZCIsICJwMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMCIsICJ0eGQyIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAiZ2UxIiwgInR4ZDIiKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJkZXYiLCAiYWxlMSIpKSwKKwlNUFBfTU9ERSg0OSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAibGVkIiwgInAzIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UwIiwgInR4ZDMiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJnZTEiLCAidHhkMyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJhMiIpKSwKKwlNUFBfTU9ERSg1MCwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAibGVkIiwgImMwIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UwIiwgInJ4ZDAiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJnZTEiLCAicnhkMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgInB0cCIsICJldmVudHJlcSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJhZDEyIikpLAorCU1QUF9NT0RFKDUxLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJsZWQiLCAiYzEiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTAiLCAicnhkMSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgImdlMSIsICJyeGQxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImFkOCIpKSwKKwlNUFBfTU9ERSg1MiwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAibGVkIiwgImMyIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UwIiwgInJ4ZDIiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJnZTEiLCAicnhkMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgImkyYzAiLCAic2RhIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImFkOSIpKSwKKwlNUFBfTU9ERSg1MywKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAicGNpZTEiLCAicnN0b3V0biIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMCIsICJyeGQzIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAiZ2UxIiwgInJ4ZDMiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJpMmMwIiwgInNjayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJhZDEwIikpLAorCU1QUF9NT0RFKDU0LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJwY2llMCIsICJyc3RvdXRuIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UwIiwgInJ4Y3RsIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAiZ2UxIiwgInJ4Y3RsIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImFkMTEiKSksCisJTVBQX01PREUoNTUsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMCIsICJyeGNsayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgImdlMSIsICJyeGNsayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJjczAiKSksCisJTVBQX01PREUoNTYsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMCIsICJ0eGNsa291dCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgImdlMSIsICJ0eGNsa291dCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJvZSIpKSwKKwlNUFBfTU9ERSg1NywKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UwIiwgInR4Y3RsIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAiZ2UxIiwgInR4Y3RsIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgIndlbjAiKSksCisJTVBQX01PREUoNTgsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImxlZCIsICJjMCIpKSwKKwlNUFBfTU9ERSg1OSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAibGVkIiwgImMxIikpLAorCU1QUF9NT0RFKDYwLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJ1YXJ0MSIsICJ0eGQiKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJsZWQiLCAiYzIiKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJkZXYiLCAiYWQxMyIpKSwKKwlNUFBfTU9ERSg2MSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAiaTJjMSIsICJzZGEiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJ1YXJ0MSIsICJyeGQiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJzcGkxIiwgImNzMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImxlZCIsICJwMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJhZDE0IikpLAorCU1QUF9NT0RFKDYyLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJpMmMxIiwgInNjayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImxlZCIsICJwMSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJhZDE1IikpLAorCU1QUF9NT0RFKDYzLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJwdHAiLCAidHJpZ2dlbiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImxlZCIsICJwMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJidXJzdCIpKSwKKwlNUFBfTU9ERSg2NCwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZHJhbSIsICJ2dHRjdHJsIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAibGVkIiwgInAzIikpLAorCU1QUF9NT0RFKDY1LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJzYXRhMSIsICJwcnNudCIpKSwKKwlNUFBfTU9ERSg2NiwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAicHRwIiwgImV2ZW50cmVxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAic3BpMSIsICJjczMiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJwY2llMCIsICJyc3RvdXRuIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImNzMyIpKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXZlYnVfcGluY3RybF9zb2NfaW5mbyBhcm1hZGFfMzc1X3BpbmN0cmxfaW5mbzsKKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgYXJtYWRhXzM3NV9waW5jdHJsX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLG12ODhmNjcyMC1waW5jdHJsIiB9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgbXY4OGY2NzIwX21wcF9jb250cm9sc1tdID0geworCU1QUF9GVU5DX0NUUkwoMCwgNjksIE5VTEwsIGFybWFkYV8zNzVfbXBwX2N0cmwpLAorfTsKKworc3RhdGljIHN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgbXY4OGY2NzIwX21wcF9ncGlvX3Jhbmdlc1tdID0geworCU1QUF9HUElPX1JBTkdFKDAsICAgMCwgIDAsIDMyKSwKKwlNUFBfR1BJT19SQU5HRSgxLCAgMzIsIDMyLCAzMiksCisJTVBQX0dQSU9fUkFOR0UoMiwgIDY0LCA2NCwgIDMpLAorfTsKKworc3RhdGljIGludCBhcm1hZGFfMzc1X3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbXZlYnVfcGluY3RybF9zb2NfaW5mbyAqc29jID0gJmFybWFkYV8zNzVfcGluY3RybF9pbmZvOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwltcHBfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIobXBwX2Jhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihtcHBfYmFzZSk7CisKKwlzb2MtPnZhcmlhbnQgPSAwOyAvKiBubyB2YXJpYW50cyBmb3IgQXJtYWRhIDM3NSAqLworCXNvYy0+Y29udHJvbHMgPSBtdjg4ZjY3MjBfbXBwX2NvbnRyb2xzOworCXNvYy0+bmNvbnRyb2xzID0gQVJSQVlfU0laRShtdjg4ZjY3MjBfbXBwX2NvbnRyb2xzKTsKKwlzb2MtPm1vZGVzID0gbXY4OGY2NzIwX21wcF9tb2RlczsKKwlzb2MtPm5tb2RlcyA9IEFSUkFZX1NJWkUobXY4OGY2NzIwX21wcF9tb2Rlcyk7CisJc29jLT5ncGlvcmFuZ2VzID0gbXY4OGY2NzIwX21wcF9ncGlvX3JhbmdlczsKKwlzb2MtPm5ncGlvcmFuZ2VzID0gQVJSQVlfU0laRShtdjg4ZjY3MjBfbXBwX2dwaW9fcmFuZ2VzKTsKKworCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gc29jOworCisJcmV0dXJuIG12ZWJ1X3BpbmN0cmxfcHJvYmUocGRldik7Cit9CisKK3N0YXRpYyBpbnQgYXJtYWRhXzM3NV9waW5jdHJsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBtdmVidV9waW5jdHJsX3JlbW92ZShwZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXJtYWRhXzM3NV9waW5jdHJsX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhcm1hZGEtMzc1LXBpbmN0cmwiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGFybWFkYV8zNzVfcGluY3RybF9vZl9tYXRjaCksCisJfSwKKwkucHJvYmUgPSBhcm1hZGFfMzc1X3BpbmN0cmxfcHJvYmUsCisJLnJlbW92ZSA9IGFybWFkYV8zNzVfcGluY3RybF9yZW1vdmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGFybWFkYV8zNzVfcGluY3RybF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgUGV0YXp6b25pIDx0aG9tYXMucGV0YXp6b25pQGZyZWUtZWxlY3Ryb25zLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWFydmVsbCBBcm1hZGEgMzc1IHBpbmN0cmwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1hcm1hZGEtMzh4LmMgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1hcm1hZGEtMzh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA0OWY4MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS0zOHguYwpAQCAtMCwwICsxLDQ2MiBAQAorLyoKKyAqIE1hcnZlbGwgQXJtYWRhIDM4MC8zODUgcGluY3RybCBkcml2ZXIgYmFzZWQgb24gbXZlYnUgcGluY3RybCBjb3JlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIE1hcnZlbGwKKyAqCisgKiBUaG9tYXMgUGV0YXp6b25pIDx0aG9tYXMucGV0YXp6b25pQGZyZWUtZWxlY3Ryb25zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY3RybC5oPgorCisjaW5jbHVkZSAicGluY3RybC1tdmVidS5oIgorCitzdGF0aWMgdm9pZCBfX2lvbWVtICptcHBfYmFzZTsKKworc3RhdGljIGludCBhcm1hZGFfMzh4X21wcF9jdHJsX2dldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKK3sKKwlyZXR1cm4gZGVmYXVsdF9tcHBfY3RybF9nZXQobXBwX2Jhc2UsIHBpZCwgY29uZmlnKTsKK30KKworc3RhdGljIGludCBhcm1hZGFfMzh4X21wcF9jdHJsX3NldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgY29uZmlnKQoreworCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX3NldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOworfQorCitlbnVtIHsKKwlWXzg4RjY4MTAgPSBCSVQoMCksCisJVl84OEY2ODIwID0gQklUKDEpLAorCVZfODhGNjgyOCA9IEJJVCgyKSwKKwlWXzg4RjY4MTBfUExVUyA9IChWXzg4RjY4MTAgfCBWXzg4RjY4MjAgfCBWXzg4RjY4MjgpLAorCVZfODhGNjgyMF9QTFVTID0gKFZfODhGNjgyMCB8IFZfODhGNjgyOCksCit9OworCitzdGF0aWMgc3RydWN0IG12ZWJ1X21wcF9tb2RlIGFybWFkYV8zOHhfbXBwX21vZGVzW10gPSB7CisJTVBQX01PREUoMCwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJ1YTAiLCAgICJyeGQiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgxLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInVhMCIsICAgInR4ZCIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDIsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiaTJjMCIsICAic2NrIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMywKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJpMmMwIiwgICJzZGEiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg0LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlIiwgICAgIm1kYyIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJ1YTEiLCAgICJ0eGQiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidWEwIiwgICAicnRzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJnZSIsICAgICJtZGlvIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAidWExIiwgICAicnhkIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInVhMCIsICAgImN0cyIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDYsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiZ2UwIiwgICAidHhjbGtvdXQiLCAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImdlMCIsICAgImNycyIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJjczMiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg3LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlMCIsICAgInR4ZDAiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhZDkiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg4LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlMCIsICAgInR4ZDEiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhZDEwIiwgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg5LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlMCIsICAgInR4ZDIiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhZDExIiwgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgxMCwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJnZTAiLCAgICJ0eGQzIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYWQxMiIsICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMTEsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiZ2UwIiwgICAidHhjdGwiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFkMTMiLCAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDEyLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlMCIsICAgInJ4ZDAiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJwY2llMCIsICJyc3RvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAicGNpZTEiLCAicnN0b3V0IiwgICAgIFZfODhGNjgyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNwaTAiLCAgImNzMSIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhZDE0IiwgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgxMywKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJnZTAiLCAgICJyeGQxIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAicGNpZTAiLCAiY2xrcmVxIiwgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInBjaWUxIiwgImNsa3JlcSIsICAgICBWXzg4RjY4MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkwIiwgICJjczIiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYWQxNSIsICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMTQsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiZ2UwIiwgICAicnhkMiIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInB0cCIsICAgImNsayIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJtIiwgICAgICJ2dHRfY3RybCIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic3BpMCIsICAiY3MzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgIndlbjEiLCAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDE1LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlMCIsICAgInJ4ZDMiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJnZSIsICAgICJtZGMgc2xhdmUiLCAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAicGNpZTAiLCAicnN0b3V0IiwgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNwaTAiLCAgIm1vc2kiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJwY2llMSIsICJyc3RvdXQiLCAgICAgVl84OEY2ODIwX1BMVVMpKSwKKwlNUFBfTU9ERSgxNiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJnZTAiLCAgICJyeGN0bCIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAiZ2UiLCAgICAibWRpbyBzbGF2ZSIsIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgIm0iLCAgICAgImRlY2NfZXJyIiwgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkwIiwgICJtaXNvIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAicGNpZTAiLCAiY2xrcmVxIiwgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMTcsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiZ2UwIiwgICAicnhjbGsiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInB0cCIsICAgImNsayIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJ1YTEiLCAgICJyeGQiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic3BpMCIsICAic2NrIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInNhdGExIiwgInByc250IiwgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDE4LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlMCIsICAgInJ4ZXJyIiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJwdHAiLCAgICJ0cmlnX2dlbiIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidWExIiwgICAidHhkIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNwaTAiLCAgImNzMCIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJwY2llMSIsICJyc3RvdXQiLCAgICAgVl84OEY2ODIwX1BMVVMpKSwKKwlNUFBfTU9ERSgxOSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJnZTAiLCAgICJjb2wiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAicHRwIiwgICAiZXZlbnRfcmVxIiwgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInBjaWUwIiwgImNsa3JlcSIsICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzYXRhMSIsICJwcnNudCIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAidWEwIiwgICAiY3RzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMjAsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiZ2UwIiwgICAidHhjbGsiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInB0cCIsICAgImNsayIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJwY2llMSIsICJyc3RvdXQiLCAgICAgVl84OEY2ODIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic2F0YTAiLCAicHJzbnQiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInVhMCIsICAgInJ0cyIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDIxLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInNwaTAiLCAgImNzMSIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJnZTEiLCAgICJyeGQwIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAic2F0YTAiLCAicHJzbnQiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNkMCIsICAgImNtZCIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJib290Y3MiLCAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgyMiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJzcGkwIiwgICJtb3NpIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYWQwIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMjMsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAic3BpMCIsICAic2NrIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFkMiIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDI0LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInNwaTAiLCAgIm1pc28iLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJ1YTAiLCAgICJjdHMiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidWExIiwgICAicnhkIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNkMCIsICAgImQ0IiwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJyZWFkeSIsICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgyNSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJzcGkwIiwgICJjczAiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAidWEwIiwgICAicnRzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInVhMSIsICAgInR4ZCIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzZDAiLCAgICJkNSIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiY3MwIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMjYsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAic3BpMCIsICAiY3MyIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgImkyYzEiLCAgInNjayIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzZDAiLCAgICJkNiIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiY3MxIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMjcsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAic3BpMCIsICAiY3MzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImdlMSIsICAgInR4Y2xrb3V0IiwgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJpMmMxIiwgICJzZGEiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic2QwIiwgICAiZDciLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImNzMiIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDI4LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImdlMSIsICAgInR4ZDAiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzZDAiLCAgICJjbGsiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYWQ1IiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMjksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAiZ2UxIiwgICAidHhkMSIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFsZTAiLCAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDMwLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImdlMSIsICAgInR4ZDIiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJvZW4iLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgzMSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJnZTEiLCAgICJ0eGQzIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYWxlMSIsICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMzIsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAiZ2UxIiwgICAidHhjdGwiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgIndlbjAiLCAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDMzLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgIm0iLCAgICAgImRlY2NfZXJyIiwgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhZDMiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgzNCwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhZDEiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgzNSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJyZWYiLCAgICJjbGtfb3V0MSIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYTEiLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMzYsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAicHRwIiwgICAidHJpZ19nZW4iLCAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImEwIiwgICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDM3LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInB0cCIsICAgImNsayIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJnZTEiLCAgICJyeGNsayIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic2QwIiwgICAiZDMiLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFkOCIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDM4LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInB0cCIsICAgImV2ZW50X3JlcSIsICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJnZTEiLCAgICJyeGQxIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAicmVmIiwgICAiY2xrX291dDAiLCAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNkMCIsICAgImQwIiwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhZDQiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgzOSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJpMmMxIiwgICJzY2siLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAiZ2UxIiwgICAicnhkMiIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInVhMCIsICAgImN0cyIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzZDAiLCAgICJkMSIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYTIiLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNDAsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiaTJjMSIsICAic2RhIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImdlMSIsICAgInJ4ZDMiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJ1YTAiLCAgICJydHMiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic2QwIiwgICAiZDIiLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFkNiIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDQxLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInVhMSIsICAgInJ4ZCIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJnZTEiLCAgICJyeGN0bCIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidWEwIiwgICAiY3RzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNwaTEiLCAgImNzMyIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJidXJzdC9sYXN0IiwgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg0MiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJ1YTEiLCAgICJ0eGQiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidWEwIiwgICAicnRzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFkNyIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDQzLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInBjaWUwIiwgImNsa3JlcSIsICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJtIiwgICAgICJ2dHRfY3RybCIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAibSIsICAgICAiZGVjY19lcnIiLCAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInBjaWUwIiwgInJzdG91dCIsICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJjbGtvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg0NCwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJzYXRhMCIsICJwcnNudCIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAic2F0YTEiLCAicHJzbnQiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInNhdGEyIiwgInByc250IiwgICAgICBWXzg4RjY4MjgpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic2F0YTMiLCAicHJzbnQiLCAgICAgIFZfODhGNjgyOCksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJwY2llMCIsICJyc3RvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg0NSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJyZWYiLCAgICJjbGtfb3V0MCIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAicGNpZTAiLCAicnN0b3V0IiwgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInBjaWUxIiwgInJzdG91dCIsICAgICBWXzg4RjY4MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJwY2llMiIsICJyc3RvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAicGNpZTMiLCAicnN0b3V0IiwgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNDYsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAicmVmIiwgICAiY2xrX291dDEiLCAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInBjaWUwIiwgInJzdG91dCIsICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJwY2llMSIsICJyc3RvdXQiLCAgICAgVl84OEY2ODIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAicGNpZTIiLCAicnN0b3V0IiwgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInBjaWUzIiwgInJzdG91dCIsICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDQ3LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInNhdGEwIiwgInByc250IiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJzYXRhMSIsICJwcnNudCIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAic2F0YTIiLCAicHJzbnQiLCAgICAgIFZfODhGNjgyOCksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkxIiwgICJjczIiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAic2F0YTMiLCAicHJzbnQiLCAgICAgIFZfODhGNjgyOCkpLAorCU1QUF9NT0RFKDQ4LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInNhdGEwIiwgInByc250IiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJtIiwgICAgICJ2dHRfY3RybCIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidGRtMmMiLCAicGNsayIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgImF1ZGlvIiwgIm1jbGsiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJzZDAiLCAgICJkNCIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg0OSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJzYXRhMiIsICJwcnNudCIsICAgICAgVl84OEY2ODI4KSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInNhdGEzIiwgInByc250IiwgICAgICBWXzg4RjY4MjgpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidGRtMmMiLCAiZnN5bmMiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgImF1ZGlvIiwgImxyY2xrIiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJzZDAiLCAgICJkNSIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg1MCwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJwY2llMCIsICJyc3RvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAicGNpZTEiLCAicnN0b3V0IiwgICAgIFZfODhGNjgyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInRkbTJjIiwgImRyeCIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJhdWRpbyIsICJleHRjbGsiLCAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAic2QwIiwgICAiY21kIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNTEsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidGRtMmMiLCAiZHR4IiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgImF1ZGlvIiwgInNkbyIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJtIiwgICAgICJkZWNjX2VyciIsICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg1MiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJwY2llMCIsICJyc3RvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAicGNpZTEiLCAicnN0b3V0IiwgICAgIFZfODhGNjgyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInRkbTJjIiwgImludG4iLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJhdWRpbyIsICJzZGkiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAic2QwIiwgICAiZDYiLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNTMsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAic2F0YTEiLCAicHJzbnQiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInNhdGEwIiwgInByc250IiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJ0ZG0yYyIsICJyc3RuIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAiYXVkaW8iLCAiYmNsayIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInNkMCIsICAgImQ3IiwgICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDU0LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInNhdGEwIiwgInByc250IiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJzYXRhMSIsICJwcnNudCIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAicGNpZTAiLCAicnN0b3V0IiwgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInBjaWUxIiwgInJzdG91dCIsICAgICBWXzg4RjY4MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJzZDAiLCAgICJkMyIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg1NSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJ1YTEiLCAgICJjdHMiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAiZ2UiLCAgICAibWRpbyIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInBjaWUxIiwgImNsa3JlcSIsICAgICBWXzg4RjY4MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkxIiwgICJjczEiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAic2QwIiwgICAiZDAiLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNTYsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAidWExIiwgICAicnRzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImdlIiwgICAgIm1kYyIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJtIiwgICAgICJkZWNjX2VyciIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic3BpMSIsICAibW9zaSIsICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNTcsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic3BpMSIsICAic2NrIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInNkMCIsICAgImNsayIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDU4LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInBjaWUxIiwgImNsa3JlcSIsICAgICBWXzg4RjY4MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJpMmMxIiwgICJzY2siLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAicGNpZTIiLCAiY2xrcmVxIiwgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNwaTEiLCAgIm1pc28iLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJzZDAiLCAgICJkMSIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg1OSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJwY2llMCIsICJyc3RvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAiaTJjMSIsICAic2RhIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInBjaWUxIiwgInJzdG91dCIsICAgICBWXzg4RjY4MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkxIiwgICJjczAiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAic2QwIiwgICAiZDIiLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCit9OworCitzdGF0aWMgc3RydWN0IG12ZWJ1X3BpbmN0cmxfc29jX2luZm8gYXJtYWRhXzM4eF9waW5jdHJsX2luZm87CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFybWFkYV8zOHhfcGluY3RybF9vZl9tYXRjaFtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAibWFydmVsbCxtdjg4ZjY4MTAtcGluY3RybCIsCisJCS5kYXRhICAgICAgID0gKHZvaWQgKikgVl84OEY2ODEwLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLG12ODhmNjgyMC1waW5jdHJsIiwKKwkJLmRhdGEgICAgICAgPSAodm9pZCAqKSBWXzg4RjY4MjAsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gIm1hcnZlbGwsbXY4OGY2ODI4LXBpbmN0cmwiLAorCQkuZGF0YSAgICAgICA9ICh2b2lkICopIFZfODhGNjgyOCwKKwl9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgYXJtYWRhXzM4eF9tcHBfY29udHJvbHNbXSA9IHsKKwlNUFBfRlVOQ19DVFJMKDAsIDU5LCBOVUxMLCBhcm1hZGFfMzh4X21wcF9jdHJsKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlIGFybWFkYV8zOHhfbXBwX2dwaW9fcmFuZ2VzW10gPSB7CisJTVBQX0dQSU9fUkFOR0UoMCwgICAwLCAgMCwgMzIpLAorCU1QUF9HUElPX1JBTkdFKDEsICAzMiwgMzIsIDI3KSwKK307CisKK3N0YXRpYyBpbnQgYXJtYWRhXzM4eF9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG12ZWJ1X3BpbmN0cmxfc29jX2luZm8gKnNvYyA9ICZhcm1hZGFfMzh4X3BpbmN0cmxfaW5mbzsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCA9CisJCW9mX21hdGNoX2RldmljZShhcm1hZGFfMzh4X3BpbmN0cmxfb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJaWYgKCFtYXRjaCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCW1wcF9iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihtcHBfYmFzZSkpCisJCXJldHVybiBQVFJfRVJSKG1wcF9iYXNlKTsKKworCXNvYy0+dmFyaWFudCA9ICh1bnNpZ25lZCkgbWF0Y2gtPmRhdGEgJiAweGZmOworCXNvYy0+Y29udHJvbHMgPSBhcm1hZGFfMzh4X21wcF9jb250cm9sczsKKwlzb2MtPm5jb250cm9scyA9IEFSUkFZX1NJWkUoYXJtYWRhXzM4eF9tcHBfY29udHJvbHMpOworCXNvYy0+Z3Bpb3JhbmdlcyA9IGFybWFkYV8zOHhfbXBwX2dwaW9fcmFuZ2VzOworCXNvYy0+bmdwaW9yYW5nZXMgPSBBUlJBWV9TSVpFKGFybWFkYV8zOHhfbXBwX2dwaW9fcmFuZ2VzKTsKKwlzb2MtPm1vZGVzID0gYXJtYWRhXzM4eF9tcHBfbW9kZXM7CisJc29jLT5ubW9kZXMgPSBhcm1hZGFfMzh4X21wcF9jb250cm9sc1swXS5ucGluczsKKworCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gc29jOworCisJcmV0dXJuIG12ZWJ1X3BpbmN0cmxfcHJvYmUocGRldik7Cit9CisKK3N0YXRpYyBpbnQgYXJtYWRhXzM4eF9waW5jdHJsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBtdmVidV9waW5jdHJsX3JlbW92ZShwZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXJtYWRhXzM4eF9waW5jdHJsX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhcm1hZGEtMzh4LXBpbmN0cmwiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGFybWFkYV8zOHhfcGluY3RybF9vZl9tYXRjaCksCisJfSwKKwkucHJvYmUgPSBhcm1hZGFfMzh4X3BpbmN0cmxfcHJvYmUsCisJLnJlbW92ZSA9IGFybWFkYV8zOHhfcGluY3RybF9yZW1vdmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGFybWFkYV8zOHhfcGluY3RybF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgUGV0YXp6b25pIDx0aG9tYXMucGV0YXp6b25pQGZyZWUtZWxlY3Ryb25zLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWFydmVsbCBBcm1hZGEgMzh4IHBpbmN0cmwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1hcm1hZGEteHAuYyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS14cC5jCmluZGV4IDg0M2E1MWYuLmRlMzExMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS14cC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS14cC5jCkBAIC0zMyw2ICszMywxOCBAQAogCiAjaW5jbHVkZSAicGluY3RybC1tdmVidS5oIgogCitzdGF0aWMgdm9pZCBfX2lvbWVtICptcHBfYmFzZTsKKworc3RhdGljIGludCBhcm1hZGFfeHBfbXBwX2N0cmxfZ2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQoreworCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX2dldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOworfQorCitzdGF0aWMgaW50IGFybWFkYV94cF9tcHBfY3RybF9zZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nIGNvbmZpZykKK3sKKwlyZXR1cm4gZGVmYXVsdF9tcHBfY3RybF9zZXQobXBwX2Jhc2UsIHBpZCwgY29uZmlnKTsKK30KKwogZW51bSBhcm1hZGFfeHBfdmFyaWFudCB7CiAJVl9NVjc4MjMwCT0gQklUKDApLAogCVZfTVY3ODI2MAk9IEJJVCgxKSwKQEAgLTM2Niw3ICszNzgsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBtdmVidV9tcHBfY3RybCBtdjc4MjMwX21wcF9jb250cm9sc1tdID0gewotCU1QUF9SRUdfQ1RSTCgwLCA0OCksCisJTVBQX0ZVTkNfQ1RSTCgwLCA0OCwgTlVMTCwgYXJtYWRhX3hwX21wcF9jdHJsKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlIG12NzgyMzBfbXBwX2dwaW9fcmFuZ2VzW10gPSB7CkBAIC0zNzUsNyArMzg3LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgbXY3ODI2MF9tcHBfY29udHJvbHNbXSA9IHsKLQlNUFBfUkVHX0NUUkwoMCwgNjYpLAorCU1QUF9GVU5DX0NUUkwoMCwgNjYsIE5VTEwsIGFybWFkYV94cF9tcHBfY3RybCksCiB9OwogCiBzdGF0aWMgc3RydWN0IHBpbmN0cmxfZ3Bpb19yYW5nZSBtdjc4MjYwX21wcF9ncGlvX3Jhbmdlc1tdID0gewpAQCAtMzg1LDcgKzM5Nyw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IG12ZWJ1X21wcF9jdHJsIG12Nzg0NjBfbXBwX2NvbnRyb2xzW10gPSB7Ci0JTVBQX1JFR19DVFJMKDAsIDY2KSwKKwlNUFBfRlVOQ19DVFJMKDAsIDY2LCBOVUxMLCBhcm1hZGFfeHBfbXBwX2N0cmwpLAogfTsKIAogc3RhdGljIHN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgbXY3ODQ2MF9tcHBfZ3Bpb19yYW5nZXNbXSA9IHsKQEAgLTM5OSwxMCArNDExLDE2IEBACiAJc3RydWN0IG12ZWJ1X3BpbmN0cmxfc29jX2luZm8gKnNvYyA9ICZhcm1hZGFfeHBfcGluY3RybF9pbmZvOwogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoID0KIAkJb2ZfbWF0Y2hfZGV2aWNlKGFybWFkYV94cF9waW5jdHJsX29mX21hdGNoLCAmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAogCWlmICghbWF0Y2gpCiAJCXJldHVybiAtRU5PREVWOwogCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwltcHBfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIobXBwX2Jhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihtcHBfYmFzZSk7CisKIAlzb2MtPnZhcmlhbnQgPSAodW5zaWduZWQpIG1hdGNoLT5kYXRhICYgMHhmZjsKIAogCXN3aXRjaCAoc29jLT52YXJpYW50KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1kb3ZlLmMgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1kb3ZlLmMKaW5kZXggNDcyNjgzOS4uM2IwMjIxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtZG92ZS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWRvdmUuYwpAQCAtMTgsMTA3ICsxOCwxMjIgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KICNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmN0cmwuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KIAogI2luY2x1ZGUgInBpbmN0cmwtbXZlYnUuaCIKIAotI2RlZmluZSBET1ZFX1NCX1JFR1NfVklSVF9CQVNFCQlJT01FTSgweGZkZTAwMDAwKQotI2RlZmluZSBET1ZFX01QUF9WSVJUX0JBU0UJCShET1ZFX1NCX1JFR1NfVklSVF9CQVNFICsgMHhkMDIwMCkKLSNkZWZpbmUgRE9WRV9QTVVfTVBQX0dFTkVSQUxfQ1RSTAkoRE9WRV9NUFBfVklSVF9CQVNFICsgMHgxMCkKLSNkZWZpbmUgIERPVkVfQVUwX0FDOTdfU0VMCQlCSVQoMTYpCi0jZGVmaW5lIERPVkVfUE1VX1NJR05BTF9TRUxFQ1RfMAkoRE9WRV9TQl9SRUdTX1ZJUlRfQkFTRSArIDB4ZDgwMkMpCi0jZGVmaW5lIERPVkVfUE1VX1NJR05BTF9TRUxFQ1RfMQkoRE9WRV9TQl9SRUdTX1ZJUlRfQkFTRSArIDB4ZDgwMzApCi0jZGVmaW5lIERPVkVfR0xPQkFMX0NPTkZJR18xCQkoRE9WRV9TQl9SRUdTX1ZJUlRfQkFTRSArIDB4ZTgwMkMpCi0jZGVmaW5lIERPVkVfR0xPQkFMX0NPTkZJR18xCQkoRE9WRV9TQl9SRUdTX1ZJUlRfQkFTRSArIDB4ZTgwMkMpCi0jZGVmaW5lICBET1ZFX1RXU0lfRU5BQkxFX09QVElPTjEJQklUKDcpCi0jZGVmaW5lIERPVkVfR0xPQkFMX0NPTkZJR18yCQkoRE9WRV9TQl9SRUdTX1ZJUlRfQkFTRSArIDB4ZTgwMzApCi0jZGVmaW5lICBET1ZFX1RXU0lfRU5BQkxFX09QVElPTjIJQklUKDIwKQotI2RlZmluZSAgRE9WRV9UV1NJX0VOQUJMRV9PUFRJT04zCUJJVCgyMSkKLSNkZWZpbmUgIERPVkVfVFdTSV9PUFRJT04zX0dQSU8JCUJJVCgyMikKLSNkZWZpbmUgRE9WRV9TU1BfQ1RSTF9TVEFUVVNfMQkJKERPVkVfU0JfUkVHU19WSVJUX0JBU0UgKyAweGU4MDM0KQotI2RlZmluZSAgRE9WRV9TU1BfT05fQVUxCQlCSVQoMCkKLSNkZWZpbmUgRE9WRV9NUFBfR0VORVJBTF9WSVJUX0JBU0UJKERPVkVfU0JfUkVHU19WSVJUX0JBU0UgKyAweGU4MDNjKQotI2RlZmluZSAgRE9WRV9BVTFfU1BESUZPX0dQSU9fRU4JQklUKDEpCi0jZGVmaW5lICBET1ZFX05BTkRfR1BJT19FTgkJQklUKDApCi0jZGVmaW5lIERPVkVfR1BJT19MT19WSVJUX0JBU0UJCShET1ZFX1NCX1JFR1NfVklSVF9CQVNFICsgMHhkMDQwMCkKLSNkZWZpbmUgRE9WRV9NUFBfQ1RSTDRfVklSVF9CQVNFCShET1ZFX0dQSU9fTE9fVklSVF9CQVNFICsgMHg0MCkKLSNkZWZpbmUgIERPVkVfU1BJX0dQSU9fU0VMCQlCSVQoNSkKLSNkZWZpbmUgIERPVkVfVUFSVDFfR1BJT19TRUwJCUJJVCg0KQotI2RlZmluZSAgRE9WRV9BVTFfR1BJT19TRUwJCUJJVCgzKQotI2RlZmluZSAgRE9WRV9DQU1fR1BJT19TRUwJCUJJVCgyKQotI2RlZmluZSAgRE9WRV9TRDFfR1BJT19TRUwJCUJJVCgxKQotI2RlZmluZSAgRE9WRV9TRDBfR1BJT19TRUwJCUJJVCgwKQorLyogSW50ZXJuYWwgcmVnaXN0ZXJzIGNhbiBiZSBjb25maWd1cmVkIGF0IGFueSAxIE1pQiBhbGlnbmVkIGFkZHJlc3MgKi8KKyNkZWZpbmUgSU5UX1JFR1NfTUFTSwkJfihTWl8xTSAtIDEpCisjZGVmaW5lIE1QUDRfUkVHU19PRkZTCQkweGQwNDQwCisjZGVmaW5lIFBNVV9SRUdTX09GRlMJCTB4ZDgwMmMKKyNkZWZpbmUgR0NfUkVHU19PRkZTCQkweGU4MDJjCiAKLSNkZWZpbmUgTVBQU19QRVJfUkVHCTgKLSNkZWZpbmUgTVBQX0JJVFMJNAotI2RlZmluZSBNUFBfTUFTSwkweGYKKy8qIE1QUCBCYXNlIHJlZ2lzdGVycyAqLworI2RlZmluZSBQTVVfTVBQX0dFTkVSQUxfQ1RSTAkweDEwCisjZGVmaW5lICBBVTBfQUM5N19TRUwJCUJJVCgxNikKKworLyogTVBQIENvbnRyb2wgNCByZWdpc3RlciAqLworI2RlZmluZSBTUElfR1BJT19TRUwJCUJJVCg1KQorI2RlZmluZSBVQVJUMV9HUElPX1NFTAkJQklUKDQpCisjZGVmaW5lIEFVMV9HUElPX1NFTAkJQklUKDMpCisjZGVmaW5lIENBTV9HUElPX1NFTAkJQklUKDIpCisjZGVmaW5lIFNEMV9HUElPX1NFTAkJQklUKDEpCisjZGVmaW5lIFNEMF9HUElPX1NFTAkJQklUKDApCisKKy8qIFBNVSBTaWduYWwgU2VsZWN0IHJlZ2lzdGVycyAqLworI2RlZmluZSBQTVVfU0lHTkFMX1NFTEVDVF8wCTB4MDAKKyNkZWZpbmUgUE1VX1NJR05BTF9TRUxFQ1RfMQkweDA0CisKKy8qIEdsb2JhbCBDb25maWcgcmVnbWFwIHJlZ2lzdGVycyAqLworI2RlZmluZSBHTE9CQUxfQ09ORklHXzEJCTB4MDAKKyNkZWZpbmUgIFRXU0lfRU5BQkxFX09QVElPTjEJQklUKDcpCisjZGVmaW5lIEdMT0JBTF9DT05GSUdfMgkJMHgwNAorI2RlZmluZSAgVFdTSV9FTkFCTEVfT1BUSU9OMglCSVQoMjApCisjZGVmaW5lICBUV1NJX0VOQUJMRV9PUFRJT04zCUJJVCgyMSkKKyNkZWZpbmUgIFRXU0lfT1BUSU9OM19HUElPCUJJVCgyMikKKyNkZWZpbmUgU1NQX0NUUkxfU1RBVFVTXzEJMHgwOAorI2RlZmluZSAgU1NQX09OX0FVMQkJQklUKDApCisjZGVmaW5lIE1QUF9HRU5FUkFMX0NPTkZJRwkweDEwCisjZGVmaW5lICBBVTFfU1BESUZPX0dQSU9fRU4JQklUKDEpCisjZGVmaW5lICBOQU5EX0dQSU9fRU4JCUJJVCgwKQogCiAjZGVmaW5lIENPTkZJR19QTVUJQklUKDQpCiAKLXN0YXRpYyBpbnQgZG92ZV9wbXVfbXBwX2N0cmxfZ2V0KHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwKLQkJCQkgdW5zaWduZWQgbG9uZyAqY29uZmlnKQorc3RhdGljIHZvaWQgX19pb21lbSAqbXBwX2Jhc2U7CitzdGF0aWMgdm9pZCBfX2lvbWVtICptcHA0X2Jhc2U7CitzdGF0aWMgdm9pZCBfX2lvbWVtICpwbXVfYmFzZTsKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwICpnY29uZm1hcDsKKworc3RhdGljIGludCBkb3ZlX21wcF9jdHJsX2dldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKIHsKLQl1bnNpZ25lZCBvZmYgPSAoY3RybC0+cGlkIC8gTVBQU19QRVJfUkVHKSAqIE1QUF9CSVRTOwotCXVuc2lnbmVkIHNoaWZ0ID0gKGN0cmwtPnBpZCAlIE1QUFNfUEVSX1JFRykgKiBNUFBfQklUUzsKLQl1bnNpZ25lZCBsb25nIHBtdSA9IHJlYWRsKERPVkVfUE1VX01QUF9HRU5FUkFMX0NUUkwpOworCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX2dldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOworfQorCitzdGF0aWMgaW50IGRvdmVfbXBwX2N0cmxfc2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyBjb25maWcpCit7CisJcmV0dXJuIGRlZmF1bHRfbXBwX2N0cmxfc2V0KG1wcF9iYXNlLCBwaWQsIGNvbmZpZyk7Cit9CisKK3N0YXRpYyBpbnQgZG92ZV9wbXVfbXBwX2N0cmxfZ2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQoreworCXVuc2lnbmVkIG9mZiA9IChwaWQgLyBNVkVCVV9NUFBTX1BFUl9SRUcpICogTVZFQlVfTVBQX0JJVFM7CisJdW5zaWduZWQgc2hpZnQgPSAocGlkICUgTVZFQlVfTVBQU19QRVJfUkVHKSAqIE1WRUJVX01QUF9CSVRTOworCXVuc2lnbmVkIGxvbmcgcG11ID0gcmVhZGwobXBwX2Jhc2UgKyBQTVVfTVBQX0dFTkVSQUxfQ1RSTCk7CiAJdW5zaWduZWQgbG9uZyBmdW5jOwogCi0JaWYgKHBtdSAmICgxIDw8IGN0cmwtPnBpZCkpIHsKLQkJZnVuYyA9IHJlYWRsKERPVkVfUE1VX1NJR05BTF9TRUxFQ1RfMCArIG9mZik7Ci0JCSpjb25maWcgPSAoZnVuYyA+PiBzaGlmdCkgJiBNUFBfTUFTSzsKLQkJKmNvbmZpZyB8PSBDT05GSUdfUE1VOwotCX0gZWxzZSB7Ci0JCWZ1bmMgPSByZWFkbChET1ZFX01QUF9WSVJUX0JBU0UgKyBvZmYpOwotCQkqY29uZmlnID0gKGZ1bmMgPj4gc2hpZnQpICYgTVBQX01BU0s7Ci0JfQorCWlmICgocG11ICYgQklUKHBpZCkpID09IDApCisJCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX2dldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOworCisJZnVuYyA9IHJlYWRsKHBtdV9iYXNlICsgUE1VX1NJR05BTF9TRUxFQ1RfMCArIG9mZik7CisJKmNvbmZpZyA9IChmdW5jID4+IHNoaWZ0KSAmIE1WRUJVX01QUF9NQVNLOworCSpjb25maWcgfD0gQ09ORklHX1BNVTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRvdmVfcG11X21wcF9jdHJsX3NldChzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgKmN0cmwsCi0JCQkJIHVuc2lnbmVkIGxvbmcgY29uZmlnKQorc3RhdGljIGludCBkb3ZlX3BtdV9tcHBfY3RybF9zZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nIGNvbmZpZykKIHsKLQl1bnNpZ25lZCBvZmYgPSAoY3RybC0+cGlkIC8gTVBQU19QRVJfUkVHKSAqIE1QUF9CSVRTOwotCXVuc2lnbmVkIHNoaWZ0ID0gKGN0cmwtPnBpZCAlIE1QUFNfUEVSX1JFRykgKiBNUFBfQklUUzsKLQl1bnNpZ25lZCBsb25nIHBtdSA9IHJlYWRsKERPVkVfUE1VX01QUF9HRU5FUkFMX0NUUkwpOworCXVuc2lnbmVkIG9mZiA9IChwaWQgLyBNVkVCVV9NUFBTX1BFUl9SRUcpICogTVZFQlVfTVBQX0JJVFM7CisJdW5zaWduZWQgc2hpZnQgPSAocGlkICUgTVZFQlVfTVBQU19QRVJfUkVHKSAqIE1WRUJVX01QUF9CSVRTOworCXVuc2lnbmVkIGxvbmcgcG11ID0gcmVhZGwobXBwX2Jhc2UgKyBQTVVfTVBQX0dFTkVSQUxfQ1RSTCk7CiAJdW5zaWduZWQgbG9uZyBmdW5jOwogCi0JaWYgKGNvbmZpZyAmIENPTkZJR19QTVUpIHsKLQkJd3JpdGVsKHBtdSB8ICgxIDw8IGN0cmwtPnBpZCksIERPVkVfUE1VX01QUF9HRU5FUkFMX0NUUkwpOwotCQlmdW5jID0gcmVhZGwoRE9WRV9QTVVfU0lHTkFMX1NFTEVDVF8wICsgb2ZmKTsKLQkJZnVuYyAmPSB+KE1QUF9NQVNLIDw8IHNoaWZ0KTsKLQkJZnVuYyB8PSAoY29uZmlnICYgTVBQX01BU0spIDw8IHNoaWZ0OwotCQl3cml0ZWwoZnVuYywgRE9WRV9QTVVfU0lHTkFMX1NFTEVDVF8wICsgb2ZmKTsKLQl9IGVsc2UgewotCQl3cml0ZWwocG11ICYgfigxIDw8IGN0cmwtPnBpZCksIERPVkVfUE1VX01QUF9HRU5FUkFMX0NUUkwpOwotCQlmdW5jID0gcmVhZGwoRE9WRV9NUFBfVklSVF9CQVNFICsgb2ZmKTsKLQkJZnVuYyAmPSB+KE1QUF9NQVNLIDw8IHNoaWZ0KTsKLQkJZnVuYyB8PSAoY29uZmlnICYgTVBQX01BU0spIDw8IHNoaWZ0OwotCQl3cml0ZWwoZnVuYywgRE9WRV9NUFBfVklSVF9CQVNFICsgb2ZmKTsKKwlpZiAoKGNvbmZpZyAmIENPTkZJR19QTVUpID09IDApIHsKKwkJd3JpdGVsKHBtdSAmIH5CSVQocGlkKSwgbXBwX2Jhc2UgKyBQTVVfTVBQX0dFTkVSQUxfQ1RSTCk7CisJCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX3NldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOwogCX0KKworCXdyaXRlbChwbXUgfCBCSVQocGlkKSwgbXBwX2Jhc2UgKyBQTVVfTVBQX0dFTkVSQUxfQ1RSTCk7CisJZnVuYyA9IHJlYWRsKHBtdV9iYXNlICsgUE1VX1NJR05BTF9TRUxFQ1RfMCArIG9mZik7CisJZnVuYyAmPSB+KE1WRUJVX01QUF9NQVNLIDw8IHNoaWZ0KTsKKwlmdW5jIHw9IChjb25maWcgJiBNVkVCVV9NUFBfTUFTSykgPDwgc2hpZnQ7CisJd3JpdGVsKGZ1bmMsIHBtdV9iYXNlICsgUE1VX1NJR05BTF9TRUxFQ1RfMCArIG9mZik7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkb3ZlX21wcDRfY3RybF9nZXQoc3RydWN0IG12ZWJ1X21wcF9jdHJsICpjdHJsLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyAqY29uZmlnKQorc3RhdGljIGludCBkb3ZlX21wcDRfY3RybF9nZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nICpjb25maWcpCiB7Ci0JdW5zaWduZWQgbG9uZyBtcHA0ID0gcmVhZGwoRE9WRV9NUFBfQ1RSTDRfVklSVF9CQVNFKTsKKwl1bnNpZ25lZCBsb25nIG1wcDQgPSByZWFkbChtcHA0X2Jhc2UpOwogCXVuc2lnbmVkIGxvbmcgbWFzazsKIAotCXN3aXRjaCAoY3RybC0+cGlkKSB7CisJc3dpdGNoIChwaWQpIHsKIAljYXNlIDI0OiAvKiBtcHBfY2FtZXJhICovCi0JCW1hc2sgPSBET1ZFX0NBTV9HUElPX1NFTDsKKwkJbWFzayA9IENBTV9HUElPX1NFTDsKIAkJYnJlYWs7CiAJY2FzZSA0MDogLyogbXBwX3NkaW8wICovCi0JCW1hc2sgPSBET1ZFX1NEMF9HUElPX1NFTDsKKwkJbWFzayA9IFNEMF9HUElPX1NFTDsKIAkJYnJlYWs7CiAJY2FzZSA0NjogLyogbXBwX3NkaW8xICovCi0JCW1hc2sgPSBET1ZFX1NEMV9HUElPX1NFTDsKKwkJbWFzayA9IFNEMV9HUElPX1NFTDsKIAkJYnJlYWs7CiAJY2FzZSA1ODogLyogbXBwX3NwaTAgKi8KLQkJbWFzayA9IERPVkVfU1BJX0dQSU9fU0VMOworCQltYXNrID0gU1BJX0dQSU9fU0VMOwogCQlicmVhazsKIAljYXNlIDYyOiAvKiBtcHBfdWFydDEgKi8KLQkJbWFzayA9IERPVkVfVUFSVDFfR1BJT19TRUw7CisJCW1hc2sgPSBVQVJUMV9HUElPX1NFTDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMjksMjcgKzE0NCwyNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRvdmVfbXBwNF9jdHJsX3NldChzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgKmN0cmwsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGNvbmZpZykKK3N0YXRpYyBpbnQgZG92ZV9tcHA0X2N0cmxfc2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyBjb25maWcpCiB7Ci0JdW5zaWduZWQgbG9uZyBtcHA0ID0gcmVhZGwoRE9WRV9NUFBfQ1RSTDRfVklSVF9CQVNFKTsKKwl1bnNpZ25lZCBsb25nIG1wcDQgPSByZWFkbChtcHA0X2Jhc2UpOwogCXVuc2lnbmVkIGxvbmcgbWFzazsKIAotCXN3aXRjaCAoY3RybC0+cGlkKSB7CisJc3dpdGNoIChwaWQpIHsKIAljYXNlIDI0OiAvKiBtcHBfY2FtZXJhICovCi0JCW1hc2sgPSBET1ZFX0NBTV9HUElPX1NFTDsKKwkJbWFzayA9IENBTV9HUElPX1NFTDsKIAkJYnJlYWs7CiAJY2FzZSA0MDogLyogbXBwX3NkaW8wICovCi0JCW1hc2sgPSBET1ZFX1NEMF9HUElPX1NFTDsKKwkJbWFzayA9IFNEMF9HUElPX1NFTDsKIAkJYnJlYWs7CiAJY2FzZSA0NjogLyogbXBwX3NkaW8xICovCi0JCW1hc2sgPSBET1ZFX1NEMV9HUElPX1NFTDsKKwkJbWFzayA9IFNEMV9HUElPX1NFTDsKIAkJYnJlYWs7CiAJY2FzZSA1ODogLyogbXBwX3NwaTAgKi8KLQkJbWFzayA9IERPVkVfU1BJX0dQSU9fU0VMOworCQltYXNrID0gU1BJX0dQSU9fU0VMOwogCQlicmVhazsKIAljYXNlIDYyOiAvKiBtcHBfdWFydDEgKi8KLQkJbWFzayA9IERPVkVfVUFSVDFfR1BJT19TRUw7CisJCW1hc2sgPSBVQVJUMV9HUElPX1NFTDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNTksNzQgKzE3Myw2OSBAQAogCWlmIChjb25maWcpCiAJCW1wcDQgfD0gbWFzazsKIAotCXdyaXRlbChtcHA0LCBET1ZFX01QUF9DVFJMNF9WSVJUX0JBU0UpOworCXdyaXRlbChtcHA0LCBtcHA0X2Jhc2UpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZG92ZV9uYW5kX2N0cmxfZ2V0KHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKK3N0YXRpYyBpbnQgZG92ZV9uYW5kX2N0cmxfZ2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQogewotCXVuc2lnbmVkIGxvbmcgZ21wcCA9IHJlYWRsKERPVkVfTVBQX0dFTkVSQUxfVklSVF9CQVNFKTsKKwl1bnNpZ25lZCBpbnQgZ21wcDsKIAotCSpjb25maWcgPSAoKGdtcHAgJiBET1ZFX05BTkRfR1BJT19FTikgIT0gMCk7CisJcmVnbWFwX3JlYWQoZ2NvbmZtYXAsIE1QUF9HRU5FUkFMX0NPTkZJRywgJmdtcHApOworCSpjb25maWcgPSAoKGdtcHAgJiBOQU5EX0dQSU9fRU4pICE9IDApOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZG92ZV9uYW5kX2N0cmxfc2V0KHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY29uZmlnKQorc3RhdGljIGludCBkb3ZlX25hbmRfY3RybF9zZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nIGNvbmZpZykKIHsKLQl1bnNpZ25lZCBsb25nIGdtcHAgPSByZWFkbChET1ZFX01QUF9HRU5FUkFMX1ZJUlRfQkFTRSk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKGdjb25mbWFwLCBNUFBfR0VORVJBTF9DT05GSUcsCisJCQkgICBOQU5EX0dQSU9fRU4sCisJCQkgICAoY29uZmlnKSA/IE5BTkRfR1BJT19FTiA6IDApOworCXJldHVybiAwOworfQogCi0JZ21wcCAmPSB+RE9WRV9OQU5EX0dQSU9fRU47CitzdGF0aWMgaW50IGRvdmVfYXVkaW8wX2N0cmxfZ2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQoreworCXVuc2lnbmVkIGxvbmcgcG11ID0gcmVhZGwobXBwX2Jhc2UgKyBQTVVfTVBQX0dFTkVSQUxfQ1RSTCk7CisKKwkqY29uZmlnID0gKChwbXUgJiBBVTBfQUM5N19TRUwpICE9IDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG92ZV9hdWRpbzBfY3RybF9zZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nIGNvbmZpZykKK3sKKwl1bnNpZ25lZCBsb25nIHBtdSA9IHJlYWRsKG1wcF9iYXNlICsgUE1VX01QUF9HRU5FUkFMX0NUUkwpOworCisJcG11ICY9IH5BVTBfQUM5N19TRUw7CiAJaWYgKGNvbmZpZykKLQkJZ21wcCB8PSBET1ZFX05BTkRfR1BJT19FTjsKLQotCXdyaXRlbChnbXBwLCBET1ZFX01QUF9HRU5FUkFMX1ZJUlRfQkFTRSk7CisJCXBtdSB8PSBBVTBfQUM5N19TRUw7CisJd3JpdGVsKHBtdSwgbXBwX2Jhc2UgKyBQTVVfTVBQX0dFTkVSQUxfQ1RSTCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkb3ZlX2F1ZGlvMF9jdHJsX2dldChzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgKmN0cmwsCi0JCQkJdW5zaWduZWQgbG9uZyAqY29uZmlnKQorc3RhdGljIGludCBkb3ZlX2F1ZGlvMV9jdHJsX2dldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKIHsKLQl1bnNpZ25lZCBsb25nIHBtdSA9IHJlYWRsKERPVkVfUE1VX01QUF9HRU5FUkFMX0NUUkwpOworCXVuc2lnbmVkIGludCBtcHA0ID0gcmVhZGwobXBwNF9iYXNlKTsKKwl1bnNpZ25lZCBpbnQgc3NwYzE7CisJdW5zaWduZWQgaW50IGdtcHA7CisJdW5zaWduZWQgaW50IGdjZmcyOwogCi0JKmNvbmZpZyA9ICgocG11ICYgRE9WRV9BVTBfQUM5N19TRUwpICE9IDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZG92ZV9hdWRpbzBfY3RybF9zZXQoc3RydWN0IG12ZWJ1X21wcF9jdHJsICpjdHJsLAotCQkJCXVuc2lnbmVkIGxvbmcgY29uZmlnKQotewotCXVuc2lnbmVkIGxvbmcgcG11ID0gcmVhZGwoRE9WRV9QTVVfTVBQX0dFTkVSQUxfQ1RSTCk7Ci0KLQlwbXUgJj0gfkRPVkVfQVUwX0FDOTdfU0VMOwotCWlmIChjb25maWcpCi0JCXBtdSB8PSBET1ZFX0FVMF9BQzk3X1NFTDsKLQl3cml0ZWwocG11LCBET1ZFX1BNVV9NUFBfR0VORVJBTF9DVFJMKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRvdmVfYXVkaW8xX2N0cmxfZ2V0KHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwKLQkJCQl1bnNpZ25lZCBsb25nICpjb25maWcpCi17Ci0JdW5zaWduZWQgbG9uZyBtcHA0ID0gcmVhZGwoRE9WRV9NUFBfQ1RSTDRfVklSVF9CQVNFKTsKLQl1bnNpZ25lZCBsb25nIHNzcGMxID0gcmVhZGwoRE9WRV9TU1BfQ1RSTF9TVEFUVVNfMSk7Ci0JdW5zaWduZWQgbG9uZyBnbXBwID0gcmVhZGwoRE9WRV9NUFBfR0VORVJBTF9WSVJUX0JBU0UpOwotCXVuc2lnbmVkIGxvbmcgZ2NmZzIgPSByZWFkbChET1ZFX0dMT0JBTF9DT05GSUdfMik7CisJcmVnbWFwX3JlYWQoZ2NvbmZtYXAsIFNTUF9DVFJMX1NUQVRVU18xLCAmc3NwYzEpOworCXJlZ21hcF9yZWFkKGdjb25mbWFwLCBNUFBfR0VORVJBTF9DT05GSUcsICZnbXBwKTsKKwlyZWdtYXBfcmVhZChnY29uZm1hcCwgR0xPQkFMX0NPTkZJR18yLCAmZ2NmZzIpOwogCiAJKmNvbmZpZyA9IDA7Ci0JaWYgKG1wcDQgJiBET1ZFX0FVMV9HUElPX1NFTCkKKwlpZiAobXBwNCAmIEFVMV9HUElPX1NFTCkKIAkJKmNvbmZpZyB8PSBCSVQoMyk7Ci0JaWYgKHNzcGMxICYgRE9WRV9TU1BfT05fQVUxKQorCWlmIChzc3BjMSAmIFNTUF9PTl9BVTEpCiAJCSpjb25maWcgfD0gQklUKDIpOwotCWlmIChnbXBwICYgRE9WRV9BVTFfU1BESUZPX0dQSU9fRU4pCisJaWYgKGdtcHAgJiBBVTFfU1BESUZPX0dQSU9fRU4pCiAJCSpjb25maWcgfD0gQklUKDEpOwotCWlmIChnY2ZnMiAmIERPVkVfVFdTSV9PUFRJT04zX0dQSU8pCisJaWYgKGdjZmcyICYgVFdTSV9PUFRJT04zX0dQSU8pCiAJCSpjb25maWcgfD0gQklUKDApOwogCiAJLyogU1NQL1RXU0kgb25seSBpZiBJMlMxIG5vdCBzZXQqLwpAQCAtMjM4LDM1ICsyNDcsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkb3ZlX2F1ZGlvMV9jdHJsX3NldChzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgKmN0cmwsCi0JCQkJdW5zaWduZWQgbG9uZyBjb25maWcpCitzdGF0aWMgaW50IGRvdmVfYXVkaW8xX2N0cmxfc2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyBjb25maWcpCiB7Ci0JdW5zaWduZWQgbG9uZyBtcHA0ID0gcmVhZGwoRE9WRV9NUFBfQ1RSTDRfVklSVF9CQVNFKTsKLQl1bnNpZ25lZCBsb25nIHNzcGMxID0gcmVhZGwoRE9WRV9TU1BfQ1RSTF9TVEFUVVNfMSk7Ci0JdW5zaWduZWQgbG9uZyBnbXBwID0gcmVhZGwoRE9WRV9NUFBfR0VORVJBTF9WSVJUX0JBU0UpOwotCXVuc2lnbmVkIGxvbmcgZ2NmZzIgPSByZWFkbChET1ZFX0dMT0JBTF9DT05GSUdfMik7CisJdW5zaWduZWQgaW50IG1wcDQgPSByZWFkbChtcHA0X2Jhc2UpOwogCi0JLyoKLQkgKiBjbGVhciBhbGwgYXVkaW8xIHJlbGF0ZWQgYml0cyBiZWZvcmUgY29uZmlndXJlCi0JICovCi0JZ2NmZzIgJj0gfkRPVkVfVFdTSV9PUFRJT04zX0dQSU87Ci0JZ21wcCAmPSB+RE9WRV9BVTFfU1BESUZPX0dQSU9fRU47Ci0Jc3NwYzEgJj0gfkRPVkVfU1NQX09OX0FVMTsKLQltcHA0ICY9IH5ET1ZFX0FVMV9HUElPX1NFTDsKLQotCWlmIChjb25maWcgJiBCSVQoMCkpCi0JCWdjZmcyIHw9IERPVkVfVFdTSV9PUFRJT04zX0dQSU87Ci0JaWYgKGNvbmZpZyAmIEJJVCgxKSkKLQkJZ21wcCB8PSBET1ZFX0FVMV9TUERJRk9fR1BJT19FTjsKLQlpZiAoY29uZmlnICYgQklUKDIpKQotCQlzc3BjMSB8PSBET1ZFX1NTUF9PTl9BVTE7CisJbXBwNCAmPSB+QVUxX0dQSU9fU0VMOwogCWlmIChjb25maWcgJiBCSVQoMykpCi0JCW1wcDQgfD0gRE9WRV9BVTFfR1BJT19TRUw7CisJCW1wcDQgfD0gQVUxX0dQSU9fU0VMOworCXdyaXRlbChtcHA0LCBtcHA0X2Jhc2UpOwogCi0Jd3JpdGVsKG1wcDQsIERPVkVfTVBQX0NUUkw0X1ZJUlRfQkFTRSk7Ci0Jd3JpdGVsKHNzcGMxLCBET1ZFX1NTUF9DVFJMX1NUQVRVU18xKTsKLQl3cml0ZWwoZ21wcCwgRE9WRV9NUFBfR0VORVJBTF9WSVJUX0JBU0UpOwotCXdyaXRlbChnY2ZnMiwgRE9WRV9HTE9CQUxfQ09ORklHXzIpOworCXJlZ21hcF91cGRhdGVfYml0cyhnY29uZm1hcCwgU1NQX0NUUkxfU1RBVFVTXzEsCisJCQkgICBTU1BfT05fQVUxLAorCQkJICAgKGNvbmZpZyAmIEJJVCgyKSkgPyBTU1BfT05fQVUxIDogMCk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKGdjb25mbWFwLCBNUFBfR0VORVJBTF9DT05GSUcsCisJCQkgICBBVTFfU1BESUZPX0dQSU9fRU4sCisJCQkgICAoY29uZmlnICYgQklUKDEpKSA/IEFVMV9TUERJRk9fR1BJT19FTiA6IDApOworCXJlZ21hcF91cGRhdGVfYml0cyhnY29uZm1hcCwgR0xPQkFMX0NPTkZJR18yLAorCQkJICAgVFdTSV9PUFRJT04zX0dQSU8sCisJCQkgICAoY29uZmlnICYgQklUKDApKSA/IFRXU0lfT1BUSU9OM19HUElPIDogMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI3NiwxMSArMjc0LDExIEBACiAgKiBicmVhayBvdGhlciBmdW5jdGlvbnMuIElmIHlvdSByZXF1aXJlIGFsbCBtcHBzIGFzIGdwaW8KICAqIGVuZm9yY2UgZ3BpbyBzZXR0aW5nIGJ5IHBpbmN0cmwgbWFwcGluZy4KICAqLwotc3RhdGljIGludCBkb3ZlX2F1ZGlvMV9jdHJsX2dwaW9fcmVxKHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwgdTggcGlkKQorc3RhdGljIGludCBkb3ZlX2F1ZGlvMV9jdHJsX2dwaW9fcmVxKHVuc2lnbmVkIHBpZCkKIHsKIAl1bnNpZ25lZCBsb25nIGNvbmZpZzsKIAotCWRvdmVfYXVkaW8xX2N0cmxfZ2V0KGN0cmwsICZjb25maWcpOworCWRvdmVfYXVkaW8xX2N0cmxfZ2V0KHBpZCwgJmNvbmZpZyk7CiAKIAlzd2l0Y2ggKGNvbmZpZykgewogCWNhc2UgMHgwMjogLyogaTJzMSA6IGdwaW9bNTY6NTddICovCkBAIC0zMDMsNzYgKzMwMSw2MiBAQAogfQogCiAvKiBtcHBbNTI6NTddIGhhcyBncGlvIHBpbnMgY2FwYWJsZSBvZiBpbiBhbmQgb3V0ICovCi1zdGF0aWMgaW50IGRvdmVfYXVkaW8xX2N0cmxfZ3Bpb19kaXIoc3RydWN0IG12ZWJ1X21wcF9jdHJsICpjdHJsLCB1OCBwaWQsCi0JCQkJYm9vbCBpbnB1dCkKK3N0YXRpYyBpbnQgZG92ZV9hdWRpbzFfY3RybF9ncGlvX2Rpcih1bnNpZ25lZCBwaWQsIGJvb2wgaW5wdXQpCiB7CiAJaWYgKHBpZCA8IDUyIHx8IHBpZCA+IDU3KQogCQlyZXR1cm4gLUVOT1RTVVBQOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRvdmVfdHdzaV9jdHJsX2dldChzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgKmN0cmwsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nICpjb25maWcpCitzdGF0aWMgaW50IGRvdmVfdHdzaV9jdHJsX2dldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKIHsKLQl1bnNpZ25lZCBsb25nIGdjZmcxID0gcmVhZGwoRE9WRV9HTE9CQUxfQ09ORklHXzEpOwotCXVuc2lnbmVkIGxvbmcgZ2NmZzIgPSByZWFkbChET1ZFX0dMT0JBTF9DT05GSUdfMik7CisJdW5zaWduZWQgaW50IGdjZmcxOworCXVuc2lnbmVkIGludCBnY2ZnMjsKKworCXJlZ21hcF9yZWFkKGdjb25mbWFwLCBHTE9CQUxfQ09ORklHXzEsICZnY2ZnMSk7CisJcmVnbWFwX3JlYWQoZ2NvbmZtYXAsIEdMT0JBTF9DT05GSUdfMiwgJmdjZmcyKTsKIAogCSpjb25maWcgPSAwOwotCWlmIChnY2ZnMSAmIERPVkVfVFdTSV9FTkFCTEVfT1BUSU9OMSkKKwlpZiAoZ2NmZzEgJiBUV1NJX0VOQUJMRV9PUFRJT04xKQogCQkqY29uZmlnID0gMTsKLQllbHNlIGlmIChnY2ZnMiAmIERPVkVfVFdTSV9FTkFCTEVfT1BUSU9OMikKKwllbHNlIGlmIChnY2ZnMiAmIFRXU0lfRU5BQkxFX09QVElPTjIpCiAJCSpjb25maWcgPSAyOwotCWVsc2UgaWYgKGdjZmcyICYgRE9WRV9UV1NJX0VOQUJMRV9PUFRJT04zKQorCWVsc2UgaWYgKGdjZmcyICYgVFdTSV9FTkFCTEVfT1BUSU9OMykKIAkJKmNvbmZpZyA9IDM7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkb3ZlX3R3c2lfY3RybF9zZXQoc3RydWN0IG12ZWJ1X21wcF9jdHJsICpjdHJsLAotCQkJCXVuc2lnbmVkIGxvbmcgY29uZmlnKQorc3RhdGljIGludCBkb3ZlX3R3c2lfY3RybF9zZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nIGNvbmZpZykKIHsKLQl1bnNpZ25lZCBsb25nIGdjZmcxID0gcmVhZGwoRE9WRV9HTE9CQUxfQ09ORklHXzEpOwotCXVuc2lnbmVkIGxvbmcgZ2NmZzIgPSByZWFkbChET1ZFX0dMT0JBTF9DT05GSUdfMik7Ci0KLQlnY2ZnMSAmPSB+RE9WRV9UV1NJX0VOQUJMRV9PUFRJT04xOwotCWdjZmcyICY9IH4oRE9WRV9UV1NJX0VOQUJMRV9PUFRJT04yIHwgRE9WRV9UV1NJX0VOQUJMRV9PUFRJT04zKTsKKwl1bnNpZ25lZCBpbnQgZ2NmZzEgPSAwOworCXVuc2lnbmVkIGludCBnY2ZnMiA9IDA7CiAKIAlzd2l0Y2ggKGNvbmZpZykgewogCWNhc2UgMToKLQkJZ2NmZzEgfD0gRE9WRV9UV1NJX0VOQUJMRV9PUFRJT04xOworCQlnY2ZnMSA9IFRXU0lfRU5BQkxFX09QVElPTjE7CiAJCWJyZWFrOwogCWNhc2UgMjoKLQkJZ2NmZzIgfD0gRE9WRV9UV1NJX0VOQUJMRV9PUFRJT04yOworCQlnY2ZnMiA9IFRXU0lfRU5BQkxFX09QVElPTjI7CiAJCWJyZWFrOwogCWNhc2UgMzoKLQkJZ2NmZzIgfD0gRE9WRV9UV1NJX0VOQUJMRV9PUFRJT04zOworCQlnY2ZnMiA9IFRXU0lfRU5BQkxFX09QVElPTjM7CiAJCWJyZWFrOwogCX0KIAotCXdyaXRlbChnY2ZnMSwgRE9WRV9HTE9CQUxfQ09ORklHXzEpOwotCXdyaXRlbChnY2ZnMiwgRE9WRV9HTE9CQUxfQ09ORklHXzIpOworCXJlZ21hcF91cGRhdGVfYml0cyhnY29uZm1hcCwgR0xPQkFMX0NPTkZJR18xLAorCQkJICAgVFdTSV9FTkFCTEVfT1BUSU9OMSwKKwkJCSAgIGdjZmcxKTsKKwlyZWdtYXBfdXBkYXRlX2JpdHMoZ2NvbmZtYXAsIEdMT0JBTF9DT05GSUdfMiwKKwkJCSAgIFRXU0lfRU5BQkxFX09QVElPTjIgfCBUV1NJX0VOQUJMRV9PUFRJT04zLAorCQkJICAgZ2NmZzIpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgZG92ZV9tcHBfY29udHJvbHNbXSA9IHsKLQlNUFBfRlVOQ19DVFJMKDAsIDAsICJtcHAwIiwgZG92ZV9wbXVfbXBwX2N0cmwpLAotCU1QUF9GVU5DX0NUUkwoMSwgMSwgIm1wcDEiLCBkb3ZlX3BtdV9tcHBfY3RybCksCi0JTVBQX0ZVTkNfQ1RSTCgyLCAyLCAibXBwMiIsIGRvdmVfcG11X21wcF9jdHJsKSwKLQlNUFBfRlVOQ19DVFJMKDMsIDMsICJtcHAzIiwgZG92ZV9wbXVfbXBwX2N0cmwpLAotCU1QUF9GVU5DX0NUUkwoNCwgNCwgIm1wcDQiLCBkb3ZlX3BtdV9tcHBfY3RybCksCi0JTVBQX0ZVTkNfQ1RSTCg1LCA1LCAibXBwNSIsIGRvdmVfcG11X21wcF9jdHJsKSwKLQlNUFBfRlVOQ19DVFJMKDYsIDYsICJtcHA2IiwgZG92ZV9wbXVfbXBwX2N0cmwpLAotCU1QUF9GVU5DX0NUUkwoNywgNywgIm1wcDciLCBkb3ZlX3BtdV9tcHBfY3RybCksCi0JTVBQX0ZVTkNfQ1RSTCg4LCA4LCAibXBwOCIsIGRvdmVfcG11X21wcF9jdHJsKSwKLQlNUFBfRlVOQ19DVFJMKDksIDksICJtcHA5IiwgZG92ZV9wbXVfbXBwX2N0cmwpLAotCU1QUF9GVU5DX0NUUkwoMTAsIDEwLCAibXBwMTAiLCBkb3ZlX3BtdV9tcHBfY3RybCksCi0JTVBQX0ZVTkNfQ1RSTCgxMSwgMTEsICJtcHAxMSIsIGRvdmVfcG11X21wcF9jdHJsKSwKLQlNUFBfRlVOQ19DVFJMKDEyLCAxMiwgIm1wcDEyIiwgZG92ZV9wbXVfbXBwX2N0cmwpLAotCU1QUF9GVU5DX0NUUkwoMTMsIDEzLCAibXBwMTMiLCBkb3ZlX3BtdV9tcHBfY3RybCksCi0JTVBQX0ZVTkNfQ1RSTCgxNCwgMTQsICJtcHAxNCIsIGRvdmVfcG11X21wcF9jdHJsKSwKLQlNUFBfRlVOQ19DVFJMKDE1LCAxNSwgIm1wcDE1IiwgZG92ZV9wbXVfbXBwX2N0cmwpLAotCU1QUF9SRUdfQ1RSTCgxNiwgMjMpLAorCU1QUF9GVU5DX0NUUkwoMCwgMTUsIE5VTEwsIGRvdmVfcG11X21wcF9jdHJsKSwKKwlNUFBfRlVOQ19DVFJMKDE2LCAyMywgTlVMTCwgZG92ZV9tcHBfY3RybCksCiAJTVBQX0ZVTkNfQ1RSTCgyNCwgMzksICJtcHBfY2FtZXJhIiwgZG92ZV9tcHA0X2N0cmwpLAogCU1QUF9GVU5DX0NUUkwoNDAsIDQ1LCAibXBwX3NkaW8wIiwgZG92ZV9tcHA0X2N0cmwpLAogCU1QUF9GVU5DX0NUUkwoNDYsIDUxLCAibXBwX3NkaW8xIiwgZG92ZV9tcHA0X2N0cmwpLApAQCAtNzcyLDggKzc1NiwxNyBAQAogCXsgfQogfTsKIAorc3RhdGljIHN0cnVjdCByZWdtYXBfY29uZmlnIGdjX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gMzIsCisJLnZhbF9iaXRzID0gMzIsCisJLnJlZ19zdHJpZGUgPSA0LAorCS5tYXhfcmVnaXN0ZXIgPSA1LAorfTsKKwogc3RhdGljIGludCBkb3ZlX3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgKm1wcF9yZXM7CisJc3RydWN0IHJlc291cmNlIGZiX3JlczsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCA9CiAJCW9mX21hdGNoX2RldmljZShkb3ZlX3BpbmN0cmxfb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOwogCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gKHZvaWQgKiltYXRjaC0+ZGF0YTsKQEAgLTc4OSw2ICs3ODIsNTkgQEAKIAl9CiAJY2xrX3ByZXBhcmVfZW5hYmxlKGNsayk7CiAKKwltcHBfcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwltcHBfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCBtcHBfcmVzKTsKKwlpZiAoSVNfRVJSKG1wcF9iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIobXBwX2Jhc2UpOworCisJLyogcHJlcGFyZSBmYWxsYmFjayByZXNvdXJjZSAqLworCW1lbWNweSgmZmJfcmVzLCBtcHBfcmVzLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CisJZmJfcmVzLnN0YXJ0ID0gMDsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImZhbGxpbmcgYmFjayB0byBoYXJkY29kZWQgTVBQNCByZXNvdXJjZVxuIik7CisJCWFkanVzdF9yZXNvdXJjZSgmZmJfcmVzLAorCQkJKG1wcF9yZXMtPnN0YXJ0ICYgSU5UX1JFR1NfTUFTSykgKyBNUFA0X1JFR1NfT0ZGUywgMHg0KTsKKwkJcmVzID0gJmZiX3JlczsKKwl9CisKKwltcHA0X2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKG1wcDRfYmFzZSkpCisJCXJldHVybiBQVFJfRVJSKG1wcDRfYmFzZSk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDIpOworCWlmICghcmVzKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJmYWxsaW5nIGJhY2sgdG8gaGFyZGNvZGVkIFBNVSByZXNvdXJjZVxuIik7CisJCWFkanVzdF9yZXNvdXJjZSgmZmJfcmVzLAorCQkJKG1wcF9yZXMtPnN0YXJ0ICYgSU5UX1JFR1NfTUFTSykgKyBQTVVfUkVHU19PRkZTLCAweDgpOworCQlyZXMgPSAmZmJfcmVzOworCX0KKworCXBtdV9iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihwbXVfYmFzZSkpCisJCXJldHVybiBQVFJfRVJSKHBtdV9iYXNlKTsKKworCWdjb25mbWFwID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfY29tcGF0aWJsZSgibWFydmVsbCxkb3ZlLWdsb2JhbC1jb25maWciKTsKKwlpZiAoSVNfRVJSKGdjb25mbWFwKSkgeworCQl2b2lkIF9faW9tZW0gKmdjX2Jhc2U7CisKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImZhbGxpbmcgYmFjayB0byBoYXJkY29kZWQgZ2xvYmFsIHJlZ2lzdGVyc1xuIik7CisJCWFkanVzdF9yZXNvdXJjZSgmZmJfcmVzLAorCQkJKG1wcF9yZXMtPnN0YXJ0ICYgSU5UX1JFR1NfTUFTSykgKyBHQ19SRUdTX09GRlMsIDB4MTQpOworCQlnY19iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsICZmYl9yZXMpOworCQlpZiAoSVNfRVJSKGdjX2Jhc2UpKQorCQkJcmV0dXJuIFBUUl9FUlIoZ2NfYmFzZSk7CisJCWdjb25mbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9tbWlvKCZwZGV2LT5kZXYsCisJCQkJCQkgZ2NfYmFzZSwgJmdjX3JlZ21hcF9jb25maWcpOworCQlpZiAoSVNfRVJSKGdjb25mbWFwKSkKKwkJCXJldHVybiBQVFJfRVJSKGdjb25mbWFwKTsKKwl9CisKKwkvKiBXYXJuIG9uIGFueSBtaXNzaW5nIERUIHJlc291cmNlICovCisJaWYgKGZiX3Jlcy5zdGFydCkKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgRldfQlVHICJNaXNzaW5nIHBpbmN0cmwgcmVncyBpbiBEVEIuIFBsZWFzZSB1cGRhdGUgeW91ciBmaXJtd2FyZS5cbiIpOworCiAJcmV0dXJuIG12ZWJ1X3BpbmN0cmxfcHJvYmUocGRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWtpcmt3b29kLmMgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1raXJrd29vZC5jCmluZGV4IDZiNTA0YjUuLjBkMDIxMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWtpcmt3b29kLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwta2lya3dvb2QuYwpAQCAtMjEsNiArMjEsMTggQEAKIAogI2luY2x1ZGUgInBpbmN0cmwtbXZlYnUuaCIKIAorc3RhdGljIHZvaWQgX19pb21lbSAqbXBwX2Jhc2U7CisKK3N0YXRpYyBpbnQga2lya3dvb2RfbXBwX2N0cmxfZ2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQoreworCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX2dldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOworfQorCitzdGF0aWMgaW50IGtpcmt3b29kX21wcF9jdHJsX3NldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgY29uZmlnKQoreworCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX3NldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOworfQorCiAjZGVmaW5lIFYoZjYxODAsIGY2MTkwLCBmNjE5MiwgZjYyODEsIGY2MjgyLCBkeDQxMjIpCVwKIAkoKGY2MTgwIDw8IDApIHwgKGY2MTkwIDw8IDEpIHwgKGY2MTkyIDw8IDIpIHwJXAogCSAoZjYyODEgPDwgMykgfCAoZjYyODIgPDwgNCkgfCAoZHg0MTIyIDw8IDUpKQpAQCAtMzU5LDcgKzM3MSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IG12ZWJ1X21wcF9jdHJsIG12ODhmNjE4MF9tcHBfY29udHJvbHNbXSA9IHsKLQlNUFBfUkVHX0NUUkwoMCwgMjkpLAorCU1QUF9GVU5DX0NUUkwoMCwgMjksIE5VTEwsIGtpcmt3b29kX21wcF9jdHJsKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlIG12ODhmNjE4MF9ncGlvX3Jhbmdlc1tdID0gewpAQCAtMzY3LDcgKzM3OSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IG12ZWJ1X21wcF9jdHJsIG12ODhmNjE5eF9tcHBfY29udHJvbHNbXSA9IHsKLQlNUFBfUkVHX0NUUkwoMCwgMzUpLAorCU1QUF9GVU5DX0NUUkwoMCwgMzUsIE5VTEwsIGtpcmt3b29kX21wcF9jdHJsKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlIG12ODhmNjE5eF9ncGlvX3Jhbmdlc1tdID0gewpAQCAtMzc2LDcgKzM4OCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IG12ZWJ1X21wcF9jdHJsIG12ODhmNjI4eF9tcHBfY29udHJvbHNbXSA9IHsKLQlNUFBfUkVHX0NUUkwoMCwgNDkpLAorCU1QUF9GVU5DX0NUUkwoMCwgNDksIE5VTEwsIGtpcmt3b29kX21wcF9jdHJsKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlIG12ODhmNjI4eF9ncGlvX3Jhbmdlc1tdID0gewpAQCAtNDU2LDkgKzQ2OCwxNiBAQAogCiBzdGF0aWMgaW50IGtpcmt3b29kX3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCA9CiAJCW9mX21hdGNoX2RldmljZShraXJrd29vZF9waW5jdHJsX29mX21hdGNoLCAmcGRldi0+ZGV2KTsKIAlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9ICh2b2lkICopbWF0Y2gtPmRhdGE7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCW1wcF9iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihtcHBfYmFzZSkpCisJCXJldHVybiBQVFJfRVJSKG1wcF9iYXNlKTsKKwogCXJldHVybiBtdmVidV9waW5jdHJsX3Byb2JlKHBkZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1tdmVidS5jIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtbXZlYnUuYwppbmRleCAwZmQxYWQzLi45OTA4Mzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1tdmVidS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLW12ZWJ1LmMKQEAgLTUwLDcgKzUwLDYgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2OwogCXN0cnVjdCBwaW5jdHJsX2Rlc2MgZGVzYzsKLQl2b2lkIF9faW9tZW0gKmJhc2U7CiAJc3RydWN0IG12ZWJ1X3BpbmN0cmxfZ3JvdXAgKmdyb3VwczsKIAl1bnNpZ25lZCBudW1fZ3JvdXBzOwogCXN0cnVjdCBtdmVidV9waW5jdHJsX2Z1bmN0aW9uICpmdW5jdGlvbnM7CkBAIC0xMzgsNDMgKzEzNyw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qCi0gKiBDb21tb24gbXBwIHBpbiBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBvbiBNVkVCVSBhcmUKLSAqIHJlZ2lzdGVycyBvZiBlaWdodCA0LWJpdCB2YWx1ZXMgZm9yIGVhY2ggbXBwIHNldHRpbmcuCi0gKiBSZWdpc3RlciBvZmZzZXQgYW5kIGJpdCBtYXNrIGFyZSBjYWxjdWxhdGVkIGFjY29yZGluZ2x5IGJlbG93LgotICovCi1zdGF0aWMgaW50IG12ZWJ1X2NvbW1vbl9tcHBfZ2V0KHN0cnVjdCBtdmVidV9waW5jdHJsICpwY3RsLAotCQkJCXN0cnVjdCBtdmVidV9waW5jdHJsX2dyb3VwICpncnAsCi0JCQkJdW5zaWduZWQgbG9uZyAqY29uZmlnKQotewotCXVuc2lnbmVkIHBpbiA9IGdycC0+Z2lkOwotCXVuc2lnbmVkIG9mZiA9IChwaW4gLyBNUFBTX1BFUl9SRUcpICogTVBQX0JJVFM7Ci0JdW5zaWduZWQgc2hpZnQgPSAocGluICUgTVBQU19QRVJfUkVHKSAqIE1QUF9CSVRTOwotCi0JKmNvbmZpZyA9IHJlYWRsKHBjdGwtPmJhc2UgKyBvZmYpOwotCSpjb25maWcgPj49IHNoaWZ0OwotCSpjb25maWcgJj0gTVBQX01BU0s7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtdmVidV9jb21tb25fbXBwX3NldChzdHJ1Y3QgbXZlYnVfcGluY3RybCAqcGN0bCwKLQkJCQlzdHJ1Y3QgbXZlYnVfcGluY3RybF9ncm91cCAqZ3JwLAotCQkJCXVuc2lnbmVkIGxvbmcgY29uZmlnKQotewotCXVuc2lnbmVkIHBpbiA9IGdycC0+Z2lkOwotCXVuc2lnbmVkIG9mZiA9IChwaW4gLyBNUFBTX1BFUl9SRUcpICogTVBQX0JJVFM7Ci0JdW5zaWduZWQgc2hpZnQgPSAocGluICUgTVBQU19QRVJfUkVHKSAqIE1QUF9CSVRTOwotCXVuc2lnbmVkIGxvbmcgcmVnOwotCi0JcmVnID0gcmVhZGwocGN0bC0+YmFzZSArIG9mZik7Ci0JcmVnICY9IH4oTVBQX01BU0sgPDwgc2hpZnQpOwotCXJlZyB8PSAoY29uZmlnIDw8IHNoaWZ0KTsKLQl3cml0ZWwocmVnLCBwY3RsLT5iYXNlICsgb2ZmKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG12ZWJ1X3BpbmNvbmZfZ3JvdXBfZ2V0KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKIAkJCQl1bnNpZ25lZCBnaWQsIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKIHsKQEAgLTE4NCwxMCArMTQ2LDcgQEAKIAlpZiAoIWdycC0+Y3RybCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoZ3JwLT5jdHJsLT5tcHBfZ2V0KQotCQlyZXR1cm4gZ3JwLT5jdHJsLT5tcHBfZ2V0KGdycC0+Y3RybCwgY29uZmlnKTsKLQotCXJldHVybiBtdmVidV9jb21tb25fbXBwX2dldChwY3RsLCBncnAsIGNvbmZpZyk7CisJcmV0dXJuIGdycC0+Y3RybC0+bXBwX2dldChncnAtPnBpbnNbMF0sIGNvbmZpZyk7CiB9CiAKIHN0YXRpYyBpbnQgbXZlYnVfcGluY29uZl9ncm91cF9zZXQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LApAQCAtMjAyLDExICsxNjEsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWZvciAoaSA9IDA7IGkgPCBudW1fY29uZmlnczsgaSsrKSB7Ci0JCWlmIChncnAtPmN0cmwtPm1wcF9zZXQpCi0JCQlyZXQgPSBncnAtPmN0cmwtPm1wcF9zZXQoZ3JwLT5jdHJsLCBjb25maWdzW2ldKTsKLQkJZWxzZQotCQkJcmV0ID0gbXZlYnVfY29tbW9uX21wcF9zZXQocGN0bCwgZ3JwLCBjb25maWdzW2ldKTsKLQorCQlyZXQgPSBncnAtPmN0cmwtPm1wcF9zZXQoZ3JwLT5waW5zWzBdLCBjb25maWdzW2ldKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfSAvKiBmb3IgZWFjaCBjb25maWcgKi8KQEAgLTM0Nyw3ICszMDIsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChncnAtPmN0cmwtPm1wcF9ncGlvX3JlcSkKLQkJcmV0dXJuIGdycC0+Y3RybC0+bXBwX2dwaW9fcmVxKGdycC0+Y3RybCwgb2Zmc2V0KTsKKwkJcmV0dXJuIGdycC0+Y3RybC0+bXBwX2dwaW9fcmVxKG9mZnNldCk7CiAKIAlzZXR0aW5nID0gbXZlYnVfcGluY3RybF9maW5kX2dwaW9fc2V0dGluZyhwY3RsLCBncnApOwogCWlmICghc2V0dGluZykKQEAgLTM3MCw3ICszMjUsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChncnAtPmN0cmwtPm1wcF9ncGlvX2RpcikKLQkJcmV0dXJuIGdycC0+Y3RybC0+bXBwX2dwaW9fZGlyKGdycC0+Y3RybCwgb2Zmc2V0LCBpbnB1dCk7CisJCXJldHVybiBncnAtPmN0cmwtPm1wcF9ncGlvX2RpcihvZmZzZXQsIGlucHV0KTsKIAogCXNldHRpbmcgPSBtdmVidV9waW5jdHJsX2ZpbmRfZ3Bpb19zZXR0aW5nKHBjdGwsIGdycCk7CiAJaWYgKCFzZXR0aW5nKQpAQCAtNTkzLDExICs1NDgsMTIgQEAKIGludCBtdmVidV9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG12ZWJ1X3BpbmN0cmxfc29jX2luZm8gKnNvYyA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7CiAJc3RydWN0IG12ZWJ1X3BpbmN0cmwgKnBjdGw7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlOwogCXN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjICpwZGVzYzsKIAl1bnNpZ25lZCBnaWQsIG4sIGs7CisJdW5zaWduZWQgc2l6ZSwgbm9uYW1lID0gMDsKKwljaGFyICpub25hbWVfYnVmOworCXZvaWQgKnA7CiAJaW50IHJldDsKIAogCWlmICghc29jIHx8ICFzb2MtPmNvbnRyb2xzIHx8ICFzb2MtPm1vZGVzKSB7CkBAIC02MDUsMTEgKzU2MSw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwotCWlmIChJU19FUlIoYmFzZSkpCi0JCXJldHVybiBQVFJfRVJSKGJhc2UpOwotCiAJcGN0bCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IG12ZWJ1X3BpbmN0cmwpLAogCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFwY3RsKSB7CkBAIC02MjMsNyArNTc0LDYgQEAKIAlwY3RsLT5kZXNjLnBteG9wcyA9ICZtdmVidV9waW5tdXhfb3BzOwogCXBjdGwtPmRlc2MuY29uZm9wcyA9ICZtdmVidV9waW5jb25mX29wczsKIAlwY3RsLT52YXJpYW50ID0gc29jLT52YXJpYW50OwotCXBjdGwtPmJhc2UgPSBiYXNlOwogCXBjdGwtPmRldiA9ICZwZGV2LT5kZXY7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGN0bCk7CiAKQEAgLTYzMywzMyArNTgzLDIzIEBACiAJcGN0bC0+ZGVzYy5ucGlucyA9IDA7CiAJZm9yIChuID0gMDsgbiA8IHNvYy0+bmNvbnRyb2xzOyBuKyspIHsKIAkJc3RydWN0IG12ZWJ1X21wcF9jdHJsICpjdHJsID0gJnNvYy0+Y29udHJvbHNbbl07Ci0JCWNoYXIgKm5hbWVzOwogCiAJCXBjdGwtPmRlc2MubnBpbnMgKz0gY3RybC0+bnBpbnM7Ci0JCS8qIGluaXRpYWwgY29udHJvbCBwaW5zICovCisJCS8qIGluaXRpYWxpemUgY29udHJvbCdzIHBpbnNbXSBhcnJheSAqLwogCQlmb3IgKGsgPSAwOyBrIDwgY3RybC0+bnBpbnM7IGsrKykKIAkJCWN0cmwtPnBpbnNba10gPSBjdHJsLT5waWQgKyBrOwogCi0JCS8qIHNwZWNpYWwgc29jIHNwZWNpZmljIGNvbnRyb2wgKi8KLQkJaWYgKGN0cmwtPm1wcF9nZXQgfHwgY3RybC0+bXBwX3NldCkgewotCQkJaWYgKCFjdHJsLT5uYW1lIHx8ICFjdHJsLT5tcHBfZ2V0IHx8ICFjdHJsLT5tcHBfc2V0KSB7Ci0JCQkJZGV2X2VycigmcGRldi0+ZGV2LCAid3Jvbmcgc29jIGNvbnRyb2wgaW5mb1xuIik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9CisJCS8qCisJCSAqIFdlIGFsbG93IHRvIHBhc3MgY29udHJvbHMgd2l0aCBOVUxMIG5hbWUgdGhhdCB3ZSB0cmVhdAorCQkgKiBhcyBhIHJhbmdlIG9mIG9uZS1waW4gZ3JvdXBzIHdpdGggZ2VuZXJpYyBtdmVidSByZWdpc3RlcgorCQkgKiBjb250cm9scy4KKwkJICovCisJCWlmICghY3RybC0+bmFtZSkgeworCQkJcGN0bC0+bnVtX2dyb3VwcyArPSBjdHJsLT5ucGluczsKKwkJCW5vbmFtZSArPSBjdHJsLT5ucGluczsKKwkJfSBlbHNlIHsKIAkJCXBjdGwtPm51bV9ncm91cHMgKz0gMTsKLQkJCWNvbnRpbnVlOwogCQl9Ci0KLQkJLyogZ2VuZXJpYyBtdmVidSByZWdpc3RlciBjb250cm9sICovCi0JCW5hbWVzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIGN0cmwtPm5waW5zICogOCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghbmFtZXMpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvYyBtcHAgbmFtZXNcbiIpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJZm9yIChrID0gMDsgayA8IGN0cmwtPm5waW5zOyBrKyspCi0JCQlzcHJpbnRmKG5hbWVzICsgOCprLCAibXBwJWQiLCBjdHJsLT5waWQrayk7Ci0JCWN0cmwtPm5hbWUgPSBuYW1lczsKLQkJcGN0bC0+bnVtX2dyb3VwcyArPSBjdHJsLT5ucGluczsKIAl9CiAKIAlwZGVzYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBwY3RsLT5kZXNjLm5waW5zICoKQEAgLTY3MywxMiArNjEzLDE3IEBACiAJCXBkZXNjW25dLm51bWJlciA9IG47CiAJcGN0bC0+ZGVzYy5waW5zID0gcGRlc2M7CiAKLQlwY3RsLT5ncm91cHMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgcGN0bC0+bnVtX2dyb3VwcyAqCi0JCQkgICAgIHNpemVvZihzdHJ1Y3QgbXZlYnVfcGluY3RybF9ncm91cCksIEdGUF9LRVJORUwpOwotCWlmICghcGN0bC0+Z3JvdXBzKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvYyBwaW5jdHJsIGdyb3Vwc1xuIik7CisJLyoKKwkgKiBhbGxvY2F0ZSBncm91cHMgYW5kIG5hbWUgYnVmZmVycyBmb3IgdW5uYW1lZCBncm91cHMuCisJICovCisJc2l6ZSA9IHBjdGwtPm51bV9ncm91cHMgKiBzaXplb2YoKnBjdGwtPmdyb3VwcykgKyBub25hbWUgKiA4OworCXAgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvYyBncm91cCBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQorCXBjdGwtPmdyb3VwcyA9IHA7CisJbm9uYW1lX2J1ZiA9IHAgKyBwY3RsLT5udW1fZ3JvdXBzICogc2l6ZW9mKCpwY3RsLT5ncm91cHMpOwogCiAJLyogYXNzaWduIG1wcCBjb250cm9scyB0byBncm91cHMgKi8KIAlnaWQgPSAwOwpAQCAtNjkwLDE3ICs2MzUsMjYgQEAKIAkJcGN0bC0+Z3JvdXBzW2dpZF0ucGlucyA9IGN0cmwtPnBpbnM7CiAJCXBjdGwtPmdyb3Vwc1tnaWRdLm5waW5zID0gY3RybC0+bnBpbnM7CiAKLQkJLyogZ2VuZXJpYyBtdmVidSByZWdpc3RlciBjb250cm9sIG1hcHMgdG8gYSBudW1iZXIgb2YgZ3JvdXBzICovCi0JCWlmICghY3RybC0+bXBwX2dldCAmJiAhY3RybC0+bXBwX3NldCkgeworCQkvKgorCQkgKiBXZSB0cmVhdCB1bm5hbWVkIGNvbnRyb2xzIGFzIGEgcmFuZ2Ugb2Ygb25lLXBpbiBncm91cHMKKwkJICogd2l0aCBnZW5lcmljIG12ZWJ1IHJlZ2lzdGVyIGNvbnRyb2xzLiBVc2Ugb25lIGdyb3VwIGZvcgorCQkgKiBlYWNoIGluIHRoaXMgcmFuZ2UgYW5kIGFzc2lnbiBhIGRlZmF1bHQgZ3JvdXAgbmFtZS4KKwkJICovCisJCWlmICghY3RybC0+bmFtZSkgeworCQkJcGN0bC0+Z3JvdXBzW2dpZF0ubmFtZSA9IG5vbmFtZV9idWY7CiAJCQlwY3RsLT5ncm91cHNbZ2lkXS5ucGlucyA9IDE7CisJCQlzcHJpbnRmKG5vbmFtZV9idWYsICJtcHAlZCIsIGN0cmwtPnBpZCswKTsKKwkJCW5vbmFtZV9idWYgKz0gODsKIAogCQkJZm9yIChrID0gMTsgayA8IGN0cmwtPm5waW5zOyBrKyspIHsKIAkJCQlnaWQrKzsKIAkJCQlwY3RsLT5ncm91cHNbZ2lkXS5naWQgPSBnaWQ7CiAJCQkJcGN0bC0+Z3JvdXBzW2dpZF0uY3RybCA9IGN0cmw7Ci0JCQkJcGN0bC0+Z3JvdXBzW2dpZF0ubmFtZSA9ICZjdHJsLT5uYW1lWzgqa107CisJCQkJcGN0bC0+Z3JvdXBzW2dpZF0ubmFtZSA9IG5vbmFtZV9idWY7CiAJCQkJcGN0bC0+Z3JvdXBzW2dpZF0ucGlucyA9ICZjdHJsLT5waW5zW2tdOwogCQkJCXBjdGwtPmdyb3Vwc1tnaWRdLm5waW5zID0gMTsKKwkJCQlzcHJpbnRmKG5vbmFtZV9idWYsICJtcHAlZCIsIGN0cmwtPnBpZCtrKTsKKwkJCQlub25hbWVfYnVmICs9IDg7CiAJCQl9CiAJCX0KIAkJZ2lkKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1tdmVidS5oIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtbXZlYnUuaAppbmRleCA5MGJkM2JlLi42NWE5OGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1tdmVidS5oCisrKyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLW12ZWJ1LmgKQEAgLTI4LDIwICsyOCwxOSBAQAogICogYmV0d2VlbiB0d28gb3IgbW9yZSBkaWZmZXJlbnQgc2V0dGluZ3MsIGUuZy4gYXNzaWduIG1wcCBwaW4gMTMgdG8KICAqIHVhcnQxIG9yIHNhdGEuCiAgKgotICogSWYgb3B0aW9uYWwgbXBwX2dldC9fc2V0IGZ1bmN0aW9ucyBhcmUgc2V0IHRoZXNlIGFyZSB1c2VkIHRvIGdldC9zZXQKLSAqIGEgc3BlY2lmaWMgbW9kZS4gT3RoZXJ3aXNlIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgbXBwIGNvbnRyb2wgaXMgYmFzZWQKLSAqIG9uIDQtYml0IGdyb3VwcyBpbiBzdWJzZXF1ZW50IHJlZ2lzdGVycy4gVGhlIG9wdGlvbmFsIG1wcF9ncGlvX3JlcS9fZGlyCi0gKiBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgdG8gYWxsb3cgcGluIHNldHRpbmdzIHdpdGggdmFyeWluZyBncGlvIHBpbnMuCisgKiBUaGUgbXBwX2dldC9fc2V0IGZ1bmN0aW9ucyBhcmUgbWFuZGF0b3J5IGFuZCBhcmUgdXNlZCB0byBnZXQvc2V0IGEKKyAqIHNwZWNpZmljIG1vZGUuIFRoZSBvcHRpb25hbCBtcHBfZ3Bpb19yZXEvX2RpciBmdW5jdGlvbnMgY2FuIGJlIHVzZWQKKyAqIHRvIGFsbG93IHBpbiBzZXR0aW5ncyB3aXRoIHZhcnlpbmcgZ3BpbyBwaW5zLgogICovCiBzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJdTggcGlkOwogCXU4IG5waW5zOwogCXVuc2lnbmVkICpwaW5zOwotCWludCAoKm1wcF9nZXQpKHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKTsKLQlpbnQgKCptcHBfc2V0KShzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgKmN0cmwsIHVuc2lnbmVkIGxvbmcgY29uZmlnKTsKLQlpbnQgKCptcHBfZ3Bpb19yZXEpKHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwgdTggcGlkKTsKLQlpbnQgKCptcHBfZ3Bpb19kaXIpKHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwgdTggcGlkLCBib29sIGlucHV0KTsKKwlpbnQgKCptcHBfZ2V0KSh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgKmNvbmZpZyk7CisJaW50ICgqbXBwX3NldCkodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nIGNvbmZpZyk7CisJaW50ICgqbXBwX2dwaW9fcmVxKSh1bnNpZ25lZCBwaWQpOworCWludCAoKm1wcF9ncGlvX2RpcikodW5zaWduZWQgcGlkLCBib29sIGlucHV0KTsKIH07CiAKIC8qKgpAQCAtMTE0LDE4ICsxMTMsNiBAQAogCWludCBuZ3Bpb3JhbmdlczsKIH07CiAKLSNkZWZpbmUgTVBQX1JFR19DVFJMKF9pZGwsIF9pZGgpCQkJCVwKLQl7CQkJCQkJCVwKLQkJLm5hbWUgPSBOVUxMLAkJCQkJXAotCQkucGlkID0gX2lkbCwJCQkJCVwKLQkJLm5waW5zID0gX2lkaCAtIF9pZGwgKyAxLAkJCVwKLQkJLnBpbnMgPSAodW5zaWduZWRbX2lkaCAtIF9pZGwgKyAxXSkgeyB9LAlcCi0JCS5tcHBfZ2V0ID0gTlVMTCwJCQkJXAotCQkubXBwX3NldCA9IE5VTEwsCQkJCVwKLQkJLm1wcF9ncGlvX3JlcSA9IE5VTEwsCQkJCVwKLQkJLm1wcF9ncGlvX2RpciA9IE5VTEwsCQkJCVwKLQl9Ci0KICNkZWZpbmUgTVBQX0ZVTkNfQ1RSTChfaWRsLCBfaWRoLCBfbmFtZSwgX2Z1bmMpCQkJXAogCXsJCQkJCQkJXAogCQkubmFtZSA9IF9uYW1lLAkJCQkJXApAQCAtMTg2LDYgKzE3MywzNCBAQAogCQkubnBpbnMgPSBfbnBpbnMsCQkJCVwKIAl9CiAKKyNkZWZpbmUgTVZFQlVfTVBQU19QRVJfUkVHCTgKKyNkZWZpbmUgTVZFQlVfTVBQX0JJVFMJCTQKKyNkZWZpbmUgTVZFQlVfTVBQX01BU0sJCTB4ZgorCitzdGF0aWMgaW5saW5lIGludCBkZWZhdWx0X21wcF9jdHJsX2dldCh2b2lkIF9faW9tZW0gKmJhc2UsIHVuc2lnbmVkIGludCBwaWQsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKK3sKKwl1bnNpZ25lZCBvZmYgPSAocGlkIC8gTVZFQlVfTVBQU19QRVJfUkVHKSAqIE1WRUJVX01QUF9CSVRTOworCXVuc2lnbmVkIHNoaWZ0ID0gKHBpZCAlIE1WRUJVX01QUFNfUEVSX1JFRykgKiBNVkVCVV9NUFBfQklUUzsKKworCSpjb25maWcgPSAocmVhZGwoYmFzZSArIG9mZikgPj4gc2hpZnQpICYgTVZFQlVfTVBQX01BU0s7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGVmYXVsdF9tcHBfY3RybF9zZXQodm9pZCBfX2lvbWVtICpiYXNlLCB1bnNpZ25lZCBpbnQgcGlkLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvbmZpZykKK3sKKwl1bnNpZ25lZCBvZmYgPSAocGlkIC8gTVZFQlVfTVBQU19QRVJfUkVHKSAqIE1WRUJVX01QUF9CSVRTOworCXVuc2lnbmVkIHNoaWZ0ID0gKHBpZCAlIE1WRUJVX01QUFNfUEVSX1JFRykgKiBNVkVCVV9NUFBfQklUUzsKKwl1bnNpZ25lZCBsb25nIHJlZzsKKworCXJlZyA9IHJlYWRsKGJhc2UgKyBvZmYpICYgfihNVkVCVV9NUFBfTUFTSyA8PCBzaGlmdCk7CisJd3JpdGVsKHJlZyB8IChjb25maWcgPDwgc2hpZnQpLCBiYXNlICsgb2ZmKTsKKworCXJldHVybiAwOworfQorCiBpbnQgbXZlYnVfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKIGludCBtdmVidV9waW5jdHJsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYWRpMi1iZjU0eC5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYWRpMi1iZjU0eC5jCmluZGV4IGVhOWQ5YWIuLjAwOGEyOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFkaTItYmY1NHguYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hZGkyLWJmNTR4LmMKQEAgLTMwOSwzOSArMzA5LDYgQEAKIAlHUElPX1BFNCwgR1BJT19QRTUsIEdQSU9fUEU2LCBHUElPX1BFNywKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRpX3Bpbl9ncm91cCBhZGlfcGluX2dyb3Vwc1tdID0gewotCUFESV9QSU5fR1JPVVAoInVhcnQwZ3JwIiwgdWFydDBfcGlucyksCi0JQURJX1BJTl9HUk9VUCgidWFydDFncnAiLCB1YXJ0MV9waW5zKSwKLQlBRElfUElOX0dST1VQKCJ1YXJ0MWN0c3J0c2dycCIsIHVhcnQxX2N0c3J0c19waW5zKSwKLQlBRElfUElOX0dST1VQKCJ1YXJ0MmdycCIsIHVhcnQyX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInVhcnQzZ3JwIiwgdWFydDNfcGlucyksCi0JQURJX1BJTl9HUk9VUCgidWFydDNjdHNydHNncnAiLCB1YXJ0M19jdHNydHNfcGlucyksCi0JQURJX1BJTl9HUk9VUCgicnNpMGdycCIsIHJzaTBfcGlucyksCi0JQURJX1BJTl9HUk9VUCgic3BpMGdycCIsIHNwaTBfcGlucyksCi0JQURJX1BJTl9HUk9VUCgic3BpMWdycCIsIHNwaTFfcGlucyksCi0JQURJX1BJTl9HUk9VUCgidHdpMGdycCIsIHR3aTBfcGlucyksCi0JQURJX1BJTl9HUk9VUCgidHdpMWdycCIsIHR3aTFfcGlucyksCi0JQURJX1BJTl9HUk9VUCgicm90YXJ5Z3JwIiwgcm90YXJ5X3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImNhbjBncnAiLCBjYW4wX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImNhbjFncnAiLCBjYW4xX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInNtYzBncnAiLCBzbWMwX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInNwb3J0MGdycCIsIHNwb3J0MF9waW5zKSwKLQlBRElfUElOX0dST1VQKCJzcG9ydDFncnAiLCBzcG9ydDFfcGlucyksCi0JQURJX1BJTl9HUk9VUCgic3BvcnQyZ3JwIiwgc3BvcnQyX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInNwb3J0M2dycCIsIHNwb3J0M19waW5zKSwKLQlBRElfUElOX0dST1VQKCJwcGkwXzhiZ3JwIiwgcHBpMF84Yl9waW5zKSwKLQlBRElfUElOX0dST1VQKCJwcGkwXzE2YmdycCIsIHBwaTBfMTZiX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInBwaTBfMjRiZ3JwIiwgcHBpMF8yNGJfcGlucyksCi0JQURJX1BJTl9HUk9VUCgicHBpMV84YmdycCIsIHBwaTFfOGJfcGlucyksCi0JQURJX1BJTl9HUk9VUCgicHBpMV8xNmJncnAiLCBwcGkxXzE2Yl9waW5zKSwKLQlBRElfUElOX0dST1VQKCJwcGkyXzhiZ3JwIiwgcHBpMl84Yl9waW5zKSwKLQlBRElfUElOX0dST1VQKCJhdGFwaWdycCIsIGF0YXBpX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImF0YXBpYWx0ZXJncnAiLCBhdGFwaV9hbHRlcl9waW5zKSwKLQlBRElfUElOX0dST1VQKCJuZmMwZ3JwIiwgbmZjMF9waW5zKSwKLQlBRElfUElOX0dST1VQKCJrZXlzXzR4NGdycCIsIGtleXNfNHg0X3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImtleXNfOHg4Z3JwIiwga2V5c184eDhfcGlucyksCi19OwotCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgdWFydDBfbXV4W10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwKIAkwCkBAIC01MTMsNiArNDgwLDM5IEBACiAJMAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBhZGlfcGluX2dyb3VwIGFkaV9waW5fZ3JvdXBzW10gPSB7CisJQURJX1BJTl9HUk9VUCgidWFydDBncnAiLCB1YXJ0MF9waW5zLCB1YXJ0MF9tdXgpLAorCUFESV9QSU5fR1JPVVAoInVhcnQxZ3JwIiwgdWFydDFfcGlucywgdWFydDFfbXV4KSwKKwlBRElfUElOX0dST1VQKCJ1YXJ0MWN0c3J0c2dycCIsIHVhcnQxX2N0c3J0c19waW5zLCB1YXJ0MV9jdHNydHNfbXV4KSwKKwlBRElfUElOX0dST1VQKCJ1YXJ0MmdycCIsIHVhcnQyX3BpbnMsIHVhcnQyX211eCksCisJQURJX1BJTl9HUk9VUCgidWFydDNncnAiLCB1YXJ0M19waW5zLCB1YXJ0M19tdXgpLAorCUFESV9QSU5fR1JPVVAoInVhcnQzY3RzcnRzZ3JwIiwgdWFydDNfY3RzcnRzX3BpbnMsIHVhcnQzX2N0c3J0c19tdXgpLAorCUFESV9QSU5fR1JPVVAoInJzaTBncnAiLCByc2kwX3BpbnMsIHJzaTBfbXV4KSwKKwlBRElfUElOX0dST1VQKCJzcGkwZ3JwIiwgc3BpMF9waW5zLCBzcGkwX211eCksCisJQURJX1BJTl9HUk9VUCgic3BpMWdycCIsIHNwaTFfcGlucywgc3BpMV9tdXgpLAorCUFESV9QSU5fR1JPVVAoInR3aTBncnAiLCB0d2kwX3BpbnMsIHR3aTBfbXV4KSwKKwlBRElfUElOX0dST1VQKCJ0d2kxZ3JwIiwgdHdpMV9waW5zLCB0d2kxX211eCksCisJQURJX1BJTl9HUk9VUCgicm90YXJ5Z3JwIiwgcm90YXJ5X3BpbnMsIHJvdGFyeV9tdXgpLAorCUFESV9QSU5fR1JPVVAoImNhbjBncnAiLCBjYW4wX3BpbnMsIGNhbjBfbXV4KSwKKwlBRElfUElOX0dST1VQKCJjYW4xZ3JwIiwgY2FuMV9waW5zLCBjYW4xX211eCksCisJQURJX1BJTl9HUk9VUCgic21jMGdycCIsIHNtYzBfcGlucywgc21jMF9tdXgpLAorCUFESV9QSU5fR1JPVVAoInNwb3J0MGdycCIsIHNwb3J0MF9waW5zLCBzcG9ydDBfbXV4KSwKKwlBRElfUElOX0dST1VQKCJzcG9ydDFncnAiLCBzcG9ydDFfcGlucywgc3BvcnQxX211eCksCisJQURJX1BJTl9HUk9VUCgic3BvcnQyZ3JwIiwgc3BvcnQyX3BpbnMsIHNwb3J0Ml9tdXgpLAorCUFESV9QSU5fR1JPVVAoInNwb3J0M2dycCIsIHNwb3J0M19waW5zLCBzcG9ydDNfbXV4KSwKKwlBRElfUElOX0dST1VQKCJwcGkwXzhiZ3JwIiwgcHBpMF84Yl9waW5zLCBwcGkwXzhiX211eCksCisJQURJX1BJTl9HUk9VUCgicHBpMF8xNmJncnAiLCBwcGkwXzE2Yl9waW5zLCBwcGkwXzE2Yl9tdXgpLAorCUFESV9QSU5fR1JPVVAoInBwaTBfMjRiZ3JwIiwgcHBpMF8yNGJfcGlucywgcHBpMF8yNGJfbXV4KSwKKwlBRElfUElOX0dST1VQKCJwcGkxXzhiZ3JwIiwgcHBpMV84Yl9waW5zLCBwcGkxXzhiX211eCksCisJQURJX1BJTl9HUk9VUCgicHBpMV8xNmJncnAiLCBwcGkxXzE2Yl9waW5zLCBwcGkxXzE2Yl9tdXgpLAorCUFESV9QSU5fR1JPVVAoInBwaTJfOGJncnAiLCBwcGkyXzhiX3BpbnMsIHBwaTJfOGJfbXV4KSwKKwlBRElfUElOX0dST1VQKCJhdGFwaWdycCIsIGF0YXBpX3BpbnMsIGF0YXBpX211eCksCisJQURJX1BJTl9HUk9VUCgiYXRhcGlhbHRlcmdycCIsIGF0YXBpX2FsdGVyX3BpbnMsIGF0YXBpX2FsdGVyX211eCksCisJQURJX1BJTl9HUk9VUCgibmZjMGdycCIsIG5mYzBfcGlucywgbmZjMF9tdXgpLAorCUFESV9QSU5fR1JPVVAoImtleXNfNHg0Z3JwIiwga2V5c180eDRfcGlucywga2V5c180eDRfbXV4KSwKKwlBRElfUElOX0dST1VQKCJrZXlzXzh4OGdycCIsIGtleXNfOHg4X3BpbnMsIGtleXNfOHg4X211eCksCit9OworCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnQwZ3JwW10gPSB7ICJ1YXJ0MGdycCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydDFncnBbXSA9IHsgInVhcnQxZ3JwIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0MWN0c3J0c2dycFtdID0geyAidWFydDFjdHNydHNncnAiIH07CkBAIC01MzIsNDkgKzUzMiw0NSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcG9ydDFncnBbXSA9IHsgInNwb3J0MWdycCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BvcnQyZ3JwW10gPSB7ICJzcG9ydDJncnAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwb3J0M2dycFtdID0geyAic3BvcnQzZ3JwIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkwXzhiZ3JwW10gPSB7ICJwcGkwXzhiZ3JwIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkwXzE2YmdycFtdID0geyAicHBpMF8xNmJncnAiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBwaTBfMjRiZ3JwW10gPSB7ICJwcGkwXzI0YmdycCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHBpMV84YmdycFtdID0geyAicHBpMV84YmdycCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHBpMV8xNmJncnBbXSA9IHsgInBwaTFfMTZiZ3JwIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkyXzhiZ3JwW10gPSB7ICJwcGkyXzhiZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkwZ3JwW10gPSB7ICJwcGkwXzhiZ3JwIiwKKwkJCQkJInBwaTBfMTZiZ3JwIiwKKwkJCQkJInBwaTBfMjRiZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkxZ3JwW10gPSB7ICJwcGkxXzhiZ3JwIiwKKwkJCQkJInBwaTFfMTZiZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkyZ3JwW10gPSB7ICJwcGkyXzhiZ3JwIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGFwaWdycFtdID0geyAiYXRhcGlncnAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0YXBpYWx0ZXJncnBbXSA9IHsgImF0YXBpYWx0ZXJncnAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5mYzBncnBbXSA9IHsgIm5mYzBncnAiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleXNfNHg0Z3JwW10gPSB7ICJrZXlzXzR4NGdycCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5c184eDhncnBbXSA9IHsgImtleXNfOHg4Z3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlzZ3JwW10gPSB7ICJrZXlzXzR4NGdycCIsCisJCQkJCSJrZXlzXzh4OGdycCIgfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhZGlfcG14X2Z1bmMgYWRpX3BteF9mdW5jdGlvbnNbXSA9IHsKLQlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MCIsIHVhcnQwZ3JwLCB1YXJ0MF9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInVhcnQxIiwgdWFydDFncnAsIHVhcnQxX211eCksCi0JQURJX1BNWF9GVU5DVElPTigidWFydDFfY3RzcnRzIiwgdWFydDFjdHNydHNncnAsIHVhcnQxX2N0c3J0c19tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInVhcnQyIiwgdWFydDJncnAsIHVhcnQyX211eCksCi0JQURJX1BNWF9GVU5DVElPTigidWFydDMiLCB1YXJ0M2dycCwgdWFydDNfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0M19jdHNydHMiLCB1YXJ0M2N0c3J0c2dycCwgdWFydDNfY3RzcnRzX211eCksCi0JQURJX1BNWF9GVU5DVElPTigicnNpMCIsIHJzaTBncnAsIHJzaTBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJzcGkwIiwgc3BpMGdycCwgc3BpMF9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInNwaTEiLCBzcGkxZ3JwLCBzcGkxX211eCksCi0JQURJX1BNWF9GVU5DVElPTigidHdpMCIsIHR3aTBncnAsIHR3aTBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJ0d2kxIiwgdHdpMWdycCwgdHdpMV9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInJvdGFyeSIsIHJvdGFyeWdycCwgcm90YXJ5X211eCksCi0JQURJX1BNWF9GVU5DVElPTigiY2FuMCIsIGNhbjBncnAsIGNhbjBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJjYW4xIiwgY2FuMWdycCwgY2FuMV9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInNtYzAiLCBzbWMwZ3JwLCBzbWMwX211eCksCi0JQURJX1BNWF9GVU5DVElPTigic3BvcnQwIiwgc3BvcnQwZ3JwLCBzcG9ydDBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJzcG9ydDEiLCBzcG9ydDFncnAsIHNwb3J0MV9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInNwb3J0MiIsIHNwb3J0MmdycCwgc3BvcnQyX211eCksCi0JQURJX1BNWF9GVU5DVElPTigic3BvcnQzIiwgc3BvcnQzZ3JwLCBzcG9ydDNfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJwcGkwXzhiIiwgcHBpMF84YmdycCwgcHBpMF84Yl9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInBwaTBfMTZiIiwgcHBpMF8xNmJncnAsIHBwaTBfMTZiX211eCksCi0JQURJX1BNWF9GVU5DVElPTigicHBpMF8yNGIiLCBwcGkwXzI0YmdycCwgcHBpMF8yNGJfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJwcGkxXzhiIiwgcHBpMV84YmdycCwgcHBpMV84Yl9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInBwaTFfMTZiIiwgcHBpMV8xNmJncnAsIHBwaTFfMTZiX211eCksCi0JQURJX1BNWF9GVU5DVElPTigicHBpMl84YiIsIHBwaTJfOGJncnAsIHBwaTJfOGJfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJhdGFwaSIsIGF0YXBpZ3JwLCBhdGFwaV9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oImF0YXBpX2FsdGVyIiwgYXRhcGlhbHRlcmdycCwgYXRhcGlfYWx0ZXJfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJuZmMwIiwgbmZjMGdycCwgbmZjMF9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oImtleXNfNHg0Iiwga2V5c180eDRncnAsIGtleXNfNHg0X211eCksCi0JQURJX1BNWF9GVU5DVElPTigia2V5c184eDgiLCBrZXlzXzh4OGdycCwga2V5c184eDhfbXV4KSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MCIsIHVhcnQwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MSIsIHVhcnQxZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MV9jdHNydHMiLCB1YXJ0MWN0c3J0c2dycCksCisJQURJX1BNWF9GVU5DVElPTigidWFydDIiLCB1YXJ0MmdycCksCisJQURJX1BNWF9GVU5DVElPTigidWFydDMiLCB1YXJ0M2dycCksCisJQURJX1BNWF9GVU5DVElPTigidWFydDNfY3RzcnRzIiwgdWFydDNjdHNydHNncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInJzaTAiLCByc2kwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJzcGkwIiwgc3BpMGdycCksCisJQURJX1BNWF9GVU5DVElPTigic3BpMSIsIHNwaTFncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInR3aTAiLCB0d2kwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJ0d2kxIiwgdHdpMWdycCksCisJQURJX1BNWF9GVU5DVElPTigicm90YXJ5Iiwgcm90YXJ5Z3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJjYW4wIiwgY2FuMGdycCksCisJQURJX1BNWF9GVU5DVElPTigiY2FuMSIsIGNhbjFncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInNtYzAiLCBzbWMwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJzcG9ydDAiLCBzcG9ydDBncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInNwb3J0MSIsIHNwb3J0MWdycCksCisJQURJX1BNWF9GVU5DVElPTigic3BvcnQyIiwgc3BvcnQyZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJzcG9ydDMiLCBzcG9ydDNncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInBwaTAiLCBwcGkwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJwcGkxIiwgcHBpMWdycCksCisJQURJX1BNWF9GVU5DVElPTigicHBpMiIsIHBwaTJncnApLAorCUFESV9QTVhfRlVOQ1RJT04oImF0YXBpIiwgYXRhcGlncnApLAorCUFESV9QTVhfRlVOQ1RJT04oImF0YXBpX2FsdGVyIiwgYXRhcGlhbHRlcmdycCksCisJQURJX1BNWF9GVU5DVElPTigibmZjMCIsIG5mYzBncnApLAorCUFESV9QTVhfRlVOQ1RJT04oImtleXMiLCBrZXlzZ3JwKSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRpX3BpbmN0cmxfc29jX2RhdGEgYWRpX2JmNTR4X3NvYyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFkaTItYmY2MHguYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFkaTItYmY2MHguYwppbmRleCBiZjU3YWVhLi40Y2I1OWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hZGkyLWJmNjB4LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYWRpMi1iZjYweC5jCkBAIC0yNTksMzcgKzI1OSw2IEBACiAJR1BJT19QRjEyLCBHUElPX1BGMTMsIEdQSU9fUEYxNCwgR1BJT19QRjE1LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhZGlfcGluX2dyb3VwIGFkaV9waW5fZ3JvdXBzW10gPSB7Ci0JQURJX1BJTl9HUk9VUCgidWFydDBncnAiLCB1YXJ0MF9waW5zKSwKLQlBRElfUElOX0dST1VQKCJ1YXJ0MGN0c3J0c2dycCIsIHVhcnQwX2N0c3J0c19waW5zKSwKLQlBRElfUElOX0dST1VQKCJ1YXJ0MWdycCIsIHVhcnQxX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInVhcnQxY3RzcnRzZ3JwIiwgdWFydDFfY3RzcnRzX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInJzaTBncnAiLCByc2kwX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImV0aDBncnAiLCBldGgwX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImV0aDFncnAiLCBldGgxX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInNwaTBncnAiLCBzcGkwX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInNwaTFncnAiLCBzcGkxX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInR3aTBncnAiLCB0d2kwX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInR3aTFncnAiLCB0d2kxX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInJvdGFyeWdycCIsIHJvdGFyeV9waW5zKSwKLQlBRElfUElOX0dST1VQKCJjYW4wZ3JwIiwgY2FuMF9waW5zKSwKLQlBRElfUElOX0dST1VQKCJzbWMwZ3JwIiwgc21jMF9waW5zKSwKLQlBRElfUElOX0dST1VQKCJzcG9ydDBncnAiLCBzcG9ydDBfcGlucyksCi0JQURJX1BJTl9HUk9VUCgic3BvcnQxZ3JwIiwgc3BvcnQxX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInNwb3J0MmdycCIsIHNwb3J0Ml9waW5zKSwKLQlBRElfUElOX0dST1VQKCJwcGkwXzhiZ3JwIiwgcHBpMF84Yl9waW5zKSwKLQlBRElfUElOX0dST1VQKCJwcGkwXzE2YmdycCIsIHBwaTBfMTZiX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInBwaTBfMjRiZ3JwIiwgcHBpMF8yNGJfcGlucyksCi0JQURJX1BJTl9HUk9VUCgicHBpMV84YmdycCIsIHBwaTFfOGJfcGlucyksCi0JQURJX1BJTl9HUk9VUCgicHBpMV8xNmJncnAiLCBwcGkxXzE2Yl9waW5zKSwKLQlBRElfUElOX0dST1VQKCJwcGkyXzhiZ3JwIiwgcHBpMl84Yl9waW5zKSwKLQlBRElfUElOX0dST1VQKCJwcGkyXzE2YmdycCIsIHBwaTJfMTZiX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImxwMGdycCIsIGxwMF9waW5zKSwKLQlBRElfUElOX0dST1VQKCJscDFncnAiLCBscDFfcGlucyksCi0JQURJX1BJTl9HUk9VUCgibHAyZ3JwIiwgbHAyX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImxwM2dycCIsIGxwM19waW5zKSwKLX07Ci0KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB1YXJ0MF9tdXhbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLAogCTAKQEAgLTQ0Niw2ICs0MTUsMzcgQEAKICAgICAgICAgMAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBhZGlfcGluX2dyb3VwIGFkaV9waW5fZ3JvdXBzW10gPSB7CisJQURJX1BJTl9HUk9VUCgidWFydDBncnAiLCB1YXJ0MF9waW5zLCB1YXJ0MF9tdXgpLAorCUFESV9QSU5fR1JPVVAoInVhcnQwY3RzcnRzZ3JwIiwgdWFydDBfY3RzcnRzX3BpbnMsIHVhcnQwX2N0c3J0c19tdXgpLAorCUFESV9QSU5fR1JPVVAoInVhcnQxZ3JwIiwgdWFydDFfcGlucywgdWFydDFfbXV4KSwKKwlBRElfUElOX0dST1VQKCJ1YXJ0MWN0c3J0c2dycCIsIHVhcnQxX2N0c3J0c19waW5zLCB1YXJ0MV9jdHNydHNfbXV4KSwKKwlBRElfUElOX0dST1VQKCJyc2kwZ3JwIiwgcnNpMF9waW5zLCByc2kwX211eCksCisJQURJX1BJTl9HUk9VUCgiZXRoMGdycCIsIGV0aDBfcGlucywgZXRoMF9tdXgpLAorCUFESV9QSU5fR1JPVVAoImV0aDFncnAiLCBldGgxX3BpbnMsIGV0aDFfbXV4KSwKKwlBRElfUElOX0dST1VQKCJzcGkwZ3JwIiwgc3BpMF9waW5zLCBzcGkwX211eCksCisJQURJX1BJTl9HUk9VUCgic3BpMWdycCIsIHNwaTFfcGlucywgc3BpMV9tdXgpLAorCUFESV9QSU5fR1JPVVAoInR3aTBncnAiLCB0d2kwX3BpbnMsIHR3aTBfbXV4KSwKKwlBRElfUElOX0dST1VQKCJ0d2kxZ3JwIiwgdHdpMV9waW5zLCB0d2kxX211eCksCisJQURJX1BJTl9HUk9VUCgicm90YXJ5Z3JwIiwgcm90YXJ5X3BpbnMsIHJvdGFyeV9tdXgpLAorCUFESV9QSU5fR1JPVVAoImNhbjBncnAiLCBjYW4wX3BpbnMsIGNhbjBfbXV4KSwKKwlBRElfUElOX0dST1VQKCJzbWMwZ3JwIiwgc21jMF9waW5zLCBzbWMwX211eCksCisJQURJX1BJTl9HUk9VUCgic3BvcnQwZ3JwIiwgc3BvcnQwX3BpbnMsIHNwb3J0MF9tdXgpLAorCUFESV9QSU5fR1JPVVAoInNwb3J0MWdycCIsIHNwb3J0MV9waW5zLCBzcG9ydDFfbXV4KSwKKwlBRElfUElOX0dST1VQKCJzcG9ydDJncnAiLCBzcG9ydDJfcGlucywgc3BvcnQyX211eCksCisJQURJX1BJTl9HUk9VUCgicHBpMF84YmdycCIsIHBwaTBfOGJfcGlucywgcHBpMF84Yl9tdXgpLAorCUFESV9QSU5fR1JPVVAoInBwaTBfMTZiZ3JwIiwgcHBpMF8xNmJfcGlucywgcHBpMF8xNmJfbXV4KSwKKwlBRElfUElOX0dST1VQKCJwcGkwXzI0YmdycCIsIHBwaTBfMjRiX3BpbnMsIHBwaTBfMjRiX211eCksCisJQURJX1BJTl9HUk9VUCgicHBpMV84YmdycCIsIHBwaTFfOGJfcGlucywgcHBpMV84Yl9tdXgpLAorCUFESV9QSU5fR1JPVVAoInBwaTFfMTZiZ3JwIiwgcHBpMV8xNmJfcGlucywgcHBpMV8xNmJfbXV4KSwKKwlBRElfUElOX0dST1VQKCJwcGkyXzhiZ3JwIiwgcHBpMl84Yl9waW5zLCBwcGkyXzhiX211eCksCisJQURJX1BJTl9HUk9VUCgicHBpMl8xNmJncnAiLCBwcGkyXzE2Yl9waW5zLCBwcGkyXzE2Yl9tdXgpLAorCUFESV9QSU5fR1JPVVAoImxwMGdycCIsIGxwMF9waW5zLCBscDBfbXV4KSwKKwlBRElfUElOX0dST1VQKCJscDFncnAiLCBscDFfcGlucywgbHAxX211eCksCisJQURJX1BJTl9HUk9VUCgibHAyZ3JwIiwgbHAyX3BpbnMsIGxwMl9tdXgpLAorCUFESV9QSU5fR1JPVVAoImxwM2dycCIsIGxwM19waW5zLCBscDNfbXV4KSwKK307CisKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydDBncnBbXSA9IHsgInVhcnQwZ3JwIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0MGN0c3J0c2dycFtdID0geyAidWFydDBjdHNydHNncnAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnQxZ3JwW10gPSB7ICJ1YXJ0MWdycCIgfTsKQEAgLTQ2Myw0NyArNDYzLDQzIEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwb3J0MGdycFtdID0geyAic3BvcnQwZ3JwIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcG9ydDFncnBbXSA9IHsgInNwb3J0MWdycCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BvcnQyZ3JwW10gPSB7ICJzcG9ydDJncnAiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBwaTBfOGJncnBbXSA9IHsgInBwaTBfOGJncnAiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBwaTBfMTZiZ3JwW10gPSB7ICJwcGkwXzE2YmdycCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHBpMF8yNGJncnBbXSA9IHsgInBwaTBfMjRiZ3JwIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkxXzhiZ3JwW10gPSB7ICJwcGkxXzhiZ3JwIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkxXzE2YmdycFtdID0geyAicHBpMV8xNmJncnAiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBwaTJfOGJncnBbXSA9IHsgInBwaTJfOGJncnAiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBwaTJfMTZiZ3JwW10gPSB7ICJwcGkyXzE2YmdycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHBpMGdycFtdID0geyAicHBpMF84YmdycCIsCisJCQkJCSJwcGkwXzE2YmdycCIsCisJCQkJCSJwcGkwXzI0YmdycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHBpMWdycFtdID0geyAicHBpMV84YmdycCIsCisJCQkJCSJwcGkxXzE2YmdycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHBpMmdycFtdID0geyAicHBpMl84YmdycCIsCisJCQkJCSJwcGkyXzE2YmdycCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbHAwZ3JwW10gPSB7ICJscDBncnAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxwMWdycFtdID0geyAibHAxZ3JwIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBscDJncnBbXSA9IHsgImxwMmdycCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbHAzZ3JwW10gPSB7ICJscDNncnAiIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRpX3BteF9mdW5jIGFkaV9wbXhfZnVuY3Rpb25zW10gPSB7Ci0JQURJX1BNWF9GVU5DVElPTigidWFydDAiLCB1YXJ0MGdycCwgdWFydDBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MF9jdHNydHMiLCB1YXJ0MGN0c3J0c2dycCwgdWFydDBfY3RzcnRzX211eCksCi0JQURJX1BNWF9GVU5DVElPTigidWFydDEiLCB1YXJ0MWdycCwgdWFydDFfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MV9jdHNydHMiLCB1YXJ0MWN0c3J0c2dycCwgdWFydDFfY3RzcnRzX211eCksCi0JQURJX1BNWF9GVU5DVElPTigicnNpMCIsIHJzaTBncnAsIHJzaTBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJldGgwIiwgZXRoMGdycCwgZXRoMF9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oImV0aDEiLCBldGgxZ3JwLCBldGgxX211eCksCi0JQURJX1BNWF9GVU5DVElPTigic3BpMCIsIHNwaTBncnAsIHNwaTBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJzcGkxIiwgc3BpMWdycCwgc3BpMV9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInR3aTAiLCB0d2kwZ3JwLCB0d2kwX211eCksCi0JQURJX1BNWF9GVU5DVElPTigidHdpMSIsIHR3aTFncnAsIHR3aTFfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJyb3RhcnkiLCByb3RhcnlncnAsIHJvdGFyeV9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oImNhbjAiLCBjYW4wZ3JwLCBjYW4wX211eCksCi0JQURJX1BNWF9GVU5DVElPTigic21jMCIsIHNtYzBncnAsIHNtYzBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJzcG9ydDAiLCBzcG9ydDBncnAsIHNwb3J0MF9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInNwb3J0MSIsIHNwb3J0MWdycCwgc3BvcnQxX211eCksCi0JQURJX1BNWF9GVU5DVElPTigic3BvcnQyIiwgc3BvcnQyZ3JwLCBzcG9ydDJfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJwcGkwXzhiIiwgcHBpMF84YmdycCwgcHBpMF84Yl9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInBwaTBfMTZiIiwgcHBpMF8xNmJncnAsIHBwaTBfMTZiX211eCksCi0JQURJX1BNWF9GVU5DVElPTigicHBpMF8yNGIiLCBwcGkwXzI0YmdycCwgcHBpMF8yNGJfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJwcGkxXzhiIiwgcHBpMV84YmdycCwgcHBpMV84Yl9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInBwaTFfMTZiIiwgcHBpMV8xNmJncnAsIHBwaTFfMTZiX211eCksCi0JQURJX1BNWF9GVU5DVElPTigicHBpMl84YiIsIHBwaTJfOGJncnAsIHBwaTJfOGJfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJwcGkyXzE2YiIsIHBwaTJfMTZiZ3JwLCBwcGkyXzE2Yl9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oImxwMCIsIGxwMGdycCwgbHAwX211eCksCi0JQURJX1BNWF9GVU5DVElPTigibHAxIiwgbHAxZ3JwLCBscDFfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJscDIiLCBscDJncnAsIGxwMl9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oImxwMyIsIGxwM2dycCwgbHAzX211eCksCisJQURJX1BNWF9GVU5DVElPTigidWFydDAiLCB1YXJ0MGdycCksCisJQURJX1BNWF9GVU5DVElPTigidWFydDBfY3RzcnRzIiwgdWFydDBjdHNydHNncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInVhcnQxIiwgdWFydDFncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInVhcnQxX2N0c3J0cyIsIHVhcnQxY3RzcnRzZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJyc2kwIiwgcnNpMGdycCksCisJQURJX1BNWF9GVU5DVElPTigiZXRoMCIsIGV0aDBncnApLAorCUFESV9QTVhfRlVOQ1RJT04oImV0aDEiLCBldGgxZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJzcGkwIiwgc3BpMGdycCksCisJQURJX1BNWF9GVU5DVElPTigic3BpMSIsIHNwaTFncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInR3aTAiLCB0d2kwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJ0d2kxIiwgdHdpMWdycCksCisJQURJX1BNWF9GVU5DVElPTigicm90YXJ5Iiwgcm90YXJ5Z3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJjYW4wIiwgY2FuMGdycCksCisJQURJX1BNWF9GVU5DVElPTigic21jMCIsIHNtYzBncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInNwb3J0MCIsIHNwb3J0MGdycCksCisJQURJX1BNWF9GVU5DVElPTigic3BvcnQxIiwgc3BvcnQxZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJzcG9ydDIiLCBzcG9ydDJncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInBwaTAiLCBwcGkwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJwcGkxIiwgcHBpMWdycCksCisJQURJX1BNWF9GVU5DVElPTigicHBpMiIsIHBwaTJncnApLAorCUFESV9QTVhfRlVOQ1RJT04oImxwMCIsIGxwMGdycCksCisJQURJX1BNWF9GVU5DVElPTigibHAxIiwgbHAxZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJscDIiLCBscDJncnApLAorCUFESV9QTVhfRlVOQ1RJT04oImxwMyIsIGxwM2dycCksCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFkaV9waW5jdHJsX3NvY19kYXRhIGFkaV9iZjYweF9zb2MgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hZGkyLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hZGkyLmMKaW5kZXggN2EzOTU2Mi4uMjAwZWExZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYWRpMi5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFkaTIuYwpAQCAtODksNiArODksMTkgQEAKIAl1MzIgbXV4OwogfTsKIAorLyoKKyAqIHN0cnVjdCBncGlvX3BpbnRfc2F2ZWQgLSBQSU5UIHJlZ2lzdGVycyBzYXZlZCBpbiBQTSBvcGVyYXRpb25zCisgKgorICogQGFzc2lnbjogQVNTSUdOIHJlZ2lzdGVyCisgKiBAZWRnZV9zZXQ6IEVER0VfU0VUIHJlZ2lzdGVyCisgKiBAaW52ZXJ0X3NldDogSU5WRVJUX1NFVCByZWdpc3RlcgorICovCitzdHJ1Y3QgZ3Bpb19waW50X3NhdmVkIHsKKwl1MzIgYXNzaWduOworCXUzMiBlZGdlX3NldDsKKwl1MzIgaW52ZXJ0X3NldDsKK307CisKIC8qKgogICogc3RydWN0IGdwaW9fcGludCAtIFBpbiBpbnRlcnJ1cHQgY29udHJvbGxlciBkZXZpY2UuIE11bHRpcGxlIEFESSBHUElPCiAgKiBiYW5rcyBjYW4gYmUgbWFwcGVkIGludG8gb25lIFBpbiBpbnRlcnJ1cHQgY29udHJvbGxlci4KQEAgLTExNCw3ICsxMjcsNyBAQAogCWludCBpcnE7CiAJc3RydWN0IGlycV9kb21haW4gKmRvbWFpblsyXTsKIAlzdHJ1Y3QgZ3Bpb19waW50X3JlZ3MgKnJlZ3M7Ci0Jc3RydWN0IGFkaV9wbV9waW50X3NhdmUgc2F2ZWRfZGF0YTsKKwlzdHJ1Y3QgZ3Bpb19waW50X3NhdmVkIHNhdmVkX2RhdGE7CiAJaW50IG1hcF9jb3VudDsKIAlzcGlubG9ja190IGxvY2s7CiAKQEAgLTE2MCw3ICsxNzMsNyBAQAogc3RydWN0IGdwaW9fcG9ydCB7CiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOwogCXZvaWQgX19pb21lbSAqYmFzZTsKLQl1bnNpZ25lZCBpbnQgaXJxX2Jhc2U7CisJaW50IGlycV9iYXNlOwogCXVuc2lnbmVkIGludCB3aWR0aDsKIAlzdHJ1Y3QgZ3Bpb19wb3J0X3QgKnJlZ3M7CiAJc3RydWN0IGdwaW9fcG9ydF9zYXZlZCBzYXZlZF9kYXRhOwpAQCAtNjA1LDggKzYxOCw4IEBACiAJLmdldF9ncm91cF9waW5zID0gYWRpX2dldF9ncm91cF9waW5zLAogfTsKIAotc3RhdGljIGludCBhZGlfcGlubXV4X2VuYWJsZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsIHVuc2lnbmVkIHNlbGVjdG9yLAotCXVuc2lnbmVkIGdyb3VwKQorc3RhdGljIGludCBhZGlfcGlubXV4X2VuYWJsZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsIHVuc2lnbmVkIGZ1bmNfaWQsCisJdW5zaWduZWQgZ3JvdXBfaWQpCiB7CiAJc3RydWN0IGFkaV9waW5jdHJsICpwaW5jdHJsID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CiAJc3RydWN0IGdwaW9fcG9ydCAqcG9ydDsKQEAgLTYxNCw3ICs2MjcsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgc2hvcnQgKm11eCwgcGluOwogCi0JbXV4ID0gKHVuc2lnbmVkIHNob3J0ICopcGluY3RybC0+c29jLT5mdW5jdGlvbnNbc2VsZWN0b3JdLm11eDsKKwltdXggPSAodW5zaWduZWQgc2hvcnQgKilwaW5jdHJsLT5zb2MtPmdyb3Vwc1tncm91cF9pZF0ubXV4OwogCiAJd2hpbGUgKCptdXgpIHsKIAkJcGluID0gUF9JREVOVCgqbXV4KTsKQEAgLTYyOCw3ICs2NDEsNyBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCiAJCXBvcnRtdXhfc2V0dXAocG9ydCwgcGluX3RvX29mZnNldChyYW5nZSwgcGluKSwKLQkJCQkgUF9GVU5DVDJNVVgoKm11eCkpOworCQkJCVBfRlVOQ1QyTVVYKCptdXgpKTsKIAkJcG9ydF9zZXR1cChwb3J0LCBwaW5fdG9fb2Zmc2V0KHJhbmdlLCBwaW4pLCBmYWxzZSk7CiAJCW11eCsrOwogCkBAIC02MzgsOCArNjUxLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYWRpX3Bpbm11eF9kaXNhYmxlKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwgdW5zaWduZWQgc2VsZWN0b3IsCi0JdW5zaWduZWQgZ3JvdXApCitzdGF0aWMgdm9pZCBhZGlfcGlubXV4X2Rpc2FibGUoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LCB1bnNpZ25lZCBmdW5jX2lkLAorCXVuc2lnbmVkIGdyb3VwX2lkKQogewogCXN0cnVjdCBhZGlfcGluY3RybCAqcGluY3RybCA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOwogCXN0cnVjdCBncGlvX3BvcnQgKnBvcnQ7CkBAIC02NDcsNyArNjYwLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIHNob3J0ICptdXgsIHBpbjsKIAotCW11eCA9ICh1bnNpZ25lZCBzaG9ydCAqKXBpbmN0cmwtPnNvYy0+ZnVuY3Rpb25zW3NlbGVjdG9yXS5tdXg7CisJbXV4ID0gKHVuc2lnbmVkIHNob3J0ICopcGluY3RybC0+c29jLT5ncm91cHNbZ3JvdXBfaWRdLm11eDsKIAogCXdoaWxlICgqbXV4KSB7CiAJCXBpbiA9IFBfSURFTlQoKm11eCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hZGkyLmggYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hZGkyLmgKaW5kZXggMWYwNmY4ZC4uM2NhMjk3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYWRpMi5oCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFkaTIuaApAQCAtMjEsMTMgKzIxLDE1IEBACiAJY29uc3QgY2hhciAqbmFtZTsKIAljb25zdCB1bnNpZ25lZCAqcGluczsKIAljb25zdCB1bnNpZ25lZCBudW07CisJY29uc3QgdW5zaWduZWQgc2hvcnQgKm11eDsKIH07CiAKLSNkZWZpbmUgQURJX1BJTl9HUk9VUChuLCBwKSAgXAorI2RlZmluZSBBRElfUElOX0dST1VQKG4sIHAsIG0pICBcCiAJewkJCVwKIAkJLm5hbWUgPSBuLAlcCiAJCS5waW5zID0gcCwJXAogCQkubnVtID0gQVJSQVlfU0laRShwKSwJXAorCQkubXV4ID0gbSwJCQlcCiAJfQogCiAgLyoqCkBAIC00MSwxNSArNDMsMTMgQEAKIAljb25zdCBjaGFyICpuYW1lOwogCWNvbnN0IGNoYXIgKiBjb25zdCAqZ3JvdXBzOwogCWNvbnN0IHVuc2lnbmVkIG51bV9ncm91cHM7Ci0JY29uc3QgdW5zaWduZWQgc2hvcnQgKm11eDsKIH07CiAKLSNkZWZpbmUgQURJX1BNWF9GVU5DVElPTihuLCBnLCBtKQkJXAorI2RlZmluZSBBRElfUE1YX0ZVTkNUSU9OKG4sIGcpCQlcCiAJewkJCQkJXAogCQkubmFtZSA9IG4sCQkJXAogCQkuZ3JvdXBzID0gZywJCQlcCiAJCS5udW1fZ3JvdXBzID0gQVJSQVlfU0laRShnKSwJXAotCQkubXV4ID0gbSwJCQlcCiAJfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWF0OTEuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWF0OTEuYwppbmRleCBkOTkwZTMzLi41ZDI0YWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hdDkxLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYXQ5MS5jCkBAIC0xMTM3LDYgKzExMzcsMTcgQEAKIAlwaW5jdHJsX2ZyZWVfZ3BpbyhncGlvKTsKIH0KIAorc3RhdGljIGludCBhdDkxX2dwaW9fZ2V0X2RpcmVjdGlvbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGF0OTFfZ3Bpb19jaGlwICphdDkxX2dwaW8gPSB0b19hdDkxX2dwaW9fY2hpcChjaGlwKTsKKwl2b2lkIF9faW9tZW0gKnBpbyA9IGF0OTFfZ3Bpby0+cmVnYmFzZTsKKwl1bnNpZ25lZCBtYXNrID0gMSA8PCBvZmZzZXQ7CisJdTMyIG9zcjsKKworCW9zciA9IHJlYWRsX3JlbGF4ZWQocGlvICsgUElPX09TUik7CisJcmV0dXJuICEob3NyICYgbWFzayk7Cit9CisKIHN0YXRpYyBpbnQgYXQ5MV9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCiB7CiAJc3RydWN0IGF0OTFfZ3Bpb19jaGlwICphdDkxX2dwaW8gPSB0b19hdDkxX2dwaW9fY2hpcChjaGlwKTsKQEAgLTEzMjUsNiArMTMzNiwzMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdW5zaWduZWQgaW50IGdwaW9faXJxX3N0YXJ0dXAoc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBhdDkxX2dwaW9fY2hpcCAqYXQ5MV9ncGlvID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdW5zaWduZWQJcGluID0gZC0+aHdpcnE7CisJaW50IHJldDsKKworCXJldCA9IGdwaW9fbG9ja19hc19pcnEoJmF0OTFfZ3Bpby0+Y2hpcCwgcGluKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoYXQ5MV9ncGlvLT5jaGlwLmRldiwgInVuYWJsZSB0byBsb2NrIHBpbmQgJWx1IElSUVxuIiwKKwkJCWQtPmh3aXJxKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJZ3Bpb19pcnFfdW5tYXNrKGQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBncGlvX2lycV9zaHV0ZG93bihzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGF0OTFfZ3Bpb19jaGlwICphdDkxX2dwaW8gPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1bnNpZ25lZAlwaW4gPSBkLT5od2lycTsKKworCWdwaW9faXJxX21hc2soZCk7CisJZ3Bpb191bmxvY2tfYXNfaXJxKCZhdDkxX2dwaW8tPmNoaXAsIHBpbik7Cit9CisKICNpZmRlZiBDT05GSUdfUE0KIAogc3RhdGljIHUzMiB3YWtldXBzW01BWF9HUElPX0JBTktTXTsKQEAgLTEzOTksNiArMTQzNSw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZ3Bpb19pcnFjaGlwID0gewogCS5uYW1lCQk9ICJHUElPIiwKKwkuaXJxX3N0YXJ0dXAJPSBncGlvX2lycV9zdGFydHVwLAorCS5pcnFfc2h1dGRvd24JPSBncGlvX2lycV9zaHV0ZG93biwKIAkuaXJxX2Rpc2FibGUJPSBncGlvX2lycV9tYXNrLAogCS5pcnFfbWFzawk9IGdwaW9faXJxX21hc2ssCiAJLmlycV91bm1hc2sJPSBncGlvX2lycV91bm1hc2ssCkBAIC0xNTQzLDYgKzE1ODEsNyBAQAogc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgYXQ5MV9ncGlvX3RlbXBsYXRlID0gewogCS5yZXF1ZXN0CQk9IGF0OTFfZ3Bpb19yZXF1ZXN0LAogCS5mcmVlCQkJPSBhdDkxX2dwaW9fZnJlZSwKKwkuZ2V0X2RpcmVjdGlvbgkJPSBhdDkxX2dwaW9fZ2V0X2RpcmVjdGlvbiwKIAkuZGlyZWN0aW9uX2lucHV0CT0gYXQ5MV9ncGlvX2RpcmVjdGlvbl9pbnB1dCwKIAkuZ2V0CQkJPSBhdDkxX2dwaW9fZ2V0LAogCS5kaXJlY3Rpb25fb3V0cHV0CT0gYXQ5MV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1iYXl0cmFpbC5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYmF5dHJhaWwuYwppbmRleCA2NjViOTZiLi5iZjJiM2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1iYXl0cmFpbC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWJheXRyYWlsLmMKQEAgLTYwLDYgKzYwLDEwIEBACiAjZGVmaW5lIEJZVF9OR1BJT19OQ09SRQkJMjgKICNkZWZpbmUgQllUX05HUElPX1NVUwkJNDQKIAorI2RlZmluZSBCWVRfU0NPUkVfQUNQSV9VSUQJIjEiCisjZGVmaW5lIEJZVF9OQ09SRV9BQ1BJX1VJRAkiMiIKKyNkZWZpbmUgQllUX1NVU19BQ1BJX1VJRAkiMyIKKwogLyoKICAqIEJheXRyYWlsIGdwaW8gY29udHJvbGxlciBjb25zaXN0IG9mIHRocmVlIHNlcGFyYXRlIHN1Yi1jb250cm9sbGVycyBjYWxsZWQKICAqIFNDT1JFLCBOQ09SRSBhbmQgU1VTLiBUaGUgc3ViLWNvbnRyb2xsZXJzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIGFjcGkgVUlELgpAQCAtMTAyLDE3ICsxMDYsMTcgQEAKIAogc3RhdGljIHN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgYnl0X3Jhbmdlc1tdID0gewogCXsKLQkJLm5hbWUgPSAiMSIsIC8qIG1hdGNoIHdpdGggYWNwaSBfVUlEIGluIHByb2JlICovCisJCS5uYW1lID0gQllUX1NDT1JFX0FDUElfVUlELCAvKiBtYXRjaCB3aXRoIGFjcGkgX1VJRCBpbiBwcm9iZSAqLwogCQkubnBpbnMgPSBCWVRfTkdQSU9fU0NPUkUsCiAJCS5waW5zID0gc2NvcmVfcGlucywKIAl9LAogCXsKLQkJLm5hbWUgPSAiMiIsCisJCS5uYW1lID0gQllUX05DT1JFX0FDUElfVUlELAogCQkubnBpbnMgPSBCWVRfTkdQSU9fTkNPUkUsCiAJCS5waW5zID0gbmNvcmVfcGlucywKIAl9LAogCXsKLQkJLm5hbWUgPSAiMyIsCisJCS5uYW1lID0gQllUX1NVU19BQ1BJX1VJRCwKIAkJLm5waW5zID0gQllUX05HUElPX1NVUywKIAkJLnBpbnMgPSBzdXNfcGlucywKIAl9LApAQCAtMTQ1LDkgKzE0OSw0MSBAQAogCXJldHVybiB2Zy0+cmVnX2Jhc2UgKyByZWdfb2Zmc2V0ICsgcmVnOwogfQogCitzdGF0aWMgYm9vbCBpc19zcGVjaWFsX3BpbihzdHJ1Y3QgYnl0X2dwaW8gKnZnLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJLyogU0NPUkUgcGluIDkyLTkzICovCisJaWYgKCFzdHJjbXAodmctPnJhbmdlLT5uYW1lLCBCWVRfU0NPUkVfQUNQSV9VSUQpICYmCisJCW9mZnNldCA+PSA5MiAmJiBvZmZzZXQgPD0gOTMpCisJCXJldHVybiB0cnVlOworCisJLyogU1VTIHBpbiAxMS0yMSAqLworCWlmICghc3RyY21wKHZnLT5yYW5nZS0+bmFtZSwgQllUX1NVU19BQ1BJX1VJRCkgJiYKKwkJb2Zmc2V0ID49IDExICYmIG9mZnNldCA8PSAyMSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIHN0YXRpYyBpbnQgYnl0X2dwaW9fcmVxdWVzdChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCiB7CiAJc3RydWN0IGJ5dF9ncGlvICp2ZyA9IHRvX2J5dF9ncGlvKGNoaXApOworCXZvaWQgX19pb21lbSAqcmVnID0gYnl0X2dwaW9fcmVnKGNoaXAsIG9mZnNldCwgQllUX0NPTkYwX1JFRyk7CisJdTMyIHZhbHVlOworCWJvb2wgc3BlY2lhbDsKKworCS8qCisJICogSW4gbW9zdCBjYXNlcywgZnVuYyBwaW4gbXV4IDAwMCBtZWFucyBHUElPIGZ1bmN0aW9uLgorCSAqIEJ1dCwgc29tZSBwaW5zIG1heSBoYXZlIGZ1bmMgcGluIG11eCAwMDEgcmVwcmVzZW50cworCSAqIEdQSU8gZnVuY3Rpb24uIE9ubHkgYWxsb3cgdXNlciB0byBleHBvcnQgcGluIHdpdGgKKwkgKiBmdW5jIHBpbiBtdXggcHJlc2V0IGFzIEdQSU8gZnVuY3Rpb24gYnkgQklPUy9GVy4KKwkgKi8KKwl2YWx1ZSA9IHJlYWRsKHJlZykgJiBCWVRfUElOX01VWDsKKwlzcGVjaWFsID0gaXNfc3BlY2lhbF9waW4odmcsIG9mZnNldCk7CisJaWYgKChzcGVjaWFsICYmIHZhbHVlICE9IDEpIHx8ICghc3BlY2lhbCAmJiB2YWx1ZSkpIHsKKwkJZGV2X2VycigmdmctPnBkZXYtPmRldiwKKwkJCSJwaW4gJXUgY2Fubm90IGJlIHVzZWQgYXMgR1BJTy5cbiIsIG9mZnNldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXBtX3J1bnRpbWVfZ2V0KCZ2Zy0+cGRldi0+ZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtZXh5bm9zLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1leHlub3MuYwppbmRleCAxNTViMWIzLi4wN2M4MTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1leHlub3MuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1leHlub3MuYwpAQCAtMTA0Miw2ICsxMDQyLDg4IEBACiAJfSwKIH07CiAKKy8qIHBpbiBiYW5rcyBvZiBleHlub3M1MjYwIHBpbi1jb250cm9sbGVyIDAgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19waW5fYmFuayBleHlub3M1MjYwX3Bpbl9iYW5rczBbXSA9IHsKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNCwgMHgwMDAsICJncGEwIiwgMHgwMCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDcsIDB4MDIwLCAiZ3BhMSIsIDB4MDQpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg4LCAweDA0MCwgImdwYTIiLCAweDA4KSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNSwgMHgwNjAsICJncGIwIiwgMHgwYyksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDQsIDB4MDgwLCAiZ3BiMSIsIDB4MTApLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg1LCAweDBhMCwgImdwYjIiLCAweDE0KSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoOCwgMHgwYzAsICJncGIzIiwgMHgxOCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDgsIDB4MGUwLCAiZ3BiNCIsIDB4MWMpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg4LCAweDEwMCwgImdwYjUiLCAweDIwKSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoOCwgMHgxMjAsICJncGQwIiwgMHgyNCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDcsIDB4MTQwLCAiZ3BkMSIsIDB4MjgpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg1LCAweDE2MCwgImdwZDIiLCAweDJjKSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoOCwgMHgxODAsICJncGUwIiwgMHgzMCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDUsIDB4MWEwLCAiZ3BlMSIsIDB4MzQpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg0LCAweDFjMCwgImdwZjAiLCAweDM4KSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoOCwgMHgxZTAsICJncGYxIiwgMHgzYyksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDIsIDB4MjAwLCAiZ3BrMCIsIDB4NDApLAorCUVYWU5PU19QSU5fQkFOS19FSU5UVyg4LCAweGMwMCwgImdweDAiLCAweDAwKSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVFcoOCwgMHhjMjAsICJncHgxIiwgMHgwNCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRXKDgsIDB4YzQwLCAiZ3B4MiIsIDB4MDgpLAorCUVYWU5PU19QSU5fQkFOS19FSU5UVyg4LCAweGM2MCwgImdweDMiLCAweDBjKSwKK307CisKKy8qIHBpbiBiYW5rcyBvZiBleHlub3M1MjYwIHBpbi1jb250cm9sbGVyIDEgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19waW5fYmFuayBleHlub3M1MjYwX3Bpbl9iYW5rczFbXSA9IHsKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNywgMHgwMDAsICJncGMwIiwgMHgwMCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDYsIDB4MDIwLCAiZ3BjMSIsIDB4MDQpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg3LCAweDA0MCwgImdwYzIiLCAweDA4KSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNCwgMHgwNjAsICJncGMzIiwgMHgwYyksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDQsIDB4MDgwLCAiZ3BjNCIsIDB4MTApLAorfTsKKworLyogcGluIGJhbmtzIG9mIGV4eW5vczUyNjAgcGluLWNvbnRyb2xsZXIgMiAqLworc3RhdGljIHN0cnVjdCBzYW1zdW5nX3Bpbl9iYW5rIGV4eW5vczUyNjBfcGluX2JhbmtzMltdID0geworCUVYWU5PU19QSU5fQkFOS19FSU5URyg3LCAweDAwMCwgImdwejAiLCAweDAwKSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNCwgMHgwMjAsICJncHoxIiwgMHgwNCksCit9OworCisvKgorICogU2Ftc3VuZyBwaW5jdHJsIGRyaXZlciBkYXRhIGZvciBFeHlub3M1MjYwIFNvQy4gRXh5bm9zNTI2MCBTb0MgaW5jbHVkZXMKKyAqIHRocmVlIGdwaW8vcGluLW11eC9waW5jb25maWcgY29udHJvbGxlcnMuCisgKi8KK3N0cnVjdCBzYW1zdW5nX3Bpbl9jdHJsIGV4eW5vczUyNjBfcGluX2N0cmxbXSA9IHsKKwl7CisJCS8qIHBpbi1jb250cm9sbGVyIGluc3RhbmNlIDAgZGF0YSAqLworCQkucGluX2JhbmtzCT0gZXh5bm9zNTI2MF9waW5fYmFua3MwLAorCQkubnJfYmFua3MJPSBBUlJBWV9TSVpFKGV4eW5vczUyNjBfcGluX2JhbmtzMCksCisJCS5nZWludF9jb24JPSBFWFlOT1NfR1BJT19FQ09OX09GRlNFVCwKKwkJLmdlaW50X21hc2sJPSBFWFlOT1NfR1BJT19FTUFTS19PRkZTRVQsCisJCS5nZWludF9wZW5kCT0gRVhZTk9TX0dQSU9fRVBFTkRfT0ZGU0VULAorCQkud2VpbnRfY29uCT0gRVhZTk9TX1dLVVBfRUNPTl9PRkZTRVQsCisJCS53ZWludF9tYXNrCT0gRVhZTk9TX1dLVVBfRU1BU0tfT0ZGU0VULAorCQkud2VpbnRfcGVuZAk9IEVYWU5PU19XS1VQX0VQRU5EX09GRlNFVCwKKwkJLnN2YwkJPSBFWFlOT1NfU1ZDX09GRlNFVCwKKwkJLmVpbnRfZ3Bpb19pbml0ID0gZXh5bm9zX2VpbnRfZ3Bpb19pbml0LAorCQkuZWludF93a3VwX2luaXQgPSBleHlub3NfZWludF93a3VwX2luaXQsCisJCS5sYWJlbAkJPSAiZXh5bm9zNTI2MC1ncGlvLWN0cmwwIiwKKwl9LCB7CisJCS8qIHBpbi1jb250cm9sbGVyIGluc3RhbmNlIDEgZGF0YSAqLworCQkucGluX2JhbmtzCT0gZXh5bm9zNTI2MF9waW5fYmFua3MxLAorCQkubnJfYmFua3MJPSBBUlJBWV9TSVpFKGV4eW5vczUyNjBfcGluX2JhbmtzMSksCisJCS5nZWludF9jb24JPSBFWFlOT1NfR1BJT19FQ09OX09GRlNFVCwKKwkJLmdlaW50X21hc2sJPSBFWFlOT1NfR1BJT19FTUFTS19PRkZTRVQsCisJCS5nZWludF9wZW5kCT0gRVhZTk9TX0dQSU9fRVBFTkRfT0ZGU0VULAorCQkuc3ZjCQk9IEVYWU5PU19TVkNfT0ZGU0VULAorCQkuZWludF9ncGlvX2luaXQgPSBleHlub3NfZWludF9ncGlvX2luaXQsCisJCS5sYWJlbAkJPSAiZXh5bm9zNTI2MC1ncGlvLWN0cmwxIiwKKwl9LCB7CisJCS8qIHBpbi1jb250cm9sbGVyIGluc3RhbmNlIDIgZGF0YSAqLworCQkucGluX2JhbmtzCT0gZXh5bm9zNTI2MF9waW5fYmFua3MyLAorCQkubnJfYmFua3MJPSBBUlJBWV9TSVpFKGV4eW5vczUyNjBfcGluX2JhbmtzMiksCisJCS5nZWludF9jb24JPSBFWFlOT1NfR1BJT19FQ09OX09GRlNFVCwKKwkJLmdlaW50X21hc2sJPSBFWFlOT1NfR1BJT19FTUFTS19PRkZTRVQsCisJCS5nZWludF9wZW5kCT0gRVhZTk9TX0dQSU9fRVBFTkRfT0ZGU0VULAorCQkuc3ZjCQk9IEVYWU5PU19TVkNfT0ZGU0VULAorCQkuZWludF9ncGlvX2luaXQgPSBleHlub3NfZWludF9ncGlvX2luaXQsCisJCS5sYWJlbAkJPSAiZXh5bm9zNTI2MC1ncGlvLWN0cmwyIiwKKwl9LAorfTsKKwogLyogcGluIGJhbmtzIG9mIGV4eW5vczU0MjAgcGluLWNvbnRyb2xsZXIgMCAqLwogc3RhdGljIHN0cnVjdCBzYW1zdW5nX3Bpbl9iYW5rIGV4eW5vczU0MjBfcGluX2JhbmtzMFtdID0gewogCUVYWU5PU19QSU5fQkFOS19FSU5URyg4LCAweDAwMCwgImdweTciLCAweDAwKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWlteC5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtaW14LmMKaW5kZXggNDc3OWI4ZS4uZTExOGZiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtaW14LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtaW14LmMKQEAgLTQ5MSw3ICs0OTEsNyBAQAogCQkJcGluLT5tdXhfbW9kZSB8PSBJT01VWENfQ09ORklHX1NJT047CiAJCXBpbi0+Y29uZmlnID0gY29uZmlnICYgfklNWF9QQURfU0lPTjsKIAotCQlkZXZfZGJnKGluZm8tPmRldiwgIiVzOiAlZCAweCUwOGx4IiwgaW5mby0+cGluc1tpXS5uYW1lLAorCQlkZXZfZGJnKGluZm8tPmRldiwgIiVzOiAlZCAweCUwOGx4IiwgaW5mby0+cGluc1twaW5faWRdLm5hbWUsCiAJCQkJcGluLT5tdXhfbW9kZSwgcGluLT5jb25maWcpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtbXNtLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1tc20uYwppbmRleCBlZjJiZjMxLi4zNDNmNDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1tc20uYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1tc20uYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvY2hhaW5lZF9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjaW5jbHVkZSAiY29yZS5oIgpAQCAtNTAsNyArNDksNiBAQAogICogQGVuYWJsZWRfaXJxczogICBCaXRtYXAgb2YgY3VycmVudGx5IGVuYWJsZWQgaXJxcy4KICAqIEBkdWFsX2VkZ2VfaXJxczogQml0bWFwIG9mIGlycXMgdGhhdCBuZWVkIHN3IGVtdWxhdGVkIGR1YWwgZWRnZQogICogICAgICAgICAgICAgICAgICBkZXRlY3Rpb24uCi0gKiBAd2FrZV9pcnFzOiAgICAgIEJpdG1hcCBvZiBpcnFzIHdpdGggcmVxdWVzdGVkIGFzIHdha2V1cCBzb3VyY2UuCiAgKiBAc29jOyAgICAgICAgICAgIFJlZmVyZW5jZSB0byBzb2NfZGF0YSBvZiBwbGF0Zm9ybSBzcGVjaWZpYyBkYXRhLgogICogQHJlZ3M6ICAgICAgICAgICBCYXNlIGFkZHJlc3MgZm9yIHRoZSBUTE1NIHJlZ2lzdGVyIG1hcC4KICAqLwpAQCAtNjUsNyArNjMsNiBAQAogCiAJREVDTEFSRV9CSVRNQVAoZHVhbF9lZGdlX2lycXMsIE1BWF9OUl9HUElPKTsKIAlERUNMQVJFX0JJVE1BUChlbmFibGVkX2lycXMsIE1BWF9OUl9HUElPKTsKLQlERUNMQVJFX0JJVE1BUCh3YWtlX2lycXMsIE1BWF9OUl9HUElPKTsKIAogCWNvbnN0IHN0cnVjdCBtc21fcGluY3RybF9zb2NfZGF0YSAqc29jOwogCXZvaWQgX19pb21lbSAqcmVnczsKQEAgLTIwMyw0MiArMjAwLDI5IEBACiBzdGF0aWMgaW50IG1zbV9jb25maWdfcmVnKHN0cnVjdCBtc21fcGluY3RybCAqcGN0cmwsCiAJCQkgIGNvbnN0IHN0cnVjdCBtc21fcGluZ3JvdXAgKmcsCiAJCQkgIHVuc2lnbmVkIHBhcmFtLAotCQkJICBzMTYgKnJlZywKIAkJCSAgdW5zaWduZWQgKm1hc2ssCiAJCQkgIHVuc2lnbmVkICpiaXQpCiB7CiAJc3dpdGNoIChwYXJhbSkgewogCWNhc2UgUElOX0NPTkZJR19CSUFTX0RJU0FCTEU6Ci0JCSpyZWcgPSBnLT5jdGxfcmVnOwotCQkqYml0ID0gZy0+cHVsbF9iaXQ7Ci0JCSptYXNrID0gMzsKLQkJYnJlYWs7CiAJY2FzZSBQSU5fQ09ORklHX0JJQVNfUFVMTF9ET1dOOgotCQkqcmVnID0gZy0+Y3RsX3JlZzsKLQkJKmJpdCA9IGctPnB1bGxfYml0OwotCQkqbWFzayA9IDM7Ci0JCWJyZWFrOwogCWNhc2UgUElOX0NPTkZJR19CSUFTX1BVTExfVVA6Ci0JCSpyZWcgPSBnLT5jdGxfcmVnOwogCQkqYml0ID0gZy0+cHVsbF9iaXQ7CiAJCSptYXNrID0gMzsKIAkJYnJlYWs7CiAJY2FzZSBQSU5fQ09ORklHX0RSSVZFX1NUUkVOR1RIOgotCQkqcmVnID0gZy0+Y3RsX3JlZzsKIAkJKmJpdCA9IGctPmRydl9iaXQ7CiAJCSptYXNrID0gNzsKIAkJYnJlYWs7CisJY2FzZSBQSU5fQ09ORklHX09VVFBVVDoKKwkJKmJpdCA9IGctPm9lX2JpdDsKKwkJKm1hc2sgPSAxOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKHBjdHJsLT5kZXYsICJJbnZhbGlkIGNvbmZpZyBwYXJhbSAlMDR4XG4iLCBwYXJhbSk7CiAJCXJldHVybiAtRU5PVFNVUFA7CiAJfQogCi0JaWYgKCpyZWcgPCAwKSB7Ci0JCWRldl9lcnIocGN0cmwtPmRldiwgIkNvbmZpZyBwYXJhbSAlMDR4IG5vdCBzdXBwb3J0ZWQgb24gZ3JvdXAgJXNcbiIsCi0JCQlwYXJhbSwgZy0+bmFtZSk7Ci0JCXJldHVybiAtRU5PVFNVUFA7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI2MSw4ICsyNDUsMTAgQEAKICNkZWZpbmUgTVNNX1BVTExfRE9XTgkxCiAjZGVmaW5lIE1TTV9QVUxMX1VQCTMKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1zbV9yZWd2YWxfdG9fZHJpdmVbXSA9IHsgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMTYgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBtc21fZHJpdmVfdG9fcmVndmFsW10gPSB7IC0xLCAtMSwgMCwgLTEsIDEsIC0xLCAyLCAtMSwgMywgLTEsIDQsIC0xLCA1LCAtMSwgNiwgLTEsIDcgfTsKK3N0YXRpYyB1bnNpZ25lZCBtc21fcmVndmFsX3RvX2RyaXZlKHUzMiB2YWwpCit7CisJcmV0dXJuICh2YWwgKyAxKSAqIDI7Cit9CiAKIHN0YXRpYyBpbnQgbXNtX2NvbmZpZ19ncm91cF9nZXQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAogCQkJCXVuc2lnbmVkIGludCBncm91cCwKQEAgLTI3NCwxNyArMjYwLDE2IEBACiAJdW5zaWduZWQgbWFzazsKIAl1bnNpZ25lZCBhcmc7CiAJdW5zaWduZWQgYml0OwotCXMxNiByZWc7CiAJaW50IHJldDsKIAl1MzIgdmFsOwogCiAJZyA9ICZwY3RybC0+c29jLT5ncm91cHNbZ3JvdXBdOwogCi0JcmV0ID0gbXNtX2NvbmZpZ19yZWcocGN0cmwsIGcsIHBhcmFtLCAmcmVnLCAmbWFzaywgJmJpdCk7CisJcmV0ID0gbXNtX2NvbmZpZ19yZWcocGN0cmwsIGcsIHBhcmFtLCAmbWFzaywgJmJpdCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIHJlZyk7CisJdmFsID0gcmVhZGwocGN0cmwtPnJlZ3MgKyBnLT5jdGxfcmVnKTsKIAlhcmcgPSAodmFsID4+IGJpdCkgJiBtYXNrOwogCiAJLyogQ29udmVydCByZWdpc3RlciB2YWx1ZSB0byBwaW5jb25mIHZhbHVlICovCkBAIC0yOTksNyArMjg0LDE1IEBACiAJCWFyZyA9IGFyZyA9PSBNU01fUFVMTF9VUDsKIAkJYnJlYWs7CiAJY2FzZSBQSU5fQ09ORklHX0RSSVZFX1NUUkVOR1RIOgotCQlhcmcgPSBtc21fcmVndmFsX3RvX2RyaXZlW2FyZ107CisJCWFyZyA9IG1zbV9yZWd2YWxfdG9fZHJpdmUoYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBQSU5fQ09ORklHX09VVFBVVDoKKwkJLyogUGluIGlzIG5vdCBvdXRwdXQgKi8KKwkJaWYgKCFhcmcpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGctPmlvX3JlZyk7CisJCWFyZyA9ICEhKHZhbCAmIEJJVChnLT5pbl9iaXQpKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2VycihwY3RybC0+ZGV2LCAiVW5zdXBwb3J0ZWQgY29uZmlnIHBhcmFtZXRlcjogJXhcbiIsCkBAIC0zMjQsNyArMzE3LDYgQEAKIAl1bnNpZ25lZCBtYXNrOwogCXVuc2lnbmVkIGFyZzsKIAl1bnNpZ25lZCBiaXQ7Ci0JczE2IHJlZzsKIAlpbnQgcmV0OwogCXUzMiB2YWw7CiAJaW50IGk7CkBAIC0zMzUsNyArMzI3LDcgQEAKIAkJcGFyYW0gPSBwaW5jb25mX3RvX2NvbmZpZ19wYXJhbShjb25maWdzW2ldKTsKIAkJYXJnID0gcGluY29uZl90b19jb25maWdfYXJndW1lbnQoY29uZmlnc1tpXSk7CiAKLQkJcmV0ID0gbXNtX2NvbmZpZ19yZWcocGN0cmwsIGcsIHBhcmFtLCAmcmVnLCAmbWFzaywgJmJpdCk7CisJCXJldCA9IG1zbV9jb25maWdfcmVnKHBjdHJsLCBnLCBwYXJhbSwgJm1hc2ssICZiaXQpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKQEAgLTM1MiwxMCArMzQ0LDI0IEBACiAJCQlicmVhazsKIAkJY2FzZSBQSU5fQ09ORklHX0RSSVZFX1NUUkVOR1RIOgogCQkJLyogQ2hlY2sgZm9yIGludmFsaWQgdmFsdWVzICovCi0JCQlpZiAoYXJnID49IEFSUkFZX1NJWkUobXNtX2RyaXZlX3RvX3JlZ3ZhbCkpCisJCQlpZiAoYXJnID4gMTYgfHwgYXJnIDwgMiB8fCAoYXJnICUgMikgIT0gMCkKIAkJCQlhcmcgPSAtMTsKIAkJCWVsc2UKLQkJCQlhcmcgPSBtc21fZHJpdmVfdG9fcmVndmFsW2FyZ107CisJCQkJYXJnID0gKGFyZyAvIDIpIC0gMTsKKwkJCWJyZWFrOworCQljYXNlIFBJTl9DT05GSUdfT1VUUFVUOgorCQkJLyogc2V0IG91dHB1dCB2YWx1ZSAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CisJCQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGctPmlvX3JlZyk7CisJCQlpZiAoYXJnKQorCQkJCXZhbCB8PSBCSVQoZy0+b3V0X2JpdCk7CisJCQllbHNlCisJCQkJdmFsICY9IH5CSVQoZy0+b3V0X2JpdCk7CisJCQl3cml0ZWwodmFsLCBwY3RybC0+cmVncyArIGctPmlvX3JlZyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY3RybC0+bG9jaywgZmxhZ3MpOworCisJCQkvKiBlbmFibGUgb3V0cHV0ICovCisJCQlhcmcgPSAxOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlkZXZfZXJyKHBjdHJsLT5kZXYsICJVbnN1cHBvcnRlZCBjb25maWcgcGFyYW1ldGVyOiAleFxuIiwKQEAgLTM3MCwxMCArMzc2LDEwIEBACiAJCX0KIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKLQkJdmFsID0gcmVhZGwocGN0cmwtPnJlZ3MgKyByZWcpOworCQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGctPmN0bF9yZWcpOwogCQl2YWwgJj0gfihtYXNrIDw8IGJpdCk7CiAJCXZhbCB8PSBhcmcgPDwgYml0OwotCQl3cml0ZWwodmFsLCBwY3RybC0+cmVncyArIHJlZyk7CisJCXdyaXRlbCh2YWwsIHBjdHJsLT5yZWdzICsgZy0+Y3RsX3JlZyk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAJfQogCkBAIC00MDIsOCArNDA4LDYgQEAKIAl1MzIgdmFsOwogCiAJZyA9ICZwY3RybC0+c29jLT5ncm91cHNbb2Zmc2V0XTsKLQlpZiAoV0FSTl9PTihnLT5pb19yZWcgPCAwKSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKIApAQCAtNDI0LDggKzQyOCw2IEBACiAJdTMyIHZhbDsKIAogCWcgPSAmcGN0cmwtPnNvYy0+Z3JvdXBzW29mZnNldF07Ci0JaWYgKFdBUk5fT04oZy0+aW9fcmVnIDwgMCkpCi0JCXJldHVybiAtRUlOVkFMOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKQEAgLTQ1Miw4ICs0NTQsNiBAQAogCXUzMiB2YWw7CiAKIAlnID0gJnBjdHJsLT5zb2MtPmdyb3Vwc1tvZmZzZXRdOwotCWlmIChXQVJOX09OKGctPmlvX3JlZyA8IDApKQotCQlyZXR1cm4gLUVJTlZBTDsKIAogCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgZy0+aW9fcmVnKTsKIAlyZXR1cm4gISEodmFsICYgQklUKGctPmluX2JpdCkpOwpAQCAtNDY3LDggKzQ2Nyw2IEBACiAJdTMyIHZhbDsKIAogCWcgPSAmcGN0cmwtPnNvYy0+Z3JvdXBzW29mZnNldF07Ci0JaWYgKFdBUk5fT04oZy0+aW9fcmVnIDwgMCkpCi0JCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwY3RybC0+bG9jaywgZmxhZ3MpOwogCkBAIC01MzQsNyArNTMyLDcgQEAKIAlwdWxsID0gKGN0bF9yZWcgPj4gZy0+cHVsbF9iaXQpICYgMzsKIAogCXNlcV9wcmludGYocywgIiAlLThzOiAlLTNzICVkIiwgZy0+bmFtZSwgaXNfb3V0ID8gIm91dCIgOiAiaW4iLCBmdW5jKTsKLQlzZXFfcHJpbnRmKHMsICIgJWRtQSIsIG1zbV9yZWd2YWxfdG9fZHJpdmVbZHJpdmVdKTsKKwlzZXFfcHJpbnRmKHMsICIgJWRtQSIsIG1zbV9yZWd2YWxfdG9fZHJpdmUoZHJpdmUpKTsKIAlzZXFfcHJpbnRmKHMsICIgJXMiLCBwdWxsc1twdWxsXSk7CiB9CiAKQEAgLTYxNyw4ICs2MTUsNiBAQAogCiAJcGN0cmwgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKIAlnID0gJnBjdHJsLT5zb2MtPmdyb3Vwc1tkLT5od2lycV07Ci0JaWYgKFdBUk5fT04oZy0+aW50cl9jZmdfcmVnIDwgMCkpCi0JCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwY3RybC0+bG9jaywgZmxhZ3MpOwogCkBAIC02NDAsOCArNjM2LDYgQEAKIAogCXBjdHJsID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CiAJZyA9ICZwY3RybC0+c29jLT5ncm91cHNbZC0+aHdpcnFdOwotCWlmIChXQVJOX09OKGctPmludHJfc3RhdHVzX3JlZyA8IDApKQotCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKIApAQCAtNjY3LDggKzY2MSw2IEBACiAKIAlwY3RybCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCWcgPSAmcGN0cmwtPnNvYy0+Z3JvdXBzW2QtPmh3aXJxXTsKLQlpZiAoV0FSTl9PTihnLT5pbnRyX3N0YXR1c19yZWcgPCAwKSkKLQkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKQEAgLTY5Myw4ICs2ODUsNiBAQAogCiAJcGN0cmwgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKIAlnID0gJnBjdHJsLT5zb2MtPmdyb3Vwc1tkLT5od2lycV07Ci0JaWYgKFdBUk5fT04oZy0+aW50cl9jZmdfcmVnIDwgMCkpCi0JCXJldHVybiAtRUlOVkFMOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKQEAgLTc4MywyMiArNzczLDEyIEBACiB7CiAJc3RydWN0IG1zbV9waW5jdHJsICpwY3RybDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIG5ncGlvOwogCiAJcGN0cmwgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQluZ3BpbyA9IHBjdHJsLT5jaGlwLm5ncGlvOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKLQlpZiAob24pIHsKLQkJaWYgKGJpdG1hcF9lbXB0eShwY3RybC0+d2FrZV9pcnFzLCBuZ3BpbykpCi0JCQllbmFibGVfaXJxX3dha2UocGN0cmwtPmlycSk7Ci0JCXNldF9iaXQoZC0+aHdpcnEsIHBjdHJsLT53YWtlX2lycXMpOwotCX0gZWxzZSB7Ci0JCWNsZWFyX2JpdChkLT5od2lycSwgcGN0cmwtPndha2VfaXJxcyk7Ci0JCWlmIChiaXRtYXBfZW1wdHkocGN0cmwtPndha2VfaXJxcywgbmdwaW8pKQotCQkJZGlzYWJsZV9pcnFfd2FrZShwY3RybC0+aXJxKTsKLQl9CisJaXJxX3NldF9pcnFfd2FrZShwY3RybC0+aXJxLCBvbik7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY3RybC0+bG9jaywgZmxhZ3MpOwogCkBAIC04NjksNiArODQ5LDEyIEBACiAJY2hhaW5lZF9pcnFfZXhpdChjaGlwLCBkZXNjKTsKIH0KIAorLyoKKyAqIFRoaXMgbG9jayBjbGFzcyB0ZWxscyBsb2NrZGVwIHRoYXQgR1BJTyBpcnFzIGFyZSBpbiBhIGRpZmZlcmVudAorICogY2F0ZWdvcnkgdGhhbiB0aGVpciBwYXJlbnRzLCBzbyBpdCB3b24ndCByZXBvcnQgZmFsc2UgcmVjdXJzaW9uLgorICovCitzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGdwaW9fbG9ja19jbGFzczsKKwogc3RhdGljIGludCBtc21fZ3Bpb19pbml0KHN0cnVjdCBtc21fcGluY3RybCAqcGN0cmwpCiB7CiAJc3RydWN0IGdwaW9fY2hpcCAqY2hpcDsKQEAgLTg3NiwxMCArODYyLDE0IEBACiAJaW50IHJldDsKIAlpbnQgaTsKIAlpbnQgcjsKKwl1bnNpZ25lZCBuZ3BpbyA9IHBjdHJsLT5zb2MtPm5ncGlvczsKKworCWlmIChXQVJOX09OKG5ncGlvID4gTUFYX05SX0dQSU8pKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNoaXAgPSAmcGN0cmwtPmNoaXA7CiAJY2hpcC0+YmFzZSA9IDA7Ci0JY2hpcC0+bmdwaW8gPSBwY3RybC0+c29jLT5uZ3Bpb3M7CisJY2hpcC0+bmdwaW8gPSBuZ3BpbzsKIAljaGlwLT5sYWJlbCA9IGRldl9uYW1lKHBjdHJsLT5kZXYpOwogCWNoaXAtPmRldiA9IHBjdHJsLT5kZXY7CiAJY2hpcC0+b3duZXIgPSBUSElTX01PRFVMRTsKQEAgLTkwNyw2ICs4OTcsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IGNoaXAtPm5ncGlvOyBpKyspIHsKIAkJaXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKHBjdHJsLT5kb21haW4sIGkpOworCQlpcnFfc2V0X2xvY2tkZXBfY2xhc3MoaXJxLCAmZ3Bpb19sb2NrX2NsYXNzKTsKIAkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJm1zbV9ncGlvX2lycV9jaGlwLCBoYW5kbGVfZWRnZV9pcnEpOwogCQlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIHBjdHJsKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1tc20uaCBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLW1zbS5oCmluZGV4IDIwNmU3ODJlLi44ZmJlOWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1tc20uaAorKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1tc20uaApAQCAtMTMsMTAgKzEzLDcgQEAKICNpZm5kZWYgX19QSU5DVFJMX01TTV9IX18KICNkZWZpbmUgX19QSU5DVFJMX01TTV9IX18KIAotI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY3RybC5oPgotI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGlubXV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jb25mLmg+Ci0jaW5jbHVkZSA8bGludXgvcGluY3RybC9tYWNoaW5lLmg+CitzdHJ1Y3QgcGluY3RybF9waW5fZGVzYzsKIAogLyoqCiAgKiBzdHJ1Y3QgbXNtX2Z1bmN0aW9uIC0gYSBwaW5tdXggZnVuY3Rpb24KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLW1zbTh4NzQuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLW1zbTh4NzQuYwppbmRleCBmOTQ0YmYyLi5kZGU1NTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1tc204eDc0LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtbXNtOHg3NC5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmN0cmwuaD4KLSNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3Bpbm11eC5oPgogCiAjaW5jbHVkZSAicGluY3RybC1tc20uaCIKIApAQCAtNDA2LDYgKzQwNSw3IEBACiAJTVNNX01VWF9ibHNwX2kyYzYsCiAJTVNNX01VWF9ibHNwX2kyYzExLAogCU1TTV9NVVhfYmxzcF9zcGkxLAorCU1TTV9NVVhfYmxzcF9zcGk4LAogCU1TTV9NVVhfYmxzcF91YXJ0MiwKIAlNU01fTVVYX2Jsc3BfdWFydDgsCiAJTVNNX01VWF9zbGltYnVzLApAQCAtNDE2LDYgKzQxNiw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3BfaTJjNl9ncm91cHNbXSA9IHsgImdwaW8yOSIsICJncGlvMzAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3BfaTJjMTFfZ3JvdXBzW10gPSB7ICJncGlvODMiLCAiZ3Bpbzg0IiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibHNwX3NwaTFfZ3JvdXBzW10gPSB7ICJncGlvMCIsICJncGlvMSIsICJncGlvMiIsICJncGlvMyIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmxzcF9zcGk4X2dyb3Vwc1tdID0geworCSJncGlvNDUiLCAiZ3BpbzQ2IiwgImdwaW80NyIsICJncGlvNDgiCit9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibHNwX3VhcnQyX2dyb3Vwc1tdID0geyAiZ3BpbzQiLCAiZ3BpbzUiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3BfdWFydDhfZ3JvdXBzW10gPSB7ICJncGlvNDUiLCAiZ3BpbzQ2IiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzbGltYnVzX2dyb3Vwc1tdID0geyAiZ3BpbzcwIiwgImdwaW83MSIgfTsKQEAgLTQyNSw2ICs0MjgsNyBAQAogCUZVTkNUSU9OKGJsc3BfaTJjNiksCiAJRlVOQ1RJT04oYmxzcF9pMmMxMSksCiAJRlVOQ1RJT04oYmxzcF9zcGkxKSwKKwlGVU5DVElPTihibHNwX3NwaTgpLAogCUZVTkNUSU9OKGJsc3BfdWFydDIpLAogCUZVTkNUSU9OKGJsc3BfdWFydDgpLAogCUZVTkNUSU9OKHNsaW1idXMpLApAQCAtNDc2LDEwICs0ODAsMTAgQEAKIAlQSU5HUk9VUCg0MiwgIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKIAlQSU5HUk9VUCg0MywgIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKIAlQSU5HUk9VUCg0NCwgIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg0NSwgIE5BLCBibHNwX3VhcnQ4LCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDQ2LCAgTkEsIGJsc3BfdWFydDgsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoNDcsICBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoNDgsICBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNDUsICBibHNwX3NwaTgsIGJsc3BfdWFydDgsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNDYsICBibHNwX3NwaTgsIGJsc3BfdWFydDgsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNDcsICBibHNwX3NwaTgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDQ4LCAgYmxzcF9zcGk4LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKIAlQSU5HUk9VUCg0OSwgIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKIAlQSU5HUk9VUCg1MCwgIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKIAlQSU5HUk9VUCg1MSwgIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLW5vbWFkaWsuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLW5vbWFkaWsuYwppbmRleCA1M2ExMTExLi5jZWM3NzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1ub21hZGlrLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtbm9tYWRpay5jCkBAIC0yMDM1LDI3ICsyMDM1LDI5IEBACiAJe30sCiB9OwogCi1zdGF0aWMgaW50IG5ta19waW5jdHJsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBubWtfcGluY3RybF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgbm1rX3BpbmN0cmwgKm5wY3Q7CiAKLQlucGN0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJbnBjdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWlmICghbnBjdCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gcGluY3RybF9mb3JjZV9zbGVlcChucGN0LT5wY3RsKTsKIH0KIAotc3RhdGljIGludCBubWtfcGluY3RybF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgbm1rX3BpbmN0cmxfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgbm1rX3BpbmN0cmwgKm5wY3Q7CiAKLQlucGN0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJbnBjdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWlmICghbnBjdCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gcGluY3RybF9mb3JjZV9kZWZhdWx0KG5wY3QtPnBjdGwpOwogfQorI2VuZGlmCiAKIHN0YXRpYyBpbnQgbm1rX3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKQEAgLTIxNDQsMTcgKzIxNDYsMTggQEAKIAkucHJvYmUgPSBubWtfZ3Bpb19wcm9iZSwKIH07CiAKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhubWtfcGluY3RybF9wbV9vcHMsCisJCQlubWtfcGluY3RybF9zdXNwZW5kLAorCQkJbm1rX3BpbmN0cmxfcmVzdW1lKTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbm1rX3BpbmN0cmxfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCQkubmFtZSA9ICJwaW5jdHJsLW5vbWFkaWsiLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBubWtfcGluY3RybF9tYXRjaCwKKwkJLnBtID0gJm5ta19waW5jdHJsX3BtX29wcywKIAl9LAogCS5wcm9iZSA9IG5ta19waW5jdHJsX3Byb2JlLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kID0gbm1rX3BpbmN0cmxfc3VzcGVuZCwKLQkucmVzdW1lID0gbm1rX3BpbmN0cmxfcmVzdW1lLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBubWtfZ3Bpb19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zYW1zdW5nLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zYW1zdW5nLmMKaW5kZXggNDdlYzJlOC4uMDMyNGQ0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc2Ftc3VuZy5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXNhbXN1bmcuYwpAQCAtMTEyMCw2ICsxMTIwLDggQEAKIAkJLmRhdGEgPSAodm9pZCAqKWV4eW5vczR4MTJfcGluX2N0cmwgfSwKIAl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTI1MC1waW5jdHJsIiwKIAkJLmRhdGEgPSAodm9pZCAqKWV4eW5vczUyNTBfcGluX2N0cmwgfSwKKwl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTI2MC1waW5jdHJsIiwKKwkJLmRhdGEgPSAodm9pZCAqKWV4eW5vczUyNjBfcGluX2N0cmwgfSwKIAl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTQyMC1waW5jdHJsIiwKIAkJLmRhdGEgPSAodm9pZCAqKWV4eW5vczU0MjBfcGluX2N0cmwgfSwKIAl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsczVwdjIxMC1waW5jdHJsIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXNhbXN1bmcuaCBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXNhbXN1bmcuaAppbmRleCAzMDYyMmQ5Li5iYWI5YzIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zYW1zdW5nLmgKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc2Ftc3VuZy5oCkBAIC0yNTQsNiArMjU0LDcgQEAKIGV4dGVybiBzdHJ1Y3Qgc2Ftc3VuZ19waW5fY3RybCBleHlub3M0MjEwX3Bpbl9jdHJsW107CiBleHRlcm4gc3RydWN0IHNhbXN1bmdfcGluX2N0cmwgZXh5bm9zNHgxMl9waW5fY3RybFtdOwogZXh0ZXJuIHN0cnVjdCBzYW1zdW5nX3Bpbl9jdHJsIGV4eW5vczUyNTBfcGluX2N0cmxbXTsKK2V4dGVybiBzdHJ1Y3Qgc2Ftc3VuZ19waW5fY3RybCBleHlub3M1MjYwX3Bpbl9jdHJsW107CiBleHRlcm4gc3RydWN0IHNhbXN1bmdfcGluX2N0cmwgZXh5bm9zNTQyMF9waW5fY3RybFtdOwogZXh0ZXJuIHN0cnVjdCBzYW1zdW5nX3Bpbl9jdHJsIHMzYzY0eHhfcGluX2N0cmxbXTsKIGV4dGVybiBzdHJ1Y3Qgc2Ftc3VuZ19waW5fY3RybCBzM2MyNDEyX3Bpbl9jdHJsW107CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zaW5nbGUuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXNpbmdsZS5jCmluZGV4IGRlNjQ1OTYuLjgxMDc1ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXNpbmdsZS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXNpbmdsZS5jCkBAIC02NjIsNiArNjYyLDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIFBJTl9DT05GSUdfRFJJVkVfU1RSRU5HVEg6CiAJCWNhc2UgUElOX0NPTkZJR19TTEVXX1JBVEU6CisJCWNhc2UgUElOX0NPTkZJR19MT1dfUE9XRVJfTU9ERToKIAkJZGVmYXVsdDoKIAkJCSpjb25maWcgPSBkYXRhOwogCQkJYnJlYWs7CkBAIC02OTksNiArNzAwLDcgQEAKIAkJCWNhc2UgUElOX0NPTkZJR19JTlBVVF9TQ0hNSVRUOgogCQkJY2FzZSBQSU5fQ09ORklHX0RSSVZFX1NUUkVOR1RIOgogCQkJY2FzZSBQSU5fQ09ORklHX1NMRVdfUkFURToKKwkJCWNhc2UgUElOX0NPTkZJR19MT1dfUE9XRVJfTU9ERToKIAkJCQlzaGlmdCA9IGZmcyhmdW5jLT5jb25mW2ldLm1hc2spIC0gMTsKIAkJCQlkYXRhICY9IH5mdW5jLT5jb25mW2ldLm1hc2s7CiAJCQkJZGF0YSB8PSAoYXJnIDw8IHNoaWZ0KSAmIGZ1bmMtPmNvbmZbaV0ubWFzazsKQEAgLTExMDEsNiArMTEwMyw3IEBACiAJCXsgInBpbmN0cmwtc2luZ2xlLGRyaXZlLXN0cmVuZ3RoIiwgUElOX0NPTkZJR19EUklWRV9TVFJFTkdUSCwgfSwKIAkJeyAicGluY3RybC1zaW5nbGUsc2xldy1yYXRlIiwgUElOX0NPTkZJR19TTEVXX1JBVEUsIH0sCiAJCXsgInBpbmN0cmwtc2luZ2xlLGlucHV0LXNjaG1pdHQiLCBQSU5fQ09ORklHX0lOUFVUX1NDSE1JVFQsIH0sCisJCXsgInBpbmN0cmwtc2luZ2xlLGxvdy1wb3dlci1tb2RlIiwgUElOX0NPTkZJR19MT1dfUE9XRVJfTU9ERSwgfSwKIAl9OwogCXN0cnVjdCBwY3NfY29uZl90eXBlIHByb3A0W10gPSB7CiAJCXsgInBpbmN0cmwtc2luZ2xlLGJpYXMtcHVsbHVwIiwgUElOX0NPTkZJR19CSUFTX1BVTExfVVAsIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zdC5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc3QuYwppbmRleCAzMjBjMjczLi5iZDcyNWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zdC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXN0LmMKQEAgLTEzLDcgKzEzLDEyIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZGVzYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvY2hhaW5lZF9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CkBAIC0yNjYsMTEgKzI3MSw1OSBAQAogCXN0cnVjdCBzdF9waW5jb25mCSpwaW5fY29uZjsKIH07CiAKKy8qCisgKiBFZGdlIHRyaWdnZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGF0IGhhcmR3YXJlIGxldmVsLCBpdCBpcyBzdXBwb3J0ZWQgYnkKKyAqIHNvZnR3YXJlIGJ5IGV4cGxvaXRpbmcgdGhlIGxldmVsIHRyaWdnZXIgc3VwcG9ydCBpbiBoYXJkd2FyZS4KKyAqIFNvZnR3YXJlIHVzZXMgYSB2aXJ0dWFsIHJlZ2lzdGVyIChFREdFX0NPTkYpIGZvciBlZGdlIHRyaWdnZXIgY29uZmlndXJhdGlvbgorICogb2YgZWFjaCBncGlvIHBpbiBpbiBhIEdQSU8gYmFuay4KKyAqCisgKiBFYWNoIGJhbmsgaGFzIGEgMzIgYml0IEVER0VfQ09ORiByZWdpc3RlciB3aGljaCBpcyBkaXZpZGVkIGluIHRvIDggcGFydHMgb2YKKyAqIDQtYml0cy4gRWFjaCA0LWJpdCBzcGFjZSBpcyBhbGxvY2F0ZWQgZm9yIGVhY2ggcGluIGluIGEgZ3BpbyBiYW5rLgorICoKKyAqIGJpdCBhbGxvY2F0aW9uIHBlciBwaW4gaXM6CisgKiBCaXRzOiAgWzAgLSAzXSB8IFs0IC0gN10gIFs4IC0gMTFdIC4uLiAuLi4gLi4uIC4uLiAgWyAyOCAtIDMxXQorICogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgIHwgIHBpbi0wICB8ICBwaW4tMiB8IHBpbi0zICB8IC4uLiAuLi4gLi4uIC4uLiB8IHBpbiAtNyB8CisgKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBBIHBpbiBjYW4gaGF2ZSBvbmUgb2YgZm9sbG93aW5nIHRoZSB2YWx1ZXMgaW4gaXRzIGVkZ2UgY29uZmlndXJhdGlvbiBmaWVsZC4KKyAqCisgKgktLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJWzAtM10JLSBEZXNjcmlwdGlvbgorICoJLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCTAwMDAJLSBObyBlZGdlIElSUS4KKyAqCTAwMDEJLSBGYWxsaW5nIGVkZ2UgSVJRLgorICoJMDAxMAktIFJpc2luZyBlZGdlIElSUS4KKyAqCTAwMTEJLSBSaXNpbmcgYW5kIEZhbGxpbmcgZWRnZSBJUlEuCisgKgktLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNkZWZpbmUgU1RfSVJRX0VER0VfQ09ORl9CSVRTX1BFUl9QSU4JNAorI2RlZmluZSBTVF9JUlFfRURHRV9NQVNLCQkweGYKKyNkZWZpbmUgU1RfSVJRX0VER0VfRkFMTElORwkJQklUKDApCisjZGVmaW5lIFNUX0lSUV9FREdFX1JJU0lORwkJQklUKDEpCisjZGVmaW5lIFNUX0lSUV9FREdFX0JPVEgJCShCSVQoMCkgfCBCSVQoMSkpCisKKyNkZWZpbmUgU1RfSVJRX1JJU0lOR19FREdFX0NPTkYocGluKSBcCisJKFNUX0lSUV9FREdFX1JJU0lORyA8PCAocGluICogU1RfSVJRX0VER0VfQ09ORl9CSVRTX1BFUl9QSU4pKQorCisjZGVmaW5lIFNUX0lSUV9GQUxMSU5HX0VER0VfQ09ORihwaW4pIFwKKwkoU1RfSVJRX0VER0VfRkFMTElORyA8PCAocGluICogU1RfSVJRX0VER0VfQ09ORl9CSVRTX1BFUl9QSU4pKQorCisjZGVmaW5lIFNUX0lSUV9CT1RIX0VER0VfQ09ORihwaW4pIFwKKwkoU1RfSVJRX0VER0VfQk9USCA8PCAocGluICogU1RfSVJRX0VER0VfQ09ORl9CSVRTX1BFUl9QSU4pKQorCisjZGVmaW5lIFNUX0lSUV9FREdFX0NPTkYoY29uZiwgcGluKSBcCisJKGNvbmYgPj4gKHBpbiAqIFNUX0lSUV9FREdFX0NPTkZfQklUU19QRVJfUElOKSAmIFNUX0lSUV9FREdFX01BU0spCisKIHN0cnVjdCBzdF9ncGlvX2JhbmsgewogCXN0cnVjdCBncGlvX2NoaXAJCWdwaW9fY2hpcDsKIAlzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlCXJhbmdlOwogCXZvaWQgX19pb21lbQkJCSpiYXNlOwogCXN0cnVjdCBzdF9waW9fY29udHJvbAkJcGM7CisJc3RydWN0CWlycV9kb21haW4JCSpkb21haW47CisJdW5zaWduZWQgbG9uZwkJCWlycV9lZGdlX2NvbmY7CisJc3BpbmxvY2tfdCAgICAgICAgICAgICAgICAgICAgICBsb2NrOwogfTsKIAogc3RydWN0IHN0X3BpbmN0cmwgewpAQCAtMjg0LDYgKzMzNyw3IEBACiAJaW50CQkJCW5ncm91cHM7CiAJc3RydWN0IHJlZ21hcAkJCSpyZWdtYXA7CiAJY29uc3Qgc3RydWN0IHN0X3BjdGxfZGF0YQkqZGF0YTsKKwl2b2lkIF9faW9tZW0JCQkqaXJxbXV4X2Jhc2U7CiB9OwogCiAvKiBTT0Mgc3BlY2lmaWMgZGF0YSAqLwpAQCAtMzMwLDEyICszODQsMjUgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RfcGN0bF9kYXRhICBzdGloNDE2X2RhdGEgPSB7CiAJLnJ0X3N0eWxlCT0gc3RfcmV0aW1lX3N0eWxlX2RlZGljYXRlZCwKIAkuaW5wdXRfZGVsYXlzCT0gc3RpaDQxNl9kZWxheXMsCi0JLm5pbnB1dF9kZWxheXMJPSAxNCwKKwkubmlucHV0X2RlbGF5cwk9IEFSUkFZX1NJWkUoc3RpaDQxNl9kZWxheXMpLAogCS5vdXRwdXRfZGVsYXlzCT0gc3RpaDQxNl9kZWxheXMsCi0JLm5vdXRwdXRfZGVsYXlzID0gMTQsCisJLm5vdXRwdXRfZGVsYXlzID0gQVJSQVlfU0laRShzdGloNDE2X2RlbGF5cyksCiAJLmFsdCA9IDAsIC5vZSA9IDQwLCAucHUgPSA1MCwgLm9kID0gNjAsIC5ydCA9IDEwMCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RfcGN0bF9kYXRhIHN0aWg0MDdfZmxhc2hkYXRhID0geworCS5ydF9zdHlsZQk9IHN0X3JldGltZV9zdHlsZV9ub25lLAorCS5pbnB1dF9kZWxheXMJPSBzdGloNDE2X2RlbGF5cywKKwkubmlucHV0X2RlbGF5cwk9IEFSUkFZX1NJWkUoc3RpaDQxNl9kZWxheXMpLAorCS5vdXRwdXRfZGVsYXlzCT0gc3RpaDQxNl9kZWxheXMsCisJLm5vdXRwdXRfZGVsYXlzID0gQVJSQVlfU0laRShzdGloNDE2X2RlbGF5cyksCisJLmFsdCA9IDAsCisJLm9lID0gLTEsIC8qIE5vdCBBdmFpbGFibGUgKi8KKwkucHUgPSAtMSwgLyogTm90IEF2YWlsYWJsZSAqLworCS5vZCA9IDYwLAorCS5ydCA9IDEwMCwKK307CisKIC8qIExvdyBsZXZlbCBmdW5jdGlvbnMuLiAqLwogc3RhdGljIGlubGluZSBpbnQgc3RfZ3Bpb19iYW5rKGludCBncGlvKQogewpAQCAtMzU2LDI1ICs0MjMsMjkgQEAKIAl1bnNpZ25lZCBpbnQgb2VfdmFsdWUsIHB1X3ZhbHVlLCBvZF92YWx1ZTsKIAl1bnNpZ25lZCBsb25nIG1hc2sgPSBCSVQocGluKTsKIAotCXJlZ21hcF9maWVsZF9yZWFkKG91dHB1dF9lbmFibGUsICZvZV92YWx1ZSk7Ci0JcmVnbWFwX2ZpZWxkX3JlYWQocHVsbF91cCwgJnB1X3ZhbHVlKTsKLQlyZWdtYXBfZmllbGRfcmVhZChvcGVuX2RyYWluLCAmb2RfdmFsdWUpOworCWlmIChvdXRwdXRfZW5hYmxlKSB7CisJCXJlZ21hcF9maWVsZF9yZWFkKG91dHB1dF9lbmFibGUsICZvZV92YWx1ZSk7CisJCW9lX3ZhbHVlICY9IH5tYXNrOworCQlpZiAoY29uZmlnICYgU1RfUElOQ09ORl9PRSkKKwkJCW9lX3ZhbHVlIHw9IG1hc2s7CisJCXJlZ21hcF9maWVsZF93cml0ZShvdXRwdXRfZW5hYmxlLCBvZV92YWx1ZSk7CisJfQogCi0JLyogQ2xlYXIgb2xkIHZhbHVlcyAqLwotCW9lX3ZhbHVlICY9IH5tYXNrOwotCXB1X3ZhbHVlICY9IH5tYXNrOwotCW9kX3ZhbHVlICY9IH5tYXNrOworCWlmIChwdWxsX3VwKSB7CisJCXJlZ21hcF9maWVsZF9yZWFkKHB1bGxfdXAsICZwdV92YWx1ZSk7CisJCXB1X3ZhbHVlICY9IH5tYXNrOworCQlpZiAoY29uZmlnICYgU1RfUElOQ09ORl9QVSkKKwkJCXB1X3ZhbHVlIHw9IG1hc2s7CisJCXJlZ21hcF9maWVsZF93cml0ZShwdWxsX3VwLCBwdV92YWx1ZSk7CisJfQogCi0JaWYgKGNvbmZpZyAmIFNUX1BJTkNPTkZfT0UpCi0JCW9lX3ZhbHVlIHw9IG1hc2s7Ci0JaWYgKGNvbmZpZyAmIFNUX1BJTkNPTkZfUFUpCi0JCXB1X3ZhbHVlIHw9IG1hc2s7Ci0JaWYgKGNvbmZpZyAmIFNUX1BJTkNPTkZfT0QpCi0JCW9kX3ZhbHVlIHw9IG1hc2s7Ci0KLQlyZWdtYXBfZmllbGRfd3JpdGUob3V0cHV0X2VuYWJsZSwgb2VfdmFsdWUpOwotCXJlZ21hcF9maWVsZF93cml0ZShwdWxsX3VwLCBwdV92YWx1ZSk7Ci0JcmVnbWFwX2ZpZWxkX3dyaXRlKG9wZW5fZHJhaW4sIG9kX3ZhbHVlKTsKKwlpZiAob3Blbl9kcmFpbikgeworCQlyZWdtYXBfZmllbGRfcmVhZChvcGVuX2RyYWluLCAmb2RfdmFsdWUpOworCQlvZF92YWx1ZSAmPSB+bWFzazsKKwkJaWYgKGNvbmZpZyAmIFNUX1BJTkNPTkZfT0QpCisJCQlvZF92YWx1ZSB8PSBtYXNrOworCQlyZWdtYXBfZmllbGRfd3JpdGUob3Blbl9kcmFpbiwgb2RfdmFsdWUpOworCX0KIH0KIAogc3RhdGljIHZvaWQgc3RfcGN0bF9zZXRfZnVuY3Rpb24oc3RydWN0IHN0X3Bpb19jb250cm9sICpwYywKQEAgLTM4NSw2ICs0NTYsOSBAQAogCWludCBwaW4gPSBzdF9ncGlvX3BpbihwaW5faWQpOwogCWludCBvZmZzZXQgPSBwaW4gKiA0OwogCisJaWYgKCFhbHQpCisJCXJldHVybjsKKwogCXJlZ21hcF9maWVsZF9yZWFkKGFsdCwgJnZhbCk7CiAJdmFsICY9IH4oMHhmIDw8IG9mZnNldCk7CiAJdmFsIHw9IGZ1bmN0aW9uIDw8IG9mZnNldDsKQEAgLTUyMiwxNyArNTk2LDIzIEBACiB7CiAJdW5zaWduZWQgaW50IG9lX3ZhbHVlLCBwdV92YWx1ZSwgb2RfdmFsdWU7CiAKLQlyZWdtYXBfZmllbGRfcmVhZChwYy0+b2UsICZvZV92YWx1ZSk7Ci0JcmVnbWFwX2ZpZWxkX3JlYWQocGMtPnB1LCAmcHVfdmFsdWUpOwotCXJlZ21hcF9maWVsZF9yZWFkKHBjLT5vZCwgJm9kX3ZhbHVlKTsKKwlpZiAocGMtPm9lKSB7CisJCXJlZ21hcF9maWVsZF9yZWFkKHBjLT5vZSwgJm9lX3ZhbHVlKTsKKwkJaWYgKG9lX3ZhbHVlICYgQklUKHBpbikpCisJCQlTVF9QSU5DT05GX1BBQ0tfT0UoKmNvbmZpZyk7CisJfQogCi0JaWYgKG9lX3ZhbHVlICYgQklUKHBpbikpCi0JCVNUX1BJTkNPTkZfUEFDS19PRSgqY29uZmlnKTsKLQlpZiAocHVfdmFsdWUgJiBCSVQocGluKSkKLQkJU1RfUElOQ09ORl9QQUNLX1BVKCpjb25maWcpOwotCWlmIChvZF92YWx1ZSAmIEJJVChwaW4pKQotCQlTVF9QSU5DT05GX1BBQ0tfT0QoKmNvbmZpZyk7CisJaWYgKHBjLT5wdSkgeworCQlyZWdtYXBfZmllbGRfcmVhZChwYy0+cHUsICZwdV92YWx1ZSk7CisJCWlmIChwdV92YWx1ZSAmIEJJVChwaW4pKQorCQkJU1RfUElOQ09ORl9QQUNLX1BVKCpjb25maWcpOworCX0KIAorCWlmIChwYy0+b2QpIHsKKwkJcmVnbWFwX2ZpZWxkX3JlYWQocGMtPm9kLCAmb2RfdmFsdWUpOworCQlpZiAob2RfdmFsdWUgJiBCSVQocGluKSkKKwkJCVNUX1BJTkNPTkZfUEFDS19PRCgqY29uZmlnKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgc3RfcGluY29uZl9nZXRfcmV0aW1lX3BhY2tlZChzdHJ1Y3Qgc3RfcGluY3RybCAqaW5mbywKQEAgLTEwNTEsOCArMTEzMSwyMSBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW50IHN0X3BhcnNlX3N5c2NmZ3Moc3RydWN0IHN0X3BpbmN0cmwgKmluZm8sCi0JCWludCBiYW5rLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQorCitzdGF0aWMgc3RydWN0IHJlZ21hcF9maWVsZCAqc3RfcGNfZ2V0X3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgaW50IGJhbmssCisJCQkJCSAgICBpbnQgZGF0YSwgaW50IGxzYiwgaW50IG1zYikKK3sKKwlzdHJ1Y3QgcmVnX2ZpZWxkIHJlZyA9IFJFR19GSUVMRCgoZGF0YSArIGJhbmspICogNCwgbHNiLCBtc2IpOworCisJaWYgKGRhdGEgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBkZXZtX3JlZ21hcF9maWVsZF9hbGxvYyhkZXYsIHJlZ21hcCwgcmVnKTsKK30KKworc3RhdGljIHZvaWQgc3RfcGFyc2Vfc3lzY2ZncyhzdHJ1Y3Qgc3RfcGluY3RybCAqaW5mbywgaW50IGJhbmssCisJCQkgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CiAJY29uc3Qgc3RydWN0IHN0X3BjdGxfZGF0YSAqZGF0YSA9IGluZm8tPmRhdGE7CiAJLyoqCkBAIC0xMDYyLDI5ICsxMTU1LDIxIEBACiAJICovCiAJaW50IGxzYiA9IChiYW5rJTQpICogU1RfR1BJT19QSU5TX1BFUl9CQU5LOwogCWludCBtc2IgPSBsc2IgKyBTVF9HUElPX1BJTlNfUEVSX0JBTksgLSAxOwotCXN0cnVjdCByZWdfZmllbGQgYWx0X3JlZyA9IFJFR19GSUVMRCgoZGF0YS0+YWx0ICsgYmFuaykgKiA0LCAwLCAzMSk7Ci0Jc3RydWN0IHJlZ19maWVsZCBvZV9yZWcgPSBSRUdfRklFTEQoKGRhdGEtPm9lICsgYmFuay80KSAqIDQsIGxzYiwgbXNiKTsKLQlzdHJ1Y3QgcmVnX2ZpZWxkIHB1X3JlZyA9IFJFR19GSUVMRCgoZGF0YS0+cHUgKyBiYW5rLzQpICogNCwgbHNiLCBtc2IpOwotCXN0cnVjdCByZWdfZmllbGQgb2RfcmVnID0gUkVHX0ZJRUxEKChkYXRhLT5vZCArIGJhbmsvNCkgKiA0LCBsc2IsIG1zYik7CiAJc3RydWN0IHN0X3Bpb19jb250cm9sICpwYyA9ICZpbmZvLT5iYW5rc1tiYW5rXS5wYzsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpbmZvLT5kZXY7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwICA9IGluZm8tPnJlZ21hcDsKIAotCXBjLT5hbHQgPSBkZXZtX3JlZ21hcF9maWVsZF9hbGxvYyhkZXYsIHJlZ21hcCwgYWx0X3JlZyk7Ci0JcGMtPm9lID0gZGV2bV9yZWdtYXBfZmllbGRfYWxsb2MoZGV2LCByZWdtYXAsIG9lX3JlZyk7Ci0JcGMtPnB1ID0gZGV2bV9yZWdtYXBfZmllbGRfYWxsb2MoZGV2LCByZWdtYXAsIHB1X3JlZyk7Ci0JcGMtPm9kID0gZGV2bV9yZWdtYXBfZmllbGRfYWxsb2MoZGV2LCByZWdtYXAsIG9kX3JlZyk7Ci0KLQlpZiAoSVNfRVJSKHBjLT5hbHQpIHx8IElTX0VSUihwYy0+b2UpIHx8Ci0JCQlJU19FUlIocGMtPnB1KSB8fCBJU19FUlIocGMtPm9kKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJcGMtPmFsdCA9IHN0X3BjX2dldF92YWx1ZShkZXYsIHJlZ21hcCwgYmFuaywgZGF0YS0+YWx0LCAwLCAzMSk7CisJcGMtPm9lID0gc3RfcGNfZ2V0X3ZhbHVlKGRldiwgcmVnbWFwLCBiYW5rLzQsIGRhdGEtPm9lLCBsc2IsIG1zYik7CisJcGMtPnB1ID0gc3RfcGNfZ2V0X3ZhbHVlKGRldiwgcmVnbWFwLCBiYW5rLzQsIGRhdGEtPnB1LCBsc2IsIG1zYik7CisJcGMtPm9kID0gc3RfcGNfZ2V0X3ZhbHVlKGRldiwgcmVnbWFwLCBiYW5rLzQsIGRhdGEtPm9kLCBsc2IsIG1zYik7CiAKIAkvKiByZXRpbWUgYXZhaWFibGUgZm9yIGFsbCBwaW5zIGJ5IGRlZmF1bHQgKi8KIAlwYy0+cnRfcGluX21hc2sgPSAweGZmOwogCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAic3QscmV0aW1lLXBpbi1tYXNrIiwgJnBjLT5ydF9waW5fbWFzayk7CiAJc3RfcGN0bF9kdF9zZXR1cF9yZXRpbWUoaW5mbywgYmFuaywgcGMpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuOwogfQogCiAvKgpAQCAtMTIwMCw2ICsxMjg1LDE5NCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHN0X2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgc3RfZ3Bpb19iYW5rICpiYW5rID0gZ3Bpb19jaGlwX3RvX2JhbmsoY2hpcCk7CisJaW50IGlycSA9IC1FTlhJTzsKKworCWlmIChvZmZzZXQgPCBjaGlwLT5uZ3BpbykKKwkJaXJxID0gaXJxX2ZpbmRfbWFwcGluZyhiYW5rLT5kb21haW4sIG9mZnNldCk7CisKKwlkZXZfaW5mbyhjaGlwLT5kZXYsICIlczogcmVxdWVzdCBJUlEgZm9yIEdQSU8gJWQsIHJldHVybiAlZFxuIiwKKwkJCQljaGlwLT5sYWJlbCwgb2Zmc2V0ICsgY2hpcC0+YmFzZSwgaXJxKTsKKwlyZXR1cm4gaXJxOworfQorCitzdGF0aWMgdm9pZCBzdF9ncGlvX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3Qgc3RfZ3Bpb19iYW5rICpiYW5rID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisKKwl3cml0ZWwoQklUKGQtPmh3aXJxKSwgYmFuay0+YmFzZSArIFJFR19QSU9fQ0xSX1BNQVNLKTsKK30KKworc3RhdGljIHZvaWQgc3RfZ3Bpb19pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3Qgc3RfZ3Bpb19iYW5rICpiYW5rID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisKKwl3cml0ZWwoQklUKGQtPmh3aXJxKSwgYmFuay0+YmFzZSArIFJFR19QSU9fU0VUX1BNQVNLKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzdF9ncGlvX2lycV9zdGFydHVwKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3Qgc3RfZ3Bpb19iYW5rICpiYW5rID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisKKwlpZiAoZ3Bpb19sb2NrX2FzX2lycSgmYmFuay0+Z3Bpb19jaGlwLCBkLT5od2lycSkpCisJCWRldl9lcnIoYmFuay0+Z3Bpb19jaGlwLmRldiwKKwkJCSJ1bmFibGUgdG8gbG9jayBIVyBJUlEgJWx1IGZvciBJUlFcbiIsCisJCQlkLT5od2lycSk7CisKKwlzdF9ncGlvX2lycV91bm1hc2soZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RfZ3Bpb19pcnFfc2h1dGRvd24oc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBzdF9ncGlvX2JhbmsgKmJhbmsgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKworCXN0X2dwaW9faXJxX21hc2soZCk7CisJZ3Bpb191bmxvY2tfYXNfaXJxKCZiYW5rLT5ncGlvX2NoaXAsIGQtPmh3aXJxKTsKK30KKworc3RhdGljIGludCBzdF9ncGlvX2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIHR5cGUpCit7CisJc3RydWN0IHN0X2dwaW9fYmFuayAqYmFuayA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvbXAsIHBpbiA9IGQtPmh3aXJxOworCXUzMiB2YWw7CisJdTMyIHBpbl9lZGdlX2NvbmYgPSAwOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgorCQljb21wID0gMDsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6CisJCWNvbXAgPSAwOworCQlwaW5fZWRnZV9jb25mID0gU1RfSVJRX0ZBTExJTkdfRURHRV9DT05GKHBpbik7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfTEVWRUxfTE9XOgorCQljb21wID0gMTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKKwkJY29tcCA9IDE7CisJCXBpbl9lZGdlX2NvbmYgPSBTVF9JUlFfUklTSU5HX0VER0VfQ09ORihwaW4pOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKKwkJY29tcCA9IHN0X2dwaW9fZ2V0KCZiYW5rLT5ncGlvX2NoaXAsIHBpbik7CisJCXBpbl9lZGdlX2NvbmYgPSBTVF9JUlFfQk9USF9FREdFX0NPTkYocGluKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKKwliYW5rLT5pcnFfZWRnZV9jb25mICY9ICB+KFNUX0lSUV9FREdFX01BU0sgPDwgKAorCQkJCXBpbiAqIFNUX0lSUV9FREdFX0NPTkZfQklUU19QRVJfUElOKSk7CisJYmFuay0+aXJxX2VkZ2VfY29uZiB8PSBwaW5fZWRnZV9jb25mOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IHJlYWRsKGJhbmstPmJhc2UgKyBSRUdfUElPX1BDT01QKTsKKwl2YWwgJj0gfkJJVChwaW4pOworCXZhbCB8PSAoY29tcCA8PCBwaW4pOworCXdyaXRlbCh2YWwsIGJhbmstPmJhc2UgKyBSRUdfUElPX1BDT01QKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQXMgZWRnZSB0cmlnZ2VycyBhcmUgbm90IHN1cHBvcnRlZCBhdCBoYXJkd2FyZSBsZXZlbCwgaXQgaXMgc3VwcG9ydGVkIGJ5CisgKiBzb2Z0d2FyZSBieSBleHBsb2l0aW5nIHRoZSBsZXZlbCB0cmlnZ2VyIHN1cHBvcnQgaW4gaGFyZHdhcmUuCisgKgorICogU3RlcHMgZm9yIGRldGVjdGlvbiByYWlzaW5nIGVkZ2UgaW50ZXJydXB0IGluIHNvZnR3YXJlLgorICoKKyAqIFN0ZXAgMTogQ09ORklHVVJFIHBpbiB0byBkZXRlY3QgbGV2ZWwgTE9XIGludGVycnVwdHMuCisgKgorICogU3RlcCAyOiBERVRFQ1QgbGV2ZWwgTE9XIGludGVycnVwdCBhbmQgaW4gaXJxbXV4L2dwaW8gYmFuayBpbnRlcnJ1cHQgaGFuZGxlciwKKyAqIGlmIHRoZSB2YWx1ZSBvZiBwaW4gaXMgbG93LCB0aGVuIENPTkZJR1VSRSBwaW4gZm9yIGxldmVsIEhJR0ggaW50ZXJydXB0LgorICogSUdOT1JFIGNhbGxpbmcgdGhlIGFjdHVhbCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIHBpbiBhdCB0aGlzIHN0YWdlLgorICoKKyAqIFN0ZXAgMzogREVURUNUIGxldmVsIEhJR0ggaW50ZXJydXB0IGFuZCBpbiBpcnFtdXgvZ3Bpby1iYW5rIGludGVycnVwdCBoYW5kbGVyCisgKiBpZiB0aGUgdmFsdWUgb2YgcGluIGlzIEhJR0gsIENPTkZJR1VSRSBwaW4gZm9yIGxldmVsIExPVyBpbnRlcnJ1cHQgYW5kIHRoZW4KKyAqIERJU1BBVENIIHRoZSBpbnRlcnJ1cHQgdG8gdGhlIGludGVycnVwdCBoYW5kbGVyIG9mIHRoZSBwaW4uCisgKgorICoJCSBzdGVwLTEgIF9fX19fX19fICAgICBfX19fX19fX19fCisgKgkJCQl8ICAgICB8IHN0ZXAgLSAzCisgKgkJCSAgICAgICAgfCAgICAgfAorICoJCQlzdGVwIC0yIHxfX19fX3wKKyAqCisgKiBmYWxsaW5nIGVkZ2UgaXMgYWxzbyBkZXRlY3RlZCBpbnQgdGhlIHNhbWUgd2F5LgorICoKKyAqLworc3RhdGljIHZvaWQgX19ncGlvX2lycV9oYW5kbGVyKHN0cnVjdCBzdF9ncGlvX2JhbmsgKmJhbmspCit7CisJdW5zaWduZWQgbG9uZyBwb3J0X2luLCBwb3J0X21hc2ssIHBvcnRfY29tcCwgYWN0aXZlX2lycXM7CisJdW5zaWduZWQgbG9uZyBiYW5rX2VkZ2VfbWFzaywgZmxhZ3M7CisJaW50IG4sIHZhbCwgZWNmZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiYW5rLT5sb2NrLCBmbGFncyk7CisJYmFua19lZGdlX21hc2sgPSBiYW5rLT5pcnFfZWRnZV9jb25mOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKKworCWZvciAoOzspIHsKKwkJcG9ydF9pbiA9IHJlYWRsKGJhbmstPmJhc2UgKyBSRUdfUElPX1BJTik7CisJCXBvcnRfY29tcCA9IHJlYWRsKGJhbmstPmJhc2UgKyBSRUdfUElPX1BDT01QKTsKKwkJcG9ydF9tYXNrID0gcmVhZGwoYmFuay0+YmFzZSArIFJFR19QSU9fUE1BU0spOworCisJCWFjdGl2ZV9pcnFzID0gKHBvcnRfaW4gXiBwb3J0X2NvbXApICYgcG9ydF9tYXNrOworCisJCWlmIChhY3RpdmVfaXJxcyA9PSAwKQorCQkJYnJlYWs7CisKKwkJZm9yX2VhY2hfc2V0X2JpdChuLCAmYWN0aXZlX2lycXMsIEJJVFNfUEVSX0xPTkcpIHsKKwkJCS8qIGNoZWNrIGlmIHdlIGFyZSBkZXRlY3RpbmcgZmFrZSBlZGdlcyAuLi4gKi8KKwkJCWVjZmcgPSBTVF9JUlFfRURHRV9DT05GKGJhbmtfZWRnZV9tYXNrLCBuKTsKKworCQkJaWYgKGVjZmcpIHsKKwkJCQkvKiBlZGdlIGRldGVjdGlvbi4gKi8KKwkJCQl2YWwgPSBzdF9ncGlvX2dldCgmYmFuay0+Z3Bpb19jaGlwLCBuKTsKKworCQkJCXdyaXRlbChCSVQobiksCisJCQkJCXZhbCA/IGJhbmstPmJhc2UgKyBSRUdfUElPX1NFVF9QQ09NUCA6CisJCQkJCWJhbmstPmJhc2UgKyBSRUdfUElPX0NMUl9QQ09NUCk7CisKKwkJCQlpZiAoZWNmZyAhPSBTVF9JUlFfRURHRV9CT1RIICYmCisJCQkJCSEoKGVjZmcgJiBTVF9JUlFfRURHRV9GQUxMSU5HKSBeIHZhbCkpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxX2ZpbmRfbWFwcGluZyhiYW5rLT5kb21haW4sIG4pKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc3RfZ3Bpb19pcnFfaGFuZGxlcih1bnNpZ25lZCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwkvKiBpbnRlcnJ1cHQgZGVkaWNhdGVkIHBlciBiYW5rICovCisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2dldF9jaGlwKGlycSk7CisJc3RydWN0IHN0X2dwaW9fYmFuayAqYmFuayA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKGlycSk7CisKKwljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKKwlfX2dwaW9faXJxX2hhbmRsZXIoYmFuayk7CisJY2hhaW5lZF9pcnFfZXhpdChjaGlwLCBkZXNjKTsKK30KKworc3RhdGljIHZvaWQgc3RfZ3Bpb19pcnFtdXhfaGFuZGxlcih1bnNpZ25lZCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZ2V0X2NoaXAoaXJxKTsKKwlzdHJ1Y3Qgc3RfcGluY3RybCAqaW5mbyA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKGlycSk7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisJaW50IG47CisKKwljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKKworCXN0YXR1cyA9IHJlYWRsKGluZm8tPmlycW11eF9iYXNlKTsKKworCWZvcl9lYWNoX3NldF9iaXQobiwgJnN0YXR1cywgU1RfR1BJT19QSU5TX1BFUl9CQU5LKQorCQlfX2dwaW9faXJxX2hhbmRsZXIoJmluZm8tPmJhbmtzW25dKTsKKworCWNoYWluZWRfaXJxX2V4aXQoY2hpcCwgZGVzYyk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHN0X2dwaW9fdGVtcGxhdGUgPSB7CiAJLnJlcXVlc3QJCT0gc3RfZ3Bpb19yZXF1ZXN0LAogCS5mcmVlCQkJPSBzdF9ncGlvX2ZyZWUsCkBAIC0xMjEwLDYgKzE0ODMsMzQgQEAKIAkubmdwaW8JCQk9IFNUX0dQSU9fUElOU19QRVJfQkFOSywKIAkub2ZfZ3Bpb19uX2NlbGxzCT0gMSwKIAkub2ZfeGxhdGUJCT0gc3RfZ3Bpb194bGF0ZSwKKwkudG9faXJxCQkJPSBzdF9ncGlvX3RvX2lycSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc3RfZ3Bpb19pcnFjaGlwID0geworCS5uYW1lCQk9ICJHUElPIiwKKwkuaXJxX21hc2sJPSBzdF9ncGlvX2lycV9tYXNrLAorCS5pcnFfdW5tYXNrCT0gc3RfZ3Bpb19pcnFfdW5tYXNrLAorCS5pcnFfc2V0X3R5cGUJPSBzdF9ncGlvX2lycV9zZXRfdHlwZSwKKwkuaXJxX3N0YXJ0dXAJPSBzdF9ncGlvX2lycV9zdGFydHVwLAorCS5pcnFfc2h1dGRvd24JPSBzdF9ncGlvX2lycV9zaHV0ZG93biwKK307CisKK3N0YXRpYyBpbnQgc3RfZ3Bpb19pcnFfZG9tYWluX21hcChzdHJ1Y3QgaXJxX2RvbWFpbiAqaCwKKwkJCXVuc2lnbmVkIGludCB2aXJxLCBpcnFfaHdfbnVtYmVyX3QgaHcpCit7CisJc3RydWN0IHN0X2dwaW9fYmFuayAqYmFuayA9IGgtPmhvc3RfZGF0YTsKKworCWlycV9zZXRfY2hpcCh2aXJxLCAmc3RfZ3Bpb19pcnFjaGlwKTsKKwlpcnFfc2V0X2hhbmRsZXIodmlycSwgaGFuZGxlX3NpbXBsZV9pcnEpOworCXNldF9pcnFfZmxhZ3ModmlycSwgSVJRRl9WQUxJRCk7CisJaXJxX3NldF9jaGlwX2RhdGEodmlycSwgYmFuayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfZG9tYWluX29wcyBzdF9ncGlvX2lycV9vcHMgPSB7CisJLm1hcAk9IHN0X2dwaW9faXJxX2RvbWFpbl9tYXAsCisJLnhsYXRlCT0gaXJxX2RvbWFpbl94bGF0ZV90d29jZWxsLAogfTsKIAogc3RhdGljIGludCBzdF9ncGlvbGliX3JlZ2lzdGVyX2Jhbmsoc3RydWN0IHN0X3BpbmN0cmwgKmluZm8sCkBAIC0xMjE5LDggKzE1MjAsOCBAQAogCXN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgKnJhbmdlID0gJmJhbmstPnJhbmdlOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGluZm8tPmRldjsKIAlpbnQgYmFua19udW0gPSBvZl9hbGlhc19nZXRfaWQobnAsICJncGlvIik7Ci0Jc3RydWN0IHJlc291cmNlIHJlczsKLQlpbnQgZXJyOworCXN0cnVjdCByZXNvdXJjZSByZXMsIGlycV9yZXM7CisJaW50IGdwaW9faXJxID0gMCwgZXJyLCBpOwogCiAJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTEyMzMsNiArMTUzNCw3IEBACiAJYmFuay0+Z3Bpb19jaGlwLmJhc2UgPSBiYW5rX251bSAqIFNUX0dQSU9fUElOU19QRVJfQkFOSzsKIAliYW5rLT5ncGlvX2NoaXAubmdwaW8gPSBTVF9HUElPX1BJTlNfUEVSX0JBTks7CiAJYmFuay0+Z3Bpb19jaGlwLm9mX25vZGUgPSBucDsKKwlzcGluX2xvY2tfaW5pdCgmYmFuay0+bG9jayk7CiAKIAlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgInN0LGJhbmstbmFtZSIsICZyYW5nZS0+bmFtZSk7CiAJYmFuay0+Z3Bpb19jaGlwLmxhYmVsID0gcmFuZ2UtPm5hbWU7CkBAIC0xMjQ4LDYgKzE1NTAsNTEgQEAKIAl9CiAJZGV2X2luZm8oZGV2LCAiJXMgYmFuayBhZGRlZC5cbiIsIHJhbmdlLT5uYW1lKTsKIAorCS8qKgorCSAqIEdQSU8gYmFuayBjYW4gaGF2ZSBvbmUgb2YgdGhlIHR3byBwb3NzaWJsZSB0eXBlcyBvZgorCSAqIGludGVycnVwdC13aXJpbmdzLgorCSAqCisJICogRmlyc3QgdHlwZSBpcyB2aWEgaXJxbXV4LCBzaW5nbGUgaW50ZXJydXB0IGlzIHVzZWQgYnkgbXVsdGlwbGUKKwkgKiBncGlvIGJhbmtzLiBUaGlzIHJlZHVjZXMgbnVtYmVyIG9mIG92ZXJhbGwgaW50ZXJydXB0cyBudW1iZXJzCisJICogcmVxdWlyZWQuIEFsbCB0aGVzZSBiYW5rcyBiZWxvbmcgdG8gYSBzaW5nbGUgcGluY29udHJvbGxlci4KKwkgKgkJICBfX19fX19fX18KKwkgKgkJIHwJICAgfC0tLS0+IFtncGlvLWJhbmsgKG4pICAgIF0KKwkgKgkJIHwJICAgfC0tLS0+IFtncGlvLWJhbmsgKG4gKyAxKV0KKwkgKglbaXJxTl0tLSB8IGlycS1tdXggfC0tLS0+IFtncGlvLWJhbmsgKG4gKyAyKV0KKwkgKgkJIHwJICAgfC0tLS0+IFtncGlvLWJhbmsgKC4uLiAgKV0KKwkgKgkJIHxfX19fX19fX198LS0tLT4gW2dwaW8tYmFuayAobiArIDcpXQorCSAqCisJICogU2Vjb25kIHR5cGUgaGFzIGEgZGVkaWNhdGVkIGludGVycnVwdCBwZXIgZWFjaCBncGlvIGJhbmsuCisJICoKKwkgKglbaXJxTl0tLS0tPiBbZ3Bpby1iYW5rIChuKV0KKwkgKi8KKworCWlmIChvZl9pcnFfdG9fcmVzb3VyY2UobnAsIDAsICZpcnFfcmVzKSkgeworCQlncGlvX2lycSA9IGlycV9yZXMuc3RhcnQ7CisJCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKGdwaW9faXJxLCBzdF9ncGlvX2lycV9oYW5kbGVyKTsKKwkJaXJxX3NldF9oYW5kbGVyX2RhdGEoZ3Bpb19pcnEsIGJhbmspOworCX0KKworCWlmIChpbmZvLT5pcnFtdXhfYmFzZSA+IDAgfHwgZ3Bpb19pcnEgPiAwKSB7CisJCS8qIFNldHVwIElSUSBkb21haW4gKi8KKwkJYmFuay0+ZG9tYWluICA9IGlycV9kb21haW5fYWRkX2xpbmVhcihucCwKKwkJCQkJCVNUX0dQSU9fUElOU19QRVJfQkFOSywKKwkJCQkJCSZzdF9ncGlvX2lycV9vcHMsIGJhbmspOworCQlpZiAoIWJhbmstPmRvbWFpbikgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gYWRkIGlycSBkb21haW4gZm9yICVzXG4iLAorCQkJCW5wLT5mdWxsX25hbWUpOworCQl9IGVsc2UgIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBTVF9HUElPX1BJTlNfUEVSX0JBTks7IGkrKykgeworCQkJCWlmIChpcnFfY3JlYXRlX21hcHBpbmcoYmFuay0+ZG9tYWluLCBpKSA8IDApCisJCQkJCWRldl9lcnIoZGV2LAorCQkJCQkJIkZhaWxlZCB0byBtYXAgSVJRICVpXG4iLCBpKTsKKwkJCX0KKwkJfQorCisJfSBlbHNlIHsKKwkJZGV2X2luZm8oZGV2LCAiTm8gSVJRIHN1cHBvcnQgZm9yICVzIGJhbmtcbiIsIG5wLT5mdWxsX25hbWUpOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xMjY0LDYgKzE2MTEsMTAgQEAKIAl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MTYtcmVhci1waW5jdHJsIiwgLmRhdGEgPSAmc3RpaDQxNl9kYXRhfSwKIAl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MTYtZnZkcC1mZS1waW5jdHJsIiwgLmRhdGEgPSAmc3RpaDQxNl9kYXRhfSwKIAl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MTYtZnZkcC1saXRlLXBpbmN0cmwiLCAuZGF0YSA9ICZzdGloNDE2X2RhdGF9LAorCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy1zYmMtcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MTZfZGF0YX0sCisJeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LWZyb250LXBpbmN0cmwiLCAuZGF0YSA9ICZzdGloNDE2X2RhdGF9LAorCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy1yZWFyLXBpbmN0cmwiLCAuZGF0YSA9ICZzdGloNDE2X2RhdGF9LAorCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy1mbGFzaC1waW5jdHJsIiwgLmRhdGEgPSAmc3RpaDQwN19mbGFzaGRhdGF9LAogCXsgLyogc2VudGluZWwgKi8gfQogfTsKIApAQCAtMTI3Niw2ICsxNjI3LDggQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZDsKIAlpbnQgZ3JwX2luZGV4ID0gMDsKKwlpbnQgaXJxID0gMDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAogCXN0X3BjdGxfZHRfY2hpbGRfY291bnQoaW5mbywgbnApOwogCWlmICghaW5mby0+bmJhbmtzKSB7CkBAIC0xMzA2LDYgKzE2NTksMjEgQEAKIAl9CiAJaW5mby0+ZGF0YSA9IG9mX21hdGNoX25vZGUoc3RfcGN0bF9vZl9tYXRjaCwgbnApLT5kYXRhOwogCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKworCWlmIChpcnEgPiAwKSB7CisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKKwkJCQkJSU9SRVNPVVJDRV9NRU0sICJpcnFtdXgiKTsKKwkJaW5mby0+aXJxbXV4X2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKworCQlpZiAoSVNfRVJSKGluZm8tPmlycW11eF9iYXNlKSkKKwkJCXJldHVybiBQVFJfRVJSKGluZm8tPmlycW11eF9iYXNlKTsKKworCQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihpcnEsIHN0X2dwaW9faXJxbXV4X2hhbmRsZXIpOworCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShpcnEsIGluZm8pOworCisJfQorCiAJcGN0bF9kZXNjLT5ucGlucyA9IGluZm8tPm5iYW5rcyAqIFNUX0dQSU9fUElOU19QRVJfQkFOSzsKIAlwZGVzYyA9CWRldm1fa3phbGxvYygmcGRldi0+ZGV2LAogCQkJc2l6ZW9mKCpwZGVzYykgKiBwY3RsX2Rlc2MtPm5waW5zLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXN1bnhpLXBpbnMuaCBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXN1bnhpLXBpbnMuaAppbmRleCA2ZmQ4ZDRkLi4zZDYwNjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zdW54aS1waW5zLmgKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc3VueGktcGlucy5oCkBAIC0xOTMyLDI3ICsxOTMyLDI3IEBACiAJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOX1BGMCwKIAkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKLQkJICBTVU5YSV9GVU5DVElPTigweDQsICJtbWMwIikpLAkJLyogRDEgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJtbWMwIikpLAkJLyogRDEgKi8KIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU5fUEYxLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAotCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgIm1tYzAiKSksCQkvKiBEMCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzAiKSksCQkvKiBEMCAqLwogCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTl9QRjIsCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCi0JCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAibW1jMCIpKSwJCS8qIENMSyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzAiKSksCQkvKiBDTEsgKi8KIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU5fUEYzLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAotCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgIm1tYzAiKSksCQkvKiBDTUQgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJtbWMwIikpLAkJLyogQ01EICovCiAJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOX1BGNCwKIAkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKLQkJICBTVU5YSV9GVU5DVElPTigweDQsICJtbWMwIikpLAkJLyogRDMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJtbWMwIikpLAkJLyogRDMgKi8KIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU5fUEY1LAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAotCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgIm1tYzAiKSksCQkvKiBEMiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzAiKSksCQkvKiBEMiAqLwogCS8qIEhvbGUgKi8KIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU5fUEcwLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYS5jCmluZGV4IGU3NjczNTUuLjY1NDU4MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEuYwpAQCAtMzksNiArMzksNyBAQAogCXN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bDsKIAogCWNvbnN0IHN0cnVjdCB0ZWdyYV9waW5jdHJsX3NvY19kYXRhICpzb2M7CisJY29uc3QgY2hhciAqKmdyb3VwX3BpbnM7CiAKIAlpbnQgbmJhbmtzOwogCXZvaWQgX19pb21lbSAqKnJlZ3M7CkBAIC02MjAsNiArNjIxLDggQEAKIAlzdHJ1Y3QgdGVncmFfcG14ICpwbXg7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IGk7CisJY29uc3QgY2hhciAqKmdyb3VwX3BpbnM7CisJaW50IGZuLCBnbiwgZ2ZuOwogCiAJcG14ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcG14KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwbXgpIHsKQEAgLTYyOSw2ICs2MzIsNDEgQEAKIAlwbXgtPmRldiA9ICZwZGV2LT5kZXY7CiAJcG14LT5zb2MgPSBzb2NfZGF0YTsKIAorCS8qCisJICogRWFjaCBtdXggZ3JvdXAgd2lsbCBhcHBlYXIgaW4gNCBmdW5jdGlvbnMnIGxpc3Qgb2YgZ3JvdXBzLgorCSAqIFRoaXMgb3Zlci1hbGxvY2F0ZXMgc2xpZ2h0bHksIHNpbmNlIG5vdCBhbGwgZ3JvdXBzIGFyZSBtdXggZ3JvdXBzLgorCSAqLworCXBteC0+Z3JvdXBfcGlucyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAorCQlzb2NfZGF0YS0+bmdyb3VwcyAqIDQgKiBzaXplb2YoKnBteC0+Z3JvdXBfcGlucyksCisJCUdGUF9LRVJORUwpOworCWlmICghcG14LT5ncm91cF9waW5zKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWdyb3VwX3BpbnMgPSBwbXgtPmdyb3VwX3BpbnM7CisJZm9yIChmbiA9IDA7IGZuIDwgc29jX2RhdGEtPm5mdW5jdGlvbnM7IGZuKyspIHsKKwkJc3RydWN0IHRlZ3JhX2Z1bmN0aW9uICpmdW5jID0gJnNvY19kYXRhLT5mdW5jdGlvbnNbZm5dOworCisJCWZ1bmMtPmdyb3VwcyA9IGdyb3VwX3BpbnM7CisKKwkJZm9yIChnbiA9IDA7IGduIDwgc29jX2RhdGEtPm5ncm91cHM7IGduKyspIHsKKwkJCWNvbnN0IHN0cnVjdCB0ZWdyYV9waW5ncm91cCAqZyA9ICZzb2NfZGF0YS0+Z3JvdXBzW2duXTsKKworCQkJaWYgKGctPm11eF9yZWcgPT0gLTEpCisJCQkJY29udGludWU7CisKKwkJCWZvciAoZ2ZuID0gMDsgZ2ZuIDwgNDsgZ2ZuKyspCisJCQkJaWYgKGctPmZ1bmNzW2dmbl0gPT0gZm4pCisJCQkJCWJyZWFrOworCQkJaWYgKGdmbiA9PSA0KQorCQkJCWNvbnRpbnVlOworCisJCQlCVUdfT04oZ3JvdXBfcGlucyAtIHBteC0+Z3JvdXBfcGlucyA+PQorCQkJCXNvY19kYXRhLT5uZ3JvdXBzICogNCk7CisJCQkqZ3JvdXBfcGlucysrID0gZy0+bmFtZTsKKwkJCWZ1bmMtPm5ncm91cHMrKzsKKwkJfQorCX0KKwogCXRlZ3JhX3BpbmN0cmxfZ3Bpb19yYW5nZS5ucGlucyA9IHBteC0+c29jLT5uZ3Bpb3M7CiAJdGVncmFfcGluY3RybF9kZXNjLm5hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKIAl0ZWdyYV9waW5jdHJsX2Rlc2MucGlucyA9IHBteC0+c29jLT5waW5zOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEuaCBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhLmgKaW5kZXggODE3ZjcwNi4uNjA1MzgzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEuaAorKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYS5oCkBAIC03Miw3ICs3Miw3IEBACiAgKi8KIHN0cnVjdCB0ZWdyYV9mdW5jdGlvbiB7CiAJY29uc3QgY2hhciAqbmFtZTsKLQljb25zdCBjaGFyICogY29uc3QgKmdyb3VwczsKKwljb25zdCBjaGFyICoqZ3JvdXBzOwogCXVuc2lnbmVkIG5ncm91cHM7CiB9OwogCkBAIC0xOTMsNyArMTkzLDcgQEAKIAl1bnNpZ25lZCBuZ3Bpb3M7CiAJY29uc3Qgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgKnBpbnM7CiAJdW5zaWduZWQgbnBpbnM7Ci0JY29uc3Qgc3RydWN0IHRlZ3JhX2Z1bmN0aW9uICpmdW5jdGlvbnM7CisJc3RydWN0IHRlZ3JhX2Z1bmN0aW9uICpmdW5jdGlvbnM7CiAJdW5zaWduZWQgbmZ1bmN0aW9uczsKIAljb25zdCBzdHJ1Y3QgdGVncmFfcGluZ3JvdXAgKmdyb3VwczsKIAl1bnNpZ25lZCBuZ3JvdXBzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmExMTQuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMTE0LmMKaW5kZXggOTNjOWUzOC4uNjNmZTc2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmExMTQuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTExNC5jCkBAIC0xLDEwICsxLDggQEAKIC8qCi0gKiBQaW5jdHJsIGRhdGEgYW5kIGRyaXZlciBmb3IgdGhlIE5WSURJQSBUZWdyYTExNCBwaW5tdXgKKyAqIFBpbmN0cmwgZGF0YSBmb3IgdGhlIE5WSURJQSBUZWdyYTExNCBwaW5tdXgKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgTlZJRElBIENPUlBPUkFUSU9OLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCi0gKiBBdXRob3I6ICBQcml0ZXNoIFJhaXRoYXRoYSA8cHJhaXRoYXRoYUBudmlkaWEuY29tPgotICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAogICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KQEAgLTEzLDkgKzExLDYgQEAKICAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0yMDMsOCArMTk4LDggQEAKICNkZWZpbmUgVEVHUkFfUElOX1NETU1DM19DTEtfTEJfSU5fUEVFNQkJX0dQSU8oMjQ1KQogCiAvKiBBbGwgbm9uLUdQSU8gcGlucyBmb2xsb3cgKi8KLSNkZWZpbmUgTlVNX0dQSU9TCShURUdSQV9QSU5fU0RNTUMzX0NMS19MQl9JTl9QRUU1ICsgMSkKLSNkZWZpbmUgX1BJTihvZmZzZXQpCShOVU1fR1BJT1MgKyAob2Zmc2V0KSkKKyNkZWZpbmUgTlVNX0dQSU9TCQkJCShURUdSQV9QSU5fU0RNTUMzX0NMS19MQl9JTl9QRUU1ICsgMSkKKyNkZWZpbmUgX1BJTihvZmZzZXQpCQkJCShOVU1fR1BJT1MgKyAob2Zmc2V0KSkKIAogLyogTm9uLUdQSU8gcGlucyAqLwogI2RlZmluZSBURUdSQV9QSU5fQ09SRV9QV1JfUkVRCQkJX1BJTigwKQpAQCAtMjEyLDggKzIwNywxMSBAQAogI2RlZmluZSBURUdSQV9QSU5fUFdSX0lOVF9OCQkJX1BJTigyKQogI2RlZmluZSBURUdSQV9QSU5fUkVTRVRfT1VUX04JCQlfUElOKDMpCiAjZGVmaW5lIFRFR1JBX1BJTl9PV1IJCQkJX1BJTig0KQorI2RlZmluZSBURUdSQV9QSU5fSlRBR19SVENLCQkJX1BJTig1KQorI2RlZmluZSBURUdSQV9QSU5fQ0xLXzMyS19JTgkJCV9QSU4oNikKKyNkZWZpbmUgVEVHUkFfUElOX0dNSV9DTEtfTEIJCQlfUElOKDcpCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyAgdGVncmExMTRfcGluc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjIHRlZ3JhMTE0X3BpbnNbXSA9IHsKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fQ0xLXzMyS19PVVRfUEEwLCAiQ0xLXzMyS19PVVQgUEEwIiksCiAJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1VBUlQzX0NUU19OX1BBMSwgIlVBUlQzX0NUU19OIFBBMSIpLAogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9EQVAyX0ZTX1BBMiwgIkRBUDJfRlMgUEEyIiksCkBAIC0zODUsOSArMzgzLDEyIEBACiAJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1NETU1DM19DTEtfTEJfSU5fUEVFNSwgIlNETU1DM19DTEtfTEJfSU4gUEVFNSIpLAogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9DT1JFX1BXUl9SRVEsICJDT1JFX1BXUl9SRVEiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fQ1BVX1BXUl9SRVEsICJDUFVfUFdSX1JFUSIpLAotCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9PV1IsICJPV1IiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fUFdSX0lOVF9OLCAiUFdSX0lOVF9OIiksCiAJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1JFU0VUX09VVF9OLCAiUkVTRVRfT1VUX04iKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fT1dSLCAiT1dSIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0pUQUdfUlRDSywgIkpUQUdfUlRDSyIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9DTEtfMzJLX0lOLCAiQ0xLXzMyS19JTiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9HTUlfQ0xLX0xCLCAiR01JX0NMS19MQiIpLAogfTsKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNsa18zMmtfb3V0X3BhMF9waW5zW10gPSB7CkBAIC0xMDc0LDEwICsxMDc1LDYgQEAKIAlURUdSQV9QSU5fQ1BVX1BXUl9SRVEsCiB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgb3dyX3BpbnNbXSA9IHsKLQlURUdSQV9QSU5fT1dSLAotfTsKLQogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHB3cl9pbnRfbl9waW5zW10gPSB7CiAJVEVHUkFfUElOX1BXUl9JTlRfTiwKIH07CkBAIC0xMDg2LDYgKzEwODMsMjIgQEAKIAlURUdSQV9QSU5fUkVTRVRfT1VUX04sCiB9OwogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgb3dyX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fT1dSLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGp0YWdfcnRja19waW5zW10gPSB7CisJVEVHUkFfUElOX0pUQUdfUlRDSywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjbGtfMzJrX2luX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fQ0xLXzMyS19JTiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBnbWlfY2xrX2xiX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fR01JX0NMS19MQiwKK307CisKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9hbzFfcGluc1tdID0gewogCVRFR1JBX1BJTl9LQl9ST1cwX1BSMCwKIAlURUdSQV9QSU5fS0JfUk9XMV9QUjEsCkBAIC0xMTI3LDcgKzExNDAsNiBAQAogCVRFR1JBX1BJTl9HTUlfQUQxM19QSDUsCiAJVEVHUkFfUElOX0dNSV9BRDE0X1BINiwKIAlURUdSQV9QSU5fR01JX0FEMTVfUEg3LAotCiAJVEVHUkFfUElOX0dNSV9JT1JEWV9QSTUsCiAJVEVHUkFfUElOX0dNSV9DUzdfTl9QSTYsCiB9OwpAQCAtMTE0MSwxNSArMTE1MywxMiBAQAogCVRFR1JBX1BJTl9HTUlfQUQ1X1BHNSwKIAlURUdSQV9QSU5fR01JX0FENl9QRzYsCiAJVEVHUkFfUElOX0dNSV9BRDdfUEc3LAotCiAJVEVHUkFfUElOX0dNSV9XUl9OX1BJMCwKIAlURUdSQV9QSU5fR01JX09FX05fUEkxLAogCVRFR1JBX1BJTl9HTUlfQ1M2X05fUEkzLAogCVRFR1JBX1BJTl9HTUlfUlNUX05fUEk0LAogCVRFR1JBX1BJTl9HTUlfV0FJVF9QSTcsCi0KIAlURUdSQV9QSU5fR01JX0RRU19QX1BKMywKLQogCVRFR1JBX1BJTl9HTUlfQURWX05fUEswLAogCVRFR1JBX1BJTl9HTUlfQ0xLX1BLMSwKIAlURUdSQV9QSU5fR01JX0NTNF9OX1BLMiwKQEAgLTEzNDIsMTQgKzEzNTEsMzcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9kZXYzX3BpbnNbXSA9IHsKLQlURUdSQV9QSU5fQ0xLM19PVVRfUEVFMCwKLQlURUdSQV9QSU5fQ0xLM19SRVFfUEVFMSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9jZWNfcGluc1tdID0geworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX2F0Nl9waW5zW10gPSB7Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfZGFwNV9waW5zW10gPSB7Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfdXNiX3ZidXNfZW5fcGluc1tdID0geworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX2FvM19waW5zW10gPSB7Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfaHYwX3BpbnNbXSA9IHsKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9zZGlvNF9waW5zW10gPSB7Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfYW8wX3BpbnNbXSA9IHsKIH07CiAKIGVudW0gdGVncmFfbXV4IHsKIAlURUdSQV9NVVhfQkxJTkssCiAJVEVHUkFfTVVYX0NFQywKIAlURUdSQV9NVVhfQ0xEVkZTLAorCVRFR1JBX01VWF9DTEssCiAJVEVHUkFfTVVYX0NMSzEyLAogCVRFR1JBX01VWF9DUFUsCiAJVEVHUkFfTVVYX0RBUCwKQEAgLTEzOTQsNiArMTQyNiw3IEBACiAJVEVHUkFfTVVYX1JTVkQyLAogCVRFR1JBX01VWF9SU1ZEMywKIAlURUdSQV9NVVhfUlNWRDQsCisJVEVHUkFfTVVYX1JUQ0ssCiAJVEVHUkFfTVVYX1NETU1DMSwKIAlURUdSQV9NVVhfU0RNTUMyLAogCVRFR1JBX01VWF9TRE1NQzMsCkBAIC0xNDI1LDk0NCArMTQ1OCwxNiBAQAogCVRFR1JBX01VWF9WSV9BTFQzLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibGlua19ncm91cHNbXSA9IHsKLQkiY2xrXzMya19vdXRfcGEwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2VjX2dyb3Vwc1tdID0gewotCSJoZG1pX2NlY19wZWUzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2xkdmZzX2dyb3Vwc1tdID0gewotCSJnbWlfYWQ5X3BoMSIsCi0JImdtaV9hZDEwX3BoMiIsCi0JImtiX3JvdzdfcHI3IiwKLQkia2Jfcm93OF9wczAiLAotCSJkdmZzX3B3bV9weDAiLAotCSJkdmZzX2Nsa19weDIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjbGsxMl9ncm91cHNbXSA9IHsKLQkic2RtbWMxX3dwX25fcHYzIiwKLQkic2RtbWMxX2Nsa19wejAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjcHVfZ3JvdXBzW10gPSB7Ci0JImNwdV9wd3JfcmVxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFwX2dyb3Vwc1tdID0gewotCSJjbGsxX3JlcV9wZWUyIiwKLQkiY2xrMl9yZXFfcGNjNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhcDFfZ3JvdXBzW10gPSB7Ci0JImNsazFfcmVxX3BlZTIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYXAyX2dyb3Vwc1tdID0gewotCSJjbGsxX291dF9wdzQiLAotCSJncGlvX3g0X2F1ZF9weDQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZXYzX2dyb3Vwc1tdID0gewotCSJjbGszX3JlcV9wZWUxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGlzcGxheWFfZ3JvdXBzW10gPSB7Ci0JImRhcDNfZnNfcHAwIiwKLQkiZGFwM19kaW5fcHAxIiwKLQkiZGFwM19kb3V0X3BwMiIsCi0JImRhcDNfc2Nsa19wcDMiLAotCSJ1YXJ0M19ydHNfbl9wYzAiLAotCSJwdTMiLAotCSJwdTQiLAotCSJwdTUiLAotCSJwYmIzIiwKLQkicGJiNCIsCi0JInBiYjUiLAotCSJwYmI2IiwKLQkia2Jfcm93M19wcjMiLAotCSJrYl9yb3c0X3ByNCIsCi0JImtiX3JvdzVfcHI1IiwKLQkia2Jfcm93Nl9wcjYiLAotCSJrYl9jb2wzX3BxMyIsCi0JInNkbW1jM19kYXQyX3BiNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRpc3BsYXlhX2FsdF9ncm91cHNbXSA9IHsKLQkia2Jfcm93Nl9wcjYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkaXNwbGF5Yl9ncm91cHNbXSA9IHsKLQkiZGFwM19mc19wcDAiLAotCSJkYXAzX2Rpbl9wcDEiLAotCSJkYXAzX2RvdXRfcHAyIiwKLQkiZGFwM19zY2xrX3BwMyIsCi0JInB1MyIsCi0JInB1NCIsCi0JInB1NSIsCi0JInB1NiIsCi0JInBiYjMiLAotCSJwYmI0IiwKLQkicGJiNSIsCi0JInBiYjYiLAotCSJrYl9yb3czX3ByMyIsCi0JImtiX3JvdzRfcHI0IiwKLQkia2Jfcm93NV9wcjUiLAotCSJrYl9yb3c2X3ByNiIsCi0JInNkbW1jM19kYXQzX3BiNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGR0dl9ncm91cHNbXSA9IHsKLQkidWFydDNfY3RzX25fcGExIiwKLQkidWFydDNfcnRzX25fcGMwIiwKLQkiZGFwNF9mc19wcDQiLAotCSJkYXA0X2RvdXRfcHA2IiwKLQkiZ21pX3dhaXRfcGk3IiwKLQkiZ21pX2FkOF9waDAiLAotCSJnbWlfYWQxNF9waDYiLAotCSJnbWlfYWQxNV9waDciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBlbWNfZGxsX2dyb3Vwc1tdID0gewotCSJrYl9jb2wwX3BxMCIsCi0JImtiX2NvbDFfcHExIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0cGVyaXBoMV9ncm91cHNbXSA9IHsKLQkiY2xrMV9vdXRfcHc0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0cGVyaXBoMl9ncm91cHNbXSA9IHsKLQkiY2xrMl9vdXRfcHc1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0cGVyaXBoM19ncm91cHNbXSA9IHsKLQkiY2xrM19vdXRfcGVlMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdtaV9ncm91cHNbXSA9IHsKLQkiZ21pX3dwX25fcGM3IiwKLQotCSJnbWlfYWQwX3BnMCIsCi0JImdtaV9hZDFfcGcxIiwKLQkiZ21pX2FkMl9wZzIiLAotCSJnbWlfYWQzX3BnMyIsCi0JImdtaV9hZDRfcGc0IiwKLQkiZ21pX2FkNV9wZzUiLAotCSJnbWlfYWQ2X3BnNiIsCi0JImdtaV9hZDdfcGc3IiwKLQkiZ21pX2FkOF9waDAiLAotCSJnbWlfYWQ5X3BoMSIsCi0JImdtaV9hZDEwX3BoMiIsCi0JImdtaV9hZDExX3BoMyIsCi0JImdtaV9hZDEyX3BoNCIsCi0JImdtaV9hZDEzX3BoNSIsCi0JImdtaV9hZDE0X3BoNiIsCi0JImdtaV9hZDE1X3BoNyIsCi0JImdtaV93cl9uX3BpMCIsCi0JImdtaV9vZV9uX3BpMSIsCi0JImdtaV9jczZfbl9waTMiLAotCSJnbWlfcnN0X25fcGk0IiwKLQkiZ21pX2lvcmR5X3BpNSIsCi0JImdtaV9jczdfbl9waTYiLAotCSJnbWlfd2FpdF9waTciLAotCSJnbWlfY3MwX25fcGowIiwKLQkiZ21pX2NzMV9uX3BqMiIsCi0JImdtaV9kcXNfcF9wajMiLAotCSJnbWlfYWR2X25fcGswIiwKLQkiZ21pX2Nsa19wazEiLAotCSJnbWlfY3M0X25fcGsyIiwKLQkiZ21pX2NzMl9uX3BrMyIsCi0JImdtaV9jczNfbl9wazQiLAotCSJnbWlfYTE2X3BqNyIsCi0JImdtaV9hMTdfcGIwIiwKLQkiZ21pX2ExOF9wYjEiLAotCSJnbWlfYTE5X3BrNyIsCi0JImdlbjJfaTJjX3NjbF9wdDUiLAotCSJnZW4yX2kyY19zZGFfcHQ2IiwKLQkic2RtbWM0X2RhdDBfcGFhMCIsCi0JInNkbW1jNF9kYXQxX3BhYTEiLAotCSJzZG1tYzRfZGF0Ml9wYWEyIiwKLQkic2RtbWM0X2RhdDNfcGFhMyIsCi0JInNkbW1jNF9kYXQ0X3BhYTQiLAotCSJzZG1tYzRfZGF0NV9wYWE1IiwKLQkic2RtbWM0X2RhdDZfcGFhNiIsCi0JInNkbW1jNF9kYXQ3X3BhYTciLAotCSJzZG1tYzRfY2xrX3BjYzQiLAotCSJzZG1tYzRfY21kX3B0NyIsCi0JImRhcDFfZnNfcG4wIiwKLQkiZGFwMV9kaW5fcG4xIiwKLQkiZGFwMV9kb3V0X3BuMiIsCi0JImRhcDFfc2Nsa19wbjMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBnbWlfYWx0X2dyb3Vwc1tdID0gewotCSJnbWlfd3Bfbl9wYzciLAotCSJnbWlfY3MzX25fcGs0IiwKLQkiZ21pX2ExNl9wajciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoZGFfZ3JvdXBzW10gPSB7Ci0JImRhcDFfZnNfcG4wIiwKLQkiZGFwMV9kaW5fcG4xIiwKLQkiZGFwMV9kb3V0X3BuMiIsCi0JImRhcDFfc2Nsa19wbjMiLAotCSJkYXAyX2ZzX3BhMiIsCi0JImRhcDJfc2Nsa19wYTMiLAotCSJkYXAyX2Rpbl9wYTQiLAotCSJkYXAyX2RvdXRfcGE1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaHNpX2dyb3Vwc1tdID0gewotCSJ1bHBpX2RhdGEwX3BvMSIsCi0JInVscGlfZGF0YTFfcG8yIiwKLQkidWxwaV9kYXRhMl9wbzMiLAotCSJ1bHBpX2RhdGEzX3BvNCIsCi0JInVscGlfZGF0YTRfcG81IiwKLQkidWxwaV9kYXRhNV9wbzYiLAotCSJ1bHBpX2RhdGE2X3BvNyIsCi0JInVscGlfZGF0YTdfcG8wIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjMV9ncm91cHNbXSA9IHsKLQkiZ2VuMV9pMmNfc2NsX3BjNCIsCi0JImdlbjFfaTJjX3NkYV9wYzUiLAotCSJncGlvX3cyX2F1ZF9wdzIiLAotCSJncGlvX3czX2F1ZF9wdzMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmMyX2dyb3Vwc1tdID0gewotCSJnZW4yX2kyY19zY2xfcHQ1IiwKLQkiZ2VuMl9pMmNfc2RhX3B0NiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyYzNfZ3JvdXBzW10gPSB7Ci0JImNhbV9pMmNfc2NsX3BiYjEiLAotCSJjYW1faTJjX3NkYV9wYmIyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjNF9ncm91cHNbXSA9IHsKLQkiZGRjX3NjbF9wdjQiLAotCSJkZGNfc2RhX3B2NSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyY3B3cl9ncm91cHNbXSA9IHsKLQkicHdyX2kyY19zY2xfcHo2IiwKLQkicHdyX2kyY19zZGFfcHo3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJzMF9ncm91cHNbXSA9IHsKLQkiZGFwMV9mc19wbjAiLAotCSJkYXAxX2Rpbl9wbjEiLAotCSJkYXAxX2RvdXRfcG4yIiwKLQkiZGFwMV9zY2xrX3BuMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyczFfZ3JvdXBzW10gPSB7Ci0JImRhcDJfZnNfcGEyIiwKLQkiZGFwMl9zY2xrX3BhMyIsCi0JImRhcDJfZGluX3BhNCIsCi0JImRhcDJfZG91dF9wYTUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMnMyX2dyb3Vwc1tdID0gewotCSJkYXAzX2ZzX3BwMCIsCi0JImRhcDNfZGluX3BwMSIsCi0JImRhcDNfZG91dF9wcDIiLAotCSJkYXAzX3NjbGtfcHAzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJzM19ncm91cHNbXSA9IHsKLQkiZGFwNF9mc19wcDQiLAotCSJkYXA0X2Rpbl9wcDUiLAotCSJkYXA0X2RvdXRfcHA2IiwKLQkiZGFwNF9zY2xrX3BwNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyczRfZ3JvdXBzW10gPSB7Ci0JInBjYzEiLAotCSJwYmIwIiwKLQkicGJiNyIsCi0JInBjYzIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpcmRhX2dyb3Vwc1tdID0gewotCSJ1YXJ0Ml9yeGRfcGMzIiwKLQkidWFydDJfdHhkX3BjMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtiY19ncm91cHNbXSA9IHsKLQkia2Jfcm93MF9wcjAiLAotCSJrYl9yb3cxX3ByMSIsCi0JImtiX3JvdzJfcHIyIiwKLQkia2Jfcm93M19wcjMiLAotCSJrYl9yb3c0X3ByNCIsCi0JImtiX3JvdzVfcHI1IiwKLQkia2Jfcm93Nl9wcjYiLAotCSJrYl9yb3c3X3ByNyIsCi0JImtiX3JvdzhfcHMwIiwKLQkia2Jfcm93OV9wczEiLAotCSJrYl9yb3cxMF9wczIiLAotCSJrYl9jb2wwX3BxMCIsCi0JImtiX2NvbDFfcHExIiwKLQkia2JfY29sMl9wcTIiLAotCSJrYl9jb2wzX3BxMyIsCi0JImtiX2NvbDRfcHE0IiwKLQkia2JfY29sNV9wcTUiLAotCSJrYl9jb2w2X3BxNiIsCi0JImtiX2NvbDdfcHE3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFuZF9ncm91cHNbXSA9IHsKLQkiZ21pX3dwX25fcGM3IiwKLQkiZ21pX3dhaXRfcGk3IiwKLQkiZ21pX2Fkdl9uX3BrMCIsCi0JImdtaV9jbGtfcGsxIiwKLQkiZ21pX2NzMF9uX3BqMCIsCi0JImdtaV9jczFfbl9wajIiLAotCSJnbWlfY3MyX25fcGszIiwKLQkiZ21pX2NzM19uX3BrNCIsCi0JImdtaV9jczRfbl9wazIiLAotCSJnbWlfY3M2X25fcGkzIiwKLQkiZ21pX2NzN19uX3BpNiIsCi0JImdtaV9hZDBfcGcwIiwKLQkiZ21pX2FkMV9wZzEiLAotCSJnbWlfYWQyX3BnMiIsCi0JImdtaV9hZDNfcGczIiwKLQkiZ21pX2FkNF9wZzQiLAotCSJnbWlfYWQ1X3BnNSIsCi0JImdtaV9hZDZfcGc2IiwKLQkiZ21pX2FkN19wZzciLAotCSJnbWlfYWQ4X3BoMCIsCi0JImdtaV9hZDlfcGgxIiwKLQkiZ21pX2FkMTBfcGgyIiwKLQkiZ21pX2FkMTFfcGgzIiwKLQkiZ21pX2FkMTJfcGg0IiwKLQkiZ21pX2FkMTNfcGg1IiwKLQkiZ21pX2FkMTRfcGg2IiwKLQkiZ21pX2FkMTVfcGg3IiwKLQkiZ21pX3dyX25fcGkwIiwKLQkiZ21pX29lX25fcGkxIiwKLQkiZ21pX2Rxc19wX3BqMyIsCi0JImdtaV9yc3Rfbl9waTQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW5kX2FsdF9ncm91cHNbXSA9IHsKLQkiZ21pX2NzNl9uX3BpMyIsCi0JImdtaV9jczdfbl9waTYiLAotCSJnbWlfcnN0X25fcGk0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb3dyX2dyb3Vwc1tdID0gewotCSJwdTAiLAotCSJrYl9jb2w0X3BxNCIsCi0JIm93ciIsCi0JInNkbW1jM19jZF9uX3B2MiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBtaV9ncm91cHNbXSA9IHsKLQkicHdyX2ludF9uIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtMF9ncm91cHNbXSA9IHsKLQkic2RtbWMxX2RhdDJfcHk1IiwKLQkidWFydDNfcnRzX25fcGMwIiwKLQkicHUzIiwKLQkiZ21pX2FkOF9waDAiLAotCSJzZG1tYzNfZGF0M19wYjQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd20xX2dyb3Vwc1tdID0gewotCSJzZG1tYzFfZGF0MV9weTYiLAotCSJwdTQiLAotCSJnbWlfYWQ5X3BoMSIsCi0JInNkbW1jM19kYXQyX3BiNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bTJfZ3JvdXBzW10gPSB7Ci0JInB1NSIsCi0JImdtaV9hZDEwX3BoMiIsCi0JImtiX2NvbDNfcHEzIiwKLQkic2RtbWMzX2RhdDFfcGI2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtM19ncm91cHNbXSA9IHsKLQkicHU2IiwKLQkiZ21pX2FkMTFfcGgzIiwKLQkic2RtbWMzX2NtZF9wYTciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd3Jvbl9ncm91cHNbXSA9IHsKLQkiY29yZV9wd3JfcmVxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcmVzZXRfb3V0X25fZ3JvdXBzW10gPSB7Ci0JInJlc2V0X291dF9uIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnN2ZDFfZ3JvdXBzW10gPSB7Ci0JInB2MSIsCi0JImhkbWlfaW50X3BuNyIsCi0JInB1MSIsCi0JInB1MiIsCi0JImdtaV93cF9uX3BjNyIsCi0JImdtaV9hZHZfbl9wazAiLAotCSJnbWlfY3MwX25fcGowIiwKLQkiZ21pX2NzMV9uX3BqMiIsCi0JImdtaV9hZDBfcGcwIiwKLQkiZ21pX2FkMV9wZzEiLAotCSJnbWlfYWQyX3BnMiIsCi0JImdtaV9hZDNfcGczIiwKLQkiZ21pX2FkNF9wZzQiLAotCSJnbWlfYWQ1X3BnNSIsCi0JImdtaV9hZDZfcGc2IiwKLQkiZ21pX2FkN19wZzciLAotCSJnbWlfd3Jfbl9waTAiLAotCSJnbWlfb2Vfbl9waTEiLAotCSJncGlvX3g0X2F1ZF9weDQiLAotCSJncGlvX3g1X2F1ZF9weDUiLAotCSJncGlvX3g3X2F1ZF9weDciLAotCi0JInJlc2V0X291dF9uIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnN2ZDJfZ3JvdXBzW10gPSB7Ci0JInB2MCIsCi0JInB2MSIsCi0JInNkbW1jMV9kYXQwX3B5NyIsCi0JImNsazJfb3V0X3B3NSIsCi0JImNsazJfcmVxX3BjYzUiLAotCSJoZG1pX2ludF9wbjciLAotCSJkZGNfc2NsX3B2NCIsCi0JImRkY19zZGFfcHY1IiwKLQkidWFydDNfdHhkX3B3NiIsCi0JInVhcnQzX3J4ZF9wdzciLAotCSJnZW4xX2kyY19zY2xfcGM0IiwKLQkiZ2VuMV9pMmNfc2RhX3BjNSIsCi0JImRhcDRfZnNfcHA0IiwKLQkiZGFwNF9kaW5fcHA1IiwKLQkiZGFwNF9kb3V0X3BwNiIsCi0JImRhcDRfc2Nsa19wcDciLAotCSJjbGszX291dF9wZWUwIiwKLQkiY2xrM19yZXFfcGVlMSIsCi0JImdtaV9pb3JkeV9waTUiLAotCSJnbWlfYTE3X3BiMCIsCi0JImdtaV9hMThfcGIxIiwKLQkiZ2VuMl9pMmNfc2NsX3B0NSIsCi0JImdlbjJfaTJjX3NkYV9wdDYiLAotCSJzZG1tYzRfY2xrX3BjYzQiLAotCSJzZG1tYzRfY21kX3B0NyIsCi0JInNkbW1jNF9kYXQ3X3BhYTciLAotCSJwY2MxIiwKLQkicGJiNyIsCi0JInBjYzIiLAotCSJwd3JfaTJjX3NjbF9wejYiLAotCSJwd3JfaTJjX3NkYV9wejciLAotCSJrYl9yb3cwX3ByMCIsCi0JImtiX3JvdzFfcHIxIiwKLQkia2Jfcm93Ml9wcjIiLAotCSJrYl9yb3c3X3ByNyIsCi0JImtiX3JvdzhfcHMwIiwKLQkia2Jfcm93OV9wczEiLAotCSJrYl9yb3cxMF9wczIiLAotCSJrYl9jb2wxX3BxMSIsCi0JImtiX2NvbDJfcHEyIiwKLQkia2JfY29sNV9wcTUiLAotCSJrYl9jb2w2X3BxNiIsCi0JImtiX2NvbDdfcHE3IiwKLQkic3lzX2Nsa19yZXFfcHo1IiwKLQkiY29yZV9wd3JfcmVxIiwKLQkiY3B1X3B3cl9yZXEiLAotCSJwd3JfaW50X24iLAotCSJvd3IiLAotCSJzcGRpZl9vdXRfcGs1IiwKLQkiZ3Bpb194MV9hdWRfcHgxIiwKLQkic2RtbWMzX2Nsa19wYTYiLAotCSJzZG1tYzNfZGF0MF9wYjciLAotCSJncGlvX3cyX2F1ZF9wdzIiLAotCSJ1c2JfdmJ1c19lbjBfcG40IiwKLQkidXNiX3ZidXNfZW4xX3BuNSIsCi0JInNkbW1jM19jbGtfbGJfb3V0X3BlZTQiLAotCSJzZG1tYzNfY2xrX2xiX2luX3BlZTUiLAotCSJyZXNldF9vdXRfbiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQzX2dyb3Vwc1tdID0gewotCSJwdjAiLAotCSJwdjEiLAotCSJzZG1tYzFfY2xrX3B6MCIsCi0JImNsazJfb3V0X3B3NSIsCi0JImNsazJfcmVxX3BjYzUiLAotCSJoZG1pX2ludF9wbjciLAotCSJkZGNfc2NsX3B2NCIsCi0JImRkY19zZGFfcHY1IiwKLQkidWFydDJfcnRzX25fcGo2IiwKLQkidWFydDJfY3RzX25fcGo1IiwKLQkidWFydDNfdHhkX3B3NiIsCi0JInVhcnQzX3J4ZF9wdzciLAotCSJwdTAiLAotCSJwdTEiLAotCSJwdTIiLAotCSJnZW4xX2kyY19zY2xfcGM0IiwKLQkiZ2VuMV9pMmNfc2RhX3BjNSIsCi0JImRhcDRfZGluX3BwNSIsCi0JImRhcDRfc2Nsa19wcDciLAotCSJjbGszX291dF9wZWUwIiwKLQkiY2xrM19yZXFfcGVlMSIsCi0JInBjYzEiLAotCSJjYW1faTJjX3NjbF9wYmIxIiwKLQkiY2FtX2kyY19zZGFfcGJiMiIsCi0JInBiYjciLAotCSJwY2MyIiwKLQkicHdyX2kyY19zY2xfcHo2IiwKLQkicHdyX2kyY19zZGFfcHo3IiwKLQkia2Jfcm93MF9wcjAiLAotCSJrYl9yb3cxX3ByMSIsCi0JImtiX3JvdzJfcHIyIiwKLQkia2Jfcm93M19wcjMiLAotCSJrYl9yb3c5X3BzMSIsCi0JImtiX3JvdzEwX3BzMiIsCi0JImNsa18zMmtfb3V0X3BhMCIsCi0JInN5c19jbGtfcmVxX3B6NSIsCi0JImNvcmVfcHdyX3JlcSIsCi0JImNwdV9wd3JfcmVxIiwKLQkicHdyX2ludF9uIiwKLQkib3dyIiwKLQkiY2xrMV9yZXFfcGVlMiIsCi0JImNsazFfb3V0X3B3NCIsCi0JInNwZGlmX291dF9wazUiLAotCSJzcGRpZl9pbl9wazYiLAotCSJkYXAyX2ZzX3BhMiIsCi0JImRhcDJfc2Nsa19wYTMiLAotCSJkYXAyX2Rpbl9wYTQiLAotCSJkYXAyX2RvdXRfcGE1IiwKLQkiZHZmc19wd21fcHgwIiwKLQkiZ3Bpb194MV9hdWRfcHgxIiwKLQkiZ3Bpb194M19hdWRfcHgzIiwKLQkiZHZmc19jbGtfcHgyIiwKLQkic2RtbWMzX2Nsa19wYTYiLAotCSJzZG1tYzNfZGF0MF9wYjciLAotCSJoZG1pX2NlY19wZWUzIiwKLQkic2RtbWMzX2NkX25fcHYyIiwKLQkidXNiX3ZidXNfZW4wX3BuNCIsCi0JInVzYl92YnVzX2VuMV9wbjUiLAotCSJzZG1tYzNfY2xrX2xiX291dF9wZWU0IiwKLQkic2RtbWMzX2Nsa19sYl9pbl9wZWU1IiwKLQkicmVzZXRfb3V0X24iLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByc3ZkNF9ncm91cHNbXSA9IHsKLQkicHYwIiwKLQkicHYxIiwKLQkic2RtbWMxX2Nsa19wejAiLAotCSJjbGsyX291dF9wdzUiLAotCSJjbGsyX3JlcV9wY2M1IiwKLQkiaGRtaV9pbnRfcG43IiwKLQkiZGRjX3NjbF9wdjQiLAotCSJkZGNfc2RhX3B2NSIsCi0JInB1MCIsCi0JInB1MSIsCi0JInB1MiIsCi0JImdlbjFfaTJjX3NjbF9wYzQiLAotCSJnZW4xX2kyY19zZGFfcGM1IiwKLQkiZGFwNF9mc19wcDQiLAotCSJkYXA0X2Rpbl9wcDUiLAotCSJkYXA0X2RvdXRfcHA2IiwKLQkiZGFwNF9zY2xrX3BwNyIsCi0JImNsazNfb3V0X3BlZTAiLAotCSJjbGszX3JlcV9wZWUxIiwKLQkiZ21pX2FkMF9wZzAiLAotCSJnbWlfYWQxX3BnMSIsCi0JImdtaV9hZDJfcGcyIiwKLQkiZ21pX2FkM19wZzMiLAotCSJnbWlfYWQ0X3BnNCIsCi0JImdtaV9hZDEyX3BoNCIsCi0JImdtaV9hZDEzX3BoNSIsCi0JImdtaV9yc3Rfbl9waTQiLAotCSJnZW4yX2kyY19zY2xfcHQ1IiwKLQkiZ2VuMl9pMmNfc2RhX3B0NiIsCi0JInNkbW1jNF9jbGtfcGNjNCIsCi0JInNkbW1jNF9jbWRfcHQ3IiwKLQkic2RtbWM0X2RhdDBfcGFhMCIsCi0JInNkbW1jNF9kYXQxX3BhYTEiLAotCSJzZG1tYzRfZGF0Ml9wYWEyIiwKLQkic2RtbWM0X2RhdDNfcGFhMyIsCi0JInNkbW1jNF9kYXQ0X3BhYTQiLAotCSJzZG1tYzRfZGF0NV9wYWE1IiwKLQkic2RtbWM0X2RhdDZfcGFhNiIsCi0JInNkbW1jNF9kYXQ3X3BhYTciLAotCSJjYW1fbWNsa19wY2MwIiwKLQkicGNjMSIsCi0JImNhbV9pMmNfc2NsX3BiYjEiLAotCSJjYW1faTJjX3NkYV9wYmIyIiwKLQkicGJiMyIsCi0JInBiYjQiLAotCSJwYmI1IiwKLQkicGJiNiIsCi0JInBiYjciLAotCSJwY2MyIiwKLQkicHdyX2kyY19zY2xfcHo2IiwKLQkicHdyX2kyY19zZGFfcHo3IiwKLQkia2Jfcm93MF9wcjAiLAotCSJrYl9yb3cxX3ByMSIsCi0JImtiX3JvdzJfcHIyIiwKLQkia2JfY29sMl9wcTIiLAotCSJrYl9jb2w1X3BxNSIsCi0JImtiX2NvbDZfcHE2IiwKLQkia2JfY29sN19wcTciLAotCSJjbGtfMzJrX291dF9wYTAiLAotCSJzeXNfY2xrX3JlcV9wejUiLAotCSJjb3JlX3B3cl9yZXEiLAotCSJjcHVfcHdyX3JlcSIsCi0JInB3cl9pbnRfbiIsCi0JIm93ciIsCi0JImRhcDFfZnNfcG4wIiwKLQkiZGFwMV9kaW5fcG4xIiwKLQkiZGFwMV9kb3V0X3BuMiIsCi0JImRhcDFfc2Nsa19wbjMiLAotCSJjbGsxX3JlcV9wZWUyIiwKLQkiY2xrMV9vdXRfcHc0IiwKLQkic3BkaWZfaW5fcGs2IiwKLQkic3BkaWZfb3V0X3BrNSIsCi0JImRhcDJfZnNfcGEyIiwKLQkiZGFwMl9zY2xrX3BhMyIsCi0JImRhcDJfZGluX3BhNCIsCi0JImRhcDJfZG91dF9wYTUiLAotCSJkdmZzX3B3bV9weDAiLAotCSJncGlvX3gxX2F1ZF9weDEiLAotCSJncGlvX3gzX2F1ZF9weDMiLAotCSJkdmZzX2Nsa19weDIiLAotCSJncGlvX3g1X2F1ZF9weDUiLAotCSJncGlvX3g2X2F1ZF9weDYiLAotCSJncGlvX3g3X2F1ZF9weDciLAotCSJzZG1tYzNfY2Rfbl9wdjIiLAotCSJ1c2JfdmJ1c19lbjBfcG40IiwKLQkidXNiX3ZidXNfZW4xX3BuNSIsCi0JInNkbW1jM19jbGtfbGJfaW5fcGVlNSIsCi0JInNkbW1jM19jbGtfbGJfb3V0X3BlZTQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZG1tYzFfZ3JvdXBzW10gPSB7Ci0KLQkic2RtbWMxX2Nsa19wejAiLAotCSJzZG1tYzFfY21kX3B6MSIsCi0JInNkbW1jMV9kYXQzX3B5NCIsCi0JInNkbW1jMV9kYXQyX3B5NSIsCi0JInNkbW1jMV9kYXQxX3B5NiIsCi0JInNkbW1jMV9kYXQwX3B5NyIsCi0JInVhcnQzX2N0c19uX3BhMSIsCi0JImtiX2NvbDVfcHE1IiwKLQkic2RtbWMxX3dwX25fcHYzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RtbWMyX2dyb3Vwc1tdID0gewotCSJnbWlfaW9yZHlfcGk1IiwKLQkiZ21pX2Nsa19wazEiLAotCSJnbWlfY3MyX25fcGszIiwKLQkiZ21pX2NzM19uX3BrNCIsCi0JImdtaV9jczdfbl9waTYiLAotCSJnbWlfYWQxMl9waDQiLAotCSJnbWlfYWQxM19waDUiLAotCSJnbWlfYWQxNF9waDYiLAotCSJnbWlfYWQxNV9waDciLAotCSJnbWlfZHFzX3BfcGozIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RtbWMzX2dyb3Vwc1tdID0gewotCSJrYl9jb2w0X3BxNCIsCi0JInNkbW1jM19jbGtfcGE2IiwKLQkic2RtbWMzX2NtZF9wYTciLAotCSJzZG1tYzNfZGF0MF9wYjciLAotCSJzZG1tYzNfZGF0MV9wYjYiLAotCSJzZG1tYzNfZGF0Ml9wYjUiLAotCSJzZG1tYzNfZGF0M19wYjQiLAotCSJoZG1pX2NlY19wZWUzIiwKLQkic2RtbWMzX2NkX25fcHYyIiwKLQkic2RtbWMzX2Nsa19sYl9pbl9wZWU1IiwKLQkic2RtbWMzX2Nsa19sYl9vdXRfcGVlNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkbW1jNF9ncm91cHNbXSA9IHsKLQkic2RtbWM0X2Nsa19wY2M0IiwKLQkic2RtbWM0X2NtZF9wdDciLAotCSJzZG1tYzRfZGF0MF9wYWEwIiwKLQkic2RtbWM0X2RhdDFfcGFhMSIsCi0JInNkbW1jNF9kYXQyX3BhYTIiLAotCSJzZG1tYzRfZGF0M19wYWEzIiwKLQkic2RtbWM0X2RhdDRfcGFhNCIsCi0JInNkbW1jNF9kYXQ1X3BhYTUiLAotCSJzZG1tYzRfZGF0Nl9wYWE2IiwKLQkic2RtbWM0X2RhdDdfcGFhNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNvY19ncm91cHNbXSA9IHsKLQkiZ21pX2NzMV9uX3BqMiIsCi0JImdtaV9vZV9uX3BpMSIsCi0JImNsa18zMmtfb3V0X3BhMCIsCi0JImhkbWlfY2VjX3BlZTMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGRpZl9ncm91cHNbXSA9IHsKLQkic2RtbWMxX2NtZF9wejEiLAotCSJzZG1tYzFfZGF0M19weTQiLAotCSJ1YXJ0Ml9yeGRfcGMzIiwKLQkidWFydDJfdHhkX3BjMiIsCi0JInNwZGlmX2luX3BrNiIsCi0JInNwZGlmX291dF9wazUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkxX2dyb3Vwc1tdID0gewotCSJ1bHBpX2Nsa19weTAiLAotCSJ1bHBpX2Rpcl9weTEiLAotCSJ1bHBpX254dF9weTIiLAotCSJ1bHBpX3N0cF9weTMiLAotCSJncGlvX3gzX2F1ZF9weDMiLAotCSJncGlvX3g0X2F1ZF9weDQiLAotCSJncGlvX3g1X2F1ZF9weDUiLAotCSJncGlvX3g2X2F1ZF9weDYiLAotCSJncGlvX3g3X2F1ZF9weDciLAotCSJncGlvX3czX2F1ZF9wdzMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkyX2dyb3Vwc1tdID0gewotCSJ1bHBpX2RhdGE0X3BvNSIsCi0JInVscGlfZGF0YTVfcG82IiwKLQkidWxwaV9kYXRhNl9wbzciLAotCSJ1bHBpX2RhdGE3X3BvMCIsCi0JImtiX3JvdzRfcHI0IiwKLQkia2Jfcm93NV9wcjUiLAotCSJrYl9jb2wwX3BxMCIsCi0JImtiX2NvbDFfcHExIiwKLQkia2JfY29sMl9wcTIiLAotCSJrYl9jb2w2X3BxNiIsCi0JImtiX2NvbDdfcHE3IiwKLQkiZ3Bpb194NF9hdWRfcHg0IiwKLQkiZ3Bpb194NV9hdWRfcHg1IiwKLQkiZ3Bpb194Nl9hdWRfcHg2IiwKLQkiZ3Bpb194N19hdWRfcHg3IiwKLQkiZ3Bpb193Ml9hdWRfcHcyIiwKLQkiZ3Bpb193M19hdWRfcHczIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpM19ncm91cHNbXSA9IHsKLQkidWxwaV9kYXRhMF9wbzEiLAotCSJ1bHBpX2RhdGExX3BvMiIsCi0JInVscGlfZGF0YTJfcG8zIiwKLQkidWxwaV9kYXRhM19wbzQiLAotCSJzZG1tYzRfZGF0MF9wYWEwIiwKLQkic2RtbWM0X2RhdDFfcGFhMSIsCi0JInNkbW1jNF9kYXQyX3BhYTIiLAotCSJzZG1tYzRfZGF0M19wYWEzIiwKLQkic2RtbWM0X2RhdDRfcGFhNCIsCi0JInNkbW1jNF9kYXQ1X3BhYTUiLAotCSJzZG1tYzRfZGF0Nl9wYWE2IiwKLQkic2RtbWMzX2Nsa19wYTYiLAotCSJzZG1tYzNfY21kX3BhNyIsCi0JInNkbW1jM19kYXQwX3BiNyIsCi0JInNkbW1jM19kYXQxX3BiNiIsCi0JInNkbW1jM19kYXQyX3BiNSIsCi0JInNkbW1jM19kYXQzX3BiNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTRfZ3JvdXBzW10gPSB7Ci0JInNkbW1jMV9jbWRfcHoxIiwKLQkic2RtbWMxX2RhdDNfcHk0IiwKLQkic2RtbWMxX2RhdDJfcHk1IiwKLQkic2RtbWMxX2RhdDFfcHk2IiwKLQkic2RtbWMxX2RhdDBfcHk3IiwKLQkidWFydDJfcnhkX3BjMyIsCi0JInVhcnQyX3R4ZF9wYzIiLAotCSJ1YXJ0Ml9ydHNfbl9wajYiLAotCSJ1YXJ0Ml9jdHNfbl9wajUiLAotCSJ1YXJ0M190eGRfcHc2IiwKLQkidWFydDNfcnhkX3B3NyIsCi0JInVhcnQzX2N0c19uX3BhMSIsCi0JImdtaV93YWl0X3BpNyIsCi0JImdtaV9jczZfbl9waTMiLAotCSJnbWlfYWQ1X3BnNSIsCi0JImdtaV9hZDZfcGc2IiwKLQkiZ21pX2FkN19wZzciLAotCSJnbWlfYTE5X3BrNyIsCi0JImdtaV93cl9uX3BpMCIsCi0JInNkbW1jMV93cF9uX3B2MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTVfZ3JvdXBzW10gPSB7Ci0JInVscGlfY2xrX3B5MCIsCi0JInVscGlfZGlyX3B5MSIsCi0JInVscGlfbnh0X3B5MiIsCi0JInVscGlfc3RwX3B5MyIsCi0JImRhcDNfZnNfcHAwIiwKLQkiZGFwM19kaW5fcHAxIiwKLQkiZGFwM19kb3V0X3BwMiIsCi0JImRhcDNfc2Nsa19wcDMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGk2X2dyb3Vwc1tdID0gewotCSJkdmZzX3B3bV9weDAiLAotCSJncGlvX3gxX2F1ZF9weDEiLAotCSJncGlvX3gzX2F1ZF9weDMiLAotCSJkdmZzX2Nsa19weDIiLAotCSJncGlvX3g2X2F1ZF9weDYiLAotCSJncGlvX3cyX2F1ZF9wdzIiLAotCSJncGlvX3czX2F1ZF9wdzMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzeXNjbGtfZ3JvdXBzW10gPSB7Ci0JInN5c19jbGtfcmVxX3B6NSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRyYWNlX2dyb3Vwc1tdID0gewotCSJnbWlfaW9yZHlfcGk1IiwKLQkiZ21pX2Fkdl9uX3BrMCIsCi0JImdtaV9jbGtfcGsxIiwKLQkiZ21pX2NzMl9uX3BrMyIsCi0JImdtaV9jczRfbl9wazIiLAotCSJnbWlfYTE2X3BqNyIsCi0JImdtaV9hMTdfcGIwIiwKLQkiZ21pX2ExOF9wYjEiLAotCSJnbWlfYTE5X3BrNyIsCi0JImdtaV9kcXNfcF9wajMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0YV9ncm91cHNbXSA9IHsKLQkidWxwaV9kYXRhMF9wbzEiLAotCSJ1bHBpX2RhdGExX3BvMiIsCi0JInVscGlfZGF0YTJfcG8zIiwKLQkidWxwaV9kYXRhM19wbzQiLAotCSJ1bHBpX2RhdGE0X3BvNSIsCi0JInVscGlfZGF0YTVfcG82IiwKLQkidWxwaV9kYXRhNl9wbzciLAotCSJ1bHBpX2RhdGE3X3BvMCIsCi0JInNkbW1jMV9jbWRfcHoxIiwKLQkic2RtbWMxX2RhdDNfcHk0IiwKLQkic2RtbWMxX2RhdDJfcHk1IiwKLQkic2RtbWMxX2RhdDFfcHk2IiwKLQkic2RtbWMxX2RhdDBfcHk3IiwKLQkidWFydDJfcnhkX3BjMyIsCi0JInVhcnQyX3R4ZF9wYzIiLAotCSJ1YXJ0Ml9ydHNfbl9wajYiLAotCSJ1YXJ0Ml9jdHNfbl9wajUiLAotCSJwdTAiLAotCSJwdTEiLAotCSJwdTIiLAotCSJwdTMiLAotCSJwdTQiLAotCSJwdTUiLAotCSJwdTYiLAotCSJrYl9yb3c3X3ByNyIsCi0JImtiX3JvdzhfcHMwIiwKLQkia2Jfcm93OV9wczEiLAotCSJrYl9yb3cxMF9wczIiLAotCSJrYl9jb2wzX3BxMyIsCi0JImtiX2NvbDRfcHE0IiwKLQkic2RtbWMzX2NtZF9wYTciLAotCSJzZG1tYzNfZGF0MV9wYjYiLAotCSJzZG1tYzFfd3Bfbl9wdjMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0Yl9ncm91cHNbXSA9IHsKLQkidWFydDJfcnRzX25fcGo2IiwKLQkidWFydDJfY3RzX25fcGo1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGNfZ3JvdXBzW10gPSB7Ci0JInVhcnQzX3R4ZF9wdzYiLAotCSJ1YXJ0M19yeGRfcHc3IiwKLQkidWFydDNfY3RzX25fcGExIiwKLQkidWFydDNfcnRzX25fcGMwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGRfZ3JvdXBzW10gPSB7Ci0JInVscGlfY2xrX3B5MCIsCi0JInVscGlfZGlyX3B5MSIsCi0JInVscGlfbnh0X3B5MiIsCi0JInVscGlfc3RwX3B5MyIsCi0JImdtaV9hMTZfcGo3IiwKLQkiZ21pX2ExN19wYjAiLAotCSJnbWlfYTE4X3BiMSIsCi0JImdtaV9hMTlfcGs3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWxwaV9ncm91cHNbXSA9IHsKLQkidWxwaV9kYXRhMF9wbzEiLAotCSJ1bHBpX2RhdGExX3BvMiIsCi0JInVscGlfZGF0YTJfcG8zIiwKLQkidWxwaV9kYXRhM19wbzQiLAotCSJ1bHBpX2RhdGE0X3BvNSIsCi0JInVscGlfZGF0YTVfcG82IiwKLQkidWxwaV9kYXRhNl9wbzciLAotCSJ1bHBpX2RhdGE3X3BvMCIsCi0JInVscGlfY2xrX3B5MCIsCi0JInVscGlfZGlyX3B5MSIsCi0JInVscGlfbnh0X3B5MiIsCi0JInVscGlfc3RwX3B5MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVzYl9ncm91cHNbXSA9IHsKLQkicHYwIiwKLQkicHU2IiwKLQkiZ21pX2NzMF9uX3BqMCIsCi0JImdtaV9jczRfbl9wazIiLAotCSJnbWlfYWQxMV9waDMiLAotCSJrYl9jb2wwX3BxMCIsCi0JInNwZGlmX2luX3BrNiIsCi0JInVzYl92YnVzX2VuMF9wbjQiLAotCSJ1c2JfdmJ1c19lbjFfcG41IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmdwMV9ncm91cHNbXSA9IHsKLQkiY2FtX2kyY19zY2xfcGJiMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZncDJfZ3JvdXBzW10gPSB7Ci0JImNhbV9pMmNfc2RhX3BiYjIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2Z3AzX2dyb3Vwc1tdID0gewotCSJwYmIzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmdwNF9ncm91cHNbXSA9IHsKLQkicGJiNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZncDVfZ3JvdXBzW10gPSB7Ci0JInBiYjUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2Z3A2X2dyb3Vwc1tdID0gewotCSJwYmI2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmlfZ3JvdXBzW10gPSB7Ci0JImNhbV9tY2xrX3BjYzAiLAotCSJwYmIwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmlfYWx0MV9ncm91cHNbXSA9IHsKLQkiY2FtX21jbGtfcGNjMCIsCi0JInBiYjAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aV9hbHQzX2dyb3Vwc1tdID0gewotCSJjYW1fbWNsa19wY2MwIiwKLQkicGJiMCIsCi19OwotCiAjZGVmaW5lIEZVTkNUSU9OKGZuYW1lKQkJCQkJXAogCXsJCQkJCQlcCiAJCS5uYW1lID0gI2ZuYW1lLAkJCQlcCi0JCS5ncm91cHMgPSBmbmFtZSMjX2dyb3VwcywJCVwKLQkJLm5ncm91cHMgPSBBUlJBWV9TSVpFKGZuYW1lIyNfZ3JvdXBzKSwJXAogCX0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9mdW5jdGlvbiAgdGVncmExMTRfZnVuY3Rpb25zW10gPSB7CitzdGF0aWMgc3RydWN0IHRlZ3JhX2Z1bmN0aW9uIHRlZ3JhMTE0X2Z1bmN0aW9uc1tdID0gewogCUZVTkNUSU9OKGJsaW5rKSwKIAlGVU5DVElPTihjZWMpLAogCUZVTkNUSU9OKGNsZHZmcyksCisJRlVOQ1RJT04oY2xrKSwKIAlGVU5DVElPTihjbGsxMiksCiAJRlVOQ1RJT04oY3B1KSwKIAlGVU5DVElPTihkYXApLApAQCAtMjQwNyw2ICsxNTEyLDcgQEAKIAlGVU5DVElPTihyc3ZkMiksCiAJRlVOQ1RJT04ocnN2ZDMpLAogCUZVTkNUSU9OKHJzdmQ0KSwKKwlGVU5DVElPTihydGNrKSwKIAlGVU5DVElPTihzZG1tYzEpLAogCUZVTkNUSU9OKHNkbW1jMiksCiAJRlVOQ1RJT04oc2RtbWMzKSwKQEAgLTI0MzgsMTEgKzE1NDQsMTEgQEAKIAlGVU5DVElPTih2aV9hbHQzKSwKIH07CiAKLSNkZWZpbmUgRFJWX1BJTkdST1VQX1JFR19TVEFSVAkJCTB4ODY4CS8qIGJhbmsgMCAqLwotI2RlZmluZSBQSU5HUk9VUF9SRUdfU1RBUlQJCQkweDMwMDAJLyogYmFuayAxICovCisjZGVmaW5lIERSVl9QSU5HUk9VUF9SRUdfQQkJMHg4NjgJLyogYmFuayAwICovCisjZGVmaW5lIFBJTkdST1VQX1JFR19BCQkJMHgzMDAwCS8qIGJhbmsgMSAqLwogCi0jZGVmaW5lIFBJTkdST1VQX1JFR19ZKHIpCQkJKChyKSAtIFBJTkdST1VQX1JFR19TVEFSVCkKLSNkZWZpbmUgUElOR1JPVVBfUkVHX04ocikJCQktMQorI2RlZmluZSBQSU5HUk9VUF9SRUdfWShyKQkJKChyKSAtIFBJTkdST1VQX1JFR19BKQorI2RlZmluZSBQSU5HUk9VUF9SRUdfTihyKQkJLTEKIAogI2RlZmluZSBQSU5HUk9VUChwZ19uYW1lLCBmMCwgZjEsIGYyLCBmMywgZl9zYWZlLCByLCBvZCwgaW9yLCByY3Zfc2VsKQlcCiAJewkJCQkJCQkJXApAQCAtMjQ4NCwxMyArMTU5MCwxNCBAQAogCQkuZHJ2dHlwZV9yZWcgPSAtMSwJCQkJCVwKIAl9CiAKLSNkZWZpbmUgRFJWX1BJTkdST1VQX0RWUlRZUEVfWShyKSAoKHIpIC0gRFJWX1BJTkdST1VQX1JFR19TVEFSVCkKLSNkZWZpbmUgRFJWX1BJTkdST1VQX0RWUlRZUEVfTihyKSAtMQorI2RlZmluZSBEUlZfUElOR1JPVVBfUkVHX1kocikJCSgocikgLSBEUlZfUElOR1JPVVBfUkVHX0EpCisjZGVmaW5lIERSVl9QSU5HUk9VUF9SRUdfTihyKQkJLTEKKwogCiAjZGVmaW5lIERSVl9QSU5HUk9VUChwZ19uYW1lLCByLCBoc21fYiwgc2NobWl0dF9iLCBscG1kX2IsCQlcCi0JCQlkcnZkbl9iLCBkcnZkbl93LCBkcnZ1cF9iLCBkcnZ1cF93LAkJXAotCQkJc2x3cl9iLCBzbHdyX3csIHNsd2ZfYiwgc2x3Zl93LAkJCVwKLQkJCWRydnR5cGUpCQkJCQlcCisJCSAgICAgZHJ2ZG5fYiwgZHJ2ZG5fdywgZHJ2dXBfYiwgZHJ2dXBfdywJCVwKKwkJICAgICBzbHdyX2IsIHNsd3Jfdywgc2x3Zl9iLCBzbHdmX3csCQkJXAorCQkgICAgIGRydnR5cGUpCQkJCQkJXAogCXsJCQkJCQkJCVwKIAkJLm5hbWUgPSAiZHJpdmVfIiAjcGdfbmFtZSwJCQkJXAogCQkucGlucyA9IGRyaXZlXyMjcGdfbmFtZSMjX3BpbnMsCQkJCVwKQEAgLTI1MDMsNyArMTYxMCw3IEBACiAJCS5sb2NrX3JlZyA9IC0xLAkJCQkJCVwKIAkJLmlvcmVzZXRfcmVnID0gLTEsCQkJCQlcCiAJCS5yY3Zfc2VsX3JlZyA9IC0xLAkJCQkJXAotCQkuZHJ2X3JlZyA9IERSVl9QSU5HUk9VUF9EVlJUWVBFX1kociksCQkJXAorCQkuZHJ2X3JlZyA9IERSVl9QSU5HUk9VUF9SRUdfWShyKSwJCQlcCiAJCS5kcnZfYmFuayA9IDAsCQkJCQkJXAogCQkuaHNtX2JpdCA9IGhzbV9iLAkJCQkJXAogCQkuc2NobWl0dF9iaXQgPSBzY2htaXR0X2IsCQkJCVwKQEAgLTI1MTYsMTQgKzE2MjMsMTMgQEAKIAkJLnNsd3Jfd2lkdGggPSBzbHdyX3csCQkJCQlcCiAJCS5zbHdmX2JpdCA9IHNsd2ZfYiwJCQkJCVwKIAkJLnNsd2Zfd2lkdGggPSBzbHdmX3csCQkJCQlcCi0JCS5kcnZ0eXBlX3JlZyA9IERSVl9QSU5HUk9VUF9EVlJUWVBFXyMjZHJ2dHlwZShyKSwJXAorCQkuZHJ2dHlwZV9yZWcgPSBEUlZfUElOR1JPVVBfUkVHXyMjZHJ2dHlwZShyKSwJCVwKIAkJLmRydnR5cGVfYmFuayA9IDAsCQkJCQlcCiAJCS5kcnZ0eXBlX2JpdCA9IDYsCQkJCQlcCiAJfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHRlZ3JhX3Bpbmdyb3VwIHRlZ3JhMTE0X2dyb3Vwc1tdID0gewogCS8qICAgICAgIHBnX25hbWUsICAgICAgICAgICAgICAgIGYwLCAgICAgICAgIGYxLCAgICAgICAgIGYyLCAgICAgICAgICAgZjMsICAgICAgICAgIHNhZmUsICAgICByLCAgICAgIG9kLCBpb3IsIHJjdl9zZWwgKi8KLQkvKiBGSVhNRTogRmlsbCBpbiBjb3JyZWN0IGRhdGEgaW4gc2FmZSBjb2x1bW4gKi8KIAlQSU5HUk9VUCh1bHBpX2RhdGEwX3BvMSwgICAgICAgICBTUEkzLCAgICAgICBIU0ksICAgICAgICBVQVJUQSwgICAgICAgIFVMUEksICAgICAgICBVTFBJLCAgICAgMHgzMDAwLCAgTiwgIE4sICBOKSwKIAlQSU5HUk9VUCh1bHBpX2RhdGExX3BvMiwgICAgICAgICBTUEkzLCAgICAgICBIU0ksICAgICAgICBVQVJUQSwgICAgICAgIFVMUEksICAgICAgICBVTFBJLCAgICAgMHgzMDA0LCAgTiwgIE4sICBOKSwKIAlQSU5HUk9VUCh1bHBpX2RhdGEyX3BvMywgICAgICAgICBTUEkzLCAgICAgICBIU0ksICAgICAgICBVQVJUQSwgICAgICAgIFVMUEksICAgICAgICBVTFBJLCAgICAgMHgzMDA4LCAgTiwgIE4sICBOKSwKQEAgLTI2MzUsNiArMTc0MSw3IEBACiAJUElOR1JPVVAocGJiNiwgICAgICAgICAgICAgICAgICAgVkdQNiwgICAgICAgRElTUExBWUEsICAgRElTUExBWUIsICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzJhNCwgIE4sICBOLCAgTiksCiAJUElOR1JPVVAocGJiNywgICAgICAgICAgICAgICAgICAgSTJTNCwgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzJhOCwgIE4sICBOLCAgTiksCiAJUElOR1JPVVAocGNjMiwgICAgICAgICAgICAgICAgICAgSTJTNCwgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzJhYywgIE4sICBOLCAgTiksCisJUElOR1JPVVAoanRhZ19ydGNrLCAgICAgICAgICAgICAgUlRDSywgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlRDSywgICAgIDB4MzJiMCwgIE4sICBOLCAgTiksCiAJUElOR1JPVVAocHdyX2kyY19zY2xfcHo2LCAgICAgICAgSTJDUFdSLCAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzJiNCwgIFksICBOLCAgTiksCiAJUElOR1JPVVAocHdyX2kyY19zZGFfcHo3LCAgICAgICAgSTJDUFdSLCAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzJiOCwgIFksICBOLCAgTiksCiAJUElOR1JPVVAoa2Jfcm93MF9wcjAsICAgICAgICAgICAgS0JDLCAgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzJiYywgIE4sICBOLCAgTiksCkBAIC0yNjYxLDYgKzE3NjgsNyBAQAogCVBJTkdST1VQKGNvcmVfcHdyX3JlcSwgICAgICAgICAgIFBXUk9OLCAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFJTVkQ0LCAgICAweDMzMjQsICBOLCAgTiwgIE4pLAogCVBJTkdST1VQKGNwdV9wd3JfcmVxLCAgICAgICAgICAgIENQVSwgICAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFJTVkQ0LCAgICAweDMzMjgsICBOLCAgTiwgIE4pLAogCVBJTkdST1VQKHB3cl9pbnRfbiwgICAgICAgICAgICAgIFBNSSwgICAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFJTVkQ0LCAgICAweDMzMmMsICBOLCAgTiwgIE4pLAorCVBJTkdST1VQKGNsa18zMmtfaW4sICAgICAgICAgICAgIENMSywgICAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIENMSywgICAgICAweDMzMzAsICBOLCAgTiwgIE4pLAogCVBJTkdST1VQKG93ciwgICAgICAgICAgICAgICAgICAgIE9XUiwgICAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFJTVkQ0LCAgICAweDMzMzQsICBOLCAgTiwgIFkpLAogCVBJTkdST1VQKGRhcDFfZnNfcG4wLCAgICAgICAgICAgIEkyUzAsICAgICAgIEhEQSwgICAgICAgIEdNSSwgICAgICAgICAgUlNWRDQsICAgICAgIFJTVkQ0LCAgICAweDMzMzgsICBOLCAgTiwgIE4pLAogCVBJTkdST1VQKGRhcDFfZGluX3BuMSwgICAgICAgICAgIEkyUzAsICAgICAgIEhEQSwgICAgICAgIEdNSSwgICAgICAgICAgUlNWRDQsICAgICAgIFJTVkQ0LCAgICAweDMzM2MsICBOLCAgTiwgIE4pLApAQCAtMjY5NywzOCArMTgwNSw0OCBAQAogCVBJTkdST1VQKHVzYl92YnVzX2VuMV9wbjUsICAgICAgIFVTQiwgICAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFJTVkQ0LCAgICAweDMzZjgsICBZLCAgTiwgIE4pLAogCVBJTkdST1VQKHNkbW1jM19jbGtfbGJfaW5fcGVlNSwgIFNETU1DMywgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFJTVkQ0LCAgICAweDMzZmMsICBOLCAgTiwgIE4pLAogCVBJTkdST1VQKHNkbW1jM19jbGtfbGJfb3V0X3BlZTQsIFNETU1DMywgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFJTVkQ0LCAgICAweDM0MDAsICBOLCAgTiwgIE4pLAorCVBJTkdST1VQKGdtaV9jbGtfbGIsICAgICAgICAgICAgIFNETU1DMiwgICAgIE5BTkQsICAgICAgIEdNSSwgICAgICAgICAgUlNWRDQsICAgICAgIEdNSSwgICAgICAweDM0MDQsICBOLCAgTiwgIE4pLAogCVBJTkdST1VQKHJlc2V0X291dF9uLCAgICAgICAgICAgIFJTVkQxLCAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUkVTRVRfT1VUX04sIFJTVkQzLCAgICAweDM0MDgsICBOLCAgTiwgIE4pLAogCiAJLyogcGdfbmFtZSwgciwgaHNtX2IsIHNjaG1pdHRfYiwgbHBtZF9iLCBkcnZkbl9iLCBkcnZkbl93LCBkcnZ1cF9iLCBkcnZ1cF93LCBzbHdyX2IsIHNsd3Jfdywgc2x3Zl9iLCBzbHdmX3csIGRydnR5cGUgKi8KLQlEUlZfUElOR1JPVVAoYW8xLCAgIDB4ODY4LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKGFvMiwgICAweDg2YywgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUChhdDEsICAgMHg4NzAsICAyLCAgMywgIDQsICAxMiwgIDcsICAyMCwgIDcsICAyOCwgIDIsICAzMCwgIDIsICBZKSwKLQlEUlZfUElOR1JPVVAoYXQyLCAgIDB4ODc0LCAgMiwgIDMsICA0LCAgMTIsICA3LCAgMjAsICA3LCAgMjgsICAyLCAgMzAsICAyLCAgWSksCi0JRFJWX1BJTkdST1VQKGF0MywgICAweDg3OCwgIDIsICAzLCAgNCwgIDEyLCAgNywgIDIwLCAgNywgIDI4LCAgMiwgIDMwLCAgMiwgIFkpLAotCURSVl9QSU5HUk9VUChhdDQsICAgMHg4N2MsICAyLCAgMywgIDQsICAxMiwgIDcsICAyMCwgIDcsICAyOCwgIDIsICAzMCwgIDIsICBZKSwKLQlEUlZfUElOR1JPVVAoYXQ1LCAgIDB4ODgwLCAgMiwgIDMsICA0LCAgMTQsICA1LCAgMTksICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKGNkZXYxLCAweDg4NCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUChjZGV2MiwgMHg4ODgsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAoZGFwMSwgIDB4ODkwLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKGRhcDIsICAweDg5NCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUChkYXAzLCAgMHg4OTgsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAoZGFwNCwgIDB4ODljLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKGRiZywgICAweDhhMCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUChzZGlvMywgMHg4YjAsICAyLCAgMywgLTEsICAxMiwgIDcsICAyMCwgIDcsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAoc3BpLCAgIDB4OGI0LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKHVhYSwgICAweDhiOCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUCh1YWIsICAgMHg4YmMsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAodWFydDIsIDB4OGMwLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKHVhcnQzLCAweDhjNCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUChzZGlvMSwgMHg4ZWMsICAyLCAgMywgLTEsICAxMiwgIDcsICAyMCwgIDcsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAoZGRjLCAgIDB4OGZjLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKGdtYSwgICAweDkwMCwgIDIsICAzLCAgNCwgIDE0LCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIFkpLAotCURSVl9QSU5HUk9VUChnbWUsICAgMHg5MTAsICAyLCAgMywgIDQsICAxNCwgIDUsICAxOSwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAoZ21mLCAgIDB4OTE0LCAgMiwgIDMsICA0LCAgMTQsICA1LCAgMTksICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKGdtZywgICAweDkxOCwgIDIsICAzLCAgNCwgIDE0LCAgNSwgIDE5LCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUChnbWgsICAgMHg5MWMsICAyLCAgMywgIDQsICAxNCwgIDUsICAxOSwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAob3dyLCAgIDB4OTIwLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKHVkYSwgICAweDkyNCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChhbzEsICAgICAgICAgMHg4NjgsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoYW8yLCAgICAgICAgIDB4ODZjLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKGF0MSwgICAgICAgICAweDg3MCwgIDIsICAzLCAtMSwgIDEyLCAgNywgIDIwLCAgNywgIDI4LCAgMiwgIDMwLCAgMiwgIFkpLAorCURSVl9QSU5HUk9VUChhdDIsICAgICAgICAgMHg4NzQsICAyLCAgMywgLTEsICAxMiwgIDcsICAyMCwgIDcsICAyOCwgIDIsICAzMCwgIDIsICBZKSwKKwlEUlZfUElOR1JPVVAoYXQzLCAgICAgICAgIDB4ODc4LCAgMiwgIDMsIC0xLCAgMTIsICA3LCAgMjAsICA3LCAgMjgsICAyLCAgMzAsICAyLCAgWSksCisJRFJWX1BJTkdST1VQKGF0NCwgICAgICAgICAweDg3YywgIDIsICAzLCAtMSwgIDEyLCAgNywgIDIwLCAgNywgIDI4LCAgMiwgIDMwLCAgMiwgIFkpLAorCURSVl9QSU5HUk9VUChhdDUsICAgICAgICAgMHg4ODAsICAyLCAgMywgIDQsICAxNCwgIDUsICAxOSwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoY2RldjEsICAgICAgIDB4ODg0LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKGNkZXYyLCAgICAgICAweDg4OCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChkYXAxLCAgICAgICAgMHg4OTAsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoZGFwMiwgICAgICAgIDB4ODk0LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKGRhcDMsICAgICAgICAweDg5OCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChkYXA0LCAgICAgICAgMHg4OWMsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoZGJnLCAgICAgICAgIDB4OGEwLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKHNkaW8zLCAgICAgICAweDhiMCwgIDIsICAzLCAtMSwgIDEyLCAgNywgIDIwLCAgNywgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChzcGksICAgICAgICAgMHg4YjQsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAodWFhLCAgICAgICAgIDB4OGI4LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKHVhYiwgICAgICAgICAweDhiYywgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUCh1YXJ0MiwgICAgICAgMHg4YzAsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAodWFydDMsICAgICAgIDB4OGM0LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKHNkaW8xLCAgICAgICAweDhlYywgIDIsICAzLCAtMSwgIDEyLCAgNywgIDIwLCAgNywgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChkZGMsICAgICAgICAgMHg4ZmMsICAyLCAgMywgLTEsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoZ21hLCAgICAgICAgIDB4OTAwLCAgMiwgIDMsIC0xLCAgMTQsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKGdtZSwgICAgICAgICAweDkxMCwgIDIsICAzLCAgNCwgIDE0LCAgNSwgIDE5LCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChnbWYsICAgICAgICAgMHg5MTQsICAyLCAgMywgIDQsICAxNCwgIDUsICAxOSwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoZ21nLCAgICAgICAgIDB4OTE4LCAgMiwgIDMsICA0LCAgMTQsICA1LCAgMTksICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKGdtaCwgICAgICAgICAweDkxYywgIDIsICAzLCAgNCwgIDE0LCAgNSwgIDE5LCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChvd3IsICAgICAgICAgMHg5MjAsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAodWRhLCAgICAgICAgIDB4OTI0LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKGRldjMsICAgICAgICAweDkyYywgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChjZWMsICAgICAgICAgMHg5MzgsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoYXQ2LCAgICAgICAgIDB4OTk0LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgWSksCisJRFJWX1BJTkdST1VQKGRhcDUsICAgICAgICAweDk5OCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUCh1c2JfdmJ1c19lbiwgMHg5OWMsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoYW8zLCAgICAgICAgIDB4OWEwLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgLTEsIC0xLCAgMjgsICAyLCAgLTEsIC0xLCAgTiksCisJRFJWX1BJTkdST1VQKGh2MCwgICAgICAgICAweDlhNCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIC0xLCAtMSwgIDI4LCAgMiwgIC0xLCAtMSwgIE4pLAorCURSVl9QSU5HUk9VUChzZGlvNCwgICAgICAgMHg5YTgsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoYW8wLCAgICAgICAgIDB4OWFjLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHRlZ3JhX3BpbmN0cmxfc29jX2RhdGEgdGVncmExMTRfcGluY3RybCA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMTI0LmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTEyNC5jCmluZGV4IGMyMGUwZTEuLjczNzczNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMTI0LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmExMjQuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBQaW5jdHJsIGRhdGEgZm9yIHRoZSBOVklESUEgVGVncmExMjQgcGlubXV4CiAgKgotICogQ29weXJpZ2h0IChjKSAyMDEzLCBOVklESUEgQ09SUE9SQVRJT04uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIE5WSURJQSBDT1JQT1JBVElPTi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0yMTIsOCArMjEyLDggQEAKICNkZWZpbmUgVEVHUkFfUElOX1BGRjIJCQkJX0dQSU8oMjUwKQogCiAvKiBBbGwgbm9uLUdQSU8gcGlucyBmb2xsb3cgKi8KLSNkZWZpbmUgTlVNX0dQSU9TCShURUdSQV9QSU5fUEZGMiArIDEpCi0jZGVmaW5lIF9QSU4ob2Zmc2V0KQkoTlVNX0dQSU9TICsgKG9mZnNldCkpCisjZGVmaW5lIE5VTV9HUElPUwkJCQkoVEVHUkFfUElOX1BGRjIgKyAxKQorI2RlZmluZSBfUElOKG9mZnNldCkJCQkJKE5VTV9HUElPUyArIChvZmZzZXQpKQogCiAvKiBOb24tR1BJTyBwaW5zICovCiAjZGVmaW5lIFRFR1JBX1BJTl9DT1JFX1BXUl9SRVEJCQlfUElOKDApCkBAIC0zMjUsMTMgKzMyNSwxMyBAQAogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9LQl9ST1c4X1BTMCwgIktCX1JPVzggUFMwIiksCiAJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0tCX1JPVzlfUFMxLCAiS0JfUk9XOSBQUzEiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fS0JfUk9XMTBfUFMyLCAiS0JfUk9XMTAgUFMyIiksCi0JUElOQ1RSTF9QSU4oVEVHUkFfUElOX0tCX1JPVzExX1BTMywgIktCX1JPVzEwIFBTMyIpLAotCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9LQl9ST1cxMl9QUzQsICJLQl9ST1cxMCBQUzQiKSwKLQlQSU5DVFJMX1BJTihURUdSQV9QSU5fS0JfUk9XMTNfUFM1LCAiS0JfUk9XMTAgUFM1IiksCi0JUElOQ1RSTF9QSU4oVEVHUkFfUElOX0tCX1JPVzE0X1BTNiwgIktCX1JPVzEwIFBTNiIpLAotCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9LQl9ST1cxNV9QUzcsICJLQl9ST1cxMCBQUzciKSwKLQlQSU5DVFJMX1BJTihURUdSQV9QSU5fS0JfUk9XMTZfUFQwLCAiS0JfUk9XMTAgUFQwIiksCi0JUElOQ1RSTF9QSU4oVEVHUkFfUElOX0tCX1JPVzE3X1BUMSwgIktCX1JPVzEwIFBUMSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9LQl9ST1cxMV9QUzMsICJLQl9ST1cxMSBQUzMiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fS0JfUk9XMTJfUFM0LCAiS0JfUk9XMTIgUFM0IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0tCX1JPVzEzX1BTNSwgIktCX1JPVzEzIFBTNSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9LQl9ST1cxNF9QUzYsICJLQl9ST1cxNCBQUzYiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fS0JfUk9XMTVfUFM3LCAiS0JfUk9XMTUgUFM3IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0tCX1JPVzE2X1BUMCwgIktCX1JPVzE2IFBUMCIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9LQl9ST1cxN19QVDEsICJLQl9ST1cxNyBQVDEiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fR0VOMl9JMkNfU0NMX1BUNSwgIkdFTjJfSTJDX1NDTCBQVDUiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fR0VOMl9JMkNfU0RBX1BUNiwgIkdFTjJfSTJDX1NEQSBQVDYiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fU0RNTUM0X0NNRF9QVDcsICJTRE1NQzRfQ01EIFBUNyIpLApAQCAtNDA2LDE2ICs0MDYsMTYgQEAKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fSERNSV9DRUNfUEVFMywgIkhETUlfQ0VDIFBFRTMiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fU0RNTUMzX0NMS19MQl9PVVRfUEVFNCwgIlNETU1DM19DTEtfTEJfT1VUIFBFRTQiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fU0RNTUMzX0NMS19MQl9JTl9QRUU1LCAiU0RNTUMzX0NMS19MQl9JTiBQRUU1IiksCi0JUElOQ1RSTF9QSU4oVEVHUkFfUElOX0NPUkVfUFdSX1JFUSwgIkNPUkVfUFdSX1JFUSIpLAotCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9DUFVfUFdSX1JFUSwgIkNQVV9QV1JfUkVRIiksCi0JUElOQ1RSTF9QSU4oVEVHUkFfUElOX09XUiwgIk9XUiIpLAotCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9QV1JfSU5UX04sICJQV1JfSU5UX04iKSwKLQlQSU5DVFJMX1BJTihURUdSQV9QSU5fUkVTRVRfT1VUX04sICJSRVNFVF9PVVRfTiIpLAogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9EUF9IUERfUEZGMCwgIkRQX0hQRCBQRkYwIiksCiAJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1VTQl9WQlVTX0VOMl9QRkYxLCAiVVNCX1ZCVVNfRU4yIFBGRjEiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fUEZGMiwgIlBGRjIiKSwKLQlQSU5DVFJMX1BJTihURUdSQV9QSU5fQ0xLXzMyS19JTiwgIkNMS18zMktfSU4iKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fQ09SRV9QV1JfUkVRLCAiQ09SRV9QV1JfUkVRIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0NQVV9QV1JfUkVRLCAiQ1BVX1BXUl9SRVEiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fUFdSX0lOVF9OLCAiUFdSX0lOVF9OIiksCiAJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0dNSV9DTEtfTEIsICJHTUlfQ0xLX0xCIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1JFU0VUX09VVF9OLCAiUkVTRVRfT1VUX04iKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fT1dSLCAiT1dSIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0NMS18zMktfSU4sICJDTEtfMzJLX0lOIiksCiAJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0pUQUdfUlRDSywgIkpUQUdfUlRDSyIpLAogfTsKIApAQCAtMTEzOCw2ICsxMTM4LDcgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzZG1tYzNfY2xrX2xiX2luX3BlZTVfcGluc1tdID0gewogCVRFR1JBX1BJTl9TRE1NQzNfQ0xLX0xCX0lOX1BFRTUsCiB9OworCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgZHBfaHBkX3BmZjBfcGluc1tdID0gewogCVRFR1JBX1BJTl9EUF9IUERfUEZGMCwKIH07CkBAIC0xMTU4LDI0ICsxMTU5LDI0IEBACiAJVEVHUkFfUElOX0NQVV9QV1JfUkVRLAogfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIG93cl9waW5zW10gPSB7Ci0JVEVHUkFfUElOX09XUiwKLX07Ci0KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBwd3JfaW50X25fcGluc1tdID0gewogCVRFR1JBX1BJTl9QV1JfSU5UX04sCiB9OwogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZ21pX2Nsa19sYl9waW5zW10gPSB7CisJVEVHUkFfUElOX0dNSV9DTEtfTEIsCit9OworCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgcmVzZXRfb3V0X25fcGluc1tdID0gewogCVRFR1JBX1BJTl9SRVNFVF9PVVRfTiwKIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjbGtfMzJrX2luX3BpbnNbXSA9IHsKLQlURUdSQV9QSU5fQ0xLXzMyS19JTiwKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBvd3JfcGluc1tdID0geworCVRFR1JBX1BJTl9PV1IsCiB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgZ21pX2Nsa19sYl9waW5zW10gPSB7Ci0JVEVHUkFfUElOX0dNSV9DTEtfTEIsCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2xrXzMya19pbl9waW5zW10gPSB7CisJVEVHUkFfUElOX0NMS18zMktfSU4sCiB9OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQganRhZ19ydGNrX3BpbnNbXSA9IHsKQEAgLTE0NDEsMTUgKzE0NDIsMTUgQEAKIAlURUdSQV9QSU5fUEZGMiwKIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9jZWNfcGluc1tdID0gewotCVRFR1JBX1BJTl9IRE1JX0NFQ19QRUUzLAotfTsKLQogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX2RldjNfcGluc1tdID0gewogCVRFR1JBX1BJTl9DTEszX09VVF9QRUUwLAogCVRFR1JBX1BJTl9DTEszX1JFUV9QRUUxLAogfTsKIAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX2NlY19waW5zW10gPSB7CisJVEVHUkFfUElOX0hETUlfQ0VDX1BFRTMsCit9OworCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfYXQ2X3BpbnNbXSA9IHsKIAlURUdSQV9QSU5fUEsxLAogCVRFR1JBX1BJTl9QSzMsCkBAIC0xNDk2LDggKzE0OTcsMTAgQEAKIAogZW51bSB0ZWdyYV9tdXggewogCVRFR1JBX01VWF9CTElOSywKKwlURUdSQV9NVVhfQ0NMQSwKIAlURUdSQV9NVVhfQ0VDLAogCVRFR1JBX01VWF9DTERWRlMsCisJVEVHUkFfTVVYX0NMSywKIAlURUdSQV9NVVhfQ0xLMTIsCiAJVEVHUkFfTVVYX0NQVSwKIAlURUdSQV9NVVhfREFQLApAQCAtMTUwNyw2ICsxNTEwLDcgQEAKIAlURUdSQV9NVVhfRElTUExBWUEsCiAJVEVHUkFfTVVYX0RJU1BMQVlBX0FMVCwKIAlURUdSQV9NVVhfRElTUExBWUIsCisJVEVHUkFfTVVYX0RQLAogCVRFR1JBX01VWF9EVFYsCiAJVEVHUkFfTVVYX0VYVFBFUklQSDEsCiAJVEVHUkFfTVVYX0VYVFBFUklQSDIsCkBAIC0xNTI4LDYgKzE1MzIsOSBAQAogCVRFR1JBX01VWF9JUkRBLAogCVRFR1JBX01VWF9LQkMsCiAJVEVHUkFfTVVYX09XUiwKKwlURUdSQV9NVVhfUEUsCisJVEVHUkFfTVVYX1BFMCwKKwlURUdSQV9NVVhfUEUxLAogCVRFR1JBX01VWF9QTUksCiAJVEVHUkFfTVVYX1BXTTAsCiAJVEVHUkFfTVVYX1BXTTEsCkBAIC0xNTM5LDYgKzE1NDYsOCBAQAogCVRFR1JBX01VWF9SU1ZEMiwKIAlURUdSQV9NVVhfUlNWRDMsCiAJVEVHUkFfTVVYX1JTVkQ0LAorCVRFR1JBX01VWF9SVENLLAorCVRFR1JBX01VWF9TQVRBLAogCVRFR1JBX01VWF9TRE1NQzEsCiAJVEVHUkFfTVVYX1NETU1DMiwKIAlURUdSQV9NVVhfU0RNTUMzLApAQCAtMTU1MSw2ICsxNTYwLDggQEAKIAlURUdSQV9NVVhfU1BJNCwKIAlURUdSQV9NVVhfU1BJNSwKIAlURUdSQV9NVVhfU1BJNiwKKwlURUdSQV9NVVhfU1lTLAorCVRFR1JBX01VWF9UTURTLAogCVRFR1JBX01VWF9UUkFDRSwKIAlURUdSQV9NVVhfVUFSVEEsCiAJVEVHUkFfTVVYX1VBUlRCLApAQCAtMTU2OSwxMTM0ICsxNTgwLDE5IEBACiAJVEVHUkFfTVVYX1ZJX0FMVDMsCiAJVEVHUkFfTVVYX1ZJTUNMSzIsCiAJVEVHUkFfTVVYX1ZJTUNMSzJfQUxULAotCVRFR1JBX01VWF9TQVRBLAotCVRFR1JBX01VWF9DQ0xBLAotCVRFR1JBX01VWF9QRTAsCi0JVEVHUkFfTVVYX1BFLAotCVRFR1JBX01VWF9QRTEsCi0JVEVHUkFfTVVYX0RQLAotCVRFR1JBX01VWF9SVENLLAotCVRFR1JBX01VWF9TWVMsCi0JVEVHUkFfTVVYX0NMSywKLQlURUdSQV9NVVhfVE1EUywKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmxpbmtfZ3JvdXBzW10gPSB7Ci0JImNsa18zMmtfb3V0X3BhMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNlY19ncm91cHNbXSA9IHsKLQkiaGRtaV9jZWNfcGVlMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNsZHZmc19ncm91cHNbXSA9IHsKLQkicGgyIiwKLQkicGgzIiwKLQkia2Jfcm93N19wcjciLAotCSJrYl9yb3c4X3BzMCIsCi0JImR2ZnNfcHdtX3B4MCIsCi0JImR2ZnNfY2xrX3B4MiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNsazEyX2dyb3Vwc1tdID0gewotCSJzZG1tYzFfd3Bfbl9wdjMiLAotCSJzZG1tYzFfY2xrX3B6MCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNwdV9ncm91cHNbXSA9IHsKLQkiY3B1X3B3cl9yZXEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYXBfZ3JvdXBzW10gPSB7Ci0JImRhcF9tY2xrMV9wZWUyIiwKLQkiY2xrMl9yZXFfcGNjNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhcDFfZ3JvdXBzW10gPSB7Ci0JImRhcF9tY2xrMV9wZWUyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFwMl9ncm91cHNbXSA9IHsKLQkiZGFwX21jbGsxX3B3NCIsCi0JImdwaW9feDRfYXVkX3B4NCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRldjNfZ3JvdXBzW10gPSB7Ci0JImNsazNfcmVxX3BlZTEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkaXNwbGF5YV9ncm91cHNbXSA9IHsKLQkiZGFwM19mc19wcDAiLAotCSJkYXAzX2Rpbl9wcDEiLAotCSJkYXAzX2RvdXRfcHAyIiwKLQkicGgxIiwKLQkicGk0IiwKLQkicGJiMyIsCi0JInBiYjQiLAotCSJwYmI1IiwKLQkia2Jfcm93M19wcjMiLAotCSJrYl9yb3c0X3ByNCIsCi0JImtiX3JvdzVfcHI1IiwKLQkia2Jfcm93Nl9wcjYiLAotCSJrYl9jb2wzX3BxMyIsCi0JInNkbW1jM19kYXQyX3BiNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRpc3BsYXlhX2FsdF9ncm91cHNbXSA9IHsKLQkia2Jfcm93Nl9wcjYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkaXNwbGF5Yl9ncm91cHNbXSA9IHsKLQkiZGFwM19mc19wcDAiLAotCSJkYXAzX2Rpbl9wcDEiLAotCSJkYXAzX3NjbGtfcHAzIiwKLQotCSJwdTMiLAotCSJwdTQiLAotCSJwdTUiLAotCi0JInBiYjMiLAotCSJwYmI0IiwKLQkicGJiNiIsCi0KLQkia2Jfcm93M19wcjMiLAotCSJrYl9yb3c0X3ByNCIsCi0JImtiX3JvdzVfcHI1IiwKLQkia2Jfcm93Nl9wcjYiLAotCi0JInNkbW1jM19kYXQzX3BiNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGR0dl9ncm91cHNbXSA9IHsKLQkidWFydDNfY3RzX25fcGExIiwKLQkidWFydDNfcnRzX25fcGMwIiwKLQkiZGFwNF9mc19wcDQiLAotCSJkYXA0X2RvdXRfcHA2IiwKLQkicGk3IiwKLQkicGgwIiwKLQkicGg2IiwKLQkicGg3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0cGVyaXBoMV9ncm91cHNbXSA9IHsKLQkiZGFwX21jbGsxX3B3NCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGV4dHBlcmlwaDJfZ3JvdXBzW10gPSB7Ci0JImNsazJfb3V0X3B3NSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGV4dHBlcmlwaDNfZ3JvdXBzW10gPSB7Ci0JImNsazNfb3V0X3BlZTAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBnbWlfZ3JvdXBzW10gPSB7Ci0JInVhcnQyX2N0c19uX3BqNSIsCi0JInVhcnQyX3J0c19uX3BqNiIsCi0JInVhcnQzX3R4ZF9wdzYiLAotCSJ1YXJ0M19yeGRfcHc3IiwKLQkidWFydDNfY3RzX25fcGExIiwKLQkidWFydDNfcnRzX25fcGMwIiwKLQotCSJwdTAiLAotCSJwdTEiLAotCSJwdTIiLAotCSJwdTMiLAotCSJwdTQiLAotCSJwdTUiLAotCSJwdTYiLAotCi0JImRhcDRfZnNfcHA0IiwKLQkiZGFwNF9kaW5fcHA1IiwKLQkiZGFwNF9kb3V0X3BwNiIsCi0JImRhcDRfc2Nsa19wcDciLAotCi0JInBjNyIsCi0KLQkicGcwIiwKLQkicGcxIiwKLQkicGcyIiwKLQkicGczIiwKLQkicGc0IiwKLQkicGc1IiwKLQkicGc2IiwKLQkicGc3IiwKLQotCSJwaDAiLAotCSJwaDEiLAotCSJwaDIiLAotCSJwaDMiLAotCSJwaDQiLAotCSJwaDUiLAotCSJwaDYiLAotCSJwaDciLAotCi0JInBpMCIsCi0JInBpMSIsCi0JInBpMiIsCi0JInBpMyIsCi0JInBpNCIsCi0JInBpNSIsCi0JInBpNiIsCi0JInBpNyIsCi0KLQkicGowIiwKLQkicGoyIiwKLQotCSJwazAiLAotCSJwazEiLAotCSJwazIiLAotCSJwazMiLAotCSJwazQiLAotCi0JInBqNyIsCi0JInBiMCIsCi0JInBiMSIsCi0JInBrNyIsCi0KLQkiZ2VuMl9pMmNfc2NsX3B0NSIsCi0JImdlbjJfaTJjX3NkYV9wdDYiLAotCi0JInNkbW1jNF9kYXQwX3BhYTAiLAotCSJzZG1tYzRfZGF0MV9wYWExIiwKLQkic2RtbWM0X2RhdDJfcGFhMiIsCi0JInNkbW1jNF9kYXQzX3BhYTMiLAotCSJzZG1tYzRfZGF0NF9wYWE0IiwKLQkic2RtbWM0X2RhdDZfcGFhNiIsCi0JInNkbW1jNF9kYXQ3X3BhYTciLAotCSJzZG1tYzRfY2xrX3BjYzQiLAotCSJzZG1tYzRfY21kX3B0NyIsCi0JImdtaV9jbGtfbGIiLAotCi0JImRhcDFfZnNfcG4wIiwKLQkiZGFwMV9kaW5fcG4xIiwKLQkiZGFwMV9kb3V0X3BuMiIsCi0JImRhcDFfc2Nsa19wbjMiLAotCi0JImRhcDJfZnNfcGEyIiwKLQkiZGFwMl9kaW5fcGE0IiwKLQkiZGFwMl9kb3V0X3BhNSIsCi0JImRhcDJfc2Nsa19wYTMiLAotCi0JImR2ZnNfcHdtX3B4MCIsCi0JImR2ZnNfY2xrX3B4MiIsCi0JImdwaW9feDFfYXVkX3B4MSIsCi0JImdwaW9feDNfYXVkX3B4MyIsCi0JImdwaW9feDRfYXVkX3B4NCIsCi0JImdwaW9feDVfYXVkX3B4NSIsCi0JImdwaW9feDZfYXVkX3B4NiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdtaV9hbHRfZ3JvdXBzW10gPSB7Ci0JInBjNyIsCi0JInBrNCIsCi0JInBqNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGhkYV9ncm91cHNbXSA9IHsKLQkiZGFwMV9mc19wbjAiLAotCSJkYXAxX2Rpbl9wbjEiLAotCSJkYXAxX2RvdXRfcG4yIiwKLQkiZGFwMV9zY2xrX3BuMyIsCi0JImRhcDJfZnNfcGEyIiwKLQkiZGFwMl9zY2xrX3BhMyIsCi0JImRhcDJfZGluX3BhNCIsCi0JImRhcDJfZG91dF9wYTUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoc2lfZ3JvdXBzW10gPSB7Ci0JInVscGlfZGF0YTBfcG8xIiwKLQkidWxwaV9kYXRhMV9wbzIiLAotCSJ1bHBpX2RhdGEyX3BvMyIsCi0JInVscGlfZGF0YTNfcG80IiwKLQkidWxwaV9kYXRhNF9wbzUiLAotCSJ1bHBpX2RhdGE1X3BvNiIsCi0JInVscGlfZGF0YTZfcG83IiwKLQkidWxwaV9kYXRhN19wbzAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmMxX2dyb3Vwc1tdID0gewotCSJnZW4xX2kyY19zY2xfcGM0IiwKLQkiZ2VuMV9pMmNfc2RhX3BjNSIsCi0JImdwaW9fdzJfYXVkX3B3MiIsCi0JImdwaW9fdzNfYXVkX3B3MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyYzJfZ3JvdXBzW10gPSB7Ci0JImdlbjJfaTJjX3NjbF9wdDUiLAotCSJnZW4yX2kyY19zZGFfcHQ2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjM19ncm91cHNbXSA9IHsKLQkic3BkaWZfaW5fcGs2IiwKLQkic3BkaWZfb3V0X3BrNSIsCi0JImNhbV9pMmNfc2NsX3BiYjEiLAotCSJjYW1faTJjX3NkYV9wYmIyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjNF9ncm91cHNbXSA9IHsKLQkiZGRjX3NjbF9wdjQiLAotCSJkZGNfc2RhX3B2NSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyY3B3cl9ncm91cHNbXSA9IHsKLQkicHdyX2kyY19zY2xfcHo2IiwKLQkicHdyX2kyY19zZGFfcHo3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJzMF9ncm91cHNbXSA9IHsKLQkiZGFwMV9mc19wbjAiLAotCSJkYXAxX2Rpbl9wbjEiLAotCSJkYXAxX2RvdXRfcG4yIiwKLQkiZGFwMV9zY2xrX3BuMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyczFfZ3JvdXBzW10gPSB7Ci0JImRhcDJfZnNfcGEyIiwKLQkiZGFwMl9zY2xrX3BhMyIsCi0JImRhcDJfZGluX3BhNCIsCi0JImRhcDJfZG91dF9wYTUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMnMyX2dyb3Vwc1tdID0gewotCSJkYXAzX2ZzX3BwMCIsCi0JImRhcDNfZGluX3BwMSIsCi0JImRhcDNfZG91dF9wcDIiLAotCSJkYXAzX3NjbGtfcHAzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJzM19ncm91cHNbXSA9IHsKLQkiZGFwNF9mc19wcDQiLAotCSJkYXA0X2Rpbl9wcDUiLAotCSJkYXA0X2RvdXRfcHA2IiwKLQkiZGFwNF9zY2xrX3BwNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyczRfZ3JvdXBzW10gPSB7Ci0JInBjYzEiLAotCSJwYmI2IiwKLQkicGJiNyIsCi0JInBjYzIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpcmRhX2dyb3Vwc1tdID0gewotCSJ1YXJ0Ml9yeGRfcGMzIiwKLQkidWFydDJfdHhkX3BjMiIsCi0JImtiX3JvdzExX3BzMyIsCi0JImtiX3JvdzEyX3BzNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtiY19ncm91cHNbXSA9IHsKLQkia2Jfcm93MF9wcjAiLAotCSJrYl9yb3cxX3ByMSIsCi0JImtiX3JvdzJfcHIyIiwKLQkia2Jfcm93M19wcjMiLAotCSJrYl9yb3c0X3ByNCIsCi0JImtiX3JvdzVfcHI1IiwKLQkia2Jfcm93Nl9wcjYiLAotCSJrYl9yb3c3X3ByNyIsCi0JImtiX3JvdzhfcHMwIiwKLQkia2Jfcm93OV9wczEiLAotCSJrYl9yb3cxMF9wczIiLAotCSJrYl9yb3cxMV9wczMiLAotCSJrYl9yb3cxMl9wczQiLAotCSJrYl9yb3cxM19wczUiLAotCSJrYl9yb3cxNF9wczYiLAotCSJrYl9yb3cxNV9wczciLAotCSJrYl9yb3cxNl9wdDAiLAotCSJrYl9yb3cxN19wdDEiLAotCi0JImtiX2NvbDBfcHEwIiwKLQkia2JfY29sMV9wcTEiLAotCSJrYl9jb2wyX3BxMiIsCi0JImtiX2NvbDNfcHEzIiwKLQkia2JfY29sNF9wcTQiLAotCSJrYl9jb2w1X3BxNSIsCi0JImtiX2NvbDZfcHE2IiwKLQkia2JfY29sN19wcTciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBvd3JfZ3JvdXBzW10gPSB7Ci0JInB1MCIsCi0JImtiX2NvbDRfcHE0IiwKLQkib3dyIiwKLQkic2RtbWMzX2NkX25fcHYyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcG1pX2dyb3Vwc1tdID0gewotCSJwd3JfaW50X24iLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd20wX2dyb3Vwc1tdID0gewotCSJzZG1tYzFfZGF0Ml9weTUiLAotCSJ1YXJ0M19ydHNfbl9wYzAiLAotCSJwdTMiLAotCSJwaDAiLAotCSJzZG1tYzNfZGF0M19wYjQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd20xX2dyb3Vwc1tdID0gewotCSJzZG1tYzFfZGF0MV9weTYiLAotCSJwdTQiLAotCSJwaDEiLAotCSJzZG1tYzNfZGF0Ml9wYjUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd20yX2dyb3Vwc1tdID0gewotCSJwdTUiLAotCSJwaDIiLAotCSJrYl9jb2wzX3BxMyIsCi0JInNkbW1jM19kYXQxX3BiNiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bTNfZ3JvdXBzW10gPSB7Ci0JInB1NiIsCi0JInBoMyIsCi0JInNkbW1jM19jbWRfcGE3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdyb25fZ3JvdXBzW10gPSB7Ci0JImNvcmVfcHdyX3JlcSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJlc2V0X291dF9uX2dyb3Vwc1tdID0gewotCSJyZXNldF9vdXRfbiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQxX2dyb3Vwc1tdID0gewotCSJwdjAiLAotCSJwdjEiLAotCi0JImhkbWlfaW50X3BuNyIsCi0JInB1MSIsCi0JInB1MiIsCi0JInBjNyIsCi0JInBpNyIsCi0JInBrMCIsCi0JInBqMCIsCi0JInBqMiIsCi0JInBrMiIsCi0JInBpMyIsCi0JInBpNiIsCi0KLQkicGcwIiwKLQkicGcxIiwKLQkicGcyIiwKLQkicGczIiwKLQkicGc0IiwKLQkicGc1IiwKLQkicGc2IiwKLQkicGc3IiwKLQotCSJwaTAiLAotCSJwaTEiLAotCi0JImdwaW9feDdfYXVkX3B4NyIsCi0KLQkicmVzZXRfb3V0X24iLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByc3ZkMl9ncm91cHNbXSA9IHsKLQkicHYwIiwKLQkicHYxIiwKLQotCSJzZG1tYzFfZGF0MF9weTciLAotCSJjbGsyX291dF9wdzUiLAotCSJjbGsyX3JlcV9wY2M1IiwKLQkiaGRtaV9pbnRfcG43IiwKLQkiZGRjX3NjbF9wdjQiLAotCSJkZGNfc2RhX3B2NSIsCi0KLQkidWFydDNfdHhkX3B3NiIsCi0JInVhcnQzX3J4ZF9wdzciLAotCi0JImdlbjFfaTJjX3NjbF9wYzQiLAotCSJnZW4xX2kyY19zZGFfcGM1IiwKLQotCSJjbGsyX291dF9wZWUwIiwKLQkiY2xrMl9yZXFfcGVlMSIsCi0JInBjNyIsCi0JInBpNSIsCi0JInBqMCIsCi0JInBqMiIsCi0KLQkicGs0IiwKLQkicGsyIiwKLQkicGkzIiwKLQkicGk2IiwKLQkicGcwIiwKLQkicGcxIiwKLQkicGc1IiwKLQkicGc2IiwKLQkicGc3IiwKLQotCSJwaDQiLAotCSJwaDUiLAotCSJwajciLAotCSJwYjAiLAotCSJwYjEiLAotCSJwazciLAotCSJwaTAiLAotCSJwaTEiLAotCi0JImdlbjJfaTJjX3NjbF9wdDUiLAotCSJnZW4yX2kyY19zZGFfcHQ2IiwKLQkic2RtbWM0X2Nsa19wY2M0IiwKLQkic2RtbWM0X2NtZF9wdDciLAotCSJzZG1tYzRfZGF0N19wYWE3IiwKLQkicGNjMSIsCi0JInBiYjYiLAotCSJwYmI3IiwKLQkicGNjMiIsCi0JImp0YWdfcnRjayIsCi0KLQkicHdyX2kyY19zY2xfcHo2IiwKLQkicHdyX2kyY19zZGFfcHo3IiwKLQotCSJrYl9yb3cwX3ByMCIsCi0JImtiX3JvdzFfcHIxIiwKLQkia2Jfcm93Ml9wcjIiLAotCSJrYl9yb3c3X3ByNyIsCi0JImtiX3JvdzhfcHMwIiwKLQkia2Jfcm93OV9wczEiLAotCSJrYl9yb3cxMF9wczIiLAotCSJrYl9yb3cxMV9wczMiLAotCSJrYl9yb3cxMl9wczQiLAotCSJrYl9yb3cxM19wczUiLAotCSJrYl9yb3cxNF9wczYiLAotCi0JImtiX2NvbDBfcHEwIiwKLQkia2JfY29sMV9wcTEiLAotCSJrYl9jb2wyX3BxMiIsCi0JImtiX2NvbDVfcHE1IiwKLQkia2JfY29sNl9wcTYiLAotCSJrYl9jb2w3X3BxNyIsCi0KLQkiY29yZV9wd3JfcmVxIiwKLQkiY3B1X3B3cl9yZXEiLAotCSJwd3JfaW50X24iLAotCSJjbGtfMzJrX2luIiwKLQkib3dyIiwKLQotCSJzcGRpZl9pbl9wazYiLAotCSJzcGRpZl9vdXRfcGs1IiwKLQkiZ3Bpb194MV9hdWRfcHgxIiwKLQotCSJzZG1tYzNfY2xrX3BhNiIsCi0JInNkbW1jM19kYXQwX3BiNyIsCi0KLQkicGV4X2wwX3JzdF9uX3BkZDEiLAotCSJwZXhfbDBfY2xrcmVxX25fcGRkMiIsCi0JInBleF93YWtlX25fcGRkMyIsCi0JInBleF9sMV9yc3Rfbl9wZGQ1IiwKLQkicGV4X2wxX2Nsa3JlcV9uX3BkZDYiLAotCSJoZG1pX2NlY19wZWUzIiwKLQotCSJncGlvX3cyX2F1ZF9wdzIiLAotCSJ1c2JfdmJ1c19lbjBfcG40IiwKLQkidXNiX3ZidXNfZW4xX3BuNSIsCi0JInNkbW1jM19jbGtfbGJfb3V0X3BlZTQiLAotCSJzZG1tYzNfY2xrX2xiX2luX3BlZTUiLAotCSJnbWlfY2xrX2xiIiwKLQkicmVzZXRfb3V0X24iLAotCSJrYl9yb3cxNl9wdDAiLAotCSJrYl9yb3cxN19wdDEiLAotCSJkcF9ocGRfcGZmMCIsCi0JInVzYl92YnVzX2VuMl9wZmYxIiwKLQkicGZmMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQzX2dyb3Vwc1tdID0gewotCSJkYXAzX3NjbGtfcHAzIiwKLQkicHYwIiwKLQkicHYxIiwKLQkic2RtbWMxX2Nsa19wejAiLAotCSJjbGsyX291dF9wdzUiLAotCSJjbGsyX3JlcV9wY2M1IiwKLQkiaGRtaV9pbnRfcG43IiwKLQotCSJkZGNfc2NsX3B2NCIsCi0JImRkY19zZGFfcHY1IiwKLQotCSJwdTYiLAotCi0JImdlbjFfaTJjX3NjbF9wYzQiLAotCSJnZW4xX2kyY19zZGFfcGM1IiwKLQotCSJkYXA0X2Rpbl9wcDUiLAotCSJkYXA0X3NjbGtfcHA3IiwKLQotCSJjbGszX291dF9wZWUwIiwKLQkiY2xrM19yZXFfcGVlMSIsCi0KLQkic2RtbWM0X2RhdDVfcGFhNSIsCi0JImdwaW9fcGNjMSIsCi0JImNhbV9pMmNfc2NsX3BiYjEiLAotCSJjYW1faTJjX3NkYV9wYmIyIiwKLQkicGJiNSIsCi0JInBiYjciLAotCSJqdGFnX3J0Y2siLAotCSJwd3JfaTJjX3NjbF9wejYiLAotCSJwd3JfaTJjX3NkYV9wejciLAotCi0JImtiX3JvdzBfcHIwIiwKLQkia2Jfcm93MV9wcjEiLAotCSJrYl9yb3cyX3ByMiIsCi0JImtiX3JvdzRfcHI0IiwKLQkia2Jfcm93NV9wcjUiLAotCSJrYl9yb3c5X3BzMSIsCi0JImtiX3JvdzEwX3BzMiIsCi0JImtiX3JvdzExX3BzMyIsCi0JImtiX3JvdzEyX3BzNCIsCi0JImtiX3JvdzE1X3BzNyIsCi0KLQkiY2xrXzMya19vdXRfcGEwIiwKLQkiY29yZV9wd3JfcmVxIiwKLQkiY3B1X3B3cl9yZXEiLAotCSJwd3JfaW50X24iLAotCSJjbGtfMzJrX2luIiwKLQkib3dyIiwKLQotCSJkYXBfbWNsazFfcHc0IiwKLQkic3BkaWZfaW5fcGs2IiwKLQkic3BkaWZfb3V0X3BrNSIsCi0JInNkbW1jM19jbGtfcGE2IiwKLQkic2RtbWMzX2RhdDBfcGI3IiwKLQotCSJwZXhfbDBfcnN0X25fcGRkMSIsCi0JInBleF9sMF9jbGtyZXFfbl9wZGQyIiwKLQkicGV4X3dha2Vfbl9wZGQzIiwKLQkicGV4X2wxX3JzdF9uX3BkZDUiLAotCSJwZXhfbDFfY2xrcmVxX25fcGRkNiIsCi0JImhkbWlfY2VjX3BlZTMiLAotCi0JInNkbW1jM19jZF9uX3B2MiIsCi0JInVzYl92YnVzX2VuMF9wbjQiLAotCSJ1c2JfdmJ1c19lbjFfcG41IiwKLQkic2RtbWMzX2Nsa19sYl9vdXRfcGVlNCIsCi0JInNkbW1jM19jbGtfbGJfaW5fcGVlNSIsCi0JInJlc2V0X291dF9uIiwKLQkia2Jfcm93MTZfcHQwIiwKLQkia2Jfcm93MTdfcHQxIiwKLQkiZHBfaHBkX3BmZjAiLAotCSJ1c2JfdmJ1c19lbjJfcGZmMSIsCi0JInBmZjIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByc3ZkNF9ncm91cHNbXSA9IHsKLQkiZGFwM19kb3V0X3BwMiIsCi0JInB2MCIsCi0JInB2MSIsCi0JInNkbW1jMV9jbGtfcHowIiwKLQotCSJjbGsyX291dF9wdzUiLAotCSJjbGsyX3JlcV9wY2M1IiwKLQkiaGRtaV9pbnRfcG43IiwKLQkiZGRjX3NjbF9wdjQiLAotCSJkZGNfc2RhX3B2NSIsCi0KLQkidWFydDJfcnRzX25fcGo2IiwKLQkidWFydDJfY3RzX25fcGo1IiwKLQkidWFydDNfdHhkX3B3NiIsCi0JInVhcnQzX3J4ZF9wdzciLAotCi0JInB1MCIsCi0JInB1MSIsCi0JInB1MiIsCi0KLQkiZ2VuMV9pMmNfc2NsX3BjNCIsCi0JImdlbjFfaTJjX3NkYV9wYzUiLAotCi0JImRhcDRfZnNfcHA0IiwKLQkiZGFwNF9kb3V0X3BwNiIsCi0JImRhcDRfZGluX3BwNSIsCi0JImRhcDRfc2Nsa19wcDciLAotCi0JImNsazNfb3V0X3BlZTAiLAotCSJjbGszX3JlcV9wZWUxIiwKLQotCSJwaTUiLAotCSJwazEiLAotCSJwazIiLAotCSJwZzAiLAotCSJwZzEiLAotCSJwZzIiLAotCSJwZzMiLAotCSJwaDQiLAotCSJwaDUiLAotCSJwYjAiLAotCSJwYjEiLAotCSJwazciLAotCSJwaTAiLAotCSJwaTEiLAotCSJwaTIiLAotCi0JImdlbjJfaTJjX3NjbF9wdDUiLAotCSJnZW4yX2kyY19zZGFfcHQ2IiwKLQotCSJzZG1tYzRfY21kX3B0NyIsCi0JInNkbW1jNF9kYXQwX3BhYTAiLAotCSJzZG1tYzRfZGF0MV9wYWExIiwKLQkic2RtbWM0X2RhdDJfcGFhMiIsCi0JInNkbW1jNF9kYXQzX3BhYTMiLAotCSJzZG1tYzRfZGF0NF9wYWE0IiwKLQkic2RtbWM0X2RhdDVfcGFhNSIsCi0JInNkbW1jNF9kYXQ2X3BhYTYiLAotCSJzZG1tYzRfZGF0N19wYWE3IiwKLQotCSJqdGFnX3J0Y2siLAotCSJwd3JfaTJjX3NjbF9wejYiLAotCSJwd3JfaTJjX3NkYV9wejciLAotCi0JImtiX3JvdzBfcHIwIiwKLQkia2Jfcm93MV9wcjEiLAotCSJrYl9yb3cyX3ByMiIsCi0JImtiX3JvdzEzX3BzNSIsCi0JImtiX3JvdzE0X3BzNiIsCi0JImtiX3JvdzE1X3BzNyIsCi0KLQkia2JfY29sMF9wcTAiLAotCSJrYl9jb2wxX3BxMSIsCi0JImtiX2NvbDJfcHEyIiwKLQkia2JfY29sNV9wcTUiLAotCi0JImNsa18zMmtfb3V0X3BhMCIsCi0JImNvcmVfcHdyX3JlcSIsCi0JImNwdV9wd3JfcmVxIiwKLQkicHdyX2ludF9uIiwKLQkiY2xrXzMya19pbiIsCi0JIm93ciIsCi0KLQkiZGFwMV9mc19wbjAiLAotCSJkYXAxX2Rpbl9wbjEiLAotCSJkYXAxX3NjbGtfcG4zIiwKLQkiZGFwX21jbGsxX3JlcV9wZWUyIiwKLQkiZGFwX21jbGsxX3B3NSIsCi0KLQkiZGFwMl9mc19wYTIiLAotCSJkYXAyX2Rpbl9wYTQiLAotCSJkYXAyX2RvdXRfcGE1IiwKLQkiZGFwMl9zY2xrX3BhMyIsCi0KLQkiZHZmc19wd21fcHgwIiwKLQkiZHZmc19jbGtfcHgyIiwKLQkiZ3Bpb194MV9hdWRfcHgxIiwKLQkiZ3Bpb194M19hdWRfcHgzIiwKLQotCSJncGlvX3g1X2F1ZF9weDUiLAotCSJncGlvX3g3X2F1ZF9weDciLAotCi0JInBleF9sMF9yc3Rfbl9wZGQxIiwKLQkicGV4X2wwX2Nsa3JlcV9uX3BkZDIiLAotCSJwZXhfd2FrZV9uX3BkZDMiLAotCSJwZXhfbDFfcnN0X25fcGRkNSIsCi0JInBleF9sMV9jbGtyZXFfbl9wZGQ2IiwKLQkiaGRtaV9jZWNfcGVlMyIsCi0KLQkic2RtbWMzX2NkX25fcHYyIiwKLQkidXNiX3ZidXNfZW4wX3BuNCIsCi0JInVzYl92YnVzX2VuMV9wbjUiLAotCSJzZG1tYzNfY2xrX2xiX291dF9wZWU0IiwKLQkic2RtbWMzX2Nsa19sYl9pbl9wZWU1IiwKLQkiZ21pX2Nsa19sYiIsCi0KLQkiZHBfaHBkX3BmZjAiLAotCSJ1c2JfdmJ1c19lbjJfcGZmMSIsCi0JInBmZjIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZG1tYzFfZ3JvdXBzW10gPSB7Ci0JInNkbW1jMV9jbGtfcHowIiwKLQkic2RtbWMxX2NtZF9wejEiLAotCSJzZG1tYzFfZGF0M19weTQiLAotCSJzZG1tYzFfZGF0Ml9weTUiLAotCSJzZG1tYzFfZGF0MV9weTYiLAotCSJzZG1tYzFfZGF0MF9weTciLAotCSJjbGsyX291dF9wdzUiLAotCSJjbGsyX3JlcV9wY2MiLAotCSJ1YXJ0M19jdHNfbl9wYTEiLAotCSJzZG1tYzFfd3Bfbl9wdjMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZG1tYzJfZ3JvdXBzW10gPSB7Ci0JInBpNSIsCi0JInBrMSIsCi0JInBrMyIsCi0JInBrNCIsCi0JInBpNiIsCi0JInBoNCIsCi0JInBoNSIsCi0JInBoNiIsCi0JInBoNyIsCi0JInBpMiIsCi0JImNhbV9tY2xrX3BjYzAiLAotCSJwY2MxIiwKLQkicGJiMCIsCi0JImNhbV9pMmNfc2NsX3BiYjEiLAotCSJjYW1faTJjX3NkYV9wYmIyIiwKLQkicGJiMyIsCi0JInBiYjQiLAotCSJwYmI1IiwKLQkicGJiNiIsCi0JInBiYjciLAotCSJwY2MyIiwKLQkiZ21pX2Nsa19sYiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkbW1jM19ncm91cHNbXSA9IHsKLQkicGswIiwKLQkicGNjMiIsCi0KLQkia2JfY29sNF9wcTQiLAotCSJrYl9jb2w1X3BxNSIsCi0KLQkic2RtbWMzX2Nsa19wYTYiLAotCSJzZG1tYzNfY21kX3BhNyIsCi0JInNkbW1jM19kYXQwX3BiNyIsCi0JInNkbW1jM19kYXQxX3BiNiIsCi0JInNkbW1jM19kYXQyX3BiNSIsCi0JInNkbW1jM19kYXQzX3BiNCIsCi0KLQkic2RtbWMzX2NkX25fcHYyIiwKLQkic2RtbWMzX2Nsa19sYl9pbl9wZWU1IiwKLQkic2RtbWMzX2Nsa19sYl9vdXRfcGVlNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkbW1jNF9ncm91cHNbXSA9IHsKLQkic2RtbWM0X2Nsa19wY2M0IiwKLQkic2RtbWM0X2NtZF9wdDciLAotCSJzZG1tYzRfZGF0MF9wYWEwIiwKLQkic2RtbWM0X2RhdDFfcGFhMSIsCi0JInNkbW1jNF9kYXQyX3BhYTIiLAotCSJzZG1tYzRfZGF0M19wYWEzIiwKLQkic2RtbWM0X2RhdDRfcGFhNCIsCi0JInNkbW1jNF9kYXQ1X3BhYTUiLAotCSJzZG1tYzRfZGF0Nl9wYWE2IiwKLQkic2RtbWM0X2RhdDdfcGFhNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNvY19ncm91cHNbXSA9IHsKLQkicGswIiwKLQkicGoyIiwKLQkia2Jfcm93MTVfcHM3IiwKLQkiY2xrXzMya19vdXRfcGEwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BkaWZfZ3JvdXBzW10gPSB7Ci0JInNkbW1jMV9jbWRfcHoxIiwKLQkic2RtbWMxX2RhdDNfcHk0IiwKLQkidWFydDJfcnhkX3BjMyIsCi0JInVhcnQyX3R4ZF9wYzIiLAotCSJzcGRpZl9pbl9wazYiLAotCSJzcGRpZl9vdXRfcGs1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpMV9ncm91cHNbXSA9IHsKLQkidWxwaV9jbGtfcHkwIiwKLQkidWxwaV9kaXJfcHkxIiwKLQkidWxwaV9ueHRfcHkyIiwKLQkidWxwaV9zdHBfcHkzIiwKLQkiZ3Bpb194M19hdWRfcHgzIiwKLQkiZ3Bpb194NF9hdWRfcHg0IiwKLQkiZ3Bpb194NV9hdWRfcHg1IiwKLQkiZ3Bpb194Nl9hdWRfcHg2IiwKLQkiZ3Bpb194N19hdWRfcHg3IiwKLQkiZ3Bpb193M19hdWRfcHczIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpMl9ncm91cHNbXSA9IHsKLQkidWxwaV9kYXRhNF9wbzUiLAotCSJ1bHBpX2RhdGE1X3BvNiIsCi0JInVscGlfZGF0YTZfcG83IiwKLQkidWxwaV9kYXRhN19wbzAiLAotCi0JImtiX3JvdzEzX3BzNSIsCi0JImtiX3JvdzE0X3BzNiIsCi0JImtiX3JvdzE1X3BzNyIsCi0JImtiX2NvbDBfcHEwIiwKLQkia2JfY29sMV9wcTEiLAotCSJrYl9jb2wyX3BxMiIsCi0JImtiX2NvbDZfcHE2IiwKLQkia2JfY29sN19wcTciLAotCSJncGlvX3g0X2F1ZF9weDQiLAotCSJncGlvX3g1X2F1ZF9weDUiLAotCSJncGlvX3g2X2F1ZF9weDYiLAotCSJncGlvX3g3X2F1ZF9weDciLAotCSJncGlvX3cyX2F1ZF9wdzIiLAotCSJncGlvX3czX2F1ZF9wdzMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkzX2dyb3Vwc1tdID0gewotCSJ1bHBpX2RhdGEwX3BvMSIsCi0JInVscGlfZGF0YTFfcG8yIiwKLQkidWxwaV9kYXRhMl9wbzMiLAotCSJ1bHBpX2RhdGEzX3BvNCIsCi0JInNkbW1jNF9kYXQwX3BhYTAiLAotCSJzZG1tYzRfZGF0MV9wYWExIiwKLQkic2RtbWM0X2RhdDJfcGFhMiIsCi0JInNkbW1jNF9kYXQzX3BhYTMiLAotCSJzZG1tYzRfZGF0NF9wYWE0IiwKLQkic2RtbWM0X2RhdDVfcGFhNSIsCi0JInNkbW1jNF9kYXQ2X3BhYTYiLAotCSJzZG1tYzNfY2xrX3BhNiIsCi0JInNkbW1jM19jbWRfcGE3IiwKLQkic2RtbWMzX2RhdDBfcGI3IiwKLQkic2RtbWMzX2RhdDFfcGI2IiwKLQkic2RtbWMzX2RhdDJfcGI1IiwKLQkic2RtbWMzX2RhdDNfcGI0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpNF9ncm91cHNbXSA9IHsKLQkic2RtbWMxX2NtZF9wejEiLAotCSJzZG1tYzFfZGF0M19weTQiLAotCSJzZG1tYzFfZGF0Ml9weTUiLAotCSJzZG1tYzFfZGF0MV9weTYiLAotCSJzZG1tYzFfZGF0MF9weTciLAotCi0JInVhcnQyX3J4ZF9wYzMiLAotCSJ1YXJ0Ml90eGRfcGMyIiwKLQkidWFydDJfcnRzX25fcGo2IiwKLQkidWFydDJfY3RzX25fcGo1IiwKLQkidWFydDNfdHhkX3B3NiIsCi0JInVhcnQzX3J4ZF9wdzciLAotCi0JInBpMyIsCi0JInBnNCIsCi0JInBnNSIsCi0JInBnNiIsCi0JInBnNyIsCi0JInBoMyIsCi0JInBpNCIsCi0JInNkbW1jMV93cF9uX3B2MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTVfZ3JvdXBzW10gPSB7Ci0JInVscGlfY2xrX3B5MCIsCi0JInVscGlfZGlyX3B5MSIsCi0JInVscGlfbnh0X3B5MiIsCi0JInVscGlfc3RwX3B5MyIsCi0JImRhcDNfZnNfcHAwIiwKLQkiZGFwM19kaW5fcHAxIiwKLQkiZGFwM19kb3V0X3BwMiIsCi0JImRhcDNfc2Nsa19wcDMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGk2X2dyb3Vwc1tdID0gewotCSJkdmZzX3B3bV9weDAiLAotCSJncGlvX3gxX2F1ZF9weDEiLAotCSJncGlvX3gzX2F1ZF9weDMiLAotCSJkdmZzX2Nsa19weDIiLAotCSJncGlvX3g2X2F1ZF9weDYiLAotCSJncGlvX3cyX2F1ZF9wdzIiLAotCSJncGlvX3czX2F1ZF9wdzMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0cmFjZV9ncm91cHNbXSA9IHsKLQkicGkyIiwKLQkicGk0IiwKLQkicGk3IiwKLQkicGgwIiwKLQkicGg2IiwKLQkicGg3IiwKLQkicGcyIiwKLQkicGczIiwKLQkicGsxIiwKLQkicGszIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGFfZ3JvdXBzW10gPSB7Ci0JInVscGlfZGF0YTBfcG8xIiwKLQkidWxwaV9kYXRhMV9wbzIiLAotCSJ1bHBpX2RhdGEyX3BvMyIsCi0JInVscGlfZGF0YTNfcG80IiwKLQkidWxwaV9kYXRhNF9wbzUiLAotCSJ1bHBpX2RhdGE1X3BvNiIsCi0JInVscGlfZGF0YTZfcG83IiwKLQkidWxwaV9kYXRhN19wbzAiLAotCi0JInNkbW1jMV9jbWRfcHoxIiwKLQkic2RtbWMxX2RhdDNfcHk0IiwKLQkic2RtbWMxX2RhdDJfcHk1IiwKLQkic2RtbWMxX2RhdDFfcHk2IiwKLQkic2RtbWMxX2RhdDBfcHk3IiwKLQotCi0JInVhcnQyX3J4ZF9wYzMiLAotCSJ1YXJ0Ml90eGRfcGMyIiwKLQkidWFydDJfcnRzX25fcGo2IiwKLQkidWFydDJfY3RzX25fcGo1IiwKLQotCSJwdTAiLAotCSJwdTEiLAotCSJwdTIiLAotCSJwdTMiLAotCSJwdTQiLAotCSJwdTUiLAotCSJwdTYiLAotCi0JImtiX3JvdzdfcHI3IiwKLQkia2Jfcm93OF9wczAiLAotCSJrYl9yb3c5X3BzMSIsCi0JImtiX3JvdzEwX3BzMiIsCi0JImtiX2NvbDNfcHEzIiwKLQkia2JfY29sNF9wcTQiLAotCi0JInNkbW1jM19jbWRfcGE3IiwKLQkic2RtbWMzX2RhdDFfcGI2IiwKLQkic2RtbWMxX3dwX25fcHYzIiwKLQotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0Yl9ncm91cHNbXSA9IHsKLQkidWFydDJfcnRzX25fcGo2IiwKLQkidWFydDJfY3RzX25fcGo1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGNfZ3JvdXBzW10gPSB7Ci0JInVhcnQzX3R4ZF9wdzYiLAotCSJ1YXJ0M19yeGRfcHc3IiwKLQkidWFydDNfY3RzX25fcGExIiwKLQkidWFydDNfcnRzX25fcGMwIiwKLQkia2Jfcm93MTZfcHQwIiwKLQkia25fcm93MTdfcHQxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGRfZ3JvdXBzW10gPSB7Ci0JInVscGlfY2xrX3B5MCIsCi0JInVscGlfZGlyX3B5MSIsCi0JInVscGlfbnh0X3B5MiIsCi0JInVscGlfc3RwX3B5MyIsCi0JInBqNyIsCi0JInBiMCIsCi0JInBiMSIsCi0JInBrNyIsCi0JImtiX2NvbDZfcHE2IiwKLQkia2JfY29sN19wcTciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1bHBpX2dyb3Vwc1tdID0gewotCSJ1bHBpX2RhdGEwX3BvMSIsCi0JInVscGlfZGF0YTFfcG8yIiwKLQkidWxwaV9kYXRhMl9wbzMiLAotCSJ1bHBpX2RhdGEzX3BvNCIsCi0JInVscGlfZGF0YTRfcG81IiwKLQkidWxwaV9kYXRhNV9wbzYiLAotCSJ1bHBpX2RhdGE2X3BvNyIsCi0JInVscGlfZGF0YTdfcG8wIiwKLQkidWxwaV9jbGtfcHkwIiwKLQkidWxwaV9kaXJfcHkxIiwKLQkidWxwaV9ueHRfcHkyIiwKLQkidWxwaV9zdHBfcHkzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdXNiX2dyb3Vwc1tdID0gewotCSJwajAiLAotCSJ1c2JfdmJ1c19lbjBfcG40IiwKLQkidXNiX3ZidXNfZW4xX3BuNSIsCi0JInVzYl92YnVzX2VuMl9wZmYxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmdwMV9ncm91cHNbXSA9IHsKLQkiY2FtX2kyY19zY2xfcGJiMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZncDJfZ3JvdXBzW10gPSB7Ci0JImNhbV9pMmNfc2RhX3BiYjIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2Z3AzX2dyb3Vwc1tdID0gewotCSJwYmIzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmdwNF9ncm91cHNbXSA9IHsKLQkicGJiNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZncDVfZ3JvdXBzW10gPSB7Ci0JInBiYjUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2Z3A2X2dyb3Vwc1tdID0gewotCSJwYmIwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmlfZ3JvdXBzW10gPSB7Ci0JImNhbV9tY2xrX3BjYzAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aV9hbHQxX2dyb3Vwc1tdID0gewotCSJjYW1fbWNsa19wY2MwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmlfYWx0M19ncm91cHNbXSA9IHsKLQkiY2FtX21jbGtfcGNjMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZpbWNsazJfZ3JvdXBzW10gPSB7Ci0JInBiYjAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aW1jbGsyX2FsdF9ncm91cHNbXSA9IHsKLQkicGJiMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNhdGFfZ3JvdXBzW10gPSB7Ci0JImRhcF9tY2xrMV9yZXFfcGVlMiIsCi0JImRhcDFfZG91dF9wbjIiLAotCSJwZmYyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2NsYV9ncm91cHNbXSA9IHsKLQkicGszIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnRja19ncm91cHNbXSA9IHsKLQkianRhZ19ydGNrIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3lzX2dyb3Vwc1tdID0gewotCSJrYl9yb3czX3ByMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBlMF9ncm91cHNbXSA9IHsKLQkicGV4X2wwX3JzdF9uX3BkZDEiLAotCSJwZXhfbDBfY2xrcmVxX25fcGRkMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBlX2dyb3Vwc1tdID0gewotCSJwZXhfd2FrZV9uX3BkZDMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwZTFfZ3JvdXBzW10gPSB7Ci0JInBleF9sMV9yc3Rfbl9wZGQ1IiwKLQkicGV4X2wxX2Nsa3JlcV9uX3BkZDYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkcF9ncm91cHNbXSA9IHsKLQkiZHBfaHBkX3BmZjAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjbGtfZ3JvdXBzW10gPSB7Ci0JImNsa18zMmtfaW4iLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0bWRzX2dyb3Vwc1tdID0gewotCSJwZzQiLAotCSJwaDEiLAotCSJwaDIiLAogfTsKIAogI2RlZmluZSBGVU5DVElPTihmbmFtZSkJCQkJCVwKIAl7CQkJCQkJXAogCQkubmFtZSA9ICNmbmFtZSwJCQkJXAotCQkuZ3JvdXBzID0gZm5hbWUjI19ncm91cHMsCQlcCi0JCS5uZ3JvdXBzID0gQVJSQVlfU0laRShmbmFtZSMjX2dyb3VwcyksCVwKIAl9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGVncmFfZnVuY3Rpb24gdGVncmExMjRfZnVuY3Rpb25zW10gPSB7CitzdGF0aWMgc3RydWN0IHRlZ3JhX2Z1bmN0aW9uIHRlZ3JhMTI0X2Z1bmN0aW9uc1tdID0gewogCUZVTkNUSU9OKGJsaW5rKSwKKwlGVU5DVElPTihjY2xhKSwKIAlGVU5DVElPTihjZWMpLAogCUZVTkNUSU9OKGNsZHZmcyksCisJRlVOQ1RJT04oY2xrKSwKIAlGVU5DVElPTihjbGsxMiksCiAJRlVOQ1RJT04oY3B1KSwKIAlGVU5DVElPTihkYXApLApAQCAtMjcwNiw2ICsxNjAyLDcgQEAKIAlGVU5DVElPTihkaXNwbGF5YSksCiAJRlVOQ1RJT04oZGlzcGxheWFfYWx0KSwKIAlGVU5DVElPTihkaXNwbGF5YiksCisJRlVOQ1RJT04oZHApLAogCUZVTkNUSU9OKGR0diksCiAJRlVOQ1RJT04oZXh0cGVyaXBoMSksCiAJRlVOQ1RJT04oZXh0cGVyaXBoMiksCkBAIC0yNzI3LDYgKzE2MjQsOSBAQAogCUZVTkNUSU9OKGlyZGEpLAogCUZVTkNUSU9OKGtiYyksCiAJRlVOQ1RJT04ob3dyKSwKKwlGVU5DVElPTihwZSksCisJRlVOQ1RJT04ocGUwKSwKKwlGVU5DVElPTihwZTEpLAogCUZVTkNUSU9OKHBtaSksCiAJRlVOQ1RJT04ocHdtMCksCiAJRlVOQ1RJT04ocHdtMSksCkBAIC0yNzM4LDYgKzE2MzgsOCBAQAogCUZVTkNUSU9OKHJzdmQyKSwKIAlGVU5DVElPTihyc3ZkMyksCiAJRlVOQ1RJT04ocnN2ZDQpLAorCUZVTkNUSU9OKHJ0Y2spLAorCUZVTkNUSU9OKHNhdGEpLAogCUZVTkNUSU9OKHNkbW1jMSksCiAJRlVOQ1RJT04oc2RtbWMyKSwKIAlGVU5DVElPTihzZG1tYzMpLApAQCAtMjc1MCw2ICsxNjUyLDggQEAKIAlGVU5DVElPTihzcGk0KSwKIAlGVU5DVElPTihzcGk1KSwKIAlGVU5DVElPTihzcGk2KSwKKwlGVU5DVElPTihzeXMpLAorCUZVTkNUSU9OKHRtZHMpLAogCUZVTkNUSU9OKHRyYWNlKSwKIAlGVU5DVElPTih1YXJ0YSksCiAJRlVOQ1RJT04odWFydGIpLApAQCAtMjc2OCwyMyArMTY3MiwxMyBAQAogCUZVTkNUSU9OKHZpX2FsdDMpLAogCUZVTkNUSU9OKHZpbWNsazIpLAogCUZVTkNUSU9OKHZpbWNsazJfYWx0KSwKLQlGVU5DVElPTihzYXRhKSwKLQlGVU5DVElPTihjY2xhKSwKLQlGVU5DVElPTihwZTApLAotCUZVTkNUSU9OKHBlKSwKLQlGVU5DVElPTihwZTEpLAotCUZVTkNUSU9OKGRwKSwKLQlGVU5DVElPTihydGNrKSwKLQlGVU5DVElPTihzeXMpLAotCUZVTkNUSU9OKGNsayksCi0JRlVOQ1RJT04odG1kcyksCiB9OwogCi0jZGVmaW5lIERSVl9QSU5HUk9VUF9SRUdfQQkweDg2OAkvKiBiYW5rIDAgKi8KLSNkZWZpbmUgUElOR1JPVVBfUkVHX0EJCTB4MzAwMAkvKiBiYW5rIDEgKi8KKyNkZWZpbmUgRFJWX1BJTkdST1VQX1JFR19BCQkweDg2OAkvKiBiYW5rIDAgKi8KKyNkZWZpbmUgUElOR1JPVVBfUkVHX0EJCQkweDMwMDAJLyogYmFuayAxICovCiAKLSNkZWZpbmUgUElOR1JPVVBfUkVHX1kocikJKChyKSAtIFBJTkdST1VQX1JFR19BKQotI2RlZmluZSBQSU5HUk9VUF9SRUdfTihyKQktMQorI2RlZmluZSBQSU5HUk9VUF9SRUdfWShyKQkJKChyKSAtIFBJTkdST1VQX1JFR19BKQorI2RlZmluZSBQSU5HUk9VUF9SRUdfTihyKQkJLTEKIAogI2RlZmluZSBQSU5HUk9VUChwZ19uYW1lLCBmMCwgZjEsIGYyLCBmMywgZl9zYWZlLCByLCBvZCwgaW9yLCByY3Zfc2VsKQlcCiAJewkJCQkJCQkJXApAQCAtMjc5MiwxMiArMTY4NiwxMiBAQAogCQkucGlucyA9IHBnX25hbWUjI19waW5zLAkJCQkJXAogCQkubnBpbnMgPSBBUlJBWV9TSVpFKHBnX25hbWUjI19waW5zKSwJCQlcCiAJCS5mdW5jcyA9IHsJCQkJCQlcCi0JCQlURUdSQV9NVVhfICMjIGYwLAkJCQlcCi0JCQlURUdSQV9NVVhfICMjIGYxLAkJCQlcCi0JCQlURUdSQV9NVVhfICMjIGYyLAkJCQlcCi0JCQlURUdSQV9NVVhfICMjIGYzLAkJCQlcCisJCQlURUdSQV9NVVhfIyNmMCwJCQkJCVwKKwkJCVRFR1JBX01VWF8jI2YxLAkJCQkJXAorCQkJVEVHUkFfTVVYXyMjZjIsCQkJCQlcCisJCQlURUdSQV9NVVhfIyNmMywJCQkJCVwKIAkJfSwJCQkJCQkJXAotCQkuZnVuY19zYWZlID0gVEVHUkFfTVVYXyAjIyBmX3NhZmUsCQkJXAorCQkuZnVuY19zYWZlID0gVEVHUkFfTVVYXyMjZl9zYWZlLAkJCVwKIAkJLm11eF9yZWcgPSBQSU5HUk9VUF9SRUdfWShyKSwJCQkJXAogCQkubXV4X2JhbmsgPSAxLAkJCQkJCVwKIAkJLm11eF9iaXQgPSAwLAkJCQkJCVwKQEAgLTI4MjYsOCArMTcyMCw5IEBACiAJCS5kcnZ0eXBlX3JlZyA9IC0xLAkJCQkJXAogCX0KIAotI2RlZmluZSBEUlZfUElOR1JPVVBfRFZSVFlQRV9ZKHIpICgocikgLSBEUlZfUElOR1JPVVBfUkVHX0EpCi0jZGVmaW5lIERSVl9QSU5HUk9VUF9EVlJUWVBFX04ocikgLTEKKyNkZWZpbmUgRFJWX1BJTkdST1VQX1JFR19ZKHIpCQkoKHIpIC0gRFJWX1BJTkdST1VQX1JFR19BKQorI2RlZmluZSBEUlZfUElOR1JPVVBfUkVHX04ocikJCS0xCisKIAogI2RlZmluZSBEUlZfUElOR1JPVVAocGdfbmFtZSwgciwgaHNtX2IsIHNjaG1pdHRfYiwgbHBtZF9iLAkJXAogCQkgICAgIGRydmRuX2IsIGRydmRuX3csIGRydnVwX2IsIGRydnVwX3csCQlcCkBAIC0yODQ1LDcgKzE3NDAsNyBAQAogCQkubG9ja19yZWcgPSAtMSwJCQkJCQlcCiAJCS5pb3Jlc2V0X3JlZyA9IC0xLAkJCQkJXAogCQkucmN2X3NlbF9yZWcgPSAtMSwJCQkJCVwKLQkJLmRydl9yZWcgPSBEUlZfUElOR1JPVVBfRFZSVFlQRV9ZKHIpLAkJCVwKKwkJLmRydl9yZWcgPSBEUlZfUElOR1JPVVBfUkVHX1kociksCQkJXAogCQkuZHJ2X2JhbmsgPSAwLAkJCQkJCVwKIAkJLmhzbV9iaXQgPSBoc21fYiwJCQkJCVwKIAkJLnNjaG1pdHRfYml0ID0gc2NobWl0dF9iLAkJCQlcCkBAIC0yODU4LDcgKzE3NTMsNyBAQAogCQkuc2x3cl93aWR0aCA9IHNsd3JfdywJCQkJCVwKIAkJLnNsd2ZfYml0ID0gc2x3Zl9iLAkJCQkJXAogCQkuc2x3Zl93aWR0aCA9IHNsd2ZfdywJCQkJCVwKLQkJLmRydnR5cGVfcmVnID0gRFJWX1BJTkdST1VQX0RWUlRZUEVfIyNkcnZ0eXBlKHIpLAlcCisJCS5kcnZ0eXBlX3JlZyA9IERSVl9QSU5HUk9VUF9SRUdfIyNkcnZ0eXBlKHIpLAkJXAogCQkuZHJ2dHlwZV9iYW5rID0gMCwJCQkJCVwKIAkJLmRydnR5cGVfYml0ID0gNiwJCQkJCVwKIAl9CkBAIC0yOTA5LDggKzE4MDQsOCBAQAogICAgICAgIFBJTkdST1VQKHB1NCwgICAgICAgICAgICAgICAgICAgIFBXTTEsICAgICAgIFVBUlRBLCAgICAgIEdNSSwgICAgICAgICAgRElTUExBWUIsICAgIFBXTTEsICAgICAgIDB4MzE5NCwgIE4sICBOLCAgTiksCiAgICAgICAgUElOR1JPVVAocHU1LCAgICAgICAgICAgICAgICAgICAgUFdNMiwgICAgICAgVUFSVEEsICAgICAgR01JLCAgICAgICAgICBESVNQTEFZQiwgICAgUFdNMiwgICAgICAgMHgzMTk4LCAgTiwgIE4sICBOKSwKICAgICAgICBQSU5HUk9VUChwdTYsICAgICAgICAgICAgICAgICAgICBQV00zLCAgICAgICBVQVJUQSwgICAgICBSU1ZEMywgICAgICAgIEdNSSwgICAgICAgICBSU1ZEMywgICAgICAweDMxOWMsICBOLCAgTiwgIE4pLAotICAgICAgIFBJTkdST1VQKGdlbjFfaTJjX3NjbF9wYzQsICAgICAgIEkyQzEsICAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIEkyQzEsICAgICAgIDB4MzFhMCwgIFksICBOLCAgTiksCi0gICAgICAgUElOR1JPVVAoZ2VuMV9pMmNfc2RhX3BjNSwgICAgICAgSTJDMSwgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgSTJDMSwgICAgICAgMHgzMWE0LCAgWSwgIE4sICBOKSwKKyAgICAgICBQSU5HUk9VUChnZW4xX2kyY19zZGFfcGM1LCAgICAgICBJMkMxLCAgICAgICBSU1ZEMiwgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICBJMkMxLCAgICAgICAweDMxYTAsICBZLCAgTiwgIE4pLAorICAgICAgIFBJTkdST1VQKGdlbjFfaTJjX3NjbF9wYzQsICAgICAgIEkyQzEsICAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIEkyQzEsICAgICAgIDB4MzFhNCwgIFksICBOLCAgTiksCiAgICAgICAgUElOR1JPVVAoZGFwNF9mc19wcDQsICAgICAgICAgICAgSTJTMywgICAgICAgR01JLCAgICAgICAgRFRWLCAgICAgICAgICBSU1ZENCwgICAgICAgSTJTMywgICAgICAgMHgzMWE4LCAgTiwgIE4sICBOKSwKICAgICAgICBQSU5HUk9VUChkYXA0X2Rpbl9wcDUsICAgICAgICAgICBJMlMzLCAgICAgICBHTUksICAgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICBJMlMzLCAgICAgICAweDMxYWMsICBOLCAgTiwgIE4pLAogICAgICAgIFBJTkdST1VQKGRhcDRfZG91dF9wcDYsICAgICAgICAgIEkyUzMsICAgICAgIEdNSSwgICAgICAgIERUViwgICAgICAgICAgUlNWRDQsICAgICAgIEkyUzMsICAgICAgIDB4MzFiMCwgIE4sICBOLCAgTiksCkBAIC0yOTY0LDkgKzE4NTksOSBAQAogICAgICAgIFBJTkdST1VQKHNkbW1jNF9kYXQ0X3BhYTQsICAgICAgIFNETU1DNCwgICAgIFNQSTMsICAgICAgIEdNSSwgICAgICAgICAgUlNWRDQsICAgICAgIFNETU1DNCwgICAgIDB4MzI3MCwgIE4sICBZLCAgTiksCiAgICAgICAgUElOR1JPVVAoc2RtbWM0X2RhdDVfcGFhNSwgICAgICAgU0RNTUM0LCAgICAgU1BJMywgICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgU0RNTUM0LCAgICAgMHgzMjc0LCAgTiwgIFksICBOKSwKICAgICAgICBQSU5HUk9VUChzZG1tYzRfZGF0Nl9wYWE2LCAgICAgICBTRE1NQzQsICAgICBTUEkzLCAgICAgICBHTUksICAgICAgICAgIFJTVkQ0LCAgICAgICBTRE1NQzQsICAgICAweDMyNzgsICBOLCAgWSwgIE4pLAotICAgICAgIFBJTkdST1VQKHNkbW1jNF9kYXQ3X3BhYTcsICAgICAgIFNETU1DNCwgICAgIFJTVkQxLCAgICAgIEdNSSwgICAgICAgICAgUlNWRDQsICAgICAgIFNETU1DNCwgICAgIDB4MzI3YywgIE4sICBZLCAgTiksCisgICAgICAgUElOR1JPVVAoc2RtbWM0X2RhdDdfcGFhNywgICAgICAgU0RNTUM0LCAgICAgUlNWRDIsICAgICAgR01JLCAgICAgICAgICBSU1ZENCwgICAgICAgU0RNTUM0LCAgICAgMHgzMjdjLCAgTiwgIFksICBOKSwKICAgICAgICBQSU5HUk9VUChjYW1fbWNsa19wY2MwLCAgICAgICAgICBWSSwgICAgICAgICBWSV9BTFQxLCAgICBWSV9BTFQzLCAgICAgIFNETU1DMiwgICAgICBWSSwgICAgICAgICAweDMyODQsICBOLCAgTiwgIE4pLAotICAgICAgIFBJTkdST1VQKHBjYzEsICAgICAgICAgICAgICAgICAgIEkyUzQsICAgICAgIFJTVkQxLCAgICAgIFJTVkQzLCAgICAgICAgU0RNTUMyLCAgICAgIEkyUzQsICAgICAgIDB4MzI4OCwgIE4sICBOLCAgTiksCisgICAgICAgUElOR1JPVVAocGNjMSwgICAgICAgICAgICAgICAgICAgSTJTNCwgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBTRE1NQzIsICAgICAgSTJTNCwgICAgICAgMHgzMjg4LCAgTiwgIE4sICBOKSwKICAgICAgICBQSU5HUk9VUChwYmIwLCAgICAgICAgICAgICAgICAgICBWR1A2LCAgICAgICBWSU1DTEsyLCAgICBTRE1NQzIsICAgICAgIFZJTUNMSzJfQUxULCBWR1A2LCAgICAgICAweDMyOGMsICBOLCAgTiwgIE4pLAogICAgICAgIFBJTkdST1VQKGNhbV9pMmNfc2NsX3BiYjEsICAgICAgIFZHUDEsICAgICAgIEkyQzMsICAgICAgIFJTVkQzLCAgICAgICAgU0RNTUMyLCAgICAgIFZHUDEsICAgICAgIDB4MzI5MCwgIFksICBOLCAgTiksCiAgICAgICAgUElOR1JPVVAoY2FtX2kyY19zZGFfcGJiMiwgICAgICAgVkdQMiwgICAgICAgSTJDMywgICAgICAgUlNWRDMsICAgICAgICBTRE1NQzIsICAgICAgVkdQMiwgICAgICAgMHgzMjk0LCAgWSwgIE4sICBOKSwKQEAgLTMwNDcsOCArMTk0Miw4IEBACiAgICAgICAgUElOR1JPVVAoZ3Bpb193M19hdWRfcHczLCAgICAgICAgU1BJNiwgICAgICAgU1BJMSwgICAgICAgU1BJMiwgICAgICAgICBJMkMxLCAgICAgICAgU1BJMSwgICAgICAgMHgzM2YwLCAgTiwgIE4sICBOKSwKICAgICAgICBQSU5HUk9VUCh1c2JfdmJ1c19lbjBfcG40LCAgICAgICBVU0IsICAgICAgICBSU1ZEMiwgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICBVU0IsICAgICAgICAweDMzZjQsICBZLCAgTiwgIE4pLAogICAgICAgIFBJTkdST1VQKHVzYl92YnVzX2VuMV9wbjUsICAgICAgIFVTQiwgICAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFVTQiwgICAgICAgIDB4MzNmOCwgIFksICBOLCAgTiksCi0gICAgICAgUElOR1JPVVAoc2RtbWMzX2Nsa19sYl9vdXRfcGVlNCwgU0RNTUMzLCAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgU0RNTUMzLCAgICAgMHgzM2ZjLCAgTiwgIE4sICBOKSwKLSAgICAgICBQSU5HUk9VUChzZG1tYzNfY2xrX2xiX2luX3BlZTUsICBTRE1NQzMsICAgICBSU1ZEMiwgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICBTRE1NQzMsICAgICAweDM0MDAsICBOLCAgTiwgIE4pLAorICAgICAgIFBJTkdST1VQKHNkbW1jM19jbGtfbGJfaW5fcGVlNSwgIFNETU1DMywgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFNETU1DMywgICAgIDB4MzNmYywgIE4sICBOLCAgTiksCisgICAgICAgUElOR1JPVVAoc2RtbWMzX2Nsa19sYl9vdXRfcGVlNCwgU0RNTUMzLCAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgU0RNTUMzLCAgICAgMHgzNDAwLCAgTiwgIE4sICBOKSwKICAgICAgICBQSU5HUk9VUChnbWlfY2xrX2xiLCAgICAgICAgICAgICBTRE1NQzIsICAgICBSU1ZEMiwgICAgICBHTUksICAgICAgICAgIFJTVkQ0LCAgICAgICBTRE1NQzIsICAgICAweDM0MDQsICBOLCAgTiwgIE4pLAogICAgICAgIFBJTkdST1VQKHJlc2V0X291dF9uLCAgICAgICAgICAgIFJTVkQxLCAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUkVTRVRfT1VUX04sIFJTVkQxLCAgICAgIDB4MzQwOCwgIE4sICBOLCAgTiksCiAgICAgICAgUElOR1JPVVAoa2Jfcm93MTZfcHQwLCAgICAgICAgICAgS0JDLCAgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBVQVJUQywgICAgICAgS0JDLCAgICAgICAgMHgzNDBjLCAgTiwgIE4sICBOKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMjAuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMjAuYwppbmRleCBmY2ZiN2QwLi5lMGI1MDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTIwLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEyMC5jCkBAIC0xODk0LDYzNyArMTg5NCwxMiBAQAogCVRFR1JBX01VWF9YSU8sCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFoYl9jbGtfZ3JvdXBzW10gPSB7Ci0JImNkZXYyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXBiX2Nsa19ncm91cHNbXSA9IHsKLQkiY2RldjIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdWRpb19zeW5jX2dyb3Vwc1tdID0gewotCSJjZGV2MSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNydF9ncm91cHNbXSA9IHsKLQkiY3J0cCIsCi0JImxtMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhcDFfZ3JvdXBzW10gPSB7Ci0JImRhcDEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYXAyX2dyb3Vwc1tdID0gewotCSJkYXAyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFwM19ncm91cHNbXSA9IHsKLQkiZGFwMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhcDRfZ3JvdXBzW10gPSB7Ci0JImRhcDQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYXA1X2dyb3Vwc1tdID0gewotCSJnbWUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkaXNwbGF5YV9ncm91cHNbXSA9IHsKLQkibGNzbiIsCi0JImxkMCIsCi0JImxkMSIsCi0JImxkMTAiLAotCSJsZDExIiwKLQkibGQxMiIsCi0JImxkMTMiLAotCSJsZDE0IiwKLQkibGQxNSIsCi0JImxkMTYiLAotCSJsZDE3IiwKLQkibGQyIiwKLQkibGQzIiwKLQkibGQ0IiwKLQkibGQ1IiwKLQkibGQ2IiwKLQkibGQ3IiwKLQkibGQ4IiwKLQkibGQ5IiwKLQkibGRjIiwKLQkibGRpIiwKLQkibGhwMCIsCi0JImxocDEiLAotCSJsaHAyIiwKLQkibGhzIiwKLQkibG0wIiwKLQkibG0xIiwKLQkibHBwIiwKLQkibHB3MCIsCi0JImxwdzEiLAotCSJscHcyIiwKLQkibHNjMCIsCi0JImxzYzEiLAotCSJsc2NrIiwKLQkibHNkYSIsCi0JImxzZGkiLAotCSJsc3BpIiwKLQkibHZwMCIsCi0JImx2cDEiLAotCSJsdnMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkaXNwbGF5Yl9ncm91cHNbXSA9IHsKLQkibGNzbiIsCi0JImxkMCIsCi0JImxkMSIsCi0JImxkMTAiLAotCSJsZDExIiwKLQkibGQxMiIsCi0JImxkMTMiLAotCSJsZDE0IiwKLQkibGQxNSIsCi0JImxkMTYiLAotCSJsZDE3IiwKLQkibGQyIiwKLQkibGQzIiwKLQkibGQ0IiwKLQkibGQ1IiwKLQkibGQ2IiwKLQkibGQ3IiwKLQkibGQ4IiwKLQkibGQ5IiwKLQkibGRjIiwKLQkibGRpIiwKLQkibGhwMCIsCi0JImxocDEiLAotCSJsaHAyIiwKLQkibGhzIiwKLQkibG0wIiwKLQkibG0xIiwKLQkibHBwIiwKLQkibHB3MCIsCi0JImxwdzEiLAotCSJscHcyIiwKLQkibHNjMCIsCi0JImxzYzEiLAotCSJsc2NrIiwKLQkibHNkYSIsCi0JImxzZGkiLAotCSJsc3BpIiwKLQkibHZwMCIsCi0JImx2cDEiLAotCSJsdnMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBlbWNfdGVzdDBfZGxsX2dyb3Vwc1tdID0gewotCSJrYmNhIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZW1jX3Rlc3QxX2RsbF9ncm91cHNbXSA9IHsKLQkia2JjYyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdtaV9ncm91cHNbXSA9IHsKLQkiYXRhIiwKLQkiYXRiIiwKLQkiYXRjIiwKLQkiYXRkIiwKLQkiYXRlIiwKLQkiZGFwMSIsCi0JImRhcDIiLAotCSJkYXA0IiwKLQkiZ21hIiwKLQkiZ21iIiwKLQkiZ21jIiwKLQkiZ21kIiwKLQkiZ21lIiwKLQkiZ3B1IiwKLQkiaXJyeCIsCi0JImlydHgiLAotCSJwdGEiLAotCSJzcGlhIiwKLQkic3BpYiIsCi0JInNwaWMiLAotCSJzcGlkIiwKLQkic3BpZSIsCi0JInVjYSIsCi0JInVjYiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdtaV9pbnRfZ3JvdXBzW10gPSB7Ci0JImdtYiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGhkbWlfZ3JvdXBzW10gPSB7Ci0JImhkaW50IiwKLQkibHB3MCIsCi0JImxwdzIiLAotCSJsc2MxIiwKLQkibHNjayIsCi0JImxzZGEiLAotCSJsc3BpIiwKLQkicHRhIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjcF9ncm91cHNbXSA9IHsKLQkiaTJjcCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyYzFfZ3JvdXBzW10gPSB7Ci0JInJtIiwKLQkic3BkaSIsCi0JInNwZG8iLAotCSJzcGlnIiwKLQkic3BpaCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyYzJfZ3JvdXBzW10gPSB7Ci0JImRkYyIsCi0JInB0YSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyYzNfZ3JvdXBzW10gPSB7Ci0JImR0ZiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlkZV9ncm91cHNbXSA9IHsKLQkiYXRhIiwKLQkiYXRiIiwKLQkiYXRjIiwKLQkiYXRkIiwKLQkiYXRlIiwKLQkiZ21iIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaXJkYV9ncm91cHNbXSA9IHsKLQkidWFkIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2JjX2dyb3Vwc1tdID0gewotCSJrYmNhIiwKLQkia2JjYiIsCi0JImtiY2MiLAotCSJrYmNkIiwKLQkia2JjZSIsCi0JImtiY2YiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtaW9fZ3JvdXBzW10gPSB7Ci0JImtiY2IiLAotCSJrYmNkIiwKLQkia2JjZiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1pcGlfaHNfZ3JvdXBzW10gPSB7Ci0JInVhYSIsCi0JInVhYiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbmRfZ3JvdXBzW10gPSB7Ci0JImF0YSIsCi0JImF0YiIsCi0JImF0YyIsCi0JImF0ZCIsCi0JImF0ZSIsCi0JImdtYiIsCi0JImdtZCIsCi0JImtiY2EiLAotCSJrYmNiIiwKLQkia2JjYyIsCi0JImtiY2QiLAotCSJrYmNlIiwKLQkia2JjZiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG9zY19ncm91cHNbXSA9IHsKLQkiY2RldjEiLAotCSJjZGV2MiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG93cl9ncm91cHNbXSA9IHsKLQkia2JjZSIsCi0JIm93YyIsCi0JInVhYyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBjaWVfZ3JvdXBzW10gPSB7Ci0JImdwdiIsCi0JInNseGEiLAotCSJzbHhrIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGxsYV9vdXRfZ3JvdXBzW10gPSB7Ci0JImNkZXYxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGxsY19vdXQxX2dyb3Vwc1tdID0gewotCSJjc3VzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGxsbV9vdXQxX2dyb3Vwc1tdID0gewotCSJjZGV2MSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBsbHBfb3V0Ml9ncm91cHNbXSA9IHsKLQkiY3N1cyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBsbHBfb3V0M19ncm91cHNbXSA9IHsKLQkiY3N1cyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBsbHBfb3V0NF9ncm91cHNbXSA9IHsKLQkiY2RldjIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd21fZ3JvdXBzW10gPSB7Ci0JImdwdSIsCi0JInNkYiIsCi0JInNkYyIsCi0JInNkZCIsCi0JInVjYiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3cl9pbnRyX2dyb3Vwc1tdID0gewotCSJwbWMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd3Jfb25fZ3JvdXBzW10gPSB7Ci0JInBtYyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQxX2dyb3Vwc1tdID0gewotCSJkdGEiLAotCSJkdGIiLAotCSJkdGMiLAotCSJkdGQiLAotCSJkdGUiLAotCSJnbWQiLAotCSJnbWUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByc3ZkMl9ncm91cHNbXSA9IHsKLQkiY3J0cCIsCi0JImRhcDEiLAotCSJkYXAzIiwKLQkiZGFwNCIsCi0JImRkYyIsCi0JImR0YiIsCi0JImR0YyIsCi0JImR0ZSIsCi0JImR0ZiIsCi0JImdwdTciLAotCSJncHYiLAotCSJoZGludCIsCi0JImkyY3AiLAotCSJvd2MiLAotCSJybSIsCi0JInNkaW8xIiwKLQkic3BkaSIsCi0JInNwZG8iLAotCSJ1YWMiLAotCSJ1Y2EiLAotCSJ1ZGEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByc3ZkM19ncm91cHNbXSA9IHsKLQkiY3J0cCIsCi0JImRhcDIiLAotCSJkYXAzIiwKLQkiZGRjIiwKLQkiZ3B1NyIsCi0JImdwdiIsCi0JImhkaW50IiwKLQkiaTJjcCIsCi0JImxkMTciLAotCSJsZGMiLAotCSJsZGkiLAotCSJsaHAwIiwKLQkibGhwMSIsCi0JImxocDIiLAotCSJsbTEiLAotCSJscHAiLAotCSJscHcxIiwKLQkibHZwMCIsCi0JImx2cDEiLAotCSJvd2MiLAotCSJwbWMiLAotCSJybSIsCi0JInVhYyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQ0X2dyb3Vwc1tdID0gewotCSJhdGEiLAotCSJhdGUiLAotCSJjcnRwIiwKLQkiZGFwMyIsCi0JImRhcDQiLAotCSJkZGMiLAotCSJkdGEiLAotCSJkdGMiLAotCSJkdGQiLAotCSJkdGYiLAotCSJncHUiLAotCSJncHU3IiwKLQkiZ3B2IiwKLQkiaGRpbnQiLAotCSJpMmNwIiwKLQkia2JjZSIsCi0JImxjc24iLAotCSJsZDAiLAotCSJsZDEiLAotCSJsZDIiLAotCSJsZDMiLAotCSJsZDQiLAotCSJsZDUiLAotCSJsZDYiLAotCSJsZDciLAotCSJsZDgiLAotCSJsZDkiLAotCSJsZDEwIiwKLQkibGQxMSIsCi0JImxkMTIiLAotCSJsZDEzIiwKLQkibGQxNCIsCi0JImxkMTUiLAotCSJsZDE2IiwKLQkibGQxNyIsCi0JImxkYyIsCi0JImxkaSIsCi0JImxocDAiLAotCSJsaHAxIiwKLQkibGhwMiIsCi0JImxocyIsCi0JImxtMCIsCi0JImxwcCIsCi0JImxwdzEiLAotCSJsc2MwIiwKLQkibHNkaSIsCi0JImx2cDAiLAotCSJsdnAxIiwKLQkibHZzIiwKLQkib3djIiwKLQkicG1jIiwKLQkicHRhIiwKLQkicm0iLAotCSJzcGlmIiwKLQkidWFjIiwKLQkidWNhIiwKLQkidWNiIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnRja19ncm91cHNbXSA9IHsKLQkiZ3B1NyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkaW8xX2dyb3Vwc1tdID0gewotCSJzZGlvMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkaW8yX2dyb3Vwc1tdID0gewotCSJkYXAxIiwKLQkiZHRhIiwKLQkiZHRkIiwKLQkia2JjYSIsCi0JImtiY2IiLAotCSJrYmNkIiwKLQkic3BkaSIsCi0JInNwZG8iLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZGlvM19ncm91cHNbXSA9IHsKLQkic2RiIiwKLQkic2RjIiwKLQkic2RkIiwKLQkic2x4YSIsCi0JInNseGMiLAotCSJzbHhkIiwKLQkic2x4ayIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkaW80X2dyb3Vwc1tdID0gewotCSJhdGIiLAotCSJhdGMiLAotCSJhdGQiLAotCSJnbWEiLAotCSJnbWUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZmxhc2hfZ3JvdXBzW10gPSB7Ci0JImdtYyIsCi0JImdtZCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwZGlmX2dyb3Vwc1tdID0gewotCSJzbHhjIiwKLQkic2x4ZCIsCi0JInNwZGkiLAotCSJzcGRvIiwKLQkidWFkIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpMV9ncm91cHNbXSA9IHsKLQkiZHRiIiwKLQkiZHRlIiwKLQkic3BpYSIsCi0JInNwaWIiLAotCSJzcGljIiwKLQkic3BpZCIsCi0JInNwaWUiLAotCSJzcGlmIiwKLQkidWRhIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpMl9ncm91cHNbXSA9IHsKLQkic2RiIiwKLQkic2x4YSIsCi0JInNseGMiLAotCSJzbHhkIiwKLQkic2x4ayIsCi0JInNwaWEiLAotCSJzcGliIiwKLQkic3BpYyIsCi0JInNwaWQiLAotCSJzcGllIiwKLQkic3BpZiIsCi0JInNwaWciLAotCSJzcGloIiwKLQkidWFiIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpMl9hbHRfZ3JvdXBzW10gPSB7Ci0JInNwaWQiLAotCSJzcGllIiwKLQkic3BpZyIsCi0JInNwaWgiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkzX2dyb3Vwc1tdID0gewotCSJnbWEiLAotCSJsY3NuIiwKLQkibG0wIiwKLQkibHB3MCIsCi0JImxwdzIiLAotCSJsc2MxIiwKLQkibHNjayIsCi0JImxzZGEiLAotCSJsc2RpIiwKLQkic2RjIiwKLQkic2RkIiwKLQkic3BpYSIsCi0JInNwaWIiLAotCSJzcGljIiwKLQkic3BpZiIsCi0JInNwaWciLAotCSJzcGloIiwKLQkidWFhIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpNF9ncm91cHNbXSA9IHsKLQkiZ21jIiwKLQkiaXJyeCIsCi0JImlydHgiLAotCSJzbHhhIiwKLQkic2x4YyIsCi0JInNseGQiLAotCSJzbHhrIiwKLQkidWFkIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHJhY2VfZ3JvdXBzW10gPSB7Ci0JImtiY2MiLAotCSJrYmNmIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHdjX2dyb3Vwc1tdID0gewotCSJkYXAyIiwKLQkic2RjIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGFfZ3JvdXBzW10gPSB7Ci0JImdwdSIsCi0JImlycngiLAotCSJpcnR4IiwKLQkic2RiIiwKLQkic2RkIiwKLQkic2RpbzEiLAotCSJ1YWEiLAotCSJ1YWIiLAotCSJ1YWQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0Yl9ncm91cHNbXSA9IHsKLQkiaXJyeCIsCi0JImlydHgiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0Y19ncm91cHNbXSA9IHsKLQkidWNhIiwKLQkidWNiIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGRfZ3JvdXBzW10gPSB7Ci0JImdtYyIsCi0JInVkYSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnRlX2dyb3Vwc1tdID0gewotCSJnbWEiLAotCSJzZGlvMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVscGlfZ3JvdXBzW10gPSB7Ci0JInVhYSIsCi0JInVhYiIsCi0JInVkYSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZpX2dyb3Vwc1tdID0gewotCSJkdGEiLAotCSJkdGIiLAotCSJkdGMiLAotCSJkdGQiLAotCSJkdGUiLAotCSJkdGYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aV9zZW5zb3JfY2xrX2dyb3Vwc1tdID0gewotCSJjc3VzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgeGlvX2dyb3Vwc1tdID0gewotCSJsZDAiLAotCSJsZDEiLAotCSJsZDEwIiwKLQkibGQxMSIsCi0JImxkMTIiLAotCSJsZDEzIiwKLQkibGQxNCIsCi0JImxkMTUiLAotCSJsZDE2IiwKLQkibGQyIiwKLQkibGQzIiwKLQkibGQ0IiwKLQkibGQ1IiwKLQkibGQ2IiwKLQkibGQ3IiwKLQkibGQ4IiwKLQkibGQ5IiwKLQkibGhzIiwKLQkibHNjMCIsCi0JImxzcGkiLAotCSJsdnMiLAotfTsKLQogI2RlZmluZSBGVU5DVElPTihmbmFtZSkJCQkJCVwKIAl7CQkJCQkJXAogCQkubmFtZSA9ICNmbmFtZSwJCQkJXAotCQkuZ3JvdXBzID0gZm5hbWUjI19ncm91cHMsCQlcCi0JCS5uZ3JvdXBzID0gQVJSQVlfU0laRShmbmFtZSMjX2dyb3VwcyksCVwKIAl9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGVncmFfZnVuY3Rpb24gdGVncmEyMF9mdW5jdGlvbnNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdGVncmFfZnVuY3Rpb24gdGVncmEyMF9mdW5jdGlvbnNbXSA9IHsKIAlGVU5DVElPTihhaGJfY2xrKSwKIAlGVU5DVElPTihhcGJfY2xrKSwKIAlGVU5DVElPTihhdWRpb19zeW5jKSwKQEAgLTI4ODEsMTggKzIyNTYsNyBAQAogCS5wcm9iZSA9IHRlZ3JhMjBfcGluY3RybF9wcm9iZSwKIAkucmVtb3ZlID0gdGVncmFfcGluY3RybF9yZW1vdmUsCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCB0ZWdyYTIwX3BpbmN0cmxfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRlZ3JhMjBfcGluY3RybF9kcml2ZXIpOwotfQotYXJjaF9pbml0Y2FsbCh0ZWdyYTIwX3BpbmN0cmxfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB0ZWdyYTIwX3BpbmN0cmxfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0ZWdyYTIwX3BpbmN0cmxfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KHRlZ3JhMjBfcGluY3RybF9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodGVncmEyMF9waW5jdHJsX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIlN0ZXBoZW4gV2FycmVuIDxzd2FycmVuQG52aWRpYS5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIk5WSURJQSBUZWdyYTIwIHBpbmN0cmwgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTMwLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTMwLmMKaW5kZXggMjMwMGRlYi4uNDFkMjRmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEzMC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMzAuYwpAQCAtMjUsNyArMjUsNyBAQAogICogTW9zdCBwaW5zIGFmZmVjdGVkIGJ5IHRoZSBwaW5tdXggY2FuIGFsc28gYmUgR1BJT3MuIERlZmluZSB0aGVzZSBmaXJzdC4KICAqIFRoZXNlIG11c3QgbWF0Y2ggaG93IHRoZSBHUElPIGRyaXZlciBuYW1lcy9udW1iZXJzIGl0cyBwaW5zLgogICovCi0jZGVmaW5lIF9HUElPKG9mZnNldCkJCQkJKG9mZnNldCkKKyNkZWZpbmUgX0dQSU8ob2Zmc2V0KQkJCShvZmZzZXQpCiAKICNkZWZpbmUgVEVHUkFfUElOX0NMS18zMktfT1VUX1BBMAlfR1BJTygwKQogI2RlZmluZSBURUdSQV9QSU5fVUFSVDNfQ1RTX05fUEExCV9HUElPKDEpCkBAIC0yNzcsOCArMjc3LDggQEAKICNkZWZpbmUgVEVHUkFfUElOX1BFRTcJCQlfR1BJTygyNDcpCiAKIC8qIEFsbCBub24tR1BJTyBwaW5zIGZvbGxvdyAqLwotI2RlZmluZSBOVU1fR1BJT1MJCQkJKFRFR1JBX1BJTl9QRUU3ICsgMSkKLSNkZWZpbmUgX1BJTihvZmZzZXQpCQkJCShOVU1fR1BJT1MgKyAob2Zmc2V0KSkKKyNkZWZpbmUgTlVNX0dQSU9TCQkJKFRFR1JBX1BJTl9QRUU3ICsgMSkKKyNkZWZpbmUgX1BJTihvZmZzZXQpCQkJKE5VTV9HUElPUyArIChvZmZzZXQpKQogCiAvKiBOb24tR1BJTyBwaW5zICovCiAjZGVmaW5lIFRFR1JBX1BJTl9DTEtfMzJLX0lOCQlfUElOKDApCkBAIC0yMDE1LDEyNTMgKzIwMTUsMTMgQEAKIAlURUdSQV9NVVhfVklfQUxUMiwKIAlURUdSQV9NVVhfVklfQUxUMywKIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsaW5rX2dyb3Vwc1tdID0gewotCSJjbGtfMzJrX291dF9wYTAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZWNfZ3JvdXBzW10gPSB7Ci0JImhkbWlfY2VjX3BlZTMiLAotCSJvd3IiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjbGtfMTJtX291dF9ncm91cHNbXSA9IHsKLQkicHYzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2xrXzMya19pbl9ncm91cHNbXSA9IHsKLQkiY2xrXzMya19pbiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNvcmVfcHdyX3JlcV9ncm91cHNbXSA9IHsKLQkiY29yZV9wd3JfcmVxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3B1X3B3cl9yZXFfZ3JvdXBzW10gPSB7Ci0JImNwdV9wd3JfcmVxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3J0X2dyb3Vwc1tdID0gewotCSJjcnRfaHN5bmNfcHY2IiwKLQkiY3J0X3ZzeW5jX3B2NyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhcF9ncm91cHNbXSA9IHsKLQkiY2xrMV9yZXFfcGVlMiIsCi0JImNsazJfcmVxX3BjYzUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZHJfZ3JvdXBzW10gPSB7Ci0JInZpX2QwX3B0NCIsCi0JInZpX2QxX3BkNSIsCi0JInZpX2QxMF9wdDIiLAotCSJ2aV9kMTFfcHQzIiwKLQkidmlfZDJfcGwwIiwKLQkidmlfZDNfcGwxIiwKLQkidmlfZDRfcGwyIiwKLQkidmlfZDVfcGwzIiwKLQkidmlfZDZfcGw0IiwKLQkidmlfZDdfcGw1IiwKLQkidmlfZDhfcGw2IiwKLQkidmlfZDlfcGw3IiwKLQkidmlfaHN5bmNfcGQ3IiwKLQkidmlfdnN5bmNfcGQ2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGV2M19ncm91cHNbXSA9IHsKLQkiY2xrM19yZXFfcGVlMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRpc3BsYXlhX2dyb3Vwc1tdID0gewotCSJkYXAzX2Rpbl9wcDEiLAotCSJkYXAzX2RvdXRfcHAyIiwKLQkiZGFwM19mc19wcDAiLAotCSJkYXAzX3NjbGtfcHAzIiwKLQkicGJiMyIsCi0JInBiYjQiLAotCSJwYmI1IiwKLQkicGJiNiIsCi0JImxjZF9jczBfbl9wbjQiLAotCSJsY2RfY3MxX25fcHcwIiwKLQkibGNkX2QwX3BlMCIsCi0JImxjZF9kMV9wZTEiLAotCSJsY2RfZDEwX3BmMiIsCi0JImxjZF9kMTFfcGYzIiwKLQkibGNkX2QxMl9wZjQiLAotCSJsY2RfZDEzX3BmNSIsCi0JImxjZF9kMTRfcGY2IiwKLQkibGNkX2QxNV9wZjciLAotCSJsY2RfZDE2X3BtMCIsCi0JImxjZF9kMTdfcG0xIiwKLQkibGNkX2QxOF9wbTIiLAotCSJsY2RfZDE5X3BtMyIsCi0JImxjZF9kMl9wZTIiLAotCSJsY2RfZDIwX3BtNCIsCi0JImxjZF9kMjFfcG01IiwKLQkibGNkX2QyMl9wbTYiLAotCSJsY2RfZDIzX3BtNyIsCi0JImxjZF9kM19wZTMiLAotCSJsY2RfZDRfcGU0IiwKLQkibGNkX2Q1X3BlNSIsCi0JImxjZF9kNl9wZTYiLAotCSJsY2RfZDdfcGU3IiwKLQkibGNkX2Q4X3BmMCIsCi0JImxjZF9kOV9wZjEiLAotCSJsY2RfZGMwX3BuNiIsCi0JImxjZF9kYzFfcGQyIiwKLQkibGNkX2RlX3BqMSIsCi0JImxjZF9oc3luY19wajMiLAotCSJsY2RfbTFfcHcxIiwKLQkibGNkX3BjbGtfcGIzIiwKLQkibGNkX3B3cjBfcGIyIiwKLQkibGNkX3B3cjFfcGMxIiwKLQkibGNkX3B3cjJfcGM2IiwKLQkibGNkX3Nja19wejQiLAotCSJsY2Rfc2Rpbl9wejIiLAotCSJsY2Rfc2RvdXRfcG41IiwKLQkibGNkX3ZzeW5jX3BqNCIsCi0JImxjZF93cl9uX3B6MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRpc3BsYXliX2dyb3Vwc1tdID0gewotCSJkYXAzX2Rpbl9wcDEiLAotCSJkYXAzX2RvdXRfcHAyIiwKLQkiZGFwM19mc19wcDAiLAotCSJkYXAzX3NjbGtfcHAzIiwKLQkicGJiMyIsCi0JInBiYjQiLAotCSJwYmI1IiwKLQkicGJiNiIsCi0JImxjZF9jczBfbl9wbjQiLAotCSJsY2RfY3MxX25fcHcwIiwKLQkibGNkX2QwX3BlMCIsCi0JImxjZF9kMV9wZTEiLAotCSJsY2RfZDEwX3BmMiIsCi0JImxjZF9kMTFfcGYzIiwKLQkibGNkX2QxMl9wZjQiLAotCSJsY2RfZDEzX3BmNSIsCi0JImxjZF9kMTRfcGY2IiwKLQkibGNkX2QxNV9wZjciLAotCSJsY2RfZDE2X3BtMCIsCi0JImxjZF9kMTdfcG0xIiwKLQkibGNkX2QxOF9wbTIiLAotCSJsY2RfZDE5X3BtMyIsCi0JImxjZF9kMl9wZTIiLAotCSJsY2RfZDIwX3BtNCIsCi0JImxjZF9kMjFfcG01IiwKLQkibGNkX2QyMl9wbTYiLAotCSJsY2RfZDIzX3BtNyIsCi0JImxjZF9kM19wZTMiLAotCSJsY2RfZDRfcGU0IiwKLQkibGNkX2Q1X3BlNSIsCi0JImxjZF9kNl9wZTYiLAotCSJsY2RfZDdfcGU3IiwKLQkibGNkX2Q4X3BmMCIsCi0JImxjZF9kOV9wZjEiLAotCSJsY2RfZGMwX3BuNiIsCi0JImxjZF9kYzFfcGQyIiwKLQkibGNkX2RlX3BqMSIsCi0JImxjZF9oc3luY19wajMiLAotCSJsY2RfbTFfcHcxIiwKLQkibGNkX3BjbGtfcGIzIiwKLQkibGNkX3B3cjBfcGIyIiwKLQkibGNkX3B3cjFfcGMxIiwKLQkibGNkX3B3cjJfcGM2IiwKLQkibGNkX3Nja19wejQiLAotCSJsY2Rfc2Rpbl9wejIiLAotCSJsY2Rfc2RvdXRfcG41IiwKLQkibGNkX3ZzeW5jX3BqNCIsCi0JImxjZF93cl9uX3B6MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGR0dl9ncm91cHNbXSA9IHsKLQkiZ21pX2ExN19wYjAiLAotCSJnbWlfYTE4X3BiMSIsCi0JImdtaV9jczBfbl9wajAiLAotCSJnbWlfY3MxX25fcGoyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0cGVyaXBoMV9ncm91cHNbXSA9IHsKLQkiY2xrMV9vdXRfcHc0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0cGVyaXBoMl9ncm91cHNbXSA9IHsKLQkiY2xrMl9vdXRfcHc1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0cGVyaXBoM19ncm91cHNbXSA9IHsKLQkiY2xrM19vdXRfcGVlMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdtaV9ncm91cHNbXSA9IHsKLQkiZGFwMV9kaW5fcG4xIiwKLQkiZGFwMV9kb3V0X3BuMiIsCi0JImRhcDFfZnNfcG4wIiwKLQkiZGFwMV9zY2xrX3BuMyIsCi0JImRhcDJfZGluX3BhNCIsCi0JImRhcDJfZG91dF9wYTUiLAotCSJkYXAyX2ZzX3BhMiIsCi0JImRhcDJfc2Nsa19wYTMiLAotCSJkYXA0X2Rpbl9wcDUiLAotCSJkYXA0X2RvdXRfcHA2IiwKLQkiZGFwNF9mc19wcDQiLAotCSJkYXA0X3NjbGtfcHA3IiwKLQkiZ2VuMl9pMmNfc2NsX3B0NSIsCi0JImdlbjJfaTJjX3NkYV9wdDYiLAotCSJnbWlfYTE2X3BqNyIsCi0JImdtaV9hMTdfcGIwIiwKLQkiZ21pX2ExOF9wYjEiLAotCSJnbWlfYTE5X3BrNyIsCi0JImdtaV9hZDBfcGcwIiwKLQkiZ21pX2FkMV9wZzEiLAotCSJnbWlfYWQxMF9waDIiLAotCSJnbWlfYWQxMV9waDMiLAotCSJnbWlfYWQxMl9waDQiLAotCSJnbWlfYWQxM19waDUiLAotCSJnbWlfYWQxNF9waDYiLAotCSJnbWlfYWQxNV9waDciLAotCSJnbWlfYWQyX3BnMiIsCi0JImdtaV9hZDNfcGczIiwKLQkiZ21pX2FkNF9wZzQiLAotCSJnbWlfYWQ1X3BnNSIsCi0JImdtaV9hZDZfcGc2IiwKLQkiZ21pX2FkN19wZzciLAotCSJnbWlfYWQ4X3BoMCIsCi0JImdtaV9hZDlfcGgxIiwKLQkiZ21pX2Fkdl9uX3BrMCIsCi0JImdtaV9jbGtfcGsxIiwKLQkiZ21pX2NzMF9uX3BqMCIsCi0JImdtaV9jczFfbl9wajIiLAotCSJnbWlfY3MyX25fcGszIiwKLQkiZ21pX2NzM19uX3BrNCIsCi0JImdtaV9jczRfbl9wazIiLAotCSJnbWlfY3M2X25fcGkzIiwKLQkiZ21pX2NzN19uX3BpNiIsCi0JImdtaV9kcXNfcGkyIiwKLQkiZ21pX2lvcmR5X3BpNSIsCi0JImdtaV9vZV9uX3BpMSIsCi0JImdtaV9yc3Rfbl9waTQiLAotCSJnbWlfd2FpdF9waTciLAotCSJnbWlfd3Bfbl9wYzciLAotCSJnbWlfd3Jfbl9waTAiLAotCSJwdTAiLAotCSJwdTEiLAotCSJwdTIiLAotCSJwdTMiLAotCSJwdTQiLAotCSJwdTUiLAotCSJwdTYiLAotCSJzZG1tYzRfY2xrX3BjYzQiLAotCSJzZG1tYzRfY21kX3B0NyIsCi0JInNkbW1jNF9kYXQwX3BhYTAiLAotCSJzZG1tYzRfZGF0MV9wYWExIiwKLQkic2RtbWM0X2RhdDJfcGFhMiIsCi0JInNkbW1jNF9kYXQzX3BhYTMiLAotCSJzZG1tYzRfZGF0NF9wYWE0IiwKLQkic2RtbWM0X2RhdDVfcGFhNSIsCi0JInNkbW1jNF9kYXQ2X3BhYTYiLAotCSJzZG1tYzRfZGF0N19wYWE3IiwKLQkic3BpMV9jczBfbl9weDYiLAotCSJzcGkxX21vc2lfcHg0IiwKLQkic3BpMV9zY2tfcHg1IiwKLQkic3BpMl9jczBfbl9weDMiLAotCSJzcGkyX21pc29fcHgxIiwKLQkic3BpMl9tb3NpX3B4MCIsCi0JInNwaTJfc2NrX3B4MiIsCi0JInVhcnQyX2N0c19uX3BqNSIsCi0JInVhcnQyX3J0c19uX3BqNiIsCi0JInVhcnQzX2N0c19uX3BhMSIsCi0JInVhcnQzX3J0c19uX3BjMCIsCi0JInVhcnQzX3J4ZF9wdzciLAotCSJ1YXJ0M190eGRfcHc2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZ21pX2FsdF9ncm91cHNbXSA9IHsKLQkiZ21pX2ExNl9wajciLAotCSJnbWlfY3MzX25fcGs0IiwKLQkiZ21pX2NzN19uX3BpNiIsCi0JImdtaV93cF9uX3BjNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGhkYV9ncm91cHNbXSA9IHsKLQkiY2xrMV9yZXFfcGVlMiIsCi0JImRhcDFfZGluX3BuMSIsCi0JImRhcDFfZG91dF9wbjIiLAotCSJkYXAxX2ZzX3BuMCIsCi0JImRhcDFfc2Nsa19wbjMiLAotCSJkYXAyX2Rpbl9wYTQiLAotCSJkYXAyX2RvdXRfcGE1IiwKLQkiZGFwMl9mc19wYTIiLAotCSJkYXAyX3NjbGtfcGEzIiwKLQkicGV4X2wwX2Nsa3JlcV9uX3BkZDIiLAotCSJwZXhfbDBfcHJzbnRfbl9wZGQwIiwKLQkicGV4X2wwX3JzdF9uX3BkZDEiLAotCSJwZXhfbDFfY2xrcmVxX25fcGRkNiIsCi0JInBleF9sMV9wcnNudF9uX3BkZDQiLAotCSJwZXhfbDFfcnN0X25fcGRkNSIsCi0JInBleF9sMl9jbGtyZXFfbl9wY2M3IiwKLQkicGV4X2wyX3Byc250X25fcGRkNyIsCi0JInBleF9sMl9yc3Rfbl9wY2M2IiwKLQkicGV4X3dha2Vfbl9wZGQzIiwKLQkic3BkaWZfaW5fcGs2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGRjcF9ncm91cHNbXSA9IHsKLQkiZ2VuMl9pMmNfc2NsX3B0NSIsCi0JImdlbjJfaTJjX3NkYV9wdDYiLAotCSJsY2RfcHdyMF9wYjIiLAotCSJsY2RfcHdyMl9wYzYiLAotCSJsY2Rfc2NrX3B6NCIsCi0JImxjZF9zZG91dF9wbjUiLAotCSJsY2Rfd3Jfbl9wejMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoZG1pX2dyb3Vwc1tdID0gewotCSJoZG1pX2ludF9wbjciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoc2lfZ3JvdXBzW10gPSB7Ci0JInVscGlfZGF0YTBfcG8xIiwKLQkidWxwaV9kYXRhMV9wbzIiLAotCSJ1bHBpX2RhdGEyX3BvMyIsCi0JInVscGlfZGF0YTNfcG80IiwKLQkidWxwaV9kYXRhNF9wbzUiLAotCSJ1bHBpX2RhdGE1X3BvNiIsCi0JInVscGlfZGF0YTZfcG83IiwKLQkidWxwaV9kYXRhN19wbzAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmMxX2dyb3Vwc1tdID0gewotCSJnZW4xX2kyY19zY2xfcGM0IiwKLQkiZ2VuMV9pMmNfc2RhX3BjNSIsCi0JInNwZGlmX2luX3BrNiIsCi0JInNwZGlmX291dF9wazUiLAotCSJzcGkyX2NzMV9uX3B3MiIsCi0JInNwaTJfY3MyX25fcHczIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjMl9ncm91cHNbXSA9IHsKLQkiZ2VuMl9pMmNfc2NsX3B0NSIsCi0JImdlbjJfaTJjX3NkYV9wdDYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmMzX2dyb3Vwc1tdID0gewotCSJjYW1faTJjX3NjbF9wYmIxIiwKLQkiY2FtX2kyY19zZGFfcGJiMiIsCi0JInNkbW1jNF9jbWRfcHQ3IiwKLQkic2RtbWM0X2RhdDRfcGFhNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyYzRfZ3JvdXBzW10gPSB7Ci0JImRkY19zY2xfcHY0IiwKLQkiZGRjX3NkYV9wdjUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmNwd3JfZ3JvdXBzW10gPSB7Ci0JInB3cl9pMmNfc2NsX3B6NiIsCi0JInB3cl9pMmNfc2RhX3B6NyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyczBfZ3JvdXBzW10gPSB7Ci0JImRhcDFfZGluX3BuMSIsCi0JImRhcDFfZG91dF9wbjIiLAotCSJkYXAxX2ZzX3BuMCIsCi0JImRhcDFfc2Nsa19wbjMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMnMxX2dyb3Vwc1tdID0gewotCSJkYXAyX2Rpbl9wYTQiLAotCSJkYXAyX2RvdXRfcGE1IiwKLQkiZGFwMl9mc19wYTIiLAotCSJkYXAyX3NjbGtfcGEzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJzMl9ncm91cHNbXSA9IHsKLQkiZGFwM19kaW5fcHAxIiwKLQkiZGFwM19kb3V0X3BwMiIsCi0JImRhcDNfZnNfcHAwIiwKLQkiZGFwM19zY2xrX3BwMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyczNfZ3JvdXBzW10gPSB7Ci0JImRhcDRfZGluX3BwNSIsCi0JImRhcDRfZG91dF9wcDYiLAotCSJkYXA0X2ZzX3BwNCIsCi0JImRhcDRfc2Nsa19wcDciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMnM0X2dyb3Vwc1tdID0gewotCSJwYmIwIiwKLQkicGJiNyIsCi0JInBjYzEiLAotCSJwY2MyIiwKLQkic2RtbWM0X2RhdDRfcGFhNCIsCi0JInNkbW1jNF9kYXQ1X3BhYTUiLAotCSJzZG1tYzRfZGF0Nl9wYWE2IiwKLQkic2RtbWM0X2RhdDdfcGFhNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGludmFsaWRfZ3JvdXBzW10gPSB7Ci0JImtiX3JvdzNfcHIzIiwKLQkic2RtbWM0X2Nsa19wY2M0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2JjX2dyb3Vwc1tdID0gewotCSJrYl9jb2wwX3BxMCIsCi0JImtiX2NvbDFfcHExIiwKLQkia2JfY29sMl9wcTIiLAotCSJrYl9jb2wzX3BxMyIsCi0JImtiX2NvbDRfcHE0IiwKLQkia2JfY29sNV9wcTUiLAotCSJrYl9jb2w2X3BxNiIsCi0JImtiX2NvbDdfcHE3IiwKLQkia2Jfcm93MF9wcjAiLAotCSJrYl9yb3cxX3ByMSIsCi0JImtiX3JvdzEwX3BzMiIsCi0JImtiX3JvdzExX3BzMyIsCi0JImtiX3JvdzEyX3BzNCIsCi0JImtiX3JvdzEzX3BzNSIsCi0JImtiX3JvdzE0X3BzNiIsCi0JImtiX3JvdzE1X3BzNyIsCi0JImtiX3JvdzJfcHIyIiwKLQkia2Jfcm93M19wcjMiLAotCSJrYl9yb3c0X3ByNCIsCi0JImtiX3JvdzVfcHI1IiwKLQkia2Jfcm93Nl9wcjYiLAotCSJrYl9yb3c3X3ByNyIsCi0JImtiX3JvdzhfcHMwIiwKLQkia2Jfcm93OV9wczEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtaW9fZ3JvdXBzW10gPSB7Ci0JImtiX2NvbDZfcHE2IiwKLQkia2JfY29sN19wcTciLAotCSJrYl9yb3cxMF9wczIiLAotCSJrYl9yb3cxMV9wczMiLAotCSJrYl9yb3cxMl9wczQiLAotCSJrYl9yb3cxM19wczUiLAotCSJrYl9yb3cxNF9wczYiLAotCSJrYl9yb3cxNV9wczciLAotCSJrYl9yb3c2X3ByNiIsCi0JImtiX3JvdzdfcHI3IiwKLQkia2Jfcm93OF9wczAiLAotCSJrYl9yb3c5X3BzMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbmRfZ3JvdXBzW10gPSB7Ci0JImdtaV9hZDBfcGcwIiwKLQkiZ21pX2FkMV9wZzEiLAotCSJnbWlfYWQxMF9waDIiLAotCSJnbWlfYWQxMV9waDMiLAotCSJnbWlfYWQxMl9waDQiLAotCSJnbWlfYWQxM19waDUiLAotCSJnbWlfYWQxNF9waDYiLAotCSJnbWlfYWQxNV9waDciLAotCSJnbWlfYWQyX3BnMiIsCi0JImdtaV9hZDNfcGczIiwKLQkiZ21pX2FkNF9wZzQiLAotCSJnbWlfYWQ1X3BnNSIsCi0JImdtaV9hZDZfcGc2IiwKLQkiZ21pX2FkN19wZzciLAotCSJnbWlfYWQ4X3BoMCIsCi0JImdtaV9hZDlfcGgxIiwKLQkiZ21pX2Fkdl9uX3BrMCIsCi0JImdtaV9jbGtfcGsxIiwKLQkiZ21pX2NzMF9uX3BqMCIsCi0JImdtaV9jczFfbl9wajIiLAotCSJnbWlfY3MyX25fcGszIiwKLQkiZ21pX2NzM19uX3BrNCIsCi0JImdtaV9jczRfbl9wazIiLAotCSJnbWlfY3M2X25fcGkzIiwKLQkiZ21pX2NzN19uX3BpNiIsCi0JImdtaV9kcXNfcGkyIiwKLQkiZ21pX2lvcmR5X3BpNSIsCi0JImdtaV9vZV9uX3BpMSIsCi0JImdtaV9yc3Rfbl9waTQiLAotCSJnbWlfd2FpdF9waTciLAotCSJnbWlfd3Bfbl9wYzciLAotCSJnbWlfd3Jfbl9waTAiLAotCSJrYl9jb2wwX3BxMCIsCi0JImtiX2NvbDFfcHExIiwKLQkia2JfY29sMl9wcTIiLAotCSJrYl9jb2wzX3BxMyIsCi0JImtiX2NvbDRfcHE0IiwKLQkia2JfY29sNV9wcTUiLAotCSJrYl9jb2w2X3BxNiIsCi0JImtiX2NvbDdfcHE3IiwKLQkia2Jfcm93MF9wcjAiLAotCSJrYl9yb3cxX3ByMSIsCi0JImtiX3JvdzEwX3BzMiIsCi0JImtiX3JvdzExX3BzMyIsCi0JImtiX3JvdzEyX3BzNCIsCi0JImtiX3JvdzEzX3BzNSIsCi0JImtiX3JvdzE0X3BzNiIsCi0JImtiX3JvdzE1X3BzNyIsCi0JImtiX3JvdzJfcHIyIiwKLQkia2Jfcm93M19wcjMiLAotCSJrYl9yb3c0X3ByNCIsCi0JImtiX3JvdzVfcHI1IiwKLQkia2Jfcm93Nl9wcjYiLAotCSJrYl9yb3c3X3ByNyIsCi0JImtiX3JvdzhfcHMwIiwKLQkia2Jfcm93OV9wczEiLAotCSJzZG1tYzRfY2xrX3BjYzQiLAotCSJzZG1tYzRfY21kX3B0NyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbmRfYWx0X2dyb3Vwc1tdID0gewotCSJnbWlfY3M2X25fcGkzIiwKLQkiZ21pX2NzN19uX3BpNiIsCi0JImdtaV9yc3Rfbl9waTQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBvd3JfZ3JvdXBzW10gPSB7Ci0JInB1MCIsCi0JInB2MiIsCi0JImtiX3JvdzVfcHI1IiwKLQkib3dyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNpZV9ncm91cHNbXSA9IHsKLQkicGV4X2wwX2Nsa3JlcV9uX3BkZDIiLAotCSJwZXhfbDBfcHJzbnRfbl9wZGQwIiwKLQkicGV4X2wwX3JzdF9uX3BkZDEiLAotCSJwZXhfbDFfY2xrcmVxX25fcGRkNiIsCi0JInBleF9sMV9wcnNudF9uX3BkZDQiLAotCSJwZXhfbDFfcnN0X25fcGRkNSIsCi0JInBleF9sMl9jbGtyZXFfbl9wY2M3IiwKLQkicGV4X2wyX3Byc250X25fcGRkNyIsCi0JInBleF9sMl9yc3Rfbl9wY2M2IiwKLQkicGV4X3dha2Vfbl9wZGQzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtMF9ncm91cHNbXSA9IHsKLQkiZ21pX2FkOF9waDAiLAotCSJwdTMiLAotCSJzZG1tYzNfZGF0M19wYjQiLAotCSJzZG1tYzNfZGF0NV9wZDAiLAotCSJ1YXJ0M19ydHNfbl9wYzAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd20xX2dyb3Vwc1tdID0gewotCSJnbWlfYWQ5X3BoMSIsCi0JInB1NCIsCi0JInNkbW1jM19kYXQyX3BiNSIsCi0JInNkbW1jM19kYXQ0X3BkMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bTJfZ3JvdXBzW10gPSB7Ci0JImdtaV9hZDEwX3BoMiIsCi0JInB1NSIsCi0JInNkbW1jM19jbGtfcGE2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtM19ncm91cHNbXSA9IHsKLQkiZ21pX2FkMTFfcGgzIiwKLQkicHU2IiwKLQkic2RtbWMzX2NtZF9wYTciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd3JfaW50X25fZ3JvdXBzW10gPSB7Ci0JInB3cl9pbnRfbiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQxX2dyb3Vwc1tdID0gewotCSJnbWlfYWQwX3BnMCIsCi0JImdtaV9hZDFfcGcxIiwKLQkiZ21pX2FkMTJfcGg0IiwKLQkiZ21pX2FkMTNfcGg1IiwKLQkiZ21pX2FkMTRfcGg2IiwKLQkiZ21pX2FkMTVfcGg3IiwKLQkiZ21pX2FkMl9wZzIiLAotCSJnbWlfYWQzX3BnMyIsCi0JImdtaV9hZDRfcGc0IiwKLQkiZ21pX2FkNV9wZzUiLAotCSJnbWlfYWQ2X3BnNiIsCi0JImdtaV9hZDdfcGc3IiwKLQkiZ21pX2Fkdl9uX3BrMCIsCi0JImdtaV9jbGtfcGsxIiwKLQkiZ21pX2NzMF9uX3BqMCIsCi0JImdtaV9jczFfbl9wajIiLAotCSJnbWlfY3MyX25fcGszIiwKLQkiZ21pX2NzM19uX3BrNCIsCi0JImdtaV9jczRfbl9wazIiLAotCSJnbWlfZHFzX3BpMiIsCi0JImdtaV9pb3JkeV9waTUiLAotCSJnbWlfb2Vfbl9waTEiLAotCSJnbWlfd2FpdF9waTciLAotCSJnbWlfd3Bfbl9wYzciLAotCSJnbWlfd3Jfbl9waTAiLAotCSJwdTEiLAotCSJwdTIiLAotCSJwdjAiLAotCSJwdjEiLAotCSJzZG1tYzNfZGF0MF9wYjciLAotCSJzZG1tYzNfZGF0MV9wYjYiLAotCSJzZG1tYzNfZGF0Ml9wYjUiLAotCSJzZG1tYzNfZGF0M19wYjQiLAotCSJ2aV9wY2xrX3B0MCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQyX2dyb3Vwc1tdID0gewotCSJjbGsxX291dF9wdzQiLAotCSJjbGsyX291dF9wdzUiLAotCSJjbGsyX3JlcV9wY2M1IiwKLQkiY2xrM19vdXRfcGVlMCIsCi0JImNsazNfcmVxX3BlZTEiLAotCSJjbGtfMzJrX2luIiwKLQkiY2xrXzMya19vdXRfcGEwIiwKLQkiY29yZV9wd3JfcmVxIiwKLQkiY3B1X3B3cl9yZXEiLAotCSJjcnRfaHN5bmNfcHY2IiwKLQkiY3J0X3ZzeW5jX3B2NyIsCi0JImRhcDNfZGluX3BwMSIsCi0JImRhcDNfZG91dF9wcDIiLAotCSJkYXAzX2ZzX3BwMCIsCi0JImRhcDNfc2Nsa19wcDMiLAotCSJkYXA0X2Rpbl9wcDUiLAotCSJkYXA0X2RvdXRfcHA2IiwKLQkiZGFwNF9mc19wcDQiLAotCSJkYXA0X3NjbGtfcHA3IiwKLQkiZGRjX3NjbF9wdjQiLAotCSJkZGNfc2RhX3B2NSIsCi0JImdlbjFfaTJjX3NjbF9wYzQiLAotCSJnZW4xX2kyY19zZGFfcGM1IiwKLQkicGJiMCIsCi0JInBiYjciLAotCSJwY2MxIiwKLQkicGNjMiIsCi0JInB2MCIsCi0JInB2MSIsCi0JInB2MiIsCi0JInB2MyIsCi0JImhkbWlfY2VjX3BlZTMiLAotCSJoZG1pX2ludF9wbjciLAotCSJqdGFnX3J0Y2tfcHU3IiwKLQkicHdyX2kyY19zY2xfcHo2IiwKLQkicHdyX2kyY19zZGFfcHo3IiwKLQkicHdyX2ludF9uIiwKLQkic2RtbWMxX2Nsa19wejAiLAotCSJzZG1tYzFfY21kX3B6MSIsCi0JInNkbW1jMV9kYXQwX3B5NyIsCi0JInNkbW1jMV9kYXQxX3B5NiIsCi0JInNkbW1jMV9kYXQyX3B5NSIsCi0JInNkbW1jMV9kYXQzX3B5NCIsCi0JInNkbW1jM19kYXQwX3BiNyIsCi0JInNkbW1jM19kYXQxX3BiNiIsCi0JInNkbW1jNF9yc3Rfbl9wY2MzIiwKLQkic3BkaWZfb3V0X3BrNSIsCi0JInN5c19jbGtfcmVxX3B6NSIsCi0JInVhcnQzX2N0c19uX3BhMSIsCi0JInVhcnQzX3J4ZF9wdzciLAotCSJ1YXJ0M190eGRfcHc2IiwKLQkidWxwaV9jbGtfcHkwIiwKLQkidWxwaV9kaXJfcHkxIiwKLQkidWxwaV9ueHRfcHkyIiwKLQkidWxwaV9zdHBfcHkzIiwKLQkidmlfZDBfcHQ0IiwKLQkidmlfZDEwX3B0MiIsCi0JInZpX2QxMV9wdDMiLAotCSJ2aV9oc3luY19wZDciLAotCSJ2aV92c3luY19wZDYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByc3ZkM19ncm91cHNbXSA9IHsKLQkiY2FtX2kyY19zY2xfcGJiMSIsCi0JImNhbV9pMmNfc2RhX3BiYjIiLAotCSJjbGsxX291dF9wdzQiLAotCSJjbGsxX3JlcV9wZWUyIiwKLQkiY2xrMl9vdXRfcHc1IiwKLQkiY2xrMl9yZXFfcGNjNSIsCi0JImNsazNfb3V0X3BlZTAiLAotCSJjbGszX3JlcV9wZWUxIiwKLQkiY2xrXzMya19pbiIsCi0JImNsa18zMmtfb3V0X3BhMCIsCi0JImNvcmVfcHdyX3JlcSIsCi0JImNwdV9wd3JfcmVxIiwKLQkiY3J0X2hzeW5jX3B2NiIsCi0JImNydF92c3luY19wdjciLAotCSJkYXAyX2Rpbl9wYTQiLAotCSJkYXAyX2RvdXRfcGE1IiwKLQkiZGFwMl9mc19wYTIiLAotCSJkYXAyX3NjbGtfcGEzIiwKLQkiZGRjX3NjbF9wdjQiLAotCSJkZGNfc2RhX3B2NSIsCi0JImdlbjFfaTJjX3NjbF9wYzQiLAotCSJnZW4xX2kyY19zZGFfcGM1IiwKLQkicGJiMCIsCi0JInBiYjciLAotCSJwY2MxIiwKLQkicGNjMiIsCi0JInB2MCIsCi0JInB2MSIsCi0JInB2MiIsCi0JInB2MyIsCi0JImhkbWlfY2VjX3BlZTMiLAotCSJoZG1pX2ludF9wbjciLAotCSJqdGFnX3J0Y2tfcHU3IiwKLQkia2Jfcm93MF9wcjAiLAotCSJrYl9yb3cxX3ByMSIsCi0JImtiX3JvdzJfcHIyIiwKLQkia2Jfcm93M19wcjMiLAotCSJsY2RfZDBfcGUwIiwKLQkibGNkX2QxX3BlMSIsCi0JImxjZF9kMTBfcGYyIiwKLQkibGNkX2QxMV9wZjMiLAotCSJsY2RfZDEyX3BmNCIsCi0JImxjZF9kMTNfcGY1IiwKLQkibGNkX2QxNF9wZjYiLAotCSJsY2RfZDE1X3BmNyIsCi0JImxjZF9kMTZfcG0wIiwKLQkibGNkX2QxN19wbTEiLAotCSJsY2RfZDE4X3BtMiIsCi0JImxjZF9kMTlfcG0zIiwKLQkibGNkX2QyX3BlMiIsCi0JImxjZF9kMjBfcG00IiwKLQkibGNkX2QyMV9wbTUiLAotCSJsY2RfZDIyX3BtNiIsCi0JImxjZF9kMjNfcG03IiwKLQkibGNkX2QzX3BlMyIsCi0JImxjZF9kNF9wZTQiLAotCSJsY2RfZDVfcGU1IiwKLQkibGNkX2Q2X3BlNiIsCi0JImxjZF9kN19wZTciLAotCSJsY2RfZDhfcGYwIiwKLQkibGNkX2Q5X3BmMSIsCi0JImxjZF9kYzBfcG42IiwKLQkibGNkX2RjMV9wZDIiLAotCSJsY2RfZGVfcGoxIiwKLQkibGNkX2hzeW5jX3BqMyIsCi0JImxjZF9tMV9wdzEiLAotCSJsY2RfcGNsa19wYjMiLAotCSJsY2RfcHdyMV9wYzEiLAotCSJsY2RfdnN5bmNfcGo0IiwKLQkib3dyIiwKLQkicGV4X2wwX2Nsa3JlcV9uX3BkZDIiLAotCSJwZXhfbDBfcHJzbnRfbl9wZGQwIiwKLQkicGV4X2wwX3JzdF9uX3BkZDEiLAotCSJwZXhfbDFfY2xrcmVxX25fcGRkNiIsCi0JInBleF9sMV9wcnNudF9uX3BkZDQiLAotCSJwZXhfbDFfcnN0X25fcGRkNSIsCi0JInBleF9sMl9jbGtyZXFfbl9wY2M3IiwKLQkicGV4X2wyX3Byc250X25fcGRkNyIsCi0JInBleF9sMl9yc3Rfbl9wY2M2IiwKLQkicGV4X3dha2Vfbl9wZGQzIiwKLQkicHdyX2kyY19zY2xfcHo2IiwKLQkicHdyX2kyY19zZGFfcHo3IiwKLQkicHdyX2ludF9uIiwKLQkic2RtbWMxX2Nsa19wejAiLAotCSJzZG1tYzFfY21kX3B6MSIsCi0JInNkbW1jNF9yc3Rfbl9wY2MzIiwKLQkic3lzX2Nsa19yZXFfcHo1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnN2ZDRfZ3JvdXBzW10gPSB7Ci0JImNsazFfb3V0X3B3NCIsCi0JImNsazFfcmVxX3BlZTIiLAotCSJjbGsyX291dF9wdzUiLAotCSJjbGsyX3JlcV9wY2M1IiwKLQkiY2xrM19vdXRfcGVlMCIsCi0JImNsazNfcmVxX3BlZTEiLAotCSJjbGtfMzJrX2luIiwKLQkiY2xrXzMya19vdXRfcGEwIiwKLQkiY29yZV9wd3JfcmVxIiwKLQkiY3B1X3B3cl9yZXEiLAotCSJjcnRfaHN5bmNfcHY2IiwKLQkiY3J0X3ZzeW5jX3B2NyIsCi0JImRhcDRfZGluX3BwNSIsCi0JImRhcDRfZG91dF9wcDYiLAotCSJkYXA0X2ZzX3BwNCIsCi0JImRhcDRfc2Nsa19wcDciLAotCSJkZGNfc2NsX3B2NCIsCi0JImRkY19zZGFfcHY1IiwKLQkiZ2VuMV9pMmNfc2NsX3BjNCIsCi0JImdlbjFfaTJjX3NkYV9wYzUiLAotCSJnZW4yX2kyY19zY2xfcHQ1IiwKLQkiZ2VuMl9pMmNfc2RhX3B0NiIsCi0JImdtaV9hMTlfcGs3IiwKLQkiZ21pX2FkMF9wZzAiLAotCSJnbWlfYWQxX3BnMSIsCi0JImdtaV9hZDEwX3BoMiIsCi0JImdtaV9hZDExX3BoMyIsCi0JImdtaV9hZDEyX3BoNCIsCi0JImdtaV9hZDEzX3BoNSIsCi0JImdtaV9hZDE0X3BoNiIsCi0JImdtaV9hZDE1X3BoNyIsCi0JImdtaV9hZDJfcGcyIiwKLQkiZ21pX2FkM19wZzMiLAotCSJnbWlfYWQ0X3BnNCIsCi0JImdtaV9hZDVfcGc1IiwKLQkiZ21pX2FkNl9wZzYiLAotCSJnbWlfYWQ3X3BnNyIsCi0JImdtaV9hZDhfcGgwIiwKLQkiZ21pX2FkOV9waDEiLAotCSJnbWlfYWR2X25fcGswIiwKLQkiZ21pX2Nsa19wazEiLAotCSJnbWlfY3MyX25fcGszIiwKLQkiZ21pX2NzNF9uX3BrMiIsCi0JImdtaV9kcXNfcGkyIiwKLQkiZ21pX2lvcmR5X3BpNSIsCi0JImdtaV9vZV9uX3BpMSIsCi0JImdtaV9yc3Rfbl9waTQiLAotCSJnbWlfd2FpdF9waTciLAotCSJnbWlfd3Jfbl9waTAiLAotCSJwY2MyIiwKLQkicHUwIiwKLQkicHUxIiwKLQkicHUyIiwKLQkicHUzIiwKLQkicHU0IiwKLQkicHU1IiwKLQkicHU2IiwKLQkicHYwIiwKLQkicHYxIiwKLQkicHYyIiwKLQkicHYzIiwKLQkiaGRtaV9jZWNfcGVlMyIsCi0JImhkbWlfaW50X3BuNyIsCi0JImp0YWdfcnRja19wdTciLAotCSJrYl9jb2wyX3BxMiIsCi0JImtiX2NvbDNfcHEzIiwKLQkia2JfY29sNF9wcTQiLAotCSJrYl9jb2w1X3BxNSIsCi0JImtiX3JvdzBfcHIwIiwKLQkia2Jfcm93MV9wcjEiLAotCSJrYl9yb3cyX3ByMiIsCi0JImtiX3JvdzRfcHI0IiwKLQkibGNkX2NzMF9uX3BuNCIsCi0JImxjZF9jczFfbl9wdzAiLAotCSJsY2RfZDBfcGUwIiwKLQkibGNkX2QxX3BlMSIsCi0JImxjZF9kMTBfcGYyIiwKLQkibGNkX2QxMV9wZjMiLAotCSJsY2RfZDEyX3BmNCIsCi0JImxjZF9kMTNfcGY1IiwKLQkibGNkX2QxNF9wZjYiLAotCSJsY2RfZDE1X3BmNyIsCi0JImxjZF9kMTZfcG0wIiwKLQkibGNkX2QxN19wbTEiLAotCSJsY2RfZDE4X3BtMiIsCi0JImxjZF9kMTlfcG0zIiwKLQkibGNkX2QyX3BlMiIsCi0JImxjZF9kMjBfcG00IiwKLQkibGNkX2QyMV9wbTUiLAotCSJsY2RfZDIyX3BtNiIsCi0JImxjZF9kMjNfcG03IiwKLQkibGNkX2QzX3BlMyIsCi0JImxjZF9kNF9wZTQiLAotCSJsY2RfZDVfcGU1IiwKLQkibGNkX2Q2X3BlNiIsCi0JImxjZF9kN19wZTciLAotCSJsY2RfZDhfcGYwIiwKLQkibGNkX2Q5X3BmMSIsCi0JImxjZF9kYzBfcG42IiwKLQkibGNkX2RjMV9wZDIiLAotCSJsY2RfZGVfcGoxIiwKLQkibGNkX2hzeW5jX3BqMyIsCi0JImxjZF9tMV9wdzEiLAotCSJsY2RfcGNsa19wYjMiLAotCSJsY2RfcHdyMV9wYzEiLAotCSJsY2Rfc2Rpbl9wejIiLAotCSJsY2RfdnN5bmNfcGo0IiwKLQkib3dyIiwKLQkicGV4X2wwX2Nsa3JlcV9uX3BkZDIiLAotCSJwZXhfbDBfcHJzbnRfbl9wZGQwIiwKLQkicGV4X2wwX3JzdF9uX3BkZDEiLAotCSJwZXhfbDFfY2xrcmVxX25fcGRkNiIsCi0JInBleF9sMV9wcnNudF9uX3BkZDQiLAotCSJwZXhfbDFfcnN0X25fcGRkNSIsCi0JInBleF9sMl9jbGtyZXFfbl9wY2M3IiwKLQkicGV4X2wyX3Byc250X25fcGRkNyIsCi0JInBleF9sMl9yc3Rfbl9wY2M2IiwKLQkicGV4X3dha2Vfbl9wZGQzIiwKLQkicHdyX2kyY19zY2xfcHo2IiwKLQkicHdyX2kyY19zZGFfcHo3IiwKLQkicHdyX2ludF9uIiwKLQkic3BpMV9taXNvX3B4NyIsCi0JInN5c19jbGtfcmVxX3B6NSIsCi0JInVhcnQzX2N0c19uX3BhMSIsCi0JInVhcnQzX3J0c19uX3BjMCIsCi0JInVhcnQzX3J4ZF9wdzciLAotCSJ1YXJ0M190eGRfcHc2IiwKLQkidmlfZDBfcHQ0IiwKLQkidmlfZDFfcGQ1IiwKLQkidmlfZDEwX3B0MiIsCi0JInZpX2QxMV9wdDMiLAotCSJ2aV9kMl9wbDAiLAotCSJ2aV9kM19wbDEiLAotCSJ2aV9kNF9wbDIiLAotCSJ2aV9kNV9wbDMiLAotCSJ2aV9kNl9wbDQiLAotCSJ2aV9kN19wbDUiLAotCSJ2aV9kOF9wbDYiLAotCSJ2aV9kOV9wbDciLAotCSJ2aV9oc3luY19wZDciLAotCSJ2aV9wY2xrX3B0MCIsCi0JInZpX3ZzeW5jX3BkNiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ0Y2tfZ3JvdXBzW10gPSB7Ci0JImp0YWdfcnRja19wdTciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzYXRhX2dyb3Vwc1tdID0gewotCSJnbWlfY3M2X25fcGkzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RtbWMxX2dyb3Vwc1tdID0gewotCSJzZG1tYzFfY2xrX3B6MCIsCi0JInNkbW1jMV9jbWRfcHoxIiwKLQkic2RtbWMxX2RhdDBfcHk3IiwKLQkic2RtbWMxX2RhdDFfcHk2IiwKLQkic2RtbWMxX2RhdDJfcHk1IiwKLQkic2RtbWMxX2RhdDNfcHk0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RtbWMyX2dyb3Vwc1tdID0gewotCSJkYXAxX2Rpbl9wbjEiLAotCSJkYXAxX2RvdXRfcG4yIiwKLQkiZGFwMV9mc19wbjAiLAotCSJkYXAxX3NjbGtfcG4zIiwKLQkia2Jfcm93MTBfcHMyIiwKLQkia2Jfcm93MTFfcHMzIiwKLQkia2Jfcm93MTJfcHM0IiwKLQkia2Jfcm93MTNfcHM1IiwKLQkia2Jfcm93MTRfcHM2IiwKLQkia2Jfcm93MTVfcHM3IiwKLQkia2Jfcm93Nl9wcjYiLAotCSJrYl9yb3c3X3ByNyIsCi0JImtiX3JvdzhfcHMwIiwKLQkia2Jfcm93OV9wczEiLAotCSJzcGRpZl9pbl9wazYiLAotCSJzcGRpZl9vdXRfcGs1IiwKLQkidmlfZDFfcGQ1IiwKLQkidmlfZDJfcGwwIiwKLQkidmlfZDNfcGwxIiwKLQkidmlfZDRfcGwyIiwKLQkidmlfZDVfcGwzIiwKLQkidmlfZDZfcGw0IiwKLQkidmlfZDdfcGw1IiwKLQkidmlfZDhfcGw2IiwKLQkidmlfZDlfcGw3IiwKLQkidmlfcGNsa19wdDAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZG1tYzNfZ3JvdXBzW10gPSB7Ci0JInNkbW1jM19jbGtfcGE2IiwKLQkic2RtbWMzX2NtZF9wYTciLAotCSJzZG1tYzNfZGF0MF9wYjciLAotCSJzZG1tYzNfZGF0MV9wYjYiLAotCSJzZG1tYzNfZGF0Ml9wYjUiLAotCSJzZG1tYzNfZGF0M19wYjQiLAotCSJzZG1tYzNfZGF0NF9wZDEiLAotCSJzZG1tYzNfZGF0NV9wZDAiLAotCSJzZG1tYzNfZGF0Nl9wZDMiLAotCSJzZG1tYzNfZGF0N19wZDQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZG1tYzRfZ3JvdXBzW10gPSB7Ci0JImNhbV9pMmNfc2NsX3BiYjEiLAotCSJjYW1faTJjX3NkYV9wYmIyIiwKLQkiY2FtX21jbGtfcGNjMCIsCi0JInBiYjAiLAotCSJwYmIzIiwKLQkicGJiNCIsCi0JInBiYjUiLAotCSJwYmI2IiwKLQkicGJiNyIsCi0JInBjYzEiLAotCSJzZG1tYzRfY2xrX3BjYzQiLAotCSJzZG1tYzRfY21kX3B0NyIsCi0JInNkbW1jNF9kYXQwX3BhYTAiLAotCSJzZG1tYzRfZGF0MV9wYWExIiwKLQkic2RtbWM0X2RhdDJfcGFhMiIsCi0JInNkbW1jNF9kYXQzX3BhYTMiLAotCSJzZG1tYzRfZGF0NF9wYWE0IiwKLQkic2RtbWM0X2RhdDVfcGFhNSIsCi0JInNkbW1jNF9kYXQ2X3BhYTYiLAotCSJzZG1tYzRfZGF0N19wYWE3IiwKLQkic2RtbWM0X3JzdF9uX3BjYzMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGRpZl9ncm91cHNbXSA9IHsKLQkic2RtbWMzX2RhdDZfcGQzIiwKLQkic2RtbWMzX2RhdDdfcGQ0IiwKLQkic3BkaWZfaW5fcGs2IiwKLQkic3BkaWZfb3V0X3BrNSIsCi0JInVhcnQyX3J4ZF9wYzMiLAotCSJ1YXJ0Ml90eGRfcGMyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpMV9ncm91cHNbXSA9IHsKLQkic3BpMV9jczBfbl9weDYiLAotCSJzcGkxX21pc29fcHg3IiwKLQkic3BpMV9tb3NpX3B4NCIsCi0JInNwaTFfc2NrX3B4NSIsCi0JInVscGlfY2xrX3B5MCIsCi0JInVscGlfZGlyX3B5MSIsCi0JInVscGlfbnh0X3B5MiIsCi0JInVscGlfc3RwX3B5MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTJfZ3JvdXBzW10gPSB7Ci0JInNkbW1jM19jbWRfcGE3IiwKLQkic2RtbWMzX2RhdDRfcGQxIiwKLQkic2RtbWMzX2RhdDVfcGQwIiwKLQkic2RtbWMzX2RhdDZfcGQzIiwKLQkic2RtbWMzX2RhdDdfcGQ0IiwKLQkic3BpMV9jczBfbl9weDYiLAotCSJzcGkxX21vc2lfcHg0IiwKLQkic3BpMV9zY2tfcHg1IiwKLQkic3BpMl9jczBfbl9weDMiLAotCSJzcGkyX2NzMV9uX3B3MiIsCi0JInNwaTJfY3MyX25fcHczIiwKLQkic3BpMl9taXNvX3B4MSIsCi0JInNwaTJfbW9zaV9weDAiLAotCSJzcGkyX3Nja19weDIiLAotCSJ1bHBpX2RhdGE0X3BvNSIsCi0JInVscGlfZGF0YTVfcG82IiwKLQkidWxwaV9kYXRhNl9wbzciLAotCSJ1bHBpX2RhdGE3X3BvMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTJfYWx0X2dyb3Vwc1tdID0gewotCSJzcGkxX2NzMF9uX3B4NiIsCi0JInNwaTFfbWlzb19weDciLAotCSJzcGkxX21vc2lfcHg0IiwKLQkic3BpMV9zY2tfcHg1IiwKLQkic3BpMl9jczFfbl9wdzIiLAotCSJzcGkyX2NzMl9uX3B3MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTNfZ3JvdXBzW10gPSB7Ci0JInNkbW1jM19jbGtfcGE2IiwKLQkic2RtbWMzX2RhdDBfcGI3IiwKLQkic2RtbWMzX2RhdDFfcGI2IiwKLQkic2RtbWMzX2RhdDJfcGI1IiwKLQkic2RtbWMzX2RhdDNfcGI0IiwKLQkic2RtbWM0X2RhdDBfcGFhMCIsCi0JInNkbW1jNF9kYXQxX3BhYTEiLAotCSJzZG1tYzRfZGF0Ml9wYWEyIiwKLQkic2RtbWM0X2RhdDNfcGFhMyIsCi0JInNwaTFfbWlzb19weDciLAotCSJzcGkyX2NzMF9uX3B4MyIsCi0JInNwaTJfY3MxX25fcHcyIiwKLQkic3BpMl9jczJfbl9wdzMiLAotCSJzcGkyX21pc29fcHgxIiwKLQkic3BpMl9tb3NpX3B4MCIsCi0JInNwaTJfc2NrX3B4MiIsCi0JInVscGlfZGF0YTBfcG8xIiwKLQkidWxwaV9kYXRhMV9wbzIiLAotCSJ1bHBpX2RhdGEyX3BvMyIsCi0JInVscGlfZGF0YTNfcG80IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpNF9ncm91cHNbXSA9IHsKLQkiZ21pX2ExNl9wajciLAotCSJnbWlfYTE3X3BiMCIsCi0JImdtaV9hMThfcGIxIiwKLQkiZ21pX2ExOV9wazciLAotCSJzZG1tYzNfZGF0NF9wZDEiLAotCSJzZG1tYzNfZGF0NV9wZDAiLAotCSJzZG1tYzNfZGF0Nl9wZDMiLAotCSJzZG1tYzNfZGF0N19wZDQiLAotCSJ1YXJ0Ml9jdHNfbl9wajUiLAotCSJ1YXJ0Ml9ydHNfbl9wajYiLAotCSJ1YXJ0Ml9yeGRfcGMzIiwKLQkidWFydDJfdHhkX3BjMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTVfZ3JvdXBzW10gPSB7Ci0JImxjZF9jczBfbl9wbjQiLAotCSJsY2RfY3MxX25fcHcwIiwKLQkibGNkX3B3cjBfcGIyIiwKLQkibGNkX3B3cjJfcGM2IiwKLQkibGNkX3Nja19wejQiLAotCSJsY2Rfc2Rpbl9wejIiLAotCSJsY2Rfc2RvdXRfcG41IiwKLQkibGNkX3dyX25fcHozIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpNl9ncm91cHNbXSA9IHsKLQkic3BpMl9jczBfbl9weDMiLAotCSJzcGkyX21pc29fcHgxIiwKLQkic3BpMl9tb3NpX3B4MCIsCi0JInNwaTJfc2NrX3B4MiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHN5c2Nsa19ncm91cHNbXSA9IHsKLQkic3lzX2Nsa19yZXFfcHo1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGVzdF9ncm91cHNbXSA9IHsKLQkia2JfY29sMF9wcTAiLAotCSJrYl9jb2wxX3BxMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRyYWNlX2dyb3Vwc1tdID0gewotCSJrYl9jb2wwX3BxMCIsCi0JImtiX2NvbDFfcHExIiwKLQkia2JfY29sMl9wcTIiLAotCSJrYl9jb2wzX3BxMyIsCi0JImtiX2NvbDRfcHE0IiwKLQkia2JfY29sNV9wcTUiLAotCSJrYl9jb2w2X3BxNiIsCi0JImtiX2NvbDdfcHE3IiwKLQkia2Jfcm93NF9wcjQiLAotCSJrYl9yb3c1X3ByNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnRhX2dyb3Vwc1tdID0gewotCSJwdTAiLAotCSJwdTEiLAotCSJwdTIiLAotCSJwdTMiLAotCSJwdTQiLAotCSJwdTUiLAotCSJwdTYiLAotCSJzZG1tYzFfY2xrX3B6MCIsCi0JInNkbW1jMV9jbWRfcHoxIiwKLQkic2RtbWMxX2RhdDBfcHk3IiwKLQkic2RtbWMxX2RhdDFfcHk2IiwKLQkic2RtbWMxX2RhdDJfcHk1IiwKLQkic2RtbWMxX2RhdDNfcHk0IiwKLQkic2RtbWMzX2Nsa19wYTYiLAotCSJzZG1tYzNfY21kX3BhNyIsCi0JInVhcnQyX2N0c19uX3BqNSIsCi0JInVhcnQyX3J0c19uX3BqNiIsCi0JInVhcnQyX3J4ZF9wYzMiLAotCSJ1YXJ0Ml90eGRfcGMyIiwKLQkidWxwaV9kYXRhMF9wbzEiLAotCSJ1bHBpX2RhdGExX3BvMiIsCi0JInVscGlfZGF0YTJfcG8zIiwKLQkidWxwaV9kYXRhM19wbzQiLAotCSJ1bHBpX2RhdGE0X3BvNSIsCi0JInVscGlfZGF0YTVfcG82IiwKLQkidWxwaV9kYXRhNl9wbzciLAotCSJ1bHBpX2RhdGE3X3BvMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnRiX2dyb3Vwc1tdID0gewotCSJ1YXJ0Ml9jdHNfbl9wajUiLAotCSJ1YXJ0Ml9ydHNfbl9wajYiLAotCSJ1YXJ0Ml9yeGRfcGMzIiwKLQkidWFydDJfdHhkX3BjMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnRjX2dyb3Vwc1tdID0gewotCSJ1YXJ0M19jdHNfbl9wYTEiLAotCSJ1YXJ0M19ydHNfbl9wYzAiLAotCSJ1YXJ0M19yeGRfcHc3IiwKLQkidWFydDNfdHhkX3B3NiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnRkX2dyb3Vwc1tdID0gewotCSJnbWlfYTE2X3BqNyIsCi0JImdtaV9hMTdfcGIwIiwKLQkiZ21pX2ExOF9wYjEiLAotCSJnbWlfYTE5X3BrNyIsCi0JInVscGlfY2xrX3B5MCIsCi0JInVscGlfZGlyX3B5MSIsCi0JInVscGlfbnh0X3B5MiIsCi0JInVscGlfc3RwX3B5MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnRlX2dyb3Vwc1tdID0gewotCSJzZG1tYzFfZGF0MF9weTciLAotCSJzZG1tYzFfZGF0MV9weTYiLAotCSJzZG1tYzFfZGF0Ml9weTUiLAotCSJzZG1tYzFfZGF0M19weTQiLAotCSJzZG1tYzRfZGF0MF9wYWEwIiwKLQkic2RtbWM0X2RhdDFfcGFhMSIsCi0JInNkbW1jNF9kYXQyX3BhYTIiLAotCSJzZG1tYzRfZGF0M19wYWEzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWxwaV9ncm91cHNbXSA9IHsKLQkidWxwaV9jbGtfcHkwIiwKLQkidWxwaV9kYXRhMF9wbzEiLAotCSJ1bHBpX2RhdGExX3BvMiIsCi0JInVscGlfZGF0YTJfcG8zIiwKLQkidWxwaV9kYXRhM19wbzQiLAotCSJ1bHBpX2RhdGE0X3BvNSIsCi0JInVscGlfZGF0YTVfcG82IiwKLQkidWxwaV9kYXRhNl9wbzciLAotCSJ1bHBpX2RhdGE3X3BvMCIsCi0JInVscGlfZGlyX3B5MSIsCi0JInVscGlfbnh0X3B5MiIsCi0JInVscGlfc3RwX3B5MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZncDFfZ3JvdXBzW10gPSB7Ci0JImNhbV9pMmNfc2NsX3BiYjEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2Z3AyX2dyb3Vwc1tdID0gewotCSJjYW1faTJjX3NkYV9wYmIyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmdwM19ncm91cHNbXSA9IHsKLQkicGJiMyIsCi0JInNkbW1jNF9kYXQ1X3BhYTUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2Z3A0X2dyb3Vwc1tdID0gewotCSJwYmI0IiwKLQkic2RtbWM0X2RhdDZfcGFhNiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZncDVfZ3JvdXBzW10gPSB7Ci0JInBiYjUiLAotCSJzZG1tYzRfZGF0N19wYWE3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmdwNl9ncm91cHNbXSA9IHsKLQkicGJiNiIsCi0JInNkbW1jNF9yc3Rfbl9wY2MzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmlfZ3JvdXBzW10gPSB7Ci0JImNhbV9tY2xrX3BjYzAiLAotCSJ2aV9kMF9wdDQiLAotCSJ2aV9kMV9wZDUiLAotCSJ2aV9kMTBfcHQyIiwKLQkidmlfZDExX3B0MyIsCi0JInZpX2QyX3BsMCIsCi0JInZpX2QzX3BsMSIsCi0JInZpX2Q0X3BsMiIsCi0JInZpX2Q1X3BsMyIsCi0JInZpX2Q2X3BsNCIsCi0JInZpX2Q3X3BsNSIsCi0JInZpX2Q4X3BsNiIsCi0JInZpX2Q5X3BsNyIsCi0JInZpX2hzeW5jX3BkNyIsCi0JInZpX21jbGtfcHQxIiwKLQkidmlfcGNsa19wdDAiLAotCSJ2aV92c3luY19wZDYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aV9hbHQxX2dyb3Vwc1tdID0gewotCSJjYW1fbWNsa19wY2MwIiwKLQkidmlfbWNsa19wdDEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aV9hbHQyX2dyb3Vwc1tdID0gewotCSJ2aV9tY2xrX3B0MSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZpX2FsdDNfZ3JvdXBzW10gPSB7Ci0JImNhbV9tY2xrX3BjYzAiLAotCSJ2aV9tY2xrX3B0MSIsCi19OwogCiAjZGVmaW5lIEZVTkNUSU9OKGZuYW1lKQkJCQkJXAogCXsJCQkJCQlcCiAJCS5uYW1lID0gI2ZuYW1lLAkJCQlcCi0JCS5ncm91cHMgPSBmbmFtZSMjX2dyb3VwcywJCVwKLQkJLm5ncm91cHMgPSBBUlJBWV9TSVpFKGZuYW1lIyNfZ3JvdXBzKSwJXAogCX0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9mdW5jdGlvbiB0ZWdyYTMwX2Z1bmN0aW9uc1tdID0geworc3RhdGljIHN0cnVjdCB0ZWdyYV9mdW5jdGlvbiB0ZWdyYTMwX2Z1bmN0aW9uc1tdID0gewogCUZVTkNUSU9OKGJsaW5rKSwKIAlGVU5DVElPTihjZWMpLAogCUZVTkNUSU9OKGNsa18xMm1fb3V0KSwKQEAgLTMzNDUsMTEgKzIxMDUsMTEgQEAKIAlGVU5DVElPTih2aV9hbHQzKSwKIH07CiAKLSNkZWZpbmUgRFJWX1BJTkdST1VQX1JFR19BCTB4ODY4CS8qIGJhbmsgMCAqLwotI2RlZmluZSBQSU5HUk9VUF9SRUdfQQkJMHgzMDAwCS8qIGJhbmsgMSAqLworI2RlZmluZSBEUlZfUElOR1JPVVBfUkVHX0EJCTB4ODY4CS8qIGJhbmsgMCAqLworI2RlZmluZSBQSU5HUk9VUF9SRUdfQQkJCTB4MzAwMAkvKiBiYW5rIDEgKi8KIAotI2RlZmluZSBQSU5HUk9VUF9SRUdfWShyKSAoKHIpIC0gUElOR1JPVVBfUkVHX0EpCi0jZGVmaW5lIFBJTkdST1VQX1JFR19OKHIpIC0xCisjZGVmaW5lIFBJTkdST1VQX1JFR19ZKHIpCQkoKHIpIC0gUElOR1JPVVBfUkVHX0EpCisjZGVmaW5lIFBJTkdST1VQX1JFR19OKHIpCQktMQogCiAjZGVmaW5lIFBJTkdST1VQKHBnX25hbWUsIGYwLCBmMSwgZjIsIGYzLCBmX3NhZmUsIHIsIG9kLCBpb3IpCVwKIAl7CQkJCQkJCVwKQEAgLTMzNTcsMTIgKzIxMTcsMTIgQEAKIAkJLnBpbnMgPSBwZ19uYW1lIyNfcGlucywJCQkJXAogCQkubnBpbnMgPSBBUlJBWV9TSVpFKHBnX25hbWUjI19waW5zKSwJCVwKIAkJLmZ1bmNzID0gewkJCQkJXAotCQkJVEVHUkFfTVVYXyAjIyBmMCwJCQlcCi0JCQlURUdSQV9NVVhfICMjIGYxLAkJCVwKLQkJCVRFR1JBX01VWF8gIyMgZjIsCQkJXAotCQkJVEVHUkFfTVVYXyAjIyBmMywJCQlcCisJCQlURUdSQV9NVVhfIyNmMCwJCQkJXAorCQkJVEVHUkFfTVVYXyMjZjEsCQkJCVwKKwkJCVRFR1JBX01VWF8jI2YyLAkJCQlcCisJCQlURUdSQV9NVVhfIyNmMywJCQkJXAogCQl9LAkJCQkJCVwKLQkJLmZ1bmNfc2FmZSA9IFRFR1JBX01VWF8gIyMgZl9zYWZlLAkJXAorCQkuZnVuY19zYWZlID0gVEVHUkFfTVVYXyMjZl9zYWZlLAkJXAogCQkubXV4X3JlZyA9IFBJTkdST1VQX1JFR19ZKHIpLAkJCVwKIAkJLm11eF9iYW5rID0gMSwJCQkJCVwKIAkJLm11eF9iaXQgPSAwLAkJCQkJXApAQCAtMzM4OSw2ICsyMTQ5LDkgQEAKIAkJLmRydnR5cGVfcmVnID0gLTEsCQkJCVwKIAl9CiAKKyNkZWZpbmUgRFJWX1BJTkdST1VQX1JFR19ZKHIpCQkoKHIpIC0gRFJWX1BJTkdST1VQX1JFR19BKQorI2RlZmluZSBEUlZfUElOR1JPVVBfUkVHX04ocikJCS0xCisKICNkZWZpbmUgRFJWX1BJTkdST1VQKHBnX25hbWUsIHIsIGhzbV9iLCBzY2htaXR0X2IsIGxwbWRfYiwJXAogCQkgICAgIGRydmRuX2IsIGRydmRuX3csIGRydnVwX2IsIGRydnVwX3csCVwKIAkJICAgICBzbHdyX2IsIHNsd3Jfdywgc2x3Zl9iLCBzbHdmX3cpCQlcCkBAIC0zNDA0LDcgKzIxNjcsNyBAQAogCQkubG9ja19yZWcgPSAtMSwJCQkJCVwKIAkJLmlvcmVzZXRfcmVnID0gLTEsCQkJCVwKIAkJLnJjdl9zZWxfcmVnID0gLTEsCQkJCVwKLQkJLmRydl9yZWcgPSAoKHIpIC0gRFJWX1BJTkdST1VQX1JFR19BKSwJCVwKKwkJLmRydl9yZWcgPSBEUlZfUElOR1JPVVBfUkVHX1kociksCQlcCiAJCS5kcnZfYmFuayA9IDAsCQkJCQlcCiAJCS5oc21fYml0ID0gaHNtX2IsCQkJCVwKIAkJLnNjaG1pdHRfYml0ID0gc2NobWl0dF9iLAkJCVwKQEAgLTM0MjIsNyArMjE4NSw2IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdGVncmFfcGluZ3JvdXAgdGVncmEzMF9ncm91cHNbXSA9IHsKIAkvKiAgICAgICBwZ19uYW1lLCAgICAgICAgICAgICAgZjAsICAgICAgICAgICBmMSwgICAgICAgICAgIGYyLCAgICAgICAgICAgZjMsICAgICAgICAgICBzYWZlLCAgICAgICAgIHIsICAgICAgb2QsIGlvciAqLwotCS8qIEZJWE1FOiBGaWxsIGluIGNvcnJlY3QgZGF0YSBpbiBzYWZlIGNvbHVtbiAqLwogCVBJTkdST1VQKGNsa18zMmtfb3V0X3BhMCwgICAgICBCTElOSywgICAgICAgIFJTVkQyLCAgICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgIFJTVkQ0LCAgICAgICAgMHgzMzFjLCBOLCBOKSwKIAlQSU5HUk9VUCh1YXJ0M19jdHNfbl9wYTEsICAgICAgVUFSVEMsICAgICAgICBSU1ZEMiwgICAgICAgIEdNSSwgICAgICAgICAgUlNWRDQsICAgICAgICBSU1ZENCwgICAgICAgIDB4MzE3YywgTiwgTiksCiAJUElOR1JPVVAoZGFwMl9mc19wYTIsICAgICAgICAgIEkyUzEsICAgICAgICAgSERBLCAgICAgICAgICBSU1ZEMywgICAgICAgIEdNSSwgICAgICAgICAgUlNWRDMsICAgICAgICAweDMzNTgsIE4sIE4pLApAQCAtMzczNSw2ICsyNDk3LDcgQEAKIAl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTMwLXBpbm11eCIsIH0sCiAJeyB9LAogfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRlZ3JhMzBfcGluY3RybF9vZl9tYXRjaCk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRlZ3JhMzBfcGluY3RybF9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKQEAgLTM3NDUsMjAgKzI1MDgsOCBAQAogCS5wcm9iZSA9IHRlZ3JhMzBfcGluY3RybF9wcm9iZSwKIAkucmVtb3ZlID0gdGVncmFfcGluY3RybF9yZW1vdmUsCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCB0ZWdyYTMwX3BpbmN0cmxfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRlZ3JhMzBfcGluY3RybF9kcml2ZXIpOwotfQotYXJjaF9pbml0Y2FsbCh0ZWdyYTMwX3BpbmN0cmxfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB0ZWdyYTMwX3BpbmN0cmxfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0ZWdyYTMwX3BpbmN0cmxfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KHRlZ3JhMzBfcGluY3RybF9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodGVncmEzMF9waW5jdHJsX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIlN0ZXBoZW4gV2FycmVuIDxzd2FycmVuQG52aWRpYS5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIk5WSURJQSBUZWdyYTMwIHBpbmN0cmwgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB0ZWdyYTMwX3BpbmN0cmxfb2ZfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5MC5jIGIvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5MC5jCmluZGV4IGMzODFhZTYuLjQ4MDkzNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvcGZjLXI4YTc3OTAuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3NzkwLmMKQEAgLTIyNjAsNiArMjI2MCw0MiBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfdHhfbXV4W10gPSB7CiAJTVNJT0YwX1RYRF9NQVJLLAogfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfY2xrX2JfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDEsIDIzKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9jbGtfYl9tdXhbXSA9IHsKKwlNU0lPRjBfU0NLX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9zczFfYl9waW5zW10gPSB7CisJLyogU1MxICovCisJUkNBUl9HUF9QSU4oMSwgMTIpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3NzMV9iX211eFtdID0geworCU1TSU9GMF9TUzFfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3NzMl9iX3BpbnNbXSA9IHsKKwkvKiBTUzIgKi8KKwlSQ0FSX0dQX1BJTigxLCAxMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfc3MyX2JfbXV4W10gPSB7CisJTVNJT0YwX1NTMl9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfcnhfYl9waW5zW10gPSB7CisJLyogUlhEICovCisJUkNBUl9HUF9QSU4oMSwgMjkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3J4X2JfbXV4W10gPSB7CisJTVNJT0YwX1JYRF9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfdHhfYl9waW5zW10gPSB7CisJLyogVFhEICovCisJUkNBUl9HUF9QSU4oMSwgMjgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3R4X2JfbXV4W10gPSB7CisJTVNJT0YwX1RYRF9CX01BUkssCit9OwogLyogLSBNU0lPRjEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19waW5zW10gPSB7CiAJLyogU0NLICovCkBAIC0yMzAzLDYgKzIzMzksNDIgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3R4X211eFtdID0gewogCU1TSU9GMV9UWERfTUFSSywKIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19iX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTigxLCAxNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfY2xrX2JfbXV4W10gPSB7CisJTVNJT0YxX1NDS19CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3MxX2JfcGluc1tdID0geworCS8qIFNTMSAqLworCVJDQVJfR1BfUElOKDAsIDE4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9zczFfYl9tdXhbXSA9IHsKKwlNU0lPRjFfU1MxX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9zczJfYl9waW5zW10gPSB7CisJLyogU1MyICovCisJUkNBUl9HUF9QSU4oMCwgMTkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3NzMl9iX211eFtdID0geworCU1TSU9GMV9TUzJfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3J4X2JfcGluc1tdID0geworCS8qIFJYRCAqLworCVJDQVJfR1BfUElOKDEsIDE3KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9yeF9iX211eFtdID0geworCU1TSU9GMV9SWERfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3R4X2JfcGluc1tdID0geworCS8qIFRYRCAqLworCVJDQVJfR1BfUElOKDAsIDIwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV90eF9iX211eFtdID0geworCU1TSU9GMV9UWERfQl9NQVJLLAorfTsKIC8qIC0gTVNJT0YyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9jbGtfcGluc1tdID0gewogCS8qIFNDSyAqLwpAQCAtMjM4OSw2ICsyNDYxLDU4IEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mM190eF9tdXhbXSA9IHsKIAlNU0lPRjNfVFhEX01BUkssCiB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mM19jbGtfYl9waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oMCwgMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjNfY2xrX2JfbXV4W10gPSB7CisJTVNJT0YzX1NDS19CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjNfc3luY19iX3BpbnNbXSA9IHsKKwkvKiBTWU5DICovCisJUkNBUl9HUF9QSU4oMCwgMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjNfc3luY19iX211eFtdID0geworCU1TSU9GM19TWU5DX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mM19yeF9iX3BpbnNbXSA9IHsKKwkvKiBSWEQgKi8KKwlSQ0FSX0dQX1BJTigwLCAyKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mM19yeF9iX211eFtdID0geworCU1TSU9GM19SWERfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YzX3R4X2JfcGluc1tdID0geworCS8qIFRYRCAqLworCVJDQVJfR1BfUElOKDAsIDMpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YzX3R4X2JfbXV4W10gPSB7CisJTVNJT0YzX1RYRF9CX01BUkssCit9OworLyogLSBRU1BJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9jdHJsX3BpbnNbXSA9IHsKKwkvKiBTUENMSywgU1NMICovCisJUkNBUl9HUF9QSU4oMSwgNCksIFJDQVJfR1BfUElOKDEsIDkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9jdHJsX211eFtdID0geworCVNQQ0xLX01BUkssIFNTTF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9kYXRhMl9waW5zW10gPSB7CisJLyogTU9TSV9JTzAsIE1JU09fSU8xICovCisJUkNBUl9HUF9QSU4oMSwgNSksIFJDQVJfR1BfUElOKDEsIDYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9kYXRhMl9tdXhbXSA9IHsKKwlNT1NJX0lPMF9NQVJLLCBNSVNPX0lPMV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9kYXRhNF9waW5zW10gPSB7CisJLyogTU9TSV9JTzAsIE1JU09fSU8xLCBJTzIsIElPMyAqLworCVJDQVJfR1BfUElOKDEsIDUpLCBSQ0FSX0dQX1BJTigxLCA2KSwgUkNBUl9HUF9QSU4oMSwgNyksCisJUkNBUl9HUF9QSU4oMSwgOCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2RhdGE0X211eFtdID0geworCU1PU0lfSU8wX01BUkssIE1JU09fSU8xX01BUkssIElPMl9NQVJLLCBJTzNfTUFSSywKK307CiAvKiAtIFNDSUYwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMF9kYXRhX3BpbnNbXSA9IHsKIAkvKiBSWCwgVFggKi8KQEAgLTMyMzEsNiArMzM1NSwxMyBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1c2IwX211eFtdID0gewogCVVTQjBfUFdFTl9NQVJLLCBVU0IwX09WQ19WQlVTX01BUkssCiB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1c2IwX292Y192YnVzX3BpbnNbXSA9IHsKKwkvKiBPVkMvVkJVUyAqLworCVJDQVJfR1BfUElOKDUsIDE5KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVzYjBfb3ZjX3ZidXNfbXV4W10gPSB7CisJVVNCMF9PVkNfVkJVU19NQVJLLAorfTsKIC8qIC0gVVNCMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVzYjFfcGluc1tdID0gewogCS8qIFBXRU4sIE9WQyAqLwpAQCAtMzY1MywxMiArMzc4NCwyMiBAQAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3NzMiksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfcngpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3R4KSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9jbGtfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfc3MxX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3NzMl9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9yeF9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF90eF9iKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9jbGspLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3N5bmMpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3NzMSksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3MyKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9yeCksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfdHgpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX2Nsa19iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9zczFfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3MyX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3J4X2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3R4X2IpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX2NsayksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfc3luYyksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfc3MxKSwKQEAgLTM2NzEsNiArMzgxMiwxMyBAQAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YzX3NzMiksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjNfcngpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YzX3R4KSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mM19jbGtfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjNfc3luY19iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mM19yeF9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mM190eF9iKSwKKwlTSF9QRkNfUElOX0dST1VQKHFzcGlfY3RybCksCisJU0hfUEZDX1BJTl9HUk9VUChxc3BpX2RhdGEyKSwKKwlTSF9QRkNfUElOX0dST1VQKHFzcGlfZGF0YTQpLAogCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjBfZGF0YSksCiAJU0hfUEZDX1BJTl9HUk9VUChzY2lmMF9jbGspLAogCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjBfY3RybCksCkBAIC0zNzg5LDYgKzM5MzcsNyBAQAogCVNIX1BGQ19QSU5fR1JPVVAodHB1MF90bzIpLAogCVNIX1BGQ19QSU5fR1JPVVAodHB1MF90bzMpLAogCVNIX1BGQ19QSU5fR1JPVVAodXNiMCksCisJU0hfUEZDX1BJTl9HUk9VUCh1c2IwX292Y192YnVzKSwKIAlTSF9QRkNfUElOX0dST1VQKHVzYjEpLAogCVNIX1BGQ19QSU5fR1JPVVAodXNiMiksCiAJVklOX0RBVEFfUElOX0dST1VQKHZpbjBfZGF0YSwgMjQpLApAQCAtMzk0MSw2ICs0MDkwLDExIEBACiAJIm1zaW9mMF9zczIiLAogCSJtc2lvZjBfcngiLAogCSJtc2lvZjBfdHgiLAorCSJtc2lvZjBfY2xrX2IiLAorCSJtc2lvZjBfc3MxX2IiLAorCSJtc2lvZjBfc3MyX2IiLAorCSJtc2lvZjBfcnhfYiIsCisJIm1zaW9mMF90eF9iIiwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXNpb2YxX2dyb3Vwc1tdID0gewpAQCAtMzk1MCw2ICs0MTA0LDExIEBACiAJIm1zaW9mMV9zczIiLAogCSJtc2lvZjFfcngiLAogCSJtc2lvZjFfdHgiLAorCSJtc2lvZjFfY2xrX2IiLAorCSJtc2lvZjFfc3MxX2IiLAorCSJtc2lvZjFfc3MyX2IiLAorCSJtc2lvZjFfcnhfYiIsCisJIm1zaW9mMV90eF9iIiwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXNpb2YyX2dyb3Vwc1tdID0gewpAQCAtMzk2OCw2ICs0MTI3LDE2IEBACiAJIm1zaW9mM19zczIiLAogCSJtc2lvZjNfcngiLAogCSJtc2lvZjNfdHgiLAorCSJtc2lvZjNfY2xrX2IiLAorCSJtc2lvZjNfc3luY19iIiwKKwkibXNpb2YzX3J4X2IiLAorCSJtc2lvZjNfdHhfYiIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFzcGlfZ3JvdXBzW10gPSB7CisJInFzcGlfY3RybCIsCisJInFzcGlfZGF0YTIiLAorCSJxc3BpX2RhdGE0IiwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2NpZjBfZ3JvdXBzW10gPSB7CkBAIC00MTM0LDYgKzQzMDMsNyBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVzYjBfZ3JvdXBzW10gPSB7CiAJInVzYjAiLAorCSJ1c2IwX292Y192YnVzIiwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdXNiMV9ncm91cHNbXSA9IHsKQEAgLTQyMTMsNiArNDM4Myw3IEBACiAJU0hfUEZDX0ZVTkNUSU9OKG1zaW9mMSksCiAJU0hfUEZDX0ZVTkNUSU9OKG1zaW9mMiksCiAJU0hfUEZDX0ZVTkNUSU9OKG1zaW9mMyksCisJU0hfUEZDX0ZVTkNUSU9OKHFzcGkpLAogCVNIX1BGQ19GVU5DVElPTihzY2lmMCksCiAJU0hfUEZDX0ZVTkNUSU9OKHNjaWYxKSwKIAlTSF9QRkNfRlVOQ1RJT04oc2NpZjIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5MS5jIGIvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5MS5jCmluZGV4IDU2N2Q2OTEuLjUxODZkNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvcGZjLXI4YTc3OTEuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3NzkxLmMKQEAgLTE5NDUsNiArMTk0NSw1MCBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmM0X2NfbXV4W10gPSB7CiAJU0NMNF9DX01BUkssIFNEQTRfQ19NQVJLLAogfTsKKy8qIC0gSTJDNyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyYzdfcGluc1tdID0geworCS8qIFNDTCwgU0RBICovCisJUkNBUl9HUF9QSU4oNSwgMTUpLCBSQ0FSX0dQX1BJTig1LCAxNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmM3X211eFtdID0geworCVNDTDdfTUFSSywgU0RBN19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjN19iX3BpbnNbXSA9IHsKKwkvKiBTQ0wsIFNEQSAqLworCVJDQVJfR1BfUElOKDIsIDIpLCBSQ0FSX0dQX1BJTigyLCAzKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyYzdfYl9tdXhbXSA9IHsKKwlTQ0w3X0JfTUFSSywgU0RBN19CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmM3X2NfcGluc1tdID0geworCS8qIFNDTCwgU0RBICovCisJUkNBUl9HUF9QSU4oNiwgMjgpLCBSQ0FSX0dQX1BJTig2LCAyOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmM3X2NfbXV4W10gPSB7CisJU0NMN19DX01BUkssIFNEQTdfQ19NQVJLLAorfTsKKy8qIC0gSTJDOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyYzhfcGluc1tdID0geworCS8qIFNDTCwgU0RBICovCisJUkNBUl9HUF9QSU4oNCwgMTMpLCBSQ0FSX0dQX1BJTig0LCAxNCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmM4X211eFtdID0geworCVNDTDhfTUFSSywgU0RBOF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjOF9iX3BpbnNbXSA9IHsKKwkvKiBTQ0wsIFNEQSAqLworCVJDQVJfR1BfUElOKDIsIDQpLCBSQ0FSX0dQX1BJTigyLCA1KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyYzhfYl9tdXhbXSA9IHsKKwlTQ0w4X0JfTUFSSywgU0RBOF9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmM4X2NfcGluc1tdID0geworCS8qIFNDTCwgU0RBICovCisJUkNBUl9HUF9QSU4oNiwgMjIpLCBSQ0FSX0dQX1BJTig2LCAyMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmM4X2NfbXV4W10gPSB7CisJU0NMOF9DX01BUkssIFNEQThfQ19NQVJLLAorfTsKIC8qIC0gSU5UQyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGludGNfaXJxMF9waW5zW10gPSB7CiAJLyogSVJRICovCkBAIC0yMDUxLDYgKzIwOTUsOTIgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3R4X211eFtdID0gewogCU1TSU9GMF9UWERfTUFSSywKIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX2Nsa19iX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTigwLCAxNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfY2xrX2JfbXV4W10gPSB7CisJTVNJT0YwX1NDS19CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfc3luY19iX3BpbnNbXSA9IHsKKwkvKiBTWU5DICovCisJUkNBUl9HUF9QSU4oMCwgMTcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3N5bmNfYl9tdXhbXSA9IHsKKwlNU0lPRjBfU1lOQ19CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfc3MxX2JfcGluc1tdID0geworCS8qIFNTMSAqLworCVJDQVJfR1BfUElOKDAsIDE4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9zczFfYl9tdXhbXSA9IHsKKwlNU0lPRjBfU1MxX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9zczJfYl9waW5zW10gPSB7CisJLyogU1MyICovCisJUkNBUl9HUF9QSU4oMCwgMTkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3NzMl9iX211eFtdID0geworCU1TSU9GMF9TUzJfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3J4X2JfcGluc1tdID0geworCS8qIFJYRCAqLworCVJDQVJfR1BfUElOKDAsIDIxKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9yeF9iX211eFtdID0geworCU1TSU9GMF9SWERfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3R4X2JfcGluc1tdID0geworCS8qIFRYRCAqLworCVJDQVJfR1BfUElOKDAsIDIwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF90eF9iX211eFtdID0geworCU1TSU9GMF9UWERfQl9NQVJLLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfY2xrX2NfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDUsIDI2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9jbGtfY19tdXhbXSA9IHsKKwlNU0lPRjBfU0NLX0NfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9zeW5jX2NfcGluc1tdID0geworCS8qIFNZTkMgKi8KKwlSQ0FSX0dQX1BJTig1LCAyNSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfc3luY19jX211eFtdID0geworCU1TSU9GMF9TWU5DX0NfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9zczFfY19waW5zW10gPSB7CisJLyogU1MxICovCisJUkNBUl9HUF9QSU4oNSwgMjcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3NzMV9jX211eFtdID0geworCU1TSU9GMF9TUzFfQ19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3NzMl9jX3BpbnNbXSA9IHsKKwkvKiBTUzIgKi8KKwlSQ0FSX0dQX1BJTig1LCAyOCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfc3MyX2NfbXV4W10gPSB7CisJTVNJT0YwX1NTMl9DX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfcnhfY19waW5zW10gPSB7CisJLyogUlhEICovCisJUkNBUl9HUF9QSU4oNSwgMjkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3J4X2NfbXV4W10gPSB7CisJTVNJT0YwX1JYRF9DX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfdHhfY19waW5zW10gPSB7CisJLyogVFhEICovCisJUkNBUl9HUF9QSU4oNSwgMzApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3R4X2NfbXV4W10gPSB7CisJTVNJT0YwX1RYRF9DX01BUkssCit9OwogLyogLSBNU0lPRjEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19waW5zW10gPSB7CiAJLyogU0NLICovCkBAIC0yMDk0LDYgKzIyMjQsMTQzIEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV90eF9tdXhbXSA9IHsKIAlNU0lPRjFfVFhEX01BUkssCiB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9jbGtfYl9waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oMiwgMjkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19iX211eFtdID0geworCU1TSU9GMV9TQ0tfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3N5bmNfYl9waW5zW10gPSB7CisJLyogU1lOQyAqLworCVJDQVJfR1BfUElOKDIsIDMwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9zeW5jX2JfbXV4W10gPSB7CisJTVNJT0YxX1NZTkNfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3NzMV9iX3BpbnNbXSA9IHsKKwkvKiBTUzEgKi8KKwlSQ0FSX0dQX1BJTigyLCAzMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3MxX2JfbXV4W10gPSB7CisJTVNJT0YxX1NTMV9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3MyX2JfcGluc1tdID0geworCS8qIFNTMiAqLworCVJDQVJfR1BfUElOKDcsIDE2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9zczJfYl9tdXhbXSA9IHsKKwlNU0lPRjFfU1MyX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9yeF9iX3BpbnNbXSA9IHsKKwkvKiBSWEQgKi8KKwlSQ0FSX0dQX1BJTig3LCAxOCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfcnhfYl9tdXhbXSA9IHsKKwlNU0lPRjFfUlhEX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV90eF9iX3BpbnNbXSA9IHsKKwkvKiBUWEQgKi8KKwlSQ0FSX0dQX1BJTig3LCAxNyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfdHhfYl9tdXhbXSA9IHsKKwlNU0lPRjFfVFhEX0JfTUFSSywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19jX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTigyLCAxNSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfY2xrX2NfbXV4W10gPSB7CisJTVNJT0YxX1NDS19DX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3luY19jX3BpbnNbXSA9IHsKKwkvKiBTWU5DICovCisJUkNBUl9HUF9QSU4oMiwgMTYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3N5bmNfY19tdXhbXSA9IHsKKwlNU0lPRjFfU1lOQ19DX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfcnhfY19waW5zW10gPSB7CisJLyogUlhEICovCisJUkNBUl9HUF9QSU4oMiwgMTgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3J4X2NfbXV4W10gPSB7CisJTVNJT0YxX1JYRF9DX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfdHhfY19waW5zW10gPSB7CisJLyogVFhEICovCisJUkNBUl9HUF9QSU4oMiwgMTcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3R4X2NfbXV4W10gPSB7CisJTVNJT0YxX1RYRF9DX01BUkssCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9jbGtfZF9waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oMCwgMjgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19kX211eFtdID0geworCU1TSU9GMV9TQ0tfRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3N5bmNfZF9waW5zW10gPSB7CisJLyogU1lOQyAqLworCVJDQVJfR1BfUElOKDAsIDMwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9zeW5jX2RfbXV4W10gPSB7CisJTVNJT0YxX1NZTkNfRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3NzMV9kX3BpbnNbXSA9IHsKKwkvKiBTUzEgKi8KKwlSQ0FSX0dQX1BJTigwLCAyOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3MxX2RfbXV4W10gPSB7CisJTVNJT0YxX1NTMV9EX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfcnhfZF9waW5zW10gPSB7CisJLyogUlhEICovCisJUkNBUl9HUF9QSU4oMCwgMjcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3J4X2RfbXV4W10gPSB7CisJTVNJT0YxX1JYRF9EX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfdHhfZF9waW5zW10gPSB7CisJLyogVFhEICovCisJUkNBUl9HUF9QSU4oMCwgMjYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3R4X2RfbXV4W10gPSB7CisJTVNJT0YxX1RYRF9EX01BUkssCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9jbGtfZV9waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oNSwgMTgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19lX211eFtdID0geworCU1TSU9GMV9TQ0tfRV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3N5bmNfZV9waW5zW10gPSB7CisJLyogU1lOQyAqLworCVJDQVJfR1BfUElOKDUsIDE5KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9zeW5jX2VfbXV4W10gPSB7CisJTVNJT0YxX1NZTkNfRV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3J4X2VfcGluc1tdID0geworCS8qIFJYRCAqLworCVJDQVJfR1BfUElOKDUsIDE3KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9yeF9lX211eFtdID0geworCU1TSU9GMV9SWERfRV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3R4X2VfcGluc1tdID0geworCS8qIFRYRCAqLworCVJDQVJfR1BfUElOKDUsIDIwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV90eF9lX211eFtdID0geworCU1TSU9GMV9UWERfRV9NQVJLLAorfTsKIC8qIC0gTVNJT0YyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9jbGtfcGluc1tdID0gewogCS8qIFNDSyAqLwpAQCAtMjEzNyw2ICsyNDA0LDE5NyBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfdHhfbXV4W10gPSB7CiAJTVNJT0YyX1RYRF9NQVJLLAogfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfY2xrX2JfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDMsIDApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX2Nsa19iX211eFtdID0geworCU1TSU9GMl9TQ0tfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3N5bmNfYl9waW5zW10gPSB7CisJLyogU1lOQyAqLworCVJDQVJfR1BfUElOKDMsIDEpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3N5bmNfYl9tdXhbXSA9IHsKKwlNU0lPRjJfU1lOQ19CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfc3MxX2JfcGluc1tdID0geworCS8qIFNTMSAqLworCVJDQVJfR1BfUElOKDMsIDgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3NzMV9iX211eFtdID0geworCU1TSU9GMl9TUzFfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3NzMl9iX3BpbnNbXSA9IHsKKwkvKiBTUzIgKi8KKwlSQ0FSX0dQX1BJTigzLCA5KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9zczJfYl9tdXhbXSA9IHsKKwlNU0lPRjJfU1MyX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9yeF9iX3BpbnNbXSA9IHsKKwkvKiBSWEQgKi8KKwlSQ0FSX0dQX1BJTigzLCAxNyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfcnhfYl9tdXhbXSA9IHsKKwlNU0lPRjJfUlhEX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl90eF9iX3BpbnNbXSA9IHsKKwkvKiBUWEQgKi8KKwlSQ0FSX0dQX1BJTigzLCAxNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfdHhfYl9tdXhbXSA9IHsKKwlNU0lPRjJfVFhEX0JfTUFSSywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX2Nsa19jX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTigyLCAyKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9jbGtfY19tdXhbXSA9IHsKKwlNU0lPRjJfU0NLX0NfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9zeW5jX2NfcGluc1tdID0geworCS8qIFNZTkMgKi8KKwlSQ0FSX0dQX1BJTigyLCAzKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9zeW5jX2NfbXV4W10gPSB7CisJTVNJT0YyX1NZTkNfQ19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3J4X2NfcGluc1tdID0geworCS8qIFJYRCAqLworCVJDQVJfR1BfUElOKDIsIDUpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3J4X2NfbXV4W10gPSB7CisJTVNJT0YyX1JYRF9DX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfdHhfY19waW5zW10gPSB7CisJLyogVFhEICovCisJUkNBUl9HUF9QSU4oMiwgNCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfdHhfY19tdXhbXSA9IHsKKwlNU0lPRjJfVFhEX0NfTUFSSywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX2Nsa19kX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTigyLCAxNCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfY2xrX2RfbXV4W10gPSB7CisJTVNJT0YyX1NDS19EX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfc3luY19kX3BpbnNbXSA9IHsKKwkvKiBTWU5DICovCisJUkNBUl9HUF9QSU4oMiwgMTUpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3N5bmNfZF9tdXhbXSA9IHsKKwlNU0lPRjJfU1lOQ19EX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfc3MxX2RfcGluc1tdID0geworCS8qIFNTMSAqLworCVJDQVJfR1BfUElOKDIsIDE3KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9zczFfZF9tdXhbXSA9IHsKKwlNU0lPRjJfU1MxX0RfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9zczJfZF9waW5zW10gPSB7CisJLyogU1MyICovCisJUkNBUl9HUF9QSU4oMiwgMTkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3NzMl9kX211eFtdID0geworCU1TSU9GMl9TUzJfRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3J4X2RfcGluc1tdID0geworCS8qIFJYRCAqLworCVJDQVJfR1BfUElOKDIsIDE4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9yeF9kX211eFtdID0geworCU1TSU9GMl9SWERfRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3R4X2RfcGluc1tdID0geworCS8qIFRYRCAqLworCVJDQVJfR1BfUElOKDIsIDE2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl90eF9kX211eFtdID0geworCU1TSU9GMl9UWERfRF9NQVJLLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfY2xrX2VfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDcsIDE1KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9jbGtfZV9tdXhbXSA9IHsKKwlNU0lPRjJfU0NLX0VfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9zeW5jX2VfcGluc1tdID0geworCS8qIFNZTkMgKi8KKwlSQ0FSX0dQX1BJTig3LCAxNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfc3luY19lX211eFtdID0geworCU1TSU9GMl9TWU5DX0VfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9yeF9lX3BpbnNbXSA9IHsKKwkvKiBSWEQgKi8KKwlSQ0FSX0dQX1BJTig3LCAxNCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfcnhfZV9tdXhbXSA9IHsKKwlNU0lPRjJfUlhEX0VfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl90eF9lX3BpbnNbXSA9IHsKKwkvKiBUWEQgKi8KKwlSQ0FSX0dQX1BJTig3LCAxMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfdHhfZV9tdXhbXSA9IHsKKwlNU0lPRjJfVFhEX0VfTUFSSywKK307CisvKiAtIFFTUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2N0cmxfcGluc1tdID0geworCS8qIFNQQ0xLLCBTU0wgKi8KKwlSQ0FSX0dQX1BJTigxLCA0KSwgUkNBUl9HUF9QSU4oMSwgOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2N0cmxfbXV4W10gPSB7CisJU1BDTEtfTUFSSywgU1NMX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2RhdGEyX3BpbnNbXSA9IHsKKwkvKiBNT1NJX0lPMCwgTUlTT19JTzEgKi8KKwlSQ0FSX0dQX1BJTigxLCA1KSwgUkNBUl9HUF9QSU4oMSwgNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2RhdGEyX211eFtdID0geworCU1PU0lfSU8wX01BUkssIE1JU09fSU8xX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2RhdGE0X3BpbnNbXSA9IHsKKwkvKiBNT1NJX0lPMCwgTUlTT19JTzEsIElPMiwgSU8zICovCisJUkNBUl9HUF9QSU4oMSwgNSksIFJDQVJfR1BfUElOKDEsIDYpLCBSQ0FSX0dQX1BJTigxLCA3KSwKKwlSQ0FSX0dQX1BJTigxLCA4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFzcGlfZGF0YTRfbXV4W10gPSB7CisJTU9TSV9JTzBfTUFSSywgTUlTT19JTzFfTUFSSywgSU8yX01BUkssIElPM19NQVJLLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2N0cmxfYl9waW5zW10gPSB7CisJLyogU1BDTEssIFNTTCAqLworCVJDQVJfR1BfUElOKDYsIDApLCBSQ0FSX0dQX1BJTig2LCA1KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFzcGlfY3RybF9iX211eFtdID0geworCVNQQ0xLX0JfTUFSSywgU1NMX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFzcGlfZGF0YTJfYl9waW5zW10gPSB7CisJLyogTU9TSV9JTzAsIE1JU09fSU8xICovCisJUkNBUl9HUF9QSU4oNiwgMSksIFJDQVJfR1BfUElOKDYsIDIpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9kYXRhMl9iX211eFtdID0geworCU1PU0lfSU8wX0JfTUFSSywgTUlTT19JTzFfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9kYXRhNF9iX3BpbnNbXSA9IHsKKwkvKiBNT1NJX0lPMCwgTUlTT19JTzEsIElPMiwgSU8zICovCisJUkNBUl9HUF9QSU4oNiwgMSksIFJDQVJfR1BfUElOKDYsIDIpLCBSQ0FSX0dQX1BJTig2LCAzKSwKKwlSQ0FSX0dQX1BJTig2LCA0KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFzcGlfZGF0YTRfYl9tdXhbXSA9IHsKKwlTUENMS19CX01BUkssIE1PU0lfSU8wX0JfTUFSSywgTUlTT19JTzFfQl9NQVJLLAorCUlPMl9CX01BUkssIElPM19CX01BUkssIFNTTF9CX01BUkssCit9OwogLyogLSBTQ0lGMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjBfZGF0YV9waW5zW10gPSB7CiAJLyogUlgsIFRYICovCkBAIC0zMTI1LDYgKzM1ODMsMTIgQEAKIAlTSF9QRkNfUElOX0dST1VQKGkyYzQpLAogCVNIX1BGQ19QSU5fR1JPVVAoaTJjNF9iKSwKIAlTSF9QRkNfUElOX0dST1VQKGkyYzRfYyksCisJU0hfUEZDX1BJTl9HUk9VUChpMmM3KSwKKwlTSF9QRkNfUElOX0dST1VQKGkyYzdfYiksCisJU0hfUEZDX1BJTl9HUk9VUChpMmM3X2MpLAorCVNIX1BGQ19QSU5fR1JPVVAoaTJjOCksCisJU0hfUEZDX1BJTl9HUk9VUChpMmM4X2IpLAorCVNIX1BGQ19QSU5fR1JPVVAoaTJjOF9jKSwKIAlTSF9QRkNfUElOX0dST1VQKGludGNfaXJxMCksCiAJU0hfUEZDX1BJTl9HUk9VUChpbnRjX2lycTEpLAogCVNIX1BGQ19QSU5fR1JPVVAoaW50Y19pcnEyKSwKQEAgLTMxMzksMTggKzM2MDMsNzUgQEAKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9zczIpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3J4KSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF90eCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfY2xrX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3N5bmNfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfc3MxX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3NzMl9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9yeF9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF90eF9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9jbGtfYyksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfc3luY19jKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9zczFfYyksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfc3MyX2MpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3J4X2MpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3R4X2MpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX2NsayksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3luYyksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3MxKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9zczIpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3J4KSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV90eCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfY2xrX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3N5bmNfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3MxX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3NzMl9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9yeF9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV90eF9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9jbGtfYyksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3luY19jKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9yeF9jKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV90eF9jKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9jbGtfZCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3luY19kKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9zczFfZCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfcnhfZCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfdHhfZCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfY2xrX2UpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3N5bmNfZSksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfcnhfZSksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfdHhfZSksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfY2xrKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9zeW5jKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9zczEpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3NzMiksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfcngpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3R4KSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9jbGtfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfc3luY19iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9zczFfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfc3MyX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3J4X2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3R4X2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX2Nsa19jKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9zeW5jX2MpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3J4X2MpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3R4X2MpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX2Nsa19kKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9zeW5jX2QpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3NzMV9kKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9zczJfZCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfcnhfZCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfdHhfZCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfY2xrX2UpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3N5bmNfZSksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfcnhfZSksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfdHhfZSksCisJU0hfUEZDX1BJTl9HUk9VUChxc3BpX2N0cmwpLAorCVNIX1BGQ19QSU5fR1JPVVAocXNwaV9kYXRhMiksCisJU0hfUEZDX1BJTl9HUk9VUChxc3BpX2RhdGE0KSwKKwlTSF9QRkNfUElOX0dST1VQKHFzcGlfY3RybF9iKSwKKwlTSF9QRkNfUElOX0dST1VQKHFzcGlfZGF0YTJfYiksCisJU0hfUEZDX1BJTl9HUk9VUChxc3BpX2RhdGE0X2IpLAogCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjBfZGF0YSksCiAJU0hfUEZDX1BJTl9HUk9VUChzY2lmMF9kYXRhX2IpLAogCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjBfZGF0YV9jKSwKQEAgLTMzMzcsNiArMzg1OCwxOCBAQAogCSJpMmM0X2MiLAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmM3X2dyb3Vwc1tdID0geworCSJpMmM3IiwKKwkiaTJjN19iIiwKKwkiaTJjN19jIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjOF9ncm91cHNbXSA9IHsKKwkiaTJjOCIsCisJImkyYzhfYiIsCisJImkyYzhfYyIsCit9OworCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGludGNfZ3JvdXBzW10gPSB7CiAJImludGNfaXJxMCIsCiAJImludGNfaXJxMSIsCkBAIC0zMzU4LDYgKzM4OTEsMTggQEAKIAkibXNpb2YwX3NzMiIsCiAJIm1zaW9mMF9yeCIsCiAJIm1zaW9mMF90eCIsCisJIm1zaW9mMF9jbGtfYiIsCisJIm1zaW9mMF9zeW5jX2IiLAorCSJtc2lvZjBfc3MxX2IiLAorCSJtc2lvZjBfc3MyX2IiLAorCSJtc2lvZjBfcnhfYiIsCisJIm1zaW9mMF90eF9iIiwKKwkibXNpb2YwX2Nsa19jIiwKKwkibXNpb2YwX3N5bmNfYyIsCisJIm1zaW9mMF9zczFfYyIsCisJIm1zaW9mMF9zczJfYyIsCisJIm1zaW9mMF9yeF9jIiwKKwkibXNpb2YwX3R4X2MiLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc2lvZjFfZ3JvdXBzW10gPSB7CkBAIC0zMzY3LDYgKzM5MTIsMjUgQEAKIAkibXNpb2YxX3NzMiIsCiAJIm1zaW9mMV9yeCIsCiAJIm1zaW9mMV90eCIsCisJIm1zaW9mMV9jbGtfYiIsCisJIm1zaW9mMV9zeW5jX2IiLAorCSJtc2lvZjFfc3MxX2IiLAorCSJtc2lvZjFfc3MyX2IiLAorCSJtc2lvZjFfcnhfYiIsCisJIm1zaW9mMV90eF9iIiwKKwkibXNpb2YxX2Nsa19jIiwKKwkibXNpb2YxX3N5bmNfYyIsCisJIm1zaW9mMV9yeF9jIiwKKwkibXNpb2YxX3R4X2MiLAorCSJtc2lvZjFfY2xrX2QiLAorCSJtc2lvZjFfc3luY19kIiwKKwkibXNpb2YxX3NzMV9kIiwKKwkibXNpb2YxX3J4X2QiLAorCSJtc2lvZjFfdHhfZCIsCisJIm1zaW9mMV9jbGtfZSIsCisJIm1zaW9mMV9zeW5jX2UiLAorCSJtc2lvZjFfcnhfZSIsCisJIm1zaW9mMV90eF9lIiwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXNpb2YyX2dyb3Vwc1tdID0gewpAQCAtMzM3Niw2ICszOTQwLDM1IEBACiAJIm1zaW9mMl9zczIiLAogCSJtc2lvZjJfcngiLAogCSJtc2lvZjJfdHgiLAorCSJtc2lvZjJfY2xrX2IiLAorCSJtc2lvZjJfc3luY19iIiwKKwkibXNpb2YyX3NzMV9iIiwKKwkibXNpb2YyX3NzMl9iIiwKKwkibXNpb2YyX3J4X2IiLAorCSJtc2lvZjJfdHhfYiIsCisJIm1zaW9mMl9jbGtfYyIsCisJIm1zaW9mMl9zeW5jX2MiLAorCSJtc2lvZjJfcnhfYyIsCisJIm1zaW9mMl90eF9jIiwKKwkibXNpb2YyX2Nsa19kIiwKKwkibXNpb2YyX3N5bmNfZCIsCisJIm1zaW9mMl9zczFfZCIsCisJIm1zaW9mMl9zczJfZCIsCisJIm1zaW9mMl9yeF9kIiwKKwkibXNpb2YyX3R4X2QiLAorCSJtc2lvZjJfY2xrX2UiLAorCSJtc2lvZjJfc3luY19lIiwKKwkibXNpb2YyX3J4X2UiLAorCSJtc2lvZjJfdHhfZSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFzcGlfZ3JvdXBzW10gPSB7CisJInFzcGlfY3RybCIsCisJInFzcGlfZGF0YTIiLAorCSJxc3BpX2RhdGE0IiwKKwkicXNwaV9jdHJsX2IiLAorCSJxc3BpX2RhdGEyX2IiLAorCSJxc3BpX2RhdGE0X2IiLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzY2lmMF9ncm91cHNbXSA9IHsKQEAgLTM1NjgsMTEgKzQxNjEsMTQgQEAKIAlTSF9QRkNfRlVOQ1RJT04oaTJjMiksCiAJU0hfUEZDX0ZVTkNUSU9OKGkyYzMpLAogCVNIX1BGQ19GVU5DVElPTihpMmM0KSwKKwlTSF9QRkNfRlVOQ1RJT04oaTJjNyksCisJU0hfUEZDX0ZVTkNUSU9OKGkyYzgpLAogCVNIX1BGQ19GVU5DVElPTihpbnRjKSwKIAlTSF9QRkNfRlVOQ1RJT04obW1jKSwKIAlTSF9QRkNfRlVOQ1RJT04obXNpb2YwKSwKIAlTSF9QRkNfRlVOQ1RJT04obXNpb2YxKSwKIAlTSF9QRkNfRlVOQ1RJT04obXNpb2YyKSwKKwlTSF9QRkNfRlVOQ1RJT04ocXNwaSksCiAJU0hfUEZDX0ZVTkNUSU9OKHNjaWYwKSwKIAlTSF9QRkNfRlVOQ1RJT04oc2NpZjEpLAogCVNIX1BGQ19GVU5DVElPTihzY2lmMiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLWF0bGFzNi5jIGIvZHJpdmVycy9waW5jdHJsL3NpcmYvcGluY3RybC1hdGxhczYuYwppbmRleCAyYjlmMzIwLi5jNGRkM2Q1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLWF0bGFzNi5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtYXRsYXM2LmMKQEAgLTEsNyArMSw4IEBACiAvKgogICogcGluY3RybCBwYWRzLCBncm91cHMsIGZ1bmN0aW9ucyBmb3IgQ1NSIFNpUkZhdGxhc1ZJCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDExIENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cCBjb21wYW55LgorICogQ29weXJpZ2h0IChjKSAyMDExIC0gMjAxNCBDYW1icmlkZ2UgU2lsaWNvbiBSYWRpbyBMaW1pdGVkLCBhIENTUiBwbGMgZ3JvdXAKKyAqIGNvbXBhbnkuCiAgKgogICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIuCiAgKi8KQEAgLTUyOSw2ICs1MzAsNDAgQEAKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHVzcDBfcGluc1tdID0geyA1MSwgNTIsIDUzLCA1NCwgNTUgfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzaXJmc29jX211eG1hc2sgdXNwMF9vbmx5X3V0ZnNfbXV4bWFza1tdID0geworCXsKKwkJLmdyb3VwID0gMSwKKwkJLm1hc2sgPSBCSVQoMTkpIHwgQklUKDIwKSB8IEJJVCgyMSkgfCBCSVQoMjIpLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNpcmZzb2NfcGFkbXV4IHVzcDBfb25seV91dGZzX3BhZG11eCA9IHsKKwkubXV4bWFza19jb3VudHMgPSBBUlJBWV9TSVpFKHVzcDBfb25seV91dGZzX211eG1hc2spLAorCS5tdXhtYXNrID0gdXNwMF9vbmx5X3V0ZnNfbXV4bWFzaywKKwkuY3RybHJlZyA9IFNJUkZTT0NfUlNDX1BJTl9NVVgsCisJLmZ1bmNtYXNrID0gQklUKDEpIHwgQklUKDIpIHwgQklUKDYpLAorCS5mdW5jdmFsID0gMCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB1c3AwX29ubHlfdXRmc19waW5zW10gPSB7IDUxLCA1MiwgNTMsIDU0IH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2lyZnNvY19tdXhtYXNrIHVzcDBfb25seV91cmZzX211eG1hc2tbXSA9IHsKKwl7CisJCS5ncm91cCA9IDEsCisJCS5tYXNrID0gQklUKDE5KSB8IEJJVCgyMCkgfCBCSVQoMjEpIHwgQklUKDIzKSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaXJmc29jX3BhZG11eCB1c3AwX29ubHlfdXJmc19wYWRtdXggPSB7CisJLm11eG1hc2tfY291bnRzID0gQVJSQVlfU0laRSh1c3AwX29ubHlfdXJmc19tdXhtYXNrKSwKKwkubXV4bWFzayA9IHVzcDBfb25seV91cmZzX211eG1hc2ssCisJLmN0cmxyZWcgPSBTSVJGU09DX1JTQ19QSU5fTVVYLAorCS5mdW5jbWFzayA9IEJJVCgxKSB8IEJJVCgyKSB8IEJJVCg5KSwKKwkuZnVuY3ZhbCA9IDAsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgdXNwMF9vbmx5X3VyZnNfcGluc1tdID0geyA1MSwgNTIsIDUzLCA1NSB9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNpcmZzb2NfbXV4bWFzayB1c3AwX3VhcnRfbm9zdHJlYW1jdHJsX211eG1hc2tbXSA9IHsKIAl7CiAJCS5ncm91cCA9IDEsCkBAIC05MDUsNiArOTQwLDggQEAKIAlTSVJGU09DX1BJTl9HUk9VUCgidXNwMGdycCIsIHVzcDBfcGlucyksCiAJU0lSRlNPQ19QSU5fR1JPVVAoInVzcDBfdWFydF9ub3N0cmVhbWN0cmxfZ3JwIiwKIAkJCQkJdXNwMF91YXJ0X25vc3RyZWFtY3RybF9waW5zKSwKKwlTSVJGU09DX1BJTl9HUk9VUCgidXNwMF9vbmx5X3V0ZnNfZ3JwIiwgdXNwMF9vbmx5X3V0ZnNfcGlucyksCisJU0lSRlNPQ19QSU5fR1JPVVAoInVzcDBfb25seV91cmZzX2dycCIsIHVzcDBfb25seV91cmZzX3BpbnMpLAogCVNJUkZTT0NfUElOX0dST1VQKCJ1c3AxZ3JwIiwgdXNwMV9waW5zKSwKIAlTSVJGU09DX1BJTl9HUk9VUCgidXNwMV91YXJ0X25vc3RyZWFtY3RybF9ncnAiLAogCQkJCQl1c3AxX3VhcnRfbm9zdHJlYW1jdHJsX3BpbnMpLApAQCAtOTUzLDYgKzk5MCw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVzcDBfdWFydF9ub3N0cmVhbWN0cmxfZ3JwW10gPSB7CiAJCQkJCSJ1c3AwX3VhcnRfbm9zdHJlYW1jdHJsX2dycCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdXNwMGdycFtdID0geyAidXNwMGdycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdXNwMF9vbmx5X3V0ZnNfZ3JwW10gPSB7ICJ1c3AwX29ubHlfdXRmc19ncnAiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVzcDBfb25seV91cmZzX2dycFtdID0geyAidXNwMF9vbmx5X3VyZnNfZ3JwIiB9OworCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVzcDFncnBbXSA9IHsgInVzcDFncnAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVzcDFfdWFydF9ub3N0cmVhbWN0cmxfZ3JwW10gPSB7CiAJCQkJCSJ1c3AxX3VhcnRfbm9zdHJlYW1jdHJsX2dycCIgfTsKQEAgLTEwMDMsNiArMTA0MywxMCBAQAogCVNJUkZTT0NfUE1YX0ZVTkNUSU9OKCJ1c3AwX3VhcnRfbm9zdHJlYW1jdHJsIiwKIAkJCQkJCXVzcDBfdWFydF9ub3N0cmVhbWN0cmxfZ3JwLAogCQkJCQkJdXNwMF91YXJ0X25vc3RyZWFtY3RybF9wYWRtdXgpLAorCVNJUkZTT0NfUE1YX0ZVTkNUSU9OKCJ1c3AwX29ubHlfdXRmcyIsIHVzcDBfb25seV91dGZzX2dycCwKKwkJCQkJCXVzcDBfb25seV91dGZzX3BhZG11eCksCisJU0lSRlNPQ19QTVhfRlVOQ1RJT04oInVzcDBfb25seV91cmZzIiwgdXNwMF9vbmx5X3VyZnNfZ3JwLAorCQkJCQkJdXNwMF9vbmx5X3VyZnNfcGFkbXV4KSwKIAlTSVJGU09DX1BNWF9GVU5DVElPTigidXNwMSIsIHVzcDFncnAsIHVzcDFfcGFkbXV4KSwKIAlTSVJGU09DX1BNWF9GVU5DVElPTigidXNwMV91YXJ0X25vc3RyZWFtY3RybCIsCiAJCQkJCQl1c3AxX3VhcnRfbm9zdHJlYW1jdHJsX2dycCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtcHJpbWEyLmMgYi9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLXByaW1hMi5jCmluZGV4IGRkZTAyODUuLjhhYTc2ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtcHJpbWEyLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3NpcmYvcGluY3RybC1wcmltYTIuYwpAQCAtMSw3ICsxLDggQEAKIC8qCiAgKiBwaW5jdHJsIHBhZHMsIGdyb3VwcywgZnVuY3Rpb25zIGZvciBDU1IgU2lSRnByaW1hSUkKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgQ2FtYnJpZGdlIFNpbGljb24gUmFkaW8gTGltaXRlZCwgYSBDU1IgcGxjIGdyb3VwIGNvbXBhbnkuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgLSAyMDE0IENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cAorICogY29tcGFueS4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NpcmYvcGluY3RybC1zaXJmLmMgYi9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLXNpcmYuYwppbmRleCA2MTdhNDkxLi41ZjNhZGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLXNpcmYuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLXNpcmYuYwpAQCAtMSw3ICsxLDggQEAKIC8qCiAgKiBwaW5tdXggZHJpdmVyIGZvciBDU1IgU2lSRnByaW1hSUkKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgQ2FtYnJpZGdlIFNpbGljb24gUmFkaW8gTGltaXRlZCwgYSBDU1IgcGxjIGdyb3VwIGNvbXBhbnkuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgLSAyMDE0IENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cAorICogY29tcGFueS4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvS2NvbmZpZyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L0tjb25maWcKaW5kZXggNWFlNjVjMS4uNWY2Nzg0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvS2NvbmZpZworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9LY29uZmlnCkBAIC0yNyw4ICsyNyw2IEBACiAJZGVwZW5kcyBvbiBBQ1BJX1dNSQogCXNlbGVjdCBJTlBVVF9TUEFSU0VLTUFQCiAJIyBBY2VyIFdNSSBkZXBlbmRzIG9uIEFDUElfVklERU8gd2hlbiBBQ1BJIGlzIGVuYWJsZWQKLQkjIGJ1dCBmb3Igc2VsZWN0IHRvIHdvcmssIG5lZWQgdG8gc2VsZWN0IEFDUElfVklERU8ncyBkZXBlbmRlbmNpZXMsIGljawotICAgICAgICBzZWxlY3QgVklERU9fT1VUUFVUX0NPTlRST0wgaWYgQUNQSQogICAgICAgICBzZWxlY3QgQUNQSV9WSURFTyBpZiBBQ1BJCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgbmV3ZXIgQWNlciAoYW5kIFdpc3Ryb24pIGxhcHRvcHMuIEl0IGFkZHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2Z1aml0c3UtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9mdWppdHN1LWxhcHRvcC5jCmluZGV4IGJlMDJiY2MuLmU2ZjMzNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2Z1aml0c3UtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZnVqaXRzdS1sYXB0b3AuYwpAQCAtNjYsNyArNjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb19vdXRwdXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaWYgZGVmaW5lZChDT05GSUdfTEVEU19DTEFTUykgfHwgZGVmaW5lZChDT05GSUdfTEVEU19DTEFTU19NT0RVTEUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90aGlua3BhZF9hY3BpLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90aGlua3BhZF9hY3BpLmMKaW5kZXggZGVmYjZhZi4uOTRiYjYxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvdGhpbmtwYWRfYWNwaS5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYwpAQCAtNjc3Niw4ICs2Nzc2LDkgQEAKIAlzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGxfbXV0ZTsKIAlpbnQgcmM7CiAKLQlyYyA9IHNuZF9jYXJkX2NyZWF0ZShhbHNhX2luZGV4LCBhbHNhX2lkLCBUSElTX01PRFVMRSwKLQkJCSAgICBzaXplb2Yoc3RydWN0IHRwYWNwaV9hbHNhX2RhdGEpLCAmY2FyZCk7CisJcmMgPSBzbmRfY2FyZF9uZXcoJnRwYWNwaV9wZGV2LT5kZXYsCisJCQkgIGFsc2FfaW5kZXgsIGFsc2FfaWQsIFRISVNfTU9EVUxFLAorCQkJICBzaXplb2Yoc3RydWN0IHRwYWNwaV9hbHNhX2RhdGEpLCAmY2FyZCk7CiAJaWYgKHJjIDwgMCB8fCAhY2FyZCkgewogCQlwcl9lcnIoIkZhaWxlZCB0byBjcmVhdGUgQUxTQSBjYXJkIHN0cnVjdHVyZXM6ICVkXG4iLCByYyk7CiAJCXJldHVybiAxOwpAQCAtNjgyOCw3ICs2ODI5LDYgQEAKIAl9CiAJZGF0YS0+Y3RsX211dGVfaWQgPSAmY3RsX211dGUtPmlkOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmdHBhY3BpX3BkZXYtPmRldik7CiAJcmMgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAocmMgPCAwKSB7CiAJCXByX2VycigiRmFpbGVkIHRvIHJlZ2lzdGVyIEFMU0EgY2FyZDogJWRcbiIsIHJjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXJjYXAvaW50ZWxfcmFwbC5jIGIvZHJpdmVycy9wb3dlcmNhcC9pbnRlbF9yYXBsLmMKaW5kZXggM2M2NzY4My4uNjFiNTFlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlcmNhcC9pbnRlbF9yYXBsLmMKKysrIGIvZHJpdmVycy9wb3dlcmNhcC9pbnRlbF9yYXBsLmMKQEAgLTgzNCw3ICs4MzQsNyBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHg4Nl9jcHVfaWQgZW5lcmd5X3VuaXRfcXVpcmtfaWRzW10gPSB7Ci0JeyBYODZfVkVORE9SX0lOVEVMLCA2LCAweDM3fSwvKiBWTFYgKi8KKwl7IFg4Nl9WRU5ET1JfSU5URUwsIDYsIDB4Mzd9LC8qIFZhbGxleXZpZXcgKi8KIAl7fQogfTsKIApAQCAtOTQ3LDExICs5NDcsMTEgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCB4ODZfY3B1X2lkIHJhcGxfaWRzW10gPSB7Ci0JeyBYODZfVkVORE9SX0lOVEVMLCA2LCAweDJhfSwvKiBTTkIgKi8KLQl7IFg4Nl9WRU5ET1JfSU5URUwsIDYsIDB4MmR9LC8qIFNOQiBFUCAqLwotCXsgWDg2X1ZFTkRPUl9JTlRFTCwgNiwgMHgzN30sLyogVkxWICovCi0JeyBYODZfVkVORE9SX0lOVEVMLCA2LCAweDNhfSwvKiBJVkIgKi8KLQl7IFg4Nl9WRU5ET1JfSU5URUwsIDYsIDB4NDV9LC8qIEhTVyAqLworCXsgWDg2X1ZFTkRPUl9JTlRFTCwgNiwgMHgyYX0sLyogU2FuZHkgQnJpZGdlICovCisJeyBYODZfVkVORE9SX0lOVEVMLCA2LCAweDJkfSwvKiBTYW5keSBCcmlkZ2UgRVAgKi8KKwl7IFg4Nl9WRU5ET1JfSU5URUwsIDYsIDB4Mzd9LC8qIFZhbGxleXZpZXcgKi8KKwl7IFg4Nl9WRU5ET1JfSU5URUwsIDYsIDB4M2F9LC8qIEl2eSBCcmlkZ2UgKi8KKwl7IFg4Nl9WRU5ET1JfSU5URUwsIDYsIDB4NDV9LC8qIEhhc3dlbGwgKi8KIAkvKiBUT0RPOiBBZGQgbW9yZSBDUFUgSURzIGFmdGVyIHRlc3RpbmcgKi8KIAl7fQogfTsKQEAgLTExNDcsNiArMTE0NywxMSBAQAogCWlmIChyZG1zcmxfc2FmZV9vbl9jcHUoY3B1LCBtc3IsICZ2YWwxKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwkvKiBQUDEvdW5jb3JlL2dyYXBoaWNzIGRvbWFpbiBtYXkgbm90IGJlIGFjdGl2ZSBhdCB0aGUgdGltZSBvZgorCSAqIGRyaXZlciBsb2FkaW5nLiBTbyBza2lwIGZ1cnRoZXIgY2hlY2tzLgorCSAqLworCWlmIChkb21haW4gPT0gUkFQTF9ET01BSU5fUFAxKQorCQlyZXR1cm4gMDsKIAkvKiBlbmVyZ3kgY291bnRlcnMgcm9sbCBzbG93bHkgb24gc29tZSBkb21haW5zICovCiAJd2hpbGUgKCsrcmV0cnkgPCAxMCkgewogCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDE1MDAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yLzg4cG04MDAuYyBiL2RyaXZlcnMvcmVndWxhdG9yLzg4cG04MDAuYwppbmRleCBkMzMzZjdlLi43YTcyMWQ2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvODhwbTgwMC5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yLzg4cG04MDAuYwpAQCAtMzEwLDEwICszMTAsOCBAQAogCiAJcG04MDBfZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBtODAwX2RhdGEpLAogCQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXBtODAwX2RhdGEpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHBtODAwX3JlZ3VhbHRvcnMiKTsKKwlpZiAoIXBtODAwX2RhdGEpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXBtODAwX2RhdGEtPm1hcCA9IGNoaXAtPnN1YmNoaXAtPnJlZ21hcF9wb3dlcjsKIAlwbTgwMF9kYXRhLT5jaGlwID0gY2hpcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yLzg4cG04NjA3LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci84OHBtODYwNy5jCmluZGV4IGY3MDRkODMuLjMzNzYzNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yLzg4cG04NjA3LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvODhwbTg2MDcuYwpAQCAtMiw3ICsyLDcgQEAKICAqIFJlZ3VsYXRvcnMgZHJpdmVyIGZvciBNYXJ2ZWxsIDg4UE04NjA3CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA5IE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuCi0gKiAJSGFvamlhbiBaaHVhbmcgPGhhb2ppYW4uemh1YW5nQG1hcnZlbGwuY29tPgorICoJSGFvamlhbiBaaHVhbmcgPGhhb2ppYW4uemh1YW5nQG1hcnZlbGwuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtNzgsNyArNzgsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBCVUNLM190YWJsZVtdID0gewotICAgICAgICAgICAgICAwLCAgIDI1MDAwLCAgIDUwMDAwLCAgIDc1MDAwLCAgMTAwMDAwLCAgMTI1MDAwLCAgMTUwMDAwLCAgMTc1MDAwLAorCSAgICAgIDAsICAgMjUwMDAsICAgNTAwMDAsICAgNzUwMDAsICAxMDAwMDAsICAxMjUwMDAsICAxNTAwMDAsICAxNzUwMDAsCiAJIDIwMDAwMCwgIDIyNTAwMCwgIDI1MDAwMCwgIDI3NTAwMCwgIDMwMDAwMCwgIDMyNTAwMCwgIDM1MDAwMCwgIDM3NTAwMCwKIAkgNDAwMDAwLCAgNDI1MDAwLCAgNDUwMDAwLCAgNDc1MDAwLCAgNTAwMDAwLCAgNTI1MDAwLCAgNTUwMDAwLCAgNTc1MDAwLAogCSA2MDAwMDAsICA2MjUwMDAsICA2NTAwMDAsICA2NzUwMDAsICA3MDAwMDAsICA3MjUwMDAsICA3NTAwMDAsICA3NzUwMDAsCkBAIC04OSw3ICs4OSw3IEBACiB9OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEJVQ0szX3N1c3BlbmRfdGFibGVbXSA9IHsKLSAgICAgICAgICAgICAgMCwgICAyNTAwMCwgICA1MDAwMCwgICA3NTAwMCwgIDEwMDAwMCwgIDEyNTAwMCwgIDE1MDAwMCwgIDE3NTAwMCwKKwkgICAgICAwLCAgIDI1MDAwLCAgIDUwMDAwLCAgIDc1MDAwLCAgMTAwMDAwLCAgMTI1MDAwLCAgMTUwMDAwLCAgMTc1MDAwLAogCSAyMDAwMDAsICAyMjUwMDAsICAyNTAwMDAsICAyNzUwMDAsICAzMDAwMDAsICAzMjUwMDAsICAzNTAwMDAsICAzNzUwMDAsCiAJIDQwMDAwMCwgIDQyNTAwMCwgIDQ1MDAwMCwgIDQ3NTAwMCwgIDUwMDAwMCwgIDUyNTAwMCwgIDU1MDAwMCwgIDU3NTAwMCwKIAkgNjAwMDAwLCAgNjI1MDAwLCAgNjUwMDAwLCAgNjc1MDAwLCAgNzAwMDAwLCAgNzI1MDAwLCAgNzUwMDAwLCAgNzc1MDAwLApAQCAtMzIyLDcgKzMyMiw3IEBACiAJbnByb290ID0gb2Zfbm9kZV9nZXQocGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSk7CiAJaWYgKCFucHJvb3QpCiAJCXJldHVybiAtRU5PREVWOwotCW5wcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKG5wcm9vdCwgInJlZ3VsYXRvcnMiKTsKKwlucHJvb3QgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShucHJvb3QsICJyZWd1bGF0b3JzIik7CiAJaWYgKCFucHJvb3QpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGZpbmQgcmVndWxhdG9ycyBub2RlXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnIGIvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZwppbmRleCA2YTc5MzI4Li4xY2Q4NTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcKQEAgLTEzOSw2ICsxMzksMTQgQEAKIAkgIEFTMzcyMiBQTUlDLiBUaGlzIHdpbGwgZW5hYmxlIHN1cHBvcnQgZm9yIGFsbCB0aGUgc29mdHdhcmUKIAkgIGNvbnRyb2xsYWJsZSBEQ0RDL0xETyByZWd1bGF0b3JzLgogCitjb25maWcgUkVHVUxBVE9SX0JDTTU5MFhYCisJdHJpc3RhdGUgIkJyb2FkY29tIEJDTTU5MHh4IFBNVSBSZWd1bGF0b3JzIgorCWRlcGVuZHMgb24gTUZEX0JDTTU5MFhYCisJaGVscAorCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIHZvbHRhZ2UgcmVndWxhdG9ycyBvbiB0aGUKKwkgIEJDTTU5MHh4IFBNVXMuIFRoaXMgd2lsbCBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIHNvZnR3YXJlCisJICBjb250cm9sbGFibGUgTERPL1N3aXRjaGluZyByZWd1bGF0b3JzLgorCiBjb25maWcgUkVHVUxBVE9SX0RBOTAzWAogCXRyaXN0YXRlICJEaWFsb2cgU2VtaWNvbmR1Y3RvciBEQTkwMzAvREE5MDM0IHJlZ3VsYXRvcnMiCiAJZGVwZW5kcyBvbiBQTUlDX0RBOTAzWApAQCAtMzk5LDEyICs0MDcsMTIgQEAKIAkgb24gUENGNTA2MzMKIAogY29uZmlnIFJFR1VMQVRPUl9QRlVaRTEwMAotCXRyaXN0YXRlICJGcmVlc2NhbGUgUEZVWkUxMDAgcmVndWxhdG9yIGRyaXZlciIKKwl0cmlzdGF0ZSAiRnJlZXNjYWxlIFBGVVpFMTAwL1BGVVpFMjAwIHJlZ3VsYXRvciBkcml2ZXIiCiAJZGVwZW5kcyBvbiBJMkMKIAlzZWxlY3QgUkVHTUFQX0kyQwogCWhlbHAKLQkgIFNheSB5IGhlcmUgdG8gc3VwcG9ydCB0aGUgcmVndWxhdG9ycyBmb3VuZCBvbiB0aGUgRnJlZXNjYWxlIFBGVVpFMTAwCi0JICBQTUlDLgorCSAgU2F5IHkgaGVyZSB0byBzdXBwb3J0IHRoZSByZWd1bGF0b3JzIGZvdW5kIG9uIHRoZSBGcmVlc2NhbGUKKwkgIFBGVVpFMTAwL1BGVVpFMjAwIFBNSUMuCiAKIGNvbmZpZyBSRUdVTEFUT1JfUkM1VDU4MwogCXRyaXN0YXRlICJSSUNPSCBSQzVUNTgzIFBvd2VyIHJlZ3VsYXRvcnMiCkBAIC00MTYsMTMgKzQyNCwyMSBAQAogCSAgdGhyb3VnaCByZWd1bGF0b3IgaW50ZXJmYWNlLiBUaGUgZGV2aWNlIHN1cHBvcnRzIG11bHRpcGxlIERDREMvTERPCiAJICBvdXRwdXRzIHdoaWNoIGNhbiBiZSBjb250cm9sbGVkIGJ5IGkyYyBjb21tdW5pY2F0aW9uLgogCi1jb25maWcgUkVHVUxBVE9SX1MyTVBTMTEKLQl0cmlzdGF0ZSAiU2Ftc3VuZyBTMk1QUzExIHZvbHRhZ2UgcmVndWxhdG9yIgorY29uZmlnIFJFR1VMQVRPUl9TMk1QQTAxCisJdHJpc3RhdGUgIlNhbXN1bmcgUzJNUEEwMSB2b2x0YWdlIHJlZ3VsYXRvciIKIAlkZXBlbmRzIG9uIE1GRF9TRUNfQ09SRQogCWhlbHAKLQkgVGhpcyBkcml2ZXIgc3VwcG9ydHMgYSBTYW1zdW5nIFMyTVBTMTEgdm9sdGFnZSBvdXRwdXQgcmVndWxhdG9yCi0JIHZpYSBJMkMgYnVzLiBTMk1QUzExIGlzIGNvbXByaXNlZCBvZiBoaWdoIGVmZmljaWVudCBCdWNrIGNvbnZlcnRlcnMKLQkgaW5jbHVkaW5nIER1YWwtUGhhc2UgQnVjayBjb252ZXJ0ZXIsIEJ1Y2stQm9vc3QgY29udmVydGVyLCB2YXJpb3VzIExET3MuCisJIFRoaXMgZHJpdmVyIGNvbnRyb2xzIFNhbXN1bmcgUzJNUEEwMSB2b2x0YWdlIG91dHB1dCByZWd1bGF0b3IKKwkgdmlhIEkyQyBidXMuIFMyTVBBMDEgaGFzIDEwIEJ1Y2tzIGFuZCAyNiBMRE8gb3V0cHV0cy4KKworY29uZmlnIFJFR1VMQVRPUl9TMk1QUzExCisJdHJpc3RhdGUgIlNhbXN1bmcgUzJNUFMxMS9TMk1QUzE0IHZvbHRhZ2UgcmVndWxhdG9yIgorCWRlcGVuZHMgb24gTUZEX1NFQ19DT1JFCisJaGVscAorCSBUaGlzIGRyaXZlciBzdXBwb3J0cyBhIFNhbXN1bmcgUzJNUFMxMS9TMk1QUzE0IHZvbHRhZ2Ugb3V0cHV0CisJIHJlZ3VsYXRvciB2aWEgSTJDIGJ1cy4gVGhlIGNoaXAgaXMgY29tcHJpc2VkIG9mIGhpZ2ggZWZmaWNpZW50IEJ1Y2sKKwkgY29udmVydGVycyBpbmNsdWRpbmcgRHVhbC1QaGFzZSBCdWNrIGNvbnZlcnRlciwgQnVjay1Cb29zdCBjb252ZXJ0ZXIsCisJIHZhcmlvdXMgTERPcy4KIAogY29uZmlnIFJFR1VMQVRPUl9TNU04NzY3CiAJdHJpc3RhdGUgIlNhbXN1bmcgUzVNODc2N0Egdm9sdGFnZSByZWd1bGF0b3IiCkBAIC00MzIsNiArNDQ4LDEyIEBACiAJIHZpYSBJMkMgYnVzLiBTNU04NzY3QSBoYXZlIDkgQnVja3MgYW5kIDI4IExET3Mgb3V0cHV0IGFuZAogCSBzdXBwb3J0cyBEVlMgbW9kZSB3aXRoIDhiaXRzIG9mIG91dHB1dCB2b2x0YWdlIGNvbnRyb2wuCiAKK2NvbmZpZyBSRUdVTEFUT1JfU1RfUFdNCisJdHJpc3RhdGUgIlNUTWljcm9lbGVjdHJvbmljcyBQV00gdm9sdGFnZSByZWd1bGF0b3IiCisJZGVwZW5kcyBvbiBBUkNIX1NUSQorCWhlbHAKKwkgVGhpcyBkcml2ZXIgc3VwcG9ydHMgU1QncyBQV00gY29udHJvbGxlZCB2b2x0YWdlIHJlZ3VsYXRvcnMuCisKIGNvbmZpZyBSRUdVTEFUT1JfVElfQUJCCiAJdHJpc3RhdGUgIlRJIEFkYXB0aXZlIEJvZHkgQmlhcyBvbi1jaGlwIExETyIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUApAQCAtNTEzLDYgKzUzNSwxNSBAQAogCSAgdm9sdGFnZSByZWd1bGF0b3JzLiBJdCBzdXBwb3J0cyBzb2Z0d2FyZSBiYXNlZCB2b2x0YWdlIGNvbnRyb2wKIAkgIGZvciBkaWZmZXJlbnQgdm9sdGFnZSBkb21haW5zCiAKK2NvbmZpZyBSRUdVTEFUT1JfVFBTNjUyMTgKKwl0cmlzdGF0ZSAiVEkgVFBTNjUyMTggUG93ZXIgcmVndWxhdG9ycyIKKwlkZXBlbmRzIG9uIE1GRF9UUFM2NTIxOCAmJiBPRgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFRQUzY1MjE4IHZvbHRhZ2UgcmVndWxhdG9yIGNoaXBzLiBUUFM2NTIxOAorCSAgcHJvdmlkZXMgc2l4IHN0ZXAtZG93biBjb252ZXJ0ZXJzIGFuZCBvbmUgZ2VuZXJhbC1wdXJwb3NlIExETworCSAgdm9sdGFnZSByZWd1bGF0b3JzLiBJdCBzdXBwb3J0cyBzb2Z0d2FyZSBiYXNlZCB2b2x0YWdlIGNvbnRyb2wKKwkgIGZvciBkaWZmZXJlbnQgdm9sdGFnZSBkb21haW5zCisKIGNvbmZpZyBSRUdVTEFUT1JfVFBTNjUyNFgKIAl0cmlzdGF0ZSAiVEkgVFBTNjUyNFggUG93ZXIgcmVndWxhdG9ycyIKIAlkZXBlbmRzIG9uIFNQSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUgYi9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQppbmRleCA5NzlmOWRkLi5mMGZlMGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQpAQCAtMjAsNiArMjAsNyBAQAogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9BUklaT05BKSArPSBhcml6b25hLW1pY3N1cHAubyBhcml6b25hLWxkbzEubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9BUzM3MTEpICs9IGFzMzcxMS1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9BUzM3MjIpICs9IGFzMzcyMi1yZWd1bGF0b3Iubworb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9CQ001OTBYWCkgKz0gYmNtNTkweHgtcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfREE5MDNYKQkrPSBkYTkwM3gubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9EQTkwNTIpCSs9IGRhOTA1Mi1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9EQTkwNTUpCSs9IGRhOTA1NS1yZWd1bGF0b3IubwpAQCAtNTcsOCArNTgsMTAgQEAKIG9iai0kKENPTkZJR19SRUdVTEFUT1JfUENBUCkgKz0gcGNhcC1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9QQ0Y1MDYzMykgKz0gcGNmNTA2MzMtcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfUkM1VDU4MykgICs9IHJjNXQ1ODMtcmVndWxhdG9yLm8KK29iai0kKENPTkZJR19SRUdVTEFUT1JfUzJNUEEwMSkgKz0gczJtcGEwMS5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1MyTVBTMTEpICs9IHMybXBzMTEubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9TNU04NzY3KSArPSBzNW04NzY3Lm8KK29iai0kKENPTkZJR19SRUdVTEFUT1JfU1RfUFdNKSArPSBzdC1wd20ubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9TVFc0ODFYX1ZNTUMpICs9IHN0dzQ4MXgtdm1tYy5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1RJX0FCQikgKz0gdGktYWJiLXJlZ3VsYXRvci5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1RQUzYxMDVYKSArPSB0cHM2MTA1eC1yZWd1bGF0b3IubwpAQCAtNjcsNiArNzAsNyBAQAogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9UUFM2NTA3WCkgKz0gdHBzNjUwN3gtcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfVFBTNjUwOTApICs9IHRwczY1MDkwLXJlZ3VsYXRvci5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1RQUzY1MjE3KSArPSB0cHM2NTIxNy1yZWd1bGF0b3Iubworb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9UUFM2NTIxOCkgKz0gdHBzNjUyMTgtcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfVFBTNjUyNFgpICs9IHRwczY1MjR4LXJlZ3VsYXRvci5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1RQUzY1ODZYKSArPSB0cHM2NTg2eC1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9UUFM2NTkxMCkgKz0gdHBzNjU5MTAtcmVndWxhdG9yLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2FhdDI4NzAtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9hYXQyODcwLXJlZ3VsYXRvci5jCmluZGV4IGY3MGE5YmYuLmM4NzNlZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2FhdDI4NzAtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvYWF0Mjg3MC1yZWd1bGF0b3IuYwpAQCAtOTksNiArOTksNyBAQAogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgYWF0Mjg3MF9sZG9fb3BzID0gewogCS5saXN0X3ZvbHRhZ2UgPSByZWd1bGF0b3JfbGlzdF92b2x0YWdlX3RhYmxlLAorCS5tYXBfdm9sdGFnZSA9IHJlZ3VsYXRvcl9tYXBfdm9sdGFnZV9hc2NlbmQsCiAJLnNldF92b2x0YWdlX3NlbCA9IGFhdDI4NzBfbGRvX3NldF92b2x0YWdlX3NlbCwKIAkuZ2V0X3ZvbHRhZ2Vfc2VsID0gYWF0Mjg3MF9sZG9fZ2V0X3ZvbHRhZ2Vfc2VsLAogCS5lbmFibGUgPSBhYXQyODcwX2xkb19lbmFibGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9hY3Q4ODY1LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvYWN0ODg2NS1yZWd1bGF0b3IuYwppbmRleCAwODRjYzA4Li5iOTJkN2RkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9hY3Q4ODY1LXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2FjdDg4NjUtcmVndWxhdG9yLmMKQEAgLTYyLDcgKzYyLDYgQEAKICNkZWZpbmUJQUNUODg2NV9WT0xUQUdFX05VTQk2NAogCiBzdHJ1Y3QgYWN0ODg2NSB7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXZbQUNUODg2NV9SRUdfTlVNXTsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiB9OwogCkBAIC0yMTMsNyArMjEyLDcgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCXN0cnVjdCBhY3Q4ODY1X3JlZ3VsYXRvcl9kYXRhICpyZWd1bGF0b3I7CiAKLQlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKGRldi0+b2Zfbm9kZSwgInJlZ3VsYXRvcnMiKTsKKwlucCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKGRldi0+b2Zfbm9kZSwgInJlZ3VsYXRvcnMiKTsKIAlpZiAoIW5wKSB7CiAJCWRldl9lcnIoZGV2LCAibWlzc2luZyAncmVndWxhdG9ycycgc3Vibm9kZSBpbiBEVFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjIxLDE3ICsyMjAsMTUgQEAKIAogCW1hdGNoZWQgPSBvZl9yZWd1bGF0b3JfbWF0Y2goZGV2LCBucCwKIAkJCQlhY3Q4ODY1X21hdGNoZXMsIEFSUkFZX1NJWkUoYWN0ODg2NV9tYXRjaGVzKSk7CisJb2Zfbm9kZV9wdXQobnApOwogCWlmIChtYXRjaGVkIDw9IDApCiAJCXJldHVybiBtYXRjaGVkOwogCiAJcGRhdGEtPnJlZ3VsYXRvcnMgPSBkZXZtX2t6YWxsb2MoZGV2LAogCQkJCXNpemVvZihzdHJ1Y3QgYWN0ODg2NV9yZWd1bGF0b3JfZGF0YSkgKgogCQkJCUFSUkFZX1NJWkUoYWN0ODg2NV9tYXRjaGVzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZGF0YS0+cmVndWxhdG9ycykgewotCQlkZXZfZXJyKGRldiwgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgYWN0ODg2NSByZWdpc3RvclxuIiwKLQkJCQkJCV9fZnVuY19fKTsKKwlpZiAoIXBkYXRhLT5yZWd1bGF0b3JzKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlwZGF0YS0+bnVtX3JlZ3VsYXRvcnMgPSBtYXRjaGVkOwogCXJlZ3VsYXRvciA9IHBkYXRhLT5yZWd1bGF0b3JzOwpAQCAtMjU4LDcgKzI1NSw3IEBACiBzdGF0aWMgaW50IGFjdDg4NjVfcG1pY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmkyY19pZCkKIHsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKnJkZXY7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OwogCXN0cnVjdCBhY3Q4ODY1X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOwogCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKQEAgLTI5Miw4ICsyODksNiBAQAogCWlmICghYWN0ODg2NSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZGV2ID0gYWN0ODg2NS0+cmRldjsKLQogCWFjdDg4NjUtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJmFjdDg4NjVfcmVnbWFwX2NvbmZpZyk7CiAJaWYgKElTX0VSUihhY3Q4ODY1LT5yZWdtYXApKSB7CiAJCWVycm9yID0gUFRSX0VSUihhY3Q4ODY1LT5yZWdtYXApOwpAQCAtMzEzLDEyICszMDgsMTIgQEAKIAkJY29uZmlnLmRyaXZlcl9kYXRhID0gYWN0ODg2NTsKIAkJY29uZmlnLnJlZ21hcCA9IGFjdDg4NjUtPnJlZ21hcDsKIAotCQlyZGV2W2ldID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LAotCQkJCQkJJmFjdDg4NjVfcmVnW2ldLCAmY29uZmlnKTsKLQkJaWYgKElTX0VSUihyZGV2W2ldKSkgeworCQlyZGV2ID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmYWN0ODg2NV9yZWdbaV0sCisJCQkJCSAgICAgICAmY29uZmlnKTsKKwkJaWYgKElTX0VSUihyZGV2KSkgewogCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgJXNcbiIsCiAJCQkJYWN0ODg2NV9yZWdbaWRdLm5hbWUpOwotCQkJcmV0dXJuIFBUUl9FUlIocmRldltpXSk7CisJCQlyZXR1cm4gUFRSX0VSUihyZGV2KTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvYW5hdG9wLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvYW5hdG9wLXJlZ3VsYXRvci5jCmluZGV4IDg2MmU2M2UuLjdjMzk3YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2FuYXRvcC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9hbmF0b3AtcmVndWxhdG9yLmMKQEAgLTM0LDYgKzM0LDkgQEAKICNkZWZpbmUgTERPX1JBTVBfVVBfVU5JVF9JTl9DWUNMRVMgICAgICA2NCAvKiA2NCBjeWNsZXMgcGVyIHN0ZXAgKi8KICNkZWZpbmUgTERPX1JBTVBfVVBfRlJFUV9JTl9NSFogICAgICAgICAyNCAvKiBjeWNsZSBiYXNlZCBvbiAyNE0gT1NDICovCiAKKyNkZWZpbmUgTERPX1BPV0VSX0dBVEUJCQkweDAwCisjZGVmaW5lIExET19GRVRfRlVMTF9PTgkJCTB4MWYKKwogc3RydWN0IGFuYXRvcF9yZWd1bGF0b3IgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJdTMyIGNvbnRyb2xfcmVnOwpAQCAtNDgsMTkgKzUxLDEwIEBACiAJaW50IG1heF92b2x0YWdlOwogCXN0cnVjdCByZWd1bGF0b3JfZGVzYyByZGVzYzsKIAlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqaW5pdGRhdGE7CisJYm9vbCBieXBhc3M7CisJaW50IHNlbDsKIH07CiAKLXN0YXRpYyBpbnQgYW5hdG9wX3JlZ21hcF9zZXRfdm9sdGFnZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJlZywKLQkJCQkJdW5zaWduZWQgc2VsZWN0b3IpCi17Ci0Jc3RydWN0IGFuYXRvcF9yZWd1bGF0b3IgKmFuYXRvcF9yZWcgPSByZGV2X2dldF9kcnZkYXRhKHJlZyk7Ci0KLQlpZiAoIWFuYXRvcF9yZWctPmNvbnRyb2xfcmVnKQotCQlyZXR1cm4gLUVOT1RTVVBQOwotCi0JcmV0dXJuIHJlZ3VsYXRvcl9zZXRfdm9sdGFnZV9zZWxfcmVnbWFwKHJlZywgc2VsZWN0b3IpOwotfQotCiBzdGF0aWMgaW50IGFuYXRvcF9yZWdtYXBfc2V0X3ZvbHRhZ2VfdGltZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJlZywKIAl1bnNpZ25lZCBpbnQgb2xkX3NlbCwKIAl1bnNpZ25lZCBpbnQgbmV3X3NlbCkKQEAgLTg3LDI0ICs4MSwxMDEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGFuYXRvcF9yZWdtYXBfZ2V0X3ZvbHRhZ2Vfc2VsKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWcpCitzdGF0aWMgaW50IGFuYXRvcF9yZWdtYXBfZW5hYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWcpCit7CisJc3RydWN0IGFuYXRvcF9yZWd1bGF0b3IgKmFuYXRvcF9yZWcgPSByZGV2X2dldF9kcnZkYXRhKHJlZyk7CisJaW50IHNlbDsKKworCXNlbCA9IGFuYXRvcF9yZWctPmJ5cGFzcyA/IExET19GRVRfRlVMTF9PTiA6IGFuYXRvcF9yZWctPnNlbDsKKwlyZXR1cm4gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAocmVnLCBzZWwpOworfQorCitzdGF0aWMgaW50IGFuYXRvcF9yZWdtYXBfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmVnKQoreworCXJldHVybiByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcChyZWcsIExET19QT1dFUl9HQVRFKTsKK30KKworc3RhdGljIGludCBhbmF0b3BfcmVnbWFwX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJlZykKK3sKKwlyZXR1cm4gcmVndWxhdG9yX2dldF92b2x0YWdlX3NlbF9yZWdtYXAocmVnKSAhPSBMRE9fUE9XRVJfR0FURTsKK30KKworc3RhdGljIGludCBhbmF0b3BfcmVnbWFwX2NvcmVfc2V0X3ZvbHRhZ2Vfc2VsKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWcsCisJCQkJCSAgICAgIHVuc2lnbmVkIHNlbGVjdG9yKQoreworCXN0cnVjdCBhbmF0b3BfcmVndWxhdG9yICphbmF0b3BfcmVnID0gcmRldl9nZXRfZHJ2ZGF0YShyZWcpOworCWludCByZXQ7CisKKwlpZiAoYW5hdG9wX3JlZy0+YnlwYXNzIHx8ICFhbmF0b3BfcmVnbWFwX2lzX2VuYWJsZWQocmVnKSkgeworCQlhbmF0b3BfcmVnLT5zZWwgPSBzZWxlY3RvcjsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAocmVnLCBzZWxlY3Rvcik7CisJaWYgKCFyZXQpCisJCWFuYXRvcF9yZWctPnNlbCA9IHNlbGVjdG9yOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYW5hdG9wX3JlZ21hcF9jb3JlX2dldF92b2x0YWdlX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmVnKQogewogCXN0cnVjdCBhbmF0b3BfcmVndWxhdG9yICphbmF0b3BfcmVnID0gcmRldl9nZXRfZHJ2ZGF0YShyZWcpOwogCi0JaWYgKCFhbmF0b3BfcmVnLT5jb250cm9sX3JlZykKLQkJcmV0dXJuIC1FTk9UU1VQUDsKKwlpZiAoYW5hdG9wX3JlZy0+YnlwYXNzIHx8ICFhbmF0b3BfcmVnbWFwX2lzX2VuYWJsZWQocmVnKSkKKwkJcmV0dXJuIGFuYXRvcF9yZWctPnNlbDsKIAogCXJldHVybiByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcChyZWcpOwogfQogCitzdGF0aWMgaW50IGFuYXRvcF9yZWdtYXBfZ2V0X2J5cGFzcyhzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmVnLCBib29sICplbmFibGUpCit7CisJc3RydWN0IGFuYXRvcF9yZWd1bGF0b3IgKmFuYXRvcF9yZWcgPSByZGV2X2dldF9kcnZkYXRhKHJlZyk7CisJaW50IHNlbDsKKworCXNlbCA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwKHJlZyk7CisJaWYgKHNlbCA9PSBMRE9fRkVUX0ZVTExfT04pCisJCVdBUk5fT04oIWFuYXRvcF9yZWctPmJ5cGFzcyk7CisJZWxzZSBpZiAoc2VsICE9IExET19QT1dFUl9HQVRFKQorCQlXQVJOX09OKGFuYXRvcF9yZWctPmJ5cGFzcyk7CisKKwkqZW5hYmxlID0gYW5hdG9wX3JlZy0+YnlwYXNzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFuYXRvcF9yZWdtYXBfc2V0X2J5cGFzcyhzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmVnLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgYW5hdG9wX3JlZ3VsYXRvciAqYW5hdG9wX3JlZyA9IHJkZXZfZ2V0X2RydmRhdGEocmVnKTsKKwlpbnQgc2VsOworCisJaWYgKGVuYWJsZSA9PSBhbmF0b3BfcmVnLT5ieXBhc3MpCisJCXJldHVybiAwOworCisJc2VsID0gZW5hYmxlID8gTERPX0ZFVF9GVUxMX09OIDogYW5hdG9wX3JlZy0+c2VsOworCWFuYXRvcF9yZWctPmJ5cGFzcyA9IGVuYWJsZTsKKworCXJldHVybiByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcChyZWcsIHNlbCk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBhbmF0b3Bfcm9wcyA9IHsKLQkuc2V0X3ZvbHRhZ2Vfc2VsID0gYW5hdG9wX3JlZ21hcF9zZXRfdm9sdGFnZV9zZWwsCi0JLnNldF92b2x0YWdlX3RpbWVfc2VsID0gYW5hdG9wX3JlZ21hcF9zZXRfdm9sdGFnZV90aW1lX3NlbCwKLQkuZ2V0X3ZvbHRhZ2Vfc2VsID0gYW5hdG9wX3JlZ21hcF9nZXRfdm9sdGFnZV9zZWwsCisJLnNldF92b2x0YWdlX3NlbCA9IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAorCS5nZXRfdm9sdGFnZV9zZWwgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKIAkubGlzdF92b2x0YWdlID0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXIsCiAJLm1hcF92b2x0YWdlID0gcmVndWxhdG9yX21hcF92b2x0YWdlX2xpbmVhciwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBhbmF0b3BfY29yZV9yb3BzID0geworCS5lbmFibGUgPSBhbmF0b3BfcmVnbWFwX2VuYWJsZSwKKwkuZGlzYWJsZSA9IGFuYXRvcF9yZWdtYXBfZGlzYWJsZSwKKwkuaXNfZW5hYmxlZCA9IGFuYXRvcF9yZWdtYXBfaXNfZW5hYmxlZCwKKwkuc2V0X3ZvbHRhZ2Vfc2VsID0gYW5hdG9wX3JlZ21hcF9jb3JlX3NldF92b2x0YWdlX3NlbCwKKwkuc2V0X3ZvbHRhZ2VfdGltZV9zZWwgPSBhbmF0b3BfcmVnbWFwX3NldF92b2x0YWdlX3RpbWVfc2VsLAorCS5nZXRfdm9sdGFnZV9zZWwgPSBhbmF0b3BfcmVnbWFwX2NvcmVfZ2V0X3ZvbHRhZ2Vfc2VsLAorCS5saXN0X3ZvbHRhZ2UgPSByZWd1bGF0b3JfbGlzdF92b2x0YWdlX2xpbmVhciwKKwkubWFwX3ZvbHRhZ2UgPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfbGluZWFyLAorCS5nZXRfYnlwYXNzID0gYW5hdG9wX3JlZ21hcF9nZXRfYnlwYXNzLAorCS5zZXRfYnlwYXNzID0gYW5hdG9wX3JlZ21hcF9zZXRfYnlwYXNzLAorfTsKKwogc3RhdGljIGludCBhbmF0b3BfcmVndWxhdG9yX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKQEAgLTExNiw2ICsxODcsNyBAQAogCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICppbml0ZGF0YTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07CiAJaW50IHJldCA9IDA7CisJdTMyIHZhbDsKIAogCWluaXRkYXRhID0gb2ZfZ2V0X3JlZ3VsYXRvcl9pbml0X2RhdGEoZGV2LCBucCk7CiAJc3JlZyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqc3JlZyksIEdGUF9LRVJORUwpOwpAQCAtMTI1LDcgKzE5Nyw2IEBACiAJc3JlZy0+bmFtZSA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZ3VsYXRvci1uYW1lIiwgTlVMTCk7CiAJcmRlc2MgPSAmc3JlZy0+cmRlc2M7CiAJcmRlc2MtPm5hbWUgPSBzcmVnLT5uYW1lOwotCXJkZXNjLT5vcHMgPSAmYW5hdG9wX3JvcHM7CiAJcmRlc2MtPnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRTsKIAlyZGVzYy0+b3duZXIgPSBUSElTX01PRFVMRTsKIApAQCAtMTk3LDYgKzI2OCwyNSBAQAogCWNvbmZpZy5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJY29uZmlnLnJlZ21hcCA9IHNyZWctPmFuYXRvcDsKIAorCS8qIE9ubHkgY29yZSByZWd1bGF0b3JzIGhhdmUgdGhlIHJhbXAgdXAgZGVsYXkgY29uZmlndXJhdGlvbi4gKi8KKwlpZiAoc3JlZy0+Y29udHJvbF9yZWcgJiYgc3JlZy0+ZGVsYXlfYml0X3dpZHRoKSB7CisJCXJkZXNjLT5vcHMgPSAmYW5hdG9wX2NvcmVfcm9wczsKKworCQlyZXQgPSByZWdtYXBfcmVhZChjb25maWcucmVnbWFwLCByZGVzYy0+dnNlbF9yZWcsICZ2YWwpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWFkIGluaXRpYWwgc3RhdGVcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXNyZWctPnNlbCA9ICh2YWwgJiByZGVzYy0+dnNlbF9tYXNrKSA+PiBzcmVnLT52b2xfYml0X3NoaWZ0OworCQlpZiAoc3JlZy0+c2VsID09IExET19GRVRfRlVMTF9PTikgeworCQkJc3JlZy0+c2VsID0gMDsKKwkJCXNyZWctPmJ5cGFzcyA9IHRydWU7CisJCX0KKwl9IGVsc2UgeworCQlyZGVzYy0+b3BzID0gJmFuYXRvcF9yb3BzOworCX0KKwogCS8qIHJlZ2lzdGVyIHJlZ3VsYXRvciAqLwogCXJkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcihkZXYsIHJkZXNjLCAmY29uZmlnKTsKIAlpZiAoSVNfRVJSKHJkZXYpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9hcml6b25hLWxkbzEuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2FyaXpvbmEtbGRvMS5jCmluZGV4IDRmNmMyMDUuLmIxMDMzZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2FyaXpvbmEtbGRvMS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2FyaXpvbmEtbGRvMS5jCkBAIC0xNTMsMTEgKzE1Myw5IEBACiAKIAkudnNlbF9yZWcgPSBBUklaT05BX0xETzFfQ09OVFJPTF8xLAogCS52c2VsX21hc2sgPSBBUklaT05BX0xETzFfVlNFTF9NQVNLLAotCS5ieXBhc3NfcmVnID0gQVJJWk9OQV9MRE8xX0NPTlRST0xfMSwKLQkuYnlwYXNzX21hc2sgPSBBUklaT05BX0xETzFfQllQQVNTLAogCS5taW5fdVYgPSA5MDAwMDAsCi0JLnVWX3N0ZXAgPSA1MDAwMCwKLQkubl92b2x0YWdlcyA9IDcsCisJLnVWX3N0ZXAgPSAyNTAwMCwKKwkubl92b2x0YWdlcyA9IDEzLAogCS5lbmFibGVfdGltZSA9IDUwMCwKIAogCS5vd25lciA9IFRISVNfTU9EVUxFLApAQCAtMTg5LDEwICsxODcsOCBAQAogCWludCByZXQ7CiAKIAlsZG8xID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqbGRvMSksIEdGUF9LRVJORUwpOwotCWlmIChsZG8xID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIHByaXZhdGUgZGF0YVxuIik7CisJaWYgKCFsZG8xKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlsZG8xLT5hcml6b25hID0gYXJpem9uYTsKIApAQCAtMjAzLDYgKzE5OSw3IEBACiAJICovCiAJc3dpdGNoIChhcml6b25hLT50eXBlKSB7CiAJY2FzZSBXTTUxMDI6CisJY2FzZSBXTTg5OTc6CiAJCWRlc2MgPSAmYXJpem9uYV9sZG8xX2hjOwogCQlsZG8xLT5pbml0X2RhdGEgPSBhcml6b25hX2xkbzFfZHZmczsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9hcml6b25hLW1pY3N1cHAuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2FyaXpvbmEtbWljc3VwcC5jCmluZGV4IDAzNGVjZTcuLjZmZGQ5YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2FyaXpvbmEtbWljc3VwcC5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2FyaXpvbmEtbWljc3VwcC5jCkBAIC0yMDQsMTAgKzIwNCw4IEBACiAJaW50IHJldDsKIAogCW1pY3N1cHAgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCptaWNzdXBwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG1pY3N1cHAgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgcHJpdmF0ZSBkYXRhXG4iKTsKKwlpZiAoIW1pY3N1cHApCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCW1pY3N1cHAtPmFyaXpvbmEgPSBhcml6b25hOwogCUlOSVRfV09SSygmbWljc3VwcC0+Y2hlY2tfY3Bfd29yaywgYXJpem9uYV9taWNzdXBwX2NoZWNrX2NwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2FzMzcxMS1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2FzMzcxMS1yZWd1bGF0b3IuYwppbmRleCBjNzdhNTg0Li5iNDcyODNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9hczM3MTEtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvYXMzNzExLXJlZ3VsYXRvci5jCkBAIC0xOTEsNyArMTkxLDcgQEAKIHsKIAlzdHJ1Y3QgYXMzNzExX3JlZ3VsYXRvcl9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7CiAJc3RydWN0IGRldmljZV9ub2RlICpyZWd1bGF0b3JzID0KLQkJb2ZfZmluZF9ub2RlX2J5X25hbWUoZGV2LT5wYXJlbnQtPm9mX25vZGUsICJyZWd1bGF0b3JzIik7CisJCW9mX2dldF9jaGlsZF9ieV9uYW1lKGRldi0+cGFyZW50LT5vZl9ub2RlLCAicmVndWxhdG9ycyIpOwogCXN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggKm1hdGNoOwogCWludCByZXQsIGk7CiAKQEAgLTIyMSw3ICsyMjEsNiBAQAogewogCXN0cnVjdCBhczM3MTFfcmVndWxhdG9yX3BkYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CiAJc3RydWN0IGFzMzcxMSAqYXMzNzExID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwotCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICpyZWdfZGF0YTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7LmRldiA9ICZwZGV2LT5kZXYsfTsKIAlzdHJ1Y3QgYXMzNzExX3JlZ3VsYXRvciAqcmVnID0gTlVMTDsKIAlzdHJ1Y3QgYXMzNzExX3JlZ3VsYXRvciAqcmVnczsKQEAgLTI0NiwyMiArMjQ1LDE0IEBACiAKIAlyZWdzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIEFTMzcxMV9SRUdVTEFUT1JfTlVNICoKIAkJCXNpemVvZihzdHJ1Y3QgYXMzNzExX3JlZ3VsYXRvciksIEdGUF9LRVJORUwpOwotCWlmICghcmVncykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZXhpdGluZy4uXG4iKTsKKwlpZiAoIXJlZ3MpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWZvciAoaWQgPSAwLCByaSA9IGFzMzcxMV9yZWdfaW5mbzsgaWQgPCBBUzM3MTFfUkVHVUxBVE9SX05VTTsgKytpZCwgcmkrKykgewotCQlyZWdfZGF0YSA9IHBkYXRhLT5pbml0X2RhdGFbaWRdOwotCi0JCS8qIE5vIG5lZWQgdG8gcmVnaXN0ZXIgaWYgdGhlcmUgaXMgbm8gcmVndWxhdG9yIGRhdGEgKi8KLQkJaWYgKCFyZWdfZGF0YSkKLQkJCWNvbnRpbnVlOwotCiAJCXJlZyA9ICZyZWdzW2lkXTsKIAkJcmVnLT5yZWdfaW5mbyA9IHJpOwogCi0JCWNvbmZpZy5pbml0X2RhdGEgPSByZWdfZGF0YTsKKwkJY29uZmlnLmluaXRfZGF0YSA9IHBkYXRhLT5pbml0X2RhdGFbaWRdOwogCQljb25maWcuZHJpdmVyX2RhdGEgPSByZWc7CiAJCWNvbmZpZy5yZWdtYXAgPSBhczM3MTEtPnJlZ21hcDsKIAkJY29uZmlnLm9mX25vZGUgPSBvZl9ub2RlW2lkXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2FzMzcyMi1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2FzMzcyMi1yZWd1bGF0b3IuYwppbmRleCA4YjE3ZDc4Li44NTU4NTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9hczM3MjItcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvYXMzNzIyLXJlZ3VsYXRvci5jCkBAIC03MTksNiArNzE5LDcgQEAKIAogCXJldCA9IG9mX3JlZ3VsYXRvcl9tYXRjaCgmcGRldi0+ZGV2LCBucCwgYXMzNzIyX3JlZ3VsYXRvcl9tYXRjaGVzLAogCQkJQVJSQVlfU0laRShhczM3MjJfcmVndWxhdG9yX21hdGNoZXMpKTsKKwlvZl9ub2RlX3B1dChucCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiUGFyc2luZyBvZiByZWd1bGF0b3Igbm9kZSBmYWlsZWQ6ICVkXG4iLAogCQkJcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2JjbTU5MHh4LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvYmNtNTkweHgtcmVndWxhdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwOGNhNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2JjbTU5MHh4LXJlZ3VsYXRvci5jCkBAIC0wLDAgKzEsNDAzIEBACisvKgorICogQnJvYWRjb20gQkNNNTkweHggcmVndWxhdG9yIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDE0IExpbmFybyBMaW1pdGVkCisgKiBBdXRob3I6IE1hdHQgUG9ydGVyIDxtcG9ydGVyQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9iY201OTB4eC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL29mX3JlZ3VsYXRvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworLyogUmVnaXN0ZXIgZGVmcyAqLworI2RlZmluZSBCQ001OTBYWF9SRkxET1BNQ1RSTDEJMHg2MAorI2RlZmluZSBCQ001OTBYWF9JT1NSMVBNQ1RSTDEJMHg3YQorI2RlZmluZSBCQ001OTBYWF9JT1NSMlBNQ1RSTDEJMHg3YworI2RlZmluZSBCQ001OTBYWF9DU1JQTUNUUkwxCTB4N2UKKyNkZWZpbmUgQkNNNTkwWFhfU0RTUjFQTUNUUkwxCTB4ODIKKyNkZWZpbmUgQkNNNTkwWFhfU0RTUjJQTUNUUkwxCTB4ODYKKyNkZWZpbmUgQkNNNTkwWFhfTVNSUE1DVFJMMQkweDhhCisjZGVmaW5lIEJDTTU5MFhYX1ZTUlBNQ1RSTDEJMHg4ZQorI2RlZmluZSBCQ001OTBYWF9SRUdfRU5BQkxFCUJJVCg3KQorCisjZGVmaW5lIEJDTTU5MFhYX1JGTERPQ1RSTAkweDk2CisjZGVmaW5lIEJDTTU5MFhYX0NTUlZPVVQxCTB4YzAKKyNkZWZpbmUgQkNNNTkwWFhfTERPX1ZTRUxfTUFTSwlHRU5NQVNLKDUsIDMpCisjZGVmaW5lIEJDTTU5MFhYX1NSX1ZTRUxfTUFTSwlHRU5NQVNLKDUsIDApCisKKy8qIExETyByZWd1bGF0b3IgSURzICovCisjZGVmaW5lIEJDTTU5MFhYX1JFR19SRkxETwkwCisjZGVmaW5lIEJDTTU5MFhYX1JFR19DQU1MRE8xCTEKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX0NBTUxETzIJMgorI2RlZmluZSBCQ001OTBYWF9SRUdfU0lNTERPMQkzCisjZGVmaW5lIEJDTTU5MFhYX1JFR19TSU1MRE8yCTQKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX1NETERPCTUKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX1NEWExETwk2CisjZGVmaW5lIEJDTTU5MFhYX1JFR19NTUNMRE8xCTcKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX01NQ0xETzIJOAorI2RlZmluZSBCQ001OTBYWF9SRUdfQVVETERPCTkKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX01JQ0xETwkxMAorI2RlZmluZSBCQ001OTBYWF9SRUdfVVNCTERPCTExCisjZGVmaW5lIEJDTTU5MFhYX1JFR19WSUJMRE8JMTIKKworLyogRENEQyByZWd1bGF0b3IgSURzICovCisjZGVmaW5lIEJDTTU5MFhYX1JFR19DU1IJMTMKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX0lPU1IxCTE0CisjZGVmaW5lIEJDTTU5MFhYX1JFR19JT1NSMgkxNQorI2RlZmluZSBCQ001OTBYWF9SRUdfTVNSCTE2CisjZGVmaW5lIEJDTTU5MFhYX1JFR19TRFNSMQkxNworI2RlZmluZSBCQ001OTBYWF9SRUdfU0RTUjIJMTgKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX1ZTUgkxOQorCisjZGVmaW5lIEJDTTU5MFhYX05VTV9SRUdTCTIwCisKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX0lTX0xETyhuKQkobiA8IEJDTTU5MFhYX1JFR19DU1IpCisKK3N0cnVjdCBiY201OTB4eF9ib2FyZCB7CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKmJjbTU5MHh4X3BtdV9pbml0X2RhdGFbQkNNNTkwWFhfTlVNX1JFR1NdOworfTsKKworLyogTERPIGdyb3VwIEE6IHN1cHBvcnRlZCB2b2x0YWdlcyBpbiBtaWNyb3ZvbHRzICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxkb19hX3RhYmxlW10gPSB7CisJMTIwMDAwMCwgMTgwMDAwMCwgMjUwMDAwMCwgMjcwMDAwMCwgMjgwMDAwMCwKKwkyOTAwMDAwLCAzMDAwMDAwLCAzMzAwMDAwLAorfTsKKworLyogTERPIGdyb3VwIEM6IHN1cHBvcnRlZCB2b2x0YWdlcyBpbiBtaWNyb3ZvbHRzICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxkb19jX3RhYmxlW10gPSB7CisJMzEwMDAwMCwgMTgwMDAwMCwgMjUwMDAwMCwgMjcwMDAwMCwgMjgwMDAwMCwKKwkyOTAwMDAwLCAzMDAwMDAwLCAzMzAwMDAwLAorfTsKKworLyogRENEQyBncm91cCBDU1I6IHN1cHBvcnRlZCB2b2x0YWdlcyBpbiBtaWNyb3ZvbHRzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9saW5lYXJfcmFuZ2UgZGNkY19jc3JfcmFuZ2VzW10gPSB7CisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSg4NjAwMDAsIDIsIDUwLCAxMDAwMCksCisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgxMzYwMDAwLCA1MSwgNTUsIDIwMDAwKSwKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDkwMDAwMCwgNTYsIDYzLCAwKSwKK307CisKKy8qIERDREMgZ3JvdXAgSU9TUjE6IHN1cHBvcnRlZCB2b2x0YWdlcyBpbiBtaWNyb3ZvbHRzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9saW5lYXJfcmFuZ2UgZGNkY19pb3NyMV9yYW5nZXNbXSA9IHsKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDg2MDAwMCwgMiwgNTEsIDEwMDAwKSwKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDE1MDAwMDAsIDUyLCA1MiwgMCksCisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgxODAwMDAwLCA1MywgNTMsIDApLAorCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoOTAwMDAwLCA1NCwgNjMsIDApLAorfTsKKworLyogRENEQyBncm91cCBTRFNSMTogc3VwcG9ydGVkIHZvbHRhZ2VzIGluIG1pY3Jvdm9sdHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2xpbmVhcl9yYW5nZSBkY2RjX3Nkc3IxX3Jhbmdlc1tdID0geworCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoODYwMDAwLCAyLCA1MCwgMTAwMDApLAorCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTM0MDAwMCwgNTEsIDUxLCAwKSwKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDkwMDAwMCwgNTIsIDYzLCAwKSwKK307CisKK3N0cnVjdCBiY201OTB4eF9pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKnZpbl9uYW1lOworCXU4IG5fdm9sdGFnZXM7CisJY29uc3QgdW5zaWduZWQgaW50ICp2b2x0X3RhYmxlOworCXU4IG5fbGluZWFyX3JhbmdlczsKKwljb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2xpbmVhcl9yYW5nZSAqbGluZWFyX3JhbmdlczsKK307CisKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX1RBQkxFKF9uYW1lLCBfdGFibGUpIFwKKwl7IFwKKwkJLm5hbWUgPSAjX25hbWUsIFwKKwkJLm5fdm9sdGFnZXMgPSBBUlJBWV9TSVpFKF90YWJsZSksIFwKKwkJLnZvbHRfdGFibGUgPSBfdGFibGUsIFwKKwl9CisKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX1JBTkdFUyhfbmFtZSwgX3JhbmdlcykgXAorCXsgXAorCQkubmFtZSA9ICNfbmFtZSwgXAorCQkubl9saW5lYXJfcmFuZ2VzID0gQVJSQVlfU0laRShfcmFuZ2VzKSwgXAorCQkubGluZWFyX3JhbmdlcyA9IF9yYW5nZXMsIFwKKwl9CisKK3N0YXRpYyBzdHJ1Y3QgYmNtNTkweHhfaW5mbyBiY201OTB4eF9yZWdzW10gPSB7CisJQkNNNTkwWFhfUkVHX1RBQkxFKHJmbGRvLCBsZG9fYV90YWJsZSksCisJQkNNNTkwWFhfUkVHX1RBQkxFKGNhbWxkbzEsIGxkb19jX3RhYmxlKSwKKwlCQ001OTBYWF9SRUdfVEFCTEUoY2FtbGRvMiwgbGRvX2NfdGFibGUpLAorCUJDTTU5MFhYX1JFR19UQUJMRShzaW1sZG8xLCBsZG9fYV90YWJsZSksCisJQkNNNTkwWFhfUkVHX1RBQkxFKHNpbWxkbzIsIGxkb19hX3RhYmxlKSwKKwlCQ001OTBYWF9SRUdfVEFCTEUoc2RsZG8sIGxkb19jX3RhYmxlKSwKKwlCQ001OTBYWF9SRUdfVEFCTEUoc2R4bGRvLCBsZG9fYV90YWJsZSksCisJQkNNNTkwWFhfUkVHX1RBQkxFKG1tY2xkbzEsIGxkb19hX3RhYmxlKSwKKwlCQ001OTBYWF9SRUdfVEFCTEUobW1jbGRvMiwgbGRvX2FfdGFibGUpLAorCUJDTTU5MFhYX1JFR19UQUJMRShhdWRsZG8sIGxkb19hX3RhYmxlKSwKKwlCQ001OTBYWF9SRUdfVEFCTEUobWljbGRvLCBsZG9fYV90YWJsZSksCisJQkNNNTkwWFhfUkVHX1RBQkxFKHVzYmxkbywgbGRvX2FfdGFibGUpLAorCUJDTTU5MFhYX1JFR19UQUJMRSh2aWJsZG8sIGxkb19jX3RhYmxlKSwKKwlCQ001OTBYWF9SRUdfUkFOR0VTKGNzciwgZGNkY19jc3JfcmFuZ2VzKSwKKwlCQ001OTBYWF9SRUdfUkFOR0VTKGlvc3IxLCBkY2RjX2lvc3IxX3JhbmdlcyksCisJQkNNNTkwWFhfUkVHX1JBTkdFUyhpb3NyMiwgZGNkY19pb3NyMV9yYW5nZXMpLAorCUJDTTU5MFhYX1JFR19SQU5HRVMobXNyLCBkY2RjX2lvc3IxX3JhbmdlcyksCisJQkNNNTkwWFhfUkVHX1JBTkdFUyhzZHNyMSwgZGNkY19zZHNyMV9yYW5nZXMpLAorCUJDTTU5MFhYX1JFR19SQU5HRVMoc2RzcjIsIGRjZGNfaW9zcjFfcmFuZ2VzKSwKKwlCQ001OTBYWF9SRUdfUkFOR0VTKHZzciwgZGNkY19pb3NyMV9yYW5nZXMpLAorfTsKKworc3RydWN0IGJjbTU5MHh4X3JlZyB7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXNjICpkZXNjOworCXN0cnVjdCBiY201OTB4eCAqbWZkOworCXN0cnVjdCBiY201OTB4eF9pbmZvICoqaW5mbzsKK307CisKK3N0YXRpYyBpbnQgYmNtNTkweHhfZ2V0X3ZzZWxfcmVnaXN0ZXIoaW50IGlkKQoreworCWlmIChCQ001OTBYWF9SRUdfSVNfTERPKGlkKSkKKwkJcmV0dXJuIEJDTTU5MFhYX1JGTERPQ1RSTCArIGlkOworCWVsc2UKKwkJcmV0dXJuIEJDTTU5MFhYX0NTUlZPVVQxICsgKGlkIC0gQkNNNTkwWFhfUkVHX0NTUikgKiAzOworfQorCitzdGF0aWMgaW50IGJjbTU5MHh4X2dldF9lbmFibGVfcmVnaXN0ZXIoaW50IGlkKQoreworCWludCByZWcgPSAwOworCisJaWYgKEJDTTU5MFhYX1JFR19JU19MRE8oaWQpKQorCQlyZWcgPSBCQ001OTBYWF9SRkxET1BNQ1RSTDEgKyBpZCAqIDI7CisJZWxzZQorCQlzd2l0Y2ggKGlkKSB7CisJCWNhc2UgQkNNNTkwWFhfUkVHX0NTUjoKKwkJCXJlZyA9IEJDTTU5MFhYX0NTUlBNQ1RSTDE7CisJCQlicmVhazsKKwkJY2FzZSBCQ001OTBYWF9SRUdfSU9TUjE6CisJCQlyZWcgPSBCQ001OTBYWF9JT1NSMVBNQ1RSTDE7CisJCQlicmVhazsKKwkJY2FzZSBCQ001OTBYWF9SRUdfSU9TUjI6CisJCQlyZWcgPSBCQ001OTBYWF9JT1NSMlBNQ1RSTDE7CisJCQlicmVhazsKKwkJY2FzZSBCQ001OTBYWF9SRUdfTVNSOgorCQkJcmVnID0gQkNNNTkwWFhfTVNSUE1DVFJMMTsKKwkJCWJyZWFrOworCQljYXNlIEJDTTU5MFhYX1JFR19TRFNSMToKKwkJCXJlZyA9IEJDTTU5MFhYX1NEU1IxUE1DVFJMMTsKKwkJCWJyZWFrOworCQljYXNlIEJDTTU5MFhYX1JFR19TRFNSMjoKKwkJCXJlZyA9IEJDTTU5MFhYX1NEU1IyUE1DVFJMMTsKKwkJCWJyZWFrOworCQl9OworCisJcmV0dXJuIHJlZzsKK30KKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIGJjbTU5MHh4X29wc19sZG8gPSB7CisJLmlzX2VuYWJsZWQJCT0gcmVndWxhdG9yX2lzX2VuYWJsZWRfcmVnbWFwLAorCS5lbmFibGUJCQk9IHJlZ3VsYXRvcl9lbmFibGVfcmVnbWFwLAorCS5kaXNhYmxlCQk9IHJlZ3VsYXRvcl9kaXNhYmxlX3JlZ21hcCwKKwkuZ2V0X3ZvbHRhZ2Vfc2VsCT0gcmVndWxhdG9yX2dldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLnNldF92b2x0YWdlX3NlbAk9IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAorCS5saXN0X3ZvbHRhZ2UJCT0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV90YWJsZSwKKwkubWFwX3ZvbHRhZ2UJCT0gcmVndWxhdG9yX21hcF92b2x0YWdlX2l0ZXJhdGUsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgYmNtNTkweHhfb3BzX2RjZGMgPSB7CisJLmlzX2VuYWJsZWQJCT0gcmVndWxhdG9yX2lzX2VuYWJsZWRfcmVnbWFwLAorCS5lbmFibGUJCQk9IHJlZ3VsYXRvcl9lbmFibGVfcmVnbWFwLAorCS5kaXNhYmxlCQk9IHJlZ3VsYXRvcl9kaXNhYmxlX3JlZ21hcCwKKwkuZ2V0X3ZvbHRhZ2Vfc2VsCT0gcmVndWxhdG9yX2dldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLnNldF92b2x0YWdlX3NlbAk9IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAorCS5saXN0X3ZvbHRhZ2UJCT0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXJfcmFuZ2UsCisJLm1hcF92b2x0YWdlCQk9IHJlZ3VsYXRvcl9tYXBfdm9sdGFnZV9saW5lYXJfcmFuZ2UsCit9OworCisjZGVmaW5lIEJDTTU5MFhYX01BVENIKF9uYW1lLCBfaWQpIFwKKwl7IFwKKwkJLm5hbWUgPSAjX25hbWUsIFwKKwkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikmYmNtNTkweHhfcmVnc1tCQ001OTBYWF9SRUdfIyNfaWRdLCBcCisJfQorCitzdGF0aWMgc3RydWN0IG9mX3JlZ3VsYXRvcl9tYXRjaCBiY201OTB4eF9tYXRjaGVzW10gPSB7CisJQkNNNTkwWFhfTUFUQ0gocmZsZG8sIFJGTERPKSwKKwlCQ001OTBYWF9NQVRDSChjYW1sZG8xLCBDQU1MRE8xKSwKKwlCQ001OTBYWF9NQVRDSChjYW1sZG8yLCBDQU1MRE8yKSwKKwlCQ001OTBYWF9NQVRDSChzaW1sZG8xLCBTSU1MRE8xKSwKKwlCQ001OTBYWF9NQVRDSChzaW1sZG8yLCBTSU1MRE8yKSwKKwlCQ001OTBYWF9NQVRDSChzZGxkbywgU0RMRE8pLAorCUJDTTU5MFhYX01BVENIKHNkeGxkbywgU0RYTERPKSwKKwlCQ001OTBYWF9NQVRDSChtbWNsZG8xLCBNTUNMRE8xKSwKKwlCQ001OTBYWF9NQVRDSChtbWNsZG8yLCBNTUNMRE8yKSwKKwlCQ001OTBYWF9NQVRDSChhdWRsZG8sIEFVRExETyksCisJQkNNNTkwWFhfTUFUQ0gobWljbGRvLCBNSUNMRE8pLAorCUJDTTU5MFhYX01BVENIKHVzYmxkbywgVVNCTERPKSwKKwlCQ001OTBYWF9NQVRDSCh2aWJsZG8sIFZJQkxETyksCisJQkNNNTkwWFhfTUFUQ0goY3NyLCBDU1IpLAorCUJDTTU5MFhYX01BVENIKGlvc3IxLCBJT1NSMSksCisJQkNNNTkwWFhfTUFUQ0goaW9zcjIsIElPU1IyKSwKKwlCQ001OTBYWF9NQVRDSChtc3IsIE1TUiksCisJQkNNNTkwWFhfTUFUQ0goc2RzcjEsIFNEU1IxKSwKKwlCQ001OTBYWF9NQVRDSChzZHNyMiwgU0RTUjIpLAorCUJDTTU5MFhYX01BVENIKHZzciwgVlNSKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmNtNTkweHhfYm9hcmQgKmJjbTU5MHh4X3BhcnNlX2R0X3JlZ19kYXRhKAorCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQlzdHJ1Y3Qgb2ZfcmVndWxhdG9yX21hdGNoICoqYmNtNTkweHhfcmVnX21hdGNoZXMpCit7CisJc3RydWN0IGJjbTU5MHh4X2JvYXJkICpkYXRhOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYucGFyZW50LT5vZl9ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcmVndWxhdG9yczsKKwlzdHJ1Y3Qgb2ZfcmVndWxhdG9yX21hdGNoICptYXRjaGVzID0gYmNtNTkweHhfbWF0Y2hlczsKKwlpbnQgY291bnQgPSBBUlJBWV9TSVpFKGJjbTU5MHh4X21hdGNoZXMpOworCWludCBpZHggPSAwOworCWludCByZXQ7CisKKwlpZiAoIW5wKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm9mIG5vZGUgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHJlZ3VsYXRvciBib2FyZCBkYXRhXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbnAgPSBvZl9ub2RlX2dldChucCk7CisJcmVndWxhdG9ycyA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAicmVndWxhdG9ycyIpOworCWlmICghcmVndWxhdG9ycykgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAicmVndWxhdG9yIG5vZGUgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0ID0gb2ZfcmVndWxhdG9yX21hdGNoKCZwZGV2LT5kZXYsIHJlZ3VsYXRvcnMsIG1hdGNoZXMsIGNvdW50KTsKKwlvZl9ub2RlX3B1dChyZWd1bGF0b3JzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJFcnJvciBwYXJzaW5nIHJlZ3VsYXRvciBpbml0IGRhdGE6ICVkXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJKmJjbTU5MHh4X3JlZ19tYXRjaGVzID0gbWF0Y2hlczsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgY291bnQ7IGlkeCsrKSB7CisJCWlmICghbWF0Y2hlc1tpZHhdLmluaXRfZGF0YSB8fCAhbWF0Y2hlc1tpZHhdLm9mX25vZGUpCisJCQljb250aW51ZTsKKworCQlkYXRhLT5iY201OTB4eF9wbXVfaW5pdF9kYXRhW2lkeF0gPSBtYXRjaGVzW2lkeF0uaW5pdF9kYXRhOworCX0KKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IGJjbTU5MHh4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGJjbTU5MHh4ICpiY201OTB4eCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgYmNtNTkweHhfYm9hcmQgKnBtdV9kYXRhID0gTlVMTDsKKwlzdHJ1Y3QgYmNtNTkweHhfcmVnICpwbXU7CisJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OworCXN0cnVjdCBiY201OTB4eF9pbmZvICppbmZvOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICpyZWdfZGF0YTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKKwlzdHJ1Y3Qgb2ZfcmVndWxhdG9yX21hdGNoICpiY201OTB4eF9yZWdfbWF0Y2hlcyA9IE5VTEw7CisJaW50IGk7CisKKwlwbXVfZGF0YSA9IGJjbTU5MHh4X3BhcnNlX2R0X3JlZ19kYXRhKHBkZXYsCisJCQkJCSAgICAgICZiY201OTB4eF9yZWdfbWF0Y2hlcyk7CisKKwlwbXUgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwbXUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBtdSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIHBtdVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBtdS0+bWZkID0gYmNtNTkweHg7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwbXUpOworCisJcG11LT5kZXNjID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIEJDTTU5MFhYX05VTV9SRUdTICoKKwkJCXNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBtdS0+ZGVzYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNZW1vcnkgYWxsb2MgZmFpbHMgZm9yIGRlc2NcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwbXUtPmluZm8gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgQkNNNTkwWFhfTlVNX1JFR1MgKgorCQkJc2l6ZW9mKHN0cnVjdCBiY201OTB4eF9pbmZvICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBtdS0+aW5mbykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNZW1vcnkgYWxsb2MgZmFpbHMgZm9yIGluZm9cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpbmZvID0gYmNtNTkweHhfcmVnczsKKworCWZvciAoaSA9IDA7IGkgPCBCQ001OTBYWF9OVU1fUkVHUzsgaSsrLCBpbmZvKyspIHsKKwkJaWYgKHBtdV9kYXRhKQorCQkJcmVnX2RhdGEgPSBwbXVfZGF0YS0+YmNtNTkweHhfcG11X2luaXRfZGF0YVtpXTsKKwkJZWxzZQorCQkJcmVnX2RhdGEgPSBOVUxMOworCisJCS8qIFJlZ2lzdGVyIHRoZSByZWd1bGF0b3JzICovCisJCXBtdS0+aW5mb1tpXSA9IGluZm87CisKKwkJcG11LT5kZXNjW2ldLm5hbWUgPSBpbmZvLT5uYW1lOworCQlwbXUtPmRlc2NbaV0uc3VwcGx5X25hbWUgPSBpbmZvLT52aW5fbmFtZTsKKwkJcG11LT5kZXNjW2ldLmlkID0gaTsKKwkJcG11LT5kZXNjW2ldLnZvbHRfdGFibGUgPSBpbmZvLT52b2x0X3RhYmxlOworCQlwbXUtPmRlc2NbaV0ubl92b2x0YWdlcyA9IGluZm8tPm5fdm9sdGFnZXM7CisJCXBtdS0+ZGVzY1tpXS5saW5lYXJfcmFuZ2VzID0gaW5mby0+bGluZWFyX3JhbmdlczsKKwkJcG11LT5kZXNjW2ldLm5fbGluZWFyX3JhbmdlcyA9IGluZm8tPm5fbGluZWFyX3JhbmdlczsKKworCQlpZiAoQkNNNTkwWFhfUkVHX0lTX0xETyhpKSkgeworCQkJcG11LT5kZXNjW2ldLm9wcyA9ICZiY201OTB4eF9vcHNfbGRvOworCQkJcG11LT5kZXNjW2ldLnZzZWxfbWFzayA9IEJDTTU5MFhYX0xET19WU0VMX01BU0s7CisJCX0gZWxzZSB7CisJCQlwbXUtPmRlc2NbaV0ub3BzID0gJmJjbTU5MHh4X29wc19kY2RjOworCQkJcG11LT5kZXNjW2ldLnZzZWxfbWFzayA9IEJDTTU5MFhYX1NSX1ZTRUxfTUFTSzsKKwkJfQorCisJCXBtdS0+ZGVzY1tpXS52c2VsX3JlZyA9IGJjbTU5MHh4X2dldF92c2VsX3JlZ2lzdGVyKGkpOworCQlwbXUtPmRlc2NbaV0uZW5hYmxlX2lzX2ludmVydGVkID0gdHJ1ZTsKKwkJcG11LT5kZXNjW2ldLmVuYWJsZV9tYXNrID0gQkNNNTkwWFhfUkVHX0VOQUJMRTsKKwkJcG11LT5kZXNjW2ldLmVuYWJsZV9yZWcgPSBiY201OTB4eF9nZXRfZW5hYmxlX3JlZ2lzdGVyKGkpOworCQlwbXUtPmRlc2NbaV0udHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFOworCQlwbXUtPmRlc2NbaV0ub3duZXIgPSBUSElTX01PRFVMRTsKKworCQljb25maWcuZGV2ID0gYmNtNTkweHgtPmRldjsKKwkJY29uZmlnLmluaXRfZGF0YSA9IHJlZ19kYXRhOworCQljb25maWcuZHJpdmVyX2RhdGEgPSBwbXU7CisJCWNvbmZpZy5yZWdtYXAgPSBiY201OTB4eC0+cmVnbWFwOworCisJCWlmIChiY201OTB4eF9yZWdfbWF0Y2hlcykKKwkJCWNvbmZpZy5vZl9ub2RlID0gYmNtNTkweHhfcmVnX21hdGNoZXNbaV0ub2Zfbm9kZTsKKworCQlyZGV2ID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJnBtdS0+ZGVzY1tpXSwKKwkJCQkJICAgICAgICZjb25maWcpOworCQlpZiAoSVNfRVJSKHJkZXYpKSB7CisJCQlkZXZfZXJyKGJjbTU5MHh4LT5kZXYsCisJCQkJImZhaWxlZCB0byByZWdpc3RlciAlcyByZWd1bGF0b3JcbiIsCisJCQkJcGRldi0+bmFtZSk7CisJCQlyZXR1cm4gUFRSX0VSUihyZGV2KTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBiY201OTB4eF9yZWd1bGF0b3JfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImJjbTU5MHh4LXZyZWdzIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBiY201OTB4eF9wcm9iZSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGJjbTU5MHh4X3JlZ3VsYXRvcl9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJNYXR0IFBvcnRlciA8bXBvcnRlckBsaW5hcm8ub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCQ001OTB4eCB2b2x0YWdlIHJlZ3VsYXRvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YmNtNTkweHgtdnJlZ3MiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYwppbmRleCBhZmNhMWJjLi5iYWM0ODVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCkBAIC0yMzk5LDYgKzIzOTksNyBAQAogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gcmVndWxhdG9yLT5yZGV2OwogCWludCByZXQgPSAwOwogCWludCBvbGRfbWluX3VWLCBvbGRfbWF4X3VWOworCWludCBjdXJyZW50X3VWOwogCiAJbXV0ZXhfbG9jaygmcmRldi0+bXV0ZXgpOwogCkBAIC0yNDA5LDYgKzI0MTAsMTkgQEAKIAlpZiAocmVndWxhdG9yLT5taW5fdVYgPT0gbWluX3VWICYmIHJlZ3VsYXRvci0+bWF4X3VWID09IG1heF91VikKIAkJZ290byBvdXQ7CiAKKwkvKiBJZiB3ZSdyZSB0cnlpbmcgdG8gc2V0IGEgcmFuZ2UgdGhhdCBvdmVybGFwcyB0aGUgY3VycmVudCB2b2x0YWdlLAorCSAqIHJldHVybiBzdWNjZXNmdWxseSBldmVuIHRob3VnaCB0aGUgcmVndWxhdG9yIGRvZXMgbm90IHN1cHBvcnQKKwkgKiBjaGFuZ2luZyB0aGUgdm9sdGFnZS4KKwkgKi8KKwlpZiAoIShyZGV2LT5jb25zdHJhaW50cy0+dmFsaWRfb3BzX21hc2sgJiBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UpKSB7CisJCWN1cnJlbnRfdVYgPSBfcmVndWxhdG9yX2dldF92b2x0YWdlKHJkZXYpOworCQlpZiAobWluX3VWIDw9IGN1cnJlbnRfdVYgJiYgY3VycmVudF91ViA8PSBtYXhfdVYpIHsKKwkJCXJlZ3VsYXRvci0+bWluX3VWID0gbWluX3VWOworCQkJcmVndWxhdG9yLT5tYXhfdVYgPSBtYXhfdVY7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwogCS8qIHNhbml0eSBjaGVjayAqLwogCWlmICghcmRldi0+ZGVzYy0+b3BzLT5zZXRfdm9sdGFnZSAmJgogCSAgICAhcmRldi0+ZGVzYy0+b3BzLT5zZXRfdm9sdGFnZV9zZWwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2RhOTA1Mi1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2RhOTA1Mi1yZWd1bGF0b3IuYwppbmRleCAzYWRlYWVmLi5mZGI2ZWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwNTItcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZGE5MDUyLXJlZ3VsYXRvci5jCkBAIC0yNDAsNiArMjQwLDMxIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBkYTkwNTJfcmVndWxhdG9yX3NldF92b2x0YWdlX3RpbWVfc2VsKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAorCQkJCQkJIHVuc2lnbmVkIGludCBvbGRfc2VsLAorCQkJCQkJIHVuc2lnbmVkIGludCBuZXdfc2VsKQoreworCXN0cnVjdCBkYTkwNTJfcmVndWxhdG9yICpyZWd1bGF0b3IgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXN0cnVjdCBkYTkwNTJfcmVndWxhdG9yX2luZm8gKmluZm8gPSByZWd1bGF0b3ItPmluZm87CisJaW50IGlkID0gcmRldl9nZXRfaWQocmRldik7CisJaW50IHJldCA9IDA7CisKKwkvKiBUaGUgRFZDIGNvbnRyb2xsZWQgTERPcyBhbmQgRENEQ3MgcmFtcCB3aXRoIDYuMjVtVi/CtXMgYWZ0ZXIgZW5hYmxpbmcKKwkgKiB0aGUgYWN0aXZhdGUgYml0LgorCSAqLworCXN3aXRjaCAoaWQpIHsKKwljYXNlIERBOTA1Ml9JRF9CVUNLMToKKwljYXNlIERBOTA1Ml9JRF9CVUNLMjoKKwljYXNlIERBOTA1Ml9JRF9CVUNLMzoKKwljYXNlIERBOTA1Ml9JRF9MRE8yOgorCWNhc2UgREE5MDUyX0lEX0xETzM6CisJCXJldCA9IChuZXdfc2VsIC0gb2xkX3NlbCkgKiBpbmZvLT5zdGVwX3VWIC8gNjI1MDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIGRhOTA1Ml9kY2RjX29wcyA9IHsKIAkuZ2V0X2N1cnJlbnRfbGltaXQgPSBkYTkwNTJfZGNkY19nZXRfY3VycmVudF9saW1pdCwKIAkuc2V0X2N1cnJlbnRfbGltaXQgPSBkYTkwNTJfZGNkY19zZXRfY3VycmVudF9saW1pdCwKQEAgLTI0OCw2ICsyNzMsNyBAQAogCS5tYXBfdm9sdGFnZSA9IGRhOTA1Ml9tYXBfdm9sdGFnZSwKIAkuZ2V0X3ZvbHRhZ2Vfc2VsID0gcmVndWxhdG9yX2dldF92b2x0YWdlX3NlbF9yZWdtYXAsCiAJLnNldF92b2x0YWdlX3NlbCA9IGRhOTA1Ml9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsLAorCS5zZXRfdm9sdGFnZV90aW1lX3NlbCA9IGRhOTA1Ml9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2VfdGltZV9zZWwsCiAJLmlzX2VuYWJsZWQgPSByZWd1bGF0b3JfaXNfZW5hYmxlZF9yZWdtYXAsCiAJLmVuYWJsZSA9IHJlZ3VsYXRvcl9lbmFibGVfcmVnbWFwLAogCS5kaXNhYmxlID0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLApAQCAtMjU4LDYgKzI4NCw3IEBACiAJLm1hcF92b2x0YWdlID0gZGE5MDUyX21hcF92b2x0YWdlLAogCS5nZXRfdm9sdGFnZV9zZWwgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKIAkuc2V0X3ZvbHRhZ2Vfc2VsID0gZGE5MDUyX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZV9zZWwsCisJLnNldF92b2x0YWdlX3RpbWVfc2VsID0gZGE5MDUyX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZV90aW1lX3NlbCwKIAkuaXNfZW5hYmxlZCA9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKIAkuZW5hYmxlID0gcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAsCiAJLmRpc2FibGUgPSByZWd1bGF0b3JfZGlzYWJsZV9yZWdtYXAsCkBAIC00MDEsNyArNDI4LDcgQEAKIAkJaWYgKCFucHJvb3QpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAotCQlucHJvb3QgPSBvZl9maW5kX25vZGVfYnlfbmFtZShucHJvb3QsICJyZWd1bGF0b3JzIik7CisJCW5wcm9vdCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wcm9vdCwgInJlZ3VsYXRvcnMiKTsKIAkJaWYgKCFucHJvb3QpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvZGE5MDU1LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZGE5MDU1LXJlZ3VsYXRvci5jCmluZGV4IGIxNGViZGEuLjk1MTYzMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2RhOTA1NS1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwNTUtcmVndWxhdG9yLmMKQEAgLTE5LDYgKzE5LDggQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9vZl9yZWd1bGF0b3IuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21mZC9kYTkwNTUvY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9kYTkwNTUvcmVnLmg+CkBAIC00NDYsNiArNDQ4LDkgQEAKIAlzdHJ1Y3QgZGE5MDU1X3JlZ3VsYXRvcl9pbmZvICppbmZvID0gcmVndWxhdG9yLT5pbmZvOwogCWludCByZXQgPSAwOwogCisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIDA7CisKIAlpZiAocGRhdGEtPmdwaW9fcmVuICYmIHBkYXRhLT5ncGlvX3JlbltpZF0pIHsKIAkJY2hhciBuYW1lWzE4XTsKIAkJaW50IGdwaW9fbXV4ID0gcGRhdGEtPmdwaW9fcmVuW2lkXTsKQEAgLTUzMCw2ICs1MzUsNTkgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorI2lmZGVmIENPTkZJR19PRgorc3RhdGljIHN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggZGE5MDU1X3JlZ19tYXRjaGVzW10gPSB7CisJeyAubmFtZSA9ICJCVUNLMSIsIH0sCisJeyAubmFtZSA9ICJCVUNLMiIsIH0sCisJeyAubmFtZSA9ICJMRE8xIiwgfSwKKwl7IC5uYW1lID0gIkxETzIiLCB9LAorCXsgLm5hbWUgPSAiTERPMyIsIH0sCisJeyAubmFtZSA9ICJMRE80IiwgfSwKKwl7IC5uYW1lID0gIkxETzUiLCB9LAorCXsgLm5hbWUgPSAiTERPNiIsIH0sCit9OworCitzdGF0aWMgaW50IGRhOTA1NV9yZWd1bGF0b3JfZHRfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGE5MDU1X3JlZ3VsYXRvciAqcmVndWxhdG9yLAorCQkJCSAgICBzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyAqY29uZmlnLAorCQkJCSAgICBpbnQgcmVnaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucHJvb3QsICpucDsKKwlpbnQgcmV0OworCisJbnByb290ID0gb2Zfbm9kZV9nZXQocGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSk7CisJaWYgKCFucHJvb3QpCisJCXJldHVybiAtRU5PREVWOworCisJbnAgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShucHJvb3QsICJyZWd1bGF0b3JzIik7CisJaWYgKCFucCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBvZl9yZWd1bGF0b3JfbWF0Y2goJnBkZXYtPmRldiwgbnAsICZkYTkwNTVfcmVnX21hdGNoZXNbcmVnaWRdLCAxKTsKKwlvZl9ub2RlX3B1dChucHJvb3QpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkVycm9yIG1hdGNoaW5nIHJlZ3VsYXRvcjogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJY29uZmlnLT5pbml0X2RhdGEgPSBkYTkwNTVfcmVnX21hdGNoZXNbcmVnaWRdLmluaXRfZGF0YTsKKwljb25maWctPm9mX25vZGUgPSBkYTkwNTVfcmVnX21hdGNoZXNbcmVnaWRdLm9mX25vZGU7CisKKwlpZiAoIWNvbmZpZy0+b2Zfbm9kZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBkYTkwNTVfcmVndWxhdG9yX2R0X2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgICAgICAgc3RydWN0IGRhOTA1NV9yZWd1bGF0b3IgKnJlZ3VsYXRvciwKKwkJCQkgICAgICAgc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgKmNvbmZpZywKKwkJCQkgICAgICAgaW50IHJlZ2lkKQoreworCXJldHVybiAtRU5PREVWOworfQorI2VuZGlmIC8qIENPTkZJR19PRiAqLworCiBzdGF0aWMgaW50IGRhOTA1NV9yZWd1bGF0b3JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07CkBAIC01MzgsOSArNTk2LDYgQEAKIAlzdHJ1Y3QgZGE5MDU1X3BkYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGE5MDU1LT5kZXYpOwogCWludCByZXQsIGlycTsKIAotCWlmIChwZGF0YSA9PSBOVUxMIHx8IHBkYXRhLT5yZWd1bGF0b3JzW3BkZXYtPmlkXSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCXJlZ3VsYXRvciA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGRhOTA1NV9yZWd1bGF0b3IpLAogCQkJCSBHRlBfS0VSTkVMKTsKIAlpZiAoIXJlZ3VsYXRvcikKQEAgLTU1Nyw4ICs2MTIsMTQgQEAKIAljb25maWcuZHJpdmVyX2RhdGEgPSByZWd1bGF0b3I7CiAJY29uZmlnLnJlZ21hcCA9IGRhOTA1NS0+cmVnbWFwOwogCi0JaWYgKHBkYXRhICYmIHBkYXRhLT5yZWd1bGF0b3JzKQorCWlmIChwZGF0YSAmJiBwZGF0YS0+cmVndWxhdG9ycykgewogCQljb25maWcuaW5pdF9kYXRhID0gcGRhdGEtPnJlZ3VsYXRvcnNbcGRldi0+aWRdOworCX0gZWxzZSB7CisJCXJldCA9IGRhOTA1NV9yZWd1bGF0b3JfZHRfaW5pdChwZGV2LCByZWd1bGF0b3IsICZjb25maWcsCisJCQkJCSAgICAgICBwZGV2LT5pZCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CiAKIAlyZXQgPSBkYTkwNTVfZ3Bpb19pbml0KHJlZ3VsYXRvciwgJmNvbmZpZywgcGRhdGEsIHBkZXYtPmlkKTsKIAlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2RhOTA2My1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2RhOTA2My1yZWd1bGF0b3IuYwppbmRleCA5MWU5OWEyLi43Yzk0NjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwNjMtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZGE5MDYzLXJlZ3VsYXRvci5jCkBAIC0zNjUsNyArMzY1LDcgQEAKIAogCXNlbCA9IHJlZ3VsYXRvcl9tYXBfdm9sdGFnZV9saW5lYXIocmRldiwgdVYsIHVWKTsKIAlpZiAoc2VsIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBzZWw7CiAKIAlzZWwgPDw9IGZmcyhyZGV2LT5kZXNjLT52c2VsX21hc2spIC0gMTsKIApAQCAtNjY2LDcgKzY2Niw3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwogCWludCBpLCBuLCBudW07CiAKLQlub2RlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUocGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSwgInJlZ3VsYXRvcnMiKTsKKwlub2RlID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUocGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSwgInJlZ3VsYXRvcnMiKTsKIAlpZiAoIW5vZGUpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiUmVndWxhdG9ycyBkZXZpY2Ugbm9kZSBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKQEAgLTY3NCw2ICs2NzQsNyBAQAogCiAJbnVtID0gb2ZfcmVndWxhdG9yX21hdGNoKCZwZGV2LT5kZXYsIG5vZGUsIGRhOTA2M19tYXRjaGVzLAogCQkJCSBBUlJBWV9TSVpFKGRhOTA2M19tYXRjaGVzKSk7CisJb2Zfbm9kZV9wdXQobm9kZSk7CiAJaWYgKG51bSA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIG1hdGNoIHJlZ3VsYXRvcnNcbiIpOwogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTcxMCw3ICs3MTEsNyBAQAogCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAogCQlzdHJ1Y3Qgb2ZfcmVndWxhdG9yX21hdGNoICoqZGE5MDYzX3JlZ19tYXRjaGVzKQogewotCWRhOTA2M19yZWdfbWF0Y2hlcyA9IE5VTEw7CisJKmRhOTA2M19yZWdfbWF0Y2hlcyA9IE5VTEw7CiAJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CiB9CiAjZW5kaWYKQEAgLTc1Niw3ICs3NTcsNyBAQAogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCSJFcnJvciB3aGlsZSByZWFkaW5nIEJVQ0tzIGNvbmZpZ3VyYXRpb25cbiIpOwotCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIHJldDsKIAl9CiAJYmNvcmVzX21lcmdlZCA9IHZhbCAmIERBOTA2M19CQ09SRV9NRVJHRTsKIAlibWVtX2Jpb19tZXJnZWQgPSB2YWwgJiBEQTkwNjNfQlVDS19NRVJHRTsKQEAgLTc3NSwxMCArNzc2LDggQEAKIAlzaXplID0gc2l6ZW9mKHN0cnVjdCBkYTkwNjNfcmVndWxhdG9ycykgKwogCQluX3JlZ3VsYXRvcnMgKiBzaXplb2Yoc3RydWN0IGRhOTA2M19yZWd1bGF0b3IpOwogCXJlZ3VsYXRvcnMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZWd1bGF0b3JzKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIG1lbW9yeSBmb3IgcmVndWxhdG9yc1xuIik7CisJaWYgKCFyZWd1bGF0b3JzKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlyZWd1bGF0b3JzLT5uX3JlZ3VsYXRvcnMgPSBuX3JlZ3VsYXRvcnM7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcmVndWxhdG9ycyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kYTkyMTAtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYTkyMTAtcmVndWxhdG9yLmMKaW5kZXggNmY1ZWNiZS4uN2EzMjBkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZGE5MjEwLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2RhOTIxMC1yZWd1bGF0b3IuYwpAQCAtMTM0LDExICsxMzQsOCBAQAogCWludCBlcnJvcjsKIAogCWNoaXAgPSBkZXZtX2t6YWxsb2MoJmkyYy0+ZGV2LCBzaXplb2Yoc3RydWN0IGRhOTIxMCksIEdGUF9LRVJORUwpOwotCWlmIChOVUxMID09IGNoaXApIHsKLQkJZGV2X2VycigmaTJjLT5kZXYsCi0JCQkiQ2Fubm90IGt6YWxsb2MgbWVtb3J5IGZvciByZWd1bGF0b3Igc3RydWN0dXJlXG4iKTsKKwlpZiAoIWNoaXApCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWNoaXAtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyYywgJmRhOTIxMF9yZWdtYXBfY29uZmlnKTsKIAlpZiAoSVNfRVJSKGNoaXAtPnJlZ21hcCkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2RiODUwMC1wcmNtdS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZGI4NTAwLXByY211LmMKaW5kZXggODQ2YWNmMi4uNjE3YzFhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZGI4NTAwLXByY211LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZGI4NTAwLXByY211LmMKQEAgLTI2Myw2ICsyNjMsOCBAQAogCQkJLm9wcwk9ICZkYjg1MDBfcmVndWxhdG9yX29wcywKIAkJCS50eXBlCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCiAJCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJCS5maXhlZF91ViA9IDE4MDAwMDAsCisJCQkubl92b2x0YWdlcyA9IDEsCiAJCX0sCiAJCS5leGNsdWRlX2Zyb21fcG93ZXJfc3RhdGUgPSB0cnVlLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kYng1MDAtcHJjbXUuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2RieDUwMC1wcmNtdS5jCmluZGV4IGNlODlmNzguLjJkMTZiOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2RieDUwMC1wcmNtdS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2RieDUwMC1wcmNtdS5jCkBAIC03OCw2ICs3OCw3IEBACiB2b2lkIHV4NTAwX3JlZ3VsYXRvcl9zdXNwZW5kX2RlYnVnKHZvaWQpCiB7CiAJaW50IGk7CisKIAlmb3IgKGkgPSAwOyBpIDwgcmRlYnVnLm51bV9yZWd1bGF0b3JzOyBpKyspCiAJCXJkZWJ1Zy5zdGF0ZV9iZWZvcmVfc3VzcGVuZFtpXSA9CiAJCQlyZGVidWcucmVndWxhdG9yX2FycmF5W2ldLmlzX2VuYWJsZWQ7CkBAIC04Niw2ICs4Nyw3IEBACiB2b2lkIHV4NTAwX3JlZ3VsYXRvcl9yZXN1bWVfZGVidWcodm9pZCkKIHsKIAlpbnQgaTsKKwogCWZvciAoaSA9IDA7IGkgPCByZGVidWcubnVtX3JlZ3VsYXRvcnM7IGkrKykKIAkJcmRlYnVnLnN0YXRlX2FmdGVyX3N1c3BlbmRbaV0gPQogCQkJcmRlYnVnLnJlZ3VsYXRvcl9hcnJheVtpXS5pc19lbmFibGVkOwpAQCAtMTI3LDkgKzEyOSw5IEBACiAJaW50IGk7CiAKIAkvKiBwcmludCBkdW1wIGhlYWRlciAqLwotCWVyciA9IHNlcV9wcmludGYocywgInV4NTAwLXJlZ3VsYXRvciBzdGF0dXM6XG4iKTsKKwllcnIgPSBzZXFfcHV0cyhzLCAidXg1MDAtcmVndWxhdG9yIHN0YXR1czpcbiIpOwogCWlmIChlcnIgPCAwKQotCQlkZXZfZXJyKGRldiwgInNlcV9wcmludGYgb3ZlcmZsb3dcbiIpOworCQlkZXZfZXJyKGRldiwgInNlcV9wdXRzIG92ZXJmbG93XG4iKTsKIAogCWVyciA9IHNlcV9wcmludGYocywgIiUzMXMgOiAlOHMgOiAlOHNcbiIsICJjdXJyZW50IiwKIAkJImJlZm9yZSIsICJhZnRlciIpOwpAQCAtMjAyLDE4ICsyMDQsMTIgQEAKIAlyZGVidWcubnVtX3JlZ3VsYXRvcnMgPSBudW1fcmVndWxhdG9yczsKIAogCXJkZWJ1Zy5zdGF0ZV9iZWZvcmVfc3VzcGVuZCA9IGt6YWxsb2MobnVtX3JlZ3VsYXRvcnMsIEdGUF9LRVJORUwpOwotCWlmICghcmRlYnVnLnN0YXRlX2JlZm9yZV9zdXNwZW5kKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBzYXZpbmcgc3RhdGVcbiIpOworCWlmICghcmRlYnVnLnN0YXRlX2JlZm9yZV9zdXNwZW5kKQogCQlnb3RvIGV4aXRfZGVzdHJveV9wb3dlcl9zdGF0ZTsKLQl9CiAKIAlyZGVidWcuc3RhdGVfYWZ0ZXJfc3VzcGVuZCA9IGt6YWxsb2MobnVtX3JlZ3VsYXRvcnMsIEdGUF9LRVJORUwpOwotCWlmICghcmRlYnVnLnN0YXRlX2FmdGVyX3N1c3BlbmQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJImNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNhdmluZyBzdGF0ZVxuIik7CisJaWYgKCFyZGVidWcuc3RhdGVfYWZ0ZXJfc3VzcGVuZCkKIAkJZ290byBleGl0X2ZyZWU7Ci0JfQogCiAJZGJ4NTAwX3JlZ3VsYXRvcl90ZXN0Y2FzZShyZWd1bGF0b3JfaW5mbywgbnVtX3JlZ3VsYXRvcnMpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvZHVtbXkuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2R1bW15LmMKaW5kZXggZGY5ZjQyNS4uMjQzNmRiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZHVtbXkuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9kdW1teS5jCkBAIC0yNSw3ICsyNSwxMSBAQAogCiBzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZHVtbXlfcmVndWxhdG9yX3JkZXY7CiAKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBkdW1teV9pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBkdW1teV9pbml0ZGF0YSA9IHsKKwkuY29uc3RyYWludHMgPSB7CisJCS5hbHdheXNfb24gPSAxLAorCX0sCit9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgZHVtbXlfb3BzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9mYW41MzU1NS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZmFuNTM1NTUuYwppbmRleCA3Y2EzZDllLi43MTRmZDlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9mYW41MzU1NS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2ZhbjUzNTU1LmMKQEAgLTkwLDExICs5MCwxMSBAQAogCQlyZXR1cm4gMDsKIAlyZXQgPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfbGluZWFyKHJkZXYsIHVWLCB1Vik7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gcmV0OwogCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkaS0+cmVnbWFwLCBkaS0+c2xlZXBfcmVnLAogCQkJCQlWU0VMX05TRUxfTUFTSywgcmV0KTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiByZXQ7CiAJLyogQ2FjaGUgdGhlIHNsZWVwIHZvbHRhZ2Ugc2V0dGluZy4KIAkgKiBNaWdodCBub3QgYmUgdGhlIHJlYWwgdm9sdGFnZSB3aGljaCBpcyByb3VuZGVkICovCiAJZGktPnNsZWVwX3ZvbF9jYWNoZSA9IHVWOwpAQCAtMjQ0LDEwICsyNDQsOSBAQAogCiAJZGkgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IGZhbjUzNTU1X2RldmljZV9pbmZvKSwKIAkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkaSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkZXZpY2UgaW5mbyBkYXRhIVxuIik7CisJaWYgKCFkaSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCiAJZGktPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJmZhbjUzNTU1X3JlZ21hcF9jb25maWcpOwogCWlmIChJU19FUlIoZGktPnJlZ21hcCkpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVnbWFwIVxuIik7CkBAIC0yNjAsMTQgKzI1OSwxNCBAQAogCXJldCA9IHJlZ21hcF9yZWFkKGRpLT5yZWdtYXAsIEZBTjUzNTU1X0lEMSwgJnZhbCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGNoaXAgSUQhXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiByZXQ7CiAJfQogCWRpLT5jaGlwX2lkID0gdmFsICYgRElFX0lEOwogCS8qIEdldCBjaGlwIHJldmlzaW9uICovCiAJcmV0ID0gcmVnbWFwX3JlYWQoZGktPnJlZ21hcCwgRkFONTM1NTVfSUQyLCAmdmFsKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBnZXQgY2hpcCBSZXYhXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiByZXQ7CiAJfQogCWRpLT5jaGlwX3JldiA9IHZhbCAmIERJRV9SRVY7CiAJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiRkFONTM1NTUgT3B0aW9uWyVkXSBSZXZbJWRdIERldGVjdGVkIVxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2ZpeGVkLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9maXhlZC5jCmluZGV4IDVlYTY0YjkuLmM2MWY3ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2ZpeGVkLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZml4ZWQuYwpAQCAtMTMwLDE3ICsxMzAsMTUgQEAKIAogCWRydmRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBmaXhlZF92b2x0YWdlX2RhdGEpLAogCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmIChkcnZkYXRhID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGRldmljZSBkYXRhXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnI7Ci0JfQorCWlmICghZHJ2ZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQlkcnZkYXRhLT5kZXNjLm5hbWUgPSBrc3RyZHVwKGNvbmZpZy0+c3VwcGx5X25hbWUsIEdGUF9LRVJORUwpOworCWRydmRhdGEtPmRlc2MubmFtZSA9IGRldm1fa3N0cmR1cCgmcGRldi0+ZGV2LAorCQkJCQkgIGNvbmZpZy0+c3VwcGx5X25hbWUsCisJCQkJCSAgR0ZQX0tFUk5FTCk7CiAJaWYgKGRydmRhdGEtPmRlc2MubmFtZSA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzdXBwbHkgbmFtZVxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJZHJ2ZGF0YS0+ZGVzYy50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0U7CiAJZHJ2ZGF0YS0+ZGVzYy5vd25lciA9IFRISVNfTU9EVUxFOwpAQCAtMTQ5LDEzICsxNDcsMTMgQEAKIAlkcnZkYXRhLT5kZXNjLmVuYWJsZV90aW1lID0gY29uZmlnLT5zdGFydHVwX2RlbGF5OwogCiAJaWYgKGNvbmZpZy0+aW5wdXRfc3VwcGx5KSB7Ci0JCWRydmRhdGEtPmRlc2Muc3VwcGx5X25hbWUgPSBrc3RyZHVwKGNvbmZpZy0+aW5wdXRfc3VwcGx5LAotCQkJCQkJCUdGUF9LRVJORUwpOworCQlkcnZkYXRhLT5kZXNjLnN1cHBseV9uYW1lID0gZGV2bV9rc3RyZHVwKCZwZGV2LT5kZXYsCisJCQkJCSAgICBjb25maWctPmlucHV0X3N1cHBseSwKKwkJCQkJICAgIEdGUF9LRVJORUwpOwogCQlpZiAoIWRydmRhdGEtPmRlc2Muc3VwcGx5X25hbWUpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCQkiRmFpbGVkIHRvIGFsbG9jYXRlIGlucHV0IHN1cHBseVxuIik7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBlcnJfbmFtZTsKKwkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJfQogCkBAIC0xODYsMTEgKzE4NCwxMiBAQAogCWNmZy5kcml2ZXJfZGF0YSA9IGRydmRhdGE7CiAJY2ZnLm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAotCWRydmRhdGEtPmRldiA9IHJlZ3VsYXRvcl9yZWdpc3RlcigmZHJ2ZGF0YS0+ZGVzYywgJmNmZyk7CisJZHJ2ZGF0YS0+ZGV2ID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmRydmRhdGEtPmRlc2MsCisJCQkJCSAgICAgICAmY2ZnKTsKIAlpZiAoSVNfRVJSKGRydmRhdGEtPmRldikpIHsKIAkJcmV0ID0gUFRSX0VSUihkcnZkYXRhLT5kZXYpOwogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgcmVndWxhdG9yOiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJfaW5wdXQ7CisJCXJldHVybiByZXQ7CiAJfQogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZHJ2ZGF0YSk7CkBAIC0xOTksMjQgKzE5OCw2IEBACiAJCWRydmRhdGEtPmRlc2MuZml4ZWRfdVYpOwogCiAJcmV0dXJuIDA7Ci0KLWVycl9pbnB1dDoKLQlrZnJlZShkcnZkYXRhLT5kZXNjLnN1cHBseV9uYW1lKTsKLWVycl9uYW1lOgotCWtmcmVlKGRydmRhdGEtPmRlc2MubmFtZSk7Ci1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByZWdfZml4ZWRfdm9sdGFnZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZml4ZWRfdm9sdGFnZV9kYXRhICpkcnZkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQlyZWd1bGF0b3JfdW5yZWdpc3RlcihkcnZkYXRhLT5kZXYpOwotCWtmcmVlKGRydmRhdGEtPmRlc2Muc3VwcGx5X25hbWUpOwotCWtmcmVlKGRydmRhdGEtPmRlc2MubmFtZSk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX09GKQpAQCAtMjI5LDcgKzIxMCw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJlZ3VsYXRvcl9maXhlZF92b2x0YWdlX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gcmVnX2ZpeGVkX3ZvbHRhZ2VfcHJvYmUsCi0JLnJlbW92ZQkJPSByZWdfZml4ZWRfdm9sdGFnZV9yZW1vdmUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCQk9ICJyZWctZml4ZWQtdm9sdGFnZSIsCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2dwaW8tcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9ncGlvLXJlZ3VsYXRvci5jCmluZGV4IGMwYTFkMDAuLjk4OWIyM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2dwaW8tcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZ3Bpby1yZWd1bGF0b3IuYwpAQCAtMTM2LDcgKzEzNiw2IEBACiBvZl9nZXRfZ3Bpb19yZWd1bGF0b3JfY29uZmlnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAlzdHJ1Y3QgZ3Bpb19yZWd1bGF0b3JfY29uZmlnICpjb25maWc7Ci0Jc3RydWN0IHByb3BlcnR5ICpwcm9wOwogCWNvbnN0IGNoYXIgKnJlZ3R5cGU7CiAJaW50IHByb3BsZW4sIGdwaW8sIGk7CiAJaW50IHJldDsKQEAgLTE3MiwyMiArMTcxLDM1IEBACiAJaWYgKCFjb25maWctPmdwaW9zKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAorCXByb3BsZW4gPSBvZl9wcm9wZXJ0eV9jb3VudF91MzJfZWxlbXMobnAsICJncGlvcy1zdGF0ZXMiKTsKKwkvKiBvcHRpb25hbCBwcm9wZXJ0eSAqLworCWlmIChwcm9wbGVuIDwgMCkKKwkJcHJvcGxlbiA9IDA7CisKKwlpZiAocHJvcGxlbiA+IDAgJiYgcHJvcGxlbiAhPSBjb25maWctPm5yX2dwaW9zKSB7CisJCWRldl93YXJuKGRldiwgImdwaW9zIDwtPiBncGlvcy1zdGF0ZXMgbWlzbWF0Y2hcbiIpOworCQlwcm9wbGVuID0gMDsKKwl9CisKIAlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5ucl9ncGlvczsgaSsrKSB7CiAJCWdwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgImdwaW9zIiwgaSk7CiAJCWlmIChncGlvIDwgMCkKIAkJCWJyZWFrOwogCQljb25maWctPmdwaW9zW2ldLmdwaW8gPSBncGlvOworCQlpZiAocHJvcGxlbiA+IDApIHsKKwkJCW9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KG5wLCAiZ3Bpb3Mtc3RhdGVzIiwgaSwgJnJldCk7CisJCQlpZiAocmV0KQorCQkJCWNvbmZpZy0+Z3Bpb3NbaV0uZmxhZ3MgPSBHUElPRl9PVVRfSU5JVF9ISUdIOworCQl9CiAJfQogCiAJLyogRmV0Y2ggc3RhdGVzLiAqLwotCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCAic3RhdGVzIiwgTlVMTCk7Ci0JaWYgKCFwcm9wKSB7CisJcHJvcGxlbiA9IG9mX3Byb3BlcnR5X2NvdW50X3UzMl9lbGVtcyhucCwgInN0YXRlcyIpOworCWlmIChwcm9wbGVuIDwgMCkgewogCQlkZXZfZXJyKGRldiwgIk5vICdzdGF0ZXMnIHByb3BlcnR5IGZvdW5kXG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQogCi0JcHJvcGxlbiA9IHByb3AtPmxlbmd0aCAvIHNpemVvZihpbnQpOwotCiAJY29uZmlnLT5zdGF0ZXMgPSBkZXZtX2t6YWxsb2MoZGV2LAogCQkJCXNpemVvZihzdHJ1Y3QgZ3Bpb19yZWd1bGF0b3Jfc3RhdGUpCiAJCQkJKiAocHJvcGxlbiAvIDIpLApAQCAtMTk2LDEwICsyMDgsMTAgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcHJvcGxlbiAvIDI7IGkrKykgewotCQljb25maWctPnN0YXRlc1tpXS52YWx1ZSA9Ci0JCQliZTMyX3RvX2NwdXAoKGludCAqKXByb3AtPnZhbHVlICsgKGkgKiAyKSk7Ci0JCWNvbmZpZy0+c3RhdGVzW2ldLmdwaW9zID0KLQkJCWJlMzJfdG9fY3B1cCgoaW50ICopcHJvcC0+dmFsdWUgKyAoaSAqIDIgKyAxKSk7CisJCW9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KG5wLCAic3RhdGVzIiwgaSAqIDIsCisJCQkJCSAgICZjb25maWctPnN0YXRlc1tpXS52YWx1ZSk7CisJCW9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KG5wLCAic3RhdGVzIiwgaSAqIDIgKyAxLAorCQkJCQkgICAmY29uZmlnLT5zdGF0ZXNbaV0uZ3Bpb3MpOwogCX0KIAljb25maWctPm5yX3N0YXRlcyA9IGk7CiAKQEAgLTIzOSwxMCArMjUxLDggQEAKIAogCWRydmRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBncGlvX3JlZ3VsYXRvcl9kYXRhKSwKIAkJCSAgICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoZHJ2ZGF0YSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkZXZpY2UgZGF0YVxuIik7CisJaWYgKGRydmRhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJZHJ2ZGF0YS0+ZGVzYy5uYW1lID0ga3N0cmR1cChjb25maWctPnN1cHBseV9uYW1lLCBHRlBfS0VSTkVMKTsKIAlpZiAoZHJ2ZGF0YS0+ZGVzYy5uYW1lID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2hlbHBlcnMuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2hlbHBlcnMuYwppbmRleCBlMjIxYTI3Li5jYmMzOTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9oZWxwZXJzLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvaGVscGVycy5jCkBAIC0zNywxMCArMzcsMTcgQEAKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CiAKLQlpZiAocmRldi0+ZGVzYy0+ZW5hYmxlX2lzX2ludmVydGVkKQotCQlyZXR1cm4gKHZhbCAmIHJkZXYtPmRlc2MtPmVuYWJsZV9tYXNrKSA9PSAwOwotCWVsc2UKLQkJcmV0dXJuICh2YWwgJiByZGV2LT5kZXNjLT5lbmFibGVfbWFzaykgIT0gMDsKKwl2YWwgJj0gcmRldi0+ZGVzYy0+ZW5hYmxlX21hc2s7CisKKwlpZiAocmRldi0+ZGVzYy0+ZW5hYmxlX2lzX2ludmVydGVkKSB7CisJCWlmIChyZGV2LT5kZXNjLT5lbmFibGVfdmFsKQorCQkJcmV0dXJuIHZhbCAhPSByZGV2LT5kZXNjLT5lbmFibGVfdmFsOworCQlyZXR1cm4gdmFsID09IDA7CisJfSBlbHNlIHsKKwkJaWYgKHJkZXYtPmRlc2MtPmVuYWJsZV92YWwpCisJCQlyZXR1cm4gdmFsID09IHJkZXYtPmRlc2MtPmVuYWJsZV92YWw7CisJCXJldHVybiB2YWwgIT0gMDsKKwl9CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZWd1bGF0b3JfaXNfZW5hYmxlZF9yZWdtYXApOwogCkBAIC01NywxMCArNjQsMTMgQEAKIHsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCi0JaWYgKHJkZXYtPmRlc2MtPmVuYWJsZV9pc19pbnZlcnRlZCkKLQkJdmFsID0gMDsKLQllbHNlCi0JCXZhbCA9IHJkZXYtPmRlc2MtPmVuYWJsZV9tYXNrOworCWlmIChyZGV2LT5kZXNjLT5lbmFibGVfaXNfaW52ZXJ0ZWQpIHsKKwkJdmFsID0gcmRldi0+ZGVzYy0+ZGlzYWJsZV92YWw7CisJfSBlbHNlIHsKKwkJdmFsID0gcmRldi0+ZGVzYy0+ZW5hYmxlX3ZhbDsKKwkJaWYgKCF2YWwpCisJCQl2YWwgPSByZGV2LT5kZXNjLT5lbmFibGVfbWFzazsKKwl9CiAKIAlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJkZXYtPnJlZ21hcCwgcmRldi0+ZGVzYy0+ZW5hYmxlX3JlZywKIAkJCQkgIHJkZXYtPmRlc2MtPmVuYWJsZV9tYXNrLCB2YWwpOwpAQCAtODAsMTAgKzkwLDEzIEBACiB7CiAJdW5zaWduZWQgaW50IHZhbDsKIAotCWlmIChyZGV2LT5kZXNjLT5lbmFibGVfaXNfaW52ZXJ0ZWQpCi0JCXZhbCA9IHJkZXYtPmRlc2MtPmVuYWJsZV9tYXNrOwotCWVsc2UKLQkJdmFsID0gMDsKKwlpZiAocmRldi0+ZGVzYy0+ZW5hYmxlX2lzX2ludmVydGVkKSB7CisJCXZhbCA9IHJkZXYtPmRlc2MtPmVuYWJsZV92YWw7CisJCWlmICghdmFsKQorCQkJdmFsID0gcmRldi0+ZGVzYy0+ZW5hYmxlX21hc2s7CisJfSBlbHNlIHsKKwkJdmFsID0gcmRldi0+ZGVzYy0+ZGlzYWJsZV92YWw7CisJfQogCiAJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhyZGV2LT5yZWdtYXAsIHJkZXYtPmRlc2MtPmVuYWJsZV9yZWcsCiAJCQkJICByZGV2LT5kZXNjLT5lbmFibGVfbWFzaywgdmFsKTsKQEAgLTQxOSwxMCArNDMyLDEzIEBACiB7CiAJdW5zaWduZWQgaW50IHZhbDsKIAotCWlmIChlbmFibGUpCi0JCXZhbCA9IHJkZXYtPmRlc2MtPmJ5cGFzc19tYXNrOwotCWVsc2UKLQkJdmFsID0gMDsKKwlpZiAoZW5hYmxlKSB7CisJCXZhbCA9IHJkZXYtPmRlc2MtPmJ5cGFzc192YWxfb247CisJCWlmICghdmFsKQorCQkJdmFsID0gcmRldi0+ZGVzYy0+YnlwYXNzX21hc2s7CisJfSBlbHNlIHsKKwkJdmFsID0gcmRldi0+ZGVzYy0+YnlwYXNzX3ZhbF9vZmY7CisJfQogCiAJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhyZGV2LT5yZWdtYXAsIHJkZXYtPmRlc2MtPmJ5cGFzc19yZWcsCiAJCQkJICByZGV2LT5kZXNjLT5ieXBhc3NfbWFzaywgdmFsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2xwMzk3MS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbHAzOTcxLmMKaW5kZXggM2IxMTAyYi4uNjZmZDIzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbHAzOTcxLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbHAzOTcxLmMKQEAgLTMyNyw3ICszMjcsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoaTJjLCByZWcpOwogCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIHJldDsKIAogCSpkZXN0ID0gcmV0OwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbHA4NzJ4LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9scDg3MnguYwppbmRleCAyZTQ3MzRmLi4yZTAyMmFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9scDg3MnguYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9scDg3MnguYwpAQCAtMjExLDcgKzIxMSw3IEBACiAKIAlyZXQgPSBscDg3MnhfcmVhZF9ieXRlKGxwLCBMUDg3MlhfR0VORVJBTF9DRkcsICZ2YWwpOwogCWlmIChyZXQpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gcmV0OwogCiAJdmFsID0gKHZhbCAmIG1hc2spID4+IHNoaWZ0OwogCWlmICh2YWwgPj0gc2l6ZSkKQEAgLTIyOSw3ICsyMjksNyBAQAogCXU4IGFkZHIsIHZhbDsKIAogCWlmICh0aW1lX3N0ZXBfdXMgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHRpbWVfc3RlcF91czsKIAogCXN3aXRjaCAocmlkKSB7CiAJY2FzZSBMUDg3MjBfSURfTERPMSAuLi4gTFA4NzIwX0lEX0JVQ0s6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXgxNDU3Ny5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4MTQ1NzcuYwppbmRleCBlMDYxOTUyLi5lZDYwYmFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXgxNDU3Ny5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDE0NTc3LmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogbWF4MTQ1NzcuYyAtIFJlZ3VsYXRvciBkcml2ZXIgZm9yIHRoZSBNYXhpbSAxNDU3NwogICoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMsMjAxNCBTYW1zdW5nIEVsZWN0cm9uaWNzCiAgKiBLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraUBzYW1zdW5nLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMjIsMTIgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tZmQvbWF4MTQ1NzctcHJpdmF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9vZl9yZWd1bGF0b3IuaD4KIAotc3RydWN0IG1heDE0NTc3X3JlZ3VsYXRvciB7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBtYXgxNDU3NyAqbWF4MTQ1Nzc7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKipyZWd1bGF0b3JzOwotfTsKLQogc3RhdGljIGludCBtYXgxNDU3N19yZWdfaXNfZW5hYmxlZChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKIAlpbnQgcmlkID0gcmRldl9nZXRfaWQocmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXgxNTg2LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXgxNTg2LmMKaW5kZXggZTI0MmRkMy4uZDIzZDA1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4MTU4Ni5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDE1ODYuYwpAQCAtNDYsOCArNDYsNiBAQAogCiAJdW5zaWduZWQgaW50IHYzX2N1cnJfc2VsOwogCXVuc2lnbmVkIGludCB2Nl9jdXJyX3NlbDsKLQotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2WzBdOwogfTsKIAogLyoKQEAgLTE2MiwxNCArMTYwLDEyIEBACiBzdGF0aWMgaW50IG1heDE1ODZfcG1pY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaTJjX2lkKQogewotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICoqcmRldjsKIAlzdHJ1Y3QgbWF4MTU4Nl9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJmNsaWVudC0+ZGV2KTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07CiAJc3RydWN0IG1heDE1ODZfZGF0YSAqbWF4MTU4NjsKIAlpbnQgaSwgaWQ7CiAKLQltYXgxNTg2ID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBtYXgxNTg2X2RhdGEpICsKLQkJCXNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKSAqIChNQVgxNTg2X1Y2ICsgMSksCisJbWF4MTU4NiA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZihzdHJ1Y3QgbWF4MTU4Nl9kYXRhKSwKIAkJCUdGUF9LRVJORUwpOwogCWlmICghbWF4MTU4NikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xODYsOCArMTgyLDkgQEAKIAltYXgxNTg2LT52M19jdXJyX3NlbCA9IDI0OyAvKiAxLjNWICovCiAJbWF4MTU4Ni0+djZfY3Vycl9zZWwgPSAwOwogCi0JcmRldiA9IG1heDE1ODYtPnJkZXY7CiAJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fc3ViZGV2cyAmJiBpIDw9IE1BWDE1ODZfVjY7IGkrKykgeworCQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKKwogCQlpZCA9IHBkYXRhLT5zdWJkZXZzW2ldLmlkOwogCQlpZiAoIXBkYXRhLT5zdWJkZXZzW2ldLnBsYXRmb3JtX2RhdGEpCiAJCQljb250aW51ZTsKQEAgLTIwNywxMiArMjA0LDEyIEBACiAJCWNvbmZpZy5pbml0X2RhdGEgPSBwZGF0YS0+c3ViZGV2c1tpXS5wbGF0Zm9ybV9kYXRhOwogCQljb25maWcuZHJpdmVyX2RhdGEgPSBtYXgxNTg2OwogCi0JCXJkZXZbaV0gPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmY2xpZW50LT5kZXYsCisJCXJkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmY2xpZW50LT5kZXYsCiAJCQkJCQkgICZtYXgxNTg2X3JlZ1tpZF0sICZjb25maWcpOwotCQlpZiAoSVNfRVJSKHJkZXZbaV0pKSB7CisJCWlmIChJU19FUlIocmRldikpIHsKIAkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyICVzXG4iLAogCQkJCW1heDE1ODZfcmVnW2lkXS5uYW1lKTsKLQkJCXJldHVybiBQVFJfRVJSKHJkZXZbaV0pOworCQkJcmV0dXJuIFBUUl9FUlIocmRldik7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDc3Njg2LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg3NzY4Ni5jCmluZGV4IGFlMDAxY2MuLmVmMWFmMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDc3Njg2LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4Nzc2ODYuYwpAQCAtNjUsNyArNjUsNiBAQAogfTsKIAogc3RydWN0IG1heDc3Njg2X2RhdGEgewotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2W01BWDc3Njg2X1JFR1VMQVRPUlNdOwogCXVuc2lnbmVkIGludCBvcG1vZGVbTUFYNzc2ODZfUkVHVUxBVE9SU107CiB9OwogCkBAIC00MDAsNyArMzk5LDcgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAogCXBtaWNfbnAgPSBpb2Rldi0+ZGV2LT5vZl9ub2RlOwotCXJlZ3VsYXRvcnNfbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShwbWljX25wLCAidm9sdGFnZS1yZWd1bGF0b3JzIik7CisJcmVndWxhdG9yc19ucCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKHBtaWNfbnAsICJ2b2x0YWdlLXJlZ3VsYXRvcnMiKTsKIAlpZiAoIXJlZ3VsYXRvcnNfbnApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGZpbmQgcmVndWxhdG9ycyBzdWItbm9kZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDEwLDggKzQwOSw3IEBACiAJcmRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpyZGF0YSkgKgogCQkJICAgICBwZGF0YS0+bnVtX3JlZ3VsYXRvcnMsIEdGUF9LRVJORUwpOwogCWlmICghcmRhdGEpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJImNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlZ3VsYXRvciBkYXRhXG4iKTsKKwkJb2Zfbm9kZV9wdXQocmVndWxhdG9yc19ucCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtNDI1LDYgKzQyMyw3IEBACiAJfQogCiAJcGRhdGEtPnJlZ3VsYXRvcnMgPSByZGF0YTsKKwlvZl9ub2RlX3B1dChyZWd1bGF0b3JzX25wKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDc0LDE2ICs0NzMsMTggQEAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXg3NzY4Nik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYNzc2ODZfUkVHVUxBVE9SUzsgaSsrKSB7CisJCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OworCiAJCWNvbmZpZy5pbml0X2RhdGEgPSBwZGF0YS0+cmVndWxhdG9yc1tpXS5pbml0ZGF0YTsKIAkJY29uZmlnLm9mX25vZGUgPSBwZGF0YS0+cmVndWxhdG9yc1tpXS5vZl9ub2RlOwogCiAJCW1heDc3Njg2LT5vcG1vZGVbaV0gPSByZWd1bGF0b3JzW2ldLmVuYWJsZV9tYXNrOwotCQltYXg3NzY4Ni0+cmRldltpXSA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsCisJCXJkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LAogCQkJCQkJJnJlZ3VsYXRvcnNbaV0sICZjb25maWcpOwotCQlpZiAoSVNfRVJSKG1heDc3Njg2LT5yZGV2W2ldKSkgeworCQlpZiAoSVNfRVJSKHJkZXYpKSB7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkJInJlZ3VsYXRvciBpbml0IGZhaWxlZCBmb3IgJWRcbiIsIGkpOwotCQkJcmV0dXJuIFBUUl9FUlIobWF4Nzc2ODYtPnJkZXZbaV0pOworCQkJcmV0dXJuIFBUUl9FUlIocmRldik7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDc3NjkzLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg3NzY5My5jCmluZGV4IDVmYjg5OWYuLjY1M2E1OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDc3NjkzLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4Nzc2OTMuYwpAQCAtMzQsMTMgKzM0LDYgQEAKIAogI2RlZmluZSBDSEdJTl9JTElNX1NURVBfMjBtQQkJCTIwMDAwCiAKLXN0cnVjdCBtYXg3NzY5M19wbWljX2RldiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBtYXg3NzY5M19kZXYgKmlvZGV2OwotCWludCBudW1fcmVndWxhdG9yczsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKnJkZXY7Ci19OwotCiAvKiBDSEFSR0VSIHJlZ3VsYXRvciBvcHMgKi8KIC8qIENIQVJHRVIgcmVndWxhdG9yIHVzZXMgdHdvIGJpdHMgZm9yIGVuYWJsaW5nICovCiBzdGF0aWMgaW50IG1heDc3NjkzX2NoZ19pc19lbmFibGVkKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQpAQCAtMTcwLDE5ICsxNjMsMjIgQEAKIAlzdHJ1Y3QgbWF4Nzc2OTNfcmVndWxhdG9yX2RhdGEgKnRtcDsKIAlpbnQgaSwgbWF0Y2hlZCA9IDA7CiAKLQlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKGRldi0+cGFyZW50LT5vZl9ub2RlLCAicmVndWxhdG9ycyIpOworCW5wID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUoZGV2LT5wYXJlbnQtPm9mX25vZGUsICJyZWd1bGF0b3JzIik7CiAJaWYgKCFucCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlybWF0Y2ggPSBkZXZtX2t6YWxsb2MoZGV2LAogCQkgc2l6ZW9mKCpybWF0Y2gpICogQVJSQVlfU0laRShyZWd1bGF0b3JzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFybWF0Y2gpCisJaWYgKCFybWF0Y2gpIHsKKwkJb2Zfbm9kZV9wdXQobnApOwogCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWd1bGF0b3JzKTsgaSsrKQogCQlybWF0Y2hbaV0ubmFtZSA9IHJlZ3VsYXRvcnNbaV0ubmFtZTsKIAogCW1hdGNoZWQgPSBvZl9yZWd1bGF0b3JfbWF0Y2goZGV2LCBucCwgcm1hdGNoLCBBUlJBWV9TSVpFKHJlZ3VsYXRvcnMpKTsKKwlvZl9ub2RlX3B1dChucCk7CiAJaWYgKG1hdGNoZWQgPD0gMCkKIAkJcmV0dXJuIG1hdGNoZWQ7CiAJKnJkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCoqcmRhdGEpICogbWF0Y2hlZCwgR0ZQX0tFUk5FTCk7CkBAIC0yMjksNyArMjI1LDYgQEAKIHN0YXRpYyBpbnQgbWF4Nzc2OTNfcG1pY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBtYXg3NzY5M19kZXYgKmlvZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwotCXN0cnVjdCBtYXg3NzY5M19wbWljX2RldiAqbWF4Nzc2OTNfcG1pYzsKIAlzdHJ1Y3QgbWF4Nzc2OTNfcmVndWxhdG9yX2RhdGEgKnJkYXRhID0gTlVMTDsKIAlpbnQgbnVtX3JkYXRhLCBpOwogCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZzsKQEAgLTI0MCwzOSArMjM1LDIyIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCW1heDc3NjkzX3BtaWMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKLQkJCQlzaXplb2Yoc3RydWN0IG1heDc3NjkzX3BtaWNfZGV2KSwKLQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIW1heDc3NjkzX3BtaWMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWF4Nzc2OTNfcG1pYy0+cmRldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAotCQkJCXNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKSAqIG51bV9yZGF0YSwKLQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIW1heDc3NjkzX3BtaWMtPnJkZXYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWF4Nzc2OTNfcG1pYy0+ZGV2ID0gJnBkZXYtPmRldjsKLQltYXg3NzY5M19wbWljLT5pb2RldiA9IGlvZGV2OwotCW1heDc3NjkzX3BtaWMtPm51bV9yZWd1bGF0b3JzID0gbnVtX3JkYXRhOwotCiAJY29uZmlnLmRldiA9ICZwZGV2LT5kZXY7CiAJY29uZmlnLnJlZ21hcCA9IGlvZGV2LT5yZWdtYXA7Ci0JY29uZmlnLmRyaXZlcl9kYXRhID0gbWF4Nzc2OTNfcG1pYzsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXg3NzY5M19wbWljKTsKIAotCWZvciAoaSA9IDA7IGkgPCBtYXg3NzY5M19wbWljLT5udW1fcmVndWxhdG9yczsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IG51bV9yZGF0YTsgaSsrKSB7CiAJCWludCBpZCA9IHJkYXRhW2ldLmlkOworCQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKIAogCQljb25maWcuaW5pdF9kYXRhID0gcmRhdGFbaV0uaW5pdGRhdGE7CiAJCWNvbmZpZy5vZl9ub2RlID0gcmRhdGFbaV0ub2Zfbm9kZTsKIAotCQltYXg3NzY5M19wbWljLT5yZGV2W2ldID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwKKwkJcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsCiAJCQkJCQkmcmVndWxhdG9yc1tpZF0sICZjb25maWcpOwotCQlpZiAoSVNfRVJSKG1heDc3NjkzX3BtaWMtPnJkZXZbaV0pKSB7Ci0JCQlkZXZfZXJyKG1heDc3NjkzX3BtaWMtPmRldiwKKwkJaWYgKElTX0VSUihyZGV2KSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJCSJGYWlsZWQgdG8gaW5pdGlhbGl6ZSByZWd1bGF0b3ItJWRcbiIsIGlkKTsKLQkJCXJldHVybiBQVFJfRVJSKG1heDc3NjkzX3BtaWMtPnJkZXZbaV0pOworCQkJcmV0dXJuIFBUUl9FUlIocmRldik7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NDkuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NDkuYwppbmRleCA3ZjA0OWM5Li4zMTcyZGE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4NjQ5LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODY0OS5jCkBAIC00OSw3ICs0OSw2IEBACiAjZGVmaW5lIE1BWDg2NDlfUkFNUF9ET1dOCSgxIDw8IDEpCiAKIHN0cnVjdCBtYXg4NjQ5X3JlZ3VsYXRvcl9pbmZvIHsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldgkqcmVndWxhdG9yOwogCXN0cnVjdCBkZXZpY2UJCSpkZXY7CiAJc3RydWN0IHJlZ21hcAkJKnJlZ21hcDsKIApAQCAtMTU0LDYgKzE1Myw3IEBACiB7CiAJc3RydWN0IG1heDg2NDlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZjbGllbnQtPmRldik7CiAJc3RydWN0IG1heDg2NDlfcmVndWxhdG9yX2luZm8gKmluZm8gPSBOVUxMOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWd1bGF0b3I7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwogCXVuc2lnbmVkIGludCB2YWw7CiAJdW5zaWduZWQgY2hhciBkYXRhOwpAQCAtMjM0LDEyICsyMzQsMTIgQEAKIAljb25maWcuZHJpdmVyX2RhdGEgPSBpbmZvOwogCWNvbmZpZy5yZWdtYXAgPSBpbmZvLT5yZWdtYXA7CiAKLQlpbmZvLT5yZWd1bGF0b3IgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkY2RjX2Rlc2MsCisJcmVndWxhdG9yID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZGNkY19kZXNjLAogCQkJCQkJICAmY29uZmlnKTsKLQlpZiAoSVNfRVJSKGluZm8tPnJlZ3VsYXRvcikpIHsKKwlpZiAoSVNfRVJSKHJlZ3VsYXRvcikpIHsKIAkJZGV2X2VycihpbmZvLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgcmVndWxhdG9yICVzXG4iLAogCQkJZGNkY19kZXNjLm5hbWUpOwotCQlyZXR1cm4gUFRSX0VSUihpbmZvLT5yZWd1bGF0b3IpOworCQlyZXR1cm4gUFRSX0VSUihyZWd1bGF0b3IpOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODY2MC5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODY2MC5jCmluZGV4IDhkOTRkM2QuLjJmYzQxMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NjAuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4NjYwLmMKQEAgLTgxLDE2ICs4MSwxNyBAQAogc3RydWN0IG1heDg2NjAgewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJdTggc2hhZG93X3JlZ3NbTUFYODY2MF9OX1JFR1NdOwkJLyogYXMgY2hpcCBpcyB3cml0ZSBvbmx5ICovCi0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXZbXTsKIH07CiAKIHN0YXRpYyBpbnQgbWF4ODY2MF93cml0ZShzdHJ1Y3QgbWF4ODY2MCAqbWF4ODY2MCwgdTggcmVnLCB1OCBtYXNrLCB1OCB2YWwpCiB7Ci0Jc3RhdGljIGNvbnN0IHU4IG1heDg2NjBfYWRkcmVzc2VzW01BWDg2NjBfTl9SRUdTXSA9Ci0JICB7IDB4MTAsIDB4MTIsIDB4MjAsIDB4MjMsIDB4MjQsIDB4MjksIDB4MmEsIDB4MzIsIDB4MzMsIDB4MzksIDB4ODAgfTsKKwlzdGF0aWMgY29uc3QgdTggbWF4ODY2MF9hZGRyZXNzZXNbTUFYODY2MF9OX1JFR1NdID0geworCSAweDEwLCAweDEyLCAweDIwLCAweDIzLCAweDI0LCAweDI5LCAweDJhLCAweDMyLCAweDMzLCAweDM5LCAweDgwCisJfTsKIAogCWludCByZXQ7CiAJdTggcmVnX3ZhbCA9IChtYXg4NjYwLT5zaGFkb3dfcmVnc1tyZWddICYgbWFzaykgfCB2YWw7CisKIAlkZXZfdmRiZygmbWF4ODY2MC0+Y2xpZW50LT5kZXYsICJXcml0aW5nIHJlZyAlMDJ4IHdpdGggJTAyeFxuIiwKIAkJCW1heDg2NjBfYWRkcmVzc2VzW3JlZ10sIHJlZ192YWwpOwogCkBAIC0xMTIsNiArMTEzLDcgQEAKIAlzdHJ1Y3QgbWF4ODY2MCAqbWF4ODY2MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJdTggdmFsID0gbWF4ODY2MC0+c2hhZG93X3JlZ3NbTUFYODY2MF9PVkVSMV07CiAJdTggbWFzayA9IChyZGV2X2dldF9pZChyZGV2KSA9PSBNQVg4NjYwX1YzKSA/IDEgOiA0OworCiAJcmV0dXJuICEhKHZhbCAmIG1hc2spOwogfQogCkBAIC0xMTksNiArMTIxLDcgQEAKIHsKIAlzdHJ1Y3QgbWF4ODY2MCAqbWF4ODY2MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJdTggYml0ID0gKHJkZXZfZ2V0X2lkKHJkZXYpID09IE1BWDg2NjBfVjMpID8gMSA6IDQ7CisKIAlyZXR1cm4gbWF4ODY2MF93cml0ZShtYXg4NjYwLCBNQVg4NjYwX09WRVIxLCAweGZmLCBiaXQpOwogfQogCkBAIC0xMjYsMTUgKzEyOSwxNiBAQAogewogCXN0cnVjdCBtYXg4NjYwICptYXg4NjYwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAl1OCBtYXNrID0gKHJkZXZfZ2V0X2lkKHJkZXYpID09IE1BWDg2NjBfVjMpID8gfjEgOiB+NDsKKwogCXJldHVybiBtYXg4NjYwX3dyaXRlKG1heDg2NjAsIE1BWDg2NjBfT1ZFUjEsIG1hc2ssIDApOwogfQogCiBzdGF0aWMgaW50IG1heDg2NjBfZGNkY19nZXRfdm9sdGFnZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7CiAJc3RydWN0IG1heDg2NjAgKm1heDg2NjAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwotCiAJdTggcmVnID0gKHJkZXZfZ2V0X2lkKHJkZXYpID09IE1BWDg2NjBfVjMpID8gTUFYODY2MF9BRFRWMiA6IE1BWDg2NjBfU0RUVjI7CiAJdTggc2VsZWN0b3IgPSBtYXg4NjYwLT5zaGFkb3dfcmVnc1tyZWddOworCiAJcmV0dXJuIHNlbGVjdG9yOwogfQogCkBAIC0yMDcsNiArMjExLDcgQEAKIAlzdHJ1Y3QgbWF4ODY2MCAqbWF4ODY2MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJdTggdmFsID0gbWF4ODY2MC0+c2hhZG93X3JlZ3NbTUFYODY2MF9PVkVSMl07CiAJdTggbWFzayA9IChyZGV2X2dldF9pZChyZGV2KSA9PSBNQVg4NjYwX1Y2KSA/IDIgOiA0OworCiAJcmV0dXJuICEhKHZhbCAmIG1hc2spOwogfQogCkBAIC0yMTQsNiArMjE5LDcgQEAKIHsKIAlzdHJ1Y3QgbWF4ODY2MCAqbWF4ODY2MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJdTggYml0ID0gKHJkZXZfZ2V0X2lkKHJkZXYpID09IE1BWDg2NjBfVjYpID8gMiA6IDQ7CisKIAlyZXR1cm4gbWF4ODY2MF93cml0ZShtYXg4NjYwLCBNQVg4NjYwX09WRVIyLCAweGZmLCBiaXQpOwogfQogCkBAIC0yMjEsMTUgKzIyNywxNiBAQAogewogCXN0cnVjdCBtYXg4NjYwICptYXg4NjYwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAl1OCBtYXNrID0gKHJkZXZfZ2V0X2lkKHJkZXYpID09IE1BWDg2NjBfVjYpID8gfjIgOiB+NDsKKwogCXJldHVybiBtYXg4NjYwX3dyaXRlKG1heDg2NjAsIE1BWDg2NjBfT1ZFUjIsIG1hc2ssIDApOwogfQogCiBzdGF0aWMgaW50IG1heDg2NjBfbGRvNjdfZ2V0X3ZvbHRhZ2Vfc2VsKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQogewogCXN0cnVjdCBtYXg4NjYwICptYXg4NjYwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQogCXU4IHNoaWZ0ID0gKHJkZXZfZ2V0X2lkKHJkZXYpID09IE1BWDg2NjBfVjYpID8gMCA6IDQ7CiAJdTggc2VsZWN0b3IgPSAobWF4ODY2MC0+c2hhZG93X3JlZ3NbTUFYODY2MF9MMTJWQ1JdID4+IHNoaWZ0KSAmIDB4ZjsKKwogCXJldHVybiBzZWxlY3RvcjsKIH0KIApAQCAtMzMwLDcgKzMzNyw3IEBACiAJc3RydWN0IG1heDg2NjBfc3ViZGV2X2RhdGEgKnN1YjsKIAlzdHJ1Y3Qgb2ZfcmVndWxhdG9yX21hdGNoIHJtYXRjaFtBUlJBWV9TSVpFKG1heDg2NjBfcmVnKV07CiAKLQlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKGRldi0+b2Zfbm9kZSwgInJlZ3VsYXRvcnMiKTsKKwlucCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKGRldi0+b2Zfbm9kZSwgInJlZ3VsYXRvcnMiKTsKIAlpZiAoIW5wKSB7CiAJCWRldl9lcnIoZGV2LCAibWlzc2luZyAncmVndWxhdG9ycycgc3Vibm9kZSBpbiBEVFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzQwLDYgKzM0Nyw3IEBACiAJCXJtYXRjaFtpXS5uYW1lID0gbWF4ODY2MF9yZWdbaV0ubmFtZTsKIAogCW1hdGNoZWQgPSBvZl9yZWd1bGF0b3JfbWF0Y2goZGV2LCBucCwgcm1hdGNoLCBBUlJBWV9TSVpFKHJtYXRjaCkpOworCW9mX25vZGVfcHV0KG5wKTsKIAlpZiAobWF0Y2hlZCA8PSAwKQogCQlyZXR1cm4gbWF0Y2hlZDsKIApAQCAtMzczLDcgKzM4MSw2IEBACiBzdGF0aWMgaW50IG1heDg2NjBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCQkgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaTJjX2lkKQogewotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICoqcmRldjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJc3RydWN0IG1heDg2NjBfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwpAQCAtNDA2LDE0ICs0MTMsMTEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbWF4ODY2MCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgbWF4ODY2MCkgKwotCQkJc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfZGV2ICopICogTUFYODY2MF9WX0VORCwKLQkJCUdGUF9LRVJORUwpOworCW1heDg2NjAgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IG1heDg2NjApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1heDg2NjApCiAJCXJldHVybiAtRU5PTUVNOwogCiAJbWF4ODY2MC0+Y2xpZW50ID0gY2xpZW50OwotCXJkZXYgPSBtYXg4NjYwLT5yZGV2OwogCiAJaWYgKHBkYXRhLT5lbjM0X2lzX2hpZ2gpIHsKIAkJLyogU2ltdWxhdGUgYWx3YXlzIG9uICovCkBAIC00ODEsNiArNDg1LDcgQEAKIAogCS8qIEZpbmFsbHkgcmVnaXN0ZXIgZGV2aWNlcyAqLwogCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX3N1YmRldnM7IGkrKykgeworCQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKIAogCQlpZCA9IHBkYXRhLT5zdWJkZXZzW2ldLmlkOwogCkBAIC00ODksMTMgKzQ5NCwxMyBAQAogCQljb25maWcub2Zfbm9kZSA9IG9mX25vZGVbaV07CiAJCWNvbmZpZy5kcml2ZXJfZGF0YSA9IG1heDg2NjA7CiAKLQkJcmRldltpXSA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwKKwkJcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwKIAkJCQkJCSAgJm1heDg2NjBfcmVnW2lkXSwgJmNvbmZpZyk7Ci0JCWlmIChJU19FUlIocmRldltpXSkpIHsKLQkJCXJldCA9IFBUUl9FUlIocmRldltpXSk7CisJCWlmIChJU19FUlIocmRldikpIHsKKwkJCXJldCA9IFBUUl9FUlIocmRldik7CiAJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciAlc1xuIiwKIAkJCQltYXg4NjYwX3JlZ1tpZF0ubmFtZSk7Ci0JCQlyZXR1cm4gUFRSX0VSUihyZGV2W2ldKTsKKwkJCXJldHVybiBQVFJfRVJSKHJkZXYpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTA3LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODkwNy1yZWd1bGF0b3IuYwppbmRleCAwYzVmZTZjLi45NjIzZTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTA3LXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5MDctcmVndWxhdG9yLmMKQEAgLTM0LDcgKzM0LDYgQEAKIAogc3RydWN0IG1heDg5MDdfcmVndWxhdG9yIHsKIAlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgZGVzY1tNQVg4OTA3X05VTV9SRUdVTEFUT1JTXTsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldltNQVg4OTA3X05VTV9SRUdVTEFUT1JTXTsKIH07CiAKICNkZWZpbmUgUkVHX01CQVRUKCkgXApAQCAtMjMxLDcgKzIzMCw3IEBACiAJaWYgKCFucCkKIAkJcmV0dXJuIDA7CiAKLQlyZWd1bGF0b3JzID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobnAsICJyZWd1bGF0b3JzIik7CisJcmVndWxhdG9ycyA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAicmVndWxhdG9ycyIpOwogCWlmICghcmVndWxhdG9ycykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyZWd1bGF0b3JzIG5vZGUgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yOTIsMTAgKzI5MSw5IEBACiAJCXJldHVybiByZXQ7CiAKIAlwbWljID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcG1pYyksIEdGUF9LRVJORUwpOwotCWlmICghcG1pYykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2MgcG1pY1xuIik7CisJaWYgKCFwbWljKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CisKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwbWljKTsKIAogCW1lbWNweShwbWljLT5kZXNjLCBtYXg4OTA3X3JlZ3VsYXRvcnMsIHNpemVvZihwbWljLT5kZXNjKSk7CkBAIC0zMTEsNiArMzA5LDggQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYODkwN19OVU1fUkVHVUxBVE9SUzsgaSsrKSB7CisJCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OworCiAJCWNvbmZpZy5kZXYgPSBwZGV2LT5kZXYucGFyZW50OwogCQlpZiAocGRhdGEpCiAJCQlpZGF0YSA9IHBkYXRhLT5pbml0X2RhdGFbaV07CkBAIC0zNTAsMTMgKzM1MCwxMyBAQAogCQkJCXBtaWMtPmRlc2NbaV0ub3BzID0gJm1heDg5MDdfb3V0NXZfaHdjdGxfb3BzOwogCQl9CiAKLQkJcG1pYy0+cmRldltpXSA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsCisJCXJkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LAogCQkJCQkJJnBtaWMtPmRlc2NbaV0sICZjb25maWcpOwotCQlpZiAoSVNfRVJSKHBtaWMtPnJkZXZbaV0pKSB7CisJCWlmIChJU19FUlIocmRldikpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCQkiZmFpbGVkIHRvIHJlZ2lzdGVyICVzIHJlZ3VsYXRvclxuIiwKIAkJCQlwbWljLT5kZXNjW2ldLm5hbWUpOwotCQkJcmV0dXJuIFBUUl9FUlIocG1pYy0+cmRldltpXSk7CisJCQlyZXR1cm4gUFRSX0VSUihyZGV2KTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODkyNS1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5MjUtcmVndWxhdG9yLmMKaW5kZXggNzU5NTEwNy4uZGFkMmJjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODkyNS1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTI1LXJlZ3VsYXRvci5jCkBAIC0zNiw5ICszNiw3IEBACiAKIHN0cnVjdCBtYXg4OTI1X3JlZ3VsYXRvcl9pbmZvIHsKIAlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MJZGVzYzsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldgkqcmVndWxhdG9yOwogCXN0cnVjdCBpMmNfY2xpZW50CSppMmM7Ci0Jc3RydWN0IG1heDg5MjVfY2hpcAkqY2hpcDsKIAogCWludAl2b2xfcmVnOwogCWludAllbmFibGVfcmVnOwpAQCAtMjUxLDEwICsyNDksMTEgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wcm9vdCwgKm5wOwogCWludCByY291bnQ7CisKIAlucHJvb3QgPSBvZl9ub2RlX2dldChwZGV2LT5kZXYucGFyZW50LT5vZl9ub2RlKTsKIAlpZiAoIW5wcm9vdCkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShucHJvb3QsICJyZWd1bGF0b3JzIik7CisJbnAgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShucHJvb3QsICJyZWd1bGF0b3JzIik7CiAJaWYgKCFucCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZmluZCByZWd1bGF0b3JzIG5vZGVcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTI2NCw3ICsyNjMsNyBAQAogCQkJCSZtYXg4OTI1X3JlZ3VsYXRvcl9tYXRjaGVzW3JpZHhdLCAxKTsKIAlvZl9ub2RlX3B1dChucCk7CiAJaWYgKHJjb3VudCA8IDApCi0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm4gcmNvdW50OwogCWNvbmZpZy0+aW5pdF9kYXRhID0JbWF4ODkyNV9yZWd1bGF0b3JfbWF0Y2hlc1tyaWR4XS5pbml0X2RhdGE7CiAJY29uZmlnLT5vZl9ub2RlID0gbWF4ODkyNV9yZWd1bGF0b3JfbWF0Y2hlc1tyaWR4XS5vZl9ub2RlOwogCkBAIC0zMDMsNyArMzAyLDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJpLT5pMmMgPSBjaGlwLT5pMmM7Ci0JcmktPmNoaXAgPSBjaGlwOwogCiAJY29uZmlnLmRldiA9ICZwZGV2LT5kZXY7CiAJY29uZmlnLmRyaXZlcl9kYXRhID0gcmk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTUyLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTUyLmMKaW5kZXggNzg4ZTVhZS4uZDkyMGY1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk1Mi5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5NTIuYwpAQCAtNDgsOSArNDgsNyBAQAogCiBzdHJ1Y3QgbWF4ODk1Ml9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OwotCXN0cnVjdCBkZXZpY2UJCSpkZXY7CiAJc3RydWN0IG1heDg5NTJfcGxhdGZvcm1fZGF0YSAqcGRhdGE7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYJKnJkZXY7CiAKIAlib29sIHZpZDA7CiAJYm9vbCB2aWQxOwpAQCAtNTksNiArNTcsNyBAQAogc3RhdGljIGludCBtYXg4OTUyX3JlYWRfcmVnKHN0cnVjdCBtYXg4OTUyX2RhdGEgKm1heDg5NTIsIHU4IHJlZykKIHsKIAlpbnQgcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG1heDg5NTItPmNsaWVudCwgcmVnKTsKKwogCWlmIChyZXQgPiAwKQogCQlyZXQgJj0gMHhmZjsKIApAQCAtMTQ0LDEwICsxNDMsOCBAQAogCWludCBpOwogCiAJcGQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnBkKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZCkgewotCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBwbGF0Zm9ybSBkYXRhXG4iKTsKKwlpZiAoIXBkKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlwZC0+Z3Bpb192aWQwID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJtYXg4OTUyLHZpZC1ncGlvcyIsIDApOwogCXBkLT5ncGlvX3ZpZDEgPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgIm1heDg5NTIsdmlkLWdwaW9zIiwgMSk7CkBAIC0xOTksNiArMTk2LDcgQEAKIAlzdHJ1Y3QgbWF4ODk1Ml9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJmNsaWVudC0+ZGV2KTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07CiAJc3RydWN0IG1heDg5NTJfZGF0YSAqbWF4ODk1MjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKIAogCWludCByZXQgPSAwLCBlcnIgPSAwOwogCkBAIC0yMTksMTAgKzIxNyw5IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJbWF4ODk1Mi0+Y2xpZW50ID0gY2xpZW50OwotCW1heDg5NTItPmRldiA9ICZjbGllbnQtPmRldjsKIAltYXg4OTUyLT5wZGF0YSA9IHBkYXRhOwogCi0JY29uZmlnLmRldiA9IG1heDg5NTItPmRldjsKKwljb25maWcuZGV2ID0gJmNsaWVudC0+ZGV2OwogCWNvbmZpZy5pbml0X2RhdGEgPSBwZGF0YS0+cmVnX2RhdGE7CiAJY29uZmlnLmRyaXZlcl9kYXRhID0gbWF4ODk1MjsKIAljb25maWcub2Zfbm9kZSA9IGNsaWVudC0+ZGV2Lm9mX25vZGU7CkBAIC0yMzEsMTEgKzIyOCwxMSBAQAogCWlmIChwZGF0YS0+cmVnX2RhdGEtPmNvbnN0cmFpbnRzLmJvb3Rfb24pCiAJCWNvbmZpZy5lbmFfZ3Bpb19mbGFncyB8PSBHUElPRl9PVVRfSU5JVF9ISUdIOwogCi0JbWF4ODk1Mi0+cmRldiA9IHJlZ3VsYXRvcl9yZWdpc3RlcigmcmVndWxhdG9yLCAmY29uZmlnKTsKKwlyZGV2ID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmcmVndWxhdG9yLCAmY29uZmlnKTsKIAotCWlmIChJU19FUlIobWF4ODk1Mi0+cmRldikpIHsKLQkJcmV0ID0gUFRSX0VSUihtYXg4OTUyLT5yZGV2KTsKLQkJZGV2X2VycihtYXg4OTUyLT5kZXYsICJyZWd1bGF0b3IgaW5pdCBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKKwlpZiAoSVNfRVJSKHJkZXYpKSB7CisJCXJldCA9IFBUUl9FUlIocmRldik7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAicmVndWxhdG9yIGluaXQgZmFpbGVkICglZClcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0yNjMsNyArMjYwLDcgQEAKIAkJZXJyID0gMzsKIAogCWlmIChlcnIpIHsKLQkJZGV2X3dhcm4obWF4ODk1Mi0+ZGV2LCAiVklEMC8xIGdwaW8gaW52YWxpZDogIgorCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJWSUQwLzEgZ3BpbyBpbnZhbGlkOiAiCiAJCQkJIkRWUyBub3QgYXZhaWxhYmxlLlxuIik7CiAJCW1heDg5NTItPnZpZDAgPSAwOwogCQltYXg4OTUyLT52aWQxID0gMDsKQEAgLTI3NCw3ICsyNzEsNyBAQAogCQkvKiBEaXNhYmxlIFB1bGxkb3duIG9mIEVOIG9ubHkgKi8KIAkJbWF4ODk1Ml93cml0ZV9yZWcobWF4ODk1MiwgTUFYODk1Ml9SRUdfQ09OVFJPTCwgMHg2MCk7CiAKLQkJZGV2X2VycihtYXg4OTUyLT5kZXYsICJEVlMgbW9kZXMgZGlzYWJsZWQgYmVjYXVzZSBWSUQwIGFuZCBWSUQxIgorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkRWUyBtb2RlcyBkaXNhYmxlZCBiZWNhdXNlIFZJRDAgYW5kIFZJRDEiCiAJCQkJIiBkbyBub3QgaGF2ZSBwcm9wZXIgY29udHJvbHMuXG4iKTsKIAl9IGVsc2UgewogCQkvKgpAQCAtMzIxLDkgKzMxOCw2IEBACiB7CiAJc3RydWN0IG1heDg5NTJfZGF0YSAqbWF4ODk1MiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCBtYXg4OTUyX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gbWF4ODk1Mi0+cGRhdGE7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBtYXg4OTUyLT5yZGV2OwotCi0JcmVndWxhdG9yX3VucmVnaXN0ZXIocmRldik7CiAKIAlncGlvX2ZyZWUocGRhdGEtPmdwaW9fdmlkMCk7CiAJZ3Bpb19mcmVlKHBkYXRhLT5ncGlvX3ZpZDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk3My1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5NzMtcmVndWxhdG9yLmMKaW5kZXggODkyYWExZS4uZGJlZGYxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk3My1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTczLXJlZ3VsYXRvci5jCkBAIC05Myw3ICs5Myw2IEBACiBzdHJ1Y3QgbWF4ODk3M19jaGlwIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXNjIGRlc2M7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCWJvb2wgZW5hYmxlX2V4dGVybmFsX2NvbnRyb2w7CiAJaW50IGR2c19ncGlvOwpAQCAtMzc5LDEwICszNzgsOCBAQAogCX0KIAogCW1heCA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqbWF4KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYXgpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNZW1vcnkgYWxsb2NhdGlvbiBmb3IgbWF4IGZhaWxlZFxuIik7CisJaWYgKCFtYXgpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCW1heC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmbWF4ODk3M19yZWdtYXBfY29uZmlnKTsKIAlpZiAoSVNfRVJSKG1heC0+cmVnbWFwKSkgewpAQCAtNDc0LDcgKzQ3MSw2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JbWF4LT5yZGV2ID0gcmRldjsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk5Ny5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk5Ny5jCmluZGV4IDJkNjE4ZmMuLjkwYjRjNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5OTcuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTk3LmMKQEAgLTM4LDcgKzM4LDYgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IG1heDg5OTdfZGV2ICppb2RldjsKIAlpbnQgbnVtX3JlZ3VsYXRvcnM7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKipyZGV2OwogCWludCByYW1wX2RlbGF5OyAvKiBpbiBtVi91cyAqLwogCiAJYm9vbCBidWNrMV9ncGlvZHZzOwpAQCAtOTI0LDcgKzkyMyw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXJlZ3VsYXRvcnNfbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShwbWljX25wLCAicmVndWxhdG9ycyIpOworCXJlZ3VsYXRvcnNfbnAgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShwbWljX25wLCAicmVndWxhdG9ycyIpOwogCWlmICghcmVndWxhdG9yc19ucCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZmluZCByZWd1bGF0b3JzIHN1Yi1ub2RlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC05MzcsNyArOTM2LDYgQEAKIAkJCQlwZGF0YS0+bnVtX3JlZ3VsYXRvcnMsIEdGUF9LRVJORUwpOwogCWlmICghcmRhdGEpIHsKIAkJb2Zfbm9kZV9wdXQocmVndWxhdG9yc19ucCk7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlZ3VsYXRvciBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMDMwLDEwICsxMDI4LDEwIEBACiAJc3RydWN0IG1heDg5OTdfZGV2ICppb2RldiA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKIAlzdHJ1Y3QgbWF4ODk5N19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGlvZGV2LT5wZGF0YTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKipyZGV2OworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OwogCXN0cnVjdCBtYXg4OTk3X2RhdGEgKm1heDg5OTc7CiAJc3RydWN0IGkyY19jbGllbnQgKmkyYzsKLQlpbnQgaSwgcmV0LCBzaXplLCBucl9kdnM7CisJaW50IGksIHJldCwgbnJfZHZzOwogCXU4IG1heF9idWNrMSA9IDAsIG1heF9idWNrMiA9IDAsIG1heF9idWNrNSA9IDA7CiAKIAlpZiAoIXBkYXRhKSB7CkBAIC0xMDUyLDEyICsxMDUwLDYgQEAKIAlpZiAoIW1heDg5OTcpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKSAqIHBkYXRhLT5udW1fcmVndWxhdG9yczsKLQltYXg4OTk3LT5yZGV2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemUsIEdGUF9LRVJORUwpOwotCWlmICghbWF4ODk5Ny0+cmRldikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZGV2ID0gbWF4ODk5Ny0+cmRldjsKIAltYXg4OTk3LT5kZXYgPSAmcGRldi0+ZGV2OwogCW1heDg5OTctPmlvZGV2ID0gaW9kZXY7CiAJbWF4ODk5Ny0+bnVtX3JlZ3VsYXRvcnMgPSBwZGF0YS0+bnVtX3JlZ3VsYXRvcnM7CkBAIC0xMjA1LDEyICsxMTk3LDEyIEBACiAJCWNvbmZpZy5kcml2ZXJfZGF0YSA9IG1heDg5OTc7CiAJCWNvbmZpZy5vZl9ub2RlID0gcGRhdGEtPnJlZ3VsYXRvcnNbaV0ucmVnX25vZGU7CiAKLQkJcmRldltpXSA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZyZWd1bGF0b3JzW2lkXSwKLQkJCQkJCSAgJmNvbmZpZyk7Ci0JCWlmIChJU19FUlIocmRldltpXSkpIHsKKwkJcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZyZWd1bGF0b3JzW2lkXSwKKwkJCQkJICAgICAgICZjb25maWcpOworCQlpZiAoSVNfRVJSKHJkZXYpKSB7CiAJCQlkZXZfZXJyKG1heDg5OTctPmRldiwgInJlZ3VsYXRvciBpbml0IGZhaWxlZCBmb3IgJWRcbiIsCiAJCQkJCWlkKTsKLQkJCXJldHVybiBQVFJfRVJSKHJkZXZbaV0pOworCQkJcmV0dXJuIFBUUl9FUlIocmRldik7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5OTguYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5OTguYwppbmRleCBhZTNmMDY1Li45NjEwOTFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTk4LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk5OC5jCkBAIC00MCw3ICs0MCw2IEBACiAJc3RydWN0IGRldmljZQkJKmRldjsKIAlzdHJ1Y3QgbWF4ODk5OF9kZXYJKmlvZGV2OwogCWludAkJCW51bV9yZWd1bGF0b3JzOwotCXN0cnVjdCByZWd1bGF0b3JfZGV2CSoqcmRldjsKIAl1OCAgICAgICAgICAgICAgICAgICAgICBidWNrMV92b2xbNF07IC8qIHZvbHRhZ2VzIGZvciBzZWxlY3Rpb24gKi8KIAl1OCAgICAgICAgICAgICAgICAgICAgICBidWNrMl92b2xbMl07CiAJdW5zaWduZWQgaW50CQlidWNrMV9pZHg7IC8qIGluZGV4IHRvIGxhc3QgY2hhbmdlZCB2b2x0YWdlICovCkBAIC02NzQsOCArNjczLDEwIEBACiAKIAlyZGF0YSA9IGRldm1fa3phbGxvYyhpb2Rldi0+ZGV2LCBzaXplb2YoKnJkYXRhKSAqCiAJCQkJcGRhdGEtPm51bV9yZWd1bGF0b3JzLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJkYXRhKQorCWlmICghcmRhdGEpIHsKKwkJb2Zfbm9kZV9wdXQocmVndWxhdG9yc19ucCk7CiAJCXJldHVybiAtRU5PTUVNOworCX0KIAogCXBkYXRhLT5yZWd1bGF0b3JzID0gcmRhdGE7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVndWxhdG9ycyk7ICsraSkgewpAQCAtNjkyLDYgKzY5Myw5IEBACiAJfQogCXBkYXRhLT5udW1fcmVndWxhdG9ycyA9IHJkYXRhIC0gcGRhdGEtPnJlZ3VsYXRvcnM7CiAKKwlvZl9ub2RlX3B1dChyZWdfbnApOworCW9mX25vZGVfcHV0KHJlZ3VsYXRvcnNfbnApOworCiAJcmV0ID0gbWF4ODk5OF9wbWljX2R0X3BhcnNlX2R2c19ncGlvKGlvZGV2LCBwZGF0YSwgcG1pY19ucCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC03NDEsMTAgKzc0NSwxMCBAQAogCXN0cnVjdCBtYXg4OTk4X2RldiAqaW9kZXYgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IG1heDg5OThfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBpb2Rldi0+cGRhdGE7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICoqcmRldjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKIAlzdHJ1Y3QgbWF4ODk5OF9kYXRhICptYXg4OTk4OwogCXN0cnVjdCBpMmNfY2xpZW50ICppMmM7Ci0JaW50IGksIHJldCwgc2l6ZTsKKwlpbnQgaSwgcmV0OwogCXVuc2lnbmVkIGludCB2OwogCiAJaWYgKCFwZGF0YSkgewpAQCAtNzYzLDEyICs3NjcsNiBAQAogCWlmICghbWF4ODk5OCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzaXplID0gc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfZGV2ICopICogcGRhdGEtPm51bV9yZWd1bGF0b3JzOwotCW1heDg5OTgtPnJkZXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYXg4OTk4LT5yZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJkZXYgPSBtYXg4OTk4LT5yZGV2OwogCW1heDg5OTgtPmRldiA9ICZwZGV2LT5kZXY7CiAJbWF4ODk5OC0+aW9kZXYgPSBpb2RldjsKIAltYXg4OTk4LT5udW1fcmVndWxhdG9ycyA9IHBkYXRhLT5udW1fcmVndWxhdG9yczsKQEAgLTg3MiwxMyArODcwLDEyIEBACiAJCWNvbmZpZy5pbml0X2RhdGEgPSBwZGF0YS0+cmVndWxhdG9yc1tpXS5pbml0ZGF0YTsKIAkJY29uZmlnLmRyaXZlcl9kYXRhID0gbWF4ODk5ODsKIAotCQlyZGV2W2ldID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwKLQkJCQkJCSAgJnJlZ3VsYXRvcnNbaW5kZXhdLCAmY29uZmlnKTsKLQkJaWYgKElTX0VSUihyZGV2W2ldKSkgewotCQkJcmV0ID0gUFRSX0VSUihyZGV2W2ldKTsKKwkJcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZyZWd1bGF0b3JzW2luZGV4XSwKKwkJCQkJICAgICAgICZjb25maWcpOworCQlpZiAoSVNfRVJSKHJkZXYpKSB7CisJCQlyZXQgPSBQVFJfRVJSKHJkZXYpOwogCQkJZGV2X2VycihtYXg4OTk4LT5kZXYsICJyZWd1bGF0b3IgJXMgaW5pdCBmYWlsZWQgKCVkKVxuIiwKIAkJCQkJCXJlZ3VsYXRvcnNbaW5kZXhdLm5hbWUsIHJldCk7Ci0JCQlyZGV2W2ldID0gTlVMTDsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYzEzeHh4LXJlZ3VsYXRvci1jb3JlLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYzEzeHh4LXJlZ3VsYXRvci1jb3JlLmMKaW5kZXggZGE0ODU5Mi4uMDViOTcxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWMxM3h4eC1yZWd1bGF0b3ItY29yZS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21jMTN4eHgtcmVndWxhdG9yLWNvcmUuYwpAQCAtMTY3LDggKzE2NywxMCBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50OwogCWludCBudW07CiAKLQlvZl9ub2RlX2dldChwZGV2LT5kZXYucGFyZW50LT5vZl9ub2RlKTsKLQlwYXJlbnQgPSBvZl9maW5kX25vZGVfYnlfbmFtZShwZGV2LT5kZXYucGFyZW50LT5vZl9ub2RlLCAicmVndWxhdG9ycyIpOworCWlmICghcGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwYXJlbnQgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShwZGV2LT5kZXYucGFyZW50LT5vZl9ub2RlLCAicmVndWxhdG9ycyIpOwogCWlmICghcGFyZW50KQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMTg3LDggKzE4OSwxMCBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LCAqY2hpbGQ7CiAJaW50IGksIHBhcnNlZCA9IDA7CiAKLQlvZl9ub2RlX2dldChwZGV2LT5kZXYucGFyZW50LT5vZl9ub2RlKTsKLQlwYXJlbnQgPSBvZl9maW5kX25vZGVfYnlfbmFtZShwZGV2LT5kZXYucGFyZW50LT5vZl9ub2RlLCAicmVndWxhdG9ycyIpOworCWlmICghcGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwYXJlbnQgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShwZGV2LT5kZXYucGFyZW50LT5vZl9ub2RlLCAicmVndWxhdG9ycyIpOwogCWlmICghcGFyZW50KQogCQlyZXR1cm4gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvcGZ1emUxMDAtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9wZnV6ZTEwMC1yZWd1bGF0b3IuYwppbmRleCBhYjE3NGYyMC4uNjdlNjc4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvcGZ1emUxMDAtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvcGZ1emUxMDAtcmVndWxhdG9yLmMKQEAgLTU2LDYgKzU2LDggQEAKICNkZWZpbmUgUEZVWkUxMDBfVkdFTjVWT0wJMHg3MAogI2RlZmluZSBQRlVaRTEwMF9WR0VONlZPTAkweDcxCiAKK2VudW0gY2hpcHMgeyBQRlVaRTEwMCwgUEZVWkUyMDAgfTsKKwogc3RydWN0IHBmdXplX3JlZ3VsYXRvciB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXNjIGRlc2M7CiAJdW5zaWduZWQgY2hhciBzdGJ5X3JlZzsKQEAgLTYzLDYgKzY1LDcgQEAKIH07CiAKIHN0cnVjdCBwZnV6ZV9jaGlwIHsKKwlpbnQJY2hpcF9pZDsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBwZnV6ZV9yZWd1bGF0b3IgcmVndWxhdG9yX2Rlc2NzW1BGVVpFMTAwX01BWF9SRUdVTEFUT1JdOwpAQCAtNzgsMjEgKzgxLDIzIEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcGZ1emVfZGV2aWNlX2lkW10gPSB7Ci0Jey5uYW1lID0gInBmdXplMTAwIn0sCi0Je30sCisJey5uYW1lID0gInBmdXplMTAwIiwgLmRyaXZlcl9kYXRhID0gUEZVWkUxMDB9LAorCXsubmFtZSA9ICJwZnV6ZTIwMCIsIC5kcml2ZXJfZGF0YSA9IFBGVVpFMjAwfSwKKwl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcGZ1emVfZGV2aWNlX2lkKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcGZ1emVfZHRfaWRzW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJmc2wscGZ1emUxMDAiIH0sCi0Je30sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wscGZ1emUxMDAiLCAuZGF0YSA9ICh2b2lkICopUEZVWkUxMDB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLHBmdXplMjAwIiwgLmRhdGEgPSAodm9pZCAqKVBGVVpFMjAwfSwKKwl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBwZnV6ZV9kdF9pZHMpOwogCiBzdGF0aWMgaW50IHBmdXplMTAwX3NldF9yYW1wX2RlbGF5KHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCBpbnQgcmFtcF9kZWxheSkKIHsKIAlzdHJ1Y3QgcGZ1emVfY2hpcCAqcGZ1emUxMDAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwotCWludCBpZCA9IHJkZXYtPmRlc2MtPmlkOworCWludCBpZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOwogCXVuc2lnbmVkIGludCByYW1wX2JpdHM7CiAJaW50IHJldDsKIApAQCAtMTM5LDE0ICsxNDQsMTQgQEAKIAogfTsKIAotI2RlZmluZSBQRlVaRTEwMF9GSVhFRF9SRUcoX25hbWUsIGJhc2UsIHZvbHRhZ2UpCVwKLQlbUEZVWkUxMDBfICMjIF9uYW1lXSA9IHsJXAorI2RlZmluZSBQRlVaRTEwMF9GSVhFRF9SRUcoX2NoaXAsIF9uYW1lLCBiYXNlLCB2b2x0YWdlKQlcCisJW19jaGlwICMjIF8gIyMgX25hbWVdID0gewlcCiAJCS5kZXNjID0gewlcCiAJCQkubmFtZSA9ICNfbmFtZSwJXAogCQkJLm5fdm9sdGFnZXMgPSAxLAlcCiAJCQkub3BzID0gJnBmdXplMTAwX2ZpeGVkX3JlZ3VsYXRvcl9vcHMsCVwKIAkJCS50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsCVwKLQkJCS5pZCA9IFBGVVpFMTAwXyAjIyBfbmFtZSwJXAorCQkJLmlkID0gX2NoaXAgIyMgXyAjIyBfbmFtZSwJXAogCQkJLm93bmVyID0gVEhJU19NT0RVTEUsCVwKIAkJCS5taW5fdVYgPSAodm9sdGFnZSksCVwKIAkJCS5lbmFibGVfcmVnID0gKGJhc2UpLAlcCkBAIC0xNTQsMTQgKzE1OSwxNCBAQAogCQl9LAlcCiAJfQogCi0jZGVmaW5lIFBGVVpFMTAwX1NXX1JFRyhfbmFtZSwgYmFzZSwgbWluLCBtYXgsIHN0ZXApCVwKLQlbUEZVWkUxMDBfICMjIF9uYW1lXSA9IHsJXAorI2RlZmluZSBQRlVaRTEwMF9TV19SRUcoX2NoaXAsIF9uYW1lLCBiYXNlLCBtaW4sIG1heCwgc3RlcCkJXAorCVtfY2hpcCAjIyBfICMjIF9uYW1lXSA9IHsJXAogCQkuZGVzYyA9IHsJXAogCQkJLm5hbWUgPSAjX25hbWUsXAogCQkJLm5fdm9sdGFnZXMgPSAoKG1heCkgLSAobWluKSkgLyAoc3RlcCkgKyAxLAlcCiAJCQkub3BzID0gJnBmdXplMTAwX3N3X3JlZ3VsYXRvcl9vcHMsCVwKIAkJCS50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsCVwKLQkJCS5pZCA9IFBGVVpFMTAwXyAjIyBfbmFtZSwJXAorCQkJLmlkID0gX2NoaXAgIyMgXyAjIyBfbmFtZSwJXAogCQkJLm93bmVyID0gVEhJU19NT0RVTEUsCVwKIAkJCS5taW5fdVYgPSAobWluKSwJXAogCQkJLnVWX3N0ZXAgPSAoc3RlcCksCVwKQEAgLTE3MiwxNCArMTc3LDE0IEBACiAJCS5zdGJ5X21hc2sgPSAweDNmLAlcCiAJfQogCi0jZGVmaW5lIFBGVVpFMTAwX1NXQl9SRUcoX25hbWUsIGJhc2UsIG1hc2ssIHZvbHRhZ2VzKQlcCi0JW1BGVVpFMTAwXyAjIyBfbmFtZV0gPSB7CVwKKyNkZWZpbmUgUEZVWkUxMDBfU1dCX1JFRyhfY2hpcCwgX25hbWUsIGJhc2UsIG1hc2ssIHZvbHRhZ2VzKQlcCisJW19jaGlwICMjIF8gIyMgIF9uYW1lXSA9IHsJXAogCQkuZGVzYyA9IHsJXAogCQkJLm5hbWUgPSAjX25hbWUsCVwKIAkJCS5uX3ZvbHRhZ2VzID0gQVJSQVlfU0laRSh2b2x0YWdlcyksCVwKIAkJCS5vcHMgPSAmcGZ1emUxMDBfc3diX3JlZ3VsYXRvcl9vcHMsCVwKIAkJCS50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsCVwKLQkJCS5pZCA9IFBGVVpFMTAwXyAjIyBfbmFtZSwJXAorCQkJLmlkID0gX2NoaXAgIyMgXyAjIyBfbmFtZSwJXAogCQkJLm93bmVyID0gVEhJU19NT0RVTEUsCVwKIAkJCS52b2x0X3RhYmxlID0gdm9sdGFnZXMsCVwKIAkJCS52c2VsX3JlZyA9IChiYXNlKSwJXApAQCAtMTg3LDE0ICsxOTIsMTQgQEAKIAkJfSwJXAogCX0KIAotI2RlZmluZSBQRlVaRTEwMF9WR0VOX1JFRyhfbmFtZSwgYmFzZSwgbWluLCBtYXgsIHN0ZXApCVwKLQlbUEZVWkUxMDBfICMjIF9uYW1lXSA9IHsJXAorI2RlZmluZSBQRlVaRTEwMF9WR0VOX1JFRyhfY2hpcCwgX25hbWUsIGJhc2UsIG1pbiwgbWF4LCBzdGVwKQlcCisJW19jaGlwICMjIF8gIyMgX25hbWVdID0gewlcCiAJCS5kZXNjID0gewlcCiAJCQkubmFtZSA9ICNfbmFtZSwJXAogCQkJLm5fdm9sdGFnZXMgPSAoKG1heCkgLSAobWluKSkgLyAoc3RlcCkgKyAxLAlcCiAJCQkub3BzID0gJnBmdXplMTAwX2xkb19yZWd1bGF0b3Jfb3BzLAlcCiAJCQkudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLAlcCi0JCQkuaWQgPSBQRlVaRTEwMF8gIyMgX25hbWUsCVwKKwkJCS5pZCA9IF9jaGlwICMjIF8gIyMgX25hbWUsCVwKIAkJCS5vd25lciA9IFRISVNfTU9EVUxFLAlcCiAJCQkubWluX3VWID0gKG1pbiksCVwKIAkJCS51Vl9zdGVwID0gKHN0ZXApLAlcCkBAIC0yMDcsMjUgKzIxMiw0NSBAQAogCQkuc3RieV9tYXNrID0gMHgyMCwJXAogCX0KIAorLyogUEZVWkUxMDAgKi8KIHN0YXRpYyBzdHJ1Y3QgcGZ1emVfcmVndWxhdG9yIHBmdXplMTAwX3JlZ3VsYXRvcnNbXSA9IHsKLQlQRlVaRTEwMF9TV19SRUcoU1cxQUIsIFBGVVpFMTAwX1NXMUFCVk9MLCAzMDAwMDAsIDE4NzUwMDAsIDI1MDAwKSwKLQlQRlVaRTEwMF9TV19SRUcoU1cxQywgUEZVWkUxMDBfU1cxQ1ZPTCwgMzAwMDAwLCAxODc1MDAwLCAyNTAwMCksCi0JUEZVWkUxMDBfU1dfUkVHKFNXMiwgUEZVWkUxMDBfU1cyVk9MLCA0MDAwMDAsIDE5NzUwMDAsIDI1MDAwKSwKLQlQRlVaRTEwMF9TV19SRUcoU1czQSwgUEZVWkUxMDBfU1czQVZPTCwgNDAwMDAwLCAxOTc1MDAwLCAyNTAwMCksCi0JUEZVWkUxMDBfU1dfUkVHKFNXM0IsIFBGVVpFMTAwX1NXM0JWT0wsIDQwMDAwMCwgMTk3NTAwMCwgMjUwMDApLAotCVBGVVpFMTAwX1NXX1JFRyhTVzQsIFBGVVpFMTAwX1NXNFZPTCwgNDAwMDAwLCAxOTc1MDAwLCAyNTAwMCksCi0JUEZVWkUxMDBfU1dCX1JFRyhTV0JTVCwgUEZVWkUxMDBfU1dCU1RDT04xLCAweDMgLCBwZnV6ZTEwMF9zd2JzdCksCi0JUEZVWkUxMDBfU1dCX1JFRyhWU05WUywgUEZVWkUxMDBfVlNOVlNWT0wsIDB4NywgcGZ1emUxMDBfdnNudnMpLAotCVBGVVpFMTAwX0ZJWEVEX1JFRyhWUkVGRERSLCBQRlVaRTEwMF9WUkVGRERSQ09OLCA3NTAwMDApLAotCVBGVVpFMTAwX1ZHRU5fUkVHKFZHRU4xLCBQRlVaRTEwMF9WR0VOMVZPTCwgODAwMDAwLCAxNTUwMDAwLCA1MDAwMCksCi0JUEZVWkUxMDBfVkdFTl9SRUcoVkdFTjIsIFBGVVpFMTAwX1ZHRU4yVk9MLCA4MDAwMDAsIDE1NTAwMDAsIDUwMDAwKSwKLQlQRlVaRTEwMF9WR0VOX1JFRyhWR0VOMywgUEZVWkUxMDBfVkdFTjNWT0wsIDE4MDAwMDAsIDMzMDAwMDAsIDEwMDAwMCksCi0JUEZVWkUxMDBfVkdFTl9SRUcoVkdFTjQsIFBGVVpFMTAwX1ZHRU40Vk9MLCAxODAwMDAwLCAzMzAwMDAwLCAxMDAwMDApLAotCVBGVVpFMTAwX1ZHRU5fUkVHKFZHRU41LCBQRlVaRTEwMF9WR0VONVZPTCwgMTgwMDAwMCwgMzMwMDAwMCwgMTAwMDAwKSwKLQlQRlVaRTEwMF9WR0VOX1JFRyhWR0VONiwgUEZVWkUxMDBfVkdFTjZWT0wsIDE4MDAwMDAsIDMzMDAwMDAsIDEwMDAwMCksCisJUEZVWkUxMDBfU1dfUkVHKFBGVVpFMTAwLCBTVzFBQiwgUEZVWkUxMDBfU1cxQUJWT0wsIDMwMDAwMCwgMTg3NTAwMCwgMjUwMDApLAorCVBGVVpFMTAwX1NXX1JFRyhQRlVaRTEwMCwgU1cxQywgUEZVWkUxMDBfU1cxQ1ZPTCwgMzAwMDAwLCAxODc1MDAwLCAyNTAwMCksCisJUEZVWkUxMDBfU1dfUkVHKFBGVVpFMTAwLCBTVzIsIFBGVVpFMTAwX1NXMlZPTCwgNDAwMDAwLCAxOTc1MDAwLCAyNTAwMCksCisJUEZVWkUxMDBfU1dfUkVHKFBGVVpFMTAwLCBTVzNBLCBQRlVaRTEwMF9TVzNBVk9MLCA0MDAwMDAsIDE5NzUwMDAsIDI1MDAwKSwKKwlQRlVaRTEwMF9TV19SRUcoUEZVWkUxMDAsIFNXM0IsIFBGVVpFMTAwX1NXM0JWT0wsIDQwMDAwMCwgMTk3NTAwMCwgMjUwMDApLAorCVBGVVpFMTAwX1NXX1JFRyhQRlVaRTEwMCwgU1c0LCBQRlVaRTEwMF9TVzRWT0wsIDQwMDAwMCwgMTk3NTAwMCwgMjUwMDApLAorCVBGVVpFMTAwX1NXQl9SRUcoUEZVWkUxMDAsIFNXQlNULCBQRlVaRTEwMF9TV0JTVENPTjEsIDB4MyAsIHBmdXplMTAwX3N3YnN0KSwKKwlQRlVaRTEwMF9TV0JfUkVHKFBGVVpFMTAwLCBWU05WUywgUEZVWkUxMDBfVlNOVlNWT0wsIDB4NywgcGZ1emUxMDBfdnNudnMpLAorCVBGVVpFMTAwX0ZJWEVEX1JFRyhQRlVaRTEwMCwgVlJFRkREUiwgUEZVWkUxMDBfVlJFRkREUkNPTiwgNzUwMDAwKSwKKwlQRlVaRTEwMF9WR0VOX1JFRyhQRlVaRTEwMCwgVkdFTjEsIFBGVVpFMTAwX1ZHRU4xVk9MLCA4MDAwMDAsIDE1NTAwMDAsIDUwMDAwKSwKKwlQRlVaRTEwMF9WR0VOX1JFRyhQRlVaRTEwMCwgVkdFTjIsIFBGVVpFMTAwX1ZHRU4yVk9MLCA4MDAwMDAsIDE1NTAwMDAsIDUwMDAwKSwKKwlQRlVaRTEwMF9WR0VOX1JFRyhQRlVaRTEwMCwgVkdFTjMsIFBGVVpFMTAwX1ZHRU4zVk9MLCAxODAwMDAwLCAzMzAwMDAwLCAxMDAwMDApLAorCVBGVVpFMTAwX1ZHRU5fUkVHKFBGVVpFMTAwLCBWR0VONCwgUEZVWkUxMDBfVkdFTjRWT0wsIDE4MDAwMDAsIDMzMDAwMDAsIDEwMDAwMCksCisJUEZVWkUxMDBfVkdFTl9SRUcoUEZVWkUxMDAsIFZHRU41LCBQRlVaRTEwMF9WR0VONVZPTCwgMTgwMDAwMCwgMzMwMDAwMCwgMTAwMDAwKSwKKwlQRlVaRTEwMF9WR0VOX1JFRyhQRlVaRTEwMCwgVkdFTjYsIFBGVVpFMTAwX1ZHRU42Vk9MLCAxODAwMDAwLCAzMzAwMDAwLCAxMDAwMDApLAogfTsKIAorc3RhdGljIHN0cnVjdCBwZnV6ZV9yZWd1bGF0b3IgcGZ1emUyMDBfcmVndWxhdG9yc1tdID0geworCVBGVVpFMTAwX1NXX1JFRyhQRlVaRTIwMCwgU1cxQUIsIFBGVVpFMTAwX1NXMUFCVk9MLCAzMDAwMDAsIDE4NzUwMDAsIDI1MDAwKSwKKwlQRlVaRTEwMF9TV19SRUcoUEZVWkUyMDAsIFNXMiwgUEZVWkUxMDBfU1cyVk9MLCA0MDAwMDAsIDE5NzUwMDAsIDI1MDAwKSwKKwlQRlVaRTEwMF9TV19SRUcoUEZVWkUyMDAsIFNXM0EsIFBGVVpFMTAwX1NXM0FWT0wsIDQwMDAwMCwgMTk3NTAwMCwgMjUwMDApLAorCVBGVVpFMTAwX1NXX1JFRyhQRlVaRTIwMCwgU1czQiwgUEZVWkUxMDBfU1czQlZPTCwgNDAwMDAwLCAxOTc1MDAwLCAyNTAwMCksCisJUEZVWkUxMDBfU1dCX1JFRyhQRlVaRTIwMCwgU1dCU1QsIFBGVVpFMTAwX1NXQlNUQ09OMSwgMHgzICwgcGZ1emUxMDBfc3dic3QpLAorCVBGVVpFMTAwX1NXQl9SRUcoUEZVWkUyMDAsIFZTTlZTLCBQRlVaRTEwMF9WU05WU1ZPTCwgMHg3LCBwZnV6ZTEwMF92c252cyksCisJUEZVWkUxMDBfRklYRURfUkVHKFBGVVpFMjAwLCBWUkVGRERSLCBQRlVaRTEwMF9WUkVGRERSQ09OLCA3NTAwMDApLAorCVBGVVpFMTAwX1ZHRU5fUkVHKFBGVVpFMjAwLCBWR0VOMSwgUEZVWkUxMDBfVkdFTjFWT0wsIDgwMDAwMCwgMTU1MDAwMCwgNTAwMDApLAorCVBGVVpFMTAwX1ZHRU5fUkVHKFBGVVpFMjAwLCBWR0VOMiwgUEZVWkUxMDBfVkdFTjJWT0wsIDgwMDAwMCwgMTU1MDAwMCwgNTAwMDApLAorCVBGVVpFMTAwX1ZHRU5fUkVHKFBGVVpFMjAwLCBWR0VOMywgUEZVWkUxMDBfVkdFTjNWT0wsIDE4MDAwMDAsIDMzMDAwMDAsIDEwMDAwMCksCisJUEZVWkUxMDBfVkdFTl9SRUcoUEZVWkUyMDAsIFZHRU40LCBQRlVaRTEwMF9WR0VONFZPTCwgMTgwMDAwMCwgMzMwMDAwMCwgMTAwMDAwKSwKKwlQRlVaRTEwMF9WR0VOX1JFRyhQRlVaRTIwMCwgVkdFTjUsIFBGVVpFMTAwX1ZHRU41Vk9MLCAxODAwMDAwLCAzMzAwMDAwLCAxMDAwMDApLAorCVBGVVpFMTAwX1ZHRU5fUkVHKFBGVVpFMjAwLCBWR0VONiwgUEZVWkUxMDBfVkdFTjZWT0wsIDE4MDAwMDAsIDMzMDAwMDAsIDEwMDAwMCksCit9OworCitzdGF0aWMgc3RydWN0IHBmdXplX3JlZ3VsYXRvciAqcGZ1emVfcmVndWxhdG9yczsKKwogI2lmZGVmIENPTkZJR19PRgorLyogUEZVWkUxMDAgKi8KIHN0YXRpYyBzdHJ1Y3Qgb2ZfcmVndWxhdG9yX21hdGNoIHBmdXplMTAwX21hdGNoZXNbXSA9IHsKIAl7IC5uYW1lID0gInN3MWFiIiwJfSwKIAl7IC5uYW1lID0gInN3MWMiLAl9LApAQCAtMjQ0LDI0ICsyNjksNTYgQEAKIAl7IC5uYW1lID0gInZnZW42IiwJfSwKIH07CiAKKy8qIFBGVVpFMjAwICovCitzdGF0aWMgc3RydWN0IG9mX3JlZ3VsYXRvcl9tYXRjaCBwZnV6ZTIwMF9tYXRjaGVzW10gPSB7CisKKwl7IC5uYW1lID0gInN3MWFiIiwJfSwKKwl7IC5uYW1lID0gInN3MiIsCX0sCisJeyAubmFtZSA9ICJzdzNhIiwJfSwKKwl7IC5uYW1lID0gInN3M2IiLAl9LAorCXsgLm5hbWUgPSAic3dic3QiLAl9LAorCXsgLm5hbWUgPSAidnNudnMiLAl9LAorCXsgLm5hbWUgPSAidnJlZmRkciIsCX0sCisJeyAubmFtZSA9ICJ2Z2VuMSIsCX0sCisJeyAubmFtZSA9ICJ2Z2VuMiIsCX0sCisJeyAubmFtZSA9ICJ2Z2VuMyIsCX0sCisJeyAubmFtZSA9ICJ2Z2VuNCIsCX0sCisJeyAubmFtZSA9ICJ2Z2VuNSIsCX0sCisJeyAubmFtZSA9ICJ2Z2VuNiIsCX0sCit9OworCitzdGF0aWMgc3RydWN0IG9mX3JlZ3VsYXRvcl9tYXRjaCAqcGZ1emVfbWF0Y2hlczsKKwogc3RhdGljIGludCBwZnV6ZV9wYXJzZV9yZWd1bGF0b3JzX2R0KHN0cnVjdCBwZnV6ZV9jaGlwICpjaGlwKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNoaXAtPmRldjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCAqcGFyZW50OwogCWludCByZXQ7CiAKLQlucCA9IG9mX25vZGVfZ2V0KGRldi0+cGFyZW50LT5vZl9ub2RlKTsKKwlucCA9IG9mX25vZGVfZ2V0KGRldi0+b2Zfbm9kZSk7CiAJaWYgKCFucCkKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRUlOVkFMOwogCi0JcGFyZW50ID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobnAsICJyZWd1bGF0b3JzIik7CisJcGFyZW50ID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobnAsICJyZWd1bGF0b3JzIik7CiAJaWYgKCFwYXJlbnQpIHsKIAkJZGV2X2VycihkZXYsICJyZWd1bGF0b3JzIG5vZGUgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0ID0gb2ZfcmVndWxhdG9yX21hdGNoKGRldiwgcGFyZW50LCBwZnV6ZTEwMF9tYXRjaGVzLAotCQkJCSBBUlJBWV9TSVpFKHBmdXplMTAwX21hdGNoZXMpKTsKKwlzd2l0Y2ggKGNoaXAtPmNoaXBfaWQpIHsKKwljYXNlIFBGVVpFMjAwOgorCQlwZnV6ZV9tYXRjaGVzID0gcGZ1emUyMDBfbWF0Y2hlczsKKwkJcmV0ID0gb2ZfcmVndWxhdG9yX21hdGNoKGRldiwgcGFyZW50LCBwZnV6ZTIwMF9tYXRjaGVzLAorCQkJCQkgQVJSQVlfU0laRShwZnV6ZTIwMF9tYXRjaGVzKSk7CisJCWJyZWFrOworCisJY2FzZSBQRlVaRTEwMDoKKwlkZWZhdWx0OgorCQlwZnV6ZV9tYXRjaGVzID0gcGZ1emUxMDBfbWF0Y2hlczsKKwkJcmV0ID0gb2ZfcmVndWxhdG9yX21hdGNoKGRldiwgcGFyZW50LCBwZnV6ZTEwMF9tYXRjaGVzLAorCQkJCQkgQVJSQVlfU0laRShwZnV6ZTEwMF9tYXRjaGVzKSk7CisJCWJyZWFrOworCX0KIAogCW9mX25vZGVfcHV0KHBhcmVudCk7CiAJaWYgKHJldCA8IDApIHsKQEAgLTI3NSwxMiArMzMyLDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKm1hdGNoX2luaXRfZGF0YShpbnQgaW5kZXgpCiB7Ci0JcmV0dXJuIHBmdXplMTAwX21hdGNoZXNbaW5kZXhdLmluaXRfZGF0YTsKKwlyZXR1cm4gcGZ1emVfbWF0Y2hlc1tpbmRleF0uaW5pdF9kYXRhOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbWF0Y2hfb2Zfbm9kZShpbnQgaW5kZXgpCiB7Ci0JcmV0dXJuIHBmdXplMTAwX21hdGNoZXNbaW5kZXhdLm9mX25vZGU7CisJcmV0dXJuIHBmdXplX21hdGNoZXNbaW5kZXhdLm9mX25vZGU7CiB9CiAjZWxzZQogc3RhdGljIGludCBwZnV6ZV9wYXJzZV9yZWd1bGF0b3JzX2R0KHN0cnVjdCBwZnV6ZV9jaGlwICpjaGlwKQpAQCAtMzA4LDE2ICszNjUsMTQgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jc3dpdGNoICh2YWx1ZSAmIDB4MGYpIHsKLQkvKgotCSAqIEZyZWVzY2FsZSBtaXNwcm9ncmFtbWVkIDEtMyUgb2YgcGFydHMgcHJpb3IgdG8gd2VlayA4IG9mIDIwMTMKLQkgKiBhcyBJRD04Ci0JICovCi0JY2FzZSAweDg6CisJaWYgKCgodmFsdWUgJiAweDBmKSA9PSAweDgpICYmIChwZnV6ZV9jaGlwLT5jaGlwX2lkID09IFBGVVpFMTAwKSkgeworCQkvKgorCQkgKiBGcmVlc2NhbGUgbWlzcHJvZ3JhbW1lZCAxLTMlIG9mIHBhcnRzIHByaW9yIHRvIHdlZWsgOCBvZiAyMDEzCisJCSAqIGFzIElEPTggaW4gUEZVWkUxMDAKKwkJICovCiAJCWRldl9pbmZvKHBmdXplX2NoaXAtPmRldiwgIkFzc3VtaW5nIG1pc3Byb2dyYW1tZWQgSUQ9MHg4Iik7Ci0JY2FzZSAweDA6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6CisJfSBlbHNlIGlmICgodmFsdWUgJiAweDBmKSAhPSBwZnV6ZV9jaGlwLT5jaGlwX2lkKSB7CisJCS8qIGRldmljZSBpZCBOT1QgbWF0Y2ggd2l0aCB5b3VyIHNldHRpbmcgKi8KIAkJZGV2X3dhcm4ocGZ1emVfY2hpcC0+ZGV2LCAiSWxsZWdhbCBJRDogJXhcbiIsIHZhbHVlKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtMzUzLDE3ICs0MDgsMzEgQEAKIAkgICAgZGV2X2dldF9wbGF0ZGF0YSgmY2xpZW50LT5kZXYpOwogCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKIAlpbnQgaSwgcmV0OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCXUzMiByZWd1bGF0b3JfbnVtOworCXUzMiBzd19jaGVja19zdGFydCwgc3dfY2hlY2tfZW5kOwogCiAJcGZ1emVfY2hpcCA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqcGZ1emVfY2hpcCksCiAJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIXBmdXplX2NoaXApCiAJCXJldHVybiAtRU5PTUVNOwogCisJaWYgKGNsaWVudC0+ZGV2Lm9mX25vZGUpIHsKKwkJbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2Uob2ZfbWF0Y2hfcHRyKHBmdXplX2R0X2lkcyksCisJCQkJJmNsaWVudC0+ZGV2KTsKKwkJaWYgKCFtYXRjaCkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJFcnJvcjogTm8gZGV2aWNlIG1hdGNoIGZvdW5kXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCXBmdXplX2NoaXAtPmNoaXBfaWQgPSAoaW50KShsb25nKW1hdGNoLT5kYXRhOworCX0gZWxzZSBpZiAoaWQpIHsKKwkJcGZ1emVfY2hpcC0+Y2hpcF9pZCA9IGlkLT5kcml2ZXJfZGF0YTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk5vIGR0cyBtYXRjaCBvciBpZCB0YWJsZSBtYXRjaCBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHBmdXplX2NoaXApOwotCi0JbWVtY3B5KHBmdXplX2NoaXAtPnJlZ3VsYXRvcl9kZXNjcywgcGZ1emUxMDBfcmVndWxhdG9ycywKLQkJc2l6ZW9mKHBmdXplX2NoaXAtPnJlZ3VsYXRvcl9kZXNjcykpOwotCiAJcGZ1emVfY2hpcC0+ZGV2ID0gJmNsaWVudC0+ZGV2OwogCiAJcGZ1emVfY2hpcC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmcGZ1emVfcmVnbWFwX2NvbmZpZyk7CkBAIC0zODAsMTEgKzQ0OSwzNCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAorCS8qIHVzZSB0aGUgcmlnaHQgcmVndWxhdG9ycyBhZnRlciBpZGVudGlmeSB0aGUgcmlnaHQgZGV2aWNlICovCisJc3dpdGNoIChwZnV6ZV9jaGlwLT5jaGlwX2lkKSB7CisJY2FzZSBQRlVaRTIwMDoKKwkJcGZ1emVfcmVndWxhdG9ycyA9IHBmdXplMjAwX3JlZ3VsYXRvcnM7CisJCXJlZ3VsYXRvcl9udW0gPSBBUlJBWV9TSVpFKHBmdXplMjAwX3JlZ3VsYXRvcnMpOworCQlzd19jaGVja19zdGFydCA9IFBGVVpFMjAwX1NXMjsKKwkJc3dfY2hlY2tfZW5kID0gUEZVWkUyMDBfU1czQjsKKwkJYnJlYWs7CisKKwljYXNlIFBGVVpFMTAwOgorCWRlZmF1bHQ6CisJCXBmdXplX3JlZ3VsYXRvcnMgPSBwZnV6ZTEwMF9yZWd1bGF0b3JzOworCQlyZWd1bGF0b3JfbnVtID0gQVJSQVlfU0laRShwZnV6ZTEwMF9yZWd1bGF0b3JzKTsKKwkJc3dfY2hlY2tfc3RhcnQgPSBQRlVaRTEwMF9TVzI7CisJCXN3X2NoZWNrX2VuZCA9IFBGVVpFMTAwX1NXNDsKKwkJYnJlYWs7CisJfQorCWRldl9pbmZvKCZjbGllbnQtPmRldiwgInBmdXplJXMgZm91bmQuXG4iLAorCQkocGZ1emVfY2hpcC0+Y2hpcF9pZCA9PSBQRlVaRTEwMCkgPyAiMTAwIiA6ICIyMDAiKTsKKworCW1lbWNweShwZnV6ZV9jaGlwLT5yZWd1bGF0b3JfZGVzY3MsIHBmdXplX3JlZ3VsYXRvcnMsCisJCXNpemVvZihwZnV6ZV9jaGlwLT5yZWd1bGF0b3JfZGVzY3MpKTsKKwogCXJldCA9IHBmdXplX3BhcnNlX3JlZ3VsYXRvcnNfZHQocGZ1emVfY2hpcCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWZvciAoaSA9IDA7IGkgPCBQRlVaRTEwMF9NQVhfUkVHVUxBVE9SOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgcmVndWxhdG9yX251bTsgaSsrKSB7CiAJCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICppbml0X2RhdGE7CiAJCXN0cnVjdCByZWd1bGF0b3JfZGVzYyAqZGVzYzsKIAkJaW50IHZhbDsKQEAgLTM5Nyw3ICs0ODksNyBAQAogCQkJaW5pdF9kYXRhID0gbWF0Y2hfaW5pdF9kYXRhKGkpOwogCiAJCS8qIFNXMn5TVzQgaGlnaCBiaXQgY2hlY2sgYW5kIG1vZGlmeSB0aGUgdm9sdGFnZSB2YWx1ZSB0YWJsZSAqLwotCQlpZiAoaSA+IFBGVVpFMTAwX1NXMUMgJiYgaSA8IFBGVVpFMTAwX1NXQlNUKSB7CisJCWlmIChpID49IHN3X2NoZWNrX3N0YXJ0ICYmIGkgPD0gc3dfY2hlY2tfZW5kKSB7CiAJCQlyZWdtYXBfcmVhZChwZnV6ZV9jaGlwLT5yZWdtYXAsIGRlc2MtPnZzZWxfcmVnLCAmdmFsKTsKIAkJCWlmICh2YWwgJiAweDQwKSB7CiAJCQkJZGVzYy0+bWluX3VWID0gODAwMDAwOwpAQCAtNDE1LDcgKzUwNyw3IEBACiAJCQlkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmY2xpZW50LT5kZXYsIGRlc2MsICZjb25maWcpOwogCQlpZiAoSVNfRVJSKHBmdXplX2NoaXAtPnJlZ3VsYXRvcnNbaV0pKSB7CiAJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInJlZ2lzdGVyIHJlZ3VsYXRvciVzIGZhaWxlZFxuIiwKLQkJCQlwZnV6ZTEwMF9yZWd1bGF0b3JzW2ldLmRlc2MubmFtZSk7CisJCQkJcGZ1emVfcmVndWxhdG9yc1tpXS5kZXNjLm5hbWUpOwogCQkJcmV0dXJuIFBUUl9FUlIocGZ1emVfY2hpcC0+cmVndWxhdG9yc1tpXSk7CiAJCX0KIAl9CkBAIC00MzUsNiArNTI3LDYgQEAKIG1vZHVsZV9pMmNfZHJpdmVyKHBmdXplX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIlJvYmluIEdvbmcgPGIzODM0M0BmcmVlc2NhbGUuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJSZWd1bGF0b3IgRHJpdmVyIGZvciBGcmVlc2NhbGUgUEZVWkUxMDAgUE1JQyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSZWd1bGF0b3IgRHJpdmVyIGZvciBGcmVlc2NhbGUgUEZVWkUxMDAvUEZVWkUyMDAgUE1JQyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwogTU9EVUxFX0FMSUFTKCJpMmM6cGZ1emUxMDAtcmVndWxhdG9yIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9yYzV0NTgzLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvcmM1dDU4My1yZWd1bGF0b3IuYwppbmRleCBiNThhZmZiLi40YzQxNGFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9yYzV0NTgzLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3JjNXQ1ODMtcmVndWxhdG9yLmMKQEAgLTExOSw3ICsxMTksNiBAQAogewogCXN0cnVjdCByYzV0NTgzICpyYzV0NTgzID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCXN0cnVjdCByYzV0NTgzX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShyYzV0NTgzLT5kZXYpOwotCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICpyZWdfZGF0YTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07CiAJc3RydWN0IHJjNXQ1ODNfcmVndWxhdG9yICpyZWcgPSBOVUxMOwogCXN0cnVjdCByYzV0NTgzX3JlZ3VsYXRvciAqcmVnczsKQEAgLTEzNSwxOSArMTM0LDExIEBACiAKIAlyZWdzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIFJDNVQ1ODNfUkVHVUxBVE9SX01BWCAqCiAJCQlzaXplb2Yoc3RydWN0IHJjNXQ1ODNfcmVndWxhdG9yKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZWdzKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBleGl0aW5nLi5cbiIpOworCWlmICghcmVncykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAKIAlmb3IgKGlkID0gMDsgaWQgPCBSQzVUNTgzX1JFR1VMQVRPUl9NQVg7ICsraWQpIHsKLQkJcmVnX2RhdGEgPSBwZGF0YS0+cmVnX2luaXRfZGF0YVtpZF07Ci0KLQkJLyogTm8gbmVlZCB0byByZWdpc3RlciBpZiB0aGVyZSBpcyBubyByZWd1bGF0b3IgZGF0YSAqLwotCQlpZiAoIXJlZ19kYXRhKQotCQkJY29udGludWU7Ci0KIAkJcmVnID0gJnJlZ3NbaWRdOwogCQlyaSA9ICZyYzV0NTgzX3JlZ19pbmZvW2lkXTsKIAkJcmVnLT5yZWdfaW5mbyA9IHJpOwpAQCAtMTY5LDcgKzE2MCw3IEBACiAKIHNraXBfZXh0X3B3cl9jb25maWc6CiAJCWNvbmZpZy5kZXYgPSAmcGRldi0+ZGV2OwotCQljb25maWcuaW5pdF9kYXRhID0gcmVnX2RhdGE7CisJCWNvbmZpZy5pbml0X2RhdGEgPSBwZGF0YS0+cmVnX2luaXRfZGF0YVtpZF07CiAJCWNvbmZpZy5kcml2ZXJfZGF0YSA9IHJlZzsKIAkJY29uZmlnLnJlZ21hcCA9IHJjNXQ1ODMtPnJlZ21hcDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvczJtcGEwMS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvczJtcGEwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOGIzYWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9zMm1wYTAxLmMKQEAgLTAsMCArMSw0ODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZAorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3Ivb2ZfcmVndWxhdG9yLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3NhbXN1bmcvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL3MybXBhMDEuaD4KKworI2RlZmluZSBTMk1QQTAxX1JFR1VMQVRPUl9DTlQgQVJSQVlfU0laRShyZWd1bGF0b3JzKQorCitzdHJ1Y3QgczJtcGEwMV9pbmZvIHsKKwlpbnQgcmFtcF9kZWxheTI0OworCWludCByYW1wX2RlbGF5MzsKKwlpbnQgcmFtcF9kZWxheTU7CisJaW50IHJhbXBfZGVsYXkxNjsKKwlpbnQgcmFtcF9kZWxheTc7CisJaW50IHJhbXBfZGVsYXk4OTEwOworfTsKKworc3RhdGljIGludCBnZXRfcmFtcF9kZWxheShpbnQgcmFtcF9kZWxheSkKK3sKKwl1bnNpZ25lZCBjaGFyIGNudCA9IDA7CisKKwlyYW1wX2RlbGF5IC89IDYyNTA7CisKKwl3aGlsZSAodHJ1ZSkgeworCQlyYW1wX2RlbGF5ID0gcmFtcF9kZWxheSA+PiAxOworCQlpZiAocmFtcF9kZWxheSA9PSAwKQorCQkJYnJlYWs7CisJCWNudCsrOworCX0KKworCWlmIChjbnQgPiAzKQorCQljbnQgPSAzOworCisJcmV0dXJuIGNudDsKK30KKworc3RhdGljIGludCBzMm1wYTAxX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZV90aW1lX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgb2xkX3NlbGVjdG9yLAorCQkJCSAgIHVuc2lnbmVkIGludCBuZXdfc2VsZWN0b3IpCit7CisJc3RydWN0IHMybXBhMDFfaW5mbyAqczJtcGEwMSA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJdW5zaWduZWQgaW50IHJhbXBfZGVsYXkgPSAwOworCWludCBvbGRfdm9sdCwgbmV3X3ZvbHQ7CisKKwlzd2l0Y2ggKHJkZXYtPmRlc2MtPmlkKSB7CisJY2FzZSBTMk1QQTAxX0JVQ0syOgorCWNhc2UgUzJNUEEwMV9CVUNLNDoKKwkJcmFtcF9kZWxheSA9IHMybXBhMDEtPnJhbXBfZGVsYXkyNDsKKwkJYnJlYWs7CisJY2FzZSBTMk1QQTAxX0JVQ0szOgorCQlyYW1wX2RlbGF5ID0gczJtcGEwMS0+cmFtcF9kZWxheTM7CisJCWJyZWFrOworCWNhc2UgUzJNUEEwMV9CVUNLNToKKwkJcmFtcF9kZWxheSA9IHMybXBhMDEtPnJhbXBfZGVsYXk1OworCQlicmVhazsKKwljYXNlIFMyTVBBMDFfQlVDSzE6CisJY2FzZSBTMk1QQTAxX0JVQ0s2OgorCQlyYW1wX2RlbGF5ID0gczJtcGEwMS0+cmFtcF9kZWxheTE2OworCQlicmVhazsKKwljYXNlIFMyTVBBMDFfQlVDSzc6CisJCXJhbXBfZGVsYXkgPSBzMm1wYTAxLT5yYW1wX2RlbGF5NzsKKwkJYnJlYWs7CisJY2FzZSBTMk1QQTAxX0JVQ0s4OgorCWNhc2UgUzJNUEEwMV9CVUNLOToKKwljYXNlIFMyTVBBMDFfQlVDSzEwOgorCQlyYW1wX2RlbGF5ID0gczJtcGEwMS0+cmFtcF9kZWxheTg5MTA7CisJCWJyZWFrOworCX0KKworCWlmIChyYW1wX2RlbGF5ID09IDApCisJCXJhbXBfZGVsYXkgPSByZGV2LT5kZXNjLT5yYW1wX2RlbGF5OworCisJb2xkX3ZvbHQgPSByZGV2LT5kZXNjLT5taW5fdVYgKyAocmRldi0+ZGVzYy0+dVZfc3RlcCAqIG9sZF9zZWxlY3Rvcik7CisJbmV3X3ZvbHQgPSByZGV2LT5kZXNjLT5taW5fdVYgKyAocmRldi0+ZGVzYy0+dVZfc3RlcCAqIG5ld19zZWxlY3Rvcik7CisKKwlyZXR1cm4gRElWX1JPVU5EX1VQKGFicyhuZXdfdm9sdCAtIG9sZF92b2x0KSwgcmFtcF9kZWxheSk7Cit9CisKK3N0YXRpYyBpbnQgczJtcGEwMV9zZXRfcmFtcF9kZWxheShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IHJhbXBfZGVsYXkpCit7CisJc3RydWN0IHMybXBhMDFfaW5mbyAqczJtcGEwMSA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJdW5zaWduZWQgaW50IHJhbXBfdmFsLCByYW1wX3NoaWZ0LCByYW1wX3JlZyA9IFMyTVBBMDFfUkVHX1JBTVAyOworCXVuc2lnbmVkIGludCByYW1wX2VuYWJsZSA9IDEsIGVuYWJsZV9zaGlmdCA9IDA7CisJaW50IHJldDsKKworCXN3aXRjaCAocmRldi0+ZGVzYy0+aWQpIHsKKwljYXNlIFMyTVBBMDFfQlVDSzE6CisJCWVuYWJsZV9zaGlmdCA9IFMyTVBBMDFfQlVDSzFfUkFNUF9FTl9TSElGVDsKKwkJaWYgKCFyYW1wX2RlbGF5KSB7CisJCQlyYW1wX2VuYWJsZSA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChyYW1wX2RlbGF5ID4gczJtcGEwMS0+cmFtcF9kZWxheTE2KQorCQkJczJtcGEwMS0+cmFtcF9kZWxheTE2ID0gcmFtcF9kZWxheTsKKwkJZWxzZQorCQkJcmFtcF9kZWxheSA9IHMybXBhMDEtPnJhbXBfZGVsYXkxNjsKKworCQlyYW1wX3NoaWZ0ID0gUzJNUEEwMV9CVUNLMTZfUkFNUF9TSElGVDsKKwkJcmFtcF9yZWcgPSBTMk1QQTAxX1JFR19SQU1QMTsKKwkJYnJlYWs7CisJY2FzZSBTMk1QQTAxX0JVQ0syOgorCQllbmFibGVfc2hpZnQgPSBTMk1QQTAxX0JVQ0syX1JBTVBfRU5fU0hJRlQ7CisJCWlmICghcmFtcF9kZWxheSkgeworCQkJcmFtcF9lbmFibGUgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmFtcF9kZWxheSA+IHMybXBhMDEtPnJhbXBfZGVsYXkyNCkKKwkJCXMybXBhMDEtPnJhbXBfZGVsYXkyNCA9IHJhbXBfZGVsYXk7CisJCWVsc2UKKwkJCXJhbXBfZGVsYXkgPSBzMm1wYTAxLT5yYW1wX2RlbGF5MjQ7CisKKwkJcmFtcF9zaGlmdCA9IFMyTVBBMDFfQlVDSzI0X1JBTVBfU0hJRlQ7CisJCXJhbXBfcmVnID0gUzJNUEEwMV9SRUdfUkFNUDE7CisJCWJyZWFrOworCWNhc2UgUzJNUEEwMV9CVUNLMzoKKwkJZW5hYmxlX3NoaWZ0ID0gUzJNUEEwMV9CVUNLM19SQU1QX0VOX1NISUZUOworCQlpZiAoIXJhbXBfZGVsYXkpIHsKKwkJCXJhbXBfZW5hYmxlID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJczJtcGEwMS0+cmFtcF9kZWxheTMgPSByYW1wX2RlbGF5OworCQlyYW1wX3NoaWZ0ID0gUzJNUEEwMV9CVUNLM19SQU1QX1NISUZUOworCQlyYW1wX3JlZyA9IFMyTVBBMDFfUkVHX1JBTVAxOworCQlicmVhazsKKwljYXNlIFMyTVBBMDFfQlVDSzQ6CisJCWVuYWJsZV9zaGlmdCA9IFMyTVBBMDFfQlVDSzRfUkFNUF9FTl9TSElGVDsKKwkJaWYgKCFyYW1wX2RlbGF5KSB7CisJCQlyYW1wX2VuYWJsZSA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChyYW1wX2RlbGF5ID4gczJtcGEwMS0+cmFtcF9kZWxheTI0KQorCQkJczJtcGEwMS0+cmFtcF9kZWxheTI0ID0gcmFtcF9kZWxheTsKKwkJZWxzZQorCQkJcmFtcF9kZWxheSA9IHMybXBhMDEtPnJhbXBfZGVsYXkyNDsKKworCQlyYW1wX3NoaWZ0ID0gUzJNUEEwMV9CVUNLMjRfUkFNUF9TSElGVDsKKwkJcmFtcF9yZWcgPSBTMk1QQTAxX1JFR19SQU1QMTsKKwkJYnJlYWs7CisJY2FzZSBTMk1QQTAxX0JVQ0s1OgorCQlzMm1wYTAxLT5yYW1wX2RlbGF5NSA9IHJhbXBfZGVsYXk7CisJCXJhbXBfc2hpZnQgPSBTMk1QQTAxX0JVQ0s1X1JBTVBfU0hJRlQ7CisJCWJyZWFrOworCWNhc2UgUzJNUEEwMV9CVUNLNjoKKwkJaWYgKHJhbXBfZGVsYXkgPiBzMm1wYTAxLT5yYW1wX2RlbGF5MTYpCisJCQlzMm1wYTAxLT5yYW1wX2RlbGF5MTYgPSByYW1wX2RlbGF5OworCQllbHNlCisJCQlyYW1wX2RlbGF5ID0gczJtcGEwMS0+cmFtcF9kZWxheTE2OworCisJCXJhbXBfc2hpZnQgPSBTMk1QQTAxX0JVQ0sxNl9SQU1QX1NISUZUOworCQlicmVhazsKKwljYXNlIFMyTVBBMDFfQlVDSzc6CisJCXMybXBhMDEtPnJhbXBfZGVsYXk3ID0gcmFtcF9kZWxheTsKKwkJcmFtcF9zaGlmdCA9IFMyTVBBMDFfQlVDSzdfUkFNUF9TSElGVDsKKwkJYnJlYWs7CisJY2FzZSBTMk1QQTAxX0JVQ0s4OgorCWNhc2UgUzJNUEEwMV9CVUNLOToKKwljYXNlIFMyTVBBMDFfQlVDSzEwOgorCQlpZiAocmFtcF9kZWxheSA+IHMybXBhMDEtPnJhbXBfZGVsYXk4OTEwKQorCQkJczJtcGEwMS0+cmFtcF9kZWxheTg5MTAgPSByYW1wX2RlbGF5OworCQllbHNlCisJCQlyYW1wX2RlbGF5ID0gczJtcGEwMS0+cmFtcF9kZWxheTg5MTA7CisKKwkJcmFtcF9zaGlmdCA9IFMyTVBBMDFfQlVDSzg5MTBfUkFNUF9TSElGVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFyYW1wX2VuYWJsZSkKKwkJZ290byByYW1wX2Rpc2FibGU7CisKKwlpZiAoZW5hYmxlX3NoaWZ0KSB7CisJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhyZGV2LT5yZWdtYXAsIFMyTVBBMDFfUkVHX1JBTVAxLAorCQkJCQkxIDw8IGVuYWJsZV9zaGlmdCwgMSA8PCBlbmFibGVfc2hpZnQpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZyZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIHJhbXAgcmF0ZVxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmFtcF92YWwgPSBnZXRfcmFtcF9kZWxheShyYW1wX2RlbGF5KTsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocmRldi0+cmVnbWFwLCByYW1wX3JlZywgMHgzIDw8IHJhbXBfc2hpZnQsCisJCQkJICByYW1wX3ZhbCA8PCByYW1wX3NoaWZ0KTsKKworcmFtcF9kaXNhYmxlOgorCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocmRldi0+cmVnbWFwLCBTMk1QQTAxX1JFR19SQU1QMSwKKwkJCQkgIDEgPDwgZW5hYmxlX3NoaWZ0LCAwKTsKK30KKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHMybXBhMDFfbGRvX29wcyA9IHsKKwkubGlzdF92b2x0YWdlCQk9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2VfbGluZWFyLAorCS5tYXBfdm9sdGFnZQkJPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfbGluZWFyLAorCS5pc19lbmFibGVkCQk9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKKwkuZW5hYmxlCQkJPSByZWd1bGF0b3JfZW5hYmxlX3JlZ21hcCwKKwkuZGlzYWJsZQkJPSByZWd1bGF0b3JfZGlzYWJsZV9yZWdtYXAsCisJLmdldF92b2x0YWdlX3NlbAk9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAorCS5zZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkuc2V0X3ZvbHRhZ2VfdGltZV9zZWwJPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2VfdGltZV9zZWwsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgczJtcGEwMV9idWNrX29wcyA9IHsKKwkubGlzdF92b2x0YWdlCQk9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2VfbGluZWFyLAorCS5tYXBfdm9sdGFnZQkJPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfbGluZWFyLAorCS5pc19lbmFibGVkCQk9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKKwkuZW5hYmxlCQkJPSByZWd1bGF0b3JfZW5hYmxlX3JlZ21hcCwKKwkuZGlzYWJsZQkJPSByZWd1bGF0b3JfZGlzYWJsZV9yZWdtYXAsCisJLmdldF92b2x0YWdlX3NlbAk9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAorCS5zZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkuc2V0X3ZvbHRhZ2VfdGltZV9zZWwJPSBzMm1wYTAxX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZV90aW1lX3NlbCwKKwkuc2V0X3JhbXBfZGVsYXkJCT0gczJtcGEwMV9zZXRfcmFtcF9kZWxheSwKK307CisKKyNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfbGRvMShudW0pCXsJCVwKKwkubmFtZQkJPSAiTERPIiNudW0sCQkJXAorCS5pZAkJPSBTMk1QQTAxX0xETyMjbnVtLAkJXAorCS5vcHMJCT0gJnMybXBhMDFfbGRvX29wcywJCVwKKwkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCVwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCQkJXAorCS5taW5fdVYJCT0gUzJNUEEwMV9MRE9fTUlOLAkJXAorCS51Vl9zdGVwCT0gUzJNUEEwMV9MRE9fU1RFUDEsCQlcCisJLm5fdm9sdGFnZXMJPSBTMk1QQTAxX0xET19OX1ZPTFRBR0VTLAlcCisJLnZzZWxfcmVnCT0gUzJNUEEwMV9SRUdfTDFDVFJMICsgbnVtIC0gMSwJXAorCS52c2VsX21hc2sJPSBTMk1QQTAxX0xET19WU0VMX01BU0ssCVwKKwkuZW5hYmxlX3JlZwk9IFMyTVBBMDFfUkVHX0wxQ1RSTCArIG51bSAtIDEsCVwKKwkuZW5hYmxlX21hc2sJPSBTMk1QQTAxX0VOQUJMRV9NQVNLCQlcCit9CisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX2xkbzIobnVtKQl7CQlcCisJLm5hbWUJCT0gIkxETyIjbnVtLAkJCVwKKwkuaWQJCT0gUzJNUEEwMV9MRE8jI251bSwJCVwKKwkub3BzCQk9ICZzMm1wYTAxX2xkb19vcHMsCQlcCisJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCVwKKwkubWluX3VWCQk9IFMyTVBBMDFfTERPX01JTiwJCVwKKwkudVZfc3RlcAk9IFMyTVBBMDFfTERPX1NURVAyLAkJXAorCS5uX3ZvbHRhZ2VzCT0gUzJNUEEwMV9MRE9fTl9WT0xUQUdFUywJXAorCS52c2VsX3JlZwk9IFMyTVBBMDFfUkVHX0wxQ1RSTCArIG51bSAtIDEsCVwKKwkudnNlbF9tYXNrCT0gUzJNUEEwMV9MRE9fVlNFTF9NQVNLLAlcCisJLmVuYWJsZV9yZWcJPSBTMk1QQTAxX1JFR19MMUNUUkwgKyBudW0gLSAxLAlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUEEwMV9FTkFCTEVfTUFTSwkJXAorfQorCisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX2J1Y2sxXzQobnVtKQl7CQkJXAorCS5uYW1lCQk9ICJCVUNLIiNudW0sCQkJCVwKKwkuaWQJCT0gUzJNUEEwMV9CVUNLIyNudW0sCQkJXAorCS5vcHMJCT0gJnMybXBhMDFfYnVja19vcHMsCQkJXAorCS50eXBlCQk9IFJFR1VMQVRPUl9WT0xUQUdFLAkJCVwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCQkJCVwKKwkubWluX3VWCQk9IFMyTVBBMDFfQlVDS19NSU4xLAkJCVwKKwkudVZfc3RlcAk9IFMyTVBBMDFfQlVDS19TVEVQMSwJCQlcCisJLm5fdm9sdGFnZXMJPSBTMk1QQTAxX0JVQ0tfTl9WT0xUQUdFUywJCVwKKwkucmFtcF9kZWxheQk9IFMyTVBBMDFfUkFNUF9ERUxBWSwJCQlcCisJLnZzZWxfcmVnCT0gUzJNUEEwMV9SRUdfQjFDVFJMMiArIChudW0gLSAxKSAqIDIsCVwKKwkudnNlbF9tYXNrCT0gUzJNUEEwMV9CVUNLX1ZTRUxfTUFTSywJCVwKKwkuZW5hYmxlX3JlZwk9IFMyTVBBMDFfUkVHX0IxQ1RSTDEgKyAobnVtIC0gMSkgKiAyLAlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUEEwMV9FTkFCTEVfTUFTSwkJCVwKK30KKworI2RlZmluZSByZWd1bGF0b3JfZGVzY19idWNrNQl7CQkJCVwKKwkubmFtZQkJPSAiQlVDSzUiLAkJCQlcCisJLmlkCQk9IFMyTVBBMDFfQlVDSzUsCQkJXAorCS5vcHMJCT0gJnMybXBhMDFfYnVja19vcHMsCQkJXAorCS50eXBlCQk9IFJFR1VMQVRPUl9WT0xUQUdFLAkJCVwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCQkJCVwKKwkubWluX3VWCQk9IFMyTVBBMDFfQlVDS19NSU4yLAkJCVwKKwkudVZfc3RlcAk9IFMyTVBBMDFfQlVDS19TVEVQMSwJCQlcCisJLm5fdm9sdGFnZXMJPSBTMk1QQTAxX0JVQ0tfTl9WT0xUQUdFUywJCVwKKwkucmFtcF9kZWxheQk9IFMyTVBBMDFfUkFNUF9ERUxBWSwJCQlcCisJLnZzZWxfcmVnCT0gUzJNUEEwMV9SRUdfQjVDVFJMMiwJCQlcCisJLnZzZWxfbWFzawk9IFMyTVBBMDFfQlVDS19WU0VMX01BU0ssCQlcCisJLmVuYWJsZV9yZWcJPSBTMk1QQTAxX1JFR19CNUNUUkwxLAkJCVwKKwkuZW5hYmxlX21hc2sJPSBTMk1QQTAxX0VOQUJMRV9NQVNLCQkJXAorfQorCisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX2J1Y2s2XzcobnVtKQl7CQkJXAorCS5uYW1lCQk9ICJCVUNLIiNudW0sCQkJCVwKKwkuaWQJCT0gUzJNUEEwMV9CVUNLIyNudW0sCQkJXAorCS5vcHMJCT0gJnMybXBhMDFfYnVja19vcHMsCQkJXAorCS50eXBlCQk9IFJFR1VMQVRPUl9WT0xUQUdFLAkJCVwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCQkJCVwKKwkubWluX3VWCQk9IFMyTVBBMDFfQlVDS19NSU4xLAkJCVwKKwkudVZfc3RlcAk9IFMyTVBBMDFfQlVDS19TVEVQMSwJCQlcCisJLm5fdm9sdGFnZXMJPSBTMk1QQTAxX0JVQ0tfTl9WT0xUQUdFUywJCVwKKwkucmFtcF9kZWxheQk9IFMyTVBBMDFfUkFNUF9ERUxBWSwJCQlcCisJLnZzZWxfcmVnCT0gUzJNUEEwMV9SRUdfQjZDVFJMMiArIChudW0gLSA2KSAqIDIsCVwKKwkudnNlbF9tYXNrCT0gUzJNUEEwMV9CVUNLX1ZTRUxfTUFTSywJCVwKKwkuZW5hYmxlX3JlZwk9IFMyTVBBMDFfUkVHX0I2Q1RSTDEgKyAobnVtIC0gNikgKiAyLAlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUEEwMV9FTkFCTEVfTUFTSwkJCVwKK30KKworI2RlZmluZSByZWd1bGF0b3JfZGVzY19idWNrOAl7CQkJCVwKKwkubmFtZQkJPSAiQlVDSzgiLAkJCQlcCisJLmlkCQk9IFMyTVBBMDFfQlVDSzgsCQkJXAorCS5vcHMJCT0gJnMybXBhMDFfYnVja19vcHMsCQkJXAorCS50eXBlCQk9IFJFR1VMQVRPUl9WT0xUQUdFLAkJCVwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCQkJCVwKKwkubWluX3VWCQk9IFMyTVBBMDFfQlVDS19NSU4yLAkJCVwKKwkudVZfc3RlcAk9IFMyTVBBMDFfQlVDS19TVEVQMiwJCQlcCisJLm5fdm9sdGFnZXMJPSBTMk1QQTAxX0JVQ0tfTl9WT0xUQUdFUywJCVwKKwkucmFtcF9kZWxheQk9IFMyTVBBMDFfUkFNUF9ERUxBWSwJCQlcCisJLnZzZWxfcmVnCT0gUzJNUEEwMV9SRUdfQjhDVFJMMiwJCQlcCisJLnZzZWxfbWFzawk9IFMyTVBBMDFfQlVDS19WU0VMX01BU0ssCQlcCisJLmVuYWJsZV9yZWcJPSBTMk1QQTAxX1JFR19COENUUkwxLAkJCVwKKwkuZW5hYmxlX21hc2sJPSBTMk1QQTAxX0VOQUJMRV9NQVNLCQkJXAorfQorCisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX2J1Y2s5CXsJCQkJXAorCS5uYW1lCQk9ICJCVUNLOSIsCQkJCVwKKwkuaWQJCT0gUzJNUEEwMV9CVUNLOSwJCQlcCisJLm9wcwkJPSAmczJtcGEwMV9idWNrX29wcywJCQlcCisJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCQkJXAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwJCQkJXAorCS5taW5fdVYJCT0gUzJNUEEwMV9CVUNLX01JTjQsCQkJXAorCS51Vl9zdGVwCT0gUzJNUEEwMV9CVUNLX1NURVAyLAkJCVwKKwkubl92b2x0YWdlcwk9IFMyTVBBMDFfQlVDS19OX1ZPTFRBR0VTLAkJXAorCS5yYW1wX2RlbGF5CT0gUzJNUEEwMV9SQU1QX0RFTEFZLAkJCVwKKwkudnNlbF9yZWcJPSBTMk1QQTAxX1JFR19COUNUUkwyLAkJCVwKKwkudnNlbF9tYXNrCT0gUzJNUEEwMV9CVUNLX1ZTRUxfTUFTSywJCVwKKwkuZW5hYmxlX3JlZwk9IFMyTVBBMDFfUkVHX0I5Q1RSTDEsCQkJXAorCS5lbmFibGVfbWFzawk9IFMyTVBBMDFfRU5BQkxFX01BU0sJCQlcCit9CisKKyNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfYnVjazEwCXsJCQkJXAorCS5uYW1lCQk9ICJCVUNLMTAiLAkJCQlcCisJLmlkCQk9IFMyTVBBMDFfQlVDSzEwLAkJCVwKKwkub3BzCQk9ICZzMm1wYTAxX2J1Y2tfb3BzLAkJCVwKKwkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCQlcCisJLm1pbl91VgkJPSBTMk1QQTAxX0JVQ0tfTUlOMywJCQlcCisJLnVWX3N0ZXAJPSBTMk1QQTAxX0JVQ0tfU1RFUDIsCQkJXAorCS5uX3ZvbHRhZ2VzCT0gUzJNUEEwMV9CVUNLX05fVk9MVEFHRVMsCQlcCisJLnJhbXBfZGVsYXkJPSBTMk1QQTAxX1JBTVBfREVMQVksCQkJXAorCS52c2VsX3JlZwk9IFMyTVBBMDFfUkVHX0IxMENUUkwyLAkJCVwKKwkudnNlbF9tYXNrCT0gUzJNUEEwMV9CVUNLX1ZTRUxfTUFTSywJCVwKKwkuZW5hYmxlX3JlZwk9IFMyTVBBMDFfUkVHX0IxMENUUkwxLAkJCVwKKwkuZW5hYmxlX21hc2sJPSBTMk1QQTAxX0VOQUJMRV9NQVNLCQkJXAorfQorCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHJlZ3VsYXRvcnNbXSA9IHsKKwlyZWd1bGF0b3JfZGVzY19sZG8yKDEpLAorCXJlZ3VsYXRvcl9kZXNjX2xkbzEoMiksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgzKSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDQpLAorCXJlZ3VsYXRvcl9kZXNjX2xkbzEoNSksCisJcmVndWxhdG9yX2Rlc2NfbGRvMig2KSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDcpLAorCXJlZ3VsYXRvcl9kZXNjX2xkbzEoOCksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSg5KSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDEwKSwKKwlyZWd1bGF0b3JfZGVzY19sZG8yKDExKSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDEyKSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDEzKSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDE0KSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDE1KSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDE2KSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDE3KSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDE4KSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDE5KSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDIwKSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDIxKSwKKwlyZWd1bGF0b3JfZGVzY19sZG8yKDIyKSwKKwlyZWd1bGF0b3JfZGVzY19sZG8yKDIzKSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDI0KSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDI1KSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDI2KSwKKwlyZWd1bGF0b3JfZGVzY19idWNrMV80KDEpLAorCXJlZ3VsYXRvcl9kZXNjX2J1Y2sxXzQoMiksCisJcmVndWxhdG9yX2Rlc2NfYnVjazFfNCgzKSwKKwlyZWd1bGF0b3JfZGVzY19idWNrMV80KDQpLAorCXJlZ3VsYXRvcl9kZXNjX2J1Y2s1LAorCXJlZ3VsYXRvcl9kZXNjX2J1Y2s2XzcoNiksCisJcmVndWxhdG9yX2Rlc2NfYnVjazZfNyg3KSwKKwlyZWd1bGF0b3JfZGVzY19idWNrOCwKKwlyZWd1bGF0b3JfZGVzY19idWNrOSwKKwlyZWd1bGF0b3JfZGVzY19idWNrMTAsCit9OworCitzdGF0aWMgaW50IHMybXBhMDFfcG1pY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzZWNfcG1pY19kZXYgKmlvZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzZWNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGlvZGV2LT5kZXYpOworCXN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggcmRhdGFbUzJNUEEwMV9SRUdVTEFUT1JfTUFYXTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJlZ19ucCA9IE5VTEw7CisJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OworCXN0cnVjdCBzMm1wYTAxX2luZm8gKnMybXBhMDE7CisJaW50IGk7CisKKwlzMm1wYTAxID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqczJtcGEwMSksIEdGUF9LRVJORUwpOworCWlmICghczJtcGEwMSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgUzJNUEEwMV9SRUdVTEFUT1JfQ05UOyBpKyspCisJCXJkYXRhW2ldLm5hbWUgPSByZWd1bGF0b3JzW2ldLm5hbWU7CisKKwlpZiAoaW9kZXYtPmRldi0+b2Zfbm9kZSkgeworCQlyZWdfbnAgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShpb2Rldi0+ZGV2LT5vZl9ub2RlLAorCQkJCQkJCSJyZWd1bGF0b3JzIik7CisJCQlpZiAoIXJlZ19ucCkgeworCQkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkJImNvdWxkIG5vdCBmaW5kIHJlZ3VsYXRvcnMgc3ViLW5vZGVcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCW9mX3JlZ3VsYXRvcl9tYXRjaCgmcGRldi0+ZGV2LCByZWdfbnAsIHJkYXRhLAorCQkJCQkJUzJNUEEwMV9SRUdVTEFUT1JfTUFYKTsKKwkJb2Zfbm9kZV9wdXQocmVnX25wKTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzMm1wYTAxKTsKKworCWNvbmZpZy5kZXYgPSAmcGRldi0+ZGV2OworCWNvbmZpZy5yZWdtYXAgPSBpb2Rldi0+cmVnbWFwX3BtaWM7CisJY29uZmlnLmRyaXZlcl9kYXRhID0gczJtcGEwMTsKKworCWZvciAoaSA9IDA7IGkgPCBTMk1QQTAxX1JFR1VMQVRPUl9NQVg7IGkrKykgeworCQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKKwkJaWYgKHBkYXRhKQorCQkJY29uZmlnLmluaXRfZGF0YSA9IHBkYXRhLT5yZWd1bGF0b3JzW2ldLmluaXRkYXRhOworCQllbHNlCisJCQljb25maWcuaW5pdF9kYXRhID0gcmRhdGFbaV0uaW5pdF9kYXRhOworCisJCWlmIChyZWdfbnApCisJCQljb25maWcub2Zfbm9kZSA9IHJkYXRhW2ldLm9mX25vZGU7CisKKwkJcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsCisJCQkJCQkmcmVndWxhdG9yc1tpXSwgJmNvbmZpZyk7CisJCWlmIChJU19FUlIocmRldikpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlZ3VsYXRvciBpbml0IGZhaWxlZCBmb3IgJWRcbiIsCisJCQkJaSk7CisJCQlyZXR1cm4gUFRSX0VSUihyZGV2KTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBzMm1wYTAxX3BtaWNfaWRbXSA9IHsKKwl7ICJzMm1wYTAxLXBtaWMiLCAwfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgczJtcGEwMV9wbWljX2lkKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczJtcGEwMV9wbWljX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzMm1wYTAxLXBtaWMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IHMybXBhMDFfcG1pY19wcm9iZSwKKwkuaWRfdGFibGUgPSBzMm1wYTAxX3BtaWNfaWQsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHMybXBhMDFfcG1pY19kcml2ZXIpOworCisvKiBNb2R1bGUgaW5mb3JtYXRpb24gKi8KK01PRFVMRV9BVVRIT1IoIlNhbmdiZW9tIEtpbSA8c2JraW03M0BzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIlNhY2hpbiBLYW1hdCA8c2FjaGluLmthbWF0QHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTQU1TVU5HIFMyTVBBMDEgUmVndWxhdG9yIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvczJtcHMxMS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvczJtcHMxMS5jCmluZGV4IGNkMGI5ZTM1Li42OGZkNTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9zMm1wczExLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvczJtcHMxMS5jCkBAIC0xLDEzICsxLDE4IEBACiAvKgogICogczJtcHMxMS5jCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE0IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQKICAqICAgICAgICAgICAgICBodHRwOi8vd3d3LnNhbXN1bmcuY29tCiAgKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICovCiAKQEAgLTI0LDE4ICsyOSwyMSBAQAogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9vZl9yZWd1bGF0b3IuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvc2Ftc3VuZy9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3NhbXN1bmcvczJtcHMxMS5oPgotCi0jZGVmaW5lIFMyTVBTMTFfUkVHVUxBVE9SX0NOVCBBUlJBWV9TSVpFKHJlZ3VsYXRvcnMpCisjaW5jbHVkZSA8bGludXgvbWZkL3NhbXN1bmcvczJtcHMxNC5oPgogCiBzdHJ1Y3QgczJtcHMxMV9pbmZvIHsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldltTMk1QUzExX1JFR1VMQVRPUl9NQVhdOwotCisJdW5zaWduZWQgaW50IHJkZXZfbnVtOwogCWludCByYW1wX2RlbGF5MjsKIAlpbnQgcmFtcF9kZWxheTM0OwogCWludCByYW1wX2RlbGF5NTsKIAlpbnQgcmFtcF9kZWxheTE2OwogCWludCByYW1wX2RlbGF5NzgxMDsKIAlpbnQgcmFtcF9kZWxheTk7CisJLyoKKwkgKiBPbmUgYml0IGZvciBlYWNoIFMyTVBTMTQgcmVndWxhdG9yIHdoZXRoZXIgdGhlIHN1c3BlbmQgbW9kZQorCSAqIHdhcyBlbmFibGVkLgorCSAqLworCXVuc2lnbmVkIGludCBzMm1wczE0X3N1c3BlbmRfc3RhdGU6MzA7CiB9OwogCiBzdGF0aWMgaW50IGdldF9yYW1wX2RlbGF5KGludCByYW1wX2RlbGF5KQpAQCAtNjUsNyArNzMsNyBAQAogCXVuc2lnbmVkIGludCByYW1wX2RlbGF5ID0gMDsKIAlpbnQgb2xkX3ZvbHQsIG5ld192b2x0OwogCi0Jc3dpdGNoIChyZGV2LT5kZXNjLT5pZCkgeworCXN3aXRjaCAocmRldl9nZXRfaWQocmRldikpIHsKIAljYXNlIFMyTVBTMTFfQlVDSzI6CiAJCXJhbXBfZGVsYXkgPSBzMm1wczExLT5yYW1wX2RlbGF5MjsKIAkJYnJlYWs7CkBAIC0xMDUsNyArMTEzLDcgQEAKIAl1bnNpZ25lZCBpbnQgcmFtcF9lbmFibGUgPSAxLCBlbmFibGVfc2hpZnQgPSAwOwogCWludCByZXQ7CiAKLQlzd2l0Y2ggKHJkZXYtPmRlc2MtPmlkKSB7CisJc3dpdGNoIChyZGV2X2dldF9pZChyZGV2KSkgewogCWNhc2UgUzJNUFMxMV9CVUNLMToKIAkJaWYgKHJhbXBfZGVsYXkgPiBzMm1wczExLT5yYW1wX2RlbGF5MTYpCiAJCQlzMm1wczExLT5yYW1wX2RlbGF5MTYgPSByYW1wX2RlbGF5OwpAQCAtMjM2LDcgKzI0NCw3IEBACiAJLnNldF9yYW1wX2RlbGF5CQk9IHMybXBzMTFfc2V0X3JhbXBfZGVsYXksCiB9OwogCi0jZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX2xkbzEobnVtKQl7CQlcCisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMShudW0pCXsJCVwKIAkubmFtZQkJPSAiTERPIiNudW0sCQkJXAogCS5pZAkJPSBTMk1QUzExX0xETyMjbnVtLAkJXAogCS5vcHMJCT0gJnMybXBzMTFfbGRvX29wcywJCVwKQEAgLTI1MCw3ICsyNTgsNyBAQAogCS5lbmFibGVfcmVnCT0gUzJNUFMxMV9SRUdfTDFDVFJMICsgbnVtIC0gMSwJXAogCS5lbmFibGVfbWFzawk9IFMyTVBTMTFfRU5BQkxFX01BU0sJCVwKIH0KLSNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfbGRvMihudW0pCXsJCVwKKyNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8yKG51bSkgewkJXAogCS5uYW1lCQk9ICJMRE8iI251bSwJCQlcCiAJLmlkCQk9IFMyTVBTMTFfTERPIyNudW0sCQlcCiAJLm9wcwkJPSAmczJtcHMxMV9sZG9fb3BzLAkJXApAQCAtMjY1LDcgKzI3Myw3IEBACiAJLmVuYWJsZV9tYXNrCT0gUzJNUFMxMV9FTkFCTEVfTUFTSwkJXAogfQogCi0jZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX2J1Y2sxXzQobnVtKQl7CQkJXAorI2RlZmluZSByZWd1bGF0b3JfZGVzY19zMm1wczExX2J1Y2sxXzQobnVtKSB7CQkJXAogCS5uYW1lCQk9ICJCVUNLIiNudW0sCQkJCVwKIAkuaWQJCT0gUzJNUFMxMV9CVUNLIyNudW0sCQkJXAogCS5vcHMJCT0gJnMybXBzMTFfYnVja19vcHMsCQkJXApAQCAtMjgxLDcgKzI4OSw3IEBACiAJLmVuYWJsZV9tYXNrCT0gUzJNUFMxMV9FTkFCTEVfTUFTSwkJCVwKIH0KIAotI2RlZmluZSByZWd1bGF0b3JfZGVzY19idWNrNQl7CQkJCVwKKyNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9idWNrNSB7CQkJCVwKIAkubmFtZQkJPSAiQlVDSzUiLAkJCQlcCiAJLmlkCQk9IFMyTVBTMTFfQlVDSzUsCQkJXAogCS5vcHMJCT0gJnMybXBzMTFfYnVja19vcHMsCQkJXApAQCAtMjk3LDcgKzMwNSw3IEBACiAJLmVuYWJsZV9tYXNrCT0gUzJNUFMxMV9FTkFCTEVfTUFTSwkJCVwKIH0KIAotI2RlZmluZSByZWd1bGF0b3JfZGVzY19idWNrNl84KG51bSkJewkJCVwKKyNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9idWNrNl84KG51bSkgewkJCVwKIAkubmFtZQkJPSAiQlVDSyIjbnVtLAkJCQlcCiAJLmlkCQk9IFMyTVBTMTFfQlVDSyMjbnVtLAkJCVwKIAkub3BzCQk9ICZzMm1wczExX2J1Y2tfb3BzLAkJCVwKQEAgLTMxMyw3ICszMjEsNyBAQAogCS5lbmFibGVfbWFzawk9IFMyTVBTMTFfRU5BQkxFX01BU0sJCQlcCiB9CiAKLSNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfYnVjazkJewkJCQlcCisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfYnVjazkgewkJCQlcCiAJLm5hbWUJCT0gIkJVQ0s5IiwJCQkJXAogCS5pZAkJPSBTMk1QUzExX0JVQ0s5LAkJCVwKIAkub3BzCQk9ICZzMm1wczExX2J1Y2tfb3BzLAkJCVwKQEAgLTMyOSw3ICszMzcsNyBAQAogCS5lbmFibGVfbWFzawk9IFMyTVBTMTFfRU5BQkxFX01BU0sJCQlcCiB9CiAKLSNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfYnVjazEwCXsJCQkJXAorI2RlZmluZSByZWd1bGF0b3JfZGVzY19zMm1wczExX2J1Y2sxMCB7CQkJCVwKIAkubmFtZQkJPSAiQlVDSzEwIiwJCQkJXAogCS5pZAkJPSBTMk1QUzExX0JVQ0sxMCwJCQlcCiAJLm9wcwkJPSAmczJtcHMxMV9idWNrX29wcywJCQlcCkBAIC0zNDUsNzIgKzM1MywyNTIgQEAKIAkuZW5hYmxlX21hc2sJPSBTMk1QUzExX0VOQUJMRV9NQVNLCQkJXAogfQogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHJlZ3VsYXRvcnNbXSA9IHsKLQlyZWd1bGF0b3JfZGVzY19sZG8yKDEpLAotCXJlZ3VsYXRvcl9kZXNjX2xkbzEoMiksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzKSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDQpLAotCXJlZ3VsYXRvcl9kZXNjX2xkbzEoNSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMig2KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDcpLAotCXJlZ3VsYXRvcl9kZXNjX2xkbzEoOCksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSg5KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDEwKSwKLQlyZWd1bGF0b3JfZGVzY19sZG8yKDExKSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDEyKSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDEzKSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDE0KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDE1KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDE2KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDE3KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDE4KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDE5KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDIwKSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDIxKSwKLQlyZWd1bGF0b3JfZGVzY19sZG8yKDIyKSwKLQlyZWd1bGF0b3JfZGVzY19sZG8yKDIzKSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDI0KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDI1KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDI2KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8yKDI3KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDI4KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDI5KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDMwKSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDMxKSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDMyKSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDMzKSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDM0KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDM1KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDM2KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDM3KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDM4KSwKLQlyZWd1bGF0b3JfZGVzY19idWNrMV80KDEpLAotCXJlZ3VsYXRvcl9kZXNjX2J1Y2sxXzQoMiksCi0JcmVndWxhdG9yX2Rlc2NfYnVjazFfNCgzKSwKLQlyZWd1bGF0b3JfZGVzY19idWNrMV80KDQpLAotCXJlZ3VsYXRvcl9kZXNjX2J1Y2s1LAotCXJlZ3VsYXRvcl9kZXNjX2J1Y2s2XzgoNiksCi0JcmVndWxhdG9yX2Rlc2NfYnVjazZfOCg3KSwKLQlyZWd1bGF0b3JfZGVzY19idWNrNl84KDgpLAotCXJlZ3VsYXRvcl9kZXNjX2J1Y2s5LAotCXJlZ3VsYXRvcl9kZXNjX2J1Y2sxMCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgczJtcHMxMV9yZWd1bGF0b3JzW10gPSB7CisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8yKDEpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgyKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMyksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDQpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSg1KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzIoNiksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDcpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSg4KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoOSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDEwKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzIoMTEpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgxMiksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDEzKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMTQpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgxNSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDE2KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMTcpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgxOCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDE5KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMjApLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgyMSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8yKDIyKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzIoMjMpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgyNCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDI1KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMjYpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMigyNyksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDI4KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMjkpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgzMCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDMxKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMzIpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgzMyksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDM0KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMzUpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgzNiksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDM3KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMzgpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfYnVjazFfNCgxKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2J1Y2sxXzQoMiksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9idWNrMV80KDMpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfYnVjazFfNCg0KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2J1Y2s1LAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfYnVjazZfOCg2KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2J1Y2s2XzgoNyksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9idWNrNl84KDgpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfYnVjazksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9idWNrMTAsCit9OworCitzdGF0aWMgaW50IHMybXBzMTRfcmVndWxhdG9yX2VuYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgczJtcHMxMV9pbmZvICpzMm1wczExID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJaWYgKHMybXBzMTEtPnMybXBzMTRfc3VzcGVuZF9zdGF0ZSAmICgxIDw8IHJkZXZfZ2V0X2lkKHJkZXYpKSkKKwkJdmFsID0gUzJNUFMxNF9FTkFCTEVfU1VTUEVORDsKKwllbHNlCisJCXZhbCA9IHJkZXYtPmRlc2MtPmVuYWJsZV9tYXNrOworCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhyZGV2LT5yZWdtYXAsIHJkZXYtPmRlc2MtPmVuYWJsZV9yZWcsCisJCQlyZGV2LT5kZXNjLT5lbmFibGVfbWFzaywgdmFsKTsKK30KKworc3RhdGljIGludCBzMm1wczE0X3JlZ3VsYXRvcl9zZXRfc3VzcGVuZF9kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHZhbDsKKwlzdHJ1Y3QgczJtcHMxMV9pbmZvICpzMm1wczExID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKworCS8qIExETzMgc2hvdWxkIGJlIGFsd2F5cyBvbiBhbmQgZG9lcyBub3Qgc3VwcG9ydCBzdXNwZW5kIG1vZGUgKi8KKwlpZiAocmRldl9nZXRfaWQocmRldikgPT0gUzJNUFMxNF9MRE8zKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHJlZ21hcF9yZWFkKHJkZXYtPnJlZ21hcCwgcmRldi0+ZGVzYy0+ZW5hYmxlX3JlZywgJnZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzMm1wczExLT5zMm1wczE0X3N1c3BlbmRfc3RhdGUgfD0gKDEgPDwgcmRldl9nZXRfaWQocmRldikpOworCS8qCisJICogRG9uJ3QgZW5hYmxlIHN1c3BlbmQgbW9kZSBpZiByZWd1bGF0b3IgaXMgYWxyZWFkeSBkaXNhYmxlZCBiZWNhdXNlCisJICogdGhpcyB3b3VsZCBlZmZlY3RpdmVseSBmb3IgYSBzaG9ydCB0aW1lIHR1cm4gb24gdGhlIHJlZ3VsYXRvciBhZnRlcgorCSAqIHJlc3VtaW5nLgorCSAqIEhvd2V2ZXIgd2Ugc3RpbGwgd2FudCB0byB0b2dnbGUgdGhlIHN1c3BlbmRfc3RhdGUgYml0IGZvciByZWd1bGF0b3IKKwkgKiBpbiBjYXNlIGlmIGl0IGdvdCBlbmFibGVkIGJlZm9yZSBzdXNwZW5kaW5nIHRoZSBzeXN0ZW0uCisJICovCisJaWYgKCEodmFsICYgcmRldi0+ZGVzYy0+ZW5hYmxlX21hc2spKQorCQlyZXR1cm4gMDsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocmRldi0+cmVnbWFwLCByZGV2LT5kZXNjLT5lbmFibGVfcmVnLAorCQkJcmRldi0+ZGVzYy0+ZW5hYmxlX21hc2ssIFMyTVBTMTRfRU5BQkxFX1NVU1BFTkQpOworfQorCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgczJtcHMxNF9yZWdfb3BzID0geworCS5saXN0X3ZvbHRhZ2UJCT0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXIsCisJLm1hcF92b2x0YWdlCQk9IHJlZ3VsYXRvcl9tYXBfdm9sdGFnZV9saW5lYXIsCisJLmlzX2VuYWJsZWQJCT0gcmVndWxhdG9yX2lzX2VuYWJsZWRfcmVnbWFwLAorCS5lbmFibGUJCQk9IHMybXBzMTRfcmVndWxhdG9yX2VuYWJsZSwKKwkuZGlzYWJsZQkJPSByZWd1bGF0b3JfZGlzYWJsZV9yZWdtYXAsCisJLmdldF92b2x0YWdlX3NlbAk9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAorCS5zZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkuc2V0X3ZvbHRhZ2VfdGltZV9zZWwJPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2VfdGltZV9zZWwsCisJLnNldF9zdXNwZW5kX2Rpc2FibGUJPSBzMm1wczE0X3JlZ3VsYXRvcl9zZXRfc3VzcGVuZF9kaXNhYmxlLAorfTsKKworI2RlZmluZSByZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzEobnVtKSB7CQlcCisJLm5hbWUJCT0gIkxETyIjbnVtLAkJCVwKKwkuaWQJCT0gUzJNUFMxNF9MRE8jI251bSwJCVwKKwkub3BzCQk9ICZzMm1wczE0X3JlZ19vcHMsCQlcCisJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCVwKKwkubWluX3VWCQk9IFMyTVBTMTRfTERPX01JTl84MDBNViwJXAorCS51Vl9zdGVwCT0gUzJNUFMxNF9MRE9fU1RFUF8yNU1WLAlcCisJLm5fdm9sdGFnZXMJPSBTMk1QUzE0X0xET19OX1ZPTFRBR0VTLAlcCisJLnZzZWxfcmVnCT0gUzJNUFMxNF9SRUdfTDFDVFJMICsgbnVtIC0gMSwJXAorCS52c2VsX21hc2sJPSBTMk1QUzE0X0xET19WU0VMX01BU0ssCVwKKwkuZW5hYmxlX3JlZwk9IFMyTVBTMTRfUkVHX0wxQ1RSTCArIG51bSAtIDEsCVwKKwkuZW5hYmxlX21hc2sJPSBTMk1QUzE0X0VOQUJMRV9NQVNLCQlcCit9CisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMihudW0pIHsJCVwKKwkubmFtZQkJPSAiTERPIiNudW0sCQkJXAorCS5pZAkJPSBTMk1QUzE0X0xETyMjbnVtLAkJXAorCS5vcHMJCT0gJnMybXBzMTRfcmVnX29wcywJCVwKKwkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCVwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCQkJXAorCS5taW5fdVYJCT0gUzJNUFMxNF9MRE9fTUlOXzE4MDBNViwJXAorCS51Vl9zdGVwCT0gUzJNUFMxNF9MRE9fU1RFUF8yNU1WLAlcCisJLm5fdm9sdGFnZXMJPSBTMk1QUzE0X0xET19OX1ZPTFRBR0VTLAlcCisJLnZzZWxfcmVnCT0gUzJNUFMxNF9SRUdfTDFDVFJMICsgbnVtIC0gMSwJXAorCS52c2VsX21hc2sJPSBTMk1QUzE0X0xET19WU0VMX01BU0ssCVwKKwkuZW5hYmxlX3JlZwk9IFMyTVBTMTRfUkVHX0wxQ1RSTCArIG51bSAtIDEsCVwKKwkuZW5hYmxlX21hc2sJPSBTMk1QUzE0X0VOQUJMRV9NQVNLCQlcCit9CisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMyhudW0pIHsJCVwKKwkubmFtZQkJPSAiTERPIiNudW0sCQkJXAorCS5pZAkJPSBTMk1QUzE0X0xETyMjbnVtLAkJXAorCS5vcHMJCT0gJnMybXBzMTRfcmVnX29wcywJCVwKKwkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCVwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCQkJXAorCS5taW5fdVYJCT0gUzJNUFMxNF9MRE9fTUlOXzgwME1WLAlcCisJLnVWX3N0ZXAJPSBTMk1QUzE0X0xET19TVEVQXzEyXzVNViwJXAorCS5uX3ZvbHRhZ2VzCT0gUzJNUFMxNF9MRE9fTl9WT0xUQUdFUywJXAorCS52c2VsX3JlZwk9IFMyTVBTMTRfUkVHX0wxQ1RSTCArIG51bSAtIDEsCVwKKwkudnNlbF9tYXNrCT0gUzJNUFMxNF9MRE9fVlNFTF9NQVNLLAlcCisJLmVuYWJsZV9yZWcJPSBTMk1QUzE0X1JFR19MMUNUUkwgKyBudW0gLSAxLAlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUFMxNF9FTkFCTEVfTUFTSwkJXAorfQorI2RlZmluZSByZWd1bGF0b3JfZGVzY19zMm1wczE0X2J1Y2sxMjM1KG51bSkgewkJCVwKKwkubmFtZQkJPSAiQlVDSyIjbnVtLAkJCQlcCisJLmlkCQk9IFMyTVBTMTRfQlVDSyMjbnVtLAkJCVwKKwkub3BzCQk9ICZzMm1wczE0X3JlZ19vcHMsCQkJXAorCS50eXBlCQk9IFJFR1VMQVRPUl9WT0xUQUdFLAkJCVwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCQkJCVwKKwkubWluX3VWCQk9IFMyTVBTMTRfQlVDSzEyMzVfTUlOXzYwME1WLAkJXAorCS51Vl9zdGVwCT0gUzJNUFMxNF9CVUNLMTIzNV9TVEVQXzZfMjVNViwJCVwKKwkubl92b2x0YWdlcwk9IFMyTVBTMTRfQlVDS19OX1ZPTFRBR0VTLAkJXAorCS5saW5lYXJfbWluX3NlbCA9IFMyTVBTMTRfQlVDSzEyMzVfU1RBUlRfU0VMLAkJXAorCS5yYW1wX2RlbGF5CT0gUzJNUFMxNF9CVUNLX1JBTVBfREVMQVksCQlcCisJLnZzZWxfcmVnCT0gUzJNUFMxNF9SRUdfQjFDVFJMMiArIChudW0gLSAxKSAqIDIsCVwKKwkudnNlbF9tYXNrCT0gUzJNUFMxNF9CVUNLX1ZTRUxfTUFTSywJCVwKKwkuZW5hYmxlX3JlZwk9IFMyTVBTMTRfUkVHX0IxQ1RSTDEgKyAobnVtIC0gMSkgKiAyLAlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUFMxNF9FTkFCTEVfTUFTSwkJCVwKK30KKyNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9idWNrNChudW0pIHsJCQlcCisJLm5hbWUJCT0gIkJVQ0siI251bSwJCQkJXAorCS5pZAkJPSBTMk1QUzE0X0JVQ0sjI251bSwJCQlcCisJLm9wcwkJPSAmczJtcHMxNF9yZWdfb3BzLAkJCVwKKwkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCQlcCisJLm1pbl91VgkJPSBTMk1QUzE0X0JVQ0s0X01JTl8xNDAwTVYsCQlcCisJLnVWX3N0ZXAJPSBTMk1QUzE0X0JVQ0s0X1NURVBfMTJfNU1WLAkJXAorCS5uX3ZvbHRhZ2VzCT0gUzJNUFMxNF9CVUNLX05fVk9MVEFHRVMsCQlcCisJLmxpbmVhcl9taW5fc2VsID0gUzJNUFMxNF9CVUNLNF9TVEFSVF9TRUwsCQlcCisJLnJhbXBfZGVsYXkJPSBTMk1QUzE0X0JVQ0tfUkFNUF9ERUxBWSwJCVwKKwkudnNlbF9yZWcJPSBTMk1QUzE0X1JFR19CMUNUUkwyICsgKG51bSAtIDEpICogMiwJXAorCS52c2VsX21hc2sJPSBTMk1QUzE0X0JVQ0tfVlNFTF9NQVNLLAkJXAorCS5lbmFibGVfcmVnCT0gUzJNUFMxNF9SRUdfQjFDVFJMMSArIChudW0gLSAxKSAqIDIsCVwKKwkuZW5hYmxlX21hc2sJPSBTMk1QUzE0X0VOQUJMRV9NQVNLCQkJXAorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHMybXBzMTRfcmVndWxhdG9yc1tdID0geworCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMygxKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzMoMiksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8xKDMpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMSg0KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzMoNSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8zKDYpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMSg3KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzIoOCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8zKDkpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMygxMCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8xKDExKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzIoMTIpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMigxMyksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8yKDE0KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzIoMTUpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMigxNiksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8yKDE3KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzIoMTgpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMSgxOSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8xKDIwKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzEoMjEpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMygyMiksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8xKDIzKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzIoMjQpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMigyNSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9idWNrMTIzNSgxKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2J1Y2sxMjM1KDIpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfYnVjazEyMzUoMyksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9idWNrNCg0KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2J1Y2sxMjM1KDUpLAogfTsKIAogc3RhdGljIGludCBzMm1wczExX3BtaWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc2VjX3BtaWNfZGV2ICppb2RldiA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKLQlzdHJ1Y3Qgc2VjX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShpb2Rldi0+ZGV2KTsKLQlzdHJ1Y3Qgb2ZfcmVndWxhdG9yX21hdGNoIHJkYXRhW1MyTVBTMTFfUkVHVUxBVE9SX01BWF07CisJc3RydWN0IHNlY19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGlvZGV2LT5wZGF0YTsKKwlzdHJ1Y3Qgb2ZfcmVndWxhdG9yX21hdGNoICpyZGF0YSA9IE5VTEw7CiAJc3RydWN0IGRldmljZV9ub2RlICpyZWdfbnAgPSBOVUxMOwogCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKIAlzdHJ1Y3QgczJtcHMxMV9pbmZvICpzMm1wczExOwotCWludCBpLCByZXQ7CisJaW50IGksIHJldCA9IDA7CisJY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9kZXNjICpyZWd1bGF0b3JzOworCWVudW0gc2VjX2RldmljZV90eXBlIGRldl90eXBlOwogCiAJczJtcHMxMSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHMybXBzMTFfaW5mbyksCiAJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFzMm1wczExKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWRldl90eXBlID0gcGxhdGZvcm1fZ2V0X2RldmljZV9pZChwZGV2KS0+ZHJpdmVyX2RhdGE7CisJc3dpdGNoIChkZXZfdHlwZSkgeworCWNhc2UgUzJNUFMxMVg6CisJCXMybXBzMTEtPnJkZXZfbnVtID0gQVJSQVlfU0laRShzMm1wczExX3JlZ3VsYXRvcnMpOworCQlyZWd1bGF0b3JzID0gczJtcHMxMV9yZWd1bGF0b3JzOworCQlicmVhazsKKwljYXNlIFMyTVBTMTRYOgorCQlzMm1wczExLT5yZGV2X251bSA9IEFSUkFZX1NJWkUoczJtcHMxNF9yZWd1bGF0b3JzKTsKKwkJcmVndWxhdG9ycyA9IHMybXBzMTRfcmVndWxhdG9yczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiSW52YWxpZCBkZXZpY2UgdHlwZTogJXVcbiIsIGRldl90eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfTsKKwogCWlmICghaW9kZXYtPmRldi0+b2Zfbm9kZSkgewogCQlpZiAocGRhdGEpIHsKIAkJCWdvdG8gY29tbW9uX3JlZzsKQEAgLTQyMSwxNiArNjA5LDIyIEBACiAJCX0KIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgUzJNUFMxMV9SRUdVTEFUT1JfQ05UOyBpKyspCisJcmRhdGEgPSBremFsbG9jKHNpemVvZigqcmRhdGEpICogczJtcHMxMS0+cmRldl9udW0sIEdGUF9LRVJORUwpOworCWlmICghcmRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IHMybXBzMTEtPnJkZXZfbnVtOyBpKyspCiAJCXJkYXRhW2ldLm5hbWUgPSByZWd1bGF0b3JzW2ldLm5hbWU7CiAKLQlyZWdfbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShpb2Rldi0+ZGV2LT5vZl9ub2RlLCAicmVndWxhdG9ycyIpOworCXJlZ19ucCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKGlvZGV2LT5kZXYtPm9mX25vZGUsICJyZWd1bGF0b3JzIik7CiAJaWYgKCFyZWdfbnApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGZpbmQgcmVndWxhdG9ycyBzdWItbm9kZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKIAl9CiAKLQlvZl9yZWd1bGF0b3JfbWF0Y2goJnBkZXYtPmRldiwgcmVnX25wLCByZGF0YSwgUzJNUFMxMV9SRUdVTEFUT1JfTUFYKTsKKwlvZl9yZWd1bGF0b3JfbWF0Y2goJnBkZXYtPmRldiwgcmVnX25wLCByZGF0YSwgczJtcHMxMS0+cmRldl9udW0pOworCW9mX25vZGVfcHV0KHJlZ19ucCk7CiAKIGNvbW1vbl9yZWc6CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgczJtcHMxMSk7CkBAIC00MzgsNyArNjMyLDkgQEAKIAljb25maWcuZGV2ID0gJnBkZXYtPmRldjsKIAljb25maWcucmVnbWFwID0gaW9kZXYtPnJlZ21hcF9wbWljOwogCWNvbmZpZy5kcml2ZXJfZGF0YSA9IHMybXBzMTE7Ci0JZm9yIChpID0gMDsgaSA8IFMyTVBTMTFfUkVHVUxBVE9SX01BWDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHMybXBzMTEtPnJkZXZfbnVtOyBpKyspIHsKKwkJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJlZ3VsYXRvcjsKKwogCQlpZiAoIXJlZ19ucCkgewogCQkJY29uZmlnLmluaXRfZGF0YSA9IHBkYXRhLT5yZWd1bGF0b3JzW2ldLmluaXRkYXRhOwogCQkJY29uZmlnLm9mX25vZGUgPSBwZGF0YS0+cmVndWxhdG9yc1tpXS5yZWdfbm9kZTsKQEAgLTQ0NywyMSArNjQzLDI1IEBACiAJCQljb25maWcub2Zfbm9kZSA9IHJkYXRhW2ldLm9mX25vZGU7CiAJCX0KIAotCQlzMm1wczExLT5yZGV2W2ldID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwKKwkJcmVndWxhdG9yID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwKIAkJCQkJCSZyZWd1bGF0b3JzW2ldLCAmY29uZmlnKTsKLQkJaWYgKElTX0VSUihzMm1wczExLT5yZGV2W2ldKSkgewotCQkJcmV0ID0gUFRSX0VSUihzMm1wczExLT5yZGV2W2ldKTsKKwkJaWYgKElTX0VSUihyZWd1bGF0b3IpKSB7CisJCQlyZXQgPSBQVFJfRVJSKHJlZ3VsYXRvcik7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyZWd1bGF0b3IgaW5pdCBmYWlsZWQgZm9yICVkXG4iLAogCQkJCWkpOwotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gb3V0OwogCQl9CiAJfQogCi0JcmV0dXJuIDA7CitvdXQ6CisJa2ZyZWUocmRhdGEpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgczJtcHMxMV9wbWljX2lkW10gPSB7Ci0JeyAiczJtcHMxMS1wbWljIiwgMH0sCisJeyAiczJtcHMxMS1wbWljIiwgUzJNUFMxMVh9LAorCXsgInMybXBzMTQtcG1pYyIsIFMyTVBTMTRYfSwKIAl7IH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgczJtcHMxMV9wbWljX2lkKTsKQEAgLTQ4OSw1ICs2ODksNSBAQAogCiAvKiBNb2R1bGUgaW5mb3JtYXRpb24gKi8KIE1PRFVMRV9BVVRIT1IoIlNhbmdiZW9tIEtpbSA8c2JraW03M0BzYW1zdW5nLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU0FNU1VORyBTMk1QUzExIFJlZ3VsYXRvciBEcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0FNU1VORyBTMk1QUzExL1MyTVBTMTQgUmVndWxhdG9yIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvczVtODc2Ny5jIGIvZHJpdmVycy9yZWd1bGF0b3IvczVtODc2Ny5jCmluZGV4IGQ5NThkZmEuLmYwNWJhZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3M1bTg3NjcuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9zNW04NzY3LmMKQEAgLTExLDExICsxMSw4IEBACiAgKgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CkBAIC0xNzAsMTIgKzE2NywxMSBAQAogCXsweDAsIDB4MywgMHgxLCAweDF9LCAvKiBCVUNLOSAqLwogfTsKIAotc3RhdGljIGludCBzNW04NzY3X2dldF9yZWdpc3RlcihzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50ICpyZWcsCi0JCQkJaW50ICplbmFibGVfY3RybCkKK3N0YXRpYyBpbnQgczVtODc2N19nZXRfcmVnaXN0ZXIoc3RydWN0IHM1bTg3NjdfaW5mbyAqczVtODc2NywgaW50IHJlZ19pZCwKKwkJCQlpbnQgKnJlZywgaW50ICplbmFibGVfY3RybCkKIHsKLQlpbnQgaSwgcmVnX2lkID0gcmRldl9nZXRfaWQocmRldik7CisJaW50IGk7CiAJdW5zaWduZWQgaW50IG1vZGU7Ci0Jc3RydWN0IHM1bTg3NjdfaW5mbyAqczVtODc2NyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAKIAlzd2l0Y2ggKHJlZ19pZCkgewogCWNhc2UgUzVNODc2N19MRE8xIC4uLiBTNU04NzY3X0xETzI6CkBAIC0yMTQsNTMgKzIxMCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgczVtODc2N19yZWdfaXNfZW5hYmxlZChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKLXsKLQlzdHJ1Y3QgczVtODc2N19pbmZvICpzNW04NzY3ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQlpbnQgcmV0LCByZWc7Ci0JaW50IGVuYWJsZV9jdHJsOwotCXVuc2lnbmVkIGludCB2YWw7Ci0KLQlyZXQgPSBzNW04NzY3X2dldF9yZWdpc3RlcihyZGV2LCAmcmVnLCAmZW5hYmxlX2N0cmwpOwotCWlmIChyZXQgPT0gLUVJTlZBTCkKLQkJcmV0dXJuIDE7Ci0JZWxzZSBpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gcmVnbWFwX3JlYWQoczVtODc2Ny0+aW9kZXYtPnJlZ21hcF9wbWljLCByZWcsICZ2YWwpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gKHZhbCAmIFM1TTg3NjdfRU5DVFJMX01BU0spID09IGVuYWJsZV9jdHJsOwotfQotCi1zdGF0aWMgaW50IHM1bTg3NjdfcmVnX2VuYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKLXsKLQlzdHJ1Y3QgczVtODc2N19pbmZvICpzNW04NzY3ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQlpbnQgcmV0LCByZWc7Ci0JaW50IGVuYWJsZV9jdHJsOwotCi0JcmV0ID0gczVtODc2N19nZXRfcmVnaXN0ZXIocmRldiwgJnJlZywgJmVuYWJsZV9jdHJsKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhzNW04NzY3LT5pb2Rldi0+cmVnbWFwX3BtaWMsIHJlZywKLQkJCVM1TTg3NjdfRU5DVFJMX01BU0ssIGVuYWJsZV9jdHJsKTsKLX0KLQotc3RhdGljIGludCBzNW04NzY3X3JlZ19kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQotewotCXN0cnVjdCBzNW04NzY3X2luZm8gKnM1bTg3NjcgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwotCWludCByZXQsIHJlZywgZW5hYmxlX2N0cmw7Ci0KLQlyZXQgPSBzNW04NzY3X2dldF9yZWdpc3RlcihyZGV2LCAmcmVnLCAmZW5hYmxlX2N0cmwpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHM1bTg3NjctPmlvZGV2LT5yZWdtYXBfcG1pYywgcmVnLAotCQkJUzVNODc2N19FTkNUUkxfTUFTSywgflM1TTg3NjdfRU5DVFJMX01BU0spOwotfQotCiBzdGF0aWMgaW50IHM1bTg3NjdfZ2V0X3ZzZWxfcmVnKGludCByZWdfaWQsIHN0cnVjdCBzNW04NzY3X2luZm8gKnM1bTg3NjcpCiB7CiAJaW50IHJlZzsKQEAgLTQxMCw5ICszNTksOSBAQAogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgczVtODc2N19vcHMgPSB7CiAJLmxpc3Rfdm9sdGFnZQkJPSByZWd1bGF0b3JfbGlzdF92b2x0YWdlX2xpbmVhciwKLQkuaXNfZW5hYmxlZAkJPSBzNW04NzY3X3JlZ19pc19lbmFibGVkLAotCS5lbmFibGUJCQk9IHM1bTg3NjdfcmVnX2VuYWJsZSwKLQkuZGlzYWJsZQkJPSBzNW04NzY3X3JlZ19kaXNhYmxlLAorCS5pc19lbmFibGVkCQk9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKKwkuZW5hYmxlCQkJPSByZWd1bGF0b3JfZW5hYmxlX3JlZ21hcCwKKwkuZGlzYWJsZQkJPSByZWd1bGF0b3JfZGlzYWJsZV9yZWdtYXAsCiAJLmdldF92b2x0YWdlX3NlbAk9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAogCS5zZXRfdm9sdGFnZV9zZWwJPSBzNW04NzY3X3NldF92b2x0YWdlX3NlbCwKIAkuc2V0X3ZvbHRhZ2VfdGltZV9zZWwJPSBzNW04NzY3X3NldF92b2x0YWdlX3RpbWVfc2VsLApAQCAtNDIwLDkgKzM2OSw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBzNW04NzY3X2J1Y2s3OF9vcHMgPSB7CiAJLmxpc3Rfdm9sdGFnZQkJPSByZWd1bGF0b3JfbGlzdF92b2x0YWdlX2xpbmVhciwKLQkuaXNfZW5hYmxlZAkJPSBzNW04NzY3X3JlZ19pc19lbmFibGVkLAotCS5lbmFibGUJCQk9IHM1bTg3NjdfcmVnX2VuYWJsZSwKLQkuZGlzYWJsZQkJPSBzNW04NzY3X3JlZ19kaXNhYmxlLAorCS5pc19lbmFibGVkCQk9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKKwkuZW5hYmxlCQkJPSByZWd1bGF0b3JfZW5hYmxlX3JlZ21hcCwKKwkuZGlzYWJsZQkJPSByZWd1bGF0b3JfZGlzYWJsZV9yZWdtYXAsCiAJLmdldF92b2x0YWdlX3NlbAk9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAogCS5zZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKIH07CkBAIC00ODMsNiArNDMyLDY2IEBACiAJczVtODc2N19yZWd1bGF0b3JfZGVzYyhCVUNLOSksCiB9OwogCisvKgorICogRW5hYmxlIEdQSU8gY29udHJvbCBvdmVyIEJVQ0s5IGluIHJlZ3VsYXRvcl9jb25maWcgZm9yIHRoYXQgcmVndWxhdG9yLgorICovCitzdGF0aWMgdm9pZCBzNW04NzY3X3JlZ3VsYXRvcl9jb25maWdfZXh0X2NvbnRyb2woc3RydWN0IHM1bTg3NjdfaW5mbyAqczVtODc2NywKKwkJc3RydWN0IHNlY19yZWd1bGF0b3JfZGF0YSAqcmRhdGEsCisJCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnICpjb25maWcpCit7CisJaW50IGksIG1vZGUgPSAwOworCisJaWYgKHJkYXRhLT5pZCAhPSBTNU04NzY3X0JVQ0s5KQorCQlyZXR1cm47CisKKwkvKiBDaGVjayBpZiBvcG1vZGUgZm9yIHJlZ3VsYXRvciBtYXRjaGVzIFM1TTg3NjdfRU5DVFJMX1VTRV9HUElPICovCisJZm9yIChpID0gMDsgaSA8IHM1bTg3NjctPm51bV9yZWd1bGF0b3JzOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHNlY19vcG1vZGVfZGF0YSAqb3Btb2RlID0gJnM1bTg3NjctPm9wbW9kZVtpXTsKKwkJaWYgKG9wbW9kZS0+aWQgPT0gcmRhdGEtPmlkKSB7CisJCQltb2RlID0gczVtODc2N19vcG1vZGVfcmVnW3JkYXRhLT5pZF1bb3Btb2RlLT5tb2RlXTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChtb2RlICE9IFM1TTg3NjdfRU5DVFJMX1VTRV9HUElPKSB7CisJCWRldl93YXJuKHM1bTg3NjctPmRldiwKKwkJCQkiZXh0LWNvbnRyb2wgZm9yICVzOiBtaXNtYXRjaGVkIG9wX21vZGUgKCV4KSwgaWdub3JpbmdcbiIsCisJCQkJcmRhdGEtPnJlZ19ub2RlLT5uYW1lLCBtb2RlKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghZ3Bpb19pc192YWxpZChyZGF0YS0+ZXh0X2NvbnRyb2xfZ3BpbykpIHsKKwkJZGV2X3dhcm4oczVtODc2Ny0+ZGV2LAorCQkJCSJleHQtY29udHJvbCBmb3IgJXM6IEdQSU8gbm90IHZhbGlkLCBpZ25vcmluZ1xuIiwKKwkJCQlyZGF0YS0+cmVnX25vZGUtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJY29uZmlnLT5lbmFfZ3BpbyA9IHJkYXRhLT5leHRfY29udHJvbF9ncGlvOworCWNvbmZpZy0+ZW5hX2dwaW9fZmxhZ3MgPSBHUElPRl9PVVRfSU5JVF9ISUdIOworfQorCisvKgorICogVHVybiBvbiBHUElPIGNvbnRyb2wgb3ZlciBCVUNLOS4KKyAqLworc3RhdGljIGludCBzNW04NzY3X2VuYWJsZV9leHRfY29udHJvbChzdHJ1Y3QgczVtODc2N19pbmZvICpzNW04NzY3LAorCQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlpbnQgaWQgPSByZGV2X2dldF9pZChyZGV2KTsKKwlpbnQgcmV0LCByZWcsIGVuYWJsZV9jdHJsOworCisJaWYgKGlkICE9IFM1TTg3NjdfQlVDSzkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gczVtODc2N19nZXRfcmVnaXN0ZXIoczVtODc2NywgaWQsICZyZWcsICZlbmFibGVfY3RybCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoczVtODc2Ny0+aW9kZXYtPnJlZ21hcF9wbWljLAorCQkJcmVnLCBTNU04NzY3X0VOQ1RSTF9NQVNLLAorCQkJUzVNODc2N19FTkNUUkxfVVNFX0dQSU8gPDwgUzVNODc2N19FTkNUUkxfU0hJRlQpOworfQorCisKICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBpbnQgczVtODc2N19wbWljX2R0X3BhcnNlX2R2c19ncGlvKHN0cnVjdCBzZWNfcG1pY19kZXYgKmlvZGV2LAogCQkJc3RydWN0IHNlY19wbGF0Zm9ybV9kYXRhICpwZGF0YSwKQEAgLTUyMCw2ICs1MjksMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgczVtODc2N19wbWljX2R0X3BhcnNlX2V4dF9jb250cm9sX2dwaW8oc3RydWN0IHNlY19wbWljX2RldiAqaW9kZXYsCisJCXN0cnVjdCBzZWNfcmVndWxhdG9yX2RhdGEgKnJkYXRhLAorCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJlZ19ucCkKK3sKKwlyZGF0YS0+ZXh0X2NvbnRyb2xfZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKHJlZ19ucCwKKwkJCSJzNW04NzY3LHBtaWMtZXh0LWNvbnRyb2wtZ3Bpb3MiLCAwKTsKKwlpZiAoIWdwaW9faXNfdmFsaWQocmRhdGEtPmV4dF9jb250cm9sX2dwaW8pKQorCQlyZGF0YS0+ZXh0X2NvbnRyb2xfZ3BpbyA9IDA7Cit9CisKIHN0YXRpYyBpbnQgczVtODc2N19wbWljX2R0X3BhcnNlX3BkYXRhKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCiAJCQkJCXN0cnVjdCBzZWNfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCiB7CkBAIC01NDYsMTkgKzU2NSwxMyBAQAogCiAJcmRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpyZGF0YSkgKgogCQkJCXBkYXRhLT5udW1fcmVndWxhdG9ycywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZGF0YSkgewotCQlkZXZfZXJyKGlvZGV2LT5kZXYsCi0JCQkiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVndWxhdG9yIGRhdGFcbiIpOworCWlmICghcmRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXJtb2RlID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcm1vZGUpICoKIAkJCQlwZGF0YS0+bnVtX3JlZ3VsYXRvcnMsIEdGUF9LRVJORUwpOwotCWlmICghcm1vZGUpIHsKLQkJZGV2X2Vycihpb2Rldi0+ZGV2LAotCQkJImNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlZ3VsYXRvciBtb2RlXG4iKTsKKwlpZiAoIXJtb2RlKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlwZGF0YS0+cmVndWxhdG9ycyA9IHJkYXRhOwogCXBkYXRhLT5vcG1vZGUgPSBybW9kZTsKQEAgLTU3NCw2ICs1ODcsOCBAQAogCQkJY29udGludWU7CiAJCX0KIAorCQlzNW04NzY3X3BtaWNfZHRfcGFyc2VfZXh0X2NvbnRyb2xfZ3Bpbyhpb2RldiwgcmRhdGEsIHJlZ19ucCk7CisKIAkJcmRhdGEtPmlkID0gaTsKIAkJcmRhdGEtPmluaXRkYXRhID0gb2ZfZ2V0X3JlZ3VsYXRvcl9pbml0X2RhdGEoCiAJCQkJCQkmcGRldi0+ZGV2LCByZWdfbnApOwpAQCAtOTIyLDYgKzkzNyw3IEBACiAJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fcmVndWxhdG9yczsgaSsrKSB7CiAJCWNvbnN0IHN0cnVjdCBzZWNfdm9sdGFnZV9kZXNjICpkZXNjOwogCQlpbnQgaWQgPSBwZGF0YS0+cmVndWxhdG9yc1tpXS5pZDsKKwkJaW50IGVuYWJsZV9yZWcsIGVuYWJsZV92YWw7CiAKIAkJZGVzYyA9IHJlZ192b2x0YWdlX21hcFtpZF07CiAJCWlmIChkZXNjKSB7CkBAIC05MzUsNiArOTUxLDEyIEBACiAJCQkJcmVndWxhdG9yc1tpZF0udnNlbF9tYXNrID0gMHgzZjsKIAkJCWVsc2UKIAkJCQlyZWd1bGF0b3JzW2lkXS52c2VsX21hc2sgPSAweGZmOworCisJCQlzNW04NzY3X2dldF9yZWdpc3RlcihzNW04NzY3LCBpZCwgJmVuYWJsZV9yZWcsCisJCQkJCSAgICAgJmVuYWJsZV92YWwpOworCQkJcmVndWxhdG9yc1tpZF0uZW5hYmxlX3JlZyA9IGVuYWJsZV9yZWc7CisJCQlyZWd1bGF0b3JzW2lkXS5lbmFibGVfbWFzayA9IFM1TTg3NjdfRU5DVFJMX01BU0s7CisJCQlyZWd1bGF0b3JzW2lkXS5lbmFibGVfdmFsID0gZW5hYmxlX3ZhbDsKIAkJfQogCiAJCWNvbmZpZy5kZXYgPSBzNW04NzY3LT5kZXY7CkBAIC05NDIsNiArOTY0LDkgQEAKIAkJY29uZmlnLmRyaXZlcl9kYXRhID0gczVtODc2NzsKIAkJY29uZmlnLnJlZ21hcCA9IGlvZGV2LT5yZWdtYXBfcG1pYzsKIAkJY29uZmlnLm9mX25vZGUgPSBwZGF0YS0+cmVndWxhdG9yc1tpXS5yZWdfbm9kZTsKKwkJaWYgKHBkYXRhLT5yZWd1bGF0b3JzW2ldLmV4dF9jb250cm9sX2dwaW8pCisJCQlzNW04NzY3X3JlZ3VsYXRvcl9jb25maWdfZXh0X2NvbnRyb2woczVtODc2NywKKwkJCQkJJnBkYXRhLT5yZWd1bGF0b3JzW2ldLCAmY29uZmlnKTsKIAogCQlyZGV2W2ldID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJnJlZ3VsYXRvcnNbaWRdLAogCQkJCQkJICAmY29uZmlnKTsKQEAgLTk1MSw2ICs5NzYsMTYgQEAKIAkJCQkJaWQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQorCisJCWlmIChwZGF0YS0+cmVndWxhdG9yc1tpXS5leHRfY29udHJvbF9ncGlvKSB7CisJCQlyZXQgPSBzNW04NzY3X2VuYWJsZV9leHRfY29udHJvbChzNW04NzY3LCByZGV2W2ldKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZGV2X2VycihzNW04NzY3LT5kZXYsCisJCQkJCQkiZmFpbGVkIHRvIGVuYWJsZSBncGlvIGNvbnRyb2wgb3ZlciAlczogJWRcbiIsCisJCQkJCQlyZGV2W2ldLT5kZXNjLT5uYW1lLCByZXQpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3N0LXB3bS5jIGIvZHJpdmVycy9yZWd1bGF0b3Ivc3QtcHdtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM2N2FmMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3N0LXB3bS5jCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogUmVndWxhdG9yIGRyaXZlciBmb3IgU1QncyBQV00gUmVndWxhdG9ycworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCAtIFNUTWljcm9lbGVjdHJvbmljcyBJbmMuCisgKgorICogQXV0aG9yOiBMZWUgSm9uZXMgPGxlZS5qb25lc0BsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3Ivb2ZfcmVndWxhdG9yLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wd20uaD4KKworI2RlZmluZSBTVF9QV01fUkVHX1BFUklPRCA4NDQ4CisKK3N0cnVjdCBzdF9wd21fcmVndWxhdG9yX3BkYXRhIHsKKwljb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgKmRlc2M7CisJc3RydWN0IHN0X3B3bV92b2x0YWdlcyAqZHV0eV9jeWNsZV90YWJsZTsKK307CisKK3N0cnVjdCBzdF9wd21fcmVndWxhdG9yX2RhdGEgeworCWNvbnN0IHN0cnVjdCBzdF9wd21fcmVndWxhdG9yX3BkYXRhICpwZGF0YTsKKwlzdHJ1Y3QgcHdtX2RldmljZSAqcHdtOworCWJvb2wgZW5hYmxlZDsKKwlpbnQgc3RhdGU7Cit9OworCitzdHJ1Y3Qgc3RfcHdtX3ZvbHRhZ2VzIHsKKwl1bnNpZ25lZCBpbnQgdVY7CisJdW5zaWduZWQgaW50IGR1dHljeWNsZTsKK307CisKK3N0YXRpYyBpbnQgc3RfcHdtX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc3RfcHdtX3JlZ3VsYXRvcl9kYXRhICpkcnZkYXRhID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIGRydmRhdGEtPnN0YXRlOworfQorCitzdGF0aWMgaW50IHN0X3B3bV9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYsCisJCQkJCSAgICB1bnNpZ25lZCBzZWxlY3RvcikKK3sKKwlzdHJ1Y3Qgc3RfcHdtX3JlZ3VsYXRvcl9kYXRhICpkcnZkYXRhID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBkdXR5Y3ljbGU7CisJaW50IHJldDsKKworCWR1dHljeWNsZSA9IChTVF9QV01fUkVHX1BFUklPRCAvIDEwMCkgKgorCQlkcnZkYXRhLT5wZGF0YS0+ZHV0eV9jeWNsZV90YWJsZVtzZWxlY3Rvcl0uZHV0eWN5Y2xlOworCisJcmV0ID0gcHdtX2NvbmZpZyhkcnZkYXRhLT5wd20sIGR1dHljeWNsZSwgU1RfUFdNX1JFR19QRVJJT0QpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJGYWlsZWQgdG8gY29uZmlndXJlIFBXTVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZHJ2ZGF0YS0+c3RhdGUgPSBzZWxlY3RvcjsKKworCWlmICghZHJ2ZGF0YS0+ZW5hYmxlZCkgeworCQlyZXQgPSBwd21fZW5hYmxlKGRydmRhdGEtPnB3bSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBQV01cbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlkcnZkYXRhLT5lbmFibGVkID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdF9wd21fcmVndWxhdG9yX2xpc3Rfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LAorCQkJCQkgdW5zaWduZWQgc2VsZWN0b3IpCit7CisJc3RydWN0IHN0X3B3bV9yZWd1bGF0b3JfZGF0YSAqZHJ2ZGF0YSA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChzZWxlY3RvciA+PSBkZXYtPmRlc2MtPm5fdm9sdGFnZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGRydmRhdGEtPnBkYXRhLT5kdXR5X2N5Y2xlX3RhYmxlW3NlbGVjdG9yXS51VjsKK30KKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHN0X3B3bV9yZWd1bGF0b3Jfdm9sdGFnZV9vcHMgPSB7CisJLnNldF92b2x0YWdlX3NlbCA9IHN0X3B3bV9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsLAorCS5nZXRfdm9sdGFnZV9zZWwgPSBzdF9wd21fcmVndWxhdG9yX2dldF92b2x0YWdlX3NlbCwKKwkubGlzdF92b2x0YWdlICAgID0gc3RfcHdtX3JlZ3VsYXRvcl9saXN0X3ZvbHRhZ2UsCisJLm1hcF92b2x0YWdlICAgICA9IHJlZ3VsYXRvcl9tYXBfdm9sdGFnZV9pdGVyYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBzdF9wd21fdm9sdGFnZXMgYjIxMDVfZHV0eV9jeWNsZV90YWJsZVtdID0geworCXsgLnVWID0gMTExNDAwMCwgLmR1dHljeWNsZSA9IDAsICB9LAorCXsgLnVWID0gMTA5NTAwMCwgLmR1dHljeWNsZSA9IDEwLCB9LAorCXsgLnVWID0gMTA3NjAwMCwgLmR1dHljeWNsZSA9IDIwLCB9LAorCXsgLnVWID0gMTA1NjAwMCwgLmR1dHljeWNsZSA9IDMwLCB9LAorCXsgLnVWID0gMTAzNjAwMCwgLmR1dHljeWNsZSA9IDQwLCB9LAorCXsgLnVWID0gMTAxNjAwMCwgLmR1dHljeWNsZSA9IDUwLCB9LAorCS8qIFdBUk5JTkc6IFZhbHVlcyBhYm92ZSA1MCUgZHV0eS1jeWNsZSBjYXVzZSBib290IGZhaWx1cmVzLiAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfZGVzYyBiMjEwNV9kZXNjID0geworCS5uYW1lCQk9ICJiMjEwNS1wd20tcmVndWxhdG9yIiwKKwkub3BzCQk9ICZzdF9wd21fcmVndWxhdG9yX3ZvbHRhZ2Vfb3BzLAorCS50eXBlCQk9IFJFR1VMQVRPUl9WT0xUQUdFLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubl92b2x0YWdlcwk9IEFSUkFZX1NJWkUoYjIxMDVfZHV0eV9jeWNsZV90YWJsZSksCisJLnN1cHBseV9uYW1lICAgID0gInB3bSIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN0X3B3bV9yZWd1bGF0b3JfcGRhdGEgYjIxMDVfaW5mbyA9IHsKKwkuZGVzYwkJICA9ICZiMjEwNV9kZXNjLAorCS5kdXR5X2N5Y2xlX3RhYmxlID0gYjIxMDVfZHV0eV9jeWNsZV90YWJsZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN0X3B3bV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAic3QsYjIxMDUtcHdtLXJlZ3VsYXRvciIsIC5kYXRhID0gJmIyMTA1X2luZm8sIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN0X3B3bV9vZl9tYXRjaCk7CisKK3N0YXRpYyBpbnQgc3RfcHdtX3JlZ3VsYXRvcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzdF9wd21fcmVndWxhdG9yX2RhdGEgKmRydmRhdGE7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJlZ3VsYXRvcjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX21hdGNoOworCisJaWYgKCFucCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJEZXZpY2UgVHJlZSBub2RlIG1pc3NpbmdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkcnZkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZHJ2ZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZHJ2ZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvZl9tYXRjaCA9IG9mX21hdGNoX2RldmljZShzdF9wd21fb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOworCWlmICghb2ZfbWF0Y2gpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIG1hdGNoIG9mIGRldmljZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlkcnZkYXRhLT5wZGF0YSA9IG9mX21hdGNoLT5kYXRhOworCisJY29uZmlnLmluaXRfZGF0YSA9IG9mX2dldF9yZWd1bGF0b3JfaW5pdF9kYXRhKCZwZGV2LT5kZXYsIG5wKTsKKwlpZiAoIWNvbmZpZy5pbml0X2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJY29uZmlnLm9mX25vZGUgPSBucDsKKwljb25maWcuZGV2ID0gJnBkZXYtPmRldjsKKwljb25maWcuZHJpdmVyX2RhdGEgPSBkcnZkYXRhOworCisJZHJ2ZGF0YS0+cHdtID0gZGV2bV9wd21fZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIoZHJ2ZGF0YS0+cHdtKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IFBXTVxuIik7CisJCXJldHVybiBQVFJfRVJSKGRydmRhdGEtPnB3bSk7CisJfQorCisJcmVndWxhdG9yID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwKKwkJCQkJICAgIGRydmRhdGEtPnBkYXRhLT5kZXNjLCAmY29uZmlnKTsKKwlpZiAoSVNfRVJSKHJlZ3VsYXRvcikpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHJlZ3VsYXRvciAlc1xuIiwKKwkJCWRydmRhdGEtPnBkYXRhLT5kZXNjLT5uYW1lKTsKKwkJcmV0dXJuIFBUUl9FUlIocmVndWxhdG9yKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3RfcHdtX3JlZ3VsYXRvcl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJCT0gInN0LXB3bS1yZWd1bGF0b3IiLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihzdF9wd21fb2ZfbWF0Y2gpLAorCX0sCisJLnByb2JlID0gc3RfcHdtX3JlZ3VsYXRvcl9wcm9iZSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3RfcHdtX3JlZ3VsYXRvcl9kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJMZWUgSm9uZXMgPGxlZS5qb25lc0BsaW5hcm8ub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTVCBQV00gUmVndWxhdG9yIERyaXZlciIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzdF9wd20tcmVndWxhdG9yIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90aS1hYmItcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90aS1hYmItcmVndWxhdG9yLmMKaW5kZXggYjE4N2I2Yi4uYTJkYWJiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvdGktYWJiLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RpLWFiYi1yZWd1bGF0b3IuYwpAQCAtNTQsOCArNTQsOCBAQAogCiAvKioKICAqIHN0cnVjdCB0aV9hYmJfcmVnIC0gUmVnaXN0ZXIgZGVzY3JpcHRpb24gZm9yIEFCQiBibG9jawotICogQHNldHVwX3JlZzoJCQlzZXR1cCByZWdpc3RlciBvZmZzZXQgZnJvbSBiYXNlCi0gKiBAY29udHJvbF9yZWc6CQljb250cm9sIHJlZ2lzdGVyIG9mZnNldCBmcm9tIGJhc2UKKyAqIEBzZXR1cF9vZmY6CQkJc2V0dXAgcmVnaXN0ZXIgb2Zmc2V0IGZyb20gYmFzZQorICogQGNvbnRyb2xfb2ZmOgkJY29udHJvbCByZWdpc3RlciBvZmZzZXQgZnJvbSBiYXNlCiAgKiBAc3IyX3d0Y250X3ZhbHVlX21hc2s6CXNldHVwIHJlZ2lzdGVyLSBzcjJfd3RjbnRfdmFsdWUgbWFzawogICogQGZiYl9zZWxfbWFzazoJCXNldHVwIHJlZ2lzdGVyLSBGQkIgc2VsIG1hc2sKICAqIEByYmJfc2VsX21hc2s6CQlzZXR1cCByZWdpc3Rlci0gUkJCIHNlbCBtYXNrCkBAIC02NCw4ICs2NCw4IEBACiAgKiBAb3BwX3NlbF9tYXNrOgkJY29udHJvbCByZWdpc3RlciAtIG1hc2sgZm9yIG1vZGUgdG8gb3BlcmF0ZQogICovCiBzdHJ1Y3QgdGlfYWJiX3JlZyB7Ci0JdTMyIHNldHVwX3JlZzsKLQl1MzIgY29udHJvbF9yZWc7CisJdTMyIHNldHVwX29mZjsKKwl1MzIgY29udHJvbF9vZmY7CiAKIAkvKiBTZXR1cCByZWdpc3RlciBmaWVsZHMgKi8KIAl1MzIgc3IyX3d0Y250X3ZhbHVlX21hc2s7CkBAIC04Myw2ICs4Myw4IEBACiAgKiBAcmRlc2M6CQkJcmVndWxhdG9yIGRlc2NyaXB0b3IKICAqIEBjbGs6CQkJY2xvY2sodXN1YWxseSBzeXNjbGspIHN1cHBseWluZyBBQkIgYmxvY2sKICAqIEBiYXNlOgkJCWJhc2UgYWRkcmVzcyBvZiBBQkIgYmxvY2sKKyAqIEBzZXR1cF9yZWc6CQkJc2V0dXAgcmVnaXN0ZXIgb2YgQUJCIGJsb2NrCisgKiBAY29udHJvbF9yZWc6CQljb250cm9sIHJlZ2lzdGVyIG9mIEFCQiBibG9jawogICogQGludF9iYXNlOgkJCWludGVycnVwdCByZWdpc3RlciBiYXNlIGFkZHJlc3MKICAqIEBlZnVzZV9iYXNlOgkJCShvcHRpb25hbCkgZWZ1c2UgYmFzZSBhZGRyZXNzIGZvciBBQkIgbW9kZXMKICAqIEBsZG9fYmFzZToJCQkob3B0aW9uYWwpIExET1ZCQiB2c2V0IG92ZXJyaWRlIGJhc2UgYWRkcmVzcwpAQCAtOTksNiArMTAxLDggQEAKIAlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgcmRlc2M7CiAJc3RydWN0IGNsayAqY2xrOwogCXZvaWQgX19pb21lbSAqYmFzZTsKKwl2b2lkIF9faW9tZW0gKnNldHVwX3JlZzsKKwl2b2lkIF9faW9tZW0gKmNvbnRyb2xfcmVnOwogCXZvaWQgX19pb21lbSAqaW50X2Jhc2U7CiAJdm9pZCBfX2lvbWVtICplZnVzZV9iYXNlOwogCXZvaWQgX19pb21lbSAqbGRvX2Jhc2U7CkBAIC0xMTgsMjAgKzEyMiwxOCBAQAogICogdGlfYWJiX3JtdygpIC0gaGFuZHkgd3JhcHBlciB0byBzZXQgc3BlY2lmaWMgcmVnaXN0ZXIgYml0cwogICogQG1hc2s6CW1hc2sgZm9yIHJlZ2lzdGVyIGZpZWxkCiAgKiBAdmFsdWU6CXZhbHVlIHNoaWZ0ZWQgdG8gbWFzayBsb2NhdGlvbiBhbmQgd3JpdHRlbgotICogQG9mZnNldDoJb2Zmc2V0IG9mIHJlZ2lzdGVyCi0gKiBAYmFzZToJYmFzZSBhZGRyZXNzCisgKiBAcmVnOglyZWdpc3RlciBhZGRyZXNzCiAgKgogICogUmV0dXJuOiBmaW5hbCByZWdpc3RlciB2YWx1ZSAobWF5IGJlIHVudXNlZCkKICAqLwotc3RhdGljIGlubGluZSB1MzIgdGlfYWJiX3Jtdyh1MzIgbWFzaywgdTMyIHZhbHVlLCB1MzIgb2Zmc2V0LAotCQkJICAgICB2b2lkIF9faW9tZW0gKmJhc2UpCitzdGF0aWMgaW5saW5lIHUzMiB0aV9hYmJfcm13KHUzMiBtYXNrLCB1MzIgdmFsdWUsIHZvaWQgX19pb21lbSAqcmVnKQogewogCXUzMiB2YWw7CiAKLQl2YWwgPSByZWFkbChiYXNlICsgb2Zmc2V0KTsKKwl2YWwgPSByZWFkbChyZWcpOwogCXZhbCAmPSB+bWFzazsKIAl2YWwgfD0gKHZhbHVlIDw8IF9fZmZzKG1hc2spKSAmIG1hc2s7Ci0Jd3JpdGVsKHZhbCwgYmFzZSArIG9mZnNldCk7CisJd3JpdGVsKHZhbCwgcmVnKTsKIAogCXJldHVybiB2YWw7CiB9CkBAIC0yNjMsMjEgKzI2NSwxOSBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0JdGlfYWJiX3JtdyhyZWdzLT5mYmJfc2VsX21hc2sgfCByZWdzLT5yYmJfc2VsX21hc2ssIDAsIHJlZ3MtPnNldHVwX3JlZywKLQkJICAgYWJiLT5iYXNlKTsKKwl0aV9hYmJfcm13KHJlZ3MtPmZiYl9zZWxfbWFzayB8IHJlZ3MtPnJiYl9zZWxfbWFzaywgMCwgYWJiLT5zZXR1cF9yZWcpOwogCiAJc3dpdGNoIChpbmZvLT5vcHBfc2VsKSB7CiAJY2FzZSBUSV9BQkJfU0xPV19PUFA6Ci0JCXRpX2FiYl9ybXcocmVncy0+cmJiX3NlbF9tYXNrLCAxLCByZWdzLT5zZXR1cF9yZWcsIGFiYi0+YmFzZSk7CisJCXRpX2FiYl9ybXcocmVncy0+cmJiX3NlbF9tYXNrLCAxLCBhYmItPnNldHVwX3JlZyk7CiAJCWJyZWFrOwogCWNhc2UgVElfQUJCX0ZBU1RfT1BQOgotCQl0aV9hYmJfcm13KHJlZ3MtPmZiYl9zZWxfbWFzaywgMSwgcmVncy0+c2V0dXBfcmVnLCBhYmItPmJhc2UpOworCQl0aV9hYmJfcm13KHJlZ3MtPmZiYl9zZWxfbWFzaywgMSwgYWJiLT5zZXR1cF9yZWcpOwogCQlicmVhazsKIAl9CiAKIAkvKiBwcm9ncmFtIG5leHQgc3RhdGUgb2YgQUJCIGxkbyAqLwotCXRpX2FiYl9ybXcocmVncy0+b3BwX3NlbF9tYXNrLCBpbmZvLT5vcHBfc2VsLCByZWdzLT5jb250cm9sX3JlZywKLQkJICAgYWJiLT5iYXNlKTsKKwl0aV9hYmJfcm13KHJlZ3MtPm9wcF9zZWxfbWFzaywgaW5mby0+b3BwX3NlbCwgYWJiLT5jb250cm9sX3JlZyk7CiAKIAkvKgogCSAqIHByb2dyYW0gTERPIFZCQiB2c2V0IG92ZXJyaWRlIGlmIG5lZWRlZCBmb3IgIWJ5cGFzcyBtb2RlCkBAIC0yODgsNyArMjg4LDcgQEAKIAkJdGlfYWJiX3Byb2dyYW1fbGRvdmJiKGRldiwgYWJiLCBpbmZvKTsKIAogCS8qIEluaXRpYXRlIEFCQiBsZG8gY2hhbmdlICovCi0JdGlfYWJiX3JtdyhyZWdzLT5vcHBfY2hhbmdlX21hc2ssIDEsIHJlZ3MtPmNvbnRyb2xfcmVnLCBhYmItPmJhc2UpOworCXRpX2FiYl9ybXcocmVncy0+b3BwX2NoYW5nZV9tYXNrLCAxLCBhYmItPmNvbnRyb2xfcmVnKTsKIAogCS8qIFdhaXQgZm9yIEFCQiBMRE8gdG8gY29tcGxldGUgdHJhbnNpdGlvbiB0byBuZXcgQmlhcyBzZXR0aW5nICovCiAJcmV0ID0gdGlfYWJiX3dhaXRfdHhkb25lKGRldiwgYWJiKTsKQEAgLTQ5MCw4ICs0OTAsNyBAQAogCWRldl9kYmcoZGV2LCAiJXM6IENsa19yYXRlPSVsZCwgc3IyX2NudD0weCUwOHhcbiIsIF9fZnVuY19fLAogCQljbGtfZ2V0X3JhdGUoYWJiLT5jbGspLCBzcjJfd3RfY250X3ZhbCk7CiAKLQl0aV9hYmJfcm13KHJlZ3MtPnNyMl93dGNudF92YWx1ZV9tYXNrLCBzcjJfd3RfY250X3ZhbCwgcmVncy0+c2V0dXBfcmVnLAotCQkgICBhYmItPmJhc2UpOworCXRpX2FiYl9ybXcocmVncy0+c3IyX3d0Y250X3ZhbHVlX21hc2ssIHNyMl93dF9jbnRfdmFsLCBhYmItPnNldHVwX3JlZyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUwOCwzMiArNTA3LDI0IEBACiAJCQkgICAgIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICpyaW5pdF9kYXRhKQogewogCXN0cnVjdCB0aV9hYmJfaW5mbyAqaW5mbzsKLQljb25zdCBzdHJ1Y3QgcHJvcGVydHkgKnByb3A7Ci0JY29uc3QgX19iZTMyICphYmJfaW5mbzsKIAljb25zdCB1MzIgbnVtX3ZhbHVlcyA9IDY7CiAJY2hhciAqcG5hbWUgPSAidGksYWJiX2luZm8iOwotCXUzMiBudW1fZW50cmllcywgaTsKKwl1MzIgaTsKIAl1bnNpZ25lZCBpbnQgKnZvbHRfdGFibGU7Ci0JaW50IG1pbl91ViA9IElOVF9NQVgsIG1heF91ViA9IDA7CisJaW50IG51bV9lbnRyaWVzLCBtaW5fdVYgPSBJTlRfTUFYLCBtYXhfdVYgPSAwOwogCXN0cnVjdCByZWd1bGF0aW9uX2NvbnN0cmFpbnRzICpjID0gJnJpbml0X2RhdGEtPmNvbnN0cmFpbnRzOwogCi0JcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZGV2LT5vZl9ub2RlLCBwbmFtZSwgTlVMTCk7Ci0JaWYgKCFwcm9wKSB7Ci0JCWRldl9lcnIoZGV2LCAiTm8gJyVzJyBwcm9wZXJ0eT9cbiIsIHBuYW1lKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKCFwcm9wLT52YWx1ZSkgewotCQlkZXZfZXJyKGRldiwgIkVtcHR5ICclcycgcHJvcGVydHk/XG4iLCBwbmFtZSk7Ci0JCXJldHVybiAtRU5PREFUQTsKLQl9Ci0KIAkvKgogCSAqIEVhY2ggYWJiX2luZm8gaXMgYSBzZXQgb2Ygbi10dXBsZSwgd2hlcmUgbiBpcyBudW1fdmFsdWVzLCBjb25zaXN0aW5nCiAJICogb2Ygdm9sdGFnZSBhbmQgYSBzZXQgb2YgZGV0ZWN0aW9uIGxvZ2ljIGZvciBBQkIgaW5mb3JtYXRpb24gZm9yIHRoYXQKIAkgKiB2b2x0YWdlIHRvIGFwcGx5LgogCSAqLwotCW51bV9lbnRyaWVzID0gcHJvcC0+bGVuZ3RoIC8gc2l6ZW9mKHUzMik7CisJbnVtX2VudHJpZXMgPSBvZl9wcm9wZXJ0eV9jb3VudF91MzJfZWxlbXMoZGV2LT5vZl9ub2RlLCBwbmFtZSk7CisJaWYgKG51bV9lbnRyaWVzIDwgMCkgeworCQlkZXZfZXJyKGRldiwgIk5vICclcycgcHJvcGVydHk/XG4iLCBwbmFtZSk7CisJCXJldHVybiBudW1fZW50cmllczsKKwl9CisKIAlpZiAoIW51bV9lbnRyaWVzIHx8IChudW1fZW50cmllcyAlIG51bV92YWx1ZXMpKSB7CiAJCWRldl9lcnIoZGV2LCAiQWxsICclcycgbGlzdCBlbnRyaWVzIG5lZWQgJWQgdmFsc1xuIiwgcG5hbWUsCiAJCQludW1fdmFsdWVzKTsKQEAgLTU0MiwzOCArNTMzLDM4IEBACiAJbnVtX2VudHJpZXMgLz0gbnVtX3ZhbHVlczsKIAogCWluZm8gPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmluZm8pICogbnVtX2VudHJpZXMsIEdGUF9LRVJORUwpOwotCWlmICghaW5mbykgewotCQlkZXZfZXJyKGRldiwgIkNhbid0IGFsbG9jYXRlIGluZm8gdGFibGUgZm9yICclcycgcHJvcGVydHlcbiIsCi0JCQlwbmFtZSk7CisJaWYgKCFpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CisKIAlhYmItPmluZm8gPSBpbmZvOwogCiAJdm9sdF90YWJsZSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZih1bnNpZ25lZCBpbnQpICogbnVtX2VudHJpZXMsCiAJCQkJICBHRlBfS0VSTkVMKTsKLQlpZiAoIXZvbHRfdGFibGUpIHsKLQkJZGV2X2VycihkZXYsICJDYW4ndCBhbGxvY2F0ZSB2b2x0YWdlIHRhYmxlIGZvciAnJXMnIHByb3BlcnR5XG4iLAotCQkJcG5hbWUpOworCWlmICghdm9sdF90YWJsZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJYWJiLT5yZGVzYy5uX3ZvbHRhZ2VzID0gbnVtX2VudHJpZXM7CiAJYWJiLT5yZGVzYy52b2x0X3RhYmxlID0gdm9sdF90YWJsZTsKIAkvKiBXZSBkbyBub3Qga25vdyB3aGVyZSB0aGUgT1BQIHZvbHRhZ2UgaXMgYXQgdGhlIG1vbWVudCAqLwogCWFiYi0+Y3VycmVudF9pbmZvX2lkeCA9IC1FSU5WQUw7CiAKLQlhYmJfaW5mbyA9IHByb3AtPnZhbHVlOwogCWZvciAoaSA9IDA7IGkgPCBudW1fZW50cmllczsgaSsrLCBpbmZvKyssIHZvbHRfdGFibGUrKykgewogCQl1MzIgZWZ1c2Vfb2Zmc2V0LCByYmJfbWFzaywgZmJiX21hc2ssIHZzZXRfbWFzazsKIAkJdTMyIGVmdXNlX3ZhbDsKIAogCQkvKiBOT1RFOiBudW1fdmFsdWVzIHNob3VsZCBlcXVhbCB0byBlbnRyaWVzIHBpY2tlZCB1cCBoZXJlICovCi0JCSp2b2x0X3RhYmxlID0gYmUzMl90b19jcHVwKGFiYl9pbmZvKyspOwotCQlpbmZvLT5vcHBfc2VsID0gYmUzMl90b19jcHVwKGFiYl9pbmZvKyspOwotCQllZnVzZV9vZmZzZXQgPSBiZTMyX3RvX2NwdXAoYWJiX2luZm8rKyk7Ci0JCXJiYl9tYXNrID0gYmUzMl90b19jcHVwKGFiYl9pbmZvKyspOwotCQlmYmJfbWFzayA9IGJlMzJfdG9fY3B1cChhYmJfaW5mbysrKTsKLQkJdnNldF9tYXNrID0gYmUzMl90b19jcHVwKGFiYl9pbmZvKyspOworCQlvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChkZXYtPm9mX25vZGUsIHBuYW1lLCBpICogbnVtX3ZhbHVlcywKKwkJCQkJICAgdm9sdF90YWJsZSk7CisJCW9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KGRldi0+b2Zfbm9kZSwgcG5hbWUsCisJCQkJCSAgIGkgKiBudW1fdmFsdWVzICsgMSwgJmluZm8tPm9wcF9zZWwpOworCQlvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChkZXYtPm9mX25vZGUsIHBuYW1lLAorCQkJCQkgICBpICogbnVtX3ZhbHVlcyArIDIsICZlZnVzZV9vZmZzZXQpOworCQlvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChkZXYtPm9mX25vZGUsIHBuYW1lLAorCQkJCQkgICBpICogbnVtX3ZhbHVlcyArIDMsICZyYmJfbWFzayk7CisJCW9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KGRldi0+b2Zfbm9kZSwgcG5hbWUsCisJCQkJCSAgIGkgKiBudW1fdmFsdWVzICsgNCwgJmZiYl9tYXNrKTsKKwkJb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgoZGV2LT5vZl9ub2RlLCBwbmFtZSwKKwkJCQkJICAgaSAqIG51bV92YWx1ZXMgKyA1LCAmdnNldF9tYXNrKTsKIAogCQlkZXZfZGJnKGRldiwKIAkJCSJbJWRddj0lZCBBQkI9JWQgZWY9MHgleCByYmI9MHgleCBmYmI9MHgleCB2c2V0PTB4JXhcbiIsCkBAIC02NDgsOCArNjM5LDggQEAKIC8qIERlZmF1bHQgQUJCIGJsb2NrIG9mZnNldHMsIElGIHRoaXMgY2hhbmdlcyBpbiBmdXR1cmUsIGNyZWF0ZSBuZXcgb25lICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHRpX2FiYl9yZWcgYWJiX3JlZ3NfdjEgPSB7CiAJLyogV0FSTklORzogcmVnaXN0ZXJzIGFyZSB3cm9uZ2x5IGRvY3VtZW50ZWQgaW4gVFJNICovCi0JLnNldHVwX3JlZwkJPSAweDA0LAotCS5jb250cm9sX3JlZwkJPSAweDAwLAorCS5zZXR1cF9vZmYJCT0gMHgwNCwKKwkuY29udHJvbF9vZmYJCT0gMHgwMCwKIAogCS5zcjJfd3RjbnRfdmFsdWVfbWFzawk9ICgweGZmIDw8IDgpLAogCS5mYmJfc2VsX21hc2sJCT0gKDB4MDEgPDwgMiksCkBAIC02NjEsOCArNjUyLDggQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdGlfYWJiX3JlZyBhYmJfcmVnc192MiA9IHsKLQkuc2V0dXBfcmVnCQk9IDB4MDAsCi0JLmNvbnRyb2xfcmVnCQk9IDB4MDQsCisJLnNldHVwX29mZgkJPSAweDAwLAorCS5jb250cm9sX29mZgkJPSAweDA0LAogCiAJLnNyMl93dGNudF92YWx1ZV9tYXNrCT0gKDB4ZmYgPDwgOCksCiAJLmZiYl9zZWxfbWFzawkJPSAoMHgwMSA8PCAyKSwKQEAgLTY3Myw5ICs2NjQsMjAgQEAKIAkub3BwX3NlbF9tYXNrCQk9ICgweDAzIDw8IDApLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCB0aV9hYmJfcmVnIGFiYl9yZWdzX2dlbmVyaWMgPSB7CisJLnNyMl93dGNudF92YWx1ZV9tYXNrCT0gKDB4ZmYgPDwgOCksCisJLmZiYl9zZWxfbWFzawkJPSAoMHgwMSA8PCAyKSwKKwkucmJiX3NlbF9tYXNrCQk9ICgweDAxIDw8IDEpLAorCS5zcjJfZW5fbWFzawkJPSAoMHgwMSA8PCAwKSwKKworCS5vcHBfY2hhbmdlX21hc2sJPSAoMHgwMSA8PCAyKSwKKwkub3BwX3NlbF9tYXNrCQk9ICgweDAzIDw8IDApLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGlfYWJiX29mX21hdGNoW10gPSB7CiAJey5jb21wYXRpYmxlID0gInRpLGFiYi12MSIsIC5kYXRhID0gJmFiYl9yZWdzX3YxfSwKIAl7LmNvbXBhdGlibGUgPSAidGksYWJiLXYyIiwgLmRhdGEgPSAmYWJiX3JlZ3NfdjJ9LAorCXsuY29tcGF0aWJsZSA9ICJ0aSxhYmItdjMiLCAuZGF0YSA9ICZhYmJfcmVnc19nZW5lcmljfSwKIAl7IH0sCiB9OwogCkBAIC03MjIsMTEgKzcyNCwyOSBAQAogCWFiYi0+cmVncyA9IG1hdGNoLT5kYXRhOwogCiAJLyogTWFwIEFCQiByZXNvdXJjZXMgKi8KLQlwbmFtZSA9ICJiYXNlLWFkZHJlc3MiOwotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sIHBuYW1lKTsKLQlhYmItPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOwotCWlmIChJU19FUlIoYWJiLT5iYXNlKSkKLQkJcmV0dXJuIFBUUl9FUlIoYWJiLT5iYXNlKTsKKwlpZiAoYWJiLT5yZWdzLT5zZXR1cF9vZmYgfHwgYWJiLT5yZWdzLT5jb250cm9sX29mZikgeworCQlwbmFtZSA9ICJiYXNlLWFkZHJlc3MiOworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCBwbmFtZSk7CisJCWFiYi0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJCWlmIChJU19FUlIoYWJiLT5iYXNlKSkKKwkJCXJldHVybiBQVFJfRVJSKGFiYi0+YmFzZSk7CisKKwkJYWJiLT5zZXR1cF9yZWcgPSBhYmItPmJhc2UgKyBhYmItPnJlZ3MtPnNldHVwX29mZjsKKwkJYWJiLT5jb250cm9sX3JlZyA9IGFiYi0+YmFzZSArIGFiYi0+cmVncy0+Y29udHJvbF9vZmY7CisKKwl9IGVsc2UgeworCQlwbmFtZSA9ICJjb250cm9sLWFkZHJlc3MiOworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCBwbmFtZSk7CisJCWFiYi0+Y29udHJvbF9yZWcgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCQlpZiAoSVNfRVJSKGFiYi0+Y29udHJvbF9yZWcpKQorCQkJcmV0dXJuIFBUUl9FUlIoYWJiLT5jb250cm9sX3JlZyk7CisKKwkJcG5hbWUgPSAic2V0dXAtYWRkcmVzcyI7CisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sIHBuYW1lKTsKKwkJYWJiLT5zZXR1cF9yZWcgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCQlpZiAoSVNfRVJSKGFiYi0+c2V0dXBfcmVnKSkKKwkJCXJldHVybiBQVFJfRVJSKGFiYi0+c2V0dXBfcmVnKTsKKwl9CiAKIAlwbmFtZSA9ICJpbnQtYWRkcmVzcyI7CiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgcG5hbWUpOwpAQCAtODYwLDcgKzg4MCw3IEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcmRldik7CiAKIAkvKiBFbmFibGUgdGhlIGxkbyBpZiBub3QgYWxyZWFkeSBkb25lIGJ5IGJvb3Rsb2FkZXIgKi8KLQl0aV9hYmJfcm13KGFiYi0+cmVncy0+c3IyX2VuX21hc2ssIDEsIGFiYi0+cmVncy0+c2V0dXBfcmVnLCBhYmItPmJhc2UpOworCXRpX2FiYl9ybXcoYWJiLT5yZWdzLT5zcjJfZW5fbWFzaywgMSwgYWJiLT5zZXR1cF9yZWcpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM1MTYzMi1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczUxNjMyLXJlZ3VsYXRvci5jCmluZGV4IGIzNzY0ZjUuLmYzMWYyMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczUxNjMyLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczUxNjMyLXJlZ3VsYXRvci5jCkBAIC0yMjcsMTAgKzIyNyw4IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKIAogCXBkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghcGRhdGEpIHsKLQkJZGV2X2VycihkZXYsICJNZW1vcnkgYWxsb2MgZmFpbGVkIGZvciBwbGF0Zm9ybSBkYXRhXG4iKTsKKwlpZiAoIXBkYXRhKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlwZGF0YS0+cmVnX2luaXRfZGF0YSA9IG9mX2dldF9yZWd1bGF0b3JfaW5pdF9kYXRhKGRldiwgZGV2LT5vZl9ub2RlKTsKIAlpZiAoIXBkYXRhLT5yZWdfaW5pdF9kYXRhKSB7CkBAIC0yOTksMTAgKzI5Nyw4IEBACiAJfQogCiAJdHBzID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCp0cHMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRwcykgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJaWYgKCF0cHMpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXRwcy0+ZGV2ID0gJmNsaWVudC0+ZGV2OwogCXRwcy0+ZGVzYy5uYW1lID0gY2xpZW50LT5uYW1lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjIzNjAtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2MjM2MC1yZWd1bGF0b3IuYwppbmRleCBjM2ZhMTVhLi5hMTY3MjA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2MjM2MC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2MjM2MC1yZWd1bGF0b3IuYwpAQCAtMjk5LDEwICsyOTksOCBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CiAKIAlwZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkYXRhKSB7Ci0JCWRldl9lcnIoZGV2LCAiTWVtb3J5IGFsbG9jIGZhaWxlZCBmb3IgcGxhdGZvcm0gZGF0YVxuIik7CisJaWYgKCFwZGF0YSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJcGRhdGEtPnJlZ19pbml0X2RhdGEgPSBvZl9nZXRfcmVndWxhdG9yX2luaXRfZGF0YShkZXYsIGRldi0+b2Zfbm9kZSk7CiAJaWYgKCFwZGF0YS0+cmVnX2luaXRfZGF0YSkgewpAQCAtMzc3LDExICszNzUsOCBAQAogCX0KIAogCXRwcyA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqdHBzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0cHMpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcygpOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIsCi0JCQkJCQlfX2Z1bmNfXyk7CisJaWYgKCF0cHMpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXRwcy0+ZW5fZGlzY2hhcmdlID0gcGRhdGEtPmVuX2Rpc2NoYXJnZTsKIAl0cHMtPmVuX2ludGVybmFsX3B1bGxkbiA9IHBkYXRhLT5lbl9pbnRlcm5hbF9wdWxsZG47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA3eC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MDd4LXJlZ3VsYXRvci5jCmluZGV4IDE2MmEwZmEuLjk4ZTY2Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MDd4LXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MDd4LXJlZ3VsYXRvci5jCkBAIC0zNTksNyArMzU5LDYgQEAKIAkubWFwX3ZvbHRhZ2UgPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfYXNjZW5kLAogfTsKIAotI2lmZGVmIENPTkZJR19PRgogc3RhdGljIHN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggdHBzNjUwN3hfbWF0Y2hlc1tdID0gewogCXsgLm5hbWUgPSAiVkRDREMxIn0sCiAJeyAubmFtZSA9ICJWRENEQzIifSwKQEAgLTM4MSwxMiArMzgwLDEwIEBACiAKIAl0cHNfYm9hcmQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCp0cHNfYm9hcmQpLAogCQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXRwc19ib2FyZCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsdXJlIHRvIGFsbG9jIHBkYXRhIGZvciByZWd1bGF0b3JzLlxuIik7CisJaWYgKCF0cHNfYm9hcmQpCiAJCXJldHVybiBOVUxMOwotCX0KIAotCXJlZ3VsYXRvcnMgPSBvZl9maW5kX25vZGVfYnlfbmFtZShucCwgInJlZ3VsYXRvcnMiKTsKKwlyZWd1bGF0b3JzID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobnAsICJyZWd1bGF0b3JzIik7CiAJaWYgKCFyZWd1bGF0b3JzKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlZ3VsYXRvciBub2RlIG5vdCBmb3VuZFxuIik7CiAJCXJldHVybiBOVUxMOwpAQCAtMzk2LDYgKzM5Myw3IEBACiAJbWF0Y2hlcyA9IHRwczY1MDd4X21hdGNoZXM7CiAKIAlyZXQgPSBvZl9yZWd1bGF0b3JfbWF0Y2goJnBkZXYtPmRldiwgcmVndWxhdG9ycywgbWF0Y2hlcywgY291bnQpOworCW9mX25vZGVfcHV0KHJlZ3VsYXRvcnMpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkVycm9yIHBhcnNpbmcgcmVndWxhdG9yIGluaXQgZGF0YTogJWRcbiIsCiAJCQlyZXQpOwpAQCAtNDA2LDEwICs0MDQsOCBAQAogCiAJcmVnX2RhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgKHNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSkKIAkJCQkJKiBUUFM2NTA3WF9OVU1fUkVHVUxBVE9SKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZWdfZGF0YSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsdXJlIHRvIGFsbG9jIGluaXQgZGF0YSBmb3IgcmVndWxhdG9ycy5cbiIpOworCWlmICghcmVnX2RhdGEpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCXRwc19ib2FyZC0+dHBzNjUwN3hfcG1pY19pbml0X2RhdGEgPSByZWdfZGF0YTsKIApAQCAtNDI0LDE1ICs0MjAsNyBAQAogCiAJcmV0dXJuIHRwc19ib2FyZDsKIH0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB0cHM2NTA3eF9ib2FyZCAqdHBzNjUwN3hfcGFyc2VfZHRfcmVnX2RhdGEoCi0JCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkJc3RydWN0IG9mX3JlZ3VsYXRvcl9tYXRjaCAqKnRwczY1MDd4X3JlZ19tYXRjaGVzKQotewotCSp0cHM2NTA3eF9yZWdfbWF0Y2hlcyA9IE5VTEw7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYKKwogc3RhdGljIGludCB0cHM2NTA3eF9wbWljX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHRwczY1MDd4X2RldiAqdHBzNjUwN3hfZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwpAQCAtNDUzLDkgKzQ0MSwxMCBAQAogCSAqLwogCiAJdHBzX2JvYXJkID0gZGV2X2dldF9wbGF0ZGF0YSh0cHM2NTA3eF9kZXYtPmRldik7Ci0JaWYgKCF0cHNfYm9hcmQgJiYgdHBzNjUwN3hfZGV2LT5kZXYtPm9mX25vZGUpCisJaWYgKElTX0VOQUJMRUQoQ09ORklHX09GKSAmJiAhdHBzX2JvYXJkICYmCisJCXRwczY1MDd4X2Rldi0+ZGV2LT5vZl9ub2RlKQogCQl0cHNfYm9hcmQgPSB0cHM2NTA3eF9wYXJzZV9kdF9yZWdfZGF0YShwZGV2LAotCQkJCQkJJnRwczY1MDd4X3JlZ19tYXRjaGVzKTsKKwkJCQkmdHBzNjUwN3hfcmVnX21hdGNoZXMpOwogCWlmICghdHBzX2JvYXJkKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNDgxLDcgKzQ3MCw3IEBACiAJCXRwcy0+aW5mb1tpXSA9IGluZm87CiAJCWlmIChpbml0X2RhdGEtPmRyaXZlcl9kYXRhKSB7CiAJCQlzdHJ1Y3QgdHBzNjUwN3hfcmVnX3BsYXRmb3JtX2RhdGEgKmRhdGEgPQotCQkJCQkJCWluaXRfZGF0YS0+ZHJpdmVyX2RhdGE7CisJCQkJCWluaXRfZGF0YS0+ZHJpdmVyX2RhdGE7CiAJCQl0cHMtPmluZm9baV0tPmRlZmRjZGNfZGVmYXVsdCA9IGRhdGEtPmRlZmRjZGNfZGVmYXVsdDsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA5MC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MDkwLXJlZ3VsYXRvci5jCmluZGV4IDY3NmY3NTUuLjJlOTJlZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MDkwLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MDkwLXJlZ3VsYXRvci5jCkBAIC0xNjgsMTcgKzE2OCwxMyBAQAogCiAJdHBzNjUwOTBfcGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCp0cHM2NTA5MF9wZGF0YSksCiAJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0cHM2NTA5MF9wZGF0YSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNZW1vcnkgYWxsb2MgZm9yIHRwczY1MDkwX3BkYXRhIGZhaWxlZFxuIik7CisJaWYgKCF0cHM2NTA5MF9wZGF0YSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JfQogCiAJcmVnX3BkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIFRQUzY1MDkwX1JFR1VMQVRPUl9NQVggKgogCQkJCXNpemVvZigqcmVnX3BkYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZWdfcGRhdGEpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWVtb3J5IGFsbG9jIGZvciByZWdfcGRhdGEgZmFpbGVkXG4iKTsKKwlpZiAoIXJlZ19wZGF0YSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JfQogCiAJcmVndWxhdG9ycyA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAicmVndWxhdG9ycyIpOwogCWlmICghcmVndWxhdG9ycykgewpAQCAtMTg4LDYgKzE4NCw3IEBACiAKIAlyZXQgPSBvZl9yZWd1bGF0b3JfbWF0Y2goJnBkZXYtPmRldiwgcmVndWxhdG9ycywgdHBzNjUwOTBfbWF0Y2hlcywKIAkJCUFSUkFZX1NJWkUodHBzNjUwOTBfbWF0Y2hlcykpOworCW9mX25vZGVfcHV0KHJlZ3VsYXRvcnMpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCSJFcnJvciBwYXJzaW5nIHJlZ3VsYXRvciBpbml0IGRhdGE6ICVkXG4iLCByZXQpOwpAQCAtMjUyLDEwICsyNDksOCBAQAogCiAJcG1pYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBUUFM2NTA5MF9SRUdVTEFUT1JfTUFYICogc2l6ZW9mKCpwbWljKSwKIAkJCUdGUF9LRVJORUwpOwotCWlmICghcG1pYykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtZW0gYWxsb2MgZm9yIHBtaWMgZmFpbGVkXG4iKTsKKwlpZiAoIXBtaWMpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWZvciAobnVtID0gMDsgbnVtIDwgVFBTNjUwOTBfUkVHVUxBVE9SX01BWDsgbnVtKyspIHsKIAkJdHBzX3BkYXRhID0gdHBzNjUwOTBfcGRhdGEtPnJlZ19wZGF0YVtudW1dOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUyMTctcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTIxNy1yZWd1bGF0b3IuYwppbmRleCA5ZWExYmYyLi4xMGI3OGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTIxNy1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTIxNy1yZWd1bGF0b3IuYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpyZWdzOwogCWludCBpLCBjb3VudDsKIAotCXJlZ3MgPSBvZl9maW5kX25vZGVfYnlfbmFtZShub2RlLCAicmVndWxhdG9ycyIpOworCXJlZ3MgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShub2RlLCAicmVndWxhdG9ycyIpOwogCWlmICghcmVncykKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTIwMiw3ICsyMDIsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWlmICghcmVnX21hdGNoZXNbaV0uaW5pdF9kYXRhIHx8ICFyZWdfbWF0Y2hlc1tpXS5vZl9ub2RlKQorCQlpZiAoIXJlZ19tYXRjaGVzW2ldLm9mX25vZGUpCiAJCQljb250aW51ZTsKIAogCQlwZGF0YS0+dHBzNjUyMTdfaW5pdF9kYXRhW2ldID0gcmVnX21hdGNoZXNbaV0uaW5pdF9kYXRhOwpAQCAtMjIyLDcgKzIyMiw2IEBACiB7CiAJc3RydWN0IHRwczY1MjE3ICp0cHMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHRwczY1MjE3X2JvYXJkICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEodHBzLT5kZXYpOwotCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICpyZWdfZGF0YTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07CiAJaW50IGk7CkBAIC0yNDMsMTkgKzI0Miw5IEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdHBzKTsKIAogCWZvciAoaSA9IDA7IGkgPCBUUFM2NTIxN19OVU1fUkVHVUxBVE9SOyBpKyspIHsKLQotCQlyZWdfZGF0YSA9IHBkYXRhLT50cHM2NTIxN19pbml0X2RhdGFbaV07Ci0KLQkJLyoKLQkJICogUmVndWxhdG9yIEFQSSBoYW5kbGVzIGVtcHR5IGNvbnN0cmFpbnRzIGJ1dCBub3QgTlVMTAotCQkgKiBjb25zdHJhaW50cwotCQkgKi8KLQkJaWYgKCFyZWdfZGF0YSkKLQkJCWNvbnRpbnVlOwotCiAJCS8qIFJlZ2lzdGVyIHRoZSByZWd1bGF0b3JzICovCiAJCWNvbmZpZy5kZXYgPSB0cHMtPmRldjsKLQkJY29uZmlnLmluaXRfZGF0YSA9IHJlZ19kYXRhOworCQljb25maWcuaW5pdF9kYXRhID0gcGRhdGEtPnRwczY1MjE3X2luaXRfZGF0YVtpXTsKIAkJY29uZmlnLmRyaXZlcl9kYXRhID0gdHBzOwogCQljb25maWcucmVnbWFwID0gdHBzLT5yZWdtYXA7CiAJCWlmICh0cHMtPmRldi0+b2Zfbm9kZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MjE4LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUyMTgtcmVndWxhdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VjNzJmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MjE4LXJlZ3VsYXRvci5jCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogdHBzNjUyMTgtcmVndWxhdG9yLmMKKyAqCisgKiBSZWd1bGF0b3IgZHJpdmVyIGZvciBUUFM2NTIxOCBQTUlDCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkICJhcyBpcyIgV0lUSE9VVCBBTlkgV0FSUkFOVFkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3NlZCBvciBpbXBsaWVkOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL29mX3JlZ3VsYXRvci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC90cHM2NTIxOC5oPgorCitzdGF0aWMgdW5zaWduZWQgaW50IHRwczY1MjE4X3JhbXBfZGVsYXkgPSA0MDAwOworCitlbnVtIHRwczY1MjE4X3JlZ3VsYXRvcnMgeyBEQ0RDMSwgRENEQzIsIERDREMzLCBEQ0RDNCwgRENEQzUsIERDREM2LCBMRE8xIH07CisKKyNkZWZpbmUgVFBTNjUyMThfUkVHVUxBVE9SKF9uYW1lLCBfaWQsIF9vcHMsIF9uLCBfdnIsIF92bSwgX2VyLCBfZW0sIF90LCBcCisJCQkgICAgX2xyLCBfbmxyKQkJCQlcCisJewkJCQkJCQlcCisJCS5uYW1lCQkJPSBfbmFtZSwJCVwKKwkJLmlkCQkJPSBfaWQsCQkJXAorCQkub3BzCQkJPSAmX29wcywJCVwKKwkJLm5fdm9sdGFnZXMJCT0gX24sCQkJXAorCQkudHlwZQkJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCVwKKwkJLm93bmVyCQkJPSBUSElTX01PRFVMRSwJCVwKKwkJLnZzZWxfcmVnCQk9IF92ciwJCQlcCisJCS52c2VsX21hc2sJCT0gX3ZtLAkJCVwKKwkJLmVuYWJsZV9yZWcJCT0gX2VyLAkJCVwKKwkJLmVuYWJsZV9tYXNrCQk9IF9lbSwJCQlcCisJCS52b2x0X3RhYmxlCQk9IF90LAkJCVwKKwkJLmxpbmVhcl9yYW5nZXMJCT0gX2xyLAkJCVwKKwkJLm5fbGluZWFyX3Jhbmdlcwk9IF9ubHIsCQkJXAorCX0JCQkJCQkJXAorCisjZGVmaW5lIFRQUzY1MjE4X0lORk8oX2lkLCBfbm0sIF9taW4sIF9tYXgpCVwKKwl7CQkJCQkJXAorCQkuaWQJCT0gX2lkLAkJCVwKKwkJLm5hbWUJCT0gX25tLAkJCVwKKwkJLm1pbl91VgkJPSBfbWluLAkJCVwKKwkJLm1heF91VgkJPSBfbWF4LAkJCVwKKwl9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2xpbmVhcl9yYW5nZSBkY2RjMV9kY2RjMl9yYW5nZXNbXSA9IHsKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDg1MDAwMCwgMHgwLCAweDMyLCAxMDAwMCksCisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgxMzc1MDAwLCAweDMzLCAweDNmLCAyNTAwMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9saW5lYXJfcmFuZ2UgbGRvMV9kY2RjM19yYW5nZXNbXSA9IHsKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDkwMDAwMCwgMHgwLCAweDFhLCAyNTAwMCksCisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgxNjAwMDAwLCAweDFiLCAweDNmLCA1MDAwMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9saW5lYXJfcmFuZ2UgZGNkYzRfcmFuZ2VzW10gPSB7CisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgxMTc1MDAwLCAweDAsIDB4ZiwgMjUwMDApLAorCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTU1MDAwMCwgMHgxMCwgMHgzNCwgNTAwMDApLAorfTsKKworc3RhdGljIHN0cnVjdCB0cHNfaW5mbyB0cHM2NTIxOF9wbWljX3JlZ3NbXSA9IHsKKwlUUFM2NTIxOF9JTkZPKDAsICJEQ0RDMSIsIDg1MDAwMCwgMTY3NTAwKSwKKwlUUFM2NTIxOF9JTkZPKDEsICJEQ0RDMiIsIDg1MDAwMCwgMTY3NTAwMCksCisJVFBTNjUyMThfSU5GTygyLCAiRENEQzMiLCA5MDAwMDAsIDM0MDAwMDApLAorCVRQUzY1MjE4X0lORk8oMywgIkRDREM0IiwgMTE3NTAwMCwgMzQwMDAwMCksCisJVFBTNjUyMThfSU5GTyg0LCAiRENEQzUiLCAxMDAwMDAwLCAxMDAwMDAwKSwKKwlUUFM2NTIxOF9JTkZPKDUsICJEQ0RDNiIsIDE4MDAwMDAsIDE4MDAwMDApLAorCVRQUzY1MjE4X0lORk8oNiwgIkxETzEiLCA5MDAwMDAsIDM0MDAwMDApLAorfTsKKworI2RlZmluZSBUUFM2NTIxOF9PRl9NQVRDSChjb21wLCBsYWJlbCkgXAorCXsgXAorCQkuY29tcGF0aWJsZSA9IGNvbXAsIFwKKwkJLmRhdGEgPSAmbGFiZWwsIFwKKwl9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRwczY1MjE4X29mX21hdGNoW10gPSB7CisJVFBTNjUyMThfT0ZfTUFUQ0goInRpLHRwczY1MjE4LWRjZGMxIiwgdHBzNjUyMThfcG1pY19yZWdzW0RDREMxXSksCisJVFBTNjUyMThfT0ZfTUFUQ0goInRpLHRwczY1MjE4LWRjZGMyIiwgdHBzNjUyMThfcG1pY19yZWdzW0RDREMyXSksCisJVFBTNjUyMThfT0ZfTUFUQ0goInRpLHRwczY1MjE4LWRjZGMzIiwgdHBzNjUyMThfcG1pY19yZWdzW0RDREMzXSksCisJVFBTNjUyMThfT0ZfTUFUQ0goInRpLHRwczY1MjE4LWRjZGM0IiwgdHBzNjUyMThfcG1pY19yZWdzW0RDREM0XSksCisJVFBTNjUyMThfT0ZfTUFUQ0goInRpLHRwczY1MjE4LWRjZGM1IiwgdHBzNjUyMThfcG1pY19yZWdzW0RDREM1XSksCisJVFBTNjUyMThfT0ZfTUFUQ0goInRpLHRwczY1MjE4LWRjZGM2IiwgdHBzNjUyMThfcG1pY19yZWdzW0RDREM2XSksCisJVFBTNjUyMThfT0ZfTUFUQ0goInRpLHRwczY1MjE4LWxkbzEiLCB0cHM2NTIxOF9wbWljX3JlZ3NbTERPMV0pLAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRwczY1MjE4X29mX21hdGNoKTsKKworc3RhdGljIGludCB0cHM2NTIxOF9wbWljX3NldF92b2x0YWdlX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LAorCQkJCQkgdW5zaWduZWQgc2VsZWN0b3IpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdHBzNjUyMTggKnRwcyA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgcmlkID0gcmRldl9nZXRfaWQoZGV2KTsKKworCS8qIFNldCB0aGUgdm9sdGFnZSBiYXNlZCBvbiB2c2VsIHZhbHVlIGFuZCB3cml0ZSBwcm90ZWN0IGxldmVsIGlzIDIgKi8KKwlyZXQgPSB0cHM2NTIxOF9zZXRfYml0cyh0cHMsIGRldi0+ZGVzYy0+dnNlbF9yZWcsIGRldi0+ZGVzYy0+dnNlbF9tYXNrLAorCQkJCXNlbGVjdG9yLCBUUFM2NTIxOF9QUk9URUNUX0wxKTsKKworCS8qIFNldCBHTyBiaXQgZm9yIERDREMxLzIgdG8gaW5pdGlhdGUgdm9sdGFnZSB0cmFuc2lzdGlvbiAqLworCXN3aXRjaCAocmlkKSB7CisJY2FzZSBUUFM2NTIxOF9EQ0RDXzE6CisJY2FzZSBUUFM2NTIxOF9EQ0RDXzI6CisJCXJldCA9IHRwczY1MjE4X3NldF9iaXRzKHRwcywgVFBTNjUyMThfUkVHX0NPTlRSTF9TTEVXX1JBVEUsCisJCQkJCVRQUzY1MjE4X1NMRVdfUkFURV9HTywKKwkJCQkJVFBTNjUyMThfU0xFV19SQVRFX0dPLAorCQkJCQlUUFM2NTIxOF9QUk9URUNUX0wxKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0cHM2NTIxOF9wbWljX2VuYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2KQoreworCXN0cnVjdCB0cHM2NTIxOCAqdHBzID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGludCByaWQgPSByZGV2X2dldF9pZChkZXYpOworCisJaWYgKHJpZCA8IFRQUzY1MjE4X0RDRENfMSB8fCByaWQgPiBUUFM2NTIxOF9MRE9fMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBFbmFibGUgdGhlIHJlZ3VsYXRvciBhbmQgcGFzc3dvcmQgcHJvdGVjdGlvbiBpcyBsZXZlbCAxICovCisJcmV0dXJuIHRwczY1MjE4X3NldF9iaXRzKHRwcywgZGV2LT5kZXNjLT5lbmFibGVfcmVnLAorCQkJCSBkZXYtPmRlc2MtPmVuYWJsZV9tYXNrLCBkZXYtPmRlc2MtPmVuYWJsZV9tYXNrLAorCQkJCSBUUFM2NTIxOF9QUk9URUNUX0wxKTsKK30KKworc3RhdGljIGludCB0cHM2NTIxOF9wbWljX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdHBzNjUyMTggKnRwcyA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgcmlkID0gcmRldl9nZXRfaWQoZGV2KTsKKworCWlmIChyaWQgPCBUUFM2NTIxOF9EQ0RDXzEgfHwgcmlkID4gVFBTNjUyMThfTERPXzEpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRGlzYWJsZSB0aGUgcmVndWxhdG9yIGFuZCBwYXNzd29yZCBwcm90ZWN0aW9uIGlzIGxldmVsIDEgKi8KKwlyZXR1cm4gdHBzNjUyMThfY2xlYXJfYml0cyh0cHMsIGRldi0+ZGVzYy0+ZW5hYmxlX3JlZywKKwkJCQkgICBkZXYtPmRlc2MtPmVuYWJsZV9tYXNrLCBUUFM2NTIxOF9QUk9URUNUX0wxKTsKK30KKworc3RhdGljIGludCB0cHM2NTIxOF9zZXRfdm9sdGFnZV90aW1lX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKKwl1bnNpZ25lZCBpbnQgb2xkX3NlbGVjdG9yLCB1bnNpZ25lZCBpbnQgbmV3X3NlbGVjdG9yKQoreworCWludCBvbGRfdXYsIG5ld191djsKKworCW9sZF91diA9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2VfbGluZWFyX3JhbmdlKHJkZXYsIG9sZF9zZWxlY3Rvcik7CisJaWYgKG9sZF91diA8IDApCisJCXJldHVybiBvbGRfdXY7CisKKwluZXdfdXYgPSByZWd1bGF0b3JfbGlzdF92b2x0YWdlX2xpbmVhcl9yYW5nZShyZGV2LCBuZXdfc2VsZWN0b3IpOworCWlmIChuZXdfdXYgPCAwKQorCQlyZXR1cm4gbmV3X3V2OworCisJcmV0dXJuIERJVl9ST1VORF9VUChhYnMob2xkX3V2IC0gbmV3X3V2KSwgdHBzNjUyMThfcmFtcF9kZWxheSk7Cit9CisKKy8qIE9wZXJhdGlvbnMgcGVybWl0dGVkIG9uIERDREMxLCBEQ0RDMiAqLworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHRwczY1MjE4X2RjZGMxMl9vcHMgPSB7CisJLmlzX2VuYWJsZWQJCT0gcmVndWxhdG9yX2lzX2VuYWJsZWRfcmVnbWFwLAorCS5lbmFibGUJCQk9IHRwczY1MjE4X3BtaWNfZW5hYmxlLAorCS5kaXNhYmxlCQk9IHRwczY1MjE4X3BtaWNfZGlzYWJsZSwKKwkuZ2V0X3ZvbHRhZ2Vfc2VsCT0gcmVndWxhdG9yX2dldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLnNldF92b2x0YWdlX3NlbAk9IHRwczY1MjE4X3BtaWNfc2V0X3ZvbHRhZ2Vfc2VsLAorCS5saXN0X3ZvbHRhZ2UJCT0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXJfcmFuZ2UsCisJLm1hcF92b2x0YWdlCQk9IHJlZ3VsYXRvcl9tYXBfdm9sdGFnZV9saW5lYXJfcmFuZ2UsCisJLnNldF92b2x0YWdlX3RpbWVfc2VsCT0gdHBzNjUyMThfc2V0X3ZvbHRhZ2VfdGltZV9zZWwsCit9OworCisvKiBPcGVyYXRpb25zIHBlcm1pdHRlZCBvbiBEQ0RDMywgRENEQzQgYW5kIExETzEgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyB0cHM2NTIxOF9sZG8xX2RjZGMzNF9vcHMgPSB7CisJLmlzX2VuYWJsZWQJCT0gcmVndWxhdG9yX2lzX2VuYWJsZWRfcmVnbWFwLAorCS5lbmFibGUJCQk9IHRwczY1MjE4X3BtaWNfZW5hYmxlLAorCS5kaXNhYmxlCQk9IHRwczY1MjE4X3BtaWNfZGlzYWJsZSwKKwkuZ2V0X3ZvbHRhZ2Vfc2VsCT0gcmVndWxhdG9yX2dldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLnNldF92b2x0YWdlX3NlbAk9IHRwczY1MjE4X3BtaWNfc2V0X3ZvbHRhZ2Vfc2VsLAorCS5saXN0X3ZvbHRhZ2UJCT0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXJfcmFuZ2UsCisJLm1hcF92b2x0YWdlCQk9IHJlZ3VsYXRvcl9tYXBfdm9sdGFnZV9saW5lYXJfcmFuZ2UsCit9OworCisvKiBPcGVyYXRpb25zIHBlcm1pdHRlZCBvbiBEQ0RDNSwgRENEQzYgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyB0cHM2NTIxOF9kY2RjNTZfcG1pY19vcHMgPSB7CisJLmlzX2VuYWJsZWQJCT0gcmVndWxhdG9yX2lzX2VuYWJsZWRfcmVnbWFwLAorCS5lbmFibGUJCQk9IHRwczY1MjE4X3BtaWNfZW5hYmxlLAorCS5kaXNhYmxlCQk9IHRwczY1MjE4X3BtaWNfZGlzYWJsZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgcmVndWxhdG9yc1tdID0geworCVRQUzY1MjE4X1JFR1VMQVRPUigiRENEQzEiLCBUUFM2NTIxOF9EQ0RDXzEsIHRwczY1MjE4X2RjZGMxMl9vcHMsIDY0LAorCQkJICAgVFBTNjUyMThfUkVHX0NPTlRST0xfRENEQzEsCisJCQkgICBUUFM2NTIxOF9DT05UUk9MX0RDREMxX01BU0ssCisJCQkgICBUUFM2NTIxOF9SRUdfRU5BQkxFMSwgVFBTNjUyMThfRU5BQkxFMV9EQzFfRU4sIE5VTEwsCisJCQkgICBkY2RjMV9kY2RjMl9yYW5nZXMsIDIpLAorCVRQUzY1MjE4X1JFR1VMQVRPUigiRENEQzIiLCBUUFM2NTIxOF9EQ0RDXzIsIHRwczY1MjE4X2RjZGMxMl9vcHMsIDY0LAorCQkJICAgVFBTNjUyMThfUkVHX0NPTlRST0xfRENEQzIsCisJCQkgICBUUFM2NTIxOF9DT05UUk9MX0RDREMyX01BU0ssCisJCQkgICBUUFM2NTIxOF9SRUdfRU5BQkxFMSwgVFBTNjUyMThfRU5BQkxFMV9EQzJfRU4sIE5VTEwsCisJCQkgICBkY2RjMV9kY2RjMl9yYW5nZXMsIDIpLAorCVRQUzY1MjE4X1JFR1VMQVRPUigiRENEQzMiLCBUUFM2NTIxOF9EQ0RDXzMsIHRwczY1MjE4X2xkbzFfZGNkYzM0X29wcywKKwkJCSAgIDY0LCBUUFM2NTIxOF9SRUdfQ09OVFJPTF9EQ0RDMywKKwkJCSAgIFRQUzY1MjE4X0NPTlRST0xfRENEQzNfTUFTSywgVFBTNjUyMThfUkVHX0VOQUJMRTEsCisJCQkgICBUUFM2NTIxOF9FTkFCTEUxX0RDM19FTiwgTlVMTCwKKwkJCSAgIGxkbzFfZGNkYzNfcmFuZ2VzLCAyKSwKKwlUUFM2NTIxOF9SRUdVTEFUT1IoIkRDREM0IiwgVFBTNjUyMThfRENEQ180LCB0cHM2NTIxOF9sZG8xX2RjZGMzNF9vcHMsCisJCQkgICA1MywgVFBTNjUyMThfUkVHX0NPTlRST0xfRENEQzQsCisJCQkgICBUUFM2NTIxOF9DT05UUk9MX0RDREM0X01BU0ssCisJCQkgICBUUFM2NTIxOF9SRUdfRU5BQkxFMSwgVFBTNjUyMThfRU5BQkxFMV9EQzRfRU4sIE5VTEwsCisJCQkgICBkY2RjNF9yYW5nZXMsIDIpLAorCVRQUzY1MjE4X1JFR1VMQVRPUigiRENEQzUiLCBUUFM2NTIxOF9EQ0RDXzUsIHRwczY1MjE4X2RjZGM1Nl9wbWljX29wcywKKwkJCSAgIDEsIC0xLCAtMSwgVFBTNjUyMThfUkVHX0VOQUJMRTEsCisJCQkgICBUUFM2NTIxOF9FTkFCTEUxX0RDNV9FTiwgTlVMTCwgTlVMTCwgMCksCisJVFBTNjUyMThfUkVHVUxBVE9SKCJEQ0RDNiIsIFRQUzY1MjE4X0RDRENfNiwgdHBzNjUyMThfZGNkYzU2X3BtaWNfb3BzLAorCQkJICAgMSwgLTEsIC0xLCBUUFM2NTIxOF9SRUdfRU5BQkxFMSwKKwkJCSAgIFRQUzY1MjE4X0VOQUJMRTFfREM2X0VOLCBOVUxMLCBOVUxMLCAwKSwKKwlUUFM2NTIxOF9SRUdVTEFUT1IoIkxETzEiLCBUUFM2NTIxOF9MRE9fMSwgdHBzNjUyMThfbGRvMV9kY2RjMzRfb3BzLCA2NCwKKwkJCSAgIFRQUzY1MjE4X1JFR19DT05UUk9MX0RDREM0LAorCQkJICAgVFBTNjUyMThfQ09OVFJPTF9MRE8xX01BU0ssIFRQUzY1MjE4X1JFR19FTkFCTEUyLAorCQkJICAgVFBTNjUyMThfRU5BQkxFMl9MRE8xX0VOLCBOVUxMLCBsZG8xX2RjZGMzX3JhbmdlcywKKwkJCSAgIDIpLAorfTsKKworc3RhdGljIGludCB0cHM2NTIxOF9yZWd1bGF0b3JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdHBzNjUyMTggKnRwcyA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqaW5pdF9kYXRhOworCWNvbnN0IHN0cnVjdCB0cHNfaW5mbwkqdGVtcGxhdGU7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZAkqbWF0Y2g7CisJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OworCWludCBpZDsKKworCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKHRwczY1MjE4X29mX21hdGNoLCAmcGRldi0+ZGV2KTsKKwlpZiAoIW1hdGNoKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXRlbXBsYXRlID0gbWF0Y2gtPmRhdGE7CisJaWQgPSB0ZW1wbGF0ZS0+aWQ7CisJaW5pdF9kYXRhID0gb2ZfZ2V0X3JlZ3VsYXRvcl9pbml0X2RhdGEoJnBkZXYtPmRldiwgcGRldi0+ZGV2Lm9mX25vZGUpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdHBzKTsKKworCXRwcy0+aW5mb1tpZF0gPSAmdHBzNjUyMThfcG1pY19yZWdzW2lkXTsKKwljb25maWcuZGV2ID0gJnBkZXYtPmRldjsKKwljb25maWcuaW5pdF9kYXRhID0gaW5pdF9kYXRhOworCWNvbmZpZy5kcml2ZXJfZGF0YSA9IHRwczsKKwljb25maWcucmVnbWFwID0gdHBzLT5yZWdtYXA7CisKKwlyZGV2ID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJnJlZ3VsYXRvcnNbaWRdLCAmY29uZmlnKTsKKwlpZiAoSVNfRVJSKHJkZXYpKSB7CisJCWRldl9lcnIodHBzLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgJXMgcmVndWxhdG9yXG4iLAorCQkJcGRldi0+bmFtZSk7CisJCXJldHVybiBQVFJfRVJSKHJkZXYpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0cHM2NTIxOF9yZWd1bGF0b3JfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInRwczY1MjE4LXBtaWMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gdHBzNjUyMThfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSB0cHM2NTIxOF9yZWd1bGF0b3JfcHJvYmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHRwczY1MjE4X3JlZ3VsYXRvcl9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJKIEtlZXJ0aHkgPGota2VlcnRoeUB0aS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRQUzY1MjE4IHZvbHRhZ2UgcmVndWxhdG9yIGRyaXZlciIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp0cHM2NTIxOC1wbWljIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTI0eC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MjR4LXJlZ3VsYXRvci5jCmluZGV4IDlmNmJmZGEuLjViNDk0ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MjR4LXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MjR4LXJlZ3VsYXRvci5jCkBAIC01OTMsMTAgKzU5Myw5IEBACiAJfQogCiAJaHcgPSBkZXZtX2t6YWxsb2MoJnNwaS0+ZGV2LCBzaXplb2Yoc3RydWN0IHRwczY1MjR4KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFodykgewotCQlkZXZfZXJyKGRldiwgImNhbm5vdCBhbGxvY2F0ZSByZWd1bGF0b3IgcHJpdmF0ZSBkYXRhXG4iKTsKKwlpZiAoIWh3KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CisKIAlzcGlfc2V0X2RydmRhdGEoc3BpLCBodyk7CiAKIAltZW1zZXQoaHcsIDAsIHNpemVvZihzdHJ1Y3QgdHBzNjUyNHgpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1ODZ4LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjU4NngtcmVndWxhdG9yLmMKaW5kZXggMDQ4NWQ0Ny4uMzJmMzhhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjU4NngtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjU4NngtcmVndWxhdG9yLmMKQEAgLTM2MywxMCArMzYzLDggQEAKIAl9CiAKIAlwZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZGF0YSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNZW1vcnkgYWxsb2N0aW9uIGZhaWxlZFxuIik7CisJaWYgKCFwZGF0YSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CiAJCWludCBpZDsKQEAgLTM5OCw3ICszOTYsNyBAQAogewogCXN0cnVjdCB0cHM2NTg2eF9yZWd1bGF0b3IgKnJpID0gTlVMTDsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKipyZGV2OworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OwogCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICpyZWdfZGF0YTsKIAlzdHJ1Y3QgdHBzNjU4NnhfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IG9mX3JlZ3VsYXRvcl9tYXRjaCAqdHBzNjU4NnhfcmVnX21hdGNoZXMgPSBOVUxMOwpAQCAtNDE4LDEzICs0MTYsNiBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlyZGV2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIFRQUzY1ODZYX0lEX01BWF9SRUdVTEFUT1IgKgotCQkJCXNpemVvZigqcmRldiksIEdGUF9LRVJORUwpOwotCWlmICghcmRldikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNbWVtb3J5IGFsbG9jIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQogCXZlcnNpb24gPSB0cHM2NTg2eF9nZXRfdmVyc2lvbihwZGV2LT5kZXYucGFyZW50KTsKIAogCWZvciAoaWQgPSAwOyBpZCA8IFRQUzY1ODZYX0lEX01BWF9SRUdVTEFUT1I7ICsraWQpIHsKQEAgLTQ1MSwxMiArNDQyLDExIEBACiAJCWlmICh0cHM2NTg2eF9yZWdfbWF0Y2hlcykKIAkJCWNvbmZpZy5vZl9ub2RlID0gdHBzNjU4NnhfcmVnX21hdGNoZXNbaWRdLm9mX25vZGU7CiAKLQkJcmRldltpZF0gPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmcmktPmRlc2MsCi0JCQkJCQkgICAmY29uZmlnKTsKLQkJaWYgKElTX0VSUihyZGV2W2lkXSkpIHsKKwkJcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZyaS0+ZGVzYywgJmNvbmZpZyk7CisJCWlmIChJU19FUlIocmRldikpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciByZWd1bGF0b3IgJXNcbiIsCiAJCQkJCXJpLT5kZXNjLm5hbWUpOwotCQkJcmV0dXJuIFBUUl9FUlIocmRldltpZF0pOworCQkJcmV0dXJuIFBUUl9FUlIocmRldik7CiAJCX0KIAogCQlpZiAocmVnX2RhdGEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEwLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjU5MTAtcmVndWxhdG9yLmMKaW5kZXggZjUwZGQ4NC4uZmE3ZGI4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjU5MTAtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjU5MTAtcmVndWxhdG9yLmMKQEAgLTEwMTEsMTEgKzEwMTEsOCBAQAogCiAJcG1pY19wbGF0X2RhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwbWljX3BsYXRfZGF0YSksCiAJCQkJCUdGUF9LRVJORUwpOwotCi0JaWYgKCFwbWljX3BsYXRfZGF0YSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsdXJlIHRvIGFsbG9jIHBkYXRhIGZvciByZWd1bGF0b3JzLlxuIik7CisJaWYgKCFwbWljX3BsYXRfZGF0YSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJbnAgPSBvZl9ub2RlX2dldChwZGV2LT5kZXYucGFyZW50LT5vZl9ub2RlKTsKIAlyZWd1bGF0b3JzID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobnAsICJyZWd1bGF0b3JzIik7CkBAIC0xMDk4LDEwICsxMDk1LDggQEAKIAl9CiAKIAlwbWljID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcG1pYyksIEdGUF9LRVJORUwpOwotCWlmICghcG1pYykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIHBtaWNcbiIpOworCWlmICghcG1pYykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJcG1pYy0+bWZkID0gdHBzNjU5MTA7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcG1pYyk7CkBAIC0xMTMwLDI0ICsxMTI1LDE4IEBACiAKIAlwbWljLT5kZXNjID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHBtaWMtPm51bV9yZWd1bGF0b3JzICoKIAkJCXNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBtaWMtPmRlc2MpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWVtb3J5IGFsbG9jIGZhaWxzIGZvciBkZXNjXG4iKTsKKwlpZiAoIXBtaWMtPmRlc2MpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXBtaWMtPmluZm8gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgcG1pYy0+bnVtX3JlZ3VsYXRvcnMgKgogCQkJc2l6ZW9mKHN0cnVjdCB0cHNfaW5mbyAqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwbWljLT5pbmZvKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk1lbW9yeSBhbGxvYyBmYWlscyBmb3IgaW5mb1xuIik7CisJaWYgKCFwbWljLT5pbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlwbWljLT5yZGV2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHBtaWMtPm51bV9yZWd1bGF0b3JzICoKIAkJCXNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwbWljLT5yZGV2KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk1lbW9yeSBhbGxvYyBmYWlscyBmb3IgcmRldlxuIik7CisJaWYgKCFwbWljLT5yZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgcG1pYy0+bnVtX3JlZ3VsYXRvcnMgJiYgaSA8IFRQUzY1OTEwX05VTV9SRUdTOwogCQkJaSsrLCBpbmZvKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczgwMDMxLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzODAwMzEtcmVndWxhdG9yLmMKaW5kZXggNzFmNDU3YS4uMjZhYTZkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzODAwMzEtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzODAwMzEtcmVndWxhdG9yLmMKQEAgLTExNSw3ICsxMTUsNyBAQAogCQkJcmktPnJpbmZvLT5zdGF0ZV9yZWcsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQotCXJldHVybiAoKHJlZ192YWwgJiBUUFM4MDAzMV9TVEFURV9NQVNLKSA9PSBUUFM4MDAzMV9TVEFURV9PTik7CisJcmV0dXJuIChyZWdfdmFsICYgVFBTODAwMzFfU1RBVEVfTUFTSykgPT0gVFBTODAwMzFfU1RBVEVfT047CiB9CiAKIHN0YXRpYyBpbnQgdHBzODAwMzFfcmVnX2VuYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKQEAgLTY5MywxMCArNjkzLDggQEAKIAogCXBtaWMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKIAkJCVRQUzgwMDMxX1JFR1VMQVRPUl9NQVggKiBzaXplb2YoKnBtaWMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBtaWMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAibWVtIGFsbG9jIGZvciBwbWljIGZhaWxlZFxuIik7CisJaWYgKCFwbWljKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlmb3IgKG51bSA9IDA7IG51bSA8IFRQUzgwMDMxX1JFR1VMQVRPUl9NQVg7ICsrbnVtKSB7CiAJCXRwc19wZGF0YSA9IHBkYXRhLT5yZWd1bGF0b3JfcGRhdGFbbnVtXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1kY2RjLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtZGNkYy5jCmluZGV4IDA0Y2Y5YzEuLjBkODhhODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1kY2RjLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWRjZGMuYwpAQCAtNDY5LDEwICs0NjksOCBAQAogCiAJZGNkYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCAgc2l6ZW9mKHN0cnVjdCB3bTgzMXhfZGNkYyksCiAJCQkgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRjZGMgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgcHJpdmF0ZSBkYXRhXG4iKTsKKwlpZiAoIWRjZGMpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWRjZGMtPndtODMxeCA9IHdtODMxeDsKIApAQCAtNjIyLDEwICs2MjAsOCBAQAogCiAJZGNkYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHdtODMxeF9kY2RjKSwKIAkJCSAgICBHRlBfS0VSTkVMKTsKLQlpZiAoZGNkYyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBwcml2YXRlIGRhdGFcbiIpOworCWlmICghZGNkYykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJZGNkYy0+d204MzF4ID0gd204MzF4OwogCkBAIC03NTIsMTAgKzc0OCw4IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJZGNkYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHdtODMxeF9kY2RjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRjZGMgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgcHJpdmF0ZSBkYXRhXG4iKTsKKwlpZiAoIWRjZGMpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWRjZGMtPndtODMxeCA9IHdtODMxeDsKIApAQCAtODQyLDEwICs4MzYsOCBAQAogCWRldl9kYmcoJnBkZXYtPmRldiwgIlByb2JpbmcgRVBFJWRcbiIsIGlkICsgMSk7CiAKIAlkY2RjID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgd204MzF4X2RjZGMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoZGNkYyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBwcml2YXRlIGRhdGFcbiIpOworCWlmICghZGNkYykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJZGNkYy0+d204MzF4ID0gd204MzF4OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtaXNpbmsuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1pc2luay5jCmluZGV4IDAzMzliODguLjcyZTM4NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1pc2luay5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1pc2luay5jCkBAIC0xNjUsMTAgKzE2NSw4IEBACiAKIAlpc2luayA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHdtODMxeF9pc2luayksCiAJCQkgICAgIEdGUF9LRVJORUwpOwotCWlmIChpc2luayA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBwcml2YXRlIGRhdGFcbiIpOworCWlmICghaXNpbmspCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWlzaW5rLT53bTgzMXggPSB3bTgzMXg7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1sZG8uYyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1sZG8uYwppbmRleCA0NmQ2NzAwLi5lY2EwZWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtbGRvLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWxkby5jCkBAIC0yMzUsMTAgKzIzNSw4IEBACiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiUHJvYmluZyBMRE8lZFxuIiwgaWQgKyAxKTsKIAogCWxkbyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHdtODMxeF9sZG8pLCBHRlBfS0VSTkVMKTsKLQlpZiAobGRvID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIHByaXZhdGUgZGF0YVxuIik7CisJaWYgKCFsZG8pCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWxkby0+d204MzF4ID0gd204MzF4OwogCkBAIC00NDcsMTAgKzQ0NSw4IEBACiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiUHJvYmluZyBMRE8lZFxuIiwgaWQgKyAxKTsKIAogCWxkbyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHdtODMxeF9sZG8pLCBHRlBfS0VSTkVMKTsKLQlpZiAobGRvID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIHByaXZhdGUgZGF0YVxuIik7CisJaWYgKCFsZG8pCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWxkby0+d204MzF4ID0gd204MzF4OwogCkBAIC01OTQsMTAgKzU5MCw4IEBACiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiUHJvYmluZyBMRE8lZFxuIiwgaWQgKyAxKTsKIAogCWxkbyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHdtODMxeF9sZG8pLCBHRlBfS0VSTkVMKTsKLQlpZiAobGRvID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIHByaXZhdGUgZGF0YVxuIik7CisJaWYgKCFsZG8pCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWxkby0+d204MzF4ID0gd204MzF4OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzNTAtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzNTAtcmVndWxhdG9yLmMKaW5kZXggZGU3YjljNy4uN2VjN2MzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3Ivd204MzUwLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODM1MC1yZWd1bGF0b3IuYwpAQCAtMzYxLDcgKzM2MSw3IEBACiAKIAlzZWwgPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfbGluZWFyKHJkZXYsIHVWLCB1Vik7CiAJaWYgKHNlbCA8IDApCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gc2VsOwogCiAJLyogYWxsIERDRENzIGhhdmUgc2FtZSBtViBiaXRzICovCiAJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgdm9sdF9yZWcpICYgfldNODM1MF9EQzFfVlNFTF9NQVNLOwpAQCAtNTc0LDcgKzU3NCw3IEBACiAKIAlzZWwgPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfbGluZWFyX3JhbmdlKHJkZXYsIHVWLCB1Vik7CiAJaWYgKHNlbCA8IDApCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gc2VsOwogCiAJLyogYWxsIExET3MgaGF2ZSBzYW1lIG1WIGJpdHMgKi8KIAl2YWwgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCB2b2x0X3JlZykgJiB+V004MzUwX0xETzFfVlNFTF9NQVNLOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3Ivd204OTk0LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204OTk0LXJlZ3VsYXRvci5jCmluZGV4IDcxYzU5MTEuLmMyNDM0NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODk5NC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTg5OTQtcmVndWxhdG9yLmMKQEAgLTEzNCwxMCArMTM0LDggQEAKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICJQcm9iaW5nIExETyVkXG4iLCBpZCArIDEpOwogCiAJbGRvID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgd204OTk0X2xkbyksIEdGUF9LRVJORUwpOwotCWlmIChsZG8gPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgcHJpdmF0ZSBkYXRhXG4iKTsKKwlpZiAoIWxkbykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJbGRvLT53bTg5OTQgPSB3bTg5OTQ7CiAJbGRvLT5zdXBwbHkgPSB3bTg5OTRfbGRvX2NvbnN1bWVyW2lkXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jCmluZGV4IGViZjQxZTIuLmVlMGU4NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYwpAQCAtMzA0LDEyICszMDQsNiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQgZGNzc2Jsa191bnJlZ2lzdGVyX2NhbGxiYWNrKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOwotCXB1dF9kZXZpY2UoZGV2KTsKLX0KLQogLyoKICAqIGRldmljZSBhdHRyaWJ1dGUgZm9yIHN3aXRjaGluZyBzaGFyZWQvbm9uc2hhcmVkIChleGNsdXNpdmUpCiAgKiBvcGVyYXRpb24gKHNob3cgKyBzdG9yZSkKQEAgLTM5Nyw3ICszOTEsMTMgQEAKIAlibGtfY2xlYW51cF9xdWV1ZShkZXZfaW5mby0+ZGNzc2Jsa19xdWV1ZSk7CiAJZGV2X2luZm8tPmdkLT5xdWV1ZSA9IE5VTEw7CiAJcHV0X2Rpc2soZGV2X2luZm8tPmdkKTsKLQlyYyA9IGRldmljZV9zY2hlZHVsZV9jYWxsYmFjayhkZXYsIGRjc3NibGtfdW5yZWdpc3Rlcl9jYWxsYmFjayk7CisJdXBfd3JpdGUoJmRjc3NibGtfZGV2aWNlc19zZW0pOworCisJaWYgKGRldmljZV9yZW1vdmVfZmlsZV9zZWxmKGRldiwgYXR0cikpIHsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKKwkJcHV0X2RldmljZShkZXYpOworCX0KKwlyZXR1cm4gcmM7CiBvdXQ6CiAJdXBfd3JpdGUoJmRjc3NibGtfZGV2aWNlc19zZW0pOwogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYyBiL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYwppbmRleCBmZDMzNjdhMS4uZGZkN2JjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jY3dncm91cC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYwpAQCAtMTY4LDE0ICsxNjgsMTIgQEAKICAqIFByb3ZpZGUgYW4gJ3VuZ3JvdXAnIGF0dHJpYnV0ZSBzbyB0aGUgdXNlciBjYW4gcmVtb3ZlIGdyb3VwIGRldmljZXMgbm8KICAqIGxvbmdlciBuZWVkZWQgb3IgYWNjaWRlbnRpYWxseSBjcmVhdGVkLiBTYXZlcyBtZW1vcnkgOikKICAqLwotc3RhdGljIHZvaWQgY2N3Z3JvdXBfdW5ncm91cF9jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBjY3dncm91cF91bmdyb3VwKHN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmdkZXYpCiB7Ci0Jc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldiA9IHRvX2Njd2dyb3VwZGV2KGRldik7Ci0KIAltdXRleF9sb2NrKCZnZGV2LT5yZWdfbXV0ZXgpOwogCWlmIChkZXZpY2VfaXNfcmVnaXN0ZXJlZCgmZ2Rldi0+ZGV2KSkgewogCQlfX2Njd2dyb3VwX3JlbW92ZV9zeW1saW5rcyhnZGV2KTsKLQkJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJmdkZXYtPmRldik7CiAJCV9fY2N3Z3JvdXBfcmVtb3ZlX2NkZXZfcmVmcyhnZGV2KTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZnZGV2LT5yZWdfbXV0ZXgpOwpAQCAtMTk1LDEwICsxOTMsOSBAQAogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KLQkvKiBOb3RlIHRoYXQgd2UgY2Fubm90IHVucmVnaXN0ZXIgdGhlIGRldmljZSBmcm9tIG9uZSBvZiBpdHMKLQkgKiBhdHRyaWJ1dGUgbWV0aG9kcywgc28gd2UgaGF2ZSB0byB1c2UgdGhpcyByb3VuZGFib3V0IGFwcHJvYWNoLgotCSAqLwotCXJjID0gZGV2aWNlX3NjaGVkdWxlX2NhbGxiYWNrKGRldiwgY2N3Z3JvdXBfdW5ncm91cF9jYWxsYmFjayk7CisKKwlpZiAoZGV2aWNlX3JlbW92ZV9maWxlX3NlbGYoZGV2LCBhdHRyKSkKKwkJY2N3Z3JvdXBfdW5ncm91cChnZGV2KTsKIG91dDoKIAlpZiAocmMpIHsKIAkJaWYgKHJjICE9IC1FQUdBSU4pCkBAIC0yMjQsNiArMjIxLDE0IEBACiAJTlVMTCwKIH07CiAKK3N0YXRpYyB2b2lkIGNjd2dyb3VwX3VuZ3JvdXBfd29ya2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjY3dncm91cF9kZXZpY2UsIHVuZ3JvdXBfd29yayk7CisKKwljY3dncm91cF91bmdyb3VwKGdkZXYpOworfQorCiBzdGF0aWMgdm9pZCBjY3dncm91cF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlrZnJlZSh0b19jY3dncm91cGRldihkZXYpKTsKQEAgLTMyMyw2ICszMjgsNyBAQAogCWF0b21pY19zZXQoJmdkZXYtPm9ub2ZmLCAwKTsKIAltdXRleF9pbml0KCZnZGV2LT5yZWdfbXV0ZXgpOwogCW11dGV4X2xvY2soJmdkZXYtPnJlZ19tdXRleCk7CisJSU5JVF9XT1JLKCZnZGV2LT51bmdyb3VwX3dvcmssIGNjd2dyb3VwX3VuZ3JvdXBfd29ya2ZuKTsKIAlnZGV2LT5jb3VudCA9IG51bV9kZXZpY2VzOwogCWdkZXYtPmRldi5idXMgPSAmY2N3Z3JvdXBfYnVzX3R5cGU7CiAJZ2Rldi0+ZGV2LnBhcmVudCA9IHBhcmVudDsKQEAgLTQwNCwxMCArNDEwLDEwIEBACiBzdGF0aWMgaW50IGNjd2dyb3VwX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAogCQkJICAgICB2b2lkICpkYXRhKQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldiA9IHRvX2Njd2dyb3VwZGV2KGRhdGEpOwogCiAJaWYgKGFjdGlvbiA9PSBCVVNfTk9USUZZX1VOQklORF9EUklWRVIpCi0JCWRldmljZV9zY2hlZHVsZV9jYWxsYmFjayhkZXYsIGNjd2dyb3VwX3VuZ3JvdXBfY2FsbGJhY2spOworCQlzY2hlZHVsZV93b3JrKCZnZGV2LT51bmdyb3VwX3dvcmspOwogCiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCmluZGV4IDk3YzQ4YjMuLjllMDU4YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaW8uYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2Npby5oPgogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTI4LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxhc20vY2hwaWQuaD4KICNpbmNsdWRlIDxhc20vYWlycS5oPgogI2luY2x1ZGUgPGFzbS9pc2MuaD4KLSNpbmNsdWRlIDxhc20vY3B1dGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdXRpbWUuaD4KICNpbmNsdWRlIDxhc20vZmN4Lmg+CiAjaW5jbHVkZSA8YXNtL25taS5oPgogI2luY2x1ZGUgPGFzbS9jcncuaD4KQEAgLTU4NCw4ICs1ODUsNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFfZGVzYyAqaXJxX2Rlc2NfaW87Ci0KIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlvX2ludGVycnVwdCA9IHsKIAkubmFtZQkgPSAiSU8iLAogCS5oYW5kbGVyID0gZG9fY2lvX2ludGVycnVwdCwKQEAgLTU5Niw3ICs1OTUsNiBAQAogCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihJT19JTlRFUlJVUFQsCiAJCQkJICZkdW1teV9pcnFfY2hpcCwgaGFuZGxlX3BlcmNwdV9pcnEpOwogCXNldHVwX2lycShJT19JTlRFUlJVUFQsICZpb19pbnRlcnJ1cHQpOwotCWlycV9kZXNjX2lvID0gaXJxX3RvX2Rlc2MoSU9fSU5URVJSVVBUKTsKIH0KIAogI2lmZGVmIENPTkZJR19DQ1dfQ09OU09MRQpAQCAtNjIzLDcgKzYyMSw3IEBACiAJCWxvY2FsX2JoX2Rpc2FibGUoKTsKIAkJaXJxX2VudGVyKCk7CiAJfQotCWtzdGF0X2luY3JfaXJxc190aGlzX2NwdShJT19JTlRFUlJVUFQsIGlycV9kZXNjX2lvKTsKKwlrc3RhdF9pbmNyX2lycV90aGlzX2NwdShJT19JTlRFUlJVUFQpOwogCWlmIChzY2gtPmRyaXZlciAmJiBzY2gtPmRyaXZlci0+aXJxKQogCQlzY2gtPmRyaXZlci0+aXJxKHNjaCk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL05DUjUzODAuYyBiL2RyaXZlcnMvc2NzaS9OQ1I1MzgwLmMKaW5kZXggMWU5ZDZhZC4uYmNkMjIzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL05DUjUzODAuYworKysgYi9kcml2ZXJzL3Njc2kvTkNSNTM4MC5jCkBAIC01ODQsNyArNTg0LDcgQEAKIAlOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKIAogCWZvciAodHJ5aW5nX2lycXMgPSBpID0gMCwgbWFzayA9IDE7IGkgPCAxNjsgKytpLCBtYXNrIDw8PSAxKQotCQlpZiAoKG1hc2sgJiBwb3NzaWJsZSkgJiYgKHJlcXVlc3RfaXJxKGksICZwcm9iZV9pbnRyLCBJUlFGX0RJU0FCTEVELCAiTkNSLXByb2JlIiwgTlVMTCkgPT0gMCkpCisJCWlmICgobWFzayAmIHBvc3NpYmxlKSAmJiAocmVxdWVzdF9pcnEoaSwgJnByb2JlX2ludHIsIDAsICJOQ1ItcHJvYmUiLCBOVUxMKSA9PSAwKSkKIAkJCXRyeWluZ19pcnFzIHw9IG1hc2s7CiAKIAl0aW1lb3V0ID0gamlmZmllcyArICgyNTAgKiBIWiAvIDEwMDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjcmFpZC5oIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjcmFpZC5oCmluZGV4IDkzMjNkMDUuLmVhYWY4NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY3JhaWQuaAorKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNyYWlkLmgKQEAgLTEyLDcgKzEyLDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZm5kZWYgQUFDX0RSSVZFUl9CVUlMRAotIyBkZWZpbmUgQUFDX0RSSVZFUl9CVUlMRCAzMDIwMAorIyBkZWZpbmUgQUFDX0RSSVZFUl9CVUlMRCAzMDMwMAogIyBkZWZpbmUgQUFDX0RSSVZFUl9CUkFOQ0ggIi1tcyIKICNlbmRpZgogI2RlZmluZSBNQVhJTVVNX05VTV9DT05UQUlORVJTCTMyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9yeC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvcnguYwppbmRleCBkYWRhMzhhLi41YzZhODcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9yeC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3J4LmMKQEAgLTQ4MCw3ICs0ODAsNyBAQAogCiBzdGF0aWMgaW50IGFhY19yeF9yZXN0YXJ0X2FkYXB0ZXIoc3RydWN0IGFhY19kZXYgKmRldiwgaW50IGJsZWQpCiB7Ci0JdTMyIHZhcjsKKwl1MzIgdmFyID0gMDsKIAogCWlmICghKGRldi0+c3VwcGxlbWVudF9hZGFwdGVyX2luZm8uU3VwcG9ydGVkT3B0aW9uczIgJgogCSAgQUFDX09QVElPTl9NVV9SRVNFVCkgfHwgKGJsZWQgPj0gMCkgfHwgKGJsZWQgPT0gLTIpKSB7CkBAIC01MDAsMTMgKzUwMCwxNCBAQAogCQlpZiAoYmxlZCAmJiAoYmxlZCAhPSAtRVRJTUVET1VUKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoYmxlZCB8fCAodmFyID09IDB4MzgwMzAwMEYpKSB7IC8qIFVTRV9PVEhFUl9NRVRIT0QgKi8KKwlpZiAoYmxlZCAmJiAodmFyID09IDB4MzgwMzAwMEYpKSB7IC8qIFVTRV9PVEhFUl9NRVRIT0QgKi8KIAkJcnhfd3JpdGVsKGRldiwgTVVuaXQucmVzZXJ2ZWQyLCAzKTsKIAkJbXNsZWVwKDUwMDApOyAvKiBEZWxheSA1IHNlY29uZHMgKi8KIAkJdmFyID0gMHgwMDAwMDAwMTsKIAl9Ci0JaWYgKHZhciAhPSAweDAwMDAwMDAxKQorCWlmIChibGVkICYmICh2YXIgIT0gMHgwMDAwMDAwMSkpCiAJCXJldHVybiAtRUlOVkFMOworCXNzbGVlcCg1KTsKIAlpZiAocnhfcmVhZGwoZGV2LCBNVW5pdC5PTVJ4WzBdKSAmIEtFUk5FTF9QQU5JQykKIAkJcmV0dXJuIC1FTk9ERVY7CiAJaWYgKHN0YXJ0dXBfdGltZW91dCA8IDMwMCkKQEAgLTY0Niw3ICs2NDcsNyBAQAogCWRldi0+c3luY19tb2RlID0gMDsJLyogc3luYy4gbW9kZSBub3Qgc3VwcG9ydGVkICovCiAJZGV2LT5tc2kgPSBhYWNfbXNpICYmICFwY2lfZW5hYmxlX21zaShkZXYtPnBkZXYpOwogCWlmIChyZXF1ZXN0X2lycShkZXYtPnBkZXYtPmlycSwgZGV2LT5hX29wcy5hZGFwdGVyX2ludHIsCi0JCQlJUlFGX1NIQVJFRHxJUlFGX0RJU0FCTEVELCAiYWFjcmFpZCIsIGRldikgPCAwKSB7CisJCQlJUlFGX1NIQVJFRCwgImFhY3JhaWQiLCBkZXYpIDwgMCkgewogCQlpZiAoZGV2LT5tc2kpCiAJCQlwY2lfZGlzYWJsZV9tc2koZGV2LT5wZGV2KTsKIAkJcHJpbnRrKEtFUk5fRVJSICIlcyVkOiBJbnRlcnJ1cHQgdW5hdmFpbGFibGUuXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvc2EuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3NhLmMKaW5kZXggMjI0NGYzMS4uZTY2NDc3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvc2EuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zYS5jCkBAIC0zODcsOCArMzg3LDcgQEAKIAkJZ290byBlcnJvcl9pcnE7CiAJZGV2LT5zeW5jX21vZGUgPSAwOwkvKiBzeW5jLiBtb2RlIG5vdCBzdXBwb3J0ZWQgKi8KIAlpZiAocmVxdWVzdF9pcnEoZGV2LT5wZGV2LT5pcnEsIGRldi0+YV9vcHMuYWRhcHRlcl9pbnRyLAotCQkJSVJRRl9TSEFSRUR8SVJRRl9ESVNBQkxFRCwKLQkJCSJhYWNyYWlkIiwgKHZvaWQgKilkZXYgKSA8IDApIHsKKwkJCUlSUUZfU0hBUkVELCAiYWFjcmFpZCIsICh2b2lkICopZGV2KSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMlZDogSW50ZXJydXB0IHVuYXZhaWxhYmxlLlxuIiwKIAkJCW5hbWUsIGluc3RhbmNlKTsKIAkJZ290byBlcnJvcl9pb3VubWFwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvc3JjLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zcmMuYwppbmRleCA3ZTE3MTA3Li45YzY1YWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zcmMuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zcmMuYwpAQCAtNjQ3LDcgKzY0Nyw3IEBACiAJZGV2LT5tc2kgPSBhYWNfbXNpICYmICFwY2lfZW5hYmxlX21zaShkZXYtPnBkZXYpOwogCiAJaWYgKHJlcXVlc3RfaXJxKGRldi0+cGRldi0+aXJxLCBkZXYtPmFfb3BzLmFkYXB0ZXJfaW50ciwKLQkJCUlSUUZfU0hBUkVEfElSUUZfRElTQUJMRUQsICJhYWNyYWlkIiwgZGV2KSA8IDApIHsKKwkJCUlSUUZfU0hBUkVELCAiYWFjcmFpZCIsIGRldikgPCAwKSB7CiAKIAkJaWYgKGRldi0+bXNpKQogCQkJcGNpX2Rpc2FibGVfbXNpKGRldi0+cGRldik7CkBAIC04MDQsNyArODA0LDcgQEAKIAkJZ290byBlcnJvcl9pb3VubWFwOwogCWRldi0+bXNpID0gYWFjX21zaSAmJiAhcGNpX2VuYWJsZV9tc2koZGV2LT5wZGV2KTsKIAlpZiAocmVxdWVzdF9pcnEoZGV2LT5wZGV2LT5pcnEsIGRldi0+YV9vcHMuYWRhcHRlcl9pbnRyLAotCQlJUlFGX1NIQVJFRHxJUlFGX0RJU0FCTEVELCAiYWFjcmFpZCIsIGRldikgPCAwKSB7CisJCUlSUUZfU0hBUkVELCAiYWFjcmFpZCIsIGRldikgPCAwKSB7CiAJCWlmIChkZXYtPm1zaSkKIAkJCXBjaV9kaXNhYmxlX21zaShkZXYtPnBkZXYpOwogCQlwcmludGsoS0VSTl9FUlIgIiVzJWQ6IEludGVycnVwdCB1bmF2YWlsYWJsZS5cbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWhhMTUyeC5jIGIvZHJpdmVycy9zY3NpL2FoYTE1MnguYwppbmRleCAzZjdiNmZlLi5lODZlYjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWhhMTUyeC5jCisrKyBiL2RyaXZlcnMvc2NzaS9haGExNTJ4LmMKQEAgLTg1Nyw3ICs4NTcsNyBAQAogCVNFVFBPUlQoU0lNT0RFMCwgMCk7CiAJU0VUUE9SVChTSU1PREUxLCAwKTsKIAotCWlmKCByZXF1ZXN0X2lycShzaHBudC0+aXJxLCBzd2ludHIsIElSUUZfRElTQUJMRUR8SVJRRl9TSEFSRUQsICJhaGExNTJ4Iiwgc2hwbnQpICkgeworCWlmIChyZXF1ZXN0X2lycShzaHBudC0+aXJxLCBzd2ludHIsIElSUUZfU0hBUkVELCAiYWhhMTUyeCIsIHNocG50KSkgewogCQlwcmludGsoS0VSTl9FUlIgImFoYTE1MnglZDogaXJxICVkIGJ1c3kuXG4iLCBzaHBudC0+aG9zdF9ubywgc2hwbnQtPmlycSk7CiAJCWdvdG8gb3V0X2hvc3RfcHV0OwogCX0KQEAgLTg5MSw3ICs4OTEsNyBAQAogCVNFVFBPUlQoU1NUQVQwLCAweDdmKTsKIAlTRVRQT1JUKFNTVEFUMSwgMHhlZik7CiAKLQlpZiAoIHJlcXVlc3RfaXJxKHNocG50LT5pcnEsIGludHIsIElSUUZfRElTQUJMRUR8SVJRRl9TSEFSRUQsICJhaGExNTJ4Iiwgc2hwbnQpICkgeworCWlmIChyZXF1ZXN0X2lycShzaHBudC0+aXJxLCBpbnRyLCBJUlFGX1NIQVJFRCwgImFoYTE1MngiLCBzaHBudCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4JWQ6IGZhaWxlZCB0byByZWFzc2lnbiBpcnEgJWQuXG4iLCBzaHBudC0+aG9zdF9ubywgc2hwbnQtPmlycSk7CiAJCWdvdG8gb3V0X2hvc3RfcHV0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21faW5zZm9ybWF0LmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWNhc20vYWljYXNtX2luc2Zvcm1hdC5oCmluZGV4IDlkZjllMmMuLjgzNzM0NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21faW5zZm9ybWF0LmgKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9pbnNmb3JtYXQuaApAQCAtMjA5LDcgKzIwOSw2IEBACiAjZGVmaW5lIEFJQ19PUF9KQzE2CTB4OTEwNQogI2RlZmluZSBBSUNfT1BfSk5DMTYJMHg5MjA1CiAjZGVmaW5lIEFJQ19PUF9DQUxMMTYJMHg5MzA1Ci0jZGVmaW5lIEFJQ19PUF9DQUxMMTYJMHg5MzA1CiAKIC8qIFBhZ2UgZXh0ZW5zaW9uIGlzIGxvdyB0aHJlZSBiaXRzIG9mIHNlY29uZCBvcGNvZGUgYnl0ZS4gKi8KICNkZWZpbmUgQUlDX09QX0pNUEYJMHhBMDA1CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJjbXNyL2FyY21zcl9oYmEuYyBiL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2hiYS5jCmluZGV4IDRmNmEzMGIuLjY1MmI0MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2hiYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2hiYS5jCkBAIC0yNTAwLDE2ICsyNTAwLDE1IEBACiBzdGF0aWMgaW50IGFyY21zcl9pb3BfY29uZmlybShzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKQogewogCXVpbnQzMl90IGNkYl9waHlhZGRyLCBjZGJfcGh5YWRkcl9oaTMyOwotCWRtYV9hZGRyX3QgZG1hX2NvaGVyZW50X2hhbmRsZTsKKwogCS8qCiAJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkqKiBoZXJlIHdlIG5lZWQgdG8gdGVsbCBpb3AgMzMxIG91ciBmcmVlY2NiLkhpZ2hQYXJ0CiAJKiogaWYgZnJlZWNjYi5IaWdoUGFydCBpcyBub3QgemVybwogCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAJKi8KLQlkbWFfY29oZXJlbnRfaGFuZGxlID0gYWNiLT5kbWFfY29oZXJlbnRfaGFuZGxlOwotCWNkYl9waHlhZGRyID0gKHVpbnQzMl90KShkbWFfY29oZXJlbnRfaGFuZGxlKTsKLQljZGJfcGh5YWRkcl9oaTMyID0gKHVpbnQzMl90KSgoY2RiX3BoeWFkZHIgPj4gMTYpID4+IDE2KTsKKwljZGJfcGh5YWRkciA9IGxvd2VyXzMyX2JpdHMoYWNiLT5kbWFfY29oZXJlbnRfaGFuZGxlKTsKKwljZGJfcGh5YWRkcl9oaTMyID0gdXBwZXJfMzJfYml0cyhhY2ItPmRtYV9jb2hlcmVudF9oYW5kbGUpOwogCWFjYi0+Y2RiX3BoeWFkZHJfaGkzMiA9IGNkYl9waHlhZGRyX2hpMzI7CiAJLyoKIAkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9hY29ybnNjc2kuYyBiL2RyaXZlcnMvc2NzaS9hcm0vYWNvcm5zY3NpLmMKaW5kZXggMDliYTE4Ni4uMDU5ZmY0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FybS9hY29ybnNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvYXJtL2Fjb3Juc2NzaS5jCkBAIC0yOTcxLDcgKzI5NzEsNyBAQAogCWVjLT5pcnFhZGRyCT0gYXNob3N0LT5mYXN0ICsgSU5UX1JFRzsKIAllYy0+aXJxbWFzawk9IDB4MGE7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShob3N0LT5pcnEsIGFjb3Juc2NzaV9pbnRyLCBJUlFGX0RJU0FCTEVELCAiYWNvcm5zY3NpIiwgYXNob3N0KTsKKwlyZXQgPSByZXF1ZXN0X2lycShob3N0LT5pcnEsIGFjb3Juc2NzaV9pbnRyLCAwLCAiYWNvcm5zY3NpIiwgYXNob3N0KTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0NSSVQgInNjc2klZDogSVJRJWQgbm90IGZyZWU6ICVkXG4iLAogCQkJaG9zdC0+aG9zdF9ubywgYXNob3N0LT5zY3NpLmlycSwgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcm0vY3VtYW5hXzEuYyBiL2RyaXZlcnMvc2NzaS9hcm0vY3VtYW5hXzEuYwppbmRleCBiNjc5Nzc4Li5mOGUwNjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYXJtL2N1bWFuYV8xLmMKKysrIGIvZHJpdmVycy9zY3NpL2FybS9jdW1hbmFfMS5jCkBAIC0yNjIsNyArMjYyLDcgQEAKIAkJZ290byBvdXRfdW5tYXA7CiAJfQogCi0JcmV0ID0gcmVxdWVzdF9pcnEoaG9zdC0+aXJxLCBjdW1hbmFzY3NpX2ludHIsIElSUUZfRElTQUJMRUQsCisJcmV0ID0gcmVxdWVzdF9pcnEoaG9zdC0+aXJxLCBjdW1hbmFzY3NpX2ludHIsIDAsCiAJCQkgICJDdW1hbmFTQ1NJLTEiLCBob3N0KTsKIAlpZiAocmV0KSB7CiAJCXByaW50aygic2NzaSVkOiBJUlElZCBub3QgZnJlZTogJWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL2N1bWFuYV8yLmMgYi9kcml2ZXJzL3Njc2kvYXJtL2N1bWFuYV8yLmMKaW5kZXggNTg5MTVmMi4uYWJjNjZmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FybS9jdW1hbmFfMi5jCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vY3VtYW5hXzIuYwpAQCAtNDMxLDcgKzQzMSw3IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAKIAlyZXQgPSByZXF1ZXN0X2lycShlYy0+aXJxLCBjdW1hbmFzY3NpXzJfaW50ciwKLQkJCSAgSVJRRl9ESVNBQkxFRCwgImN1bWFuYXNjc2kyIiwgaW5mbyk7CisJCQkgIDAsICJjdW1hbmFzY3NpMiIsIGluZm8pOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKCJzY3NpJWQ6IElSUSVkIG5vdCBmcmVlOiAlZFxuIiwKIAkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIGVjLT5pcnEsIHJldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL3Bvd2VydGVjLmMgYi9kcml2ZXJzL3Njc2kvYXJtL3Bvd2VydGVjLmMKaW5kZXggYWJjOTU5My4uNWUxYjczZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FybS9wb3dlcnRlYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vcG93ZXJ0ZWMuYwpAQCAtMzU4LDcgKzM1OCw3IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAKIAlyZXQgPSByZXF1ZXN0X2lycShlYy0+aXJxLCBwb3dlcnRlY3Njc2lfaW50ciwKLQkJCSAgSVJRRl9ESVNBQkxFRCwgInBvd2VydGVjIiwgaW5mbyk7CisJCQkgIDAsICJwb3dlcnRlYyIsIGluZm8pOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKCJzY3NpJWQ6IElSUSVkIG5vdCBmcmVlOiAlZFxuIiwKIAkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIGVjLT5pcnEsIHJldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmUuaCBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZS5oCmluZGV4IDJlMjhmNmMuLjFiZmIwYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZS5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZS5oCkBAIC05OCw2ICs5OCwxNCBAQAogCXN0cnVjdCBiZV9xdWV1ZV9pbmZvIGNxOwogfTsKIAorc3RydWN0IGJlaXNjc2lfbWNjX3RhZ19zdGF0ZSB7CisjZGVmaW5lIE1DQ19UQUdfU1RBVEVfQ09NUExFVEVEIDB4MDAKKyNkZWZpbmUgTUNDX1RBR19TVEFURV9SVU5OSU5HICAgMHgwMQorI2RlZmluZSBNQ0NfVEFHX1NUQVRFX1RJTUVPVVQgICAweDAyCisJdWludDhfdCB0YWdfc3RhdGU7CisJc3RydWN0IGJlX2RtYV9tZW0gdGFnX21lbV9zdGF0ZTsKK307CisKIHN0cnVjdCBiZV9jdHJsX2luZm8gewogCXU4IF9faW9tZW0gKmNzcjsKIAl1OCBfX2lvbWVtICpkYjsJCS8qIERvb3IgQmVsbCAqLwpAQCAtMTIyLDYgKzEzMCw4IEBACiAJdW5zaWduZWQgc2hvcnQgbWNjX2FsbG9jX2luZGV4OwogCXVuc2lnbmVkIHNob3J0IG1jY19mcmVlX2luZGV4OwogCXVuc2lnbmVkIGludCBtY2NfdGFnX2F2YWlsYWJsZTsKKworCXN0cnVjdCBiZWlzY3NpX21jY190YWdfc3RhdGUgcHRhZ19zdGF0ZVtNQVhfTUNDX0NNRCArIDFdOwogfTsKIAogI2luY2x1ZGUgImJlX2NtZHMuaCIKQEAgLTEyOSw2ICsxMzksNyBAQAogI2RlZmluZSBQQUdFX1NISUZUXzRLIDEyCiAjZGVmaW5lIFBBR0VfU0laRV80SyAoMSA8PCBQQUdFX1NISUZUXzRLKQogI2RlZmluZSBtY2NfdGltZW91dAkJMTIwMDAwIC8qIDEycyB0aW1lb3V0ICovCisjZGVmaW5lIEJFSVNDU0lfTE9HT1VUX1NZTkNfREVMQVkJMjUwCiAKIC8qIFJldHVybnMgbnVtYmVyIG9mIHBhZ2VzIHNwYW5uZWQgYnkgdGhlIGRhdGEgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGFkZHIgKi8KICNkZWZpbmUgUEFHRVNfNEtfU1BBTk5FRChfYWRkcmVzcywgc2l6ZSkJCQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuYyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmMKaW5kZXggMzMzODM5MS4uMTQzMmVkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuYworKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5jCkBAIC0xMzgsNyArMTM4LDcgQEAKICAqIEBwaGJhOiBEcml2ZXIgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqIEB0YWc6IFRhZyBmb3IgdGhlIE1CWCBDb21tYW5kCiAgKiBAd3JiOiB0aGUgV1JCIHVzZWQgZm9yIHRoZSBNQlggQ29tbWFuZAotICogQGNtZF9oZHI6IElPQ1RMIEhkciBmb3IgdGhlIE1CWCBDbWQKKyAqIEBtYnhfY21kX21lbTogcHRyIHRvIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIE1CWCBDbWQKICAqCiAgKiBXYWl0cyBmb3IgTUJYIGNvbXBsZXRpb24gd2l0aCB0aGUgcGFzc2VkIFRBRy4KICAqCkBAIC0xNDgsMjEgKzE0OCwyNiBAQAogICoqLwogaW50IGJlaXNjc2lfbWNjcV9jb21wbChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCiAJCXVpbnQzMl90IHRhZywgc3RydWN0IGJlX21jY193cmIgKip3cmIsCi0JCXZvaWQgKmNtZF9oZHIpCisJCXN0cnVjdCBiZV9kbWFfbWVtICptYnhfY21kX21lbSkKIHsKIAlpbnQgcmMgPSAwOwogCXVpbnQzMl90IG1jY190YWdfcmVzcG9uc2U7CiAJdWludDE2X3Qgc3RhdHVzID0gMCwgYWRkbF9zdGF0dXMgPSAwLCB3cmJfbnVtID0gMDsKIAlzdHJ1Y3QgYmVfbWNjX3dyYiAqdGVtcF93cmI7Ci0Jc3RydWN0IGJlX2NtZF9yZXFfaGRyICppb2N0bF9oZHI7Ci0Jc3RydWN0IGJlX2NtZF9yZXNwX2hkciAqaW9jdGxfcmVzcF9oZHI7CisJc3RydWN0IGJlX2NtZF9yZXFfaGRyICptYnhfaGRyOworCXN0cnVjdCBiZV9jbWRfcmVzcF9oZHIgKm1ieF9yZXNwX2hkcjsKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqbWNjcSA9ICZwaGJhLT5jdHJsLm1jY19vYmoucTsKIAogCWlmIChiZWlzY3NpX2Vycm9yKHBoYmEpKSB7CiAJCWZyZWVfbWNjX3RhZygmcGhiYS0+Y3RybCwgdGFnKTsKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiAtRVBFUk07CiAJfQogCisJLyogU2V0IE1CWCBUYWcgc3RhdGUgdG8gQWN0aXZlICovCisJc3Bpbl9sb2NrKCZwaGJhLT5jdHJsLm1ib3hfbG9jayk7CisJcGhiYS0+Y3RybC5wdGFnX3N0YXRlW3RhZ10udGFnX3N0YXRlID0gTUNDX1RBR19TVEFURV9SVU5OSU5HOworCXNwaW5fdW5sb2NrKCZwaGJhLT5jdHJsLm1ib3hfbG9jayk7CisKIAkvKiB3YWl0IGZvciB0aGUgbWNjcSBjb21wbGV0aW9uICovCiAJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCgKIAkJCQlwaGJhLT5jdHJsLm1jY193YWl0W3RhZ10sCkBAIC0xNzEsNTYgKzE3Niw3MSBAQAogCQkJCUJFSVNDU0lfSE9TVF9NQlhfVElNRU9VVCkpOwogCiAJaWYgKHJjIDw9IDApIHsKKwkJc3RydWN0IGJlX2RtYV9tZW0gKnRhZ19tZW07CisJCS8qIFNldCBNQlggVGFnIHN0YXRlIHRvIHRpbWVvdXQgKi8KKwkJc3Bpbl9sb2NrKCZwaGJhLT5jdHJsLm1ib3hfbG9jayk7CisJCXBoYmEtPmN0cmwucHRhZ19zdGF0ZVt0YWddLnRhZ19zdGF0ZSA9IE1DQ19UQUdfU1RBVEVfVElNRU9VVDsKKwkJc3Bpbl91bmxvY2soJnBoYmEtPmN0cmwubWJveF9sb2NrKTsKKworCQkvKiBTdG9yZSByZXNvdXJjZSBhZGRyIHRvIGJlIGZyZWVkIGxhdGVyICovCisJCXRhZ19tZW0gPSAmcGhiYS0+Y3RybC5wdGFnX3N0YXRlW3RhZ10udGFnX21lbV9zdGF0ZTsKKwkJaWYgKG1ieF9jbWRfbWVtKSB7CisJCQl0YWdfbWVtLT5zaXplID0gbWJ4X2NtZF9tZW0tPnNpemU7CisJCQl0YWdfbWVtLT52YSA9IG1ieF9jbWRfbWVtLT52YTsKKwkJCXRhZ19tZW0tPmRtYSA9IG1ieF9jbWRfbWVtLT5kbWE7CisJCX0gZWxzZQorCQkJdGFnX21lbS0+c2l6ZSA9IDA7CisKIAkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsCiAJCQkgICAgQkVJU0NTSV9MT0dfSU5JVCB8IEJFSVNDU0lfTE9HX0VIIHwKIAkJCSAgICBCRUlTQ1NJX0xPR19DT05GSUcsCiAJCQkgICAgIkJDXyVkIDogTUJYIENtZCBDb21wbGV0aW9uIHRpbWVkIG91dFxuIik7Ci0JCXJjID0gLUVCVVNZOwotCi0JCS8qIGRlY3JlbWVudCB0aGUgbWNjcSB1c2VkIGNvdW50ICovCi0JCWF0b21pY19kZWMoJnBoYmEtPmN0cmwubWNjX29iai5xLnVzZWQpOwotCi0JCWdvdG8gcmVsZWFzZV9tY2NfdGFnOwotCX0gZWxzZQorCQlyZXR1cm4gLUVCVVNZOworCX0gZWxzZSB7CiAJCXJjID0gMDsKKwkJLyogU2V0IE1CWCBUYWcgc3RhdGUgdG8gY29tcGxldGVkICovCisJCXNwaW5fbG9jaygmcGhiYS0+Y3RybC5tYm94X2xvY2spOworCQlwaGJhLT5jdHJsLnB0YWdfc3RhdGVbdGFnXS50YWdfc3RhdGUgPSBNQ0NfVEFHX1NUQVRFX0NPTVBMRVRFRDsKKwkJc3Bpbl91bmxvY2soJnBoYmEtPmN0cmwubWJveF9sb2NrKTsKKwl9CiAKIAltY2NfdGFnX3Jlc3BvbnNlID0gcGhiYS0+Y3RybC5tY2NfbnVtdGFnW3RhZ107CiAJc3RhdHVzID0gKG1jY190YWdfcmVzcG9uc2UgJiBDUUVfU1RBVFVTX01BU0spOwogCWFkZGxfc3RhdHVzID0gKChtY2NfdGFnX3Jlc3BvbnNlICYgQ1FFX1NUQVRVU19BRERMX01BU0spID4+CiAJCQlDUUVfU1RBVFVTX0FERExfU0hJRlQpOwogCi0JaWYgKGNtZF9oZHIpIHsKLQkJaW9jdGxfaGRyID0gKHN0cnVjdCBiZV9jbWRfcmVxX2hkciAqKWNtZF9oZHI7CisJaWYgKG1ieF9jbWRfbWVtKSB7CisJCW1ieF9oZHIgPSAoc3RydWN0IGJlX2NtZF9yZXFfaGRyICopbWJ4X2NtZF9tZW0tPnZhOwogCX0gZWxzZSB7CiAJCXdyYl9udW0gPSAobWNjX3RhZ19yZXNwb25zZSAmIENRRV9TVEFUVVNfV1JCX01BU0spID4+CiAJCQkgICBDUUVfU1RBVFVTX1dSQl9TSElGVDsKIAkJdGVtcF93cmIgPSAoc3RydWN0IGJlX21jY193cmIgKilxdWV1ZV9nZXRfd3JiKG1jY3EsIHdyYl9udW0pOwotCQlpb2N0bF9oZHIgPSBlbWJlZGRlZF9wYXlsb2FkKHRlbXBfd3JiKTsKKwkJbWJ4X2hkciA9IGVtYmVkZGVkX3BheWxvYWQodGVtcF93cmIpOwogCiAJCWlmICh3cmIpCiAJCQkqd3JiID0gdGVtcF93cmI7CiAJfQogCiAJaWYgKHN0YXR1cyB8fCBhZGRsX3N0YXR1cykgewotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKKwkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLAogCQkJICAgIEJFSVNDU0lfTE9HX0lOSVQgfCBCRUlTQ1NJX0xPR19FSCB8CiAJCQkgICAgQkVJU0NTSV9MT0dfQ09ORklHLAogCQkJICAgICJCQ18lZCA6IE1CWCBDbWQgRmFpbGVkIGZvciAiCiAJCQkgICAgIlN1YnN5cyA6ICVkIE9wY29kZSA6ICVkIHdpdGggIgogCQkJICAgICJTdGF0dXMgOiAlZCBhbmQgRXh0ZF9TdGF0dXMgOiAlZFxuIiwKLQkJCSAgICBpb2N0bF9oZHItPnN1YnN5c3RlbSwKLQkJCSAgICBpb2N0bF9oZHItPm9wY29kZSwKKwkJCSAgICBtYnhfaGRyLT5zdWJzeXN0ZW0sCisJCQkgICAgbWJ4X2hkci0+b3Bjb2RlLAogCQkJICAgIHN0YXR1cywgYWRkbF9zdGF0dXMpOwogCiAJCWlmIChzdGF0dXMgPT0gTUNDX1NUQVRVU19JTlNVRkZJQ0lFTlRfQlVGRkVSKSB7Ci0JCQlpb2N0bF9yZXNwX2hkciA9IChzdHJ1Y3QgYmVfY21kX3Jlc3BfaGRyICopIGlvY3RsX2hkcjsKKwkJCW1ieF9yZXNwX2hkciA9IChzdHJ1Y3QgYmVfY21kX3Jlc3BfaGRyICopIG1ieF9oZHI7CiAJCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsCiAJCQkJICAgIEJFSVNDU0lfTE9HX0lOSVQgfCBCRUlTQ1NJX0xPR19FSCB8CiAJCQkJICAgIEJFSVNDU0lfTE9HX0NPTkZJRywKIAkJCQkgICAgIkJDXyVkIDogSW5zdWZmaWNlbnQgQnVmZmVyIEVycm9yICIKIAkJCQkgICAgIlJlc3BfTGVuIDogJWQgQWN0dWFsX1Jlc3BfTGVuIDogJWRcbiIsCi0JCQkJICAgIGlvY3RsX3Jlc3BfaGRyLT5yZXNwb25zZV9sZW5ndGgsCi0JCQkJICAgIGlvY3RsX3Jlc3BfaGRyLT5hY3R1YWxfcmVzcF9sZW4pOworCQkJCSAgICBtYnhfcmVzcF9oZHItPnJlc3BvbnNlX2xlbmd0aCwKKwkJCQkgICAgbWJ4X3Jlc3BfaGRyLT5hY3R1YWxfcmVzcF9sZW4pOwogCiAJCQlyYyA9IC1FQUdBSU47CiAJCQlnb3RvIHJlbGVhc2VfbWNjX3RhZzsKQEAgLTMxOSw2ICszMzksNyBAQAogaW50IGJlX21jY19jb21wbF9wcm9jZXNzX2lzcihzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLAogCQkJCSAgICBzdHJ1Y3QgYmVfbWNjX2NvbXBsICpjb21wbCkKIHsKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBwY2lfZ2V0X2RydmRhdGEoY3RybC0+cGRldik7CiAJdTE2IGNvbXBsX3N0YXR1cywgZXh0ZF9zdGF0dXM7CiAJdW5zaWduZWQgc2hvcnQgdGFnOwogCkBAIC0zMzgsNyArMzU5LDMyIEBACiAJY3RybC0+bWNjX251bXRhZ1t0YWddIHw9IChjb21wbC0+dGFnMCAmIDB4MDBGRjAwMDApOwogCWN0cmwtPm1jY19udW10YWdbdGFnXSB8PSAoZXh0ZF9zdGF0dXMgJiAweDAwMDAwMEZGKSA8PCA4OwogCWN0cmwtPm1jY19udW10YWdbdGFnXSB8PSAoY29tcGxfc3RhdHVzICYgMHgwMDAwMDBGRik7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjdHJsLT5tY2Nfd2FpdFt0YWddKTsKKworCWlmIChjdHJsLT5wdGFnX3N0YXRlW3RhZ10udGFnX3N0YXRlID09IE1DQ19UQUdfU1RBVEVfUlVOTklORykgeworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmN0cmwtPm1jY193YWl0W3RhZ10pOworCX0gZWxzZSBpZiAoY3RybC0+cHRhZ19zdGF0ZVt0YWddLnRhZ19zdGF0ZSA9PSBNQ0NfVEFHX1NUQVRFX1RJTUVPVVQpIHsKKwkJc3RydWN0IGJlX2RtYV9tZW0gKnRhZ19tZW07CisJCXRhZ19tZW0gPSAmY3RybC0+cHRhZ19zdGF0ZVt0YWddLnRhZ19tZW1fc3RhdGU7CisKKwkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLAorCQkJICAgIEJFSVNDU0lfTE9HX01CT1ggfCBCRUlTQ1NJX0xPR19JTklUIHwKKwkJCSAgICBCRUlTQ1NJX0xPR19DT05GSUcsCisJCQkgICAgIkJDXyVkIDogTUJYIENvbXBsZXRpb24gZm9yIHRpbWVvdXQgQ29tbWFuZCAiCisJCQkgICAgImZyb20gRldcbiIpOworCQkvKiBDaGVjayBpZiBtZW1vcnkgbmVlZHMgdG8gYmUgZnJlZWQgKi8KKwkJaWYgKHRhZ19tZW0tPnNpemUpCisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGN0cmwtPnBkZXYsIHRhZ19tZW0tPnNpemUsCisJCQkJCSAgICB0YWdfbWVtLT52YSwgdGFnX21lbS0+ZG1hKTsKKworCQkvKiBDaGFuZ2UgdGFnIHN0YXRlICovCisJCXNwaW5fbG9jaygmcGhiYS0+Y3RybC5tYm94X2xvY2spOworCQljdHJsLT5wdGFnX3N0YXRlW3RhZ10udGFnX3N0YXRlID0gTUNDX1RBR19TVEFURV9DT01QTEVURUQ7CisJCXNwaW5fdW5sb2NrKCZwaGJhLT5jdHJsLm1ib3hfbG9jayk7CisKKwkJLyogRnJlZSBNQ0MgVGFnICovCisJCWZyZWVfbWNjX3RhZyhjdHJsLCB0YWcpOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0zNTQsOCArNDAwLDIzIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIGJlMmlzY3NpX2ZhaWxfc2Vzc2lvbihzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKQorLyoqCisgKiBiZTJpc2NzaV9mYWlsX3Nlc3Npb24oKTogQ2xvc2luZyBzZXNzaW9uIHdpdGggYXBwcm9wcmlhdGUgZXJyb3IKKyAqIEBjbHNfc2Vzc2lvbjogcHRyIHRvIHNlc3Npb24KKyAqCisgKiBEZXBlbmRpbmcgb24gYWRhcHRlciBzdGF0ZSBhcHByb3ByaWF0ZSBlcnJvciBmbGFnIGlzIHBhc3NlZC4KKyAqKi8KK3ZvaWQgYmUyaXNjc2lfZmFpbF9zZXNzaW9uKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24pCiB7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBpc2NzaV9zZXNzaW9uX3RvX3Nob3N0KGNsc19zZXNzaW9uKTsKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBpc2NzaV9ob3N0X3ByaXYoc2hvc3QpOworCXVpbnQzMl90IGlzY3NpX2Vycl9mbGFnOworCisJaWYgKHBoYmEtPnN0YXRlICYgQkVfQURBUFRFUl9TVEFURV9TSFVURE9XTikKKwkJaXNjc2lfZXJyX2ZsYWcgPSBJU0NTSV9FUlJfSU5WQUxJRF9IT1NUOworCWVsc2UKKwkJaXNjc2lfZXJyX2ZsYWcgPSBJU0NTSV9FUlJfQ09OTl9GQUlMRUQ7CisKIAlpc2NzaV9zZXNzaW9uX2ZhaWx1cmUoY2xzX3Nlc3Npb24tPmRkX2RhdGEsIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7CiB9CiAKQEAgLTM4NiwxOCArNDQ3LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGJlaXNjc2lfY3Ffbm90aWZ5KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgdTE2IHFpZCwgYm9vbCBhcm0sCi0JCSAgICAgICB1MTYgbnVtX3BvcHBlZCkKLXsKLQl1MzIgdmFsID0gMDsKLQl2YWwgfD0gcWlkICYgREJfQ1FfUklOR19JRF9NQVNLOwotCWlmIChhcm0pCi0JCXZhbCB8PSAxIDw8IERCX0NRX1JFQVJNX1NISUZUOwotCXZhbCB8PSBudW1fcG9wcGVkIDw8IERCX0NRX05VTV9QT1BQRURfU0hJRlQ7Ci0JaW93cml0ZTMyKHZhbCwgcGhiYS0+ZGJfdmEgKyBEQl9DUV9PRkZTRVQpOwotfQotCi0KIGludCBiZWlzY3NpX3Byb2Nlc3NfbWNjKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKIHsKIAlzdHJ1Y3QgYmVfbWNjX2NvbXBsICpjb21wbDsKQEAgLTQyOCw3ICs0NzcsNyBAQAogCX0KIAogCWlmIChudW0pCi0JCWJlaXNjc2lfY3Ffbm90aWZ5KHBoYmEsIHBoYmEtPmN0cmwubWNjX29iai5jcS5pZCwgdHJ1ZSwgbnVtKTsKKwkJaHdpX3JpbmdfY3FfZGIocGhiYSwgcGhiYS0+Y3RybC5tY2Nfb2JqLmNxLmlkLCBudW0sIDEsIDApOwogCiAJc3Bpbl91bmxvY2tfYmgoJnBoYmEtPmN0cmwubWNjX2NxX2xvY2spOwogCXJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5oIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuaAppbmRleCA2MjdlYmJlLi43Y2Y3Zjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmgKQEAgLTEwMyw3ICsxMDMsNyBAQAogCiAvKioqKioqKioqKiBNQ0MgZG9vciBiZWxsICoqKioqKioqKioqKi8KICNkZWZpbmUgREJfTUNDUV9PRkZTRVQgMHgxNDAKLSNkZWZpbmUgREJfTUNDUV9SSU5HX0lEX01BU0sgMHg3RkYJCS8qIGJpdHMgMCAtIDEwICovCisjZGVmaW5lIERCX01DQ1FfUklOR19JRF9NQVNLIDB4RkZGRgkJLyogYml0cyAwIC0gMTUgKi8KIC8qIE51bWJlciBvZiBlbnRyaWVzIHBvc3RlZCAqLwogI2RlZmluZSBEQl9NQ0NRX05VTV9QT1NURURfU0hJRlQgMTYJCS8qIGJpdHMgMTYgLSAyOSAqLwogCkBAIC03MDksNyArNzA5LDggQEAKIHZvaWQgZnJlZV9tY2NfdGFnKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsIHVuc2lnbmVkIGludCB0YWcpOwogCiBpbnQgYmVpc2NzaV9tY2NxX2NvbXBsKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKLQkJCXVpbnQzMl90IHRhZywgc3RydWN0IGJlX21jY193cmIgKip3cmIsIHZvaWQgKmNtZF92YSk7CisJCQl1aW50MzJfdCB0YWcsIHN0cnVjdCBiZV9tY2Nfd3JiICoqd3JiLAorCQkJc3RydWN0IGJlX2RtYV9tZW0gKm1ieF9jbWRfbWVtKTsKIC8qSVNDU0kgRnVuY3R1aW9ucyAqLwogaW50IGJlX2NtZF9md19pbml0aWFsaXplKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwpOwogaW50IGJlX2NtZF9md191bmluaXQoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCk7CkBAIC0xMDE3LDggKzEwMTgsOCBAQAogCWludCAqdXNlcnNfZmluYWxfc3RhdHVzOwogfSBfX3BhY2tlZDsKIAotI2RlZmluZSBEQl9ERUZfUERVX1JJTkdfSURfTUFTSwkJMHgzRkYJLyogYml0cyAwIC0gOSAqLwotI2RlZmluZSBEQl9ERUZfUERVX0NRUFJPQ19NQVNLCQkweDNGRkYJLyogYml0cyAwIC0gOSAqLworI2RlZmluZSBEQl9ERUZfUERVX1JJTkdfSURfTUFTSwkweDNGRkYJLyogYml0cyAwIC0gMTMgKi8KKyNkZWZpbmUgREJfREVGX1BEVV9DUVBST0NfTUFTSwkJMHgzRkZGCS8qIGJpdHMgMTYgLSAyOSAqLwogI2RlZmluZSBEQl9ERUZfUERVX1JFQVJNX1NISUZUCQkxNAogI2RlZmluZSBEQl9ERUZfUERVX0VWRU5UX1NISUZUCQkxNQogI2RlZmluZSBEQl9ERUZfUERVX0NRUFJPQ19TSElGVAkJMTYKQEAgLTEzMTcsNCArMTMxOCw1IEBACiB2b2lkIGJlX2NtZF9oZHJfcHJlcGFyZShzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgKnJlcV9oZHIsCiAJCQl1OCBzdWJzeXN0ZW0sIHU4IG9wY29kZSwgaW50IGNtZF9sZW4pOwogCit2b2lkIGJlMmlzY3NpX2ZhaWxfc2Vzc2lvbihzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKTsKICNlbmRpZiAvKiAhQkVJU0NTSV9DTURTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5jIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmMKaW5kZXggODg5MDY2ZC4uYTNkZjQzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmMKQEAgLTc5Myw3ICs3OTMsNyBAQAogCQlpaG9zdC0+cG9ydF9zcGVlZCA9IElTQ1NJX1BPUlRfU1BFRURfMTBNQlBTOwogCQlicmVhazsKIAljYXNlIEJFMklTQ1NJX0xJTktfU1BFRURfMTAwTUJQUzoKLQkJaWhvc3QtPnBvcnRfc3BlZWQgPSBCRTJJU0NTSV9MSU5LX1NQRUVEXzEwME1CUFM7CisJCWlob3N0LT5wb3J0X3NwZWVkID0gSVNDU0lfUE9SVF9TUEVFRF8xMDBNQlBTOwogCQlicmVhazsKIAljYXNlIEJFMklTQ1NJX0xJTktfU1BFRURfMUdCUFM6CiAJCWlob3N0LT5wb3J0X3NwZWVkID0gSVNDU0lfUE9SVF9TUEVFRF8xR0JQUzsKQEAgLTExNTMsMTYgKzExNTMsMTggQEAKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogCi0JcmV0ID0gYmVpc2NzaV9tY2NxX2NvbXBsKHBoYmEsIHRhZywgTlVMTCwgbm9uZW1iX2NtZC52YSk7CisJcmV0ID0gYmVpc2NzaV9tY2NxX2NvbXBsKHBoYmEsIHRhZywgTlVMTCwgJm5vbmVtYl9jbWQpOwogCWlmIChyZXQpIHsKIAkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsCiAJCQkgICAgQkVJU0NTSV9MT0dfQ09ORklHIHwgQkVJU0NTSV9MT0dfTUJPWCwKIAkJCSAgICAiQlNfJWQgOiBtZ210X29wZW5fY29ubmVjdGlvbiBGYWlsZWQiKTsKIAotCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBoYmEtPmN0cmwucGRldiwgbm9uZW1iX2NtZC5zaXplLAotCQkJICAgIG5vbmVtYl9jbWQudmEsIG5vbmVtYl9jbWQuZG1hKTsKKwkJaWYgKHJldCAhPSAtRUJVU1kpCisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBoYmEtPmN0cmwucGRldiwgbm9uZW1iX2NtZC5zaXplLAorCQkJCQkgICAgbm9uZW1iX2NtZC52YSwgbm9uZW1iX2NtZC5kbWEpOworCiAJCWJlaXNjc2lfZnJlZV9lcChiZWlzY3NpX2VwKTsKLQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlwdGNwY25jdF9vdXQgPSAoc3RydWN0IHRjcF9jb25uZWN0X2FuZF9vZmZsb2FkX291dCAqKW5vbmVtYl9jbWQudmE7CkBAIC0xMzU5LDYgKzEzNjEsNyBAQAogCWJlaXNjc2lfbWNjcV9jb21wbChwaGJhLCB0YWcsIE5VTEwsIE5VTEwpOwogCWJlaXNjc2lfY2xvc2VfY29ubihiZWlzY3NpX2VwLCB0Y3BfdXBsb2FkX2ZsYWcpOwogZnJlZV9lcDoKKwltc2xlZXAoQkVJU0NTSV9MT0dPVVRfU1lOQ19ERUxBWSk7CiAJYmVpc2NzaV9mcmVlX2VwKGJlaXNjc2lfZXApOwogCWJlaXNjc2lfdW5iaW5kX2Nvbm5fdG9fY2lkKHBoYmEsIGJlaXNjc2lfZXAtPmVwX2NpZCk7CiAJaXNjc2lfZGVzdHJveV9lbmRwb2ludChiZWlzY3NpX2VwLT5vcGVuaXNjc2lfZXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uYyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmMKaW5kZXggNTY0MmE5Yi4uMGQ4MjIyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uYworKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5jCkBAIC0yMjgsMjQgKzIyOCwyNSBAQAogCXN0cnVjdCBpbnZhbGlkYXRlX2NvbW1hbmRfdGFibGUgKmludl90Ymw7CiAJc3RydWN0IGJlX2RtYV9tZW0gbm9uZW1iX2NtZDsKIAl1bnNpZ25lZCBpbnQgY2lkLCB0YWcsIG51bV9pbnZhbGlkYXRlOworCWludCByYzsKIAogCWNsc19zZXNzaW9uID0gc3RhcmdldF90b19zZXNzaW9uKHNjc2lfdGFyZ2V0KHNjLT5kZXZpY2UpKTsKIAlzZXNzaW9uID0gY2xzX3Nlc3Npb24tPmRkX2RhdGE7CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlpZiAoIWFib3J0ZWRfdGFzayB8fCAhYWJvcnRlZF90YXNrLT5zYykgewogCQkvKiB3ZSByYWNlZCAqLwotCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCQlyZXR1cm4gU1VDQ0VTUzsKIAl9CiAKIAlhYm9ydGVkX2lvX3Rhc2sgPSBhYm9ydGVkX3Rhc2stPmRkX2RhdGE7CiAJaWYgKCFhYm9ydGVkX2lvX3Rhc2stPnNjc2lfY21uZCkgewogCQkvKiByYWNlZCBvciBpbnZhbGlkIGNvbW1hbmQgKi8KLQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJcmV0dXJuIFNVQ0NFU1M7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkvKiBJbnZhbGlkYXRlIFdSQiBQb3N0ZWQgZm9yIHRoaXMgVGFzayAqLwogCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBpbnZsZCwKIAkJICAgICAgYWJvcnRlZF9pb190YXNrLT5wd3JiX2hhbmRsZS0+cHdyYiwKQEAgLTI4NSw5ICsyODYsMTEgQEAKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CiAKLQliZWlzY3NpX21jY3FfY29tcGwocGhiYSwgdGFnLCBOVUxMLCBub25lbWJfY21kLnZhKTsKLQlwY2lfZnJlZV9jb25zaXN0ZW50KHBoYmEtPmN0cmwucGRldiwgbm9uZW1iX2NtZC5zaXplLAotCQkJICAgIG5vbmVtYl9jbWQudmEsIG5vbmVtYl9jbWQuZG1hKTsKKwlyYyA9IGJlaXNjc2lfbWNjcV9jb21wbChwaGJhLCB0YWcsIE5VTEwsICZub25lbWJfY21kKTsKKwlpZiAocmMgIT0gLUVCVVNZKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBoYmEtPmN0cmwucGRldiwgbm9uZW1iX2NtZC5zaXplLAorCQkJCSAgICBub25lbWJfY21kLnZhLCBub25lbWJfY21kLmRtYSk7CisKIAlyZXR1cm4gaXNjc2lfZWhfYWJvcnQoc2MpOwogfQogCkBAIC0zMDMsMTMgKzMwNiwxNCBAQAogCXN0cnVjdCBpbnZhbGlkYXRlX2NvbW1hbmRfdGFibGUgKmludl90Ymw7CiAJc3RydWN0IGJlX2RtYV9tZW0gbm9uZW1iX2NtZDsKIAl1bnNpZ25lZCBpbnQgY2lkLCB0YWcsIGksIG51bV9pbnZhbGlkYXRlOworCWludCByYzsKIAogCS8qIGludmFsaWRhdGUgaW9jYnMgKi8KIAljbHNfc2Vzc2lvbiA9IHN0YXJnZXRfdG9fc2Vzc2lvbihzY3NpX3RhcmdldChzYy0+ZGV2aWNlKSk7CiAJc2Vzc2lvbiA9IGNsc19zZXNzaW9uLT5kZF9kYXRhOwotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWlmICghc2Vzc2lvbi0+bGVhZGNvbm4gfHwgc2Vzc2lvbi0+c3RhdGUgIT0gSVNDU0lfU1RBVEVfTE9HR0VEX0lOKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCXJldHVybiBGQUlMRUQ7CiAJfQogCWNvbm4gPSBzZXNzaW9uLT5sZWFkY29ubjsKQEAgLTMzOCw3ICszNDIsNyBAQAogCQludW1faW52YWxpZGF0ZSsrOwogCQlpbnZfdGJsKys7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlpbnZfdGJsID0gcGhiYS0+aW52X3RibDsKIAogCW5vbmVtYl9jbWQudmEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwaGJhLT5jdHJsLnBkZXYsCkBAIC0zNjMsOSArMzY3LDEwIEBACiAJCXJldHVybiBGQUlMRUQ7CiAJfQogCi0JYmVpc2NzaV9tY2NxX2NvbXBsKHBoYmEsIHRhZywgTlVMTCwgbm9uZW1iX2NtZC52YSk7Ci0JcGNpX2ZyZWVfY29uc2lzdGVudChwaGJhLT5jdHJsLnBkZXYsIG5vbmVtYl9jbWQuc2l6ZSwKLQkJCSAgICBub25lbWJfY21kLnZhLCBub25lbWJfY21kLmRtYSk7CisJcmMgPSBiZWlzY3NpX21jY3FfY29tcGwocGhiYSwgdGFnLCBOVUxMLCAmbm9uZW1iX2NtZCk7CisJaWYgKHJjICE9IC1FQlVTWSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwaGJhLT5jdHJsLnBkZXYsIG5vbmVtYl9jbWQuc2l6ZSwKKwkJCQkgICAgbm9uZW1iX2NtZC52YSwgbm9uZW1iX2NtZC5kbWEpOwogCXJldHVybiBpc2NzaV9laF9kZXZpY2VfcmVzZXQoc2MpOwogfQogCkBAIC02NzQsOCArNjc5LDE5IEBACiAJfQogCiAJcGNpX3NldF9tYXN0ZXIocGNpZGV2KTsKLQlpZiAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaWRldiwgRE1BX0JJVF9NQVNLKDY0KSkpIHsKLQkJcmV0ID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaWRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJcmV0ID0gcGNpX3NldF9kbWFfbWFzayhwY2lkZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCWlmIChyZXQpIHsKKwkJcmV0ID0gcGNpX3NldF9kbWFfbWFzayhwY2lkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgIkNvdWxkIG5vdCBzZXQgUENJIERNQSBNYXNrXG4iKTsKKwkJCXBjaV9kaXNhYmxlX2RldmljZShwY2lkZXYpOworCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2lkZXYsCisJCQkJCQkJICBETUFfQklUX01BU0soMzIpKTsKKwkJfQorCX0gZWxzZSB7CisJCXJldCA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2lkZXYsIERNQV9CSVRfTUFTSyg2NCkpOwogCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgIkNvdWxkIG5vdCBzZXQgUENJIERNQSBNYXNrXG4iKTsKIAkJCXBjaV9kaXNhYmxlX2RldmljZShwY2lkZXYpOwpAQCAtODA0LDE0ICs4MjAsMjMgQEAKIAkJCSAgIHVuc2lnbmVkIGNoYXIgcmVhcm0sIHVuc2lnbmVkIGNoYXIgZXZlbnQpCiB7CiAJdTMyIHZhbCA9IDA7Ci0JdmFsIHw9IGlkICYgREJfRVFfUklOR19JRF9NQVNLOworCiAJaWYgKHJlYXJtKQogCQl2YWwgfD0gMSA8PCBEQl9FUV9SRUFSTV9TSElGVDsKIAlpZiAoY2xyX2ludGVycnVwdCkKIAkJdmFsIHw9IDEgPDwgREJfRVFfQ0xSX1NISUZUOwogCWlmIChldmVudCkKIAkJdmFsIHw9IDEgPDwgREJfRVFfRVZOVF9TSElGVDsKKwogCXZhbCB8PSBudW1fcHJvY2Vzc2VkIDw8IERCX0VRX05VTV9QT1BQRURfU0hJRlQ7CisJLyogU2V0dGluZyBsb3dlciBvcmRlciBFUV9JRCBCaXRzICovCisJdmFsIHw9IChpZCAmIERCX0VRX1JJTkdfSURfTE9XX01BU0spOworCisJLyogU2V0dGluZyBIaWdoZXIgb3JkZXIgRVFfSUQgQml0cyAqLworCXZhbCB8PSAoKChpZCA+PiBEQl9FUV9ISUdIX0ZFSUxEX1NISUZUKSAmCisJCSAgREJfRVFfUklOR19JRF9ISUdIX01BU0spCisJCSAgPDwgREJfRVFfSElHSF9TRVRfU0hJRlQpOworCiAJaW93cml0ZTMyKHZhbCwgcGhiYS0+ZGJfdmEgKyBEQl9FUV9PRkZTRVQpOwogfQogCkBAIC04NzMsNyArODk4LDYgQEAKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqY3E7CiAJdW5zaWduZWQgaW50IG51bV9lcV9wcm9jZXNzZWQ7CiAJc3RydWN0IGJlX2VxX29iaiAqcGJlX2VxOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlwYmVfZXEgPSBkZXZfaWQ7CiAJZXEgPSAmcGJlX2VxLT5xOwpAQCAtODgyLDMxICs5MDYsMTUgQEAKIAogCXBoYmEgPSBwYmVfZXEtPnBoYmE7CiAJbnVtX2VxX3Byb2Nlc3NlZCA9IDA7Ci0JaWYgKGJsa19pb3BvbGxfZW5hYmxlZCkgewotCQl3aGlsZSAoZXFlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQpIC8gMzJdCi0JCQkJCSYgRVFFX1ZBTElEX01BU0spIHsKLQkJCWlmICghYmxrX2lvcG9sbF9zY2hlZF9wcmVwKCZwYmVfZXEtPmlvcG9sbCkpCi0JCQkJYmxrX2lvcG9sbF9zY2hlZCgmcGJlX2VxLT5pb3BvbGwpOworCXdoaWxlIChlcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCkgLyAzMl0KKwkJCQkmIEVRRV9WQUxJRF9NQVNLKSB7CisJCWlmICghYmxrX2lvcG9sbF9zY2hlZF9wcmVwKCZwYmVfZXEtPmlvcG9sbCkpCisJCQlibGtfaW9wb2xsX3NjaGVkKCZwYmVfZXEtPmlvcG9sbCk7CiAKLQkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfZXFfZW50cnksIHZhbGlkLCBlcWUsIDApOwotCQkJcXVldWVfdGFpbF9pbmMoZXEpOwotCQkJZXFlID0gcXVldWVfdGFpbF9ub2RlKGVxKTsKLQkJCW51bV9lcV9wcm9jZXNzZWQrKzsKLQkJfQotCX0gZWxzZSB7Ci0JCXdoaWxlIChlcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCkgLyAzMl0KLQkJCQkJCSYgRVFFX1ZBTElEX01BU0spIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOwotCQkJcGJlX2VxLT50b2RvX2NxID0gdHJ1ZTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7Ci0JCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCwgZXFlLCAwKTsKLQkJCXF1ZXVlX3RhaWxfaW5jKGVxKTsKLQkJCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7Ci0JCQludW1fZXFfcHJvY2Vzc2VkKys7Ci0JCX0KLQotCQlpZiAocGJlX2VxLT50b2RvX2NxKQotCQkJcXVldWVfd29yayhwaGJhLT53cSwgJnBiZV9lcS0+d29ya19jcXMpOworCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCwgZXFlLCAwKTsKKwkJcXVldWVfdGFpbF9pbmMoZXEpOworCQllcWUgPSBxdWV1ZV90YWlsX25vZGUoZXEpOworCQludW1fZXFfcHJvY2Vzc2VkKys7CiAJfQogCiAJaWYgKG51bV9lcV9wcm9jZXNzZWQpCkBAIC05MjcsNyArOTM1LDYgQEAKIAlzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQ7CiAJc3RydWN0IGJlX2VxX2VudHJ5ICplcWUgPSBOVUxMOwogCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICplcTsKLQlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqY3E7CiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gKm1jYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBpbmRleDsKIAl1bnNpZ25lZCBpbnQgbnVtX21jY2VxX3Byb2Nlc3NlZCwgbnVtX2lvZXFfcHJvY2Vzc2VkOwpAQCAtOTUzLDcyICs5NjAsNDAgQEAKIAogCW51bV9pb2VxX3Byb2Nlc3NlZCA9IDA7CiAJbnVtX21jY2VxX3Byb2Nlc3NlZCA9IDA7Ci0JaWYgKGJsa19pb3BvbGxfZW5hYmxlZCkgewotCQl3aGlsZSAoZXFlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQpIC8gMzJdCi0JCQkJCSYgRVFFX1ZBTElEX01BU0spIHsKLQkJCWlmICgoKGVxZS0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfZXFfZW50cnksCi0JCQkgICAgIHJlc291cmNlX2lkKSAvIDMyXSAmCi0JCQkgICAgIEVRRV9SRVNJRF9NQVNLKSA+PiAxNikgPT0gbWNjLT5pZCkgewotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOwotCQkJCXBiZV9lcS0+dG9kb19tY2NfY3EgPSB0cnVlOwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7Ci0JCQkJbnVtX21jY2VxX3Byb2Nlc3NlZCsrOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIWJsa19pb3BvbGxfc2NoZWRfcHJlcCgmcGJlX2VxLT5pb3BvbGwpKQotCQkJCQlibGtfaW9wb2xsX3NjaGVkKCZwYmVfZXEtPmlvcG9sbCk7Ci0JCQkJbnVtX2lvZXFfcHJvY2Vzc2VkKys7Ci0JCQl9Ci0JCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCwgZXFlLCAwKTsKLQkJCXF1ZXVlX3RhaWxfaW5jKGVxKTsKLQkJCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7Ci0JCX0KLQkJaWYgKG51bV9pb2VxX3Byb2Nlc3NlZCB8fCBudW1fbWNjZXFfcHJvY2Vzc2VkKSB7Ci0JCQlpZiAocGJlX2VxLT50b2RvX21jY19jcSkKLQkJCQlxdWV1ZV93b3JrKHBoYmEtPndxLCAmcGJlX2VxLT53b3JrX2Nxcyk7Ci0KLQkJCWlmICgobnVtX21jY2VxX3Byb2Nlc3NlZCkgJiYgKCFudW1faW9lcV9wcm9jZXNzZWQpKQotCQkJCWh3aV9yaW5nX2VxX2RiKHBoYmEsIGVxLT5pZCwgMCwKLQkJCQkJICAgICAgKG51bV9pb2VxX3Byb2Nlc3NlZCArCi0JCQkJCSAgICAgICBudW1fbWNjZXFfcHJvY2Vzc2VkKSAsIDEsIDEpOwotCQkJZWxzZQotCQkJCWh3aV9yaW5nX2VxX2RiKHBoYmEsIGVxLT5pZCwgMCwKLQkJCQkJICAgICAgIChudW1faW9lcV9wcm9jZXNzZWQgKwotCQkJCQkJbnVtX21jY2VxX3Byb2Nlc3NlZCksIDAsIDEpOwotCi0JCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIElSUV9OT05FOwotCX0gZWxzZSB7Ci0JCWNxID0gJnBod2lfY29udGV4dC0+YmVfY3FbMF07Ci0JCXdoaWxlIChlcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCkgLyAzMl0KLQkJCQkJCSYgRVFFX1ZBTElEX01BU0spIHsKLQotCQkJaWYgKCgoZXFlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwKLQkJCSAgICAgcmVzb3VyY2VfaWQpIC8gMzJdICYKLQkJCSAgICAgRVFFX1JFU0lEX01BU0spID4+IDE2KSAhPSBjcS0+aWQpIHsKLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aXNyX2xvY2ssIGZsYWdzKTsKLQkJCQlwYmVfZXEtPnRvZG9fbWNjX2NxID0gdHJ1ZTsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOwotCQkJfSBlbHNlIHsKLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aXNyX2xvY2ssIGZsYWdzKTsKLQkJCQlwYmVfZXEtPnRvZG9fY3EgPSB0cnVlOwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7Ci0JCQl9Ci0JCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCwgZXFlLCAwKTsKLQkJCXF1ZXVlX3RhaWxfaW5jKGVxKTsKLQkJCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7CisJd2hpbGUgKGVxZS0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfZXFfZW50cnksIHZhbGlkKSAvIDMyXQorCQkJCSYgRVFFX1ZBTElEX01BU0spIHsKKwkJaWYgKCgoZXFlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwKKwkJICAgICByZXNvdXJjZV9pZCkgLyAzMl0gJgorCQkgICAgIEVRRV9SRVNJRF9NQVNLKSA+PiAxNikgPT0gbWNjLT5pZCkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7CisJCQlwYmVfZXEtPnRvZG9fbWNjX2NxID0gdHJ1ZTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7CisJCQludW1fbWNjZXFfcHJvY2Vzc2VkKys7CisJCX0gZWxzZSB7CisJCQlpZiAoIWJsa19pb3BvbGxfc2NoZWRfcHJlcCgmcGJlX2VxLT5pb3BvbGwpKQorCQkJCWJsa19pb3BvbGxfc2NoZWQoJnBiZV9lcS0+aW9wb2xsKTsKIAkJCW51bV9pb2VxX3Byb2Nlc3NlZCsrOwogCQl9Ci0JCWlmIChwYmVfZXEtPnRvZG9fY3EgfHwgcGJlX2VxLT50b2RvX21jY19jcSkKKwkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQsIGVxZSwgMCk7CisJCXF1ZXVlX3RhaWxfaW5jKGVxKTsKKwkJZXFlID0gcXVldWVfdGFpbF9ub2RlKGVxKTsKKwl9CisJaWYgKG51bV9pb2VxX3Byb2Nlc3NlZCB8fCBudW1fbWNjZXFfcHJvY2Vzc2VkKSB7CisJCWlmIChwYmVfZXEtPnRvZG9fbWNjX2NxKQogCQkJcXVldWVfd29yayhwaGJhLT53cSwgJnBiZV9lcS0+d29ya19jcXMpOwogCi0JCWlmIChudW1faW9lcV9wcm9jZXNzZWQpIHsKKwkJaWYgKChudW1fbWNjZXFfcHJvY2Vzc2VkKSAmJiAoIW51bV9pb2VxX3Byb2Nlc3NlZCkpCiAJCQlod2lfcmluZ19lcV9kYihwaGJhLCBlcS0+aWQsIDAsCi0JCQkJICAgICAgIG51bV9pb2VxX3Byb2Nlc3NlZCwgMSwgMSk7Ci0JCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIElSUV9OT05FOwotCX0KKwkJCQkgICAgICAobnVtX2lvZXFfcHJvY2Vzc2VkICsKKwkJCQkgICAgICAgbnVtX21jY2VxX3Byb2Nlc3NlZCkgLCAxLCAxKTsKKwkJZWxzZQorCQkJaHdpX3JpbmdfZXFfZGIocGhiYSwgZXEtPmlkLCAwLAorCQkJCSAgICAgICAobnVtX2lvZXFfcHJvY2Vzc2VkICsKKwkJCQkJbnVtX21jY2VxX3Byb2Nlc3NlZCksIDAsIDEpOworCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9IGVsc2UKKwkJcmV0dXJuIElSUV9OT05FOwogfQogCiBzdGF0aWMgaW50IGJlaXNjc2lfaW5pdF9pcnFzKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKQEAgLTEwOTMsMTUgKzEwNjgsMjUgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBod2lfcmluZ19jcV9kYihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCit2b2lkIGh3aV9yaW5nX2NxX2RiKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKIAkJCSAgIHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IG51bV9wcm9jZXNzZWQsCiAJCQkgICB1bnNpZ25lZCBjaGFyIHJlYXJtLCB1bnNpZ25lZCBjaGFyIGV2ZW50KQogewogCXUzMiB2YWwgPSAwOwotCXZhbCB8PSBpZCAmIERCX0NRX1JJTkdfSURfTUFTSzsKKwogCWlmIChyZWFybSkKIAkJdmFsIHw9IDEgPDwgREJfQ1FfUkVBUk1fU0hJRlQ7CisKIAl2YWwgfD0gbnVtX3Byb2Nlc3NlZCA8PCBEQl9DUV9OVU1fUE9QUEVEX1NISUZUOworCisJLyogU2V0dGluZyBsb3dlciBvcmRlciBDUV9JRCBCaXRzICovCisJdmFsIHw9IChpZCAmIERCX0NRX1JJTkdfSURfTE9XX01BU0spOworCisJLyogU2V0dGluZyBIaWdoZXIgb3JkZXIgQ1FfSUQgQml0cyAqLworCXZhbCB8PSAoKChpZCA+PiBEQl9DUV9ISUdIX0ZFSUxEX1NISUZUKSAmCisJCSAgREJfQ1FfUklOR19JRF9ISUdIX01BU0spCisJCSAgPDwgREJfQ1FfSElHSF9TRVRfU0hJRlQpOworCiAJaW93cml0ZTMyKHZhbCwgcGhiYS0+ZGJfdmEgKyBEQl9DUV9PRkZTRVQpOwogfQogCkBAIC0xMTUwLDkgKzExMzUsOSBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAlfX2lzY3NpX2NvbXBsZXRlX3BkdShjb25uLCAoc3RydWN0IGlzY3NpX2hkciAqKXBwZHUsIHBidWZmZXIsIGJ1Zl9sZW4pOwotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM0Miw4ICsxMzI3LDEwIEBACiAJcmVzaWQgPSBjc29sX2NxZS0+cmVzX2NudDsKIAogCWlmICghdGFzay0+c2MpIHsKLQkJaWYgKGlvX3Rhc2stPnNjc2lfY21uZCkKKwkJaWYgKGlvX3Rhc2stPnNjc2lfY21uZCkgewogCQkJc2NzaV9kbWFfdW5tYXAoaW9fdGFzay0+c2NzaV9jbW5kKTsKKwkJCWlvX3Rhc2stPnNjc2lfY21uZCA9IE5VTEw7CisJCX0KIAogCQlyZXR1cm47CiAJfQpAQCAtMTM4MCw2ICsxMzY3LDcgQEAKIAkJY29ubi0+cnhkYXRhX29jdGV0cyArPSByZXNpZDsKIHVubWFwOgogCXNjc2lfZG1hX3VubWFwKGlvX3Rhc2stPnNjc2lfY21uZCk7CisJaW9fdGFzay0+c2NzaV9jbW5kID0gTlVMTDsKIAlpc2NzaV9jb21wbGV0ZV9zY3NpX3Rhc2sodGFzaywgZXhwX2NtZHNuLCBtYXhfY21kc24pOwogfQogCkBAIC0xNTY4LDcgKzE1NTYsNyBAQAogCXB3cmIgPSBwd3JiX2hhbmRsZS0+cHdyYjsKIAl0eXBlID0gKChzdHJ1Y3QgYmVpc2NzaV9pb190YXNrICopdGFzay0+ZGRfZGF0YSktPndyYl90eXBlOwogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBIV0hfVFlQRV9JTzoKIAljYXNlIEhXSF9UWVBFX0lPX1JEOgpAQCAtMTYwNyw3ICsxNTk1LDcgQEAKIAkJYnJlYWs7CiAJfQogCi0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogfQogCiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqaHdpX2dldF9hc3luY19idXN5X2xpc3Qoc3RydWN0IGh3aV9hc3luY19wZHVfY29udGV4dApAQCAtNDM2MCwxMiArNDM0OCwxNiBAQAogCQlnb3RvIGJvb3RfZnJlZW1lbTsKIAl9CiAKLQlyZXQgPSBiZWlzY3NpX21jY3FfY29tcGwocGhiYSwgdGFnLCBOVUxMLCBub25lbWJfY21kLnZhKTsKKwlyZXQgPSBiZWlzY3NpX21jY3FfY29tcGwocGhiYSwgdGFnLCBOVUxMLCAmbm9uZW1iX2NtZCk7CiAJaWYgKHJldCkgewogCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKIAkJCSAgICBCRUlTQ1NJX0xPR19JTklUIHwgQkVJU0NTSV9MT0dfQ09ORklHLAogCQkJICAgICJCTV8lZCA6IGJlaXNjc2lfZ2V0X3Nlc3Npb25faW5mbyBGYWlsZWQiKTsKLQkJZ290byBib290X2ZyZWVtZW07CisKKwkJaWYgKHJldCAhPSAtRUJVU1kpCisJCQlnb3RvIGJvb3RfZnJlZW1lbTsKKwkJZWxzZQorCQkJcmV0dXJuIHJldDsKIAl9CiAKIAlzZXNzaW9uX3Jlc3AgPSBub25lbWJfY21kLnZhIDsKQEAgLTQ2MjUsNiArNDYxNywxMSBAQAogCQkJc3Bpbl91bmxvY2soJnBoYmEtPmlvX3NnbF9sb2NrKTsKIAkJCWlvX3Rhc2stPnBzZ2xfaGFuZGxlID0gTlVMTDsKIAkJfQorCisJCWlmIChpb190YXNrLT5zY3NpX2NtbmQpIHsKKwkJCXNjc2lfZG1hX3VubWFwKGlvX3Rhc2stPnNjc2lfY21uZCk7CisJCQlpb190YXNrLT5zY3NpX2NtbmQgPSBOVUxMOworCQl9CiAJfSBlbHNlIHsKIAkJaWYgKCFiZWlzY3NpX2Nvbm4tPmxvZ2luX2luX3Byb2dyZXNzKQogCQkJYmVpc2NzaV9mcmVlX21nbXRfdGFza19oYW5kbGVzKGJlaXNjc2lfY29ubiwgdGFzayk7CkBAIC00NjQ2LDkgKzQ2NDMsOSBAQAogCSAqIGxvZ2luL3N0YXJ0dXAgcmVsYXRlZCB0YXNrcy4KIAkgKi8KIAliZWlzY3NpX2Nvbm4tPmxvZ2luX2luX3Byb2dyZXNzID0gMDsKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAliZWlzY3NpX2NsZWFudXBfdGFzayh0YXNrKTsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiAKIAlwd3JiX2hhbmRsZSA9IGFsbG9jX3dyYl9oYW5kbGUocGhiYSwgYmVpc2NzaV9jb25uLT5iZWlzY3NpX2Nvbm5fY2lkKTsKIApAQCAtNTIxNiwxMSArNTIxMywxMCBAQAogCQl9CiAJcGNpX2Rpc2FibGVfbXNpeChwaGJhLT5wY2lkZXYpOwogCi0JaWYgKGJsa19pb3BvbGxfZW5hYmxlZCkKLQkJZm9yIChpID0gMDsgaSA8IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKLQkJCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldOwotCQkJYmxrX2lvcG9sbF9kaXNhYmxlKCZwYmVfZXEtPmlvcG9sbCk7Ci0JCX0KKwlmb3IgKGkgPSAwOyBpIDwgcGhiYS0+bnVtX2NwdXM7IGkrKykgeworCQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXTsKKwkJYmxrX2lvcG9sbF9kaXNhYmxlKCZwYmVfZXEtPmlvcG9sbCk7CisJfQogCiAJaWYgKHVubG9hZF9zdGF0ZSA9PSBCRUlTQ1NJX0NMRUFOX1VOTE9BRCkgewogCQlkZXN0cm95X3dvcmtxdWV1ZShwaGJhLT53cSk7CkBAIC01MjczLDYgKzUyNjksOCBAQAogCQlyZXR1cm47CiAJfQogCisJcGhiYS0+c3RhdGUgPSBCRV9BREFQVEVSX1NUQVRFX1NIVVRET1dOOworCWlzY3NpX2hvc3RfZm9yX2VhY2hfc2Vzc2lvbihwaGJhLT5zaG9zdCwgYmUyaXNjc2lfZmFpbF9zZXNzaW9uKTsKIAliZWlzY3NpX3F1aWVzY2UocGhiYSwgQkVJU0NTSV9DTEVBTl9VTkxPQUQpOwogCXBjaV9kaXNhYmxlX2RldmljZShwY2lkZXYpOwogfQpAQCAtNTQyOSwzMiArNTQyNywxOCBAQAogCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOwogCXBod2lfY29udGV4dCA9IHBod2lfY3RybHItPnBod2lfY3R4dDsKIAotCWlmIChibGtfaW9wb2xsX2VuYWJsZWQpIHsKLQkJZm9yIChpID0gMDsgaSA8IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKLQkJCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldOwotCQkJYmxrX2lvcG9sbF9pbml0KCZwYmVfZXEtPmlvcG9sbCwgYmVfaW9wb2xsX2J1ZGdldCwKLQkJCQkJYmVfaW9wb2xsKTsKLQkJCWJsa19pb3BvbGxfZW5hYmxlKCZwYmVfZXEtPmlvcG9sbCk7Ci0JCX0KLQotCQlpID0gKHBoYmEtPm1zaXhfZW5hYmxlZCkgPyBpIDogMDsKLQkJLyogV29yayBpdGVtIGZvciBNQ0MgaGFuZGxpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGhiYS0+bnVtX2NwdXM7IGkrKykgewogCQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXTsKLQkJSU5JVF9XT1JLKCZwYmVfZXEtPndvcmtfY3FzLCBiZWlzY3NpX3Byb2Nlc3NfYWxsX2Nxcyk7Ci0JfSBlbHNlIHsKLQkJaWYgKHBoYmEtPm1zaXhfZW5hYmxlZCkgewotCQkJZm9yIChpID0gMDsgaSA8PSBwaGJhLT5udW1fY3B1czsgaSsrKSB7Ci0JCQkJcGJlX2VxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV07Ci0JCQkJSU5JVF9XT1JLKCZwYmVfZXEtPndvcmtfY3FzLAotCQkJCQkgIGJlaXNjc2lfcHJvY2Vzc19hbGxfY3FzKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxWzBdOwotCQkJSU5JVF9XT1JLKCZwYmVfZXEtPndvcmtfY3FzLAotCQkJCSAgYmVpc2NzaV9wcm9jZXNzX2FsbF9jcXMpOwotCQl9CisJCWJsa19pb3BvbGxfaW5pdCgmcGJlX2VxLT5pb3BvbGwsIGJlX2lvcG9sbF9idWRnZXQsCisJCQkJYmVfaW9wb2xsKTsKKwkJYmxrX2lvcG9sbF9lbmFibGUoJnBiZV9lcS0+aW9wb2xsKTsKIAl9CiAKKwlpID0gKHBoYmEtPm1zaXhfZW5hYmxlZCkgPyBpIDogMDsKKwkvKiBXb3JrIGl0ZW0gZm9yIE1DQyBoYW5kbGluZyAqLworCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldOworCUlOSVRfV09SSygmcGJlX2VxLT53b3JrX2NxcywgYmVpc2NzaV9wcm9jZXNzX2FsbF9jcXMpOworCiAJcmV0ID0gYmVpc2NzaV9pbml0X2lycXMocGhiYSk7CiAJaWYgKHJldCA8IDApIHsKIAkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0lOSVQsCkBAIC01NTk0LDYgKzU1NzgsOCBAQAogCQlwaGJhLT5jdHJsLm1jY190YWdbaV0gPSBpICsgMTsKIAkJcGhiYS0+Y3RybC5tY2NfbnVtdGFnW2kgKyAxXSA9IDA7CiAJCXBoYmEtPmN0cmwubWNjX3RhZ19hdmFpbGFibGUrKzsKKwkJbWVtc2V0KCZwaGJhLT5jdHJsLnB0YWdfc3RhdGVbaV0udGFnX21lbV9zdGF0ZSwgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgYmVpc2NzaV9tY2NfdGFnX3N0YXRlKSk7CiAJfQogCiAJcGhiYS0+Y3RybC5tY2NfYWxsb2NfaW5kZXggPSBwaGJhLT5jdHJsLm1jY19mcmVlX2luZGV4ID0gMDsKQEAgLTU2MTQsMzIgKzU2MDAsMTggQEAKIAlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKIAlwaHdpX2NvbnRleHQgPSBwaHdpX2N0cmxyLT5waHdpX2N0eHQ7CiAKLQlpZiAoYmxrX2lvcG9sbF9lbmFibGVkKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBwaGJhLT5udW1fY3B1czsgaSsrKSB7Ci0JCQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXTsKLQkJCWJsa19pb3BvbGxfaW5pdCgmcGJlX2VxLT5pb3BvbGwsIGJlX2lvcG9sbF9idWRnZXQsCi0JCQkJCWJlX2lvcG9sbCk7Ci0JCQlibGtfaW9wb2xsX2VuYWJsZSgmcGJlX2VxLT5pb3BvbGwpOwotCQl9Ci0KLQkJaSA9IChwaGJhLT5tc2l4X2VuYWJsZWQpID8gaSA6IDA7Ci0JCS8qIFdvcmsgaXRlbSBmb3IgTUNDIGhhbmRsaW5nICovCisJZm9yIChpID0gMDsgaSA8IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKIAkJcGJlX2VxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV07Ci0JCUlOSVRfV09SSygmcGJlX2VxLT53b3JrX2NxcywgYmVpc2NzaV9wcm9jZXNzX2FsbF9jcXMpOwotCX0gZWxzZSB7Ci0JCWlmIChwaGJhLT5tc2l4X2VuYWJsZWQpIHsKLQkJCWZvciAoaSA9IDA7IGkgPD0gcGhiYS0+bnVtX2NwdXM7IGkrKykgewotCQkJCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldOwotCQkJCUlOSVRfV09SSygmcGJlX2VxLT53b3JrX2NxcywKLQkJCQkJICBiZWlzY3NpX3Byb2Nlc3NfYWxsX2Nxcyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkJcGJlX2VxID0gJnBod2lfY29udGV4dC0+YmVfZXFbMF07Ci0JCQkJSU5JVF9XT1JLKCZwYmVfZXEtPndvcmtfY3FzLAotCQkJCQkgIGJlaXNjc2lfcHJvY2Vzc19hbGxfY3FzKTsKLQkJCX0KKwkJYmxrX2lvcG9sbF9pbml0KCZwYmVfZXEtPmlvcG9sbCwgYmVfaW9wb2xsX2J1ZGdldCwKKwkJCQliZV9pb3BvbGwpOworCQlibGtfaW9wb2xsX2VuYWJsZSgmcGJlX2VxLT5pb3BvbGwpOwogCX0KIAorCWkgPSAocGhiYS0+bXNpeF9lbmFibGVkKSA/IGkgOiAwOworCS8qIFdvcmsgaXRlbSBmb3IgTUNDIGhhbmRsaW5nICovCisJcGJlX2VxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV07CisJSU5JVF9XT1JLKCZwYmVfZXEtPndvcmtfY3FzLCBiZWlzY3NpX3Byb2Nlc3NfYWxsX2Nxcyk7CisKIAlyZXQgPSBiZWlzY3NpX2luaXRfaXJxcyhwaGJhKTsKIAlpZiAocmV0IDwgMCkgewogCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSU5JVCwKQEAgLTU2NjgsMTEgKzU2NDAsMTAgQEAKIAogZnJlZV9ibGtlbmJsZDoKIAlkZXN0cm95X3dvcmtxdWV1ZShwaGJhLT53cSk7Ci0JaWYgKGJsa19pb3BvbGxfZW5hYmxlZCkKLQkJZm9yIChpID0gMDsgaSA8IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKLQkJCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldOwotCQkJYmxrX2lvcG9sbF9kaXNhYmxlKCZwYmVfZXEtPmlvcG9sbCk7Ci0JCX0KKwlmb3IgKGkgPSAwOyBpIDwgcGhiYS0+bnVtX2NwdXM7IGkrKykgeworCQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXTsKKwkJYmxrX2lvcG9sbF9kaXNhYmxlKCZwYmVfZXEtPmlvcG9sbCk7CisJfQogZnJlZV90d3E6CiAJYmVpc2NzaV9jbGVhbl9wb3J0KHBoYmEpOwogCWJlaXNjc2lfZnJlZV9tZW0ocGhiYSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5oIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uaAppbmRleCAzMWZhMjdiLi45MzgwYjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmgKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJCSJiZTJpc2NzaSIKLSNkZWZpbmUgQlVJTERfU1RSCQkiMTAuMC42NTkuMCIKKyNkZWZpbmUgQlVJTERfU1RSCQkiMTAuMi4xMjUuMCIKICNkZWZpbmUgQkVfTkFNRQkJCSJFbXVsZXggT25lQ29ubmVjdCIgXAogCQkJCSJPcGVuLWlTQ1NJIERyaXZlciB2ZXJzaW9uIiBCVUlMRF9TVFIKICNkZWZpbmUgRFJWX0RFU0MJCUJFX05BTUUgIiAiICJEcml2ZXIiCkBAIC05Nyw5ICs5NywxNCBAQAogCiAjZGVmaW5lIElOVkFMSURfU0VTU19IQU5ETEUJMHhGRkZGRkZGRgogCisvKioKKyAqIEFkYXB0ZXIgU3RhdGVzCisgKiovCiAjZGVmaW5lIEJFX0FEQVBURVJfTElOS19VUAkweDAwMQogI2RlZmluZSBCRV9BREFQVEVSX0xJTktfRE9XTgkweDAwMgogI2RlZmluZSBCRV9BREFQVEVSX1BDSV9FUlIJMHgwMDQKKyNkZWZpbmUgQkVfQURBUFRFUl9TVEFURV9TSFVURE9XTgkweDAwOAorCiAKICNkZWZpbmUgQkVJU0NTSV9DTEVBTl9VTkxPQUQJMHgwMQogI2RlZmluZSBCRUlTQ1NJX0VFSF9VTkxPQUQJMHgwMgpAQCAtMTM1LDExICsxNDAsMTUgQEAKICNkZWZpbmUgREJfUlhVTFAwX09GRlNFVCAweEEwCiAvKioqKioqKioqIEV2ZW50IFEgZG9vciBiZWxsICoqKioqKioqKioqKiovCiAjZGVmaW5lIERCX0VRX09GRlNFVAkJCURCX0NRX09GRlNFVAotI2RlZmluZSBEQl9FUV9SSU5HX0lEX01BU0sJCTB4MUZGCS8qIGJpdHMgMCAtIDggKi8KKyNkZWZpbmUgREJfRVFfUklOR19JRF9MT1dfTUFTSwkJMHgxRkYJLyogYml0cyAwIC0gOCAqLwogLyogQ2xlYXIgdGhlIGludGVycnVwdCBmb3IgdGhpcyBlcSAqLwogI2RlZmluZSBEQl9FUV9DTFJfU0hJRlQJCQkoOSkJLyogYml0IDkgKi8KIC8qIE11c3QgYmUgMSAqLwogI2RlZmluZSBEQl9FUV9FVk5UX1NISUZUCQkoMTApCS8qIGJpdCAxMCAqLworLyogSGlnaGVyIE9yZGVyIEVRX0lEIGJpdCAqLworI2RlZmluZSBEQl9FUV9SSU5HX0lEX0hJR0hfTUFTSwkweDFGIC8qIGJpdHMgMTEgLSAxNSAqLworI2RlZmluZSBEQl9FUV9ISUdIX1NFVF9TSElGVAkxMQorI2RlZmluZSBEQl9FUV9ISUdIX0ZFSUxEX1NISUZUCTkKIC8qIE51bWJlciBvZiBldmVudCBlbnRyaWVzIHByb2Nlc3NlZCAqLwogI2RlZmluZSBEQl9FUV9OVU1fUE9QUEVEX1NISUZUCQkoMTYpCS8qIGJpdHMgMTYgLSAyOCAqLwogLyogUmVhcm0gYml0ICovCkBAIC0xNDcsNyArMTU2LDEyIEBACiAKIC8qKioqKioqKiogQ29tcGwgUSBkb29yIGJlbGwgKioqKioqKioqKioqKi8KICNkZWZpbmUgREJfQ1FfT0ZGU0VUCQkJMHgxMjAKLSNkZWZpbmUgREJfQ1FfUklOR19JRF9NQVNLCQkweDNGRgkvKiBiaXRzIDAgLSA5ICovCisjZGVmaW5lIERCX0NRX1JJTkdfSURfTE9XX01BU0sJCTB4M0ZGCS8qIGJpdHMgMCAtIDkgKi8KKy8qIEhpZ2hlciBPcmRlciBDUV9JRCBiaXQgKi8KKyNkZWZpbmUgREJfQ1FfUklOR19JRF9ISUdIX01BU0sJMHgxRiAvKiBiaXRzIDExIC0gMTUgKi8KKyNkZWZpbmUgREJfQ1FfSElHSF9TRVRfU0hJRlQJMTEKKyNkZWZpbmUgREJfQ1FfSElHSF9GRUlMRF9TSElGVAkxMAorCiAvKiBOdW1iZXIgb2YgZXZlbnQgZW50cmllcyBwcm9jZXNzZWQgKi8KICNkZWZpbmUgREJfQ1FfTlVNX1BPUFBFRF9TSElGVAkJKDE2KQkvKiBiaXRzIDE2IC0gMjggKi8KIC8qIFJlYXJtIGJpdCAqLwpAQCAtODIxLDYgKzgzNSw5IEBACiB2b2lkIGJlaXNjc2lfZnJlZV9tZ210X3Rhc2tfaGFuZGxlcyhzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4sCiAJCQkJICAgICBzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzayk7CiAKK3ZvaWQgaHdpX3JpbmdfY3FfZGIoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkgICAgIHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IG51bV9wcm9jZXNzZWQsCisJCSAgICAgdW5zaWduZWQgY2hhciByZWFybSwgdW5zaWduZWQgY2hhciBldmVudCk7CiBzdGF0aWMgaW5saW5lIGJvb2wgYmVpc2NzaV9lcnJvcihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCiB7CiAJcmV0dXJuIHBoYmEtPnVlX2RldGVjdGVkIHx8IHBoYmEtPmZ3X3RpbWVvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWdtdC5jIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21nbXQuYwppbmRleCBiMmZjYWM3Li4wODhiZGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWdtdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tZ210LmMKQEAgLTgyOCwyMiArODI4LDI1IEBACiAJYmVfbWNjX25vdGlmeShwaGJhKTsKIAlzcGluX3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKIAotCXJjID0gYmVpc2NzaV9tY2NxX2NvbXBsKHBoYmEsIHRhZywgTlVMTCwgbm9uZW1iX2NtZC0+dmEpOwotCWlmIChyYykgewotCQkvKiBDaGVjayBpZiB0aGUgSU9DVEwgbmVlZHMgdG8gYmUgcmUtaXNzdWVkICovCi0JCWlmIChyYyA9PSAtRUFHQUlOKQotCQkJcmV0dXJuIHJjOwotCi0JCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAotCQkJICAgIEJFSVNDU0lfTE9HX0NPTkZJRyB8IEJFSVNDU0lfTE9HX01CT1gsCi0JCQkgICAgIkJHXyVkIDogbWdtdF9leGVjX25vbmVtYl9jbWQgRmFpbGVkIHN0YXR1c1xuIik7Ci0KLQkJZ290byBmcmVlX2NtZDsKLQl9CisJcmMgPSBiZWlzY3NpX21jY3FfY29tcGwocGhiYSwgdGFnLCBOVUxMLCBub25lbWJfY21kKTsKIAogCWlmIChyZXNwX2J1ZikKIAkJbWVtY3B5KHJlc3BfYnVmLCBub25lbWJfY21kLT52YSwgcmVzcF9idWZfbGVuKTsKIAorCWlmIChyYykgeworCQkvKiBDaGVjayBpZiB0aGUgTUJYIENtZCBuZWVkcyB0byBiZSByZS1pc3N1ZWQgKi8KKwkJaWYgKHJjID09IC1FQUdBSU4pCisJCQlyZXR1cm4gcmM7CisKKwkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLAorCQkJICAgIEJFSVNDU0lfTE9HX0NPTkZJRyB8IEJFSVNDU0lfTE9HX01CT1gsCisJCQkgICAgIkJHXyVkIDogbWdtdF9leGVjX25vbmVtYl9jbWQgRmFpbGVkIHN0YXR1c1xuIik7CisKKwkJaWYgKHJjICE9IC1FQlVTWSkKKwkJCWdvdG8gZnJlZV9jbWQ7CisJCWVsc2UKKwkJCXJldHVybiByYzsKKwl9CiBmcmVlX2NtZDoKIAlwY2lfZnJlZV9jb25zaXN0ZW50KGN0cmwtPnBkZXYsIG5vbmVtYl9jbWQtPnNpemUsCiAJCQkgICAgbm9uZW1iX2NtZC0+dmEsIG5vbmVtYl9jbWQtPmRtYSk7CkBAIC0xMzQ4LDcgKzEzNTEsNiBAQAogewogCWludCByYzsKIAl1bnNpZ25lZCBpbnQgdGFnOwotCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmIgPSBOVUxMOwogCiAJdGFnID0gYmVfY21kX3NldF92bGFuKHBoYmEsIHZsYW5fdGFnKTsKIAlpZiAoIXRhZykgewpAQCAtMTM1OCw3ICsxMzYwLDcgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQlyYyA9IGJlaXNjc2lfbWNjcV9jb21wbChwaGJhLCB0YWcsICZ3cmIsIE5VTEwpOworCXJjID0gYmVpc2NzaV9tY2NxX2NvbXBsKHBoYmEsIHRhZywgTlVMTCwgTlVMTCk7CiAJaWYgKHJjKSB7CiAJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAogCQkJICAgIChCRUlTQ1NJX0xPR19DT05GSUcgfCBCRUlTQ1NJX0xPR19NQk9YKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmMKaW5kZXggNjUxODBlMS4uMzE1ZDZkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmMKQEAgLTM4NzgsNyArMzg3OCw3IEBACiAJCWJmYV90cmMoc2ZwLCBzZnAtPmRhdGFfdmFsaWQpOwogCQlpZiAoc2ZwLT5kYXRhX3ZhbGlkKSB7CiAJCQl1MzIJc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2ZwX21lbV9zKTsKLQkJCXU4ICpkZXMgPSAodTggKikgJihzZnAtPnNmcG1lbS0+c3JsaWRfYmFzZSk7CisJCQl1OCAqZGVzID0gKHU4ICopICYoc2ZwLT5zZnBtZW0pOwogCQkJbWVtY3B5KGRlcywgc2ZwLT5kYnVmX2t2YSwgc2l6ZSk7CiAJCX0KIAkJLyoKQEAgLTY4NTEsNyArNjg1MSw3IEBACiBiZmFfZmxhc2hfc3RhdHVzX3JlYWQodm9pZCBfX2lvbWVtICpwY2lfYmFyKQogewogCXVuaW9uIGJmYV9mbGFzaF9kZXZfc3RhdHVzX3JlZ191CWRldl9zdGF0dXM7Ci0JdTMyCQkJCXN0YXR1czsKKwlpbnQJCQkJc3RhdHVzOwogCXUzMgkJCXJldF9zdGF0dXM7CiAJaW50CQkJCWk7CiAKQEAgLTY4OTksNyArNjg5OSw3IEBACiBiZmFfZmxhc2hfcmVhZF9zdGFydCh2b2lkIF9faW9tZW0gKnBjaV9iYXIsIHUzMiBvZmZzZXQsIHUzMiBsZW4sCiAJCQkgY2hhciAqYnVmKQogewotCXUzMiBzdGF0dXM7CisJaW50IHN0YXR1czsKIAogCS8qCiAJICogbGVuIG11c3QgYmUgbXV0aXBsZSBvZiA0IGFuZCBub3QgZXhjZWVkaW5nIGZpZm8gc2l6ZQpAQCAtNzAwNiw3ICs3MDA2LDcgQEAKIAl3aGlsZSAoIWJmYV9yYXdfc2VtX2dldChiYXIpKSB7CiAJCWlmICgtLW4gPD0gMCkKIAkJCXJldHVybiBCRkFfU1RBVFVTX0JBREZMQVNIOwotCQl1ZGVsYXkoMTAwMDApOworCQltZGVsYXkoMTApOwogCX0KIAlyZXR1cm4gQkZBX1NUQVRVU19PSzsKIH0KQEAgLTcwMjEsNyArNzAyMSw4IEBACiBiZmFfZmxhc2hfcmF3X3JlYWQodm9pZCBfX2lvbWVtICpwY2lfYmFyLCB1MzIgb2Zmc2V0LCBjaGFyICpidWYsCiAJCSAgICAgICB1MzIgbGVuKQogewotCXUzMiBuLCBzdGF0dXM7CisJdTMyIG47CisJaW50IHN0YXR1czsKIAl1MzIgb2ZmLCBsLCBzLCByZXNpZHVlLCBmaWZvX3N6OwogCiAJcmVzaWR1ZSA9IGxlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9ic2cuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9ic2cuYwppbmRleCAxNTdmNjA0Li44OTk0ZmI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfYnNnLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2JzZy5jCkBAIC0yMzA0LDggKzIzMDQsMTAgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKIAotCWlmIChiZmFfZmNwb3J0X2lzX2Rwb3J0KCZiZmFkLT5iZmEpKQorCWlmIChiZmFfZmNwb3J0X2lzX2Rwb3J0KCZiZmFkLT5iZmEpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gQkZBX1NUQVRVU19EUE9SVF9FUlI7CisJfQogCiAJaWYgKChmY3BvcnQtPmNmZy50b3BvbG9neSA9PSBCRkFfUE9SVF9UT1BPTE9HWV9MT09QKSB8fAogCQkoZmNwb3J0LT50b3BvbG9neSA9PSBCRkFfUE9SVF9UT1BPTE9HWV9MT09QKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKaW5kZXggOTk2N2Y5Yy4uZjA2NzMzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKQEAgLTczLDkgKzczLDE0IEBACiAKIAkJYnJlYWs7CiAKLQljYXNlIEJGSV9JT0lNX1NUU19BQk9SVEVEOgogCWNhc2UgQkZJX0lPSU1fU1RTX1RJTUVET1VUOgorCQlob3N0X3N0YXR1cyA9IERJRF9USU1FX09VVDsKKwkJY21uZC0+cmVzdWx0ID0gU2NzaVJlc3VsdChob3N0X3N0YXR1cywgMCk7CisJCWJyZWFrOwogCWNhc2UgQkZJX0lPSU1fU1RTX1BBVEhUT1Y6CisJCWhvc3Rfc3RhdHVzID0gRElEX1RSQU5TUE9SVF9ESVNSVVBURUQ7CisJCWNtbmQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoaG9zdF9zdGF0dXMsIDApOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKIAkJY21uZC0+cmVzdWx0ID0gU2NzaVJlc3VsdChob3N0X3N0YXR1cywgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmYy5oIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmMuaAppbmRleCAxZWJmM2ZiLi42YTk3NjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjLmgKQEAgLTY0LDcgKzY0LDcgQEAKICNpbmNsdWRlICJibngyZmNfY29uc3RhbnRzLmgiCiAKICNkZWZpbmUgQk5YMkZDX05BTUUJCSJibngyZmMiCi0jZGVmaW5lIEJOWDJGQ19WRVJTSU9OCQkiMi40LjEiCisjZGVmaW5lIEJOWDJGQ19WRVJTSU9OCQkiMi40LjIiCiAKICNkZWZpbmUgUEZYCQkJImJueDJmYzogIgogCkBAIC0zNjcsNiArMzY3LDcgQEAKIAlhdG9taWNfdCBudW1fYWN0aXZlX2lvczsKIAl1MzIgZmx1c2hfaW5fcHJvZzsKIAl1bnNpZ25lZCBsb25nIHRpbWVzdGFtcDsKKwl1bnNpZ25lZCBsb25nIHJldHJ5X2RlbGF5X3RpbWVzdGFtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfdGFza19saXN0OwogCXN0cnVjdCBibngyZmNfY21kICpwZW5kaW5nX3F1ZXVlW0JOWDJGQ19TUV9XUUVTX01BWCsxXTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGFjdGl2ZV9jbWRfcXVldWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19mY29lLmMgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19mY29lLmMKaW5kZXggOWI5NDg1MC4uNjI4N2Y2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZmNvZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2Zjb2UuYwpAQCAtMjIsNyArMjIsNyBAQAogCiAjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJImJueDJmYyIKICNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCUJOWDJGQ19WRVJTSU9OCi0jZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiU2VwIDE3LCAyMDEzIgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkRlYyAxMSwgMjAxMyIKIAogCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gPQpAQCAtODUwLDYgKzg1MCw5IEBACiAJCQkJX19ibngyZmNfZGVzdHJveShpbnRlcmZhY2UpOwogCQl9CiAJCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKKworCQkvKiBFbnN1cmUgQUxMIGRlc3Ryb3kgd29yayBoYXMgYmVlbiBjb21wbGV0ZWQgYmVmb3JlIHJldHVybiAqLworCQlmbHVzaF93b3JrcXVldWUoYm54MmZjX3dxKTsKIAkJcmV0dXJuOwogCiAJZGVmYXVsdDoKQEAgLTIzODksNiArMjM5Miw5IEBACiAJCQlfX2JueDJmY19kZXN0cm95KGludGVyZmFjZSk7CiAJbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOwogCisJLyogRW5zdXJlIEFMTCBkZXN0cm95IHdvcmsgaGFzIGJlZW4gY29tcGxldGVkIGJlZm9yZSByZXR1cm4gKi8KKwlmbHVzaF93b3JrcXVldWUoYm54MmZjX3dxKTsKKwogCWJueDJmY191bHBfc3RvcChoYmEpOwogCS8qIHVucmVnaXN0ZXIgY25pYyBkZXZpY2UgKi8KIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJOWDJGQ19DTklDX1JFR0lTVEVSRUQsICZoYmEtPnJlZ193aXRoX2NuaWMpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaW8uYyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2lvLmMKaW5kZXggZTkyNzlhOC4uMzJhNWUwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaW8uYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19pby5jCkBAIC0xODcxLDcgKzE4NzEsMTUgQEAKIAkJcmMgPSBTQ1NJX01MUVVFVUVfVEFSR0VUX0JVU1k7CiAJCWdvdG8gZXhpdF9xY21kOwogCX0KLQorCWlmICh0Z3QtPnJldHJ5X2RlbGF5X3RpbWVzdGFtcCkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0Z3QtPnJldHJ5X2RlbGF5X3RpbWVzdGFtcCkpIHsKKwkJCXRndC0+cmV0cnlfZGVsYXlfdGltZXN0YW1wID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIElmIHJldHJ5X2RlbGF5IHRpbWVyIGlzIGFjdGl2ZSwgZmxvdyBvZmYgdGhlIE1MICovCisJCQlyYyA9IFNDU0lfTUxRVUVVRV9UQVJHRVRfQlVTWTsKKwkJCWdvdG8gZXhpdF9xY21kOworCQl9CisJfQogCWlvX3JlcSA9IGJueDJmY19jbWRfYWxsb2ModGd0KTsKIAlpZiAoIWlvX3JlcSkgewogCQlyYyA9IFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CkBAIC0xOTYxLDYgKzE5NjksMTUgQEAKIAkJCQkgIiBmY3BfcmVzaWQgPSAweCV4XG4iLAogCQkJCWlvX3JlcS0+Y2RiX3N0YXR1cywgaW9fcmVxLT5mY3BfcmVzaWQpOwogCQkJc2NfY21kLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KSB8IGlvX3JlcS0+Y2RiX3N0YXR1czsKKworCQkJaWYgKGlvX3JlcS0+Y2RiX3N0YXR1cyA9PSBTQU1fU1RBVF9UQVNLX1NFVF9GVUxMIHx8CisJCQkgICAgaW9fcmVxLT5jZGJfc3RhdHVzID09IFNBTV9TVEFUX0JVU1kpIHsKKwkJCQkvKiBTZXQgdGhlIGppZmZpZXMgKyByZXRyeV9kZWxheV90aW1lciAqIDEwMG1zCisJCQkJICAgZm9yIHRoZSBycG9ydC90Z3QgKi8KKwkJCQl0Z3QtPnJldHJ5X2RlbGF5X3RpbWVzdGFtcCA9IGppZmZpZXMgKworCQkJCQlmY3BfcnNwLT5yZXRyeV9kZWxheV90aW1lciAqIEhaIC8gMTA7CisJCQl9CisKIAkJfQogCQlpZiAoaW9fcmVxLT5mY3BfcmVzaWQpCiAJCQlzY3NpX3NldF9yZXNpZChzY19jbWQsIGlvX3JlcS0+ZmNwX3Jlc2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX3RndC5jIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfdGd0LmMKaW5kZXggZDliYWU1Ni4uNjg3MGNmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfdGd0LmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfdGd0LmMKQEAgLTM4Niw2ICszODYsNyBAQAogCXRndC0+cnFfcHJvZF9pZHggPSAweDgwMDA7CiAJdGd0LT5ycV9jb25zX2lkeCA9IDA7CiAJYXRvbWljX3NldCgmdGd0LT5udW1fYWN0aXZlX2lvcywgMCk7CisJdGd0LT5yZXRyeV9kZWxheV90aW1lc3RhbXAgPSAwOwogCiAJaWYgKHJkYXRhLT5mbGFncyAmIEZDX1JQX0ZMQUdTX1JFVFJZICYmCiAJICAgIHJkYXRhLT5pZHMucm9sZXMgJiBGQ19SUE9SVF9ST0xFX0ZDUF9UQVJHRVQgJiYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9od2kuYyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9od2kuYwppbmRleCBiODdhMTkzLi5iNWZmZDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaHdpLmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2h3aS5jCkBAIC0xMzYxLDcgKzEzNjEsNyBAQAogCXUzMiBkYXRhbGVuID0gMDsKIAogCXJlc3BfY3FlID0gKHN0cnVjdCBibngyaV9jbWRfcmVzcG9uc2UgKiljcWU7Ci0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJdGFzayA9IGlzY3NpX2l0dF90b190YXNrKGNvbm4sCiAJCQkJIHJlc3BfY3FlLT5pdHQgJiBJU0NTSV9DTURfUkVTUE9OU0VfSU5ERVgpOwogCWlmICghdGFzaykKQEAgLTE0MzIsNyArMTQzMiw3IEBACiAJX19pc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgKHN0cnVjdCBpc2NzaV9oZHIgKiloZHIsCiAJCQkgICAgIGNvbm4tPmRhdGEsIGRhdGFsZW4pOwogZmFpbDoKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0NTcsNyArMTQ1Nyw3IEBACiAJaW50IHBhZF9sZW47CiAKIAlsb2dpbiA9IChzdHJ1Y3QgYm54MmlfbG9naW5fcmVzcG9uc2UgKikgY3FlOwotCXNwaW5fbG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCXRhc2sgPSBpc2NzaV9pdHRfdG9fdGFzayhjb25uLAogCQkJCSBsb2dpbi0+aXR0ICYgSVNDU0lfTE9HSU5fUkVTUE9OU0VfSU5ERVgpOwogCWlmICghdGFzaykKQEAgLTE1MDAsNyArMTUwMCw3IEBACiAJCWJueDJpX2Nvbm4tPmdlbl9wZHUucmVzcF9idWYsCiAJCWJueDJpX2Nvbm4tPmdlbl9wZHUucmVzcF93cl9wdHIgLSBibngyaV9jb25uLT5nZW5fcGR1LnJlc3BfYnVmKTsKIGRvbmU6Ci0Jc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0xNTI1LDcgKzE1MjUsNyBAQAogCWludCBwYWRfbGVuOwogCiAJdGV4dCA9IChzdHJ1Y3QgYm54MmlfdGV4dF9yZXNwb25zZSAqKSBjcWU7Ci0Jc3Bpbl9sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJdGFzayA9IGlzY3NpX2l0dF90b190YXNrKGNvbm4sIHRleHQtPml0dCAmIElTQ1NJX0xPR0lOX1JFU1BPTlNFX0lOREVYKTsKIAlpZiAoIXRhc2spCiAJCWdvdG8gZG9uZTsKQEAgLTE1NjEsNyArMTU2MSw3IEBACiAJCQkgICAgIGJueDJpX2Nvbm4tPmdlbl9wZHUucmVzcF93cl9wdHIgLQogCQkJICAgICBibngyaV9jb25uLT5nZW5fcGR1LnJlc3BfYnVmKTsKIGRvbmU6Ci0Jc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0xNTg0LDcgKzE1ODQsNyBAQAogCXN0cnVjdCBpc2NzaV90bV9yc3AgKnJlc3BfaGRyOwogCiAJdG1mX2NxZSA9IChzdHJ1Y3QgYm54MmlfdG1mX3Jlc3BvbnNlICopY3FlOwotCXNwaW5fbG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCXRhc2sgPSBpc2NzaV9pdHRfdG9fdGFzayhjb25uLAogCQkJCSB0bWZfY3FlLT5pdHQgJiBJU0NTSV9UTUZfUkVTUE9OU0VfSU5ERVgpOwogCWlmICghdGFzaykKQEAgLTE2MDAsNyArMTYwMCw3IEBACiAKIAlfX2lzY3NpX2NvbXBsZXRlX3BkdShjb25uLCAoc3RydWN0IGlzY3NpX2hkciAqKXJlc3BfaGRyLCBOVUxMLCAwKTsKIGRvbmU6Ci0Jc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0xNjIzLDcgKzE2MjMsNyBAQAogCXN0cnVjdCBpc2NzaV9sb2dvdXRfcnNwICpyZXNwX2hkcjsKIAogCWxvZ291dCA9IChzdHJ1Y3QgYm54MmlfbG9nb3V0X3Jlc3BvbnNlICopIGNxZTsKLQlzcGluX2xvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAl0YXNrID0gaXNjc2lfaXR0X3RvX3Rhc2soY29ubiwKIAkJCQkgbG9nb3V0LT5pdHQgJiBJU0NTSV9MT0dPVVRfUkVTUE9OU0VfSU5ERVgpOwogCWlmICghdGFzaykKQEAgLTE2NDcsNyArMTY0Nyw3IEBACiAKIAlibngyaV9jb25uLT5lcC0+c3RhdGUgPSBFUF9TVEFURV9MT0dPVVRfUkVTUF9SQ1ZEOwogZG9uZToKLQlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2NjgsMTIgKzE2NjgsMTIgQEAKIAlzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzazsKIAogCW5vcF9pbiA9IChzdHJ1Y3QgYm54Mmlfbm9wX2luX21zZyAqKWNxZTsKLQlzcGluX2xvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAl0YXNrID0gaXNjc2lfaXR0X3RvX3Rhc2soY29ubiwKIAkJCQkgbm9wX2luLT5pdHQgJiBJU0NTSV9OT1BfSU5fTVNHX0lOREVYKTsKIAlpZiAodGFzaykKIAkJX19pc2NzaV9wdXRfdGFzayh0YXNrKTsKLQlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiB9CiAKIC8qKgpAQCAtMTcxMiw3ICsxNzEyLDcgQEAKIAogCW5vcF9pbiA9IChzdHJ1Y3QgYm54Mmlfbm9wX2luX21zZyAqKWNxZTsKIAotCXNwaW5fbG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCWhkciA9IChzdHJ1Y3QgaXNjc2lfbm9waW4gKikmYm54MmlfY29ubi0+Z2VuX3BkdS5yZXNwX2hkcjsKIAltZW1zZXQoaGRyLCAwLCBzaXplb2Yoc3RydWN0IGlzY3NpX2hkcikpOwogCWhkci0+b3Bjb2RlID0gbm9wX2luLT5vcF9jb2RlOwpAQCAtMTczOCw3ICsxNzM4LDcgQEAKIAl9CiBkb25lOgogCV9faXNjc2lfY29tcGxldGVfcGR1KGNvbm4sIChzdHJ1Y3QgaXNjc2lfaGRyICopaGRyLCBOVUxMLCAwKTsKLQlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiAKIAlyZXR1cm4gdGd0X2FzeW5jX25vcDsKIH0KQEAgLTE3NzEsNyArMTc3MSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlzcGluX2xvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAlyZXNwX2hkciA9IChzdHJ1Y3QgaXNjc2lfYXN5bmMgKikgJmJueDJpX2Nvbm4tPmdlbl9wZHUucmVzcF9oZHI7CiAJbWVtc2V0KHJlc3BfaGRyLCAwLCBzaXplb2Yoc3RydWN0IGlzY3NpX2hkcikpOwogCXJlc3BfaGRyLT5vcGNvZGUgPSBhc3luY19jcWUtPm9wX2NvZGU7CkBAIC0xNzkwLDcgKzE3OTAsNyBAQAogCiAJX19pc2NzaV9jb21wbGV0ZV9wZHUoYm54MmlfY29ubi0+Y2xzX2Nvbm4tPmRkX2RhdGEsCiAJCQkgICAgIChzdHJ1Y3QgaXNjc2lfaGRyICopcmVzcF9oZHIsIE5VTEwsIDApOwotCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIH0KIAogCkBAIC0xODE3LDcgKzE4MTcsNyBAQAogCX0gZWxzZQogCQlibngyaV91bnNvbF9wZHVfYWRqdXN0X3JxKGJueDJpX2Nvbm4pOwogCi0Jc3Bpbl9sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJaGRyID0gKHN0cnVjdCBpc2NzaV9yZWplY3QgKikgJmJueDJpX2Nvbm4tPmdlbl9wZHUucmVzcF9oZHI7CiAJbWVtc2V0KGhkciwgMCwgc2l6ZW9mKHN0cnVjdCBpc2NzaV9oZHIpKTsKIAloZHItPm9wY29kZSA9IHJlamVjdC0+b3BfY29kZTsKQEAgLTE4MjgsNyArMTgyOCw3IEBACiAJaGRyLT5mZmZmZmZmZiA9IGNwdV90b19iZTMyKFJFU0VSVkVEX0lUVCk7CiAJX19pc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgKHN0cnVjdCBpc2NzaV9oZHIgKiloZHIsIGNvbm4tPmRhdGEsCiAJCQkgICAgIHJlamVjdC0+ZGF0YV9sZW5ndGgpOwotCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIH0KIAogLyoqCkBAIC0xODQ4LDEzICsxODQ4LDEzIEBACiAJc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2s7CiAKIAljbWRfY2xlYW5fcnNwID0gKHN0cnVjdCBibngyaV9jbGVhbnVwX3Jlc3BvbnNlICopY3FlOwotCXNwaW5fbG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCXRhc2sgPSBpc2NzaV9pdHRfdG9fdGFzayhjb25uLAogCQkJY21kX2NsZWFuX3JzcC0+aXR0ICYgSVNDU0lfQ0xFQU5VUF9SRVNQT05TRV9JTkRFWCk7CiAJaWYgKCF0YXNrKQogCQlwcmludGsoS0VSTl9BTEVSVCAiYm54Mmk6IGNtZCBjbGVhbiBJVFQgJXggbm90IGFjdGl2ZVxuIiwKIAkJCWNtZF9jbGVhbl9yc3AtPml0dCAmIElTQ1NJX0NMRUFOVVBfUkVTUE9OU0VfSU5ERVgpOwotCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAljb21wbGV0ZSgmYm54MmlfY29ubi0+Y21kX2NsZWFudXBfY21wbCk7CiB9CiAKQEAgLTE5MjEsMTEgKzE5MjEsMTEgQEAKIAlpbnQgcmMgPSAwOwogCWludCBjcHU7CiAKLQlzcGluX2xvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAl0YXNrID0gaXNjc2lfaXR0X3RvX3Rhc2soYm54MmlfY29ubi0+Y2xzX2Nvbm4tPmRkX2RhdGEsCiAJCQkJIGNxZS0+aXR0ICYgSVNDU0lfQ01EX1JFU1BPTlNFX0lOREVYKTsKIAlpZiAoIXRhc2sgfHwgIXRhc2stPnNjKSB7Ci0JCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlzYyA9IHRhc2stPnNjOwpAQCAtMTkzNSw3ICsxOTM1LDcgQEAKIAllbHNlCiAJCWNwdSA9IHNjLT5yZXF1ZXN0LT5jcHU7CiAKLQlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiAKIAlwID0gJnBlcl9jcHUoYm54MmlfcGVyY3B1LCBjcHUpOwogCXNwaW5fbG9jaygmcC0+cF93b3JrX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2lzY3NpLmMgYi9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaXNjc2kuYwppbmRleCBjOGIwYWZmLi4xNjY1NDNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaXNjc2kuYwpAQCAtMTE3MCwxMCArMTE3MCwxMCBAQAogCWlmICh0YXNrLT5zdGF0ZSA9PSBJU0NTSV9UQVNLX0FCUlRfVE1GKSB7CiAJCWJueDJpX3NlbmRfY21kX2NsZWFudXBfcmVxKGhiYSwgdGFzay0+ZGRfZGF0YSk7CiAKLQkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAkJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZibngyaV9jb25uLT5jbWRfY2xlYW51cF9jbXBsLAogCQkJCW1zZWNzX3RvX2ppZmZpZXMoSVNDU0lfQ01EX0NMRUFOVVBfVElNRU9VVCkpOwotCQlzcGluX2xvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmxvY2spOworCQlzcGluX2xvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmJhY2tfbG9jayk7CiAJfQogCWJueDJpX2lzY3NpX3VubWFwX3NnX2xpc3QodGFzay0+ZGRfZGF0YSk7CiB9CkBAIC0yMDYwLDcgKzIwNjAsNyBAQAogCQlnb3RvIG91dDsKIAogCWlmIChzZXNzaW9uKSB7Ci0JCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJaWYgKGJueDJpX2VwLT5zdGF0ZSAhPSBFUF9TVEFURV9UQ1BfRklOX1JDVkQpIHsKIAkJCWlmIChzZXNzaW9uLT5zdGF0ZSA9PSBJU0NTSV9TVEFURV9MT0dHSU5HX09VVCkgewogCQkJCWlmIChibngyaV9lcC0+c3RhdGUgPT0gRVBfU1RBVEVfTE9HT1VUX1NFTlQpIHsKQEAgLTIwNzYsNyArMjA3Niw3IEBACiAJCX0gZWxzZQogCQkJY2xvc2UgPSAxOwogCi0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJfQogCiAJYm54MmlfZXAtPnN0YXRlID0gRVBfU1RBVEVfRElTQ09OTl9TVEFSVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiNGkvY3hnYjRpLmMgYi9kcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjRpL2N4Z2I0aS5jCmluZGV4IDVhOWY4NDIuLmU4ZWU1ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiNGkvY3hnYjRpLmMKKysrIGIvZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2I0aS9jeGdiNGkuYwpAQCAtMTc1LDUyICsxNzUsNiBAQAogCQkJc2l6ZW9mKHN0cnVjdCBmd19vZmxkX3R4X2RhdGFfd3IpKTsKIH0KIAotCi0jZGVmaW5lIFZMQU5fTk9ORSAweGZmZgotI2RlZmluZSBGSUxURVJfU0VMX1ZMQU5fTk9ORSAweGZmZmYKLSNkZWZpbmUgRklMVEVSX1NFTF9XSURUSF9QX0ZDICgzKzEpIC8qIHBvcnQgdXNlcyAzIGJpdHMsIEZDb0Ugb25lIGJpdCAqLwotI2RlZmluZSBGSUxURVJfU0VMX1dJRFRIX1ZJTl9QX0ZDIFwKLQkoNiArIDcgKyBGSUxURVJfU0VMX1dJRFRIX1BfRkMpIC8qIDYgYml0cyBhcmUgdW51c2VkLCBWRiB1c2VzIDcgYml0cyovCi0jZGVmaW5lIEZJTFRFUl9TRUxfV0lEVEhfVEFHX1BfRkMgXAotCSgzICsgRklMVEVSX1NFTF9XSURUSF9WSU5fUF9GQykgLyogUEYgdXNlcyAzIGJpdHMgKi8KLSNkZWZpbmUgRklMVEVSX1NFTF9XSURUSF9WTERfVEFHX1BfRkMgKDEgKyBGSUxURVJfU0VMX1dJRFRIX1RBR19QX0ZDKQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHNlbGVjdF9udHVwbGUoc3RydWN0IGN4Z2JpX2RldmljZSAqY2RldiwKLQkJCQlzdHJ1Y3QgbDJ0X2VudHJ5ICpsMnQpCi17Ci0Jc3RydWN0IGN4Z2I0X2xsZF9pbmZvICpsbGRpID0gY3hnYmlfY2Rldl9wcml2KGNkZXYpOwotCXVuc2lnbmVkIGludCBudHVwbGUgPSAwOwotCXUzMiB2aWlkOwotCi0Jc3dpdGNoIChsbGRpLT5maWx0X21vZGUpIHsKLQotCS8qIGRlZmF1bHQgZmlsdGVyIG1vZGUgKi8KLQljYXNlIEhXX1RQTF9GUl9NVF9QUl9JVl9QX0ZDOgotCQlpZiAobDJ0LT52bGFuID09IFZMQU5fTk9ORSkKLQkJCW50dXBsZSB8PSBGSUxURVJfU0VMX1ZMQU5fTk9ORSA8PCBGSUxURVJfU0VMX1dJRFRIX1BfRkM7Ci0JCWVsc2UgewotCQkJbnR1cGxlIHw9IGwydC0+dmxhbiA8PCBGSUxURVJfU0VMX1dJRFRIX1BfRkM7Ci0JCQludHVwbGUgfD0gMSA8PCBGSUxURVJfU0VMX1dJRFRIX1ZMRF9UQUdfUF9GQzsKLQkJfQotCQludHVwbGUgfD0gbDJ0LT5scG9ydCA8PCBTX1BPUlQgfCBJUFBST1RPX1RDUCA8PAotCQkJICBGSUxURVJfU0VMX1dJRFRIX1ZMRF9UQUdfUF9GQzsKLQkJYnJlYWs7Ci0JY2FzZSBIV19UUExfRlJfTVRfUFJfT1ZfUF9GQzogewotCQl2aWlkID0gY3hnYjRfcG9ydF92aWlkKGwydC0+bmVpZ2gtPmRldik7Ci0KLQkJbnR1cGxlIHw9IEZXX1ZJSURfVklOX0dFVCh2aWlkKSA8PCBGSUxURVJfU0VMX1dJRFRIX1BfRkM7Ci0JCW50dXBsZSB8PSBGV19WSUlEX1BGTl9HRVQodmlpZCkgPDwgRklMVEVSX1NFTF9XSURUSF9WSU5fUF9GQzsKLQkJbnR1cGxlIHw9IEZXX1ZJSURfVklWTERfR0VUKHZpaWQpIDw8IEZJTFRFUl9TRUxfV0lEVEhfVEFHX1BfRkM7Ci0JCW50dXBsZSB8PSBsMnQtPmxwb3J0IDw8IFNfUE9SVCB8IElQUFJPVE9fVENQIDw8Ci0JCQkgIEZJTFRFUl9TRUxfV0lEVEhfVkxEX1RBR19QX0ZDOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBudHVwbGU7Ci19Ci0KIHN0YXRpYyB2b2lkIHNlbmRfYWN0X29wZW5fcmVxKHN0cnVjdCBjeGdiaV9zb2NrICpjc2ssIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJc3RydWN0IGwydF9lbnRyeSAqZSkKIHsKQEAgLTI0OCw4ICsyMDIsNiBAQAogCQlzdHJ1Y3QgY3BsX2FjdF9vcGVuX3JlcSAqcmVxID0KIAkJCQkoc3RydWN0IGNwbF9hY3Rfb3Blbl9yZXEgKilza2ItPmhlYWQ7CiAKLQkJcmVxID0gKHN0cnVjdCBjcGxfYWN0X29wZW5fcmVxICopc2tiLT5oZWFkOwotCiAJCUlOSVRfVFBfV1IocmVxLCAwKTsKIAkJT1BDT0RFX1RJRChyZXEpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfQUNUX09QRU5fUkVRLAogCQkJCQlxaWRfYXRpZCkpOwpAQCAtMjU4LDcgKzIxMCw5IEBACiAJCXJlcS0+bG9jYWxfaXAgPSBjc2stPnNhZGRyLnNpbl9hZGRyLnNfYWRkcjsKIAkJcmVxLT5wZWVyX2lwID0gY3NrLT5kYWRkci5zaW5fYWRkci5zX2FkZHI7CiAJCXJlcS0+b3B0MCA9IGNwdV90b19iZTY0KG9wdDApOwotCQlyZXEtPnBhcmFtcyA9IGNwdV90b19iZTMyKHNlbGVjdF9udHVwbGUoY3NrLT5jZGV2LCBjc2stPmwydCkpOworCQlyZXEtPnBhcmFtcyA9IGNwdV90b19iZTMyKGN4Z2I0X3NlbGVjdF9udHVwbGUoCisJCQkJCWNzay0+Y2Rldi0+cG9ydHNbY3NrLT5wb3J0X2lkXSwKKwkJCQkJY3NrLT5sMnQpKTsKIAkJb3B0MiB8PSAxIDw8IDIyOwogCQlyZXEtPm9wdDIgPSBjcHVfdG9fYmUzMihvcHQyKTsKIApAQCAtMjcxLDggKzIyNSw2IEBACiAJCXN0cnVjdCBjcGxfdDVfYWN0X29wZW5fcmVxICpyZXEgPQogCQkJCShzdHJ1Y3QgY3BsX3Q1X2FjdF9vcGVuX3JlcSAqKXNrYi0+aGVhZDsKIAotCQlyZXEgPSAoc3RydWN0IGNwbF90NV9hY3Rfb3Blbl9yZXEgKilza2ItPmhlYWQ7Ci0KIAkJSU5JVF9UUF9XUihyZXEsIDApOwogCQlPUENPREVfVElEKHJlcSkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9BQ1RfT1BFTl9SRVEsCiAJCQkJCXFpZF9hdGlkKSk7CkBAIC0yODEsNyArMjMzLDEwIEBACiAJCXJlcS0+bG9jYWxfaXAgPSBjc2stPnNhZGRyLnNpbl9hZGRyLnNfYWRkcjsKIAkJcmVxLT5wZWVyX2lwID0gY3NrLT5kYWRkci5zaW5fYWRkci5zX2FkZHI7CiAJCXJlcS0+b3B0MCA9IGNwdV90b19iZTY0KG9wdDApOwotCQlyZXEtPnBhcmFtcyA9IGNwdV90b19iZTMyKHNlbGVjdF9udHVwbGUoY3NrLT5jZGV2LCBjc2stPmwydCkpOworCQlyZXEtPnBhcmFtcyA9IGNwdV90b19iZTY0KFZfRklMVEVSX1RVUExFKAorCQkJCWN4Z2I0X3NlbGVjdF9udHVwbGUoCisJCQkJCWNzay0+Y2Rldi0+cG9ydHNbY3NrLT5wb3J0X2lkXSwKKwkJCQkJY3NrLT5sMnQpKSk7CiAJCW9wdDIgfD0gMSA8PCAzMTsKIAkJcmVxLT5vcHQyID0gY3B1X3RvX2JlMzIob3B0Mik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kdGMuYyBiL2RyaXZlcnMvc2NzaS9kdGMuYwppbmRleCBkMDFmMDE2Li5lYjI5ZmU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZHRjLmMKKysrIGIvZHJpdmVycy9zY3NpL2R0Yy5jCkBAIC0yNzcsNyArMjc3LDcgQEAKIAkJLyogV2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQsIGl0IHdpbGwgc29tZXRpbWVzIGhhbmcgd2hlbiBkb2luZyBoZWF2eQogCQkgKiByZWFkcy4gU28gYmV0dGVyIG5vdCBlbmFibGUgdGhlbSB1bnRpbCBJIGZpbmdlciBpdCBvdXQuICovCiAJCWlmIChpbnN0YW5jZS0+aXJxICE9IFNDU0lfSVJRX05PTkUpCi0JCQlpZiAocmVxdWVzdF9pcnEoaW5zdGFuY2UtPmlycSwgZHRjX2ludHIsIElSUUZfRElTQUJMRUQsCisJCQlpZiAocmVxdWVzdF9pcnEoaW5zdGFuY2UtPmlycSwgZHRjX2ludHIsIDAsCiAJCQkJCSJkdGMiLCBpbnN0YW5jZSkpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgInNjc2klZCA6IElSUSVkIG5vdCBmcmVlLCBpbnRlcnJ1cHRzIGRpc2FibGVkXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgaW5zdGFuY2UtPmlycSk7CiAJCQkJaW5zdGFuY2UtPmlycSA9IFNDU0lfSVJRX05PTkU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZWF0YS5jIGIvZHJpdmVycy9zY3NpL2VhdGEuYwppbmRleCA5NGRlODg5Li5lYmY1NzM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZWF0YS5jCisrKyBiL2RyaXZlcnMvc2NzaS9lYXRhLmMKQEAgLTEyMjEsNyArMTIyMSw3IEBACiAKIAkvKiBCb2FyZCBkZXRlY3RlZCwgYWxsb2NhdGUgaXRzIElSUSAqLwogCWlmIChyZXF1ZXN0X2lycShpcnEsIGRvX2ludGVycnVwdF9oYW5kbGVyLAotCQkJSVJRRl9ESVNBQkxFRCB8ICgoc3VidmVyc2lvbiA9PSBFU0EpID8gSVJRRl9TSEFSRUQgOiAwKSwKKwkJCShzdWJ2ZXJzaW9uID09IEVTQSkgPyBJUlFGX1NIQVJFRCA6IDAsCiAJCQlkcml2ZXJfbmFtZSwgKHZvaWQgKikmc2hhW2pdKSkgewogCQlwcmludGsoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgSVJRICV1LCBkZXRhY2hpbmcuXG4iLCBuYW1lLAogCQkgICAgICAgaXJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9lYXRhX3Bpby5jIGIvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmMKaW5kZXggMTY2MzE3My4uODMxOWQyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmMKKysrIGIvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmMKQEAgLTY4Nyw3ICs2ODcsNyBAQAogCQlyZXR1cm4gMDsKIAogCWlmICghcmVnX0lSUVtnYy0+SVJRXSkgewkvKiBJbnRlcnJ1cHQgYWxyZWFkeSByZWdpc3RlcmVkID8gKi8KLQkJaWYgKCFyZXF1ZXN0X2lycShnYy0+SVJRLCBkb19lYXRhX3Bpb19pbnRfaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwgIkVBVEEtUElPIiwgc2gpKSB7CisJCWlmICghcmVxdWVzdF9pcnEoZ2MtPklSUSwgZG9fZWF0YV9waW9faW50X2hhbmRsZXIsIDAsICJFQVRBLVBJTyIsIHNoKSkgewogCQkJcmVnX0lSUVtnYy0+SVJRXSsrOwogCQkJaWYgKCFnYy0+SVJRX1RSKQogCQkJCXJlZ19JUlFMW2djLT5JUlFdID0gMTsJLyogSVJRIGlzIGVkZ2UgdHJpZ2dlcmVkICovCkBAIC05MjEsNyArOTIxLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhJUlE7IGkrKykKIAkJaWYgKHJlZ19JUlFbaV0pCi0JCQlyZXF1ZXN0X2lycShpLCBkb19lYXRhX3Bpb19pbnRfaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwgIkVBVEEtUElPIiwgTlVMTCk7CisJCQlyZXF1ZXN0X2lycShpLCBkb19lYXRhX3Bpb19pbnRfaGFuZGxlciwgMCwgIkVBVEEtUElPIiwgTlVMTCk7CiAKIAlIQkFfcHRyID0gZmlyc3RfSEJBOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZXNhczJyL2VzYXMycl9pbml0LmMgYi9kcml2ZXJzL3Njc2kvZXNhczJyL2VzYXMycl9pbml0LmMKaW5kZXggYjk3NTBlMi4uNjc3NjkzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2VzYXMyci9lc2FzMnJfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9lc2FzMnIvZXNhczJyX2luaXQuYwpAQCAtMjMxLDcgKzIzMSw3IEBACiAKIHN0YXRpYyB2b2lkIGVzYXMycl9jbGFpbV9pbnRlcnJ1cHRzKHN0cnVjdCBlc2FzMnJfYWRhcHRlciAqYSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gSVJRRl9ESVNBQkxFRDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAogCWlmIChhLT5pbnRyX21vZGUgPT0gSU5UUl9NT0RFX0xFR0FDWSkKIAkJZmxhZ3MgfD0gSVJRRl9TSEFSRUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZXNhczJyL2VzYXMycl9sb2cuYyBiL2RyaXZlcnMvc2NzaS9lc2FzMnIvZXNhczJyX2xvZy5jCmluZGV4IDliZjI4NWQuLmE4MjAzMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9lc2FzMnIvZXNhczJyX2xvZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9lc2FzMnIvZXNhczJyX2xvZy5jCkBAIC0xNjUsMTMgKzE2NSw5IEBACiAKIAkJLyoKIAkJICogUHV0IGEgbGluZSBicmVhayBhdCB0aGUgZW5kIG9mIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIHNvIHRoYXQKLQkJICogd2UgZG9uJ3Qgd2luZCB1cCB3aXRoIHJ1bi1vbiBtZXNzYWdlcy4gIG9ubHkgYXBwZW5kIGlmIHRoZXJlCi0JCSAqIGlzIGVub3VnaCBzcGFjZSBpbiB0aGUgYnVmZmVyLgorCQkgKiB3ZSBkb24ndCB3aW5kIHVwIHdpdGggcnVuLW9uIG1lc3NhZ2VzLgogCQkgKi8KLQkJaWYgKHN0cmxlbihldmVudF9idWZmZXIpIDwgYnVmbGVuKQotCQkJc3RyY2F0KGJ1ZmZlciwgIlxuIik7Ci0KLQkJcHJpbnRrKGV2ZW50X2J1ZmZlcik7CisJCXByaW50aygiJXNcbiIsIGV2ZW50X2J1ZmZlcik7CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRfYnVmZmVyX2xvY2ssIGZsYWdzKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZ19OQ1I1MzgwLmMgYi9kcml2ZXJzL3Njc2kvZ19OQ1I1MzgwLmMKaW5kZXggNWNlYzZjNi4uNzE3NjM2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2dfTkNSNTM4MC5jCisrKyBiL2RyaXZlcnMvc2NzaS9nX05DUjUzODAuYwpAQCAtNDYxLDcgKzQ2MSw3IEBACiAKIAkJaWYgKGluc3RhbmNlLT5pcnEgIT0gU0NTSV9JUlFfTk9ORSkKIAkJCWlmIChyZXF1ZXN0X2lycShpbnN0YW5jZS0+aXJxLCBnZW5lcmljX05DUjUzODBfaW50ciwKLQkJCQkJSVJRRl9ESVNBQkxFRCwgIk5DUjUzODAiLCBpbnN0YW5jZSkpIHsKKwkJCQkJMCwgIk5DUjUzODAiLCBpbnN0YW5jZSkpIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQgOiBJUlElZCBub3QgZnJlZSwgaW50ZXJydXB0cyBkaXNhYmxlZFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIGluc3RhbmNlLT5pcnEpOwogCQkJCWluc3RhbmNlLT5pcnEgPSBTQ1NJX0lSUV9OT05FOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2dkdGguYyBiL2RyaXZlcnMvc2NzaS9nZHRoLmMKaW5kZXggY2U1ZWYwMTkwLi4wZjFhZTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZ2R0aC5jCisrKyBiL2RyaXZlcnMvc2NzaS9nZHRoLmMKQEAgLTQ3MTEsNyArNDcxMSw3IEBACiAJcHJpbnRrKCJDb25maWd1cmluZyBHRFQtSVNBIEhBIGF0IEJJT1MgMHglMDVYIElSUSAldSBEUlEgJXVcbiIsCiAJCWlzYV9iaW9zLCBoYS0+aXJxLCBoYS0+ZHJxKTsKIAotCWVycm9yID0gcmVxdWVzdF9pcnEoaGEtPmlycSwgZ2R0aF9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsICJnZHRoIiwgaGEpOworCWVycm9yID0gcmVxdWVzdF9pcnEoaGEtPmlycSwgZ2R0aF9pbnRlcnJ1cHQsIDAsICJnZHRoIiwgaGEpOwogCWlmIChlcnJvcikgewogCQlwcmludGsoIkdEVC1JU0E6IFVuYWJsZSB0byBhbGxvY2F0ZSBJUlFcbiIpOwogCQlnb3RvIG91dF9ob3N0X3B1dDsKQEAgLTQ4NDMsNyArNDg0Myw3IEBACiAJcHJpbnRrKCJDb25maWd1cmluZyBHRFQtRUlTQSBIQSBhdCBTbG90ICVkIElSUSAldVxuIiwKIAkJZWlzYV9zbG90ID4+IDEyLCBoYS0+aXJxKTsKIAotCWVycm9yID0gcmVxdWVzdF9pcnEoaGEtPmlycSwgZ2R0aF9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsICJnZHRoIiwgaGEpOworCWVycm9yID0gcmVxdWVzdF9pcnEoaGEtPmlycSwgZ2R0aF9pbnRlcnJ1cHQsIDAsICJnZHRoIiwgaGEpOwogCWlmIChlcnJvcikgewogCQlwcmludGsoIkdEVC1FSVNBOiBVbmFibGUgdG8gYWxsb2NhdGUgSVJRXG4iKTsKIAkJZ290byBvdXRfaG9zdF9wdXQ7CkBAIC00OTc5LDcgKzQ5NzksNyBAQAogCQloYS0+aXJxKTsKIAogCWVycm9yID0gcmVxdWVzdF9pcnEoaGEtPmlycSwgZ2R0aF9pbnRlcnJ1cHQsCi0JCQkJSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwgImdkdGgiLCBoYSk7CisJCQkJSVJRRl9TSEFSRUQsICJnZHRoIiwgaGEpOwogCWlmIChlcnJvcikgewogCQlwcmludGsoIkdEVC1QQ0k6IFVuYWJsZSB0byBhbGxvY2F0ZSBJUlFcbiIpOwogCQlnb3RvIG91dF9ob3N0X3B1dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ob3N0cy5jIGIvZHJpdmVycy9zY3NpL2hvc3RzLmMKaW5kZXggZjI4ZWEwNy4uM2NiYjU3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hvc3RzLmMKKysrIGIvZHJpdmVycy9zY3NpL2hvc3RzLmMKQEAgLTM5OCw3ICszOTgsNyBAQAogCXNob3N0LT5vcmRlcmVkX3RhZyA9IHNodC0+b3JkZXJlZF90YWc7CiAJc2hvc3QtPm5vX3dyaXRlX3NhbWUgPSBzaHQtPm5vX3dyaXRlX3NhbWU7CiAKLQlpZiAoc2hvc3RfZWhfZGVhZGxpbmUgPT0gLTEpCisJaWYgKHNob3N0X2VoX2RlYWRsaW5lID09IC0xIHx8ICFzaHQtPmVoX2hvc3RfcmVzZXRfaGFuZGxlcikKIAkJc2hvc3QtPmVoX2RlYWRsaW5lID0gLTE7CiAJZWxzZSBpZiAoKHVsb25nKSBzaG9zdF9laF9kZWFkbGluZSAqIEhaID4gSU5UX01BWCkgewogCQlzaG9zdF9wcmludGsoS0VSTl9XQVJOSU5HLCBzaG9zdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ocHNhLmMgYi9kcml2ZXJzL3Njc2kvaHBzYS5jCmluZGV4IDg2ODMxOGEuLjhjZjRhMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ocHNhLmMKKysrIGIvZHJpdmVycy9zY3NpL2hwc2EuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiAgICBEaXNrIEFycmF5IGRyaXZlciBmb3IgSFAgU21hcnQgQXJyYXkgU0FTIGNvbnRyb2xsZXJzCi0gKiAgICBDb3B5cmlnaHQgMjAwMCwgMjAwOSBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgorICogICAgQ29weXJpZ2h0IDIwMDAsIDIwMTQgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4KICAqCiAgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTQ3LDEzICs0NywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSAiaHBzYV9jbWQuaCIKICNpbmNsdWRlICJocHNhLmgiCiAKIC8qIEhQU0FfRFJJVkVSX1ZFUlNJT04gbXVzdCBiZSAzIGJ5dGUgdmFsdWVzICgwLTI1NSkgc2VwYXJhdGVkIGJ5ICcuJyAqLwotI2RlZmluZSBIUFNBX0RSSVZFUl9WRVJTSU9OICIzLjQuMC0xIgorI2RlZmluZSBIUFNBX0RSSVZFUl9WRVJTSU9OICIzLjQuNC0xIgogI2RlZmluZSBEUklWRVJfTkFNRSAiSFAgSFBTQSBEcml2ZXIgKHYgIiBIUFNBX0RSSVZFUl9WRVJTSU9OICIpIgogI2RlZmluZSBIUFNBICJocHNhIgogCkBAIC0xMTgsNiArMTE4LDExIEBACiAJe1BDSV9WRU5ET1JfSURfSFAsICAgICBQQ0lfREVWSUNFX0lEX0hQX0NJU1NJLCAgICAgMHgxMDNDLCAweDIxQzd9LAogCXtQQ0lfVkVORE9SX0lEX0hQLCAgICAgUENJX0RFVklDRV9JRF9IUF9DSVNTSSwgICAgIDB4MTAzQywgMHgyMUM4fSwKIAl7UENJX1ZFTkRPUl9JRF9IUCwgICAgIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0ksICAgICAweDEwM0MsIDB4MjFDOX0sCisJe1BDSV9WRU5ET1JfSURfSFBfM1BBUiwgMHgwMDc1LCAweDE1OTAsIDB4MDA3Nn0sCisJe1BDSV9WRU5ET1JfSURfSFBfM1BBUiwgMHgwMDc1LCAweDE1OTAsIDB4MDA4N30sCisJe1BDSV9WRU5ET1JfSURfSFBfM1BBUiwgMHgwMDc1LCAweDE1OTAsIDB4MDA3RH0sCisJe1BDSV9WRU5ET1JfSURfSFBfM1BBUiwgMHgwMDc1LCAweDE1OTAsIDB4MDA4OH0sCisJe1BDSV9WRU5ET1JfSURfSFAsIDB4MzMzZiwgMHgxMDNjLCAweDMzM2Z9LAogCXtQQ0lfVkVORE9SX0lEX0hQLCAgICAgUENJX0FOWV9JRCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKIAkJUENJX0NMQVNTX1NUT1JBR0VfUkFJRCA8PCA4LCAweGZmZmYgPDwgOCwgMH0sCiAJezAsfQpAQCAtMTYzLDYgKzE2OCwxMSBAQAogCXsweDIxQzcxMDNDLCAiU21hcnQgQXJyYXkiLCAmU0E1X2FjY2Vzc30sCiAJezB4MjFDODEwM0MsICJTbWFydCBBcnJheSIsICZTQTVfYWNjZXNzfSwKIAl7MHgyMUM5MTAzQywgIlNtYXJ0IEFycmF5IiwgJlNBNV9hY2Nlc3N9LAorCXsweDAwNzYxNTkwLCAiSFAgU3RvcmFnZSBQMTIyNCBBcnJheSBDb250cm9sbGVyIiwgJlNBNV9hY2Nlc3N9LAorCXsweDAwODcxNTkwLCAiSFAgU3RvcmFnZSBQMTIyNGUgQXJyYXkgQ29udHJvbGxlciIsICZTQTVfYWNjZXNzfSwKKwl7MHgwMDdEMTU5MCwgIkhQIFN0b3JhZ2UgUDEyMjggQXJyYXkgQ29udHJvbGxlciIsICZTQTVfYWNjZXNzfSwKKwl7MHgwMDg4MTU5MCwgIkhQIFN0b3JhZ2UgUDEyMjhlIEFycmF5IENvbnRyb2xsZXIiLCAmU0E1X2FjY2Vzc30sCisJezB4MzMzZjEwM2MsICJIUCBTdG9yYWdlV29ya3MgMTIxMG0gQXJyYXkgQ29udHJvbGxlciIsICZTQTVfYWNjZXNzfSwKIAl7MHhGRkZGMTAzQywgIlVua25vd24gU21hcnQgQXJyYXkiLCAmU0E1X2FjY2Vzc30sCiB9OwogCkBAIC0xODIsOCArMTkyLDkgQEAKIHN0YXRpYyBzdHJ1Y3QgQ29tbWFuZExpc3QgKmNtZF9hbGxvYyhzdHJ1Y3QgY3Rscl9pbmZvICpoKTsKIHN0YXRpYyBzdHJ1Y3QgQ29tbWFuZExpc3QgKmNtZF9zcGVjaWFsX2FsbG9jKHN0cnVjdCBjdGxyX2luZm8gKmgpOwogc3RhdGljIGludCBmaWxsX2NtZChzdHJ1Y3QgQ29tbWFuZExpc3QgKmMsIHU4IGNtZCwgc3RydWN0IGN0bHJfaW5mbyAqaCwKLQl2b2lkICpidWZmLCBzaXplX3Qgc2l6ZSwgdTggcGFnZV9jb2RlLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsCisJdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsIHUxNiBwYWdlX2NvZGUsIHVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwKIAlpbnQgY21kX3R5cGUpOworI2RlZmluZSBWUERfUEFHRSAoMSA8PCA4KQogCiBzdGF0aWMgaW50IGhwc2Ffc2NzaV9xdWV1ZV9jb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKmgsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CiBzdGF0aWMgdm9pZCBocHNhX3NjYW5fc3RhcnQoc3RydWN0IFNjc2lfSG9zdCAqKTsKQEAgLTIwNCw3ICsyMTUsNyBAQAogCXN0cnVjdCBDb21tYW5kTGlzdCAqYyk7CiAvKiBwZXJmb3JtYW50IG1vZGUgaGVscGVyIGZ1bmN0aW9ucyAqLwogc3RhdGljIHZvaWQgY2FsY19idWNrZXRfbWFwKGludCAqYnVja2V0LCBpbnQgbnVtX2J1Y2tldHMsCi0JaW50IG5zZ3MsIGludCAqYnVja2V0X21hcCk7CisJaW50IG5zZ3MsIGludCBtaW5fYmxvY2tzLCBpbnQgKmJ1Y2tldF9tYXApOwogc3RhdGljIHZvaWQgaHBzYV9wdXRfY3Rscl9pbnRvX3BlcmZvcm1hbnRfbW9kZShzdHJ1Y3QgY3Rscl9pbmZvICpoKTsKIHN0YXRpYyBpbmxpbmUgdTMyIG5leHRfY29tbWFuZChzdHJ1Y3QgY3Rscl9pbmZvICpoLCB1OCBxKTsKIHN0YXRpYyBpbnQgaHBzYV9maW5kX2NmZ19hZGRycyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCBfX2lvbWVtICp2YWRkciwKQEAgLTIxNiw4ICsyMjcsMTQgQEAKIHN0YXRpYyBpbnQgaHBzYV93YWl0X2Zvcl9ib2FyZF9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCBfX2lvbWVtICp2YWRkciwKIAkJCQkgICAgIGludCB3YWl0X2Zvcl9yZWFkeSk7CiBzdGF0aWMgaW5saW5lIHZvaWQgZmluaXNoX2NtZChzdHJ1Y3QgQ29tbWFuZExpc3QgKmMpOworc3RhdGljIHZvaWQgaHBzYV93YWl0X2Zvcl9tb2RlX2NoYW5nZV9hY2soc3RydWN0IGN0bHJfaW5mbyAqaCk7CiAjZGVmaW5lIEJPQVJEX05PVF9SRUFEWSAwCiAjZGVmaW5lIEJPQVJEX1JFQURZIDEKK3N0YXRpYyB2b2lkIGhwc2FfZHJhaW5fYWNjZWxfY29tbWFuZHMoc3RydWN0IGN0bHJfaW5mbyAqaCk7CitzdGF0aWMgdm9pZCBocHNhX2ZsdXNoX2NhY2hlKHN0cnVjdCBjdGxyX2luZm8gKmgpOworc3RhdGljIGludCBocHNhX3Njc2lfaW9hY2NlbF9xdWV1ZV9jb21tYW5kKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJc3RydWN0IENvbW1hbmRMaXN0ICpjLCB1MzIgaW9hY2NlbF9oYW5kbGUsIHU4ICpjZGIsIGludCBjZGJfbGVuLAorCXU4ICpzY3NpM2FkZHIpOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjdGxyX2luZm8gKnNkZXZfdG9faGJhKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKQEAgLTI4MCw2ICsyOTcsNTUgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIHNzaXplX3QgaG9zdF9zdG9yZV9ocF9zc2Rfc21hcnRfcGF0aF9zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgc3RhdHVzLCBsZW47CisJc3RydWN0IGN0bHJfaW5mbyAqaDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJY2hhciB0bXBidWZbMTBdOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8ICFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQlyZXR1cm4gLUVBQ0NFUzsKKwlsZW4gPSBjb3VudCA+IHNpemVvZih0bXBidWYpIC0gMSA/IHNpemVvZih0bXBidWYpIC0gMSA6IGNvdW50OworCXN0cm5jcHkodG1wYnVmLCBidWYsIGxlbik7CisJdG1wYnVmW2xlbl0gPSAnXDAnOworCWlmIChzc2NhbmYodG1wYnVmLCAiJWQiLCAmc3RhdHVzKSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwloID0gc2hvc3RfdG9faGJhKHNob3N0KTsKKwloLT5hY2Npb3BhdGhfc3RhdHVzID0gISFzdGF0dXM7CisJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJImhwc2E6IEhQIFNTRCBTbWFydCBQYXRoICVzIHZpYSBzeXNmcyB1cGRhdGUuXG4iLAorCQloLT5hY2Npb3BhdGhfc3RhdHVzID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBob3N0X3N0b3JlX3JhaWRfb2ZmbG9hZF9kZWJ1ZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBkZWJ1Z19sZXZlbCwgbGVuOworCXN0cnVjdCBjdGxyX2luZm8gKmg7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCWNoYXIgdG1wYnVmWzEwXTsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisJbGVuID0gY291bnQgPiBzaXplb2YodG1wYnVmKSAtIDEgPyBzaXplb2YodG1wYnVmKSAtIDEgOiBjb3VudDsKKwlzdHJuY3B5KHRtcGJ1ZiwgYnVmLCBsZW4pOworCXRtcGJ1ZltsZW5dID0gJ1wwJzsKKwlpZiAoc3NjYW5mKHRtcGJ1ZiwgIiVkIiwgJmRlYnVnX2xldmVsKSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZGVidWdfbGV2ZWwgPCAwKQorCQlkZWJ1Z19sZXZlbCA9IDA7CisJaCA9IHNob3N0X3RvX2hiYShzaG9zdCk7CisJaC0+cmFpZF9vZmZsb2FkX2RlYnVnID0gZGVidWdfbGV2ZWw7CisJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgImhwc2E6IFNldCByYWlkX29mZmxvYWRfZGVidWcgbGV2ZWwgPSAlZFxuIiwKKwkJaC0+cmFpZF9vZmZsb2FkX2RlYnVnKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IGhvc3Rfc3RvcmVfcmVzY2FuKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQpAQCAtMzI3LDYgKzM5MywxNyBAQAogCQkJInBlcmZvcm1hbnQiIDogInNpbXBsZSIpOwogfQogCitzdGF0aWMgc3NpemVfdCBob3N0X3Nob3dfaHBfc3NkX3NtYXJ0X3BhdGhfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBjdGxyX2luZm8gKmg7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCisJaCA9IHNob3N0X3RvX2hiYShzaG9zdCk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMzAsICJIUCBTU0QgU21hcnQgUGF0aCAlc1xuIiwKKwkJKGgtPmFjY2lvcGF0aF9zdGF0dXMgPT0gMSkgPyAgImVuYWJsZWQiIDogImRpc2FibGVkIik7Cit9CisKIC8qIExpc3Qgb2YgY29udHJvbGxlcnMgd2hpY2ggY2Fubm90IGJlIGhhcmQgcmVzZXQgb24ga2V4ZWMgd2l0aCByZXNldF9kZXZpY2VzICovCiBzdGF0aWMgdTMyIHVucmVzZXR0YWJsZV9jb250cm9sbGVyW10gPSB7CiAJMHgzMjRhMTAzQywgLyogU21hcnQgQXJyYXkgUDcxMm0gKi8KQEAgLTQxNiw2ICs0OTMsMTMgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpyYWlkX2xhYmVsW10gPSB7ICIwIiwgIjQiLCAiMSgxKzApIiwgIjUiLCAiNSsxIiwgIkFERyIsCiAJIjEoQURNKSIsICJVTktOT1dOIgogfTsKKyNkZWZpbmUgSFBTQV9SQUlEXzAJMAorI2RlZmluZSBIUFNBX1JBSURfNAkxCisjZGVmaW5lIEhQU0FfUkFJRF8xCTIJLyogYWxzbyB1c2VkIGZvciBSQUlEIDEwICovCisjZGVmaW5lIEhQU0FfUkFJRF81CTMJLyogYWxzbyB1c2VkIGZvciBSQUlEIDUwICovCisjZGVmaW5lIEhQU0FfUkFJRF81MQk0CisjZGVmaW5lIEhQU0FfUkFJRF82CTUJLyogYWxzbyB1c2VkIGZvciBSQUlEIDYwICovCisjZGVmaW5lIEhQU0FfUkFJRF9BRE0JNgkvKiBhbHNvIHVzZWQgZm9yIFJBSUQgMSswIEFETSAqLwogI2RlZmluZSBSQUlEX1VOS05PV04gKEFSUkFZX1NJWkUocmFpZF9sYWJlbCkgLSAxKQogCiBzdGF0aWMgc3NpemVfdCByYWlkX2xldmVsX3Nob3coc3RydWN0IGRldmljZSAqZGV2LApAQCAtNTA0LDEwICs1ODgsMzkgQEAKIAkJCXNuWzEyXSwgc25bMTNdLCBzblsxNF0sIHNuWzE1XSk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGhvc3Rfc2hvd19ocF9zc2Rfc21hcnRfcGF0aF9lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGN0bHJfaW5mbyAqaDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqaGRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBvZmZsb2FkX2VuYWJsZWQ7CisKKwlzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwloID0gc2Rldl90b19oYmEoc2Rldik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKKwloZGV2ID0gc2Rldi0+aG9zdGRhdGE7CisJaWYgKCFoZGV2KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCW9mZmxvYWRfZW5hYmxlZCA9IGhkZXYtPm9mZmxvYWRfZW5hYmxlZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICIlZFxuIiwgb2ZmbG9hZF9lbmFibGVkKTsKK30KKwogc3RhdGljIERFVklDRV9BVFRSKHJhaWRfbGV2ZWwsIFNfSVJVR08sIHJhaWRfbGV2ZWxfc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIobHVuaWQsIFNfSVJVR08sIGx1bmlkX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKHVuaXF1ZV9pZCwgU19JUlVHTywgdW5pcXVlX2lkX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKHJlc2NhbiwgU19JV1VTUiwgTlVMTCwgaG9zdF9zdG9yZV9yZXNjYW4pOworc3RhdGljIERFVklDRV9BVFRSKGhwX3NzZF9zbWFydF9wYXRoX2VuYWJsZWQsIFNfSVJVR08sCisJCQlob3N0X3Nob3dfaHBfc3NkX3NtYXJ0X3BhdGhfZW5hYmxlZCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaHBfc3NkX3NtYXJ0X3BhdGhfc3RhdHVzLCBTX0lXVVNSfFNfSVJVR098U19JUk9USCwKKwkJaG9zdF9zaG93X2hwX3NzZF9zbWFydF9wYXRoX3N0YXR1cywKKwkJaG9zdF9zdG9yZV9ocF9zc2Rfc21hcnRfcGF0aF9zdGF0dXMpOworc3RhdGljIERFVklDRV9BVFRSKHJhaWRfb2ZmbG9hZF9kZWJ1ZywgU19JV1VTUiwgTlVMTCwKKwkJCWhvc3Rfc3RvcmVfcmFpZF9vZmZsb2FkX2RlYnVnKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihmaXJtd2FyZV9yZXZpc2lvbiwgU19JUlVHTywKIAlob3N0X3Nob3dfZmlybXdhcmVfcmV2aXNpb24sIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKGNvbW1hbmRzX291dHN0YW5kaW5nLCBTX0lSVUdPLApAQCAtNTIxLDYgKzYzNCw3IEBACiAJJmRldl9hdHRyX3JhaWRfbGV2ZWwsCiAJJmRldl9hdHRyX2x1bmlkLAogCSZkZXZfYXR0cl91bmlxdWVfaWQsCisJJmRldl9hdHRyX2hwX3NzZF9zbWFydF9wYXRoX2VuYWJsZWQsCiAJTlVMTCwKIH07CiAKQEAgLTUzMCw2ICs2NDQsOCBAQAogCSZkZXZfYXR0cl9jb21tYW5kc19vdXRzdGFuZGluZywKIAkmZGV2X2F0dHJfdHJhbnNwb3J0X21vZGUsCiAJJmRldl9hdHRyX3Jlc2V0dGFibGUsCisJJmRldl9hdHRyX2hwX3NzZF9zbWFydF9wYXRoX3N0YXR1cywKKwkmZGV2X2F0dHJfcmFpZF9vZmZsb2FkX2RlYnVnLAogCU5VTEwsCiB9OwogCkBAIC01NzAsNiArNjg2LDkgQEAKIAlzdHJ1Y3QgcmVwbHlfcG9vbCAqcnEgPSAmaC0+cmVwbHlfcXVldWVbcV07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWlmIChoLT50cmFuc01ldGhvZCAmIENGR1RCTF9UcmFuc19pb19hY2NlbDEpCisJCXJldHVybiBoLT5hY2Nlc3MuY29tbWFuZF9jb21wbGV0ZWQoaCwgcSk7CisKIAlpZiAodW5saWtlbHkoIShoLT50cmFuc01ldGhvZCAmIENGR1RCTF9UcmFuc19QZXJmb3JtYW50KSkpCiAJCXJldHVybiBoLT5hY2Nlc3MuY29tbWFuZF9jb21wbGV0ZWQoaCwgcSk7CiAKQEAgLTU5MCw2ICs3MDksMzIgQEAKIAlyZXR1cm4gYTsKIH0KIAorLyoKKyAqIFRoZXJlIGFyZSBzb21lIHNwZWNpYWwgYml0cyBpbiB0aGUgYnVzIGFkZHJlc3Mgb2YgdGhlCisgKiBjb21tYW5kIHRoYXQgd2UgaGF2ZSB0byBzZXQgZm9yIHRoZSBjb250cm9sbGVyIHRvIGtub3cKKyAqIGhvdyB0byBwcm9jZXNzIHRoZSBjb21tYW5kOgorICoKKyAqIE5vcm1hbCBwZXJmb3JtYW50IG1vZGU6CisgKiBiaXQgMDogMSBtZWFucyBwZXJmb3JtYW50IG1vZGUsIDAgbWVhbnMgc2ltcGxlIG1vZGUuCisgKiBiaXRzIDEtMyA9IGJsb2NrIGZldGNoIHRhYmxlIGVudHJ5CisgKiBiaXRzIDQtNiA9IGNvbW1hbmQgdHlwZSAoPT0gMCkKKyAqCisgKiBpb2FjY2VsMSBtb2RlOgorICogYml0IDAgPSAicGVyZm9ybWFudCBtb2RlIiBiaXQuCisgKiBiaXRzIDEtMyA9IGJsb2NrIGZldGNoIHRhYmxlIGVudHJ5CisgKiBiaXRzIDQtNiA9IGNvbW1hbmQgdHlwZSAoPT0gMTEwKQorICogKGNvbW1hbmQgdHlwZSBpcyBuZWVkZWQgYmVjYXVzZSBpb2FjY2VsMSBtb2RlCisgKiBjb21tYW5kcyBhcmUgc3VibWl0dGVkIHRocm91Z2ggdGhlIHNhbWUgcmVnaXN0ZXIgYXMgbm9ybWFsCisgKiBtb2RlIGNvbW1hbmRzLCBzbyB0aGlzIGlzIGhvdyB0aGUgY29udHJvbGxlciBrbm93cyB3aGV0aGVyCisgKiB0aGUgY29tbWFuZCBpcyBub3JtYWwgbW9kZSBvciBpb2FjY2VsMSBtb2RlLikKKyAqCisgKiBpb2FjY2VsMiBtb2RlOgorICogYml0IDAgPSAicGVyZm9ybWFudCBtb2RlIiBiaXQuCisgKiBiaXRzIDEtNCA9IGJsb2NrIGZldGNoIHRhYmxlIGVudHJ5IChub3RlIGV4dHJhIGJpdCkKKyAqIGJpdHMgNC02ID0gbm90IG5lZWRlZCwgYmVjYXVzZSBpb2FjY2VsMiBtb2RlIGhhcworICogYSBzZXBhcmF0ZSBzcGVjaWFsIHJlZ2lzdGVyIGZvciBzdWJtaXR0aW5nIGNvbW1hbmRzLgorICovCisKIC8qIHNldF9wZXJmb3JtYW50X21vZGU6IE1vZGlmeSB0aGUgdGFnIGZvciBjY2lzcyBwZXJmb3JtYW50CiAgKiBzZXQgYml0IDAgZm9yIHB1bGwgbW9kZWwsIGJpdHMgMy0xIGZvciBibG9jayBmZXRjaAogICogcmVnaXN0ZXIgbnVtYmVyCkBAIC01OTgsMTIgKzc0Myw0NyBAQAogewogCWlmIChsaWtlbHkoaC0+dHJhbnNNZXRob2QgJiBDRkdUQkxfVHJhbnNfUGVyZm9ybWFudCkpIHsKIAkJYy0+YnVzYWRkciB8PSAxIHwgKGgtPmJsb2NrRmV0Y2hUYWJsZVtjLT5IZWFkZXIuU0dMaXN0XSA8PCAxKTsKLQkJaWYgKGxpa2VseShoLT5tc2l4X3ZlY3RvcikpCisJCWlmIChsaWtlbHkoaC0+bXNpeF92ZWN0b3IgPiAwKSkKIAkJCWMtPkhlYWRlci5SZXBseVF1ZXVlID0KIAkJCQlyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpICUgaC0+bnJlcGx5X3F1ZXVlczsKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHNldF9pb2FjY2VsMV9wZXJmb3JtYW50X21vZGUoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwkJCQkJCXN0cnVjdCBDb21tYW5kTGlzdCAqYykKK3sKKwlzdHJ1Y3QgaW9fYWNjZWwxX2NtZCAqY3AgPSAmaC0+aW9hY2NlbF9jbWRfcG9vbFtjLT5jbWRpbmRleF07CisKKwkvKiBUZWxsIHRoZSBjb250cm9sbGVyIHRvIHBvc3QgdGhlIHJlcGx5IHRvIHRoZSBxdWV1ZSBmb3IgdGhpcworCSAqIHByb2Nlc3Nvci4gIFRoaXMgc2VlbXMgdG8gZ2l2ZSB0aGUgYmVzdCBJL08gdGhyb3VnaHB1dC4KKwkgKi8KKwljcC0+UmVwbHlRdWV1ZSA9IHNtcF9wcm9jZXNzb3JfaWQoKSAlIGgtPm5yZXBseV9xdWV1ZXM7CisJLyogU2V0IHRoZSBiaXRzIGluIHRoZSBhZGRyZXNzIHNlbnQgZG93biB0byBpbmNsdWRlOgorCSAqICAtIHBlcmZvcm1hbnQgbW9kZSBiaXQgKGJpdCAwKQorCSAqICAtIHB1bGwgY291bnQgKGJpdHMgMS0zKQorCSAqICAtIGNvbW1hbmQgdHlwZSAoYml0cyA0LTYpCisJICovCisJYy0+YnVzYWRkciB8PSAxIHwgKGgtPmlvYWNjZWwxX2Jsb2NrRmV0Y2hUYWJsZVtjLT5IZWFkZXIuU0dMaXN0XSA8PCAxKSB8CisJCQkJCUlPQUNDRUwxX0JVU0FERFJfQ01EVFlQRTsKK30KKworc3RhdGljIHZvaWQgc2V0X2lvYWNjZWwyX3BlcmZvcm1hbnRfbW9kZShzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCQkJCQkJc3RydWN0IENvbW1hbmRMaXN0ICpjKQoreworCXN0cnVjdCBpb19hY2NlbDJfY21kICpjcCA9ICZoLT5pb2FjY2VsMl9jbWRfcG9vbFtjLT5jbWRpbmRleF07CisKKwkvKiBUZWxsIHRoZSBjb250cm9sbGVyIHRvIHBvc3QgdGhlIHJlcGx5IHRvIHRoZSBxdWV1ZSBmb3IgdGhpcworCSAqIHByb2Nlc3Nvci4gIFRoaXMgc2VlbXMgdG8gZ2l2ZSB0aGUgYmVzdCBJL08gdGhyb3VnaHB1dC4KKwkgKi8KKwljcC0+cmVwbHlfcXVldWUgPSBzbXBfcHJvY2Vzc29yX2lkKCkgJSBoLT5ucmVwbHlfcXVldWVzOworCS8qIFNldCB0aGUgYml0cyBpbiB0aGUgYWRkcmVzcyBzZW50IGRvd24gdG8gaW5jbHVkZToKKwkgKiAgLSBwZXJmb3JtYW50IG1vZGUgYml0IG5vdCB1c2VkIGluIGlvYWNjZWwgbW9kZSAyCisJICogIC0gcHVsbCBjb3VudCAoYml0cyAwLTMpCisJICogIC0gY29tbWFuZCB0eXBlIGlzbid0IG5lZWRlZCBmb3IgaW9hY2NlbDIKKwkgKi8KKwljLT5idXNhZGRyIHw9IChoLT5pb2FjY2VsMl9ibG9ja0ZldGNoVGFibGVbY3AtPnNnX2NvdW50XSk7Cit9CisKIHN0YXRpYyBpbnQgaXNfZmlybXdhcmVfZmxhc2hfY21kKHU4ICpjZGIpCiB7CiAJcmV0dXJuIGNkYlswXSA9PSBCTUlDX1dSSVRFICYmIGNkYls2XSA9PSBCTUlDX0ZMQVNIX0ZJUk1XQVJFOwpAQCAtNjM4LDcgKzgxOCwxNiBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzZXRfcGVyZm9ybWFudF9tb2RlKGgsIGMpOworCXN3aXRjaCAoYy0+Y21kX3R5cGUpIHsKKwljYXNlIENNRF9JT0FDQ0VMMToKKwkJc2V0X2lvYWNjZWwxX3BlcmZvcm1hbnRfbW9kZShoLCBjKTsKKwkJYnJlYWs7CisJY2FzZSBDTURfSU9BQ0NFTDI6CisJCXNldF9pb2FjY2VsMl9wZXJmb3JtYW50X21vZGUoaCwgYyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNldF9wZXJmb3JtYW50X21vZGUoaCwgYyk7CisJfQogCWRpYWxfZG93bl9sb2NrdXBfZGV0ZWN0aW9uX2R1cmluZ19md19mbGFzaChoLCBjKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+bG9jaywgZmxhZ3MpOwogCWFkZFEoJmgtPnJlcVEsIGMpOwpAQCAtNzgyLDYgKzk3MSwxNCBAQAogCiAJLyogUmFpZCBsZXZlbCBjaGFuZ2VkLiAqLwogCWgtPmRldltlbnRyeV0tPnJhaWRfbGV2ZWwgPSBuZXdfZW50cnktPnJhaWRfbGV2ZWw7CisKKwkvKiBSYWlkIG9mZmxvYWQgcGFyYW1ldGVycyBjaGFuZ2VkLiAqLworCWgtPmRldltlbnRyeV0tPm9mZmxvYWRfY29uZmlnID0gbmV3X2VudHJ5LT5vZmZsb2FkX2NvbmZpZzsKKwloLT5kZXZbZW50cnldLT5vZmZsb2FkX2VuYWJsZWQgPSBuZXdfZW50cnktPm9mZmxvYWRfZW5hYmxlZDsKKwloLT5kZXZbZW50cnldLT5pb2FjY2VsX2hhbmRsZSA9IG5ld19lbnRyeS0+aW9hY2NlbF9oYW5kbGU7CisJaC0+ZGV2W2VudHJ5XS0+b2ZmbG9hZF90b19taXJyb3IgPSBuZXdfZW50cnktPm9mZmxvYWRfdG9fbWlycm9yOworCWgtPmRldltlbnRyeV0tPnJhaWRfbWFwID0gbmV3X2VudHJ5LT5yYWlkX21hcDsKKwogCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICIlcyBkZXZpY2UgYyVkYiVkdCVkbCVkIHVwZGF0ZWQuXG4iLAogCQlzY3NpX2RldmljZV90eXBlKG5ld19lbnRyeS0+ZGV2dHlwZSksIGhvc3RubywgbmV3X2VudHJ5LT5idXMsCiAJCW5ld19lbnRyeS0+dGFyZ2V0LCBuZXdfZW50cnktPmx1bik7CkBAIC05MDIsNiArMTA5OSwxMCBAQAogCSAqLwogCWlmIChkZXYxLT5yYWlkX2xldmVsICE9IGRldjItPnJhaWRfbGV2ZWwpCiAJCXJldHVybiAxOworCWlmIChkZXYxLT5vZmZsb2FkX2NvbmZpZyAhPSBkZXYyLT5vZmZsb2FkX2NvbmZpZykKKwkJcmV0dXJuIDE7CisJaWYgKGRldjEtPm9mZmxvYWRfZW5hYmxlZCAhPSBkZXYyLT5vZmZsb2FkX2VuYWJsZWQpCisJCXJldHVybiAxOwogCXJldHVybiAwOwogfQogCkBAIC05MzIsNiArMTEzMyw5IEBACiAJCQkJCXJldHVybiBERVZJQ0VfVVBEQVRFRDsKIAkJCQlyZXR1cm4gREVWSUNFX1NBTUU7CiAJCQl9IGVsc2UgeworCQkJCS8qIEtlZXAgb2ZmbGluZSBkZXZpY2VzIG9mZmxpbmUgKi8KKwkJCQlpZiAobmVlZGxlLT52b2x1bWVfb2ZmbGluZSkKKwkJCQkJcmV0dXJuIERFVklDRV9OT1RfRk9VTkQ7CiAJCQkJcmV0dXJuIERFVklDRV9DSEFOR0VEOwogCQkJfQogCQl9CkBAIC05NDAsNiArMTE0NCwxMTAgQEAKIAlyZXR1cm4gREVWSUNFX05PVF9GT1VORDsKIH0KIAorc3RhdGljIHZvaWQgaHBzYV9tb25pdG9yX29mZmxpbmVfZGV2aWNlKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJCQkJCXVuc2lnbmVkIGNoYXIgc2NzaTNhZGRyW10pCit7CisJc3RydWN0IG9mZmxpbmVfZGV2aWNlX2VudHJ5ICpkZXZpY2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIENoZWNrIHRvIHNlZSBpZiBkZXZpY2UgaXMgYWxyZWFkeSBvbiB0aGUgbGlzdCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5vZmZsaW5lX2RldmljZV9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZpY2UsICZoLT5vZmZsaW5lX2RldmljZV9saXN0LCBvZmZsaW5lX2xpc3QpIHsKKwkJaWYgKG1lbWNtcChkZXZpY2UtPnNjc2kzYWRkciwgc2NzaTNhZGRyLAorCQkJc2l6ZW9mKGRldmljZS0+c2NzaTNhZGRyKSkgPT0gMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+b2ZmbGluZV9kZXZpY2VfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPm9mZmxpbmVfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKworCS8qIERldmljZSBpcyBub3Qgb24gdGhlIGxpc3QsIGFkZCBpdC4gKi8KKwlkZXZpY2UgPSBrbWFsbG9jKHNpemVvZigqZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZpY2UpIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIm91dCBvZiBtZW1vcnkgaW4gJXNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwltZW1jcHkoZGV2aWNlLT5zY3NpM2FkZHIsIHNjc2kzYWRkciwgc2l6ZW9mKGRldmljZS0+c2NzaTNhZGRyKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPm9mZmxpbmVfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZkZXZpY2UtPm9mZmxpbmVfbGlzdCwgJmgtPm9mZmxpbmVfZGV2aWNlX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPm9mZmxpbmVfZGV2aWNlX2xvY2ssIGZsYWdzKTsKK30KKworLyogUHJpbnQgYSBtZXNzYWdlIGV4cGxhaW5pbmcgdmFyaW91cyBvZmZsaW5lIHZvbHVtZSBzdGF0ZXMgKi8KK3N0YXRpYyB2b2lkIGhwc2Ffc2hvd192b2x1bWVfc3RhdHVzKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqc2QpCit7CisJaWYgKHNkLT52b2x1bWVfb2ZmbGluZSA9PSBIUFNBX1ZQRF9MVl9TVEFUVVNfVU5TVVBQT1JURUQpCisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiQyVkOkIlZDpUJWQ6TCVkIFZvbHVtZSBzdGF0dXMgaXMgbm90IGF2YWlsYWJsZSB0aHJvdWdoIHZpdGFsIHByb2R1Y3QgZGF0YSBwYWdlcy5cbiIsCisJCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCQlzZC0+YnVzLCBzZC0+dGFyZ2V0LCBzZC0+bHVuKTsKKwlzd2l0Y2ggKHNkLT52b2x1bWVfb2ZmbGluZSkgeworCWNhc2UgSFBTQV9MVl9PSzoKKwkJYnJlYWs7CisJY2FzZSBIUFNBX0xWX1VOREVSR09JTkdfRVJBU0U6CisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiQyVkOkIlZDpUJWQ6TCVkIFZvbHVtZSBpcyB1bmRlcmdvaW5nIGJhY2tncm91bmQgZXJhc2UgcHJvY2Vzcy5cbiIsCisJCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCQlzZC0+YnVzLCBzZC0+dGFyZ2V0LCBzZC0+bHVuKTsKKwkJYnJlYWs7CisJY2FzZSBIUFNBX0xWX1VOREVSR09JTkdfUlBJOgorCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkJIkMlZDpCJWQ6VCVkOkwlZCBWb2x1bWUgaXMgdW5kZXJnb2luZyByYXBpZCBwYXJpdHkgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy5cbiIsCisJCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCQlzZC0+YnVzLCBzZC0+dGFyZ2V0LCBzZC0+bHVuKTsKKwkJYnJlYWs7CisJY2FzZSBIUFNBX0xWX1BFTkRJTkdfUlBJOgorCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkJCSJDJWQ6QiVkOlQlZDpMJWQgVm9sdW1lIGlzIHF1ZXVlZCBmb3IgcmFwaWQgcGFyaXR5IGluaXRpYWxpemF0aW9uIHByb2Nlc3MuXG4iLAorCQkJCWgtPnNjc2lfaG9zdC0+aG9zdF9ubywKKwkJCQlzZC0+YnVzLCBzZC0+dGFyZ2V0LCBzZC0+bHVuKTsKKwkJYnJlYWs7CisJY2FzZSBIUFNBX0xWX0VOQ1JZUFRFRF9OT19LRVk6CisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiQyVkOkIlZDpUJWQ6TCVkIFZvbHVtZSBpcyBlbmNyeXB0ZWQgYW5kIGNhbm5vdCBiZSBhY2Nlc3NlZCBiZWNhdXNlIGtleSBpcyBub3QgcHJlc2VudC5cbiIsCisJCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCQlzZC0+YnVzLCBzZC0+dGFyZ2V0LCBzZC0+bHVuKTsKKwkJYnJlYWs7CisJY2FzZSBIUFNBX0xWX1BMQUlOVEVYVF9JTl9FTkNSWVBUX09OTFlfQ09OVFJPTExFUjoKKwkJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwKKwkJCSJDJWQ6QiVkOlQlZDpMJWQgVm9sdW1lIGlzIG5vdCBlbmNyeXB0ZWQgYW5kIGNhbm5vdCBiZSBhY2Nlc3NlZCBiZWNhdXNlIGNvbnRyb2xsZXIgaXMgaW4gZW5jcnlwdGlvbi1vbmx5IG1vZGUuXG4iLAorCQkJaC0+c2NzaV9ob3N0LT5ob3N0X25vLAorCQkJc2QtPmJ1cywgc2QtPnRhcmdldCwgc2QtPmx1bik7CisJCWJyZWFrOworCWNhc2UgSFBTQV9MVl9VTkRFUkdPSU5HX0VOQ1JZUFRJT046CisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiQyVkOkIlZDpUJWQ6TCVkIFZvbHVtZSBpcyB1bmRlcmdvaW5nIGVuY3J5cHRpb24gcHJvY2Vzcy5cbiIsCisJCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCQlzZC0+YnVzLCBzZC0+dGFyZ2V0LCBzZC0+bHVuKTsKKwkJYnJlYWs7CisJY2FzZSBIUFNBX0xWX1VOREVSR09JTkdfRU5DUllQVElPTl9SRUtFWUlORzoKKwkJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwKKwkJCSJDJWQ6QiVkOlQlZDpMJWQgVm9sdW1lIGlzIHVuZGVyZ29pbmcgZW5jcnlwdGlvbiByZS1rZXlpbmcgcHJvY2Vzcy5cbiIsCisJCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCQlzZC0+YnVzLCBzZC0+dGFyZ2V0LCBzZC0+bHVuKTsKKwkJYnJlYWs7CisJY2FzZSBIUFNBX0xWX0VOQ1JZUFRFRF9JTl9OT05fRU5DUllQVEVEX0NPTlRST0xMRVI6CisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiQyVkOkIlZDpUJWQ6TCVkIFZvbHVtZSBpcyBlbmNyeXB0ZWQgYW5kIGNhbm5vdCBiZSBhY2Nlc3NlZCBiZWNhdXNlIGNvbnRyb2xsZXIgZG9lcyBub3QgaGF2ZSBlbmNyeXB0aW9uIGVuYWJsZWQuXG4iLAorCQkJaC0+c2NzaV9ob3N0LT5ob3N0X25vLAorCQkJc2QtPmJ1cywgc2QtPnRhcmdldCwgc2QtPmx1bik7CisJCWJyZWFrOworCWNhc2UgSFBTQV9MVl9QRU5ESU5HX0VOQ1JZUFRJT046CisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiQyVkOkIlZDpUJWQ6TCVkIFZvbHVtZSBpcyBwZW5kaW5nIG1pZ3JhdGlvbiB0byBlbmNyeXB0ZWQgc3RhdGUsIGJ1dCBwcm9jZXNzIGhhcyBub3Qgc3RhcnRlZC5cbiIsCisJCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCQlzZC0+YnVzLCBzZC0+dGFyZ2V0LCBzZC0+bHVuKTsKKwkJYnJlYWs7CisJY2FzZSBIUFNBX0xWX1BFTkRJTkdfRU5DUllQVElPTl9SRUtFWUlORzoKKwkJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwKKwkJCSJDJWQ6QiVkOlQlZDpMJWQgVm9sdW1lIGlzIGVuY3J5cHRlZCBhbmQgaXMgcGVuZGluZyBlbmNyeXB0aW9uIHJla2V5aW5nLlxuIiwKKwkJCWgtPnNjc2lfaG9zdC0+aG9zdF9ubywKKwkJCXNkLT5idXMsIHNkLT50YXJnZXQsIHNkLT5sdW4pOworCQlicmVhazsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGFkanVzdF9ocHNhX3Njc2lfdGFibGUoc3RydWN0IGN0bHJfaW5mbyAqaCwgaW50IGhvc3RubywKIAlzdHJ1Y3QgaHBzYV9zY3NpX2Rldl90ICpzZFtdLCBpbnQgbnNkcykKIHsKQEAgLTEwMDQsNiArMTMxMiwyMCBAQAogCWZvciAoaSA9IDA7IGkgPCBuc2RzOyBpKyspIHsKIAkJaWYgKCFzZFtpXSkgLyogaWYgYWxyZWFkeSBhZGRlZCBhYm92ZS4gKi8KIAkJCWNvbnRpbnVlOworCisJCS8qIERvbid0IGFkZCBkZXZpY2VzIHdoaWNoIGFyZSBOT1QgUkVBRFksIEZPUk1BVCBJTiBQUk9HUkVTUworCQkgKiBhcyB0aGUgU0NTSSBtaWQtbGF5ZXIgZG9lcyBub3QgaGFuZGxlIHN1Y2ggZGV2aWNlcyB3ZWxsLgorCQkgKiBJdCByZWxlbnRsZXNzbHkgbG9vcHMgc2VuZGluZyBUVVIgYXQgM0h6LCB0aGVuIFJFQUQoMTApCisJCSAqIGF0IDE2MEh6LCBhbmQgcHJldmVudHMgdGhlIHN5c3RlbSBmcm9tIGNvbWluZyB1cC4KKwkJICovCisJCWlmIChzZFtpXS0+dm9sdW1lX29mZmxpbmUpIHsKKwkJCWhwc2Ffc2hvd192b2x1bWVfc3RhdHVzKGgsIHNkW2ldKTsKKwkJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJjJWRiJWR0JWRsJWQ6IHRlbXBvcmFyaWx5IG9mZmxpbmVcbiIsCisJCQkJaC0+c2NzaV9ob3N0LT5ob3N0X25vLAorCQkJCXNkW2ldLT5idXMsIHNkW2ldLT50YXJnZXQsIHNkW2ldLT5sdW4pOworCQkJY29udGludWU7CisJCX0KKwogCQlkZXZpY2VfY2hhbmdlID0gaHBzYV9zY3NpX2ZpbmRfZW50cnkoc2RbaV0sIGgtPmRldiwKIAkJCQkJaC0+bmRldmljZXMsICZlbnRyeSk7CiAJCWlmIChkZXZpY2VfY2hhbmdlID09IERFVklDRV9OT1RfRk9VTkQpIHsKQEAgLTEwMjIsNiArMTM0NCwxNyBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5kZXZsb2NrLCBmbGFncyk7CiAKKwkvKiBNb25pdG9yIGRldmljZXMgd2hpY2ggYXJlIGluIG9uZSBvZiBzZXZlcmFsIE5PVCBSRUFEWSBzdGF0ZXMgdG8gYmUKKwkgKiBicm91Z2h0IG9ubGluZSBsYXRlci4gVGhpcyBtdXN0IGJlIGRvbmUgd2l0aG91dCBob2xkaW5nIGgtPmRldmxvY2ssCisJICogc28gZG9uJ3QgdG91Y2ggaC0+ZGV2W10KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnNkczsgaSsrKSB7CisJCWlmICghc2RbaV0pIC8qIGlmIGFscmVhZHkgYWRkZWQgYWJvdmUuICovCisJCQljb250aW51ZTsKKwkJaWYgKHNkW2ldLT52b2x1bWVfb2ZmbGluZSkKKwkJCWhwc2FfbW9uaXRvcl9vZmZsaW5lX2RldmljZShoLCBzZFtpXS0+c2NzaTNhZGRyKTsKKwl9CisKIAkvKiBEb24ndCBub3RpZnkgc2NzaSBtaWQgbGF5ZXIgb2YgYW55IGNoYW5nZXMgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaAogCSAqIChvciBpZiB0aGVyZSBhcmUgbm8gY2hhbmdlcykgc2NzaV9zY2FuX2hvc3Qgd2lsbCBkbyBpdCBsYXRlciB0aGUKIAkgKiBmaXJzdCB0aW1lIHRocm91Z2guCkBAIC0xMTg3LDExICsxNTIwLDE2MyBAQAogCXBjaV91bm1hcF9zaW5nbGUoaC0+cGRldiwgdGVtcDY0LnZhbCwgY2hhaW5fc2ctPkxlbiwgUENJX0RNQV9UT0RFVklDRSk7CiB9CiAKKworLyogRGVjb2RlIHRoZSB2YXJpb3VzIHR5cGVzIG9mIGVycm9ycyBvbiBpb2FjY2VsMiBwYXRoLgorICogUmV0dXJuIDEgZm9yIGFueSBlcnJvciB0aGF0IHNob3VsZCBnZW5lcmF0ZSBhIFJBSUQgcGF0aCByZXRyeS4KKyAqIFJldHVybiAwIGZvciBlcnJvcnMgdGhhdCBkb24ndCByZXF1aXJlIGEgUkFJRCBwYXRoIHJldHJ5LgorICovCitzdGF0aWMgaW50IGhhbmRsZV9pb2FjY2VsX21vZGUyX2Vycm9yKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJCQkJCXN0cnVjdCBDb21tYW5kTGlzdCAqYywKKwkJCQkJc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJCQlzdHJ1Y3QgaW9fYWNjZWwyX2NtZCAqYzIpCit7CisJaW50IGRhdGFfbGVuOworCWludCByZXRyeSA9IDA7CisKKwlzd2l0Y2ggKGMyLT5lcnJvcl9kYXRhLnNlcnZfcmVzcG9uc2UpIHsKKwljYXNlIElPQUNDRUwyX1NFUlZfUkVTUE9OU0VfQ09NUExFVEU6CisJCXN3aXRjaCAoYzItPmVycm9yX2RhdGEuc3RhdHVzKSB7CisJCWNhc2UgSU9BQ0NFTDJfU1RBVFVTX1NSX1RBU0tfQ09NUF9HT09EOgorCQkJYnJlYWs7CisJCWNhc2UgSU9BQ0NFTDJfU1RBVFVTX1NSX1RBU0tfQ09NUF9DSEtfQ09ORDoKKwkJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsCisJCQkJIiVzOiB0YXNrIGNvbXBsZXRlIHdpdGggY2hlY2sgY29uZGl0aW9uLlxuIiwKKwkJCQkiSFAgU1NEIFNtYXJ0IFBhdGgiKTsKKwkJCWlmIChjMi0+ZXJyb3JfZGF0YS5kYXRhX3ByZXNlbnQgIT0KKwkJCQkJSU9BQ0NFTDJfU0VOU0VfREFUQV9QUkVTRU5UKQorCQkJCWJyZWFrOworCQkJLyogY29weSB0aGUgc2Vuc2UgZGF0YSAqLworCQkJZGF0YV9sZW4gPSBjMi0+ZXJyb3JfZGF0YS5zZW5zZV9kYXRhX2xlbjsKKwkJCWlmIChkYXRhX2xlbiA+IFNDU0lfU0VOU0VfQlVGRkVSU0laRSkKKwkJCQlkYXRhX2xlbiA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKKwkJCWlmIChkYXRhX2xlbiA+IHNpemVvZihjMi0+ZXJyb3JfZGF0YS5zZW5zZV9kYXRhX2J1ZmYpKQorCQkJCWRhdGFfbGVuID0KKwkJCQkJc2l6ZW9mKGMyLT5lcnJvcl9kYXRhLnNlbnNlX2RhdGFfYnVmZik7CisJCQltZW1jcHkoY21kLT5zZW5zZV9idWZmZXIsCisJCQkJYzItPmVycm9yX2RhdGEuc2Vuc2VfZGF0YV9idWZmLCBkYXRhX2xlbik7CisJCQljbWQtPnJlc3VsdCB8PSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CisJCQlyZXRyeSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBJT0FDQ0VMMl9TVEFUVVNfU1JfVEFTS19DT01QX0JVU1k6CisJCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LAorCQkJCSIlczogdGFzayBjb21wbGV0ZSB3aXRoIEJVU1kgc3RhdHVzLlxuIiwKKwkJCQkiSFAgU1NEIFNtYXJ0IFBhdGgiKTsKKwkJCXJldHJ5ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIElPQUNDRUwyX1NUQVRVU19TUl9UQVNLX0NPTVBfUkVTX0NPTjoKKwkJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsCisJCQkJIiVzOiB0YXNrIGNvbXBsZXRlIHdpdGggcmVzZXJ2YXRpb24gY29uZmxpY3QuXG4iLAorCQkJCSJIUCBTU0QgU21hcnQgUGF0aCIpOworCQkJcmV0cnkgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgSU9BQ0NFTDJfU1RBVFVTX1NSX1RBU0tfQ09NUF9TRVRfRlVMTDoKKwkJCS8qIE1ha2Ugc2NzaSBtaWRsYXllciBkbyB1bmxpbWl0ZWQgcmV0cmllcyAqLworCQkJY21kLT5yZXN1bHQgPSBESURfSU1NX1JFVFJZIDw8IDE2OworCQkJYnJlYWs7CisJCWNhc2UgSU9BQ0NFTDJfU1RBVFVTX1NSX1RBU0tfQ09NUF9BQk9SVEVEOgorCQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCQkiJXM6IHRhc2sgY29tcGxldGUgd2l0aCBhYm9ydGVkIHN0YXR1cy5cbiIsCisJCQkJIkhQIFNTRCBTbWFydCBQYXRoIik7CisJCQlyZXRyeSA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsCisJCQkJIiVzOiB0YXNrIGNvbXBsZXRlIHdpdGggdW5yZWNvZ25pemVkIHN0YXR1czogMHglMDJ4XG4iLAorCQkJCSJIUCBTU0QgU21hcnQgUGF0aCIsIGMyLT5lcnJvcl9kYXRhLnN0YXR1cyk7CisJCQlyZXRyeSA9IDE7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIElPQUNDRUwyX1NFUlZfUkVTUE9OU0VfRkFJTFVSRToKKwkJLyogZG9uJ3QgZXhwZWN0IHRvIGdldCBoZXJlLiAqLworCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LAorCQkJInVuZXhwZWN0ZWQgZGVsaXZlcnkgb3IgdGFyZ2V0IGZhaWx1cmUsIHN0YXR1cyA9IDB4JTAyeFxuIiwKKwkJCWMyLT5lcnJvcl9kYXRhLnN0YXR1cyk7CisJCXJldHJ5ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBJT0FDQ0VMMl9TRVJWX1JFU1BPTlNFX1RNRl9DT01QTEVURToKKwkJYnJlYWs7CisJY2FzZSBJT0FDQ0VMMl9TRVJWX1JFU1BPTlNFX1RNRl9TVUNDRVNTOgorCQlicmVhazsKKwljYXNlIElPQUNDRUwyX1NFUlZfUkVTUE9OU0VfVE1GX1JFSkVDVEVEOgorCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAidGFzayBtYW5hZ2VtZW50IGZ1bmN0aW9uIHJlamVjdGVkLlxuIik7CisJCXJldHJ5ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBJT0FDQ0VMMl9TRVJWX1JFU1BPTlNFX1RNRl9XUk9OR19MVU46CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJ0YXNrIG1hbmFnZW1lbnQgZnVuY3Rpb24gaW52YWxpZCBMVU5cbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LAorCQkJIiVzOiBVbnJlY29nbml6ZWQgc2VydmVyIHJlc3BvbnNlOiAweCUwMnhcbiIsCisJCQkiSFAgU1NEIFNtYXJ0IFBhdGgiLAorCQkJYzItPmVycm9yX2RhdGEuc2Vydl9yZXNwb25zZSk7CisJCXJldHJ5ID0gMTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldHJ5OwkvKiByZXRyeSBvbiByYWlkIHBhdGg/ICovCit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfaW9hY2NlbDJfY29tcGxldGlvbihzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCQlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqZGV2KQoreworCXN0cnVjdCBpb19hY2NlbDJfY21kICpjMiA9ICZoLT5pb2FjY2VsMl9jbWRfcG9vbFtjLT5jbWRpbmRleF07CisJaW50IHJhaWRfcmV0cnkgPSAwOworCisJLyogY2hlY2sgZm9yIGdvb2Qgc3RhdHVzICovCisJaWYgKGxpa2VseShjMi0+ZXJyb3JfZGF0YS5zZXJ2X3Jlc3BvbnNlID09IDAgJiYKKwkJCWMyLT5lcnJvcl9kYXRhLnN0YXR1cyA9PSAwKSkgeworCQljbWRfZnJlZShoLCBjKTsKKwkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFueSBSQUlEIG9mZmxvYWQgZXJyb3IgcmVzdWx0cyBpbiByZXRyeSB3aGljaCB3aWxsIHVzZQorCSAqIHRoZSBub3JtYWwgSS9PIHBhdGggc28gdGhlIGNvbnRyb2xsZXIgY2FuIGhhbmRsZSB3aGF0ZXZlcidzCisJICogd3JvbmcuCisJICovCisJaWYgKGlzX2xvZ2ljYWxfZGV2X2FkZHJfbW9kZShkZXYtPnNjc2kzYWRkcikgJiYKKwkJYzItPmVycm9yX2RhdGEuc2Vydl9yZXNwb25zZSA9PQorCQkJSU9BQ0NFTDJfU0VSVl9SRVNQT05TRV9GQUlMVVJFKSB7CisJCWlmIChjMi0+ZXJyb3JfZGF0YS5zdGF0dXMgPT0KKwkJCUlPQUNDRUwyX1NUQVRVU19TUl9JT0FDQ0VMX0RJU0FCTEVEKQorCQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCQkiJXM6IFBhdGggaXMgdW5hdmFpbGFibGUsIHJldHJ5aW5nIG9uIHN0YW5kYXJkIHBhdGguXG4iLAorCQkJCSJIUCBTU0QgU21hcnQgUGF0aCIpOworCQllbHNlCisJCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LAorCQkJCSIlczogRXJyb3IgMHglMDJ4LCByZXRyeWluZyBvbiBzdGFuZGFyZCBwYXRoLlxuIiwKKwkJCQkiSFAgU1NEIFNtYXJ0IFBhdGgiLCBjMi0+ZXJyb3JfZGF0YS5zdGF0dXMpOworCisJCWRldi0+b2ZmbG9hZF9lbmFibGVkID0gMDsKKwkJaC0+ZHJ2X3JlcV9yZXNjYW4gPSAxOwkvKiBzY2hlZHVsZSBjb250cm9sbGVyIGZvciBhIHJlc2NhbiAqLworCQljbWQtPnJlc3VsdCA9IERJRF9TT0ZUX0VSUk9SIDw8IDE2OworCQljbWRfZnJlZShoLCBjKTsKKwkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJcmV0dXJuOworCX0KKwlyYWlkX3JldHJ5ID0gaGFuZGxlX2lvYWNjZWxfbW9kZTJfZXJyb3IoaCwgYywgY21kLCBjMik7CisJLyogSWYgZXJyb3IgZm91bmQsIGRpc2FibGUgU21hcnQgUGF0aCwgc2NoZWR1bGUgYSByZXNjYW4sCisJICogYW5kIGZvcmNlIGEgcmV0cnkgb24gdGhlIHN0YW5kYXJkIHBhdGguCisJICovCisJaWYgKHJhaWRfcmV0cnkpIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIiVzOiBSZXRyeWluZyBvbiBzdGFuZGFyZCBwYXRoLlxuIiwKKwkJCSJIUCBTU0QgU21hcnQgUGF0aCIpOworCQlkZXYtPm9mZmxvYWRfZW5hYmxlZCA9IDA7IC8qIERpc2FibGUgU21hcnQgUGF0aCAqLworCQloLT5kcnZfcmVxX3Jlc2NhbiA9IDE7CSAgLyogc2NoZWR1bGUgY29udHJvbGxlciByZXNjYW4gKi8KKwkJY21kLT5yZXN1bHQgPSBESURfU09GVF9FUlJPUiA8PCAxNjsKKwl9CisJY21kX2ZyZWUoaCwgYyk7CisJY21kLT5zY3NpX2RvbmUoY21kKTsKK30KKwogc3RhdGljIHZvaWQgY29tcGxldGVfc2NzaV9jb21tYW5kKHN0cnVjdCBDb21tYW5kTGlzdCAqY3ApCiB7CiAJc3RydWN0IHNjc2lfY21uZCAqY21kOwogCXN0cnVjdCBjdGxyX2luZm8gKmg7CiAJc3RydWN0IEVycm9ySW5mbyAqZWk7CisJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqZGV2OwogCiAJdW5zaWduZWQgY2hhciBzZW5zZV9rZXk7CiAJdW5zaWduZWQgY2hhciBhc2M7ICAgICAgLyogYWRkaXRpb25hbCBzZW5zZSBjb2RlICovCkBAIC0xMjAxLDEzICsxNjg2LDE5IEBACiAJZWkgPSBjcC0+ZXJyX2luZm87CiAJY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgY3AtPnNjc2lfY21kOwogCWggPSBjcC0+aDsKKwlkZXYgPSBjbWQtPmRldmljZS0+aG9zdGRhdGE7CiAKIAlzY3NpX2RtYV91bm1hcChjbWQpOyAvKiB1bmRvIHRoZSBETUEgbWFwcGluZ3MgKi8KLQlpZiAoY3AtPkhlYWRlci5TR1RvdGFsID4gaC0+bWF4X2NtZF9zZ19lbnRyaWVzKQorCWlmICgoY3AtPmNtZF90eXBlID09IENNRF9TQ1NJKSAmJgorCQkoY3AtPkhlYWRlci5TR1RvdGFsID4gaC0+bWF4X2NtZF9zZ19lbnRyaWVzKSkKIAkJaHBzYV91bm1hcF9zZ19jaGFpbl9ibG9jayhoLCBjcCk7CiAKIAljbWQtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpOyAJCS8qIGhvc3QgYnl0ZSAqLwogCWNtZC0+cmVzdWx0IHw9IChDT01NQU5EX0NPTVBMRVRFIDw8IDgpOwkvKiBtc2cgYnl0ZSAqLworCisJaWYgKGNwLT5jbWRfdHlwZSA9PSBDTURfSU9BQ0NFTDIpCisJCXJldHVybiBwcm9jZXNzX2lvYWNjZWwyX2NvbXBsZXRpb24oaCwgY3AsIGNtZCwgZGV2KTsKKwogCWNtZC0+cmVzdWx0IHw9IGVpLT5TY3NpU3RhdHVzOwogCiAJLyogY29weSB0aGUgc2Vuc2UgZGF0YSB3aGV0aGVyIHdlIG5lZWQgdG8gb3Igbm90LiAqLwpAQCAtMTIyNyw2ICsxNzE4LDMyIEBACiAJCXJldHVybjsKIAl9CiAKKwkvKiBGb3IgSS9PIGFjY2VsZXJhdG9yIGNvbW1hbmRzLCBjb3B5IG92ZXIgc29tZSBmaWVsZHMgdG8gdGhlIG5vcm1hbAorCSAqIENJU1MgaGVhZGVyIHVzZWQgYmVsb3cgZm9yIGVycm9yIGhhbmRsaW5nLgorCSAqLworCWlmIChjcC0+Y21kX3R5cGUgPT0gQ01EX0lPQUNDRUwxKSB7CisJCXN0cnVjdCBpb19hY2NlbDFfY21kICpjID0gJmgtPmlvYWNjZWxfY21kX3Bvb2xbY3AtPmNtZGluZGV4XTsKKwkJY3AtPkhlYWRlci5TR0xpc3QgPSBjcC0+SGVhZGVyLlNHVG90YWwgPSBzY3NpX3NnX2NvdW50KGNtZCk7CisJCWNwLT5SZXF1ZXN0LkNEQkxlbiA9IGMtPmlvX2ZsYWdzICYgSU9BQ0NFTDFfSU9GTEFHU19DREJMRU5fTUFTSzsKKwkJY3AtPkhlYWRlci5UYWcubG93ZXIgPSBjLT5UYWcubG93ZXI7CisJCWNwLT5IZWFkZXIuVGFnLnVwcGVyID0gYy0+VGFnLnVwcGVyOworCQltZW1jcHkoY3AtPkhlYWRlci5MVU4uTHVuQWRkckJ5dGVzLCBjLT5DSVNTX0xVTiwgOCk7CisJCW1lbWNweShjcC0+UmVxdWVzdC5DREIsIGMtPkNEQiwgY3AtPlJlcXVlc3QuQ0RCTGVuKTsKKworCQkvKiBBbnkgUkFJRCBvZmZsb2FkIGVycm9yIHJlc3VsdHMgaW4gcmV0cnkgd2hpY2ggd2lsbCB1c2UKKwkJICogdGhlIG5vcm1hbCBJL08gcGF0aCBzbyB0aGUgY29udHJvbGxlciBjYW4gaGFuZGxlIHdoYXRldmVyJ3MKKwkJICogd3JvbmcuCisJCSAqLworCQlpZiAoaXNfbG9naWNhbF9kZXZfYWRkcl9tb2RlKGRldi0+c2NzaTNhZGRyKSkgeworCQkJaWYgKGVpLT5Db21tYW5kU3RhdHVzID09IENNRF9JT0FDQ0VMX0RJU0FCTEVEKQorCQkJCWRldi0+b2ZmbG9hZF9lbmFibGVkID0gMDsKKwkJCWNtZC0+cmVzdWx0ID0gRElEX1NPRlRfRVJST1IgPDwgMTY7CisJCQljbWRfZnJlZShoLCBjcCk7CisJCQljbWQtPnNjc2lfZG9uZShjbWQpOworCQkJcmV0dXJuOworCQl9CisJfQorCiAJLyogYW4gZXJyb3IgaGFzIG9jY3VycmVkICovCiAJc3dpdGNoIChlaS0+Q29tbWFuZFN0YXR1cykgewogCkBAIC0xMzg5LDYgKzE5MDYsMTQgQEAKIAkJY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CiAJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJDb21tYW5kIHVuYWJvcnRhYmxlXG4iKTsKIAkJYnJlYWs7CisJY2FzZSBDTURfSU9BQ0NFTF9ESVNBQkxFRDoKKwkJLyogVGhpcyBvbmx5IGhhbmRsZXMgdGhlIGRpcmVjdCBwYXNzLXRocm91Z2ggY2FzZSBzaW5jZSBSQUlECisJCSAqIG9mZmxvYWQgaXMgaGFuZGxlZCBhYm92ZS4gIEp1c3QgYXR0ZW1wdCBhIHJldHJ5LgorCQkgKi8KKwkJY21kLT5yZXN1bHQgPSBESURfU09GVF9FUlJPUiA8PCAxNjsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCQkiY3AgJXAgaGFkIEhQIFNTRCBTbWFydCBQYXRoIGVycm9yXG4iLCBjcCk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OwogCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiY3AgJXAgcmV0dXJuZWQgdW5rbm93biBzdGF0dXMgJXhcbiIsCkBAIC0xNDM4LDYgKzE5NjMsNyBAQAogCWNwLT5TR1swXS5BZGRyLnVwcGVyID0KIAkgICh1MzIpICgoYWRkcjY0ID4+IDMyKSAmICh1NjQpIDB4MDAwMDAwMDBGRkZGRkZGRik7CiAJY3AtPlNHWzBdLkxlbiA9IGJ1ZmxlbjsKKwljcC0+U0dbMF0uRXh0ID0gSFBTQV9TR19MQVNUOyAvKiB3ZSBhcmUgbm90IGNoYWluaW5nICovCiAJY3AtPkhlYWRlci5TR0xpc3QgPSAodTgpIDE7ICAgLyogbm8uIFNHcyBjb250aWcgaW4gdGhpcyBjbWQgKi8KIAljcC0+SGVhZGVyLlNHVG90YWwgPSAodTE2KSAxOyAvKiB0b3RhbCBzZ3MgaW4gdGhpcyBjbWQgbGlzdCAqLwogCXJldHVybiAwOwpAQCAtMTQ5MCwxNyArMjAxNiwzNyBAQAogCWhwc2FfcGNpX3VubWFwKGgtPnBkZXYsIGMsIDEsIGRhdGFfZGlyZWN0aW9uKTsKIH0KIAotc3RhdGljIHZvaWQgaHBzYV9zY3NpX2ludGVycHJldF9lcnJvcihzdHJ1Y3QgQ29tbWFuZExpc3QgKmNwKQorc3RhdGljIHZvaWQgaHBzYV9wcmludF9jbWQoc3RydWN0IGN0bHJfaW5mbyAqaCwgY2hhciAqdHh0LAorCQkJCXN0cnVjdCBDb21tYW5kTGlzdCAqYykKIHsKLQlzdHJ1Y3QgRXJyb3JJbmZvICplaTsKLQlzdHJ1Y3QgZGV2aWNlICpkID0gJmNwLT5oLT5wZGV2LT5kZXY7CisJY29uc3QgdTggKmNkYiA9IGMtPlJlcXVlc3QuQ0RCOworCWNvbnN0IHU4ICpsdW4gPSBjLT5IZWFkZXIuTFVOLkx1bkFkZHJCeXRlczsKIAotCWVpID0gY3AtPmVycl9pbmZvOworCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICIlczogTFVOOiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IgorCSIgQ0RCOiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCXR4dCwgbHVuWzBdLCBsdW5bMV0sIGx1blsyXSwgbHVuWzNdLAorCQlsdW5bNF0sIGx1bls1XSwgbHVuWzZdLCBsdW5bN10sCisJCWNkYlswXSwgY2RiWzFdLCBjZGJbMl0sIGNkYlszXSwKKwkJY2RiWzRdLCBjZGJbNV0sIGNkYls2XSwgY2RiWzddLAorCQljZGJbOF0sIGNkYls5XSwgY2RiWzEwXSwgY2RiWzExXSwKKwkJY2RiWzEyXSwgY2RiWzEzXSwgY2RiWzE0XSwgY2RiWzE1XSk7Cit9CisKK3N0YXRpYyB2b2lkIGhwc2Ffc2NzaV9pbnRlcnByZXRfZXJyb3Ioc3RydWN0IGN0bHJfaW5mbyAqaCwKKwkJCXN0cnVjdCBDb21tYW5kTGlzdCAqY3ApCit7CisJY29uc3Qgc3RydWN0IEVycm9ySW5mbyAqZWkgPSBjcC0+ZXJyX2luZm87CisJc3RydWN0IGRldmljZSAqZCA9ICZjcC0+aC0+cGRldi0+ZGV2OworCWNvbnN0IHU4ICpzZCA9IGVpLT5TZW5zZUluZm87CisKIAlzd2l0Y2ggKGVpLT5Db21tYW5kU3RhdHVzKSB7CiAJY2FzZSBDTURfVEFSR0VUX1NUQVRVUzoKLQkJZGV2X3dhcm4oZCwgImNtZCAlcCBoYXMgY29tcGxldGVkIHdpdGggZXJyb3JzXG4iLCBjcCk7Ci0JCWRldl93YXJuKGQsICJjbWQgJXAgaGFzIFNDU0kgU3RhdHVzID0gJXhcbiIsIGNwLAotCQkJCWVpLT5TY3NpU3RhdHVzKTsKKwkJaHBzYV9wcmludF9jbWQoaCwgIlNDU0kgc3RhdHVzIiwgY3ApOworCQlpZiAoZWktPlNjc2lTdGF0dXMgPT0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OKQorCQkJZGV2X3dhcm4oZCwgIlNDU0kgU3RhdHVzID0gMDIsIFNlbnNlIGtleSA9ICUwMngsIEFTQyA9ICUwMngsIEFTQ1EgPSAlMDJ4XG4iLAorCQkJCXNkWzJdICYgMHgwZiwgc2RbMTJdLCBzZFsxM10pOworCQllbHNlCisJCQlkZXZfd2FybihkLCAiU0NTSSBTdGF0dXMgPSAlMDJ4XG4iLCBlaS0+U2NzaVN0YXR1cyk7CiAJCWlmIChlaS0+U2NzaVN0YXR1cyA9PSAwKQogCQkJZGV2X3dhcm4oZCwgIlNDU0kgc3RhdHVzIGlzIGFibm9ybWFsbHkgemVyby4gICIKIAkJCSIocHJvYmFibHkgaW5kaWNhdGVzIHNlbGVjdGlvbiB0aW1lb3V0ICIKQEAgLTE1MDgsNTQgKzIwNTQsNTEgQEAKIAkJCSJmaXJtd2FyZSBidWcsIGNpcmNhIEp1bHksIDIwMDEuKVxuIik7CiAJCWJyZWFrOwogCWNhc2UgQ01EX0RBVEFfVU5ERVJSVU46IC8qIGxldCBtaWQgbGF5ZXIgaGFuZGxlIGl0LiAqLwotCQkJZGV2X2luZm8oZCwgIlVOREVSUlVOXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBDTURfREFUQV9PVkVSUlVOOgotCQlkZXZfd2FybihkLCAiY3AgJXAgaGFzIGNvbXBsZXRlZCB3aXRoIGRhdGEgb3ZlcnJ1blxuIiwgY3ApOworCQlocHNhX3ByaW50X2NtZChoLCAib3ZlcnJ1biBjb25kaXRpb24iLCBjcCk7CiAJCWJyZWFrOwogCWNhc2UgQ01EX0lOVkFMSUQ6IHsKIAkJLyogY29udHJvbGxlciB1bmZvcnR1bmF0ZWx5IHJlcG9ydHMgU0NTSSBwYXNzdGhydSdzCiAJCSAqIHRvIG5vbi1leGlzdGVudCB0YXJnZXRzIGFzIGludmFsaWQgY29tbWFuZHMuCiAJCSAqLwotCQlkZXZfd2FybihkLCAiY3AgJXAgaXMgcmVwb3J0ZWQgaW52YWxpZCAocHJvYmFibHkgbWVhbnMgIgotCQkJInRhcmdldCBkZXZpY2Ugbm8gbG9uZ2VyIHByZXNlbnQpXG4iLCBjcCk7Ci0JCS8qIHByaW50X2J5dGVzKCh1bnNpZ25lZCBjaGFyICopIGNwLCBzaXplb2YoKmNwKSwgMSwgMCk7Ci0JCXByaW50X2NtZChjcCk7ICAqLworCQlocHNhX3ByaW50X2NtZChoLCAiaW52YWxpZCBjb21tYW5kIiwgY3ApOworCQlkZXZfd2FybihkLCAicHJvYmFibHkgbWVhbnMgZGV2aWNlIG5vIGxvbmdlciBwcmVzZW50XG4iKTsKIAkJfQogCQlicmVhazsKIAljYXNlIENNRF9QUk9UT0NPTF9FUlI6Ci0JCWRldl93YXJuKGQsICJjcCAlcCBoYXMgcHJvdG9jb2wgZXJyb3IgXG4iLCBjcCk7CisJCWhwc2FfcHJpbnRfY21kKGgsICJwcm90b2NvbCBlcnJvciIsIGNwKTsKIAkJYnJlYWs7CiAJY2FzZSBDTURfSEFSRFdBUkVfRVJSOgotCQkvKiBjbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsgKi8KLQkJZGV2X3dhcm4oZCwgImNwICVwIGhhZCBoYXJkd2FyZSBlcnJvclxuIiwgY3ApOworCQlocHNhX3ByaW50X2NtZChoLCAiaGFyZHdhcmUgZXJyb3IiLCBjcCk7CiAJCWJyZWFrOwogCWNhc2UgQ01EX0NPTk5FQ1RJT05fTE9TVDoKLQkJZGV2X3dhcm4oZCwgImNwICVwIGhhZCBjb25uZWN0aW9uIGxvc3RcbiIsIGNwKTsKKwkJaHBzYV9wcmludF9jbWQoaCwgImNvbm5lY3Rpb24gbG9zdCIsIGNwKTsKIAkJYnJlYWs7CiAJY2FzZSBDTURfQUJPUlRFRDoKLQkJZGV2X3dhcm4oZCwgImNwICVwIHdhcyBhYm9ydGVkXG4iLCBjcCk7CisJCWhwc2FfcHJpbnRfY21kKGgsICJhYm9ydGVkIiwgY3ApOwogCQlicmVhazsKIAljYXNlIENNRF9BQk9SVF9GQUlMRUQ6Ci0JCWRldl93YXJuKGQsICJjcCAlcCByZXBvcnRzIGFib3J0IGZhaWxlZFxuIiwgY3ApOworCQlocHNhX3ByaW50X2NtZChoLCAiYWJvcnQgZmFpbGVkIiwgY3ApOwogCQlicmVhazsKIAljYXNlIENNRF9VTlNPTElDSVRFRF9BQk9SVDoKLQkJZGV2X3dhcm4oZCwgImNwICVwIGFib3J0ZWQgZHVlIHRvIGFuIHVuc29saWNpdGVkIGFib3J0XG4iLCBjcCk7CisJCWhwc2FfcHJpbnRfY21kKGgsICJ1bnNvbGljaXRlZCBhYm9ydCIsIGNwKTsKIAkJYnJlYWs7CiAJY2FzZSBDTURfVElNRU9VVDoKLQkJZGV2X3dhcm4oZCwgImNwICVwIHRpbWVkIG91dFxuIiwgY3ApOworCQlocHNhX3ByaW50X2NtZChoLCAidGltZWQgb3V0IiwgY3ApOwogCQlicmVhazsKIAljYXNlIENNRF9VTkFCT1JUQUJMRToKLQkJZGV2X3dhcm4oZCwgIkNvbW1hbmQgdW5hYm9ydGFibGVcbiIpOworCQlocHNhX3ByaW50X2NtZChoLCAidW5hYm9ydGFibGUiLCBjcCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl93YXJuKGQsICJjcCAlcCByZXR1cm5lZCB1bmtub3duIHN0YXR1cyAleFxuIiwgY3AsCisJCWhwc2FfcHJpbnRfY21kKGgsICJ1bmtub3duIHN0YXR1cyIsIGNwKTsKKwkJZGV2X3dhcm4oZCwgIlVua25vd24gY29tbWFuZCBzdGF0dXMgJXhcbiIsCiAJCQkJZWktPkNvbW1hbmRTdGF0dXMpOwogCX0KIH0KIAogc3RhdGljIGludCBocHNhX3Njc2lfZG9faW5xdWlyeShzdHJ1Y3QgY3Rscl9pbmZvICpoLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsCi0JCQl1bnNpZ25lZCBjaGFyIHBhZ2UsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCXUxNiBwYWdlLCB1bnNpZ25lZCBjaGFyICpidWYsCiAJCQl1bnNpZ25lZCBjaGFyIGJ1ZnNpemUpCiB7CiAJaW50IHJjID0gSU9fT0s7CkBAIC0xNTc3LDcgKzIxMjAsNyBAQAogCWhwc2Ffc2NzaV9kb19zaW1wbGVfY21kX3dpdGhfcmV0cnkoaCwgYywgUENJX0RNQV9GUk9NREVWSUNFKTsKIAllaSA9IGMtPmVycl9pbmZvOwogCWlmIChlaS0+Q29tbWFuZFN0YXR1cyAhPSAwICYmIGVpLT5Db21tYW5kU3RhdHVzICE9IENNRF9EQVRBX1VOREVSUlVOKSB7Ci0JCWhwc2Ffc2NzaV9pbnRlcnByZXRfZXJyb3IoYyk7CisJCWhwc2Ffc2NzaV9pbnRlcnByZXRfZXJyb3IoaCwgYyk7CiAJCXJjID0gLTE7CiAJfQogb3V0OgpAQCAtMTU4NSw3ICsyMTI4LDM5IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGhwc2Ffc2VuZF9yZXNldChzdHJ1Y3QgY3Rscl9pbmZvICpoLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIpCitzdGF0aWMgaW50IGhwc2FfYm1pY19jdHJsX21vZGVfc2Vuc2Uoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwkJdW5zaWduZWQgY2hhciAqc2NzaTNhZGRyLCB1bnNpZ25lZCBjaGFyIHBhZ2UsCisJCXN0cnVjdCBibWljX2NvbnRyb2xsZXJfcGFyYW1ldGVycyAqYnVmLCBzaXplX3QgYnVmc2l6ZSkKK3sKKwlpbnQgcmMgPSBJT19PSzsKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmM7CisJc3RydWN0IEVycm9ySW5mbyAqZWk7CisKKwljID0gY21kX3NwZWNpYWxfYWxsb2MoaCk7CisKKwlpZiAoYyA9PSBOVUxMKSB7CQkJLyogdHJvdWJsZS4uLiAqLworCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiY21kX3NwZWNpYWxfYWxsb2MgcmV0dXJuZWQgTlVMTCFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoZmlsbF9jbWQoYywgQk1JQ19TRU5TRV9DT05UUk9MTEVSX1BBUkFNRVRFUlMsIGgsIGJ1ZiwgYnVmc2l6ZSwKKwkJCXBhZ2UsIHNjc2kzYWRkciwgVFlQRV9DTUQpKSB7CisJCXJjID0gLTE7CisJCWdvdG8gb3V0OworCX0KKwlocHNhX3Njc2lfZG9fc2ltcGxlX2NtZF93aXRoX3JldHJ5KGgsIGMsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJZWkgPSBjLT5lcnJfaW5mbzsKKwlpZiAoZWktPkNvbW1hbmRTdGF0dXMgIT0gMCAmJiBlaS0+Q29tbWFuZFN0YXR1cyAhPSBDTURfREFUQV9VTkRFUlJVTikgeworCQlocHNhX3Njc2lfaW50ZXJwcmV0X2Vycm9yKGgsIGMpOworCQlyYyA9IC0xOworCX0KK291dDoKKwljbWRfc3BlY2lhbF9mcmVlKGgsIGMpOworCXJldHVybiByYzsKKwl9CisKK3N0YXRpYyBpbnQgaHBzYV9zZW5kX3Jlc2V0KHN0cnVjdCBjdGxyX2luZm8gKmgsIHVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwKKwl1OCByZXNldF90eXBlKQogewogCWludCByYyA9IElPX09LOwogCXN0cnVjdCBDb21tYW5kTGlzdCAqYzsKQEAgLTE1OTksMTQgKzIxNzQsMTUgQEAKIAl9CiAKIAkvKiBmaWxsX2NtZCBjYW4ndCBmYWlsIGhlcmUsIG5vIGRhdGEgYnVmZmVyIHRvIG1hcC4gKi8KLQkodm9pZCkgZmlsbF9jbWQoYywgSFBTQV9ERVZJQ0VfUkVTRVRfTVNHLCBoLAotCQkJTlVMTCwgMCwgMCwgc2NzaTNhZGRyLCBUWVBFX01TRyk7CisJKHZvaWQpIGZpbGxfY21kKGMsIEhQU0FfREVWSUNFX1JFU0VUX01TRywgaCwgTlVMTCwgMCwgMCwKKwkJCXNjc2kzYWRkciwgVFlQRV9NU0cpOworCWMtPlJlcXVlc3QuQ0RCWzFdID0gcmVzZXRfdHlwZTsgLyogZmlsbF9jbWQgZGVmYXVsdHMgdG8gTFVOIHJlc2V0ICovCiAJaHBzYV9zY3NpX2RvX3NpbXBsZV9jbWRfY29yZShoLCBjKTsKIAkvKiBubyB1bm1hcCBuZWVkZWQgaGVyZSBiZWNhdXNlIG5vIGRhdGEgeGZlci4gKi8KIAogCWVpID0gYy0+ZXJyX2luZm87CiAJaWYgKGVpLT5Db21tYW5kU3RhdHVzICE9IDApIHsKLQkJaHBzYV9zY3NpX2ludGVycHJldF9lcnJvcihjKTsKKwkJaHBzYV9zY3NpX2ludGVycHJldF9lcnJvcihoLCBjKTsKIAkJcmMgPSAtMTsKIAl9CiAJY21kX3NwZWNpYWxfZnJlZShoLCBjKTsKQEAgLTE2MjMsNyArMjE5OSw3IEBACiAJYnVmID0ga3phbGxvYyg2NCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpCiAJCXJldHVybjsKLQlyYyA9IGhwc2Ffc2NzaV9kb19pbnF1aXJ5KGgsIHNjc2kzYWRkciwgMHhDMSwgYnVmLCA2NCk7CisJcmMgPSBocHNhX3Njc2lfZG9faW5xdWlyeShoLCBzY3NpM2FkZHIsIFZQRF9QQUdFIHwgMHhDMSwgYnVmLCA2NCk7CiAJaWYgKHJjID09IDApCiAJCSpyYWlkX2xldmVsID0gYnVmWzhdOwogCWlmICgqcmFpZF9sZXZlbCA+IFJBSURfVU5LTk9XTikKQEAgLTE2MzIsNiArMjIwOCwyMDQgQEAKIAlyZXR1cm47CiB9CiAKKyNkZWZpbmUgSFBTQV9NQVBfREVCVUcKKyNpZmRlZiBIUFNBX01BUF9ERUJVRworc3RhdGljIHZvaWQgaHBzYV9kZWJ1Z19tYXBfYnVmZihzdHJ1Y3QgY3Rscl9pbmZvICpoLCBpbnQgcmMsCisJCQkJc3RydWN0IHJhaWRfbWFwX2RhdGEgKm1hcF9idWZmKQoreworCXN0cnVjdCByYWlkX21hcF9kaXNrX2RhdGEgKmRkID0gJm1hcF9idWZmLT5kYXRhWzBdOworCWludCBtYXAsIHJvdywgY29sOworCXUxNiBtYXBfY250LCByb3dfY250LCBkaXNrc19wZXJfcm93OworCisJaWYgKHJjICE9IDApCisJCXJldHVybjsKKworCS8qIFNob3cgZGV0YWlscyBvbmx5IGlmIGRlYnVnZ2luZyBoYXMgYmVlbiBhY3RpdmF0ZWQuICovCisJaWYgKGgtPnJhaWRfb2ZmbG9hZF9kZWJ1ZyA8IDIpCisJCXJldHVybjsKKworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJzdHJ1Y3R1cmVfc2l6ZSA9ICV1XG4iLAorCQkJCWxlMzJfdG9fY3B1KG1hcF9idWZmLT5zdHJ1Y3R1cmVfc2l6ZSkpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJ2b2x1bWVfYmxrX3NpemUgPSAldVxuIiwKKwkJCWxlMzJfdG9fY3B1KG1hcF9idWZmLT52b2x1bWVfYmxrX3NpemUpKTsKKwlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAidm9sdW1lX2Jsa19jbnQgPSAweCVsbHhcbiIsCisJCQlsZTY0X3RvX2NwdShtYXBfYnVmZi0+dm9sdW1lX2Jsa19jbnQpKTsKKwlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAicGh5c2ljYWxCbG9ja1NoaWZ0ID0gJXVcbiIsCisJCQltYXBfYnVmZi0+cGh5c19ibGtfc2hpZnQpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJwYXJpdHlfcm90YXRpb25fc2hpZnQgPSAldVxuIiwKKwkJCW1hcF9idWZmLT5wYXJpdHlfcm90YXRpb25fc2hpZnQpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJzdHJpcF9zaXplID0gJXVcbiIsCisJCQlsZTE2X3RvX2NwdShtYXBfYnVmZi0+c3RyaXBfc2l6ZSkpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJkaXNrX3N0YXJ0aW5nX2JsayA9IDB4JWxseFxuIiwKKwkJCWxlNjRfdG9fY3B1KG1hcF9idWZmLT5kaXNrX3N0YXJ0aW5nX2JsaykpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJkaXNrX2Jsa19jbnQgPSAweCVsbHhcbiIsCisJCQlsZTY0X3RvX2NwdShtYXBfYnVmZi0+ZGlza19ibGtfY250KSk7CisJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwgImRhdGFfZGlza3NfcGVyX3JvdyA9ICV1XG4iLAorCQkJbGUxNl90b19jcHUobWFwX2J1ZmYtPmRhdGFfZGlza3NfcGVyX3JvdykpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJtZXRhZGF0YV9kaXNrc19wZXJfcm93ID0gJXVcbiIsCisJCQlsZTE2X3RvX2NwdShtYXBfYnVmZi0+bWV0YWRhdGFfZGlza3NfcGVyX3JvdykpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJyb3dfY250ID0gJXVcbiIsCisJCQlsZTE2X3RvX2NwdShtYXBfYnVmZi0+cm93X2NudCkpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJsYXlvdXRfbWFwX2NvdW50ID0gJXVcbiIsCisJCQlsZTE2X3RvX2NwdShtYXBfYnVmZi0+bGF5b3V0X21hcF9jb3VudCkpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJmbGFncyA9ICV1XG4iLAorCQkJbGUxNl90b19jcHUobWFwX2J1ZmYtPmZsYWdzKSk7CisJaWYgKG1hcF9idWZmLT5mbGFncyAmIFJBSURfTUFQX0ZMQUdfRU5DUllQVF9PTikKKwkJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwgImVuY3J5cHl0aW9uID0gT05cbiIpOworCWVsc2UKKwkJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwgImVuY3J5cHl0aW9uID0gT0ZGXG4iKTsKKwlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAiZGVraW5kZXggPSAldVxuIiwKKwkJCWxlMTZfdG9fY3B1KG1hcF9idWZmLT5kZWtpbmRleCkpOworCisJbWFwX2NudCA9IGxlMTZfdG9fY3B1KG1hcF9idWZmLT5sYXlvdXRfbWFwX2NvdW50KTsKKwlmb3IgKG1hcCA9IDA7IG1hcCA8IG1hcF9jbnQ7IG1hcCsrKSB7CisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJNYXAldTpcbiIsIG1hcCk7CisJCXJvd19jbnQgPSBsZTE2X3RvX2NwdShtYXBfYnVmZi0+cm93X2NudCk7CisJCWZvciAocm93ID0gMDsgcm93IDwgcm93X2NudDsgcm93KyspIHsKKwkJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICIgIFJvdyV1OlxuIiwgcm93KTsKKwkJCWRpc2tzX3Blcl9yb3cgPQorCQkJCWxlMTZfdG9fY3B1KG1hcF9idWZmLT5kYXRhX2Rpc2tzX3Blcl9yb3cpOworCQkJZm9yIChjb2wgPSAwOyBjb2wgPCBkaXNrc19wZXJfcm93OyBjb2wrKywgZGQrKykKKwkJCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkJCQkiICAgIEQlMDJ1OiBoPTB4JTA0eCB4b3I9JXUsJXVcbiIsCisJCQkJCWNvbCwgZGQtPmlvYWNjZWxfaGFuZGxlLAorCQkJCQlkZC0+eG9yX211bHRbMF0sIGRkLT54b3JfbXVsdFsxXSk7CisJCQlkaXNrc19wZXJfcm93ID0KKwkJCQlsZTE2X3RvX2NwdShtYXBfYnVmZi0+bWV0YWRhdGFfZGlza3NfcGVyX3Jvdyk7CisJCQlmb3IgKGNvbCA9IDA7IGNvbCA8IGRpc2tzX3Blcl9yb3c7IGNvbCsrLCBkZCsrKQorCQkJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkJCSIgICAgTSUwMnU6IGg9MHglMDR4IHhvcj0ldSwldVxuIiwKKwkJCQkJY29sLCBkZC0+aW9hY2NlbF9oYW5kbGUsCisJCQkJCWRkLT54b3JfbXVsdFswXSwgZGQtPnhvcl9tdWx0WzFdKTsKKwkJfQorCX0KK30KKyNlbHNlCitzdGF0aWMgdm9pZCBocHNhX2RlYnVnX21hcF9idWZmKF9fYXR0cmlidXRlX18oKHVudXNlZCkpIHN0cnVjdCBjdGxyX2luZm8gKmgsCisJCQlfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBpbnQgcmMsCisJCQlfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBzdHJ1Y3QgcmFpZF9tYXBfZGF0YSAqbWFwX2J1ZmYpCit7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBocHNhX2dldF9yYWlkX21hcChzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCXVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwgc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqdGhpc19kZXZpY2UpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmM7CisJc3RydWN0IEVycm9ySW5mbyAqZWk7CisKKwljID0gY21kX3NwZWNpYWxfYWxsb2MoaCk7CisJaWYgKGMgPT0gTlVMTCkgeworCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiY21kX3NwZWNpYWxfYWxsb2MgcmV0dXJuZWQgTlVMTCFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKGZpbGxfY21kKGMsIEhQU0FfR0VUX1JBSURfTUFQLCBoLCAmdGhpc19kZXZpY2UtPnJhaWRfbWFwLAorCQkJc2l6ZW9mKHRoaXNfZGV2aWNlLT5yYWlkX21hcCksIDAsCisJCQlzY3NpM2FkZHIsIFRZUEVfQ01EKSkgeworCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiT3V0IG9mIG1lbW9yeSBpbiBocHNhX2dldF9yYWlkX21hcCgpXG4iKTsKKwkJY21kX3NwZWNpYWxfZnJlZShoLCBjKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWhwc2Ffc2NzaV9kb19zaW1wbGVfY21kX3dpdGhfcmV0cnkoaCwgYywgUENJX0RNQV9GUk9NREVWSUNFKTsKKwllaSA9IGMtPmVycl9pbmZvOworCWlmIChlaS0+Q29tbWFuZFN0YXR1cyAhPSAwICYmIGVpLT5Db21tYW5kU3RhdHVzICE9IENNRF9EQVRBX1VOREVSUlVOKSB7CisJCWhwc2Ffc2NzaV9pbnRlcnByZXRfZXJyb3IoaCwgYyk7CisJCWNtZF9zcGVjaWFsX2ZyZWUoaCwgYyk7CisJCXJldHVybiAtMTsKKwl9CisJY21kX3NwZWNpYWxfZnJlZShoLCBjKTsKKworCS8qIEB0b2RvIGluIHRoZSBmdXR1cmUsIGR5bmFtaWNhbGx5IGFsbG9jYXRlIFJBSUQgbWFwIG1lbW9yeSAqLworCWlmIChsZTMyX3RvX2NwdSh0aGlzX2RldmljZS0+cmFpZF9tYXAuc3RydWN0dXJlX3NpemUpID4KKwkJCQlzaXplb2YodGhpc19kZXZpY2UtPnJhaWRfbWFwKSkgeworCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiUkFJRCBtYXAgc2l6ZSBpcyB0b28gbGFyZ2UhXG4iKTsKKwkJcmMgPSAtMTsKKwl9CisJaHBzYV9kZWJ1Z19tYXBfYnVmZihoLCByYywgJnRoaXNfZGV2aWNlLT5yYWlkX21hcCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGhwc2FfdnBkX3BhZ2Vfc3VwcG9ydGVkKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJdW5zaWduZWQgY2hhciBzY3NpM2FkZHJbXSwgdTggcGFnZSkKK3sKKwlpbnQgcmM7CisJaW50IGk7CisJaW50IHBhZ2VzOworCXVuc2lnbmVkIGNoYXIgKmJ1ZiwgYnVmc2l6ZTsKKworCWJ1ZiA9IGt6YWxsb2MoMjU2LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIDA7CisKKwkvKiBHZXQgdGhlIHNpemUgb2YgdGhlIHBhZ2UgbGlzdCBmaXJzdCAqLworCXJjID0gaHBzYV9zY3NpX2RvX2lucXVpcnkoaCwgc2NzaTNhZGRyLAorCQkJCVZQRF9QQUdFIHwgSFBTQV9WUERfU1VQUE9SVEVEX1BBR0VTLAorCQkJCWJ1ZiwgSFBTQV9WUERfSEVBREVSX1NaKTsKKwlpZiAocmMgIT0gMCkKKwkJZ290byBleGl0X3Vuc3VwcG9ydGVkOworCXBhZ2VzID0gYnVmWzNdOworCWlmICgocGFnZXMgKyBIUFNBX1ZQRF9IRUFERVJfU1opIDw9IDI1NSkKKwkJYnVmc2l6ZSA9IHBhZ2VzICsgSFBTQV9WUERfSEVBREVSX1NaOworCWVsc2UKKwkJYnVmc2l6ZSA9IDI1NTsKKworCS8qIEdldCB0aGUgd2hvbGUgVlBEIHBhZ2UgbGlzdCAqLworCXJjID0gaHBzYV9zY3NpX2RvX2lucXVpcnkoaCwgc2NzaTNhZGRyLAorCQkJCVZQRF9QQUdFIHwgSFBTQV9WUERfU1VQUE9SVEVEX1BBR0VTLAorCQkJCWJ1ZiwgYnVmc2l6ZSk7CisJaWYgKHJjICE9IDApCisJCWdvdG8gZXhpdF91bnN1cHBvcnRlZDsKKworCXBhZ2VzID0gYnVmWzNdOworCWZvciAoaSA9IDE7IGkgPD0gcGFnZXM7IGkrKykKKwkJaWYgKGJ1ZlszICsgaV0gPT0gcGFnZSkKKwkJCWdvdG8gZXhpdF9zdXBwb3J0ZWQ7CitleGl0X3Vuc3VwcG9ydGVkOgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIDA7CitleGl0X3N1cHBvcnRlZDoKKwlrZnJlZShidWYpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBocHNhX2dldF9pb2FjY2VsX3N0YXR1cyhzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCXVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwgc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqdGhpc19kZXZpY2UpCit7CisJaW50IHJjOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl1OCBpb2FjY2VsX3N0YXR1czsKKworCXRoaXNfZGV2aWNlLT5vZmZsb2FkX2NvbmZpZyA9IDA7CisJdGhpc19kZXZpY2UtPm9mZmxvYWRfZW5hYmxlZCA9IDA7CisKKwlidWYgPSBremFsbG9jKDY0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCWlmICghaHBzYV92cGRfcGFnZV9zdXBwb3J0ZWQoaCwgc2NzaTNhZGRyLCBIUFNBX1ZQRF9MVl9JT0FDQ0VMX1NUQVRVUykpCisJCWdvdG8gb3V0OworCXJjID0gaHBzYV9zY3NpX2RvX2lucXVpcnkoaCwgc2NzaTNhZGRyLAorCQkJVlBEX1BBR0UgfCBIUFNBX1ZQRF9MVl9JT0FDQ0VMX1NUQVRVUywgYnVmLCA2NCk7CisJaWYgKHJjICE9IDApCisJCWdvdG8gb3V0OworCisjZGVmaW5lIElPQUNDRUxfU1RBVFVTX0JZVEUgNAorI2RlZmluZSBPRkZMT0FEX0NPTkZJR1VSRURfQklUIDB4MDEKKyNkZWZpbmUgT0ZGTE9BRF9FTkFCTEVEX0JJVCAweDAyCisJaW9hY2NlbF9zdGF0dXMgPSBidWZbSU9BQ0NFTF9TVEFUVVNfQllURV07CisJdGhpc19kZXZpY2UtPm9mZmxvYWRfY29uZmlnID0KKwkJISEoaW9hY2NlbF9zdGF0dXMgJiBPRkZMT0FEX0NPTkZJR1VSRURfQklUKTsKKwlpZiAodGhpc19kZXZpY2UtPm9mZmxvYWRfY29uZmlnKSB7CisJCXRoaXNfZGV2aWNlLT5vZmZsb2FkX2VuYWJsZWQgPQorCQkJISEoaW9hY2NlbF9zdGF0dXMgJiBPRkZMT0FEX0VOQUJMRURfQklUKTsKKwkJaWYgKGhwc2FfZ2V0X3JhaWRfbWFwKGgsIHNjc2kzYWRkciwgdGhpc19kZXZpY2UpKQorCQkJdGhpc19kZXZpY2UtPm9mZmxvYWRfZW5hYmxlZCA9IDA7CisJfQorb3V0OgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuOworfQorCiAvKiBHZXQgdGhlIGRldmljZSBpZCBmcm9tIGlucXVpcnkgcGFnZSAweDgzICovCiBzdGF0aWMgaW50IGhwc2FfZ2V0X2RldmljZV9pZChzdHJ1Y3QgY3Rscl9pbmZvICpoLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsCiAJdW5zaWduZWQgY2hhciAqZGV2aWNlX2lkLCBpbnQgYnVmbGVuKQpAQCAtMTY0NCw3ICsyNDE4LDcgQEAKIAlidWYgPSBremFsbG9jKDY0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC0xOwotCXJjID0gaHBzYV9zY3NpX2RvX2lucXVpcnkoaCwgc2NzaTNhZGRyLCAweDgzLCBidWYsIDY0KTsKKwlyYyA9IGhwc2Ffc2NzaV9kb19pbnF1aXJ5KGgsIHNjc2kzYWRkciwgVlBEX1BBR0UgfCAweDgzLCBidWYsIDY0KTsKIAlpZiAocmMgPT0gMCkKIAkJbWVtY3B5KGRldmljZV9pZCwgJmJ1Zls4XSwgYnVmbGVuKTsKIAlrZnJlZShidWYpOwpAQCAtMTY3OCw4ICsyNDUyLDE2IEBACiAJZWkgPSBjLT5lcnJfaW5mbzsKIAlpZiAoZWktPkNvbW1hbmRTdGF0dXMgIT0gMCAmJgogCSAgICBlaS0+Q29tbWFuZFN0YXR1cyAhPSBDTURfREFUQV9VTkRFUlJVTikgewotCQlocHNhX3Njc2lfaW50ZXJwcmV0X2Vycm9yKGMpOworCQlocHNhX3Njc2lfaW50ZXJwcmV0X2Vycm9yKGgsIGMpOwogCQlyYyA9IC0xOworCX0gZWxzZSB7CisJCWlmIChidWYtPmV4dGVuZGVkX3Jlc3BvbnNlX2ZsYWcgIT0gZXh0ZW5kZWRfcmVzcG9uc2UpIHsKKwkJCWRldl9lcnIoJmgtPnBkZXYtPmRldiwKKwkJCQkicmVwb3J0IGx1bnMgcmVxdWVzdGVkIGZvcm1hdCAldSwgZ290ICV1XG4iLAorCQkJCWV4dGVuZGVkX3Jlc3BvbnNlLAorCQkJCWJ1Zi0+ZXh0ZW5kZWRfcmVzcG9uc2VfZmxhZyk7CisJCQlyYyA9IC0xOworCQl9CiAJfQogb3V0OgogCWNtZF9zcGVjaWFsX2ZyZWUoaCwgYyk7CkBAIC0xNzA3LDYgKzI0ODksMTE3IEBACiAJZGV2aWNlLT5sdW4gPSBsdW47CiB9CiAKKy8qIFVzZSBWUEQgaW5xdWlyeSB0byBnZXQgZGV0YWlscyBvZiB2b2x1bWUgc3RhdHVzICovCitzdGF0aWMgaW50IGhwc2FfZ2V0X3ZvbHVtZV9zdGF0dXMoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwkJCQkJdW5zaWduZWQgY2hhciBzY3NpM2FkZHJbXSkKK3sKKwlpbnQgcmM7CisJaW50IHN0YXR1czsKKwlpbnQgc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisKKwlidWYgPSBremFsbG9jKDY0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIEhQU0FfVlBEX0xWX1NUQVRVU19VTlNVUFBPUlRFRDsKKworCS8qIERvZXMgY29udHJvbGxlciBoYXZlIFZQRCBmb3IgbG9naWNhbCB2b2x1bWUgc3RhdHVzPyAqLworCWlmICghaHBzYV92cGRfcGFnZV9zdXBwb3J0ZWQoaCwgc2NzaTNhZGRyLCBIUFNBX1ZQRF9MVl9TVEFUVVMpKSB7CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJMb2dpY2FsIHZvbHVtZSBzdGF0dXMgVlBEIHBhZ2UgaXMgdW5zdXBwb3J0ZWQuXG4iKTsKKwkJZ290byBleGl0X2ZhaWxlZDsKKwl9CisKKwkvKiBHZXQgdGhlIHNpemUgb2YgdGhlIFZQRCByZXR1cm4gYnVmZmVyICovCisJcmMgPSBocHNhX3Njc2lfZG9faW5xdWlyeShoLCBzY3NpM2FkZHIsIFZQRF9QQUdFIHwgSFBTQV9WUERfTFZfU1RBVFVTLAorCQkJCQlidWYsIEhQU0FfVlBEX0hFQURFUl9TWik7CisJaWYgKHJjICE9IDApIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIkxvZ2ljYWwgdm9sdW1lIHN0YXR1cyBWUEQgaW5xdWlyeSBmYWlsZWQuXG4iKTsKKwkJZ290byBleGl0X2ZhaWxlZDsKKwl9CisJc2l6ZSA9IGJ1ZlszXTsKKworCS8qIE5vdyBnZXQgdGhlIHdob2xlIFZQRCBidWZmZXIgKi8KKwlyYyA9IGhwc2Ffc2NzaV9kb19pbnF1aXJ5KGgsIHNjc2kzYWRkciwgVlBEX1BBR0UgfCBIUFNBX1ZQRF9MVl9TVEFUVVMsCisJCQkJCWJ1Ziwgc2l6ZSArIEhQU0FfVlBEX0hFQURFUl9TWik7CisJaWYgKHJjICE9IDApIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIkxvZ2ljYWwgdm9sdW1lIHN0YXR1cyBWUEQgaW5xdWlyeSBmYWlsZWQuXG4iKTsKKwkJZ290byBleGl0X2ZhaWxlZDsKKwl9CisJc3RhdHVzID0gYnVmWzRdOyAvKiBzdGF0dXMgYnl0ZSAqLworCisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gc3RhdHVzOworZXhpdF9mYWlsZWQ6CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gSFBTQV9WUERfTFZfU1RBVFVTX1VOU1VQUE9SVEVEOworfQorCisvKiBEZXRlcm1pbmUgb2ZmbGluZSBzdGF0dXMgb2YgYSB2b2x1bWUuCisgKiBSZXR1cm4gZWl0aGVyOgorICogIDAgKG5vdCBvZmZsaW5lKQorICogLTEgKG9mZmxpbmUgZm9yIHVua25vd24gcmVhc29ucykKKyAqICAjIChpbnRlZ2VyIGNvZGUgaW5kaWNhdGluZyBvbmUgb2Ygc2V2ZXJhbCBOT1QgUkVBRFkgc3RhdGVzCisgKiAgICAgZGVzY3JpYmluZyB3aHkgYSB2b2x1bWUgaXMgdG8gYmUga2VwdCBvZmZsaW5lKQorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBocHNhX3ZvbHVtZV9vZmZsaW5lKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJCQkJCXVuc2lnbmVkIGNoYXIgc2NzaTNhZGRyW10pCit7CisJc3RydWN0IENvbW1hbmRMaXN0ICpjOworCXVuc2lnbmVkIGNoYXIgKnNlbnNlLCBzZW5zZV9rZXksIGFzYywgYXNjcTsKKwlpbnQgbGRzdGF0ID0gMDsKKwl1MTYgY21kX3N0YXR1czsKKwl1OCBzY3NpX3N0YXR1czsKKyNkZWZpbmUgQVNDX0xVTl9OT1RfUkVBRFkgMHgwNAorI2RlZmluZSBBU0NRX0xVTl9OT1RfUkVBRFlfRk9STUFUX0lOX1BST0dSRVNTIDB4MDQKKyNkZWZpbmUgQVNDUV9MVU5fTk9UX1JFQURZX0lOSVRJQUxJWklOR19DTURfUkVRIDB4MDIKKworCWMgPSBjbWRfYWxsb2MoaCk7CisJaWYgKCFjKQorCQlyZXR1cm4gMDsKKwkodm9pZCkgZmlsbF9jbWQoYywgVEVTVF9VTklUX1JFQURZLCBoLCBOVUxMLCAwLCAwLCBzY3NpM2FkZHIsIFRZUEVfQ01EKTsKKwlocHNhX3Njc2lfZG9fc2ltcGxlX2NtZF9jb3JlKGgsIGMpOworCXNlbnNlID0gYy0+ZXJyX2luZm8tPlNlbnNlSW5mbzsKKwlzZW5zZV9rZXkgPSBzZW5zZVsyXTsKKwlhc2MgPSBzZW5zZVsxMl07CisJYXNjcSA9IHNlbnNlWzEzXTsKKwljbWRfc3RhdHVzID0gYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXM7CisJc2NzaV9zdGF0dXMgPSBjLT5lcnJfaW5mby0+U2NzaVN0YXR1czsKKwljbWRfZnJlZShoLCBjKTsKKwkvKiBJcyB0aGUgdm9sdW1lICdub3QgcmVhZHknPyAqLworCWlmIChjbWRfc3RhdHVzICE9IENNRF9UQVJHRVRfU1RBVFVTIHx8CisJCXNjc2lfc3RhdHVzICE9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTiB8fAorCQlzZW5zZV9rZXkgIT0gTk9UX1JFQURZIHx8CisJCWFzYyAhPSBBU0NfTFVOX05PVF9SRUFEWSkgIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRGV0ZXJtaW5lIHRoZSByZWFzb24gZm9yIG5vdCByZWFkeSBzdGF0ZSAqLworCWxkc3RhdCA9IGhwc2FfZ2V0X3ZvbHVtZV9zdGF0dXMoaCwgc2NzaTNhZGRyKTsKKworCS8qIEtlZXAgdm9sdW1lIG9mZmxpbmUgaW4gY2VydGFpbiBjYXNlczogKi8KKwlzd2l0Y2ggKGxkc3RhdCkgeworCWNhc2UgSFBTQV9MVl9VTkRFUkdPSU5HX0VSQVNFOgorCWNhc2UgSFBTQV9MVl9VTkRFUkdPSU5HX1JQSToKKwljYXNlIEhQU0FfTFZfUEVORElOR19SUEk6CisJY2FzZSBIUFNBX0xWX0VOQ1JZUFRFRF9OT19LRVk6CisJY2FzZSBIUFNBX0xWX1BMQUlOVEVYVF9JTl9FTkNSWVBUX09OTFlfQ09OVFJPTExFUjoKKwljYXNlIEhQU0FfTFZfVU5ERVJHT0lOR19FTkNSWVBUSU9OOgorCWNhc2UgSFBTQV9MVl9VTkRFUkdPSU5HX0VOQ1JZUFRJT05fUkVLRVlJTkc6CisJY2FzZSBIUFNBX0xWX0VOQ1JZUFRFRF9JTl9OT05fRU5DUllQVEVEX0NPTlRST0xMRVI6CisJCXJldHVybiBsZHN0YXQ7CisJY2FzZSBIUFNBX1ZQRF9MVl9TVEFUVVNfVU5TVVBQT1JURUQ6CisJCS8qIElmIFZQRCBzdGF0dXMgcGFnZSBpc24ndCBhdmFpbGFibGUsCisJCSAqIHVzZSBBU0MvQVNDUSB0byBkZXRlcm1pbmUgc3RhdGUKKwkJICovCisJCWlmICgoYXNjcSA9PSBBU0NRX0xVTl9OT1RfUkVBRFlfRk9STUFUX0lOX1BST0dSRVNTKSB8fAorCQkJKGFzY3EgPT0gQVNDUV9MVU5fTk9UX1JFQURZX0lOSVRJQUxJWklOR19DTURfUkVRKSkKKwkJCXJldHVybiBsZHN0YXQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBocHNhX3VwZGF0ZV9kZXZpY2VfaW5mbyhzdHJ1Y3QgY3Rscl9pbmZvICpoLAogCXVuc2lnbmVkIGNoYXIgc2NzaTNhZGRyW10sIHN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKnRoaXNfZGV2aWNlLAogCXVuc2lnbmVkIGNoYXIgKmlzX09CRFJfZGV2aWNlKQpAQCAtMTc0NSwxMCArMjYzOCwxOCBAQAogCQlzaXplb2YodGhpc19kZXZpY2UtPmRldmljZV9pZCkpOwogCiAJaWYgKHRoaXNfZGV2aWNlLT5kZXZ0eXBlID09IFRZUEVfRElTSyAmJgotCQlpc19sb2dpY2FsX2Rldl9hZGRyX21vZGUoc2NzaTNhZGRyKSkKKwkJaXNfbG9naWNhbF9kZXZfYWRkcl9tb2RlKHNjc2kzYWRkcikpIHsKIAkJaHBzYV9nZXRfcmFpZF9sZXZlbChoLCBzY3NpM2FkZHIsICZ0aGlzX2RldmljZS0+cmFpZF9sZXZlbCk7Ci0JZWxzZQorCQlpZiAoaC0+Zndfc3VwcG9ydCAmIE1JU0NfRldfUkFJRF9PRkZMT0FEX0JBU0lDKQorCQkJaHBzYV9nZXRfaW9hY2NlbF9zdGF0dXMoaCwgc2NzaTNhZGRyLCB0aGlzX2RldmljZSk7CisJCXRoaXNfZGV2aWNlLT52b2x1bWVfb2ZmbGluZSA9CisJCQlocHNhX3ZvbHVtZV9vZmZsaW5lKGgsIHNjc2kzYWRkcik7CisJfSBlbHNlIHsKIAkJdGhpc19kZXZpY2UtPnJhaWRfbGV2ZWwgPSBSQUlEX1VOS05PV047CisJCXRoaXNfZGV2aWNlLT5vZmZsb2FkX2NvbmZpZyA9IDA7CisJCXRoaXNfZGV2aWNlLT5vZmZsb2FkX2VuYWJsZWQgPSAwOworCQl0aGlzX2RldmljZS0+dm9sdW1lX29mZmxpbmUgPSAwOworCX0KIAogCWlmIChpc19PQkRSX2RldmljZSkgewogCQkvKiBTZWUgaWYgdGhpcyBpcyBhIE9uZS1CdXR0b24tRGlzYXN0ZXItUmVjb3ZlcnkgZGV2aWNlCkBAIC0xODc4LDYgKzI3NzksMTA1IEBACiB9CiAKIC8qCisgKiBHZXQgYWRkcmVzcyBvZiBwaHlzaWNhbCBkaXNrIHVzZWQgZm9yIGFuIGlvYWNjZWwyIG1vZGUgY29tbWFuZDoKKyAqCTEuIEV4dHJhY3QgaW9hY2NlbDIgaGFuZGxlIGZyb20gdGhlIGNvbW1hbmQuCisgKgkyLiBGaW5kIGEgbWF0Y2hpbmcgaW9hY2NlbDIgaGFuZGxlIGZyb20gbGlzdCBvZiBwaHlzaWNhbCBkaXNrcy4KKyAqCTMuIFJldHVybjoKKyAqCQkxIGFuZCBzZXQgc2NzaTNhZGRyIHRvIGFkZHJlc3Mgb2YgbWF0Y2hpbmcgcGh5c2ljYWwKKyAqCQkwIGlmIG5vIG1hdGNoaW5nIHBoeXNpY2FsIGRpc2sgd2FzIGZvdW5kLgorICovCitzdGF0aWMgaW50IGhwc2FfZ2V0X3BkaXNrX29mX2lvYWNjZWwyKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJc3RydWN0IENvbW1hbmRMaXN0ICppb2FjY2VsMl9jbWRfdG9fYWJvcnQsIHVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkcikKK3sKKwlzdHJ1Y3QgUmVwb3J0RXh0ZW5kZWRMVU5kYXRhICpwaHlzaWNhbHMgPSBOVUxMOworCWludCByZXNwb25zZXNpemUgPSAyNDsJLyogc2l6ZSBvZiBwaHlzaWNhbCBleHRlbmRlZCByZXNwb25zZSAqLworCWludCBleHRlbmRlZCA9IDI7CS8qIGZsYWcgZm9yY2VzIHJlcG9ydGluZyAnb3RoZXIgZGV2IGluZm8nLiAqLworCWludCByZXBvcnRzaXplID0gc2l6ZW9mKCpwaHlzaWNhbHMpICsgSFBTQV9NQVhfUEhZU19MVU4gKiByZXNwb25zZXNpemU7CisJdTMyIG5waHlzaWNhbHMgPSAwOwkvKiBudW1iZXIgb2YgcmVwb3J0ZWQgcGh5c2ljYWwgZGV2cyAqLworCWludCBmb3VuZCA9IDA7CQkvKiBmb3VuZCBtYXRjaCAoMSkgb3Igbm90ICgwKSAqLworCXUzMiBmaW5kOwkJLyogaGFuZGxlIHdlIG5lZWQgdG8gbWF0Y2ggKi8KKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kOwkvKiBzY3NpIGNvbW1hbmQgd2l0aGluIHJlcXVlc3QgYmVpbmcgYWJvcnRlZCAqLworCXN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKmQ7IC8qIGRldmljZSBvZiByZXF1ZXN0IGJlaW5nIGFib3J0ZWQgKi8KKwlzdHJ1Y3QgaW9fYWNjZWwyX2NtZCAqYzJhOyAvKiBpb2FjY2VsMiBjb21tYW5kIHRvIGFib3J0ICovCisJdTMyIGl0X25leHVzOwkJLyogNCBieXRlIGRldmljZSBoYW5kbGUgZm9yIHRoZSBpb2FjY2VsMiBjbWQgKi8KKwl1MzIgc2NzaV9uZXh1czsJCS8qIDQgYnl0ZSBkZXZpY2UgaGFuZGxlIGZvciB0aGUgaW9hY2NlbDIgY21kICovCisKKwlpZiAoaW9hY2NlbDJfY21kX3RvX2Fib3J0LT5jbWRfdHlwZSAhPSBDTURfSU9BQ0NFTDIpCisJCXJldHVybiAwOyAvKiBubyBtYXRjaCAqLworCisJLyogcG9pbnQgdG8gdGhlIGlvYWNjZWwyIGRldmljZSBoYW5kbGUgKi8KKwljMmEgPSAmaC0+aW9hY2NlbDJfY21kX3Bvb2xbaW9hY2NlbDJfY21kX3RvX2Fib3J0LT5jbWRpbmRleF07CisJaWYgKGMyYSA9PSBOVUxMKQorCQlyZXR1cm4gMDsgLyogbm8gbWF0Y2ggKi8KKworCXNjbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBpb2FjY2VsMl9jbWRfdG9fYWJvcnQtPnNjc2lfY21kOworCWlmIChzY21kID09IE5VTEwpCisJCXJldHVybiAwOyAvKiBubyBtYXRjaCAqLworCisJZCA9IHNjbWQtPmRldmljZS0+aG9zdGRhdGE7CisJaWYgKGQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7IC8qIG5vIG1hdGNoICovCisKKwlpdF9uZXh1cyA9IGNwdV90b19sZTMyKCh1MzIpIGQtPmlvYWNjZWxfaGFuZGxlKTsKKwlzY3NpX25leHVzID0gY3B1X3RvX2xlMzIoKHUzMikgYzJhLT5zY3NpX25leHVzKTsKKwlmaW5kID0gYzJhLT5zY3NpX25leHVzOworCisJaWYgKGgtPnJhaWRfb2ZmbG9hZF9kZWJ1ZyA+IDApCisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiJXM6IHNjc2lfbmV4dXM6MHglMDh4IGRldmljZSBpZDogMHglMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkJX19mdW5jX18sIHNjc2lfbmV4dXMsCisJCQlkLT5kZXZpY2VfaWRbMF0sIGQtPmRldmljZV9pZFsxXSwgZC0+ZGV2aWNlX2lkWzJdLAorCQkJZC0+ZGV2aWNlX2lkWzNdLCBkLT5kZXZpY2VfaWRbNF0sIGQtPmRldmljZV9pZFs1XSwKKwkJCWQtPmRldmljZV9pZFs2XSwgZC0+ZGV2aWNlX2lkWzddLCBkLT5kZXZpY2VfaWRbOF0sCisJCQlkLT5kZXZpY2VfaWRbOV0sIGQtPmRldmljZV9pZFsxMF0sIGQtPmRldmljZV9pZFsxMV0sCisJCQlkLT5kZXZpY2VfaWRbMTJdLCBkLT5kZXZpY2VfaWRbMTNdLCBkLT5kZXZpY2VfaWRbMTRdLAorCQkJZC0+ZGV2aWNlX2lkWzE1XSk7CisKKwkvKiBHZXQgdGhlIGxpc3Qgb2YgcGh5c2ljYWwgZGV2aWNlcyAqLworCXBoeXNpY2FscyA9IGt6YWxsb2MocmVwb3J0c2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGhwc2Ffc2NzaV9kb19yZXBvcnRfcGh5c19sdW5zKGgsIChzdHJ1Y3QgUmVwb3J0TFVOZGF0YSAqKSBwaHlzaWNhbHMsCisJCXJlcG9ydHNpemUsIGV4dGVuZGVkKSkgeworCQlkZXZfZXJyKCZoLT5wZGV2LT5kZXYsCisJCQkiQ2FuJ3QgbG9va3VwICVzIGRldmljZSBoYW5kbGU6IHJlcG9ydCBwaHlzaWNhbCBMVU5zIGZhaWxlZC5cbiIsCisJCQkiSFAgU1NEIFNtYXJ0IFBhdGgiKTsKKwkJa2ZyZWUocGh5c2ljYWxzKTsKKwkJcmV0dXJuIDA7CisJfQorCW5waHlzaWNhbHMgPSBiZTMyX3RvX2NwdSgqKChfX2JlMzIgKilwaHlzaWNhbHMtPkxVTkxpc3RMZW5ndGgpKSAvCisJCQkJCQkJcmVzcG9uc2VzaXplOworCisKKwkvKiBmaW5kIGlvYWNjZWwyIGhhbmRsZSBpbiBsaXN0IG9mIHBoeXNpY2FsczogKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnBoeXNpY2FsczsgaSsrKSB7CisJCS8qIGhhbmRsZSBpcyBpbiBieXRlcyAyOC0zMSBvZiBlYWNoIGx1biAqLworCQlpZiAobWVtY21wKCYoKHN0cnVjdCBSZXBvcnRFeHRlbmRlZExVTmRhdGEgKikKKwkJCQlwaHlzaWNhbHMpLT5MVU5baV1bMjBdLCAmZmluZCwgNCkgIT0gMCkgeworCQkJY29udGludWU7IC8qIGRpZG4ndCBtYXRjaCAqLworCQl9CisJCWZvdW5kID0gMTsKKwkJbWVtY3B5KHNjc2kzYWRkciwgJigoc3RydWN0IFJlcG9ydEV4dGVuZGVkTFVOZGF0YSAqKQorCQkJCQlwaHlzaWNhbHMpLT5MVU5baV1bMF0sIDgpOworCQlpZiAoaC0+cmFpZF9vZmZsb2FkX2RlYnVnID4gMCkKKwkJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkJIiVzOiBTZWFyY2hlZCBoPTB4JTA4eCwgRm91bmQgaD0weCUwOHgsIHNjc2lhZGRyIDB4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCQkJX19mdW5jX18sIGZpbmQsCisJCQkJKChzdHJ1Y3QgUmVwb3J0RXh0ZW5kZWRMVU5kYXRhICopCisJCQkJCXBoeXNpY2FscyktPkxVTltpXVsyMF0sCisJCQkJc2NzaTNhZGRyWzBdLCBzY3NpM2FkZHJbMV0sIHNjc2kzYWRkclsyXSwKKwkJCQlzY3NpM2FkZHJbM10sIHNjc2kzYWRkcls0XSwgc2NzaTNhZGRyWzVdLAorCQkJCXNjc2kzYWRkcls2XSwgc2NzaTNhZGRyWzddKTsKKwkJYnJlYWs7IC8qIGZvdW5kIGl0ICovCisJfQorCisJa2ZyZWUocGh5c2ljYWxzKTsKKwlpZiAoZm91bmQpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7CisKK30KKy8qCiAgKiBEbyBDSVNTX1JFUE9SVF9QSFlTIGFuZCBDSVNTX1JFUE9SVF9MT0cuICBEYXRhIGlzIHJldHVybmVkIGluIHBoeXNkZXYsCiAgKiBsb2dkZXYuICBUaGUgbnVtYmVyIG9mIGx1bnMgaW4gcGh5c2RldiBhbmQgbG9nZGV2IGFyZSByZXR1cm5lZCBpbgogICogKm5waHlzaWNhbHMgYW5kICpubG9naWNhbHMsIHJlc3BlY3RpdmVseS4KQEAgLTE4ODUsMTQgKzI4ODUsMjYgQEAKICAqLwogc3RhdGljIGludCBocHNhX2dhdGhlcl9sdW5faW5mbyhzdHJ1Y3QgY3Rscl9pbmZvICpoLAogCWludCByZXBvcnRsdW5zaXplLAotCXN0cnVjdCBSZXBvcnRMVU5kYXRhICpwaHlzZGV2LCB1MzIgKm5waHlzaWNhbHMsCisJc3RydWN0IFJlcG9ydExVTmRhdGEgKnBoeXNkZXYsIHUzMiAqbnBoeXNpY2FscywgaW50ICpwaHlzaWNhbF9tb2RlLAogCXN0cnVjdCBSZXBvcnRMVU5kYXRhICpsb2dkZXYsIHUzMiAqbmxvZ2ljYWxzKQogewotCWlmIChocHNhX3Njc2lfZG9fcmVwb3J0X3BoeXNfbHVucyhoLCBwaHlzZGV2LCByZXBvcnRsdW5zaXplLCAwKSkgeworCWludCBwaHlzaWNhbF9lbnRyeV9zaXplID0gODsKKworCSpwaHlzaWNhbF9tb2RlID0gMDsKKworCS8qIEZvciBJL08gYWNjZWxlcmF0b3IgbW9kZSB3ZSBuZWVkIHRvIHJlYWQgcGh5c2ljYWwgZGV2aWNlIGhhbmRsZXMgKi8KKwlpZiAoaC0+dHJhbnNNZXRob2QgJiBDRkdUQkxfVHJhbnNfaW9fYWNjZWwxIHx8CisJCWgtPnRyYW5zTWV0aG9kICYgQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMikgeworCQkqcGh5c2ljYWxfbW9kZSA9IEhQU0FfUkVQT1JUX1BIWVNfRVhURU5ERUQ7CisJCXBoeXNpY2FsX2VudHJ5X3NpemUgPSAyNDsKKwl9CisJaWYgKGhwc2Ffc2NzaV9kb19yZXBvcnRfcGh5c19sdW5zKGgsIHBoeXNkZXYsIHJlcG9ydGx1bnNpemUsCisJCQkJCQkJKnBoeXNpY2FsX21vZGUpKSB7CiAJCWRldl9lcnIoJmgtPnBkZXYtPmRldiwgInJlcG9ydCBwaHlzaWNhbCBMVU5zIGZhaWxlZC5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQotCSpucGh5c2ljYWxzID0gYmUzMl90b19jcHUoKigoX19iZTMyICopcGh5c2Rldi0+TFVOTGlzdExlbmd0aCkpIC8gODsKKwkqbnBoeXNpY2FscyA9IGJlMzJfdG9fY3B1KCooKF9fYmUzMiAqKXBoeXNkZXYtPkxVTkxpc3RMZW5ndGgpKSAvCisJCQkJCQkJcGh5c2ljYWxfZW50cnlfc2l6ZTsKIAlpZiAoKm5waHlzaWNhbHMgPiBIUFNBX01BWF9QSFlTX0xVTikgewogCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAibWF4aW11bSBwaHlzaWNhbCBMVU5zICglZCkgZXhjZWVkZWQuIgogCQkJIiAgJWQgTFVOcyBpZ25vcmVkLlxuIiwgSFBTQV9NQVhfUEhZU19MVU4sCkBAIC0xOTIzLDcgKzI5MzUsOCBAQAogfQogCiB1OCAqZmlndXJlX2x1bmFkZHJieXRlcyhzdHJ1Y3QgY3Rscl9pbmZvICpoLCBpbnQgcmFpZF9jdGxyX3Bvc2l0aW9uLCBpbnQgaSwKLQlpbnQgbnBoeXNpY2FscywgaW50IG5sb2dpY2Fscywgc3RydWN0IFJlcG9ydExVTmRhdGEgKnBoeXNkZXZfbGlzdCwKKwlpbnQgbnBoeXNpY2FscywgaW50IG5sb2dpY2FscywKKwlzdHJ1Y3QgUmVwb3J0RXh0ZW5kZWRMVU5kYXRhICpwaHlzZGV2X2xpc3QsCiAJc3RydWN0IFJlcG9ydExVTmRhdGEgKmxvZ2Rldl9saXN0KQogewogCS8qIEhlbHBlciBmdW5jdGlvbiwgZmlndXJlIG91dCB3aGVyZSB0aGUgTFVOIElEIGluZm8gaXMgY29taW5nIGZyb20KQEAgLTE5NDcsNiArMjk2MCwyNCBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW50IGhwc2FfaGJhX21vZGVfZW5hYmxlZChzdHJ1Y3QgY3Rscl9pbmZvICpoKQoreworCWludCByYzsKKwlzdHJ1Y3QgYm1pY19jb250cm9sbGVyX3BhcmFtZXRlcnMgKmN0bHJfcGFyYW1zOworCWN0bHJfcGFyYW1zID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJtaWNfY29udHJvbGxlcl9wYXJhbWV0ZXJzKSwKKwkJR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWN0bHJfcGFyYW1zKQorCQlyZXR1cm4gMDsKKwlyYyA9IGhwc2FfYm1pY19jdHJsX21vZGVfc2Vuc2UoaCwgUkFJRF9DVExSX0xVTklELCAwLCBjdGxyX3BhcmFtcywKKwkJc2l6ZW9mKHN0cnVjdCBibWljX2NvbnRyb2xsZXJfcGFyYW1ldGVycykpOworCWlmIChyYyAhPSAwKSB7CisJCWtmcmVlKGN0bHJfcGFyYW1zKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBjdGxyX3BhcmFtcy0+bnZyYW1fZmxhZ3MgJiAoMSA8PCAzKSA/IDEgOiAwOworfQorCiBzdGF0aWMgdm9pZCBocHNhX3VwZGF0ZV9zY3NpX2RldmljZXMoc3RydWN0IGN0bHJfaW5mbyAqaCwgaW50IGhvc3RubykKIHsKIAkvKiB0aGUgaWRlYSBoZXJlIGlzIHdlIGNvdWxkIGdldCBub3RpZmllZApAQCAtMTk1OSwxNiArMjk5MCwxOCBAQAogCSAqIHRlbGwgd2hpY2ggZGV2aWNlcyB3ZSBhbHJlYWR5IGtub3cgYWJvdXQsIHZzLiBuZXcKIAkgKiBkZXZpY2VzLCB2cy4gIGRpc2FwcGVhcmluZyBkZXZpY2VzLgogCSAqLwotCXN0cnVjdCBSZXBvcnRMVU5kYXRhICpwaHlzZGV2X2xpc3QgPSBOVUxMOworCXN0cnVjdCBSZXBvcnRFeHRlbmRlZExVTmRhdGEgKnBoeXNkZXZfbGlzdCA9IE5VTEw7CiAJc3RydWN0IFJlcG9ydExVTmRhdGEgKmxvZ2Rldl9saXN0ID0gTlVMTDsKIAl1MzIgbnBoeXNpY2FscyA9IDA7CiAJdTMyIG5sb2dpY2FscyA9IDA7CisJaW50IHBoeXNpY2FsX21vZGUgPSAwOwogCXUzMiBuZGV2X2FsbG9jYXRlZCA9IDA7CiAJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqKmN1cnJlbnRzZCwgKnRoaXNfZGV2aWNlLCAqdG1wZGV2aWNlOwogCWludCBuY3VycmVudCA9IDA7Ci0JaW50IHJlcG9ydGx1bnNpemUgPSBzaXplb2YoKnBoeXNkZXZfbGlzdCkgKyBIUFNBX01BWF9QSFlTX0xVTiAqIDg7CisJaW50IHJlcG9ydGx1bnNpemUgPSBzaXplb2YoKnBoeXNkZXZfbGlzdCkgKyBIUFNBX01BWF9QSFlTX0xVTiAqIDI0OwogCWludCBpLCBuX2V4dF90YXJnZXRfZGV2cywgbmRldnNfdG9fYWxsb2NhdGU7CiAJaW50IHJhaWRfY3Rscl9wb3NpdGlvbjsKKwl1OCByZXNjYW5faGJhX21vZGU7CiAJREVDTEFSRV9CSVRNQVAobHVuemVyb2JpdHMsIE1BWF9FWFRfVEFSR0VUUyk7CiAKIAljdXJyZW50c2QgPSBremFsbG9jKHNpemVvZigqY3VycmVudHNkKSAqIEhQU0FfTUFYX0RFVklDRVMsIEdGUF9LRVJORUwpOwpAQCAtMTk4Miw4ICszMDE1LDE4IEBACiAJfQogCW1lbXNldChsdW56ZXJvYml0cywgMCwgc2l6ZW9mKGx1bnplcm9iaXRzKSk7CiAKLQlpZiAoaHBzYV9nYXRoZXJfbHVuX2luZm8oaCwgcmVwb3J0bHVuc2l6ZSwgcGh5c2Rldl9saXN0LCAmbnBoeXNpY2FscywKLQkJCWxvZ2Rldl9saXN0LCAmbmxvZ2ljYWxzKSkKKwlyZXNjYW5faGJhX21vZGUgPSBocHNhX2hiYV9tb2RlX2VuYWJsZWQoaCk7CisKKwlpZiAoIWgtPmhiYV9tb2RlX2VuYWJsZWQgJiYgcmVzY2FuX2hiYV9tb2RlKQorCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiSEJBIG1vZGUgZW5hYmxlZFxuIik7CisJZWxzZSBpZiAoaC0+aGJhX21vZGVfZW5hYmxlZCAmJiAhcmVzY2FuX2hiYV9tb2RlKQorCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiSEJBIG1vZGUgZGlzYWJsZWRcbiIpOworCisJaC0+aGJhX21vZGVfZW5hYmxlZCA9IHJlc2Nhbl9oYmFfbW9kZTsKKworCWlmIChocHNhX2dhdGhlcl9sdW5faW5mbyhoLCByZXBvcnRsdW5zaXplLAorCQkJKHN0cnVjdCBSZXBvcnRMVU5kYXRhICopIHBoeXNkZXZfbGlzdCwgJm5waHlzaWNhbHMsCisJCQkmcGh5c2ljYWxfbW9kZSwgbG9nZGV2X2xpc3QsICZubG9naWNhbHMpKQogCQlnb3RvIG91dDsKIAogCS8qIFdlIG1pZ2h0IHNlZSB1cCB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgbG9naWNhbCBhbmQgcGh5c2ljYWwgZGlza3MKQEAgLTIwNjQsOSArMzEwNywyOCBAQAogCQkJCW5jdXJyZW50Kys7CiAJCQlicmVhazsKIAkJY2FzZSBUWVBFX0RJU0s6Ci0JCQlpZiAoaSA8IG5waHlzaWNhbHMpCisJCQlpZiAoaC0+aGJhX21vZGVfZW5hYmxlZCkgeworCQkJCS8qIG5ldmVyIHVzZSByYWlkIG1hcHBlciBpbiBIQkEgbW9kZSAqLworCQkJCXRoaXNfZGV2aWNlLT5vZmZsb2FkX2VuYWJsZWQgPSAwOworCQkJCW5jdXJyZW50Kys7CiAJCQkJYnJlYWs7Ci0JCQluY3VycmVudCsrOworCQkJfSBlbHNlIGlmIChoLT5hY2Npb3BhdGhfc3RhdHVzKSB7CisJCQkJaWYgKGkgPj0gbnBoeXNpY2FscykgeworCQkJCQluY3VycmVudCsrOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChpIDwgbnBoeXNpY2FscykKKwkJCQkJYnJlYWs7CisJCQkJbmN1cnJlbnQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChwaHlzaWNhbF9tb2RlID09IEhQU0FfUkVQT1JUX1BIWVNfRVhURU5ERUQpIHsKKwkJCQltZW1jcHkoJnRoaXNfZGV2aWNlLT5pb2FjY2VsX2hhbmRsZSwKKwkJCQkJJmx1bmFkZHJieXRlc1syMF0sCisJCQkJCXNpemVvZih0aGlzX2RldmljZS0+aW9hY2NlbF9oYW5kbGUpKTsKKwkJCQluY3VycmVudCsrOworCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVFlQRV9UQVBFOgogCQljYXNlIFRZUEVfTUVESVVNX0NIQU5HRVI6CkBAIC0yMTM2LDcgKzMxOTgsNyBAQAogCQljdXJyX3NnLT5BZGRyLmxvd2VyID0gKHUzMikgKGFkZHI2NCAmIDB4MEZGRkZGRkZGVUxMKTsKIAkJY3Vycl9zZy0+QWRkci51cHBlciA9ICh1MzIpICgoYWRkcjY0ID4+IDMyKSAmIDB4MEZGRkZGRkZGVUxMKTsKIAkJY3Vycl9zZy0+TGVuID0gbGVuOwotCQljdXJyX3NnLT5FeHQgPSAwOyAgLyogd2UgYXJlIG5vdCBjaGFpbmluZyAqLworCQljdXJyX3NnLT5FeHQgPSAoaSA8IHNjc2lfc2dfY291bnQoY21kKSAtIDEpID8gMCA6IEhQU0FfU0dfTEFTVDsKIAkJY3Vycl9zZysrOwogCX0KIApAQCAtMjE2MCw2ICszMjIyLDcyNiBAQAogCXJldHVybiAwOwogfQogCisjZGVmaW5lIElPX0FDQ0VMX0lORUxJR0lCTEUgKDEpCitzdGF0aWMgaW50IGZpeHVwX2lvYWNjZWxfY2RiKHU4ICpjZGIsIGludCAqY2RiX2xlbikKK3sKKwlpbnQgaXNfd3JpdGUgPSAwOworCXUzMiBibG9jazsKKwl1MzIgYmxvY2tfY250OworCisJLyogUGVyZm9ybSBzb21lIENEQiBmaXh1cHMgaWYgbmVlZGVkIHVzaW5nIDEwIGJ5dGUgcmVhZHMvd3JpdGVzIG9ubHkgKi8KKwlzd2l0Y2ggKGNkYlswXSkgeworCWNhc2UgV1JJVEVfNjoKKwljYXNlIFdSSVRFXzEyOgorCQlpc193cml0ZSA9IDE7CisJY2FzZSBSRUFEXzY6CisJY2FzZSBSRUFEXzEyOgorCQlpZiAoKmNkYl9sZW4gPT0gNikgeworCQkJYmxvY2sgPSAoKCh1MzIpIGNkYlsyXSkgPDwgOCkgfCBjZGJbM107CisJCQlibG9ja19jbnQgPSBjZGJbNF07CisJCX0gZWxzZSB7CisJCQlCVUdfT04oKmNkYl9sZW4gIT0gMTIpOworCQkJYmxvY2sgPSAoKCh1MzIpIGNkYlsyXSkgPDwgMjQpIHwKKwkJCQkoKCh1MzIpIGNkYlszXSkgPDwgMTYpIHwKKwkJCQkoKCh1MzIpIGNkYls0XSkgPDwgOCkgfAorCQkJCWNkYls1XTsKKwkJCWJsb2NrX2NudCA9CisJCQkJKCgodTMyKSBjZGJbNl0pIDw8IDI0KSB8CisJCQkJKCgodTMyKSBjZGJbN10pIDw8IDE2KSB8CisJCQkJKCgodTMyKSBjZGJbOF0pIDw8IDgpIHwKKwkJCQljZGJbOV07CisJCX0KKwkJaWYgKGJsb2NrX2NudCA+IDB4ZmZmZikKKwkJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOworCisJCWNkYlswXSA9IGlzX3dyaXRlID8gV1JJVEVfMTAgOiBSRUFEXzEwOworCQljZGJbMV0gPSAwOworCQljZGJbMl0gPSAodTgpIChibG9jayA+PiAyNCk7CisJCWNkYlszXSA9ICh1OCkgKGJsb2NrID4+IDE2KTsKKwkJY2RiWzRdID0gKHU4KSAoYmxvY2sgPj4gOCk7CisJCWNkYls1XSA9ICh1OCkgKGJsb2NrKTsKKwkJY2RiWzZdID0gMDsKKwkJY2RiWzddID0gKHU4KSAoYmxvY2tfY250ID4+IDgpOworCQljZGJbOF0gPSAodTgpIChibG9ja19jbnQpOworCQljZGJbOV0gPSAwOworCQkqY2RiX2xlbiA9IDEwOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHBzYV9zY3NpX2lvYWNjZWwxX3F1ZXVlX2NvbW1hbmQoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMsIHUzMiBpb2FjY2VsX2hhbmRsZSwgdTggKmNkYiwgaW50IGNkYl9sZW4sCisJdTggKnNjc2kzYWRkcikKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBjLT5zY3NpX2NtZDsKKwlzdHJ1Y3QgaW9fYWNjZWwxX2NtZCAqY3AgPSAmaC0+aW9hY2NlbF9jbWRfcG9vbFtjLT5jbWRpbmRleF07CisJdW5zaWduZWQgaW50IGxlbjsKKwl1bnNpZ25lZCBpbnQgdG90YWxfbGVuID0gMDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXU2NCBhZGRyNjQ7CisJaW50IHVzZV9zZywgaTsKKwlzdHJ1Y3QgU0dEZXNjcmlwdG9yICpjdXJyX3NnOworCXUzMiBjb250cm9sID0gSU9BQ0NFTDFfQ09OVFJPTF9TSU1QTEVRVUVVRTsKKworCS8qIFRPRE86IGltcGxlbWVudCBjaGFpbmluZyBzdXBwb3J0ICovCisJaWYgKHNjc2lfc2dfY291bnQoY21kKSA+IGgtPmlvYWNjZWxfbWF4c2cpCisJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOworCisJQlVHX09OKGNtZC0+Y21kX2xlbiA+IElPQUNDRUwxX0lPRkxBR1NfQ0RCTEVOX01BWCk7CisKKwlpZiAoZml4dXBfaW9hY2NlbF9jZGIoY2RiLCAmY2RiX2xlbikpCisJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOworCisJYy0+Y21kX3R5cGUgPSBDTURfSU9BQ0NFTDE7CisKKwkvKiBBZGp1c3QgdGhlIERNQSBhZGRyZXNzIHRvIHBvaW50IHRvIHRoZSBhY2NlbGVyYXRlZCBjb21tYW5kIGJ1ZmZlciAqLworCWMtPmJ1c2FkZHIgPSAodTMyKSBoLT5pb2FjY2VsX2NtZF9wb29sX2RoYW5kbGUgKworCQkJCShjLT5jbWRpbmRleCAqIHNpemVvZigqY3ApKTsKKwlCVUdfT04oYy0+YnVzYWRkciAmIDB4MDAwMDAwN0YpOworCisJdXNlX3NnID0gc2NzaV9kbWFfbWFwKGNtZCk7CisJaWYgKHVzZV9zZyA8IDApCisJCXJldHVybiB1c2Vfc2c7CisKKwlpZiAodXNlX3NnKSB7CisJCWN1cnJfc2cgPSBjcC0+U0c7CisJCXNjc2lfZm9yX2VhY2hfc2coY21kLCBzZywgdXNlX3NnLCBpKSB7CisJCQlhZGRyNjQgPSAodTY0KSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCQlsZW4gID0gc2dfZG1hX2xlbihzZyk7CisJCQl0b3RhbF9sZW4gKz0gbGVuOworCQkJY3Vycl9zZy0+QWRkci5sb3dlciA9ICh1MzIpIChhZGRyNjQgJiAweDBGRkZGRkZGRlVMTCk7CisJCQljdXJyX3NnLT5BZGRyLnVwcGVyID0KKwkJCQkodTMyKSAoKGFkZHI2NCA+PiAzMikgJiAweDBGRkZGRkZGRlVMTCk7CisJCQljdXJyX3NnLT5MZW4gPSBsZW47CisKKwkJCWlmIChpID09IChzY3NpX3NnX2NvdW50KGNtZCkgLSAxKSkKKwkJCQljdXJyX3NnLT5FeHQgPSBIUFNBX1NHX0xBU1Q7CisJCQllbHNlCisJCQkJY3Vycl9zZy0+RXh0ID0gMDsgIC8qIHdlIGFyZSBub3QgY2hhaW5pbmcgKi8KKwkJCWN1cnJfc2crKzsKKwkJfQorCisJCXN3aXRjaCAoY21kLT5zY19kYXRhX2RpcmVjdGlvbikgeworCQljYXNlIERNQV9UT19ERVZJQ0U6CisJCQljb250cm9sIHw9IElPQUNDRUwxX0NPTlRST0xfREFUQV9PVVQ7CisJCQlicmVhazsKKwkJY2FzZSBETUFfRlJPTV9ERVZJQ0U6CisJCQljb250cm9sIHw9IElPQUNDRUwxX0NPTlRST0xfREFUQV9JTjsKKwkJCWJyZWFrOworCQljYXNlIERNQV9OT05FOgorCQkJY29udHJvbCB8PSBJT0FDQ0VMMV9DT05UUk9MX05PREFUQVhGRVI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoJmgtPnBkZXYtPmRldiwgInVua25vd24gZGF0YSBkaXJlY3Rpb246ICVkXG4iLAorCQkJY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCQlCVUcoKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJY29udHJvbCB8PSBJT0FDQ0VMMV9DT05UUk9MX05PREFUQVhGRVI7CisJfQorCisJYy0+SGVhZGVyLlNHTGlzdCA9IHVzZV9zZzsKKwkvKiBGaWxsIG91dCB0aGUgY29tbWFuZCBzdHJ1Y3R1cmUgdG8gc3VibWl0ICovCisJY3AtPmRldl9oYW5kbGUgPSBpb2FjY2VsX2hhbmRsZSAmIDB4RkZGRjsKKwljcC0+dHJhbnNmZXJfbGVuID0gdG90YWxfbGVuOworCWNwLT5pb19mbGFncyA9IElPQUNDRUwxX0lPRkxBR1NfSU9fUkVRIHwKKwkJCShjZGJfbGVuICYgSU9BQ0NFTDFfSU9GTEFHU19DREJMRU5fTUFTSyk7CisJY3AtPmNvbnRyb2wgPSBjb250cm9sOworCW1lbWNweShjcC0+Q0RCLCBjZGIsIGNkYl9sZW4pOworCW1lbWNweShjcC0+Q0lTU19MVU4sIHNjc2kzYWRkciwgOCk7CisJLyogVGFnIHdhcyBhbHJlYWR5IHNldCBhdCBpbml0IHRpbWUuICovCisJZW5xdWV1ZV9jbWRfYW5kX3N0YXJ0X2lvKGgsIGMpOworCXJldHVybiAwOworfQorCisvKgorICogUXVldWUgYSBjb21tYW5kIGRpcmVjdGx5IHRvIGEgZGV2aWNlIGJlaGluZCB0aGUgY29udHJvbGxlciB1c2luZyB0aGUKKyAqIEkvTyBhY2NlbGVyYXRvciBwYXRoLgorICovCitzdGF0aWMgaW50IGhwc2Ffc2NzaV9pb2FjY2VsX2RpcmVjdF9tYXAoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gYy0+c2NzaV9jbWQ7CisJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqZGV2ID0gY21kLT5kZXZpY2UtPmhvc3RkYXRhOworCisJcmV0dXJuIGhwc2Ffc2NzaV9pb2FjY2VsX3F1ZXVlX2NvbW1hbmQoaCwgYywgZGV2LT5pb2FjY2VsX2hhbmRsZSwKKwkJY21kLT5jbW5kLCBjbWQtPmNtZF9sZW4sIGRldi0+c2NzaTNhZGRyKTsKK30KKworLyoKKyAqIFNldCBlbmNyeXB0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBpb2FjY2VsMiByZXF1ZXN0CisgKi8KK3N0YXRpYyB2b2lkIHNldF9lbmNyeXB0X2lvYWNjZWwyKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJc3RydWN0IENvbW1hbmRMaXN0ICpjLCBzdHJ1Y3QgaW9fYWNjZWwyX2NtZCAqY3ApCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gYy0+c2NzaV9jbWQ7CisJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqZGV2ID0gY21kLT5kZXZpY2UtPmhvc3RkYXRhOworCXN0cnVjdCByYWlkX21hcF9kYXRhICptYXAgPSAmZGV2LT5yYWlkX21hcDsKKwl1NjQgZmlyc3RfYmxvY2s7CisKKwlCVUdfT04oIShkZXYtPm9mZmxvYWRfY29uZmlnICYmIGRldi0+b2ZmbG9hZF9lbmFibGVkKSk7CisKKwkvKiBBcmUgd2UgZG9pbmcgZW5jcnlwdGlvbiBvbiB0aGlzIGRldmljZSAqLworCWlmICghKG1hcC0+ZmxhZ3MgJiBSQUlEX01BUF9GTEFHX0VOQ1JZUFRfT04pKQorCQlyZXR1cm47CisJLyogU2V0IHRoZSBkYXRhIGVuY3J5cHRpb24ga2V5IGluZGV4LiAqLworCWNwLT5kZWtpbmRleCA9IG1hcC0+ZGVraW5kZXg7CisKKwkvKiBTZXQgdGhlIGVuY3J5cHRpb24gZW5hYmxlIGZsYWcsIGVuY29kZWQgaW50byBkaXJlY3Rpb24gZmllbGQuICovCisJY3AtPmRpcmVjdGlvbiB8PSBJT0FDQ0VMMl9ESVJFQ1RJT05fRU5DUllQVF9NQVNLOworCisJLyogU2V0IGVuY3J5cHRpb24gdHdlYWsgdmFsdWVzIGJhc2VkIG9uIGxvZ2ljYWwgYmxvY2sgYWRkcmVzcworCSAqIElmIGJsb2NrIHNpemUgaXMgNTEyLCB0d2VhayB2YWx1ZSBpcyBMQkEuCisJICogRm9yIG90aGVyIGJsb2NrIHNpemVzLCB0d2VhayBpcyAoTEJBICogYmxvY2sgc2l6ZSkvIDUxMikKKwkgKi8KKwlzd2l0Y2ggKGNtZC0+Y21uZFswXSkgeworCS8qIFJlcXVpcmVkPyA2LWJ5dGUgY2RicyBlbGltaW5hdGVkIGJ5IGZpeHVwX2lvYWNjZWxfY2RiICovCisJY2FzZSBXUklURV82OgorCWNhc2UgUkVBRF82OgorCQlpZiAobWFwLT52b2x1bWVfYmxrX3NpemUgPT0gNTEyKSB7CisJCQljcC0+dHdlYWtfbG93ZXIgPQorCQkJCSgoKHUzMikgY21kLT5jbW5kWzJdKSA8PCA4KSB8CisJCQkJCWNtZC0+Y21uZFszXTsKKwkJCWNwLT50d2Vha191cHBlciA9IDA7CisJCX0gZWxzZSB7CisJCQlmaXJzdF9ibG9jayA9CisJCQkJKCgodTY0KSBjbWQtPmNtbmRbMl0pIDw8IDgpIHwKKwkJCQkJY21kLT5jbW5kWzNdOworCQkJZmlyc3RfYmxvY2sgPSAoZmlyc3RfYmxvY2sgKiBtYXAtPnZvbHVtZV9ibGtfc2l6ZSkvNTEyOworCQkJY3AtPnR3ZWFrX2xvd2VyID0gKHUzMilmaXJzdF9ibG9jazsKKwkJCWNwLT50d2Vha191cHBlciA9ICh1MzIpKGZpcnN0X2Jsb2NrID4+IDMyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdSSVRFXzEwOgorCWNhc2UgUkVBRF8xMDoKKwkJaWYgKG1hcC0+dm9sdW1lX2Jsa19zaXplID09IDUxMikgeworCQkJY3AtPnR3ZWFrX2xvd2VyID0KKwkJCQkoKCh1MzIpIGNtZC0+Y21uZFsyXSkgPDwgMjQpIHwKKwkJCQkoKCh1MzIpIGNtZC0+Y21uZFszXSkgPDwgMTYpIHwKKwkJCQkoKCh1MzIpIGNtZC0+Y21uZFs0XSkgPDwgOCkgfAorCQkJCQljbWQtPmNtbmRbNV07CisJCQljcC0+dHdlYWtfdXBwZXIgPSAwOworCQl9IGVsc2UgeworCQkJZmlyc3RfYmxvY2sgPQorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzJdKSA8PCAyNCkgfAorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzNdKSA8PCAxNikgfAorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzRdKSA8PCA4KSB8CisJCQkJCWNtZC0+Y21uZFs1XTsKKwkJCWZpcnN0X2Jsb2NrID0gKGZpcnN0X2Jsb2NrICogbWFwLT52b2x1bWVfYmxrX3NpemUpLzUxMjsKKwkJCWNwLT50d2Vha19sb3dlciA9ICh1MzIpZmlyc3RfYmxvY2s7CisJCQljcC0+dHdlYWtfdXBwZXIgPSAodTMyKShmaXJzdF9ibG9jayA+PiAzMik7CisJCX0KKwkJYnJlYWs7CisJLyogUmVxdWlyZWQ/IDEyLWJ5dGUgY2RicyBlbGltaW5hdGVkIGJ5IGZpeHVwX2lvYWNjZWxfY2RiICovCisJY2FzZSBXUklURV8xMjoKKwljYXNlIFJFQURfMTI6CisJCWlmIChtYXAtPnZvbHVtZV9ibGtfc2l6ZSA9PSA1MTIpIHsKKwkJCWNwLT50d2Vha19sb3dlciA9CisJCQkJKCgodTMyKSBjbWQtPmNtbmRbMl0pIDw8IDI0KSB8CisJCQkJKCgodTMyKSBjbWQtPmNtbmRbM10pIDw8IDE2KSB8CisJCQkJKCgodTMyKSBjbWQtPmNtbmRbNF0pIDw8IDgpIHwKKwkJCQkJY21kLT5jbW5kWzVdOworCQkJY3AtPnR3ZWFrX3VwcGVyID0gMDsKKwkJfSBlbHNlIHsKKwkJCWZpcnN0X2Jsb2NrID0KKwkJCQkoKCh1NjQpIGNtZC0+Y21uZFsyXSkgPDwgMjQpIHwKKwkJCQkoKCh1NjQpIGNtZC0+Y21uZFszXSkgPDwgMTYpIHwKKwkJCQkoKCh1NjQpIGNtZC0+Y21uZFs0XSkgPDwgOCkgfAorCQkJCQljbWQtPmNtbmRbNV07CisJCQlmaXJzdF9ibG9jayA9IChmaXJzdF9ibG9jayAqIG1hcC0+dm9sdW1lX2Jsa19zaXplKS81MTI7CisJCQljcC0+dHdlYWtfbG93ZXIgPSAodTMyKWZpcnN0X2Jsb2NrOworCQkJY3AtPnR3ZWFrX3VwcGVyID0gKHUzMikoZmlyc3RfYmxvY2sgPj4gMzIpOworCQl9CisJCWJyZWFrOworCWNhc2UgV1JJVEVfMTY6CisJY2FzZSBSRUFEXzE2OgorCQlpZiAobWFwLT52b2x1bWVfYmxrX3NpemUgPT0gNTEyKSB7CisJCQljcC0+dHdlYWtfbG93ZXIgPQorCQkJCSgoKHUzMikgY21kLT5jbW5kWzZdKSA8PCAyNCkgfAorCQkJCSgoKHUzMikgY21kLT5jbW5kWzddKSA8PCAxNikgfAorCQkJCSgoKHUzMikgY21kLT5jbW5kWzhdKSA8PCA4KSB8CisJCQkJCWNtZC0+Y21uZFs5XTsKKwkJCWNwLT50d2Vha191cHBlciA9CisJCQkJKCgodTMyKSBjbWQtPmNtbmRbMl0pIDw8IDI0KSB8CisJCQkJKCgodTMyKSBjbWQtPmNtbmRbM10pIDw8IDE2KSB8CisJCQkJKCgodTMyKSBjbWQtPmNtbmRbNF0pIDw8IDgpIHwKKwkJCQkJY21kLT5jbW5kWzVdOworCQl9IGVsc2UgeworCQkJZmlyc3RfYmxvY2sgPQorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzJdKSA8PCA1NikgfAorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzNdKSA8PCA0OCkgfAorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzRdKSA8PCA0MCkgfAorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzVdKSA8PCAzMikgfAorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzZdKSA8PCAyNCkgfAorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzddKSA8PCAxNikgfAorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzhdKSA8PCA4KSB8CisJCQkJCWNtZC0+Y21uZFs5XTsKKwkJCWZpcnN0X2Jsb2NrID0gKGZpcnN0X2Jsb2NrICogbWFwLT52b2x1bWVfYmxrX3NpemUpLzUxMjsKKwkJCWNwLT50d2Vha19sb3dlciA9ICh1MzIpZmlyc3RfYmxvY2s7CisJCQljcC0+dHdlYWtfdXBwZXIgPSAodTMyKShmaXJzdF9ibG9jayA+PiAzMik7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmaC0+cGRldi0+ZGV2LAorCQkJIkVSUk9SOiAlczogSU9BQ0NFTCByZXF1ZXN0IENEQiBzaXplIG5vdCBzdXBwb3J0ZWQgZm9yIGVuY3J5cHRpb25cbiIsCisJCQlfX2Z1bmNfXyk7CisJCUJVRygpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaHBzYV9zY3NpX2lvYWNjZWwyX3F1ZXVlX2NvbW1hbmQoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMsIHUzMiBpb2FjY2VsX2hhbmRsZSwgdTggKmNkYiwgaW50IGNkYl9sZW4sCisJdTggKnNjc2kzYWRkcikKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBjLT5zY3NpX2NtZDsKKwlzdHJ1Y3QgaW9fYWNjZWwyX2NtZCAqY3AgPSAmaC0+aW9hY2NlbDJfY21kX3Bvb2xbYy0+Y21kaW5kZXhdOworCXN0cnVjdCBpb2FjY2VsMl9zZ19lbGVtZW50ICpjdXJyX3NnOworCWludCB1c2Vfc2csIGk7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl1NjQgYWRkcjY0OworCXUzMiBsZW47CisJdTMyIHRvdGFsX2xlbiA9IDA7CisKKwlpZiAoc2NzaV9zZ19jb3VudChjbWQpID4gaC0+aW9hY2NlbF9tYXhzZykKKwkJcmV0dXJuIElPX0FDQ0VMX0lORUxJR0lCTEU7CisKKwlpZiAoZml4dXBfaW9hY2NlbF9jZGIoY2RiLCAmY2RiX2xlbikpCisJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOworCWMtPmNtZF90eXBlID0gQ01EX0lPQUNDRUwyOworCS8qIEFkanVzdCB0aGUgRE1BIGFkZHJlc3MgdG8gcG9pbnQgdG8gdGhlIGFjY2VsZXJhdGVkIGNvbW1hbmQgYnVmZmVyICovCisJYy0+YnVzYWRkciA9ICh1MzIpIGgtPmlvYWNjZWwyX2NtZF9wb29sX2RoYW5kbGUgKworCQkJCShjLT5jbWRpbmRleCAqIHNpemVvZigqY3ApKTsKKwlCVUdfT04oYy0+YnVzYWRkciAmIDB4MDAwMDAwN0YpOworCisJbWVtc2V0KGNwLCAwLCBzaXplb2YoKmNwKSk7CisJY3AtPklVX3R5cGUgPSBJT0FDQ0VMMl9JVV9UWVBFOworCisJdXNlX3NnID0gc2NzaV9kbWFfbWFwKGNtZCk7CisJaWYgKHVzZV9zZyA8IDApCisJCXJldHVybiB1c2Vfc2c7CisKKwlpZiAodXNlX3NnKSB7CisJCUJVR19PTih1c2Vfc2cgPiBJT0FDQ0VMMl9NQVhTR0VOVFJJRVMpOworCQljdXJyX3NnID0gY3AtPnNnOworCQlzY3NpX2Zvcl9lYWNoX3NnKGNtZCwgc2csIHVzZV9zZywgaSkgeworCQkJYWRkcjY0ID0gKHU2NCkgc2dfZG1hX2FkZHJlc3Moc2cpOworCQkJbGVuICA9IHNnX2RtYV9sZW4oc2cpOworCQkJdG90YWxfbGVuICs9IGxlbjsKKwkJCWN1cnJfc2ctPmFkZHJlc3MgPSBjcHVfdG9fbGU2NChhZGRyNjQpOworCQkJY3Vycl9zZy0+bGVuZ3RoID0gY3B1X3RvX2xlMzIobGVuKTsKKwkJCWN1cnJfc2ctPnJlc2VydmVkWzBdID0gMDsKKwkJCWN1cnJfc2ctPnJlc2VydmVkWzFdID0gMDsKKwkJCWN1cnJfc2ctPnJlc2VydmVkWzJdID0gMDsKKwkJCWN1cnJfc2ctPmNoYWluX2luZGljYXRvciA9IDA7CisJCQljdXJyX3NnKys7CisJCX0KKworCQlzd2l0Y2ggKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pIHsKKwkJY2FzZSBETUFfVE9fREVWSUNFOgorCQkJY3AtPmRpcmVjdGlvbiAmPSB+SU9BQ0NFTDJfRElSRUNUSU9OX01BU0s7CisJCQljcC0+ZGlyZWN0aW9uIHw9IElPQUNDRUwyX0RJUl9EQVRBX09VVDsKKwkJCWJyZWFrOworCQljYXNlIERNQV9GUk9NX0RFVklDRToKKwkJCWNwLT5kaXJlY3Rpb24gJj0gfklPQUNDRUwyX0RJUkVDVElPTl9NQVNLOworCQkJY3AtPmRpcmVjdGlvbiB8PSBJT0FDQ0VMMl9ESVJfREFUQV9JTjsKKwkJCWJyZWFrOworCQljYXNlIERNQV9OT05FOgorCQkJY3AtPmRpcmVjdGlvbiAmPSB+SU9BQ0NFTDJfRElSRUNUSU9OX01BU0s7CisJCQljcC0+ZGlyZWN0aW9uIHw9IElPQUNDRUwyX0RJUl9OT19EQVRBOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKCZoLT5wZGV2LT5kZXYsICJ1bmtub3duIGRhdGEgZGlyZWN0aW9uOiAlZFxuIiwKKwkJCQljbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJCUJVRygpOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQljcC0+ZGlyZWN0aW9uICY9IH5JT0FDQ0VMMl9ESVJFQ1RJT05fTUFTSzsKKwkJY3AtPmRpcmVjdGlvbiB8PSBJT0FDQ0VMMl9ESVJfTk9fREFUQTsKKwl9CisKKwkvKiBTZXQgZW5jcnlwdGlvbiBwYXJhbWV0ZXJzLCBpZiBuZWNlc3NhcnkgKi8KKwlzZXRfZW5jcnlwdF9pb2FjY2VsMihoLCBjLCBjcCk7CisKKwljcC0+c2NzaV9uZXh1cyA9IGlvYWNjZWxfaGFuZGxlOworCWNwLT5UYWcgPSAoYy0+Y21kaW5kZXggPDwgRElSRUNUX0xPT0tVUF9TSElGVCkgfAorCQkJCURJUkVDVF9MT09LVVBfQklUOworCW1lbWNweShjcC0+Y2RiLCBjZGIsIHNpemVvZihjcC0+Y2RiKSk7CisKKwkvKiBmaWxsIGluIHNnIGVsZW1lbnRzICovCisJY3AtPnNnX2NvdW50ID0gKHU4KSB1c2Vfc2c7CisKKwljcC0+ZGF0YV9sZW4gPSBjcHVfdG9fbGUzMih0b3RhbF9sZW4pOworCWNwLT5lcnJfcHRyID0gY3B1X3RvX2xlNjQoYy0+YnVzYWRkciArCisJCQlvZmZzZXRvZihzdHJ1Y3QgaW9fYWNjZWwyX2NtZCwgZXJyb3JfZGF0YSkpOworCWNwLT5lcnJfbGVuID0gY3B1X3RvX2xlMzIoKHUzMikgc2l6ZW9mKGNwLT5lcnJvcl9kYXRhKSk7CisKKwllbnF1ZXVlX2NtZF9hbmRfc3RhcnRfaW8oaCwgYyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBRdWV1ZSBhIGNvbW1hbmQgdG8gdGhlIGNvcnJlY3QgSS9PIGFjY2VsZXJhdG9yIHBhdGguCisgKi8KK3N0YXRpYyBpbnQgaHBzYV9zY3NpX2lvYWNjZWxfcXVldWVfY29tbWFuZChzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCXN0cnVjdCBDb21tYW5kTGlzdCAqYywgdTMyIGlvYWNjZWxfaGFuZGxlLCB1OCAqY2RiLCBpbnQgY2RiX2xlbiwKKwl1OCAqc2NzaTNhZGRyKQoreworCWlmIChoLT50cmFuc01ldGhvZCAmIENGR1RCTF9UcmFuc19pb19hY2NlbDEpCisJCXJldHVybiBocHNhX3Njc2lfaW9hY2NlbDFfcXVldWVfY29tbWFuZChoLCBjLCBpb2FjY2VsX2hhbmRsZSwKKwkJCQkJCWNkYiwgY2RiX2xlbiwgc2NzaTNhZGRyKTsKKwllbHNlCisJCXJldHVybiBocHNhX3Njc2lfaW9hY2NlbDJfcXVldWVfY29tbWFuZChoLCBjLCBpb2FjY2VsX2hhbmRsZSwKKwkJCQkJCWNkYiwgY2RiX2xlbiwgc2NzaTNhZGRyKTsKK30KKworc3RhdGljIHZvaWQgcmFpZF9tYXBfaGVscGVyKHN0cnVjdCByYWlkX21hcF9kYXRhICptYXAsCisJCWludCBvZmZsb2FkX3RvX21pcnJvciwgdTMyICptYXBfaW5kZXgsIHUzMiAqY3VycmVudF9ncm91cCkKK3sKKwlpZiAob2ZmbG9hZF90b19taXJyb3IgPT0gMCkgIHsKKwkJLyogdXNlIHBoeXNpY2FsIGRpc2sgaW4gdGhlIGZpcnN0IG1pcnJvcmVkIGdyb3VwLiAqLworCQkqbWFwX2luZGV4ICU9IG1hcC0+ZGF0YV9kaXNrc19wZXJfcm93OworCQlyZXR1cm47CisJfQorCWRvIHsKKwkJLyogZGV0ZXJtaW5lIG1pcnJvciBncm91cCB0aGF0ICptYXBfaW5kZXggaW5kaWNhdGVzICovCisJCSpjdXJyZW50X2dyb3VwID0gKm1hcF9pbmRleCAvIG1hcC0+ZGF0YV9kaXNrc19wZXJfcm93OworCQlpZiAob2ZmbG9hZF90b19taXJyb3IgPT0gKmN1cnJlbnRfZ3JvdXApCisJCQljb250aW51ZTsKKwkJaWYgKCpjdXJyZW50X2dyb3VwIDwgKG1hcC0+bGF5b3V0X21hcF9jb3VudCAtIDEpKSB7CisJCQkvKiBzZWxlY3QgbWFwIGluZGV4IGZyb20gbmV4dCBncm91cCAqLworCQkJKm1hcF9pbmRleCArPSBtYXAtPmRhdGFfZGlza3NfcGVyX3JvdzsKKwkJCSgqY3VycmVudF9ncm91cCkrKzsKKwkJfSBlbHNlIHsKKwkJCS8qIHNlbGVjdCBtYXAgaW5kZXggZnJvbSBmaXJzdCBncm91cCAqLworCQkJKm1hcF9pbmRleCAlPSBtYXAtPmRhdGFfZGlza3NfcGVyX3JvdzsKKwkJCSpjdXJyZW50X2dyb3VwID0gMDsKKwkJfQorCX0gd2hpbGUgKG9mZmxvYWRfdG9fbWlycm9yICE9ICpjdXJyZW50X2dyb3VwKTsKK30KKworLyoKKyAqIEF0dGVtcHQgdG8gcGVyZm9ybSBvZmZsb2FkIFJBSUQgbWFwcGluZyBmb3IgYSBsb2dpY2FsIHZvbHVtZSBJL08uCisgKi8KK3N0YXRpYyBpbnQgaHBzYV9zY3NpX2lvYWNjZWxfcmFpZF9tYXAoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gYy0+c2NzaV9jbWQ7CisJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqZGV2ID0gY21kLT5kZXZpY2UtPmhvc3RkYXRhOworCXN0cnVjdCByYWlkX21hcF9kYXRhICptYXAgPSAmZGV2LT5yYWlkX21hcDsKKwlzdHJ1Y3QgcmFpZF9tYXBfZGlza19kYXRhICpkZCA9ICZtYXAtPmRhdGFbMF07CisJaW50IGlzX3dyaXRlID0gMDsKKwl1MzIgbWFwX2luZGV4OworCXU2NCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jazsKKwl1MzIgYmxvY2tfY250OworCXUzMiBibG9ja3NfcGVyX3JvdzsKKwl1NjQgZmlyc3Rfcm93LCBsYXN0X3JvdzsKKwl1MzIgZmlyc3Rfcm93X29mZnNldCwgbGFzdF9yb3dfb2Zmc2V0OworCXUzMiBmaXJzdF9jb2x1bW4sIGxhc3RfY29sdW1uOworCXU2NCByMF9maXJzdF9yb3csIHIwX2xhc3Rfcm93OworCXUzMiByNW9yNl9ibG9ja3NfcGVyX3JvdzsKKwl1NjQgcjVvcjZfZmlyc3Rfcm93LCByNW9yNl9sYXN0X3JvdzsKKwl1MzIgcjVvcjZfZmlyc3Rfcm93X29mZnNldCwgcjVvcjZfbGFzdF9yb3dfb2Zmc2V0OworCXUzMiByNW9yNl9maXJzdF9jb2x1bW4sIHI1b3I2X2xhc3RfY29sdW1uOworCXUzMiB0b3RhbF9kaXNrc19wZXJfcm93OworCXUzMiBzdHJpcGVzaXplOworCXUzMiBmaXJzdF9ncm91cCwgbGFzdF9ncm91cCwgY3VycmVudF9ncm91cDsKKwl1MzIgbWFwX3JvdzsKKwl1MzIgZGlza19oYW5kbGU7CisJdTY0IGRpc2tfYmxvY2s7CisJdTMyIGRpc2tfYmxvY2tfY250OworCXU4IGNkYlsxNl07CisJdTggY2RiX2xlbjsKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJdTY0IHRtcGRpdjsKKyNlbmRpZgorCWludCBvZmZsb2FkX3RvX21pcnJvcjsKKworCUJVR19PTighKGRldi0+b2ZmbG9hZF9jb25maWcgJiYgZGV2LT5vZmZsb2FkX2VuYWJsZWQpKTsKKworCS8qIGNoZWNrIGZvciB2YWxpZCBvcGNvZGUsIGdldCBMQkEgYW5kIGJsb2NrIGNvdW50ICovCisJc3dpdGNoIChjbWQtPmNtbmRbMF0pIHsKKwljYXNlIFdSSVRFXzY6CisJCWlzX3dyaXRlID0gMTsKKwljYXNlIFJFQURfNjoKKwkJZmlyc3RfYmxvY2sgPQorCQkJKCgodTY0KSBjbWQtPmNtbmRbMl0pIDw8IDgpIHwKKwkJCWNtZC0+Y21uZFszXTsKKwkJYmxvY2tfY250ID0gY21kLT5jbW5kWzRdOworCQlicmVhazsKKwljYXNlIFdSSVRFXzEwOgorCQlpc193cml0ZSA9IDE7CisJY2FzZSBSRUFEXzEwOgorCQlmaXJzdF9ibG9jayA9CisJCQkoKCh1NjQpIGNtZC0+Y21uZFsyXSkgPDwgMjQpIHwKKwkJCSgoKHU2NCkgY21kLT5jbW5kWzNdKSA8PCAxNikgfAorCQkJKCgodTY0KSBjbWQtPmNtbmRbNF0pIDw8IDgpIHwKKwkJCWNtZC0+Y21uZFs1XTsKKwkJYmxvY2tfY250ID0KKwkJCSgoKHUzMikgY21kLT5jbW5kWzddKSA8PCA4KSB8CisJCQljbWQtPmNtbmRbOF07CisJCWJyZWFrOworCWNhc2UgV1JJVEVfMTI6CisJCWlzX3dyaXRlID0gMTsKKwljYXNlIFJFQURfMTI6CisJCWZpcnN0X2Jsb2NrID0KKwkJCSgoKHU2NCkgY21kLT5jbW5kWzJdKSA8PCAyNCkgfAorCQkJKCgodTY0KSBjbWQtPmNtbmRbM10pIDw8IDE2KSB8CisJCQkoKCh1NjQpIGNtZC0+Y21uZFs0XSkgPDwgOCkgfAorCQkJY21kLT5jbW5kWzVdOworCQlibG9ja19jbnQgPQorCQkJKCgodTMyKSBjbWQtPmNtbmRbNl0pIDw8IDI0KSB8CisJCQkoKCh1MzIpIGNtZC0+Y21uZFs3XSkgPDwgMTYpIHwKKwkJCSgoKHUzMikgY21kLT5jbW5kWzhdKSA8PCA4KSB8CisJCWNtZC0+Y21uZFs5XTsKKwkJYnJlYWs7CisJY2FzZSBXUklURV8xNjoKKwkJaXNfd3JpdGUgPSAxOworCWNhc2UgUkVBRF8xNjoKKwkJZmlyc3RfYmxvY2sgPQorCQkJKCgodTY0KSBjbWQtPmNtbmRbMl0pIDw8IDU2KSB8CisJCQkoKCh1NjQpIGNtZC0+Y21uZFszXSkgPDwgNDgpIHwKKwkJCSgoKHU2NCkgY21kLT5jbW5kWzRdKSA8PCA0MCkgfAorCQkJKCgodTY0KSBjbWQtPmNtbmRbNV0pIDw8IDMyKSB8CisJCQkoKCh1NjQpIGNtZC0+Y21uZFs2XSkgPDwgMjQpIHwKKwkJCSgoKHU2NCkgY21kLT5jbW5kWzddKSA8PCAxNikgfAorCQkJKCgodTY0KSBjbWQtPmNtbmRbOF0pIDw8IDgpIHwKKwkJCWNtZC0+Y21uZFs5XTsKKwkJYmxvY2tfY250ID0KKwkJCSgoKHUzMikgY21kLT5jbW5kWzEwXSkgPDwgMjQpIHwKKwkJCSgoKHUzMikgY21kLT5jbW5kWzExXSkgPDwgMTYpIHwKKwkJCSgoKHUzMikgY21kLT5jbW5kWzEyXSkgPDwgOCkgfAorCQkJY21kLT5jbW5kWzEzXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIElPX0FDQ0VMX0lORUxJR0lCTEU7IC8qIHByb2Nlc3MgdmlhIG5vcm1hbCBJL08gcGF0aCAqLworCX0KKwlCVUdfT04oYmxvY2tfY250ID09IDApOworCWxhc3RfYmxvY2sgPSBmaXJzdF9ibG9jayArIGJsb2NrX2NudCAtIDE7CisKKwkvKiBjaGVjayBmb3Igd3JpdGUgdG8gbm9uLVJBSUQtMCAqLworCWlmIChpc193cml0ZSAmJiBkZXYtPnJhaWRfbGV2ZWwgIT0gMCkKKwkJcmV0dXJuIElPX0FDQ0VMX0lORUxJR0lCTEU7CisKKwkvKiBjaGVjayBmb3IgaW52YWxpZCBibG9jayBvciB3cmFwYXJvdW5kICovCisJaWYgKGxhc3RfYmxvY2sgPj0gbWFwLT52b2x1bWVfYmxrX2NudCB8fCBsYXN0X2Jsb2NrIDwgZmlyc3RfYmxvY2spCisJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOworCisJLyogY2FsY3VsYXRlIHN0cmlwZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlcXVlc3QgKi8KKwlibG9ja3NfcGVyX3JvdyA9IG1hcC0+ZGF0YV9kaXNrc19wZXJfcm93ICogbWFwLT5zdHJpcF9zaXplOworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKwl0bXBkaXYgPSBmaXJzdF9ibG9jazsKKwkodm9pZCkgZG9fZGl2KHRtcGRpdiwgYmxvY2tzX3Blcl9yb3cpOworCWZpcnN0X3JvdyA9IHRtcGRpdjsKKwl0bXBkaXYgPSBsYXN0X2Jsb2NrOworCSh2b2lkKSBkb19kaXYodG1wZGl2LCBibG9ja3NfcGVyX3Jvdyk7CisJbGFzdF9yb3cgPSB0bXBkaXY7CisJZmlyc3Rfcm93X29mZnNldCA9ICh1MzIpIChmaXJzdF9ibG9jayAtIChmaXJzdF9yb3cgKiBibG9ja3NfcGVyX3JvdykpOworCWxhc3Rfcm93X29mZnNldCA9ICh1MzIpIChsYXN0X2Jsb2NrIC0gKGxhc3Rfcm93ICogYmxvY2tzX3Blcl9yb3cpKTsKKwl0bXBkaXYgPSBmaXJzdF9yb3dfb2Zmc2V0OworCSh2b2lkKSBkb19kaXYodG1wZGl2LCAgbWFwLT5zdHJpcF9zaXplKTsKKwlmaXJzdF9jb2x1bW4gPSB0bXBkaXY7CisJdG1wZGl2ID0gbGFzdF9yb3dfb2Zmc2V0OworCSh2b2lkKSBkb19kaXYodG1wZGl2LCBtYXAtPnN0cmlwX3NpemUpOworCWxhc3RfY29sdW1uID0gdG1wZGl2OworI2Vsc2UKKwlmaXJzdF9yb3cgPSBmaXJzdF9ibG9jayAvIGJsb2Nrc19wZXJfcm93OworCWxhc3Rfcm93ID0gbGFzdF9ibG9jayAvIGJsb2Nrc19wZXJfcm93OworCWZpcnN0X3Jvd19vZmZzZXQgPSAodTMyKSAoZmlyc3RfYmxvY2sgLSAoZmlyc3Rfcm93ICogYmxvY2tzX3Blcl9yb3cpKTsKKwlsYXN0X3Jvd19vZmZzZXQgPSAodTMyKSAobGFzdF9ibG9jayAtIChsYXN0X3JvdyAqIGJsb2Nrc19wZXJfcm93KSk7CisJZmlyc3RfY29sdW1uID0gZmlyc3Rfcm93X29mZnNldCAvIG1hcC0+c3RyaXBfc2l6ZTsKKwlsYXN0X2NvbHVtbiA9IGxhc3Rfcm93X29mZnNldCAvIG1hcC0+c3RyaXBfc2l6ZTsKKyNlbmRpZgorCisJLyogaWYgdGhpcyBpc24ndCBhIHNpbmdsZSByb3cvY29sdW1uIHRoZW4gZ2l2ZSB0byB0aGUgY29udHJvbGxlciAqLworCWlmICgoZmlyc3Rfcm93ICE9IGxhc3Rfcm93KSB8fCAoZmlyc3RfY29sdW1uICE9IGxhc3RfY29sdW1uKSkKKwkJcmV0dXJuIElPX0FDQ0VMX0lORUxJR0lCTEU7CisKKwkvKiBwcm9jZWVkaW5nIHdpdGggZHJpdmVyIG1hcHBpbmcgKi8KKwl0b3RhbF9kaXNrc19wZXJfcm93ID0gbWFwLT5kYXRhX2Rpc2tzX3Blcl9yb3cgKworCQkJCW1hcC0+bWV0YWRhdGFfZGlza3NfcGVyX3JvdzsKKwltYXBfcm93ID0gKCh1MzIpKGZpcnN0X3JvdyA+PiBtYXAtPnBhcml0eV9yb3RhdGlvbl9zaGlmdCkpICUKKwkJCQltYXAtPnJvd19jbnQ7CisJbWFwX2luZGV4ID0gKG1hcF9yb3cgKiB0b3RhbF9kaXNrc19wZXJfcm93KSArIGZpcnN0X2NvbHVtbjsKKworCXN3aXRjaCAoZGV2LT5yYWlkX2xldmVsKSB7CisJY2FzZSBIUFNBX1JBSURfMDoKKwkJYnJlYWs7IC8qIG5vdGhpbmcgc3BlY2lhbCB0byBkbyAqLworCWNhc2UgSFBTQV9SQUlEXzE6CisJCS8qIEhhbmRsZXMgbG9hZCBiYWxhbmNlIGFjcm9zcyBSQUlEIDEgbWVtYmVycy4KKwkJICogKDItZHJpdmUgUjEgYW5kIFIxMCB3aXRoIGV2ZW4gIyBvZiBkcml2ZXMuKQorCQkgKiBBcHByb3ByaWF0ZSBmb3IgU1NEcywgbm90IG9wdGltYWwgZm9yIEhERHMKKwkJICovCisJCUJVR19PTihtYXAtPmxheW91dF9tYXBfY291bnQgIT0gMik7CisJCWlmIChkZXYtPm9mZmxvYWRfdG9fbWlycm9yKQorCQkJbWFwX2luZGV4ICs9IG1hcC0+ZGF0YV9kaXNrc19wZXJfcm93OworCQlkZXYtPm9mZmxvYWRfdG9fbWlycm9yID0gIWRldi0+b2ZmbG9hZF90b19taXJyb3I7CisJCWJyZWFrOworCWNhc2UgSFBTQV9SQUlEX0FETToKKwkJLyogSGFuZGxlcyBOLXdheSBtaXJyb3JzICAoUjEtQURNKQorCQkgKiBhbmQgUjEwIHdpdGggIyBvZiBkcml2ZXMgZGl2aXNpYmxlIGJ5IDMuKQorCQkgKi8KKwkJQlVHX09OKG1hcC0+bGF5b3V0X21hcF9jb3VudCAhPSAzKTsKKworCQlvZmZsb2FkX3RvX21pcnJvciA9IGRldi0+b2ZmbG9hZF90b19taXJyb3I7CisJCXJhaWRfbWFwX2hlbHBlcihtYXAsIG9mZmxvYWRfdG9fbWlycm9yLAorCQkJCSZtYXBfaW5kZXgsICZjdXJyZW50X2dyb3VwKTsKKwkJLyogc2V0IG1pcnJvciBncm91cCB0byB1c2UgbmV4dCB0aW1lICovCisJCW9mZmxvYWRfdG9fbWlycm9yID0KKwkJCShvZmZsb2FkX3RvX21pcnJvciA+PSBtYXAtPmxheW91dF9tYXBfY291bnQgLSAxKQorCQkJPyAwIDogb2ZmbG9hZF90b19taXJyb3IgKyAxOworCQkvKiBGSVhNRTogcmVtb3ZlIGFmdGVyIGRlYnVnL2RldiAqLworCQlCVUdfT04ob2ZmbG9hZF90b19taXJyb3IgPj0gbWFwLT5sYXlvdXRfbWFwX2NvdW50KTsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCSJERUJVRzogVXNpbmcgcGh5c2ljYWwgZGlzayBtYXAgaW5kZXggJWQgZnJvbSBtaXJyb3IgZ3JvdXAgJWRcbiIsCisJCQltYXBfaW5kZXgsIG9mZmxvYWRfdG9fbWlycm9yKTsKKwkJZGV2LT5vZmZsb2FkX3RvX21pcnJvciA9IG9mZmxvYWRfdG9fbWlycm9yOworCQkvKiBBdm9pZCBkaXJlY3QgdXNlIG9mIGRldi0+b2ZmbG9hZF90b19taXJyb3Igd2l0aGluIHRoaXMKKwkJICogZnVuY3Rpb24gc2luY2UgbXVsdGlwbGUgdGhyZWFkcyBtaWdodCBzaW11bHRhbmVvdXNseQorCQkgKiBpbmNyZW1lbnQgaXQgYmV5b25kIHRoZSByYW5nZSBvZiBkZXYtPmxheW91dF9tYXBfY291bnQgLTEuCisJCSAqLworCQlicmVhazsKKwljYXNlIEhQU0FfUkFJRF81OgorCWNhc2UgSFBTQV9SQUlEXzY6CisJCWlmIChtYXAtPmxheW91dF9tYXBfY291bnQgPD0gMSkKKwkJCWJyZWFrOworCisJCS8qIFZlcmlmeSBmaXJzdCBhbmQgbGFzdCBibG9jayBhcmUgaW4gc2FtZSBSQUlEIGdyb3VwICovCisJCXI1b3I2X2Jsb2Nrc19wZXJfcm93ID0KKwkJCW1hcC0+c3RyaXBfc2l6ZSAqIG1hcC0+ZGF0YV9kaXNrc19wZXJfcm93OworCQlCVUdfT04ocjVvcjZfYmxvY2tzX3Blcl9yb3cgPT0gMCk7CisJCXN0cmlwZXNpemUgPSByNW9yNl9ibG9ja3NfcGVyX3JvdyAqIG1hcC0+bGF5b3V0X21hcF9jb3VudDsKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJCXRtcGRpdiA9IGZpcnN0X2Jsb2NrOworCQlmaXJzdF9ncm91cCA9IGRvX2Rpdih0bXBkaXYsIHN0cmlwZXNpemUpOworCQl0bXBkaXYgPSBmaXJzdF9ncm91cDsKKwkJKHZvaWQpIGRvX2Rpdih0bXBkaXYsIHI1b3I2X2Jsb2Nrc19wZXJfcm93KTsKKwkJZmlyc3RfZ3JvdXAgPSB0bXBkaXY7CisJCXRtcGRpdiA9IGxhc3RfYmxvY2s7CisJCWxhc3RfZ3JvdXAgPSBkb19kaXYodG1wZGl2LCBzdHJpcGVzaXplKTsKKwkJdG1wZGl2ID0gbGFzdF9ncm91cDsKKwkJKHZvaWQpIGRvX2Rpdih0bXBkaXYsIHI1b3I2X2Jsb2Nrc19wZXJfcm93KTsKKwkJbGFzdF9ncm91cCA9IHRtcGRpdjsKKyNlbHNlCisJCWZpcnN0X2dyb3VwID0gKGZpcnN0X2Jsb2NrICUgc3RyaXBlc2l6ZSkgLyByNW9yNl9ibG9ja3NfcGVyX3JvdzsKKwkJbGFzdF9ncm91cCA9IChsYXN0X2Jsb2NrICUgc3RyaXBlc2l6ZSkgLyByNW9yNl9ibG9ja3NfcGVyX3JvdzsKKyNlbmRpZgorCQlpZiAoZmlyc3RfZ3JvdXAgIT0gbGFzdF9ncm91cCkKKwkJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOworCisJCS8qIFZlcmlmeSByZXF1ZXN0IGlzIGluIGEgc2luZ2xlIHJvdyBvZiBSQUlEIDUvNiAqLworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKwkJdG1wZGl2ID0gZmlyc3RfYmxvY2s7CisJCSh2b2lkKSBkb19kaXYodG1wZGl2LCBzdHJpcGVzaXplKTsKKwkJZmlyc3Rfcm93ID0gcjVvcjZfZmlyc3Rfcm93ID0gcjBfZmlyc3Rfcm93ID0gdG1wZGl2OworCQl0bXBkaXYgPSBsYXN0X2Jsb2NrOworCQkodm9pZCkgZG9fZGl2KHRtcGRpdiwgc3RyaXBlc2l6ZSk7CisJCXI1b3I2X2xhc3Rfcm93ID0gcjBfbGFzdF9yb3cgPSB0bXBkaXY7CisjZWxzZQorCQlmaXJzdF9yb3cgPSByNW9yNl9maXJzdF9yb3cgPSByMF9maXJzdF9yb3cgPQorCQkJCQkJZmlyc3RfYmxvY2sgLyBzdHJpcGVzaXplOworCQlyNW9yNl9sYXN0X3JvdyA9IHIwX2xhc3Rfcm93ID0gbGFzdF9ibG9jayAvIHN0cmlwZXNpemU7CisjZW5kaWYKKwkJaWYgKHI1b3I2X2ZpcnN0X3JvdyAhPSByNW9yNl9sYXN0X3JvdykKKwkJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOworCisKKwkJLyogVmVyaWZ5IHJlcXVlc3QgaXMgaW4gYSBzaW5nbGUgY29sdW1uICovCisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCQl0bXBkaXYgPSBmaXJzdF9ibG9jazsKKwkJZmlyc3Rfcm93X29mZnNldCA9IGRvX2Rpdih0bXBkaXYsIHN0cmlwZXNpemUpOworCQl0bXBkaXYgPSBmaXJzdF9yb3dfb2Zmc2V0OworCQlmaXJzdF9yb3dfb2Zmc2V0ID0gKHUzMikgZG9fZGl2KHRtcGRpdiwgcjVvcjZfYmxvY2tzX3Blcl9yb3cpOworCQlyNW9yNl9maXJzdF9yb3dfb2Zmc2V0ID0gZmlyc3Rfcm93X29mZnNldDsKKwkJdG1wZGl2ID0gbGFzdF9ibG9jazsKKwkJcjVvcjZfbGFzdF9yb3dfb2Zmc2V0ID0gZG9fZGl2KHRtcGRpdiwgc3RyaXBlc2l6ZSk7CisJCXRtcGRpdiA9IHI1b3I2X2xhc3Rfcm93X29mZnNldDsKKwkJcjVvcjZfbGFzdF9yb3dfb2Zmc2V0ID0gZG9fZGl2KHRtcGRpdiwgcjVvcjZfYmxvY2tzX3Blcl9yb3cpOworCQl0bXBkaXYgPSByNW9yNl9maXJzdF9yb3dfb2Zmc2V0OworCQkodm9pZCkgZG9fZGl2KHRtcGRpdiwgbWFwLT5zdHJpcF9zaXplKTsKKwkJZmlyc3RfY29sdW1uID0gcjVvcjZfZmlyc3RfY29sdW1uID0gdG1wZGl2OworCQl0bXBkaXYgPSByNW9yNl9sYXN0X3Jvd19vZmZzZXQ7CisJCSh2b2lkKSBkb19kaXYodG1wZGl2LCBtYXAtPnN0cmlwX3NpemUpOworCQlyNW9yNl9sYXN0X2NvbHVtbiA9IHRtcGRpdjsKKyNlbHNlCisJCWZpcnN0X3Jvd19vZmZzZXQgPSByNW9yNl9maXJzdF9yb3dfb2Zmc2V0ID0KKwkJCSh1MzIpKChmaXJzdF9ibG9jayAlIHN0cmlwZXNpemUpICUKKwkJCQkJCXI1b3I2X2Jsb2Nrc19wZXJfcm93KTsKKworCQlyNW9yNl9sYXN0X3Jvd19vZmZzZXQgPQorCQkJKHUzMikoKGxhc3RfYmxvY2sgJSBzdHJpcGVzaXplKSAlCisJCQkJCQlyNW9yNl9ibG9ja3NfcGVyX3Jvdyk7CisKKwkJZmlyc3RfY29sdW1uID0gcjVvcjZfZmlyc3RfY29sdW1uID0KKwkJCXI1b3I2X2ZpcnN0X3Jvd19vZmZzZXQgLyBtYXAtPnN0cmlwX3NpemU7CisJCXI1b3I2X2xhc3RfY29sdW1uID0KKwkJCXI1b3I2X2xhc3Rfcm93X29mZnNldCAvIG1hcC0+c3RyaXBfc2l6ZTsKKyNlbmRpZgorCQlpZiAocjVvcjZfZmlyc3RfY29sdW1uICE9IHI1b3I2X2xhc3RfY29sdW1uKQorCQkJcmV0dXJuIElPX0FDQ0VMX0lORUxJR0lCTEU7CisKKwkJLyogUmVxdWVzdCBpcyBlbGlnaWJsZSAqLworCQltYXBfcm93ID0gKCh1MzIpKGZpcnN0X3JvdyA+PiBtYXAtPnBhcml0eV9yb3RhdGlvbl9zaGlmdCkpICUKKwkJCW1hcC0+cm93X2NudDsKKworCQltYXBfaW5kZXggPSAoZmlyc3RfZ3JvdXAgKgorCQkJKG1hcC0+cm93X2NudCAqIHRvdGFsX2Rpc2tzX3Blcl9yb3cpKSArCisJCQkobWFwX3JvdyAqIHRvdGFsX2Rpc2tzX3Blcl9yb3cpICsgZmlyc3RfY29sdW1uOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gSU9fQUNDRUxfSU5FTElHSUJMRTsKKwl9CisKKwlkaXNrX2hhbmRsZSA9IGRkW21hcF9pbmRleF0uaW9hY2NlbF9oYW5kbGU7CisJZGlza19ibG9jayA9IG1hcC0+ZGlza19zdGFydGluZ19ibGsgKyAoZmlyc3Rfcm93ICogbWFwLT5zdHJpcF9zaXplKSArCisJCQkoZmlyc3Rfcm93X29mZnNldCAtIChmaXJzdF9jb2x1bW4gKiBtYXAtPnN0cmlwX3NpemUpKTsKKwlkaXNrX2Jsb2NrX2NudCA9IGJsb2NrX2NudDsKKworCS8qIGhhbmRsZSBkaWZmZXJpbmcgbG9naWNhbC9waHlzaWNhbCBibG9jayBzaXplcyAqLworCWlmIChtYXAtPnBoeXNfYmxrX3NoaWZ0KSB7CisJCWRpc2tfYmxvY2sgPDw9IG1hcC0+cGh5c19ibGtfc2hpZnQ7CisJCWRpc2tfYmxvY2tfY250IDw8PSBtYXAtPnBoeXNfYmxrX3NoaWZ0OworCX0KKwlCVUdfT04oZGlza19ibG9ja19jbnQgPiAweGZmZmYpOworCisJLyogYnVpbGQgdGhlIG5ldyBDREIgZm9yIHRoZSBwaHlzaWNhbCBkaXNrIEkvTyAqLworCWlmIChkaXNrX2Jsb2NrID4gMHhmZmZmZmZmZikgeworCQljZGJbMF0gPSBpc193cml0ZSA/IFdSSVRFXzE2IDogUkVBRF8xNjsKKwkJY2RiWzFdID0gMDsKKwkJY2RiWzJdID0gKHU4KSAoZGlza19ibG9jayA+PiA1Nik7CisJCWNkYlszXSA9ICh1OCkgKGRpc2tfYmxvY2sgPj4gNDgpOworCQljZGJbNF0gPSAodTgpIChkaXNrX2Jsb2NrID4+IDQwKTsKKwkJY2RiWzVdID0gKHU4KSAoZGlza19ibG9jayA+PiAzMik7CisJCWNkYls2XSA9ICh1OCkgKGRpc2tfYmxvY2sgPj4gMjQpOworCQljZGJbN10gPSAodTgpIChkaXNrX2Jsb2NrID4+IDE2KTsKKwkJY2RiWzhdID0gKHU4KSAoZGlza19ibG9jayA+PiA4KTsKKwkJY2RiWzldID0gKHU4KSAoZGlza19ibG9jayk7CisJCWNkYlsxMF0gPSAodTgpIChkaXNrX2Jsb2NrX2NudCA+PiAyNCk7CisJCWNkYlsxMV0gPSAodTgpIChkaXNrX2Jsb2NrX2NudCA+PiAxNik7CisJCWNkYlsxMl0gPSAodTgpIChkaXNrX2Jsb2NrX2NudCA+PiA4KTsKKwkJY2RiWzEzXSA9ICh1OCkgKGRpc2tfYmxvY2tfY250KTsKKwkJY2RiWzE0XSA9IDA7CisJCWNkYlsxNV0gPSAwOworCQljZGJfbGVuID0gMTY7CisJfSBlbHNlIHsKKwkJY2RiWzBdID0gaXNfd3JpdGUgPyBXUklURV8xMCA6IFJFQURfMTA7CisJCWNkYlsxXSA9IDA7CisJCWNkYlsyXSA9ICh1OCkgKGRpc2tfYmxvY2sgPj4gMjQpOworCQljZGJbM10gPSAodTgpIChkaXNrX2Jsb2NrID4+IDE2KTsKKwkJY2RiWzRdID0gKHU4KSAoZGlza19ibG9jayA+PiA4KTsKKwkJY2RiWzVdID0gKHU4KSAoZGlza19ibG9jayk7CisJCWNkYls2XSA9IDA7CisJCWNkYls3XSA9ICh1OCkgKGRpc2tfYmxvY2tfY250ID4+IDgpOworCQljZGJbOF0gPSAodTgpIChkaXNrX2Jsb2NrX2NudCk7CisJCWNkYls5XSA9IDA7CisJCWNkYl9sZW4gPSAxMDsKKwl9CisJcmV0dXJuIGhwc2Ffc2NzaV9pb2FjY2VsX3F1ZXVlX2NvbW1hbmQoaCwgYywgZGlza19oYW5kbGUsIGNkYiwgY2RiX2xlbiwKKwkJCQkJCWRldi0+c2NzaTNhZGRyKTsKK30KIAogc3RhdGljIGludCBocHNhX3Njc2lfcXVldWVfY29tbWFuZF9sY2soc3RydWN0IHNjc2lfY21uZCAqY21kLAogCXZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQpAQCAtMjE2OSw2ICszOTUxLDcgQEAKIAl1bnNpZ25lZCBjaGFyIHNjc2kzYWRkcls4XTsKIAlzdHJ1Y3QgQ29tbWFuZExpc3QgKmM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAwOwogCiAJLyogR2V0IHRoZSBwdHIgdG8gb3VyIGFkYXB0ZXIgc3RydWN0dXJlIG91dCBvZiBjbWQtPmhvc3QuICovCiAJaCA9IHNkZXZfdG9faGJhKGNtZC0+ZGV2aWNlKTsKQEAgLTIyMDMsNiArMzk4NiwzMiBAQAogCiAJYy0+Y21kX3R5cGUgPSBDTURfU0NTSTsKIAljLT5zY3NpX2NtZCA9IGNtZDsKKworCS8qIENhbGwgYWx0ZXJuYXRlIHN1Ym1pdCByb3V0aW5lIGZvciBJL08gYWNjZWxlcmF0ZWQgY29tbWFuZHMuCisJICogUmV0cmllcyBhbHdheXMgZ28gZG93biB0aGUgbm9ybWFsIEkvTyBwYXRoLgorCSAqLworCWlmIChsaWtlbHkoY21kLT5yZXRyaWVzID09IDAgJiYKKwkJY21kLT5yZXF1ZXN0LT5jbWRfdHlwZSA9PSBSRVFfVFlQRV9GUyAmJgorCQloLT5hY2Npb3BhdGhfc3RhdHVzKSkgeworCQlpZiAoZGV2LT5vZmZsb2FkX2VuYWJsZWQpIHsKKwkJCXJjID0gaHBzYV9zY3NpX2lvYWNjZWxfcmFpZF9tYXAoaCwgYyk7CisJCQlpZiAocmMgPT0gMCkKKwkJCQlyZXR1cm4gMDsgLyogU2VudCBvbiBpb2FjY2VsIHBhdGggKi8KKwkJCWlmIChyYyA8IDApIHsgICAvKiBzY3NpX2RtYV9tYXAgZmFpbGVkLiAqLworCQkJCWNtZF9mcmVlKGgsIGMpOworCQkJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCQkJfQorCQl9IGVsc2UgaWYgKGRldi0+aW9hY2NlbF9oYW5kbGUpIHsKKwkJCXJjID0gaHBzYV9zY3NpX2lvYWNjZWxfZGlyZWN0X21hcChoLCBjKTsKKwkJCWlmIChyYyA9PSAwKQorCQkJCXJldHVybiAwOyAvKiBTZW50IG9uIGRpcmVjdCBtYXAgcGF0aCAqLworCQkJaWYgKHJjIDwgMCkgeyAgIC8qIHNjc2lfZG1hX21hcCBmYWlsZWQuICovCisJCQkJY21kX2ZyZWUoaCwgYyk7CisJCQkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisJCQl9CisJCX0KKwl9CisKIAljLT5IZWFkZXIuUmVwbHlRdWV1ZSA9IDA7ICAvKiB1bnVzZWQgaW4gc2ltcGxlIG1vZGUgKi8KIAltZW1jcHkoJmMtPkhlYWRlci5MVU4uTHVuQWRkckJ5dGVzWzBdLCAmc2NzaTNhZGRyWzBdLCA4KTsKIAljLT5IZWFkZXIuVGFnLmxvd2VyID0gKGMtPmNtZGluZGV4IDw8IERJUkVDVF9MT09LVVBfU0hJRlQpOwpAQCAtMjI2MiwxMSArNDA3MSwzOCBAQAogCiBzdGF0aWMgREVGX1NDU0lfUUNNRChocHNhX3Njc2lfcXVldWVfY29tbWFuZCkKIAorc3RhdGljIGludCBkb19ub3Rfc2Nhbl9pZl9jb250cm9sbGVyX2xvY2tlZF91cChzdHJ1Y3QgY3Rscl9pbmZvICpoKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIERvbid0IGxldCByZXNjYW5zIGJlIGluaXRpYXRlZCBvbiBhIGNvbnRyb2xsZXIga25vd24KKwkgKiB0byBiZSBsb2NrZWQgdXAuICBJZiB0aGUgY29udHJvbGxlciBsb2NrcyB1cCAqZHVyaW5nKgorCSAqIGEgcmVzY2FuLCB0aGF0IHRocmVhZCBpcyBwcm9iYWJseSBob3NlZCwgYnV0IGF0IGxlYXN0CisJICogd2UgY2FuIHByZXZlbnQgbmV3IHJlc2NhbiB0aHJlYWRzIGZyb20gcGlsaW5nIHVwIG9uIGEKKwkgKiBsb2NrZWQgdXAgY29udHJvbGxlci4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+bG9jaywgZmxhZ3MpOworCWlmICh1bmxpa2VseShoLT5sb2NrdXBfZGV0ZWN0ZWQpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPnNjYW5fbG9jaywgZmxhZ3MpOworCQloLT5zY2FuX2ZpbmlzaGVkID0gMTsKKwkJd2FrZV91cF9hbGwoJmgtPnNjYW5fd2FpdF9xdWV1ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPnNjYW5fbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBocHNhX3NjYW5fc3RhcnQoc3RydWN0IFNjc2lfSG9zdCAqc2gpCiB7CiAJc3RydWN0IGN0bHJfaW5mbyAqaCA9IHNob3N0X3RvX2hiYShzaCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWlmIChkb19ub3Rfc2Nhbl9pZl9jb250cm9sbGVyX2xvY2tlZF91cChoKSkKKwkJcmV0dXJuOworCiAJLyogd2FpdCB1bnRpbCBhbnkgc2NhbiBhbHJlYWR5IGluIHByb2dyZXNzIGlzIGZpbmlzaGVkLiAqLwogCXdoaWxlICgxKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5zY2FuX2xvY2ssIGZsYWdzKTsKQEAgLTIyODMsNiArNDExOSw5IEBACiAJaC0+c2Nhbl9maW5pc2hlZCA9IDA7IC8qIG1hcmsgc2NhbiBhcyBpbiBwcm9ncmVzcyAqLwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPnNjYW5fbG9jaywgZmxhZ3MpOwogCisJaWYgKGRvX25vdF9zY2FuX2lmX2NvbnRyb2xsZXJfbG9ja2VkX3VwKGgpKQorCQlyZXR1cm47CisKIAlocHNhX3VwZGF0ZV9zY3NpX2RldmljZXMoaCwgaC0+c2NzaV9ob3N0LT5ob3N0X25vKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5zY2FuX2xvY2ssIGZsYWdzKTsKQEAgLTIzNDYsNyArNDE4NSwxMCBAQAogCXNoLT5tYXhfbHVuID0gSFBTQV9NQVhfTFVOOwogCXNoLT5tYXhfaWQgPSBIUFNBX01BWF9MVU47CiAJc2gtPmNhbl9xdWV1ZSA9IGgtPm5yX2NtZHM7Ci0Jc2gtPmNtZF9wZXJfbHVuID0gaC0+bnJfY21kczsKKwlpZiAoaC0+aGJhX21vZGVfZW5hYmxlZCkKKwkJc2gtPmNtZF9wZXJfbHVuID0gNzsKKwllbHNlCisJCXNoLT5jbWRfcGVyX2x1biA9IGgtPm5yX2NtZHM7CiAJc2gtPnNnX3RhYmxlc2l6ZSA9IGgtPm1heHNnZW50cmllczsKIAloLT5zY3NpX2hvc3QgPSBzaDsKIAlzaC0+aG9zdGRhdGFbMF0gPSAodW5zaWduZWQgbG9uZykgaDsKQEAgLTIzNzIsNyArNDIxNCw3IEBACiBzdGF0aWMgaW50IHdhaXRfZm9yX2RldmljZV90b19iZWNvbWVfcmVhZHkoc3RydWN0IGN0bHJfaW5mbyAqaCwKIAl1bnNpZ25lZCBjaGFyIGx1bmFkZHJbXSkKIHsKLQlpbnQgcmMgPSAwOworCWludCByYzsKIAlpbnQgY291bnQgPSAwOwogCWludCB3YWl0dGltZSA9IDE7IC8qIHNlY29uZHMgKi8KIAlzdHJ1Y3QgQ29tbWFuZExpc3QgKmM7CkBAIC0yMzkyLDYgKzQyMzQsNyBAQAogCQkgKi8KIAkJbXNsZWVwKDEwMDAgKiB3YWl0dGltZSk7CiAJCWNvdW50Kys7CisJCXJjID0gMDsgLyogRGV2aWNlIHJlYWR5LiAqLwogCiAJCS8qIEluY3JlYXNlIHdhaXQgdGltZSB3aXRoIGVhY2ggdHJ5LCB1cCB0byBhIHBvaW50LiAqLwogCQlpZiAod2FpdHRpbWUgPCBIUFNBX01BWF9XQUlUX0lOVEVSVkFMX1NFQ1MpCkBAIC0yNDQ4LDcgKzQyOTEsNyBAQAogCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJyZXNldHRpbmcgZGV2aWNlICVkOiVkOiVkOiVkXG4iLAogCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sIGRldi0+YnVzLCBkZXYtPnRhcmdldCwgZGV2LT5sdW4pOwogCS8qIHNlbmQgYSByZXNldCB0byB0aGUgU0NTSSBMVU4gd2hpY2ggdGhlIGNvbW1hbmQgd2FzIHNlbnQgdG8gKi8KLQlyYyA9IGhwc2Ffc2VuZF9yZXNldChoLCBkZXYtPnNjc2kzYWRkcik7CisJcmMgPSBocHNhX3NlbmRfcmVzZXQoaCwgZGV2LT5zY3NpM2FkZHIsIEhQU0FfUkVTRVRfVFlQRV9MVU4pOwogCWlmIChyYyA9PSAwICYmIHdhaXRfZm9yX2RldmljZV90b19iZWNvbWVfcmVhZHkoaCwgZGV2LT5zY3NpM2FkZHIpID09IDApCiAJCXJldHVybiBTVUNDRVNTOwogCkBAIC0yNDcxLDEyICs0MzE0LDM2IEBACiAJdGFnWzddID0gb3JpZ2luYWxfdGFnWzRdOwogfQogCitzdGF0aWMgdm9pZCBocHNhX2dldF90YWcoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMsIHUzMiAqdGFnbG93ZXIsIHUzMiAqdGFndXBwZXIpCit7CisJaWYgKGMtPmNtZF90eXBlID09IENNRF9JT0FDQ0VMMSkgeworCQlzdHJ1Y3QgaW9fYWNjZWwxX2NtZCAqY20xID0gKHN0cnVjdCBpb19hY2NlbDFfY21kICopCisJCQkmaC0+aW9hY2NlbF9jbWRfcG9vbFtjLT5jbWRpbmRleF07CisJCSp0YWd1cHBlciA9IGNtMS0+VGFnLnVwcGVyOworCQkqdGFnbG93ZXIgPSBjbTEtPlRhZy5sb3dlcjsKKwkJcmV0dXJuOworCX0KKwlpZiAoYy0+Y21kX3R5cGUgPT0gQ01EX0lPQUNDRUwyKSB7CisJCXN0cnVjdCBpb19hY2NlbDJfY21kICpjbTIgPSAoc3RydWN0IGlvX2FjY2VsMl9jbWQgKikKKwkJCSZoLT5pb2FjY2VsMl9jbWRfcG9vbFtjLT5jbWRpbmRleF07CisJCS8qIHVwcGVyIHRhZyBub3QgdXNlZCBpbiBpb2FjY2VsMiBtb2RlICovCisJCW1lbXNldCh0YWd1cHBlciwgMCwgc2l6ZW9mKCp0YWd1cHBlcikpOworCQkqdGFnbG93ZXIgPSBjbTItPlRhZzsKKwkJcmV0dXJuOworCX0KKwkqdGFndXBwZXIgPSBjLT5IZWFkZXIuVGFnLnVwcGVyOworCSp0YWdsb3dlciA9IGMtPkhlYWRlci5UYWcubG93ZXI7Cit9CisKKwogc3RhdGljIGludCBocHNhX3NlbmRfYWJvcnQoc3RydWN0IGN0bHJfaW5mbyAqaCwgdW5zaWduZWQgY2hhciAqc2NzaTNhZGRyLAogCXN0cnVjdCBDb21tYW5kTGlzdCAqYWJvcnQsIGludCBzd2l6emxlKQogewogCWludCByYyA9IElPX09LOwogCXN0cnVjdCBDb21tYW5kTGlzdCAqYzsKIAlzdHJ1Y3QgRXJyb3JJbmZvICplaTsKKwl1MzIgdGFndXBwZXIsIHRhZ2xvd2VyOwogCiAJYyA9IGNtZF9zcGVjaWFsX2FsbG9jKGgpOwogCWlmIChjID09IE5VTEwpIHsJLyogdHJvdWJsZS4uLiAqLwpAQCAtMjQ5MCw4ICs0MzU3LDkgQEAKIAlpZiAoc3dpenpsZSkKIAkJc3dpenpsZV9hYm9ydF90YWcoJmMtPlJlcXVlc3QuQ0RCWzRdKTsKIAlocHNhX3Njc2lfZG9fc2ltcGxlX2NtZF9jb3JlKGgsIGMpOworCWhwc2FfZ2V0X3RhZyhoLCBhYm9ydCwgJnRhZ2xvd2VyLCAmdGFndXBwZXIpOwogCWRldl9kYmcoJmgtPnBkZXYtPmRldiwgIiVzOiBUYWc6MHglMDh4OiUwOHg6IGRvX3NpbXBsZV9jbWRfY29yZSBjb21wbGV0ZWQuXG4iLAotCQlfX2Z1bmNfXywgYWJvcnQtPkhlYWRlci5UYWcudXBwZXIsIGFib3J0LT5IZWFkZXIuVGFnLmxvd2VyKTsKKwkJX19mdW5jX18sIHRhZ3VwcGVyLCB0YWdsb3dlcik7CiAJLyogbm8gdW5tYXAgbmVlZGVkIGhlcmUgYmVjYXVzZSBubyBkYXRhIHhmZXIuICovCiAKIAllaSA9IGMtPmVycl9pbmZvOwpAQCAtMjUwMywxNSArNDM3MSwxNCBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZGJnKCZoLT5wZGV2LT5kZXYsICIlczogVGFnOjB4JTA4eDolMDh4OiBpbnRlcnByZXRpbmcgZXJyb3IuXG4iLAotCQkJX19mdW5jX18sIGFib3J0LT5IZWFkZXIuVGFnLnVwcGVyLAotCQkJYWJvcnQtPkhlYWRlci5UYWcubG93ZXIpOwotCQlocHNhX3Njc2lfaW50ZXJwcmV0X2Vycm9yKGMpOworCQkJX19mdW5jX18sIHRhZ3VwcGVyLCB0YWdsb3dlcik7CisJCWhwc2Ffc2NzaV9pbnRlcnByZXRfZXJyb3IoaCwgYyk7CiAJCXJjID0gLTE7CiAJCWJyZWFrOwogCX0KIAljbWRfc3BlY2lhbF9mcmVlKGgsIGMpOwotCWRldl9kYmcoJmgtPnBkZXYtPmRldiwgIiVzOiBUYWc6MHglMDh4OiUwOHg6IEZpbmlzaGVkLlxuIiwgX19mdW5jX18sCi0JCWFib3J0LT5IZWFkZXIuVGFnLnVwcGVyLCBhYm9ydC0+SGVhZGVyLlRhZy5sb3dlcik7CisJZGV2X2RiZygmaC0+cGRldi0+ZGV2LCAiJXM6IFRhZzoweCUwOHg6JTA4eDogRmluaXNoZWQuXG4iLAorCQlfX2Z1bmNfXywgdGFndXBwZXIsIHRhZ2xvd2VyKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTI1NjUsNiArNDQzMiw4MyBAQAogCXJldHVybiBOVUxMOwogfQogCisvKiBpb2FjY2VsMiBwYXRoIGZpcm13YXJlIGNhbm5vdCBoYW5kbGUgYWJvcnQgdGFzayByZXF1ZXN0cy4KKyAqIENoYW5nZSBhYm9ydCByZXF1ZXN0cyB0byBwaHlzaWNhbCB0YXJnZXQgcmVzZXQsIGFuZCBzZW5kIHRvIHRoZQorICogYWRkcmVzcyBvZiB0aGUgcGh5c2ljYWwgZGlzayB1c2VkIGZvciB0aGUgaW9hY2NlbCAyIGNvbW1hbmQuCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIChJT19PSykKKyAqCSAtMSBvbiBmYWlsdXJlCisgKi8KKworc3RhdGljIGludCBocHNhX3NlbmRfcmVzZXRfYXNfYWJvcnRfaW9hY2NlbDIoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwl1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsIHN0cnVjdCBDb21tYW5kTGlzdCAqYWJvcnQpCit7CisJaW50IHJjID0gSU9fT0s7CisJc3RydWN0IHNjc2lfY21uZCAqc2NtZDsgLyogc2NzaSBjb21tYW5kIHdpdGhpbiByZXF1ZXN0IGJlaW5nIGFib3J0ZWQgKi8KKwlzdHJ1Y3QgaHBzYV9zY3NpX2Rldl90ICpkZXY7IC8qIGRldmljZSB0byB3aGljaCBzY3NpIGNtZCB3YXMgc2VudCAqLworCXVuc2lnbmVkIGNoYXIgcGh5c19zY3NpM2FkZHJbOF07IC8qIGFkZHIgb2YgcGh5cyBkaXNrIHdpdGggdm9sdW1lICovCisJdW5zaWduZWQgY2hhciAqcHNhID0gJnBoeXNfc2NzaTNhZGRyWzBdOworCisJLyogR2V0IGEgcG9pbnRlciB0byB0aGUgaHBzYSBsb2dpY2FsIGRldmljZS4gKi8KKwlzY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgYWJvcnQtPnNjc2lfY21kOworCWRldiA9IChzdHJ1Y3QgaHBzYV9zY3NpX2Rldl90ICopKHNjbWQtPmRldmljZS0+aG9zdGRhdGEpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LAorCQkJIkNhbm5vdCBhYm9ydDogbm8gZGV2aWNlIHBvaW50ZXIgZm9yIGNvbW1hbmQuXG4iKTsKKwkJCXJldHVybiAtMTsgLyogbm90IGFib3J0YWJsZSAqLworCX0KKworCWlmIChoLT5yYWlkX29mZmxvYWRfZGVidWcgPiAwKQorCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkJIlJlc2V0IGFzIGFib3J0OiBBYm9ydCByZXF1ZXN0ZWQgb24gQyVkOkIlZDpUJWQ6TCVkIHNjc2kzYWRkciAweCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkJaC0+c2NzaV9ob3N0LT5ob3N0X25vLCBkZXYtPmJ1cywgZGV2LT50YXJnZXQsIGRldi0+bHVuLAorCQkJc2NzaTNhZGRyWzBdLCBzY3NpM2FkZHJbMV0sIHNjc2kzYWRkclsyXSwgc2NzaTNhZGRyWzNdLAorCQkJc2NzaTNhZGRyWzRdLCBzY3NpM2FkZHJbNV0sIHNjc2kzYWRkcls2XSwgc2NzaTNhZGRyWzddKTsKKworCWlmICghZGV2LT5vZmZsb2FkX2VuYWJsZWQpIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCSJDYW4ndCBhYm9ydDogZGV2aWNlIGlzIG5vdCBvcGVyYXRpbmcgaW4gSFAgU1NEIFNtYXJ0IFBhdGggbW9kZS5cbiIpOworCQlyZXR1cm4gLTE7IC8qIG5vdCBhYm9ydGFibGUgKi8KKwl9CisKKwkvKiBJbmNvbWluZyBzY3NpM2FkZHIgaXMgbG9naWNhbCBhZGRyLiBXZSBuZWVkIHBoeXNpY2FsIGRpc2sgYWRkci4gKi8KKwlpZiAoIWhwc2FfZ2V0X3BkaXNrX29mX2lvYWNjZWwyKGgsIGFib3J0LCBwc2EpKSB7CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJDYW4ndCBhYm9ydDogRmFpbGVkIGxvb2t1cCBvZiBwaHlzaWNhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAtMTsgLyogbm90IGFib3J0YWJsZSAqLworCX0KKworCS8qIHNlbmQgdGhlIHJlc2V0ICovCisJaWYgKGgtPnJhaWRfb2ZmbG9hZF9kZWJ1ZyA+IDApCisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiUmVzZXQgYXMgYWJvcnQ6IFJlc2V0dGluZyBwaHlzaWNhbCBkZXZpY2UgYXQgc2NzaTNhZGRyIDB4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCQlwc2FbMF0sIHBzYVsxXSwgcHNhWzJdLCBwc2FbM10sCisJCQlwc2FbNF0sIHBzYVs1XSwgcHNhWzZdLCBwc2FbN10pOworCXJjID0gaHBzYV9zZW5kX3Jlc2V0KGgsIHBzYSwgSFBTQV9SRVNFVF9UWVBFX1RBUkdFVCk7CisJaWYgKHJjICE9IDApIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCSJSZXNldCBhcyBhYm9ydDogRmFpbGVkIG9uIHBoeXNpY2FsIGRldmljZSBhdCBzY3NpM2FkZHIgMHglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJCXBzYVswXSwgcHNhWzFdLCBwc2FbMl0sIHBzYVszXSwKKwkJCXBzYVs0XSwgcHNhWzVdLCBwc2FbNl0sIHBzYVs3XSk7CisJCXJldHVybiByYzsgLyogZmFpbGVkIHRvIHJlc2V0ICovCisJfQorCisJLyogd2FpdCBmb3IgZGV2aWNlIHRvIHJlY292ZXIgKi8KKwlpZiAod2FpdF9mb3JfZGV2aWNlX3RvX2JlY29tZV9yZWFkeShoLCBwc2EpICE9IDApIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCSJSZXNldCBhcyBhYm9ydDogRmFpbGVkOiBEZXZpY2UgbmV2ZXIgcmVjb3ZlcmVkIGZyb20gcmVzZXQ6IDB4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCQlwc2FbMF0sIHBzYVsxXSwgcHNhWzJdLCBwc2FbM10sCisJCQlwc2FbNF0sIHBzYVs1XSwgcHNhWzZdLCBwc2FbN10pOworCQlyZXR1cm4gLTE7ICAvKiBmYWlsZWQgdG8gcmVjb3ZlciAqLworCX0KKworCS8qIGRldmljZSByZWNvdmVyZWQgKi8KKwlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkiUmVzZXQgYXMgYWJvcnQ6IERldmljZSByZWNvdmVyZWQgZnJvbSByZXNldDogc2NzaTNhZGRyIDB4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCXBzYVswXSwgcHNhWzFdLCBwc2FbMl0sIHBzYVszXSwKKwkJcHNhWzRdLCBwc2FbNV0sIHBzYVs2XSwgcHNhWzddKTsKKworCXJldHVybiByYzsgLyogc3VjY2VzcyAqLworfQorCiAvKiBTb21lIFNtYXJ0IEFycmF5cyBuZWVkIHRoZSBhYm9ydCB0YWcgc3dpenpsZWQsIGFuZCBzb21lIGRvbid0LiAgSXQncyBoYXJkIHRvCiAgKiB0ZWxsIHdoaWNoIGtpbmQgd2UncmUgZGVhbGluZyB3aXRoLCBzbyB3ZSBzZW5kIHRoZSBhYm9ydCBib3RoIHdheXMuICBUaGVyZQogICogc2hvdWxkbid0IGJlIGFueSBjb2xsaXNpb25zIGJldHdlZW4gc3dpenpsZWQgYW5kIHVuc3dpenpsZWQgdGFncyBkdWUgdG8gdGhlCkBAIC0yNTc4LDYgKzQ1MjIsMTQgQEAKIAlzdHJ1Y3QgQ29tbWFuZExpc3QgKmM7CiAJaW50IHJjID0gMCwgcmMyID0gMDsKIAorCS8qIGlvY2NlbGVyYXRvciBtb2RlIDIgY29tbWFuZHMgc2hvdWxkIGJlIGFib3J0ZWQgdmlhIHRoZQorCSAqIGFjY2VsZXJhdGVkIHBhdGgsIHNpbmNlIFJBSUQgcGF0aCBpcyB1bmF3YXJlIG9mIHRoZXNlIGNvbW1hbmRzLAorCSAqIGJ1dCB1bmRlcmx5aW5nIGZpcm13YXJlIGNhbid0IGhhbmRsZSBhYm9ydCBUTUYuCisJICogQ2hhbmdlIGFib3J0IHRvIHBoeXNpY2FsIGRldmljZSByZXNldC4KKwkgKi8KKwlpZiAoYWJvcnQtPmNtZF90eXBlID09IENNRF9JT0FDQ0VMMikKKwkJcmV0dXJuIGhwc2Ffc2VuZF9yZXNldF9hc19hYm9ydF9pb2FjY2VsMihoLCBzY3NpM2FkZHIsIGFib3J0KTsKKwogCS8qIHdlIGRvIG5vdCBleHBlY3QgdG8gZmluZCB0aGUgc3dpenpsZWQgdGFnIGluIG91ciBxdWV1ZSwgYnV0CiAJICogY2hlY2sgYW55d2F5IGp1c3QgdG8gYmUgc3VyZSB0aGUgYXNzdW1wdGlvbnMgd2hpY2ggbWFrZSB0aGlzCiAJICogdGhlIGNhc2UgaGF2ZW4ndCBiZWNvbWUgd3JvbmcuCkBAIC0yNjE2LDYgKzQ1NjgsNyBAQAogCXN0cnVjdCBzY3NpX2NtbmQgKmFzOwkvKiBwdHIgdG8gc2NzaSBjbWQgaW5zaWRlIGFib3J0ZWQgY29tbWFuZC4gKi8KIAljaGFyIG1zZ1syNTZdOwkJLyogRm9yIGRlYnVnIG1lc3NhZ2luZy4gKi8KIAlpbnQgbWwgPSAwOworCXUzMiB0YWd1cHBlciwgdGFnbG93ZXI7CiAKIAkvKiBGaW5kIHRoZSBjb250cm9sbGVyIG9mIHRoZSBjb21tYW5kIHRvIGJlIGFib3J0ZWQgKi8KIAloID0gc2Rldl90b19oYmEoc2MtPmRldmljZSk7CkBAIC0yNjQ4LDkgKzQ2MDEsOCBAQAogCQkJCW1zZyk7CiAJCXJldHVybiBGQUlMRUQ7CiAJfQotCi0JbWwgKz0gc3ByaW50Zihtc2crbWwsICJUYWc6MHglMDh4OiUwOHggIiwKLQkJYWJvcnQtPkhlYWRlci5UYWcudXBwZXIsIGFib3J0LT5IZWFkZXIuVGFnLmxvd2VyKTsKKwlocHNhX2dldF90YWcoaCwgYWJvcnQsICZ0YWdsb3dlciwgJnRhZ3VwcGVyKTsKKwltbCArPSBzcHJpbnRmKG1zZyttbCwgIlRhZzoweCUwOHg6JTA4eCAiLCB0YWd1cHBlciwgdGFnbG93ZXIpOwogCWFzICA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGFib3J0LT5zY3NpX2NtZDsKIAlpZiAoYXMgIT0gTlVMTCkKIAkJbWwgKz0gc3ByaW50Zihtc2crbWwsICJDb21tYW5kOjB4JXggU046MHglbHggIiwKQEAgLTI3NzYsNiArNDcyOCw3IEBACiAJCXJldHVybiBOVUxMOwogCW1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKIAorCWMtPmNtZF90eXBlID0gQ01EX1NDU0k7CiAJYy0+Y21kaW5kZXggPSAtMTsKIAogCWMtPmVycl9pbmZvID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaC0+cGRldiwgc2l6ZW9mKCpjLT5lcnJfaW5mbyksCkBAIC0zMDM4LDcgKzQ5OTEsNyBAQAogCQljLT5TR1swXS5BZGRyLmxvd2VyID0gdGVtcDY0LnZhbDMyLmxvd2VyOwogCQljLT5TR1swXS5BZGRyLnVwcGVyID0gdGVtcDY0LnZhbDMyLnVwcGVyOwogCQljLT5TR1swXS5MZW4gPSBpb2NvbW1hbmQuYnVmX3NpemU7Ci0JCWMtPlNHWzBdLkV4dCA9IDA7IC8qIHdlIGFyZSBub3QgY2hhaW5pbmcqLworCQljLT5TR1swXS5FeHQgPSBIUFNBX1NHX0xBU1Q7IC8qIHdlIGFyZSBub3QgY2hhaW5pbmcqLwogCX0KIAlocHNhX3Njc2lfZG9fc2ltcGxlX2NtZF9jb3JlX2lmX25vX2xvY2t1cChoLCBjKTsKIAlpZiAoaW9jb21tYW5kLmJ1Zl9zaXplID4gMCkKQEAgLTMxNjgsOCArNTEyMSw3IEBACiAJCQljLT5TR1tpXS5BZGRyLmxvd2VyID0gdGVtcDY0LnZhbDMyLmxvd2VyOwogCQkJYy0+U0dbaV0uQWRkci51cHBlciA9IHRlbXA2NC52YWwzMi51cHBlcjsKIAkJCWMtPlNHW2ldLkxlbiA9IGJ1ZmZfc2l6ZVtpXTsKLQkJCS8qIHdlIGFyZSBub3QgY2hhaW5pbmcgKi8KLQkJCWMtPlNHW2ldLkV4dCA9IDA7CisJCQljLT5TR1tpXS5FeHQgPSBpIDwgc2dfdXNlZCAtIDEgPyAwIDogSFBTQV9TR19MQVNUOwogCQl9CiAJfQogCWhwc2Ffc2NzaV9kb19zaW1wbGVfY21kX2NvcmVfaWZfbm9fbG9ja3VwKGgsIGMpOwpAQCAtMzMwNCw3ICs1MjU2LDcgQEAKIH0KIAogc3RhdGljIGludCBmaWxsX2NtZChzdHJ1Y3QgQ29tbWFuZExpc3QgKmMsIHU4IGNtZCwgc3RydWN0IGN0bHJfaW5mbyAqaCwKLQl2b2lkICpidWZmLCBzaXplX3Qgc2l6ZSwgdTggcGFnZV9jb2RlLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsCisJdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsIHUxNiBwYWdlX2NvZGUsIHVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwKIAlpbnQgY21kX3R5cGUpCiB7CiAJaW50IHBjaV9kaXIgPSBYRkVSX05PTkU7CkBAIC0zMzI3LDkgKzUyNzksOSBAQAogCQlzd2l0Y2ggKGNtZCkgewogCQljYXNlIEhQU0FfSU5RVUlSWToKIAkJCS8qIGFyZSB3ZSB0cnlpbmcgdG8gcmVhZCBhIHZpdGFsIHByb2R1Y3QgcGFnZSAqLwotCQkJaWYgKHBhZ2VfY29kZSAhPSAwKSB7CisJCQlpZiAocGFnZV9jb2RlICYgVlBEX1BBR0UpIHsKIAkJCQljLT5SZXF1ZXN0LkNEQlsxXSA9IDB4MDE7Ci0JCQkJYy0+UmVxdWVzdC5DREJbMl0gPSBwYWdlX2NvZGU7CisJCQkJYy0+UmVxdWVzdC5DREJbMl0gPSAocGFnZV9jb2RlICYgMHhmZik7CiAJCQl9CiAJCQljLT5SZXF1ZXN0LkNEQkxlbiA9IDY7CiAJCQljLT5SZXF1ZXN0LlR5cGUuQXR0cmlidXRlID0gQVRUUl9TSU1QTEU7CkBAIC0zMzY5LDYgKzUzMjEsMjggQEAKIAkJCWMtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPSBYRkVSX05PTkU7CiAJCQljLT5SZXF1ZXN0LlRpbWVvdXQgPSAwOwogCQkJYnJlYWs7CisJCWNhc2UgSFBTQV9HRVRfUkFJRF9NQVA6CisJCQljLT5SZXF1ZXN0LkNEQkxlbiA9IDEyOworCQkJYy0+UmVxdWVzdC5UeXBlLkF0dHJpYnV0ZSA9IEFUVFJfU0lNUExFOworCQkJYy0+UmVxdWVzdC5UeXBlLkRpcmVjdGlvbiA9IFhGRVJfUkVBRDsKKwkJCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7CisJCQljLT5SZXF1ZXN0LkNEQlswXSA9IEhQU0FfQ0lTU19SRUFEOworCQkJYy0+UmVxdWVzdC5DREJbMV0gPSBjbWQ7CisJCQljLT5SZXF1ZXN0LkNEQls2XSA9IChzaXplID4+IDI0KSAmIDB4RkY7IC8qIE1TQiAqLworCQkJYy0+UmVxdWVzdC5DREJbN10gPSAoc2l6ZSA+PiAxNikgJiAweEZGOworCQkJYy0+UmVxdWVzdC5DREJbOF0gPSAoc2l6ZSA+PiA4KSAmIDB4RkY7CisJCQljLT5SZXF1ZXN0LkNEQls5XSA9IHNpemUgJiAweEZGOworCQkJYnJlYWs7CisJCWNhc2UgQk1JQ19TRU5TRV9DT05UUk9MTEVSX1BBUkFNRVRFUlM6CisJCQljLT5SZXF1ZXN0LkNEQkxlbiA9IDEwOworCQkJYy0+UmVxdWVzdC5UeXBlLkF0dHJpYnV0ZSA9IEFUVFJfU0lNUExFOworCQkJYy0+UmVxdWVzdC5UeXBlLkRpcmVjdGlvbiA9IFhGRVJfUkVBRDsKKwkJCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7CisJCQljLT5SZXF1ZXN0LkNEQlswXSA9IEJNSUNfUkVBRDsKKwkJCWMtPlJlcXVlc3QuQ0RCWzZdID0gQk1JQ19TRU5TRV9DT05UUk9MTEVSX1BBUkFNRVRFUlM7CisJCQljLT5SZXF1ZXN0LkNEQls3XSA9IChzaXplID4+IDE2KSAmIDB4RkY7CisJCQljLT5SZXF1ZXN0LkNEQls4XSA9IChzaXplID4+IDgpICYgMHhGRjsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgInVua25vd24gY29tbWFuZCAweCVjXG4iLCBjbWQpOwogCQkJQlVHKCk7CkBAIC0zNTYyLDcgKzU1MzYsOCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPmxvY2ssIGZsYWdzKTsKIAogCWRpYWxfdXBfbG9ja3VwX2RldGVjdGlvbl9vbl9md19mbGFzaF9jb21wbGV0ZShjLT5oLCBjKTsKLQlpZiAobGlrZWx5KGMtPmNtZF90eXBlID09IENNRF9TQ1NJKSkKKwlpZiAobGlrZWx5KGMtPmNtZF90eXBlID09IENNRF9JT0FDQ0VMMSB8fCBjLT5jbWRfdHlwZSA9PSBDTURfU0NTSQorCQkJfHwgYy0+Y21kX3R5cGUgPT0gQ01EX0lPQUNDRUwyKSkKIAkJY29tcGxldGVfc2NzaV9jb21tYW5kKGMpOwogCWVsc2UgaWYgKGMtPmNtZF90eXBlID09IENNRF9JT0NUTF9QRU5EKQogCQljb21wbGV0ZShjLT53YWl0aW5nKTsKQEAgLTQxNjksMjEgKzYxNDQsMjQgQEAKIAkJZ290byBkZWZhdWx0X2ludF9tb2RlOwogCWlmIChwY2lfZmluZF9jYXBhYmlsaXR5KGgtPnBkZXYsIFBDSV9DQVBfSURfTVNJWCkpIHsKIAkJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwgIk1TSVhcbiIpOworCQloLT5tc2l4X3ZlY3RvciA9IE1BWF9SRVBMWV9RVUVVRVM7CiAJCWVyciA9IHBjaV9lbmFibGVfbXNpeChoLT5wZGV2LCBocHNhX21zaXhfZW50cmllcywKLQkJCQkJCU1BWF9SRVBMWV9RVUVVRVMpOwotCQlpZiAoIWVycikgewotCQkJZm9yIChpID0gMDsgaSA8IE1BWF9SRVBMWV9RVUVVRVM7IGkrKykKLQkJCQloLT5pbnRyW2ldID0gaHBzYV9tc2l4X2VudHJpZXNbaV0udmVjdG9yOwotCQkJaC0+bXNpeF92ZWN0b3IgPSAxOwotCQkJcmV0dXJuOwotCQl9CisJCQkJICAgICAgaC0+bXNpeF92ZWN0b3IpOwogCQlpZiAoZXJyID4gMCkgewogCQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIm9ubHkgJWQgTVNJLVggdmVjdG9ycyAiCiAJCQkgICAgICAgImF2YWlsYWJsZVxuIiwgZXJyKTsKLQkJCWdvdG8gZGVmYXVsdF9pbnRfbW9kZTsKKwkJCWgtPm1zaXhfdmVjdG9yID0gZXJyOworCQkJZXJyID0gcGNpX2VuYWJsZV9tc2l4KGgtPnBkZXYsIGhwc2FfbXNpeF9lbnRyaWVzLAorCQkJCQkgICAgICBoLT5tc2l4X3ZlY3Rvcik7CisJCX0KKwkJaWYgKCFlcnIpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBoLT5tc2l4X3ZlY3RvcjsgaSsrKQorCQkJCWgtPmludHJbaV0gPSBocHNhX21zaXhfZW50cmllc1tpXS52ZWN0b3I7CisJCQlyZXR1cm47CiAJCX0gZWxzZSB7CiAJCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiTVNJLVggaW5pdCBmYWlsZWQgJWRcbiIsCiAJCQkgICAgICAgZXJyKTsKKwkJCWgtPm1zaXhfdmVjdG9yID0gMDsKIAkJCWdvdG8gZGVmYXVsdF9pbnRfbW9kZTsKIAkJfQogCX0KQEAgLTQzMzYsNiArNjMxNCw3IEBACiAJaHBzYV9nZXRfbWF4X3BlcmZfbW9kZV9jbWRzKGgpOwogCWgtPm5yX2NtZHMgPSBoLT5tYXhfY29tbWFuZHMgLSA0OyAvKiBBbGxvdyByb29tIGZvciBzb21lIGlvY3RscyAqLwogCWgtPm1heHNnZW50cmllcyA9IHJlYWRsKCYoaC0+Y2ZndGFibGUtPk1heFNjYXR0ZXJHYXRoZXJFbGVtZW50cykpOworCWgtPmZ3X3N1cHBvcnQgPSByZWFkbCgmKGgtPmNmZ3RhYmxlLT5taXNjX2Z3X3N1cHBvcnQpKTsKIAkvKgogCSAqIExpbWl0IGluLWNvbW1hbmQgcy9nIGVsZW1lbnRzIHRvIDMyIHNhdmUgZG1hJ2FibGUgbWVtb3J5LgogCSAqIEhvd3ZldmVyIHNwZWMgc2F5cyBpZiAwLCB1c2UgMzEKQEAgLTQzNTIsNiArNjMzMSwxMCBAQAogCiAJLyogRmluZCBvdXQgd2hhdCB0YXNrIG1hbmFnZW1lbnQgZnVuY3Rpb25zIGFyZSBzdXBwb3J0ZWQgYW5kIGNhY2hlICovCiAJaC0+VE1GU3VwcG9ydEZsYWdzID0gcmVhZGwoJihoLT5jZmd0YWJsZS0+VE1GU3VwcG9ydEZsYWdzKSk7CisJaWYgKCEoSFBTQVRNRl9QSFlTX1RBU0tfQUJPUlQgJiBoLT5UTUZTdXBwb3J0RmxhZ3MpKQorCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiUGh5c2ljYWwgYWJvcnRzIG5vdCBzdXBwb3J0ZWRcbiIpOworCWlmICghKEhQU0FUTUZfTE9HX1RBU0tfQUJPUlQgJiBoLT5UTUZTdXBwb3J0RmxhZ3MpKQorCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiTG9naWNhbCBhYm9ydHMgbm90IHN1cHBvcnRlZFxuIik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBocHNhX0NJU1Nfc2lnbmF0dXJlX3ByZXNlbnQoc3RydWN0IGN0bHJfaW5mbyAqaCkKQEAgLTQzOTAsNiArNjM3MywyMyBAQAogCXdyaXRlbChkbWFfcHJlZmV0Y2gsIGgtPnZhZGRyICsgSTJPX0RNQTFfQ0ZHKTsKIH0KIAorc3RhdGljIHZvaWQgaHBzYV93YWl0X2Zvcl9jbGVhcl9ldmVudF9ub3RpZnlfYWNrKHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CisJaW50IGk7CisJdTMyIGRvb3JiZWxsX3ZhbHVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJLyogd2FpdCB1bnRpbCB0aGUgY2xlYXJfZXZlbnRfbm90aWZ5IGJpdCA2IGlzIGNsZWFyZWQgYnkgY29udHJvbGxlci4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPTkZJR19XQUlUOyBpKyspIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKKwkJZG9vcmJlbGxfdmFsdWUgPSByZWFkbChoLT52YWRkciArIFNBNV9ET09SQkVMTCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKCEoZG9vcmJlbGxfdmFsdWUgJiBET09SQkVMTF9DTEVBUl9FVkVOVFMpKQorCQkJYnJlYWs7CisJCS8qIGRlbGF5IGFuZCB0cnkgYWdhaW4gKi8KKwkJbXNsZWVwKDIwKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGhwc2Ffd2FpdF9mb3JfbW9kZV9jaGFuZ2VfYWNrKHN0cnVjdCBjdGxyX2luZm8gKmgpCiB7CiAJaW50IGk7CkBAIC00NDIwLDE4ICs2NDIwLDIwIEBACiAJCXJldHVybiAtRU5PVFNVUFA7CiAKIAloLT5tYXhfY29tbWFuZHMgPSByZWFkbCgmKGgtPmNmZ3RhYmxlLT5DbWRzT3V0TWF4KSk7CisKIAkvKiBVcGRhdGUgdGhlIGZpZWxkLCBhbmQgdGhlbiByaW5nIHRoZSBkb29yYmVsbCAqLwogCXdyaXRlbChDRkdUQkxfVHJhbnNfU2ltcGxlLCAmKGgtPmNmZ3RhYmxlLT5Ib3N0V3JpdGUuVHJhbnNwb3J0UmVxdWVzdCkpOworCXdyaXRlbCgwLCAmaC0+Y2ZndGFibGUtPkhvc3RXcml0ZS5jb21tYW5kX3Bvb2xfYWRkcl9oaSk7CiAJd3JpdGVsKENGR1RCTF9DaGFuZ2VSZXEsIGgtPnZhZGRyICsgU0E1X0RPT1JCRUxMKTsKIAlocHNhX3dhaXRfZm9yX21vZGVfY2hhbmdlX2FjayhoKTsKIAlwcmludF9jZmdfdGFibGUoJmgtPnBkZXYtPmRldiwgaC0+Y2ZndGFibGUpOwotCWlmICghKHJlYWRsKCYoaC0+Y2ZndGFibGUtPlRyYW5zcG9ydEFjdGl2ZSkpICYgQ0ZHVEJMX1RyYW5zX1NpbXBsZSkpIHsKLQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKLQkJCSJ1bmFibGUgdG8gZ2V0IGJvYXJkIGludG8gc2ltcGxlIG1vZGVcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CisJaWYgKCEocmVhZGwoJihoLT5jZmd0YWJsZS0+VHJhbnNwb3J0QWN0aXZlKSkgJiBDRkdUQkxfVHJhbnNfU2ltcGxlKSkKKwkJZ290byBlcnJvcjsKIAloLT50cmFuc01ldGhvZCA9IENGR1RCTF9UcmFuc19TaW1wbGU7CiAJcmV0dXJuIDA7CitlcnJvcjoKKwlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCBib2FyZCBpbnRvIHNpbXBsZSBtb2RlXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKIH0KIAogc3RhdGljIGludCBocHNhX3BjaV9pbml0KHN0cnVjdCBjdGxyX2luZm8gKmgpCkBAIC00NTc3LDExICs2NTc5LDE5IEBACiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaC0+cGRldiwKIAkJCSAgICBoLT5ucl9jbWRzICogc2l6ZW9mKHN0cnVjdCBDb21tYW5kTGlzdCksCiAJCQkgICAgaC0+Y21kX3Bvb2wsIGgtPmNtZF9wb29sX2RoYW5kbGUpOworCWlmIChoLT5pb2FjY2VsMl9jbWRfcG9vbCkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChoLT5wZGV2LAorCQkJaC0+bnJfY21kcyAqIHNpemVvZigqaC0+aW9hY2NlbDJfY21kX3Bvb2wpLAorCQkJaC0+aW9hY2NlbDJfY21kX3Bvb2wsIGgtPmlvYWNjZWwyX2NtZF9wb29sX2RoYW5kbGUpOwogCWlmIChoLT5lcnJpbmZvX3Bvb2wpCiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaC0+cGRldiwKIAkJCSAgICBoLT5ucl9jbWRzICogc2l6ZW9mKHN0cnVjdCBFcnJvckluZm8pLAogCQkJICAgIGgtPmVycmluZm9fcG9vbCwKIAkJCSAgICBoLT5lcnJpbmZvX3Bvb2xfZGhhbmRsZSk7CisJaWYgKGgtPmlvYWNjZWxfY21kX3Bvb2wpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaC0+cGRldiwKKwkJCWgtPm5yX2NtZHMgKiBzaXplb2Yoc3RydWN0IGlvX2FjY2VsMV9jbWQpLAorCQkJaC0+aW9hY2NlbF9jbWRfcG9vbCwgaC0+aW9hY2NlbF9jbWRfcG9vbF9kaGFuZGxlKTsKIH0KIAogc3RhdGljIGludCBocHNhX3JlcXVlc3RfaXJxKHN0cnVjdCBjdGxyX2luZm8gKmgsCkBAIC00NTk3LDE1ICs2NjA3LDE1IEBACiAJZm9yIChpID0gMDsgaSA8IE1BWF9SRVBMWV9RVUVVRVM7IGkrKykKIAkJaC0+cVtpXSA9ICh1OCkgaTsKIAotCWlmIChoLT5pbnRyX21vZGUgPT0gUEVSRl9NT0RFX0lOVCAmJiBoLT5tc2l4X3ZlY3RvcikgeworCWlmIChoLT5pbnRyX21vZGUgPT0gUEVSRl9NT0RFX0lOVCAmJiBoLT5tc2l4X3ZlY3RvciA+IDApIHsKIAkJLyogSWYgcGVyZm9ybWFudCBtb2RlIGFuZCBNU0ktWCwgdXNlIG11bHRpcGxlIHJlcGx5IHF1ZXVlcyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFUExZX1FVRVVFUzsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgaC0+bXNpeF92ZWN0b3I7IGkrKykKIAkJCXJjID0gcmVxdWVzdF9pcnEoaC0+aW50cltpXSwgbXNpeGhhbmRsZXIsCiAJCQkJCTAsIGgtPmRldm5hbWUsCiAJCQkJCSZoLT5xW2ldKTsKIAl9IGVsc2UgewogCQkvKiBVc2Ugc2luZ2xlIHJlcGx5IHBvb2wgKi8KLQkJaWYgKGgtPm1zaXhfdmVjdG9yIHx8IGgtPm1zaV92ZWN0b3IpIHsKKwkJaWYgKGgtPm1zaXhfdmVjdG9yID4gMCB8fCBoLT5tc2lfdmVjdG9yKSB7CiAJCQlyYyA9IHJlcXVlc3RfaXJxKGgtPmludHJbaC0+aW50cl9tb2RlXSwKIAkJCQltc2l4aGFuZGxlciwgMCwgaC0+ZGV2bmFtZSwKIAkJCQkmaC0+cVtoLT5pbnRyX21vZGVdKTsKQEAgLTQ2NTgsNyArNjY2OCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFUExZX1FVRVVFUzsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBoLT5tc2l4X3ZlY3RvcjsgaSsrKQogCQlmcmVlX2lycShoLT5pbnRyW2ldLCAmaC0+cVtpXSk7CiB9CiAKQEAgLTQ2ODEsNiArNjY5MSw3IEBACiAJaHBzYV9mcmVlX2lycXNfYW5kX2Rpc2FibGVfbXNpeChoKTsKIAlocHNhX2ZyZWVfc2dfY2hhaW5fYmxvY2tzKGgpOwogCWhwc2FfZnJlZV9jbWRfcG9vbChoKTsKKwlrZnJlZShoLT5pb2FjY2VsMV9ibG9ja0ZldGNoVGFibGUpOwogCWtmcmVlKGgtPmJsb2NrRmV0Y2hUYWJsZSk7CiAJcGNpX2ZyZWVfY29uc2lzdGVudChoLT5wZGV2LCBoLT5yZXBseV9wb29sX3NpemUsCiAJCWgtPnJlcGx5X3Bvb2wsIGgtPnJlcGx5X3Bvb2xfZGhhbmRsZSk7CkBAIC00NzYwLDYgKzY3NzEsOTIgQEAKIAloLT5sYXN0X2hlYXJ0YmVhdF90aW1lc3RhbXAgPSBub3c7CiB9CiAKK3N0YXRpYyB2b2lkIGhwc2FfYWNrX2N0bHJfZXZlbnRzKHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CisJaW50IGk7CisJY2hhciAqZXZlbnRfdHlwZTsKKworCS8qIENsZWFyIHRoZSBkcml2ZXItcmVxdWVzdGVkIHJlc2NhbiBmbGFnICovCisJaC0+ZHJ2X3JlcV9yZXNjYW4gPSAwOworCisJLyogQXNrIHRoZSBjb250cm9sbGVyIHRvIGNsZWFyIHRoZSBldmVudHMgd2UncmUgaGFuZGxpbmcuICovCisJaWYgKChoLT50cmFuc01ldGhvZCAmIChDRkdUQkxfVHJhbnNfaW9fYWNjZWwxCisJCQl8IENGR1RCTF9UcmFuc19pb19hY2NlbDIpKSAmJgorCQkoaC0+ZXZlbnRzICYgSFBTQV9FVkVOVF9OT1RJRllfQUNDRUxfSU9fUEFUSF9TVEFURV9DSEFOR0UgfHwKKwkJIGgtPmV2ZW50cyAmIEhQU0FfRVZFTlRfTk9USUZZX0FDQ0VMX0lPX1BBVEhfQ09ORklHX0NIQU5HRSkpIHsKKworCQlpZiAoaC0+ZXZlbnRzICYgSFBTQV9FVkVOVF9OT1RJRllfQUNDRUxfSU9fUEFUSF9TVEFURV9DSEFOR0UpCisJCQlldmVudF90eXBlID0gInN0YXRlIGNoYW5nZSI7CisJCWlmIChoLT5ldmVudHMgJiBIUFNBX0VWRU5UX05PVElGWV9BQ0NFTF9JT19QQVRIX0NPTkZJR19DSEFOR0UpCisJCQlldmVudF90eXBlID0gImNvbmZpZ3VyYXRpb24gY2hhbmdlIjsKKwkJLyogU3RvcCBzZW5kaW5nIG5ldyBSQUlEIG9mZmxvYWQgcmVxcyB2aWEgdGhlIElPIGFjY2VsZXJhdG9yICovCisJCXNjc2lfYmxvY2tfcmVxdWVzdHMoaC0+c2NzaV9ob3N0KTsKKwkJZm9yIChpID0gMDsgaSA8IGgtPm5kZXZpY2VzOyBpKyspCisJCQloLT5kZXZbaV0tPm9mZmxvYWRfZW5hYmxlZCA9IDA7CisJCWhwc2FfZHJhaW5fYWNjZWxfY29tbWFuZHMoaCk7CisJCS8qIFNldCAnYWNjZWxlcmF0b3IgcGF0aCBjb25maWcgY2hhbmdlJyBiaXQgKi8KKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCSJBY2tub3dsZWRnaW5nIGV2ZW50OiAweCUwOHggKEhQIFNTRCBTbWFydCBQYXRoICVzKVxuIiwKKwkJCWgtPmV2ZW50cywgZXZlbnRfdHlwZSk7CisJCXdyaXRlbChoLT5ldmVudHMsICYoaC0+Y2ZndGFibGUtPmNsZWFyX2V2ZW50X25vdGlmeSkpOworCQkvKiBTZXQgdGhlICJjbGVhciBldmVudCBub3RpZnkgZmllbGQgdXBkYXRlIiBiaXQgNiAqLworCQl3cml0ZWwoRE9PUkJFTExfQ0xFQVJfRVZFTlRTLCBoLT52YWRkciArIFNBNV9ET09SQkVMTCk7CisJCS8qIFdhaXQgdW50aWwgY3RsciBjbGVhcnMgJ2NsZWFyIGV2ZW50IG5vdGlmeSBmaWVsZCcsIGJpdCA2ICovCisJCWhwc2Ffd2FpdF9mb3JfY2xlYXJfZXZlbnRfbm90aWZ5X2FjayhoKTsKKwkJc2NzaV91bmJsb2NrX3JlcXVlc3RzKGgtPnNjc2lfaG9zdCk7CisJfSBlbHNlIHsKKwkJLyogQWNrbm93bGVkZ2UgY29udHJvbGxlciBub3RpZmljYXRpb24gZXZlbnRzLiAqLworCQl3cml0ZWwoaC0+ZXZlbnRzLCAmKGgtPmNmZ3RhYmxlLT5jbGVhcl9ldmVudF9ub3RpZnkpKTsKKwkJd3JpdGVsKERPT1JCRUxMX0NMRUFSX0VWRU5UUywgaC0+dmFkZHIgKyBTQTVfRE9PUkJFTEwpOworCQlocHNhX3dhaXRfZm9yX2NsZWFyX2V2ZW50X25vdGlmeV9hY2soaCk7CisjaWYgMAorCQl3cml0ZWwoQ0ZHVEJMX0NoYW5nZVJlcSwgaC0+dmFkZHIgKyBTQTVfRE9PUkJFTEwpOworCQlocHNhX3dhaXRfZm9yX21vZGVfY2hhbmdlX2FjayhoKTsKKyNlbmRpZgorCX0KKwlyZXR1cm47Cit9CisKKy8qIENoZWNrIGEgcmVnaXN0ZXIgb24gdGhlIGNvbnRyb2xsZXIgdG8gc2VlIGlmIHRoZXJlIGFyZSBjb25maWd1cmF0aW9uCisgKiBjaGFuZ2VzIChhZGRlZC9jaGFuZ2VkL3JlbW92ZWQgbG9naWNhbCBkcml2ZXMsIGV0Yy4pIHdoaWNoIG1lYW4gdGhhdAorICogd2Ugc2hvdWxkIHJlc2NhbiB0aGUgY29udHJvbGxlciBmb3IgZGV2aWNlcy4KKyAqIEFsc28gY2hlY2sgZmxhZyBmb3IgZHJpdmVyLWluaXRpYXRlZCByZXNjYW4uCisgKi8KK3N0YXRpYyBpbnQgaHBzYV9jdGxyX25lZWRzX3Jlc2NhbihzdHJ1Y3QgY3Rscl9pbmZvICpoKQoreworCWlmIChoLT5kcnZfcmVxX3Jlc2NhbikKKwkJcmV0dXJuIDE7CisKKwlpZiAoIShoLT5md19zdXBwb3J0ICYgTUlTQ19GV19FVkVOVF9OT1RJRlkpKQorCQlyZXR1cm4gMDsKKworCWgtPmV2ZW50cyA9IHJlYWRsKCYoaC0+Y2ZndGFibGUtPmV2ZW50X25vdGlmeSkpOworCXJldHVybiBoLT5ldmVudHMgJiBSRVNDQU5fUkVRVUlSRURfRVZFTlRfQklUUzsKK30KKworLyoKKyAqIENoZWNrIGlmIGFueSBvZiB0aGUgb2ZmbGluZSBkZXZpY2VzIGhhdmUgYmVjb21lIHJlYWR5CisgKi8KK3N0YXRpYyBpbnQgaHBzYV9vZmZsaW5lX2RldmljZXNfcmVhZHkoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBvZmZsaW5lX2RldmljZV9lbnRyeSAqZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0aGlzLCAqdG1wOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPm9mZmxpbmVfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUodGhpcywgdG1wLCAmaC0+b2ZmbGluZV9kZXZpY2VfbGlzdCkgeworCQlkID0gbGlzdF9lbnRyeSh0aGlzLCBzdHJ1Y3Qgb2ZmbGluZV9kZXZpY2VfZW50cnksCisJCQkJb2ZmbGluZV9saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+b2ZmbGluZV9kZXZpY2VfbG9jaywgZmxhZ3MpOworCQlpZiAoIWhwc2Ffdm9sdW1lX29mZmxpbmUoaCwgZC0+c2NzaTNhZGRyKSkKKwkJCXJldHVybiAxOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+b2ZmbGluZV9kZXZpY2VfbG9jaywgZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5vZmZsaW5lX2RldmljZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIHZvaWQgaHBzYV9tb25pdG9yX2N0bHJfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNDc2OCw2ICs2ODY1LDE1IEBACiAJZGV0ZWN0X2NvbnRyb2xsZXJfbG9ja3VwKGgpOwogCWlmIChoLT5sb2NrdXBfZGV0ZWN0ZWQpCiAJCXJldHVybjsKKworCWlmIChocHNhX2N0bHJfbmVlZHNfcmVzY2FuKGgpIHx8IGhwc2Ffb2ZmbGluZV9kZXZpY2VzX3JlYWR5KGgpKSB7CisJCXNjc2lfaG9zdF9nZXQoaC0+c2NzaV9ob3N0KTsKKwkJaC0+ZHJ2X3JlcV9yZXNjYW4gPSAwOworCQlocHNhX2Fja19jdGxyX2V2ZW50cyhoKTsKKwkJaHBzYV9zY2FuX3N0YXJ0KGgtPnNjc2lfaG9zdCk7CisJCXNjc2lfaG9zdF9wdXQoaC0+c2NzaV9ob3N0KTsKKwl9CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+bG9jaywgZmxhZ3MpOwogCWlmIChoLT5yZW1vdmVfaW5fcHJvZ3Jlc3MpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+bG9jaywgZmxhZ3MpOwpAQCAtNDgwNyw3ICs2OTEzLDcgQEAKIAkgKiB0aGUgNSBsb3dlciBiaXRzIG9mIHRoZSBhZGRyZXNzIGFyZSB1c2VkIGJ5IHRoZSBoYXJkd2FyZS4gYW5kIGJ5CiAJICogdGhlIGRyaXZlci4gIFNlZSBjb21tZW50cyBpbiBocHNhLmggZm9yIG1vcmUgaW5mby4KIAkgKi8KLSNkZWZpbmUgQ09NTUFORExJU1RfQUxJR05NRU5UIDMyCisjZGVmaW5lIENPTU1BTkRMSVNUX0FMSUdOTUVOVCAxMjgKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBDb21tYW5kTGlzdCkgJSBDT01NQU5ETElTVF9BTElHTk1FTlQpOwogCWggPSBremFsbG9jKHNpemVvZigqaCksIEdGUF9LRVJORUwpOwogCWlmICghaCkKQEAgLTQ4MTcsNyArNjkyMyw5IEBACiAJaC0+aW50cl9tb2RlID0gaHBzYV9zaW1wbGVfbW9kZSA/IFNJTVBMRV9NT0RFX0lOVCA6IFBFUkZfTU9ERV9JTlQ7CiAJSU5JVF9MSVNUX0hFQUQoJmgtPmNtcFEpOwogCUlOSVRfTElTVF9IRUFEKCZoLT5yZXFRKTsKKwlJTklUX0xJU1RfSEVBRCgmaC0+b2ZmbGluZV9kZXZpY2VfbGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJmgtPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZoLT5vZmZsaW5lX2RldmljZV9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmaC0+c2Nhbl9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmaC0+cGFzc3RocnVfY291bnRfbG9jayk7CiAJcmMgPSBocHNhX3BjaV9pbml0KGgpOwpAQCAtNDg1OSw2ICs2OTY3LDcgQEAKIAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBoKTsKIAloLT5uZGV2aWNlcyA9IDA7CisJaC0+aGJhX21vZGVfZW5hYmxlZCA9IDA7CiAJaC0+c2NzaV9ob3N0ID0gTlVMTDsKIAlzcGluX2xvY2tfaW5pdCgmaC0+ZGV2bG9jayk7CiAJaHBzYV9wdXRfY3Rscl9pbnRvX3BlcmZvcm1hbnRfbW9kZShoKTsKQEAgLTQ5MTgsNiArNzAyNywxMSBAQAogCQlnb3RvIHJlaW5pdF9hZnRlcl9zb2Z0X3Jlc2V0OwogCX0KIAorCQkvKiBFbmFibGUgQWNjZWxlcmF0ZWQgSU8gcGF0aCBhdCBkcml2ZXIgbGF5ZXIgKi8KKwkJaC0+YWNjaW9wYXRoX3N0YXR1cyA9IDE7CisKKwloLT5kcnZfcmVxX3Jlc2NhbiA9IDA7CisKIAkvKiBUdXJuIHRoZSBpbnRlcnJ1cHRzIG9uIHNvIHdlIGNhbiBzZXJ2aWNlIHJlcXVlc3RzICovCiAJaC0+YWNjZXNzLnNldF9pbnRyX21hc2soaCwgSFBTQV9JTlRSX09OKTsKIApAQCAtNTAzNCw2ICs3MTQ4LDggQEAKIAkJaC0+cmVwbHlfcG9vbCwgaC0+cmVwbHlfcG9vbF9kaGFuZGxlKTsKIAlrZnJlZShoLT5jbWRfcG9vbF9iaXRzKTsKIAlrZnJlZShoLT5ibG9ja0ZldGNoVGFibGUpOworCWtmcmVlKGgtPmlvYWNjZWwxX2Jsb2NrRmV0Y2hUYWJsZSk7CisJa2ZyZWUoaC0+aW9hY2NlbDJfYmxvY2tGZXRjaFRhYmxlKTsKIAlrZnJlZShoLT5oYmFfaW5xdWlyeV9kYXRhKTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKQEAgLTUwNzQsMjAgKzcxOTAsMTcgQEAKICAqIGJpdHMgb2YgdGhlIGNvbW1hbmQgYWRkcmVzcy4KICAqLwogc3RhdGljIHZvaWQgIGNhbGNfYnVja2V0X21hcChpbnQgYnVja2V0W10sIGludCBudW1fYnVja2V0cywKLQlpbnQgbnNncywgaW50ICpidWNrZXRfbWFwKQorCWludCBuc2dzLCBpbnQgbWluX2Jsb2NrcywgaW50ICpidWNrZXRfbWFwKQogewogCWludCBpLCBqLCBiLCBzaXplOwogCi0JLyogZXZlbiBhIGNvbW1hbmQgd2l0aCAwIFNHcyByZXF1aXJlcyA0IGJsb2NrcyAqLwotI2RlZmluZSBNSU5JTVVNX1RSQU5TRkVSX0JMT0NLUyA0Ci0jZGVmaW5lIE5VTV9CVUNLRVRTIDgKIAkvKiBOb3RlLCBidWNrZXRfbWFwIG11c3QgaGF2ZSBuc2dzKzEgZW50cmllcy4gKi8KIAlmb3IgKGkgPSAwOyBpIDw9IG5zZ3M7IGkrKykgewogCQkvKiBDb21wdXRlIHNpemUgb2YgYSBjb21tYW5kIHdpdGggaSBTRyBlbnRyaWVzICovCi0JCXNpemUgPSBpICsgTUlOSU1VTV9UUkFOU0ZFUl9CTE9DS1M7CisJCXNpemUgPSBpICsgbWluX2Jsb2NrczsKIAkJYiA9IG51bV9idWNrZXRzOyAvKiBBc3N1bWUgdGhlIGJpZ2dlc3QgYnVja2V0ICovCiAJCS8qIEZpbmQgdGhlIGJ1Y2tldCB0aGF0IGlzIGp1c3QgYmlnIGVub3VnaCAqLwotCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCWZvciAoaiA9IDA7IGogPCBudW1fYnVja2V0czsgaisrKSB7CiAJCQlpZiAoYnVja2V0W2pdID49IHNpemUpIHsKIAkJCQliID0gajsKIAkJCQlicmVhazsKQEAgLTUwOTgsMTAgKzcyMTEsMTYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGhwc2FfZW50ZXJfcGVyZm9ybWFudF9tb2RlKHN0cnVjdCBjdGxyX2luZm8gKmgsIHUzMiB1c2Vfc2hvcnRfdGFncykKK3N0YXRpYyB2b2lkIGhwc2FfZW50ZXJfcGVyZm9ybWFudF9tb2RlKHN0cnVjdCBjdGxyX2luZm8gKmgsIHUzMiB0cmFuc19zdXBwb3J0KQogewogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgcmVnaXN0ZXJfdmFsdWU7CisJdW5zaWduZWQgbG9uZyB0cmFuc01ldGhvZCA9IENGR1RCTF9UcmFuc19QZXJmb3JtYW50IHwKKwkJCSh0cmFuc19zdXBwb3J0ICYgQ0ZHVEJMX1RyYW5zX3VzZV9zaG9ydF90YWdzKSB8CisJCQkJQ0ZHVEJMX1RyYW5zX2VuYWJsZV9kaXJlY3RlZF9tc2l4IHwKKwkJCSh0cmFuc19zdXBwb3J0ICYgKENGR1RCTF9UcmFuc19pb19hY2NlbDEgfAorCQkJCUNGR1RCTF9UcmFuc19pb19hY2NlbDIpKTsKKwlzdHJ1Y3QgYWNjZXNzX21ldGhvZCBhY2Nlc3MgPSBTQTVfcGVyZm9ybWFudF9hY2Nlc3M7CiAKIAkvKiBUaGlzIGlzIGEgYml0IGNvbXBsaWNhdGVkLiAgVGhlcmUgYXJlIDggcmVnaXN0ZXJzIG9uCiAJICogdGhlIGNvbnRyb2xsZXIgd2hpY2ggd2Ugd3JpdGUgdG8gdG8gdGVsbCBpdCA4IGRpZmZlcmVudApAQCAtNTEyMSw2ICs3MjQwLDE2IEBACiAJICogc2l6ZXMgZm9yIHNtYWxsIGNvbW1hbmRzLCBhbmQgZmV3ZXIgc2l6ZXMgZm9yIGxhcmdlciBjb21tYW5kcy4KIAkgKi8KIAlpbnQgYmZ0WzhdID0gezUsIDYsIDgsIDEwLCAxMiwgMjAsIDI4LCBTR19FTlRSSUVTX0lOX0NNRCArIDR9OworI2RlZmluZSBNSU5fSU9BQ0NFTDJfQkZUX0VOVFJZIDUKKyNkZWZpbmUgSFBTQV9JT0FDQ0VMMl9IRUFERVJfU1ogNAorCWludCBiZnQyWzE2XSA9IHtNSU5fSU9BQ0NFTDJfQkZUX0VOVFJZLCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLAorCQkJMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksCisJCQlIUFNBX0lPQUNDRUwyX0hFQURFUl9TWiArIElPQUNDRUwyX01BWFNHRU5UUklFU307CisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoYmZ0MikgIT0gMTYpOworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKGJmdCkgIT0gOCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBpb19hY2NlbDJfY21kLCBzZykgPgorCQkJCSAxNiAqIE1JTl9JT0FDQ0VMMl9CRlRfRU5UUlkpOworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGlvYWNjZWwyX3NnX2VsZW1lbnQpICE9IDE2KTsKIAlCVUlMRF9CVUdfT04oMjggPiBTR19FTlRSSUVTX0lOX0NNRCArIDQpOwogCS8qICA1ID0gMSBzL2cgZW50cnkgb3IgNGsKIAkgKiAgNiA9IDIgcy9nIGVudHJ5IG9yIDhrCkBAIC01MTMzLDcgKzcyNjIsNyBAQAogCiAJYmZ0WzddID0gU0dfRU5UUklFU19JTl9DTUQgKyA0OwogCWNhbGNfYnVja2V0X21hcChiZnQsIEFSUkFZX1NJWkUoYmZ0KSwKLQkJCQlTR19FTlRSSUVTX0lOX0NNRCwgaC0+YmxvY2tGZXRjaFRhYmxlKTsKKwkJCQlTR19FTlRSSUVTX0lOX0NNRCwgNCwgaC0+YmxvY2tGZXRjaFRhYmxlKTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQogCQl3cml0ZWwoYmZ0W2ldLCAmaC0+dHJhbnN0YWJsZS0+QmxvY2tGZXRjaFtpXSk7CiAKQEAgLTUxNTAsOSArNzI3OSwyMiBAQAogCQkJJmgtPnRyYW5zdGFibGUtPlJlcFFBZGRyW2ldLmxvd2VyKTsKIAl9CiAKLQl3cml0ZWwoQ0ZHVEJMX1RyYW5zX1BlcmZvcm1hbnQgfCB1c2Vfc2hvcnRfdGFncyB8Ci0JCUNGR1RCTF9UcmFuc19lbmFibGVfZGlyZWN0ZWRfbXNpeCwKLQkJJihoLT5jZmd0YWJsZS0+SG9zdFdyaXRlLlRyYW5zcG9ydFJlcXVlc3QpKTsKKwl3cml0ZWwoMCwgJmgtPmNmZ3RhYmxlLT5Ib3N0V3JpdGUuY29tbWFuZF9wb29sX2FkZHJfaGkpOworCXdyaXRlbCh0cmFuc01ldGhvZCwgJihoLT5jZmd0YWJsZS0+SG9zdFdyaXRlLlRyYW5zcG9ydFJlcXVlc3QpKTsKKwkvKgorCSAqIGVuYWJsZSBvdXRib3VuZCBpbnRlcnJ1cHQgY29hbGVzY2luZyBpbiBhY2NlbGVyYXRvciBtb2RlOworCSAqLworCWlmICh0cmFuc19zdXBwb3J0ICYgQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMSkgeworCQlhY2Nlc3MgPSBTQTVfaW9hY2NlbF9tb2RlMV9hY2Nlc3M7CisJCXdyaXRlbCgxMCwgJmgtPmNmZ3RhYmxlLT5Ib3N0V3JpdGUuQ29hbEludERlbGF5KTsKKwkJd3JpdGVsKDQsICZoLT5jZmd0YWJsZS0+SG9zdFdyaXRlLkNvYWxJbnRDb3VudCk7CisJfSBlbHNlIHsKKwkJaWYgKHRyYW5zX3N1cHBvcnQgJiBDRkdUQkxfVHJhbnNfaW9fYWNjZWwyKSB7CisJCQlhY2Nlc3MgPSBTQTVfaW9hY2NlbF9tb2RlMl9hY2Nlc3M7CisJCQl3cml0ZWwoMTAsICZoLT5jZmd0YWJsZS0+SG9zdFdyaXRlLkNvYWxJbnREZWxheSk7CisJCQl3cml0ZWwoNCwgJmgtPmNmZ3RhYmxlLT5Ib3N0V3JpdGUuQ29hbEludENvdW50KTsKKwkJfQorCX0KIAl3cml0ZWwoQ0ZHVEJMX0NoYW5nZVJlcSwgaC0+dmFkZHIgKyBTQTVfRE9PUkJFTEwpOwogCWhwc2Ffd2FpdF9mb3JfbW9kZV9jaGFuZ2VfYWNrKGgpOwogCXJlZ2lzdGVyX3ZhbHVlID0gcmVhZGwoJihoLT5jZmd0YWJsZS0+VHJhbnNwb3J0QWN0aXZlKSk7CkBAIC01MTYyLDIzICs3MzA0LDE4NiBAQAogCQlyZXR1cm47CiAJfQogCS8qIENoYW5nZSB0aGUgYWNjZXNzIG1ldGhvZHMgdG8gdGhlIHBlcmZvcm1hbnQgYWNjZXNzIG1ldGhvZHMgKi8KLQloLT5hY2Nlc3MgPSBTQTVfcGVyZm9ybWFudF9hY2Nlc3M7Ci0JaC0+dHJhbnNNZXRob2QgPSBDRkdUQkxfVHJhbnNfUGVyZm9ybWFudDsKKwloLT5hY2Nlc3MgPSBhY2Nlc3M7CisJaC0+dHJhbnNNZXRob2QgPSB0cmFuc01ldGhvZDsKKworCWlmICghKCh0cmFuc19zdXBwb3J0ICYgQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMSkgfHwKKwkJKHRyYW5zX3N1cHBvcnQgJiBDRkdUQkxfVHJhbnNfaW9fYWNjZWwyKSkpCisJCXJldHVybjsKKworCWlmICh0cmFuc19zdXBwb3J0ICYgQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMSkgeworCQkvKiBTZXQgdXAgSS9PIGFjY2VsZXJhdG9yIG1vZGUgKi8KKwkJZm9yIChpID0gMDsgaSA8IGgtPm5yZXBseV9xdWV1ZXM7IGkrKykgeworCQkJd3JpdGVsKGksIGgtPnZhZGRyICsgSU9BQ0NFTF9NT0RFMV9SRVBMWV9RVUVVRV9JTkRFWCk7CisJCQloLT5yZXBseV9xdWV1ZVtpXS5jdXJyZW50X2VudHJ5ID0KKwkJCQlyZWFkbChoLT52YWRkciArIElPQUNDRUxfTU9ERTFfUFJPRFVDRVJfSU5ERVgpOworCQl9CisJCWJmdFs3XSA9IGgtPmlvYWNjZWxfbWF4c2cgKyA4OworCQljYWxjX2J1Y2tldF9tYXAoYmZ0LCBBUlJBWV9TSVpFKGJmdCksIGgtPmlvYWNjZWxfbWF4c2csIDgsCisJCQkJaC0+aW9hY2NlbDFfYmxvY2tGZXRjaFRhYmxlKTsKKworCQkvKiBpbml0aWFsaXplIGFsbCByZXBseSBxdWV1ZSBlbnRyaWVzIHRvIHVudXNlZCAqLworCQltZW1zZXQoaC0+cmVwbHlfcG9vbCwgKHU4KSBJT0FDQ0VMX01PREUxX1JFUExZX1VOVVNFRCwKKwkJCQloLT5yZXBseV9wb29sX3NpemUpOworCisJCS8qIHNldCBhbGwgdGhlIGNvbnN0YW50IGZpZWxkcyBpbiB0aGUgYWNjZWxlcmF0b3IgY29tbWFuZAorCQkgKiBmcmFtZXMgb25jZSBhdCBpbml0IHRpbWUgdG8gc2F2ZSBDUFUgY3ljbGVzIGxhdGVyLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IGgtPm5yX2NtZHM7IGkrKykgeworCQkJc3RydWN0IGlvX2FjY2VsMV9jbWQgKmNwID0gJmgtPmlvYWNjZWxfY21kX3Bvb2xbaV07CisKKwkJCWNwLT5mdW5jdGlvbiA9IElPQUNDRUwxX0ZVTkNUSU9OX1NDU0lJTzsKKwkJCWNwLT5lcnJfaW5mbyA9ICh1MzIpIChoLT5lcnJpbmZvX3Bvb2xfZGhhbmRsZSArCisJCQkJCShpICogc2l6ZW9mKHN0cnVjdCBFcnJvckluZm8pKSk7CisJCQljcC0+ZXJyX2luZm9fbGVuID0gc2l6ZW9mKHN0cnVjdCBFcnJvckluZm8pOworCQkJY3AtPnNnbF9vZmZzZXQgPSBJT0FDQ0VMMV9TR0xPRkZTRVQ7CisJCQljcC0+aG9zdF9jb250ZXh0X2ZsYWdzID0gSU9BQ0NFTDFfSENGTEFHU19DSVNTX0ZPUk1BVDsKKwkJCWNwLT50aW1lb3V0X3NlYyA9IDA7CisJCQljcC0+UmVwbHlRdWV1ZSA9IDA7CisJCQljcC0+VGFnLmxvd2VyID0gKGkgPDwgRElSRUNUX0xPT0tVUF9TSElGVCkgfAorCQkJCQkJRElSRUNUX0xPT0tVUF9CSVQ7CisJCQljcC0+VGFnLnVwcGVyID0gMDsKKwkJCWNwLT5ob3N0X2FkZHIubG93ZXIgPQorCQkJCSh1MzIpIChoLT5pb2FjY2VsX2NtZF9wb29sX2RoYW5kbGUgKworCQkJCQkoaSAqIHNpemVvZihzdHJ1Y3QgaW9fYWNjZWwxX2NtZCkpKTsKKwkJCWNwLT5ob3N0X2FkZHIudXBwZXIgPSAwOworCQl9CisJfSBlbHNlIGlmICh0cmFuc19zdXBwb3J0ICYgQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMikgeworCQl1NjQgY2ZnX29mZnNldCwgY2ZnX2Jhc2VfYWRkcl9pbmRleDsKKwkJdTMyIGJmdDJfb2Zmc2V0LCBjZmdfYmFzZV9hZGRyOworCQlpbnQgcmM7CisKKwkJcmMgPSBocHNhX2ZpbmRfY2ZnX2FkZHJzKGgtPnBkZXYsIGgtPnZhZGRyLCAmY2ZnX2Jhc2VfYWRkciwKKwkJCSZjZmdfYmFzZV9hZGRyX2luZGV4LCAmY2ZnX29mZnNldCk7CisJCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaW9fYWNjZWwyX2NtZCwgc2cpICE9IDY0KTsKKwkJYmZ0MlsxNV0gPSBoLT5pb2FjY2VsX21heHNnICsgSFBTQV9JT0FDQ0VMMl9IRUFERVJfU1o7CisJCWNhbGNfYnVja2V0X21hcChiZnQyLCBBUlJBWV9TSVpFKGJmdDIpLCBoLT5pb2FjY2VsX21heHNnLAorCQkJCTQsIGgtPmlvYWNjZWwyX2Jsb2NrRmV0Y2hUYWJsZSk7CisJCWJmdDJfb2Zmc2V0ID0gcmVhZGwoJmgtPmNmZ3RhYmxlLT5pb19hY2NlbF9yZXF1ZXN0X3NpemVfb2Zmc2V0KTsKKwkJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBDZmdUYWJsZSwKKwkJCQlpb19hY2NlbF9yZXF1ZXN0X3NpemVfb2Zmc2V0KSAhPSAweGI4KTsKKwkJaC0+aW9hY2NlbDJfYmZ0Ml9yZWdzID0KKwkJCXJlbWFwX3BjaV9tZW0ocGNpX3Jlc291cmNlX3N0YXJ0KGgtPnBkZXYsCisJCQkJCWNmZ19iYXNlX2FkZHJfaW5kZXgpICsKKwkJCQkJY2ZnX29mZnNldCArIGJmdDJfb2Zmc2V0LAorCQkJCQlBUlJBWV9TSVpFKGJmdDIpICoKKwkJCQkJc2l6ZW9mKCpoLT5pb2FjY2VsMl9iZnQyX3JlZ3MpKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmZ0Mik7IGkrKykKKwkJCXdyaXRlbChiZnQyW2ldLCAmaC0+aW9hY2NlbDJfYmZ0Ml9yZWdzW2ldKTsKKwl9CisJd3JpdGVsKENGR1RCTF9DaGFuZ2VSZXEsIGgtPnZhZGRyICsgU0E1X0RPT1JCRUxMKTsKKwlocHNhX3dhaXRfZm9yX21vZGVfY2hhbmdlX2FjayhoKTsKK30KKworc3RhdGljIGludCBocHNhX2FsbG9jX2lvYWNjZWxfY21kX2FuZF9iZnQoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwloLT5pb2FjY2VsX21heHNnID0KKwkJcmVhZGwoJihoLT5jZmd0YWJsZS0+aW9fYWNjZWxfbWF4X2VtYmVkZGVkX3NnX2NvdW50KSk7CisJaWYgKGgtPmlvYWNjZWxfbWF4c2cgPiBJT0FDQ0VMMV9NQVhTR0VOVFJJRVMpCisJCWgtPmlvYWNjZWxfbWF4c2cgPSBJT0FDQ0VMMV9NQVhTR0VOVFJJRVM7CisKKwkvKiBDb21tYW5kIHN0cnVjdHVyZXMgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTI4LWJ5dGUgYm91bmRhcnkKKwkgKiBiZWNhdXNlIHRoZSA3IGxvd2VyIGJpdHMgb2YgdGhlIGFkZHJlc3MgYXJlIHVzZWQgYnkgdGhlCisJICogaGFyZHdhcmUuCisJICovCisjZGVmaW5lIElPQUNDRUwxX0NPTU1BTkRMSVNUX0FMSUdOTUVOVCAxMjgKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBpb19hY2NlbDFfY21kKSAlCisJCQlJT0FDQ0VMMV9DT01NQU5ETElTVF9BTElHTk1FTlQpOworCWgtPmlvYWNjZWxfY21kX3Bvb2wgPQorCQlwY2lfYWxsb2NfY29uc2lzdGVudChoLT5wZGV2LAorCQkJaC0+bnJfY21kcyAqIHNpemVvZigqaC0+aW9hY2NlbF9jbWRfcG9vbCksCisJCQkmKGgtPmlvYWNjZWxfY21kX3Bvb2xfZGhhbmRsZSkpOworCisJaC0+aW9hY2NlbDFfYmxvY2tGZXRjaFRhYmxlID0KKwkJa21hbGxvYygoKGgtPmlvYWNjZWxfbWF4c2cgKyAxKSAqCisJCQkJc2l6ZW9mKHUzMikpLCBHRlBfS0VSTkVMKTsKKworCWlmICgoaC0+aW9hY2NlbF9jbWRfcG9vbCA9PSBOVUxMKSB8fAorCQkoaC0+aW9hY2NlbDFfYmxvY2tGZXRjaFRhYmxlID09IE5VTEwpKQorCQlnb3RvIGNsZWFuX3VwOworCisJbWVtc2V0KGgtPmlvYWNjZWxfY21kX3Bvb2wsIDAsCisJCWgtPm5yX2NtZHMgKiBzaXplb2YoKmgtPmlvYWNjZWxfY21kX3Bvb2wpKTsKKwlyZXR1cm4gMDsKKworY2xlYW5fdXA6CisJaWYgKGgtPmlvYWNjZWxfY21kX3Bvb2wpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaC0+cGRldiwKKwkJCWgtPm5yX2NtZHMgKiBzaXplb2YoKmgtPmlvYWNjZWxfY21kX3Bvb2wpLAorCQkJaC0+aW9hY2NlbF9jbWRfcG9vbCwgaC0+aW9hY2NlbF9jbWRfcG9vbF9kaGFuZGxlKTsKKwlrZnJlZShoLT5pb2FjY2VsMV9ibG9ja0ZldGNoVGFibGUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGlvYWNjZWwyX2FsbG9jX2NtZHNfYW5kX2JmdChzdHJ1Y3QgY3Rscl9pbmZvICpoKQoreworCS8qIEFsbG9jYXRlIGlvYWNjZWwyIG1vZGUgY29tbWFuZCBibG9ja3MgYW5kIGJsb2NrIGZldGNoIHRhYmxlICovCisKKwloLT5pb2FjY2VsX21heHNnID0KKwkJcmVhZGwoJihoLT5jZmd0YWJsZS0+aW9fYWNjZWxfbWF4X2VtYmVkZGVkX3NnX2NvdW50KSk7CisJaWYgKGgtPmlvYWNjZWxfbWF4c2cgPiBJT0FDQ0VMMl9NQVhTR0VOVFJJRVMpCisJCWgtPmlvYWNjZWxfbWF4c2cgPSBJT0FDQ0VMMl9NQVhTR0VOVFJJRVM7CisKKyNkZWZpbmUgSU9BQ0NFTDJfQ09NTUFORExJU1RfQUxJR05NRU5UIDEyOAorCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGlvX2FjY2VsMl9jbWQpICUKKwkJCUlPQUNDRUwyX0NPTU1BTkRMSVNUX0FMSUdOTUVOVCk7CisJaC0+aW9hY2NlbDJfY21kX3Bvb2wgPQorCQlwY2lfYWxsb2NfY29uc2lzdGVudChoLT5wZGV2LAorCQkJaC0+bnJfY21kcyAqIHNpemVvZigqaC0+aW9hY2NlbDJfY21kX3Bvb2wpLAorCQkJJihoLT5pb2FjY2VsMl9jbWRfcG9vbF9kaGFuZGxlKSk7CisKKwloLT5pb2FjY2VsMl9ibG9ja0ZldGNoVGFibGUgPQorCQlrbWFsbG9jKCgoaC0+aW9hY2NlbF9tYXhzZyArIDEpICoKKwkJCQlzaXplb2YodTMyKSksIEdGUF9LRVJORUwpOworCisJaWYgKChoLT5pb2FjY2VsMl9jbWRfcG9vbCA9PSBOVUxMKSB8fAorCQkoaC0+aW9hY2NlbDJfYmxvY2tGZXRjaFRhYmxlID09IE5VTEwpKQorCQlnb3RvIGNsZWFuX3VwOworCisJbWVtc2V0KGgtPmlvYWNjZWwyX2NtZF9wb29sLCAwLAorCQloLT5ucl9jbWRzICogc2l6ZW9mKCpoLT5pb2FjY2VsMl9jbWRfcG9vbCkpOworCXJldHVybiAwOworCitjbGVhbl91cDoKKwlpZiAoaC0+aW9hY2NlbDJfY21kX3Bvb2wpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaC0+cGRldiwKKwkJCWgtPm5yX2NtZHMgKiBzaXplb2YoKmgtPmlvYWNjZWwyX2NtZF9wb29sKSwKKwkJCWgtPmlvYWNjZWwyX2NtZF9wb29sLCBoLT5pb2FjY2VsMl9jbWRfcG9vbF9kaGFuZGxlKTsKKwlrZnJlZShoLT5pb2FjY2VsMl9ibG9ja0ZldGNoVGFibGUpOworCXJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBocHNhX3B1dF9jdGxyX2ludG9fcGVyZm9ybWFudF9tb2RlKHN0cnVjdCBjdGxyX2luZm8gKmgpCiB7CiAJdTMyIHRyYW5zX3N1cHBvcnQ7CisJdW5zaWduZWQgbG9uZyB0cmFuc01ldGhvZCA9IENGR1RCTF9UcmFuc19QZXJmb3JtYW50IHwKKwkJCQkJQ0ZHVEJMX1RyYW5zX3VzZV9zaG9ydF90YWdzOwogCWludCBpOwogCiAJaWYgKGhwc2Ffc2ltcGxlX21vZGUpCiAJCXJldHVybjsKIAorCS8qIENoZWNrIGZvciBJL08gYWNjZWxlcmF0b3IgbW9kZSBzdXBwb3J0ICovCisJaWYgKHRyYW5zX3N1cHBvcnQgJiBDRkdUQkxfVHJhbnNfaW9fYWNjZWwxKSB7CisJCXRyYW5zTWV0aG9kIHw9IENGR1RCTF9UcmFuc19pb19hY2NlbDEgfAorCQkJCUNGR1RCTF9UcmFuc19lbmFibGVfZGlyZWN0ZWRfbXNpeDsKKwkJaWYgKGhwc2FfYWxsb2NfaW9hY2NlbF9jbWRfYW5kX2JmdChoKSkKKwkJCWdvdG8gY2xlYW5fdXA7CisJfSBlbHNlIHsKKwkJaWYgKHRyYW5zX3N1cHBvcnQgJiBDRkdUQkxfVHJhbnNfaW9fYWNjZWwyKSB7CisJCQkJdHJhbnNNZXRob2QgfD0gQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMiB8CisJCQkJQ0ZHVEJMX1RyYW5zX2VuYWJsZV9kaXJlY3RlZF9tc2l4OworCQlpZiAoaW9hY2NlbDJfYWxsb2NfY21kc19hbmRfYmZ0KGgpKQorCQkJZ290byBjbGVhbl91cDsKKwkJfQorCX0KKworCS8qIFRPRE8sIGNoZWNrIHRoYXQgdGhpcyBuZXh0IGxpbmUgaC0+bnJlcGx5X3F1ZXVlcyBpcyBjb3JyZWN0ICovCiAJdHJhbnNfc3VwcG9ydCA9IHJlYWRsKCYoaC0+Y2ZndGFibGUtPlRyYW5zcG9ydFN1cHBvcnQpKTsKIAlpZiAoISh0cmFuc19zdXBwb3J0ICYgUEVSRk9STUFOVF9NT0RFKSkKIAkJcmV0dXJuOwogCi0JaC0+bnJlcGx5X3F1ZXVlcyA9IGgtPm1zaXhfdmVjdG9yID8gTUFYX1JFUExZX1FVRVVFUyA6IDE7CisJaC0+bnJlcGx5X3F1ZXVlcyA9IGgtPm1zaXhfdmVjdG9yID4gMCA/IGgtPm1zaXhfdmVjdG9yIDogMTsKIAlocHNhX2dldF9tYXhfcGVyZl9tb2RlX2NtZHMoaCk7CiAJLyogUGVyZm9ybWFudCBtb2RlIHJpbmcgYnVmZmVyIGFuZCBzdXBwb3J0aW5nIGRhdGEgc3RydWN0dXJlcyAqLwogCWgtPnJlcGx5X3Bvb2xfc2l6ZSA9IGgtPm1heF9jb21tYW5kcyAqIHNpemVvZih1NjQpICogaC0+bnJlcGx5X3F1ZXVlczsKQEAgLTUyMDAsOSArNzUwNSw3IEBACiAJCXx8IChoLT5ibG9ja0ZldGNoVGFibGUgPT0gTlVMTCkpCiAJCWdvdG8gY2xlYW5fdXA7CiAKLQlocHNhX2VudGVyX3BlcmZvcm1hbnRfbW9kZShoLAotCQl0cmFuc19zdXBwb3J0ICYgQ0ZHVEJMX1RyYW5zX3VzZV9zaG9ydF90YWdzKTsKLQorCWhwc2FfZW50ZXJfcGVyZm9ybWFudF9tb2RlKGgsIHRyYW5zX3N1cHBvcnQpOwogCXJldHVybjsKIAogY2xlYW5fdXA6CkBAIC01MjEyLDYgKzc1MTUsMzEgQEAKIAlrZnJlZShoLT5ibG9ja0ZldGNoVGFibGUpOwogfQogCitzdGF0aWMgaW50IGlzX2FjY2VsZXJhdGVkX2NtZChzdHJ1Y3QgQ29tbWFuZExpc3QgKmMpCit7CisJcmV0dXJuIGMtPmNtZF90eXBlID09IENNRF9JT0FDQ0VMMSB8fCBjLT5jbWRfdHlwZSA9PSBDTURfSU9BQ0NFTDI7Cit9CisKK3N0YXRpYyB2b2lkIGhwc2FfZHJhaW5fYWNjZWxfY29tbWFuZHMoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGFjY2VsX2NtZHNfb3V0OworCisJZG8geyAvKiB3YWl0IGZvciBhbGwgb3V0c3RhbmRpbmcgY29tbWFuZHMgdG8gZHJhaW4gb3V0ICovCisJCWFjY2VsX2NtZHNfb3V0ID0gMDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmaC0+Y21wUSwgbGlzdCkKKwkJCWFjY2VsX2NtZHNfb3V0ICs9IGlzX2FjY2VsZXJhdGVkX2NtZChjKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmaC0+cmVxUSwgbGlzdCkKKwkJCWFjY2VsX2NtZHNfb3V0ICs9IGlzX2FjY2VsZXJhdGVkX2NtZChjKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+bG9jaywgZmxhZ3MpOworCQlpZiAoYWNjZWxfY21kc19vdXQgPD0gMCkKKwkJCWJyZWFrOworCQltc2xlZXAoMTAwKTsKKwl9IHdoaWxlICgxKTsKK30KKwogLyoKICAqICBUaGlzIGlzIGl0LiAgUmVnaXN0ZXIgdGhlIFBDSSBkcml2ZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBjYXJkcyB3ZSBjb250cm9sCiAgKiAgdGhlIE9TIHdpbGwgY2FsbCBvdXIgcmVnaXN0ZXJlZCByb3V0aW5lcyB3aGVuIGl0IGZpbmRzIG9uZSBvZiBvdXIgY2FyZHMuCkBAIC01MjI2LDUgKzc1NTQsODMgQEAKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmhwc2FfcGNpX2RyaXZlcik7CiB9CiAKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIHZlcmlmeV9vZmZzZXRzKHZvaWQpCit7CisjZGVmaW5lIFZFUklGWV9PRkZTRVQobWVtYmVyLCBvZmZzZXQpIFwKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHJhaWRfbWFwX2RhdGEsIG1lbWJlcikgIT0gb2Zmc2V0KQorCisJVkVSSUZZX09GRlNFVChzdHJ1Y3R1cmVfc2l6ZSwgMCk7CisJVkVSSUZZX09GRlNFVCh2b2x1bWVfYmxrX3NpemUsIDQpOworCVZFUklGWV9PRkZTRVQodm9sdW1lX2Jsa19jbnQsIDgpOworCVZFUklGWV9PRkZTRVQocGh5c19ibGtfc2hpZnQsIDE2KTsKKwlWRVJJRllfT0ZGU0VUKHBhcml0eV9yb3RhdGlvbl9zaGlmdCwgMTcpOworCVZFUklGWV9PRkZTRVQoc3RyaXBfc2l6ZSwgMTgpOworCVZFUklGWV9PRkZTRVQoZGlza19zdGFydGluZ19ibGssIDIwKTsKKwlWRVJJRllfT0ZGU0VUKGRpc2tfYmxrX2NudCwgMjgpOworCVZFUklGWV9PRkZTRVQoZGF0YV9kaXNrc19wZXJfcm93LCAzNik7CisJVkVSSUZZX09GRlNFVChtZXRhZGF0YV9kaXNrc19wZXJfcm93LCAzOCk7CisJVkVSSUZZX09GRlNFVChyb3dfY250LCA0MCk7CisJVkVSSUZZX09GRlNFVChsYXlvdXRfbWFwX2NvdW50LCA0Mik7CisJVkVSSUZZX09GRlNFVChmbGFncywgNDQpOworCVZFUklGWV9PRkZTRVQoZGVraW5kZXgsIDQ2KTsKKwkvKiBWRVJJRllfT0ZGU0VUKHJlc2VydmVkLCA0OCAqLworCVZFUklGWV9PRkZTRVQoZGF0YSwgNjQpOworCisjdW5kZWYgVkVSSUZZX09GRlNFVAorCisjZGVmaW5lIFZFUklGWV9PRkZTRVQobWVtYmVyLCBvZmZzZXQpIFwKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGlvX2FjY2VsMl9jbWQsIG1lbWJlcikgIT0gb2Zmc2V0KQorCisJVkVSSUZZX09GRlNFVChJVV90eXBlLCAwKTsKKwlWRVJJRllfT0ZGU0VUKGRpcmVjdGlvbiwgMSk7CisJVkVSSUZZX09GRlNFVChyZXBseV9xdWV1ZSwgMik7CisJLyogVkVSSUZZX09GRlNFVChyZXNlcnZlZDEsIDMpOyAgKi8KKwlWRVJJRllfT0ZGU0VUKHNjc2lfbmV4dXMsIDQpOworCVZFUklGWV9PRkZTRVQoVGFnLCA4KTsKKwlWRVJJRllfT0ZGU0VUKGNkYiwgMTYpOworCVZFUklGWV9PRkZTRVQoY2Npc3NfbHVuLCAzMik7CisJVkVSSUZZX09GRlNFVChkYXRhX2xlbiwgNDApOworCVZFUklGWV9PRkZTRVQoY21kX3ByaW9yaXR5X3Rhc2tfYXR0ciwgNDQpOworCVZFUklGWV9PRkZTRVQoc2dfY291bnQsIDQ1KTsKKwkvKiBWRVJJRllfT0ZGU0VUKHJlc2VydmVkMyAqLworCVZFUklGWV9PRkZTRVQoZXJyX3B0ciwgNDgpOworCVZFUklGWV9PRkZTRVQoZXJyX2xlbiwgNTYpOworCS8qIFZFUklGWV9PRkZTRVQocmVzZXJ2ZWQ0ICAqLworCVZFUklGWV9PRkZTRVQoc2csIDY0KTsKKworI3VuZGVmIFZFUklGWV9PRkZTRVQKKworI2RlZmluZSBWRVJJRllfT0ZGU0VUKG1lbWJlciwgb2Zmc2V0KSBcCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBpb19hY2NlbDFfY21kLCBtZW1iZXIpICE9IG9mZnNldCkKKworCVZFUklGWV9PRkZTRVQoZGV2X2hhbmRsZSwgMHgwMCk7CisJVkVSSUZZX09GRlNFVChyZXNlcnZlZDEsIDB4MDIpOworCVZFUklGWV9PRkZTRVQoZnVuY3Rpb24sIDB4MDMpOworCVZFUklGWV9PRkZTRVQocmVzZXJ2ZWQyLCAweDA0KTsKKwlWRVJJRllfT0ZGU0VUKGVycl9pbmZvLCAweDBDKTsKKwlWRVJJRllfT0ZGU0VUKHJlc2VydmVkMywgMHgxMCk7CisJVkVSSUZZX09GRlNFVChlcnJfaW5mb19sZW4sIDB4MTIpOworCVZFUklGWV9PRkZTRVQocmVzZXJ2ZWQ0LCAweDEzKTsKKwlWRVJJRllfT0ZGU0VUKHNnbF9vZmZzZXQsIDB4MTQpOworCVZFUklGWV9PRkZTRVQocmVzZXJ2ZWQ1LCAweDE1KTsKKwlWRVJJRllfT0ZGU0VUKHRyYW5zZmVyX2xlbiwgMHgxQyk7CisJVkVSSUZZX09GRlNFVChyZXNlcnZlZDYsIDB4MjApOworCVZFUklGWV9PRkZTRVQoaW9fZmxhZ3MsIDB4MjQpOworCVZFUklGWV9PRkZTRVQocmVzZXJ2ZWQ3LCAweDI2KTsKKwlWRVJJRllfT0ZGU0VUKExVTiwgMHgzNCk7CisJVkVSSUZZX09GRlNFVChjb250cm9sLCAweDNDKTsKKwlWRVJJRllfT0ZGU0VUKENEQiwgMHg0MCk7CisJVkVSSUZZX09GRlNFVChyZXNlcnZlZDgsIDB4NTApOworCVZFUklGWV9PRkZTRVQoaG9zdF9jb250ZXh0X2ZsYWdzLCAweDYwKTsKKwlWRVJJRllfT0ZGU0VUKHRpbWVvdXRfc2VjLCAweDYyKTsKKwlWRVJJRllfT0ZGU0VUKFJlcGx5UXVldWUsIDB4NjQpOworCVZFUklGWV9PRkZTRVQocmVzZXJ2ZWQ5LCAweDY1KTsKKwlWRVJJRllfT0ZGU0VUKFRhZywgMHg2OCk7CisJVkVSSUZZX09GRlNFVChob3N0X2FkZHIsIDB4NzApOworCVZFUklGWV9PRkZTRVQoQ0lTU19MVU4sIDB4NzgpOworCVZFUklGWV9PRkZTRVQoU0csIDB4NzggKyA4KTsKKyN1bmRlZiBWRVJJRllfT0ZGU0VUCit9CisKIG1vZHVsZV9pbml0KGhwc2FfaW5pdCk7CiBtb2R1bGVfZXhpdChocHNhX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hwc2EuaCBiL2RyaXZlcnMvc2NzaS9ocHNhLmgKaW5kZXggMDFjMzI4My4uNDQyMzVhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hwc2EuaAorKysgYi9kcml2ZXJzL3Njc2kvaHBzYS5oCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqICAgIERpc2sgQXJyYXkgZHJpdmVyIGZvciBIUCBTbWFydCBBcnJheSBTQVMgY29udHJvbGxlcnMKLSAqICAgIENvcHlyaWdodCAyMDAwLCAyMDA5IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCisgKiAgICBDb3B5cmlnaHQgMjAwMCwgMjAxNCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgogICoKICAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNDYsNiArNDYsMTUgQEAKIAl1bnNpZ25lZCBjaGFyIHZlbmRvcls4XTsgICAgICAgIC8qIGJ5dGVzIDgtMTUgb2YgaW5xdWlyeSBkYXRhICovCiAJdW5zaWduZWQgY2hhciBtb2RlbFsxNl07ICAgICAgICAvKiBieXRlcyAxNi0zMSBvZiBpbnF1aXJ5IGRhdGEgKi8KIAl1bnNpZ25lZCBjaGFyIHJhaWRfbGV2ZWw7CS8qIGZyb20gaW5xdWlyeSBwYWdlIDB4QzEgKi8KKwl1bnNpZ25lZCBjaGFyIHZvbHVtZV9vZmZsaW5lOwkvKiBkaXNjb3ZlcmVkIHZpYSBUVVIgb3IgVlBEICovCisJdTMyIGlvYWNjZWxfaGFuZGxlOworCWludCBvZmZsb2FkX2NvbmZpZzsJCS8qIEkvTyBhY2NlbCBSQUlEIG9mZmxvYWQgY29uZmlndXJlZCAqLworCWludCBvZmZsb2FkX2VuYWJsZWQ7CQkvKiBJL08gYWNjZWwgUkFJRCBvZmZsb2FkIGVuYWJsZWQgKi8KKwlpbnQgb2ZmbG9hZF90b19taXJyb3I7CQkvKiBTZW5kIG5leHQgSS9PIGFjY2VsZXJhdG9yIFJBSUQKKwkJCQkJICogb2ZmbG9hZCByZXF1ZXN0IHRvIG1pcnJvciBkcml2ZQorCQkJCQkgKi8KKwlzdHJ1Y3QgcmFpZF9tYXBfZGF0YSByYWlkX21hcDsJLyogSS9PIGFjY2VsZXJhdG9yIFJBSUQgbWFwICovCisKIH07CiAKIHN0cnVjdCByZXBseV9wb29sIHsKQEAgLTU1LDYgKzY0LDQ2IEBACiAJdTMyIGN1cnJlbnRfZW50cnk7CiB9OwogCisjcHJhZ21hIHBhY2soMSkKK3N0cnVjdCBibWljX2NvbnRyb2xsZXJfcGFyYW1ldGVycyB7CisJdTggICBsZWRfZmxhZ3M7CisJdTggICBlbmFibGVfY29tbWFuZF9saXN0X3ZlcmlmaWNhdGlvbjsKKwl1OCAgIGJhY2tlZF9vdXRfd3JpdGVfZHJpdmVzOworCXUxNiAgc3RyaXBlc19mb3JfcGFyaXR5OworCXU4ICAgcGFyaXR5X2Rpc3RyaWJ1dGlvbl9tb2RlX2ZsYWdzOworCXUxNiAgbWF4X2RyaXZlcl9yZXF1ZXN0czsKKwl1MTYgIGVsZXZhdG9yX3RyZW5kX2NvdW50OworCXU4ICAgZGlzYWJsZV9lbGV2YXRvcjsKKwl1OCAgIGZvcmNlX3NjYW5fY29tcGxldGU7CisJdTggICBzY3NpX3RyYW5zZmVyX21vZGU7CisJdTggICBmb3JjZV9uYXJyb3c7CisJdTggICByZWJ1aWxkX3ByaW9yaXR5OworCXU4ICAgZXhwYW5kX3ByaW9yaXR5OworCXU4ICAgaG9zdF9zZGJfYXNpY19maXg7CisJdTggICBwZHBpX2J1cnN0X2Zyb21faG9zdF9kaXNhYmxlZDsKKwljaGFyIHNvZnR3YXJlX25hbWVbNjRdOworCWNoYXIgaGFyZHdhcmVfbmFtZVszMl07CisJdTggICBicmlkZ2VfcmV2aXNpb247CisJdTggICBzbmFwc2hvdF9wcmlvcml0eTsKKwl1MzIgIG9zX3NwZWNpZmljOworCXU4ICAgcG9zdF9wcm9tcHRfdGltZW91dDsKKwl1OCAgIGF1dG9tYXRpY19kcml2ZV9zbGFtbWluZzsKKwl1OCAgIHJlc2VydmVkMTsKKwl1OCAgIG52cmFtX2ZsYWdzOworCXU4ICAgY2FjaGVfbnZyYW1fZmxhZ3M7CisJdTggICBkcml2ZV9jb25maWdfZmxhZ3M7CisJdTE2ICByZXNlcnZlZDI7CisJdTggICB0ZW1wX3dhcm5pbmdfbGV2ZWw7CisJdTggICB0ZW1wX3NodXRkb3duX2xldmVsOworCXU4ICAgdGVtcF9jb25kaXRpb25fcmVzZXQ7CisJdTggICBtYXhfY29hbGVzY2VfY29tbWFuZHM7CisJdTMyICBtYXhfY29hbGVzY2VfZGVsYXk7CisJdTggICBvcmNhX3Bhc3N3b3JkWzRdOworCXU4ICAgYWNjZXNzX2lkWzE2XTsKKwl1OCAgIHJlc2VydmVkWzM1Nl07Cit9OworI3ByYWdtYSBwYWNrKCkKKwogc3RydWN0IGN0bHJfaW5mbyB7CiAJaW50CWN0bHI7CiAJY2hhcglkZXZuYW1lWzhdOwpAQCAtODAsNiArMTI5LDcgQEAKIAl1bnNpZ25lZCBpbnQgbXNpX3ZlY3RvcjsKIAlpbnQgaW50cl9tb2RlOyAvKiBlaXRoZXIgUEVSRl9NT0RFX0lOVCBvciBTSU1QTEVfTU9ERV9JTlQgKi8KIAlzdHJ1Y3QgYWNjZXNzX21ldGhvZCBhY2Nlc3M7CisJY2hhciBoYmFfbW9kZV9lbmFibGVkOwogCiAJLyogcXVldWUgYW5kIHF1ZXVlIEluZm8gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHJlcVE7CkBAIC05NSw2ICsxNDUsMTAgQEAKIAkvKiBwb2ludGVycyB0byBjb21tYW5kIGFuZCBlcnJvciBpbmZvIHBvb2wgKi8KIAlzdHJ1Y3QgQ29tbWFuZExpc3QgCSpjbWRfcG9vbDsKIAlkbWFfYWRkcl90CQljbWRfcG9vbF9kaGFuZGxlOworCXN0cnVjdCBpb19hY2NlbDFfY21kCSppb2FjY2VsX2NtZF9wb29sOworCWRtYV9hZGRyX3QJCWlvYWNjZWxfY21kX3Bvb2xfZGhhbmRsZTsKKwlzdHJ1Y3QgaW9fYWNjZWwyX2NtZAkqaW9hY2NlbDJfY21kX3Bvb2w7CisJZG1hX2FkZHJfdAkJaW9hY2NlbDJfY21kX3Bvb2xfZGhhbmRsZTsKIAlzdHJ1Y3QgRXJyb3JJbmZvIAkqZXJyaW5mb19wb29sOwogCWRtYV9hZGRyX3QJCWVycmluZm9fcG9vbF9kaGFuZGxlOwogCXVuc2lnbmVkIGxvbmcgIAkJKmNtZF9wb29sX2JpdHM7CkBAIC0xMjgsNyArMTgyLDE0IEBACiAJdTggbnJlcGx5X3F1ZXVlczsKIAlkbWFfYWRkcl90IHJlcGx5X3Bvb2xfZGhhbmRsZTsKIAl1MzIgKmJsb2NrRmV0Y2hUYWJsZTsKKwl1MzIgKmlvYWNjZWwxX2Jsb2NrRmV0Y2hUYWJsZTsKKwl1MzIgKmlvYWNjZWwyX2Jsb2NrRmV0Y2hUYWJsZTsKKwl1MzIgKmlvYWNjZWwyX2JmdDJfcmVnczsKIAl1bnNpZ25lZCBjaGFyICpoYmFfaW5xdWlyeV9kYXRhOworCXUzMiBkcml2ZXJfc3VwcG9ydDsKKwl1MzIgZndfc3VwcG9ydDsKKwlpbnQgaW9hY2NlbF9zdXBwb3J0OworCWludCBpb2FjY2VsX21heHNnOwogCXU2NCBsYXN0X2ludHJfdGltZXN0YW1wOwogCXUzMiBsYXN0X2hlYXJ0YmVhdDsKIAl1NjQgbGFzdF9oZWFydGJlYXRfdGltZXN0YW1wOwpAQCAtMTYxLDcgKzIyMiwzNSBAQAogI2RlZmluZSBIUFNBVE1GX0xPR19RUllfVEFTSyAgICAoMSA8PCAyMykKICNkZWZpbmUgSFBTQVRNRl9MT0dfUVJZX1RTRVQgICAgKDEgPDwgMjQpCiAjZGVmaW5lIEhQU0FUTUZfTE9HX1FSWV9BU1lOQyAgICgxIDw8IDI1KQorCXUzMiBldmVudHM7CisjZGVmaW5lIENUTFJfU1RBVEVfQ0hBTkdFX0VWRU5UCQkJCSgxIDw8IDApCisjZGVmaW5lIENUTFJfRU5DTE9TVVJFX0hPVF9QTFVHX0VWRU5UCQkJKDEgPDwgMSkKKyNkZWZpbmUgQ1RMUl9TVEFURV9DSEFOR0VfRVZFTlRfUEhZU0lDQUxfRFJWCQkoMSA8PCA0KQorI2RlZmluZSBDVExSX1NUQVRFX0NIQU5HRV9FVkVOVF9MT0dJQ0FMX0RSVgkJKDEgPDwgNSkKKyNkZWZpbmUgQ1RMUl9TVEFURV9DSEFOR0VfRVZFTlRfUkVEVU5EQU5UX0NOVFJMCQkoMSA8PCA2KQorI2RlZmluZSBDVExSX1NUQVRFX0NIQU5HRV9FVkVOVF9BSU9fRU5BQkxFRF9ESVNBQkxFRAkoMSA8PCAzMCkKKyNkZWZpbmUgQ1RMUl9TVEFURV9DSEFOR0VfRVZFTlRfQUlPX0NPTkZJR19DSEFOR0UJKDEgPDwgMzEpCisKKyNkZWZpbmUgUkVTQ0FOX1JFUVVJUkVEX0VWRU5UX0JJVFMgXAorCQkoQ1RMUl9TVEFURV9DSEFOR0VfRVZFTlQgfCBcCisJCUNUTFJfRU5DTE9TVVJFX0hPVF9QTFVHX0VWRU5UIHwgXAorCQlDVExSX1NUQVRFX0NIQU5HRV9FVkVOVF9QSFlTSUNBTF9EUlYgfCBcCisJCUNUTFJfU1RBVEVfQ0hBTkdFX0VWRU5UX0xPR0lDQUxfRFJWIHwgXAorCQlDVExSX1NUQVRFX0NIQU5HRV9FVkVOVF9SRURVTkRBTlRfQ05UUkwgfCBcCisJCUNUTFJfU1RBVEVfQ0hBTkdFX0VWRU5UX0FJT19FTkFCTEVEX0RJU0FCTEVEIHwgXAorCQlDVExSX1NUQVRFX0NIQU5HRV9FVkVOVF9BSU9fQ09ORklHX0NIQU5HRSkKKwlzcGlubG9ja190IG9mZmxpbmVfZGV2aWNlX2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBvZmZsaW5lX2RldmljZV9saXN0OworCWludAlhY2Npb3BhdGhfc3RhdHVzOworCWludAlkcnZfcmVxX3Jlc2NhbjsJLyogZmxhZyBmb3IgZHJpdmVyIHRvIHJlcXVlc3QgcmVzY2FuIGV2ZW50ICovCisJaW50CXJhaWRfb2ZmbG9hZF9kZWJ1ZzsKIH07CisKK3N0cnVjdCBvZmZsaW5lX2RldmljZV9lbnRyeSB7CisJdW5zaWduZWQgY2hhciBzY3NpM2FkZHJbOF07CisJc3RydWN0IGxpc3RfaGVhZCBvZmZsaW5lX2xpc3Q7Cit9OworCiAjZGVmaW5lIEhQU0FfQUJPUlRfTVNHIDAKICNkZWZpbmUgSFBTQV9ERVZJQ0VfUkVTRVRfTVNHIDEKICNkZWZpbmUgSFBTQV9SRVNFVF9UWVBFX0NPTlRST0xMRVIgMHgwMApAQCAtMjQyLDYgKzMzMSwxNCBAQAogCiAjZGVmaW5lIEhQU0FfSU5UUl9PTiAJMQogI2RlZmluZSBIUFNBX0lOVFJfT0ZGCTAKKworLyoKKyAqIEluYm91bmQgUG9zdCBRdWV1ZSBvZmZzZXRzIGZvciBJTyBBY2NlbGVyYXRvciBNb2RlIDIKKyAqLworI2RlZmluZSBJT0FDQ0VMMl9JTkJPVU5EX1BPU1RRXzMyCTB4NDgKKyNkZWZpbmUgSU9BQ0NFTDJfSU5CT1VORF9QT1NUUV82NF9MT1cJMHhkMAorI2RlZmluZSBJT0FDQ0VMMl9JTkJPVU5EX1BPU1RRXzY0X0hJCTB4ZDQKKwogLyoKIAlTZW5kIHRoZSBjb21tYW5kIHRvIHRoZSBoYXJkd2FyZQogKi8KQEAgLTI1NCw2ICszNTEsMTggQEAKIAkodm9pZCkgcmVhZGwoaC0+dmFkZHIgKyBTQTVfU0NSQVRDSFBBRF9PRkZTRVQpOwogfQogCitzdGF0aWMgdm9pZCBTQTVfc3VibWl0X2NvbW1hbmRfaW9hY2NlbDIoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMpCit7CisJZGV2X2RiZygmaC0+cGRldi0+ZGV2LCAiU2VuZGluZyAleCwgdGFnID0gJXhcbiIsIGMtPmJ1c2FkZHIsCisJCWMtPkhlYWRlci5UYWcubG93ZXIpOworCWlmIChjLT5jbWRfdHlwZSA9PSBDTURfSU9BQ0NFTDIpCisJCXdyaXRlbChjLT5idXNhZGRyLCBoLT52YWRkciArIElPQUNDRUwyX0lOQk9VTkRfUE9TVFFfMzIpOworCWVsc2UKKwkJd3JpdGVsKGMtPmJ1c2FkZHIsIGgtPnZhZGRyICsgU0E1X1JFUVVFU1RfUE9SVF9PRkZTRVQpOworCSh2b2lkKSByZWFkbChoLT52YWRkciArIFNBNV9TQ1JBVENIUEFEX09GRlNFVCk7Cit9CisKIC8qCiAgKiAgVGhpcyBjYXJkIGlzIHRoZSBvcHBvc2l0ZSBvZiB0aGUgb3RoZXIgY2FyZHMuCiAgKiAgIDAgdHVybnMgaW50ZXJydXB0cyBvbi4uLgpAQCAtMzg3LDYgKzQ5Niw1MCBAQAogCXJldHVybiByZWdpc3Rlcl92YWx1ZSAmIFNBNV9PVVREQl9TVEFUVVNfUEVSRl9CSVQ7CiB9CiAKKyNkZWZpbmUgU0E1X0lPQUNDRUxfTU9ERTFfSU5UUl9TVEFUVVNfQ01QX0JJVCAgICAweDEwMAorCitzdGF0aWMgYm9vbCBTQTVfaW9hY2NlbF9tb2RlMV9pbnRyX3BlbmRpbmcoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ2lzdGVyX3ZhbHVlID0gcmVhZGwoaC0+dmFkZHIgKyBTQTVfSU5UUl9TVEFUVVMpOworCisJcmV0dXJuIChyZWdpc3Rlcl92YWx1ZSAmIFNBNV9JT0FDQ0VMX01PREUxX0lOVFJfU1RBVFVTX0NNUF9CSVQpID8KKwkJdHJ1ZSA6IGZhbHNlOworfQorCisjZGVmaW5lIElPQUNDRUxfTU9ERTFfUkVQTFlfUVVFVUVfSU5ERVggIDB4MUEwCisjZGVmaW5lIElPQUNDRUxfTU9ERTFfUFJPRFVDRVJfSU5ERVggICAgIDB4MUI4CisjZGVmaW5lIElPQUNDRUxfTU9ERTFfQ09OU1VNRVJfSU5ERVggICAgIDB4MUJDCisjZGVmaW5lIElPQUNDRUxfTU9ERTFfUkVQTFlfVU5VU0VEICAgICAgIDB4RkZGRkZGRkZGRkZGRkZGRlVMTAorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBTQTVfaW9hY2NlbF9tb2RlMV9jb21wbGV0ZWQoc3RydWN0IGN0bHJfaW5mbyAqaCwgdTggcSkKK3sKKwl1NjQgcmVnaXN0ZXJfdmFsdWU7CisJc3RydWN0IHJlcGx5X3Bvb2wgKnJxID0gJmgtPnJlcGx5X3F1ZXVlW3FdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlCVUdfT04ocSA+PSBoLT5ucmVwbHlfcXVldWVzKTsKKworCXJlZ2lzdGVyX3ZhbHVlID0gcnEtPmhlYWRbcnEtPmN1cnJlbnRfZW50cnldOworCWlmIChyZWdpc3Rlcl92YWx1ZSAhPSBJT0FDQ0VMX01PREUxX1JFUExZX1VOVVNFRCkgeworCQlycS0+aGVhZFtycS0+Y3VycmVudF9lbnRyeV0gPSBJT0FDQ0VMX01PREUxX1JFUExZX1VOVVNFRDsKKwkJaWYgKCsrcnEtPmN1cnJlbnRfZW50cnkgPT0gcnEtPnNpemUpCisJCQlycS0+Y3VycmVudF9lbnRyeSA9IDA7CisJCS8qCisJCSAqIEB0b2RvCisJCSAqCisJCSAqIERvbid0IHJlYWxseSBuZWVkIHRvIHdyaXRlIHRoZSBuZXcgaW5kZXggYWZ0ZXIgZWFjaCBjb21tYW5kLAorCQkgKiBidXQgd2l0aCBjdXJyZW50IGRyaXZlciBkZXNpZ24gdGhpcyBpcyBlYXNpZXN0LgorCQkgKi8KKwkJd21iKCk7CisJCXdyaXRlbCgocSA8PCAyNCkgfCBycS0+Y3VycmVudF9lbnRyeSwgaC0+dmFkZHIgKworCQkJCUlPQUNDRUxfTU9ERTFfQ09OU1VNRVJfSU5ERVgpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+bG9jaywgZmxhZ3MpOworCQloLT5jb21tYW5kc19vdXRzdGFuZGluZy0tOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiAodW5zaWduZWQgbG9uZykgcmVnaXN0ZXJfdmFsdWU7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgYWNjZXNzX21ldGhvZCBTQTVfYWNjZXNzID0gewogCVNBNV9zdWJtaXRfY29tbWFuZCwKIAlTQTVfaW50cl9tYXNrLApAQCAtMzk1LDYgKzU0OCwyMiBAQAogCVNBNV9jb21wbGV0ZWQsCiB9OwogCitzdGF0aWMgc3RydWN0IGFjY2Vzc19tZXRob2QgU0E1X2lvYWNjZWxfbW9kZTFfYWNjZXNzID0geworCVNBNV9zdWJtaXRfY29tbWFuZCwKKwlTQTVfcGVyZm9ybWFudF9pbnRyX21hc2ssCisJU0E1X2ZpZm9fZnVsbCwKKwlTQTVfaW9hY2NlbF9tb2RlMV9pbnRyX3BlbmRpbmcsCisJU0E1X2lvYWNjZWxfbW9kZTFfY29tcGxldGVkLAorfTsKKworc3RhdGljIHN0cnVjdCBhY2Nlc3NfbWV0aG9kIFNBNV9pb2FjY2VsX21vZGUyX2FjY2VzcyA9IHsKKwlTQTVfc3VibWl0X2NvbW1hbmRfaW9hY2NlbDIsCisJU0E1X3BlcmZvcm1hbnRfaW50cl9tYXNrLAorCVNBNV9maWZvX2Z1bGwsCisJU0E1X3BlcmZvcm1hbnRfaW50cl9wZW5kaW5nLAorCVNBNV9wZXJmb3JtYW50X2NvbXBsZXRlZCwKK307CisKIHN0YXRpYyBzdHJ1Y3QgYWNjZXNzX21ldGhvZCBTQTVfcGVyZm9ybWFudF9hY2Nlc3MgPSB7CiAJU0E1X3N1Ym1pdF9jb21tYW5kLAogCVNBNV9wZXJmb3JtYW50X2ludHJfbWFzaywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ocHNhX2NtZC5oIGIvZHJpdmVycy9zY3NpL2hwc2FfY21kLmgKaW5kZXggYmZjOGM0ZS4uYjVjYzcwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hwc2FfY21kLmgKKysrIGIvZHJpdmVycy9zY3NpL2hwc2FfY21kLmgKQEAgLTEsNiArMSw2IEBACiAvKgogICogICAgRGlzayBBcnJheSBkcml2ZXIgZm9yIEhQIFNtYXJ0IEFycmF5IFNBUyBjb250cm9sbGVycwotICogICAgQ29weXJpZ2h0IDIwMDAsIDIwMDkgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4KKyAqICAgIENvcHlyaWdodCAyMDAwLCAyMDE0IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCiAgKgogICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0yNSw2ICsyNSw3IEBACiAjZGVmaW5lIFNFTlNFSU5GT0JZVEVTICAgICAgICAgIDMyIC8qIG1heSB2YXJ5IGJldHdlZW4gaGJhcyAqLwogI2RlZmluZSBTR19FTlRSSUVTX0lOX0NNRAkzMiAvKiBNYXggU0cgZW50cmllcyBleGNsdWRpbmcgY2hhaW4gYmxvY2tzICovCiAjZGVmaW5lIEhQU0FfU0dfQ0hBSU4JCTB4ODAwMDAwMDAKKyNkZWZpbmUgSFBTQV9TR19MQVNUCQkweDQwMDAwMDAwCiAjZGVmaW5lIE1BWFJFUExZUVMgICAgICAgICAgICAgIDI1NgogCiAvKiBDb21tYW5kIFN0YXR1cyB2YWx1ZSAqLwpAQCAtNDEsNiArNDIsOCBAQAogI2RlZmluZSBDTURfVU5TT0xJQ0lURURfQUJPUlQgICAweDAwMEEKICNkZWZpbmUgQ01EX1RJTUVPVVQgICAgICAgICAgICAgMHgwMDBCCiAjZGVmaW5lIENNRF9VTkFCT1JUQUJMRQkJMHgwMDBDCisjZGVmaW5lIENNRF9JT0FDQ0VMX0RJU0FCTEVECTB4MDAwRQorCiAKIC8qIFVuaXQgQXR0ZW50aW9ucyBBU0MncyBhcyBkZWZpbmVkIGZvciB0aGUgTVNBMjAxMnNhICovCiAjZGVmaW5lIFBPV0VSX09SX1JFU0VUCQkJMHgyOQpAQCAtNzksOCArODIsOSBAQAogI2RlZmluZSBBVFRSX0FDQSAgICAgICAgICAgICAgICAweDA3CiAKIC8qIGNkYiB0eXBlICovCi0jZGVmaW5lIFRZUEVfQ01ECQkJCTB4MDAKLSNkZWZpbmUgVFlQRV9NU0cJCQkJMHgwMQorI2RlZmluZSBUWVBFX0NNRAkJMHgwMAorI2RlZmluZSBUWVBFX01TRwkJMHgwMQorI2RlZmluZSBUWVBFX0lPQUNDRUwyX0NNRAkweDgxIC8qIDB4ODEgaXMgbm90IHVzZWQgYnkgaGFyZHdhcmUgKi8KIAogLyogTWVzc2FnZSBUeXBlcyAgKi8KICNkZWZpbmUgSFBTQV9UQVNLX01BTkFHRU1FTlQgICAgMHgwMApAQCAtMTI1LDkgKzEyOSwxMiBAQAogI2RlZmluZSBDRkdUQkxfQWNjQ21kcyAgICAgICAgICAweDAwMDAwMDAxbAogI2RlZmluZSBET09SQkVMTF9DVExSX1JFU0VUCTB4MDAwMDAwMDRsCiAjZGVmaW5lIERPT1JCRUxMX0NUTFJfUkVTRVQyCTB4MDAwMDAwMjBsCisjZGVmaW5lIERPT1JCRUxMX0NMRUFSX0VWRU5UUwkweDAwMDAwMDQwbAogCiAjZGVmaW5lIENGR1RCTF9UcmFuc19TaW1wbGUgICAgIDB4MDAwMDAwMDJsCiAjZGVmaW5lIENGR1RCTF9UcmFuc19QZXJmb3JtYW50IDB4MDAwMDAwMDRsCisjZGVmaW5lIENGR1RCTF9UcmFuc19pb19hY2NlbDEJMHgwMDAwMDA4MGwKKyNkZWZpbmUgQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMgkweDAwMDAwMTAwbAogI2RlZmluZSBDRkdUQkxfVHJhbnNfdXNlX3Nob3J0X3RhZ3MgMHgyMDAwMDAwMGwKICNkZWZpbmUgQ0ZHVEJMX1RyYW5zX2VuYWJsZV9kaXJlY3RlZF9tc2l4ICgxIDw8IDMwKQogCkBAIC0xMzUsNiArMTQyLDI4IEBACiAjZGVmaW5lIENGR1RCTF9CdXNUeXBlX1VsdHJhMyAgIDB4MDAwMDAwMDJsCiAjZGVmaW5lIENGR1RCTF9CdXNUeXBlX0ZpYnJlMUcgIDB4MDAwMDAxMDBsCiAjZGVmaW5lIENGR1RCTF9CdXNUeXBlX0ZpYnJlMkcgIDB4MDAwMDAyMDBsCisKKy8qIFZQRCBJbnF1aXJ5IHR5cGVzICovCisjZGVmaW5lIEhQU0FfVlBEX1NVUFBPUlRFRF9QQUdFUyAgICAgICAgMHgwMAorI2RlZmluZSBIUFNBX1ZQRF9MVl9ERVZJQ0VfR0VPTUVUUlkgICAgIDB4QzEKKyNkZWZpbmUgSFBTQV9WUERfTFZfSU9BQ0NFTF9TVEFUVVMgICAgICAweEMyCisjZGVmaW5lIEhQU0FfVlBEX0xWX1NUQVRVUwkJMHhDMworI2RlZmluZSBIUFNBX1ZQRF9IRUFERVJfU1ogICAgICAgICAgICAgIDQKKworLyogTG9naWNhbCB2b2x1bWUgc3RhdGVzICovCisjZGVmaW5lIEhQU0FfVlBEX0xWX1NUQVRVU19VTlNVUFBPUlRFRAkJCS0xCisjZGVmaW5lIEhQU0FfTFZfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBIUFNBX0xWX1VOREVSR09JTkdfRVJBU0UJCQkweDBGCisjZGVmaW5lIEhQU0FfTFZfVU5ERVJHT0lOR19SUEkJCQkJMHgxMgorI2RlZmluZSBIUFNBX0xWX1BFTkRJTkdfUlBJCQkJCTB4MTMKKyNkZWZpbmUgSFBTQV9MVl9FTkNSWVBURURfTk9fS0VZCQkJMHgxNAorI2RlZmluZSBIUFNBX0xWX1BMQUlOVEVYVF9JTl9FTkNSWVBUX09OTFlfQ09OVFJPTExFUgkweDE1CisjZGVmaW5lIEhQU0FfTFZfVU5ERVJHT0lOR19FTkNSWVBUSU9OCQkJMHgxNgorI2RlZmluZSBIUFNBX0xWX1VOREVSR09JTkdfRU5DUllQVElPTl9SRUtFWUlORwkJMHgxNworI2RlZmluZSBIUFNBX0xWX0VOQ1JZUFRFRF9JTl9OT05fRU5DUllQVEVEX0NPTlRST0xMRVIJMHgxOAorI2RlZmluZSBIUFNBX0xWX1BFTkRJTkdfRU5DUllQVElPTgkJCTB4MTkKKyNkZWZpbmUgSFBTQV9MVl9QRU5ESU5HX0VOQ1JZUFRJT05fUkVLRVlJTkcJCTB4MUEKKwogc3RydWN0IHZhbHMzMiB7CiAJdTMyICAgbG93ZXI7CiAJdTMyICAgdXBwZXI7CkBAIC0xNjIsOSArMTkxLDUwIEBACiAKICNkZWZpbmUgSFBTQV9SRVBPUlRfTE9HIDB4YzIgICAgLyogUmVwb3J0IExvZ2ljYWwgTFVOcyAqLwogI2RlZmluZSBIUFNBX1JFUE9SVF9QSFlTIDB4YzMgICAvKiBSZXBvcnQgUGh5c2ljYWwgTFVOcyAqLworI2RlZmluZSBIUFNBX1JFUE9SVF9QSFlTX0VYVEVOREVEIDB4MDIKKyNkZWZpbmUgSFBTQV9DSVNTX1JFQUQJMHhjMAkvKiBDSVNTIFJlYWQgKi8KKyNkZWZpbmUgSFBTQV9HRVRfUkFJRF9NQVAgMHhjOAkvKiBDSVNTIEdldCBSQUlEIExheW91dCBNYXAgKi8KKworI2RlZmluZSBSQUlEX01BUF9NQVhfRU5UUklFUyAgIDI1NgorCitzdHJ1Y3QgcmFpZF9tYXBfZGlza19kYXRhIHsKKwl1MzIgICBpb2FjY2VsX2hhbmRsZTsgICAgICAgICAvKio8IEhhbmRsZSB0byBhY2Nlc3MgdGhpcyBkaXNrIHZpYSB0aGUKKwkJCQkJKiAgSS9PIGFjY2VsZXJhdG9yICovCisJdTggICAgeG9yX211bHRbMl07ICAgICAgICAgICAgLyoqPCBYT1IgbXVsdGlwbGllcnMgZm9yIHRoaXMgcG9zaXRpb24sCisJCQkJCSogIHZhbGlkIGZvciBkYXRhIGRpc2tzIG9ubHkgKi8KKwl1OCAgICByZXNlcnZlZFsyXTsKK307CisKK3N0cnVjdCByYWlkX21hcF9kYXRhIHsKKwl1MzIgICBzdHJ1Y3R1cmVfc2l6ZTsJCS8qIFNpemUgb2YgZW50aXJlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworCXUzMiAgIHZvbHVtZV9ibGtfc2l6ZTsJCS8qIGJ5dGVzIC8gYmxvY2sgaW4gdGhlIHZvbHVtZSAqLworCXU2NCAgIHZvbHVtZV9ibGtfY250OwkJLyogbG9naWNhbCBibG9ja3Mgb24gdGhlIHZvbHVtZSAqLworCXU4ICAgIHBoeXNfYmxrX3NoaWZ0OwkJLyogU2hpZnQgZmFjdG9yIHRvIGNvbnZlcnQgYmV0d2VlbgorCQkJCQkgKiB1bml0cyBvZiBsb2dpY2FsIGJsb2NrcyBhbmQgcGh5c2ljYWwKKwkJCQkJICogZGlzayBibG9ja3MgKi8KKwl1OCAgICBwYXJpdHlfcm90YXRpb25fc2hpZnQ7CS8qIFNoaWZ0IGZhY3RvciB0byBjb252ZXJ0IGJldHdlZW4gdW5pdHMKKwkJCQkJICogb2YgbG9naWNhbCBzdHJpcGVzIGFuZCBwaHlzaWNhbAorCQkJCQkgKiBzdHJpcGVzICovCisJdTE2ICAgc3RyaXBfc2l6ZTsJCS8qIGJsb2NrcyB1c2VkIG9uIGVhY2ggZGlzayAvIHN0cmlwZSAqLworCXU2NCAgIGRpc2tfc3RhcnRpbmdfYmxrOwkvKiBGaXJzdCBkaXNrIGJsb2NrIHVzZWQgaW4gdm9sdW1lICovCisJdTY0ICAgZGlza19ibGtfY250OwkJLyogZGlzayBibG9ja3MgdXNlZCBieSB2b2x1bWUgLyBkaXNrICovCisJdTE2ICAgZGF0YV9kaXNrc19wZXJfcm93OwkvKiBkYXRhIGRpc2sgZW50cmllcyAvIHJvdyBpbiB0aGUgbWFwICovCisJdTE2ICAgbWV0YWRhdGFfZGlza3NfcGVyX3JvdzsJLyogbWlycm9yL3Bhcml0eSBkaXNrIGVudHJpZXMgLyByb3cKKwkJCQkJICogaW4gdGhlIG1hcCAqLworCXUxNiAgIHJvd19jbnQ7CQkJLyogcm93cyBpbiBlYWNoIGxheW91dCBtYXAgKi8KKwl1MTYgICBsYXlvdXRfbWFwX2NvdW50OwkJLyogbGF5b3V0IG1hcHMgKDEgbWFwIHBlciBtaXJyb3IvcGFyaXR5CisJCQkJCSAqIGdyb3VwKSAqLworCXUxNiAgIGZsYWdzOwkJCS8qIEJpdCAwIHNldCBpZiBlbmNyeXB0aW9uIGVuYWJsZWQgKi8KKyNkZWZpbmUgUkFJRF9NQVBfRkxBR19FTkNSWVBUX09OICAweDAxCisJdTE2ICAgZGVraW5kZXg7CQkJLyogRGF0YSBlbmNyeXB0aW9uIGtleSBpbmRleC4gKi8KKwl1OCAgICByZXNlcnZlZFsxNl07CisJc3RydWN0IHJhaWRfbWFwX2Rpc2tfZGF0YSBkYXRhW1JBSURfTUFQX01BWF9FTlRSSUVTXTsKK307CisKIHN0cnVjdCBSZXBvcnRMVU5kYXRhIHsKIAl1OCBMVU5MaXN0TGVuZ3RoWzRdOwotCXUzMiByZXNlcnZlZDsKKwl1OCBleHRlbmRlZF9yZXNwb25zZV9mbGFnOworCXU4IHJlc2VydmVkWzNdOwogCXU4IExVTltIUFNBX01BWF9MVU5dWzhdOwogfTsKIApAQCAtMTg3LDYgKzI1Nyw3IEBACiAjZGVmaW5lIEJNSUNfQ0FDSEVfRkxVU0ggMHhjMgogI2RlZmluZSBIUFNBX0NBQ0hFX0ZMVVNIIDB4MDEJLyogQzIgd2FzIGFscmVhZHkgYmVpbmcgdXNlZCBieSBIUFNBICovCiAjZGVmaW5lIEJNSUNfRkxBU0hfRklSTVdBUkUgMHhGNworI2RlZmluZSBCTUlDX1NFTlNFX0NPTlRST0xMRVJfUEFSQU1FVEVSUyAweDY0CiAKIC8qIENvbW1hbmQgTGlzdCBTdHJ1Y3R1cmUgKi8KIHVuaW9uIFNDU0kzQWRkciB7CkBAIC0yODMsNiArMzU0LDggQEAKIC8qIENvbW1hbmQgdHlwZXMgKi8KICNkZWZpbmUgQ01EX0lPQ1RMX1BFTkQgIDB4MDEKICNkZWZpbmUgQ01EX1NDU0kJMHgwMworI2RlZmluZSBDTURfSU9BQ0NFTDEJMHgwNAorI2RlZmluZSBDTURfSU9BQ0NFTDIJMHgwNQogCiAjZGVmaW5lIERJUkVDVF9MT09LVVBfU0hJRlQgNQogI2RlZmluZSBESVJFQ1RfTE9PS1VQX0JJVCAweDEwCkBAIC0zMTQsNyArMzg3LDYgQEAKIAlpbnQJCQkgICBjbWRfdHlwZTsKIAlsb25nCQkJICAgY21kaW5kZXg7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlzdHJ1Y3QgY29tcGxldGlvbiAqd2FpdGluZzsKIAl2b2lkICAgKnNjc2lfY21kOwogCkBAIC0zMjcsMTYgKzM5OSwxODMgQEAKICAqLwogI2RlZmluZSBJU18zMl9CSVQgKCg4IC0gc2l6ZW9mKGxvbmcpKS80KQogI2RlZmluZSBJU182NF9CSVQgKCFJU18zMl9CSVQpCi0jZGVmaW5lIFBBRF8zMiAoNCkKLSNkZWZpbmUgUEFEXzY0ICg0KQorI2RlZmluZSBQQURfMzIgKDQwKQorI2RlZmluZSBQQURfNjQgKDEyKQogI2RlZmluZSBDT01NQU5ETElTVF9QQUQgKElTXzMyX0JJVCAqIFBBRF8zMiArIElTXzY0X0JJVCAqIFBBRF82NCkKIAl1OCBwYWRbQ09NTUFORExJU1RfUEFEXTsKIH07CiAKKy8qIE1heCBTL0cgZWxlbWVudHMgaW4gSS9PIGFjY2VsZXJhdG9yIGNvbW1hbmQgKi8KKyNkZWZpbmUgSU9BQ0NFTDFfTUFYU0dFTlRSSUVTICAgICAgICAgICAyNAorI2RlZmluZSBJT0FDQ0VMMl9NQVhTR0VOVFJJRVMJCTI4CisKKy8qCisgKiBTdHJ1Y3R1cmUgZm9yIEkvTyBhY2NlbGVyYXRvciAobW9kZSAxKSBjb21tYW5kcy4KKyAqIE5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZSBtdXN0IGJlIDEyOC1ieXRlIGFsaWduZWQgaW4gc2l6ZS4KKyAqLworc3RydWN0IGlvX2FjY2VsMV9jbWQgeworCXUxNiBkZXZfaGFuZGxlOwkJCS8qIDB4MDAgLSAweDAxICovCisJdTggIHJlc2VydmVkMTsJCQkvKiAweDAyICovCisJdTggIGZ1bmN0aW9uOwkJCS8qIDB4MDMgKi8KKwl1OCAgcmVzZXJ2ZWQyWzhdOwkJLyogMHgwNCAtIDB4MEIgKi8KKwl1MzIgZXJyX2luZm87CQkJLyogMHgwQyAtIDB4MEYgKi8KKwl1OCAgcmVzZXJ2ZWQzWzJdOwkJLyogMHgxMCAtIDB4MTEgKi8KKwl1OCAgZXJyX2luZm9fbGVuOwkJLyogMHgxMiAqLworCXU4ICByZXNlcnZlZDQ7CQkJLyogMHgxMyAqLworCXU4ICBzZ2xfb2Zmc2V0OwkJCS8qIDB4MTQgKi8KKwl1OCAgcmVzZXJ2ZWQ1WzddOwkJLyogMHgxNSAtIDB4MUIgKi8KKwl1MzIgdHJhbnNmZXJfbGVuOwkJLyogMHgxQyAtIDB4MUYgKi8KKwl1OCAgcmVzZXJ2ZWQ2WzRdOwkJLyogMHgyMCAtIDB4MjMgKi8KKwl1MTYgaW9fZmxhZ3M7CQkJLyogMHgyNCAtIDB4MjUgKi8KKwl1OCAgcmVzZXJ2ZWQ3WzE0XTsJCS8qIDB4MjYgLSAweDMzICovCisJdTggIExVTls4XTsJCQkvKiAweDM0IC0gMHgzQiAqLworCXUzMiBjb250cm9sOwkJCS8qIDB4M0MgLSAweDNGICovCisJdTggIENEQlsxNl07CQkJLyogMHg0MCAtIDB4NEYgKi8KKwl1OCAgcmVzZXJ2ZWQ4WzE2XTsJCS8qIDB4NTAgLSAweDVGICovCisJdTE2IGhvc3RfY29udGV4dF9mbGFnczsJCS8qIDB4NjAgLSAweDYxICovCisJdTE2IHRpbWVvdXRfc2VjOwkJLyogMHg2MiAtIDB4NjMgKi8KKwl1OCAgUmVwbHlRdWV1ZTsJCQkvKiAweDY0ICovCisJdTggIHJlc2VydmVkOVszXTsJCS8qIDB4NjUgLSAweDY3ICovCisJc3RydWN0IHZhbHMzMiBUYWc7CQkvKiAweDY4IC0gMHg2RiAqLworCXN0cnVjdCB2YWxzMzIgaG9zdF9hZGRyOwkvKiAweDcwIC0gMHg3NyAqLworCXU4ICBDSVNTX0xVTls4XTsJCS8qIDB4NzggLSAweDdGICovCisJc3RydWN0IFNHRGVzY3JpcHRvciBTR1tJT0FDQ0VMMV9NQVhTR0VOVFJJRVNdOworI2RlZmluZSBJT0FDQ0VMMV9QQURfNjQgMAorI2RlZmluZSBJT0FDQ0VMMV9QQURfMzIgMAorI2RlZmluZSBJT0FDQ0VMMV9QQUQgKElTXzMyX0JJVCAqIElPQUNDRUwxX1BBRF8zMiArIFwKKwkJCUlTXzY0X0JJVCAqIElPQUNDRUwxX1BBRF82NCkKKwl1OCBwYWRbSU9BQ0NFTDFfUEFEXTsKK307CisKKyNkZWZpbmUgSU9BQ0NFTDFfRlVOQ1RJT05fU0NTSUlPICAgICAgICAweDAwCisjZGVmaW5lIElPQUNDRUwxX1NHTE9GRlNFVCAgICAgICAgICAgICAgMzIKKworI2RlZmluZSBJT0FDQ0VMMV9JT0ZMQUdTX0lPX1JFUSAgICAgICAgIDB4NDAwMAorI2RlZmluZSBJT0FDQ0VMMV9JT0ZMQUdTX0NEQkxFTl9NQVNLICAgIDB4MDAxRgorI2RlZmluZSBJT0FDQ0VMMV9JT0ZMQUdTX0NEQkxFTl9NQVggICAgIDE2CisKKyNkZWZpbmUgSU9BQ0NFTDFfQ09OVFJPTF9OT0RBVEFYRkVSICAgICAweDAwMDAwMDAwCisjZGVmaW5lIElPQUNDRUwxX0NPTlRST0xfREFUQV9PVVQgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBJT0FDQ0VMMV9DT05UUk9MX0RBVEFfSU4gICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgSU9BQ0NFTDFfQ09OVFJPTF9UQVNLUFJJT19NQVNLICAweDAwMDA3ODAwCisjZGVmaW5lIElPQUNDRUwxX0NPTlRST0xfVEFTS1BSSU9fU0hJRlQgMTEKKyNkZWZpbmUgSU9BQ0NFTDFfQ09OVFJPTF9TSU1QTEVRVUVVRSAgICAweDAwMDAwMDAwCisjZGVmaW5lIElPQUNDRUwxX0NPTlRST0xfSEVBRE9GUVVFVUUgICAgMHgwMDAwMDEwMAorI2RlZmluZSBJT0FDQ0VMMV9DT05UUk9MX09SREVSRURRVUVVRSAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgSU9BQ0NFTDFfQ09OVFJPTF9BQ0EgICAgICAgICAgICAweDAwMDAwNDAwCisKKyNkZWZpbmUgSU9BQ0NFTDFfSENGTEFHU19DSVNTX0ZPUk1BVCAgICAweDAwMTMKKworI2RlZmluZSBJT0FDQ0VMMV9CVVNBRERSX0NNRFRZUEUgICAgICAgIDB4MDAwMDAwNjAKKworc3RydWN0IGlvYWNjZWwyX3NnX2VsZW1lbnQgeworCXU2NCBhZGRyZXNzOworCXUzMiBsZW5ndGg7CisJdTggcmVzZXJ2ZWRbM107CisJdTggY2hhaW5faW5kaWNhdG9yOworI2RlZmluZSBJT0FDQ0VMMl9DSEFJTiAweDgwCit9OworCisvKgorICogU0NTSSBSZXNwb25zZSBGb3JtYXQgc3RydWN0dXJlIGZvciBJTyBBY2NlbGVyYXRvciBNb2RlIDIKKyAqLworc3RydWN0IGlvX2FjY2VsMl9zY3NpX3Jlc3BvbnNlIHsKKwl1OCBJVV90eXBlOworI2RlZmluZSBJT0FDQ0VMMl9JVV9UWVBFX1NSRgkJCTB4NjAKKwl1OCByZXNlcnZlZDFbM107CisJdTggcmVxX2lkWzRdOwkJLyogcmVxdWVzdCBpZGVudGlmaWVyICovCisJdTggcmVzZXJ2ZWQyWzRdOworCXU4IHNlcnZfcmVzcG9uc2U7CQkvKiBzZXJ2aWNlIHJlc3BvbnNlICovCisjZGVmaW5lIElPQUNDRUwyX1NFUlZfUkVTUE9OU0VfQ09NUExFVEUJCTB4MDAwCisjZGVmaW5lIElPQUNDRUwyX1NFUlZfUkVTUE9OU0VfRkFJTFVSRQkJMHgwMDEKKyNkZWZpbmUgSU9BQ0NFTDJfU0VSVl9SRVNQT05TRV9UTUZfQ09NUExFVEUJMHgwMDIKKyNkZWZpbmUgSU9BQ0NFTDJfU0VSVl9SRVNQT05TRV9UTUZfU1VDQ0VTUwkweDAwMworI2RlZmluZSBJT0FDQ0VMMl9TRVJWX1JFU1BPTlNFX1RNRl9SRUpFQ1RFRAkweDAwNAorI2RlZmluZSBJT0FDQ0VMMl9TRVJWX1JFU1BPTlNFX1RNRl9XUk9OR19MVU4JMHgwMDUKKwl1OCBzdGF0dXM7CQkJLyogc3RhdHVzICovCisjZGVmaW5lIElPQUNDRUwyX1NUQVRVU19TUl9UQVNLX0NPTVBfR09PRAkweDAwCisjZGVmaW5lIElPQUNDRUwyX1NUQVRVU19TUl9UQVNLX0NPTVBfQ0hLX0NPTkQJMHgwMgorI2RlZmluZSBJT0FDQ0VMMl9TVEFUVVNfU1JfVEFTS19DT01QX0JVU1kJMHgwOAorI2RlZmluZSBJT0FDQ0VMMl9TVEFUVVNfU1JfVEFTS19DT01QX1JFU19DT04JMHgxOAorI2RlZmluZSBJT0FDQ0VMMl9TVEFUVVNfU1JfVEFTS19DT01QX1NFVF9GVUxMCTB4MjgKKyNkZWZpbmUgSU9BQ0NFTDJfU1RBVFVTX1NSX1RBU0tfQ09NUF9BQk9SVEVECTB4NDAKKyNkZWZpbmUgSU9BQ0NFTDJfU1RBVFVTX1NSX0lPQUNDRUxfRElTQUJMRUQJMHgwRQorCXU4IGRhdGFfcHJlc2VudDsJCS8qIGxvdyAyIGJpdHMgKi8KKyNkZWZpbmUgSU9BQ0NFTDJfTk9fREFUQVBSRVNFTlQJCTB4MDAwCisjZGVmaW5lIElPQUNDRUwyX1JFU1BPTlNFX0RBVEFQUkVTRU5UCTB4MDAxCisjZGVmaW5lIElPQUNDRUwyX1NFTlNFX0RBVEFfUFJFU0VOVAkweDAwMgorI2RlZmluZSBJT0FDQ0VMMl9SRVNFUlZFRAkJMHgwMDMKKwl1OCBzZW5zZV9kYXRhX2xlbjsJCS8qIHNlbnNlL3Jlc3BvbnNlIGRhdGEgbGVuZ3RoICovCisJdTggcmVzaWRfY250WzRdOwkJLyogcmVzaWR1YWwgY291bnQgKi8KKwl1OCBzZW5zZV9kYXRhX2J1ZmZbMzJdOwkJLyogc2Vuc2UvcmVzcG9uc2UgZGF0YSBidWZmZXIgKi8KK307CisKKyNkZWZpbmUgSU9BQ0NFTDJfNjRfUEFEIDc2CisjZGVmaW5lIElPQUNDRUwyXzMyX1BBRCA3NgorI2RlZmluZSBJT0FDQ0VMMl9QQUQgKElTXzMyX0JJVCAqIElPQUNDRUwyXzMyX1BBRCArIFwKKwkJCUlTXzY0X0JJVCAqIElPQUNDRUwyXzY0X1BBRCkKKy8qCisgKiBTdHJ1Y3R1cmUgZm9yIEkvTyBhY2NlbGVyYXRvciAobW9kZSAyIG9yIG0yKSBjb21tYW5kcy4KKyAqIE5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZSBtdXN0IGJlIDEyOC1ieXRlIGFsaWduZWQgaW4gc2l6ZS4KKyAqLworc3RydWN0IGlvX2FjY2VsMl9jbWQgeworCXU4ICBJVV90eXBlOwkJCS8qIElVIFR5cGUgKi8KKwl1OCAgZGlyZWN0aW9uOwkJCS8qIGRpcmVjdGlvbiwgbWVtdHlwZSwgYW5kIGVuY3J5cHRpb24gKi8KKyNkZWZpbmUgSU9BQ0NFTDJfRElSRUNUSU9OX01BU0sJCTB4MDMgLyogYml0cyAwLDE6IGRpcmVjdGlvbiAgKi8KKyNkZWZpbmUgSU9BQ0NFTDJfRElSRUNUSU9OX01FTVRZUEVfTUFTSwkweDA0IC8qIGJpdCAyOiBtZW10eXBlIHNvdXJjZS9kZXN0ICovCisJCQkJCSAgICAgLyogICAgIDBiPVBDSWUsIDFiPUREUiAqLworI2RlZmluZSBJT0FDQ0VMMl9ESVJFQ1RJT05fRU5DUllQVF9NQVNLCTB4MDggLyogYml0IDM6IGVuY3J5cHRpb24gZmxhZyAqLworCQkJCQkgICAgIC8qICAgICAwPW9mZiwgMT1vbiAqLworCXU4ICByZXBseV9xdWV1ZTsJCS8qIFJlcGx5IFF1ZXVlIElEICovCisJdTggIHJlc2VydmVkMTsJCQkvKiBSZXNlcnZlZCAqLworCXUzMiBzY3NpX25leHVzOwkJCS8qIERldmljZSBIYW5kbGUgKi8KKwl1MzIgVGFnOwkJCS8qIGNjaXNzIHRhZywgbG93ZXIgNCBieXRlcyBvbmx5ICovCisJdTMyIHR3ZWFrX2xvd2VyOwkJLyogRW5jcnlwdGlvbiB0d2VhaywgbG93ZXIgNCBieXRlcyAqLworCXU4ICBjZGJbMTZdOwkJCS8qIFNDU0kgQ29tbWFuZCBEZXNjcmlwdG9yIEJsb2NrICovCisJdTggIGNjaXNzX2x1bls4XTsJCS8qIDggYnl0ZSBTQ1NJIGFkZHJlc3MgKi8KKwl1MzIgZGF0YV9sZW47CQkJLyogVG90YWwgYnl0ZXMgdG8gdHJhbnNmZXIgKi8KKwl1OCAgY21kX3ByaW9yaXR5X3Rhc2tfYXR0cjsJLyogcHJpb3JpdHkgYW5kIHRhc2sgYXR0cnMgKi8KKyNkZWZpbmUgSU9BQ0NFTDJfUFJJT1JJVFlfTUFTSyAweDc4CisjZGVmaW5lIElPQUNDRUwyX0FUVFJfTUFTSyAweDA3CisJdTggIHNnX2NvdW50OwkJCS8qIE51bWJlciBvZiBzZyBlbGVtZW50cyAqLworCXUxNiBkZWtpbmRleDsJCQkvKiBEYXRhIGVuY3J5cHRpb24ga2V5IGluZGV4ICovCisJdTY0IGVycl9wdHI7CQkJLyogRXJyb3IgUG9pbnRlciAqLworCXUzMiBlcnJfbGVuOwkJCS8qIEVycm9yIExlbmd0aCovCisJdTMyIHR3ZWFrX3VwcGVyOwkJLyogRW5jcnlwdGlvbiB0d2VhaywgdXBwZXIgNCBieXRlcyAqLworCXN0cnVjdCBpb2FjY2VsMl9zZ19lbGVtZW50IHNnW0lPQUNDRUwyX01BWFNHRU5UUklFU107CisJc3RydWN0IGlvX2FjY2VsMl9zY3NpX3Jlc3BvbnNlIGVycm9yX2RhdGE7CisJdTggcGFkW0lPQUNDRUwyX1BBRF07Cit9OworCisvKgorICogZGVmaW5lcyBmb3IgTW9kZSAyIGNvbW1hbmQgc3RydWN0CisgKiBGSVhNRTogdGhpcyBjYW4ndCBiZSBhbGwgSSBuZWVkIG1mbQorICovCisjZGVmaW5lIElPQUNDRUwyX0lVX1RZUEUJMHg0MAorI2RlZmluZSBJT0FDQ0VMMl9JVV9UTUZfVFlQRQkweDQxCisjZGVmaW5lIElPQUNDRUwyX0RJUl9OT19EQVRBCTB4MDAKKyNkZWZpbmUgSU9BQ0NFTDJfRElSX0RBVEFfSU4JMHgwMQorI2RlZmluZSBJT0FDQ0VMMl9ESVJfREFUQV9PVVQJMHgwMgorLyoKKyAqIFNDU0kgVGFzayBNYW5hZ2VtZW50IFJlcXVlc3QgZm9ybWF0IGZvciBBY2NlbGVyYXRvciBNb2RlIDIKKyAqLworc3RydWN0IGhwc2FfdG1mX3N0cnVjdCB7CisJdTggaXVfdHlwZTsJCS8qIEluZm9ybWF0aW9uIFVuaXQgVHlwZSAqLworCXU4IHJlcGx5X3F1ZXVlOwkJLyogUmVwbHkgUXVldWUgSUQgKi8KKwl1OCB0bWY7CQkJLyogVGFzayBNYW5hZ2VtZW50IEZ1bmN0aW9uICovCisJdTggcmVzZXJ2ZWQxOwkJLyogYnl0ZSAzIFJlc2VydmVkICovCisJdTMyIGl0X25leHVzOwkJLyogU0NTSSBJLVQgTmV4dXMgKi8KKwl1OCBsdW5faWRbOF07CQkvKiBMVU4gSUQgZm9yIFRNRiByZXF1ZXN0ICovCisJc3RydWN0IHZhbHMzMiBUYWc7CS8qIGNjaXNzIHRhZyBhc3NvY2lhdGVkIHcvIHJlcXVlc3QgKi8KKwlzdHJ1Y3QgdmFsczMyIGFib3J0X3RhZzsvKiBjY2lzcyB0YWcgb2YgU0NTSSBjbWQgb3IgdGFzayB0byBhYm9ydCAqLworCXU2NCBlcnJvcl9wdHI7CQkvKiBFcnJvciBQb2ludGVyICovCisJdTMyIGVycm9yX2xlbjsJCS8qIEVycm9yIExlbmd0aCAqLworfTsKKwogLyogQ29uZmlndXJhdGlvbiBUYWJsZSBTdHJ1Y3R1cmUgKi8KIHN0cnVjdCBIb3N0V3JpdGUgewogCXUzMiBUcmFuc3BvcnRSZXF1ZXN0OwotCXUzMiBSZXNlcnZlZDsKKwl1MzIgY29tbWFuZF9wb29sX2FkZHJfaGk7CiAJdTMyIENvYWxJbnREZWxheTsKIAl1MzIgQ29hbEludENvdW50OwogfTsKQEAgLTM0NCw2ICs1ODMsOSBAQAogI2RlZmluZSBTSU1QTEVfTU9ERSAgICAgMHgwMgogI2RlZmluZSBQRVJGT1JNQU5UX01PREUgMHgwNAogI2RlZmluZSBNRU1RX01PREUgICAgICAgMHgwOAorI2RlZmluZSBJT0FDQ0VMX01PREVfMSAgMHg4MAorCisjZGVmaW5lIERSSVZFUl9TVVBQT1JUX1VBX0VOQUJMRSAgICAgICAgMHgwMDAwMDAwMQogCiBzdHJ1Y3QgQ2ZnVGFibGUgewogCXU4ICAgICAgICAgICAgU2lnbmF0dXJlWzRdOwpAQCAtMzczLDggKzYxNSwxOCBAQAogCXUzMgkJbWlzY19md19zdXBwb3J0OyAvKiBvZmZzZXQgMHg3OCAqLwogI2RlZmluZQkJCU1JU0NfRldfRE9PUkJFTExfUkVTRVQgKDB4MDIpCiAjZGVmaW5lCQkJTUlTQ19GV19ET09SQkVMTF9SRVNFVDIgKDB4MDEwKQorI2RlZmluZQkJCU1JU0NfRldfUkFJRF9PRkZMT0FEX0JBU0lDICgweDAyMCkKKyNkZWZpbmUJCQlNSVNDX0ZXX0VWRU5UX05PVElGWSAoMHgwODApCiAJdTgJCWRyaXZlcl92ZXJzaW9uWzMyXTsKLQorCXUzMiAgICAgICAgICAgICBtYXhfY2FjaGVkX3dyaXRlX3NpemU7CisJdTggICAgICAgICAgICAgIGRyaXZlcl9zY3JhdGNocGFkWzE2XTsKKwl1MzIgICAgICAgICAgICAgbWF4X2Vycm9yX2luZm9fbGVuZ3RoOworCXUzMgkJaW9fYWNjZWxfbWF4X2VtYmVkZGVkX3NnX2NvdW50OworCXUzMgkJaW9fYWNjZWxfcmVxdWVzdF9zaXplX29mZnNldDsKKwl1MzIJCWV2ZW50X25vdGlmeTsKKyNkZWZpbmUgSFBTQV9FVkVOVF9OT1RJRllfQUNDRUxfSU9fUEFUSF9TVEFURV9DSEFOR0UgKDEgPDwgMzApCisjZGVmaW5lIEhQU0FfRVZFTlRfTk9USUZZX0FDQ0VMX0lPX1BBVEhfQ09ORklHX0NIQU5HRSAoMSA8PCAzMSkKKwl1MzIJCWNsZWFyX2V2ZW50X25vdGlmeTsKIH07CiAKICNkZWZpbmUgTlVNX0JMT0NLRkVUQ0hfRU5UUklFUyA4CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnN0Z3QuYyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c3RndC5jCmluZGV4IGJmOWVjYTguLjU2ZjhhODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c3RndC5jCisrKyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c3RndC5jCkBAIC01ODksNyArNTg5LDcgQEAKIAl9CiAKIAllcnIgPSByZXF1ZXN0X2lycSh2cG9ydC0+ZG1hX2Rldi0+aXJxLCAmaWJtdnN0Z3RfaW50ZXJydXB0LAotCQkJICBJUlFGX0RJU0FCTEVELCAiaWJtdnN0Z3QiLCB0YXJnZXQpOworCQkJICAwLCAiaWJtdnN0Z3QiLCB0YXJnZXQpOwogCWlmIChlcnIpCiAJCWdvdG8gcmVxX2lycV9mYWlsZWQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pbjIwMDAuYyBiL2RyaXZlcnMvc2NzaS9pbjIwMDAuYwppbmRleCBiZjAyODIxLi5iMWM0ZDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaW4yMDAwLmMKKysrIGIvZHJpdmVycy9zY3NpL2luMjAwMC5jCkBAIC0yMDE1LDcgKzIwMTUsNyBAQAogCQl3cml0ZTFfaW8oMCwgSU9fRklGT19SRUFEKTsJLyogc3RhcnQgZmlmbyBvdXQgaW4gcmVhZCBtb2RlICovCiAJCXdyaXRlMV9pbygwLCBJT19JTlRSX01BU0spOwkvKiBhbGxvdyBhbGwgaW50cyAqLwogCQl4ID0gaW50X3RhYlsoc3dpdGNoZXMgJiAoU1dfSU5UMCB8IFNXX0lOVDEpKSA+PiBTV19JTlRfU0hJRlRdOwotCQlpZiAocmVxdWVzdF9pcnEoeCwgaW4yMDAwX2ludHIsIElSUUZfRElTQUJMRUQsICJpbjIwMDAiLCBpbnN0YW5jZSkpIHsKKwkJaWYgKHJlcXVlc3RfaXJxKHgsIGluMjAwMF9pbnRyLCAwLCAiaW4yMDAwIiwgaW5zdGFuY2UpKSB7CiAJCQlwcmludGsoImluMjAwMF9kZXRlY3Q6IFVuYWJsZSB0byBhbGxvY2F0ZSBJUlEuXG4iKTsKIAkJCWRldGVjdF9jb3VudC0tOwogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaW5pdGlvLmMgYi9kcml2ZXJzL3Njc2kvaW5pdGlvLmMKaW5kZXggMjgwZDVhZi4uZTVkYWU3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2luaXRpby5jCisrKyBiL2RyaXZlcnMvc2NzaS9pbml0aW8uYwpAQCAtMjkzMSw3ICsyOTMxLDcgQEAKIAlzaG9zdC0+YmFzZSA9IGhvc3QtPmFkZHI7CiAJc2hvc3QtPnNnX3RhYmxlc2l6ZSA9IFRPVEFMX1NHX0VOVFJZOwogCi0JZXJyb3IgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIGk5MXVfaW50ciwgSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwgImk5MXUiLCBzaG9zdCk7CisJZXJyb3IgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIGk5MXVfaW50ciwgSVJRRl9TSEFSRUQsICJpOTF1Iiwgc2hvc3QpOwogCWlmIChlcnJvciA8IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiaW5pdGlvOiBVbmFibGUgdG8gcmVxdWVzdCBJUlEgJWRcbiIsIHBkZXYtPmlycSk7CiAJCWdvdG8gb3V0X2ZyZWVfc2NiczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pcHIuYyBiL2RyaXZlcnMvc2NzaS9pcHIuYwppbmRleCAzZjViNTZhLi45MjRiMGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXByLmMKKysrIGIvZHJpdmVycy9zY3NpL2lwci5jCkBAIC0xMTQzLDYgKzExNDMsNyBAQAogCXJlcy0+YWRkX3RvX21sID0gMDsKIAlyZXMtPmRlbF9mcm9tX21sID0gMDsKIAlyZXMtPnJlc2V0dGluZ19kZXZpY2UgPSAwOworCXJlcy0+cmVzZXRfb2NjdXJyZWQgPSAwOwogCXJlcy0+c2RldiA9IE5VTEw7CiAJcmVzLT5zYXRhX3BvcnQgPSBOVUxMOwogCkBAIC0yMzY3LDYgKzIzNjgsNDIgQEAKIH0KIAogLyoqCisgKiBpcHJfbG9nX3NpczY0X2RldmljZV9lcnJvciAtIExvZyBhIGNhY2hlIGVycm9yLgorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKiBAaG9zdHJjYjoJaG9zdHJjYiBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2xvZ19zaXM2NF9kZXZpY2VfZXJyb3Ioc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJCQkgc3RydWN0IGlwcl9ob3N0cmNiICpob3N0cmNiKQoreworCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzIxX2Vycm9yICplcnJvcjsKKwljaGFyIGJ1ZmZlcltJUFJfTUFYX1JFU19QQVRIX0xFTkdUSF07CisKKwllcnJvciA9ICZob3N0cmNiLT5oY2FtLnUuZXJyb3I2NC51LnR5cGVfMjFfZXJyb3I7CisKKwlpcHJfZXJyKCItLS0tLUZhaWxpbmcgRGV2aWNlIEluZm9ybWF0aW9uLS0tLS1cbiIpOworCWlwcl9lcnIoIldvcmxkIFdpZGUgVW5pcXVlIElEOiAlMDhYJTA4WCUwOFglMDhYXG4iLAorCQliZTMyX3RvX2NwdShlcnJvci0+d3duWzBdKSwgYmUzMl90b19jcHUoZXJyb3ItPnd3blsxXSksCisJCSBiZTMyX3RvX2NwdShlcnJvci0+d3duWzJdKSwgYmUzMl90b19jcHUoZXJyb3ItPnd3blszXSkpOworCWlwcl9lcnIoIkRldmljZSBSZXNvdXJjZSBQYXRoOiAlc1xuIiwKKwkJX19pcHJfZm9ybWF0X3Jlc19wYXRoKGVycm9yLT5yZXNfcGF0aCwKKwkJCQkgICAgICBidWZmZXIsIHNpemVvZihidWZmZXIpKSk7CisJZXJyb3ItPnByaW1hcnlfcHJvYmxlbV9kZXNjW3NpemVvZihlcnJvci0+cHJpbWFyeV9wcm9ibGVtX2Rlc2MpIC0gMV0gPSAnXDAnOworCWVycm9yLT5zZWNvbmRfcHJvYmxlbV9kZXNjW3NpemVvZihlcnJvci0+c2Vjb25kX3Byb2JsZW1fZGVzYykgLSAxXSA9ICdcMCc7CisJaXByX2VycigiUHJpbWFyeSBQcm9ibGVtIERlc2NyaXB0aW9uOiAlc1xuIiwgZXJyb3ItPnByaW1hcnlfcHJvYmxlbV9kZXNjKTsKKwlpcHJfZXJyKCJTZWNvbmRhcnkgUHJvYmxlbSBEZXNjcmlwdGlvbjogICVzXG4iLCBlcnJvci0+c2Vjb25kX3Byb2JsZW1fZGVzYyk7CisJaXByX2VycigiU0NTSSBTZW5zZSBEYXRhOlxuIik7CisJaXByX2xvZ19oZXhfZGF0YShpb2FfY2ZnLCBlcnJvci0+c2Vuc2VfZGF0YSwgc2l6ZW9mKGVycm9yLT5zZW5zZV9kYXRhKSk7CisJaXByX2VycigiU0NTSSBDb21tYW5kIERlc2NyaXB0b3IgQmxvY2s6IFxuIik7CisJaXByX2xvZ19oZXhfZGF0YShpb2FfY2ZnLCBlcnJvci0+Y2RiLCBzaXplb2YoZXJyb3ItPmNkYikpOworCisJaXByX2VycigiQWRkaXRpb25hbCBJT0EgRGF0YTpcbiIpOworCWlwcl9sb2dfaGV4X2RhdGEoaW9hX2NmZywgZXJyb3ItPmlvYV9kYXRhLCBiZTMyX3RvX2NwdShlcnJvci0+bGVuZ3RoX29mX2Vycm9yKSk7Cit9CisKKy8qKgogICogaXByX2dldF9lcnJvciAtIEZpbmQgdGhlIHNwZWNmaWVkIElPQVNDIGluIHRoZSBpcHJfZXJyb3JfdGFibGUuCiAgKiBAaW9hc2M6CUlPQVNDCiAgKgpAQCAtMjQ2Nyw2ICsyNTA0LDkgQEAKIAljYXNlIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzIwOgogCQlpcHJfbG9nX2ZhYnJpY19lcnJvcihpb2FfY2ZnLCBob3N0cmNiKTsKIAkJYnJlYWs7CisJY2FzZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF8yMToKKwkJaXByX2xvZ19zaXM2NF9kZXZpY2VfZXJyb3IoaW9hX2NmZywgaG9zdHJjYik7CisJCWJyZWFrOwogCWNhc2UgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfMjM6CiAJCWlwcl9sb2dfc2lzNjRfY29uZmlnX2Vycm9yKGlvYV9jZmcsIGhvc3RyY2IpOwogCQlicmVhazsKQEAgLTM2MzAsMTYgKzM2NzAsMTQgQEAKIAkJcmV0dXJuIHN0cmxlbihidWYpOwogCX0KIAotCWlmIChibGtfaW9wb2xsX2VuYWJsZWQgJiYgaW9hX2NmZy0+aW9wb2xsX3dlaWdodCAmJgotCQkJaW9hX2NmZy0+c2lzNjQgJiYgaW9hX2NmZy0+bnZlY3RvcnMgPiAxKSB7CisJaWYgKGlvYV9jZmctPmlvcG9sbF93ZWlnaHQgJiYgaW9hX2NmZy0+c2lzNjQgJiYgaW9hX2NmZy0+bnZlY3RvcnMgPiAxKSB7CiAJCWZvciAoaSA9IDE7IGkgPCBpb2FfY2ZnLT5ocnJxX251bTsgaSsrKQogCQkJYmxrX2lvcG9sbF9kaXNhYmxlKCZpb2FfY2ZnLT5ocnJxW2ldLmlvcG9sbCk7CiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CiAJaW9hX2NmZy0+aW9wb2xsX3dlaWdodCA9IHVzZXJfaW9wb2xsX3dlaWdodDsKLQlpZiAoYmxrX2lvcG9sbF9lbmFibGVkICYmIGlvYV9jZmctPmlvcG9sbF93ZWlnaHQgJiYKLQkJCWlvYV9jZmctPnNpczY0ICYmIGlvYV9jZmctPm52ZWN0b3JzID4gMSkgeworCWlmIChpb2FfY2ZnLT5pb3BvbGxfd2VpZ2h0ICYmIGlvYV9jZmctPnNpczY0ICYmIGlvYV9jZmctPm52ZWN0b3JzID4gMSkgewogCQlmb3IgKGkgPSAxOyBpIDwgaW9hX2NmZy0+aHJycV9udW07IGkrKykgewogCQkJYmxrX2lvcG9sbF9pbml0KCZpb2FfY2ZnLT5ocnJxW2ldLmlvcG9sbCwKIAkJCQkJaW9hX2NmZy0+aW9wb2xsX3dlaWdodCwgaXByX2lvcG9sbCk7CkBAIC01MDE1LDYgKzUwNTMsNyBAQAogCX0gZWxzZQogCQlyYyA9IGlwcl9kZXZpY2VfcmVzZXQoaW9hX2NmZywgcmVzKTsKIAlyZXMtPnJlc2V0dGluZ19kZXZpY2UgPSAwOworCXJlcy0+cmVzZXRfb2NjdXJyZWQgPSAxOwogCiAJTEVBVkU7CiAJcmV0dXJuIHJjID8gRkFJTEVEIDogU1VDQ0VTUzsKQEAgLTU0ODQsOCArNTUyMyw3IEBACiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKLQlpZiAoYmxrX2lvcG9sbF9lbmFibGVkICYmIGlvYV9jZmctPmlvcG9sbF93ZWlnaHQgJiYKLQkJCWlvYV9jZmctPnNpczY0ICYmIGlvYV9jZmctPm52ZWN0b3JzID4gMSkgeworCWlmIChpb2FfY2ZnLT5pb3BvbGxfd2VpZ2h0ICYmIGlvYV9jZmctPnNpczY0ICYmIGlvYV9jZmctPm52ZWN0b3JzID4gMSkgewogCQlpZiAoKGJlMzJfdG9fY3B1KCpocnJxLT5ocnJxX2N1cnIpICYgSVBSX0hSUlFfVE9HR0xFX0JJVCkgPT0KIAkJICAgICAgIGhycnEtPnRvZ2dsZV9iaXQpIHsKIAkJCWlmICghYmxrX2lvcG9sbF9zY2hlZF9wcmVwKCZocnJxLT5pb3BvbGwpKQpAQCAtNjE4Myw4ICs2MjIxLDEwIEBACiAJCQlpb2FyY2ItPmNtZF9wa3QuZmxhZ3NfaGkgfD0gSVBSX0ZMQUdTX0hJX05PX1VMRU5fQ0hLOwogCiAJCWlvYXJjYi0+Y21kX3BrdC5mbGFnc19oaSB8PSBJUFJfRkxBR1NfSElfTk9fTElOS19ERVNDOwotCQlpZiAoaXByX2lzX2dzY3NpKHJlcykpCisJCWlmIChpcHJfaXNfZ3Njc2kocmVzKSAmJiByZXMtPnJlc2V0X29jY3VycmVkKSB7CisJCQlyZXMtPnJlc2V0X29jY3VycmVkID0gMDsKIAkJCWlvYXJjYi0+Y21kX3BrdC5mbGFnc19sbyB8PSBJUFJfRkxBR1NfTE9fREVMQVlfQUZURVJfUlNUOworCQl9CiAJCWlvYXJjYi0+Y21kX3BrdC5mbGFnc19sbyB8PSBJUFJfRkxBR1NfTE9fQUxJR05FRF9CRlI7CiAJCWlvYXJjYi0+Y21kX3BrdC5mbGFnc19sbyB8PSBpcHJfZ2V0X3Rhc2tfYXR0cmlidXRlcyhzY3NpX2NtZCk7CiAJfQpAQCAtODY0MSw2ICs4NjgxLDI1IEBACiB9CiAKIC8qKgorICogaXByX3BjaV9tbWlvX2VuYWJsZWQgLSBDYWxsZWQgd2hlbiBNTUlPIGhhcyBiZWVuIHJlLWVuYWJsZWQKKyAqIEBwZGV2OglQQ0kgZGV2aWNlIHN0cnVjdAorICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIHRlbGwgdXMgdGhhdCB0aGUgTU1JTworICogYWNjZXNzIHRvIHRoZSBJT0EgaGFzIGJlZW4gcmVzdG9yZWQKKyAqLworc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgaXByX3BjaV9tbWlvX2VuYWJsZWQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJaWYgKCFpb2FfY2ZnLT5wcm9iZV9kb25lKQorCQlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUOworfQorCisvKioKICAqIGlwcl9wY2lfZnJvemVuIC0gQ2FsbGVkIHdoZW4gc2xvdCBoYXMgZXhwZXJpZW5jZWQgYSBQQ0kgYnVzIGVycm9yLgogICogQHBkZXY6CVBDSSBkZXZpY2Ugc3RydWN0CiAgKgpAQCAtODY1NCw3ICs4NzEzLDggQEAKIAlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQlfaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBpcHJfcmVzZXRfZnJlZXplLCBJUFJfU0hVVERPV05fTk9ORSk7CisJaWYgKGlvYV9jZmctPnByb2JlX2RvbmUpCisJCV9pcHJfaW5pdGlhdGVfaW9hX3Jlc2V0KGlvYV9jZmcsIGlwcl9yZXNldF9mcmVlemUsIElQUl9TSFVURE9XTl9OT05FKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogfQogCkBAIC04NjcyLDExICs4NzMyLDE0IEBACiAJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JaWYgKGlvYV9jZmctPm5lZWRzX3dhcm1fcmVzZXQpCi0JCWlwcl9pbml0aWF0ZV9pb2FfcmVzZXQoaW9hX2NmZywgSVBSX1NIVVRET1dOX05PTkUpOwotCWVsc2UKLQkJX2lwcl9pbml0aWF0ZV9pb2FfcmVzZXQoaW9hX2NmZywgaXByX3Jlc2V0X3Jlc3RvcmVfY2ZnX3NwYWNlLAotCQkJCQlJUFJfU0hVVERPV05fTk9ORSk7CisJaWYgKGlvYV9jZmctPnByb2JlX2RvbmUpIHsKKwkJaWYgKGlvYV9jZmctPm5lZWRzX3dhcm1fcmVzZXQpCisJCQlpcHJfaW5pdGlhdGVfaW9hX3Jlc2V0KGlvYV9jZmcsIElQUl9TSFVURE9XTl9OT05FKTsKKwkJZWxzZQorCQkJX2lwcl9pbml0aWF0ZV9pb2FfcmVzZXQoaW9hX2NmZywgaXByX3Jlc2V0X3Jlc3RvcmVfY2ZnX3NwYWNlLAorCQkJCQkJSVBSX1NIVVRET1dOX05PTkUpOworCX0gZWxzZQorCQl3YWtlX3VwX2FsbCgmaW9hX2NmZy0+ZWVoX3dhaXRfcSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gUENJX0VSU19SRVNVTFRfUkVDT1ZFUkVEOwogfQpAQCAtODY5NSwxNyArODc1OCwyMCBAQAogCWludCBpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JaWYgKGlvYV9jZmctPnNkdF9zdGF0ZSA9PSBXQUlUX0ZPUl9EVU1QKQotCQlpb2FfY2ZnLT5zZHRfc3RhdGUgPSBBQk9SVF9EVU1QOwotCWlvYV9jZmctPnJlc2V0X3JldHJpZXMgPSBJUFJfTlVNX1JFU0VUX1JFTE9BRF9SRVRSSUVTIC0gMTsKLQlpb2FfY2ZnLT5pbl9pb2FfYnJpbmdkb3duID0gMTsKLQlmb3IgKGkgPSAwOyBpIDwgaW9hX2NmZy0+aHJycV9udW07IGkrKykgewotCQlzcGluX2xvY2soJmlvYV9jZmctPmhycnFbaV0uX2xvY2spOwotCQlpb2FfY2ZnLT5ocnJxW2ldLmFsbG93X2NtZHMgPSAwOwotCQlzcGluX3VubG9jaygmaW9hX2NmZy0+aHJycVtpXS5fbG9jayk7Ci0JfQotCXdtYigpOwotCWlwcl9pbml0aWF0ZV9pb2FfcmVzZXQoaW9hX2NmZywgSVBSX1NIVVRET1dOX05PTkUpOworCWlmIChpb2FfY2ZnLT5wcm9iZV9kb25lKSB7CisJCWlmIChpb2FfY2ZnLT5zZHRfc3RhdGUgPT0gV0FJVF9GT1JfRFVNUCkKKwkJCWlvYV9jZmctPnNkdF9zdGF0ZSA9IEFCT1JUX0RVTVA7CisJCWlvYV9jZmctPnJlc2V0X3JldHJpZXMgPSBJUFJfTlVNX1JFU0VUX1JFTE9BRF9SRVRSSUVTIC0gMTsKKwkJaW9hX2NmZy0+aW5faW9hX2JyaW5nZG93biA9IDE7CisJCWZvciAoaSA9IDA7IGkgPCBpb2FfY2ZnLT5ocnJxX251bTsgaSsrKSB7CisJCQlzcGluX2xvY2soJmlvYV9jZmctPmhycnFbaV0uX2xvY2spOworCQkJaW9hX2NmZy0+aHJycVtpXS5hbGxvd19jbWRzID0gMDsKKwkJCXNwaW5fdW5sb2NrKCZpb2FfY2ZnLT5ocnJxW2ldLl9sb2NrKTsKKwkJfQorCQl3bWIoKTsKKwkJaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBJUFJfU0hVVERPV05fTk9ORSk7CisJfSBlbHNlCisJCXdha2VfdXBfYWxsKCZpb2FfY2ZnLT5lZWhfd2FpdF9xKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogfQogCkBAIC04NzI1LDcgKzg3OTEsNyBAQAogCXN3aXRjaCAoc3RhdGUpIHsKIAljYXNlIHBjaV9jaGFubmVsX2lvX2Zyb3plbjoKIAkJaXByX3BjaV9mcm96ZW4ocGRldik7Ci0JCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUOworCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfQ0FOX1JFQ09WRVI7CiAJY2FzZSBwY2lfY2hhbm5lbF9pb19wZXJtX2ZhaWx1cmU6CiAJCWlwcl9wY2lfcGVybV9mYWlsdXJlKHBkZXYpOwogCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVDsKQEAgLTg3NTUsNiArODgyMSw3IEBACiAJRU5URVI7CiAJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBob3N0X2xvY2tfZmxhZ3MpOwogCWRldl9kYmcoJmlvYV9jZmctPnBkZXYtPmRldiwgImlvYV9jZmcgYWR4OiAweCVwXG4iLCBpb2FfY2ZnKTsKKwlpb2FfY2ZnLT5wcm9iZV9kb25lID0gMTsKIAlpZiAoaW9hX2NmZy0+bmVlZHNfaGFyZF9yZXNldCkgewogCQlpb2FfY2ZnLT5uZWVkc19oYXJkX3Jlc2V0ID0gMDsKIAkJaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBJUFJfU0hVVERPV05fTk9ORSk7CkBAIC05MDMwLDE2ICs5MDk3LDYgQEAKIAlpZiAoIWlvYV9jZmctPnZwZF9jYnMpCiAJCWdvdG8gb3V0X2ZyZWVfcmVzX2VudHJpZXM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgaW9hX2NmZy0+aHJycV9udW07IGkrKykgewotCQlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+aHJycVtpXS5ocnJxX2ZyZWVfcSk7Ci0JCUlOSVRfTElTVF9IRUFEKCZpb2FfY2ZnLT5ocnJxW2ldLmhycnFfcGVuZGluZ19xKTsKLQkJc3Bpbl9sb2NrX2luaXQoJmlvYV9jZmctPmhycnFbaV0uX2xvY2spOwotCQlpZiAoaSA9PSAwKQotCQkJaW9hX2NmZy0+aHJycVtpXS5sb2NrID0gaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrOwotCQllbHNlCi0JCQlpb2FfY2ZnLT5ocnJxW2ldLmxvY2sgPSAmaW9hX2NmZy0+aHJycVtpXS5fbG9jazsKLQl9Ci0KIAlpZiAoaXByX2FsbG9jX2NtZF9ibGtzKGlvYV9jZmcpKQogCQlnb3RvIG91dF9mcmVlX3ZwZF9jYnM7CiAKQEAgLTkxNDAsNjEgKzkxOTcsMTggQEAKIH0KIAogLyoqCi0gKiBpcHJfaW5pdF9pb2FfY2ZnIC0gSW5pdGlhbGl6ZSBJT0EgY29uZmlnIHN0cnVjdAorICogaXByX2luaXRfcmVncyAtIEluaXRpYWxpemUgSU9BIHJlZ2lzdGVycwogICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0Ci0gKiBAaG9zdDoJCXNjc2kgaG9zdCBzdHJ1Y3QKLSAqIEBwZGV2OgkJUENJIGRldiBzdHJ1Y3QKICAqCiAgKiBSZXR1cm4gdmFsdWU6Ci0gKiAJbm9uZQorICoJbm9uZQogICoqLwotc3RhdGljIHZvaWQgaXByX2luaXRfaW9hX2NmZyhzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCi0JCQkgICAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIHZvaWQgaXByX2luaXRfcmVncyhzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCiB7CiAJY29uc3Qgc3RydWN0IGlwcl9pbnRlcnJ1cHRfb2Zmc2V0cyAqcDsKIAlzdHJ1Y3QgaXByX2ludGVycnVwdHMgKnQ7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCi0JaW9hX2NmZy0+aG9zdCA9IGhvc3Q7Ci0JaW9hX2NmZy0+cGRldiA9IHBkZXY7Ci0JaW9hX2NmZy0+bG9nX2xldmVsID0gaXByX2xvZ19sZXZlbDsKLQlpb2FfY2ZnLT5kb29yYmVsbCA9IElQUl9ET09SQkVMTDsKLQlzcHJpbnRmKGlvYV9jZmctPmV5ZV9jYXRjaGVyLCBJUFJfRVlFQ0FUQ0hFUik7Ci0Jc3ByaW50Zihpb2FfY2ZnLT50cmFjZV9zdGFydCwgSVBSX1RSQUNFX1NUQVJUX0xBQkVMKTsKLQlzcHJpbnRmKGlvYV9jZmctPmNmZ190YWJsZV9zdGFydCwgSVBSX0NGR19UQkxfU1RBUlQpOwotCXNwcmludGYoaW9hX2NmZy0+cmVzb3VyY2VfdGFibGVfbGFiZWwsIElQUl9SRVNfVEFCTEVfTEFCRUwpOwotCXNwcmludGYoaW9hX2NmZy0+aXByX2hjYW1fbGFiZWwsIElQUl9IQ0FNX0xBQkVMKTsKLQlzcHJpbnRmKGlvYV9jZmctPmlwcl9jbWRfbGFiZWwsIElQUl9DTURfTEFCRUwpOwotCi0JSU5JVF9MSVNUX0hFQUQoJmlvYV9jZmctPmhvc3RyY2JfZnJlZV9xKTsKLQlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+aG9zdHJjYl9wZW5kaW5nX3EpOwotCUlOSVRfTElTVF9IRUFEKCZpb2FfY2ZnLT5mcmVlX3Jlc19xKTsKLQlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+dXNlZF9yZXNfcSk7Ci0JSU5JVF9XT1JLKCZpb2FfY2ZnLT53b3JrX3EsIGlwcl93b3JrZXJfdGhyZWFkKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpb2FfY2ZnLT5yZXNldF93YWl0X3EpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlvYV9jZmctPm1zaV93YWl0X3EpOwotCWlvYV9jZmctPnNkdF9zdGF0ZSA9IElOQUNUSVZFOwotCi0JaXByX2luaXRpYWxpemVfYnVzX2F0dHIoaW9hX2NmZyk7Ci0JaW9hX2NmZy0+bWF4X2RldnNfc3VwcG9ydGVkID0gaXByX21heF9kZXZzOwotCi0JaWYgKGlvYV9jZmctPnNpczY0KSB7Ci0JCWhvc3QtPm1heF9pZCA9IElQUl9NQVhfU0lTNjRfVEFSR0VUU19QRVJfQlVTOwotCQlob3N0LT5tYXhfbHVuID0gSVBSX01BWF9TSVM2NF9MVU5TX1BFUl9UQVJHRVQ7Ci0JCWlmIChpcHJfbWF4X2RldnMgPiBJUFJfTUFYX1NJUzY0X0RFVlMpCi0JCQlpb2FfY2ZnLT5tYXhfZGV2c19zdXBwb3J0ZWQgPSBJUFJfTUFYX1NJUzY0X0RFVlM7Ci0JfSBlbHNlIHsKLQkJaG9zdC0+bWF4X2lkID0gSVBSX01BWF9OVU1fVEFSR0VUU19QRVJfQlVTOwotCQlob3N0LT5tYXhfbHVuID0gSVBSX01BWF9OVU1fTFVOU19QRVJfVEFSR0VUOwotCQlpZiAoaXByX21heF9kZXZzID4gSVBSX01BWF9QSFlTSUNBTF9ERVZTKQotCQkJaW9hX2NmZy0+bWF4X2RldnNfc3VwcG9ydGVkID0gSVBSX01BWF9QSFlTSUNBTF9ERVZTOwotCX0KLQlob3N0LT5tYXhfY2hhbm5lbCA9IElQUl9NQVhfQlVTX1RPX1NDQU47Ci0JaG9zdC0+dW5pcXVlX2lkID0gaG9zdC0+aG9zdF9ubzsKLQlob3N0LT5tYXhfY21kX2xlbiA9IElQUl9NQVhfQ0RCX0xFTjsKLQlob3N0LT5jYW5fcXVldWUgPSBpb2FfY2ZnLT5tYXhfY21kczsKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgaW9hX2NmZyk7Ci0KIAlwID0gJmlvYV9jZmctPmNoaXBfY2ZnLT5yZWdzOwogCXQgPSAmaW9hX2NmZy0+cmVnczsKIAliYXNlID0gaW9hX2NmZy0+aGR3X2RtYV9yZWdzOwpAQCAtOTIyNSw2ICs5MjM5LDc5IEBACiB9CiAKIC8qKgorICogaXByX2luaXRfaW9hX2NmZyAtIEluaXRpYWxpemUgSU9BIGNvbmZpZyBzdHJ1Y3QKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQGhvc3Q6CQlzY3NpIGhvc3Qgc3RydWN0CisgKiBAcGRldjoJCVBDSSBkZXYgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9pbml0X2lvYV9jZmcoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJICAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpbnQgaTsKKworCWlvYV9jZmctPmhvc3QgPSBob3N0OworCWlvYV9jZmctPnBkZXYgPSBwZGV2OworCWlvYV9jZmctPmxvZ19sZXZlbCA9IGlwcl9sb2dfbGV2ZWw7CisJaW9hX2NmZy0+ZG9vcmJlbGwgPSBJUFJfRE9PUkJFTEw7CisJc3ByaW50Zihpb2FfY2ZnLT5leWVfY2F0Y2hlciwgSVBSX0VZRUNBVENIRVIpOworCXNwcmludGYoaW9hX2NmZy0+dHJhY2Vfc3RhcnQsIElQUl9UUkFDRV9TVEFSVF9MQUJFTCk7CisJc3ByaW50Zihpb2FfY2ZnLT5jZmdfdGFibGVfc3RhcnQsIElQUl9DRkdfVEJMX1NUQVJUKTsKKwlzcHJpbnRmKGlvYV9jZmctPnJlc291cmNlX3RhYmxlX2xhYmVsLCBJUFJfUkVTX1RBQkxFX0xBQkVMKTsKKwlzcHJpbnRmKGlvYV9jZmctPmlwcl9oY2FtX2xhYmVsLCBJUFJfSENBTV9MQUJFTCk7CisJc3ByaW50Zihpb2FfY2ZnLT5pcHJfY21kX2xhYmVsLCBJUFJfQ01EX0xBQkVMKTsKKworCUlOSVRfTElTVF9IRUFEKCZpb2FfY2ZnLT5ob3N0cmNiX2ZyZWVfcSk7CisJSU5JVF9MSVNUX0hFQUQoJmlvYV9jZmctPmhvc3RyY2JfcGVuZGluZ19xKTsKKwlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+ZnJlZV9yZXNfcSk7CisJSU5JVF9MSVNUX0hFQUQoJmlvYV9jZmctPnVzZWRfcmVzX3EpOworCUlOSVRfV09SSygmaW9hX2NmZy0+d29ya19xLCBpcHJfd29ya2VyX3RocmVhZCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaW9hX2NmZy0+cmVzZXRfd2FpdF9xKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpb2FfY2ZnLT5tc2lfd2FpdF9xKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpb2FfY2ZnLT5lZWhfd2FpdF9xKTsKKwlpb2FfY2ZnLT5zZHRfc3RhdGUgPSBJTkFDVElWRTsKKworCWlwcl9pbml0aWFsaXplX2J1c19hdHRyKGlvYV9jZmcpOworCWlvYV9jZmctPm1heF9kZXZzX3N1cHBvcnRlZCA9IGlwcl9tYXhfZGV2czsKKworCWlmIChpb2FfY2ZnLT5zaXM2NCkgeworCQlob3N0LT5tYXhfaWQgPSBJUFJfTUFYX1NJUzY0X1RBUkdFVFNfUEVSX0JVUzsKKwkJaG9zdC0+bWF4X2x1biA9IElQUl9NQVhfU0lTNjRfTFVOU19QRVJfVEFSR0VUOworCQlpZiAoaXByX21heF9kZXZzID4gSVBSX01BWF9TSVM2NF9ERVZTKQorCQkJaW9hX2NmZy0+bWF4X2RldnNfc3VwcG9ydGVkID0gSVBSX01BWF9TSVM2NF9ERVZTOworCQlpb2FfY2ZnLT5jZmdfdGFibGVfc2l6ZSA9IChzaXplb2Yoc3RydWN0IGlwcl9jb25maWdfdGFibGVfaGRyNjQpCisJCQkJCSAgICsgKChzaXplb2Yoc3RydWN0IGlwcl9jb25maWdfdGFibGVfZW50cnk2NCkKKwkJCQkJICAgICAgICogaW9hX2NmZy0+bWF4X2RldnNfc3VwcG9ydGVkKSkpOworCX0gZWxzZSB7CisJCWhvc3QtPm1heF9pZCA9IElQUl9NQVhfTlVNX1RBUkdFVFNfUEVSX0JVUzsKKwkJaG9zdC0+bWF4X2x1biA9IElQUl9NQVhfTlVNX0xVTlNfUEVSX1RBUkdFVDsKKwkJaWYgKGlwcl9tYXhfZGV2cyA+IElQUl9NQVhfUEhZU0lDQUxfREVWUykKKwkJCWlvYV9jZmctPm1heF9kZXZzX3N1cHBvcnRlZCA9IElQUl9NQVhfUEhZU0lDQUxfREVWUzsKKwkJaW9hX2NmZy0+Y2ZnX3RhYmxlX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBpcHJfY29uZmlnX3RhYmxlX2hkcikKKwkJCQkJICAgKyAoKHNpemVvZihzdHJ1Y3QgaXByX2NvbmZpZ190YWJsZV9lbnRyeSkKKwkJCQkJICAgICAgICogaW9hX2NmZy0+bWF4X2RldnNfc3VwcG9ydGVkKSkpOworCX0KKworCWhvc3QtPm1heF9jaGFubmVsID0gSVBSX01BWF9CVVNfVE9fU0NBTjsKKwlob3N0LT51bmlxdWVfaWQgPSBob3N0LT5ob3N0X25vOworCWhvc3QtPm1heF9jbWRfbGVuID0gSVBSX01BWF9DREJfTEVOOworCWhvc3QtPmNhbl9xdWV1ZSA9IGlvYV9jZmctPm1heF9jbWRzOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBpb2FfY2ZnKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlvYV9jZmctPmhycnEpOyBpKyspIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmlvYV9jZmctPmhycnFbaV0uaHJycV9mcmVlX3EpOworCQlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+aHJycVtpXS5ocnJxX3BlbmRpbmdfcSk7CisJCXNwaW5fbG9ja19pbml0KCZpb2FfY2ZnLT5ocnJxW2ldLl9sb2NrKTsKKwkJaWYgKGkgPT0gMCkKKwkJCWlvYV9jZmctPmhycnFbaV0ubG9jayA9IGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jazsKKwkJZWxzZQorCQkJaW9hX2NmZy0+aHJycVtpXS5sb2NrID0gJmlvYV9jZmctPmhycnFbaV0uX2xvY2s7CisJfQorfQorCisvKioKICAqIGlwcl9nZXRfY2hpcF9pbmZvIC0gRmluZCBhZGFwdGVyIGNoaXAgaW5mb3JtYXRpb24KICAqIEBkZXZfaWQ6CQlQQ0kgZGV2aWNlIGlkIHN0cnVjdAogICoKQEAgLTkyNDMsNTQgKzkzMzAsNjMgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorLyoqCisgKiBpcHJfd2FpdF9mb3JfcGNpX2Vycl9yZWNvdmVyeSAtIFdhaXQgZm9yIGFueSBQQ0kgZXJyb3IgcmVjb3ZlcnkgdG8gY29tcGxldGUKKyAqCQkJCQkJZHVyaW5nIHByb2JlIHRpbWUKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlOb25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfd2FpdF9mb3JfcGNpX2Vycl9yZWNvdmVyeShzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBpb2FfY2ZnLT5wZGV2OworCisJaWYgKHBjaV9jaGFubmVsX29mZmxpbmUocGRldikpIHsKKwkJd2FpdF9ldmVudF90aW1lb3V0KGlvYV9jZmctPmVlaF93YWl0X3EsCisJCQkJICAgIXBjaV9jaGFubmVsX29mZmxpbmUocGRldiksCisJCQkJICAgSVBSX1BDSV9FUlJPUl9SRUNPVkVSWV9USU1FT1VUKTsKKwkJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJfQorfQorCiBzdGF0aWMgaW50IGlwcl9lbmFibGVfbXNpeChzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCiB7CiAJc3RydWN0IG1zaXhfZW50cnkgZW50cmllc1tJUFJfTUFYX01TSVhfVkVDVE9SU107Ci0JaW50IGksIGVyciwgdmVjdG9yczsKKwlpbnQgaSwgdmVjdG9yczsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVudHJpZXMpOyArK2kpCiAJCWVudHJpZXNbaV0uZW50cnkgPSBpOwogCi0JdmVjdG9ycyA9IGlwcl9udW1iZXJfb2ZfbXNpeDsKLQotCXdoaWxlICgoZXJyID0gcGNpX2VuYWJsZV9tc2l4KGlvYV9jZmctPnBkZXYsIGVudHJpZXMsIHZlY3RvcnMpKSA+IDApCi0JCQl2ZWN0b3JzID0gZXJyOwotCi0JaWYgKGVyciA8IDApIHsKLQkJcGNpX2Rpc2FibGVfbXNpeChpb2FfY2ZnLT5wZGV2KTsKLQkJcmV0dXJuIGVycjsKKwl2ZWN0b3JzID0gcGNpX2VuYWJsZV9tc2l4X3JhbmdlKGlvYV9jZmctPnBkZXYsCisJCQkJCWVudHJpZXMsIDEsIGlwcl9udW1iZXJfb2ZfbXNpeCk7CisJaWYgKHZlY3RvcnMgPCAwKSB7CisJCWlwcl93YWl0X2Zvcl9wY2lfZXJyX3JlY292ZXJ5KGlvYV9jZmcpOworCQlyZXR1cm4gdmVjdG9yczsKIAl9CiAKLQlpZiAoIWVycikgewotCQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yczsgaSsrKQotCQkJaW9hX2NmZy0+dmVjdG9yc19pbmZvW2ldLnZlYyA9IGVudHJpZXNbaV0udmVjdG9yOwotCQlpb2FfY2ZnLT5udmVjdG9ycyA9IHZlY3RvcnM7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JzOyBpKyspCisJCWlvYV9jZmctPnZlY3RvcnNfaW5mb1tpXS52ZWMgPSBlbnRyaWVzW2ldLnZlY3RvcjsKKwlpb2FfY2ZnLT5udmVjdG9ycyA9IHZlY3RvcnM7CiAKLQlyZXR1cm4gZXJyOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGlwcl9lbmFibGVfbXNpKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZykKIHsKLQlpbnQgaSwgZXJyLCB2ZWN0b3JzOworCWludCBpLCB2ZWN0b3JzOwogCi0JdmVjdG9ycyA9IGlwcl9udW1iZXJfb2ZfbXNpeDsKLQotCXdoaWxlICgoZXJyID0gcGNpX2VuYWJsZV9tc2lfYmxvY2soaW9hX2NmZy0+cGRldiwgdmVjdG9ycykpID4gMCkKLQkJCXZlY3RvcnMgPSBlcnI7Ci0KLQlpZiAoZXJyIDwgMCkgewotCQlwY2lfZGlzYWJsZV9tc2koaW9hX2NmZy0+cGRldik7Ci0JCXJldHVybiBlcnI7CisJdmVjdG9ycyA9IHBjaV9lbmFibGVfbXNpX3JhbmdlKGlvYV9jZmctPnBkZXYsIDEsIGlwcl9udW1iZXJfb2ZfbXNpeCk7CisJaWYgKHZlY3RvcnMgPCAwKSB7CisJCWlwcl93YWl0X2Zvcl9wY2lfZXJyX3JlY292ZXJ5KGlvYV9jZmcpOworCQlyZXR1cm4gdmVjdG9yczsKIAl9CiAKLQlpZiAoIWVycikgewotCQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yczsgaSsrKQotCQkJaW9hX2NmZy0+dmVjdG9yc19pbmZvW2ldLnZlYyA9IGlvYV9jZmctPnBkZXYtPmlycSArIGk7Ci0JCWlvYV9jZmctPm52ZWN0b3JzID0gdmVjdG9yczsKLQl9CisJZm9yIChpID0gMDsgaSA8IHZlY3RvcnM7IGkrKykKKwkJaW9hX2NmZy0+dmVjdG9yc19pbmZvW2ldLnZlYyA9IGlvYV9jZmctPnBkZXYtPmlycSArIGk7CisJaW9hX2NmZy0+bnZlY3RvcnMgPSB2ZWN0b3JzOwogCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgbmFtZV9tc2lfdmVjdG9ycyhzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCkBAIC05MzU1LDcgKzk0NTEsNyBAQAogICogaXByX3Rlc3RfbXNpIC0gVGVzdCBmb3IgTWVzc2FnZSBTaWduYWxlZCBJbnRlcnJ1cHQgKE1TSSkgc3VwcG9ydC4KICAqIEBwZGV2OgkJUENJIGRldmljZSBzdHJ1Y3QKICAqCi0gKiBEZXNjcmlwdGlvbjogVGhlIHJldHVybiB2YWx1ZSBmcm9tIHBjaV9lbmFibGVfbXNpKCkgY2FuIG5vdCBhbHdheXMgYmUKKyAqIERlc2NyaXB0aW9uOiBUaGUgcmV0dXJuIHZhbHVlIGZyb20gcGNpX2VuYWJsZV9tc2lfcmFuZ2UoKSBjYW4gbm90IGFsd2F5cyBiZQogICogdHJ1c3RlZC4gIFRoaXMgcm91dGluZSBzZXRzIHVwIGFuZCBpbml0aWF0ZXMgYSB0ZXN0IGludGVycnVwdCB0byBkZXRlcm1pbmUKICAqIGlmIHRoZSBpbnRlcnJ1cHQgaXMgcmVjZWl2ZWQgdmlhIHRoZSBpcHJfdGVzdF9pbnRyKCkgc2VydmljZSByb3V0aW5lLgogICogSWYgdGhlIHRlc3RzIGZhaWxzLCB0aGUgZHJpdmVyIHdpbGwgZmFsbCBiYWNrIHRvIExTSS4KQEAgLTk0MzQsMTkgKzk1MzAsMTMgQEAKIAogCUVOVEVSOwogCi0JaWYgKChyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgZW5hYmxlIGFkYXB0ZXJcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiRm91bmQgSU9BIHdpdGggSVJROiAlZFxuIiwgcGRldi0+aXJxKTsKLQogCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmRyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKCppb2FfY2ZnKSk7CiAKIAlpZiAoIWhvc3QpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FsbCB0byBzY3NpX2hvc3RfYWxsb2MgZmFpbGVkIVxuIik7CiAJCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXRfZGlzYWJsZTsKKwkJZ290byBvdXQ7CiAJfQogCiAJaW9hX2NmZyA9IChzdHJ1Y3QgaXByX2lvYV9jZmcgKilob3N0LT5ob3N0ZGF0YTsKQEAgLTk0NzYsNiArOTU2Niw4IEBACiAKIAlpb2FfY2ZnLT5yZXZpZCA9IHBkZXYtPnJldmlzaW9uOwogCisJaXByX2luaXRfaW9hX2NmZyhpb2FfY2ZnLCBob3N0LCBwZGV2KTsKKwogCWlwcl9yZWdzX3BjaSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKIAogCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBJUFJfTkFNRSk7CkBAIC05NDg1LDIyICs5NTc3LDM1IEBACiAJCWdvdG8gb3V0X3Njc2lfaG9zdF9wdXQ7CiAJfQogCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKworCWlmIChyYyB8fCBwY2lfY2hhbm5lbF9vZmZsaW5lKHBkZXYpKSB7CisJCWlmIChwY2lfY2hhbm5lbF9vZmZsaW5lKHBkZXYpKSB7CisJCQlpcHJfd2FpdF9mb3JfcGNpX2Vycl9yZWNvdmVyeShpb2FfY2ZnKTsKKwkJCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJCX0KKworCQlpZiAocmMpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBlbmFibGUgYWRhcHRlclxuIik7CisJCQlpcHJfd2FpdF9mb3JfcGNpX2Vycl9yZWNvdmVyeShpb2FfY2ZnKTsKKwkJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uczsKKwkJfQorCX0KKwogCWlwcl9yZWdzID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIDApOwogCiAJaWYgKCFpcHJfcmVncykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkiQ291bGRuJ3QgbWFwIG1lbW9yeSByYW5nZSBvZiByZWdpc3RlcnNcbiIpOwogCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uczsKKwkJZ290byBvdXRfZGlzYWJsZTsKIAl9CiAKIAlpb2FfY2ZnLT5oZHdfZG1hX3JlZ3MgPSBpcHJfcmVnczsKIAlpb2FfY2ZnLT5oZHdfZG1hX3JlZ3NfcGNpID0gaXByX3JlZ3NfcGNpOwogCWlvYV9jZmctPmlvYV9tYWlsYm94ID0gaW9hX2NmZy0+Y2hpcF9jZmctPm1haWxib3ggKyBpcHJfcmVnczsKIAotCWlwcl9pbml0X2lvYV9jZmcoaW9hX2NmZywgaG9zdCwgcGRldik7Ci0KLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlpcHJfaW5pdF9yZWdzKGlvYV9jZmcpOwogCiAJaWYgKGlvYV9jZmctPnNpczY0KSB7CiAJCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKTsKQEAgLTk1MDgsNyArOTYxMyw2IEBACiAJCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gc2V0IDY0IGJpdCBQQ0kgRE1BIG1hc2tcbiIpOwogCQkJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwogCQl9Ci0KIAl9IGVsc2UKIAkJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwogCkBAIC05NTIyLDEwICs5NjI2LDE1IEBACiAKIAlpZiAocmMgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIldyaXRlIG9mIGNhY2hlIGxpbmUgc2l6ZSBmYWlsZWRcbiIpOworCQlpcHJfd2FpdF9mb3JfcGNpX2Vycl9yZWNvdmVyeShpb2FfY2ZnKTsKIAkJcmMgPSAtRUlPOwogCQlnb3RvIGNsZWFudXBfbm9tZW07CiAJfQogCisJLyogSXNzdWUgTU1JTyByZWFkIHRvIGVuc3VyZSBjYXJkIGlzIG5vdCBpbiBFRUggKi8KKwlpbnRlcnJ1cHRzID0gcmVhZGwoaW9hX2NmZy0+cmVncy5zZW5zZV9pbnRlcnJ1cHRfcmVnKTsKKwlpcHJfd2FpdF9mb3JfcGNpX2Vycl9yZWNvdmVyeShpb2FfY2ZnKTsKKwogCWlmIChpcHJfbnVtYmVyX29mX21zaXggPiBJUFJfTUFYX01TSVhfVkVDVE9SUykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJUaGUgbWF4IG51bWJlciBvZiBNU0lYIGlzICVkXG4iLAogCQkJSVBSX01BWF9NU0lYX1ZFQ1RPUlMpOwpAQCAtOTU0NCwxMCArOTY1MywyMiBAQAogCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQ2Fubm90IGVuYWJsZSBNU0kuXG4iKTsKIAl9CiAKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmIChwY2lfY2hhbm5lbF9vZmZsaW5lKHBkZXYpKSB7CisJCWlwcl93YWl0X2Zvcl9wY2lfZXJyX3JlY292ZXJ5KGlvYV9jZmcpOworCQlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwkJaWYgKHBjaV9jaGFubmVsX29mZmxpbmUocGRldikpIHsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gb3V0X21zaV9kaXNhYmxlOworCQl9CisJfQorCiAJaWYgKGlvYV9jZmctPmludHJfZmxhZyA9PSBJUFJfVVNFX01TSSB8fAogCSAgICBpb2FfY2ZnLT5pbnRyX2ZsYWcgPT0gSVBSX1VTRV9NU0lYKSB7CiAJCXJjID0gaXByX3Rlc3RfbXNpKGlvYV9jZmcsIHBkZXYpOwogCQlpZiAocmMgPT0gLUVPUE5PVFNVUFApIHsKKwkJCWlwcl93YWl0X2Zvcl9wY2lfZXJyX3JlY292ZXJ5KGlvYV9jZmcpOwogCQkJaWYgKGlvYV9jZmctPmludHJfZmxhZyA9PSBJUFJfVVNFX01TSSkgewogCQkJCWlvYV9jZmctPmludHJfZmxhZyAmPSB+SVBSX1VTRV9NU0k7CiAJCQkJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOwpAQCAtOTU3NywzMCArOTY5OCwxMiBAQAogCQkJCSh1bnNpZ25lZCBpbnQpbnVtX29ubGluZV9jcHVzKCksCiAJCQkJKHVuc2lnbmVkIGludClJUFJfTUFYX0hSUlFfTlVNKTsKIAotCS8qIFNhdmUgYXdheSBQQ0kgY29uZmlnIHNwYWNlIGZvciB1c2UgZm9sbG93aW5nIElPQSByZXNldCAqLwotCXJjID0gcGNpX3NhdmVfc3RhdGUocGRldik7Ci0KLQlpZiAocmMgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBzYXZlIFBDSSBjb25maWcgc3BhY2VcbiIpOwotCQlyYyA9IC1FSU87Ci0JCWdvdG8gb3V0X21zaV9kaXNhYmxlOwotCX0KLQogCWlmICgocmMgPSBpcHJfc2F2ZV9wY2l4X2NtZF9yZWcoaW9hX2NmZykpKQogCQlnb3RvIG91dF9tc2lfZGlzYWJsZTsKIAogCWlmICgocmMgPSBpcHJfc2V0X3BjaXhfY21kX3JlZyhpb2FfY2ZnKSkpCiAJCWdvdG8gb3V0X21zaV9kaXNhYmxlOwogCi0JaWYgKGlvYV9jZmctPnNpczY0KQotCQlpb2FfY2ZnLT5jZmdfdGFibGVfc2l6ZSA9IChzaXplb2Yoc3RydWN0IGlwcl9jb25maWdfdGFibGVfaGRyNjQpCi0JCQkJKyAoKHNpemVvZihzdHJ1Y3QgaXByX2NvbmZpZ190YWJsZV9lbnRyeTY0KQotCQkJCSogaW9hX2NmZy0+bWF4X2RldnNfc3VwcG9ydGVkKSkpOwotCWVsc2UKLQkJaW9hX2NmZy0+Y2ZnX3RhYmxlX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBpcHJfY29uZmlnX3RhYmxlX2hkcikKLQkJCQkrICgoc2l6ZW9mKHN0cnVjdCBpcHJfY29uZmlnX3RhYmxlX2VudHJ5KQotCQkJCSogaW9hX2NmZy0+bWF4X2RldnNfc3VwcG9ydGVkKSkpOwotCiAJcmMgPSBpcHJfYWxsb2NfbWVtKGlvYV9jZmcpOwogCWlmIChyYyA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LApAQCAtOTYwOCw2ICs5NzExLDE1IEBACiAJCWdvdG8gb3V0X21zaV9kaXNhYmxlOwogCX0KIAorCS8qIFNhdmUgYXdheSBQQ0kgY29uZmlnIHNwYWNlIGZvciB1c2UgZm9sbG93aW5nIElPQSByZXNldCAqLworCXJjID0gcGNpX3NhdmVfc3RhdGUocGRldik7CisKKwlpZiAocmMgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBzYXZlIFBDSSBjb25maWcgc3BhY2VcbiIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gY2xlYW51cF9ub2xvZzsKKwl9CisKIAkvKgogCSAqIElmIEhSUlEgdXBkYXRlZCBpbnRlcnJ1cHQgaXMgbm90IG1hc2tlZCwgb3IgcmVzZXQgYWxlcnQgaXMgc2V0LAogCSAqIHRoZSBjYXJkIGlzIGluIGFuIHVua25vd24gc3RhdGUgYW5kIG5lZWRzIGEgaGFyZCByZXNldApAQCAtOTY2NCwxOCArOTc3NiwxOSBAQAogY2xlYW51cF9ub2xvZzoKIAlpcHJfZnJlZV9tZW0oaW9hX2NmZyk7CiBvdXRfbXNpX2Rpc2FibGU6CisJaXByX3dhaXRfZm9yX3BjaV9lcnJfcmVjb3ZlcnkoaW9hX2NmZyk7CiAJaWYgKGlvYV9jZmctPmludHJfZmxhZyA9PSBJUFJfVVNFX01TSSkKIAkJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOwogCWVsc2UgaWYgKGlvYV9jZmctPmludHJfZmxhZyA9PSBJUFJfVVNFX01TSVgpCiAJCXBjaV9kaXNhYmxlX21zaXgocGRldik7CiBjbGVhbnVwX25vbWVtOgogCWlvdW5tYXAoaXByX3JlZ3MpOworb3V0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogb3V0X3JlbGVhc2VfcmVnaW9uczoKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogb3V0X3Njc2lfaG9zdF9wdXQ6CiAJc2NzaV9ob3N0X3B1dChob3N0KTsKLW91dF9kaXNhYmxlOgotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlnb3RvIG91dDsKIH0KIApAQCAtOTg1OSw4ICs5OTcyLDcgQEAKIAlpb2FfY2ZnLT5ob3N0LT5tYXhfY2hhbm5lbCA9IElQUl9WU0VUX0JVUzsKIAlpb2FfY2ZnLT5pb3BvbGxfd2VpZ2h0ID0gaW9hX2NmZy0+Y2hpcF9jZmctPmlvcG9sbF93ZWlnaHQ7CiAKLQlpZiAoYmxrX2lvcG9sbF9lbmFibGVkICYmIGlvYV9jZmctPmlvcG9sbF93ZWlnaHQgJiYKLQkJCWlvYV9jZmctPnNpczY0ICYmIGlvYV9jZmctPm52ZWN0b3JzID4gMSkgeworCWlmIChpb2FfY2ZnLT5pb3BvbGxfd2VpZ2h0ICYmIGlvYV9jZmctPnNpczY0ICYmIGlvYV9jZmctPm52ZWN0b3JzID4gMSkgewogCQlmb3IgKGkgPSAxOyBpIDwgaW9hX2NmZy0+aHJycV9udW07IGkrKykgewogCQkJYmxrX2lvcG9sbF9pbml0KCZpb2FfY2ZnLT5ocnJxW2ldLmlvcG9sbCwKIAkJCQkJaW9hX2NmZy0+aW9wb2xsX3dlaWdodCwgaXByX2lvcG9sbCk7CkBAIC05ODg5LDggKzEwMDAxLDcgQEAKIAlpbnQgaTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7Ci0JaWYgKGJsa19pb3BvbGxfZW5hYmxlZCAmJiBpb2FfY2ZnLT5pb3BvbGxfd2VpZ2h0ICYmCi0JCQlpb2FfY2ZnLT5zaXM2NCAmJiBpb2FfY2ZnLT5udmVjdG9ycyA+IDEpIHsKKwlpZiAoaW9hX2NmZy0+aW9wb2xsX3dlaWdodCAmJiBpb2FfY2ZnLT5zaXM2NCAmJiBpb2FfY2ZnLT5udmVjdG9ycyA+IDEpIHsKIAkJaW9hX2NmZy0+aW9wb2xsX3dlaWdodCA9IDA7CiAJCWZvciAoaSA9IDE7IGkgPCBpb2FfY2ZnLT5ocnJxX251bTsgaSsrKQogCQkJYmxrX2lvcG9sbF9kaXNhYmxlKCZpb2FfY2ZnLT5ocnJxW2ldLmlvcG9sbCk7CkBAIC05OTk0LDYgKzEwMTA1LDggQEAKIAl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DUk9DT0RJTEUsCiAJCVBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfNTdEOSwgMCwgMCwgMCB9LAogCXsgUENJX1ZFTkRPUl9JRF9JQk0sIFBDSV9ERVZJQ0VfSURfSUJNX0NST0NPRElMRSwKKwkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF81N0RBLCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fQ1JPQ09ESUxFLAogCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3RUIsIDAsIDAsIDAgfSwKIAl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DUk9DT0RJTEUsCiAJCVBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfNTdFQywgMCwgMCwgMCB9LApAQCAtMTAwMDUsMTIgKzEwMTE4LDE5IEBACiAJCVBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfNTdFRiwgMCwgMCwgMCB9LAogCXsgUENJX1ZFTkRPUl9JRF9JQk0sIFBDSV9ERVZJQ0VfSURfSUJNX0NST0NPRElMRSwKIAkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF81N0YwLCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fQ1JPQ09ESUxFLAorCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzJDQ0EsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DUk9DT0RJTEUsCisJCVBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfMkNEMiwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9JQk0sIFBDSV9ERVZJQ0VfSURfSUJNX0NST0NPRElMRSwKKwkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF8yQ0NELCAwLCAwLCAwIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlwcl9wY2lfdGFibGUpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9lcnJvcl9oYW5kbGVycyBpcHJfZXJyX2hhbmRsZXIgPSB7CiAJLmVycm9yX2RldGVjdGVkID0gaXByX3BjaV9lcnJvcl9kZXRlY3RlZCwKKwkubW1pb19lbmFibGVkID0gaXByX3BjaV9tbWlvX2VuYWJsZWQsCiAJLnNsb3RfcmVzZXQgPSBpcHJfcGNpX3Nsb3RfcmVzZXQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXByLmggYi9kcml2ZXJzL3Njc2kvaXByLmgKaW5kZXggOWNlMzhhMi4uMzFlZDEyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lwci5oCisrKyBiL2RyaXZlcnMvc2NzaS9pcHIuaApAQCAtMTAxLDEyICsxMDEsMTYgQEAKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3RDcgICAgMHgwM0ZGCiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81N0Q4ICAgIDB4MDNGRQogI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTdEOSAgICAweDA0NkQKKyNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3REEgICAgMHgwNENBCiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81N0VCICAgIDB4MDQ3NAogI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTdFQyAgICAweDA0NzUKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3RUQgICAgMHgwNDk5CiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81N0VFICAgIDB4MDQ5QQogI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTdFRiAgICAweDA0OUIKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3RjAgICAgMHgwNDlDCisjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF8yQ0NBCTB4MDRDNworI2RlZmluZSBJUFJfU1VCU19ERVZfSURfMkNEMgkweDA0QzgKKyNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzJDQ0QJMHgwNEM5CiAjZGVmaW5lIElQUl9OQU1FCQkJCSJpcHIiCiAKIC8qCkBAIC0yMzAsNiArMjM0LDcgQEAKICNkZWZpbmUgSVBSX1dBSVRfRk9SX1JFU0VUX1RJTUVPVVQJCSgyICogSFopCiAjZGVmaW5lIElQUl9DSEVDS19GT1JfUkVTRVRfVElNRU9VVAkJKEhaIC8gMTApCiAjZGVmaW5lIElQUl9XQUlUX0ZPUl9CSVNUX1RJTUVPVVQJCSgyICogSFopCisjZGVmaW5lIElQUl9QQ0lfRVJST1JfUkVDT1ZFUllfVElNRU9VVAkoMTIwICogSFopCiAjZGVmaW5lIElQUl9QQ0lfUkVTRVRfVElNRU9VVAkJCShIWiAvIDIpCiAjZGVmaW5lIElQUl9TSVMzMl9EVU1QX1RJTUVPVVQJCQkoMTUgKiBIWikKICNkZWZpbmUgSVBSX1NJUzY0X0RVTVBfVElNRU9VVAkJCSg0MCAqIEhaKQpAQCAtODk3LDYgKzkwMiwxOCBAQAogCV9fYmUzMiBpb2FfZGF0YVsyMzZdOwogfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKIAorc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMjFfZXJyb3IgeworCV9fYmUzMiB3d25bNF07CisJdTggcmVzX3BhdGhbOF07CisJdTggcHJpbWFyeV9wcm9ibGVtX2Rlc2NbMzJdOworCXU4IHNlY29uZF9wcm9ibGVtX2Rlc2NbMzJdOworCV9fYmUzMiBzZW5zZV9kYXRhWzhdOworCV9fYmUzMiBjZGJbNF07CisJX19iZTMyIHJlc2lkdWFsX3RyYW5zX2xlbmd0aDsKKwlfX2JlMzIgbGVuZ3RoX29mX2Vycm9yOworCV9fYmUzMiBpb2FfZGF0YVsyMzZdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKwogc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMDJfZXJyb3IgewogCXN0cnVjdCBpcHJfdnBkIGlvYV92cGQ7CiAJc3RydWN0IGlwcl92cGQgY2ZjX3ZwZDsKQEAgLTExMjYsNiArMTE0Myw3IEBACiAJCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlX2ZmX2Vycm9yIHR5cGVfZmZfZXJyb3I7CiAJCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzEyX2Vycm9yIHR5cGVfMTJfZXJyb3I7CiAJCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzE3X2Vycm9yIHR5cGVfMTdfZXJyb3I7CisJCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzIxX2Vycm9yIHR5cGVfMjFfZXJyb3I7CiAJCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzIzX2Vycm9yIHR5cGVfMjNfZXJyb3I7CiAJCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzI0X2Vycm9yIHR5cGVfMjRfZXJyb3I7CiAJCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzMwX2Vycm9yIHR5cGVfMzBfZXJyb3I7CkBAIC0xMTY5LDYgKzExODcsNyBAQAogI2RlZmluZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF8xNgkJCQkweDE2CiAjZGVmaW5lIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzE3CQkJCTB4MTcKICNkZWZpbmUgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfMjAJCQkJMHgyMAorI2RlZmluZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF8yMQkJCQkweDIxCiAjZGVmaW5lIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzIzCQkJCTB4MjMKICNkZWZpbmUgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfMjQJCQkJMHgyNAogI2RlZmluZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF8yNgkJCQkweDI2CkBAIC0xMjUyLDYgKzEyNzEsNyBAQAogCXU4IGFkZF90b19tbDoxOwogCXU4IGRlbF9mcm9tX21sOjE7CiAJdTggcmVzZXR0aW5nX2RldmljZToxOworCXU4IHJlc2V0X29jY3VycmVkOjE7CiAKIAl1MzIgYnVzOwkJLyogQUtBIGNoYW5uZWwgKi8KIAl1MzIgdGFyZ2V0OwkJLyogQUtBIGlkICovCkBAIC0xNDQxLDYgKzE0NjEsNyBAQAogCXU4IGR1bXBfdGltZW91dDoxOwogCXU4IGNmZ19sb2NrZWQ6MTsKIAl1OCBjbGVhcl9pc3I6MTsKKwl1OCBwcm9iZV9kb25lOjE7CiAKIAl1OCByZXZpZDsKIApAQCAtMTUxOSw2ICsxNTQwLDcgQEAKIAogCXdhaXRfcXVldWVfaGVhZF90IHJlc2V0X3dhaXRfcTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBtc2lfd2FpdF9xOworCXdhaXRfcXVldWVfaGVhZF90IGVlaF93YWl0X3E7CiAKIAlzdHJ1Y3QgaXByX2R1bXAgKmR1bXA7CiAJZW51bSBpcHJfc2R0X3N0YXRlIHNkdF9zdGF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL2luaXQuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL2luaXQuYwppbmRleCBkMjVkMGQ4Li42OTViMzRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjaS9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvaW5pdC5jCkBAIC02Niw3ICs2Niw3IEBACiAjaW5jbHVkZSAicHJvYmVfcm9tcy5oIgogCiAjZGVmaW5lIE1BSiAxCi0jZGVmaW5lIE1JTiAxCisjZGVmaW5lIE1JTiAyCiAjZGVmaW5lIEJVSUxEIDAKICNkZWZpbmUgRFJWX1ZFUlNJT04gX19zdHJpbmdpZnkoTUFKKSAiLiIgX19zdHJpbmdpZnkoTUlOKSAiLiIgXAogCV9fc3RyaW5naWZ5KEJVSUxEKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcmVxdWVzdC5jIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVxdWVzdC5jCmluZGV4IDk5ZDI5MzAuLjU2ZTM4MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlcXVlc3QuYworKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9yZXF1ZXN0LmMKQEAgLTI3MjMsMTMgKzI3MjMsOSBAQAogCW1lbWNweShyZXNwLT5lbmRpbmdfZmlzLCBmaXMsIHNpemVvZigqZmlzKSk7CiAJdHMtPmJ1Zl92YWxpZF9zaXplID0gc2l6ZW9mKCpyZXNwKTsKIAotCS8qIElmIHRoZSBkZXZpY2UgZmF1bHQgYml0IGlzIHNldCBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyLCB0aGVuCi0JICogc2V0IHRoZSBzZW5zZSBkYXRhIGFuZCByZXR1cm4uCi0JICovCi0JaWYgKGZpcy0+c3RhdHVzICYgQVRBX0RGKQorCS8qIElmIGFuIGVycm9yIGlzIGZsYWdnZWQgbGV0IGxpYmF0YSBkZWNvZGUgdGhlIGZpcyAqLworCWlmIChhY19lcnJfbWFzayhmaXMtPnN0YXR1cykpCiAJCXRzLT5zdGF0ID0gU0FTX1BST1RPX1JFU1BPTlNFOwotCWVsc2UgaWYgKGZpcy0+c3RhdHVzICYgQVRBX0VSUikKLQkJdHMtPnN0YXQgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CiAJZWxzZQogCQl0cy0+c3RhdCA9IFNBTV9TVEFUX0dPT0Q7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NzaV9ib290X3N5c2ZzLmMgYi9kcml2ZXJzL3Njc2kvaXNjc2lfYm9vdF9zeXNmcy5jCmluZGV4IDE0YzFjOGYuLjY4MGJmNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NzaV9ib290X3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zY3NpL2lzY3NpX2Jvb3Rfc3lzZnMuYwpAQCAtNDkwLDUgKzQ5MCw2IEBACiAJCWlzY3NpX2Jvb3RfcmVtb3ZlX2tvYmooYm9vdF9rb2JqKTsKIAogCWtzZXRfdW5yZWdpc3Rlcihib290X2tzZXQtPmtzZXQpOworCWtmcmVlKGJvb3Rfa3NldCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9ib290X2Rlc3Ryb3lfa3NldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMgYi9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMKaW5kZXggYWRkNmQxNS4uYmZiNmQwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYwpAQCAtNTkzLDkgKzU5Myw5IEBACiAJaXNjc2lfc3dfdGNwX2Nvbm5fcmVzdG9yZV9jYWxsYmFja3MoY29ubik7CiAJc29ja19wdXQoc29jay0+c2spOwogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJdGNwX3N3X2Nvbm4tPnNvY2sgPSBOVUxMOwotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlzb2NrZmRfcHV0KHNvY2spOwogfQogCkBAIC02NjMsMTAgKzY2MywxMCBAQAogCWlmIChlcnIpCiAJCWdvdG8gZnJlZV9zb2NrZXQ7CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkvKiBiaW5kIGlTQ1NJIGNvbm5lY3Rpb24gYW5kIHNvY2tldCAqLwogCXRjcF9zd19jb25uLT5zb2NrID0gc29jazsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAKIAkvKiBzZXR1cCBTb2NrZXQgcGFyYW1ldGVycyAqLwogCXNrID0gc29jay0+c2s7CkBAIC03MjYsMTQgKzcyNiwxNCBAQAogCXN3aXRjaChwYXJhbSkgewogCWNhc2UgSVNDU0lfUEFSQU1fQ09OTl9QT1JUOgogCWNhc2UgSVNDU0lfUEFSQU1fQ09OTl9BRERSRVNTOgotCQlzcGluX2xvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmxvY2spOworCQlzcGluX2xvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWlmICghdGNwX3N3X2Nvbm4gfHwgIXRjcF9zd19jb25uLT5zb2NrKSB7Ci0JCQlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJCQlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJCXJldHVybiAtRU5PVENPTk47CiAJCX0KIAkJcmMgPSBrZXJuZWxfZ2V0cGVlcm5hbWUodGNwX3N3X2Nvbm4tPnNvY2ssCiAJCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmxlbik7Ci0JCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWlmIChyYykKIAkJCXJldHVybiByYzsKIApAQCAtNzU5LDIzICs3NTksMjYgQEAKIAogCXN3aXRjaCAocGFyYW0pIHsKIAljYXNlIElTQ1NJX0hPU1RfUEFSQU1fSVBBRERSRVNTOgotCQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlpZiAoIXNlc3Npb24pCisJCQlyZXR1cm4gLUVOT1RDT05OOworCisJCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJY29ubiA9IHNlc3Npb24tPmxlYWRjb25uOwogCQlpZiAoIWNvbm4pIHsKLQkJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCQkJcmV0dXJuIC1FTk9UQ09OTjsKIAkJfQogCQl0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7CiAKIAkJdGNwX3N3X2Nvbm4gPSB0Y3BfY29ubi0+ZGRfZGF0YTsKIAkJaWYgKCF0Y3Bfc3dfY29ubi0+c29jaykgewotCQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCQlyZXR1cm4gLUVOT1RDT05OOwogCQl9CiAKIAkJcmMgPSBrZXJuZWxfZ2V0c29ja25hbWUodGNwX3N3X2Nvbm4tPnNvY2ssCiAJCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmxlbik7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWlmIChyYykKIAkJCXJldHVybiByYzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMgYi9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYwppbmRleCA0MDQ2MjQxLi41Yjg2MDVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYwpAQCAtMTEwLDE2ICsxMTAsOCBAQAogCQlzZXNzaW9uLT5leHBfY21kc24gPSBleHBfY21kc247CiAKIAlpZiAobWF4X2NtZHNuICE9IHNlc3Npb24tPm1heF9jbWRzbiAmJgotCSAgICAhaXNjc2lfc25hX2x0KG1heF9jbWRzbiwgc2Vzc2lvbi0+bWF4X2NtZHNuKSkgeworCSAgICAhaXNjc2lfc25hX2x0KG1heF9jbWRzbiwgc2Vzc2lvbi0+bWF4X2NtZHNuKSkKIAkJc2Vzc2lvbi0+bWF4X2NtZHNuID0gbWF4X2NtZHNuOwotCQkvKgotCQkgKiBpZiB0aGUgd2luZG93IGNsb3NlZCB3aXRoIElPIHF1ZXVlZCwgdGhlbiBraWNrIHRoZQotCQkgKiB4bWl0IHRocmVhZAotCQkgKi8KLQkJaWYgKCFsaXN0X2VtcHR5KCZzZXNzaW9uLT5sZWFkY29ubi0+Y21kcXVldWUpIHx8Ci0JCSAgICAhbGlzdF9lbXB0eSgmc2Vzc2lvbi0+bGVhZGNvbm4tPm1nbXRxdWV1ZSkpCi0JCQlpc2NzaV9jb25uX3F1ZXVlX3dvcmsoc2Vzc2lvbi0+bGVhZGNvbm4pOwotCX0KIH0KIAogdm9pZCBpc2NzaV91cGRhdGVfY21kc24oc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24sIHN0cnVjdCBpc2NzaV9ub3BpbiAqaGRyKQpAQCAtNDgxLDcgKzQ3Myw3IEBACiAgKiBpc2NzaV9mcmVlX3Rhc2sgLSBmcmVlIGEgdGFzawogICogQHRhc2s6IGlzY3NpIGNtZCB0YXNrCiAgKgotICogTXVzdCBiZSBjYWxsZWQgd2l0aCBzZXNzaW9uIGxvY2suCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHNlc3Npb24gYmFja19sb2NrLgogICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzY3NpIGNvbW1hbmQgdG8gc2NzaS1tbCBvciBjbGVhbnMKICAqIHVwIG1nbXQgdGFza3MgdGhlbiByZXR1cm5zIHRoZSB0YXNrIHRvIHRoZSBwb29sLgogICovCkBAIC01MzUsOSArNTI3LDEwIEBACiB7CiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSB0YXNrLT5jb25uLT5zZXNzaW9uOwogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkvKiByZWd1bGFyIFJYIHBhdGggdXNlcyBiYWNrX2xvY2sgKi8KKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJX19pc2NzaV9wdXRfdGFzayh0YXNrKTsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9wdXRfdGFzayk7CiAKQEAgLTU0Niw3ICs1MzksNyBAQAogICogQHRhc2s6IGlzY3NpIGNtZCB0YXNrCiAgKiBAc3RhdGU6IHN0YXRlIHRvIGNvbXBsZXRlIHRhc2sgd2l0aAogICoKLSAqIE11c3QgYmUgY2FsbGVkIHdpdGggc2Vzc2lvbiBsb2NrLgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBzZXNzaW9uIGJhY2tfbG9jay4KICAqLwogc3RhdGljIHZvaWQgaXNjc2lfY29tcGxldGVfdGFzayhzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaywgaW50IHN0YXRlKQogewpAQCAtNTg1LDcgKzU3OCw3IEBACiAgKiBUaGlzIGlzIHVzZWQgd2hlbiBkcml2ZXJzIGRvIG5vdCBuZWVkIG9yIGNhbm5vdCBwZXJmb3JtCiAgKiBsb3dlciBsZXZlbCBwZHUgcHJvY2Vzc2luZy4KICAqCi0gKiBDYWxsZWQgd2l0aCBzZXNzaW9uIGxvY2sKKyAqIENhbGxlZCB3aXRoIHNlc3Npb24gYmFja19sb2NrCiAgKi8KIHZvaWQgaXNjc2lfY29tcGxldGVfc2NzaV90YXNrKHN0cnVjdCBpc2NzaV90YXNrICp0YXNrLAogCQkJICAgICAgdWludDMyX3QgZXhwX2NtZHNuLCB1aW50MzJfdCBtYXhfY21kc24pCkBAIC02MDIsNyArNTk1LDcgQEAKIAogCiAvKgotICogc2Vzc2lvbiBsb2NrIG11c3QgYmUgaGVsZCBhbmQgaWYgbm90IGNhbGxlZCBmb3IgYSB0YXNrIHRoYXQgaXMKKyAqIHNlc3Npb24gYmFja19sb2NrIG11c3QgYmUgaGVsZCBhbmQgaWYgbm90IGNhbGxlZCBmb3IgYSB0YXNrIHRoYXQgaXMKICAqIHN0aWxsIHBlbmRpbmcgb3IgZnJvbSB0aGUgeG1pdCB0aHJlYWQsIHRoZW4geG1pdCB0aHJlYWQgbXVzdAogICogYmUgc3VzcGVuZGVkLgogICovCkBAIC02NDIsNyArNjM1LDEwIEBACiAJCXNjc2lfaW4oc2MpLT5yZXNpZCA9IHNjc2lfaW4oc2MpLT5sZW5ndGg7CiAJfQogCisJLyogcmVndWxhciBSWCBwYXRoIHVzZXMgYmFja19sb2NrICovCisJc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCWlzY3NpX2NvbXBsZXRlX3Rhc2sodGFzaywgc3RhdGUpOworCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogfQogCiBzdGF0aWMgaW50IGlzY3NpX3ByZXBfbWdtdF90YXNrKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLApAQCAtNzgwLDcgKzc3NiwxMCBAQAogCXJldHVybiB0YXNrOwogCiBmcmVlX3Rhc2s6CisJLyogcmVndWxhciBSWCBwYXRoIHVzZXMgYmFja19sb2NrICovCisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCV9faXNjc2lfcHV0X3Rhc2sodGFzayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTc5MSwxMCArNzkwLDEwIEBACiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOwogCWludCBlcnIgPSAwOwogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJaWYgKCFfX2lzY3NpX2Nvbm5fc2VuZF9wZHUoY29ubiwgaGRyLCBkYXRhLCBkYXRhX3NpemUpKQogCQllcnIgPSAtRVBFUk07Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9jb25uX3NlbmRfcGR1KTsKQEAgLTEwMTMsMTMgKzEwMTIsMTMgQEAKIAkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCiAJCQkJICAicGR1IChvcCAweCV4IGl0dCAweCV4KSByZWplY3RlZCAiCiAJCQkJICAiZHVlIHRvIERhdGFEaWdlc3QgZXJyb3IuXG4iLAotCQkJCSAgcmVqZWN0ZWRfcGR1Lml0dCwgb3Bjb2RlKTsKKwkJCQkgIG9wY29kZSwgcmVqZWN0ZWRfcGR1Lml0dCk7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfUkVBU09OX0lNTV9DTURfUkVKRUNUOgogCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwKIAkJCQkgICJwZHUgKG9wIDB4JXggaXR0IDB4JXgpIHJlamVjdGVkLiBUb28gbWFueSAiCiAJCQkJICAiaW1tZWRpYXRlIGNvbW1hbmRzLlxuIiwKLQkJCQkgIHJlamVjdGVkX3BkdS5pdHQsIG9wY29kZSk7CisJCQkJICBvcGNvZGUsIHJlamVjdGVkX3BkdS5pdHQpOwogCQkvKgogCQkgKiBXZSBvbmx5IHNlbmQgb25lIFRNRiBhdCBhIHRpbWUgc28gaWYgdGhlIHRhcmdldCBjb3VsZCBub3QKIAkJICogaGFuZGxlIGl0LCB0aGVuIGl0IHNob3VsZCBnZXQgZml4ZWQgKFJGQyBtYW5kYXRlcyB0aGF0CkBAIC0xMDMxLDE0ICsxMDMwLDE5IEBACiAJCWlmIChvcGNvZGUgIT0gSVNDU0lfT1BfTk9PUF9PVVQpCiAJCQlyZXR1cm4gMDsKIAotCQkgaWYgKHJlamVjdGVkX3BkdS5pdHQgPT0gY3B1X3RvX2JlMzIoSVNDU0lfUkVTRVJWRURfVEFHKSkKKwkJIGlmIChyZWplY3RlZF9wZHUuaXR0ID09IGNwdV90b19iZTMyKElTQ1NJX1JFU0VSVkVEX1RBRykpIHsKIAkJCS8qCiAJCQkgKiBub3Atb3V0IGluIHJlc3BvbnNlIHRvIHRhcmdldCdzIG5vcC1vdXQgcmVqZWN0ZWQuCiAJCQkgKiBKdXN0IHJlc2VuZC4KIAkJCSAqLworCQkJLyogSW4gUlggcGF0aCB3ZSBhcmUgdW5kZXIgYmFjayBsb2NrICovCisJCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKKwkJCXNwaW5fbG9jaygmY29ubi0+c2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJCWlzY3NpX3NlbmRfbm9wb3V0KGNvbm4sCiAJCQkJCSAgKHN0cnVjdCBpc2NzaV9ub3BpbiopJnJlamVjdGVkX3BkdSk7Ci0JCWVsc2UgeworCQkJc3Bpbl91bmxvY2soJmNvbm4tPnNlc3Npb24tPmZyd2RfbG9jayk7CisJCQlzcGluX2xvY2soJmNvbm4tPnNlc3Npb24tPmJhY2tfbG9jayk7CisJCX0gZWxzZSB7CiAJCQlzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzazsKIAkJCS8qCiAJCQkgKiBPdXIgbm9wIGFzIHBpbmcgZ290IGRyb3BwZWQuIFdlIGtub3cgdGhlIHRhcmdldApAQCAtMTA1OSw4ICsxMDYzLDggQEAKIAlkZWZhdWx0OgogCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwKIAkJCQkgICJwZHUgKG9wIDB4JXggaXR0IDB4JXgpIHJlamVjdGVkLiBSZWFzb24gIgotCQkJCSAgImNvZGUgMHgleFxuIiwgcmVqZWN0ZWRfcGR1Lml0dCwKLQkJCQkgIHJlamVjdGVkX3BkdS5vcGNvZGUsIHJlamVjdC0+cmVhc29uKTsKKwkJCQkgICJjb2RlIDB4JXhcbiIsIHJlamVjdGVkX3BkdS5vcGNvZGUsCisJCQkJICByZWplY3RlZF9wZHUuaXR0LCByZWplY3QtPnJlYXNvbik7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gcmM7CkBAIC0xMDc0LDcgKzEwNzgsNyBAQAogICogVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgbWdtdCB0YXNrcyBsaWtlIGxvZ2luIGFuZCBub3BzLCBvciBpZgogICogdGhlIExERCdzIGl0dCBzcGFjZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBzZXNzaW9uIGFnZS4KICAqCi0gKiBUaGUgc2Vzc2lvbiBsb2NrIG11c3QgYmUgaGVsZC4KKyAqIFRoZSBzZXNzaW9uIGJhY2tfbG9jayBtdXN0IGJlIGhlbGQuCiAgKi8KIHN0cnVjdCBpc2NzaV90YXNrICppc2NzaV9pdHRfdG9fdGFzayhzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgaXR0X3QgaXR0KQogewpAQCAtMTEwMyw3ICsxMTA3LDcgQEAKICAqIEBkYXRhbGVuOiBsZW4gb2YgZGF0YSBidWZmZXIKICAqCiAgKiBDb21wbGV0ZXMgcGR1IHByb2Nlc3NpbmcgYnkgZnJlZWluZyBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBhdAotICogcXVldWVjb21tYW5kIG9yIHNlbmQgZ2VuZXJpYy4gc2Vzc2lvbiBsb2NrIG11c3QgYmUgaGVsZCBhbmQgdmVyaWZ5CisgKiBxdWV1ZWNvbW1hbmQgb3Igc2VuZCBnZW5lcmljLiBzZXNzaW9uIGJhY2tfbG9jayBtdXN0IGJlIGhlbGQgYW5kIHZlcmlmeQogICogaXR0IG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KICAqLwogaW50IF9faXNjc2lfY29tcGxldGVfcGR1KHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3QgaXNjc2lfaGRyICpoZHIsCkBAIC0xMTQwLDcgKzExNDQsMTIgQEAKIAkJCWlmIChoZHItPnR0dCA9PSBjcHVfdG9fYmUzMihJU0NTSV9SRVNFUlZFRF9UQUcpKQogCQkJCWJyZWFrOwogCisJCQkvKiBJbiBSWCBwYXRoIHdlIGFyZSB1bmRlciBiYWNrIGxvY2sgKi8KKwkJCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOworCQkJc3Bpbl9sb2NrKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCQkJaXNjc2lfc2VuZF9ub3BvdXQoY29ubiwgKHN0cnVjdCBpc2NzaV9ub3BpbiopaGRyKTsKKwkJCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5mcndkX2xvY2spOworCQkJc3Bpbl9sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCQkJYnJlYWs7CiAJCWNhc2UgSVNDU0lfT1BfUkVKRUNUOgogCQkJcmMgPSBpc2NzaV9oYW5kbGVfcmVqZWN0KGNvbm4sIGhkciwgZGF0YSwgZGF0YWxlbik7CkBAIC0xMjQ3LDkgKzEyNTYsOSBAQAogewogCWludCByYzsKIAotCXNwaW5fbG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCXJjID0gX19pc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgaGRyLCBkYXRhLCBkYXRhbGVuKTsKLQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2soJmNvbm4tPnNlc3Npb24tPmJhY2tfbG9jayk7CiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfY29tcGxldGVfcGR1KTsKQEAgLTEyOTMsNyArMTMwMiw3IEBACiAgKgogICogVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgY21kIHRhc2tzLgogICoKLSAqIFRoZSBzZXNzaW9uIGxvY2sgbXVzdCBiZSBoZWxkLgorICogVGhlIHNlc3Npb24gYmFja19sb2NrIG11c3QgYmUgaGVsZC4KICAqLwogc3RydWN0IGlzY3NpX3Rhc2sgKmlzY3NpX2l0dF90b19jdGFzayhzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgaXR0X3QgaXR0KQogewpAQCAtMTMyMywxNSArMTMzMiwxNSBAQAogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWNvbm4gPSBzZXNzaW9uLT5sZWFkY29ubjsKIAlpZiAoc2Vzc2lvbi0+c3RhdGUgPT0gSVNDU0lfU1RBVEVfVEVSTUlOQVRFIHx8ICFjb25uKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCXJldHVybjsKIAl9CiAKIAlkZXYgPSBnZXRfZGV2aWNlKCZjb25uLT5jbHNfY29ubi0+ZGV2KTsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJaWYgKCFkZXYpCiAJICAgICAgICByZXR1cm47CiAJLyoKQEAgLTEzNTEsMTUgKzEzNjAsMTUgQEAKIHsKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlpZiAoc2Vzc2lvbi0+c3RhdGUgPT0gSVNDU0lfU1RBVEVfRkFJTEVEKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAoY29ubi0+c3RvcF9zdGFnZSA9PSAwKQogCQlzZXNzaW9uLT5zdGF0ZSA9IElTQ1NJX1NUQVRFX0ZBSUxFRDsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAKIAlzZXRfYml0KElTQ1NJX1NVU1BFTkRfQklULCAmY29ubi0+c3VzcGVuZF90eCk7CiAJc2V0X2JpdChJU0NTSV9TVVNQRU5EX0JJVCwgJmNvbm4tPnN1c3BlbmRfcngpOwpAQCAtMTM5MywxNSArMTQwMiwxOCBAQAogCQlyZXR1cm4gLUVOT0RBVEE7CiAKIAlfX2lzY3NpX2dldF90YXNrKHRhc2spOwotCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlyYyA9IGNvbm4tPnNlc3Npb24tPnR0LT54bWl0X3Rhc2sodGFzayk7Ci0Jc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmZyd2RfbG9jayk7CiAJaWYgKCFyYykgewogCQkvKiBkb25lIHdpdGggdGhpcyB0YXNrICovCiAJCXRhc2stPmxhc3RfeGZlciA9IGppZmZpZXM7CiAJCWNvbm4tPnRhc2sgPSBOVUxMOwogCX0KKwkvKiByZWd1bGFyIFJYIHBhdGggdXNlcyBiYWNrX2xvY2sgKi8KKwlzcGluX2xvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmJhY2tfbG9jayk7CiAJX19pc2NzaV9wdXRfdGFzayh0YXNrKTsKKwlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTE0MTAsNyArMTQyMiw3IEBACiAgKiBAdGFzazogdGFzayB0byByZXF1ZXVlCiAgKgogICogTExEcyB0aGF0IG5lZWQgdG8gcnVuIGEgdGFzayBmcm9tIHRoZSBzZXNzaW9uIHdvcmtxdWV1ZSBzaG91bGQgY2FsbAotICogdGhpcy4gVGhlIHNlc3Npb24gbG9jayBtdXN0IGJlIGhlbGQuIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkCisgKiB0aGlzLiBUaGUgc2Vzc2lvbiBmcndkX2xvY2sgbXVzdCBiZSBoZWxkLiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZAogICogYnkgc29mdHdhcmUgZHJpdmVycy4KICAqLwogdm9pZCBpc2NzaV9yZXF1ZXVlX3Rhc2soc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spCkBAIC0xNDQxLDEwICsxNDUzLDEwIEBACiAJc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2s7CiAJaW50IHJjID0gMDsKIAotCXNwaW5fbG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5mcndkX2xvY2spOwogCWlmICh0ZXN0X2JpdChJU0NTSV9TVVNQRU5EX0JJVCwgJmNvbm4tPnN1c3BlbmRfdHgpKSB7CiAJCUlTQ1NJX0RCR19TRVNTSU9OKGNvbm4tPnNlc3Npb24sICJUeCBzdXNwZW5kZWQhXG4iKTsKLQkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJcmV0dXJuIC1FTk9EQVRBOwogCX0KIApAQCAtMTQ2NSw3ICsxNDc3LDEwIEBACiAJCQkJCSBzdHJ1Y3QgaXNjc2lfdGFzaywgcnVubmluZyk7CiAJCWxpc3RfZGVsX2luaXQoJmNvbm4tPnRhc2stPnJ1bm5pbmcpOwogCQlpZiAoaXNjc2lfcHJlcF9tZ210X3Rhc2soY29ubiwgY29ubi0+dGFzaykpIHsKKwkJCS8qIHJlZ3VsYXIgUlggcGF0aCB1c2VzIGJhY2tfbG9jayAqLworCQkJc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCQkJX19pc2NzaV9wdXRfdGFzayhjb25uLT50YXNrKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCQkJY29ubi0+dGFzayA9IE5VTEw7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtMTUyNywxMSArMTU0MiwxMSBAQAogCQlpZiAoIWxpc3RfZW1wdHkoJmNvbm4tPm1nbXRxdWV1ZSkpCiAJCQlnb3RvIGNoZWNrX21nbXQ7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlyZXR1cm4gLUVOT0RBVEE7CiAKIGRvbmU6Ci0Jc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5mcndkX2xvY2spOwogCXJldHVybiByYzsKIH0KIApAQCAtMTYwMCw3ICsxNjE1LDcgQEAKIAogCWNsc19zZXNzaW9uID0gc3RhcmdldF90b19zZXNzaW9uKHNjc2lfdGFyZ2V0KHNjLT5kZXZpY2UpKTsKIAlzZXNzaW9uID0gY2xzX3Nlc3Npb24tPmRkX2RhdGE7Ci0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAKIAlyZWFzb24gPSBpc2NzaV9zZXNzaW9uX2Noa3JlYWR5KGNsc19zZXNzaW9uKTsKIAlpZiAocmVhc29uKSB7CkBAIC0xNjg2LDEzICsxNzAxLDEzIEBACiAJfQogCiAJc2Vzc2lvbi0+cXVldWVkX2NtZHNuKys7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCXJldHVybiAwOwogCiBwcmVwZF9yZWplY3Q6CiAJaXNjc2lfY29tcGxldGVfdGFzayh0YXNrLCBJU0NTSV9UQVNLX1JFUVVFVUVfU0NTSVEpOwogcmVqZWN0OgotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlJU0NTSV9EQkdfU0VTU0lPTihzZXNzaW9uLCAiY21kIDB4JXggcmVqZWN0ZWQgKCVkKVxuIiwKIAkJCSAgc2MtPmNtbmRbMF0sIHJlYXNvbik7CiAJcmV0dXJuIFNDU0lfTUxRVUVVRV9UQVJHRVRfQlVTWTsKQEAgLTE3MDAsNyArMTcxNSw3IEBACiBwcmVwZF9mYXVsdDoKIAlpc2NzaV9jb21wbGV0ZV90YXNrKHRhc2ssIElTQ1NJX1RBU0tfUkVRVUVVRV9TQ1NJUSk7CiBmYXVsdDoKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJSVNDU0lfREJHX1NFU1NJT04oc2Vzc2lvbiwgImlzY3NpOiBjbWQgMHgleCBpcyBub3QgcXVldWVkICglZClcbiIsCiAJCQkgIHNjLT5jbW5kWzBdLCByZWFzb24pOwogCWlmICghc2NzaV9iaWRpX2NtbmQoc2MpKQpAQCAtMTc0OCwxNCArMTc2MywxNCBAQAogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gKHN0cnVjdCBpc2NzaV9jb25uICopZGF0YTsKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247CiAKLQlzcGluX2xvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9jaygmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlpZiAoY29ubi0+dG1mX3N0YXRlID09IFRNRl9RVUVVRUQpIHsKIAkJY29ubi0+dG1mX3N0YXRlID0gVE1GX1RJTUVET1VUOwogCQlJU0NTSV9EQkdfRUgoc2Vzc2lvbiwgInRtZiB0aW1lZG91dFxuIik7CiAJCS8qIHVuYmxvY2sgZWhfYWJvcnQoKSAqLwogCQl3YWtlX3VwKCZjb25uLT5laHdhaXQpOwogCX0KLQlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2soJnNlc3Npb24tPmZyd2RfbG9jayk7CiB9CiAKIHN0YXRpYyBpbnQgaXNjc2lfZXhlY190YXNrX21nbXRfZm4oc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sCkBAIC0xNzY4LDEwICsxNzgzLDEwIEBACiAJdGFzayA9IF9faXNjc2lfY29ubl9zZW5kX3BkdShjb25uLCAoc3RydWN0IGlzY3NpX2hkciAqKWhkciwKIAkJCQkgICAgICBOVUxMLCAwKTsKIAlpZiAoIXRhc2spIHsKLQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sICJDb3VsZCBub3Qgc2VuZCBUTUYuXG4iKTsKIAkJaXNjc2lfY29ubl9mYWlsdXJlKGNvbm4sIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7Ci0JCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAJY29ubi0+dG1mY21kX3BkdXNfY250Kys7CkBAIC0xNzgxLDcgKzE3OTYsNyBAQAogCWFkZF90aW1lcigmY29ubi0+dG1mX3RpbWVyKTsKIAlJU0NTSV9EQkdfRUgoc2Vzc2lvbiwgInRtZiBzZXQgdGltZW91dFxuIik7CiAKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJbXV0ZXhfdW5sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7CiAKIAkvKgpAQCAtMTgwMCw3ICsxODE1LDcgQEAKIAlkZWxfdGltZXJfc3luYygmY29ubi0+dG1mX3RpbWVyKTsKIAogCW11dGV4X2xvY2soJnNlc3Npb24tPmVoX211dGV4KTsKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkvKiBpZiB0aGUgc2Vzc2lvbiBkcm9wcyBpdCB3aWxsIGNsZWFuIHVwIHRoZSB0YXNrICovCiAJaWYgKGFnZSAhPSBzZXNzaW9uLT5hZ2UgfHwKIAkgICAgc2Vzc2lvbi0+c3RhdGUgIT0gSVNDU0lfU1RBVEVfTE9HR0VEX0lOKQpAQCAtMTgzNyw3ICsxODUyLDcgQEAKICAqIGlzY3NpX3N1c3BlbmRfcXVldWUgLSBzdXNwZW5kIGlzY3NpX3F1ZXVlY29tbWFuZAogICogQGNvbm46IGlzY3NpIGNvbm4gdG8gc3RvcCBxdWV1ZWluZyBJTyBvbgogICoKLSAqIFRoaXMgZ3JhYnMgdGhlIHNlc3Npb24gbG9jayB0byBtYWtlIHN1cmUgbm8gb25lIGlzIGluCisgKiBUaGlzIGdyYWJzIHRoZSBzZXNzaW9uIGZyd2RfbG9jayB0byBtYWtlIHN1cmUgbm8gb25lIGlzIGluCiAgKiB4bWl0X3Rhc2svcXVldWVjb21tYW5kLCBhbmQgdGhlbiBzZXRzIHN1c3BlbmQgdG8gcHJldmVudAogICogbmV3IGNvbW1hbmRzIGZyb20gYmVpbmcgcXVldWVkLiBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgY2FsbGVkCiAgKiBieSBvZmZsb2FkIGRyaXZlcnMgdGhhdCBuZWVkIHRvIHN5bmMgYSBwYXRoIGxpa2UgZXAgZGlzY29ubmVjdApAQCAtMTg0Niw5ICsxODYxLDkgQEAKICAqLwogdm9pZCBpc2NzaV9zdXNwZW5kX3F1ZXVlKHN0cnVjdCBpc2NzaV9jb25uICpjb25uKQogewotCXNwaW5fbG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5mcndkX2xvY2spOwogCXNldF9iaXQoSVNDU0lfU1VTUEVORF9CSVQsICZjb25uLT5zdXNwZW5kX3R4KTsKLQlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmZyd2RfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9zdXNwZW5kX3F1ZXVlKTsKIApAQCAtMTkwNyw3ICsxOTIyLDcgQEAKIAogCUlTQ1NJX0RCR19FSChzZXNzaW9uLCAic2NzaSBjbWQgJXAgdGltZWRvdXRcbiIsIHNjKTsKIAotCXNwaW5fbG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCXRhc2sgPSAoc3RydWN0IGlzY3NpX3Rhc2sgKilzYy0+U0NwLnB0cjsKIAlpZiAoIXRhc2spIHsKIAkJLyoKQEAgLTIwMjEsNyArMjAzNiw3IEBACiBkb25lOgogCWlmICh0YXNrKQogCQl0YXNrLT5sYXN0X3RpbWVvdXQgPSBqaWZmaWVzOwotCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9jaygmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlJU0NTSV9EQkdfRUgoc2Vzc2lvbiwgInJldHVybiAlc1xuIiwgcmMgPT0gQkxLX0VIX1JFU0VUX1RJTUVSID8KIAkJICAgICAidGltZXIgcmVzZXQiIDogIm5oIik7CiAJcmV0dXJuIHJjOwpAQCAtMjAzMyw3ICsyMDQ4LDcgQEAKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247CiAJdW5zaWduZWQgbG9uZyByZWN2X3RpbWVvdXQsIG5leHRfdGltZW91dCA9IDAsIGxhc3RfcmVjdjsKIAotCXNwaW5fbG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWlmIChzZXNzaW9uLT5zdGF0ZSAhPSBJU0NTSV9TVEFURV9MT0dHRURfSU4pCiAJCWdvdG8gZG9uZTsKIApAQCAtMjA1MCw3ICsyMDY1LDcgQEAKIAkJCQkgICJsYXN0IHBpbmcgJWx1LCBub3cgJWx1XG4iLAogCQkJCSAgY29ubi0+cGluZ190aW1lb3V0LCBjb25uLT5yZWN2X3RpbWVvdXQsCiAJCQkJICBsYXN0X3JlY3YsIGNvbm4tPmxhc3RfcGluZywgamlmZmllcyk7Ci0JCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2soJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWlzY3NpX2Nvbm5fZmFpbHVyZShjb25uLCBJU0NTSV9FUlJfQ09OTl9GQUlMRUQpOwogCQlyZXR1cm47CiAJfQpAQCAtMjA2Niw3ICsyMDgxLDcgQEAKIAlJU0NTSV9EQkdfQ09OTihjb25uLCAiU2V0dGluZyBuZXh0IHRtbyAlbHVcbiIsIG5leHRfdGltZW91dCk7CiAJbW9kX3RpbWVyKCZjb25uLT50cmFuc3BvcnRfdGltZXIsIG5leHRfdGltZW91dCk7CiBkb25lOgotCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9jaygmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgaXNjc2lfcHJlcF9hYm9ydF90YXNrX3BkdShzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaywKQEAgLTIwOTYsNyArMjExMSw3IEBACiAJSVNDU0lfREJHX0VIKHNlc3Npb24sICJhYm9ydGluZyBzYyAlcFxuIiwgc2MpOwogCiAJbXV0ZXhfbG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCS8qCiAJICogaWYgc2Vzc2lvbiB3YXMgSVNDU0lfU1RBVEVfSU5fUkVDT1ZFUlkgdGhlbiB3ZSBtYXkgbm90IGhhdmUKIAkgKiBnb3QgdGhlIGNvbW1hbmQuCkBAIC0yMTA0LDcgKzIxMTksNyBAQAogCWlmICghc2MtPlNDcC5wdHIpIHsKIAkJSVNDU0lfREJHX0VIKHNlc3Npb24sICJzYyBuZXZlciByZWFjaGVkIGlzY3NpIGxheWVyIG9yICIKIAkJCQkgICAgICAiaXQgY29tcGxldGVkLlxuIik7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCW11dGV4X3VubG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwogCQlyZXR1cm4gU1VDQ0VTUzsKIAl9CkBAIC0yMTE1LDcgKzIxMzAsNyBAQAogCSAqLwogCWlmICghc2Vzc2lvbi0+bGVhZGNvbm4gfHwgc2Vzc2lvbi0+c3RhdGUgIT0gSVNDU0lfU1RBVEVfTE9HR0VEX0lOIHx8CiAJICAgIHNjLT5TQ3AucGhhc2UgIT0gc2Vzc2lvbi0+YWdlKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCW11dGV4X3VubG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwogCQlJU0NTSV9EQkdfRUgoc2Vzc2lvbiwgImZhaWxpbmcgYWJvcnQgZHVlIHRvIGRyb3BwZWQgIgogCQkJCSAgInNlc3Npb24uXG4iKTsKQEAgLTIxNTYsNyArMjE3MSw3IEBACiAKIAlzd2l0Y2ggKGNvbm4tPnRtZl9zdGF0ZSkgewogCWNhc2UgVE1GX1NVQ0NFU1M6Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCS8qCiAJCSAqIHN0b3AgdHggc2lkZSBpbmNhc2UgdGhlIHRhcmdldCBoYWQgc2VudCBhIGFib3J0IHJzcCBidXQKIAkJICogdGhlIGluaXRpYXRvciB3YXMgc3RpbGwgd3JpdGluZyBvdXQgZGF0YS4KQEAgLTIxNjcsMTUgKzIxODIsMTUgQEAKIAkJICogZ29vZCBhbmQgaGF2ZSBuZXZlciBzZW50IHVzIGEgc3VjY2Vzc2Z1bCB0bWYgcmVzcG9uc2UKIAkJICogdGhlbiBzZW50IG1vcmUgZGF0YSBmb3IgdGhlIGNtZC4KIAkJICovCi0JCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJZmFpbF9zY3NpX3Rhc2sodGFzaywgRElEX0FCT1JUKTsKIAkJY29ubi0+dG1mX3N0YXRlID0gVE1GX0lOSVRJQUw7CiAJCW1lbXNldChoZHIsIDAsIHNpemVvZigqaGRyKSk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWlzY3NpX3N0YXJ0X3R4KGNvbm4pOwogCQlnb3RvIHN1Y2Nlc3NfdW5sb2NrZWQ7CiAJY2FzZSBUTUZfVElNRURPVVQ6Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWlzY3NpX2Nvbm5fZmFpbHVyZShjb25uLCBJU0NTSV9FUlJfU0NTSV9FSF9TRVNTSU9OX1JTVCk7CiAJCWdvdG8gZmFpbGVkX3VubG9ja2VkOwogCWNhc2UgVE1GX05PVF9GT1VORDoKQEAgLTIxOTQsNyArMjIwOSw3IEBACiAJfQogCiBzdWNjZXNzOgotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIHN1Y2Nlc3NfdW5sb2NrZWQ6CiAJSVNDU0lfREJHX0VIKHNlc3Npb24sICJhYm9ydCBzdWNjZXNzIFtzYyAlcCBpdHQgMHgleF1cbiIsCiAJCSAgICAgc2MsIHRhc2stPml0dCk7CkBAIC0yMjAyLDcgKzIyMTcsNyBAQAogCXJldHVybiBTVUNDRVNTOwogCiBmYWlsZWQ6Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogZmFpbGVkX3VubG9ja2VkOgogCUlTQ1NJX0RCR19FSChzZXNzaW9uLCAiYWJvcnQgZmFpbGVkIFtzYyAlcCBpdHQgMHgleF1cbiIsIHNjLAogCQkgICAgIHRhc2sgPyB0YXNrLT5pdHQgOiAwKTsKQEAgLTIyMzUsNyArMjI1MCw3IEBACiAJSVNDU0lfREJHX0VIKHNlc3Npb24sICJMVSBSZXNldCBbc2MgJXAgbHVuICV1XVxuIiwgc2MsIHNjLT5kZXZpY2UtPmx1bik7CiAKIAltdXRleF9sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7Ci0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJLyoKIAkgKiBKdXN0IGNoZWNrIGlmIHdlIGFyZSBub3QgbG9nZ2VkIGluLiBXZSBjYW5ub3QgY2hlY2sgZm9yCiAJICogdGhlIHBoYXNlIGJlY2F1c2UgdGhlIHJlc2V0IGNvdWxkIGNvbWUgZnJvbSBhIGlvY3RsLgpAQCAtMjI2Miw3ICsyMjc3LDcgQEAKIAljYXNlIFRNRl9TVUNDRVNTOgogCQlicmVhazsKIAljYXNlIFRNRl9USU1FRE9VVDoKLQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJaXNjc2lfY29ubl9mYWlsdXJlKGNvbm4sIElTQ1NJX0VSUl9TQ1NJX0VIX1NFU1NJT05fUlNUKTsKIAkJZ290byBkb25lOwogCWRlZmF1bHQ6CkBAIC0yMjcxLDIxICsyMjg2LDIxIEBACiAJfQogCiAJcmMgPSBTVUNDRVNTOwotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAogCWlzY3NpX3N1c3BlbmRfdHgoY29ubik7CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAltZW1zZXQoaGRyLCAwLCBzaXplb2YoKmhkcikpOwogCWZhaWxfc2NzaV90YXNrcyhjb25uLCBzYy0+ZGV2aWNlLT5sdW4sIERJRF9FUlJPUik7CiAJY29ubi0+dG1mX3N0YXRlID0gVE1GX0lOSVRJQUw7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCiAJaXNjc2lfc3RhcnRfdHgoY29ubik7CiAJZ290byBkb25lOwogCiB1bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogZG9uZToKIAlJU0NTSV9EQkdfRUgoc2Vzc2lvbiwgImRldiByZXNldCByZXN1bHQgPSAlc1xuIiwKIAkJICAgICByYyA9PSBTVUNDRVNTID8gIlNVQ0NFU1MiIDogIkZBSUxFRCIpOwpAQCAtMjI5OCwxMyArMjMxMywxMyBAQAogewogCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY2xzX3Nlc3Npb24tPmRkX2RhdGE7CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlpZiAoc2Vzc2lvbi0+c3RhdGUgIT0gSVNDU0lfU1RBVEVfTE9HR0VEX0lOKSB7CiAJCXNlc3Npb24tPnN0YXRlID0gSVNDU0lfU1RBVEVfUkVDT1ZFUllfRkFJTEVEOwogCQlpZiAoc2Vzc2lvbi0+bGVhZGNvbm4pCiAJCQl3YWtlX3VwKCZzZXNzaW9uLT5sZWFkY29ubi0+ZWh3YWl0KTsKIAl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfc2Vzc2lvbl9yZWNvdmVyeV90aW1lZG91dCk7CiAKQEAgLTIzMjYsMTkgKzIzNDEsMTkgQEAKIAljb25uID0gc2Vzc2lvbi0+bGVhZGNvbm47CiAKIAltdXRleF9sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7Ci0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJaWYgKHNlc3Npb24tPnN0YXRlID09IElTQ1NJX1NUQVRFX1RFUk1JTkFURSkgewogZmFpbGVkOgogCQlJU0NTSV9EQkdfRUgoc2Vzc2lvbiwKIAkJCSAgICAgImZhaWxpbmcgc2Vzc2lvbiByZXNldDogQ291bGQgbm90IGxvZyBiYWNrIGludG8gIgogCQkJICAgICAiJXMsICVzIFthZ2UgJWRdXG4iLCBzZXNzaW9uLT50YXJnZXRuYW1lLAogCQkJICAgICBjb25uLT5wZXJzaXN0ZW50X2FkZHJlc3MsIHNlc3Npb24tPmFnZSk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCW11dGV4X3VubG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwogCQlyZXR1cm4gRkFJTEVEOwogCX0KIAotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAltdXRleF91bmxvY2soJnNlc3Npb24tPmVoX211dGV4KTsKIAkvKgogCSAqIHdlIGRyb3AgdGhlIGxvY2sgaGVyZSBidXQgdGhlIGxlYWRjb25uIGNhbm5vdCBiZSBkZXN0b3llZCB3aGlsZQpAQCAtMjM1NSwxNCArMjM3MCwxNCBAQAogCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwogCiAJbXV0ZXhfbG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWlmIChzZXNzaW9uLT5zdGF0ZSA9PSBJU0NTSV9TVEFURV9MT0dHRURfSU4pIHsKIAkJSVNDU0lfREJHX0VIKHNlc3Npb24sCiAJCQkgICAgICJzZXNzaW9uIHJlc2V0IHN1Y2NlZWRlZCBmb3IgJXMsJXNcbiIsCiAJCQkgICAgIHNlc3Npb24tPnRhcmdldG5hbWUsIGNvbm4tPnBlcnNpc3RlbnRfYWRkcmVzcyk7CiAJfSBlbHNlCiAJCWdvdG8gZmFpbGVkOwotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAltdXRleF91bmxvY2soJnNlc3Npb24tPmVoX211dGV4KTsKIAlyZXR1cm4gU1VDQ0VTUzsKIH0KQEAgLTIzOTgsNyArMjQxMyw3IEBACiAJCSAgICAgc2Vzc2lvbi0+dGFyZ2V0bmFtZSk7CiAKIAltdXRleF9sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7Ci0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJLyoKIAkgKiBKdXN0IGNoZWNrIGlmIHdlIGFyZSBub3QgbG9nZ2VkIGluLiBXZSBjYW5ub3QgY2hlY2sgZm9yCiAJICogdGhlIHBoYXNlIGJlY2F1c2UgdGhlIHJlc2V0IGNvdWxkIGNvbWUgZnJvbSBhIGlvY3RsLgpAQCAtMjQyNSw3ICsyNDQwLDcgQEAKIAljYXNlIFRNRl9TVUNDRVNTOgogCQlicmVhazsKIAljYXNlIFRNRl9USU1FRE9VVDoKLQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJaXNjc2lfY29ubl9mYWlsdXJlKGNvbm4sIElTQ1NJX0VSUl9TQ1NJX0VIX1NFU1NJT05fUlNUKTsKIAkJZ290byBkb25lOwogCWRlZmF1bHQ6CkBAIC0yNDM0LDIxICsyNDQ5LDIxIEBACiAJfQogCiAJcmMgPSBTVUNDRVNTOwotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAogCWlzY3NpX3N1c3BlbmRfdHgoY29ubik7CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAltZW1zZXQoaGRyLCAwLCBzaXplb2YoKmhkcikpOwogCWZhaWxfc2NzaV90YXNrcyhjb25uLCAtMSwgRElEX0VSUk9SKTsKIAljb25uLT50bWZfc3RhdGUgPSBUTUZfSU5JVElBTDsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAKIAlpc2NzaV9zdGFydF90eChjb25uKTsKIAlnb3RvIGRvbmU7CiAKIHVubG9jazoKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiBkb25lOgogCUlTQ1NJX0RCR19FSChzZXNzaW9uLCAidGd0ICVzIHJlc2V0IHJlc3VsdCA9ICVzXG4iLCBzZXNzaW9uLT50YXJnZXRuYW1lLAogCQkgICAgIHJjID09IFNVQ0NFU1MgPyAiU1VDQ0VTUyIgOiAiRkFJTEVEIik7CkBAIC0yNzQ2LDggKzI3NjEsMTAgQEAKIAlzZXNzaW9uLT5tYXhfcjJ0ID0gMTsKIAlzZXNzaW9uLT50dCA9IGlzY3NpdDsKIAlzZXNzaW9uLT5kZF9kYXRhID0gY2xzX3Nlc3Npb24tPmRkX2RhdGEgKyBzaXplb2YoKnNlc3Npb24pOworCiAJbXV0ZXhfaW5pdCgmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwotCXNwaW5fbG9ja19pbml0KCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAogCS8qIGluaXRpYWxpemUgU0NTSSBQRFUgY29tbWFuZHMgcG9vbCAqLwogCWlmIChpc2NzaV9wb29sX2luaXQoJnNlc3Npb24tPmNtZHBvb2wsIHNlc3Npb24tPmNtZHNfbWF4LApAQCAtMjg2MSwxNCArMjg3OCwxNCBAQAogCUlOSVRfV09SSygmY29ubi0+eG1pdHdvcmssIGlzY3NpX3htaXR3b3JrZXIpOwogCiAJLyogYWxsb2NhdGUgbG9naW5fdGFzayB1c2VkIGZvciB0aGUgbG9naW4vdGV4dCBzZXF1ZW5jZXMgKi8KLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlpZiAoIWtmaWZvX291dCgmc2Vzc2lvbi0+Y21kcG9vbC5xdWV1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopJmNvbm4tPmxvZ2luX3Rhc2ssCiAJCQkgc2l6ZW9mKHZvaWQqKSkpIHsKLQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJZ290byBsb2dpbl90YXNrX2FsbG9jX2ZhaWw7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAogCWRhdGEgPSAoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsCiAJCQkJCSBnZXRfb3JkZXIoSVNDU0lfREVGX01BWF9SRUNWX1NFR19MRU4pKTsKQEAgLTI5MDUsNyArMjkyMiw3IEBACiAKIAlkZWxfdGltZXJfc3luYygmY29ubi0+dHJhbnNwb3J0X3RpbWVyKTsKIAotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWNvbm4tPmNfc3RhZ2UgPSBJU0NTSV9DT05OX0NMRUFOVVBfV0FJVDsKIAlpZiAoc2Vzc2lvbi0+bGVhZGNvbm4gPT0gY29ubikgewogCQkvKgpAQCAtMjkxNCw3ICsyOTMxLDcgQEAKIAkJc2Vzc2lvbi0+c3RhdGUgPSBJU0NTSV9TVEFURV9URVJNSU5BVEU7CiAJCXdha2VfdXAoJmNvbm4tPmVod2FpdCk7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAogCS8qCiAJICogQmxvY2sgdW50aWwgYWxsIGluLXByb2dyZXNzIGNvbW1hbmRzIGZvciB0aGlzIGNvbm5lY3Rpb24KQEAgLTI5NDEsMTYgKzI5NTgsMTkgQEAKIAkvKiBmbHVzaCBxdWV1ZWQgdXAgd29yayBiZWNhdXNlIHdlIGZyZWUgdGhlIGNvbm5lY3Rpb24gYmVsb3cgKi8KIAlpc2NzaV9zdXNwZW5kX3R4KGNvbm4pOwogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgY29ubi0+ZGF0YSwKIAkJICAgZ2V0X29yZGVyKElTQ1NJX0RFRl9NQVhfUkVDVl9TRUdfTEVOKSk7CiAJa2ZyZWUoY29ubi0+cGVyc2lzdGVudF9hZGRyZXNzKTsKIAlrZnJlZShjb25uLT5sb2NhbF9pcGFkZHIpOworCS8qIHJlZ3VsYXIgUlggcGF0aCB1c2VzIGJhY2tfbG9jayAqLworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAlrZmlmb19pbigmc2Vzc2lvbi0+Y21kcG9vbC5xdWV1ZSwgKHZvaWQqKSZjb25uLT5sb2dpbl90YXNrLAogCQkgICAgc2l6ZW9mKHZvaWQqKSk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJaWYgKHNlc3Npb24tPmxlYWRjb25uID09IGNvbm4pCiAJCXNlc3Npb24tPmxlYWRjb25uID0gTlVMTDsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAKIAlpc2NzaV9kZXN0cm95X2Nvbm4oY2xzX2Nvbm4pOwogfQpAQCAtMjk4Nyw3ICszMDA3LDcgQEAKIAkJY29ubi0+cGluZ190aW1lb3V0ID0gNTsKIAl9CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAljb25uLT5jX3N0YWdlID0gSVNDU0lfQ09OTl9TVEFSVEVEOwogCXNlc3Npb24tPnN0YXRlID0gSVNDU0lfU1RBVEVfTE9HR0VEX0lOOwogCXNlc3Npb24tPnF1ZXVlZF9jbWRzbiA9IHNlc3Npb24tPmNtZHNuOwpAQCAtMzAxNiw3ICszMDM2LDcgQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCiAJaXNjc2lfdW5ibG9ja19zZXNzaW9uKHNlc3Npb24tPmNsc19zZXNzaW9uKTsKIAl3YWtlX3VwKCZjb25uLT5laHdhaXQpOwpAQCAtMzA1NSw5ICszMDc1LDkgQEAKIAlpbnQgb2xkX3N0b3Bfc3RhZ2U7CiAKIAltdXRleF9sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7Ci0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJaWYgKGNvbm4tPnN0b3Bfc3RhZ2UgPT0gU1RPUF9DT05OX1RFUk0pIHsKLQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJbXV0ZXhfdW5sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7CiAJCXJldHVybjsKIAl9CkBAIC0zMDc0LDE0ICszMDk0LDE0IEBACiAKIAlvbGRfc3RvcF9zdGFnZSA9IGNvbm4tPnN0b3Bfc3RhZ2U7CiAJY29ubi0+c3RvcF9zdGFnZSA9IGZsYWc7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCiAJZGVsX3RpbWVyX3N5bmMoJmNvbm4tPnRyYW5zcG9ydF90aW1lcik7CiAJaXNjc2lfc3VzcGVuZF90eChjb25uKTsKIAotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWNvbm4tPmNfc3RhZ2UgPSBJU0NTSV9DT05OX1NUT1BQRUQ7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCiAJLyoKIAkgKiBmb3IgY29ubmVjdGlvbiBsZXZlbCByZWNvdmVyeSB3ZSBzaG91bGQgbm90IGNhbGN1bGF0ZQpAQCAtMzEwMiwxMSArMzEyMiwxMSBAQAogCS8qCiAJICogZmx1c2ggcXVldWVzLgogCSAqLwotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWZhaWxfc2NzaV90YXNrcyhjb25uLCAtMSwgRElEX1RSQU5TUE9SVF9ESVNSVVBURUQpOwogCWZhaWxfbWdtdF90YXNrcyhzZXNzaW9uLCBjb25uKTsKIAltZW1zZXQoJmNvbm4tPnRtaGRyLCAwLCBzaXplb2YoY29ubi0+dG1oZHIpKTsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJbXV0ZXhfdW5sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7CiB9CiAKQEAgLTMxMzMsMTAgKzMxNTMsMTAgQEAKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNsc19zZXNzaW9uLT5kZF9kYXRhOwogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlpZiAoaXNfbGVhZGluZykKIAkJc2Vzc2lvbi0+bGVhZGNvbm4gPSBjb25uOwotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAogCS8qCiAJICogVW5ibG9jayB4bWl0d29ya2VyKCksIExvZ2luIFBoYXNlIHdpbGwgcGFzcyB0aHJvdWdoLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpX3RjcC5jIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpX3RjcC5jCmluZGV4IDFkNThkNTMuLjYwY2I2ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJpc2NzaV90Y3AuYworKysgYi9kcml2ZXJzL3Njc2kvbGliaXNjc2lfdGNwLmMKQEAgLTQ0Niw3ICs0NDYsNyBAQAogICogaXNjc2lfdGNwX2NsZWFudXBfdGFzayAtIGZyZWUgdGNwX3Rhc2sgcmVzb3VyY2VzCiAgKiBAdGFzazogaXNjc2kgdGFzawogICoKLSAqIG11c3QgYmUgY2FsbGVkIHdpdGggc2Vzc2lvbiBsb2NrCisgKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHNlc3Npb24gYmFja19sb2NrCiAgKi8KIHZvaWQgaXNjc2lfdGNwX2NsZWFudXBfdGFzayhzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaykKIHsKQEAgLTQ1Nyw2ICs0NTcsNyBAQAogCWlmICghdGFzay0+c2MpCiAJCXJldHVybjsKIAorCXNwaW5fbG9ja19iaCgmdGNwX3Rhc2stPnF1ZXVlMnBvb2wpOwogCS8qIGZsdXNoIHRhc2sncyByMnQgcXVldWVzICovCiAJd2hpbGUgKGtmaWZvX291dCgmdGNwX3Rhc2stPnIydHF1ZXVlLCAodm9pZCopJnIydCwgc2l6ZW9mKHZvaWQqKSkpIHsKIAkJa2ZpZm9faW4oJnRjcF90YXNrLT5yMnRwb29sLnF1ZXVlLCAodm9pZCopJnIydCwKQEAgLTQ3MCw2ICs0NzEsNyBAQAogCQkJICAgIHNpemVvZih2b2lkKikpOwogCQl0Y3BfdGFzay0+cjJ0ID0gTlVMTDsKIAl9CisJc3Bpbl91bmxvY2tfYmgoJnRjcF90YXNrLT5xdWV1ZTJwb29sKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX3RjcF9jbGVhbnVwX3Rhc2spOwogCkBAIC01MjksNiArNTMxLDggQEAKIAlzdHJ1Y3QgaXNjc2lfcjJ0X3JzcCAqcmhkciA9IChzdHJ1Y3QgaXNjc2lfcjJ0X3JzcCAqKXRjcF9jb25uLT5pbi5oZHI7CiAJc3RydWN0IGlzY3NpX3IydF9pbmZvICpyMnQ7CiAJaW50IHIydHNuID0gYmUzMl90b19jcHUocmhkci0+cjJ0c24pOworCXUzMiBkYXRhX2xlbmd0aDsKKwl1MzIgZGF0YV9vZmZzZXQ7CiAJaW50IHJjOwogCiAJaWYgKHRjcF9jb25uLT5pbi5kYXRhbGVuKSB7CkBAIC01NTQsMzkgKzU1OCw0MCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlyYyA9IGtmaWZvX291dCgmdGNwX3Rhc2stPnIydHBvb2wucXVldWUsICh2b2lkKikmcjJ0LCBzaXplb2Yodm9pZCopKTsKKwlkYXRhX2xlbmd0aCA9IGJlMzJfdG9fY3B1KHJoZHItPmRhdGFfbGVuZ3RoKTsKKwlpZiAoZGF0YV9sZW5ndGggPT0gMCkgeworCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwKKwkJCQkgICJpbnZhbGlkIFIyVCB3aXRoIHplcm8gZGF0YSBsZW5cbiIpOworCQlyZXR1cm4gSVNDU0lfRVJSX0RBVEFMRU47CisJfQorCisJaWYgKGRhdGFfbGVuZ3RoID4gc2Vzc2lvbi0+bWF4X2J1cnN0KQorCQlJU0NTSV9EQkdfVENQKGNvbm4sICJpbnZhbGlkIFIyVCB3aXRoIGRhdGEgbGVuICV1IGFuZCBtYXggIgorCQkJICAgICAgImJ1cnN0ICV1LiBBdHRlbXB0aW5nIHRvIGV4ZWN1dGUgcmVxdWVzdC5cbiIsCisJCQkgICAgICBkYXRhX2xlbmd0aCwgc2Vzc2lvbi0+bWF4X2J1cnN0KTsKKworCWRhdGFfb2Zmc2V0ID0gYmUzMl90b19jcHUocmhkci0+ZGF0YV9vZmZzZXQpOworCWlmIChkYXRhX29mZnNldCArIGRhdGFfbGVuZ3RoID4gc2NzaV9vdXQodGFzay0+c2MpLT5sZW5ndGgpIHsKKwkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCisJCQkJICAiaW52YWxpZCBSMlQgd2l0aCBkYXRhIGxlbiAldSBhdCBvZmZzZXQgJXUgIgorCQkJCSAgImFuZCB0b3RhbCBsZW5ndGggJWRcbiIsIGRhdGFfbGVuZ3RoLAorCQkJCSAgZGF0YV9vZmZzZXQsIHNjc2lfb3V0KHRhc2stPnNjKS0+bGVuZ3RoKTsKKwkJcmV0dXJuIElTQ1NJX0VSUl9EQVRBTEVOOworCX0KKworCXNwaW5fbG9jaygmdGNwX3Rhc2stPnBvb2wycXVldWUpOworCXJjID0ga2ZpZm9fb3V0KCZ0Y3BfdGFzay0+cjJ0cG9vbC5xdWV1ZSwgKHZvaWQgKikmcjJ0LCBzaXplb2Yodm9pZCAqKSk7CiAJaWYgKCFyYykgewogCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBSMlQuICIKIAkJCQkgICJUYXJnZXQgaGFzIHNlbnQgbW9yZSBSMlRzIHRoYW4gaXQgIgogCQkJCSAgIm5lZ290aWF0ZWQgZm9yIG9yIGRyaXZlciBoYXMgbGVha2VkLlxuIik7CisJCXNwaW5fdW5sb2NrKCZ0Y3BfdGFzay0+cG9vbDJxdWV1ZSk7CiAJCXJldHVybiBJU0NTSV9FUlJfUFJPVE87CiAJfQogCiAJcjJ0LT5leHBfc3RhdHNuID0gcmhkci0+c3RhdHNuOwotCXIydC0+ZGF0YV9sZW5ndGggPSBiZTMyX3RvX2NwdShyaGRyLT5kYXRhX2xlbmd0aCk7Ci0JaWYgKHIydC0+ZGF0YV9sZW5ndGggPT0gMCkgewotCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwKLQkJCQkgICJpbnZhbGlkIFIyVCB3aXRoIHplcm8gZGF0YSBsZW5cbiIpOwotCQlrZmlmb19pbigmdGNwX3Rhc2stPnIydHBvb2wucXVldWUsICh2b2lkKikmcjJ0LAotCQkJICAgIHNpemVvZih2b2lkKikpOwotCQlyZXR1cm4gSVNDU0lfRVJSX0RBVEFMRU47Ci0JfQotCi0JaWYgKHIydC0+ZGF0YV9sZW5ndGggPiBzZXNzaW9uLT5tYXhfYnVyc3QpCi0JCUlTQ1NJX0RCR19UQ1AoY29ubiwgImludmFsaWQgUjJUIHdpdGggZGF0YSBsZW4gJXUgYW5kIG1heCAiCi0JCQkgICAgICAiYnVyc3QgJXUuIEF0dGVtcHRpbmcgdG8gZXhlY3V0ZSByZXF1ZXN0LlxuIiwKLQkJCSAgICAgIHIydC0+ZGF0YV9sZW5ndGgsIHNlc3Npb24tPm1heF9idXJzdCk7Ci0KLQlyMnQtPmRhdGFfb2Zmc2V0ID0gYmUzMl90b19jcHUocmhkci0+ZGF0YV9vZmZzZXQpOwotCWlmIChyMnQtPmRhdGFfb2Zmc2V0ICsgcjJ0LT5kYXRhX2xlbmd0aCA+IHNjc2lfb3V0KHRhc2stPnNjKS0+bGVuZ3RoKSB7Ci0JCWlzY3NpX2Nvbm5fcHJpbnRrKEtFUk5fRVJSLCBjb25uLAotCQkJCSAgImludmFsaWQgUjJUIHdpdGggZGF0YSBsZW4gJXUgYXQgb2Zmc2V0ICV1ICIKLQkJCQkgICJhbmQgdG90YWwgbGVuZ3RoICVkXG4iLCByMnQtPmRhdGFfbGVuZ3RoLAotCQkJCSAgcjJ0LT5kYXRhX29mZnNldCwgc2NzaV9vdXQodGFzay0+c2MpLT5sZW5ndGgpOwotCQlrZmlmb19pbigmdGNwX3Rhc2stPnIydHBvb2wucXVldWUsICh2b2lkKikmcjJ0LAotCQkJICAgIHNpemVvZih2b2lkKikpOwotCQlyZXR1cm4gSVNDU0lfRVJSX0RBVEFMRU47Ci0JfQorCXIydC0+ZGF0YV9sZW5ndGggPSBkYXRhX2xlbmd0aDsKKwlyMnQtPmRhdGFfb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CiAKIAlyMnQtPnR0dCA9IHJoZHItPnR0dDsgLyogbm8gZmxpcCAqLwogCXIydC0+ZGF0YXNuID0gMDsKQEAgLTU5NSw2ICs2MDAsNyBAQAogCXRjcF90YXNrLT5leHBfZGF0YXNuID0gcjJ0c24gKyAxOwogCWtmaWZvX2luKCZ0Y3BfdGFzay0+cjJ0cXVldWUsICh2b2lkKikmcjJ0LCBzaXplb2Yodm9pZCopKTsKIAljb25uLT5yMnRfcGR1c19jbnQrKzsKKwlzcGluX3VubG9jaygmdGNwX3Rhc2stPnBvb2wycXVldWUpOwogCiAJaXNjc2lfcmVxdWV1ZV90YXNrKHRhc2spOwogCXJldHVybiAwOwpAQCAtNjY3LDE0ICs2NzMsMTQgQEAKIAogCXN3aXRjaChvcGNvZGUpIHsKIAljYXNlIElTQ1NJX09QX1NDU0lfREFUQV9JTjoKLQkJc3Bpbl9sb2NrKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl9sb2NrKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCQl0YXNrID0gaXNjc2lfaXR0X3RvX2N0YXNrKGNvbm4sIGhkci0+aXR0KTsKIAkJaWYgKCF0YXNrKQogCQkJcmMgPSBJU0NTSV9FUlJfQkFEX0lUVDsKIAkJZWxzZQogCQkJcmMgPSBpc2NzaV90Y3BfZGF0YV9pbihjb25uLCB0YXNrKTsKIAkJaWYgKHJjKSB7Ci0JCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTcwNywxMSArNzEzLDExIEBACiAJCQkJCQkgICB0Y3BfY29ubi0+aW4uZGF0YWxlbiwKIAkJCQkJCSAgIGlzY3NpX3RjcF9wcm9jZXNzX2RhdGFfaW4sCiAJCQkJCQkgICByeF9oYXNoKTsKLQkJCXNwaW5fdW5sb2NrKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCQkJcmV0dXJuIHJjOwogCQl9CiAJCXJjID0gX19pc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgaGRyLCBOVUxMLCAwKTsKLQkJc3Bpbl91bmxvY2soJmNvbm4tPnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAkJYnJlYWs7CiAJY2FzZSBJU0NTSV9PUF9TQ1NJX0NNRF9SU1A6CiAJCWlmICh0Y3BfY29ubi0+aW4uZGF0YWxlbikgewpAQCAtNzIxLDE4ICs3MjcsMjAgQEAKIAkJcmMgPSBpc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgaGRyLCBOVUxMLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBJU0NTSV9PUF9SMlQ6Ci0JCXNwaW5fbG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fbG9jaygmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAkJdGFzayA9IGlzY3NpX2l0dF90b19jdGFzayhjb25uLCBoZHItPml0dCk7CisJCXNwaW5fdW5sb2NrKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCQlpZiAoIXRhc2spCiAJCQlyYyA9IElTQ1NJX0VSUl9CQURfSVRUOwogCQllbHNlIGlmIChhaHNsZW4pCiAJCQlyYyA9IElTQ1NJX0VSUl9BSFNMRU47CiAJCWVsc2UgaWYgKHRhc2stPnNjLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CiAJCQl0YXNrLT5sYXN0X3hmZXIgPSBqaWZmaWVzOworCQkJc3Bpbl9sb2NrKCZjb25uLT5zZXNzaW9uLT5mcndkX2xvY2spOwogCQkJcmMgPSBpc2NzaV90Y3BfcjJ0X3JzcChjb25uLCB0YXNrKTsKKwkJCXNwaW5fdW5sb2NrKCZjb25uLT5zZXNzaW9uLT5mcndkX2xvY2spOwogCQl9IGVsc2UKIAkJCXJjID0gSVNDU0lfRVJSX1BST1RPOwotCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfT1BfTE9HSU5fUlNQOgogCWNhc2UgSVNDU0lfT1BfVEVYVF9SU1A6CkBAIC05ODAsMTQgKzk4OCwxMyBAQAogCiBzdGF0aWMgc3RydWN0IGlzY3NpX3IydF9pbmZvICppc2NzaV90Y3BfZ2V0X2N1cnJfcjJ0KHN0cnVjdCBpc2NzaV90YXNrICp0YXNrKQogewotCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gdGFzay0+Y29ubi0+c2Vzc2lvbjsKIAlzdHJ1Y3QgaXNjc2lfdGNwX3Rhc2sgKnRjcF90YXNrID0gdGFzay0+ZGRfZGF0YTsKIAlzdHJ1Y3QgaXNjc2lfcjJ0X2luZm8gKnIydCA9IE5VTEw7CiAKIAlpZiAoaXNjc2lfdGFza19oYXNfdW5zb2xfZGF0YSh0YXNrKSkKIAkJcjJ0ID0gJnRhc2stPnVuc29sX3IydDsKIAllbHNlIHsKLQkJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl9sb2NrX2JoKCZ0Y3BfdGFzay0+cXVldWUycG9vbCk7CiAJCWlmICh0Y3BfdGFzay0+cjJ0KSB7CiAJCQlyMnQgPSB0Y3BfdGFzay0+cjJ0OwogCQkJLyogQ29udGludWUgd2l0aCB0aGlzIFIyVD8gKi8KQEAgLTEwMDksNyArMTAxNiw3IEBACiAJCQllbHNlCiAJCQkJcjJ0ID0gdGNwX3Rhc2stPnIydDsKIAkJfQotCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZ0Y3BfdGFzay0+cXVldWUycG9vbCk7CiAJfQogCiAJcmV0dXJuIHIydDsKQEAgLTExMzksNiArMTE0Niw4IEBACiAJCQlpc2NzaV9wb29sX2ZyZWUoJnRjcF90YXNrLT5yMnRwb29sKTsKIAkJCWdvdG8gcjJ0X2FsbG9jX2ZhaWw7CiAJCX0KKwkJc3Bpbl9sb2NrX2luaXQoJnRjcF90YXNrLT5wb29sMnF1ZXVlKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnRjcF90YXNrLT5xdWV1ZTJwb29sKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMKaW5kZXggZGEzYWVlMS4uMjVkMGYxMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCkBAIC04NjIsNyArODYyLDcgQEAKIAogZW51bSBibGtfZWhfdGltZXJfcmV0dXJuIHNhc19zY3NpX3RpbWVkX291dChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7Ci0Jc2NtZF9wcmludGsoS0VSTl9ERUJVRywgY21kLCAiY29tbWFuZCAlcCB0aW1lZCBvdXRcbiIsIGNtZCk7CisJc2NtZF9kYmcoY21kLCAiY29tbWFuZCAlcCB0aW1lZCBvdXRcbiIsIGNtZCk7CiAKIAlyZXR1cm4gQkxLX0VIX05PVF9IQU5ETEVEOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmYy5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmYy5oCmluZGV4IDRlMWI3NWMuLjk0YTNjYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmMuaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmgKQEAgLTczLDggKzczLDYgQEAKICAqLwogLyogMSBTZWNvbmQgKi8KICNkZWZpbmUgUVVFVUVfUkFNUF9ET1dOX0lOVEVSVkFMCShtc2Vjc190b19qaWZmaWVzKDEwMDAgKiAxKSkKLS8qIDUgbWludXRlcyAqLwotI2RlZmluZSBRVUVVRV9SQU1QX1VQX0lOVEVSVkFMCQkobXNlY3NfdG9famlmZmllcygxMDAwICogMzAwKSkKIAogLyogTnVtYmVyIG9mIGV4Y2hhbmdlcyByZXNlcnZlZCBmb3IgZGlzY292ZXJ5IHRvIGNvbXBsZXRlICovCiAjZGVmaW5lIExQRkNfRElTQ19JT0NCX0JVRkZfQ09VTlQgMjAKQEAgLTcyMiw2ICs3MjAsMjAgQEAKIAl1aW50MzJfdCBjZmdfaGJhX3F1ZXVlX2RlcHRoOwogCXVpbnQzMl90IGNmZ19lbmFibGVfaGJhX3Jlc2V0OwogCXVpbnQzMl90IGNmZ19lbmFibGVfaGJhX2hlYXJ0YmVhdDsKKwl1aW50MzJfdCBjZmdfZm9mOworCXVpbnQzMl90IGNmZ19FbmFibGVYTGFuZTsKKwl1aW50OF90IGNmZ19vYXNfdGd0X3d3cG5bOF07CisJdWludDhfdCBjZmdfb2FzX3ZwdF93d3BuWzhdOworCXVpbnQzMl90IGNmZ19vYXNfbHVuX3N0YXRlOworI2RlZmluZSBPQVNfTFVOX0VOQUJMRQkxCisjZGVmaW5lIE9BU19MVU5fRElTQUJMRQkwCisJdWludDMyX3QgY2ZnX29hc19sdW5fc3RhdHVzOworI2RlZmluZSBPQVNfTFVOX1NUQVRVU19FWElTVFMJMHgwMQorCXVpbnQzMl90IGNmZ19vYXNfZmxhZ3M7CisjZGVmaW5lIE9BU19GSU5EX0FOWV9WUE9SVAkweDAxCisjZGVmaW5lIE9BU19GSU5EX0FOWV9UQVJHRVQJMHgwMgorI2RlZmluZSBPQVNfTFVOX1ZBTElECTB4MDQKKwl1aW50MzJfdCBjZmdfWExhbmVQcmlvcml0eTsKIAl1aW50MzJfdCBjZmdfZW5hYmxlX2JnOwogCXVpbnQzMl90IGNmZ19ob3N0bWVtX2hncDsKIAl1aW50MzJfdCBjZmdfbG9nX3ZlcmJvc2U7CkBAIC03MzAsNiArNzQyLDcgQEAKIAl1aW50MzJfdCBjZmdfcmVxdWVzdF9maXJtd2FyZV91cGdyYWRlOwogCXVpbnQzMl90IGNmZ19pb2NiX2NudDsKIAl1aW50MzJfdCBjZmdfc3VwcHJlc3NfbGlua191cDsKKwl1aW50MzJfdCBjZmdfcnJxX3hyaV9iaXRtYXBfc3o7CiAjZGVmaW5lIExQRkNfSU5JVElBTElaRV9MSU5LICAgICAgICAgICAgICAwCS8qIGRvIG5vcm1hbCBpbml0X2xpbmsgbWJveCAqLwogI2RlZmluZSBMUEZDX0RFTEFZX0lOSVRfTElOSyAgICAgICAgICAgICAgMQkvKiBsYXllcmVkIGRyaXZlciBob2xkIG9mZiAqLwogI2RlZmluZSBMUEZDX0RFTEFZX0lOSVRfTElOS19JTkRFRklOSVRFTFkgMgkvKiB3YWl0LCBtYW51YWwgaW50ZXJ2ZW50aW9uICovCkBAIC04MzUsNiArODQ4LDcgQEAKIAltZW1wb29sX3QgKm1ib3hfbWVtX3Bvb2w7CiAJbWVtcG9vbF90ICpubHBfbWVtX3Bvb2w7CiAJbWVtcG9vbF90ICpycnFfcG9vbDsKKwltZW1wb29sX3QgKmFjdGl2ZV9ycnFfcG9vbDsKIAogCXN0cnVjdCBmY19ob3N0X3N0YXRpc3RpY3MgbGlua19zdGF0czsKIAllbnVtIGludHJfdHlwZV90IGludHJfdHlwZTsKQEAgLTg2OSw3ICs4ODMsNiBAQAogCWF0b21pY190IG51bV9jbWRfc3VjY2VzczsKIAl1bnNpZ25lZCBsb25nIGxhc3RfcnNyY19lcnJvcl90aW1lOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9yYW1wX2Rvd25fdGltZTsKLQl1bnNpZ25lZCBsb25nIGxhc3RfcmFtcF91cF90aW1lOwogI2lmZGVmIENPTkZJR19TQ1NJX0xQRkNfREVCVUdfRlMKIAlzdHJ1Y3QgZGVudHJ5ICpoYmFfZGVidWdmc19yb290OwogCWF0b21pY190IGRlYnVnZnNfdnBvcnRfY291bnQ7CkBAIC05NzEsNiArOTg0LDkgQEAKIAlhdG9taWNfdCBzZGV2X2NudDsKIAl1aW50OF90IGZpcHNfc3BlY19yZXY7CiAJdWludDhfdCBmaXBzX2xldmVsOworCXNwaW5sb2NrX3QgZGV2aWNlbG9jazsJLyogbG9jayBmb3IgbHVucyBsaXN0ICovCisJbWVtcG9vbF90ICpkZXZpY2VfZGF0YV9tZW1fcG9vbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGx1bnM7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBTY3NpX0hvc3QgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYwppbmRleCAwMDY1NmZjLi44ZDViNmNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYwpAQCAtNTI5LDYgKzUyOSwyNyBAQAogfQogCiAvKioKKyAqIGxwZmNfb2FzX3N1cHBvcnRlZF9zaG93IC0gUmV0dXJuIHdoZXRoZXIgb3Igbm90IE9wdGltaXplZCBBY2Nlc3MgU3RvcmFnZQorICoJCQkgICAgKE9BUykgaXMgc3VwcG9ydGVkLgorICogQGRldjogY2xhc3MgdW51c2VkIHZhcmlhYmxlLgorICogQGF0dHI6IGRldmljZSBhdHRyaWJ1dGUsIG5vdCB1c2VkLgorICogQGJ1Zjogb24gcmV0dXJuIGNvbnRhaW5zIHRoZSBtb2R1bGUgZGVzY3JpcHRpb24gdGV4dC4KKyAqCisgKiBSZXR1cm5zOiBzaXplIG9mIGZvcm1hdHRlZCBzdHJpbmcuCisgKiovCitzdGF0aWMgc3NpemVfdAorbHBmY19vYXNfc3VwcG9ydGVkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0ID0gKHN0cnVjdCBscGZjX3Zwb3J0ICopc2hvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9IHZwb3J0LT5waGJhOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsCisJCQlwaGJhLT5zbGk0X2hiYS5wY19zbGk0X3BhcmFtcy5vYXNfc3VwcG9ydGVkKTsKK30KKworLyoqCiAgKiBscGZjX2xpbmtfc3RhdGVfc3RvcmUgLSBUcmFuc2l0aW9uIHRoZSBsaW5rX3N0YXRlIG9uIGFuIEhCQSBwb3J0CiAgKiBAZGV2OiBjbGFzcyBkZXZpY2UgdGhhdCBpcyBjb252ZXJ0ZWQgaW50byBhIFNjc2lfaG9zdC4KICAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlLCBub3QgdXNlZC4KQEAgLTIwNDEsOSArMjA2Miw1MyBAQAogc3RhdGljIERFVklDRV9BVFRSKGxwZmNfc3Jpb3ZfaHdfbWF4X3ZpcnRmbiwgU19JUlVHTywKIAkJICAgbHBmY19zcmlvdl9od19tYXhfdmlydGZuX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKHByb3RvY29sLCBTX0lSVUdPLCBscGZjX3NsaTRfcHJvdG9jb2xfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIobHBmY194bGFuZV9zdXBwb3J0ZWQsIFNfSVJVR08sIGxwZmNfb2FzX3N1cHBvcnRlZF9zaG93LAorCQkgICBOVUxMKTsKIAogc3RhdGljIGNoYXIgKmxwZmNfc29mdF93d25fa2V5ID0gIkM5OUc3MVNMODAzMkEiOworI2RlZmluZSBXV05fU1ogOAorLyoqCisgKiBscGZjX3d3bl9zZXQgLSBDb252ZXJ0IHN0cmluZyB0byB0aGUgOCBieXRlIFdXTiB2YWx1ZS4KKyAqIEBidWY6IFdXTiBzdHJpbmcuCisgKiBAY250OiBMZW5ndGggb2Ygc3RyaW5nLgorICogQHd3bjogQXJyYXkgdG8gcmVjZWl2ZSBjb252ZXJ0ZWQgd3duIHZhbHVlLgorICoKKyAqIFJldHVybnM6CisgKiAtRUlOVkFMIGlmIHRoZSBidWZmZXIgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIHd3bgorICogMCBzdWNjZXNzCisgKiovCitzdGF0aWMgc2l6ZV90CitscGZjX3d3bl9zZXQoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY250LCBjaGFyIHd3bltdKQoreworCXVuc2lnbmVkIGludCBpLCBqOwogCisJLyogQ291bnQgbWF5IGluY2x1ZGUgYSBMRiBhdCBlbmQgb2Ygc3RyaW5nICovCisJaWYgKGJ1ZltjbnQtMV0gPT0gJ1xuJykKKwkJY250LS07CisKKwlpZiAoKGNudCA8IDE2KSB8fCAoY250ID4gMTgpIHx8ICgoY250ID09IDE3KSAmJiAoKmJ1ZisrICE9ICd4JykpIHx8CisJICAgICgoY250ID09IDE4KSAmJiAoKCpidWYrKyAhPSAnMCcpIHx8ICgqYnVmKysgIT0gJ3gnKSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldCh3d24sIDAsIFdXTl9TWik7CisKKwkvKiBWYWxpZGF0ZSBhbmQgc3RvcmUgdGhlIG5ldyBuYW1lICovCisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWlmICgoKmJ1ZiA+PSAnYScpICYmICgqYnVmIDw9ICdmJykpCisJCQlqID0gKChqIDw8IDQpIHwgKCgqYnVmKysgLSAnYScpICsgMTApKTsKKwkJZWxzZSBpZiAoKCpidWYgPj0gJ0EnKSAmJiAoKmJ1ZiA8PSAnRicpKQorCQkJaiA9ICgoaiA8PCA0KSB8ICgoKmJ1ZisrIC0gJ0EnKSArIDEwKSk7CisJCWVsc2UgaWYgKCgqYnVmID49ICcwJykgJiYgKCpidWYgPD0gJzknKSkKKwkJCWogPSAoKGogPDwgNCkgfCAoKmJ1ZisrIC0gJzAnKSk7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoaSAlIDIpIHsKKwkJCXd3bltpLzJdID0gaiAmIDB4ZmY7CisJCQlqID0gMDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KIC8qKgogICogbHBmY19zb2Z0X3d3bl9lbmFibGVfc3RvcmUgLSBBbGxvd3Mgc2V0dGluZyBvZiB0aGUgd3duIGlmIHRoZSBrZXkgaXMgdmFsaWQKICAqIEBkZXY6IGNsYXNzIGRldmljZSB0aGF0IGlzIGNvbnZlcnRlZCBpbnRvIGEgU2NzaV9ob3N0LgpAQCAtMjEzMiw5ICsyMTk3LDkgQEAKIAlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQgPSAoc3RydWN0IGxwZmNfdnBvcnQgKikgc2hvc3QtPmhvc3RkYXRhOwogCXN0cnVjdCBscGZjX2hiYSAgICpwaGJhID0gdnBvcnQtPnBoYmE7CiAJc3RydWN0IGNvbXBsZXRpb24gb25saW5lX2NvbXBsOwotCWludCBzdGF0MT0wLCBzdGF0Mj0wOwotCXVuc2lnbmVkIGludCBpLCBqLCBjbnQ9Y291bnQ7Ci0JdTggd3dwbls4XTsKKwlpbnQgc3RhdDEgPSAwLCBzdGF0MiA9IDA7CisJdW5zaWduZWQgaW50IGNudCA9IGNvdW50OworCXU4IHd3cG5bV1dOX1NaXTsKIAlpbnQgcmM7CiAKIAlpZiAoIXBoYmEtPmNmZ19lbmFibGVfaGJhX3Jlc2V0KQpAQCAtMjE0OSwyOSArMjIxNCwxOSBAQAogCWlmIChidWZbY250LTFdID09ICdcbicpCiAJCWNudC0tOwogCi0JaWYgKCFwaGJhLT5zb2Z0X3d3bl9lbmFibGUgfHwgKGNudCA8IDE2KSB8fCAoY250ID4gMTgpIHx8Ci0JICAgICgoY250ID09IDE3KSAmJiAoKmJ1ZisrICE9ICd4JykpIHx8Ci0JICAgICgoY250ID09IDE4KSAmJiAoKCpidWYrKyAhPSAnMCcpIHx8ICgqYnVmKysgIT0gJ3gnKSkpKQorCWlmICghcGhiYS0+c29mdF93d25fZW5hYmxlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qIGxvY2sgc2V0dGluZyB3d3BuLCB3d25uIGRvd24gKi8KIAlwaGJhLT5zb2Z0X3d3bl9lbmFibGUgPSAwOwogCi0JbWVtc2V0KHd3cG4sIDAsIHNpemVvZih3d3BuKSk7Ci0KLQkvKiBWYWxpZGF0ZSBhbmQgc3RvcmUgdGhlIG5ldyBuYW1lICovCi0JZm9yIChpPTAsIGo9MDsgaSA8IDE2OyBpKyspIHsKLQkJaW50IHZhbHVlOwotCi0JCXZhbHVlID0gaGV4X3RvX2JpbigqYnVmKyspOwotCQlpZiAodmFsdWUgPj0gMCkKLQkJCWogPSAoaiA8PCA0KSB8IHZhbHVlOwotCQllbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGkgJSAyKSB7Ci0JCQl3d3BuW2kvMl0gPSBqICYgMHhmZjsKLQkJCWogPSAwOwotCQl9CisJcmMgPSBscGZjX3d3bl9zZXQoYnVmLCBjbnQsIHd3cG4pOworCWlmICghcmMpIHsKKwkJLyogbm90IGFibGUgdG8gc2V0IHd3cG4sIHVubG9jayBpdCAqLworCQlwaGJhLT5zb2Z0X3d3bl9lbmFibGUgPSAxOworCQlyZXR1cm4gcmM7CiAJfQorCiAJcGhiYS0+Y2ZnX3NvZnRfd3dwbiA9IHd3bl90b191NjQod3dwbik7CiAJZmNfaG9zdF9wb3J0X25hbWUoc2hvc3QpID0gcGhiYS0+Y2ZnX3NvZnRfd3dwbjsKIAlpZiAocGhiYS0+Y2ZnX3NvZnRfd3dubikKQEAgLTIxOTgsNyArMjI1Myw3IEBACiAJCQkJInJlaW5pdCBhZGFwdGVyIC0gJWRcbiIsIHN0YXQyKTsKIAlyZXR1cm4gKHN0YXQxIHx8IHN0YXQyKSA/IC1FSU8gOiBjb3VudDsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihscGZjX3NvZnRfd3dwbiwgU19JUlVHTyB8IFNfSVdVU1IsXAorc3RhdGljIERFVklDRV9BVFRSKGxwZmNfc29mdF93d3BuLCBTX0lSVUdPIHwgU19JV1VTUiwKIAkJICAgbHBmY19zb2Z0X3d3cG5fc2hvdywgbHBmY19zb2Z0X3d3cG5fc3RvcmUpOwogCiAvKioKQEAgLTIyMzUsMzkgKzIyOTAsMjUgQEAKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CiAJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gKChzdHJ1Y3QgbHBmY192cG9ydCAqKXNob3N0LT5ob3N0ZGF0YSktPnBoYmE7Ci0JdW5zaWduZWQgaW50IGksIGosIGNudD1jb3VudDsKLQl1OCB3d25uWzhdOworCXVuc2lnbmVkIGludCBjbnQgPSBjb3VudDsKKwl1OCB3d25uW1dXTl9TWl07CisJaW50IHJjOwogCiAJLyogY291bnQgbWF5IGluY2x1ZGUgYSBMRiBhdCBlbmQgb2Ygc3RyaW5nICovCiAJaWYgKGJ1ZltjbnQtMV0gPT0gJ1xuJykKIAkJY250LS07CiAKLQlpZiAoIXBoYmEtPnNvZnRfd3duX2VuYWJsZSB8fCAoY250IDwgMTYpIHx8IChjbnQgPiAxOCkgfHwKLQkgICAgKChjbnQgPT0gMTcpICYmICgqYnVmKysgIT0gJ3gnKSkgfHwKLQkgICAgKChjbnQgPT0gMTgpICYmICgoKmJ1ZisrICE9ICcwJykgfHwgKCpidWYrKyAhPSAneCcpKSkpCisJaWYgKCFwaGJhLT5zb2Z0X3d3bl9lbmFibGUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyoKLQkgKiBBbGxvdyB3d25uIHRvIGJlIHNldCBtYW55IHRpbWVzLCBhcyBsb25nIGFzIHRoZSBlbmFibGUgaXMgc2V0LgotCSAqIEhvd2V2ZXIsIG9uY2UgdGhlIHd3cG4gaXMgc2V0LCBldmVyeXRoaW5nIGxvY2tzLgotCSAqLwotCi0JbWVtc2V0KHd3bm4sIDAsIHNpemVvZih3d25uKSk7Ci0KLQkvKiBWYWxpZGF0ZSBhbmQgc3RvcmUgdGhlIG5ldyBuYW1lICovCi0JZm9yIChpPTAsIGo9MDsgaSA8IDE2OyBpKyspIHsKLQkJaW50IHZhbHVlOwotCi0JCXZhbHVlID0gaGV4X3RvX2JpbigqYnVmKyspOwotCQlpZiAodmFsdWUgPj0gMCkKLQkJCWogPSAoaiA8PCA0KSB8IHZhbHVlOwotCQllbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGkgJSAyKSB7Ci0JCQl3d25uW2kvMl0gPSBqICYgMHhmZjsKLQkJCWogPSAwOwotCQl9CisJcmMgPSBscGZjX3d3bl9zZXQoYnVmLCBjbnQsIHd3bm4pOworCWlmICghcmMpIHsKKwkJLyogQWxsb3cgd3dubiB0byBiZSBzZXQgbWFueSB0aW1lcywgYXMgbG9uZyBhcyB0aGUgZW5hYmxlCisJCSAqIGlzIHNldC4gSG93ZXZlciwgb25jZSB0aGUgd3dwbiBpcyBzZXQsIGV2ZXJ5dGhpbmcgbG9ja3MuCisJCSAqLworCQlyZXR1cm4gcmM7CiAJfQorCiAJcGhiYS0+Y2ZnX3NvZnRfd3dubiA9IHd3bl90b191NjQod3dubik7CiAKIAlkZXZfcHJpbnRrKEtFUk5fTk9USUNFLCAmcGhiYS0+cGNpZGV2LT5kZXYsCkBAIC0yMjc2LDkgKzIzMTcsNDM4IEBACiAKIAlyZXR1cm4gY291bnQ7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIobHBmY19zb2Z0X3d3bm4sIFNfSVJVR08gfCBTX0lXVVNSLFwKK3N0YXRpYyBERVZJQ0VfQVRUUihscGZjX3NvZnRfd3dubiwgU19JUlVHTyB8IFNfSVdVU1IsCiAJCSAgIGxwZmNfc29mdF93d25uX3Nob3csIGxwZmNfc29mdF93d25uX3N0b3JlKTsKIAorLyoqCisgKiBscGZjX29hc190Z3Rfc2hvdyAtIFJldHVybiB3d3BuIG9mIHRhcmdldCB3aG9zZSBsdW5zIG1heWJlIGVuYWJsZWQgZm9yCisgKgkJICAgICAgT3B0aW1pemVkIEFjY2VzcyBTdG9yYWdlIChPQVMpIG9wZXJhdGlvbnMuCisgKiBAZGV2OiBjbGFzcyBkZXZpY2UgdGhhdCBpcyBjb252ZXJ0ZWQgaW50byBhIFNjc2lfaG9zdC4KKyAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlLCBub3QgdXNlZC4KKyAqIEBidWY6IGJ1ZmZlciBmb3IgcGFzc2luZyBpbmZvcm1hdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICogdmFsdWUgb2YgY291bnQKKyAqKi8KK3N0YXRpYyBzc2l6ZV90CitscGZjX29hc190Z3Rfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gKChzdHJ1Y3QgbHBmY192cG9ydCAqKXNob3N0LT5ob3N0ZGF0YSktPnBoYmE7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIweCVsbHhcbiIsCisJCQl3d25fdG9fdTY0KHBoYmEtPmNmZ19vYXNfdGd0X3d3cG4pKTsKK30KKworLyoqCisgKiBscGZjX29hc190Z3Rfc3RvcmUgLSBTdG9yZSB3d3BuIG9mIHRhcmdldCB3aG9zZSBsdW5zIG1heWJlIGVuYWJsZWQgZm9yCisgKgkJICAgICAgT3B0aW1pemVkIEFjY2VzcyBTdG9yYWdlIChPQVMpIG9wZXJhdGlvbnMuCisgKiBAZGV2OiBjbGFzcyBkZXZpY2UgdGhhdCBpcyBjb252ZXJ0ZWQgaW50byBhIFNjc2lfaG9zdC4KKyAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlLCBub3QgdXNlZC4KKyAqIEBidWY6IGJ1ZmZlciBmb3IgcGFzc2luZyBpbmZvcm1hdGlvbi4KKyAqIEBjb3VudDogU2l6ZSBvZiB0aGUgZGF0YSBidWZmZXIuCisgKgorICogUmV0dXJuczoKKyAqIC1FSU5WQUwgY291bnQgaXMgaW52YWxpZCwgaW52YWxpZCB3d3BuIGJ5dGUgaW52YWxpZAorICogLUVQRVJNIG9hcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IGhiYQorICogdmFsdWUgb2YgY291bnQgb24gc3VjY2VzcworICoqLworc3RhdGljIHNzaXplX3QKK2xwZmNfb2FzX3RndF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gKChzdHJ1Y3QgbHBmY192cG9ydCAqKXNob3N0LT5ob3N0ZGF0YSktPnBoYmE7CisJdW5zaWduZWQgaW50IGNudCA9IGNvdW50OworCXVpbnQ4X3Qgd3dwbltXV05fU1pdOworCWludCByYzsKKworCWlmICghcGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKQorCQlyZXR1cm4gLUVQRVJNOworCisJLyogY291bnQgbWF5IGluY2x1ZGUgYSBMRiBhdCBlbmQgb2Ygc3RyaW5nICovCisJaWYgKGJ1ZltjbnQtMV0gPT0gJ1xuJykKKwkJY250LS07CisKKwlyYyA9IGxwZmNfd3duX3NldChidWYsIGNudCwgd3dwbik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwltZW1jcHkocGhiYS0+Y2ZnX29hc190Z3Rfd3dwbiwgd3dwbiwgKDggKiBzaXplb2YodWludDhfdCkpKTsKKwltZW1jcHkocGhiYS0+c2xpNF9oYmEub2FzX25leHRfdGd0X3d3cG4sIHd3cG4sICg4ICogc2l6ZW9mKHVpbnQ4X3QpKSk7CisJaWYgKHd3bl90b191NjQod3dwbikgPT0gMCkKKwkJcGhiYS0+Y2ZnX29hc19mbGFncyB8PSBPQVNfRklORF9BTllfVEFSR0VUOworCWVsc2UKKwkJcGhiYS0+Y2ZnX29hc19mbGFncyAmPSB+T0FTX0ZJTkRfQU5ZX1RBUkdFVDsKKwlwaGJhLT5jZmdfb2FzX2ZsYWdzICY9IH5PQVNfTFVOX1ZBTElEOworCXBoYmEtPnNsaTRfaGJhLm9hc19uZXh0X2x1biA9IEZJTkRfRklSU1RfT0FTX0xVTjsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobHBmY194bGFuZV90Z3QsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBscGZjX29hc190Z3Rfc2hvdywgbHBmY19vYXNfdGd0X3N0b3JlKTsKKworLyoqCisgKiBscGZjX29hc192cHRfc2hvdyAtIFJldHVybiB3d3BuIG9mIHZwb3J0IHdob3NlIHRhcmdldHMgbWF5YmUgZW5hYmxlZAorICoJCSAgICAgIGZvciBPcHRpbWl6ZWQgQWNjZXNzIFN0b3JhZ2UgKE9BUykgb3BlcmF0aW9ucy4KKyAqIEBkZXY6IGNsYXNzIGRldmljZSB0aGF0IGlzIGNvbnZlcnRlZCBpbnRvIGEgU2NzaV9ob3N0LgorICogQGF0dHI6IGRldmljZSBhdHRyaWJ1dGUsIG5vdCB1c2VkLgorICogQGJ1ZjogYnVmZmVyIGZvciBwYXNzaW5nIGluZm9ybWF0aW9uLgorICoKKyAqIFJldHVybnM6CisgKiB2YWx1ZSBvZiBjb3VudCBvbiBzdWNjZXNzCisgKiovCitzdGF0aWMgc3NpemVfdAorbHBmY19vYXNfdnB0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9ICgoc3RydWN0IGxwZmNfdnBvcnQgKilzaG9zdC0+aG9zdGRhdGEpLT5waGJhOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglbGx4XG4iLAorCQkJd3duX3RvX3U2NChwaGJhLT5jZmdfb2FzX3ZwdF93d3BuKSk7Cit9CisKKy8qKgorICogbHBmY19vYXNfdnB0X3N0b3JlIC0gU3RvcmUgd3dwbiBvZiB2cG9ydCB3aG9zZSB0YXJnZXRzIG1heWJlIGVuYWJsZWQKKyAqCQkgICAgICBmb3IgT3B0aW1pemVkIEFjY2VzcyBTdG9yYWdlIChPQVMpIG9wZXJhdGlvbnMuCisgKiBAZGV2OiBjbGFzcyBkZXZpY2UgdGhhdCBpcyBjb252ZXJ0ZWQgaW50byBhIFNjc2lfaG9zdC4KKyAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlLCBub3QgdXNlZC4KKyAqIEBidWY6IGJ1ZmZlciBmb3IgcGFzc2luZyBpbmZvcm1hdGlvbi4KKyAqIEBjb3VudDogU2l6ZSBvZiB0aGUgZGF0YSBidWZmZXIuCisgKgorICogUmV0dXJuczoKKyAqIC1FSU5WQUwgY291bnQgaXMgaW52YWxpZCwgaW52YWxpZCB3d3BuIGJ5dGUgaW52YWxpZAorICogLUVQRVJNIG9hcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IGhiYQorICogdmFsdWUgb2YgY291bnQgb24gc3VjY2VzcworICoqLworc3RhdGljIHNzaXplX3QKK2xwZmNfb2FzX3ZwdF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gKChzdHJ1Y3QgbHBmY192cG9ydCAqKXNob3N0LT5ob3N0ZGF0YSktPnBoYmE7CisJdW5zaWduZWQgaW50IGNudCA9IGNvdW50OworCXVpbnQ4X3Qgd3dwbltXV05fU1pdOworCWludCByYzsKKworCWlmICghcGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKQorCQlyZXR1cm4gLUVQRVJNOworCisJLyogY291bnQgbWF5IGluY2x1ZGUgYSBMRiBhdCBlbmQgb2Ygc3RyaW5nICovCisJaWYgKGJ1ZltjbnQtMV0gPT0gJ1xuJykKKwkJY250LS07CisKKwlyYyA9IGxwZmNfd3duX3NldChidWYsIGNudCwgd3dwbik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwltZW1jcHkocGhiYS0+Y2ZnX29hc192cHRfd3dwbiwgd3dwbiwgKDggKiBzaXplb2YodWludDhfdCkpKTsKKwltZW1jcHkocGhiYS0+c2xpNF9oYmEub2FzX25leHRfdnB0X3d3cG4sIHd3cG4sICg4ICogc2l6ZW9mKHVpbnQ4X3QpKSk7CisJaWYgKHd3bl90b191NjQod3dwbikgPT0gMCkKKwkJcGhiYS0+Y2ZnX29hc19mbGFncyB8PSBPQVNfRklORF9BTllfVlBPUlQ7CisJZWxzZQorCQlwaGJhLT5jZmdfb2FzX2ZsYWdzICY9IH5PQVNfRklORF9BTllfVlBPUlQ7CisJcGhiYS0+Y2ZnX29hc19mbGFncyAmPSB+T0FTX0xVTl9WQUxJRDsKKwlwaGJhLT5zbGk0X2hiYS5vYXNfbmV4dF9sdW4gPSBGSU5EX0ZJUlNUX09BU19MVU47CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSKGxwZmNfeGxhbmVfdnB0LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgbHBmY19vYXNfdnB0X3Nob3csIGxwZmNfb2FzX3ZwdF9zdG9yZSk7CisKKy8qKgorICogbHBmY19vYXNfbHVuX3N0YXRlX3Nob3cgLSBSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgKGVuYWJsZWQgb3IgZGlzYWJsZWQpCisgKgkJCSAgICBvZiB3aGV0aGVyIGx1bnMgd2lsbCBiZSBlbmFibGVkIG9yIGRpc2FibGVkCisgKgkJCSAgICBmb3IgT3B0aW1pemVkIEFjY2VzcyBTdG9yYWdlIChPQVMpIG9wZXJhdGlvbnMuCisgKiBAZGV2OiBjbGFzcyBkZXZpY2UgdGhhdCBpcyBjb252ZXJ0ZWQgaW50byBhIFNjc2lfaG9zdC4KKyAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlLCBub3QgdXNlZC4KKyAqIEBidWY6IGJ1ZmZlciBmb3IgcGFzc2luZyBpbmZvcm1hdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICogc2l6ZSBvZiBmb3JtYXR0ZWQgc3RyaW5nLgorICoqLworc3RhdGljIHNzaXplX3QKK2xwZmNfb2FzX2x1bl9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9ICgoc3RydWN0IGxwZmNfdnBvcnQgKilzaG9zdC0+aG9zdGRhdGEpLT5waGJhOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHBoYmEtPmNmZ19vYXNfbHVuX3N0YXRlKTsKK30KKworLyoqCisgKiBscGZjX29hc19sdW5fc3RhdGVfc3RvcmUgLSBTdG9yZSB0aGUgc3RhdGUgKGVuYWJsZWQgb3IgZGlzYWJsZWQpCisgKgkJCSAgICBvZiB3aGV0aGVyIGx1bnMgd2lsbCBiZSBlbmFibGVkIG9yIGRpc2FibGVkCisgKgkJCSAgICBmb3IgT3B0aW1pemVkIEFjY2VzcyBTdG9yYWdlIChPQVMpIG9wZXJhdGlvbnMuCisgKiBAZGV2OiBjbGFzcyBkZXZpY2UgdGhhdCBpcyBjb252ZXJ0ZWQgaW50byBhIFNjc2lfaG9zdC4KKyAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlLCBub3QgdXNlZC4KKyAqIEBidWY6IGJ1ZmZlciBmb3IgcGFzc2luZyBpbmZvcm1hdGlvbi4KKyAqIEBjb3VudDogU2l6ZSBvZiB0aGUgZGF0YSBidWZmZXIuCisgKgorICogUmV0dXJuczoKKyAqIC1FSU5WQUwgY291bnQgaXMgaW52YWxpZCwgaW52YWxpZCB3d3BuIGJ5dGUgaW52YWxpZAorICogLUVQRVJNIG9hcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IGhiYQorICogdmFsdWUgb2YgY291bnQgb24gc3VjY2VzcworICoqLworc3RhdGljIHNzaXplX3QKK2xwZmNfb2FzX2x1bl9zdGF0ZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoKHN0cnVjdCBscGZjX3Zwb3J0ICopc2hvc3QtPmhvc3RkYXRhKS0+cGhiYTsKKwlpbnQgdmFsID0gMDsKKworCWlmICghcGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKCFpc2RpZ2l0KGJ1ZlswXSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNzY2FuZihidWYsICIlaSIsICZ2YWwpICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCh2YWwgIT0gMCkgJiYgKHZhbCAhPSAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwaGJhLT5jZmdfb2FzX2x1bl9zdGF0ZSA9IHZhbDsKKworCXJldHVybiBzdHJsZW4oYnVmKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihscGZjX3hsYW5lX2x1bl9zdGF0ZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIGxwZmNfb2FzX2x1bl9zdGF0ZV9zaG93LCBscGZjX29hc19sdW5fc3RhdGVfc3RvcmUpOworCisvKioKKyAqIGxwZmNfb2FzX2x1bl9zdGF0dXNfc2hvdyAtIFJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBPcHRpbWl6ZWQgQWNjZXNzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZSAoT0FTKSBsdW4gcmV0dXJuZWQgYnkgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbHBmY19vYXNfbHVuX3Nob3cgZnVuY3Rpb24uCisgKiBAZGV2OiBjbGFzcyBkZXZpY2UgdGhhdCBpcyBjb252ZXJ0ZWQgaW50byBhIFNjc2lfaG9zdC4KKyAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlLCBub3QgdXNlZC4KKyAqIEBidWY6IGJ1ZmZlciBmb3IgcGFzc2luZyBpbmZvcm1hdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICogc2l6ZSBvZiBmb3JtYXR0ZWQgc3RyaW5nLgorICoqLworc3RhdGljIHNzaXplX3QKK2xwZmNfb2FzX2x1bl9zdGF0dXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gKChzdHJ1Y3QgbHBmY192cG9ydCAqKXNob3N0LT5ob3N0ZGF0YSktPnBoYmE7CisKKwlpZiAoIShwaGJhLT5jZmdfb2FzX2ZsYWdzICYgT0FTX0xVTl9WQUxJRCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHBoYmEtPmNmZ19vYXNfbHVuX3N0YXR1cyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobHBmY194bGFuZV9sdW5fc3RhdHVzLCBTX0lSVUdPLAorCQkgICBscGZjX29hc19sdW5fc3RhdHVzX3Nob3csIE5VTEwpOworCisKKy8qKgorICogbHBmY19vYXNfbHVuX3N0YXRlX3NldCAtIGVuYWJsZSBvciBkaXNhYmxlIGEgbHVuIGZvciBPcHRpbWl6ZWQgQWNjZXNzIFN0b3JhZ2UKKyAqCQkJICAgKE9BUykgb3BlcmF0aW9ucy4KKyAqIEBwaGJhOiBscGZjX2hiYSBwb2ludGVyLgorICogQG5kbHA6IHBvaW50ZXIgdG8gZmNwIHRhcmdldCBub2RlLgorICogQGx1bjogdGhlIGZjIGx1biBmb3Igc2V0dGluZyBvYXMgc3RhdGUuCisgKiBAb2FzX3N0YXRlOiB0aGUgb2FzIHN0YXRlIHRvIGJlIHNldCB0byB0aGUgbHVuLgorICoKKyAqIFJldHVybnM6CisgKiBTVUNDRVNTIDogMAorICogLUVQRVJNIE9BUyBpcyBub3QgZW5hYmxlZCBvciBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcG9ydC4KKyAqCisgKi8KK3N0YXRpYyBzaXplX3QKK2xwZmNfb2FzX2x1bl9zdGF0ZV9zZXQoc3RydWN0IGxwZmNfaGJhICpwaGJhLCB1aW50OF90IHZwdF93d3BuW10sCisJCSAgICAgICB1aW50OF90IHRndF93d3BuW10sIHVpbnQ2NF90IGx1biwgdWludDMyX3Qgb2FzX3N0YXRlKQoreworCisJaW50IHJjID0gMDsKKworCWlmICghcGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKG9hc19zdGF0ZSkgeworCQlpZiAoIWxwZmNfZW5hYmxlX29hc19sdW4ocGhiYSwgKHN0cnVjdCBscGZjX25hbWUgKil2cHRfd3dwbiwKKwkJCQkJIChzdHJ1Y3QgbHBmY19uYW1lICopdGd0X3d3cG4sIGx1bikpCisJCQlyYyA9IC1FTk9NRU07CisJfSBlbHNlIHsKKwkJbHBmY19kaXNhYmxlX29hc19sdW4ocGhiYSwgKHN0cnVjdCBscGZjX25hbWUgKil2cHRfd3dwbiwKKwkJCQkgICAgIChzdHJ1Y3QgbHBmY19uYW1lICopdGd0X3d3cG4sIGx1bik7CisJfQorCXJldHVybiByYzsKKworfQorCisvKioKKyAqIGxwZmNfb2FzX2x1bl9nZXRfbmV4dCAtIGdldCB0aGUgbmV4dCBsdW4gdGhhdCBoYXMgYmVlbiBlbmFibGVkIGZvciBPcHRpbWl6ZWQKKyAqCQkJICBBY2Nlc3MgU3RvcmFnZSAoT0FTKSBvcGVyYXRpb25zLgorICogQHBoYmE6IGxwZmNfaGJhIHBvaW50ZXIuCisgKiBAdnB0X3d3cG46IHd3cG4gb2YgdGhlIHZwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmV0dXJuZWQgbHVuCisgKiBAdGd0X3d3cG46IHd3cG4gb2YgdGhlIHRhcmdldCBhc3NvY2lhdGVkIHdpdGggdGhlIHJldHVybmVkIGx1bgorICogQGx1bl9zdGF0dXM6IHN0YXR1cyBvZiB0aGUgbHVuIHJldHVybmVkIGx1bgorICoKKyAqIFJldHVybnMgdGhlIGZpcnN0IG9yIG5leHQgbHVuIGVuYWJsZWQgZm9yIE9BUyBvcGVyYXRpb25zIGZvciB0aGUgdnBvcnQvdGFyZ2V0CisgKiBzcGVjaWZpZWQuICBJZiBhIGx1biBpcyBmb3VuZCwgaXRzIHZwb3J0IHd3cG4sIHRhcmdldCB3d3BuIGFuZCBzdGF0dXMgaXMKKyAqIHJldHVybmVkLiAgSWYgdGhlIGx1biBpcyBub3QgZm91bmQsIE5PVF9PQVNfRU5BQkxFRF9MVU4gaXMgcmV0dXJuZWQuCisgKgorICogUmV0dXJuOgorICogbHVuIHRoYXQgaXMgT0FTIGVuYWJsZWQgZm9yIHRoZSB2cG9ydC90YXJnZXQKKyAqIE5PVF9PQVNfRU5BQkxFRF9MVU4gd2hlbiBubyBvYXMgZW5hYmxlZCBsdW4gZm91bmQuCisgKi8KK3N0YXRpYyB1aW50NjRfdAorbHBmY19vYXNfbHVuX2dldF9uZXh0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgdWludDhfdCB2cHRfd3dwbltdLAorCQkgICAgICB1aW50OF90IHRndF93d3BuW10sIHVpbnQzMl90ICpsdW5fc3RhdHVzKQoreworCXVpbnQ2NF90IGZvdW5kX2x1bjsKKworCWlmICh1bmxpa2VseSghcGhiYSkgfHwgIXZwdF93d3BuIHx8ICF0Z3Rfd3dwbikKKwkJcmV0dXJuIE5PVF9PQVNfRU5BQkxFRF9MVU47CisJaWYgKGxwZmNfZmluZF9uZXh0X29hc19sdW4ocGhiYSwgKHN0cnVjdCBscGZjX25hbWUgKikKKwkJCQkgICBwaGJhLT5zbGk0X2hiYS5vYXNfbmV4dF92cHRfd3dwbiwKKwkJCQkgICAoc3RydWN0IGxwZmNfbmFtZSAqKQorCQkJCSAgIHBoYmEtPnNsaTRfaGJhLm9hc19uZXh0X3RndF93d3BuLAorCQkJCSAgICZwaGJhLT5zbGk0X2hiYS5vYXNfbmV4dF9sdW4sCisJCQkJICAgKHN0cnVjdCBscGZjX25hbWUgKil2cHRfd3dwbiwKKwkJCQkgICAoc3RydWN0IGxwZmNfbmFtZSAqKXRndF93d3BuLAorCQkJCSAgICZmb3VuZF9sdW4sIGx1bl9zdGF0dXMpKQorCQlyZXR1cm4gZm91bmRfbHVuOworCWVsc2UKKwkJcmV0dXJuIE5PVF9PQVNfRU5BQkxFRF9MVU47Cit9CisKKy8qKgorICogbHBmY19vYXNfbHVuX3N0YXRlX2NoYW5nZSAtIGVuYWJsZS9kaXNhYmxlIGEgbHVuIGZvciBPQVMgb3BlcmF0aW9ucworICogQHBoYmE6IGxwZmNfaGJhIHBvaW50ZXIuCisgKiBAdnB0X3d3cG46IHZwb3J0IHd3cG4gYnkgcmVmZXJlbmNlLgorICogQHRndF93d3BuOiB0YXJnZXQgd3dwbiBieSByZWZlcmVuY2UuCisgKiBAbHVuOiB0aGUgZmMgbHVuIGZvciBzZXR0aW5nIG9hcyBzdGF0ZS4KKyAqIEBvYXNfc3RhdGU6IHRoZSBvYXMgc3RhdGUgdG8gYmUgc2V0IHRvIHRoZSBvYXNfbHVuLgorICoKKyAqIFRoaXMgcm91dGluZSBlbmFibGVzIChPQVNfTFVOX0VOQUJMRSkgb3IgZGlzYWJsZXMgKE9BU19MVU5fRElTQUJMRSkKKyAqIGEgbHVuIGZvciBPQVMgb3BlcmF0aW9ucy4KKyAqCisgKiBSZXR1cm46CisgKiBTVUNDRVNTOiAwCisgKiAtRU5PTUVNOiBmYWlsZWQgdG8gZW5hYmxlIGFuIGx1biBmb3IgT0FTIG9wZXJhdGlvbnMKKyAqIC1FUEVSTTogT0FTIGlzIG5vdCBlbmFibGVkCisgKi8KK3N0YXRpYyBzc2l6ZV90CitscGZjX29hc19sdW5fc3RhdGVfY2hhbmdlKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgdWludDhfdCB2cHRfd3dwbltdLAorCQkJICB1aW50OF90IHRndF93d3BuW10sIHVpbnQ2NF90IGx1biwKKwkJCSAgdWludDMyX3Qgb2FzX3N0YXRlKQoreworCisJaW50IHJjOworCisJcmMgPSBscGZjX29hc19sdW5fc3RhdGVfc2V0KHBoYmEsIHZwdF93d3BuLCB0Z3Rfd3dwbiwgbHVuLAorCQkJCQlvYXNfc3RhdGUpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBscGZjX29hc19sdW5fc2hvdyAtIFJldHVybiBvYXMgZW5hYmxlZCBsdW5zIGZyb20gYSBjaG9zZW4gdGFyZ2V0CisgKiBAZGV2OiBjbGFzcyBkZXZpY2UgdGhhdCBpcyBjb252ZXJ0ZWQgaW50byBhIFNjc2lfaG9zdC4KKyAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlLCBub3QgdXNlZC4KKyAqIEBidWY6IGJ1ZmZlciBmb3IgcGFzc2luZyBpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgcmV0dXJucyBhIGx1biBlbmFibGVkIGZvciBPQVMgZWFjaCB0aW1lIHRoZSBmdW5jdGlvbgorICogaXMgY2FsbGVkLgorICoKKyAqIFJldHVybnM6CisgKiBTVUNDRVNTOiBzaXplIG9mIGZvcm1hdHRlZCBzdHJpbmcuCisgKiAtRUZBVUxUOiB0YXJnZXQgb3IgdnBvcnQgd3dwbiB3YXMgbm90IHNldCBwcm9wZXJseS4KKyAqIC1FUEVSTTogb2FzIGlzIG5vdCBlbmFibGVkLgorICoqLworc3RhdGljIHNzaXplX3QKK2xwZmNfb2FzX2x1bl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoKHN0cnVjdCBscGZjX3Zwb3J0ICopc2hvc3QtPmhvc3RkYXRhKS0+cGhiYTsKKworCXVpbnQ2NF90IG9hc19sdW47CisJaW50IGxlbiA9IDA7CisKKwlpZiAoIXBoYmEtPmNmZ19FbmFibGVYTGFuZSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmICh3d25fdG9fdTY0KHBoYmEtPmNmZ19vYXNfdnB0X3d3cG4pID09IDApCisJCWlmICghKHBoYmEtPmNmZ19vYXNfZmxhZ3MgJiBPQVNfRklORF9BTllfVlBPUlQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAod3duX3RvX3U2NChwaGJhLT5jZmdfb2FzX3RndF93d3BuKSA9PSAwKQorCQlpZiAoIShwaGJhLT5jZmdfb2FzX2ZsYWdzICYgT0FTX0ZJTkRfQU5ZX1RBUkdFVCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCW9hc19sdW4gPSBscGZjX29hc19sdW5fZ2V0X25leHQocGhiYSwgcGhiYS0+Y2ZnX29hc192cHRfd3dwbiwKKwkJCQkJcGhiYS0+Y2ZnX29hc190Z3Rfd3dwbiwKKwkJCQkJJnBoYmEtPmNmZ19vYXNfbHVuX3N0YXR1cyk7CisJaWYgKG9hc19sdW4gIT0gTk9UX09BU19FTkFCTEVEX0xVTikKKwkJcGhiYS0+Y2ZnX29hc19mbGFncyB8PSBPQVNfTFVOX1ZBTElEOworCisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgUEFHRV9TSVpFLWxlbiwgIjB4JWxseCIsIG9hc19sdW4pOworCisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKiBscGZjX29hc19sdW5fc3RvcmUgLSBTZXRzIHRoZSBPQVMgc3RhdGUgZm9yIGx1bgorICogQGRldjogY2xhc3MgZGV2aWNlIHRoYXQgaXMgY29udmVydGVkIGludG8gYSBTY3NpX2hvc3QuCisgKiBAYXR0cjogZGV2aWNlIGF0dHJpYnV0ZSwgbm90IHVzZWQuCisgKiBAYnVmOiBidWZmZXIgZm9yIHBhc3NpbmcgaW5mb3JtYXRpb24uCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBPQVMgc3RhdGUgZm9yIGx1bi4gIEJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwKKyAqIHRoZSB2cG9ydCB3d3BuLCB0YXJnZXQgd3dwbiwgYW5kIG9hcyBzdGF0ZSBuZWVkIHRvIGJlIHNldC4KKyAqCisgKiBSZXR1cm5zOgorICogU1VDQ0VTUzogc2l6ZSBvZiBmb3JtYXR0ZWQgc3RyaW5nLgorICogLUVGQVVMVDogdGFyZ2V0IG9yIHZwb3J0IHd3cG4gd2FzIG5vdCBzZXQgcHJvcGVybHkuCisgKiAtRVBFUk06IG9hcyBpcyBub3QgZW5hYmxlZC4KKyAqIHNpemUgb2YgZm9ybWF0dGVkIHN0cmluZy4KKyAqKi8KK3N0YXRpYyBzc2l6ZV90CitscGZjX29hc19sdW5fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9ICgoc3RydWN0IGxwZmNfdnBvcnQgKilzaG9zdC0+aG9zdGRhdGEpLT5waGJhOworCXVpbnQ2NF90IHNjc2lfbHVuOworCXNzaXplX3QgcmM7CisKKwlpZiAoIXBoYmEtPmNmZ19FbmFibGVYTGFuZSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmICh3d25fdG9fdTY0KHBoYmEtPmNmZ19vYXNfdnB0X3d3cG4pID09IDApCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHd3bl90b191NjQocGhiYS0+Y2ZnX29hc190Z3Rfd3dwbikgPT0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIWlzZGlnaXQoYnVmWzBdKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIjB4JWxseCIsICZzY3NpX2x1bikgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfSU5JVCwKKwkJCSIzMzcyIFRyeSB0byBzZXQgdnBvcnQgMHglbGx4IHRhcmdldCAweCVsbHggbHVuOiVsbGQgIgorCQkJIndpdGggb2FzIHNldCB0byAlZFxuIiwKKwkJCXd3bl90b191NjQocGhiYS0+Y2ZnX29hc192cHRfd3dwbiksCisJCQl3d25fdG9fdTY0KHBoYmEtPmNmZ19vYXNfdGd0X3d3cG4pLCBzY3NpX2x1biwKKwkJCXBoYmEtPmNmZ19vYXNfbHVuX3N0YXRlKTsKKworCXJjID0gbHBmY19vYXNfbHVuX3N0YXRlX2NoYW5nZShwaGJhLCBwaGJhLT5jZmdfb2FzX3ZwdF93d3BuLAorCQkJCQkgICBwaGJhLT5jZmdfb2FzX3RndF93d3BuLCBzY3NpX2x1biwKKwkJCQkJICAgcGhiYS0+Y2ZnX29hc19sdW5fc3RhdGUpOworCisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobHBmY194bGFuZV9sdW4sIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBscGZjX29hc19sdW5fc2hvdywgbHBmY19vYXNfbHVuX3N0b3JlKTsKIAogc3RhdGljIGludCBscGZjX3BvbGwgPSAwOwogbW9kdWxlX3BhcmFtKGxwZmNfcG9sbCwgaW50LCBTX0lSVUdPKTsKQEAgLTM4MTgsNyArNDI4OCw3IEBACiAJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0ID0gKHN0cnVjdCBscGZjX3Zwb3J0ICopc2hvc3QtPmhvc3RkYXRhOwogCXN0cnVjdCBscGZjX2hiYSAgICpwaGJhID0gdnBvcnQtPnBoYmE7CiAJc3RydWN0IGxwZmNfdmVjdG9yX21hcF9pbmZvICpjcHVwOwotCWludCAgaWR4LCBsZW4gPSAwOworCWludCAgbGVuID0gMDsKIAogCWlmICgocGhiYS0+c2xpX3JldiAhPSBMUEZDX1NMSV9SRVY0KSB8fAogCSAgICAocGhiYS0+aW50cl90eXBlICE9IE1TSVgpKQpAQCAtMzg0NiwyMyArNDMxNiwzOSBAQAogCQlicmVhazsKIAl9CiAKLQljcHVwID0gcGhiYS0+c2xpNF9oYmEuY3B1X21hcDsKLQlmb3IgKGlkeCA9IDA7IGlkeCA8IHBoYmEtPnNsaTRfaGJhLm51bV9wcmVzZW50X2NwdTsgaWR4KyspIHsKKwl3aGlsZSAocGhiYS0+c2xpNF9oYmEuY3Vycl9kaXNwX2NwdSA8IHBoYmEtPnNsaTRfaGJhLm51bV9wcmVzZW50X2NwdSkgeworCQljcHVwID0gJnBoYmEtPnNsaTRfaGJhLmNwdV9tYXBbcGhiYS0+c2xpNF9oYmEuY3Vycl9kaXNwX2NwdV07CisKKwkJLyogbWFyZ2luIHNob3VsZCBmaXQgaW4gdGhpcyBhbmQgdGhlIHRydW5jYXRlZCBtZXNzYWdlICovCiAJCWlmIChjcHVwLT5pcnEgPT0gTFBGQ19WRUNUT1JfTUFQX0VNUFRZKQogCQkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgUEFHRV9TSVpFLWxlbiwKIAkJCQkJIkNQVSAlMDJkIGlvX2NoYW4gJTAyZCAiCiAJCQkJCSJwaHlzaWQgJWQgY29yZWlkICVkXG4iLAotCQkJCQlpZHgsIGNwdXAtPmNoYW5uZWxfaWQsIGNwdXAtPnBoeXNfaWQsCisJCQkJCXBoYmEtPnNsaTRfaGJhLmN1cnJfZGlzcF9jcHUsCisJCQkJCWNwdXAtPmNoYW5uZWxfaWQsIGNwdXAtPnBoeXNfaWQsCiAJCQkJCWNwdXAtPmNvcmVfaWQpOwogCQllbHNlCiAJCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBQQUdFX1NJWkUtbGVuLAogCQkJCQkiQ1BVICUwMmQgaW9fY2hhbiAlMDJkICIKIAkJCQkJInBoeXNpZCAlZCBjb3JlaWQgJWQgSVJRICVkXG4iLAotCQkJCQlpZHgsIGNwdXAtPmNoYW5uZWxfaWQsIGNwdXAtPnBoeXNfaWQsCisJCQkJCXBoYmEtPnNsaTRfaGJhLmN1cnJfZGlzcF9jcHUsCisJCQkJCWNwdXAtPmNoYW5uZWxfaWQsIGNwdXAtPnBoeXNfaWQsCiAJCQkJCWNwdXAtPmNvcmVfaWQsIGNwdXAtPmlycSk7CiAKLQkJY3B1cCsrOworCQlwaGJhLT5zbGk0X2hiYS5jdXJyX2Rpc3BfY3B1Kys7CisKKwkJLyogZGlzcGxheSBtYXggbnVtYmVyIG9mIENQVXMga2VlcGluZyBzb21lIG1hcmdpbiAqLworCQlpZiAocGhiYS0+c2xpNF9oYmEuY3Vycl9kaXNwX2NwdSA8CisJCQkJcGhiYS0+c2xpNF9oYmEubnVtX3ByZXNlbnRfY3B1ICYmCisJCQkJKGxlbiA+PSAoUEFHRV9TSVpFIC0gNjQpKSkgeworCQkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgUEFHRV9TSVpFLWxlbiwgIm1vcmUuLi5cbiIpOworCQkJYnJlYWs7CisJCX0KIAl9CisKKwlpZiAocGhiYS0+c2xpNF9oYmEuY3Vycl9kaXNwX2NwdSA9PSBwaGJhLT5zbGk0X2hiYS5udW1fcHJlc2VudF9jcHUpCisJCXBoYmEtPnNsaTRfaGJhLmN1cnJfZGlzcF9jcHUgPSAwOworCiAJcmV0dXJuIGxlbjsKIH0KIApAQCAtNDE1Nyw2ICs0NjQzLDIxIEBACiBMUEZDX0FUVFJfUihlbmFibGVfaGJhX2hlYXJ0YmVhdCwgMCwgMCwgMSwgIkVuYWJsZSBIQkEgSGVhcnRiZWF0LiIpOwogCiAvKgorIyBscGZjX0VuYWJsZVhMYW5lOiBFbmFibGUgRXhwcmVzcyBMYW5lIEZlYXR1cmUKKyMgICAgICAweDAgICBFeHByZXNzIExhbmUgRmVhdHVyZSBkaXNhYmxlZAorIyAgICAgIDB4MSAgIEV4cHJlc3MgTGFuZSBGZWF0dXJlIGVuYWJsZWQKKyMgVmFsdWUgcmFuZ2UgaXMgWzAsMV0uIERlZmF1bHQgdmFsdWUgaXMgMC4KKyovCitMUEZDX0FUVFJfUihFbmFibGVYTGFuZSwgMCwgMCwgMSwgIkVuYWJsZSBFeHByZXNzIExhbmUgRmVhdHVyZS4iKTsKKworLyoKKyMgbHBmY19YTGFuZVByaW9yaXR5OiAgRGVmaW5lIENTX0NUTCBwcmlvcml0eSBmb3IgRXhwcmVzcyBMYW5lIEZlYXR1cmUKKyMgICAgICAgMHgwIC0gMHg3ZiAgPSBDU19DVEwgZmllbGQgaW4gRkMgaGVhZGVyIChoaWdoIDcgYml0cykKKyMgVmFsdWUgcmFuZ2UgaXMgWzB4MCwweDdmXS4gRGVmYXVsdCB2YWx1ZSBpcyAwCisqLworTFBGQ19BVFRSX1IoWExhbmVQcmlvcml0eSwgMCwgMHgwLCAweDdmLCAiQ1NfQ1RMIGZvciBFeHByZXNzIExhbmUgRmVhdHVyZS4iKTsKKworLyoKICMgbHBmY19lbmFibGVfYmc6IEVuYWJsZSBCbG9ja0d1YXJkIChFbXVsZXgncyBJbXBsZW1lbnRhdGlvbiBvZiBUMTAtRElGKQogIyAgICAgICAwICA9IEJsb2NrR3VhcmQgZGlzYWJsZWQgKGRlZmF1bHQpCiAjICAgICAgIDEgID0gQmxvY2tHdWFyZCBlbmFibGVkCkBAIC00MzE3LDYgKzQ4MTgsMTMgQEAKIAkmZGV2X2F0dHJfbHBmY19zb2Z0X3d3bl9lbmFibGUsCiAJJmRldl9hdHRyX2xwZmNfZW5hYmxlX2hiYV9yZXNldCwKIAkmZGV2X2F0dHJfbHBmY19lbmFibGVfaGJhX2hlYXJ0YmVhdCwKKwkmZGV2X2F0dHJfbHBmY19FbmFibGVYTGFuZSwKKwkmZGV2X2F0dHJfbHBmY19YTGFuZVByaW9yaXR5LAorCSZkZXZfYXR0cl9scGZjX3hsYW5lX2x1biwKKwkmZGV2X2F0dHJfbHBmY194bGFuZV90Z3QsCisJJmRldl9hdHRyX2xwZmNfeGxhbmVfdnB0LAorCSZkZXZfYXR0cl9scGZjX3hsYW5lX2x1bl9zdGF0ZSwKKwkmZGV2X2F0dHJfbHBmY194bGFuZV9sdW5fc3RhdHVzLAogCSZkZXZfYXR0cl9scGZjX3NnX3NlZ19jbnQsCiAJJmRldl9hdHRyX2xwZmNfbWF4X3Njc2ljbXBsX3RpbWUsCiAJJmRldl9hdHRyX2xwZmNfc3RhdF9kYXRhX2N0cmwsCkBAIC00MzM1LDYgKzQ4NDMsNyBAQAogCSZkZXZfYXR0cl9scGZjX2RzcywKIAkmZGV2X2F0dHJfbHBmY19zcmlvdl9od19tYXhfdmlydGZuLAogCSZkZXZfYXR0cl9wcm90b2NvbCwKKwkmZGV2X2F0dHJfbHBmY194bGFuZV9zdXBwb3J0ZWQsCiAJTlVMTCwKIH07CiAKQEAgLTUyOTYsMTEgKzU4MDUsMjAgQEAKIAlscGZjX2ZjcF9pb19jaGFubmVsX2luaXQocGhiYSwgbHBmY19mY3BfaW9fY2hhbm5lbCk7CiAJbHBmY19lbmFibGVfaGJhX3Jlc2V0X2luaXQocGhiYSwgbHBmY19lbmFibGVfaGJhX3Jlc2V0KTsKIAlscGZjX2VuYWJsZV9oYmFfaGVhcnRiZWF0X2luaXQocGhiYSwgbHBmY19lbmFibGVfaGJhX2hlYXJ0YmVhdCk7CisJbHBmY19FbmFibGVYTGFuZV9pbml0KHBoYmEsIGxwZmNfRW5hYmxlWExhbmUpOworCWlmIChwaGJhLT5zbGlfcmV2ICE9IExQRkNfU0xJX1JFVjQpCisJCXBoYmEtPmNmZ19FbmFibGVYTGFuZSA9IDA7CisJbHBmY19YTGFuZVByaW9yaXR5X2luaXQocGhiYSwgbHBmY19YTGFuZVByaW9yaXR5KTsKKwltZW1zZXQocGhiYS0+Y2ZnX29hc190Z3Rfd3dwbiwgMCwgKDggKiBzaXplb2YodWludDhfdCkpKTsKKwltZW1zZXQocGhiYS0+Y2ZnX29hc192cHRfd3dwbiwgMCwgKDggKiBzaXplb2YodWludDhfdCkpKTsKKwlwaGJhLT5jZmdfb2FzX2x1bl9zdGF0ZSA9IDA7CisJcGhiYS0+Y2ZnX29hc19sdW5fc3RhdHVzID0gMDsKKwlwaGJhLT5jZmdfb2FzX2ZsYWdzID0gMDsKIAlscGZjX2VuYWJsZV9iZ19pbml0KHBoYmEsIGxwZmNfZW5hYmxlX2JnKTsKIAlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQogCQlwaGJhLT5jZmdfcG9sbCA9IDA7CiAJZWxzZQotCXBoYmEtPmNmZ19wb2xsID0gbHBmY19wb2xsOworCQlwaGJhLT5jZmdfcG9sbCA9IGxwZmNfcG9sbDsKIAlwaGJhLT5jZmdfc29mdF93d25uID0gMEw7CiAJcGhiYS0+Y2ZnX3NvZnRfd3dwbiA9IDBMOwogCWxwZmNfc2dfc2VnX2NudF9pbml0KHBoYmEsIGxwZmNfc2dfc2VnX2NudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2JzZy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ic2cuYwppbmRleCA4MjEzNGQyMC4uY2EyZjRlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ic2cuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2JzZy5jCkBAIC00MTUzLDYgKzQxNTMsNyBAQAogCQlpZiAoc3Vic3lzID09IFNMSV9DT05GSUdfU1VCU1lTX0ZDT0UpIHsKIAkJCXN3aXRjaCAob3Bjb2RlKSB7CiAJCQljYXNlIEZDT0VfT1BDT0RFX1JFQURfRkNGOgorCQkJY2FzZSBGQ09FX09QQ09ERV9HRVRfRFBPUlRfUkVTVUxUUzoKIAkJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfTElCREZDLAogCQkJCQkJIjI5NTcgSGFuZGxlZCBTTElfQ09ORklHICIKIAkJCQkJCSJzdWJzeXNfZmNvZSwgb3Bjb2RlOngleFxuIiwKQEAgLTQxNjEsNiArNDE2Miw4IEBACiAJCQkJCQkJbmVtYl9tc2UsIGRtYWJ1Zik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIEZDT0VfT1BDT0RFX0FERF9GQ0Y6CisJCQljYXNlIEZDT0VfT1BDT0RFX1NFVF9EUE9SVF9NT0RFOgorCQkJY2FzZSBMUEZDX01CT1hfT1BDT0RFX0ZDT0VfTElOS19ESUFHX1NUQVRFOgogCQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19MSUJERkMsCiAJCQkJCQkiMjk1OCBIYW5kbGVkIFNMSV9DT05GSUcgIgogCQkJCQkJInN1YnN5c19mY29lLCBvcGNvZGU6eCV4XG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ic2cuaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYnNnLmgKaW5kZXggNjdmN2QwYS4uYTk0ZDRjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ic2cuaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2JzZy5oCkBAIC0yMzEsNiArMjMxLDggQEAKICNkZWZpbmUgU0xJX0NPTkZJR19TVUJTWVNfRkNPRQkJMHgwQwogI2RlZmluZSBGQ09FX09QQ09ERV9SRUFEX0ZDRgkJMHgwOAogI2RlZmluZSBGQ09FX09QQ09ERV9BRERfRkNGCQkweDA5CisjZGVmaW5lIEZDT0VfT1BDT0RFX1NFVF9EUE9SVF9NT0RFCTB4MjcKKyNkZWZpbmUgRkNPRV9PUENPREVfR0VUX0RQT1JUX1JFU1VMVFMJMHgyOAogfTsKIAogc3RydWN0IGxwZmNfc2xpX2NvbmZpZ19lbWIxX3N1YnN5cyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2NydG4uaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3J0bi5oCmluZGV4IGNkYTA3NmEuLmFkZGEwYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3J0bi5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3J0bi5oCkBAIC0xODcsNiArMTg3LDExIEBACiB2b2lkIGxwZmNfb2ZmbGluZShzdHJ1Y3QgbHBmY19oYmEgKik7CiB2b2lkIGxwZmNfcmVzZXRfaGJhKHN0cnVjdCBscGZjX2hiYSAqKTsKIAoraW50IGxwZmNfZm9mX3F1ZXVlX2NyZWF0ZShzdHJ1Y3QgbHBmY19oYmEgKik7CitpbnQgbHBmY19mb2ZfcXVldWVfc2V0dXAoc3RydWN0IGxwZmNfaGJhICopOworaW50IGxwZmNfZm9mX3F1ZXVlX2Rlc3Ryb3koc3RydWN0IGxwZmNfaGJhICopOworaXJxcmV0dXJuX3QgbHBmY19zbGk0X2ZvZl9pbnRyX2hhbmRsZXIoaW50LCB2b2lkICopOworCiBpbnQgbHBmY19zbGlfc2V0dXAoc3RydWN0IGxwZmNfaGJhICopOwogaW50IGxwZmNfc2xpX3F1ZXVlX3NldHVwKHN0cnVjdCBscGZjX2hiYSAqKTsKIApAQCAtMjQyLDYgKzI0Nyw3IEBACiB2b2lkIGxwZmNfc2xpNF9jbGVhcl9mY2ZfcnJfYm1hc2soc3RydWN0IGxwZmNfaGJhICopOwogCiBpbnQgbHBmY19tZW1fYWxsb2Moc3RydWN0IGxwZmNfaGJhICosIGludCBhbGlnbik7CitpbnQgbHBmY19tZW1fYWxsb2NfYWN0aXZlX3JycV9wb29sX3M0KHN0cnVjdCBscGZjX2hiYSAqKTsKIHZvaWQgbHBmY19tZW1fZnJlZShzdHJ1Y3QgbHBmY19oYmEgKik7CiB2b2lkIGxwZmNfbWVtX2ZyZWVfYWxsKHN0cnVjdCBscGZjX2hiYSAqKTsKIHZvaWQgbHBmY19zdG9wX3Zwb3J0X3RpbWVycyhzdHJ1Y3QgbHBmY192cG9ydCAqKTsKQEAgLTM5OSw3ICs0MDUsNiBAQAogdm9pZCBscGZjX3VuYmxvY2tfZmFicmljX2lvY2JzKHN0cnVjdCBscGZjX2hiYSAqKTsKIHZvaWQgbHBmY19yYW1wZG93bl9xdWV1ZV9kZXB0aChzdHJ1Y3QgbHBmY19oYmEgKik7CiB2b2lkIGxwZmNfcmFtcF9kb3duX3F1ZXVlX2hhbmRsZXIoc3RydWN0IGxwZmNfaGJhICopOwotdm9pZCBscGZjX3JhbXBfdXBfcXVldWVfaGFuZGxlcihzdHJ1Y3QgbHBmY19oYmEgKik7CiB2b2lkIGxwZmNfc2NzaV9kZXZfYmxvY2soc3RydWN0IGxwZmNfaGJhICopOwogCiB2b2lkCkBAIC00NzEsMyArNDc2LDIwIEBACiB1aW50MzJfdCBscGZjX3NsaV9wb3J0X3NwZWVkX2dldChzdHJ1Y3QgbHBmY19oYmEgKik7CiBpbnQgbHBmY19zbGk0X3JlcXVlc3RfZmlybXdhcmVfdXBkYXRlKHN0cnVjdCBscGZjX2hiYSAqLCB1aW50OF90KTsKIHZvaWQgbHBmY19zbGk0X29mZmxpbmVfZXJhdHQoc3RydWN0IGxwZmNfaGJhICopOworCitzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSAqbHBmY19jcmVhdGVfZGV2aWNlX2RhdGEoc3RydWN0IGxwZmNfaGJhICosCisJCQkJCQlzdHJ1Y3QgbHBmY19uYW1lICosCisJCQkJCQlzdHJ1Y3QgbHBmY19uYW1lICosCisJCQkJCQl1aW50NjRfdCwgYm9vbCk7Cit2b2lkIGxwZmNfZGVsZXRlX2RldmljZV9kYXRhKHN0cnVjdCBscGZjX2hiYSAqLCBzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSopOworc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEgKl9fbHBmY19nZXRfZGV2aWNlX2RhdGEoc3RydWN0IGxwZmNfaGJhICosCisJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJCQkJCXN0cnVjdCBscGZjX25hbWUgKiwKKwkJCQkJc3RydWN0IGxwZmNfbmFtZSAqLCB1aW50NjRfdCk7Citib29sIGxwZmNfZW5hYmxlX29hc19sdW4oc3RydWN0IGxwZmNfaGJhICosIHN0cnVjdCBscGZjX25hbWUgKiwKKwkJCSBzdHJ1Y3QgbHBmY19uYW1lICosIHVpbnQ2NF90KTsKK2Jvb2wgbHBmY19kaXNhYmxlX29hc19sdW4oc3RydWN0IGxwZmNfaGJhICosIHN0cnVjdCBscGZjX25hbWUgKiwKKwkJCSAgc3RydWN0IGxwZmNfbmFtZSAqLCB1aW50NjRfdCk7Citib29sIGxwZmNfZmluZF9uZXh0X29hc19sdW4oc3RydWN0IGxwZmNfaGJhICosIHN0cnVjdCBscGZjX25hbWUgKiwKKwkJCSAgICBzdHJ1Y3QgbHBmY19uYW1lICosIHVpbnQ2NF90ICosIHN0cnVjdCBscGZjX25hbWUgKiwKKwkJCSAgICBzdHJ1Y3QgbHBmY19uYW1lICosIHVpbnQ2NF90ICosIHVpbnQzMl90ICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kZWJ1Z2ZzLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2RlYnVnZnMuYwppbmRleCBiODAwY2M5Li44MjhjMDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2RlYnVnZnMuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2RlYnVnZnMuYwpAQCAtMjI4MCw2ICsyMjgwLDEwNCBAQAogCQl9CiAJfQogCisJaWYgKHBoYmEtPmNmZ19mb2YpIHsKKwkJLyogRk9GIEVRICovCisJCXFwID0gcGhiYS0+c2xpNF9oYmEuZm9mX2VxOworCQlpZiAoIXFwKQorCQkJZ290byBvdXQ7CisKKwkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLAorCQkJTFBGQ19RVUVfSU5GT19HRVRfQlVGX1NJWkUtbGVuLAorCQkJIlxuRk9GIEVRIGluZm86ICIKKwkJCSJFUS1TVEFUW21heDp4JXggbm9FOngleCAiCisJCQkiYnM6eCV4IHByb2M6eCVsbHhdXG4iLAorCQkJcXAtPnFfY250XzEsIHFwLT5xX2NudF8yLAorCQkJcXAtPnFfY250XzMsICh1bnNpZ25lZCBsb25nIGxvbmcpcXAtPnFfY250XzQpOworCisJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwKKwkJCUxQRkNfUVVFX0lORk9fR0VUX0JVRl9TSVpFLWxlbiwKKwkJCSJFUUlEWyUwMmRdLCAiCisJCQkiUUUtQ05UWyUwNGRdLCBRRS1TSVpFWyUwNGRdLCAiCisJCQkiSE9TVC1JRFhbJTA0ZF0sIFBPUlQtSURYWyUwNGRdIiwKKwkJCXFwLT5xdWV1ZV9pZCwKKwkJCXFwLT5lbnRyeV9jb3VudCwKKwkJCXFwLT5lbnRyeV9zaXplLAorCQkJcXAtPmhvc3RfaW5kZXgsCisJCQlxcC0+aGJhX2luZGV4KTsKKworCQkvKiBSZXNldCBtYXggY291bnRlciAqLworCQlxcC0+RVFfbWF4X2VxZSA9IDA7CisKKwkJbGVuICs9ICBzbnByaW50ZihwYnVmZmVyK2xlbiwKKwkJCUxQRkNfUVVFX0lORk9fR0VUX0JVRl9TSVpFLWxlbiwgIlxuIik7CisJCWlmIChsZW4gPj0gbWF4X2NudCkKKwkJCWdvdG8gdG9vX2JpZzsKKwl9CisKKwlpZiAocGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKSB7CisKKwkJLyogT0FTIENRICovCisJCXFwID0gcGhiYS0+c2xpNF9oYmEub2FzX2NxOworCQlpZiAocXApIHsKKwkJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwKKwkJCQlMUEZDX1FVRV9JTkZPX0dFVF9CVUZfU0laRS1sZW4sCisJCQkJIlx0T0FTIENRIGluZm86ICIpOworCQkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLAorCQkJCUxQRkNfUVVFX0lORk9fR0VUX0JVRl9TSVpFLWxlbiwKKwkJCQkiQXNzb2NFUUlEWyUwMmRdOiAiCisJCQkJIkNRIFNUQVRbbWF4OngleCByZWx3OngleCAiCisJCQkJInhhYnQ6eCV4IHdxOnglbGx4XVxuIiwKKwkJCQlxcC0+YXNzb2NfcWlkLAorCQkJCXFwLT5xX2NudF8xLCBxcC0+cV9jbnRfMiwKKwkJCQlxcC0+cV9jbnRfMywgKHVuc2lnbmVkIGxvbmcgbG9uZylxcC0+cV9jbnRfNCk7CisJCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sCisJCQkJTFBGQ19RVUVfSU5GT19HRVRfQlVGX1NJWkUtbGVuLAorCQkJCSJcdENRSURbJTAyZF0sICIKKwkJCQkiUUUtQ05UWyUwNGRdLCBRRS1TSVpFWyUwNGRdLCAiCisJCQkJIkhPU1QtSURYWyUwNGRdLCBQT1JULUlEWFslMDRkXSIsCisJCQkJcXAtPnF1ZXVlX2lkLCBxcC0+ZW50cnlfY291bnQsCisJCQkJcXAtPmVudHJ5X3NpemUsIHFwLT5ob3N0X2luZGV4LAorCQkJCXFwLT5oYmFfaW5kZXgpOworCisJCQkvKiBSZXNldCBtYXggY291bnRlciAqLworCQkJcXAtPkNRX21heF9jcWUgPSAwOworCisJCQlsZW4gKz0gIHNucHJpbnRmKHBidWZmZXIrbGVuLAorCQkJCUxQRkNfUVVFX0lORk9fR0VUX0JVRl9TSVpFLWxlbiwgIlxuIik7CisJCQlpZiAobGVuID49IG1heF9jbnQpCisJCQkJZ290byB0b29fYmlnOworCQl9CisKKwkJLyogT0FTIFdRICovCisJCXFwID0gcGhiYS0+c2xpNF9oYmEub2FzX3dxOworCQlpZiAocXApIHsKKwkJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwKKwkJCQlMUEZDX1FVRV9JTkZPX0dFVF9CVUZfU0laRS1sZW4sCisJCQkJIlx0XHRPQVMgV1EgaW5mbzogIik7CisJCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sCisJCQkJTFBGQ19RVUVfSU5GT19HRVRfQlVGX1NJWkUtbGVuLAorCQkJCSJBc3NvY0NRSURbJTAyZF06ICIKKwkJCQkiV1EtU1RBVFtvZmxvdzp4JXggcG9zdGVkOnglbGx4XVxuIiwKKwkJCQlxcC0+YXNzb2NfcWlkLAorCQkJCXFwLT5xX2NudF8xLCAodW5zaWduZWQgbG9uZyBsb25nKXFwLT5xX2NudF80KTsKKwkJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwKKwkJCQlMUEZDX1FVRV9JTkZPX0dFVF9CVUZfU0laRS1sZW4sCisJCQkJIlx0XHRXUUlEWyUwMmRdLCAiCisJCQkJIlFFLUNOVFslMDRkXSwgUUUtU0laRVslMDRkXSwgIgorCQkJCSJIT1NULUlEWFslMDRkXSwgUE9SVC1JRFhbJTA0ZF0iLAorCQkJCXFwLT5xdWV1ZV9pZCwKKwkJCQlxcC0+ZW50cnlfY291bnQsCisJCQkJcXAtPmVudHJ5X3NpemUsCisJCQkJcXAtPmhvc3RfaW5kZXgsCisJCQkJcXAtPmhiYV9pbmRleCk7CisKKwkJCWxlbiArPSAgc25wcmludGYocGJ1ZmZlcitsZW4sCisJCQkJTFBGQ19RVUVfSU5GT19HRVRfQlVGX1NJWkUtbGVuLCAiXG4iKTsKKwkJCWlmIChsZW4gPj0gbWF4X2NudCkKKwkJCQlnb3RvIHRvb19iaWc7CisJCX0KKwl9CitvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHBidWZmZXIsIGxlbik7CiAKQEAgLTM5MjcsNiArNDAyNSw3IEBACiAJc3RydWN0IGxwZmNfaGJhICAgKnBoYmEgPSB2cG9ydC0+cGhiYTsKIAljaGFyIG5hbWVbNjRdOwogCXVpbnQzMl90IG51bSwgaTsKKwlib29sIHBwb3J0X3NldHVwID0gZmFsc2U7CiAKIAlpZiAoIWxwZmNfZGVidWdmc19lbmFibGUpCiAJCXJldHVybjsKQEAgLTM5NDcsNiArNDA0Niw3IEBACiAJLyogU2V0dXAgZnVuY1ggZGlyZWN0b3J5IGZvciBzcGVjaWZpYyBIQkEgUENJIGZ1bmN0aW9uICovCiAJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiZm4lZCIsIHBoYmEtPmJyZF9ubyk7CiAJaWYgKCFwaGJhLT5oYmFfZGVidWdmc19yb290KSB7CisJCXBwb3J0X3NldHVwID0gdHJ1ZTsKIAkJcGhiYS0+aGJhX2RlYnVnZnNfcm9vdCA9CiAJCQlkZWJ1Z2ZzX2NyZWF0ZV9kaXIobmFtZSwgbHBmY19kZWJ1Z2ZzX3Jvb3QpOwogCQlpZiAoIXBoYmEtPmhiYV9kZWJ1Z2ZzX3Jvb3QpIHsKQEAgLTQyMzksNiArNDMzOSwxNCBAQAogCX0KIAogCS8qCisJICogVGhlIGZvbGxvd2luZyBzZWN0aW9uIGlzIGZvciBhZGRpdGlvbmFsIGRpcmVjdG9yaWVzL2ZpbGVzIGZvciB0aGUKKwkgKiBwaHlzaWNhbCBwb3J0LgorCSAqLworCisJaWYgKCFwcG9ydF9zZXR1cCkKKwkJZ290byBkZWJ1Z19mYWlsZWQ7CisKKwkvKgogCSAqIGlEaWFnIGRlYnVnZnMgcm9vdCBlbnRyeSBwb2ludHMgZm9yIFNMSTQgZGV2aWNlIG9ubHkKIAkgKi8KIAlpZiAocGhiYS0+c2xpX3JldiA8IExQRkNfU0xJX1JFVjQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Rpc2MuaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGlzYy5oCmluZGV4IGU0MDliYTUuLjFhNmZlNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGlzYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGlzYy5oCkBAIC0xMTYsNyArMTE2LDcgQEAKIAlhdG9taWNfdCBjbWRfcGVuZGluZzsKIAl1aW50MzJfdCBjbWRfcWRlcHRoOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9jaGFuZ2VfdGltZTsKLQlzdHJ1Y3QgbHBmY19ub2RlX3JycXMgYWN0aXZlX3JycXM7CisJdW5zaWduZWQgbG9uZyAqYWN0aXZlX3JycXNfeHJpX2JpdG1hcDsKIAlzdHJ1Y3QgbHBmY19zY3NpY21kX2JrdCAqbGF0X2RhdGE7CS8qIExhdGVuY3kgZGF0YSAqLwogfTsKIHN0cnVjdCBscGZjX25vZGVfcnJxIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jCmluZGV4IDExMDQ0NWYuLjYyNGZlMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19lbHMuYwpAQCAtMTUxNiw3ICsxNTE2LDcgQEAKIAl1aW50MzJfdCByYywga2VlcERJRCA9IDA7CiAJaW50ICBwdXRfbm9kZTsKIAlpbnQgIHB1dF9ycG9ydDsKLQlzdHJ1Y3QgbHBmY19ub2RlX3JycXMgcnJxOworCXVuc2lnbmVkIGxvbmcgKmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAgPSBOVUxMOwogCiAJLyogRmFicmljIG5vZGVzIGNhbiBoYXZlIHRoZSBzYW1lIFdXUE4gc28gd2UgZG9uJ3QgYm90aGVyIHNlYXJjaGluZwogCSAqIGJ5IFdXUE4uICBKdXN0IHJldHVybiB0aGUgbmRscCB0aGF0IHdhcyBnaXZlbiB0byB1cy4KQEAgLTE1MzQsNyArMTUzNCwxMyBAQAogCiAJaWYgKG5ld19uZGxwID09IG5kbHAgJiYgTkxQX0NIS19OT0RFX0FDVChuZXdfbmRscCkpCiAJCXJldHVybiBuZGxwOwotCW1lbXNldCgmcnJxLnhyaV9iaXRtYXAsIDAsIHNpemVvZihuZXdfbmRscC0+YWN0aXZlX3JycXMueHJpX2JpdG1hcCkpOworCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpIHsKKwkJYWN0aXZlX3JycXNfeHJpX2JpdG1hcCA9IG1lbXBvb2xfYWxsb2MocGhiYS0+YWN0aXZlX3JycV9wb29sLAorCQkJCQkJICAgICAgIEdGUF9LRVJORUwpOworCQlpZiAoYWN0aXZlX3JycXNfeHJpX2JpdG1hcCkKKwkJCW1lbXNldChhY3RpdmVfcnJxc194cmlfYml0bWFwLCAwLAorCQkJICAgICAgIHBoYmEtPmNmZ19ycnFfeHJpX2JpdG1hcF9zeik7CisJfQogCiAJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9JTkZPLCBMT0dfRUxTLAogCQkgIjMxNzggUExPR0kgY29uZmlybTogbmRscCAlcCB4JXg6IG5ld19uZGxwICVwXG4iLApAQCAtMTU0Myw0MSArMTU0OSw1OCBAQAogCWlmICghbmV3X25kbHApIHsKIAkJcmMgPSBtZW1jbXAoJm5kbHAtPm5scF9wb3J0bmFtZSwgbmFtZSwKIAkJCSAgICBzaXplb2Yoc3RydWN0IGxwZmNfbmFtZSkpOwotCQlpZiAoIXJjKQorCQlpZiAoIXJjKSB7CisJCQlpZiAoYWN0aXZlX3JycXNfeHJpX2JpdG1hcCkKKwkJCQltZW1wb29sX2ZyZWUoYWN0aXZlX3JycXNfeHJpX2JpdG1hcCwKKwkJCQkJICAgICBwaGJhLT5hY3RpdmVfcnJxX3Bvb2wpOwogCQkJcmV0dXJuIG5kbHA7CisJCX0KIAkJbmV3X25kbHAgPSBtZW1wb29sX2FsbG9jKHBoYmEtPm5scF9tZW1fcG9vbCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghbmV3X25kbHApCisJCWlmICghbmV3X25kbHApIHsKKwkJCWlmIChhY3RpdmVfcnJxc194cmlfYml0bWFwKQorCQkJCW1lbXBvb2xfZnJlZShhY3RpdmVfcnJxc194cmlfYml0bWFwLAorCQkJCQkgICAgIHBoYmEtPmFjdGl2ZV9ycnFfcG9vbCk7CiAJCQlyZXR1cm4gbmRscDsKKwkJfQogCQlscGZjX25scF9pbml0KHZwb3J0LCBuZXdfbmRscCwgbmRscC0+bmxwX0RJRCk7CiAJfSBlbHNlIGlmICghTkxQX0NIS19OT0RFX0FDVChuZXdfbmRscCkpIHsKIAkJcmMgPSBtZW1jbXAoJm5kbHAtPm5scF9wb3J0bmFtZSwgbmFtZSwKIAkJCSAgICBzaXplb2Yoc3RydWN0IGxwZmNfbmFtZSkpOwotCQlpZiAoIXJjKQorCQlpZiAoIXJjKSB7CisJCQlpZiAoYWN0aXZlX3JycXNfeHJpX2JpdG1hcCkKKwkJCQltZW1wb29sX2ZyZWUoYWN0aXZlX3JycXNfeHJpX2JpdG1hcCwKKwkJCQkJICAgICBwaGJhLT5hY3RpdmVfcnJxX3Bvb2wpOwogCQkJcmV0dXJuIG5kbHA7CisJCX0KIAkJbmV3X25kbHAgPSBscGZjX2VuYWJsZV9ub2RlKHZwb3J0LCBuZXdfbmRscCwKIAkJCQkJCU5MUF9TVEVfVU5VU0VEX05PREUpOwotCQlpZiAoIW5ld19uZGxwKQorCQlpZiAoIW5ld19uZGxwKSB7CisJCQlpZiAoYWN0aXZlX3JycXNfeHJpX2JpdG1hcCkKKwkJCQltZW1wb29sX2ZyZWUoYWN0aXZlX3JycXNfeHJpX2JpdG1hcCwKKwkJCQkJICAgICBwaGJhLT5hY3RpdmVfcnJxX3Bvb2wpOwogCQkJcmV0dXJuIG5kbHA7CisJCX0KIAkJa2VlcERJRCA9IG5ld19uZGxwLT5ubHBfRElEOwotCQlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQotCQkJbWVtY3B5KCZycnEueHJpX2JpdG1hcCwKLQkJCQkmbmV3X25kbHAtPmFjdGl2ZV9ycnFzLnhyaV9iaXRtYXAsCi0JCQkJc2l6ZW9mKG5ld19uZGxwLT5hY3RpdmVfcnJxcy54cmlfYml0bWFwKSk7CisJCWlmICgocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KSAmJiBhY3RpdmVfcnJxc194cmlfYml0bWFwKQorCQkJbWVtY3B5KGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAsCisJCQkgICAgICAgbmV3X25kbHAtPmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAsCisJCQkgICAgICAgcGhiYS0+Y2ZnX3JycV94cmlfYml0bWFwX3N6KTsKIAl9IGVsc2UgewogCQlrZWVwRElEID0gbmV3X25kbHAtPm5scF9ESUQ7Ci0JCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCi0JCQltZW1jcHkoJnJycS54cmlfYml0bWFwLAotCQkJCSZuZXdfbmRscC0+YWN0aXZlX3JycXMueHJpX2JpdG1hcCwKLQkJCQlzaXplb2YobmV3X25kbHAtPmFjdGl2ZV9ycnFzLnhyaV9iaXRtYXApKTsKKwkJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCAmJgorCQkgICAgYWN0aXZlX3JycXNfeHJpX2JpdG1hcCkKKwkJCW1lbWNweShhY3RpdmVfcnJxc194cmlfYml0bWFwLAorCQkJICAgICAgIG5ld19uZGxwLT5hY3RpdmVfcnJxc194cmlfYml0bWFwLAorCQkJICAgICAgIHBoYmEtPmNmZ19ycnFfeHJpX2JpdG1hcF9zeik7CiAJfQogCiAJbHBmY191bnJlZ19ycGkodnBvcnQsIG5ld19uZGxwKTsKIAluZXdfbmRscC0+bmxwX0RJRCA9IG5kbHAtPm5scF9ESUQ7CiAJbmV3X25kbHAtPm5scF9wcmV2X3N0YXRlID0gbmRscC0+bmxwX3ByZXZfc3RhdGU7CiAJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKLQkJbWVtY3B5KG5ld19uZGxwLT5hY3RpdmVfcnJxcy54cmlfYml0bWFwLAotCQkJJm5kbHAtPmFjdGl2ZV9ycnFzLnhyaV9iaXRtYXAsCi0JCQlzaXplb2YobmRscC0+YWN0aXZlX3JycXMueHJpX2JpdG1hcCkpOworCQltZW1jcHkobmV3X25kbHAtPmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAsCisJCSAgICAgICBuZGxwLT5hY3RpdmVfcnJxc194cmlfYml0bWFwLAorCQkgICAgICAgcGhiYS0+Y2ZnX3JycV94cmlfYml0bWFwX3N6KTsKIAogCWlmIChuZGxwLT5ubHBfZmxhZyAmIE5MUF9OUFJfMkJfRElTQykKIAkJbmV3X25kbHAtPm5scF9mbGFnIHw9IE5MUF9OUFJfMkJfRElTQzsKQEAgLTE2MTksMTAgKzE2NDIsMTEgQEAKIAogCQkvKiBUd28gbmRscHMgY2Fubm90IGhhdmUgdGhlIHNhbWUgZGlkIG9uIHRoZSBub2RlbGlzdCAqLwogCQluZGxwLT5ubHBfRElEID0ga2VlcERJRDsKLQkJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKLQkJCW1lbWNweSgmbmRscC0+YWN0aXZlX3JycXMueHJpX2JpdG1hcCwKLQkJCQkmcnJxLnhyaV9iaXRtYXAsCi0JCQkJc2l6ZW9mKG5kbHAtPmFjdGl2ZV9ycnFzLnhyaV9iaXRtYXApKTsKKwkJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCAmJgorCQkgICAgYWN0aXZlX3JycXNfeHJpX2JpdG1hcCkKKwkJCW1lbWNweShuZGxwLT5hY3RpdmVfcnJxc194cmlfYml0bWFwLAorCQkJICAgICAgIGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAsCisJCQkgICAgICAgcGhiYS0+Y2ZnX3JycV94cmlfYml0bWFwX3N6KTsKIAkJbHBmY19kcm9wX25vZGUodnBvcnQsIG5kbHApOwogCX0KIAllbHNlIHsKQEAgLTE2MzQsMTAgKzE2NTgsMTEgQEAKIAogCQkvKiBUd28gbmRscHMgY2Fubm90IGhhdmUgdGhlIHNhbWUgZGlkICovCiAJCW5kbHAtPm5scF9ESUQgPSBrZWVwRElEOwotCQlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQotCQkJbWVtY3B5KCZuZGxwLT5hY3RpdmVfcnJxcy54cmlfYml0bWFwLAotCQkJCSZycnEueHJpX2JpdG1hcCwKLQkJCQlzaXplb2YobmRscC0+YWN0aXZlX3JycXMueHJpX2JpdG1hcCkpOworCQlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0ICYmCisJCSAgICBhY3RpdmVfcnJxc194cmlfYml0bWFwKQorCQkJbWVtY3B5KG5kbHAtPmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAsCisJCQkgICAgICAgYWN0aXZlX3JycXNfeHJpX2JpdG1hcCwKKwkJCSAgICAgICBwaGJhLT5jZmdfcnJxX3hyaV9iaXRtYXBfc3opOwogCiAJCS8qIFNpbmNlIHdlIGFyZSBzd2FwcGluZyB0aGUgbmRscCBwYXNzZWQgaW4gd2l0aCB0aGUgbmV3IG9uZQogCQkgKiBhbmQgdGhlIGRpZCBoYXMgYWxyZWFkeSBiZWVuIHN3YXBwZWQsIGNvcHkgb3ZlciBzdGF0ZS4KQEAgLTE2NjgsNiArMTY5MywxMCBAQAogCQkJCXB1dF9kZXZpY2UoJnJwb3J0LT5kZXYpOwogCQl9CiAJfQorCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQgJiYKKwkgICAgYWN0aXZlX3JycXNfeHJpX2JpdG1hcCkKKwkJbWVtcG9vbF9mcmVlKGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAsCisJCQkgICAgIHBoYmEtPmFjdGl2ZV9ycnFfcG9vbCk7CiAJcmV0dXJuIG5ld19uZGxwOwogfQogCkBAIC0yNzcyLDYgKzI4MDEsNyBAQAogCS8qIFRoaXMgd2lsbCBjYXVzZSB0aGUgY2FsbGJhY2stZnVuY3Rpb24gbHBmY19jbXBsX2Vsc19jbWQgdG8KIAkgKiB0cmlnZ2VyIHRoZSByZWxlYXNlIG9mIG5vZGUuCiAJICovCisKIAlscGZjX25scF9wdXQobmRscCk7CiAJcmV0dXJuIDA7CiB9CkBAIC02MTkzLDExICs2MjIzLDExIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdnBvcnQtPndvcmtfcG9ydF9sb2NrLCBpZmxhZyk7CiAJdG1vX3Bvc3RlZCA9IHZwb3J0LT53b3JrX3BvcnRfZXZlbnRzICYgV09SS0VSX0VMU19UTU87Ci0JaWYgKCF0bW9fcG9zdGVkKQorCWlmICgoIXRtb19wb3N0ZWQpICYmICghKHZwb3J0LT5sb2FkX2ZsYWcgJiBGQ19VTkxPQURJTkcpKSkKIAkJdnBvcnQtPndvcmtfcG9ydF9ldmVudHMgfD0gV09SS0VSX0VMU19UTU87CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnBvcnQtPndvcmtfcG9ydF9sb2NrLCBpZmxhZyk7CiAKLQlpZiAoIXRtb19wb3N0ZWQpCisJaWYgKCghdG1vX3Bvc3RlZCkgJiYgKCEodnBvcnQtPmxvYWRfZmxhZyAmIEZDX1VOTE9BRElORykpKQogCQlscGZjX3dvcmtlcl93YWtlX3VwKHBoYmEpOwogCXJldHVybjsKIH0KQEAgLTYyMjMsMTkgKzYyNTMsMjYgQEAKIAl1aW50MzJfdCBlbHNfY29tbWFuZCA9IDA7CiAJdWludDMyX3QgdGltZW91dDsKIAl1aW50MzJfdCByZW1vdGVfSUQgPSAweGZmZmZmZmZmOwotCUxJU1RfSEVBRCh0eGNtcGxxX2NvbXBsZXRpb25zKTsKIAlMSVNUX0hFQUQoYWJvcnRfbGlzdCk7CiAKIAogCXRpbWVvdXQgPSAodWludDMyX3QpKHBoYmEtPmZjX3JhdG92IDw8IDEpOwogCiAJcHJpbmcgPSAmcGhiYS0+c2xpLnJpbmdbTFBGQ19FTFNfUklOR107Ci0KKwlpZiAoKHBoYmEtPnBwb3J0LT5sb2FkX2ZsYWcgJiBGQ19VTkxPQURJTkcpKQorCQlyZXR1cm47CiAJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7Ci0JbGlzdF9zcGxpY2VfaW5pdCgmcHJpbmctPnR4Y21wbHEsICZ0eGNtcGxxX2NvbXBsZXRpb25zKTsKLQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCXNwaW5fbG9jaygmcHJpbmctPnJpbmdfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGlvY2IsIHRtcF9pb2NiLCAmdHhjbXBscV9jb21wbGV0aW9ucywgbGlzdCkgeworCWlmICgocGhiYS0+cHBvcnQtPmxvYWRfZmxhZyAmIEZDX1VOTE9BRElORykpIHsKKwkJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKKwkJCXNwaW5fdW5sb2NrKCZwcmluZy0+cmluZ19sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwaW9jYiwgdG1wX2lvY2IsICZwcmluZy0+dHhjbXBscSwgbGlzdCkgewogCQljbWQgPSAmcGlvY2ItPmlvY2I7CiAKIAkJaWYgKChwaW9jYi0+aW9jYl9mbGFnICYgTFBGQ19JT19MSUJERkMpICE9IDAgfHwKQEAgLTYyNzQsMTEgKzYzMTEsMTIgQEAKIAkJfQogCQlsaXN0X2FkZF90YWlsKCZwaW9jYi0+ZGxpc3QsICZhYm9ydF9saXN0KTsKIAl9Ci0Jc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7Ci0JbGlzdF9zcGxpY2UoJnR4Y21wbHFfY29tcGxldGlvbnMsICZwcmluZy0+dHhjbXBscSk7CisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKKwkJc3Bpbl91bmxvY2soJnByaW5nLT5yaW5nX2xvY2spOwogCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGlvY2IsIHRtcF9pb2NiLCAmYWJvcnRfbGlzdCwgZGxpc3QpIHsKKwkJY21kID0gJnBpb2NiLT5pb2NiOwogCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0VMUywKIAkJCSAiMDEyNyBFTFMgdGltZW91dCBEYXRhOiB4JXggeCV4IHgleCAiCiAJCQkgIngleFxuIiwgZWxzX2NvbW1hbmQsCkBAIC02MjkwLDggKzYzMjgsOSBAQAogCX0KIAogCWlmICghbGlzdF9lbXB0eSgmcGhiYS0+c2xpLnJpbmdbTFBGQ19FTFNfUklOR10udHhjbXBscSkpCi0JCW1vZF90aW1lcigmdnBvcnQtPmVsc190bW9mdW5jLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwICogdGltZW91dCkpOworCQlpZiAoIShwaGJhLT5wcG9ydC0+bG9hZF9mbGFnICYgRkNfVU5MT0FESU5HKSkKKwkJCW1vZF90aW1lcigmdnBvcnQtPmVsc190bW9mdW5jLAorCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCAqIHRpbWVvdXQpKTsKIH0KIAogLyoqCkBAIC02MzE3LDE1ICs2MzU2LDUwIEBACiB2b2lkCiBscGZjX2Vsc19mbHVzaF9jbWQoc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0KQogewotCUxJU1RfSEVBRChjb21wbGV0aW9ucyk7CisJTElTVF9IRUFEKGFib3J0X2xpc3QpOwogCXN0cnVjdCBscGZjX2hiYSAgKnBoYmEgPSB2cG9ydC0+cGhiYTsKIAlzdHJ1Y3QgbHBmY19zbGlfcmluZyAqcHJpbmcgPSAmcGhiYS0+c2xpLnJpbmdbTFBGQ19FTFNfUklOR107CiAJc3RydWN0IGxwZmNfaW9jYnEgKnRtcF9pb2NiLCAqcGlvY2I7CiAJSU9DQl90ICpjbWQgPSBOVUxMOwogCiAJbHBmY19mYWJyaWNfYWJvcnRfdnBvcnQodnBvcnQpOworCS8qCisJICogRm9yIFNMSTMsIG9ubHkgdGhlIGhiYWxvY2sgaXMgcmVxdWlyZWQuICBCdXQgU0xJNCBuZWVkcyB0byBjb29yZGluYXRlCisJICogd2l0aCB0aGUgcmluZyBpbnNlcnQgb3BlcmF0aW9uLiAgQmVjYXVzZSBscGZjX3NsaV9pc3N1ZV9hYm9ydF9pb3RhZworCSAqIHVsdGltYXRlbHkgZ3JhYnMgdGhlIHJpbmdfbG9jaywgdGhlIGRyaXZlciBtdXN0IHNwbGljZSB0aGUgbGlzdCBpbnRvCisJICogYSB3b3JraW5nIGxpc3QgYW5kIHJlbGVhc2UgdGhlIGxvY2tzIGJlZm9yZSBjYWxsaW5nIHRoZSBhYm9ydC4KKwkgKi8KKwlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQorCQlzcGluX2xvY2soJnByaW5nLT5yaW5nX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBpb2NiLCB0bXBfaW9jYiwgJnByaW5nLT50eGNtcGxxLCBsaXN0KSB7CisJCWlmIChwaW9jYi0+aW9jYl9mbGFnICYgTFBGQ19JT19MSUJERkMpCisJCQljb250aW51ZTsKKworCQlpZiAocGlvY2ItPnZwb3J0ICE9IHZwb3J0KQorCQkJY29udGludWU7CisJCWxpc3RfYWRkX3RhaWwoJnBpb2NiLT5kbGlzdCwgJmFib3J0X2xpc3QpOworCX0KKwlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQorCQlzcGluX3VubG9jaygmcHJpbmctPnJpbmdfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwkvKiBBYm9ydCBlYWNoIGlvY2Igb24gdGhlIGFib3J0ZWQgbGlzdCBhbmQgcmVtb3ZlIHRoZSBkbGlzdCBsaW5rcy4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGlvY2IsIHRtcF9pb2NiLCAmYWJvcnRfbGlzdCwgZGxpc3QpIHsKKwkJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJCWxpc3RfZGVsX2luaXQoJnBpb2NiLT5kbGlzdCk7CisJCWxwZmNfc2xpX2lzc3VlX2Fib3J0X2lvdGFnKHBoYmEsIHByaW5nLCBwaW9jYik7CisJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJfQorCWlmICghbGlzdF9lbXB0eSgmYWJvcnRfbGlzdCkpCisJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfRUxTLAorCQkJCSAiMzM4NyBhYm9ydCBsaXN0IGZvciB0eHEgbm90IGVtcHR5XG4iKTsKKwlJTklUX0xJU1RfSEVBRCgmYWJvcnRfbGlzdCk7CiAKIAlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQorCQlzcGluX2xvY2soJnByaW5nLT5yaW5nX2xvY2spOworCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBpb2NiLCB0bXBfaW9jYiwgJnByaW5nLT50eHEsIGxpc3QpIHsKIAkJY21kID0gJnBpb2NiLT5pb2NiOwogCkBAIC02MzQzLDI0ICs2NDE3LDE2IEBACiAJCWlmIChwaW9jYi0+dnBvcnQgIT0gdnBvcnQpCiAJCQljb250aW51ZTsKIAotCQlsaXN0X21vdmVfdGFpbCgmcGlvY2ItPmxpc3QsICZjb21wbGV0aW9ucyk7CisJCWxpc3RfZGVsX2luaXQoJnBpb2NiLT5saXN0KTsKKwkJbGlzdF9hZGRfdGFpbCgmcGlvY2ItPmxpc3QsICZhYm9ydF9saXN0KTsKIAl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGlvY2IsIHRtcF9pb2NiLCAmcHJpbmctPnR4Y21wbHEsIGxpc3QpIHsKLQkJaWYgKHBpb2NiLT5pb2NiX2ZsYWcgJiBMUEZDX0lPX0xJQkRGQykgewotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAocGlvY2ItPnZwb3J0ICE9IHZwb3J0KQotCQkJY29udGludWU7Ci0KLQkJbHBmY19zbGlfaXNzdWVfYWJvcnRfaW90YWcocGhiYSwgcHJpbmcsIHBpb2NiKTsKLQl9CisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKKwkJc3Bpbl91bmxvY2soJnByaW5nLT5yaW5nX2xvY2spOwogCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAKIAkvKiBDYW5jZWxsIGFsbCB0aGUgSU9DQnMgZnJvbSB0aGUgY29tcGxldGlvbnMgbGlzdCAqLwotCWxwZmNfc2xpX2NhbmNlbF9pb2NicyhwaGJhLCAmY29tcGxldGlvbnMsIElPU1RBVF9MT0NBTF9SRUpFQ1QsCi0JCQkgICAgICBJT0VSUl9TTElfQUJPUlRFRCk7CisJbHBmY19zbGlfY2FuY2VsX2lvY2JzKHBoYmEsICZhYm9ydF9saXN0LAorCQkJICAgICAgSU9TVEFUX0xPQ0FMX1JFSkVDVCwgSU9FUlJfU0xJX0FCT1JURUQpOwogCiAJcmV0dXJuOwogfQpAQCAtNjM4NSwzNSArNjQ1MSw5IEBACiB2b2lkCiBscGZjX2Vsc19mbHVzaF9hbGxfY21kKHN0cnVjdCBscGZjX2hiYSAgKnBoYmEpCiB7Ci0JTElTVF9IRUFEKGNvbXBsZXRpb25zKTsKLQlzdHJ1Y3QgbHBmY19zbGlfcmluZyAqcHJpbmcgPSAmcGhiYS0+c2xpLnJpbmdbTFBGQ19FTFNfUklOR107Ci0Jc3RydWN0IGxwZmNfaW9jYnEgKnRtcF9pb2NiLCAqcGlvY2I7Ci0JSU9DQl90ICpjbWQgPSBOVUxMOwotCi0JbHBmY19mYWJyaWNfYWJvcnRfaGJhKHBoYmEpOwotCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwaW9jYiwgdG1wX2lvY2IsICZwcmluZy0+dHhxLCBsaXN0KSB7Ci0JCWNtZCA9ICZwaW9jYi0+aW9jYjsKLQkJaWYgKHBpb2NiLT5pb2NiX2ZsYWcgJiBMUEZDX0lPX0xJQkRGQykKLQkJCWNvbnRpbnVlOwotCQkvKiBEbyBub3QgZmx1c2ggb3V0IHRoZSBRVUVfUklORyBhbmQgQUJPUlQvQ0xPU0UgaW9jYnMgKi8KLQkJaWYgKGNtZC0+dWxwQ29tbWFuZCA9PSBDTURfUVVFX1JJTkdfQlVGX0NOIHx8Ci0JCSAgICBjbWQtPnVscENvbW1hbmQgPT0gQ01EX1FVRV9SSU5HX0JVRjY0X0NOIHx8Ci0JCSAgICBjbWQtPnVscENvbW1hbmQgPT0gQ01EX0NMT1NFX1hSSV9DTiB8fAotCQkgICAgY21kLT51bHBDb21tYW5kID09IENNRF9BQk9SVF9YUklfQ04pCi0JCQljb250aW51ZTsKLQkJbGlzdF9tb3ZlX3RhaWwoJnBpb2NiLT5saXN0LCAmY29tcGxldGlvbnMpOwotCX0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGlvY2IsIHRtcF9pb2NiLCAmcHJpbmctPnR4Y21wbHEsIGxpc3QpIHsKLQkJaWYgKHBpb2NiLT5pb2NiX2ZsYWcgJiBMUEZDX0lPX0xJQkRGQykKLQkJCWNvbnRpbnVlOwotCQlscGZjX3NsaV9pc3N1ZV9hYm9ydF9pb3RhZyhwaGJhLCBwcmluZywgcGlvY2IpOwotCX0KLQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwotCi0JLyogQ2FuY2VsIGFsbCB0aGUgSU9DQnMgZnJvbSB0aGUgY29tcGxldGlvbnMgbGlzdCAqLwotCWxwZmNfc2xpX2NhbmNlbF9pb2NicyhwaGJhLCAmY29tcGxldGlvbnMsIElPU1RBVF9MT0NBTF9SRUpFQ1QsCi0JCQkgICAgICBJT0VSUl9TTElfQUJPUlRFRCk7CisJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0OworCWxpc3RfZm9yX2VhY2hfZW50cnkodnBvcnQsICZwaGJhLT5wb3J0X2xpc3QsIGxpc3RlbnRyeSkKKwkJbHBmY19lbHNfZmx1c2hfY21kKHZwb3J0KTsKIAogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaGJhZGlzYy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKaW5kZXggODgzZWEyZC4uNTliNTFjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKQEAgLTY3NCw4ICs2NzQsNiBAQAogCQkJCWxwZmNfZmRtaV90aW1lb3V0X2hhbmRsZXIodnBvcnQpOwogCQkJaWYgKHdvcmtfcG9ydF9ldmVudHMgJiBXT1JLRVJfUkFNUF9ET1dOX1FVRVVFKQogCQkJCWxwZmNfcmFtcF9kb3duX3F1ZXVlX2hhbmRsZXIocGhiYSk7Ci0JCQlpZiAod29ya19wb3J0X2V2ZW50cyAmIFdPUktFUl9SQU1QX1VQX1FVRVVFKQotCQkJCWxwZmNfcmFtcF91cF9xdWV1ZV9oYW5kbGVyKHBoYmEpOwogCQkJaWYgKHdvcmtfcG9ydF9ldmVudHMgJiBXT1JLRVJfREVMQVlFRF9ESVNDX1RNTykKIAkJCQlscGZjX2RlbGF5ZWRfZGlzY190aW1lb3V0X2hhbmRsZXIodnBvcnQpOwogCQl9CkBAIC0yNTQ1LDggKzI1NDMsMTEgQEAKIAlpZiAoIW5ld19mY2ZfcmVjb3JkKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19GSVAsCiAJCQkJIjI3NjYgTWFpbGJveCBjb21tYW5kIFJFQURfRkNGX1JFQ09SRCAiCi0JCQkJImZhaWxlZCB0byByZXRyaWV2ZSBhIEZDRiByZWNvcmQuXG4iKTsKLQkJZ290byBlcnJvcl9vdXQ7CisJCQkJImZhaWxlZCB0byByZXRyaWV2ZSBhIEZDRiByZWNvcmQuICIKKwkJCQkiaGJhX2ZsZyB4JXggZmNmX2ZsZyB4JXhcbiIsIHBoYmEtPmhiYV9mbGFnLAorCQkJCXBoYmEtPmZjZi5mY2ZfZmxhZyk7CisJCWxwZmNfdW5yZWdpc3Rlcl9mY2ZfcmVzY2FuKHBoYmEpOworCQlnb3RvIG91dDsKIAl9CiAKIAkvKiBHZXQgdGhlIG5lZWRlZCBwYXJhbWV0ZXJzIGZyb20gRkNGIHJlY29yZCAqLwpAQCAtMzk3Myw3ICszOTc0LDEwIEBACiAJCXZwb3J0LT5mY19tYXBfY250ICs9IGNvdW50OwogCQlicmVhazsKIAljYXNlIE5MUF9TVEVfTlBSX05PREU6Ci0JCXZwb3J0LT5mY19ucHJfY250ICs9IGNvdW50OworCQlpZiAodnBvcnQtPmZjX25wcl9jbnQgPT0gMCAmJiBjb3VudCA9PSAtMSkKKwkJCXZwb3J0LT5mY19ucHJfY250ID0gMDsKKwkJZWxzZQorCQkJdnBvcnQtPmZjX25wcl9jbnQgKz0gY291bnQ7CiAJCWJyZWFrOwogCX0KIAlzcGluX3VubG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7CkBAIC00MTgwLDYgKzQxODQsNyBAQAogCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9IHZwb3J0LT5waGJhOwogCXVpbnQzMl90IGRpZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgKmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAgPSBOVUxMOwogCiAJaWYgKCFuZGxwKQogCQlyZXR1cm4gTlVMTDsKQEAgLTQyMDgsMTIgKzQyMTMsMTcgQEAKIAogCS8qIEtlZXAgdGhlIG9yaWdpbmFsIERJRCAqLwogCWRpZCA9IG5kbHAtPm5scF9ESUQ7CisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKKwkJYWN0aXZlX3JycXNfeHJpX2JpdG1hcCA9IG5kbHAtPmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXA7CiAKIAkvKiByZS1pbml0aWFsaXplIG5kbHAgZXhjZXB0IG9mIG5kbHAgbGlua2VkIGxpc3QgcG9pbnRlciAqLwogCW1lbXNldCgoKChjaGFyICopbmRscCkgKyBzaXplb2YgKHN0cnVjdCBsaXN0X2hlYWQpKSwgMCwKIAkJc2l6ZW9mIChzdHJ1Y3QgbHBmY19ub2RlbGlzdCkgLSBzaXplb2YgKHN0cnVjdCBsaXN0X2hlYWQpKTsKIAlscGZjX2luaXRpYWxpemVfbm9kZSh2cG9ydCwgbmRscCwgZGlkKTsKIAorCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCW5kbHAtPmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAgPSBhY3RpdmVfcnJxc194cmlfYml0bWFwOworCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+bmRscF9sb2NrLCBmbGFncyk7CiAJaWYgKHZwb3J0LT5waGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCiAJCW5kbHAtPm5scF9ycGkgPSBscGZjX3NsaTRfYWxsb2NfcnBpKHZwb3J0LT5waGJhKTsKQEAgLTQ3OTksOSArNDgwOSwxMCBAQAogCQkJCSAoKHVpbnQzMl90KSBuZGxwLT5ubHBfcnBpICYgMHhmZikpOwogCQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9JTkZPLCBMT0dfTk9ERSwKIAkJCQkJICIwOTI5IEZJTkQgbm9kZSBESUQgIgotCQkJCQkgIkRhdGE6IHglcCB4JXggeCV4IHgleFxuIiwKKwkJCQkJICJEYXRhOiB4JXAgeCV4IHgleCB4JXggJXBcbiIsCiAJCQkJCSBuZGxwLCBuZGxwLT5ubHBfRElELAotCQkJCQkgbmRscC0+bmxwX2ZsYWcsIGRhdGExKTsKKwkJCQkJIG5kbHAtPm5scF9mbGFnLCBkYXRhMSwKKwkJCQkJIG5kbHAtPmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXApOwogCQkJcmV0dXJuIG5kbHA7CiAJCX0KIAl9CkBAIC01NjE4LDggKzU2MjksMTMgQEAKIAogCWxwZmNfaW5pdGlhbGl6ZV9ub2RlKHZwb3J0LCBuZGxwLCBkaWQpOwogCUlOSVRfTElTVF9IRUFEKCZuZGxwLT5ubHBfbGlzdHApOwotCWlmICh2cG9ydC0+cGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQorCWlmICh2cG9ydC0+cGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KSB7CiAJCW5kbHAtPm5scF9ycGkgPSBscGZjX3NsaTRfYWxsb2NfcnBpKHZwb3J0LT5waGJhKTsKKwkJbmRscC0+YWN0aXZlX3JycXNfeHJpX2JpdG1hcCA9CisJCQkJbWVtcG9vbF9hbGxvYyh2cG9ydC0+cGhiYS0+YWN0aXZlX3JycV9wb29sLAorCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKKwl9CisKIAogCiAJbHBmY19kZWJ1Z2ZzX2Rpc2NfdHJjKHZwb3J0LCBMUEZDX0RJU0NfVFJDX05PREUsCkBAIC01NjY0LDYgKzU2ODAsOSBAQAogCS8qIGZyZWUgbmRscCBtZW1vcnkgZm9yIGZpbmFsIG5kbHAgcmVsZWFzZSAqLwogCWlmIChOTFBfQ0hLX0ZSRUVfUkVRKG5kbHApKSB7CiAJCWtmcmVlKG5kbHAtPmxhdF9kYXRhKTsKKwkJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKKwkJCW1lbXBvb2xfZnJlZShuZGxwLT5hY3RpdmVfcnJxc194cmlfYml0bWFwLAorCQkJCSAgICAgbmRscC0+cGhiYS0+YWN0aXZlX3JycV9wb29sKTsKIAkJbWVtcG9vbF9mcmVlKG5kbHAsIG5kbHAtPnBoYmEtPm5scF9tZW1fcG9vbCk7CiAJfQogfQpAQCAtNjE3MCwxMCArNjE4OSw2IEBACiAKIAkJbWVtY3B5KCZjb25uX2VudHJ5LT5jb25uX3JlYywgJmNvbm5fcmVjW2ldLAogCQkJc2l6ZW9mKHN0cnVjdCBscGZjX2ZjZl9jb25uX3JlYykpOwotCQljb25uX2VudHJ5LT5jb25uX3JlYy52bGFuX3RhZyA9Ci0JCQljb25uX2VudHJ5LT5jb25uX3JlYy52bGFuX3RhZzsKLQkJY29ubl9lbnRyeS0+Y29ubl9yZWMuZmxhZ3MgPQotCQkJY29ubl9lbnRyeS0+Y29ubl9yZWMuZmxhZ3M7CiAJCWxpc3RfYWRkX3RhaWwoJmNvbm5fZW50cnktPmxpc3QsCiAJCQkmcGhiYS0+ZmNmX2Nvbm5fcmVjX2xpc3QpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHcuaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHcuaAppbmRleCA2ZjkyN2QzLi4zZDk0MzhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3LmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ody5oCkBAIC00NSw2ICs0NSw3IEBACiAjZGVmaW5lIExQRkNfRVhUUkFfUklORyAgICAgICAgICAxCS8qIHJpbmcgMSBmb3Igb3RoZXIgcHJvdG9jb2xzICovCiAjZGVmaW5lIExQRkNfRUxTX1JJTkcgICAgICAgICAgICAyCS8qIHJpbmcgMiBmb3IgRUxTIGNvbW1hbmRzICovCiAjZGVmaW5lIExQRkNfRkNQX05FWFRfUklORyAgICAgICAzCisjZGVmaW5lIExQRkNfRkNQX09BU19SSU5HICAgICAgICAzCiAKICNkZWZpbmUgU0xJMl9JT0NCX0NNRF9SMF9FTlRSSUVTICAgIDE3MgkvKiBTTEktMiBGQ1AgY29tbWFuZCByaW5nIGVudHJpZXMgKi8KICNkZWZpbmUgU0xJMl9JT0NCX1JTUF9SMF9FTlRSSUVTICAgIDEzNAkvKiBTTEktMiBGQ1AgcmVzcG9uc2UgcmluZyBlbnRyaWVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3NC5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19odzQuaAppbmRleCA1NDY0YjExLi5mZDc5ZjdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3NC5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHc0LmgKQEAgLTI2MTYsNiArMjYxNiw5IEBACiAjZGVmaW5lIGNmZ19waHdxX1NISUZUCQkJCTE1CiAjZGVmaW5lIGNmZ19waHdxX01BU0sJCQkJMHgwMDAwMDAwMQogI2RlZmluZSBjZmdfcGh3cV9XT1JECQkJCXdvcmQxMgorI2RlZmluZSBjZmdfb2FzX1NISUZUCQkJCTI1CisjZGVmaW5lIGNmZ19vYXNfTUFTSwkJCQkweDAwMDAwMDAxCisjZGVmaW5lIGNmZ19vYXNfV09SRAkJCQl3b3JkMTIKICNkZWZpbmUgY2ZnX2xvb3Bia19zY29wZV9TSElGVAkJCTI4CiAjZGVmaW5lIGNmZ19sb29wYmtfc2NvcGVfTUFTSwkJCTB4MDAwMDAwMGYKICNkZWZpbmUgY2ZnX2xvb3Bia19zY29wZV9XT1JECQkJd29yZDEyCkBAIC0zMzIyLDYgKzMzMjUsOSBAQAogI2RlZmluZSB3cWVfZWJkZV9jbnRfU0hJRlQgICAgMAogI2RlZmluZSB3cWVfZWJkZV9jbnRfTUFTSyAgICAgMHgwMDAwMDAwZgogI2RlZmluZSB3cWVfZWJkZV9jbnRfV09SRCAgICAgd29yZDEwCisjZGVmaW5lIHdxZV9vYXNfU0hJRlQgICAgICAgICA2CisjZGVmaW5lIHdxZV9vYXNfTUFTSyAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHdxZV9vYXNfV09SRCAgICAgICAgICB3b3JkMTAKICNkZWZpbmUgd3FlX2xlbmxvY19TSElGVCAgICAgIDcKICNkZWZpbmUgd3FlX2xlbmxvY19NQVNLICAgICAgIDB4MDAwMDAwMDMKICNkZWZpbmUgd3FlX2xlbmxvY19XT1JEICAgICAgIHdvcmQxMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYwppbmRleCA2OGM5NGNjLi42MzVlZWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYwpAQCAtODAsNiArODAsNyBAQAogc3RhdGljIHZvaWQgbHBmY19zbGk0X2NxX2V2ZW50X3JlbGVhc2VfYWxsKHN0cnVjdCBscGZjX2hiYSAqKTsKIHN0YXRpYyB2b2lkIGxwZmNfc2xpNF9kaXNhYmxlX2ludHIoc3RydWN0IGxwZmNfaGJhICopOwogc3RhdGljIHVpbnQzMl90IGxwZmNfc2xpNF9lbmFibGVfaW50cihzdHJ1Y3QgbHBmY19oYmEgKiwgdWludDMyX3QpOworc3RhdGljIHZvaWQgbHBmY19zbGk0X29hc192ZXJpZnkoc3RydWN0IGxwZmNfaGJhICpwaGJhKTsKIAogc3RhdGljIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqbHBmY190cmFuc3BvcnRfdGVtcGxhdGUgPSBOVUxMOwogc3RhdGljIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqbHBmY192cG9ydF90cmFuc3BvcnRfdGVtcGxhdGUgPSBOVUxMOwpAQCAtMTAwNSw5ICsxMDA2LDE0IEBACiAKIAlwaGJhID0gKHN0cnVjdCBscGZjX2hiYSAqKXB0cjsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+cHBvcnQtPndvcmtfcG9ydF9sb2NrLCBpZmxhZyk7Ci0JcGhiYS0+aGJhX2ZsYWcgfD0gSEJBX1JSUV9BQ1RJVkU7CisJaWYgKCEocGhiYS0+cHBvcnQtPmxvYWRfZmxhZyAmIEZDX1VOTE9BRElORykpCisJCXBoYmEtPmhiYV9mbGFnIHw9IEhCQV9SUlFfQUNUSVZFOworCWVsc2UKKwkJcGhiYS0+aGJhX2ZsYWcgJj0gfkhCQV9SUlFfQUNUSVZFOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPnBwb3J0LT53b3JrX3BvcnRfbG9jaywgaWZsYWcpOwotCWxwZmNfd29ya2VyX3dha2VfdXAocGhiYSk7CisKKwlpZiAoIShwaGJhLT5wcG9ydC0+bG9hZF9mbGFnICYgRkNfVU5MT0FESU5HKSkKKwkJbHBmY193b3JrZXJfd2FrZV91cChwaGJhKTsKIH0KIAogLyoqCkBAIC0xNDY4LDcgKzE0NzQsOCBAQAogICogZm9yIGhhbmRsaW5nIHBvc3NpYmxlIHBvcnQgcmVzb3VyY2UgY2hhbmdlLgogICoqLwogc3RhdGljIGludAotbHBmY19zbGk0X3BvcnRfc3RhX2ZuX3Jlc2V0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgaW50IG1ieF9hY3Rpb24pCitscGZjX3NsaTRfcG9ydF9zdGFfZm5fcmVzZXQoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBpbnQgbWJ4X2FjdGlvbiwKKwkJCSAgICBib29sIGVuX3JuX21zZykKIHsKIAlpbnQgcmM7CiAJdWludDMyX3QgaW50cl9tb2RlOwpAQCAtMTQ4MCw5ICsxNDg3LDEwIEBACiAJcmMgPSBscGZjX3NsaTRfcGRldl9zdGF0dXNfcmVnX3dhaXQocGhiYSk7CiAJaWYgKCFyYykgewogCQkvKiBuZWVkIHJlc2V0OiBhdHRlbXB0IGZvciBwb3J0IHJlY292ZXJ5ICovCi0JCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCi0JCQkJIjI4ODcgUmVzZXQgTmVlZGVkOiBBdHRlbXB0aW5nIFBvcnQgIgotCQkJCSJSZWNvdmVyeS4uLlxuIik7CisJCWlmIChlbl9ybl9tc2cpCisJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCQkiMjg4NyBSZXNldCBOZWVkZWQ6IEF0dGVtcHRpbmcgUG9ydCAiCisJCQkJCSJSZWNvdmVyeS4uLlxuIik7CiAJCWxwZmNfb2ZmbGluZV9wcmVwKHBoYmEsIG1ieF9hY3Rpb24pOwogCQlscGZjX29mZmxpbmUocGhiYSk7CiAJCS8qIHJlbGVhc2UgaW50ZXJydXB0IGZvciBwb3NzaWJsZSByZXNvdXJjZSBjaGFuZ2UgKi8KQEAgLTE1MjIsNiArMTUzMCw3IEBACiAJdWludDMyX3QgcmVnX2VycjEsIHJlZ19lcnIyOwogCXVpbnQzMl90IHVlcnJsb19yZWcsIHVlbWFza2xvX3JlZzsKIAl1aW50MzJfdCBwY2lfcmRfcmMxLCBwY2lfcmRfcmMyOworCWJvb2wgZW5fcm5fbXNnID0gdHJ1ZTsKIAlpbnQgcmM7CiAKIAkvKiBJZiB0aGUgcGNpIGNoYW5uZWwgaXMgb2ZmbGluZSwgaWdub3JlIHBvc3NpYmxlIGVycm9ycywgc2luY2UKQEAgLTE1NzIsMTAgKzE1ODEsMTIgQEAKIAkJCWJyZWFrOwogCQl9CiAJCWlmIChyZWdfZXJyMSA9PSBTTElQT1JUX0VSUjFfUkVHX0VSUl9DT0RFXzIgJiYKLQkJICAgIHJlZ19lcnIyID09IFNMSVBPUlRfRVJSMl9SRUdfRldfUkVTVEFSVCkKKwkJICAgIHJlZ19lcnIyID09IFNMSVBPUlRfRVJSMl9SRUdfRldfUkVTVEFSVCkgewogCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKLQkJCQkJIjMxNDMgUG9ydCBEb3duOiBGaXJtd2FyZSBSZXN0YXJ0ZWRcbiIpOwotCQllbHNlIGlmIChyZWdfZXJyMSA9PSBTTElQT1JUX0VSUjFfUkVHX0VSUl9DT0RFXzIgJiYKKwkJCQkJIjMxNDMgUG9ydCBEb3duOiBGaXJtd2FyZSBVcGRhdGUgIgorCQkJCQkiRGV0ZWN0ZWRcbiIpOworCQkJZW5fcm5fbXNnID0gZmFsc2U7CisJCX0gZWxzZSBpZiAocmVnX2VycjEgPT0gU0xJUE9SVF9FUlIxX1JFR19FUlJfQ09ERV8yICYmCiAJCQkgcmVnX2VycjIgPT0gU0xJUE9SVF9FUlIyX1JFR19GT1JDRURfRFVNUCkKIAkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCiAJCQkJCSIzMTQ0IFBvcnQgRG93bjogRGVidWcgRHVtcFxuIik7CkBAIC0xNTg1LDcgKzE1OTYsOCBAQAogCQkJCQkiMzE0NSBQb3J0IERvd246IFByb3Zpc2lvbmluZ1xuIik7CiAKIAkJLyogQ2hlY2sgcG9ydCBzdGF0dXMgcmVnaXN0ZXIgZm9yIGZ1bmN0aW9uIHJlc2V0ICovCi0JCXJjID0gbHBmY19zbGk0X3BvcnRfc3RhX2ZuX3Jlc2V0KHBoYmEsIExQRkNfTUJYX05PX1dBSVQpOworCQlyYyA9IGxwZmNfc2xpNF9wb3J0X3N0YV9mbl9yZXNldChwaGJhLCBMUEZDX01CWF9OT19XQUlULAorCQkJCWVuX3JuX21zZyk7CiAJCWlmIChyYyA9PSAwKSB7CiAJCQkvKiBkb24ndCByZXBvcnQgZXZlbnQgb24gZm9yY2VkIGRlYnVnIGR1bXAgKi8KIAkJCWlmIChyZWdfZXJyMSA9PSBTTElQT1JUX0VSUjFfUkVHX0VSUl9DT0RFXzIgJiYKQEAgLTQ4NTYsNiArNDg2OCw3IEBACiAJdWludDhfdCBwbl9wYWdlW0xQRkNfTUFYX1NVUFBPUlRFRF9QQUdFU10gPSB7MH07CiAJc3RydWN0IGxwZmNfbXFlICptcWU7CiAJaW50IGxvbmdzOworCWludCBmb2ZfdmVjdG9ycyA9IDA7CiAKIAkvKiBHZXQgYWxsIHRoZSBtb2R1bGUgcGFyYW1zIGZvciBjb25maWd1cmluZyB0aGlzIGhvc3QgKi8KIAlscGZjX2dldF9jZmdwYXJhbShwaGJhKTsKQEAgLTUwNjEsNiArNTA3NCw5IEBACiAJcmMgPSBscGZjX3NsaTRfcmVhZF9jb25maWcocGhiYSk7CiAJaWYgKHVubGlrZWx5KHJjKSkKIAkJZ290byBvdXRfZnJlZV9ic21ieDsKKwlyYyA9IGxwZmNfbWVtX2FsbG9jX2FjdGl2ZV9ycnFfcG9vbF9zNChwaGJhKTsKKwlpZiAodW5saWtlbHkocmMpKQorCQlnb3RvIG91dF9mcmVlX2JzbWJ4OwogCiAJLyogSUYgVHlwZSAwIHBvcnRzIGdldCBpbml0aWFsaXplZCBub3cuICovCiAJaWYgKGJmX2dldChscGZjX3NsaV9pbnRmX2lmX3R5cGUsICZwaGJhLT5zbGk0X2hiYS5zbGlfaW50ZikgPT0KQEAgLTUxMTgsNiArNTEzNCwxMiBAQAogCQl9CiAJfQogCW1lbXBvb2xfZnJlZShtYm94cSwgcGhiYS0+bWJveF9tZW1fcG9vbCk7CisKKwkvKiBWZXJpZnkgT0FTIGlzIHN1cHBvcnRlZCAqLworCWxwZmNfc2xpNF9vYXNfdmVyaWZ5KHBoYmEpOworCWlmIChwaGJhLT5jZmdfZm9mKQorCQlmb2ZfdmVjdG9ycyA9IDE7CisKIAkvKiBWZXJpZnkgYWxsIHRoZSBTTEk0IHF1ZXVlcyAqLwogCXJjID0gbHBmY19zbGk0X3F1ZXVlX3ZlcmlmeShwaGJhKTsKIAlpZiAocmMpCkBAIC01MTU5LDcgKzUxODEsOCBAQAogCiAJcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbCA9CiAJCQlremFsbG9jKChzaXplb2Yoc3RydWN0IGxwZmNfZmNwX2VxX2hkbCkgKgotCQkJICAgIHBoYmEtPmNmZ19mY3BfaW9fY2hhbm5lbCksIEdGUF9LRVJORUwpOworCQkJICAgIChmb2ZfdmVjdG9ycyArIHBoYmEtPmNmZ19mY3BfaW9fY2hhbm5lbCkpLAorCQkJICAgIEdGUF9LRVJORUwpOwogCWlmICghcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbCkgewogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAogCQkJCSIyNTcyIEZhaWxlZCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKQEAgLTUxNjksNyArNTE5Miw4IEBACiAJfQogCiAJcGhiYS0+c2xpNF9oYmEubXNpeF9lbnRyaWVzID0ga3phbGxvYygoc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSAqCi0JCQkJICAgICAgcGhiYS0+Y2ZnX2ZjcF9pb19jaGFubmVsKSwgR0ZQX0tFUk5FTCk7CisJCQkJICAoZm9mX3ZlY3RvcnMgKworCQkJCSAgIHBoYmEtPmNmZ19mY3BfaW9fY2hhbm5lbCkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBoYmEtPnNsaTRfaGJhLm1zaXhfZW50cmllcykgewogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAogCQkJCSIyNTczIEZhaWxlZCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG1zaS14ICIKQEAgLTUyNjcsNiArNTI5MSw3IEBACiAJa2ZyZWUocGhiYS0+c2xpNF9oYmEuY3B1X21hcCk7CiAJcGhiYS0+c2xpNF9oYmEubnVtX3ByZXNlbnRfY3B1ID0gMDsKIAlwaGJhLT5zbGk0X2hiYS5udW1fb25saW5lX2NwdSA9IDA7CisJcGhiYS0+c2xpNF9oYmEuY3Vycl9kaXNwX2NwdSA9IDA7CiAKIAkvKiBGcmVlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIG1zaS14IGludGVycnVwdCB2ZWN0b3IgZW50cmllcyAqLwogCWtmcmVlKHBoYmEtPnNsaTRfaGJhLm1zaXhfZW50cmllcyk7CkBAIC01MzkwLDYgKzU0MTUsMTAgQEAKIAkvKiBJbml0aWFsaXplIEZDRiBjb25uZWN0aW9uIHJlYyBsaXN0ICovCiAJSU5JVF9MSVNUX0hFQUQoJnBoYmEtPmZjZl9jb25uX3JlY19saXN0KTsKIAorCS8qIEluaXRpYWxpemUgT0FTIGNvbmZpZ3VyYXRpb24gbGlzdCAqLworCXNwaW5fbG9ja19pbml0KCZwaGJhLT5kZXZpY2Vsb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcGhiYS0+bHVucyk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjgxNiw2ICs2ODQ1LDcgQEAKIAlpbnQgY2ZnX2ZjcF9pb19jaGFubmVsOwogCXVpbnQzMl90IGNwdTsKIAl1aW50MzJfdCBpID0gMDsKKwlpbnQgZm9mX3ZlY3RvcnMgPSBwaGJhLT5jZmdfZm9mID8gMSA6IDA7CiAKIAkvKgogCSAqIFNhbml0eSBjaGVjayBmb3IgY29uZmlndXJlZCBxdWV1ZSBwYXJhbWV0ZXJzIGFnYWluc3QgdGhlIHJ1bi10aW1lCkBAIC02ODMyLDYgKzY4NjIsNyBAQAogCX0KIAlwaGJhLT5zbGk0X2hiYS5udW1fb25saW5lX2NwdSA9IGk7CiAJcGhiYS0+c2xpNF9oYmEubnVtX3ByZXNlbnRfY3B1ID0gbHBmY19wcmVzZW50X2NwdTsKKwlwaGJhLT5zbGk0X2hiYS5jdXJyX2Rpc3BfY3B1ID0gMDsKIAogCWlmIChpIDwgY2ZnX2ZjcF9pb19jaGFubmVsKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLApAQCAtNjg0Miw3ICs2ODczLDcgQEAKIAkJY2ZnX2ZjcF9pb19jaGFubmVsID0gaTsKIAl9CiAKLQlpZiAoY2ZnX2ZjcF9pb19jaGFubmVsID4KKwlpZiAoY2ZnX2ZjcF9pb19jaGFubmVsICsgZm9mX3ZlY3RvcnMgPgogCSAgICBwaGJhLT5zbGk0X2hiYS5tYXhfY2ZnX3BhcmFtLm1heF9lcSkgewogCQlpZiAocGhiYS0+c2xpNF9oYmEubWF4X2NmZ19wYXJhbS5tYXhfZXEgPAogCQkgICAgTFBGQ19GQ1BfSU9fQ0hBTl9NSU4pIHsKQEAgLTY4NTksNyArNjg5MCw4IEBACiAJCQkJImF2YWlsYWJsZSBFUXM6IGZyb20gJWQgdG8gJWRcbiIsCiAJCQkJY2ZnX2ZjcF9pb19jaGFubmVsLAogCQkJCXBoYmEtPnNsaTRfaGJhLm1heF9jZmdfcGFyYW0ubWF4X2VxKTsKLQkJY2ZnX2ZjcF9pb19jaGFubmVsID0gcGhiYS0+c2xpNF9oYmEubWF4X2NmZ19wYXJhbS5tYXhfZXE7CisJCWNmZ19mY3BfaW9fY2hhbm5lbCA9IHBoYmEtPnNsaTRfaGJhLm1heF9jZmdfcGFyYW0ubWF4X2VxIC0KKwkJCWZvZl92ZWN0b3JzOwogCX0KIAogCS8qIFRoZSBhY3R1YWwgbnVtYmVyIG9mIEZDUCBldmVudCBxdWV1ZXMgYWRvcHRlZCAqLwpAQCAtNzA3MCw2ICs3MTAyLDkgQEAKIAl9CiAJcGhiYS0+c2xpNF9oYmEuZGF0X3JxID0gcWRlc2M7CiAKKwkvKiBDcmVhdGUgdGhlIFF1ZXVlcyBuZWVkZWQgZm9yIEZsYXNoIE9wdGltaXplZCBGYWJyaWMgb3BlcmF0aW9ucyAqLworCWlmIChwaGJhLT5jZmdfZm9mKQorCQlscGZjX2ZvZl9xdWV1ZV9jcmVhdGUocGhiYSk7CiAJcmV0dXJuIDA7CiAKIG91dF9lcnJvcjoKQEAgLTcwOTQsNiArNzEyOSw5IEBACiB7CiAJaW50IGlkeDsKIAorCWlmIChwaGJhLT5jZmdfZm9mKQorCQlscGZjX2ZvZl9xdWV1ZV9kZXN0cm95KHBoYmEpOworCiAJaWYgKHBoYmEtPnNsaTRfaGJhLmhiYV9lcSAhPSBOVUxMKSB7CiAJCS8qIFJlbGVhc2UgSEJBIGV2ZW50IHF1ZXVlICovCiAJCWZvciAoaWR4ID0gMDsgaWR4IDwgcGhiYS0+Y2ZnX2ZjcF9pb19jaGFubmVsOyBpZHgrKykgewpAQCAtNzQ3OCw4ICs3NTE2LDIwIEBACiAJCQlwaGJhLT5zbGk0X2hiYS5oZHJfcnEtPnF1ZXVlX2lkLAogCQkJcGhiYS0+c2xpNF9oYmEuZGF0X3JxLT5xdWV1ZV9pZCwKIAkJCXBoYmEtPnNsaTRfaGJhLmVsc19jcS0+cXVldWVfaWQpOworCisJaWYgKHBoYmEtPmNmZ19mb2YpIHsKKwkJcmMgPSBscGZjX2ZvZl9xdWV1ZV9zZXR1cChwaGJhKTsKKwkJaWYgKHJjKSB7CisJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCQkiMDU0OSBGYWlsZWQgc2V0dXAgb2YgRk9GIFF1ZXVlczogIgorCQkJCQkicmMgPSAweCV4XG4iLCByYyk7CisJCQlnb3RvIG91dF9kZXN0cm95X2Vsc19ycTsKKwkJfQorCX0KIAlyZXR1cm4gMDsKIAorb3V0X2Rlc3Ryb3lfZWxzX3JxOgorCWxwZmNfcnFfZGVzdHJveShwaGJhLCBwaGJhLT5zbGk0X2hiYS5oZHJfcnEsIHBoYmEtPnNsaTRfaGJhLmRhdF9ycSk7CiBvdXRfZGVzdHJveV9lbHNfd3E6CiAJbHBmY193cV9kZXN0cm95KHBoYmEsIHBoYmEtPnNsaTRfaGJhLmVsc193cSk7CiBvdXRfZGVzdHJveV9tYnhfd3E6CkBAIC03NTE4LDYgKzc1NjgsOSBAQAogewogCWludCBmY3BfcWlkeDsKIAorCS8qIFVuc2V0IHRoZSBxdWV1ZXMgY3JlYXRlZCBmb3IgRmxhc2ggT3B0aW1pemVkIEZhYnJpYyBvcGVyYXRpb25zICovCisJaWYgKHBoYmEtPmNmZ19mb2YpCisJCWxwZmNfZm9mX3F1ZXVlX2Rlc3Ryb3kocGhiYSk7CiAJLyogVW5zZXQgbWFpbGJveCBjb21tYW5kIHdvcmsgcXVldWUgKi8KIAlscGZjX21xX2Rlc3Ryb3kocGhiYSwgcGhiYS0+c2xpNF9oYmEubWJ4X3dxKTsKIAkvKiBVbnNldCBFTFMgd29yayBxdWV1ZSAqLwpAQCAtODYzNSw2ICs4Njg4LDEwIEBACiAKIAkvKiBDb25maWd1cmUgTVNJLVggY2FwYWJpbGl0eSBzdHJ1Y3R1cmUgKi8KIAl2ZWN0b3JzID0gcGhiYS0+Y2ZnX2ZjcF9pb19jaGFubmVsOworCWlmIChwaGJhLT5jZmdfZm9mKSB7CisJCXBoYmEtPnNsaTRfaGJhLm1zaXhfZW50cmllc1tpbmRleF0uZW50cnkgPSBpbmRleDsKKwkJdmVjdG9ycysrOworCX0KIGVuYWJsZV9tc2l4X3ZlY3RvcnM6CiAJcmMgPSBwY2lfZW5hYmxlX21zaXgocGhiYS0+cGNpZGV2LCBwaGJhLT5zbGk0X2hiYS5tc2l4X2VudHJpZXMsCiAJCQkgICAgIHZlY3RvcnMpOwpAQCAtODY2NCw3ICs4NzIxLDE1IEBACiAJCXBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGxbaW5kZXhdLmlkeCA9IGluZGV4OwogCQlwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsW2luZGV4XS5waGJhID0gcGhiYTsKIAkJYXRvbWljX3NldCgmcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbFtpbmRleF0uZmNwX2VxX2luX3VzZSwgMSk7Ci0JCXJjID0gcmVxdWVzdF9pcnEocGhiYS0+c2xpNF9oYmEubXNpeF9lbnRyaWVzW2luZGV4XS52ZWN0b3IsCisJCWlmIChwaGJhLT5jZmdfZm9mICYmIChpbmRleCA9PSAodmVjdG9ycyAtIDEpKSkKKwkJCXJjID0gcmVxdWVzdF9pcnEoCisJCQkJcGhiYS0+c2xpNF9oYmEubXNpeF9lbnRyaWVzW2luZGV4XS52ZWN0b3IsCisJCQkJICZscGZjX3NsaTRfZm9mX2ludHJfaGFuZGxlciwgSVJRRl9TSEFSRUQsCisJCQkJIChjaGFyICopJnBoYmEtPnNsaTRfaGJhLmhhbmRsZXJfbmFtZVtpbmRleF0sCisJCQkJICZwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsW2luZGV4XSk7CisJCWVsc2UKKwkJCXJjID0gcmVxdWVzdF9pcnEoCisJCQkJcGhiYS0+c2xpNF9oYmEubXNpeF9lbnRyaWVzW2luZGV4XS52ZWN0b3IsCiAJCQkJICZscGZjX3NsaTRfaGJhX2ludHJfaGFuZGxlciwgSVJRRl9TSEFSRUQsCiAJCQkJIChjaGFyICopJnBoYmEtPnNsaTRfaGJhLmhhbmRsZXJfbmFtZVtpbmRleF0sCiAJCQkJICZwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsW2luZGV4XSk7CkBAIC04Njc2LDYgKzg3NDEsOSBAQAogCQl9CiAJfQogCisJaWYgKHBoYmEtPmNmZ19mb2YpCisJCXZlY3RvcnMtLTsKKwogCWlmICh2ZWN0b3JzICE9IHBoYmEtPmNmZ19mY3BfaW9fY2hhbm5lbCkgewogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAogCQkJCSIzMjM4IFJlZHVjaW5nIElPIGNoYW5uZWxzIHRvIG1hdGNoIG51bWJlciBvZiAiCkBAIC04NzIxLDcgKzg3ODksMTAgQEAKIAkJZnJlZV9pcnEocGhiYS0+c2xpNF9oYmEubXNpeF9lbnRyaWVzW2luZGV4XS52ZWN0b3IsCiAJCQkgJnBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGxbaW5kZXhdKTsKIAl9Ci0KKwlpZiAocGhiYS0+Y2ZnX2ZvZikgeworCQlmcmVlX2lycShwaGJhLT5zbGk0X2hiYS5tc2l4X2VudHJpZXNbaW5kZXhdLnZlY3RvciwKKwkJCSAmcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbFtpbmRleF0pOworCX0KIAkvKiBEaXNhYmxlIE1TSS1YICovCiAJcGNpX2Rpc2FibGVfbXNpeChwaGJhLT5wY2lkZXYpOwogCkBAIC04NzcxLDYgKzg4NDIsMTAgQEAKIAkJcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbFtpbmRleF0ucGhiYSA9IHBoYmE7CiAJfQogCisJaWYgKHBoYmEtPmNmZ19mb2YpIHsKKwkJcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbFtpbmRleF0uaWR4ID0gaW5kZXg7CisJCXBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGxbaW5kZXhdLnBoYmEgPSBwaGJhOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtODg1Myw2ICs4OTI4LDEyIEBACiAJCQkJYXRvbWljX3NldCgmcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbFtpbmRleF0uCiAJCQkJCWZjcF9lcV9pbl91c2UsIDEpOwogCQkJfQorCQkJaWYgKHBoYmEtPmNmZ19mb2YpIHsKKwkJCQlwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsW2luZGV4XS5pZHggPSBpbmRleDsKKwkJCQlwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsW2luZGV4XS5waGJhID0gcGhiYTsKKwkJCQlhdG9taWNfc2V0KCZwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsW2luZGV4XS4KKwkJCQkJZmNwX2VxX2luX3VzZSwgMSk7CisJCQl9CiAJCX0KIAl9CiAJcmV0dXJuIGludHJfbW9kZTsKQEAgLTkxNjMsNiArOTI0NCw3IEBACiAJCXBoYmEtPnNsaTNfb3B0aW9ucyAmPSB+TFBGQ19TTEk0X1BIV1FfRU5BQkxFRDsKIAlzbGk0X3BhcmFtcy0+c2dlX3N1cHBfbGVuID0gbWJ4X3NsaTRfcGFyYW1ldGVycy0+c2dlX3N1cHBfbGVuOwogCXNsaTRfcGFyYW1zLT5sb29wYmtfc2NvcGUgPSBiZl9nZXQobG9vcGJrX3Njb3BlLCBtYnhfc2xpNF9wYXJhbWV0ZXJzKTsKKwlzbGk0X3BhcmFtcy0+b2FzX3N1cHBvcnRlZCA9IGJmX2dldChjZmdfb2FzLCBtYnhfc2xpNF9wYXJhbWV0ZXJzKTsKIAlzbGk0X3BhcmFtcy0+Y3F2ID0gYmZfZ2V0KGNmZ19jcXYsIG1ieF9zbGk0X3BhcmFtZXRlcnMpOwogCXNsaTRfcGFyYW1zLT5tcXYgPSBiZl9nZXQoY2ZnX21xdiwgbWJ4X3NsaTRfcGFyYW1ldGVycyk7CiAJc2xpNF9wYXJhbXMtPndxdiA9IGJmX2dldChjZmdfd3F2LCBtYnhfc2xpNF9wYXJhbWV0ZXJzKTsKQEAgLTEwNzk2LDYgKzEwODc4LDE2OSBAQAogCXJldHVybjsKIH0KIAorLyoqCisgKiBscGZjX3NsaTRfb2FzX3ZlcmlmeSAtIFZlcmlmeSBPQVMgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgYWRhcHRlcgorICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyByb3V0aW5lIGNoZWNrcyB0byBzZWUgaWYgT0FTIGlzIHN1cHBvcnRlZCBmb3IgdGhpcyBhZGFwdGVyLiBJZgorICogc3VwcG9ydGVkLCB0aGUgY29uZmlndXJlIEZsYXNoIE9wdGltaXplZCBGYWJyaWMgZmxhZyBpcyBzZXQuICBPdGhlcndpc2UsCisgKiB0aGUgZW5hYmxlIG9hcyBmbGFnIGlzIGNsZWFyZWQgYW5kIHRoZSBwb29sIGNyZWF0ZWQgZm9yIE9BUyBkZXZpY2UgZGF0YQorICogaXMgZGVzdHJveWVkLgorICoKKyAqKi8KK3ZvaWQKK2xwZmNfc2xpNF9vYXNfdmVyaWZ5KHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKK3sKKworCWlmICghcGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKQorCQlyZXR1cm47CisKKwlpZiAocGhiYS0+c2xpNF9oYmEucGNfc2xpNF9wYXJhbXMub2FzX3N1cHBvcnRlZCkgeworCQlwaGJhLT5jZmdfZm9mID0gMTsKKwl9IGVsc2UgeworCQlwaGJhLT5jZmdfRW5hYmxlWExhbmUgPSAwOworCQlpZiAocGhiYS0+ZGV2aWNlX2RhdGFfbWVtX3Bvb2wpCisJCQltZW1wb29sX2Rlc3Ryb3kocGhiYS0+ZGV2aWNlX2RhdGFfbWVtX3Bvb2wpOworCQlwaGJhLT5kZXZpY2VfZGF0YV9tZW1fcG9vbCA9IE5VTEw7CisJfQorCisJcmV0dXJuOworfQorCisvKioKKyAqIGxwZmNfZm9mX3F1ZXVlX3NldHVwIC0gU2V0IHVwIGFsbCB0aGUgZm9mIHF1ZXVlcworICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGludm9rZWQgdG8gc2V0IHVwIGFsbCB0aGUgZm9mIHF1ZXVlcyBmb3IgdGhlIEZDIEhCQQorICogb3BlcmF0aW9uLgorICoKKyAqIFJldHVybiBjb2RlcworICogICAgICAwIC0gc3VjY2Vzc2Z1bAorICogICAgICAtRU5PTUVNIC0gTm8gYXZhaWxhYmxlIG1lbW9yeQorICoqLworaW50CitscGZjX2ZvZl9xdWV1ZV9zZXR1cChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCit7CisJc3RydWN0IGxwZmNfc2xpICpwc2xpID0gJnBoYmEtPnNsaTsKKwlpbnQgcmM7CisKKwlyYyA9IGxwZmNfZXFfY3JlYXRlKHBoYmEsIHBoYmEtPnNsaTRfaGJhLmZvZl9lcSwgTFBGQ19NQVhfSU1BWCk7CisJaWYgKHJjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChwaGJhLT5jZmdfRW5hYmxlWExhbmUpIHsKKworCQlyYyA9IGxwZmNfY3FfY3JlYXRlKHBoYmEsIHBoYmEtPnNsaTRfaGJhLm9hc19jcSwKKwkJCQkgICAgcGhiYS0+c2xpNF9oYmEuZm9mX2VxLCBMUEZDX1dDUSwgTFBGQ19GQ1ApOworCQlpZiAocmMpCisJCQlnb3RvIG91dF9vYXNfY3E7CisKKwkJcmMgPSBscGZjX3dxX2NyZWF0ZShwaGJhLCBwaGJhLT5zbGk0X2hiYS5vYXNfd3EsCisJCQkJICAgIHBoYmEtPnNsaTRfaGJhLm9hc19jcSwgTFBGQ19GQ1ApOworCQlpZiAocmMpCisJCQlnb3RvIG91dF9vYXNfd3E7CisKKwkJcGhiYS0+c2xpNF9oYmEub2FzX2NxLT5wcmluZyA9ICZwc2xpLT5yaW5nW0xQRkNfRkNQX09BU19SSU5HXTsKKwkJcGhiYS0+c2xpNF9oYmEub2FzX3JpbmcgPSAmcHNsaS0+cmluZ1tMUEZDX0ZDUF9PQVNfUklOR107CisJfQorCisJcmV0dXJuIDA7CisKK291dF9vYXNfd3E6CisJaWYgKHBoYmEtPmNmZ19FbmFibGVYTGFuZSkKKwkJbHBmY19jcV9kZXN0cm95KHBoYmEsIHBoYmEtPnNsaTRfaGJhLm9hc19jcSk7CitvdXRfb2FzX2NxOgorCWxwZmNfZXFfZGVzdHJveShwaGJhLCBwaGJhLT5zbGk0X2hiYS5mb2ZfZXEpOworCXJldHVybiByYzsKKworfQorCisvKioKKyAqIGxwZmNfZm9mX3F1ZXVlX2NyZWF0ZSAtIENyZWF0ZSBhbGwgdGhlIGZvZiBxdWV1ZXMKKyAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBpbnZva2VkIHRvIGFsbG9jYXRlIGFsbCB0aGUgZm9mIHF1ZXVlcyBmb3IgdGhlIEZDIEhCQQorICogb3BlcmF0aW9uLiBGb3IgZWFjaCBTTEk0IHF1ZXVlIHR5cGUsIHRoZSBwYXJhbWV0ZXJzIHN1Y2ggYXMgcXVldWUgZW50cnkKKyAqIGNvdW50IChxdWV1ZSBkZXB0aCkgc2hhbGwgYmUgdGFrZW4gZnJvbSB0aGUgbW9kdWxlIHBhcmFtZXRlci4gRm9yIG5vdywKKyAqIHdlIGp1c3QgdXNlIHNvbWUgY29uc3RhbnQgbnVtYmVyIGFzIHBsYWNlIGhvbGRlci4KKyAqCisgKiBSZXR1cm4gY29kZXMKKyAqICAgICAgMCAtIHN1Y2Nlc3NmdWwKKyAqICAgICAgLUVOT01FTSAtIE5vIGF2YWlsYmxlIG1lbW9yeQorICogICAgICAtRUlPIC0gVGhlIG1haWxib3ggZmFpbGVkIHRvIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseS4KKyAqKi8KK2ludAorbHBmY19mb2ZfcXVldWVfY3JlYXRlKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgbHBmY19xdWV1ZSAqcWRlc2M7CisKKwkvKiBDcmVhdGUgRk9GIEVRICovCisJcWRlc2MgPSBscGZjX3NsaTRfcXVldWVfYWxsb2MocGhiYSwgcGhiYS0+c2xpNF9oYmEuZXFfZXNpemUsCisJCQkJICAgICAgcGhiYS0+c2xpNF9oYmEuZXFfZWNvdW50KTsKKwlpZiAoIXFkZXNjKQorCQlnb3RvIG91dF9lcnJvcjsKKworCXBoYmEtPnNsaTRfaGJhLmZvZl9lcSA9IHFkZXNjOworCisJaWYgKHBoYmEtPmNmZ19FbmFibGVYTGFuZSkgeworCisJCS8qIENyZWF0ZSBPQVMgQ1EgKi8KKwkJcWRlc2MgPSBscGZjX3NsaTRfcXVldWVfYWxsb2MocGhiYSwgcGhiYS0+c2xpNF9oYmEuY3FfZXNpemUsCisJCQkJCQkgICAgICBwaGJhLT5zbGk0X2hiYS5jcV9lY291bnQpOworCQlpZiAoIXFkZXNjKQorCQkJZ290byBvdXRfZXJyb3I7CisKKwkJcGhiYS0+c2xpNF9oYmEub2FzX2NxID0gcWRlc2M7CisKKwkJLyogQ3JlYXRlIE9BUyBXUSAqLworCQlxZGVzYyA9IGxwZmNfc2xpNF9xdWV1ZV9hbGxvYyhwaGJhLCBwaGJhLT5zbGk0X2hiYS53cV9lc2l6ZSwKKwkJCQkJICAgICAgcGhiYS0+c2xpNF9oYmEud3FfZWNvdW50KTsKKwkJaWYgKCFxZGVzYykKKwkJCWdvdG8gb3V0X2Vycm9yOworCisJCXBoYmEtPnNsaTRfaGJhLm9hc193cSA9IHFkZXNjOworCisJfQorCXJldHVybiAwOworCitvdXRfZXJyb3I6CisJbHBmY19mb2ZfcXVldWVfZGVzdHJveShwaGJhKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoqCisgKiBscGZjX2ZvZl9xdWV1ZV9kZXN0cm95IC0gRGVzdHJveSBhbGwgdGhlIGZvZiBxdWV1ZXMKKyAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBpbnZva2VkIHRvIHJlbGVhc2UgYWxsIHRoZSBTTEk0IHF1ZXVlcyB3aXRoIHRoZSBGQyBIQkEKKyAqIG9wZXJhdGlvbi4KKyAqCisgKiBSZXR1cm4gY29kZXMKKyAqICAgICAgMCAtIHN1Y2Nlc3NmdWwKKyAqKi8KK2ludAorbHBmY19mb2ZfcXVldWVfZGVzdHJveShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCit7CisJLyogUmVsZWFzZSBGT0YgRXZlbnQgcXVldWUgKi8KKwlpZiAocGhiYS0+c2xpNF9oYmEuZm9mX2VxICE9IE5VTEwpIHsKKwkJbHBmY19zbGk0X3F1ZXVlX2ZyZWUocGhiYS0+c2xpNF9oYmEuZm9mX2VxKTsKKwkJcGhiYS0+c2xpNF9oYmEuZm9mX2VxID0gTlVMTDsKKwl9CisKKwkvKiBSZWxlYXNlIE9BUyBDb21wbGV0aW9uIHF1ZXVlICovCisJaWYgKHBoYmEtPnNsaTRfaGJhLm9hc19jcSAhPSBOVUxMKSB7CisJCWxwZmNfc2xpNF9xdWV1ZV9mcmVlKHBoYmEtPnNsaTRfaGJhLm9hc19jcSk7CisJCXBoYmEtPnNsaTRfaGJhLm9hc19jcSA9IE5VTEw7CisJfQorCisJLyogUmVsZWFzZSBPQVMgV29yayBxdWV1ZSAqLworCWlmIChwaGJhLT5zbGk0X2hiYS5vYXNfd3EgIT0gTlVMTCkgeworCQlscGZjX3NsaTRfcXVldWVfZnJlZShwaGJhLT5zbGk0X2hiYS5vYXNfd3EpOworCQlwaGJhLT5zbGk0X2hiYS5vYXNfd3EgPSBOVUxMOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGxwZmNfaWRfdGFibGVbXSA9IHsKIAl7UENJX1ZFTkRPUl9JRF9FTVVMRVgsIFBDSV9ERVZJQ0VfSURfVklQRVIsCiAJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21lbS5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tZW0uYwppbmRleCA4MTJkMGNkLi5lZDQxOWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21lbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbWVtLmMKQEAgLTM4LDEwICszOCwyOSBAQAogI2luY2x1ZGUgImxwZmNfc2NzaS5oIgogI2luY2x1ZGUgImxwZmMuaCIKICNpbmNsdWRlICJscGZjX2NydG4uaCIKKyNpbmNsdWRlICJscGZjX2xvZ21zZy5oIgogCiAjZGVmaW5lIExQRkNfTUJVRl9QT09MX1NJWkUgICAgIDY0ICAgICAgLyogbWF4IGVsZW1lbnRzIGluIE1CVUYgc2FmZXR5IHBvb2wgKi8KICNkZWZpbmUgTFBGQ19NRU1fUE9PTF9TSVpFICAgICAgNjQgICAgICAvKiBtYXggZWxlbSBpbiBub24tRE1BIHNhZmV0eSBwb29sICovCisjZGVmaW5lIExQRkNfREVWSUNFX0RBVEFfUE9PTF9TSVpFIDY0ICAgLyogbWF4IGVsZW1lbnRzIGluIGRldmljZSBkYXRhIHBvb2wgKi8KIAoraW50CitscGZjX21lbV9hbGxvY19hY3RpdmVfcnJxX3Bvb2xfczQoc3RydWN0IGxwZmNfaGJhICpwaGJhKSB7CisJc2l6ZV90IGJ5dGVzOworCWludCBtYXhfeHJpID0gcGhiYS0+c2xpNF9oYmEubWF4X2NmZ19wYXJhbS5tYXhfeHJpOworCisJaWYgKG1heF94cmkgPD0gMCkKKwkJcmV0dXJuIC1FTk9NRU07CisJYnl0ZXMgPSAoKEJJVFNfUEVSX0xPTkcgLSAxICsgbWF4X3hyaSkgLyBCSVRTX1BFUl9MT05HKSAqCisJCSAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCXBoYmEtPmNmZ19ycnFfeHJpX2JpdG1hcF9zeiA9IGJ5dGVzOworCXBoYmEtPmFjdGl2ZV9ycnFfcG9vbCA9IG1lbXBvb2xfY3JlYXRlX2ttYWxsb2NfcG9vbChMUEZDX01FTV9QT09MX1NJWkUsCisJCQkJCQkJICAgIGJ5dGVzKTsKKwlpZiAoIXBoYmEtPmFjdGl2ZV9ycnFfcG9vbCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZWxzZQorCQlyZXR1cm4gMDsKK30KIAogLyoqCiAgKiBscGZjX21lbV9hbGxvYyAtIGNyZWF0ZSBhbmQgYWxsb2NhdGUgYWxsIFBDSSBhbmQgbWVtb3J5IHBvb2xzCkBAIC0xNDYsNiArMTY1LDE2IEBACiAJCXBoYmEtPmxwZmNfZHJiX3Bvb2wgPSBOVUxMOwogCX0KIAorCWlmIChwaGJhLT5jZmdfRW5hYmxlWExhbmUpIHsKKwkJcGhiYS0+ZGV2aWNlX2RhdGFfbWVtX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZV9rbWFsbG9jX3Bvb2woCisJCQkJCUxQRkNfREVWSUNFX0RBVEFfUE9PTF9TSVpFLAorCQkJCQlzaXplb2Yoc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEpKTsKKwkJaWYgKCFwaGJhLT5kZXZpY2VfZGF0YV9tZW1fcG9vbCkKKwkJCWdvdG8gZmFpbF9mcmVlX2hyYl9wb29sOworCX0gZWxzZSB7CisJCXBoYmEtPmRldmljZV9kYXRhX21lbV9wb29sID0gTlVMTDsKKwl9CisKIAlyZXR1cm4gMDsKICBmYWlsX2ZyZWVfaHJiX3Bvb2w6CiAJcGNpX3Bvb2xfZGVzdHJveShwaGJhLT5scGZjX2hyYl9wb29sKTsKQEAgLTE4OCw2ICsyMTcsNyBAQAogewogCWludCBpOwogCXN0cnVjdCBscGZjX2RtYV9wb29sICpwb29sID0gJnBoYmEtPmxwZmNfbWJ1Zl9zYWZldHlfcG9vbDsKKwlzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSAqZGV2aWNlX2RhdGE7CiAKIAkvKiBGcmVlIEhCUSBwb29scyAqLwogCWxwZmNfc2xpX2hicWJ1Zl9mcmVlX2FsbChwaGJhKTsKQEAgLTIwOSw2ICsyMzksMTAgQEAKIAkvKiBGcmVlIE5MUCBtZW1vcnkgcG9vbCAqLwogCW1lbXBvb2xfZGVzdHJveShwaGJhLT5ubHBfbWVtX3Bvb2wpOwogCXBoYmEtPm5scF9tZW1fcG9vbCA9IE5VTEw7CisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCAmJiBwaGJhLT5hY3RpdmVfcnJxX3Bvb2wpIHsKKwkJbWVtcG9vbF9kZXN0cm95KHBoYmEtPmFjdGl2ZV9ycnFfcG9vbCk7CisJCXBoYmEtPmFjdGl2ZV9ycnFfcG9vbCA9IE5VTEw7CisJfQogCiAJLyogRnJlZSBtYm94IG1lbW9yeSBwb29sICovCiAJbWVtcG9vbF9kZXN0cm95KHBoYmEtPm1ib3hfbWVtX3Bvb2wpOwpAQCAtMjI3LDYgKzI2MSwxOSBAQAogCXBjaV9wb29sX2Rlc3Ryb3kocGhiYS0+bHBmY19zY3NpX2RtYV9idWZfcG9vbCk7CiAJcGhiYS0+bHBmY19zY3NpX2RtYV9idWZfcG9vbCA9IE5VTEw7CiAKKwkvKiBGcmVlIERldmljZSBEYXRhIG1lbW9yeSBwb29sICovCisJaWYgKHBoYmEtPmRldmljZV9kYXRhX21lbV9wb29sKSB7CisJCS8qIEVuc3VyZSBhbGwgb2JqZWN0cyBoYXZlIGJlZW4gcmV0dXJuZWQgdG8gdGhlIHBvb2wgKi8KKwkJd2hpbGUgKCFsaXN0X2VtcHR5KCZwaGJhLT5sdW5zKSkgeworCQkJZGV2aWNlX2RhdGEgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwaGJhLT5sdW5zLAorCQkJCQkJICAgICAgIHN0cnVjdCBscGZjX2RldmljZV9kYXRhLAorCQkJCQkJICAgICAgIGxpc3RlbnRyeSk7CisJCQlsaXN0X2RlbCgmZGV2aWNlX2RhdGEtPmxpc3RlbnRyeSk7CisJCQltZW1wb29sX2ZyZWUoZGV2aWNlX2RhdGEsIHBoYmEtPmRldmljZV9kYXRhX21lbV9wb29sKTsKKwkJfQorCQltZW1wb29sX2Rlc3Ryb3kocGhiYS0+ZGV2aWNlX2RhdGFfbWVtX3Bvb2wpOworCX0KKwlwaGJhLT5kZXZpY2VfZGF0YV9tZW1fcG9vbCA9IE5VTEw7CiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX25wb3J0ZGlzYy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ucG9ydGRpc2MuYwppbmRleCBhYmMzNjEyLi5jMzQyZjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX25wb3J0ZGlzYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbnBvcnRkaXNjLmMKQEAgLTIwMyw4ICsyMDMsNiBAQAogaW50CiBscGZjX2Vsc19hYm9ydChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBscGZjX25vZGVsaXN0ICpuZGxwKQogewotCUxJU1RfSEVBRChjb21wbGV0aW9ucyk7Ci0JTElTVF9IRUFEKHR4Y21wbHFfY29tcGxldGlvbnMpOwogCUxJU1RfSEVBRChhYm9ydF9saXN0KTsKIAlzdHJ1Y3QgbHBmY19zbGkgICpwc2xpID0gJnBoYmEtPnNsaTsKIAlzdHJ1Y3QgbHBmY19zbGlfcmluZyAqcHJpbmcgPSAmcHNsaS0+cmluZ1tMUEZDX0VMU19SSU5HXTsKQEAgLTIxNiwzMiArMjE0LDI3IEBACiAJCQkgIkRhdGE6IHgleCB4JXggeCV4XG4iLAogCQkJIG5kbHAtPm5scF9ESUQsIG5kbHAtPm5scF9mbGFnLCBuZGxwLT5ubHBfc3RhdGUsCiAJCQkgbmRscC0+bmxwX3JwaSk7Ci0KKwkvKiBDbGVhbiB1cCBhbGwgZmFicmljIElPcyBmaXJzdC4qLwogCWxwZmNfZmFicmljX2Fib3J0X25wb3J0KG5kbHApOwogCi0JLyogRmlyc3QgY2hlY2sgdGhlIHR4cSAqLworCS8qCisJICogTG9jayB0aGUgRUxTIHJpbmcgdHhjbXBscSBmb3IgU0xJMy9TTEk0IGFuZCBidWlsZCBhIGxvY2FsIGxpc3QKKwkgKiBvZiBhbGwgRUxTIElPcyB0aGF0IG5lZWQgYW4gQUJUUy4gIFRoZSBJT3MgbmVlZCB0byBzdGF5IG9uIHRoZQorCSAqIHR4Y21wbHEgc28gdGhhdCB0aGUgYWJvcnQgb3BlcmF0aW9uIGNvbXBsZXRlcyB0aGVtIHN1Y2Nlc3NmdWxseS4KKwkgKi8KIAlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW9jYiwgbmV4dF9pb2NiLCAmcHJpbmctPnR4cSwgbGlzdCkgewotCQkvKiBDaGVjayB0byBzZWUgaWYgaW9jYiBtYXRjaGVzIHRoZSBucG9ydCB3ZSBhcmUgbG9va2luZyBmb3IgKi8KLQkJaWYgKGxwZmNfY2hlY2tfc2xpX25kbHAocGhiYSwgcHJpbmcsIGlvY2IsIG5kbHApKSB7Ci0JCQkvKiBJdCBtYXRjaGVzLCBzbyBkZXF1ZSBhbmQgY2FsbCBjb21wbCB3aXRoIGFucCBlcnJvciAqLwotCQkJbGlzdF9tb3ZlX3RhaWwoJmlvY2ItPmxpc3QsICZjb21wbGV0aW9ucyk7Ci0JCX0KLQl9Ci0KLQkvKiBOZXh0IGNoZWNrIHRoZSB0eGNtcGxxICovCi0JbGlzdF9zcGxpY2VfaW5pdCgmcHJpbmctPnR4Y21wbHEsICZ0eGNtcGxxX2NvbXBsZXRpb25zKTsKLQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlvY2IsIG5leHRfaW9jYiwgJnR4Y21wbHFfY29tcGxldGlvbnMsIGxpc3QpIHsKLQkJLyogQ2hlY2sgdG8gc2VlIGlmIGlvY2IgbWF0Y2hlcyB0aGUgbnBvcnQgd2UgYXJlIGxvb2tpbmcgZm9yICovCisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKKwkJc3Bpbl9sb2NrKCZwcmluZy0+cmluZ19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW9jYiwgbmV4dF9pb2NiLCAmcHJpbmctPnR4Y21wbHEsIGxpc3QpIHsKKwkvKiBBZGQgdG8gYWJvcnRfbGlzdCBvbiBvbiBORExQIG1hdGNoLiAqLwogCQlpZiAobHBmY19jaGVja19zbGlfbmRscChwaGJhLCBwcmluZywgaW9jYiwgbmRscCkpCiAJCQlsaXN0X2FkZF90YWlsKCZpb2NiLT5kbGlzdCwgJmFib3J0X2xpc3QpOwogCX0KLQlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQlsaXN0X3NwbGljZSgmdHhjbXBscV9jb21wbGV0aW9ucywgJnByaW5nLT50eGNtcGxxKTsKKwlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQorCQlzcGluX3VubG9jaygmcHJpbmctPnJpbmdfbG9jayk7CiAJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAorCS8qIEFib3J0IHRoZSB0YXJnZXRlZCBJT3MgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIGFib3J0IGxpc3QuICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlvY2IsIG5leHRfaW9jYiwgJmFib3J0X2xpc3QsIGRsaXN0KSB7CiAJCQlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAkJCWxpc3RfZGVsX2luaXQoJmlvY2ItPmRsaXN0KTsKQEAgLTI0OSw5ICsyNDIsMjggQEAKIAkJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJfQogCisJSU5JVF9MSVNUX0hFQUQoJmFib3J0X2xpc3QpOworCisJLyogTm93IHByb2Nlc3MgdGhlIHR4cSAqLworCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCXNwaW5fbG9jaygmcHJpbmctPnJpbmdfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW9jYiwgbmV4dF9pb2NiLCAmcHJpbmctPnR4cSwgbGlzdCkgeworCQkvKiBDaGVjayB0byBzZWUgaWYgaW9jYiBtYXRjaGVzIHRoZSBucG9ydCB3ZSBhcmUgbG9va2luZyBmb3IgKi8KKwkJaWYgKGxwZmNfY2hlY2tfc2xpX25kbHAocGhiYSwgcHJpbmcsIGlvY2IsIG5kbHApKSB7CisJCQlsaXN0X2RlbF9pbml0KCZpb2NiLT5saXN0KTsKKwkJCWxpc3RfYWRkX3RhaWwoJmlvY2ItPmxpc3QsICZhYm9ydF9saXN0KTsKKwkJfQorCX0KKworCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCXNwaW5fdW5sb2NrKCZwcmluZy0+cmluZ19sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCiAJLyogQ2FuY2VsIGFsbCB0aGUgSU9DQnMgZnJvbSB0aGUgY29tcGxldGlvbnMgbGlzdCAqLwotCWxwZmNfc2xpX2NhbmNlbF9pb2NicyhwaGJhLCAmY29tcGxldGlvbnMsIElPU1RBVF9MT0NBTF9SRUpFQ1QsCi0JCQkgICAgICBJT0VSUl9TTElfQUJPUlRFRCk7CisJbHBmY19zbGlfY2FuY2VsX2lvY2JzKHBoYmEsICZhYm9ydF9saXN0LAorCQkJICAgICAgSU9TVEFUX0xPQ0FMX1JFSkVDVCwgSU9FUlJfU0xJX0FCT1JURUQpOwogCiAJbHBmY19jYW5jZWxfcmV0cnlfZGVsYXlfdG1vKHBoYmEtPnBwb3J0LCBuZGxwKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMKaW5kZXggYjJlZGUwNS4uNDYyNDUzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMKQEAgLTY4LDYgKzY4LDE3IEBACiAJX19iZTMyIHJlZl90YWc7ICAgICAgICAgLyogVGFyZ2V0IExCQSBvciBpbmRpcmVjdCBMQkEgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgbHBmY19ycG9ydF9kYXRhICoKK2xwZmNfcnBvcnRfZGF0YV9mcm9tX3Njc2lfZGV2aWNlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQgPSAoc3RydWN0IGxwZmNfdnBvcnQgKilzZGV2LT5ob3N0LT5ob3N0ZGF0YTsKKworCWlmICh2cG9ydC0+cGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKQorCQlyZXR1cm4gKChzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSAqKXNkZXYtPmhvc3RkYXRhKS0+cnBvcnRfZGF0YTsKKwllbHNlCisJCXJldHVybiAoc3RydWN0IGxwZmNfcnBvcnRfZGF0YSAqKXNkZXYtPmhvc3RkYXRhOworfQorCiBzdGF0aWMgdm9pZAogbHBmY19yZWxlYXNlX3Njc2lfYnVmX3M0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IGxwZmNfc2NzaV9idWYgKnBzYik7CiBzdGF0aWMgdm9pZApAQCAtMzA0LDkgKzMxNSwyNyBAQAogCXVuc2lnbmVkIGxvbmcgbmV3X3F1ZXVlX2RlcHRoLCBvbGRfcXVldWVfZGVwdGg7CiAKIAlvbGRfcXVldWVfZGVwdGggPSBzZGV2LT5xdWV1ZV9kZXB0aDsKLQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBzY3NpX2dldF90YWdfdHlwZShzZGV2KSwgcWRlcHRoKTsKKworCXN3aXRjaCAocmVhc29uKSB7CisJY2FzZSBTQ1NJX1FERVBUSF9ERUZBVUxUOgorCQkvKiBjaGFuZ2UgcmVxdWVzdCBmcm9tIHN5c2ZzLCBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFNDU0lfUURFUFRIX1JBTVBfVVA6CisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIHNjc2lfZ2V0X3RhZ190eXBlKHNkZXYpLCBxZGVwdGgpOworCQlicmVhazsKKwljYXNlIFNDU0lfUURFUFRIX1FGVUxMOgorCQlpZiAoc2NzaV90cmFja19xdWV1ZV9mdWxsKHNkZXYsIHFkZXB0aCkgPT0gMCkKKwkJCXJldHVybiBzZGV2LT5xdWV1ZV9kZXB0aDsKKworCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19GQ1AsCisJCQkJICIwNzExIGRldGVjdGVkIHF1ZXVlIGZ1bGwgLSBsdW4gcXVldWUgIgorCQkJCSAiZGVwdGggYWRqdXN0ZWQgdG8gJWQuXG4iLCBzZGV2LT5xdWV1ZV9kZXB0aCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKIAluZXdfcXVldWVfZGVwdGggPSBzZGV2LT5xdWV1ZV9kZXB0aDsKLQlyZGF0YSA9IHNkZXYtPmhvc3RkYXRhOworCXJkYXRhID0gbHBmY19ycG9ydF9kYXRhX2Zyb21fc2NzaV9kZXZpY2Uoc2Rldik7CiAJaWYgKHJkYXRhKQogCQlscGZjX3NlbmRfc2Rldl9xdWV1ZWRlcHRoX2NoYW5nZV9ldmVudChwaGJhLCB2cG9ydCwKIAkJCQkJCSAgICAgICByZGF0YS0+cG5vZGUsIHNkZXYtPmx1biwKQEAgLTM3Nyw1MCArNDA2LDYgQEAKIH0KIAogLyoqCi0gKiBscGZjX3JhbXB1cF9xdWV1ZV9kZXB0aCAtIFBvc3QgUkFNUF9VUF9RVUVVRSBldmVudCBmb3Igd29ya2VyIHRocmVhZAotICogQHBoYmE6IFRoZSBIYmEgZm9yIHdoaWNoIHRoaXMgY2FsbCBpcyBiZWluZyBleGVjdXRlZC4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgcG9zdCBXT1JLRVJfUkFNUF9VUF9RVUVVRSBldmVudCBmb3IgQHBoYmEgdnBvcnQuIFRoaXMgcm91dGluZQotICogcG9zdCBhdCBtb3N0IDEgZXZlbnQgZXZlcnkgNSBtaW51dGUgYWZ0ZXIgbGFzdF9yYW1wX3VwX3RpbWUgb3IKLSAqIGxhc3RfcnNyY19lcnJvcl90aW1lLiAgVGhpcyByb3V0aW5lIHdha2VzIHVwIHdvcmtlciB0aHJlYWQgb2YgQHBoYmEKLSAqIHRvIHByb2Nlc3MgV09SS0VSX1JBTV9ET1dOX0VWRU5UIGV2ZW50LgotICoKLSAqIFRoaXMgcm91dGluZSBzaG91bGQgYmUgY2FsbGVkIHdpdGggbm8gbG9jayBoZWxkLgotICoqLwotc3RhdGljIGlubGluZSB2b2lkCi1scGZjX3JhbXB1cF9xdWV1ZV9kZXB0aChzdHJ1Y3QgbHBmY192cG9ydCAgKnZwb3J0LAotCQkJdWludDMyX3QgcXVldWVfZGVwdGgpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSB2cG9ydC0+cGhiYTsKLQl1aW50MzJfdCBldnRfcG9zdGVkOwotCWF0b21pY19pbmMoJnBoYmEtPm51bV9jbWRfc3VjY2Vzcyk7Ci0KLQlpZiAodnBvcnQtPmNmZ19sdW5fcXVldWVfZGVwdGggPD0gcXVldWVfZGVwdGgpCi0JCXJldHVybjsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aGJhbG9jaywgZmxhZ3MpOwotCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLAotCQkJcGhiYS0+bGFzdF9yYW1wX3VwX3RpbWUgKyBRVUVVRV9SQU1QX1VQX0lOVEVSVkFMKSB8fAotCSAgICB0aW1lX2JlZm9yZShqaWZmaWVzLAotCQkJcGhiYS0+bGFzdF9yc3JjX2Vycm9yX3RpbWUgKyBRVUVVRV9SQU1QX1VQX0lOVEVSVkFMKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0JcGhiYS0+bGFzdF9yYW1wX3VwX3RpbWUgPSBqaWZmaWVzOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGZsYWdzKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5wcG9ydC0+d29ya19wb3J0X2xvY2ssIGZsYWdzKTsKLQlldnRfcG9zdGVkID0gcGhiYS0+cHBvcnQtPndvcmtfcG9ydF9ldmVudHMgJiBXT1JLRVJfUkFNUF9VUF9RVUVVRTsKLQlpZiAoIWV2dF9wb3N0ZWQpCi0JCXBoYmEtPnBwb3J0LT53b3JrX3BvcnRfZXZlbnRzIHw9IFdPUktFUl9SQU1QX1VQX1FVRVVFOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPnBwb3J0LT53b3JrX3BvcnRfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFldnRfcG9zdGVkKQotCQlscGZjX3dvcmtlcl93YWtlX3VwKHBoYmEpOwotCXJldHVybjsKLX0KLQotLyoqCiAgKiBscGZjX3JhbXBfZG93bl9xdWV1ZV9oYW5kbGVyIC0gV09SS0VSX1JBTVBfRE9XTl9RVUVVRSBldmVudCBoYW5kbGVyCiAgKiBAcGhiYTogVGhlIEhiYSBmb3Igd2hpY2ggdGhpcyBjYWxsIGlzIGJlaW5nIGV4ZWN1dGVkLgogICoKQEAgLTQ3Miw0MSArNDU3LDYgQEAKIH0KIAogLyoqCi0gKiBscGZjX3JhbXBfdXBfcXVldWVfaGFuZGxlciAtIFdPUktFUl9SQU1QX1VQX1FVRVVFIGV2ZW50IGhhbmRsZXIKLSAqIEBwaGJhOiBUaGUgSGJhIGZvciB3aGljaCB0aGlzIGNhbGwgaXMgYmVpbmcgZXhlY3V0ZWQuCi0gKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byAgcHJvY2VzcyBXT1JLRVJfUkFNUF9VUF9RVUVVRSBldmVudCBmb3Igd29ya2VyCi0gKiB0aHJlYWQuVGhpcyByb3V0aW5lIGluY3JlYXNlcyBxdWV1ZSBkZXB0aCBmb3IgYWxsIHNjc2kgZGV2aWNlIG9uIGVhY2ggdnBvcnQKLSAqIGFzc29jaWF0ZWQgd2l0aCBAcGhiYSBieSAxLiBUaGlzIHJvdXRpbmUgYWxzbyBzZXRzIEBwaGJhIG51bV9yc3JjX2VyciBhbmQKLSAqIG51bV9jbWRfc3VjY2VzcyB0byB6ZXJvLgotICoqLwotdm9pZAotbHBmY19yYW1wX3VwX3F1ZXVlX2hhbmRsZXIoc3RydWN0IGxwZmNfaGJhICpwaGJhKQotewotCXN0cnVjdCBscGZjX3Zwb3J0ICoqdnBvcnRzOwotCXN0cnVjdCBTY3NpX0hvc3QgICpzaG9zdDsKLQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7Ci0JaW50IGk7Ci0KLQl2cG9ydHMgPSBscGZjX2NyZWF0ZV92cG9ydF93b3JrX2FycmF5KHBoYmEpOwotCWlmICh2cG9ydHMgIT0gTlVMTCkKLQkJZm9yIChpID0gMDsgaSA8PSBwaGJhLT5tYXhfdnBvcnRzICYmIHZwb3J0c1tpXSAhPSBOVUxMOyBpKyspIHsKLQkJCXNob3N0ID0gbHBmY19zaG9zdF9mcm9tX3Zwb3J0KHZwb3J0c1tpXSk7Ci0JCQlzaG9zdF9mb3JfZWFjaF9kZXZpY2Uoc2Rldiwgc2hvc3QpIHsKLQkJCQlpZiAodnBvcnRzW2ldLT5jZmdfbHVuX3F1ZXVlX2RlcHRoIDw9Ci0JCQkJICAgIHNkZXYtPnF1ZXVlX2RlcHRoKQotCQkJCQljb250aW51ZTsKLQkJCQlscGZjX2NoYW5nZV9xdWV1ZV9kZXB0aChzZGV2LAotCQkJCQkJCXNkZXYtPnF1ZXVlX2RlcHRoKzEsCi0JCQkJCQkJU0NTSV9RREVQVEhfUkFNUF9VUCk7Ci0JCQl9Ci0JCX0KLQlscGZjX2Rlc3Ryb3lfdnBvcnRfd29ya19hcnJheShwaGJhLCB2cG9ydHMpOwotCWF0b21pY19zZXQoJnBoYmEtPm51bV9yc3JjX2VyciwgMCk7Ci0JYXRvbWljX3NldCgmcGhiYS0+bnVtX2NtZF9zdWNjZXNzLCAwKTsKLX0KLQotLyoqCiAgKiBscGZjX3Njc2lfZGV2X2Jsb2NrIC0gc2V0IGFsbCBzY3NpIGhvc3RzIHRvIGJsb2NrIHN0YXRlCiAgKiBAcGhiYTogUG9pbnRlciB0byBIQkEgY29udGV4dCBvYmplY3QuCiAgKgpAQCAtMTUwMiw3ICsxNDUyLDcgQEAKIAl9CiAKIAkvKiBOZXh0IGNoZWNrIGlmIHdlIG5lZWQgdG8gbWF0Y2ggdGhlIHJlbW90ZSBOUG9ydElEIG9yIFdXUE4gKi8KLQlyZGF0YSA9IHNjLT5kZXZpY2UtPmhvc3RkYXRhOworCXJkYXRhID0gbHBmY19ycG9ydF9kYXRhX2Zyb21fc2NzaV9kZXZpY2Uoc2MtPmRldmljZSk7CiAJaWYgKHJkYXRhICYmIHJkYXRhLT5wbm9kZSkgewogCQluZGxwID0gcmRhdGEtPnBub2RlOwogCkBAIC0zNTA3LDYgKzM0NTcsMTQgQEAKIAkgKiB3ZSBuZWVkIHRvIHNldCB3b3JkIDQgb2YgSU9DQiBoZXJlCiAJICovCiAJaW9jYl9jbWQtPnVuLmZjcGkuZmNwaV9wYXJtID0gc2NzaV9idWZmbGVuKHNjc2lfY21uZCk7CisKKwkvKgorCSAqIElmIHRoZSBPQVMgZHJpdmVyIGZlYXR1cmUgaXMgZW5hYmxlZCBhbmQgdGhlIGx1biBpcyBlbmFibGVkIGZvcgorCSAqIE9BUywgc2V0IHRoZSBvYXMgaW9jYiByZWxhdGVkIGZsYWdzLgorCSAqLworCWlmICgocGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKSAmJiAoKHN0cnVjdCBscGZjX2RldmljZV9kYXRhICopCisJCXNjc2lfY21uZC0+ZGV2aWNlLT5ob3N0ZGF0YSktPm9hc19lbmFibGVkKQorCQlscGZjX2NtZC0+Y3VyX2lvY2JxLmlvY2JfZmxhZyB8PSBMUEZDX0lPX09BUzsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDAyMSw3ICszOTc5LDYgQEAKIAlzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqcG5vZGUgPSByZGF0YS0+cG5vZGU7CiAJc3RydWN0IHNjc2lfY21uZCAqY21kOwogCWludCByZXN1bHQ7Ci0Jc3RydWN0IHNjc2lfZGV2aWNlICp0bXBfc2RldjsKIAlpbnQgZGVwdGg7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbHBmY19mYXN0X3BhdGhfZXZlbnQgKmZhc3RfcGF0aF9ldnQ7CkBAIC00MjY2LDMyICs0MjIzLDYgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmICghcmVzdWx0KQotCQlscGZjX3JhbXB1cF9xdWV1ZV9kZXB0aCh2cG9ydCwgcXVldWVfZGVwdGgpOwotCi0JLyoKLQkgKiBDaGVjayBmb3IgcXVldWUgZnVsbC4gIElmIHRoZSBsdW4gaXMgcmVwb3J0aW5nIHF1ZXVlIGZ1bGwsIHRoZW4KLQkgKiBiYWNrIG9mZiB0aGUgbHVuIHF1ZXVlIGRlcHRoIHRvIHByZXZlbnQgdGFyZ2V0IG92ZXJsb2Fkcy4KLQkgKi8KLQlpZiAocmVzdWx0ID09IFNBTV9TVEFUX1RBU0tfU0VUX0ZVTEwgJiYgcG5vZGUgJiYKLQkgICAgTkxQX0NIS19OT0RFX0FDVChwbm9kZSkpIHsKLQkJc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHRtcF9zZGV2LCBzaG9zdCkgewotCQkJaWYgKHRtcF9zZGV2LT5pZCAhPSBzY3NpX2lkKQotCQkJCWNvbnRpbnVlOwotCQkJZGVwdGggPSBzY3NpX3RyYWNrX3F1ZXVlX2Z1bGwodG1wX3NkZXYsCi0JCQkJCQkgICAgICB0bXBfc2Rldi0+cXVldWVfZGVwdGgtMSk7Ci0JCQlpZiAoZGVwdGggPD0gMCkKLQkJCQljb250aW51ZTsKLQkJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fV0FSTklORywgTE9HX0ZDUCwKLQkJCQkJICIwNzExIGRldGVjdGVkIHF1ZXVlIGZ1bGwgLSBsdW4gcXVldWUgIgotCQkJCQkgImRlcHRoIGFkanVzdGVkIHRvICVkLlxuIiwgZGVwdGgpOwotCQkJbHBmY19zZW5kX3NkZXZfcXVldWVkZXB0aF9jaGFuZ2VfZXZlbnQocGhiYSwgdnBvcnQsCi0JCQkJCQkJICAgICAgIHBub2RlLAotCQkJCQkJCSAgICAgICB0bXBfc2Rldi0+bHVuLAotCQkJCQkJCSAgICAgICBkZXB0aCsxLCBkZXB0aCk7Ci0JCX0KLQl9Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aGJhbG9jaywgZmxhZ3MpOwogCWxwZmNfY21kLT5wQ21kID0gTlVMTDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBmbGFncyk7CkBAIC00NDkyLDYgKzQ0MjMsOCBAQAogCX0KIAlwaW9jYi0+dWxwRkNQMlJjdnkgPSAobmRscC0+bmxwX2ZjcF9pbmZvICYgTkxQX0ZDUF8yX0RFVklDRSkgPyAxIDogMDsKIAlwaW9jYi0+dWxwQ2xhc3MgPSAobmRscC0+bmxwX2ZjcF9pbmZvICYgMHgwZik7CisJcGlvY2ItPnVscFBVID0gMDsKKwlwaW9jYi0+dW4uZmNwaS5mY3BpX3Bhcm0gPSAwOwogCiAJLyogdWxwVGltZW91dCBpcyBvbmx5IG9uZSBieXRlICovCiAJaWYgKGxwZmNfY21kLT50aW1lb3V0ID4gMHhmZikgewpAQCAtNDY5MSwxMiArNDYyNCwxMyBAQAogewogCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IChzdHJ1Y3QgbHBmY192cG9ydCAqKSBzaG9zdC0+aG9zdGRhdGE7CiAJc3RydWN0IGxwZmNfaGJhICAgKnBoYmEgPSB2cG9ydC0+cGhiYTsKLQlzdHJ1Y3QgbHBmY19ycG9ydF9kYXRhICpyZGF0YSA9IGNtbmQtPmRldmljZS0+aG9zdGRhdGE7CisJc3RydWN0IGxwZmNfcnBvcnRfZGF0YSAqcmRhdGE7CiAJc3RydWN0IGxwZmNfbm9kZWxpc3QgKm5kbHA7CiAJc3RydWN0IGxwZmNfc2NzaV9idWYgKmxwZmNfY21kOwogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSBzdGFyZ2V0X3RvX3Jwb3J0KHNjc2lfdGFyZ2V0KGNtbmQtPmRldmljZSkpOwogCWludCBlcnI7CiAKKwlyZGF0YSA9IGxwZmNfcnBvcnRfZGF0YV9mcm9tX3Njc2lfZGV2aWNlKGNtbmQtPmRldmljZSk7CiAJZXJyID0gZmNfcmVtb3RlX3BvcnRfY2hrcmVhZHkocnBvcnQpOwogCWlmIChlcnIpIHsKIAkJY21uZC0+cmVzdWx0ID0gZXJyOwpAQCAtNDc4Miw2ICs0NzE2LDI0IEBACiAJCQkJICAmbHBmY19jbWQtPmN1cl9pb2NicSwgU0xJX0lPQ0JfUkVUX0lPQ0IpOwogCWlmIChlcnIpIHsKIAkJYXRvbWljX2RlYygmbmRscC0+Y21kX3BlbmRpbmcpOworCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0lORk8sIExPR19GQ1AsCisJCQkJICIzMzc2IEZDUCBjb3VsZCBub3QgaXNzdWUgSU9DQiBlcnIgJXgiCisJCQkJICJGQ1AgY21kIHgleCA8JWQvJWQ+ICIKKwkJCQkgInNpZDogeCV4IGRpZDogeCV4IG94aWQ6IHgleCAiCisJCQkJICJEYXRhOiB4JXggeCV4IHgleCB4JXhcbiIsCisJCQkJIGVyciwgY21uZC0+Y21uZFswXSwKKwkJCQkgY21uZC0+ZGV2aWNlID8gY21uZC0+ZGV2aWNlLT5pZCA6IDB4ZmZmZiwKKwkJCQkgY21uZC0+ZGV2aWNlID8gY21uZC0+ZGV2aWNlLT5sdW4gOiAweGZmZmYsCisJCQkJIHZwb3J0LT5mY19teURJRCwgbmRscC0+bmxwX0RJRCwKKwkJCQkgcGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0ID8KKwkJCQkgbHBmY19jbWQtPmN1cl9pb2NicS5zbGk0X3hyaXRhZyA6IDB4ZmZmZiwKKwkJCQkgbHBmY19jbWQtPmN1cl9pb2NicS5pb2NiLnVscENvbnRleHQsCisJCQkJIGxwZmNfY21kLT5jdXJfaW9jYnEuaW9jYi51bHBJb1RhZywKKwkJCQkgbHBmY19jbWQtPmN1cl9pb2NicS5pb2NiLnVscFRpbWVvdXQsCisJCQkJICh1aW50MzJfdCkKKwkJCQkgKGNtbmQtPnJlcXVlc3QtPnRpbWVvdXQgLyAxMDAwKSk7CisKKwogCQlnb3RvIG91dF9ob3N0X2J1c3lfZnJlZV9idWY7CiAJfQogCWlmIChwaGJhLT5jZmdfcG9sbCAmIEVOQUJMRV9GQ1BfUklOR19QT0xMSU5HKSB7CkBAIC01MTYxLDEwICs1MTEzLDExIEBACiBzdGF0aWMgaW50CiBscGZjX2Noa190Z3RfbWFwcGVkKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCwgc3RydWN0IHNjc2lfY21uZCAqY21uZCkKIHsKLQlzdHJ1Y3QgbHBmY19ycG9ydF9kYXRhICpyZGF0YSA9IGNtbmQtPmRldmljZS0+aG9zdGRhdGE7CisJc3RydWN0IGxwZmNfcnBvcnRfZGF0YSAqcmRhdGE7CiAJc3RydWN0IGxwZmNfbm9kZWxpc3QgKnBub2RlOwogCXVuc2lnbmVkIGxvbmcgbGF0ZXI7CiAKKwlyZGF0YSA9IGxwZmNfcnBvcnRfZGF0YV9mcm9tX3Njc2lfZGV2aWNlKGNtbmQtPmRldmljZSk7CiAJaWYgKCFyZGF0YSkgewogCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0lORk8sIExPR19GQ1AsCiAJCQkiMDc5NyBUZ3QgTWFwIHJwb3J0IGZhaWx1cmU6IHJkYXRhIHglcFxuIiwgcmRhdGEpOwpAQCAtNTE4Miw3ICs1MTM1LDcgQEAKIAkJaWYgKHBub2RlLT5ubHBfc3RhdGUgPT0gTkxQX1NURV9NQVBQRURfTk9ERSkKIAkJCXJldHVybiBTVUNDRVNTOwogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShtc2Vjc190b19qaWZmaWVzKDUwMCkpOwotCQlyZGF0YSA9IGNtbmQtPmRldmljZS0+aG9zdGRhdGE7CisJCXJkYXRhID0gbHBmY19ycG9ydF9kYXRhX2Zyb21fc2NzaV9kZXZpY2UoY21uZC0+ZGV2aWNlKTsKIAkJaWYgKCFyZGF0YSkKIAkJCXJldHVybiBGQUlMRUQ7CiAJCXBub2RlID0gcmRhdGEtPnBub2RlOwpAQCAtNTI1NCwxMyArNTIwNywxNCBAQAogewogCXN0cnVjdCBTY3NpX0hvc3QgICpzaG9zdCA9IGNtbmQtPmRldmljZS0+aG9zdDsKIAlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQgPSAoc3RydWN0IGxwZmNfdnBvcnQgKikgc2hvc3QtPmhvc3RkYXRhOwotCXN0cnVjdCBscGZjX3Jwb3J0X2RhdGEgKnJkYXRhID0gY21uZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgbHBmY19ycG9ydF9kYXRhICpyZGF0YTsKIAlzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqcG5vZGU7CiAJdW5zaWduZWQgdGd0X2lkID0gY21uZC0+ZGV2aWNlLT5pZDsKIAl1bnNpZ25lZCBpbnQgbHVuX2lkID0gY21uZC0+ZGV2aWNlLT5sdW47CiAJc3RydWN0IGxwZmNfc2NzaV9ldmVudF9oZWFkZXIgc2NzaV9ldmVudDsKIAlpbnQgc3RhdHVzOwogCisJcmRhdGEgPSBscGZjX3Jwb3J0X2RhdGFfZnJvbV9zY3NpX2RldmljZShjbW5kLT5kZXZpY2UpOwogCWlmICghcmRhdGEpIHsKIAkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19GQ1AsCiAJCQkiMDc5OCBEZXZpY2UgUmVzZXQgcnBvcnQgZmFpbHVyZTogcmRhdGEgeCVwXG4iLCByZGF0YSk7CkBAIC01MzIzLDEzICs1Mjc3LDE0IEBACiB7CiAJc3RydWN0IFNjc2lfSG9zdCAgKnNob3N0ID0gY21uZC0+ZGV2aWNlLT5ob3N0OwogCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IChzdHJ1Y3QgbHBmY192cG9ydCAqKSBzaG9zdC0+aG9zdGRhdGE7Ci0Jc3RydWN0IGxwZmNfcnBvcnRfZGF0YSAqcmRhdGEgPSBjbW5kLT5kZXZpY2UtPmhvc3RkYXRhOworCXN0cnVjdCBscGZjX3Jwb3J0X2RhdGEgKnJkYXRhOwogCXN0cnVjdCBscGZjX25vZGVsaXN0ICpwbm9kZTsKIAl1bnNpZ25lZCB0Z3RfaWQgPSBjbW5kLT5kZXZpY2UtPmlkOwogCXVuc2lnbmVkIGludCBsdW5faWQgPSBjbW5kLT5kZXZpY2UtPmx1bjsKIAlzdHJ1Y3QgbHBmY19zY3NpX2V2ZW50X2hlYWRlciBzY3NpX2V2ZW50OwogCWludCBzdGF0dXM7CiAKKwlyZGF0YSA9IGxwZmNfcnBvcnRfZGF0YV9mcm9tX3Njc2lfZGV2aWNlKGNtbmQtPmRldmljZSk7CiAJaWYgKCFyZGF0YSkgewogCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0ZDUCwKIAkJCSIwNzk5IFRhcmdldCBSZXNldCBycG9ydCBmYWlsdXJlOiByZGF0YSB4JXBcbiIsIHJkYXRhKTsKQEAgLTU1MjksMTEgKzU0ODQsNDUgQEAKIAl1aW50MzJfdCBudW1fdG9fYWxsb2MgPSAwOwogCWludCBudW1fYWxsb2NhdGVkID0gMDsKIAl1aW50MzJfdCBzZGV2X2NudDsKKwlzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSAqZGV2aWNlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbHBmY19uYW1lIHRhcmdldF93d3BuOwogCiAJaWYgKCFycG9ydCB8fCBmY19yZW1vdGVfcG9ydF9jaGtyZWFkeShycG9ydCkpCiAJCXJldHVybiAtRU5YSU87CiAKLQlzZGV2LT5ob3N0ZGF0YSA9IHJwb3J0LT5kZF9kYXRhOworCWlmIChwaGJhLT5jZmdfRW5hYmxlWExhbmUpIHsKKworCQkvKgorCQkgKiBDaGVjayB0byBzZWUgaWYgdGhlIGRldmljZSBkYXRhIHN0cnVjdHVyZSBmb3IgdGhlIGx1bgorCQkgKiBleGlzdHMuICBJZiBub3QsIGNyZWF0ZSBvbmUuCisJCSAqLworCisJCXU2NF90b193d24ocnBvcnQtPnBvcnRfbmFtZSwgdGFyZ2V0X3d3cG4udS53d24pOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+ZGV2aWNlbG9jaywgZmxhZ3MpOworCQlkZXZpY2VfZGF0YSA9IF9fbHBmY19nZXRfZGV2aWNlX2RhdGEocGhiYSwKKwkJCQkJCSAgICAgJnBoYmEtPmx1bnMsCisJCQkJCQkgICAgICZ2cG9ydC0+ZmNfcG9ydG5hbWUsCisJCQkJCQkgICAgICZ0YXJnZXRfd3dwbiwKKwkJCQkJCSAgICAgc2Rldi0+bHVuKTsKKwkJaWYgKCFkZXZpY2VfZGF0YSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+ZGV2aWNlbG9jaywgZmxhZ3MpOworCQkJZGV2aWNlX2RhdGEgPSBscGZjX2NyZWF0ZV9kZXZpY2VfZGF0YShwaGJhLAorCQkJCQkJCSZ2cG9ydC0+ZmNfcG9ydG5hbWUsCisJCQkJCQkJJnRhcmdldF93d3BuLAorCQkJCQkJCXNkZXYtPmx1biwgdHJ1ZSk7CisJCQlpZiAoIWRldmljZV9kYXRhKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmRldmljZWxvY2ssIGZsYWdzKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmRldmljZV9kYXRhLT5saXN0ZW50cnksICZwaGJhLT5sdW5zKTsKKwkJfQorCQlkZXZpY2VfZGF0YS0+cnBvcnRfZGF0YSA9IHJwb3J0LT5kZF9kYXRhOworCQlkZXZpY2VfZGF0YS0+YXZhaWxhYmxlID0gdHJ1ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+ZGV2aWNlbG9jaywgZmxhZ3MpOworCQlzZGV2LT5ob3N0ZGF0YSA9IGRldmljZV9kYXRhOworCX0gZWxzZSB7CisJCXNkZXYtPmhvc3RkYXRhID0gcnBvcnQtPmRkX2RhdGE7CisJfQogCXNkZXZfY250ID0gYXRvbWljX2luY19yZXR1cm4oJnBoYmEtPnNkZXZfY250KTsKIAogCS8qCkBAIC01NjIzLDExICs1NjEyLDM0NCBAQAogewogCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IChzdHJ1Y3QgbHBmY192cG9ydCAqKSBzZGV2LT5ob3N0LT5ob3N0ZGF0YTsKIAlzdHJ1Y3QgbHBmY19oYmEgICAqcGhiYSA9IHZwb3J0LT5waGJhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEgKmRldmljZV9kYXRhID0gc2Rldi0+aG9zdGRhdGE7CisKIAlhdG9taWNfZGVjKCZwaGJhLT5zZGV2X2NudCk7CisJaWYgKChwaGJhLT5jZmdfRW5hYmxlWExhbmUpICYmIChkZXZpY2VfZGF0YSkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmRldmljZWxvY2ssIGZsYWdzKTsKKwkJZGV2aWNlX2RhdGEtPmF2YWlsYWJsZSA9IGZhbHNlOworCQlpZiAoIWRldmljZV9kYXRhLT5vYXNfZW5hYmxlZCkKKwkJCWxwZmNfZGVsZXRlX2RldmljZV9kYXRhKHBoYmEsIGRldmljZV9kYXRhKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+ZGV2aWNlbG9jaywgZmxhZ3MpOworCX0KIAlzZGV2LT5ob3N0ZGF0YSA9IE5VTEw7CiAJcmV0dXJuOwogfQogCisvKioKKyAqIGxwZmNfY3JlYXRlX2RldmljZV9kYXRhIC0gY3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgZGV2aWNlIGRhdGEgc3RydWN0dXJlIGZvciBPQVMKKyAqIEBwaGE6IFBvaW50ZXIgdG8gaG9zdCBidXMgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKiBAdnBvcnRfd3dwbjogUG9pbnRlciB0byB2cG9ydCdzIHd3cG4gaW5mb3JtYXRpb24KKyAqIEB0YXJnZXRfd3dwbjogUG9pbnRlciB0byB0YXJnZXQncyB3d3BuIGluZm9ybWF0aW9uCisgKiBAbHVuOiBMdW4gb24gdGFyZ2V0CisgKiBAYXRvbWljX2NyZWF0ZTogRmxhZyB0byBpbmRpY2F0ZSBpZiBtZW1vcnkgc2hvdWxkIGJlIGFsbG9jYXRlZCB1c2luZyB0aGUKKyAqCQkgIEdGUF9BVE9NSUMgZmxhZyBvciBub3QuCisgKgorICogVGhpcyByb3V0aW5lIGNyZWF0ZXMgYSBkZXZpY2UgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBjb250YWluIGlkZW50aWZ5aW5nCisgKiBpbmZvcm1hdGlvbiBmb3IgdGhlIGRldmljZSAoaG9zdCB3d3BuLCB0YXJnZXQgd3dwbiwgbHVuKSwgc3RhdGUgb2YgT0FTLAorICogd2hldGhlciBvciBub3QgdGhlIGNvcnJlc3BvbmRpbmcgbHVuIGlzIGF2YWlsYWJsZSBieSB0aGUgc3lzdGVtLAorICogYW5kIHBvaW50ZXIgdG8gdGhlIHJwb3J0IGRhdGEuCisgKgorICogUmV0dXJuIGNvZGVzOgorICogICBOVUxMIC0gRXJyb3IKKyAqICAgUG9pbnRlciB0byBscGZjX2RldmljZV9kYXRhIC0gU3VjY2VzcworICoqLworc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEqCitscGZjX2NyZWF0ZV9kZXZpY2VfZGF0YShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBscGZjX25hbWUgKnZwb3J0X3d3cG4sCisJCQlzdHJ1Y3QgbHBmY19uYW1lICp0YXJnZXRfd3dwbiwgdWludDY0X3QgbHVuLAorCQkJYm9vbCBhdG9taWNfY3JlYXRlKQoreworCisJc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEgKmx1bl9pbmZvOworCWludCBtZW1vcnlfZmxhZ3M7CisKKwlpZiAodW5saWtlbHkoIXBoYmEpIHx8ICF2cG9ydF93d3BuIHx8ICF0YXJnZXRfd3dwbiAgfHwKKwkgICAgIShwaGJhLT5jZmdfRW5hYmxlWExhbmUpKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEF0dGVtcHQgdG8gY3JlYXRlIHRoZSBkZXZpY2UgZGF0YSB0byBjb250YWluIGx1biBpbmZvICovCisKKwlpZiAoYXRvbWljX2NyZWF0ZSkKKwkJbWVtb3J5X2ZsYWdzID0gR0ZQX0FUT01JQzsKKwllbHNlCisJCW1lbW9yeV9mbGFncyA9IEdGUF9LRVJORUw7CisJbHVuX2luZm8gPSBtZW1wb29sX2FsbG9jKHBoYmEtPmRldmljZV9kYXRhX21lbV9wb29sLCBtZW1vcnlfZmxhZ3MpOworCWlmICghbHVuX2luZm8pCisJCXJldHVybiBOVUxMOworCUlOSVRfTElTVF9IRUFEKCZsdW5faW5mby0+bGlzdGVudHJ5KTsKKwlsdW5faW5mby0+cnBvcnRfZGF0YSAgPSBOVUxMOworCW1lbWNweSgmbHVuX2luZm8tPmRldmljZV9pZC52cG9ydF93d3BuLCB2cG9ydF93d3BuLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGxwZmNfbmFtZSkpOworCW1lbWNweSgmbHVuX2luZm8tPmRldmljZV9pZC50YXJnZXRfd3dwbiwgdGFyZ2V0X3d3cG4sCisJICAgICAgIHNpemVvZihzdHJ1Y3QgbHBmY19uYW1lKSk7CisJbHVuX2luZm8tPmRldmljZV9pZC5sdW4gPSBsdW47CisJbHVuX2luZm8tPm9hc19lbmFibGVkID0gZmFsc2U7CisJbHVuX2luZm8tPmF2YWlsYWJsZSA9IGZhbHNlOworCXJldHVybiBsdW5faW5mbzsKK30KKworLyoqCisgKiBscGZjX2RlbGV0ZV9kZXZpY2VfZGF0YSAtIGZyZWVzIGEgZGV2aWNlIGRhdGEgc3RydWN0dXJlIGZvciBPQVMKKyAqIEBwaGE6IFBvaW50ZXIgdG8gaG9zdCBidXMgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKiBAbHVuX2luZm86IFBvaW50ZXIgdG8gZGV2aWNlIGRhdGEgc3RydWN0dXJlIHRvIGZyZWUuCisgKgorICogVGhpcyByb3V0aW5lIGZyZWVzIHRoZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBkZXZpY2UgZGF0YSBzdHJ1Y3R1cmUgcGFzc2VkLgorICoKKyAqKi8KK3ZvaWQKK2xwZmNfZGVsZXRlX2RldmljZV9kYXRhKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwKKwkJCXN0cnVjdCBscGZjX2RldmljZV9kYXRhICpsdW5faW5mbykKK3sKKworCWlmICh1bmxpa2VseSghcGhiYSkgfHwgIWx1bl9pbmZvICB8fAorCSAgICAhKHBoYmEtPmNmZ19FbmFibGVYTGFuZSkpCisJCXJldHVybjsKKworCWlmICghbGlzdF9lbXB0eSgmbHVuX2luZm8tPmxpc3RlbnRyeSkpCisJCWxpc3RfZGVsKCZsdW5faW5mby0+bGlzdGVudHJ5KTsKKwltZW1wb29sX2ZyZWUobHVuX2luZm8sIHBoYmEtPmRldmljZV9kYXRhX21lbV9wb29sKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogX19scGZjX2dldF9kZXZpY2VfZGF0YSAtIHJldHVybnMgdGhlIGRldmljZSBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIGx1bgorICogQHBoYTogUG9pbnRlciB0byBob3N0IGJ1cyBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqIEBsaXN0OiBQb2ludCB0byBsaXN0IHRvIHNlYXJjaC4KKyAqIEB2cG9ydF93d3BuOiBQb2ludGVyIHRvIHZwb3J0J3Mgd3dwbiBpbmZvcm1hdGlvbgorICogQHRhcmdldF93d3BuOiBQb2ludGVyIHRvIHRhcmdldCdzIHd3cG4gaW5mb3JtYXRpb24KKyAqIEBsdW46IEx1biBvbiB0YXJnZXQKKyAqCisgKiBUaGlzIHJvdXRpbmUgc2VhcmNoZXMgdGhlIGxpc3QgcGFzc2VkIGZvciB0aGUgc3BlY2lmaWVkIGx1bidzIGRldmljZSBkYXRhLgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBob2xkIGxvY2tzLCBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlcgorICogdG8gZW5zdXJlIHRoZSBwcm9wZXIgbG9jayBpcyBoZWxkIGJlZm9yZSBjYWxsaW5nIHRoZSBmdW5jdGlvbi4KKyAqCisgKiBSZXR1cm4gY29kZXM6CisgKiAgIE5VTEwgLSBFcnJvcgorICogICBQb2ludGVyIHRvIGxwZmNfZGV2aWNlX2RhdGEgLSBTdWNjZXNzCisgKiovCitzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSoKK19fbHBmY19nZXRfZGV2aWNlX2RhdGEoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQkgICAgICAgc3RydWN0IGxwZmNfbmFtZSAqdnBvcnRfd3dwbiwKKwkJICAgICAgIHN0cnVjdCBscGZjX25hbWUgKnRhcmdldF93d3BuLCB1aW50NjRfdCBsdW4pCit7CisKKwlzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSAqbHVuX2luZm87CisKKwlpZiAodW5saWtlbHkoIXBoYmEpIHx8ICFsaXN0IHx8ICF2cG9ydF93d3BuIHx8ICF0YXJnZXRfd3dwbiB8fAorCSAgICAhcGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgbHVuIGlzIGFscmVhZHkgZW5hYmxlZCBmb3IgT0FTLiAqLworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShsdW5faW5mbywgbGlzdCwgbGlzdGVudHJ5KSB7CisJCWlmICgobWVtY21wKCZsdW5faW5mby0+ZGV2aWNlX2lkLnZwb3J0X3d3cG4sIHZwb3J0X3d3cG4sCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBscGZjX25hbWUpKSA9PSAwKSAmJgorCQkgICAgKG1lbWNtcCgmbHVuX2luZm8tPmRldmljZV9pZC50YXJnZXRfd3dwbiwgdGFyZ2V0X3d3cG4sCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBscGZjX25hbWUpKSA9PSAwKSAmJgorCQkgICAgKGx1bl9pbmZvLT5kZXZpY2VfaWQubHVuID09IGx1bikpCisJCQlyZXR1cm4gbHVuX2luZm87CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogbHBmY19maW5kX25leHRfb2FzX2x1biAtIHNlYXJjaGVzIGZvciB0aGUgbmV4dCBvYXMgbHVuCisgKiBAcGhhOiBQb2ludGVyIHRvIGhvc3QgYnVzIGFkYXB0ZXIgc3RydWN0dXJlLgorICogQHZwb3J0X3d3cG46IFBvaW50ZXIgdG8gdnBvcnQncyB3d3BuIGluZm9ybWF0aW9uCisgKiBAdGFyZ2V0X3d3cG46IFBvaW50ZXIgdG8gdGFyZ2V0J3Mgd3dwbiBpbmZvcm1hdGlvbgorICogQHN0YXJ0aW5nX2x1bjogUG9pbnRlciB0byB0aGUgbHVuIHRvIHN0YXJ0IHNlYXJjaGluZyBmb3IKKyAqIEBmb3VuZF92cG9ydF93d3BuOiBQb2ludGVyIHRvIHRoZSBmb3VuZCBsdW4ncyB2cG9ydCB3d3BuIGluZm9ybWF0aW9uCisgKiBAZm91bmRfdGFyZ2V0X3d3cG46IFBvaW50ZXIgdG8gdGhlIGZvdW5kIGx1bidzIHRhcmdldCB3d3BuIGluZm9ybWF0aW9uCisgKiBAZm91bmRfbHVuOiBQb2ludGVyIHRvIHRoZSBmb3VuZCBsdW4uCisgKiBAZm91bmRfbHVuX3N0YXR1czogUG9pbnRlciB0byBzdGF0dXMgb2YgdGhlIGZvdW5kIGx1bi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgc2VhcmNoZXMgdGhlIGx1bnMgbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBsdW4KKyAqIG9yIHRoZSBmaXJzdCBsdW4gZm9yIHRoZSB2cG9ydC90YXJnZXQuICBJZiB0aGUgdnBvcnQgd3dwbiBjb250YWlucworICogYSB6ZXJvIHZhbHVlIHRoZW4gYSBzcGVjaWZpYyB2cG9ydCBpcyBub3Qgc3BlY2lmaWVkLiBJbiB0aGlzIGNhc2UKKyAqIGFueSB2cG9ydCB3aGljaCBjb250YWlucyB0aGUgbHVuIHdpbGwgYmUgY29uc2lkZXJlZCBhIG1hdGNoLiAgSWYgdGhlCisgKiB0YXJnZXQgd3dwbiBjb250YWlucyBhIHplcm8gdmFsdWUgdGhlbiBhIHNwZWNpZmljIHRhcmdldCBpcyBub3Qgc3BlY2lmaWVkLgorICogSW4gdGhpcyBjYXNlIGFueSB0YXJnZXQgd2hpY2ggY29udGFpbnMgdGhlIGx1biB3aWxsIGJlIGNvbnNpZGVyZWQgYQorICogbWF0Y2guICBJZiB0aGUgbHVuIGlzIGZvdW5kLCB0aGUgbHVuLCB2cG9ydCB3d3BuLCB0YXJnZXQgd3dwbiBhbmQgbHVuIHN0YXR1cworICogYXJlIHJldHVybmVkLiAgVGhlIGZ1bmN0aW9uIHdpbGwgYWxzbyByZXR1cm4gdGhlIG5leHQgbHVuIGlmIGF2YWlsYWJsZS4KKyAqIElmIHRoZSBuZXh0IGx1biBpcyBub3QgZm91bmQsIHN0YXJ0aW5nX2x1biBwYXJhbWV0ZXIgd2lsbCBiZSBzZXQgdG8KKyAqIE5PX01PUkVfT0FTX0xVTi4KKyAqCisgKiBSZXR1cm4gY29kZXM6CisgKiAgIG5vbi0wIC0gRXJyb3IKKyAqICAgMCAtIFN1Y2Nlc3MKKyAqKi8KK2Jvb2wKK2xwZmNfZmluZF9uZXh0X29hc19sdW4oc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3QgbHBmY19uYW1lICp2cG9ydF93d3BuLAorCQkgICAgICAgc3RydWN0IGxwZmNfbmFtZSAqdGFyZ2V0X3d3cG4sIHVpbnQ2NF90ICpzdGFydGluZ19sdW4sCisJCSAgICAgICBzdHJ1Y3QgbHBmY19uYW1lICpmb3VuZF92cG9ydF93d3BuLAorCQkgICAgICAgc3RydWN0IGxwZmNfbmFtZSAqZm91bmRfdGFyZ2V0X3d3cG4sCisJCSAgICAgICB1aW50NjRfdCAqZm91bmRfbHVuLAorCQkgICAgICAgdWludDMyX3QgKmZvdW5kX2x1bl9zdGF0dXMpCit7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBscGZjX2RldmljZV9kYXRhICpsdW5faW5mbzsKKwlzdHJ1Y3QgbHBmY19kZXZpY2VfaWQgKmRldmljZV9pZDsKKwl1aW50NjRfdCBsdW47CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCisJaWYgKHVubGlrZWx5KCFwaGJhKSB8fCAhdnBvcnRfd3dwbiB8fCAhdGFyZ2V0X3d3cG4gfHwKKwkgICAgIXN0YXJ0aW5nX2x1biB8fCAhZm91bmRfdnBvcnRfd3dwbiB8fAorCSAgICAhZm91bmRfdGFyZ2V0X3d3cG4gfHwgIWZvdW5kX2x1biB8fCAhZm91bmRfbHVuX3N0YXR1cyB8fAorCSAgICAoKnN0YXJ0aW5nX2x1biA9PSBOT19NT1JFX09BU19MVU4pIHx8CisJICAgICFwaGJhLT5jZmdfRW5hYmxlWExhbmUpCisJCXJldHVybiBmYWxzZTsKKworCWx1biA9ICpzdGFydGluZ19sdW47CisJKmZvdW5kX2x1biA9IE5PX01PUkVfT0FTX0xVTjsKKwkqc3RhcnRpbmdfbHVuID0gTk9fTU9SRV9PQVNfTFVOOworCisJLyogU2VhcmNoIGZvciBsdW4gb3IgdGhlIGx1biBjbG9zZXQgaW4gdmFsdWUgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5kZXZpY2Vsb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsdW5faW5mbywgJnBoYmEtPmx1bnMsIGxpc3RlbnRyeSkgeworCQlpZiAoKCh3d25fdG9fdTY0KHZwb3J0X3d3cG4tPnUud3duKSA9PSAwKSB8fAorCQkgICAgIChtZW1jbXAoJmx1bl9pbmZvLT5kZXZpY2VfaWQudnBvcnRfd3dwbiwgdnBvcnRfd3dwbiwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGxwZmNfbmFtZSkpID09IDApKSAmJgorCQkgICAgKCh3d25fdG9fdTY0KHRhcmdldF93d3BuLT51Lnd3bikgPT0gMCkgfHwKKwkJICAgICAobWVtY21wKCZsdW5faW5mby0+ZGV2aWNlX2lkLnRhcmdldF93d3BuLCB0YXJnZXRfd3dwbiwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGxwZmNfbmFtZSkpID09IDApKSAmJgorCQkgICAgKGx1bl9pbmZvLT5vYXNfZW5hYmxlZCkpIHsKKwkJCWRldmljZV9pZCA9ICZsdW5faW5mby0+ZGV2aWNlX2lkOworCQkJaWYgKCghZm91bmQpICYmCisJCQkgICAgKChsdW4gPT0gRklORF9GSVJTVF9PQVNfTFVOKSB8fAorCQkJICAgICAoZGV2aWNlX2lkLT5sdW4gPT0gbHVuKSkpIHsKKwkJCQkqZm91bmRfbHVuID0gZGV2aWNlX2lkLT5sdW47CisJCQkJbWVtY3B5KGZvdW5kX3Zwb3J0X3d3cG4sCisJCQkJICAgICAgICZkZXZpY2VfaWQtPnZwb3J0X3d3cG4sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbHBmY19uYW1lKSk7CisJCQkJbWVtY3B5KGZvdW5kX3RhcmdldF93d3BuLAorCQkJCSAgICAgICAmZGV2aWNlX2lkLT50YXJnZXRfd3dwbiwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBscGZjX25hbWUpKTsKKwkJCQlpZiAobHVuX2luZm8tPmF2YWlsYWJsZSkKKwkJCQkJKmZvdW5kX2x1bl9zdGF0dXMgPQorCQkJCQkJT0FTX0xVTl9TVEFUVVNfRVhJU1RTOworCQkJCWVsc2UKKwkJCQkJKmZvdW5kX2x1bl9zdGF0dXMgPSAwOworCQkJCWlmIChwaGJhLT5jZmdfb2FzX2ZsYWdzICYgT0FTX0ZJTkRfQU5ZX1ZQT1JUKQorCQkJCQltZW1zZXQodnBvcnRfd3dwbiwgMHgwLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBscGZjX25hbWUpKTsKKwkJCQlpZiAocGhiYS0+Y2ZnX29hc19mbGFncyAmIE9BU19GSU5EX0FOWV9UQVJHRVQpCisJCQkJCW1lbXNldCh0YXJnZXRfd3dwbiwgMHgwLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBscGZjX25hbWUpKTsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQl9IGVsc2UgaWYgKGZvdW5kKSB7CisJCQkJKnN0YXJ0aW5nX2x1biA9IGRldmljZV9pZC0+bHVuOworCQkJCW1lbWNweSh2cG9ydF93d3BuLCAmZGV2aWNlX2lkLT52cG9ydF93d3BuLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGxwZmNfbmFtZSkpOworCQkJCW1lbWNweSh0YXJnZXRfd3dwbiwgJmRldmljZV9pZC0+dGFyZ2V0X3d3cG4sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbHBmY19uYW1lKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+ZGV2aWNlbG9jaywgZmxhZ3MpOworCXJldHVybiBmb3VuZDsKK30KKworLyoqCisgKiBscGZjX2VuYWJsZV9vYXNfbHVuIC0gZW5hYmxlcyBhIGx1biBmb3IgT0FTIG9wZXJhdGlvbnMKKyAqIEBwaGE6IFBvaW50ZXIgdG8gaG9zdCBidXMgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKiBAdnBvcnRfd3dwbjogUG9pbnRlciB0byB2cG9ydCdzIHd3cG4gaW5mb3JtYXRpb24KKyAqIEB0YXJnZXRfd3dwbjogUG9pbnRlciB0byB0YXJnZXQncyB3d3BuIGluZm9ybWF0aW9uCisgKiBAbHVuOiBMdW4KKyAqCisgKiBUaGlzIHJvdXRpbmUgZW5hYmxlcyBhIGx1biBmb3Igb2FzIG9wZXJhdGlvbnMuICBUaGUgcm91dGluZXMgZG9lcyBzbyBieQorICogZG9pbmcgdGhlIGZvbGxvd2luZyA6CisgKgorICogICAxKSBDaGVja3MgdG8gc2VlIGlmIHRoZSBkZXZpY2UgZGF0YSBmb3IgdGhlIGx1biBoYXMgYmVlbiBjcmVhdGVkLgorICogICAyKSBJZiBmb3VuZCwgc2V0cyB0aGUgT0FTIGVuYWJsZWQgZmxhZyBpZiBub3Qgc2V0IGFuZCByZXR1cm5zLgorICogICAzKSBPdGhlcndpc2UsIGNyZWF0ZXMgYSBkZXZpY2UgZGF0YSBzdHJ1Y3R1cmUuCisgKiAgIDQpIElmIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCBpbmRpY2F0ZXMgdGhlIGRldmljZSBkYXRhIGlzIGZvciBhbiBPQVMgbHVuLAorICogICBpbmRpY2F0ZXMgdGhlIGx1biBpcyBub3QgYXZhaWxhYmxlIGFuZCBhZGQgdG8gdGhlIGxpc3Qgb2YgbHVucy4KKyAqCisgKiBSZXR1cm4gY29kZXM6CisgKiAgIGZhbHNlIC0gRXJyb3IKKyAqICAgdHJ1ZSAtIFN1Y2Nlc3MKKyAqKi8KK2Jvb2wKK2xwZmNfZW5hYmxlX29hc19sdW4oc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3QgbHBmY19uYW1lICp2cG9ydF93d3BuLAorCQkgICAgc3RydWN0IGxwZmNfbmFtZSAqdGFyZ2V0X3d3cG4sIHVpbnQ2NF90IGx1bikKK3sKKworCXN0cnVjdCBscGZjX2RldmljZV9kYXRhICpsdW5faW5mbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHVubGlrZWx5KCFwaGJhKSB8fCAhdnBvcnRfd3dwbiB8fCAhdGFyZ2V0X3d3cG4gfHwKKwkgICAgIXBoYmEtPmNmZ19FbmFibGVYTGFuZSkKKwkJcmV0dXJuIGZhbHNlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmRldmljZWxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgZGV2aWNlIGRhdGEgZm9yIHRoZSBsdW4gaGFzIGJlZW4gY3JlYXRlZCAqLworCWx1bl9pbmZvID0gX19scGZjX2dldF9kZXZpY2VfZGF0YShwaGJhLCAmcGhiYS0+bHVucywgdnBvcnRfd3dwbiwKKwkJCQkJICB0YXJnZXRfd3dwbiwgbHVuKTsKKwlpZiAobHVuX2luZm8pIHsKKwkJaWYgKCFsdW5faW5mby0+b2FzX2VuYWJsZWQpCisJCQlsdW5faW5mby0+b2FzX2VuYWJsZWQgPSB0cnVlOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5kZXZpY2Vsb2NrLCBmbGFncyk7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qIENyZWF0ZSBhbiBsdW4gaW5mbyBzdHJ1Y3R1cmUgYW5kIGFkZCB0byBsaXN0IG9mIGx1bnMgKi8KKwlsdW5faW5mbyA9IGxwZmNfY3JlYXRlX2RldmljZV9kYXRhKHBoYmEsIHZwb3J0X3d3cG4sIHRhcmdldF93d3BuLCBsdW4sCisJCQkJCSAgIGZhbHNlKTsKKwlpZiAobHVuX2luZm8pIHsKKwkJbHVuX2luZm8tPm9hc19lbmFibGVkID0gdHJ1ZTsKKwkJbHVuX2luZm8tPmF2YWlsYWJsZSA9IGZhbHNlOworCQlsaXN0X2FkZF90YWlsKCZsdW5faW5mby0+bGlzdGVudHJ5LCAmcGhiYS0+bHVucyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmRldmljZWxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmRldmljZWxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogbHBmY19kaXNhYmxlX29hc19sdW4gLSBkaXNhYmxlcyBhIGx1biBmb3IgT0FTIG9wZXJhdGlvbnMKKyAqIEBwaGE6IFBvaW50ZXIgdG8gaG9zdCBidXMgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKiBAdnBvcnRfd3dwbjogUG9pbnRlciB0byB2cG9ydCdzIHd3cG4gaW5mb3JtYXRpb24KKyAqIEB0YXJnZXRfd3dwbjogUG9pbnRlciB0byB0YXJnZXQncyB3d3BuIGluZm9ybWF0aW9uCisgKiBAbHVuOiBMdW4KKyAqCisgKiBUaGlzIHJvdXRpbmUgZGlzYWJsZXMgYSBsdW4gZm9yIG9hcyBvcGVyYXRpb25zLiAgVGhlIHJvdXRpbmVzIGRvZXMgc28gYnkKKyAqIGRvaW5nIHRoZSBmb2xsb3dpbmcgOgorICoKKyAqICAgMSkgQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZGV2aWNlIGRhdGEgZm9yIHRoZSBsdW4gaXMgY3JlYXRlZC4KKyAqICAgMikgSWYgcHJlc2VudCwgY2xlYXJzIHRoZSBmbGFnIGluZGljYXRpbmcgdGhpcyBsdW4gaXMgZm9yIE9BUy4KKyAqICAgMykgSWYgdGhlIGx1biBpcyBub3QgYXZhaWxhYmxlIGJ5IHRoZSBzeXN0ZW0sIHRoZSBkZXZpY2UgZGF0YSBpcworICogICBmcmVlZC4KKyAqCisgKiBSZXR1cm4gY29kZXM6CisgKiAgIGZhbHNlIC0gRXJyb3IKKyAqICAgdHJ1ZSAtIFN1Y2Nlc3MKKyAqKi8KK2Jvb2wKK2xwZmNfZGlzYWJsZV9vYXNfbHVuKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IGxwZmNfbmFtZSAqdnBvcnRfd3dwbiwKKwkJICAgICBzdHJ1Y3QgbHBmY19uYW1lICp0YXJnZXRfd3dwbiwgdWludDY0X3QgbHVuKQoreworCisJc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEgKmx1bl9pbmZvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodW5saWtlbHkoIXBoYmEpIHx8ICF2cG9ydF93d3BuIHx8ICF0YXJnZXRfd3dwbiB8fAorCSAgICAhcGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKQorCQlyZXR1cm4gZmFsc2U7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+ZGV2aWNlbG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBsdW4gaXMgYXZhaWxhYmxlLiAqLworCWx1bl9pbmZvID0gX19scGZjX2dldF9kZXZpY2VfZGF0YShwaGJhLAorCQkJCQkgICZwaGJhLT5sdW5zLCB2cG9ydF93d3BuLAorCQkJCQkgIHRhcmdldF93d3BuLCBsdW4pOworCWlmIChsdW5faW5mbykgeworCQlsdW5faW5mby0+b2FzX2VuYWJsZWQgPSBmYWxzZTsKKwkJaWYgKCFsdW5faW5mby0+YXZhaWxhYmxlKQorCQkJbHBmY19kZWxldGVfZGV2aWNlX2RhdGEocGhiYSwgbHVuX2luZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5kZXZpY2Vsb2NrLCBmbGFncyk7CisJCXJldHVybiB0cnVlOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmRldmljZWxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZmFsc2U7Cit9CiAKIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgbHBmY190ZW1wbGF0ZSA9IHsKIAkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmgKaW5kZXggODUyZmY3ZC4uMDEyMGJmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmgKQEAgLTQxLDYgKzQxLDIwIEBACiAJc3RydWN0IGxwZmNfbm9kZWxpc3QgKnBub2RlOwkvKiBQb2ludGVyIHRvIHRoZSBub2RlIHN0cnVjdHVyZS4gKi8KIH07CiAKK3N0cnVjdCBscGZjX2RldmljZV9pZCB7CisJc3RydWN0IGxwZmNfbmFtZSB2cG9ydF93d3BuOworCXN0cnVjdCBscGZjX25hbWUgdGFyZ2V0X3d3cG47CisJdWludDY0X3QgbHVuOworfTsKKworc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdGVudHJ5OworCXN0cnVjdCBscGZjX3Jwb3J0X2RhdGEgKnJwb3J0X2RhdGE7CisJc3RydWN0IGxwZmNfZGV2aWNlX2lkIGRldmljZV9pZDsKKwlib29sIG9hc19lbmFibGVkOworCWJvb2wgYXZhaWxhYmxlOworfTsKKwogc3RydWN0IGZjcF9yc3AgewogCXVpbnQzMl90IHJzcFJzdmQxOwkvKiBGQyBXb3JkIDAsIGJ5dGUgMDozICovCiAJdWludDMyX3QgcnNwUnN2ZDI7CS8qIEZDIFdvcmQgMSwgYnl0ZSAwOjMgKi8KQEAgLTE2NiwzICsxODAsNyBAQAogI2RlZmluZSBMUEZDX1NDU0lfRE1BX0VYVF9TSVpFIDI2NAogI2RlZmluZSBMUEZDX0JQTF9TSVpFICAgICAgICAgIDEwMjQKICNkZWZpbmUgTURBQ19ESVJFQ1RfQ01EICAgICAgICAgICAgICAgICAgMHgyMgorCisjZGVmaW5lIEZJTkRfRklSU1RfT0FTX0xVTgkJIDAKKyNkZWZpbmUgTk9fTU9SRV9PQVNfTFVOCQkJLTEKKyNkZWZpbmUgTk9UX09BU19FTkFCTEVEX0xVTgkJTk9fTU9SRV9PQVNfTFVOCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYwppbmRleCA4ZjU4MGZkLi42YmI1MWY4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCkBAIC02MzUsNyArNjM1LDcgQEAKIAlpZiAoIW5kbHApCiAJCWdvdG8gb3V0OwogCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCh4cml0YWcsIG5kbHAtPmFjdGl2ZV9ycnFzLnhyaV9iaXRtYXApKSB7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCh4cml0YWcsIG5kbHAtPmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXApKSB7CiAJCXJycS0+c2VuZF9ycnEgPSAwOwogCQlycnEtPnhyaXRhZyA9IDA7CiAJCXJycS0+cnJxX3N0b3BfdGltZSA9IDA7CkBAIC02NzgsNyArNjc4LDggQEAKIAkJCW5leHRfdGltZSA9IHJycS0+cnJxX3N0b3BfdGltZTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWdzKTsKLQlpZiAoIWxpc3RfZW1wdHkoJnBoYmEtPmFjdGl2ZV9ycnFfbGlzdCkpCisJaWYgKCghbGlzdF9lbXB0eSgmcGhiYS0+YWN0aXZlX3JycV9saXN0KSkgJiYKKwkgICAgKCEocGhiYS0+cHBvcnQtPmxvYWRfZmxhZyAmIEZDX1VOTE9BRElORykpKQogCQltb2RfdGltZXIoJnBoYmEtPnJycV90bXIsIG5leHRfdGltZSk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJycSwgbmV4dHJycSwgJnNlbmRfcnJxLCBsaXN0KSB7CiAJCWxpc3RfZGVsKCZycnEtPmxpc3QpOwpAQCAtNzkyLDcgKzc5Myw5IEBACiAJCWxpc3RfZGVsKCZycnEtPmxpc3QpOwogCQlscGZjX2Nscl9ycnFfYWN0aXZlKHBoYmEsIHJycS0+eHJpdGFnLCBycnEpOwogCX0KLQlpZiAoIWxpc3RfZW1wdHkoJnBoYmEtPmFjdGl2ZV9ycnFfbGlzdCkpCisJaWYgKCghbGlzdF9lbXB0eSgmcGhiYS0+YWN0aXZlX3JycV9saXN0KSkgJiYKKwkgICAgKCEocGhiYS0+cHBvcnQtPmxvYWRfZmxhZyAmIEZDX1VOTE9BRElORykpKQorCiAJCW1vZF90aW1lcigmcGhiYS0+cnJxX3RtciwgbmV4dF90aW1lKTsKIH0KIApAQCAtODEzLDcgKzgxNiw5IEBACiB7CiAJaWYgKCFuZGxwKQogCQlyZXR1cm4gMDsKLQlpZiAodGVzdF9iaXQoeHJpdGFnLCBuZGxwLT5hY3RpdmVfcnJxcy54cmlfYml0bWFwKSkKKwlpZiAoIW5kbHAtPmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXApCisJCXJldHVybiAwOworCWlmICh0ZXN0X2JpdCh4cml0YWcsIG5kbHAtPmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXApKQogCQkJcmV0dXJuIDE7CiAJZWxzZQogCQlyZXR1cm4gMDsKQEAgLTg2Myw3ICs4NjgsMTAgQEAKIAlpZiAobmRscC0+dnBvcnQgJiYgKG5kbHAtPnZwb3J0LT5sb2FkX2ZsYWcgJiBGQ19VTkxPQURJTkcpKQogCQlnb3RvIG91dDsKIAotCWlmICh0ZXN0X2FuZF9zZXRfYml0KHhyaXRhZywgbmRscC0+YWN0aXZlX3JycXMueHJpX2JpdG1hcCkpCisJaWYgKCFuZGxwLT5hY3RpdmVfcnJxc194cmlfYml0bWFwKQorCQlnb3RvIG91dDsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KHhyaXRhZywgbmRscC0+YWN0aXZlX3JycXNfeHJpX2JpdG1hcCkpCiAJCWdvdG8gb3V0OwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWdzKTsKQEAgLTEzMTgsNyArMTMyNiw4IEBACiAKIAlpZiAoKHVubGlrZWx5KHByaW5nLT5yaW5nbm8gPT0gTFBGQ19FTFNfUklORykpICYmCiAJICAgKHBpb2NiLT5pb2NiLnVscENvbW1hbmQgIT0gQ01EX0FCT1JUX1hSSV9DTikgJiYKLQkgICAocGlvY2ItPmlvY2IudWxwQ29tbWFuZCAhPSBDTURfQ0xPU0VfWFJJX0NOKSkgeworCSAgIChwaW9jYi0+aW9jYi51bHBDb21tYW5kICE9IENNRF9DTE9TRV9YUklfQ04pICYmCisJICghKHBpb2NiLT52cG9ydC0+bG9hZF9mbGFnICYgRkNfVU5MT0FESU5HKSkpIHsKIAkJaWYgKCFwaW9jYi0+dnBvcnQpCiAJCQlCVUcoKTsKIAkJZWxzZQpAQCAtNDk3MSwxMiArNDk4MCwxOSBAQAogCQkJCQkgICAgIExQRkNfUVVFVUVfUkVBUk0pOwogCQl9IHdoaWxlICgrK2ZjcF9lcWlkeCA8IHBoYmEtPmNmZ19mY3BfaW9fY2hhbm5lbCk7CiAJfQorCisJaWYgKHBoYmEtPmNmZ19FbmFibGVYTGFuZSkKKwkJbHBmY19zbGk0X2NxX3JlbGVhc2UocGhiYS0+c2xpNF9oYmEub2FzX2NxLCBMUEZDX1FVRVVFX1JFQVJNKTsKKwogCWlmIChwaGJhLT5zbGk0X2hiYS5oYmFfZXEpIHsKIAkJZm9yIChmY3BfZXFpZHggPSAwOyBmY3BfZXFpZHggPCBwaGJhLT5jZmdfZmNwX2lvX2NoYW5uZWw7CiAJCSAgICAgZmNwX2VxaWR4KyspCiAJCQlscGZjX3NsaTRfZXFfcmVsZWFzZShwaGJhLT5zbGk0X2hiYS5oYmFfZXFbZmNwX2VxaWR4XSwKIAkJCQkJICAgICBMUEZDX1FVRVVFX1JFQVJNKTsKIAl9CisKKwlpZiAocGhiYS0+Y2ZnX2ZvZikKKwkJbHBmY19zbGk0X2VxX3JlbGVhc2UocGhiYS0+c2xpNF9oYmEuZm9mX2VxLCBMUEZDX1FVRVVFX1JFQVJNKTsKIH0KIAogLyoqCkBAIC04MDMyLDcgKzgwNDgsOCBAQAogCXN0cnVjdCBscGZjX3ZlY3Rvcl9tYXBfaW5mbyAqY3B1cDsKIAlpbnQgY2hhbm4sIGNwdTsKIAotCWlmIChwaGJhLT5jZmdfZmNwX2lvX3NjaGVkID09IExQRkNfRkNQX1NDSEVEX0JZX0NQVSkgeworCWlmIChwaGJhLT5jZmdfZmNwX2lvX3NjaGVkID09IExQRkNfRkNQX1NDSEVEX0JZX0NQVQorCSAgICAmJiBwaGJhLT5jZmdfZmNwX2lvX2NoYW5uZWwgPiAxKSB7CiAJCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAkJaWYgKGNwdSA8IHBoYmEtPnNsaTRfaGJhLm51bV9wcmVzZW50X2NwdSkgewogCQkJY3B1cCA9IHBoYmEtPnNsaTRfaGJhLmNwdV9tYXA7CkBAIC04MjUwLDYgKzgyNjcsMTQgQEAKIAkJYmZfc2V0KHdxZV9lYmRlX2NudCwgJndxZS0+ZmNwX2l3cml0ZS53cWVfY29tLCAwKTsKIAkJYmZfc2V0KHdxZV9wdSwgJndxZS0+ZmNwX2l3cml0ZS53cWVfY29tLCBpb2NicS0+aW9jYi51bHBQVSk7CiAJCWJmX3NldCh3cWVfZGJkZSwgJndxZS0+ZmNwX2l3cml0ZS53cWVfY29tLCAxKTsKKwkJaWYgKGlvY2JxLT5pb2NiX2ZsYWcgJiBMUEZDX0lPX09BUykgeworCQkJYmZfc2V0KHdxZV9vYXMsICZ3cWUtPmZjcF9pd3JpdGUud3FlX2NvbSwgMSk7CisJCQlpZiAocGhiYS0+Y2ZnX1hMYW5lUHJpb3JpdHkpIHsKKwkJCQliZl9zZXQod3FlX2NjcGUsICZ3cWUtPmZjcF9pd3JpdGUud3FlX2NvbSwgMSk7CisJCQkJYmZfc2V0KHdxZV9jY3AsICZ3cWUtPmZjcF9pd3JpdGUud3FlX2NvbSwKKwkJCQkgICAgICAgKHBoYmEtPmNmZ19YTGFuZVByaW9yaXR5IDw8IDEpKTsKKwkJCX0KKwkJfQogCQlicmVhazsKIAljYXNlIENNRF9GQ1BfSVJFQUQ2NF9DUjoKIAkJLyogd29yZDMgaW9jYj1pb3RhZyB3cWU9cGF5bG9hZF9vZmZzZXRfbGVuICovCkBAIC04MjcxLDYgKzgyOTYsMTQgQEAKIAkJYmZfc2V0KHdxZV9lYmRlX2NudCwgJndxZS0+ZmNwX2lyZWFkLndxZV9jb20sIDApOwogCQliZl9zZXQod3FlX3B1LCAmd3FlLT5mY3BfaXJlYWQud3FlX2NvbSwgaW9jYnEtPmlvY2IudWxwUFUpOwogCQliZl9zZXQod3FlX2RiZGUsICZ3cWUtPmZjcF9pcmVhZC53cWVfY29tLCAxKTsKKwkJaWYgKGlvY2JxLT5pb2NiX2ZsYWcgJiBMUEZDX0lPX09BUykgeworCQkJYmZfc2V0KHdxZV9vYXMsICZ3cWUtPmZjcF9pcmVhZC53cWVfY29tLCAxKTsKKwkJCWlmIChwaGJhLT5jZmdfWExhbmVQcmlvcml0eSkgeworCQkJCWJmX3NldCh3cWVfY2NwZSwgJndxZS0+ZmNwX2lyZWFkLndxZV9jb20sIDEpOworCQkJCWJmX3NldCh3cWVfY2NwLCAmd3FlLT5mY3BfaXJlYWQud3FlX2NvbSwKKwkJCQkgICAgICAgKHBoYmEtPmNmZ19YTGFuZVByaW9yaXR5IDw8IDEpKTsKKwkJCX0KKwkJfQogCQlicmVhazsKIAljYXNlIENNRF9GQ1BfSUNNTkQ2NF9DUjoKIAkJLyogd29yZDMgaW9jYj1pb3RhZyB3cWU9cGF5bG9hZF9vZmZzZXRfbGVuICovCkBAIC04MjkxLDYgKzgzMjQsMTQgQEAKIAkJYmZfc2V0KHdxZV9lYmRlX2NudCwgJndxZS0+ZmNwX2ljbWQud3FlX2NvbSwgMCk7CiAJCWJmX3NldCh3cWVfZXJwLCAmd3FlLT5mY3BfaWNtZC53cWVfY29tLAogCQkgICAgICAgaW9jYnEtPmlvY2IudWxwRkNQMlJjdnkpOworCQlpZiAoaW9jYnEtPmlvY2JfZmxhZyAmIExQRkNfSU9fT0FTKSB7CisJCQliZl9zZXQod3FlX29hcywgJndxZS0+ZmNwX2ljbWQud3FlX2NvbSwgMSk7CisJCQlpZiAocGhiYS0+Y2ZnX1hMYW5lUHJpb3JpdHkpIHsKKwkJCQliZl9zZXQod3FlX2NjcGUsICZ3cWUtPmZjcF9pY21kLndxZV9jb20sIDEpOworCQkJCWJmX3NldCh3cWVfY2NwLCAmd3FlLT5mY3BfaWNtZC53cWVfY29tLAorCQkJCSAgICAgICAocGhiYS0+Y2ZnX1hMYW5lUHJpb3JpdHkgPDwgMSkpOworCQkJfQorCQl9CiAJCWJyZWFrOwogCWNhc2UgQ01EX0dFTl9SRVFVRVNUNjRfQ1I6CiAJCS8qIEZvciB0aGlzIGNvbW1hbmQgY2FsY3VsYXRlIHRoZSB4bWl0IGxlbmd0aCBvZiB0aGUKQEAgLTg1MjMsNiArODU2NCw3IEBACiB7CiAJc3RydWN0IGxwZmNfc2dscSAqc2dscTsKIAl1bmlvbiBscGZjX3dxZSB3cWU7CisJc3RydWN0IGxwZmNfcXVldWUgKndxOwogCXN0cnVjdCBscGZjX3NsaV9yaW5nICpwcmluZyA9ICZwaGJhLT5zbGkucmluZ1tyaW5nX251bWJlcl07CiAKIAlpZiAocGlvY2ItPnNsaTRfeHJpdGFnID09IE5PX1hSSSkgewpAQCAtODU3NSwxMSArODYxNywxNCBAQAogCQlyZXR1cm4gSU9DQl9FUlJPUjsKIAogCWlmICgocGlvY2ItPmlvY2JfZmxhZyAmIExQRkNfSU9fRkNQKSB8fAotCQkocGlvY2ItPmlvY2JfZmxhZyAmIExQRkNfVVNFX0ZDUFdRSURYKSkgewotCQlpZiAodW5saWtlbHkoIXBoYmEtPnNsaTRfaGJhLmZjcF93cSkpCi0JCQlyZXR1cm4gSU9DQl9FUlJPUjsKLQkJaWYgKGxwZmNfc2xpNF93cV9wdXQocGhiYS0+c2xpNF9oYmEuZmNwX3dxW3Bpb2NiLT5mY3Bfd3FpZHhdLAotCQkJCSAgICAgJndxZSkpCisJICAgIChwaW9jYi0+aW9jYl9mbGFnICYgTFBGQ19VU0VfRkNQV1FJRFgpKSB7CisJCWlmICghcGhiYS0+Y2ZnX0VuYWJsZVhMYW5lIHx8ICghKHBpb2NiLT5pb2NiX2ZsYWcgJgorCQkJTFBGQ19JT19PQVMpKSkgeworCQkJd3EgPSBwaGJhLT5zbGk0X2hiYS5mY3Bfd3FbcGlvY2ItPmZjcF93cWlkeF07CisJCX0gZWxzZSB7CisJCQl3cSA9IHBoYmEtPnNsaTRfaGJhLm9hc193cTsKKwkJfQorCQlpZiAobHBmY19zbGk0X3dxX3B1dCh3cSwgJndxZSkpCiAJCQlyZXR1cm4gSU9DQl9FUlJPUjsKIAl9IGVsc2UgewogCQlpZiAodW5saWtlbHkoIXBoYmEtPnNsaTRfaGJhLmVsc193cSkpCkBAIC04NjY5LDEyICs4NzE0LDIwIEBACiAKIAlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KSB7CiAJCWlmIChwaW9jYi0+aW9jYl9mbGFnICYgIExQRkNfSU9fRkNQKSB7Ci0JCQlpZiAodW5saWtlbHkoIXBoYmEtPnNsaTRfaGJhLmZjcF93cSkpCi0JCQkJcmV0dXJuIElPQ0JfRVJST1I7Ci0JCQlpZHggPSBscGZjX3NsaTRfc2NtZF90b193cWlkeF9kaXN0cihwaGJhKTsKLQkJCXBpb2NiLT5mY3Bfd3FpZHggPSBpZHg7Ci0JCQlyaW5nX251bWJlciA9IE1BWF9TTEkzX0NPTkZJR1VSRURfUklOR1MgKyBpZHg7Ci0KKwkJCWlmICghcGhiYS0+Y2ZnX0VuYWJsZVhMYW5lIHx8ICghKHBpb2NiLT5pb2NiX2ZsYWcgJgorCQkJCUxQRkNfSU9fT0FTKSkpIHsKKwkJCQlpZiAodW5saWtlbHkoIXBoYmEtPnNsaTRfaGJhLmZjcF93cSkpCisJCQkJCXJldHVybiBJT0NCX0VSUk9SOworCQkJCWlkeCA9IGxwZmNfc2xpNF9zY21kX3RvX3dxaWR4X2Rpc3RyKHBoYmEpOworCQkJCXBpb2NiLT5mY3Bfd3FpZHggPSBpZHg7CisJCQkJcmluZ19udW1iZXIgPSBNQVhfU0xJM19DT05GSUdVUkVEX1JJTkdTICsgaWR4OworCQkJfSBlbHNlIHsKKwkJCQlpZiAodW5saWtlbHkoIXBoYmEtPnNsaTRfaGJhLm9hc193cSkpCisJCQkJCXJldHVybiBJT0NCX0VSUk9SOworCQkJCWlkeCA9IDA7CisJCQkJcGlvY2ItPmZjcF93cWlkeCA9IDA7CisJCQkJcmluZ19udW1iZXIgPSAgTFBGQ19GQ1BfT0FTX1JJTkc7CisJCQl9CiAJCQlwcmluZyA9ICZwaGJhLT5zbGkucmluZ1tyaW5nX251bWJlcl07CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpbmctPnJpbmdfbG9jaywgaWZsYWdzKTsKIAkJCXJjID0gX19scGZjX3NsaV9pc3N1ZV9pb2NiKHBoYmEsIHJpbmdfbnVtYmVyLCBwaW9jYiwKQEAgLTEyMTMyLDYgKzEyMTg1LDE3NSBAQAogCWxwZmNfc2xpNF9lcV9yZWxlYXNlKGVxLCBMUEZDX1FVRVVFX1JFQVJNKTsKIH0KIAorCisvKioKKyAqIGxwZmNfc2xpNF9mb2ZfaGFuZGxlX2VxZSAtIFByb2Nlc3MgYSBGbGFzaCBPcHRpbWl6ZWQgRmFicmljIGV2ZW50IHF1ZXVlCisgKgkJCSAgICAgZW50cnkKKyAqIEBwaGJhOiBQb2ludGVyIHRvIEhCQSBjb250ZXh0IG9iamVjdC4KKyAqIEBlcWU6IFBvaW50ZXIgdG8gZmFzdC1wYXRoIGV2ZW50IHF1ZXVlIGVudHJ5LgorICoKKyAqIFRoaXMgcm91dGluZSBwcm9jZXNzIGEgZXZlbnQgcXVldWUgZW50cnkgZnJvbSB0aGUgRmxhc2ggT3B0aW1pemVkIEZhYnJpYworICogZXZlbnQgcXVldWUuICBJdCB3aWxsIGNoZWNrIHRoZSBNYWpvckNvZGUgYW5kIE1pbm9yQ29kZSB0byBkZXRlcm1pbmUgdGhpcworICogaXMgZm9yIGEgY29tcGxldGlvbiBldmVudCBvbiBhIGNvbXBsZXRpb24gcXVldWUsIGlmIG5vdCwgYW4gZXJyb3Igc2hhbGwgYmUKKyAqIGxvZ2dlZCBhbmQganVzdCByZXR1cm4uIE90aGVyd2lzZSwgaXQgd2lsbCBnZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGNvbXBsZXRpb24gcXVldWUgYW5kIHByb2Nlc3MgYWxsIHRoZSBlbnRyaWVzIG9uIHRoZSBjb21wbGV0aW9uIHF1ZXVlLCByZWFybQorICogdGhlIGNvbXBsZXRpb24gcXVldWUsIGFuZCB0aGVuIHJldHVybi4KKyAqKi8KK3N0YXRpYyB2b2lkCitscGZjX3NsaTRfZm9mX2hhbmRsZV9lcWUoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3QgbHBmY19lcWUgKmVxZSkKK3sKKwlzdHJ1Y3QgbHBmY19xdWV1ZSAqY3E7CisJc3RydWN0IGxwZmNfY3FlICpjcWU7CisJYm9vbCB3b3JrcG9zdGVkID0gZmFsc2U7CisJdWludDE2X3QgY3FpZDsKKwlpbnQgZWNvdW50ID0gMDsKKworCWlmICh1bmxpa2VseShiZl9nZXRfbGUzMihscGZjX2VxZV9tYWpvcl9jb2RlLCBlcWUpICE9IDApKSB7CisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKKwkJCQkiOTE0NyBOb3QgYSB2YWxpZCBjb21wbGV0aW9uICIKKwkJCQkiZXZlbnQ6IG1ham9yY29kZT14JXgsIG1pbm9yY29kZT14JXhcbiIsCisJCQkJYmZfZ2V0X2xlMzIobHBmY19lcWVfbWFqb3JfY29kZSwgZXFlKSwKKwkJCQliZl9nZXRfbGUzMihscGZjX2VxZV9taW5vcl9jb2RlLCBlcWUpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEdldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBjb3JyZXNwb25kaW5nIENRICovCisJY3FpZCA9IGJmX2dldF9sZTMyKGxwZmNfZXFlX3Jlc291cmNlX2lkLCBlcWUpOworCisJLyogTmV4dCBjaGVjayBmb3IgT0FTICovCisJY3EgPSBwaGJhLT5zbGk0X2hiYS5vYXNfY3E7CisJaWYgKHVubGlrZWx5KCFjcSkpIHsKKwkJaWYgKHBoYmEtPnNsaS5zbGlfZmxhZyAmIExQRkNfU0xJX0FDVElWRSkKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKKwkJCQkJIjkxNDggT0FTIGNvbXBsZXRpb24gcXVldWUgIgorCQkJCQkiZG9lcyBub3QgZXhpc3RcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHVubGlrZWx5KGNxaWQgIT0gY3EtPnF1ZXVlX2lkKSkgeworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19TTEksCisJCQkJIjkxNDkgTWlzcy1tYXRjaGVkIGZhc3QtcGF0aCBjb21wbCAiCisJCQkJInF1ZXVlIGlkOiBlcWNxaWQ9JWQsIGZjcGNxaWQ9JWRcbiIsCisJCQkJY3FpZCwgY3EtPnF1ZXVlX2lkKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFByb2Nlc3MgYWxsIHRoZSBlbnRyaWVzIHRvIHRoZSBPQVMgQ1EgKi8KKwl3aGlsZSAoKGNxZSA9IGxwZmNfc2xpNF9jcV9nZXQoY3EpKSkgeworCQl3b3JrcG9zdGVkIHw9IGxwZmNfc2xpNF9mcF9oYW5kbGVfd2NxZShwaGJhLCBjcSwgY3FlKTsKKwkJaWYgKCEoKytlY291bnQgJSBjcS0+ZW50cnlfcmVwb3N0KSkKKwkJCWxwZmNfc2xpNF9jcV9yZWxlYXNlKGNxLCBMUEZDX1FVRVVFX05PQVJNKTsKKwl9CisKKwkvKiBUcmFjayB0aGUgbWF4IG51bWJlciBvZiBDUUVzIHByb2Nlc3NlZCBpbiAxIEVRICovCisJaWYgKGVjb3VudCA+IGNxLT5DUV9tYXhfY3FlKQorCQljcS0+Q1FfbWF4X2NxZSA9IGVjb3VudDsKKworCS8qIENhdGNoIHRoZSBubyBjcSBlbnRyeSBjb25kaXRpb24gKi8KKwlpZiAodW5saWtlbHkoZWNvdW50ID09IDApKQorCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19TTEksCisJCQkJIjkxNTMgTm8gZW50cnkgZnJvbSBmYXN0LXBhdGggY29tcGxldGlvbiAiCisJCQkJInF1ZXVlIGZjcGNxaWQ9JWRcbiIsIGNxLT5xdWV1ZV9pZCk7CisKKwkvKiBJbiBhbnkgY2FzZSwgZmxhc2ggYW5kIHJlLWFybSB0aGUgQ1EgKi8KKwlscGZjX3NsaTRfY3FfcmVsZWFzZShjcSwgTFBGQ19RVUVVRV9SRUFSTSk7CisKKwkvKiB3YWtlIHVwIHdvcmtlciB0aHJlYWQgaWYgdGhlcmUgYXJlIHdvcmtzIHRvIGJlIGRvbmUgKi8KKwlpZiAod29ya3Bvc3RlZCkKKwkJbHBmY193b3JrZXJfd2FrZV91cChwaGJhKTsKK30KKworLyoqCisgKiBscGZjX3NsaTRfZm9mX2ludHJfaGFuZGxlciAtIEhCQSBpbnRlcnJ1cHQgaGFuZGxlciB0byBTTEktNCBkZXZpY2UKKyAqIEBpcnE6IEludGVycnVwdCBudW1iZXIuCisgKiBAZGV2X2lkOiBUaGUgZGV2aWNlIGNvbnRleHQgcG9pbnRlci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGRpcmVjdGx5IGNhbGxlZCBmcm9tIHRoZSBQQ0kgbGF5ZXIgYXMgYW4gaW50ZXJydXB0CisgKiBzZXJ2aWNlIHJvdXRpbmUgd2hlbiBkZXZpY2Ugd2l0aCBTTEktNCBpbnRlcmZhY2Ugc3BlYyBpcyBlbmFibGVkIHdpdGgKKyAqIE1TSS1YIG11bHRpLW1lc3NhZ2UgaW50ZXJydXB0IG1vZGUgYW5kIHRoZXJlIGlzIGEgRmxhc2ggT3B0aW1pemVkIEZhYnJpYworICogSU9DQiByaW5nIGV2ZW50IGluIHRoZSBIQkEuIEhvd2V2ZXIsIHdoZW4gdGhlIGRldmljZSBpcyBlbmFibGVkIHdpdGggZWl0aGVyCisgKiBNU0kgb3IgUGluLUlSUSBpbnRlcnJ1cHQgbW9kZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXMgcGFydCBvZiB0aGUKKyAqIGRldmljZS1sZXZlbCBpbnRlcnJ1cHQgaGFuZGxlci4gV2hlbiB0aGUgUENJIHNsb3QgaXMgaW4gZXJyb3IgcmVjb3ZlcnkKKyAqIG9yIHRoZSBIQkEgaXMgdW5kZXJnb2luZyBpbml0aWFsaXphdGlvbiwgdGhlIGludGVycnVwdCBoYW5kbGVyIHdpbGwgbm90CisgKiBwcm9jZXNzIHRoZSBpbnRlcnJ1cHQuIFRoZSBGbGFzaCBPcHRpbWl6ZWQgRmFicmljIHJpbmcgZXZlbnQgYXJlIGhhbmRsZWQgaW4KKyAqIHRoZSBpbnRycnVwdCBjb250ZXh0LiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRob3V0IGFueSBsb2NrIGhlbGQuCisgKiBJdCBnZXRzIHRoZSBoYmFsb2NrIHRvIGFjY2VzcyBhbmQgdXBkYXRlIFNMSSBkYXRhIHN0cnVjdHVyZXMuIE5vdGUgdGhhdCwKKyAqIHRoZSBFUSB0byBDUSBhcmUgb25lLXRvLW9uZSBtYXAgc3VjaCB0aGF0IHRoZSBFUSBpbmRleCBpcworICogZXF1YWwgdG8gdGhhdCBvZiBDUSBpbmRleC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgSVJRX0hBTkRMRUQgd2hlbiBpbnRlcnJ1cHQgaXMgaGFuZGxlZCBlbHNlIGl0CisgKiByZXR1cm5zIElSUV9OT05FLgorICoqLworaXJxcmV0dXJuX3QKK2xwZmNfc2xpNF9mb2ZfaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmE7CisJc3RydWN0IGxwZmNfZmNwX2VxX2hkbCAqZmNwX2VxX2hkbDsKKwlzdHJ1Y3QgbHBmY19xdWV1ZSAqZXE7CisJc3RydWN0IGxwZmNfZXFlICplcWU7CisJdW5zaWduZWQgbG9uZyBpZmxhZzsKKwlpbnQgZWNvdW50ID0gMDsKKwl1aW50MzJfdCBlcWlkeDsKKworCS8qIEdldCB0aGUgZHJpdmVyJ3MgcGhiYSBzdHJ1Y3R1cmUgZnJvbSB0aGUgZGV2X2lkICovCisJZmNwX2VxX2hkbCA9IChzdHJ1Y3QgbHBmY19mY3BfZXFfaGRsICopZGV2X2lkOworCXBoYmEgPSBmY3BfZXFfaGRsLT5waGJhOworCWVxaWR4ID0gZmNwX2VxX2hkbC0+aWR4OworCisJaWYgKHVubGlrZWx5KCFwaGJhKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJLyogR2V0IHRvIHRoZSBFUSBzdHJ1Y3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmVjdG9yICovCisJZXEgPSBwaGJhLT5zbGk0X2hiYS5mb2ZfZXE7CisJaWYgKHVubGlrZWx5KCFlcSkpCisJCXJldHVybiBJUlFfTk9ORTsKKworCS8qIENoZWNrIGRldmljZSBzdGF0ZSBmb3IgaGFuZGxpbmcgaW50ZXJydXB0ICovCisJaWYgKHVubGlrZWx5KGxwZmNfaW50cl9zdGF0ZV9jaGVjayhwaGJhKSkpIHsKKwkJZXEtPkVRX2JhZHN0YXRlKys7CisJCS8qIENoZWNrIGFnYWluIGZvciBsaW5rX3N0YXRlIHdpdGggbG9jayBoZWxkICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7CisJCWlmIChwaGJhLT5saW5rX3N0YXRlIDwgTFBGQ19MSU5LX0RPV04pCisJCQkvKiBGbHVzaCwgY2xlYXIgaW50ZXJydXB0LCBhbmQgcmVhcm0gdGhlIEVRICovCisJCQlscGZjX3NsaTRfZXFfZmx1c2gocGhiYSwgZXEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvKgorCSAqIFByb2Nlc3MgYWxsIHRoZSBldmVudCBvbiBGQ1AgZmFzdC1wYXRoIEVRCisJICovCisJd2hpbGUgKChlcWUgPSBscGZjX3NsaTRfZXFfZ2V0KGVxKSkpIHsKKwkJbHBmY19zbGk0X2ZvZl9oYW5kbGVfZXFlKHBoYmEsIGVxZSk7CisJCWlmICghKCsrZWNvdW50ICUgZXEtPmVudHJ5X3JlcG9zdCkpCisJCQlscGZjX3NsaTRfZXFfcmVsZWFzZShlcSwgTFBGQ19RVUVVRV9OT0FSTSk7CisJCWVxLT5FUV9wcm9jZXNzZWQrKzsKKwl9CisKKwkvKiBUcmFjayB0aGUgbWF4IG51bWJlciBvZiBFUUVzIHByb2Nlc3NlZCBpbiAxIGludHIgKi8KKwlpZiAoZWNvdW50ID4gZXEtPkVRX21heF9lcWUpCisJCWVxLT5FUV9tYXhfZXFlID0gZWNvdW50OworCisKKwlpZiAodW5saWtlbHkoZWNvdW50ID09IDApKSB7CisJCWVxLT5FUV9ub19lbnRyeSsrOworCisJCWlmIChwaGJhLT5pbnRyX3R5cGUgPT0gTVNJWCkKKwkJCS8qIE1TSS1YIHRyZWF0ZWQgaW50ZXJydXB0IHNlcnZlZCBhcyBubyBFUSBzaGFyZSBJTlQgKi8KKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19TTEksCisJCQkJCSI5MTQ1IE1TSS1YIGludGVycnVwdCB3aXRoIG5vIEVRRVxuIik7CisJCWVsc2UgeworCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfU0xJLAorCQkJCQkiOTE0NiBJU1IgaW50ZXJydXB0IHdpdGggbm8gRVFFXG4iKTsKKwkJCS8qIE5vbiBNU0ktWCB0cmVhdGVkIG9uIGludGVycnVwdCBhcyBFUSBzaGFyZSBJTlQgKi8KKwkJCXJldHVybiBJUlFfTk9ORTsKKwkJfQorCX0KKwkvKiBBbHdheXMgY2xlYXIgYW5kIHJlLWFybSB0aGUgZmFzdC1wYXRoIEVRICovCisJbHBmY19zbGk0X2VxX3JlbGVhc2UoZXEsIExQRkNfUVVFVUVfUkVBUk0pOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwogLyoqCiAgKiBscGZjX3NsaTRfaGJhX2ludHJfaGFuZGxlciAtIEhCQSBpbnRlcnJ1cHQgaGFuZGxlciB0byBTTEktNCBkZXZpY2UKICAqIEBpcnE6IEludGVycnVwdCBudW1iZXIuCkBAIC0xMjI4Nyw2ICsxMjUwOSwxMyBAQAogCQkJaGJhX2hhbmRsZWQgfD0gdHJ1ZTsKIAl9CiAKKwlpZiAocGhiYS0+Y2ZnX2ZvZikgeworCQloYmFfaXJxX3JjID0gbHBmY19zbGk0X2ZvZl9pbnRyX2hhbmRsZXIoaXJxLAorCQkJCQkmcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbFswXSk7CisJCWlmIChoYmFfaXJxX3JjID09IElSUV9IQU5ETEVEKQorCQkJaGJhX2hhbmRsZWQgfD0gdHJ1ZTsKKwl9CisKIAlyZXR1cm4gKGhiYV9oYW5kbGVkID09IHRydWUpID8gSVJRX0hBTkRMRUQgOiBJUlFfTk9ORTsKIH0gLyogbHBmY19zbGk0X2ludHJfaGFuZGxlciAqLwogCkBAIC0xNjU0NCw3ICsxNjc3Myw3IEBACiB7CiAJTElTVF9IRUFEKGNvbXBsZXRpb25zKTsKIAlzdHJ1Y3QgbHBmY19zbGlfcmluZyAqcHJpbmcgPSAmcGhiYS0+c2xpLnJpbmdbTFBGQ19FTFNfUklOR107Ci0Jc3RydWN0IGxwZmNfaW9jYnEgKnBpb2NicSA9IDA7CisJc3RydWN0IGxwZmNfaW9jYnEgKnBpb2NicSA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBpZmxhZ3MgPSAwOwogCWNoYXIgKmZhaWxfbXNnID0gTlVMTDsKIAlzdHJ1Y3QgbHBmY19zZ2xxICpzZ2xxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmgKaW5kZXggNmIwZjI0Ny4uNmYwNDA4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5oCkBAIC03OCw2ICs3OCw4IEBACiAjZGVmaW5lIExQRkNfRklQX0VMU19JRF9NQVNLCTB4YzAwMAkvKiBFTFNfSUQgcmFuZ2UgMC0zLCBub24tc2hpZnRlZCBtYXNrICovCiAjZGVmaW5lIExQRkNfRklQX0VMU19JRF9TSElGVAkxNAogCisjZGVmaW5lIExQRkNfSU9fT0FTCQkweDEwMDAwIC8qIE9BUyBGQ1AgSU8gKi8KKwogCXVpbnQzMl90IGRydnJUaW1lb3V0OwkvKiBkcml2ZXIgdGltZW91dCBpbiBzZWNvbmRzICovCiAJdWludDMyX3QgZmNwX3dxaWR4OwkvKiBpbmRleCB0byBGQ1Agd29yayBxdWV1ZSAqLwogCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydDsvKiB2aXJ0dWFsIHBvcnQgcG9pbnRlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGk0LmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaTQuaAppbmRleCAyOThjOGNkLi45YjhjZGE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaTQuaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaTQuaApAQCAtMzksNiArMzksMTAgQEAKICNkZWZpbmUgTFBGQ19GQ1BfSU9fQ0hBTl9NSU4gICAgICAgMQogI2RlZmluZSBMUEZDX0ZDUF9JT19DSEFOX01BWCAgICAgICAxNgogCisvKiBOdW1iZXIgb2YgY2hhbm5lbHMgdXNlZCBmb3IgRmxhc2ggT3B0aW1pemVkIEZhYnJpYyAoRk9GKSBvcGVyYXRpb25zICovCisKKyNkZWZpbmUgTFBGQ19GT0ZfSU9fQ0hBTl9OVU0gICAgICAgMQorCiAvKgogICogUHJvdmlkZSB0aGUgZGVmYXVsdCBGQ0YgUmVjb3JkIGF0dHJpYnV0ZXMgdXNlZCBieSB0aGUgZHJpdmVyCiAgKiB3aGVuIG5vbkZJUCBtb2RlIGlzIGNvbmZpZ3VyZWQgYW5kIHRoZXJlIGlzIG5vIG90aGVyIGRlZmF1bHQKQEAgLTM5OSw2ICs0MDMsNyBAQAogCXVpbnQzMl90IGlmX3BhZ2Vfc3o7CiAJdWludDMyX3QgcnFfZGJfd2luZG93OwogCXVpbnQzMl90IGxvb3Bia19zY29wZTsKKwl1aW50MzJfdCBvYXNfc3VwcG9ydGVkOwogCXVpbnQzMl90IGVxX3BhZ2VzX21heDsKIAl1aW50MzJfdCBlcWVfc2l6ZTsKIAl1aW50MzJfdCBjcV9wYWdlc19tYXg7CkBAIC00MzksNiArNDQ0LDggQEAKIAl1aW50OF90IGxua19ubzsKIH07CiAKKyNkZWZpbmUgTFBGQ19TTEk0X0hBTkRMRVJfQ05UCQkoTFBGQ19GQ1BfSU9fQ0hBTl9NQVgrIFwKKwkJCQkJIExQRkNfRk9GX0lPX0NIQU5fTlVNKQogI2RlZmluZSBMUEZDX1NMSTRfSEFORExFUl9OQU1FX1NaCTE2CiAKIC8qIFVzZWQgZm9yIElSUSB2ZWN0b3IgdG8gQ1BVIG1hcHBpbmcgKi8KQEAgLTUwNyw3ICs1MTQsNyBAQAogCXN0cnVjdCBscGZjX3JlZ2lzdGVyIHNsaV9pbnRmOwogCXN0cnVjdCBscGZjX3BjX3NsaTRfcGFyYW1zIHBjX3NsaTRfcGFyYW1zOwogCXN0cnVjdCBtc2l4X2VudHJ5ICptc2l4X2VudHJpZXM7Ci0JdWludDhfdCBoYW5kbGVyX25hbWVbTFBGQ19GQ1BfSU9fQ0hBTl9NQVhdW0xQRkNfU0xJNF9IQU5ETEVSX05BTUVfU1pdOworCXVpbnQ4X3QgaGFuZGxlcl9uYW1lW0xQRkNfU0xJNF9IQU5ETEVSX0NOVF1bTFBGQ19TTEk0X0hBTkRMRVJfTkFNRV9TWl07CiAJc3RydWN0IGxwZmNfZmNwX2VxX2hkbCAqZmNwX2VxX2hkbDsgLyogRkNQIHBlci1XUSBoYW5kbGUgKi8KIAogCS8qIFBvaW50ZXJzIHRvIHRoZSBjb25zdHJ1Y3RlZCBTTEk0IHF1ZXVlcyAqLwpAQCAtNTI3LDYgKzUzNCwxNyBAQAogCXVpbnQzMl90IHVscDBfbW9kZTsJLyogVUxQMCBwcm90b2NvbCBtb2RlICovCiAJdWludDMyX3QgdWxwMV9tb2RlOwkvKiBVTFAxIHByb3RvY29sIG1vZGUgKi8KIAorCXN0cnVjdCBscGZjX3F1ZXVlICpmb2ZfZXE7IC8qIEZsYXNoIE9wdGltaXplZCBGYWJyaWMgRXZlbnQgcXVldWUgKi8KKworCS8qIE9wdGltaXplZCBBY2Nlc3MgU3RvcmFnZSBzcGVjaWZpYyBxdWV1ZXMvc3RydWN0dXJlcyAqLworCisJc3RydWN0IGxwZmNfcXVldWUgKm9hc19jcTsgLyogT0FTIGNvbXBsZXRpb24gcXVldWUgKi8KKwlzdHJ1Y3QgbHBmY19xdWV1ZSAqb2FzX3dxOyAvKiBPQVMgV29yayBxdWV1ZSAqLworCXN0cnVjdCBscGZjX3NsaV9yaW5nICpvYXNfcmluZzsKKwl1aW50NjRfdCBvYXNfbmV4dF9sdW47CisJdWludDhfdCBvYXNfbmV4dF90Z3Rfd3dwbls4XTsKKwl1aW50OF90IG9hc19uZXh0X3ZwdF93d3BuWzhdOworCiAJLyogU2V0dXAgaW5mb3JtYXRpb24gZm9yIHZhcmlvdXMgcXVldWUgcGFyYW1ldGVycyAqLwogCWludCBlcV9lc2l6ZTsKIAlpbnQgZXFfZWNvdW50OwpAQCAtNTg5LDYgKzYwNyw3IEBACiAJc3RydWN0IGxwZmNfdmVjdG9yX21hcF9pbmZvICpjcHVfbWFwOwogCXVpbnQxNl90IG51bV9vbmxpbmVfY3B1OwogCXVpbnQxNl90IG51bV9wcmVzZW50X2NwdTsKKwl1aW50MTZfdCBjdXJyX2Rpc3BfY3B1OwogfTsKIAogZW51bSBscGZjX3NnZV90eXBlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdmVyc2lvbi5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmgKaW5kZXggZTMwOTRjNC4uZTMyY2JlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmgKQEAgLTE4LDcgKzE4LDcgQEAKICAqIGluY2x1ZGVkIHdpdGggdGhpcyBwYWNrYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBMUEZDX0RSSVZFUl9WRVJTSU9OICI4LjMuNDMiCisjZGVmaW5lIExQRkNfRFJJVkVSX1ZFUlNJT04gIjguMy40NSIKICNkZWZpbmUgTFBGQ19EUklWRVJfTkFNRQkJImxwZmMiCiAKIC8qIFVzZWQgZm9yIFNMSSAyLzMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmMKaW5kZXggODE2ZGIxMi4uYjc3NzA1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmMKQEAgLTUzMSwxMyArNTMxLDYgQEAKIAlpbnQJdGFyZ2V0ID0gMDsKIAlpbnQJbGRydl9udW0gPSAwOyAgIC8qIGxvZ2ljYWwgZHJpdmUgbnVtYmVyICovCiAKLQotCS8qCi0JICogZmlsdGVyIHRoZSBpbnRlcm5hbCBhbmQgaW9jdGwgY29tbWFuZHMKLQkgKi8KLQlpZigoY21kLT5jbW5kWzBdID09IE1FR0FfSU5URVJOQUxfQ01EKSkKLQkJcmV0dXJuIChzY2JfdCAqKWNtZC0+aG9zdF9zY3JpYmJsZTsKLQogCS8qCiAJICogV2Uga25vdyB3aGF0IGNoYW5uZWxzIG91ciBsb2dpY2FsIGRyaXZlcyBhcmUgb24gLSBtZWdhX2ZpbmRfY2FyZCgpCiAJICovCkBAIC0xNDM5LDE5ICsxNDMyLDIyIEBACiAKIAkJY21kaWQgPSBjb21wbGV0ZWRbaV07CiAKLQkJaWYoIGNtZGlkID09IENNRElEX0lOVF9DTURTICkgeyAvKiBpbnRlcm5hbCBjb21tYW5kICovCisJCS8qCisJCSAqIE9ubHkgZnJlZSBTQ0JzIGZvciB0aGUgY29tbWFuZHMgY29taW5nIGRvd24gZnJvbSB0aGUKKwkJICogbWlkLWxheWVyLCBub3QgZm9yIHdoaWNoIHdlcmUgaXNzdWVkIGludGVybmFsbHkKKwkJICoKKwkJICogRm9yIGludGVybmFsIGNvbW1hbmQsIHJlc3RvcmUgdGhlIHN0YXR1cyByZXR1cm5lZCBieSB0aGUKKwkJICogZmlybXdhcmUgc28gdGhhdCB1c2VyIGNhbiBpbnRlcnByZXQgaXQuCisJCSAqLworCQlpZiAoY21kaWQgPT0gQ01ESURfSU5UX0NNRFMpIHsKIAkJCXNjYiA9ICZhZGFwdGVyLT5pbnRfc2NiOwotCQkJY21kID0gc2NiLT5jbWQ7Ci0JCQltYm94ID0gKG1ib3hfdCAqKXNjYi0+cmF3X21ib3g7CiAKLQkJCS8qCi0JCQkgKiBJbnRlcm5hbCBjb21tYW5kIGludGVyZmFjZSBkbyBub3QgZmlyZSB0aGUgZXh0ZW5kZWQKLQkJCSAqIHBhc3N0aHJ1IG9yIDY0LWJpdCBwYXNzdGhydQotCQkJICovCi0JCQlwdGhydSA9IHNjYi0+cHRocnU7CisJCQlsaXN0X2RlbF9pbml0KCZzY2ItPmxpc3QpOworCQkJc2NiLT5zdGF0ZSA9IFNDQl9GUkVFOwogCi0JCX0KLQkJZWxzZSB7CisJCQlhZGFwdGVyLT5pbnRfc3RhdHVzID0gc3RhdHVzOworCQkJY29tcGxldGUoJmFkYXB0ZXItPmludF93YWl0cSk7CisJCX0gZWxzZSB7CiAJCQlzY2IgPSAmYWRhcHRlci0+c2NiX2xpc3RbY21kaWRdOwogCiAJCQkvKgpAQCAtMTY0MCwyNSArMTYzNiw3IEBACiAJCQkJY21kLT5yZXN1bHQgfD0gKERJRF9CQURfVEFSR0VUIDw8IDE2KXxzdGF0dXM7CiAJCX0KIAotCQkvKgotCQkgKiBPbmx5IGZyZWUgU0NCcyBmb3IgdGhlIGNvbW1hbmRzIGNvbWluZyBkb3duIGZyb20gdGhlCi0JCSAqIG1pZC1sYXllciwgbm90IGZvciB3aGljaCB3ZXJlIGlzc3VlZCBpbnRlcm5hbGx5Ci0JCSAqCi0JCSAqIEZvciBpbnRlcm5hbCBjb21tYW5kLCByZXN0b3JlIHRoZSBzdGF0dXMgcmV0dXJuZWQgYnkgdGhlCi0JCSAqIGZpcm13YXJlIHNvIHRoYXQgdXNlciBjYW4gaW50ZXJwcmV0IGl0LgotCQkgKi8KLQkJaWYoIGNtZGlkID09IENNRElEX0lOVF9DTURTICkgeyAvKiBpbnRlcm5hbCBjb21tYW5kICovCi0JCQljbWQtPnJlc3VsdCA9IHN0YXR1czsKLQotCQkJLyoKLQkJCSAqIFJlbW92ZSB0aGUgaW50ZXJuYWwgY29tbWFuZCBmcm9tIHRoZSBwZW5kaW5nIGxpc3QKLQkJCSAqLwotCQkJbGlzdF9kZWxfaW5pdCgmc2NiLT5saXN0KTsKLQkJCXNjYi0+c3RhdGUgPSBTQ0JfRlJFRTsKLQkJfQotCQllbHNlIHsKLQkJCW1lZ2FfZnJlZV9zY2IoYWRhcHRlciwgc2NiKTsKLQkJfQorCQltZWdhX2ZyZWVfc2NiKGFkYXB0ZXIsIHNjYik7CiAKIAkJLyogQWRkIFNjc2lfQ29tbWFuZCB0byBlbmQgb2YgY29tcGxldGVkIHF1ZXVlICovCiAJCWxpc3RfYWRkX3RhaWwoU0NTSV9MSVNUKGNtZCksICZhZGFwdGVyLT5jb21wbGV0ZWRfbGlzdCk7CkBAIC00MTMzLDIzICs0MTExLDE1IEBACiAgKiBUaGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgcGFzc3RocnUgc3RydWN0dXJlIGlmIHRoZSBjb21tYW5kCiAgKiB0byBiZSBmaXJlZCBpcyBhIHBhc3N0aHJ1IGNvbW1hbmQKICAqCi0gKiBsb2Nrc2NvcGUgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBhY3F1aXJlZCB0aGUgbG9jay4gT2YKLSAqIGNvdXJzZSwgdGhlIGNhbGxlciBtdXN0IGtub3cgd2hpY2ggbG9jayB3ZSBhcmUgdGFsa2luZyBhYm91dC4KLSAqCiAgKiBOb3RlOiBwYXJhbWV0ZXIgJ3B0aHJ1JyBpcyBudWxsIGZvciBub24tcGFzc3RocnUgY29tbWFuZHMuCiAgKi8KIHN0YXRpYyBpbnQKIG1lZ2FfaW50ZXJuYWxfY29tbWFuZChhZGFwdGVyX3QgKmFkYXB0ZXIsIG1lZ2FjbWRfdCAqbWMsIG1lZ2FfcGFzc3RocnUgKnB0aHJ1KQogewotCVNjc2lfQ21uZAkqc2NtZDsKLQlzdHJ1Y3QJc2NzaV9kZXZpY2UgKnNkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzY2JfdAkqc2NiOwogCWludAlydmFsOwogCi0Jc2NtZCA9IHNjc2lfYWxsb2NhdGVfY29tbWFuZChHRlBfS0VSTkVMKTsKLQlpZiAoIXNjbWQpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJLyoKIAkgKiBUaGUgaW50ZXJuYWwgY29tbWFuZHMgc2hhcmUgb25lIGNvbW1hbmQgaWQgYW5kIGhlbmNlIGFyZQogCSAqIHNlcmlhbGl6ZWQuIFRoaXMgaXMgc28gYmVjYXVzZSB3ZSB3YW50IHRvIHJlc2VydmUgbWF4aW11bSBudW1iZXIgb2YKQEAgLTQxNjAsNzMgKzQxMzAsNDUgQEAKIAlzY2IgPSAmYWRhcHRlci0+aW50X3NjYjsKIAltZW1zZXQoc2NiLCAwLCBzaXplb2Yoc2NiX3QpKTsKIAotCXNkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NzaV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKLQlzY21kLT5kZXZpY2UgPSBzZGV2OwotCi0JbWVtc2V0KGFkYXB0ZXItPmludF9jZGIsIDAsIHNpemVvZihhZGFwdGVyLT5pbnRfY2RiKSk7Ci0Jc2NtZC0+Y21uZCA9IGFkYXB0ZXItPmludF9jZGI7Ci0Jc2NtZC0+ZGV2aWNlLT5ob3N0ID0gYWRhcHRlci0+aG9zdDsKLQlzY21kLT5ob3N0X3NjcmliYmxlID0gKHZvaWQgKilzY2I7Ci0Jc2NtZC0+Y21uZFswXSA9IE1FR0FfSU5URVJOQUxfQ01EOwotCi0Jc2NiLT5zdGF0ZSB8PSBTQ0JfQUNUSVZFOwotCXNjYi0+Y21kID0gc2NtZDsKKwlzY2ItPmlkeCA9IENNRElEX0lOVF9DTURTOworCXNjYi0+c3RhdGUgfD0gU0NCX0FDVElWRSB8IFNDQl9QRU5EUTsKIAogCW1lbWNweShzY2ItPnJhd19tYm94LCBtYywgc2l6ZW9mKG1lZ2FjbWRfdCkpOwogCiAJLyoKIAkgKiBJcyBpdCBhIHBhc3N0aHJ1IGNvbW1hbmQKIAkgKi8KLQlpZiggbWMtPmNtZCA9PSBNRUdBX01CT1hDTURfUEFTU1RIUlUgKSB7Ci0KKwlpZiAobWMtPmNtZCA9PSBNRUdBX01CT1hDTURfUEFTU1RIUlUpCiAJCXNjYi0+cHRocnUgPSBwdGhydTsKLQl9CiAKLQlzY2ItPmlkeCA9IENNRElEX0lOVF9DTURTOwotCi0JbWVnYXJhaWRfcXVldWVfbGNrKHNjbWQsIG1lZ2FfaW50ZXJuYWxfZG9uZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZzY2ItPmxpc3QsICZhZGFwdGVyLT5wZW5kaW5nX2xpc3QpOworCS8qCisJICogQ2hlY2sgaWYgdGhlIEhCQSBpcyBpbiBxdWllc2NlbnQgc3RhdGUsIGUuZy4sIGR1cmluZyBhCisJICogZGVsZXRlIGxvZ2ljYWwgZHJpdmUgb3BlcnRpb24uIElmIGl0IGlzLCBkb24ndCBydW4KKwkgKiB0aGUgcGVuZGluZ19saXN0LgorCSAqLworCWlmIChhdG9taWNfcmVhZCgmYWRhcHRlci0+cXVpZXNjZW50KSA9PSAwKQorCQltZWdhX3J1bnBlbmRxKGFkYXB0ZXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKIAogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFkYXB0ZXItPmludF93YWl0cSk7CiAKLQlydmFsID0gc2NtZC0+cmVzdWx0OwotCW1jLT5zdGF0dXMgPSBzY21kLT5yZXN1bHQ7Ci0Ja2ZyZWUoc2Rldik7CisJbWMtPnN0YXR1cyA9IHJ2YWwgPSBhZGFwdGVyLT5pbnRfc3RhdHVzOwogCiAJLyoKIAkgKiBQcmludCBhIGRlYnVnIG1lc3NhZ2UgZm9yIGFsbCBmYWlsZWQgY29tbWFuZHMuIEFwcGxpY2F0aW9ucyBjYW4gdXNlCiAJICogdGhpcyBpbmZvcm1hdGlvbi4KIAkgKi8KLQlpZiggc2NtZC0+cmVzdWx0ICYmIHRyYWNlX2xldmVsICkgeworCWlmIChydmFsICYmIHRyYWNlX2xldmVsKSB7CiAJCXByaW50aygibWVnYXJhaWQ6IGNtZCBbJXgsICV4LCAleF0gc3RhdHVzOlsleF1cbiIsCi0JCQltYy0+Y21kLCBtYy0+b3Bjb2RlLCBtYy0+c3Vib3Bjb2RlLCBzY21kLT5yZXN1bHQpOworCQkJbWMtPmNtZCwgbWMtPm9wY29kZSwgbWMtPnN1Ym9wY29kZSwgcnZhbCk7CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5pbnRfbXR4KTsKLQotCXNjc2lfZnJlZV9jb21tYW5kKEdGUF9LRVJORUwsIHNjbWQpOwotCiAJcmV0dXJuIHJ2YWw7CiB9CiAKLQotLyoqCi0gKiBtZWdhX2ludGVybmFsX2RvbmUoKQotICogQHNjbWQgLSBpbnRlcm5hbCBzY3NpIGNvbW1hbmQKLSAqCi0gKiBDYWxsYmFjayByb3V0aW5lIGZvciBpbnRlcm5hbCBjb21tYW5kcy4KLSAqLwotc3RhdGljIHZvaWQKLW1lZ2FfaW50ZXJuYWxfZG9uZShTY3NpX0NtbmQgKnNjbWQpCi17Ci0JYWRhcHRlcl90CSphZGFwdGVyOwotCi0JYWRhcHRlciA9IChhZGFwdGVyX3QgKilzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwotCi0JY29tcGxldGUoJmFkYXB0ZXItPmludF93YWl0cSk7Ci0KLX0KLQotCiBzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBtZWdhcmFpZF90ZW1wbGF0ZSA9IHsKIAkubW9kdWxlCQkJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCQkJPSAiTWVnYVJBSUQiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmggYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuaAppbmRleCA0ZDBjZTRlLi41MDhkNjVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuaAorKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuaApAQCAtODUzLDEwICs4NTMsMTAgQEAKIAogCXU4CXNnbGVuOwkvKiBmL3cgc3VwcG9ydGVkIHNjYXR0ZXItZ2F0aGVyIGxpc3QgbGVuZ3RoICovCiAKLQl1bnNpZ25lZCBjaGFyIGludF9jZGJbTUFYX0NPTU1BTkRfU0laRV07CiAJc2NiX3QJCQlpbnRfc2NiOwogCXN0cnVjdCBtdXRleAkJaW50X210eDsJLyogVG8gc3luY2hyb25pemUgdGhlIGludGVybmFsCiAJCQkJCQljb21tYW5kcyAqLworCWludAkJCWludF9zdGF0dXM7CS8qIHN0YXR1cyBvZiBpbnRlcm5hbCBjbWQgKi8KIAlzdHJ1Y3QgY29tcGxldGlvbglpbnRfd2FpdHE7CS8qIHdhaXQgcXVldWUgZm9yIGludGVybmFsCiAJCQkJCQkgY21kcyAqLwogCkBAIC0xMDA0LDcgKzEwMDQsNiBAQAogc3RhdGljIGludCBtZWdhX2RvX2RlbF9sb2dkcnYoYWRhcHRlcl90ICosIGludCk7CiBzdGF0aWMgdm9pZCBtZWdhX2dldF9tYXhfc2dsKGFkYXB0ZXJfdCAqKTsKIHN0YXRpYyBpbnQgbWVnYV9pbnRlcm5hbF9jb21tYW5kKGFkYXB0ZXJfdCAqLCBtZWdhY21kX3QgKiwgbWVnYV9wYXNzdGhydSAqKTsKLXN0YXRpYyB2b2lkIG1lZ2FfaW50ZXJuYWxfZG9uZShTY3NpX0NtbmQgKik7CiBzdGF0aWMgaW50IG1lZ2Ffc3VwcG9ydF9jbHVzdGVyKGFkYXB0ZXJfdCAqKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbW0uYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tbS5jCmluZGV4IGRmZmZkMGYuLmE3MDY5MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tbS5jCkBAIC00ODYsNiArNDg2LDggQEAKIAogCXB0aHJ1MzItPmRhdGF4ZmVyYWRkcgk9IGtpb2MtPmJ1Zl9wYWRkcjsKIAlpZiAoa2lvYy0+ZGF0YV9kaXIgJiBVSU9DX1dSKSB7CisJCWlmIChwdGhydTMyLT5kYXRheGZlcmxlbiA+IGtpb2MtPnhmZXJsZW4pCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKGNvcHlfZnJvbV91c2VyKGtpb2MtPmJ1Zl92YWRkciwga2lvYy0+dXNlcl9kYXRhLAogCQkJCQkJcHRocnUzMi0+ZGF0YXhmZXJsZW4pKSB7CiAJCQlyZXR1cm4gKC1FRkFVTFQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhcy5oIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhcy5oCmluZGV4IDM0NDUyZWEuLjMyMTY2YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXMuaAorKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmgKQEAgLTMzLDkgKzMzLDkgQEAKIC8qCiAgKiBNZWdhUkFJRCBTQVMgRHJpdmVyIG1ldGEgZGF0YQogICovCi0jZGVmaW5lIE1FR0FTQVNfVkVSU0lPTgkJCQkiMDYuNzAwLjA2LjAwLXJjMSIKLSNkZWZpbmUgTUVHQVNBU19SRUxEQVRFCQkJCSJBdWcuIDMxLCAyMDEzIgotI2RlZmluZSBNRUdBU0FTX0VYVF9WRVJTSU9OCQkJIlNhdC4gQXVnLiAzMSAxNzowMDowMCBQRFQgMjAxMyIKKyNkZWZpbmUgTUVHQVNBU19WRVJTSU9OCQkJCSIwNi44MDMuMDEuMDAtcmMxIgorI2RlZmluZSBNRUdBU0FTX1JFTERBVEUJCQkJIk1hci4gMTAsIDIwMTQiCisjZGVmaW5lIE1FR0FTQVNfRVhUX1ZFUlNJT04JCQkiTW9uLiBNYXIuIDEwIDE3OjAwOjAwIFBEVCAyMDE0IgogCiAvKgogICogRGV2aWNlIElEcwpAQCAtNDgsNiArNDgsNyBAQAogI2RlZmluZQlQQ0lfREVWSUNFX0lEX0xTSV9TQVMwMDczU0tJTk5ZCQkweDAwNzMKICNkZWZpbmUJUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3MVNLSU5OWQkJMHgwMDcxCiAjZGVmaW5lCVBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTgkJMHgwMDViCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJX1BMQVNNQQkJMHgwMDJmCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIJCTB4MDA1ZAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xTSV9GVVJZCQkJMHgwMDVmCiAKQEAgLTU1OSw3ICs1NjAsOCBAQAogCQl1OCBQQ0lFOjE7CiAJCXU4IGlTQ1NJOjE7CiAJCXU4IFNBU18zRzoxOwotCQl1OCByZXNlcnZlZF8wOjQ7CisJCXU4IFNSSU9WOjE7CisJCXU4IHJlc2VydmVkXzA6MzsKIAkJdTggcmVzZXJ2ZWRfMVs2XTsKIAkJdTggcG9ydF9jb3VudDsKIAkJdTY0IHBvcnRfYWRkcls4XTsKQEAgLTgzOSw3ICs4NDEsMTIgQEAKIAogCXN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjdBNGggKi8KICNpZiAgIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQotCQl1MzIgICAgIHJlc2VydmVkOjExOworCQl1MzIgICAgIHJlc2VydmVkOjU7CisJCXUzMglhY3RpdmVQYXNzaXZlOjI7CisJCXUzMglzdXBwb3J0Q29uZmlnQXV0b0JhbGFuY2U6MTsKKwkJdTMyCW1waW86MTsKKwkJdTMyCXN1cHBvcnREYXRhTERvblNTQ0FycmF5OjE7CisJCXUzMglzdXBwb3J0UG9pbnRJblRpbWVQcm9ncmVzczoxOwogCQl1MzIgICAgIHN1cHBvcnRVbmV2ZW5TcGFuczoxOwogCQl1MzIgICAgIGRlZGljYXRlZEhvdFNwYXJlc0xpbWl0ZWQ6MTsKIAkJdTMyICAgICBoZWFkbGVzc01vZGU6MTsKQEAgLTg4Niw3ICs4OTMsMTIgQEAKIAogCiAJCXUzMiAgICAgc3VwcG9ydFVuZXZlblNwYW5zOjE7Ci0JCXUzMiAgICAgcmVzZXJ2ZWQ6MTE7CisJCXUzMglzdXBwb3J0UG9pbnRJblRpbWVQcm9ncmVzczoxOworCQl1MzIJc3VwcG9ydERhdGFMRG9uU1NDQXJyYXk6MTsKKwkJdTMyCW1waW86MTsKKwkJdTMyCXN1cHBvcnRDb25maWdBdXRvQmFsYW5jZToxOworCQl1MzIJYWN0aXZlUGFzc2l2ZToyOworCQl1MzIgICAgIHJlc2VydmVkOjU7CiAjZW5kaWYKIAl9IGFkYXB0ZXJPcGVyYXRpb25zMjsKIApAQCAtOTE0LDggKzkyNiwxNCBAQAogCX0gY2x1c3RlcjsKIAogCWNoYXIgY2x1c3RlcklkWzE2XTsgICAgICAgICAgICAgICAgICAgICAvKjdENGggKi8KKwlzdHJ1Y3QgeworCQl1OCAgbWF4VkZzU3VwcG9ydGVkOyAgICAgICAgICAgIC8qMHg3RTQqLworCQl1OCAgbnVtVkZzRW5hYmxlZDsgICAgICAgICAgICAgIC8qMHg3RTUqLworCQl1OCAgcmVxdWVzdG9ySWQ7ICAgICAgICAgICAgICAgIC8qMHg3RTYgMDpQRiwgMTpWRjEsIDI6VkYyKi8KKwkJdTggIHJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKjB4N0U3Ki8KKwl9IGlvdjsKIAotCXU4ICAgICAgICAgIHBhZFsweDgwMC0weDdFNF07ICAgICAgICAgICAvKjdFNCAqLworCXU4ICAgICAgICAgIHBhZFsweDgwMC0weDdFOF07ICAgICAgICAgICAvKjB4N0U4IHBhZCB0byAyayAqLwogfSBfX3BhY2tlZDsKIAogLyoKQEAgLTk4Niw3ICsxMDA0LDkgQEAKIAogI2RlZmluZSBNRklfT0JfSU5UUl9TVEFUVVNfTUFTSwkJCTB4MDAwMDAwMDIKICNkZWZpbmUgTUZJX1BPTExfVElNRU9VVF9TRUNTCQkJNjAKLQorI2RlZmluZSBNRUdBU0FTX1NSSU9WX0hFQVJUQkVBVF9JTlRFUlZBTF9WRgkoNSAqIEhaKQorI2RlZmluZSBNRUdBU0FTX09DUl9TRVRUTEVfVElNRV9WRgkJKDEwMDAgKiAzMCkKKyNkZWZpbmUgTUVHQVNBU19ST1VUSU5FX1dBSVRfVElNRV9WRgkJMzAwCiAjZGVmaW5lIE1GSV9SRVBMWV8xMDc4X01FU1NBR0VfSU5URVJSVVBUCTB4ODAwMDAwMDAKICNkZWZpbmUgTUZJX1JFUExZX0dFTjJfTUVTU0FHRV9JTlRFUlJVUFQJMHgwMDAwMDAwMQogI2RlZmluZSBNRklfR0VOMl9FTkFCTEVfSU5URVJSVVBUX01BU0sJCSgweDAwMDAwMDAxIHwgMHgwMDAwMDAwNCkKQEAgLTEzNDcsOSArMTM2NywxNSBAQAogdW5pb24gbWVnYXNhc19ldnRfY2xhc3NfbG9jYWxlIHsKIAogCXN0cnVjdCB7CisjaWZuZGVmIF9fQklHX0VORElBTl9CSVRGSUVMRAogCQl1MTYgbG9jYWxlOwogCQl1OCByZXNlcnZlZDsKIAkJczggY2xhc3M7CisjZWxzZQorCQlzOCBjbGFzczsKKwkJdTggcmVzZXJ2ZWQ7CisJCXUxNiBsb2NhbGU7CisjZW5kaWYKIAl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtZW1iZXJzOwogCiAJdTMyIHdvcmQ7CkBAIC0xNTIzLDYgKzE1NDksMTIgQEAKIAlkbWFfYWRkcl90IHByb2R1Y2VyX2g7CiAJdTMyICpjb25zdW1lcjsKIAlkbWFfYWRkcl90IGNvbnN1bWVyX2g7CisJc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OICp2Zl9hZmZpbGlhdGlvbjsKKwlkbWFfYWRkcl90IHZmX2FmZmlsaWF0aW9uX2g7CisJc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OXzExMSAqdmZfYWZmaWxpYXRpb25fMTExOworCWRtYV9hZGRyX3QgdmZfYWZmaWxpYXRpb25fMTExX2g7CisJc3RydWN0IE1SX0NUUkxfSEJfSE9TVF9NRU0gKmhiX2hvc3RfbWVtOworCWRtYV9hZGRyX3QgaGJfaG9zdF9tZW1faDsKIAogCXUzMiAqcmVwbHlfcXVldWU7CiAJZG1hX2FkZHJfdCByZXBseV9xdWV1ZV9oOwpAQCAtMTU5OCwxMCArMTYzMCw3MyBAQAogCXVuc2lnbmVkIGxvbmcgYmFyOwogCWxvbmcgcmVzZXRfZmxhZ3M7CiAJc3RydWN0IG11dGV4IHJlc2V0X211dGV4OworCXN0cnVjdCB0aW1lcl9saXN0IHNyaW92X2hlYXJ0YmVhdF90aW1lcjsKKwljaGFyIHNraXBfaGVhcnRiZWF0X3RpbWVyX2RlbDsKKwl1OCByZXF1ZXN0b3JJZDsKKwl1NjQgaW5pdGlhdG9yX3Nhc19hZGRyZXNzOworCXU2NCBsZF9zYXNfYWRkcmVzc1s2NF07CisJY2hhciBQbGFzbWFGVzExMTsKKwljaGFyIG1waW87CiAJaW50IHRocm90dGxlcXVldWVkZXB0aDsKIAl1OCBtYXNrX2ludGVycnVwdHM7CiAJdTggaXNfaW1yOwogfTsKK3N0cnVjdCBNUl9MRF9WRl9NQVAgeworCXUzMiBzaXplOworCXVuaW9uIE1SX0xEX1JFRiByZWY7CisJdTggbGRWZkNvdW50OworCXU4IHJlc2VydmVkWzZdOworCXU4IHBvbGljeVsxXTsKK307CisKK3N0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTiB7CisJdTMyIHNpemU7CisJdTggbGRDb3VudDsKKwl1OCB2ZkNvdW50OworCXU4IHRoaXNWZjsKKwl1OCByZXNlcnZlZFs5XTsKKwlzdHJ1Y3QgTVJfTERfVkZfTUFQIG1hcFsxXTsKK307CisKKy8qIFBsYXNtYSAxLjExIEZXIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgc3RydWN0dXJlcyAqLworI2RlZmluZSBJT1ZfMTExX09GRlNFVCAweDdDRQorI2RlZmluZSBNQVhfVklSVFVBTF9GVU5DVElPTlMgOAorCitzdHJ1Y3QgSU9WXzExMSB7CisJdTggbWF4VkZzU3VwcG9ydGVkOworCXU4IG51bVZGc0VuYWJsZWQ7CisJdTggcmVxdWVzdG9ySWQ7CisJdTggcmVzZXJ2ZWRbNV07Cit9OworCitzdHJ1Y3QgTVJfTERfVkZfTUFQXzExMSB7CisJdTggdGFyZ2V0SWQ7CisJdTggcmVzZXJ2ZWRbM107CisJdTggcG9saWN5W01BWF9WSVJUVUFMX0ZVTkNUSU9OU107Cit9OworCitzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT05fMTExIHsKKwl1OCB2ZENvdW50OworCXU4IHZmQ291bnQ7CisJdTggdGhpc1ZmOworCXU4IHJlc2VydmVkWzVdOworCXN0cnVjdCBNUl9MRF9WRl9NQVBfMTExIG1hcFtNQVhfTE9HSUNBTF9EUklWRVNdOworfTsKKworc3RydWN0IE1SX0NUUkxfSEJfSE9TVF9NRU0geworCXN0cnVjdCB7CisJCXUzMiBmd0NvdW50ZXI7CS8qIEZpcm13YXJlIGhlYXJ0IGJlYXQgY291bnRlciAqLworCQlzdHJ1Y3QgeworCQkJdTMyIGRlYnVnbW9kZToxOyAvKiAxPUZpcm13YXJlIGlzIGluIGRlYnVnIG1vZGUuCisJCQkJCSAgICBIZWFydCBiZWF0IHdpbGwgbm90IGJlIHVwZGF0ZWQuICovCisJCQl1MzIgcmVzZXJ2ZWQ6MzE7CisJCX0gZGVidWc7CisJCXUzMiByZXNlcnZlZF9md1s2XTsKKwkJdTMyIGRyaXZlckNvdW50ZXI7IC8qIERyaXZlciBoZWFydCBiZWF0IGNvdW50ZXIuICAweDIwICovCisJCXUzMiByZXNlcnZlZF9kcml2ZXJbN107CisJfSBIQjsKKwl1OCBwYWRbMHg0MDAtMHg0MF07Cit9OwogCiBlbnVtIHsKIAlNRUdBU0FTX0hCQV9PUEVSQVRJT05BTAkJCT0gMCwKQEAgLTE2MDksNiArMTcwNCw3IEBACiAJTUVHQVNBU19BRFBSRVNFVF9TTV9GV19SRVNFVF9TVUNDRVNTCT0gMiwKIAlNRUdBU0FTX0FEUFJFU0VUX1NNX09QRVJBVElPTkFMCQk9IDMsCiAJTUVHQVNBU19IV19DUklUSUNBTF9FUlJPUgkJPSA0LAorCU1FR0FTQVNfQURQUkVTRVRfU01fUE9MTElORwkJPSA1LAogCU1FR0FTQVNfQURQUkVTRVRfSU5QUk9HX1NJR04JCT0gMHhERUFEREVBRCwKIH07CiAKQEAgLTE3MjgsNyArMTgyNCw3IEBACiAJCSAgICBzdHJ1Y3QgSU9fUkVRVUVTVF9JTkZPICppb19pbmZvLAogCQkgICAgc3RydWN0IFJBSURfQ09OVEVYVCAqcFJBSURfQ29udGV4dCwKIAkJICAgIHN0cnVjdCBNUl9GV19SQUlEX01BUF9BTEwgKm1hcCwgdTggKipyYWlkTFVOKTsKLXUxNiBNUl9UYXJnZXRJZFRvTGRHZXQodTMyIGxkVGd0SWQsIHN0cnVjdCBNUl9GV19SQUlEX01BUF9BTEwgKm1hcCk7Cit1OCBNUl9UYXJnZXRJZFRvTGRHZXQodTMyIGxkVGd0SWQsIHN0cnVjdCBNUl9GV19SQUlEX01BUF9BTEwgKm1hcCk7CiBzdHJ1Y3QgTVJfTERfUkFJRCAqTVJfTGRSYWlkR2V0KHUzMiBsZCwgc3RydWN0IE1SX0ZXX1JBSURfTUFQX0FMTCAqbWFwKTsKIHUxNiBNUl9BclBkR2V0KHUzMiBhciwgdTMyIGFybSwgc3RydWN0IE1SX0ZXX1JBSURfTUFQX0FMTCAqbWFwKTsKIHUxNiBNUl9MZFNwYW5BcnJheUdldCh1MzIgbGQsIHUzMiBzcGFuLCBzdHJ1Y3QgTVJfRldfUkFJRF9NQVBfQUxMICptYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19iYXNlLmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Jhc2UuYwppbmRleCAzYjdhZDEwLi5kODRkMDJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Jhc2UuYworKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Jhc2UuYwpAQCAtMTgsNyArMTgsNyBAQAogICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKgogICogIEZJTEU6IG1lZ2FyYWlkX3Nhc19iYXNlLmMKLSAqICBWZXJzaW9uIDogMDYuNzAwLjA2LjAwLXJjMQorICogIFZlcnNpb24gOiAwNi44MDMuMDEuMDAtcmMxCiAgKgogICogIEF1dGhvcnM6IExTSSBDb3Jwb3JhdGlvbgogICogICAgICAgICAgIFNyZWVuaXZhcyBCYWdhbGtvdGUKQEAgLTc1LDYgKzc1LDEwIEBACiBtb2R1bGVfcGFyYW0obXNpeF92ZWN0b3JzLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhtc2l4X3ZlY3RvcnMsICJNU0ktWCBtYXggdmVjdG9yIGNvdW50LiBEZWZhdWx0OiBTZXQgYnkgRlciKTsKIAorc3RhdGljIGludCBhbGxvd192Zl9pb2N0bHM7Cittb2R1bGVfcGFyYW0oYWxsb3dfdmZfaW9jdGxzLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhhbGxvd192Zl9pb2N0bHMsICJBbGxvdyBpb2N0bHMgaW4gU1ItSU9WIFZGIG1vZGUuIERlZmF1bHQ6IDAiKTsKKwogc3RhdGljIGludCB0aHJvdHRsZXF1ZXVlZGVwdGggPSBNRUdBU0FTX1RIUk9UVExFX1FVRVVFX0RFUFRIOwogbW9kdWxlX3BhcmFtKHRocm90dGxlcXVldWVkZXB0aCwgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0ModGhyb3R0bGVxdWV1ZWRlcHRoLApAQCAtMTIyLDYgKzEyNiw4IEBACiAJLyogeHNjYWxlIElPUCAqLwogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pfSwKIAkvKiBGdXNpb24gKi8KKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9MU0lfUExBU01BKX0sCisJLyogUGxhc21hICovCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpfSwKIAkvKiBJbnZhZGVyICovCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTFNJX0ZVUlkpfSwKQEAgLTEzMiw3ICsxMzgsNyBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG1lZ2FzYXNfcGNpX3RhYmxlKTsKIAogc3RhdGljIGludCBtZWdhc2FzX21nbXRfbWFqb3JubzsKLXN0YXRpYyBzdHJ1Y3QgbWVnYXNhc19tZ210X2luZm8gbWVnYXNhc19tZ210X2luZm87CitzdHJ1Y3QgbWVnYXNhc19tZ210X2luZm8gbWVnYXNhc19tZ210X2luZm87CiBzdGF0aWMgc3RydWN0IGZhc3luY19zdHJ1Y3QgKm1lZ2FzYXNfYXN5bmNfcXVldWU7CiBzdGF0aWMgREVGSU5FX01VVEVYKG1lZ2FzYXNfYXN5bmNfcXVldWVfbXV0ZXgpOwogCkBAIC0xNzEsMTAgKzE3NywxNSBAQAogaW50CiBtZWdhc2FzX3N5bmNfbWFwX2luZm8oc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlKTsKIGludAotd2FpdF9hbmRfcG9sbChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kKTsKK3dhaXRfYW5kX3BvbGwoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLCBzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZCwKKwlpbnQgc2Vjb25kcyk7CiB2b2lkIG1lZ2FzYXNfcmVzZXRfcmVwbHlfZGVzYyhzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UpOwotaW50IG1lZ2FzYXNfcmVzZXRfZnVzaW9uKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKK2ludCBtZWdhc2FzX3Jlc2V0X2Z1c2lvbihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgaW50IGlvdGltZW91dCk7CiB2b2lkIG1lZ2FzYXNfZnVzaW9uX29jcl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIGludCBtZWdhc2FzX2dldF9sZF92Zl9hZmZpbGlhdGlvbihzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsCisJCQkJCSBpbnQgaW5pdGlhbCk7CitpbnQgbWVnYXNhc19jaGVja19tcGlvX3BhdGhzKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwKKwkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqc2NtZCk7CiAKIHZvaWQKIG1lZ2FzYXNfaXNzdWVfZGNtZChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kKQpAQCAtMjI0LDYgKzIzNSw3IEBACiAJY21kLT5zY21kID0gTlVMTDsKIAljbWQtPmZyYW1lX2NvdW50ID0gMDsKIAlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSAmJgorCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0xTSV9QTEFTTUEpICYmCiAJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpICYmCiAJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfTFNJX0ZVUlkpICYmCiAJICAgIChyZXNldF9kZXZpY2VzKSkKQEAgLTg3Nyw2ICs4ODksNyBAQAogaW50CiBtZWdhc2FzX2lzc3VlX3BvbGxlZChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kKQogeworCWludCBzZWNvbmRzOwogCiAJc3RydWN0IG1lZ2FzYXNfaGVhZGVyICpmcmFtZV9oZHIgPSAmY21kLT5mcmFtZS0+aGRyOwogCkBAIC04OTEsMTMgKzkwNCwxOCBAQAogCS8qCiAJICogV2FpdCBmb3IgY21kX3N0YXR1cyB0byBjaGFuZ2UKIAkgKi8KLQlyZXR1cm4gd2FpdF9hbmRfcG9sbChpbnN0YW5jZSwgY21kKTsKKwlpZiAoaW5zdGFuY2UtPnJlcXVlc3RvcklkKQorCQlzZWNvbmRzID0gTUVHQVNBU19ST1VUSU5FX1dBSVRfVElNRV9WRjsKKwllbHNlCisJCXNlY29uZHMgPSBNRklfUE9MTF9USU1FT1VUX1NFQ1M7CisJcmV0dXJuIHdhaXRfYW5kX3BvbGwoaW5zdGFuY2UsIGNtZCwgc2Vjb25kcyk7CiB9CiAKIC8qKgogICogbWVnYXNhc19pc3N1ZV9ibG9ja2VkX2NtZCAtCVN5bmNocm9ub3VzIHdyYXBwZXIgYXJvdW5kIHJlZ3VsYXIgRlcgY21kcwogICogQGluc3RhbmNlOgkJCUFkYXB0ZXIgc29mdCBzdGF0ZQogICogQGNtZDoJCQlDb21tYW5kIHRvIGJlIGlzc3VlZAorICogQHRpbWVvdXQ6CQkJVGltZW91dCBpbiBzZWNvbmRzCiAgKgogICogVGhpcyBmdW5jdGlvbiB3YWl0cyBvbiBhbiBldmVudCBmb3IgdGhlIGNvbW1hbmQgdG8gYmUgcmV0dXJuZWQgZnJvbSBJU1IuCiAgKiBNYXggd2FpdCB0aW1lIGlzIE1FR0FTQVNfSU5URVJOQUxfQ01EX1dBSVRfVElNRSBzZWNzCkBAIC05MDUsMTMgKzkyMywyMCBAQAogICovCiBzdGF0aWMgaW50CiBtZWdhc2FzX2lzc3VlX2Jsb2NrZWRfY21kKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwKLQkJCSAgc3RydWN0IG1lZ2FzYXNfY21kICpjbWQpCisJCQkgIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kLCBpbnQgdGltZW91dCkKIHsKKwlpbnQgcmV0ID0gMDsKIAljbWQtPmNtZF9zdGF0dXMgPSBFTk9EQVRBOwogCiAJaW5zdGFuY2UtPmluc3RhbmNldC0+aXNzdWVfZGNtZChpbnN0YW5jZSwgY21kKTsKLQotCXdhaXRfZXZlbnQoaW5zdGFuY2UtPmludF9jbWRfd2FpdF9xLCBjbWQtPmNtZF9zdGF0dXMgIT0gRU5PREFUQSk7CisJaWYgKHRpbWVvdXQpIHsKKwkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KGluc3RhbmNlLT5pbnRfY21kX3dhaXRfcSwKKwkJCQljbWQtPmNtZF9zdGF0dXMgIT0gRU5PREFUQSwgdGltZW91dCAqIEhaKTsKKwkJaWYgKCFyZXQpCisJCQlyZXR1cm4gMTsKKwl9IGVsc2UKKwkJd2FpdF9ldmVudChpbnN0YW5jZS0+aW50X2NtZF93YWl0X3EsCisJCQkJY21kLT5jbWRfc3RhdHVzICE9IEVOT0RBVEEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05MjAsMTggKzk0NSwyMCBAQAogICogbWVnYXNhc19pc3N1ZV9ibG9ja2VkX2Fib3J0X2NtZCAtCUFib3J0cyBwcmV2aW91c2x5IGlzc3VlZCBjbWQKICAqIEBpbnN0YW5jZToJCQkJQWRhcHRlciBzb2Z0IHN0YXRlCiAgKiBAY21kX3RvX2Fib3J0OgkJCVByZXZpb3VzbHkgaXNzdWVkIGNtZCB0byBiZSBhYm9ydGVkCisgKiBAdGltZW91dDoJCQkJVGltZW91dCBpbiBzZWNvbmRzCiAgKgotICogTUZJIGZpcm13YXJlIGNhbiBhYm9ydCBwcmV2aW91c2x5IGlzc3VlZCBBRU4gY29tbWFuZCAoYXV0b21hdGljIGV2ZW50CisgKiBNRkkgZmlybXdhcmUgY2FuIGFib3J0IHByZXZpb3VzbHkgaXNzdWVkIEFFTiBjb21hbW5kIChhdXRvbWF0aWMgZXZlbnQKICAqIG5vdGlmaWNhdGlvbikuIFRoZSBtZWdhc2FzX2lzc3VlX2Jsb2NrZWRfYWJvcnRfY21kKCkgaXNzdWVzIHN1Y2ggYWJvcnQKICAqIGNtZCBhbmQgd2FpdHMgZm9yIHJldHVybiBzdGF0dXMuCiAgKiBNYXggd2FpdCB0aW1lIGlzIE1FR0FTQVNfSU5URVJOQUxfQ01EX1dBSVRfVElNRSBzZWNzCiAgKi8KIHN0YXRpYyBpbnQKIG1lZ2FzYXNfaXNzdWVfYmxvY2tlZF9hYm9ydF9jbWQoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLAotCQkJCXN0cnVjdCBtZWdhc2FzX2NtZCAqY21kX3RvX2Fib3J0KQorCQkJCXN0cnVjdCBtZWdhc2FzX2NtZCAqY21kX3RvX2Fib3J0LCBpbnQgdGltZW91dCkKIHsKIAlzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZDsKIAlzdHJ1Y3QgbWVnYXNhc19hYm9ydF9mcmFtZSAqYWJvcnRfZnI7CisJaW50IHJldCA9IDA7CiAKIAljbWQgPSBtZWdhc2FzX2dldF9jbWQoaW5zdGFuY2UpOwogCkBAIC05NTcsMTAgKzk4NCwxOCBAQAogCiAJaW5zdGFuY2UtPmluc3RhbmNldC0+aXNzdWVfZGNtZChpbnN0YW5jZSwgY21kKTsKIAotCS8qCi0JICogV2FpdCBmb3IgdGhpcyBjbWQgdG8gY29tcGxldGUKLQkgKi8KLQl3YWl0X2V2ZW50KGluc3RhbmNlLT5hYm9ydF9jbWRfd2FpdF9xLCBjbWQtPmNtZF9zdGF0dXMgIT0gMHhGRik7CisJaWYgKHRpbWVvdXQpIHsKKwkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KGluc3RhbmNlLT5hYm9ydF9jbWRfd2FpdF9xLAorCQkJCWNtZC0+Y21kX3N0YXR1cyAhPSBFTk9EQVRBLCB0aW1lb3V0ICogSFopOworCQlpZiAoIXJldCkgeworCQkJZGV2X2VycigmaW5zdGFuY2UtPnBkZXYtPmRldiwgIkNvbW1hbmQgdGltZWRvdXQiCisJCQkJImZyb20gJXNcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAxOworCQl9CisJfSBlbHNlCisJCXdhaXRfZXZlbnQoaW5zdGFuY2UtPmFib3J0X2NtZF93YWl0X3EsCisJCQkJY21kLT5jbWRfc3RhdHVzICE9IEVOT0RBVEEpOworCiAJY21kLT5zeW5jX2NtZCA9IDA7CiAKIAltZWdhc2FzX3JldHVybl9jbWQoaW5zdGFuY2UsIGNtZCk7CkBAIC0xNTE0LDkgKzE1NDksMjMgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+aGJhX2xvY2ssIGZsYWdzKTsKIAorCS8qIENoZWNrIGZvciBhbiBtcGlvIHBhdGggYW5kIGFkanVzdCBiZWhhdmlvciAqLworCWlmIChpbnN0YW5jZS0+YWRwcmVjb3ZlcnkgPT0gTUVHQVNBU19BRFBSRVNFVF9TTV9JTkZBVUxUKSB7CisJCWlmIChtZWdhc2FzX2NoZWNrX21waW9fcGF0aHMoaW5zdGFuY2UsIHNjbWQpID09CisJCSAgICAoRElEX1JFU0VUIDw8IDE2KSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPmhiYV9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5oYmFfbG9jaywgZmxhZ3MpOworCQkJc2NtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCQlkb25lKHNjbWQpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKIAlpZiAoaW5zdGFuY2UtPmFkcHJlY292ZXJ5ID09IE1FR0FTQVNfSFdfQ1JJVElDQUxfRVJST1IpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPmhiYV9sb2NrLCBmbGFncyk7Ci0JCXNjbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJc2NtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CiAJCWRvbmUoc2NtZCk7CiAJCXJldHVybiAwOwogCX0KQEAgLTE2NDEsOSArMTY5MCwxNCBAQAogCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9TQVMwMDczU0tJTk5ZKSB8fAogCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9TQVMwMDcxU0tJTk5ZKSB8fAogCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHx8CisJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX1BMQVNNQSkgfHwKIAkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikgfHwKIAkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVSWSkpIHsKIAkJd3JpdGVsKE1GSV9TVE9QX0FEUCwgJmluc3RhbmNlLT5yZWdfc2V0LT5kb29yYmVsbCk7CisJCS8qIEZsdXNoICovCisJCXJlYWRsKCZpbnN0YW5jZS0+cmVnX3NldC0+ZG9vcmJlbGwpOworCQlpZiAoaW5zdGFuY2UtPm1waW8gJiYgaW5zdGFuY2UtPnJlcXVlc3RvcklkKQorCQkJbWVtc2V0KGluc3RhbmNlLT5sZF9pZHMsIDB4ZmYsIE1FR0FTQVNfTUFYX0xEX0lEUyk7CiAJfSBlbHNlIHsKIAkJd3JpdGVsKE1GSV9TVE9QX0FEUCwgJmluc3RhbmNlLT5yZWdfc2V0LT5pbmJvdW5kX2Rvb3JiZWxsKTsKIAl9CkBAIC0xNzMwLDYgKzE3ODQsMjUgQEAKIAltZWdhc2FzX2NoZWNrX2FuZF9yZXN0b3JlX3F1ZXVlX2RlcHRoKGluc3RhbmNlKTsKIH0KIAorLyoqCisgKiBtZWdhc2FzX3N0YXJ0X3RpbWVyIC0gSW5pdGlhbGl6ZXMgYSB0aW1lciBvYmplY3QKKyAqIEBpbnN0YW5jZToJCUFkYXB0ZXIgc29mdCBzdGF0ZQorICogQHRpbWVyOgkJdGltZXIgb2JqZWN0IHRvIGJlIGluaXRpYWxpemVkCisgKiBAZm46CQkJdGltZXIgZnVuY3Rpb24KKyAqIEBpbnRlcnZhbDoJCXRpbWUgaW50ZXJ2YWwgYmV0d2VlbiB0aW1lciBmdW5jdGlvbiBjYWxsCisgKgorICovCit2b2lkIG1lZ2FzYXNfc3RhcnRfdGltZXIoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLAorCQkJc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLAorCQkJdm9pZCAqZm4sIHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwpCit7CisJaW5pdF90aW1lcih0aW1lcik7CisJdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgaW50ZXJ2YWw7CisJdGltZXItPmRhdGEgPSAodW5zaWduZWQgbG9uZylpbnN0YW5jZTsKKwl0aW1lci0+ZnVuY3Rpb24gPSBmbjsKKwlhZGRfdGltZXIodGltZXIpOworfQorCiBzdGF0aWMgdm9pZAogbWVnYXNhc19pbnRlcm5hbF9yZXNldF9kZWZlcl9jbWRzKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSk7CiAKQEAgLTE3NTIsNiArMTgyNSwyOTUgQEAKIAlwcm9jZXNzX2Z3X3N0YXRlX2NoYW5nZV93cSgmaW5zdGFuY2UtPndvcmtfaW5pdCk7CiB9CiAKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBnZXQgdGhlIGN1cnJlbnQgU1ItSU9WIExEL1ZGIGFmZmlsaWF0aW9uICovCitzdGF0aWMgaW50IG1lZ2FzYXNfZ2V0X2xkX3ZmX2FmZmlsaWF0aW9uKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwKKwlpbnQgaW5pdGlhbCkKK3sKKwlzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWVnYXNhc19kY21kX2ZyYW1lICpkY21kOworCXN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTiAqbmV3X2FmZmlsaWF0aW9uID0gTlVMTDsKKwlzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT05fMTExICpuZXdfYWZmaWxpYXRpb25fMTExID0gTlVMTDsKKwlzdHJ1Y3QgTVJfTERfVkZfTUFQICpuZXdtYXAgPSBOVUxMLCAqc2F2ZWRtYXAgPSBOVUxMOworCWRtYV9hZGRyX3QgbmV3X2FmZmlsaWF0aW9uX2g7CisJZG1hX2FkZHJfdCBuZXdfYWZmaWxpYXRpb25fMTExX2g7CisJaW50IGxkLCByZXR2YWwgPSAwOworCXU4IHRoaXNWZjsKKworCWNtZCA9IG1lZ2FzYXNfZ2V0X2NtZChpbnN0YW5jZSk7CisKKwlpZiAoIWNtZCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAibWVnYXNhczogbWVnYXNhc19nZXRfbGRfdmZfIgorCQkgICAgICAgImFmZmlsaWF0aW9uOiBGYWlsZWQgdG8gZ2V0IGNtZCBmb3Igc2NzaSVkLlxuIiwKKwkJCWluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGNtZCA9ICZjbWQtPmZyYW1lLT5kY21kOworCisJaWYgKCFpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb24gJiYgIWluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbl8xMTEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXNhczogU1ItSU9WOiBDb3VsZG4ndCBnZXQgTEQvVkYgIgorCQkgICAgICAgImFmZmlsaWF0aW9uIGZvciBzY3NpJWQuXG4iLCBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCW1lZ2FzYXNfcmV0dXJuX2NtZChpbnN0YW5jZSwgY21kKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGluaXRpYWwpCisJCWlmIChpbnN0YW5jZS0+UGxhc21hRlcxMTEpCisJCQltZW1zZXQoaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uXzExMSwgMCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OXzExMSkpOworCQllbHNlCisJCQltZW1zZXQoaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uLCAwLAorCQkJICAgICAgIChNQVhfTE9HSUNBTF9EUklWRVMgKyAxKSAqCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTikpOworCWVsc2UgeworCQlpZiAoaW5zdGFuY2UtPlBsYXNtYUZXMTExKQorCQkJbmV3X2FmZmlsaWF0aW9uXzExMSA9CisJCQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoaW5zdGFuY2UtPnBkZXYsCisJCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT05fMTExKSwKKwkJCQkJCSAgICAgJm5ld19hZmZpbGlhdGlvbl8xMTFfaCk7CisJCWVsc2UKKwkJCW5ld19hZmZpbGlhdGlvbiA9CisJCQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoaW5zdGFuY2UtPnBkZXYsCisJCQkJCQkgICAgIChNQVhfTE9HSUNBTF9EUklWRVMgKyAxKSAqCisJCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT04pLAorCQkJCQkJICAgICAmbmV3X2FmZmlsaWF0aW9uX2gpOworCQlpZiAoIW5ld19hZmZpbGlhdGlvbiAmJiAhbmV3X2FmZmlsaWF0aW9uXzExMSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIm1lZ2FzYXM6IFNSLUlPVjogQ291bGRuJ3QgYWxsb2NhdGUgIgorCQkJICAgICAgICJtZW1vcnkgZm9yIG5ldyBhZmZpbGlhdGlvbiBmb3Igc2NzaSVkLlxuIiwKKwkJCQlpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCQltZWdhc2FzX3JldHVybl9jbWQoaW5zdGFuY2UsIGNtZCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlpZiAoaW5zdGFuY2UtPlBsYXNtYUZXMTExKQorCQkJbWVtc2V0KG5ld19hZmZpbGlhdGlvbl8xMTEsIDAsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTl8xMTEpKTsKKwkJZWxzZQorCQkJbWVtc2V0KG5ld19hZmZpbGlhdGlvbiwgMCwgKE1BWF9MT0dJQ0FMX0RSSVZFUyArIDEpICoKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OKSk7CisJfQorCisJbWVtc2V0KGRjbWQtPm1ib3guYiwgMCwgTUZJX01CT1hfU0laRSk7CisKKwlkY21kLT5jbWQgPSBNRklfQ01EX0RDTUQ7CisJZGNtZC0+Y21kX3N0YXR1cyA9IDB4RkY7CisJZGNtZC0+c2dlX2NvdW50ID0gMTsKKwlkY21kLT5mbGFncyA9IE1GSV9GUkFNRV9ESVJfQk9USDsKKwlkY21kLT50aW1lb3V0ID0gMDsKKwlkY21kLT5wYWRfMCA9IDA7CisJaWYgKGluc3RhbmNlLT5QbGFzbWFGVzExMSkgeworCQlkY21kLT5kYXRhX3hmZXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTl8xMTEpOworCQlkY21kLT5vcGNvZGUgPSBNUl9EQ01EX0xEX1ZGX01BUF9HRVRfQUxMX0xEU18xMTE7CisJfSBlbHNlIHsKKwkJZGNtZC0+ZGF0YV94ZmVyX2xlbiA9IChNQVhfTE9HSUNBTF9EUklWRVMgKyAxKSAqCisJCQlzaXplb2Yoc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OKTsKKwkJZGNtZC0+b3Bjb2RlID0gTVJfRENNRF9MRF9WRl9NQVBfR0VUX0FMTF9MRFM7CisJfQorCisJaWYgKGluaXRpYWwpIHsKKwkJaWYgKGluc3RhbmNlLT5QbGFzbWFGVzExMSkKKwkJCWRjbWQtPnNnbC5zZ2UzMlswXS5waHlzX2FkZHIgPQorCQkJICBpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb25fMTExX2g7CisJCWVsc2UKKwkJCWRjbWQtPnNnbC5zZ2UzMlswXS5waHlzX2FkZHIgPQorCQkJICBpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb25faDsKKwl9IGVsc2UgeworCQlpZiAoaW5zdGFuY2UtPlBsYXNtYUZXMTExKQorCQkJZGNtZC0+c2dsLnNnZTMyWzBdLnBoeXNfYWRkciA9IG5ld19hZmZpbGlhdGlvbl8xMTFfaDsKKwkJZWxzZQorCQkJZGNtZC0+c2dsLnNnZTMyWzBdLnBoeXNfYWRkciA9IG5ld19hZmZpbGlhdGlvbl9oOworCX0KKwlpZiAoaW5zdGFuY2UtPlBsYXNtYUZXMTExKQorCQlkY21kLT5zZ2wuc2dlMzJbMF0ubGVuZ3RoID0KKwkJICBzaXplb2Yoc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OXzExMSk7CisJZWxzZQorCQlkY21kLT5zZ2wuc2dlMzJbMF0ubGVuZ3RoID0gKE1BWF9MT0dJQ0FMX0RSSVZFUyArIDEpICoKKwkJCXNpemVvZihzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT04pOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXNhczogU1ItSU9WOiBHZXR0aW5nIExEL1ZGIGFmZmlsaWF0aW9uIGZvciAiCisJICAgICAgICJzY3NpJWRcbiIsIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKworCW1lZ2FzYXNfaXNzdWVfYmxvY2tlZF9jbWQoaW5zdGFuY2UsIGNtZCwgMCk7CisKKwlpZiAoZGNtZC0+Y21kX3N0YXR1cykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhc2FzOiBTUi1JT1Y6IExEL1ZGIGFmZmlsaWF0aW9uIERDTUQiCisJCSAgICAgICAiIGZhaWxlZCB3aXRoIHN0YXR1cyAweCV4IGZvciBzY3NpJWQuXG4iLAorCQkgICAgICAgZGNtZC0+Y21kX3N0YXR1cywgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQlyZXR2YWwgPSAxOyAvKiBEbyBhIHNjYW4gaWYgd2UgY291bGRuJ3QgZ2V0IGFmZmlsaWF0aW9uICovCisJCWdvdG8gb3V0OworCX0KKworCWlmICghaW5pdGlhbCkgeworCQlpZiAoaW5zdGFuY2UtPlBsYXNtYUZXMTExKSB7CisJCQlpZiAoIW5ld19hZmZpbGlhdGlvbl8xMTEtPnZkQ291bnQpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhc2FzOiBTUi1JT1Y6IEdvdCBuZXcgIgorCQkJCSAgICAgICAiTEQvVkYgYWZmaWxpYXRpb24gZm9yIHBhc3NpdmUgcGF0aCAiCisJCQkJICAgICAgICJmb3Igc2NzaSVkLlxuIiwKKwkJCQkJaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQkJCXJldHZhbCA9IDE7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQl0aGlzVmYgPSBuZXdfYWZmaWxpYXRpb25fMTExLT50aGlzVmY7CisJCQlmb3IgKGxkID0gMCA7IGxkIDwgbmV3X2FmZmlsaWF0aW9uXzExMS0+dmRDb3VudDsgbGQrKykKKwkJCQlpZiAoaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uXzExMS0+bWFwW2xkXS5wb2xpY3lbdGhpc1ZmXSAhPSBuZXdfYWZmaWxpYXRpb25fMTExLT5tYXBbbGRdLnBvbGljeVt0aGlzVmZdKSB7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FzYXM6IFNSLUlPVjogIgorCQkJCQkgICAgICAgIkdvdCBuZXcgTEQvVkYgYWZmaWxpYXRpb24gIgorCQkJCQkgICAgICAgImZvciBzY3NpJWQuXG4iLAorCQkJCQkJaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQkJCQltZW1jcHkoaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uXzExMSwKKwkJCQkJICAgICAgIG5ld19hZmZpbGlhdGlvbl8xMTEsCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OXzExMSkpOworCQkJCQlyZXR2YWwgPSAxOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoIW5ld19hZmZpbGlhdGlvbi0+bGRDb3VudCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FzYXM6IFNSLUlPVjogR290IG5ldyAiCisJCQkJICAgICAgICJMRC9WRiBhZmZpbGlhdGlvbiBmb3IgcGFzc2l2ZSAiCisJCQkJICAgICAgICJwYXRoIGZvciBzY3NpJWQuXG4iLAorCQkJCSAgICAgICBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCQkJcmV0dmFsID0gMTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCW5ld21hcCA9IG5ld19hZmZpbGlhdGlvbi0+bWFwOworCQkJc2F2ZWRtYXAgPSBpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb24tPm1hcDsKKwkJCXRoaXNWZiA9IG5ld19hZmZpbGlhdGlvbi0+dGhpc1ZmOworCQkJZm9yIChsZCA9IDAgOyBsZCA8IG5ld19hZmZpbGlhdGlvbi0+bGRDb3VudDsgbGQrKykgeworCQkJCWlmIChzYXZlZG1hcC0+cG9saWN5W3RoaXNWZl0gIT0KKwkJCQkgICAgbmV3bWFwLT5wb2xpY3lbdGhpc1ZmXSkgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhc2FzOiBTUi1JT1Y6ICIKKwkJCQkJICAgICAgICJHb3QgbmV3IExEL1ZGIGFmZmlsaWF0aW9uICIKKwkJCQkJICAgICAgICJmb3Igc2NzaSVkLlxuIiwKKwkJCQkJCWluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJCQkJbWVtY3B5KGluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbiwKKwkJCQkJICAgICAgIG5ld19hZmZpbGlhdGlvbiwKKwkJCQkJICAgICAgIG5ld19hZmZpbGlhdGlvbi0+c2l6ZSk7CisJCQkJCXJldHZhbCA9IDE7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlzYXZlZG1hcCA9IChzdHJ1Y3QgTVJfTERfVkZfTUFQICopCisJCQkJCSgodW5zaWduZWQgY2hhciAqKXNhdmVkbWFwICsKKwkJCQkJIHNhdmVkbWFwLT5zaXplKTsKKwkJCQluZXdtYXAgPSAoc3RydWN0IE1SX0xEX1ZGX01BUCAqKQorCQkJCQkoKHVuc2lnbmVkIGNoYXIgKiluZXdtYXAgKworCQkJCQkgbmV3bWFwLT5zaXplKTsKKwkJCX0KKwkJfQorCX0KK291dDoKKwlpZiAobmV3X2FmZmlsaWF0aW9uKSB7CisJCWlmIChpbnN0YW5jZS0+UGxhc21hRlcxMTEpCisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGluc3RhbmNlLT5wZGV2LAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTl8xMTEpLAorCQkJCQkgICAgbmV3X2FmZmlsaWF0aW9uXzExMSwKKwkJCQkJICAgIG5ld19hZmZpbGlhdGlvbl8xMTFfaCk7CisJCWVsc2UKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW5zdGFuY2UtPnBkZXYsCisJCQkJCSAgICAoTUFYX0xPR0lDQUxfRFJJVkVTICsgMSkgKgorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTiksCisJCQkJCSAgICBuZXdfYWZmaWxpYXRpb24sIG5ld19hZmZpbGlhdGlvbl9oKTsKKwl9CisJbWVnYXNhc19yZXR1cm5fY21kKGluc3RhbmNlLCBjbWQpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHRlbGwgRlcgdG8gc3RhcnQgdGhlIFNSLUlPViBoZWFydGJlYXQgKi8KK2ludCBtZWdhc2FzX3NyaW92X3N0YXJ0X2hlYXJ0YmVhdChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsCisJCQkJCSBpbnQgaW5pdGlhbCkKK3sKKwlzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWVnYXNhc19kY21kX2ZyYW1lICpkY21kOworCWludCByZXR2YWwgPSAwOworCisJY21kID0gbWVnYXNhc19nZXRfY21kKGluc3RhbmNlKTsKKworCWlmICghY21kKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJtZWdhc2FzOiBtZWdhc2FzX3NyaW92X3N0YXJ0X2hlYXJ0YmVhdDogIgorCQkgICAgICAgIkZhaWxlZCB0byBnZXQgY21kIGZvciBzY3NpJWQuXG4iLAorCQkgICAgICAgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkY21kID0gJmNtZC0+ZnJhbWUtPmRjbWQ7CisKKwlpZiAoaW5pdGlhbCkgeworCQlpbnN0YW5jZS0+aGJfaG9zdF9tZW0gPQorCQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoaW5zdGFuY2UtPnBkZXYsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBNUl9DVFJMX0hCX0hPU1RfTUVNKSwKKwkJCQkJICAgICAmaW5zdGFuY2UtPmhiX2hvc3RfbWVtX2gpOworCQlpZiAoIWluc3RhbmNlLT5oYl9ob3N0X21lbSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIm1lZ2FzYXM6IFNSLUlPVjogQ291bGRuJ3QgYWxsb2NhdGUiCisJCQkgICAgICAgIiBtZW1vcnkgZm9yIGhlYXJ0YmVhdCBob3N0IG1lbW9yeSBmb3IgIgorCQkJICAgICAgICJzY3NpJWQuXG4iLCBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJbWVtc2V0KGluc3RhbmNlLT5oYl9ob3N0X21lbSwgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgTVJfQ1RSTF9IQl9IT1NUX01FTSkpOworCX0KKworCW1lbXNldChkY21kLT5tYm94LmIsIDAsIE1GSV9NQk9YX1NJWkUpOworCisJZGNtZC0+bWJveC5zWzBdID0gc2l6ZW9mKHN0cnVjdCBNUl9DVFJMX0hCX0hPU1RfTUVNKTsKKwlkY21kLT5jbWQgPSBNRklfQ01EX0RDTUQ7CisJZGNtZC0+Y21kX3N0YXR1cyA9IDB4RkY7CisJZGNtZC0+c2dlX2NvdW50ID0gMTsKKwlkY21kLT5mbGFncyA9IE1GSV9GUkFNRV9ESVJfQk9USDsKKwlkY21kLT50aW1lb3V0ID0gMDsKKwlkY21kLT5wYWRfMCA9IDA7CisJZGNtZC0+ZGF0YV94ZmVyX2xlbiA9IHNpemVvZihzdHJ1Y3QgTVJfQ1RSTF9IQl9IT1NUX01FTSk7CisJZGNtZC0+b3Bjb2RlID0gTVJfRENNRF9DVFJMX1NIQVJFRF9IT1NUX01FTV9BTExPQzsKKwlkY21kLT5zZ2wuc2dlMzJbMF0ucGh5c19hZGRyID0gaW5zdGFuY2UtPmhiX2hvc3RfbWVtX2g7CisJZGNtZC0+c2dsLnNnZTMyWzBdLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgTVJfQ1RSTF9IQl9IT1NUX01FTSk7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhc2FzOiBTUi1JT1Y6IFN0YXJ0aW5nIGhlYXJ0YmVhdCBmb3Igc2NzaSVkXG4iLAorCSAgICAgICBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisKKwlpZiAoIW1lZ2FzYXNfaXNzdWVfcG9sbGVkKGluc3RhbmNlLCBjbWQpKSB7CisJCXJldHZhbCA9IDA7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXNhczogU1ItSU9WOiBNUl9EQ01EX0NUUkxfU0hBUkVEX0hPU1QiCisJCSAgICAgICAiX01FTV9BTExPQyBEQ01EIHRpbWVkIG91dCBmb3Igc2NzaSVkXG4iLAorCQkgICAgICAgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQlyZXR2YWwgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKworCWlmIChkY21kLT5jbWRfc3RhdHVzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FzYXM6IFNSLUlPVjogTVJfRENNRF9DVFJMX1NIQVJFRF9IT1NUIgorCQkgICAgICAgIl9NRU1fQUxMT0MgRENNRCBmYWlsZWQgd2l0aCBzdGF0dXMgMHgleCBmb3Igc2NzaSVkXG4iLAorCQkgICAgICAgZGNtZC0+Y21kX3N0YXR1cywKKwkJICAgICAgIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJcmV0dmFsID0gMTsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJbWVnYXNhc19yZXR1cm5fY21kKGluc3RhbmNlLCBjbWQpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogSGFuZGxlciBmb3IgU1ItSU9WIGhlYXJ0YmVhdCAqLwordm9pZCBtZWdhc2FzX3NyaW92X2hlYXJ0YmVhdF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgaW5zdGFuY2VfYWRkcikKK3sKKwlzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UgPQorCQkoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKilpbnN0YW5jZV9hZGRyOworCisJaWYgKGluc3RhbmNlLT5oYl9ob3N0X21lbS0+SEIuZndDb3VudGVyICE9CisJICAgIGluc3RhbmNlLT5oYl9ob3N0X21lbS0+SEIuZHJpdmVyQ291bnRlcikgeworCQlpbnN0YW5jZS0+aGJfaG9zdF9tZW0tPkhCLmRyaXZlckNvdW50ZXIgPQorCQkJaW5zdGFuY2UtPmhiX2hvc3RfbWVtLT5IQi5md0NvdW50ZXI7CisJCW1vZF90aW1lcigmaW5zdGFuY2UtPnNyaW92X2hlYXJ0YmVhdF90aW1lciwKKwkJCSAgamlmZmllcyArIE1FR0FTQVNfU1JJT1ZfSEVBUlRCRUFUX0lOVEVSVkFMX1ZGKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhc2FzOiBTUi1JT1Y6IEhlYXJ0YmVhdCBuZXZlciAiCisJCSAgICAgICAiY29tcGxldGVkIGZvciBzY3NpJWRcbiIsIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJc2NoZWR1bGVfd29yaygmaW5zdGFuY2UtPndvcmtfaW5pdCk7CisJfQorfQorCiAvKioKICAqIG1lZ2FzYXNfd2FpdF9mb3Jfb3V0c3RhbmRpbmcgLQlXYWl0IGZvciBhbGwgb3V0c3RhbmRpbmcgY21kcwogICogQGluc3RhbmNlOgkJCQlBZGFwdGVyIHNvZnQgc3RhdGUKQEAgLTIwMTQsOSArMjM3NiwxMCBAQAogCSAqIEZpcnN0IHdhaXQgZm9yIGFsbCBjb21tYW5kcyB0byBjb21wbGV0ZQogCSAqLwogCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHx8CisJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX1BMQVNNQSkgfHwKIAkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikgfHwKIAkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVSWSkpCi0JCXJldCA9IG1lZ2FzYXNfcmVzZXRfZnVzaW9uKHNjbWQtPmRldmljZS0+aG9zdCk7CisJCXJldCA9IG1lZ2FzYXNfcmVzZXRfZnVzaW9uKHNjbWQtPmRldmljZS0+aG9zdCwgMSk7CiAJZWxzZQogCQlyZXQgPSBtZWdhc2FzX2dlbmVyaWNfcmVzZXQoc2NtZCk7CiAKQEAgLTI3MzEsNiArMzA5NCw4IEBACiAJCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KIAkJCQlQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHx8CiAJCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KKwkJCQlQQ0lfREVWSUNFX0lEX0xTSV9QTEFTTUEpIHx8CisJCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KIAkJCQlQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSB8fAogCQkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CiAJCQkJUENJX0RFVklDRV9JRF9MU0lfRlVSWSkpIHsKQEAgLTI3NTUsNiArMzEyMCw4IEBACiAJCQkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KIAkJCSAgICAgUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB8fAogCQkJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CisJCQkgICAgIFBDSV9ERVZJQ0VfSURfTFNJX1BMQVNNQSkgfHwKKwkJCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQogCQkJICAgICBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSB8fAogCQkJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CiAJCQkgICAgIFBDSV9ERVZJQ0VfSURfTFNJX0ZVUlkpKSB7CkBAIC0yNzgwLDYgKzMxNDcsOCBAQAogCQkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlCiAJCQkJCT09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgfHwKIAkJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZQorCQkJCQk9PSBQQ0lfREVWSUNFX0lEX0xTSV9QTEFTTUEpIHx8CisJCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UKIAkJCQkJPT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikgfHwKIAkJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZQogCQkJCQk9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVJZKSkgewpAQCAtMjc4OCw2ICszMTU3LDggQEAKIAkJCQlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KIAkJCQkJUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB8fAogCQkJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQorCQkJCQlQQ0lfREVWSUNFX0lEX0xTSV9QTEFTTUEpIHx8CisJCQkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CiAJCQkJCVBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpIHx8CiAJCQkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CiAJCQkJCVBDSV9ERVZJQ0VfSURfTFNJX0ZVUlkpKSB7CkBAIC0zMDE0LDYgKzMzODUsNyBAQAogCQljbWQtPmZyYW1lLT5pby5jb250ZXh0ID0gY3B1X3RvX2xlMzIoY21kLT5pbmRleCk7CiAJCWNtZC0+ZnJhbWUtPmlvLnBhZF8wID0gMDsKIAkJaWYgKChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgJiYKKwkJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfTFNJX1BMQVNNQSkgJiYKIAkJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpICYmCiAJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0xTSV9GVVJZKSAmJgogCQkgICAgKHJlc2V0X2RldmljZXMpKQpAQCAtMzYyMCw2ICszOTkyLDcgQEAKIAlzdHJ1Y3QgbWVnYXNhc19jdHJsX2luZm8gKmN0cmxfaW5mbzsKIAl1bnNpZ25lZCBsb25nIGJhcl9saXN0OwogCWludCBpLCBsb29wLCBmd19tc2l4X2NvdW50ID0gMDsKKwlzdHJ1Y3QgSU9WXzExMSAqaW92UHRyOwogCiAJLyogRmluZCBmaXJzdCBtZW1vcnkgYmFyICovCiAJYmFyX2xpc3QgPSBwY2lfc2VsZWN0X2JhcnMoaW5zdGFuY2UtPnBkZXYsIElPUkVTT1VSQ0VfTUVNKTsKQEAgLTM2NDIsNiArNDAxNSw3IEBACiAKIAlzd2l0Y2ggKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UpIHsKIAljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX1BMQVNNQToKIAljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVI6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9GVVJZOgogCQlpbnN0YW5jZS0+aW5zdGFuY2V0ID0gJm1lZ2FzYXNfaW5zdGFuY2VfdGVtcGxhdGVfZnVzaW9uOwpAQCAtMzY5Niw3ICs0MDcwLDggQEAKIAkJc2NyYXRjaF9wYWRfMiA9IHJlYWRsCiAJCQkoJmluc3RhbmNlLT5yZWdfc2V0LT5vdXRib3VuZF9zY3JhdGNoX3BhZF8yKTsKIAkJLyogQ2hlY2sgbWF4IE1TSS1YIHZlY3RvcnMgKi8KLQkJaWYgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB7CisJCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHx8CisJCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9QTEFTTUEpKSB7CiAJCQlpbnN0YW5jZS0+bXNpeF92ZWN0b3JzID0gKHNjcmF0Y2hfcGFkXzIKIAkJCQkmIE1SX01BWF9SRVBMWV9RVUVVRVNfT0ZGU0VUKSArIDE7CiAJCQlmd19tc2l4X2NvdW50ID0gaW5zdGFuY2UtPm1zaXhfdmVjdG9yczsKQEAgLTM3NjMsNyArNDEzOCwxMCBAQAogCiAJbWVtc2V0KGluc3RhbmNlLT5wZF9saXN0LCAwICwKIAkJKE1FR0FTQVNfTUFYX1BEICogc2l6ZW9mKHN0cnVjdCBtZWdhc2FzX3BkX2xpc3QpKSk7Ci0JbWVnYXNhc19nZXRfcGRfbGlzdChpbnN0YW5jZSk7CisJaWYgKG1lZ2FzYXNfZ2V0X3BkX2xpc3QoaW5zdGFuY2UpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1lZ2FzYXM6IGZhaWxlZCB0byBnZXQgUEQgbGlzdFxuIik7CisJCWdvdG8gZmFpbF9pbml0X2FkYXB0ZXI7CisJfQogCiAJbWVtc2V0KGluc3RhbmNlLT5sZF9pZHMsIDB4ZmYsIE1FR0FTQVNfTUFYX0xEX0lEUyk7CiAJaWYgKG1lZ2FzYXNfbGRfbGlzdF9xdWVyeShpbnN0YW5jZSwKQEAgLTM4MDcsNiArNDE4NSw3IEBACiAJCWN0cmxfaW5mby0+cHJvcGVydGllcy5Pbk9mZlByb3BlcnRpZXMuZGlzYWJsZU9ubGluZUN0cmxSZXNldDsKIAkJLyogYWRhcHRlck9wZXJhdGlvbnMyIGFyZSBjb252ZXJ0ZWQgaW50byBDUFUgYXJjaCovCiAJCWxlMzJfdG9fY3B1cygodTMyICopJmN0cmxfaW5mby0+YWRhcHRlck9wZXJhdGlvbnMyKTsKKwkJaW5zdGFuY2UtPm1waW8gPSBjdHJsX2luZm8tPmFkYXB0ZXJPcGVyYXRpb25zMi5tcGlvOwogCQlpbnN0YW5jZS0+VW5ldmVuU3BhblN1cHBvcnQgPQogCQkJY3RybF9pbmZvLT5hZGFwdGVyT3BlcmF0aW9uczIuc3VwcG9ydFVuZXZlblNwYW5zOwogCQlpZiAoaW5zdGFuY2UtPlVuZXZlblNwYW5TdXBwb3J0KSB7CkBAIC0zODE5LDYgKzQxOTgsMjAgQEAKIAkJCQlmdXNpb24tPmZhc3RfcGF0aF9pbyA9IDA7CiAKIAkJfQorCQlpZiAoY3RybF9pbmZvLT5ob3N0X2ludGVyZmFjZS5TUklPVikgeworCQkJaWYgKCFjdHJsX2luZm8tPmFkYXB0ZXJPcGVyYXRpb25zMi5hY3RpdmVQYXNzaXZlKQorCQkJCWluc3RhbmNlLT5QbGFzbWFGVzExMSA9IDE7CisKKwkJCWlmICghaW5zdGFuY2UtPlBsYXNtYUZXMTExKQorCQkJCWluc3RhbmNlLT5yZXF1ZXN0b3JJZCA9CisJCQkJCWN0cmxfaW5mby0+aW92LnJlcXVlc3RvcklkOworCQkJZWxzZSB7CisJCQkJaW92UHRyID0gKHN0cnVjdCBJT1ZfMTExICopKCh1bnNpZ25lZCBjaGFyICopY3RybF9pbmZvICsgSU9WXzExMV9PRkZTRVQpOworCQkJCWluc3RhbmNlLT5yZXF1ZXN0b3JJZCA9IGlvdlB0ci0+cmVxdWVzdG9ySWQ7CisJCQl9CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZF9zYXM6IEkgYW0gVkYgIgorCQkJICAgICAgICJyZXF1ZXN0b3JJZCAlZFxuIiwgaW5zdGFuY2UtPnJlcXVlc3RvcklkKTsKKwkJfQogCX0KIAlpbnN0YW5jZS0+bWF4X3NlY3RvcnNfcGVyX3JlcSA9IGluc3RhbmNlLT5tYXhfbnVtX3NnZSAqCiAJCQkJCQlQQUdFX1NJWkUgLyA1MTI7CkBAIC0zODUxLDYgKzQyNDQsMTcgQEAKIAl0YXNrbGV0X2luaXQoJmluc3RhbmNlLT5pc3JfdGFza2xldCwgaW5zdGFuY2UtPmluc3RhbmNldC0+dGFza2xldCwKIAkJKHVuc2lnbmVkIGxvbmcpaW5zdGFuY2UpOwogCisJLyogTGF1bmNoIFNSLUlPViBoZWFydGJlYXQgdGltZXIgKi8KKwlpZiAoaW5zdGFuY2UtPnJlcXVlc3RvcklkKSB7CisJCWlmICghbWVnYXNhc19zcmlvdl9zdGFydF9oZWFydGJlYXQoaW5zdGFuY2UsIDEpKQorCQkJbWVnYXNhc19zdGFydF90aW1lcihpbnN0YW5jZSwKKwkJCQkJICAgICZpbnN0YW5jZS0+c3Jpb3ZfaGVhcnRiZWF0X3RpbWVyLAorCQkJCQkgICAgbWVnYXNhc19zcmlvdl9oZWFydGJlYXRfaGFuZGxlciwKKwkJCQkJICAgIE1FR0FTQVNfU1JJT1ZfSEVBUlRCRUFUX0lOVEVSVkFMX1ZGKTsKKwkJZWxzZQorCQkJaW5zdGFuY2UtPnNraXBfaGVhcnRiZWF0X3RpbWVyX2RlbCA9IDE7CisJfQorCiAJcmV0dXJuIDA7CiAKIGZhaWxfaW5pdF9hZGFwdGVyOgpAQCAtMzkzMywxNiArNDMzNywxOSBAQAogCWRjbWQtPnNnbC5zZ2UzMlswXS5waHlzX2FkZHIgPSBjcHVfdG9fbGUzMihlbF9pbmZvX2gpOwogCWRjbWQtPnNnbC5zZ2UzMlswXS5sZW5ndGggPSBjcHVfdG9fbGUzMihzaXplb2Yoc3RydWN0IG1lZ2FzYXNfZXZ0X2xvZ19pbmZvKSk7CiAKLQltZWdhc2FzX2lzc3VlX2Jsb2NrZWRfY21kKGluc3RhbmNlLCBjbWQpOwotCi0JLyoKLQkgKiBDb3B5IHRoZSBkYXRhIGJhY2sgaW50byBjYWxsZXJzIGJ1ZmZlcgotCSAqLwotCWVsaS0+bmV3ZXN0X3NlcV9udW0gPSBsZTMyX3RvX2NwdShlbF9pbmZvLT5uZXdlc3Rfc2VxX251bSk7Ci0JZWxpLT5vbGRlc3Rfc2VxX251bSA9IGxlMzJfdG9fY3B1KGVsX2luZm8tPm9sZGVzdF9zZXFfbnVtKTsKLQllbGktPmNsZWFyX3NlcV9udW0gPSBsZTMyX3RvX2NwdShlbF9pbmZvLT5jbGVhcl9zZXFfbnVtKTsKLQllbGktPnNodXRkb3duX3NlcV9udW0gPSBsZTMyX3RvX2NwdShlbF9pbmZvLT5zaHV0ZG93bl9zZXFfbnVtKTsKLQllbGktPmJvb3Rfc2VxX251bSA9IGxlMzJfdG9fY3B1KGVsX2luZm8tPmJvb3Rfc2VxX251bSk7CisJaWYgKG1lZ2FzYXNfaXNzdWVfYmxvY2tlZF9jbWQoaW5zdGFuY2UsIGNtZCwgMzApKQorCQlkZXZfZXJyKCZpbnN0YW5jZS0+cGRldi0+ZGV2LCAiQ29tbWFuZCB0aW1lZG91dCIKKwkJCSJmcm9tICVzXG4iLCBfX2Z1bmNfXyk7CisJZWxzZSB7CisJCS8qCisJCSAqIENvcHkgdGhlIGRhdGEgYmFjayBpbnRvIGNhbGxlcnMgYnVmZmVyCisJCSAqLworCQllbGktPm5ld2VzdF9zZXFfbnVtID0gbGUzMl90b19jcHUoZWxfaW5mby0+bmV3ZXN0X3NlcV9udW0pOworCQllbGktPm9sZGVzdF9zZXFfbnVtID0gbGUzMl90b19jcHUoZWxfaW5mby0+b2xkZXN0X3NlcV9udW0pOworCQllbGktPmNsZWFyX3NlcV9udW0gPSBsZTMyX3RvX2NwdShlbF9pbmZvLT5jbGVhcl9zZXFfbnVtKTsKKwkJZWxpLT5zaHV0ZG93bl9zZXFfbnVtID0gbGUzMl90b19jcHUoZWxfaW5mby0+c2h1dGRvd25fc2VxX251bSk7CisJCWVsaS0+Ym9vdF9zZXFfbnVtID0gbGUzMl90b19jcHUoZWxfaW5mby0+Ym9vdF9zZXFfbnVtKTsKKwl9CiAKIAlwY2lfZnJlZV9jb25zaXN0ZW50KGluc3RhbmNlLT5wZGV2LCBzaXplb2Yoc3RydWN0IG1lZ2FzYXNfZXZ0X2xvZ19pbmZvKSwKIAkJCSAgICBlbF9pbmZvLCBlbF9pbmZvX2gpOwpAQCAtNDAxOCw3ICs0NDI1LDcgQEAKIAkJCWluc3RhbmNlLT5hZW5fY21kLT5hYm9ydF9hZW4gPSAxOwogCQkJcmV0X3ZhbCA9IG1lZ2FzYXNfaXNzdWVfYmxvY2tlZF9hYm9ydF9jbWQoaW5zdGFuY2UsCiAJCQkJCQkJCSAgaW5zdGFuY2UtPgotCQkJCQkJCQkgIGFlbl9jbWQpOworCQkJCQkJCQkgIGFlbl9jbWQsIDMwKTsKIAogCQkJaWYgKHJldF92YWwpIHsKIAkJCQlwcmludGsoS0VSTl9ERUJVRyAibWVnYXNhczogRmFpbGVkIHRvIGFib3J0ICIKQEAgLTQxNjAsNiArNDU2Nyw3IEBACiAKIAkvKiBGdXNpb24gb25seSBzdXBwb3J0cyBob3N0IHJlc2V0ICovCiAJaWYgKChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgfHwKKwkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfUExBU01BKSB8fAogCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSB8fAogCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVJZKSkgewogCQlob3N0LT5ob3N0dC0+ZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBOVUxMOwpAQCAtNDE5Nyw2ICs0NjA1LDE5IEBACiAJCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpICE9IDApCiAJCQlnb3RvIGZhaWxfc2V0X2RtYV9tYXNrOwogCX0KKwkvKgorCSAqIEVuc3VyZSB0aGF0IGFsbCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCBpbiAzMi1iaXQKKwkgKiBtZW1vcnkuCisJICovCisJaWYgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKSAhPSAwKSB7CisJCS8qIFRyeSAzMmJpdCBETUEgbWFzayBhbmQgMzIgYml0IENvbnNpc3RlbnQgZG1hIG1hc2sgKi8KKwkJaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpCisJCQkmJiAhcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpKQorCQkJZGV2X2luZm8oJnBkZXYtPmRldiwgInNldCAzMmJpdCBETUEgbWFzayIKKwkJCQkiYW5kIDMyIGJpdCBjb25zaXN0ZW50IG1hc2tcbiIpOworCQllbHNlCisJCQlnb3RvIGZhaWxfc2V0X2RtYV9tYXNrOworCX0KIAogCXJldHVybiAwOwogCkBAIC00MjEyLDcgKzQ2MzMsNyBAQAogc3RhdGljIGludCBtZWdhc2FzX3Byb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewotCWludCBydmFsLCBwb3MsIGksIGo7CisJaW50IHJ2YWwsIHBvcywgaSwgaiwgY3B1OwogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CiAJc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlOwogCXUxNiBjb250cm9sID0gMDsKQEAgLTQyNzIsNiArNDY5Myw3IEBACiAKIAlzd2l0Y2ggKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UpIHsKIAljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX1BMQVNNQToKIAljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVI6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9GVVJZOgogCXsKQEAgLTQzNjgsNiArNDc5MCw3IEBACiAJaW5zdGFuY2UtPlVuZXZlblNwYW5TdXBwb3J0ID0gMDsKIAogCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHx8CisJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX1BMQVNNQSkgfHwKIAkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikgfHwKIAkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVSWSkpCiAJCUlOSVRfV09SSygmaW5zdGFuY2UtPndvcmtfaW5pdCwgbWVnYXNhc19mdXNpb25fb2NyX3dxKTsKQEAgLTQzODAsMTIgKzQ4MDMsMzMgQEAKIAlpZiAobWVnYXNhc19pbml0X2Z3KGluc3RhbmNlKSkKIAkJZ290byBmYWlsX2luaXRfbWZpOwogCisJaWYgKGluc3RhbmNlLT5yZXF1ZXN0b3JJZCkgeworCQlpZiAoaW5zdGFuY2UtPlBsYXNtYUZXMTExKSB7CisJCQlpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb25fMTExID0KKwkJCQlwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplb2Yoc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OXzExMSksCisJCQkJCQkgICAgICZpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb25fMTExX2gpOworCQkJaWYgKCFpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb25fMTExKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FzYXM6IENhbid0IGFsbG9jYXRlICIKKwkJCQkgICAgICAgIm1lbW9yeSBmb3IgVkYgYWZmaWxpYXRpb24gYnVmZmVyXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbiA9CisJCQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwKKwkJCQkJCSAgICAgKE1BWF9MT0dJQ0FMX0RSSVZFUyArIDEpICoKKwkJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTiksCisJCQkJCQkgICAgICZpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb25faCk7CisJCQlpZiAoIWluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbikKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhc2FzOiBDYW4ndCBhbGxvY2F0ZSAiCisJCQkJICAgICAgICJtZW1vcnkgZm9yIFZGIGFmZmlsaWF0aW9uIGJ1ZmZlclxuIik7CisJCX0KKwl9CisKIHJldHJ5X2lycV9yZWdpc3RlcjoKIAkvKgogCSAqIFJlZ2lzdGVyIElSUQogCSAqLwogCWlmIChpbnN0YW5jZS0+bXNpeF92ZWN0b3JzKSB7Ci0JCWZvciAoaSA9IDAgOyBpIDwgaW5zdGFuY2UtPm1zaXhfdmVjdG9yczsgaSsrKSB7CisJCWNwdSA9IGNwdW1hc2tfZmlyc3QoY3B1X29ubGluZV9tYXNrKTsKKwkJZm9yIChpID0gMDsgaSA8IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnM7IGkrKykgewogCQkJaW5zdGFuY2UtPmlycV9jb250ZXh0W2ldLmluc3RhbmNlID0gaW5zdGFuY2U7CiAJCQlpbnN0YW5jZS0+aXJxX2NvbnRleHRbaV0uTVNJeEluZGV4ID0gaTsKIAkJCWlmIChyZXF1ZXN0X2lycShpbnN0YW5jZS0+bXNpeGVudHJ5W2ldLnZlY3RvciwKQEAgLTQzOTQsMTQgKzQ4MzgsMjIgQEAKIAkJCQkJJmluc3RhbmNlLT5pcnFfY29udGV4dFtpXSkpIHsKIAkJCQlwcmludGsoS0VSTl9ERUJVRyAibWVnYXNhczogRmFpbGVkIHRvICIKIAkJCQkgICAgICAgInJlZ2lzdGVyIElSUSBmb3IgdmVjdG9yICVkLlxuIiwgaSk7Ci0JCQkJZm9yIChqID0gMCA7IGogPCBpIDsgaisrKQorCQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCQkJaXJxX3NldF9hZmZpbml0eV9oaW50KAorCQkJCQkJaW5zdGFuY2UtPm1zaXhlbnRyeVtqXS52ZWN0b3IsIE5VTEwpOwogCQkJCQlmcmVlX2lycSgKIAkJCQkJCWluc3RhbmNlLT5tc2l4ZW50cnlbal0udmVjdG9yLAogCQkJCQkJJmluc3RhbmNlLT5pcnFfY29udGV4dFtqXSk7CisJCQkJfQogCQkJCS8qIFJldHJ5IGlycSByZWdpc3RlciBmb3IgSU9fQVBJQyAqLwogCQkJCWluc3RhbmNlLT5tc2l4X3ZlY3RvcnMgPSAwOwogCQkJCWdvdG8gcmV0cnlfaXJxX3JlZ2lzdGVyOwogCQkJfQorCQkJaWYgKGlycV9zZXRfYWZmaW5pdHlfaGludChpbnN0YW5jZS0+bXNpeGVudHJ5W2ldLnZlY3RvciwKKwkJCQlnZXRfY3B1X21hc2soY3B1KSkpCisJCQkJZGV2X2VycigmaW5zdGFuY2UtPnBkZXYtPmRldiwgIkVycm9yIHNldHRpbmciCisJCQkJCSJhZmZpbml0eSBoaW50IGZvciBjcHUgJWRcbiIsIGNwdSk7CisJCQljcHUgPSBjcHVtYXNrX25leHQoY3B1LCBjcHVfb25saW5lX21hc2spOwogCQl9CiAJfSBlbHNlIHsKIAkJaW5zdGFuY2UtPmlycV9jb250ZXh0WzBdLmluc3RhbmNlID0gaW5zdGFuY2U7CkBAIC00NDU1LDEzICs0OTA3LDE3IEBACiAKIAlpbnN0YW5jZS0+aW5zdGFuY2V0LT5kaXNhYmxlX2ludHIoaW5zdGFuY2UpOwogCWlmIChpbnN0YW5jZS0+bXNpeF92ZWN0b3JzKQotCQlmb3IgKGkgPSAwIDsgaSA8IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnM7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnM7IGkrKykgeworCQkJaXJxX3NldF9hZmZpbml0eV9oaW50KAorCQkJCWluc3RhbmNlLT5tc2l4ZW50cnlbaV0udmVjdG9yLCBOVUxMKTsKIAkJCWZyZWVfaXJxKGluc3RhbmNlLT5tc2l4ZW50cnlbaV0udmVjdG9yLAogCQkJCSAmaW5zdGFuY2UtPmlycV9jb250ZXh0W2ldKTsKKwkJfQogCWVsc2UKIAkJZnJlZV9pcnEoaW5zdGFuY2UtPnBkZXYtPmlycSwgJmluc3RhbmNlLT5pcnFfY29udGV4dFswXSk7CiBmYWlsX2lycToKIAlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB8fAorCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9QTEFTTUEpIHx8CiAJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpIHx8CiAJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVUlkpKQogCQltZWdhc2FzX3JlbGVhc2VfZnVzaW9uKGluc3RhbmNlKTsKQEAgLTQ1MjIsNyArNDk3OCw5IEBACiAJZGNtZC0+b3Bjb2RlID0gY3B1X3RvX2xlMzIoTVJfRENNRF9DVFJMX0NBQ0hFX0ZMVVNIKTsKIAlkY21kLT5tYm94LmJbMF0gPSBNUl9GTFVTSF9DVFJMX0NBQ0hFIHwgTVJfRkxVU0hfRElTS19DQUNIRTsKIAotCW1lZ2FzYXNfaXNzdWVfYmxvY2tlZF9jbWQoaW5zdGFuY2UsIGNtZCk7CisJaWYgKG1lZ2FzYXNfaXNzdWVfYmxvY2tlZF9jbWQoaW5zdGFuY2UsIGNtZCwgMzApKQorCQlkZXZfZXJyKCZpbnN0YW5jZS0+cGRldi0+ZGV2LCAiQ29tbWFuZCB0aW1lZG91dCIKKwkJCSIgZnJvbSAlc1xuIiwgX19mdW5jX18pOwogCiAJbWVnYXNhc19yZXR1cm5fY21kKGluc3RhbmNlLCBjbWQpOwogCkBAIC00NTQ5LDEwICs1MDA3LDExIEBACiAJCXJldHVybjsKIAogCWlmIChpbnN0YW5jZS0+YWVuX2NtZCkKLQkJbWVnYXNhc19pc3N1ZV9ibG9ja2VkX2Fib3J0X2NtZChpbnN0YW5jZSwgaW5zdGFuY2UtPmFlbl9jbWQpOworCQltZWdhc2FzX2lzc3VlX2Jsb2NrZWRfYWJvcnRfY21kKGluc3RhbmNlLAorCQkJaW5zdGFuY2UtPmFlbl9jbWQsIDMwKTsKIAlpZiAoaW5zdGFuY2UtPm1hcF91cGRhdGVfY21kKQogCQltZWdhc2FzX2lzc3VlX2Jsb2NrZWRfYWJvcnRfY21kKGluc3RhbmNlLAotCQkJCQkJaW5zdGFuY2UtPm1hcF91cGRhdGVfY21kKTsKKwkJCWluc3RhbmNlLT5tYXBfdXBkYXRlX2NtZCwgMzApOwogCWRjbWQgPSAmY21kLT5mcmFtZS0+ZGNtZDsKIAogCW1lbXNldChkY21kLT5tYm94LmIsIDAsIE1GSV9NQk9YX1NJWkUpOwpAQCAtNDU2Niw3ICs1MDI1LDkgQEAKIAlkY21kLT5kYXRhX3hmZXJfbGVuID0gMDsKIAlkY21kLT5vcGNvZGUgPSBjcHVfdG9fbGUzMihvcGNvZGUpOwogCi0JbWVnYXNhc19pc3N1ZV9ibG9ja2VkX2NtZChpbnN0YW5jZSwgY21kKTsKKwlpZiAobWVnYXNhc19pc3N1ZV9ibG9ja2VkX2NtZChpbnN0YW5jZSwgY21kLCAzMCkpCisJCWRldl9lcnIoJmluc3RhbmNlLT5wZGV2LT5kZXYsICJDb21tYW5kIHRpbWVkb3V0IgorCQkJImZyb20gJXNcbiIsIF9fZnVuY19fKTsKIAogCW1lZ2FzYXNfcmV0dXJuX2NtZChpbnN0YW5jZSwgY21kKTsKIApAQCAtNDU5MCw2ICs1MDUxLDEwIEBACiAJaG9zdCA9IGluc3RhbmNlLT5ob3N0OwogCWluc3RhbmNlLT51bmxvYWQgPSAxOwogCisJLyogU2h1dGRvd24gU1ItSU9WIGhlYXJ0YmVhdCB0aW1lciAqLworCWlmIChpbnN0YW5jZS0+cmVxdWVzdG9ySWQgJiYgIWluc3RhbmNlLT5za2lwX2hlYXJ0YmVhdF90aW1lcl9kZWwpCisJCWRlbF90aW1lcl9zeW5jKCZpbnN0YW5jZS0+c3Jpb3ZfaGVhcnRiZWF0X3RpbWVyKTsKKwogCW1lZ2FzYXNfZmx1c2hfY2FjaGUoaW5zdGFuY2UpOwogCW1lZ2FzYXNfc2h1dGRvd25fY29udHJvbGxlcihpbnN0YW5jZSwgTVJfRENNRF9ISUJFUk5BVEVfU0hVVERPV04pOwogCkBAIC00NjA2LDkgKzUwNzEsMTIgQEAKIAlpbnN0YW5jZS0+aW5zdGFuY2V0LT5kaXNhYmxlX2ludHIoaW5zdGFuY2UpOwogCiAJaWYgKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpCi0JCWZvciAoaSA9IDAgOyBpIDwgaW5zdGFuY2UtPm1zaXhfdmVjdG9yczsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgaW5zdGFuY2UtPm1zaXhfdmVjdG9yczsgaSsrKSB7CisJCQlpcnFfc2V0X2FmZmluaXR5X2hpbnQoCisJCQkJaW5zdGFuY2UtPm1zaXhlbnRyeVtpXS52ZWN0b3IsIE5VTEwpOwogCQkJZnJlZV9pcnEoaW5zdGFuY2UtPm1zaXhlbnRyeVtpXS52ZWN0b3IsCiAJCQkJICZpbnN0YW5jZS0+aXJxX2NvbnRleHRbaV0pOworCQl9CiAJZWxzZQogCQlmcmVlX2lycShpbnN0YW5jZS0+cGRldi0+aXJxLCAmaW5zdGFuY2UtPmlycV9jb250ZXh0WzBdKTsKIAlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykKQEAgLTQ2MjksNyArNTA5Nyw3IEBACiBzdGF0aWMgaW50CiBtZWdhc2FzX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQlpbnQgcnZhbCwgaSwgajsKKwlpbnQgcnZhbCwgaSwgaiwgY3B1OwogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CiAJc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlOwogCkBAIC00NjczLDYgKzUxNDEsNyBAQAogCiAJc3dpdGNoIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlKSB7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT046CisJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9QTEFTTUE6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSOgogCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfRlVSWToKIAl7CkBAIC00NzAxLDYgKzUxNzAsNyBAQAogCSAqIFJlZ2lzdGVyIElSUQogCSAqLwogCWlmIChpbnN0YW5jZS0+bXNpeF92ZWN0b3JzKSB7CisJCWNwdSA9IGNwdW1hc2tfZmlyc3QoY3B1X29ubGluZV9tYXNrKTsKIAkJZm9yIChpID0gMCA7IGkgPCBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzOyBpKyspIHsKIAkJCWluc3RhbmNlLT5pcnFfY29udGV4dFtpXS5pbnN0YW5jZSA9IGluc3RhbmNlOwogCQkJaW5zdGFuY2UtPmlycV9jb250ZXh0W2ldLk1TSXhJbmRleCA9IGk7CkBAIC00NzEwLDEyICs1MTgwLDIxIEBACiAJCQkJCSZpbnN0YW5jZS0+aXJxX2NvbnRleHRbaV0pKSB7CiAJCQkJcHJpbnRrKEtFUk5fREVCVUcgIm1lZ2FzYXM6IEZhaWxlZCB0byAiCiAJCQkJICAgICAgICJyZWdpc3RlciBJUlEgZm9yIHZlY3RvciAlZC5cbiIsIGkpOwotCQkJCWZvciAoaiA9IDAgOyBqIDwgaSA7IGorKykKKwkJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJCQkJCWlycV9zZXRfYWZmaW5pdHlfaGludCgKKwkJCQkJCWluc3RhbmNlLT5tc2l4ZW50cnlbal0udmVjdG9yLCBOVUxMKTsKIAkJCQkJZnJlZV9pcnEoCiAJCQkJCQlpbnN0YW5jZS0+bXNpeGVudHJ5W2pdLnZlY3RvciwKIAkJCQkJCSZpbnN0YW5jZS0+aXJxX2NvbnRleHRbal0pOworCQkJCX0KIAkJCQlnb3RvIGZhaWxfaXJxOwogCQkJfQorCisJCQlpZiAoaXJxX3NldF9hZmZpbml0eV9oaW50KGluc3RhbmNlLT5tc2l4ZW50cnlbaV0udmVjdG9yLAorCQkJCWdldF9jcHVfbWFzayhjcHUpKSkKKwkJCQlkZXZfZXJyKCZpbnN0YW5jZS0+cGRldi0+ZGV2LCAiRXJyb3Igc2V0dGluZyIKKwkJCQkJImFmZmluaXR5IGhpbnQgZm9yIGNwdSAlZFxuIiwgY3B1KTsKKwkJCWNwdSA9IGNwdW1hc2tfbmV4dChjcHUsIGNwdV9vbmxpbmVfbWFzayk7CiAJCX0KIAl9IGVsc2UgewogCQlpbnN0YW5jZS0+aXJxX2NvbnRleHRbMF0uaW5zdGFuY2UgPSBpbnN0YW5jZTsKQEAgLTQ3MjgsNiArNTIwNywxNyBAQAogCQl9CiAJfQogCisJLyogUmUtbGF1bmNoIFNSLUlPViBoZWFydGJlYXQgdGltZXIgKi8KKwlpZiAoaW5zdGFuY2UtPnJlcXVlc3RvcklkKSB7CisJCWlmICghbWVnYXNhc19zcmlvdl9zdGFydF9oZWFydGJlYXQoaW5zdGFuY2UsIDApKQorCQkJbWVnYXNhc19zdGFydF90aW1lcihpbnN0YW5jZSwKKwkJCQkJICAgICZpbnN0YW5jZS0+c3Jpb3ZfaGVhcnRiZWF0X3RpbWVyLAorCQkJCQkgICAgbWVnYXNhc19zcmlvdl9oZWFydGJlYXRfaGFuZGxlciwKKwkJCQkJICAgIE1FR0FTQVNfU1JJT1ZfSEVBUlRCRUFUX0lOVEVSVkFMX1ZGKTsKKwkJZWxzZQorCQkJaW5zdGFuY2UtPnNraXBfaGVhcnRiZWF0X3RpbWVyX2RlbCA9IDE7CisJfQorCiAJaW5zdGFuY2UtPmluc3RhbmNldC0+ZW5hYmxlX2ludHIoaW5zdGFuY2UpOwogCWluc3RhbmNlLT51bmxvYWQgPSAwOwogCkBAIC00NzgyLDYgKzUyNzIsMTAgQEAKIAlob3N0ID0gaW5zdGFuY2UtPmhvc3Q7CiAJZnVzaW9uID0gaW5zdGFuY2UtPmN0cmxfY29udGV4dDsKIAorCS8qIFNodXRkb3duIFNSLUlPViBoZWFydGJlYXQgdGltZXIgKi8KKwlpZiAoaW5zdGFuY2UtPnJlcXVlc3RvcklkICYmICFpbnN0YW5jZS0+c2tpcF9oZWFydGJlYXRfdGltZXJfZGVsKQorCQlkZWxfdGltZXJfc3luYygmaW5zdGFuY2UtPnNyaW92X2hlYXJ0YmVhdF90aW1lcik7CisKIAlzY3NpX3JlbW92ZV9ob3N0KGluc3RhbmNlLT5ob3N0KTsKIAltZWdhc2FzX2ZsdXNoX2NhY2hlKGluc3RhbmNlKTsKIAltZWdhc2FzX3NodXRkb3duX2NvbnRyb2xsZXIoaW5zdGFuY2UsIE1SX0RDTURfQ1RSTF9TSFVURE9XTik7CkBAIC00NzkzLDYgKzUyODcsOSBAQAogCQlpbnN0YW5jZS0+ZXYgPSBOVUxMOwogCX0KIAorCS8qIGNhbmNlbCBhbGwgd2FpdCBldmVudHMgKi8KKwl3YWtlX3VwX2FsbCgmaW5zdGFuY2UtPmludF9jbWRfd2FpdF9xKTsKKwogCXRhc2tsZXRfa2lsbCgmaW5zdGFuY2UtPmlzcl90YXNrbGV0KTsKIAogCS8qCkBAIC00ODExLDkgKzUzMDgsMTIgQEAKIAlpbnN0YW5jZS0+aW5zdGFuY2V0LT5kaXNhYmxlX2ludHIoaW5zdGFuY2UpOwogCiAJaWYgKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpCi0JCWZvciAoaSA9IDAgOyBpIDwgaW5zdGFuY2UtPm1zaXhfdmVjdG9yczsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgaW5zdGFuY2UtPm1zaXhfdmVjdG9yczsgaSsrKSB7CisJCQlpcnFfc2V0X2FmZmluaXR5X2hpbnQoCisJCQkJaW5zdGFuY2UtPm1zaXhlbnRyeVtpXS52ZWN0b3IsIE5VTEwpOwogCQkJZnJlZV9pcnEoaW5zdGFuY2UtPm1zaXhlbnRyeVtpXS52ZWN0b3IsCiAJCQkJICZpbnN0YW5jZS0+aXJxX2NvbnRleHRbaV0pOworCQl9CiAJZWxzZQogCQlmcmVlX2lycShpbnN0YW5jZS0+cGRldi0+aXJxLCAmaW5zdGFuY2UtPmlycV9jb250ZXh0WzBdKTsKIAlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykKQEAgLTQ4MjEsNiArNTMyMSw3IEBACiAKIAlzd2l0Y2ggKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UpIHsKIAljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX1BMQVNNQToKIAljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVI6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9GVVJZOgogCQltZWdhc2FzX3JlbGVhc2VfZnVzaW9uKGluc3RhbmNlKTsKQEAgLTQ4NDcsNiArNTM0OCwyNCBAQAogCWlmIChpbnN0YW5jZS0+ZXZ0X2RldGFpbCkKIAkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2Yoc3RydWN0IG1lZ2FzYXNfZXZ0X2RldGFpbCksCiAJCQkJaW5zdGFuY2UtPmV2dF9kZXRhaWwsIGluc3RhbmNlLT5ldnRfZGV0YWlsX2gpOworCisJaWYgKGluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbikKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCAoTUFYX0xPR0lDQUxfRFJJVkVTICsgMSkgKgorCQkJCSAgICBzaXplb2Yoc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OKSwKKwkJCQkgICAgaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uLAorCQkJCSAgICBpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb25faCk7CisKKwlpZiAoaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uXzExMSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LAorCQkJCSAgICBzaXplb2Yoc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OXzExMSksCisJCQkJICAgIGluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbl8xMTEsCisJCQkJICAgIGluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbl8xMTFfaCk7CisKKwlpZiAoaW5zdGFuY2UtPmhiX2hvc3RfbWVtKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZihzdHJ1Y3QgTVJfQ1RSTF9IQl9IT1NUX01FTSksCisJCQkJICAgIGluc3RhbmNlLT5oYl9ob3N0X21lbSwKKwkJCQkgICAgaW5zdGFuY2UtPmhiX2hvc3RfbWVtX2gpOworCiAJc2NzaV9ob3N0X3B1dChob3N0KTsKIAogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKQEAgLTQ4NjgsOSArNTM4NywxMiBAQAogCW1lZ2FzYXNfc2h1dGRvd25fY29udHJvbGxlcihpbnN0YW5jZSwgTVJfRENNRF9DVFJMX1NIVVRET1dOKTsKIAlpbnN0YW5jZS0+aW5zdGFuY2V0LT5kaXNhYmxlX2ludHIoaW5zdGFuY2UpOwogCWlmIChpbnN0YW5jZS0+bXNpeF92ZWN0b3JzKQotCQlmb3IgKGkgPSAwIDsgaSA8IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnM7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnM7IGkrKykgeworCQkJaXJxX3NldF9hZmZpbml0eV9oaW50KAorCQkJCWluc3RhbmNlLT5tc2l4ZW50cnlbaV0udmVjdG9yLCBOVUxMKTsKIAkJCWZyZWVfaXJxKGluc3RhbmNlLT5tc2l4ZW50cnlbaV0udmVjdG9yLAogCQkJCSAmaW5zdGFuY2UtPmlycV9jb250ZXh0W2ldKTsKKwkJfQogCWVsc2UKIAkJZnJlZV9pcnEoaW5zdGFuY2UtPnBkZXYtPmlycSwgJmluc3RhbmNlLT5pcnFfY29udGV4dFswXSk7CiAJaWYgKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpCkBAIC01MDQ1LDcgKzU1NjcsNyBAQAogCSAqIGNtZCB0byB0aGUgU0NTSSBtaWQtbGF5ZXIKIAkgKi8KIAljbWQtPnN5bmNfY21kID0gMTsKLQltZWdhc2FzX2lzc3VlX2Jsb2NrZWRfY21kKGluc3RhbmNlLCBjbWQpOworCW1lZ2FzYXNfaXNzdWVfYmxvY2tlZF9jbWQoaW5zdGFuY2UsIGNtZCwgMCk7CiAJY21kLT5zeW5jX2NtZCA9IDA7CiAKIAkvKgpAQCAtNTEzMiw2ICs1NjU0LDE2IEBACiAJCWdvdG8gb3V0X2tmcmVlX2lvYzsKIAl9CiAKKwkvKiBBZGp1c3QgaW9jdGwgd2FpdCB0aW1lIGZvciBWRiBtb2RlICovCisJaWYgKGluc3RhbmNlLT5yZXF1ZXN0b3JJZCkKKwkJd2FpdF90aW1lID0gTUVHQVNBU19ST1VUSU5FX1dBSVRfVElNRV9WRjsKKworCS8qIEJsb2NrIGlvY3RscyBpbiBWRiBtb2RlICovCisJaWYgKGluc3RhbmNlLT5yZXF1ZXN0b3JJZCAmJiAhYWxsb3dfdmZfaW9jdGxzKSB7CisJCWVycm9yID0gLUVOT0RFVjsKKwkJZ290byBvdXRfa2ZyZWVfaW9jOworCX0KKwogCWlmIChpbnN0YW5jZS0+YWRwcmVjb3ZlcnkgPT0gTUVHQVNBU19IV19DUklUSUNBTF9FUlJPUikgewogCQlwcmludGsoS0VSTl9FUlIgIkNvbnRyb2xsZXIgaW4gY3JpdCBlcnJvclxuIik7CiAJCWVycm9yID0gLUVOT0RFVjsKQEAgLTU0NDEsNyArNTk3Myw3IEBACiAJdTE2ICAgICBwZF9pbmRleCA9IDA7CiAJdTE2CWxkX2luZGV4ID0gMDsKIAlpbnQgICAgIGksIGosIGRvc2NhbiA9IDA7Ci0JdTMyIHNlcV9udW07CisJdTMyIHNlcV9udW0sIHdhaXRfdGltZSA9IE1FR0FTQVNfUkVTRVRfV0FJVF9USU1FOwogCWludCBlcnJvcjsKIAogCWlmICghaW5zdGFuY2UpIHsKQEAgLTU0NDksNiArNTk4MSwyMyBAQAogCQlrZnJlZShldik7CiAJCXJldHVybjsKIAl9CisKKwkvKiBBZGp1c3QgZXZlbnQgd29ya3F1ZXVlIHRocmVhZCB3YWl0IHRpbWUgZm9yIFZGIG1vZGUgKi8KKwlpZiAoaW5zdGFuY2UtPnJlcXVlc3RvcklkKQorCQl3YWl0X3RpbWUgPSBNRUdBU0FTX1JPVVRJTkVfV0FJVF9USU1FX1ZGOworCisJLyogRG9uJ3QgcnVuIHRoZSBldmVudCB3b3JrcXVldWUgdGhyZWFkIGlmIE9DUiBpcyBydW5uaW5nICovCisJZm9yIChpID0gMDsgaSA8IHdhaXRfdGltZTsgaSsrKSB7CisJCWlmIChpbnN0YW5jZS0+YWRwcmVjb3ZlcnkgPT0gTUVHQVNBU19IQkFfT1BFUkFUSU9OQUwpCisJCQlicmVhazsKKwkJaWYgKCEoaSAlIE1FR0FTQVNfUkVTRVRfTk9USUNFX0lOVEVSVkFMKSkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJtZWdhc2FzOiAlcyB3YWl0aW5nIGZvciAiCisJCQkgICAgICAgImNvbnRyb2xsZXIgcmVzZXQgdG8gZmluaXNoIGZvciBzY3NpJWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJfQorCQltc2xlZXAoMTAwMCk7CisJfQorCiAJaW5zdGFuY2UtPmV2ID0gTlVMTDsKIAlob3N0ID0gaW5zdGFuY2UtPmhvc3Q7CiAJaWYgKGluc3RhbmNlLT5ldnRfZGV0YWlsKSB7CkBAIC01NTE1LDY1ICs2MDY0LDY0IEBACiAJCWNhc2UgTVJfRVZUX0xEX09GRkxJTkU6CiAJCWNhc2UgTVJfRVZUX0NGR19DTEVBUkVEOgogCQljYXNlIE1SX0VWVF9MRF9ERUxFVEVEOgotCQkJaWYgKG1lZ2FzYXNfbGRfbGlzdF9xdWVyeShpbnN0YW5jZSwKLQkJCQkJTVJfTERfUVVFUllfVFlQRV9FWFBPU0VEX1RPX0hPU1QpKQotCQkJCW1lZ2FzYXNfZ2V0X2xkX2xpc3QoaW5zdGFuY2UpOwotCQkJZm9yIChpID0gMDsgaSA8IE1FR0FTQVNfTUFYX0xEX0NIQU5ORUxTOyBpKyspIHsKLQkJCQlmb3IgKGogPSAwOwotCQkJCWogPCBNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUw7Ci0JCQkJaisrKSB7CisJCQlpZiAoIWluc3RhbmNlLT5yZXF1ZXN0b3JJZCB8fAorCQkJICAgIChpbnN0YW5jZS0+cmVxdWVzdG9ySWQgJiYKKwkJCSAgICAgbWVnYXNhc19nZXRfbGRfdmZfYWZmaWxpYXRpb24oaW5zdGFuY2UsIDApKSkgeworCQkJCWlmIChtZWdhc2FzX2xkX2xpc3RfcXVlcnkoaW5zdGFuY2UsCisJCQkJCQkJICBNUl9MRF9RVUVSWV9UWVBFX0VYUE9TRURfVE9fSE9TVCkpCisJCQkJCW1lZ2FzYXNfZ2V0X2xkX2xpc3QoaW5zdGFuY2UpOworCQkJCWZvciAoaSA9IDA7IGkgPCBNRUdBU0FTX01BWF9MRF9DSEFOTkVMUzsgaSsrKSB7CisJCQkJCWZvciAoaiA9IDA7CisJCQkJCSAgICAgaiA8IE1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTDsKKwkJCQkJICAgICBqKyspIHsKIAotCQkJCWxkX2luZGV4ID0KLQkJCQkoaSAqIE1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTCkgKyBqOworCQkJCQkJbGRfaW5kZXggPQorCQkJCQkJCShpICogTUVHQVNBU19NQVhfREVWX1BFUl9DSEFOTkVMKSArIGo7CiAKLQkJCQlzZGV2MSA9IHNjc2lfZGV2aWNlX2xvb2t1cChob3N0LAotCQkJCQlNRUdBU0FTX01BWF9QRF9DSEFOTkVMUyArIGksCi0JCQkJCWosCi0JCQkJCTApOworCQkJCQkJc2RldjEgPSBzY3NpX2RldmljZV9sb29rdXAoaG9zdCwgTUVHQVNBU19NQVhfUERfQ0hBTk5FTFMgKyBpLCBqLCAwKTsKIAotCQkJCWlmIChpbnN0YW5jZS0+bGRfaWRzW2xkX2luZGV4XSAhPSAweGZmKSB7Ci0JCQkJCWlmIChzZGV2MSkgewotCQkJCQkJc2NzaV9kZXZpY2VfcHV0KHNkZXYxKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChzZGV2MSkgewotCQkJCQkJc2NzaV9yZW1vdmVfZGV2aWNlKHNkZXYxKTsKLQkJCQkJCXNjc2lfZGV2aWNlX3B1dChzZGV2MSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZG9zY2FuID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIE1SX0VWVF9MRF9DUkVBVEVEOgotCQkJaWYgKG1lZ2FzYXNfbGRfbGlzdF9xdWVyeShpbnN0YW5jZSwKLQkJCQkJTVJfTERfUVVFUllfVFlQRV9FWFBPU0VEX1RPX0hPU1QpKQotCQkJCW1lZ2FzYXNfZ2V0X2xkX2xpc3QoaW5zdGFuY2UpOwotCQkJZm9yIChpID0gMDsgaSA8IE1FR0FTQVNfTUFYX0xEX0NIQU5ORUxTOyBpKyspIHsKLQkJCQlmb3IgKGogPSAwOwotCQkJCQlqIDwgTUVHQVNBU19NQVhfREVWX1BFUl9DSEFOTkVMOwotCQkJCQlqKyspIHsKLQkJCQkJbGRfaW5kZXggPQotCQkJCQkoaSAqIE1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTCkgKyBqOwotCi0JCQkJCXNkZXYxID0gc2NzaV9kZXZpY2VfbG9va3VwKGhvc3QsCi0JCQkJCQlNRUdBU0FTX01BWF9QRF9DSEFOTkVMUyArIGksCi0JCQkJCQlqLCAwKTsKLQotCQkJCQlpZiAoaW5zdGFuY2UtPmxkX2lkc1tsZF9pbmRleF0gIT0KLQkJCQkJCQkJMHhmZikgewotCQkJCQkJaWYgKCFzZGV2MSkgewotCQkJCQkJCXNjc2lfYWRkX2RldmljZShob3N0LAotCQkJCQkJTUVHQVNBU19NQVhfUERfQ0hBTk5FTFMgKyBpLAotCQkJCQkJCQlqLCAwKTsKKwkJCQkJCWlmIChpbnN0YW5jZS0+bGRfaWRzW2xkX2luZGV4XQorCQkJCQkJICAgICE9IDB4ZmYpIHsKKwkJCQkJCQlpZiAoc2RldjEpCisJCQkJCQkJCXNjc2lfZGV2aWNlX3B1dChzZGV2MSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmIChzZGV2MSkgeworCQkJCQkJCQlzY3NpX3JlbW92ZV9kZXZpY2Uoc2RldjEpOworCQkJCQkJCQlzY3NpX2RldmljZV9wdXQoc2RldjEpOworCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQotCQkJCQlpZiAoc2RldjEpIHsKLQkJCQkJCXNjc2lfZGV2aWNlX3B1dChzZGV2MSk7CisJCQkJfQorCQkJCWRvc2NhbiA9IDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBNUl9FVlRfTERfQ1JFQVRFRDoKKwkJCWlmICghaW5zdGFuY2UtPnJlcXVlc3RvcklkIHx8CisJCQkgICAgKGluc3RhbmNlLT5yZXF1ZXN0b3JJZCAmJgorCQkJICAgICBtZWdhc2FzX2dldF9sZF92Zl9hZmZpbGlhdGlvbihpbnN0YW5jZSwgMCkpKSB7CisJCQkJaWYgKG1lZ2FzYXNfbGRfbGlzdF9xdWVyeShpbnN0YW5jZSwKKwkJCQkJCQkgIE1SX0xEX1FVRVJZX1RZUEVfRVhQT1NFRF9UT19IT1NUKSkKKwkJCQkJbWVnYXNhc19nZXRfbGRfbGlzdChpbnN0YW5jZSk7CisJCQkJZm9yIChpID0gMDsgaSA8IE1FR0FTQVNfTUFYX0xEX0NIQU5ORUxTOyBpKyspIHsKKwkJCQkJZm9yIChqID0gMDsKKwkJCQkJICAgICBqIDwgTUVHQVNBU19NQVhfREVWX1BFUl9DSEFOTkVMOworCQkJCQkgICAgIGorKykgeworCQkJCQkJbGRfaW5kZXggPQorCQkJCQkJCShpICogTUVHQVNBU19NQVhfREVWX1BFUl9DSEFOTkVMKSArIGo7CisKKwkJCQkJCXNkZXYxID0gc2NzaV9kZXZpY2VfbG9va3VwKGhvc3QsIE1FR0FTQVNfTUFYX1BEX0NIQU5ORUxTICsgaSwgaiwgMCk7CisKKwkJCQkJCWlmIChpbnN0YW5jZS0+bGRfaWRzW2xkX2luZGV4XQorCQkJCQkJICAgICE9IDB4ZmYpIHsKKwkJCQkJCQlpZiAoIXNkZXYxKQorCQkJCQkJCQlzY3NpX2FkZF9kZXZpY2UoaG9zdCwgTUVHQVNBU19NQVhfUERfQ0hBTk5FTFMgKyBpLCBqLCAwKTsKKwkJCQkJCX0KKwkJCQkJCWlmIChzZGV2MSkKKwkJCQkJCQlzY3NpX2RldmljZV9wdXQoc2RldjEpOwogCQkJCQl9CiAJCQkJfQorCQkJCWRvc2NhbiA9IDA7CiAJCQl9Ci0JCQlkb3NjYW4gPSAwOwogCQkJYnJlYWs7CiAJCWNhc2UgTVJfRVZUX0NUUkxfSE9TVF9CVVNfU0NBTl9SRVFVRVNURUQ6CiAJCWNhc2UgTVJfRVZUX0ZPUkVJR05fQ0ZHX0lNUE9SVEVEOgpAQCAtNTU5MSw1MCArNjEzOSw1NSBAQAogCX0KIAogCWlmIChkb3NjYW4pIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAic2Nhbm5pbmcgLi4uXG4iKTsKLQkJbWVnYXNhc19nZXRfcGRfbGlzdChpbnN0YW5jZSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBNRUdBU0FTX01BWF9QRF9DSEFOTkVMUzsgaSsrKSB7Ci0JCQlmb3IgKGogPSAwOyBqIDwgTUVHQVNBU19NQVhfREVWX1BFUl9DSEFOTkVMOyBqKyspIHsKLQkJCQlwZF9pbmRleCA9IGkqTUVHQVNBU19NQVhfREVWX1BFUl9DSEFOTkVMICsgajsKLQkJCQlzZGV2MSA9IHNjc2lfZGV2aWNlX2xvb2t1cChob3N0LCBpLCBqLCAwKTsKLQkJCQlpZiAoaW5zdGFuY2UtPnBkX2xpc3RbcGRfaW5kZXhdLmRyaXZlU3RhdGUgPT0KLQkJCQkJCQlNUl9QRF9TVEFURV9TWVNURU0pIHsKLQkJCQkJaWYgKCFzZGV2MSkgewotCQkJCQkJc2NzaV9hZGRfZGV2aWNlKGhvc3QsIGksIGosIDApOwotCQkJCQl9Ci0JCQkJCWlmIChzZGV2MSkKLQkJCQkJCXNjc2lfZGV2aWNlX3B1dChzZGV2MSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHNkZXYxKSB7Ci0JCQkJCQlzY3NpX3JlbW92ZV9kZXZpY2Uoc2RldjEpOwotCQkJCQkJc2NzaV9kZXZpY2VfcHV0KHNkZXYxKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAibWVnYXJhaWRfc2FzOiBzY2FubmluZyBmb3Igc2NzaSVkLi4uXG4iLAorCQkgICAgICAgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQlpZiAobWVnYXNhc19nZXRfcGRfbGlzdChpbnN0YW5jZSkgPT0gMCkgeworCQkJZm9yIChpID0gMDsgaSA8IE1FR0FTQVNfTUFYX1BEX0NIQU5ORUxTOyBpKyspIHsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTUVHQVNBU19NQVhfREVWX1BFUl9DSEFOTkVMOyBqKyspIHsKKwkJCQkJcGRfaW5kZXggPSBpKk1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTCArIGo7CisJCQkJCXNkZXYxID0gc2NzaV9kZXZpY2VfbG9va3VwKGhvc3QsIGksIGosIDApOworCQkJCQlpZiAoaW5zdGFuY2UtPnBkX2xpc3RbcGRfaW5kZXhdLmRyaXZlU3RhdGUgPT0KKwkJCQkJICAgIE1SX1BEX1NUQVRFX1NZU1RFTSkgeworCQkJCQkJaWYgKCFzZGV2MSkgeworCQkJCQkJCXNjc2lfYWRkX2RldmljZShob3N0LCBpLCBqLCAwKTsKKwkJCQkJCX0KKwkJCQkJCWlmIChzZGV2MSkKKwkJCQkJCQlzY3NpX2RldmljZV9wdXQoc2RldjEpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKHNkZXYxKSB7CisJCQkJCQkJc2NzaV9yZW1vdmVfZGV2aWNlKHNkZXYxKTsKKwkJCQkJCQlzY3NpX2RldmljZV9wdXQoc2RldjEpOworCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9CiAKLQkJaWYgKG1lZ2FzYXNfbGRfbGlzdF9xdWVyeShpbnN0YW5jZSwKLQkJCQkJICBNUl9MRF9RVUVSWV9UWVBFX0VYUE9TRURfVE9fSE9TVCkpCi0JCQltZWdhc2FzX2dldF9sZF9saXN0KGluc3RhbmNlKTsKLQkJZm9yIChpID0gMDsgaSA8IE1FR0FTQVNfTUFYX0xEX0NIQU5ORUxTOyBpKyspIHsKLQkJCWZvciAoaiA9IDA7IGogPCBNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUw7IGorKykgewotCQkJCWxkX2luZGV4ID0KLQkJCQkoaSAqIE1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTCkgKyBqOworCQlpZiAoIWluc3RhbmNlLT5yZXF1ZXN0b3JJZCB8fAorCQkgICAgKGluc3RhbmNlLT5yZXF1ZXN0b3JJZCAmJgorCQkgICAgIG1lZ2FzYXNfZ2V0X2xkX3ZmX2FmZmlsaWF0aW9uKGluc3RhbmNlLCAwKSkpIHsKKwkJCWlmIChtZWdhc2FzX2xkX2xpc3RfcXVlcnkoaW5zdGFuY2UsCisJCQkJCQkgIE1SX0xEX1FVRVJZX1RZUEVfRVhQT1NFRF9UT19IT1NUKSkKKwkJCQltZWdhc2FzX2dldF9sZF9saXN0KGluc3RhbmNlKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBNRUdBU0FTX01BWF9MRF9DSEFOTkVMUzsgaSsrKSB7CisJCQkJZm9yIChqID0gMDsgaiA8IE1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTDsKKwkJCQkgICAgIGorKykgeworCQkJCQlsZF9pbmRleCA9CisJCQkJCQkoaSAqIE1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTCkgKyBqOwogCi0JCQkJc2RldjEgPSBzY3NpX2RldmljZV9sb29rdXAoaG9zdCwKLQkJCQkJTUVHQVNBU19NQVhfUERfQ0hBTk5FTFMgKyBpLCBqLCAwKTsKLQkJCQlpZiAoaW5zdGFuY2UtPmxkX2lkc1tsZF9pbmRleF0gIT0gMHhmZikgewotCQkJCQlpZiAoIXNkZXYxKSB7Ci0JCQkJCQlzY3NpX2FkZF9kZXZpY2UoaG9zdCwKLQkJCQkJCU1FR0FTQVNfTUFYX1BEX0NIQU5ORUxTICsgaSwKLQkJCQkJCQkJaiwgMCk7CisJCQkJCXNkZXYxID0gc2NzaV9kZXZpY2VfbG9va3VwKGhvc3QsCisJCQkJCQkJCSAgIE1FR0FTQVNfTUFYX1BEX0NIQU5ORUxTICsgaSwgaiwgMCk7CisJCQkJCWlmIChpbnN0YW5jZS0+bGRfaWRzW2xkX2luZGV4XQorCQkJCQkgICAgIT0gMHhmZikgeworCQkJCQkJaWYgKCFzZGV2MSkKKwkJCQkJCQlzY3NpX2FkZF9kZXZpY2UoaG9zdCwgTUVHQVNBU19NQVhfUERfQ0hBTk5FTFMgKyBpLCBqLCAwKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlzY3NpX2RldmljZV9wdXQoc2RldjEpOwogCQkJCQl9IGVsc2UgewotCQkJCQkJc2NzaV9kZXZpY2VfcHV0KHNkZXYxKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChzZGV2MSkgewotCQkJCQkJc2NzaV9yZW1vdmVfZGV2aWNlKHNkZXYxKTsKLQkJCQkJCXNjc2lfZGV2aWNlX3B1dChzZGV2MSk7CisJCQkJCQlpZiAoc2RldjEpIHsKKwkJCQkJCQlzY3NpX3JlbW92ZV9kZXZpY2Uoc2RldjEpOworCQkJCQkJCXNjc2lfZGV2aWNlX3B1dChzZGV2MSk7CisJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2ZwLmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2ZwLmMKaW5kZXggZTI0YjZlYi4uMDgxYmZmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnAuYwpAQCAtMTQzLDEyICsxNDMsMTIgQEAKIAogdTE2IE1SX0dldExEVGd0SWQodTMyIGxkLCBzdHJ1Y3QgTVJfRldfUkFJRF9NQVBfQUxMICptYXApCiB7Ci0JcmV0dXJuIG1hcC0+cmFpZE1hcC5sZFNwYW5NYXBbbGRdLmxkUmFpZC50YXJnZXRJZDsKKwlyZXR1cm4gbGUxNl90b19jcHUobWFwLT5yYWlkTWFwLmxkU3Bhbk1hcFtsZF0ubGRSYWlkLnRhcmdldElkKTsKIH0KIAotdTE2IE1SX1RhcmdldElkVG9MZEdldCh1MzIgbGRUZ3RJZCwgc3RydWN0IE1SX0ZXX1JBSURfTUFQX0FMTCAqbWFwKQordTggTVJfVGFyZ2V0SWRUb0xkR2V0KHUzMiBsZFRndElkLCBzdHJ1Y3QgTVJfRldfUkFJRF9NQVBfQUxMICptYXApCiB7Ci0JcmV0dXJuIGxlMTZfdG9fY3B1KG1hcC0+cmFpZE1hcC5sZFRndElkVG9MZFtsZFRndElkXSk7CisJcmV0dXJuIG1hcC0+cmFpZE1hcC5sZFRndElkVG9MZFtsZFRndElkXTsKIH0KIAogc3RhdGljIHN0cnVjdCBNUl9MRF9TUEFOICpNUl9MZFNwYW5QdHJHZXQodTMyIGxkLCB1MzIgc3BhbiwKQEAgLTk3NSw3ICs5NzUsMTAgQEAKIAkJCXJlZ1NpemUgKz0gc3RyaXBTaXplOwogCX0KIAotCXBSQUlEX0NvbnRleHQtPnRpbWVvdXRWYWx1ZSAgICAgPSBjcHVfdG9fbGUxNihtYXAtPnJhaWRNYXAuZnBQZElvVGltZW91dFNlYyk7CisJcFJBSURfQ29udGV4dC0+dGltZW91dFZhbHVlID0KKwkJY3B1X3RvX2xlMTYocmFpZC0+ZnBJb1RpbWVvdXRGb3JMZCA/CisJCQkgICAgcmFpZC0+ZnBJb1RpbWVvdXRGb3JMZCA6CisJCQkgICAgbWFwLT5yYWlkTWFwLmZwUGRJb1RpbWVvdXRTZWMpOwogCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSB8fAogCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVJZKSkKIAkJcFJBSURfQ29udGV4dC0+cmVnTG9ja0ZsYWdzID0gKGlzUmVhZCkgPwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mdXNpb24uYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnVzaW9uLmMKaW5kZXggZjY1NTU5Mi4uMjI2MDA0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mdXNpb24uYworKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Z1c2lvbi5jCkBAIC02Miw3ICs2Miw4IEBACiAJCSAgICAgc3RydWN0IG1lZ2FzYXNfY21kICpjbWQsIHU4IGFsdF9zdGF0dXMpOwogaW50IG1lZ2FzYXNfaXNfbGRpbyhzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOwogaW50Ci13YWl0X2FuZF9wb2xsKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgc3RydWN0IG1lZ2FzYXNfY21kICpjbWQpOword2FpdF9hbmRfcG9sbChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kLAorCSAgICAgIGludCBzZWNvbmRzKTsKIAogdm9pZAogbWVnYXNhc19yZXR1cm5fY21kKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgc3RydWN0IG1lZ2FzYXNfY21kICpjbWQpOwpAQCAtODEsNiArODIsMTMgQEAKIHZvaWQgbWVnYXJhaWRfc2FzX2tpbGxfaGJhKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSk7CiAKIGV4dGVybiB1MzIgbWVnYXNhc19kYmdfbHZsOwordm9pZCBtZWdhc2FzX3NyaW92X2hlYXJ0YmVhdF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgaW5zdGFuY2VfYWRkcik7CitpbnQgbWVnYXNhc19zcmlvdl9zdGFydF9oZWFydGJlYXQoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLAorCQkJCSAgaW50IGluaXRpYWwpOwordm9pZCBtZWdhc2FzX3N0YXJ0X3RpbWVyKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwKKwkJCXN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwKKwkJCSB2b2lkICpmbiwgdW5zaWduZWQgbG9uZyBpbnRlcnZhbCk7CitleHRlcm4gc3RydWN0IG1lZ2FzYXNfbWdtdF9pbmZvIG1lZ2FzYXNfbWdtdF9pbmZvOwogZXh0ZXJuIGludCByZXNldHdhaXR0aW1lOwogCiAvKioKQEAgLTU0OSwxMiArNTU3LDEzIEBACiAgKiBGb3IgcG9sbGluZywgTUZJIHJlcXVpcmVzIHRoZSBjbWRfc3RhdHVzIHRvIGJlIHNldCB0byAweEZGIGJlZm9yZSBwb3N0aW5nLgogICovCiBpbnQKLXdhaXRfYW5kX3BvbGwoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLCBzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZCkKK3dhaXRfYW5kX3BvbGwoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLCBzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZCwKKwlpbnQgc2Vjb25kcykKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgbWVnYXNhc19oZWFkZXIgKmZyYW1lX2hkciA9ICZjbWQtPmZyYW1lLT5oZHI7CiAKLQl1MzIgbXNlY3MgPSBNRklfUE9MTF9USU1FT1VUX1NFQ1MgKiAxMDAwOworCXUzMiBtc2VjcyA9IHNlY29uZHMgKiAxMDAwOwogCiAJLyoKIAkgKiBXYWl0IGZvciBjbWRfc3RhdHVzIHRvIGNoYW5nZQpAQCAtNTg1LDcgKzU5NCw3IEBACiAJc3RydWN0IG1lZ2FzYXNfY21kICpjbWQ7CiAJdTggcmV0OwogCXN0cnVjdCBmdXNpb25fY29udGV4dCAqZnVzaW9uOwotCXVuaW9uIE1FR0FTQVNfUkVRVUVTVF9ERVNDUklQVE9SX1VOSU9OICpyZXFfZGVzYzsKKwl1bmlvbiBNRUdBU0FTX1JFUVVFU1RfREVTQ1JJUFRPUl9VTklPTiByZXFfZGVzYzsKIAlpbnQgaTsKIAlzdHJ1Y3QgbWVnYXNhc19oZWFkZXIgKmZyYW1lX2hkcjsKIApAQCAtNjQ0LDE4ICs2NTMsMTggQEAKIAkvKiBDb252ZXJ0IGNhcGFiaWxpdHkgdG8gTEUzMiAqLwogCWNwdV90b19sZTMycygodTMyICopJmluaXRfZnJhbWUtPmRyaXZlcl9vcGVyYXRpb25zLm1maV9jYXBhYmlsaXRpZXMpOwogCi0JaW5pdF9mcmFtZS0+cXVldWVfaW5mb19uZXdfcGh5c19hZGRyX2xvID0gY3B1X3RvX2xlMzIoKHUzMilpb2NfaW5pdF9oYW5kbGUpOworCWluaXRfZnJhbWUtPnF1ZXVlX2luZm9fbmV3X3BoeXNfYWRkcl9oaSA9CisJCWNwdV90b19sZTMyKHVwcGVyXzMyX2JpdHMoaW9jX2luaXRfaGFuZGxlKSk7CisJaW5pdF9mcmFtZS0+cXVldWVfaW5mb19uZXdfcGh5c19hZGRyX2xvID0KKwkJY3B1X3RvX2xlMzIobG93ZXJfMzJfYml0cyhpb2NfaW5pdF9oYW5kbGUpKTsKIAlpbml0X2ZyYW1lLT5kYXRhX3hmZXJfbGVuID0gY3B1X3RvX2xlMzIoc2l6ZW9mKHN0cnVjdCBNUEkyX0lPQ19JTklUX1JFUVVFU1QpKTsKIAotCXJlcV9kZXNjID0KLQkgICh1bmlvbiBNRUdBU0FTX1JFUVVFU1RfREVTQ1JJUFRPUl9VTklPTiAqKWZ1c2lvbi0+cmVxX2ZyYW1lc19kZXNjOwotCi0JcmVxX2Rlc2MtPldvcmRzID0gMDsKLQlyZXFfZGVzYy0+TUZBSW8uUmVxdWVzdEZsYWdzID0KKwlyZXFfZGVzYy5Xb3JkcyA9IDA7CisJcmVxX2Rlc2MuTUZBSW8uUmVxdWVzdEZsYWdzID0KIAkJKE1FR0FTQVNfUkVRX0RFU0NSSVBUX0ZMQUdTX01GQSA8PAogCQkgTUVHQVNBU19SRVFfREVTQ1JJUFRfRkxBR1NfVFlQRV9TSElGVCk7Ci0JY3B1X3RvX2xlMzJzKCh1MzIgKikmcmVxX2Rlc2MtPk1GQUlvKTsKLQlyZXFfZGVzYy0+V29yZHMgfD0gY3B1X3RvX2xlNjQoY21kLT5mcmFtZV9waHlzX2FkZHIpOworCWNwdV90b19sZTMycygodTMyICopJnJlcV9kZXNjLk1GQUlvKTsKKwlyZXFfZGVzYy5Xb3JkcyB8PSBjcHVfdG9fbGU2NChjbWQtPmZyYW1lX3BoeXNfYWRkcik7CiAKIAkvKgogCSAqIGRpc2FibGUgdGhlIGludHIgYmVmb3JlIGZpcmluZyB0aGUgaW5pdCBmcmFtZQpAQCAtNjY5LDEwICs2NzgsMTAgQEAKIAkJCWJyZWFrOwogCX0KIAotCWluc3RhbmNlLT5pbnN0YW5jZXQtPmZpcmVfY21kKGluc3RhbmNlLCByZXFfZGVzYy0+dS5sb3csCi0JCQkJICAgICAgcmVxX2Rlc2MtPnUuaGlnaCwgaW5zdGFuY2UtPnJlZ19zZXQpOworCWluc3RhbmNlLT5pbnN0YW5jZXQtPmZpcmVfY21kKGluc3RhbmNlLCByZXFfZGVzYy51LmxvdywKKwkJCQkgICAgICByZXFfZGVzYy51LmhpZ2gsIGluc3RhbmNlLT5yZWdfc2V0KTsKIAotCXdhaXRfYW5kX3BvbGwoaW5zdGFuY2UsIGNtZCk7CisJd2FpdF9hbmRfcG9sbChpbnN0YW5jZSwgY21kLCBNRklfUE9MTF9USU1FT1VUX1NFQ1MpOwogCiAJZnJhbWVfaGRyID0gJmNtZC0+ZnJhbWUtPmhkcjsKIAlpZiAoZnJhbWVfaGRyLT5jbWRfc3RhdHVzICE9IDApIHsKQEAgLTcyMyw3ICs3MzIsNyBAQAogCiAJaWYgKCFmdXNpb24pIHsKIAkJbWVnYXNhc19yZXR1cm5fY21kKGluc3RhbmNlLCBjbWQpOwotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKIAlkY21kID0gJmNtZC0+ZnJhbWUtPmRjbWQ7CkBAIC0xNjA0LDEzICsxNjEzLDE1IEBACiAJCQlNUl9SQUlEX0NUWF9SQUlEX0ZMQUdTX0lPX1NVQl9UWVBFX1NISUZUOwogCQlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikgfHwKIAkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVUlkpKQotCQkJaW9fcmVxdWVzdC0+SW9GbGFncyB8PQotCQkJCU1QSTI1X1NBU19ERVZJQ0UwX0ZMQUdTX0VOQUJMRURfRkFTVF9QQVRIOworCQkJaW9fcmVxdWVzdC0+SW9GbGFncyB8PSBjcHVfdG9fbGUxNigKKwkJCQlNUEkyNV9TQVNfREVWSUNFMF9GTEFHU19FTkFCTEVEX0ZBU1RfUEFUSCk7CiAJCWNtZC0+cmVxdWVzdF9kZXNjLT5TQ1NJSU8uUmVxdWVzdEZsYWdzID0KIAkJCShNUEkyX1JFUV9ERVNDUklQVF9GTEFHU19ISUdIX1BSSU9SSVRZIDw8CiAJCQkgTUVHQVNBU19SRVFfREVTQ1JJUFRfRkxBR1NfVFlQRV9TSElGVCk7CiAJCWNtZC0+cmVxdWVzdF9kZXNjLT5TQ1NJSU8uRGV2SGFuZGxlID0KIAkJCWxvY2FsX21hcF9wdHItPnJhaWRNYXAuZGV2SG5kbEluZm9bZGV2aWNlX2lkXS5jdXJEZXZIZGw7CisJCWNtZC0+cmVxdWVzdF9kZXNjLT5TQ1NJSU8uTVNJeEluZGV4ID0KKwkJCWluc3RhbmNlLT5tc2l4X3ZlY3RvcnMgPyBzbXBfcHJvY2Vzc29yX2lkKCkgJSBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzIDogMDsKIAkJLyoKIAkJICogSWYgdGhlIGNvbW1hbmQgaXMgZm9yIHRoZSB0YXBlIGRldmljZSwgc2V0IHRoZQogCQkgKiBGUCB0aW1lb3V0IHRvIHRoZSBvcyBsYXllciB0aW1lb3V0IHZhbHVlLgpAQCAtMTc3MCw3ICsxNzgxLDggQEAKIAogCWlmIChpbmRleCA+PSBpbnN0YW5jZS0+bWF4X2Z3X2NtZHMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJtZWdhc2FzOiBJbnZhbGlkIFNNSUQgKDB4JXgpcmVxdWVzdCBmb3IgIgotCQkgICAgICAgImRlc2NyaXB0b3JcbiIsIGluZGV4KTsKKwkJICAgICAgICJkZXNjcmlwdG9yIGZvciBzY3NpJWRcbiIsIGluZGV4LAorCQkJaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJZnVzaW9uID0gaW5zdGFuY2UtPmN0cmxfY29udGV4dDsKQEAgLTIwMzgsOCArMjA1MCwxMSBAQAogCQkvKiBJZiB3ZSBkaWRuJ3QgY29tcGxldGUgYW55IGNvbW1hbmRzLCBjaGVjayBmb3IgRlcgZmF1bHQgKi8KIAkJZndfc3RhdGUgPSBpbnN0YW5jZS0+aW5zdGFuY2V0LT5yZWFkX2Z3X3N0YXR1c19yZWcoCiAJCQlpbnN0YW5jZS0+cmVnX3NldCkgJiBNRklfU1RBVEVfTUFTSzsKLQkJaWYgKGZ3X3N0YXRlID09IE1GSV9TVEFURV9GQVVMVCkKKwkJaWYgKGZ3X3N0YXRlID09IE1GSV9TVEFURV9GQVVMVCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWRfc2FzOiBJb3AyU3lzRG9vcmJlbGxJbnQiCisJCQkgICAgICAgImZvciBzY3NpJWRcbiIsIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKIAkJCXNjaGVkdWxlX3dvcmsoJmluc3RhbmNlLT53b3JrX2luaXQpOworCQl9CiAJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMjIxMCw5ICsyMjI1LDEwIEBACiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gd2FpdHMgZm9yIG91dHN0YW5kaW5nIGNvbW1hbmRzIG9uIGZ1c2lvbiB0byBjb21wbGV0ZSAqLwotaW50IG1lZ2FzYXNfd2FpdF9mb3Jfb3V0c3RhbmRpbmdfZnVzaW9uKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSkKK2ludCBtZWdhc2FzX3dhaXRfZm9yX291dHN0YW5kaW5nX2Z1c2lvbihzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsCisJCQkJCWludCBpb3RpbWVvdXQsIGludCAqY29udmVydCkKIHsKLQlpbnQgaSwgb3V0c3RhbmRpbmcsIHJldHZhbCA9IDA7CisJaW50IGksIG91dHN0YW5kaW5nLCByZXR2YWwgPSAwLCBoYl9zZWNvbmRzX21pc3NlZCA9IDA7CiAJdTMyIGZ3X3N0YXRlOwogCiAJZm9yIChpID0gMDsgaSA8IHJlc2V0d2FpdHRpbWU7IGkrKykgewpAQCAtMjIyMSwxMCArMjIzNyw0MCBAQAogCQkJaW5zdGFuY2UtPnJlZ19zZXQpICYgTUZJX1NUQVRFX01BU0s7CiAJCWlmIChmd19zdGF0ZSA9PSBNRklfU1RBVEVfRkFVTFQpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FzYXM6IEZvdW5kIEZXIGluIEZBVUxUIHN0YXRlLCIKLQkJCSAgICAgICAiIHdpbGwgcmVzZXQgYWRhcHRlci5cbiIpOworCQkJICAgICAgICIgd2lsbCByZXNldCBhZGFwdGVyIHNjc2klZC5cbiIsCisJCQkJaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOwogCQkJcmV0dmFsID0gMTsKIAkJCWdvdG8gb3V0OwogCQl9CisJCS8qIElmIFNSLUlPViBWRiBtb2RlICYgaGVhcnRiZWF0IHRpbWVvdXQsIGRvbid0IHdhaXQgKi8KKwkJaWYgKGluc3RhbmNlLT5yZXF1ZXN0b3JJZCAmJiAhaW90aW1lb3V0KSB7CisJCQlyZXR2YWwgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBJZiBTUi1JT1YgVkYgbW9kZSAmIEkvTyB0aW1lb3V0LCBjaGVjayBmb3IgSEIgdGltZW91dCAqLworCQlpZiAoaW5zdGFuY2UtPnJlcXVlc3RvcklkICYmIGlvdGltZW91dCkgeworCQkJaWYgKGluc3RhbmNlLT5oYl9ob3N0X21lbS0+SEIuZndDb3VudGVyICE9CisJCQkgICAgaW5zdGFuY2UtPmhiX2hvc3RfbWVtLT5IQi5kcml2ZXJDb3VudGVyKSB7CisJCQkJaW5zdGFuY2UtPmhiX2hvc3RfbWVtLT5IQi5kcml2ZXJDb3VudGVyID0KKwkJCQkJaW5zdGFuY2UtPmhiX2hvc3RfbWVtLT5IQi5md0NvdW50ZXI7CisJCQkJaGJfc2Vjb25kc19taXNzZWQgPSAwOworCQkJfSBlbHNlIHsKKwkJCQloYl9zZWNvbmRzX21pc3NlZCsrOworCQkJCWlmIChoYl9zZWNvbmRzX21pc3NlZCA9PQorCQkJCSAgICAoTUVHQVNBU19TUklPVl9IRUFSVEJFQVRfSU5URVJWQUxfVkYvSFopKSB7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FzYXM6IFNSLUlPVjoiCisJCQkJCSAgICAgICAiIEhlYXJ0YmVhdCBuZXZlciBjb21wbGV0ZWQgIgorCQkJCQkgICAgICAgIiB3aGlsZSBwb2xsaW5nIGR1cmluZyBJL08gIgorCQkJCQkgICAgICAgIiB0aW1lb3V0IGhhbmRsaW5nIGZvciAiCisJCQkJCSAgICAgICAic2NzaSVkLlxuIiwKKwkJCQkJICAgICAgIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJCQkJICAgICAgICpjb252ZXJ0ID0gMTsKKwkJCQkJICAgICAgIHJldHZhbCA9IDE7CisJCQkJCSAgICAgICBnb3RvIG91dDsKKwkJCQl9CisJCQl9CisJCX0KIAogCQlvdXRzdGFuZGluZyA9IGF0b21pY19yZWFkKCZpbnN0YW5jZS0+Zndfb3V0c3RhbmRpbmcpOwogCQlpZiAoIW91dHN0YW5kaW5nKQpAQCAtMjIzMiw3ICsyMjc4LDggQEAKIAogCQlpZiAoIShpICUgTUVHQVNBU19SRVNFVF9OT1RJQ0VfSU5URVJWQUwpKSB7CiAJCQlwcmludGsoS0VSTl9OT1RJQ0UgIm1lZ2FzYXM6IFslMmRdd2FpdGluZyBmb3IgJWQgIgotCQkJICAgICAgICJjb21tYW5kcyB0byBjb21wbGV0ZVxuIiwgaSwgb3V0c3RhbmRpbmcpOworCQkJICAgICAgICJjb21tYW5kcyB0byBjb21wbGV0ZSBmb3Igc2NzaSVkXG4iLCBpLAorCQkJICAgICAgIG91dHN0YW5kaW5nLCBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CiAJCQltZWdhc2FzX2NvbXBsZXRlX2NtZF9kcGNfZnVzaW9uKAogCQkJCSh1bnNpZ25lZCBsb25nKWluc3RhbmNlKTsKIAkJfQpAQCAtMjI0MSw3ICsyMjg4LDggQEAKIAogCWlmIChhdG9taWNfcmVhZCgmaW5zdGFuY2UtPmZ3X291dHN0YW5kaW5nKSkgewogCQlwcmludGsoIm1lZ2FyYWlkX3NhczogcGVuZGluZyBjb21tYW5kcyByZW1haW4gYWZ0ZXIgd2FpdGluZywgIgotCQkgICAgICAgIndpbGwgcmVzZXQgYWRhcHRlci5cbiIpOworCQkgICAgICAgIndpbGwgcmVzZXQgYWRhcHRlciBzY3NpJWQuXG4iLAorCQkgICAgICAgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOwogCQlyZXR2YWwgPSAxOwogCX0KIG91dDoKQEAgLTIyNjMsMTAgKzIzMTEsMzQgQEAKIAkJcmVwbHlfZGVzYy0+V29yZHMgPSBVTExPTkdfTUFYOwogfQogCi0vKiBDb3JlIGZ1c2lvbiByZXNldCBmdW5jdGlvbiAqLwotaW50IG1lZ2FzYXNfcmVzZXRfZnVzaW9uKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQorLyogQ2hlY2sgZm9yIGEgc2Vjb25kIHBhdGggdGhhdCBpcyBjdXJyZW50bHkgVVAgKi8KK2ludCBtZWdhc2FzX2NoZWNrX21waW9fcGF0aHMoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLAorCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCiB7Ci0JaW50IHJldHZhbCA9IFNVQ0NFU1MsIGksIGosIHJldHJ5ID0gMDsKKwlpbnQgaSwgaiwgcmV0dmFsID0gKERJRF9SRVNFVCA8PCAxNik7CisKKwlpZiAoaW5zdGFuY2UtPm1waW8gJiYgaW5zdGFuY2UtPnJlcXVlc3RvcklkKSB7CisJCWZvciAoaSA9IDAgOyBpIDwgTUFYX01HTVRfQURBUFRFUlMgOyBpKyspCisJCQlmb3IgKGogPSAwIDsgaiA8IE1BWF9MT0dJQ0FMX0RSSVZFUzsgaisrKQorCQkJCWlmIChtZWdhc2FzX21nbXRfaW5mby5pbnN0YW5jZVtpXSAmJgorCQkJCSAgICAobWVnYXNhc19tZ210X2luZm8uaW5zdGFuY2VbaV0gIT0gaW5zdGFuY2UpICYmCisJCQkJICAgIG1lZ2FzYXNfbWdtdF9pbmZvLmluc3RhbmNlW2ldLT5tcGlvICYmCisJCQkJICAgIG1lZ2FzYXNfbWdtdF9pbmZvLmluc3RhbmNlW2ldLT5yZXF1ZXN0b3JJZAorCQkJCSAgICAmJgorCQkJCSAgICAobWVnYXNhc19tZ210X2luZm8uaW5zdGFuY2VbaV0tPmxkX2lkc1tqXQorCQkJCSAgICAgPT0gc2NtZC0+ZGV2aWNlLT5pZCkpIHsKKwkJCQkJICAgIHJldHZhbCA9IChESURfTk9fQ09OTkVDVCA8PCAxNik7CisJCQkJCSAgICBnb3RvIG91dDsKKwkJCQl9CisJfQorb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIENvcmUgZnVzaW9uIHJlc2V0IGZ1bmN0aW9uICovCitpbnQgbWVnYXNhc19yZXNldF9mdXNpb24oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGludCBpb3RpbWVvdXQpCit7CisJaW50IHJldHZhbCA9IFNVQ0NFU1MsIGksIGosIHJldHJ5ID0gMCwgY29udmVydCA9IDA7CiAJc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlOwogCXN0cnVjdCBtZWdhc2FzX2NtZF9mdXNpb24gKmNtZF9mdXNpb247CiAJc3RydWN0IGZ1c2lvbl9jb250ZXh0ICpmdXNpb247CkBAIC0yMjc3LDI4ICsyMzQ5LDM5IEBACiAJaW5zdGFuY2UgPSAoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKilzaG9zdC0+aG9zdGRhdGE7CiAJZnVzaW9uID0gaW5zdGFuY2UtPmN0cmxfY29udGV4dDsKIAorCW11dGV4X2xvY2soJmluc3RhbmNlLT5yZXNldF9tdXRleCk7CisKIAlpZiAoaW5zdGFuY2UtPmFkcHJlY292ZXJ5ID09IE1FR0FTQVNfSFdfQ1JJVElDQUxfRVJST1IpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWRfc2FzOiBIYXJkd2FyZSBjcml0aWNhbCBlcnJvciwgIgotCQkgICAgICAgInJldHVybmluZyBGQUlMRUQuXG4iKTsKKwkJICAgICAgICJyZXR1cm5pbmcgRkFJTEVEIGZvciBzY3NpJWQuXG4iLAorCQkJaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOwogCQlyZXR1cm4gRkFJTEVEOwogCX0KIAotCW11dGV4X2xvY2soJmluc3RhbmNlLT5yZXNldF9tdXRleCk7CisJaWYgKGluc3RhbmNlLT5yZXF1ZXN0b3JJZCAmJiAhaW5zdGFuY2UtPnNraXBfaGVhcnRiZWF0X3RpbWVyX2RlbCkKKwkJZGVsX3RpbWVyX3N5bmMoJmluc3RhbmNlLT5zcmlvdl9oZWFydGJlYXRfdGltZXIpOwogCXNldF9iaXQoTUVHQVNBU19GVVNJT05fSU5fUkVTRVQsICZpbnN0YW5jZS0+cmVzZXRfZmxhZ3MpOwotCWluc3RhbmNlLT5hZHByZWNvdmVyeSA9IE1FR0FTQVNfQURQUkVTRVRfU01fSU5GQVVMVDsKKwlpbnN0YW5jZS0+YWRwcmVjb3ZlcnkgPSBNRUdBU0FTX0FEUFJFU0VUX1NNX1BPTExJTkc7CiAJaW5zdGFuY2UtPmluc3RhbmNldC0+ZGlzYWJsZV9pbnRyKGluc3RhbmNlKTsKIAltc2xlZXAoMTAwMCk7CiAKIAkvKiBGaXJzdCB0cnkgd2FpdGluZyBmb3IgY29tbWFuZHMgdG8gY29tcGxldGUgKi8KLQlpZiAobWVnYXNhc193YWl0X2Zvcl9vdXRzdGFuZGluZ19mdXNpb24oaW5zdGFuY2UpKSB7CisJaWYgKG1lZ2FzYXNfd2FpdF9mb3Jfb3V0c3RhbmRpbmdfZnVzaW9uKGluc3RhbmNlLCBpb3RpbWVvdXQsCisJCQkJCQkmY29udmVydCkpIHsKKwkJaW5zdGFuY2UtPmFkcHJlY292ZXJ5ID0gTUVHQVNBU19BRFBSRVNFVF9TTV9JTkZBVUxUOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZF9zYXM6IHJlc2V0dGluZyBmdXNpb24gIgotCQkgICAgICAgImFkYXB0ZXIuXG4iKTsKKwkJICAgICAgICJhZGFwdGVyIHNjc2klZC5cbiIsIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJaWYgKGNvbnZlcnQpCisJCQlpb3RpbWVvdXQgPSAwOworCiAJCS8qIE5vdyByZXR1cm4gY29tbWFuZHMgYmFjayB0byB0aGUgT1MgKi8KIAkJZm9yIChpID0gMCA7IGkgPCBpbnN0YW5jZS0+bWF4X2Z3X2NtZHM7IGkrKykgewogCQkJY21kX2Z1c2lvbiA9IGZ1c2lvbi0+Y21kX2xpc3RbaV07CiAJCQlpZiAoY21kX2Z1c2lvbi0+c2NtZCkgewogCQkJCXNjc2lfZG1hX3VubWFwKGNtZF9mdXNpb24tPnNjbWQpOwotCQkJCWNtZF9mdXNpb24tPnNjbWQtPnJlc3VsdCA9IChESURfUkVTRVQgPDwgMTYpOworCQkJCWNtZF9mdXNpb24tPnNjbWQtPnJlc3VsdCA9CisJCQkJCW1lZ2FzYXNfY2hlY2tfbXBpb19wYXRocyhpbnN0YW5jZSwKKwkJCQkJCQkJIGNtZF9mdXNpb24tPnNjbWQpOwogCQkJCWNtZF9mdXNpb24tPnNjbWQtPnNjc2lfZG9uZShjbWRfZnVzaW9uLT5zY21kKTsKIAkJCQltZWdhc2FzX3JldHVybl9jbWRfZnVzaW9uKGluc3RhbmNlLCBjbWRfZnVzaW9uKTsKIAkJCQlhdG9taWNfZGVjKCZpbnN0YW5jZS0+Zndfb3V0c3RhbmRpbmcpOwpAQCAtMjMxMywxMyArMjM5Niw2NyBAQAogCQkgICAgKGFic19zdGF0ZSA9PSBNRklfU1RBVEVfRkFVTFQgJiYgIXJlc2V0X2FkYXB0ZXIpKSB7CiAJCQkvKiBSZXNldCBub3Qgc3VwcG9ydGVkLCBraWxsIGFkYXB0ZXIgKi8KIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkX3NhczogUmVzZXQgbm90IHN1cHBvcnRlZCIKLQkJCSAgICAgICAiLCBraWxsaW5nIGFkYXB0ZXIuXG4iKTsKKwkJCSAgICAgICAiLCBraWxsaW5nIGFkYXB0ZXIgc2NzaSVkLlxuIiwKKwkJCQlpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CiAJCQltZWdhcmFpZF9zYXNfa2lsbF9oYmEoaW5zdGFuY2UpOworCQkJaW5zdGFuY2UtPnNraXBfaGVhcnRiZWF0X3RpbWVyX2RlbCA9IDE7CiAJCQlpbnN0YW5jZS0+YWRwcmVjb3ZlcnkgPSBNRUdBU0FTX0hXX0NSSVRJQ0FMX0VSUk9SOwogCQkJcmV0dmFsID0gRkFJTEVEOwogCQkJZ290byBvdXQ7CiAJCX0KIAorCQkvKiBMZXQgU1ItSU9WIFZGICYgUEYgc3luYyB1cCBpZiB0aGVyZSB3YXMgYSBIQiBmYWlsdXJlICovCisJCWlmIChpbnN0YW5jZS0+cmVxdWVzdG9ySWQgJiYgIWlvdGltZW91dCkgeworCQkJbXNsZWVwKE1FR0FTQVNfT0NSX1NFVFRMRV9USU1FX1ZGKTsKKwkJCS8qIExvb2sgZm9yIGEgbGF0ZSBIQiB1cGRhdGUgYWZ0ZXIgVkYgc2V0dGxlIHRpbWUgKi8KKwkJCWlmIChhYnNfc3RhdGUgPT0gTUZJX1NUQVRFX09QRVJBVElPTkFMICYmCisJCQkgICAgKGluc3RhbmNlLT5oYl9ob3N0X21lbS0+SEIuZndDb3VudGVyICE9CisJCQkgICAgIGluc3RhbmNlLT5oYl9ob3N0X21lbS0+SEIuZHJpdmVyQ291bnRlcikpIHsKKwkJCQkJaW5zdGFuY2UtPmhiX2hvc3RfbWVtLT5IQi5kcml2ZXJDb3VudGVyID0KKwkJCQkJCWluc3RhbmNlLT5oYl9ob3N0X21lbS0+SEIuZndDb3VudGVyOworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhc2FzOiBTUi1JT1Y6IgorCQkJCQkgICAgICAgIkxhdGUgRlcgaGVhcnRiZWF0IHVwZGF0ZSBmb3IgIgorCQkJCQkgICAgICAgInNjc2klZC5cbiIsCisJCQkJCSAgICAgICBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCQl9IGVsc2UgeworCQkJCS8qIEluIFZGIG1vZGUsIGZpcnN0IHBvbGwgZm9yIEZXIHJlYWR5ICovCisJCQkJZm9yIChpID0gMDsKKwkJCQkgICAgIGkgPCAoTUVHQVNBU19SRVNFVF9XQUlUX1RJTUUgKiAxMDAwKTsKKwkJCQkgICAgIGkgKz0gMjApIHsKKwkJCQkJc3RhdHVzX3JlZyA9CisJCQkJCQlpbnN0YW5jZS0+aW5zdGFuY2V0LT4KKwkJCQkJCXJlYWRfZndfc3RhdHVzX3JlZygKKwkJCQkJCQlpbnN0YW5jZS0+cmVnX3NldCk7CisJCQkJCWFic19zdGF0ZSA9IHN0YXR1c19yZWcgJgorCQkJCQkJTUZJX1NUQVRFX01BU0s7CisJCQkJCWlmIChhYnNfc3RhdGUgPT0gTUZJX1NUQVRFX1JFQURZKSB7CisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhc2FzIgorCQkJCQkJICAgICAgICI6IFNSLUlPVjogRlcgd2FzIGZvdW5kIgorCQkJCQkJICAgICAgICJ0byBiZSBpbiByZWFkeSBzdGF0ZSAiCisJCQkJCQkgICAgICAgImZvciBzY3NpJWQuXG4iLAorCQkJCQkJICAgICAgIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCW1zbGVlcCgyMCk7CisJCQkJfQorCQkJCWlmIChhYnNfc3RhdGUgIT0gTUZJX1NUQVRFX1JFQURZKSB7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FzYXM6IFNSLUlPVjogIgorCQkJCQkgICAgICAgIkZXIG5vdCBpbiByZWFkeSBzdGF0ZSBhZnRlciAlZCIKKwkJCQkJICAgICAgICIgc2Vjb25kcyBmb3Igc2NzaSVkLCBzdGF0dXNfcmVnID0gIgorCQkJCQkgICAgICAgIjB4JXguXG4iLAorCQkJCQkgICAgICAgTUVHQVNBU19SRVNFVF9XQUlUX1RJTUUsCisJCQkJCSAgICAgICBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubywKKwkJCQkJICAgICAgIHN0YXR1c19yZWcpOworCQkJCQltZWdhcmFpZF9zYXNfa2lsbF9oYmEoaW5zdGFuY2UpOworCQkJCQlpbnN0YW5jZS0+c2tpcF9oZWFydGJlYXRfdGltZXJfZGVsID0gMTsKKwkJCQkJaW5zdGFuY2UtPmFkcHJlY292ZXJ5ID0KKwkJCQkJCU1FR0FTQVNfSFdfQ1JJVElDQUxfRVJST1I7CisJCQkJCXJldHZhbCA9IEZBSUxFRDsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQl9CisKIAkJLyogTm93IHRyeSB0byByZXNldCB0aGUgY2hpcCAqLwogCQlmb3IgKGkgPSAwOyBpIDwgTUVHQVNBU19GVVNJT05fTUFYX1JFU0VUX1RSSUVTOyBpKyspIHsKIAkJCXdyaXRlbChNUEkyX1dSU0VRX0ZMVVNIX0tFWV9WQUxVRSwKQEAgLTIzNDYsNyArMjQ4Myw5IEBACiAJCQkJcmVhZGwoJmluc3RhbmNlLT5yZWdfc2V0LT5mdXNpb25faG9zdF9kaWFnKTsKIAkJCQlpZiAocmV0cnkrKyA9PSAxMDApIHsKIAkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWRfc2FzOiAiCi0JCQkJCSAgICAgICAiSG9zdCBkaWFnIHVubG9jayBmYWlsZWQhXG4iKTsKKwkJCQkJICAgICAgICJIb3N0IGRpYWcgdW5sb2NrIGZhaWxlZCEgIgorCQkJCQkgICAgICAgImZvciBzY3NpJWRcbiIsCisJCQkJCQlpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KQEAgLTIzNjgsNyArMjUwNyw4IEBACiAJCQkJaWYgKHJldHJ5KysgPT0gMTAwMCkgewogCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZF9zYXM6ICIKIAkJCQkJICAgICAgICJEaWFnIHJlc2V0IGFkYXB0ZXIgbmV2ZXIgIgotCQkJCQkgICAgICAgImNsZWFyZWQhXG4iKTsKKwkJCQkJICAgICAgICJjbGVhcmVkIGZvciBzY3NpJWQhXG4iLAorCQkJCQkJaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CkBAIC0yMzkwLDI5ICsyNTMwLDI5IEBACiAJCQlpZiAoYWJzX3N0YXRlIDw9IE1GSV9TVEFURV9GV19JTklUKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWRfc2FzOiBmaXJtd2FyZSAiCiAJCQkJICAgICAgICJzdGF0ZSA8IE1GSV9TVEFURV9GV19JTklULCBzdGF0ZSA9ICIKLQkJCQkgICAgICAgIjB4JXhcbiIsIGFic19zdGF0ZSk7CisJCQkJICAgICAgICIweCV4IGZvciBzY3NpJWRcbiIsIGFic19zdGF0ZSwKKwkJCQkJaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCiAJCQkvKiBXYWl0IGZvciBGVyB0byBiZWNvbWUgcmVhZHkgKi8KIAkJCWlmIChtZWdhc2FzX3RyYW5zaXRpb25fdG9fcmVhZHkoaW5zdGFuY2UsIDEpKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWRfc2FzOiBGYWlsZWQgdG8gIgotCQkJCSAgICAgICAidHJhbnNpdGlvbiBjb250cm9sbGVyIHRvIHJlYWR5LlxuIik7CisJCQkJICAgICAgICJ0cmFuc2l0aW9uIGNvbnRyb2xsZXIgdG8gcmVhZHkgIgorCQkJCSAgICAgICAiZm9yIHNjc2klZC5cbiIsCisJCQkJICAgICAgIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAogCQkJbWVnYXNhc19yZXNldF9yZXBseV9kZXNjKGluc3RhbmNlKTsKIAkJCWlmIChtZWdhc2FzX2lvY19pbml0X2Z1c2lvbihpbnN0YW5jZSkpIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZF9zYXM6ICIKLQkJCQkgICAgICAgIm1lZ2FzYXNfaW9jX2luaXRfZnVzaW9uKCkgZmFpbGVkIVxuIik7CisJCQkJICAgICAgICJtZWdhc2FzX2lvY19pbml0X2Z1c2lvbigpIGZhaWxlZCEiCisJCQkJICAgICAgICIgZm9yIHNjc2klZFxuIiwKKwkJCQkgICAgICAgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQljbGVhcl9iaXQoTUVHQVNBU19GVVNJT05fSU5fUkVTRVQsCi0JCQkJICAmaW5zdGFuY2UtPnJlc2V0X2ZsYWdzKTsKLQkJCWluc3RhbmNlLT5pbnN0YW5jZXQtPmVuYWJsZV9pbnRyKGluc3RhbmNlKTsKLQkJCWluc3RhbmNlLT5hZHByZWNvdmVyeSA9IE1FR0FTQVNfSEJBX09QRVJBVElPTkFMOwotCiAJCQkvKiBSZS1maXJlIG1hbmFnZW1lbnQgY29tbWFuZHMgKi8KIAkJCWZvciAoaiA9IDAgOyBqIDwgaW5zdGFuY2UtPm1heF9md19jbWRzOyBqKyspIHsKIAkJCQljbWRfZnVzaW9uID0gZnVzaW9uLT5jbWRfbGlzdFtqXTsKQEAgLTI0MjIsNyArMjU2Miw3IEBACiAJCQkJCWluc3RhbmNlLT4KIAkJCQkJY21kX2xpc3RbY21kX2Z1c2lvbi0+c3luY19jbWRfaWR4XTsKIAkJCQkJaWYgKGNtZF9tZmktPmZyYW1lLT5kY21kLm9wY29kZSA9PQotCQkJCQkgICAgTVJfRENNRF9MRF9NQVBfR0VUX0lORk8pIHsKKwkJCQkJICAgIGNwdV90b19sZTMyKE1SX0RDTURfTERfTUFQX0dFVF9JTkZPKSkgewogCQkJCQkJbWVnYXNhc19yZXR1cm5fY21kKGluc3RhbmNlLAogCQkJCQkJCQkgICBjbWRfbWZpKTsKIAkJCQkJCW1lZ2FzYXNfcmV0dXJuX2NtZF9mdXNpb24oCkBAIC0yNDMzLDExICsyNTczLDE1IEBACiAJCQkJCQkJaW5zdGFuY2UsCiAJCQkJCQkJY21kX21maS0+Y29udGV4dC5zbWlkCiAJCQkJCQkJLTEpOwotCQkJCQkJaWYgKCFyZXFfZGVzYykKKwkJCQkJCWlmICghcmVxX2Rlc2MpIHsKIAkJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkJCQkJICAgICAgICJyZXFfZGVzYyBOVUxMIgotCQkJCQkJCSAgICAgICAiXG4iKTsKLQkJCQkJCWVsc2UgeworCQkJCQkJCSAgICAgICAiIGZvciBzY3NpJWRcbiIsCisJCQkJCQkJCWluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJCQkJCQkvKiBSZXR1cm4gbGVha2VkIE1QVAorCQkJCQkJCSAgIGZyYW1lICovCisJCQkJCQkJbWVnYXNhc19yZXR1cm5fY21kX2Z1c2lvbihpbnN0YW5jZSwgY21kX2Z1c2lvbik7CisJCQkJCQl9IGVsc2UgewogCQkJCQkJCWluc3RhbmNlLT5pbnN0YW5jZXQtPgogCQkJCQkJCWZpcmVfY21kKGluc3RhbmNlLAogCQkJCQkJCQkgcmVxX2Rlc2MtPgpAQCAtMjQ1MSw2ICsyNTk1LDExIEBACiAJCQkJfQogCQkJfQogCisJCQljbGVhcl9iaXQoTUVHQVNBU19GVVNJT05fSU5fUkVTRVQsCisJCQkJICAmaW5zdGFuY2UtPnJlc2V0X2ZsYWdzKTsKKwkJCWluc3RhbmNlLT5pbnN0YW5jZXQtPmVuYWJsZV9pbnRyKGluc3RhbmNlKTsKKwkJCWluc3RhbmNlLT5hZHByZWNvdmVyeSA9IE1FR0FTQVNfSEJBX09QRVJBVElPTkFMOworCiAJCQkvKiBSZXNldCBsb2FkIGJhbGFuY2UgaW5mbyAqLwogCQkJbWVtc2V0KGZ1c2lvbi0+bG9hZF9iYWxhbmNlX2luZm8sIDAsCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBMRF9MT0FEX0JBTEFOQ0VfSU5GTykKQEAgLTI0NTksMTggKzI2MDgsMzkgQEAKIAkJCWlmICghbWVnYXNhc19nZXRfbWFwX2luZm8oaW5zdGFuY2UpKQogCQkJCW1lZ2FzYXNfc3luY19tYXBfaW5mbyhpbnN0YW5jZSk7CiAKKwkJCS8qIFJlc3RhcnQgU1ItSU9WIGhlYXJ0YmVhdCAqLworCQkJaWYgKGluc3RhbmNlLT5yZXF1ZXN0b3JJZCkgeworCQkJCWlmICghbWVnYXNhc19zcmlvdl9zdGFydF9oZWFydGJlYXQoaW5zdGFuY2UsIDApKQorCQkJCQltZWdhc2FzX3N0YXJ0X3RpbWVyKGluc3RhbmNlLAorCQkJCQkJCSAgICAmaW5zdGFuY2UtPnNyaW92X2hlYXJ0YmVhdF90aW1lciwKKwkJCQkJCQkgICAgbWVnYXNhc19zcmlvdl9oZWFydGJlYXRfaGFuZGxlciwKKwkJCQkJCQkgICAgTUVHQVNBU19TUklPVl9IRUFSVEJFQVRfSU5URVJWQUxfVkYpOworCQkJCWVsc2UKKwkJCQkJaW5zdGFuY2UtPnNraXBfaGVhcnRiZWF0X3RpbWVyX2RlbCA9IDE7CisJCQl9CisKIAkJCS8qIEFkYXB0ZXIgcmVzZXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLwogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWRfc2FzOiBSZXNldCAiCi0JCQkgICAgICAgInN1Y2Nlc3NmdWwuXG4iKTsKKwkJCSAgICAgICAic3VjY2Vzc2Z1bCBmb3Igc2NzaSVkLlxuIiwKKwkJCQlpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CiAJCQlyZXR2YWwgPSBTVUNDRVNTOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJLyogUmVzZXQgZmFpbGVkLCBraWxsIHRoZSBhZGFwdGVyICovCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkX3NhczogUmVzZXQgZmFpbGVkLCBraWxsaW5nICIKLQkJICAgICAgICJhZGFwdGVyLlxuIik7CisJCSAgICAgICAiYWRhcHRlciBzY3NpJWQuXG4iLCBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CiAJCW1lZ2FyYWlkX3Nhc19raWxsX2hiYShpbnN0YW5jZSk7CisJCWluc3RhbmNlLT5za2lwX2hlYXJ0YmVhdF90aW1lcl9kZWwgPSAxOworCQlpbnN0YW5jZS0+YWRwcmVjb3ZlcnkgPSBNRUdBU0FTX0hXX0NSSVRJQ0FMX0VSUk9SOwogCQlyZXR2YWwgPSBGQUlMRUQ7CiAJfSBlbHNlIHsKKwkJLyogRm9yIFZGOiBSZXN0YXJ0IEhCIHRpbWVyIGlmIHdlIGRpZG4ndCBPQ1IgKi8KKwkJaWYgKGluc3RhbmNlLT5yZXF1ZXN0b3JJZCkgeworCQkJbWVnYXNhc19zdGFydF90aW1lcihpbnN0YW5jZSwKKwkJCQkJICAgICZpbnN0YW5jZS0+c3Jpb3ZfaGVhcnRiZWF0X3RpbWVyLAorCQkJCQkgICAgbWVnYXNhc19zcmlvdl9oZWFydGJlYXRfaGFuZGxlciwKKwkJCQkJICAgIE1FR0FTQVNfU1JJT1ZfSEVBUlRCRUFUX0lOVEVSVkFMX1ZGKTsKKwkJfQogCQljbGVhcl9iaXQoTUVHQVNBU19GVVNJT05fSU5fUkVTRVQsICZpbnN0YW5jZS0+cmVzZXRfZmxhZ3MpOwogCQlpbnN0YW5jZS0+aW5zdGFuY2V0LT5lbmFibGVfaW50cihpbnN0YW5jZSk7CiAJCWluc3RhbmNlLT5hZHByZWNvdmVyeSA9IE1FR0FTQVNfSEJBX09QRVJBVElPTkFMOwpAQCAtMjQ4Nyw3ICsyNjU3LDcgQEAKIAlzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UsIHdvcmtfaW5pdCk7CiAKLQltZWdhc2FzX3Jlc2V0X2Z1c2lvbihpbnN0YW5jZS0+aG9zdCk7CisJbWVnYXNhc19yZXNldF9mdXNpb24oaW5zdGFuY2UtPmhvc3QsIDApOwogfQogCiBzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZV90ZW1wbGF0ZSBtZWdhc2FzX2luc3RhbmNlX3RlbXBsYXRlX2Z1c2lvbiA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnVzaW9uLmggYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Z1c2lvbi5oCmluZGV4IDM1YTUxMzkuLmU3NmFmNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnVzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mdXNpb24uaApAQCAtNDg1LDYgKzQ4NSw5IEBACiAjZGVmaW5lIE1BWF9QSFlTSUNBTF9ERVZJQ0VTIDI1NgogI2RlZmluZSBNQVhfUkFJRE1BUF9QSFlTSUNBTF9ERVZJQ0VTIChNQVhfUEhZU0lDQUxfREVWSUNFUykKICNkZWZpbmUgTVJfRENNRF9MRF9NQVBfR0VUX0lORk8gICAgICAgICAgICAgMHgwMzAwZTEwMQorI2RlZmluZSBNUl9EQ01EX0NUUkxfU0hBUkVEX0hPU1RfTUVNX0FMTE9DICAweDAxMGU4NDg1ICAgLyogU1ItSU9WIEhCIGFsbG9jKi8KKyNkZWZpbmUgTVJfRENNRF9MRF9WRl9NQVBfR0VUX0FMTF9MRFNfMTExICAgMHgwMzIwMDIwMAorI2RlZmluZSBNUl9EQ01EX0xEX1ZGX01BUF9HRVRfQUxMX0xEUyAgICAgICAweDAzMTUwMjAwCiAKIHN0cnVjdCBNUl9ERVZfSEFORExFX0lORk8gewogCXUxNiAgICAgY3VyRGV2SGRsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BhczE2LmMgYi9kcml2ZXJzL3Njc2kvcGFzMTYuYwppbmRleCA2MmYxYTYwLi4wZDc4YTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcGFzMTYuYworKysgYi9kcml2ZXJzL3Njc2kvcGFzMTYuYwpAQCAtNDUzLDcgKzQ1Myw3IEBACiAJICAgIGluc3RhbmNlLT5pcnEgPSBOQ1I1MzgwX3Byb2JlX2lycShpbnN0YW5jZSwgUEFTMTZfSVJRUyk7CiAKIAlpZiAoaW5zdGFuY2UtPmlycSAhPSBTQ1NJX0lSUV9OT05FKSAKLQkgICAgaWYgKHJlcXVlc3RfaXJxKGluc3RhbmNlLT5pcnEsIHBhczE2X2ludHIsIElSUUZfRElTQUJMRUQsCisJICAgIGlmIChyZXF1ZXN0X2lycShpbnN0YW5jZS0+aXJxLCBwYXMxNl9pbnRyLCAwLAogCQkJICAgICJwYXMxNiIsIGluc3RhbmNlKSkgewogCQlwcmludGsoInNjc2klZCA6IElSUSVkIG5vdCBmcmVlLCBpbnRlcnJ1cHRzIGRpc2FibGVkXG4iLCAKIAkJICAgIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+aXJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2N0bC5jIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfY3RsLmMKaW5kZXggYTA0YjRmZi4uMjhiNGU4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfY3RsLmMKKysrIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfY3RsLmMKQEAgLTMyMywyNCArMzIzLDE3IEBACiAJaW50IG9mZnNldDsKIAljaGFyICpzdHIgPSBidWY7CiAJaW50IHN0YXJ0ID0gMDsKLSNkZWZpbmUgSUJfTUVNTUFQKGMpCQlcCi0JCSgqKHUzMiAqKSgodTggKilwbTgwMDFfaGEtPgkJXAotCQltZW1vcnlNYXAucmVnaW9uW0lCXS52aXJ0X3B0ciArCQlcCisjZGVmaW5lIElCX01FTU1BUChjKQlcCisJCSgqKHUzMiAqKSgodTggKilwbTgwMDFfaGEtPglcCisJCW1lbW9yeU1hcC5yZWdpb25bSUJdLnZpcnRfcHRyICsJXAogCQlwbTgwMDFfaGEtPmV2dGxvZ19pYl9vZmZzZXQgKyAoYykpKQogCiAJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBJQl9PQl9SRUFEX1RJTUVTOyBvZmZzZXQrKykgewotCQlpZiAocG04MDAxX2hhLT5jaGlwX2lkICE9IGNoaXBfODAwMSkKLQkJCXN0ciArPSBzcHJpbnRmKHN0ciwgIjB4JTA4eFxuIiwgSUJfTUVNTUFQKHN0YXJ0KSk7Ci0JCWVsc2UKLQkJCXN0ciArPSBzcHJpbnRmKHN0ciwgIjB4JTA4eFxuIiwgSUJfTUVNTUFQKHN0YXJ0KSk7CisJCXN0ciArPSBzcHJpbnRmKHN0ciwgIjB4JTA4eFxuIiwgSUJfTUVNTUFQKHN0YXJ0KSk7CiAJCXN0YXJ0ID0gc3RhcnQgKyA0OwogCX0KIAlwbTgwMDFfaGEtPmV2dGxvZ19pYl9vZmZzZXQgKz0gU1lTRlNfT0ZGU0VUOwotCWlmICgoKChwbTgwMDFfaGEtPmV2dGxvZ19pYl9vZmZzZXQpICUgKFBNODBYWF9JQl9PQl9RVUVVRV9TSVpFKSkgPT0gMCkKLQkJJiYgKHBtODAwMV9oYS0+Y2hpcF9pZCAhPSBjaGlwXzgwMDEpKQotCQlwbTgwMDFfaGEtPmV2dGxvZ19pYl9vZmZzZXQgPSAwOwotCWlmICgoKChwbTgwMDFfaGEtPmV2dGxvZ19pYl9vZmZzZXQpICUgKFBNODAwMV9JQl9PQl9RVUVVRV9TSVpFKSkgPT0gMCkKLQkJJiYgKHBtODAwMV9oYS0+Y2hpcF9pZCA9PSBjaGlwXzgwMDEpKQorCWlmICgoKHBtODAwMV9oYS0+ZXZ0bG9nX2liX29mZnNldCkgJSAoUE04MFhYX0lCX09CX1FVRVVFX1NJWkUpKSA9PSAwKQogCQlwbTgwMDFfaGEtPmV2dGxvZ19pYl9vZmZzZXQgPSAwOwogCiAJcmV0dXJuIHN0ciAtIGJ1ZjsKQEAgLTM2MywyNCArMzU2LDE3IEBACiAJaW50IG9mZnNldDsKIAljaGFyICpzdHIgPSBidWY7CiAJaW50IHN0YXJ0ID0gMDsKLSNkZWZpbmUgT0JfTUVNTUFQKGMpCQlcCi0JCSgqKHUzMiAqKSgodTggKilwbTgwMDFfaGEtPgkJXAotCQltZW1vcnlNYXAucmVnaW9uW09CXS52aXJ0X3B0ciArCQlcCisjZGVmaW5lIE9CX01FTU1BUChjKQlcCisJCSgqKHUzMiAqKSgodTggKilwbTgwMDFfaGEtPglcCisJCW1lbW9yeU1hcC5yZWdpb25bT0JdLnZpcnRfcHRyICsJXAogCQlwbTgwMDFfaGEtPmV2dGxvZ19vYl9vZmZzZXQgKyAoYykpKQogCiAJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBJQl9PQl9SRUFEX1RJTUVTOyBvZmZzZXQrKykgewotCQlpZiAocG04MDAxX2hhLT5jaGlwX2lkICE9IGNoaXBfODAwMSkKLQkJCXN0ciArPSBzcHJpbnRmKHN0ciwgIjB4JTA4eFxuIiwgT0JfTUVNTUFQKHN0YXJ0KSk7Ci0JCWVsc2UKLQkJCXN0ciArPSBzcHJpbnRmKHN0ciwgIjB4JTA4eFxuIiwgT0JfTUVNTUFQKHN0YXJ0KSk7CisJCXN0ciArPSBzcHJpbnRmKHN0ciwgIjB4JTA4eFxuIiwgT0JfTUVNTUFQKHN0YXJ0KSk7CiAJCXN0YXJ0ID0gc3RhcnQgKyA0OwogCX0KIAlwbTgwMDFfaGEtPmV2dGxvZ19vYl9vZmZzZXQgKz0gU1lTRlNfT0ZGU0VUOwotCWlmICgoKChwbTgwMDFfaGEtPmV2dGxvZ19vYl9vZmZzZXQpICUgKFBNODBYWF9JQl9PQl9RVUVVRV9TSVpFKSkgPT0gMCkKLQkJCSYmIChwbTgwMDFfaGEtPmNoaXBfaWQgIT0gY2hpcF84MDAxKSkKLQkJcG04MDAxX2hhLT5ldnRsb2dfb2Jfb2Zmc2V0ID0gMDsKLQlpZiAoKCgocG04MDAxX2hhLT5ldnRsb2dfb2Jfb2Zmc2V0KSAlIChQTTgwMDFfSUJfT0JfUVVFVUVfU0laRSkpID09IDApCi0JCQkmJiAocG04MDAxX2hhLT5jaGlwX2lkID09IGNoaXBfODAwMSkpCisJaWYgKCgocG04MDAxX2hhLT5ldnRsb2dfb2Jfb2Zmc2V0KSAlIChQTTgwWFhfSUJfT0JfUVVFVUVfU0laRSkpID09IDApCiAJCXBtODAwMV9oYS0+ZXZ0bG9nX29iX29mZnNldCA9IDA7CiAKIAlyZXR1cm4gc3RyIC0gYnVmOwpAQCAtNDY2LDcgKzQ1Miw3IEBACiBzdGF0aWMgc3NpemVfdCBwbTgwMDFfY3RsX2ZhdGFsX2xvZ19zaG93KHN0cnVjdCBkZXZpY2UgKmNkZXYsCiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQl1MzIgY291bnQ7CisJc3NpemVfdCBjb3VudDsKIAogCWNvdW50ID0gcG04MHh4X2dldF9mYXRhbF9kdW1wKGNkZXYsIGF0dHIsIGJ1Zik7CiAJcmV0dXJuIGNvdW50OwpAQCAtNDg0LDcgKzQ3MCw3IEBACiBzdGF0aWMgc3NpemVfdCBwbTgwMDFfY3RsX2dzbV9sb2dfc2hvdyhzdHJ1Y3QgZGV2aWNlICpjZGV2LAogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0JdTMyIGNvdW50OworCXNzaXplX3QgY291bnQ7CiAKIAljb3VudCA9IHBtODAwMV9nZXRfZ3NtX2R1bXAoY2RldiwgU1lTRlNfT0ZGU0VULCBidWYpOwogCXJldHVybiBjb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2h3aS5jIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaHdpLmMKaW5kZXggMGExMjk2YS4uYTk3YmUwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaHdpLmMKKysrIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaHdpLmMKQEAgLTY0NCw3ICs2NDQsNyBAQAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBtODAwMV9oYS0+cGRldiwgUENJX0RFVklDRV9JRCwgJmRldmljZWlkKTsKIAkvKiA4MDgxIGNvbnRyb2xsZXJzIG5lZWQgQkFSIHNoaWZ0IHRvIGFjY2VzcyBNUEkgc3BhY2UKIAkqIGFzIHRoaXMgaXMgc2hhcmVkIHdpdGggQklPUyBkYXRhICovCi0JaWYgKGRldmljZWlkID09IDB4ODA4MSkgeworCWlmIChkZXZpY2VpZCA9PSAweDgwODEgfHwgZGV2aWNlaWQgPT0gMHgwMDQyKSB7CiAJCWlmICgtMSA9PSBwbTgwMDFfYmFyNF9zaGlmdChwbTgwMDFfaGEsIEdTTV9TTV9CQVNFKSkgewogCQkJUE04MDAxX0ZBSUxfREJHKHBtODAwMV9oYSwKIAkJCQlwbTgwMDFfcHJpbnRrKCJTaGlmdCBCYXI0IHRvIDB4JXggZmFpbGVkXG4iLApAQCAtNjczLDcgKzY3Myw3IEBACiAJZm9yIChpID0gMDsgaSA8IFBNODAwMV9NQVhfT1VUQl9OVU07IGkrKykKIAkJdXBkYXRlX291dGJuZF9xdWV1ZV90YWJsZShwbTgwMDFfaGEsIGkpOwogCS8qIDgwODEgY29udHJvbGxlciBkb25vdCByZXF1aXJlIHRoZXNlIG9wZXJhdGlvbnMgKi8KLQlpZiAoZGV2aWNlaWQgIT0gMHg4MDgxKSB7CisJaWYgKGRldmljZWlkICE9IDB4ODA4MSAmJiBkZXZpY2VpZCAhPSAweDAwNDIpIHsKIAkJbXBpX3NldF9waHlzX2czX3dpdGhfc3NjKHBtODAwMV9oYSwgMCk7CiAJCS8qIDctPjEzMG1zLCAzNC0+NTAwbXMsIDExOS0+MS41cyAqLwogCQltcGlfc2V0X29wZW5fcmV0cnlfaW50ZXJ2YWxfcmVnKHBtODAwMV9oYSwgMTE5KTsKQEAgLTcwMSw3ICs3MDEsNyBAQAogCXUzMiBnc3RfbGVuX21waXN0YXRlOwogCXUxNiBkZXZpY2VpZDsKIAlwY2lfcmVhZF9jb25maWdfd29yZChwbTgwMDFfaGEtPnBkZXYsIFBDSV9ERVZJQ0VfSUQsICZkZXZpY2VpZCk7Ci0JaWYgKGRldmljZWlkID09IDB4ODA4MSkgeworCWlmIChkZXZpY2VpZCA9PSAweDgwODEgfHwgZGV2aWNlaWQgPT0gMHgwMDQyKSB7CiAJCWlmICgtMSA9PSBwbTgwMDFfYmFyNF9zaGlmdChwbTgwMDFfaGEsIEdTTV9TTV9CQVNFKSkgewogCQkJUE04MDAxX0ZBSUxfREJHKHBtODAwMV9oYSwKIAkJCQlwbTgwMDFfcHJpbnRrKCJTaGlmdCBCYXI0IHRvIDB4JXggZmFpbGVkXG4iLApAQCAtMjUwMiwxMSArMjUwMiw3IEBACiAJCQkJSU9fT1BFTl9DTlhfRVJST1JfSVRfTkVYVVNfTE9TUyk7CiAJCQl0cy0+cmVzcCA9IFNBU19UQVNLX1VOREVMSVZFUkVEOwogCQkJdHMtPnN0YXQgPSBTQVNfUVVFVUVfRlVMTDsKLQkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQkJbWIoKTsvKmluIG9yZGVyIHRvIGZvcmNlIENQVSBvcmRlcmluZyovCi0JCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCQl0LT50YXNrX2RvbmUodCk7Ci0JCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOworCQkJcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKIAkJCXJldHVybjsKIAkJfQogCQlicmVhazsKQEAgLTI1MjIsMTEgKzI1MTgsNyBAQAogCQkJCUlPX09QRU5fQ05YX0VSUk9SX0lUX05FWFVTX0xPU1MpOwogCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKIAkJCXRzLT5zdGF0ID0gU0FTX1FVRVVFX0ZVTEw7Ci0JCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJCW1iKCk7LypkaXR0byovCi0JCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCQl0LT50YXNrX2RvbmUodCk7Ci0JCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOworCQkJcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKIAkJCXJldHVybjsKIAkJfQogCQlicmVhazsKQEAgLTI1NTAsMTEgKzI1NDIsNyBAQAogCQkJCUlPX09QRU5fQ05YX0VSUk9SX1NUUF9SRVNPVVJDRVNfQlVTWSk7CiAJCQl0cy0+cmVzcCA9IFNBU19UQVNLX1VOREVMSVZFUkVEOwogCQkJdHMtPnN0YXQgPSBTQVNfUVVFVUVfRlVMTDsKLQkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQkJbWIoKTsvKiBkaXR0byovCi0JCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCQl0LT50YXNrX2RvbmUodCk7Ci0JCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOworCQkJcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKIAkJCXJldHVybjsKIAkJfQogCQlicmVhazsKQEAgLTI2MTcsMTEgKzI2MDUsNyBAQAogCQkJCSAgICBJT19EU19OT05fT1BFUkFUSU9OQUwpOwogCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKIAkJCXRzLT5zdGF0ID0gU0FTX1FVRVVFX0ZVTEw7Ci0JCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJCW1iKCk7LypkaXR0byovCi0JCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCQl0LT50YXNrX2RvbmUodCk7Ci0JCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOworCQkJcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKIAkJCXJldHVybjsKIAkJfQogCQlicmVhazsKQEAgLTI2NDEsMTEgKzI2MjUsNyBAQAogCQkJCSAgICBJT19EU19JTl9FUlJPUik7CiAJCQl0cy0+cmVzcCA9IFNBU19UQVNLX1VOREVMSVZFUkVEOwogCQkJdHMtPnN0YXQgPSBTQVNfUVVFVUVfRlVMTDsKLQkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQkJbWIoKTsvKmRpdHRvKi8KLQkJCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJCXQtPnRhc2tfZG9uZSh0KTsKLQkJCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7CisJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwogCQkJcmV0dXJuOwogCQl9CiAJCWJyZWFrOwpAQCAtMjY3NCwyMCArMjY1NCw5IEBACiAJCQkiIHJlc3AgMHgleCBzdGF0IDB4JXggYnV0IGFib3J0ZWQgYnkgdXBwZXIgbGF5ZXIhXG4iLAogCQkJdCwgc3RhdHVzLCB0cy0+cmVzcCwgdHMtPnN0YXQpKTsKIAkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JfSBlbHNlIGlmICh0LT51bGRkX3Rhc2spIHsKKwl9IGVsc2UgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0LT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCW1iKCk7LyogZGl0dG8gKi8KLQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQl0LT50YXNrX2RvbmUodCk7Ci0JCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JfSBlbHNlIGlmICghdC0+dWxkZF90YXNrKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwotCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJbWIoKTsvKmRpdHRvKi8KLQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQl0LT50YXNrX2RvbmUodCk7Ci0JCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7CisJCXBtODAwMV9jY2JfdGFza19mcmVlX2RvbmUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CiAJfQogfQogCkBAIC0yNzk2LDExICsyNzY1LDcgQEAKIAkJCQlJT19PUEVOX0NOWF9FUlJPUl9JVF9ORVhVU19MT1NTKTsKIAkJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CiAJCQl0cy0+c3RhdCA9IFNBU19RVUVVRV9GVUxMOwotCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCQltYigpOy8qZGl0dG8qLwotCQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQkJdC0+dGFza19kb25lKHQpOwotCQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKKwkJCXBtODAwMV9jY2JfdGFza19mcmVlX2RvbmUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJYnJlYWs7CkBAIC0yOTA5LDIwICsyODc0LDkgQEAKIAkJCSIgcmVzcCAweCV4IHN0YXQgMHgleCBidXQgYWJvcnRlZCBieSB1cHBlciBsYXllciFcbiIsCiAJCQl0LCBldmVudCwgdHMtPnJlc3AsIHRzLT5zdGF0KSk7CiAJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCX0gZWxzZSBpZiAodC0+dWxkZF90YXNrKSB7CisJfSBlbHNlIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdC0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7Ci0JCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQltYigpOy8qIGRpdHRvICovCi0JCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJdC0+dGFza19kb25lKHQpOwotCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCX0gZWxzZSBpZiAoIXQtPnVsZGRfdGFzaykgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0LT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCW1iKCk7LypkaXR0byovCi0JCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJdC0+dGFza19kb25lKHQpOwotCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOworCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwogCX0KIH0KIApAQCAtNDQ2NywyMyArNDQyMSwxMSBAQAogCQkJCQkiIHN0YXQgMHgleCBidXQgYWJvcnRlZCBieSB1cHBlciBsYXllciAiCiAJCQkJCSJcbiIsIHRhc2ssIHRzLT5yZXNwLCB0cy0+c3RhdCkpOwogCQkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdGFzaywgY2NiLCB0YWcpOwotCQkJfSBlbHNlIGlmICh0YXNrLT51bGRkX3Rhc2spIHsKKwkJCX0gZWxzZSB7CiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLAogCQkJCQkJCWZsYWdzKTsKLQkJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHRhc2ssIGNjYiwgdGFnKTsKLQkJCQltYigpOy8qIGRpdHRvICovCi0JCQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQkJCXRhc2stPnRhc2tfZG9uZSh0YXNrKTsKLQkJCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQkJCXJldHVybiAwOwotCQkJfSBlbHNlIGlmICghdGFzay0+dWxkZF90YXNrKSB7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLAotCQkJCQkJCWZsYWdzKTsKLQkJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHRhc2ssIGNjYiwgdGFnKTsKLQkJCQltYigpOy8qZGl0dG8qLwotCQkJCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJCQl0YXNrLT50YXNrX2RvbmUodGFzayk7Ci0JCQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKKwkJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHBtODAwMV9oYSwgdGFzaywKKwkJCQkJCQkJY2NiLCB0YWcpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQl9CkBAIC01MDIwLDcgKzQ5NjIsNyBAQAogCS8qIGNoZWNrIG1heCBpcyAxIE1ieXRlcyAqLwogCWlmICgobGVuZ3RoID4gMHgxMDAwMDApIHx8IChnc21fZHVtcF9vZmZzZXQgJiAzKSB8fAogCQkoKGdzbV9kdW1wX29mZnNldCArIGxlbmd0aCkgPiAweDEwMDAwMDApKQotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChwbTgwMDFfaGEtPmNoaXBfaWQgPT0gY2hpcF84MDAxKQogCQliYXIgPSAyOwpAQCAtNTA0OCwxMiArNDk5MCwxMiBAQAogCQkJCWdzbV9iYXNlID0gR1NNX0JBU0U7CiAJCQkJaWYgKC0xID09IHBtODAwMV9iYXI0X3NoaWZ0KHBtODAwMV9oYSwKIAkJCQkJCShnc21fYmFzZSArIHNoaWZ0X3ZhbHVlKSkpCi0JCQkJCXJldHVybiAxOworCQkJCQlyZXR1cm4gLUVJTzsKIAkJCX0gZWxzZSB7CiAJCQkJZ3NtX2Jhc2UgPSAwOwogCQkJCWlmICgtMSA9PSBwbTgweHhfYmFyNF9zaGlmdChwbTgwMDFfaGEsCiAJCQkJCQkoZ3NtX2Jhc2UgKyBzaGlmdF92YWx1ZSkpKQotCQkJCQlyZXR1cm4gMTsKKwkJCQkJcmV0dXJuIC1FSU87CiAJCQl9CiAJCQlnc21fZHVtcF9vZmZzZXQgPSAoZ3NtX2R1bXBfb2Zmc2V0ICsgb2Zmc2V0KSAmCiAJCQkJCQkweEZGRkYwMDAwOwpAQCAtNTA3MiwxMyArNTAxNCw4IEBACiAJCWRpcmVjdF9kYXRhICs9IHNwcmludGYoZGlyZWN0X2RhdGEsICIlMDh4ICIsIHZhbHVlKTsKIAl9CiAJLyogU2hpZnQgYmFjayB0byBCQVI0IG9yaWdpbmFsIGFkZHJlc3MgKi8KLQlpZiAocG04MDAxX2hhLT5jaGlwX2lkID09IGNoaXBfODAwMSkgewotCQlpZiAoLTEgPT0gcG04MDAxX2JhcjRfc2hpZnQocG04MDAxX2hhLCAwKSkKLQkJCXJldHVybiAxOwotCX0gZWxzZSB7Ci0JCWlmICgtMSA9PSBwbTgweHhfYmFyNF9zaGlmdChwbTgwMDFfaGEsIDApKQotCQkJcmV0dXJuIDE7Ci0JfQorCWlmICgtMSA9PSBwbTgwMDFfYmFyNF9zaGlmdChwbTgwMDFfaGEsIDApKQorCQkJcmV0dXJuIC1FSU87CiAJcG04MDAxX2hhLT5mYXRhbF9mb3JlbnNpY19zaGlmdF9vZmZzZXQgKz0gMTAyNDsKIAogCWlmIChwbTgwMDFfaGEtPmZhdGFsX2ZvcmVuc2ljX3NoaWZ0X29mZnNldCA+PSAweDEwMDAwMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2luaXQuYyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2luaXQuYwppbmRleCA3M2ExMjBkLi5jNGYzMWIyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2luaXQuYwpAQCAtNjI1LDcgKzYyNSw3IEBACiAJcG04MDAxX2hhLT5udm1kX2NvbXBsZXRpb24gPSAmY29tcGxldGlvbjsKIAogCWlmIChwbTgwMDFfaGEtPmNoaXBfaWQgPT0gY2hpcF84MDAxKSB7Ci0JCWlmIChkZXZpY2VpZCA9PSAweDgwODEpIHsKKwkJaWYgKGRldmljZWlkID09IDB4ODA4MSB8fCBkZXZpY2VpZCA9PSAweDAwNDIpIHsKIAkJCXBheWxvYWQubWlub3JfZnVuY3Rpb24gPSA0OwogCQkJcGF5bG9hZC5sZW5ndGggPSA0MDk2OwogCQl9IGVsc2UgewpAQCAtNjQ2LDYgKzY0Niw5IEBACiAJCQlpZiAoZGV2aWNlaWQgPT0gMHg4MDgxKQogCQkJCXBtODAwMV9oYS0+c2FzX2FkZHJbal0gPQogCQkJCQlwYXlsb2FkLmZ1bmNfc3BlY2lmaWNbMHg3MDQgKyBpXTsKKwkJCWVsc2UgaWYgKGRldmljZWlkID09IDB4MDA0MikKKwkJCQlwbTgwMDFfaGEtPnNhc19hZGRyW2pdID0KKwkJCQkJcGF5bG9hZC5mdW5jX3NwZWNpZmljWzB4MDEwICsgaV07CiAJCX0gZWxzZQogCQkJcG04MDAxX2hhLT5zYXNfYWRkcltqXSA9CiAJCQkJCXBheWxvYWQuZnVuY19zcGVjaWZpY1sweDgwNCArIGldOwpAQCAtNzEzLDExICs3MTYsOSBAQAogCS8qIFNQQ3YgY29udHJvbGxlcnMgc3VwcG9ydHMgNjQgbXNpLXggKi8KIAlpZiAocG04MDAxX2hhLT5jaGlwX2lkID09IGNoaXBfODAwMSkgewogCQludW1iZXJfb2ZfaW50ciA9IDE7Ci0JCWZsYWcgfD0gSVJRRl9ESVNBQkxFRDsKIAl9IGVsc2UgewogCQludW1iZXJfb2ZfaW50ciA9IFBNODAwMV9NQVhfTVNJWF9WRUM7CiAJCWZsYWcgJj0gfklSUUZfU0hBUkVEOwotCQlmbGFnIHw9IElSUUZfRElTQUJMRUQ7CiAJfQogCiAJbWF4X2VudHJ5ID0gc2l6ZW9mKHBtODAwMV9oYS0+bXNpeF9lbnRyaWVzKSAvCkBAIC0xMDcyLDEwICsxMDczLDcgQEAKICAqLwogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBtODAwMV9wY2lfdGFibGVbXSA9IHsKIAl7IFBDSV9WREVWSUNFKFBNQ19TaWVycmEsIDB4ODAwMSksIGNoaXBfODAwMSB9LAotCXsKLQkJUENJX0RFVklDRSgweDExN2MsIDB4MDA0MiksCi0JCS5kcml2ZXJfZGF0YSA9IGNoaXBfODAwMQotCX0sCisJeyBQQ0lfVkRFVklDRShBVFRPLCAweDAwNDIpLCBjaGlwXzgwMDEgfSwKIAkvKiBTdXBwb3J0IGZvciBTUEMvU1BDdi9TUEN2ZSBjb250cm9sbGVycyAqLwogCXsgUENJX1ZERVZJQ0UoQURBUFRFQzIsIDB4ODAwMSksIGNoaXBfODAwMSB9LAogCXsgUENJX1ZERVZJQ0UoUE1DX1NpZXJyYSwgMHg4MDA4KSwgY2hpcF84MDA4IH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9zYXMuYyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX3Nhcy5jCmluZGV4IGY1MGFjNDQuLjhhNDRiYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX3Nhcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX3Nhcy5jCkBAIC00MzQsNiArNDM0LDcgQEAKIAkJY2NiLT5uX2VsZW0gPSBuX2VsZW07CiAJCWNjYi0+Y2NiX3RhZyA9IHRhZzsKIAkJY2NiLT50YXNrID0gdDsKKwkJY2NiLT5kZXZpY2UgPSBwbTgwMDFfZGV2OwogCQlzd2l0Y2ggKHQtPnRhc2tfcHJvdG8pIHsKIAkJY2FzZSBTQVNfUFJPVE9DT0xfU01QOgogCQkJcmMgPSBwbTgwMDFfdGFza19wcmVwX3NtcChwbTgwMDFfaGEsIGNjYik7CkBAIC04NjUsMTMgKzg2NiwxMSBAQAogc3RhdGljIHZvaWQgcG04MDAxX2Rldl9nb25lX25vdGlmeShzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCXUzMiB0YWc7CiAJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhOwogCXN0cnVjdCBwbTgwMDFfZGV2aWNlICpwbTgwMDFfZGV2ID0gZGV2LT5sbGRkX2RldjsKIAogCXBtODAwMV9oYSA9IHBtODAwMV9maW5kX2hhX2J5X2RldihkZXYpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZwbTgwMDFfaGEtPmxvY2ssIGZsYWdzKTsKLQlwbTgwMDFfdGFnX2FsbG9jKHBtODAwMV9oYSwgJnRhZyk7CiAJaWYgKHBtODAwMV9kZXYpIHsKIAkJdTMyIGRldmljZV9pZCA9IHBtODAwMV9kZXYtPmRldmljZV9pZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmggYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9zYXMuaAppbmRleCA2YzVmZDVlLi4xZWUwNmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9zYXMuaAorKysgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9zYXMuaApAQCAtNzA4LDUgKzcwOCwxNyBAQAogLyogY3RsIHNoYXJlZCBBUEkgKi8KIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqcG04MDAxX2hvc3RfYXR0cnNbXTsKIAorc3RhdGljIGlubGluZSB2b2lkCitwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwKKwkJCXN0cnVjdCBzYXNfdGFzayAqdGFzaywgc3RydWN0IHBtODAwMV9jY2JfaW5mbyAqY2NiLAorCQkJdTMyIGNjYl9pZHgpCit7CisJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0YXNrLCBjY2IsIGNjYl9pZHgpOworCXNtcF9tYigpOyAvKmluIG9yZGVyIHRvIGZvcmNlIENQVSBvcmRlcmluZyovCisJc3Bpbl91bmxvY2soJnBtODAwMV9oYS0+bG9jayk7CisJdGFzay0+dGFza19kb25lKHRhc2spOworCXNwaW5fbG9jaygmcG04MDAxX2hhLT5sb2NrKTsKK30KKwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MHh4X2h3aS5jIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgweHhfaHdpLmMKaW5kZXggYzk1MGRjNS4uZDcwNTg3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgweHhfaHdpLmMKKysrIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgweHhfaHdpLmMKQEAgLTkxLDcgKzkxLDYgQEAKIAlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2hhID0gU0hPU1RfVE9fU0FTX0hBKHNob3N0KTsKIAlzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEgPSBzaGEtPmxsZGRfaGE7CiAJdm9pZCBfX2lvbWVtICpmYXRhbF90YWJsZV9hZGRyZXNzID0gcG04MDAxX2hhLT5mYXRhbF90YmxfYWRkcjsKLQl1MzIgc3RhdHVzID0gMTsKIAl1MzIgYWNjdW1fbGVuICwgcmVnX3ZhbCwgaW5kZXgsICp0ZW1wOwogCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CiAJdTggKmRpcmVjdF9kYXRhOwpAQCAtMTExLDEzICsxMTAsMTAgQEAKIAkJZGlyZWN0X2RhdGEgPSAodTggKilmYXRhbF9lcnJvcl9kYXRhOwogCQlwbTgwMDFfaGEtPmZvcmVuc2ljX2luZm8uZGF0YV90eXBlID0gVFlQRV9OT05fRkFUQUw7CiAJCXBtODAwMV9oYS0+Zm9yZW5zaWNfaW5mby5kYXRhX2J1Zi5kaXJlY3RfbGVuID0gU1lTRlNfT0ZGU0VUOwotCQlwbTgwMDFfaGEtPmZvcmVuc2ljX2luZm8uZGF0YV9idWYuZGlyZWN0X29mZnNldCA9IDA7CiAJCXBtODAwMV9oYS0+Zm9yZW5zaWNfaW5mby5kYXRhX2J1Zi5yZWFkX2xlbiA9IDA7CiAKIAkJcG04MDAxX2hhLT5mb3JlbnNpY19pbmZvLmRhdGFfYnVmLmRpcmVjdF9kYXRhID0gZGlyZWN0X2RhdGE7Ci0JfQogCi0JaWYgKHBtODAwMV9oYS0+Zm9yZW5zaWNfaW5mby5kYXRhX2J1Zi5kaXJlY3Rfb2Zmc2V0ID09IDApIHsKIAkJLyogc3RhcnQgdG8gZ2V0IGRhdGEgKi8KIAkJLyogUHJvZ3JhbSB0aGUgTUVNQkFTRSBJSSBTaGlmdGluZyBSZWdpc3RlciB3aXRoIDB4MDAuKi8KIAkJcG04MDAxX2N3MzIocG04MDAxX2hhLCAwLCBNRU1CQVNFX0lJX1NISUZUX1JFR0lTVEVSLApAQCAtMTI2LDYgKzEyMiw3IEBACiAJCXBtODAwMV9oYS0+Zm9yZW5zaWNfZmF0YWxfc3RlcCA9IDA7CiAJCXBtODAwMV9oYS0+ZmF0YWxfYmFyX2xvYyA9IDA7CiAJfQorCiAJLyogUmVhZCB1bnRpbCBhY2N1bV9sZW4gaXMgcmV0cml2ZWQgKi8KIAlhY2N1bV9sZW4gPSBwbTgwMDFfbXIzMihmYXRhbF90YWJsZV9hZGRyZXNzLAogCQkJCU1QSV9GQVRBTF9FRFVNUF9UQUJMRV9BQ0NVTV9MRU4pOwpAQCAtMTM1LDcgKzEzMiw3IEBACiAJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAogCQkJcG04MDAxX3ByaW50aygiUG9zc2libGUgUENJIGlzc3VlIDB4JXggbm90IGV4cGVjdGVkXG4iLAogCQkJCWFjY3VtX2xlbikpOwotCQlyZXR1cm4gc3RhdHVzOworCQlyZXR1cm4gLUVJTzsKIAl9CiAJaWYgKGFjY3VtX2xlbiA9PSAwIHx8IGFjY3VtX2xlbiA+PSAweDEwMDAwMCkgewogCQlwbTgwMDFfaGEtPmZvcmVuc2ljX2luZm8uZGF0YV9idWYuZGlyZWN0X2RhdGEgKz0KQEAgLTE3OCw3ICsxNzUsNiBAQAogCQkJcG04MDAxX2hhLT5mb3JlbnNpY19mYXRhbF9zdGVwID0gMTsKIAkJCXBtODAwMV9oYS0+ZmF0YWxfZm9yZW5zaWNfc2hpZnRfb2Zmc2V0ID0gMDsKIAkJCXBtODAwMV9oYS0+Zm9yZW5zaWNfbGFzdF9vZmZzZXQJPSAwOwotCQkJc3RhdHVzID0gMDsKIAkJCXJldHVybiAoY2hhciAqKXBtODAwMV9oYS0+CiAJCQkJZm9yZW5zaWNfaW5mby5kYXRhX2J1Zi5kaXJlY3RfZGF0YSAtCiAJCQkJKGNoYXIgKilidWY7CkBAIC0xOTQsNyArMTkwLDYgQEAKIAkJCQkJZm9yZW5zaWNfaW5mby5kYXRhX2J1Zi5kaXJlY3RfZGF0YSwKIAkJCQkJIiUwOHggIiwgKih0ZW1wICsgaW5kZXgpKTsKIAkJCX0KLQkJCXN0YXR1cyA9IDA7CiAJCQlyZXR1cm4gKGNoYXIgKilwbTgwMDFfaGEtPgogCQkJCWZvcmVuc2ljX2luZm8uZGF0YV9idWYuZGlyZWN0X2RhdGEgLQogCQkJCShjaGFyICopYnVmOwpAQCAtMjE0LDcgKzIwOSw2IEBACiAJCXBtODAwMV9jdzMyKHBtODAwMV9oYSwgMCwgTUVNQkFTRV9JSV9TSElGVF9SRUdJU1RFUiwKIAkJCXBtODAwMV9oYS0+ZmF0YWxfZm9yZW5zaWNfc2hpZnRfb2Zmc2V0KTsKIAkJcG04MDAxX2hhLT5mYXRhbF9iYXJfbG9jID0gMDsKLQkJc3RhdHVzID0gMDsKIAkJcmV0dXJuIChjaGFyICopcG04MDAxX2hhLT5mb3JlbnNpY19pbmZvLmRhdGFfYnVmLmRpcmVjdF9kYXRhIC0KIAkJCShjaGFyICopYnVmOwogCX0KQEAgLTIzOSw3ICsyMzMsNyBAQAogCQkJUE04MDAxX0ZBSUxfREJHKHBtODAwMV9oYSwKIAkJCXBtODAwMV9wcmludGsoIlRJTUVPVVQ6TUVNQkFTRV9JSV9TSElGVF9SRUdJU1RFUiIKIAkJCSIgPSAweCV4XG4iLCByZWdfdmFsKSk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gLUVJTzsKIAkJfQogCiAJCS8qIFJlYWQgdGhlIG5leHQgNjRLIG9mIHRoZSBkZWJ1ZyBkYXRhLiAqLwpAQCAtMjU5LDcgKzI1Myw2IEBACiAJCQlwbTgwMDFfaGEtPmZvcmVuc2ljX2luZm8uZGF0YV9idWYuZGlyZWN0X2xlbiA9ICAwOwogCQkJcG04MDAxX2hhLT5mb3JlbnNpY19pbmZvLmRhdGFfYnVmLmRpcmVjdF9vZmZzZXQgPSAwOwogCQkJcG04MDAxX2hhLT5mb3JlbnNpY19pbmZvLmRhdGFfYnVmLnJlYWRfbGVuID0gMDsKLQkJCXN0YXR1cyA9IDA7CiAJCX0KIAl9CiAKQEAgLTIxNzUsMTEgKzIxNjgsNyBAQAogCQkJCUlPX09QRU5fQ05YX0VSUk9SX0lUX05FWFVTX0xPU1MpOwogCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKIAkJCXRzLT5zdGF0ID0gU0FTX1FVRVVFX0ZVTEw7Ci0JCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJCW1iKCk7LyppbiBvcmRlciB0byBmb3JjZSBDUFUgb3JkZXJpbmcqLwotCQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQkJdC0+dGFza19kb25lKHQpOwotCQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKKwkJCXBtODAwMV9jY2JfdGFza19mcmVlX2RvbmUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJYnJlYWs7CkBAIC0yMTk1LDExICsyMTg0LDcgQEAKIAkJCQlJT19PUEVOX0NOWF9FUlJPUl9JVF9ORVhVU19MT1NTKTsKIAkJCXRzLT5yZXNwID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CiAJCQl0cy0+c3RhdCA9IFNBU19RVUVVRV9GVUxMOwotCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCQltYigpOy8qZGl0dG8qLwotCQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQkJdC0+dGFza19kb25lKHQpOwotCQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKKwkJCXBtODAwMV9jY2JfdGFza19mcmVlX2RvbmUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJYnJlYWs7CkBAIC0yMjIxLDExICsyMjA2LDcgQEAKIAkJCQlJT19PUEVOX0NOWF9FUlJPUl9TVFBfUkVTT1VSQ0VTX0JVU1kpOwogCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKIAkJCXRzLT5zdGF0ID0gU0FTX1FVRVVFX0ZVTEw7Ci0JCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJCW1iKCk7LyogZGl0dG8qLwotCQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQkJdC0+dGFza19kb25lKHQpOwotCQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKKwkJCXBtODAwMV9jY2JfdGFza19mcmVlX2RvbmUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJYnJlYWs7CkBAIC0yMjg4LDExICsyMjY5LDcgQEAKIAkJCQkJSU9fRFNfTk9OX09QRVJBVElPTkFMKTsKIAkJCXRzLT5yZXNwID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CiAJCQl0cy0+c3RhdCA9IFNBU19RVUVVRV9GVUxMOwotCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCQltYigpOy8qZGl0dG8qLwotCQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQkJdC0+dGFza19kb25lKHQpOwotCQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKKwkJCXBtODAwMV9jY2JfdGFza19mcmVlX2RvbmUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJYnJlYWs7CkBAIC0yMzEyLDExICsyMjg5LDcgQEAKIAkJCQkJSU9fRFNfSU5fRVJST1IpOwogCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKIAkJCXRzLT5zdGF0ID0gU0FTX1FVRVVFX0ZVTEw7Ci0JCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJCW1iKCk7LypkaXR0byovCi0JCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCQl0LT50YXNrX2RvbmUodCk7Ci0JCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOworCQkJcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKIAkJCXJldHVybjsKIAkJfQogCQlicmVhazsKQEAgLTIzNDUsMjAgKzIzMTgsOSBAQAogCQkJIiByZXNwIDB4JXggc3RhdCAweCV4IGJ1dCBhYm9ydGVkIGJ5IHVwcGVyIGxheWVyIVxuIiwKIAkJCXQsIHN0YXR1cywgdHMtPnJlc3AsIHRzLT5zdGF0KSk7CiAJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCX0gZWxzZSBpZiAodC0+dWxkZF90YXNrKSB7CisJfSBlbHNlIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdC0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7Ci0JCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQltYigpOy8qIGRpdHRvICovCi0JCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJdC0+dGFza19kb25lKHQpOwotCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCX0gZWxzZSBpZiAoIXQtPnVsZGRfdGFzaykgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0LT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCW1iKCk7LypkaXR0byovCi0JCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJdC0+dGFza19kb25lKHQpOwotCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOworCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwogCX0KIH0KIApAQCAtMjQ3MCwxMSArMjQzMiw3IEBACiAJCQkJSU9fT1BFTl9DTlhfRVJST1JfSVRfTkVYVVNfTE9TUyk7CiAJCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOwogCQkJdHMtPnN0YXQgPSBTQVNfUVVFVUVfRlVMTDsKLQkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQkJbWIoKTsvKmRpdHRvKi8KLQkJCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJCXQtPnRhc2tfZG9uZSh0KTsKLQkJCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7CisJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwogCQkJcmV0dXJuOwogCQl9CiAJCWJyZWFrOwpAQCAtMjU5NiwyMCArMjU1NCw5IEBACiAJCQkiIHJlc3AgMHgleCBzdGF0IDB4JXggYnV0IGFib3J0ZWQgYnkgdXBwZXIgbGF5ZXIhXG4iLAogCQkJdCwgZXZlbnQsIHRzLT5yZXNwLCB0cy0+c3RhdCkpOwogCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQl9IGVsc2UgaWYgKHQtPnVsZGRfdGFzaykgeworCX0gZWxzZSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwotCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJbWIoKTsvKiBkaXR0byAqLwotCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCXQtPnRhc2tfZG9uZSh0KTsKLQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQl9IGVsc2UgaWYgKCF0LT51bGRkX3Rhc2spIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdC0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7Ci0JCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQltYigpOy8qZGl0dG8qLwotCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCXQtPnRhc2tfZG9uZSh0KTsKLQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKKwkJcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKIAl9CiB9CiAKQEAgLTQzMDQsMjMgKzQyNTEsMTEgQEAKIAkJCQkJIlxuIiwgdGFzaywgdHMtPnJlc3AsIHRzLT5zdGF0KSk7CiAJCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0YXNrLCBjY2IsIHRhZyk7CiAJCQkJcmV0dXJuIDA7Ci0JCQl9IGVsc2UgaWYgKHRhc2stPnVsZGRfdGFzaykgeworCQkJfSBlbHNlIHsKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssCiAJCQkJCQkJZmxhZ3MpOwotCQkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdGFzaywgY2NiLCB0YWcpOwotCQkJCW1iKCk7LyogZGl0dG8gKi8KLQkJCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCQkJdGFzay0+dGFza19kb25lKHRhc2spOwotCQkJCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9IGVsc2UgaWYgKCF0YXNrLT51bGRkX3Rhc2spIHsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssCi0JCQkJCQkJZmxhZ3MpOwotCQkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdGFzaywgY2NiLCB0YWcpOwotCQkJCW1iKCk7LypkaXR0byovCi0JCQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQkJCXRhc2stPnRhc2tfZG9uZSh0YXNrKTsKLQkJCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOworCQkJCXBtODAwMV9jY2JfdGFza19mcmVlX2RvbmUocG04MDAxX2hhLCB0YXNrLAorCQkJCQkJCQljY2IsIHRhZyk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMgYi9kcml2ZXJzL3Njc2kvcWxhMTI4MC5jCmluZGV4IDk3ZGFiZDMuLjE1ODAyMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTEyODAuYwpAQCAtMzc5LDE0ICszNzksNyBAQAogI2RlZmluZSAgREVCVUdfUFJJTlRfTlZSQU0JMAogI2RlZmluZSAgREVCVUdfUUxBMTI4MAkJMAogCi0vKgotICogVGhlIFNHSSBWSVNXUyBpcyBicm9rZW4gYW5kIGRvZXNuJ3Qgc3VwcG9ydCBNTUlPIDstKAotICovCi0jaWZkZWYgQ09ORklHX1g4Nl9WSVNXUwotI2RlZmluZQlNRU1PUllfTUFQUEVEX0lPCTAKLSNlbHNlCiAjZGVmaW5lCU1FTU9SWV9NQVBQRURfSU8JMQotI2VuZGlmCiAKICNpbmNsdWRlICJxbGExMjgwLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvTWFrZWZpbGUKaW5kZXggZmYwZmM3Yy4uNDRkZWY2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvTWFrZWZpbGUKQEAgLTEsNiArMSw2IEBACiBxbGEyeHh4LXkgOj0gcWxhX29zLm8gcWxhX2luaXQubyBxbGFfbWJ4Lm8gcWxhX2lvY2IubyBxbGFfaXNyLm8gcWxhX2dzLm8gXAogCQlxbGFfZGJnLm8gcWxhX3N1cC5vIHFsYV9hdHRyLm8gcWxhX21pZC5vIHFsYV9kZnMubyBxbGFfYnNnLm8gXAotICAgICAgICBxbGFfbngubyBxbGFfbXIubyBxbGFfbngyLm8gcWxhX3RhcmdldC5vCisJCXFsYV9ueC5vIHFsYV9tci5vIHFsYV9ueDIubyBxbGFfdGFyZ2V0Lm8gcWxhX3RtcGwubwogCiBvYmotJChDT05GSUdfU0NTSV9RTEFfRkMpICs9IHFsYTJ4eHgubwogb2JqLSQoQ09ORklHX1RDTV9RTEEyWFhYKSArPSB0Y21fcWxhMnh4eC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwppbmRleCA0YTBkN2M5Li4wN2JlZmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKQEAgLTE0Nyw2ICsxNDcsOTIgQEAKIH07CiAKIHN0YXRpYyBzc2l6ZV90CitxbGEyeDAwX3N5c2ZzX3JlYWRfZndfZHVtcF90ZW1wbGF0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJCQkgICBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhID0gc2hvc3RfcHJpdihkZXZfdG9fc2hvc3QoY29udGFpbmVyX29mKGtvYmosCisJICAgIHN0cnVjdCBkZXZpY2UsIGtvYmopKSk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisKKwlpZiAoIWhhLT5md19kdW1wX3RlbXBsYXRlIHx8ICFoYS0+ZndfZHVtcF90ZW1wbGF0ZV9sZW4pCisJCXJldHVybiAwOworCisJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzBlMiwKKwkgICAgImNodW5rIDwtIG9mZj0lbGx4IGNvdW50PSV6eFxuIiwgb2ZmLCBjb3VudCk7CisJcmV0dXJuIG1lbW9yeV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsICZvZmYsCisJICAgIGhhLT5md19kdW1wX3RlbXBsYXRlLCBoYS0+ZndfZHVtcF90ZW1wbGF0ZV9sZW4pOworfQorCitzdGF0aWMgc3NpemVfdAorcWxhMngwMF9zeXNmc193cml0ZV9md19kdW1wX3RlbXBsYXRlKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJCQkgICAgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IHNob3N0X3ByaXYoZGV2X3RvX3Nob3N0KGNvbnRhaW5lcl9vZihrb2JqLAorCSAgICBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSkpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXVpbnQzMl90IHNpemU7CisKKwlpZiAob2ZmID09IDApIHsKKwkJaWYgKGhhLT5md19kdW1wKQorCQkJdmZyZWUoaGEtPmZ3X2R1bXApOworCQlpZiAoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpCisJCQl2ZnJlZShoYS0+ZndfZHVtcF90ZW1wbGF0ZSk7CisKKwkJaGEtPmZ3X2R1bXAgPSBOVUxMOworCQloYS0+ZndfZHVtcF9sZW4gPSAwOworCQloYS0+ZndfZHVtcF90ZW1wbGF0ZSA9IE5VTEw7CisJCWhhLT5md19kdW1wX3RlbXBsYXRlX2xlbiA9IDA7CisKKwkJc2l6ZSA9IHFsYTI3eHhfZndkdF90ZW1wbGF0ZV9zaXplKGJ1Zik7CisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwZDEsCisJCSAgICAiLT4gYWxsb2NhdGluZyBmd2R0ICgleCBieXRlcykuLi5cbiIsIHNpemUpOworCQloYS0+ZndfZHVtcF90ZW1wbGF0ZSA9IHZtYWxsb2Moc2l6ZSk7CisJCWlmICghaGEtPmZ3X2R1bXBfdGVtcGxhdGUpIHsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwZDIsCisJCQkgICAgIkZhaWxlZCBhbGxvY2F0ZSBmd2R0ICgleCBieXRlcykuXG4iLCBzaXplKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWhhLT5md19kdW1wX3RlbXBsYXRlX2xlbiA9IHNpemU7CisJfQorCisJaWYgKG9mZiArIGNvdW50ID4gaGEtPmZ3X2R1bXBfdGVtcGxhdGVfbGVuKSB7CisJCWNvdW50ID0gaGEtPmZ3X2R1bXBfdGVtcGxhdGVfbGVuIC0gb2ZmOworCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MGQzLAorCQkgICAgImNodW5rIC0+IHRydW5jYXRpbmcgdG8gJXp4IGJ5dGVzLlxuIiwgY291bnQpOworCX0KKworCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwZDQsCisJICAgICJjaHVuayAtPiBvZmY9JWxseCBjb3VudD0lenhcbiIsIG9mZiwgY291bnQpOworCW1lbWNweShoYS0+ZndfZHVtcF90ZW1wbGF0ZSArIG9mZiwgYnVmLCBjb3VudCk7CisKKwlpZiAob2ZmICsgY291bnQgPT0gaGEtPmZ3X2R1bXBfdGVtcGxhdGVfbGVuKSB7CisJCXNpemUgPSBxbGEyN3h4X2Z3ZHRfY2FsY3VsYXRlX2R1bXBfc2l6ZSh2aGEpOworCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MGQ1LAorCQkgICAgIi0+IGFsbG9jYXRpbmcgZndkdW1wICgleCBieXRlcykuLi5cbiIsIHNpemUpOworCQloYS0+ZndfZHVtcCA9IHZtYWxsb2Moc2l6ZSk7CisJCWlmICghaGEtPmZ3X2R1bXApIHsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwZDYsCisJCQkgICAgIkZhaWxlZCBhbGxvY2F0ZSBmd2R1bXAgKCV4IGJ5dGVzKS5cbiIsIHNpemUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJaGEtPmZ3X2R1bXBfbGVuID0gc2l6ZTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgc3lzZnNfZndfZHVtcF90ZW1wbGF0ZV9hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9ICJmd19kdW1wX3RlbXBsYXRlIiwKKwkJLm1vZGUgPSBTX0lSVVNSIHwgU19JV1VTUiwKKwl9LAorCS5zaXplID0gMCwKKwkucmVhZCA9IHFsYTJ4MDBfc3lzZnNfcmVhZF9md19kdW1wX3RlbXBsYXRlLAorCS53cml0ZSA9IHFsYTJ4MDBfc3lzZnNfd3JpdGVfZndfZHVtcF90ZW1wbGF0ZSwKK307CisKK3N0YXRpYyBzc2l6ZV90CiBxbGEyeDAwX3N5c2ZzX3JlYWRfbnZyYW0oc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQkJIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKIAkJCSBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKQEAgLTI0MSwxMiArMzI3LDE3IEBACiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IHNob3N0X3ByaXYoZGV2X3RvX3Nob3N0KGNvbnRhaW5lcl9vZihrb2JqLAogCSAgICBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSkpOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXNzaXplX3QgcnZhbCA9IDA7CiAKIAlpZiAoaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1JFQURJTkcpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIG1lbW9yeV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsICZvZmYsIGhhLT5vcHRyb21fYnVmZmVyLAotCQkJCQloYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKKwltdXRleF9sb2NrKCZoYS0+b3B0cm9tX211dGV4KTsKKwlydmFsID0gbWVtb3J5X3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgJm9mZiwgaGEtPm9wdHJvbV9idWZmZXIsCisJICAgIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOworCW11dGV4X3VubG9jaygmaGEtPm9wdHJvbV9tdXRleCk7CisKKwlyZXR1cm4gcnZhbDsKIH0KIAogc3RhdGljIHNzaXplX3QKQEAgLTI2NSw3ICszNTYsOSBAQAogCWlmIChvZmYgKyBjb3VudCA+IGhhLT5vcHRyb21fcmVnaW9uX3NpemUpCiAJCWNvdW50ID0gaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSAtIG9mZjsKIAorCW11dGV4X2xvY2soJmhhLT5vcHRyb21fbXV0ZXgpOwogCW1lbWNweSgmaGEtPm9wdHJvbV9idWZmZXJbb2ZmXSwgYnVmLCBjb3VudCk7CisJbXV0ZXhfdW5sb2NrKCZoYS0+b3B0cm9tX211dGV4KTsKIAogCXJldHVybiBjb3VudDsKIH0KQEAgLTI4OCwxMCArMzgxLDEwIEBACiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IHNob3N0X3ByaXYoZGV2X3RvX3Nob3N0KGNvbnRhaW5lcl9vZihrb2JqLAogCSAgICBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSkpOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwotCiAJdWludDMyX3Qgc3RhcnQgPSAwOwogCXVpbnQzMl90IHNpemUgPSBoYS0+b3B0cm9tX3NpemU7CiAJaW50IHZhbCwgdmFsaWQ7CisJc3NpemVfdCBydmFsID0gY291bnQ7CiAKIAlpZiAob2ZmKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMwNCwxMiArMzk3LDE0IEBACiAJaWYgKHN0YXJ0ID4gaGEtPm9wdHJvbV9zaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCW11dGV4X2xvY2soJmhhLT5vcHRyb21fbXV0ZXgpOwogCXN3aXRjaCAodmFsKSB7CiAJY2FzZSAwOgogCQlpZiAoaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1JFQURJTkcgJiYKLQkJICAgIGhhLT5vcHRyb21fc3RhdGUgIT0gUUxBX1NXUklUSU5HKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KKwkJICAgIGhhLT5vcHRyb21fc3RhdGUgIT0gUUxBX1NXUklUSU5HKSB7CisJCQlydmFsID0gIC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQogCQloYS0+b3B0cm9tX3N0YXRlID0gUUxBX1NXQUlUSU5HOwogCiAJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwNjEsCkBAIC0zMjAsOCArNDE1LDEwIEBACiAJCWhhLT5vcHRyb21fYnVmZmVyID0gTlVMTDsKIAkJYnJlYWs7CiAJY2FzZSAxOgotCQlpZiAoaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1dBSVRJTkcpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGhhLT5vcHRyb21fc3RhdGUgIT0gUUxBX1NXQUlUSU5HKSB7CisJCQlydmFsID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CiAKIAkJaGEtPm9wdHJvbV9yZWdpb25fc3RhcnQgPSBzdGFydDsKIAkJaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSA9IHN0YXJ0ICsgc2l6ZSA+IGhhLT5vcHRyb21fc2l6ZSA/CkBAIC0zMzUsMTMgKzQzMiwxNSBAQAogCQkJICAgICIoJXgpLlxuIiwgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CiAKIAkJCWhhLT5vcHRyb21fc3RhdGUgPSBRTEFfU1dBSVRJTkc7Ci0JCQlyZXR1cm4gLUVOT01FTTsKKwkJCXJ2YWwgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CiAJCX0KIAogCQlpZiAocWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKHZoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNjMsCiAJCQkgICAgIkhCQSBub3Qgb25saW5lLCBmYWlsaW5nIE5WUkFNIHVwZGF0ZS5cbiIpOwotCQkJcmV0dXJuIC1FQUdBSU47CisJCQlydmFsID0gLUVBR0FJTjsKKwkJCWdvdG8gb3V0OwogCQl9CiAKIAkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA2NCwKQEAgLTM1Myw4ICs0NTIsMTAgQEAKIAkJICAgIGhhLT5vcHRyb21fcmVnaW9uX3N0YXJ0LCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKIAkJYnJlYWs7CiAJY2FzZSAyOgotCQlpZiAoaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1dBSVRJTkcpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGhhLT5vcHRyb21fc3RhdGUgIT0gUUxBX1NXQUlUSU5HKSB7CisJCQlydmFsID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CiAKIAkJLyoKIAkJICogV2UgbmVlZCB0byBiZSBtb3JlIHJlc3RyaWN0aXZlIG9uIHdoaWNoIEZMQVNIIHJlZ2lvbnMgYXJlCkBAIC0zODgsNyArNDg5LDggQEAKIAkJaWYgKCF2YWxpZCkgewogCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA2NSwKIAkJCSAgICAiSW52YWxpZCBzdGFydCByZWdpb24gMHgleC8weCV4LlxuIiwgc3RhcnQsIHNpemUpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlydmFsID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OwogCQl9CiAKIAkJaGEtPm9wdHJvbV9yZWdpb25fc3RhcnQgPSBzdGFydDsKQEAgLTQwMyw3ICs1MDUsOCBAQAogCQkJICAgICIoJXgpXG4iLCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKIAogCQkJaGEtPm9wdHJvbV9zdGF0ZSA9IFFMQV9TV0FJVElORzsKLQkJCXJldHVybiAtRU5PTUVNOworCQkJcnZhbCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKIAkJfQogCiAJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwNjcsCkBAIC00MTMsMTMgKzUxNiwxNiBAQAogCQltZW1zZXQoaGEtPm9wdHJvbV9idWZmZXIsIDAsIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOwogCQlicmVhazsKIAljYXNlIDM6Ci0JCWlmIChoYS0+b3B0cm9tX3N0YXRlICE9IFFMQV9TV1JJVElORykKLQkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1dSSVRJTkcpIHsKKwkJCXJ2YWwgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KIAogCQlpZiAocWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKHZoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNjgsCiAJCQkgICAgIkhCQSBub3Qgb25saW5lLCBmYWlsaW5nIGZsYXNoIHVwZGF0ZS5cbiIpOwotCQkJcmV0dXJuIC1FQUdBSU47CisJCQlydmFsID0gLUVBR0FJTjsKKwkJCWdvdG8gb3V0OwogCQl9CiAKIAkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA2OSwKQEAgLTQzMCw5ICs1MzYsMTIgQEAKIAkJICAgIGhhLT5vcHRyb21fcmVnaW9uX3N0YXJ0LCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJ2YWwgPSAtRUlOVkFMOwogCX0KLQlyZXR1cm4gY291bnQ7CisKK291dDoKKwltdXRleF91bmxvY2soJmhhLT5vcHRyb21fbXV0ZXgpOworCXJldHVybiBydmFsOwogfQogCiBzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgc3lzZnNfb3B0cm9tX2N0bF9hdHRyID0gewpAQCAtODIyLDYgKzkzMSw3IEBACiAJaW50IGlzNEdCcF9vbmx5OwogfSBiaW5fZmlsZV9lbnRyaWVzW10gPSB7CiAJeyAiZndfZHVtcCIsICZzeXNmc19md19kdW1wX2F0dHIsIH0sCisJeyAiZndfZHVtcF90ZW1wbGF0ZSIsICZzeXNmc19md19kdW1wX3RlbXBsYXRlX2F0dHIsIDB4MjcgfSwKIAl7ICJudnJhbSIsICZzeXNmc19udnJhbV9hdHRyLCB9LAogCXsgIm9wdHJvbSIsICZzeXNmc19vcHRyb21fYXR0ciwgfSwKIAl7ICJvcHRyb21fY3RsIiwgJnN5c2ZzX29wdHJvbV9jdGxfYXR0ciwgfSwKQEAgLTg0Nyw2ICs5NTcsOCBAQAogCQkJY29udGludWU7CiAJCWlmIChpdGVyLT5pczRHQnBfb25seSA9PSAzICYmICEoSVNfQ05BX0NBUEFCTEUodmhhLT5odykpKQogCQkJY29udGludWU7CisJCWlmIChpdGVyLT5pczRHQnBfb25seSA9PSAweDI3ICYmICFJU19RTEEyN1hYKHZoYS0+aHcpKQorCQkJY29udGludWU7CiAKIAkJcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZob3N0LT5zaG9zdF9nZW5kZXYua29iaiwKIAkJICAgIGl0ZXItPmF0dHIpOwpAQCAtMTE4Nyw3ICsxMjk5LDcgQEAKIAlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoY2xhc3NfdG9fc2hvc3QoZGV2KSk7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKLQlpZiAoIUlTX1FMQTgxWFgoaGEpICYmICFJU19RTEE4M1hYKGhhKSkKKwlpZiAoIUlTX1FMQTgxWFgoaGEpICYmICFJU19RTEE4M1hYKGhhKSAmJiAhSVNfUUxBMjdYWChoYSkpCiAJCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJcbiIpOwogCiAJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkLiUwMmQuJTAyZCAoJWQpXG4iLApAQCAtMTM5MSw2ICsxNTAzLDM3IEBACiAJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBzaXplKTsKIH0KIAorc3RhdGljIHNzaXplX3QKK3FsYTJ4MDBfYWxsb3dfY25hX2Z3X2R1bXBfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoY2xhc3NfdG9fc2hvc3QoZGV2KSk7CisKKwlpZiAoIUlTX1AzUF9UWVBFKHZoYS0+aHcpKQorCQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiXG4iKTsKKwllbHNlCisJCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwKKwkJICAgIHZoYS0+aHctPmFsbG93X2NuYV9md19kdW1wID8gInRydWUiIDogImZhbHNlIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitxbGEyeDAwX2FsbG93X2NuYV9md19kdW1wX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBzaG9zdF9wcml2KGNsYXNzX3RvX3Nob3N0KGRldikpOworCWludCB2YWwgPSAwOworCisJaWYgKCFJU19QM1BfVFlQRSh2aGEtPmh3KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJnZhbCkgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2aGEtPmh3LT5hbGxvd19jbmFfZndfZHVtcCA9IHZhbCAhPSAwOworCisJcmV0dXJuIHN0cmxlbihidWYpOworfQorCiBzdGF0aWMgREVWSUNFX0FUVFIoZHJpdmVyX3ZlcnNpb24sIFNfSVJVR08sIHFsYTJ4MDBfZHJ2cl92ZXJzaW9uX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKGZ3X3ZlcnNpb24sIFNfSVJVR08sIHFsYTJ4MDBfZndfdmVyc2lvbl9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihzZXJpYWxfbnVtLCBTX0lSVUdPLCBxbGEyeDAwX3NlcmlhbF9udW1fc2hvdywgTlVMTCk7CkBAIC0xNDMyLDYgKzE1NzUsOSBAQAogc3RhdGljIERFVklDRV9BVFRSKGRpYWdfcmVxdWVzdHMsIFNfSVJVR08sIHFsYTJ4MDBfZGlhZ19yZXF1ZXN0c19zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihkaWFnX21lZ2FieXRlcywgU19JUlVHTywgcWxhMngwMF9kaWFnX21lZ2FieXRlc19zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihmd19kdW1wX3NpemUsIFNfSVJVR08sIHFsYTJ4MDBfZndfZHVtcF9zaXplX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGFsbG93X2NuYV9md19kdW1wLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgcWxhMngwMF9hbGxvd19jbmFfZndfZHVtcF9zaG93LAorCQkgICBxbGEyeDAwX2FsbG93X2NuYV9md19kdW1wX3N0b3JlKTsKIAogc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKnFsYTJ4MDBfaG9zdF9hdHRyc1tdID0gewogCSZkZXZfYXR0cl9kcml2ZXJfdmVyc2lvbiwKQEAgLTE0NjQsNiArMTYxMCw3IEBACiAJJmRldl9hdHRyX2RpYWdfcmVxdWVzdHMsCiAJJmRldl9hdHRyX2RpYWdfbWVnYWJ5dGVzLAogCSZkZXZfYXR0cl9md19kdW1wX3NpemUsCisJJmRldl9hdHRyX2FsbG93X2NuYV9md19kdW1wLAogCU5VTEwsCiB9OwogCkBAIC0xNTA5LDYgKzE2NTYsOSBAQAogCWNhc2UgUE9SVF9TUEVFRF8xNkdCOgogCQlzcGVlZCA9IEZDX1BPUlRTUEVFRF8xNkdCSVQ7CiAJCWJyZWFrOworCWNhc2UgUE9SVF9TUEVFRF8zMkdCOgorCQlzcGVlZCA9IEZDX1BPUlRTUEVFRF8zMkdCSVQ7CisJCWJyZWFrOwogCX0KIAlmY19ob3N0X3NwZWVkKHNob3N0KSA9IHNwZWVkOwogfQpAQCAtMjE2MCw2ICsyMzEwLDkgQEAKIAllbHNlIGlmIChJU19RTEFGWDAwKGhhKSkKIAkJc3BlZWQgPSBGQ19QT1JUU1BFRURfOEdCSVQgfCBGQ19QT1JUU1BFRURfNEdCSVQgfAogCQkgICAgRkNfUE9SVFNQRUVEXzJHQklUIHwgRkNfUE9SVFNQRUVEXzFHQklUOworCWVsc2UgaWYgKElTX1FMQTI3WFgoaGEpKQorCQlzcGVlZCA9IEZDX1BPUlRTUEVFRF8zMkdCSVQgfCBGQ19QT1JUU1BFRURfMTZHQklUIHwKKwkJICAgIEZDX1BPUlRTUEVFRF84R0JJVDsKIAllbHNlCiAJCXNwZWVkID0gRkNfUE9SVFNQRUVEXzFHQklUOwogCWZjX2hvc3Rfc3VwcG9ydGVkX3NwZWVkcyh2aGEtPmhvc3QpID0gc3BlZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYnNnLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYnNnLmMKaW5kZXggZjE1ZDAzZS4uNzFmZjM0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2JzZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ic2cuYwpAQCAtMTQzNyw5ICsxNDM3LDEyIEBACiAJaWYgKGhhLT5mbGFncy5uaWNfY29yZV9yZXNldF9oZGxyX2FjdGl2ZSkKIAkJcmV0dXJuIC1FQlVTWTsKIAorCW11dGV4X2xvY2soJmhhLT5vcHRyb21fbXV0ZXgpOwogCXJ2YWwgPSBxbGEyeDAwX29wdHJvbV9zZXR1cChic2dfam9iLCB2aGEsIDApOwotCWlmIChydmFsKQorCWlmIChydmFsKSB7CisJCW11dGV4X3VubG9jaygmaGEtPm9wdHJvbV9tdXRleCk7CiAJCXJldHVybiBydmFsOworCX0KIAogCWhhLT5pc3Bfb3BzLT5yZWFkX29wdHJvbSh2aGEsIGhhLT5vcHRyb21fYnVmZmVyLAogCSAgICBoYS0+b3B0cm9tX3JlZ2lvbl9zdGFydCwgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CkBAIC0xNDUzLDYgKzE0NTYsNyBAQAogCXZmcmVlKGhhLT5vcHRyb21fYnVmZmVyKTsKIAloYS0+b3B0cm9tX2J1ZmZlciA9IE5VTEw7CiAJaGEtPm9wdHJvbV9zdGF0ZSA9IFFMQV9TV0FJVElORzsKKwltdXRleF91bmxvY2soJmhhLT5vcHRyb21fbXV0ZXgpOwogCWJzZ19qb2ItPmpvYl9kb25lKGJzZ19qb2IpOwogCXJldHVybiBydmFsOwogfQpAQCAtMTQ2NSw5ICsxNDY5LDEyIEBACiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJaW50IHJ2YWwgPSAwOwogCisJbXV0ZXhfbG9jaygmaGEtPm9wdHJvbV9tdXRleCk7CiAJcnZhbCA9IHFsYTJ4MDBfb3B0cm9tX3NldHVwKGJzZ19qb2IsIHZoYSwgMSk7Ci0JaWYgKHJ2YWwpCisJaWYgKHJ2YWwpIHsKKwkJbXV0ZXhfdW5sb2NrKCZoYS0+b3B0cm9tX211dGV4KTsKIAkJcmV0dXJuIHJ2YWw7CisJfQogCiAJLyogU2V0IHRoZSBpc3A4Mnh4X25vX21kX2NhcCBub3QgdG8gY2FwdHVyZSBtaW5pZHVtcCAqLwogCWhhLT5mbGFncy5pc3A4Mnh4X25vX21kX2NhcCA9IDE7CkBAIC0xNDgzLDYgKzE0OTAsNyBAQAogCXZmcmVlKGhhLT5vcHRyb21fYnVmZmVyKTsKIAloYS0+b3B0cm9tX2J1ZmZlciA9IE5VTEw7CiAJaGEtPm9wdHJvbV9zdGF0ZSA9IFFMQV9TV0FJVElORzsKKwltdXRleF91bmxvY2soJmhhLT5vcHRyb21fbXV0ZXgpOwogCWJzZ19qb2ItPmpvYl9kb25lKGJzZ19qb2IpOwogCXJldHVybiBydmFsOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCmluZGV4IGY2MTAzZjUuLjk3MjU1ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKQEAgLTExLDEzICsxMSwxNSBAQAogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogfCAgICAgICAgICAgICBMZXZlbCAgICAgICAgICAgIHwgICBMYXN0IFZhbHVlIFVzZWQgIHwgICAgIEhvbGVzCXwKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgTW9kdWxlIEluaXQgYW5kIFByb2JlICAgICAgICB8ICAgICAgIDB4MDE1YiAgICAgICB8IDB4NGIsMHhiYSwweGZhIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4MHgwMTVhCXwKLSAqIHwgTWFpbGJveCBjb21tYW5kcyAgICAgICAgICAgICB8ICAgICAgIDB4MTE4NyAgICAgICB8IDB4MTExYS0weDExMWIgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4MTE1NS0weDExNTggIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4MTAxOC0weDEwMTkgIHwKKyAqIHwgTW9kdWxlIEluaXQgYW5kIFByb2JlICAgICAgICB8ICAgICAgIDB4MDE3ZCAgICAgICB8IDB4MDA0YiwweDAxNDEJfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHgwMTQ0LDB4MDE0Ngl8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDAxNWItMHgwMTYwCXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4MDE2ZS0weDAxNzAJfAorICogfCBNYWlsYm94IGNvbW1hbmRzICAgICAgICAgICAgIHwgICAgICAgMHgxMTg3ICAgICAgIHwgMHgxMDE4LTB4MTAxOQl8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDEwY2EgICAgICAgICB8CiAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDExMTUtMHgxMTE2ICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDEwY2EJCXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4MTExYS0weDExMWIJfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHgxMTU1LTB4MTE1OCAgfAogICogfCBEZXZpY2UgRGlzY292ZXJ5ICAgICAgICAgICAgIHwgICAgICAgMHgyMDk1ICAgICAgIHwgMHgyMDIwLTB4MjAyMiwgfAogICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHgyMDExLTB4MjAxMiwgfAogICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHgyMDE2ICAgICAgICAgfApAQCAtMzIsMTggKzM0LDE3IEBACiAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDUwNDcsMHg1MDUyICB8CiAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDUwODQsMHg1MDc1CXwKICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NTAzZCwweDUwNDQgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NTA3YgkJfAogICogfCBUaW1lciBSb3V0aW5lcyAgICAgICAgICAgICAgIHwgICAgICAgMHg2MDEyICAgICAgIHwgICAgICAgICAgICAgICAgfAotICogfCBVc2VyIFNwYWNlIEludGVyYWN0aW9ucyAgICAgIHwgICAgICAgMHg3MGUxICAgICAgIHwgMHg3MDE4LDB4NzAyZSwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg3MDIwLDB4NzAyNCwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg3MDM5LDB4NzA0NSwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg3MDczLTB4NzA3NSwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg3MDdiLDB4NzA4YywgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg3MGE1LDB4NzBhNiwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg3MGE4LDB4NzBhYiwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg3MGFkLTB4NzBhZSwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg3MGQxLTB4NzBkYiwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg3MDQ3LDB4NzAzYgl8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDcwZGUtMHg3MGRmLCB8CisgKiB8IFVzZXIgU3BhY2UgSW50ZXJhY3Rpb25zICAgICAgfCAgICAgICAweDcwZTIgICAgICAgfCAweDcwMTgsMHg3MDJlICB8CisgKiB8CQkJCSAgfAkJICAgICAgIHwgMHg3MDIwLDB4NzAyNCAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg3MDM5LDB4NzA0NSAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg3MDczLTB4NzA3NSAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg3MGE1LTB4NzBhNiAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg3MGE4LDB4NzBhYiAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg3MGFkLTB4NzBhZSAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg3MGQ3LTB4NzBkYiAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg3MGRlLTB4NzBkZiAgfAogICogfCBUYXNrIE1hbmFnZW1lbnQgICAgICAgICAgICAgIHwgICAgICAgMHg4MDNkICAgICAgIHwgMHg4MDI1LTB4ODAyNiAgfAogICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg4MDBiLDB4ODAzOSAgfAogICogfCBBRVIvRUVIICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgMHg5MDExICAgICAgIHwJCXwKQEAgLTU5LDcgKzYwLDExIEBACiAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweGIxM2MtMHhiMTQwICB8CiAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweGIxNDkJCXwKICAqIHwgTXVsdGlRICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIDB4YzAwYyAgICAgICB8CQl8Ci0gKiB8IE1pc2MgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAweGQwMTAgICAgICAgfAkJfAorICogfCBNaXNjICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgMHhkMmZmICAgICAgIHwgMHhkMDE3LTB4ZDAxOQl8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweGQwMjAJCXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4ZDAyZS0weGQwZmYJfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHhkMTAxLTB4ZDFmZQl8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweGQyMTItMHhkMmZlCXwKICAqIHwgVGFyZ2V0IE1vZGUJCSAgfAkgIDB4ZTA3MCAgICAgICB8IDB4ZTAyMQkJfAogICogfCBUYXJnZXQgTW9kZSBNYW5hZ2VtZW50CSAgfAkgIDB4ZjA3MiAgICAgICB8IDB4ZjAwMi0weGYwMDMJfAogICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHhmMDQ2LTB4ZjA0OSAgfApAQCAtMTA0LDcgKzEwOSw4NyBAQAogCXJldHVybiBwdHIgKyAocnNwLT5sZW5ndGggKiBzaXplb2YocmVzcG9uc2VfdCkpOwogfQogCi1zdGF0aWMgaW50CitpbnQKK3FsYTI3eHhfZHVtcF9tcGlfcmFtKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90ICpyYW0sCisJdWludDMyX3QgcmFtX2R3b3Jkcywgdm9pZCAqKm54dCkKK3sKKwlpbnQgcnZhbDsKKwl1aW50MzJfdCBjbnQsIHN0YXQsIHRpbWVyLCBkd29yZHMsIGlkeDsKKwl1aW50MTZfdCBtYjAsIG1iMTsKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3AyNDsKKwlkbWFfYWRkcl90IGR1bXBfZG1hID0gaGEtPmdpZF9saXN0X2RtYTsKKwl1aW50MzJfdCAqZHVtcCA9ICh1aW50MzJfdCAqKWhhLT5naWRfbGlzdDsKKworCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKKwltYjAgPSAwOworCisJV1JUX1JFR19XT1JEKCZyZWctPm1haWxib3gwLCBNQkNfTE9BRF9EVU1QX01QSV9SQU0pOworCWNsZWFyX2JpdChNQlhfSU5URVJSVVBULCAmaGEtPm1ieF9jbWRfZmxhZ3MpOworCisJZHdvcmRzID0gcWxhMngwMF9naWRfbGlzdF9zaXplKGhhKSAvIDQ7CisJZm9yIChjbnQgPSAwOyBjbnQgPCByYW1fZHdvcmRzICYmIHJ2YWwgPT0gUUxBX1NVQ0NFU1M7CisJICAgIGNudCArPSBkd29yZHMsIGFkZHIgKz0gZHdvcmRzKSB7CisJCWlmIChjbnQgKyBkd29yZHMgPiByYW1fZHdvcmRzKQorCQkJZHdvcmRzID0gcmFtX2R3b3JkcyAtIGNudDsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDEsIExTVyhhZGRyKSk7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5tYWlsYm94OCwgTVNXKGFkZHIpKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDIsIE1TVyhkdW1wX2RtYSkpOworCQlXUlRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDMsIExTVyhkdW1wX2RtYSkpOworCQlXUlRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDYsIE1TVyhNU0QoZHVtcF9kbWEpKSk7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5tYWlsYm94NywgTFNXKE1TRChkdW1wX2RtYSkpKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDQsIE1TVyhkd29yZHMpKTsKKwkJV1JUX1JFR19XT1JEKCZyZWctPm1haWxib3g1LCBMU1coZHdvcmRzKSk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPm1haWxib3g5LCAwKTsKKwkJV1JUX1JFR19EV09SRCgmcmVnLT5oY2NyLCBIQ0NSWF9TRVRfSE9TVF9JTlQpOworCisJCWhhLT5mbGFncy5tYm94X2ludCA9IDA7CisJCWZvciAodGltZXIgPSA2MDAwMDAwOyB0aW1lcjsgdGltZXItLSkgeworCQkJLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KKwkJCXN0YXQgPSBSRF9SRUdfRFdPUkQoJnJlZy0+aG9zdF9zdGF0dXMpOworCQkJaWYgKHN0YXQgJiBIU1JYX1JJU0NfSU5UKSB7CisJCQkJc3RhdCAmPSAweGZmOworCisJCQkJaWYgKHN0YXQgPT0gMHgxIHx8IHN0YXQgPT0gMHgyIHx8CisJCQkJICAgIHN0YXQgPT0gMHgxMCB8fCBzdGF0ID09IDB4MTEpIHsKKwkJCQkJc2V0X2JpdChNQlhfSU5URVJSVVBULAorCQkJCQkgICAgJmhhLT5tYnhfY21kX2ZsYWdzKTsKKworCQkJCQltYjAgPSBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MCk7CisJCQkJCW1iMSA9IFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gxKTsKKworCQkJCQlXUlRfUkVHX0RXT1JEKCZyZWctPmhjY3IsCisJCQkJCSAgICBIQ0NSWF9DTFJfUklTQ19JTlQpOworCQkJCQlSRF9SRUdfRFdPUkQoJnJlZy0+aGNjcik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIENsZWFyIHRoaXMgaW50cjsgaXQgd2Fzbid0IGEgbWFpbGJveCBpbnRyICovCisJCQkJV1JUX1JFR19EV09SRCgmcmVnLT5oY2NyLCBIQ0NSWF9DTFJfUklTQ19JTlQpOworCQkJCVJEX1JFR19EV09SRCgmcmVnLT5oY2NyKTsKKwkJCX0KKwkJCXVkZWxheSg1KTsKKwkJfQorCQloYS0+ZmxhZ3MubWJveF9pbnQgPSAxOworCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTUJYX0lOVEVSUlVQVCwgJmhhLT5tYnhfY21kX2ZsYWdzKSkgeworCQkJcnZhbCA9IG1iMCAmIE1CU19NQVNLOworCQkJZm9yIChpZHggPSAwOyBpZHggPCBkd29yZHM7IGlkeCsrKQorCQkJCXJhbVtjbnQgKyBpZHhdID0gSVNfUUxBMjdYWChoYSkgPworCQkJCSAgICBsZTMyX3RvX2NwdShkdW1wW2lkeF0pIDogc3dhYjMyKGR1bXBbaWR4XSk7CisJCX0gZWxzZSB7CisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJfQorCX0KKworCSpueHQgPSBydmFsID09IFFMQV9TVUNDRVNTID8gJnJhbVtjbnRdIDogTlVMTDsKKwlyZXR1cm4gcnZhbDsKK30KKworaW50CiBxbGEyNHh4X2R1bXBfcmFtKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90ICpyYW0sCiAgICAgdWludDMyX3QgcmFtX2R3b3Jkcywgdm9pZCAqKm54dCkKIHsKQEAgLTEzOSw2ICsyMjQsNyBAQAogCQlXUlRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDUsIExTVyhkd29yZHMpKTsKIAkJV1JUX1JFR19EV09SRCgmcmVnLT5oY2NyLCBIQ0NSWF9TRVRfSE9TVF9JTlQpOwogCisJCWhhLT5mbGFncy5tYm94X2ludCA9IDA7CiAJCWZvciAodGltZXIgPSA2MDAwMDAwOyB0aW1lcjsgdGltZXItLSkgewogCQkJLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KIAkJCXN0YXQgPSBSRF9SRUdfRFdPUkQoJnJlZy0+aG9zdF9zdGF0dXMpOwpAQCAtMTY0LDExICsyNTAsMTMgQEAKIAkJCX0KIAkJCXVkZWxheSg1KTsKIAkJfQorCQloYS0+ZmxhZ3MubWJveF9pbnQgPSAxOwogCiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTUJYX0lOVEVSUlVQVCwgJmhhLT5tYnhfY21kX2ZsYWdzKSkgewogCQkJcnZhbCA9IG1iMCAmIE1CU19NQVNLOwogCQkJZm9yIChpZHggPSAwOyBpZHggPCBkd29yZHM7IGlkeCsrKQotCQkJCXJhbVtjbnQgKyBpZHhdID0gc3dhYjMyKGR1bXBbaWR4XSk7CisJCQkJcmFtW2NudCArIGlkeF0gPSBJU19RTEEyN1hYKGhhKSA/CisJCQkJICAgIGxlMzJfdG9fY3B1KGR1bXBbaWR4XSkgOiBzd2FiMzIoZHVtcFtpZHhdKTsKIAkJfSBlbHNlIHsKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQl9CkBAIC0yMDgsNyArMjk2LDcgQEAKIAlyZXR1cm4gYnVmOwogfQogCi1zdGF0aWMgaW5saW5lIGludAoraW50CiBxbGEyNHh4X3BhdXNlX3Jpc2Moc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcpCiB7CiAJaW50IHJ2YWwgPSBRTEFfU1VDQ0VTUzsKQEAgLTIyNyw3ICszMTUsNyBAQAogCXJldHVybiBydmFsOwogfQogCi1zdGF0aWMgaW50CitpbnQKIHFsYTI0eHhfc29mdF9yZXNldChzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQogewogCWludCBydmFsID0gUUxBX1NVQ0NFU1M7CkBAIC01MzcsNyArNjI1LDcgQEAKIAlzdHJ1Y3QgcWxhMnh4eF9tcV9jaGFpbiAqbXEgPSBwdHI7CiAJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZzsKIAotCWlmICghaGEtPm1xZW5hYmxlIHx8IElTX1FMQTgzWFgoaGEpKQorCWlmICghaGEtPm1xZW5hYmxlIHx8IElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKQogCQlyZXR1cm4gcHRyOwogCiAJbXEgPSBwdHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmgKaW5kZXggMzVlMjBiNC4uY2M5NjEwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaApAQCAtMzQ4LDMgKzM0OCwxMCBAQAogI2RlZmluZSBxbF9kYmdfdGd0CTB4MDAwMDQwMDAgLyogVGFyZ2V0IG1vZGUgKi8KICNkZWZpbmUgcWxfZGJnX3RndF9tZ3QJMHgwMDAwMjAwMCAvKiBUYXJnZXQgbW9kZSBtYW5hZ2VtZW50ICovCiAjZGVmaW5lIHFsX2RiZ190Z3RfdG1yCTB4MDAwMDEwMDAgLyogVGFyZ2V0IG1vZGUgdGFzayBtYW5hZ2VtZW50ICovCisKK2V4dGVybiBpbnQgcWxhMjd4eF9kdW1wX21waV9yYW0oc3RydWN0IHFsYV9od19kYXRhICosIHVpbnQzMl90LCB1aW50MzJfdCAqLAorCXVpbnQzMl90LCB2b2lkICoqKTsKK2V4dGVybiBpbnQgcWxhMjR4eF9kdW1wX3JhbShzdHJ1Y3QgcWxhX2h3X2RhdGEgKiwgdWludDMyX3QsIHVpbnQzMl90ICosCisJdWludDMyX3QsIHZvaWQgKiopOworZXh0ZXJuIGludCBxbGEyNHh4X3BhdXNlX3Jpc2Moc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICopOworZXh0ZXJuIGludCBxbGEyNHh4X3NvZnRfcmVzZXQoc3RydWN0IHFsYV9od19kYXRhICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCmluZGV4IDI2NjcyNGIuLjZhMTA2MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKQEAgLTY1NCw3ICs2NTQsNyBAQAogCQlzdHJ1Y3QgZGV2aWNlX3JlZ18yNXh4bXEgaXNwMjVtcTsKIAkJc3RydWN0IGRldmljZV9yZWdfODJ4eCBpc3A4MjsKIAkJc3RydWN0IGRldmljZV9yZWdfZngwMCBpc3BmeDAwOwotfSBkZXZpY2VfcmVnX3Q7Cit9IF9faW9tZW0gZGV2aWNlX3JlZ190OwogCiAjZGVmaW5lIElTUF9SRVFfUV9JTihoYSwgcmVnKSBcCiAJKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpID8gXApAQCAtODA4LDcgKzgwOCw3IEBACiAJCQkJCSAgIE5vdGlmaWNhdGlvbiAqLwogI2RlZmluZSBNQkFfRldfUE9MTF9TVEFURQkweDg2MDAgIC8qIEZpcm13YXJlIGluIHBvbGwgZGlhZ25vc3RpYyBzdGF0ZSAqLwogI2RlZmluZSBNQkFfRldfUkVTRVRfRkNUCTB4ODUwMgkvKiBGaXJtd2FyZSByZXNldCBmYWN0b3J5IGRlZmF1bHRzICovCi0KKyNkZWZpbmUgTUJBX0ZXX0lOSVRfSU5QUk9HUkVTUwkweDg1MDAJLyogRmlybXdhcmUgYm9vdCBpbiBwcm9ncmVzcyAqLwogLyogODNYWCBGQ29FIHNwZWNpZmljICovCiAjZGVmaW5lIE1CQV9JRENfQUVOCQkweDgyMDAgIC8qIEZDb0U6IE5JQyBDb3JlIHN0YXRlIGNoYW5nZSBBRU4gKi8KIApAQCAtOTM4LDYgKzkzOCw3IEBACiAgKi8KICNkZWZpbmUgTUJDX1dSSVRFX1NFUkRFUwkJMHgzCS8qIFdyaXRlIHNlcmRlcyB3b3JkLiAqLwogI2RlZmluZSBNQkNfUkVBRF9TRVJERVMJCQkweDQJLyogUmVhZCBzZXJkZXMgd29yZC4gKi8KKyNkZWZpbmUgTUJDX0xPQURfRFVNUF9NUElfUkFNCQkweDUJLyogTG9hZC9EdW1wIE1QSSBSQU0uICovCiAjZGVmaW5lIE1CQ19TRVJERVNfUEFSQU1TCQkweDEwCS8qIFNlcmRlcyBUeCBQYXJhbWV0ZXJzLiAqLwogI2RlZmluZSBNQkNfR0VUX0lPQ0JfU1RBVFVTCQkweDEyCS8qIEdldCBJT0NCIHN0YXR1cyBjb21tYW5kLiAqLwogI2RlZmluZSBNQkNfUE9SVF9QQVJBTVMJCQkweDFBCS8qIFBvcnQgaURNQSBQYXJhbWV0ZXJzLiAqLwpAQCAtMTE5NywzMCArMTE5OCw2IEBACiAJdWludDhfdCAgcmVzZXJ2ZWRfM1syNl07CiB9IGluaXRfY2JfdDsKIAotCi1zdHJ1Y3QgaW5pdF9jYl9meCB7Ci0JdWludDE2X3QJdmVyc2lvbjsKLQl1aW50MTZfdAlyZXNlcnZlZF8xWzEzXTsKLQlfX2xlMTYJCXJlcXVlc3RfcV9vdXRwb2ludGVyOwotCV9fbGUxNgkJcmVzcG9uc2VfcV9pbnBvaW50ZXI7Ci0JdWludDE2X3QJcmVzZXJ2ZWRfMlsyXTsKLQlfX2xlMTYJCXJlc3BvbnNlX3FfbGVuZ3RoOwotCV9fbGUxNgkJcmVxdWVzdF9xX2xlbmd0aDsKLQl1aW50MTZfdAlyZXNlcnZlZF8zWzJdOwotCV9fbGUzMgkJcmVxdWVzdF9xX2FkZHJlc3NbMl07Ci0JX19sZTMyCQlyZXNwb25zZV9xX2FkZHJlc3NbMl07Ci0JdWludDE2X3QJcmVzZXJ2ZWRfNFs0XTsKLQl1aW50OF90CQlyZXNwb25zZV9xX21zaXZlYzsKLQl1aW50OF90CQlyZXNlcnZlZF81WzE5XTsKLQl1aW50MTZfdAlpbnRlcnJ1cHRfZGVsYXlfdGltZXI7Ci0JdWludDE2X3QJcmVzZXJ2ZWRfNjsKLQl1aW50MzJfdAlmd29wdGlvbnMxOwotCXVpbnQzMl90CWZ3b3B0aW9uczI7Ci0JdWludDMyX3QJZndvcHRpb25zMzsKLQl1aW50OF90CQlyZXNlcnZlZF83WzI0XTsKLX07Ci0KLQogLyoKICAqIEdldCBMaW5rIFN0YXR1cyBtYWlsYm94IGNvbW1hbmQgcmV0dXJuIGJ1ZmZlci4KICAqLwpAQCAtMjE3Miw2ICsyMTQ5LDcgQEAKICNkZWZpbmUgRkRNSV9QT1JUX1NQRUVEXzRHQgkJMHg4CiAjZGVmaW5lIEZETUlfUE9SVF9TUEVFRF84R0IJCTB4MTAKICNkZWZpbmUgRkRNSV9QT1JUX1NQRUVEXzE2R0IJCTB4MjAKKyNkZWZpbmUgRkRNSV9QT1JUX1NQRUVEXzMyR0IJCTB4NDAKICNkZWZpbmUgRkRNSV9QT1JUX1NQRUVEX1VOS05PV04JCTB4ODAwMAogCiBzdHJ1Y3QgY3RfZmRtaV9wb3J0X2F0dHIgewpAQCAtMjY4MCw3ICsyNjU4LDcgQEAKICNkZWZpbmUgUUxBX01RX1NJWkUgMzIKICNkZWZpbmUgUUxBX01BWF9RVUVVRVMgMjU2CiAjZGVmaW5lIElTUF9RVUVfUkVHKGhhLCBpZCkgXAotCSgoaGEtPm1xZW5hYmxlIHx8IElTX1FMQTgzWFgoaGEpKSA/IFwKKwkoKGhhLT5tcWVuYWJsZSB8fCBJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkgPyBcCiAJICgodm9pZCBfX2lvbWVtICopaGEtPm1xaW9iYXNlICsgKFFMQV9RVUVfUEFHRSAqIGlkKSkgOlwKIAkgKCh2b2lkIF9faW9tZW0gKiloYS0+aW9iYXNlKSkKICNkZWZpbmUgUUxBX1JFUV9RVUVfSUQodGFnKSBcCkBAIC0yODE4LDcgKzI3OTYsNiBAQAogCQl1aW50MzJfdAlmYWNfc3VwcG9ydGVkCQk6MTsKIAogCQl1aW50MzJfdAljaGlwX3Jlc2V0X2RvbmUJCToxOwotCQl1aW50MzJfdAlwb3J0MAkJCToxOwogCQl1aW50MzJfdAlydW5uaW5nX2dvbGRfZncJCToxOwogCQl1aW50MzJfdAllZWhfYnVzeQkJOjE7CiAJCXVpbnQzMl90CWNwdV9hZmZpbml0eV9lbmFibGVkCToxOwpAQCAtMjg0OSw3ICsyODI2LDcgQEAKIAlzcGlubG9ja190CWhhcmR3YXJlX2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkOwogCWludAkJYmFyczsKIAlpbnQJCW1lbV9vbmx5OwotCWRldmljZV9yZWdfdCBfX2lvbWVtICppb2Jhc2U7ICAgICAgICAgICAvKiBCYXNlIEkvTyBhZGRyZXNzICovCisJZGV2aWNlX3JlZ190ICppb2Jhc2U7ICAgICAgICAgICAvKiBCYXNlIEkvTyBhZGRyZXNzICovCiAJcmVzb3VyY2Vfc2l6ZV90IHBpb19hZGRyZXNzOwogCiAjZGVmaW5lIE1JTl9JT0JBU0VfTEVOICAgICAgICAgIDB4MTAwCkBAIC0yODY4LDggKzI4NDUsOCBAQAogCXVpbnQzMl90CQlyc3BfcXVlX29mZjsKIAogCS8qIE11bHRpIHF1ZXVlIGRhdGEgc3RydWN0cyAqLwotCWRldmljZV9yZWdfdCBfX2lvbWVtICptcWlvYmFzZTsKLQlkZXZpY2VfcmVnX3QgX19pb21lbSAqbXNpeGJhc2U7CisJZGV2aWNlX3JlZ190ICptcWlvYmFzZTsKKwlkZXZpY2VfcmVnX3QgKm1zaXhiYXNlOwogCXVpbnQxNl90ICAgICAgICBtc2l4X2NvdW50OwogCXVpbnQ4X3QgICAgICAgICBtcWVuYWJsZTsKIAlzdHJ1Y3QgcmVxX3F1ZSAqKnJlcV9xX21hcDsKQEAgLTI5MDUsNiArMjg4Miw3IEBACiAjZGVmaW5lIFBPUlRfU1BFRURfNEdCICAweDAzCiAjZGVmaW5lIFBPUlRfU1BFRURfOEdCICAweDA0CiAjZGVmaW5lIFBPUlRfU1BFRURfMTZHQiAweDA1CisjZGVmaW5lIFBPUlRfU1BFRURfMzJHQiAweDA2CiAjZGVmaW5lIFBPUlRfU1BFRURfMTBHQgkweDEzCiAJdWludDE2X3QJbGlua19kYXRhX3JhdGU7ICAgICAgICAgLyogRi9XIG9wZXJhdGluZyBzcGVlZCAqLwogCkBAIC0yOTI4LDYgKzI5MDYsNyBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4MDAxCTB4ODAwMQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4MDMxCTB4ODAzMQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMDMxCTB4MjAzMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMDcxCTB4MjA3MQogCXVpbnQzMl90CWRldmljZV90eXBlOwogI2RlZmluZSBEVF9JU1AyMTAwICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCiAjZGVmaW5lIERUX0lTUDIyMDAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKQEAgLTI5NDgsNyArMjkyNyw4IEBACiAjZGVmaW5lIERUX0lTUDgwMzEJCQlCSVRfMTYKICNkZWZpbmUgRFRfSVNQRlgwMAkJCUJJVF8xNwogI2RlZmluZSBEVF9JU1A4MDQ0CQkJQklUXzE4Ci0jZGVmaW5lIERUX0lTUF9MQVNUCQkJKERUX0lTUDgwNDQgPDwgMSkKKyNkZWZpbmUgRFRfSVNQMjA3MQkJCUJJVF8xOQorI2RlZmluZSBEVF9JU1BfTEFTVAkJCShEVF9JU1AyMDcxIDw8IDEpCiAKICNkZWZpbmUgRFRfVDEwX1BJICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjUKICNkZWZpbmUgRFRfSUlETUEgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjYKQEAgLTI5NzgsNiArMjk1OCw3IEBACiAjZGVmaW5lIElTX1FMQTIwMzEoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUDIwMzEpCiAjZGVmaW5lIElTX1FMQTgwMzEoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUDgwMzEpCiAjZGVmaW5lIElTX1FMQUZYMDAoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUEZYMDApCisjZGVmaW5lIElTX1FMQTIwNzEoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUDIwNzEpCiAKICNkZWZpbmUgSVNfUUxBMjNYWChoYSkgIChJU19RTEEyMzAwKGhhKSB8fCBJU19RTEEyMzEyKGhhKSB8fCBJU19RTEEyMzIyKGhhKSB8fCBcCiAJCQlJU19RTEE2MzEyKGhhKSB8fCBJU19RTEE2MzIyKGhhKSkKQEAgLTI5ODYsNiArMjk2Nyw3IEBACiAjZGVmaW5lIElTX1FMQTI1WFgoaGEpICAoSVNfUUxBMjUzMihoYSkpCiAjZGVmaW5lIElTX1FMQTgzWFgoaGEpCShJU19RTEEyMDMxKGhhKSB8fCBJU19RTEE4MDMxKGhhKSkKICNkZWZpbmUgSVNfUUxBODRYWChoYSkgIChJU19RTEE4NDMyKGhhKSkKKyNkZWZpbmUgSVNfUUxBMjdYWChoYSkgIChJU19RTEEyMDcxKGhhKSkKICNkZWZpbmUgSVNfUUxBMjRYWF9UWVBFKGhhKSAgICAgKElTX1FMQTI0WFgoaGEpIHx8IElTX1FMQTU0WFgoaGEpIHx8IFwKIAkJCQlJU19RTEE4NFhYKGhhKSkKICNkZWZpbmUgSVNfQ05BX0NBUEFCTEUoaGEpCShJU19RTEE4MVhYKGhhKSB8fCBJU19RTEE4MlhYKGhhKSB8fCBcCkBAIC0yOTk0LDExICsyOTc2LDEzIEBACiAjZGVmaW5lIElTX1FMQTJYWFhfTUlEVFlQRShoYSkJKElTX1FMQTI0WFgoaGEpIHx8IElTX1FMQTg0WFgoaGEpIHx8IFwKIAkJCQlJU19RTEEyNVhYKGhhKSB8fCBJU19RTEE4MVhYKGhhKSB8fCBcCiAJCQkJSVNfUUxBODJYWChoYSkgfHwgSVNfUUxBODNYWChoYSkgfHwgXAotCQkJCUlTX1FMQTgwNDQoaGEpKQorCQkJCUlTX1FMQTgwNDQoaGEpIHx8IElTX1FMQTI3WFgoaGEpKQogI2RlZmluZSBJU19NU0lYX05BQ0tfQ0FQQUJMRShoYSkgKElTX1FMQTgxWFgoaGEpIHx8IElTX1FMQTgzWFgoaGEpKQogI2RlZmluZSBJU19OT1BPTExJTkdfVFlQRShoYSkJKElTX1FMQTgxWFgoaGEpICYmIChoYSktPmZsYWdzLm1zaXhfZW5hYmxlZCkKLSNkZWZpbmUgSVNfRkFDX1JFUVVJUkVEKGhhKQkoSVNfUUxBODFYWChoYSkgfHwgSVNfUUxBODNYWChoYSkpCi0jZGVmaW5lIElTX05PQ0FDSEVfVlBEX1RZUEUoaGEpCShJU19RTEE4MVhYKGhhKSB8fCBJU19RTEE4M1hYKGhhKSkKKyNkZWZpbmUgSVNfRkFDX1JFUVVJUkVEKGhhKQkoSVNfUUxBODFYWChoYSkgfHwgSVNfUUxBODNYWChoYSkgfHwgXAorCQkJCUlTX1FMQTI3WFgoaGEpKQorI2RlZmluZSBJU19OT0NBQ0hFX1ZQRF9UWVBFKGhhKQkoSVNfUUxBODFYWChoYSkgfHwgSVNfUUxBODNYWChoYSkgfHwgXAorCQkJCUlTX1FMQTI3WFgoaGEpKQogI2RlZmluZSBJU19BTE9HSU9fQ0FQQUJMRShoYSkJKElTX1FMQTIzWFgoaGEpIHx8IElTX0ZXSTJfQ0FQQUJMRShoYSkpCiAKICNkZWZpbmUgSVNfVDEwX1BJX0NBUEFCTEUoaGEpICAgKChoYSktPmRldmljZV90eXBlICYgRFRfVDEwX1BJKQpAQCAtMzAwOCw3ICsyOTkyLDggQEAKICNkZWZpbmUgSVNfT0VNXzAwMShoYSkgICAgICAgICAgKChoYSktPmRldmljZV90eXBlICYgRFRfT0VNXzAwMSkKICNkZWZpbmUgSEFTX0VYVEVOREVEX0lEUyhoYSkgICAgKChoYSktPmRldmljZV90eXBlICYgRFRfRVhURU5ERURfSURTKQogI2RlZmluZSBJU19DVDZfU1VQUE9SVEVEKGhhKQkoKGhhKS0+ZGV2aWNlX3R5cGUgJiBEVF9DVDZfU1VQUE9SVEVEKQotI2RlZmluZSBJU19NUVVFX0NBUEFCTEUoaGEpCSgoaGEpLT5tcWVuYWJsZSB8fCBJU19RTEE4M1hYKGhhKSkKKyNkZWZpbmUgSVNfTVFVRV9DQVBBQkxFKGhhKQkoKGhhKS0+bXFlbmFibGUgfHwgSVNfUUxBODNYWChoYSkgfHwgXAorCQkJCUlTX1FMQTI3WFgoaGEpKQogI2RlZmluZSBJU19CSURJX0NBUEFCTEUoaGEpCSgoSVNfUUxBMjVYWChoYSkgfHwgSVNfUUxBMjAzMShoYSkpKQogLyogQml0IDIxIG9mIGZ3X2F0dHJpYnV0ZXMgZGVjaWRlcyB0aGUgTUNUUCBjYXBhYmlsaXRpZXMgKi8KICNkZWZpbmUgSVNfTUNUUF9DQVBBQkxFKGhhKQkoSVNfUUxBMjAzMShoYSkgJiYgXApAQCAtMzEzMyw2ICszMTE4LDkgQEAKIAl1aW50MTZfdAlmd194Y2JfY291bnQ7CiAJdWludDE2X3QJZndfaW9jYl9jb3VudDsKIAorCXVpbnQzMl90CWZ3X3NoYXJlZF9yYW1fc3RhcnQ7CisJdWludDMyX3QJZndfc2hhcmVkX3JhbV9lbmQ7CisKIAl1aW50MTZfdAlmd19vcHRpb25zWzE2XTsgICAgICAgICAvKiBzbG90czogMSwyLDMsMTAsMTEgKi8KIAl1aW50OF90CQlmd19zZXJpYWxsaW5rX29wdGlvbnNbNF07CiAJdWludDE2X3QJZndfc2VyaWFsbGlua19vcHRpb25zMjRbNF07CkBAIC0zMTQxLDYgKzMxMjksOSBAQAogCXVpbnQzMl90CW1waV9jYXBhYmlsaXRpZXM7CiAJdWludDhfdAkJcGh5X3ZlcnNpb25bM107CiAKKwkvKiBGaXJtd2FyZSBkdW1wIHRlbXBsYXRlICovCisJdm9pZAkJKmZ3X2R1bXBfdGVtcGxhdGU7CisJdWludDMyX3QJZndfZHVtcF90ZW1wbGF0ZV9sZW47CiAJLyogRmlybXdhcmUgZHVtcCBpbmZvcm1hdGlvbi4gKi8KIAlzdHJ1Y3QgcWxhMnh4eF9md19kdW1wICpmd19kdW1wOwogCXVpbnQzMl90CWZ3X2R1bXBfbGVuOwpAQCAtMzE4Myw2ICszMTc0LDcgQEAKICNkZWZpbmUgUUxBX1NXUklUSU5HCTIKIAl1aW50MzJfdAlvcHRyb21fcmVnaW9uX3N0YXJ0OwogCXVpbnQzMl90CW9wdHJvbV9yZWdpb25fc2l6ZTsKKwlzdHJ1Y3QgbXV0ZXgJb3B0cm9tX211dGV4OwogCiAvKiBQQ0kgZXhwYW5zaW9uIFJPTSBpbWFnZSBpbmZvcm1hdGlvbi4gKi8KICNkZWZpbmUgUk9NX0NPREVfVFlQRV9CSU9TCTAKQEAgLTMzMDksNiArMzMwMSw3IEBACiAJc3RydWN0IG1yX2RhdGFfZngwMCBtcjsKIAogCXN0cnVjdCBxbHRfaHdfZGF0YSB0Z3Q7CisJaW50CWFsbG93X2NuYV9md19kdW1wOwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZnMuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZnMuYwppbmRleCA3OTJhMjkyLi4zMmFiODA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGZzLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Rmcy5jCkBAIC0xMTQsNyArMTE0LDggQEAKIHsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAotCWlmICghSVNfUUxBMjVYWChoYSkgJiYgIUlTX1FMQTgxWFgoaGEpICYmICFJU19RTEE4M1hYKGhhKSkKKwlpZiAoIUlTX1FMQTI1WFgoaGEpICYmICFJU19RTEE4MVhYKGhhKSAmJiAhSVNfUUxBODNYWChoYSkgJiYKKwkgICAgIUlTX1FMQTI3WFgoaGEpKQogCQlnb3RvIG91dDsKIAlpZiAoIWhhLT5mY2UpCiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Z3LmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZncuaAppbmRleCA2MTBkM2FhOS4uM2E3MzUzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Z3LmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Z3LmgKQEAgLTEzNzgsNiArMTM3OCwxMCBAQAogI2RlZmluZSBGTFRfUkVHX05WUkFNXzAJCTB4MTUKICNkZWZpbmUgRkxUX1JFR19WUERfMQkJMHgxNgogI2RlZmluZSBGTFRfUkVHX05WUkFNXzEJCTB4MTcKKyNkZWZpbmUgRkxUX1JFR19WUERfMgkJMHhENAorI2RlZmluZSBGTFRfUkVHX05WUkFNXzIJCTB4RDUKKyNkZWZpbmUgRkxUX1JFR19WUERfMwkJMHhENgorI2RlZmluZSBGTFRfUkVHX05WUkFNXzMJCTB4RDcKICNkZWZpbmUgRkxUX1JFR19GRFQJCTB4MWEKICNkZWZpbmUgRkxUX1JFR19GTFQJCTB4MWMKICNkZWZpbmUgRkxUX1JFR19IV19FVkVOVF8wCTB4MWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaAppbmRleCAxZjQyNjYyLi5lNjY1ZTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCkBAIC0zMzAsNiArMzMwLDcgQEAKICAgICBkbWFfYWRkcl90KTsKIAogZXh0ZXJuIGludCBxbGEyNHh4X2Fib3J0X2NvbW1hbmQoc3JiX3QgKik7CitleHRlcm4gaW50IHFsYTI0eHhfYXN5bmNfYWJvcnRfY29tbWFuZChzcmJfdCAqKTsKIGV4dGVybiBpbnQKIHFsYTI0eHhfYWJvcnRfdGFyZ2V0KHN0cnVjdCBmY19wb3J0ICosIHVuc2lnbmVkIGludCwgaW50KTsKIGV4dGVybiBpbnQKQEAgLTUxMSw2ICs1MTIsMTYgQEAKIGV4dGVybiB2b2lkIHFsYTI0eHhfZndfZHVtcChzY3NpX3FsYV9ob3N0X3QgKiwgaW50KTsKIGV4dGVybiB2b2lkIHFsYTI1eHhfZndfZHVtcChzY3NpX3FsYV9ob3N0X3QgKiwgaW50KTsKIGV4dGVybiB2b2lkIHFsYTgxeHhfZndfZHVtcChzY3NpX3FsYV9ob3N0X3QgKiwgaW50KTsKK2V4dGVybiB2b2lkIHFsYTgyeHhfZndfZHVtcChzY3NpX3FsYV9ob3N0X3QgKiwgaW50KTsKK2V4dGVybiB2b2lkIHFsYTgwNDRfZndfZHVtcChzY3NpX3FsYV9ob3N0X3QgKiwgaW50KTsKKworZXh0ZXJuIHZvaWQgcWxhMjd4eF9md2R1bXAoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CitleHRlcm4gdWxvbmcgcWxhMjd4eF9md2R0X2NhbGN1bGF0ZV9kdW1wX3NpemUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CitleHRlcm4gaW50IHFsYTI3eHhfZndkdF90ZW1wbGF0ZV92YWxpZCh2b2lkICopOworZXh0ZXJuIHVsb25nIHFsYTI3eHhfZndkdF90ZW1wbGF0ZV9zaXplKHZvaWQgKik7CitleHRlcm4gY29uc3Qgdm9pZCAqcWxhMjd4eF9md2R0X3RlbXBsYXRlX2RlZmF1bHQodm9pZCk7CitleHRlcm4gdWxvbmcgcWxhMjd4eF9md2R0X3RlbXBsYXRlX2RlZmF1bHRfc2l6ZSh2b2lkKTsKKwogZXh0ZXJuIHZvaWQgcWxhMngwMF9kdW1wX3JlZ3Moc2NzaV9xbGFfaG9zdF90ICopOwogZXh0ZXJuIHZvaWQgcWxhMngwMF9kdW1wX2J1ZmZlcih1aW50OF90ICosIHVpbnQzMl90KTsKIGV4dGVybiB2b2lkIHFsYTJ4MDBfZHVtcF9idWZmZXJfemlwcGVkKHVpbnQ4X3QgKiwgdWludDMyX3QpOwpAQCAtNTk0LDcgKzYwNSw2IEBACiBleHRlcm4gaXJxcmV0dXJuX3QgcWxhZngwMF9pbnRyX2hhbmRsZXIoaW50LCB2b2lkICopOwogZXh0ZXJuIHZvaWQgcWxhZngwMF9lbmFibGVfaW50cnMoc3RydWN0IHFsYV9od19kYXRhICopOwogZXh0ZXJuIHZvaWQgcWxhZngwMF9kaXNhYmxlX2ludHJzKHN0cnVjdCBxbGFfaHdfZGF0YSAqKTsKLWV4dGVybiBpbnQgcWxhZngwMF9hYm9ydF9jb21tYW5kKHNyYl90ICopOwogZXh0ZXJuIGludCBxbGFmeDAwX2Fib3J0X3RhcmdldChmY19wb3J0X3QgKiwgdW5zaWduZWQgaW50LCBpbnQpOwogZXh0ZXJuIGludCBxbGFmeDAwX2x1bl9yZXNldChmY19wb3J0X3QgKiwgdW5zaWduZWQgaW50LCBpbnQpOwogZXh0ZXJuIGludCBxbGFmeDAwX3N0YXJ0X3Njc2koc3JiX3QgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jCmluZGV4IGNkNDdmMWIuLmUzNzdmOWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYwpAQCAtMTUzMiw2ICsxNTMyLDEwIEBACiAJaWYgKElTX0NOQV9DQVBBQkxFKGhhKSkKIAkJZWl0ZXItPmEuc3VwX3NwZWVkID0gX19jb25zdGFudF9jcHVfdG9fYmUzMigKIAkJICAgIEZETUlfUE9SVF9TUEVFRF8xMEdCKTsKKwllbHNlIGlmIChJU19RTEEyN1hYKGhhKSkKKwkJZWl0ZXItPmEuc3VwX3NwZWVkID0gX19jb25zdGFudF9jcHVfdG9fYmUzMigKKwkJICAgIEZETUlfUE9SVF9TUEVFRF8zMkdCfEZETUlfUE9SVF9TUEVFRF8xNkdCfAorCQkgICAgRkRNSV9QT1JUX1NQRUVEXzhHQik7CiAJZWxzZSBpZiAoSVNfUUxBMjVYWChoYSkpCiAJCWVpdGVyLT5hLnN1cF9zcGVlZCA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoCiAJCSAgICBGRE1JX1BPUlRfU1BFRURfMUdCfEZETUlfUE9SVF9TUEVFRF8yR0J8CkBAIC0xNTgwLDYgKzE1ODQsMTAgQEAKIAkJZWl0ZXItPmEuY3VyX3NwZWVkID0KIAkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoRkRNSV9QT1JUX1NQRUVEXzE2R0IpOwogCQlicmVhazsKKwljYXNlIFBPUlRfU1BFRURfMzJHQjoKKwkJZWl0ZXItPmEuY3VyX3NwZWVkID0KKwkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoRkRNSV9QT1JUX1NQRUVEXzMyR0IpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQllaXRlci0+YS5jdXJfc3BlZWQgPQogCQkgICAgX19jb25zdGFudF9jcHVfdG9fYmUzMihGRE1JX1BPUlRfU1BFRURfVU5LTk9XTik7CkBAIC0xODg5LDYgKzE4OTcsOSBAQAogCQkJY2FzZSBCSVRfMTA6CiAJCQkJbGlzdFtpXS5mcF9zcGVlZCA9IFBPUlRfU1BFRURfMTZHQjsKIAkJCQlicmVhazsKKwkJCWNhc2UgQklUXzg6CisJCQkJbGlzdFtpXS5mcF9zcGVlZCA9IFBPUlRfU1BFRURfMzJHQjsKKwkJCQlicmVhazsKIAkJCX0KIAogCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA1YiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCmluZGV4IGU3ZTVmNGYuLjM4YWViNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYwpAQCAtMjcxLDU2ICsyNzEsNDYgQEAKIH0KIAogc3RhdGljIHZvaWQKLXFsYTJ4MDBfYXN5bmNfdG1fY21kX2RvbmUodm9pZCAqZGF0YSwgdm9pZCAqcHRyLCBpbnQgcmVzKQorcWxhMngwMF90bWZfaW9jYl90aW1lb3V0KHZvaWQgKmRhdGEpCit7CisJc3JiX3QgKnNwID0gKHNyYl90ICopZGF0YTsKKwlzdHJ1Y3Qgc3JiX2lvY2IgKnRtZiA9ICZzcC0+dS5pb2NiX2NtZDsKKworCXRtZi0+dS50bWYuY29tcF9zdGF0dXMgPSBDU19USU1FT1VUOworCWNvbXBsZXRlKCZ0bWYtPnUudG1mLmNvbXApOworfQorCitzdGF0aWMgdm9pZAorcWxhMngwMF90bWZfc3BfZG9uZSh2b2lkICpkYXRhLCB2b2lkICpwdHIsIGludCByZXMpCiB7CiAJc3JiX3QgKnNwID0gKHNyYl90ICopcHRyOwotCXN0cnVjdCBzcmJfaW9jYiAqaW9jYiA9ICZzcC0+dS5pb2NiX2NtZDsKLQlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhID0gKHNjc2lfcWxhX2hvc3RfdCAqKWRhdGE7Ci0JdWludDMyX3QgZmxhZ3M7Ci0JdWludDE2X3QgbHVuOwotCWludCBydmFsOwotCi0JaWYgKCF0ZXN0X2JpdChVTkxPQURJTkcsICZ2aGEtPmRwY19mbGFncykpIHsKLQkJZmxhZ3MgPSBpb2NiLT51LnRtZi5mbGFnczsKLQkJbHVuID0gKHVpbnQxNl90KWlvY2ItPnUudG1mLmx1bjsKLQotCQkvKiBJc3N1ZSBNYXJrZXIgSU9DQiAqLwotCQlydmFsID0gcWxhMngwMF9tYXJrZXIodmhhLCB2aGEtPmh3LT5yZXFfcV9tYXBbMF0sCi0JCQl2aGEtPmh3LT5yc3BfcV9tYXBbMF0sIHNwLT5mY3BvcnQtPmxvb3BfaWQsIGx1biwKLQkJCWZsYWdzID09IFRDRl9MVU5fUkVTRVQgPyBNS19TWU5DX0lEX0xVTiA6IE1LX1NZTkNfSUQpOwotCi0JCWlmICgocnZhbCAhPSBRTEFfU1VDQ0VTUykgfHwgaW9jYi0+dS50bWYuZGF0YSkgewotCQkJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMzAsCi0JCQkgICAgIlRNIElPQ0IgZmFpbGVkICgleCkuXG4iLCBydmFsKTsKLQkJfQotCX0KLQlzcC0+ZnJlZShzcC0+ZmNwb3J0LT52aGEsIHNwKTsKKwlzdHJ1Y3Qgc3JiX2lvY2IgKnRtZiA9ICZzcC0+dS5pb2NiX2NtZDsKKwljb21wbGV0ZSgmdG1mLT51LnRtZi5jb21wKTsKIH0KIAogaW50Ci1xbGEyeDAwX2FzeW5jX3RtX2NtZChmY19wb3J0X3QgKmZjcG9ydCwgdWludDMyX3QgdG1fZmxhZ3MsIHVpbnQzMl90IGx1biwKK3FsYTJ4MDBfYXN5bmNfdG1fY21kKGZjX3BvcnRfdCAqZmNwb3J0LCB1aW50MzJfdCBmbGFncywgdWludDMyX3QgbHVuLAogCXVpbnQzMl90IHRhZykKIHsKIAlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhID0gZmNwb3J0LT52aGE7CisJc3RydWN0IHNyYl9pb2NiICp0bV9pb2NiOwogCXNyYl90ICpzcDsKLQlzdHJ1Y3Qgc3JiX2lvY2IgKnRjZjsKLQlpbnQgcnZhbDsKKwlpbnQgcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAlzcCA9IHFsYTJ4MDBfZ2V0X3NwKHZoYSwgZmNwb3J0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNwKQogCQlnb3RvIGRvbmU7CiAKKwl0bV9pb2NiID0gJnNwLT51LmlvY2JfY21kOwogCXNwLT50eXBlID0gU1JCX1RNX0NNRDsKIAlzcC0+bmFtZSA9ICJ0bWYiOwotCXFsYTJ4MDBfaW5pdF90aW1lcihzcCwgcWxhMngwMF9nZXRfYXN5bmNfdGltZW91dCh2aGEpICsgMik7Ci0KLQl0Y2YgPSAmc3AtPnUuaW9jYl9jbWQ7Ci0JdGNmLT51LnRtZi5mbGFncyA9IHRtX2ZsYWdzOwotCXRjZi0+dS50bWYubHVuID0gbHVuOwotCXRjZi0+dS50bWYuZGF0YSA9IHRhZzsKLQl0Y2YtPnRpbWVvdXQgPSBxbGEyeDAwX2FzeW5jX2lvY2JfdGltZW91dDsKLQlzcC0+ZG9uZSA9IHFsYTJ4MDBfYXN5bmNfdG1fY21kX2RvbmU7CisJcWxhMngwMF9pbml0X3RpbWVyKHNwLCBxbGEyeDAwX2dldF9hc3luY190aW1lb3V0KHZoYSkpOworCXRtX2lvY2ItPnUudG1mLmZsYWdzID0gZmxhZ3M7CisJdG1faW9jYi0+dS50bWYubHVuID0gbHVuOworCXRtX2lvY2ItPnUudG1mLmRhdGEgPSB0YWc7CisJc3AtPmRvbmUgPSBxbGEyeDAwX3RtZl9zcF9kb25lOworCXRtX2lvY2ItPnRpbWVvdXQgPSBxbGEyeDAwX3RtZl9pb2NiX3RpbWVvdXQ7CisJaW5pdF9jb21wbGV0aW9uKCZ0bV9pb2NiLT51LnRtZi5jb21wKTsKIAogCXJ2YWwgPSBxbGEyeDAwX3N0YXJ0X3NwKHNwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKQEAgLTMzMCwxNCArMzIwLDEyMSBAQAogCSAgICAiQXN5bmMtdG1mIGhkbD0leCBsb29wLWlkPSV4IHBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLAogCSAgICBzcC0+aGFuZGxlLCBmY3BvcnQtPmxvb3BfaWQsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKIAkgICAgZmNwb3J0LT5kX2lkLmIuYXJlYSwgZmNwb3J0LT5kX2lkLmIuYWxfcGEpOwotCXJldHVybiBydmFsOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmdG1faW9jYi0+dS50bWYuY29tcCk7CisKKwlydmFsID0gdG1faW9jYi0+dS50bWYuY29tcF9zdGF0dXMgPT0gQ1NfQ09NUExFVEUgPworCSAgICBRTEFfU1VDQ0VTUyA6IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisKKwlpZiAoKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHx8IHRtX2lvY2ItPnUudG1mLmRhdGEpIHsKKwkJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMzAsCisJCSAgICAiVE0gSU9DQiBmYWlsZWQgKCV4KS5cbiIsIHJ2YWwpOworCX0KKworCWlmICghdGVzdF9iaXQoVU5MT0FESU5HLCAmdmhhLT5kcGNfZmxhZ3MpICYmICFJU19RTEFGWDAwKHZoYS0+aHcpKSB7CisJCWZsYWdzID0gdG1faW9jYi0+dS50bWYuZmxhZ3M7CisJCWx1biA9ICh1aW50MTZfdCl0bV9pb2NiLT51LnRtZi5sdW47CisKKwkJLyogSXNzdWUgTWFya2VyIElPQ0IgKi8KKwkJcWxhMngwMF9tYXJrZXIodmhhLCB2aGEtPmh3LT5yZXFfcV9tYXBbMF0sCisJCSAgICB2aGEtPmh3LT5yc3BfcV9tYXBbMF0sIHNwLT5mY3BvcnQtPmxvb3BfaWQsIGx1biwKKwkJICAgIGZsYWdzID09IFRDRl9MVU5fUkVTRVQgPyBNS19TWU5DX0lEX0xVTiA6IE1LX1NZTkNfSUQpOworCX0KIAogZG9uZV9mcmVlX3NwOgotCXNwLT5mcmVlKGZjcG9ydC0+dmhhLCBzcCk7CisJc3AtPmZyZWUodmhhLCBzcCk7CiBkb25lOgogCXJldHVybiBydmFsOwogfQogCitzdGF0aWMgdm9pZAorcWxhMjR4eF9hYm9ydF9pb2NiX3RpbWVvdXQodm9pZCAqZGF0YSkKK3sKKwlzcmJfdCAqc3AgPSAoc3JiX3QgKilkYXRhOworCXN0cnVjdCBzcmJfaW9jYiAqYWJ0ID0gJnNwLT51LmlvY2JfY21kOworCisJYWJ0LT51LmFidC5jb21wX3N0YXR1cyA9IENTX1RJTUVPVVQ7CisJY29tcGxldGUoJmFidC0+dS5hYnQuY29tcCk7Cit9CisKK3N0YXRpYyB2b2lkCitxbGEyNHh4X2Fib3J0X3NwX2RvbmUodm9pZCAqZGF0YSwgdm9pZCAqcHRyLCBpbnQgcmVzKQoreworCXNyYl90ICpzcCA9IChzcmJfdCAqKXB0cjsKKwlzdHJ1Y3Qgc3JiX2lvY2IgKmFidCA9ICZzcC0+dS5pb2NiX2NtZDsKKworCWNvbXBsZXRlKCZhYnQtPnUuYWJ0LmNvbXApOworfQorCitzdGF0aWMgaW50CitxbGEyNHh4X2FzeW5jX2Fib3J0X2NtZChzcmJfdCAqY21kX3NwKQoreworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gY21kX3NwLT5mY3BvcnQtPnZoYTsKKwlmY19wb3J0X3QgKmZjcG9ydCA9IGNtZF9zcC0+ZmNwb3J0OworCXN0cnVjdCBzcmJfaW9jYiAqYWJ0X2lvY2I7CisJc3JiX3QgKnNwOworCWludCBydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKworCXNwID0gcWxhMngwMF9nZXRfc3AodmhhLCBmY3BvcnQsIEdGUF9LRVJORUwpOworCWlmICghc3ApCisJCWdvdG8gZG9uZTsKKworCWFidF9pb2NiID0gJnNwLT51LmlvY2JfY21kOworCXNwLT50eXBlID0gU1JCX0FCVF9DTUQ7CisJc3AtPm5hbWUgPSAiYWJvcnQiOworCXFsYTJ4MDBfaW5pdF90aW1lcihzcCwgcWxhMngwMF9nZXRfYXN5bmNfdGltZW91dCh2aGEpKTsKKwlhYnRfaW9jYi0+dS5hYnQuY21kX2huZGwgPSBjbWRfc3AtPmhhbmRsZTsKKwlzcC0+ZG9uZSA9IHFsYTI0eHhfYWJvcnRfc3BfZG9uZTsKKwlhYnRfaW9jYi0+dGltZW91dCA9IHFsYTI0eHhfYWJvcnRfaW9jYl90aW1lb3V0OworCWluaXRfY29tcGxldGlvbigmYWJ0X2lvY2ItPnUuYWJ0LmNvbXApOworCisJcnZhbCA9IHFsYTJ4MDBfc3RhcnRfc3Aoc3ApOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQorCQlnb3RvIGRvbmVfZnJlZV9zcDsKKworCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDdjLAorCSAgICAiQWJvcnQgY29tbWFuZCBpc3N1ZWQgLSBoZGw9JXgsIHRhcmdldF9pZD0leFxuIiwKKwkgICAgY21kX3NwLT5oYW5kbGUsIGZjcG9ydC0+dGd0X2lkKTsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFidF9pb2NiLT51LmFidC5jb21wKTsKKworCXJ2YWwgPSBhYnRfaW9jYi0+dS5hYnQuY29tcF9zdGF0dXMgPT0gQ1NfQ09NUExFVEUgPworCSAgICBRTEFfU1VDQ0VTUyA6IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisKK2RvbmVfZnJlZV9zcDoKKwlzcC0+ZnJlZSh2aGEsIHNwKTsKK2RvbmU6CisJcmV0dXJuIHJ2YWw7Cit9CisKK2ludAorcWxhMjR4eF9hc3luY19hYm9ydF9jb21tYW5kKHNyYl90ICpzcCkKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3MgPSAwOworCisJdWludDMyX3QJaGFuZGxlOworCWZjX3BvcnRfdAkqZmNwb3J0ID0gc3AtPmZjcG9ydDsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhID0gZmNwb3J0LT52aGE7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc3RydWN0IHJlcV9xdWUgKnJlcSA9IHZoYS0+cmVxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJZm9yIChoYW5kbGUgPSAxOyBoYW5kbGUgPCByZXEtPm51bV9vdXRzdGFuZGluZ19jbWRzOyBoYW5kbGUrKykgeworCQlpZiAocmVxLT5vdXRzdGFuZGluZ19jbWRzW2hhbmRsZV0gPT0gc3ApCisJCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwlpZiAoaGFuZGxlID09IHJlcS0+bnVtX291dHN0YW5kaW5nX2NtZHMpIHsKKwkJLyogQ29tbWFuZCBub3QgZm91bmQuICovCisJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOworCX0KKwlpZiAoc3AtPnR5cGUgPT0gU1JCX0ZYSU9DQl9EQ01EKQorCQlyZXR1cm4gcWxhZngwMF9meF9kaXNjKHZoYSwgJnZoYS0+aHctPm1yLmZjcG9ydCwKKwkJICAgIEZYRElTQ19BQk9SVF9JT0NUTCk7CisKKwlyZXR1cm4gcWxhMjR4eF9hc3luY19hYm9ydF9jbWQoc3ApOworfQorCiB2b2lkCiBxbGEyeDAwX2FzeW5jX2xvZ2luX2RvbmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwgZmNfcG9ydF90ICpmY3BvcnQsCiAgICAgdWludDE2X3QgKmRhdGEpCkBAIC0xMzc5LDcgKzE0NzYsMTIgQEAKIAl9CiAKIAloYS0+ZndfZHVtcGVkID0gMDsKLQlmaXhlZF9zaXplID0gbWVtX3NpemUgPSBlZnRfc2l6ZSA9IGZjZV9zaXplID0gbXFfc2l6ZSA9IDA7CisJZHVtcF9zaXplID0gZml4ZWRfc2l6ZSA9IG1lbV9zaXplID0gZWZ0X3NpemUgPSBmY2Vfc2l6ZSA9IG1xX3NpemUgPSAwOworCXJlcV9xX3NpemUgPSByc3BfcV9zaXplID0gMDsKKworCWlmIChJU19RTEEyN1hYKGhhKSkKKwkJZ290byB0cnlfZmNlOworCiAJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKSB7CiAJCWZpeGVkX3NpemUgPSBzaXplb2Yoc3RydWN0IHFsYTIxMDBfZndfZHVtcCk7CiAJfSBlbHNlIGlmIChJU19RTEEyM1hYKGhhKSkgewpAQCAtMTM5NSw2ICsxNDk3LDcgQEAKIAkJCWZpeGVkX3NpemUgPSBvZmZzZXRvZihzdHJ1Y3QgcWxhMjV4eF9md19kdW1wLCBleHRfbWVtKTsKIAkJZWxzZQogCQkJZml4ZWRfc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBxbGEyNHh4X2Z3X2R1bXAsIGV4dF9tZW0pOworCiAJCW1lbV9zaXplID0gKGhhLT5md19tZW1vcnlfc2l6ZSAtIDB4MTAwMDAwICsgMSkgKgogCQkgICAgc2l6ZW9mKHVpbnQzMl90KTsKIAkJaWYgKGhhLT5tcWVuYWJsZSkgewpAQCAtMTQxMiw5ICsxNTE1LDE2IEBACiAJCWlmIChoYS0+dGd0LmF0aW9fcmluZykKIAkJCW1xX3NpemUgKz0gaGEtPnRndC5hdGlvX3FfbGVuZ3RoICogc2l6ZW9mKHJlcXVlc3RfdCk7CiAJCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgRmlicmUgQ2hhbm5lbCBFdmVudCBCdWZmZXIuICovCi0JCWlmICghSVNfUUxBMjVYWChoYSkgJiYgIUlTX1FMQTgxWFgoaGEpICYmICFJU19RTEE4M1hYKGhhKSkKKwkJaWYgKCFJU19RTEEyNVhYKGhhKSAmJiAhSVNfUUxBODFYWChoYSkgJiYgIUlTX1FMQTgzWFgoaGEpICYmCisJCSAgICAhSVNfUUxBMjdYWChoYSkpCiAJCQlnb3RvIHRyeV9lZnQ7CiAKK3RyeV9mY2U6CisJCWlmIChoYS0+ZmNlKQorCQkJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCisJCQkgICAgRkNFX1NJWkUsIGhhLT5mY2UsIGhhLT5mY2VfZG1hKTsKKworCQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEZpYnJlIENoYW5uZWwgRXZlbnQgQnVmZmVyLiAqLwogCQl0YyA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgRkNFX1NJWkUsICZ0Y19kbWEsCiAJCSAgICBHRlBfS0VSTkVMKTsKIAkJaWYgKCF0YykgewpAQCAtMTQ0Miw3ICsxNTUyLDEyIEBACiAJCWhhLT5mbGFncy5mY2VfZW5hYmxlZCA9IDE7CiAJCWhhLT5mY2VfZG1hID0gdGNfZG1hOwogCQloYS0+ZmNlID0gdGM7CisKIHRyeV9lZnQ6CisJCWlmIChoYS0+ZWZ0KQorCQkJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCisJCQkgICAgRUZUX1NJWkUsIGhhLT5lZnQsIGhhLT5lZnRfZG1hKTsKKwogCQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEV4dGVuZGVkIFRyYWNlIEJ1ZmZlci4gKi8KIAkJdGMgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIEVGVF9TSVpFLCAmdGNfZG1hLAogCQkgICAgR0ZQX0tFUk5FTCk7CkBAIC0xNDY5LDE1ICsxNTg0LDI4IEBACiAJCWhhLT5lZnRfZG1hID0gdGNfZG1hOwogCQloYS0+ZWZ0ID0gdGM7CiAJfQorCiBjb250X2FsbG9jOgorCWlmIChJU19RTEEyN1hYKGhhKSkgeworCQlpZiAoIWhhLT5md19kdW1wX3RlbXBsYXRlKSB7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGJhLAorCQkJICAgICJGYWlsZWQgbWlzc2luZyBmd2R1bXAgdGVtcGxhdGVcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWR1bXBfc2l6ZSA9IHFsYTI3eHhfZndkdF9jYWxjdWxhdGVfZHVtcF9zaXplKHZoYSk7CisJCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwZmEsCisJCSAgICAiLT4gYWxsb2NhdGluZyBmd2R1bXAgKCV4IGJ5dGVzKS4uLlxuIiwgZHVtcF9zaXplKTsKKwkJZ290byBhbGxvY2F0ZTsKKwl9CisKIAlyZXFfcV9zaXplID0gcmVxLT5sZW5ndGggKiBzaXplb2YocmVxdWVzdF90KTsKIAlyc3BfcV9zaXplID0gcnNwLT5sZW5ndGggKiBzaXplb2YocmVzcG9uc2VfdCk7Ci0KIAlkdW1wX3NpemUgPSBvZmZzZXRvZihzdHJ1Y3QgcWxhMnh4eF9md19kdW1wLCBpc3ApOwogCWR1bXBfc2l6ZSArPSBmaXhlZF9zaXplICsgbWVtX3NpemUgKyByZXFfcV9zaXplICsgcnNwX3Ffc2l6ZSArIGVmdF9zaXplOwogCWhhLT5jaGFpbl9vZmZzZXQgPSBkdW1wX3NpemU7CiAJZHVtcF9zaXplICs9IG1xX3NpemUgKyBmY2Vfc2l6ZTsKIAorYWxsb2NhdGU6CiAJaGEtPmZ3X2R1bXAgPSB2bWFsbG9jKGR1bXBfc2l6ZSk7CiAJaWYgKCFoYS0+ZndfZHVtcCkgewogCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGM0LApAQCAtMTQ5OSwxMCArMTYyNywxMyBAQAogCQl9CiAJCXJldHVybjsKIAl9CisJaGEtPmZ3X2R1bXBfbGVuID0gZHVtcF9zaXplOwogCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwYzUsCiAJICAgICJBbGxvY2F0ZWQgKCVkIEtCKSBmb3IgZmlybXdhcmUgZHVtcC5cbiIsIGR1bXBfc2l6ZSAvIDEwMjQpOwogCi0JaGEtPmZ3X2R1bXBfbGVuID0gZHVtcF9zaXplOworCWlmIChJU19RTEEyN1hYKGhhKSkKKwkJcmV0dXJuOworCiAJaGEtPmZ3X2R1bXAtPnNpZ25hdHVyZVswXSA9ICdRJzsKIAloYS0+ZndfZHVtcC0+c2lnbmF0dXJlWzFdID0gJ0wnOwogCWhhLT5md19kdW1wLT5zaWduYXR1cmVbMl0gPSAnRyc7CkBAIC0xNzE4LDkgKzE4NDksNiBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCX0KIAotCWlmIChJU19RTEE4M1hYKGhhKSkKLQkJZ290byBza2lwX2ZhY19jaGVjazsKLQogCWlmIChydmFsID09IFFMQV9TVUNDRVNTICYmIElTX0ZBQ19SRVFVSVJFRChoYSkpIHsKIAkJdWludDMyX3Qgc2l6ZTsKIApAQCAtMTczMyw4ICsxODYxLDggQEAKIAkJCSAgICAiVW5zdXBwb3J0ZWQgRkFDIGZpcm13YXJlICglZC4lMDJkLiUwMmQpLlxuIiwKIAkJCSAgICBoYS0+ZndfbWFqb3JfdmVyc2lvbiwgaGEtPmZ3X21pbm9yX3ZlcnNpb24sCiAJCQkgICAgaGEtPmZ3X3N1Ym1pbm9yX3ZlcnNpb24pOwotc2tpcF9mYWNfY2hlY2s6Ci0JCQlpZiAoSVNfUUxBODNYWChoYSkpIHsKKworCQkJaWYgKElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKSB7CiAJCQkJaGEtPmZsYWdzLmZhY19zdXBwb3J0ZWQgPSAwOwogCQkJCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIAkJCX0KQEAgLTE5MzMsNyArMjA2MSw3IEBACiAJaWNiLT5hdGlvX3FfYWRkcmVzc1swXSA9IGNwdV90b19sZTMyKExTRChoYS0+dGd0LmF0aW9fZG1hKSk7CiAJaWNiLT5hdGlvX3FfYWRkcmVzc1sxXSA9IGNwdV90b19sZTMyKE1TRChoYS0+dGd0LmF0aW9fZG1hKSk7CiAKLQlpZiAoaGEtPm1xZW5hYmxlIHx8IElTX1FMQTgzWFgoaGEpKSB7CisJaWYgKGhhLT5tcWVuYWJsZSB8fCBJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkgewogCQlpY2ItPnFvcyA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoUUxBX0RFRkFVTFRfUVVFX1FPUyk7CiAJCWljYi0+cmlkID0gX19jb25zdGFudF9jcHVfdG9fbGUxNihyaWQpOwogCQlpZiAoaGEtPmZsYWdzLm1zaXhfZW5hYmxlZCkgewpAQCAtNDc5MiwxMyArNDkyMCwxNCBAQAogCW52ID0gaGEtPm52cmFtOwogCiAJLyogRGV0ZXJtaW5lIE5WUkFNIHN0YXJ0aW5nIGFkZHJlc3MuICovCi0JaWYgKGhhLT5mbGFncy5wb3J0MCkgeworCWlmIChoYS0+cG9ydF9ubyA9PSAwKSB7CiAJCWhhLT5udnJhbV9iYXNlID0gRkFfTlZSQU1fRlVOQzBfQUREUjsKIAkJaGEtPnZwZF9iYXNlID0gRkFfTlZSQU1fVlBEMF9BRERSOwogCX0gZWxzZSB7CiAJCWhhLT5udnJhbV9iYXNlID0gRkFfTlZSQU1fRlVOQzFfQUREUjsKIAkJaGEtPnZwZF9iYXNlID0gRkFfTlZSQU1fVlBEMV9BRERSOwogCX0KKwogCWhhLT5udnJhbV9zaXplID0gc2l6ZW9mKHN0cnVjdCBudnJhbV8yNHh4KTsKIAloYS0+dnBkX3NpemUgPSBGQV9OVlJBTV9WUERfU0laRTsKIApAQCAtNDg0Miw3ICs0OTcxLDcgQEAKIAkJbnYtPmV4Y2hhbmdlX2NvdW50ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigwKTsKIAkJbnYtPmhhcmRfYWRkcmVzcyA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMTI0KTsKIAkJbnYtPnBvcnRfbmFtZVswXSA9IDB4MjE7Ci0JCW52LT5wb3J0X25hbWVbMV0gPSAweDAwICsgaGEtPnBvcnRfbm87CisJCW52LT5wb3J0X25hbWVbMV0gPSAweDAwICsgaGEtPnBvcnRfbm8gKyAxOwogCQludi0+cG9ydF9uYW1lWzJdID0gMHgwMDsKIAkJbnYtPnBvcnRfbmFtZVszXSA9IDB4ZTA7CiAJCW52LT5wb3J0X25hbWVbNF0gPSAweDhiOwpAQCAtNTExNyw2ICs1MjQ2LDk5IEBACiAJCXNlZ21lbnRzLS07CiAJfQogCisJaWYgKCFJU19RTEEyN1hYKGhhKSkKKwkJcmV0dXJuIHJ2YWw7CisKKwlpZiAoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpCisJCXZmcmVlKGhhLT5md19kdW1wX3RlbXBsYXRlKTsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZSA9IE5VTEw7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGVfbGVuID0gMDsKKworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAxNjEsCisJICAgICJMb2FkaW5nIGZ3ZHVtcCB0ZW1wbGF0ZSBmcm9tICV4XG4iLCBmYWRkcik7CisJcWxhMjR4eF9yZWFkX2ZsYXNoX2RhdGEodmhhLCBkY29kZSwgZmFkZHIsIDcpOworCXJpc2Nfc2l6ZSA9IGJlMzJfdG9fY3B1KGRjb2RlWzJdKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMTYyLAorCSAgICAiLT4gYXJyYXkgc2l6ZSAleCBkd29yZHNcbiIsIHJpc2Nfc2l6ZSk7CisJaWYgKHJpc2Nfc2l6ZSA9PSAwIHx8IHJpc2Nfc2l6ZSA9PSB+MCkKKwkJZ290byBkZWZhdWx0X3RlbXBsYXRlOworCisJZGxlbiA9IChyaXNjX3NpemUgLSA4KSAqIHNpemVvZigqZGNvZGUpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAxNjMsCisJICAgICItPiB0ZW1wbGF0ZSBhbGxvY2F0aW5nICV4IGJ5dGVzLi4uXG4iLCBkbGVuKTsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZSA9IHZtYWxsb2MoZGxlbik7CisJaWYgKCFoYS0+ZndfZHVtcF90ZW1wbGF0ZSkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMTY0LAorCQkgICAgIkZhaWxlZCBmd2R1bXAgdGVtcGxhdGUgYWxsb2NhdGUgJXggYnl0ZXMuXG4iLCByaXNjX3NpemUpOworCQlnb3RvIGRlZmF1bHRfdGVtcGxhdGU7CisJfQorCisJZmFkZHIgKz0gNzsKKwlyaXNjX3NpemUgLT0gODsKKwlkY29kZSA9IGhhLT5md19kdW1wX3RlbXBsYXRlOworCXFsYTI0eHhfcmVhZF9mbGFzaF9kYXRhKHZoYSwgZGNvZGUsIGZhZGRyLCByaXNjX3NpemUpOworCWZvciAoaSA9IDA7IGkgPCByaXNjX3NpemU7IGkrKykKKwkJZGNvZGVbaV0gPSBsZTMyX3RvX2NwdShkY29kZVtpXSk7CisKKwlpZiAoIXFsYTI3eHhfZndkdF90ZW1wbGF0ZV92YWxpZChkY29kZSkpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDE2NSwKKwkJICAgICJGYWlsZWQgZndkdW1wIHRlbXBsYXRlIHZhbGlkYXRlXG4iKTsKKwkJZ290byBkZWZhdWx0X3RlbXBsYXRlOworCX0KKworCWRsZW4gPSBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfc2l6ZShkY29kZSk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDE2NiwKKwkgICAgIi0+IHRlbXBsYXRlIHNpemUgJXggYnl0ZXNcbiIsIGRsZW4pOworCWlmIChkbGVuID4gcmlzY19zaXplICogc2l6ZW9mKCpkY29kZSkpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDE2NywKKwkJICAgICJGYWlsZWQgZndkdW1wIHRlbXBsYXRlIGV4Y2VlZHMgYXJyYXkgYnkgJXggYnl0ZXNcbiIsCisJCSAgICAodWludDMyX3QpKGRsZW4gLSByaXNjX3NpemUgKiBzaXplb2YoKmRjb2RlKSkpOworCQlnb3RvIGRlZmF1bHRfdGVtcGxhdGU7CisJfQorCWhhLT5md19kdW1wX3RlbXBsYXRlX2xlbiA9IGRsZW47CisJcmV0dXJuIHJ2YWw7CisKK2RlZmF1bHRfdGVtcGxhdGU6CisJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDE2OCwgIlVzaW5nIGRlZmF1bHQgZndkdW1wIHRlbXBsYXRlXG4iKTsKKwlpZiAoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpCisJCXZmcmVlKGhhLT5md19kdW1wX3RlbXBsYXRlKTsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZSA9IE5VTEw7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGVfbGVuID0gMDsKKworCWRsZW4gPSBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfZGVmYXVsdF9zaXplKCk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDE2OSwKKwkgICAgIi0+IHRlbXBsYXRlIGFsbG9jYXRpbmcgJXggYnl0ZXMuLi5cbiIsIGRsZW4pOworCWhhLT5md19kdW1wX3RlbXBsYXRlID0gdm1hbGxvYyhkbGVuKTsKKwlpZiAoIWhhLT5md19kdW1wX3RlbXBsYXRlKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAxNmEsCisJCSAgICAiRmFpbGVkIGZ3ZHVtcCB0ZW1wbGF0ZSBhbGxvY2F0ZSAleCBieXRlcy5cbiIsIHJpc2Nfc2l6ZSk7CisJCWdvdG8gZmFpbGVkX3RlbXBsYXRlOworCX0KKworCWRjb2RlID0gaGEtPmZ3X2R1bXBfdGVtcGxhdGU7CisJcmlzY19zaXplID0gZGxlbiAvIHNpemVvZigqZGNvZGUpOworCW1lbWNweShkY29kZSwgcWxhMjd4eF9md2R0X3RlbXBsYXRlX2RlZmF1bHQoKSwgZGxlbik7CisJZm9yIChpID0gMDsgaSA8IHJpc2Nfc2l6ZTsgaSsrKQorCQlkY29kZVtpXSA9IGJlMzJfdG9fY3B1KGRjb2RlW2ldKTsKKworCWlmICghcWxhMjd4eF9md2R0X3RlbXBsYXRlX3ZhbGlkKGhhLT5md19kdW1wX3RlbXBsYXRlKSkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMTZiLAorCQkgICAgIkZhaWxlZCBmd2R1bXAgdGVtcGxhdGUgdmFsaWRhdGVcbiIpOworCQlnb3RvIGZhaWxlZF90ZW1wbGF0ZTsKKwl9CisKKwlkbGVuID0gcWxhMjd4eF9md2R0X3RlbXBsYXRlX3NpemUoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAxNmMsCisJICAgICItPiB0ZW1wbGF0ZSBzaXplICV4IGJ5dGVzXG4iLCBkbGVuKTsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZV9sZW4gPSBkbGVuOworCXJldHVybiBydmFsOworCitmYWlsZWRfdGVtcGxhdGU6CisJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDE2ZCwgIkZhaWxlZCBkZWZhdWx0IGZ3ZHVtcCB0ZW1wbGF0ZVxuIik7CisJaWYgKGhhLT5md19kdW1wX3RlbXBsYXRlKQorCQl2ZnJlZShoYS0+ZndfZHVtcF90ZW1wbGF0ZSk7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGUgPSBOVUxMOworCWhhLT5md19kdW1wX3RlbXBsYXRlX2xlbiA9IDA7CiAJcmV0dXJuIHJ2YWw7CiB9CiAKQEAgLTUyMzEsNyArNTQ1Myw4IEBACiAJdWludDMyX3QgcmlzY19zaXplOwogCXVpbnQzMl90IGk7CiAJc3RydWN0IGZ3X2Jsb2IgKmJsb2I7Ci0JdWludDMyX3QgKmZ3Y29kZSwgZndjbGVuOworCWNvbnN0IHVpbnQzMl90ICpmd2NvZGU7CisJdWludDMyX3QgZndjbGVuOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCByZXFfcXVlICpyZXEgPSBoYS0+cmVxX3FfbWFwWzBdOwogCkBAIC01MjYzLDcgKzU0ODYsNyBAQAogCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA5MywKIAkJICAgICJVbmFibGUgdG8gdmVyaWZ5IGludGVncml0eSBvZiBmaXJtd2FyZSBpbWFnZSAoJVpkKS5cbiIsCiAJCSAgICBibG9iLT5mdy0+c2l6ZSk7Ci0JCWdvdG8gZmFpbF9md19pbnRlZ3JpdHk7CisJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQlkY29kZVtpXSA9IGJlMzJfdG9fY3B1KGZ3Y29kZVtpICsgNF0pOwpAQCAtNTI3Nyw3ICs1NTAwLDcgQEAKIAkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwOTUsCiAJCSAgICAiRmlybXdhcmUgZGF0YTogJTA4eCAlMDh4ICUwOHggJTA4eC5cbiIsCiAJCSAgICBkY29kZVswXSwgZGNvZGVbMV0sIGRjb2RlWzJdLCBkY29kZVszXSk7Ci0JCWdvdG8gZmFpbF9md19pbnRlZ3JpdHk7CisJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0KIAogCXdoaWxlIChzZWdtZW50cyAmJiBydmFsID09IFFMQV9TVUNDRVNTKSB7CkBAIC01MjkxLDggKzU1MTQsNyBAQAogCQkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwOTYsCiAJCQkgICAgIlVuYWJsZSB0byB2ZXJpZnkgaW50ZWdyaXR5IG9mIGZpcm13YXJlIGltYWdlICIKIAkJCSAgICAiKCVaZCkuXG4iLCBibG9iLT5mdy0+c2l6ZSk7Ci0KLQkJCWdvdG8gZmFpbF9md19pbnRlZ3JpdHk7CisJCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJfQogCiAJCWZyYWdtZW50ID0gMDsKQEAgLTUzMjYsMTAgKzU1NDgsMTAwIEBACiAJCS8qIE5leHQgc2VnbWVudC4gKi8KIAkJc2VnbWVudHMtLTsKIAl9CisKKwlpZiAoIUlTX1FMQTI3WFgoaGEpKQorCQlyZXR1cm4gcnZhbDsKKworCWlmIChoYS0+ZndfZHVtcF90ZW1wbGF0ZSkKKwkJdmZyZWUoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpOworCWhhLT5md19kdW1wX3RlbXBsYXRlID0gTlVMTDsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZV9sZW4gPSAwOworCisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MTcxLAorCSAgICAiTG9hZGluZyBmd2R1bXAgdGVtcGxhdGUgZnJvbSAleFxuIiwKKwkgICAgKHVpbnQzMl90KSgodm9pZCAqKWZ3Y29kZSAtICh2b2lkICopYmxvYi0+ZnctPmRhdGEpKTsKKwlyaXNjX3NpemUgPSBiZTMyX3RvX2NwdShmd2NvZGVbMl0pOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDE3MiwKKwkgICAgIi0+IGFycmF5IHNpemUgJXggZHdvcmRzXG4iLCByaXNjX3NpemUpOworCWlmIChyaXNjX3NpemUgPT0gMCB8fCByaXNjX3NpemUgPT0gfjApCisJCWdvdG8gZGVmYXVsdF90ZW1wbGF0ZTsKKworCWRsZW4gPSAocmlzY19zaXplIC0gOCkgKiBzaXplb2YoKmZ3Y29kZSk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDE3MywKKwkgICAgIi0+IHRlbXBsYXRlIGFsbG9jYXRpbmcgJXggYnl0ZXMuLi5cbiIsIGRsZW4pOworCWhhLT5md19kdW1wX3RlbXBsYXRlID0gdm1hbGxvYyhkbGVuKTsKKwlpZiAoIWhhLT5md19kdW1wX3RlbXBsYXRlKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAxNzQsCisJCSAgICAiRmFpbGVkIGZ3ZHVtcCB0ZW1wbGF0ZSBhbGxvY2F0ZSAleCBieXRlcy5cbiIsIHJpc2Nfc2l6ZSk7CisJCWdvdG8gZGVmYXVsdF90ZW1wbGF0ZTsKKwl9CisKKwlmd2NvZGUgKz0gNzsKKwlyaXNjX3NpemUgLT0gODsKKwlkY29kZSA9IGhhLT5md19kdW1wX3RlbXBsYXRlOworCWZvciAoaSA9IDA7IGkgPCByaXNjX3NpemU7IGkrKykKKwkJZGNvZGVbaV0gPSBsZTMyX3RvX2NwdShmd2NvZGVbaV0pOworCisJaWYgKCFxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfdmFsaWQoZGNvZGUpKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAxNzUsCisJCSAgICAiRmFpbGVkIGZ3ZHVtcCB0ZW1wbGF0ZSB2YWxpZGF0ZVxuIik7CisJCWdvdG8gZGVmYXVsdF90ZW1wbGF0ZTsKKwl9CisKKwlkbGVuID0gcWxhMjd4eF9md2R0X3RlbXBsYXRlX3NpemUoZGNvZGUpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAxNzYsCisJICAgICItPiB0ZW1wbGF0ZSBzaXplICV4IGJ5dGVzXG4iLCBkbGVuKTsKKwlpZiAoZGxlbiA+IHJpc2Nfc2l6ZSAqIHNpemVvZigqZndjb2RlKSkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMTc3LAorCQkgICAgIkZhaWxlZCBmd2R1bXAgdGVtcGxhdGUgZXhjZWVkcyBhcnJheSBieSAleCBieXRlc1xuIiwKKwkJICAgICh1aW50MzJfdCkoZGxlbiAtIHJpc2Nfc2l6ZSAqIHNpemVvZigqZndjb2RlKSkpOworCQlnb3RvIGRlZmF1bHRfdGVtcGxhdGU7CisJfQorCWhhLT5md19kdW1wX3RlbXBsYXRlX2xlbiA9IGRsZW47CiAJcmV0dXJuIHJ2YWw7CiAKLWZhaWxfZndfaW50ZWdyaXR5OgotCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOworZGVmYXVsdF90ZW1wbGF0ZToKKwlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMTc4LCAiVXNpbmcgZGVmYXVsdCBmd2R1bXAgdGVtcGxhdGVcbiIpOworCWlmIChoYS0+ZndfZHVtcF90ZW1wbGF0ZSkKKwkJdmZyZWUoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpOworCWhhLT5md19kdW1wX3RlbXBsYXRlID0gTlVMTDsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZV9sZW4gPSAwOworCisJZGxlbiA9IHFsYTI3eHhfZndkdF90ZW1wbGF0ZV9kZWZhdWx0X3NpemUoKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMTc5LAorCSAgICAiLT4gdGVtcGxhdGUgYWxsb2NhdGluZyAleCBieXRlcy4uLlxuIiwgZGxlbik7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGUgPSB2bWFsbG9jKGRsZW4pOworCWlmICghaGEtPmZ3X2R1bXBfdGVtcGxhdGUpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDE3YSwKKwkJICAgICJGYWlsZWQgZndkdW1wIHRlbXBsYXRlIGFsbG9jYXRlICV4IGJ5dGVzLlxuIiwgcmlzY19zaXplKTsKKwkJZ290byBmYWlsZWRfdGVtcGxhdGU7CisJfQorCisJZGNvZGUgPSBoYS0+ZndfZHVtcF90ZW1wbGF0ZTsKKwlyaXNjX3NpemUgPSBkbGVuIC8gc2l6ZW9mKCpmd2NvZGUpOworCWZ3Y29kZSA9IHFsYTI3eHhfZndkdF90ZW1wbGF0ZV9kZWZhdWx0KCk7CisJZm9yIChpID0gMDsgaSA8IHJpc2Nfc2l6ZTsgaSsrKQorCQlkY29kZVtpXSA9IGJlMzJfdG9fY3B1KGZ3Y29kZVtpXSk7CisKKwlpZiAoIXFsYTI3eHhfZndkdF90ZW1wbGF0ZV92YWxpZChoYS0+ZndfZHVtcF90ZW1wbGF0ZSkpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDE3YiwKKwkJICAgICJGYWlsZWQgZndkdW1wIHRlbXBsYXRlIHZhbGlkYXRlXG4iKTsKKwkJZ290byBmYWlsZWRfdGVtcGxhdGU7CisJfQorCisJZGxlbiA9IHFsYTI3eHhfZndkdF90ZW1wbGF0ZV9zaXplKGhhLT5md19kdW1wX3RlbXBsYXRlKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMTdjLAorCSAgICAiLT4gdGVtcGxhdGUgc2l6ZSAleCBieXRlc1xuIiwgZGxlbik7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGVfbGVuID0gZGxlbjsKKwlyZXR1cm4gcnZhbDsKKworZmFpbGVkX3RlbXBsYXRlOgorCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAxN2QsICJGYWlsZWQgZGVmYXVsdCBmd2R1bXAgdGVtcGxhdGVcbiIpOworCWlmIChoYS0+ZndfZHVtcF90ZW1wbGF0ZSkKKwkJdmZyZWUoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpOworCWhhLT5md19kdW1wX3RlbXBsYXRlID0gTlVMTDsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZV9sZW4gPSAwOworCXJldHVybiBydmFsOwogfQogCiBpbnQKQEAgLTU2MDUsNyArNTkxNyw3IEBACiAJCW52LT5leGVjdXRpb25fdGhyb3R0bGUgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4RkZGRik7CiAJCW52LT5leGNoYW5nZV9jb3VudCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7CiAJCW52LT5wb3J0X25hbWVbMF0gPSAweDIxOwotCQludi0+cG9ydF9uYW1lWzFdID0gMHgwMCArIGhhLT5wb3J0X25vOworCQludi0+cG9ydF9uYW1lWzFdID0gMHgwMCArIGhhLT5wb3J0X25vICsgMTsKIAkJbnYtPnBvcnRfbmFtZVsyXSA9IDB4MDA7CiAJCW52LT5wb3J0X25hbWVbM10gPSAweGUwOwogCQludi0+cG9ydF9uYW1lWzRdID0gMHg4YjsKQEAgLTU2MzksNyArNTk1MSw3IEBACiAJCW52LT5lbm9kZV9tYWNbMl0gPSAweEREOwogCQludi0+ZW5vZGVfbWFjWzNdID0gMHgwNDsKIAkJbnYtPmVub2RlX21hY1s0XSA9IDB4MDU7Ci0JCW52LT5lbm9kZV9tYWNbNV0gPSAweDA2ICsgaGEtPnBvcnRfbm87CisJCW52LT5lbm9kZV9tYWNbNV0gPSAweDA2ICsgaGEtPnBvcnRfbm8gKyAxOwogCiAJCXJ2YWwgPSAxOwogCX0KQEAgLTU2NzcsNyArNTk4OSw3IEBACiAJCWljYi0+ZW5vZGVfbWFjWzJdID0gMHhERDsKIAkJaWNiLT5lbm9kZV9tYWNbM10gPSAweDA0OwogCQlpY2ItPmVub2RlX21hY1s0XSA9IDB4MDU7Ci0JCWljYi0+ZW5vZGVfbWFjWzVdID0gMHgwNiArIGhhLT5wb3J0X25vOworCQlpY2ItPmVub2RlX21hY1s1XSA9IDB4MDYgKyBoYS0+cG9ydF9ubyArIDE7CiAJfQogCiAJLyogVXNlIGV4dGVuZGVkLWluaXRpYWxpemF0aW9uIGNvbnRyb2wgYmxvY2suICovCkBAIC01NzgwLDcgKzYwOTIsNyBAQAogCQloYS0+bG9naW5fcmV0cnlfY291bnQgPSBxbDJ4bG9naW5yZXRyeWNvdW50OwogCiAJLyogaWYgbm90IHJ1bm5pbmcgTVNJLVggd2UgbmVlZCBoYW5kc2hha2luZyBvbiBpbnRlcnJ1cHRzICovCi0JaWYgKCF2aGEtPmh3LT5mbGFncy5tc2l4X2VuYWJsZWQgJiYgSVNfUUxBODNYWChoYSkpCisJaWYgKCF2aGEtPmh3LT5mbGFncy5tc2l4X2VuYWJsZWQgJiYgKElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKSkKIAkJaWNiLT5maXJtd2FyZV9vcHRpb25zXzIgfD0gX19jb25zdGFudF9jcHVfdG9fbGUzMihCSVRfMjIpOwogCiAJLyogRW5hYmxlIFpJTy4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jCmluZGV4IDQ2YjkzMDcuLmU2MDc1NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYwpAQCAtNDg4LDcgKzQ4OCw3IEBACiAJCQlyZXEtPnJpbmdfcHRyKys7CiAKIAkJLyogU2V0IGNoaXAgbmV3IHJpbmcgaW5kZXguICovCi0JCWlmIChoYS0+bXFlbmFibGUgfHwgSVNfUUxBODNYWChoYSkpIHsKKwkJaWYgKGhhLT5tcWVuYWJsZSB8fCBJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkgewogCQkJV1JUX1JFR19EV09SRChyZXEtPnJlcV9xX2luLCByZXEtPnJpbmdfaW5kZXgpOwogCQkJUkRfUkVHX0RXT1JEX1JFTEFYRUQoJmhhLT5pb2Jhc2UtPmlzcDI0LmhjY3IpOwogCQl9IGVsc2UgaWYgKElTX1FMQUZYMDAoaGEpKSB7CkBAIC01MjQsNyArNTI0LDYgQEAKIHsKIAltcmtfZW50cnlfdCAqbXJrOwogCXN0cnVjdCBtcmtfZW50cnlfMjR4eCAqbXJrMjQgPSBOVUxMOwotCXN0cnVjdCBtcmtfZW50cnlfZngwMCAqbXJrZnggPSBOVUxMOwogCiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc2NzaV9xbGFfaG9zdF90ICpiYXNlX3ZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CkBAIC01NDEsMTUgKzU0MCw3IEBACiAJbXJrLT5lbnRyeV90eXBlID0gTUFSS0VSX1RZUEU7CiAJbXJrLT5tb2RpZmllciA9IHR5cGU7CiAJaWYgKHR5cGUgIT0gTUtfU1lOQ19BTEwpIHsKLQkJaWYgKElTX1FMQUZYMDAoaGEpKSB7Ci0JCQltcmtmeCA9IChzdHJ1Y3QgbXJrX2VudHJ5X2Z4MDAgKikgbXJrOwotCQkJbXJrZngtPmhhbmRsZSA9IE1BS0VfSEFORExFKHJlcS0+aWQsIG1ya2Z4LT5oYW5kbGUpOwotCQkJbXJrZngtPmhhbmRsZV9oaSA9IDA7Ci0JCQltcmtmeC0+dGd0X2lkID0gY3B1X3RvX2xlMTYobG9vcF9pZCk7Ci0JCQltcmtmeC0+bHVuWzFdID0gTFNCKGx1bik7Ci0JCQltcmtmeC0+bHVuWzJdID0gTVNCKGx1bik7Ci0JCQlob3N0X3RvX2ZjcF9zd2FwKG1ya2Z4LT5sdW4sIHNpemVvZihtcmtmeC0+bHVuKSk7Ci0JCX0gZWxzZSBpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkgeworCQlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkgewogCQkJbXJrMjQgPSAoc3RydWN0IG1ya19lbnRyeV8yNHh4ICopIG1yazsKIAkJCW1yazI0LT5ucG9ydF9oYW5kbGUgPSBjcHVfdG9fbGUxNihsb29wX2lkKTsKIAkJCW1yazI0LT5sdW5bMV0gPSBMU0IobHVuKTsKQEAgLTE4MjMsNyArMTgxNCw3IEBACiAKIAkvKiBDaGVjayBmb3Igcm9vbSBpbiBvdXRzdGFuZGluZyBjb21tYW5kIGxpc3QuICovCiAJaGFuZGxlID0gcmVxLT5jdXJyZW50X291dHN0YW5kaW5nX2NtZDsKLQlmb3IgKGluZGV4ID0gMTsgcmVxLT5udW1fb3V0c3RhbmRpbmdfY21kczsgaW5kZXgrKykgeworCWZvciAoaW5kZXggPSAxOyBpbmRleCA8IHJlcS0+bnVtX291dHN0YW5kaW5nX2NtZHM7IGluZGV4KyspIHsKIAkJaGFuZGxlKys7CiAJCWlmIChoYW5kbGUgPT0gcmVxLT5udW1fb3V0c3RhbmRpbmdfY21kcykKIAkJCWhhbmRsZSA9IDE7CkBAIC0xODQ4LDcgKzE4MzksNyBAQAogc2tpcF9jbWRfYXJyYXk6CiAJLyogQ2hlY2sgZm9yIHJvb20gb24gcmVxdWVzdCBxdWV1ZS4gKi8KIAlpZiAocmVxLT5jbnQgPCByZXFfY250KSB7Ci0JCWlmIChoYS0+bXFlbmFibGUgfHwgSVNfUUxBODNYWChoYSkpCisJCWlmIChoYS0+bXFlbmFibGUgfHwgSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpCiAJCQljbnQgPSBSRF9SRUdfRFdPUkQoJnJlZy0+aXNwMjVtcS5yZXFfcV9vdXQpOwogCQllbHNlIGlmIChJU19QM1BfVFlQRShoYSkpCiAJCQljbnQgPSBSRF9SRUdfRFdPUkQoJnJlZy0+aXNwODIucmVxX3Ffb3V0KTsKQEAgLTI1OTQsNiArMjU4NSwyOSBAQAogCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogfQogCit2b2lkCitxbGEyNHh4X2Fib3J0X2lvY2Ioc3JiX3QgKnNwLCBzdHJ1Y3QgYWJvcnRfZW50cnlfMjR4eCAqYWJ0X2lvY2IpCit7CisJc3RydWN0IHNyYl9pb2NiICphaW8gPSAmc3AtPnUuaW9jYl9jbWQ7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBzcC0+ZmNwb3J0LT52aGE7CisJc3RydWN0IHJlcV9xdWUgKnJlcSA9IHZoYS0+cmVxOworCisJbWVtc2V0KGFidF9pb2NiLCAwLCBzaXplb2Yoc3RydWN0IGFib3J0X2VudHJ5XzI0eHgpKTsKKwlhYnRfaW9jYi0+ZW50cnlfdHlwZSA9IEFCT1JUX0lPQ0JfVFlQRTsKKwlhYnRfaW9jYi0+ZW50cnlfY291bnQgPSAxOworCWFidF9pb2NiLT5oYW5kbGUgPSBjcHVfdG9fbGUzMihNQUtFX0hBTkRMRShyZXEtPmlkLCBzcC0+aGFuZGxlKSk7CisJYWJ0X2lvY2ItPm5wb3J0X2hhbmRsZSA9IGNwdV90b19sZTE2KHNwLT5mY3BvcnQtPmxvb3BfaWQpOworCWFidF9pb2NiLT5oYW5kbGVfdG9fYWJvcnQgPQorCSAgICBjcHVfdG9fbGUzMihNQUtFX0hBTkRMRShyZXEtPmlkLCBhaW8tPnUuYWJ0LmNtZF9obmRsKSk7CisJYWJ0X2lvY2ItPnBvcnRfaWRbMF0gPSBzcC0+ZmNwb3J0LT5kX2lkLmIuYWxfcGE7CisJYWJ0X2lvY2ItPnBvcnRfaWRbMV0gPSBzcC0+ZmNwb3J0LT5kX2lkLmIuYXJlYTsKKwlhYnRfaW9jYi0+cG9ydF9pZFsyXSA9IHNwLT5mY3BvcnQtPmRfaWQuYi5kb21haW47CisJYWJ0X2lvY2ItPnZwX2luZGV4ID0gdmhhLT52cF9pZHg7CisJYWJ0X2lvY2ItPnJlcV9xdWVfbm8gPSBjcHVfdG9fbGUxNihyZXEtPmlkKTsKKwkvKiBTZW5kIHRoZSBjb21tYW5kIHRvIHRoZSBmaXJtd2FyZSAqLworCXdtYigpOworfQorCiBpbnQKIHFsYTJ4MDBfc3RhcnRfc3Aoc3JiX3QgKnNwKQogewpAQCAtMjY0Nyw3ICsyNjYxLDkgQEAKIAkJcWxhZngwMF9meGRpc2NfaW9jYihzcCwgcGt0KTsKIAkJYnJlYWs7CiAJY2FzZSBTUkJfQUJUX0NNRDoKLQkJcWxhZngwMF9hYm9ydF9pb2NiKHNwLCBwa3QpOworCQlJU19RTEFGWDAwKGhhKSA/CisJCQlxbGFmeDAwX2Fib3J0X2lvY2Ioc3AsIHBrdCkgOgorCQkJcWxhMjR4eF9hYm9ydF9pb2NiKHNwLCBwa3QpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwppbmRleCAwYTFkY2I0Li45NTMxNGVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCkBAIC0zNTYsMTUgKzM1NiwxNiBAQAogY29uc3QgY2hhciAqCiBxbGEyeDAwX2dldF9saW5rX3NwZWVkX3N0cihzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1aW50MTZfdCBzcGVlZCkKIHsKLQlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxpbmtfc3BlZWRzW10gPSB7Ci0JCSIxIiwgIjIiLCAiPyIsICI0IiwgIjgiLCAiMTYiLCAiMTAiCisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGxpbmtfc3BlZWRzW10gPSB7CisJCSIxIiwgIjIiLCAiPyIsICI0IiwgIjgiLCAiMTYiLCAiMzIiLCAiMTAiCiAJfTsKKyNkZWZpbmUJUUxBX0xBU1RfU1BFRUQJNwogCiAJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKQogCQlyZXR1cm4gbGlua19zcGVlZHNbMF07CiAJZWxzZSBpZiAoc3BlZWQgPT0gMHgxMykKLQkJcmV0dXJuIGxpbmtfc3BlZWRzWzZdOwotCWVsc2UgaWYgKHNwZWVkIDwgNikKKwkJcmV0dXJuIGxpbmtfc3BlZWRzW1FMQV9MQVNUX1NQRUVEXTsKKwllbHNlIGlmIChzcGVlZCA8IFFMQV9MQVNUX1NQRUVEKQogCQlyZXR1cm4gbGlua19zcGVlZHNbc3BlZWRdOwogCWVsc2UKIAkJcmV0dXJuIGxpbmtfc3BlZWRzW0xTX1VOS05PV05dOwpAQCAtNjQ5LDcgKzY1MCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBNQkFfU1lTVEVNX0VSUjoJCS8qIFN5c3RlbSBFcnJvciAqLwotCQltYnggPSAoSVNfUUxBODFYWChoYSkgfHwgSVNfUUxBODNYWChoYSkpID8KKwkJbWJ4ID0gKElTX1FMQTgxWFgoaGEpIHx8IElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKSA/CiAJCQlSRF9SRUdfV09SRCgmcmVnMjQtPm1haWxib3g3KSA6IDA7CiAJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwMDMsCiAJCSAgICAiSVNQIFN5c3RlbSBFcnJvciAtIG1ieDE9JXhoIG1ieDI9JXhoIG1ieDM9JXhoICIKQEAgLTY2Niw3ICs2NjcsNyBAQAogCQkJCXZoYS0+ZGV2aWNlX2ZsYWdzIHw9IERGTEdfREVWX0ZBSUxFRDsKIAkJCX0gZWxzZSB7CiAJCQkJLyogQ2hlY2sgdG8gc2VlIGlmIE1QSSB0aW1lb3V0IG9jY3VycmVkICovCi0JCQkJaWYgKChtYnggJiBNQlhfMykgJiYgKGhhLT5mbGFncy5wb3J0MCkpCisJCQkJaWYgKChtYnggJiBNQlhfMykgJiYgKGhhLT5wb3J0X25vID09IDApKQogCQkJCQlzZXRfYml0KE1QSV9SRVNFVF9ORUVERUQsCiAJCQkJCSAgICAmdmhhLT5kcGNfZmxhZ3MpOwogCkBAIC0xNDk3LDggKzE0OTgsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotcWxhMjR4eF90bV9pb2NiX2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBzdHJ1Y3QgcmVxX3F1ZSAqcmVxLAotICAgIHN0cnVjdCB0c2tfbWdtdF9lbnRyeSAqdHNrKQorcWxhMjR4eF90bV9pb2NiX2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBzdHJ1Y3QgcmVxX3F1ZSAqcmVxLCB2b2lkICp0c2spCiB7CiAJY29uc3QgY2hhciBmdW5jW10gPSAiVE1GLUlPQ0IiOwogCWNvbnN0IGNoYXIgKnR5cGU7CkBAIC0xNTA2LDcgKzE1MDYsNiBAQAogCXNyYl90ICpzcDsKIAlzdHJ1Y3Qgc3JiX2lvY2IgKmlvY2I7CiAJc3RydWN0IHN0c19lbnRyeV8yNHh4ICpzdHMgPSAoc3RydWN0IHN0c19lbnRyeV8yNHh4ICopdHNrOwotCWludCBlcnJvciA9IDE7CiAKIAlzcCA9IHFsYTJ4MDBfZ2V0X3NwX2Zyb21faGFuZGxlKHZoYSwgZnVuYywgcmVxLCB0c2spOwogCWlmICghc3ApCkBAIC0xNTE1LDM3ICsxNTE0LDM1IEBACiAJaW9jYiA9ICZzcC0+dS5pb2NiX2NtZDsKIAl0eXBlID0gc3AtPm5hbWU7CiAJZmNwb3J0ID0gc3AtPmZjcG9ydDsKKwlpb2NiLT51LnRtZi5kYXRhID0gUUxBX1NVQ0NFU1M7CiAKIAlpZiAoc3RzLT5lbnRyeV9zdGF0dXMpIHsKIAkJcWxfbG9nKHFsX2xvZ193YXJuLCBmY3BvcnQtPnZoYSwgMHg1MDM4LAogCQkgICAgIkFzeW5jLSVzIGVycm9yIC0gaGRsPSV4IGVudHJ5LXN0YXR1cygleCkuXG4iLAogCQkgICAgdHlwZSwgc3AtPmhhbmRsZSwgc3RzLT5lbnRyeV9zdGF0dXMpOworCQlpb2NiLT51LnRtZi5kYXRhID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgaWYgKHN0cy0+Y29tcF9zdGF0dXMgIT0gX19jb25zdGFudF9jcHVfdG9fbGUxNihDU19DT01QTEVURSkpIHsKIAkJcWxfbG9nKHFsX2xvZ193YXJuLCBmY3BvcnQtPnZoYSwgMHg1MDM5LAogCQkgICAgIkFzeW5jLSVzIGVycm9yIC0gaGRsPSV4IGNvbXBsZXRpb24gc3RhdHVzKCV4KS5cbiIsCiAJCSAgICB0eXBlLCBzcC0+aGFuZGxlLCBzdHMtPmNvbXBfc3RhdHVzKTsKLQl9IGVsc2UgaWYgKCEobGUxNl90b19jcHUoc3RzLT5zY3NpX3N0YXR1cykgJgorCQlpb2NiLT51LnRtZi5kYXRhID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9IGVsc2UgaWYgKChsZTE2X3RvX2NwdShzdHMtPnNjc2lfc3RhdHVzKSAmCiAJICAgIFNTX1JFU1BPTlNFX0lORk9fTEVOX1ZBTElEKSkgewotCQlxbF9sb2cocWxfbG9nX3dhcm4sIGZjcG9ydC0+dmhhLCAweDUwM2EsCi0JCSAgICAiQXN5bmMtJXMgZXJyb3IgLSBoZGw9JXggbm8gcmVzcG9uc2UgaW5mbygleCkuXG4iLAotCQkgICAgdHlwZSwgc3AtPmhhbmRsZSwgc3RzLT5zY3NpX3N0YXR1cyk7Ci0JfSBlbHNlIGlmIChsZTMyX3RvX2NwdShzdHMtPnJzcF9kYXRhX2xlbikgPCA0KSB7Ci0JCXFsX2xvZyhxbF9sb2dfd2FybiwgZmNwb3J0LT52aGEsIDB4NTAzYiwKLQkJICAgICJBc3luYy0lcyBlcnJvciAtIGhkbD0leCBub3QgZW5vdWdoIHJlc3BvbnNlKCVkKS5cbiIsCi0JCSAgICB0eXBlLCBzcC0+aGFuZGxlLCBzdHMtPnJzcF9kYXRhX2xlbik7Ci0JfSBlbHNlIGlmIChzdHMtPmRhdGFbM10pIHsKLQkJcWxfbG9nKHFsX2xvZ193YXJuLCBmY3BvcnQtPnZoYSwgMHg1MDNjLAotCQkgICAgIkFzeW5jLSVzIGVycm9yIC0gaGRsPSV4IHJlc3BvbnNlKCV4KS5cbiIsCi0JCSAgICB0eXBlLCBzcC0+aGFuZGxlLCBzdHMtPmRhdGFbM10pOwotCX0gZWxzZSB7Ci0JCWVycm9yID0gMDsKKwkJaWYgKGxlMzJfdG9fY3B1KHN0cy0+cnNwX2RhdGFfbGVuKSA8IDQpIHsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgZmNwb3J0LT52aGEsIDB4NTAzYiwKKwkJCSAgICAiQXN5bmMtJXMgZXJyb3IgLSBoZGw9JXggbm90IGVub3VnaCByZXNwb25zZSglZCkuXG4iLAorCQkJICAgIHR5cGUsIHNwLT5oYW5kbGUsIHN0cy0+cnNwX2RhdGFfbGVuKTsKKwkJfSBlbHNlIGlmIChzdHMtPmRhdGFbM10pIHsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgZmNwb3J0LT52aGEsIDB4NTAzYywKKwkJCSAgICAiQXN5bmMtJXMgZXJyb3IgLSBoZGw9JXggcmVzcG9uc2UoJXgpLlxuIiwKKwkJCSAgICB0eXBlLCBzcC0+aGFuZGxlLCBzdHMtPmRhdGFbM10pOworCQlpb2NiLT51LnRtZi5kYXRhID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJfQogCX0KIAotCWlmIChlcnJvcikgewotCQlpb2NiLT51LnRtZi5kYXRhID0gZXJyb3I7CisJaWYgKGlvY2ItPnUudG1mLmRhdGEgIT0gUUxBX1NVQ0NFU1MpCiAJCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19hc3luYyArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHg1MDU1LAogCQkgICAgKHVpbnQ4X3QgKilzdHMsIHNpemVvZigqc3RzKSk7Ci0JfQogCiAJc3AtPmRvbmUodmhhLCBzcCwgMCk7CiB9CkBAIC0yMDI1LDYgKzIwMjIsMTIgQEAKIAkJcmV0dXJuOwogCX0KIAorCS8qIFRhc2sgTWFuYWdlbWVudCBjb21wbGV0aW9uLiAqLworCWlmIChzcC0+dHlwZSA9PSBTUkJfVE1fQ01EKSB7CisJCXFsYTI0eHhfdG1faW9jYl9lbnRyeSh2aGEsIHJlcSwgcGt0KTsKKwkJcmV0dXJuOworCX0KKwogCS8qIEZhc3QgcGF0aCBjb21wbGV0aW9uLiAqLwogCWlmIChjb21wX3N0YXR1cyA9PSBDU19DT01QTEVURSAmJiBzY3NpX3N0YXR1cyA9PSAwKSB7CiAJCXFsYTJ4MDBfcHJvY2Vzc19jb21wbGV0ZWRfcmVxdWVzdCh2aGEsIHJlcSwgaGFuZGxlKTsKQEAgLTI0MjUsNiArMjQyOCwyMyBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQKK3FsYTI0eHhfYWJvcnRfaW9jYl9lbnRyeShzY3NpX3FsYV9ob3N0X3QgKnZoYSwgc3RydWN0IHJlcV9xdWUgKnJlcSwKKwlzdHJ1Y3QgYWJvcnRfZW50cnlfMjR4eCAqcGt0KQoreworCWNvbnN0IGNoYXIgZnVuY1tdID0gIkFCVF9JT0NCIjsKKwlzcmJfdCAqc3A7CisJc3RydWN0IHNyYl9pb2NiICphYnQ7CisKKwlzcCA9IHFsYTJ4MDBfZ2V0X3NwX2Zyb21faGFuZGxlKHZoYSwgZnVuYywgcmVxLCBwa3QpOworCWlmICghc3ApCisJCXJldHVybjsKKworCWFidCA9ICZzcC0+dS5pb2NiX2NtZDsKKwlhYnQtPnUuYWJ0LmNvbXBfc3RhdHVzID0gbGUzMl90b19jcHUocGt0LT5ucG9ydF9oYW5kbGUpOworCXNwLT5kb25lKHZoYSwgc3AsIDApOworfQorCiAvKioKICAqIHFsYTI0eHhfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZSgpIC0gUHJvY2VzcyByZXNwb25zZSBxdWV1ZSBlbnRyaWVzLgogICogQGhhOiBTQ1NJIGRyaXZlciBIQSBjb250ZXh0CkBAIC0yNDc0LDEwICsyNDk0LDYgQEAKIAkJCXFsYTI0eHhfbG9naW9fZW50cnkodmhhLCByc3AtPnJlcSwKIAkJCSAgICAoc3RydWN0IGxvZ2lvX2VudHJ5XzI0eHggKilwa3QpOwogCQkJYnJlYWs7Ci0JCWNhc2UgVFNLX01HTVRfSU9DQl9UWVBFOgotCQkJcWxhMjR4eF90bV9pb2NiX2VudHJ5KHZoYSwgcnNwLT5yZXEsCi0JCQkgICAgKHN0cnVjdCB0c2tfbWdtdF9lbnRyeSAqKXBrdCk7Ci0JCQlicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIENUX0lPQ0JfVFlQRToKIAkJCXFsYTI0eHhfZWxzX2N0X2VudHJ5KHZoYSwgcnNwLT5yZXEsIHBrdCwgQ1RfSU9DQl9UWVBFKTsKIAkJCWJyZWFrOwpAQCAtMjQ5Nyw2ICsyNTEzLDEwIEBACiAJCQkgKiBmcm9tIGZhbGxpbmcgaW50byBkZWZhdWx0IGNhc2UKIAkJCSAqLwogCQkJYnJlYWs7CisJCWNhc2UgQUJPUlRfSU9DQl9UWVBFOgorCQkJcWxhMjR4eF9hYm9ydF9pb2NiX2VudHJ5KHZoYSwgcnNwLT5yZXEsCisJCQkgICAgKHN0cnVjdCBhYm9ydF9lbnRyeV8yNHh4ICopcGt0KTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJLyogVHlwZSBOb3QgU3VwcG9ydGVkLiAqLwogCQkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwNDIsCkBAIC0yNTI1LDcgKzI1NDUsOCBAQAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDI0OwogCi0JaWYgKCFJU19RTEEyNVhYKGhhKSAmJiAhSVNfUUxBODFYWChoYSkgJiYgIUlTX1FMQTgzWFgoaGEpKQorCWlmICghSVNfUUxBMjVYWChoYSkgJiYgIUlTX1FMQTgxWFgoaGEpICYmICFJU19RTEE4M1hYKGhhKSAmJgorCSAgICAhSVNfUUxBMjdYWChoYSkpCiAJCXJldHVybjsKIAogCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKQEAgLTI5NzksNyArMzAwMCw3IEBACiAJfQogCiAJLyogRW5hYmxlIE1TSS1YIHZlY3RvciBmb3IgcmVzcG9uc2UgcXVldWUgdXBkYXRlIGZvciBxdWV1ZSAwICovCi0JaWYgKElTX1FMQTgzWFgoaGEpKSB7CisJaWYgKElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKSB7CiAJCWlmIChoYS0+bXNpeGJhc2UgJiYgaGEtPm1xaW9iYXNlICYmCiAJCSAgICAoaGEtPm1heF9yc3BfcXVldWVzID4gMSB8fCBoYS0+bWF4X3JlcV9xdWV1ZXMgPiAxKSkKIAkJCWhhLT5tcWVuYWJsZSA9IDE7CkBAIC0zMDAzLDEyICszMDI0LDEzIEBACiBxbGEyeDAwX3JlcXVlc3RfaXJxcyhzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCBzdHJ1Y3QgcnNwX3F1ZSAqcnNwKQogewogCWludCByZXQgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwotCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCWRldmljZV9yZWdfdCAqcmVnID0gaGEtPmlvYmFzZTsKIAlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKIAkvKiBJZiBwb3NzaWJsZSwgZW5hYmxlIE1TSS1YLiAqLwogCWlmICghSVNfUUxBMjQzMihoYSkgJiYgIUlTX1FMQTI1MzIoaGEpICYmICFJU19RTEE4NDMyKGhhKSAmJgotCQkhSVNfQ05BX0NBUEFCTEUoaGEpICYmICFJU19RTEEyMDMxKGhhKSAmJiAhSVNfUUxBRlgwMChoYSkpCisJICAgICFJU19DTkFfQ0FQQUJMRShoYSkgJiYgIUlTX1FMQTIwMzEoaGEpICYmICFJU19RTEFGWDAwKGhhKSAmJgorCSAgICAhSVNfUUxBMjdYWChoYSkpCiAJCWdvdG8gc2tpcF9tc2k7CiAKIAlpZiAoaGEtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9IUCAmJgpAQCAtMzA0Myw3ICszMDY1LDggQEAKIAkgICAgIkZhbGxpbmcgYmFjay10byBNU0kgbW9kZSAtJWQuXG4iLCByZXQpOwogCiAJaWYgKCFJU19RTEEyNFhYKGhhKSAmJiAhSVNfUUxBMjUzMihoYSkgJiYgIUlTX1FMQTg0MzIoaGEpICYmCi0JICAgICFJU19RTEE4MDAxKGhhKSAmJiAhSVNfUDNQX1RZUEUoaGEpICYmICFJU19RTEFGWDAwKGhhKSkKKwkgICAgIUlTX1FMQTgwMDEoaGEpICYmICFJU19QM1BfVFlQRShoYSkgJiYgIUlTX1FMQUZYMDAoaGEpICYmCisJICAgICFJU19RTEEyN1hYKGhhKSkKIAkJZ290byBza2lwX21zaTsKIAogCXJldCA9IHBjaV9lbmFibGVfbXNpKGhhLT5wZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYwppbmRleCBiOTQ1MTFhLi4yNTI4NzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCkBAIC0zNSw3ICszNSw3IEBACiB7CiAJaW50CQlydmFsOwogCXVuc2lnbmVkIGxvbmcgICAgZmxhZ3MgPSAwOwotCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWc7CisJZGV2aWNlX3JlZ190ICpyZWc7CiAJdWludDhfdAkJYWJvcnRfYWN0aXZlOwogCXVpbnQ4X3QJCWlvX2xvY2tfb247CiAJdWludDE2X3QJY29tbWFuZCA9IDA7CkBAIC00NjgsNyArNDY4LDggQEAKIAkJbWNwLT5tYlsxXSA9IE1TVyhyaXNjX2FkZHIpOwogCQltY3AtPm1iWzJdID0gTFNXKHJpc2NfYWRkcik7CiAJCW1jcC0+bWJbM10gPSAwOwotCQlpZiAoSVNfUUxBMjVYWChoYSkgfHwgSVNfUUxBODFYWChoYSkgfHwgSVNfUUxBODNYWChoYSkpIHsKKwkJaWYgKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpIHx8IElTX1FMQTgzWFgoaGEpIHx8CisJCSAgICBJU19RTEEyN1hYKGhhKSkgewogCQkJc3RydWN0IG52cmFtXzgxeHggKm52ID0gaGEtPm52cmFtOwogCQkJbWNwLT5tYls0XSA9IChudi0+ZW5oYW5jZWRfZmVhdHVyZXMgJgogCQkJICAgIEVYVEVOREVEX0JCX0NSRURJVFMpOwpAQCAtNTM5LDYgKzU0MCw4IEBACiAJCW1jcC0+aW5fbWIgfD0gTUJYXzEzfE1CWF8xMnxNQlhfMTF8TUJYXzEwfE1CWF85fE1CWF84OwogCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKQogCQltY3AtPmluX21iIHw9IE1CWF8xN3xNQlhfMTZ8TUJYXzE1OworCWlmIChJU19RTEEyN1hYKGhhKSkKKwkJbWNwLT5pbl9tYiB8PSBNQlhfMjF8TUJYXzIwfE1CWF8xOXxNQlhfMTg7CiAJbWNwLT5mbGFncyA9IDA7CiAJbWNwLT50b3YgPSBNQlhfVE9WX1NFQ09ORFM7CiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKQEAgLTU3NCw2ICs1NzcsMTAgQEAKIAkJICAgICIlczogRXh0X0Z3QXR0cmlidXRlcyBVcHBlcjogMHgleCwgTG93ZXI6IDB4JXguXG4iLAogCQkgICAgX19mdW5jX18sIG1jcC0+bWJbMTddLCBtY3AtPm1iWzE2XSk7CiAJfQorCWlmIChJU19RTEEyN1hYKGhhKSkgeworCQloYS0+Zndfc2hhcmVkX3JhbV9zdGFydCA9IChtY3AtPm1iWzE5XSA8PCAxNikgfCBtY3AtPm1iWzE4XTsKKwkJaGEtPmZ3X3NoYXJlZF9yYW1fZW5kID0gKG1jcC0+bWJbMjFdIDw8IDE2KSB8IG1jcC0+bWJbMjBdOworCX0KIAogZmFpbGVkOgogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CkBAIC0xMjI1LDcgKzEyMzIsNyBAQAogCX0KIAkvKiAxIGFuZCAyIHNob3VsZCBub3JtYWxseSBiZSBjYXB0dXJlZC4gKi8KIAltY3AtPmluX21iID0gTUJYXzJ8TUJYXzF8TUJYXzA7Ci0JaWYgKElTX1FMQTgzWFgoaGEpKQorCWlmIChJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkKIAkJLyogbWIzIGlzIGFkZGl0aW9uYWwgaW5mbyBhYm91dCB0aGUgaW5zdGFsbGVkIFNGUC4gKi8KIAkJbWNwLT5pbl9tYiAgfD0gTUJYXzM7CiAJbWNwLT5idWZfc2l6ZSA9IHNpemU7CkBAIC0yMzQ5LDcgKzIzNTYsNyBAQAogCW1jcC0+bWJbMF0gPSBNQkNfR0VUX1JFU09VUkNFX0NPVU5UUzsKIAltY3AtPm91dF9tYiA9IE1CWF8wOwogCW1jcC0+aW5fbWIgPSBNQlhfMTF8TUJYXzEwfE1CWF83fE1CWF82fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOwotCWlmIChJU19RTEE4MVhYKHZoYS0+aHcpIHx8IElTX1FMQTgzWFgodmhhLT5odykpCisJaWYgKElTX1FMQTgxWFgodmhhLT5odykgfHwgSVNfUUxBODNYWCh2aGEtPmh3KSB8fCBJU19RTEEyN1hYKHZoYS0+aHcpKQogCQltY3AtPmluX21iIHw9IE1CWF8xMjsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAltY3AtPmZsYWdzID0gMDsKQEAgLTI1OTAsNiArMjU5Nyw5IEBACiAJcWxfZGJnKHFsX2RiZ19tYnggKyBxbF9kYmdfdmVyYm9zZSwgdmhhLCAweDEwOGMsCiAJICAgICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCisJaWYgKHFsMnhhc3luY3RtZmVuYWJsZSkKKwkJcmV0dXJuIHFsYTI0eHhfYXN5bmNfYWJvcnRfY29tbWFuZChzcCk7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAlmb3IgKGhhbmRsZSA9IDE7IGhhbmRsZSA8IHJlcS0+bnVtX291dHN0YW5kaW5nX2NtZHM7IGhhbmRsZSsrKSB7CiAJCWlmIChyZXEtPm91dHN0YW5kaW5nX2NtZHNbaGFuZGxlXSA9PSBzcCkKQEAgLTMwMzIsNyArMzA0Miw3IEBACiAJICAgICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJaWYgKCFJU19RTEEyNVhYKHZoYS0+aHcpICYmICFJU19RTEE4MVhYKHZoYS0+aHcpICYmCi0JICAgICFJU19RTEE4M1hYKHZoYS0+aHcpKQorCSAgICAhSVNfUUxBODNYWCh2aGEtPmh3KSAmJiAhSVNfUUxBMjdYWCh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKIAlpZiAodW5saWtlbHkocGNpX2NoYW5uZWxfb2ZmbGluZSh2aGEtPmh3LT5wZGV2KSkpCkBAIC0zNjYyLDcgKzM2NzIsNyBAQAogCW1jcC0+bWJbMTJdID0gcmVxLT5xb3M7CiAJbWNwLT5tYlsxMV0gPSByZXEtPnZwX2lkeDsKIAltY3AtPm1iWzEzXSA9IHJlcS0+cmlkOwotCWlmIChJU19RTEE4M1hYKGhhKSkKKwlpZiAoSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpCiAJCW1jcC0+bWJbMTVdID0gMDsKIAogCW1jcC0+bWJbNF0gPSByZXEtPmlkOwpAQCAtMzY3Niw5ICszNjg2LDkgQEAKIAltY3AtPmZsYWdzID0gTUJYX0RNQV9PVVQ7CiAJbWNwLT50b3YgPSBNQlhfVE9WX1NFQ09ORFMgKiAyOwogCi0JaWYgKElTX1FMQTgxWFgoaGEpIHx8IElTX1FMQTgzWFgoaGEpKQorCWlmIChJU19RTEE4MVhYKGhhKSB8fCBJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkKIAkJbWNwLT5pbl9tYiB8PSBNQlhfMTsKLQlpZiAoSVNfUUxBODNYWChoYSkpIHsKKwlpZiAoSVNfUUxBODNYWChoYSkgfHwgIUlTX1FMQTI3WFgoaGEpKSB7CiAJCW1jcC0+b3V0X21iIHw9IE1CWF8xNTsKIAkJLyogZGVidWcgcSBjcmVhdGUgaXNzdWUgaW4gU1ItSU9WICovCiAJCW1jcC0+aW5fbWIgfD0gTUJYXzkgfCBNQlhfOCB8IE1CWF83OwpAQCAtMzY4Nyw3ICszNjk3LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAlpZiAoIShyZXEtPm9wdGlvbnMgJiBCSVRfMCkpIHsKIAkJV1JUX1JFR19EV09SRChyZXEtPnJlcV9xX2luLCAwKTsKLQkJaWYgKCFJU19RTEE4M1hYKGhhKSkKKwkJaWYgKCFJU19RTEE4M1hYKGhhKSB8fCAhSVNfUUxBMjdYWChoYSkpCiAJCQlXUlRfUkVHX0RXT1JEKHJlcS0+cmVxX3Ffb3V0LCAwKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKQEAgLTM3MjUsNyArMzczNSw3IEBACiAJbWNwLT5tYls1XSA9IHJzcC0+bGVuZ3RoOwogCW1jcC0+bWJbMTRdID0gcnNwLT5tc2l4LT5lbnRyeTsKIAltY3AtPm1iWzEzXSA9IHJzcC0+cmlkOwotCWlmIChJU19RTEE4M1hYKGhhKSkKKwlpZiAoSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpCiAJCW1jcC0+bWJbMTVdID0gMDsKIAogCW1jcC0+bWJbNF0gPSByc3AtPmlkOwpAQCAtMzc0Miw3ICszNzUyLDcgQEAKIAlpZiAoSVNfUUxBODFYWChoYSkpIHsKIAkJbWNwLT5vdXRfbWIgfD0gTUJYXzEyfE1CWF8xMXxNQlhfMTA7CiAJCW1jcC0+aW5fbWIgfD0gTUJYXzE7Ci0JfSBlbHNlIGlmIChJU19RTEE4M1hYKGhhKSkgeworCX0gZWxzZSBpZiAoSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpIHsKIAkJbWNwLT5vdXRfbWIgfD0gTUJYXzE1fE1CWF8xMnxNQlhfMTF8TUJYXzEwOwogCQltY3AtPmluX21iIHw9IE1CWF8xOwogCQkvKiBkZWJ1ZyBxIGNyZWF0ZSBpc3N1ZSBpbiBTUi1JT1YgKi8KQEAgLTM4MDksNyArMzgxOSw4IEBACiAJcWxfZGJnKHFsX2RiZ19tYnggKyBxbF9kYmdfdmVyYm9zZSwgdmhhLCAweDEwZGMsCiAJICAgICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCi0JaWYgKCFJU19RTEE4MVhYKHZoYS0+aHcpICYmICFJU19RTEE4M1hYKHZoYS0+aHcpKQorCWlmICghSVNfUUxBODFYWCh2aGEtPmh3KSAmJiAhSVNfUUxBODNYWCh2aGEtPmh3KSAmJgorCSAgICAhSVNfUUxBMjdYWCh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKIAltY3AtPm1iWzBdID0gTUJDX0ZMQVNIX0FDQ0VTU19DVFJMOwpAQCAtMzg0MCw3ICszODUxLDggQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlpZiAoIUlTX1FMQTgxWFgodmhhLT5odykgJiYgIUlTX1FMQTgzWFgodmhhLT5odykpCisJaWYgKCFJU19RTEE4MVhYKHZoYS0+aHcpICYmICFJU19RTEE4M1hYKHZoYS0+aHcpICYmCisJICAgICFJU19RTEEyN1hYKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAogCXFsX2RiZyhxbF9kYmdfbWJ4ICsgcWxfZGJnX3ZlcmJvc2UsIHZoYSwgMHgxMGRmLApAQCAtMzg3NCw3ICszODg2LDggQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlpZiAoIUlTX1FMQTgxWFgodmhhLT5odykgJiYgIUlTX1FMQTgzWFgodmhhLT5odykpCisJaWYgKCFJU19RTEE4MVhYKHZoYS0+aHcpICYmICFJU19RTEE4M1hYKHZoYS0+aHcpICYmCisJICAgICFJU19RTEEyN1hYKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAogCXFsX2RiZyhxbF9kYmdfbWJ4ICsgcWxfZGJnX3ZlcmJvc2UsIHZoYSwgMHgxMGUyLApAQCAtNDU0NSw3ICs0NTU4LDcgQEAKIAltY3AtPm1iWzFdID0gMDsKIAltY3AtPm91dF9tYiA9IE1CWF8xfE1CWF8wOwogCW1jcC0+aW5fbWIgPSBNQlhfMnxNQlhfMXxNQlhfMDsKLQlpZiAoSVNfUUxBODNYWChoYSkpCisJaWYgKElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKQogCQltY3AtPmluX21iIHw9IE1CWF8zOwogCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOwogCW1jcC0+ZmxhZ3MgPSAwOwpAQCAtNDU3NCw3ICs0NTg3LDggQEAKIAlxbF9kYmcocWxfZGJnX21ieCArIHFsX2RiZ192ZXJib3NlLCB2aGEsIDB4MTEwOSwKIAkgICAgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAoIUlTX1FMQTgxWFgoaGEpICYmICFJU19RTEE4M1hYKGhhKSAmJiAhSVNfUUxBODA0NChoYSkpCisJaWYgKCFJU19RTEE4MVhYKGhhKSAmJiAhSVNfUUxBODNYWChoYSkgJiYgIUlTX1FMQTgwNDQoaGEpICYmCisJICAgICFJU19RTEEyN1hYKGhhKSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJbWNwLT5tYlswXSA9IE1CQ19HRVRfUE9SVF9DT05GSUc7CiAJbWNwLT5vdXRfbWIgPSBNQlhfMDsKQEAgLTUwNzAsNyArNTA4NCw3IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JaWYgKCFJU19RTEE4M1hYKGhhKSkKKwlpZiAoIUlTX1FMQTgzWFgoaGEpICYmICFJU19RTEEyN1hYKGhhKSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKIAlxbF9kYmcocWxfZGJnX21ieCArIHFsX2RiZ192ZXJib3NlLCB2aGEsIDB4MTEzMCwKQEAgLTUxNDUsNyArNTE1OSw3IEBACiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJdW5zaWduZWQgbG9uZyByZXRyeV9tYXhfdGltZSA9IGppZmZpZXMgKyAoMiAqIEhaKTsKIAotCWlmICghSVNfUUxBODNYWChoYSkpCisJaWYgKCFJU19RTEE4M1hYKGhhKSAmJiAhSVNfUUxBMjdYWChoYSkpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCiAJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMTRiLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9taWQuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9taWQuYwppbmRleCBhNzJkZjcwLi5mMGE4NTIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWlkLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jCkBAIC02MzAsNyArNjMwLDcgQEAKIAlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gTlVMTDsKIAlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCXVpbnQxNl90IHF1ZV9pZCA9IDA7Ci0JZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZzsKKwlkZXZpY2VfcmVnX3QgKnJlZzsKIAl1aW50MzJfdCBjbnQ7CiAKIAlyZXEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVxX3F1ZSksIEdGUF9LRVJORUwpOwpAQCAtNzU0LDcgKzc1NCw3IEBACiAJc3RydWN0IHJzcF9xdWUgKnJzcCA9IE5VTEw7CiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAl1aW50MTZfdCBxdWVfaWQgPSAwOwotCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWc7CisJZGV2aWNlX3JlZ190ICpyZWc7CiAKIAlyc3AgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnNwX3F1ZSksIEdGUF9LRVJORUwpOwogCWlmIChyc3AgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21yLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbXIuYwppbmRleCBiYTZmOGIxLi4wYWFmNmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbXIuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbXIuYwpAQCAtNDAsNyArNDAsNyBAQAogewogCWludAkJcnZhbDsKIAl1bnNpZ25lZCBsb25nICAgIGZsYWdzID0gMDsKLQlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnOworCWRldmljZV9yZWdfdCAqcmVnOwogCXVpbnQ4X3QJCWFib3J0X2FjdGl2ZTsKIAl1aW50OF90CQlpb19sb2NrX29uOwogCXVpbnQxNl90CWNvbW1hbmQgPSAwOwpAQCAtNjMxLDIwICs2MzEsNiBAQAogewogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnX2Z4MDAgX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcGZ4MDA7Ci0Jc3RydWN0IGluaXRfY2JfZnggKmljYjsKLQlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gaGEtPnJlcV9xX21hcFswXTsKLQlzdHJ1Y3QgcnNwX3F1ZSAqcnNwID0gaGEtPnJzcF9xX21hcFswXTsKLQotCS8qIFNldHVwIHJpbmcgcGFyYW1ldGVycyBpbiBpbml0aWFsaXphdGlvbiBjb250cm9sIGJsb2NrLiAqLwotCWljYiA9IChzdHJ1Y3QgaW5pdF9jYl9meCAqKWhhLT5pbml0X2NiOwotCWljYi0+cmVxdWVzdF9xX291dHBvaW50ZXIgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDApOwotCWljYi0+cmVzcG9uc2VfcV9pbnBvaW50ZXIgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDApOwotCWljYi0+cmVxdWVzdF9xX2xlbmd0aCA9IGNwdV90b19sZTE2KHJlcS0+bGVuZ3RoKTsKLQlpY2ItPnJlc3BvbnNlX3FfbGVuZ3RoID0gY3B1X3RvX2xlMTYocnNwLT5sZW5ndGgpOwotCWljYi0+cmVxdWVzdF9xX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMihMU0QocmVxLT5kbWEpKTsKLQlpY2ItPnJlcXVlc3RfcV9hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoTVNEKHJlcS0+ZG1hKSk7Ci0JaWNiLT5yZXNwb25zZV9xX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMihMU0QocnNwLT5kbWEpKTsKLQlpY2ItPnJlc3BvbnNlX3FfYWRkcmVzc1sxXSA9IGNwdV90b19sZTMyKE1TRChyc3AtPmRtYSkpOwogCiAJV1JUX1JFR19EV09SRCgmcmVnLT5yZXFfcV9pbiwgMCk7CiAJV1JUX1JFR19EV09SRCgmcmVnLT5yZXFfcV9vdXQsIDApOwpAQCAtNjk5LDc4ICs2ODUsMTYgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZAotcWxhZngwMF90bWZfaW9jYl90aW1lb3V0KHZvaWQgKmRhdGEpCi17Ci0Jc3JiX3QgKnNwID0gKHNyYl90ICopZGF0YTsKLQlzdHJ1Y3Qgc3JiX2lvY2IgKnRtZiA9ICZzcC0+dS5pb2NiX2NtZDsKLQotCXRtZi0+dS50bWYuY29tcF9zdGF0dXMgPSBjcHVfdG9fbGUxNigodWludDE2X3QpQ1NfVElNRU9VVCk7Ci0JY29tcGxldGUoJnRtZi0+dS50bWYuY29tcCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1xbGFmeDAwX3RtZl9zcF9kb25lKHZvaWQgKmRhdGEsIHZvaWQgKnB0ciwgaW50IHJlcykKLXsKLQlzcmJfdCAqc3AgPSAoc3JiX3QgKilwdHI7Ci0Jc3RydWN0IHNyYl9pb2NiICp0bWYgPSAmc3AtPnUuaW9jYl9jbWQ7Ci0KLQljb21wbGV0ZSgmdG1mLT51LnRtZi5jb21wKTsKLX0KLQotc3RhdGljIGludAotcWxhZngwMF9hc3luY190bV9jbWQoZmNfcG9ydF90ICpmY3BvcnQsIHVpbnQzMl90IGZsYWdzLAotCQkgICAgIHVpbnQzMl90IGx1biwgdWludDMyX3QgdGFnKQotewotCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gZmNwb3J0LT52aGE7Ci0Jc3RydWN0IHNyYl9pb2NiICp0bV9pb2NiOwotCXNyYl90ICpzcDsKLQlpbnQgcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7Ci0KLQlzcCA9IHFsYTJ4MDBfZ2V0X3NwKHZoYSwgZmNwb3J0LCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNwKQotCQlnb3RvIGRvbmU7Ci0KLQl0bV9pb2NiID0gJnNwLT51LmlvY2JfY21kOwotCXNwLT50eXBlID0gU1JCX1RNX0NNRDsKLQlzcC0+bmFtZSA9ICJ0bWYiOwotCXFsYTJ4MDBfaW5pdF90aW1lcihzcCwgcWxhMngwMF9nZXRfYXN5bmNfdGltZW91dCh2aGEpKTsKLQl0bV9pb2NiLT51LnRtZi5mbGFncyA9IGZsYWdzOwotCXRtX2lvY2ItPnUudG1mLmx1biA9IGx1bjsKLQl0bV9pb2NiLT51LnRtZi5kYXRhID0gdGFnOwotCXNwLT5kb25lID0gcWxhZngwMF90bWZfc3BfZG9uZTsKLQl0bV9pb2NiLT50aW1lb3V0ID0gcWxhZngwMF90bWZfaW9jYl90aW1lb3V0OwotCWluaXRfY29tcGxldGlvbigmdG1faW9jYi0+dS50bWYuY29tcCk7Ci0KLQlydmFsID0gcWxhMngwMF9zdGFydF9zcChzcCk7Ci0JaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCi0JCWdvdG8gZG9uZV9mcmVlX3NwOwotCi0JcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwN2IsCi0JICAgICJUYXNrIG1hbmFnZW1lbnQgY29tbWFuZCBpc3N1ZWQgdGFyZ2V0X2lkPSV4XG4iLAotCSAgICBmY3BvcnQtPnRndF9pZCk7Ci0KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ0bV9pb2NiLT51LnRtZi5jb21wKTsKLQotCXJ2YWwgPSB0bV9pb2NiLT51LnRtZi5jb21wX3N0YXR1cyA9PSBDU19DT01QTEVURSA/Ci0JICAgIFFMQV9TVUNDRVNTIDogUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKLQotZG9uZV9mcmVlX3NwOgotCXNwLT5mcmVlKHZoYSwgc3ApOwotZG9uZToKLQlyZXR1cm4gcnZhbDsKLX0KLQogaW50CiBxbGFmeDAwX2Fib3J0X3RhcmdldChmY19wb3J0X3QgKmZjcG9ydCwgdW5zaWduZWQgaW50IGwsIGludCB0YWcpCiB7Ci0JcmV0dXJuIHFsYWZ4MDBfYXN5bmNfdG1fY21kKGZjcG9ydCwgVENGX1RBUkdFVF9SRVNFVCwgbCwgdGFnKTsKKwlyZXR1cm4gcWxhMngwMF9hc3luY190bV9jbWQoZmNwb3J0LCBUQ0ZfVEFSR0VUX1JFU0VULCBsLCB0YWcpOwogfQogCiBpbnQKIHFsYWZ4MDBfbHVuX3Jlc2V0KGZjX3BvcnRfdCAqZmNwb3J0LCB1bnNpZ25lZCBpbnQgbCwgaW50IHRhZykKIHsKLQlyZXR1cm4gcWxhZngwMF9hc3luY190bV9jbWQoZmNwb3J0LCBUQ0ZfTFVOX1JFU0VULCBsLCB0YWcpOworCXJldHVybiBxbGEyeDAwX2FzeW5jX3RtX2NtZChmY3BvcnQsIFRDRl9MVU5fUkVTRVQsIGwsIHRhZyk7CiB9CiAKIGludApAQCAtOTk3LDYgKzkyMSw5IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgorCQkJaWYgKChhZW5tYnggJiAweEZGMDApID09IE1CQV9GV19JTklUX0lOUFJPR1JFU1MpCisJCQkJYnJlYWs7CisKIAkJCS8qIElmIGZ3IGlzIGFwcGFyZW50bHkgbm90IHJlYWR5LiBJbiBvcmRlciB0byBjb250aW51ZSwKIAkJCSAqIHdlIG1pZ2h0IG5lZWQgdG8gaXNzdWUgTWJveCBjbWQsIGJ1dCB0aGUgcHJvYmxlbSBpcwogCQkJICogdGhhdCB0aGUgRG9vckJlbGwgdmVjdG9yIHZhbHVlcyB0aGF0IGNvbWUgd2l0aCB0aGUKQEAgLTIwMTQsNyArMTk0MSw4IEBACiAJCW1lbWNweSh2aGEtPmh3LT5naWRfbGlzdCwgcGluZm8sIFFMQUZYMDBfVEdUX05PREVfTElTVF9TSVpFKTsKIAl9IGVsc2UgaWYgKGZ4X3R5cGUgPT0gRlhESVNDX0FCT1JUX0lPQ1RMKQogCQlmZGlzYy0+dS5meGlvY2IucmVzdWx0ID0KLQkJICAgIChmZGlzYy0+dS5meGlvY2IucmVzdWx0ID09IGNwdV90b19sZTMyKDB4NjgpKSA/CisJCSAgICAoZmRpc2MtPnUuZnhpb2NiLnJlc3VsdCA9PQorCQkJY3B1X3RvX2xlMzIoUUxBRlgwMF9JT0NUTF9JQ09CX0FCT1JUX1NVQ0NFU1MpKSA/CiAJCSAgICBjcHVfdG9fbGUzMihRTEFfU1VDQ0VTUykgOiBjcHVfdG9fbGUzMihRTEFfRlVOQ1RJT05fRkFJTEVEKTsKIAogCXJ2YWwgPSBsZTMyX3RvX2NwdShmZGlzYy0+dS5meGlvY2IucmVzdWx0KTsKQEAgLTIwMzQsOTQgKzE5NjIsNiBAQAogCXJldHVybiBydmFsOwogfQogCi1zdGF0aWMgdm9pZAotcWxhZngwMF9hYm9ydF9pb2NiX3RpbWVvdXQodm9pZCAqZGF0YSkKLXsKLQlzcmJfdCAqc3AgPSAoc3JiX3QgKilkYXRhOwotCXN0cnVjdCBzcmJfaW9jYiAqYWJ0ID0gJnNwLT51LmlvY2JfY21kOwotCi0JYWJ0LT51LmFidC5jb21wX3N0YXR1cyA9IGNwdV90b19sZTE2KCh1aW50MTZfdClDU19USU1FT1VUKTsKLQljb21wbGV0ZSgmYWJ0LT51LmFidC5jb21wKTsKLX0KLQotc3RhdGljIHZvaWQKLXFsYWZ4MDBfYWJvcnRfc3BfZG9uZSh2b2lkICpkYXRhLCB2b2lkICpwdHIsIGludCByZXMpCi17Ci0Jc3JiX3QgKnNwID0gKHNyYl90ICopcHRyOwotCXN0cnVjdCBzcmJfaW9jYiAqYWJ0ID0gJnNwLT51LmlvY2JfY21kOwotCi0JY29tcGxldGUoJmFidC0+dS5hYnQuY29tcCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXFsYWZ4MDBfYXN5bmNfYWJ0X2NtZChzcmJfdCAqY21kX3NwKQotewotCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gY21kX3NwLT5mY3BvcnQtPnZoYTsKLQlmY19wb3J0X3QgKmZjcG9ydCA9IGNtZF9zcC0+ZmNwb3J0OwotCXN0cnVjdCBzcmJfaW9jYiAqYWJ0X2lvY2I7Ci0Jc3JiX3QgKnNwOwotCWludCBydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKLQotCXNwID0gcWxhMngwMF9nZXRfc3AodmhhLCBmY3BvcnQsIEdGUF9LRVJORUwpOwotCWlmICghc3ApCi0JCWdvdG8gZG9uZTsKLQotCWFidF9pb2NiID0gJnNwLT51LmlvY2JfY21kOwotCXNwLT50eXBlID0gU1JCX0FCVF9DTUQ7Ci0Jc3AtPm5hbWUgPSAiYWJvcnQiOwotCXFsYTJ4MDBfaW5pdF90aW1lcihzcCwgRlhESVNDX1RJTUVPVVQpOwotCWFidF9pb2NiLT51LmFidC5jbWRfaG5kbCA9IGNtZF9zcC0+aGFuZGxlOwotCXNwLT5kb25lID0gcWxhZngwMF9hYm9ydF9zcF9kb25lOwotCWFidF9pb2NiLT50aW1lb3V0ID0gcWxhZngwMF9hYm9ydF9pb2NiX3RpbWVvdXQ7Ci0JaW5pdF9jb21wbGV0aW9uKCZhYnRfaW9jYi0+dS5hYnQuY29tcCk7Ci0KLQlydmFsID0gcWxhMngwMF9zdGFydF9zcChzcCk7Ci0JaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCi0JCWdvdG8gZG9uZV9mcmVlX3NwOwotCi0JcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwN2MsCi0JICAgICJBYm9ydCBjb21tYW5kIGlzc3VlZCAtIGhkbD0leCwgdGFyZ2V0X2lkPSV4XG4iLAotCSAgICBjbWRfc3AtPmhhbmRsZSwgZmNwb3J0LT50Z3RfaWQpOwotCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmYWJ0X2lvY2ItPnUuYWJ0LmNvbXApOwotCi0JcnZhbCA9IGFidF9pb2NiLT51LmFidC5jb21wX3N0YXR1cyA9PSBDU19DT01QTEVURSA/Ci0JICAgIFFMQV9TVUNDRVNTIDogUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKLQotZG9uZV9mcmVlX3NwOgotCXNwLT5mcmVlKHZoYSwgc3ApOwotZG9uZToKLQlyZXR1cm4gcnZhbDsKLX0KLQotaW50Ci1xbGFmeDAwX2Fib3J0X2NvbW1hbmQoc3JiX3QgKnNwKQotewotCXVuc2lnbmVkIGxvbmcgICBmbGFncyA9IDA7Ci0KLQl1aW50MzJfdAloYW5kbGU7Ci0JZmNfcG9ydF90CSpmY3BvcnQgPSBzcC0+ZmNwb3J0OwotCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBmY3BvcnQtPnZoYTsKLQlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKLQlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gdmhhLT5yZXE7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKLQlmb3IgKGhhbmRsZSA9IDE7IGhhbmRsZSA8IERFRkFVTFRfT1VUU1RBTkRJTkdfQ09NTUFORFM7IGhhbmRsZSsrKSB7Ci0JCWlmIChyZXEtPm91dHN0YW5kaW5nX2NtZHNbaGFuZGxlXSA9PSBzcCkKLQkJCWJyZWFrOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwotCWlmIChoYW5kbGUgPT0gREVGQVVMVF9PVVRTVEFORElOR19DT01NQU5EUykgewotCQkvKiBDb21tYW5kIG5vdCBmb3VuZC4gKi8KLQkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7Ci0JfQotCWlmIChzcC0+dHlwZSA9PSBTUkJfRlhJT0NCX0RDTUQpCi0JCXJldHVybiBxbGFmeDAwX2Z4X2Rpc2ModmhhLCAmdmhhLT5ody0+bXIuZmNwb3J0LAotCQkgICAgRlhESVNDX0FCT1JUX0lPQ1RMKTsKLQotCXJldHVybiBxbGFmeDAwX2FzeW5jX2FidF9jbWQoc3ApOwotfQotCiAvKgogICogcWxhZngwMF9pbml0aWFsaXplX2FkYXB0ZXIKICAqICAgICAgSW5pdGlhbGl6ZSBib2FyZC4KQEAgLTIxNTAsNyArMTk5MCw2IEBACiAJdmhhLT5kZXZpY2VfZmxhZ3MgPSBERkxHX05PX0NBQkxFOwogCXZoYS0+ZHBjX2ZsYWdzID0gMDsKIAl2aGEtPmZsYWdzLm1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA9IDA7Ci0JdmhhLT5tYXJrZXJfbmVlZGVkID0gMDsKIAloYS0+aXNwX2Fib3J0X2NudCA9IDA7CiAJaGEtPmJlYWNvbl9ibGlua19sZWQgPSAwOwogCkBAIC0yMzU0LDggKzIxOTMsNyBAQAogCQlmc3RhdHVzLmlvY3RsX2ZsYWdzID0gcGt0LT5md19pb3RjbF9mbGFnczsKIAkJZnN0YXR1cy5pb2N0bF9kYXRhID0gcGt0LT5kYXRhd29yZF9yOwogCQlmc3RhdHVzLmFkYXBpZCA9IHBrdC0+YWRhcGlkOwotCQlmc3RhdHVzLmFkYXBpZF9oaSA9IHBrdC0+YWRhcGlkX2hpOwotCQlmc3RhdHVzLnJlc2VydmVkXzIgPSBwa3QtPnJlc2VydmVkXzE7CisJCWZzdGF0dXMucmVzZXJ2ZWRfMiA9IHBrdC0+ZGF0YXdvcmRfcl9leHRyYTsKIAkJZnN0YXR1cy5yZXNfY291bnQgPSBwa3QtPnJlc2lkdWFsbGVuOwogCQlmc3RhdHVzLnN0YXR1cyA9IHBrdC0+c3RhdHVzOwogCQlmc3RhdHVzLnNlcV9udW1iZXIgPSBwa3QtPnNlcV9ubzsKQEAgLTI4MDQsNyArMjY0Miw3IEBACiAJc3JiX3QgKnNwOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCWNvbnN0IGNoYXIgZnVuY1tdID0gIkVSUk9SLUlPQ0IiOwotCXVpbnQxNl90IHF1ZSA9IE1TVyhwa3QtPmhhbmRsZSk7CisJdWludDE2X3QgcXVlID0gMDsKIAlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gTlVMTDsKIAlpbnQgcmVzID0gRElEX0VSUk9SIDw8IDE2OwogCkBAIC0yODMzLDE2ICsyNjcxLDIyIEBACiB7CiAJc3RydWN0IHN0c19lbnRyeV9meDAwICpwa3Q7CiAJcmVzcG9uc2VfdCAqbHB0cjsKKwl1aW50MTZfdCBscmVxX3FfaW4gPSAwOworCXVpbnQxNl90IGxyZXFfcV9vdXQgPSAwOwogCi0Jd2hpbGUgKFJEX1JFR19EV09SRCgodm9pZCBfX2lvbWVtICopJihyc3AtPnJpbmdfcHRyLT5zaWduYXR1cmUpKSAhPQotCSAgICBSRVNQT05TRV9QUk9DRVNTRUQpIHsKKwlscmVxX3FfaW4gPSBSRF9SRUdfRFdPUkQocnNwLT5yc3BfcV9pbik7CisJbHJlcV9xX291dCA9IFJEX1JFR19EV09SRChyc3AtPnJzcF9xX291dCk7CisKKwl3aGlsZSAobHJlcV9xX2luICE9IGxyZXFfcV9vdXQpIHsKIAkJbHB0ciA9IHJzcC0+cmluZ19wdHI7CiAJCW1lbWNweV9mcm9taW8ocnNwLT5yc3BfcGt0LCAodm9pZCBfX2lvbWVtICopbHB0ciwKIAkJICAgIHNpemVvZihyc3AtPnJzcF9wa3QpKTsKIAkJcGt0ID0gKHN0cnVjdCBzdHNfZW50cnlfZngwMCAqKXJzcC0+cnNwX3BrdDsKIAogCQlyc3AtPnJpbmdfaW5kZXgrKzsKKwkJbHJlcV9xX291dCsrOwogCQlpZiAocnNwLT5yaW5nX2luZGV4ID09IHJzcC0+bGVuZ3RoKSB7CisJCQlscmVxX3Ffb3V0ID0gMDsKIAkJCXJzcC0+cmluZ19pbmRleCA9IDA7CiAJCQlyc3AtPnJpbmdfcHRyID0gcnNwLT5yaW5nOwogCQl9IGVsc2UgewpAQCAtMjg1NCw3ICsyNjk4LDYgQEAKIAkJCXFsYWZ4MDBfZXJyb3JfZW50cnkodmhhLCByc3AsCiAJCQkgICAgKHN0cnVjdCBzdHNfZW50cnlfZngwMCAqKXBrdCwgcGt0LT5lbnRyeV9zdGF0dXMsCiAJCQkgICAgcGt0LT5lbnRyeV90eXBlKTsKLQkJCWdvdG8gbmV4dF9pdGVyOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMjg4OCwxMCArMjczMSw2IEBACiAJCQkgICAgcGt0LT5lbnRyeV90eXBlLCBwa3QtPmVudHJ5X3N0YXR1cyk7CiAJCQlicmVhazsKIAkJfQotbmV4dF9pdGVyOgotCQlXUlRfUkVHX0RXT1JEKCh2b2lkIF9faW9tZW0gKikmbHB0ci0+c2lnbmF0dXJlLAotCQkgICAgUkVTUE9OU0VfUFJPQ0VTU0VEKTsKLQkJd21iKCk7CiAJfQogCiAJLyogQWRqdXN0IHJpbmcgaW5kZXggKi8KQEAgLTI5MjYsOSArMjc2NSw5IEBACiAJCWJyZWFrOwogCiAJY2FzZSBRTEFGWDAwX01CQV9QT1JUX1VQREFURToJCS8qIFBvcnQgZGF0YWJhc2UgdXBkYXRlICovCi0JCWhhLT5hZW5tYlsxXSA9IFJEX1JFR19XT1JEKCZyZWctPmFlbm1haWxib3gxKTsKLQkJaGEtPmFlbm1iWzJdID0gUkRfUkVHX1dPUkQoJnJlZy0+YWVubWFpbGJveDIpOwotCQloYS0+YWVubWJbM10gPSBSRF9SRUdfV09SRCgmcmVnLT5hZW5tYWlsYm94Myk7CisJCWhhLT5hZW5tYlsxXSA9IFJEX1JFR19EV09SRCgmcmVnLT5hZW5tYWlsYm94MSk7CisJCWhhLT5hZW5tYlsyXSA9IFJEX1JFR19EV09SRCgmcmVnLT5hZW5tYWlsYm94Mik7CisJCWhhLT5hZW5tYlszXSA9IFJEX1JFR19EV09SRCgmcmVnLT5hZW5tYWlsYm94Myk7CiAJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDc3LAogCQkgICAgIkFzeW5jaHJvbm91cyBwb3J0IFVwZGF0ZSByZWNlaXZlZCAiCiAJCSAgICAiYWVubWJbMF06ICV4LCBhZW5tYlsxXTogJXgsIGFlbm1iWzJdOiAleCwgYWVubWJbM106ICV4XG4iLApAQCAtMjk4NSw3ICsyODI0LDcgQEAKIHFsYWZ4MDBfbWJ4X2NvbXBsZXRpb24oc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQzMl90IG1iMCkKIHsKIAl1aW50MTZfdAljbnQ7Ci0JdWludDE2X3QgX19pb21lbSAqd3B0cjsKKwl1aW50MzJfdCBfX2lvbWVtICp3cHRyOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnX2Z4MDAgX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcGZ4MDA7CiAKQEAgLTI5OTUsMTAgKzI4MzQsMTAgQEAKIAkvKiBMb2FkIHJldHVybiBtYWlsYm94IHJlZ2lzdGVycy4gKi8KIAloYS0+ZmxhZ3MubWJveF9pbnQgPSAxOwogCWhhLT5tYWlsYm94X291dDMyWzBdID0gbWIwOwotCXdwdHIgPSAodWludDE2X3QgX19pb21lbSAqKSZyZWctPm1haWxib3gxNzsKKwl3cHRyID0gKHVpbnQzMl90IF9faW9tZW0gKikmcmVnLT5tYWlsYm94MTc7CiAKIAlmb3IgKGNudCA9IDE7IGNudCA8IGhhLT5tYnhfY291bnQ7IGNudCsrKSB7Ci0JCWhhLT5tYWlsYm94X291dDMyW2NudF0gPSBSRF9SRUdfV09SRCh3cHRyKTsKKwkJaGEtPm1haWxib3hfb3V0MzJbY250XSA9IFJEX1JFR19EV09SRCh3cHRyKTsKIAkJd3B0cisrOwogCX0KIH0KQEAgLTMwMjUsNiArMjg2NCw3IEBACiAJc3RydWN0IHJzcF9xdWUgKnJzcDsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCXVpbnQzMl90IGNscl9pbnRyID0gMDsKKwl1aW50MzJfdCBpbnRyX3N0YXQgPSAwOwogCiAJcnNwID0gKHN0cnVjdCByc3BfcXVlICopIGRldl9pZDsKIAlpZiAoIXJzcCkgewpAQCAtMzA0NiwzNCArMjg4NiwyNiBAQAogCQlzdGF0ID0gUUxBRlgwMF9SRF9JTlRSX1JFRyhoYSk7CiAJCWlmIChxbGEyeDAwX2NoZWNrX3JlZ19mb3JfZGlzY29ubmVjdCh2aGEsIHN0YXQpKQogCQkJYnJlYWs7Ci0JCWlmICgoc3RhdCAmIFFMQUZYMDBfSFNUX0lOVF9TVFNfQklUUykgPT0gMCkKKwkJaW50cl9zdGF0ID0gc3RhdCAmIFFMQUZYMDBfSFNUX0lOVF9TVFNfQklUUzsKKwkJaWYgKCFpbnRyX3N0YXQpCiAJCQlicmVhazsKIAotCQlzd2l0Y2ggKHN0YXQgJiBRTEFGWDAwX0hTVF9JTlRfU1RTX0JJVFMpIHsKLQkJY2FzZSBRTEFGWDAwX0lOVFJfTUJfQ01QTFQ6Ci0JCWNhc2UgUUxBRlgwMF9JTlRSX01CX1JTUF9DTVBMVDoKLQkJY2FzZSBRTEFGWDAwX0lOVFJfTUJfQVNZTkNfQ01QTFQ6Ci0JCWNhc2UgUUxBRlgwMF9JTlRSX0FMTF9DTVBMVDoKKwkJaWYgKHN0YXQgJiBRTEFGWDAwX0lOVFJfTUJfQ01QTFQpIHsKIAkJCW1iWzBdID0gUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDE2KTsKIAkJCXFsYWZ4MDBfbWJ4X2NvbXBsZXRpb24odmhhLCBtYlswXSk7CiAJCQlzdGF0dXMgfD0gTUJYX0lOVEVSUlVQVDsKIAkJCWNscl9pbnRyIHw9IFFMQUZYMDBfSU5UUl9NQl9DTVBMVDsKLQkJCWJyZWFrOwotCQljYXNlIFFMQUZYMDBfSU5UUl9BU1lOQ19DTVBMVDoKLQkJY2FzZSBRTEFGWDAwX0lOVFJfUlNQX0FTWU5DX0NNUExUOgorCQl9CisJCWlmIChpbnRyX3N0YXQgJiBRTEFGWDAwX0lOVFJfQVNZTkNfQ01QTFQpIHsKIAkJCWhhLT5hZW5tYlswXSA9IFJEX1JFR19XT1JEKCZyZWctPmFlbm1haWxib3gwKTsKIAkJCXFsYWZ4MDBfYXN5bmNfZXZlbnQodmhhKTsKIAkJCWNscl9pbnRyIHw9IFFMQUZYMDBfSU5UUl9BU1lOQ19DTVBMVDsKLQkJCWJyZWFrOwotCQljYXNlIFFMQUZYMDBfSU5UUl9SU1BfQ01QTFQ6CisJCX0KKwkJaWYgKGludHJfc3RhdCAmIFFMQUZYMDBfSU5UUl9SU1BfQ01QTFQpIHsKIAkJCXFsYWZ4MDBfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZSh2aGEsIHJzcCk7CiAJCQljbHJfaW50ciB8PSBRTEFGWDAwX0lOVFJfUlNQX0NNUExUOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTA3YSwKLQkJCSAgICAiVW5yZWNvZ25pemVkIGludGVycnVwdCB0eXBlICglZCkuXG4iLCBzdGF0KTsKLQkJCWJyZWFrOwogCQl9CisKIAkJUUxBRlgwMF9DTFJfSU5UUl9SRUcoaGEsIGNscl9pbnRyKTsKIAkJUUxBRlgwMF9SRF9JTlRSX1JFRyhoYSk7CiAJfQpAQCAtMzIyMywxNyArMzA1NSw2IEBACiAJLyogU28gd2Uga25vdyB3ZSBoYXZlbid0IHBjaV9tYXAnZWQgYW55dGhpbmcgeWV0ICovCiAJdG90X2RzZHMgPSAwOwogCi0JLyogRm9yY2luZyBtYXJrZXIgbmVlZGVkIGZvciBub3cgKi8KLQl2aGEtPm1hcmtlcl9uZWVkZWQgPSAwOwotCi0JLyogU2VuZCBtYXJrZXIgaWYgcmVxdWlyZWQgKi8KLQlpZiAodmhhLT5tYXJrZXJfbmVlZGVkICE9IDApIHsKLQkJaWYgKHFsYTJ4MDBfbWFya2VyKHZoYSwgcmVxLCByc3AsIDAsIDAsIE1LX1NZTkNfQUxMKSAhPQotCQkgICAgUUxBX1NVQ0NFU1MpCi0JCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKLQkJdmhhLT5tYXJrZXJfbmVlZGVkID0gMDsKLQl9Ci0KIAkvKiBBY3F1aXJlIHJpbmcgc3BlY2lmaWMgbG9jayAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCkBAIC0zMjg0LDcgKzMxMDUsOSBAQAogCW1lbXNldCgmbGNtZF9wa3QsIDAsIFJFUVVFU1RfRU5UUllfU0laRSk7CiAKIAlsY21kX3BrdC5oYW5kbGUgPSBNQUtFX0hBTkRMRShyZXEtPmlkLCBzcC0+aGFuZGxlKTsKLQlsY21kX3BrdC5oYW5kbGVfaGkgPSAwOworCWxjbWRfcGt0LnJlc2VydmVkXzAgPSAwOworCWxjbWRfcGt0LnBvcnRfcGF0aF9jdHJsID0gMDsKKwlsY21kX3BrdC5yZXNlcnZlZF8xID0gMDsKIAlsY21kX3BrdC5kc2VnX2NvdW50ID0gY3B1X3RvX2xlMTYodG90X2RzZHMpOwogCWxjbWRfcGt0LnRndF9pZHggPSBjcHVfdG9fbGUxNihzcC0+ZmNwb3J0LT50Z3RfaWQpOwogCkBAIC0zMzY0LDggKzMxODcsNyBAQAogCXRtX2lvY2IuZW50cnlfdHlwZSA9IFRTS19NR01UX0lPQ0JfVFlQRV9GWDAwOwogCXRtX2lvY2IuZW50cnlfY291bnQgPSAxOwogCXRtX2lvY2IuaGFuZGxlID0gY3B1X3RvX2xlMzIoTUFLRV9IQU5ETEUocmVxLT5pZCwgc3AtPmhhbmRsZSkpOwotCXRtX2lvY2IuaGFuZGxlX2hpID0gMDsKLQl0bV9pb2NiLnRpbWVvdXQgPSBjcHVfdG9fbGUxNihxbGEyeDAwX2dldF9hc3luY190aW1lb3V0KHZoYSkgKyAyKTsKKwl0bV9pb2NiLnJlc2VydmVkXzAgPSAwOwogCXRtX2lvY2IudGd0X2lkID0gY3B1X3RvX2xlMTYoc3AtPmZjcG9ydC0+dGd0X2lkKTsKIAl0bV9pb2NiLmNvbnRyb2xfZmxhZ3MgPSBjcHVfdG9fbGUzMihmeGlvLT51LnRtZi5mbGFncyk7CiAJaWYgKHRtX2lvY2IuY29udHJvbF9mbGFncyA9PSBjcHVfdG9fbGUzMigodWludDMyX3QpVENGX0xVTl9SRVNFVCkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tci5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21yLmgKaW5kZXggNmNkNzA3Mi4uZTUyOWRmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21yLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21yLmgKQEAgLTIyLDEzICsyMiwxNiBAQAogCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkJLyogRW50cnkgU3RhdHVzLiAqLwogCiAJdWludDMyX3QgaGFuZGxlOwkJLyogU3lzdGVtIGhhbmRsZS4gKi8KLQl1aW50MzJfdCBoYW5kbGVfaGk7CisJdWludDhfdCByZXNlcnZlZF8wOworCXVpbnQ4X3QgcG9ydF9wYXRoX2N0cmw7CisJdWludDE2X3QgcmVzZXJ2ZWRfMTsKIAogCV9fbGUxNiB0Z3RfaWR4OwkJLyogVGFyZ2V0IElkeC4gKi8KIAl1aW50MTZfdCB0aW1lb3V0OwkJLyogQ29tbWFuZCB0aW1lb3V0LiAqLwogCiAJX19sZTE2IGRzZWdfY291bnQ7CQkvKiBEYXRhIHNlZ21lbnQgY291bnQuICovCi0JdWludDE2X3Qgc2NzaV9yc3BfZHNkX2xlbjsKKwl1aW50OF90CXNjc2lfcnNwX2RzZF9sZW47CisJdWludDhfdCByZXNlcnZlZF8yOwogCiAJc3RydWN0IHNjc2lfbHVuIGx1bjsJCS8qIExVTiAoTEUpLiAqLwogCkBAIC00NywzMCArNTAsNiBAQAogCXVpbnQzMl90IGRzZWdfMF9sZW47CQkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCiB9OwogCi0vKgotICogSVNQIHF1ZXVlIC0gbWFya2VyIGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgotICovCi1zdHJ1Y3QgbXJrX2VudHJ5X2Z4MDAgewotCXVpbnQ4X3QgZW50cnlfdHlwZTsJCS8qIEVudHJ5IHR5cGUuICovCi0JdWludDhfdCBlbnRyeV9jb3VudDsJCS8qIEVudHJ5IGNvdW50LiAqLwotCXVpbnQ4X3QgaGFuZGxlX2NvdW50OwkJLyogSGFuZGxlIGNvdW50LiAqLwotCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkJLyogRW50cnkgU3RhdHVzLiAqLwotCi0JdWludDMyX3QgaGFuZGxlOwkJLyogU3lzdGVtIGhhbmRsZS4gKi8KLQl1aW50MzJfdCBoYW5kbGVfaGk7CQkvKiBTeXN0ZW0gaGFuZGxlLiAqLwotCi0JdWludDE2X3QgdGd0X2lkOwkJLyogVGFyZ2V0IElELiAqLwotCi0JdWludDhfdCBtb2RpZmllcjsJCS8qIE1vZGlmaWVyICg3LTApLiAqLwotCXVpbnQ4X3QgcmVzZXJ2ZWRfMTsKLQotCXVpbnQ4X3QgcmVzZXJ2ZWRfMls1XTsKLQotCXVpbnQ4X3QgbHVuWzhdOwkJCS8qIEZDUCBMVU4gKEJFKS4gKi8KLQl1aW50OF90IHJlc2VydmVkXzNbMzZdOwotfTsKLQotCiAjZGVmaW5lCVNUQVRVU19UWVBFX0ZYMDAJMHgwMQkJLyogU3RhdHVzIGVudHJ5LiAqLwogc3RydWN0IHN0c19lbnRyeV9meDAwIHsKIAl1aW50OF90IGVudHJ5X3R5cGU7CQkvKiBFbnRyeSB0eXBlLiAqLwpAQCAtNzksNyArNTgsNyBAQAogCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkJLyogRW50cnkgU3RhdHVzLiAqLwogCiAJdWludDMyX3QgaGFuZGxlOwkJLyogU3lzdGVtIGhhbmRsZS4gKi8KLQl1aW50MzJfdCBoYW5kbGVfaGk7CQkvKiBTeXN0ZW0gaGFuZGxlLiAqLworCXVpbnQzMl90IHJlc2VydmVkXzM7CQkvKiBTeXN0ZW0gaGFuZGxlLiAqLwogCiAJX19sZTE2IGNvbXBfc3RhdHVzOwkJLyogQ29tcGxldGlvbiBzdGF0dXMuICovCiAJdWludDE2X3QgcmVzZXJ2ZWRfMDsJCS8qIE9YX0lEIHVzZWQgYnkgdGhlIGZpcm13YXJlLiAqLwpAQCAtMTAyLDcgKzgxLDcgQEAKIAogc3RydWN0IG11bHRpX3N0c19lbnRyeV9meDAwIHsKIAl1aW50OF90IGVudHJ5X3R5cGU7CQkvKiBFbnRyeSB0eXBlLiAqLwotCXVpbnQ4X3Qgc3lzX2RlZmluZTsJCS8qIFN5c3RlbSBkZWZpbmVkLiAqLworCXVpbnQ4X3QgZW50cnlfY291bnQ7CQkvKiBFbnRyeSBjb3VudC4gKi8KIAl1aW50OF90IGhhbmRsZV9jb3VudDsKIAl1aW50OF90IGVudHJ5X3N0YXR1czsKIApAQCAtMTE4LDE1ICs5NywxMyBAQAogCiAJX19sZTMyIGhhbmRsZTsJCS8qIFN5c3RlbSBoYW5kbGUuICovCiAKLQl1aW50MzJfdCBoYW5kbGVfaGk7CQkvKiBTeXN0ZW0gaGFuZGxlLiAqLworCXVpbnQzMl90IHJlc2VydmVkXzA7CiAKIAlfX2xlMTYgdGd0X2lkOwkJLyogVGFyZ2V0IElkeC4gKi8KIAogCXVpbnQxNl90IHJlc2VydmVkXzE7Ci0KLQl1aW50MTZfdCBkZWxheTsJCQkvKiBBY3Rpdml0eSBkZWxheSBpbiBzZWNvbmRzLiAqLwotCi0JX19sZTE2IHRpbWVvdXQ7CQkvKiBDb21tYW5kIHRpbWVvdXQuICovCisJdWludDE2X3QgcmVzZXJ2ZWRfMzsKKwl1aW50MTZfdCByZXNlcnZlZF80OwogCiAJc3RydWN0IHNjc2lfbHVuIGx1bjsJCS8qIExVTiAoTEUpLiAqLwogCkBAIC0xNDQsMTMgKzEyMSwxMyBAQAogCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkJLyogRW50cnkgU3RhdHVzLiAqLwogCiAJX19sZTMyIGhhbmRsZTsJCS8qIFN5c3RlbSBoYW5kbGUuICovCi0JX19sZTMyIGhhbmRsZV9oaTsJCS8qIFN5c3RlbSBoYW5kbGUuICovCisJX19sZTMyIHJlc2VydmVkXzA7CiAKIAlfX2xlMTYgdGd0X2lkX3N0czsJCS8qIENvbXBsZXRpb24gc3RhdHVzLiAqLwogCV9fbGUxNiBvcHRpb25zOwogCiAJX19sZTMyIGFib3J0X2hhbmRsZTsJCS8qIFN5c3RlbSBoYW5kbGUuICovCi0JX19sZTMyIGFib3J0X2hhbmRsZV9oaTsJLyogU3lzdGVtIGhhbmRsZS4gKi8KKwlfX2xlMzIgcmVzZXJ2ZWRfMjsKIAogCV9fbGUxNiByZXFfcXVlX25vOwogCXVpbnQ4X3QgcmVzZXJ2ZWRfMVszOF07CkBAIC0xNzEsOCArMTQ4LDcgQEAKIAogCV9fbGUzMiBkYXRhd29yZF9yOwkJLyogRGF0YSB3b3JkIHJldHVybmVkICovCiAJdWludDMyX3QgYWRhcGlkOwkJLyogQWRhcHRlciBJRCAqLwotCXVpbnQzMl90IGFkYXBpZF9oaTsJCS8qIEFkYXB0ZXIgSUQgaGlnaCAqLwotCXVpbnQzMl90IHJlc2VydmVkXzE7CisJdWludDMyX3QgZGF0YXdvcmRfcl9leHRyYTsKIAogCV9fbGUzMiBzZXFfbm87CiAJdWludDhfdCByZXNlcnZlZF8yWzIwXTsKQEAgLTM2MCwxMSArMzM2LDcgQEAKIAogI2RlZmluZSBRTEFGWDAwX0lOVFJfTUJfQ01QTFQJCTB4MQogI2RlZmluZSBRTEFGWDAwX0lOVFJfUlNQX0NNUExUCQkweDIKLSNkZWZpbmUgUUxBRlgwMF9JTlRSX01CX1JTUF9DTVBMVAkweDMKICNkZWZpbmUgUUxBRlgwMF9JTlRSX0FTWU5DX0NNUExUCTB4NAotI2RlZmluZSBRTEFGWDAwX0lOVFJfTUJfQVNZTkNfQ01QTFQJMHg1Ci0jZGVmaW5lIFFMQUZYMDBfSU5UUl9SU1BfQVNZTkNfQ01QTFQJMHg2Ci0jZGVmaW5lIFFMQUZYMDBfSU5UUl9BTExfQ01QTFQJCTB4NwogCiAjZGVmaW5lIFFMQUZYMDBfTUJBX1NZU1RFTV9FUlIJCTB4ODAwMgogI2RlZmluZSBRTEFGWDAwX01CQV9URU1QX09WRVIJCTB4ODAwNQpAQCAtNTQ4LDQgKzUyMCw3IEBACiAvKiBNYXggY29ubmN1cnJlbnQgSU9zIHRoYXQgY2FuIGJlIHF1ZXVlZCAqLwogI2RlZmluZSBRTEFGWDAwX01BWF9DQU5RVUVVRQkJMTAyNAogCisvKiBJT0NUTCBJT0NCIGFib3J0IHN1Y2Nlc3MgKi8KKyNkZWZpbmUgUUxBRlgwMF9JT0NUTF9JQ09CX0FCT1JUX1NVQ0NFU1MJMHg2OAorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmMKaW5kZXggMWU2YmE0YS4uNTUxMWUyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmMKQEAgLTE2NjQsMTAgKzE2NjQsMTAgQEAKIAkvKiBNYXBwaW5nIG9mIElPIGJhc2UgcG9pbnRlciAqLwogCWlmIChJU19RTEE4MDQ0KGhhKSkgewogCQloYS0+aW9iYXNlID0KLQkJICAgIChkZXZpY2VfcmVnX3QgX19pb21lbSAqKSgodWludDhfdCAqKWhhLT5ueF9wY2liYXNlKTsKKwkJICAgIChkZXZpY2VfcmVnX3QgKikoKHVpbnQ4X3QgKiloYS0+bnhfcGNpYmFzZSk7CiAJfSBlbHNlIGlmIChJU19RTEE4MlhYKGhhKSkgewogCQloYS0+aW9iYXNlID0KLQkJICAgIChkZXZpY2VfcmVnX3QgX19pb21lbSAqKSgodWludDhfdCAqKWhhLT5ueF9wY2liYXNlICsKKwkJICAgIChkZXZpY2VfcmVnX3QgKikoKHVpbnQ4X3QgKiloYS0+bnhfcGNpYmFzZSArCiAJCQkweGJjMDAwICsgKGhhLT5wZGV2LT5kZXZmbiA8PCAxMSkpOwogCX0KIApAQCAtNDUwMiwzICs0NTAyLDIwIEBACiAJcWxhODJ4eF9pZGNfdW5sb2NrKGhhKTsKIAlyZXR1cm4gcnZhbDsKIH0KKwordm9pZAorcWxhODJ4eF9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBpbnQgaGFyZHdhcmVfbG9ja2VkKQoreworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCisJaWYgKCFoYS0+YWxsb3dfY25hX2Z3X2R1bXApCisJCXJldHVybjsKKworCXNjc2lfYmxvY2tfcmVxdWVzdHModmhhLT5ob3N0KTsKKwloYS0+ZmxhZ3MuaXNwODJ4eF9ub19tZF9jYXAgPSAxOworCXFsYTgyeHhfaWRjX2xvY2soaGEpOworCXFsYTgyeHhfc2V0X3Jlc2V0X293bmVyKHZoYSk7CisJcWxhODJ4eF9pZGNfdW5sb2NrKGhhKTsKKwlxbGEyeDAwX3dhaXRfZm9yX2NoaXBfcmVzZXQodmhhKTsKKwlzY3NpX3VuYmxvY2tfcmVxdWVzdHModmhhLT5ob3N0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueDIuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueDIuYwppbmRleCBmNjA5ODlkLi44NmNmMTA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbngyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254Mi5jCkBAIC0xNTc4LDggKzE1NzgsOCBAQAogCQlkbyB7CiAJCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBkZXZfaW5pdF90aW1lb3V0KSkgewogCQkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweGIwYzQsCi0JCQkJICAgICIlczogTm9uIFJlc2V0IG93bmVyIERFViBJTklUICIKLQkJCQkgICAgIlRJTUVPVVQhXG4iLCBfX2Z1bmNfXyk7CisJCQkJICAgICIlczogTm9uIFJlc2V0IG93bmVyOiBSZXNldCBBY2sgVGltZW91dCFcbiIsCisJCQkJICAgIF9fZnVuY19fKTsKIAkJCQlicmVhazsKIAkJCX0KIApAQCAtMjAxNCw4ICsyMDE0LDYgQEAKIAogCS8qIGRvbid0IHBvbGwgaWYgcmVzZXQgaXMgZ29pbmcgb24gb3IgRlcgaGFuZyBpbiBxdWllc2NlbnQgc3RhdGUgKi8KIAlpZiAoISh0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmdmhhLT5kcGNfZmxhZ3MpIHx8Ci0JICAgIHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncykgfHwKLQkgICAgdGVzdF9iaXQoSVNQX0FCT1JUX1JFVFJZLCAmdmhhLT5kcGNfZmxhZ3MpIHx8CiAJICAgIHRlc3RfYml0KEZDT0VfQ1RYX1JFU0VUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSkpIHsKIAkJZGV2X3N0YXRlID0gcWxhODA0NF9yZF9kaXJlY3QodmhhLCBRTEE4MDQ0X0NSQl9ERVZfU1RBVEVfSU5ERVgpOwogCkBAIC0zNzE1LDMgKzM3MTMsMTkgQEAKIAlyZXR1cm4gcnZhbDsKIH0KIAordm9pZAorcWxhODA0NF9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBpbnQgaGFyZHdhcmVfbG9ja2VkKQoreworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCisJaWYgKCFoYS0+YWxsb3dfY25hX2Z3X2R1bXApCisJCXJldHVybjsKKworCXNjc2lfYmxvY2tfcmVxdWVzdHModmhhLT5ob3N0KTsKKwloYS0+ZmxhZ3MuaXNwODJ4eF9ub19tZF9jYXAgPSAxOworCXFsYTgwNDRfaWRjX2xvY2soaGEpOworCXFsYTgyeHhfc2V0X3Jlc2V0X293bmVyKHZoYSk7CisJcWxhODA0NF9pZGNfdW5sb2NrKGhhKTsKKwlxbGEyeDAwX3dhaXRfZm9yX2NoaXBfcmVzZXQodmhhKTsKKwlzY3NpX3VuYmxvY2tfcmVxdWVzdHModmhhLT5ob3N0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKaW5kZXggODlhNTMwMC4uMTllOTljYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKQEAgLTEyMCwxNSArMTIwLDE3IEBACiBpbnQgcWwyeGVuYWJsZWRpZiA9IDI7CiBtb2R1bGVfcGFyYW0ocWwyeGVuYWJsZWRpZiwgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MocWwyeGVuYWJsZWRpZiwKLQkJIiBFbmFibGUgVDEwLUNSQy1ESUYgIgotCQkiIERlZmF1bHQgaXMgMCAtIE5vIERJRiBTdXBwb3J0LiAxIC0gRW5hYmxlIGl0IgotCQkiLCAyIC0gRW5hYmxlIERJRiBmb3IgYWxsIHR5cGVzLCBleGNlcHQgVHlwZSAwLiIpOworCQkiIEVuYWJsZSBUMTAtQ1JDLURJRjpcbiIKKwkJIiBEZWZhdWx0IGlzIDIuXG4iCisJCSIgIDAgLS0gTm8gRElGIFN1cHBvcnRcbiIKKwkJIiAgMSAtLSBFbmFibGUgRElGIGZvciBhbGwgdHlwZXNcbiIKKwkJIiAgMiAtLSBFbmFibGUgRElGIGZvciBhbGwgdHlwZXMsIGV4Y2VwdCBUeXBlIDAuXG4iKTsKIAogaW50IHFsMnhlbmFibGVoYmFfZXJyX2NoayA9IDI7CiBtb2R1bGVfcGFyYW0ocWwyeGVuYWJsZWhiYV9lcnJfY2hrLCBpbnQsIFNfSVJVR098U19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKHFsMnhlbmFibGVoYmFfZXJyX2NoaywKIAkJIiBFbmFibGUgVDEwLUNSQy1ESUYgRXJyb3IgaXNvbGF0aW9uIGJ5IEhCQTpcbiIKLQkJIiBEZWZhdWx0IGlzIDEuXG4iCisJCSIgRGVmYXVsdCBpcyAyLlxuIgogCQkiICAwIC0tIEVycm9yIGlzb2xhdGlvbiBkaXNhYmxlZFxuIgogCQkiICAxIC0tIEVycm9yIGlzb2xhdGlvbiBlbmFibGVkIG9ubHkgZm9yIERJWCBUeXBlIDBcbiIKIAkJIiAgMiAtLSBFcnJvciBpc29sYXRpb24gZW5hYmxlZCBmb3IgYWxsIFR5cGVzXG4iKTsKQEAgLTE5NzUsNyArMTk3Nyw3IEBACiAJLnByZXBfbXNfZmRtaV9pb2NiCT0gcWxhMjR4eF9wcmVwX21zX2ZkbWlfaW9jYiwKIAkucmVhZF9udnJhbQkJPSBxbGEyNHh4X3JlYWRfbnZyYW1fZGF0YSwKIAkud3JpdGVfbnZyYW0JCT0gcWxhMjR4eF93cml0ZV9udnJhbV9kYXRhLAotCS5md19kdW1wCQk9IHFsYTI0eHhfZndfZHVtcCwKKwkuZndfZHVtcAkJPSBxbGE4Mnh4X2Z3X2R1bXAsCiAJLmJlYWNvbl9vbgkJPSBxbGE4Mnh4X2JlYWNvbl9vbiwKIAkuYmVhY29uX29mZgkJPSBxbGE4Mnh4X2JlYWNvbl9vZmYsCiAJLmJlYWNvbl9ibGluawkJPSBOVUxMLApAQCAtMjAxMywxMSArMjAxNSwxMSBAQAogCS5wcmVwX21zX2ZkbWlfaW9jYgk9IHFsYTI0eHhfcHJlcF9tc19mZG1pX2lvY2IsCiAJLnJlYWRfbnZyYW0JCT0gTlVMTCwKIAkud3JpdGVfbnZyYW0JCT0gTlVMTCwKLQkuZndfZHVtcAkJPSBxbGEyNHh4X2Z3X2R1bXAsCisJLmZ3X2R1bXAJCT0gcWxhODA0NF9md19kdW1wLAogCS5iZWFjb25fb24JCT0gcWxhODJ4eF9iZWFjb25fb24sCiAJLmJlYWNvbl9vZmYJCT0gcWxhODJ4eF9iZWFjb25fb2ZmLAogCS5iZWFjb25fYmxpbmsJCT0gTlVMTCwKLQkucmVhZF9vcHRyb20JCT0gcWxhODJ4eF9yZWFkX29wdHJvbV9kYXRhLAorCS5yZWFkX29wdHJvbQkJPSBxbGE4MDQ0X3JlYWRfb3B0cm9tX2RhdGEsCiAJLndyaXRlX29wdHJvbQkJPSBxbGE4MDQ0X3dyaXRlX29wdHJvbV9kYXRhLAogCS5nZXRfZmxhc2hfdmVyc2lvbgk9IHFsYTgyeHhfZ2V0X2ZsYXNoX3ZlcnNpb24sCiAJLnN0YXJ0X3Njc2kgICAgICAgICAgICAgPSBxbGE4Mnh4X3N0YXJ0X3Njc2ksCkBAIC0yMDc4LDcgKzIwODAsNyBAQAogCS5pbnRyX2hhbmRsZXIJCT0gcWxhZngwMF9pbnRyX2hhbmRsZXIsCiAJLmVuYWJsZV9pbnRycwkJPSBxbGFmeDAwX2VuYWJsZV9pbnRycywKIAkuZGlzYWJsZV9pbnRycwkJPSBxbGFmeDAwX2Rpc2FibGVfaW50cnMsCi0JLmFib3J0X2NvbW1hbmQJCT0gcWxhZngwMF9hYm9ydF9jb21tYW5kLAorCS5hYm9ydF9jb21tYW5kCQk9IHFsYTI0eHhfYXN5bmNfYWJvcnRfY29tbWFuZCwKIAkudGFyZ2V0X3Jlc2V0CQk9IHFsYWZ4MDBfYWJvcnRfdGFyZ2V0LAogCS5sdW5fcmVzZXQJCT0gcWxhZngwMF9sdW5fcmVzZXQsCiAJLmZhYnJpY19sb2dpbgkJPSBOVUxMLApAQCAtMjEwMiw2ICsyMTA0LDQ0IEBACiAJLmluaXRpYWxpemVfYWRhcHRlcgk9IHFsYWZ4MDBfaW5pdGlhbGl6ZV9hZGFwdGVyLAogfTsKIAorc3RhdGljIHN0cnVjdCBpc3Bfb3BlcmF0aW9ucyBxbGEyN3h4X2lzcF9vcHMgPSB7CisJLnBjaV9jb25maWcJCT0gcWxhMjV4eF9wY2lfY29uZmlnLAorCS5yZXNldF9jaGlwCQk9IHFsYTI0eHhfcmVzZXRfY2hpcCwKKwkuY2hpcF9kaWFnCQk9IHFsYTI0eHhfY2hpcF9kaWFnLAorCS5jb25maWdfcmluZ3MJCT0gcWxhMjR4eF9jb25maWdfcmluZ3MsCisJLnJlc2V0X2FkYXB0ZXIJCT0gcWxhMjR4eF9yZXNldF9hZGFwdGVyLAorCS5udnJhbV9jb25maWcJCT0gcWxhODF4eF9udnJhbV9jb25maWcsCisJLnVwZGF0ZV9md19vcHRpb25zCT0gcWxhODF4eF91cGRhdGVfZndfb3B0aW9ucywKKwkubG9hZF9yaXNjCQk9IHFsYTgxeHhfbG9hZF9yaXNjLAorCS5wY2lfaW5mb19zdHIJCT0gcWxhMjR4eF9wY2lfaW5mb19zdHIsCisJLmZ3X3ZlcnNpb25fc3RyCQk9IHFsYTI0eHhfZndfdmVyc2lvbl9zdHIsCisJLmludHJfaGFuZGxlcgkJPSBxbGEyNHh4X2ludHJfaGFuZGxlciwKKwkuZW5hYmxlX2ludHJzCQk9IHFsYTI0eHhfZW5hYmxlX2ludHJzLAorCS5kaXNhYmxlX2ludHJzCQk9IHFsYTI0eHhfZGlzYWJsZV9pbnRycywKKwkuYWJvcnRfY29tbWFuZAkJPSBxbGEyNHh4X2Fib3J0X2NvbW1hbmQsCisJLnRhcmdldF9yZXNldAkJPSBxbGEyNHh4X2Fib3J0X3RhcmdldCwKKwkubHVuX3Jlc2V0CQk9IHFsYTI0eHhfbHVuX3Jlc2V0LAorCS5mYWJyaWNfbG9naW4JCT0gcWxhMjR4eF9sb2dpbl9mYWJyaWMsCisJLmZhYnJpY19sb2dvdXQJCT0gcWxhMjR4eF9mYWJyaWNfbG9nb3V0LAorCS5jYWxjX3JlcV9lbnRyaWVzCT0gTlVMTCwKKwkuYnVpbGRfaW9jYnMJCT0gTlVMTCwKKwkucHJlcF9tc19pb2NiCQk9IHFsYTI0eHhfcHJlcF9tc19pb2NiLAorCS5wcmVwX21zX2ZkbWlfaW9jYgk9IHFsYTI0eHhfcHJlcF9tc19mZG1pX2lvY2IsCisJLnJlYWRfbnZyYW0JCT0gTlVMTCwKKwkud3JpdGVfbnZyYW0JCT0gTlVMTCwKKwkuZndfZHVtcAkJPSBxbGEyN3h4X2Z3ZHVtcCwKKwkuYmVhY29uX29uCQk9IHFsYTI0eHhfYmVhY29uX29uLAorCS5iZWFjb25fb2ZmCQk9IHFsYTI0eHhfYmVhY29uX29mZiwKKwkuYmVhY29uX2JsaW5rCQk9IHFsYTgzeHhfYmVhY29uX2JsaW5rLAorCS5yZWFkX29wdHJvbQkJPSBxbGEyNXh4X3JlYWRfb3B0cm9tX2RhdGEsCisJLndyaXRlX29wdHJvbQkJPSBxbGEyNHh4X3dyaXRlX29wdHJvbV9kYXRhLAorCS5nZXRfZmxhc2hfdmVyc2lvbgk9IHFsYTI0eHhfZ2V0X2ZsYXNoX3ZlcnNpb24sCisJLnN0YXJ0X3Njc2kJCT0gcWxhMjR4eF9kaWZfc3RhcnRfc2NzaSwKKwkuYWJvcnRfaXNwCQk9IHFsYTJ4MDBfYWJvcnRfaXNwLAorCS5pb3NwYWNlX2NvbmZpZwkJPSBxbGE4M3h4X2lvc3BhY2VfY29uZmlnLAorCS5pbml0aWFsaXplX2FkYXB0ZXIJPSBxbGEyeDAwX2luaXRpYWxpemVfYWRhcHRlciwKK307CisKIHN0YXRpYyBpbmxpbmUgdm9pZAogcWxhMngwMF9zZXRfaXNwX2ZsYWdzKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEpCiB7CkBAIC0yMjIzLDIxICsyMjYzLDI5IEBACiAJY2FzZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1BGMDAxOgogCQloYS0+ZGV2aWNlX3R5cGUgfD0gRFRfSVNQRlgwMDsKIAkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMDcxOgorCQloYS0+ZGV2aWNlX3R5cGUgfD0gRFRfSVNQMjA3MTsKKwkJaGEtPmRldmljZV90eXBlIHw9IERUX1pJT19TVVBQT1JURUQ7CisJCWhhLT5kZXZpY2VfdHlwZSB8PSBEVF9GV0kyOworCQloYS0+ZGV2aWNlX3R5cGUgfD0gRFRfSUlETUE7CisJCWhhLT5md19zcmlzY19hZGRyZXNzID0gUklTQ19TVEFSVF9BRERSRVNTXzI0MDA7CisJCWJyZWFrOwogCX0KIAogCWlmIChJU19RTEE4MlhYKGhhKSkKLQkJaGEtPnBvcnRfbm8gPSAhKGhhLT5wb3J0bnVtICYgMSk7Ci0JZWxzZQorCQloYS0+cG9ydF9ubyA9IGhhLT5wb3J0bnVtICYgMTsKKwllbHNlIHsKIAkJLyogR2V0IGFkYXB0ZXIgcGh5c2ljYWwgcG9ydCBubyBmcm9tIGludGVycnVwdCBwaW4gcmVnaXN0ZXIuICovCiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGhhLT5wZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJmhhLT5wb3J0X25vKTsKKwkJaWYgKElTX1FMQTI3WFgoaGEpKQorCQkJaGEtPnBvcnRfbm8tLTsKKwkJZWxzZQorCQkJaGEtPnBvcnRfbm8gPSAhKGhhLT5wb3J0X25vICYgMSk7CisJfQogCi0JaWYgKGhhLT5wb3J0X25vICYgMSkKLQkJaGEtPmZsYWdzLnBvcnQwID0gMTsKLQllbHNlCi0JCWhhLT5mbGFncy5wb3J0MCA9IDA7CiAJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgaGEtPnBkZXYsIDB4MDAwYiwKIAkgICAgImRldmljZV90eXBlPTB4JXggcG9ydD0lZCBmd19zcmlzY19hZGRyZXNzPTB4JXguXG4iLAotCSAgICBoYS0+ZGV2aWNlX3R5cGUsIGhhLT5mbGFncy5wb3J0MCwgaGEtPmZ3X3NyaXNjX2FkZHJlc3MpOworCSAgICBoYS0+ZGV2aWNlX3R5cGUsIGhhLT5wb3J0X25vLCBoYS0+Zndfc3Jpc2NfYWRkcmVzcyk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0yMjk3LDcgKzIzNDUsOCBAQAogCSAgICBwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjAzMSB8fAogCSAgICBwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQODAzMSB8fAogCSAgICBwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQRjAwMSB8fAotCSAgICBwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQODA0NCkgeworCSAgICBwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQODA0NCB8fAorCSAgICBwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjA3MSkgewogCQliYXJzID0gcGNpX3NlbGVjdF9iYXJzKHBkZXYsIElPUkVTT1VSQ0VfTUVNKTsKIAkJbWVtX29ubHkgPSAxOwogCQlxbF9kYmdfcGNpKHFsX2RiZ19pbml0LCBwZGV2LCAweDAwMDcsCkBAIC0yMzM0LDEzICsyMzgzLDE0IEBACiAJc3Bpbl9sb2NrX2luaXQoJmhhLT5oYXJkd2FyZV9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmaGEtPnZwb3J0X3Nsb2NrKTsKIAltdXRleF9pbml0KCZoYS0+c2VsZmxvZ2luX2xvY2spOworCW11dGV4X2luaXQoJmhhLT5vcHRyb21fbXV0ZXgpOwogCiAJLyogU2V0IElTUC10eXBlIGluZm9ybWF0aW9uLiAqLwogCXFsYTJ4MDBfc2V0X2lzcF9mbGFncyhoYSk7CiAKIAkvKiBTZXQgRUVIIHJlc2V0IHR5cGUgdG8gZnVuZGFtZW50YWwgaWYgcmVxdWlyZWQgYnkgaGJhICovCiAJaWYgKElTX1FMQTI0WFgoaGEpIHx8IElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpIHx8Ci0JICAgIElTX1FMQTgzWFgoaGEpKQorCSAgICBJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkKIAkJcGRldi0+bmVlZHNfZnJlc2V0ID0gMTsKIAogCWhhLT5wcmV2X3RvcG9sb2d5ID0gMDsKQEAgLTI0ODgsNyArMjUzOCw2IEBACiAJCWhhLT5hZW5fbWJ4X2NvdW50ID0gQUVOX01BSUxCT1hfUkVHSVNURVJfQ09VTlRfRlgwMDsKIAkJcmVxX2xlbmd0aCA9IFJFUVVFU1RfRU5UUllfQ05UX0ZYMDA7CiAJCXJzcF9sZW5ndGggPSBSRVNQT05TRV9FTlRSWV9DTlRfRlgwMDsKLQkJaGEtPmluaXRfY2Jfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW5pdF9jYl9meCk7CiAJCWhhLT5pc3Bfb3BzID0gJnFsYWZ4MDBfaXNwX29wczsKIAkJaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudCA9IDMwOyAvKiBkZWZhdWx0IHZhbHVlICovCiAJCWhhLT5tci5md19oYnRfY250ID0gUUxBRlgwMF9IRUFSVEJFQVRfSU5URVJWQUw7CkBAIC0yNDk3LDYgKzI1NDYsMjIgQEAKIAkJaGEtPm1yLmZ3X2hidF9lbiA9IDE7CiAJCWhhLT5tci5ob3N0X2luZm9fcmVzZW5kID0gZmFsc2U7CiAJCWhhLT5tci5oaW5mb19yZXNlbmRfdGltZXJfdGljayA9IFFMQUZYMDBfSElORk9fUkVTRU5EX0lOVEVSVkFMOworCX0gZWxzZSBpZiAoSVNfUUxBMjdYWChoYSkpIHsKKwkJaGEtPnBvcnRudW0gPSBQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pOworCQloYS0+bWF4X2ZpYnJlX2RldmljZXMgPSBNQVhfRklCUkVfREVWSUNFU18yNDAwOworCQloYS0+bWJ4X2NvdW50ID0gTUFJTEJPWF9SRUdJU1RFUl9DT1VOVDsKKwkJcmVxX2xlbmd0aCA9IFJFUVVFU1RfRU5UUllfQ05UXzI0WFg7CisJCXJzcF9sZW5ndGggPSBSRVNQT05TRV9FTlRSWV9DTlRfMjMwMDsKKwkJaGEtPm1heF9sb29wX2lkID0gU05TX0xBU1RfTE9PUF9JRF8yMzAwOworCQloYS0+aW5pdF9jYl9zaXplID0gc2l6ZW9mKHN0cnVjdCBtaWRfaW5pdF9jYl84MXh4KTsKKwkJaGEtPmdpZF9saXN0X2luZm9fc2l6ZSA9IDg7CisJCWhhLT5vcHRyb21fc2l6ZSA9IE9QVFJPTV9TSVpFXzgzWFg7CisJCWhhLT5udnJhbV9ucGl2X3NpemUgPSBRTEFfTUFYX1ZQT1JUU19RTEEyNVhYOworCQloYS0+aXNwX29wcyA9ICZxbGEyN3h4X2lzcF9vcHM7CisJCWhhLT5mbGFzaF9jb25mX29mZiA9IEZBUlhfQUNDRVNTX0ZMQVNIX0NPTkZfODFYWDsKKwkJaGEtPmZsYXNoX2RhdGFfb2ZmID0gRkFSWF9BQ0NFU1NfRkxBU0hfREFUQV84MVhYOworCQloYS0+bnZyYW1fY29uZl9vZmYgPSB+MDsKKwkJaGEtPm52cmFtX2RhdGFfb2ZmID0gfjA7CiAJfQogCiAJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgcGRldiwgMHgwMDFlLApAQCAtMjUzNiw3ICsyNjAxLDcgQEAKIAkgICAgaGEtPmZsYWdzLmVuYWJsZV82NGJpdF9hZGRyZXNzaW5nID8gImVuYWJsZSIgOgogCSAgICAiZGlzYWJsZSIpOwogCXJldCA9IHFsYTJ4MDBfbWVtX2FsbG9jKGhhLCByZXFfbGVuZ3RoLCByc3BfbGVuZ3RoLCAmcmVxLCAmcnNwKTsKLQlpZiAoIXJldCkgeworCWlmIChyZXQpIHsKIAkJcWxfbG9nX3BjaShxbF9sb2dfZmF0YWwsIHBkZXYsIDB4MDAzMSwKIAkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhZGFwdGVyLCBhYm9ydGluZy5cbiIpOwogCkBAIC0yNTYxLDEwICsyNjI2LDYgQEAKIAogCWhvc3QgPSBiYXNlX3ZoYS0+aG9zdDsKIAliYXNlX3ZoYS0+cmVxID0gcmVxOwotCWlmIChJU19RTEFGWDAwKGhhKSkKLQkJaG9zdC0+Y2FuX3F1ZXVlID0gUUxBRlgwMF9NQVhfQ0FOUVVFVUU7Ci0JZWxzZQotCQlob3N0LT5jYW5fcXVldWUgPSByZXEtPmxlbmd0aCArIDEyODsKIAlpZiAoSVNfUUxBMlhYWF9NSURUWVBFKGhhKSkKIAkJYmFzZV92aGEtPm1nbXRfc3ZyX2xvb3BfaWQgPSAxMCArIGJhc2VfdmhhLT52cF9pZHg7CiAJZWxzZQpAQCAtMjU4NywxMSArMjY0OCw2IEBACiAJCWlmICghSVNfUUxBODJYWChoYSkpCiAJCQlob3N0LT5zZ190YWJsZXNpemUgPSBRTEFfU0dfQUxMOwogCX0KLQlxbF9kYmcocWxfZGJnX2luaXQsIGJhc2VfdmhhLCAweDAwMzIsCi0JICAgICJjYW5fcXVldWU9JWQsIHJlcT0lcCwgIgotCSAgICAibWdtdF9zdnJfbG9vcF9pZD0lZCwgc2dfdGFibGVzaXplPSVkLlxuIiwKLQkgICAgaG9zdC0+Y2FuX3F1ZXVlLCBiYXNlX3ZoYS0+cmVxLAotCSAgICBiYXNlX3ZoYS0+bWdtdF9zdnJfbG9vcF9pZCwgaG9zdC0+c2dfdGFibGVzaXplKTsKIAlob3N0LT5tYXhfaWQgPSBoYS0+bWF4X2ZpYnJlX2RldmljZXM7CiAJaG9zdC0+Y21kX3Blcl9sdW4gPSAzOwogCWhvc3QtPnVuaXF1ZV9pZCA9IGhvc3QtPmhvc3Rfbm87CkBAIC0yNjQ2LDcgKzI3MDIsNyBAQAogCXJlcS0+cmVxX3Ffb3V0ID0gJmhhLT5pb2Jhc2UtPmlzcDI0LnJlcV9xX291dDsKIAlyc3AtPnJzcF9xX2luID0gJmhhLT5pb2Jhc2UtPmlzcDI0LnJzcF9xX2luOwogCXJzcC0+cnNwX3Ffb3V0ID0gJmhhLT5pb2Jhc2UtPmlzcDI0LnJzcF9xX291dDsKLQlpZiAoaGEtPm1xZW5hYmxlIHx8IElTX1FMQTgzWFgoaGEpKSB7CisJaWYgKGhhLT5tcWVuYWJsZSB8fCBJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkgewogCQlyZXEtPnJlcV9xX2luID0gJmhhLT5tcWlvYmFzZS0+aXNwMjVtcS5yZXFfcV9pbjsKIAkJcmVxLT5yZXFfcV9vdXQgPSAmaGEtPm1xaW9iYXNlLT5pc3AyNW1xLnJlcV9xX291dDsKIAkJcnNwLT5yc3BfcV9pbiA9ICZoYS0+bXFpb2Jhc2UtPmlzcDI1bXEucnNwX3FfaW47CkBAIC0yNzA3LDYgKzI3NjMsMTYgQEAKIAkJZ290byBwcm9iZV9mYWlsZWQ7CiAJfQogCisJaWYgKElTX1FMQUZYMDAoaGEpKQorCQlob3N0LT5jYW5fcXVldWUgPSBRTEFGWDAwX01BWF9DQU5RVUVVRTsKKwllbHNlCisJCWhvc3QtPmNhbl9xdWV1ZSA9IHJlcS0+bnVtX291dHN0YW5kaW5nX2NtZHMgLSAxMDsKKworCXFsX2RiZyhxbF9kYmdfaW5pdCwgYmFzZV92aGEsIDB4MDAzMiwKKwkgICAgImNhbl9xdWV1ZT0lZCwgcmVxPSVwLCBtZ210X3N2cl9sb29wX2lkPSVkLCBzZ190YWJsZXNpemU9JWQuXG4iLAorCSAgICBob3N0LT5jYW5fcXVldWUsIGJhc2VfdmhhLT5yZXEsCisJICAgIGJhc2VfdmhhLT5tZ210X3N2cl9sb29wX2lkLCBob3N0LT5zZ190YWJsZXNpemUpOworCiAJaWYgKGhhLT5tcWVuYWJsZSkgewogCQlpZiAocWxhMjV4eF9zZXR1cF9tb2RlKGJhc2VfdmhhKSkgewogCQkJcWxfbG9nKHFsX2xvZ193YXJuLCBiYXNlX3ZoYSwgMHgwMGVjLApAQCAtMjg4Nyw5ICsyOTUzLDkgQEAKIGlvc3BhY2VfY29uZmlnX2ZhaWxlZDoKIAlpZiAoSVNfUDNQX1RZUEUoaGEpKSB7CiAJCWlmICghaGEtPm54X3BjaWJhc2UpCi0JCQlpb3VubWFwKChkZXZpY2VfcmVnX3QgX19pb21lbSAqKWhhLT5ueF9wY2liYXNlKTsKKwkJCWlvdW5tYXAoKGRldmljZV9yZWdfdCAqKWhhLT5ueF9wY2liYXNlKTsKIAkJaWYgKCFxbDJ4ZGJ3cikKLQkJCWlvdW5tYXAoKGRldmljZV9yZWdfdCBfX2lvbWVtICopaGEtPm54ZGJfd3JfcHRyKTsKKwkJCWlvdW5tYXAoKGRldmljZV9yZWdfdCAqKWhhLT5ueGRiX3dyX3B0cik7CiAJfSBlbHNlIHsKIAkJaWYgKGhhLT5pb2Jhc2UpCiAJCQlpb3VubWFwKGhhLT5pb2Jhc2UpOwpAQCAtMzAyMCw5ICszMDg2LDkgQEAKIHsKIAlpZiAoSVNfUUxBODJYWChoYSkpIHsKIAotCQlpb3VubWFwKChkZXZpY2VfcmVnX3QgX19pb21lbSAqKWhhLT5ueF9wY2liYXNlKTsKKwkJaW91bm1hcCgoZGV2aWNlX3JlZ190ICopaGEtPm54X3BjaWJhc2UpOwogCQlpZiAoIXFsMnhkYndyKQotCQkJaW91bm1hcCgoZGV2aWNlX3JlZ190IF9faW9tZW0gKiloYS0+bnhkYl93cl9wdHIpOworCQkJaW91bm1hcCgoZGV2aWNlX3JlZ190ICopaGEtPm54ZGJfd3JfcHRyKTsKIAl9IGVsc2UgewogCQlpZiAoaGEtPmlvYmFzZSkKIAkJCWlvdW5tYXAoaGEtPmlvYmFzZSk7CkBAIC0zMDMzLDcgKzMwOTksNyBAQAogCQlpZiAoaGEtPm1xaW9iYXNlKQogCQkJaW91bm1hcChoYS0+bXFpb2Jhc2UpOwogCi0JCWlmIChJU19RTEE4M1hYKGhhKSAmJiBoYS0+bXNpeGJhc2UpCisJCWlmICgoSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpICYmIGhhLT5tc2l4YmFzZSkKIAkJCWlvdW5tYXAoaGEtPm1zaXhiYXNlKTsKIAl9CiB9CkBAIC0zNDQ3LDcgKzM1MTMsNyBAQAogCQloYS0+bnBpdl9pbmZvID0gTlVMTDsKIAogCS8qIEdldCBjb25zaXN0ZW50IG1lbW9yeSBhbGxvY2F0ZWQgZm9yIEVYLUlOSVQtQ0IuICovCi0JaWYgKElTX0NOQV9DQVBBQkxFKGhhKSB8fCBJU19RTEEyMDMxKGhhKSkgeworCWlmIChJU19DTkFfQ0FQQUJMRShoYSkgfHwgSVNfUUxBMjAzMShoYSkgfHwgSVNfUUxBMjdYWChoYSkpIHsKIAkJaGEtPmV4X2luaXRfY2IgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwKIAkJICAgICZoYS0+ZXhfaW5pdF9jYl9kbWEpOwogCQlpZiAoIWhhLT5leF9pbml0X2NiKQpAQCAtMzQ3OCwxMCArMzU0NCwxMCBAQAogCWVsc2UgewogCQlxbGEyeDAwX3NldF9yZXNlcnZlZF9sb29wX2lkcyhoYSk7CiAJCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIGhhLT5wZGV2LCAweDAxMjMsCi0JCSAgICAibG9vcF9pZF9tYXA9JXAuIFxuIiwgaGEtPmxvb3BfaWRfbWFwKTsKKwkJICAgICJsb29wX2lkX21hcD0lcC5cbiIsIGhhLT5sb29wX2lkX21hcCk7CiAJfQogCi0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiAKIGZhaWxfYXN5bmNfcGQ6CiAJZG1hX3Bvb2xfZnJlZShoYS0+c19kbWFfcG9vbCwgaGEtPmV4X2luaXRfY2IsIGhhLT5leF9pbml0X2NiX2RtYSk7CkBAIC0zNTYyLDIyICszNjI4LDI4IEBACiBxbGEyeDAwX2ZyZWVfZndfZHVtcChzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQogewogCWlmIChoYS0+ZmNlKQotCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgRkNFX1NJWkUsIGhhLT5mY2UsCi0JCSAgICBoYS0+ZmNlX2RtYSk7CisJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCQkgICAgRkNFX1NJWkUsIGhhLT5mY2UsIGhhLT5mY2VfZG1hKTsKIAotCWlmIChoYS0+ZndfZHVtcCkgewotCQlpZiAoaGEtPmVmdCkKLQkJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAotCQkJICAgIG50b2hsKGhhLT5md19kdW1wLT5lZnRfc2l6ZSksIGhhLT5lZnQsIGhhLT5lZnRfZG1hKTsKKwlpZiAoaGEtPmVmdCkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCisJCSAgICBFRlRfU0laRSwgaGEtPmVmdCwgaGEtPmVmdF9kbWEpOworCisJaWYgKGhhLT5md19kdW1wKQogCQl2ZnJlZShoYS0+ZndfZHVtcCk7Ci0JfQorCWlmIChoYS0+ZndfZHVtcF90ZW1wbGF0ZSkKKwkJdmZyZWUoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpOworCiAJaGEtPmZjZSA9IE5VTEw7CiAJaGEtPmZjZV9kbWEgPSAwOwogCWhhLT5lZnQgPSBOVUxMOwogCWhhLT5lZnRfZG1hID0gMDsKLQloYS0+ZndfZHVtcCA9IE5VTEw7CiAJaGEtPmZ3X2R1bXBlZCA9IDA7CiAJaGEtPmZ3X2R1bXBfcmVhZGluZyA9IDA7CisJaGEtPmZ3X2R1bXAgPSBOVUxMOworCWhhLT5md19kdW1wX2xlbiA9IDA7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGUgPSBOVUxMOworCWhhLT5md19kdW1wX3RlbXBsYXRlX2xlbiA9IDA7CiB9CiAKIC8qCkBAIC01MjQyLDcgKzUzMTQsNyBAQAogCiAvKiBGaXJtd2FyZSBpbnRlcmZhY2Ugcm91dGluZXMuICovCiAKLSNkZWZpbmUgRldfQkxPQlMJMTAKKyNkZWZpbmUgRldfQkxPQlMJMTEKICNkZWZpbmUgRldfSVNQMjFYWAkwCiAjZGVmaW5lIEZXX0lTUDIyWFgJMQogI2RlZmluZSBGV19JU1AyMzAwCTIKQEAgLTUyNTMsNiArNTMyNSw3IEBACiAjZGVmaW5lIEZXX0lTUDgyWFgJNwogI2RlZmluZSBGV19JU1AyMDMxCTgKICNkZWZpbmUgRldfSVNQODAzMQk5CisjZGVmaW5lIEZXX0lTUDIwNzEJMTAKIAogI2RlZmluZSBGV19GSUxFX0lTUDIxWFgJInFsMjEwMF9mdy5iaW4iCiAjZGVmaW5lIEZXX0ZJTEVfSVNQMjJYWAkicWwyMjAwX2Z3LmJpbiIKQEAgLTUyNjQsNiArNTMzNyw4IEBACiAjZGVmaW5lIEZXX0ZJTEVfSVNQODJYWAkicWw4MjAwX2Z3LmJpbiIKICNkZWZpbmUgRldfRklMRV9JU1AyMDMxCSJxbDI2MDBfZncuYmluIgogI2RlZmluZSBGV19GSUxFX0lTUDgwMzEJInFsODMwMF9mdy5iaW4iCisjZGVmaW5lIEZXX0ZJTEVfSVNQMjA3MQkicWwyNzAwX2Z3LmJpbiIKKwogCiBzdGF0aWMgREVGSU5FX01VVEVYKHFsYV9md19sb2NrKTsKIApAQCAtNTI3OCw2ICs1MzUzLDcgQEAKIAl7IC5uYW1lID0gRldfRklMRV9JU1A4MlhYLCB9LAogCXsgLm5hbWUgPSBGV19GSUxFX0lTUDIwMzEsIH0sCiAJeyAubmFtZSA9IEZXX0ZJTEVfSVNQODAzMSwgfSwKKwl7IC5uYW1lID0gRldfRklMRV9JU1AyMDcxLCB9LAogfTsKIAogc3RydWN0IGZ3X2Jsb2IgKgpAQCAtNTMwNiw2ICs1MzgyLDggQEAKIAkJYmxvYiA9ICZxbGFfZndfYmxvYnNbRldfSVNQMjAzMV07CiAJfSBlbHNlIGlmIChJU19RTEE4MDMxKGhhKSkgewogCQlibG9iID0gJnFsYV9md19ibG9ic1tGV19JU1A4MDMxXTsKKwl9IGVsc2UgaWYgKElTX1FMQTIwNzEoaGEpKSB7CisJCWJsb2IgPSAmcWxhX2Z3X2Jsb2JzW0ZXX0lTUDIwNzFdOwogCX0gZWxzZSB7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTU2MzUsNiArNTcxMyw3IEBACiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUUxPR0lDLCBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4MDMxKSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1FMT0dJQywgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQRjAwMSkgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9RTE9HSUMsIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgwNDQpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUUxPR0lDLCBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMDcxKSB9LAogCXsgMCB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBxbGEyeHh4X3BjaV90YmwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCmluZGV4IGJkNTZjZGUuLmYyODEyM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMKQEAgLTU2OCw3ICs1NjgsNyBAQAogCWVsc2UgaWYgKElTX1AzUF9UWVBFKGhhKSkgewogCQkqc3RhcnQgPSBGQV9GTEFTSF9MQVlPVVRfQUREUl84MjsKIAkJZ290byBlbmQ7Ci0JfSBlbHNlIGlmIChJU19RTEE4M1hYKGhhKSkgeworCX0gZWxzZSBpZiAoSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpIHsKIAkJKnN0YXJ0ID0gRkFfRkxBU0hfTEFZT1VUX0FERFJfODM7CiAJCWdvdG8gZW5kOwogCX0KQEAgLTY4Miw3ICs2ODIsNyBAQAogCS8qIEFzc2lnbiBGQ1AgcHJpbyByZWdpb24gc2luY2Ugb2xkZXIgYWRhcHRlcnMgbWF5IG5vdCBoYXZlIEZMVCwgb3IKIAkgICBGQ1AgcHJpbyByZWdpb24gaW4gaXQncyBGTFQuCiAJICovCi0JaGEtPmZsdF9yZWdpb25fZmNwX3ByaW8gPSBoYS0+ZmxhZ3MucG9ydDAgPworCWhhLT5mbHRfcmVnaW9uX2ZjcF9wcmlvID0gKGhhLT5wb3J0X25vID09IDApID8KIAkgICAgZmNwX3ByaW9fY2ZnMFtkZWZdIDogZmNwX3ByaW9fY2ZnMVtkZWZdOwogCiAJaGEtPmZsdF9yZWdpb25fZmx0ID0gZmx0X2FkZHI7CkBAIC03NDMsNDcgKzc0Myw3MSBAQAogCQkJaGEtPmZsdF9yZWdpb25fdnBkX252cmFtID0gc3RhcnQ7CiAJCQlpZiAoSVNfUDNQX1RZUEUoaGEpKQogCQkJCWJyZWFrOwotCQkJaWYgKGhhLT5mbGFncy5wb3J0MCkKKwkJCWlmIChoYS0+cG9ydF9ubyA9PSAwKQogCQkJCWhhLT5mbHRfcmVnaW9uX3ZwZCA9IHN0YXJ0OwogCQkJYnJlYWs7CiAJCWNhc2UgRkxUX1JFR19WUERfMToKIAkJCWlmIChJU19QM1BfVFlQRShoYSkgfHwgSVNfUUxBODAzMShoYSkpCiAJCQkJYnJlYWs7Ci0JCQlpZiAoIWhhLT5mbGFncy5wb3J0MCkKKwkJCWlmIChoYS0+cG9ydF9ubyA9PSAxKQorCQkJCWhhLT5mbHRfcmVnaW9uX3ZwZCA9IHN0YXJ0OworCQkJYnJlYWs7CisJCWNhc2UgRkxUX1JFR19WUERfMjoKKwkJCWlmICghSVNfUUxBMjdYWChoYSkpCisJCQkJYnJlYWs7CisJCQlpZiAoaGEtPnBvcnRfbm8gPT0gMikKKwkJCQloYS0+Zmx0X3JlZ2lvbl92cGQgPSBzdGFydDsKKwkJCWJyZWFrOworCQljYXNlIEZMVF9SRUdfVlBEXzM6CisJCQlpZiAoIUlTX1FMQTI3WFgoaGEpKQorCQkJCWJyZWFrOworCQkJaWYgKGhhLT5wb3J0X25vID09IDMpCiAJCQkJaGEtPmZsdF9yZWdpb25fdnBkID0gc3RhcnQ7CiAJCQlicmVhazsKIAkJY2FzZSBGTFRfUkVHX05WUkFNXzA6CiAJCQlpZiAoSVNfUUxBODAzMShoYSkpCiAJCQkJYnJlYWs7Ci0JCQlpZiAoaGEtPmZsYWdzLnBvcnQwKQorCQkJaWYgKGhhLT5wb3J0X25vID09IDApCiAJCQkJaGEtPmZsdF9yZWdpb25fbnZyYW0gPSBzdGFydDsKIAkJCWJyZWFrOwogCQljYXNlIEZMVF9SRUdfTlZSQU1fMToKIAkJCWlmIChJU19RTEE4MDMxKGhhKSkKIAkJCQlicmVhazsKLQkJCWlmICghaGEtPmZsYWdzLnBvcnQwKQorCQkJaWYgKGhhLT5wb3J0X25vID09IDEpCisJCQkJaGEtPmZsdF9yZWdpb25fbnZyYW0gPSBzdGFydDsKKwkJCWJyZWFrOworCQljYXNlIEZMVF9SRUdfTlZSQU1fMjoKKwkJCWlmICghSVNfUUxBMjdYWChoYSkpCisJCQkJYnJlYWs7CisJCQlpZiAoaGEtPnBvcnRfbm8gPT0gMikKKwkJCQloYS0+Zmx0X3JlZ2lvbl9udnJhbSA9IHN0YXJ0OworCQkJYnJlYWs7CisJCWNhc2UgRkxUX1JFR19OVlJBTV8zOgorCQkJaWYgKCFJU19RTEEyN1hYKGhhKSkKKwkJCQlicmVhazsKKwkJCWlmIChoYS0+cG9ydF9ubyA9PSAzKQogCQkJCWhhLT5mbHRfcmVnaW9uX252cmFtID0gc3RhcnQ7CiAJCQlicmVhazsKIAkJY2FzZSBGTFRfUkVHX0ZEVDoKIAkJCWhhLT5mbHRfcmVnaW9uX2ZkdCA9IHN0YXJ0OwogCQkJYnJlYWs7CiAJCWNhc2UgRkxUX1JFR19OUElWX0NPTkZfMDoKLQkJCWlmIChoYS0+ZmxhZ3MucG9ydDApCisJCQlpZiAoaGEtPnBvcnRfbm8gPT0gMCkKIAkJCQloYS0+Zmx0X3JlZ2lvbl9ucGl2X2NvbmYgPSBzdGFydDsKIAkJCWJyZWFrOwogCQljYXNlIEZMVF9SRUdfTlBJVl9DT05GXzE6Ci0JCQlpZiAoIWhhLT5mbGFncy5wb3J0MCkKKwkJCWlmIChoYS0+cG9ydF9ubyA9PSAxKQogCQkJCWhhLT5mbHRfcmVnaW9uX25waXZfY29uZiA9IHN0YXJ0OwogCQkJYnJlYWs7CiAJCWNhc2UgRkxUX1JFR19HT0xEX0ZXOgogCQkJaGEtPmZsdF9yZWdpb25fZ29sZF9mdyA9IHN0YXJ0OwogCQkJYnJlYWs7CiAJCWNhc2UgRkxUX1JFR19GQ1BfUFJJT18wOgotCQkJaWYgKGhhLT5mbGFncy5wb3J0MCkKKwkJCWlmIChoYS0+cG9ydF9ubyA9PSAwKQogCQkJCWhhLT5mbHRfcmVnaW9uX2ZjcF9wcmlvID0gc3RhcnQ7CiAJCQlicmVhazsKIAkJY2FzZSBGTFRfUkVHX0ZDUF9QUklPXzE6Ci0JCQlpZiAoIWhhLT5mbGFncy5wb3J0MCkKKwkJCWlmIChoYS0+cG9ydF9ubyA9PSAxKQogCQkJCWhhLT5mbHRfcmVnaW9uX2ZjcF9wcmlvID0gc3RhcnQ7CiAJCQlicmVhazsKIAkJY2FzZSBGTFRfUkVHX0JPT1RfQ09ERV84MlhYOgpAQCAtODEzLDEzICs4MzcsMTMgQEAKIAkJY2FzZSBGTFRfUkVHX0ZDT0VfTlZSQU1fMDoKIAkJCWlmICghKElTX1FMQTgwMzEoaGEpIHx8IElTX1FMQTgwNDQoaGEpKSkKIAkJCQlicmVhazsKLQkJCWlmIChoYS0+ZmxhZ3MucG9ydDApCisJCQlpZiAoaGEtPnBvcnRfbm8gPT0gMCkKIAkJCQloYS0+Zmx0X3JlZ2lvbl9udnJhbSA9IHN0YXJ0OwogCQkJYnJlYWs7CiAJCWNhc2UgRkxUX1JFR19GQ09FX05WUkFNXzE6CiAJCQlpZiAoIShJU19RTEE4MDMxKGhhKSB8fCBJU19RTEE4MDQ0KGhhKSkpCiAJCQkJYnJlYWs7Ci0JCQlpZiAoIWhhLT5mbGFncy5wb3J0MCkKKwkJCWlmIChoYS0+cG9ydF9ubyA9PSAxKQogCQkJCWhhLT5mbHRfcmVnaW9uX252cmFtID0gc3RhcnQ7CiAJCQlicmVhazsKIAkJfQpAQCAtODMyLDEyICs4NTYsMTIgQEAKIAloYS0+Zmx0X3JlZ2lvbl9mdyA9IGRlZl9md1tkZWZdOwogCWhhLT5mbHRfcmVnaW9uX2Jvb3QgPSBkZWZfYm9vdFtkZWZdOwogCWhhLT5mbHRfcmVnaW9uX3ZwZF9udnJhbSA9IGRlZl92cGRfbnZyYW1bZGVmXTsKLQloYS0+Zmx0X3JlZ2lvbl92cGQgPSBoYS0+ZmxhZ3MucG9ydDAgPworCWhhLT5mbHRfcmVnaW9uX3ZwZCA9IChoYS0+cG9ydF9ubyA9PSAwKSA/CiAJICAgIGRlZl92cGQwW2RlZl0gOiBkZWZfdnBkMVtkZWZdOwotCWhhLT5mbHRfcmVnaW9uX252cmFtID0gaGEtPmZsYWdzLnBvcnQwID8KKwloYS0+Zmx0X3JlZ2lvbl9udnJhbSA9IChoYS0+cG9ydF9ubyA9PSAwKSA/CiAJICAgIGRlZl9udnJhbTBbZGVmXSA6IGRlZl9udnJhbTFbZGVmXTsKIAloYS0+Zmx0X3JlZ2lvbl9mZHQgPSBkZWZfZmR0W2RlZl07Ci0JaGEtPmZsdF9yZWdpb25fbnBpdl9jb25mID0gaGEtPmZsYWdzLnBvcnQwID8KKwloYS0+Zmx0X3JlZ2lvbl9ucGl2X2NvbmYgPSAoaGEtPnBvcnRfbm8gPT0gMCkgPwogCSAgICBkZWZfbnBpdl9jb25mMFtkZWZdIDogZGVmX25waXZfY29uZjFbZGVmXTsKIGRvbmU6CiAJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA0YSwKQEAgLTk4OSw3ICsxMDEzLDcgQEAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCWlmICghSVNfUUxBMjRYWF9UWVBFKGhhKSAmJiAhSVNfUUxBMjVYWChoYSkgJiYKLQkgICAgIUlTX0NOQV9DQVBBQkxFKGhhKSAmJiAhSVNfUUxBMjAzMShoYSkpCisJICAgICFJU19DTkFfQ0FQQUJMRShoYSkgJiYgIUlTX1FMQTIwMzEoaGEpICYmICFJU19RTEEyN1hYKGhhKSkKIAkJcmV0dXJuIFFMQV9TVUNDRVNTOwogCiAJcmV0ID0gcWxhMnh4eF9maW5kX2ZsdF9zdGFydCh2aGEsICZmbHRfYWRkcik7CkBAIC0xMTkyLDcgKzEyMTYsOCBAQAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJLyogUHJlcGFyZSBidXJzdC1jYXBhYmxlIHdyaXRlIG9uIHN1cHBvcnRlZCBJU1BzLiAqLwotCWlmICgoSVNfUUxBMjVYWChoYSkgfHwgSVNfUUxBODFYWChoYSkgfHwgSVNfUUxBODNYWChoYSkpICYmCisJaWYgKChJU19RTEEyNVhYKGhhKSB8fCBJU19RTEE4MVhYKGhhKSB8fCBJU19RTEE4M1hYKGhhKSB8fAorCSAgICBJU19RTEEyN1hYKGhhKSkgJiYKIAkgICAgIShmYWRkciAmIDB4ZmZmKSAmJiBkd29yZHMgPiBPUFRST01fQlVSU1RfRFdPUkRTKSB7CiAJCW9wdHJvbSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgT1BUUk9NX0JVUlNUX1NJWkUsCiAJCSAgICAmb3B0cm9tX2RtYSwgR0ZQX0tFUk5FTCk7CkBAIC0xNjc1LDcgKzE3MDAsNyBAQAogCWlmICghSVNfUUxBODNYWChoYSkpCiAJCWdvdG8gb3V0OwogCi0JaWYgKGhhLT5mbGFncy5wb3J0MCkKKwlpZiAoaGEtPnBvcnRfbm8gPT0gMCkKIAkJbGVkX3NlbGVjdF92YWx1ZSA9IFFMQTgzWFhfTEVEX1BPUlQwOwogCWVsc2UKIAkJbGVkX3NlbGVjdF92YWx1ZSA9IFFMQTgzWFhfTEVEX1BPUlQxOwpAQCAtMjMzMiw3ICsyMzU3LDcgQEAKIAkJCQkgKi8KIAkJCQlyZXN0X2FkZHIgPSAweGZmZmY7CiAJCQkJc2VjX21hc2sgPSAweDEwMDAwOwotCQkJCWJyZWFrOyAgIAorCQkJCWJyZWFrOwogCQkJfQogCQkJLyoKIAkJCSAqIFNUIG0yOXcwMTBiIHBhcnQgLSAxNmtiIHNlY3RvciBzaXplCkBAIC0yNTU4LDcgKzI1ODMsNyBAQAogCXVpbnQzMl90IGZhZGRyLCBsZWZ0LCBidXJzdDsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAotCWlmIChJU19RTEEyNVhYKGhhKSB8fCBJU19RTEE4MVhYKGhhKSkKKwlpZiAoSVNfUUxBMjVYWChoYSkgfHwgSVNfUUxBODFYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpCiAJCWdvdG8gdHJ5X2Zhc3Q7CiAJaWYgKG9mZnNldCAmIDB4ZmZmKQogCQlnb3RvIHNsb3dfcmVhZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV90bXBsLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdG1wbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MDRlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdG1wbC5jCkBAIC0wLDAgKzEsOTA5IEBACisvKgorICogUUxvZ2ljIEZpYnJlIENoYW5uZWwgSEJBIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAgMjAwMy0yMDEzIFFMb2dpYyBDb3Jwb3JhdGlvbgorICoKKyAqIFNlZSBMSUNFTlNFLnFsYTJ4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlICJxbGFfZGVmLmgiCisjaW5jbHVkZSAicWxhX3RtcGwuaCIKKworLyogbm90ZSBkZWZhdWx0IHRlbXBsYXRlIGlzIGluIGJpZyBlbmRpYW4gKi8KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBxbDI3eHhfZndkdF9kZWZhdWx0X3RlbXBsYXRlW10gPSB7CisJMHg2MzAwMDAwMCwgMHhhNDAwMDAwMCwgMHg3YzA1MDAwMCwgMHgwMDAwMDAwMCwKKwkweDMwMDAwMDAwLCAweDAxMDAwMDAwLCAweDAwMDAwMDAwLCAweGMwNDA2ZWI0LAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDA0MDEwMDAwLCAweDE0MDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDIwMDAwMDAsIDB4NDQwMDAwMDAsIDB4MDkwMTAwMDAsIDB4MTAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwMTAxMDAwMCwgMHgxYzAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDAwNjAwMDAwLCAweDAwMDAwMDAwLAorCTB4YzAwMDAwMDAsIDB4MDEwMTAwMDAsIDB4MWMwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMjAwMDAwMCwgMHgwMDYwMDAwMCwgMHgwMDAwMDAwMCwgMHhjYzAwMDAwMCwKKwkweDAxMDEwMDAwLCAweDFjMDAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDAwMDAwLAorCTB4MTA2MDAwMDAsIDB4MDAwMDAwMDAsIDB4ZDQwMDAwMDAsIDB4MDEwMTAwMDAsCisJMHgxYzAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHg3MDBmMDAwMCwKKwkweDAwMDAwMDYwLCAweGYwMDAwMDAwLCAweDAwMDEwMDAwLCAweDE4MDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDA3MDAwMDAsIDB4MDQxMDAwYzAsCisJMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwKKwkweDEwNzAwMDAwLCAweDA0MTAwMGMwLCAweDAwMDEwMDAwLCAweDE4MDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4NDA3MDAwMDAsIDB4MDQxMDAwYzAsCisJMHgwMTAxMDAwMCwgMHgxYzAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwKKwkweDAwN2MwMDAwLCAweDAxMDAwMDAwLCAweGMwMDAwMDAwLCAweDAwMDEwMDAwLAorCTB4MTgwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDA3YzAwMDAsCisJMHgwNDAzMDBjNCwgMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAyMDAwMDAwLCAweDAwN2MwMDAwLCAweDA0MDEwMGMwLCAweDAxMDEwMDAwLAorCTB4MWMwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDA3YzAwMDAsCisJMHgwMDAwMDAwMCwgMHhjMDAwMDAwMCwgMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDAwN2MwMDAwLCAweDA0MjAwMDAwLAorCTB4MGIwMTAwMDAsIDB4MTgwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsCisJMHgwYzAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAxMDAwMCwgMHgyMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDcwMGYwMDAwLCAweDA0MDEwMGZjLAorCTB4ZjAwMDAwMDAsIDB4MDAwMDAwYjAsIDB4MDIwMTAwMDAsIDB4MjAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHg3MDBmMDAwMCwgMHgwNDAxMDBmYywKKwkweGYwMDAwMDAwLCAweDAwMDAxMGIwLCAweDAyMDEwMDAwLCAweDIwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4NzAwZjAwMDAsIDB4MDQwMTAwZmMsCisJMHhmMDAwMDAwMCwgMHgwMDAwMjBiMCwgMHgwMjAxMDAwMCwgMHgyMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDcwMGYwMDAwLCAweDA0MDEwMGZjLAorCTB4ZjAwMDAwMDAsIDB4MDAwMDMwYjAsIDB4MDIwMTAwMDAsIDB4MjAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHg3MDBmMDAwMCwgMHgwNDAxMDBmYywKKwkweGYwMDAwMDAwLCAweDAwMDA0MGIwLCAweDAyMDEwMDAwLCAweDIwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4NzAwZjAwMDAsIDB4MDQwMTAwZmMsCisJMHhmMDAwMDAwMCwgMHgwMDAwNTBiMCwgMHgwMjAxMDAwMCwgMHgyMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDcwMGYwMDAwLCAweDA0MDEwMGZjLAorCTB4ZjAwMDAwMDAsIDB4MDAwMDYwYjAsIDB4MDIwMTAwMDAsIDB4MjAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHg3MDBmMDAwMCwgMHgwNDAxMDBmYywKKwkweGYwMDAwMDAwLCAweDAwMDA3MGIwLCAweDAyMDEwMDAwLCAweDIwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4NzAwZjAwMDAsIDB4MDQwMTAwZmMsCisJMHhmMDAwMDAwMCwgMHgwMDAwODBiMCwgMHgwMjAxMDAwMCwgMHgyMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDcwMGYwMDAwLCAweDA0MDEwMGZjLAorCTB4ZjAwMDAwMDAsIDB4MDAwMDkwYjAsIDB4MDIwMTAwMDAsIDB4MjAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHg3MDBmMDAwMCwgMHgwNDAxMDBmYywKKwkweGYwMDAwMDAwLCAweDAwMDBhMGIwLCAweDAwMDEwMDAwLCAweDE4MDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MGEwMDAwMDAsIDB4MDQwMTAwYzAsCisJMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwKKwkweDBhMDAwMDAwLCAweDA0MjAwMDgwLCAweDAwMDEwMDAwLCAweDE4MDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDBiZTAwMDAsIDB4MDQxMDAwYzAsCisJMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwKKwkweDEwYmUwMDAwLCAweDA0MTAwMGMwLCAweDAwMDEwMDAwLCAweDE4MDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MjBiZTAwMDAsIDB4MDQxMDAwYzAsCisJMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwKKwkweDMwYmUwMDAwLCAweDA0MTAwMGMwLCAweDAwMDEwMDAwLCAweDE4MDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDBiMDAwMDAsIDB4MDQxMDAwYzAsCisJMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwKKwkweDEwYjAwMDAwLCAweDA0MTAwMGMwLCAweDAwMDEwMDAwLCAweDE4MDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MjBiMDAwMDAsIDB4MDQxMDAwYzAsCisJMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwKKwkweDMwYjAwMDAwLCAweDA0MTAwMGMwLCAweDAwMDEwMDAwLCAweDE4MDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDAzMDAwMDAsIDB4MDQxMDAwYzAsCisJMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwKKwkweDEwMzAwMDAwLCAweDA0MTAwMGMwLCAweDAwMDEwMDAwLCAweDE4MDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MjAzMDAwMDAsIDB4MDQxMDAwYzAsCisJMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwKKwkweDMwMzAwMDAwLCAweDA0MTAwMGMwLCAweDBhMDEwMDAwLCAweDEwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDYwMTAwMDAsIDB4MWMwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwMTAwMDAwMCwgMHgwMDAwMDIwMCwKKwkweGZmMjMwMjAwLCAweDA2MDEwMDAwLCAweDFjMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDIwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDAwMDEwMDAsIDB4MDAwMDAwMDAsCisJMHgwNzAxMDAwMCwgMHgxODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAxMDAwMDAwLCAweDA3MDEwMDAwLCAweDE4MDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsCisJMHgwNzAxMDAwMCwgMHgxODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAzMDAwMDAwLCAweDBkMDEwMDAwLCAweDE0MDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDAwMDAwMDAsIDB4ZmYwMDAwMDAsCisJMHgxMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDA4MCwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICoKK3FsYTI3eHhfaXNwX3JlZyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQoreworCXJldHVybiAmdmhhLT5ody0+aW9iYXNlLT5pc3AyNDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitxbGEyN3h4X2luc2VydDE2KHVpbnQxNl90IHZhbHVlLCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJaWYgKGJ1ZikgeworCQlidWYgKz0gKmxlbjsKKwkJKihfX2xlMTYgKilidWYgPSBjcHVfdG9fbGUxNih2YWx1ZSk7CisJfQorCSpsZW4gKz0gc2l6ZW9mKHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitxbGEyN3h4X2luc2VydDMyKHVpbnQzMl90IHZhbHVlLCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJaWYgKGJ1ZikgeworCQlidWYgKz0gKmxlbjsKKwkJKihfX2xlMzIgKilidWYgPSBjcHVfdG9fbGUzMih2YWx1ZSk7CisJfQorCSpsZW4gKz0gc2l6ZW9mKHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitxbGEyN3h4X2luc2VydGJ1Zih2b2lkICptZW0sIHVsb25nIHNpemUsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwl1bG9uZyBjbnQgPSBzaXplOworCisJaWYgKGJ1ZiAmJiBtZW0pIHsKKwkJYnVmICs9ICpsZW47CisJCXdoaWxlIChjbnQgPj0gc2l6ZW9mKHVpbnQzMl90KSkgeworCQkJKihfX2xlMzIgKilidWYgPSBjcHVfdG9fbGUzMnAobWVtKTsKKwkJCWJ1ZiArPSBzaXplb2YodWludDMyX3QpOworCQkJbWVtICs9IHNpemVvZih1aW50MzJfdCk7CisJCQljbnQgLT0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJfQorCQlpZiAoY250KQorCQkJbWVtY3B5KGJ1ZiwgbWVtLCBjbnQpOworCX0KKwkqbGVuICs9IHNpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMjd4eF9yZWFkOCh2b2lkICp3aW5kb3csIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwl1aW50OF90IHZhbHVlID0gfjA7CisKKwlpZiAoYnVmKSB7CisJCXZhbHVlID0gUkRfUkVHX0JZVEUoKF9faW9tZW0gdm9pZCAqKXdpbmRvdyk7CisJCXFsX2RiZyhxbF9kYmdfbWlzYywgTlVMTCwgMHhkMDExLAorCQkgICAgIiVzOiAtPiAleFxuIiwgX19mdW5jX18sIHZhbHVlKTsKKwl9CisJcWxhMjd4eF9pbnNlcnQzMih2YWx1ZSwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTI3eHhfcmVhZDE2KHZvaWQgKndpbmRvdywgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXVpbnQxNl90IHZhbHVlID0gfjA7CisKKwlpZiAoYnVmKSB7CisJCXZhbHVlID0gUkRfUkVHX1dPUkQoKF9faW9tZW0gdm9pZCAqKXdpbmRvdyk7CisJCXFsX2RiZyhxbF9kYmdfbWlzYywgTlVMTCwgMHhkMDEyLAorCQkgICAgIiVzOiAtPiAleFxuIiwgX19mdW5jX18sIHZhbHVlKTsKKwl9CisJcWxhMjd4eF9pbnNlcnQzMih2YWx1ZSwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTI3eHhfcmVhZDMyKHZvaWQgKndpbmRvdywgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXVpbnQzMl90IHZhbHVlID0gfjA7CisKKwlpZiAoYnVmKSB7CisJCXZhbHVlID0gUkRfUkVHX0RXT1JEKChfX2lvbWVtIHZvaWQgKil3aW5kb3cpOworCQlxbF9kYmcocWxfZGJnX21pc2MsIE5VTEwsIDB4ZDAxMywKKwkJICAgICIlczogLT4gJXhcbiIsIF9fZnVuY19fLCB2YWx1ZSk7CisJfQorCXFsYTI3eHhfaW5zZXJ0MzIodmFsdWUsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICgqcWxhMjd4eF9yZWFkX3ZlY3Rvcih1aW50IHdpZHRoKSkodm9pZCAqLCB2b2lkICosIHVsb25nICopCit7CisJcmV0dXJuCisJICAgICh3aWR0aCA9PSAxKSA/IHFsYTI3eHhfcmVhZDggOgorCSAgICAod2lkdGggPT0gMikgPyBxbGEyN3h4X3JlYWQxNiA6CisJCQkgICBxbGEyN3h4X3JlYWQzMjsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitxbGEyN3h4X3JlYWRfcmVnKF9faW9tZW0gc3RydWN0IGRldmljZV9yZWdfMjR4eCAqcmVnLAorCXVpbnQgb2Zmc2V0LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJdm9pZCAqd2luZG93ID0gKHZvaWQgKilyZWcgKyBvZmZzZXQ7CisKKwlpZiAoYnVmKSB7CisJCXFsX2RiZyhxbF9kYmdfbWlzYywgTlVMTCwgMHhkMDE0LAorCQkgICAgIiVzOiBAJXhcbiIsIF9fZnVuY19fLCBvZmZzZXQpOworCX0KKwlxbGEyN3h4X2luc2VydDMyKG9mZnNldCwgYnVmLCBsZW4pOworCXFsYTI3eHhfcmVhZDMyKHdpbmRvdywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTI3eHhfd3JpdGVfcmVnKF9faW9tZW0gc3RydWN0IGRldmljZV9yZWdfMjR4eCAqcmVnLAorCXVpbnQgb2Zmc2V0LCB1aW50MzJfdCBkYXRhLCB2b2lkICpidWYpCit7CisJX19pb21lbSB2b2lkICp3aW5kb3cgPSByZWcgKyBvZmZzZXQ7CisKKwlpZiAoYnVmKSB7CisJCXFsX2RiZyhxbF9kYmdfbWlzYywgTlVMTCwgMHhkMDE1LAorCQkgICAgIiVzOiBAJXggPC0gJXhcbiIsIF9fZnVuY19fLCBvZmZzZXQsIGRhdGEpOworCQlXUlRfUkVHX0RXT1JEKHdpbmRvdywgZGF0YSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTI3eHhfcmVhZF93aW5kb3coX19pb21lbSBzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4ICpyZWcsCisJdWludDMyX3QgYmFzZSwgdWludCBvZmZzZXQsIHVpbnQgY291bnQsIHVpbnQgd2lkdGgsIHZvaWQgKmJ1ZiwKKwl1bG9uZyAqbGVuKQoreworCXZvaWQgKndpbmRvdyA9ICh2b2lkICopcmVnICsgb2Zmc2V0OworCXZvaWQgKCpyZWFkbikodm9pZCAqLCB2b2lkICosIHVsb25nICopID0gcWxhMjd4eF9yZWFkX3ZlY3Rvcih3aWR0aCk7CisKKwlpZiAoYnVmKSB7CisJCXFsX2RiZyhxbF9kYmdfbWlzYywgTlVMTCwgMHhkMDE2LAorCQkgICAgIiVzOiBiYXNlPSV4IG9mZnNldD0leCBjb3VudD0leCB3aWR0aD0leFxuIiwKKwkJICAgIF9fZnVuY19fLCBiYXNlLCBvZmZzZXQsIGNvdW50LCB3aWR0aCk7CisJfQorCXFsYTI3eHhfd3JpdGVfcmVnKHJlZywgSU9CQVNFX0FERFIsIGJhc2UsIGJ1Zik7CisJd2hpbGUgKGNvdW50LS0pIHsKKwkJcWxhMjd4eF9pbnNlcnQzMihiYXNlLCBidWYsIGxlbik7CisJCXJlYWRuKHdpbmRvdywgYnVmLCBsZW4pOworCQl3aW5kb3cgKz0gd2lkdGg7CisJCWJhc2UgKz0gd2lkdGg7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTI3eHhfc2tpcF9lbnRyeShzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZikKK3sKKwlpZiAoYnVmKQorCQllbnQtPmhkci5kcml2ZXJfZmxhZ3MgfD0gRFJJVkVSX0ZMQUdfU0tJUF9FTlRSWTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDEwMCwKKwkgICAgIiVzOiBub3AgWyVseF1cbiIsIF9fZnVuY19fLCAqbGVuKTsKKwlxbGEyN3h4X3NraXBfZW50cnkoZW50LCBidWYpOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI1NShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQxZmYsCisJICAgICIlczogZW5kIFslbHhdXG4iLCBfX2Z1bmNfXywgKmxlbik7CisJcWxhMjd4eF9za2lwX2VudHJ5KGVudCwgYnVmKTsKKworCS8qIHRlcm1pbmF0ZSAqLworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI1NihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gcWxhMjd4eF9pc3BfcmVnKHZoYSk7CisKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMjAwLAorCSAgICAiJXM6IHJkaW8gdDEgWyVseF1cbiIsIF9fZnVuY19fLCAqbGVuKTsKKwlxbGEyN3h4X3JlYWRfd2luZG93KHJlZywgZW50LT50MjU2LmJhc2VfYWRkciwgZW50LT50MjU2LnBjaV9vZmZzZXQsCisJICAgIGVudC0+dDI1Ni5yZWdfY291bnQsIGVudC0+dDI1Ni5yZWdfd2lkdGgsIGJ1ZiwgbGVuKTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNTcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9IHFsYTI3eHhfaXNwX3JlZyh2aGEpOworCisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDIwMSwKKwkgICAgIiVzOiB3cmlvIHQxIFslbHhdXG4iLCBfX2Z1bmNfXywgKmxlbik7CisJcWxhMjd4eF93cml0ZV9yZWcocmVnLCBJT0JBU0VfQUREUiwgZW50LT50MjU3LmJhc2VfYWRkciwgYnVmKTsKKwlxbGEyN3h4X3dyaXRlX3JlZyhyZWcsIGVudC0+dDI1Ny5wY2lfb2Zmc2V0LCBlbnQtPnQyNTcud3JpdGVfZGF0YSwgYnVmKTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNTgoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9IHFsYTI3eHhfaXNwX3JlZyh2aGEpOworCisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDIwMiwKKwkgICAgIiVzOiByZGlvIHQyIFslbHhdXG4iLCBfX2Z1bmNfXywgKmxlbik7CisJcWxhMjd4eF93cml0ZV9yZWcocmVnLCBlbnQtPnQyNTguYmFua3NlbF9vZmZzZXQsIGVudC0+dDI1OC5iYW5rLCBidWYpOworCXFsYTI3eHhfcmVhZF93aW5kb3cocmVnLCBlbnQtPnQyNTguYmFzZV9hZGRyLCBlbnQtPnQyNTgucGNpX29mZnNldCwKKwkgICAgZW50LT50MjU4LnJlZ19jb3VudCwgZW50LT50MjU4LnJlZ193aWR0aCwgYnVmLCBsZW4pOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI1OShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gcWxhMjd4eF9pc3BfcmVnKHZoYSk7CisKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMjAzLAorCSAgICAiJXM6IHdyaW8gdDIgWyVseF1cbiIsIF9fZnVuY19fLCAqbGVuKTsKKwlxbGEyN3h4X3dyaXRlX3JlZyhyZWcsIElPQkFTRV9BRERSLCBlbnQtPnQyNTkuYmFzZV9hZGRyLCBidWYpOworCXFsYTI3eHhfd3JpdGVfcmVnKHJlZywgZW50LT50MjU5LmJhbmtzZWxfb2Zmc2V0LCBlbnQtPnQyNTkuYmFuaywgYnVmKTsKKwlxbGEyN3h4X3dyaXRlX3JlZyhyZWcsIGVudC0+dDI1OS5wY2lfb2Zmc2V0LCBlbnQtPnQyNTkud3JpdGVfZGF0YSwgYnVmKTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNjAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9IHFsYTI3eHhfaXNwX3JlZyh2aGEpOworCisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDIwNCwKKwkgICAgIiVzOiByZHBjaSBbJWx4XVxuIiwgX19mdW5jX18sICpsZW4pOworCXFsYTI3eHhfcmVhZF9yZWcocmVnLCBlbnQtPnQyNjAucGNpX2FkZHIsIGJ1ZiwgbGVuKTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNjEoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9IHFsYTI3eHhfaXNwX3JlZyh2aGEpOworCisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDIwNSwKKwkgICAgIiVzOiB3cnBjaSBbJWx4XVxuIiwgX19mdW5jX18sICpsZW4pOworCXFsYTI3eHhfd3JpdGVfcmVnKHJlZywgZW50LT50MjYxLnBjaV9hZGRyLCBlbnQtPnQyNjEud3JpdGVfZGF0YSwgYnVmKTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNjIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwl1bG9uZyBkd29yZHM7CisJdWxvbmcgc3RhcnQ7CisJdWxvbmcgZW5kOworCisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDIwNiwKKwkgICAgIiVzOiByZHJhbSgleCkgWyVseF1cbiIsIF9fZnVuY19fLCBlbnQtPnQyNjIucmFtX2FyZWEsICpsZW4pOworCXN0YXJ0ID0gZW50LT50MjYyLnN0YXJ0X2FkZHI7CisJZW5kID0gZW50LT50MjYyLmVuZF9hZGRyOworCisJaWYgKGVudC0+dDI2Mi5yYW1fYXJlYSA9PSBUMjYyX1JBTV9BUkVBX0NSSVRJQ0FMX1JBTSkgeworCQk7CisJfSBlbHNlIGlmIChlbnQtPnQyNjIucmFtX2FyZWEgPT0gVDI2Ml9SQU1fQVJFQV9FWFRFUk5BTF9SQU0pIHsKKwkJZW5kID0gdmhhLT5ody0+ZndfbWVtb3J5X3NpemU7CisJCWlmIChidWYpCisJCQllbnQtPnQyNjIuZW5kX2FkZHIgPSBlbmQ7CisJfSBlbHNlIGlmIChlbnQtPnQyNjIucmFtX2FyZWEgPT0gVDI2Ml9SQU1fQVJFQV9TSEFSRURfUkFNKSB7CisJCXN0YXJ0ID0gdmhhLT5ody0+Zndfc2hhcmVkX3JhbV9zdGFydDsKKwkJZW5kID0gdmhhLT5ody0+Zndfc2hhcmVkX3JhbV9lbmQ7CisJCWlmIChidWYpIHsKKwkJCWVudC0+dDI2Mi5zdGFydF9hZGRyID0gc3RhcnQ7CisJCQllbnQtPnQyNjIuZW5kX2FkZHIgPSBlbmQ7CisJCX0KKwl9IGVsc2UgaWYgKGVudC0+dDI2Mi5yYW1fYXJlYSA9PSBUMjYyX1JBTV9BUkVBX0REUl9SQU0pIHsKKwkJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDAyMSwKKwkJICAgICIlczogdW5zdXBwb3J0ZWQgZGRyIHJhbVxuIiwgX19mdW5jX18pOworCQlxbGEyN3h4X3NraXBfZW50cnkoZW50LCBidWYpOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIHsKKwkJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDAyMiwKKwkJICAgICIlczogdW5rbm93biBhcmVhICV1XG4iLCBfX2Z1bmNfXywgZW50LT50MjYyLnJhbV9hcmVhKTsKKwkJcWxhMjd4eF9za2lwX2VudHJ5KGVudCwgYnVmKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChlbmQgPCBzdGFydCkgeworCQlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMDIzLAorCQkgICAgIiVzOiBiYWQgcmFuZ2UgKHN0YXJ0PSV4IGVuZD0leClcbiIsIF9fZnVuY19fLAorCQkgICAgZW50LT50MjYyLmVuZF9hZGRyLCBlbnQtPnQyNjIuc3RhcnRfYWRkcik7CisJCXFsYTI3eHhfc2tpcF9lbnRyeShlbnQsIGJ1Zik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlkd29yZHMgPSBlbmQgLSBzdGFydCArIDE7CisJaWYgKGJ1ZikgeworCQlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMDI0LAorCQkgICAgIiVzOiBAJWx4IC0+ICglbHggZHdvcmRzKVxuIiwgX19mdW5jX18sIHN0YXJ0LCBkd29yZHMpOworCQlidWYgKz0gKmxlbjsKKwkJcWxhMjR4eF9kdW1wX3JhbSh2aGEtPmh3LCBzdGFydCwgYnVmLCBkd29yZHMsICZidWYpOworCX0KKwkqbGVuICs9IGR3b3JkcyAqIHNpemVvZih1aW50MzJfdCk7Citkb25lOgorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNjMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwl1aW50IGNvdW50ID0gMDsKKwl1aW50IGk7CisJdWludCBsZW5ndGg7CisKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMjA3LAorCSAgICAiJXM6IGdldHEoJXgpIFslbHhdXG4iLCBfX2Z1bmNfXywgZW50LT50MjYzLnF1ZXVlX3R5cGUsICpsZW4pOworCWlmIChlbnQtPnQyNjMucXVldWVfdHlwZSA9PSBUMjYzX1FVRVVFX1RZUEVfUkVRKSB7CisJCWZvciAoaSA9IDA7IGkgPCB2aGEtPmh3LT5tYXhfcmVxX3F1ZXVlczsgaSsrKSB7CisJCQlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gdmhhLT5ody0+cmVxX3FfbWFwW2ldOworCQkJaWYgKHJlcSB8fCAhYnVmKSB7CisJCQkJbGVuZ3RoID0gcmVxID8KKwkJCQkgICAgcmVxLT5sZW5ndGggOiBSRVFVRVNUX0VOVFJZX0NOVF8yNFhYOworCQkJCXFsYTI3eHhfaW5zZXJ0MTYoaSwgYnVmLCBsZW4pOworCQkJCXFsYTI3eHhfaW5zZXJ0MTYobGVuZ3RoLCBidWYsIGxlbik7CisJCQkJcWxhMjd4eF9pbnNlcnRidWYocmVxID8gcmVxLT5yaW5nIDogTlVMTCwKKwkJCQkgICAgbGVuZ3RoICogc2l6ZW9mKCpyZXEtPnJpbmcpLCBidWYsIGxlbik7CisJCQkJY291bnQrKzsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoZW50LT50MjYzLnF1ZXVlX3R5cGUgPT0gVDI2M19RVUVVRV9UWVBFX1JTUCkgeworCQlmb3IgKGkgPSAwOyBpIDwgdmhhLT5ody0+bWF4X3JzcF9xdWV1ZXM7IGkrKykgeworCQkJc3RydWN0IHJzcF9xdWUgKnJzcCA9IHZoYS0+aHctPnJzcF9xX21hcFtpXTsKKwkJCWlmIChyc3AgfHwgIWJ1ZikgeworCQkJCWxlbmd0aCA9IHJzcCA/CisJCQkJICAgIHJzcC0+bGVuZ3RoIDogUkVTUE9OU0VfRU5UUllfQ05UX01ROworCQkJCXFsYTI3eHhfaW5zZXJ0MTYoaSwgYnVmLCBsZW4pOworCQkJCXFsYTI3eHhfaW5zZXJ0MTYobGVuZ3RoLCBidWYsIGxlbik7CisJCQkJcWxhMjd4eF9pbnNlcnRidWYocnNwID8gcnNwLT5yaW5nIDogTlVMTCwKKwkJCQkgICAgbGVuZ3RoICogc2l6ZW9mKCpyc3AtPnJpbmcpLCBidWYsIGxlbik7CisJCQkJY291bnQrKzsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoZW50LT50MjYzLnF1ZXVlX3R5cGUgPT0gVDI2M19RVUVVRV9UWVBFX0FUSU8pIHsKKwkJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDAyNSwKKwkJICAgICIlczogdW5zdXBwb3J0ZWQgYXRpbyBxdWV1ZVxuIiwgX19mdW5jX18pOworCQlxbGEyN3h4X3NraXBfZW50cnkoZW50LCBidWYpOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIHsKKwkJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDAyNiwKKwkJICAgICIlczogdW5rbm93biBxdWV1ZSAldVxuIiwgX19mdW5jX18sIGVudC0+dDI2My5xdWV1ZV90eXBlKTsKKwkJcWxhMjd4eF9za2lwX2VudHJ5KGVudCwgYnVmKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChidWYpCisJCWVudC0+dDI2My5udW1fcXVldWVzID0gY291bnQ7Citkb25lOgorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNjQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMjA4LAorCSAgICAiJXM6IGdldGZjZSBbJWx4XVxuIiwgX19mdW5jX18sICpsZW4pOworCWlmICh2aGEtPmh3LT5mY2UpIHsKKwkJaWYgKGJ1ZikgeworCQkJZW50LT50MjY0LmZjZV90cmFjZV9zaXplID0gRkNFX1NJWkU7CisJCQllbnQtPnQyNjQud3JpdGVfcG9pbnRlciA9IHZoYS0+aHctPmZjZV93cjsKKwkJCWVudC0+dDI2NC5iYXNlX3BvaW50ZXIgPSB2aGEtPmh3LT5mY2VfZG1hOworCQkJZW50LT50MjY0LmZjZV9lbmFibGVfbWIwID0gdmhhLT5ody0+ZmNlX21iWzBdOworCQkJZW50LT50MjY0LmZjZV9lbmFibGVfbWIyID0gdmhhLT5ody0+ZmNlX21iWzJdOworCQkJZW50LT50MjY0LmZjZV9lbmFibGVfbWIzID0gdmhhLT5ody0+ZmNlX21iWzNdOworCQkJZW50LT50MjY0LmZjZV9lbmFibGVfbWI0ID0gdmhhLT5ody0+ZmNlX21iWzRdOworCQkJZW50LT50MjY0LmZjZV9lbmFibGVfbWI1ID0gdmhhLT5ody0+ZmNlX21iWzVdOworCQkJZW50LT50MjY0LmZjZV9lbmFibGVfbWI2ID0gdmhhLT5ody0+ZmNlX21iWzZdOworCQl9CisJCXFsYTI3eHhfaW5zZXJ0YnVmKHZoYS0+aHctPmZjZSwgRkNFX1NJWkUsIGJ1ZiwgbGVuKTsKKwl9IGVsc2UgeworCQlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMDI3LAorCQkgICAgIiVzOiBtaXNzaW5nIGZjZVxuIiwgX19mdW5jX18pOworCQlxbGEyN3h4X3NraXBfZW50cnkoZW50LCBidWYpOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNjUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9IHFsYTI3eHhfaXNwX3JlZyh2aGEpOworCisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDIwOSwKKwkgICAgIiVzOiBwYXVzZSByaXNjIFslbHhdXG4iLCBfX2Z1bmNfXywgKmxlbik7CisJaWYgKGJ1ZikKKwkJcWxhMjR4eF9wYXVzZV9yaXNjKHJlZyk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjY2KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDIwYSwKKwkgICAgIiVzOiByZXNldCByaXNjIFslbHhdXG4iLCBfX2Z1bmNfXywgKmxlbik7CisJaWYgKGJ1ZikKKwkJcWxhMjR4eF9zb2Z0X3Jlc2V0KHZoYS0+aHcpOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2NyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gcWxhMjd4eF9pc3BfcmVnKHZoYSk7CisKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMjBiLAorCSAgICAiJXM6IGRpcyBpbnRyIFslbHhdXG4iLCBfX2Z1bmNfXywgKmxlbik7CisJcWxhMjd4eF93cml0ZV9yZWcocmVnLCBlbnQtPnQyNjcucGNpX29mZnNldCwgZW50LT50MjY3LmRhdGEsIGJ1Zik7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjY4KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDIwYywKKwkgICAgIiVzOiBnZXRoYigleCkgWyVseF1cbiIsIF9fZnVuY19fLCBlbnQtPnQyNjguYnVmX3R5cGUsICpsZW4pOworCWlmIChlbnQtPnQyNjguYnVmX3R5cGUgPT0gVDI2OF9CVUZfVFlQRV9FWFREX1RSQUNFKSB7CisJCWlmICh2aGEtPmh3LT5lZnQpIHsKKwkJCWlmIChidWYpIHsKKwkJCQllbnQtPnQyNjguYnVmX3NpemUgPSBFRlRfU0laRTsKKwkJCQllbnQtPnQyNjguc3RhcnRfYWRkciA9IHZoYS0+aHctPmVmdF9kbWE7CisJCQl9CisJCQlxbGEyN3h4X2luc2VydGJ1Zih2aGEtPmh3LT5lZnQsIEVGVF9TSVpFLCBidWYsIGxlbik7CisJCX0gZWxzZSB7CisJCQlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMDI4LAorCQkJICAgICIlczogbWlzc2luZyBlZnRcbiIsIF9fZnVuY19fKTsKKwkJCXFsYTI3eHhfc2tpcF9lbnRyeShlbnQsIGJ1Zik7CisJCX0KKwl9IGVsc2UgaWYgKGVudC0+dDI2OC5idWZfdHlwZSA9PSBUMjY4X0JVRl9UWVBFX0VYQ0hfQlVGT0ZGKSB7CisJCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQwMjksCisJCSAgICAiJXM6IHVuc3VwcG9ydGVkIGV4Y2hhbmdlIG9mZmxvYWQgYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCXFsYTI3eHhfc2tpcF9lbnRyeShlbnQsIGJ1Zik7CisJfSBlbHNlIGlmIChlbnQtPnQyNjguYnVmX3R5cGUgPT0gVDI2OF9CVUZfVFlQRV9FWFREX0xPR0lOKSB7CisJCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQwMmEsCisJCSAgICAiJXM6IHVuc3VwcG9ydGVkIGV4dGVuZGVkIGxvZ2luIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQlxbGEyN3h4X3NraXBfZW50cnkoZW50LCBidWYpOworCX0gZWxzZSB7CisJCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQwMmIsCisJCSAgICAiJXM6IHVua25vd24gYnVmICV4XG4iLCBfX2Z1bmNfXywgZW50LT50MjY4LmJ1Zl90eXBlKTsKKwkJcWxhMjd4eF9za2lwX2VudHJ5KGVudCwgYnVmKTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjY5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDIwZCwKKwkgICAgIiVzOiBzY3JhdGNoIFslbHhdXG4iLCBfX2Z1bmNfXywgKmxlbik7CisJcWxhMjd4eF9pbnNlcnQzMigweGFhYWFhYWFhLCBidWYsIGxlbik7CisJcWxhMjd4eF9pbnNlcnQzMigweGJiYmJiYmJiLCBidWYsIGxlbik7CisJcWxhMjd4eF9pbnNlcnQzMigweGNjY2NjY2NjLCBidWYsIGxlbik7CisJcWxhMjd4eF9pbnNlcnQzMigweGRkZGRkZGRkLCBidWYsIGxlbik7CisJcWxhMjd4eF9pbnNlcnQzMigqbGVuICsgc2l6ZW9mKHVpbnQzMl90KSwgYnVmLCBsZW4pOworCWlmIChidWYpCisJCWVudC0+dDI2OS5zY3JhdGNoX3NpemUgPSA1ICogc2l6ZW9mKHVpbnQzMl90KTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNzAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9IHFsYTI3eHhfaXNwX3JlZyh2aGEpOworCXZvaWQgKndpbmRvdyA9ICh2b2lkICopcmVnICsgMHhjNDsKKwl1bG9uZyBkd29yZHMgPSBlbnQtPnQyNzAuY291bnQ7CisJdWxvbmcgYWRkciA9IGVudC0+dDI3MC5hZGRyOworCisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDIwZSwKKwkgICAgIiVzOiByZHJlbXJlZyBbJWx4XVxuIiwgX19mdW5jX18sICpsZW4pOworCXFsYTI3eHhfd3JpdGVfcmVnKHJlZywgSU9CQVNFX0FERFIsIDB4NDAsIGJ1Zik7CisJd2hpbGUgKGR3b3Jkcy0tKSB7CisJCXFsYTI3eHhfd3JpdGVfcmVnKHJlZywgMHhjMCwgYWRkcnwweDgwMDAwMDAwLCBidWYpOworCQlxbGEyN3h4X3JlYWRfcmVnKHJlZywgMHhjNCwgYnVmLCBsZW4pOworCQlxbGEyN3h4X2luc2VydDMyKGFkZHIsIGJ1ZiwgbGVuKTsKKwkJcWxhMjd4eF9yZWFkMzIod2luZG93LCBidWYsIGxlbik7CisJCWFkZHIrKzsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjcxKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSBxbGEyN3h4X2lzcF9yZWcodmhhKTsKKwl1bG9uZyBhZGRyID0gZW50LT50MjcxLmFkZHI7CisKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMjBmLAorCSAgICAiJXM6IHdycmVtcmVnIFslbHhdXG4iLCBfX2Z1bmNfXywgKmxlbik7CisJcWxhMjd4eF93cml0ZV9yZWcocmVnLCBJT0JBU0VfQUREUiwgMHg0MCwgYnVmKTsKKwlxbGEyN3h4X3JlYWRfcmVnKHJlZywgMHhjNCwgYnVmLCBsZW4pOworCXFsYTI3eHhfaW5zZXJ0MzIoYWRkciwgYnVmLCBsZW4pOworCXFsYTI3eHhfd3JpdGVfcmVnKHJlZywgMHhjMCwgYWRkciwgYnVmKTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNzIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwl1bG9uZyBkd29yZHMgPSBlbnQtPnQyNzIuY291bnQ7CisJdWxvbmcgc3RhcnQgPSBlbnQtPnQyNzIuYWRkcjsKKworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyMTAsCisJICAgICIlczogcmRyZW1yYW0gWyVseF1cbiIsIF9fZnVuY19fLCAqbGVuKTsKKwlpZiAoYnVmKSB7CisJCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQwMmMsCisJCSAgICAiJXM6IEAlbHggLT4gKCVseCBkd29yZHMpXG4iLCBfX2Z1bmNfXywgc3RhcnQsIGR3b3Jkcyk7CisJCWJ1ZiArPSAqbGVuOworCQlxbGEyN3h4X2R1bXBfbXBpX3JhbSh2aGEtPmh3LCBzdGFydCwgYnVmLCBkd29yZHMsICZidWYpOworCX0KKwkqbGVuICs9IGR3b3JkcyAqIHNpemVvZih1aW50MzJfdCk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjczKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJdWxvbmcgZHdvcmRzID0gZW50LT50MjczLmNvdW50OworCXVsb25nIGFkZHIgPSBlbnQtPnQyNzMuYWRkcjsKKwl1aW50MzJfdCB2YWx1ZTsKKworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyMTEsCisJICAgICIlczogcGNpY2ZnIFslbHhdXG4iLCBfX2Z1bmNfXywgKmxlbik7CisJd2hpbGUgKGR3b3Jkcy0tKSB7CisJCXZhbHVlID0gfjA7CisJCWlmIChwY2lfcmVhZF9jb25maWdfZHdvcmQodmhhLT5ody0+cGRldiwgYWRkciwgJnZhbHVlKSkKKwkJCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQwMmQsCisJCQkgICAgIiVzOiBmYWlsZWQgcGNpY2ZnIHJlYWQgYXQgJWx4XG4iLCBfX2Z1bmNfXywgYWRkcik7CisJCXFsYTI3eHhfaW5zZXJ0MzIoYWRkciwgYnVmLCBsZW4pOworCQlxbGEyN3h4X2luc2VydDMyKHZhbHVlLCBidWYsIGxlbik7CisJCWFkZHIgKz0gNDsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV9vdGhlcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyZmYsCisJICAgICIlczogdHlwZSAleCBbJWx4XVxuIiwgX19mdW5jX18sIGVudC0+aGRyLmVudHJ5X3R5cGUsICpsZW4pOworCXFsYTI3eHhfc2tpcF9lbnRyeShlbnQsIGJ1Zik7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnlfY2FsbCB7CisJaW50IHR5cGU7CisJaW50ICgqY2FsbCkoCisJICAgIHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosCisJICAgIHN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKiwKKwkgICAgdm9pZCAqLAorCSAgICB1bG9uZyAqKTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5X2NhbGwgcWwyN3h4X2Z3ZHRfZW50cnlfY2FsbF9saXN0W10gPSB7CisJeyBFTlRSWV9UWVBFX05PUAkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDAgICAgfSAsCisJeyBFTlRSWV9UWVBFX1RNUF9FTkQJCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNTUgIH0gLAorCXsgRU5UUllfVFlQRV9SRF9JT0JfVDEJCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNTYgIH0gLAorCXsgRU5UUllfVFlQRV9XUl9JT0JfVDEJCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNTcgIH0gLAorCXsgRU5UUllfVFlQRV9SRF9JT0JfVDIJCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNTggIH0gLAorCXsgRU5UUllfVFlQRV9XUl9JT0JfVDIJCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNTkgIH0gLAorCXsgRU5UUllfVFlQRV9SRF9QQ0kJCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNjAgIH0gLAorCXsgRU5UUllfVFlQRV9XUl9QQ0kJCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNjEgIH0gLAorCXsgRU5UUllfVFlQRV9SRF9SQU0JCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNjIgIH0gLAorCXsgRU5UUllfVFlQRV9HRVRfUVVFVUUJCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNjMgIH0gLAorCXsgRU5UUllfVFlQRV9HRVRfRkNFCQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjY0ICB9ICwKKwl7IEVOVFJZX1RZUEVfUFNFX1JJU0MJCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNjUgIH0gLAorCXsgRU5UUllfVFlQRV9SU1RfUklTQwkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2NiAgfSAsCisJeyBFTlRSWV9UWVBFX0RJU19JTlRSCQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjY3ICB9ICwKKwl7IEVOVFJZX1RZUEVfR0VUX0hCVUYJCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNjggIH0gLAorCXsgRU5UUllfVFlQRV9TQ1JBVENICQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjY5ICB9ICwKKwl7IEVOVFJZX1RZUEVfUkRSRU1SRUcJCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNzAgIH0gLAorCXsgRU5UUllfVFlQRV9XUlJFTVJFRwkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI3MSAgfSAsCisJeyBFTlRSWV9UWVBFX1JEUkVNUkFNCQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjcyICB9ICwKKwl7IEVOVFJZX1RZUEVfUENJQ0ZHCQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjczICB9ICwKKwl7IC0xCQkJCSwgcWxhMjd4eF9md2R0X2VudHJ5X290aGVyIH0KK307CisKK3N0YXRpYyBpbmxpbmUgaW50ICgqcWxhMjd4eF9maW5kX2VudHJ5KGludCB0eXBlKSkKKwkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqLCB2b2lkICosIHVsb25nICopCit7CisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeV9jYWxsICpsaXN0ID0gcWwyN3h4X2Z3ZHRfZW50cnlfY2FsbF9saXN0OworCisJd2hpbGUgKGxpc3QtPnR5cGUgIT0gLTEgJiYgbGlzdC0+dHlwZSAhPSB0eXBlKQorCQlsaXN0Kys7CisKKwlyZXR1cm4gbGlzdC0+Y2FsbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkICoKK3FsYTI3eHhfbmV4dF9lbnRyeSh2b2lkICpwKQoreworCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCA9IHA7CisKKwlyZXR1cm4gcCArIGVudC0+aGRyLmVudHJ5X3NpemU7Cit9CisKK3N0YXRpYyB2b2lkCitxbGEyN3h4X3dhbGtfdGVtcGxhdGUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X3RlbXBsYXRlICp0bXAsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQgPSAodm9pZCAqKXRtcCArIHRtcC0+ZW50cnlfb2Zmc2V0OworCXVsb25nIGNvdW50ID0gdG1wLT5lbnRyeV9jb3VudDsKKworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQwMWEsCisJICAgICIlczogZW50cnkgY291bnQgJWx4XG4iLCBfX2Z1bmNfXywgY291bnQpOworCXdoaWxlIChjb3VudC0tKSB7CisJCWlmIChxbGEyN3h4X2ZpbmRfZW50cnkoZW50LT5oZHIuZW50cnlfdHlwZSkodmhhLCBlbnQsIGJ1ZiwgbGVuKSkKKwkJCWJyZWFrOworCQllbnQgPSBxbGEyN3h4X25leHRfZW50cnkoZW50KTsKKwl9CisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDAxYiwKKwkgICAgIiVzOiBsZW49JWx4XG4iLCBfX2Z1bmNfXywgKmxlbik7Cit9CisKK3N0YXRpYyB2b2lkCitxbGEyN3h4X3RpbWVfc3RhbXAoc3RydWN0IHFsYTI3eHhfZndkdF90ZW1wbGF0ZSAqdG1wKQoreworCXRtcC0+Y2FwdHVyZV90aW1lc3RhbXAgPSBqaWZmaWVzOworfQorCitzdGF0aWMgdm9pZAorcWxhMjd4eF9kcml2ZXJfaW5mbyhzdHJ1Y3QgcWxhMjd4eF9md2R0X3RlbXBsYXRlICp0bXApCit7CisJdWludDhfdCB2W10gPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKwlpbnQgcnZhbCA9IDA7CisKKwlydmFsID0gc3NjYW5mKHFsYTJ4MDBfdmVyc2lvbl9zdHIsICIlaGh1LiVoaHUuJWhodS4laGh1LiVoaHUuJWhodSIsCisJICAgIHYrMCwgdisxLCB2KzIsIHYrMywgdis0LCB2KzUpOworCisJdG1wLT5kcml2ZXJfaW5mb1swXSA9IHZbM10gPDwgMjQgfCB2WzJdIDw8IDE2IHwgdlsxXSA8PCA4IHwgdlswXTsKKwl0bXAtPmRyaXZlcl9pbmZvWzFdID0gdls1XSA8PCA4IHwgdls0XTsKKwl0bXAtPmRyaXZlcl9pbmZvWzJdID0gMHgxMjM0NTY3ODsKK30KKworc3RhdGljIHZvaWQKK3FsYTI3eHhfZmlybXdhcmVfaW5mbyhzdHJ1Y3QgcWxhMjd4eF9md2R0X3RlbXBsYXRlICp0bXAsCisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSkKK3sKKwl0bXAtPmZpcm13YXJlX3ZlcnNpb25bMF0gPSB2aGEtPmh3LT5md19tYWpvcl92ZXJzaW9uOworCXRtcC0+ZmlybXdhcmVfdmVyc2lvblsxXSA9IHZoYS0+aHctPmZ3X21pbm9yX3ZlcnNpb247CisJdG1wLT5maXJtd2FyZV92ZXJzaW9uWzJdID0gdmhhLT5ody0+Zndfc3VibWlub3JfdmVyc2lvbjsKKwl0bXAtPmZpcm13YXJlX3ZlcnNpb25bM10gPQorCSAgICB2aGEtPmh3LT5md19hdHRyaWJ1dGVzX2ggPDwgMTYgfCB2aGEtPmh3LT5md19hdHRyaWJ1dGVzOworCXRtcC0+ZmlybXdhcmVfdmVyc2lvbls0XSA9CisJICAgIHZoYS0+aHctPmZ3X2F0dHJpYnV0ZXNfZXh0WzFdIDw8IDE2IHwgdmhhLT5ody0+ZndfYXR0cmlidXRlc19leHRbMF07Cit9CisKK3N0YXRpYyB2b2lkCitxbDI3eHhfZWRpdF90ZW1wbGF0ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGUgKnRtcCkKK3sKKwlxbGEyN3h4X3RpbWVfc3RhbXAodG1wKTsKKwlxbGEyN3h4X2RyaXZlcl9pbmZvKHRtcCk7CisJcWxhMjd4eF9maXJtd2FyZV9pbmZvKHRtcCwgdmhhKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdAorcWxhMjd4eF90ZW1wbGF0ZV9jaGVja3N1bSh2b2lkICpwLCB1bG9uZyBzaXplKQoreworCXVpbnQzMl90ICpidWYgPSBwOworCXVpbnQ2NF90IHN1bSA9IDA7CisKKwlzaXplIC89IHNpemVvZigqYnVmKTsKKworCXdoaWxlIChzaXplLS0pCisJCXN1bSArPSAqYnVmKys7CisKKwlzdW0gPSAoc3VtICYgMHhmZmZmZmZmZikgKyAoc3VtID4+IDMyKTsKKworCXJldHVybiB+c3VtOworfQorCitzdGF0aWMgaW5saW5lIGludAorcWxhMjd4eF92ZXJpZnlfdGVtcGxhdGVfY2hlY2tzdW0oc3RydWN0IHFsYTI3eHhfZndkdF90ZW1wbGF0ZSAqdG1wKQoreworCXJldHVybiBxbGEyN3h4X3RlbXBsYXRlX2NoZWNrc3VtKHRtcCwgdG1wLT50ZW1wbGF0ZV9zaXplKSA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorcWxhMjd4eF92ZXJpZnlfdGVtcGxhdGVfaGVhZGVyKHN0cnVjdCBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGUgKnRtcCkKK3sKKwlyZXR1cm4gdG1wLT50ZW1wbGF0ZV90eXBlID09IFRFTVBMQVRFX1RZUEVfRldEVU1QOworfQorCitzdGF0aWMgdm9pZAorcWxhMjd4eF9leGVjdXRlX2Z3ZHRfdGVtcGxhdGUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSkKK3sKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X3RlbXBsYXRlICp0bXAgPSB2aGEtPmh3LT5md19kdW1wX3RlbXBsYXRlOworCXVsb25nIGxlbjsKKworCWlmIChxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfdmFsaWQodG1wKSkgeworCQlsZW4gPSB0bXAtPnRlbXBsYXRlX3NpemU7CisJCXRtcCA9IG1lbWNweSh2aGEtPmh3LT5md19kdW1wLCB0bXAsIGxlbik7CisJCXFsMjd4eF9lZGl0X3RlbXBsYXRlKHZoYSwgdG1wKTsKKwkJcWxhMjd4eF93YWxrX3RlbXBsYXRlKHZoYSwgdG1wLCB0bXAsICZsZW4pOworCQl2aGEtPmh3LT5md19kdW1wX2xlbiA9IGxlbjsKKwkJdmhhLT5ody0+ZndfZHVtcGVkID0gMTsKKwl9Cit9CisKK3Vsb25nCitxbGEyN3h4X2Z3ZHRfY2FsY3VsYXRlX2R1bXBfc2l6ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQoreworCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGUgKnRtcCA9IHZoYS0+aHctPmZ3X2R1bXBfdGVtcGxhdGU7CisJdWxvbmcgbGVuID0gMDsKKworCWlmIChxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfdmFsaWQodG1wKSkgeworCQlsZW4gPSB0bXAtPnRlbXBsYXRlX3NpemU7CisJCXFsYTI3eHhfd2Fsa190ZW1wbGF0ZSh2aGEsIHRtcCwgTlVMTCwgJmxlbik7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKwordWxvbmcKK3FsYTI3eHhfZndkdF90ZW1wbGF0ZV9zaXplKHZvaWQgKnApCit7CisJc3RydWN0IHFsYTI3eHhfZndkdF90ZW1wbGF0ZSAqdG1wID0gcDsKKworCXJldHVybiB0bXAtPnRlbXBsYXRlX3NpemU7Cit9CisKK3Vsb25nCitxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfZGVmYXVsdF9zaXplKHZvaWQpCit7CisJcmV0dXJuIHNpemVvZihxbDI3eHhfZndkdF9kZWZhdWx0X3RlbXBsYXRlKTsKK30KKworY29uc3Qgdm9pZCAqCitxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfZGVmYXVsdCh2b2lkKQoreworCXJldHVybiBxbDI3eHhfZndkdF9kZWZhdWx0X3RlbXBsYXRlOworfQorCitpbnQKK3FsYTI3eHhfZndkdF90ZW1wbGF0ZV92YWxpZCh2b2lkICpwKQoreworCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGUgKnRtcCA9IHA7CisKKwlpZiAoIXFsYTI3eHhfdmVyaWZ5X3RlbXBsYXRlX2hlYWRlcih0bXApKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgTlVMTCwgMHhkMDFjLAorCQkgICAgIiVzOiB0ZW1wbGF0ZSB0eXBlICV4XG4iLCBfX2Z1bmNfXywgdG1wLT50ZW1wbGF0ZV90eXBlKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmICghcWxhMjd4eF92ZXJpZnlfdGVtcGxhdGVfY2hlY2tzdW0odG1wKSkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIE5VTEwsIDB4ZDAxZCwKKwkJICAgICIlczogZmFpbGVkIHRlbXBsYXRlIGNoZWNrc3VtXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZAorcWxhMjd4eF9md2R1bXAoc2NzaV9xbGFfaG9zdF90ICp2aGEsIGludCBoYXJkd2FyZV9sb2NrZWQpCit7CisJdWxvbmcgZmxhZ3MgPSAwOworCisJaWYgKCFoYXJkd2FyZV9sb2NrZWQpCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2aGEtPmh3LT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoIXZoYS0+aHctPmZ3X2R1bXApCisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGQwMWUsICJmd2R1bXAgYnVmZmVyIG1pc3NpbmcuXG4iKTsKKwllbHNlIGlmICghdmhhLT5ody0+ZndfZHVtcF90ZW1wbGF0ZSkKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ZDAxZiwgImZ3ZHVtcCB0ZW1wbGF0ZSBtaXNzaW5nLlxuIik7CisJZWxzZQorCQlxbGEyN3h4X2V4ZWN1dGVfZndkdF90ZW1wbGF0ZSh2aGEpOworCisJaWYgKCFoYXJkd2FyZV9sb2NrZWQpCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoYS0+aHctPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV90bXBsLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdG1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZDJmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdG1wbC5oCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogUUxvZ2ljIEZpYnJlIENoYW5uZWwgSEJBIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAgMjAwMy0yMDEzIFFMb2dpYyBDb3Jwb3JhdGlvbgorICoKKyAqIFNlZSBMSUNFTlNFLnFsYTJ4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1FMQV9ETVAyN19IX18KKyNkZWZpbmUJX19RTEFfRE1QMjdfSF9fCisKKyNkZWZpbmUgSU9CQVNFX0FERFIJb2Zmc2V0b2Yoc3RydWN0IGRldmljZV9yZWdfMjR4eCwgaW9iYXNlX2FkZHIpCisKK3N0cnVjdCBfX3BhY2tlZCBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGUgeworCXVpbnQzMl90IHRlbXBsYXRlX3R5cGU7CisJdWludDMyX3QgZW50cnlfb2Zmc2V0OworCXVpbnQzMl90IHRlbXBsYXRlX3NpemU7CisJdWludDMyX3QgcmVzZXJ2ZWRfMTsKKworCXVpbnQzMl90IGVudHJ5X2NvdW50OworCXVpbnQzMl90IHRlbXBsYXRlX3ZlcnNpb247CisJdWludDMyX3QgY2FwdHVyZV90aW1lc3RhbXA7CisJdWludDMyX3QgdGVtcGxhdGVfY2hlY2tzdW07CisKKwl1aW50MzJfdCByZXNlcnZlZF8yOworCXVpbnQzMl90IGRyaXZlcl9pbmZvWzNdOworCisJdWludDMyX3Qgc2F2ZWRfc3RhdGVbMTZdOworCisJdWludDMyX3QgcmVzZXJ2ZWRfM1s4XTsKKwl1aW50MzJfdCBmaXJtd2FyZV92ZXJzaW9uWzVdOworfTsKKworI2RlZmluZSBURU1QTEFURV9UWVBFX0ZXRFVNUAkJOTkKKworI2RlZmluZSBFTlRSWV9UWVBFX05PUAkJCTAKKyNkZWZpbmUgRU5UUllfVFlQRV9UTVBfRU5ECQkyNTUKKyNkZWZpbmUgRU5UUllfVFlQRV9SRF9JT0JfVDEJCTI1NgorI2RlZmluZSBFTlRSWV9UWVBFX1dSX0lPQl9UMQkJMjU3CisjZGVmaW5lIEVOVFJZX1RZUEVfUkRfSU9CX1QyCQkyNTgKKyNkZWZpbmUgRU5UUllfVFlQRV9XUl9JT0JfVDIJCTI1OQorI2RlZmluZSBFTlRSWV9UWVBFX1JEX1BDSQkJMjYwCisjZGVmaW5lIEVOVFJZX1RZUEVfV1JfUENJCQkyNjEKKyNkZWZpbmUgRU5UUllfVFlQRV9SRF9SQU0JCTI2MgorI2RlZmluZSBFTlRSWV9UWVBFX0dFVF9RVUVVRQkJMjYzCisjZGVmaW5lIEVOVFJZX1RZUEVfR0VUX0ZDRQkJMjY0CisjZGVmaW5lIEVOVFJZX1RZUEVfUFNFX1JJU0MJCTI2NQorI2RlZmluZSBFTlRSWV9UWVBFX1JTVF9SSVNDCQkyNjYKKyNkZWZpbmUgRU5UUllfVFlQRV9ESVNfSU5UUgkJMjY3CisjZGVmaW5lIEVOVFJZX1RZUEVfR0VUX0hCVUYJCTI2OAorI2RlZmluZSBFTlRSWV9UWVBFX1NDUkFUQ0gJCTI2OQorI2RlZmluZSBFTlRSWV9UWVBFX1JEUkVNUkVHCQkyNzAKKyNkZWZpbmUgRU5UUllfVFlQRV9XUlJFTVJFRwkJMjcxCisjZGVmaW5lIEVOVFJZX1RZUEVfUkRSRU1SQU0JCTI3MgorI2RlZmluZSBFTlRSWV9UWVBFX1BDSUNGRwkJMjczCisKKyNkZWZpbmUgQ0FQVFVSRV9GTEFHX1BIWVNfT05MWQkJQklUXzAKKyNkZWZpbmUgQ0FQVFVSRV9GTEFHX1BIWVNfVklSVAkJQklUXzEKKworI2RlZmluZSBEUklWRVJfRkxBR19TS0lQX0VOVFJZCQlCSVRfNworCitzdHJ1Y3QgX19wYWNrZWQgcWxhMjd4eF9md2R0X2VudHJ5IHsKKwlzdHJ1Y3QgX19wYWNrZWQgeworCQl1aW50MzJfdCBlbnRyeV90eXBlOworCQl1aW50MzJfdCBlbnRyeV9zaXplOworCQl1aW50MzJfdCByZXNlcnZlZF8xOworCisJCXVpbnQ4X3QgIGNhcHR1cmVfZmxhZ3M7CisJCXVpbnQ4X3QgIHJlc2VydmVkXzJbMl07CisJCXVpbnQ4X3QgIGRyaXZlcl9mbGFnczsKKwl9IGhkcjsKKwl1bmlvbiBfX3BhY2tlZCB7CisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCX0gdDA7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJfSB0MjU1OworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCQl1aW50MzJfdCBiYXNlX2FkZHI7CisJCQl1aW50OF90ICByZWdfd2lkdGg7CisJCQl1aW50MTZfdCByZWdfY291bnQ7CisJCQl1aW50OF90ICBwY2lfb2Zmc2V0OworCQl9IHQyNTY7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJCXVpbnQzMl90IGJhc2VfYWRkcjsKKwkJCXVpbnQzMl90IHdyaXRlX2RhdGE7CisJCQl1aW50OF90ICBwY2lfb2Zmc2V0OworCQkJdWludDhfdCAgcmVzZXJ2ZWRbM107CisJCX0gdDI1NzsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQkJdWludDMyX3QgYmFzZV9hZGRyOworCQkJdWludDhfdCAgcmVnX3dpZHRoOworCQkJdWludDE2X3QgcmVnX2NvdW50OworCQkJdWludDhfdCAgcGNpX29mZnNldDsKKwkJCXVpbnQ4X3QgIGJhbmtzZWxfb2Zmc2V0OworCQkJdWludDhfdCAgcmVzZXJ2ZWRbM107CisJCQl1aW50MzJfdCBiYW5rOworCQl9IHQyNTg7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJCXVpbnQzMl90IGJhc2VfYWRkcjsKKwkJCXVpbnQzMl90IHdyaXRlX2RhdGE7CisJCQl1aW50OF90ICByZXNlcnZlZFsyXTsKKwkJCXVpbnQ4X3QgIHBjaV9vZmZzZXQ7CisJCQl1aW50OF90ICBiYW5rc2VsX29mZnNldDsKKwkJCXVpbnQzMl90IGJhbms7CisJCX0gdDI1OTsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQkJdWludDhfdCBwY2lfYWRkcjsKKwkJCXVpbnQ4X3QgcmVzZXJ2ZWRbM107CisJCX0gdDI2MDsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQkJdWludDhfdCBwY2lfYWRkcjsKKwkJCXVpbnQ4X3QgcmVzZXJ2ZWRbM107CisJCQl1aW50MzJfdCB3cml0ZV9kYXRhOworCQl9IHQyNjE7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJCXVpbnQ4X3QgIHJhbV9hcmVhOworCQkJdWludDhfdCAgcmVzZXJ2ZWRbM107CisJCQl1aW50MzJfdCBzdGFydF9hZGRyOworCQkJdWludDMyX3QgZW5kX2FkZHI7CisJCX0gdDI2MjsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQkJdWludDMyX3QgbnVtX3F1ZXVlczsKKwkJCXVpbnQ4X3QgIHF1ZXVlX3R5cGU7CisJCQl1aW50OF90ICByZXNlcnZlZFszXTsKKwkJfSB0MjYzOworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCQl1aW50MzJfdCBmY2VfdHJhY2Vfc2l6ZTsKKwkJCXVpbnQ2NF90IHdyaXRlX3BvaW50ZXI7CisJCQl1aW50NjRfdCBiYXNlX3BvaW50ZXI7CisJCQl1aW50MzJfdCBmY2VfZW5hYmxlX21iMDsKKwkJCXVpbnQzMl90IGZjZV9lbmFibGVfbWIyOworCQkJdWludDMyX3QgZmNlX2VuYWJsZV9tYjM7CisJCQl1aW50MzJfdCBmY2VfZW5hYmxlX21iNDsKKwkJCXVpbnQzMl90IGZjZV9lbmFibGVfbWI1OworCQkJdWludDMyX3QgZmNlX2VuYWJsZV9tYjY7CisJCX0gdDI2NDsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQl9IHQyNjU7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJfSB0MjY2OworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCQl1aW50OF90ICBwY2lfb2Zmc2V0OworCQkJdWludDhfdCAgcmVzZXJ2ZWRbM107CisJCQl1aW50MzJfdCBkYXRhOworCQl9IHQyNjc7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJCXVpbnQ4X3QgIGJ1Zl90eXBlOworCQkJdWludDhfdCAgcmVzZXJ2ZWRbM107CisJCQl1aW50MzJfdCBidWZfc2l6ZTsKKwkJCXVpbnQ2NF90IHN0YXJ0X2FkZHI7CisJCX0gdDI2ODsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQkJdWludDMyX3Qgc2NyYXRjaF9zaXplOworCQl9IHQyNjk7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJCXVpbnQzMl90IGFkZHI7CisJCQl1aW50MzJfdCBjb3VudDsKKwkJfSB0MjcwOworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCQl1aW50MzJfdCBhZGRyOworCQkJdWludDMyX3QgZGF0YTsKKwkJfSB0MjcxOworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCQl1aW50MzJfdCBhZGRyOworCQkJdWludDMyX3QgY291bnQ7CisJCX0gdDI3MjsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQkJdWludDMyX3QgYWRkcjsKKwkJCXVpbnQzMl90IGNvdW50OworCQl9IHQyNzM7CisJfTsKK307CisKKyNkZWZpbmUgVDI2Ml9SQU1fQVJFQV9DUklUSUNBTF9SQU0JMQorI2RlZmluZSBUMjYyX1JBTV9BUkVBX0VYVEVSTkFMX1JBTQkyCisjZGVmaW5lIFQyNjJfUkFNX0FSRUFfU0hBUkVEX1JBTQkzCisjZGVmaW5lIFQyNjJfUkFNX0FSRUFfRERSX1JBTQkJNAorCisjZGVmaW5lIFQyNjNfUVVFVUVfVFlQRV9SRVEJCTEKKyNkZWZpbmUgVDI2M19RVUVVRV9UWVBFX1JTUAkJMgorI2RlZmluZSBUMjYzX1FVRVVFX1RZUEVfQVRJTwkJMworCisjZGVmaW5lIFQyNjhfQlVGX1RZUEVfRVhURF9UUkFDRQkxCisjZGVmaW5lIFQyNjhfQlVGX1RZUEVfRVhDSF9CVUZPRkYJMgorI2RlZmluZSBUMjY4X0JVRl9UWVBFX0VYVERfTE9HSU4JMworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oCmluZGV4IDMxZDE5NTMuLmUzNmI5NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaApAQCAtNyw5ICs3LDkgQEAKIC8qCiAgKiBEcml2ZXIgdmVyc2lvbgogICovCi0jZGVmaW5lIFFMQTJYWFhfVkVSU0lPTiAgICAgICI4LjA2LjAwLjEyLWsiCisjZGVmaW5lIFFMQTJYWFhfVkVSU0lPTiAgICAgICI4LjA3LjAwLjAyLWsiCiAKICNkZWZpbmUgUUxBX0RSSVZFUl9NQUpPUl9WRVIJOAotI2RlZmluZSBRTEFfRFJJVkVSX01JTk9SX1ZFUgk2CisjZGVmaW5lIFFMQV9EUklWRVJfTUlOT1JfVkVSCTcKICNkZWZpbmUgUUxBX0RSSVZFUl9QQVRDSF9WRVIJMAogI2RlZmluZSBRTEFfRFJJVkVSX0JFVEFfVkVSCTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF84M3h4LmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfODN4eC5jCmluZGV4IDkxOTI4NDguLjJlYmEzNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF84M3h4LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0XzgzeHguYwpAQCAtMTMwNCwxMiArMTMwNCwyNCBAQAogc3RhdGljIGludCBxbGE0XzgzeHhfcmVzdGFydChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7CiAJaW50IHJldF92YWwgPSBRTEFfU1VDQ0VTUzsKKwl1aW50MzJfdCBpZGNfY3RybDsKIAogCXFsYTRfODN4eF9wcm9jZXNzX3N0b3Bfc2VxKGhhKTsKIAotCS8qIENvbGxlY3QgbWluaWR1bXAqLwotCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KEFGXzgzWFhfTk9fRldfRFVNUCwgJmhhLT5mbGFncykpCisJLyoKKwkgKiBDb2xsZWN0IG1pbmlkdW1wLgorCSAqIElmIElEQ19DVFJMIEJJVDEgaXMgc2V0LCBjbGVhciBpdCBvbiBnb2luZyB0byBJTklUIHN0YXRlIGFuZAorCSAqIGRvbid0IGNvbGxlY3QgbWluaWR1bXAKKwkgKi8KKwlpZGNfY3RybCA9IHFsYTRfODN4eF9yZF9yZWcoaGEsIFFMQTgzWFhfSURDX0RSVl9DVFJMKTsKKwlpZiAoaWRjX2N0cmwgJiBHUkFDRUZVTF9SRVNFVF9CSVQxKSB7CisJCXFsYTRfODN4eF93cl9yZWcoaGEsIFFMQTgzWFhfSURDX0RSVl9DVFJMLAorCQkJCSAoaWRjX2N0cmwgJiB+R1JBQ0VGVUxfUkVTRVRfQklUMSkpOworCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogR3JhY2VmdWwgUkVTRVQ6IE5vdCBjb2xsZWN0aW5nIG1pbmlkdW1wXG4iLAorCQkJICAgX19mdW5jX18pOworCX0gZWxzZSB7CiAJCXFsYTRfOHh4eF9nZXRfbWluaWR1bXAoaGEpOworCX0KIAogCXFsYTRfODN4eF9wcm9jZXNzX2luaXRfc2VxKGhhKTsKIApAQCAtMTY2NCwzICsxNjc2LDIzIEBACiAJX19xbGE0XzgzeHhfZGlzYWJsZV9wYXVzZShoYSk7CiAJaGEtPmlzcF9vcHMtPmlkY191bmxvY2soaGEpOwogfQorCisvKioKKyAqIHFsYTRfODN4eF9pc19kZXRhY2hlZCAtIENoZWNrIGlmIHdlIGFyZSBtYXJrZWQgaW52aXNpYmxlLgorICogQGhhOiBQb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKiovCitpbnQgcWxhNF84M3h4X2lzX2RldGFjaGVkKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwl1aW50MzJfdCBkcnZfYWN0aXZlOworCisJZHJ2X2FjdGl2ZSA9IHFsYTRfOHh4eF9yZF9kaXJlY3QoaGEsIFFMQThYWFhfQ1JCX0RSVl9BQ1RJVkUpOworCisJaWYgKHRlc3RfYml0KEFGX0lOSVRfRE9ORSwgJmhhLT5mbGFncykgJiYKKwkgICAgIShkcnZfYWN0aXZlICYgKDEgPDwgaGEtPmZ1bmNfbnVtKSkpIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBkcnZfYWN0aXZlID0gMHglWFxuIiwKKwkJCQkgIF9fZnVuY19fLCBkcnZfYWN0aXZlKSk7CisJCXJldHVybiBRTEFfU1VDQ0VTUzsKKwl9CisKKwlyZXR1cm4gUUxBX0VSUk9SOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2JzZy5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2JzZy5jCmluZGV4IDA0YTAwMjcuLjlmOTJjYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9ic2cuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfYnNnLmMKQEAgLTUxNyw3ICs1MTcsNyBAQAogCQkJCQkJKGhhLT5pZGNfZXh0ZW5kX3RtbyAqIEhaKSkpIHsKIAkJCQloYS0+bm90aWZ5X2lkY19jb21wID0gMDsKIAkJCQloYS0+bm90aWZ5X2xpbmtfdXBfY29tcCA9IDA7Ci0JCQkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiJXM6IElEQyBDb21wbGV0ZSBub3RpZmljYXRpb24gbm90IHJlY2VpdmVkIiwKKwkJCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICIlczogQWJvcnRpbmc6IElEQyBDb21wbGV0ZSBub3RpZmljYXRpb24gbm90IHJlY2VpdmVkIiwKIAkJCQkJICAgX19mdW5jX18pOwogCQkJCXN0YXR1cyA9IFFMQV9FUlJPUjsKIAkJCQlnb3RvIGV4aXRfd2FpdDsKQEAgLTUzOCw3ICs1MzgsNyBAQAogCQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaGEtPmxpbmtfdXBfY29tcCwKIAkJCQkJCSAoSURDX0NPTVBfVE9WICogSFopKSkgewogCQkJaGEtPm5vdGlmeV9saW5rX3VwX2NvbXAgPSAwOwotCQkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiJXM6IExJTksgVVAgbm90aWZpY2F0aW9uIG5vdCByZWNlaXZlZCIsCisJCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICIlczogQWJvcnRpbmc6IExJTksgVVAgbm90aWZpY2F0aW9uIG5vdCByZWNlaXZlZCIsCiAJCQkJICAgX19mdW5jX18pOwogCQkJc3RhdHVzID0gUUxBX0VSUk9SOwogCQkJZ290byBleGl0X3dhaXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZGVmLmggYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZGVmLmgKaW5kZXggYWE2N2JiOS4uNzNhNTAyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2RlZi5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9kZWYuaApAQCAtMTk0LDcgKzE5NCw3IEBACiAjZGVmaW5lIEFEQVBURVJfSU5JVF9UT1YJCTMwCiAjZGVmaW5lIEFEQVBURVJfUkVTRVRfVE9WCQkxODAKICNkZWZpbmUgRVhURU5EX0NNRF9UT1YJCQk2MAotI2RlZmluZSBXQUlUX0NNRF9UT1YJCQkzMAorI2RlZmluZSBXQUlUX0NNRF9UT1YJCQk1CiAjZGVmaW5lIEVIX1dBSVRfQ01EX1RPVgkJCTEyMAogI2RlZmluZSBGSVJNV0FSRV9VUF9UT1YJCQk2MAogI2RlZmluZSBSRVNFVF9GSVJNV0FSRV9UT1YJCTMwCkBAIC0yOTcsNiArMjk3LDggQEAKIAogCS8qIERyaXZlciBSZS1sb2dpbiAgKi8KIAl1bnNpZ25lZCBsb25nIGZsYWdzOwkJICAvKiBEREIgRmxhZ3MgKi8KKyNkZWZpbmUgRERCX0NPTk5fQ0xPU0VfRkFJTFVSRQkJMCAvKiAweDAwMDAwMDAxICovCisKIAl1aW50MTZfdCBkZWZhdWx0X3JlbG9naW5fdGltZW91dDsgLyogIE1heCB0aW1lIHRvIHdhaXQgZm9yCiAJCQkJCSAgICogIHJlbG9naW4gdG8gY29tcGxldGUgKi8KIAlhdG9taWNfdCByZXRyeV9yZWxvZ2luX3RpbWVyOwkgIC8qIE1pbiBUaW1lIGJldHdlZW4gcmVsb2dpbnMKQEAgLTU4MCw3ICs1ODIsNiBAQAogI2RlZmluZSBBRl84MlhYX0ZXX0RVTVBFRAkJMjQgLyogMHgwMTAwMDAwMCAqLwogI2RlZmluZSBBRl84WFhYX1JTVF9PV05FUgkJMjUgLyogMHgwMjAwMDAwMCAqLwogI2RlZmluZSBBRl84MlhYX0RVTVBfUkVBRElORwkJMjYgLyogMHgwNDAwMDAwMCAqLwotI2RlZmluZSBBRl84M1hYX05PX0ZXX0RVTVAJCTI3IC8qIDB4MDgwMDAwMDAgKi8KICNkZWZpbmUgQUZfODNYWF9JT0NCX0lOVFJfT04JCTI4IC8qIDB4MTAwMDAwMDAgKi8KICNkZWZpbmUgQUZfODNYWF9NQk9YX0lOVFJfT04JCTI5IC8qIDB4MjAwMDAwMDAgKi8KIApAQCAtNTk1LDEwICs1OTYsMTAgQEAKICNkZWZpbmUgRFBDX0FFTgkJCQk5IC8qIDB4MDAwMDAyMDAgKi8KICNkZWZpbmUgRFBDX0dFVF9ESENQX0lQX0FERFIJCTE1IC8qIDB4MDAwMDgwMDAgKi8KICNkZWZpbmUgRFBDX0xJTktfQ0hBTkdFRAkJMTggLyogMHgwMDA0MDAwMCAqLwotI2RlZmluZSBEUENfUkVTRVRfQUNUSVZFCQkyMCAvKiAweDAwMDQwMDAwICovCi0jZGVmaW5lIERQQ19IQV9VTlJFQ09WRVJBQkxFCQkyMSAvKiAweDAwMDgwMDAwIElTUC04Mnh4IG9ubHkqLwotI2RlZmluZSBEUENfSEFfTkVFRF9RVUlFU0NFTlQJCTIyIC8qIDB4MDAxMDAwMDAgSVNQLTgyeHggb25seSovCi0jZGVmaW5lIERQQ19QT1NUX0lEQ19BQ0sJCTIzIC8qIDB4MDAyMDAwMDAgKi8KKyNkZWZpbmUgRFBDX1JFU0VUX0FDVElWRQkJMjAgLyogMHgwMDEwMDAwMCAqLworI2RlZmluZSBEUENfSEFfVU5SRUNPVkVSQUJMRQkJMjEgLyogMHgwMDIwMDAwMCBJU1AtODJ4eCBvbmx5Ki8KKyNkZWZpbmUgRFBDX0hBX05FRURfUVVJRVNDRU5UCQkyMiAvKiAweDAwNDAwMDAwIElTUC04Mnh4IG9ubHkqLworI2RlZmluZSBEUENfUE9TVF9JRENfQUNLCQkyMyAvKiAweDAwODAwMDAwICovCiAjZGVmaW5lIERQQ19SRVNUT1JFX0FDQgkJCTI0IC8qIDB4MDEwMDAwMDAgKi8KIAogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7IC8qIHBvaW50ZXIgdG8gaG9zdCBkYXRhICovCkBAIC03NjgsNiArNzY5LDcgQEAKIAl1aW50MzJfdCBmd19kdW1wX2NhcHR1cmVfbWFzazsKIAl2b2lkICpmd19kdW1wX3RtcGx0X2hkcjsKIAl1aW50MzJfdCBmd19kdW1wX3RtcGx0X3NpemU7CisJdWludDMyX3QgZndfZHVtcF9za2lwX3NpemU7CiAKIAlzdHJ1Y3QgY29tcGxldGlvbiBtYnhfaW50cl9jb21wOwogCkBAIC05MTAsNyArOTEyLDggQEAKIHN0YXRpYyBpbmxpbmUgaW50IGlzX2Flcl9zdXBwb3J0ZWQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewogCXJldHVybiAoKGhhLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQODAyMikgfHwKLQkJKGhhLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQODMyNCkpOworCQkoaGEtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4MzI0KSB8fAorCQkoaGEtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4MDQyKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGFkYXB0ZXJfdXAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2Z3LmggYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZncuaAppbmRleCA4ZDQwOTJiLi4yMDk4NTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZncuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZncuaApAQCAtMzkwLDYgKzM5MCw3IEBACiAjZGVmaW5lIE1CT1hfQ01EX0NMRUFSX0RBVEFCQVNFX0VOVFJZCQkweDAwMzEKICNkZWZpbmUgTUJPWF9DTURfQ09OTl9PUEVOCQkJMHgwMDc0CiAjZGVmaW5lIE1CT1hfQ01EX0NPTk5fQ0xPU0VfU0VTU19MT0dPVVQJCTB4MDA1NgorI2RlZmluZSBEREJfTk9UX0xPR0dFRF9JTgkJCTB4MDkKICNkZWZpbmUgTE9HT1VUX09QVElPTl9DTE9TRV9TRVNTSU9OCQkweDAwMDIKICNkZWZpbmUgTE9HT1VUX09QVElPTl9SRUxPR0lOCQkJMHgwMDA0CiAjZGVmaW5lIExPR09VVF9PUFRJT05fRlJFRV9EREIJCQkweDAwMDgKQEAgLTUwNSw5ICs1MDYsOSBAQAogI2RlZmluZSBNQk9YX0FTVFNfUkVTUE9OU0VfUVVFVUVfRlVMTAkJMHg4MDI4CiAjZGVmaW5lIE1CT1hfQVNUU19JUF9BRERSX1NUQVRFX0NIQU5HRUQJCTB4ODAyOQogI2RlZmluZSBNQk9YX0FTVFNfSVBWNl9ERUZBVUxUX1JPVVRFUl9DSEFOR0VECTB4ODAyQQotI2RlZmluZSBNQk9YX0FTVFNfSVBWNl9QUkVGSVhfRVhQSVJFRAkJMHg4MDJCCi0jZGVmaW5lIE1CT1hfQVNUU19JUFY2X05EX1BSRUZJWF9JR05PUkVECTB4ODAyQwotI2RlZmluZSBNQk9YX0FTVFNfSVBWNl9MQ0xfUFJFRklYX0lHTk9SRUQJMHg4MDJECisjZGVmaW5lIE1CT1hfQVNUU19JUFY2X0xJTktfTVRVX0NIQU5HRQkJMHg4MDJCCisjZGVmaW5lIE1CT1hfQVNUU19JUFY2X0FVVE9fUFJFRklYX0lHTk9SRUQJMHg4MDJDCisjZGVmaW5lIE1CT1hfQVNUU19JUFY2X05EX0xPQ0FMX1BSRUZJWF9JR05PUkVECTB4ODAyRAogI2RlZmluZSBNQk9YX0FTVFNfSUNNUFY2X0VSUk9SX01TR19SQ1ZECQkweDgwMkUKICNkZWZpbmUgTUJPWF9BU1RTX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRAkJMHg4MDMxCiAjZGVmaW5lIE1CT1hfQVNUU19TWVNURU1fV0FSTklOR19FVkVOVAkJMHg4MDM2CkBAIC01MjgsMTQgKzUyOSwxNCBAQAogI2RlZmluZSBBQ0JfQ09ORklHX0RJU0FCTEUJCTB4MDAKICNkZWZpbmUgQUNCX0NPTkZJR19TRVQJCQkweDAxCiAKLS8qIEFDQiBTdGF0ZSBEZWZpbmVzICovCi0jZGVmaW5lIEFDQl9TVEFURV9VTkNPTkZJR1VSRUQJMHgwMAotI2RlZmluZSBBQ0JfU1RBVEVfSU5WQUxJRAkweDAxCi0jZGVmaW5lIEFDQl9TVEFURV9BQ1FVSVJJTkcJMHgwMgotI2RlZmluZSBBQ0JfU1RBVEVfVEVOVEFUSVZFCTB4MDMKLSNkZWZpbmUgQUNCX1NUQVRFX0RFUFJJQ0FURUQJMHgwNAotI2RlZmluZSBBQ0JfU1RBVEVfVkFMSUQJCTB4MDUKLSNkZWZpbmUgQUNCX1NUQVRFX0RJU0FCTElORwkweDA2CisvKiBBQ0IvSVAgQWRkcmVzcyBTdGF0ZSBEZWZpbmVzICovCisjZGVmaW5lIElQX0FERFJTVEFURV9VTkNPTkZJR1VSRUQJMAorI2RlZmluZSBJUF9BRERSU1RBVEVfSU5WQUxJRAkJMQorI2RlZmluZSBJUF9BRERSU1RBVEVfQUNRVUlSSU5HCQkyCisjZGVmaW5lIElQX0FERFJTVEFURV9URU5UQVRJVkUJCTMKKyNkZWZpbmUgSVBfQUREUlNUQVRFX0RFUFJJQ0FURUQJCTQKKyNkZWZpbmUgSVBfQUREUlNUQVRFX1BSRUZFUlJFRAkJNQorI2RlZmluZSBJUF9BRERSU1RBVEVfRElTQUJMSU5HCQk2CiAKIC8qIEZMQVNIIG9mZnNldHMgKi8KICNkZWZpbmUgRkxBU0hfU0VHTUVOVF9JRkNCCTB4MDQwMDAwMDAKQEAgLTY5OCwxNCArNjk5LDYgQEAKIAl1aW50OF90IGlwdjZfbG5rX2xjbF9hZGRyX3N0YXRlOy8qIDIyMiAqLwogCXVpbnQ4X3QgaXB2Nl9hZGRyMF9zdGF0ZTsJLyogMjIzICovCiAJdWludDhfdCBpcHY2X2FkZHIxX3N0YXRlOwkvKiAyMjQgKi8KLSNkZWZpbmUgSVBfQUREUlNUQVRFX1VOQ09ORklHVVJFRAkwCi0jZGVmaW5lIElQX0FERFJTVEFURV9JTlZBTElECQkxCi0jZGVmaW5lIElQX0FERFJTVEFURV9BQ1FVSVJJTkcJCTIKLSNkZWZpbmUgSVBfQUREUlNUQVRFX1RFTlRBVElWRQkJMwotI2RlZmluZSBJUF9BRERSU1RBVEVfREVQUklDQVRFRAkJNAotI2RlZmluZSBJUF9BRERSU1RBVEVfUFJFRkVSUkVECQk1Ci0jZGVmaW5lIElQX0FERFJTVEFURV9ESVNBQkxJTkcJCTYKLQogCXVpbnQ4X3QgaXB2Nl9kZmx0X3J0cl9zdGF0ZTsgICAgLyogMjI1ICovCiAjZGVmaW5lIElQVjZfUlRSU1RBVEVfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIElQVjZfUlRSU1RBVEVfTUFOVUFMICAgICAgICAgICAgICAgICAgICAxCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZ2xibC5oIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2dsYmwuaAppbmRleCBkNjdjNTBlLi5iMWExOWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZ2xibC5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9nbGJsLmgKQEAgLTI3OSw2ICsyNzksOCBAQAogdWludDhfdCBxbGE0eHh4X3NldF9pcGFkZHJfc3RhdGUodWludDhfdCBmd19pcGFkZHJfc3RhdGUpOwogaW50IHFsYTRfODN4eF9nZXRfcG9ydF9jb25maWcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MzJfdCAqY29uZmlnKTsKIGludCBxbGE0XzgzeHhfc2V0X3BvcnRfY29uZmlnKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgKmNvbmZpZyk7CitpbnQgcWxhNF84eHh4X2NoZWNrX2luaXRfYWRhcHRlcl9yZXRyeShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOworaW50IHFsYTRfODN4eF9pc19kZXRhY2hlZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwogCiBleHRlcm4gaW50IHFsNHhleHRlbmRlZF9lcnJvcl9sb2dnaW5nOwogZXh0ZXJuIGludCBxbDR4ZG9udHJlc2V0aGJhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2luaXQuYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pbml0LmMKaW5kZXggNzQ1NmVlYi4uMjhmYmVjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW5pdC5jCkBAIC05NTksMTMgKzk1OSw4IEBACiAJCXFsYTR4eHhfYnVpbGRfZGRiX2xpc3QoaGEsIGlzX3Jlc2V0KTsKIAogCXNldF9iaXQoQUZfT05MSU5FLCAmaGEtPmZsYWdzKTsKLWV4aXRfaW5pdF9oYmE6Ci0JaWYgKGlzX3FsYTgwWFgoaGEpICYmIChzdGF0dXMgPT0gUUxBX0VSUk9SKSkgewotCQkvKiBTaW5jZSBpbnRlcnJ1cHRzIGFyZSByZWdpc3RlcmVkIGluIHN0YXJ0X2Zpcm13YXJlIGZvcgotCQkgKiA4MFhYLCByZWxlYXNlIHRoZW0gaGVyZSBpZiBpbml0aWFsaXplX2FkYXB0ZXIgZmFpbHMgKi8KLQkJcWxhNHh4eF9mcmVlX2lycXMoaGEpOwotCX0KIAorZXhpdF9pbml0X2hiYToKIAlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiBpbml0aWFsaXplIGFkYXB0ZXI6ICVzXG4iLCBoYS0+aG9zdF9ubywKIAkgICAgc3RhdHVzID09IFFMQV9FUlJPUiA/ICJGQUlMRUQiIDogIlNVQ0NFRURFRCIpKTsKIAlyZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2lzci5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2lzci5jCmluZGV4IGEzYzhiYzcuLmIxOTI1ZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pc3IuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaXNyLmMKQEAgLTM4NSw5ICszODUsOSBAQAogCiAJY2xzX2Nvbm4gPSBkZGJfZW50cnktPmNvbm47CiAJY29ubiA9IGNsc19jb25uLT5kZF9kYXRhOwotCXNwaW5fbG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCXRhc2sgPSBpc2NzaV9pdHRfdG9fdGFzayhjb25uLCBpdHQpOwotCXNwaW5fdW5sb2NrKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAogCWlmICh0YXNrID09IE5VTEwpIHsKIAkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogVGFzayBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CkBAIC02MzUsNiArNjM1LDE4IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBxbGE0eHh4X2RlZmF1bHRfcm91dGVyX2NoYW5nZWQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQkJCQkgICB1aW50MzJfdCAqbWJveF9zdHMpCit7CisJbWVtY3B5KCZoYS0+aXBfY29uZmlnLmlwdjZfZGVmYXVsdF9yb3V0ZXJfYWRkci5zNl9hZGRyMzJbMF0sCisJICAgICAgICZtYm94X3N0c1syXSwgc2l6ZW9mKHVpbnQzMl90KSk7CisJbWVtY3B5KCZoYS0+aXBfY29uZmlnLmlwdjZfZGVmYXVsdF9yb3V0ZXJfYWRkci5zNl9hZGRyMzJbMV0sCisJICAgICAgICZtYm94X3N0c1szXSwgc2l6ZW9mKHVpbnQzMl90KSk7CisJbWVtY3B5KCZoYS0+aXBfY29uZmlnLmlwdjZfZGVmYXVsdF9yb3V0ZXJfYWRkci5zNl9hZGRyMzJbMl0sCisJICAgICAgICZtYm94X3N0c1s0XSwgc2l6ZW9mKHVpbnQzMl90KSk7CisJbWVtY3B5KCZoYS0+aXBfY29uZmlnLmlwdjZfZGVmYXVsdF9yb3V0ZXJfYWRkci5zNl9hZGRyMzJbM10sCisJICAgICAgICZtYm94X3N0c1s1XSwgc2l6ZW9mKHVpbnQzMl90KSk7Cit9CiAKIC8qKgogICogcWxhNHh4eF9pc3JfZGVjb2RlX21haWxib3ggLSBkZWNvZGVzIG1haWxib3ggc3RhdHVzCkBAIC03ODEsMjcgKzc5Myw0NCBAQAogCQkJCQkJICAgIG1ib3hfc3RzWzNdKTsKIAkJCS8qIG1ib3hfc3RzWzJdID0gT2xkIEFDQiBzdGF0ZQogCQkJICogbWJveF9zdHNbM10gPSBuZXcgQUNCIHN0YXRlICovCi0JCQlpZiAoKG1ib3hfc3RzWzNdID09IEFDQl9TVEFURV9WQUxJRCkgJiYKLQkJCSAgICAoKG1ib3hfc3RzWzJdID09IEFDQl9TVEFURV9URU5UQVRJVkUpIHx8Ci0JCQkgICAgKG1ib3hfc3RzWzJdID09IEFDQl9TVEFURV9BQ1FVSVJJTkcpKSkgeworCQkJaWYgKChtYm94X3N0c1szXSA9PSBJUF9BRERSU1RBVEVfUFJFRkVSUkVEKSAmJgorCQkJICAgICgobWJveF9zdHNbMl0gPT0gSVBfQUREUlNUQVRFX1RFTlRBVElWRSkgfHwKKwkJCSAgICAgKG1ib3hfc3RzWzJdID09IElQX0FERFJTVEFURV9BQ1FVSVJJTkcpKSkgewogCQkJCXNldF9iaXQoRFBDX0dFVF9ESENQX0lQX0FERFIsICZoYS0+ZHBjX2ZsYWdzKTsKLQkJCX0gZWxzZSBpZiAoKG1ib3hfc3RzWzNdID09IEFDQl9TVEFURV9BQ1FVSVJJTkcpICYmCi0JCQkJICAgKG1ib3hfc3RzWzJdID09IEFDQl9TVEFURV9WQUxJRCkpIHsKKwkJCX0gZWxzZSBpZiAoKG1ib3hfc3RzWzNdID09IElQX0FERFJTVEFURV9BQ1FVSVJJTkcpICYmCisJCQkJICAgKG1ib3hfc3RzWzJdID09IElQX0FERFJTVEFURV9QUkVGRVJSRUQpKSB7CiAJCQkJaWYgKGlzX3FsYTgwWFgoaGEpKQogCQkJCQlzZXRfYml0KERQQ19SRVNFVF9IQV9GV19DT05URVhULAogCQkJCQkJJmhhLT5kcGNfZmxhZ3MpOwogCQkJCWVsc2UKIAkJCQkJc2V0X2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKTsKLQkJCX0gZWxzZSBpZiAobWJveF9zdHNbM10gPT0gQUNCX1NUQVRFX0RJU0FCTElORykgeworCQkJfSBlbHNlIGlmIChtYm94X3N0c1szXSA9PSBJUF9BRERSU1RBVEVfRElTQUJMSU5HKSB7CiAJCQkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAic2NzaSVsZDogJXM6IEFDQiBpbiBkaXNhYmxpbmcgc3RhdGVcbiIsCiAJCQkJCSAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXyk7Ci0JCQl9IGVsc2UgaWYgKChtYm94X3N0c1szXSA9PSBBQ0JfU1RBVEVfVU5DT05GSUdVUkVEKSkgeworCQkJfSBlbHNlIGlmIChtYm94X3N0c1szXSA9PSBJUF9BRERSU1RBVEVfVU5DT05GSUdVUkVEKSB7CiAJCQkJY29tcGxldGUoJmhhLT5kaXNhYmxlX2FjYl9jb21wKTsKIAkJCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJzY3NpJWxkOiAlczogQUNCIHN0YXRlIHVuY29uZmlndXJlZFxuIiwKIAkJCQkJICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKTsKIAkJCX0KIAkJCWJyZWFrOwogCisJCWNhc2UgTUJPWF9BU1RTX0lQVjZfTElOS19NVFVfQ0hBTkdFOgorCQljYXNlIE1CT1hfQVNUU19JUFY2X0FVVE9fUFJFRklYX0lHTk9SRUQ6CisJCWNhc2UgTUJPWF9BU1RTX0lQVjZfTkRfTE9DQUxfUFJFRklYX0lHTk9SRUQ6CisJCQkvKiBObyBhY3Rpb24gKi8KKwkJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJzY3NpJWxkOiBBRU4gJTA0eFxuIiwKKwkJCQkJICBoYS0+aG9zdF9ubywgbWJveF9zdGF0dXMpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUJPWF9BU1RTX0lDTVBWNl9FUlJPUl9NU0dfUkNWRDoKKwkJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkJCSAgInNjc2klbGQ6IEFFTiAlMDR4LCBJUHY2IEVSUk9SLCAiCisJCQkJCSAgIm1ib3hfc3RzWzFdPSUwOHgsIG1ib3hfc3RzWzJdPSUwOHgsIG1ib3hfc3RzWzN9PSUwOHgsIG1ib3hfc3RzWzRdPSUwOHggbWJveF9zdHNbNV09JTA4eFxuIiwKKwkJCQkJICBoYS0+aG9zdF9ubywgbWJveF9zdHNbMF0sIG1ib3hfc3RzWzFdLAorCQkJCQkgIG1ib3hfc3RzWzJdLCBtYm94X3N0c1szXSwgbWJveF9zdHNbNF0sCisJCQkJCSAgbWJveF9zdHNbNV0pKTsKKwkJCWJyZWFrOworCiAJCWNhc2UgTUJPWF9BU1RTX01BQ19BRERSRVNTX0NIQU5HRUQ6CiAJCWNhc2UgTUJPWF9BU1RTX0ROUzoKIAkJCS8qIE5vIGFjdGlvbiAqLwpAQCAtOTM5LDYgKzk2OCw3IEBACiAJCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAogCQkJCQkgICJzY3NpJWxkOiBBRU4gJTA0eCBSZWNlaXZlZCBJUHY2IGRlZmF1bHQgcm91dGVyIGNoYW5nZWQgbm90aWZpY2F0aW9uXG4iLAogCQkJCQkgIGhhLT5ob3N0X25vLCBtYm94X3N0c1swXSkpOworCQkJcWxhNHh4eF9kZWZhdWx0X3JvdXRlcl9jaGFuZ2VkKGhhLCBtYm94X3N0cyk7CiAJCQlicmVhazsKIAogCQljYXNlIE1CT1hfQVNUU19JRENfVElNRV9FWFRFTkRfTk9USUZJQ0FUSU9OOgpAQCAtMTAyMiw3ICsxMDUyLDggQEAKICAgICB1aW50MzJfdCBpbnRyX3N0YXR1cykKIHsKIAkvKiBQcm9jZXNzIHJlc3BvbnNlIHF1ZXVlIGludGVycnVwdC4gKi8KLQlpZiAoaW50cl9zdGF0dXMgJiBIU1JYX1JJU0NfSU9DQl9JTlQpCisJaWYgKChpbnRyX3N0YXR1cyAmIEhTUlhfUklTQ19JT0NCX0lOVCkgJiYKKwkgICAgdGVzdF9iaXQoQUZfSU5JVF9ET05FLCAmaGEtPmZsYWdzKSkKIAkJcWxhNHh4eF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKGhhKTsKIAogCS8qIFByb2Nlc3MgbWFpbGJveC9hc3luY2ggZXZlbnQgaW50ZXJydXB0LiovCkBAIC0xMzk5LDYgKzE0MzAsNyBAQAogewogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IGRldl9pZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpbnRyX3N0YXR1czsKIAl1aW50MzJfdCBpdmFsID0gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwpAQCAtMTQxMiw4ICsxNDQ0LDE1IEBACiAJCXFsYTR4eHhfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShoYSk7CiAJCXdyaXRlbCgwLCAmaGEtPnFsYTRfODN4eF9yZWctPmlvY2JfaW50X21hc2spOwogCX0gZWxzZSB7Ci0JCXFsYTR4eHhfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShoYSk7Ci0JCXdyaXRlbCgwLCAmaGEtPnFsYTRfODJ4eF9yZWctPmhvc3RfaW50KTsKKwkJaW50cl9zdGF0dXMgPSByZWFkbCgmaGEtPnFsYTRfODJ4eF9yZWctPmhvc3Rfc3RhdHVzKTsKKwkJaWYgKGludHJfc3RhdHVzICYgSFNSWF9SSVNDX0lPQ0JfSU5UKSB7CisJCQlxbGE0eHh4X3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoaGEpOworCQkJd3JpdGVsKDAsICZoYS0+cWxhNF84Mnh4X3JlZy0+aG9zdF9pbnQpOworCQl9IGVsc2UgeworCQkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IHNwdXJpb3VzIGlvY2IgaW50ZXJydXB0Li4uXG4iLAorCQkJCSAgIF9fZnVuY19fKTsKKwkJCWdvdG8gZXhpdF9tc2l4X3JzcF9xOworCQl9CiAJfQogCWhhLT5pc3JfY291bnQrKzsKIGV4aXRfbXNpeF9yc3BfcToKQEAgLTE0ODgsNiArMTUyNyw3IEBACiBpbnQgcWxhNHh4eF9yZXF1ZXN0X2lycXMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewogCWludCByZXQ7CisJaW50IHJ2YWwgPSBRTEFfRVJST1I7CiAKIAlpZiAoaXNfcWxhNDBYWChoYSkpCiAJCWdvdG8gdHJ5X2ludHg7CkBAIC0xNTY4LDkgKzE2MDgsMTAgQEAKIAlzZXRfYml0KEFGX0lSUV9BVFRBQ0hFRCwgJmhhLT5mbGFncyk7CiAJaGEtPmhvc3QtPmlycSA9IGhhLT5wZGV2LT5pcnE7CiAJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IGlycSAlZCBhdHRhY2hlZFxuIiwKLQkgICAgX19mdW5jX18sIGhhLT5wZGV2LT5pcnEpOworCQkgICBfX2Z1bmNfXywgaGEtPnBkZXYtPmlycSk7CisJcnZhbCA9IFFMQV9TVUNDRVNTOwogaXJxX25vdF9hdHRhY2hlZDoKLQlyZXR1cm4gcmV0OworCXJldHVybiBydmFsOwogfQogCiB2b2lkIHFsYTR4eHhfZnJlZV9pcnFzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9tYnguYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9tYnguYwppbmRleCA5YWU4Y2EzLi4wYTZiNzgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbWJ4LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X21ieC5jCkBAIC0yMTIsOSArMjEyLDggQEAKIAkJCSAgICBoYS0+aG9zdF9ubywgX19mdW5jX18pKTsKIAkJCWdvdG8gbWJveF9leGl0OwogCQl9Ci0JCURFQlVHMihwcmludGsoInNjc2klbGQ6IE1haWxib3ggQ21kIDB4JTA4WCB0aW1lZCBvdXQgLi4uLCIKLQkJCSAgICAgICIgU2NoZWR1bGluZyBBZGFwdGVyIFJlc2V0XG4iLCBoYS0+aG9zdF9ubywKLQkJCSAgICAgIG1ieF9jbWRbMF0pKTsKKwkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAic2NzaSVsZDogTWFpbGJveCBDbWQgMHglMDhYIHRpbWVkIG91dCwgU2NoZWR1bGluZyBBZGFwdGVyIFJlc2V0XG4iLAorCQkJICAgaGEtPmhvc3Rfbm8sIG1ieF9jbWRbMF0pOwogCQloYS0+bWFpbGJveF90aW1lb3V0X2NvdW50Kys7CiAJCW1ieF9zdHNbMF0gPSAoLTEpOwogCQlzZXRfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpOwpAQCAtMjUxLDE1ICsyNTAsMTYgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE1CT1hfU1RTX0JVU1k6Ci0JCURFQlVHMiggcHJpbnRrKCJzY3NpJWxkOiAlczogQ21kID0gJTA4WCwgSVNQIEJVU1lcbiIsCi0JCQkgICAgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBtYnhfY21kWzBdKSk7CisJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgInNjc2klbGQ6ICVzOiBDbWQgPSAlMDhYLCBJU1AgQlVTWVxuIiwKKwkJCSAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgbWJ4X2NtZFswXSk7CiAJCWhhLT5tYWlsYm94X3RpbWVvdXRfY291bnQrKzsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogKioqKiBGQUlMRUQsIGNtZCA9ICUwOFgsICIKLQkJCSAgICAgICJzdHMgPSAlMDhYICoqKipcbiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKLQkJCSAgICAgIG1ieF9jbWRbMF0sIG1ieF9zdHNbMF0pKTsKKwkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAic2NzaSVsZDogJXM6IEZBSUxFRCwgTUJPWCBDTUQgPSAlMDhYLCBNQk9YIFNUUyA9ICUwOFggJTA4WCAlMDhYICUwOFggJTA4WCAlMDhYICUwOFggJTA4WFxuIiwKKwkJCSAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgbWJ4X2NtZFswXSwgbWJ4X3N0c1swXSwKKwkJCSAgIG1ieF9zdHNbMV0sIG1ieF9zdHNbMl0sIG1ieF9zdHNbM10sIG1ieF9zdHNbNF0sCisJCQkgICBtYnhfc3RzWzVdLCBtYnhfc3RzWzZdLCBtYnhfc3RzWzddKTsKIAkJYnJlYWs7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CkBAIC0zODMsNyArMzgzLDYgQEAKIAltYm94X2NtZFsyXSA9IExTRFcoaW5pdF9md19jYl9kbWEpOwogCW1ib3hfY21kWzNdID0gTVNEVyhpbml0X2Z3X2NiX2RtYSk7CiAJbWJveF9jbWRbNF0gPSBzaXplb2Yoc3RydWN0IGFkZHJfY3RybF9ibGspOwotCW1ib3hfY21kWzVdID0gKElGQ0JfVkVSX01BWCA8PCA4KSB8IElGQ0JfVkVSX01JTjsKIAogCWlmIChxbGE0eHh4X21haWxib3hfY29tbWFuZChoYSwgNiwgNiwgbWJveF9jbWQsIG1ib3hfc3RzKSAhPQogCSAgICBRTEFfU1VDQ0VTUykgewpAQCAtNjQ4LDkgKzY0Nyw2IEBACiAJCWdvdG8gZXhpdF9pbml0X2Z3X2NiOwogCX0KIAotCS8qIEluaXRpYWxpemUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcXVldWVzLiAqLwotCXFsYTR4eHhfaW5pdF9yaW5ncyhoYSk7Ci0KIAkvKiBGaWxsIGluIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSBxdWV1ZSBpbmZvcm1hdGlvbi4gKi8KIAlpbml0X2Z3X2NiLT5ycXFfY29uc3VtZXJfaWR4ID0gY3B1X3RvX2xlMTYoaGEtPnJlcXVlc3Rfb3V0KTsKIAlpbml0X2Z3X2NiLT5jb21wcV9wcm9kdWNlcl9pZHggPSBjcHVfdG9fbGUxNihoYS0+cmVzcG9uc2VfaW4pOwpAQCAtMTAwMiw2ICs5OTgsMTAgQEAKIAkJCQkgICIlczogTUJPWF9DTURfQ09OTl9DTE9TRV9TRVNTX0xPR09VVCAiCiAJCQkJICAiZmFpbGVkIHN0cyAlMDRYICUwNFgiLCBfX2Z1bmNfXywKIAkJCQkgIG1ib3hfc3RzWzBdLCBtYm94X3N0c1sxXSkpOworCQlpZiAoKG1ib3hfc3RzWzBdID09IE1CT1hfU1RTX0NPTU1BTkRfRVJST1IpICYmCisJCSAgICAobWJveF9zdHNbMV0gPT0gRERCX05PVF9MT0dHRURfSU4pKSB7CisJCQlzZXRfYml0KEREQl9DT05OX0NMT1NFX0ZBSUxVUkUsICZkZGJfZW50cnktPmZsYWdzKTsKKwkJfQogCX0KIAogCXJldHVybiBzdGF0dXM7CkBAIC0xOTE4LDYgKzE5MTgsNyBAQAogCQkJCSAgbWJveF9zdHNbMF0sIG1ib3hfc3RzWzFdLCBtYm94X3N0c1syXSkpOwogCX0gZWxzZSB7CiAJCWlmIChpc19xbGE4MDQyKGhhKSAmJgorCQkgICAgdGVzdF9iaXQoRFBDX1BPU1RfSURDX0FDSywgJmhhLT5kcGNfZmxhZ3MpICYmCiAJCSAgICAobWJveF9zdHNbMF0gIT0gTUJPWF9TVFNfQ09NTUFORF9DT01QTEVURSkpIHsKIAkJCS8qCiAJCQkgKiBEaXNhYmxlIEFDQiBtYWlsYm94IGNvbW1hbmQgdGFrZXMgdGltZSB0byBjb21wbGV0ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X254LmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnguYwppbmRleCBkMDAxMjAyLi42MzMyOGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnguYwpAQCAtMjM4Myw2ICsyMzgzLDExIEBACiAJCQkgICJzY3NpKCVsZCk6IFNraXBwaW5nIGVudHJ5WyVkXTogRVRZUEVbMHgleF0tRUxFVkVMWzB4JXhdXG4iLAogCQkJICBoYS0+aG9zdF9ubywgaW5kZXgsIGVudHJ5X2hkci0+ZW50cnlfdHlwZSwKIAkJCSAgZW50cnlfaGRyLT5kX2N0cmwuZW50cnlfY2FwdHVyZV9tYXNrKSk7CisJLyogSWYgZHJpdmVyIGVuY291bnRlcnMgYSBuZXcgZW50cnkgdHlwZSB0aGF0IGl0IGNhbm5vdCBwcm9jZXNzLAorCSAqIGl0IHNob3VsZCBqdXN0IHNraXAgdGhlIGVudHJ5IGFuZCBhZGp1c3QgdGhlIHRvdGFsIGJ1ZmZlciBzaXplIGJ5CisJICogZnJvbSBzdWJ0cmFjdGluZyB0aGUgc2tpcHBlZCBieXRlcyBmcm9tIGl0CisJICovCisJaGEtPmZ3X2R1bXBfc2tpcF9zaXplICs9IGVudHJ5X2hkci0+ZW50cnlfY2FwdHVyZV9zaXplOwogfQogCiAvKiBJU1A4M3h4IGZ1bmN0aW9ucyB0byBwcm9jZXNzIG5ldyBtaW5pZHVtcCBlbnRyaWVzLi4uICovCkBAIC0yNTkwLDYgKzI1OTUsNyBAQAogCXVpbnQ2NF90IG5vdzsKIAl1aW50MzJfdCB0aW1lc3RhbXA7CiAKKwloYS0+ZndfZHVtcF9za2lwX3NpemUgPSAwOwogCWlmICghaGEtPmZ3X2R1bXApIHsKIAkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXMoJWxkKSBObyBidWZmZXIgdG8gZHVtcFxuIiwKIAkJCSAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubyk7CkBAIC0yNzYxLDcgKzI3NjcsNyBAQAogCQkJCSBlbnRyeV9oZHItPmVudHJ5X3NpemUpOwogCX0KIAotCWlmIChkYXRhX2NvbGxlY3RlZCAhPSBoYS0+ZndfZHVtcF9zaXplKSB7CisJaWYgKChkYXRhX2NvbGxlY3RlZCArIGhhLT5md19kdW1wX3NraXBfc2l6ZSkgIT0gaGEtPmZ3X2R1bXBfc2l6ZSkgewogCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJCQkgICAiRHVtcCBkYXRhIG1pc21hdGNoOiBEYXRhIGNvbGxlY3RlZDogWzB4JXhdLCB0b3RhbF9kYXRhX3NpemU6WzB4JXhdXG4iLAogCQkJICAgZGF0YV9jb2xsZWN0ZWQsIGhhLT5md19kdW1wX3NpemUpOwpAQCAtMjgyMCw2MyArMjgyNiwzNSBAQAogaW50IHFsYTRfOHh4eF9kZXZpY2VfYm9vdHN0cmFwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKIAlpbnQgcnZhbCA9IFFMQV9FUlJPUjsKLQlpbnQgaSwgdGltZW91dDsKLQl1aW50MzJfdCBvbGRfY291bnQsIGNvdW50LCBpZGNfY3RybDsKLQlpbnQgbmVlZF9yZXNldCA9IDAsIHBlZ19zdHVjayA9IDE7CisJaW50IGk7CisJdWludDMyX3Qgb2xkX2NvdW50LCBjb3VudDsKKwlpbnQgbmVlZF9yZXNldCA9IDA7CiAKIAluZWVkX3Jlc2V0ID0gaGEtPmlzcF9vcHMtPm5lZWRfcmVzZXQoaGEpOwotCW9sZF9jb3VudCA9IHFsYTRfOHh4eF9yZF9kaXJlY3QoaGEsIFFMQThYWFhfUEVHX0FMSVZFX0NPVU5URVIpOwotCi0JZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJdGltZW91dCA9IG1zbGVlcF9pbnRlcnJ1cHRpYmxlKDIwMCk7Ci0JCWlmICh0aW1lb3V0KSB7Ci0JCQlxbGE0Xzh4eHhfd3JfZGlyZWN0KGhhLCBRTEE4WFhYX0NSQl9ERVZfU1RBVEUsCi0JCQkJCSAgICBRTEE4WFhYX0RFVl9GQUlMRUQpOwotCQkJcmV0dXJuIHJ2YWw7Ci0JCX0KLQotCQljb3VudCA9IHFsYTRfOHh4eF9yZF9kaXJlY3QoaGEsIFFMQThYWFhfUEVHX0FMSVZFX0NPVU5URVIpOwotCQlpZiAoY291bnQgIT0gb2xkX2NvdW50KQotCQkJcGVnX3N0dWNrID0gMDsKLQl9CiAKIAlpZiAobmVlZF9yZXNldCkgewogCQkvKiBXZSBhcmUgdHJ5aW5nIHRvIHBlcmZvcm0gYSByZWNvdmVyeSBoZXJlLiAqLwotCQlpZiAocGVnX3N0dWNrKQorCQlpZiAodGVzdF9iaXQoQUZfRldfUkVDT1ZFUlksICZoYS0+ZmxhZ3MpKQogCQkJaGEtPmlzcF9vcHMtPnJvbV9sb2NrX3JlY292ZXJ5KGhhKTsKLQkJZ290byBkZXZfaW5pdGlhbGl6ZTsKIAl9IGVsc2UgIHsKLQkJLyogU3RhcnQgb2YgZGF5IGZvciB0aGlzIGhhIGNvbnRleHQuICovCi0JCWlmIChwZWdfc3R1Y2spIHsKLQkJCS8qIEVpdGhlciB3ZSBhcmUgdGhlIGZpcnN0IG9yIHJlY292ZXJ5IGluIHByb2dyZXNzLiAqLwotCQkJaGEtPmlzcF9vcHMtPnJvbV9sb2NrX3JlY292ZXJ5KGhhKTsKLQkJCWdvdG8gZGV2X2luaXRpYWxpemU7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBGaXJtd2FyZSBhbHJlYWR5IHJ1bm5pbmcuICovCi0JCQlydmFsID0gUUxBX1NVQ0NFU1M7Ci0JCQlnb3RvIGRldl9yZWFkeTsKKwkJb2xkX2NvdW50ID0gcWxhNF84eHh4X3JkX2RpcmVjdChoYSwgUUxBOFhYWF9QRUdfQUxJVkVfQ09VTlRFUik7CisJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCQltc2xlZXAoMjAwKTsKKwkJCWNvdW50ID0gcWxhNF84eHh4X3JkX2RpcmVjdChoYSwKKwkJCQkJCSAgICBRTEE4WFhYX1BFR19BTElWRV9DT1VOVEVSKTsKKwkJCWlmIChjb3VudCAhPSBvbGRfY291bnQpIHsKKwkJCQlydmFsID0gUUxBX1NVQ0NFU1M7CisJCQkJZ290byBkZXZfcmVhZHk7CisJCQl9CiAJCX0KKwkJaGEtPmlzcF9vcHMtPnJvbV9sb2NrX3JlY292ZXJ5KGhhKTsKIAl9CiAKLWRldl9pbml0aWFsaXplOgogCS8qIHNldCB0byBERVZfSU5JVElBTElaSU5HICovCiAJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiSFcgU3RhdGU6IElOSVRJQUxJWklOR1xuIik7CiAJcWxhNF84eHh4X3dyX2RpcmVjdChoYSwgUUxBOFhYWF9DUkJfREVWX1NUQVRFLAogCQkJICAgIFFMQThYWFhfREVWX0lOSVRJQUxJWklORyk7CiAKLQkvKgotCSAqIEZvciBJU1A4MzI0IGFuZCBJU1A4MDQyLCBpZiBJRENfQ1RSTCBHUkFDRUZVTF9SRVNFVF9CSVQxIGlzIHNldCwKLQkgKiByZXNldCBpdCBhZnRlciBkZXZpY2UgZ29lcyB0byBJTklUIHN0YXRlLgotCSAqLwotCWlmIChpc19xbGE4MDMyKGhhKSB8fCBpc19xbGE4MDQyKGhhKSkgewotCQlpZGNfY3RybCA9IHFsYTRfODN4eF9yZF9yZWcoaGEsIFFMQTgzWFhfSURDX0RSVl9DVFJMKTsKLQkJaWYgKGlkY19jdHJsICYgR1JBQ0VGVUxfUkVTRVRfQklUMSkgewotCQkJcWxhNF84M3h4X3dyX3JlZyhoYSwgUUxBODNYWF9JRENfRFJWX0NUUkwsCi0JCQkJCSAoaWRjX2N0cmwgJiB+R1JBQ0VGVUxfUkVTRVRfQklUMSkpOwotCQkJc2V0X2JpdChBRl84M1hYX05PX0ZXX0RVTVAsICZoYS0+ZmxhZ3MpOwotCQl9Ci0JfQotCiAJaGEtPmlzcF9vcHMtPmlkY191bmxvY2soaGEpOwogCiAJaWYgKGlzX3FsYTgwMjIoaGEpKQpAQCAtMzIwOSw2ICszMTg3LDEwIEBACiAKIAlyZXR2YWwgPSBxbGE0Xzh4eHhfZGV2aWNlX3N0YXRlX2hhbmRsZXIoaGEpOwogCisJLyogSW5pdGlhbGl6ZSByZXF1ZXN0IGFuZCByZXNwb25zZSBxdWV1ZXMuICovCisJaWYgKHJldHZhbCA9PSBRTEFfU1VDQ0VTUykKKwkJcWxhNHh4eF9pbml0X3JpbmdzKGhhKTsKKwogCWlmIChyZXR2YWwgPT0gUUxBX1NVQ0NFU1MgJiYgIXRlc3RfYml0KEFGX0lSUV9BVFRBQ0hFRCwgJmhhLT5mbGFncykpCiAJCXJldHZhbCA9IHFsYTR4eHhfcmVxdWVzdF9pcnFzKGhhKTsKIApAQCAtMzgzNiwzICszODE4LDI0IEBACiBtc2l4X291dDoKIAlyZXR1cm4gcmV0OwogfQorCitpbnQgcWxhNF84eHh4X2NoZWNrX2luaXRfYWRhcHRlcl9yZXRyeShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJaW50IHN0YXR1cyA9IFFMQV9TVUNDRVNTOworCisJLyogRG9udCByZXRyeSBhZGFwdGVyIGluaXRpYWxpemF0aW9uIGlmIElSUSBhbGxvY2F0aW9uIGZhaWxlZCAqLworCWlmICghdGVzdF9iaXQoQUZfSVJRX0FUVEFDSEVELCAmaGEtPmZsYWdzKSkgeworCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICIlczogU2tpcHBpbmcgcmV0cnkgb2YgYWRhcHRlciBpbml0aWFsaXphdGlvbiBhcyBJUlFzIGFyZSBub3QgYXR0YWNoZWRcbiIsCisJCQkgICBfX2Z1bmNfXyk7CisJCXN0YXR1cyA9IFFMQV9FUlJPUjsKKwkJZ290byBleGl0X2luaXRfYWRhcHRlcl9mYWlsdXJlOworCX0KKworCS8qIFNpbmNlIGludGVycnVwdHMgYXJlIHJlZ2lzdGVyZWQgaW4gc3RhcnRfZmlybXdhcmUgZm9yCisJICogOHh4eCwgcmVsZWFzZSB0aGVtIGhlcmUgaWYgaW5pdGlhbGl6ZV9hZGFwdGVyIGZhaWxzCisJICogYW5kIHJldHJ5IGFkYXB0ZXIgaW5pdGlhbGl6YXRpb24gKi8KKwlxbGE0eHh4X2ZyZWVfaXJxcyhoYSk7CisKK2V4aXRfaW5pdF9hZGFwdGVyX2ZhaWx1cmU6CisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9vcy5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X29zLmMKaW5kZXggYzIxYWRjMy4uNDU5YjlmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X29zLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X29zLmMKQEAgLTE2NzAsMTYgKzE2NzAsMTMgQEAKIAlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHI7CiAJc3RydWN0IHNvY2thZGRyX2luNiAqYWRkcjY7CiAKLQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAiRnVuYzogJXNcbiIsIF9fZnVuY19fKSk7CiAJaWYgKCFzaG9zdCkgewogCQlyZXQgPSAtRU5YSU87Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHNob3N0IGlzIE5VTExcbiIsCi0JCSAgICAgICBfX2Z1bmNfXyk7CisJCXByX2VycigiJXM6IHNob3N0IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAl9CiAKIAloYSA9IGlzY3NpX2hvc3RfcHJpdihzaG9zdCk7Ci0KIAllcCA9IGlzY3NpX2NyZWF0ZV9lbmRwb2ludChzaXplb2Yoc3RydWN0IHFsYV9lbmRwb2ludCkpOwogCWlmICghZXApIHsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTE2OTksNiArMTY5Niw5IEBACiAJCWFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmcWxhX2VwLT5kc3RfYWRkcjsKIAkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiAlcEk2XG4iLCBfX2Z1bmNfXywKIAkJCQkgIChjaGFyICopJmFkZHI2LT5zaW42X2FkZHIpKTsKKwl9IGVsc2UgeworCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICIlczogSW52YWxpZCBlbmRwb2ludFxuIiwKKwkJCSAgIF9fZnVuY19fKTsKIAl9CiAKIAlxbGFfZXAtPmhvc3QgPSBzaG9zdDsKQEAgLTE3MTIsOSArMTcxMiw5IEBACiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOwogCWludCByZXQgPSAwOwogCi0JREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOwogCXFsYV9lcCA9IGVwLT5kZF9kYXRhOwogCWhhID0gdG9fcWxhX2hvc3QocWxhX2VwLT5ob3N0KTsKKwlERUJVRzIocHJfaW5mb19yYXRlbGltaXRlZCgiJXM6IGhvc3Q6ICVsZFxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CiAKIAlpZiAoYWRhcHRlcl91cChoYSkgJiYgIXRlc3RfYml0KEFGX0JVSUxEX0REQl9MSVNULCAmaGEtPmZsYWdzKSkKIAkJcmV0ID0gMTsKQEAgLTE3MjQsNyArMTcyNCwxMyBAQAogCiBzdGF0aWMgdm9pZCBxbGE0eHh4X2VwX2Rpc2Nvbm5lY3Qoc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcCkKIHsKLQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAiRnVuYzogJXNcbiIsIF9fZnVuY19fKSk7CisJc3RydWN0IHFsYV9lbmRwb2ludCAqcWxhX2VwOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKKworCXFsYV9lcCA9IGVwLT5kZF9kYXRhOworCWhhID0gdG9fcWxhX2hvc3QocWxhX2VwLT5ob3N0KTsKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IGhvc3Q6ICVsZFxuIiwgX19mdW5jX18sCisJCQkgIGhhLT5ob3N0X25vKSk7CiAJaXNjc2lfZGVzdHJveV9lbmRwb2ludChlcCk7CiB9CiAKQEAgLTE3MzQsOCArMTc0MCwxMSBAQAogewogCXN0cnVjdCBxbGFfZW5kcG9pbnQgKnFsYV9lcCA9IGVwLT5kZF9kYXRhOwogCXN0cnVjdCBzb2NrYWRkciAqZHN0X2FkZHI7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOwogCi0JREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOworCWhhID0gdG9fcWxhX2hvc3QocWxhX2VwLT5ob3N0KTsKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IGhvc3Q6ICVsZFxuIiwgX19mdW5jX18sCisJCQkgIGhhLT5ob3N0X25vKSk7CiAKIAlzd2l0Y2ggKHBhcmFtKSB7CiAJY2FzZSBJU0NTSV9QQVJBTV9DT05OX1BPUlQ6CkBAIC0xNzY2LDEzICsxNzc1LDEzIEBACiAJaW50IHJldDsKIAlkbWFfYWRkcl90IGlzY3NpX3N0YXRzX2RtYTsKIAotCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKLQogCWNsc19zZXNzID0gaXNjc2lfY29ubl90b19zZXNzaW9uKGNsc19jb25uKTsKIAlzZXNzID0gY2xzX3Nlc3MtPmRkX2RhdGE7CiAJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKIAloYSA9IGRkYl9lbnRyeS0+aGE7CiAKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IGhvc3Q6ICVsZFxuIiwgX19mdW5jX18sCisJCQkgIGhhLT5ob3N0X25vKSk7CiAJc3RhdHNfc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZW9mKHN0cnVjdCBxbF9pc2NzaV9zdGF0cykpOwogCS8qIEFsbG9jYXRlIG1lbW9yeSAqLwogCXFsX2lzY3NpX3N0YXRzID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzdGF0c19zaXplLApAQCAtMjEwMCw3ICsyMTA5LDggQEAKIAkJCQljcHVfdG9fbGUxNihJUFY2X1RDUE9QVF9ERUxBWUVEX0FDS19ESVNBQkxFKTsKIAkJZWxzZQogCQkJaW5pdF9md19jYi0+aXB2Nl90Y3Bfb3B0cyAmPQotCQkJCWNwdV90b19sZTE2KH5JUFY2X1RDUE9QVF9ERUxBWUVEX0FDS19ESVNBQkxFKTsKKwkJCQljcHVfdG9fbGUxNih+SVBWNl9UQ1BPUFRfREVMQVlFRF9BQ0tfRElTQUJMRSAmCisJCQkJCSAgICAweEZGRkYpOwogCQlicmVhazsKIAljYXNlIElTQ1NJX05FVF9QQVJBTV9UQ1BfTkFHTEVfRElTQUJMRToKIAkJaWYgKGlmYWNlX3BhcmFtLT5pZmFjZV9udW0gJiAweDEpCkBAIC0yMjk3LDcgKzIzMDcsOCBAQAogCQkJCWNwdV90b19sZTE2KFRDUE9QVF9ERUxBWUVEX0FDS19ESVNBQkxFKTsKIAkJZWxzZQogCQkJaW5pdF9md19jYi0+aXB2NF90Y3Bfb3B0cyAmPQotCQkJCWNwdV90b19sZTE2KH5UQ1BPUFRfREVMQVlFRF9BQ0tfRElTQUJMRSk7CisJCQkJY3B1X3RvX2xlMTYoflRDUE9QVF9ERUxBWUVEX0FDS19ESVNBQkxFICYKKwkJCQkJICAgIDB4RkZGRik7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfTkVUX1BBUkFNX1RDUF9OQUdMRV9ESVNBQkxFOgogCQlpZiAoaWZhY2VfcGFyYW0tPmlmYWNlX251bSAmIDB4MSkKQEAgLTMwNDUsNyArMzA1Niw2IEBACiAJc3RydWN0IHNvY2thZGRyICpkc3RfYWRkcjsKIAlpbnQgcmV0OwogCi0JREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOwogCWlmICghZXApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJxbGE0eHh4OiBtaXNzaW5nIGVwLlxuIik7CiAJCXJldHVybiBOVUxMOwpAQCAtMzA1NCw2ICszMDY0LDggQEAKIAlxbGFfZXAgPSBlcC0+ZGRfZGF0YTsKIAlkc3RfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmcWxhX2VwLT5kc3RfYWRkcjsKIAloYSA9IHRvX3FsYV9ob3N0KHFsYV9lcC0+aG9zdCk7CisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBob3N0OiAlbGRcbiIsIF9fZnVuY19fLAorCQkJICBoYS0+aG9zdF9ubykpOwogCiAJcmV0ID0gcWxhNHh4eF9nZXRfZGRiX2luZGV4KGhhLCAmZGRiX2luZGV4KTsKIAlpZiAocmV0ID09IFFMQV9FUlJPUikKQEAgLTMwNzQsNiArMzA4Niw3IEBACiAJZGRiX2VudHJ5LT5zZXNzID0gY2xzX3Nlc3M7CiAJZGRiX2VudHJ5LT51bmJsb2NrX3Nlc3MgPSBxbGE0eHh4X3VuYmxvY2tfZGRiOwogCWRkYl9lbnRyeS0+ZGRiX2NoYW5nZSA9IHFsYTR4eHhfZGRiX2NoYW5nZTsKKwljbGVhcl9iaXQoRERCX0NPTk5fQ0xPU0VfRkFJTFVSRSwgJmRkYl9lbnRyeS0+ZmxhZ3MpOwogCWNsc19zZXNzLT5yZWNvdmVyeV90bW8gPSBxbDR4c2Vzc19yZWNvdmVyeV90bW87CiAJaGEtPmZ3X2RkYl9pbmRleF9tYXBbZGRiX2VudHJ5LT5md19kZGJfaW5kZXhdID0gZGRiX2VudHJ5OwogCWhhLT50b3RfZGRicysrOwpAQCAtMzA5MiwxMCArMzEwNSwxMSBAQAogCXVpbnQzMl90IGRkYl9zdGF0ZTsKIAlpbnQgcmV0OwogCi0JREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOwogCXNlc3MgPSBjbHNfc2Vzcy0+ZGRfZGF0YTsKIAlkZGJfZW50cnkgPSBzZXNzLT5kZF9kYXRhOwogCWhhID0gZGRiX2VudHJ5LT5oYTsKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IGhvc3Q6ICVsZFxuIiwgX19mdW5jX18sCisJCQkgIGhhLT5ob3N0X25vKSk7CiAKIAlmd19kZGJfZW50cnkgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZigqZndfZGRiX2VudHJ5KSwKIAkJCQkJICAmZndfZGRiX2VudHJ5X2RtYSwgR0ZQX0tFUk5FTCk7CkBAIC0zMTIzLDcgKzMxMzcsOCBAQAogCiBkZXN0cm95X3Nlc3Npb246CiAJcWxhNHh4eF9jbGVhcl9kZGJfZW50cnkoaGEsIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KTsKLQorCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRERCX0NPTk5fQ0xPU0VfRkFJTFVSRSwgJmRkYl9lbnRyeS0+ZmxhZ3MpKQorCQljbGVhcl9iaXQoZGRiX2VudHJ5LT5md19kZGJfaW5kZXgsIGhhLT5kZGJfaWR4X21hcCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJcWxhNHh4eF9mcmVlX2RkYihoYSwgZGRiX2VudHJ5KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwpAQCAtMzE0MSwxNyArMzE1NiwyMyBAQAogCXN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm47CiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CiAJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKIAotCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKIAljbHNfY29ubiA9IGlzY3NpX2Nvbm5fc2V0dXAoY2xzX3Nlc3MsIHNpemVvZihzdHJ1Y3QgcWxhX2Nvbm4pLAogCQkJCSAgICBjb25uX2lkeCk7Ci0JaWYgKCFjbHNfY29ubikKKwlpZiAoIWNsc19jb25uKSB7CisJCXByX2luZm8oIiVzOiBDYW4gbm90IGNyZWF0ZSBjb25uZWN0aW9uIGZvciBjb25uX2lkeCA9ICV1XG4iLAorCQkJX19mdW5jX18sIGNvbm5faWR4KTsKIAkJcmV0dXJuIE5VTEw7CisJfQogCiAJc2VzcyA9IGNsc19zZXNzLT5kZF9kYXRhOwogCWRkYl9lbnRyeSA9IHNlc3MtPmRkX2RhdGE7CiAJZGRiX2VudHJ5LT5jb25uID0gY2xzX2Nvbm47CiAKKwloYSA9IGRkYl9lbnRyeS0+aGE7CisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBjb25uX2lkeCA9ICV1XG4iLCBfX2Z1bmNfXywKKwkJCSAgY29ubl9pZHgpKTsKIAlyZXR1cm4gY2xzX2Nvbm47CiB9CiAKQEAgLTMxNjIsOCArMzE4MywxNiBAQAogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uOwogCXN0cnVjdCBxbGFfY29ubiAqcWxhX2Nvbm47CiAJc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcDsKKwlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzOwogCi0JREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOworCXNlc3MgPSBjbHNfc2Vzc2lvbi0+ZGRfZGF0YTsKKwlkZGJfZW50cnkgPSBzZXNzLT5kZF9kYXRhOworCWhhID0gZGRiX2VudHJ5LT5oYTsKKworCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogc2lkID0gJWQsIGNpZCA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCSAgY2xzX3Nlc3Npb24tPnNpZCwgY2xzX2Nvbm4tPmNpZCkpOwogCiAJaWYgKGlzY3NpX2Nvbm5fYmluZChjbHNfc2Vzc2lvbiwgY2xzX2Nvbm4sIGlzX2xlYWRpbmcpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMxODYsMTAgKzMyMTUsMTEgQEAKIAlpbnQgcmV0ID0gMDsKIAlpbnQgc3RhdHVzID0gUUxBX1NVQ0NFU1M7CiAKLQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAiRnVuYzogJXNcbiIsIF9fZnVuY19fKSk7CiAJc2VzcyA9IGNsc19zZXNzLT5kZF9kYXRhOwogCWRkYl9lbnRyeSA9IHNlc3MtPmRkX2RhdGE7CiAJaGEgPSBkZGJfZW50cnktPmhhOworCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogc2lkID0gJWQsIGNpZCA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCSAgY2xzX3Nlc3MtPnNpZCwgY2xzX2Nvbm4tPmNpZCkpOwogCiAJLyogQ2hlY2sgaWYgd2UgaGF2ZSAgbWF0Y2hpbmcgRlcgRERCLCBpZiB5ZXMgdGhlbiBkbyBub3QKIAkgKiBsb2dpbiB0byB0aGlzIHRhcmdldC4gVGhpcyBjb3VsZCBjYXVzZSB0YXJnZXQgdG8gbG9nb3V0IHByZXZpb3VzCkBAIC0zMjYzLDEwICszMjkzLDExIEBACiAJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OwogCWludCBvcHRpb25zOwogCi0JREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOwogCXNlc3MgPSBjbHNfc2Vzcy0+ZGRfZGF0YTsKIAlkZGJfZW50cnkgPSBzZXNzLT5kZF9kYXRhOwogCWhhID0gZGRiX2VudHJ5LT5oYTsKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IGNpZCA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCSAgY2xzX2Nvbm4tPmNpZCkpOwogCiAJb3B0aW9ucyA9IExPR09VVF9PUFRJT05fQ0xPU0VfU0VTU0lPTjsKIAlpZiAocWxhNHh4eF9zZXNzaW9uX2xvZ291dF9kZGIoaGEsIGRkYl9lbnRyeSwgb3B0aW9ucykgPT0gUUxBX0VSUk9SKQpAQCAtNDM3Miw2ICs0NDAzLDExIEBACiAJdWludDMyX3QgZGV2X3N0YXRlOwogCXVpbnQzMl90IGlkY19jdHJsOwogCisJaWYgKGlzX3FsYTgwMzIoaGEpICYmCisJICAgIChxbGE0XzgzeHhfaXNfZGV0YWNoZWQoaGEpID09IFFMQV9TVUNDRVNTKSkKKwkJV0FSTl9PTkNFKDEsICIlczogaVNDU0kgZnVuY3Rpb24gJWQgbWFya2VkIGludmlzaWJsZVxuIiwKKwkJCSAgX19mdW5jX18sIGhhLT5mdW5jX251bSk7CisKIAkvKiBkb24ndCBwb2xsIGlmIHJlc2V0IGlzIGdvaW5nIG9uICovCiAJaWYgKCEodGVzdF9iaXQoRFBDX1JFU0VUX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpIHx8CiAJICAgIHRlc3RfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpIHx8CkBAIC00NTU0LDExICs0NTkwLDE5IEBACiAJdWludDMyX3QgaW5kZXggPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHNjc2lfY21uZCAqY21kOworCXVuc2lnbmVkIGxvbmcgd3RpbWU7CisJdWludDMyX3Qgd3RtbzsKIAotCXVuc2lnbmVkIGxvbmcgd3RpbWUgPSBqaWZmaWVzICsgKFdBSVRfQ01EX1RPViAqIEhaKTsKKwlpZiAoaXNfcWxhNDBYWChoYSkpCisJCXd0bW8gPSBXQUlUX0NNRF9UT1Y7CisJZWxzZQorCQl3dG1vID0gaGEtPm54X3Jlc2V0X3RpbWVvdXQgLyAyOwogCi0JREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIldhaXQgdXAgdG8gJWQgc2Vjb25kcyBmb3IgY21kcyB0byAiCi0JICAgICJjb21wbGV0ZVxuIiwgV0FJVF9DTURfVE9WKSk7CisJd3RpbWUgPSBqaWZmaWVzICsgKHd0bW8gKiBIWik7CisKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJICAiV2FpdCB1cCB0byAldSBzZWNvbmRzIGZvciBjbWRzIHRvIGNvbXBsZXRlXG4iLAorCQkJICB3dG1vKSk7CiAKIAl3aGlsZSAoIXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgd3RpbWUpKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwpAQCAtNDg2MSwxMSArNDkwNSwxMSBAQAogCQkJcWxhNHh4eF9jbWRfd2FpdChoYSk7CiAKIAkJcWxhNHh4eF9wcm9jZXNzX2FlbihoYSwgRkxVU0hfRERCX0NIQU5HRURfQUVOUyk7Ci0JCXFsYTR4eHhfYWJvcnRfYWN0aXZlX2NtZHMoaGEsIERJRF9SRVNFVCA8PCAxNik7CiAJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJCSAgICAic2NzaSVsZDogJXMgLSBQZXJmb3JtaW5nIGNoaXAgcmVzZXQuLlxuIiwKIAkJICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwogCQlzdGF0dXMgPSBoYS0+aXNwX29wcy0+cmVzZXRfY2hpcChoYSk7CisJCXFsYTR4eHhfYWJvcnRfYWN0aXZlX2NtZHMoaGEsIERJRF9SRVNFVCA8PCAxNik7CiAJfQogCiAJLyogRmx1c2ggYW55IHBlbmRpbmcgZGRiIGNoYW5nZWQgQUVOcyAqLwpAQCAtNDg4MSw4ICs0OTI1LDIxIEBACiAJCQlzc2xlZXAoNik7CiAKIAkJLyogTk9URTogQUZfT05MSU5FIGZsYWcgc2V0IHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mCi0JCSAqICAgICAgIHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyICovCisJCSAqIHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyICovCiAJCXN0YXR1cyA9IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKGhhLCBSRVNFVF9BREFQVEVSKTsKKwkJaWYgKGlzX3FsYTgwWFgoaGEpICYmIChzdGF0dXMgPT0gUUxBX0VSUk9SKSkgeworCQkJc3RhdHVzID0gcWxhNF84eHh4X2NoZWNrX2luaXRfYWRhcHRlcl9yZXRyeShoYSk7CisJCQlpZiAoc3RhdHVzID09IFFMQV9FUlJPUikgeworCQkJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgInNjc2klbGQ6ICVzOiBEb24ndCByZXRyeSByZWNvdmVyIGFkYXB0ZXJcbiIsCisJCQkJCSAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXyk7CisJCQkJcWxhNHh4eF9kZWFkX2FkYXB0ZXJfY2xlYW51cChoYSk7CisJCQkJY2xlYXJfYml0KERQQ19SRVRSWV9SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpOworCQkJCWNsZWFyX2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQljbGVhcl9iaXQoRFBDX1JFU0VUX0hBX0ZXX0NPTlRFWFQsCisJCQkJCSAgJmhhLT5kcGNfZmxhZ3MpOworCQkJCWdvdG8gZXhpdF9yZWNvdmVyOworCQkJfQorCQl9CiAJfQogCiAJLyogUmV0cnkgZmFpbGVkIGFkYXB0ZXIgaW5pdGlhbGl6YXRpb24sIGlmIG5lY2Vzc2FyeQpAQCAtNTIyOCw5ICs1Mjg1LDkgQEAKIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzY3NpX3FsYV9ob3N0LCBkcGNfd29yayk7CiAJaW50IHN0YXR1cyA9IFFMQV9FUlJPUjsKIAotCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBEUEMgaGFuZGxlciB3YWtpbmcgdXAuIgotCSAgICAiZmxhZ3MgPSAweCUwOGx4LCBkcGNfZmxhZ3MgPSAweCUwOGx4XG4iLAotCSAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIGhhLT5mbGFncywgaGEtPmRwY19mbGFncykpCisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCSAgInNjc2klbGQ6ICVzOiBEUEMgaGFuZGxlciB3YWtpbmcgdXAuIGZsYWdzID0gMHglMDhseCwgZHBjX2ZsYWdzID0gMHglMDhseFxuIiwKKwkJCSAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBoYS0+ZmxhZ3MsIGhhLT5kcGNfZmxhZ3MpKTsKIAogCS8qIEluaXRpYWxpemF0aW9uIG5vdCB5ZXQgZmluaXNoZWQuIERvbid0IGRvIGFueXRoaW5nIHlldC4gKi8KIAlpZiAoIXRlc3RfYml0KEFGX0lOSVRfRE9ORSwgJmhhLT5mbGFncykpCkBAIC04NjgxLDExICs4NzM4LDggQEAKIAlzdGF0dXMgPSBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlcihoYSwgSU5JVF9BREFQVEVSKTsKIAogCS8qIERvbnQgcmV0cnkgYWRhcHRlciBpbml0aWFsaXphdGlvbiBpZiBJUlEgYWxsb2NhdGlvbiBmYWlsZWQgKi8KLQlpZiAoaXNfcWxhODBYWChoYSkgJiYgIXRlc3RfYml0KEFGX0lSUV9BVFRBQ0hFRCwgJmhhLT5mbGFncykpIHsKLQkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiJXM6IFNraXBwaW5nIHJldHJ5IG9mIGFkYXB0ZXIgaW5pdGlhbGl6YXRpb25cbiIsCi0JCQkgICBfX2Z1bmNfXyk7CisJaWYgKGlzX3FsYTgwWFgoaGEpICYmIChzdGF0dXMgPT0gUUxBX0VSUk9SKSkKIAkJZ290byBza2lwX3JldHJ5X2luaXQ7Ci0JfQogCiAJd2hpbGUgKCghdGVzdF9iaXQoQUZfT05MSU5FLCAmaGEtPmZsYWdzKSkgJiYKIAkgICAgaW5pdF9yZXRyeV9jb3VudCsrIDwgTUFYX0lOSVRfUkVUUklFUykgewpAQCAtODcwOSw2ICs4NzYzLDEwIEBACiAJCQljb250aW51ZTsKIAogCQlzdGF0dXMgPSBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlcihoYSwgSU5JVF9BREFQVEVSKTsKKwkJaWYgKGlzX3FsYTgwWFgoaGEpICYmIChzdGF0dXMgPT0gUUxBX0VSUk9SKSkgeworCQkJaWYgKHFsYTRfOHh4eF9jaGVja19pbml0X2FkYXB0ZXJfcmV0cnkoaGEpID09IFFMQV9FUlJPUikKKwkJCQlnb3RvIHNraXBfcmV0cnlfaW5pdDsKKwkJfQogCX0KIAogc2tpcF9yZXRyeV9pbml0OgpAQCAtODg1NywxMCArODkxNSw1NiBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgcWxhNHh4eF9kZXN0cm95X2RkYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSkKK3sKKwlzdHJ1Y3QgZGV2X2RiX2VudHJ5ICpmd19kZGJfZW50cnkgPSBOVUxMOworCWRtYV9hZGRyX3QgZndfZGRiX2VudHJ5X2RtYTsKKwl1bnNpZ25lZCBsb25nIHd0aW1lOworCXVpbnQzMl90IGRkYl9zdGF0ZTsKKwlpbnQgb3B0aW9uczsKKwlpbnQgc3RhdHVzOworCisJb3B0aW9ucyA9IExPR09VVF9PUFRJT05fQ0xPU0VfU0VTU0lPTjsKKwlpZiAocWxhNHh4eF9zZXNzaW9uX2xvZ291dF9kZGIoaGEsIGRkYl9lbnRyeSwgb3B0aW9ucykgPT0gUUxBX0VSUk9SKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IExvZ291dCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBjbGVhcl9kZGI7CisJfQorCisJZndfZGRiX2VudHJ5ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2YoKmZ3X2RkYl9lbnRyeSksCisJCQkJCSAgJmZ3X2RkYl9lbnRyeV9kbWEsIEdGUF9LRVJORUwpOworCWlmICghZndfZGRiX2VudHJ5KSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLAorCQkJICAgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgZG1hIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQlnb3RvIGNsZWFyX2RkYjsKKwl9CisKKwl3dGltZSA9IGppZmZpZXMgKyAoSFogKiBMT0dPVVRfVE9WKTsKKwlkbyB7CisJCXN0YXR1cyA9IHFsYTR4eHhfZ2V0X2Z3ZGRiX2VudHJ5KGhhLCBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCwKKwkJCQkJCSBmd19kZGJfZW50cnksIGZ3X2RkYl9lbnRyeV9kbWEsCisJCQkJCQkgTlVMTCwgTlVMTCwgJmRkYl9zdGF0ZSwgTlVMTCwKKwkJCQkJCSBOVUxMLCBOVUxMKTsKKwkJaWYgKHN0YXR1cyA9PSBRTEFfRVJST1IpCisJCQlnb3RvIGZyZWVfZGRiOworCisJCWlmICgoZGRiX3N0YXRlID09IEREQl9EU19OT19DT05ORUNUSU9OX0FDVElWRSkgfHwKKwkJICAgIChkZGJfc3RhdGUgPT0gRERCX0RTX1NFU1NJT05fRkFJTEVEKSkKKwkJCWdvdG8gZnJlZV9kZGI7CisKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoSFopOworCX0gd2hpbGUgKCh0aW1lX2FmdGVyKHd0aW1lLCBqaWZmaWVzKSkpOworCitmcmVlX2RkYjoKKwlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc2l6ZW9mKCpmd19kZGJfZW50cnkpLAorCQkJICBmd19kZGJfZW50cnksIGZ3X2RkYl9lbnRyeV9kbWEpOworY2xlYXJfZGRiOgorCXFsYTR4eHhfY2xlYXJfZGRiX2VudHJ5KGhhLCBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCk7Cit9CisKIHN0YXRpYyB2b2lkIHFsYTR4eHhfZGVzdHJveV9md19kZGJfc2Vzc2lvbihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7CiAJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OwotCWludCBvcHRpb25zOwogCWludCBpZHg7CiAKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IE1BWF9EREJfRU5UUklFUzsgaWR4KyspIHsKQEAgLTg4NjksMTMgKzg5NzMsNyBAQAogCQlpZiAoKGRkYl9lbnRyeSAhPSBOVUxMKSAmJgogCQkgICAgKGRkYl9lbnRyeS0+ZGRiX3R5cGUgPT0gRkxBU0hfRERCKSkgewogCi0JCQlvcHRpb25zID0gTE9HT1VUX09QVElPTl9DTE9TRV9TRVNTSU9OOwotCQkJaWYgKHFsYTR4eHhfc2Vzc2lvbl9sb2dvdXRfZGRiKGhhLCBkZGJfZW50cnksIG9wdGlvbnMpCi0JCQkgICAgPT0gUUxBX0VSUk9SKQotCQkJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IExvZ291dCBmYWlsZWRcbiIsCi0JCQkJCSAgIF9fZnVuY19fKTsKLQotCQkJcWxhNHh4eF9jbGVhcl9kZGJfZW50cnkoaGEsIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KTsKKwkJCXFsYTR4eHhfZGVzdHJveV9kZGIoaGEsIGRkYl9lbnRyeSk7CiAJCQkvKgogCQkJICogd2UgaGF2ZSBkZWNyZW1lbnRlZCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBkcml2ZXIKIAkJCSAqIHdoZW4gd2Ugc2V0dXAgdGhlIHNlc3Npb24gdG8gaGF2ZSB0aGUgZHJpdmVyIHVubG9hZApAQCAtOTEzNiwxNCArOTIzNCwxNSBAQAogCWludCByZXQgPSBTVUNDRVNTOwogCWludCB3YWl0ID0gMDsKIAotCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkgICAgInNjc2klbGQ6JWQ6JWQ6IEFib3J0IGNvbW1hbmQgaXNzdWVkIGNtZD0lcFxuIiwKLQkgICAgaGEtPmhvc3Rfbm8sIGlkLCBsdW4sIGNtZCk7CisJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAic2NzaSVsZDolZDolZDogQWJvcnQgY29tbWFuZCBpc3N1ZWQgY21kPSVwLCBjZGI9MHgleFxuIiwKKwkJICAgaGEtPmhvc3Rfbm8sIGlkLCBsdW4sIGNtZCwgY21kLT5jbW5kWzBdKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCXNyYiA9IChzdHJ1Y3Qgc3JiICopIENNRF9TUChjbWQpOwogCWlmICghc3JiKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgInNjc2klbGQ6JWQ6JWQ6IFNwZWNpZmllZCBjb21tYW5kIGhhcyBhbHJlYWR5IGNvbXBsZXRlZC5cbiIsCisJCQkgICBoYS0+aG9zdF9ubywgaWQsIGx1bik7CiAJCXJldHVybiBTVUNDRVNTOwogCX0KIAlrcmVmX2dldCgmc3JiLT5zcmJfcmVmKTsKQEAgLTk1NjAsMjggKzk2NTksMzYgQEAKIAl9CiAKIAlmbiA9IFBDSV9GVU5DKGhhLT5wZGV2LT5kZXZmbik7Ci0Jd2hpbGUgKGZuID4gMCkgewotCQlmbi0tOwotCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJzY3NpJWxkOiAlczogRmluZGluZyBQQ0kgZGV2aWNlIGF0ICIKLQkJICAgICJmdW5jICV4XG4iLCBoYS0+aG9zdF9ubywgX19mdW5jX18sIGZuKTsKLQkJLyogR2V0IHRoZSBwY2kgZGV2aWNlIGdpdmVuIHRoZSBkb21haW4sIGJ1cywKLQkJICogc2xvdC9mdW5jdGlvbiBudW1iZXIgKi8KLQkJb3RoZXJfcGRldiA9Ci0JCSAgICBwY2lfZ2V0X2RvbWFpbl9idXNfYW5kX3Nsb3QocGNpX2RvbWFpbl9ucihoYS0+cGRldi0+YnVzKSwKLQkJICAgIGhhLT5wZGV2LT5idXMtPm51bWJlciwgUENJX0RFVkZOKFBDSV9TTE9UKGhhLT5wZGV2LT5kZXZmbiksCi0JCSAgICBmbikpOworCWlmIChpc19xbGE4MDIyKGhhKSkgeworCQl3aGlsZSAoZm4gPiAwKSB7CisJCQlmbi0tOworCQkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAic2NzaSVsZDogJXM6IEZpbmRpbmcgUENJIGRldmljZSBhdCBmdW5jICV4XG4iLAorCQkJCSAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgZm4pOworCQkJLyogR2V0IHRoZSBwY2kgZGV2aWNlIGdpdmVuIHRoZSBkb21haW4sIGJ1cywKKwkJCSAqIHNsb3QvZnVuY3Rpb24gbnVtYmVyICovCisJCQlvdGhlcl9wZGV2ID0gcGNpX2dldF9kb21haW5fYnVzX2FuZF9zbG90KAorCQkJCQkgICBwY2lfZG9tYWluX25yKGhhLT5wZGV2LT5idXMpLAorCQkJCQkgICBoYS0+cGRldi0+YnVzLT5udW1iZXIsCisJCQkJCSAgIFBDSV9ERVZGTihQQ0lfU0xPVChoYS0+cGRldi0+ZGV2Zm4pLAorCQkJCQkgICBmbikpOwogCi0JCWlmICghb3RoZXJfcGRldikKLQkJCWNvbnRpbnVlOworCQkJaWYgKCFvdGhlcl9wZGV2KQorCQkJCWNvbnRpbnVlOwogCi0JCWlmIChhdG9taWNfcmVhZCgmb3RoZXJfcGRldi0+ZW5hYmxlX2NudCkpIHsKLQkJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgInNjc2klbGQ6ICVzOiBGb3VuZCBQQ0kgIgotCQkJICAgICJmdW5jIGluIGVuYWJsZWQgc3RhdGUleFxuIiwgaGEtPmhvc3Rfbm8sCi0JCQkgICAgX19mdW5jX18sIGZuKTsKKwkJCWlmIChhdG9taWNfcmVhZCgmb3RoZXJfcGRldi0+ZW5hYmxlX2NudCkpIHsKKwkJCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJzY3NpJWxkOiAlczogRm91bmQgUENJIGZ1bmMgaW4gZW5hYmxlZCBzdGF0ZSV4XG4iLAorCQkJCQkgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIGZuKTsKKwkJCQlwY2lfZGV2X3B1dChvdGhlcl9wZGV2KTsKKwkJCQlicmVhazsKKwkJCX0KIAkJCXBjaV9kZXZfcHV0KG90aGVyX3BkZXYpOwotCQkJYnJlYWs7CiAJCX0KLQkJcGNpX2Rldl9wdXQob3RoZXJfcGRldik7CisJfSBlbHNlIHsKKwkJLyogdGhpcyBjYXNlIGlzIG1lYW50IGZvciBJU1A4M3h4L0lTUDg0eHggb25seSAqLworCQlpZiAocWxhNF84M3h4X2Nhbl9wZXJmb3JtX3Jlc2V0KGhhKSkgeworCQkJLyogcmVzZXQgZm4gYXMgaVNDU0kgaXMgZ29pbmcgdG8gcGVyZm9ybSB0aGUgcmVzZXQgKi8KKwkJCWZuID0gMDsKKwkJfQogCX0KIAogCS8qIFRoZSBmaXJzdCBmdW5jdGlvbiBvbiB0aGUgY2FyZCwgdGhlIHJlc2V0IG93bmVyIHdpbGwKQEAgLTk2MTUsNiArOTcyMiw3IEBACiAJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJzY3NpJWxkOiAlczogSFcgU3RhdGU6ICIKIAkJCSAgICAiRkFJTEVEXG4iLCBoYS0+aG9zdF9ubywgX19mdW5jX18pOworCQkJcWxhNHh4eF9mcmVlX2lycXMoaGEpOwogCQkJaGEtPmlzcF9vcHMtPmlkY19sb2NrKGhhKTsKIAkJCXFsYTRfOHh4eF9jbGVhcl9kcnZfYWN0aXZlKGhhKTsKIAkJCXFsYTRfOHh4eF93cl9kaXJlY3QoaGEsIFFMQThYWFhfQ1JCX0RFVl9TVEFURSwKQEAgLTk2NDIsNiArOTc1MCw4IEBACiAJCQlydmFsID0gcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoaGEsIFJFU0VUX0FEQVBURVIpOwogCQkJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpCiAJCQkJaGEtPmlzcF9vcHMtPmVuYWJsZV9pbnRycyhoYSk7CisJCQllbHNlCisJCQkJcWxhNHh4eF9mcmVlX2lycXMoaGEpOwogCiAJCQloYS0+aXNwX29wcy0+aWRjX2xvY2soaGEpOwogCQkJcWxhNF84eHh4X3NldF9kcnZfYWN0aXZlKGhhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF92ZXJzaW9uLmggYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfdmVyc2lvbi5oCmluZGV4IDliMjk0NjYuLmM2YmEwYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF92ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X3ZlcnNpb24uaApAQCAtNSw0ICs1LDQgQEAKICAqIFNlZSBMSUNFTlNFLnFsYTR4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCiAgKi8KIAotI2RlZmluZSBRTEE0WFhYX0RSSVZFUl9WRVJTSU9OCSI1LjA0LjAwLWszIgorI2RlZmluZSBRTEE0WFhYX0RSSVZFUl9WRVJTSU9OCSI1LjA0LjAwLWs0IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2kuYyBiL2RyaXZlcnMvc2NzaS9zY3NpLmMKaW5kZXggZDhhZmVjOC4uYzRkNjMyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaS5jCkBAIC0xNjEsNDcgKzE2MSwyMCBAQAogc3RhdGljIERFRklORV9NVVRFWChob3N0X2NtZF9wb29sX211dGV4KTsKIAogLyoqCi0gKiBzY3NpX3Bvb2xfYWxsb2NfY29tbWFuZCAtIGludGVybmFsIGZ1bmN0aW9uIHRvIGdldCBhIGZ1bGx5IGFsbG9jYXRlZCBjb21tYW5kCi0gKiBAcG9vbDoJc2xhYiBwb29sIHRvIGFsbG9jYXRlIHRoZSBjb21tYW5kIGZyb20KLSAqIEBnZnBfbWFzazoJbWFzayBmb3IgdGhlIGFsbG9jYXRpb24KLSAqCi0gKiBSZXR1cm5zIGEgZnVsbHkgYWxsb2NhdGVkIGNvbW1hbmQgKHdpdGggdGhlIGFsbGllZCBzZW5zZSBidWZmZXIpIG9yCi0gKiBOVUxMIG9uIGZhaWx1cmUKLSAqLwotc3RhdGljIHN0cnVjdCBzY3NpX2NtbmQgKgotc2NzaV9wb29sX2FsbG9jX2NvbW1hbmQoc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbCAqcG9vbCwgZ2ZwX3QgZ2ZwX21hc2spCi17Ci0Jc3RydWN0IHNjc2lfY21uZCAqY21kOwotCi0JY21kID0ga21lbV9jYWNoZV96YWxsb2MocG9vbC0+Y21kX3NsYWIsIGdmcF9tYXNrIHwgcG9vbC0+Z2ZwX21hc2spOwotCWlmICghY21kKQotCQlyZXR1cm4gTlVMTDsKLQotCWNtZC0+c2Vuc2VfYnVmZmVyID0ga21lbV9jYWNoZV9hbGxvYyhwb29sLT5zZW5zZV9zbGFiLAotCQkJCQkgICAgIGdmcF9tYXNrIHwgcG9vbC0+Z2ZwX21hc2spOwotCWlmICghY21kLT5zZW5zZV9idWZmZXIpIHsKLQkJa21lbV9jYWNoZV9mcmVlKHBvb2wtPmNtZF9zbGFiLCBjbWQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gY21kOwotfQotCi0vKioKLSAqIHNjc2lfcG9vbF9mcmVlX2NvbW1hbmQgLSBpbnRlcm5hbCBmdW5jdGlvbiB0byByZWxlYXNlIGEgY29tbWFuZAotICogQHBvb2w6CXNsYWIgcG9vbCB0byBhbGxvY2F0ZSB0aGUgY29tbWFuZCBmcm9tCisgKiBzY3NpX2hvc3RfZnJlZV9jb21tYW5kIC0gaW50ZXJuYWwgZnVuY3Rpb24gdG8gcmVsZWFzZSBhIGNvbW1hbmQKKyAqIEBzaG9zdDoJaG9zdCB0byBmcmVlIHRoZSBjb21tYW5kIGZvcgogICogQGNtZDoJY29tbWFuZCB0byByZWxlYXNlCiAgKgogICogdGhlIGNvbW1hbmQgbXVzdCBwcmV2aW91c2x5IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYnkKLSAqIHNjc2lfcG9vbF9hbGxvY19jb21tYW5kLgorICogc2NzaV9ob3N0X2FsbG9jX2NvbW1hbmQuCiAgKi8KIHN0YXRpYyB2b2lkCi1zY3NpX3Bvb2xfZnJlZV9jb21tYW5kKHN0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgKnBvb2wsCi0JCQkgc3RydWN0IHNjc2lfY21uZCAqY21kKQorc2NzaV9ob3N0X2ZyZWVfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IHNjc2lfY21uZCAqY21kKQogeworCXN0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgKnBvb2wgPSBzaG9zdC0+Y21kX3Bvb2w7CisKIAlpZiAoY21kLT5wcm90X3NkYikKIAkJa21lbV9jYWNoZV9mcmVlKHNjc2lfc2RiX2NhY2hlLCBjbWQtPnByb3Rfc2RiKTsKLQogCWttZW1fY2FjaGVfZnJlZShwb29sLT5zZW5zZV9zbGFiLCBjbWQtPnNlbnNlX2J1ZmZlcik7CiAJa21lbV9jYWNoZV9mcmVlKHBvb2wtPmNtZF9zbGFiLCBjbWQpOwogfQpAQCAtMjE3LDIyICsxOTAsMzIgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9jbW5kICoKIHNjc2lfaG9zdF9hbGxvY19jb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBnZnBfdCBnZnBfbWFzaykKIHsKKwlzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sICpwb29sID0gc2hvc3QtPmNtZF9wb29sOwogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKIAotCWNtZCA9IHNjc2lfcG9vbF9hbGxvY19jb21tYW5kKHNob3N0LT5jbWRfcG9vbCwgZ2ZwX21hc2spOworCWNtZCA9IGttZW1fY2FjaGVfemFsbG9jKHBvb2wtPmNtZF9zbGFiLCBnZnBfbWFzayB8IHBvb2wtPmdmcF9tYXNrKTsKIAlpZiAoIWNtZCkKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gZmFpbDsKKworCWNtZC0+c2Vuc2VfYnVmZmVyID0ga21lbV9jYWNoZV9hbGxvYyhwb29sLT5zZW5zZV9zbGFiLAorCQkJCQkgICAgIGdmcF9tYXNrIHwgcG9vbC0+Z2ZwX21hc2spOworCWlmICghY21kLT5zZW5zZV9idWZmZXIpCisJCWdvdG8gZmFpbF9mcmVlX2NtZDsKIAogCWlmIChzY3NpX2hvc3RfZ2V0X3Byb3Qoc2hvc3QpID49IFNIT1NUX0RJWF9UWVBFMF9QUk9URUNUSU9OKSB7CiAJCWNtZC0+cHJvdF9zZGIgPSBrbWVtX2NhY2hlX3phbGxvYyhzY3NpX3NkYl9jYWNoZSwgZ2ZwX21hc2spOwotCi0JCWlmICghY21kLT5wcm90X3NkYikgewotCQkJc2NzaV9wb29sX2ZyZWVfY29tbWFuZChzaG9zdC0+Y21kX3Bvb2wsIGNtZCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorCQlpZiAoIWNtZC0+cHJvdF9zZGIpCisJCQlnb3RvIGZhaWxfZnJlZV9zZW5zZTsKIAl9CiAKIAlyZXR1cm4gY21kOworCitmYWlsX2ZyZWVfc2Vuc2U6CisJa21lbV9jYWNoZV9mcmVlKHBvb2wtPnNlbnNlX3NsYWIsIGNtZC0+c2Vuc2VfYnVmZmVyKTsKK2ZhaWxfZnJlZV9jbWQ6CisJa21lbV9jYWNoZV9mcmVlKHBvb2wtPmNtZF9zbGFiLCBjbWQpOworZmFpbDoKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyoqCkBAIC0yODQsMjcgKzI2NywxOSBAQAogICovCiBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2dldF9jb21tYW5kKHN0cnVjdCBzY3NpX2RldmljZSAqZGV2LCBnZnBfdCBnZnBfbWFzaykKIHsKLQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gX19zY3NpX2dldF9jb21tYW5kKGRldi0+aG9zdCwgZ2ZwX21hc2spOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkvKiBCYWlsIGlmIHdlIGNhbid0IGdldCBhIHJlZmVyZW5jZSB0byB0aGUgZGV2aWNlICovCi0JaWYgKCFnZXRfZGV2aWNlKCZkZXYtPnNkZXZfZ2VuZGV2KSkKKwlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKQogCQlyZXR1cm4gTlVMTDsKIAotCWNtZCA9IF9fc2NzaV9nZXRfY29tbWFuZChkZXYtPmhvc3QsIGdmcF9tYXNrKTsKLQotCWlmIChsaWtlbHkoY21kICE9IE5VTEwpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJY21kLT5kZXZpY2UgPSBkZXY7Ci0JCUlOSVRfTElTVF9IRUFEKCZjbWQtPmxpc3QpOwotCQlJTklUX0RFTEFZRURfV09SSygmY21kLT5hYm9ydF93b3JrLCBzY21kX2VoX2Fib3J0X2hhbmRsZXIpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5saXN0X2xvY2ssIGZsYWdzKTsKLQkJbGlzdF9hZGRfdGFpbCgmY21kLT5saXN0LCAmZGV2LT5jbWRfbGlzdCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bGlzdF9sb2NrLCBmbGFncyk7Ci0JCWNtZC0+amlmZmllc19hdF9hbGxvYyA9IGppZmZpZXM7Ci0JfSBlbHNlCi0JCXB1dF9kZXZpY2UoJmRldi0+c2Rldl9nZW5kZXYpOwotCisJY21kLT5kZXZpY2UgPSBkZXY7CisJSU5JVF9MSVNUX0hFQUQoJmNtZC0+bGlzdCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmNtZC0+YWJvcnRfd29yaywgc2NtZF9laF9hYm9ydF9oYW5kbGVyKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZjbWQtPmxpc3QsICZkZXYtPmNtZF9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxpc3RfbG9jaywgZmxhZ3MpOworCWNtZC0+amlmZmllc19hdF9hbGxvYyA9IGppZmZpZXM7CiAJcmV0dXJuIGNtZDsKIH0KIEVYUE9SVF9TWU1CT0woc2NzaV9nZXRfY29tbWFuZCk7CkBAIC0zMTMsMjUgKzI4OCwyMiBAQAogICogX19zY3NpX3B1dF9jb21tYW5kIC0gRnJlZSBhIHN0cnVjdCBzY3NpX2NtbmQKICAqIEBzaG9zdDogZGV2LT5ob3N0CiAgKiBAY21kOiBDb21tYW5kIHRvIGZyZWUKLSAqIEBkZXY6IHBhcmVudCBzY3NpIGRldmljZQogICovCi12b2lkIF9fc2NzaV9wdXRfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkJc3RydWN0IGRldmljZSAqZGV2KQordm9pZCBfX3Njc2lfcHV0X2NvbW1hbmQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyogY2hhbmdpbmcgbG9ja3MgaGVyZSwgZG9uJ3QgbmVlZCB0byByZXN0b3JlIHRoZSBpcnEgc3RhdGUgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2hvc3QtPmZyZWVfbGlzdF9sb2NrLCBmbGFncyk7CiAJaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJnNob3N0LT5mcmVlX2xpc3QpKSkgewotCQlsaXN0X2FkZCgmY21kLT5saXN0LCAmc2hvc3QtPmZyZWVfbGlzdCk7Ci0JCWNtZCA9IE5VTEw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzaG9zdC0+ZnJlZV9saXN0X2xvY2ssIGZsYWdzKTsKKwkJaWYgKGxpc3RfZW1wdHkoJnNob3N0LT5mcmVlX2xpc3QpKSB7CisJCQlsaXN0X2FkZCgmY21kLT5saXN0LCAmc2hvc3QtPmZyZWVfbGlzdCk7CisJCQljbWQgPSBOVUxMOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNob3N0LT5mcmVlX2xpc3RfbG9jaywgZmxhZ3MpOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaG9zdC0+ZnJlZV9saXN0X2xvY2ssIGZsYWdzKTsKIAogCWlmIChsaWtlbHkoY21kICE9IE5VTEwpKQotCQlzY3NpX3Bvb2xfZnJlZV9jb21tYW5kKHNob3N0LT5jbWRfcG9vbCwgY21kKTsKLQotCXB1dF9kZXZpY2UoZGV2KTsKKwkJc2NzaV9ob3N0X2ZyZWVfY29tbWFuZChzaG9zdCwgY21kKTsKIH0KIEVYUE9SVF9TWU1CT0woX19zY3NpX3B1dF9jb21tYW5kKTsKIApAQCAtMzQ1LDcgKzMxNyw2IEBACiAgKi8KIHZvaWQgc2NzaV9wdXRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7Ci0Jc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gY21kLT5kZXZpY2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIHNlcmlvdXMgZXJyb3IgaWYgdGhlIGNvbW1hbmQgaGFzbid0IGNvbWUgZnJvbSBhIGRldmljZSBsaXN0ICovCkBAIC0zNTYsNTAgKzMyNywxMDcgQEAKIAogCWNhbmNlbF9kZWxheWVkX3dvcmsoJmNtZC0+YWJvcnRfd29yayk7CiAKLQlfX3Njc2lfcHV0X2NvbW1hbmQoY21kLT5kZXZpY2UtPmhvc3QsIGNtZCwgJnNkZXYtPnNkZXZfZ2VuZGV2KTsKKwlfX3Njc2lfcHV0X2NvbW1hbmQoY21kLT5kZXZpY2UtPmhvc3QsIGNtZCk7CiB9CiBFWFBPUlRfU1lNQk9MKHNjc2lfcHV0X2NvbW1hbmQpOwogCi1zdGF0aWMgc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbCAqc2NzaV9nZXRfaG9zdF9jbWRfcG9vbChnZnBfdCBnZnBfbWFzaykKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sICoKK3Njc2lfZmluZF9ob3N0X2NtZF9wb29sKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQogeworCWlmIChzaG9zdC0+aG9zdHQtPmNtZF9zaXplKQorCQlyZXR1cm4gc2hvc3QtPmhvc3R0LT5jbWRfcG9vbDsKKwlpZiAoc2hvc3QtPnVuY2hlY2tlZF9pc2FfZG1hKQorCQlyZXR1cm4gJnNjc2lfY21kX2RtYV9wb29sOworCXJldHVybiAmc2NzaV9jbWRfcG9vbDsKK30KKworc3RhdGljIHZvaWQKK3Njc2lfZnJlZV9ob3N0X2NtZF9wb29sKHN0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgKnBvb2wpCit7CisJa2ZyZWUocG9vbC0+c2Vuc2VfbmFtZSk7CisJa2ZyZWUocG9vbC0+Y21kX25hbWUpOworCWtmcmVlKHBvb2wpOworfQorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbCAqCitzY3NpX2FsbG9jX2hvc3RfY21kX3Bvb2woc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqaG9zdHQgPSBzaG9zdC0+aG9zdHQ7CisJc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbCAqcG9vbDsKKworCXBvb2wgPSBremFsbG9jKHNpemVvZigqcG9vbCksIEdGUF9LRVJORUwpOworCWlmICghcG9vbCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwb29sLT5jbWRfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfY21kIiwgaG9zdHQtPm5hbWUpOworCXBvb2wtPnNlbnNlX25hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzX3NlbnNlIiwgaG9zdHQtPm5hbWUpOworCWlmICghcG9vbC0+Y21kX25hbWUgfHwgIXBvb2wtPnNlbnNlX25hbWUpIHsKKwkJc2NzaV9mcmVlX2hvc3RfY21kX3Bvb2wocG9vbCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXBvb2wtPnNsYWJfZmxhZ3MgPSBTTEFCX0hXQ0FDSEVfQUxJR047CisJaWYgKHNob3N0LT51bmNoZWNrZWRfaXNhX2RtYSkgeworCQlwb29sLT5zbGFiX2ZsYWdzIHw9IFNMQUJfQ0FDSEVfRE1BOworCQlwb29sLT5nZnBfbWFzayA9IF9fR0ZQX0RNQTsKKwl9CisJcmV0dXJuIHBvb2w7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sICoKK3Njc2lfZ2V0X2hvc3RfY21kX3Bvb2woc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqaG9zdHQgPSBzaG9zdC0+aG9zdHQ7CiAJc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbCAqcmV0dmFsID0gTlVMTCwgKnBvb2w7CisJc2l6ZV90IGNtZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBzY3NpX2NtbmQpICsgaG9zdHQtPmNtZF9zaXplOworCiAJLyoKIAkgKiBTZWxlY3QgYSBjb21tYW5kIHNsYWIgZm9yIHRoaXMgaG9zdCBhbmQgY3JlYXRlIGl0IGlmIG5vdAogCSAqIHlldCBleGlzdGVudC4KIAkgKi8KIAltdXRleF9sb2NrKCZob3N0X2NtZF9wb29sX211dGV4KTsKLQlwb29sID0gKGdmcF9tYXNrICYgX19HRlBfRE1BKSA/ICZzY3NpX2NtZF9kbWFfcG9vbCA6Ci0JCSZzY3NpX2NtZF9wb29sOworCXBvb2wgPSBzY3NpX2ZpbmRfaG9zdF9jbWRfcG9vbChzaG9zdCk7CisJaWYgKCFwb29sKSB7CisJCXBvb2wgPSBzY3NpX2FsbG9jX2hvc3RfY21kX3Bvb2woc2hvc3QpOworCQlpZiAoIXBvb2wpCisJCQlnb3RvIG91dDsKKwl9CisKIAlpZiAoIXBvb2wtPnVzZXJzKSB7Ci0JCXBvb2wtPmNtZF9zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUocG9vbC0+Y21kX25hbWUsCi0JCQkJCQkgICBzaXplb2Yoc3RydWN0IHNjc2lfY21uZCksIDAsCisJCXBvb2wtPmNtZF9zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUocG9vbC0+Y21kX25hbWUsIGNtZF9zaXplLCAwLAogCQkJCQkJICAgcG9vbC0+c2xhYl9mbGFncywgTlVMTCk7CiAJCWlmICghcG9vbC0+Y21kX3NsYWIpCi0JCQlnb3RvIGZhaWw7CisJCQlnb3RvIG91dF9mcmVlX3Bvb2w7CiAKIAkJcG9vbC0+c2Vuc2Vfc2xhYiA9IGttZW1fY2FjaGVfY3JlYXRlKHBvb2wtPnNlbnNlX25hbWUsCiAJCQkJCQkgICAgIFNDU0lfU0VOU0VfQlVGRkVSU0laRSwgMCwKIAkJCQkJCSAgICAgcG9vbC0+c2xhYl9mbGFncywgTlVMTCk7Ci0JCWlmICghcG9vbC0+c2Vuc2Vfc2xhYikgewotCQkJa21lbV9jYWNoZV9kZXN0cm95KHBvb2wtPmNtZF9zbGFiKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQorCQlpZiAoIXBvb2wtPnNlbnNlX3NsYWIpCisJCQlnb3RvIG91dF9mcmVlX3NsYWI7CiAJfQogCiAJcG9vbC0+dXNlcnMrKzsKIAlyZXR2YWwgPSBwb29sOwotIGZhaWw6CitvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZob3N0X2NtZF9wb29sX211dGV4KTsKIAlyZXR1cm4gcmV0dmFsOworCitvdXRfZnJlZV9zbGFiOgorCWttZW1fY2FjaGVfZGVzdHJveShwb29sLT5jbWRfc2xhYik7CitvdXRfZnJlZV9wb29sOgorCWlmIChob3N0dC0+Y21kX3NpemUpCisJCXNjc2lfZnJlZV9ob3N0X2NtZF9wb29sKHBvb2wpOworCWdvdG8gb3V0OwogfQogCi1zdGF0aWMgdm9pZCBzY3NpX3B1dF9ob3N0X2NtZF9wb29sKGdmcF90IGdmcF9tYXNrKQorc3RhdGljIHZvaWQgc2NzaV9wdXRfaG9zdF9jbWRfcG9vbChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKIHsKKwlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpob3N0dCA9IHNob3N0LT5ob3N0dDsKIAlzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sICpwb29sOwogCiAJbXV0ZXhfbG9jaygmaG9zdF9jbWRfcG9vbF9tdXRleCk7Ci0JcG9vbCA9IChnZnBfbWFzayAmIF9fR0ZQX0RNQSkgPyAmc2NzaV9jbWRfZG1hX3Bvb2wgOgotCQkmc2NzaV9jbWRfcG9vbDsKKwlwb29sID0gc2NzaV9maW5kX2hvc3RfY21kX3Bvb2woc2hvc3QpOworCiAJLyoKIAkgKiBUaGlzIG1heSBoYXBwZW4gaWYgYSBkcml2ZXIgaGFzIGEgbWlzbWF0Y2hlZCBnZXQgYW5kIHB1dAogCSAqIG9mIHRoZSBjb21tYW5kIHBvb2w7IHRoZSBkcml2ZXIgc2hvdWxkIGJlIGltcGxpY2F0ZWQgaW4KQEAgLTQxMCw2NyArNDM4LDEzIEBACiAJaWYgKCEtLXBvb2wtPnVzZXJzKSB7CiAJCWttZW1fY2FjaGVfZGVzdHJveShwb29sLT5jbWRfc2xhYik7CiAJCWttZW1fY2FjaGVfZGVzdHJveShwb29sLT5zZW5zZV9zbGFiKTsKKwkJaWYgKGhvc3R0LT5jbWRfc2l6ZSkKKwkJCXNjc2lfZnJlZV9ob3N0X2NtZF9wb29sKHBvb2wpOwogCX0KIAltdXRleF91bmxvY2soJmhvc3RfY21kX3Bvb2xfbXV0ZXgpOwogfQogCiAvKioKLSAqIHNjc2lfYWxsb2NhdGVfY29tbWFuZCAtIGdldCBhIGZ1bGx5IGFsbG9jYXRlZCBTQ1NJIGNvbW1hbmQKLSAqIEBnZnBfbWFzazoJYWxsb2NhdGlvbiBtYXNrCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBmb3IgdXNlIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBob3N0IGJhc2VkIHBvb2xzLgotICogSXQgYWxsb2NhdGVzIHRoZSByZWxldmFudCBjb21tYW5kIGFuZCB0YWtlcyBhbiBhZGRpdGlvbmFsIHJlZmVyZW5jZQotICogb24gdGhlIHBvb2wgaXQgdXNlZC4gIFRoaXMgZnVuY3Rpb24gKm11c3QqIGJlIHBhaXJlZCB3aXRoCi0gKiBzY3NpX2ZyZWVfY29tbWFuZCB3aGljaCBhbHNvIGhhcyB0aGUgaWRlbnRpY2FsIG1hc2ssIG90aGVyd2lzZSB0aGUKLSAqIGZyZWUgcG9vbCBjb3VudHMgd2lsbCBldmVudHVhbGx5IGdvIHdyb25nIGFuZCB5b3UnbGwgdHJpZ2dlciBhIGJ1Zy4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCAqb25seSogYmUgdXNlZCBieSBkcml2ZXJzIHRoYXQgbmVlZCBhIHN0YXRpYwotICogY29tbWFuZCBhbGxvY2F0aW9uIGF0IHN0YXJ0IG9mIGRheSBmb3IgaW50ZXJuYWwgZnVuY3Rpb25zLgotICovCi1zdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2FsbG9jYXRlX2NvbW1hbmQoZ2ZwX3QgZ2ZwX21hc2spCi17Ci0Jc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbCAqcG9vbCA9IHNjc2lfZ2V0X2hvc3RfY21kX3Bvb2woZ2ZwX21hc2spOwotCi0JaWYgKCFwb29sKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBzY3NpX3Bvb2xfYWxsb2NfY29tbWFuZChwb29sLCBnZnBfbWFzayk7Ci19Ci1FWFBPUlRfU1lNQk9MKHNjc2lfYWxsb2NhdGVfY29tbWFuZCk7Ci0KLS8qKgotICogc2NzaV9mcmVlX2NvbW1hbmQgLSBmcmVlIGEgY29tbWFuZCBhbGxvY2F0ZWQgYnkgc2NzaV9hbGxvY2F0ZV9jb21tYW5kCi0gKiBAZ2ZwX21hc2s6CW1hc2sgdXNlZCBpbiB0aGUgb3JpZ2luYWwgYWxsb2NhdGlvbgotICogQGNtZDoJY29tbWFuZCB0byBmcmVlCi0gKgotICogTm90ZTogdXNpbmcgdGhlIG9yaWdpbmFsIGFsbG9jYXRpb24gbWFzayBpcyB2aXRhbCBiZWNhdXNlIHRoYXQncwotICogd2hhdCBkZXRlcm1pbmVzIHdoaWNoIGNvbW1hbmQgcG9vbCB3ZSB1c2UgdG8gZnJlZSB0aGUgY29tbWFuZC4gIEFueQotICogbWlzbWF0Y2ggd2lsbCBjYXVzZSB0aGUgc3lzdGVtIHRvIEJVRyBldmVudHVhbGx5LgotICovCi12b2lkIHNjc2lfZnJlZV9jb21tYW5kKGdmcF90IGdmcF9tYXNrLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCi17Ci0Jc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbCAqcG9vbCA9IHNjc2lfZ2V0X2hvc3RfY21kX3Bvb2woZ2ZwX21hc2spOwotCi0JLyoKLQkgKiB0aGlzIGNvdWxkIHRyaWdnZXIgaWYgdGhlIG1hc2sgdG8gc2NzaV9hbGxvY2F0ZV9jb21tYW5kCi0JICogZG9lc24ndCBtYXRjaCB0aGlzIG1hc2suICBPdGhlcndpc2Ugd2UncmUgZ3VhcmFudGVlZCB0aGF0IHRoaXMKLQkgKiBzdWNjZWVkcyBiZWNhdXNlIHNjc2lfYWxsb2NhdGVfY29tbWFuZCBtdXN0IGhhdmUgdGFrZW4gYSByZWZlcmVuY2UKLQkgKiBvbiB0aGUgcG9vbAotCSAqLwotCUJVR19PTighcG9vbCk7Ci0KLQlzY3NpX3Bvb2xfZnJlZV9jb21tYW5kKHBvb2wsIGNtZCk7Ci0JLyoKLQkgKiBzY3NpX3B1dF9ob3N0X2NtZF9wb29sIGlzIGNhbGxlZCB0d2ljZTsgb25jZSB0byByZWxlYXNlIHRoZQotCSAqIHJlZmVyZW5jZSB3ZSB0b29rIGFib3ZlLCBhbmQgb25jZSB0byByZWxlYXNlIHRoZSByZWZlcmVuY2UKLQkgKiBvcmlnaW5hbGx5IHRha2VuIGJ5IHNjc2lfYWxsb2NhdGVfY29tbWFuZAotCSAqLwotCXNjc2lfcHV0X2hvc3RfY21kX3Bvb2woZ2ZwX21hc2spOwotCXNjc2lfcHV0X2hvc3RfY21kX3Bvb2woZ2ZwX21hc2spOwotfQotRVhQT1JUX1NZTUJPTChzY3NpX2ZyZWVfY29tbWFuZCk7Ci0KLS8qKgogICogc2NzaV9zZXR1cF9jb21tYW5kX2ZyZWVsaXN0IC0gU2V0dXAgdGhlIGNvbW1hbmQgZnJlZWxpc3QgZm9yIGEgc2NzaSBob3N0LgogICogQHNob3N0OiBob3N0IHRvIGFsbG9jYXRlIHRoZSBmcmVlbGlzdCBmb3IuCiAgKgpAQCAtNDgyLDE0ICs0NTYsMTMgQEAKICAqLwogaW50IHNjc2lfc2V0dXBfY29tbWFuZF9mcmVlbGlzdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKIHsKLQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CiAJY29uc3QgZ2ZwX3QgZ2ZwX21hc2sgPSBzaG9zdC0+dW5jaGVja2VkX2lzYV9kbWEgPyBHRlBfRE1BIDogR0ZQX0tFUk5FTDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CiAKIAlzcGluX2xvY2tfaW5pdCgmc2hvc3QtPmZyZWVfbGlzdF9sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmc2hvc3QtPmZyZWVfbGlzdCk7CiAKLQlzaG9zdC0+Y21kX3Bvb2wgPSBzY3NpX2dldF9ob3N0X2NtZF9wb29sKGdmcF9tYXNrKTsKLQorCXNob3N0LT5jbWRfcG9vbCA9IHNjc2lfZ2V0X2hvc3RfY21kX3Bvb2woc2hvc3QpOwogCWlmICghc2hvc3QtPmNtZF9wb29sKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNDk4LDcgKzQ3MSw3IEBACiAJICovCiAJY21kID0gc2NzaV9ob3N0X2FsbG9jX2NvbW1hbmQoc2hvc3QsIGdmcF9tYXNrKTsKIAlpZiAoIWNtZCkgewotCQlzY3NpX3B1dF9ob3N0X2NtZF9wb29sKGdmcF9tYXNrKTsKKwkJc2NzaV9wdXRfaG9zdF9jbWRfcG9vbChzaG9zdCk7CiAJCXNob3N0LT5jbWRfcG9vbCA9IE5VTEw7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTUyNCwxMCArNDk3LDEwIEBACiAKIAkJY21kID0gbGlzdF9lbnRyeShzaG9zdC0+ZnJlZV9saXN0Lm5leHQsIHN0cnVjdCBzY3NpX2NtbmQsIGxpc3QpOwogCQlsaXN0X2RlbF9pbml0KCZjbWQtPmxpc3QpOwotCQlzY3NpX3Bvb2xfZnJlZV9jb21tYW5kKHNob3N0LT5jbWRfcG9vbCwgY21kKTsKKwkJc2NzaV9ob3N0X2ZyZWVfY29tbWFuZChzaG9zdCwgY21kKTsKIAl9CiAJc2hvc3QtPmNtZF9wb29sID0gTlVMTDsKLQlzY3NpX3B1dF9ob3N0X2NtZF9wb29sKHNob3N0LT51bmNoZWNrZWRfaXNhX2RtYSA/IEdGUF9ETUEgOiBHRlBfS0VSTkVMKTsKKwlzY3NpX3B1dF9ob3N0X2NtZF9wb29sKHNob3N0KTsKIH0KIAogI2lmZGVmIENPTkZJR19TQ1NJX0xPR0dJTkcKQEAgLTk1NCw3ICs5MjcsNyBAQAogICogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24uICBZb3UgcHJvYmFibHkgd2FudCB0byB1c2UKICAqIHNjc2lfZ2V0X3ZwZF9wYWdlIGluc3RlYWQuCiAgKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIuCisgKiBSZXR1cm5zIHNpemUgb2YgdGhlIHZwZCBwYWdlIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIuCiAgKi8KIHN0YXRpYyBpbnQgc2NzaV92cGRfaW5xdWlyeShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKIAkJCQkJCQl1OCBwYWdlLCB1bnNpZ25lZCBsZW4pCkBAIC05NjIsNiArOTM1LDkgQEAKIAlpbnQgcmVzdWx0OwogCXVuc2lnbmVkIGNoYXIgY21kWzE2XTsKIAorCWlmIChsZW4gPCA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWNtZFswXSA9IElOUVVJUlk7CiAJY21kWzFdID0gMTsJCS8qIEVWUEQgKi8KIAljbWRbMl0gPSBwYWdlOwpAQCAtOTc2LDEzICs5NTIsMTMgQEAKIAlyZXN1bHQgPSBzY3NpX2V4ZWN1dGVfcmVxKHNkZXYsIGNtZCwgRE1BX0ZST01fREVWSUNFLCBidWZmZXIsCiAJCQkJICBsZW4sIE5VTEwsIDMwICogSFosIDMsIE5VTEwpOwogCWlmIChyZXN1bHQpCi0JCXJldHVybiByZXN1bHQ7CisJCXJldHVybiAtRUlPOwogCiAJLyogU2FuaXR5IGNoZWNrIHRoYXQgd2UgZ290IHRoZSBwYWdlIGJhY2sgdGhhdCB3ZSBhc2tlZCBmb3IgKi8KIAlpZiAoYnVmZmVyWzFdICE9IHBhZ2UpCiAJCXJldHVybiAtRUlPOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGdldF91bmFsaWduZWRfYmUxNigmYnVmZmVyWzJdKSArIDQ7CiB9CiAKIC8qKgpAQCAtMTAwOSwxOCArOTg1LDE4IEBACiAKIAkvKiBBc2sgZm9yIGFsbCB0aGUgcGFnZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZGV2aWNlICovCiAJcmVzdWx0ID0gc2NzaV92cGRfaW5xdWlyeShzZGV2LCBidWYsIDAsIGJ1Zl9sZW4pOwotCWlmIChyZXN1bHQpCisJaWYgKHJlc3VsdCA8IDQpCiAJCWdvdG8gZmFpbDsKIAogCS8qIElmIHRoZSB1c2VyIGFjdHVhbGx5IHdhbnRlZCB0aGlzIHBhZ2UsIHdlIGNhbiBza2lwIHRoZSByZXN0ICovCiAJaWYgKHBhZ2UgPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbWluKChpbnQpYnVmWzNdLCBidWZfbGVuIC0gNCk7IGkrKykKLQkJaWYgKGJ1ZltpICsgNF0gPT0gcGFnZSkKKwlmb3IgKGkgPSA0OyBpIDwgbWluKHJlc3VsdCwgYnVmX2xlbik7IGkrKykKKwkJaWYgKGJ1ZltpXSA9PSBwYWdlKQogCQkJZ290byBmb3VuZDsKIAotCWlmIChpIDwgYnVmWzNdICYmIGkgPj0gYnVmX2xlbiAtIDQpCisJaWYgKGkgPCByZXN1bHQgJiYgaSA+PSBidWZfbGVuKQogCQkvKiByYW4gb2ZmIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgZ2l2ZSB1cyBiZW5lZml0IG9mIGRvdWJ0ICovCiAJCWdvdG8gZm91bmQ7CiAJLyogVGhlIGRldmljZSBjbGFpbXMgaXQgZG9lc24ndCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgcGFnZSAqLwpAQCAtMTAyOCw3ICsxMDA0LDcgQEAKIAogIGZvdW5kOgogCXJlc3VsdCA9IHNjc2lfdnBkX2lucXVpcnkoc2RldiwgYnVmLCBwYWdlLCBidWZfbGVuKTsKLQlpZiAocmVzdWx0KQorCWlmIChyZXN1bHQgPCAwKQogCQlnb3RvIGZhaWw7CiAKIAlyZXR1cm4gMDsKQEAgLTEwMzksNiArMTAxNSw5MyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc2NzaV9nZXRfdnBkX3BhZ2UpOwogCiAvKioKKyAqIHNjc2lfYXR0YWNoX3ZwZCAtIEF0dGFjaCBWaXRhbCBQcm9kdWN0IERhdGEgdG8gYSBTQ1NJIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBzZGV2OiBUaGUgZGV2aWNlIHRvIGFzaworICoKKyAqIEF0dGFjaCB0aGUgJ0RldmljZSBJZGVudGlmaWNhdGlvbicgVlBEIHBhZ2UgKDB4ODMpIGFuZCB0aGUKKyAqICdVbml0IFNlcmlhbCBOdW1iZXInIFZQRCBwYWdlICgweDgwKSB0byBhIFNDU0kgZGV2aWNlCisgKiBzdHJ1Y3R1cmUuIFRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGRldmljZQorICogdW5pcXVlbHkuCisgKi8KK3ZvaWQgc2NzaV9hdHRhY2hfdnBkKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlpbnQgcmVzdWx0LCBpOworCWludCB2cGRfbGVuID0gU0NTSV9WUERfUEdfTEVOOworCWludCBwZzgwX3N1cHBvcnRlZCA9IDA7CisJaW50IHBnODNfc3VwcG9ydGVkID0gMDsKKwl1bnNpZ25lZCBjaGFyICp2cGRfYnVmOworCisJaWYgKHNkZXYtPnNraXBfdnBkX3BhZ2VzKQorCQlyZXR1cm47CityZXRyeV9wZzA6CisJdnBkX2J1ZiA9IGttYWxsb2ModnBkX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2cGRfYnVmKQorCQlyZXR1cm47CisKKwkvKiBBc2sgZm9yIGFsbCB0aGUgcGFnZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZGV2aWNlICovCisJcmVzdWx0ID0gc2NzaV92cGRfaW5xdWlyeShzZGV2LCB2cGRfYnVmLCAwLCB2cGRfbGVuKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlrZnJlZSh2cGRfYnVmKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocmVzdWx0ID4gdnBkX2xlbikgeworCQl2cGRfbGVuID0gcmVzdWx0OworCQlrZnJlZSh2cGRfYnVmKTsKKwkJZ290byByZXRyeV9wZzA7CisJfQorCisJZm9yIChpID0gNDsgaSA8IHJlc3VsdDsgaSsrKSB7CisJCWlmICh2cGRfYnVmW2ldID09IDB4ODApCisJCQlwZzgwX3N1cHBvcnRlZCA9IDE7CisJCWlmICh2cGRfYnVmW2ldID09IDB4ODMpCisJCQlwZzgzX3N1cHBvcnRlZCA9IDE7CisJfQorCWtmcmVlKHZwZF9idWYpOworCXZwZF9sZW4gPSBTQ1NJX1ZQRF9QR19MRU47CisKKwlpZiAocGc4MF9zdXBwb3J0ZWQpIHsKK3JldHJ5X3BnODA6CisJCXZwZF9idWYgPSBrbWFsbG9jKHZwZF9sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoIXZwZF9idWYpCisJCQlyZXR1cm47CisKKwkJcmVzdWx0ID0gc2NzaV92cGRfaW5xdWlyeShzZGV2LCB2cGRfYnVmLCAweDgwLCB2cGRfbGVuKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWtmcmVlKHZwZF9idWYpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChyZXN1bHQgPiB2cGRfbGVuKSB7CisJCQl2cGRfbGVuID0gcmVzdWx0OworCQkJa2ZyZWUodnBkX2J1Zik7CisJCQlnb3RvIHJldHJ5X3BnODA7CisJCX0KKwkJc2Rldi0+dnBkX3BnODBfbGVuID0gcmVzdWx0OworCQlzZGV2LT52cGRfcGc4MCA9IHZwZF9idWY7CisJCXZwZF9sZW4gPSBTQ1NJX1ZQRF9QR19MRU47CisJfQorCisJaWYgKHBnODNfc3VwcG9ydGVkKSB7CityZXRyeV9wZzgzOgorCQl2cGRfYnVmID0ga21hbGxvYyh2cGRfbGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF2cGRfYnVmKQorCQkJcmV0dXJuOworCisJCXJlc3VsdCA9IHNjc2lfdnBkX2lucXVpcnkoc2RldiwgdnBkX2J1ZiwgMHg4MywgdnBkX2xlbik7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlrZnJlZSh2cGRfYnVmKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAocmVzdWx0ID4gdnBkX2xlbikgeworCQkJdnBkX2xlbiA9IHJlc3VsdDsKKwkJCWtmcmVlKHZwZF9idWYpOworCQkJZ290byByZXRyeV9wZzgzOworCQl9CisJCXNkZXYtPnZwZF9wZzgzX2xlbiA9IHJlc3VsdDsKKwkJc2Rldi0+dnBkX3BnODMgPSB2cGRfYnVmOworCX0KK30KKworLyoqCiAgKiBzY3NpX3JlcG9ydF9vcGNvZGUgLSBGaW5kIG91dCBpZiBhIGdpdmVuIGNvbW1hbmQgb3Bjb2RlIGlzIHN1cHBvcnRlZAogICogQHNkZXY6CXNjc2kgZGV2aWNlIHRvIHF1ZXJ5CiAgKiBAYnVmZmVyOglzY3JhdGNoIGJ1ZmZlciAobXVzdCBiZSBhdCBsZWFzdCAyMCBieXRlcyBsb25nKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMKaW5kZXggMmRlY2M2NC4uZjNlOWNjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jCkBAIC02NCw2ICs2NCw3IEBACiAvKiBBZGRpdGlvbmFsIFNlbnNlIENvZGUgKEFTQykgKi8KICNkZWZpbmUgTk9fQURESVRJT05BTF9TRU5TRSAweDAKICNkZWZpbmUgTE9HSUNBTF9VTklUX05PVF9SRUFEWSAweDQKKyNkZWZpbmUgTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRSAweDgKICNkZWZpbmUgVU5SRUNPVkVSRURfUkVBRF9FUlIgMHgxMQogI2RlZmluZSBQQVJBTUVURVJfTElTVF9MRU5HVEhfRVJSIDB4MWEKICNkZWZpbmUgSU5WQUxJRF9PUENPREUgMHgyMApAQCAtMTk1LDYgKzE5Niw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHNjc2lfZGVidWdfdW5tYXBfbWF4X2Rlc2MgPSBERUZfVU5NQVBfTUFYX0RFU0M7CiBzdGF0aWMgdW5zaWduZWQgaW50IHNjc2lfZGVidWdfd3JpdGVfc2FtZV9sZW5ndGggPSBERUZfV1JJVEVTQU1FX0xFTkdUSDsKIHN0YXRpYyBib29sIHNjc2lfZGVidWdfcmVtb3ZhYmxlID0gREVGX1JFTU9WQUJMRTsKK3N0YXRpYyBib29sIHNjc2lfZGVidWdfY2x1c3RlcmluZzsKIAogc3RhdGljIGludCBzY3NpX2RlYnVnX2NtbmRfY291bnQgPSAwOwogCkBAIC0xNzgwLDcgKzE3ODIsNiBAQAogCSAgICBiZTMyX3RvX2NwdShzZHQtPnJlZl90YWcpICE9IGVpX2xiYSkgewogCQlwcl9lcnIoIiVzOiBSRUYgY2hlY2sgZmFpbGVkIG9uIHNlY3RvciAlbHVcbiIsCiAJCQlfX2Z1bmNfXywgKHVuc2lnbmVkIGxvbmcpc2VjdG9yKTsKLQkJCWRpZl9lcnJvcnMrKzsKIAkJcmV0dXJuIDB4MDM7CiAJfQogCXJldHVybiAwOwpAQCAtMTc4OSwyMyArMTc5MCwyNyBAQAogc3RhdGljIHZvaWQgZGlmX2NvcHlfcHJvdChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwgc2VjdG9yX3Qgc2VjdG9yLAogCQkJICB1bnNpZ25lZCBpbnQgc2VjdG9ycywgYm9vbCByZWFkKQogewotCXVuc2lnbmVkIGludCBpLCByZXNpZDsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnBzZ2w7CisJc2l6ZV90IHJlc2lkOwogCXZvaWQgKnBhZGRyOwogCWNvbnN0IHZvaWQgKmRpZl9zdG9yZV9lbmQgPSBkaWZfc3RvcmVwICsgc2RlYnVnX3N0b3JlX3NlY3RvcnM7CisJc3RydWN0IHNnX21hcHBpbmdfaXRlciBtaXRlcjsKIAogCS8qIEJ5dGVzIG9mIHByb3RlY3Rpb24gZGF0YSB0byBjb3B5IGludG8gc2dsICovCiAJcmVzaWQgPSBzZWN0b3JzICogc2l6ZW9mKCpkaWZfc3RvcmVwKTsKIAotCXNjc2lfZm9yX2VhY2hfcHJvdF9zZyhTQ3BudCwgcHNnbCwgc2NzaV9wcm90X3NnX2NvdW50KFNDcG50KSwgaSkgewotCQlpbnQgbGVuID0gbWluKHBzZ2wtPmxlbmd0aCwgcmVzaWQpOworCXNnX21pdGVyX3N0YXJ0KCZtaXRlciwgc2NzaV9wcm90X3NnbGlzdChTQ3BudCksCisJCQlzY3NpX3Byb3Rfc2dfY291bnQoU0NwbnQpLCBTR19NSVRFUl9BVE9NSUMgfAorCQkJKHJlYWQgPyBTR19NSVRFUl9UT19TRyA6IFNHX01JVEVSX0ZST01fU0cpKTsKKworCXdoaWxlIChzZ19taXRlcl9uZXh0KCZtaXRlcikgJiYgcmVzaWQgPiAwKSB7CisJCXNpemVfdCBsZW4gPSBtaW4obWl0ZXIubGVuZ3RoLCByZXNpZCk7CiAJCXZvaWQgKnN0YXJ0ID0gZGlmX3N0b3JlKHNlY3Rvcik7Ci0JCWludCByZXN0ID0gMDsKKwkJc2l6ZV90IHJlc3QgPSAwOwogCiAJCWlmIChkaWZfc3RvcmVfZW5kIDwgc3RhcnQgKyBsZW4pCiAJCQlyZXN0ID0gc3RhcnQgKyBsZW4gLSBkaWZfc3RvcmVfZW5kOwogCi0JCXBhZGRyID0ga21hcF9hdG9taWMoc2dfcGFnZShwc2dsKSkgKyBwc2dsLT5vZmZzZXQ7CisJCXBhZGRyID0gbWl0ZXIuYWRkcjsKIAogCQlpZiAocmVhZCkKIAkJCW1lbWNweShwYWRkciwgc3RhcnQsIGxlbiAtIHJlc3QpOwpAQCAtMTgyMSw4ICsxODI2LDggQEAKIAogCQlzZWN0b3IgKz0gbGVuIC8gc2l6ZW9mKCpkaWZfc3RvcmVwKTsKIAkJcmVzaWQgLT0gbGVuOwotCQlrdW5tYXBfYXRvbWljKHBhZGRyKTsKIAl9CisJc2dfbWl0ZXJfc3RvcCgmbWl0ZXIpOwogfQogCiBzdGF0aWMgaW50IHByb3RfdmVyaWZ5X3JlYWQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsIHNlY3Rvcl90IHN0YXJ0X3NlYywKQEAgLTE4MzIsNyArMTgzNyw3IEBACiAJc3RydWN0IHNkX2RpZl90dXBsZSAqc2R0OwogCXNlY3Rvcl90IHNlY3RvcjsKIAotCWZvciAoaSA9IDA7IGkgPCBzZWN0b3JzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgc2VjdG9yczsgaSsrLCBlaV9sYmErKykgewogCQlpbnQgcmV0OwogCiAJCXNlY3RvciA9IHN0YXJ0X3NlYyArIGk7CkBAIC0xODQ2LDggKzE4NTEsNiBAQAogCQkJZGlmX2Vycm9ycysrOwogCQkJcmV0dXJuIHJldDsKIAkJfQotCi0JCWVpX2xiYSsrOwogCX0KIAogCWRpZl9jb3B5X3Byb3QoU0NwbnQsIHN0YXJ0X3NlYywgc2VjdG9ycywgdHJ1ZSk7CkBAIC0xODg2LDE3ICsxODg5LDE5IEBACiAJCXJldHVybiBjaGVja19jb25kaXRpb25fcmVzdWx0OwogCX0KIAorCXJlYWRfbG9ja19pcnFzYXZlKCZhdG9taWNfcncsIGlmbGFncyk7CisKIAkvKiBESVggKyBUMTAgRElGICovCiAJaWYgKHNjc2lfZGVidWdfZGl4ICYmIHNjc2lfcHJvdF9zZ19jb3VudChTQ3BudCkpIHsKIAkJaW50IHByb3RfcmV0ID0gcHJvdF92ZXJpZnlfcmVhZChTQ3BudCwgbGJhLCBudW0sIGVpX2xiYSk7CiAKIAkJaWYgKHByb3RfcmV0KSB7CisJCQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZhdG9taWNfcncsIGlmbGFncyk7CiAJCQlta19zZW5zZV9idWZmZXIoZGV2aXAsIEFCT1JURURfQ09NTUFORCwgMHgxMCwgcHJvdF9yZXQpOwogCQkJcmV0dXJuIGlsbGVnYWxfY29uZGl0aW9uX3Jlc3VsdDsKIAkJfQogCX0KIAotCXJlYWRfbG9ja19pcnFzYXZlKCZhdG9taWNfcncsIGlmbGFncyk7CiAJcmV0ID0gZG9fZGV2aWNlX2FjY2VzcyhTQ3BudCwgZGV2aXAsIGxiYSwgbnVtLCAwKTsKIAlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZhdG9taWNfcncsIGlmbGFncyk7CiAJaWYgKHJldCA9PSAtMSkKQEAgLTE5MzEsNTUgKzE5MzYsNjIgQEAKIHN0YXRpYyBpbnQgcHJvdF92ZXJpZnlfd3JpdGUoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsIHNlY3Rvcl90IHN0YXJ0X3NlYywKIAkJCSAgICAgdW5zaWduZWQgaW50IHNlY3RvcnMsIHUzMiBlaV9sYmEpCiB7Ci0JaW50IGksIGosIHJldDsKKwlpbnQgcmV0OwogCXN0cnVjdCBzZF9kaWZfdHVwbGUgKnNkdDsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzZ2w7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpwc2dsID0gc2NzaV9wcm90X3NnbGlzdChTQ3BudCk7Ci0Jdm9pZCAqZGFkZHIsICpwYWRkcjsKKwl2b2lkICpkYWRkcjsKIAlzZWN0b3JfdCBzZWN0b3IgPSBzdGFydF9zZWM7CiAJaW50IHBwYWdlX29mZnNldDsKKwlpbnQgZHBhZ2Vfb2Zmc2V0OworCXN0cnVjdCBzZ19tYXBwaW5nX2l0ZXIgZGl0ZXI7CisJc3RydWN0IHNnX21hcHBpbmdfaXRlciBwaXRlcjsKIAogCUJVR19PTihzY3NpX3NnX2NvdW50KFNDcG50KSA9PSAwKTsKIAlCVUdfT04oc2NzaV9wcm90X3NnX2NvdW50KFNDcG50KSA9PSAwKTsKIAotCXBwYWdlX29mZnNldCA9IDA7CisJc2dfbWl0ZXJfc3RhcnQoJnBpdGVyLCBzY3NpX3Byb3Rfc2dsaXN0KFNDcG50KSwKKwkJCXNjc2lfcHJvdF9zZ19jb3VudChTQ3BudCksCisJCQlTR19NSVRFUl9BVE9NSUMgfCBTR19NSVRFUl9GUk9NX1NHKTsKKwlzZ19taXRlcl9zdGFydCgmZGl0ZXIsIHNjc2lfc2dsaXN0KFNDcG50KSwgc2NzaV9zZ19jb3VudChTQ3BudCksCisJCQlTR19NSVRFUl9BVE9NSUMgfCBTR19NSVRFUl9GUk9NX1NHKTsKIAotCS8qIEZvciBlYWNoIGRhdGEgcGFnZSAqLwotCXNjc2lfZm9yX2VhY2hfc2coU0NwbnQsIGRzZ2wsIHNjc2lfc2dfY291bnQoU0NwbnQpLCBpKSB7Ci0JCWRhZGRyID0ga21hcF9hdG9taWMoc2dfcGFnZShkc2dsKSkgKyBkc2dsLT5vZmZzZXQ7Ci0JCXBhZGRyID0ga21hcF9hdG9taWMoc2dfcGFnZShwc2dsKSkgKyBwc2dsLT5vZmZzZXQ7CisJLyogRm9yIGVhY2ggcHJvdGVjdGlvbiBwYWdlICovCisJd2hpbGUgKHNnX21pdGVyX25leHQoJnBpdGVyKSkgeworCQlkcGFnZV9vZmZzZXQgPSAwOworCQlpZiAoV0FSTl9PTighc2dfbWl0ZXJfbmV4dCgmZGl0ZXIpKSkgeworCQkJcmV0ID0gMHgwMTsKKwkJCWdvdG8gb3V0OworCQl9CiAKLQkJLyogRm9yIGVhY2ggc2VjdG9yLXNpemVkIGNodW5rIGluIGRhdGEgcGFnZSAqLwotCQlmb3IgKGogPSAwOyBqIDwgZHNnbC0+bGVuZ3RoOyBqICs9IHNjc2lfZGVidWdfc2VjdG9yX3NpemUpIHsKLQorCQlmb3IgKHBwYWdlX29mZnNldCA9IDA7IHBwYWdlX29mZnNldCA8IHBpdGVyLmxlbmd0aDsKKwkJICAgICBwcGFnZV9vZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBzZF9kaWZfdHVwbGUpKSB7CiAJCQkvKiBJZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50Ci0JCQkgKiBwcm90ZWN0aW9uIHBhZ2UgYWR2YW5jZSB0byB0aGUgbmV4dCBvbmUKKwkJCSAqIGRhdGEgcGFnZSBhZHZhbmNlIHRvIHRoZSBuZXh0IG9uZQogCQkJICovCi0JCQlpZiAocHBhZ2Vfb2Zmc2V0ID49IHBzZ2wtPmxlbmd0aCkgewotCQkJCWt1bm1hcF9hdG9taWMocGFkZHIpOwotCQkJCXBzZ2wgPSBzZ19uZXh0KHBzZ2wpOwotCQkJCUJVR19PTihwc2dsID09IE5VTEwpOwotCQkJCXBhZGRyID0ga21hcF9hdG9taWMoc2dfcGFnZShwc2dsKSkKLQkJCQkJKyBwc2dsLT5vZmZzZXQ7Ci0JCQkJcHBhZ2Vfb2Zmc2V0ID0gMDsKKwkJCWlmIChkcGFnZV9vZmZzZXQgPj0gZGl0ZXIubGVuZ3RoKSB7CisJCQkJaWYgKFdBUk5fT04oIXNnX21pdGVyX25leHQoJmRpdGVyKSkpIHsKKwkJCQkJcmV0ID0gMHgwMTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWRwYWdlX29mZnNldCA9IDA7CiAJCQl9CiAKLQkJCXNkdCA9IHBhZGRyICsgcHBhZ2Vfb2Zmc2V0OworCQkJc2R0ID0gcGl0ZXIuYWRkciArIHBwYWdlX29mZnNldDsKKwkJCWRhZGRyID0gZGl0ZXIuYWRkciArIGRwYWdlX29mZnNldDsKIAotCQkJcmV0ID0gZGlmX3ZlcmlmeShzZHQsIGRhZGRyICsgaiwgc2VjdG9yLCBlaV9sYmEpOworCQkJcmV0ID0gZGlmX3ZlcmlmeShzZHQsIGRhZGRyLCBzZWN0b3IsIGVpX2xiYSk7CiAJCQlpZiAocmV0KSB7Ci0JCQkJZHVtcF9zZWN0b3IoZGFkZHIgKyBqLCBzY3NpX2RlYnVnX3NlY3Rvcl9zaXplKTsKKwkJCQlkdW1wX3NlY3RvcihkYWRkciwgc2NzaV9kZWJ1Z19zZWN0b3Jfc2l6ZSk7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAKIAkJCXNlY3RvcisrOwogCQkJZWlfbGJhKys7Ci0JCQlwcGFnZV9vZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBzZF9kaWZfdHVwbGUpOworCQkJZHBhZ2Vfb2Zmc2V0ICs9IHNjc2lfZGVidWdfc2VjdG9yX3NpemU7CiAJCX0KLQotCQlrdW5tYXBfYXRvbWljKHBhZGRyKTsKLQkJa3VubWFwX2F0b21pYyhkYWRkcik7CisJCWRpdGVyLmNvbnN1bWVkID0gZHBhZ2Vfb2Zmc2V0OworCQlzZ19taXRlcl9zdG9wKCZkaXRlcik7CiAJfQorCXNnX21pdGVyX3N0b3AoJnBpdGVyKTsKIAogCWRpZl9jb3B5X3Byb3QoU0NwbnQsIHN0YXJ0X3NlYywgc2VjdG9ycywgZmFsc2UpOwogCWRpeF93cml0ZXMrKzsKQEAgLTE5ODgsOCArMjAwMCw4IEBACiAKIG91dDoKIAlkaWZfZXJyb3JzKys7Ci0Ja3VubWFwX2F0b21pYyhwYWRkcik7Ci0Ja3VubWFwX2F0b21pYyhkYWRkcik7CisJc2dfbWl0ZXJfc3RvcCgmZGl0ZXIpOworCXNnX21pdGVyX3N0b3AoJnBpdGVyKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yMDg5LDE3ICsyMTAxLDE5IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCXdyaXRlX2xvY2tfaXJxc2F2ZSgmYXRvbWljX3J3LCBpZmxhZ3MpOworCiAJLyogRElYICsgVDEwIERJRiAqLwogCWlmIChzY3NpX2RlYnVnX2RpeCAmJiBzY3NpX3Byb3Rfc2dfY291bnQoU0NwbnQpKSB7CiAJCWludCBwcm90X3JldCA9IHByb3RfdmVyaWZ5X3dyaXRlKFNDcG50LCBsYmEsIG51bSwgZWlfbGJhKTsKIAogCQlpZiAocHJvdF9yZXQpIHsKKwkJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZhdG9taWNfcncsIGlmbGFncyk7CiAJCQlta19zZW5zZV9idWZmZXIoZGV2aXAsIElMTEVHQUxfUkVRVUVTVCwgMHgxMCwgcHJvdF9yZXQpOwogCQkJcmV0dXJuIGlsbGVnYWxfY29uZGl0aW9uX3Jlc3VsdDsKIAkJfQogCX0KIAotCXdyaXRlX2xvY2tfaXJxc2F2ZSgmYXRvbWljX3J3LCBpZmxhZ3MpOwogCXJldCA9IGRvX2RldmljZV9hY2Nlc3MoU0NwbnQsIGRldmlwLCBsYmEsIG51bSwgMSk7CiAJaWYgKHNjc2lfZGVidWdfbGJwKCkpCiAJCW1hcF9yZWdpb24obGJhLCBudW0pOwpAQCAtMjE3OCw2ICsyMTkyLDcgQEAKIAlzdHJ1Y3QgdW5tYXBfYmxvY2tfZGVzYyAqZGVzYzsKIAl1bnNpZ25lZCBpbnQgaSwgcGF5bG9hZF9sZW4sIGRlc2NyaXB0b3JzOwogCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CiAKIAlyZXQgPSBjaGVja19yZWFkaW5lc3Moc2NtZCwgMSwgZGV2aXApOwogCWlmIChyZXQpCkBAIC0yMTk5LDYgKzIyMTQsOCBAQAogCiAJZGVzYyA9ICh2b2lkICopJmJ1Zls4XTsKIAorCXdyaXRlX2xvY2tfaXJxc2F2ZSgmYXRvbWljX3J3LCBpZmxhZ3MpOworCiAJZm9yIChpID0gMCA7IGkgPCBkZXNjcmlwdG9ycyA7IGkrKykgewogCQl1bnNpZ25lZCBsb25nIGxvbmcgbGJhID0gZ2V0X3VuYWxpZ25lZF9iZTY0KCZkZXNjW2ldLmxiYSk7CiAJCXVuc2lnbmVkIGludCBudW0gPSBnZXRfdW5hbGlnbmVkX2JlMzIoJmRlc2NbaV0uYmxvY2tzKTsKQEAgLTIyMTMsNiArMjIzMCw3IEBACiAJcmV0ID0gMDsKIAogb3V0OgorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZhdG9taWNfcncsIGlmbGFncyk7CiAJa2ZyZWUoYnVmKTsKIAogCXJldHVybiByZXQ7CkBAIC0yMzEzLDM2ICsyMzMxLDM3IEBACiBzdGF0aWMgaW50IHJlc3BfeGR3cml0ZXJlYWQoc3RydWN0IHNjc2lfY21uZCAqc2NwLCB1bnNpZ25lZCBsb25nIGxvbmcgbGJhLAogCQkJICAgIHVuc2lnbmVkIGludCBudW0sIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKmRldmlwKQogewotCWludCBpLCBqLCByZXQgPSAtMTsKKwlpbnQgajsKIAl1bnNpZ25lZCBjaGFyICprYWRkciwgKmJ1ZjsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0OwotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAJc3RydWN0IHNjc2lfZGF0YV9idWZmZXIgKnNkYiA9IHNjc2lfaW4oc2NwKTsKKwlzdHJ1Y3Qgc2dfbWFwcGluZ19pdGVyIG1pdGVyOwogCiAJLyogYmV0dGVyIG5vdCB0byB1c2UgdGVtcG9yYXJ5IGJ1ZmZlci4gKi8KIAlidWYgPSBrbWFsbG9jKHNjc2lfYnVmZmxlbihzY3ApLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIHJldDsKKwlpZiAoIWJ1ZikgeworCQlta19zZW5zZV9idWZmZXIoZGV2aXAsIE5PVF9SRUFEWSwKKwkJCQlMT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFLCAwKTsKKwkJcmV0dXJuIGNoZWNrX2NvbmRpdGlvbl9yZXN1bHQ7CisJfQogCiAJc2NzaV9zZ19jb3B5X3RvX2J1ZmZlcihzY3AsIGJ1Ziwgc2NzaV9idWZmbGVuKHNjcCkpOwogCiAJb2Zmc2V0ID0gMDsKLQlmb3JfZWFjaF9zZyhzZGItPnRhYmxlLnNnbCwgc2csIHNkYi0+dGFibGUubmVudHMsIGkpIHsKLQkJa2FkZHIgPSAodW5zaWduZWQgY2hhciAqKWttYXBfYXRvbWljKHNnX3BhZ2Uoc2cpKTsKLQkJaWYgKCFrYWRkcikKLQkJCWdvdG8gb3V0OworCXNnX21pdGVyX3N0YXJ0KCZtaXRlciwgc2RiLT50YWJsZS5zZ2wsIHNkYi0+dGFibGUubmVudHMsCisJCQlTR19NSVRFUl9BVE9NSUMgfCBTR19NSVRFUl9UT19TRyk7CiAKLQkJZm9yIChqID0gMDsgaiA8IHNnLT5sZW5ndGg7IGorKykKLQkJCSooa2FkZHIgKyBzZy0+b2Zmc2V0ICsgaikgXj0gKihidWYgKyBvZmZzZXQgKyBqKTsKKwl3aGlsZSAoc2dfbWl0ZXJfbmV4dCgmbWl0ZXIpKSB7CisJCWthZGRyID0gbWl0ZXIuYWRkcjsKKwkJZm9yIChqID0gMDsgaiA8IG1pdGVyLmxlbmd0aDsgaisrKQorCQkJKihrYWRkciArIGopIF49ICooYnVmICsgb2Zmc2V0ICsgaik7CiAKLQkJb2Zmc2V0ICs9IHNnLT5sZW5ndGg7Ci0JCWt1bm1hcF9hdG9taWMoa2FkZHIpOworCQlvZmZzZXQgKz0gbWl0ZXIubGVuZ3RoOwogCX0KLQlyZXQgPSAwOwotb3V0OgorCXNnX21pdGVyX3N0b3AoJm1pdGVyKTsKIAlrZnJlZShidWYpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogLyogV2hlbiB0aW1lciBnb2VzIG9mZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gKi8KQEAgLTI3NDQsNiArMjc2Myw3IEBACiAgKi8KIG1vZHVsZV9wYXJhbV9uYW1lZChhZGRfaG9zdCwgc2NzaV9kZWJ1Z19hZGRfaG9zdCwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CiBtb2R1bGVfcGFyYW1fbmFtZWQoYXRvLCBzY3NpX2RlYnVnX2F0bywgaW50LCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbV9uYW1lZChjbHVzdGVyaW5nLCBzY3NpX2RlYnVnX2NsdXN0ZXJpbmcsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWxheSwgc2NzaV9kZWJ1Z19kZWxheSwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CiBtb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3NpemVfbWIsIHNjc2lfZGVidWdfZGV2X3NpemVfbWIsIGludCwgU19JUlVHTyk7CiBtb2R1bGVfcGFyYW1fbmFtZWQoZGlmLCBzY3NpX2RlYnVnX2RpZiwgaW50LCBTX0lSVUdPKTsKQEAgLTI3ODcsNiArMjgwNyw3IEBACiAKIE1PRFVMRV9QQVJNX0RFU0MoYWRkX2hvc3QsICIwLi4xMjcgaG9zdHMgYWxsb3dlZChkZWY9MSkiKTsKIE1PRFVMRV9QQVJNX0RFU0MoYXRvLCAiYXBwbGljYXRpb24gdGFnIG93bmVyc2hpcDogMD1kaXNrIDE9aG9zdCAoZGVmPTEpIik7CitNT0RVTEVfUEFSTV9ERVNDKGNsdXN0ZXJpbmcsICJ3aGVuIHNldCBlbmFibGVzIGxhcmdlciB0cmFuc2ZlcnMgKGRlZj0wKSIpOwogTU9EVUxFX1BBUk1fREVTQyhkZWxheSwgIiMgb2YgamlmZmllcyB0byBkZWxheSByZXNwb25zZShkZWY9MSkiKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGV2X3NpemVfbWIsICJzaXplIGluIE1CIG9mIHJhbSBzaGFyZWQgYnkgZGV2cyhkZWY9OCkiKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGlmLCAiZGF0YSBpbnRlZ3JpdHkgZmllbGQgdHlwZTogMC0zIChkZWY9MCkiKTsKQEAgLTMyNDgsNyArMzI2OSw3IEBACiB9OwogQVRUUklCVVRFX0dST1VQUyhzZGVidWdfZHJ2KTsKIAotc3RydWN0IGRldmljZSAqcHNldWRvX3ByaW1hcnk7CitzdGF0aWMgc3RydWN0IGRldmljZSAqcHNldWRvX3ByaW1hcnk7CiAKIHN0YXRpYyBpbnQgX19pbml0IHNjc2lfZGVidWdfaW5pdCh2b2lkKQogewpAQCAtMzkzNCw2ICszOTU1LDggQEAKIAlzZGJnX2hvc3QgPSB0b19zZGVidWdfaG9zdChkZXYpOwogCiAJc2RlYnVnX2RyaXZlcl90ZW1wbGF0ZS5jYW5fcXVldWUgPSBzY3NpX2RlYnVnX21heF9xdWV1ZTsKKwlpZiAoc2NzaV9kZWJ1Z19jbHVzdGVyaW5nKQorCQlzZGVidWdfZHJpdmVyX3RlbXBsYXRlLnVzZV9jbHVzdGVyaW5nID0gRU5BQkxFX0NMVVNURVJJTkc7CiAJaHBudCA9IHNjc2lfaG9zdF9hbGxvYygmc2RlYnVnX2RyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKHNkYmdfaG9zdCkpOwogCWlmIChOVUxMID09IGhwbnQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogc2NzaV9yZWdpc3RlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCmluZGV4IDc4YjAwNGQuLjc3MWMxNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwpAQCAtMjI4OCw2ICsyMjg4LDExIEBACiAJaWYgKHNjc2lfYXV0b3BtX2dldF9ob3N0KHNob3N0KSA8IDApCiAJCXJldHVybiBGQUlMRUQ7CiAKKwlpZiAoIWdldF9kZXZpY2UoJmRldi0+c2Rldl9nZW5kZXYpKSB7CisJCXJ0biA9IEZBSUxFRDsKKwkJZ290byBvdXRfcHV0X2F1dG9wbV9ob3N0OworCX0KKwogCXNjbWQgPSBzY3NpX2dldF9jb21tYW5kKGRldiwgR0ZQX0tFUk5FTCk7CiAJYmxrX3JxX2luaXQoTlVMTCwgJnJlcSk7CiAJc2NtZC0+cmVxdWVzdCA9ICZyZXE7CkBAIC0yMzQ1LDYgKzIzNTAsNyBAQAogCXNjc2lfcnVuX2hvc3RfcXVldWVzKHNob3N0KTsKIAogCXNjc2lfbmV4dF9jb21tYW5kKHNjbWQpOworb3V0X3B1dF9hdXRvcG1faG9zdDoKIAlzY3NpX2F1dG9wbV9wdXRfaG9zdChzaG9zdCk7CiAJcmV0dXJuIHJ0bjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKaW5kZXggNjJlYzg0Yi4uNTY4MWMwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKQEAgLTc1LDI4ICs3NSw2IEBACiAgKi8KICNkZWZpbmUgU0NTSV9RVUVVRV9ERUxBWQkzCiAKLS8qCi0gKiBGdW5jdGlvbjoJc2NzaV91bnByZXBfcmVxdWVzdCgpCi0gKgotICogUHVycG9zZToJUmVtb3ZlIGFsbCBwcmVwYXJhdGlvbiBkb25lIGZvciBhIHJlcXVlc3QsIGluY2x1ZGluZyBpdHMKLSAqCQlhc3NvY2lhdGVkIHNjc2lfY21uZCwgc28gdGhhdCBpdCBjYW4gYmUgcmVxdWV1ZWQuCi0gKgotICogQXJndW1lbnRzOglyZXEJLSByZXF1ZXN0IHRvIHVucHJlcGFyZQotICoKLSAqIExvY2sgc3RhdHVzOglBc3N1bWVkIHRoYXQgbm8gbG9ja3MgYXJlIGhlbGQgdXBvbiBlbnRyeS4KLSAqCi0gKiBSZXR1cm5zOglOb3RoaW5nLgotICovCi1zdGF0aWMgdm9pZCBzY3NpX3VucHJlcF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpyZXEpCi17Ci0Jc3RydWN0IHNjc2lfY21uZCAqY21kID0gcmVxLT5zcGVjaWFsOwotCi0JYmxrX3VucHJlcF9yZXF1ZXN0KHJlcSk7Ci0JcmVxLT5zcGVjaWFsID0gTlVMTDsKLQotCXNjc2lfcHV0X2NvbW1hbmQoY21kKTsKLX0KLQogLyoqCiAgKiBfX3Njc2lfcXVldWVfaW5zZXJ0IC0gcHJpdmF0ZSBxdWV1ZSBpbnNlcnRpb24KICAqIEBjbWQ6IFRoZSBTQ1NJIGNvbW1hbmQgYmVpbmcgcmVxdWV1ZWQKQEAgLTM4NSwyOSArMzYzLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBGdW5jdGlvbjoJc2NzaV9ydW5fcXVldWUoKQotICoKLSAqIFB1cnBvc2U6CVNlbGVjdCBhIHByb3BlciByZXF1ZXN0IHF1ZXVlIHRvIHNlcnZlIG5leHQKLSAqCi0gKiBBcmd1bWVudHM6CXEJLSBsYXN0IHJlcXVlc3QncyBxdWV1ZQotICoKLSAqIFJldHVybnM6ICAgICBOb3RoaW5nCi0gKgotICogTm90ZXM6CVRoZSBwcmV2aW91cyBjb21tYW5kIHdhcyBjb21wbGV0ZWx5IGZpbmlzaGVkLCBzdGFydAotICoJCWEgbmV3IG9uZSBpZiBwb3NzaWJsZS4KLSAqLwotc3RhdGljIHZvaWQgc2NzaV9ydW5fcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCitzdGF0aWMgdm9pZCBzY3NpX3N0YXJ2ZWRfbGlzdF9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7Ci0Jc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gcS0+cXVldWVkYXRhOwotCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OwogCUxJU1RfSEVBRChzdGFydmVkX2xpc3QpOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc2hvc3QgPSBzZGV2LT5ob3N0OwotCWlmIChzY3NpX3RhcmdldChzZGV2KS0+c2luZ2xlX2x1bikKLQkJc2NzaV9zaW5nbGVfbHVuX3J1bihzZGV2KTsKLQogCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAlsaXN0X3NwbGljZV9pbml0KCZzaG9zdC0+c3RhcnZlZF9saXN0LCAmc3RhcnZlZF9saXN0KTsKIApAQCAtNDU5LDYgKzQyMCwyOCBAQAogCS8qIHB1dCBhbnkgdW5wcm9jZXNzZWQgZW50cmllcyBiYWNrICovCiAJbGlzdF9zcGxpY2UoJnN0YXJ2ZWRfbGlzdCwgJnNob3N0LT5zdGFydmVkX2xpc3QpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogRnVuY3Rpb246ICAgc2NzaV9ydW5fcXVldWUoKQorICoKKyAqIFB1cnBvc2U6ICAgIFNlbGVjdCBhIHByb3BlciByZXF1ZXN0IHF1ZXVlIHRvIHNlcnZlIG5leHQKKyAqCisgKiBBcmd1bWVudHM6ICBxICAgICAgIC0gbGFzdCByZXF1ZXN0J3MgcXVldWUKKyAqCisgKiBSZXR1cm5zOiAgICAgTm90aGluZworICoKKyAqIE5vdGVzOiAgICAgIFRoZSBwcmV2aW91cyBjb21tYW5kIHdhcyBjb21wbGV0ZWx5IGZpbmlzaGVkLCBzdGFydAorICogICAgICAgICAgICAgYSBuZXcgb25lIGlmIHBvc3NpYmxlLgorICovCitzdGF0aWMgdm9pZCBzY3NpX3J1bl9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBxLT5xdWV1ZWRhdGE7CisKKwlpZiAoc2NzaV90YXJnZXQoc2RldiktPnNpbmdsZV9sdW4pCisJCXNjc2lfc2luZ2xlX2x1bl9ydW4oc2Rldik7CisJaWYgKCFsaXN0X2VtcHR5KCZzZGV2LT5ob3N0LT5zdGFydmVkX2xpc3QpKQorCQlzY3NpX3N0YXJ2ZWRfbGlzdF9ydW4oc2Rldi0+aG9zdCk7CiAKIAlibGtfcnVuX3F1ZXVlKHEpOwogfQpAQCAtNDk3LDE2ICs0ODAsMTAgQEAKIAlzdHJ1Y3QgcmVxdWVzdCAqcmVxID0gY21kLT5yZXF1ZXN0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkvKgotCSAqIFdlIG5lZWQgdG8gaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgZGV2aWNlIHRvIGF2b2lkIHRoZSBxdWV1ZSBiZWluZwotCSAqIGtpbGxlZCBhZnRlciB0aGUgdW5sb2NrIGFuZCBiZWZvcmUgc2NzaV9ydW5fcXVldWUgaXMgaW52b2tlZCB3aGljaAotCSAqIG1heSBoYXBwZW4gYmVjYXVzZSBzY3NpX3VucHJlcF9yZXF1ZXN0KCkgcHV0cyB0aGUgY29tbWFuZCB3aGljaAotCSAqIHJlbGVhc2VzIGl0cyByZWZlcmVuY2Ugb24gdGhlIGRldmljZS4KLQkgKi8KLQlnZXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0Jc2NzaV91bnByZXBfcmVxdWVzdChyZXEpOworCWJsa191bnByZXBfcmVxdWVzdChyZXEpOworCXJlcS0+c3BlY2lhbCA9IE5VTEw7CisJc2NzaV9wdXRfY29tbWFuZChjbWQpOwogCWJsa19yZXF1ZXVlX3JlcXVlc3QocSwgcmVxKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIApAQCAtNTIwLDEzICs0OTcsOSBAQAogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IGNtZC0+ZGV2aWNlOwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gc2Rldi0+cmVxdWVzdF9xdWV1ZTsKIAotCS8qIG5lZWQgdG8gaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgZGV2aWNlIGJlZm9yZSB3ZSBsZXQgZ28gb2YgdGhlIGNtZCAqLwotCWdldF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKLQogCXNjc2lfcHV0X2NvbW1hbmQoY21kKTsKIAlzY3NpX3J1bl9xdWV1ZShxKTsKIAotCS8qIG9rIHRvIHJlbW92ZSBkZXZpY2Ugbm93ICovCiAJcHV0X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOwogfQogCkBAIC03ODgsNiArNzYxLDcgQEAKIAllbnVtIHtBQ1RJT05fRkFJTCwgQUNUSU9OX1JFUFJFUCwgQUNUSU9OX1JFVFJZLAogCSAgICAgIEFDVElPTl9ERUxBWUVEX1JFVFJZfSBhY3Rpb247CiAJY2hhciAqZGVzY3JpcHRpb24gPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgd2FpdF9mb3IgPSAoY21kLT5hbGxvd2VkICsgMSkgKiByZXEtPnRpbWVvdXQ7CiAKIAlpZiAocmVzdWx0KSB7CiAJCXNlbnNlX3ZhbGlkID0gc2NzaV9jb21tYW5kX25vcm1hbGl6ZV9zZW5zZShjbWQsICZzc2hkcik7CkBAIC05ODksNiArOTYzLDEyIEBACiAJCWFjdGlvbiA9IEFDVElPTl9GQUlMOwogCX0KIAorCWlmIChhY3Rpb24gIT0gQUNUSU9OX0ZBSUwgJiYKKwkgICAgdGltZV9iZWZvcmUoY21kLT5qaWZmaWVzX2F0X2FsbG9jICsgd2FpdF9mb3IsIGppZmZpZXMpKSB7CisJCWFjdGlvbiA9IEFDVElPTl9GQUlMOworCQlkZXNjcmlwdGlvbiA9ICJDb21tYW5kIHRpbWVkIG91dCI7CisJfQorCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIEFDVElPTl9GQUlMOgogCQkvKiBHaXZlIHVwIGFuZCBmYWlsIHRoZSByZW1haW5kZXIgb2YgdGhlIHJlcXVlc3QgKi8KQEAgLTExMTEsNiArMTA5MSw3IEBACiAJc2NzaV9yZWxlYXNlX2J1ZmZlcnMoY21kKTsKIAljbWQtPnJlcXVlc3QtPnNwZWNpYWwgPSBOVUxMOwogCXNjc2lfcHV0X2NvbW1hbmQoY21kKTsKKwlwdXRfZGV2aWNlKCZjbWQtPmRldmljZS0+c2Rldl9nZW5kZXYpOwogCXJldHVybiBlcnJvcjsKIH0KIEVYUE9SVF9TWU1CT0woc2NzaV9pbml0X2lvKTsKQEAgLTExMjEsOSArMTEwMiwxNSBAQAogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKIAogCWlmICghcmVxLT5zcGVjaWFsKSB7Ci0JCWNtZCA9IHNjc2lfZ2V0X2NvbW1hbmQoc2RldiwgR0ZQX0FUT01JQyk7Ci0JCWlmICh1bmxpa2VseSghY21kKSkKKwkJLyogQmFpbCBpZiB3ZSBjYW4ndCBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGRldmljZSAqLworCQlpZiAoIWdldF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KSkKIAkJCXJldHVybiBOVUxMOworCisJCWNtZCA9IHNjc2lfZ2V0X2NvbW1hbmQoc2RldiwgR0ZQX0FUT01JQyk7CisJCWlmICh1bmxpa2VseSghY21kKSkgeworCQkJcHV0X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KIAkJcmVxLT5zcGVjaWFsID0gY21kOwogCX0gZWxzZSB7CiAJCWNtZCA9IHJlcS0+c3BlY2lhbDsKQEAgLTEyODYsNiArMTI3Myw3IEBACiAJCQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSByZXEtPnNwZWNpYWw7CiAJCQlzY3NpX3JlbGVhc2VfYnVmZmVycyhjbWQpOwogCQkJc2NzaV9wdXRfY29tbWFuZChjbWQpOworCQkJcHV0X2RldmljZSgmY21kLT5kZXZpY2UtPnNkZXZfZ2VuZGV2KTsKIAkJCXJlcS0+c3BlY2lhbCA9IE5VTEw7CiAJCX0KIAkJYnJlYWs7CkBAIC0xNTQzLDE2ICsxNTMxLDE0IEBACiAgKiBMb2NrIHN0YXR1czogSU8gcmVxdWVzdCBsb2NrIGFzc3VtZWQgdG8gYmUgaGVsZCB3aGVuIGNhbGxlZC4KICAqLwogc3RhdGljIHZvaWQgc2NzaV9yZXF1ZXN0X2ZuKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQorCV9fcmVsZWFzZXMocS0+cXVldWVfbG9jaykKKwlfX2FjcXVpcmVzKHEtPnF1ZXVlX2xvY2spCiB7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gcS0+cXVldWVkYXRhOwogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OwogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKIAlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwogCi0JaWYoIWdldF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KSkKLQkJLyogV2UgbXVzdCBiZSB0ZWFyaW5nIHRoZSBibG9jayBxdWV1ZSBkb3duIGFscmVhZHkgKi8KLQkJcmV0dXJuOwotCiAJLyoKIAkgKiBUbyBzdGFydCB3aXRoLCB3ZSBrZWVwIGxvb3BpbmcgdW50aWwgdGhlIHF1ZXVlIGlzIGVtcHR5LCBvciB1bnRpbAogCSAqIHRoZSBob3N0IGlzIG5vIGxvbmdlciBhYmxlIHRvIGFjY2VwdCBhbnkgbW9yZSByZXF1ZXN0cy4KQEAgLTE2NDEsNyArMTYyNyw3IEBACiAJCQlnb3RvIG91dF9kZWxheTsKIAl9CiAKLQlnb3RvIG91dDsKKwlyZXR1cm47CiAKICBub3RfcmVhZHk6CiAJc3Bpbl91bmxvY2tfaXJxKHNob3N0LT5ob3N0X2xvY2spOwpAQCAtMTY2MCwxMiArMTY0Niw2IEBACiBvdXRfZGVsYXk6CiAJaWYgKHNkZXYtPmRldmljZV9idXN5ID09IDApCiAJCWJsa19kZWxheV9xdWV1ZShxLCBTQ1NJX1FVRVVFX0RFTEFZKTsKLW91dDoKLQkvKiBtdXN0IGJlIGNhcmVmdWwgaGVyZS4uLmlmIHdlIHRyaWdnZXIgdGhlIC0+cmVtb3ZlKCkgZnVuY3Rpb24KLQkgKiB3ZSBjYW5ub3QgYmUgaG9sZGluZyB0aGUgcSBsb2NrICovCi0Jc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwotCXB1dF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKLQlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogfQogCiB1NjQgc2NzaV9jYWxjdWxhdGVfYm91bmNlX2xpbWl0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCmluZGV4IDMwN2E4MTEuLjI3Zjk2ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKQEAgLTMyMCw2ICszMjAsNyBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KGRldi0+cGFyZW50KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJc3RhcmdldC0+c3RhdGUgPSBTVEFSR0VUX0RFTDsKIAl0cmFuc3BvcnRfZGVzdHJveV9kZXZpY2UoZGV2KTsKIAlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJaWYgKHNob3N0LT5ob3N0dC0+dGFyZ2V0X2Rlc3Ryb3kpCkBAIC0zNzEsNiArMzcyLDM3IEBACiB9CiAKIC8qKgorICogc2NzaV90YXJnZXRfcmVhcF9yZWZfcmVsZWFzZSAtIHJlbW92ZSB0YXJnZXQgZnJvbSB2aXNpYmlsaXR5CisgKiBAa3JlZjogdGhlIHJlYXBfcmVmIGluIHRoZSB0YXJnZXQgYmVpbmcgcmVsZWFzZWQKKyAqCisgKiBDYWxsZWQgb24gbGFzdCBwdXQgb2YgcmVhcF9yZWYsIHdoaWNoIGlzIHRoZSBpbmRpY2F0aW9uIHRoYXQgbm8gZGV2aWNlCisgKiB1bmRlciB0aGlzIHRhcmdldCBpcyB2aXNpYmxlIGFueW1vcmUsIHNvIHJlbmRlciB0aGUgdGFyZ2V0IGludmlzaWJsZSBpbgorICogc3lzZnMuICBOb3RlOiB3ZSBoYXZlIHRvIGJlIGluIHVzZXIgY29udGV4dCBoZXJlIGJlY2F1c2UgdGhlIHRhcmdldCByZWFwcworICogc2hvdWxkIGJlIGRvbmUgaW4gcGxhY2VzIHdoZXJlIHRoZSBzY3NpIGRldmljZSB2aXNpYmlsaXR5IGlzIGJlaW5nIHJlbW92ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHNjc2lfdGFyZ2V0X3JlYXBfcmVmX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0CisJCT0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBzY3NpX3RhcmdldCwgcmVhcF9yZWYpOworCisJLyoKKwkgKiBpZiB3ZSBnZXQgaGVyZSBhbmQgdGhlIHRhcmdldCBpcyBzdGlsbCBpbiB0aGUgQ1JFQVRFRCBzdGF0ZSB0aGF0CisJICogbWVhbnMgaXQgd2FzIGFsbG9jYXRlZCBidXQgbmV2ZXIgbWFkZSB2aXNpYmxlIChiZWNhdXNlIGEgc2NhbgorCSAqIHR1cm5lZCB1cCBubyBMVU5zKSwgc28gZG9uJ3QgY2FsbCBkZXZpY2VfZGVsKCkgb24gaXQuCisJICovCisJaWYgKHN0YXJnZXQtPnN0YXRlICE9IFNUQVJHRVRfQ1JFQVRFRCkgeworCQl0cmFuc3BvcnRfcmVtb3ZlX2RldmljZSgmc3RhcmdldC0+ZGV2KTsKKwkJZGV2aWNlX2RlbCgmc3RhcmdldC0+ZGV2KTsKKwl9CisJc2NzaV90YXJnZXRfZGVzdHJveShzdGFyZ2V0KTsKK30KKworc3RhdGljIHZvaWQgc2NzaV90YXJnZXRfcmVhcF9yZWZfcHV0KHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKK3sKKwlrcmVmX3B1dCgmc3RhcmdldC0+cmVhcF9yZWYsIHNjc2lfdGFyZ2V0X3JlYXBfcmVmX3JlbGVhc2UpOworfQorCisvKioKICAqIHNjc2lfYWxsb2NfdGFyZ2V0IC0gYWxsb2NhdGUgYSBuZXcgb3IgZmluZCBhbiBleGlzdGluZyB0YXJnZXQKICAqIEBwYXJlbnQ6CXBhcmVudCBvZiB0aGUgdGFyZ2V0IChuZWVkIG5vdCBiZSBhIHNjc2kgaG9zdCkKICAqIEBjaGFubmVsOgl0YXJnZXQgY2hhbm5lbCBudW1iZXIgKHplcm8gaWYgbm8gY2hhbm5lbHMpCkBAIC0zOTIsNyArNDI0LDcgQEAKIAkJKyBzaG9zdC0+dHJhbnNwb3J0dC0+dGFyZ2V0X3NpemU7CiAJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0OwogCXN0cnVjdCBzY3NpX3RhcmdldCAqZm91bmRfdGFyZ2V0OwotCWludCBlcnJvcjsKKwlpbnQgZXJyb3IsIHJlZl9nb3Q7CiAKIAlzdGFyZ2V0ID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXN0YXJnZXQpIHsKQEAgLTQwMSw3ICs0MzMsNyBAQAogCX0KIAlkZXYgPSAmc3RhcmdldC0+ZGV2OwogCWRldmljZV9pbml0aWFsaXplKGRldik7Ci0Jc3RhcmdldC0+cmVhcF9yZWYgPSAxOworCWtyZWZfaW5pdCgmc3RhcmdldC0+cmVhcF9yZWYpOwogCWRldi0+cGFyZW50ID0gZ2V0X2RldmljZShwYXJlbnQpOwogCWRldl9zZXRfbmFtZShkZXYsICJ0YXJnZXQlZDolZDolZCIsIHNob3N0LT5ob3N0X25vLCBjaGFubmVsLCBpZCk7CiAJZGV2LT5idXMgPSAmc2NzaV9idXNfdHlwZTsKQEAgLTQ0MSwyOSArNDczLDM2IEBACiAJcmV0dXJuIHN0YXJnZXQ7CiAKICBmb3VuZDoKLQlmb3VuZF90YXJnZXQtPnJlYXBfcmVmKys7CisJLyoKKwkgKiByZWxlYXNlIHJvdXRpbmUgYWxyZWFkeSBmaXJlZCBpZiBrcmVmIGlzIHplcm8sIHNvIGlmIHdlIGNhbiBzdGlsbAorCSAqIHRha2UgdGhlIHJlZmVyZW5jZSwgdGhlIHRhcmdldCBtdXN0IGJlIGFsaXZlLiAgSWYgd2UgY2FuJ3QsIGl0IG11c3QKKwkgKiBiZSBkeWluZyBhbmQgd2UgbmVlZCB0byB3YWl0IGZvciBhIG5ldyB0YXJnZXQKKwkgKi8KKwlyZWZfZ290ID0ga3JlZl9nZXRfdW5sZXNzX3plcm8oJmZvdW5kX3RhcmdldC0+cmVhcF9yZWYpOworCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JaWYgKGZvdW5kX3RhcmdldC0+c3RhdGUgIT0gU1RBUkdFVF9ERUwpIHsKKwlpZiAocmVmX2dvdCkgewogCQlwdXRfZGV2aWNlKGRldik7CiAJCXJldHVybiBmb3VuZF90YXJnZXQ7CiAJfQotCS8qIFVuZm9ydHVuYXRlbHksIHdlIGZvdW5kIGEgZHlpbmcgdGFyZ2V0OyBuZWVkIHRvCi0JICogd2FpdCB1bnRpbCBpdCdzIGRlYWQgYmVmb3JlIHdlIGNhbiBnZXQgYSBuZXcgb25lICovCisJLyoKKwkgKiBVbmZvcnR1bmF0ZWx5LCB3ZSBmb3VuZCBhIGR5aW5nIHRhcmdldDsgbmVlZCB0byB3YWl0IHVudGlsIGl0J3MKKwkgKiBkZWFkIGJlZm9yZSB3ZSBjYW4gZ2V0IGEgbmV3IG9uZS4gIFRoZXJlIGlzIGFuIGFub21hbHkgaGVyZS4gIFdlCisJICogKnNob3VsZCogY2FsbCBzY3NpX3RhcmdldF9yZWFwKCkgdG8gYmFsYW5jZSB0aGUga3JlZl9nZXQoKSBvZiB0aGUKKwkgKiByZWFwX3JlZiBhYm92ZS4gIEhvd2V2ZXIsIHNpbmNlIHRoZSB0YXJnZXQgYmVpbmcgcmVsZWFzZWQsIGl0J3MKKwkgKiBhbHJlYWR5IGludmlzaWJsZSBhbmQgdGhlIHJlYXBfcmVmIGlzIGlycmVsZXZhbnQuICBJZiB3ZSBjYWxsCisJICogc2NzaV90YXJnZXRfcmVhcCgpIHdlIG1pZ2h0IHNwdXJpb3VzbHkgZG8gYW5vdGhlciBkZXZpY2VfZGVsKCkgb24KKwkgKiBhbiBhbHJlYWR5IGludmlzaWJsZSB0YXJnZXQuCisJICovCiAJcHV0X2RldmljZSgmZm91bmRfdGFyZ2V0LT5kZXYpOwotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJLyoKKwkgKiBsZW5ndGggb2YgdGltZSBpcyBpcnJlbGV2YW50IGhlcmUsIHdlIGp1c3Qgd2FudCB0byB5aWVsZCB0aGUgQ1BVCisJICogZm9yIGEgdGljayB0byBhdm9pZCBidXN5IHdhaXRpbmcgZm9yIHRoZSB0YXJnZXQgdG8gZGllLgorCSAqLworCW1zbGVlcCgxKTsKIAlnb3RvIHJldHJ5OwogfQogCi1zdGF0aWMgdm9pZCBzY3NpX3RhcmdldF9yZWFwX3VzZXJjb250ZXh0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNjc2lfdGFyZ2V0LCBldy53b3JrKTsKLQotCXRyYW5zcG9ydF9yZW1vdmVfZGV2aWNlKCZzdGFyZ2V0LT5kZXYpOwotCWRldmljZV9kZWwoJnN0YXJnZXQtPmRldik7Ci0Jc2NzaV90YXJnZXRfZGVzdHJveShzdGFyZ2V0KTsKLX0KLQogLyoqCiAgKiBzY3NpX3RhcmdldF9yZWFwIC0gY2hlY2sgdG8gc2VlIGlmIHRhcmdldCBpcyBpbiB1c2UgYW5kIGRlc3Ryb3kgaWYgbm90CiAgKiBAc3RhcmdldDogdGFyZ2V0IHRvIGJlIGNoZWNrZWQKQEAgLTQ3NCwyOCArNTEzLDEzIEBACiAgKi8KIHZvaWQgc2NzaV90YXJnZXRfcmVhcChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQpCiB7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQllbnVtIHNjc2lfdGFyZ2V0X3N0YXRlIHN0YXRlOwotCWludCBlbXB0eSA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0Jc3RhdGUgPSBzdGFyZ2V0LT5zdGF0ZTsKLQlpZiAoLS1zdGFyZ2V0LT5yZWFwX3JlZiA9PSAwICYmIGxpc3RfZW1wdHkoJnN0YXJnZXQtPmRldmljZXMpKSB7Ci0JCWVtcHR5ID0gMTsKLQkJc3RhcmdldC0+c3RhdGUgPSBTVEFSR0VUX0RFTDsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIWVtcHR5KQotCQlyZXR1cm47Ci0KLQlCVUdfT04oc3RhdGUgPT0gU1RBUkdFVF9ERUwpOwotCWlmIChzdGF0ZSA9PSBTVEFSR0VUX0NSRUFURUQpCi0JCXNjc2lfdGFyZ2V0X2Rlc3Ryb3koc3RhcmdldCk7Ci0JZWxzZQotCQlleGVjdXRlX2luX3Byb2Nlc3NfY29udGV4dChzY3NpX3RhcmdldF9yZWFwX3VzZXJjb250ZXh0LAotCQkJCQkgICAmc3RhcmdldC0+ZXcpOworCS8qCisJICogc2VyaW91cyBwcm9ibGVtIGlmIHRoaXMgdHJpZ2dlcnM6IFNUQVJHRVRfREVMIGlzIG9ubHkgc2V0IGluIHRoZSBpZgorCSAqIHRoZSByZWFwX3JlZiBkcm9wcyB0byB6ZXJvLCBzbyB3ZSdyZSB0cnlpbmcgdG8gZG8gYW5vdGhlciBmaW5hbCBwdXQKKwkgKiBvbiBhbiBhbHJlYWR5IHJlbGVhc2VkIGtyZWYKKwkgKi8KKwlCVUdfT04oc3RhcmdldC0+c3RhdGUgPT0gU1RBUkdFVF9ERUwpOworCXNjc2lfdGFyZ2V0X3JlYXBfcmVmX3B1dChzdGFyZ2V0KTsKIH0KIAogLyoqCkBAIC05NDYsNiArOTcwLDkgQEAKIAkJfQogCX0KIAorCWlmIChzZGV2LT5zY3NpX2xldmVsID49IFNDU0lfMykKKwkJc2NzaV9hdHRhY2hfdnBkKHNkZXYpOworCiAJc2Rldi0+bWF4X3F1ZXVlX2RlcHRoID0gc2Rldi0+cXVldWVfZGVwdGg7CiAKIAkvKgpAQCAtMTUzMiw2ICsxNTU5LDEwIEBACiAJfQogCW11dGV4X3VubG9jaygmc2hvc3QtPnNjYW5fbXV0ZXgpOwogCXNjc2lfYXV0b3BtX3B1dF90YXJnZXQoc3RhcmdldCk7CisJLyoKKwkgKiBwYWlyZWQgd2l0aCBzY3NpX2FsbG9jX3RhcmdldCgpLiAgVGFyZ2V0IHdpbGwgYmUgZGVzdHJveWVkIHVubGVzcworCSAqIHNjc2lfcHJvYmVfYW5kX2FkZF9sdW4gbWFkZSBhbiB1bmRlcmx5aW5nIGRldmljZSB2aXNpYmxlCisJICovCiAJc2NzaV90YXJnZXRfcmVhcChzdGFyZ2V0KTsKIAlwdXRfZGV2aWNlKCZzdGFyZ2V0LT5kZXYpOwogCkBAIC0xNjEyLDggKzE2NDMsMTAgQEAKIAogIG91dF9yZWFwOgogCXNjc2lfYXV0b3BtX3B1dF90YXJnZXQoc3RhcmdldCk7Ci0JLyogbm93IGRldGVybWluZSBpZiB0aGUgdGFyZ2V0IGhhcyBhbnkgY2hpbGRyZW4gYXQgYWxsCi0JICogYW5kIGlmIG5vdCwgbnVrZSBpdCAqLworCS8qCisJICogcGFpcmVkIHdpdGggc2NzaV9hbGxvY190YXJnZXQoKTogZGV0ZXJtaW5lIGlmIHRoZSB0YXJnZXQgaGFzCisJICogYW55IGNoaWxkcmVuIGF0IGFsbCBhbmQgaWYgbm90LCBudWtlIGl0CisJICovCiAJc2NzaV90YXJnZXRfcmVhcChzdGFyZ2V0KTsKIAogCXB1dF9kZXZpY2UoJnN0YXJnZXQtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jIGIvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYwppbmRleCA5MTE3ZDBiLi4wNzRlOGNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKQEAgLTMwMCw3ICszMDAsOSBAQAogCWludCByZXQgPSAtRUlOVkFMOwogCXVuc2lnbmVkIGxvbmcgZGVhZGxpbmUsIGZsYWdzOwogCi0JaWYgKHNob3N0LT50cmFuc3BvcnR0ICYmIHNob3N0LT50cmFuc3BvcnR0LT5laF9zdHJhdGVneV9oYW5kbGVyKQorCWlmIChzaG9zdC0+dHJhbnNwb3J0dCAmJgorCSAgICAoc2hvc3QtPnRyYW5zcG9ydHQtPmVoX3N0cmF0ZWd5X2hhbmRsZXIgfHwKKwkgICAgICFzaG9zdC0+aG9zdHQtPmVoX2hvc3RfcmVzZXRfaGFuZGxlcikpCiAJCXJldHVybiByZXQ7CiAKIAlpZiAoIXN0cm5jbXAoYnVmLCAib2ZmIiwgc3RybGVuKCJvZmYiKSkpCkBAIC0zODMsMTcgKzM4NSwxNCBAQAogewogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKIAlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7Ci0Jc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0OwogCXN0cnVjdCBsaXN0X2hlYWQgKnRoaXMsICp0bXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNkZXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHNjc2lfZGV2aWNlLCBldy53b3JrKTsKIAogCXBhcmVudCA9IHNkZXYtPnNkZXZfZ2VuZGV2LnBhcmVudDsKLQlzdGFyZ2V0ID0gdG9fc2NzaV90YXJnZXQocGFyZW50KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKHNkZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCXN0YXJnZXQtPnJlYXBfcmVmKys7CiAJbGlzdF9kZWwoJnNkZXYtPnNpYmxpbmdzKTsKIAlsaXN0X2RlbCgmc2Rldi0+c2FtZV90YXJnZXRfc2libGluZ3MpOwogCWxpc3RfZGVsKCZzZGV2LT5zdGFydmVkX2VudHJ5KTsKQEAgLTQxMyw4ICs0MTIsOCBAQAogCS8qIE5VTEwgcXVldWUgbWVhbnMgdGhlIGRldmljZSBjYW4ndCBiZSB1c2VkICovCiAJc2Rldi0+cmVxdWVzdF9xdWV1ZSA9IE5VTEw7CiAKLQlzY3NpX3RhcmdldF9yZWFwKHNjc2lfdGFyZ2V0KHNkZXYpKTsKLQorCWtmcmVlKHNkZXYtPnZwZF9wZzgzKTsKKwlrZnJlZShzZGV2LT52cGRfcGc4MCk7CiAJa2ZyZWUoc2Rldi0+aW5xdWlyeSk7CiAJa2ZyZWUoc2Rldik7CiAKQEAgLTU3OSw3ICs1NzgsNiBAQAogICogQ3JlYXRlIHRoZSBhY3R1YWwgc2hvdy9zdG9yZSBmdW5jdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcy4KICAqLwogc2Rldl9yZF9hdHRyIChkZXZpY2VfYmxvY2tlZCwgIiVkXG4iKTsKLXNkZXZfcmRfYXR0ciAocXVldWVfZGVwdGgsICIlZFxuIik7CiBzZGV2X3JkX2F0dHIgKGRldmljZV9idXN5LCAiJWRcbiIpOwogc2Rldl9yZF9hdHRyICh0eXBlLCAiJWRcbiIpOwogc2Rldl9yZF9hdHRyIChzY3NpX2xldmVsLCAiJWRcbiIpOwpAQCAtNjQ5LDIzICs2NDcsMTIgQEAKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUihyZXNjYW4sIFNfSVdVU1IsIE5VTEwsIHN0b3JlX3Jlc2Nhbl9maWVsZCk7CiAKLXN0YXRpYyB2b2lkIHNkZXZfc3RvcmVfZGVsZXRlX2NhbGxiYWNrKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzY3NpX3JlbW92ZV9kZXZpY2UodG9fc2NzaV9kZXZpY2UoZGV2KSk7Ci19Ci0KIHN0YXRpYyBzc2l6ZV90CiBzZGV2X3N0b3JlX2RlbGV0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCWludCByYzsKLQotCS8qIEFuIGF0dHJpYnV0ZSBjYW5ub3QgYmUgdW5yZWdpc3RlcmVkIGJ5IG9uZSBvZiBpdHMgb3duIG1ldGhvZHMsCi0JICogc28gd2UgaGF2ZSB0byB1c2UgdGhpcyByb3VuZGFib3V0IGFwcHJvYWNoLgotCSAqLwotCXJjID0gZGV2aWNlX3NjaGVkdWxlX2NhbGxiYWNrKGRldiwgc2Rldl9zdG9yZV9kZWxldGVfY2FsbGJhY2spOwotCWlmIChyYykKLQkJY291bnQgPSByYzsKKwlpZiAoZGV2aWNlX3JlbW92ZV9maWxlX3NlbGYoZGV2LCBhdHRyKSkKKwkJc2NzaV9yZW1vdmVfZGV2aWNlKHRvX3Njc2lfZGV2aWNlKGRldikpOwogCXJldHVybiBjb3VudDsKIH07CiBzdGF0aWMgREVWSUNFX0FUVFIoZGVsZXRlLCBTX0lXVVNSLCBOVUxMLCBzZGV2X3N0b3JlX2RlbGV0ZSk7CkBAIC03MjMsMTAgKzcxMCw2NCBAQAogCXJldHVybiBzbnByaW50ZihidWYsIDIwLCAiJXNcbiIsIG5hbWUpOwogfQogCi1zdGF0aWMgREVWSUNFX0FUVFIocXVldWVfdHlwZSwgU19JUlVHTywgc2hvd19xdWV1ZV90eXBlX2ZpZWxkLCBOVUxMKTsKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9xdWV1ZV90eXBlX2ZpZWxkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOworCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCA9IHNkZXYtPmhvc3QtPmhvc3R0OworCWludCB0YWdfdHlwZSA9IDAsIHJldHZhbDsKKwlpbnQgcHJldl90YWdfdHlwZSA9IHNjc2lfZ2V0X3RhZ190eXBlKHNkZXYpOworCisJaWYgKCFzZGV2LT50YWdnZWRfc3VwcG9ydGVkIHx8ICFzaHQtPmNoYW5nZV9xdWV1ZV90eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzdHJuY21wKGJ1ZiwgIm9yZGVyZWQiLCA3KSA9PSAwKQorCQl0YWdfdHlwZSA9IE1TR19PUkRFUkVEX1RBRzsKKwllbHNlIGlmIChzdHJuY21wKGJ1ZiwgInNpbXBsZSIsIDYpID09IDApCisJCXRhZ190eXBlID0gTVNHX1NJTVBMRV9UQUc7CisJZWxzZSBpZiAoc3RybmNtcChidWYsICJub25lIiwgNCkgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGFnX3R5cGUgPT0gcHJldl90YWdfdHlwZSkKKwkJcmV0dXJuIGNvdW50OworCisJcmV0dmFsID0gc2h0LT5jaGFuZ2VfcXVldWVfdHlwZShzZGV2LCB0YWdfdHlwZSk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihxdWV1ZV90eXBlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19xdWV1ZV90eXBlX2ZpZWxkLAorCQkgICBzdG9yZV9xdWV1ZV90eXBlX2ZpZWxkKTsKKworI2RlZmluZSBzZGV2X3ZwZF9wZ19hdHRyKF9wYWdlKQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCVwKK3Nob3dfdnBkXyMjX3BhZ2Uoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAlcCisJCSBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCQkJXAorCQkgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CVwKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOwkJCVwKKwlpZiAoIXNkZXYtPnZwZF8jI19wYWdlKQkJCQkJCVwKKwkJcmV0dXJuIC1FSU5WQUw7CQkJCQkJXAorCXJldHVybiBtZW1vcnlfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCAmb2ZmLAkJXAorCQkJCSAgICAgICBzZGV2LT52cGRfIyNfcGFnZSwJCVwKKwkJCQkgICAgICAgc2Rldi0+dnBkXyMjX3BhZ2UjI19sZW4pOwlcCit9CQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGRldl9hdHRyX3ZwZF8jI19wYWdlID0gewkJXAorCS5hdHRyID0Jey5uYW1lID0gX19zdHJpbmdpZnkodnBkXyMjX3BhZ2UpLCAubW9kZSA9IFNfSVJVR08gfSwJXAorCS5zaXplID0gMCwJCQkJCQkJXAorCS5yZWFkID0gc2hvd192cGRfIyNfcGFnZSwJCQkJCVwKK307CisKK3NkZXZfdnBkX3BnX2F0dHIocGc4Myk7CitzZGV2X3ZwZF9wZ19hdHRyKHBnODApOwogCiBzdGF0aWMgc3NpemVfdAotc2hvd19pb3N0YXRfY291bnRlcmJpdHMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgCQkJCWNoYXIgKmJ1ZikKK3Nob3dfaW9zdGF0X2NvdW50ZXJiaXRzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCiB7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICIlZFxuIiwgKGludClzaXplb2YoYXRvbWljX3QpICogOCk7CiB9CkBAIC03OTcsNDYgKzgzOCw5IEBACiBERUNMQVJFX0VWVChtb2RlX3BhcmFtZXRlcl9jaGFuZ2VfcmVwb3J0ZWQsIE1PREVfUEFSQU1FVEVSX0NIQU5HRV9SRVBPUlRFRCkKIERFQ0xBUkVfRVZUKGx1bl9jaGFuZ2VfcmVwb3J0ZWQsIExVTl9DSEFOR0VfUkVQT1JURUQpCiAKLS8qIERlZmF1bHQgdGVtcGxhdGUgZm9yIGRldmljZSBhdHRyaWJ1dGVzLiAgTWF5IE5PVCBiZSBtb2RpZmllZCAqLwotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnNjc2lfc2Rldl9hdHRyc1tdID0gewotCSZkZXZfYXR0cl9kZXZpY2VfYmxvY2tlZC5hdHRyLAotCSZkZXZfYXR0cl90eXBlLmF0dHIsCi0JJmRldl9hdHRyX3Njc2lfbGV2ZWwuYXR0ciwKLQkmZGV2X2F0dHJfZGV2aWNlX2J1c3kuYXR0ciwKLQkmZGV2X2F0dHJfdmVuZG9yLmF0dHIsCi0JJmRldl9hdHRyX21vZGVsLmF0dHIsCi0JJmRldl9hdHRyX3Jldi5hdHRyLAotCSZkZXZfYXR0cl9yZXNjYW4uYXR0ciwKLQkmZGV2X2F0dHJfZGVsZXRlLmF0dHIsCi0JJmRldl9hdHRyX3N0YXRlLmF0dHIsCi0JJmRldl9hdHRyX3RpbWVvdXQuYXR0ciwKLQkmZGV2X2F0dHJfZWhfdGltZW91dC5hdHRyLAotCSZkZXZfYXR0cl9pb2NvdW50ZXJiaXRzLmF0dHIsCi0JJmRldl9hdHRyX2lvcmVxdWVzdF9jbnQuYXR0ciwKLQkmZGV2X2F0dHJfaW9kb25lX2NudC5hdHRyLAotCSZkZXZfYXR0cl9pb2Vycl9jbnQuYXR0ciwKLQkmZGV2X2F0dHJfbW9kYWxpYXMuYXR0ciwKLQlSRUZfRVZUKG1lZGlhX2NoYW5nZSksCi0JUkVGX0VWVChpbnF1aXJ5X2NoYW5nZV9yZXBvcnRlZCksCi0JUkVGX0VWVChjYXBhY2l0eV9jaGFuZ2VfcmVwb3J0ZWQpLAotCVJFRl9FVlQoc29mdF90aHJlc2hvbGRfcmVhY2hlZCksCi0JUkVGX0VWVChtb2RlX3BhcmFtZXRlcl9jaGFuZ2VfcmVwb3J0ZWQpLAotCVJFRl9FVlQobHVuX2NoYW5nZV9yZXBvcnRlZCksCi0JTlVMTAotfTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgc2NzaV9zZGV2X2F0dHJfZ3JvdXAgPSB7Ci0JLmF0dHJzID0Jc2NzaV9zZGV2X2F0dHJzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKnNjc2lfc2Rldl9hdHRyX2dyb3Vwc1tdID0gewotCSZzY3NpX3NkZXZfYXR0cl9ncm91cCwKLQlOVUxMCi19OwotCiBzdGF0aWMgc3NpemVfdAotc2Rldl9zdG9yZV9xdWV1ZV9kZXB0aF9ydyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3NkZXZfc3RvcmVfcXVldWVfZGVwdGgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCWludCBkZXB0aCwgcmV0dmFsOwogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CkBAIC04NTksMTAgKzg2MywxMCBAQAogCiAJcmV0dXJuIGNvdW50OwogfQorc2Rldl9zaG93X2Z1bmN0aW9uKHF1ZXVlX2RlcHRoLCAiJWRcbiIpOwogCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgc2Rldl9hdHRyX3F1ZXVlX2RlcHRoX3J3ID0KLQlfX0FUVFIocXVldWVfZGVwdGgsIFNfSVJVR08gfCBTX0lXVVNSLCBzZGV2X3Nob3dfcXVldWVfZGVwdGgsCi0JICAgICAgIHNkZXZfc3RvcmVfcXVldWVfZGVwdGhfcncpOworc3RhdGljIERFVklDRV9BVFRSKHF1ZXVlX2RlcHRoLCBTX0lSVUdPIHwgU19JV1VTUiwgc2Rldl9zaG93X3F1ZXVlX2RlcHRoLAorCQkgICBzZGV2X3N0b3JlX3F1ZXVlX2RlcHRoKTsKIAogc3RhdGljIHNzaXplX3QKIHNkZXZfc2hvd19xdWV1ZV9yYW1wX3VwX3BlcmlvZChzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC04OTAsNDAgKzg5NCw3OSBAQAogCXJldHVybiBwZXJpb2Q7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBzZGV2X2F0dHJfcXVldWVfcmFtcF91cF9wZXJpb2QgPQotCV9fQVRUUihxdWV1ZV9yYW1wX3VwX3BlcmlvZCwgU19JUlVHTyB8IFNfSVdVU1IsCi0JICAgICAgIHNkZXZfc2hvd19xdWV1ZV9yYW1wX3VwX3BlcmlvZCwKLQkgICAgICAgc2Rldl9zdG9yZV9xdWV1ZV9yYW1wX3VwX3BlcmlvZCk7CitzdGF0aWMgREVWSUNFX0FUVFIocXVldWVfcmFtcF91cF9wZXJpb2QsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBzZGV2X3Nob3dfcXVldWVfcmFtcF91cF9wZXJpb2QsCisJCSAgIHNkZXZfc3RvcmVfcXVldWVfcmFtcF91cF9wZXJpb2QpOwogCi1zdGF0aWMgc3NpemVfdAotc2Rldl9zdG9yZV9xdWV1ZV90eXBlX3J3KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgdW1vZGVfdCBzY3NpX3NkZXZfYXR0cl9pc192aXNpYmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQkgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgaW50IGkpCiB7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOwogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7Ci0Jc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0ID0gc2Rldi0+aG9zdC0+aG9zdHQ7Ci0JaW50IHRhZ190eXBlID0gMCwgcmV0dmFsOwotCWludCBwcmV2X3RhZ190eXBlID0gc2NzaV9nZXRfdGFnX3R5cGUoc2Rldik7CiAKLQlpZiAoIXNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQgfHwgIXNodC0+Y2hhbmdlX3F1ZXVlX3R5cGUpCi0JCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHN0cm5jbXAoYnVmLCAib3JkZXJlZCIsIDcpID09IDApCi0JCXRhZ190eXBlID0gTVNHX09SREVSRURfVEFHOwotCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCAic2ltcGxlIiwgNikgPT0gMCkKLQkJdGFnX3R5cGUgPSBNU0dfU0lNUExFX1RBRzsKLQllbHNlIGlmIChzdHJuY21wKGJ1ZiwgIm5vbmUiLCA0KSAhPSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoYXR0ciA9PSAmZGV2X2F0dHJfcXVldWVfZGVwdGguYXR0ciAmJgorCSAgICAhc2Rldi0+aG9zdC0+aG9zdHQtPmNoYW5nZV9xdWV1ZV9kZXB0aCkKKwkJcmV0dXJuIFNfSVJVR087CiAKLQlpZiAodGFnX3R5cGUgPT0gcHJldl90YWdfdHlwZSkKLQkJcmV0dXJuIGNvdW50OworCWlmIChhdHRyID09ICZkZXZfYXR0cl9xdWV1ZV9yYW1wX3VwX3BlcmlvZC5hdHRyICYmCisJICAgICFzZGV2LT5ob3N0LT5ob3N0dC0+Y2hhbmdlX3F1ZXVlX2RlcHRoKQorCQlyZXR1cm4gMDsKIAotCXJldHZhbCA9IHNodC0+Y2hhbmdlX3F1ZXVlX3R5cGUoc2RldiwgdGFnX3R5cGUpOwotCWlmIChyZXR2YWwgPCAwKQotCQlyZXR1cm4gcmV0dmFsOworCWlmIChhdHRyID09ICZkZXZfYXR0cl9xdWV1ZV90eXBlLmF0dHIgJiYKKwkgICAgIXNkZXYtPmhvc3QtPmhvc3R0LT5jaGFuZ2VfcXVldWVfdHlwZSkKKwkJcmV0dXJuIFNfSVJVR087CiAKLQlyZXR1cm4gY291bnQ7CisJcmV0dXJuIGF0dHItPm1vZGU7CiB9CiAKKy8qIERlZmF1bHQgdGVtcGxhdGUgZm9yIGRldmljZSBhdHRyaWJ1dGVzLiAgTWF5IE5PVCBiZSBtb2RpZmllZCAqLworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnNjc2lfc2Rldl9hdHRyc1tdID0geworCSZkZXZfYXR0cl9kZXZpY2VfYmxvY2tlZC5hdHRyLAorCSZkZXZfYXR0cl90eXBlLmF0dHIsCisJJmRldl9hdHRyX3Njc2lfbGV2ZWwuYXR0ciwKKwkmZGV2X2F0dHJfZGV2aWNlX2J1c3kuYXR0ciwKKwkmZGV2X2F0dHJfdmVuZG9yLmF0dHIsCisJJmRldl9hdHRyX21vZGVsLmF0dHIsCisJJmRldl9hdHRyX3Jldi5hdHRyLAorCSZkZXZfYXR0cl9yZXNjYW4uYXR0ciwKKwkmZGV2X2F0dHJfZGVsZXRlLmF0dHIsCisJJmRldl9hdHRyX3N0YXRlLmF0dHIsCisJJmRldl9hdHRyX3RpbWVvdXQuYXR0ciwKKwkmZGV2X2F0dHJfZWhfdGltZW91dC5hdHRyLAorCSZkZXZfYXR0cl9pb2NvdW50ZXJiaXRzLmF0dHIsCisJJmRldl9hdHRyX2lvcmVxdWVzdF9jbnQuYXR0ciwKKwkmZGV2X2F0dHJfaW9kb25lX2NudC5hdHRyLAorCSZkZXZfYXR0cl9pb2Vycl9jbnQuYXR0ciwKKwkmZGV2X2F0dHJfbW9kYWxpYXMuYXR0ciwKKwkmZGV2X2F0dHJfcXVldWVfZGVwdGguYXR0ciwKKwkmZGV2X2F0dHJfcXVldWVfdHlwZS5hdHRyLAorCSZkZXZfYXR0cl9xdWV1ZV9yYW1wX3VwX3BlcmlvZC5hdHRyLAorCVJFRl9FVlQobWVkaWFfY2hhbmdlKSwKKwlSRUZfRVZUKGlucXVpcnlfY2hhbmdlX3JlcG9ydGVkKSwKKwlSRUZfRVZUKGNhcGFjaXR5X2NoYW5nZV9yZXBvcnRlZCksCisJUkVGX0VWVChzb2Z0X3RocmVzaG9sZF9yZWFjaGVkKSwKKwlSRUZfRVZUKG1vZGVfcGFyYW1ldGVyX2NoYW5nZV9yZXBvcnRlZCksCisJUkVGX0VWVChsdW5fY2hhbmdlX3JlcG9ydGVkKSwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKnNjc2lfc2Rldl9iaW5fYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfdnBkX3BnODMsCisJJmRldl9hdHRyX3ZwZF9wZzgwLAorCU5VTEwKK307CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBzY3NpX3NkZXZfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPQlzY3NpX3NkZXZfYXR0cnMsCisJLmJpbl9hdHRycyA9CXNjc2lfc2Rldl9iaW5fYXR0cnMsCisJLmlzX3Zpc2libGUgPQlzY3NpX3NkZXZfYXR0cl9pc192aXNpYmxlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKnNjc2lfc2Rldl9hdHRyX2dyb3Vwc1tdID0geworCSZzY3NpX3NkZXZfYXR0cl9ncm91cCwKKwlOVUxMCit9OworCiBzdGF0aWMgaW50IHNjc2lfdGFyZ2V0X2FkZChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQpCiB7CiAJaW50IGVycm9yOwpAQCAtOTQ2LDEwICs5ODksNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgc2Rldl9hdHRyX3F1ZXVlX3R5cGVfcncgPQotCV9fQVRUUihxdWV1ZV90eXBlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19xdWV1ZV90eXBlX2ZpZWxkLAotCSAgICAgICBzZGV2X3N0b3JlX3F1ZXVlX3R5cGVfcncpOwotCiAvKioKICAqIHNjc2lfc3lzZnNfYWRkX3NkZXYgLSBhZGQgc2NzaSBkZXZpY2UgdG8gc3lzZnMKICAqIEBzZGV2OglzY3NpX2RldmljZSB0byBhZGQKQEAgLTEwMDMsMjUgKzEwNDIsNiBAQAogCXRyYW5zcG9ydF9hZGRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CiAJc2Rldi0+aXNfdmlzaWJsZSA9IDE7CiAKLQkvKiBjcmVhdGUgcXVldWUgZmlsZXMsIHdoaWNoIG1heSBiZSB3cml0YWJsZSwgZGVwZW5kaW5nIG9uIHRoZSBob3N0ICovCi0JaWYgKHNkZXYtPmhvc3QtPmhvc3R0LT5jaGFuZ2VfcXVldWVfZGVwdGgpIHsKLQkJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNkZXYtPnNkZXZfZ2VuZGV2LAotCQkJCQkgICAmc2Rldl9hdHRyX3F1ZXVlX2RlcHRoX3J3KTsKLQkJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNkZXYtPnNkZXZfZ2VuZGV2LAotCQkJCQkgICAmc2Rldl9hdHRyX3F1ZXVlX3JhbXBfdXBfcGVyaW9kKTsKLQl9Ci0JZWxzZQotCQllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmc2Rldi0+c2Rldl9nZW5kZXYsICZkZXZfYXR0cl9xdWV1ZV9kZXB0aCk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQlpZiAoc2Rldi0+aG9zdC0+aG9zdHQtPmNoYW5nZV9xdWV1ZV90eXBlKQotCQllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmc2Rldi0+c2Rldl9nZW5kZXYsICZzZGV2X2F0dHJfcXVldWVfdHlwZV9ydyk7Ci0JZWxzZQotCQllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmc2Rldi0+c2Rldl9nZW5kZXYsICZkZXZfYXR0cl9xdWV1ZV90eXBlKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQogCWVycm9yID0gYnNnX3JlZ2lzdGVyX3F1ZXVlKHJxLCAmc2Rldi0+c2Rldl9nZW5kZXYsIE5VTEwsIE5VTEwpOwogCiAJaWYgKGVycm9yKQpAQCAtMTA3MSw2ICsxMDkxLDEzIEBACiAJCXNkZXYtPmhvc3QtPmhvc3R0LT5zbGF2ZV9kZXN0cm95KHNkZXYpOwogCXRyYW5zcG9ydF9kZXN0cm95X2RldmljZShkZXYpOwogCisJLyoKKwkgKiBQYWlyZWQgd2l0aCB0aGUga3JlZl9nZXQoKSBpbiBzY3NpX3N5c2ZzX2luaXRpYWxpemUoKS4gIFdlIGhhdmUKKwkgKiByZW1vZWQgc3lzZnMgdmlzaWJpbGl0eSBmcm9tIHRoZSBkZXZpY2UsIHNvIG1ha2UgdGhlIHRhcmdldAorCSAqIGludmlzaWJsZSBpZiB0aGlzIHdhcyB0aGUgbGFzdCBkZXZpY2UgdW5kZXJuZWF0aCBpdC4KKwkgKi8KKwlzY3NpX3RhcmdldF9yZWFwKHNjc2lfdGFyZ2V0KHNkZXYpKTsKKwogCXB1dF9kZXZpY2UoZGV2KTsKIH0KIApAQCAtMTEzMyw3ICsxMTYwLDcgQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAoc3RhcmdldC0+ZGV2LnBhcmVudCA9PSBkZXYgfHwgJnN0YXJnZXQtPmRldiA9PSBkZXYpIHsKIAkJCS8qIGFzc3VtaW5nIG5ldyB0YXJnZXRzIGFycml2ZSBhdCB0aGUgZW5kICovCi0JCQlzdGFyZ2V0LT5yZWFwX3JlZisrOworCQkJa3JlZl9nZXQoJnN0YXJnZXQtPnJlYXBfcmVmKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCQkJaWYgKGxhc3QpCiAJCQkJc2NzaV90YXJnZXRfcmVhcChsYXN0KTsKQEAgLTEyMTcsNiArMTI0NCwxMiBAQAogCWxpc3RfYWRkX3RhaWwoJnNkZXYtPnNhbWVfdGFyZ2V0X3NpYmxpbmdzLCAmc3RhcmdldC0+ZGV2aWNlcyk7CiAJbGlzdF9hZGRfdGFpbCgmc2Rldi0+c2libGluZ3MsICZzaG9zdC0+X19kZXZpY2VzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIGRldmljZSBjYW4gbm93IG9ubHkgYmUgcmVtb3ZlZCB2aWEgX19zY3NpX3JlbW92ZV9kZXZpY2UoKSBzbyBob2xkCisJICogdGhlIHRhcmdldC4gIFRhcmdldCB3aWxsIGJlIGhlbGQgaW4gQ1JFQVRFRCBzdGF0ZSB1bnRpbCBzb21ldGhpbmcKKwkgKiBiZW5lYXRoIGl0IGJlY29tZXMgdmlzaWJsZSAoaW4gd2hpY2ggY2FzZSBpdCBtb3ZlcyB0byBSVU5OSU5HKQorCSAqLworCWtyZWZfZ2V0KCZzdGFyZ2V0LT5yZWFwX3JlZik7CiB9CiAKIGludCBzY3NpX2lzX3NkZXZfZGV2aWNlKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RndF9saWIuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RndF9saWIuYwppbmRleCA4NGExZmRmLi5lNTFhZGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90Z3RfbGliLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdGd0X2xpYi5jCkBAIC0xNTUsNyArMTU1LDggQEAKIAlfX2Jsa19wdXRfcmVxdWVzdChxLCBycSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAKLQlfX3Njc2lfcHV0X2NvbW1hbmQoc2hvc3QsIGNtZCwgJnNob3N0LT5zaG9zdF9nZW5kZXYpOworCV9fc2NzaV9wdXRfY29tbWFuZChzaG9zdCwgY21kKTsKKwlwdXRfZGV2aWNlKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNjc2lfaG9zdF9wdXRfY29tbWFuZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMKaW5kZXggNDYyOGZkNS4uZjgwOTA4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMKQEAgLTI2MSw2ICsyNjEsNyBAQAogCXsgRkNfUE9SVFNQRUVEXzEwR0JJVCwJCSIxMCBHYml0IiB9LAogCXsgRkNfUE9SVFNQRUVEXzhHQklULAkJIjggR2JpdCIgfSwKIAl7IEZDX1BPUlRTUEVFRF8xNkdCSVQsCQkiMTYgR2JpdCIgfSwKKwl7IEZDX1BPUlRTUEVFRF8zMkdCSVQsCQkiMzIgR2JpdCIgfSwKIAl7IEZDX1BPUlRTUEVFRF9OT1RfTkVHT1RJQVRFRCwJIk5vdCBOZWdvdGlhdGVkIiB9LAogfTsKIGZjX2JpdGZpZWxkX25hbWVfc2VhcmNoKHBvcnRfc3BlZWQsIGZjX3BvcnRfc3BlZWRfbmFtZXMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2QuYyBiL2RyaXZlcnMvc2NzaS9zZC5jCmluZGV4IDQ3MDk1NGEuLjg5ZTZjMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zZC5jCkBAIC0xNDYzLDggKzE0NjMsOCBAQAogCQkJc2RfcHJpbnRfc2Vuc2VfaGRyKHNka3AsICZzc2hkcik7CiAJCS8qIHdlIG5lZWQgdG8gZXZhbHVhdGUgdGhlIGVycm9yIHJldHVybiAgKi8KIAkJaWYgKHNjc2lfc2Vuc2VfdmFsaWQoJnNzaGRyKSAmJgotCQkJLyogMHgzYSBpcyBtZWRpdW0gbm90IHByZXNlbnQgKi8KLQkJCXNzaGRyLmFzYyA9PSAweDNhKQorCQkJKHNzaGRyLmFzYyA9PSAweDNhIHx8CS8qIG1lZGl1bSBub3QgcHJlc2VudCAqLworCQkJIHNzaGRyLmFzYyA9PSAweDIwKSkJLyogaW52YWxpZCBjb21tYW5kICovCiAJCQkJLyogdGhpcyBpcyBubyBlcnJvciBoZXJlICovCiAJCQkJcmV0dXJuIDA7CiAKQEAgLTIyODEsNyArMjI4MSw3IEBACiAKIAlzZXRfZGlza19ybyhzZGtwLT5kaXNrLCAwKTsKIAlpZiAoc2RwLT5za2lwX21zX3BhZ2VfM2YpIHsKLQkJc2RfcHJpbnRrKEtFUk5fTk9USUNFLCBzZGtwLCAiQXNzdW1pbmcgV3JpdGUgRW5hYmxlZFxuIik7CisJCXNkX2ZpcnN0X3ByaW50ayhLRVJOX05PVElDRSwgc2RrcCwgIkFzc3VtaW5nIFdyaXRlIEVuYWJsZWRcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yMzEzLDcgKzIzMTMsNyBAQAogCX0KIAogCWlmICghc2NzaV9zdGF0dXNfaXNfZ29vZChyZXMpKSB7Ci0JCXNkX3ByaW50ayhLRVJOX1dBUk5JTkcsIHNka3AsCisJCXNkX2ZpcnN0X3ByaW50ayhLRVJOX1dBUk5JTkcsIHNka3AsCiAJCQkgICJUZXN0IFdQIGZhaWxlZCwgYXNzdW1lIFdyaXRlIEVuYWJsZWRcbiIpOwogCX0gZWxzZSB7CiAJCXNka3AtPndyaXRlX3Byb3QgPSAoKGRhdGEuZGV2aWNlX3NwZWNpZmljICYgMHg4MCkgIT0gMCk7CkBAIC0yMzgxLDcgKzIzODEsOCBAQAogCWlmICghZGF0YS5oZWFkZXJfbGVuZ3RoKSB7CiAJCW1vZGVwYWdlID0gNjsKIAkJZmlyc3RfbGVuID0gMDsKLQkJc2RfcHJpbnRrKEtFUk5fRVJSLCBzZGtwLCAiTWlzc2luZyBoZWFkZXIgaW4gTU9ERV9TRU5TRSByZXNwb25zZVxuIik7CisJCXNkX2ZpcnN0X3ByaW50ayhLRVJOX0VSUiwgc2RrcCwKKwkJCQkiTWlzc2luZyBoZWFkZXIgaW4gTU9ERV9TRU5TRSByZXNwb25zZVxuIik7CiAJfQogCiAJLyogdGhhdCB3ZW50IE9LLCBub3cgYXNrIGZvciB0aGUgcHJvcGVyIGxlbmd0aCAqLwpAQCAtMjM5NCw3ICsyMzk1LDcgQEAKIAlpZiAobGVuIDwgMykKIAkJZ290byBiYWRfc2Vuc2U7CiAJZWxzZSBpZiAobGVuID4gU0RfQlVGX1NJWkUpIHsKLQkJc2RfcHJpbnRrKEtFUk5fTk9USUNFLCBzZGtwLCAiVHJ1bmNhdGluZyBtb2RlIHBhcmFtZXRlciAiCisJCXNkX2ZpcnN0X3ByaW50ayhLRVJOX05PVElDRSwgc2RrcCwgIlRydW5jYXRpbmcgbW9kZSBwYXJhbWV0ZXIgIgogCQkJICAiZGF0YSBmcm9tICVkIHRvICVkIGJ5dGVzXG4iLCBsZW4sIFNEX0JVRl9TSVpFKTsKIAkJbGVuID0gU0RfQlVGX1NJWkU7CiAJfQpAQCAtMjQxNyw4ICsyNDE4LDkgQEAKIAkJCQkvKiBXZSdyZSBpbnRlcmVzdGVkIG9ubHkgaW4gdGhlIGZpcnN0IDMgYnl0ZXMuCiAJCQkJICovCiAJCQkJaWYgKGxlbiAtIG9mZnNldCA8PSAyKSB7Ci0JCQkJCXNkX3ByaW50ayhLRVJOX0VSUiwgc2RrcCwgIkluY29tcGxldGUgIgotCQkJCQkJICAibW9kZSBwYXJhbWV0ZXIgZGF0YVxuIik7CisJCQkJCXNkX2ZpcnN0X3ByaW50ayhLRVJOX0VSUiwgc2RrcCwKKwkJCQkJCSJJbmNvbXBsZXRlIG1vZGUgcGFyYW1ldGVyICIKKwkJCQkJCQkiZGF0YVxuIik7CiAJCQkJCWdvdG8gZGVmYXVsdHM7CiAJCQkJfSBlbHNlIHsKIAkJCQkJbW9kZXBhZ2UgPSBwYWdlX2NvZGU7CkBAIC0yNDMyLDE0ICsyNDM0LDE1IEBACiAJCQkJZWxzZSBpZiAoIXNwZiAmJiBsZW4gLSBvZmZzZXQgPiAxKQogCQkJCQlvZmZzZXQgKz0gMiArIGJ1ZmZlcltvZmZzZXQrMV07CiAJCQkJZWxzZSB7Ci0JCQkJCXNkX3ByaW50ayhLRVJOX0VSUiwgc2RrcCwgIkluY29tcGxldGUgIgotCQkJCQkJICAibW9kZSBwYXJhbWV0ZXIgZGF0YVxuIik7CisJCQkJCXNkX2ZpcnN0X3ByaW50ayhLRVJOX0VSUiwgc2RrcCwKKwkJCQkJCQkiSW5jb21wbGV0ZSBtb2RlICIKKwkJCQkJCQkicGFyYW1ldGVyIGRhdGFcbiIpOwogCQkJCQlnb3RvIGRlZmF1bHRzOwogCQkJCX0KIAkJCX0KIAkJfQogCi0JCXNkX3ByaW50ayhLRVJOX0VSUiwgc2RrcCwgIk5vIENhY2hpbmcgbW9kZSBwYWdlIGZvdW5kXG4iKTsKKwkJc2RfZmlyc3RfcHJpbnRrKEtFUk5fRVJSLCBzZGtwLCAiTm8gQ2FjaGluZyBtb2RlIHBhZ2UgZm91bmRcbiIpOwogCQlnb3RvIGRlZmF1bHRzOwogCiAJUGFnZV9mb3VuZDoKQEAgLTI0NTMsNyArMjQ1Niw3IEBACiAKIAkJc2RrcC0+RFBPRlVBID0gKGRhdGEuZGV2aWNlX3NwZWNpZmljICYgMHgxMCkgIT0gMDsKIAkJaWYgKHNka3AtPkRQT0ZVQSAmJiAhc2RrcC0+ZGV2aWNlLT51c2VfMTBfZm9yX3J3KSB7Ci0JCQlzZF9wcmludGsoS0VSTl9OT1RJQ0UsIHNka3AsCisJCQlzZF9maXJzdF9wcmludGsoS0VSTl9OT1RJQ0UsIHNka3AsCiAJCQkJICAiVXNlcyBSRUFEL1dSSVRFKDYpLCBkaXNhYmxpbmcgRlVBXG4iKTsKIAkJCXNka3AtPkRQT0ZVQSA9IDA7CiAJCX0KQEAgLTI0NzUsMTYgKzI0NzgsMTkgQEAKIAkgICAgc3NoZHIuc2Vuc2Vfa2V5ID09IElMTEVHQUxfUkVRVUVTVCAmJgogCSAgICBzc2hkci5hc2MgPT0gMHgyNCAmJiBzc2hkci5hc2NxID09IDB4MCkKIAkJLyogSW52YWxpZCBmaWVsZCBpbiBDREIgKi8KLQkJc2RfcHJpbnRrKEtFUk5fTk9USUNFLCBzZGtwLCAiQ2FjaGUgZGF0YSB1bmF2YWlsYWJsZVxuIik7CisJCXNkX2ZpcnN0X3ByaW50ayhLRVJOX05PVElDRSwgc2RrcCwgIkNhY2hlIGRhdGEgdW5hdmFpbGFibGVcbiIpOwogCWVsc2UKLQkJc2RfcHJpbnRrKEtFUk5fRVJSLCBzZGtwLCAiQXNraW5nIGZvciBjYWNoZSBkYXRhIGZhaWxlZFxuIik7CisJCXNkX2ZpcnN0X3ByaW50ayhLRVJOX0VSUiwgc2RrcCwKKwkJCQkiQXNraW5nIGZvciBjYWNoZSBkYXRhIGZhaWxlZFxuIik7CiAKIGRlZmF1bHRzOgogCWlmIChzZHAtPndjZV9kZWZhdWx0X29uKSB7Ci0JCXNkX3ByaW50ayhLRVJOX05PVElDRSwgc2RrcCwgIkFzc3VtaW5nIGRyaXZlIGNhY2hlOiB3cml0ZSBiYWNrXG4iKTsKKwkJc2RfZmlyc3RfcHJpbnRrKEtFUk5fTk9USUNFLCBzZGtwLAorCQkJCSJBc3N1bWluZyBkcml2ZSBjYWNoZTogd3JpdGUgYmFja1xuIik7CiAJCXNka3AtPldDRSA9IDE7CiAJfSBlbHNlIHsKLQkJc2RfcHJpbnRrKEtFUk5fRVJSLCBzZGtwLCAiQXNzdW1pbmcgZHJpdmUgY2FjaGU6IHdyaXRlIHRocm91Z2hcbiIpOworCQlzZF9maXJzdF9wcmludGsoS0VSTl9FUlIsIHNka3AsCisJCQkJIkFzc3VtaW5nIGRyaXZlIGNhY2hlOiB3cml0ZSB0aHJvdWdoXG4iKTsKIAkJc2RrcC0+V0NFID0gMDsKIAl9CiAJc2RrcC0+UkNEID0gMDsKQEAgLTI1MTMsNyArMjUxOSw3IEBACiAKIAlpZiAoIXNjc2lfc3RhdHVzX2lzX2dvb2QocmVzKSB8fCAhZGF0YS5oZWFkZXJfbGVuZ3RoIHx8CiAJICAgIGRhdGEubGVuZ3RoIDwgNikgewotCQlzZF9wcmludGsoS0VSTl9XQVJOSU5HLCBzZGtwLAorCQlzZF9maXJzdF9wcmludGsoS0VSTl9XQVJOSU5HLCBzZGtwLAogCQkJICAiZ2V0dGluZyBDb250cm9sIG1vZGUgcGFnZSBmYWlsZWQsIGFzc3VtZSBubyBBVE9cbiIpOwogCiAJCWlmIChzY3NpX3NlbnNlX3ZhbGlkKCZzc2hkcikpCkBAIC0yNTI1LDcgKzI1MzEsNyBAQAogCW9mZnNldCA9IGRhdGEuaGVhZGVyX2xlbmd0aCArIGRhdGEuYmxvY2tfZGVzY3JpcHRvcl9sZW5ndGg7CiAKIAlpZiAoKGJ1ZmZlcltvZmZzZXRdICYgMHgzZikgIT0gMHgwYSkgewotCQlzZF9wcmludGsoS0VSTl9FUlIsIHNka3AsICJBVE8gR290IHdyb25nIHBhZ2VcbiIpOworCQlzZF9maXJzdF9wcmludGsoS0VSTl9FUlIsIHNka3AsICJBVE8gR290IHdyb25nIHBhZ2VcbiIpOwogCQlyZXR1cm47CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2QuaCBiL2RyaXZlcnMvc2NzaS9zZC5oCmluZGV4IDI2ODk1ZmYuLjYyMDg3MWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2QuaAorKysgYi9kcml2ZXJzL3Njc2kvc2QuaApAQCAtMTA0LDYgKzEwNCwxMiBAQAogCQkgICAgKHNkc2spLT5kaXNrLT5kaXNrX25hbWUsICMjYSkgOgkJCVwKIAlzZGV2X3ByaW50ayhwcmVmaXgsIChzZHNrKS0+ZGV2aWNlLCBmbXQsICMjYSkKIAorI2RlZmluZSBzZF9maXJzdF9wcmludGsocHJlZml4LCBzZHNrLCBmbXQsIGEuLi4pCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKChzZGtwKS0+Zmlyc3Rfc2NhbikJCQkJCVwKKwkJCXNkX3ByaW50ayhwcmVmaXgsIHNkc2ssIGZtdCwgIyNhKTsJCVwKKwl9IHdoaWxlICgwKQorCiBzdGF0aWMgaW5saW5lIGludCBzY3NpX21lZGl1bV9hY2Nlc3NfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQogewogCXN3aXRjaCAoc2NtZC0+Y21uZFswXSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Nlcy5jIGIvZHJpdmVycy9zY3NpL3Nlcy5jCmluZGV4IGViYTE4M2MuLjgwYmZlY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zZXMuYworKysgYi9kcml2ZXJzL3Njc2kvc2VzLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lbmNsb3N1cmUuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgpAQCAtNDQ4LDI3ICs0NDksMTggQEAKIHN0YXRpYyB2b2lkIHNlc19tYXRjaF90b19lbmNsb3N1cmUoc3RydWN0IGVuY2xvc3VyZV9kZXZpY2UgKmVkZXYsCiAJCQkJICAgc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewotCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAl1bnNpZ25lZCBjaGFyICpkZXNjOwotCXVuc2lnbmVkIGludCB2cGRfbGVuOwogCXN0cnVjdCBlZmQgZWZkID0gewogCQkuYWRkciA9IDAsCiAJfTsKIAotCWJ1ZiA9IGttYWxsb2MoSU5JVF9BTExPQ19TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZiB8fCBzY3NpX2dldF92cGRfcGFnZShzZGV2LCAweDgzLCBidWYsIElOSVRfQUxMT0NfU0laRSkpCi0JCWdvdG8gZnJlZTsKLQogCXNlc19lbmNsb3N1cmVfZGF0YV9wcm9jZXNzKGVkZXYsIHRvX3Njc2lfZGV2aWNlKGVkZXYtPmVkZXYucGFyZW50KSwgMCk7CiAKLQl2cGRfbGVuID0gKChidWZbMl0gPDwgOCkgfCBidWZbM10pICsgNDsKLQlrZnJlZShidWYpOwotCWJ1ZiA9IGttYWxsb2ModnBkX2xlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYgfHxzY3NpX2dldF92cGRfcGFnZShzZGV2LCAweDgzLCBidWYsIHZwZF9sZW4pKQotCQlnb3RvIGZyZWU7CisJaWYgKCFzZGV2LT52cGRfcGc4M19sZW4pCisJCXJldHVybjsKIAotCWRlc2MgPSBidWYgKyA0OwotCXdoaWxlIChkZXNjIDwgYnVmICsgdnBkX2xlbikgeworCWRlc2MgPSBzZGV2LT52cGRfcGc4MyArIDQ7CisJd2hpbGUgKGRlc2MgPCBzZGV2LT52cGRfcGc4MyArIHNkZXYtPnZwZF9wZzgzX2xlbikgewogCQllbnVtIHNjc2lfcHJvdG9jb2wgcHJvdG8gPSBkZXNjWzBdID4+IDQ7CiAJCXU4IGNvZGVfc2V0ID0gZGVzY1swXSAmIDB4MGY7CiAJCXU4IHBpdiA9IGRlc2NbMV0gJiAweDgwOwpAQCAtNDc4LDI1ICs0NzAsMTUgQEAKIAogCQlpZiAocGl2ICYmIGNvZGVfc2V0ID09IDEgJiYgYXNzb2MgPT0gMQogCQkgICAgJiYgcHJvdG8gPT0gU0NTSV9QUk9UT0NPTF9TQVMgJiYgdHlwZSA9PSAzICYmIGxlbiA9PSA4KQotCQkJZWZkLmFkZHIgPSAodTY0KWRlc2NbNF0gPDwgNTYgfAotCQkJCSh1NjQpZGVzY1s1XSA8PCA0OCB8Ci0JCQkJKHU2NClkZXNjWzZdIDw8IDQwIHwKLQkJCQkodTY0KWRlc2NbN10gPDwgMzIgfAotCQkJCSh1NjQpZGVzY1s4XSA8PCAyNCB8Ci0JCQkJKHU2NClkZXNjWzldIDw8IDE2IHwKLQkJCQkodTY0KWRlc2NbMTBdIDw8IDggfAotCQkJCSh1NjQpZGVzY1sxMV07CisJCQllZmQuYWRkciA9IGdldF91bmFsaWduZWRfYmU2NCgmZGVzY1s0XSk7CiAKIAkJZGVzYyArPSBsZW4gKyA0OwogCX0KLQlpZiAoIWVmZC5hZGRyKQotCQlnb3RvIGZyZWU7CisJaWYgKGVmZC5hZGRyKSB7CisJCWVmZC5kZXYgPSAmc2Rldi0+c2Rldl9nZW5kZXY7CiAKLQllZmQuZGV2ID0gJnNkZXYtPnNkZXZfZ2VuZGV2OwotCi0JZW5jbG9zdXJlX2Zvcl9lYWNoX2RldmljZShzZXNfZW5jbG9zdXJlX2ZpbmRfYnlfYWRkciwgJmVmZCk7Ci0gZnJlZToKLQlrZnJlZShidWYpOworCQllbmNsb3N1cmVfZm9yX2VhY2hfZGV2aWNlKHNlc19lbmNsb3N1cmVfZmluZF9ieV9hZGRyLCAmZWZkKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgc2VzX2ludGZfYWRkKHN0cnVjdCBkZXZpY2UgKmNkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3QuYyBiL2RyaXZlcnMvc2NzaS9zdC5jCmluZGV4IGExZDY5ODYuLmFmYzgzNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdC5jCkBAIC0yMTk4LDEyICsyMTk4LDE5IEBACiAJc3RydWN0IHN0X21vZGVkZWYgKlNUbTsKIAljaGFyICpuYW1lID0gdGFwZV9uYW1lKFNUcCk7CiAJc3RydWN0IGNkZXYgKmNkMCwgKmNkMTsKKwlzdHJ1Y3QgZGV2aWNlICpkMCwgKmQxOwogCiAJU1RtID0gJihTVHAtPm1vZGVzW1NUcC0+Y3VycmVudF9tb2RlXSk7CiAJaWYgKCFTVG0tPmRlZmluZWQpIHsKLQkJY2QwID0gU1RtLT5jZGV2c1swXTsgY2QxID0gU1RtLT5jZGV2c1sxXTsKKwkJY2QwID0gU1RtLT5jZGV2c1swXTsKKwkJY2QxID0gU1RtLT5jZGV2c1sxXTsKKwkJZDAgID0gU1RtLT5kZXZzWzBdOworCQlkMSAgPSBTVG0tPmRldnNbMV07CiAJCW1lbWNweShTVG0sICYoU1RwLT5tb2Rlc1swXSksIHNpemVvZihzdHJ1Y3Qgc3RfbW9kZWRlZikpOwotCQlTVG0tPmNkZXZzWzBdID0gY2QwOyBTVG0tPmNkZXZzWzFdID0gY2QxOworCQlTVG0tPmNkZXZzWzBdID0gY2QwOworCQlTVG0tPmNkZXZzWzFdID0gY2QxOworCQlTVG0tPmRldnNbMF0gID0gZDA7CisJCVNUbS0+ZGV2c1sxXSAgPSBkMTsKIAkJbW9kZXNfZGVmaW5lZCA9IDE7CiAgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogSW5pdGlhbGl6ZWQgbW9kZSAlZCBkZWZpbml0aW9uIGZyb20gbW9kZSAwXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3QxMjguYyBiL2RyaXZlcnMvc2NzaS90MTI4LmMKaW5kZXggZjFlNGI0MS4uYTRhYmNlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3QxMjguYworKysgYi9kcml2ZXJzL3Njc2kvdDEyOC5jCkBAIC0yNTksNyArMjU5LDcgQEAKIAkgICAgaW5zdGFuY2UtPmlycSA9IE5DUjUzODBfcHJvYmVfaXJxKGluc3RhbmNlLCBUMTI4X0lSUVMpOwogCiAJaWYgKGluc3RhbmNlLT5pcnEgIT0gU0NTSV9JUlFfTk9ORSkgCi0JICAgIGlmIChyZXF1ZXN0X2lycShpbnN0YW5jZS0+aXJxLCB0MTI4X2ludHIsIElSUUZfRElTQUJMRUQsICJ0MTI4IiwKKwkgICAgaWYgKHJlcXVlc3RfaXJxKGluc3RhbmNlLT5pcnEsIHQxMjhfaW50ciwgMCwgInQxMjgiLAogCQkJICAgIGluc3RhbmNlKSkgewogCQlwcmludGsoInNjc2klZCA6IElSUSVkIG5vdCBmcmVlLCBpbnRlcnJ1cHRzIGRpc2FibGVkXG4iLCAKIAkJICAgIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+aXJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS91MTQtMzRmLmMgYi9kcml2ZXJzL3Njc2kvdTE0LTM0Zi5jCmluZGV4IDljMjE2ZTUuLjVhMDNiYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS91MTQtMzRmLmMKKysrIGIvZHJpdmVycy9zY3NpL3UxNC0zNGYuYwpAQCAtODczLDcgKzg3Myw3IEBACiAKICAgIC8qIEJvYXJkIGRldGVjdGVkLCBhbGxvY2F0ZSBpdHMgSVJRICovCiAgICBpZiAocmVxdWVzdF9pcnEoaXJxLCBkb19pbnRlcnJ1cHRfaGFuZGxlciwKLSAgICAgICAgICAgICBJUlFGX0RJU0FCTEVEIHwgKChzdWJ2ZXJzaW9uID09IEVTQSkgPyBJUlFGX1NIQVJFRCA6IDApLAorICAgICAgICAgICAgIChzdWJ2ZXJzaW9uID09IEVTQSkgPyBJUlFGX1NIQVJFRCA6IDAsCiAgICAgICAgICAgICAgZHJpdmVyX25hbWUsICh2b2lkICopICZzaGFbal0pKSB7CiAgICAgICBwcmludGsoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgSVJRICV1LCBkZXRhY2hpbmcuXG4iLCBuYW1lLCBpcnEpOwogICAgICAgZ290byBmcmVlbG9jazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS92bXdfcHZzY3NpLmMgYi9kcml2ZXJzL3Njc2kvdm13X3B2c2NzaS5jCmluZGV4IGI5NzU1ZWMuLmM4OGUxNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS92bXdfcHZzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Ztd19wdnNjc2kuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBMaW51eCBkcml2ZXIgZm9yIFZNd2FyZSdzIHBhcmEtdmlydHVhbGl6ZWQgU0NTSSBIQkEuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDksIFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTQsIFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KIAogI2luY2x1ZGUgInZtd19wdnNjc2kuaCIKIApAQCAtNDQsNyArNDUsNyBAQAogCiAjZGVmaW5lIFBWU0NTSV9ERUZBVUxUX05VTV9QQUdFU19QRVJfUklORwk4CiAjZGVmaW5lIFBWU0NTSV9ERUZBVUxUX05VTV9QQUdFU19NU0dfUklORwkxCi0jZGVmaW5lIFBWU0NTSV9ERUZBVUxUX1FVRVVFX0RFUFRICQk2NAorI2RlZmluZSBQVlNDU0lfREVGQVVMVF9RVUVVRV9ERVBUSAkJMjU0CiAjZGVmaW5lIFNHTF9TSVpFCQkJCVBBR0VfU0laRQogCiBzdHJ1Y3QgcHZzY3NpX3NnX2xpc3QgewpAQCAtNjIsNiArNjMsNyBAQAogCWRtYV9hZGRyX3QJCWRhdGFQQTsKIAlkbWFfYWRkcl90CQlzZW5zZVBBOwogCWRtYV9hZGRyX3QJCXNnbFBBOworCXN0cnVjdCBjb21wbGV0aW9uCSphYm9ydF9jbXA7CiB9OwogCiBzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgewpAQCAtNzEsNiArNzMsNyBAQAogCWJvb2wJCQkJdXNlX21zaTsKIAlib29sCQkJCXVzZV9tc2l4OwogCWJvb2wJCQkJdXNlX21zZzsKKwlib29sCQkJCXVzZV9yZXFfdGhyZXNob2xkOwogCiAJc3BpbmxvY2tfdAkJCWh3X2xvY2s7CiAKQEAgLTEwMiwxOCArMTA1LDIyIEBACiAKIAogLyogQ29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgKi8KLXN0YXRpYyBpbnQgcHZzY3NpX3JpbmdfcGFnZXMgICAgID0gUFZTQ1NJX0RFRkFVTFRfTlVNX1BBR0VTX1BFUl9SSU5HOworc3RhdGljIGludCBwdnNjc2lfcmluZ19wYWdlczsKIHN0YXRpYyBpbnQgcHZzY3NpX21zZ19yaW5nX3BhZ2VzID0gUFZTQ1NJX0RFRkFVTFRfTlVNX1BBR0VTX01TR19SSU5HOwogc3RhdGljIGludCBwdnNjc2lfY21kX3Blcl9sdW4gICAgPSBQVlNDU0lfREVGQVVMVF9RVUVVRV9ERVBUSDsKIHN0YXRpYyBib29sIHB2c2NzaV9kaXNhYmxlX21zaTsKIHN0YXRpYyBib29sIHB2c2NzaV9kaXNhYmxlX21zaXg7CiBzdGF0aWMgYm9vbCBwdnNjc2lfdXNlX21zZyAgICAgICA9IHRydWU7CitzdGF0aWMgYm9vbCBwdnNjc2lfdXNlX3JlcV90aHJlc2hvbGQgPSB0cnVlOwogCiAjZGVmaW5lIFBWU0NTSV9SVyAoU19JUlVTUiB8IFNfSVdVU1IpCiAKIG1vZHVsZV9wYXJhbV9uYW1lZChyaW5nX3BhZ2VzLCBwdnNjc2lfcmluZ19wYWdlcywgaW50LCBQVlNDU0lfUlcpOwogTU9EVUxFX1BBUk1fREVTQyhyaW5nX3BhZ2VzLCAiTnVtYmVyIG9mIHBhZ2VzIHBlciByZXEvY21wIHJpbmcgLSAoZGVmYXVsdD0iCi0JCSBfX3N0cmluZ2lmeShQVlNDU0lfREVGQVVMVF9OVU1fUEFHRVNfUEVSX1JJTkcpICIpIik7CisJCSBfX3N0cmluZ2lmeShQVlNDU0lfREVGQVVMVF9OVU1fUEFHRVNfUEVSX1JJTkcpCisJCSAiW3VwIHRvIDE2IHRhcmdldHNdLCIKKwkJIF9fc3RyaW5naWZ5KFBWU0NTSV9TRVRVUF9SSU5HU19NQVhfTlVNX1BBR0VTKQorCQkgIltmb3IgMTYrIHRhcmdldHNdKSIpOwogCiBtb2R1bGVfcGFyYW1fbmFtZWQobXNnX3JpbmdfcGFnZXMsIHB2c2NzaV9tc2dfcmluZ19wYWdlcywgaW50LCBQVlNDU0lfUlcpOwogTU9EVUxFX1BBUk1fREVTQyhtc2dfcmluZ19wYWdlcywgIk51bWJlciBvZiBwYWdlcyBmb3IgdGhlIG1zZyByaW5nIC0gKGRlZmF1bHQ9IgpAQCAtMTIxLDcgKzEyOCw3IEBACiAKIG1vZHVsZV9wYXJhbV9uYW1lZChjbWRfcGVyX2x1biwgcHZzY3NpX2NtZF9wZXJfbHVuLCBpbnQsIFBWU0NTSV9SVyk7CiBNT0RVTEVfUEFSTV9ERVNDKGNtZF9wZXJfbHVuLCAiTWF4aW11bSBjb21tYW5kcyBwZXIgbHVuIC0gKGRlZmF1bHQ9IgotCQkgX19zdHJpbmdpZnkoUFZTQ1NJX01BWF9SRVFfUVVFVUVfREVQVEgpICIpIik7CisJCSBfX3N0cmluZ2lmeShQVlNDU0lfREVGQVVMVF9RVUVVRV9ERVBUSCkgIikiKTsKIAogbW9kdWxlX3BhcmFtX25hbWVkKGRpc2FibGVfbXNpLCBwdnNjc2lfZGlzYWJsZV9tc2ksIGJvb2wsIFBWU0NTSV9SVyk7CiBNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfbXNpLCAiRGlzYWJsZSBNU0kgdXNlIGluIGRyaXZlciAtIChkZWZhdWx0PTApIik7CkBAIC0xMzIsNiArMTM5LDEwIEBACiBtb2R1bGVfcGFyYW1fbmFtZWQodXNlX21zZywgcHZzY3NpX3VzZV9tc2csIGJvb2wsIFBWU0NTSV9SVyk7CiBNT0RVTEVfUEFSTV9ERVNDKHVzZV9tc2csICJVc2UgbXNnIHJpbmcgd2hlbiBhdmFpbGFibGUgLSAoZGVmYXVsdD0xKSIpOwogCittb2R1bGVfcGFyYW1fbmFtZWQodXNlX3JlcV90aHJlc2hvbGQsIHB2c2NzaV91c2VfcmVxX3RocmVzaG9sZCwKKwkJICAgYm9vbCwgUFZTQ1NJX1JXKTsKK01PRFVMRV9QQVJNX0RFU0ModXNlX3JlcV90aHJlc2hvbGQsICJVc2UgZHJpdmVyLWJhc2VkIHJlcXVlc3QgY29hbGVzY2luZyBpZiBjb25maWd1cmVkIC0gKGRlZmF1bHQ9MSkiKTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHB2c2NzaV9wY2lfdGJsW10gPSB7CiAJeyBQQ0lfVkRFVklDRShWTVdBUkUsIFBDSV9ERVZJQ0VfSURfVk1XQVJFX1BWU0NTSSkgfSwKIAl7IDAgfQpAQCAtMTc3LDYgKzE4OCw3IEBACiAJCQkJICAgc3RydWN0IHB2c2NzaV9jdHggKmN0eCkKIHsKIAljdHgtPmNtZCA9IE5VTEw7CisJY3R4LT5hYm9ydF9jbXAgPSBOVUxMOwogCWxpc3RfYWRkKCZjdHgtPmxpc3QsICZhZGFwdGVyLT5jbWRfcG9vbCk7CiB9CiAKQEAgLTI4MCwxMCArMjkyLDE1IEBACiBzdGF0aWMgdm9pZCBwdnNjc2lfa2lja19pbyhjb25zdCBzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkgICB1bnNpZ25lZCBjaGFyIG9wKQogewotCWlmIChzY3NpX2lzX3J3KG9wKSkKLQkJcHZzY3NpX2tpY2tfcndfaW8oYWRhcHRlcik7Ci0JZWxzZQorCWlmIChzY3NpX2lzX3J3KG9wKSkgeworCQlzdHJ1Y3QgUFZTQ1NJUmluZ3NTdGF0ZSAqcyA9IGFkYXB0ZXItPnJpbmdzX3N0YXRlOworCisJCWlmICghYWRhcHRlci0+dXNlX3JlcV90aHJlc2hvbGQgfHwKKwkJICAgIHMtPnJlcVByb2RJZHggLSBzLT5yZXFDb25zSWR4ID49IHMtPnJlcUNhbGxUaHJlc2hvbGQpCisJCQlwdnNjc2lfa2lja19yd19pbyhhZGFwdGVyKTsKKwl9IGVsc2UgewogCQlwdnNjc2lfcHJvY2Vzc19yZXF1ZXN0X3JpbmcoYWRhcHRlcik7CisJfQogfQogCiBzdGF0aWMgdm9pZCBsbF9hZGFwdGVyX3Jlc2V0KGNvbnN0IHN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlcikKQEAgLTQ4Nyw2ICs1MDQsMzUgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgcHZzY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCQkJICAgICBpbnQgcWRlcHRoLAorCQkJCSAgICAgaW50IHJlYXNvbikKK3sKKwlpbnQgbWF4X2RlcHRoOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gc2Rldi0+aG9zdDsKKworCWlmIChyZWFzb24gIT0gU0NTSV9RREVQVEhfREVGQVVMVCkKKwkJLyoKKwkJICogV2Ugc3VwcG9ydCBvbmx5IGNoYW5naW5nIGRlZmF1bHQuCisJCSAqLworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwltYXhfZGVwdGggPSBzaG9zdC0+Y2FuX3F1ZXVlOworCWlmICghc2Rldi0+dGFnZ2VkX3N1cHBvcnRlZCkKKwkJbWF4X2RlcHRoID0gMTsKKwlpZiAocWRlcHRoID4gbWF4X2RlcHRoKQorCQlxZGVwdGggPSBtYXhfZGVwdGg7CisJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2Rldiwgc2NzaV9nZXRfdGFnX3R5cGUoc2RldiksIHFkZXB0aCk7CisKKwlpZiAoc2Rldi0+aW5xdWlyeV9sZW4gPiA3KQorCQlzZGV2X3ByaW50ayhLRVJOX0lORk8sIHNkZXYsCisJCQkgICAgInFkZXB0aCglZCksIHRhZ2dlZCglZCksIHNpbXBsZSglZCksIG9yZGVyZWQoJWQpLCBzY3NpX2xldmVsKCVkKSwgY21kX3F1ZSglZClcbiIsCisJCQkgICAgc2Rldi0+cXVldWVfZGVwdGgsIHNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQsCisJCQkgICAgc2Rldi0+c2ltcGxlX3RhZ3MsIHNkZXYtPm9yZGVyZWRfdGFncywKKwkJCSAgICBzZGV2LT5zY3NpX2xldmVsLCAoc2Rldi0+aW5xdWlyeVs3XSAmIDIpID4+IDEpOworCXJldHVybiBzZGV2LT5xdWV1ZV9kZXB0aDsKK30KKwogLyoKICAqIFB1bGwgYSBjb21wbGV0aW9uIGRlc2NyaXB0b3Igb2ZmIGFuZCBwYXNzIHRoZSBjb21wbGV0aW9uIGJhY2sKICAqIHRvIHRoZSBTQ1NJIG1pZCBsYXllci4KQEAgLTQ5NiwxNSArNTQyLDI3IEBACiB7CiAJc3RydWN0IHB2c2NzaV9jdHggKmN0eDsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJc3RydWN0IGNvbXBsZXRpb24gKmFib3J0X2NtcDsKIAl1MzIgYnRzdGF0ID0gZS0+aG9zdFN0YXR1czsKIAl1MzIgc2RzdGF0ID0gZS0+c2NzaVN0YXR1czsKIAogCWN0eCA9IHB2c2NzaV9nZXRfY29udGV4dChhZGFwdGVyLCBlLT5jb250ZXh0KTsKIAljbWQgPSBjdHgtPmNtZDsKKwlhYm9ydF9jbXAgPSBjdHgtPmFib3J0X2NtcDsKIAlwdnNjc2lfdW5tYXBfYnVmZmVycyhhZGFwdGVyLCBjdHgpOwogCXB2c2NzaV9yZWxlYXNlX2NvbnRleHQoYWRhcHRlciwgY3R4KTsKLQljbWQtPnJlc3VsdCA9IDA7CisJaWYgKGFib3J0X2NtcCkgeworCQkvKgorCQkgKiBUaGUgY29tbWFuZCB3YXMgcmVxdWVzdGVkIHRvIGJlIGFib3J0ZWQuIEp1c3Qgc2lnbmFsIHRoYXQKKwkJICogdGhlIHJlcXVlc3QgY29tcGxldGVkIGFuZCBzd2FsbG93IHRoZSBhY3R1YWwgY21kIGNvbXBsZXRpb24KKwkJICogaGVyZS4gVGhlIGFib3J0IGhhbmRsZXIgd2lsbCBwb3N0IGEgY29tcGxldGlvbiBmb3IgdGhpcworCQkgKiBjb21tYW5kIGluZGljYXRpbmcgdGhhdCBpdCBnb3Qgc3VjY2Vzc2Z1bGx5IGFib3J0ZWQuCisJCSAqLworCQljb21wbGV0ZShhYm9ydF9jbXApOworCQlyZXR1cm47CisJfQogCisJY21kLT5yZXN1bHQgPSAwOwogCWlmIChzZHN0YXQgIT0gU0FNX1NUQVRfR09PRCAmJgogCSAgICAoYnRzdGF0ID09IEJUU1RBVF9TVUNDRVNTIHx8CiAJICAgICBidHN0YXQgPT0gQlRTVEFUX0xJTktFRF9DT01NQU5EX0NPTVBMRVRFRCB8fApAQCAtNzI2LDYgKzc4NCw4IEBACiAJc3RydWN0IHB2c2NzaV9hZGFwdGVyICphZGFwdGVyID0gc2hvc3RfcHJpdihjbWQtPmRldmljZS0+aG9zdCk7CiAJc3RydWN0IHB2c2NzaV9jdHggKmN0eDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXN1bHQgPSBTVUNDRVNTOworCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGFib3J0X2NtcCk7CiAKIAlzY21kX3ByaW50ayhLRVJOX0RFQlVHLCBjbWQsICJ0YXNrIGFib3J0IG9uIGhvc3QgJXUsICVwXG4iLAogCQkgICAgYWRhcHRlci0+aG9zdC0+aG9zdF9ubywgY21kKTsKQEAgLTc0OCwxMyArODA4LDQwIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXB2c2NzaV9hYm9ydF9jbWQoYWRhcHRlciwgY3R4KTsKKwkvKgorCSAqIE1hcmsgdGhhdCB0aGUgY29tbWFuZCBoYXMgYmVlbiByZXF1ZXN0ZWQgdG8gYmUgYWJvcnRlZCBhbmQgaXNzdWUKKwkgKiB0aGUgYWJvcnQuCisJICovCisJY3R4LT5hYm9ydF9jbXAgPSAmYWJvcnRfY21wOwogCi0JcHZzY3NpX3Byb2Nlc3NfY29tcGxldGlvbl9yaW5nKGFkYXB0ZXIpOworCXB2c2NzaV9hYm9ydF9jbWQoYWRhcHRlciwgY3R4KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5od19sb2NrLCBmbGFncyk7CisJLyogV2FpdCBmb3IgMiBzZWNzIGZvciB0aGUgY29tcGxldGlvbi4gKi8KKwl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmFib3J0X2NtcCwgbXNlY3NfdG9famlmZmllcygyMDAwKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmh3X2xvY2ssIGZsYWdzKTsKKworCWlmICghY29tcGxldGlvbl9kb25lKCZhYm9ydF9jbXApKSB7CisJCS8qCisJCSAqIEZhaWxlZCB0byBhYm9ydCB0aGUgY29tbWFuZCwgdW5tYXJrIHRoZSBmYWN0IHRoYXQgaXQKKwkJICogd2FzIHJlcXVlc3RlZCB0byBiZSBhYm9ydGVkLgorCQkgKi8KKwkJY3R4LT5hYm9ydF9jbXAgPSBOVUxMOworCQlyZXN1bHQgPSBGQUlMRUQ7CisJCXNjbWRfcHJpbnRrKEtFUk5fREVCVUcsIGNtZCwKKwkJCSAgICAiRmFpbGVkIHRvIGdldCBjb21wbGV0aW9uIGZvciBhYm9ydGVkIGNtZCAlcFxuIiwKKwkJCSAgICBjbWQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFN1Y2Nlc3NmdWxseSBhYm9ydGVkIHRoZSBjb21tYW5kLgorCSAqLworCWNtZC0+cmVzdWx0ID0gKERJRF9BQk9SVCA8PCAxNik7CisJY21kLT5zY3NpX2RvbmUoY21kKTsKIAogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmh3X2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gU1VDQ0VTUzsKKwlyZXR1cm4gcmVzdWx0OwogfQogCiAvKgpAQCAtOTExLDYgKzk5OCw3IEBACiAJLmRtYV9ib3VuZGFyeQkJCT0gVUlOVF9NQVgsCiAJLm1heF9zZWN0b3JzCQkJPSAweGZmZmYsCiAJLnVzZV9jbHVzdGVyaW5nCQkJPSBFTkFCTEVfQ0xVU1RFUklORywKKwkuY2hhbmdlX3F1ZXVlX2RlcHRoCQk9IHB2c2NzaV9jaGFuZ2VfcXVldWVfZGVwdGgsCiAJLmVoX2Fib3J0X2hhbmRsZXIJCT0gcHZzY3NpX2Fib3J0LAogCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcgk9IHB2c2NzaV9kZXZpY2VfcmVzZXQsCiAJLmVoX2J1c19yZXNldF9oYW5kbGVyCQk9IHB2c2NzaV9idXNfcmVzZXQsCkBAIC0xMDM0LDYgKzExMjIsMzQgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIGJvb2wgcHZzY3NpX3NldHVwX3JlcV90aHJlc2hvbGQoc3RydWN0IHB2c2NzaV9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgICAgIGJvb2wgZW5hYmxlKQoreworCXUzMiB2YWw7CisKKwlpZiAoIXB2c2NzaV91c2VfcmVxX3RocmVzaG9sZCkKKwkJcmV0dXJuIGZhbHNlOworCisJcHZzY3NpX3JlZ193cml0ZShhZGFwdGVyLCBQVlNDU0lfUkVHX09GRlNFVF9DT01NQU5ELAorCQkJIFBWU0NTSV9DTURfU0VUVVBfUkVRQ0FMTFRIUkVTSE9MRCk7CisJdmFsID0gcHZzY3NpX3JlZ19yZWFkKGFkYXB0ZXIsIFBWU0NTSV9SRUdfT0ZGU0VUX0NPTU1BTkRfU1RBVFVTKTsKKwlpZiAodmFsID09IC0xKSB7CisJCXByaW50ayhLRVJOX0lORk8gInZtd19wdnNjc2k6IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHJlcV90aHJlc2hvbGRcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIHsKKwkJc3RydWN0IFBWU0NTSUNtZERlc2NTZXR1cFJlcUNhbGwgY21kX21zZyA9IHsgMCB9OworCQljbWRfbXNnLmVuYWJsZSA9IGVuYWJsZTsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgInZtd19wdnNjc2k6ICVzYWJsaW5nIHJlcUNhbGxUaHJlc2hvbGRcbiIsCisJCQllbmFibGUgPyAiZW4iIDogImRpcyIpOworCQlwdnNjc2lfd3JpdGVfY21kX2Rlc2MoYWRhcHRlciwKKwkJCQkgICAgICBQVlNDU0lfQ01EX1NFVFVQX1JFUUNBTExUSFJFU0hPTEQsCisJCQkJICAgICAgJmNtZF9tc2csIHNpemVvZihjbWRfbXNnKSk7CisJCXJldHVybiBwdnNjc2lfcmVnX3JlYWQoYWRhcHRlciwKKwkJCQkgICAgICAgUFZTQ1NJX1JFR19PRkZTRVRfQ09NTUFORF9TVEFUVVMpICE9IDA7CisJfQorfQorCiBzdGF0aWMgaXJxcmV0dXJuX3QgcHZzY3NpX2lzcihpbnQgaXJxLCB2b2lkICpkZXZwKQogewogCXN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlciA9IGRldnA7CkBAIC0xMjM2LDExICsxMzUyLDEyIEBACiBzdGF0aWMgaW50IHB2c2NzaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlcjsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwotCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgYWRhcHRlcl90ZW1wOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBOVUxMOwogCXVuc2lnbmVkIGludCBpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCWludCBlcnJvcjsKKwl1MzIgbWF4X2lkOwogCiAJZXJyb3IgPSAtRU5PREVWOwogCkBAIC0xMjU4LDM0ICsxMzc1LDE5IEBACiAJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOwogCX0KIAotCXB2c2NzaV90ZW1wbGF0ZS5jYW5fcXVldWUgPQotCQltaW4oUFZTQ1NJX01BWF9OVU1fUEFHRVNfUkVRX1JJTkcsIHB2c2NzaV9yaW5nX3BhZ2VzKSAqCi0JCVBWU0NTSV9NQVhfTlVNX1JFUV9FTlRSSUVTX1BFUl9QQUdFOwotCXB2c2NzaV90ZW1wbGF0ZS5jbWRfcGVyX2x1biA9Ci0JCW1pbihwdnNjc2lfdGVtcGxhdGUuY2FuX3F1ZXVlLCBwdnNjc2lfY21kX3Blcl9sdW4pOwotCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJnB2c2NzaV90ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBwdnNjc2lfYWRhcHRlcikpOwotCWlmICghaG9zdCkgewotCQlwcmludGsoS0VSTl9FUlIgInZtd19wdnNjc2k6IGZhaWxlZCB0byBhbGxvY2F0ZSBob3N0XG4iKTsKLQkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7Ci0JfQotCi0JYWRhcHRlciA9IHNob3N0X3ByaXYoaG9zdCk7CisJLyoKKwkgKiBMZXQncyB1c2UgYSB0ZW1wIHB2c2NzaV9hZGFwdGVyIHN0cnVjdCB1bnRpbCB3ZSBmaW5kIHRoZSBudW1iZXIgb2YKKwkgKiB0YXJnZXRzIG9uIHRoZSBhZGFwdGVyLCBhZnRlciB0aGF0IHdlIHdpbGwgc3dpdGNoIHRvIHRoZSByZWFsCisJICogYWxsb2NhdGVkIHN0cnVjdC4KKwkgKi8KKwlhZGFwdGVyID0gJmFkYXB0ZXJfdGVtcDsKIAltZW1zZXQoYWRhcHRlciwgMCwgc2l6ZW9mKCphZGFwdGVyKSk7CiAJYWRhcHRlci0+ZGV2ICA9IHBkZXY7Ci0JYWRhcHRlci0+aG9zdCA9IGhvc3Q7Ci0KLQlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+aHdfbG9jayk7Ci0KLQlob3N0LT5tYXhfY2hhbm5lbCA9IDA7Ci0JaG9zdC0+bWF4X2lkICAgICAgPSAxNjsKLQlob3N0LT5tYXhfbHVuICAgICA9IDE7Ci0JaG9zdC0+bWF4X2NtZF9sZW4gPSAxNjsKLQogCWFkYXB0ZXItPnJldiA9IHBkZXYtPnJldmlzaW9uOwogCiAJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgInZtd19wdnNjc2kiKSkgewogCQlwcmludGsoS0VSTl9FUlIgInZtd19wdnNjc2k6IHBjaSBtZW1vcnkgc2VsZWN0aW9uIGZhaWxlZFxuIik7Ci0JCWdvdG8gb3V0X2ZyZWVfaG9zdDsKKwkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7CkBAIC0xMzAxLDcgKzE0MDMsNyBAQAogCWlmIChpID09IERFVklDRV9DT1VOVF9SRVNPVVJDRSkgewogCQlwcmludGsoS0VSTl9FUlIKIAkJICAgICAgICJ2bXdfcHZzY3NpOiBhZGFwdGVyIGhhcyBubyBzdWl0YWJsZSBNTUlPIHJlZ2lvblxuIik7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVzb3VyY2VzOworCQlnb3RvIG91dF9yZWxlYXNlX3Jlc291cmNlc19hbmRfZGlzYWJsZTsKIAl9CiAKIAlhZGFwdGVyLT5tbWlvQmFzZSA9IHBjaV9pb21hcChwZGV2LCBpLCBQVlNDU0lfTUVNX1NQQUNFX1NJWkUpOwpAQCAtMTMxMCwxMCArMTQxMiw2MCBAQAogCQlwcmludGsoS0VSTl9FUlIKIAkJICAgICAgICJ2bXdfcHZzY3NpOiBjYW4ndCBpb21hcCBmb3IgQkFSICVkIG1lbXNpemUgJWx1XG4iLAogCQkgICAgICAgaSwgUFZTQ1NJX01FTV9TUEFDRV9TSVpFKTsKLQkJZ290byBvdXRfcmVsZWFzZV9yZXNvdXJjZXM7CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVzb3VyY2VzX2FuZF9kaXNhYmxlOwogCX0KIAogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJLyoKKwkgKiBBc2sgdGhlIGRldmljZSBmb3IgbWF4IG51bWJlciBvZiB0YXJnZXRzIGJlZm9yZSBkZWNpZGluZyB0aGUKKwkgKiBkZWZhdWx0IHB2c2NzaV9yaW5nX3BhZ2VzIHZhbHVlLgorCSAqLworCW1heF9pZCA9IHB2c2NzaV9nZXRfbWF4X3RhcmdldHMoYWRhcHRlcik7CisJcHJpbnRrKEtFUk5fSU5GTyAidm13X3B2c2NzaTogbWF4X2lkOiAldVxuIiwgbWF4X2lkKTsKKworCWlmIChwdnNjc2lfcmluZ19wYWdlcyA9PSAwKQorCQkvKgorCQkgKiBTZXQgdGhlIHJpZ2h0IGRlZmF1bHQgdmFsdWUuIFVwIHRvIDE2IGl0IGlzIDgsIGFib3ZlIGl0IGlzCisJCSAqIG1heC4KKwkJICovCisJCXB2c2NzaV9yaW5nX3BhZ2VzID0gKG1heF9pZCA+IDE2KSA/CisJCQlQVlNDU0lfU0VUVVBfUklOR1NfTUFYX05VTV9QQUdFUyA6CisJCQlQVlNDU0lfREVGQVVMVF9OVU1fUEFHRVNfUEVSX1JJTkc7CisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAidm13X3B2c2NzaTogc2V0dGluZyByaW5nX3BhZ2VzIHRvICVkXG4iLAorCSAgICAgICBwdnNjc2lfcmluZ19wYWdlcyk7CisKKwlwdnNjc2lfdGVtcGxhdGUuY2FuX3F1ZXVlID0KKwkJbWluKFBWU0NTSV9NQVhfTlVNX1BBR0VTX1JFUV9SSU5HLCBwdnNjc2lfcmluZ19wYWdlcykgKgorCQlQVlNDU0lfTUFYX05VTV9SRVFfRU5UUklFU19QRVJfUEFHRTsKKwlwdnNjc2lfdGVtcGxhdGUuY21kX3Blcl9sdW4gPQorCQltaW4ocHZzY3NpX3RlbXBsYXRlLmNhbl9xdWV1ZSwgcHZzY3NpX2NtZF9wZXJfbHVuKTsKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZwdnNjc2lfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIpKTsKKwlpZiAoIWhvc3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2bXdfcHZzY3NpOiBmYWlsZWQgdG8gYWxsb2NhdGUgaG9zdFxuIik7CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVzb3VyY2VzX2FuZF9kaXNhYmxlOworCX0KKworCS8qCisJICogTGV0J3MgdXNlIHRoZSByZWFsIHB2c2NzaV9hZGFwdGVyIHN0cnVjdCBoZXJlIG9ud2FyZHMuCisJICovCisJYWRhcHRlciA9IHNob3N0X3ByaXYoaG9zdCk7CisJbWVtc2V0KGFkYXB0ZXIsIDAsIHNpemVvZigqYWRhcHRlcikpOworCWFkYXB0ZXItPmRldiAgPSBwZGV2OworCWFkYXB0ZXItPmhvc3QgPSBob3N0OworCS8qCisJICogQ29weSBiYWNrIHdoYXQgd2UgYWxyZWFkeSBoYXZlIHRvIHRoZSBhbGxvY2F0ZWQgYWRhcHRlciBzdHJ1Y3QuCisJICovCisJYWRhcHRlci0+cmV2ID0gYWRhcHRlcl90ZW1wLnJldjsKKwlhZGFwdGVyLT5tbWlvQmFzZSA9IGFkYXB0ZXJfdGVtcC5tbWlvQmFzZTsKKworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5od19sb2NrKTsKKwlob3N0LT5tYXhfY2hhbm5lbCA9IDA7CisJaG9zdC0+bWF4X2x1biAgICAgPSAxOworCWhvc3QtPm1heF9jbWRfbGVuID0gMTY7CisJaG9zdC0+bWF4X2lkICAgICAgPSBtYXhfaWQ7CisKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgaG9zdCk7CiAKIAlsbF9hZGFwdGVyX3Jlc2V0KGFkYXB0ZXIpOwpAQCAtMTMyNywxMyArMTQ3OSw2IEBACiAJfQogCiAJLyoKLQkgKiBBc2sgdGhlIGRldmljZSBmb3IgbWF4IG51bWJlciBvZiB0YXJnZXRzLgotCSAqLwotCWhvc3QtPm1heF9pZCA9IHB2c2NzaV9nZXRfbWF4X3RhcmdldHMoYWRhcHRlcik7Ci0JZGV2ID0gcHZzY3NpX2RldihhZGFwdGVyKTsKLQlkZXZfaW5mbyhkZXYsICJ2bXdfcHZzY3NpOiBob3N0LT5tYXhfaWQ6ICV1XG4iLCBob3N0LT5tYXhfaWQpOwotCi0JLyoKIAkgKiBGcm9tIHRoaXMgcG9pbnQgb24gd2Ugc2hvdWxkIHJlc2V0IHRoZSBhZGFwdGVyIGlmIGFueXRoaW5nIGdvZXMKIAkgKiB3cm9uZy4KIAkgKi8KQEAgLTEzNzMsNiArMTUxOCwxMCBAQAogCQlmbGFncyA9IElSUUZfU0hBUkVEOwogCX0KIAorCWFkYXB0ZXItPnVzZV9yZXFfdGhyZXNob2xkID0gcHZzY3NpX3NldHVwX3JlcV90aHJlc2hvbGQoYWRhcHRlciwgdHJ1ZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgInZtd19wdnNjc2k6IGRyaXZlci1iYXNlZCByZXF1ZXN0IGNvYWxlc2NpbmcgJXNhYmxlZFxuIiwKKwkgICAgICAgYWRhcHRlci0+dXNlX3JlcV90aHJlc2hvbGQgPyAiZW4iIDogImRpcyIpOworCiAJZXJyb3IgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5pcnEsIHB2c2NzaV9pc3IsIGZsYWdzLAogCQkJICAgICJ2bXdfcHZzY3NpIiwgYWRhcHRlcik7CiAJaWYgKGVycm9yKSB7CkBAIC0xNDAyLDEyICsxNTUxLDE1IEBACiAJbGxfYWRhcHRlcl9yZXNldChhZGFwdGVyKTsKIG91dF9yZWxlYXNlX3Jlc291cmNlczoKIAlwdnNjc2lfcmVsZWFzZV9yZXNvdXJjZXMoYWRhcHRlcik7Ci1vdXRfZnJlZV9ob3N0OgogCXNjc2lfaG9zdF9wdXQoaG9zdCk7CiBvdXRfZGlzYWJsZV9kZXZpY2U6CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCiAJcmV0dXJuIGVycm9yOworCitvdXRfcmVsZWFzZV9yZXNvdXJjZXNfYW5kX2Rpc2FibGU6CisJcHZzY3NpX3JlbGVhc2VfcmVzb3VyY2VzKGFkYXB0ZXIpOworCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOwogfQogCiBzdGF0aWMgdm9pZCBfX3B2c2NzaV9zaHV0ZG93bihzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdm13X3B2c2NzaS5oIGIvZHJpdmVycy9zY3NpL3Ztd19wdnNjc2kuaAppbmRleCAzNTQ2ZTg2Li5jZTQ1ODg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvdm13X3B2c2NzaS5oCisrKyBiL2RyaXZlcnMvc2NzaS92bXdfcHZzY3NpLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogVk13YXJlIFBWU0NTSSBoZWFkZXIgZmlsZQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5LCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDE0LCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCkBAIC0yNiw3ICsyNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCi0jZGVmaW5lIFBWU0NTSV9EUklWRVJfVkVSU0lPTl9TVFJJTkcgICAiMS4wLjIuMC1rIgorI2RlZmluZSBQVlNDU0lfRFJJVkVSX1ZFUlNJT05fU1RSSU5HICAgIjEuMC41LjAtayIKIAogI2RlZmluZSBQVlNDU0lfTUFYX05VTV9TR19FTlRSSUVTX1BFUl9TRUdNRU5UIDEyOAogCkBAIC0xMTcsOCArMTE3LDkgQEAKIAlQVlNDU0lfQ01EX0NPTkZJRyAgICAgICAgICAgID0gNywKIAlQVlNDU0lfQ01EX1NFVFVQX01TR19SSU5HICAgID0gOCwKIAlQVlNDU0lfQ01EX0RFVklDRV9VTlBMVUcgICAgID0gOSwKKwlQVlNDU0lfQ01EX1NFVFVQX1JFUUNBTExUSFJFU0hPTEQgICAgID0gMTAsCiAKLQlQVlNDU0lfQ01EX0xBU1QgICAgICAgICAgICAgID0gMTAgIC8qIGhhcyB0byBiZSBsYXN0ICovCisJUFZTQ1NJX0NNRF9MQVNUICAgICAgICAgICAgICA9IDExICAvKiBoYXMgdG8gYmUgbGFzdCAqLwogfTsKIAogLyoKQEAgLTE0MSw2ICsxNDIsMTQgQEAKIAl1MzIgX3BhZDsKIH0gX19wYWNrZWQ7CiAKKy8qCisgKiBDb21tYW5kIGRlc2NyaXB0b3IgZm9yIFBWU0NTSV9DTURfU0VUVVBfUkVRQ0FMTFRIUkVTSE9MRCAtLQorICovCisKK3N0cnVjdCBQVlNDU0lDbWREZXNjU2V0dXBSZXFDYWxsIHsKKwl1MzIgZW5hYmxlOworfSBfX3BhY2tlZDsKKwogZW51bSBQVlNDU0lDb25maWdQYWdlVHlwZSB7CiAJUFZTQ1NJX0NPTkZJR19QQUdFX0NPTlRST0xMRVIgPSAweDE5NTgsCiAJUFZTQ1NJX0NPTkZJR19QQUdFX1BIWSAgICAgICAgPSAweDE5NTksCkBAIC0yNjEsNyArMjcwLDkgQEAKIAl1MzIJY21wQ29uc0lkeDsKIAl1MzIJY21wTnVtRW50cmllc0xvZzI7CiAKLQl1OAlfcGFkWzEwNF07CisJdTMyCXJlcUNhbGxUaHJlc2hvbGQ7CisKKwl1OAlfcGFkWzEwMF07CiAKIAl1MzIJbXNnUHJvZElkeDsKIAl1MzIJbXNnQ29uc0lkeDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS93ZDcwMDAuYyBiL2RyaXZlcnMvc2NzaS93ZDcwMDAuYwppbmRleCBmOWE2ZTRiLi4zMjY3NDIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvd2Q3MDAwLmMKKysrIGIvZHJpdmVycy9zY3NpL3dkNzAwMC5jCkBAIC0xMjUyLDcgKzEyNTIsNyBAQAogCQlyZXR1cm4gMDsKIAogCi0JaWYgKHJlcXVlc3RfaXJxKGhvc3QtPmlycSwgd2Q3MDAwX2ludHIsIElSUUZfRElTQUJMRUQsICJ3ZDcwMDAiLCBob3N0KSkgeworCWlmIChyZXF1ZXN0X2lycShob3N0LT5pcnEsIHdkNzAwMF9pbnRyLCAwLCAid2Q3MDAwIiwgaG9zdCkpIHsKIAkJcHJpbnRrKCJ3ZDcwMDBfaW5pdDogY2FuJ3QgZ2V0IElSUSAlZC5cbiIsIGhvc3QtPmlycSk7CiAJCXJldHVybiAoMCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvS2NvbmZpZyBiL2RyaXZlcnMvc3BpL0tjb25maWcKaW5kZXggNTgxZWUyYS4uZWZlMTk2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvS2NvbmZpZworKysgYi9kcml2ZXJzL3NwaS9LY29uZmlnCkBAIC0xNTAsNyArMTUwLDcgQEAKIAogY29uZmlnIFNQSV9DTFBTNzExWAogCXRyaXN0YXRlICJDTFBTNzExWCBob3N0IFNQSSBjb250cm9sbGVyIgotCWRlcGVuZHMgb24gQVJDSF9DTFBTNzExWAorCWRlcGVuZHMgb24gQVJDSF9DTFBTNzExWCB8fCBDT01QSUxFX1RFU1QKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgZGVkaWNhdGVkIGdlbmVyYWwgcHVycG9zZSBTUEkvTWljcm93aXJlMS1jb21wYXRpYmxlCiAJICBtYXN0ZXIgbW9kZSBpbnRlcmZhY2UgKFNTSTEpIGZvciBDTFBTNzExWC1iYXNlZCBDUFVzLgpAQCAtMjEyLDcgKzIxMiw2IEBACiAJdHJpc3RhdGUgIkZyZWVzY2FsZSBpLk1YIFNQSSBjb250cm9sbGVycyIKIAlkZXBlbmRzIG9uIEFSQ0hfTVhDIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBTUElfQklUQkFORwotCWRlZmF1bHQgbSBpZiBJTVhfSEFWRV9QTEFURk9STV9TUElfSU1YCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHVzaW5nIHRoZSBGcmVlc2NhbGUgaS5NWCBTUEkgY29udHJvbGxlcnMgaW4gbWFzdGVyCiAJICBtb2RlLgpAQCAtMjcwLDYgKzI2OSw3IEBACiBjb25maWcgU1BJX0ZTTF9EU1BJCiAJdHJpc3RhdGUgIkZyZWVzY2FsZSBEU1BJIGNvbnRyb2xsZXIiCiAJc2VsZWN0IFNQSV9CSVRCQU5HCisJc2VsZWN0IFJFR01BUF9NTUlPCiAJZGVwZW5kcyBvbiBTT0NfVkY2MTAgfHwgQ09NUElMRV9URVNUCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBGcmVlc2NhbGUgRFNQSSBjb250cm9sbGVyIGluIG1hc3RlcgpAQCAtMzA3LDcgKzMwNyw3IEBACiAKIGNvbmZpZyBTUElfT01BUDI0WFgKIAl0cmlzdGF0ZSAiTWNTUEkgZHJpdmVyIGZvciBPTUFQIgotCWRlcGVuZHMgb24gQVJNIHx8IEFSTTY0IHx8IEFWUjMyIHx8IEhFWEFHT04gfHwgTUlQUyB8fCBTSAorCWRlcGVuZHMgb24gQVJNIHx8IEFSTTY0IHx8IEFWUjMyIHx8IEhFWEFHT04gfHwgTUlQUyB8fCBTVVBFUkgKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUDJQTFVTIHx8IENPTVBJTEVfVEVTVAogCWhlbHAKIAkgIFNQSSBtYXN0ZXIgY29udHJvbGxlciBmb3IgT01BUDI0WFggYW5kIGxhdGVyIE11bHRpY2hhbm5lbCBTUEkKQEAgLTM4MSw2ICszODEsMTkgQEAKIAloZWxwCiAJICBTUEkgZHJpdmVyIGZvciBSZW5lc2FzIFJTUEkgYW5kIFFTUEkgYmxvY2tzLgogCitjb25maWcgU1BJX1FVUAorCXRyaXN0YXRlICJRdWFsY29tbSBTUEkgY29udHJvbGxlciB3aXRoIFFVUCBpbnRlcmZhY2UiCisJZGVwZW5kcyBvbiBBUkNIX01TTV9EVCB8fCAoQVJNICYmIENPTVBJTEVfVEVTVCkKKwloZWxwCisJICBRdWFsY29tbSBVbml2ZXJzYWwgUGVyaXBoZXJhbCAoUVVQKSBjb3JlIGlzIGFuIEFIQiBzbGF2ZSB0aGF0CisJICBwcm92aWRlcyBhIGNvbW1vbiBkYXRhIHBhdGggKGFuIG91dHB1dCBGSUZPIGFuZCBhbiBpbnB1dCBGSUZPKQorCSAgZm9yIHNlcmlhbCBwZXJpcGhlcmFsIGludGVyZmFjZSAoU1BJKSBtaW5pLWNvcmUuIFNQSSBpbiBtYXN0ZXIKKwkgIG1vZGUgc3VwcG9ydHMgdXAgdG8gNTBNSHosIHVwIHRvIGZvdXIgY2hpcCBzZWxlY3RzLCBwcm9ncmFtbWFibGUKKwkgIGRhdGEgcGF0aCBmcm9tIDQgYml0cyB0byAzMiBiaXRzIGFuZCBudW1lcm91cyBwcm90b2NvbCB2YXJpYW50cy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc3BpX3F1cC4KKwogY29uZmlnIFNQSV9TM0MyNFhYCiAJdHJpc3RhdGUgIlNhbXN1bmcgUzNDMjRYWCBzZXJpZXMgU1BJIgogCWRlcGVuZHMgb24gQVJDSF9TM0MyNFhYCkBAIC00MTYsNyArNDI5LDYgQEAKIAl0cmlzdGF0ZSAiU3VwZXJIIE1TSU9GIFNQSSBjb250cm9sbGVyIgogCWRlcGVuZHMgb24gSEFWRV9DTEsKIAlkZXBlbmRzIG9uIFNVUEVSSCB8fCBBUkNIX1NITU9CSUxFIHx8IENPTVBJTEVfVEVTVAotCXNlbGVjdCBTUElfQklUQkFORwogCWhlbHAKIAkgIFNQSSBkcml2ZXIgZm9yIFN1cGVySCBhbmQgU0ggTW9iaWxlIE1TSU9GIGJsb2Nrcy4KIApAQCAtNDQ2LDYgKzQ1OCwxOSBAQAogCWhlbHAKIAkgIFNQSSBkcml2ZXIgZm9yIENTUiBTaVJGcHJpbWFJSSBTb0NzCiAKK2NvbmZpZyBTUElfU1VONEkKKwl0cmlzdGF0ZSAiQWxsd2lubmVyIEExMCBTb0NzIFNQSSBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gQVJDSF9TVU5YSSB8fCBDT01QSUxFX1RFU1QKKwloZWxwCisJICBTUEkgZHJpdmVyIGZvciBBbGx3aW5uZXIgc3VuNGksIHN1bjVpIGFuZCBzdW43aSBTb0NzCisKK2NvbmZpZyBTUElfU1VONkkKKwl0cmlzdGF0ZSAiQWxsd2lubmVyIEEzMSBTUEkgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEFSQ0hfU1VOWEkgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBSRVNFVF9DT05UUk9MTEVSCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHVzaW5nIHRoZSBTUEkgY29udHJvbGxlciBvbiB0aGUgQWxsd2lubmVyIEEzMSBTb0NzLgorCiBjb25maWcgU1BJX01YUwogCXRyaXN0YXRlICJGcmVlc2NhbGUgTVhTIFNQSSBjb250cm9sbGVyIgogCWRlcGVuZHMgb24gQVJDSF9NWFMKQEAgLTQ3OCwxMyArNTAzLDYgQEAKIAloZWxwCiAJICBTUEkgZHJpdmVyIGZvciBOdmlkaWEgVGVncmEyMC9UZWdyYTMwIFNMSU5LIENvbnRyb2xsZXIgaW50ZXJmYWNlLgogCi1jb25maWcgU1BJX1RJX1NTUAotCXRyaXN0YXRlICJUSSBTZXF1ZW5jZXIgU2VyaWFsIFBvcnQgLSBTUEkgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1GRF9USV9TU1AKLQloZWxwCi0JICBUaGlzIHNlbGVjdHMgYW4gU1BJIG1hc3RlciBpbXBsZW1lbnRhdGlvbiB1c2luZyBhIFRJIHNlcXVlbmNlcgotCSAgc2VyaWFsIHBvcnQuCi0KIGNvbmZpZyBTUElfVE9QQ0xJRkZfUENICiAJdHJpc3RhdGUgIkludGVsIEVHMjBUIFBDSC9MQVBJUyBTZW1pY29uIElPSChNTDcyMTMvTUw3MjIzL01MNzgzMSkgU1BJIgogCWRlcGVuZHMgb24gUENJCkBAIC01MjAsNiArNTM4LDE5IEBACiAKIAkgIE9yIGZvciB0aGUgRFM1NzAsIHNlZSAiWFBTIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoU1BJKSAodjIuMDBiKSIKIAorY29uZmlnIFNQSV9YVEVOU0FfWFRGUEdBCisJdHJpc3RhdGUgIlh0ZW5zYSBTUEkgY29udHJvbGxlciBmb3IgeHRmcGdhIgorCWRlcGVuZHMgb24gKFhURU5TQSAmJiBYVEVOU0FfUExBVEZPUk1fWFRGUEdBKSB8fCBDT01QSUxFX1RFU1QKKwlzZWxlY3QgU1BJX0JJVEJBTkcKKwloZWxwCisJICBTUEkgZHJpdmVyIGZvciB4dGZwZ2EgU1BJIG1hc3RlciBjb250cm9sbGVyLgorCisJICBUaGlzIHNpbXBsZSBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgaXMgYnVpbHQgaW50byB4dGZwZ2EgYml0c3RyZWFtcworCSAgYW5kIGlzIHVzZWQgdG8gY29udHJvbCBkYXVnaHRlcmJvYXJkIGF1ZGlvIGNvZGVjLiBJdCBhbHdheXMgdHJhbnNmZXJzCisJICAxNiBiaXQgd29yZHMgaW4gU1BJIG1vZGUgMCwgYXV0b21hdGljYWxseSBhc3NlcnRpbmcgQ1Mgb24gdHJhbnNmZXIKKwkgIHN0YXJ0IGFuZCBkZWFzc2VydGluZyBvbiBlbmQuCisKKwogY29uZmlnIFNQSV9OVUM5MDAKIAl0cmlzdGF0ZSAiTnV2b3RvbiBOVUM5MDAgc2VyaWVzIFNQSSIKIAlkZXBlbmRzIG9uIEFSQ0hfVzkwWDkwMApAQCAtNTQ2LDcgKzU3Nyw3IEBACiAKIGNvbmZpZyBTUElfRFdfTU1JTwogCXRyaXN0YXRlICJNZW1vcnktbWFwcGVkIGlvIGludGVyZmFjZSBkcml2ZXIgZm9yIERXIFNQSSBjb3JlIgotCWRlcGVuZHMgb24gU1BJX0RFU0lHTldBUkUgJiYgSEFWRV9DTEsKKwlkZXBlbmRzIG9uIFNQSV9ERVNJR05XQVJFCiAKICMKICMgVGhlcmUgYXJlIGxvdHMgb2YgU1BJIGRldmljZSB0eXBlcywgd2l0aCBzZW5zb3JzIGFuZCBtZW1vcnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL01ha2VmaWxlIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUKaW5kZXggOTVhZjQ4ZC4uYmQ3OTI2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUKQEAgLTU5LDYgKzU5LDcgQEAKIHNwaS1weGEyeHgtcGxhdGZvcm0tJChDT05GSUdfU1BJX1BYQTJYWF9ETUEpCSs9IHNwaS1weGEyeHgtZG1hLm8KIG9iai0kKENPTkZJR19TUElfUFhBMlhYKQkJKz0gc3BpLXB4YTJ4eC1wbGF0Zm9ybS5vCiBvYmotJChDT05GSUdfU1BJX1BYQTJYWF9QQ0kpCQkrPSBzcGktcHhhMnh4LXBjaS5vCitvYmotJChDT05GSUdfU1BJX1FVUCkJCQkrPSBzcGktcXVwLm8KIG9iai0kKENPTkZJR19TUElfUlNQSSkJCQkrPSBzcGktcnNwaS5vCiBvYmotJChDT05GSUdfU1BJX1MzQzI0WFgpCQkrPSBzcGktczNjMjR4eC1ody5vCiBzcGktczNjMjR4eC1ody15CQkJOj0gc3BpLXMzYzI0eHgubwpAQCAtNzAsMTIgKzcxLDE0IEBACiBvYmotJChDT05GSUdfU1BJX1NIX01TSU9GKQkJKz0gc3BpLXNoLW1zaW9mLm8KIG9iai0kKENPTkZJR19TUElfU0hfU0NJKQkJKz0gc3BpLXNoLXNjaS5vCiBvYmotJChDT05GSUdfU1BJX1NJUkYpCQkrPSBzcGktc2lyZi5vCitvYmotJChDT05GSUdfU1BJX1NVTjRJKQkJCSs9IHNwaS1zdW40aS5vCitvYmotJChDT05GSUdfU1BJX1NVTjZJKQkJCSs9IHNwaS1zdW42aS5vCiBvYmotJChDT05GSUdfU1BJX1RFR1JBMTE0KQkJKz0gc3BpLXRlZ3JhMTE0Lm8KIG9iai0kKENPTkZJR19TUElfVEVHUkEyMF9TRkxBU0gpCSs9IHNwaS10ZWdyYTIwLXNmbGFzaC5vCiBvYmotJChDT05GSUdfU1BJX1RFR1JBMjBfU0xJTkspCQkrPSBzcGktdGVncmEyMC1zbGluay5vCi1vYmotJChDT05GSUdfU1BJX1RJX1NTUCkJCSs9IHNwaS10aS1zc3Aubwogb2JqLSQoQ09ORklHX1NQSV9UTEU2MlgwKQkJKz0gc3BpLXRsZTYyeDAubwogb2JqLSQoQ09ORklHX1NQSV9UT1BDTElGRl9QQ0gpCQkrPSBzcGktdG9wY2xpZmYtcGNoLm8KIG9iai0kKENPTkZJR19TUElfVFhYOSkJCQkrPSBzcGktdHh4OS5vCiBvYmotJChDT05GSUdfU1BJX1hDT01NKQkJKz0gc3BpLXhjb21tLm8KIG9iai0kKENPTkZJR19TUElfWElMSU5YKQkJKz0gc3BpLXhpbGlueC5vCitvYmotJChDT05GSUdfU1BJX1hURU5TQV9YVEZQR0EpCQkrPSBzcGkteHRlbnNhLXh0ZnBnYS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYWx0ZXJhLmMgYi9kcml2ZXJzL3NwaS9zcGktYWx0ZXJhLmMKaW5kZXggNWQ3ZGVhZi4uNWI1NzA5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWFsdGVyYS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1hbHRlcmEuYwpAQCAtMTMsNyArMTMsNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjAwLDcgKzE5OSw2IEBACiAKIHN0YXRpYyBpbnQgYWx0ZXJhX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBhbHRlcmFfc3BpX3BsYXRmb3JtX2RhdGEgKnBsYXRwID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKIAlzdHJ1Y3QgYWx0ZXJhX3NwaSAqaHc7CiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKQEAgLTIxNCw2ICsyMTIsOCBAQAogCW1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmlkOwogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSAxNjsKIAltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DU19ISUdIOworCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19SQU5HRV9NQVNLKDEsIDE2KTsKKwltYXN0ZXItPmRldi5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAKIAlodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBodyk7CkBAIC0yNDUsOSArMjQ1LDYgQEAKIAkJaWYgKGVycikKIAkJCWdvdG8gZXhpdDsKIAl9Ci0JLyogZmluZCBwbGF0Zm9ybSBkYXRhICovCi0JaWYgKCFwbGF0cCkKLQkJaHctPmJpdGJhbmcubWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCiAJLyogcmVnaXN0ZXIgb3VyIHNwaSBjb250cm9sbGVyICovCiAJZXJyID0gc3BpX2JpdGJhbmdfc3RhcnQoJmh3LT5iaXRiYW5nKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1hdGg3OS5jIGIvZHJpdmVycy9zcGkvc3BpLWF0aDc5LmMKaW5kZXggYzNiMmZiOS4uMzg5OGIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWF0aDc5LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWF0aDc5LmMKQEAgLTE0LDcgKzE0LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYXRtZWwuYyBiL2RyaXZlcnMvc3BpL3NwaS1hdG1lbC5jCmluZGV4IDVkN2IwN2YuLjgwMDVmOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1hdG1lbC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1hdG1lbC5jCkBAIC05LDcgKzksNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0yNiw2ICsyNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL2NvbnN1bWVyLmg+CiAKIC8qIFNQSSByZWdpc3RlciBvZmZzZXRzICovCiAjZGVmaW5lIFNQSV9DUgkJCQkJMHgwMDAwCkBAIC05OTMsMTMgKzk5Myw2IEBACiAKIAlhcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwogCi0JaWYgKHNwaS0+Y2hpcF9zZWxlY3QgPiBzcGktPm1hc3Rlci0+bnVtX2NoaXBzZWxlY3QpIHsKLQkJZGV2X2RiZygmc3BpLT5kZXYsCi0JCQkJInNldHVwOiBpbnZhbGlkIGNoaXBzZWxlY3QgJXUgKCV1IGRlZmluZWQpXG4iLAotCQkJCXNwaS0+Y2hpcF9zZWxlY3QsIHNwaS0+bWFzdGVyLT5udW1fY2hpcHNlbGVjdCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCS8qIHNlZSBub3RlcyBhYm92ZSByZSBjaGlwc2VsZWN0ICovCiAJaWYgKCFhdG1lbF9zcGlfaXNfdjIoYXMpCiAJCQkmJiBzcGktPmNoaXBfc2VsZWN0ID09IDAKQEAgLTEwODcsMTQgKzEwODAsNiBAQAogCQl9CiAJfQogCi0JaWYgKHhmZXItPmJpdHNfcGVyX3dvcmQgPiA4KSB7Ci0JCWlmICh4ZmVyLT5sZW4gJSAyKSB7Ci0JCQlkZXZfZGJnKCZzcGktPmRldiwKLQkJCSJidWZmZXIgbGVuIHNob3VsZCBiZSAxNiBiaXRzIGFsaWduZWRcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KIAkvKgogCSAqIERNQSBtYXAgZWFybHksIGZvciBwZXJmb3JtYW5jZSAoZW1wdGllcyBkY2FjaGUgQVNBUCkgYW5kCiAJICogYmV0dGVyIGZhdWx0IHJlcG9ydGluZy4KQEAgLTEyMjEsOSArMTIwNiw2IEBACiAJZGV2X2RiZygmc3BpLT5kZXYsICJuZXcgbWVzc2FnZSAlcCBzdWJtaXR0ZWQgZm9yICVzXG4iLAogCQkJCQltc2csIGRldl9uYW1lKCZzcGktPmRldikpOwogCi0JaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJm1zZy0+dHJhbnNmZXJzKSkpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJYXRtZWxfc3BpX2xvY2soYXMpOwogCWNzX2FjdGl2YXRlKGFzLCBzcGkpOwogCkBAIC0xMjQ0LDEwICsxMjI2LDEwIEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewogCQlkZXZfZGJnKCZzcGktPmRldiwKLQkJCSIgIHhmZXIgJXA6IGxlbiAldSB0eCAlcC8lMDh4IHJ4ICVwLyUwOHhcbiIsCisJCQkiICB4ZmVyICVwOiBsZW4gJXUgdHggJXAvJXBhZCByeCAlcC8lcGFkXG4iLAogCQkJeGZlciwgeGZlci0+bGVuLAotCQkJeGZlci0+dHhfYnVmLCB4ZmVyLT50eF9kbWEsCi0JCQl4ZmVyLT5yeF9idWYsIHhmZXItPnJ4X2RtYSk7CisJCQl4ZmVyLT50eF9idWYsICZ4ZmVyLT50eF9kbWEsCisJCQl4ZmVyLT5yeF9idWYsICZ4ZmVyLT5yeF9kbWEpOwogCX0KIAogbXNnX2RvbmU6CkBAIC0xMzAzLDYgKzEyODUsOSBAQAogCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7CiAJc3RydWN0IGF0bWVsX3NwaQkqYXM7CiAKKwkvKiBTZWxlY3QgZGVmYXVsdCBwaW4gc3RhdGUgKi8KKwlwaW5jdHJsX3BtX3NlbGVjdF9kZWZhdWx0X3N0YXRlKCZwZGV2LT5kZXYpOworCiAJcmVncyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFyZWdzKQogCQlyZXR1cm4gLUVOWElPOwpAQCAtMTQ2NSw2ICsxNDUwLDkgQEAKIAl9CiAKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoYXMtPmNsayk7CisKKwlwaW5jdHJsX3BtX3NlbGVjdF9zbGVlcF9zdGF0ZShkZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0NzQsNiArMTQ2Miw4IEBACiAJc3RydWN0IGF0bWVsX3NwaQkqYXMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAJaW50IHJldDsKIAorCXBpbmN0cmxfcG1fc2VsZWN0X2RlZmF1bHRfc3RhdGUoZGV2KTsKKwogCWNsa19wcmVwYXJlX2VuYWJsZShhcy0+Y2xrKTsKIAogCS8qIFN0YXJ0IHRoZSBxdWV1ZSBydW5uaW5nICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYXUxNTUwLmMgYi9kcml2ZXJzL3NwaS9zcGktYXUxNTUwLmMKaW5kZXggYzQxNDFjOS4uYWFmYjgxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWF1MTU1MC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1hdTE1NTAuYwpAQCAtNTUsOCArNTUsNiBAQAogCiAJdm9sYXRpbGUgcHNjX3NwaV90IF9faW9tZW0gKnJlZ3M7CiAJaW50IGlycTsKLQl1bnNpZ25lZCBmcmVxX21heDsKLQl1bnNpZ25lZCBmcmVxX21pbjsKIAogCXVuc2lnbmVkIGxlbjsKIAl1bnNpZ25lZCB0eF9jb3VudDsKQEAgLTI0OCwxMSArMjQ2LDggQEAKIAkJCWh6ID0gdC0+c3BlZWRfaHo7CiAJfQogCi0JaWYgKGh6ID4gc3BpLT5tYXhfc3BlZWRfaHogfHwgaHogPiBody0+ZnJlcV9tYXggfHwgaHogPCBody0+ZnJlcV9taW4pIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJzZXR1cHhmZXI6IGNsb2NrIHJhdGU9JWQgb3V0IG9mIHJhbmdlXG4iLAotCQkJaHopOworCWlmICghaHopCiAJCXJldHVybiAtRUlOVkFMOwotCX0KIAogCWF1MTU1MF9zcGlfYml0c19oYW5kbGVyc19zZXQoaHcsIHNwaS0+Yml0c19wZXJfd29yZCk7CiAKQEAgLTI4NywyMyArMjgyLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdTE1NTBfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IGF1MTU1MF9zcGkgKmh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0KLQlpZiAoc3BpLT5tYXhfc3BlZWRfaHogPT0gMCkKLQkJc3BpLT5tYXhfc3BlZWRfaHogPSBody0+ZnJlcV9tYXg7Ci0JaWYgKHNwaS0+bWF4X3NwZWVkX2h6ID4gaHctPmZyZXFfbWF4Ci0JCQl8fCBzcGktPm1heF9zcGVlZF9oeiA8IGh3LT5mcmVxX21pbikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JLyoKLQkgKiBOT1RFOiBjYW5ub3QgY2hhbmdlIHNwZWVkIGFuZCBvdGhlciBodyBzZXR0aW5ncyBpbW1lZGlhdGVseSwKLQkgKiAgICAgICBvdGhlcndpc2Ugc2hhcmluZyBvZiBzcGkgYnVzIGlzIG5vdCBwb3NzaWJsZSwKLQkgKiAgICAgICBzbyBkbyBub3QgY2FsbCBzZXR1cHhmZXIoc3BpLCBOVUxMKSBoZXJlCi0JICovCi0JcmV0dXJuIDA7Ci19Ci0KIC8qCiAgKiBmb3IgZG1hIHNwaSB0cmFuc2ZlcnMsIHdlIGhhdmUgdG8gc2V0dXAgcnggY2hhbm5lbCwgb3RoZXJ3aXNlIHRoZXJlIGlzCiAgKiBubyByZWxpYWJsZSB3YXkgaG93IHRvIHJlY29nbml6ZSB0aGF0IHNwaSB0cmFuc2ZlciBpcyBkb25lCkBAIC04MzgsNyArODE2LDYgQEAKIAlody0+Yml0YmFuZy5tYXN0ZXIgPSBody0+bWFzdGVyOwogCWh3LT5iaXRiYW5nLnNldHVwX3RyYW5zZmVyID0gYXUxNTUwX3NwaV9zZXR1cHhmZXI7CiAJaHctPmJpdGJhbmcuY2hpcHNlbGVjdCA9IGF1MTU1MF9zcGlfY2hpcHNlbDsKLQlody0+Yml0YmFuZy5tYXN0ZXItPnNldHVwID0gYXUxNTUwX3NwaV9zZXR1cDsKIAlody0+Yml0YmFuZy50eHJ4X2J1ZnMgPSBhdTE1NTBfc3BpX3R4cnhfYnVmczsKIAogCWlmIChody0+dXNlZG1hKSB7CkBAIC05MDksOCArODg2LDkgQEAKIAl7CiAJCWludCBtaW5fZGl2ID0gKDIgPDwgMCkgKiAoMiAqICg0ICsgMSkpOwogCQlpbnQgbWF4X2RpdiA9ICgyIDw8IDMpICogKDIgKiAoNjMgKyAxKSk7Ci0JCWh3LT5mcmVxX21heCA9IGh3LT5wZGF0YS0+bWFpbmNsa19oeiAvIG1pbl9kaXY7Ci0JCWh3LT5mcmVxX21pbiA9IGh3LT5wZGF0YS0+bWFpbmNsa19oeiAvIChtYXhfZGl2ICsgMSkgKyAxOworCQltYXN0ZXItPm1heF9zcGVlZF9oeiA9IGh3LT5wZGF0YS0+bWFpbmNsa19oeiAvIG1pbl9kaXY7CisJCW1hc3Rlci0+bWluX3NwZWVkX2h6ID0KKwkJCQlody0+cGRhdGEtPm1haW5jbGtfaHogLyAobWF4X2RpdiArIDEpICsgMTsKIAl9CiAKIAlhdTE1NTBfc3BpX3NldHVwX3BzY19hc19zcGkoaHcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWJjbTI4MzUuYyBiL2RyaXZlcnMvc3BpL3NwaS1iY20yODM1LmMKaW5kZXggOGE4OWRkMS4uNjkxNjc0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWJjbTI4MzUuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYmNtMjgzNS5jCkBAIC0zMTUsNyArMzE1LDYgQEAKIAogCW1hc3Rlci0+bW9kZV9iaXRzID0gQkNNMjgzNV9TUElfTU9ERV9CSVRTOwogCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19NQVNLKDgpOwotCW1hc3Rlci0+YnVzX251bSA9IC0xOwogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSAzOwogCW1hc3Rlci0+dHJhbnNmZXJfb25lX21lc3NhZ2UgPSBiY20yODM1X3NwaV90cmFuc2Zlcl9vbmU7CiAJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWJjbTYzeHgtaHNzcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS1iY202M3h4LWhzc3BpLmMKaW5kZXggYjUyOGY5Zi4uNWEyMTFlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWJjbTYzeHgtaHNzcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYmNtNjN4eC1oc3NwaS5jCkBAIC0xODAsNyArMTgwLDcgQEAKIAl3aGlsZSAocGVuZGluZyA+IDApIHsKIAkJaW50IGN1cnJfc3RlcCA9IG1pbl90KGludCwgc3RlcF9zaXplLCBwZW5kaW5nKTsKIAotCQlpbml0X2NvbXBsZXRpb24oJmJzLT5kb25lKTsKKwkJcmVpbml0X2NvbXBsZXRpb24oJmJzLT5kb25lKTsKIAkJaWYgKHR4KSB7CiAJCQltZW1jcHlfdG9pbyhicy0+ZmlmbyArIEhTU1BJX09QQ09ERV9MRU4sIHR4LCBjdXJyX3N0ZXApOwogCQkJdHggKz0gY3Vycl9zdGVwOwpAQCAtMzY5LDYgKzM2OSw3IEBACiAJYnMtPmZpZm8gPSAodTggX19pb21lbSAqKShicy0+cmVncyArIEhTU1BJX0ZJRk9fUkVHKDApKTsKIAogCW11dGV4X2luaXQoJmJzLT5idXNfbXV0ZXgpOworCWluaXRfY29tcGxldGlvbigmYnMtPmRvbmUpOwogCiAJbWFzdGVyLT5idXNfbnVtID0gSFNTUElfQlVTX05VTTsKIAltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gODsKQEAgLTQ1Myw5ICs0NTQsOCBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBiY202M3h4X2hzc3BpX3BtX29wcyA9IHsKLQlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhiY202M3h4X2hzc3BpX3N1c3BlbmQsIGJjbTYzeHhfaHNzcGlfcmVzdW1lKQotfTsKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhiY202M3h4X2hzc3BpX3BtX29wcywgYmNtNjN4eF9oc3NwaV9zdXNwZW5kLAorCQkJIGJjbTYzeHhfaHNzcGlfcmVzdW1lKTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYmNtNjN4eF9oc3NwaV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1iY202M3h4LmMgYi9kcml2ZXJzL3NwaS9zcGktYmNtNjN4eC5jCmluZGV4IDc3Mjg2YWUuLjAyNTBmYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1iY202M3h4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWJjbTYzeHguYwpAQCAtMjAsNyArMjAsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTM1LDggKzM0LDYgQEAKIAogI2luY2x1ZGUgPGJjbTYzeHhfZGV2X3NwaS5oPgogCi0jZGVmaW5lIFBGWAkJS0JVSUxEX01PRE5BTUUKLQogI2RlZmluZSBCQ002M1hYX1NQSV9NQVhfUFJFUEVORAkJMTUKIAogc3RydWN0IGJjbTYzeHhfc3BpIHsKQEAgLTE2OSw3ICsxNjYsNyBAQAogCQkJICAgICAgIHRyYW5zZmVyX2xpc3QpOwogCX0KIAotCWluaXRfY29tcGxldGlvbigmYnMtPmRvbmUpOworCXJlaW5pdF9jb21wbGV0aW9uKCZicy0+ZG9uZSk7CiAKIAkvKiBGaWxsIGluIHRoZSBNZXNzYWdlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KIAltc2dfY3RsID0gKGxlbiA8PCBTUElfQllURV9DTlRfU0hJRlQpOwpAQCAtMzUzLDYgKzM1MCw3IEBACiAJfQogCiAJYnMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJaW5pdF9jb21wbGV0aW9uKCZicy0+ZG9uZSk7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOwogCWJzLT5wZGV2ID0gcGRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1iZmluLXNwb3J0LmMgYi9kcml2ZXJzL3NwaS9zcGktYmZpbi1zcG9ydC5jCmluZGV4IDM4OTQxZTUuLmY1MTVjNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1iZmluLXNwb3J0LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWJmaW4tc3BvcnQuYwpAQCAtOCw3ICs4LDYgQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYmZpbi12My5jIGIvZHJpdmVycy9zcGkvc3BpLWJmaW4tdjMuYwppbmRleCA4Zjg1OTg4Li40MDg5ZDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktYmZpbi12My5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1iZmluLXYzLmMKQEAgLTgyMiw3ICs4MjIsOCBAQAogCW1hc3Rlci0+Y2xlYW51cCA9IGJmaW5fc3BpX2NsZWFudXA7CiAJbWFzdGVyLT5zZXR1cCA9IGJmaW5fc3BpX3NldHVwOwogCW1hc3Rlci0+dHJhbnNmZXJfb25lX21lc3NhZ2UgPSBiZmluX3NwaV90cmFuc2Zlcl9vbmVfbWVzc2FnZTsKLQltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IEJJVCgzMiAtIDEpIHwgQklUKDE2IC0gMSkgfCBCSVQoOCAtIDEpOworCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19NQVNLKDMyKSB8IFNQSV9CUFdfTUFTSygxNikgfAorCQkJCSAgICAgU1BJX0JQV19NQVNLKDgpOwogCiAJZHJ2X2RhdGEgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAJZHJ2X2RhdGEtPm1hc3RlciA9IG1hc3RlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1iZmluNXh4LmMgYi9kcml2ZXJzL3NwaS9zcGktYmZpbjV4eC5jCmluZGV4IGYwZjE5NWEuLjU1ZTU3YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1iZmluNXh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWJmaW41eHguYwpAQCAtMzUwLDcgKzM1MCw2IEBACiBzdGF0aWMgdm9pZCBiZmluX3NwaV9naXZlYmFjayhzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhKQogewogCXN0cnVjdCBiZmluX3NwaV9zbGF2ZV9kYXRhICpjaGlwID0gZHJ2X2RhdGEtPmN1cl9jaGlwOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKmxhc3RfdHJhbnNmZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZzsKIApAQCAtMzYyLDkgKzM2MSw2IEBACiAJcXVldWVfd29yayhkcnZfZGF0YS0+d29ya3F1ZXVlLCAmZHJ2X2RhdGEtPnB1bXBfbWVzc2FnZXMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRydl9kYXRhLT5sb2NrLCBmbGFncyk7CiAKLQlsYXN0X3RyYW5zZmVyID0gbGlzdF9lbnRyeShtc2ctPnRyYW5zZmVycy5wcmV2LAotCQkJCSAgIHN0cnVjdCBzcGlfdHJhbnNmZXIsIHRyYW5zZmVyX2xpc3QpOwotCiAJbXNnLT5zdGF0ZSA9IE5VTEw7CiAKIAlpZiAoIWRydl9kYXRhLT5jc19jaGFuZ2UpCkBAIC0xMDMwLDEwICsxMDI2LDYgQEAKIAl9CiAKIAkvKiB0cmFuc2xhdGUgY29tbW9uIHNwaSBmcmFtZXdvcmsgaW50byBvdXIgcmVnaXN0ZXIgKi8KLQlpZiAoc3BpLT5tb2RlICYgfihTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0xTQl9GSVJTVCkpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJ1bnN1cHBvcnRlZCBzcGkgbW9kZXMgZGV0ZWN0ZWRcbiIpOwotCQlnb3RvIGVycm9yOwotCX0KIAlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCiAJCWNoaXAtPmN0bF9yZWcgfD0gQklUX0NUTF9DUE9MOwogCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1iaXRiYW5nLmMgYi9kcml2ZXJzL3NwaS9zcGktYml0YmFuZy5jCmluZGV4IGJkMjIyZjYuLmRjN2QyYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1iaXRiYW5nLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWJpdGJhbmcuYwpAQCAtMTYsNyArMTYsNiBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTQ2NywxMSArNDY2LDkgQEAKIC8qKgogICogc3BpX2JpdGJhbmdfc3RvcCAtIHN0b3BzIHRoZSB0YXNrIHByb3ZpZGluZyBzcGkgY29tbXVuaWNhdGlvbgogICovCi1pbnQgc3BpX2JpdGJhbmdfc3RvcChzdHJ1Y3Qgc3BpX2JpdGJhbmcgKmJpdGJhbmcpCit2b2lkIHNwaV9iaXRiYW5nX3N0b3Aoc3RydWN0IHNwaV9iaXRiYW5nICpiaXRiYW5nKQogewogCXNwaV91bnJlZ2lzdGVyX21hc3RlcihiaXRiYW5nLT5tYXN0ZXIpOwotCi0JcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzcGlfYml0YmFuZ19zdG9wKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWJ1dHRlcmZseS5jIGIvZHJpdmVycy9zcGkvc3BpLWJ1dHRlcmZseS5jCmluZGV4IDgwODFmOTYuLmVlNGY5MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1idXR0ZXJmbHkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYnV0dGVyZmx5LmMKQEAgLTMwOSw3ICszMDksNiBAQAogc3RhdGljIHZvaWQgYnV0dGVyZmx5X2RldGFjaChzdHJ1Y3QgcGFycG9ydCAqcCkKIHsKIAlzdHJ1Y3QgYnV0dGVyZmx5CSpwcDsKLQlpbnQJCQlzdGF0dXM7CiAKIAkvKiBGSVhNRSB0aGlzIGdsb2JhbCBpcyB1Z2x5IC4uLiBidXQsIGhvdyB0byBxdWlja2x5IGdldCBmcm9tCiAJICogdGhlIHBhcnBvcnQgdG8gdGhlICJzdHJ1Y3QgYnV0dGVyZmx5IiBhc3NvY2lhdGVkIHdpdGggaXQ/CkBAIC0zMjEsNyArMzIwLDcgQEAKIAlidXR0ZXJmbHkgPSBOVUxMOwogCiAJLyogc3RvcCgpIHVucmVnaXN0ZXJzIGNoaWxkIGRldmljZXMgdG9vICovCi0Jc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RvcCgmcHAtPmJpdGJhbmcpOworCXNwaV9iaXRiYW5nX3N0b3AoJnBwLT5iaXRiYW5nKTsKIAogCS8qIHR1cm4gb2ZmIFZDQyAqLwogCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktY2xwczcxMXguYyBiL2RyaXZlcnMvc3BpL3NwaS1jbHBzNzExeC5jCmluZGV4IDM3NGJhNGEuLjRjZDYyZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1jbHBzNzExeC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1jbHBzNzExeC5jCkBAIC0xMSwxNTggKzExLDEyNSBAQAogCiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24vY2xwczcxMXguaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9zcGktY2xwczcxMXguaD4KIAotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLQogI2RlZmluZSBEUklWRVJfTkFNRQkic3BpLWNscHM3MTF4IgogCi1zdHJ1Y3Qgc3BpX2NscHM3MTF4X2RhdGEgewotCXN0cnVjdCBjb21wbGV0aW9uCWRvbmU7CisjZGVmaW5lIFNZTkNJT19GUk1MRU4oeCkJKCh4KSA8PCA4KQorI2RlZmluZSBTWU5DSU9fVFhGUk1FTgkJKDEgPDwgMTQpCiAKK3N0cnVjdCBzcGlfY2xwczcxMXhfZGF0YSB7CisJdm9pZCBfX2lvbWVtCQkqc3luY2lvOworCXN0cnVjdCByZWdtYXAJCSpzeXNjb247CisJc3RydWN0IHJlZ21hcAkJKnN5c2NvbjE7CiAJc3RydWN0IGNsawkJKnNwaV9jbGs7Ci0JdTMyCQkJbWF4X3NwZWVkX2h6OwogCiAJdTgJCQkqdHhfYnVmOwogCXU4CQkJKnJ4X2J1ZjsKLQlpbnQJCQljb3VudDsKKwl1bnNpZ25lZCBpbnQJCWJwdzsKIAlpbnQJCQlsZW47Ci0KLQlpbnQJCQljaGlwc2VsZWN0WzBdOwogfTsKIAogc3RhdGljIGludCBzcGlfY2xwczcxMXhfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlzdHJ1Y3Qgc3BpX2NscHM3MTF4X2RhdGEgKmh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0KIAkvKiBXZSBhcmUgZXhwZWN0IHRoYXQgU1BJLWRldmljZSBpcyBub3Qgc2VsZWN0ZWQgKi8KLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoaHctPmNoaXBzZWxlY3Rbc3BpLT5jaGlwX3NlbGVjdF0sCi0JCQkgICAgICAhKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSk7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHNwaS0+Y3NfZ3BpbywgIShzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNwaV9jbHBzNzExeF9zZXR1cF9tb2RlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCitzdGF0aWMgdm9pZCBzcGlfY2xwczcxMXhfc2V0dXBfeGZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCSAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQogewotCS8qIFNldHVwIGVkZ2UgZm9yIHRyYW5zZmVyICovCi0JaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQotCQljbHBzX3dyaXRldyhjbHBzX3JlYWR3KFNZU0NPTjMpIHwgU1lTQ09OM19BRENDS05TRU4sIFNZU0NPTjMpOwotCWVsc2UKLQkJY2xwc193cml0ZXcoY2xwc19yZWFkdyhTWVNDT04zKSAmIH5TWVNDT04zX0FEQ0NLTlNFTiwgU1lTQ09OMyk7Ci19Ci0KLXN0YXRpYyBpbnQgc3BpX2NscHM3MTF4X3NldHVwX3hmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCQkgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQotewotCXUzMiBzcGVlZCA9IHhmZXItPnNwZWVkX2h6ID8gOiBzcGktPm1heF9zcGVlZF9oejsKLQl1OCBicHcgPSB4ZmVyLT5iaXRzX3Blcl93b3JkOwotCXN0cnVjdCBzcGlfY2xwczcxMXhfZGF0YSAqaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQotCWlmIChicHcgIT0gOCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgIlVuc3VwcG9ydGVkIG1hc3RlciBidXMgd2lkdGggJWlcbiIsIGJwdyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gc3BpLT5tYXN0ZXI7CisJc3RydWN0IHNwaV9jbHBzNzExeF9kYXRhICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAogCS8qIFNldHVwIFNQSSBmcmVxdWVuY3kgZGl2aWRlciAqLwotCWlmICghc3BlZWQgfHwgKHNwZWVkID49IGh3LT5tYXhfc3BlZWRfaHopKQotCQljbHBzX3dyaXRlbCgoY2xwc19yZWFkbChTWVNDT04xKSAmIH5TWVNDT04xX0FEQ0tTRUxfTUFTSykgfAotCQkJICAgIFNZU0NPTjFfQURDS1NFTCgzKSwgU1lTQ09OMSk7Ci0JZWxzZSBpZiAoc3BlZWQgPj0gKGh3LT5tYXhfc3BlZWRfaHogLyAyKSkKLQkJY2xwc193cml0ZWwoKGNscHNfcmVhZGwoU1lTQ09OMSkgJiB+U1lTQ09OMV9BRENLU0VMX01BU0spIHwKLQkJCSAgICBTWVNDT04xX0FEQ0tTRUwoMiksIFNZU0NPTjEpOwotCWVsc2UgaWYgKHNwZWVkID49IChody0+bWF4X3NwZWVkX2h6IC8gOCkpCi0JCWNscHNfd3JpdGVsKChjbHBzX3JlYWRsKFNZU0NPTjEpICYgflNZU0NPTjFfQURDS1NFTF9NQVNLKSB8Ci0JCQkgICAgU1lTQ09OMV9BRENLU0VMKDEpLCBTWVNDT04xKTsKKwlpZiAoeGZlci0+c3BlZWRfaHogPj0gbWFzdGVyLT5tYXhfc3BlZWRfaHopCisJCXJlZ21hcF91cGRhdGVfYml0cyhody0+c3lzY29uMSwgU1lTQ09OX09GRlNFVCwKKwkJCQkgICBTWVNDT04xX0FEQ0tTRUxfTUFTSywgU1lTQ09OMV9BRENLU0VMKDMpKTsKKwllbHNlIGlmICh4ZmVyLT5zcGVlZF9oeiA+PSAobWFzdGVyLT5tYXhfc3BlZWRfaHogLyAyKSkKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGh3LT5zeXNjb24xLCBTWVNDT05fT0ZGU0VULAorCQkJCSAgIFNZU0NPTjFfQURDS1NFTF9NQVNLLCBTWVNDT04xX0FEQ0tTRUwoMikpOworCWVsc2UgaWYgKHhmZXItPnNwZWVkX2h6ID49IChtYXN0ZXItPm1heF9zcGVlZF9oeiAvIDgpKQorCQlyZWdtYXBfdXBkYXRlX2JpdHMoaHctPnN5c2NvbjEsIFNZU0NPTl9PRkZTRVQsCisJCQkJICAgU1lTQ09OMV9BRENLU0VMX01BU0ssIFNZU0NPTjFfQURDS1NFTCgxKSk7CiAJZWxzZQotCQljbHBzX3dyaXRlbCgoY2xwc19yZWFkbChTWVNDT04xKSAmIH5TWVNDT04xX0FEQ0tTRUxfTUFTSykgfAotCQkJICAgIFNZU0NPTjFfQURDS1NFTCgwKSwgU1lTQ09OMSk7Ci0KLQlyZXR1cm4gMDsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGh3LT5zeXNjb24xLCBTWVNDT05fT0ZGU0VULAorCQkJCSAgIFNZU0NPTjFfQURDS1NFTF9NQVNLLCBTWVNDT04xX0FEQ0tTRUwoMCkpOwogfQogCi1zdGF0aWMgaW50IHNwaV9jbHBzNzExeF90cmFuc2Zlcl9vbmVfbWVzc2FnZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAotCQkJCQkgICAgIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQorc3RhdGljIGludCBzcGlfY2xwczcxMXhfcHJlcGFyZV9tZXNzYWdlKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCQkJCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQogewogCXN0cnVjdCBzcGlfY2xwczcxMXhfZGF0YSAqaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcjsKLQlpbnQgc3RhdHVzID0gMCwgY3MgPSBody0+Y2hpcHNlbGVjdFttc2ctPnNwaS0+Y2hpcF9zZWxlY3RdOwotCXUzMiBkYXRhOworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBtc2ctPnNwaTsKIAotCXNwaV9jbHBzNzExeF9zZXR1cF9tb2RlKG1zZy0+c3BpKTsKKwkvKiBTZXR1cCBtb2RlIGZvciB0cmFuc2ZlciAqLworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoaHctPnN5c2NvbiwgU1lTQ09OX09GRlNFVCwgU1lTQ09OM19BRENDS05TRU4sCisJCQkJICAoc3BpLT5tb2RlICYgU1BJX0NQSEEpID8KKwkJCQkgIFNZU0NPTjNfQURDQ0tOU0VOIDogMCk7Cit9CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCQlpZiAoc3BpX2NscHM3MTF4X3NldHVwX3hmZXIobXNnLT5zcGksIHhmZXIpKSB7Ci0JCQlzdGF0dXMgPSAtRUlOVkFMOwotCQkJZ290byBvdXRfeGZyOwotCQl9CitzdGF0aWMgaW50IHNwaV9jbHBzNzExeF90cmFuc2Zlcl9vbmUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKKwkJCQkgICAgIHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJICAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCXN0cnVjdCBzcGlfY2xwczcxMXhfZGF0YSAqaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJdTggZGF0YTsKIAotCQlncGlvX3NldF92YWx1ZShjcywgISEobXNnLT5zcGktPm1vZGUgJiBTUElfQ1NfSElHSCkpOworCXNwaV9jbHBzNzExeF9zZXR1cF94ZmVyKHNwaSwgeGZlcik7CiAKLQkJcmVpbml0X2NvbXBsZXRpb24oJmh3LT5kb25lKTsKKwlody0+bGVuID0geGZlci0+bGVuOworCWh3LT5icHcgPSB4ZmVyLT5iaXRzX3Blcl93b3JkOworCWh3LT50eF9idWYgPSAodTggKil4ZmVyLT50eF9idWY7CisJaHctPnJ4X2J1ZiA9ICh1OCAqKXhmZXItPnJ4X2J1ZjsKIAotCQlody0+Y291bnQgPSAwOwotCQlody0+bGVuID0geGZlci0+bGVuOwotCQlody0+dHhfYnVmID0gKHU4ICopeGZlci0+dHhfYnVmOwotCQlody0+cnhfYnVmID0gKHU4ICopeGZlci0+cnhfYnVmOworCS8qIEluaXRpYXRlIHRyYW5zZmVyICovCisJZGF0YSA9IGh3LT50eF9idWYgPyAqaHctPnR4X2J1ZisrIDogMDsKKwl3cml0ZWwoZGF0YSB8IFNZTkNJT19GUk1MRU4oaHctPmJwdykgfCBTWU5DSU9fVFhGUk1FTiwgaHctPnN5bmNpbyk7CiAKLQkJLyogSW5pdGlhdGUgdHJhbnNmZXIgKi8KLQkJZGF0YSA9IGh3LT50eF9idWYgPyBody0+dHhfYnVmW2h3LT5jb3VudF0gOiAwOwotCQljbHBzX3dyaXRlbChkYXRhIHwgU1lOQ0lPX0ZSTUxFTig4KSB8IFNZTkNJT19UWEZSTUVOLCBTWU5DSU8pOwotCi0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJmh3LT5kb25lKTsKLQotCQlpZiAoeGZlci0+ZGVsYXlfdXNlY3MpCi0JCQl1ZGVsYXkoeGZlci0+ZGVsYXlfdXNlY3MpOwotCi0JCWlmICh4ZmVyLT5jc19jaGFuZ2UgfHwKLQkJICAgIGxpc3RfaXNfbGFzdCgmeGZlci0+dHJhbnNmZXJfbGlzdCwgJm1zZy0+dHJhbnNmZXJzKSkKLQkJCWdwaW9fc2V0X3ZhbHVlKGNzLCAhKG1zZy0+c3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKTsKLQotCQltc2ctPmFjdHVhbF9sZW5ndGggKz0geGZlci0+bGVuOwotCX0KLQotb3V0X3hmcjoKLQltc2ctPnN0YXR1cyA9IHN0YXR1czsKLQlzcGlfZmluYWxpemVfY3VycmVudF9tZXNzYWdlKG1hc3Rlcik7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IHNwaV9jbHBzNzExeF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXN0cnVjdCBzcGlfY2xwczcxMXhfZGF0YSAqaHcgPSAoc3RydWN0IHNwaV9jbHBzNzExeF9kYXRhICopZGV2X2lkOwotCXUzMiBkYXRhOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfaWQ7CisJc3RydWN0IHNwaV9jbHBzNzExeF9kYXRhICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwl1OCBkYXRhOwogCiAJLyogSGFuZGxlIFJYICovCi0JZGF0YSA9IGNscHNfcmVhZGIoU1lOQ0lPKTsKKwlkYXRhID0gcmVhZGIoaHctPnN5bmNpbyk7CiAJaWYgKGh3LT5yeF9idWYpCi0JCWh3LT5yeF9idWZbaHctPmNvdW50XSA9ICh1OClkYXRhOwotCi0JaHctPmNvdW50Kys7CisJCSpody0+cnhfYnVmKysgPSBkYXRhOwogCiAJLyogSGFuZGxlIFRYICovCi0JaWYgKGh3LT5jb3VudCA8IGh3LT5sZW4pIHsKLQkJZGF0YSA9IGh3LT50eF9idWYgPyBody0+dHhfYnVmW2h3LT5jb3VudF0gOiAwOwotCQljbHBzX3dyaXRlbChkYXRhIHwgU1lOQ0lPX0ZSTUxFTig4KSB8IFNZTkNJT19UWEZSTUVOLCBTWU5DSU8pOworCWlmICgtLWh3LT5sZW4gPiAwKSB7CisJCWRhdGEgPSBody0+dHhfYnVmID8gKmh3LT50eF9idWYrKyA6IDA7CisJCXdyaXRlbChkYXRhIHwgU1lOQ0lPX0ZSTUxFTihody0+YnB3KSB8IFNZTkNJT19UWEZSTUVOLAorCQkgICAgICAgaHctPnN5bmNpbyk7CiAJfSBlbHNlCi0JCWNvbXBsZXRlKCZody0+ZG9uZSk7CisJCXNwaV9maW5hbGl6ZV9jdXJyZW50X3RyYW5zZmVyKG1hc3Rlcik7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIHN0YXRpYyBpbnQgc3BpX2NscHM3MTF4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JaW50IGksIHJldDsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwogCXN0cnVjdCBzcGlfY2xwczcxMXhfZGF0YSAqaHc7CiAJc3RydWN0IHNwaV9jbHBzNzExeF9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGksIGlycSwgcmV0OwogCiAJaWYgKCFwZGF0YSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhIHN1cHBsaWVkXG4iKTsKQEAgLTE3NCwzMyArMTQxLDM3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwKLQkJCQkgIHNpemVvZihzdHJ1Y3Qgc3BpX2NscHM3MTF4X2RhdGEpICsKLQkJCQkgIHNpemVvZihpbnQpICogcGRhdGEtPm51bV9jaGlwc2VsZWN0KTsKLQlpZiAoIW1hc3RlcikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJTUEkgYWxsb2NhdGluZyBtZW1vcnkgZXJyb3JcbiIpOworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApCisJCXJldHVybiBpcnE7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZigqaHcpKTsKKwlpZiAoIW1hc3RlcikKIAkJcmV0dXJuIC1FTk9NRU07CisKKwltYXN0ZXItPmNzX2dwaW9zID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihpbnQpICoKKwkJCQkJcGRhdGEtPm51bV9jaGlwc2VsZWN0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1hc3Rlci0+Y3NfZ3Bpb3MpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OwogCX0KIAogCW1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmlkOwogCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQSEEgfCBTUElfQ1NfSElHSDsKLQltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfTUFTSyg4KTsKKwltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9ICBTUElfQlBXX1JBTkdFX01BU0soMSwgOCk7CiAJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IHBkYXRhLT5udW1fY2hpcHNlbGVjdDsKIAltYXN0ZXItPnNldHVwID0gc3BpX2NscHM3MTF4X3NldHVwOwotCW1hc3Rlci0+dHJhbnNmZXJfb25lX21lc3NhZ2UgPSBzcGlfY2xwczcxMXhfdHJhbnNmZXJfb25lX21lc3NhZ2U7CisJbWFzdGVyLT5wcmVwYXJlX21lc3NhZ2UgPSBzcGlfY2xwczcxMXhfcHJlcGFyZV9tZXNzYWdlOworCW1hc3Rlci0+dHJhbnNmZXJfb25lID0gc3BpX2NscHM3MTF4X3RyYW5zZmVyX29uZTsKIAogCWh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCiAJZm9yIChpID0gMDsgaSA8IG1hc3Rlci0+bnVtX2NoaXBzZWxlY3Q7IGkrKykgewotCQlody0+Y2hpcHNlbGVjdFtpXSA9IHBkYXRhLT5jaGlwc2VsZWN0W2ldOwotCQlpZiAoIWdwaW9faXNfdmFsaWQoaHctPmNoaXBzZWxlY3RbaV0pKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJbnZhbGlkIENTIEdQSU8gJWlcbiIsIGkpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyX291dDsKLQkJfQotCQlpZiAoZGV2bV9ncGlvX3JlcXVlc3QoJnBkZXYtPmRldiwgaHctPmNoaXBzZWxlY3RbaV0sIE5VTEwpKSB7CisJCW1hc3Rlci0+Y3NfZ3Bpb3NbaV0gPSBwZGF0YS0+Y2hpcHNlbGVjdFtpXTsKKwkJcmV0ID0gZGV2bV9ncGlvX3JlcXVlc3QoJnBkZXYtPmRldiwgbWFzdGVyLT5jc19ncGlvc1tpXSwKKwkJCQkJRFJJVkVSX05BTUUpOworCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBnZXQgQ1MgR1BJTyAlaVxuIiwgaSk7Ci0JCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBlcnJfb3V0OwogCQl9CiAJfQpAQCAtMjExLDI5ICsxODIsNDUgQEAKIAkJcmV0ID0gUFRSX0VSUihody0+c3BpX2Nsayk7CiAJCWdvdG8gZXJyX291dDsKIAl9Ci0JaHctPm1heF9zcGVlZF9oeiA9IGNsa19nZXRfcmF0ZShody0+c3BpX2Nsayk7CisJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSBjbGtfZ2V0X3JhdGUoaHctPnNwaV9jbGspOwogCi0JaW5pdF9jb21wbGV0aW9uKCZody0+ZG9uZSk7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKIAotCS8qIERpc2FibGUgZXh0ZW5kZWQgbW9kZSBkdWUgaGFyZHdhcmUgcHJvYmxlbXMgKi8KLQljbHBzX3dyaXRldyhjbHBzX3JlYWR3KFNZU0NPTjMpICYgflNZU0NPTjNfQURDQ09OLCBTWVNDT04zKTsKLQotCS8qIENsZWFyIHBvc3NpYmxlIHBlbmRpbmcgaW50ZXJydXB0ICovCi0JY2xwc19yZWFkbChTWU5DSU8pOwotCi0JcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBJUlFfU1NFT1RJLCBzcGlfY2xwczcxMXhfaXNyLCAwLAotCQkJICAgICAgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBodyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCByZXF1ZXN0IElSUVxuIik7CisJaHctPnN5c2NvbiA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X3BkZXZuYW1lKCJzeXNjb24uMyIpOworCWlmIChJU19FUlIoaHctPnN5c2NvbikpIHsKKwkJcmV0ID0gUFRSX0VSUihody0+c3lzY29uKTsKIAkJZ290byBlcnJfb3V0OwogCX0KIAorCWh3LT5zeXNjb24xID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfcGRldm5hbWUoInN5c2Nvbi4xIik7CisJaWYgKElTX0VSUihody0+c3lzY29uMSkpIHsKKwkJcmV0ID0gUFRSX0VSUihody0+c3lzY29uMSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWh3LT5zeW5jaW8gPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGh3LT5zeW5jaW8pKSB7CisJCXJldCA9IFBUUl9FUlIoaHctPnN5bmNpbyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBEaXNhYmxlIGV4dGVuZGVkIG1vZGUgZHVlIGhhcmR3YXJlIHByb2JsZW1zICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKGh3LT5zeXNjb24sIFNZU0NPTl9PRkZTRVQsIFNZU0NPTjNfQURDQ09OLCAwKTsKKworCS8qIENsZWFyIHBvc3NpYmxlIHBlbmRpbmcgaW50ZXJydXB0ICovCisJcmVhZGwoaHctPnN5bmNpbyk7CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgc3BpX2NscHM3MTF4X2lzciwgMCwKKwkJCSAgICAgICBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgbWFzdGVyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9vdXQ7CisKIAlyZXQgPSBkZXZtX3NwaV9yZWdpc3Rlcl9tYXN0ZXIoJnBkZXYtPmRldiwgbWFzdGVyKTsKIAlpZiAoIXJldCkgewogCQlkZXZfaW5mbygmcGRldi0+ZGV2LAogCQkJICJTUEkgYnVzIGRyaXZlciBpbml0aWFsaXplZC4gTWFzdGVyIGNsb2NrICV1IEh6XG4iLAotCQkJIGh3LT5tYXhfc3BlZWRfaHopOworCQkJIG1hc3Rlci0+bWF4X3NwZWVkX2h6KTsKIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktY29sZGZpcmUtcXNwaS5jIGIvZHJpdmVycy9zcGkvc3BpLWNvbGRmaXJlLXFzcGkuYwppbmRleCAyOGFlNDcwLi5lMmZhNjI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktY29sZGZpcmUtcXNwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1jb2xkZmlyZS1xc3BpLmMKQEAgLTc3LDggKzc3LDYgQEAKIAlzdHJ1Y3QgbWNmcXNwaV9jc19jb250cm9sICpjc19jb250cm9sOwogCiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdHE7Ci0KLQlzdHJ1Y3QgZGV2aWNlICpkZXY7CiB9OwogCiBzdGF0aWMgdm9pZCBtY2Zxc3BpX3dyX3FtcihzdHJ1Y3QgbWNmcXNwaSAqbWNmcXNwaSwgdTE2IHZhbCkKQEAgLTEzNSwxMyArMTMzLDEzIEBACiAKIHN0YXRpYyBpbnQgbWNmcXNwaV9jc19zZXR1cChzdHJ1Y3QgbWNmcXNwaSAqbWNmcXNwaSkKIHsKLQlyZXR1cm4gKG1jZnFzcGktPmNzX2NvbnRyb2wgJiYgbWNmcXNwaS0+Y3NfY29udHJvbC0+c2V0dXApID8KKwlyZXR1cm4gKG1jZnFzcGktPmNzX2NvbnRyb2wtPnNldHVwKSA/CiAJCW1jZnFzcGktPmNzX2NvbnRyb2wtPnNldHVwKG1jZnFzcGktPmNzX2NvbnRyb2wpIDogMDsKIH0KIAogc3RhdGljIHZvaWQgbWNmcXNwaV9jc190ZWFyZG93bihzdHJ1Y3QgbWNmcXNwaSAqbWNmcXNwaSkKIHsKLQlpZiAobWNmcXNwaS0+Y3NfY29udHJvbCAmJiBtY2Zxc3BpLT5jc19jb250cm9sLT50ZWFyZG93bikKKwlpZiAobWNmcXNwaS0+Y3NfY29udHJvbC0+dGVhcmRvd24pCiAJCW1jZnFzcGktPmNzX2NvbnRyb2wtPnRlYXJkb3duKG1jZnFzcGktPmNzX2NvbnRyb2wpOwogfQogCkBAIC0zMDAsNjggKzI5OCw0NSBAQAogCX0KIH0KIAotc3RhdGljIGludCBtY2Zxc3BpX3RyYW5zZmVyX29uZV9tZXNzYWdlKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCi0JCQkJCSBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKK3N0YXRpYyB2b2lkIG1jZnFzcGlfc2V0X2NzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBtY2Zxc3BpICptY2Zxc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJYm9vbCBjc19oaWdoID0gc3BpLT5tb2RlICYgU1BJX0NTX0hJR0g7CisKKwlpZiAoZW5hYmxlKQorCQltY2Zxc3BpX2NzX3NlbGVjdChtY2Zxc3BpLCBzcGktPmNoaXBfc2VsZWN0LCBjc19oaWdoKTsKKwllbHNlCisJCW1jZnFzcGlfY3NfZGVzZWxlY3QobWNmcXNwaSwgc3BpLT5jaGlwX3NlbGVjdCwgY3NfaGlnaCk7Cit9CisKK3N0YXRpYyBpbnQgbWNmcXNwaV90cmFuc2Zlcl9vbmUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKKwkJCQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCiB7CiAJc3RydWN0IG1jZnFzcGkgKm1jZnFzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IG1zZy0+c3BpOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7Ci0JaW50IHN0YXR1cyA9IDA7CisJdTE2IHFtciA9IE1DRlFTUElfUU1SX01TVFI7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCQlib29sIGNzX2hpZ2ggPSBzcGktPm1vZGUgJiBTUElfQ1NfSElHSDsKLQkJdTE2IHFtciA9IE1DRlFTUElfUU1SX01TVFI7CisJcW1yIHw9IHQtPmJpdHNfcGVyX3dvcmQgPDwgMTA7CisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQorCQlxbXIgfD0gTUNGUVNQSV9RTVJfQ1BIQTsKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCisJCXFtciB8PSBNQ0ZRU1BJX1FNUl9DUE9MOworCXFtciB8PSBtY2Zxc3BpX3Ftcl9iYXVkKHQtPnNwZWVkX2h6KTsKKwltY2Zxc3BpX3dyX3FtcihtY2Zxc3BpLCBxbXIpOwogCi0JCXFtciB8PSB0LT5iaXRzX3Blcl93b3JkIDw8IDEwOwotCQlpZiAoc3BpLT5tb2RlICYgU1BJX0NQSEEpCi0JCQlxbXIgfD0gTUNGUVNQSV9RTVJfQ1BIQTsKLQkJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUE9MKQotCQkJcW1yIHw9IE1DRlFTUElfUU1SX0NQT0w7Ci0JCWlmICh0LT5zcGVlZF9oeikKLQkJCXFtciB8PSBtY2Zxc3BpX3Ftcl9iYXVkKHQtPnNwZWVkX2h6KTsKLQkJZWxzZQotCQkJcW1yIHw9IG1jZnFzcGlfcW1yX2JhdWQoc3BpLT5tYXhfc3BlZWRfaHopOwotCQltY2Zxc3BpX3dyX3FtcihtY2Zxc3BpLCBxbXIpOworCW1jZnFzcGlfd3JfcWlyKG1jZnFzcGksIE1DRlFTUElfUUlSX1NQSUZFKTsKKwlpZiAodC0+Yml0c19wZXJfd29yZCA9PSA4KQorCQltY2Zxc3BpX3RyYW5zZmVyX21zZzgobWNmcXNwaSwgdC0+bGVuLCB0LT50eF9idWYsIHQtPnJ4X2J1Zik7CisJZWxzZQorCQltY2Zxc3BpX3RyYW5zZmVyX21zZzE2KG1jZnFzcGksIHQtPmxlbiAvIDIsIHQtPnR4X2J1ZiwKKwkJCQkgICAgICAgdC0+cnhfYnVmKTsKKwltY2Zxc3BpX3dyX3FpcihtY2Zxc3BpLCAwKTsKIAotCQltY2Zxc3BpX2NzX3NlbGVjdChtY2Zxc3BpLCBzcGktPmNoaXBfc2VsZWN0LCBjc19oaWdoKTsKLQotCQltY2Zxc3BpX3dyX3FpcihtY2Zxc3BpLCBNQ0ZRU1BJX1FJUl9TUElGRSk7Ci0JCWlmICh0LT5iaXRzX3Blcl93b3JkID09IDgpCi0JCQltY2Zxc3BpX3RyYW5zZmVyX21zZzgobWNmcXNwaSwgdC0+bGVuLCB0LT50eF9idWYsCi0JCQkJCXQtPnJ4X2J1Zik7Ci0JCWVsc2UKLQkJCW1jZnFzcGlfdHJhbnNmZXJfbXNnMTYobWNmcXNwaSwgdC0+bGVuIC8gMiwgdC0+dHhfYnVmLAotCQkJCQl0LT5yeF9idWYpOwotCQltY2Zxc3BpX3dyX3FpcihtY2Zxc3BpLCAwKTsKLQotCQlpZiAodC0+ZGVsYXlfdXNlY3MpCi0JCQl1ZGVsYXkodC0+ZGVsYXlfdXNlY3MpOwotCQlpZiAodC0+Y3NfY2hhbmdlKSB7Ci0JCQlpZiAoIWxpc3RfaXNfbGFzdCgmdC0+dHJhbnNmZXJfbGlzdCwgJm1zZy0+dHJhbnNmZXJzKSkKLQkJCQltY2Zxc3BpX2NzX2Rlc2VsZWN0KG1jZnFzcGksIHNwaS0+Y2hpcF9zZWxlY3QsCi0JCQkJCQljc19oaWdoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChsaXN0X2lzX2xhc3QoJnQtPnRyYW5zZmVyX2xpc3QsICZtc2ctPnRyYW5zZmVycykpCi0JCQkJbWNmcXNwaV9jc19kZXNlbGVjdChtY2Zxc3BpLCBzcGktPmNoaXBfc2VsZWN0LAotCQkJCQkJY3NfaGlnaCk7Ci0JCX0KLQkJbXNnLT5hY3R1YWxfbGVuZ3RoICs9IHQtPmxlbjsKLQl9Ci0JbXNnLT5zdGF0dXMgPSBzdGF0dXM7Ci0Jc3BpX2ZpbmFsaXplX2N1cnJlbnRfbWVzc2FnZShtYXN0ZXIpOwotCi0JcmV0dXJuIHN0YXR1czsKLQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG1jZnFzcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlpZiAoc3BpLT5jaGlwX3NlbGVjdCA+PSBzcGktPm1hc3Rlci0+bnVtX2NoaXBzZWxlY3QpIHsKLQkJZGV2X2RiZygmc3BpLT5kZXYsICIlZCBjaGlwIHNlbGVjdCBpcyBvdXQgb2YgcmFuZ2VcbiIsCi0JCQlzcGktPmNoaXBfc2VsZWN0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJbWNmcXNwaV9jc19kZXNlbGVjdChzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKSwKIAkJCSAgICBzcGktPmNoaXBfc2VsZWN0LCBzcGktPm1vZGUgJiBTUElfQ1NfSElHSCk7CiAKQEAgLTM4OCw2ICszNjMsMTEgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCisJaWYgKCFwZGF0YS0+Y3NfY29udHJvbCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJwZGF0YS0+Y3NfY29udHJvbCBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2YoKm1jZnFzcGkpKTsKIAlpZiAobWFzdGVyID09IE5VTEwpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAic3BpX2FsbG9jX21hc3RlciBmYWlsZWRcbiIpOwpAQCAtNDM2LDEyICs0MTYsMTIgQEAKIAl9CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtY2Zxc3BpLT53YWl0cSk7Ci0JbWNmcXNwaS0+ZGV2ID0gJnBkZXYtPmRldjsKIAogCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NTX0hJR0ggfCBTUElfQ1BPTCB8IFNQSV9DUEhBOwogCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19SQU5HRV9NQVNLKDgsIDE2KTsKIAltYXN0ZXItPnNldHVwID0gbWNmcXNwaV9zZXR1cDsKLQltYXN0ZXItPnRyYW5zZmVyX29uZV9tZXNzYWdlID0gbWNmcXNwaV90cmFuc2Zlcl9vbmVfbWVzc2FnZTsKKwltYXN0ZXItPnNldF9jcyA9IG1jZnFzcGlfc2V0X2NzOworCW1hc3Rlci0+dHJhbnNmZXJfb25lID0gbWNmcXNwaV90cmFuc2Zlcl9vbmU7CiAJbWFzdGVyLT5hdXRvX3J1bnRpbWVfcG0gPSB0cnVlOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKQEAgLTQ1MSw3ICs0MzEsNyBAQAogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJzcGlfcmVnaXN0ZXJfbWFzdGVyIGZhaWxlZFxuIik7CiAJCWdvdG8gZmFpbDI7CiAJfQotCXBtX3J1bnRpbWVfZW5hYmxlKG1jZnFzcGktPmRldik7CisJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CiAKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQ29sZGZpcmUgUVNQSSBidXMgZHJpdmVyXG4iKTsKIApAQCAtNDczLDkgKzQ1Myw4IEBACiB7CiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBtY2Zxc3BpICptY2Zxc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAotCXBtX3J1bnRpbWVfZGlzYWJsZShtY2Zxc3BpLT5kZXYpOworCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIAkvKiBkaXNhYmxlIHRoZSBoYXJkd2FyZSAoc2V0IHRoZSBiYXVkIHJhdGUgdG8gMCkgKi8KIAltY2Zxc3BpX3dyX3FtcihtY2Zxc3BpLCBNQ0ZRU1BJX1FNUl9NU1RSKTsKIApAQCAtNDkwLDggKzQ2OSwxMSBAQAogewogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgbWNmcXNwaSAqbWNmcXNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpbnQgcmV0OwogCi0Jc3BpX21hc3Rlcl9zdXNwZW5kKG1hc3Rlcik7CisJcmV0ID0gc3BpX21hc3Rlcl9zdXNwZW5kKG1hc3Rlcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWNsa19kaXNhYmxlKG1jZnFzcGktPmNsayk7CiAKQEAgLTUwMywxMSArNDg1LDkgQEAKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IG1jZnFzcGkgKm1jZnFzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAKLQlzcGlfbWFzdGVyX3Jlc3VtZShtYXN0ZXIpOwotCiAJY2xrX2VuYWJsZShtY2Zxc3BpLT5jbGspOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHNwaV9tYXN0ZXJfcmVzdW1lKG1hc3Rlcik7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWRhdmluY2kuYyBiL2RyaXZlcnMvc3BpL3NwaS1kYXZpbmNpLmMKaW5kZXggNWU3Mzg5Zi4uNTBmNzUwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWRhdmluY2kuYworKysgYi9kcml2ZXJzL3NwaS9zcGktZGF2aW5jaS5jCkBAIC04MDIsOCArODAyLDcgQEAKIAlwZGF0YSA9ICZkc3BpLT5wZGF0YTsKIAogCXBkYXRhLT52ZXJzaW9uID0gU1BJX1ZFUlNJT05fMTsKLQltYXRjaCA9IG9mX21hdGNoX2RldmljZShvZl9tYXRjaF9wdHIoZGF2aW5jaV9zcGlfb2ZfbWF0Y2gpLAotCQkJCSZwZGV2LT5kZXYpOworCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKGRhdmluY2lfc3BpX29mX21hdGNoLCAmcGRldi0+ZGV2KTsKIAlpZiAoIW1hdGNoKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtODI0LDcgKzgyMyw2IEBACiAJcmV0dXJuIDA7CiB9CiAjZWxzZQotI2RlZmluZSBkYXZpbmNpX3NwaV9vZl9tYXRjaCBOVUxMCiBzdGF0aWMgc3RydWN0IGRhdmluY2lfc3BpX3BsYXRmb3JtX2RhdGEKIAkqc3BpX2RhdmluY2lfZ2V0X3BkYXRhKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCiAJCXN0cnVjdCBkYXZpbmNpX3NwaSAqZHNwaSkKQEAgLTg2NCwxMCArODYyLDYgQEAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOwogCiAJZHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlpZiAoZHNwaSA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9FTlQ7Ci0JCWdvdG8gZnJlZV9tYXN0ZXI7Ci0JfQogCiAJaWYgKGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldikpIHsKIAkJcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwpAQCAtOTA4LDEwICs5MDIsNiBAQAogCQlnb3RvIGZyZWVfbWFzdGVyOwogCiAJZHNwaS0+Yml0YmFuZy5tYXN0ZXIgPSBtYXN0ZXI7Ci0JaWYgKGRzcGktPmJpdGJhbmcubWFzdGVyID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBmcmVlX21hc3RlcjsKLQl9CiAKIAlkc3BpLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUihkc3BpLT5jbGspKSB7CkBAIC0xMDQwLDcgKzEwMzAsNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gInNwaV9kYXZpbmNpIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IGRhdmluY2lfc3BpX29mX21hdGNoLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoZGF2aW5jaV9zcGlfb2ZfbWF0Y2gpLAogCX0sCiAJLnByb2JlID0gZGF2aW5jaV9zcGlfcHJvYmUsCiAJLnJlbW92ZSA9IGRhdmluY2lfc3BpX3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1kdy1tbWlvLmMgYi9kcml2ZXJzL3NwaS9zcGktZHctbW1pby5jCmluZGV4IDlhZjU2Y2QuLjE0OTJmNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1kdy1tbWlvLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWR3LW1taW8uYwpAQCAtNjYsNyArNjYsNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlkd3MtPmJ1c19udW0gPSAwOworCWR3cy0+YnVzX251bSA9IHBkZXYtPmlkOwogCWR3cy0+bnVtX2NzID0gNDsKIAlkd3MtPm1heF9mcmVxID0gY2xrX2dldF9yYXRlKGR3c21taW8tPmNsayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1kdy5jIGIvZHJpdmVycy9zcGkvc3BpLWR3LmMKaW5kZXggYmY5OGQ2My4uNzEyYWM1NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1kdy5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1kdy5jCkBAIC0yNzYsOCArMjc2LDcgQEAKIAlxdWV1ZV93b3JrKGR3cy0+d29ya3F1ZXVlLCAmZHdzLT5wdW1wX21lc3NhZ2VzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkd3MtPmxvY2ssIGZsYWdzKTsKIAotCWxhc3RfdHJhbnNmZXIgPSBsaXN0X2VudHJ5KG1zZy0+dHJhbnNmZXJzLnByZXYsCi0JCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIsCisJbGFzdF90cmFuc2ZlciA9IGxpc3RfbGFzdF9lbnRyeSgmbXNnLT50cmFuc2ZlcnMsIHN0cnVjdCBzcGlfdHJhbnNmZXIsCiAJCQkJCXRyYW5zZmVyX2xpc3QpOwogCiAJaWYgKCFsYXN0X3RyYW5zZmVyLT5jc19jaGFuZ2UgJiYgZHdzLT5jc19jb250cm9sKQpAQCAtNDM5LDEyICs0MzgsNiBAQAogCiAJCWlmICh0cmFuc2Zlci0+c3BlZWRfaHogIT0gc3BlZWQpIHsKIAkJCXNwZWVkID0gdHJhbnNmZXItPnNwZWVkX2h6OwotCQkJaWYgKHNwZWVkID4gZHdzLT5tYXhfZnJlcSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiTVJTVCBTUEkwOiB1bnN1cHBvcnRlZCIKLQkJCQkJImZyZXE6ICVkSHpcbiIsIHNwZWVkKTsKLQkJCQltZXNzYWdlLT5zdGF0dXMgPSAtRUlPOwotCQkJCWdvdG8gZWFybHlfZXhpdDsKLQkJCX0KIAogCQkJLyogY2xrX2RpdiBkb2Vzbid0IHN1cHBvcnQgb2RkIG51bWJlciAqLwogCQkJY2xrX2RpdiA9IGR3cy0+bWF4X2ZyZXEgLyBzcGVlZDsKQEAgLTY3MSwxMiArNjY0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZHdfc3BpX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgY2hpcF9kYXRhICpjaGlwID0gc3BpX2dldF9jdGxkYXRhKHNwaSk7Ci0Ja2ZyZWUoY2hpcCk7Ci19Ci0KIHN0YXRpYyBpbnQgaW5pdF9xdWV1ZShzdHJ1Y3QgZHdfc3BpICpkd3MpCiB7CiAJSU5JVF9MSVNUX0hFQUQoJmR3cy0+cXVldWUpOwpAQCAtODA2LDkgKzc5Myw5IEBACiAJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soOCkgfCBTUElfQlBXX01BU0soMTYpOwogCW1hc3Rlci0+YnVzX251bSA9IGR3cy0+YnVzX251bTsKIAltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gZHdzLT5udW1fY3M7Ci0JbWFzdGVyLT5jbGVhbnVwID0gZHdfc3BpX2NsZWFudXA7CiAJbWFzdGVyLT5zZXR1cCA9IGR3X3NwaV9zZXR1cDsKIAltYXN0ZXItPnRyYW5zZmVyID0gZHdfc3BpX3RyYW5zZmVyOworCW1hc3Rlci0+bWF4X3NwZWVkX2h6ID0gZHdzLT5tYXhfZnJlcTsKIAogCS8qIEJhc2ljIEhXIGluaXQgKi8KIAlzcGlfaHdfaW5pdChkd3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWVmbTMyLmMgYi9kcml2ZXJzL3NwaS9zcGktZWZtMzIuYwppbmRleCBkNGQzY2M1Li5iZTQ0YTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZWZtMzIuYworKysgYi9kcml2ZXJzL3NwaS9zcGktZWZtMzIuYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAKIAllZm0zMl9zcGlfZmlsbHR4KGRkYXRhKTsKIAotCWluaXRfY29tcGxldGlvbigmZGRhdGEtPmRvbmUpOworCXJlaW5pdF9jb21wbGV0aW9uKCZkZGF0YS0+ZG9uZSk7CiAKIAllZm0zMl9zcGlfd3JpdGUzMihkZGF0YSwgUkVHX0lGX1RYQkwgfCBSRUdfSUZfUlhEQVRBViwgUkVHX0lFTik7CiAKQEAgLTI4NywxNyArMjg3LDE3IEBACiAJcmV0dXJuIChyZWcgJiBSRUdfUk9VVEVfTE9DQVRJT05fX01BU0spID4+IF9fZmZzKFJFR19ST1VURV9MT0NBVElPTl9fTUFTSyk7CiB9CiAKLXN0YXRpYyBpbnQgZWZtMzJfc3BpX3Byb2JlX2R0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCitzdGF0aWMgdm9pZCBlZm0zMl9zcGlfcHJvYmVfZHQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKIAkJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IGVmbTMyX3NwaV9kZGF0YSAqZGRhdGEpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwogCXUzMiBsb2NhdGlvbjsKIAlpbnQgcmV0OwogCi0JaWYgKCFucCkKLQkJcmV0dXJuIDE7Ci0KLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImxvY2F0aW9uIiwgJmxvY2F0aW9uKTsKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImVmbTMyLGxvY2F0aW9uIiwgJmxvY2F0aW9uKTsKKwlpZiAocmV0KQorCQkvKiBmYWxsIGJhY2sgdG8gb2xkIGFuZCAod3JvbmdseSkgZ2VuZXJpYyBwcm9wZXJ0eSAibG9jYXRpb24iICovCisJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibG9jYXRpb24iLCAmbG9jYXRpb24pOwogCWlmICghcmV0KSB7CiAJCWRldl9kYmcoJnBkZXYtPmRldiwgInVzaW5nIGxvY2F0aW9uICV1XG4iLCBsb2NhdGlvbik7CiAJfSBlbHNlIHsKQEAgLTMwOCwxMSArMzA4LDYgQEAKIAl9CiAKIAlkZGF0YS0+cGRhdGEubG9jYXRpb24gPSBsb2NhdGlvbjsKLQotCS8qIHNwaSBjb3JlIHRha2VzIGNhcmUgYWJvdXQgdGhlIGJ1cyBudW1iZXIgdXNpbmcgYW4gYWxpYXMgKi8KLQltYXN0ZXItPmJ1c19udW0gPSAtMTsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGVmbTMyX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtMzIyLDkgKzMxNywxNCBAQAogCWludCByZXQ7CiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7Ci0JdW5zaWduZWQgaW50IG51bV9jcywgaTsKKwlpbnQgbnVtX2NzLCBpOworCisJaWYgKCFucCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAludW1fY3MgPSBvZl9ncGlvX25hbWVkX2NvdW50KG5wLCAiY3MtZ3Bpb3MiKTsKKwlpZiAobnVtX2NzIDwgMCkKKwkJcmV0dXJuIG51bV9jczsKIAogCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwKIAkJCXNpemVvZigqZGRhdGEpICsgbnVtX2NzICogc2l6ZW9mKHVuc2lnbmVkKSk7CkBAIC0zNDksNiArMzQ5LDcgQEAKIAlkZGF0YS0+Yml0YmFuZy50eHJ4X2J1ZnMgPSBlZm0zMl9zcGlfdHhyeF9idWZzOwogCiAJc3Bpbl9sb2NrX2luaXQoJmRkYXRhLT5sb2NrKTsKKwlpbml0X2NvbXBsZXRpb24oJmRkYXRhLT5kb25lKTsKIAogCWRkYXRhLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUihkZGF0YS0+Y2xrKSkgewpAQCAtNDE1LDIzICs0MTYsNyBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQlyZXQgPSBlZm0zMl9zcGlfcHJvYmVfZHQocGRldiwgbWFzdGVyLCBkZGF0YSk7Ci0JaWYgKHJldCA+IDApIHsKLQkJLyogbm90IGNyZWF0ZWQgYnkgZGV2aWNlIHRyZWUgKi8KLQkJY29uc3Qgc3RydWN0IGVmbTMyX3NwaV9wZGF0YSAqcGRhdGEgPQotCQkJZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKLQotCQlpZiAocGRhdGEpCi0JCQlkZGF0YS0+cGRhdGEgPSAqcGRhdGE7Ci0JCWVsc2UKLQkJCWRkYXRhLT5wZGF0YS5sb2NhdGlvbiA9Ci0JCQkJZWZtMzJfc3BpX2dldF9jb25maWd1cmVkX2xvY2F0aW9uKGRkYXRhKTsKLQotCQltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKLQotCX0gZWxzZSBpZiAocmV0IDwgMCkgewotCQlnb3RvIGVycl9kaXNhYmxlX2NsazsKLQl9CisJZWZtMzJfc3BpX3Byb2JlX2R0KHBkZXYsIG1hc3RlciwgZGRhdGEpOwogCiAJZWZtMzJfc3BpX3dyaXRlMzIoZGRhdGEsIDAsIFJFR19JRU4pOwogCWVmbTMyX3NwaV93cml0ZTMyKGRkYXRhLCBSRUdfUk9VVEVfVFhQRU4gfCBSRUdfUk9VVEVfUlhQRU4gfApAQCAtNDg3LDYgKzQ3Miw5IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGVmbTMyX3NwaV9kdF9pZHNbXSA9IHsKIAl7CisJCS5jb21wYXRpYmxlID0gImVuZXJneW1pY3JvLGVmbTMyLXNwaSIsCisJfSwgeworCQkvKiBkb2Vzbid0IGZvbGxvdyB0aGUgInZlbmRvcixkZXZpY2UiIHNjaGVtZSwgZG9uJ3QgdXNlICovCiAJCS5jb21wYXRpYmxlID0gImVmbTMyLHNwaSIsCiAJfSwgewogCQkvKiBzZW50aW5lbCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWVwOTN4eC5jIGIvZHJpdmVycy9zcGkvc3BpLWVwOTN4eC5jCmluZGV4IDFiZmFlZDYuLjJmNjc1ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1lcDkzeHguYworKysgYi9kcml2ZXJzL3NwaS9zcGktZXA5M3h4LmMKQEAgLTczLDggKzczLDYgQEAKICAqIEBjbGs6IGNsb2NrIGZvciB0aGUgY29udHJvbGxlcgogICogQHJlZ3NfYmFzZTogcG9pbnRlciB0byBpb3JlbWFwKCknZCByZWdpc3RlcnMKICAqIEBzc3Bkcl9waHlzOiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBTU1BEUiByZWdpc3RlcgotICogQG1pbl9yYXRlOiBtaW5pbXVtIGNsb2NrIHJhdGUgKGluIEh6KSBzdXBwb3J0ZWQgYnkgdGhlIGNvbnRyb2xsZXIKLSAqIEBtYXhfcmF0ZTogbWF4aW11bSBjbG9jayByYXRlIChpbiBIeikgc3VwcG9ydGVkIGJ5IHRoZSBjb250cm9sbGVyCiAgKiBAd2FpdDogd2FpdCBoZXJlIHVudGlsIGdpdmVuIHRyYW5zZmVyIGlzIGNvbXBsZXRlZAogICogQGN1cnJlbnRfbXNnOiBtZXNzYWdlIHRoYXQgaXMgY3VycmVudGx5IHByb2Nlc3NlZCAob3IgJU5VTEwgaWYgbm9uZSkKICAqIEB0eDogY3VycmVudCBieXRlIGluIHRyYW5zZmVyIHRvIHRyYW5zbWl0CkBAIC05NSw4ICs5Myw2IEBACiAJc3RydWN0IGNsawkJCSpjbGs7CiAJdm9pZCBfX2lvbWVtCQkJKnJlZ3NfYmFzZTsKIAl1bnNpZ25lZCBsb25nCQkJc3NwZHJfcGh5czsKLQl1bnNpZ25lZCBsb25nCQkJbWluX3JhdGU7Ci0JdW5zaWduZWQgbG9uZwkJCW1heF9yYXRlOwogCXN0cnVjdCBjb21wbGV0aW9uCQl3YWl0OwogCXN0cnVjdCBzcGlfbWVzc2FnZQkJKmN1cnJlbnRfbXNnOwogCXNpemVfdAkJCQl0eDsKQEAgLTE5OSw5ICsxOTUsOSBAQAogICogQGRpdl9zY3I6IHBvaW50ZXIgdG8gcmV0dXJuIHRoZSBzY3IgZGl2aWRlcgogICovCiBzdGF0aWMgaW50IGVwOTN4eF9zcGlfY2FsY19kaXZpc29ycyhjb25zdCBzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyByYXRlLAotCQkJCSAgICB1OCAqZGl2X2Nwc3IsIHU4ICpkaXZfc2NyKQorCQkJCSAgICB1MzIgcmF0ZSwgdTggKmRpdl9jcHNyLCB1OCAqZGl2X3NjcikKIHsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZXNwaS0+cGRldik7CiAJdW5zaWduZWQgbG9uZyBzcGlfY2xrX3JhdGUgPSBjbGtfZ2V0X3JhdGUoZXNwaS0+Y2xrKTsKIAlpbnQgY3Bzciwgc2NyOwogCkBAIC0yMTAsNyArMjA2LDcgQEAKIAkgKiBjb250cm9sbGVyLiBOb3RlIHRoYXQgbWluaW11bSB2YWx1ZSBpcyBhbHJlYWR5IGNoZWNrZWQgaW4KIAkgKiBlcDkzeHhfc3BpX3RyYW5zZmVyX29uZV9tZXNzYWdlKCkuCiAJICovCi0JcmF0ZSA9IGNsYW1wKHJhdGUsIGVzcGktPm1pbl9yYXRlLCBlc3BpLT5tYXhfcmF0ZSk7CisJcmF0ZSA9IGNsYW1wKHJhdGUsIG1hc3Rlci0+bWluX3NwZWVkX2h6LCBtYXN0ZXItPm1heF9zcGVlZF9oeik7CiAKIAkvKgogCSAqIENhbGN1bGF0ZSBkaXZpc29ycyBzbyB0aGF0IHdlIGNhbiBnZXQgc3BlZWQgYWNjb3JkaW5nIHRoZQpAQCAtNzM1LDEzICs3MzEsNiBAQAogCQkJCQkgICBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKIHsKIAlzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0OwotCi0JLyogZmlyc3QgdmFsaWRhdGUgZWFjaCB0cmFuc2ZlciAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCWlmICh0LT5zcGVlZF9oeiA8IGVzcGktPm1pbl9yYXRlKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCiAJbXNnLT5zdGF0ZSA9IE5VTEw7CiAJbXNnLT5zdGF0dXMgPSAwOwpAQCAtOTE3LDggKzkwNiw4IEBACiAJICogQ2FsY3VsYXRlIG1heGltdW0gYW5kIG1pbmltdW0gc3VwcG9ydGVkIGNsb2NrIHJhdGVzCiAJICogZm9yIHRoZSBjb250cm9sbGVyLgogCSAqLwotCWVzcGktPm1heF9yYXRlID0gY2xrX2dldF9yYXRlKGVzcGktPmNsaykgLyAyOwotCWVzcGktPm1pbl9yYXRlID0gY2xrX2dldF9yYXRlKGVzcGktPmNsaykgLyAoMjU0ICogMjU2KTsKKwltYXN0ZXItPm1heF9zcGVlZF9oeiA9IGNsa19nZXRfcmF0ZShlc3BpLT5jbGspIC8gMjsKKwltYXN0ZXItPm1pbl9zcGVlZF9oeiA9IGNsa19nZXRfcmF0ZShlc3BpLT5jbGspIC8gKDI1NCAqIDI1Nik7CiAJZXNwaS0+cGRldiA9IHBkZXY7CiAKIAllc3BpLT5zc3Bkcl9waHlzID0gcmVzLT5zdGFydCArIFNTUERSOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWZhbGNvbi5jIGIvZHJpdmVycy9zcGkvc3BpLWZhbGNvbi5jCmluZGV4IGRkNWJkNDYuLjA5OTY1ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1mYWxjb24uYworKysgYi9kcml2ZXJzL3NwaS9zcGktZmFsY29uLmMKQEAgLTMxMiw5ICszMTIsNiBAQAogCXVuc2lnbmVkIGludCBpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoc3BpLT5jaGlwX3NlbGVjdCA+IDApCi0JCXJldHVybiAtRU5PREVWOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVidV9sb2NrLCBmbGFncyk7CiAKIAlpZiAoc3BpLT5tYXhfc3BlZWRfaHogPj0gQ0xPQ0tfMTAwTSkgewpAQCAtNDIyLDkgKzQxOSw3IEBACiAJcHJpdi0+bWFzdGVyID0gbWFzdGVyOwogCiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfTU9ERV8zOwotCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSAxOwogCW1hc3Rlci0+ZmxhZ3MgPSBTUElfTUFTVEVSX0hBTEZfRFVQTEVYOwotCW1hc3Rlci0+YnVzX251bSA9IC0xOwogCW1hc3Rlci0+c2V0dXAgPSBmYWxjb25fc2ZsYXNoX3NldHVwOwogCW1hc3Rlci0+cHJlcGFyZV90cmFuc2Zlcl9oYXJkd2FyZSA9IGZhbGNvbl9zZmxhc2hfcHJlcGFyZV94ZmVyOwogCW1hc3Rlci0+dHJhbnNmZXJfb25lX21lc3NhZ2UgPSBmYWxjb25fc2ZsYXNoX3hmZXJfb25lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWZzbC1kc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktZnNsLWRzcGkuYwppbmRleCBhMjUzOTIwLi5kNTY1ZWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZnNsLWRzcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktZnNsLWRzcGkuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CkBAIC0xMDgsMTEgKzEwOSwxMSBAQAogCXN0cnVjdCBzcGlfYml0YmFuZwliaXRiYW5nOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CiAKLQl2b2lkIF9faW9tZW0JCSpiYXNlOworCXN0cnVjdCByZWdtYXAJCSpyZWdtYXA7CiAJaW50CQkJaXJxOwotCXN0cnVjdCBjbGsgCQkqY2xrOworCXN0cnVjdCBjbGsJCSpjbGs7CiAKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIAkqY3VyX3RyYW5zZmVyOworCXN0cnVjdCBzcGlfdHJhbnNmZXIJKmN1cl90cmFuc2ZlcjsKIAlzdHJ1Y3QgY2hpcF9kYXRhCSpjdXJfY2hpcDsKIAlzaXplX3QJCQlsZW47CiAJdm9pZAkJCSp0eDsKQEAgLTEyMywyNCArMTI0LDE3IEBACiAJdTgJCQljczsKIAl1MTYJCQl2b2lkX3dyaXRlX2RhdGE7CiAKLQl3YWl0X3F1ZXVlX2hlYWRfdCAJd2FpdHE7Ci0JdTMyIAkJCXdhaXRmbGFnczsKKwl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0cTsKKwl1MzIJCQl3YWl0ZmxhZ3M7CiB9OwogCiBzdGF0aWMgaW5saW5lIGludCBpc19kb3VibGVfYnl0ZV9tb2RlKHN0cnVjdCBmc2xfZHNwaSAqZHNwaSkKIHsKLQlyZXR1cm4gKChyZWFkbChkc3BpLT5iYXNlICsgU1BJX0NUQVIoZHNwaS0+Y3MpKSAmIFNQSV9GUkFNRV9CSVRTX01BU0spCi0JCQk9PSBTUElfRlJBTUVfQklUUyg4KSkgPyAwIDogMTsKLX0KKwl1bnNpZ25lZCBpbnQgdmFsOwogCi1zdGF0aWMgdm9pZCBzZXRfYml0X21vZGUoc3RydWN0IGZzbF9kc3BpICpkc3BpLCB1bnNpZ25lZCBjaGFyIGJpdHMpCi17Ci0JdTMyIHRlbXA7CisJcmVnbWFwX3JlYWQoZHNwaS0+cmVnbWFwLCBTUElfQ1RBUihkc3BpLT5jcyksICZ2YWwpOwogCi0JdGVtcCA9IHJlYWRsKGRzcGktPmJhc2UgKyBTUElfQ1RBUihkc3BpLT5jcykpOwotCXRlbXAgJj0gflNQSV9GUkFNRV9CSVRTX01BU0s7Ci0JdGVtcCB8PSBTUElfRlJBTUVfQklUUyhiaXRzKTsKLQl3cml0ZWwodGVtcCwgZHNwaS0+YmFzZSArIFNQSV9DVEFSKGRzcGktPmNzKSk7CisJcmV0dXJuICgodmFsICYgU1BJX0ZSQU1FX0JJVFNfTUFTSykgPT0gU1BJX0ZSQU1FX0JJVFMoOCkpID8gMCA6IDE7CiB9CiAKIHN0YXRpYyB2b2lkIGh6X3RvX3NwaV9iYXVkKGNoYXIgKnBiciwgY2hhciAqYnIsIGludCBzcGVlZF9oeiwKQEAgLTE4OCw3ICsxODIsOCBAQAogCSAqLwogCWlmICh0eF93b3JkICYmIChkc3BpLT5sZW4gPT0gMSkpIHsKIAkJZHNwaS0+ZGF0YWZsYWdzIHw9IFRSQU5fU1RBVEVfV09SRF9PRERfTlVNOwotCQlzZXRfYml0X21vZGUoZHNwaSwgOCk7CisJCXJlZ21hcF91cGRhdGVfYml0cyhkc3BpLT5yZWdtYXAsIFNQSV9DVEFSKGRzcGktPmNzKSwKKwkJCQlTUElfRlJBTUVfQklUU19NQVNLLCBTUElfRlJBTUVfQklUUyg4KSk7CiAJCXR4X3dvcmQgPSAwOwogCX0KIApAQCAtMjM4LDcgKzIzMyw4IEBACiAJCQlkc3BpX3B1c2hyIHw9IFNQSV9QVVNIUl9DVENOVDsgLyogY2xlYXIgY291bnRlciAqLwogCQl9CiAKLQkJd3JpdGVsKGRzcGlfcHVzaHIsIGRzcGktPmJhc2UgKyBTUElfUFVTSFIpOworCQlyZWdtYXBfd3JpdGUoZHNwaS0+cmVnbWFwLCBTUElfUFVTSFIsIGRzcGlfcHVzaHIpOworCiAJCXR4X2NvdW50Kys7CiAJfQogCkBAIC0yNTMsMTcgKzI0OSwyMyBAQAogCXdoaWxlICgoZHNwaS0+cnggPCBkc3BpLT5yeF9lbmQpCiAJCQkmJiAocnhfY291bnQgPCBEU1BJX0ZJRk9fU0laRSkpIHsKIAkJaWYgKHJ4X3dvcmQpIHsKKwkJCXVuc2lnbmVkIGludCB2YWw7CisKIAkJCWlmICgoZHNwaS0+cnhfZW5kIC0gZHNwaS0+cngpID09IDEpCiAJCQkJYnJlYWs7CiAKLQkJCWQgPSBTUElfUE9QUl9SWERBVEEocmVhZGwoZHNwaS0+YmFzZSArIFNQSV9QT1BSKSk7CisJCQlyZWdtYXBfcmVhZChkc3BpLT5yZWdtYXAsIFNQSV9QT1BSLCAmdmFsKTsKKwkJCWQgPSBTUElfUE9QUl9SWERBVEEodmFsKTsKIAogCQkJaWYgKCEoZHNwaS0+ZGF0YWZsYWdzICYgVFJBTl9TVEFURV9SWF9WT0lEKSkKIAkJCQkqKHUxNiAqKWRzcGktPnJ4ID0gZDsKIAkJCWRzcGktPnJ4ICs9IDI7CiAKIAkJfSBlbHNlIHsKLQkJCWQgPSBTUElfUE9QUl9SWERBVEEocmVhZGwoZHNwaS0+YmFzZSArIFNQSV9QT1BSKSk7CisJCQl1bnNpZ25lZCBpbnQgdmFsOworCisJCQlyZWdtYXBfcmVhZChkc3BpLT5yZWdtYXAsIFNQSV9QT1BSLCAmdmFsKTsKKwkJCWQgPSBTUElfUE9QUl9SWERBVEEodmFsKTsKIAkJCWlmICghKGRzcGktPmRhdGFmbGFncyAmIFRSQU5fU1RBVEVfUlhfVk9JRCkpCiAJCQkJKih1OCAqKWRzcGktPnJ4ID0gZDsKIAkJCWRzcGktPnJ4Kys7CkBAIC0yOTUsMTMgKzI5NywxMyBAQAogCWlmICghZHNwaS0+dHgpCiAJCWRzcGktPmRhdGFmbGFncyB8PSBUUkFOX1NUQVRFX1RYX1ZPSUQ7CiAKLQl3cml0ZWwoZHNwaS0+Y3VyX2NoaXAtPm1jcl92YWwsIGRzcGktPmJhc2UgKyBTUElfTUNSKTsKLQl3cml0ZWwoZHNwaS0+Y3VyX2NoaXAtPmN0YXJfdmFsLCBkc3BpLT5iYXNlICsgU1BJX0NUQVIoZHNwaS0+Y3MpKTsKLQl3cml0ZWwoU1BJX1JTRVJfRU9RRkUsIGRzcGktPmJhc2UgKyBTUElfUlNFUik7CisJcmVnbWFwX3dyaXRlKGRzcGktPnJlZ21hcCwgU1BJX01DUiwgZHNwaS0+Y3VyX2NoaXAtPm1jcl92YWwpOworCXJlZ21hcF93cml0ZShkc3BpLT5yZWdtYXAsIFNQSV9DVEFSKGRzcGktPmNzKSwgZHNwaS0+Y3VyX2NoaXAtPmN0YXJfdmFsKTsKKwlyZWdtYXBfd3JpdGUoZHNwaS0+cmVnbWFwLCBTUElfUlNFUiwgU1BJX1JTRVJfRU9RRkUpOwogCiAJaWYgKHQtPnNwZWVkX2h6KQotCQl3cml0ZWwoZHNwaS0+Y3VyX2NoaXAtPmN0YXJfdmFsLAotCQkJCWRzcGktPmJhc2UgKyBTUElfQ1RBUihkc3BpLT5jcykpOworCQlyZWdtYXBfd3JpdGUoZHNwaS0+cmVnbWFwLCBTUElfQ1RBUihkc3BpLT5jcyksCisJCQkJZHNwaS0+Y3VyX2NoaXAtPmN0YXJfdmFsKTsKIAogCWRzcGlfdHJhbnNmZXJfd3JpdGUoZHNwaSk7CiAKQEAgLTMxNSw3ICszMTcsOSBAQAogc3RhdGljIHZvaWQgZHNwaV9jaGlwc2VsZWN0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCB2YWx1ZSkKIHsKIAlzdHJ1Y3QgZnNsX2RzcGkgKmRzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQl1MzIgcHVzaHIgPSByZWFkbChkc3BpLT5iYXNlICsgU1BJX1BVU0hSKTsKKwl1bnNpZ25lZCBpbnQgcHVzaHI7CisKKwlyZWdtYXBfcmVhZChkc3BpLT5yZWdtYXAsIFNQSV9QVVNIUiwgJnB1c2hyKTsKIAogCXN3aXRjaCAodmFsdWUpIHsKIAljYXNlIEJJVEJBTkdfQ1NfQUNUSVZFOgpAQCAtMzI2LDcgKzMzMCw3IEBACiAJCWJyZWFrOwogCX0KIAotCXdyaXRlbChwdXNociwgZHNwaS0+YmFzZSArIFNQSV9QVVNIUik7CisJcmVnbWFwX3dyaXRlKGRzcGktPnJlZ21hcCwgU1BJX1BVU0hSLCBwdXNocik7CiB9CiAKIHN0YXRpYyBpbnQgZHNwaV9zZXR1cF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQpAQCAtMzM4LDcgKzM0Miw4IEBACiAJLyogT25seSBhbGxvYyBvbiBmaXJzdCBzZXR1cCAqLwogCWNoaXAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKIAlpZiAoY2hpcCA9PSBOVUxMKSB7Ci0JCWNoaXAgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgY2hpcF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJCWNoaXAgPSBkZXZtX2t6YWxsb2MoJnNwaS0+ZGV2LCBzaXplb2Yoc3RydWN0IGNoaXBfZGF0YSksCisJCQkJICAgIEdGUF9LRVJORUwpOwogCQlpZiAoIWNoaXApCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0zNDksNyArMzU0LDYgQEAKIAkJZm1zeiA9IHNwaS0+Yml0c19wZXJfd29yZCAtIDE7CiAJfSBlbHNlIHsKIAkJcHJfZXJyKCJJbnZhbGlkIHdvcmRzaXplXG4iKTsKLQkJa2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMzgyLDEzICszODYsMTUgQEAKIHsKIAlzdHJ1Y3QgZnNsX2RzcGkgKmRzcGkgPSAoc3RydWN0IGZzbF9kc3BpICopZGV2X2lkOwogCi0Jd3JpdGVsKFNQSV9TUl9FT1FGLCBkc3BpLT5iYXNlICsgU1BJX1NSKTsKKwlyZWdtYXBfd3JpdGUoZHNwaS0+cmVnbWFwLCBTUElfU1IsIFNQSV9TUl9FT1FGKTsKIAogCWRzcGlfdHJhbnNmZXJfcmVhZChkc3BpKTsKIAogCWlmICghZHNwaS0+bGVuKSB7CiAJCWlmIChkc3BpLT5kYXRhZmxhZ3MgJiBUUkFOX1NUQVRFX1dPUkRfT0REX05VTSkKLQkJCXNldF9iaXRfbW9kZShkc3BpLCAxNik7CisJCQlyZWdtYXBfdXBkYXRlX2JpdHMoZHNwaS0+cmVnbWFwLCBTUElfQ1RBUihkc3BpLT5jcyksCisJCQkJU1BJX0ZSQU1FX0JJVFNfTUFTSywgU1BJX0ZSQU1FX0JJVFMoMTYpKTsKKwogCQlkc3BpLT53YWl0ZmxhZ3MgPSAxOwogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRzcGktPndhaXRxKTsKIAl9IGVsc2UgewpAQCAtNDMwLDggKzQzNiwxMyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgZHNwaV9wbSA9IHsKLQlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhkc3BpX3N1c3BlbmQsIGRzcGlfcmVzdW1lKQorc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGRzcGlfcG0sIGRzcGlfc3VzcGVuZCwgZHNwaV9yZXN1bWUpOworCitzdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgZHNwaV9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDMyLAorCS52YWxfYml0cyA9IDMyLAorCS5yZWdfc3RyaWRlID0gNCwKKwkubWF4X3JlZ2lzdGVyID0gMHg4OCwKIH07CiAKIHN0YXRpYyBpbnQgZHNwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtNDQwLDYgKzQ1MSw3IEBACiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKIAlzdHJ1Y3QgZnNsX2RzcGkgKmRzcGk7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CisJdm9pZCBfX2lvbWVtICpiYXNlOwogCWludCByZXQgPSAwLCBjc19udW0sIGJ1c19udW07CiAKIAltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgZnNsX2RzcGkpKTsKQEAgLTQ3NCwxMiArNDg2LDI0IEBACiAJbWFzdGVyLT5idXNfbnVtID0gYnVzX251bTsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JZHNwaS0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwotCWlmIChJU19FUlIoZHNwaS0+YmFzZSkpIHsKLQkJcmV0ID0gUFRSX0VSUihkc3BpLT5iYXNlKTsKKwliYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihiYXNlKSkgeworCQlyZXQgPSBQVFJfRVJSKGJhc2UpOwogCQlnb3RvIG91dF9tYXN0ZXJfcHV0OwogCX0KIAorCWRzcGlfcmVnbWFwX2NvbmZpZy5sb2NrX2FyZyA9IGRzcGk7CisJZHNwaV9yZWdtYXBfY29uZmlnLnZhbF9mb3JtYXRfZW5kaWFuID0KKwkJb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYmlnLWVuZGlhbiIpCisJCQk/IFJFR01BUF9FTkRJQU5fQklHIDogUkVHTUFQX0VORElBTl9ERUZBVUxUOworCWRzcGktPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfbW1pb19jbGsoJnBkZXYtPmRldiwgImRzcGkiLCBiYXNlLAorCQkJCQkJJmRzcGlfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihkc3BpLT5yZWdtYXApKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBpbml0IHJlZ21hcDogJWxkXG4iLAorCQkJCVBUUl9FUlIoZHNwaS0+cmVnbWFwKSk7CisJCXJldHVybiBQVFJfRVJSKGRzcGktPnJlZ21hcCk7CisJfQorCiAJZHNwaS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAoZHNwaS0+aXJxIDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgcGxhdGZvcm0gaXJxXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1mc2wtZXNwaS5jIGIvZHJpdmVycy9zcGkvc3BpLWZzbC1lc3BpLmMKaW5kZXggNDI4ZGM3YS4uNmZiMmI3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWZzbC1lc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWZzbC1lc3BpLmMKQEAgLTIxOSwxMyArMjE5LDggQEAKIAlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1wYzh4eHhfc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CiAJc3RydWN0IGZzbF9lc3BpX3JlZyAqcmVnX2Jhc2UgPSBtcGM4eHh4X3NwaS0+cmVnX2Jhc2U7CiAJdW5zaWduZWQgaW50IGxlbiA9IHQtPmxlbjsKLQl1OCBiaXRzX3Blcl93b3JkOwogCWludCByZXQ7CiAKLQliaXRzX3Blcl93b3JkID0gc3BpLT5iaXRzX3Blcl93b3JkOwotCWlmICh0LT5iaXRzX3Blcl93b3JkKQotCQliaXRzX3Blcl93b3JkID0gdC0+Yml0c19wZXJfd29yZDsKLQogCW1wYzh4eHhfc3BpLT5sZW4gPSB0LT5sZW47CiAJbGVuID0gcm91bmR1cChsZW4sIDQpIC8gNDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWZzbC1saWIuYyBiL2RyaXZlcnMvc3BpL3NwaS1mc2wtbGliLmMKaW5kZXggMGI3NWYyNi4uZTVkNDVmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWZzbC1saWIuYworKysgYi9kcml2ZXJzL3NwaS9zcGktZnNsLWxpYi5jCkBAIC0yMDAsNyArMjAwLDcgQEAKIAljb25zdCB2b2lkICpwcm9wOwogCWludCByZXQgPSAtRU5PTUVNOwogCi0JcGluZm8gPSBremFsbG9jKHNpemVvZigqcGluZm8pLCBHRlBfS0VSTkVMKTsKKwlwaW5mbyA9IGRldm1fa3phbGxvYygmb2ZkZXYtPmRldiwgc2l6ZW9mKCpwaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghcGluZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yMTUsMTUgKzIxNSwxMyBAQAogCXBkYXRhLT5zeXNjbGsgPSBnZXRfYnJnZnJlcSgpOwogCWlmIChwZGF0YS0+c3lzY2xrID09IC0xKSB7CiAJCXBkYXRhLT5zeXNjbGsgPSBmc2xfZ2V0X3N5c19mcmVxKCk7Ci0JCWlmIChwZGF0YS0+c3lzY2xrID09IC0xKSB7Ci0JCQlyZXQgPSAtRU5PREVWOwotCQkJZ290byBlcnI7Ci0JCX0KKwkJaWYgKHBkYXRhLT5zeXNjbGsgPT0gLTEpCisJCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAjZWxzZQogCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiY2xvY2stZnJlcXVlbmN5IiwgJnBkYXRhLT5zeXNjbGspOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyOworCQlyZXR1cm4gcmV0OwogI2VuZGlmCiAKIAlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibW9kZSIsIE5VTEwpOwpAQCAtMjM3LDggKzIzNSw0IEBACiAJCXBkYXRhLT5mbGFncyA9IFNQSV9DUE1fTU9ERSB8IFNQSV9DUE0xOwogCiAJcmV0dXJuIDA7Ci0KLWVycjoKLQlrZnJlZShwaW5mbyk7Ci0JcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1mc2wtc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktZnNsLXNwaS5jCmluZGV4IDExOWY3YWYuLmYzNTQ4OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1mc2wtc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWZzbC1zcGkuYwpAQCAtMjM5LDEyICsyMzksNiBAQAogCWlmICghYml0c19wZXJfd29yZCkKIAkJYml0c19wZXJfd29yZCA9IHNwaS0+Yml0c19wZXJfd29yZDsKIAotCS8qIE1ha2Ugc3VyZSBpdHMgYSBiaXQgd2lkdGggd2Ugc3VwcG9ydCBbNC4uMTYsIDMyXSAqLwotCWlmICgoYml0c19wZXJfd29yZCA8IDQpCi0JICAgIHx8ICgoYml0c19wZXJfd29yZCA+IDE2KSAmJiAoYml0c19wZXJfd29yZCAhPSAzMikpCi0JICAgIHx8IChiaXRzX3Blcl93b3JkID4gbXBjOHh4eF9zcGktPm1heF9iaXRzX3Blcl93b3JkKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlpZiAoIWh6KQogCQloeiA9IHNwaS0+bWF4X3NwZWVkX2h6OwogCkBAIC0zNjIsMTggKzM1NiwyOCBAQAogc3RhdGljIHZvaWQgZnNsX3NwaV9kb19vbmVfbXNnKHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKIHsKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gbS0+c3BpOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdCwgKmZpcnN0OwogCXVuc2lnbmVkIGludCBjc19jaGFuZ2U7CiAJY29uc3QgaW50IG5zZWNzID0gNTA7CiAJaW50IHN0YXR1czsKIAorCS8qIERvbid0IGFsbG93IGNoYW5nZXMgaWYgQ1MgaXMgYWN0aXZlICovCisJZmlyc3QgPSBsaXN0X2ZpcnN0X2VudHJ5KCZtLT50cmFuc2ZlcnMsIHN0cnVjdCBzcGlfdHJhbnNmZXIsCisJCQl0cmFuc2Zlcl9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJaWYgKChmaXJzdC0+Yml0c19wZXJfd29yZCAhPSB0LT5iaXRzX3Blcl93b3JkKSB8fAorCQkJKGZpcnN0LT5zcGVlZF9oeiAhPSB0LT5zcGVlZF9oeikpIHsKKwkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCQlkZXZfZXJyKCZzcGktPmRldiwKKwkJCQkiYml0c19wZXJfd29yZC9zcGVlZF9oeiBzaG91bGQgYmUgc2FtZSBmb3IgdGhlIHNhbWUgU1BJIHRyYW5zZmVyXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwogCWNzX2NoYW5nZSA9IDE7Ci0Jc3RhdHVzID0gMDsKKwlzdGF0dXMgPSAtRUlOVkFMOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewogCQlpZiAodC0+Yml0c19wZXJfd29yZCB8fCB0LT5zcGVlZF9oeikgewotCQkJLyogRG9uJ3QgYWxsb3cgY2hhbmdlcyBpZiBDUyBpcyBhY3RpdmUgKi8KLQkJCXN0YXR1cyA9IC1FSU5WQUw7Ci0KIAkJCWlmIChjc19jaGFuZ2UpCiAJCQkJc3RhdHVzID0gZnNsX3NwaV9zZXR1cF90cmFuc2ZlcihzcGksIHQpOwogCQkJaWYgKHN0YXR1cyA8IDApCkBAIC02NDEsNiArNjQ1LDEwIEBACiAJaWYgKG1wYzh4eHhfc3BpLT50eXBlID09IFRZUEVfR1JMSUIpCiAJCWZzbF9zcGlfZ3JsaWJfcHJvYmUoZGV2KTsKIAorCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0KKwkJKFNQSV9CUFdfUkFOR0VfTUFTSyg0LCAxNikgfCBTUElfQlBXX01BU0soMzIpKSAmCisJCVNQSV9CUFdfUkFOR0VfTUFTSygxLCBtcGM4eHh4X3NwaS0+bWF4X2JpdHNfcGVyX3dvcmQpOworCiAJaWYgKG1wYzh4eHhfc3BpLT5mbGFncyAmIFNQSV9RRV9DUFVfTU9ERSkKIAkJbXBjOHh4eF9zcGktPnNldF9zaGlmdHMgPSBmc2xfc3BpX3FlX2NwdV9zZXRfc2hpZnRzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZ3Bpby5jIGIvZHJpdmVycy9zcGkvc3BpLWdwaW8uYwppbmRleCA3YmVlYjI5Li4wOTgyMzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZ3Bpby5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1ncGlvLmMKQEAgLTE5LDcgKzE5LDYgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KQEAgLTI1MCw3ICsyNDksNyBAQAogCQkvKgogCQkgKiAuLi4gb3RoZXJ3aXNlLCB0YWtlIGl0IGZyb20gc3BpLT5jb250cm9sbGVyX2RhdGEKIAkJICovCi0JCWNzID0gKHVuc2lnbmVkIGludCkgc3BpLT5jb250cm9sbGVyX2RhdGE7CisJCWNzID0gKHVuc2lnbmVkIGludCkodWludHB0cl90KSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKIAl9CiAKIAlpZiAoIXNwaS0+Y29udHJvbGxlcl9zdGF0ZSkgewpAQCAtNTAzLDEzICs1MDIsMTIgQEAKIHsKIAlzdHJ1Y3Qgc3BpX2dwaW8JCQkqc3BpX2dwaW87CiAJc3RydWN0IHNwaV9ncGlvX3BsYXRmb3JtX2RhdGEJKnBkYXRhOwotCWludAkJCQlzdGF0dXM7CiAKIAlzcGlfZ3BpbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKIAogCS8qIHN0b3AoKSB1bnJlZ2lzdGVycyBjaGlsZCBkZXZpY2VzIHRvbyAqLwotCXN0YXR1cyA9IHNwaV9iaXRiYW5nX3N0b3AoJnNwaV9ncGlvLT5iaXRiYW5nKTsKKwlzcGlfYml0YmFuZ19zdG9wKCZzcGlfZ3Bpby0+Yml0YmFuZyk7CiAKIAlpZiAoU1BJX01JU09fR1BJTyAhPSBTUElfR1BJT19OT19NSVNPKQogCQlncGlvX2ZyZWUoU1BJX01JU09fR1BJTyk7CkBAIC01MTgsNyArNTE2LDcgQEAKIAlncGlvX2ZyZWUoU1BJX1NDS19HUElPKTsKIAlzcGlfbWFzdGVyX3B1dChzcGlfZ3Bpby0+Yml0YmFuZy5tYXN0ZXIpOwogCi0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gMDsKIH0KIAogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIERSSVZFUl9OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1pbXguYyBiL2RyaXZlcnMvc3BpL3NwaS1pbXguYwppbmRleCA0N2YxNWQ5Li41ZGFmZjIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktaW14LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWlteC5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CkBAIC03NDEsNyArNzQwLDcgQEAKIAlzcGlfaW14LT5jb3VudCA9IHRyYW5zZmVyLT5sZW47CiAJc3BpX2lteC0+dHhmaWZvID0gMDsKIAotCWluaXRfY29tcGxldGlvbigmc3BpX2lteC0+eGZlcl9kb25lKTsKKwlyZWluaXRfY29tcGxldGlvbigmc3BpX2lteC0+eGZlcl9kb25lKTsKIAogCXNwaV9pbXhfcHVzaChzcGlfaW14KTsKIApAQCAtODgwLDEyICs4NzksMTIgQEAKIAogCXNwaV9pbXgtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CiAJaWYgKHNwaV9pbXgtPmlycSA8IDApIHsKLQkJcmV0ID0gLUVJTlZBTDsKKwkJcmV0ID0gc3BpX2lteC0+aXJxOwogCQlnb3RvIG91dF9tYXN0ZXJfcHV0OwogCX0KIAogCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgc3BpX2lteC0+aXJxLCBzcGlfaW14X2lzciwgMCwKLQkJCSAgICAgICBEUklWRVJfTkFNRSwgc3BpX2lteCk7CisJCQkgICAgICAgZGV2X25hbWUoJnBkZXYtPmRldiksIHNwaV9pbXgpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGlycSVkOiAlZFxuIiwgc3BpX2lteC0+aXJxLCByZXQpOwogCQlnb3RvIG91dF9tYXN0ZXJfcHV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLW1wYzUxMngtcHNjLmMgYi9kcml2ZXJzL3NwaS9zcGktbXBjNTEyeC1wc2MuYwppbmRleCA1MDMyMTQxLi4zODIyZWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktbXBjNTEyeC1wc2MuYworKysgYi9kcml2ZXJzL3NwaS9zcGktbXBjNTEyeC1wc2MuYwpAQCAtMTYsNyArMTYsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgpAQCAtNDY2LDEwICs0NjUsOCBAQAogCWdwaW9fc2V0X3ZhbHVlKHNwaS0+Y3NfZ3Bpbywgb25vZmYpOwogfQogCi0vKiBidXNfbnVtIGlzIHVzZWQgb25seSBmb3IgdGhlIGNhc2UgZGV2LT5wbGF0Zm9ybV9kYXRhID09IE5VTEwgKi8KIHN0YXRpYyBpbnQgbXBjNTEyeF9wc2Nfc3BpX2RvX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHJlZ2FkZHIsCi0JCQkJCSAgICAgIHUzMiBzaXplLCB1bnNpZ25lZCBpbnQgaXJxLAotCQkJCQkgICAgICBzMTYgYnVzX251bSkKKwkJCQkJICAgICAgdTMyIHNpemUsIHVuc2lnbmVkIGludCBpcnEpCiB7CiAJc3RydWN0IGZzbF9zcGlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7CiAJc3RydWN0IG1wYzUxMnhfcHNjX3NwaSAqbXBzOwpAQCAtNDg4LDcgKzQ4NSw2IEBACiAKIAlpZiAocGRhdGEgPT0gTlVMTCkgewogCQltcHMtPmNzX2NvbnRyb2wgPSBtcGM1MTJ4X3NwaV9jc19jb250cm9sOwotCQltYXN0ZXItPmJ1c19udW0gPSBidXNfbnVtOwogCX0gZWxzZSB7CiAJCW1wcy0+Y3NfY29udHJvbCA9IHBkYXRhLT5jc19jb250cm9sOwogCQltYXN0ZXItPmJ1c19udW0gPSBwZGF0YS0+YnVzX251bTsKQEAgLTU3NCw3ICs1NzAsNiBAQAogewogCWNvbnN0IHUzMiAqcmVnYWRkcl9wOwogCXU2NCByZWdhZGRyNjQsIHNpemU2NDsKLQlzMTYgaWQgPSAtMTsKIAogCXJlZ2FkZHJfcCA9IG9mX2dldF9hZGRyZXNzKG9wLT5kZXYub2Zfbm9kZSwgMCwgJnNpemU2NCwgTlVMTCk7CiAJaWYgKCFyZWdhZGRyX3ApIHsKQEAgLTU4MywxNiArNTc4LDggQEAKIAl9CiAJcmVnYWRkcjY0ID0gb2ZfdHJhbnNsYXRlX2FkZHJlc3Mob3AtPmRldi5vZl9ub2RlLCByZWdhZGRyX3ApOwogCi0JLyogZ2V0IFBTQyBpZCAoMC4uMTEsIHVzZWQgYnkgcG9ydF9jb25maWcpICovCi0JaWQgPSBvZl9hbGlhc19nZXRfaWQob3AtPmRldi5vZl9ub2RlLCAic3BpIik7Ci0JaWYgKGlkIDwgMCkgewotCQlkZXZfZXJyKCZvcC0+ZGV2LCAibm8gYWxpYXMgaWQgZm9yICVzXG4iLAotCQkJb3AtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUpOwotCQlyZXR1cm4gaWQ7Ci0JfQotCiAJcmV0dXJuIG1wYzUxMnhfcHNjX3NwaV9kb19wcm9iZSgmb3AtPmRldiwgKHUzMikgcmVnYWRkcjY0LCAodTMyKSBzaXplNjQsCi0JCQkJaXJxX29mX3BhcnNlX2FuZF9tYXAob3AtPmRldi5vZl9ub2RlLCAwKSwgaWQpOworCQkJCWlycV9vZl9wYXJzZV9hbmRfbWFwKG9wLT5kZXYub2Zfbm9kZSwgMCkpOwogfQogCiBzdGF0aWMgaW50IG1wYzUxMnhfcHNjX3NwaV9vZl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3ApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktbXBjNTJ4eC1wc2MuYyBiL2RyaXZlcnMvc3BpL3NwaS1tcGM1Mnh4LXBzYy5jCmluZGV4IDAwYmE5MTAuLjNkMThkOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1tcGM1Mnh4LXBzYy5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1tcGM1Mnh4LXBzYy5jCkBAIC0xMiw3ICsxMiw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktbXBjNTJ4eC5jIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUyeHguYwppbmRleCA3YzY3NWZlLi5hYWMyYTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktbXBjNTJ4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1tcGM1Mnh4LmMKQEAgLTEyLDcgKzEyLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTM1NywyMCArMzU2LDYgQEAKICAqIHNwaV9tYXN0ZXIgb3BzCiAgKi8KIAotc3RhdGljIGludCBtcGM1Mnh4X3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgJSA4KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChzcGktPm1vZGUgJiB+KFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfTFNCX0ZJUlNUKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoc3BpLT5jaGlwX3NlbGVjdCA+PSBzcGktPm1hc3Rlci0+bnVtX2NoaXBzZWxlY3QpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgbXBjNTJ4eF9zcGlfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptKQogewogCXN0cnVjdCBtcGM1Mnh4X3NwaSAqbXMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKQEAgLTQzMyw5ICs0MTgsOSBAQAogCQlnb3RvIGVycl9hbGxvYzsKIAl9CiAKLQltYXN0ZXItPnNldHVwID0gbXBjNTJ4eF9zcGlfc2V0dXA7CiAJbWFzdGVyLT50cmFuc2ZlciA9IG1wYzUyeHhfc3BpX3RyYW5zZmVyOwogCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9MU0JfRklSU1Q7CisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soOCk7CiAJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IG9wLT5kZXYub2Zfbm9kZTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKG9wLCBtYXN0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLW14cy5jIGIvZHJpdmVycy9zcGkvc3BpLW14cy5jCmluZGV4IDc5ZTVhYTIuLjI4ODRmMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1teHMuYworKysgYi9kcml2ZXJzL3NwaS9zcGktbXhzLmMKQEAgLTI5LDcgKzI5LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CkBAIC0zNzEsNyArMzcwLDcgQEAKIHsKIAlzdHJ1Y3QgbXhzX3NwaSAqc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCXN0cnVjdCBteHNfc3NwICpzc3AgPSAmc3BpLT5zc3A7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdCwgKnRtcF90OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7CiAJdW5zaWduZWQgaW50IGZsYWc7CiAJaW50IHN0YXR1cyA9IDA7CiAKQEAgLTM4MSw3ICszODAsNyBAQAogCXdyaXRlbChteHNfc3BpX2NzX3RvX3JlZyhtLT5zcGktPmNoaXBfc2VsZWN0KSwKIAkgICAgICAgc3NwLT5iYXNlICsgSFdfU1NQX0NUUkwwICsgU1RNUF9PRkZTRVRfUkVHX1NFVCk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodCwgdG1wX3QsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKIAogCQlzdGF0dXMgPSBteHNfc3BpX3NldHVwX3RyYW5zZmVyKG0tPnNwaSwgdCk7CiAJCWlmIChzdGF0dXMpCkBAIC00NzMsNyArNDcyLDcgQEAKIAlpb3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaXJxX2VyciA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CiAJaWYgKGlycV9lcnIgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGlycV9lcnI7CiAKIAliYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIGlvcmVzKTsKIAlpZiAoSVNfRVJSKGJhc2UpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLW51YzkwMC5jIGIvZHJpdmVycy9zcGkvc3BpLW51YzkwMC5jCmluZGV4IGJhZTk3ZmYuLjE2ZTMwZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1udWM5MDAuYworKysgYi9kcml2ZXJzL3NwaS9zcGktbnVjOTAwLmMKQEAgLTksNyArOSw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMzgsNyArMzcsOSBAQAogLyogdXNpIHJlZ2lzdGVyIGJpdCAqLwogI2RlZmluZSBFTklOVAkJKDB4MDEgPDwgMTcpCiAjZGVmaW5lIEVORkxHCQkoMHgwMSA8PCAxNikKKyNkZWZpbmUgU0xFRVAJCSgweDBmIDw8IDEyKQogI2RlZmluZSBUWE5VTQkJKDB4MDMgPDwgOCkKKyNkZWZpbmUgVFhCSVRMRU4JKDB4MWYgPDwgMykKICNkZWZpbmUgVFhORUcJCSgweDAxIDw8IDIpCiAjZGVmaW5lIFJYTkVHCQkoMHgwMSA8PCAxKQogI2RlZmluZSBMU0IJCSgweDAxIDw8IDEwKQpAQCAtNTgsMTEgKzU5LDggQEAKIAl1bnNpZ25lZCBjaGFyCQkqcng7CiAJc3RydWN0IGNsawkJKmNsazsKIAlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOwotCXN0cnVjdCBzcGlfZGV2aWNlCSpjdXJkZXY7Ci0Jc3RydWN0IGRldmljZQkJKmRldjsKIAlzdHJ1Y3QgbnVjOTAwX3NwaV9pbmZvICpwZGF0YTsKIAlzcGlubG9ja190CQlsb2NrOwotCXN0cnVjdCByZXNvdXJjZQkJKnJlczsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG51YzkwMF9zcGkgKnRvX2h3KHN0cnVjdCBzcGlfZGV2aWNlICpzZGV2KQpAQCAtMTE5LDE5ICsxMTcsMTYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIG51YzkwMF9zcGlfc2V0dXBfdHhudW0oc3RydWN0IG51YzkwMF9zcGkgKmh3LAotCQkJCQkJCXVuc2lnbmVkIGludCB0eG51bSkKK3N0YXRpYyB2b2lkIG51YzkwMF9zcGlfc2V0dXBfdHhudW0oc3RydWN0IG51YzkwMF9zcGkgKmh3LCB1bnNpZ25lZCBpbnQgdHhudW0pCiB7CiAJdW5zaWduZWQgaW50IHZhbDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CiAKLQl2YWwgPSBfX3Jhd19yZWFkbChody0+cmVncyArIFVTSV9DTlQpOworCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCkgJiB+VFhOVU07CiAKLQlpZiAoIXR4bnVtKQotCQl2YWwgJj0gflRYTlVNOwotCWVsc2UKKwlpZiAodHhudW0pCiAJCXZhbCB8PSB0eG51bSA8PCAweDA4OwogCiAJX19yYXdfd3JpdGVsKHZhbCwgaHctPnJlZ3MgKyBVU0lfQ05UKTsKQEAgLTE0OCw3ICsxNDMsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CiAKLQl2YWwgPSBfX3Jhd19yZWFkbChody0+cmVncyArIFVTSV9DTlQpOworCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCkgJiB+VFhCSVRMRU47CiAKIAl2YWwgfD0gKHR4Yml0bGVuIDw8IDB4MDMpOwogCkBAIC0yODcsMTIgKzI4MiwxMSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CiAKLQl2YWwgPSBfX3Jhd19yZWFkbChody0+cmVncyArIFVTSV9DTlQpOworCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCkgJiB+U0xFRVA7CiAKIAlpZiAoc2xlZXApCiAJCXZhbCB8PSAoc2xlZXAgPDwgMTIpOwotCWVsc2UKLQkJdmFsICY9IH4oMHgwZiA8PCAxMik7CisKIAlfX3Jhd193cml0ZWwodmFsLCBody0+cmVncyArIFVTSV9DTlQpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKQEAgLTMzOCw2ICszMzIsNyBAQAogewogCXN0cnVjdCBudWM5MDBfc3BpICpodzsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWludCBlcnIgPSAwOwogCiAJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IG51YzkwMF9zcGkpKTsKQEAgLTM0OSw3ICszNDQsNiBAQAogCWh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCWh3LT5tYXN0ZXIgPSBtYXN0ZXI7CiAJaHctPnBkYXRhICA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7Ci0JaHctPmRldiA9ICZwZGV2LT5kZXY7CiAKIAlpZiAoaHctPnBkYXRhID09IE5VTEwpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gcGxhdGZvcm0gZGF0YSBzdXBwbGllZFxuIik7CkBAIC0zNjksOCArMzYzLDggQEAKIAlody0+Yml0YmFuZy5jaGlwc2VsZWN0ICAgICA9IG51YzkwMF9zcGlfY2hpcHNlbDsKIAlody0+Yml0YmFuZy50eHJ4X2J1ZnMgICAgICA9IG51YzkwMF9zcGlfdHhyeDsKIAotCWh3LT5yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWh3LT5yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIGh3LT5yZXMpOworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaHctPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKIAlpZiAoSVNfRVJSKGh3LT5yZWdzKSkgewogCQllcnIgPSBQVFJfRVJSKGh3LT5yZWdzKTsKIAkJZ290byBlcnJfcGRhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktb2MtdGlueS5jIGIvZHJpdmVycy9zcGkvc3BpLW9jLXRpbnkuYwppbmRleCBmN2M4OTZlLi44OTk4ZDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktb2MtdGlueS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1vYy10aW55LmMKQEAgLTE1LDcgKzE1LDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTI2Nyw4ICsyNjYsNiBAQAogCiAJLyogc2V0dXAgdGhlIHN0YXRlIGZvciB0aGUgYml0YmFuZyBkcml2ZXIgKi8KIAlody0+Yml0YmFuZy5tYXN0ZXIgPSBtYXN0ZXI7Ci0JaWYgKCFody0+Yml0YmFuZy5tYXN0ZXIpCi0JCXJldHVybiBlcnI7CiAJaHctPmJpdGJhbmcuc2V0dXBfdHJhbnNmZXIgPSB0aW55X3NwaV9zZXR1cF90cmFuc2ZlcjsKIAlody0+Yml0YmFuZy5jaGlwc2VsZWN0ID0gdGlueV9zcGlfY2hpcHNlbGVjdDsKIAlody0+Yml0YmFuZy50eHJ4X2J1ZnMgPSB0aW55X3NwaV90eHJ4X2J1ZnM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktb2N0ZW9uLmMgYi9kcml2ZXJzL3NwaS9zcGktb2N0ZW9uLmMKaW5kZXggNjcyNDlhNC4uYzVlMmY3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLW9jdGVvbi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1vY3Rlb24uYwpAQCAtMTEsNyArMTEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAKQEAgLTMzLDEzICszMiw2IEBACiAJdTY0IGNzX2VuYXg7CiB9OwogCi1zdHJ1Y3Qgb2N0ZW9uX3NwaV9zZXR1cCB7Ci0JdTMyIG1heF9zcGVlZF9oejsKLQl1OCBjaGlwX3NlbGVjdDsKLQl1OCBtb2RlOwotCXU4IGJpdHNfcGVyX3dvcmQ7Ci19OwotCiBzdGF0aWMgdm9pZCBvY3Rlb25fc3BpX3dhaXRfcmVhZHkoc3RydWN0IG9jdGVvbl9zcGkgKnApCiB7CiAJdW5pb24gY3ZteF9tcGlfc3RzIG1waV9zdHM7CkBAIC01Nyw2ICs0OSw3IEBACiAJCQkJICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyLAogCQkJCSAgYm9vbCBsYXN0X3hmZXIpCiB7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IG1zZy0+c3BpOwogCXVuaW9uIGN2bXhfbXBpX2NmZyBtcGlfY2ZnOwogCXVuaW9uIGN2bXhfbXBpX3R4IG1waV90eDsKIAl1bnNpZ25lZCBpbnQgY2xrZGl2OwpAQCAtNjgsMTggKzYxLDExIEBACiAJaW50IGxlbjsKIAlpbnQgaTsKIAotCXN0cnVjdCBvY3Rlb25fc3BpX3NldHVwICptc2dfc2V0dXAgPSBzcGlfZ2V0X2N0bGRhdGEobXNnLT5zcGkpOwotCi0Jc3BlZWRfaHogPSBtc2dfc2V0dXAtPm1heF9zcGVlZF9oejsKLQltb2RlID0gbXNnX3NldHVwLT5tb2RlOworCW1vZGUgPSBzcGktPm1vZGU7CiAJY3BoYSA9IG1vZGUgJiBTUElfQ1BIQTsKIAljcG9sID0gbW9kZSAmIFNQSV9DUE9MOwogCi0JaWYgKHhmZXItPnNwZWVkX2h6KQotCQlzcGVlZF9oeiA9IHhmZXItPnNwZWVkX2h6OwotCi0JaWYgKHNwZWVkX2h6ID4gT0NURU9OX1NQSV9NQVhfQ0xPQ0tfSFopCi0JCXNwZWVkX2h6ID0gT0NURU9OX1NQSV9NQVhfQ0xPQ0tfSFo7CisJc3BlZWRfaHogPSB4ZmVyLT5zcGVlZF9oeiA/IDogc3BpLT5tYXhfc3BlZWRfaHo7CiAKIAljbGtkaXYgPSBvY3Rlb25fZ2V0X2lvX2Nsb2NrX3JhdGUoKSAvICgyICogc3BlZWRfaHopOwogCkBAIC05Myw4ICs3OSw4IEBACiAJbXBpX2NmZy5zLmNzbGF0ZSA9IGNwaGEgPyAxIDogMDsKIAltcGlfY2ZnLnMuZW5hYmxlID0gMTsKIAotCWlmIChtc2dfc2V0dXAtPmNoaXBfc2VsZWN0IDwgNCkKLQkJcC0+Y3NfZW5heCB8PSAxdWxsIDw8ICgxMiArIG1zZ19zZXR1cC0+Y2hpcF9zZWxlY3QpOworCWlmIChzcGktPmNoaXBfc2VsZWN0IDwgNCkKKwkJcC0+Y3NfZW5heCB8PSAxdWxsIDw8ICgxMiArIHNwaS0+Y2hpcF9zZWxlY3QpOwogCW1waV9jZmcudTY0IHw9IHAtPmNzX2VuYXg7CiAKIAlpZiAobXBpX2NmZy51NjQgIT0gcC0+bGFzdF9jZmcpIHsKQEAgLTExNCw3ICsxMDAsNyBAQAogCQkJY3ZteF93cml0ZV9jc3IocC0+cmVnaXN0ZXJfYmFzZSArIE9DVEVPTl9TUElfREFUMCArICg4ICogaSksIGQpOwogCQl9CiAJCW1waV90eC51NjQgPSAwOwotCQltcGlfdHgucy5jc2lkID0gbXNnX3NldHVwLT5jaGlwX3NlbGVjdDsKKwkJbXBpX3R4LnMuY3NpZCA9IHNwaS0+Y2hpcF9zZWxlY3Q7CiAJCW1waV90eC5zLmxlYXZlY3MgPSAxOwogCQltcGlfdHgucy50eG51bSA9IHR4X2J1ZiA/IE9DVEVPTl9TUElfTUFYX0JZVEVTIDogMDsKIAkJbXBpX3R4LnMudG90bnVtID0gT0NURU9OX1NQSV9NQVhfQllURVM7CkBAIC0xMzksNyArMTI1LDcgQEAKIAl9CiAKIAltcGlfdHgudTY0ID0gMDsKLQltcGlfdHgucy5jc2lkID0gbXNnX3NldHVwLT5jaGlwX3NlbGVjdDsKKwltcGlfdHgucy5jc2lkID0gc3BpLT5jaGlwX3NlbGVjdDsKIAlpZiAobGFzdF94ZmVyKQogCQltcGlfdHgucy5sZWF2ZWNzID0geGZlci0+Y3NfY2hhbmdlOwogCWVsc2UKQEAgLTE2OSwxNyArMTU1LDkgQEAKIAlpbnQgc3RhdHVzID0gMDsKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyOwogCi0JLyoKLQkgKiBXZSBiZXR0ZXIgaGF2ZSBzZXQgdGhlIGNvbmZpZ3VyYXRpb24gdmlhIGEgY2FsbCB0byAuc2V0dXAKLQkgKiBiZWZvcmUgd2UgZ2V0IGhlcmUuCi0JICovCi0JaWYgKHNwaV9nZXRfY3RsZGF0YShtc2ctPnNwaSkgPT0gTlVMTCkgewotCQlzdGF0dXMgPSAtRUlOVkFMOwotCQlnb3RvIGVycjsKLQl9Ci0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCQlib29sIGxhc3RfeGZlciA9ICZ4ZmVyLT50cmFuc2Zlcl9saXN0ID09IG1zZy0+dHJhbnNmZXJzLnByZXY7CisJCWJvb2wgbGFzdF94ZmVyID0gbGlzdF9pc19sYXN0KCZ4ZmVyLT50cmFuc2Zlcl9saXN0LAorCQkJCQkgICAgICAmbXNnLT50cmFuc2ZlcnMpOwogCQlpbnQgciA9IG9jdGVvbl9zcGlfZG9fdHJhbnNmZXIocCwgbXNnLCB4ZmVyLCBsYXN0X3hmZXIpOwogCQlpZiAociA8IDApIHsKIAkJCXN0YXR1cyA9IHI7CkBAIC0xOTQsNDEgKzE3Miw2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIHN0cnVjdCBvY3Rlb25fc3BpX3NldHVwICpvY3Rlb25fc3BpX25ld19zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBvY3Rlb25fc3BpX3NldHVwICpzZXR1cCA9IGt6YWxsb2Moc2l6ZW9mKCpzZXR1cCksIEdGUF9LRVJORUwpOwotCWlmICghc2V0dXApCi0JCXJldHVybiBOVUxMOwotCi0Jc2V0dXAtPm1heF9zcGVlZF9oeiA9IHNwaS0+bWF4X3NwZWVkX2h6OwotCXNldHVwLT5jaGlwX3NlbGVjdCA9IHNwaS0+Y2hpcF9zZWxlY3Q7Ci0Jc2V0dXAtPm1vZGUgPSBzcGktPm1vZGU7Ci0Jc2V0dXAtPmJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JcmV0dXJuIHNldHVwOwotfQotCi1zdGF0aWMgaW50IG9jdGVvbl9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3Qgb2N0ZW9uX3NwaV9zZXR1cCAqbmV3X3NldHVwOwotCXN0cnVjdCBvY3Rlb25fc3BpX3NldHVwICpvbGRfc2V0dXAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKLQotCW5ld19zZXR1cCA9IG9jdGVvbl9zcGlfbmV3X3NldHVwKHNwaSk7Ci0JaWYgKCFuZXdfc2V0dXApCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc3BpX3NldF9jdGxkYXRhKHNwaSwgbmV3X3NldHVwKTsKLQlrZnJlZShvbGRfc2V0dXApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG9jdGVvbl9zcGlfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBvY3Rlb25fc3BpX3NldHVwICpvbGRfc2V0dXAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKLQlzcGlfc2V0X2N0bGRhdGEoc3BpLCBOVUxMKTsKLQlrZnJlZShvbGRfc2V0dXApOwotfQotCiBzdGF0aWMgaW50IG9jdGVvbl9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlc19tZW07CkBAIC0yNTcsOCArMjAwLDYgQEAKIAlwLT5yZWdpc3Rlcl9iYXNlID0gKHU2NClkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcmVzX21lbS0+c3RhcnQsCiAJCQkJCSAgICAgcmVzb3VyY2Vfc2l6ZShyZXNfbWVtKSk7CiAKLQkvKiBEeW5hbWljIGJ1cyBudW1iZXJpbmcgKi8KLQltYXN0ZXItPmJ1c19udW0gPSAtMTsKIAltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gNDsKIAltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUEhBIHwKIAkJCSAgICBTUElfQ1BPTCB8CkBAIC0yNjYsMTAgKzIwNyw5IEBACiAJCQkgICAgU1BJX0xTQl9GSVJTVCB8CiAJCQkgICAgU1BJXzNXSVJFOwogCi0JbWFzdGVyLT5zZXR1cCA9IG9jdGVvbl9zcGlfc2V0dXA7Ci0JbWFzdGVyLT5jbGVhbnVwID0gb2N0ZW9uX3NwaV9jbGVhbnVwOwogCW1hc3Rlci0+dHJhbnNmZXJfb25lX21lc3NhZ2UgPSBvY3Rlb25fc3BpX3RyYW5zZmVyX29uZV9tZXNzYWdlOwogCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19NQVNLKDgpOworCW1hc3Rlci0+bWF4X3NwZWVkX2h6ID0gT0NURU9OX1NQSV9NQVhfQ0xPQ0tfSFo7CiAKIAltYXN0ZXItPmRldi5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJZXJyID0gZGV2bV9zcGlfcmVnaXN0ZXJfbWFzdGVyKCZwZGV2LT5kZXYsIG1hc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktb21hcC0xMDBrLmMgYi9kcml2ZXJzL3NwaS9zcGktb21hcC0xMDBrLmMKaW5kZXggMGQzMjA1NC4uZTdmZmNkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLW9tYXAtMTAway5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1vbWFwLTEwMGsuYwpAQCAtODMsMTUgKzgzLDExIEBACiAjZGVmaW5lIFNQSV9TSFVURE9XTgkxCiAKIHN0cnVjdCBvbWFwMV9zcGkxMDBrIHsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAgICAgICAqbWFzdGVyOwogCXN0cnVjdCBjbGsgICAgICAgICAgICAgICppY2s7CiAJc3RydWN0IGNsayAgICAgICAgICAgICAgKmZjazsKIAogCS8qIFZpcnR1YWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBjb250cm9sbGVyICovCiAJdm9pZCBfX2lvbWVtICAgICAgICAgICAgKmJhc2U7Ci0KLQkvKiBTdGF0ZSBvZiB0aGUgU1BJICovCi0JdW5zaWduZWQgaW50CQlzdGF0ZTsKIH07CiAKIHN0cnVjdCBvbWFwMV9zcGkxMDBrX2NzIHsKQEAgLTk5LDEzICs5NSw2IEBACiAJaW50ICAgICAgICAgICAgICAgICAgICAgd29yZF9sZW47CiB9OwogCi0jZGVmaW5lIE1PRF9SRUdfQklUKHZhbCwgbWFzaywgc2V0KSBkbyB7IFwKLQlpZiAoc2V0KSBcCi0JCXZhbCB8PSBtYXNrOyBcCi0JZWxzZSBcCi0JCXZhbCAmPSB+bWFzazsgXAotfSB3aGlsZSAoMCkKLQogc3RhdGljIHZvaWQgc3BpMTAwa19lbmFibGVfY2xvY2soc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKIHsKIAl1bnNpZ25lZCBpbnQgdmFsOwpAQCAtMTM5LDcgKzEyOCw3IEBACiAJfQogCiAJc3BpMTAwa19lbmFibGVfY2xvY2sobWFzdGVyKTsKLQl3cml0ZXcoIGRhdGEgLCBzcGkxMDBrLT5iYXNlICsgU1BJX1RYX01TQik7CisJd3JpdGV3KGRhdGEgLCBzcGkxMDBrLT5iYXNlICsgU1BJX1RYX01TQik7CiAKIAl3cml0ZXcoU1BJX0NUUkxfU0VOKDApIHwKIAkgICAgICAgU1BJX0NUUkxfV09SRF9TSVpFKGxlbikgfApAQCAtMTQ3LDcgKzEzNiw4IEBACiAJICAgICAgIHNwaTEwMGstPmJhc2UgKyBTUElfQ1RSTCk7CiAKIAkvKiBXYWl0IGZvciBiaXQgYWNrIHNlbmQgY2hhbmdlICovCi0Jd2hpbGUoKHJlYWR3KHNwaTEwMGstPmJhc2UgKyBTUElfU1RBVFVTKSAmIFNQSV9TVEFUVVNfV0UpICE9IFNQSV9TVEFUVVNfV0UpOworCXdoaWxlICgocmVhZHcoc3BpMTAway0+YmFzZSArIFNQSV9TVEFUVVMpICYgU1BJX1NUQVRVU19XRSkgIT0gU1BJX1NUQVRVU19XRSkKKwkJOwogCXVkZWxheSgxMDAwKTsKIAogCXNwaTEwMGtfZGlzYWJsZV9jbG9jayhtYXN0ZXIpOwpAQCAtMTU1LDcgKzE0NSw3IEBACiAKIHN0YXRpYyBpbnQgc3BpMTAwa19yZWFkX2RhdGEoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwgaW50IGxlbikKIHsKLQlpbnQgZGF0YUgsZGF0YUw7CisJaW50IGRhdGFILCBkYXRhTDsKIAlzdHJ1Y3Qgb21hcDFfc3BpMTAwayAqc3BpMTAwayA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAogCS8qIEFsd2F5cyBkbyBhdCBsZWFzdCAxNiBiaXRzICovCkBAIC0xNjgsNyArMTU4LDggQEAKIAkgICAgICAgU1BJX0NUUkxfUkQsCiAJICAgICAgIHNwaTEwMGstPmJhc2UgKyBTUElfQ1RSTCk7CiAKLQl3aGlsZSgocmVhZHcoc3BpMTAway0+YmFzZSArIFNQSV9TVEFUVVMpICYgU1BJX1NUQVRVU19SRCkgIT0gU1BJX1NUQVRVU19SRCk7CisJd2hpbGUgKChyZWFkdyhzcGkxMDBrLT5iYXNlICsgU1BJX1NUQVRVUykgJiBTUElfU1RBVFVTX1JEKSAhPSBTUElfU1RBVFVTX1JEKQorCQk7CiAJdWRlbGF5KDEwMDApOwogCiAJZGF0YUwgPSByZWFkdyhzcGkxMDBrLT5iYXNlICsgU1BJX1JYX0xTQik7CkBAIC0yMDQsMTIgKzE5NSwxMCBAQAogc3RhdGljIHVuc2lnbmVkCiBvbWFwMV9zcGkxMDBrX3R4cnhfcGlvKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCiB7Ci0Jc3RydWN0IG9tYXAxX3NwaTEwMGsgICAgKnNwaTEwMGs7CiAJc3RydWN0IG9tYXAxX3NwaTEwMGtfY3MgKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwogCXVuc2lnbmVkIGludCAgICAgICAgICAgIGNvdW50LCBjOwogCWludCAgICAgICAgICAgICAgICAgICAgIHdvcmRfbGVuOwogCi0Jc3BpMTAwayA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwogCWNvdW50ID0geGZlci0+bGVuOwogCWMgPSBjb3VudDsKIAl3b3JkX2xlbiA9IGNzLT53b3JkX2xlbjsKQEAgLTIyMSwxMiArMjEwLDEyIEBACiAJCXJ4ID0geGZlci0+cnhfYnVmOwogCQl0eCA9IHhmZXItPnR4X2J1ZjsKIAkJZG8gewotCQkJYy09MTsKKwkJCWMgLT0gMTsKIAkJCWlmICh4ZmVyLT50eF9idWYgIT0gTlVMTCkKIAkJCQlzcGkxMDBrX3dyaXRlX2RhdGEoc3BpLT5tYXN0ZXIsIHdvcmRfbGVuLCAqdHgrKyk7CiAJCQlpZiAoeGZlci0+cnhfYnVmICE9IE5VTEwpCiAJCQkJKnJ4KysgPSBzcGkxMDBrX3JlYWRfZGF0YShzcGktPm1hc3Rlciwgd29yZF9sZW4pOwotCQl9IHdoaWxlKGMpOworCQl9IHdoaWxlIChjKTsKIAl9IGVsc2UgaWYgKHdvcmRfbGVuIDw9IDE2KSB7CiAJCXUxNiAgICAgICAgICAgICAqcng7CiAJCWNvbnN0IHUxNiAgICAgICAqdHg7CkBAIC0yMzQsMTIgKzIyMywxMiBAQAogCQlyeCA9IHhmZXItPnJ4X2J1ZjsKIAkJdHggPSB4ZmVyLT50eF9idWY7CiAJCWRvIHsKLQkJCWMtPTI7CisJCQljIC09IDI7CiAJCQlpZiAoeGZlci0+dHhfYnVmICE9IE5VTEwpCi0JCQkJc3BpMTAwa193cml0ZV9kYXRhKHNwaS0+bWFzdGVyLHdvcmRfbGVuLCAqdHgrKyk7CisJCQkJc3BpMTAwa193cml0ZV9kYXRhKHNwaS0+bWFzdGVyLCB3b3JkX2xlbiwgKnR4KyspOwogCQkJaWYgKHhmZXItPnJ4X2J1ZiAhPSBOVUxMKQotCQkJCSpyeCsrID0gc3BpMTAwa19yZWFkX2RhdGEoc3BpLT5tYXN0ZXIsd29yZF9sZW4pOwotCQl9IHdoaWxlKGMpOworCQkJCSpyeCsrID0gc3BpMTAwa19yZWFkX2RhdGEoc3BpLT5tYXN0ZXIsIHdvcmRfbGVuKTsKKwkJfSB3aGlsZSAoYyk7CiAJfSBlbHNlIGlmICh3b3JkX2xlbiA8PSAzMikgewogCQl1MzIgICAgICAgICAgICAgKnJ4OwogCQljb25zdCB1MzIgICAgICAgKnR4OwpAQCAtMjQ3LDEyICsyMzYsMTIgQEAKIAkJcnggPSB4ZmVyLT5yeF9idWY7CiAJCXR4ID0geGZlci0+dHhfYnVmOwogCQlkbyB7Ci0JCQljLT00OworCQkJYyAtPSA0OwogCQkJaWYgKHhmZXItPnR4X2J1ZiAhPSBOVUxMKQotCQkJCXNwaTEwMGtfd3JpdGVfZGF0YShzcGktPm1hc3Rlcix3b3JkX2xlbiwgKnR4KTsKKwkJCQlzcGkxMDBrX3dyaXRlX2RhdGEoc3BpLT5tYXN0ZXIsIHdvcmRfbGVuLCAqdHgpOwogCQkJaWYgKHhmZXItPnJ4X2J1ZiAhPSBOVUxMKQotCQkJCSpyeCA9IHNwaTEwMGtfcmVhZF9kYXRhKHNwaS0+bWFzdGVyLHdvcmRfbGVuKTsKLQkJfSB3aGlsZShjKTsKKwkJCQkqcnggPSBzcGkxMDBrX3JlYWRfZGF0YShzcGktPm1hc3Rlciwgd29yZF9sZW4pOworCQl9IHdoaWxlIChjKTsKIAl9CiAJcmV0dXJuIGNvdW50IC0gYzsKIH0KQEAgLTI5NCw3ICsyODMsNyBAQAogCXNwaTEwMGsgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKIAogCWlmICghY3MpIHsKLQkJY3MgPSBremFsbG9jKHNpemVvZiAqY3MsIEdGUF9LRVJORUwpOworCQljcyA9IGRldm1fa3phbGxvYygmc3BpLT5kZXYsIHNpemVvZigqY3MpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFjcykKIAkJCXJldHVybiAtRU5PTUVNOwogCQljcy0+YmFzZSA9IHNwaTEwMGstPmJhc2UgKyBzcGktPmNoaXBfc2VsZWN0ICogMHgxNDsKQEAgLTQxMSwxNCArNDAwLDE0IEBACiAJaWYgKCFwZGV2LT5pZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZiAqc3BpMTAwayk7CisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2YoKnNwaTEwMGspKTsKIAlpZiAobWFzdGVyID09IE5VTEwpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAibWFzdGVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJaWYgKHBkZXYtPmlkICE9IC0xKQotCSAgICAgICBtYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKKwkJbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7CiAKIAltYXN0ZXItPnNldHVwID0gb21hcDFfc3BpMTAwa19zZXR1cDsKIAltYXN0ZXItPnRyYW5zZmVyX29uZV9tZXNzYWdlID0gb21hcDFfc3BpMTAwa190cmFuc2Zlcl9vbmVfbWVzc2FnZTsKQEAgLTQzNCw3ICs0MjMsNiBAQAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1hc3Rlcik7CiAKIAlzcGkxMDBrID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCXNwaTEwMGstPm1hc3RlciA9IG1hc3RlcjsKIAogCS8qCiAJICogVGhlIG1lbW9yeSByZWdpb24gYmFzZSBhZGRyZXNzIGlzIHRha2VuIGFzIHRoZSBwbGF0Zm9ybV9kYXRhLgpAQCAtNDYxLDggKzQ0OSw2IEBACiAJaWYgKHN0YXR1cyA8IDApCiAJCWdvdG8gZXJyOwogCi0Jc3BpMTAway0+c3RhdGUgPSBTUElfUlVOTklORzsKLQogCXJldHVybiBzdGF0dXM7CiAKIGVycjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1vbWFwLXV3aXJlLmMgYi9kcml2ZXJzL3NwaS9zcGktb21hcC11d2lyZS5jCmluZGV4IDkzMTNmZDMuLmJlMmEyZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1vbWFwLXV3aXJlLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW9tYXAtdXdpcmUuYwpAQCAtOTksNyArOTksNiBAQAogfTsKIAogc3RydWN0IHV3aXJlX3N0YXRlIHsKLQl1bnNpZ25lZAliaXRzX3Blcl93b3JkOwogCXVuc2lnbmVkCWRpdjFfaWR4OwogfTsKIApAQCAtMjEwLDkgKzIwOSw4IEBACiAKIHN0YXRpYyBpbnQgdXdpcmVfdHhyeChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQogewotCXN0cnVjdCB1d2lyZV9zdGF0ZSAqdXN0ID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwogCXVuc2lnbmVkCWxlbiA9IHQtPmxlbjsKLQl1bnNpZ25lZAliaXRzID0gdXN0LT5iaXRzX3Blcl93b3JkOworCXVuc2lnbmVkCWJpdHMgPSB0LT5iaXRzX3Blcl93b3JkID8gOiBzcGktPmJpdHNfcGVyX3dvcmQ7CiAJdW5zaWduZWQJYnl0ZXM7CiAJdTE2CQl2YWwsIHc7CiAJaW50CQlzdGF0dXMgPSAwOwpAQCAtMjIwLDEwICsyMTgsNiBAQAogCWlmICghdC0+dHhfYnVmICYmICF0LT5yeF9idWYpCiAJCXJldHVybiAwOwogCi0JLyogTWljcm93aXJlIGRvZXNuJ3QgcmVhZCBhbmQgd3JpdGUgY29uY3VycmVudGx5ICovCi0JaWYgKHQtPnR4X2J1ZiAmJiB0LT5yeF9idWYpCi0JCXJldHVybiAtRVBFUk07Ci0KIAl3ID0gc3BpLT5jaGlwX3NlbGVjdCA8PCAxMDsKIAl3IHw9IENTX0NNRDsKIApAQCAtMzIyLDcgKzMxNiw2IEBACiAJc3RydWN0IHV3aXJlX3N0YXRlCSp1c3QgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CiAJc3RydWN0IHV3aXJlX3NwaQkqdXdpcmU7CiAJdW5zaWduZWQJCWZsYWdzID0gMDsKLQl1bnNpZ25lZAkJYml0czsKIAl1bnNpZ25lZAkJaHo7CiAJdW5zaWduZWQgbG9uZwkJcmF0ZTsKIAlpbnQJCQlkaXYxX2lkeDsKQEAgLTMzMiwyMyArMzI1LDYgQEAKIAogCXV3aXJlID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CiAKLQlpZiAoc3BpLT5jaGlwX3NlbGVjdCA+IDMpIHsKLQkJcHJfZGVidWcoIiVzOiBjcyVkP1xuIiwgZGV2X25hbWUoJnNwaS0+ZGV2KSwgc3BpLT5jaGlwX3NlbGVjdCk7Ci0JCXN0YXR1cyA9IC1FTk9ERVY7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQliaXRzID0gc3BpLT5iaXRzX3Blcl93b3JkOwotCWlmICh0ICE9IE5VTEwgJiYgdC0+Yml0c19wZXJfd29yZCkKLQkJYml0cyA9IHQtPmJpdHNfcGVyX3dvcmQ7Ci0KLQlpZiAoYml0cyA+IDE2KSB7Ci0JCXByX2RlYnVnKCIlczogd29yZHNpemUgJWQ/XG4iLCBkZXZfbmFtZSgmc3BpLT5kZXYpLCBiaXRzKTsKLQkJc3RhdHVzID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQl1c3QtPmJpdHNfcGVyX3dvcmQgPSBiaXRzOwotCiAJLyogbW9kZSAwLi4zLCBjbG9jayBpbnZlcnRlZCBzZXBhcmF0ZWx5OwogCSAqIHN0YW5kYXJkIG5DUyBzaWduYWxpbmc7CiAJICogZG9uJ3QgdHJlYXQgREk9aGlnaCBhcyAibm90IHJlYWR5IgpAQCAtNTAyLDYgKzQ3OCw3IEBACiAJCXN0YXR1cyA9IFBUUl9FUlIodXdpcmUtPmNrKTsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAibm8gZnVuY3Rpb25hbCBjbG9jaz9cbiIpOwogCQlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCQlpb3VubWFwKHV3aXJlX2Jhc2UpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAljbGtfZW5hYmxlKHV3aXJlLT5jayk7CkBAIC01MTUsNyArNDkyLDcgQEAKIAogCS8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLwogCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIOwotCisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX1JBTkdFX01BU0soMSwgMTYpOwogCW1hc3Rlci0+ZmxhZ3MgPSBTUElfTUFTVEVSX0hBTEZfRFVQTEVYOwogCiAJbWFzdGVyLT5idXNfbnVtID0gMjsJLyogIm9mZmljaWFsIiAqLwpAQCAtNTM5LDE0ICs1MTYsMTMgQEAKIHN0YXRpYyBpbnQgdXdpcmVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHV3aXJlX3NwaQkqdXdpcmUgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQJCQlzdGF0dXM7CiAKIAkvLyBGSVhNRSByZW1vdmUgYWxsIGNoaWxkIGRldmljZXMsIHNvbWV3aGVyZSAuLi4KIAotCXN0YXR1cyA9IHNwaV9iaXRiYW5nX3N0b3AoJnV3aXJlLT5iaXRiYW5nKTsKKwlzcGlfYml0YmFuZ19zdG9wKCZ1d2lyZS0+Yml0YmFuZyk7CiAJdXdpcmVfb2ZmKHV3aXJlKTsKIAlpb3VubWFwKHV3aXJlX2Jhc2UpOwotCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIDA7CiB9CiAKIC8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLW9tYXAyLW1jc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktb21hcDItbWNzcGkuYwppbmRleCBhNzIxMjdmLi4yOTQxYzViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktb21hcDItbWNzcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktb21hcDItbWNzcGkuYwpAQCAtMjIsNyArMjIsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC00NSw2ICs0NCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9zcGktb21hcDItbWNzcGkuaD4KIAogI2RlZmluZSBPTUFQMl9NQ1NQSV9NQVhfRlJFUQkJNDgwMDAwMDAKKyNkZWZpbmUgT01BUDJfTUNTUElfTUFYX0RJVklERVIJCTQwOTYKICNkZWZpbmUgT01BUDJfTUNTUElfTUFYX0ZJRk9ERVBUSAk2NAogI2RlZmluZSBPTUFQMl9NQ1NQSV9NQVhfRklGT1dDTlQJMHhGRkZGCiAjZGVmaW5lIFNQSV9BVVRPU1VTUEVORF9USU1FT1VUCQkyMDAwCkBAIC04OSw2ICs4OSw3IEBACiAjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9GT1JDRQlCSVQoMjApCiAjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9GRkVUCQlCSVQoMjcpCiAjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9GRkVSCQlCSVQoMjgpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9DTEtHCQlCSVQoMjkpCiAKICNkZWZpbmUgT01BUDJfTUNTUElfQ0hTVEFUX1JYUwkJQklUKDApCiAjZGVmaW5lIE9NQVAyX01DU1BJX0NIU1RBVF9UWFMJCUJJVCgxKQpAQCAtOTYsNiArOTcsNyBAQAogI2RlZmluZSBPTUFQMl9NQ1NQSV9DSFNUQVRfVFhGRkUJQklUKDMpCiAKICNkZWZpbmUgT01BUDJfTUNTUElfQ0hDVFJMX0VOCQlCSVQoMCkKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDVFJMX0VYVENMS19NQVNLCSgweGZmIDw8IDgpCiAKICNkZWZpbmUgT01BUDJfTUNTUElfV0FLRVVQRU5BQkxFX1dLRU4JQklUKDApCiAKQEAgLTE0OSw3ICsxNTEsNyBAQAogCWludAkJCXdvcmRfbGVuOwogCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKIAkvKiBDb250ZXh0IHNhdmUgYW5kIHJlc3RvcmUgc2hhZG93IHJlZ2lzdGVyICovCi0JdTMyCQkJY2hjb25mMDsKKwl1MzIJCQljaGNvbmYwLCBjaGN0cmwwOwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIG1jc3BpX3dyaXRlX3JlZyhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLApAQCAtMjMwLDEwICsyMzIsMTYgQEAKIAogc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfc2V0X2VuYWJsZShjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgZW5hYmxlKQogeworCXN0cnVjdCBvbWFwMl9tY3NwaV9jcyAqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CiAJdTMyIGw7CiAKLQlsID0gZW5hYmxlID8gT01BUDJfTUNTUElfQ0hDVFJMX0VOIDogMDsKLQltY3NwaV93cml0ZV9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENUUkwwLCBsKTsKKwlsID0gY3MtPmNoY3RybDA7CisJaWYgKGVuYWJsZSkKKwkJbCB8PSBPTUFQMl9NQ1NQSV9DSENUUkxfRU47CisJZWxzZQorCQlsICY9IH5PTUFQMl9NQ1NQSV9DSENUUkxfRU47CisJY3MtPmNoY3RybDAgPSBsOworCW1jc3BpX3dyaXRlX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIQ1RSTDAsIGNzLT5jaGN0cmwwKTsKIAkvKiBGbGFzaCBwb3N0LXdyaXRlcyAqLwogCW1jc3BpX3JlYWRfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDVFJMMCk7CiB9CkBAIC04NDAsNyArODQ4LDcgQEAKIAlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MgKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwogCXN0cnVjdCBvbWFwMl9tY3NwaSAqbWNzcGk7CiAJc3RydWN0IHNwaV9tYXN0ZXIgKnNwaV9jbnRybDsKLQl1MzIgbCA9IDAsIGRpdiA9IDA7CisJdTMyIGwgPSAwLCBjbGtkID0gMCwgZGl2LCBleHRjbGsgPSAwLCBjbGtnID0gMDsKIAl1OCB3b3JkX2xlbiA9IHNwaS0+Yml0c19wZXJfd29yZDsKIAl1MzIgc3BlZWRfaHogPSBzcGktPm1heF9zcGVlZF9oejsKIApAQCAtODU2LDcgKzg2NCwxNyBAQAogCQlzcGVlZF9oeiA9IHQtPnNwZWVkX2h6OwogCiAJc3BlZWRfaHogPSBtaW5fdCh1MzIsIHNwZWVkX2h6LCBPTUFQMl9NQ1NQSV9NQVhfRlJFUSk7Ci0JZGl2ID0gb21hcDJfbWNzcGlfY2FsY19kaXZpc29yKHNwZWVkX2h6KTsKKwlpZiAoc3BlZWRfaHogPCAoT01BUDJfTUNTUElfTUFYX0ZSRVEgLyBPTUFQMl9NQ1NQSV9NQVhfRElWSURFUikpIHsKKwkJY2xrZCA9IG9tYXAyX21jc3BpX2NhbGNfZGl2aXNvcihzcGVlZF9oeik7CisJCXNwZWVkX2h6ID0gT01BUDJfTUNTUElfTUFYX0ZSRVEgPj4gY2xrZDsKKwkJY2xrZyA9IDA7CisJfSBlbHNlIHsKKwkJZGl2ID0gKE9NQVAyX01DU1BJX01BWF9GUkVRICsgc3BlZWRfaHogLSAxKSAvIHNwZWVkX2h6OworCQlzcGVlZF9oeiA9IE9NQVAyX01DU1BJX01BWF9GUkVRIC8gZGl2OworCQljbGtkID0gKGRpdiAtIDEpICYgMHhmOworCQlleHRjbGsgPSAoZGl2IC0gMSkgPj4gNDsKKwkJY2xrZyA9IE9NQVAyX01DU1BJX0NIQ09ORl9DTEtHOworCX0KIAogCWwgPSBtY3NwaV9jYWNoZWRfY2hjb25mMChzcGkpOwogCkBAIC04ODUsNyArOTAzLDE2IEBACiAKIAkvKiBzZXQgY2xvY2sgZGl2aXNvciAqLwogCWwgJj0gfk9NQVAyX01DU1BJX0NIQ09ORl9DTEtEX01BU0s7Ci0JbCB8PSBkaXYgPDwgMjsKKwlsIHw9IGNsa2QgPDwgMjsKKworCS8qIHNldCBjbG9jayBncmFudWxhcml0eSAqLworCWwgJj0gfk9NQVAyX01DU1BJX0NIQ09ORl9DTEtHOworCWwgfD0gY2xrZzsKKwlpZiAoY2xrZykgeworCQljcy0+Y2hjdHJsMCAmPSB+T01BUDJfTUNTUElfQ0hDVFJMX0VYVENMS19NQVNLOworCQljcy0+Y2hjdHJsMCB8PSBleHRjbGsgPDwgODsKKwkJbWNzcGlfd3JpdGVfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDVFJMMCwgY3MtPmNoY3RybDApOworCX0KIAogCS8qIHNldCBTUEkgbW9kZSAwLi4zICovCiAJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUE9MKQpAQCAtOTAwLDcgKzkyNyw3IEBACiAJbWNzcGlfd3JpdGVfY2hjb25mMChzcGksIGwpOwogCiAJZGV2X2RiZygmc3BpLT5kZXYsICJzZXR1cDogc3BlZWQgJWQsIHNhbXBsZSAlcyBlZGdlLCBjbGsgJXNcbiIsCi0JCQlPTUFQMl9NQ1NQSV9NQVhfRlJFUSA+PiBkaXYsCisJCQlzcGVlZF9oeiwKIAkJCShzcGktPm1vZGUgJiBTUElfQ1BIQSkgPyAidHJhaWxpbmciIDogImxlYWRpbmciLAogCQkJKHNwaS0+bW9kZSAmIFNQSV9DUE9MKSA/ICJpbnZlcnRlZCIgOiAibm9ybWFsIik7CiAKQEAgLTk3Miw2ICs5OTksNyBAQAogCQljcy0+YmFzZSA9IG1jc3BpLT5iYXNlICsgc3BpLT5jaGlwX3NlbGVjdCAqIDB4MTQ7CiAJCWNzLT5waHlzID0gbWNzcGktPnBoeXMgKyBzcGktPmNoaXBfc2VsZWN0ICogMHgxNDsKIAkJY3MtPmNoY29uZjAgPSAwOworCQljcy0+Y2hjdHJsMCA9IDA7CiAJCXNwaS0+Y29udHJvbGxlcl9zdGF0ZSA9IGNzOwogCQkvKiBMaW5rIHRoaXMgdG8gY29udGV4dCBzYXZlIGxpc3QgKi8KIAkJbGlzdF9hZGRfdGFpbCgmY3MtPm5vZGUsICZjdHgtPmNzKTsKQEAgLTEwNTcsMTIgKzEwODUsMTUgQEAKIAkJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCQlicmVhazsKIAkJfQotCQlpZiAocGFyX292ZXJyaWRlIHx8IHQtPnNwZWVkX2h6IHx8IHQtPmJpdHNfcGVyX3dvcmQpIHsKKwkJaWYgKHBhcl9vdmVycmlkZSB8fAorCQkgICAgKHQtPnNwZWVkX2h6ICE9IHNwaS0+bWF4X3NwZWVkX2h6KSB8fAorCQkgICAgKHQtPmJpdHNfcGVyX3dvcmQgIT0gc3BpLT5iaXRzX3Blcl93b3JkKSkgewogCQkJcGFyX292ZXJyaWRlID0gMTsKIAkJCXN0YXR1cyA9IG9tYXAyX21jc3BpX3NldHVwX3RyYW5zZmVyKHNwaSwgdCk7CiAJCQlpZiAoc3RhdHVzIDwgMCkKIAkJCQlicmVhazsKLQkJCWlmICghdC0+c3BlZWRfaHogJiYgIXQtPmJpdHNfcGVyX3dvcmQpCisJCQlpZiAodC0+c3BlZWRfaHogPT0gc3BpLT5tYXhfc3BlZWRfaHogJiYKKwkJCSAgICB0LT5iaXRzX3Blcl93b3JkID09IHNwaS0+Yml0c19wZXJfd29yZCkKIAkJCQlwYXJfb3ZlcnJpZGUgPSAwOwogCQl9CiAJCWlmIChjZCAmJiBjZC0+Y3NfcGVyX3dvcmQpIHsKQEAgLTExNzYsMTYgKzEyMDcsMTIgQEAKIAltLT5hY3R1YWxfbGVuZ3RoID0gMDsKIAltLT5zdGF0dXMgPSAwOwogCi0JLyogcmVqZWN0IGludmFsaWQgbWVzc2FnZXMgYW5kIHRyYW5zZmVycyAqLwotCWlmIChsaXN0X2VtcHR5KCZtLT50cmFuc2ZlcnMpKQotCQlyZXR1cm4gLUVJTlZBTDsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKIAkJY29uc3Qgdm9pZAkqdHhfYnVmID0gdC0+dHhfYnVmOwogCQl2b2lkCQkqcnhfYnVmID0gdC0+cnhfYnVmOwogCQl1bnNpZ25lZAlsZW4gPSB0LT5sZW47CiAKLQkJaWYgKHQtPnNwZWVkX2h6ID4gT01BUDJfTUNTUElfTUFYX0ZSRVEKLQkJCQl8fCAobGVuICYmICEocnhfYnVmIHx8IHR4X2J1ZikpKSB7CisJCWlmICgobGVuICYmICEocnhfYnVmIHx8IHR4X2J1ZikpKSB7CiAJCQlkZXZfZGJnKG1jc3BpLT5kZXYsICJ0cmFuc2ZlcjogJWQgSHosICVkICVzJXMsICVkIGJwd1xuIiwKIAkJCQkJdC0+c3BlZWRfaHosCiAJCQkJCWxlbiwKQEAgLTExOTQsMTIgKzEyMjEsNiBAQAogCQkJCQl0LT5iaXRzX3Blcl93b3JkKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCWlmICh0LT5zcGVlZF9oeiAmJiB0LT5zcGVlZF9oeiA8IChPTUFQMl9NQ1NQSV9NQVhfRlJFUSA+PiAxNSkpIHsKLQkJCWRldl9kYmcobWNzcGktPmRldiwgInNwZWVkX2h6ICVkIGJlbG93IG1pbmltdW0gJWQgSHpcbiIsCi0JCQkJCXQtPnNwZWVkX2h6LAotCQkJCQlPTUFQMl9NQ1NQSV9NQVhfRlJFUSA+PiAxNSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQogCiAJCWlmIChtLT5pc19kbWFfbWFwcGVkIHx8IGxlbiA8IERNQV9NSU5fQllURVMpCiAJCQljb250aW51ZTsKQEAgLTEzMTEsNiArMTMzMiw4IEBACiAJbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IG9tYXAyX21jc3BpX3RyYW5zZmVyX29uZV9tZXNzYWdlOwogCW1hc3Rlci0+Y2xlYW51cCA9IG9tYXAyX21jc3BpX2NsZWFudXA7CiAJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IG5vZGU7CisJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSBPTUFQMl9NQ1NQSV9NQVhfRlJFUTsKKwltYXN0ZXItPm1pbl9zcGVlZF9oeiA9IE9NQVAyX01DU1BJX01BWF9GUkVRID4+IDE1OwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLW9yaW9uLmMgYi9kcml2ZXJzL3NwaS9zcGktb3Jpb24uYwppbmRleCA3ZjIxMjFmLi5kMDE4YTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktb3Jpb24uYworKysgYi9kcml2ZXJzL3NwaS9zcGktb3Jpb24uYwpAQCAtOSw3ICs5LDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTQzLDggKzQyLDYgQEAKIHN0cnVjdCBvcmlvbl9zcGkgewogCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7CiAJdm9pZCBfX2lvbWVtCQkqYmFzZTsKLQl1bnNpZ25lZCBpbnQJCW1heF9zcGVlZDsKLQl1bnNpZ25lZCBpbnQJCW1pbl9zcGVlZDsKIAlzdHJ1Y3QgY2xrICAgICAgICAgICAgICAqY2xrOwogfTsKIApAQCAtNzUsMjMgKzcyLDYgQEAKIAl3cml0ZWwodmFsLCByZWdfYWRkcik7CiB9CiAKLXN0YXRpYyBpbnQgb3Jpb25fc3BpX3NldF90cmFuc2Zlcl9zaXplKHN0cnVjdCBvcmlvbl9zcGkgKm9yaW9uX3NwaSwgaW50IHNpemUpCi17Ci0JaWYgKHNpemUgPT0gMTYpIHsKLQkJb3Jpb25fc3BpX3NldGJpdHMob3Jpb25fc3BpLCBPUklPTl9TUElfSUZfQ09ORklHX1JFRywKLQkJCQkgIE9SSU9OX1NQSV9JRl84XzE2X0JJVF9NT0RFKTsKLQl9IGVsc2UgaWYgKHNpemUgPT0gOCkgewotCQlvcmlvbl9zcGlfY2xyYml0cyhvcmlvbl9zcGksIE9SSU9OX1NQSV9JRl9DT05GSUdfUkVHLAotCQkJCSAgT1JJT05fU1BJX0lGXzhfMTZfQklUX01PREUpOwotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCJCYWQgYml0cyBwZXIgd29yZCB2YWx1ZSAlZCAob25seSA4IG9yIDE2IGFyZSBhbGxvd2VkKS5cbiIsCi0JCQlzaXplKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgb3Jpb25fc3BpX2JhdWRyYXRlX3NldChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1bnNpZ25lZCBpbnQgc3BlZWQpCiB7CiAJdTMyIHRjbGtfaHo7CkBAIC0xNzAsNyArMTUwLDE0IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlyZXR1cm4gb3Jpb25fc3BpX3NldF90cmFuc2Zlcl9zaXplKG9yaW9uX3NwaSwgYml0c19wZXJfd29yZCk7CisJaWYgKGJpdHNfcGVyX3dvcmQgPT0gMTYpCisJCW9yaW9uX3NwaV9zZXRiaXRzKG9yaW9uX3NwaSwgT1JJT05fU1BJX0lGX0NPTkZJR19SRUcsCisJCQkJICBPUklPTl9TUElfSUZfOF8xNl9CSVRfTU9ERSk7CisJZWxzZQorCQlvcmlvbl9zcGlfY2xyYml0cyhvcmlvbl9zcGksIE9SSU9OX1NQSV9JRl9DT05GSUdfUkVHLAorCQkJCSAgT1JJT05fU1BJX0lGXzhfMTZfQklUX01PREUpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIG9yaW9uX3NwaV9zZXRfY3Moc3RydWN0IG9yaW9uX3NwaSAqb3Jpb25fc3BpLCBpbnQgZW5hYmxlKQpAQCAtMjYwLDExICsyNDcsOSBAQAogc3RhdGljIHVuc2lnbmVkIGludAogb3Jpb25fc3BpX3dyaXRlX3JlYWQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKIHsKLQlzdHJ1Y3Qgb3Jpb25fc3BpICpvcmlvbl9zcGk7CiAJdW5zaWduZWQgaW50IGNvdW50OwogCWludCB3b3JkX2xlbjsKIAotCW9yaW9uX3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwogCXdvcmRfbGVuID0gc3BpLT5iaXRzX3Blcl93b3JkOwogCWNvdW50ID0geGZlci0+bGVuOwogCkBAIC0zMTAsMjcgKzI5NSw2IEBACiAJCWdvdG8gbXNnX2RvbmU7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQkJLyogbWFrZSBzdXJlIGJ1ZmZlciBsZW5ndGggaXMgZXZlbiB3aGVuIHdvcmtpbmcgaW4gMTYKLQkJICogYml0IG1vZGUqLwotCQlpZiAoKHQtPmJpdHNfcGVyX3dvcmQgPT0gMTYpICYmICh0LT5sZW4gJiAxKSkgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkJIm1lc3NhZ2UgcmVqZWN0ZWQgOiAiCi0JCQkJIm9kZCBkYXRhIGxlbmd0aCAlZCB3aGlsZSBpbiAxNiBiaXQgbW9kZVxuIiwKLQkJCQl0LT5sZW4pOwotCQkJc3RhdHVzID0gLUVJTzsKLQkJCWdvdG8gbXNnX2RvbmU7Ci0JCX0KLQotCQlpZiAodC0+c3BlZWRfaHogJiYgdC0+c3BlZWRfaHogPCBvcmlvbl9zcGktPm1pbl9zcGVlZCkgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkJIm1lc3NhZ2UgcmVqZWN0ZWQgOiAiCi0JCQkJImRldmljZSBtaW4gc3BlZWQgKCVkIEh6KSBleGNlZWRzICIKLQkJCQkicmVxdWlyZWQgdHJhbnNmZXIgc3BlZWQgKCVkIEh6KVxuIiwKLQkJCQlvcmlvbl9zcGktPm1pbl9zcGVlZCwgdC0+c3BlZWRfaHopOwotCQkJc3RhdHVzID0gLUVJTzsKLQkJCWdvdG8gbXNnX2RvbmU7Ci0JCX0KLQogCQlpZiAocGFyX292ZXJyaWRlIHx8IHQtPnNwZWVkX2h6IHx8IHQtPmJpdHNfcGVyX3dvcmQpIHsKIAkJCXBhcl9vdmVycmlkZSA9IDE7CiAJCQlzdGF0dXMgPSBvcmlvbl9zcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCB0KTsKQEAgLTM3NSwyOCArMzM5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvcmlvbl9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3Qgb3Jpb25fc3BpICpvcmlvbl9zcGk7Ci0KLQlvcmlvbl9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQotCWlmICgoc3BpLT5tYXhfc3BlZWRfaHogPT0gMCkKLQkJCXx8IChzcGktPm1heF9zcGVlZF9oeiA+IG9yaW9uX3NwaS0+bWF4X3NwZWVkKSkKLQkJc3BpLT5tYXhfc3BlZWRfaHogPSBvcmlvbl9zcGktPm1heF9zcGVlZDsKLQotCWlmIChzcGktPm1heF9zcGVlZF9oeiA8IG9yaW9uX3NwaS0+bWluX3NwZWVkKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAic2V0dXA6IHJlcXVlc3RlZCBzcGVlZCB0b28gbG93ICVkIEh6XG4iLAotCQkJc3BpLT5tYXhfc3BlZWRfaHopOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKgotCSAqIGJhdWRyYXRlICYgd2lkdGggd2lsbCBiZSBzZXQgb3Jpb25fc3BpX3NldHVwX3RyYW5zZmVyCi0JICovCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgb3Jpb25fc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKQEAgLTQyNSw5ICszNjcsOSBAQAogCS8qIHdlIHN1cHBvcnQgb25seSBtb2RlIDAsIGFuZCBubyBvcHRpb25zICovCiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BIQSB8IFNQSV9DUE9MOwogCi0JbWFzdGVyLT5zZXR1cCA9IG9yaW9uX3NwaV9zZXR1cDsKIAltYXN0ZXItPnRyYW5zZmVyX29uZV9tZXNzYWdlID0gb3Jpb25fc3BpX3RyYW5zZmVyX29uZV9tZXNzYWdlOwogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBPUklPTl9OVU1fQ0hJUFNFTEVDVFM7CisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soOCkgfCBTUElfQlBXX01BU0soMTYpOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKIApAQCAtNDQzLDggKzM4NSw4IEBACiAJY2xrX3ByZXBhcmUoc3BpLT5jbGspOwogCWNsa19lbmFibGUoc3BpLT5jbGspOwogCXRjbGtfaHogPSBjbGtfZ2V0X3JhdGUoc3BpLT5jbGspOwotCXNwaS0+bWF4X3NwZWVkID0gRElWX1JPVU5EX1VQKHRjbGtfaHosIDQpOwotCXNwaS0+bWluX3NwZWVkID0gRElWX1JPVU5EX1VQKHRjbGtfaHosIDMwKTsKKwltYXN0ZXItPm1heF9zcGVlZF9oeiA9IERJVl9ST1VORF9VUCh0Y2xrX2h6LCA0KTsKKwltYXN0ZXItPm1pbl9zcGVlZF9oeiA9IERJVl9ST1VORF9VUCh0Y2xrX2h6LCAzMCk7CiAKIAlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlzcGktPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktcGwwMjIuYyBiL2RyaXZlcnMvc3BpL3NwaS1wbDAyMi5jCmluZGV4IDI3ODliNDUuLjUxZDk5NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1wbDAyMi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1wbDAyMi5jCkBAIC00NTksOSArNDU5LDggQEAKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICpsYXN0X3RyYW5zZmVyOwogCXBsMDIyLT5uZXh0X21zZ19jc19hY3RpdmUgPSBmYWxzZTsKIAotCWxhc3RfdHJhbnNmZXIgPSBsaXN0X2VudHJ5KHBsMDIyLT5jdXJfbXNnLT50cmFuc2ZlcnMucHJldiwKLQkJCQkJc3RydWN0IHNwaV90cmFuc2ZlciwKLQkJCQkJdHJhbnNmZXJfbGlzdCk7CisJbGFzdF90cmFuc2ZlciA9IGxpc3RfbGFzdF9lbnRyeSgmcGwwMjItPmN1cl9tc2ctPnRyYW5zZmVycywKKwkJCQkJc3RydWN0IHNwaV90cmFuc2ZlciwgdHJhbnNmZXJfbGlzdCk7CiAKIAkvKiBEZWxheSBpZiByZXF1ZXN0ZWQgYmVmb3JlIGFueSBjaGFuZ2UgaW4gY2hpcCBzZWxlY3QgKi8KIAlpZiAobGFzdF90cmFuc2Zlci0+ZGVsYXlfdXNlY3MpCkBAIC0yMTA5LDggKzIxMDgsNiBAQAogCXBsMDIyLT5jaGlwc2VsZWN0cyA9IGRldm1fa3phbGxvYyhkZXYsIG51bV9jcyAqIHNpemVvZihpbnQpLAogCQkJCQkgIEdGUF9LRVJORUwpOwogCi0JcGluY3RybF9wbV9zZWxlY3RfZGVmYXVsdF9zdGF0ZShkZXYpOwotCiAJLyoKIAkgKiBCdXMgTnVtYmVyIFdoaWNoIGhhcyBiZWVuIEFzc2lnbmVkIHRvIHRoaXMgU1NQIGNvbnRyb2xsZXIKIAkgKiBvbiB0aGlzIGJvYXJkCkBAIC0yMTgzLDEzICsyMTgwLDcgQEAKIAkJZ290byBlcnJfbm9fY2xrOwogCX0KIAotCXN0YXR1cyA9IGNsa19wcmVwYXJlKHBsMDIyLT5jbGspOwotCWlmIChzdGF0dXMpIHsKLQkJZGV2X2VycigmYWRldi0+ZGV2LCAiY291bGQgbm90IHByZXBhcmUgU1NQL1NQSSBidXMgY2xvY2tcbiIpOwotCQlnb3RvICBlcnJfY2xrX3ByZXA7Ci0JfQotCi0Jc3RhdHVzID0gY2xrX2VuYWJsZShwbDAyMi0+Y2xrKTsKKwlzdGF0dXMgPSBjbGtfcHJlcGFyZV9lbmFibGUocGwwMjItPmNsayk7CiAJaWYgKHN0YXR1cykgewogCQlkZXZfZXJyKCZhZGV2LT5kZXYsICJjb3VsZCBub3QgZW5hYmxlIFNTUC9TUEkgYnVzIGNsb2NrXG4iKTsKIAkJZ290byBlcnJfbm9fY2xrX2VuOwpAQCAtMjI1MCwxMCArMjI0MSw4IEBACiAJaWYgKHBsYXRmb3JtX2luZm8tPmVuYWJsZV9kbWEpCiAJCXBsMDIyX2RtYV9yZW1vdmUocGwwMjIpOwogIGVycl9ub19pcnE6Ci0JY2xrX2Rpc2FibGUocGwwMjItPmNsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBsMDIyLT5jbGspOwogIGVycl9ub19jbGtfZW46Ci0JY2xrX3VucHJlcGFyZShwbDAyMi0+Y2xrKTsKLSBlcnJfY2xrX3ByZXA6CiAgZXJyX25vX2NsazoKICBlcnJfbm9faW9yZW1hcDoKIAlhbWJhX3JlbGVhc2VfcmVnaW9ucyhhZGV2KTsKQEAgLTIyODEsNDIgKzIyNzAsMTMgQEAKIAlpZiAocGwwMjItPm1hc3Rlcl9pbmZvLT5lbmFibGVfZG1hKQogCQlwbDAyMl9kbWFfcmVtb3ZlKHBsMDIyKTsKIAotCWNsa19kaXNhYmxlKHBsMDIyLT5jbGspOwotCWNsa191bnByZXBhcmUocGwwMjItPmNsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBsMDIyLT5jbGspOwogCWFtYmFfcmVsZWFzZV9yZWdpb25zKGFkZXYpOwogCXRhc2tsZXRfZGlzYWJsZSgmcGwwMjItPnB1bXBfdHJhbnNmZXJzKTsKIAlyZXR1cm4gMDsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX1NVU1BFTkQpIHx8IGRlZmluZWQoQ09ORklHX1BNX1JVTlRJTUUpCi0vKgotICogVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgdXNlZCBmcm9tIGJvdGggc3VzcGVuZC9yZXN1bWUgYW5kCi0gKiB0aGUgcnVudGltZSBjb3VudGVycGFydHMgdG8gaGFuZGxlIGV4dGVybmFsIHJlc291cmNlcyBsaWtlCi0gKiBjbG9ja3MsIHBpbnMgYW5kIHJlZ3VsYXRvcnMgd2hlbiBnb2luZyB0byBzbGVlcC4KLSAqLwotc3RhdGljIHZvaWQgcGwwMjJfc3VzcGVuZF9yZXNvdXJjZXMoc3RydWN0IHBsMDIyICpwbDAyMiwgYm9vbCBydW50aW1lKQotewotCWNsa19kaXNhYmxlKHBsMDIyLT5jbGspOwotCi0JaWYgKHJ1bnRpbWUpCi0JCXBpbmN0cmxfcG1fc2VsZWN0X2lkbGVfc3RhdGUoJnBsMDIyLT5hZGV2LT5kZXYpOwotCWVsc2UKLQkJcGluY3RybF9wbV9zZWxlY3Rfc2xlZXBfc3RhdGUoJnBsMDIyLT5hZGV2LT5kZXYpOwotfQotCi1zdGF0aWMgdm9pZCBwbDAyMl9yZXN1bWVfcmVzb3VyY2VzKHN0cnVjdCBwbDAyMiAqcGwwMjIsIGJvb2wgcnVudGltZSkKLXsKLQkvKiBGaXJzdCBnbyB0byB0aGUgZGVmYXVsdCBzdGF0ZSAqLwotCXBpbmN0cmxfcG1fc2VsZWN0X2RlZmF1bHRfc3RhdGUoJnBsMDIyLT5hZGV2LT5kZXYpOwotCWlmICghcnVudGltZSkKLQkJLyogVGhlbiBsZXQncyBpZGxlIHRoZSBwaW5zIHVudGlsIHRoZSBuZXh0IHRyYW5zZmVyIGhhcHBlbnMgKi8KLQkJcGluY3RybF9wbV9zZWxlY3RfaWRsZV9zdGF0ZSgmcGwwMjItPmFkZXYtPmRldik7Ci0KLQljbGtfZW5hYmxlKHBsMDIyLT5jbGspOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfU1VTUEVORAorI2lmZGVmIENPTkZJR19QTV9TTEVFUAogc3RhdGljIGludCBwbDAyMl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGwwMjIgKnBsMDIyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CkBAIC0yMzI4LDggKzIyODgsMTMgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlwbV9ydW50aW1lX2dldF9zeW5jKGRldik7Ci0JcGwwMjJfc3VzcGVuZF9yZXNvdXJjZXMocGwwMjIsIGZhbHNlKTsKKwlyZXQgPSBwbV9ydW50aW1lX2ZvcmNlX3N1c3BlbmQoZGV2KTsKKwlpZiAocmV0KSB7CisJCXNwaV9tYXN0ZXJfcmVzdW1lKHBsMDIyLT5tYXN0ZXIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXBpbmN0cmxfcG1fc2VsZWN0X3NsZWVwX3N0YXRlKGRldik7CiAKIAlkZXZfZGJnKGRldiwgInN1c3BlbmRlZFxuIik7CiAJcmV0dXJuIDA7CkBAIC0yMzQwLDggKzIzMDUsOSBAQAogCXN0cnVjdCBwbDAyMiAqcGwwMjIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgcmV0OwogCi0JcGwwMjJfcmVzdW1lX3Jlc291cmNlcyhwbDAyMiwgZmFsc2UpOwotCXBtX3J1bnRpbWVfcHV0KGRldik7CisJcmV0ID0gcG1fcnVudGltZV9mb3JjZV9yZXN1bWUoZGV2KTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGRldiwgInByb2JsZW0gcmVzdW1pbmdcbiIpOwogCiAJLyogU3RhcnQgdGhlIHF1ZXVlIHJ1bm5pbmcgKi8KIAlyZXQgPSBzcGlfbWFzdGVyX3Jlc3VtZShwbDAyMi0+bWFzdGVyKTsKQEAgLTIzNTIsMTQgKzIzMTgsMTYgQEAKIAogCXJldHVybiByZXQ7CiB9Ci0jZW5kaWYJLyogQ09ORklHX1BNICovCisjZW5kaWYKIAotI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCisjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IHBsMDIyX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBsMDIyICpwbDAyMiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JcGwwMjJfc3VzcGVuZF9yZXNvdXJjZXMocGwwMjIsIHRydWUpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShwbDAyMi0+Y2xrKTsKKwlwaW5jdHJsX3BtX3NlbGVjdF9pZGxlX3N0YXRlKGRldik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjM2NywxNCArMjMzNSwxNiBAQAogewogCXN0cnVjdCBwbDAyMiAqcGwwMjIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCXBsMDIyX3Jlc3VtZV9yZXNvdXJjZXMocGwwMjIsIHRydWUpOworCXBpbmN0cmxfcG1fc2VsZWN0X2RlZmF1bHRfc3RhdGUoZGV2KTsKKwljbGtfcHJlcGFyZV9lbmFibGUocGwwMjItPmNsayk7CisKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgcGwwMjJfZGV2X3BtX29wcyA9IHsKIAlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhwbDAyMl9zdXNwZW5kLCBwbDAyMl9yZXN1bWUpCi0JU0VUX1JVTlRJTUVfUE1fT1BTKHBsMDIyX3J1bnRpbWVfc3VzcGVuZCwgcGwwMjJfcnVudGltZV9yZXN1bWUsIE5VTEwpCisJU0VUX1BNX1JVTlRJTUVfUE1fT1BTKHBsMDIyX3J1bnRpbWVfc3VzcGVuZCwgcGwwMjJfcnVudGltZV9yZXN1bWUsIE5VTEwpCiB9OwogCiBzdGF0aWMgc3RydWN0IHZlbmRvcl9kYXRhIHZlbmRvcl9hcm0gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktcHBjNHh4LmMgYi9kcml2ZXJzL3NwaS9zcGktcHBjNHh4LmMKaW5kZXggNWVlNTY3Mi4uODBiODQwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXBwYzR4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1wcGM0eHguYwpAQCAtMjQsNyArMjQsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1weGEyeHgtZG1hLmMgYi9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LWRtYS5jCmluZGV4IDNjMGI1NTEuLjcxM2FmNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1weGEyeHgtZG1hLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1kbWEuYwpAQCAtOSw3ICs5LDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1weGEyeHgtcHhhZG1hLmMgYi9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LXB4YWRtYS5jCmluZGV4IDI5MTZlZmMuLmU4YTI2ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1weGEyeHgtcHhhZG1hLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1weGFkbWEuYwpAQCAtMTgsNyArMTgsNiBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LmMgYi9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LmMKaW5kZXggYzcwMmZjNS4uNDExODVkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1weGEyeHguYwpAQCAtMzYyLDggKzM2Miw3IEBACiAJZHJ2X2RhdGEtPmN1cl9tc2cgPSBOVUxMOwogCWRydl9kYXRhLT5jdXJfdHJhbnNmZXIgPSBOVUxMOwogCi0JbGFzdF90cmFuc2ZlciA9IGxpc3RfZW50cnkobXNnLT50cmFuc2ZlcnMucHJldiwKLQkJCQkJc3RydWN0IHNwaV90cmFuc2ZlciwKKwlsYXN0X3RyYW5zZmVyID0gbGlzdF9sYXN0X2VudHJ5KCZtc2ctPnRyYW5zZmVycywgc3RydWN0IHNwaV90cmFuc2ZlciwKIAkJCQkJdHJhbnNmZXJfbGlzdCk7CiAKIAkvKiBEZWxheSBpZiByZXF1ZXN0ZWQgYmVmb3JlIGFueSBjaGFuZ2UgaW4gY2hpcCBzZWxlY3QgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1xdXAuYyBiL2RyaXZlcnMvc3BpL3NwaS1xdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDMyZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpLXF1cC5jCkBAIC0wLDAgKzEsNzc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTQsIFRoZSBMaW51eCBmb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJldiAyIGFuZAorICogb25seSByZXYgMiBhcyBwdWJsaXNoZWQgYnkgdGhlIGZyZWUgU29mdHdhcmUgZm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgZklUTkVTUyBmT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2RlZmluZSBRVVBfQ09ORklHCQkJMHgwMDAwCisjZGVmaW5lIFFVUF9TVEFURQkJCTB4MDAwNAorI2RlZmluZSBRVVBfSU9fTV9NT0RFUwkJCTB4MDAwOAorI2RlZmluZSBRVVBfU1dfUkVTRVQJCQkweDAwMGMKKyNkZWZpbmUgUVVQX09QRVJBVElPTkFMCQkJMHgwMDE4CisjZGVmaW5lIFFVUF9FUlJPUl9GTEFHUwkJCTB4MDAxYworI2RlZmluZSBRVVBfRVJST1JfRkxBR1NfRU4JCTB4MDAyMAorI2RlZmluZSBRVVBfT1BFUkFUSU9OQUxfTUFTSwkJMHgwMDI4CisjZGVmaW5lIFFVUF9IV19WRVJTSU9OCQkJMHgwMDMwCisjZGVmaW5lIFFVUF9NWF9PVVRQVVRfQ05UCQkweDAxMDAKKyNkZWZpbmUgUVVQX09VVFBVVF9GSUZPCQkJMHgwMTEwCisjZGVmaW5lIFFVUF9NWF9XUklURV9DTlQJCTB4MDE1MAorI2RlZmluZSBRVVBfTVhfSU5QVVRfQ05UCQkweDAyMDAKKyNkZWZpbmUgUVVQX01YX1JFQURfQ05UCQkJMHgwMjA4CisjZGVmaW5lIFFVUF9JTlBVVF9GSUZPCQkJMHgwMjE4CisKKyNkZWZpbmUgU1BJX0NPTkZJRwkJCTB4MDMwMAorI2RlZmluZSBTUElfSU9fQ09OVFJPTAkJCTB4MDMwNAorI2RlZmluZSBTUElfRVJST1JfRkxBR1MJCQkweDAzMDgKKyNkZWZpbmUgU1BJX0VSUk9SX0ZMQUdTX0VOCQkweDAzMGMKKworLyogUVVQX0NPTkZJRyBmaWVsZHMgKi8KKyNkZWZpbmUgUVVQX0NPTkZJR19TUElfTU9ERQkJKDEgPDwgOCkKKyNkZWZpbmUgUVVQX0NPTkZJR19DTE9DS19BVVRPX0dBVEUJQklUKDEzKQorI2RlZmluZSBRVVBfQ09ORklHX05PX0lOUFVUCQlCSVQoNykKKyNkZWZpbmUgUVVQX0NPTkZJR19OT19PVVRQVVQJCUJJVCg2KQorI2RlZmluZSBRVVBfQ09ORklHX04JCQkweDAwMWYKKworLyogUVVQX1NUQVRFIGZpZWxkcyAqLworI2RlZmluZSBRVVBfU1RBVEVfVkFMSUQJCQlCSVQoMikKKyNkZWZpbmUgUVVQX1NUQVRFX1JFU0VUCQkJMAorI2RlZmluZSBRVVBfU1RBVEVfUlVOCQkJMQorI2RlZmluZSBRVVBfU1RBVEVfUEFVU0UJCQkzCisjZGVmaW5lIFFVUF9TVEFURV9NQVNLCQkJMworI2RlZmluZSBRVVBfU1RBVEVfQ0xFQVIJCQkyCisKKyNkZWZpbmUgUVVQX0hXX1ZFUlNJT05fMl8xXzEJCTB4MjAwMTAwMDEKKworLyogUVVQX0lPX01fTU9ERVMgZmllbGRzICovCisjZGVmaW5lIFFVUF9JT19NX1BBQ0tfRU4JCUJJVCgxNSkKKyNkZWZpbmUgUVVQX0lPX01fVU5QQUNLX0VOCQlCSVQoMTQpCisjZGVmaW5lIFFVUF9JT19NX0lOUFVUX01PREVfTUFTS19TSElGVAkxMgorI2RlZmluZSBRVVBfSU9fTV9PVVRQVVRfTU9ERV9NQVNLX1NISUZUCTEwCisjZGVmaW5lIFFVUF9JT19NX0lOUFVUX01PREVfTUFTSwkoMyA8PCBRVVBfSU9fTV9JTlBVVF9NT0RFX01BU0tfU0hJRlQpCisjZGVmaW5lIFFVUF9JT19NX09VVFBVVF9NT0RFX01BU0sJKDMgPDwgUVVQX0lPX01fT1VUUFVUX01PREVfTUFTS19TSElGVCkKKworI2RlZmluZSBRVVBfSU9fTV9PVVRQVVRfQkxPQ0tfU0laRSh4KQkoKCh4KSAmICgweDAzIDw8IDApKSA+PiAwKQorI2RlZmluZSBRVVBfSU9fTV9PVVRQVVRfRklGT19TSVpFKHgpCSgoKHgpICYgKDB4MDcgPDwgMikpID4+IDIpCisjZGVmaW5lIFFVUF9JT19NX0lOUFVUX0JMT0NLX1NJWkUoeCkJKCgoeCkgJiAoMHgwMyA8PCA1KSkgPj4gNSkKKyNkZWZpbmUgUVVQX0lPX01fSU5QVVRfRklGT19TSVpFKHgpCSgoKHgpICYgKDB4MDcgPDwgNykpID4+IDcpCisKKyNkZWZpbmUgUVVQX0lPX01fTU9ERV9GSUZPCQkwCisjZGVmaW5lIFFVUF9JT19NX01PREVfQkxPQ0sJCTEKKyNkZWZpbmUgUVVQX0lPX01fTU9ERV9ETU9WCQkyCisjZGVmaW5lIFFVUF9JT19NX01PREVfQkFNCQkzCisKKy8qIFFVUF9PUEVSQVRJT05BTCBmaWVsZHMgKi8KKyNkZWZpbmUgUVVQX09QX01BWF9JTlBVVF9ET05FX0ZMQUcJQklUKDExKQorI2RlZmluZSBRVVBfT1BfTUFYX09VVFBVVF9ET05FX0ZMQUcJQklUKDEwKQorI2RlZmluZSBRVVBfT1BfSU5fU0VSVklDRV9GTEFHCQlCSVQoOSkKKyNkZWZpbmUgUVVQX09QX09VVF9TRVJWSUNFX0ZMQUcJCUJJVCg4KQorI2RlZmluZSBRVVBfT1BfSU5fRklGT19GVUxMCQlCSVQoNykKKyNkZWZpbmUgUVVQX09QX09VVF9GSUZPX0ZVTEwJCUJJVCg2KQorI2RlZmluZSBRVVBfT1BfSU5fRklGT19OT1RfRU1QVFkJQklUKDUpCisjZGVmaW5lIFFVUF9PUF9PVVRfRklGT19OT1RfRU1QVFkJQklUKDQpCisKKy8qIFFVUF9FUlJPUl9GTEFHUyBhbmQgUVVQX0VSUk9SX0ZMQUdTX0VOIGZpZWxkcyAqLworI2RlZmluZSBRVVBfRVJST1JfT1VUUFVUX09WRVJfUlVOCUJJVCg1KQorI2RlZmluZSBRVVBfRVJST1JfSU5QVVRfVU5ERVJfUlVOCUJJVCg0KQorI2RlZmluZSBRVVBfRVJST1JfT1VUUFVUX1VOREVSX1JVTglCSVQoMykKKyNkZWZpbmUgUVVQX0VSUk9SX0lOUFVUX09WRVJfUlVOCUJJVCgyKQorCisvKiBTUElfQ09ORklHIGZpZWxkcyAqLworI2RlZmluZSBTUElfQ09ORklHX0hTX01PREUJCUJJVCgxMCkKKyNkZWZpbmUgU1BJX0NPTkZJR19JTlBVVF9GSVJTVAkJQklUKDkpCisjZGVmaW5lIFNQSV9DT05GSUdfTE9PUEJBQ0sJCUJJVCg4KQorCisvKiBTUElfSU9fQ09OVFJPTCBmaWVsZHMgKi8KKyNkZWZpbmUgU1BJX0lPX0NfRk9SQ0VfQ1MJCUJJVCgxMSkKKyNkZWZpbmUgU1BJX0lPX0NfQ0xLX0lETEVfSElHSAkJQklUKDEwKQorI2RlZmluZSBTUElfSU9fQ19NWF9DU19NT0RFCQlCSVQoOCkKKyNkZWZpbmUgU1BJX0lPX0NfQ1NfTl9QT0xBUklUWV8wCUJJVCg0KQorI2RlZmluZSBTUElfSU9fQ19DU19TRUxFQ1QoeCkJCSgoKHgpICYgMykgPDwgMikKKyNkZWZpbmUgU1BJX0lPX0NfQ1NfU0VMRUNUX01BU0sJCTB4MDAwYworI2RlZmluZSBTUElfSU9fQ19UUklTVEFURV9DUwkJQklUKDEpCisjZGVmaW5lIFNQSV9JT19DX05PX1RSSV9TVEFURQkJQklUKDApCisKKy8qIFNQSV9FUlJPUl9GTEFHUyBhbmQgU1BJX0VSUk9SX0ZMQUdTX0VOIGZpZWxkcyAqLworI2RlZmluZSBTUElfRVJST1JfQ0xLX09WRVJfUlVOCQlCSVQoMSkKKyNkZWZpbmUgU1BJX0VSUk9SX0NMS19VTkRFUl9SVU4JCUJJVCgwKQorCisjZGVmaW5lIFNQSV9OVU1fQ0hJUFNFTEVDVFMJCTQKKworLyogaGlnaCBzcGVlZCBtb2RlIGlzIHdoZW4gYnVzIHJhdGUgaXMgZ3JlYXRlciB0aGVuIDI2TUh6ICovCisjZGVmaW5lIFNQSV9IU19NSU5fUkFURQkJCTI2MDAwMDAwCisjZGVmaW5lIFNQSV9NQVhfUkFURQkJCTUwMDAwMDAwCisKKyNkZWZpbmUgU1BJX0RFTEFZX1RIUkVTSE9MRAkJMQorI2RlZmluZSBTUElfREVMQVlfUkVUUlkJCQkxMAorCitzdHJ1Y3Qgc3BpX3F1cCB7CisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBjbGsJCSpjY2xrOwkvKiBjb3JlIGNsb2NrICovCisJc3RydWN0IGNsawkJKmljbGs7CS8qIGludGVyZmFjZSBjbG9jayAqLworCWludAkJCWlycTsKKwlzcGlubG9ja190CQlsb2NrOworCisJaW50CQkJaW5fZmlmb19zejsKKwlpbnQJCQlvdXRfZmlmb19zejsKKwlpbnQJCQlpbl9ibGtfc3o7CisJaW50CQkJb3V0X2Jsa19zejsKKworCXN0cnVjdCBzcGlfdHJhbnNmZXIJKnhmZXI7CisJc3RydWN0IGNvbXBsZXRpb24JZG9uZTsKKwlpbnQJCQllcnJvcjsKKwlpbnQJCQl3X3NpemU7CS8qIGJ5dGVzIHBlciBTUEkgd29yZCAqLworCWludAkJCXR4X2J5dGVzOworCWludAkJCXJ4X2J5dGVzOworfTsKKworCitzdGF0aWMgaW5saW5lIGJvb2wgc3BpX3F1cF9pc192YWxpZF9zdGF0ZShzdHJ1Y3Qgc3BpX3F1cCAqY29udHJvbGxlcikKK3sKKwl1MzIgb3BzdGF0ZSA9IHJlYWRsX3JlbGF4ZWQoY29udHJvbGxlci0+YmFzZSArIFFVUF9TVEFURSk7CisKKwlyZXR1cm4gb3BzdGF0ZSAmIFFVUF9TVEFURV9WQUxJRDsKK30KKworc3RhdGljIGludCBzcGlfcXVwX3NldF9zdGF0ZShzdHJ1Y3Qgc3BpX3F1cCAqY29udHJvbGxlciwgdTMyIHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgbG9vcDsKKwl1MzIgY3VyX3N0YXRlOworCisJbG9vcCA9IDA7CisJd2hpbGUgKCFzcGlfcXVwX2lzX3ZhbGlkX3N0YXRlKGNvbnRyb2xsZXIpKSB7CisKKwkJdXNsZWVwX3JhbmdlKFNQSV9ERUxBWV9USFJFU0hPTEQsIFNQSV9ERUxBWV9USFJFU0hPTEQgKiAyKTsKKworCQlpZiAoKytsb29wID4gU1BJX0RFTEFZX1JFVFJZKQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGxvb3ApCisJCWRldl9kYmcoY29udHJvbGxlci0+ZGV2LCAiaW52YWxpZCBzdGF0ZSBmb3IgJWxkLHVzICVkXG4iLAorCQkJbG9vcCwgc3RhdGUpOworCisJY3VyX3N0YXRlID0gcmVhZGxfcmVsYXhlZChjb250cm9sbGVyLT5iYXNlICsgUVVQX1NUQVRFKTsKKwkvKgorCSAqIFBlciBzcGVjOiBmb3IgUEFVU0VfU1RBVEUgdG8gUkVTRVRfU1RBVEUsIHR3byB3cml0ZXMKKwkgKiBvZiAoYjEwKSBhcmUgcmVxdWlyZWQKKwkgKi8KKwlpZiAoKChjdXJfc3RhdGUgJiBRVVBfU1RBVEVfTUFTSykgPT0gUVVQX1NUQVRFX1BBVVNFKSAmJgorCSAgICAoc3RhdGUgPT0gUVVQX1NUQVRFX1JFU0VUKSkgeworCQl3cml0ZWxfcmVsYXhlZChRVVBfU1RBVEVfQ0xFQVIsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfU1RBVEUpOworCQl3cml0ZWxfcmVsYXhlZChRVVBfU1RBVEVfQ0xFQVIsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfU1RBVEUpOworCX0gZWxzZSB7CisJCWN1cl9zdGF0ZSAmPSB+UVVQX1NUQVRFX01BU0s7CisJCWN1cl9zdGF0ZSB8PSBzdGF0ZTsKKwkJd3JpdGVsX3JlbGF4ZWQoY3VyX3N0YXRlLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX1NUQVRFKTsKKwl9CisKKwlsb29wID0gMDsKKwl3aGlsZSAoIXNwaV9xdXBfaXNfdmFsaWRfc3RhdGUoY29udHJvbGxlcikpIHsKKworCQl1c2xlZXBfcmFuZ2UoU1BJX0RFTEFZX1RIUkVTSE9MRCwgU1BJX0RFTEFZX1RIUkVTSE9MRCAqIDIpOworCisJCWlmICgrK2xvb3AgPiBTUElfREVMQVlfUkVUUlkpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBzcGlfcXVwX2ZpZm9fcmVhZChzdHJ1Y3Qgc3BpX3F1cCAqY29udHJvbGxlciwKKwkJCSAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCXU4ICpyeF9idWYgPSB4ZmVyLT5yeF9idWY7CisJdTMyIHdvcmQsIHN0YXRlOworCWludCBpZHgsIHNoaWZ0LCB3X3NpemU7CisKKwl3X3NpemUgPSBjb250cm9sbGVyLT53X3NpemU7CisKKwl3aGlsZSAoY29udHJvbGxlci0+cnhfYnl0ZXMgPCB4ZmVyLT5sZW4pIHsKKworCQlzdGF0ZSA9IHJlYWRsX3JlbGF4ZWQoY29udHJvbGxlci0+YmFzZSArIFFVUF9PUEVSQVRJT05BTCk7CisJCWlmICgwID09IChzdGF0ZSAmIFFVUF9PUF9JTl9GSUZPX05PVF9FTVBUWSkpCisJCQlicmVhazsKKworCQl3b3JkID0gcmVhZGxfcmVsYXhlZChjb250cm9sbGVyLT5iYXNlICsgUVVQX0lOUFVUX0ZJRk8pOworCisJCWlmICghcnhfYnVmKSB7CisJCQljb250cm9sbGVyLT5yeF9ieXRlcyArPSB3X3NpemU7CisJCQljb250aW51ZTsKKwkJfQorCisJCWZvciAoaWR4ID0gMDsgaWR4IDwgd19zaXplOyBpZHgrKywgY29udHJvbGxlci0+cnhfYnl0ZXMrKykgeworCQkJLyoKKwkJCSAqIFRoZSBkYXRhIGZvcm1hdCBkZXBlbmRzIG9uIGJ5dGVzIHBlciBTUEkgd29yZDoKKwkJCSAqICA0IGJ5dGVzOiAweDEyMzQ1Njc4CisJCQkgKiAgMiBieXRlczogMHgwMDAwMTIzNAorCQkJICogIDEgYnl0ZSA6IDB4MDAwMDAwMTIKKwkJCSAqLworCQkJc2hpZnQgPSBCSVRTX1BFUl9CWVRFOworCQkJc2hpZnQgKj0gKHdfc2l6ZSAtIGlkeCAtIDEpOworCQkJcnhfYnVmW2NvbnRyb2xsZXItPnJ4X2J5dGVzXSA9IHdvcmQgPj4gc2hpZnQ7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNwaV9xdXBfZmlmb193cml0ZShzdHJ1Y3Qgc3BpX3F1cCAqY29udHJvbGxlciwKKwkJCSAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCWNvbnN0IHU4ICp0eF9idWYgPSB4ZmVyLT50eF9idWY7CisJdTMyIHdvcmQsIHN0YXRlLCBkYXRhOworCWludCBpZHgsIHdfc2l6ZTsKKworCXdfc2l6ZSA9IGNvbnRyb2xsZXItPndfc2l6ZTsKKworCXdoaWxlIChjb250cm9sbGVyLT50eF9ieXRlcyA8IHhmZXItPmxlbikgeworCisJCXN0YXRlID0gcmVhZGxfcmVsYXhlZChjb250cm9sbGVyLT5iYXNlICsgUVVQX09QRVJBVElPTkFMKTsKKwkJaWYgKHN0YXRlICYgUVVQX09QX09VVF9GSUZPX0ZVTEwpCisJCQlicmVhazsKKworCQl3b3JkID0gMDsKKwkJZm9yIChpZHggPSAwOyBpZHggPCB3X3NpemU7IGlkeCsrLCBjb250cm9sbGVyLT50eF9ieXRlcysrKSB7CisKKwkJCWlmICghdHhfYnVmKSB7CisJCQkJY29udHJvbGxlci0+dHhfYnl0ZXMgKz0gd19zaXplOworCQkJCWJyZWFrOworCQkJfQorCisJCQlkYXRhID0gdHhfYnVmW2NvbnRyb2xsZXItPnR4X2J5dGVzXTsKKwkJCXdvcmQgfD0gZGF0YSA8PCAoQklUU19QRVJfQllURSAqICgzIC0gaWR4KSk7CisJCX0KKworCQl3cml0ZWxfcmVsYXhlZCh3b3JkLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX09VVFBVVF9GSUZPKTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzcGlfcXVwX3F1cF9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBzcGlfcXVwICpjb250cm9sbGVyID0gZGV2X2lkOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXI7CisJdTMyIG9wZmxhZ3MsIHF1cF9lcnIsIHNwaV9lcnI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyb3IgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwl4ZmVyID0gY29udHJvbGxlci0+eGZlcjsKKwljb250cm9sbGVyLT54ZmVyID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisKKwlxdXBfZXJyID0gcmVhZGxfcmVsYXhlZChjb250cm9sbGVyLT5iYXNlICsgUVVQX0VSUk9SX0ZMQUdTKTsKKwlzcGlfZXJyID0gcmVhZGxfcmVsYXhlZChjb250cm9sbGVyLT5iYXNlICsgU1BJX0VSUk9SX0ZMQUdTKTsKKwlvcGZsYWdzID0gcmVhZGxfcmVsYXhlZChjb250cm9sbGVyLT5iYXNlICsgUVVQX09QRVJBVElPTkFMKTsKKworCXdyaXRlbF9yZWxheGVkKHF1cF9lcnIsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfRVJST1JfRkxBR1MpOworCXdyaXRlbF9yZWxheGVkKHNwaV9lcnIsIGNvbnRyb2xsZXItPmJhc2UgKyBTUElfRVJST1JfRkxBR1MpOworCXdyaXRlbF9yZWxheGVkKG9wZmxhZ3MsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfT1BFUkFUSU9OQUwpOworCisJaWYgKCF4ZmVyKSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoY29udHJvbGxlci0+ZGV2LCAidW5leHBlY3RlZCBpcnEgJXgwOCAleDA4ICV4MDhcbiIsCisJCQkJICAgIHF1cF9lcnIsIHNwaV9lcnIsIG9wZmxhZ3MpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKHF1cF9lcnIpIHsKKwkJaWYgKHF1cF9lcnIgJiBRVVBfRVJST1JfT1VUUFVUX09WRVJfUlVOKQorCQkJZGV2X3dhcm4oY29udHJvbGxlci0+ZGV2LCAiT1VUUFVUX09WRVJfUlVOXG4iKTsKKwkJaWYgKHF1cF9lcnIgJiBRVVBfRVJST1JfSU5QVVRfVU5ERVJfUlVOKQorCQkJZGV2X3dhcm4oY29udHJvbGxlci0+ZGV2LCAiSU5QVVRfVU5ERVJfUlVOXG4iKTsKKwkJaWYgKHF1cF9lcnIgJiBRVVBfRVJST1JfT1VUUFVUX1VOREVSX1JVTikKKwkJCWRldl93YXJuKGNvbnRyb2xsZXItPmRldiwgIk9VVFBVVF9VTkRFUl9SVU5cbiIpOworCQlpZiAocXVwX2VyciAmIFFVUF9FUlJPUl9JTlBVVF9PVkVSX1JVTikKKwkJCWRldl93YXJuKGNvbnRyb2xsZXItPmRldiwgIklOUFVUX09WRVJfUlVOXG4iKTsKKworCQllcnJvciA9IC1FSU87CisJfQorCisJaWYgKHNwaV9lcnIpIHsKKwkJaWYgKHNwaV9lcnIgJiBTUElfRVJST1JfQ0xLX09WRVJfUlVOKQorCQkJZGV2X3dhcm4oY29udHJvbGxlci0+ZGV2LCAiQ0xLX09WRVJfUlVOXG4iKTsKKwkJaWYgKHNwaV9lcnIgJiBTUElfRVJST1JfQ0xLX1VOREVSX1JVTikKKwkJCWRldl93YXJuKGNvbnRyb2xsZXItPmRldiwgIkNMS19VTkRFUl9SVU5cbiIpOworCisJCWVycm9yID0gLUVJTzsKKwl9CisKKwlpZiAob3BmbGFncyAmIFFVUF9PUF9JTl9TRVJWSUNFX0ZMQUcpCisJCXNwaV9xdXBfZmlmb19yZWFkKGNvbnRyb2xsZXIsIHhmZXIpOworCisJaWYgKG9wZmxhZ3MgJiBRVVBfT1BfT1VUX1NFUlZJQ0VfRkxBRykKKwkJc3BpX3F1cF9maWZvX3dyaXRlKGNvbnRyb2xsZXIsIHhmZXIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwljb250cm9sbGVyLT5lcnJvciA9IGVycm9yOworCWNvbnRyb2xsZXItPnhmZXIgPSB4ZmVyOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKworCWlmIChjb250cm9sbGVyLT5yeF9ieXRlcyA9PSB4ZmVyLT5sZW4gfHwgZXJyb3IpCisJCWNvbXBsZXRlKCZjb250cm9sbGVyLT5kb25lKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKiBzZXQgY2xvY2sgZnJlcSAuLi4gYml0cyBwZXIgd29yZCAqLworc3RhdGljIGludCBzcGlfcXVwX2lvX2NvbmZpZyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCXN0cnVjdCBzcGlfcXVwICpjb250cm9sbGVyID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJdTMyIGNvbmZpZywgaW9tb2RlLCBtb2RlOworCWludCByZXQsIG5fd29yZHMsIHdfc2l6ZTsKKworCWlmIChzcGktPm1vZGUgJiBTUElfTE9PUCAmJiB4ZmVyLT5sZW4gPiBjb250cm9sbGVyLT5pbl9maWZvX3N6KSB7CisJCWRldl9lcnIoY29udHJvbGxlci0+ZGV2LCAidG9vIGJpZyBzaXplIGZvciBsb29wYmFjayAlZCA+ICVkXG4iLAorCQkJeGZlci0+bGVuLCBjb250cm9sbGVyLT5pbl9maWZvX3N6KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gY2xrX3NldF9yYXRlKGNvbnRyb2xsZXItPmNjbGssIHhmZXItPnNwZWVkX2h6KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY29udHJvbGxlci0+ZGV2LCAiZmFpbCB0byBzZXQgZnJlcXVlbmN5ICVkIiwKKwkJCXhmZXItPnNwZWVkX2h6KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKHNwaV9xdXBfc2V0X3N0YXRlKGNvbnRyb2xsZXIsIFFVUF9TVEFURV9SRVNFVCkpIHsKKwkJZGV2X2Vycihjb250cm9sbGVyLT5kZXYsICJjYW5ub3Qgc2V0IFJFU0VUIHN0YXRlXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJd19zaXplID0gNDsKKwlpZiAoeGZlci0+Yml0c19wZXJfd29yZCA8PSA4KQorCQl3X3NpemUgPSAxOworCWVsc2UgaWYgKHhmZXItPmJpdHNfcGVyX3dvcmQgPD0gMTYpCisJCXdfc2l6ZSA9IDI7CisKKwluX3dvcmRzID0geGZlci0+bGVuIC8gd19zaXplOworCWNvbnRyb2xsZXItPndfc2l6ZSA9IHdfc2l6ZTsKKworCWlmIChuX3dvcmRzIDw9IGNvbnRyb2xsZXItPmluX2ZpZm9fc3opIHsKKwkJbW9kZSA9IFFVUF9JT19NX01PREVfRklGTzsKKwkJd3JpdGVsX3JlbGF4ZWQobl93b3JkcywgY29udHJvbGxlci0+YmFzZSArIFFVUF9NWF9SRUFEX0NOVCk7CisJCXdyaXRlbF9yZWxheGVkKG5fd29yZHMsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfTVhfV1JJVEVfQ05UKTsKKwkJLyogbXVzdCBiZSB6ZXJvIGZvciBGSUZPICovCisJCXdyaXRlbF9yZWxheGVkKDAsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfTVhfSU5QVVRfQ05UKTsKKwkJd3JpdGVsX3JlbGF4ZWQoMCwgY29udHJvbGxlci0+YmFzZSArIFFVUF9NWF9PVVRQVVRfQ05UKTsKKwl9IGVsc2UgeworCQltb2RlID0gUVVQX0lPX01fTU9ERV9CTE9DSzsKKwkJd3JpdGVsX3JlbGF4ZWQobl93b3JkcywgY29udHJvbGxlci0+YmFzZSArIFFVUF9NWF9JTlBVVF9DTlQpOworCQl3cml0ZWxfcmVsYXhlZChuX3dvcmRzLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX01YX09VVFBVVF9DTlQpOworCQkvKiBtdXN0IGJlIHplcm8gZm9yIEJMT0NLIGFuZCBCQU0gKi8KKwkJd3JpdGVsX3JlbGF4ZWQoMCwgY29udHJvbGxlci0+YmFzZSArIFFVUF9NWF9SRUFEX0NOVCk7CisJCXdyaXRlbF9yZWxheGVkKDAsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfTVhfV1JJVEVfQ05UKTsKKwl9CisKKwlpb21vZGUgPSByZWFkbF9yZWxheGVkKGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfSU9fTV9NT0RFUyk7CisJLyogU2V0IGlucHV0IGFuZCBvdXRwdXQgdHJhbnNmZXIgbW9kZSAqLworCWlvbW9kZSAmPSB+KFFVUF9JT19NX0lOUFVUX01PREVfTUFTSyB8IFFVUF9JT19NX09VVFBVVF9NT0RFX01BU0spOworCWlvbW9kZSAmPSB+KFFVUF9JT19NX1BBQ0tfRU4gfCBRVVBfSU9fTV9VTlBBQ0tfRU4pOworCWlvbW9kZSB8PSAobW9kZSA8PCBRVVBfSU9fTV9PVVRQVVRfTU9ERV9NQVNLX1NISUZUKTsKKwlpb21vZGUgfD0gKG1vZGUgPDwgUVVQX0lPX01fSU5QVVRfTU9ERV9NQVNLX1NISUZUKTsKKworCXdyaXRlbF9yZWxheGVkKGlvbW9kZSwgY29udHJvbGxlci0+YmFzZSArIFFVUF9JT19NX01PREVTKTsKKworCWNvbmZpZyA9IHJlYWRsX3JlbGF4ZWQoY29udHJvbGxlci0+YmFzZSArIFNQSV9DT05GSUcpOworCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9MT09QKQorCQljb25maWcgfD0gU1BJX0NPTkZJR19MT09QQkFDSzsKKwllbHNlCisJCWNvbmZpZyAmPSB+U1BJX0NPTkZJR19MT09QQkFDSzsKKworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKKwkJY29uZmlnICY9IH5TUElfQ09ORklHX0lOUFVUX0ZJUlNUOworCWVsc2UKKwkJY29uZmlnIHw9IFNQSV9DT05GSUdfSU5QVVRfRklSU1Q7CisKKwkvKgorCSAqIEhTX01PREUgaW1wcm92ZXMgc2lnbmFsIHN0YWJpbGl0eSBmb3Igc3BpLWNsayBoaWdoIHJhdGVzLAorCSAqIGJ1dCBpcyBpbnZhbGlkIGluIGxvb3AgYmFjayBtb2RlLgorCSAqLworCWlmICgoeGZlci0+c3BlZWRfaHogPj0gU1BJX0hTX01JTl9SQVRFKSAmJiAhKHNwaS0+bW9kZSAmIFNQSV9MT09QKSkKKwkJY29uZmlnIHw9IFNQSV9DT05GSUdfSFNfTU9ERTsKKwllbHNlCisJCWNvbmZpZyAmPSB+U1BJX0NPTkZJR19IU19NT0RFOworCisJd3JpdGVsX3JlbGF4ZWQoY29uZmlnLCBjb250cm9sbGVyLT5iYXNlICsgU1BJX0NPTkZJRyk7CisKKwljb25maWcgPSByZWFkbF9yZWxheGVkKGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfQ09ORklHKTsKKwljb25maWcgJj0gfihRVVBfQ09ORklHX05PX0lOUFVUIHwgUVVQX0NPTkZJR19OT19PVVRQVVQgfCBRVVBfQ09ORklHX04pOworCWNvbmZpZyB8PSB4ZmVyLT5iaXRzX3Blcl93b3JkIC0gMTsKKwljb25maWcgfD0gUVVQX0NPTkZJR19TUElfTU9ERTsKKwl3cml0ZWxfcmVsYXhlZChjb25maWcsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfQ09ORklHKTsKKworCXdyaXRlbF9yZWxheGVkKDAsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfT1BFUkFUSU9OQUxfTUFTSyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNwaV9xdXBfc2V0X2NzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBzcGlfcXVwICpjb250cm9sbGVyID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwl1MzIgaW9jb250b2wsIG1hc2s7CisKKwlpb2NvbnRvbCA9IHJlYWRsX3JlbGF4ZWQoY29udHJvbGxlci0+YmFzZSArIFNQSV9JT19DT05UUk9MKTsKKworCS8qIERpc2FibGUgYXV0byBDUyB0b2dnbGUgYW5kIHVzZSBtYW51YWwgKi8KKwlpb2NvbnRvbCAmPSB+U1BJX0lPX0NfTVhfQ1NfTU9ERTsKKwlpb2NvbnRvbCB8PSBTUElfSU9fQ19GT1JDRV9DUzsKKworCWlvY29udG9sICY9IH5TUElfSU9fQ19DU19TRUxFQ1RfTUFTSzsKKwlpb2NvbnRvbCB8PSBTUElfSU9fQ19DU19TRUxFQ1Qoc3BpLT5jaGlwX3NlbGVjdCk7CisKKwltYXNrID0gU1BJX0lPX0NfQ1NfTl9QT0xBUklUWV8wIDw8IHNwaS0+Y2hpcF9zZWxlY3Q7CisKKwlpZiAoZW5hYmxlKQorCQlpb2NvbnRvbCB8PSBtYXNrOworCWVsc2UKKwkJaW9jb250b2wgJj0gfm1hc2s7CisKKwl3cml0ZWxfcmVsYXhlZChpb2NvbnRvbCwgY29udHJvbGxlci0+YmFzZSArIFNQSV9JT19DT05UUk9MKTsKK30KKworc3RhdGljIGludCBzcGlfcXVwX3RyYW5zZmVyX29uZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJICAgICAgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCSAgICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJc3RydWN0IHNwaV9xdXAgKmNvbnRyb2xsZXIgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0LCBmbGFnczsKKwlpbnQgcmV0ID0gLUVJTzsKKworCXJldCA9IHNwaV9xdXBfaW9fY29uZmlnKHNwaSwgeGZlcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXRpbWVvdXQgPSBESVZfUk9VTkRfVVAoeGZlci0+c3BlZWRfaHosIE1TRUNfUEVSX1NFQyk7CisJdGltZW91dCA9IERJVl9ST1VORF9VUCh4ZmVyLT5sZW4gKiA4LCB0aW1lb3V0KTsKKwl0aW1lb3V0ID0gMTAwICogbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KTsKKworCXJlaW5pdF9jb21wbGV0aW9uKCZjb250cm9sbGVyLT5kb25lKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJY29udHJvbGxlci0+eGZlciAgICAgPSB4ZmVyOworCWNvbnRyb2xsZXItPmVycm9yICAgID0gMDsKKwljb250cm9sbGVyLT5yeF9ieXRlcyA9IDA7CisJY29udHJvbGxlci0+dHhfYnl0ZXMgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKworCWlmIChzcGlfcXVwX3NldF9zdGF0ZShjb250cm9sbGVyLCBRVVBfU1RBVEVfUlVOKSkgeworCQlkZXZfd2Fybihjb250cm9sbGVyLT5kZXYsICJjYW5ub3Qgc2V0IFJVTiBzdGF0ZVxuIik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoc3BpX3F1cF9zZXRfc3RhdGUoY29udHJvbGxlciwgUVVQX1NUQVRFX1BBVVNFKSkgeworCQlkZXZfd2Fybihjb250cm9sbGVyLT5kZXYsICJjYW5ub3Qgc2V0IFBBVVNFIHN0YXRlXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCXNwaV9xdXBfZmlmb193cml0ZShjb250cm9sbGVyLCB4ZmVyKTsKKworCWlmIChzcGlfcXVwX3NldF9zdGF0ZShjb250cm9sbGVyLCBRVVBfU1RBVEVfUlVOKSkgeworCQlkZXZfd2Fybihjb250cm9sbGVyLT5kZXYsICJjYW5ub3Qgc2V0IEVYRUNVVEUgc3RhdGVcbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmNvbnRyb2xsZXItPmRvbmUsIHRpbWVvdXQpKQorCQlyZXQgPSAtRVRJTUVET1VUOworZXhpdDoKKwlzcGlfcXVwX3NldF9zdGF0ZShjb250cm9sbGVyLCBRVVBfU1RBVEVfUkVTRVQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJY29udHJvbGxlci0+eGZlciA9IE5VTEw7CisJaWYgKCFyZXQpCisJCXJldCA9IGNvbnRyb2xsZXItPmVycm9yOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNwaV9xdXBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCBjbGsgKmljbGssICpjY2xrOworCXN0cnVjdCBzcGlfcXVwICpjb250cm9sbGVyOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdTMyIGRhdGEsIG1heF9mcmVxLCBpb21vZGU7CisJaW50IHJldCwgaXJxLCBzaXplOworCisJZGV2ID0gJnBkZXYtPmRldjsKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIoYmFzZSkpCisJCXJldHVybiBQVFJfRVJSKGJhc2UpOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIGlycTsKKworCWNjbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAiY29yZSIpOworCWlmIChJU19FUlIoY2NsaykpCisJCXJldHVybiBQVFJfRVJSKGNjbGspOworCisJaWNsayA9IGRldm1fY2xrX2dldChkZXYsICJpZmFjZSIpOworCWlmIChJU19FUlIoaWNsaykpCisJCXJldHVybiBQVFJfRVJSKGljbGspOworCisJLyogVGhpcyBpcyBvcHRpb25hbCBwYXJhbWV0ZXIgKi8KKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCAic3BpLW1heC1mcmVxdWVuY3kiLCAmbWF4X2ZyZXEpKQorCQltYXhfZnJlcSA9IFNQSV9NQVhfUkFURTsKKworCWlmICghbWF4X2ZyZXEgfHwgbWF4X2ZyZXEgPiBTUElfTUFYX1JBVEUpIHsKKwkJZGV2X2VycihkZXYsICJpbnZhbGlkIGNsb2NrIGZyZXF1ZW5jeSAlZFxuIiwgbWF4X2ZyZXEpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShjY2xrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IGVuYWJsZSBjb3JlIGNsb2NrXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoaWNsayk7CisJaWYgKHJldCkgeworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoY2Nsayk7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IGVuYWJsZSBpZmFjZSBjbG9ja1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZGF0YSA9IHJlYWRsX3JlbGF4ZWQoYmFzZSArIFFVUF9IV19WRVJTSU9OKTsKKworCWlmIChkYXRhIDwgUVVQX0hXX1ZFUlNJT05fMl8xXzEpIHsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNjbGspOworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoaWNsayk7CisJCWRldl9lcnIoZGV2LCAidi4lMDh4IGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGRhdGEpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoZGV2LCBzaXplb2Yoc3RydWN0IHNwaV9xdXApKTsKKwlpZiAoIW1hc3RlcikgeworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoY2Nsayk7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShpY2xrKTsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgYWxsb2NhdGUgbWFzdGVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7CisJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0ggfCBTUElfTE9PUDsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gU1BJX05VTV9DSElQU0VMRUNUUzsKKwltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfUkFOR0VfTUFTSyg0LCAzMik7CisJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSBtYXhfZnJlcTsKKwltYXN0ZXItPnNldF9jcyA9IHNwaV9xdXBfc2V0X2NzOworCW1hc3Rlci0+dHJhbnNmZXJfb25lID0gc3BpX3F1cF90cmFuc2Zlcl9vbmU7CisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCW1hc3Rlci0+YXV0b19ydW50aW1lX3BtID0gdHJ1ZTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1hc3Rlcik7CisKKwljb250cm9sbGVyID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJY29udHJvbGxlci0+ZGV2ID0gZGV2OworCWNvbnRyb2xsZXItPmJhc2UgPSBiYXNlOworCWNvbnRyb2xsZXItPmljbGsgPSBpY2xrOworCWNvbnRyb2xsZXItPmNjbGsgPSBjY2xrOworCWNvbnRyb2xsZXItPmlycSA9IGlycTsKKworCXNwaW5fbG9ja19pbml0KCZjb250cm9sbGVyLT5sb2NrKTsKKwlpbml0X2NvbXBsZXRpb24oJmNvbnRyb2xsZXItPmRvbmUpOworCisJaW9tb2RlID0gcmVhZGxfcmVsYXhlZChiYXNlICsgUVVQX0lPX01fTU9ERVMpOworCisJc2l6ZSA9IFFVUF9JT19NX09VVFBVVF9CTE9DS19TSVpFKGlvbW9kZSk7CisJaWYgKHNpemUpCisJCWNvbnRyb2xsZXItPm91dF9ibGtfc3ogPSBzaXplICogMTY7CisJZWxzZQorCQljb250cm9sbGVyLT5vdXRfYmxrX3N6ID0gNDsKKworCXNpemUgPSBRVVBfSU9fTV9JTlBVVF9CTE9DS19TSVpFKGlvbW9kZSk7CisJaWYgKHNpemUpCisJCWNvbnRyb2xsZXItPmluX2Jsa19zeiA9IHNpemUgKiAxNjsKKwllbHNlCisJCWNvbnRyb2xsZXItPmluX2Jsa19zeiA9IDQ7CisKKwlzaXplID0gUVVQX0lPX01fT1VUUFVUX0ZJRk9fU0laRShpb21vZGUpOworCWNvbnRyb2xsZXItPm91dF9maWZvX3N6ID0gY29udHJvbGxlci0+b3V0X2Jsa19zeiAqICgyIDw8IHNpemUpOworCisJc2l6ZSA9IFFVUF9JT19NX0lOUFVUX0ZJRk9fU0laRShpb21vZGUpOworCWNvbnRyb2xsZXItPmluX2ZpZm9fc3ogPSBjb250cm9sbGVyLT5pbl9ibGtfc3ogKiAoMiA8PCBzaXplKTsKKworCWRldl9pbmZvKGRldiwgInYuJTA4eCBJTjpibG9jazolZCwgZmlmbzolZCwgT1VUOmJsb2NrOiVkLCBmaWZvOiVkXG4iLAorCQkgZGF0YSwgY29udHJvbGxlci0+aW5fYmxrX3N6LCBjb250cm9sbGVyLT5pbl9maWZvX3N6LAorCQkgY29udHJvbGxlci0+b3V0X2Jsa19zeiwgY29udHJvbGxlci0+b3V0X2ZpZm9fc3opOworCisJd3JpdGVsX3JlbGF4ZWQoMSwgYmFzZSArIFFVUF9TV19SRVNFVCk7CisKKwlyZXQgPSBzcGlfcXVwX3NldF9zdGF0ZShjb250cm9sbGVyLCBRVVBfU1RBVEVfUkVTRVQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3Qgc2V0IFJFU0VUIHN0YXRlXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwl3cml0ZWxfcmVsYXhlZCgwLCBiYXNlICsgUVVQX09QRVJBVElPTkFMKTsKKwl3cml0ZWxfcmVsYXhlZCgwLCBiYXNlICsgUVVQX0lPX01fTU9ERVMpOworCXdyaXRlbF9yZWxheGVkKDAsIGJhc2UgKyBRVVBfT1BFUkFUSU9OQUxfTUFTSyk7CisJd3JpdGVsX3JlbGF4ZWQoU1BJX0VSUk9SX0NMS19VTkRFUl9SVU4gfCBTUElfRVJST1JfQ0xLX09WRVJfUlVOLAorCQkgICAgICAgYmFzZSArIFNQSV9FUlJPUl9GTEFHU19FTik7CisKKwl3cml0ZWxfcmVsYXhlZCgwLCBiYXNlICsgU1BJX0NPTkZJRyk7CisJd3JpdGVsX3JlbGF4ZWQoU1BJX0lPX0NfTk9fVFJJX1NUQVRFLCBiYXNlICsgU1BJX0lPX0NPTlRST0wpOworCisJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIGlycSwgc3BpX3F1cF9xdXBfaXJxLAorCQkJICAgICAgIElSUUZfVFJJR0dFUl9ISUdILCBwZGV2LT5uYW1lLCBjb250cm9sbGVyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gZGV2bV9zcGlfcmVnaXN0ZXJfbWFzdGVyKGRldiwgbWFzdGVyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoZGV2LCBNU0VDX1BFUl9TRUMpOworCXBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKGRldik7CisJcG1fcnVudGltZV9zZXRfYWN0aXZlKGRldik7CisJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNjbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShpY2xrKTsKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQorc3RhdGljIGludCBzcGlfcXVwX3BtX3N1c3BlbmRfcnVudGltZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOworCXN0cnVjdCBzcGlfcXVwICpjb250cm9sbGVyID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXUzMiBjb25maWc7CisKKwkvKiBFbmFibGUgY2xvY2tzIGF1dG8gZ2FpdGluZyAqLworCWNvbmZpZyA9IHJlYWRsKGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfQ09ORklHKTsKKwljb25maWcgfD0gUVVQX0NPTkZJR19DTE9DS19BVVRPX0dBVEU7CisJd3JpdGVsX3JlbGF4ZWQoY29uZmlnLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX0NPTkZJRyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3F1cF9wbV9yZXN1bWVfcnVudGltZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOworCXN0cnVjdCBzcGlfcXVwICpjb250cm9sbGVyID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXUzMiBjb25maWc7CisKKwkvKiBEaXNhYmxlIGNsb2NrcyBhdXRvIGdhaXRpbmcgKi8KKwljb25maWcgPSByZWFkbF9yZWxheGVkKGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfQ09ORklHKTsKKwljb25maWcgJj0gflFVUF9DT05GSUdfQ0xPQ0tfQVVUT19HQVRFOworCXdyaXRlbF9yZWxheGVkKGNvbmZpZywgY29udHJvbGxlci0+YmFzZSArIFFVUF9DT05GSUcpOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QTV9SVU5USU1FICovCisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgc3BpX3F1cF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CisJc3RydWN0IHNwaV9xdXAgKmNvbnRyb2xsZXIgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJaW50IHJldDsKKworCXJldCA9IHNwaV9tYXN0ZXJfc3VzcGVuZChtYXN0ZXIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzcGlfcXVwX3NldF9zdGF0ZShjb250cm9sbGVyLCBRVVBfU1RBVEVfUkVTRVQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoY29udHJvbGxlci0+Y2Nsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNvbnRyb2xsZXItPmljbGspOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwaV9xdXBfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CisJc3RydWN0IHNwaV9xdXAgKmNvbnRyb2xsZXIgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJaW50IHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShjb250cm9sbGVyLT5pY2xrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGNvbnRyb2xsZXItPmNjbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzcGlfcXVwX3NldF9zdGF0ZShjb250cm9sbGVyLCBRVVBfU1RBVEVfUkVTRVQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3BpX21hc3Rlcl9yZXN1bWUobWFzdGVyKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KKworc3RhdGljIGludCBzcGlfcXVwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IHNwaV9xdXAgKmNvbnRyb2xsZXIgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJaW50IHJldDsKKworCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJnBkZXYtPmRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNwaV9xdXBfc2V0X3N0YXRlKGNvbnRyb2xsZXIsIFFVUF9TVEFURV9SRVNFVCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShjb250cm9sbGVyLT5jY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoY29udHJvbGxlci0+aWNsayk7CisKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBzcGlfcXVwX2R0X21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHNwaS1xdXAtdjIuMS4xIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20sc3BpLXF1cC12Mi4yLjEiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNwaV9xdXBfZHRfbWF0Y2gpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgc3BpX3F1cF9kZXZfcG1fb3BzID0geworCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHNwaV9xdXBfc3VzcGVuZCwgc3BpX3F1cF9yZXN1bWUpCisJU0VUX1JVTlRJTUVfUE1fT1BTKHNwaV9xdXBfcG1fc3VzcGVuZF9ydW50aW1lLAorCQkJICAgc3BpX3F1cF9wbV9yZXN1bWVfcnVudGltZSwKKwkJCSAgIE5VTEwpCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzcGlfcXVwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQkJPSAic3BpX3F1cCIsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLnBtCQk9ICZzcGlfcXVwX2Rldl9wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IHNwaV9xdXBfZHRfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBzcGlfcXVwX3Byb2JlLAorCS5yZW1vdmUgPSBzcGlfcXVwX3JlbW92ZSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHNwaV9xdXBfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzcGlfcXVwIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktcnNwaS5jIGIvZHJpdmVycy9zcGkvc3BpLXJzcGkuYwppbmRleCAyODk4N2Q5Li4xZmIwYWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktcnNwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1yc3BpLmMKQEAgLTEsNyArMSw4IEBACiAvKgogICogU0ggUlNQSSBkcml2ZXIKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgIFJlbmVzYXMgU29sdXRpb25zIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIsIDIwMTMgIFJlbmVzYXMgU29sdXRpb25zIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgR2xpZGVyIGJ2YmEKICAqCiAgKiBCYXNlZCBvbiBzcGktc2guYzoKICAqIENvcHlyaWdodCAoQykgMjAxMSBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgpAQCAtMjUsMTQgKzI2LDE0IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX2RtYS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvcnNwaS5oPgpAQCAtNDksNyArNTAsNyBAQAogI2RlZmluZSBSU1BJX1NQQ0tECQkweDBjCS8qIENsb2NrIERlbGF5IFJlZ2lzdGVyICovCiAjZGVmaW5lIFJTUElfU1NMTkQJCTB4MGQJLyogU2xhdmUgU2VsZWN0IE5lZ2F0aW9uIERlbGF5IFJlZ2lzdGVyICovCiAjZGVmaW5lIFJTUElfU1BORAkJMHgwZQkvKiBOZXh0LUFjY2VzcyBEZWxheSBSZWdpc3RlciAqLwotI2RlZmluZSBSU1BJX1NQQ1IyCQkweDBmCS8qIENvbnRyb2wgUmVnaXN0ZXIgMiAqLworI2RlZmluZSBSU1BJX1NQQ1IyCQkweDBmCS8qIENvbnRyb2wgUmVnaXN0ZXIgMiAoU0ggb25seSkgKi8KICNkZWZpbmUgUlNQSV9TUENNRDAJCTB4MTAJLyogQ29tbWFuZCBSZWdpc3RlciAwICovCiAjZGVmaW5lIFJTUElfU1BDTUQxCQkweDEyCS8qIENvbW1hbmQgUmVnaXN0ZXIgMSAqLwogI2RlZmluZSBSU1BJX1NQQ01EMgkJMHgxNAkvKiBDb21tYW5kIFJlZ2lzdGVyIDIgKi8KQEAgLTU4LDE2ICs1OSwyMyBAQAogI2RlZmluZSBSU1BJX1NQQ01ENQkJMHgxYQkvKiBDb21tYW5kIFJlZ2lzdGVyIDUgKi8KICNkZWZpbmUgUlNQSV9TUENNRDYJCTB4MWMJLyogQ29tbWFuZCBSZWdpc3RlciA2ICovCiAjZGVmaW5lIFJTUElfU1BDTUQ3CQkweDFlCS8qIENvbW1hbmQgUmVnaXN0ZXIgNyAqLworI2RlZmluZSBSU1BJX1NQQ01EKGkpCQkoUlNQSV9TUENNRDAgKyAoaSkgKiAyKQorI2RlZmluZSBSU1BJX05VTV9TUENNRAkJOAorI2RlZmluZSBSU1BJX1JaX05VTV9TUENNRAk0CisjZGVmaW5lIFFTUElfTlVNX1NQQ01ECQk0CisKKy8qIFJTUEkgb24gUlogb25seSAqLwogI2RlZmluZSBSU1BJX1NQQkZDUgkJMHgyMAkvKiBCdWZmZXIgQ29udHJvbCBSZWdpc3RlciAqLwogI2RlZmluZSBSU1BJX1NQQkZEUgkJMHgyMgkvKiBCdWZmZXIgRGF0YSBDb3VudCBTZXR0aW5nIFJlZ2lzdGVyICovCiAKLS8qcXNwaSBvbmx5ICovCisvKiBRU1BJIG9ubHkgKi8KICNkZWZpbmUgUVNQSV9TUEJGQ1IJCTB4MTgJLyogQnVmZmVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KICNkZWZpbmUgUVNQSV9TUEJEQ1IJCTB4MWEJLyogQnVmZmVyIERhdGEgQ291bnQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgUVNQSV9TUEJNVUwwCQkweDFjCS8qIFRyYW5zZmVyIERhdGEgTGVuZ3RoIE11bHRpcGxpZXIgU2V0dGluZyBSZWdpc3RlciAwICovCiAjZGVmaW5lIFFTUElfU1BCTVVMMQkJMHgyMAkvKiBUcmFuc2ZlciBEYXRhIExlbmd0aCBNdWx0aXBsaWVyIFNldHRpbmcgUmVnaXN0ZXIgMSAqLwogI2RlZmluZSBRU1BJX1NQQk1VTDIJCTB4MjQJLyogVHJhbnNmZXIgRGF0YSBMZW5ndGggTXVsdGlwbGllciBTZXR0aW5nIFJlZ2lzdGVyIDIgKi8KICNkZWZpbmUgUVNQSV9TUEJNVUwzCQkweDI4CS8qIFRyYW5zZmVyIERhdGEgTGVuZ3RoIE11bHRpcGxpZXIgU2V0dGluZyBSZWdpc3RlciAzICovCisjZGVmaW5lIFFTUElfU1BCTVVMKGkpCQkoUVNQSV9TUEJNVUwwICsgKGkpICogNCkKIAogLyogU1BDUiAtIENvbnRyb2wgUmVnaXN0ZXIgKi8KICNkZWZpbmUgU1BDUl9TUFJJRQkJMHg4MAkvKiBSZWNlaXZlIEludGVycnVwdCBFbmFibGUgKi8KQEAgLTEwNCw3ICsxMTIsNyBAQAogI2RlZmluZSBTUFNSX1BFUkYJCTB4MDgJLyogUGFyaXR5IEVycm9yIEZsYWcgKi8KICNkZWZpbmUgU1BTUl9NT0RGCQkweDA0CS8qIE1vZGUgRmF1bHQgRXJyb3IgRmxhZyAqLwogI2RlZmluZSBTUFNSX0lETE5GCQkweDAyCS8qIFJTUEkgSWRsZSBGbGFnICovCi0jZGVmaW5lIFNQU1JfT1ZSRgkJMHgwMQkvKiBPdmVycnVuIEVycm9yIEZsYWcgKi8KKyNkZWZpbmUgU1BTUl9PVlJGCQkweDAxCS8qIE92ZXJydW4gRXJyb3IgRmxhZyAoUlNQSSBvbmx5KSAqLwogCiAvKiBTUFNDUiAtIFNlcXVlbmNlIENvbnRyb2wgUmVnaXN0ZXIgKi8KICNkZWZpbmUgU1BTQ1JfU1BTTE5fTUFTSwkweDA3CS8qIFNlcXVlbmNlIExlbmd0aCBTcGVjaWZpY2F0aW9uICovCkBAIC0xMjEsMTMgKzEyOSwxMyBAQAogI2RlZmluZSBTUERDUl9TUExXT1JECQlTUERDUl9TUExXMQogI2RlZmluZSBTUERDUl9TUExCWVRFCQlTUERDUl9TUExXMAogI2RlZmluZSBTUERDUl9TUExXCQkweDIwCS8qIEFjY2VzcyBXaWR0aCBTcGVjaWZpY2F0aW9uIChTSCkgKi8KLSNkZWZpbmUgU1BEQ1JfU1BSRFRECQkweDEwCS8qIFJlY2VpdmUgVHJhbnNtaXQgRGF0YSBTZWxlY3QgKi8KKyNkZWZpbmUgU1BEQ1JfU1BSRFRECQkweDEwCS8qIFJlY2VpdmUgVHJhbnNtaXQgRGF0YSBTZWxlY3QgKFNIKSAqLwogI2RlZmluZSBTUERDUl9TTFNFTDEJCTB4MDgKICNkZWZpbmUgU1BEQ1JfU0xTRUwwCQkweDA0Ci0jZGVmaW5lIFNQRENSX1NMU0VMX01BU0sJMHgwYwkvKiBTU0wxIE91dHB1dCBTZWxlY3QgKi8KKyNkZWZpbmUgU1BEQ1JfU0xTRUxfTUFTSwkweDBjCS8qIFNTTDEgT3V0cHV0IFNlbGVjdCAoU0gpICovCiAjZGVmaW5lIFNQRENSX1NQRkMxCQkweDAyCiAjZGVmaW5lIFNQRENSX1NQRkMwCQkweDAxCi0jZGVmaW5lIFNQRENSX1NQRkNfTUFTSwkJMHgwMwkvKiBGcmFtZSBDb3VudCBTZXR0aW5nICgxLTQpICovCisjZGVmaW5lIFNQRENSX1NQRkNfTUFTSwkJMHgwMwkvKiBGcmFtZSBDb3VudCBTZXR0aW5nICgxLTQpIChTSCkgKi8KIAogLyogU1BDS0QgLSBDbG9jayBEZWxheSBSZWdpc3RlciAqLwogI2RlZmluZSBTUENLRF9TQ0tETF9NQVNLCTB4MDcJLyogQ2xvY2sgRGVsYXkgU2V0dGluZyAoMS04KSAqLwpAQCAtMTUxLDcgKzE1OSw3IEBACiAjZGVmaW5lIFNQQ01EX0xTQkYJCTB4MTAwMAkvKiBMU0IgRmlyc3QgKi8KICNkZWZpbmUgU1BDTURfU1BCX01BU0sJCTB4MGYwMAkvKiBEYXRhIExlbmd0aCBTZXR0aW5nICovCiAjZGVmaW5lIFNQQ01EX1NQQl84X1RPXzE2KGJpdCkJKCgoYml0IC0gMSkgPDwgOCkgJiBTUENNRF9TUEJfTUFTSykKLSNkZWZpbmUgU1BDTURfU1BCXzhCSVQJCTB4MDAwMAkvKiBxc3BpIG9ubHkgKi8KKyNkZWZpbmUgU1BDTURfU1BCXzhCSVQJCTB4MDAwMAkvKiBRU1BJIG9ubHkgKi8KICNkZWZpbmUgU1BDTURfU1BCXzE2QklUCQkweDAxMDAKICNkZWZpbmUgU1BDTURfU1BCXzIwQklUCQkweDAwMDAKICNkZWZpbmUgU1BDTURfU1BCXzI0QklUCQkweDAxMDAKQEAgLTE3MCw4ICsxNzgsOCBAQAogI2RlZmluZSBTUENNRF9DUEhBCQkweDAwMDEJLyogQ2xvY2sgUGhhc2UgU2V0dGluZyAqLwogCiAvKiBTUEJGQ1IgLSBCdWZmZXIgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBTUEJGQ1JfVFhSU1QJCTB4ODAJLyogVHJhbnNtaXQgQnVmZmVyIERhdGEgUmVzZXQgKHFzcGkgb25seSkgKi8KLSNkZWZpbmUgU1BCRkNSX1JYUlNUCQkweDQwCS8qIFJlY2VpdmUgQnVmZmVyIERhdGEgUmVzZXQgKHFzcGkgb25seSkgKi8KKyNkZWZpbmUgU1BCRkNSX1RYUlNUCQkweDgwCS8qIFRyYW5zbWl0IEJ1ZmZlciBEYXRhIFJlc2V0ICovCisjZGVmaW5lIFNQQkZDUl9SWFJTVAkJMHg0MAkvKiBSZWNlaXZlIEJ1ZmZlciBEYXRhIFJlc2V0ICovCiAjZGVmaW5lIFNQQkZDUl9UWFRSR19NQVNLCTB4MzAJLyogVHJhbnNtaXQgQnVmZmVyIERhdGEgVHJpZ2dlcmluZyBOdW1iZXIgKi8KICNkZWZpbmUgU1BCRkNSX1JYVFJHX01BU0sJMHgwNwkvKiBSZWNlaXZlIEJ1ZmZlciBEYXRhIFRyaWdnZXJpbmcgTnVtYmVyICovCiAKQEAgLTE4MSwyMiArMTg5LDIxIEBACiAJdm9pZCBfX2lvbWVtICphZGRyOwogCXUzMiBtYXhfc3BlZWRfaHo7CiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlOwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3czsKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3QgY2xrICpjbGs7Ci0JdTggc3BzcjsKIAl1MTYgc3BjbWQ7CisJdTggc3BzcjsKKwl1OCBzcHBjcjsKKwlpbnQgcnhfaXJxLCB0eF9pcnE7CiAJY29uc3Qgc3RydWN0IHNwaV9vcHMgKm9wczsKIAogCS8qIGZvciBkbWFlbmdpbmUgKi8KIAlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW5fdHg7CiAJc3RydWN0IGRtYV9jaGFuICpjaGFuX3J4OwotCWludCBpcnE7CiAKIAl1bnNpZ25lZCBkbWFfd2lkdGhfMTZiaXQ6MTsKIAl1bnNpZ25lZCBkbWFfY2FsbGJhY2tlZDoxOworCXVuc2lnbmVkIGJ5dGVfYWNjZXNzOjE7CiB9OwogCiBzdGF0aWMgdm9pZCByc3BpX3dyaXRlOChjb25zdCBzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCB1OCBkYXRhLCB1MTYgb2Zmc2V0KQpAQCAtMjI0LDM0ICsyMzEsNDcgQEAKIAlyZXR1cm4gaW9yZWFkMTYocnNwaS0+YWRkciArIG9mZnNldCk7CiB9CiAKK3N0YXRpYyB2b2lkIHJzcGlfd3JpdGVfZGF0YShjb25zdCBzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCB1MTYgZGF0YSkKK3sKKwlpZiAocnNwaS0+Ynl0ZV9hY2Nlc3MpCisJCXJzcGlfd3JpdGU4KHJzcGksIGRhdGEsIFJTUElfU1BEUik7CisJZWxzZSAvKiAxNiBiaXQgKi8KKwkJcnNwaV93cml0ZTE2KHJzcGksIGRhdGEsIFJTUElfU1BEUik7Cit9CisKK3N0YXRpYyB1MTYgcnNwaV9yZWFkX2RhdGEoY29uc3Qgc3RydWN0IHJzcGlfZGF0YSAqcnNwaSkKK3sKKwlpZiAocnNwaS0+Ynl0ZV9hY2Nlc3MpCisJCXJldHVybiByc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BEUik7CisJZWxzZSAvKiAxNiBiaXQgKi8KKwkJcmV0dXJuIHJzcGlfcmVhZDE2KHJzcGksIFJTUElfU1BEUik7Cit9CisKIC8qIG9wdGlvbmFsIGZ1bmN0aW9ucyAqLwogc3RydWN0IHNwaV9vcHMgewotCWludCAoKnNldF9jb25maWdfcmVnaXN0ZXIpKGNvbnN0IHN0cnVjdCByc3BpX2RhdGEgKnJzcGksCi0JCQkJICAgaW50IGFjY2Vzc19zaXplKTsKLQlpbnQgKCpzZW5kX3Bpbykoc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptZXNnLAotCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqdCk7Ci0JaW50ICgqcmVjZWl2ZV9waW8pKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbWVzZywKLQkJCSAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpOwotCisJaW50ICgqc2V0X2NvbmZpZ19yZWdpc3Rlcikoc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwgaW50IGFjY2Vzc19zaXplKTsKKwlpbnQgKCp0cmFuc2Zlcl9vbmUpKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkgICAgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcik7CisJdTE2IG1vZGVfYml0czsKIH07CiAKIC8qCi0gKiBmdW5jdGlvbnMgZm9yIFJTUEkKKyAqIGZ1bmN0aW9ucyBmb3IgUlNQSSBvbiBsZWdhY3kgU0gKICAqLwotc3RhdGljIGludCByc3BpX3NldF9jb25maWdfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwKLQkJCQkgICAgaW50IGFjY2Vzc19zaXplKQorc3RhdGljIGludCByc3BpX3NldF9jb25maWdfcmVnaXN0ZXIoc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwgaW50IGFjY2Vzc19zaXplKQogewogCWludCBzcGJyOwogCi0JLyogU2V0cyBvdXRwdXQgbW9kZShDTU9TKSBhbmQgTU9TSSBzaWduYWwoZnJvbSBwcmV2aW91cyB0cmFuc2ZlcikgKi8KLQlyc3BpX3dyaXRlOChyc3BpLCAweDAwLCBSU1BJX1NQUENSKTsKKwkvKiBTZXRzIG91dHB1dCBtb2RlLCBNT1NJIHNpZ25hbCwgYW5kIChvcHRpb25hbGx5KSBsb29wYmFjayAqLworCXJzcGlfd3JpdGU4KHJzcGksIHJzcGktPnNwcGNyLCBSU1BJX1NQUENSKTsKIAogCS8qIFNldHMgdHJhbnNmZXIgYml0IHJhdGUgKi8KIAlzcGJyID0gY2xrX2dldF9yYXRlKHJzcGktPmNsaykgLyAoMiAqIHJzcGktPm1heF9zcGVlZF9oeikgLSAxOwogCXJzcGlfd3JpdGU4KHJzcGksIGNsYW1wKHNwYnIsIDAsIDI1NSksIFJTUElfU1BCUik7CiAKLQkvKiBTZXRzIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgdXNlZDogMSBmcmFtZSAqLwotCXJzcGlfd3JpdGU4KHJzcGksIDB4MDAsIFJTUElfU1BEQ1IpOworCS8qIERpc2FibGUgZHVtbXkgdHJhbnNtaXNzaW9uLCBzZXQgMTYtYml0IHdvcmQgYWNjZXNzLCAxIGZyYW1lICovCisJcnNwaV93cml0ZTgocnNwaSwgMCwgUlNQSV9TUERDUik7CisJcnNwaS0+Ynl0ZV9hY2Nlc3MgPSAwOwogCiAJLyogU2V0cyBSU1BDSywgU1NMLCBuZXh0LWFjY2VzcyBkZWxheSB2YWx1ZSAqLwogCXJzcGlfd3JpdGU4KHJzcGksIDB4MDAsIFJTUElfU1BDS0QpOwpAQCAtMjYyLDggKzI4Miw0MSBAQAogCXJzcGlfd3JpdGU4KHJzcGksIDB4MDAsIFJTUElfU1BDUjIpOwogCiAJLyogU2V0cyBTUENNRCAqLwotCXJzcGlfd3JpdGUxNihyc3BpLCBTUENNRF9TUEJfOF9UT18xNihhY2Nlc3Nfc2l6ZSkgfCByc3BpLT5zcGNtZCwKLQkJICAgICBSU1BJX1NQQ01EMCk7CisJcnNwaS0+c3BjbWQgfD0gU1BDTURfU1BCXzhfVE9fMTYoYWNjZXNzX3NpemUpOworCXJzcGlfd3JpdGUxNihyc3BpLCByc3BpLT5zcGNtZCwgUlNQSV9TUENNRDApOworCisJLyogU2V0cyBSU1BJIG1vZGUgKi8KKwlyc3BpX3dyaXRlOChyc3BpLCBTUENSX01TVFIsIFJTUElfU1BDUik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGZ1bmN0aW9ucyBmb3IgUlNQSSBvbiBSWgorICovCitzdGF0aWMgaW50IHJzcGlfcnpfc2V0X2NvbmZpZ19yZWdpc3RlcihzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCBpbnQgYWNjZXNzX3NpemUpCit7CisJaW50IHNwYnI7CisKKwkvKiBTZXRzIG91dHB1dCBtb2RlLCBNT1NJIHNpZ25hbCwgYW5kIChvcHRpb25hbGx5KSBsb29wYmFjayAqLworCXJzcGlfd3JpdGU4KHJzcGksIHJzcGktPnNwcGNyLCBSU1BJX1NQUENSKTsKKworCS8qIFNldHMgdHJhbnNmZXIgYml0IHJhdGUgKi8KKwlzcGJyID0gY2xrX2dldF9yYXRlKHJzcGktPmNsaykgLyAoMiAqIHJzcGktPm1heF9zcGVlZF9oeikgLSAxOworCXJzcGlfd3JpdGU4KHJzcGksIGNsYW1wKHNwYnIsIDAsIDI1NSksIFJTUElfU1BCUik7CisKKwkvKiBEaXNhYmxlIGR1bW15IHRyYW5zbWlzc2lvbiwgc2V0IGJ5dGUgYWNjZXNzICovCisJcnNwaV93cml0ZTgocnNwaSwgU1BEQ1JfU1BMQllURSwgUlNQSV9TUERDUik7CisJcnNwaS0+Ynl0ZV9hY2Nlc3MgPSAxOworCisJLyogU2V0cyBSU1BDSywgU1NMLCBuZXh0LWFjY2VzcyBkZWxheSB2YWx1ZSAqLworCXJzcGlfd3JpdGU4KHJzcGksIDB4MDAsIFJTUElfU1BDS0QpOworCXJzcGlfd3JpdGU4KHJzcGksIDB4MDAsIFJTUElfU1NMTkQpOworCXJzcGlfd3JpdGU4KHJzcGksIDB4MDAsIFJTUElfU1BORCk7CisKKwkvKiBTZXRzIFNQQ01EICovCisJcnNwaS0+c3BjbWQgfD0gU1BDTURfU1BCXzhfVE9fMTYoYWNjZXNzX3NpemUpOworCXJzcGlfd3JpdGUxNihyc3BpLCByc3BpLT5zcGNtZCwgUlNQSV9TUENNRDApOwogCiAJLyogU2V0cyBSU1BJIG1vZGUgKi8KIAlyc3BpX3dyaXRlOChyc3BpLCBTUENSX01TVFIsIFJTUElfU1BDUik7CkBAIC0yNzQsMjEgKzMyNywyMCBAQAogLyoKICAqIGZ1bmN0aW9ucyBmb3IgUVNQSQogICovCi1zdGF0aWMgaW50IHFzcGlfc2V0X2NvbmZpZ19yZWdpc3Rlcihjb25zdCBzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLAotCQkJCSAgICBpbnQgYWNjZXNzX3NpemUpCitzdGF0aWMgaW50IHFzcGlfc2V0X2NvbmZpZ19yZWdpc3RlcihzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCBpbnQgYWNjZXNzX3NpemUpCiB7Ci0JdTE2IHNwY21kOwogCWludCBzcGJyOwogCi0JLyogU2V0cyBvdXRwdXQgbW9kZShDTU9TKSBhbmQgTU9TSSBzaWduYWwoZnJvbSBwcmV2aW91cyB0cmFuc2ZlcikgKi8KLQlyc3BpX3dyaXRlOChyc3BpLCAweDAwLCBSU1BJX1NQUENSKTsKKwkvKiBTZXRzIG91dHB1dCBtb2RlLCBNT1NJIHNpZ25hbCwgYW5kIChvcHRpb25hbGx5KSBsb29wYmFjayAqLworCXJzcGlfd3JpdGU4KHJzcGksIHJzcGktPnNwcGNyLCBSU1BJX1NQUENSKTsKIAogCS8qIFNldHMgdHJhbnNmZXIgYml0IHJhdGUgKi8KIAlzcGJyID0gY2xrX2dldF9yYXRlKHJzcGktPmNsaykgLyAoMiAqIHJzcGktPm1heF9zcGVlZF9oeik7CiAJcnNwaV93cml0ZTgocnNwaSwgY2xhbXAoc3BiciwgMCwgMjU1KSwgUlNQSV9TUEJSKTsKIAotCS8qIFNldHMgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSB1c2VkOiAxIGZyYW1lICovCi0JcnNwaV93cml0ZTgocnNwaSwgMHgwMCwgUlNQSV9TUERDUik7CisJLyogRGlzYWJsZSBkdW1teSB0cmFuc21pc3Npb24sIHNldCBieXRlIGFjY2VzcyAqLworCXJzcGlfd3JpdGU4KHJzcGksIDAsIFJTUElfU1BEQ1IpOworCXJzcGktPmJ5dGVfYWNjZXNzID0gMTsKIAogCS8qIFNldHMgUlNQQ0ssIFNTTCwgbmV4dC1hY2Nlc3MgZGVsYXkgdmFsdWUgKi8KIAlyc3BpX3dyaXRlOChyc3BpLCAweDAwLCBSU1BJX1NQQ0tEKTsKQEAgLTI5NywxMyArMzQ5LDEzIEBACiAKIAkvKiBEYXRhIExlbmd0aCBTZXR0aW5nICovCiAJaWYgKGFjY2Vzc19zaXplID09IDgpCi0JCXNwY21kID0gU1BDTURfU1BCXzhCSVQ7CisJCXJzcGktPnNwY21kIHw9IFNQQ01EX1NQQl84QklUOwogCWVsc2UgaWYgKGFjY2Vzc19zaXplID09IDE2KQotCQlzcGNtZCA9IFNQQ01EX1NQQl8xNkJJVDsKKwkJcnNwaS0+c3BjbWQgfD0gU1BDTURfU1BCXzE2QklUOwogCWVsc2UKLQkJc3BjbWQgPSBTUENNRF9TUEJfMzJCSVQ7CisJCXJzcGktPnNwY21kIHw9IFNQQ01EX1NQQl8zMkJJVDsKIAotCXNwY21kIHw9IFNQQ01EX1NDS0RFTiB8IFNQQ01EX1NMTkRFTiB8IHJzcGktPnNwY21kIHwgU1BDTURfU1BOREVOOworCXJzcGktPnNwY21kIHw9IFNQQ01EX1NDS0RFTiB8IFNQQ01EX1NMTkRFTiB8IFNQQ01EX1NQTkRFTjsKIAogCS8qIFJlc2V0cyB0cmFuc2ZlciBkYXRhIGxlbmd0aCAqLwogCXJzcGlfd3JpdGUzMihyc3BpLCAwLCBRU1BJX1NQQk1VTDApOwpAQCAtMzE0LDkgKzM2Niw5IEBACiAJcnNwaV93cml0ZTgocnNwaSwgMHgwMCwgUVNQSV9TUEJGQ1IpOwogCiAJLyogU2V0cyBTUENNRCAqLwotCXJzcGlfd3JpdGUxNihyc3BpLCBzcGNtZCwgUlNQSV9TUENNRDApOworCXJzcGlfd3JpdGUxNihyc3BpLCByc3BpLT5zcGNtZCwgUlNQSV9TUENNRDApOwogCi0JLyogRW5hYmxlcyBTUEkgZnVuY3Rpb24gaW4gYSBtYXN0ZXIgbW9kZSAqLworCS8qIEVuYWJsZXMgU1BJIGZ1bmN0aW9uIGluIG1hc3RlciBtb2RlICovCiAJcnNwaV93cml0ZTgocnNwaSwgU1BDUl9TUEUgfCBTUENSX01TVFIsIFJTUElfU1BDUik7CiAKIAlyZXR1cm4gMDsKQEAgLTM0MCw2ICszOTIsOSBAQAogCWludCByZXQ7CiAKIAlyc3BpLT5zcHNyID0gcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQU1IpOworCWlmIChyc3BpLT5zcHNyICYgd2FpdF9tYXNrKQorCQlyZXR1cm4gMDsKKwogCXJzcGlfZW5hYmxlX2lycShyc3BpLCBlbmFibGVfYml0KTsKIAlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQocnNwaS0+d2FpdCwgcnNwaS0+c3BzciAmIHdhaXRfbWFzaywgSFopOwogCWlmIChyZXQgPT0gMCAmJiAhKHJzcGktPnNwc3IgJiB3YWl0X21hc2spKQpAQCAtMzQ4LDc3ICs0MDMsMzggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcnNwaV9hc3NlcnRfc3NsKGNvbnN0IHN0cnVjdCByc3BpX2RhdGEgKnJzcGkpCitzdGF0aWMgaW50IHJzcGlfZGF0YV9vdXQoc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwgdTggZGF0YSkKIHsKLQlyc3BpX3dyaXRlOChyc3BpLCByc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BDUikgfCBTUENSX1NQRSwgUlNQSV9TUENSKTsKLX0KLQotc3RhdGljIHZvaWQgcnNwaV9uZWdhdGVfc3NsKGNvbnN0IHN0cnVjdCByc3BpX2RhdGEgKnJzcGkpCi17Ci0JcnNwaV93cml0ZTgocnNwaSwgcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQQ1IpICYgflNQQ1JfU1BFLCBSU1BJX1NQQ1IpOwotfQotCi1zdGF0aWMgaW50IHJzcGlfc2VuZF9waW8oc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptZXNnLAotCQkJIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCi17Ci0JaW50IHJlbWFpbiA9IHQtPmxlbjsKLQljb25zdCB1OCAqZGF0YSA9IHQtPnR4X2J1ZjsKLQl3aGlsZSAocmVtYWluID4gMCkgewotCQlyc3BpX3dyaXRlOChyc3BpLCByc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BDUikgfCBTUENSX1RYTUQsCi0JCQkgICAgUlNQSV9TUENSKTsKLQotCQlpZiAocnNwaV93YWl0X2Zvcl9pbnRlcnJ1cHQocnNwaSwgU1BTUl9TUFRFRiwgU1BDUl9TUFRJRSkgPCAwKSB7Ci0JCQlkZXZfZXJyKCZyc3BpLT5tYXN0ZXItPmRldiwKLQkJCQkiJXM6IHR4IGVtcHR5IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCQl9Ci0KLQkJcnNwaV93cml0ZTE2KHJzcGksICpkYXRhLCBSU1BJX1NQRFIpOwotCQlkYXRhKys7Ci0JCXJlbWFpbi0tOworCWlmIChyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQVEVGLCBTUENSX1NQVElFKSA8IDApIHsKKwkJZGV2X2VycigmcnNwaS0+bWFzdGVyLT5kZXYsICJ0cmFuc21pdCB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQotCi0JLyogV2FpdGluZyBmb3IgdGhlIGxhc3QgdHJhbnNtaXNzaW9uICovCi0JcnNwaV93YWl0X2Zvcl9pbnRlcnJ1cHQocnNwaSwgU1BTUl9TUFRFRiwgU1BDUl9TUFRJRSk7Ci0KKwlyc3BpX3dyaXRlX2RhdGEocnNwaSwgZGF0YSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcXNwaV9zZW5kX3BpbyhzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc2csCi0JCQkgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3N0YXRpYyBpbnQgcnNwaV9kYXRhX2luKHN0cnVjdCByc3BpX2RhdGEgKnJzcGkpCiB7Ci0JaW50IHJlbWFpbiA9IHQtPmxlbjsKLQljb25zdCB1OCAqZGF0YSA9IHQtPnR4X2J1ZjsKKwl1OCBkYXRhOwogCi0JcnNwaV93cml0ZTgocnNwaSwgU1BCRkNSX1RYUlNULCBRU1BJX1NQQkZDUik7Ci0JcnNwaV93cml0ZTgocnNwaSwgMHgwMCwgUVNQSV9TUEJGQ1IpOwotCi0Jd2hpbGUgKHJlbWFpbiA+IDApIHsKLQotCQlpZiAocnNwaV93YWl0X2Zvcl9pbnRlcnJ1cHQocnNwaSwgU1BTUl9TUFRFRiwgU1BDUl9TUFRJRSkgPCAwKSB7Ci0JCQlkZXZfZXJyKCZyc3BpLT5tYXN0ZXItPmRldiwKLQkJCQkiJXM6IHR4IGVtcHR5IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCQl9Ci0JCXJzcGlfd3JpdGU4KHJzcGksICpkYXRhKyssIFJTUElfU1BEUik7Ci0KLQkJaWYgKHJzcGlfd2FpdF9mb3JfaW50ZXJydXB0KHJzcGksIFNQU1JfU1BSRiwgU1BDUl9TUFJJRSkgPCAwKSB7Ci0JCQlkZXZfZXJyKCZyc3BpLT5tYXN0ZXItPmRldiwKLQkJCQkiJXM6IHJlY2VpdmUgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KLQkJcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQRFIpOwotCi0JCXJlbWFpbi0tOworCWlmIChyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQUkYsIFNQQ1JfU1BSSUUpIDwgMCkgeworCQlkZXZfZXJyKCZyc3BpLT5tYXN0ZXItPmRldiwgInJlY2VpdmUgdGltZW91dFxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOwogCX0KLQotCS8qIFdhaXRpbmcgZm9yIHRoZSBsYXN0IHRyYW5zbWlzc2lvbiAqLwotCXJzcGlfd2FpdF9mb3JfaW50ZXJydXB0KHJzcGksIFNQU1JfU1BURUYsIFNQQ1JfU1BUSUUpOwotCi0JcmV0dXJuIDA7CisJZGF0YSA9IHJzcGlfcmVhZF9kYXRhKHJzcGkpOworCXJldHVybiBkYXRhOwogfQogCi0jZGVmaW5lIHNlbmRfcGlvKHNwaSwgbWVzZywgdCkgc3BpLT5vcHMtPnNlbmRfcGlvKHNwaSwgbWVzZywgdCkKK3N0YXRpYyBpbnQgcnNwaV9kYXRhX291dF9pbihzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCB1OCBkYXRhKQoreworCWludCByZXQ7CisKKwlyZXQgPSByc3BpX2RhdGFfb3V0KHJzcGksIGRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHJzcGlfZGF0YV9pbihyc3BpKTsKK30KIAogc3RhdGljIHZvaWQgcnNwaV9kbWFfY29tcGxldGUodm9pZCAqYXJnKQogewpAQCAtNDcxLDcgKzQ4Nyw3IEBACiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwogCWNvbnN0IHZvaWQgKmJ1ZiA9IE5VTEw7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjOwotCXVuc2lnbmVkIGxlbjsKKwl1bnNpZ25lZCBpbnQgbGVuOwogCWludCByZXQgPSAwOwogCiAJaWYgKHJzcGktPmRtYV93aWR0aF8xNmJpdCkgewpAQCAtNTA5LDcgKzUyNSw3IEBACiAJICogRE1BQyBuZWVkcyBTUFRJRSwgYnV0IGlmIFNQVElFIGlzIHNldCwgdGhpcyBJUlEgcm91dGluZSB3aWxsIGJlCiAJICogY2FsbGVkLiBTbywgdGhpcyBkcml2ZXIgZGlzYWJsZXMgdGhlIElSUSB3aGlsZSBETUEgdHJhbnNmZXIuCiAJICovCi0JZGlzYWJsZV9pcnEocnNwaS0+aXJxKTsKKwlkaXNhYmxlX2lycShyc3BpLT50eF9pcnEpOwogCiAJcnNwaV93cml0ZTgocnNwaSwgcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQQ1IpIHwgU1BDUl9UWE1ELCBSU1BJX1NQQ1IpOwogCXJzcGlfZW5hYmxlX2lycShyc3BpLCBTUENSX1NQVElFKTsKQEAgLTUyOCw3ICs1NDQsNyBAQAogCQlyZXQgPSAtRVRJTUVET1VUOwogCXJzcGlfZGlzYWJsZV9pcnEocnNwaSwgU1BDUl9TUFRJRSk7CiAKLQllbmFibGVfaXJxKHJzcGktPmlycSk7CisJZW5hYmxlX2lycShyc3BpLT50eF9pcnEpOwogCiBlbmQ6CiAJcnNwaV9kbWFfdW5tYXBfc2coJnNnLCByc3BpLT5jaGFuX3R4LCBETUFfVE9fREVWSUNFKTsKQEAgLTU0NSw0NiArNTYxLDE3IEBACiAKIAlzcHNyID0gcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQU1IpOwogCWlmIChzcHNyICYgU1BTUl9TUFJGKQotCQlyc3BpX3JlYWQxNihyc3BpLCBSU1BJX1NQRFIpOwkvKiBkdW1teSByZWFkICovCisJCXJzcGlfcmVhZF9kYXRhKHJzcGkpOwkvKiBkdW1teSByZWFkICovCiAJaWYgKHNwc3IgJiBTUFNSX09WUkYpCiAJCXJzcGlfd3JpdGU4KHJzcGksIHJzcGlfcmVhZDgocnNwaSwgUlNQSV9TUFNSKSAmIH5TUFNSX09WUkYsCiAJCQkgICAgUlNQSV9TUFNSKTsKIH0KIAotc3RhdGljIGludCByc3BpX3JlY2VpdmVfcGlvKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbWVzZywKLQkJCSAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQorc3RhdGljIHZvaWQgcnNwaV9yel9yZWNlaXZlX2luaXQoY29uc3Qgc3RydWN0IHJzcGlfZGF0YSAqcnNwaSkKIHsKLQlpbnQgcmVtYWluID0gdC0+bGVuOwotCXU4ICpkYXRhOwotCiAJcnNwaV9yZWNlaXZlX2luaXQocnNwaSk7Ci0KLQlkYXRhID0gdC0+cnhfYnVmOwotCXdoaWxlIChyZW1haW4gPiAwKSB7Ci0JCXJzcGlfd3JpdGU4KHJzcGksIHJzcGlfcmVhZDgocnNwaSwgUlNQSV9TUENSKSAmIH5TUENSX1RYTUQsCi0JCQkgICAgUlNQSV9TUENSKTsKLQotCQlpZiAocnNwaV93YWl0X2Zvcl9pbnRlcnJ1cHQocnNwaSwgU1BTUl9TUFRFRiwgU1BDUl9TUFRJRSkgPCAwKSB7Ci0JCQlkZXZfZXJyKCZyc3BpLT5tYXN0ZXItPmRldiwKLQkJCQkiJXM6IHR4IGVtcHR5IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCQl9Ci0JCS8qIGR1bW15IHdyaXRlIGZvciBnZW5lcmF0ZSBjbG9jayAqLwotCQlyc3BpX3dyaXRlMTYocnNwaSwgRFVNTVlfREFUQSwgUlNQSV9TUERSKTsKLQotCQlpZiAocnNwaV93YWl0X2Zvcl9pbnRlcnJ1cHQocnNwaSwgU1BTUl9TUFJGLCBTUENSX1NQUklFKSA8IDApIHsKLQkJCWRldl9lcnIoJnJzcGktPm1hc3Rlci0+ZGV2LAotCQkJCSIlczogcmVjZWl2ZSB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQkJfQotCQkvKiBTUERSIGFsbG93cyAxNiBvciAzMi1iaXQgYWNjZXNzIG9ubHkgKi8KLQkJKmRhdGEgPSAodTgpcnNwaV9yZWFkMTYocnNwaSwgUlNQSV9TUERSKTsKLQotCQlkYXRhKys7Ci0JCXJlbWFpbi0tOwotCX0KLQotCXJldHVybiAwOworCXJzcGlfd3JpdGU4KHJzcGksIFNQQkZDUl9UWFJTVCB8IFNQQkZDUl9SWFJTVCwgUlNQSV9TUEJGQ1IpOworCXJzcGlfd3JpdGU4KHJzcGksIDAsIFJTUElfU1BCRkNSKTsKIH0KIAogc3RhdGljIHZvaWQgcXNwaV9yZWNlaXZlX2luaXQoY29uc3Qgc3RydWN0IHJzcGlfZGF0YSAqcnNwaSkKQEAgLTU5Myw1MSArNTgwLDE3IEBACiAKIAlzcHNyID0gcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQU1IpOwogCWlmIChzcHNyICYgU1BTUl9TUFJGKQotCQlyc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BEUik7ICAgLyogZHVtbXkgcmVhZCAqLworCQlyc3BpX3JlYWRfZGF0YShyc3BpKTsgICAvKiBkdW1teSByZWFkICovCiAJcnNwaV93cml0ZTgocnNwaSwgU1BCRkNSX1RYUlNUIHwgU1BCRkNSX1JYUlNULCBRU1BJX1NQQkZDUik7Ci0JcnNwaV93cml0ZTgocnNwaSwgMHgwMCwgUVNQSV9TUEJGQ1IpOworCXJzcGlfd3JpdGU4KHJzcGksIDAsIFFTUElfU1BCRkNSKTsKIH0KIAotc3RhdGljIGludCBxc3BpX3JlY2VpdmVfcGlvKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbWVzZywKLQkJCSAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQotewotCWludCByZW1haW4gPSB0LT5sZW47Ci0JdTggKmRhdGE7Ci0KLQlxc3BpX3JlY2VpdmVfaW5pdChyc3BpKTsKLQotCWRhdGEgPSB0LT5yeF9idWY7Ci0Jd2hpbGUgKHJlbWFpbiA+IDApIHsKLQotCQlpZiAocnNwaV93YWl0X2Zvcl9pbnRlcnJ1cHQocnNwaSwgU1BTUl9TUFRFRiwgU1BDUl9TUFRJRSkgPCAwKSB7Ci0JCQlkZXZfZXJyKCZyc3BpLT5tYXN0ZXItPmRldiwKLQkJCQkiJXM6IHR4IGVtcHR5IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCQl9Ci0JCS8qIGR1bW15IHdyaXRlIGZvciBnZW5lcmF0ZSBjbG9jayAqLwotCQlyc3BpX3dyaXRlOChyc3BpLCBEVU1NWV9EQVRBLCBSU1BJX1NQRFIpOwotCi0JCWlmIChyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQUkYsIFNQQ1JfU1BSSUUpIDwgMCkgewotCQkJZGV2X2VycigmcnNwaS0+bWFzdGVyLT5kZXYsCi0JCQkJIiVzOiByZWNlaXZlIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCQl9Ci0JCS8qIFNQRFIgYWxsb3dzIDgsIDE2IG9yIDMyLWJpdCBhY2Nlc3MgKi8KLQkJKmRhdGErKyA9IHJzcGlfcmVhZDgocnNwaSwgUlNQSV9TUERSKTsKLQkJcmVtYWluLS07Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgcmVjZWl2ZV9waW8oc3BpLCBtZXNnLCB0KSBzcGktPm9wcy0+cmVjZWl2ZV9waW8oc3BpLCBtZXNnLCB0KQotCiBzdGF0aWMgaW50IHJzcGlfcmVjZWl2ZV9kbWEoc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKIHsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2csIHNnX2R1bW15OwogCXZvaWQgKmR1bW15ID0gTlVMTCwgKnJ4X2J1ZiA9IE5VTEw7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjLCAqZGVzY19kdW1teTsKLQl1bnNpZ25lZCBsZW47CisJdW5zaWduZWQgaW50IGxlbjsKIAlpbnQgcmV0ID0gMDsKIAogCWlmIChyc3BpLT5kbWFfd2lkdGhfMTZiaXQpIHsKQEAgLTY5NSw3ICs2NDgsOSBAQAogCSAqIERNQUMgbmVlZHMgU1BUSUUsIGJ1dCBpZiBTUFRJRSBpcyBzZXQsIHRoaXMgSVJRIHJvdXRpbmUgd2lsbCBiZQogCSAqIGNhbGxlZC4gU28sIHRoaXMgZHJpdmVyIGRpc2FibGVzIHRoZSBJUlEgd2hpbGUgRE1BIHRyYW5zZmVyLgogCSAqLwotCWRpc2FibGVfaXJxKHJzcGktPmlycSk7CisJZGlzYWJsZV9pcnEocnNwaS0+dHhfaXJxKTsKKwlpZiAocnNwaS0+cnhfaXJxICE9IHJzcGktPnR4X2lycSkKKwkJZGlzYWJsZV9pcnEocnNwaS0+cnhfaXJxKTsKIAogCXJzcGlfd3JpdGU4KHJzcGksIHJzcGlfcmVhZDgocnNwaSwgUlNQSV9TUENSKSAmIH5TUENSX1RYTUQsIFJTUElfU1BDUik7CiAJcnNwaV9lbmFibGVfaXJxKHJzcGksIFNQQ1JfU1BUSUUgfCBTUENSX1NQUklFKTsKQEAgLTcxOCw3ICs2NzMsOSBAQAogCQlyZXQgPSAtRVRJTUVET1VUOwogCXJzcGlfZGlzYWJsZV9pcnEocnNwaSwgU1BDUl9TUFRJRSB8IFNQQ1JfU1BSSUUpOwogCi0JZW5hYmxlX2lycShyc3BpLT5pcnEpOworCWVuYWJsZV9pcnEocnNwaS0+dHhfaXJxKTsKKwlpZiAocnNwaS0+cnhfaXJxICE9IHJzcGktPnR4X2lycSkKKwkJZW5hYmxlX2lycShyc3BpLT5yeF9pcnEpOwogCiBlbmQ6CiAJcnNwaV9kbWFfdW5tYXBfc2coJnNnLCByc3BpLT5jaGFuX3J4LCBETUFfRlJPTV9ERVZJQ0UpOwpAQCAtNzQ2LDU2ICs3MDMsMTc1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJzcGlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgaW50IHJzcGlfdHJhbnNmZXJfb3V0X2luKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksCisJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKIHsKLQlzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByc3BpX2RhdGEsIHdzKTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc2c7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQ7CisJaW50IHJlbWFpbiA9IHhmZXItPmxlbiwgcmV0OworCWNvbnN0IHU4ICp0eF9idWYgPSB4ZmVyLT50eF9idWY7CisJdTggKnJ4X2J1ZiA9IHhmZXItPnJ4X2J1ZjsKKwl1OCBzcGNyLCBkYXRhOwogCi0Jd2hpbGUgKDEpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJzcGktPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGxpc3RfZW1wdHkoJnJzcGktPnF1ZXVlKSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnNwaS0+bG9jaywgZmxhZ3MpOwotCQkJYnJlYWs7CisJcnNwaV9yZWNlaXZlX2luaXQocnNwaSk7CisKKwlzcGNyID0gcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQQ1IpOworCWlmIChyeF9idWYpCisJCXNwY3IgJj0gflNQQ1JfVFhNRDsKKwllbHNlCisJCXNwY3IgfD0gU1BDUl9UWE1EOworCXJzcGlfd3JpdGU4KHJzcGksIHNwY3IsIFJTUElfU1BDUik7CisKKwl3aGlsZSAocmVtYWluID4gMCkgeworCQlkYXRhID0gdHhfYnVmID8gKnR4X2J1ZisrIDogRFVNTVlfREFUQTsKKwkJcmV0ID0gcnNwaV9kYXRhX291dChyc3BpLCBkYXRhKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAocnhfYnVmKSB7CisJCQlyZXQgPSByc3BpX2RhdGFfaW4ocnNwaSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJKnJ4X2J1ZisrID0gcmV0OwogCQl9Ci0JCW1lc2cgPSBsaXN0X2VudHJ5KHJzcGktPnF1ZXVlLm5leHQsIHN0cnVjdCBzcGlfbWVzc2FnZSwgcXVldWUpOwotCQlsaXN0X2RlbF9pbml0KCZtZXNnLT5xdWV1ZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzcGktPmxvY2ssIGZsYWdzKTsKLQotCQlyc3BpX2Fzc2VydF9zc2wocnNwaSk7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbWVzZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCQlpZiAodC0+dHhfYnVmKSB7Ci0JCQkJaWYgKHJzcGlfaXNfZG1hKHJzcGksIHQpKQotCQkJCQlyZXQgPSByc3BpX3NlbmRfZG1hKHJzcGksIHQpOwotCQkJCWVsc2UKLQkJCQkJcmV0ID0gc2VuZF9waW8ocnNwaSwgbWVzZywgdCk7Ci0JCQkJaWYgKHJldCA8IDApCi0JCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlpZiAodC0+cnhfYnVmKSB7Ci0JCQkJaWYgKHJzcGlfaXNfZG1hKHJzcGksIHQpKQotCQkJCQlyZXQgPSByc3BpX3JlY2VpdmVfZG1hKHJzcGksIHQpOwotCQkJCWVsc2UKLQkJCQkJcmV0ID0gcmVjZWl2ZV9waW8ocnNwaSwgbWVzZywgdCk7Ci0JCQkJaWYgKHJldCA8IDApCi0JCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQltZXNnLT5hY3R1YWxfbGVuZ3RoICs9IHQtPmxlbjsKLQkJfQotCQlyc3BpX25lZ2F0ZV9zc2wocnNwaSk7Ci0KLQkJbWVzZy0+c3RhdHVzID0gMDsKLQkJbWVzZy0+Y29tcGxldGUobWVzZy0+Y29udGV4dCk7CisJCXJlbWFpbi0tOwogCX0KIAotCXJldHVybjsKKwkvKiBXYWl0IGZvciB0aGUgbGFzdCB0cmFuc21pc3Npb24gKi8KKwlyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQVEVGLCBTUENSX1NQVElFKTsKIAotZXJyb3I6Ci0JbWVzZy0+c3RhdHVzID0gcmV0OwotCW1lc2ctPmNvbXBsZXRlKG1lc2ctPmNvbnRleHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJzcGlfdHJhbnNmZXJfb25lKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkgICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJc3RydWN0IHJzcGlfZGF0YSAqcnNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpbnQgcmV0OworCisJaWYgKCFyc3BpX2lzX2RtYShyc3BpLCB4ZmVyKSkKKwkJcmV0dXJuIHJzcGlfdHJhbnNmZXJfb3V0X2luKHJzcGksIHhmZXIpOworCisJaWYgKHhmZXItPnR4X2J1ZikgeworCQlyZXQgPSByc3BpX3NlbmRfZG1hKHJzcGksIHhmZXIpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCWlmICh4ZmVyLT5yeF9idWYpCisJCXJldHVybiByc3BpX3JlY2VpdmVfZG1hKHJzcGksIHhmZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNwaV9yel90cmFuc2Zlcl9vdXRfaW4oc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwKKwkJCQkgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCWludCByZW1haW4gPSB4ZmVyLT5sZW4sIHJldDsKKwljb25zdCB1OCAqdHhfYnVmID0geGZlci0+dHhfYnVmOworCXU4ICpyeF9idWYgPSB4ZmVyLT5yeF9idWY7CisJdTggZGF0YTsKKworCXJzcGlfcnpfcmVjZWl2ZV9pbml0KHJzcGkpOworCisJd2hpbGUgKHJlbWFpbiA+IDApIHsKKwkJZGF0YSA9IHR4X2J1ZiA/ICp0eF9idWYrKyA6IERVTU1ZX0RBVEE7CisJCXJldCA9IHJzcGlfZGF0YV9vdXRfaW4ocnNwaSwgZGF0YSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKHJ4X2J1ZikKKwkJCSpyeF9idWYrKyA9IHJldDsKKwkJcmVtYWluLS07CisJfQorCisJLyogV2FpdCBmb3IgdGhlIGxhc3QgdHJhbnNtaXNzaW9uICovCisJcnNwaV93YWl0X2Zvcl9pbnRlcnJ1cHQocnNwaSwgU1BTUl9TUFRFRiwgU1BDUl9TUFRJRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByc3BpX3J6X3RyYW5zZmVyX29uZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwlzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJcmV0dXJuIHJzcGlfcnpfdHJhbnNmZXJfb3V0X2luKHJzcGksIHhmZXIpOworfQorCitzdGF0aWMgaW50IHFzcGlfdHJhbnNmZXJfb3V0X2luKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksCisJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwlpbnQgcmVtYWluID0geGZlci0+bGVuLCByZXQ7CisJY29uc3QgdTggKnR4X2J1ZiA9IHhmZXItPnR4X2J1ZjsKKwl1OCAqcnhfYnVmID0geGZlci0+cnhfYnVmOworCXU4IGRhdGE7CisKKwlxc3BpX3JlY2VpdmVfaW5pdChyc3BpKTsKKworCXdoaWxlIChyZW1haW4gPiAwKSB7CisJCWRhdGEgPSB0eF9idWYgPyAqdHhfYnVmKysgOiBEVU1NWV9EQVRBOworCQlyZXQgPSByc3BpX2RhdGFfb3V0X2luKHJzcGksIGRhdGEpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWlmIChyeF9idWYpCisJCQkqcnhfYnVmKysgPSByZXQ7CisJCXJlbWFpbi0tOworCX0KKworCS8qIFdhaXQgZm9yIHRoZSBsYXN0IHRyYW5zbWlzc2lvbiAqLworCXJzcGlfd2FpdF9mb3JfaW50ZXJydXB0KHJzcGksIFNQU1JfU1BURUYsIFNQQ1JfU1BUSUUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXNwaV90cmFuc2Zlcl9vdXQoc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwljb25zdCB1OCAqYnVmID0geGZlci0+dHhfYnVmOworCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgeGZlci0+bGVuOyBpKyspIHsKKwkJcmV0ID0gcnNwaV9kYXRhX291dChyc3BpLCAqYnVmKyspOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogV2FpdCBmb3IgdGhlIGxhc3QgdHJhbnNtaXNzaW9uICovCisJcnNwaV93YWl0X2Zvcl9pbnRlcnJ1cHQocnNwaSwgU1BTUl9TUFRFRiwgU1BDUl9TUFRJRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxc3BpX3RyYW5zZmVyX2luKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJdTggKmJ1ZiA9IHhmZXItPnJ4X2J1ZjsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJZm9yIChpID0gMDsgaSA8IHhmZXItPmxlbjsgaSsrKSB7CisJCXJldCA9IHJzcGlfZGF0YV9pbihyc3BpKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqYnVmKysgPSByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXNwaV90cmFuc2Zlcl9vbmUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCSAgICAgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwlzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9MT09QKSB7CisJCXJldHVybiBxc3BpX3RyYW5zZmVyX291dF9pbihyc3BpLCB4ZmVyKTsKKwl9IGVsc2UgaWYgKHhmZXItPnR4X2J1ZiAmJiB4ZmVyLT50eF9uYml0cyA+IFNQSV9OQklUU19TSU5HTEUpIHsKKwkJLyogUXVhZCBvciBEdWFsIFNQSSBXcml0ZSAqLworCQlyZXR1cm4gcXNwaV90cmFuc2Zlcl9vdXQocnNwaSwgeGZlcik7CisJfSBlbHNlIGlmICh4ZmVyLT5yeF9idWYgJiYgeGZlci0+cnhfbmJpdHMgPiBTUElfTkJJVFNfU0lOR0xFKSB7CisJCS8qIFF1YWQgb3IgRHVhbCBTUEkgUmVhZCAqLworCQlyZXR1cm4gcXNwaV90cmFuc2Zlcl9pbihyc3BpLCB4ZmVyKTsKKwl9IGVsc2UgeworCQkvKiBTaW5nbGUgU1BJIFRyYW5zZmVyICovCisJCXJldHVybiBxc3BpX3RyYW5zZmVyX291dF9pbihyc3BpLCB4ZmVyKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgcnNwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQpAQCAtODEwLDMyICs4ODYsMTE1IEBACiAJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQogCQlyc3BpLT5zcGNtZCB8PSBTUENNRF9DUEhBOwogCisJLyogQ01PUyBvdXRwdXQgbW9kZSBhbmQgTU9TSSBzaWduYWwgZnJvbSBwcmV2aW91cyB0cmFuc2ZlciAqLworCXJzcGktPnNwcGNyID0gMDsKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0xPT1ApCisJCXJzcGktPnNwcGNyIHw9IFNQUENSX1NQTFA7CisKIAlzZXRfY29uZmlnX3JlZ2lzdGVyKHJzcGksIDgpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcnNwaV90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc2cpCitzdGF0aWMgdTE2IHFzcGlfdHJhbnNmZXJfbW9kZShjb25zdCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQogewotCXN0cnVjdCByc3BpX2RhdGEgKnJzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbWVzZy0+YWN0dWFsX2xlbmd0aCA9IDA7Ci0JbWVzZy0+c3RhdHVzID0gLUVJTlBST0dSRVNTOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJzcGktPmxvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZtZXNnLT5xdWV1ZSwgJnJzcGktPnF1ZXVlKTsKLQlzY2hlZHVsZV93b3JrKCZyc3BpLT53cyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnNwaS0+bG9jaywgZmxhZ3MpOworCWlmICh4ZmVyLT50eF9idWYpCisJCXN3aXRjaCAoeGZlci0+dHhfbmJpdHMpIHsKKwkJY2FzZSBTUElfTkJJVFNfUVVBRDoKKwkJCXJldHVybiBTUENNRF9TUElNT0RfUVVBRDsKKwkJY2FzZSBTUElfTkJJVFNfRFVBTDoKKwkJCXJldHVybiBTUENNRF9TUElNT0RfRFVBTDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJaWYgKHhmZXItPnJ4X2J1ZikKKwkJc3dpdGNoICh4ZmVyLT5yeF9uYml0cykgeworCQljYXNlIFNQSV9OQklUU19RVUFEOgorCQkJcmV0dXJuIFNQQ01EX1NQSU1PRF9RVUFEIHwgU1BDTURfU1BSVzsKKwkJY2FzZSBTUElfTkJJVFNfRFVBTDoKKwkJCXJldHVybiBTUENNRF9TUElNT0RfRFVBTCB8IFNQQ01EX1NQUlc7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJzcGlfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQorc3RhdGljIGludCBxc3BpX3NldHVwX3NlcXVlbmNlcihzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLAorCQkJCWNvbnN0IHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQogeworCWNvbnN0IHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXI7CisJdW5zaWduZWQgaW50IGkgPSAwLCBsZW4gPSAwOworCXUxNiBjdXJyZW50X21vZGUgPSAweGZmZmYsIG1vZGU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQltb2RlID0gcXNwaV90cmFuc2Zlcl9tb2RlKHhmZXIpOworCQlpZiAobW9kZSA9PSBjdXJyZW50X21vZGUpIHsKKwkJCWxlbiArPSB4ZmVyLT5sZW47CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFRyYW5zZmVyIG1vZGUgY2hhbmdlICovCisJCWlmIChpKSB7CisJCQkvKiBTZXQgdHJhbnNmZXIgZGF0YSBsZW5ndGggb2YgcHJldmlvdXMgdHJhbnNmZXIgKi8KKwkJCXJzcGlfd3JpdGUzMihyc3BpLCBsZW4sIFFTUElfU1BCTVVMKGkgLSAxKSk7CisJCX0KKworCQlpZiAoaSA+PSBRU1BJX05VTV9TUENNRCkgeworCQkJZGV2X2VycigmbXNnLT5zcGktPmRldiwKKwkJCQkiVG9vIG1hbnkgZGlmZmVyZW50IHRyYW5zZmVyIG1vZGVzIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIFByb2dyYW0gdHJhbnNmZXIgbW9kZSBmb3IgdGhpcyB0cmFuc2ZlciAqLworCQlyc3BpX3dyaXRlMTYocnNwaSwgcnNwaS0+c3BjbWQgfCBtb2RlLCBSU1BJX1NQQ01EKGkpKTsKKwkJY3VycmVudF9tb2RlID0gbW9kZTsKKwkJbGVuID0geGZlci0+bGVuOworCQlpKys7CisJfQorCWlmIChpKSB7CisJCS8qIFNldCBmaW5hbCB0cmFuc2ZlciBkYXRhIGxlbmd0aCBhbmQgc2VxdWVuY2UgbGVuZ3RoICovCisJCXJzcGlfd3JpdGUzMihyc3BpLCBsZW4sIFFTUElfU1BCTVVMKGkgLSAxKSk7CisJCXJzcGlfd3JpdGU4KHJzcGksIGkgLSAxLCBSU1BJX1NQU0NSKTsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlycXJldHVybl90IHJzcGlfaXJxKGludCBpcnEsIHZvaWQgKl9zcikKK3N0YXRpYyBpbnQgcnNwaV9wcmVwYXJlX21lc3NhZ2Uoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKKwkJCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWludCByZXQ7CisKKwlpZiAobXNnLT5zcGktPm1vZGUgJgorCSAgICAoU1BJX1RYX0RVQUwgfCBTUElfVFhfUVVBRCB8IFNQSV9SWF9EVUFMIHwgU1BJX1JYX1FVQUQpKSB7CisJCS8qIFNldHVwIHNlcXVlbmNlciBmb3IgbWVzc2FnZXMgd2l0aCBtdWx0aXBsZSB0cmFuc2ZlciBtb2RlcyAqLworCQlyZXQgPSBxc3BpX3NldHVwX3NlcXVlbmNlcihyc3BpLCBtc2cpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogRW5hYmxlIFNQSSBmdW5jdGlvbiBpbiBtYXN0ZXIgbW9kZSAqLworCXJzcGlfd3JpdGU4KHJzcGksIHJzcGlfcmVhZDgocnNwaSwgUlNQSV9TUENSKSB8IFNQQ1JfU1BFLCBSU1BJX1NQQ1IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJzcGlfdW5wcmVwYXJlX21lc3NhZ2Uoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKKwkJCQkgIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQoreworCXN0cnVjdCByc3BpX2RhdGEgKnJzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwkvKiBEaXNhYmxlIFNQSSBmdW5jdGlvbiAqLworCXJzcGlfd3JpdGU4KHJzcGksIHJzcGlfcmVhZDgocnNwaSwgUlNQSV9TUENSKSAmIH5TUENSX1NQRSwgUlNQSV9TUENSKTsKKworCS8qIFJlc2V0IHNlcXVlbmNlciBmb3IgU2luZ2xlIFNQSSBUcmFuc2ZlcnMgKi8KKwlyc3BpX3dyaXRlMTYocnNwaSwgcnNwaS0+c3BjbWQsIFJTUElfU1BDTUQwKTsKKwlyc3BpX3dyaXRlOChyc3BpLCAwLCBSU1BJX1NQU0NSKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IHJzcGlfaXJxX211eChpbnQgaXJxLCB2b2lkICpfc3IpCiB7CiAJc3RydWN0IHJzcGlfZGF0YSAqcnNwaSA9IF9zcjsKIAl1OCBzcHNyOwpAQCAtODU3LDYgKzEwMTYsMzYgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaXJxcmV0dXJuX3QgcnNwaV9pcnFfcngoaW50IGlycSwgdm9pZCAqX3NyKQoreworCXN0cnVjdCByc3BpX2RhdGEgKnJzcGkgPSBfc3I7CisJdTggc3BzcjsKKworCXJzcGktPnNwc3IgPSBzcHNyID0gcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQU1IpOworCWlmIChzcHNyICYgU1BTUl9TUFJGKSB7CisJCXJzcGlfZGlzYWJsZV9pcnEocnNwaSwgU1BDUl9TUFJJRSk7CisJCXdha2VfdXAoJnJzcGktPndhaXQpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCByc3BpX2lycV90eChpbnQgaXJxLCB2b2lkICpfc3IpCit7CisJc3RydWN0IHJzcGlfZGF0YSAqcnNwaSA9IF9zcjsKKwl1OCBzcHNyOworCisJcnNwaS0+c3BzciA9IHNwc3IgPSByc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BTUik7CisJaWYgKHNwc3IgJiBTUFNSX1NQVEVGKSB7CisJCXJzcGlfZGlzYWJsZV9pcnEocnNwaSwgU1BDUl9TUFRJRSk7CisJCXdha2VfdXAoJnJzcGktPndhaXQpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgcnNwaV9yZXF1ZXN0X2RtYShzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLAogCQkJCSAgICAgIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CkBAIC05MjMsMzQgKzExMTIsODkgQEAKIAlzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAlyc3BpX3JlbGVhc2VfZG1hKHJzcGkpOwotCWNsa19kaXNhYmxlKHJzcGktPmNsayk7CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX29wcyByc3BpX29wcyA9IHsKKwkuc2V0X2NvbmZpZ19yZWdpc3RlciA9CQlyc3BpX3NldF9jb25maWdfcmVnaXN0ZXIsCisJLnRyYW5zZmVyX29uZSA9CQkJcnNwaV90cmFuc2Zlcl9vbmUsCisJLm1vZGVfYml0cyA9CQkJU1BJX0NQSEEgfCBTUElfQ1BPTCB8IFNQSV9MT09QLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfb3BzIHJzcGlfcnpfb3BzID0geworCS5zZXRfY29uZmlnX3JlZ2lzdGVyID0JCXJzcGlfcnpfc2V0X2NvbmZpZ19yZWdpc3RlciwKKwkudHJhbnNmZXJfb25lID0JCQlyc3BpX3J6X3RyYW5zZmVyX29uZSwKKwkubW9kZV9iaXRzID0JCQlTUElfQ1BIQSB8IFNQSV9DUE9MIHwgU1BJX0xPT1AsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9vcHMgcXNwaV9vcHMgPSB7CisJLnNldF9jb25maWdfcmVnaXN0ZXIgPQkJcXNwaV9zZXRfY29uZmlnX3JlZ2lzdGVyLAorCS50cmFuc2Zlcl9vbmUgPQkJCXFzcGlfdHJhbnNmZXJfb25lLAorCS5tb2RlX2JpdHMgPQkJCVNQSV9DUEhBIHwgU1BJX0NQT0wgfCBTUElfTE9PUCB8CisJCQkJCVNQSV9UWF9EVUFMIHwgU1BJX1RYX1FVQUQgfAorCQkJCQlTUElfUlhfRFVBTCB8IFNQSV9SWF9RVUFELAorfTsKKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcnNwaV9vZl9tYXRjaFtdID0geworCS8qIFJTUEkgb24gbGVnYWN5IFNIICovCisJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHJzcGkiLCAuZGF0YSA9ICZyc3BpX29wcyB9LAorCS8qIFJTUEkgb24gUlovQTFIICovCisJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHJzcGktcnoiLCAuZGF0YSA9ICZyc3BpX3J6X29wcyB9LAorCS8qIFFTUEkgb24gUi1DYXIgR2VuMiAqLworCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxxc3BpIiwgLmRhdGEgPSAmcXNwaV9vcHMgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHJzcGlfb2ZfbWF0Y2gpOworCitzdGF0aWMgaW50IHJzcGlfcGFyc2VfZHQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCXUzMiBudW1fY3M7CisJaW50IGVycm9yOworCisJLyogUGFyc2UgRFQgcHJvcGVydGllcyAqLworCWVycm9yID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCAibnVtLWNzIiwgJm51bV9jcyk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoZGV2LCAib2ZfcHJvcGVydHlfcmVhZF91MzIgbnVtLWNzIGZhaWxlZCAlZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IG51bV9jczsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIHJzcGlfb2ZfbWF0Y2gJTlVMTAorc3RhdGljIGlubGluZSBpbnQgcnNwaV9wYXJzZV9kdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisjZW5kaWYgLyogQ09ORklHX09GICovCisKK3N0YXRpYyBpbnQgcnNwaV9yZXF1ZXN0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpcnEsCisJCQkgICAgaXJxX2hhbmRsZXJfdCBoYW5kbGVyLCBjb25zdCBjaGFyICpzdWZmaXgsCisJCQkgICAgdm9pZCAqZGV2X2lkKQoreworCWNvbnN0IGNoYXIgKmJhc2UgPSBkZXZfbmFtZShkZXYpOworCXNpemVfdCBsZW4gPSBzdHJsZW4oYmFzZSkgKyBzdHJsZW4oc3VmZml4KSArIDI7CisJY2hhciAqbmFtZSA9IGRldm1fa3phbGxvYyhkZXYsIGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzbnByaW50ZihuYW1lLCBsZW4sICIlczolcyIsIGJhc2UsIHN1ZmZpeCk7CisJcmV0dXJuIGRldm1fcmVxdWVzdF9pcnEoZGV2LCBpcnEsIGhhbmRsZXIsIDAsIG5hbWUsIGRldl9pZCk7Cit9CisKIHN0YXRpYyBpbnQgcnNwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CiAJc3RydWN0IHJzcGlfZGF0YSAqcnNwaTsKLQlpbnQgcmV0LCBpcnE7Ci0JY2hhciBjbGtfbmFtZVsxNl07Ci0JY29uc3Qgc3RydWN0IHJzcGlfcGxhdF9kYXRhICpyc3BpX3BkID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwlpbnQgcmV0OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOworCWNvbnN0IHN0cnVjdCByc3BpX3BsYXRfZGF0YSAqcnNwaV9wZDsKIAljb25zdCBzdHJ1Y3Qgc3BpX29wcyAqb3BzOwotCWNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgKmlkX2VudHJ5ID0gcGRldi0+aWRfZW50cnk7Ci0KLQlvcHMgPSAoc3RydWN0IHNwaV9vcHMgKilpZF9lbnRyeS0+ZHJpdmVyX2RhdGE7Ci0JLyogb3BzIHBhcmFtZXRlciBjaGVjayAqLwotCWlmICghb3BzLT5zZXRfY29uZmlnX3JlZ2lzdGVyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInRoZXJlIGlzIG5vIHNldF9jb25maWdfcmVnaXN0ZXJcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmIChpcnEgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInBsYXRmb3JtX2dldF9pcnEgZXJyb3JcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CiAKIAltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgcnNwaV9kYXRhKSk7CiAJaWYgKG1hc3RlciA9PSBOVUxMKSB7CkBAIC05NTgsNiArMTIwMiwyOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwlvZl9pZCA9IG9mX21hdGNoX2RldmljZShyc3BpX29mX21hdGNoLCAmcGRldi0+ZGV2KTsKKwlpZiAob2ZfaWQpIHsKKwkJb3BzID0gb2ZfaWQtPmRhdGE7CisJCXJldCA9IHJzcGlfcGFyc2VfZHQoJnBkZXYtPmRldiwgbWFzdGVyKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3IxOworCX0gZWxzZSB7CisJCW9wcyA9IChzdHJ1Y3Qgc3BpX29wcyAqKXBkZXYtPmlkX2VudHJ5LT5kcml2ZXJfZGF0YTsKKwkJcnNwaV9wZCA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJCWlmIChyc3BpX3BkICYmIHJzcGlfcGQtPm51bV9jaGlwc2VsZWN0KQorCQkJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IHJzcGlfcGQtPm51bV9jaGlwc2VsZWN0OworCQllbHNlCisJCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gMjsgLyogZGVmYXVsdCAqLworCX07CisKKwkvKiBvcHMgcGFyYW1ldGVyIGNoZWNrICovCisJaWYgKCFvcHMtPnNldF9jb25maWdfcmVnaXN0ZXIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidGhlcmUgaXMgbm8gc2V0X2NvbmZpZ19yZWdpc3RlclxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3IxOworCX0KKwogCXJzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcnNwaSk7CiAJcnNwaS0+b3BzID0gb3BzOwpAQCAtOTcwLDM5ICsxMjM2LDYxIEBACiAJCWdvdG8gZXJyb3IxOwogCX0KIAotCXNucHJpbnRmKGNsa19uYW1lLCBzaXplb2YoY2xrX25hbWUpLCAiJXMlZCIsIGlkX2VudHJ5LT5uYW1lLCBwZGV2LT5pZCk7Ci0JcnNwaS0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIGNsa19uYW1lKTsKKwlyc3BpLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUihyc3BpLT5jbGspKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBnZXQgY2xvY2tcbiIpOwogCQlyZXQgPSBQVFJfRVJSKHJzcGktPmNsayk7CiAJCWdvdG8gZXJyb3IxOwogCX0KLQljbGtfZW5hYmxlKHJzcGktPmNsayk7CiAKLQlJTklUX0xJU1RfSEVBRCgmcnNwaS0+cXVldWUpOwotCXNwaW5fbG9ja19pbml0KCZyc3BpLT5sb2NrKTsKLQlJTklUX1dPUksoJnJzcGktPndzLCByc3BpX3dvcmspOworCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOworCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcnNwaS0+d2FpdCk7CiAKLQlpZiAocnNwaV9wZCAmJiByc3BpX3BkLT5udW1fY2hpcHNlbGVjdCkKLQkJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IHJzcGlfcGQtPm51bV9jaGlwc2VsZWN0OwotCWVsc2UKLQkJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IDI7IC8qIGRlZmF1bHQgKi8KLQogCW1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmlkOwogCW1hc3Rlci0+c2V0dXAgPSByc3BpX3NldHVwOwotCW1hc3Rlci0+dHJhbnNmZXIgPSByc3BpX3RyYW5zZmVyOwotCW1hc3Rlci0+Y2xlYW51cCA9IHJzcGlfY2xlYW51cDsKLQltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUEhBIHwgU1BJX0NQT0w7CisJbWFzdGVyLT5hdXRvX3J1bnRpbWVfcG0gPSB0cnVlOworCW1hc3Rlci0+dHJhbnNmZXJfb25lID0gb3BzLT50cmFuc2Zlcl9vbmU7CisJbWFzdGVyLT5wcmVwYXJlX21lc3NhZ2UgPSByc3BpX3ByZXBhcmVfbWVzc2FnZTsKKwltYXN0ZXItPnVucHJlcGFyZV9tZXNzYWdlID0gcnNwaV91bnByZXBhcmVfbWVzc2FnZTsKKwltYXN0ZXItPm1vZGVfYml0cyA9IG9wcy0+bW9kZV9iaXRzOworCW1hc3Rlci0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAotCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCByc3BpX2lycSwgMCwKLQkJCSAgICAgICBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgcnNwaSk7CisJcmV0ID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgInJ4Iik7CisJaWYgKHJldCA8IDApIHsKKwkJcmV0ID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgIm11eCIpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldCA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJzcGktPnJ4X2lycSA9IHJzcGktPnR4X2lycSA9IHJldDsKKwl9IGVsc2UgeworCQlyc3BpLT5yeF9pcnEgPSByZXQ7CisJCXJldCA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJ0eCIpOworCQlpZiAocmV0ID49IDApCisJCQlyc3BpLT50eF9pcnEgPSByZXQ7CisJfQorCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBsYXRmb3JtX2dldF9pcnEgZXJyb3JcbiIpOworCQlnb3RvIGVycm9yMjsKKwl9CisKKwlpZiAocnNwaS0+cnhfaXJxID09IHJzcGktPnR4X2lycSkgeworCQkvKiBTaW5nbGUgbXVsdGlwbGV4ZWQgaW50ZXJydXB0ICovCisJCXJldCA9IHJzcGlfcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgcnNwaS0+cnhfaXJxLCByc3BpX2lycV9tdXgsCisJCQkJICAgICAgICJtdXgiLCByc3BpKTsKKwl9IGVsc2UgeworCQkvKiBNdWx0aS1pbnRlcnJ1cHQgbW9kZSwgb25seSBTUFJJIGFuZCBTUFRJIGFyZSB1c2VkICovCisJCXJldCA9IHJzcGlfcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgcnNwaS0+cnhfaXJxLCByc3BpX2lycV9yeCwKKwkJCQkgICAgICAgInJ4IiwgcnNwaSk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gcnNwaV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCByc3BpLT50eF9pcnEsCisJCQkJCSAgICAgICByc3BpX2lycV90eCwgInR4IiwgcnNwaSk7CisJfQogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlcXVlc3RfaXJxIGVycm9yXG4iKTsKIAkJZ290byBlcnJvcjI7CiAJfQogCi0JcnNwaS0+aXJxID0gaXJxOwogCXJldCA9IHJzcGlfcmVxdWVzdF9kbWEocnNwaSwgcGRldik7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAicnNwaV9yZXF1ZXN0X2RtYSBmYWlsZWQuXG4iKTsKQEAgLTEwMjIsMjcgKzEzMTAsMTYgQEAKIGVycm9yMzoKIAlyc3BpX3JlbGVhc2VfZG1hKHJzcGkpOwogZXJyb3IyOgotCWNsa19kaXNhYmxlKHJzcGktPmNsayk7CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwogZXJyb3IxOgogCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHNwaV9vcHMgcnNwaV9vcHMgPSB7Ci0JLnNldF9jb25maWdfcmVnaXN0ZXIgPQkJcnNwaV9zZXRfY29uZmlnX3JlZ2lzdGVyLAotCS5zZW5kX3BpbyA9CQkJcnNwaV9zZW5kX3BpbywKLQkucmVjZWl2ZV9waW8gPQkJCXJzcGlfcmVjZWl2ZV9waW8sCi19OwotCi1zdGF0aWMgc3RydWN0IHNwaV9vcHMgcXNwaV9vcHMgPSB7Ci0JLnNldF9jb25maWdfcmVnaXN0ZXIgPQkJcXNwaV9zZXRfY29uZmlnX3JlZ2lzdGVyLAotCS5zZW5kX3BpbyA9CQkJcXNwaV9zZW5kX3BpbywKLQkucmVjZWl2ZV9waW8gPQkJCXFzcGlfcmVjZWl2ZV9waW8sCi19OwotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBzcGlfZHJpdmVyX2lkc1tdID0gewogCXsgInJzcGkiLAkoa2VybmVsX3Vsb25nX3QpJnJzcGlfb3BzIH0sCisJeyAicnNwaS1yeiIsCShrZXJuZWxfdWxvbmdfdCkmcnNwaV9yel9vcHMgfSwKIAl7ICJxc3BpIiwJKGtlcm5lbF91bG9uZ190KSZxc3BpX29wcyB9LAogCXt9LAogfTsKQEAgLTEwNTYsNiArMTMzMyw3IEBACiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lID0gInJlbmVzYXNfc3BpIiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihyc3BpX29mX21hdGNoKSwKIAl9LAogfTsKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIocnNwaV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXMzYzI0eHguYyBiL2RyaXZlcnMvc3BpL3NwaS1zM2MyNHh4LmMKaW5kZXggNzQ2NDI0YS4uYmVkMjMzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXMzYzI0eHguYworKysgYi9kcml2ZXJzL3NwaS9zcGktczNjMjR4eC5jCkBAIC05LDcgKzksNiBAQAogICoKICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTEyMywyNSArMTIyLDE1IEBACiB7CiAJc3RydWN0IHMzYzI0eHhfc3BpICpodyA9IHRvX2h3KHNwaSk7CiAJc3RydWN0IHMzYzI0eHhfc3BpX2RldnN0YXRlICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKLQl1bnNpZ25lZCBpbnQgYnB3OwogCXVuc2lnbmVkIGludCBoejsKIAl1bnNpZ25lZCBpbnQgZGl2OwogCXVuc2lnbmVkIGxvbmcgY2xrOwogCi0JYnB3ID0gdCA/IHQtPmJpdHNfcGVyX3dvcmQgOiBzcGktPmJpdHNfcGVyX3dvcmQ7CiAJaHogID0gdCA/IHQtPnNwZWVkX2h6IDogc3BpLT5tYXhfc3BlZWRfaHo7CiAKLQlpZiAoIWJwdykKLQkJYnB3ID0gODsKLQogCWlmICghaHopCiAJCWh6ID0gc3BpLT5tYXhfc3BlZWRfaHo7CiAKLQlpZiAoYnB3ICE9IDgpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJpbnZhbGlkIGJpdHMtcGVyLXdvcmQgKCVkKVxuIiwgYnB3KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJaWYgKHNwaS0+bW9kZSAhPSBjcy0+bW9kZSkgewogCQl1OCBzcGNvbiA9IFNQQ09OX0RFRkFVTFQgfCBTM0MyNDEwX1NQQ09OX0VOU0NLOwogCkBAIC01NDQsNiArNTMzLDcgQEAKIAogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBody0+cGRhdGEtPm51bV9jczsKIAltYXN0ZXItPmJ1c19udW0gPSBwZGF0YS0+YnVzX251bTsKKwltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfTUFTSyg4KTsKIAogCS8qIHNldHVwIHRoZSBzdGF0ZSBmb3IgdGhlIGJpdGJhbmcgZHJpdmVyICovCiAKQEAgLTY0Myw2ICs2MzMsMTEgQEAKIHN0YXRpYyBpbnQgczNjMjR4eF9zcGlfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHMzYzI0eHhfc3BpICpodyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBzcGlfbWFzdGVyX3N1c3BlbmQoaHctPm1hc3Rlcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWlmIChody0+cGRhdGEgJiYgaHctPnBkYXRhLT5ncGlvX3NldHVwKQogCQlody0+cGRhdGEtPmdwaW9fc2V0dXAoaHctPnBkYXRhLCAwKTsKQEAgLTY1Niw3ICs2NTEsNyBAQAogCXN0cnVjdCBzM2MyNHh4X3NwaSAqaHcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXMzYzI0eHhfc3BpX2luaXRpYWxzZXR1cChodyk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNwaV9tYXN0ZXJfcmVzdW1lKGh3LT5tYXN0ZXIpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgczNjMjR4eF9zcGlfcG1vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktczNjNjR4eC5jIGIvZHJpdmVycy9zcGkvc3BpLXMzYzY0eHguYwppbmRleCBhZTkwN2RkLi5mMTljZDk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktczNjNjR4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zM2M2NHh4LmMKQEAgLTM0LDEwICszNCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3NwaS1zM2M2NHh4Lmg+CiAKLSNpZmRlZiBDT05GSUdfUzNDX0RNQQotI2luY2x1ZGUgPG1hY2gvZG1hLmg+Ci0jZW5kaWYKLQogI2RlZmluZSBNQVhfU1BJX1BPUlRTCQkzCiAjZGVmaW5lIFMzQzY0WFhfU1BJX1FVSVJLX1BPTEwJCSgxIDw8IDApCiAKQEAgLTIwMCw5ICsxOTYsNiBAQAogCXVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3NwZWVkOwogCXN0cnVjdCBzM2M2NHh4X3NwaV9kbWFfZGF0YQlyeF9kbWE7CiAJc3RydWN0IHMzYzY0eHhfc3BpX2RtYV9kYXRhCXR4X2RtYTsKLSNpZmRlZiBDT05GSUdfUzNDX0RNQQotCXN0cnVjdCBzYW1zdW5nX2RtYV9vcHMJCSpvcHM7Ci0jZW5kaWYKIAlzdHJ1Y3QgczNjNjR4eF9zcGlfcG9ydF9jb25maWcJKnBvcnRfY29uZjsKIAl1bnNpZ25lZCBpbnQJCQlwb3J0X2lkOwogCWJvb2wJCQkJY3NfZ3BpbzsKQEAgLTI4NCwxMDQgKzI3Nyw4IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RkLT5sb2NrLCBmbGFncyk7CiB9CiAKLSNpZmRlZiBDT05GSUdfUzNDX0RNQQotLyogRklYTUU6IHJlbW92ZSB0aGlzIHNlY3Rpb24gb25jZSBhcmNoL2FybS9tYWNoLXMzYzY0eHggdXNlcyBkbWFlbmdpbmUgKi8KLQotc3RhdGljIHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgczNjNjR4eF9zcGlfZG1hX2NsaWVudCA9IHsKLQkubmFtZSA9ICJzYW1zdW5nLXNwaS1kbWEiLAotfTsKLQogc3RhdGljIHZvaWQgcHJlcGFyZV9kbWEoc3RydWN0IHMzYzY0eHhfc3BpX2RtYV9kYXRhICpkbWEsCi0JCQkJCXVuc2lnbmVkIGxlbiwgZG1hX2FkZHJfdCBidWYpCi17Ci0Jc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQ7Ci0Jc3RydWN0IHNhbXN1bmdfZG1hX3ByZXAgaW5mbzsKLQlzdHJ1Y3Qgc2Ftc3VuZ19kbWFfY29uZmlnIGNvbmZpZzsKLQotCWlmIChkbWEtPmRpcmVjdGlvbiA9PSBETUFfREVWX1RPX01FTSkgewotCQlzZGQgPSBjb250YWluZXJfb2YoKHZvaWQgKilkbWEsCi0JCQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEsIHJ4X2RtYSk7Ci0JCWNvbmZpZy5kaXJlY3Rpb24gPSBzZGQtPnJ4X2RtYS5kaXJlY3Rpb247Ci0JCWNvbmZpZy5maWZvID0gc2RkLT5zZnJfc3RhcnQgKyBTM0M2NFhYX1NQSV9SWF9EQVRBOwotCQljb25maWcud2lkdGggPSBzZGQtPmN1cl9icHcgLyA4OwotCQlzZGQtPm9wcy0+Y29uZmlnKChlbnVtIGRtYV9jaClzZGQtPnJ4X2RtYS5jaCwgJmNvbmZpZyk7Ci0JfSBlbHNlIHsKLQkJc2RkID0gY29udGFpbmVyX29mKCh2b2lkICopZG1hLAotCQkJc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhLCB0eF9kbWEpOwotCQljb25maWcuZGlyZWN0aW9uID0gIHNkZC0+dHhfZG1hLmRpcmVjdGlvbjsKLQkJY29uZmlnLmZpZm8gPSBzZGQtPnNmcl9zdGFydCArIFMzQzY0WFhfU1BJX1RYX0RBVEE7Ci0JCWNvbmZpZy53aWR0aCA9IHNkZC0+Y3VyX2JwdyAvIDg7Ci0JCXNkZC0+b3BzLT5jb25maWcoKGVudW0gZG1hX2NoKXNkZC0+dHhfZG1hLmNoLCAmY29uZmlnKTsKLQl9Ci0KLQlpbmZvLmNhcCA9IERNQV9TTEFWRTsKLQlpbmZvLmxlbiA9IGxlbjsKLQlpbmZvLmZwID0gczNjNjR4eF9zcGlfZG1hY2I7Ci0JaW5mby5mcF9wYXJhbSA9IGRtYTsKLQlpbmZvLmRpcmVjdGlvbiA9IGRtYS0+ZGlyZWN0aW9uOwotCWluZm8uYnVmID0gYnVmOwotCi0Jc2RkLT5vcHMtPnByZXBhcmUoKGVudW0gZG1hX2NoKWRtYS0+Y2gsICZpbmZvKTsKLQlzZGQtPm9wcy0+dHJpZ2dlcigoZW51bSBkbWFfY2gpZG1hLT5jaCk7Ci19Ci0KLXN0YXRpYyBpbnQgYWNxdWlyZV9kbWEoc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQpCi17Ci0Jc3RydWN0IHNhbXN1bmdfZG1hX3JlcSByZXE7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnNkZC0+cGRldi0+ZGV2OwotCi0Jc2RkLT5vcHMgPSBzYW1zdW5nX2RtYV9nZXRfb3BzKCk7Ci0KLQlyZXEuY2FwID0gRE1BX1NMQVZFOwotCXJlcS5jbGllbnQgPSAmczNjNjR4eF9zcGlfZG1hX2NsaWVudDsKLQotCXNkZC0+cnhfZG1hLmNoID0gKHN0cnVjdCBkbWFfY2hhbiAqKSh1bnNpZ25lZCBsb25nKXNkZC0+b3BzLT5yZXF1ZXN0KAotCQkJCQlzZGQtPnJ4X2RtYS5kbWFjaCwgJnJlcSwgZGV2LCAicngiKTsKLQlzZGQtPnR4X2RtYS5jaCA9IChzdHJ1Y3QgZG1hX2NoYW4gKikodW5zaWduZWQgbG9uZylzZGQtPm9wcy0+cmVxdWVzdCgKLQkJCQkJc2RkLT50eF9kbWEuZG1hY2gsICZyZXEsIGRldiwgInR4Iik7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBzM2M2NHh4X3NwaV9wcmVwYXJlX3RyYW5zZmVyKHN0cnVjdCBzcGlfbWFzdGVyICpzcGkpCi17Ci0Jc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaSk7Ci0KLQkvKgotCSAqIElmIERNQSByZXNvdXJjZSB3YXMgbm90IGF2YWlsYWJsZSBkdXJpbmcKLQkgKiBwcm9iZSwgbm8gbmVlZCB0byBjb250aW51ZSB3aXRoIGRtYSByZXF1ZXN0cwotCSAqIGVsc2UgQWNxdWlyZSBETUEgY2hhbm5lbHMKLQkgKi8KLQl3aGlsZSAoIWlzX3BvbGxpbmcoc2RkKSAmJiAhYWNxdWlyZV9kbWEoc2RkKSkKLQkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzM2M2NHh4X3NwaV91bnByZXBhcmVfdHJhbnNmZXIoc3RydWN0IHNwaV9tYXN0ZXIgKnNwaSkKLXsKLQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpKTsKLQotCS8qIEZyZWUgRE1BIGNoYW5uZWxzICovCi0JaWYgKCFpc19wb2xsaW5nKHNkZCkpIHsKLQkJc2RkLT5vcHMtPnJlbGVhc2UoKGVudW0gZG1hX2NoKXNkZC0+cnhfZG1hLmNoLAotCQkJCQkmczNjNjR4eF9zcGlfZG1hX2NsaWVudCk7Ci0JCXNkZC0+b3BzLT5yZWxlYXNlKChlbnVtIGRtYV9jaClzZGQtPnR4X2RtYS5jaCwKLQkJCQkJJnMzYzY0eHhfc3BpX2RtYV9jbGllbnQpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzM2M2NHh4X3NwaV9kbWFfc3RvcChzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCwKLQkJCQkgc3RydWN0IHMzYzY0eHhfc3BpX2RtYV9kYXRhICpkbWEpCi17Ci0Jc2RkLT5vcHMtPnN0b3AoKGVudW0gZG1hX2NoKWRtYS0+Y2gpOwotfQotI2Vsc2UKLQotc3RhdGljIHZvaWQgcHJlcGFyZV9kbWEoc3RydWN0IHMzYzY0eHhfc3BpX2RtYV9kYXRhICpkbWEsCi0JCQkJCXVuc2lnbmVkIGxlbiwgZG1hX2FkZHJfdCBidWYpCisJCQlzdHJ1Y3Qgc2dfdGFibGUgKnNndCkKIHsKIAlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZDsKIAlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBjb25maWc7CkBAIC00MDcsOCArMzA0LDggQEAKIAkJZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhkbWEtPmNoLCAmY29uZmlnKTsKIAl9CiAKLQlkZXNjID0gZG1hZW5naW5lX3ByZXBfc2xhdmVfc2luZ2xlKGRtYS0+Y2gsIGJ1ZiwgbGVuLAotCQkJCQlkbWEtPmRpcmVjdGlvbiwgRE1BX1BSRVBfSU5URVJSVVBUKTsKKwlkZXNjID0gZG1hZW5naW5lX3ByZXBfc2xhdmVfc2coZG1hLT5jaCwgc2d0LT5zZ2wsIHNndC0+bmVudHMsCisJCQkJICAgICAgIGRtYS0+ZGlyZWN0aW9uLCBETUFfUFJFUF9JTlRFUlJVUFQpOwogCiAJZGVzYy0+Y2FsbGJhY2sgPSBzM2M2NHh4X3NwaV9kbWFjYjsKIAlkZXNjLT5jYWxsYmFja19wYXJhbSA9IGRtYTsKQEAgLTQzNyw2ICszMzQsNyBAQAogCQkJcmV0ID0gLUVCVVNZOwogCQkJZ290byBvdXQ7CiAJCX0KKwkJc3BpLT5kbWFfcnggPSBzZGQtPnJ4X2RtYS5jaDsKIAogCQlzZGQtPnR4X2RtYS5jaCA9IGRtYV9yZXF1ZXN0X3NsYXZlX2NoYW5uZWxfY29tcGF0KG1hc2ssIGZpbHRlciwKIAkJCQkgICAodm9pZCAqKXNkZC0+dHhfZG1hLmRtYWNoLCBkZXYsICJ0eCIpOwpAQCAtNDQ1LDYgKzM0Myw3IEBACiAJCQlyZXQgPSAtRUJVU1k7CiAJCQlnb3RvIG91dF9yeDsKIAkJfQorCQlzcGktPmRtYV90eCA9IHNkZC0+dHhfZG1hLmNoOwogCX0KIAogCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJnNkZC0+cGRldi0+ZGV2KTsKQEAgLTQ3NywxMiArMzc2LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHMzYzY0eHhfc3BpX2RtYV9zdG9wKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAotCQkJCSBzdHJ1Y3QgczNjNjR4eF9zcGlfZG1hX2RhdGEgKmRtYSkKK3N0YXRpYyBib29sIHMzYzY0eHhfc3BpX2Nhbl9kbWEoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKKwkJCQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCiB7Ci0JZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoZG1hLT5jaCk7CisJc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlyZXR1cm4geGZlci0+bGVuID4gKEZJRk9fTFZMX01BU0soc2RkKSA+PiAxKSArIDE7CiB9Ci0jZW5kaWYKIAogc3RhdGljIHZvaWQgZW5hYmxlX2RhdGFwYXRoKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAogCQkJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGksCkBAIC01MTUsNyArNDE2LDcgQEAKIAkJY2hjZmcgfD0gUzNDNjRYWF9TUElfQ0hfVFhDSF9PTjsKIAkJaWYgKGRtYV9tb2RlKSB7CiAJCQltb2RlY2ZnIHw9IFMzQzY0WFhfU1BJX01PREVfVFhETUFfT047Ci0JCQlwcmVwYXJlX2RtYSgmc2RkLT50eF9kbWEsIHhmZXItPmxlbiwgeGZlci0+dHhfZG1hKTsKKwkJCXByZXBhcmVfZG1hKCZzZGQtPnR4X2RtYSwgJnhmZXItPnR4X3NnKTsKIAkJfSBlbHNlIHsKIAkJCXN3aXRjaCAoc2RkLT5jdXJfYnB3KSB7CiAJCQljYXNlIDMyOgpAQCAtNTQ3LDcgKzQ0OCw3IEBACiAJCQl3cml0ZWwoKCh4ZmVyLT5sZW4gKiA4IC8gc2RkLT5jdXJfYnB3KSAmIDB4ZmZmZikKIAkJCQkJfCBTM0M2NFhYX1NQSV9QQUNLRVRfQ05UX0VOLAogCQkJCQlyZWdzICsgUzNDNjRYWF9TUElfUEFDS0VUX0NOVCk7Ci0JCQlwcmVwYXJlX2RtYSgmc2RkLT5yeF9kbWEsIHhmZXItPmxlbiwgeGZlci0+cnhfZG1hKTsKKwkJCXByZXBhcmVfZG1hKCZzZGQtPnJ4X2RtYSwgJnhmZXItPnJ4X3NnKTsKIAkJfQogCX0KIApAQCAtNTU1LDIzICs0NTYsNiBAQAogCXdyaXRlbChjaGNmZywgcmVncyArIFMzQzY0WFhfU1BJX0NIX0NGRyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfY3Moc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCi0JCQkJCQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCWlmIChzZGQtPnRnbF9zcGkgIT0gTlVMTCkgeyAvKiBJZiBsYXN0IGRldmljZSB0b2dnbGVkIGFmdGVyIG1zc2cgKi8KLQkJaWYgKHNkZC0+dGdsX3NwaSAhPSBzcGkpIHsgLyogaWYgbGFzdCBtc3NnIG9uIGRpZmYgZGV2aWNlICovCi0JCQkvKiBEZXNlbGVjdCB0aGUgbGFzdCB0b2dnbGVkIGRldmljZSAqLwotCQkJaWYgKHNwaS0+Y3NfZ3BpbyA+PSAwKQotCQkJCWdwaW9fc2V0X3ZhbHVlKHNwaS0+Y3NfZ3BpbywKLQkJCQkJc3BpLT5tb2RlICYgU1BJX0NTX0hJR0ggPyAwIDogMSk7Ci0JCX0KLQkJc2RkLT50Z2xfc3BpID0gTlVMTDsKLQl9Ci0KLQlpZiAoc3BpLT5jc19ncGlvID49IDApCi0JCWdwaW9fc2V0X3ZhbHVlKHNwaS0+Y3NfZ3Bpbywgc3BpLT5tb2RlICYgU1BJX0NTX0hJR0ggPyAxIDogMCk7Ci19Ci0KIHN0YXRpYyB1MzIgczNjNjR4eF9zcGlfd2FpdF9mb3JfdGltZW91dChzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCwKIAkJCQkJaW50IHRpbWVvdXRfbXMpCiB7CkBAIC01OTMsMTEyICs0NzcsMTExIEBACiAJcmV0dXJuIFJYX0ZJRk9fTFZMKHN0YXR1cywgc2RkKTsKIH0KIAotc3RhdGljIGludCB3YWl0X2Zvcl94ZmVyKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAotCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIsIGludCBkbWFfbW9kZSkKK3N0YXRpYyBpbnQgd2FpdF9mb3JfZG1hKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAorCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKIHsKIAl2b2lkIF9faW9tZW0gKnJlZ3MgPSBzZGQtPnJlZ3M7CiAJdW5zaWduZWQgbG9uZyB2YWw7CisJdTMyIHN0YXR1czsKIAlpbnQgbXM7CiAKIAkvKiBtaWxsaXNlY3MgdG8geGZlciAnbGVuJyBieXRlcyBAICdjdXJfc3BlZWQnICovCiAJbXMgPSB4ZmVyLT5sZW4gKiA4ICogMTAwMCAvIHNkZC0+Y3VyX3NwZWVkOwogCW1zICs9IDEwOyAvKiBzb21lIHRvbGVyYW5jZSAqLwogCi0JaWYgKGRtYV9tb2RlKSB7Ci0JCXZhbCA9IG1zZWNzX3RvX2ppZmZpZXMobXMpICsgMTA7Ci0JCXZhbCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmc2RkLT54ZmVyX2NvbXBsZXRpb24sIHZhbCk7Ci0JfSBlbHNlIHsKLQkJdTMyIHN0YXR1czsKLQkJdmFsID0gbXNlY3NfdG9fbG9vcHMobXMpOwotCQlkbyB7CisJdmFsID0gbXNlY3NfdG9famlmZmllcyhtcykgKyAxMDsKKwl2YWwgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnNkZC0+eGZlcl9jb21wbGV0aW9uLCB2YWwpOworCisJLyoKKwkgKiBJZiB0aGUgcHJldmlvdXMgeGZlciB3YXMgY29tcGxldGVkIHdpdGhpbiB0aW1lb3V0LCB0aGVuCisJICogcHJvY2VlZCBmdXJ0aGVyIGVsc2UgcmV0dXJuIC1FSU8uCisJICogRG1hVHggcmV0dXJucyBhZnRlciBzaW1wbHkgd3JpdGluZyBkYXRhIGluIHRoZSBGSUZPLAorCSAqIHcvbyB3YWl0aW5nIGZvciByZWFsIHRyYW5zbWlzc2lvbiBvbiB0aGUgYnVzIHRvIGZpbmlzaC4KKwkgKiBEbWFSeCByZXR1cm5zIG9ubHkgYWZ0ZXIgRG1hIHJlYWQgZGF0YSBmcm9tIEZJRk8gd2hpY2gKKwkgKiBuZWVkcyBidXMgdHJhbnNtaXNzaW9uIHRvIGZpbmlzaCwgc28gd2UgZG9uJ3Qgd29ycnkgaWYKKwkgKiBYZmVyIGludm9sdmVkIFJ4KHdpdGggb3Igd2l0aG91dCBUeCkuCisJICovCisJaWYgKHZhbCAmJiAheGZlci0+cnhfYnVmKSB7CisJCXZhbCA9IG1zZWNzX3RvX2xvb3BzKDEwKTsKKwkJc3RhdHVzID0gcmVhZGwocmVncyArIFMzQzY0WFhfU1BJX1NUQVRVUyk7CisJCXdoaWxlICgoVFhfRklGT19MVkwoc3RhdHVzLCBzZGQpCisJCQl8fCAhUzNDNjRYWF9TUElfU1RfVFhfRE9ORShzdGF0dXMsIHNkZCkpCisJCSAgICAgICAmJiAtLXZhbCkgeworCQkJY3B1X3JlbGF4KCk7CiAJCQlzdGF0dXMgPSByZWFkbChyZWdzICsgUzNDNjRYWF9TUElfU1RBVFVTKTsKLQkJfSB3aGlsZSAoUlhfRklGT19MVkwoc3RhdHVzLCBzZGQpIDwgeGZlci0+bGVuICYmIC0tdmFsKTsKLQl9Ci0KLQlpZiAoZG1hX21vZGUpIHsKLQkJdTMyIHN0YXR1czsKLQotCQkvKgotCQkgKiBJZiB0aGUgcHJldmlvdXMgeGZlciB3YXMgY29tcGxldGVkIHdpdGhpbiB0aW1lb3V0LCB0aGVuCi0JCSAqIHByb2NlZWQgZnVydGhlciBlbHNlIHJldHVybiAtRUlPLgotCQkgKiBEbWFUeCByZXR1cm5zIGFmdGVyIHNpbXBseSB3cml0aW5nIGRhdGEgaW4gdGhlIEZJRk8sCi0JCSAqIHcvbyB3YWl0aW5nIGZvciByZWFsIHRyYW5zbWlzc2lvbiBvbiB0aGUgYnVzIHRvIGZpbmlzaC4KLQkJICogRG1hUnggcmV0dXJucyBvbmx5IGFmdGVyIERtYSByZWFkIGRhdGEgZnJvbSBGSUZPIHdoaWNoCi0JCSAqIG5lZWRzIGJ1cyB0cmFuc21pc3Npb24gdG8gZmluaXNoLCBzbyB3ZSBkb24ndCB3b3JyeSBpZgotCQkgKiBYZmVyIGludm9sdmVkIFJ4KHdpdGggb3Igd2l0aG91dCBUeCkuCi0JCSAqLwotCQlpZiAodmFsICYmICF4ZmVyLT5yeF9idWYpIHsKLQkJCXZhbCA9IG1zZWNzX3RvX2xvb3BzKDEwKTsKLQkJCXN0YXR1cyA9IHJlYWRsKHJlZ3MgKyBTM0M2NFhYX1NQSV9TVEFUVVMpOwotCQkJd2hpbGUgKChUWF9GSUZPX0xWTChzdGF0dXMsIHNkZCkKLQkJCQl8fCAhUzNDNjRYWF9TUElfU1RfVFhfRE9ORShzdGF0dXMsIHNkZCkpCi0JCQkJCSYmIC0tdmFsKSB7Ci0JCQkJY3B1X3JlbGF4KCk7Ci0JCQkJc3RhdHVzID0gcmVhZGwocmVncyArIFMzQzY0WFhfU1BJX1NUQVRVUyk7Ci0JCQl9Ci0KIAkJfQogCi0JCS8qIElmIHRpbWVkIG91dCB3aGlsZSBjaGVja2luZyByeC90eCBzdGF0dXMgcmV0dXJuIGVycm9yICovCi0JCWlmICghdmFsKQotCQkJcmV0dXJuIC1FSU87Ci0JfSBlbHNlIHsKLQkJaW50IGxvb3BzOwotCQl1MzIgY3B5X2xlbjsKLQkJdTggKmJ1ZjsKLQotCQkvKiBJZiBpdCB3YXMgb25seSBUeCAqLwotCQlpZiAoIXhmZXItPnJ4X2J1ZikgewotCQkJc2RkLT5zdGF0ZSAmPSB+VFhCVVNZOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQkvKgotCQkgKiBJZiB0aGUgcmVjZWl2ZSBsZW5ndGggaXMgYmlnZ2VyIHRoYW4gdGhlIGNvbnRyb2xsZXIgZmlmbwotCQkgKiBzaXplLCBjYWxjdWxhdGUgdGhlIGxvb3BzIGFuZCByZWFkIHRoZSBmaWZvIGFzIG1hbnkgdGltZXMuCi0JCSAqIGxvb3BzID0gbGVuZ3RoIC8gbWF4IGZpZm8gc2l6ZSAoY2FsY3VsYXRlZCBieSB1c2luZyB0aGUKLQkJICogZmlmbyBtYXNrKS4KLQkJICogRm9yIGFueSBzaXplIGxlc3MgdGhhbiB0aGUgZmlmbyBzaXplIHRoZSBiZWxvdyBjb2RlIGlzCi0JCSAqIGV4ZWN1dGVkIGF0bGVhc3Qgb25jZS4KLQkJICovCi0JCWxvb3BzID0geGZlci0+bGVuIC8gKChGSUZPX0xWTF9NQVNLKHNkZCkgPj4gMSkgKyAxKTsKLQkJYnVmID0geGZlci0+cnhfYnVmOwotCQlkbyB7Ci0JCQkvKiB3YWl0IGZvciBkYXRhIHRvIGJlIHJlY2VpdmVkIGluIHRoZSBmaWZvICovCi0JCQljcHlfbGVuID0gczNjNjR4eF9zcGlfd2FpdF9mb3JfdGltZW91dChzZGQsCi0JCQkJCQkobG9vcHMgPyBtcyA6IDApKTsKLQotCQkJc3dpdGNoIChzZGQtPmN1cl9icHcpIHsKLQkJCWNhc2UgMzI6Ci0JCQkJaW9yZWFkMzJfcmVwKHJlZ3MgKyBTM0M2NFhYX1NQSV9SWF9EQVRBLAotCQkJCQlidWYsIGNweV9sZW4gLyA0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTY6Ci0JCQkJaW9yZWFkMTZfcmVwKHJlZ3MgKyBTM0M2NFhYX1NQSV9SWF9EQVRBLAotCQkJCQlidWYsIGNweV9sZW4gLyAyKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJaW9yZWFkOF9yZXAocmVncyArIFMzQzY0WFhfU1BJX1JYX0RBVEEsCi0JCQkJCWJ1ZiwgY3B5X2xlbik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWJ1ZiA9IGJ1ZiArIGNweV9sZW47Ci0JCX0gd2hpbGUgKGxvb3BzLS0pOwotCQlzZGQtPnN0YXRlICY9IH5SWEJVU1k7CiAJfQogCisJLyogSWYgdGltZWQgb3V0IHdoaWxlIGNoZWNraW5nIHJ4L3R4IHN0YXR1cyByZXR1cm4gZXJyb3IgKi8KKwlpZiAoIXZhbCkKKwkJcmV0dXJuIC1FSU87CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfY3Moc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCi0JCQkJCQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQorc3RhdGljIGludCB3YWl0X2Zvcl9waW8oc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCisJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQogewotCWlmIChzZGQtPnRnbF9zcGkgPT0gc3BpKQotCQlzZGQtPnRnbF9zcGkgPSBOVUxMOworCXZvaWQgX19pb21lbSAqcmVncyA9IHNkZC0+cmVnczsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwl1MzIgc3RhdHVzOworCWludCBsb29wczsKKwl1MzIgY3B5X2xlbjsKKwl1OCAqYnVmOworCWludCBtczsKIAotCWlmIChzcGktPmNzX2dwaW8gPj0gMCkKLQkJZ3Bpb19zZXRfdmFsdWUoc3BpLT5jc19ncGlvLCBzcGktPm1vZGUgJiBTUElfQ1NfSElHSCA/IDAgOiAxKTsKKwkvKiBtaWxsaXNlY3MgdG8geGZlciAnbGVuJyBieXRlcyBAICdjdXJfc3BlZWQnICovCisJbXMgPSB4ZmVyLT5sZW4gKiA4ICogMTAwMCAvIHNkZC0+Y3VyX3NwZWVkOworCW1zICs9IDEwOyAvKiBzb21lIHRvbGVyYW5jZSAqLworCisJdmFsID0gbXNlY3NfdG9fbG9vcHMobXMpOworCWRvIHsKKwkJc3RhdHVzID0gcmVhZGwocmVncyArIFMzQzY0WFhfU1BJX1NUQVRVUyk7CisJfSB3aGlsZSAoUlhfRklGT19MVkwoc3RhdHVzLCBzZGQpIDwgeGZlci0+bGVuICYmIC0tdmFsKTsKKworCisJLyogSWYgaXQgd2FzIG9ubHkgVHggKi8KKwlpZiAoIXhmZXItPnJ4X2J1ZikgeworCQlzZGQtPnN0YXRlICY9IH5UWEJVU1k7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogSWYgdGhlIHJlY2VpdmUgbGVuZ3RoIGlzIGJpZ2dlciB0aGFuIHRoZSBjb250cm9sbGVyIGZpZm8KKwkgKiBzaXplLCBjYWxjdWxhdGUgdGhlIGxvb3BzIGFuZCByZWFkIHRoZSBmaWZvIGFzIG1hbnkgdGltZXMuCisJICogbG9vcHMgPSBsZW5ndGggLyBtYXggZmlmbyBzaXplIChjYWxjdWxhdGVkIGJ5IHVzaW5nIHRoZQorCSAqIGZpZm8gbWFzaykuCisJICogRm9yIGFueSBzaXplIGxlc3MgdGhhbiB0aGUgZmlmbyBzaXplIHRoZSBiZWxvdyBjb2RlIGlzCisJICogZXhlY3V0ZWQgYXRsZWFzdCBvbmNlLgorCSAqLworCWxvb3BzID0geGZlci0+bGVuIC8gKChGSUZPX0xWTF9NQVNLKHNkZCkgPj4gMSkgKyAxKTsKKwlidWYgPSB4ZmVyLT5yeF9idWY7CisJZG8geworCQkvKiB3YWl0IGZvciBkYXRhIHRvIGJlIHJlY2VpdmVkIGluIHRoZSBmaWZvICovCisJCWNweV9sZW4gPSBzM2M2NHh4X3NwaV93YWl0X2Zvcl90aW1lb3V0KHNkZCwKKwkJCQkJCSAgICAgICAobG9vcHMgPyBtcyA6IDApKTsKKworCQlzd2l0Y2ggKHNkZC0+Y3VyX2JwdykgeworCQljYXNlIDMyOgorCQkJaW9yZWFkMzJfcmVwKHJlZ3MgKyBTM0M2NFhYX1NQSV9SWF9EQVRBLAorCQkJCSAgICAgYnVmLCBjcHlfbGVuIC8gNCk7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCWlvcmVhZDE2X3JlcChyZWdzICsgUzNDNjRYWF9TUElfUlhfREFUQSwKKwkJCQkgICAgIGJ1ZiwgY3B5X2xlbiAvIDIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpb3JlYWQ4X3JlcChyZWdzICsgUzNDNjRYWF9TUElfUlhfREFUQSwKKwkJCQkgICAgYnVmLCBjcHlfbGVuKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYnVmID0gYnVmICsgY3B5X2xlbjsKKwl9IHdoaWxlIChsb29wcy0tKTsKKwlzZGQtPnN0YXRlICY9IH5SWEJVU1k7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgczNjNjR4eF9zcGlfY29uZmlnKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkKQpAQCAtNzc0LDgxICs2NTcsNiBAQAogCiAjZGVmaW5lIFhGRVJfRE1BQUREUl9JTlZBTElEIERNQV9CSVRfTUFTSygzMikKIAotc3RhdGljIGludCBzM2M2NHh4X3NwaV9tYXBfbXNzZyhzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCwKLQkJCQkJCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzZGQtPnBkZXYtPmRldjsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyOwotCi0JaWYgKGlzX3BvbGxpbmcoc2RkKSB8fCBtc2ctPmlzX2RtYV9tYXBwZWQpCi0JCXJldHVybiAwOwotCi0JLyogRmlyc3QgbWFyayBhbGwgeGZlciB1bm1hcHBlZCAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoeGZlciwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCXhmZXItPnJ4X2RtYSA9IFhGRVJfRE1BQUREUl9JTlZBTElEOwotCQl4ZmVyLT50eF9kbWEgPSBYRkVSX0RNQUFERFJfSU5WQUxJRDsKLQl9Ci0KLQkvKiBNYXAgdW50aWwgZW5kIG9yIGZpcnN0IGZhaWwgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCi0JCWlmICh4ZmVyLT5sZW4gPD0gKChGSUZPX0xWTF9NQVNLKHNkZCkgPj4gMSkgKyAxKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICh4ZmVyLT50eF9idWYgIT0gTlVMTCkgewotCQkJeGZlci0+dHhfZG1hID0gZG1hX21hcF9zaW5nbGUoZGV2LAotCQkJCQkodm9pZCAqKXhmZXItPnR4X2J1ZiwgeGZlci0+bGVuLAotCQkJCQlETUFfVE9fREVWSUNFKTsKLQkJCWlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIHhmZXItPnR4X2RtYSkpIHsKLQkJCQlkZXZfZXJyKGRldiwgImRtYV9tYXBfc2luZ2xlIFR4IGZhaWxlZFxuIik7Ci0JCQkJeGZlci0+dHhfZG1hID0gWEZFUl9ETUFBRERSX0lOVkFMSUQ7Ci0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9Ci0JCX0KLQotCQlpZiAoeGZlci0+cnhfYnVmICE9IE5VTEwpIHsKLQkJCXhmZXItPnJ4X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGRldiwgeGZlci0+cnhfYnVmLAotCQkJCQkJeGZlci0+bGVuLCBETUFfRlJPTV9ERVZJQ0UpOwotCQkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgeGZlci0+cnhfZG1hKSkgewotCQkJCWRldl9lcnIoZGV2LCAiZG1hX21hcF9zaW5nbGUgUnggZmFpbGVkXG4iKTsKLQkJCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgeGZlci0+dHhfZG1hLAotCQkJCQkJeGZlci0+bGVuLCBETUFfVE9fREVWSUNFKTsKLQkJCQl4ZmVyLT50eF9kbWEgPSBYRkVSX0RNQUFERFJfSU5WQUxJRDsKLQkJCQl4ZmVyLT5yeF9kbWEgPSBYRkVSX0RNQUFERFJfSU5WQUxJRDsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzM2M2NHh4X3NwaV91bm1hcF9tc3NnKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAotCQkJCQkJc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnNkZC0+cGRldi0+ZGV2OwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXI7Ci0KLQlpZiAoaXNfcG9sbGluZyhzZGQpIHx8IG1zZy0+aXNfZG1hX21hcHBlZCkKLQkJcmV0dXJuOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh4ZmVyLCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQotCQlpZiAoeGZlci0+bGVuIDw9ICgoRklGT19MVkxfTUFTSyhzZGQpID4+IDEpICsgMSkpCi0JCQljb250aW51ZTsKLQotCQlpZiAoeGZlci0+cnhfYnVmICE9IE5VTEwKLQkJCQkmJiB4ZmVyLT5yeF9kbWEgIT0gWEZFUl9ETUFBRERSX0lOVkFMSUQpCi0JCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgeGZlci0+cnhfZG1hLAotCQkJCQkJeGZlci0+bGVuLCBETUFfRlJPTV9ERVZJQ0UpOwotCi0JCWlmICh4ZmVyLT50eF9idWYgIT0gTlVMTAotCQkJCSYmIHhmZXItPnR4X2RtYSAhPSBYRkVSX0RNQUFERFJfSU5WQUxJRCkKLQkJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCB4ZmVyLT50eF9kbWEsCi0JCQkJCQl4ZmVyLT5sZW4sIERNQV9UT19ERVZJQ0UpOwotCX0KLX0KLQogc3RhdGljIGludCBzM2M2NHh4X3NwaV9wcmVwYXJlX21lc3NhZ2Uoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKIAkJCQkgICAgICAgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCiB7CkBAIC04NjYsMTMgKzY3NCw2IEBACiAJCXMzYzY0eHhfc3BpX2NvbmZpZyhzZGQpOwogCX0KIAotCS8qIE1hcCBhbGwgdGhlIHRyYW5zZmVycyBpZiBuZWVkZWQgKi8KLQlpZiAoczNjNjR4eF9zcGlfbWFwX21zc2coc2RkLCBtc2cpKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LAotCQkJIlhmZXI6IFVuYWJsZSB0byBtYXAgbWVzc2FnZSBidWZmZXJzIVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQogCS8qIENvbmZpZ3VyZSBmZWVkYmFjayBkZWxheSAqLwogCXdyaXRlbChjcy0+ZmJfZGVsYXkgJiAweDMsIHNkZC0+cmVncyArIFMzQzY0WFhfU1BJX0ZCX0NMSyk7CiAKQEAgLTg5NiwxMyArNjk3LDYgQEAKIAlicHcgPSB4ZmVyLT5iaXRzX3Blcl93b3JkOwogCXNwZWVkID0geGZlci0+c3BlZWRfaHogPyA6IHNwaS0+bWF4X3NwZWVkX2h6OwogCi0JaWYgKHhmZXItPmxlbiAlIChicHcgLyA4KSkgewotCQlkZXZfZXJyKCZzcGktPmRldiwKLQkJCSJYZmVyIGxlbmd0aCgldSkgbm90IGEgbXVsdGlwbGUgb2Ygd29yZCBzaXplKCV1KVxuIiwKLQkJCXhmZXItPmxlbiwgYnB3IC8gOCk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQogCWlmIChicHcgIT0gc2RkLT5jdXJfYnB3IHx8IHNwZWVkICE9IHNkZC0+Y3VyX3NwZWVkKSB7CiAJCXNkZC0+Y3VyX2JwdyA9IGJwdzsKIAkJc2RkLT5jdXJfc3BlZWQgPSBzcGVlZDsKQEAgLTkyOSw3ICs3MjMsMTAgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkZC0+bG9jaywgZmxhZ3MpOwogCi0Jc3RhdHVzID0gd2FpdF9mb3JfeGZlcihzZGQsIHhmZXIsIHVzZV9kbWEpOworCWlmICh1c2VfZG1hKQorCQlzdGF0dXMgPSB3YWl0X2Zvcl9kbWEoc2RkLCB4ZmVyKTsKKwllbHNlCisJCXN0YXR1cyA9IHdhaXRfZm9yX3BpbyhzZGQsIHhmZXIpOwogCiAJaWYgKHN0YXR1cykgewogCQlkZXZfZXJyKCZzcGktPmRldiwgIkkvTyBFcnJvcjogcngtJWQgdHgtJWQgcmVzOnJ4LSVjIHR4LSVjIGxlbi0lZFxuIiwKQEAgLTk0MSwxMCArNzM4LDEwIEBACiAJCWlmICh1c2VfZG1hKSB7CiAJCQlpZiAoeGZlci0+dHhfYnVmICE9IE5VTEwKIAkJCSAgICAmJiAoc2RkLT5zdGF0ZSAmIFRYQlVTWSkpCi0JCQkJczNjNjR4eF9zcGlfZG1hX3N0b3Aoc2RkLCAmc2RkLT50eF9kbWEpOworCQkJCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHNkZC0+dHhfZG1hLmNoKTsKIAkJCWlmICh4ZmVyLT5yeF9idWYgIT0gTlVMTAogCQkJICAgICYmIChzZGQtPnN0YXRlICYgUlhCVVNZKSkKLQkJCQlzM2M2NHh4X3NwaV9kbWFfc3RvcChzZGQsICZzZGQtPnJ4X2RtYSk7CisJCQkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoc2RkLT5yeF9kbWEuY2gpOwogCQl9CiAJfSBlbHNlIHsKIAkJZmx1c2hfZmlmbyhzZGQpOwpAQCAtOTUzLDE2ICs3NTAsNiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQgczNjNjR4eF9zcGlfdW5wcmVwYXJlX21lc3NhZ2Uoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKLQkJCQkJICAgIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQotewotCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCi0JczNjNjR4eF9zcGlfdW5tYXBfbXNzZyhzZGQsIG1zZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBzM2M2NHh4X3NwaV9jc2luZm8gKnMzYzY0eHhfZ2V0X3NsYXZlX2N0cmxkYXRhKAogCQkJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CkBAIC0xMDkyLDE0ICs4NzksMTIgQEAKIAogCXBtX3J1bnRpbWVfcHV0KCZzZGQtPnBkZXYtPmRldik7CiAJd3JpdGVsKFMzQzY0WFhfU1BJX1NMQVZFX1NJR19JTkFDVCwgc2RkLT5yZWdzICsgUzNDNjRYWF9TUElfU0xBVkVfU0VMKTsKLQlkaXNhYmxlX2NzKHNkZCwgc3BpKTsKIAlyZXR1cm4gMDsKIAogc2V0dXBfZXhpdDoKIAlwbV9ydW50aW1lX3B1dCgmc2RkLT5wZGV2LT5kZXYpOwogCS8qIHNldHVwKCkgcmV0dXJucyB3aXRoIGRldmljZSBkZS1zZWxlY3RlZCAqLwogCXdyaXRlbChTM0M2NFhYX1NQSV9TTEFWRV9TSUdfSU5BQ1QsIHNkZC0+cmVncyArIFMzQzY0WFhfU1BJX1NMQVZFX1NFTCk7Ci0JZGlzYWJsZV9jcyhzZGQsIHNwaSk7CiAKIAlncGlvX2ZyZWUoY3MtPmxpbmUpOwogCXNwaV9zZXRfY3RsZGF0YShzcGksIE5VTEwpOwpAQCAtMTMzOCw3ICsxMTIzLDYgQEAKIAltYXN0ZXItPnByZXBhcmVfdHJhbnNmZXJfaGFyZHdhcmUgPSBzM2M2NHh4X3NwaV9wcmVwYXJlX3RyYW5zZmVyOwogCW1hc3Rlci0+cHJlcGFyZV9tZXNzYWdlID0gczNjNjR4eF9zcGlfcHJlcGFyZV9tZXNzYWdlOwogCW1hc3Rlci0+dHJhbnNmZXJfb25lID0gczNjNjR4eF9zcGlfdHJhbnNmZXJfb25lOwotCW1hc3Rlci0+dW5wcmVwYXJlX21lc3NhZ2UgPSBzM2M2NHh4X3NwaV91bnByZXBhcmVfbWVzc2FnZTsKIAltYXN0ZXItPnVucHJlcGFyZV90cmFuc2Zlcl9oYXJkd2FyZSA9IHMzYzY0eHhfc3BpX3VucHJlcGFyZV90cmFuc2ZlcjsKIAltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gc2NpLT5udW1fY3M7CiAJbWFzdGVyLT5kbWFfYWxpZ25tZW50ID0gODsKQEAgLTEzNDcsNiArMTEzMSw4IEBACiAJLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0g7CiAJbWFzdGVyLT5hdXRvX3J1bnRpbWVfcG0gPSB0cnVlOworCWlmICghaXNfcG9sbGluZyhzZGQpKQorCQltYXN0ZXItPmNhbl9kbWEgPSBzM2M2NHh4X3NwaV9jYW5fZG1hOwogCiAJc2RkLT5yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIG1lbV9yZXMpOwogCWlmIChJU19FUlIoc2RkLT5yZWdzKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXNjMThpczYwMi5jIGIvZHJpdmVycy9zcGkvc3BpLXNjMThpczYwMi5jCmluZGV4IDEyMWMyZTEuLjIzN2YyZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1zYzE4aXM2MDIuYworKysgYi9kcml2ZXJzL3NwaS9zcGktc2MxOGlzNjAyLmMKQEAgLTE4MywxNyArMTgzLDkgQEAKIHN0YXRpYyBpbnQgc2MxOGlzNjAyX2NoZWNrX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCiAJCQkJICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQsIGludCB0bGVuKQogewotCXVpbnQzMl90IGh6OwotCiAJaWYgKHQgJiYgdC0+bGVuICsgdGxlbiA+IFNDMThJUzYwMl9CVUZTSVopCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaHogPSBzcGktPm1heF9zcGVlZF9oejsKLQlpZiAodCAmJiB0LT5zcGVlZF9oeikKLQkJaHogPSB0LT5zcGVlZF9oejsKLQlpZiAoaHogPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjA1LDIyICsxOTcsMTUgQEAKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0OwogCWludCBzdGF0dXMgPSAwOwogCi0JLyogU0MxOElTNjAyIGRvZXMgbm90IHN1cHBvcnQgQ1MyICovCi0JaWYgKGh3LT5pZCA9PSBzYzE4aXM2MDIgJiYgc3BpLT5jaGlwX3NlbGVjdCA9PSAyKSB7Ci0JCXN0YXR1cyA9IC1FTlhJTzsKLQkJZ290byBlcnJvcjsKLQl9Ci0KIAlody0+dGxlbiA9IDA7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCXUzMiBoeiA9IHQtPnNwZWVkX2h6ID8gOiBzcGktPm1heF9zcGVlZF9oejsKIAkJYm9vbCBkb190cmFuc2ZlcjsKIAogCQlzdGF0dXMgPSBzYzE4aXM2MDJfY2hlY2tfdHJhbnNmZXIoc3BpLCB0LCBody0+dGxlbik7CiAJCWlmIChzdGF0dXMgPCAwKQogCQkJYnJlYWs7CiAKLQkJc3RhdHVzID0gc2MxOGlzNjAyX3NldHVwX3RyYW5zZmVyKGh3LCBoeiwgc3BpLT5tb2RlKTsKKwkJc3RhdHVzID0gc2MxOGlzNjAyX3NldHVwX3RyYW5zZmVyKGh3LCB0LT5zcGVlZF9oeiwgc3BpLT5tb2RlKTsKIAkJaWYgKHN0YXR1cyA8IDApCiAJCQlicmVhazsKIApAQCAtMjM4LDcgKzIyMyw2IEBACiAJCWlmICh0LT5kZWxheV91c2VjcykKIAkJCXVkZWxheSh0LT5kZWxheV91c2Vjcyk7CiAJfQotZXJyb3I6CiAJbS0+c3RhdHVzID0gc3RhdHVzOwogCXNwaV9maW5hbGl6ZV9jdXJyZW50X21lc3NhZ2UobWFzdGVyKTsKIApAQCAtMjQ3LDEwICsyMzEsMTMgQEAKIAogc3RhdGljIGludCBzYzE4aXM2MDJfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlpZiAoc3BpLT5tb2RlICYgfihTUElfQ1BIQSB8IFNQSV9DUE9MIHwgU1BJX0xTQl9GSVJTVCkpCi0JCXJldHVybiAtRUlOVkFMOworCXN0cnVjdCBzYzE4aXM2MDIgKmh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CiAKLQlyZXR1cm4gc2MxOGlzNjAyX2NoZWNrX3RyYW5zZmVyKHNwaSwgTlVMTCwgMCk7CisJLyogU0MxOElTNjAyIGRvZXMgbm90IHN1cHBvcnQgQ1MyICovCisJaWYgKGh3LT5pZCA9PSBzYzE4aXM2MDIgJiYgc3BpLT5jaGlwX3NlbGVjdCA9PSAyKQorCQlyZXR1cm4gLUVOWElPOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc2MxOGlzNjAyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCkBAIC0zMDksNiArMjk2LDggQEAKIAltYXN0ZXItPnNldHVwID0gc2MxOGlzNjAyX3NldHVwOwogCW1hc3Rlci0+dHJhbnNmZXJfb25lX21lc3NhZ2UgPSBzYzE4aXM2MDJfdHJhbnNmZXJfb25lOwogCW1hc3Rlci0+ZGV2Lm9mX25vZGUgPSBucDsKKwltYXN0ZXItPm1pbl9zcGVlZF9oeiA9IGh3LT5mcmVxIC8gMTI4OworCW1hc3Rlci0+bWF4X3NwZWVkX2h6ID0gaHctPmZyZXEgLyA0OwogCiAJZXJyb3IgPSBkZXZtX3NwaV9yZWdpc3Rlcl9tYXN0ZXIoZGV2LCBtYXN0ZXIpOwogCWlmIChlcnJvcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1zaC1oc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktc2gtaHNwaS5jCmluZGV4IDgyZDJmOTIuLjkwMDk0NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1zaC1oc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXNoLWhzcGkuYwpAQCAtNDYsOCArNDYsNiBAQAogLyogU1BTUiAqLwogI2RlZmluZSBSWEZMCSgxIDw8IDIpCiAKLSNkZWZpbmUgaHNwaTJpbmZvKGgpCShoLT5kZXYtPnBsYXRmb3JtX2RhdGEpCi0KIHN0cnVjdCBoc3BpX3ByaXYgewogCXZvaWQgX19pb21lbSAqYWRkcjsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwpAQCAtMTEzLDE0ICsxMTEsOSBAQAogewogCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBtc2ctPnNwaTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoc3BpLT5kZXY7Ci0JdTMyIHRhcmdldF9yYXRlOwogCXUzMiBzcGNyLCBpZGl2X2NsazsKIAl1MzIgcmF0ZSwgYmVzdF9yYXRlLCBtaW4sIHRtcDsKIAotCXRhcmdldF9yYXRlID0gdCA/IHQtPnNwZWVkX2h6IDogMDsKLQlpZiAoIXRhcmdldF9yYXRlKQotCQl0YXJnZXRfcmF0ZSA9IHNwaS0+bWF4X3NwZWVkX2h6OwotCiAJLyoKIAkgKiBmaW5kIGJlc3QgSURJVi9DTEtDeCBzZXR0aW5ncwogCSAqLwpAQCAtMTQwLDcgKzEzMyw3IEBACiAJCXJhdGUgLz0gKCgoaWRpdl9jbGsgJiAweDFGKSArIDEpICogMik7CiAKIAkJLyogc2F2ZSBiZXN0IHNldHRpbmdzICovCi0JCXRtcCA9IGFicyh0YXJnZXRfcmF0ZSAtIHJhdGUpOworCQl0bXAgPSBhYnModC0+c3BlZWRfaHogLSByYXRlKTsKIAkJaWYgKHRtcCA8IG1pbikgewogCQkJbWluID0gdG1wOwogCQkJc3BjciA9IGlkaXZfY2xrOwpAQCAtMTUzLDcgKzE0Niw3IEBACiAJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUE9MKQogCQlzcGNyIHw9IDEgPDwgNjsKIAotCWRldl9kYmcoZGV2LCAic3BlZWQgJWQvJWRcbiIsIHRhcmdldF9yYXRlLCBiZXN0X3JhdGUpOworCWRldl9kYmcoZGV2LCAic3BlZWQgJWQvJWRcbiIsIHQtPnNwZWVkX2h6LCBiZXN0X3JhdGUpOwogCiAJaHNwaV93cml0ZShoc3BpLCBTUENSLCBzcGNyKTsKIAloc3BpX3dyaXRlKGhzcGksIFNQU1IsIDB4MCk7CkBAIC0yMzAsMjkgKzIyMyw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBoc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IGhzcGlfcHJpdiAqaHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGhzcGktPmRldjsKLQotCWlmICg4ICE9IHNwaS0+Yml0c19wZXJfd29yZCkgewotCQlkZXZfZXJyKGRldiwgImJpdHNfcGVyX3dvcmQgc2hvdWxkIGJlIDhcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlkZXZfZGJnKGRldiwgIiVzIHNldHVwXG4iLCBzcGktPm1vZGFsaWFzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBoc3BpX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgaHNwaV9wcml2ICpoc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaHNwaS0+ZGV2OwotCi0JZGV2X2RiZyhkZXYsICIlcyBjbGVhbnVwXG4iLCBzcGktPm1vZGFsaWFzKTsKLX0KLQogc3RhdGljIGludCBoc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CkBAIC0yOTgsMjIgKzI2OCwyMyBAQAogCiAJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CiAKLQltYXN0ZXItPm51bV9jaGlwc2VsZWN0CT0gMTsKIAltYXN0ZXItPmJ1c19udW0JCT0gcGRldi0+aWQ7Ci0JbWFzdGVyLT5zZXR1cAkJPSBoc3BpX3NldHVwOwotCW1hc3Rlci0+Y2xlYW51cAkJPSBoc3BpX2NsZWFudXA7CiAJbWFzdGVyLT5tb2RlX2JpdHMJPSBTUElfQ1BPTCB8IFNQSV9DUEhBOwogCW1hc3Rlci0+ZGV2Lm9mX25vZGUJPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAltYXN0ZXItPmF1dG9fcnVudGltZV9wbSA9IHRydWU7CiAJbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZQkJPSBoc3BpX3RyYW5zZmVyX29uZV9tZXNzYWdlOworCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19NQVNLKDgpOworCiAJcmV0ID0gZGV2bV9zcGlfcmVnaXN0ZXJfbWFzdGVyKCZwZGV2LT5kZXYsIG1hc3Rlcik7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAic3BpX3JlZ2lzdGVyX21hc3RlciBlcnJvci5cbiIpOwotCQlnb3RvIGVycm9yMTsKKwkJZ290byBlcnJvcjI7CiAJfQogCiAJcmV0dXJuIDA7CiAKKyBlcnJvcjI6CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwogIGVycm9yMToKIAljbGtfcHV0KGNsayk7CiAgZXJyb3IwOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXNoLW1zaW9mLmMgYi9kcml2ZXJzL3NwaS9zcGktc2gtbXNpb2YuYwppbmRleCA4MWNjMDJmLi5lODUwZDAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktc2gtbXNpb2YuYworKysgYi9kcml2ZXJzL3NwaS9zcGktc2gtbXNpb2YuYwpAQCAtMTUsNTkgKzE1LDEwOCBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCiAjaW5jbHVkZSA8bGludXgvc3BpL3NoX21zaW9mLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgogCiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCisKK3N0cnVjdCBzaF9tc2lvZl9jaGlwZGF0YSB7CisJdTE2IHR4X2ZpZm9fc2l6ZTsKKwl1MTYgcnhfZmlmb19zaXplOworCXUxNiBtYXN0ZXJfZmxhZ3M7Cit9OworCiBzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgewotCXN0cnVjdCBzcGlfYml0YmFuZyBiaXRiYW5nOyAvKiBtdXN0IGJlIGZpcnN0IGZvciBzcGlfYml0YmFuZy5jICovCiAJdm9pZCBfX2lvbWVtICptYXBiYXNlOwogCXN0cnVjdCBjbGsgKmNsazsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCWNvbnN0IHN0cnVjdCBzaF9tc2lvZl9jaGlwZGF0YSAqY2hpcGRhdGE7CiAJc3RydWN0IHNoX21zaW9mX3NwaV9pbmZvICppbmZvOwogCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgdHhfZmlmb19zaXplOwogCWludCByeF9maWZvX3NpemU7CiB9OwogCi0jZGVmaW5lIFRNRFIxCTB4MDAKLSNkZWZpbmUgVE1EUjIJMHgwNAotI2RlZmluZSBUTURSMwkweDA4Ci0jZGVmaW5lIFJNRFIxCTB4MTAKLSNkZWZpbmUgUk1EUjIJMHgxNAotI2RlZmluZSBSTURSMwkweDE4Ci0jZGVmaW5lIFRTQ1IJMHgyMAotI2RlZmluZSBSU0NSCTB4MjIKLSNkZWZpbmUgQ1RSCTB4MjgKLSNkZWZpbmUgRkNUUgkweDMwCi0jZGVmaW5lIFNUUgkweDQwCi0jZGVmaW5lIElFUgkweDQ0Ci0jZGVmaW5lIFREUjEJMHg0OAotI2RlZmluZSBURFIyCTB4NGMKLSNkZWZpbmUgVEZEUgkweDUwCi0jZGVmaW5lIFJEUjEJMHg1OAotI2RlZmluZSBSRFIyCTB4NWMKLSNkZWZpbmUgUkZEUgkweDYwCisjZGVmaW5lIFRNRFIxCTB4MDAJLyogVHJhbnNtaXQgTW9kZSBSZWdpc3RlciAxICovCisjZGVmaW5lIFRNRFIyCTB4MDQJLyogVHJhbnNtaXQgTW9kZSBSZWdpc3RlciAyICovCisjZGVmaW5lIFRNRFIzCTB4MDgJLyogVHJhbnNtaXQgTW9kZSBSZWdpc3RlciAzICovCisjZGVmaW5lIFJNRFIxCTB4MTAJLyogUmVjZWl2ZSBNb2RlIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgUk1EUjIJMHgxNAkvKiBSZWNlaXZlIE1vZGUgUmVnaXN0ZXIgMiAqLworI2RlZmluZSBSTURSMwkweDE4CS8qIFJlY2VpdmUgTW9kZSBSZWdpc3RlciAzICovCisjZGVmaW5lIFRTQ1IJMHgyMAkvKiBUcmFuc21pdCBDbG9jayBTZWxlY3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNDUgkweDIyCS8qIFJlY2VpdmUgQ2xvY2sgU2VsZWN0IFJlZ2lzdGVyIChTSCwgQTEsIEFQRTYpICovCisjZGVmaW5lIENUUgkweDI4CS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkNUUgkweDMwCS8qIEZJRk8gQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBTVFIJMHg0MAkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUVSCTB4NDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBURFIxCTB4NDgJLyogVHJhbnNtaXQgQ29udHJvbCBEYXRhIFJlZ2lzdGVyIDEgKFNILCBBMSkgKi8KKyNkZWZpbmUgVERSMgkweDRjCS8qIFRyYW5zbWl0IENvbnRyb2wgRGF0YSBSZWdpc3RlciAyIChTSCwgQTEpICovCisjZGVmaW5lIFRGRFIJMHg1MAkvKiBUcmFuc21pdCBGSUZPIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkRSMQkweDU4CS8qIFJlY2VpdmUgQ29udHJvbCBEYXRhIFJlZ2lzdGVyIDEgKFNILCBBMSkgKi8KKyNkZWZpbmUgUkRSMgkweDVjCS8qIFJlY2VpdmUgQ29udHJvbCBEYXRhIFJlZ2lzdGVyIDIgKFNILCBBMSkgKi8KKyNkZWZpbmUgUkZEUgkweDYwCS8qIFJlY2VpdmUgRklGTyBEYXRhIFJlZ2lzdGVyICovCiAKLSNkZWZpbmUgQ1RSX1RTQ0tFICgxIDw8IDE1KQotI2RlZmluZSBDVFJfVEZTRSAgKDEgPDwgMTQpCi0jZGVmaW5lIENUUl9UWEUgICAoMSA8PCA5KQotI2RlZmluZSBDVFJfUlhFICAgKDEgPDwgOCkKKy8qIFRNRFIxIGFuZCBSTURSMSAqLworI2RlZmluZSBNRFIxX1RSTUQJIDB4ODAwMDAwMDAgLyogVHJhbnNmZXIgTW9kZSAoMSA9IE1hc3RlciBtb2RlKSAqLworI2RlZmluZSBNRFIxX1NZTkNNRF9NQVNLIDB4MzAwMDAwMDAgLyogU1lOQyBNb2RlICovCisjZGVmaW5lIE1EUjFfU1lOQ01EX1NQSQkgMHgyMDAwMDAwMCAvKiAgIExldmVsIG1vZGUvU1BJICovCisjZGVmaW5lIE1EUjFfU1lOQ01EX0xSCSAweDMwMDAwMDAwIC8qICAgTC9SIG1vZGUgKi8KKyNkZWZpbmUgTURSMV9TWU5DQUNfU0hJRlQJIDI1IC8qIFN5bmMgUG9sYXJpdHkgKDEgPSBBY3RpdmUtbG93KSAqLworI2RlZmluZSBNRFIxX0JJVExTQl9TSElGVAkgMjQgLyogTVNCL0xTQiBGaXJzdCAoMSA9IExTQiBmaXJzdCkgKi8KKyNkZWZpbmUgTURSMV9GTERfTUFTSwkgMHgwMDAwMDBjMCAvKiBGcmFtZSBTeW5jIFNpZ25hbCBJbnRlcnZhbCAoMC0zKSAqLworI2RlZmluZSBNRFIxX0ZMRF9TSElGVAkJICAyCisjZGVmaW5lIE1EUjFfWFhTVFAJIDB4MDAwMDAwMDEgLyogVHJhbnNtaXNzaW9uL1JlY2VwdGlvbiBTdG9wIG9uIEZJRk8gKi8KKy8qIFRNRFIxICovCisjZGVmaW5lIFRNRFIxX1BDT04JIDB4NDAwMDAwMDAgLyogVHJhbnNmZXIgU2lnbmFsIENvbm5lY3Rpb24gKi8KIAotI2RlZmluZSBTVFJfVEVPRiAgKDEgPDwgMjMpCi0jZGVmaW5lIFNUUl9SRU9GICAoMSA8PCA3KQorLyogVE1EUjIgYW5kIFJNRFIyICovCisjZGVmaW5lIE1EUjJfQklUTEVOMShpKQkoKChpKSAtIDEpIDw8IDI0KSAvKiBEYXRhIFNpemUgKDgtMzIgYml0cykgKi8KKyNkZWZpbmUgTURSMl9XRExFTjEoaSkJKCgoaSkgLSAxKSA8PCAxNikgLyogV29yZCBDb3VudCAoMS02NC8yNTYgKFNILCBBMSkpKSAqLworI2RlZmluZSBNRFIyX0dSUE1BU0sxCTB4MDAwMDAwMDEgLyogR3JvdXAgT3V0cHV0IE1hc2sgMSAoU0gsIEExKSAqLworCisvKiBUU0NSIGFuZCBSU0NSICovCisjZGVmaW5lIFNDUl9CUlBTX01BU0sJICAgIDB4MWYwMCAvKiBQcmVzY2FsZXIgU2V0dGluZyAoMS0zMikgKi8KKyNkZWZpbmUgU0NSX0JSUFMoaSkJKCgoaSkgLSAxKSA8PCA4KQorI2RlZmluZSBTQ1JfQlJEVl9NQVNLCSAgICAweDAwMDcgLyogQmF1ZCBSYXRlIEdlbmVyYXRvcidzIERpdmlzaW9uIFJhdGlvICovCisjZGVmaW5lIFNDUl9CUkRWX0RJVl8yCSAgICAweDAwMDAKKyNkZWZpbmUgU0NSX0JSRFZfRElWXzQJICAgIDB4MDAwMQorI2RlZmluZSBTQ1JfQlJEVl9ESVZfOAkgICAgMHgwMDAyCisjZGVmaW5lIFNDUl9CUkRWX0RJVl8xNgkgICAgMHgwMDAzCisjZGVmaW5lIFNDUl9CUkRWX0RJVl8zMgkgICAgMHgwMDA0CisjZGVmaW5lIFNDUl9CUkRWX0RJVl8xCSAgICAweDAwMDcKKworLyogQ1RSICovCisjZGVmaW5lIENUUl9UU0NLSVpfTUFTSwkweGMwMDAwMDAwIC8qIFRyYW5zbWl0IENsb2NrIEkvTyBQb2xhcml0eSBTZWxlY3QgKi8KKyNkZWZpbmUgQ1RSX1RTQ0tJWl9TQ0sJMHg4MDAwMDAwMCAvKiAgIERpc2FibGUgU0NLIHdoZW4gVFggZGlzYWJsZWQgKi8KKyNkZWZpbmUgQ1RSX1RTQ0tJWl9QT0xfU0hJRlQJMzAgLyogICBUcmFuc21pdCBDbG9jayBQb2xhcml0eSAqLworI2RlZmluZSBDVFJfUlNDS0laX01BU0sJMHgzMDAwMDAwMCAvKiBSZWNlaXZlIENsb2NrIFBvbGFyaXR5IFNlbGVjdCAqLworI2RlZmluZSBDVFJfUlNDS0laX1NDSwkweDIwMDAwMDAwIC8qICAgTXVzdCBtYXRjaCBDVFJfVFNDS0laX1NDSyAqLworI2RlZmluZSBDVFJfUlNDS0laX1BPTF9TSElGVAkyOCAvKiAgIFJlY2VpdmUgQ2xvY2sgUG9sYXJpdHkgKi8KKyNkZWZpbmUgQ1RSX1RFREdfU0hJRlQJCTI3IC8qIFRyYW5zbWl0IFRpbWluZyAoMSA9IGZhbGxpbmcgZWRnZSkgKi8KKyNkZWZpbmUgQ1RSX1JFREdfU0hJRlQJCTI2IC8qIFJlY2VpdmUgVGltaW5nICgxID0gZmFsbGluZyBlZGdlKSAqLworI2RlZmluZSBDVFJfVFhESVpfTUFTSwkweDAwYzAwMDAwIC8qIFBpbiBPdXRwdXQgV2hlbiBUWCBpcyBEaXNhYmxlZCAqLworI2RlZmluZSBDVFJfVFhESVpfTE9XCTB4MDAwMDAwMDAgLyogICAwICovCisjZGVmaW5lIENUUl9UWERJWl9ISUdICTB4MDA0MDAwMDAgLyogICAxICovCisjZGVmaW5lIENUUl9UWERJWl9ISVoJMHgwMDgwMDAwMCAvKiAgIEhpZ2gtaW1wZWRhbmNlICovCisjZGVmaW5lIENUUl9UU0NLRQkweDAwMDA4MDAwIC8qIFRyYW5zbWl0IFNlcmlhbCBDbG9jayBPdXRwdXQgRW5hYmxlICovCisjZGVmaW5lIENUUl9URlNFCTB4MDAwMDQwMDAgLyogVHJhbnNtaXQgRnJhbWUgU3luYyBTaWduYWwgT3V0cHV0IEVuYWJsZSAqLworI2RlZmluZSBDVFJfVFhFCQkweDAwMDAwMjAwIC8qIFRyYW5zbWl0IEVuYWJsZSAqLworI2RlZmluZSBDVFJfUlhFCQkweDAwMDAwMTAwIC8qIFJlY2VpdmUgRW5hYmxlICovCisKKy8qIFNUUiBhbmQgSUVSICovCisjZGVmaW5lIFNUUl9URU9GCTB4MDA4MDAwMDAgLyogRnJhbWUgVHJhbnNtaXNzaW9uIEVuZCAqLworI2RlZmluZSBTVFJfUkVPRgkweDAwMDAwMDgwIC8qIEZyYW1lIFJlY2VwdGlvbiBFbmQgKi8KKwogCiBzdGF0aWMgdTMyIHNoX21zaW9mX3JlYWQoc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwLCBpbnQgcmVnX29mZnMpCiB7CkBAIC0xMzEsMjIgKzE4MCwyMSBAQAogCXVuc2lnbmVkIHNob3J0IGRpdjsKIAl1bnNpZ25lZCBzaG9ydCBzY3I7CiB9IGNvbnN0IHNoX21zaW9mX3NwaV9jbGtfdGFibGVbXSA9IHsKLQl7IDEsIDB4MDAwNyB9LAotCXsgMiwgMHgwMDAwIH0sCi0JeyA0LCAweDAwMDEgfSwKLQl7IDgsIDB4MDAwMiB9LAotCXsgMTYsIDB4MDAwMyB9LAotCXsgMzIsIDB4MDAwNCB9LAotCXsgNjQsIDB4MWYwMCB9LAotCXsgMTI4LCAweDFmMDEgfSwKLQl7IDI1NiwgMHgxZjAyIH0sCi0JeyA1MTIsIDB4MWYwMyB9LAotCXsgMTAyNCwgMHgxZjA0IH0sCisJeyAxLAlTQ1JfQlJQUyggMSkgfCBTQ1JfQlJEVl9ESVZfMSB9LAorCXsgMiwJU0NSX0JSUFMoIDEpIHwgU0NSX0JSRFZfRElWXzIgfSwKKwl7IDQsCVNDUl9CUlBTKCAxKSB8IFNDUl9CUkRWX0RJVl80IH0sCisJeyA4LAlTQ1JfQlJQUyggMSkgfCBTQ1JfQlJEVl9ESVZfOCB9LAorCXsgMTYsCVNDUl9CUlBTKCAxKSB8IFNDUl9CUkRWX0RJVl8xNiB9LAorCXsgMzIsCVNDUl9CUlBTKCAxKSB8IFNDUl9CUkRWX0RJVl8zMiB9LAorCXsgNjQsCVNDUl9CUlBTKDMyKSB8IFNDUl9CUkRWX0RJVl8yIH0sCisJeyAxMjgsCVNDUl9CUlBTKDMyKSB8IFNDUl9CUkRWX0RJVl80IH0sCisJeyAyNTYsCVNDUl9CUlBTKDMyKSB8IFNDUl9CUkRWX0RJVl84IH0sCisJeyA1MTIsCVNDUl9CUlBTKDMyKSB8IFNDUl9CUkRWX0RJVl8xNiB9LAorCXsgMTAyNCwJU0NSX0JSUFMoMzIpIHwgU0NSX0JSRFZfRElWXzMyIH0sCiB9OwogCiBzdGF0aWMgdm9pZCBzaF9tc2lvZl9zcGlfc2V0X2Nsa19yZWdzKHN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3BpX2h6KQorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUsIHUzMiBzcGlfaHopCiB7CiAJdW5zaWduZWQgbG9uZyBkaXYgPSAxMDI0OwogCXNpemVfdCBrOwpAQCAtMTY0LDcgKzIxMiw4IEBACiAJayA9IG1pbl90KGludCwgaywgQVJSQVlfU0laRShzaF9tc2lvZl9zcGlfY2xrX3RhYmxlKSAtIDEpOwogCiAJc2hfbXNpb2Zfd3JpdGUocCwgVFNDUiwgc2hfbXNpb2Zfc3BpX2Nsa190YWJsZVtrXS5zY3IpOwotCXNoX21zaW9mX3dyaXRlKHAsIFJTQ1IsIHNoX21zaW9mX3NwaV9jbGtfdGFibGVba10uc2NyKTsKKwlpZiAoIShwLT5jaGlwZGF0YS0+bWFzdGVyX2ZsYWdzICYgU1BJX01BU1RFUl9NVVNUX1RYKSkKKwkJc2hfbXNpb2Zfd3JpdGUocCwgUlNDUiwgc2hfbXNpb2Zfc3BpX2Nsa190YWJsZVtrXS5zY3IpOwogfQogCiBzdGF0aWMgdm9pZCBzaF9tc2lvZl9zcGlfc2V0X3Bpbl9yZWdzKHN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCwKQEAgLTE4MywyMSArMjMyLDI1IEBACiAJICovCiAJc2hfbXNpb2Zfd3JpdGUocCwgRkNUUiwgMCk7CiAKLQl0bXAgPSAwOwotCXRtcCB8PSAhY3NfaGlnaCA8PCAyNTsKLQl0bXAgfD0gbHNiX2ZpcnN0IDw8IDI0OwotCXNoX21zaW9mX3dyaXRlKHAsIFRNRFIxLCAweGUwMDAwMDA1IHwgdG1wKTsKLQlzaF9tc2lvZl93cml0ZShwLCBSTURSMSwgMHgyMDAwMDAwNSB8IHRtcCk7CisJdG1wID0gTURSMV9TWU5DTURfU1BJIHwgMSA8PCBNRFIxX0ZMRF9TSElGVCB8IE1EUjFfWFhTVFA7CisJdG1wIHw9ICFjc19oaWdoIDw8IE1EUjFfU1lOQ0FDX1NISUZUOworCXRtcCB8PSBsc2JfZmlyc3QgPDwgTURSMV9CSVRMU0JfU0hJRlQ7CisJc2hfbXNpb2Zfd3JpdGUocCwgVE1EUjEsIHRtcCB8IE1EUjFfVFJNRCB8IFRNRFIxX1BDT04pOworCWlmIChwLT5jaGlwZGF0YS0+bWFzdGVyX2ZsYWdzICYgU1BJX01BU1RFUl9NVVNUX1RYKSB7CisJCS8qIFRoZXNlIGJpdHMgYXJlIHJlc2VydmVkIGlmIFJYIG5lZWRzIFRYICovCisJCXRtcCAmPSB+MHgwMDAwZmZmZjsKKwl9CisJc2hfbXNpb2Zfd3JpdGUocCwgUk1EUjEsIHRtcCk7CiAKLQl0bXAgPSAweGEwMDAwMDAwOwotCXRtcCB8PSBjcG9sIDw8IDMwOyAvKiBUU0NLSVogKi8KLQl0bXAgfD0gY3BvbCA8PCAyODsgLyogUlNDS0laICovCisJdG1wID0gMDsKKwl0bXAgfD0gQ1RSX1RTQ0tJWl9TQ0sgfCBjcG9sIDw8IENUUl9UU0NLSVpfUE9MX1NISUZUOworCXRtcCB8PSBDVFJfUlNDS0laX1NDSyB8IGNwb2wgPDwgQ1RSX1JTQ0tJWl9QT0xfU0hJRlQ7CiAKIAllZGdlID0gY3BvbCBeICFjcGhhOwogCi0JdG1wIHw9IGVkZ2UgPDwgMjc7IC8qIFRFREcgKi8KLQl0bXAgfD0gZWRnZSA8PCAyNjsgLyogUkVERyAqLwotCXRtcCB8PSAodHhfaGlfeiA/IDIgOiAwKSA8PCAyMjsgLyogVFhESVogKi8KKwl0bXAgfD0gZWRnZSA8PCBDVFJfVEVER19TSElGVDsKKwl0bXAgfD0gZWRnZSA8PCBDVFJfUkVER19TSElGVDsKKwl0bXAgfD0gdHhfaGlfeiA/IENUUl9UWERJWl9ISVogOiBDVFJfVFhESVpfTE9XOwogCXNoX21zaW9mX3dyaXRlKHAsIENUUiwgdG1wKTsKIH0KIApAQCAtMjA1LDEyICsyNTgsMTIgQEAKIAkJCQkgICAgICAgY29uc3Qgdm9pZCAqdHhfYnVmLCB2b2lkICpyeF9idWYsCiAJCQkJICAgICAgIHUzMiBiaXRzLCB1MzIgd29yZHMpCiB7Ci0JdTMyIGRyMiA9ICgoYml0cyAtIDEpIDw8IDI0KSB8ICgod29yZHMgLSAxKSA8PCAxNik7CisJdTMyIGRyMiA9IE1EUjJfQklUTEVOMShiaXRzKSB8IE1EUjJfV0RMRU4xKHdvcmRzKTsKIAotCWlmICh0eF9idWYpCisJaWYgKHR4X2J1ZiB8fCAocC0+Y2hpcGRhdGEtPm1hc3Rlcl9mbGFncyAmIFNQSV9NQVNURVJfTVVTVF9UWCkpCiAJCXNoX21zaW9mX3dyaXRlKHAsIFRNRFIyLCBkcjIpOwogCWVsc2UKLQkJc2hfbXNpb2Zfd3JpdGUocCwgVE1EUjIsIGRyMiB8IDEpOworCQlzaF9tc2lvZl93cml0ZShwLCBUTURSMiwgZHIyIHwgTURSMl9HUlBNQVNLMSk7CiAKIAlpZiAocnhfYnVmKQogCQlzaF9tc2lvZl93cml0ZShwLCBSTURSMiwgZHIyKTsKQEAgLTM2Myw3NyArNDE2LDQ1IEBACiAJCXB1dF91bmFsaWduZWQoc3dhYjMyKHNoX21zaW9mX3JlYWQocCwgUkZEUikgPj4gZnMpLCAmYnVmXzMyW2tdKTsKIH0KIAotc3RhdGljIGludCBzaF9tc2lvZl9zcGlfYml0cyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQorc3RhdGljIGludCBzaF9tc2lvZl9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlpbnQgYml0czsKLQotCWJpdHMgPSB0ID8gdC0+Yml0c19wZXJfd29yZCA6IDA7Ci0JaWYgKCFiaXRzKQotCQliaXRzID0gc3BpLT5iaXRzX3Blcl93b3JkOwotCXJldHVybiBiaXRzOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzaF9tc2lvZl9zcGlfaHooc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCQkgICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCi17Ci0JdW5zaWduZWQgbG9uZyBoejsKLQotCWh6ID0gdCA/IHQtPnNwZWVkX2h6IDogMDsKLQlpZiAoIWh6KQotCQloeiA9IHNwaS0+bWF4X3NwZWVkX2h6OwotCXJldHVybiBoejsKLX0KLQotc3RhdGljIGludCBzaF9tc2lvZl9zcGlfc2V0dXBfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCQkgICAgICAgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKLXsKLQlpbnQgYml0czsKLQotCS8qIG5vdGluZyB0byBjaGVjayBoeiB2YWx1ZXMgYWdhaW5zdCBzaW5jZSBwYXJlbnQgY2xvY2sgaXMgZGlzYWJsZWQgKi8KLQotCWJpdHMgPSBzaF9tc2lvZl9zcGlfYml0cyhzcGksIHQpOwotCWlmIChiaXRzIDwgOCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGJpdHMgPiAzMikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gc3BpX2JpdGJhbmdfc2V0dXBfdHJhbnNmZXIoc3BpLCB0KTsKLX0KLQotc3RhdGljIHZvaWQgc2hfbXNpb2Zfc3BpX2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX29uKQoteworCXN0cnVjdCBkZXZpY2Vfbm9kZQkqbnAgPSBzcGktPm1hc3Rlci0+ZGV2Lm9mX25vZGU7CiAJc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0JaW50IHZhbHVlOwogCi0JLyogY2hpcCBzZWxlY3QgaXMgYWN0aXZlIGxvdyB1bmxlc3MgU1BJX0NTX0hJR0ggaXMgc2V0ICovCi0JaWYgKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKQotCQl2YWx1ZSA9IChpc19vbiA9PSBCSVRCQU5HX0NTX0FDVElWRSkgPyAxIDogMDsKLQllbHNlCi0JCXZhbHVlID0gKGlzX29uID09IEJJVEJBTkdfQ1NfQUNUSVZFKSA/IDAgOiAxOwotCi0JaWYgKGlzX29uID09IEJJVEJBTkdfQ1NfQUNUSVZFKSB7Ci0JCWlmICghdGVzdF9hbmRfc2V0X2JpdCgwLCAmcC0+ZmxhZ3MpKSB7Ci0JCQlwbV9ydW50aW1lX2dldF9zeW5jKCZwLT5wZGV2LT5kZXYpOwotCQkJY2xrX2VuYWJsZShwLT5jbGspOwotCQl9Ci0KLQkJLyogQ29uZmlndXJlIHBpbnMgYmVmb3JlIGFzc2VydGluZyBDUyAqLwotCQlzaF9tc2lvZl9zcGlfc2V0X3Bpbl9yZWdzKHAsICEhKHNwaS0+bW9kZSAmIFNQSV9DUE9MKSwKLQkJCQkJICAhIShzcGktPm1vZGUgJiBTUElfQ1BIQSksCi0JCQkJCSAgISEoc3BpLT5tb2RlICYgU1BJXzNXSVJFKSwKLQkJCQkJICAhIShzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUKSwKLQkJCQkJICAhIShzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkpOworCWlmICghbnApIHsKKwkJLyoKKwkJICogVXNlIHNwaS0+Y29udHJvbGxlcl9kYXRhIGZvciBDUyAoc2FtZSBzdHJhdGVneSBhcyBzcGlfZ3BpbyksCisJCSAqIGlmIGFueS4gb3RoZXJ3aXNlIGxldCBIVyBjb250cm9sIENTCisJCSAqLworCQlzcGktPmNzX2dwaW8gPSAodWludHB0cl90KXNwaS0+Y29udHJvbGxlcl9kYXRhOwogCX0KIAotCS8qIHVzZSBzcGktPmNvbnRyb2xsZXIgZGF0YSBmb3IgQ1MgKHNhbWUgc3RyYXRlZ3kgYXMgc3BpX2dwaW8pICovCi0JZ3Bpb19zZXRfdmFsdWUoKHVpbnRwdHJfdClzcGktPmNvbnRyb2xsZXJfZGF0YSwgdmFsdWUpOworCS8qIENvbmZpZ3VyZSBwaW5zIGJlZm9yZSBkZWFzc2VydGluZyBDUyAqLworCXNoX21zaW9mX3NwaV9zZXRfcGluX3JlZ3MocCwgISEoc3BpLT5tb2RlICYgU1BJX0NQT0wpLAorCQkJCSAgISEoc3BpLT5tb2RlICYgU1BJX0NQSEEpLAorCQkJCSAgISEoc3BpLT5tb2RlICYgU1BJXzNXSVJFKSwKKwkJCQkgICEhKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpLAorCQkJCSAgISEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKTsKIAotCWlmIChpc19vbiA9PSBCSVRCQU5HX0NTX0lOQUNUSVZFKSB7Ci0JCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJnAtPmZsYWdzKSkgewotCQkJY2xrX2Rpc2FibGUocC0+Y2xrKTsKLQkJCXBtX3J1bnRpbWVfcHV0KCZwLT5wZGV2LT5kZXYpOwotCQl9Ci0JfQorCWlmIChzcGktPmNzX2dwaW8gPj0gMCkKKwkJZ3Bpb19zZXRfdmFsdWUoc3BpLT5jc19ncGlvLCAhKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaF9tc2lvZl9wcmVwYXJlX21lc3NhZ2Uoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKKwkJCQkgICAgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCit7CisJc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBtc2ctPnNwaTsKKworCS8qIENvbmZpZ3VyZSBwaW5zIGJlZm9yZSBhc3NlcnRpbmcgQ1MgKi8KKwlzaF9tc2lvZl9zcGlfc2V0X3Bpbl9yZWdzKHAsICEhKHNwaS0+bW9kZSAmIFNQSV9DUE9MKSwKKwkJCQkgICEhKHNwaS0+bW9kZSAmIFNQSV9DUEhBKSwKKwkJCQkgICEhKHNwaS0+bW9kZSAmIFNQSV8zV0lSRSksCisJCQkJICAhIShzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUKSwKKwkJCQkgICEhKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc2hfbXNpb2Zfc3BpX3R4cnhfb25jZShzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKnAsCkBAIC00ODcsNyArNTA4LDcgQEAKIAkvKiBjbGVhciBzdGF0dXMgYml0cyAqLwogCXNoX21zaW9mX3Jlc2V0X3N0cihwKTsKIAotCS8qIHNodXQgZG93biBmcmFtZSwgdHgvdHggYW5kIGNsb2NrIHNpZ25hbHMgKi8KKwkvKiBzaHV0IGRvd24gZnJhbWUsIHJ4L3R4IGFuZCBjbG9jayBzaWduYWxzICovCiAJcmV0ID0gc2hfbXNpb2ZfbW9kaWZ5X2N0cl93YWl0KHAsIENUUl9URlNFLCAwKTsKIAlyZXQgPSByZXQgPyByZXQgOiBzaF9tc2lvZl9tb2RpZnlfY3RyX3dhaXQocCwgQ1RSX1RYRSwgMCk7CiAJaWYgKHJ4X2J1ZikKQEAgLTUwNSw5ICs1MjYsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHNoX21zaW9mX3NwaV90eHJ4KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCitzdGF0aWMgaW50IHNoX21zaW9mX3RyYW5zZmVyX29uZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCSBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCSBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQogewotCXN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAl2b2lkICgqdHhfZmlmbykoc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICosIGNvbnN0IHZvaWQgKiwgaW50LCBpbnQpOwogCXZvaWQgKCpyeF9maWZvKShzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKiwgdm9pZCAqLCBpbnQsIGludCk7CiAJaW50IGJpdHM7CkBAIC01MTcsNyArNTQwLDcgQEAKIAlpbnQgbjsKIAlib29sIHN3YWI7CiAKLQliaXRzID0gc2hfbXNpb2Zfc3BpX2JpdHMoc3BpLCB0KTsKKwliaXRzID0gdC0+Yml0c19wZXJfd29yZDsKIAogCWlmIChiaXRzIDw9IDggJiYgdC0+bGVuID4gMTUgJiYgISh0LT5sZW4gJiAzKSkgewogCQliaXRzID0gMzI7CkBAIC01NjcsOCArNTkwLDcgQEAKIAl9CiAKIAkvKiBzZXR1cCBjbG9ja3MgKGNsb2NrIGFscmVhZHkgZW5hYmxlZCBpbiBjaGlwc2VsZWN0KCkpICovCi0Jc2hfbXNpb2Zfc3BpX3NldF9jbGtfcmVncyhwLCBjbGtfZ2V0X3JhdGUocC0+Y2xrKSwKLQkJCQkgIHNoX21zaW9mX3NwaV9oeihzcGksIHQpKTsKKwlzaF9tc2lvZl9zcGlfc2V0X2Nsa19yZWdzKHAsIGNsa19nZXRfcmF0ZShwLT5jbGspLCB0LT5zcGVlZF9oeik7CiAKIAkvKiB0cmFuc2ZlciBpbiBmaWZvIHNpemVkIGNodW5rcyAqLwogCXdvcmRzID0gdC0+bGVuIC8gYnl0ZXNfcGVyX3dvcmQ7CkBAIC01ODgsMjIgKzYxMCwzNiBAQAogCQl3b3JkcyAtPSBuOwogCX0KIAotCXJldHVybiBieXRlc19kb25lOwotfQotCi1zdGF0aWMgdTMyIHNoX21zaW9mX3NwaV90eHJ4X3dvcmQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdW5zaWduZWQgbnNlY3MsCi0JCQkJICB1MzIgd29yZCwgdTggYml0cykKLXsKLQlCVUcoKTsgLyogdW51c2VkIGJ1dCBuZWVkZWQgYnkgYml0YmFuZyBjb2RlICovCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbXNpb2ZfY2hpcGRhdGEgc2hfZGF0YSA9IHsKKwkudHhfZmlmb19zaXplID0gNjQsCisJLnJ4X2ZpZm9fc2l6ZSA9IDY0LAorCS5tYXN0ZXJfZmxhZ3MgPSAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9tc2lvZl9jaGlwZGF0YSByOGE3Nzl4X2RhdGEgPSB7CisJLnR4X2ZpZm9fc2l6ZSA9IDY0LAorCS5yeF9maWZvX3NpemUgPSAyNTYsCisJLm1hc3Rlcl9mbGFncyA9IFNQSV9NQVNURVJfTVVTVF9UWCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNoX21zaW9mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHNoLW1zaW9mIiwgICAgICAgIC5kYXRhID0gJnNoX2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsc2gtbW9iaWxlLW1zaW9mIiwgLmRhdGEgPSAmc2hfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxtc2lvZi1yOGE3NzkwIiwgICAuZGF0YSA9ICZyOGE3Nzl4X2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsbXNpb2YtcjhhNzc5MSIsICAgLmRhdGEgPSAmcjhhNzc5eF9kYXRhIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc2hfbXNpb2ZfbWF0Y2gpOworCiAjaWZkZWYgQ09ORklHX09GCiBzdGF0aWMgc3RydWN0IHNoX21zaW9mX3NwaV9pbmZvICpzaF9tc2lvZl9zcGlfcGFyc2VfZHQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBzaF9tc2lvZl9zcGlfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOwotCXUzMiBudW1fY3MgPSAwOworCXUzMiBudW1fY3MgPSAxOwogCiAJaW5mbyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX2luZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluZm8pIHsKQEAgLTYzMyw2ICs2NjksNyBAQAogewogCXN0cnVjdCByZXNvdXJjZQkqcjsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOwogCXN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcDsKIAlpbnQgaTsKIAlpbnQgcmV0OwpAQCAtNjQ2LDEwICs2ODMsMTUgQEAKIAlwID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcCk7Ci0JaWYgKHBkZXYtPmRldi5vZl9ub2RlKQorCisJb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2Uoc2hfbXNpb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOworCWlmIChvZl9pZCkgeworCQlwLT5jaGlwZGF0YSA9IG9mX2lkLT5kYXRhOwogCQlwLT5pbmZvID0gc2hfbXNpb2Zfc3BpX3BhcnNlX2R0KCZwZGV2LT5kZXYpOwotCWVsc2UKKwl9IGVsc2UgeworCQlwLT5jaGlwZGF0YSA9IChjb25zdCB2b2lkICopcGRldi0+aWRfZW50cnktPmRyaXZlcl9kYXRhOwogCQlwLT5pbmZvID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwl9CiAKIAlpZiAoIXAtPmluZm8pIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIG9idGFpbiBkZXZpY2UgaW5mb1xuIik7CkBAIC02ODcsNDkgKzcyOSw0MCBAQAogCQlnb3RvIGVycjE7CiAJfQogCi0JcmV0ID0gY2xrX3ByZXBhcmUocC0+Y2xrKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gcHJlcGFyZSBjbG9ja1xuIik7Ci0JCWdvdG8gZXJyMTsKLQl9Ci0KIAlwLT5wZGV2ID0gcGRldjsKIAlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKIAotCS8qIFRoZSBzdGFuZGFyZCB2ZXJzaW9uIG9mIE1TSU9GIHVzZSA2NCB3b3JkIEZJRk9zICovCi0JcC0+dHhfZmlmb19zaXplID0gNjQ7Ci0JcC0+cnhfZmlmb19zaXplID0gNjQ7Ci0KIAkvKiBQbGF0Zm9ybSBkYXRhIG1heSBvdmVycmlkZSBGSUZPIHNpemVzICovCisJcC0+dHhfZmlmb19zaXplID0gcC0+Y2hpcGRhdGEtPnR4X2ZpZm9fc2l6ZTsKKwlwLT5yeF9maWZvX3NpemUgPSBwLT5jaGlwZGF0YS0+cnhfZmlmb19zaXplOwogCWlmIChwLT5pbmZvLT50eF9maWZvX292ZXJyaWRlKQogCQlwLT50eF9maWZvX3NpemUgPSBwLT5pbmZvLT50eF9maWZvX292ZXJyaWRlOwogCWlmIChwLT5pbmZvLT5yeF9maWZvX292ZXJyaWRlKQogCQlwLT5yeF9maWZvX3NpemUgPSBwLT5pbmZvLT5yeF9maWZvX292ZXJyaWRlOwogCi0JLyogaW5pdCBtYXN0ZXIgYW5kIGJpdGJhbmcgY29kZSAqLworCS8qIGluaXQgbWFzdGVyIGNvZGUgKi8KIAltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSDsKIAltYXN0ZXItPm1vZGVfYml0cyB8PSBTUElfTFNCX0ZJUlNUIHwgU1BJXzNXSVJFOwotCW1hc3Rlci0+ZmxhZ3MgPSAwOworCW1hc3Rlci0+ZmxhZ3MgPSBwLT5jaGlwZGF0YS0+bWFzdGVyX2ZsYWdzOwogCW1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmlkOworCW1hc3Rlci0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gcC0+aW5mby0+bnVtX2NoaXBzZWxlY3Q7Ci0JbWFzdGVyLT5zZXR1cCA9IHNwaV9iaXRiYW5nX3NldHVwOwotCW1hc3Rlci0+Y2xlYW51cCA9IHNwaV9iaXRiYW5nX2NsZWFudXA7CisJbWFzdGVyLT5zZXR1cCA9IHNoX21zaW9mX3NwaV9zZXR1cDsKKwltYXN0ZXItPnByZXBhcmVfbWVzc2FnZSA9IHNoX21zaW9mX3ByZXBhcmVfbWVzc2FnZTsKKwltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfUkFOR0VfTUFTSyg4LCAzMik7CisJbWFzdGVyLT5hdXRvX3J1bnRpbWVfcG0gPSB0cnVlOworCW1hc3Rlci0+dHJhbnNmZXJfb25lID0gc2hfbXNpb2ZfdHJhbnNmZXJfb25lOwogCi0JcC0+Yml0YmFuZy5tYXN0ZXIgPSBtYXN0ZXI7Ci0JcC0+Yml0YmFuZy5jaGlwc2VsZWN0ID0gc2hfbXNpb2Zfc3BpX2NoaXBzZWxlY3Q7Ci0JcC0+Yml0YmFuZy5zZXR1cF90cmFuc2ZlciA9IHNoX21zaW9mX3NwaV9zZXR1cF90cmFuc2ZlcjsKLQlwLT5iaXRiYW5nLnR4cnhfYnVmcyA9IHNoX21zaW9mX3NwaV90eHJ4OwotCXAtPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzBdID0gc2hfbXNpb2Zfc3BpX3R4cnhfd29yZDsKLQlwLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8xXSA9IHNoX21zaW9mX3NwaV90eHJ4X3dvcmQ7Ci0JcC0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMl0gPSBzaF9tc2lvZl9zcGlfdHhyeF93b3JkOwotCXAtPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzNdID0gc2hfbXNpb2Zfc3BpX3R4cnhfd29yZDsKKwlyZXQgPSBkZXZtX3NwaV9yZWdpc3Rlcl9tYXN0ZXIoJnBkZXYtPmRldiwgbWFzdGVyKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzcGlfcmVnaXN0ZXJfbWFzdGVyIGVycm9yLlxuIik7CisJCWdvdG8gZXJyMjsKKwl9CiAKLQlyZXQgPSBzcGlfYml0YmFuZ19zdGFydCgmcC0+Yml0YmFuZyk7Ci0JaWYgKHJldCA9PSAwKQotCQlyZXR1cm4gMDsKKwlyZXR1cm4gMDsKIAorIGVycjI6CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwotCWNsa191bnByZXBhcmUocC0+Y2xrKTsKICBlcnIxOgogCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CiAJcmV0dXJuIHJldDsKQEAgLTczNywzMCArNzcwLDIyIEBACiAKIHN0YXRpYyBpbnQgc2hfbXNpb2Zfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzcGlfYml0YmFuZ19zdG9wKCZwLT5iaXRiYW5nKTsKLQlpZiAoIXJldCkgewotCQlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7Ci0JCWNsa191bnByZXBhcmUocC0+Y2xrKTsKLQkJc3BpX21hc3Rlcl9wdXQocC0+Yml0YmFuZy5tYXN0ZXIpOwotCX0KLQlyZXR1cm4gcmV0OworCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKwlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19PRgotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc2hfbXNpb2ZfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsc2gtbXNpb2YiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzaC1tb2JpbGUtbXNpb2YiLCB9LAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgc3BpX2RyaXZlcl9pZHNbXSA9IHsKKwl7ICJzcGlfc2hfbXNpb2YiLAkoa2VybmVsX3Vsb25nX3QpJnNoX2RhdGEgfSwKKwl7ICJzcGlfcjhhNzc5MF9tc2lvZiIsCShrZXJuZWxfdWxvbmdfdCkmcjhhNzc5eF9kYXRhIH0sCisJeyAic3BpX3I4YTc3OTFfbXNpb2YiLAkoa2VybmVsX3Vsb25nX3QpJnI4YTc3OXhfZGF0YSB9LAogCXt9LAogfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNoX21zaW9mX21hdGNoKTsKLSNlbmRpZgorTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgc3BpX2RyaXZlcl9pZHMpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzaF9tc2lvZl9zcGlfZHJ2ID0gewogCS5wcm9iZQkJPSBzaF9tc2lvZl9zcGlfcHJvYmUsCiAJLnJlbW92ZQkJPSBzaF9tc2lvZl9zcGlfcmVtb3ZlLAorCS5pZF90YWJsZQk9IHNwaV9kcml2ZXJfaWRzLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQkJPSAic3BpX3NoX21zaW9mIiwKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXNoLXNjaS5jIGIvZHJpdmVycy9zcGkvc3BpLXNoLXNjaS5jCmluZGV4IDM4ZWIyNGQuLjhiNDRiNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1zaC1zY2kuYworKysgYi9kcml2ZXJzL3NwaS9zcGktc2gtc2NpLmMKQEAgLTE0LDcgKzE0LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KQEAgLTEwOSw3ICsxMDgsNyBAQAogewogCXN0cnVjdCBzaF9zY2lfc3BpICpzcCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoZGV2LT5tYXN0ZXIpOwogCi0JaWYgKHNwLT5pbmZvICYmIHNwLT5pbmZvLT5jaGlwX3NlbGVjdCkKKwlpZiAoc3AtPmluZm8tPmNoaXBfc2VsZWN0KQogCQkoc3AtPmluZm8tPmNoaXBfc2VsZWN0KShzcC0+aW5mbywgZGV2LT5jaGlwX3NlbGVjdCwgdmFsdWUpOwogfQogCkBAIC0xMzEsNiArMTMwLDExIEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIHNwKTsKIAlzcC0+aW5mbyA9IGRldl9nZXRfcGxhdGRhdGEoJmRldi0+ZGV2KTsKKwlpZiAoIXNwLT5pbmZvKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAicGxhdGZvcm0gZGF0YSBpcyBtaXNzaW5nXG4iKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBlcnIxOworCX0KIAogCS8qIHNldHVwIHNwaSBiaXRiYW5nIGFkYXB0b3IgKi8KIAlzcC0+Yml0YmFuZy5tYXN0ZXIgPSBtYXN0ZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktc2lyZi5jIGIvZHJpdmVycy9zcGkvc3BpLXNpcmYuYwppbmRleCBlNDMwNjg5Li4xYTc3YWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktc2lyZi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zaXJmLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtZGlyZWN0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9zaXJmc29jX2RtYS5oPgogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJzaXJmc29jX3NwaSIKIApAQCAtMTMyLDYgKzEzMSw4IEBACiAjZGVmaW5lIElTX0RNQV9WQUxJRCh4KSAoeCAmJiBBTElHTkVEKHgtPnR4X2J1ZikgJiYgQUxJR05FRCh4LT5yeF9idWYpICYmIFwKIAlBTElHTkVEKHgtPmxlbikgJiYgKHgtPmxlbiA8IDIgKiBQQUdFX1NJWkUpKQogCisjZGVmaW5lIFNJUkZTT0NfTUFYX0NNRF9CWVRFUwk0CisKIHN0cnVjdCBzaXJmc29jX3NwaSB7CiAJc3RydWN0IHNwaV9iaXRiYW5nIGJpdGJhbmc7CiAJc3RydWN0IGNvbXBsZXRpb24gcnhfZG9uZTsKQEAgLTE2Miw2ICsxNjMsMTIgQEAKIAl2b2lkICpkdW1teXBhZ2U7CiAJaW50IHdvcmRfd2lkdGg7IC8qIGluIGJ5dGVzICovCiAKKwkvKgorCSAqIGlmIHR4IHNpemUgaXMgbm90IG1vcmUgdGhhbiA0IGFuZCByeCBzaXplIGlzIE5VTEwsIHVzZQorCSAqIGNvbW1hbmQgbW9kZWwKKwkgKi8KKwlib29sCXR4X2J5X2NtZDsKKwogCWludCBjaGlwc2VsZWN0WzBdOwogfTsKIApAQCAtMjYwLDYgKzI2NywxMiBAQAogCiAJd3JpdGVsKHNwaV9zdGF0LCBzc3BpLT5iYXNlICsgU0lSRlNPQ19TUElfSU5UX1NUQVRVUyk7CiAKKwlpZiAoc3NwaS0+dHhfYnlfY21kICYmIChzcGlfc3RhdCAmIFNJUkZTT0NfU1BJX0ZSTV9FTkQpKSB7CisJCWNvbXBsZXRlKCZzc3BpLT50eF9kb25lKTsKKwkJd3JpdGVsKDB4MCwgc3NwaS0+YmFzZSArIFNJUkZTT0NfU1BJX0lOVF9FTik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKIAkvKiBFcnJvciBDb25kaXRpb25zICovCiAJaWYgKHNwaV9zdGF0ICYgU0lSRlNPQ19TUElfUlhfT0ZMT1cgfHwKIAkJCXNwaV9zdGF0ICYgU0lSRlNPQ19TUElfVFhfVUZMT1cpIHsKQEAgLTMxMCw2ICszMjMsMzQgQEAKIAogCXdyaXRlbChTSVJGU09DX1NQSV9JTlRfTUFTS19BTEwsIHNzcGktPmJhc2UgKyBTSVJGU09DX1NQSV9JTlRfU1RBVFVTKTsKIAorCS8qCisJICogZmlsbCB0eF9idWYgaW50byBjb21tYW5kIHJlZ2lzdGVyIGFuZCB3YWl0IGZvciBpdHMgY29tcGxldGlvbgorCSAqLworCWlmIChzc3BpLT50eF9ieV9jbWQpIHsKKwkJdTMyIGNtZDsKKwkJbWVtY3B5KCZjbWQsIHNzcGktPnR4LCB0LT5sZW4pOworCisJCWlmIChzc3BpLT53b3JkX3dpZHRoID09IDEgJiYgIShzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUKSkKKwkJCWNtZCA9IGNwdV90b19iZTMyKGNtZCkgPj4KKwkJCQkoKFNJUkZTT0NfTUFYX0NNRF9CWVRFUyAtIHQtPmxlbikgKiA4KTsKKwkJaWYgKHNzcGktPndvcmRfd2lkdGggPT0gMiAmJiB0LT5sZW4gPT0gNCAmJgorCQkJCSghKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpKSkKKwkJCWNtZCA9ICgoY21kICYgMHhmZmZmKSA8PCAxNikgfCAoY21kID4+IDE2KTsKKworCQl3cml0ZWwoY21kLCBzc3BpLT5iYXNlICsgU0lSRlNPQ19TUElfQ01EKTsKKwkJd3JpdGVsKFNJUkZTT0NfU1BJX0ZSTV9FTkRfSU5UX0VOLAorCQkJc3NwaS0+YmFzZSArIFNJUkZTT0NfU1BJX0lOVF9FTik7CisJCXdyaXRlbChTSVJGU09DX1NQSV9DTURfVFhfRU4sCisJCQlzc3BpLT5iYXNlICsgU0lSRlNPQ19TUElfVFhfUlhfRU4pOworCisJCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnNzcGktPnR4X2RvbmUsIHRpbWVvdXQpID09IDApIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAidHJhbnNmZXIgdGltZW91dFxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXJldHVybiB0LT5sZW47CisJfQorCiAJaWYgKHNzcGktPmxlZnRfdHhfd29yZCA9PSAxKSB7CiAJCXdyaXRlbChyZWFkbChzc3BpLT5iYXNlICsgU0lSRlNPQ19TUElfQ1RSTCkgfAogCQkJU0lSRlNPQ19TUElfRU5BX0FVVE9fQ0xSLApAQCAtNDU5LDExICs1MDAsNiBAQAogCQlyZWd2YWwgfD0gU0lSRlNPQ19TUElfVFJBTl9EQVRfRk9STUFUXzg7CiAJCXNzcGktPnJ4X3dvcmQgPSBzcGlfc2lyZnNvY19yeF93b3JkX3U4OwogCQlzc3BpLT50eF93b3JkID0gc3BpX3NpcmZzb2NfdHhfd29yZF91ODsKLQkJdHhmaWZvX2N0cmwgPSBTSVJGU09DX1NQSV9GSUZPX1RIRChTSVJGU09DX1NQSV9GSUZPX1NJWkUgLyAyKSB8Ci0JCQkJCVNJUkZTT0NfU1BJX0ZJRk9fV0lEVEhfQllURTsKLQkJcnhmaWZvX2N0cmwgPSBTSVJGU09DX1NQSV9GSUZPX1RIRChTSVJGU09DX1NQSV9GSUZPX1NJWkUgLyAyKSB8Ci0JCQkJCVNJUkZTT0NfU1BJX0ZJRk9fV0lEVEhfQllURTsKLQkJc3NwaS0+d29yZF93aWR0aCA9IDE7CiAJCWJyZWFrOwogCWNhc2UgMTI6CiAJY2FzZSAxNjoKQEAgLTQ3MSwyNiArNTA3LDIyIEBACiAJCQlTSVJGU09DX1NQSV9UUkFOX0RBVF9GT1JNQVRfMTY7CiAJCXNzcGktPnJ4X3dvcmQgPSBzcGlfc2lyZnNvY19yeF93b3JkX3UxNjsKIAkJc3NwaS0+dHhfd29yZCA9IHNwaV9zaXJmc29jX3R4X3dvcmRfdTE2OwotCQl0eGZpZm9fY3RybCA9IFNJUkZTT0NfU1BJX0ZJRk9fVEhEKFNJUkZTT0NfU1BJX0ZJRk9fU0laRSAvIDIpIHwKLQkJCQkJU0lSRlNPQ19TUElfRklGT19XSURUSF9XT1JEOwotCQlyeGZpZm9fY3RybCA9IFNJUkZTT0NfU1BJX0ZJRk9fVEhEKFNJUkZTT0NfU1BJX0ZJRk9fU0laRSAvIDIpIHwKLQkJCQkJU0lSRlNPQ19TUElfRklGT19XSURUSF9XT1JEOwotCQlzc3BpLT53b3JkX3dpZHRoID0gMjsKIAkJYnJlYWs7CiAJY2FzZSAzMjoKIAkJcmVndmFsIHw9IFNJUkZTT0NfU1BJX1RSQU5fREFUX0ZPUk1BVF8zMjsKIAkJc3NwaS0+cnhfd29yZCA9IHNwaV9zaXJmc29jX3J4X3dvcmRfdTMyOwogCQlzc3BpLT50eF93b3JkID0gc3BpX3NpcmZzb2NfdHhfd29yZF91MzI7Ci0JCXR4Zmlmb19jdHJsID0gU0lSRlNPQ19TUElfRklGT19USEQoU0lSRlNPQ19TUElfRklGT19TSVpFIC8gMikgfAotCQkJCQlTSVJGU09DX1NQSV9GSUZPX1dJRFRIX0RXT1JEOwotCQlyeGZpZm9fY3RybCA9IFNJUkZTT0NfU1BJX0ZJRk9fVEhEKFNJUkZTT0NfU1BJX0ZJRk9fU0laRSAvIDIpIHwKLQkJCQkJU0lSRlNPQ19TUElfRklGT19XSURUSF9EV09SRDsKLQkJc3NwaS0+d29yZF93aWR0aCA9IDQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KIAorCXNzcGktPndvcmRfd2lkdGggPSBESVZfUk9VTkRfVVAoYml0c19wZXJfd29yZCwgOCk7CisJdHhmaWZvX2N0cmwgPSBTSVJGU09DX1NQSV9GSUZPX1RIRChTSVJGU09DX1NQSV9GSUZPX1NJWkUgLyAyKSB8CisJCQkJCSAgIHNzcGktPndvcmRfd2lkdGg7CisJcnhmaWZvX2N0cmwgPSBTSVJGU09DX1NQSV9GSUZPX1RIRChTSVJGU09DX1NQSV9GSUZPX1NJWkUgLyAyKSB8CisJCQkJCSAgIHNzcGktPndvcmRfd2lkdGg7CisKIAlpZiAoIShzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkpCiAJCXJlZ3ZhbCB8PSBTSVJGU09DX1NQSV9DU19JRExFX1NUQVQ7CiAJaWYgKCEoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkpCkBAIC01MTksNiArNTUxLDE0IEBACiAJd3JpdGVsKHR4Zmlmb19jdHJsLCBzc3BpLT5iYXNlICsgU0lSRlNPQ19TUElfVFhGSUZPX0NUUkwpOwogCXdyaXRlbChyeGZpZm9fY3RybCwgc3NwaS0+YmFzZSArIFNJUkZTT0NfU1BJX1JYRklGT19DVFJMKTsKIAorCWlmICh0ICYmIHQtPnR4X2J1ZiAmJiAhdC0+cnhfYnVmICYmICh0LT5sZW4gPD0gU0lSRlNPQ19NQVhfQ01EX0JZVEVTKSkgeworCQlyZWd2YWwgfD0gKFNJUkZTT0NfU1BJX0NNRF9CWVRFX05VTSgodC0+bGVuIC0gMSkpIHwKKwkJCQlTSVJGU09DX1NQSV9DTURfTU9ERSk7CisJCXNzcGktPnR4X2J5X2NtZCA9IHRydWU7CisJfSBlbHNlIHsKKwkJcmVndmFsICY9IH5TSVJGU09DX1NQSV9DTURfTU9ERTsKKwkJc3NwaS0+dHhfYnlfY21kID0gZmFsc2U7CisJfQogCXdyaXRlbChyZWd2YWwsIHNzcGktPmJhc2UgKyBTSVJGU09DX1NQSV9DVFJMKTsKIAogCWlmIChJU19ETUFfVkFMSUQodCkpIHsKQEAgLTU0OCw4ICs1ODgsNiBAQAogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CiAJc3RydWN0IHJlc291cmNlICptZW1fcmVzOwogCWludCBudW1fY3MsIGNzX2dwaW8sIGlycTsKLQl1MzIgcnhfZG1hX2NoLCB0eF9kbWFfY2g7Ci0JZG1hX2NhcF9tYXNrX3QgZG1hX2NhcF9tYXNrOwogCWludCBpOwogCWludCByZXQ7CiAKQEAgLTU2MCwyMCArNTk4LDYgQEAKIAkJZ290byBlcnJfY3M7CiAJfQogCi0JcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkic2lyZixzcGktZG1hLXJ4LWNoYW5uZWwiLCAmcnhfZG1hX2NoKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gZ2V0IHJ4IGRtYSBjaGFubmVsXG4iKTsKLQkJZ290byBlcnJfY3M7Ci0JfQotCi0JcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkic2lyZixzcGktZG1hLXR4LWNoYW5uZWwiLCAmdHhfZG1hX2NoKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gZ2V0IHR4IGRtYSBjaGFubmVsXG4iKTsKLQkJZ290byBlcnJfY3M7Ci0JfQotCiAJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2YoKnNzcGkpICsgc2l6ZW9mKGludCkgKiBudW1fY3MpOwogCWlmICghbWFzdGVyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBTUEkgbWFzdGVyXG4iKTsKQEAgLTYzNywxOCArNjYxLDEzIEBACiAJc3NwaS0+Yml0YmFuZy5tYXN0ZXItPmRldi5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAKIAkvKiByZXF1ZXN0IERNQSBjaGFubmVscyAqLwotCWRtYV9jYXBfemVybyhkbWFfY2FwX21hc2spOwotCWRtYV9jYXBfc2V0KERNQV9JTlRFUkxFQVZFLCBkbWFfY2FwX21hc2spOwotCi0Jc3NwaS0+cnhfY2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwoZG1hX2NhcF9tYXNrLCAoZG1hX2ZpbHRlcl9mbilzaXJmc29jX2RtYV9maWx0ZXJfaWQsCi0JCSh2b2lkICopcnhfZG1hX2NoKTsKKwlzc3BpLT5yeF9jaGFuID0gZG1hX3JlcXVlc3Rfc2xhdmVfY2hhbm5lbCgmcGRldi0+ZGV2LCAicngiKTsKIAlpZiAoIXNzcGktPnJ4X2NoYW4pIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuIG5vdCBhbGxvY2F0ZSByeCBkbWEgY2hhbm5lbFxuIik7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZnJlZV9tYXN0ZXI7CiAJfQotCXNzcGktPnR4X2NoYW4gPSBkbWFfcmVxdWVzdF9jaGFubmVsKGRtYV9jYXBfbWFzaywgKGRtYV9maWx0ZXJfZm4pc2lyZnNvY19kbWFfZmlsdGVyX2lkLAotCQkodm9pZCAqKXR4X2RtYV9jaCk7CisJc3NwaS0+dHhfY2hhbiA9IGRtYV9yZXF1ZXN0X3NsYXZlX2NoYW5uZWwoJnBkZXYtPmRldiwgInR4Iik7CiAJaWYgKCFzc3BpLT50eF9jaGFuKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbiBub3QgYWxsb2NhdGUgdHggZG1hIGNoYW5uZWxcbiIpOwogCQlyZXQgPSAtRU5PREVWOwpAQCAtNzI0LDExICs3NDMsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QTQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAogc3RhdGljIGludCBzcGlfc2lyZnNvY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHNpcmZzb2Nfc3BpICpzc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWludCByZXQ7CisKKwlyZXQgPSBzcGlfbWFzdGVyX3N1c3BlbmQobWFzdGVyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJY2xrX2Rpc2FibGUoc3NwaS0+Y2xrKTsKIAlyZXR1cm4gMDsKQEAgLTc0NSwxNSArNzY5LDEzIEBACiAJd3JpdGVsKFNJUkZTT0NfU1BJX0ZJRk9fU1RBUlQsIHNzcGktPmJhc2UgKyBTSVJGU09DX1NQSV9SWEZJRk9fT1ApOwogCXdyaXRlbChTSVJGU09DX1NQSV9GSUZPX1NUQVJULCBzc3BpLT5iYXNlICsgU0lSRlNPQ19TUElfVFhGSUZPX09QKTsKIAotCXJldHVybiAwOworCXJldHVybiBzcGlfbWFzdGVyX3Jlc3VtZShtYXN0ZXIpOwogfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgc3BpX3NpcmZzb2NfcG1fb3BzID0gewotCS5zdXNwZW5kID0gc3BpX3NpcmZzb2Nfc3VzcGVuZCwKLQkucmVzdW1lID0gc3BpX3NpcmZzb2NfcmVzdW1lLAotfTsKICNlbmRpZgogCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoc3BpX3NpcmZzb2NfcG1fb3BzLCBzcGlfc2lyZnNvY19zdXNwZW5kLAorCQkJIHNwaV9zaXJmc29jX3Jlc3VtZSk7CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNwaV9zaXJmc29jX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJzaXJmLHByaW1hMi1zcGkiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAic2lyZixtYXJjby1zcGkiLCB9LApAQCAtNzY1LDkgKzc4Nyw3IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSBEUklWRVJfTkFNRSwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0jaWZkZWYgQ09ORklHX1BNCiAJCS5wbSAgICAgPSAmc3BpX3NpcmZzb2NfcG1fb3BzLAotI2VuZGlmCiAJCS5vZl9tYXRjaF90YWJsZSA9IHNwaV9zaXJmc29jX29mX21hdGNoLAogCX0sCiAJLnByb2JlID0gc3BpX3NpcmZzb2NfcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktc3VuNGkuYyBiL2RyaXZlcnMvc3BpL3NwaS1zdW40aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNjZhODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktc3VuNGkuYwpAQCAtMCwwICsxLDQ3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTQgQWxsd2lubmVyIFRlY2gKKyAqIFBhbiBOYW4gPHBhbm5hbkBhbGx3aW5uZXJ0ZWNoLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgTWF4aW1lIFJpcGFyZAorICogTWF4aW1lIFJpcGFyZCA8bWF4aW1lLnJpcGFyZEBmcmVlLWVsZWN0cm9ucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2RlZmluZSBTVU40SV9GSUZPX0RFUFRICQk2NAorCisjZGVmaW5lIFNVTjRJX1JYREFUQV9SRUcJCTB4MDAKKworI2RlZmluZSBTVU40SV9UWERBVEFfUkVHCQkweDA0CisKKyNkZWZpbmUgU1VONElfQ1RMX1JFRwkJCTB4MDgKKyNkZWZpbmUgU1VONElfQ1RMX0VOQUJMRQkJCUJJVCgwKQorI2RlZmluZSBTVU40SV9DVExfTUFTVEVSCQkJQklUKDEpCisjZGVmaW5lIFNVTjRJX0NUTF9DUEhBCQkJCUJJVCgyKQorI2RlZmluZSBTVU40SV9DVExfQ1BPTAkJCQlCSVQoMykKKyNkZWZpbmUgU1VONElfQ1RMX0NTX0FDVElWRV9MT1cJCQlCSVQoNCkKKyNkZWZpbmUgU1VONElfQ1RMX0xNVEYJCQkJQklUKDYpCisjZGVmaW5lIFNVTjRJX0NUTF9URl9SU1QJCQlCSVQoOCkKKyNkZWZpbmUgU1VONElfQ1RMX1JGX1JTVAkJCUJJVCg5KQorI2RlZmluZSBTVU40SV9DVExfWENICQkJCUJJVCgxMCkKKyNkZWZpbmUgU1VONElfQ1RMX0NTX01BU0sJCQkweDMwMDAKKyNkZWZpbmUgU1VONElfQ1RMX0NTKGNzKQkJCSgoKGNzKSA8PCAxMikgJiBTVU40SV9DVExfQ1NfTUFTSykKKyNkZWZpbmUgU1VONElfQ1RMX0RIQgkJCQlCSVQoMTUpCisjZGVmaW5lIFNVTjRJX0NUTF9DU19NQU5VQUwJCQlCSVQoMTYpCisjZGVmaW5lIFNVTjRJX0NUTF9DU19MRVZFTAkJCUJJVCgxNykKKyNkZWZpbmUgU1VONElfQ1RMX1RQCQkJCUJJVCgxOCkKKworI2RlZmluZSBTVU40SV9JTlRfQ1RMX1JFRwkJMHgwYworI2RlZmluZSBTVU40SV9JTlRfQ1RMX1RDCQkJQklUKDE2KQorCisjZGVmaW5lIFNVTjRJX0lOVF9TVEFfUkVHCQkweDEwCisKKyNkZWZpbmUgU1VONElfRE1BX0NUTF9SRUcJCTB4MTQKKworI2RlZmluZSBTVU40SV9XQUlUX1JFRwkJCTB4MTgKKworI2RlZmluZSBTVU40SV9DTEtfQ1RMX1JFRwkJMHgxYworI2RlZmluZSBTVU40SV9DTEtfQ1RMX0NEUjJfTUFTSwkJCTB4ZmYKKyNkZWZpbmUgU1VONElfQ0xLX0NUTF9DRFIyKGRpdikJCQkoKGRpdikgJiBTVU40SV9DTEtfQ1RMX0NEUjJfTUFTSykKKyNkZWZpbmUgU1VONElfQ0xLX0NUTF9DRFIxX01BU0sJCQkweGYKKyNkZWZpbmUgU1VONElfQ0xLX0NUTF9DRFIxKGRpdikJCQkoKChkaXYpICYgU1VONElfQ0xLX0NUTF9DRFIxX01BU0spIDw8IDgpCisjZGVmaW5lIFNVTjRJX0NMS19DVExfRFJTCQkJQklUKDEyKQorCisjZGVmaW5lIFNVTjRJX0JVUlNUX0NOVF9SRUcJCTB4MjAKKyNkZWZpbmUgU1VONElfQlVSU1RfQ05UKGNudCkJCQkoKGNudCkgJiAweGZmZmZmZikKKworI2RlZmluZSBTVU40SV9YTUlUX0NOVF9SRUcJCTB4MjQKKyNkZWZpbmUgU1VONElfWE1JVF9DTlQoY250KQkJCSgoY250KSAmIDB4ZmZmZmZmKQorCisjZGVmaW5lIFNVTjRJX0ZJRk9fU1RBX1JFRwkJMHgyOAorI2RlZmluZSBTVU40SV9GSUZPX1NUQV9SRl9DTlRfTUFTSwkJMHg3ZgorI2RlZmluZSBTVU40SV9GSUZPX1NUQV9SRl9DTlRfQklUUwkJMAorI2RlZmluZSBTVU40SV9GSUZPX1NUQV9URl9DTlRfTUFTSwkJMHg3ZgorI2RlZmluZSBTVU40SV9GSUZPX1NUQV9URl9DTlRfQklUUwkJMTYKKworc3RydWN0IHN1bjRpX3NwaSB7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKwl2b2lkIF9faW9tZW0JCSpiYXNlX2FkZHI7CisJc3RydWN0IGNsawkJKmhjbGs7CisJc3RydWN0IGNsawkJKm1jbGs7CisKKwlzdHJ1Y3QgY29tcGxldGlvbglkb25lOworCisJY29uc3QgdTgJCSp0eF9idWY7CisJdTgJCQkqcnhfYnVmOworCWludAkJCWxlbjsKK307CisKK3N0YXRpYyBpbmxpbmUgdTMyIHN1bjRpX3NwaV9yZWFkKHN0cnVjdCBzdW40aV9zcGkgKnNzcGksIHUzMiByZWcpCit7CisJcmV0dXJuIHJlYWRsKHNzcGktPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdW40aV9zcGlfd3JpdGUoc3RydWN0IHN1bjRpX3NwaSAqc3NwaSwgdTMyIHJlZywgdTMyIHZhbHVlKQoreworCXdyaXRlbCh2YWx1ZSwgc3NwaS0+YmFzZV9hZGRyICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN1bjRpX3NwaV9kcmFpbl9maWZvKHN0cnVjdCBzdW40aV9zcGkgKnNzcGksIGludCBsZW4pCit7CisJdTMyIHJlZywgY250OworCXU4IGJ5dGU7CisKKwkvKiBTZWUgaG93IG11Y2ggZGF0YSBpcyBhdmFpbGFibGUgKi8KKwlyZWcgPSBzdW40aV9zcGlfcmVhZChzc3BpLCBTVU40SV9GSUZPX1NUQV9SRUcpOworCXJlZyAmPSBTVU40SV9GSUZPX1NUQV9SRl9DTlRfTUFTSzsKKwljbnQgPSByZWcgPj4gU1VONElfRklGT19TVEFfUkZfQ05UX0JJVFM7CisKKwlpZiAobGVuID4gY250KQorCQlsZW4gPSBjbnQ7CisKKwl3aGlsZSAobGVuLS0pIHsKKwkJYnl0ZSA9IHJlYWRiKHNzcGktPmJhc2VfYWRkciArIFNVTjRJX1JYREFUQV9SRUcpOworCQlpZiAoc3NwaS0+cnhfYnVmKQorCQkJKnNzcGktPnJ4X2J1ZisrID0gYnl0ZTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdW40aV9zcGlfZmlsbF9maWZvKHN0cnVjdCBzdW40aV9zcGkgKnNzcGksIGludCBsZW4pCit7CisJdTggYnl0ZTsKKworCWlmIChsZW4gPiBzc3BpLT5sZW4pCisJCWxlbiA9IHNzcGktPmxlbjsKKworCXdoaWxlIChsZW4tLSkgeworCQlieXRlID0gc3NwaS0+dHhfYnVmID8gKnNzcGktPnR4X2J1ZisrIDogMDsKKwkJd3JpdGViKGJ5dGUsIHNzcGktPmJhc2VfYWRkciArIFNVTjRJX1RYREFUQV9SRUcpOworCQlzc3BpLT5sZW4tLTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN1bjRpX3NwaV9zZXRfY3Moc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IHN1bjRpX3NwaSAqc3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXUzMiByZWc7CisKKwlyZWcgPSBzdW40aV9zcGlfcmVhZChzc3BpLCBTVU40SV9DVExfUkVHKTsKKworCXJlZyAmPSB+U1VONElfQ1RMX0NTX01BU0s7CisJcmVnIHw9IFNVTjRJX0NUTF9DUyhzcGktPmNoaXBfc2VsZWN0KTsKKworCWlmIChlbmFibGUpCisJCXJlZyB8PSBTVU40SV9DVExfQ1NfTEVWRUw7CisJZWxzZQorCQlyZWcgJj0gflNVTjRJX0NUTF9DU19MRVZFTDsKKworCS8qCisJICogRXZlbiB0aG91Z2ggdGhpcyBsb29rcyBpcnJlbGV2YW50IHNpbmNlIHdlIGFyZSBzdXBwb3NlZCB0bworCSAqIGJlIGNvbnRyb2xsaW5nIHRoZSBjaGlwIHNlbGVjdCBtYW51YWxseSwgdGhpcyBiaXQgYWxzbworCSAqIGNvbnRyb2xzIHRoZSBsZXZlbHMgb2YgdGhlIGNoaXAgc2VsZWN0IGZvciBpbmFjdGl2ZQorCSAqIGRldmljZXMuCisJICoKKwkgKiBJZiB3ZSBkb24ndCBzZXQgaXQsIHRoZSBjaGlwIHNlbGVjdCBsZXZlbCB3aWxsIGdvIGxvdyBieQorCSAqIGRlZmF1bHQgd2hlbiB0aGUgZGV2aWNlIGlzIGlkbGUsIHdoaWNoIGlzIG5vdCByZWFsbHkKKwkgKiBleHBlY3RlZCBpbiB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgdGhlIGNoaXAgc2VsZWN0IGlzIGFjdGl2ZQorCSAqIGxvdy4KKwkgKi8KKwlpZiAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpCisJCXJlZyAmPSB+U1VONElfQ1RMX0NTX0FDVElWRV9MT1c7CisJZWxzZQorCQlyZWcgfD0gU1VONElfQ1RMX0NTX0FDVElWRV9MT1c7CisKKwlzdW40aV9zcGlfd3JpdGUoc3NwaSwgU1VONElfQ1RMX1JFRywgcmVnKTsKK30KKworc3RhdGljIGludCBzdW40aV9zcGlfdHJhbnNmZXJfb25lKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCQkJICBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCSAgc3RydWN0IHNwaV90cmFuc2ZlciAqdGZyKQoreworCXN0cnVjdCBzdW40aV9zcGkgKnNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJdW5zaWduZWQgaW50IG1jbGtfcmF0ZSwgZGl2LCB0aW1lb3V0OworCXVuc2lnbmVkIGludCB0eF9sZW4gPSAwOworCWludCByZXQgPSAwOworCXUzMiByZWc7CisKKwkvKiBXZSBkb24ndCBzdXBwb3J0IHRyYW5zZmVyIGxhcmdlciB0aGFuIHRoZSBGSUZPICovCisJaWYgKHRmci0+bGVuID4gU1VONElfRklGT19ERVBUSCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWluaXRfY29tcGxldGlvbigmc3NwaS0+ZG9uZSk7CisJc3NwaS0+dHhfYnVmID0gdGZyLT50eF9idWY7CisJc3NwaS0+cnhfYnVmID0gdGZyLT5yeF9idWY7CisJc3NwaS0+bGVuID0gdGZyLT5sZW47CisKKwkvKiBDbGVhciBwZW5kaW5nIGludGVycnVwdHMgKi8KKwlzdW40aV9zcGlfd3JpdGUoc3NwaSwgU1VONElfSU5UX1NUQV9SRUcsIH4wKTsKKworCisJcmVnID0gc3VuNGlfc3BpX3JlYWQoc3NwaSwgU1VONElfQ1RMX1JFRyk7CisKKwkvKiBSZXNldCBGSUZPcyAqLworCXN1bjRpX3NwaV93cml0ZShzc3BpLCBTVU40SV9DVExfUkVHLAorCQkJcmVnIHwgU1VONElfQ1RMX1JGX1JTVCB8IFNVTjRJX0NUTF9URl9SU1QpOworCisJLyoKKwkgKiBTZXR1cCB0aGUgdHJhbnNmZXIgY29udHJvbCByZWdpc3RlcjogQ2hpcCBTZWxlY3QsCisJICogcG9sYXJpdGllcywgZXRjLgorCSAqLworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKKwkJcmVnIHw9IFNVTjRJX0NUTF9DUE9MOworCWVsc2UKKwkJcmVnICY9IH5TVU40SV9DVExfQ1BPTDsKKworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKKwkJcmVnIHw9IFNVTjRJX0NUTF9DUEhBOworCWVsc2UKKwkJcmVnICY9IH5TVU40SV9DVExfQ1BIQTsKKworCWlmIChzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUKQorCQlyZWcgfD0gU1VONElfQ1RMX0xNVEY7CisJZWxzZQorCQlyZWcgJj0gflNVTjRJX0NUTF9MTVRGOworCisKKwkvKgorCSAqIElmIGl0J3MgYSBUWCBvbmx5IHRyYW5zZmVyLCB3ZSBkb24ndCB3YW50IHRvIGZpbGwgdGhlIFJYCisJICogRklGTyB3aXRoIGJvZ3VzIGRhdGEKKwkgKi8KKwlpZiAoc3NwaS0+cnhfYnVmKQorCQlyZWcgJj0gflNVTjRJX0NUTF9ESEI7CisJZWxzZQorCQlyZWcgfD0gU1VONElfQ1RMX0RIQjsKKworCS8qIFdlIHdhbnQgdG8gY29udHJvbCB0aGUgY2hpcCBzZWxlY3QgbWFudWFsbHkgKi8KKwlyZWcgfD0gU1VONElfQ1RMX0NTX01BTlVBTDsKKworCXN1bjRpX3NwaV93cml0ZShzc3BpLCBTVU40SV9DVExfUkVHLCByZWcpOworCisJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHBhcmVudCBjbG9jayBmYXN0IGVub3VnaCAqLworCW1jbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShzc3BpLT5tY2xrKTsKKwlpZiAobWNsa19yYXRlIDwgKDIgKiBzcGktPm1heF9zcGVlZF9oeikpIHsKKwkJY2xrX3NldF9yYXRlKHNzcGktPm1jbGssIDIgKiBzcGktPm1heF9zcGVlZF9oeik7CisJCW1jbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShzc3BpLT5tY2xrKTsKKwl9CisKKwkvKgorCSAqIFNldHVwIGNsb2NrIGRpdmlkZXIuCisJICoKKwkgKiBXZSBoYXZlIHR3byBjaG9pY2VzIHRoZXJlLiBFaXRoZXIgd2UgY2FuIHVzZSB0aGUgY2xvY2sKKwkgKiBkaXZpZGUgcmF0ZSAxLCB3aGljaCBpcyBjYWxjdWxhdGVkIHRoYW5rcyB0byB0aGlzIGZvcm11bGE6CisJICogU1BJX0NMSyA9IE1PRF9DTEsgLyAoMiBeIChjZHIgKyAxKSkKKwkgKiBPciB3ZSBjYW4gdXNlIENEUjIsIHdoaWNoIGlzIGNhbGN1bGF0ZWQgd2l0aCB0aGUgZm9ybXVsYToKKwkgKiBTUElfQ0xLID0gTU9EX0NMSyAvICgyICogKGNkciArIDEpKQorCSAqIFdldGhlciB3ZSB1c2UgdGhlIGZvcm1lciBvciB0aGUgbGF0dGVyIGlzIHNldCB0aHJvdWdoIHRoZQorCSAqIERSUyBiaXQuCisJICoKKwkgKiBGaXJzdCB0cnkgQ0RSMiwgYW5kIGlmIHdlIGNhbid0IHJlYWNoIHRoZSBleHBlY3RlZAorCSAqIGZyZXF1ZW5jeSwgZmFsbCBiYWNrIHRvIENEUjEuCisJICovCisJZGl2ID0gbWNsa19yYXRlIC8gKDIgKiBzcGktPm1heF9zcGVlZF9oeik7CisJaWYgKGRpdiA8PSAoU1VONElfQ0xLX0NUTF9DRFIyX01BU0sgKyAxKSkgeworCQlpZiAoZGl2ID4gMCkKKwkJCWRpdi0tOworCisJCXJlZyA9IFNVTjRJX0NMS19DVExfQ0RSMihkaXYpIHwgU1VONElfQ0xLX0NUTF9EUlM7CisJfSBlbHNlIHsKKwkJZGl2ID0gaWxvZzIobWNsa19yYXRlKSAtIGlsb2cyKHNwaS0+bWF4X3NwZWVkX2h6KTsKKwkJcmVnID0gU1VONElfQ0xLX0NUTF9DRFIxKGRpdik7CisJfQorCisJc3VuNGlfc3BpX3dyaXRlKHNzcGksIFNVTjRJX0NMS19DVExfUkVHLCByZWcpOworCisJLyogU2V0dXAgdGhlIHRyYW5zZmVyIG5vdy4uLiAqLworCWlmIChzc3BpLT50eF9idWYpCisJCXR4X2xlbiA9IHRmci0+bGVuOworCisJLyogU2V0dXAgdGhlIGNvdW50ZXJzICovCisJc3VuNGlfc3BpX3dyaXRlKHNzcGksIFNVTjRJX0JVUlNUX0NOVF9SRUcsIFNVTjRJX0JVUlNUX0NOVCh0ZnItPmxlbikpOworCXN1bjRpX3NwaV93cml0ZShzc3BpLCBTVU40SV9YTUlUX0NOVF9SRUcsIFNVTjRJX1hNSVRfQ05UKHR4X2xlbikpOworCisJLyogRmlsbCB0aGUgVFggRklGTyAqLworCXN1bjRpX3NwaV9maWxsX2ZpZm8oc3NwaSwgU1VONElfRklGT19ERVBUSCk7CisKKwkvKiBFbmFibGUgdGhlIGludGVycnVwdHMgKi8KKwlzdW40aV9zcGlfd3JpdGUoc3NwaSwgU1VONElfSU5UX0NUTF9SRUcsIFNVTjRJX0lOVF9DVExfVEMpOworCisJLyogU3RhcnQgdGhlIHRyYW5zZmVyICovCisJcmVnID0gc3VuNGlfc3BpX3JlYWQoc3NwaSwgU1VONElfQ1RMX1JFRyk7CisJc3VuNGlfc3BpX3dyaXRlKHNzcGksIFNVTjRJX0NUTF9SRUcsIHJlZyB8IFNVTjRJX0NUTF9YQ0gpOworCisJdGltZW91dCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmc3NwaS0+ZG9uZSwKKwkJCQkJICAgICAgbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisJaWYgKCF0aW1lb3V0KSB7CisJCXJldCA9IC1FVElNRURPVVQ7CisJCWdvdG8gb3V0OworCX0KKworCXN1bjRpX3NwaV9kcmFpbl9maWZvKHNzcGksIFNVTjRJX0ZJRk9fREVQVEgpOworCitvdXQ6CisJc3VuNGlfc3BpX3dyaXRlKHNzcGksIFNVTjRJX0lOVF9DVExfUkVHLCAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzdW40aV9zcGlfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHN1bjRpX3NwaSAqc3NwaSA9IGRldl9pZDsKKwl1MzIgc3RhdHVzID0gc3VuNGlfc3BpX3JlYWQoc3NwaSwgU1VONElfSU5UX1NUQV9SRUcpOworCisJLyogVHJhbnNmZXIgY29tcGxldGUgKi8KKwlpZiAoc3RhdHVzICYgU1VONElfSU5UX0NUTF9UQykgeworCQlzdW40aV9zcGlfd3JpdGUoc3NwaSwgU1VONElfSU5UX1NUQV9SRUcsIFNVTjRJX0lOVF9DVExfVEMpOworCQljb21wbGV0ZSgmc3NwaS0+ZG9uZSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBpbnQgc3VuNGlfc3BpX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHN1bjRpX3NwaSAqc3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpbnQgcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHNzcGktPmhjbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJDb3VsZG4ndCBlbmFibGUgQUhCIGNsb2NrXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHNzcGktPm1jbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJDb3VsZG4ndCBlbmFibGUgbW9kdWxlIGNsb2NrXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJc3VuNGlfc3BpX3dyaXRlKHNzcGksIFNVTjRJX0NUTF9SRUcsCisJCQlTVU40SV9DVExfRU5BQkxFIHwgU1VONElfQ1RMX01BU1RFUiB8IFNVTjRJX0NUTF9UUCk7CisKKwlyZXR1cm4gMDsKKworZXJyOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShzc3BpLT5oY2xrKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN1bjRpX3NwaV9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc3VuNGlfc3BpICpzc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNzcGktPm1jbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShzc3BpLT5oY2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN1bjRpX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IHN1bjRpX3NwaSAqc3NwaTsKKwlzdHJ1Y3QgcmVzb3VyY2UJKnJlczsKKwlpbnQgcmV0ID0gMCwgaXJxOworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHN1bjRpX3NwaSkpOworCWlmICghbWFzdGVyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBTUEkgTWFzdGVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKKwlzc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlzc3BpLT5iYXNlX2FkZHIgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHNzcGktPmJhc2VfYWRkcikpIHsKKwkJcmV0ID0gUFRSX0VSUihzc3BpLT5iYXNlX2FkZHIpOworCQlnb3RvIGVycl9mcmVlX21hc3RlcjsKKwl9CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHNwaSBJUlEgc3BlY2lmaWVkXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGVycl9mcmVlX21hc3RlcjsKKwl9CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgc3VuNGlfc3BpX2hhbmRsZXIsCisJCQkgICAgICAgMCwgInN1bjRpLXNwaSIsIHNzcGkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHJlcXVlc3QgSVJRXG4iKTsKKwkJZ290byBlcnJfZnJlZV9tYXN0ZXI7CisJfQorCisJc3NwaS0+bWFzdGVyID0gbWFzdGVyOworCW1hc3Rlci0+c2V0X2NzID0gc3VuNGlfc3BpX3NldF9jczsKKwltYXN0ZXItPnRyYW5zZmVyX29uZSA9IHN1bjRpX3NwaV90cmFuc2Zlcl9vbmU7CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IDQ7CisJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0ggfCBTUElfTFNCX0ZJUlNUOworCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19NQVNLKDgpOworCW1hc3Rlci0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwltYXN0ZXItPmF1dG9fcnVudGltZV9wbSA9IHRydWU7CisKKwlzc3BpLT5oY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJhaGIiKTsKKwlpZiAoSVNfRVJSKHNzcGktPmhjbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhY3F1aXJlIEFIQiBjbG9ja1xuIik7CisJCXJldCA9IFBUUl9FUlIoc3NwaS0+aGNsayk7CisJCWdvdG8gZXJyX2ZyZWVfbWFzdGVyOworCX0KKworCXNzcGktPm1jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgIm1vZCIpOworCWlmIChJU19FUlIoc3NwaS0+bWNsaykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFjcXVpcmUgbW9kdWxlIGNsb2NrXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihzc3BpLT5tY2xrKTsKKwkJZ290byBlcnJfZnJlZV9tYXN0ZXI7CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZzc3BpLT5kb25lKTsKKworCS8qCisJICogVGhpcyB3YWtlLXVwL3NodXRkb3duIHBhdHRlcm4gaXMgdG8gYmUgYWJsZSB0byBoYXZlIHRoZQorCSAqIGRldmljZSB3b2tlbiB1cCwgZXZlbiBpZiBydW50aW1lX3BtIGlzIGRpc2FibGVkCisJICovCisJcmV0ID0gc3VuNGlfc3BpX3J1bnRpbWVfcmVzdW1lKCZwZGV2LT5kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGRuJ3QgcmVzdW1lIHRoZSBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9mcmVlX21hc3RlcjsKKwl9CisKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9pZGxlKCZwZGV2LT5kZXYpOworCisJcmV0ID0gZGV2bV9zcGlfcmVnaXN0ZXJfbWFzdGVyKCZwZGV2LT5kZXYsIG1hc3Rlcik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgcmVnaXN0ZXIgU1BJIG1hc3RlclxuIik7CisJCWdvdG8gZXJyX3BtX2Rpc2FibGU7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9wbV9kaXNhYmxlOgorCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKwlzdW40aV9zcGlfcnVudGltZV9zdXNwZW5kKCZwZGV2LT5kZXYpOworZXJyX2ZyZWVfbWFzdGVyOgorCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzdW40aV9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bjRpX3NwaV9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1zcGkiLCB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3VuNGlfc3BpX21hdGNoKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHN1bjRpX3NwaV9wbV9vcHMgPSB7CisJLnJ1bnRpbWVfcmVzdW1lCQk9IHN1bjRpX3NwaV9ydW50aW1lX3Jlc3VtZSwKKwkucnVudGltZV9zdXNwZW5kCT0gc3VuNGlfc3BpX3J1bnRpbWVfc3VzcGVuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHN1bjRpX3NwaV9kcml2ZXIgPSB7CisJLnByb2JlCT0gc3VuNGlfc3BpX3Byb2JlLAorCS5yZW1vdmUJPSBzdW40aV9zcGlfcmVtb3ZlLAorCS5kcml2ZXIJPSB7CisJCS5uYW1lCQk9ICJzdW40aS1zcGkiLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZQk9IHN1bjRpX3NwaV9tYXRjaCwKKwkJLnBtCQk9ICZzdW40aV9zcGlfcG1fb3BzLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzdW40aV9zcGlfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiUGFuIE5hbiA8cGFubmFuQGFsbHdpbm5lcnRlY2guY29tPiIpOworTU9EVUxFX0FVVEhPUigiTWF4aW1lIFJpcGFyZCA8bWF4aW1lLnJpcGFyZEBmcmVlLWVsZWN0cm9ucy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFsbHdpbm5lciBBMVgvQTIwIFNQSSBjb250cm9sbGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXN1bjZpLmMgYi9kcml2ZXJzL3NwaS9zcGktc3VuNmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2UzNDk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpLXN1bjZpLmMKQEAgLTAsMCArMSw0ODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDE0IEFsbHdpbm5lciBUZWNoCisgKiBQYW4gTmFuIDxwYW5uYW5AYWxsd2lubmVydGVjaC5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IE1heGltZSBSaXBhcmQKKyAqIE1heGltZSBSaXBhcmQgPG1heGltZS5yaXBhcmRAZnJlZS1lbGVjdHJvbnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2RlZmluZSBTVU42SV9GSUZPX0RFUFRICQkxMjgKKworI2RlZmluZSBTVU42SV9HQkxfQ1RMX1JFRwkJMHgwNAorI2RlZmluZSBTVU42SV9HQkxfQ1RMX0JVU19FTkFCTEUJCUJJVCgwKQorI2RlZmluZSBTVU42SV9HQkxfQ1RMX01BU1RFUgkJCUJJVCgxKQorI2RlZmluZSBTVU42SV9HQkxfQ1RMX1RQCQkJQklUKDcpCisjZGVmaW5lIFNVTjZJX0dCTF9DVExfUlNUCQkJQklUKDMxKQorCisjZGVmaW5lIFNVTjZJX1RGUl9DVExfUkVHCQkweDA4CisjZGVmaW5lIFNVTjZJX1RGUl9DVExfQ1BIQQkJCUJJVCgwKQorI2RlZmluZSBTVU42SV9URlJfQ1RMX0NQT0wJCQlCSVQoMSkKKyNkZWZpbmUgU1VONklfVEZSX0NUTF9TUE9MCQkJQklUKDIpCisjZGVmaW5lIFNVTjZJX1RGUl9DVExfQ1NfTUFTSwkJCTB4MzAKKyNkZWZpbmUgU1VONklfVEZSX0NUTF9DUyhjcykJCQkoKChjcykgPDwgNCkgJiBTVU42SV9URlJfQ1RMX0NTX01BU0spCisjZGVmaW5lIFNVTjZJX1RGUl9DVExfQ1NfTUFOVUFMCQkJQklUKDYpCisjZGVmaW5lIFNVTjZJX1RGUl9DVExfQ1NfTEVWRUwJCQlCSVQoNykKKyNkZWZpbmUgU1VONklfVEZSX0NUTF9ESEIJCQlCSVQoOCkKKyNkZWZpbmUgU1VONklfVEZSX0NUTF9GQlMJCQlCSVQoMTIpCisjZGVmaW5lIFNVTjZJX1RGUl9DVExfWENICQkJQklUKDMxKQorCisjZGVmaW5lIFNVTjZJX0lOVF9DVExfUkVHCQkweDEwCisjZGVmaW5lIFNVTjZJX0lOVF9DVExfUkZfT1ZGCQkJQklUKDgpCisjZGVmaW5lIFNVTjZJX0lOVF9DVExfVEMJCQlCSVQoMTIpCisKKyNkZWZpbmUgU1VONklfSU5UX1NUQV9SRUcJCTB4MTQKKworI2RlZmluZSBTVU42SV9GSUZPX0NUTF9SRUcJCTB4MTgKKyNkZWZpbmUgU1VONklfRklGT19DVExfUkZfUlNUCQkJQklUKDE1KQorI2RlZmluZSBTVU42SV9GSUZPX0NUTF9URl9SU1QJCQlCSVQoMzEpCisKKyNkZWZpbmUgU1VONklfRklGT19TVEFfUkVHCQkweDFjCisjZGVmaW5lIFNVTjZJX0ZJRk9fU1RBX1JGX0NOVF9NQVNLCQkweDdmCisjZGVmaW5lIFNVTjZJX0ZJRk9fU1RBX1JGX0NOVF9CSVRTCQkwCisjZGVmaW5lIFNVTjZJX0ZJRk9fU1RBX1RGX0NOVF9NQVNLCQkweDdmCisjZGVmaW5lIFNVTjZJX0ZJRk9fU1RBX1RGX0NOVF9CSVRTCQkxNgorCisjZGVmaW5lIFNVTjZJX0NMS19DVExfUkVHCQkweDI0CisjZGVmaW5lIFNVTjZJX0NMS19DVExfQ0RSMl9NQVNLCQkJMHhmZgorI2RlZmluZSBTVU42SV9DTEtfQ1RMX0NEUjIoZGl2KQkJCSgoKGRpdikgJiBTVU42SV9DTEtfQ1RMX0NEUjJfTUFTSykgPDwgMCkKKyNkZWZpbmUgU1VONklfQ0xLX0NUTF9DRFIxX01BU0sJCQkweGYKKyNkZWZpbmUgU1VONklfQ0xLX0NUTF9DRFIxKGRpdikJCQkoKChkaXYpICYgU1VONklfQ0xLX0NUTF9DRFIxX01BU0spIDw8IDgpCisjZGVmaW5lIFNVTjZJX0NMS19DVExfRFJTCQkJQklUKDEyKQorCisjZGVmaW5lIFNVTjZJX0JVUlNUX0NOVF9SRUcJCTB4MzAKKyNkZWZpbmUgU1VONklfQlVSU1RfQ05UKGNudCkJCQkoKGNudCkgJiAweGZmZmZmZikKKworI2RlZmluZSBTVU42SV9YTUlUX0NOVF9SRUcJCTB4MzQKKyNkZWZpbmUgU1VONklfWE1JVF9DTlQoY250KQkJCSgoY250KSAmIDB4ZmZmZmZmKQorCisjZGVmaW5lIFNVTjZJX0JVUlNUX0NUTF9DTlRfUkVHCQkweDM4CisjZGVmaW5lIFNVTjZJX0JVUlNUX0NUTF9DTlRfU1RDKGNudCkJCSgoY250KSAmIDB4ZmZmZmZmKQorCisjZGVmaW5lIFNVTjZJX1RYREFUQV9SRUcJCTB4MjAwCisjZGVmaW5lIFNVTjZJX1JYREFUQV9SRUcJCTB4MzAwCisKK3N0cnVjdCBzdW42aV9zcGkgeworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7CisJdm9pZCBfX2lvbWVtCQkqYmFzZV9hZGRyOworCXN0cnVjdCBjbGsJCSpoY2xrOworCXN0cnVjdCBjbGsJCSptY2xrOworCXN0cnVjdCByZXNldF9jb250cm9sCSpyc3RjOworCisJc3RydWN0IGNvbXBsZXRpb24JZG9uZTsKKworCWNvbnN0IHU4CQkqdHhfYnVmOworCXU4CQkJKnJ4X2J1ZjsKKwlpbnQJCQlsZW47Cit9OworCitzdGF0aWMgaW5saW5lIHUzMiBzdW42aV9zcGlfcmVhZChzdHJ1Y3Qgc3VuNmlfc3BpICpzc3BpLCB1MzIgcmVnKQoreworCXJldHVybiByZWFkbChzc3BpLT5iYXNlX2FkZHIgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3VuNmlfc3BpX3dyaXRlKHN0cnVjdCBzdW42aV9zcGkgKnNzcGksIHUzMiByZWcsIHUzMiB2YWx1ZSkKK3sKKwl3cml0ZWwodmFsdWUsIHNzcGktPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdW42aV9zcGlfZHJhaW5fZmlmbyhzdHJ1Y3Qgc3VuNmlfc3BpICpzc3BpLCBpbnQgbGVuKQoreworCXUzMiByZWcsIGNudDsKKwl1OCBieXRlOworCisJLyogU2VlIGhvdyBtdWNoIGRhdGEgaXMgYXZhaWxhYmxlICovCisJcmVnID0gc3VuNmlfc3BpX3JlYWQoc3NwaSwgU1VONklfRklGT19TVEFfUkVHKTsKKwlyZWcgJj0gU1VONklfRklGT19TVEFfUkZfQ05UX01BU0s7CisJY250ID0gcmVnID4+IFNVTjZJX0ZJRk9fU1RBX1JGX0NOVF9CSVRTOworCisJaWYgKGxlbiA+IGNudCkKKwkJbGVuID0gY250OworCisJd2hpbGUgKGxlbi0tKSB7CisJCWJ5dGUgPSByZWFkYihzc3BpLT5iYXNlX2FkZHIgKyBTVU42SV9SWERBVEFfUkVHKTsKKwkJaWYgKHNzcGktPnJ4X2J1ZikKKwkJCSpzc3BpLT5yeF9idWYrKyA9IGJ5dGU7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3VuNmlfc3BpX2ZpbGxfZmlmbyhzdHJ1Y3Qgc3VuNmlfc3BpICpzc3BpLCBpbnQgbGVuKQoreworCXU4IGJ5dGU7CisKKwlpZiAobGVuID4gc3NwaS0+bGVuKQorCQlsZW4gPSBzc3BpLT5sZW47CisKKwl3aGlsZSAobGVuLS0pIHsKKwkJYnl0ZSA9IHNzcGktPnR4X2J1ZiA/ICpzc3BpLT50eF9idWYrKyA6IDA7CisJCXdyaXRlYihieXRlLCBzc3BpLT5iYXNlX2FkZHIgKyBTVU42SV9UWERBVEFfUkVHKTsKKwkJc3NwaS0+bGVuLS07CisJfQorfQorCitzdGF0aWMgdm9pZCBzdW42aV9zcGlfc2V0X2NzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBzdW42aV9zcGkgKnNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl1MzIgcmVnOworCisJcmVnID0gc3VuNmlfc3BpX3JlYWQoc3NwaSwgU1VONklfVEZSX0NUTF9SRUcpOworCXJlZyAmPSB+U1VONklfVEZSX0NUTF9DU19NQVNLOworCXJlZyB8PSBTVU42SV9URlJfQ1RMX0NTKHNwaS0+Y2hpcF9zZWxlY3QpOworCisJaWYgKGVuYWJsZSkKKwkJcmVnIHw9IFNVTjZJX1RGUl9DVExfQ1NfTEVWRUw7CisJZWxzZQorCQlyZWcgJj0gflNVTjZJX1RGUl9DVExfQ1NfTEVWRUw7CisKKwlzdW42aV9zcGlfd3JpdGUoc3NwaSwgU1VONklfVEZSX0NUTF9SRUcsIHJlZyk7Cit9CisKKworc3RhdGljIGludCBzdW42aV9zcGlfdHJhbnNmZXJfb25lKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCQkJICBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCSAgc3RydWN0IHNwaV90cmFuc2ZlciAqdGZyKQoreworCXN0cnVjdCBzdW42aV9zcGkgKnNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJdW5zaWduZWQgaW50IG1jbGtfcmF0ZSwgZGl2LCB0aW1lb3V0OworCXVuc2lnbmVkIGludCB0eF9sZW4gPSAwOworCWludCByZXQgPSAwOworCXUzMiByZWc7CisKKwkvKiBXZSBkb24ndCBzdXBwb3J0IHRyYW5zZmVyIGxhcmdlciB0aGFuIHRoZSBGSUZPICovCisJaWYgKHRmci0+bGVuID4gU1VONklfRklGT19ERVBUSCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWluaXRfY29tcGxldGlvbigmc3NwaS0+ZG9uZSk7CisJc3NwaS0+dHhfYnVmID0gdGZyLT50eF9idWY7CisJc3NwaS0+cnhfYnVmID0gdGZyLT5yeF9idWY7CisJc3NwaS0+bGVuID0gdGZyLT5sZW47CisKKwkvKiBDbGVhciBwZW5kaW5nIGludGVycnVwdHMgKi8KKwlzdW42aV9zcGlfd3JpdGUoc3NwaSwgU1VONklfSU5UX1NUQV9SRUcsIH4wKTsKKworCS8qIFJlc2V0IEZJRk8gKi8KKwlzdW42aV9zcGlfd3JpdGUoc3NwaSwgU1VONklfRklGT19DVExfUkVHLAorCQkJU1VONklfRklGT19DVExfUkZfUlNUIHwgU1VONklfRklGT19DVExfVEZfUlNUKTsKKworCS8qCisJICogU2V0dXAgdGhlIHRyYW5zZmVyIGNvbnRyb2wgcmVnaXN0ZXI6IENoaXAgU2VsZWN0LAorCSAqIHBvbGFyaXRpZXMsIGV0Yy4KKwkgKi8KKwlyZWcgPSBzdW42aV9zcGlfcmVhZChzc3BpLCBTVU42SV9URlJfQ1RMX1JFRyk7CisKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCisJCXJlZyB8PSBTVU42SV9URlJfQ1RMX0NQT0w7CisJZWxzZQorCQlyZWcgJj0gflNVTjZJX1RGUl9DVExfQ1BPTDsKKworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKKwkJcmVnIHw9IFNVTjZJX1RGUl9DVExfQ1BIQTsKKwllbHNlCisJCXJlZyAmPSB+U1VONklfVEZSX0NUTF9DUEhBOworCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpCisJCXJlZyB8PSBTVU42SV9URlJfQ1RMX0ZCUzsKKwllbHNlCisJCXJlZyAmPSB+U1VONklfVEZSX0NUTF9GQlM7CisKKwkvKgorCSAqIElmIGl0J3MgYSBUWCBvbmx5IHRyYW5zZmVyLCB3ZSBkb24ndCB3YW50IHRvIGZpbGwgdGhlIFJYCisJICogRklGTyB3aXRoIGJvZ3VzIGRhdGEKKwkgKi8KKwlpZiAoc3NwaS0+cnhfYnVmKQorCQlyZWcgJj0gflNVTjZJX1RGUl9DVExfREhCOworCWVsc2UKKwkJcmVnIHw9IFNVTjZJX1RGUl9DVExfREhCOworCisJLyogV2Ugd2FudCB0byBjb250cm9sIHRoZSBjaGlwIHNlbGVjdCBtYW51YWxseSAqLworCXJlZyB8PSBTVU42SV9URlJfQ1RMX0NTX01BTlVBTDsKKworCXN1bjZpX3NwaV93cml0ZShzc3BpLCBTVU42SV9URlJfQ1RMX1JFRywgcmVnKTsKKworCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSBwYXJlbnQgY2xvY2sgZmFzdCBlbm91Z2ggKi8KKwltY2xrX3JhdGUgPSBjbGtfZ2V0X3JhdGUoc3NwaS0+bWNsayk7CisJaWYgKG1jbGtfcmF0ZSA8ICgyICogc3BpLT5tYXhfc3BlZWRfaHopKSB7CisJCWNsa19zZXRfcmF0ZShzc3BpLT5tY2xrLCAyICogc3BpLT5tYXhfc3BlZWRfaHopOworCQltY2xrX3JhdGUgPSBjbGtfZ2V0X3JhdGUoc3NwaS0+bWNsayk7CisJfQorCisJLyoKKwkgKiBTZXR1cCBjbG9jayBkaXZpZGVyLgorCSAqCisJICogV2UgaGF2ZSB0d28gY2hvaWNlcyB0aGVyZS4gRWl0aGVyIHdlIGNhbiB1c2UgdGhlIGNsb2NrCisJICogZGl2aWRlIHJhdGUgMSwgd2hpY2ggaXMgY2FsY3VsYXRlZCB0aGFua3MgdG8gdGhpcyBmb3JtdWxhOgorCSAqIFNQSV9DTEsgPSBNT0RfQ0xLIC8gKDIgXiBjZHIpCisJICogT3Igd2UgY2FuIHVzZSBDRFIyLCB3aGljaCBpcyBjYWxjdWxhdGVkIHdpdGggdGhlIGZvcm11bGE6CisJICogU1BJX0NMSyA9IE1PRF9DTEsgLyAoMiAqIChjZHIgKyAxKSkKKwkgKiBXZXRoZXIgd2UgdXNlIHRoZSBmb3JtZXIgb3IgdGhlIGxhdHRlciBpcyBzZXQgdGhyb3VnaCB0aGUKKwkgKiBEUlMgYml0LgorCSAqCisJICogRmlyc3QgdHJ5IENEUjIsIGFuZCBpZiB3ZSBjYW4ndCByZWFjaCB0aGUgZXhwZWN0ZWQKKwkgKiBmcmVxdWVuY3ksIGZhbGwgYmFjayB0byBDRFIxLgorCSAqLworCWRpdiA9IG1jbGtfcmF0ZSAvICgyICogc3BpLT5tYXhfc3BlZWRfaHopOworCWlmIChkaXYgPD0gKFNVTjZJX0NMS19DVExfQ0RSMl9NQVNLICsgMSkpIHsKKwkJaWYgKGRpdiA+IDApCisJCQlkaXYtLTsKKworCQlyZWcgPSBTVU42SV9DTEtfQ1RMX0NEUjIoZGl2KSB8IFNVTjZJX0NMS19DVExfRFJTOworCX0gZWxzZSB7CisJCWRpdiA9IGlsb2cyKG1jbGtfcmF0ZSkgLSBpbG9nMihzcGktPm1heF9zcGVlZF9oeik7CisJCXJlZyA9IFNVTjZJX0NMS19DVExfQ0RSMShkaXYpOworCX0KKworCXN1bjZpX3NwaV93cml0ZShzc3BpLCBTVU42SV9DTEtfQ1RMX1JFRywgcmVnKTsKKworCS8qIFNldHVwIHRoZSB0cmFuc2ZlciBub3cuLi4gKi8KKwlpZiAoc3NwaS0+dHhfYnVmKQorCQl0eF9sZW4gPSB0ZnItPmxlbjsKKworCS8qIFNldHVwIHRoZSBjb3VudGVycyAqLworCXN1bjZpX3NwaV93cml0ZShzc3BpLCBTVU42SV9CVVJTVF9DTlRfUkVHLCBTVU42SV9CVVJTVF9DTlQodGZyLT5sZW4pKTsKKwlzdW42aV9zcGlfd3JpdGUoc3NwaSwgU1VONklfWE1JVF9DTlRfUkVHLCBTVU42SV9YTUlUX0NOVCh0eF9sZW4pKTsKKwlzdW42aV9zcGlfd3JpdGUoc3NwaSwgU1VONklfQlVSU1RfQ1RMX0NOVF9SRUcsCisJCQlTVU42SV9CVVJTVF9DVExfQ05UX1NUQyh0eF9sZW4pKTsKKworCS8qIEZpbGwgdGhlIFRYIEZJRk8gKi8KKwlzdW42aV9zcGlfZmlsbF9maWZvKHNzcGksIFNVTjZJX0ZJRk9fREVQVEgpOworCisJLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHRzICovCisJc3VuNmlfc3BpX3dyaXRlKHNzcGksIFNVTjZJX0lOVF9DVExfUkVHLCBTVU42SV9JTlRfQ1RMX1RDKTsKKworCS8qIFN0YXJ0IHRoZSB0cmFuc2ZlciAqLworCXJlZyA9IHN1bjZpX3NwaV9yZWFkKHNzcGksIFNVTjZJX1RGUl9DVExfUkVHKTsKKwlzdW42aV9zcGlfd3JpdGUoc3NwaSwgU1VONklfVEZSX0NUTF9SRUcsIHJlZyB8IFNVTjZJX1RGUl9DVExfWENIKTsKKworCXRpbWVvdXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnNzcGktPmRvbmUsCisJCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCWlmICghdGltZW91dCkgeworCQlyZXQgPSAtRVRJTUVET1VUOworCQlnb3RvIG91dDsKKwl9CisKKwlzdW42aV9zcGlfZHJhaW5fZmlmbyhzc3BpLCBTVU42SV9GSUZPX0RFUFRIKTsKKworb3V0OgorCXN1bjZpX3NwaV93cml0ZShzc3BpLCBTVU42SV9JTlRfQ1RMX1JFRywgMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3VuNmlfc3BpX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBzdW42aV9zcGkgKnNzcGkgPSBkZXZfaWQ7CisJdTMyIHN0YXR1cyA9IHN1bjZpX3NwaV9yZWFkKHNzcGksIFNVTjZJX0lOVF9TVEFfUkVHKTsKKworCS8qIFRyYW5zZmVyIGNvbXBsZXRlICovCisJaWYgKHN0YXR1cyAmIFNVTjZJX0lOVF9DVExfVEMpIHsKKwkJc3VuNmlfc3BpX3dyaXRlKHNzcGksIFNVTjZJX0lOVF9TVEFfUkVHLCBTVU42SV9JTlRfQ1RMX1RDKTsKKwkJY29tcGxldGUoJnNzcGktPmRvbmUpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIElSUV9OT05FOworfQorCitzdGF0aWMgaW50IHN1bjZpX3NwaV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzdW42aV9zcGkgKnNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJaW50IHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShzc3BpLT5oY2xrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiQ291bGRuJ3QgZW5hYmxlIEFIQiBjbG9ja1xuIik7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShzc3BpLT5tY2xrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiQ291bGRuJ3QgZW5hYmxlIG1vZHVsZSBjbG9ja1xuIik7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IHJlc2V0X2NvbnRyb2xfZGVhc3NlcnQoc3NwaS0+cnN0Yyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkNvdWxkbid0IGRlYXNzZXJ0IHRoZSBkZXZpY2UgZnJvbSByZXNldFxuIik7CisJCWdvdG8gZXJyMjsKKwl9CisKKwlzdW42aV9zcGlfd3JpdGUoc3NwaSwgU1VONklfR0JMX0NUTF9SRUcsCisJCQlTVU42SV9HQkxfQ1RMX0JVU19FTkFCTEUgfCBTVU42SV9HQkxfQ1RMX01BU1RFUiB8IFNVTjZJX0dCTF9DVExfVFApOworCisJcmV0dXJuIDA7CisKK2VycjI6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNzcGktPm1jbGspOworZXJyOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShzc3BpLT5oY2xrKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN1bjZpX3NwaV9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc3VuNmlfc3BpICpzc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJcmVzZXRfY29udHJvbF9hc3NlcnQoc3NwaS0+cnN0Yyk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNzcGktPm1jbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShzc3BpLT5oY2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN1bjZpX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IHN1bjZpX3NwaSAqc3NwaTsKKwlzdHJ1Y3QgcmVzb3VyY2UJKnJlczsKKwlpbnQgcmV0ID0gMCwgaXJxOworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHN1bjZpX3NwaSkpOworCWlmICghbWFzdGVyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBTUEkgTWFzdGVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKKwlzc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlzc3BpLT5iYXNlX2FkZHIgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHNzcGktPmJhc2VfYWRkcikpIHsKKwkJcmV0ID0gUFRSX0VSUihzc3BpLT5iYXNlX2FkZHIpOworCQlnb3RvIGVycl9mcmVlX21hc3RlcjsKKwl9CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHNwaSBJUlEgc3BlY2lmaWVkXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGVycl9mcmVlX21hc3RlcjsKKwl9CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgc3VuNmlfc3BpX2hhbmRsZXIsCisJCQkgICAgICAgMCwgInN1bjZpLXNwaSIsIHNzcGkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHJlcXVlc3QgSVJRXG4iKTsKKwkJZ290byBlcnJfZnJlZV9tYXN0ZXI7CisJfQorCisJc3NwaS0+bWFzdGVyID0gbWFzdGVyOworCW1hc3Rlci0+c2V0X2NzID0gc3VuNmlfc3BpX3NldF9jczsKKwltYXN0ZXItPnRyYW5zZmVyX29uZSA9IHN1bjZpX3NwaV90cmFuc2Zlcl9vbmU7CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IDQ7CisJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0ggfCBTUElfTFNCX0ZJUlNUOworCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19NQVNLKDgpOworCW1hc3Rlci0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwltYXN0ZXItPmF1dG9fcnVudGltZV9wbSA9IHRydWU7CisKKwlzc3BpLT5oY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJhaGIiKTsKKwlpZiAoSVNfRVJSKHNzcGktPmhjbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhY3F1aXJlIEFIQiBjbG9ja1xuIik7CisJCXJldCA9IFBUUl9FUlIoc3NwaS0+aGNsayk7CisJCWdvdG8gZXJyX2ZyZWVfbWFzdGVyOworCX0KKworCXNzcGktPm1jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgIm1vZCIpOworCWlmIChJU19FUlIoc3NwaS0+bWNsaykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFjcXVpcmUgbW9kdWxlIGNsb2NrXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihzc3BpLT5tY2xrKTsKKwkJZ290byBlcnJfZnJlZV9tYXN0ZXI7CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZzc3BpLT5kb25lKTsKKworCXNzcGktPnJzdGMgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIoc3NwaS0+cnN0YykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGRuJ3QgZ2V0IHJlc2V0IGNvbnRyb2xsZXJcbiIpOworCQlyZXQgPSBQVFJfRVJSKHNzcGktPnJzdGMpOworCQlnb3RvIGVycl9mcmVlX21hc3RlcjsKKwl9CisKKwkvKgorCSAqIFRoaXMgd2FrZS11cC9zaHV0ZG93biBwYXR0ZXJuIGlzIHRvIGJlIGFibGUgdG8gaGF2ZSB0aGUKKwkgKiBkZXZpY2Ugd29rZW4gdXAsIGV2ZW4gaWYgcnVudGltZV9wbSBpcyBkaXNhYmxlZAorCSAqLworCXJldCA9IHN1bjZpX3NwaV9ydW50aW1lX3Jlc3VtZSgmcGRldi0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkbid0IHJlc3VtZSB0aGUgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfZnJlZV9tYXN0ZXI7CisJfQorCisJcG1fcnVudGltZV9zZXRfYWN0aXZlKCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfaWRsZSgmcGRldi0+ZGV2KTsKKworCXJldCA9IGRldm1fc3BpX3JlZ2lzdGVyX21hc3RlcigmcGRldi0+ZGV2LCBtYXN0ZXIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IHJlZ2lzdGVyIFNQSSBtYXN0ZXJcbiIpOworCQlnb3RvIGVycl9wbV9kaXNhYmxlOworCX0KKworCXJldHVybiAwOworCitlcnJfcG1fZGlzYWJsZToKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisJc3VuNmlfc3BpX3J1bnRpbWVfc3VzcGVuZCgmcGRldi0+ZGV2KTsKK2Vycl9mcmVlX21hc3RlcjoKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3VuNmlfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdW42aV9zcGlfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW42aS1hMzEtc3BpIiwgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN1bjZpX3NwaV9tYXRjaCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzdW42aV9zcGlfcG1fb3BzID0geworCS5ydW50aW1lX3Jlc3VtZQkJPSBzdW42aV9zcGlfcnVudGltZV9yZXN1bWUsCisJLnJ1bnRpbWVfc3VzcGVuZAk9IHN1bjZpX3NwaV9ydW50aW1lX3N1c3BlbmQsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdW42aV9zcGlfZHJpdmVyID0geworCS5wcm9iZQk9IHN1bjZpX3NwaV9wcm9iZSwKKwkucmVtb3ZlCT0gc3VuNmlfc3BpX3JlbW92ZSwKKwkuZHJpdmVyCT0geworCQkubmFtZQkJPSAic3VuNmktc3BpIiwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBzdW42aV9zcGlfbWF0Y2gsCisJCS5wbQkJPSAmc3VuNmlfc3BpX3BtX29wcywKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3VuNmlfc3BpX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlBhbiBOYW4gPHBhbm5hbkBhbGx3aW5uZXJ0ZWNoLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIk1heGltZSBSaXBhcmQgPG1heGltZS5yaXBhcmRAZnJlZS1lbGVjdHJvbnMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbGx3aW5uZXIgQTMxIFNQSSBjb250cm9sbGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXRlZ3JhMTE0LmMgYi9kcml2ZXJzL3NwaS9zcGktdGVncmExMTQuYwppbmRleCA0MTNjNzE4Li40MDA2NDk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktdGVncmExMTQuYworKysgYi9kcml2ZXJzL3NwaS9zcGktdGVncmExMTQuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hcG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMTcyLDcgKzE3MSw2IEBACiAJdm9pZCBfX2lvbWVtCQkJCSpiYXNlOwogCXBoeXNfYWRkcl90CQkJCXBoeXM7CiAJdW5zaWduZWQJCQkJaXJxOwotCXUzMgkJCQkJc3BpX21heF9mcmVxdWVuY3k7CiAJdTMyCQkJCQljdXJfc3BlZWQ7CiAKIAlzdHJ1Y3Qgc3BpX2RldmljZQkJCSpjdXJfc3BpOwpAQCAtNzYxLDExICs3NTksNiBAQAogCQlzcGktPm1vZGUgJiBTUElfQ1BIQSA/ICIiIDogIn4iLAogCQlzcGktPm1heF9zcGVlZF9oeik7CiAKLQlCVUdfT04oc3BpLT5jaGlwX3NlbGVjdCA+PSBNQVhfQ0hJUF9TRUxFQ1QpOwotCi0JLyogU2V0IHNwZWVkIHRvIHRoZSBzcGkgbWF4IGZlcXVlbmN5IGlmIHNwaSBkZXZpY2UgaGFzIG5vdCBzZXQgKi8KLQlzcGktPm1heF9zcGVlZF9oeiA9IHNwaS0+bWF4X3NwZWVkX2h6ID8gOiB0c3BpLT5zcGlfbWF4X2ZyZXF1ZW5jeTsKLQogCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmModHNwaS0+ZGV2KTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKHRzcGktPmRldiwgInBtIHJ1bnRpbWUgZmFpbGVkLCBlID0gJWRcbiIsIHJldCk7CkBAIC04NTMsOCArODQ2LDggQEAKIAkJCQkJU1BJX0NPTU1BTkQxKTsKIAkJCXRlZ3JhX3NwaV90cmFuc2Zlcl9kZWxheSh4ZmVyLT5kZWxheV91c2Vjcyk7CiAJCQlnb3RvIGV4aXQ7Ci0JCX0gZWxzZSBpZiAobXNnLT50cmFuc2ZlcnMucHJldiA9PSAmeGZlci0+dHJhbnNmZXJfbGlzdCkgewotCQkJLyogVGhpcyBpcyB0aGUgbGFzdCB0cmFuc2ZlciBpbiBtZXNzYWdlICovCisJCX0gZWxzZSBpZiAobGlzdF9pc19sYXN0KCZ4ZmVyLT50cmFuc2Zlcl9saXN0LAorCQkJCQkmbXNnLT50cmFuc2ZlcnMpKSB7CiAJCQlpZiAoeGZlci0+Y3NfY2hhbmdlKQogCQkJCXRzcGktPmNzX2NvbnRyb2wgPSBzcGk7CiAJCQllbHNlIHsKQEAgLTEwMTksMTYgKzEwMTIsNiBAQAogCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7CiB9CiAKLXN0YXRpYyB2b2lkIHRlZ3JhX3NwaV9wYXJzZV9kdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCXN0cnVjdCB0ZWdyYV9zcGlfZGF0YSAqdHNwaSkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7Ci0KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJzcGktbWF4LWZyZXF1ZW5jeSIsCi0JCQkJJnRzcGktPnNwaV9tYXhfZnJlcXVlbmN5KSkKLQkJdHNwaS0+c3BpX21heF9mcmVxdWVuY3kgPSAyNTAwMDAwMDsgLyogMjVNSHogKi8KLX0KLQogc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfc3BpX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmExMTQtc3BpIiwgfSwKIAl7fQpAQCAtMTA1MCwxNSArMTAzMywxNSBAQAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1hc3Rlcik7CiAJdHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAotCS8qIFBhcnNlIERUICovCi0JdGVncmFfc3BpX3BhcnNlX2R0KHBkZXYsIHRzcGkpOworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgInNwaS1tYXgtZnJlcXVlbmN5IiwKKwkJCQkgJm1hc3Rlci0+bWF4X3NwZWVkX2h6KSkKKwkJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSAyNTAwMDAwMDsgLyogMjVNSHogKi8KIAogCS8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLwogCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIOwogCW1hc3Rlci0+c2V0dXAgPSB0ZWdyYV9zcGlfc2V0dXA7CiAJbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IHRlZ3JhX3NwaV90cmFuc2Zlcl9vbmVfbWVzc2FnZTsKIAltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gTUFYX0NISVBfU0VMRUNUOwotCW1hc3Rlci0+YnVzX251bSA9IC0xOwogCW1hc3Rlci0+YXV0b19ydW50aW1lX3BtID0gdHJ1ZTsKIAogCXRzcGktPm1hc3RlciA9IG1hc3RlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS10ZWdyYTIwLXNmbGFzaC5jIGIvZHJpdmVycy9zcGkvc3BpLXRlZ3JhMjAtc2ZsYXNoLmMKaW5kZXggMDg3OTQ5Ny4uNDc4NjllYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXRlZ3JhMjAtc2ZsYXNoLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXRlZ3JhMjAtc2ZsYXNoLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTEyMSw3ICsxMjAsNiBAQAogCXN0cnVjdCByZXNldF9jb250cm9sCQkJKnJzdDsKIAl2b2lkIF9faW9tZW0JCQkJKmJhc2U7CiAJdW5zaWduZWQJCQkJaXJxOwotCXUzMgkJCQkJc3BpX21heF9mcmVxdWVuY3k7CiAJdTMyCQkJCQljdXJfc3BlZWQ7CiAKIAlzdHJ1Y3Qgc3BpX2RldmljZQkJCSpjdXJfc3BpOwpAQCAtMzE1LDE1ICszMTMsNiBAQAogCXJldHVybiB0ZWdyYV9zZmxhc2hfc3RhcnRfY3B1X2Jhc2VkX3RyYW5zZmVyKHRzZCwgdCk7CiB9CiAKLXN0YXRpYyBpbnQgdGVncmFfc2ZsYXNoX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IHRlZ3JhX3NmbGFzaF9kYXRhICp0c2QgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQotCS8qIFNldCBzcGVlZCB0byB0aGUgc3BpIG1heCBmZXF1ZW5jeSBpZiBzcGkgZGV2aWNlIGhhcyBub3Qgc2V0ICovCi0Jc3BpLT5tYXhfc3BlZWRfaHogPSBzcGktPm1heF9zcGVlZF9oeiA/IDogdHNkLT5zcGlfbWF4X2ZyZXF1ZW5jeTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCB0ZWdyYV9zZmxhc2hfdHJhbnNmZXJfb25lX21lc3NhZ2Uoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKIAkJCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQogewpAQCAtNDMwLDE1ICs0MTksNiBAQAogCXJldHVybiBoYW5kbGVfY3B1X2Jhc2VkX3hmZXIodHNkKTsKIH0KIAotc3RhdGljIHZvaWQgdGVncmFfc2ZsYXNoX3BhcnNlX2R0KHN0cnVjdCB0ZWdyYV9zZmxhc2hfZGF0YSAqdHNkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSB0c2QtPmRldi0+b2Zfbm9kZTsKLQotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInNwaS1tYXgtZnJlcXVlbmN5IiwKLQkJCQkJJnRzZC0+c3BpX21heF9mcmVxdWVuY3kpKQotCQl0c2QtPnNwaV9tYXhfZnJlcXVlbmN5ID0gMjUwMDAwMDA7IC8qIDI1TUh6ICovCi19Ci0KIHN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRlZ3JhX3NmbGFzaF9vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtc2ZsYXNoIiwgfSwKIAl7fQpAQCAtNDY3LDExICs0NDcsOSBAQAogCiAJLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBOwotCW1hc3Rlci0+c2V0dXAgPSB0ZWdyYV9zZmxhc2hfc2V0dXA7CiAJbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IHRlZ3JhX3NmbGFzaF90cmFuc2Zlcl9vbmVfbWVzc2FnZTsKIAltYXN0ZXItPmF1dG9fcnVudGltZV9wbSA9IHRydWU7CiAJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IE1BWF9DSElQX1NFTEVDVDsKLQltYXN0ZXItPmJ1c19udW0gPSAtMTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1hc3Rlcik7CiAJdHNkID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwpAQCAtNDc5LDcgKzQ1Nyw5IEBACiAJdHNkLT5kZXYgPSAmcGRldi0+ZGV2OwogCXNwaW5fbG9ja19pbml0KCZ0c2QtPmxvY2spOwogCi0JdGVncmFfc2ZsYXNoX3BhcnNlX2R0KHRzZCk7CisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHRzZC0+ZGV2LT5vZl9ub2RlLCAic3BpLW1heC1mcmVxdWVuY3kiLAorCQkJCSAmbWFzdGVyLT5tYXhfc3BlZWRfaHopKQorCQltYXN0ZXItPm1heF9zcGVlZF9oeiA9IDI1MDAwMDAwOyAvKiAyNU1IeiAqLwogCiAJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJdHNkLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXRlZ3JhMjAtc2xpbmsuYyBiL2RyaXZlcnMvc3BpL3NwaS10ZWdyYTIwLXNsaW5rLmMKaW5kZXggYmUzYTA2OS4uZTNjMWI5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXRlZ3JhMjAtc2xpbmsuYworKysgYi9kcml2ZXJzL3NwaS9zcGktdGVncmEyMC1zbGluay5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xNzEsNyArMTcwLDYgQEAKIAl2b2lkIF9faW9tZW0JCQkJKmJhc2U7CiAJcGh5c19hZGRyX3QJCQkJcGh5czsKIAl1bnNpZ25lZAkJCQlpcnE7Ci0JdTMyCQkJCQlzcGlfbWF4X2ZyZXF1ZW5jeTsKIAl1MzIJCQkJCWN1cl9zcGVlZDsKIAogCXN0cnVjdCBzcGlfZGV2aWNlCQkJKmN1cl9zcGk7CkBAIC03NjEsMTAgKzc1OSw2IEBACiAJCXNwaS0+bW9kZSAmIFNQSV9DUEhBID8gIiIgOiAifiIsCiAJCXNwaS0+bWF4X3NwZWVkX2h6KTsKIAotCUJVR19PTihzcGktPmNoaXBfc2VsZWN0ID49IE1BWF9DSElQX1NFTEVDVCk7Ci0KLQkvKiBTZXQgc3BlZWQgdG8gdGhlIHNwaSBtYXggZmVxdWVuY3kgaWYgc3BpIGRldmljZSBoYXMgbm90IHNldCAqLwotCXNwaS0+bWF4X3NwZWVkX2h6ID0gc3BpLT5tYXhfc3BlZWRfaHogPyA6IHRzcGktPnNwaV9tYXhfZnJlcXVlbmN5OwogCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmModHNwaS0+ZGV2KTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKHRzcGktPmRldiwgInBtIHJ1bnRpbWUgZmFpbGVkLCBlID0gJWRcbiIsIHJldCk7CkBAIC05OTksMTUgKzk5Myw2IEBACiAJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKIH0KIAotc3RhdGljIHZvaWQgdGVncmFfc2xpbmtfcGFyc2VfZHQoc3RydWN0IHRlZ3JhX3NsaW5rX2RhdGEgKnRzcGkpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IHRzcGktPmRldi0+b2Zfbm9kZTsKLQotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInNwaS1tYXgtZnJlcXVlbmN5IiwKLQkJCQkJJnRzcGktPnNwaV9tYXhfZnJlcXVlbmN5KSkKLQkJdHNwaS0+c3BpX21heF9mcmVxdWVuY3kgPSAyNTAwMDAwMDsgLyogMjVNSHogKi8KLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9zbGlua19jaGlwX2RhdGEgdGVncmEzMF9zcGlfY2RhdGEgPSB7CiAJLmNzX2hvbGRfdGltZSA9IHRydWUsCiB9OwpAQCAtMTA1Myw3ICsxMDM4LDYgQEAKIAltYXN0ZXItPnVucHJlcGFyZV9tZXNzYWdlID0gdGVncmFfc2xpbmtfdW5wcmVwYXJlX21lc3NhZ2U7CiAJbWFzdGVyLT5hdXRvX3J1bnRpbWVfcG0gPSB0cnVlOwogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBNQVhfQ0hJUF9TRUxFQ1Q7Ci0JbWFzdGVyLT5idXNfbnVtID0gLTE7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOwogCXRzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CkBAIC0xMDYyLDcgKzEwNDYsOSBAQAogCXRzcGktPmNoaXBfZGF0YSA9IGNkYXRhOwogCXNwaW5fbG9ja19pbml0KCZ0c3BpLT5sb2NrKTsKIAotCXRlZ3JhX3NsaW5rX3BhcnNlX2R0KHRzcGkpOworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMih0c3BpLT5kZXYtPm9mX25vZGUsICJzcGktbWF4LWZyZXF1ZW5jeSIsCisJCQkJICZtYXN0ZXItPm1heF9zcGVlZF9oeikpCisJCW1hc3Rlci0+bWF4X3NwZWVkX2h6ID0gMjUwMDAwMDA7IC8qIDI1TUh6ICovCiAKIAlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpZiAoIXIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS10aS1xc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktdGktcXNwaS5jCmluZGV4IDNkMDkyNjUuLjZjMjExZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS10aS1xc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXRpLXFzcGkuYwpAQCAtNDI5LDEzICs0MjksMTMgQEAKIAogCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9SWF9EVUFMIHwgU1BJX1JYX1FVQUQ7CiAKLQltYXN0ZXItPmJ1c19udW0gPSAtMTsKIAltYXN0ZXItPmZsYWdzID0gU1BJX01BU1RFUl9IQUxGX0RVUExFWDsKIAltYXN0ZXItPnNldHVwID0gdGlfcXNwaV9zZXR1cDsKIAltYXN0ZXItPmF1dG9fcnVudGltZV9wbSA9IHRydWU7CiAJbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IHRpX3FzcGlfc3RhcnRfdHJhbnNmZXJfb25lOwogCW1hc3Rlci0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKLQltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IEJJVCgzMiAtIDEpIHwgQklUKDE2IC0gMSkgfCBCSVQoOCAtIDEpOworCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19NQVNLKDMyKSB8IFNQSV9CUFdfTUFTSygxNikgfAorCQkJCSAgICAgU1BJX0JQV19NQVNLKDgpOwogCiAJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgIm51bS1jcyIsICZudW1fY3MpKQogCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gbnVtX2NzOwpAQCAtNDYxLDcgKzQ2MSw2IEBACiAJCWlmIChyZXNfbW1hcCA9PSBOVUxMKSB7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkJIm1lbW9yeSBtYXBwZWQgcmVzb3VyY2Ugbm90IHJlcXVpcmVkXG4iKTsKLQkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktdGktc3NwLmMgYi9kcml2ZXJzL3NwaS9zcGktdGktc3NwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMjBlMTIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXRpLXNzcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qCi0gKiBTZXF1ZW5jZXIgU2VyaWFsIFBvcnQgKFNTUCkgYmFzZWQgU1BJIG1hc3RlciBkcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3RpX3NzcC5oPgotCi0jZGVmaW5lIE1PREVfQklUUwkoU1BJX0NQSEEgfCBTUElfQ1BPTCB8IFNQSV9DU19ISUdIKQotCi1zdHJ1Y3QgdGlfc3NwX3NwaSB7Ci0Jc3RydWN0IHNwaV9tYXN0ZXIJCSptYXN0ZXI7Ci0Jc3RydWN0IGRldmljZQkJCSpkZXY7Ci0Jc3BpbmxvY2tfdAkJCWxvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJbXNnX3F1ZXVlOwotCXN0cnVjdCBjb21wbGV0aW9uCQljb21wbGV0ZTsKLQlib29sCQkJCXNodXRkb3duOwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0CQkqd29ya3F1ZXVlOwotCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29yazsKLQl1OAkJCQltb2RlLCBicHc7Ci0JaW50CQkJCWNzX2FjdGl2ZTsKLQl1MzIJCQkJcGNfZW4sIHBjX2RpcywgcGNfd3IsIHBjX3JkOwotCXZvaWQJCQkJKCpzZWxlY3QpKGludCBjcyk7Ci19OwotCi1zdGF0aWMgdTMyIHRpX3NzcF9zcGlfcngoc3RydWN0IHRpX3NzcF9zcGkgKmh3KQotewotCXUzMiByZXQ7Ci0KLQl0aV9zc3BfcnVuKGh3LT5kZXYsIGh3LT5wY19yZCwgMCwgJnJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgdGlfc3NwX3NwaV90eChzdHJ1Y3QgdGlfc3NwX3NwaSAqaHcsIHUzMiBkYXRhKQotewotCXRpX3NzcF9ydW4oaHctPmRldiwgaHctPnBjX3dyLCBkYXRhIDw8ICgzMiAtIGh3LT5icHcpLCBOVUxMKTsKLX0KLQotc3RhdGljIGludCB0aV9zc3Bfc3BpX3R4cngoc3RydWN0IHRpX3NzcF9zcGkgKmh3LCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZywKLQkJICAgICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCi17Ci0JaW50IGNvdW50OwotCi0JaWYgKGh3LT5icHcgPD0gOCkgewotCQl1OAkJKnJ4ID0gdC0+cnhfYnVmOwotCQljb25zdCB1OAkqdHggPSB0LT50eF9idWY7Ci0KLQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgdC0+bGVuOyBjb3VudCArPSAxKSB7Ci0JCQlpZiAodC0+dHhfYnVmKQotCQkJCXRpX3NzcF9zcGlfdHgoaHcsICp0eCsrKTsKLQkJCWlmICh0LT5yeF9idWYpCi0JCQkJKnJ4KysgPSB0aV9zc3Bfc3BpX3J4KGh3KTsKLQkJfQotCX0gZWxzZSBpZiAoaHctPmJwdyA8PSAxNikgewotCQl1MTYJCSpyeCA9IHQtPnJ4X2J1ZjsKLQkJY29uc3QgdTE2CSp0eCA9IHQtPnR4X2J1ZjsKLQotCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCB0LT5sZW47IGNvdW50ICs9IDIpIHsKLQkJCWlmICh0LT50eF9idWYpCi0JCQkJdGlfc3NwX3NwaV90eChodywgKnR4KyspOwotCQkJaWYgKHQtPnJ4X2J1ZikKLQkJCQkqcngrKyA9IHRpX3NzcF9zcGlfcngoaHcpOwotCQl9Ci0JfSBlbHNlIHsKLQkJdTMyCQkqcnggPSB0LT5yeF9idWY7Ci0JCWNvbnN0IHUzMgkqdHggPSB0LT50eF9idWY7Ci0KLQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgdC0+bGVuOyBjb3VudCArPSA0KSB7Ci0JCQlpZiAodC0+dHhfYnVmKQotCQkJCXRpX3NzcF9zcGlfdHgoaHcsICp0eCsrKTsKLQkJCWlmICh0LT5yeF9idWYpCi0JCQkJKnJ4KysgPSB0aV9zc3Bfc3BpX3J4KGh3KTsKLQkJfQotCX0KLQotCW1zZy0+YWN0dWFsX2xlbmd0aCArPSBjb3VudDsgLyogYnl0ZXMgdHJhbnNmZXJyZWQgKi8KLQotCWRldl9kYmcoJm1zZy0+c3BpLT5kZXYsICJ4ZmVyICVzJXMsICVkIGJ5dGVzLCAlZCBicHcsIGNvdW50ICVkJXNcbiIsCi0JCXQtPnR4X2J1ZiA/ICJ0eCIgOiAiIiwgdC0+cnhfYnVmID8gInJ4IiA6ICIiLCB0LT5sZW4sCi0JCWh3LT5icHcsIGNvdW50LCAoY291bnQgPCB0LT5sZW4pID8gIiAodW5kZXIpIiA6ICIiKTsKLQotCXJldHVybiAoY291bnQgPCB0LT5sZW4pID8gLUVJTyA6IDA7IC8qIGxlZnQgb3ZlciBkYXRhICovCi19Ci0KLXN0YXRpYyB2b2lkIHRpX3NzcF9zcGlfY2hpcF9zZWxlY3Qoc3RydWN0IHRpX3NzcF9zcGkgKmh3LCBpbnQgY3NfYWN0aXZlKQotewotCWNzX2FjdGl2ZSA9ICEhY3NfYWN0aXZlOwotCWlmIChjc19hY3RpdmUgPT0gaHctPmNzX2FjdGl2ZSkKLQkJcmV0dXJuOwotCXRpX3NzcF9ydW4oaHctPmRldiwgY3NfYWN0aXZlID8gaHctPnBjX2VuIDogaHctPnBjX2RpcywgMCwgTlVMTCk7Ci0JaHctPmNzX2FjdGl2ZSA9IGNzX2FjdGl2ZTsKLX0KLQotI2RlZmluZSBfX1NISUZUX09VVChiaXRzKQkoU1NQX09QQ09ERV9TSElGVCB8IFNTUF9PVVRfTU9ERSB8IFwKLQkJCQkgY3NfZW4gfCBjbGsgfCBTU1BfQ09VTlQoKGJpdHMpICogMiAtIDEpKQotI2RlZmluZSBfX1NISUZUX0lOKGJpdHMpCShTU1BfT1BDT0RFX1NISUZUIHwgU1NQX0lOX01PREUgIHwgXAotCQkJCSBjc19lbiB8IGNsayB8IFNTUF9DT1VOVCgoYml0cykgKiAyIC0gMSkpCi0KLXN0YXRpYyBpbnQgdGlfc3NwX3NwaV9zZXR1cF90cmFuc2ZlcihzdHJ1Y3QgdGlfc3NwX3NwaSAqaHcsIHU4IGJwdywgdTggbW9kZSkKLXsKLQlpbnQgZXJyb3IsIGlkeCA9IDA7Ci0JdTMyIHNlcXJhbVsxNl07Ci0JdTMyIGNzX2VuLCBjc19kaXMsIGNsazsKLQl1MzIgdG9wYml0cywgYm90Yml0czsKLQotCW1vZGUgJj0gTU9ERV9CSVRTOwotCWlmIChtb2RlID09IGh3LT5tb2RlICYmIGJwdyA9PSBody0+YnB3KQotCQlyZXR1cm4gMDsKLQotCWNzX2VuICA9IChtb2RlICYgU1BJX0NTX0hJR0gpID8gU1NQX0NTX0hJR0ggOiBTU1BfQ1NfTE9XOwotCWNzX2RpcyA9IChtb2RlICYgU1BJX0NTX0hJR0gpID8gU1NQX0NTX0xPVyAgOiBTU1BfQ1NfSElHSDsKLQljbGsgICAgPSAobW9kZSAmIFNQSV9DUE9MKSAgICA/IFNTUF9DTEtfSElHSCA6IFNTUF9DTEtfTE9XOwotCi0JLyogQ29uc3RydWN0IGluc3RydWN0aW9ucyAqLwotCi0JLyogRGlzYWJsZSBDaGlwIFNlbGVjdCAqLwotCWh3LT5wY19kaXMgPSBpZHg7Ci0Jc2VxcmFtW2lkeCsrXSA9IFNTUF9PUENPREVfRElSRUNUIHwgU1NQX09VVF9NT0RFIHwgY3NfZGlzIHwgY2xrOwotCXNlcXJhbVtpZHgrK10gPSBTU1BfT1BDT0RFX1NUT1AgICB8IFNTUF9PVVRfTU9ERSB8IGNzX2RpcyB8IGNsazsKLQotCS8qIEVuYWJsZSBDaGlwIFNlbGVjdCAqLwotCWh3LT5wY19lbiA9IGlkeDsKLQlzZXFyYW1baWR4KytdID0gU1NQX09QQ09ERV9ESVJFQ1QgfCBTU1BfT1VUX01PREUgfCBjc19lbiB8IGNsazsKLQlzZXFyYW1baWR4KytdID0gU1NQX09QQ09ERV9TVE9QICAgfCBTU1BfT1VUX01PREUgfCBjc19lbiB8IGNsazsKLQotCS8qIFJlYWRzIGFuZCB3cml0ZXMgbmVlZCB0byBiZSBzcGxpdCBmb3IgYnB3ID4gMTYgKi8KLQl0b3BiaXRzID0gKGJwdyA+IDE2KSA/IDE2IDogYnB3OwotCWJvdGJpdHMgPSBicHcgLSB0b3BiaXRzOwotCi0JLyogV3JpdGUgKi8KLQlody0+cGNfd3IgPSBpZHg7Ci0Jc2VxcmFtW2lkeCsrXSA9IF9fU0hJRlRfT1VUKHRvcGJpdHMpIHwgU1NQX0FERFJfUkVHOwotCWlmIChib3RiaXRzKQotCQlzZXFyYW1baWR4KytdID0gX19TSElGVF9PVVQoYm90Yml0cykgIHwgU1NQX0RBVEFfUkVHOwotCXNlcXJhbVtpZHgrK10gPSBTU1BfT1BDT0RFX1NUT1AgfCBTU1BfT1VUX01PREUgfCBjc19lbiB8IGNsazsKLQotCS8qIFJlYWQgKi8KLQlody0+cGNfcmQgPSBpZHg7Ci0JaWYgKGJvdGJpdHMpCi0JCXNlcXJhbVtpZHgrK10gPSBfX1NISUZUX0lOKGJvdGJpdHMpIHwgU1NQX0FERFJfUkVHOwotCXNlcXJhbVtpZHgrK10gPSBfX1NISUZUX0lOKHRvcGJpdHMpIHwgU1NQX0RBVEFfUkVHOwotCXNlcXJhbVtpZHgrK10gPSBTU1BfT1BDT0RFX1NUT1AgfCBTU1BfT1VUX01PREUgfCBjc19lbiB8IGNsazsKLQotCWVycm9yID0gdGlfc3NwX2xvYWQoaHctPmRldiwgMCwgc2VxcmFtLCBpZHgpOwotCWlmIChlcnJvciA8IDApCi0JCXJldHVybiBlcnJvcjsKLQotCWVycm9yID0gdGlfc3NwX3NldF9tb2RlKGh3LT5kZXYsICgobW9kZSAmIFNQSV9DUEhBKSA/Ci0JCQkJCSAgMCA6IFNTUF9FQVJMWV9ESU4pKTsKLQlpZiAoZXJyb3IgPCAwKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQlody0+YnB3ID0gYnB3OwotCWh3LT5tb2RlID0gbW9kZTsKLQotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIHZvaWQgdGlfc3NwX3NwaV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgdGlfc3NwX3NwaSAqaHcgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHRpX3NzcF9zcGksIHdvcmspOwotCi0Jc3Bpbl9sb2NrKCZody0+bG9jayk7Ci0KLQkgd2hpbGUgKCFsaXN0X2VtcHR5KCZody0+bXNnX3F1ZXVlKSkgewotCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UJKm07Ci0JCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGk7Ci0JCXN0cnVjdCBzcGlfdHJhbnNmZXIJKnQgPSBOVUxMOwotCQlpbnQJCQlzdGF0dXMgPSAwOwotCi0JCW0gPSBjb250YWluZXJfb2YoaHctPm1zZ19xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc3BpX21lc3NhZ2UsCi0JCQkJIHF1ZXVlKTsKLQotCQlsaXN0X2RlbF9pbml0KCZtLT5xdWV1ZSk7Ci0KLQkJc3Bpbl91bmxvY2soJmh3LT5sb2NrKTsKLQotCQlzcGkgPSBtLT5zcGk7Ci0KLQkJaWYgKGh3LT5zZWxlY3QpCi0JCQlody0+c2VsZWN0KHNwaS0+Y2hpcF9zZWxlY3QpOwotCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCQkJaW50IGJwdyA9IHNwaS0+Yml0c19wZXJfd29yZDsKLQkJCWludCB4ZmVyX3N0YXR1czsKLQotCQkJaWYgKHQtPmJpdHNfcGVyX3dvcmQpCi0JCQkJYnB3ID0gdC0+Yml0c19wZXJfd29yZDsKLQotCQkJaWYgKHRpX3NzcF9zcGlfc2V0dXBfdHJhbnNmZXIoaHcsIGJwdywgc3BpLT5tb2RlKSA8IDApCi0JCQkJYnJlYWs7Ci0KLQkJCXRpX3NzcF9zcGlfY2hpcF9zZWxlY3QoaHcsIDEpOwotCi0JCQl4ZmVyX3N0YXR1cyA9IHRpX3NzcF9zcGlfdHhyeChodywgbSwgdCk7Ci0JCQlpZiAoeGZlcl9zdGF0dXMgPCAwKQotCQkJCXN0YXR1cyA9IHhmZXJfc3RhdHVzOwotCi0JCQlpZiAodC0+ZGVsYXlfdXNlY3MpCi0JCQkJdWRlbGF5KHQtPmRlbGF5X3VzZWNzKTsKLQotCQkJaWYgKHQtPmNzX2NoYW5nZSkKLQkJCQl0aV9zc3Bfc3BpX2NoaXBfc2VsZWN0KGh3LCAwKTsKLQkJfQotCi0JCXRpX3NzcF9zcGlfY2hpcF9zZWxlY3QoaHcsIDApOwotCQltLT5zdGF0dXMgPSBzdGF0dXM7Ci0JCW0tPmNvbXBsZXRlKG0tPmNvbnRleHQpOwotCi0JCXNwaW5fbG9jaygmaHctPmxvY2spOwotCX0KLQotCWlmIChody0+c2h1dGRvd24pCi0JCWNvbXBsZXRlKCZody0+Y29tcGxldGUpOwotCi0Jc3Bpbl91bmxvY2soJmh3LT5sb2NrKTsKLX0KLQotc3RhdGljIGludCB0aV9zc3Bfc3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKLXsKLQlzdHJ1Y3QgdGlfc3NwX3NwaQkqaHc7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlcgkqdDsKLQlpbnQJCQllcnJvciA9IDA7Ci0KLQltLT5hY3R1YWxfbGVuZ3RoID0gMDsKLQltLT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7Ci0KLQlodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCi0JaWYgKGxpc3RfZW1wdHkoJm0tPnRyYW5zZmVycykgfHwgIW0tPmNvbXBsZXRlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCQlpZiAodC0+bGVuICYmICEodC0+cnhfYnVmIHx8IHQtPnR4X2J1ZikpIHsKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiaW52YWxpZCB4ZmVyLCBubyBidWZmZXJcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAodC0+bGVuICYmIHQtPnJ4X2J1ZiAmJiB0LT50eF9idWYpIHsKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiaW52YWxpZCB4ZmVyLCBmdWxsIGR1cGxleFxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCXNwaW5fbG9jaygmaHctPmxvY2spOwotCWlmIChody0+c2h1dGRvd24pIHsKLQkJZXJyb3IgPSAtRVNIVVRET1dOOwotCQlnb3RvIGVycm9yX3VubG9jazsKLQl9Ci0JbGlzdF9hZGRfdGFpbCgmbS0+cXVldWUsICZody0+bXNnX3F1ZXVlKTsKLQlxdWV1ZV93b3JrKGh3LT53b3JrcXVldWUsICZody0+d29yayk7Ci1lcnJvcl91bmxvY2s6Ci0Jc3Bpbl91bmxvY2soJmh3LT5sb2NrKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyBpbnQgdGlfc3NwX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWNvbnN0IHN0cnVjdCB0aV9zc3Bfc3BpX2RhdGEgKnBkYXRhOwotCXN0cnVjdCB0aV9zc3Bfc3BpICpodzsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0JaW50IGVycm9yID0gMDsKLQotCXBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOwotCWlmICghcGRhdGEpIHsKLQkJZGV2X2VycihkZXYsICJwbGF0Zm9ybSBkYXRhIG5vdCBmb3VuZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoZGV2LCBzaXplb2Yoc3RydWN0IHRpX3NzcF9zcGkpKTsKLQlpZiAoIW1hc3RlcikgewotCQlkZXZfZXJyKGRldiwgImNhbm5vdCBhbGxvY2F0ZSBTUEkgbWFzdGVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaHcpOwotCi0JaHctPm1hc3RlciA9IG1hc3RlcjsKLQlody0+ZGV2ID0gZGV2OwotCWh3LT5zZWxlY3QgPSBwZGF0YS0+c2VsZWN0OwotCi0Jc3Bpbl9sb2NrX2luaXQoJmh3LT5sb2NrKTsKLQlpbml0X2NvbXBsZXRpb24oJmh3LT5jb21wbGV0ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmh3LT5tc2dfcXVldWUpOwotCUlOSVRfV09SSygmaHctPndvcmssIHRpX3NzcF9zcGlfd29yayk7Ci0KLQlody0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoZGV2X25hbWUoZGV2KSk7Ci0JaWYgKCFody0+d29ya3F1ZXVlKSB7Ci0JCWVycm9yID0gLUVOT01FTTsKLQkJZGV2X2VycihkZXYsICJ3b3JrIHF1ZXVlIGNyZWF0aW9uIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyb3Jfd3E7Ci0JfQotCi0JZXJyb3IgPSB0aV9zc3Bfc2V0X2lvc2VsKGh3LT5kZXYsIHBkYXRhLT5pb3NlbCk7Ci0JaWYgKGVycm9yIDwgMCkgewotCQlkZXZfZXJyKGRldiwgImlvIHNldHVwIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyb3JfaW9zZWw7Ci0JfQotCi0JbWFzdGVyLT5idXNfbnVtCQk9IHBkZXYtPmlkOwotCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QJPSBwZGF0YS0+bnVtX2NzOwotCW1hc3Rlci0+bW9kZV9iaXRzCT0gTU9ERV9CSVRTOwotCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19SQU5HRV9NQVNLKDEsIDMyKTsKLQltYXN0ZXItPmZsYWdzCQk9IFNQSV9NQVNURVJfSEFMRl9EVVBMRVg7Ci0JbWFzdGVyLT50cmFuc2Zlcgk9IHRpX3NzcF9zcGlfdHJhbnNmZXI7Ci0KLQllcnJvciA9IHNwaV9yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKLQlpZiAoZXJyb3IpIHsKLQkJZGV2X2VycihkZXYsICJtYXN0ZXIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyb3JfcmVnOwotCX0KLQotCXJldHVybiAwOwotCi1lcnJvcl9yZWc6Ci1lcnJvcl9pb3NlbDoKLQlkZXN0cm95X3dvcmtxdWV1ZShody0+d29ya3F1ZXVlKTsKLWVycm9yX3dxOgotCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7Ci0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgaW50IHRpX3NzcF9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHRpX3NzcF9zcGkgKmh3ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IGVycm9yOwotCi0JaHctPnNodXRkb3duID0gMTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmh3LT5tc2dfcXVldWUpKSB7Ci0JCWVycm9yID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZody0+Y29tcGxldGUpOwotCQlpZiAoZXJyb3IgPCAwKSB7Ci0JCQlody0+c2h1dGRvd24gPSAwOwotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0JfQotCWRlc3Ryb3lfd29ya3F1ZXVlKGh3LT53b3JrcXVldWUpOwotCXNwaV91bnJlZ2lzdGVyX21hc3Rlcihody0+bWFzdGVyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0aV9zc3Bfc3BpX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gdGlfc3NwX3NwaV9wcm9iZSwKLQkucmVtb3ZlCQk9IHRpX3NzcF9zcGlfcmVtb3ZlLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJ0aS1zc3Atc3BpIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHRpX3NzcF9zcGlfZHJpdmVyKTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJTU1AgU1BJIE1hc3RlciIpOwotTU9EVUxFX0FVVEhPUigiQ3lyaWwgQ2hlbXBhcmF0aHkiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06dGktc3NwLXNwaSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXRvcGNsaWZmLXBjaC5jIGIvZHJpdmVycy9zcGkvc3BpLXRvcGNsaWZmLXBjaC5jCmluZGV4IDg4ZWI1N2UuLmY0MDZiMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS10b3BjbGlmZi1wY2guYworKysgYi9kcml2ZXJzL3NwaS9zcGktdG9wY2xpZmYtcGNoLmMKQEAgLTMzMiw3ICszMzIsNyBAQAogCQkJCWRhdGEtPnRyYW5zZmVyX2FjdGl2ZSA9IGZhbHNlOwogCQkJCXdha2VfdXAoJmRhdGEtPndhaXQpOwogCQkJfSBlbHNlIHsKLQkJCQlkZXZfZXJyKCZkYXRhLT5tYXN0ZXItPmRldiwKKwkJCQlkZXZfdmRiZygmZGF0YS0+bWFzdGVyLT5kZXYsCiAJCQkJCSIlcyA6IFRyYW5zZmVyIGlzIG5vdCBjb21wbGV0ZWQiLAogCQkJCQlfX2Z1bmNfXyk7CiAJCQl9CkBAIC00NjQsMjAgKzQ2NCw2IEBACiAJcGNoX3NwaV93cml0ZXJlZyhtYXN0ZXIsIFBDSF9TUlNULCAweDApOwogfQogCi1zdGF0aWMgaW50IHBjaF9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnBzcGkpCi17Ci0JLyogQ2hlY2sgYmF1ZCByYXRlIHNldHRpbmcgKi8KLQkvKiBpZiBiYXVkIHJhdGUgb2YgY2hpcCBpcyBncmVhdGVyIHRoYW4KLQkgICBtYXggd2UgY2FuIHN1cHBvcnQscmV0dXJuIGVycm9yICovCi0JaWYgKChwc3BpLT5tYXhfc3BlZWRfaHopID4gUENIX01BWF9CQVVEUkFURSkKLQkJcHNwaS0+bWF4X3NwZWVkX2h6ID0gUENIX01BWF9CQVVEUkFURTsKLQotCWRldl9kYmcoJnBzcGktPmRldiwgIiVzIE1PREUgPSAleFxuIiwgX19mdW5jX18sCi0JCShwc3BpLT5tb2RlKSAmIChTUElfQ1BPTCB8IFNQSV9DUEhBKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBwY2hfc3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpwc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKnBtc2cpCiB7CiAKQEAgLTQ4NiwyMyArNDcyLDYgQEAKIAlpbnQgcmV0dmFsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkvKiB2YWxpZGF0ZSBzcGkgbWVzc2FnZSBhbmQgYmF1ZCByYXRlICovCi0JaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJnBtc2ctPnRyYW5zZmVycykgPT0gMSkpIHsKLQkJZGV2X2VycigmcHNwaS0+ZGV2LCAiJXMgbGlzdCBlbXB0eVxuIiwgX19mdW5jX18pOwotCQlyZXR2YWwgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQotCi0JaWYgKHVubGlrZWx5KHBzcGktPm1heF9zcGVlZF9oeiA9PSAwKSkgewotCQlkZXZfZXJyKCZwc3BpLT5kZXYsICIlcyBwY2hfc3BpX3RyYW5zZmVyIG1heHNwZWVkPSVkXG4iLAotCQkJX19mdW5jX18sIHBzcGktPm1heF9zcGVlZF9oeik7Ci0JCXJldHZhbCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQlkZXZfZGJnKCZwc3BpLT5kZXYsCi0JCSIlcyBUcmFuc2ZlciBMaXN0IG5vdCBlbXB0eS4gVHJhbnNmZXIgU3BlZWQgaXMgc2V0LlxuIiwgX19mdW5jX18pOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGEtPmxvY2ssIGZsYWdzKTsKIAkvKiB2YWxpZGF0ZSBUeC9SeCBidWZmZXJzIGFuZCBUcmFuc2ZlciBsZW5ndGggKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyYW5zZmVyLCAmcG1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CkBAIC01MjMsMTAgKzQ5Miw2IEBACiAJCWRldl9kYmcoJnBzcGktPmRldiwKIAkJCSIlcyBUeC9SeCBidWZmZXIgdmFsaWQuIFRyYW5zZmVyIGxlbmd0aCB2YWxpZFxuIiwKIAkJCV9fZnVuY19fKTsKLQotCQkvKiBpZiBiYXVkIHJhdGUgaGFzIGJlZW4gc3BlY2lmaWVkIHZhbGlkYXRlIHRoZSBzYW1lICovCi0JCWlmICh0cmFuc2Zlci0+c3BlZWRfaHogPiBQQ0hfTUFYX0JBVURSQVRFKQotCQkJdHJhbnNmZXItPnNwZWVkX2h6ID0gUENIX01BWF9CQVVEUkFURTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YS0+bG9jaywgZmxhZ3MpOwogCkBAIC0xMTUxLDggKzExMTYsNyBAQAogCWRtYS0+bmVudCA9IG51bTsKIAlkbWEtPmRlc2NfdHggPSBkZXNjX3R4OwogCi0JZGV2X2RiZygmZGF0YS0+bWFzdGVyLT5kZXYsICJcbiVzOlB1bGxpbmcgZG93biBTU04gbG93IC0gd3JpdGluZyAiCi0JCSIweDIgdG8gU1NOWENSXG4iLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmZGF0YS0+bWFzdGVyLT5kZXYsICIlczpQdWxsaW5nIGRvd24gU1NOIGxvdyAtIHdyaXRpbmcgMHgyIHRvIFNTTlhDUlxuIiwgX19mdW5jX18pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGEtPmxvY2ssIGZsYWdzKTsKIAlwY2hfc3BpX3dyaXRlcmVnKGRhdGEtPm1hc3RlciwgUENIX1NTTlhDUiwgU1NOX0xPVyk7CkBAIC0xNDE4LDEwICsxMzgyLDEwIEBACiAKIAkvKiBpbml0aWFsaXplIG1lbWJlcnMgb2YgU1BJIG1hc3RlciAqLwogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBQQ0hfTUFYX0NTOwotCW1hc3Rlci0+c2V0dXAgPSBwY2hfc3BpX3NldHVwOwogCW1hc3Rlci0+dHJhbnNmZXIgPSBwY2hfc3BpX3RyYW5zZmVyOwogCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9MU0JfRklSU1Q7CiAJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soOCkgfCBTUElfQlBXX01BU0soMTYpOworCW1hc3Rlci0+bWF4X3NwZWVkX2h6ID0gUENIX01BWF9CQVVEUkFURTsKIAogCWRhdGEtPmJvYXJkX2RhdCA9IGJvYXJkX2RhdDsKIAlkYXRhLT5wbGF0X2RldiA9IHBsYXRfZGV2OwpAQCAtMTYwNSw4ICsxNTY5LDcgQEAKIAkucmVzdW1lID0gcGNoX3NwaV9wZF9yZXN1bWUKIH07CiAKLXN0YXRpYyBpbnQgcGNoX3NwaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCitzdGF0aWMgaW50IHBjaF9zcGlfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgcGNoX3NwaV9ib2FyZF9kYXRhICpib2FyZF9kYXQ7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRfZGV2ID0gTlVMTDsKQEAgLTE2NzYsNiArMTYzOSw4IEBACiAJcmV0dXJuIDA7CiAKIGVycl9wbGF0Zm9ybV9kZXZpY2U6CisJd2hpbGUgKC0taSA+PSAwKQorCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZF9kZXZfc2F2ZS0+cGRfc2F2ZVtpXSk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogcGNpX2VuYWJsZV9kZXZpY2U6CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS10eHg5LmMgYi9kcml2ZXJzL3NwaS9zcGktdHh4OS5jCmluZGV4IDYxOTFjZWQuLjgyMGI0OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS10eHg5LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXR4eDkuYwpAQCAtODAsNyArODAsNiBAQAogCXZvaWQgX19pb21lbSAqbWVtYmFzZTsKIAlpbnQgYmFzZWNsazsKIAlzdHJ1Y3QgY2xrICpjbGs7Ci0JdTMyIG1heF9zcGVlZF9oeiwgbWluX3NwZWVkX2h6OwogCWludCBsYXN0X2NoaXBzZWxlY3Q7CiAJaW50IGxhc3RfY2hpcHNlbGVjdF92YWw7CiB9OwpAQCAtMTE3LDkgKzExNiw3IEBACiB7CiAJc3RydWN0IHR4eDlzcGkgKmMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKIAotCWlmICghc3BpLT5tYXhfc3BlZWRfaHoKLQkJCXx8IHNwaS0+bWF4X3NwZWVkX2h6ID4gYy0+bWF4X3NwZWVkX2h6Ci0JCQl8fCBzcGktPm1heF9zcGVlZF9oeiA8IGMtPm1pbl9zcGVlZF9oeikKKwlpZiAoIXNwaS0+bWF4X3NwZWVkX2h6KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3BpLT5jaGlwX3NlbGVjdCwKQEAgLTMwOSwxNSArMzA2LDggQEAKIAogCS8qIGNoZWNrIGVhY2ggdHJhbnNmZXIncyBwYXJhbWV0ZXJzICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCXUzMiBzcGVlZF9oeiA9IHQtPnNwZWVkX2h6ID8gOiBzcGktPm1heF9zcGVlZF9oejsKLQkJdTggYml0c19wZXJfd29yZCA9IHQtPmJpdHNfcGVyX3dvcmQ7Ci0KIAkJaWYgKCF0LT50eF9idWYgJiYgIXQtPnJ4X2J1ZiAmJiB0LT5sZW4pCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHQtPmxlbiAmICgoYml0c19wZXJfd29yZCA+PiAzKSAtIDEpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChzcGVlZF9oeiA8IGMtPm1pbl9zcGVlZF9oeiB8fCBzcGVlZF9oeiA+IGMtPm1heF9zcGVlZF9oeikKLQkJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjLT5sb2NrLCBmbGFncyk7CkBAIC0zNjAsMTcgKzM1MCwxMiBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCWMtPmJhc2VjbGsgPSBjbGtfZ2V0X3JhdGUoYy0+Y2xrKTsKLQljLT5taW5fc3BlZWRfaHogPSBESVZfUk9VTkRfVVAoYy0+YmFzZWNsaywgU1BJX01BWF9ESVZJREVSICsgMSk7Ci0JYy0+bWF4X3NwZWVkX2h6ID0gYy0+YmFzZWNsayAvIChTUElfTUlOX0RJVklERVIgKyAxKTsKKwltYXN0ZXItPm1pbl9zcGVlZF9oeiA9IERJVl9ST1VORF9VUChjLT5iYXNlY2xrLCBTUElfTUFYX0RJVklERVIgKyAxKTsKKwltYXN0ZXItPm1heF9zcGVlZF9oeiA9IGMtPmJhc2VjbGsgLyAoU1BJX01JTl9ESVZJREVSICsgMSk7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyZXMpCi0JCWdvdG8gZXhpdF9idXN5OwotCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJmRldi0+ZGV2LCByZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksCi0JCQkJICAgICAic3BpX3R4eDkiKSkKLQkJZ290byBleGl0X2J1c3k7Ci0JYy0+bWVtYmFzZSA9IGRldm1faW9yZW1hcCgmZGV2LT5kZXYsIHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7Ci0JaWYgKCFjLT5tZW1iYXNlKQorCWMtPm1lbWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJmRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoYy0+bWVtYmFzZSkpCiAJCWdvdG8gZXhpdF9idXN5OwogCiAJLyogZW50ZXIgY29uZmlnIG1vZGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS14Y29tbS5jIGIvZHJpdmVycy9zcGkvc3BpLXhjb21tLmMKaW5kZXggMjRjNDBiMS4uYmI0NzhkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXhjb21tLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXhjb21tLmMKQEAgLTgsNyArOCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgpAQCAtNzQsMTUgKzczLDEzIEBACiBzdGF0aWMgaW50IHNwaV94Y29tbV9zZXR1cF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX3hjb21tICpzcGlfeGNvbW0sCiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCwgdW5zaWduZWQgaW50ICpzZXR0aW5ncykKIHsKLQl1bnNpZ25lZCBpbnQgc3BlZWQ7Ci0KIAlpZiAodC0+bGVuID4gNjIpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3BlZWQgPSB0LT5zcGVlZF9oeiA/IHQtPnNwZWVkX2h6IDogc3BpLT5tYXhfc3BlZWRfaHo7CisJaWYgKHQtPnNwZWVkX2h6ICE9IHNwaV94Y29tbS0+Y3VycmVudF9zcGVlZCkgeworCQl1bnNpZ25lZCBpbnQgZGl2aWRlcjsKIAotCWlmIChzcGVlZCAhPSBzcGlfeGNvbW0tPmN1cnJlbnRfc3BlZWQpIHsKLQkJdW5zaWduZWQgaW50IGRpdmlkZXIgPSBESVZfUk9VTkRfVVAoU1BJX1hDT01NX0NMT0NLLCBzcGVlZCk7CisJCWRpdmlkZXIgPSBESVZfUk9VTkRfVVAoU1BJX1hDT01NX0NMT0NLLCB0LT5zcGVlZF9oeik7CiAJCWlmIChkaXZpZGVyID49IDY0KQogCQkJKnNldHRpbmdzIHw9IFNQSV9YQ09NTV9TRVRUSU5HU19DTE9DS19ESVZfNjQ7CiAJCWVsc2UgaWYgKGRpdmlkZXIgPj0gMTYpCkBAIC05MCw3ICs4Nyw3IEBACiAJCWVsc2UKIAkJCSpzZXR0aW5ncyB8PSBTUElfWENPTU1fU0VUVElOR1NfQ0xPQ0tfRElWXzQ7CiAKLQkJc3BpX3hjb21tLT5jdXJyZW50X3NwZWVkID0gc3BlZWQ7CisJCXNwaV94Y29tbS0+Y3VycmVudF9zcGVlZCA9IHQtPnNwZWVkX2h6OwogCX0KIAogCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKQEAgLTE0OCw4ICsxNDUsNiBAQAogCWludCBzdGF0dXMgPSAwOwogCWJvb2wgaXNfbGFzdDsKIAotCWlzX2ZpcnN0ID0gdHJ1ZTsKLQogCXNwaV94Y29tbV9jaGlwc2VsZWN0KHNwaV94Y29tbSwgc3BpLCB0cnVlKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGkteGlsaW54LmMgYi9kcml2ZXJzL3NwaS9zcGkteGlsaW54LmMKaW5kZXggNmQ0Y2U0Ni4uYTNiMGI5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXhpbGlueC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS14aWxpbnguYwpAQCAtMTQsNyArMTQsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTg4LDEwICs4NywxMCBAQAogCWNvbnN0IHU4ICp0eF9wdHI7CS8qIHBvaW50ZXIgaW4gdGhlIFJ4IGJ1ZmZlciAqLwogCWludCByZW1haW5pbmdfYnl0ZXM7CS8qIHRoZSBudW1iZXIgb2YgYnl0ZXMgbGVmdCB0byB0cmFuc2ZlciAqLwogCXU4IGJpdHNfcGVyX3dvcmQ7Ci0JdW5zaWduZWQgaW50ICgqcmVhZF9mbikgKHZvaWQgX19pb21lbSAqKTsKLQl2b2lkICgqd3JpdGVfZm4pICh1MzIsIHZvaWQgX19pb21lbSAqKTsKLQl2b2lkICgqdHhfZm4pIChzdHJ1Y3QgeGlsaW54X3NwaSAqKTsKLQl2b2lkICgqcnhfZm4pIChzdHJ1Y3QgeGlsaW54X3NwaSAqKTsKKwl1bnNpZ25lZCBpbnQgKCpyZWFkX2ZuKSh2b2lkIF9faW9tZW0gKik7CisJdm9pZCAoKndyaXRlX2ZuKSh1MzIsIHZvaWQgX19pb21lbSAqKTsKKwl2b2lkICgqdHhfZm4pKHN0cnVjdCB4aWxpbnhfc3BpICopOworCXZvaWQgKCpyeF9mbikoc3RydWN0IHhpbGlueF9zcGkgKik7CiB9OwogCiBzdGF0aWMgdm9pZCB4c3BpX3dyaXRlMzIodTMyIHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQpAQCAtMjA5LDI2ICsyMDgsMTEgQEAKIH0KIAogLyogc3BpX2JpdGJhbmcgcmVxdWlyZXMgY3VzdG9tIHNldHVwX3RyYW5zZmVyKCkgdG8gYmUgZGVmaW5lZCBpZiB0aGVyZSBpcyBhCi0gKiBjdXN0b20gdHhyeF9idWZzKCkuIFdlIGhhdmUgbm90aGluZyB0byBzZXR1cCBoZXJlIGFzIHRoZSBTUEkgSVAgYmxvY2sKLSAqIHN1cHBvcnRzIDggb3IgMTYgYml0cyBwZXIgd29yZCB3aGljaCBjYW5ub3QgYmUgY2hhbmdlZCBpbiBzb2Z0d2FyZS4KLSAqIFNQSSBjbG9jayBjYW4ndCBiZSBjaGFuZ2VkIGluIHNvZnR3YXJlIGVpdGhlci4KLSAqIENoZWNrIGZvciBjb3JyZWN0IGJpdHMgcGVyIHdvcmQuIENoaXAgc2VsZWN0IGRlbGF5IGNhbGN1bGF0aW9ucyBjb3VsZCBiZQotICogYWRkZWQgaGVyZSBhcyBzb29uIGFzIGJpdGJhbmdfd29yaygpIGNhbiBiZSBtYWRlIGF3YXJlIG9mIHRoZSBkZWxheSB2YWx1ZS4KKyAqIGN1c3RvbSB0eHJ4X2J1ZnMoKS4KICAqLwogc3RhdGljIGludCB4aWxpbnhfc3BpX3NldHVwX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCiAJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCiB7Ci0Jc3RydWN0IHhpbGlueF9zcGkgKnhzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQl1OCBiaXRzX3Blcl93b3JkOwotCi0JYml0c19wZXJfd29yZCA9ICh0ICYmIHQtPmJpdHNfcGVyX3dvcmQpCi0JCQkgPyB0LT5iaXRzX3Blcl93b3JkIDogc3BpLT5iaXRzX3Blcl93b3JkOwotCWlmIChiaXRzX3Blcl93b3JkICE9IHhzcGktPmJpdHNfcGVyX3dvcmQpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICIlcywgdW5zdXBwb3J0ZWQgYml0c19wZXJfd29yZD0lZFxuIiwKLQkJCV9fZnVuY19fLCBiaXRzX3Blcl93b3JkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQwNyw2ICszOTEsNyBAQAogCQl4c3BpLT53cml0ZV9mbiA9IHhzcGlfd3JpdGUzMl9iZTsKIAl9CiAKKwltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfTUFTSyhiaXRzX3Blcl93b3JkKTsKIAl4c3BpLT5iaXRzX3Blcl93b3JkID0gYml0c19wZXJfd29yZDsKIAlpZiAoeHNwaS0+Yml0c19wZXJfd29yZCA9PSA4KSB7CiAJCXhzcGktPnR4X2ZuID0geHNwaV90eDg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGkteHRlbnNhLXh0ZnBnYS5jIGIvZHJpdmVycy9zcGkvc3BpLXh0ZW5zYS14dGZwZ2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWUxNTgxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpLXh0ZW5zYS14dGZwZ2EuYwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIFh0ZW5zYSB4dGZwZ2EgU1BJIGNvbnRyb2xsZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0IENhZGVuY2UgRGVzaWduIFN5c3RlbXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKworI2RlZmluZSBYVEZQR0FfU1BJX05BTUUgInh0ZnBnYV9zcGkiCisKKyNkZWZpbmUgWFRGUEdBX1NQSV9TVEFSVAkweDAKKyNkZWZpbmUgWFRGUEdBX1NQSV9CVVNZCQkweDQKKyNkZWZpbmUgWFRGUEdBX1NQSV9EQVRBCQkweDgKKworI2RlZmluZSBCVVNZX1dBSVRfVVMJCTEwMAorCitzdHJ1Y3QgeHRmcGdhX3NwaSB7CisJc3RydWN0IHNwaV9iaXRiYW5nIGJpdGJhbmc7CisJdm9pZCBfX2lvbWVtICpyZWdzOworCXUzMiBkYXRhOworCXVuc2lnbmVkIGRhdGFfc3o7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgeHRmcGdhX3NwaV93cml0ZTMyKGNvbnN0IHN0cnVjdCB4dGZwZ2Ffc3BpICpzcGksCisJCQkJICAgICAgdW5zaWduZWQgYWRkciwgdTMyIHZhbCkKK3sKKwlpb3dyaXRlMzIodmFsLCBzcGktPnJlZ3MgKyBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgeHRmcGdhX3NwaV9yZWFkMzIoY29uc3Qgc3RydWN0IHh0ZnBnYV9zcGkgKnNwaSwKKwkJCQkJICAgICB1bnNpZ25lZCBhZGRyKQoreworCXJldHVybiBpb3JlYWQzMihzcGktPnJlZ3MgKyBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHh0ZnBnYV9zcGlfd2FpdF9idXN5KHN0cnVjdCB4dGZwZ2Ffc3BpICp4c3BpKQoreworCXVuc2lnbmVkIGk7CisJZm9yIChpID0gMDsgeHRmcGdhX3NwaV9yZWFkMzIoeHNwaSwgWFRGUEdBX1NQSV9CVVNZKSAmJgorCSAgICAgaSA8IEJVU1lfV0FJVF9VUzsgKytpKQorCQl1ZGVsYXkoMSk7CisJV0FSTl9PTl9PTkNFKGkgPT0gQlVTWV9XQUlUX1VTKTsKK30KKworc3RhdGljIHUzMiB4dGZwZ2Ffc3BpX3R4cnhfd29yZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1bnNpZ25lZCBuc2VjcywKKwkJCQl1MzIgdiwgdTggYml0cykKK3sKKwlzdHJ1Y3QgeHRmcGdhX3NwaSAqeHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCisJeHNwaS0+ZGF0YSA9ICh4c3BpLT5kYXRhIDw8IGJpdHMpIHwgKHYgJiBHRU5NQVNLKGJpdHMgLSAxLCAwKSk7CisJeHNwaS0+ZGF0YV9zeiArPSBiaXRzOworCWlmICh4c3BpLT5kYXRhX3N6ID49IDE2KSB7CisJCXh0ZnBnYV9zcGlfd3JpdGUzMih4c3BpLCBYVEZQR0FfU1BJX0RBVEEsCisJCQkJICAgeHNwaS0+ZGF0YSA+PiAoeHNwaS0+ZGF0YV9zeiAtIDE2KSk7CisJCXhzcGktPmRhdGFfc3ogLT0gMTY7CisJCXh0ZnBnYV9zcGlfd3JpdGUzMih4c3BpLCBYVEZQR0FfU1BJX1NUQVJULCAxKTsKKwkJeHRmcGdhX3NwaV93YWl0X2J1c3koeHNwaSk7CisJCXh0ZnBnYV9zcGlfd3JpdGUzMih4c3BpLCBYVEZQR0FfU1BJX1NUQVJULCAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgeHRmcGdhX3NwaV9jaGlwc2VsZWN0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBpc19vbikKK3sKKwlzdHJ1Y3QgeHRmcGdhX3NwaSAqeHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCisJV0FSTl9PTih4c3BpLT5kYXRhX3N6ICE9IDApOworCXhzcGktPmRhdGFfc3ogPSAwOworfQorCitzdGF0aWMgaW50IHh0ZnBnYV9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgeHRmcGdhX3NwaSAqeHNwaTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgeHRmcGdhX3NwaSkpOworCWlmICghbWFzdGVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1hc3Rlci0+ZmxhZ3MgPSBTUElfTUFTVEVSX05PX1JYOworCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19SQU5HRV9NQVNLKDEsIDE2KTsKKwltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5kZXYuaWQ7CisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCisJeHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwl4c3BpLT5iaXRiYW5nLm1hc3RlciA9IG1hc3RlcjsKKwl4c3BpLT5iaXRiYW5nLmNoaXBzZWxlY3QgPSB4dGZwZ2Ffc3BpX2NoaXBzZWxlY3Q7CisJeHNwaS0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMF0gPSB4dGZwZ2Ffc3BpX3R4cnhfd29yZDsKKworCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFtZW0pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gbWVtb3J5IHJlc291cmNlXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCXhzcGktPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgbWVtKTsKKwlpZiAoSVNfRVJSKHhzcGktPnJlZ3MpKSB7CisJCXJldCA9IFBUUl9FUlIoeHNwaS0+cmVncyk7CisJCWdvdG8gZXJyOworCX0KKworCXh0ZnBnYV9zcGlfd3JpdGUzMih4c3BpLCBYVEZQR0FfU1BJX1NUQVJULCAwKTsKKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisJaWYgKHh0ZnBnYV9zcGlfcmVhZDMyKHhzcGksIFhURlBHQV9TUElfQlVTWSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRGV2aWNlIHN0dWNrIGluIGJ1c3kgc3RhdGVcbiIpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZ4c3BpLT5iaXRiYW5nKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzcGlfYml0YmFuZ19zdGFydCBmYWlsZWRcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOworCXJldHVybiAwOworZXJyOgorCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB4dGZwZ2Ffc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgeHRmcGdhX3NwaSAqeHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCXNwaV9iaXRiYW5nX3N0b3AoJnhzcGktPmJpdGJhbmcpOworCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIFhURlBHQV9TUElfTkFNRSk7CisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHh0ZnBnYV9zcGlfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImNkbnMseHRmcGdhLXNwaSIsIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB4dGZwZ2Ffc3BpX29mX21hdGNoKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB4dGZwZ2Ffc3BpX2RyaXZlciA9IHsKKwkucHJvYmUgPSB4dGZwZ2Ffc3BpX3Byb2JlLAorCS5yZW1vdmUgPSB4dGZwZ2Ffc3BpX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9IFhURlBHQV9TUElfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cih4dGZwZ2Ffc3BpX29mX21hdGNoKSwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoeHRmcGdhX3NwaV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJNYXggRmlsaXBwb3YgPGpjbXZia2JjQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigieHRlbnNhIHh0ZnBnYSBTUEkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS5jCmluZGV4IGQwYjI4YmIuLjRlYjliZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS5jCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgpAQCAtMjU1LDEzICsyNTcsMTIgQEAKIHN0YXRpYyBpbnQgc3BpX2Rydl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJY29uc3Qgc3RydWN0IHNwaV9kcml2ZXIJCSpzZHJ2ID0gdG9fc3BpX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0Jc3RydWN0IHNwaV9kZXZpY2UJCSpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CiAJaW50IHJldDsKIAotCWFjcGlfZGV2X3BtX2F0dGFjaCgmc3BpLT5kZXYsIHRydWUpOwotCXJldCA9IHNkcnYtPnByb2JlKHNwaSk7CisJYWNwaV9kZXZfcG1fYXR0YWNoKGRldiwgdHJ1ZSk7CisJcmV0ID0gc2Rydi0+cHJvYmUodG9fc3BpX2RldmljZShkZXYpKTsKIAlpZiAocmV0KQotCQlhY3BpX2Rldl9wbV9kZXRhY2goJnNwaS0+ZGV2LCB0cnVlKTsKKwkJYWNwaV9kZXZfcG1fZGV0YWNoKGRldiwgdHJ1ZSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjY5LDExICsyNzAsMTAgQEAKIHN0YXRpYyBpbnQgc3BpX2Rydl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCWNvbnN0IHN0cnVjdCBzcGlfZHJpdmVyCQkqc2RydiA9IHRvX3NwaV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCXN0cnVjdCBzcGlfZGV2aWNlCQkqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwogCWludCByZXQ7CiAKLQlyZXQgPSBzZHJ2LT5yZW1vdmUoc3BpKTsKLQlhY3BpX2Rldl9wbV9kZXRhY2goJnNwaS0+ZGV2LCB0cnVlKTsKKwlyZXQgPSBzZHJ2LT5yZW1vdmUodG9fc3BpX2RldmljZShkZXYpKTsKKwlhY3BpX2Rldl9wbV9kZXRhY2goZGV2LCB0cnVlKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC01ODAsNiArNTgwLDE2OSBAQAogCQlzcGktPm1hc3Rlci0+c2V0X2NzKHNwaSwgIWVuYWJsZSk7CiB9CiAKK3N0YXRpYyBpbnQgc3BpX21hcF9idWYoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IGRldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IHNnX3RhYmxlICpzZ3QsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwKKwkJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwljb25zdCBib29sIHZtYWxsb2NlZF9idWYgPSBpc192bWFsbG9jX2FkZHIoYnVmKTsKKwljb25zdCBpbnQgZGVzY19sZW4gPSB2bWFsbG9jZWRfYnVmID8gUEFHRV9TSVpFIDogbWFzdGVyLT5tYXhfZG1hX2xlbjsKKwljb25zdCBpbnQgc2dzID0gRElWX1JPVU5EX1VQKGxlbiwgZGVzY19sZW4pOworCXN0cnVjdCBwYWdlICp2bV9wYWdlOworCXZvaWQgKnNnX2J1ZjsKKwlzaXplX3QgbWluOworCWludCBpLCByZXQ7CisKKwlyZXQgPSBzZ19hbGxvY190YWJsZShzZ3QsIHNncywgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IHNnczsgaSsrKSB7CisJCW1pbiA9IG1pbl90KHNpemVfdCwgbGVuLCBkZXNjX2xlbik7CisKKwkJaWYgKHZtYWxsb2NlZF9idWYpIHsKKwkJCXZtX3BhZ2UgPSB2bWFsbG9jX3RvX3BhZ2UoYnVmKTsKKwkJCWlmICghdm1fcGFnZSkgeworCQkJCXNnX2ZyZWVfdGFibGUoc2d0KTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCXNnX2J1ZiA9IHBhZ2VfYWRkcmVzcyh2bV9wYWdlKSArCisJCQkJKChzaXplX3QpYnVmICYgflBBR0VfTUFTSyk7CisJCX0gZWxzZSB7CisJCQlzZ19idWYgPSBidWY7CisJCX0KKworCQlzZ19zZXRfYnVmKCZzZ3QtPnNnbFtpXSwgc2dfYnVmLCBtaW4pOworCisJCWJ1ZiArPSBtaW47CisJCWxlbiAtPSBtaW47CisJfQorCisJcmV0ID0gZG1hX21hcF9zZyhkZXYsIHNndC0+c2dsLCBzZ3QtPm5lbnRzLCBkaXIpOworCWlmIChyZXQgPCAwKSB7CisJCXNnX2ZyZWVfdGFibGUoc2d0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzZ3QtPm5lbnRzID0gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNwaV91bm1hcF9idWYoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IGRldmljZSAqZGV2LAorCQkJICBzdHJ1Y3Qgc2dfdGFibGUgKnNndCwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCWlmIChzZ3QtPm9yaWdfbmVudHMpIHsKKwkJZG1hX3VubWFwX3NnKGRldiwgc2d0LT5zZ2wsIHNndC0+b3JpZ19uZW50cywgZGlyKTsKKwkJc2dfZnJlZV90YWJsZShzZ3QpOworCX0KK30KKworc3RhdGljIGludCBzcGlfbWFwX21zZyhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3QgZGV2aWNlICp0eF9kZXYsICpyeF9kZXY7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcjsKKwl2b2lkICp0bXA7CisJdW5zaWduZWQgaW50IG1heF90eCwgbWF4X3J4OworCWludCByZXQ7CisKKwlpZiAobWFzdGVyLT5mbGFncyAmIChTUElfTUFTVEVSX01VU1RfUlggfCBTUElfTUFTVEVSX01VU1RfVFgpKSB7CisJCW1heF90eCA9IDA7CisJCW1heF9yeCA9IDA7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh4ZmVyLCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJCWlmICgobWFzdGVyLT5mbGFncyAmIFNQSV9NQVNURVJfTVVTVF9UWCkgJiYKKwkJCSAgICAheGZlci0+dHhfYnVmKQorCQkJCW1heF90eCA9IG1heCh4ZmVyLT5sZW4sIG1heF90eCk7CisJCQlpZiAoKG1hc3Rlci0+ZmxhZ3MgJiBTUElfTUFTVEVSX01VU1RfUlgpICYmCisJCQkgICAgIXhmZXItPnJ4X2J1ZikKKwkJCQltYXhfcnggPSBtYXgoeGZlci0+bGVuLCBtYXhfcngpOworCQl9CisKKwkJaWYgKG1heF90eCkgeworCQkJdG1wID0ga3JlYWxsb2MobWFzdGVyLT5kdW1teV90eCwgbWF4X3R4LAorCQkJCSAgICAgICBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJCQlpZiAoIXRtcCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCW1hc3Rlci0+ZHVtbXlfdHggPSB0bXA7CisJCQltZW1zZXQodG1wLCAwLCBtYXhfdHgpOworCQl9CisKKwkJaWYgKG1heF9yeCkgeworCQkJdG1wID0ga3JlYWxsb2MobWFzdGVyLT5kdW1teV9yeCwgbWF4X3J4LAorCQkJCSAgICAgICBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJCQlpZiAoIXRtcCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCW1hc3Rlci0+ZHVtbXlfcnggPSB0bXA7CisJCX0KKworCQlpZiAobWF4X3R4IHx8IG1heF9yeCkgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh4ZmVyLCAmbXNnLT50cmFuc2ZlcnMsCisJCQkJCSAgICB0cmFuc2Zlcl9saXN0KSB7CisJCQkJaWYgKCF4ZmVyLT50eF9idWYpCisJCQkJCXhmZXItPnR4X2J1ZiA9IG1hc3Rlci0+ZHVtbXlfdHg7CisJCQkJaWYgKCF4ZmVyLT5yeF9idWYpCisJCQkJCXhmZXItPnJ4X2J1ZiA9IG1hc3Rlci0+ZHVtbXlfcng7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIW1hc3Rlci0+Y2FuX2RtYSkKKwkJcmV0dXJuIDA7CisKKwl0eF9kZXYgPSAmbWFzdGVyLT5kbWFfdHgtPmRldi0+ZGV2aWNlOworCXJ4X2RldiA9ICZtYXN0ZXItPmRtYV9yeC0+ZGV2LT5kZXZpY2U7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQlpZiAoIW1hc3Rlci0+Y2FuX2RtYShtYXN0ZXIsIG1zZy0+c3BpLCB4ZmVyKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICh4ZmVyLT50eF9idWYgIT0gTlVMTCkgeworCQkJcmV0ID0gc3BpX21hcF9idWYobWFzdGVyLCB0eF9kZXYsICZ4ZmVyLT50eF9zZywKKwkJCQkJICAodm9pZCAqKXhmZXItPnR4X2J1ZiwgeGZlci0+bGVuLAorCQkJCQkgIERNQV9UT19ERVZJQ0UpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKworCQlpZiAoeGZlci0+cnhfYnVmICE9IE5VTEwpIHsKKwkJCXJldCA9IHNwaV9tYXBfYnVmKG1hc3RlciwgcnhfZGV2LCAmeGZlci0+cnhfc2csCisJCQkJCSAgeGZlci0+cnhfYnVmLCB4ZmVyLT5sZW4sCisJCQkJCSAgRE1BX0ZST01fREVWSUNFKTsKKwkJCWlmIChyZXQgIT0gMCkgeworCQkJCXNwaV91bm1hcF9idWYobWFzdGVyLCB0eF9kZXYsICZ4ZmVyLT50eF9zZywKKwkJCQkJICAgICAgRE1BX1RPX0RFVklDRSk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCX0KKworCW1hc3Rlci0+Y3VyX21zZ19tYXBwZWQgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3VubWFwX21zZyhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyOworCXN0cnVjdCBkZXZpY2UgKnR4X2RldiwgKnJ4X2RldjsKKworCWlmICghbWFzdGVyLT5jdXJfbXNnX21hcHBlZCB8fCAhbWFzdGVyLT5jYW5fZG1hKQorCQlyZXR1cm4gMDsKKworCXR4X2RldiA9ICZtYXN0ZXItPmRtYV90eC0+ZGV2LT5kZXZpY2U7CisJcnhfZGV2ID0gJm1hc3Rlci0+ZG1hX3J4LT5kZXYtPmRldmljZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoeGZlciwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CisJCWlmICghbWFzdGVyLT5jYW5fZG1hKG1hc3RlciwgbXNnLT5zcGksIHhmZXIpKQorCQkJY29udGludWU7CisKKwkJc3BpX3VubWFwX2J1ZihtYXN0ZXIsIHJ4X2RldiwgJnhmZXItPnJ4X3NnLCBETUFfRlJPTV9ERVZJQ0UpOworCQlzcGlfdW5tYXBfYnVmKG1hc3RlciwgdHhfZGV2LCAmeGZlci0+dHhfc2csIERNQV9UT19ERVZJQ0UpOworCX0KKworCXJldHVybiAwOworfQorCiAvKgogICogc3BpX3RyYW5zZmVyX29uZV9tZXNzYWdlIC0gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0cmFuc2Zlcl9vbmVfbWVzc2FnZSgpCiAgKgpAQCAtNTkxLDkgKzc1NCw5IEBACiAJCQkJICAgIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQogewogCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXI7Ci0JYm9vbCBjdXJfY3MgPSB0cnVlOwogCWJvb2wga2VlcF9jcyA9IGZhbHNlOwogCWludCByZXQgPSAwOworCWludCBtcyA9IDE7CiAKIAlzcGlfc2V0X2NzKG1zZy0+c3BpLCB0cnVlKTsKIApAQCAtNjExLDcgKzc3NCwxNiBAQAogCiAJCWlmIChyZXQgPiAwKSB7CiAJCQlyZXQgPSAwOwotCQkJd2FpdF9mb3JfY29tcGxldGlvbigmbWFzdGVyLT54ZmVyX2NvbXBsZXRpb24pOworCQkJbXMgPSB4ZmVyLT5sZW4gKiA4ICogMTAwMCAvIHhmZXItPnNwZWVkX2h6OworCQkJbXMgKz0gMTA7IC8qIHNvbWUgdG9sZXJhbmNlICovCisKKwkJCW1zID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZtYXN0ZXItPnhmZXJfY29tcGxldGlvbiwKKwkJCQkJCQkgbXNlY3NfdG9famlmZmllcyhtcykpOworCQl9CisKKwkJaWYgKG1zID09IDApIHsKKwkJCWRldl9lcnIoJm1zZy0+c3BpLT5kZXYsICJTUEkgdHJhbnNmZXIgdGltZWQgb3V0XG4iKTsKKwkJCW1zZy0+c3RhdHVzID0gLUVUSU1FRE9VVDsKIAkJfQogCiAJCXRyYWNlX3NwaV90cmFuc2Zlcl9zdG9wKG1zZywgeGZlcik7CkBAIC02MjcsOCArNzk5LDkgQEAKIAkJCQkJICZtc2ctPnRyYW5zZmVycykpIHsKIAkJCQlrZWVwX2NzID0gdHJ1ZTsKIAkJCX0gZWxzZSB7Ci0JCQkJY3VyX2NzID0gIWN1cl9jczsKLQkJCQlzcGlfc2V0X2NzKG1zZy0+c3BpLCBjdXJfY3MpOworCQkJCXNwaV9zZXRfY3MobXNnLT5zcGksIGZhbHNlKTsKKwkJCQl1ZGVsYXkoMTApOworCQkJCXNwaV9zZXRfY3MobXNnLT5zcGksIHRydWUpOwogCQkJfQogCQl9CiAKQEAgLTY4Niw2ICs4NTksMTAgQEAKIAkJfQogCQltYXN0ZXItPmJ1c3kgPSBmYWxzZTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFzdGVyLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJCWtmcmVlKG1hc3Rlci0+ZHVtbXlfcngpOworCQltYXN0ZXItPmR1bW15X3J4ID0gTlVMTDsKKwkJa2ZyZWUobWFzdGVyLT5kdW1teV90eCk7CisJCW1hc3Rlci0+ZHVtbXlfdHggPSBOVUxMOwogCQlpZiAobWFzdGVyLT51bnByZXBhcmVfdHJhbnNmZXJfaGFyZHdhcmUgJiYKIAkJICAgIG1hc3Rlci0+dW5wcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlKG1hc3RlcikpCiAJCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwKQEAgLTc1Miw2ICs5MjksMTMgQEAKIAkJbWFzdGVyLT5jdXJfbXNnX3ByZXBhcmVkID0gdHJ1ZTsKIAl9CiAKKwlyZXQgPSBzcGlfbWFwX21zZyhtYXN0ZXIsIG1hc3Rlci0+Y3VyX21zZyk7CisJaWYgKHJldCkgeworCQltYXN0ZXItPmN1cl9tc2ctPnN0YXR1cyA9IHJldDsKKwkJc3BpX2ZpbmFsaXplX2N1cnJlbnRfbWVzc2FnZShtYXN0ZXIpOworCQlyZXR1cm47CisJfQorCiAJcmV0ID0gbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZShtYXN0ZXIsIG1hc3Rlci0+Y3VyX21zZyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwKQEAgLTgzOSw2ICsxMDIzLDggQEAKIAlxdWV1ZV9rdGhyZWFkX3dvcmsoJm1hc3Rlci0+a3dvcmtlciwgJm1hc3Rlci0+cHVtcF9tZXNzYWdlcyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFzdGVyLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAKKwlzcGlfdW5tYXBfbXNnKG1hc3RlciwgbWVzZyk7CisKIAlpZiAobWFzdGVyLT5jdXJfbXNnX3ByZXBhcmVkICYmIG1hc3Rlci0+dW5wcmVwYXJlX21lc3NhZ2UpIHsKIAkJcmV0ID0gbWFzdGVyLT51bnByZXBhcmVfbWVzc2FnZShtYXN0ZXIsIG1lc2cpOwogCQlpZiAocmV0KSB7CkBAIC04OTIsNyArMTA3OCw3IEBACiAJICovCiAJd2hpbGUgKCghbGlzdF9lbXB0eSgmbWFzdGVyLT5xdWV1ZSkgfHwgbWFzdGVyLT5idXN5KSAmJiBsaW1pdC0tKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hc3Rlci0+cXVldWVfbG9jaywgZmxhZ3MpOwotCQltc2xlZXAoMTApOworCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJm1hc3Rlci0+cXVldWVfbG9jaywgZmxhZ3MpOwogCX0KIApAQCAtMTM3Miw2ICsxNTU4LDggQEAKIAltdXRleF9pbml0KCZtYXN0ZXItPmJ1c19sb2NrX211dGV4KTsKIAltYXN0ZXItPmJ1c19sb2NrX2ZsYWcgPSAwOwogCWluaXRfY29tcGxldGlvbigmbWFzdGVyLT54ZmVyX2NvbXBsZXRpb24pOworCWlmICghbWFzdGVyLT5tYXhfZG1hX2xlbikKKwkJbWFzdGVyLT5tYXhfZG1hX2xlbiA9IElOVF9NQVg7CiAKIAkvKiByZWdpc3RlciB0aGUgZGV2aWNlLCB0aGVuIHVzZXJzcGFjZSB3aWxsIHNlZSBpdC4KIAkgKiByZWdpc3RyYXRpb24gZmFpbHMgaWYgdGhlIGJ1cyBJRCBpcyBpbiB1c2UuCkBAIC0xNTk3LDYgKzE3ODUsOSBAQAogCWlmICghc3BpLT5iaXRzX3Blcl93b3JkKQogCQlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OwogCisJaWYgKCFzcGktPm1heF9zcGVlZF9oeikKKwkJc3BpLT5tYXhfc3BlZWRfaHogPSBzcGktPm1hc3Rlci0+bWF4X3NwZWVkX2h6OworCiAJaWYgKHNwaS0+bWFzdGVyLT5zZXR1cCkKIAkJc3RhdHVzID0gc3BpLT5tYXN0ZXItPnNldHVwKHNwaSk7CiAKQEAgLTE2MTcsMTEgKzE4MDgsMTAgQEAKIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gc3BpLT5tYXN0ZXI7CiAJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcjsKKwlpbnQgd19zaXplOwogCiAJaWYgKGxpc3RfZW1wdHkoJm1lc3NhZ2UtPnRyYW5zZmVycykpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICghbWVzc2FnZS0+Y29tcGxldGUpCi0JCXJldHVybiAtRUlOVkFMOwogCiAJLyogSGFsZi1kdXBsZXggbGlua3MgaW5jbHVkZSBvcmlnaW5hbCBNaWNyb1dpcmUsIGFuZCBvbmVzIHdpdGgKIAkgKiBvbmx5IG9uZSBkYXRhIHBpbiBsaWtlIFNQSV8zV0lSRSAoc3dpdGNoZXMgZGlyZWN0aW9uKSBvciB3aGVyZQpAQCAtMTY1MiwxMiArMTg0MiwxMyBAQAogCQltZXNzYWdlLT5mcmFtZV9sZW5ndGggKz0geGZlci0+bGVuOwogCQlpZiAoIXhmZXItPmJpdHNfcGVyX3dvcmQpCiAJCQl4ZmVyLT5iaXRzX3Blcl93b3JkID0gc3BpLT5iaXRzX3Blcl93b3JkOwotCQlpZiAoIXhmZXItPnNwZWVkX2h6KSB7CisKKwkJaWYgKCF4ZmVyLT5zcGVlZF9oeikKIAkJCXhmZXItPnNwZWVkX2h6ID0gc3BpLT5tYXhfc3BlZWRfaHo7Ci0JCQlpZiAobWFzdGVyLT5tYXhfc3BlZWRfaHogJiYKLQkJCSAgICB4ZmVyLT5zcGVlZF9oeiA+IG1hc3Rlci0+bWF4X3NwZWVkX2h6KQotCQkJCXhmZXItPnNwZWVkX2h6ID0gbWFzdGVyLT5tYXhfc3BlZWRfaHo7Ci0JCX0KKworCQlpZiAobWFzdGVyLT5tYXhfc3BlZWRfaHogJiYKKwkJICAgIHhmZXItPnNwZWVkX2h6ID4gbWFzdGVyLT5tYXhfc3BlZWRfaHopCisJCQl4ZmVyLT5zcGVlZF9oeiA9IG1hc3Rlci0+bWF4X3NwZWVkX2h6OwogCiAJCWlmIChtYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzaykgewogCQkJLyogT25seSAzMiBiaXRzIGZpdCBpbiB0aGUgbWFzayAqLwpAQCAtMTY2OCwxMiArMTg1OSwyNCBAQAogCQkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKKwkJLyoKKwkJICogU1BJIHRyYW5zZmVyIGxlbmd0aCBzaG91bGQgYmUgbXVsdGlwbGUgb2YgU1BJIHdvcmQgc2l6ZQorCQkgKiB3aGVyZSBTUEkgd29yZCBzaXplIHNob3VsZCBiZSBwb3dlci1vZi10d28gbXVsdGlwbGUKKwkJICovCisJCWlmICh4ZmVyLT5iaXRzX3Blcl93b3JkIDw9IDgpCisJCQl3X3NpemUgPSAxOworCQllbHNlIGlmICh4ZmVyLT5iaXRzX3Blcl93b3JkIDw9IDE2KQorCQkJd19zaXplID0gMjsKKwkJZWxzZQorCQkJd19zaXplID0gNDsKKworCQkvKiBObyBwYXJ0aWFsIHRyYW5zZmVycyBhY2NlcHRlZCAqLworCQlpZiAoeGZlci0+bGVuICUgd19zaXplKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKIAkJaWYgKHhmZXItPnNwZWVkX2h6ICYmIG1hc3Rlci0+bWluX3NwZWVkX2h6ICYmCiAJCSAgICB4ZmVyLT5zcGVlZF9oeiA8IG1hc3Rlci0+bWluX3NwZWVkX2h6KQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICh4ZmVyLT5zcGVlZF9oeiAmJiBtYXN0ZXItPm1heF9zcGVlZF9oeiAmJgotCQkgICAgeGZlci0+c3BlZWRfaHogPiBtYXN0ZXItPm1heF9zcGVlZF9oeikKLQkJCXJldHVybiAtRUlOVkFMOwogCiAJCWlmICh4ZmVyLT50eF9idWYgJiYgIXhmZXItPnR4X25iaXRzKQogCQkJeGZlci0+dHhfbmJpdHMgPSBTUElfTkJJVFNfU0lOR0xFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpZGV2LmMgYi9kcml2ZXJzL3NwaS9zcGlkZXYuYwppbmRleCBkN2M2ZTM2Li5lM2JjMjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlkZXYuYworKysgYi9kcml2ZXJzL3NwaS9zcGlkZXYuYwpAQCAtNzMsNyArNzMsOCBAQAogICovCiAjZGVmaW5lIFNQSV9NT0RFX01BU0sJCShTUElfQ1BIQSB8IFNQSV9DUE9MIHwgU1BJX0NTX0hJR0ggXAogCQkJCXwgU1BJX0xTQl9GSVJTVCB8IFNQSV8zV0lSRSB8IFNQSV9MT09QIFwKLQkJCQl8IFNQSV9OT19DUyB8IFNQSV9SRUFEWSkKKwkJCQl8IFNQSV9OT19DUyB8IFNQSV9SRUFEWSB8IFNQSV9UWF9EVUFMIFwKKwkJCQl8IFNQSV9UWF9RVUFEIHwgU1BJX1JYX0RVQUwgfCBTUElfUlhfUVVBRCkKIAogc3RydWN0IHNwaWRldl9kYXRhIHsKIAlkZXZfdAkJCWRldnQ7CkBAIC0yNjUsNiArMjY2LDggQEAKIAkJYnVmICs9IGtfdG1wLT5sZW47CiAKIAkJa190bXAtPmNzX2NoYW5nZSA9ICEhdV90bXAtPmNzX2NoYW5nZTsKKwkJa190bXAtPnR4X25iaXRzID0gdV90bXAtPnR4X25iaXRzOworCQlrX3RtcC0+cnhfbmJpdHMgPSB1X3RtcC0+cnhfbmJpdHM7CiAJCWtfdG1wLT5iaXRzX3Blcl93b3JkID0gdV90bXAtPmJpdHNfcGVyX3dvcmQ7CiAJCWtfdG1wLT5kZWxheV91c2VjcyA9IHVfdG1wLT5kZWxheV91c2VjczsKIAkJa190bXAtPnNwZWVkX2h6ID0gdV90bXAtPnNwZWVkX2h6OwpAQCAtMzU5LDYgKzM2MiwxMCBAQAogCQlyZXR2YWwgPSBfX3B1dF91c2VyKHNwaS0+bW9kZSAmIFNQSV9NT0RFX01BU0ssCiAJCQkJCShfX3U4IF9fdXNlciAqKWFyZyk7CiAJCWJyZWFrOworCWNhc2UgU1BJX0lPQ19SRF9NT0RFMzI6CisJCXJldHZhbCA9IF9fcHV0X3VzZXIoc3BpLT5tb2RlICYgU1BJX01PREVfTUFTSywKKwkJCQkJKF9fdTMyIF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOwogCWNhc2UgU1BJX0lPQ19SRF9MU0JfRklSU1Q6CiAJCXJldHZhbCA9IF9fcHV0X3VzZXIoKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpID8gIDEgOiAwLAogCQkJCQkoX191OCBfX3VzZXIgKilhcmcpOwpAQCAtMzcyLDkgKzM3OSwxMyBAQAogCiAJLyogd3JpdGUgcmVxdWVzdHMgKi8KIAljYXNlIFNQSV9JT0NfV1JfTU9ERToKLQkJcmV0dmFsID0gX19nZXRfdXNlcih0bXAsICh1OCBfX3VzZXIgKilhcmcpOworCWNhc2UgU1BJX0lPQ19XUl9NT0RFMzI6CisJCWlmIChjbWQgPT0gU1BJX0lPQ19XUl9NT0RFKQorCQkJcmV0dmFsID0gX19nZXRfdXNlcih0bXAsICh1OCBfX3VzZXIgKilhcmcpOworCQllbHNlCisJCQlyZXR2YWwgPSBfX2dldF91c2VyKHRtcCwgKHUzMiBfX3VzZXIgKilhcmcpOwogCQlpZiAocmV0dmFsID09IDApIHsKLQkJCXU4CXNhdmUgPSBzcGktPm1vZGU7CisJCQl1MzIJc2F2ZSA9IHNwaS0+bW9kZTsKIAogCQkJaWYgKHRtcCAmIH5TUElfTU9ERV9NQVNLKSB7CiAJCQkJcmV0dmFsID0gLUVJTlZBTDsKQEAgLTM4MiwxOCArMzkzLDE4IEBACiAJCQl9CiAKIAkJCXRtcCB8PSBzcGktPm1vZGUgJiB+U1BJX01PREVfTUFTSzsKLQkJCXNwaS0+bW9kZSA9ICh1OCl0bXA7CisJCQlzcGktPm1vZGUgPSAodTE2KXRtcDsKIAkJCXJldHZhbCA9IHNwaV9zZXR1cChzcGkpOwogCQkJaWYgKHJldHZhbCA8IDApCiAJCQkJc3BpLT5tb2RlID0gc2F2ZTsKIAkJCWVsc2UKLQkJCQlkZXZfZGJnKCZzcGktPmRldiwgInNwaSBtb2RlICUwMnhcbiIsIHRtcCk7CisJCQkJZGV2X2RiZygmc3BpLT5kZXYsICJzcGkgbW9kZSAleFxuIiwgdG1wKTsKIAkJfQogCQlicmVhazsKIAljYXNlIFNQSV9JT0NfV1JfTFNCX0ZJUlNUOgogCQlyZXR2YWwgPSBfX2dldF91c2VyKHRtcCwgKF9fdTggX191c2VyICopYXJnKTsKIAkJaWYgKHJldHZhbCA9PSAwKSB7Ci0JCQl1OAlzYXZlID0gc3BpLT5tb2RlOworCQkJdTMyCXNhdmUgPSBzcGktPm1vZGU7CiAKIAkJCWlmICh0bXApCiAJCQkJc3BpLT5tb2RlIHw9IFNQSV9MU0JfRklSU1Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwbWkvS2NvbmZpZyBiL2RyaXZlcnMvc3BtaS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMTI5NWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwbWkvS2NvbmZpZwpAQCAtMCwwICsxLDI3IEBACisjCisjIFNQTUkgZHJpdmVyIGNvbmZpZ3VyYXRpb24KKyMKK21lbnVjb25maWcgU1BNSQorCXRyaXN0YXRlICJTUE1JIHN1cHBvcnQiCisJaGVscAorCSAgU1BNSSAoU3lzdGVtIFBvd2VyIE1hbmFnZW1lbnQgSW50ZXJmYWNlKSBpcyBhIHR3by13aXJlCisJICBzZXJpYWwgaW50ZXJmYWNlIGJldHdlZW4gYmFzZWJhbmQgYW5kIGFwcGxpY2F0aW9uIHByb2Nlc3NvcnMKKwkgIGFuZCBQb3dlciBNYW5hZ2VtZW50IEludGVncmF0ZWQgQ2lyY3VpdHMgKFBNSUMpLgorCitpZiBTUE1JCisKK2NvbmZpZyBTUE1JX01TTV9QTUlDX0FSQgorCXRyaXN0YXRlICJRdWFsY29tbSBNU00gU1BNSSBDb250cm9sbGVyIChQTUlDIEFyYml0ZXIpIgorCWRlcGVuZHMgb24gQVJNCisJZGVwZW5kcyBvbiBJUlFfRE9NQUlOCisJZGVwZW5kcyBvbiBBUkNIX1FDT00gfHwgQ09NUElMRV9URVNUCisJZGVmYXVsdCBBUkNIX1FDT00KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyB0byB0aGlzIG9wdGlvbiwgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGZvciB0aGUKKwkgIGJ1aWx0LWluIFNQTUkgUE1JQyBBcmJpdGVyIGludGVyZmFjZSBvbiBRdWFsY29tbSBNU00gZmFtaWx5CisJICBwcm9jZXNzb3JzLgorCisJICBUaGlzIGlzIHJlcXVpcmVkIGZvciBjb21tdW5pY2F0aW5nIHdpdGggUXVhbGNvbW0gUE1JQ3MgYW5kCisJICBvdGhlciBkZXZpY2VzIHRoYXQgaGF2ZSB0aGUgU1BNSSBpbnRlcmZhY2UuCisKK2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwbWkvTWFrZWZpbGUgYi9kcml2ZXJzL3NwbWkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3NTEwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BtaS9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIGtlcm5lbCBTUE1JIGZyYW1ld29yay4KKyMKK29iai0kKENPTkZJR19TUE1JKQkrPSBzcG1pLm8KKworb2JqLSQoQ09ORklHX1NQTUlfTVNNX1BNSUNfQVJCKQkrPSBzcG1pLXBtaWMtYXJiLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BtaS9zcG1pLXBtaWMtYXJiLmMgYi9kcml2ZXJzL3NwbWkvc3BtaS1wbWljLWFyYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NmUwM2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwbWkvc3BtaS1wbWljLWFyYi5jCkBAIC0wLDAgKzEsNzc4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2NoYWluZWRfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BtaS5oPgorCisvKiBQTUlDIEFyYml0ZXIgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUE1JQ19BUkJfVkVSU0lPTgkJMHgwMDAwCisjZGVmaW5lIFBNSUNfQVJCX0lOVF9FTgkJCTB4MDAwNAorCisvKiBQTUlDIEFyYml0ZXIgY2hhbm5lbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUE1JQ19BUkJfQ01EKE4pCQkJKDB4MDgwMCArICgweDgwICogKE4pKSkKKyNkZWZpbmUgUE1JQ19BUkJfQ09ORklHKE4pCQkoMHgwODA0ICsgKDB4ODAgKiAoTikpKQorI2RlZmluZSBQTUlDX0FSQl9TVEFUVVMoTikJCSgweDA4MDggKyAoMHg4MCAqIChOKSkpCisjZGVmaW5lIFBNSUNfQVJCX1dEQVRBMChOKQkJKDB4MDgxMCArICgweDgwICogKE4pKSkKKyNkZWZpbmUgUE1JQ19BUkJfV0RBVEExKE4pCQkoMHgwODE0ICsgKDB4ODAgKiAoTikpKQorI2RlZmluZSBQTUlDX0FSQl9SREFUQTAoTikJCSgweDA4MTggKyAoMHg4MCAqIChOKSkpCisjZGVmaW5lIFBNSUNfQVJCX1JEQVRBMShOKQkJKDB4MDgxQyArICgweDgwICogKE4pKSkKKworLyogSW50ZXJydXB0IENvbnRyb2xsZXIgKi8KKyNkZWZpbmUgU1BNSV9QSUNfT1dORVJfQUNDX1NUQVRVUyhNLCBOKQkoMHgwMDAwICsgKCgzMiAqIChNKSkgKyAoNCAqIChOKSkpKQorI2RlZmluZSBTUE1JX1BJQ19BQ0NfRU5BQkxFKE4pCQkoMHgwMjAwICsgKDQgKiAoTikpKQorI2RlZmluZSBTUE1JX1BJQ19JUlFfU1RBVFVTKE4pCQkoMHgwNjAwICsgKDQgKiAoTikpKQorI2RlZmluZSBTUE1JX1BJQ19JUlFfQ0xFQVIoTikJCSgweDBBMDAgKyAoNCAqIChOKSkpCisKKy8qIE1hcHBpbmcgVGFibGUgKi8KKyNkZWZpbmUgU1BNSV9NQVBQSU5HX1RBQkxFX1JFRyhOKQkoMHgwQjAwICsgKDQgKiAoTikpKQorI2RlZmluZSBTUE1JX01BUFBJTkdfQklUX0lOREVYKFgpCSgoKFgpID4+IDE4KSAmIDB4RikKKyNkZWZpbmUgU1BNSV9NQVBQSU5HX0JJVF9JU18wX0ZMQUcoWCkJKCgoWCkgPj4gMTcpICYgMHgxKQorI2RlZmluZSBTUE1JX01BUFBJTkdfQklUX0lTXzBfUkVTVUxUKFgpCSgoKFgpID4+IDkpICYgMHhGRikKKyNkZWZpbmUgU1BNSV9NQVBQSU5HX0JJVF9JU18xX0ZMQUcoWCkJKCgoWCkgPj4gOCkgJiAweDEpCisjZGVmaW5lIFNQTUlfTUFQUElOR19CSVRfSVNfMV9SRVNVTFQoWCkJKCgoWCkgPj4gMCkgJiAweEZGKQorCisjZGVmaW5lIFNQTUlfTUFQUElOR19UQUJMRV9MRU4JCTI1NQorI2RlZmluZSBTUE1JX01BUFBJTkdfVEFCTEVfVFJFRV9ERVBUSAkxNgkvKiBNYXhpbXVtIG9mIDE2LWJpdHMgKi8KKworLyogT3duZXJzaGlwIFRhYmxlICovCisjZGVmaW5lIFNQTUlfT1dORVJTSElQX1RBQkxFX1JFRyhOKQkoMHgwNzAwICsgKDQgKiAoTikpKQorI2RlZmluZSBTUE1JX09XTkVSU0hJUF9QRVJJUEgyT1dORVIoWCkJKChYKSAmIDB4NykKKworLyogQ2hhbm5lbCBTdGF0dXMgZmllbGRzICovCitlbnVtIHBtaWNfYXJiX2Nobmxfc3RhdHVzIHsKKwlQTUlDX0FSQl9TVEFUVVNfRE9ORQk9ICgxIDw8IDApLAorCVBNSUNfQVJCX1NUQVRVU19GQUlMVVJFCT0gKDEgPDwgMSksCisJUE1JQ19BUkJfU1RBVFVTX0RFTklFRAk9ICgxIDw8IDIpLAorCVBNSUNfQVJCX1NUQVRVU19EUk9QUEVECT0gKDEgPDwgMyksCit9OworCisvKiBDb21tYW5kIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBQTUlDX0FSQl9DTURfTUFYX0JZVEVfQ09VTlQJOAorCisvKiBDb21tYW5kIE9wY29kZXMgKi8KK2VudW0gcG1pY19hcmJfY21kX29wX2NvZGUgeworCVBNSUNfQVJCX09QX0VYVF9XUklURUwgPSAwLAorCVBNSUNfQVJCX09QX0VYVF9SRUFETCA9IDEsCisJUE1JQ19BUkJfT1BfRVhUX1dSSVRFID0gMiwKKwlQTUlDX0FSQl9PUF9SRVNFVCA9IDMsCisJUE1JQ19BUkJfT1BfU0xFRVAgPSA0LAorCVBNSUNfQVJCX09QX1NIVVRET1dOID0gNSwKKwlQTUlDX0FSQl9PUF9XQUtFVVAgPSA2LAorCVBNSUNfQVJCX09QX0FVVEhFTlRJQ0FURSA9IDcsCisJUE1JQ19BUkJfT1BfTVNUUl9SRUFEID0gOCwKKwlQTUlDX0FSQl9PUF9NU1RSX1dSSVRFID0gOSwKKwlQTUlDX0FSQl9PUF9FWFRfUkVBRCA9IDEzLAorCVBNSUNfQVJCX09QX1dSSVRFID0gMTQsCisJUE1JQ19BUkJfT1BfUkVBRCA9IDE1LAorCVBNSUNfQVJCX09QX1pFUk9fV1JJVEUgPSAxNiwKK307CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnQgUE1JQyBwZXJpcGhlcmFscyAqLworI2RlZmluZSBQTUlDX0FSQl9NQVhfUEVSSVBIUwkJMjU2CisjZGVmaW5lIFBNSUNfQVJCX1BFUklQSF9JRF9WQUxJRAkoMSA8PCAxNSkKKyNkZWZpbmUgUE1JQ19BUkJfVElNRU9VVF9VUwkJMTAwCisjZGVmaW5lIFBNSUNfQVJCX01BWF9UUkFOU19CWVRFUwkoOCkKKworI2RlZmluZSBQTUlDX0FSQl9BUElEX01BU0sJCTB4RkYKKyNkZWZpbmUgUE1JQ19BUkJfUFBJRF9NQVNLCQkweEZGRgorCisvKiBpbnRlcnJ1cHQgZW5hYmxlIGJpdCAqLworI2RlZmluZSBTUE1JX1BJQ19BQ0NfRU5BQkxFX0JJVAkJQklUKDApCisKKy8qKgorICogc3BtaV9wbWljX2FyYl9kZXYgLSBTUE1JIFBNSUMgQXJiaXRlciBvYmplY3QKKyAqCisgKiBAYmFzZToJCWFkZHJlc3Mgb2YgdGhlIFBNSUMgQXJiaXRlciBjb3JlIHJlZ2lzdGVycy4KKyAqIEBpbnRyOgkJYWRkcmVzcyBvZiB0aGUgU1BNSSBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlcnMuCisgKiBAY25mZzoJCWFkZHJlc3Mgb2YgdGhlIFBNSUMgQXJiaXRlciBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyAqIEBsb2NrOgkJbG9jayB0byBzeW5jaHJvbml6ZSBhY2Nlc3Nlcy4KKyAqIEBjaGFubmVsOgkJd2hpY2ggY2hhbm5lbCB0byB1c2UgZm9yIGFjY2Vzc2VzLgorICogQGlycToJCVBNSUMgQVJCIGludGVycnVwdC4KKyAqIEBlZToJCQl0aGUgY3VycmVudCBFeGVjdXRpb24gRW52aXJvbm1lbnQKKyAqIEBtaW5fYXBpZDoJCW1pbmltdW0gQVBJRCAodXNlZCBmb3IgYm91bmRpbmcgSVJRIHNlYXJjaCkKKyAqIEBtYXhfYXBpZDoJCW1heGltdW0gQVBJRAorICogQG1hcHBpbmdfdGFibGU6CWluLW1lbW9yeSBjb3B5IG9mIFBQSUQgLT4gQVBJRCBtYXBwaW5nIHRhYmxlLgorICogQGRvbWFpbjoJCWlycSBkb21haW4gb2JqZWN0IGZvciBQTUlDIElSUSBkb21haW4KKyAqIEBzcG1pYzoJCVNQTUkgY29udHJvbGxlciBvYmplY3QKKyAqIEBhcGlkX3RvX3BwaWQ6CWNhY2hlZCBtYXBwaW5nIGZyb20gQVBJRCB0byBQUElECisgKi8KK3N0cnVjdCBzcG1pX3BtaWNfYXJiX2RldiB7CisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwl2b2lkIF9faW9tZW0JCSppbnRyOworCXZvaWQgX19pb21lbQkJKmNuZmc7CisJcmF3X3NwaW5sb2NrX3QJCWxvY2s7CisJdTgJCQljaGFubmVsOworCWludAkJCWlycTsKKwl1OAkJCWVlOworCXU4CQkJbWluX2FwaWQ7CisJdTgJCQltYXhfYXBpZDsKKwl1MzIJCQltYXBwaW5nX3RhYmxlW1NQTUlfTUFQUElOR19UQUJMRV9MRU5dOworCXN0cnVjdCBpcnFfZG9tYWluCSpkb21haW47CisJc3RydWN0IHNwbWlfY29udHJvbGxlcgkqc3BtaWM7CisJdTE2CQkJYXBpZF90b19wcGlkWzI1Nl07Cit9OworCitzdGF0aWMgaW5saW5lIHUzMiBwbWljX2FyYl9iYXNlX3JlYWQoc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpkZXYsIHUzMiBvZmZzZXQpCit7CisJcmV0dXJuIHJlYWRsX3JlbGF4ZWQoZGV2LT5iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBtaWNfYXJiX2Jhc2Vfd3JpdGUoc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpkZXYsCisJCQkJICAgICAgIHUzMiBvZmZzZXQsIHUzMiB2YWwpCit7CisJd3JpdGVsX3JlbGF4ZWQodmFsLCBkZXYtPmJhc2UgKyBvZmZzZXQpOworfQorCisvKioKKyAqIHBhX3JlYWRfZGF0YTogcmVhZHMgcG1pYy1hcmIncyByZWdpc3RlciBhbmQgY29weSAxLi40IGJ5dGVzIHRvIGJ1ZgorICogQGJjOgkJYnl0ZSBjb3VudCAtMS4gcmFuZ2U6IDAuLjMKKyAqIEByZWc6CXJlZ2lzdGVyJ3MgYWRkcmVzcworICogQGJ1ZjoJb3V0cHV0IHBhcmFtZXRlciwgbGVuZ3RoIG11c3QgYmUgYmMgKyAxCisgKi8KK3N0YXRpYyB2b2lkIHBhX3JlYWRfZGF0YShzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKmRldiwgdTggKmJ1ZiwgdTMyIHJlZywgdTggYmMpCit7CisJdTMyIGRhdGEgPSBwbWljX2FyYl9iYXNlX3JlYWQoZGV2LCByZWcpOworCW1lbWNweShidWYsICZkYXRhLCAoYmMgJiAzKSArIDEpOworfQorCisvKioKKyAqIHBhX3dyaXRlX2RhdGE6IHdyaXRlIDEuLjQgYnl0ZXMgZnJvbSBidWYgdG8gcG1pYy1hcmIncyByZWdpc3RlcgorICogQGJjOgkJYnl0ZS1jb3VudCAtMS4gcmFuZ2U6IDAuLjMuCisgKiBAcmVnOglyZWdpc3RlcidzIGFkZHJlc3MuCisgKiBAYnVmOglidWZmZXIgdG8gd3JpdGUuIGxlbmd0aCBtdXN0IGJlIGJjICsgMS4KKyAqLworc3RhdGljIHZvaWQKK3BhX3dyaXRlX2RhdGEoc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpkZXYsIGNvbnN0IHU4ICpidWYsIHUzMiByZWcsIHU4IGJjKQoreworCXUzMiBkYXRhID0gMDsKKwltZW1jcHkoJmRhdGEsIGJ1ZiwgKGJjICYgMykgKyAxKTsKKwlwbWljX2FyYl9iYXNlX3dyaXRlKGRldiwgcmVnLCBkYXRhKTsKK30KKworc3RhdGljIGludCBwbWljX2FyYl93YWl0X2Zvcl9kb25lKHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwpCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpkZXYgPSBzcG1pX2NvbnRyb2xsZXJfZ2V0X2RydmRhdGEoY3RybCk7CisJdTMyIHN0YXR1cyA9IDA7CisJdTMyIHRpbWVvdXQgPSBQTUlDX0FSQl9USU1FT1VUX1VTOworCXUzMiBvZmZzZXQgPSBQTUlDX0FSQl9TVEFUVVMoZGV2LT5jaGFubmVsKTsKKworCXdoaWxlICh0aW1lb3V0LS0pIHsKKwkJc3RhdHVzID0gcG1pY19hcmJfYmFzZV9yZWFkKGRldiwgb2Zmc2V0KTsKKworCQlpZiAoc3RhdHVzICYgUE1JQ19BUkJfU1RBVFVTX0RPTkUpIHsKKwkJCWlmIChzdGF0dXMgJiBQTUlDX0FSQl9TVEFUVVNfREVOSUVEKSB7CisJCQkJZGV2X2VycigmY3RybC0+ZGV2LAorCQkJCQkiJXM6IHRyYW5zYWN0aW9uIGRlbmllZCAoMHgleClcbiIsCisJCQkJCV9fZnVuY19fLCBzdGF0dXMpOworCQkJCXJldHVybiAtRVBFUk07CisJCQl9CisKKwkJCWlmIChzdGF0dXMgJiBQTUlDX0FSQl9TVEFUVVNfRkFJTFVSRSkgeworCQkJCWRldl9lcnIoJmN0cmwtPmRldiwKKwkJCQkJIiVzOiB0cmFuc2FjdGlvbiBmYWlsZWQgKDB4JXgpXG4iLAorCQkJCQlfX2Z1bmNfXywgc3RhdHVzKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKworCQkJaWYgKHN0YXR1cyAmIFBNSUNfQVJCX1NUQVRVU19EUk9QUEVEKSB7CisJCQkJZGV2X2VycigmY3RybC0+ZGV2LAorCQkJCQkiJXM6IHRyYW5zYWN0aW9uIGRyb3BwZWQgKDB4JXgpXG4iLAorCQkJCQlfX2Z1bmNfXywgc3RhdHVzKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKworCQkJcmV0dXJuIDA7CisJCX0KKwkJdWRlbGF5KDEpOworCX0KKworCWRldl9lcnIoJmN0cmwtPmRldiwKKwkJIiVzOiB0aW1lb3V0LCBzdGF0dXMgMHgleFxuIiwKKwkJX19mdW5jX18sIHN0YXR1cyk7CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKKy8qIE5vbi1kYXRhIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgcG1pY19hcmJfY21kKHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwsIHU4IG9wYywgdTggc2lkKQoreworCXN0cnVjdCBzcG1pX3BtaWNfYXJiX2RldiAqcG1pY19hcmIgPSBzcG1pX2NvbnRyb2xsZXJfZ2V0X2RydmRhdGEoY3RybCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgY21kOworCWludCByYzsKKworCS8qIENoZWNrIGZvciB2YWxpZCBub24tZGF0YSBjb21tYW5kICovCisJaWYgKG9wYyA8IFNQTUlfQ01EX1JFU0VUIHx8IG9wYyA+IFNQTUlfQ01EX1dBS0VVUCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljbWQgPSAoKG9wYyB8IDB4NDApIDw8IDI3KSB8ICgoc2lkICYgMHhmKSA8PCAyMCk7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBtaWNfYXJiLT5sb2NrLCBmbGFncyk7CisJcG1pY19hcmJfYmFzZV93cml0ZShwbWljX2FyYiwgUE1JQ19BUkJfQ01EKHBtaWNfYXJiLT5jaGFubmVsKSwgY21kKTsKKwlyYyA9IHBtaWNfYXJiX3dhaXRfZm9yX2RvbmUoY3RybCk7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtaWNfYXJiLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcG1pY19hcmJfcmVhZF9jbWQoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCwgdTggb3BjLCB1OCBzaWQsCisJCQkgICAgIHUxNiBhZGRyLCB1OCAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzcG1pX3BtaWNfYXJiX2RldiAqcG1pY19hcmIgPSBzcG1pX2NvbnRyb2xsZXJfZ2V0X2RydmRhdGEoY3RybCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBiYyA9IGxlbiAtIDE7CisJdTMyIGNtZDsKKwlpbnQgcmM7CisKKwlpZiAoYmMgPj0gUE1JQ19BUkJfTUFYX1RSQU5TX0JZVEVTKSB7CisJCWRldl9lcnIoJmN0cmwtPmRldiwKKwkJCSJwbWljLWFyYiBzdXBwb3J0cyAxLi4lZCBieXRlcyBwZXIgdHJhbnMsIGJ1dCAlZCByZXF1ZXN0ZWQiLAorCQkJUE1JQ19BUkJfTUFYX1RSQU5TX0JZVEVTLCBsZW4pOworCQlyZXR1cm4gIC1FSU5WQUw7CisJfQorCisJLyogQ2hlY2sgdGhlIG9wY29kZSAqLworCWlmIChvcGMgPj0gMHg2MCAmJiBvcGMgPD0gMHg3RikKKwkJb3BjID0gUE1JQ19BUkJfT1BfUkVBRDsKKwllbHNlIGlmIChvcGMgPj0gMHgyMCAmJiBvcGMgPD0gMHgyRikKKwkJb3BjID0gUE1JQ19BUkJfT1BfRVhUX1JFQUQ7CisJZWxzZSBpZiAob3BjID49IDB4MzggJiYgb3BjIDw9IDB4M0YpCisJCW9wYyA9IFBNSUNfQVJCX09QX0VYVF9SRUFETDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJY21kID0gKG9wYyA8PCAyNykgfCAoKHNpZCAmIDB4ZikgPDwgMjApIHwgKGFkZHIgPDwgNCkgfCAoYmMgJiAweDcpOworCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwbWljX2FyYi0+bG9jaywgZmxhZ3MpOworCXBtaWNfYXJiX2Jhc2Vfd3JpdGUocG1pY19hcmIsIFBNSUNfQVJCX0NNRChwbWljX2FyYi0+Y2hhbm5lbCksIGNtZCk7CisJcmMgPSBwbWljX2FyYl93YWl0X2Zvcl9kb25lKGN0cmwpOworCWlmIChyYykKKwkJZ290byBkb25lOworCisJcGFfcmVhZF9kYXRhKHBtaWNfYXJiLCBidWYsIFBNSUNfQVJCX1JEQVRBMChwbWljX2FyYi0+Y2hhbm5lbCksCisJCSAgICAgbWluX3QodTgsIGJjLCAzKSk7CisKKwlpZiAoYmMgPiAzKQorCQlwYV9yZWFkX2RhdGEocG1pY19hcmIsIGJ1ZiArIDQsCisJCQkJUE1JQ19BUkJfUkRBVEExKHBtaWNfYXJiLT5jaGFubmVsKSwgYmMgLSA0KTsKKworZG9uZToKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1pY19hcmItPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcG1pY19hcmJfd3JpdGVfY21kKHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwsIHU4IG9wYywgdTggc2lkLAorCQkJICAgICAgdTE2IGFkZHIsIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwbWljX2FyYiA9IHNwbWlfY29udHJvbGxlcl9nZXRfZHJ2ZGF0YShjdHJsKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGJjID0gbGVuIC0gMTsKKwl1MzIgY21kOworCWludCByYzsKKworCWlmIChiYyA+PSBQTUlDX0FSQl9NQVhfVFJBTlNfQllURVMpIHsKKwkJZGV2X2VycigmY3RybC0+ZGV2LAorCQkJInBtaWMtYXJiIHN1cHBvcnRzIDEuLiVkIGJ5dGVzIHBlciB0cmFucywgYnV0OiVkIHJlcXVlc3RlZCIsCisJCQlQTUlDX0FSQl9NQVhfVFJBTlNfQllURVMsIGxlbik7CisJCXJldHVybiAgLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayB0aGUgb3Bjb2RlICovCisJaWYgKG9wYyA+PSAweDQwICYmIG9wYyA8PSAweDVGKQorCQlvcGMgPSBQTUlDX0FSQl9PUF9XUklURTsKKwllbHNlIGlmIChvcGMgPj0gMHgwMCAmJiBvcGMgPD0gMHgwRikKKwkJb3BjID0gUE1JQ19BUkJfT1BfRVhUX1dSSVRFOworCWVsc2UgaWYgKG9wYyA+PSAweDMwICYmIG9wYyA8PSAweDM3KQorCQlvcGMgPSBQTUlDX0FSQl9PUF9FWFRfV1JJVEVMOworCWVsc2UgaWYgKG9wYyA+PSAweDgwICYmIG9wYyA8PSAweEZGKQorCQlvcGMgPSBQTUlDX0FSQl9PUF9aRVJPX1dSSVRFOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljbWQgPSAob3BjIDw8IDI3KSB8ICgoc2lkICYgMHhmKSA8PCAyMCkgfCAoYWRkciA8PCA0KSB8IChiYyAmIDB4Nyk7CisKKwkvKiBXcml0ZSBkYXRhIHRvIEZJRk9zICovCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwbWljX2FyYi0+bG9jaywgZmxhZ3MpOworCXBhX3dyaXRlX2RhdGEocG1pY19hcmIsIGJ1ZiwgUE1JQ19BUkJfV0RBVEEwKHBtaWNfYXJiLT5jaGFubmVsKQorCQkJCQkJCSwgbWluX3QodTgsIGJjLCAzKSk7CisJaWYgKGJjID4gMykKKwkJcGFfd3JpdGVfZGF0YShwbWljX2FyYiwgYnVmICsgNCwKKwkJCQlQTUlDX0FSQl9XREFUQTEocG1pY19hcmItPmNoYW5uZWwpLCBiYyAtIDQpOworCisJLyogU3RhcnQgdGhlIHRyYW5zYWN0aW9uICovCisJcG1pY19hcmJfYmFzZV93cml0ZShwbWljX2FyYiwgUE1JQ19BUkJfQ01EKHBtaWNfYXJiLT5jaGFubmVsKSwgY21kKTsKKwlyYyA9IHBtaWNfYXJiX3dhaXRfZm9yX2RvbmUoY3RybCk7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtaWNfYXJiLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2VudW0gcXBucGludF9yZWdzIHsKKwlRUE5QSU5UX1JFR19SVF9TVFMJCT0gMHgxMCwKKwlRUE5QSU5UX1JFR19TRVRfVFlQRQkJPSAweDExLAorCVFQTlBJTlRfUkVHX1BPTEFSSVRZX0hJR0gJPSAweDEyLAorCVFQTlBJTlRfUkVHX1BPTEFSSVRZX0xPVwk9IDB4MTMsCisJUVBOUElOVF9SRUdfTEFUQ0hFRF9DTFIJCT0gMHgxNCwKKwlRUE5QSU5UX1JFR19FTl9TRVQJCT0gMHgxNSwKKwlRUE5QSU5UX1JFR19FTl9DTFIJCT0gMHgxNiwKKwlRUE5QSU5UX1JFR19MQVRDSEVEX1NUUwkJPSAweDE4LAorfTsKKworc3RydWN0IHNwbWlfcG1pY19hcmJfcXBucGludF90eXBlIHsKKwl1OCB0eXBlOyAvKiAxIC0+IGVkZ2UgKi8KKwl1OCBwb2xhcml0eV9oaWdoOworCXU4IHBvbGFyaXR5X2xvdzsKK30gX19wYWNrZWQ7CisKKy8qIFNpbXBsaWZpZWQgYWNjZXNzb3IgZnVuY3Rpb25zIGZvciBpcnFjaGlwIGNhbGxiYWNrcyAqLworc3RhdGljIHZvaWQgcXBucGludF9zcG1pX3dyaXRlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdTggcmVnLCB2b2lkICpidWYsCisJCQkgICAgICAgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKnBhID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdTggc2lkID0gZC0+aHdpcnEgPj4gMjQ7CisJdTggcGVyID0gZC0+aHdpcnEgPj4gMTY7CisKKwlpZiAocG1pY19hcmJfd3JpdGVfY21kKHBhLT5zcG1pYywgU1BNSV9DTURfRVhUX1dSSVRFTCwgc2lkLAorCQkJICAgICAgIChwZXIgPDwgOCkgKyByZWcsIGJ1ZiwgbGVuKSkKKwkJZGV2X2Vycl9yYXRlbGltaXRlZCgmcGEtPnNwbWljLT5kZXYsCisJCQkJImZhaWxlZCBpcnFjaGlwIHRyYW5zYWN0aW9uIG9uICV4XG4iLAorCQkJCSAgICBkLT5pcnEpOworfQorCitzdGF0aWMgdm9pZCBxcG5waW50X3NwbWlfcmVhZChzdHJ1Y3QgaXJxX2RhdGEgKmQsIHU4IHJlZywgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzcG1pX3BtaWNfYXJiX2RldiAqcGEgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1OCBzaWQgPSBkLT5od2lycSA+PiAyNDsKKwl1OCBwZXIgPSBkLT5od2lycSA+PiAxNjsKKworCWlmIChwbWljX2FyYl9yZWFkX2NtZChwYS0+c3BtaWMsIFNQTUlfQ01EX0VYVF9SRUFETCwgc2lkLAorCQkJICAgICAgKHBlciA8PCA4KSArIHJlZywgYnVmLCBsZW4pKQorCQlkZXZfZXJyX3JhdGVsaW1pdGVkKCZwYS0+c3BtaWMtPmRldiwKKwkJCQkiZmFpbGVkIGlycWNoaXAgdHJhbnNhY3Rpb24gb24gJXhcbiIsCisJCQkJICAgIGQtPmlycSk7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmlwaF9pbnRlcnJ1cHQoc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwYSwgdTggYXBpZCkKK3sKKwl1bnNpZ25lZCBpbnQgaXJxOworCXUzMiBzdGF0dXM7CisJaW50IGlkOworCisJc3RhdHVzID0gcmVhZGxfcmVsYXhlZChwYS0+aW50ciArIFNQTUlfUElDX0lSUV9TVEFUVVMoYXBpZCkpOworCXdoaWxlIChzdGF0dXMpIHsKKwkJaWQgPSBmZnMoc3RhdHVzKSAtIDE7CisJCXN0YXR1cyAmPSB+KDEgPDwgaWQpOworCQlpcnEgPSBpcnFfZmluZF9tYXBwaW5nKHBhLT5kb21haW4sCisJCQkJICAgICAgIHBhLT5hcGlkX3RvX3BwaWRbYXBpZF0gPDwgMTYKKwkJCQkgICAgIHwgaWQgPDwgOAorCQkJCSAgICAgfCBhcGlkKTsKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwbWljX2FyYl9jaGFpbmVkX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwYSA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKGlycSk7CisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2dldF9jaGlwKGlycSk7CisJdm9pZCBfX2lvbWVtICppbnRyID0gcGEtPmludHI7CisJaW50IGZpcnN0ID0gcGEtPm1pbl9hcGlkID4+IDU7CisJaW50IGxhc3QgPSBwYS0+bWF4X2FwaWQgPj4gNTsKKwl1MzIgc3RhdHVzOworCWludCBpLCBpZDsKKworCWNoYWluZWRfaXJxX2VudGVyKGNoaXAsIGRlc2MpOworCisJZm9yIChpID0gZmlyc3Q7IGkgPD0gbGFzdDsgKytpKSB7CisJCXN0YXR1cyA9IHJlYWRsX3JlbGF4ZWQoaW50ciArCisJCQkJICAgICAgIFNQTUlfUElDX09XTkVSX0FDQ19TVEFUVVMocGEtPmVlLCBpKSk7CisJCXdoaWxlIChzdGF0dXMpIHsKKwkJCWlkID0gZmZzKHN0YXR1cykgLSAxOworCQkJc3RhdHVzICY9IH4oMSA8PCBpZCk7CisJCQlwZXJpcGhfaW50ZXJydXB0KHBhLCBpZCArIGkgKiAzMik7CisJCX0KKwl9CisKKwljaGFpbmVkX2lycV9leGl0KGNoaXAsIGRlc2MpOworfQorCitzdGF0aWMgdm9pZCBxcG5waW50X2lycV9hY2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBzcG1pX3BtaWNfYXJiX2RldiAqcGEgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1OCBpcnEgID0gZC0+aHdpcnEgPj4gODsKKwl1OCBhcGlkID0gZC0+aHdpcnE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBkYXRhOworCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwYS0+bG9jaywgZmxhZ3MpOworCXdyaXRlbF9yZWxheGVkKDEgPDwgaXJxLCBwYS0+aW50ciArIFNQTUlfUElDX0lSUV9DTEVBUihhcGlkKSk7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhLT5sb2NrLCBmbGFncyk7CisKKwlkYXRhID0gMSA8PCBpcnE7CisJcXBucGludF9zcG1pX3dyaXRlKGQsIFFQTlBJTlRfUkVHX0xBVENIRURfQ0xSLCAmZGF0YSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHFwbnBpbnRfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBzcG1pX3BtaWNfYXJiX2RldiAqcGEgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1OCBpcnEgID0gZC0+aHdpcnEgPj4gODsKKwl1OCBhcGlkID0gZC0+aHdpcnE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgc3RhdHVzOworCXU4IGRhdGE7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBhLT5sb2NrLCBmbGFncyk7CisJc3RhdHVzID0gcmVhZGxfcmVsYXhlZChwYS0+aW50ciArIFNQTUlfUElDX0FDQ19FTkFCTEUoYXBpZCkpOworCWlmIChzdGF0dXMgJiBTUE1JX1BJQ19BQ0NfRU5BQkxFX0JJVCkgeworCQlzdGF0dXMgPSBzdGF0dXMgJiB+U1BNSV9QSUNfQUNDX0VOQUJMRV9CSVQ7CisJCXdyaXRlbF9yZWxheGVkKHN0YXR1cywgcGEtPmludHIgKyBTUE1JX1BJQ19BQ0NfRU5BQkxFKGFwaWQpKTsKKwl9CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhLT5sb2NrLCBmbGFncyk7CisKKwlkYXRhID0gMSA8PCBpcnE7CisJcXBucGludF9zcG1pX3dyaXRlKGQsIFFQTlBJTlRfUkVHX0VOX0NMUiwgJmRhdGEsIDEpOworfQorCitzdGF0aWMgdm9pZCBxcG5waW50X2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBzcG1pX3BtaWNfYXJiX2RldiAqcGEgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1OCBpcnEgID0gZC0+aHdpcnEgPj4gODsKKwl1OCBhcGlkID0gZC0+aHdpcnE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgc3RhdHVzOworCXU4IGRhdGE7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBhLT5sb2NrLCBmbGFncyk7CisJc3RhdHVzID0gcmVhZGxfcmVsYXhlZChwYS0+aW50ciArIFNQTUlfUElDX0FDQ19FTkFCTEUoYXBpZCkpOworCWlmICghKHN0YXR1cyAmIFNQTUlfUElDX0FDQ19FTkFCTEVfQklUKSkgeworCQl3cml0ZWxfcmVsYXhlZChzdGF0dXMgfCBTUE1JX1BJQ19BQ0NfRU5BQkxFX0JJVCwKKwkJCQlwYS0+aW50ciArIFNQTUlfUElDX0FDQ19FTkFCTEUoYXBpZCkpOworCX0KKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGEtPmxvY2ssIGZsYWdzKTsKKworCWRhdGEgPSAxIDw8IGlycTsKKwlxcG5waW50X3NwbWlfd3JpdGUoZCwgUVBOUElOVF9SRUdfRU5fU0VULCAmZGF0YSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHFwbnBpbnRfaXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJdTggaXJxICA9IGQtPmh3aXJxID4+IDg7CisJdTggZGF0YTsKKworCXFwbnBpbnRfaXJxX3VubWFzayhkKTsKKworCWRhdGEgPSAxIDw8IGlycTsKKwlxcG5waW50X3NwbWlfd3JpdGUoZCwgUVBOUElOVF9SRUdfTEFUQ0hFRF9DTFIsICZkYXRhLCAxKTsKK30KKworc3RhdGljIGludCBxcG5waW50X2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfcXBucGludF90eXBlIHR5cGU7CisJdTggaXJxID0gZC0+aHdpcnEgPj4gODsKKworCXFwbnBpbnRfc3BtaV9yZWFkKGQsIFFQTlBJTlRfUkVHX1NFVF9UWVBFLCAmdHlwZSwgc2l6ZW9mKHR5cGUpKTsKKworCWlmIChmbG93X3R5cGUgJiAoSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HKSkgeworCQl0eXBlLnR5cGUgfD0gMSA8PCBpcnE7CisJCWlmIChmbG93X3R5cGUgJiBJUlFGX1RSSUdHRVJfUklTSU5HKQorCQkJdHlwZS5wb2xhcml0eV9oaWdoIHw9IDEgPDwgaXJxOworCQlpZiAoZmxvd190eXBlICYgSVJRRl9UUklHR0VSX0ZBTExJTkcpCisJCQl0eXBlLnBvbGFyaXR5X2xvdyAgfD0gMSA8PCBpcnE7CisJfSBlbHNlIHsKKwkJaWYgKChmbG93X3R5cGUgJiAoSVJRRl9UUklHR0VSX0hJR0gpKSAmJgorCQkgICAgKGZsb3dfdHlwZSAmIChJUlFGX1RSSUdHRVJfTE9XKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl0eXBlLnR5cGUgJj0gfigxIDw8IGlycSk7IC8qIGxldmVsIHRyaWcgKi8KKwkJaWYgKGZsb3dfdHlwZSAmIElSUUZfVFJJR0dFUl9ISUdIKQorCQkJdHlwZS5wb2xhcml0eV9oaWdoIHw9IDEgPDwgaXJxOworCQllbHNlCisJCQl0eXBlLnBvbGFyaXR5X2xvdyAgfD0gMSA8PCBpcnE7CisJfQorCisJcXBucGludF9zcG1pX3dyaXRlKGQsIFFQTlBJTlRfUkVHX1NFVF9UWVBFLCAmdHlwZSwgc2l6ZW9mKHR5cGUpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBwbWljX2FyYl9pcnFjaGlwID0geworCS5uYW1lCQk9ICJwbWljX2FyYiIsCisJLmlycV9lbmFibGUJPSBxcG5waW50X2lycV9lbmFibGUsCisJLmlycV9hY2sJPSBxcG5waW50X2lycV9hY2ssCisJLmlycV9tYXNrCT0gcXBucGludF9pcnFfbWFzaywKKwkuaXJxX3VubWFzawk9IHFwbnBpbnRfaXJxX3VubWFzaywKKwkuaXJxX3NldF90eXBlCT0gcXBucGludF9pcnFfc2V0X3R5cGUsCisJLmZsYWdzCQk9IElSUUNISVBfTUFTS19PTl9TVVNQRU5ECisJCQl8IElSUUNISVBfU0tJUF9TRVRfV0FLRSwKK307CisKK3N0cnVjdCBzcG1pX3BtaWNfYXJiX2lycV9zcGVjIHsKKwl1bnNpZ25lZCBzbGF2ZTo0OworCXVuc2lnbmVkIHBlcjo4OworCXVuc2lnbmVkIGlycTozOworfTsKKworc3RhdGljIGludCBzZWFyY2hfbWFwcGluZ190YWJsZShzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKnBhLAorCQkJCXN0cnVjdCBzcG1pX3BtaWNfYXJiX2lycV9zcGVjICpzcGVjLAorCQkJCXU4ICphcGlkKQoreworCXUxNiBwcGlkID0gc3BlYy0+c2xhdmUgPDwgOCB8IHNwZWMtPnBlcjsKKwl1MzIgKm1hcHBpbmdfdGFibGUgPSBwYS0+bWFwcGluZ190YWJsZTsKKwlpbnQgaW5kZXggPSAwLCBpOworCXUzMiBkYXRhOworCisJZm9yIChpID0gMDsgaSA8IFNQTUlfTUFQUElOR19UQUJMRV9UUkVFX0RFUFRIOyArK2kpIHsKKwkJZGF0YSA9IG1hcHBpbmdfdGFibGVbaW5kZXhdOworCisJCWlmIChwcGlkICYgKDEgPDwgU1BNSV9NQVBQSU5HX0JJVF9JTkRFWChkYXRhKSkpIHsKKwkJCWlmIChTUE1JX01BUFBJTkdfQklUX0lTXzFfRkxBRyhkYXRhKSkgeworCQkJCWluZGV4ID0gU1BNSV9NQVBQSU5HX0JJVF9JU18xX1JFU1VMVChkYXRhKTsKKwkJCX0gZWxzZSB7CisJCQkJKmFwaWQgPSBTUE1JX01BUFBJTkdfQklUX0lTXzFfUkVTVUxUKGRhdGEpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKFNQTUlfTUFQUElOR19CSVRfSVNfMF9GTEFHKGRhdGEpKSB7CisJCQkJaW5kZXggPSBTUE1JX01BUFBJTkdfQklUX0lTXzBfUkVTVUxUKGRhdGEpOworCQkJfSBlbHNlIHsKKwkJCQkqYXBpZCA9IFNQTUlfTUFQUElOR19CSVRfSVNfMF9SRVNVTFQoZGF0YSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBxcG5waW50X2lycV9kb21haW5fZHRfdHJhbnNsYXRlKHN0cnVjdCBpcnFfZG9tYWluICpkLAorCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvbnRyb2xsZXIsCisJCQkJCSAgIGNvbnN0IHUzMiAqaW50c3BlYywKKwkJCQkJICAgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm91dF9od2lycSwKKwkJCQkJICAgdW5zaWduZWQgaW50ICpvdXRfdHlwZSkKK3sKKwlzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKnBhID0gZC0+aG9zdF9kYXRhOworCXN0cnVjdCBzcG1pX3BtaWNfYXJiX2lycV9zcGVjIHNwZWM7CisJaW50IGVycjsKKwl1OCBhcGlkOworCisJZGV2X2RiZygmcGEtPnNwbWljLT5kZXYsCisJCSJpbnRzcGVjWzBdIDB4JTF4IGludHNwZWNbMV0gMHglMDJ4IGludHNwZWNbMl0gMHglMDJ4XG4iLAorCQlpbnRzcGVjWzBdLCBpbnRzcGVjWzFdLCBpbnRzcGVjWzJdKTsKKworCWlmIChkLT5vZl9ub2RlICE9IGNvbnRyb2xsZXIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpbnRzaXplICE9IDQpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpbnRzcGVjWzBdID4gMHhGIHx8IGludHNwZWNbMV0gPiAweEZGIHx8IGludHNwZWNbMl0gPiAweDcpCisJCXJldHVybiAtRUlOVkFMOworCisJc3BlYy5zbGF2ZSA9IGludHNwZWNbMF07CisJc3BlYy5wZXIgICA9IGludHNwZWNbMV07CisJc3BlYy5pcnEgICA9IGludHNwZWNbMl07CisKKwllcnIgPSBzZWFyY2hfbWFwcGluZ190YWJsZShwYSwgJnNwZWMsICZhcGlkKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcGEtPmFwaWRfdG9fcHBpZFthcGlkXSA9IHNwZWMuc2xhdmUgPDwgOCB8IHNwZWMucGVyOworCisJLyogS2VlcCB0cmFjayBvZiB7bWF4LG1pbn1fYXBpZCBmb3IgYm91bmRpbmcgc2VhcmNoIGR1cmluZyBpbnRlcnJ1cHQgKi8KKwlpZiAoYXBpZCA+IHBhLT5tYXhfYXBpZCkKKwkJcGEtPm1heF9hcGlkID0gYXBpZDsKKwlpZiAoYXBpZCA8IHBhLT5taW5fYXBpZCkKKwkJcGEtPm1pbl9hcGlkID0gYXBpZDsKKworCSpvdXRfaHdpcnEgPSBzcGVjLnNsYXZlIDw8IDI0CisJCSAgIHwgc3BlYy5wZXIgICA8PCAxNgorCQkgICB8IHNwZWMuaXJxICAgPDwgOAorCQkgICB8IGFwaWQ7CisJKm91dF90eXBlICA9IGludHNwZWNbM10gJiBJUlFfVFlQRV9TRU5TRV9NQVNLOworCisJZGV2X2RiZygmcGEtPnNwbWljLT5kZXYsICJvdXRfaHdpcnEgPSAlbHVcbiIsICpvdXRfaHdpcnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXBucGludF9pcnFfZG9tYWluX21hcChzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwKKwkJCQkgIHVuc2lnbmVkIGludCB2aXJxLAorCQkJCSAgaXJxX2h3X251bWJlcl90IGh3aXJxKQoreworCXN0cnVjdCBzcG1pX3BtaWNfYXJiX2RldiAqcGEgPSBkLT5ob3N0X2RhdGE7CisKKwlkZXZfZGJnKCZwYS0+c3BtaWMtPmRldiwgInZpcnEgPSAldSwgaHdpcnEgPSAlbHVcbiIsIHZpcnEsIGh3aXJxKTsKKworCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmcG1pY19hcmJfaXJxY2hpcCwgaGFuZGxlX2xldmVsX2lycSk7CisJaXJxX3NldF9jaGlwX2RhdGEodmlycSwgZC0+aG9zdF9kYXRhKTsKKwlpcnFfc2V0X25vcHJvYmUodmlycSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgcG1pY19hcmJfaXJxX2RvbWFpbl9vcHMgPSB7CisJLm1hcAk9IHFwbnBpbnRfaXJxX2RvbWFpbl9tYXAsCisJLnhsYXRlCT0gcXBucGludF9pcnFfZG9tYWluX2R0X3RyYW5zbGF0ZSwKK307CisKK3N0YXRpYyBpbnQgc3BtaV9wbWljX2FyYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcG1pX3BtaWNfYXJiX2RldiAqcGE7CisJc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl1MzIgY2hhbm5lbCwgZWU7CisJaW50IGVyciwgaTsKKworCWN0cmwgPSBzcG1pX2NvbnRyb2xsZXJfYWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwYSkpOworCWlmICghY3RybCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwYSA9IHNwbWlfY29udHJvbGxlcl9nZXRfZHJ2ZGF0YShjdHJsKTsKKwlwYS0+c3BtaWMgPSBjdHJsOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgImNvcmUiKTsKKwlwYS0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmY3RybC0+ZGV2LCByZXMpOworCWlmIChJU19FUlIocGEtPmJhc2UpKSB7CisJCWVyciA9IFBUUl9FUlIocGEtPmJhc2UpOworCQlnb3RvIGVycl9wdXRfY3RybDsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAiaW50ciIpOworCXBhLT5pbnRyID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZjdHJsLT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihwYS0+aW50cikpIHsKKwkJZXJyID0gUFRSX0VSUihwYS0+aW50cik7CisJCWdvdG8gZXJyX3B1dF9jdHJsOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJjbmZnIik7CisJcGEtPmNuZmcgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJmN0cmwtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHBhLT5jbmZnKSkgeworCQllcnIgPSBQVFJfRVJSKHBhLT5jbmZnKTsKKwkJZ290byBlcnJfcHV0X2N0cmw7CisJfQorCisJcGEtPmlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJwZXJpcGhfaXJxIik7CisJaWYgKHBhLT5pcnEgPCAwKSB7CisJCWVyciA9IHBhLT5pcnE7CisJCWdvdG8gZXJyX3B1dF9jdHJsOworCX0KKworCWVyciA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAicWNvbSxjaGFubmVsIiwgJmNoYW5uZWwpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2hhbm5lbCB1bnNwZWNpZmllZC5cbiIpOworCQlnb3RvIGVycl9wdXRfY3RybDsKKwl9CisKKwlpZiAoY2hhbm5lbCA+IDUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW52YWxpZCBjaGFubmVsICgldSkgc3BlY2lmaWVkLlxuIiwKKwkJCWNoYW5uZWwpOworCQlnb3RvIGVycl9wdXRfY3RybDsKKwl9CisKKwlwYS0+Y2hhbm5lbCA9IGNoYW5uZWw7CisKKwllcnIgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgInFjb20sZWUiLCAmZWUpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRUUgdW5zcGVjaWZpZWQuXG4iKTsKKwkJZ290byBlcnJfcHV0X2N0cmw7CisJfQorCisJaWYgKGVlID4gNSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpbnZhbGlkIEVFICgldSkgc3BlY2lmaWVkXG4iLCBlZSk7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3B1dF9jdHJsOworCX0KKworCXBhLT5lZSA9IGVlOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGEtPm1hcHBpbmdfdGFibGUpOyArK2kpCisJCXBhLT5tYXBwaW5nX3RhYmxlW2ldID0gcmVhZGxfcmVsYXhlZCgKKwkJCQlwYS0+Y25mZyArIFNQTUlfTUFQUElOR19UQUJMRV9SRUcoaSkpOworCisJLyogSW5pdGlhbGl6ZSBtYXhfYXBpZC9taW5fYXBpZCB0byB0aGUgb3Bwb3NpdGUgYm91bmRzLCBkdXJpbmcKKwkgKiB0aGUgaXJxIGRvbWFpbiB0cmFuc2xhdGlvbiwgd2UgYXJlIHN1cmUgdG8gdXBkYXRlIHRoZXNlICovCisJcGEtPm1heF9hcGlkID0gMDsKKwlwYS0+bWluX2FwaWQgPSBQTUlDX0FSQl9NQVhfUEVSSVBIUyAtIDE7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjdHJsKTsKKwlyYXdfc3Bpbl9sb2NrX2luaXQoJnBhLT5sb2NrKTsKKworCWN0cmwtPmNtZCA9IHBtaWNfYXJiX2NtZDsKKwljdHJsLT5yZWFkX2NtZCA9IHBtaWNfYXJiX3JlYWRfY21kOworCWN0cmwtPndyaXRlX2NtZCA9IHBtaWNfYXJiX3dyaXRlX2NtZDsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgImFkZGluZyBpcnEgZG9tYWluXG4iKTsKKwlwYS0+ZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfdHJlZShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJICZwbWljX2FyYl9pcnFfZG9tYWluX29wcywgcGEpOworCWlmICghcGEtPmRvbWFpbikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gY3JlYXRlIGlycV9kb21haW5cbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9wdXRfY3RybDsKKwl9CisKKwlpcnFfc2V0X2hhbmRsZXJfZGF0YShwYS0+aXJxLCBwYSk7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIocGEtPmlycSwgcG1pY19hcmJfY2hhaW5lZF9pcnEpOworCisJZXJyID0gc3BtaV9jb250cm9sbGVyX2FkZChjdHJsKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9kb21haW5fcmVtb3ZlOworCisJZGV2X2RiZygmY3RybC0+ZGV2LCAiUE1JQyBBcmIgVmVyc2lvbiAweCV4XG4iLAorCQlwbWljX2FyYl9iYXNlX3JlYWQocGEsIFBNSUNfQVJCX1ZFUlNJT04pKTsKKworCXJldHVybiAwOworCitlcnJfZG9tYWluX3JlbW92ZToKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihwYS0+aXJxLCBOVUxMKTsKKwlpcnFfc2V0X2hhbmRsZXJfZGF0YShwYS0+aXJxLCBOVUxMKTsKKwlpcnFfZG9tYWluX3JlbW92ZShwYS0+ZG9tYWluKTsKK2Vycl9wdXRfY3RybDoKKwlzcG1pX2NvbnRyb2xsZXJfcHV0KGN0cmwpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc3BtaV9wbWljX2FyYl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwYSA9IHNwbWlfY29udHJvbGxlcl9nZXRfZHJ2ZGF0YShjdHJsKTsKKwlzcG1pX2NvbnRyb2xsZXJfcmVtb3ZlKGN0cmwpOworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKHBhLT5pcnEsIE5VTEwpOworCWlycV9zZXRfaGFuZGxlcl9kYXRhKHBhLT5pcnEsIE5VTEwpOworCWlycV9kb21haW5fcmVtb3ZlKHBhLT5kb21haW4pOworCXNwbWlfY29udHJvbGxlcl9wdXQoY3RybCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNwbWlfcG1pY19hcmJfbWF0Y2hfdGFibGVbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sc3BtaS1wbWljLWFyYiIsIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3BtaV9wbWljX2FyYl9tYXRjaF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNwbWlfcG1pY19hcmJfZHJpdmVyID0geworCS5wcm9iZQkJPSBzcG1pX3BtaWNfYXJiX3Byb2JlLAorCS5yZW1vdmUJCT0gc3BtaV9wbWljX2FyYl9yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInNwbWlfcG1pY19hcmIiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gc3BtaV9wbWljX2FyYl9tYXRjaF90YWJsZSwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3BtaV9wbWljX2FyYl9kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnNwbWlfcG1pY19hcmIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BtaS9zcG1pLmMgYi9kcml2ZXJzL3NwbWkvc3BtaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNTc4MDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwbWkvc3BtaS5jCkBAIC0wLDAgKzEsNTc0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BtaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL3NwbWkvc3BtaS5oPgorCitzdGF0aWMgREVGSU5FX0lEQShjdHJsX2lkYSk7CisKK3N0YXRpYyB2b2lkIHNwbWlfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzcG1pX2RldmljZSAqc2RldiA9IHRvX3NwbWlfZGV2aWNlKGRldik7CisJa2ZyZWUoc2Rldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2aWNlX3R5cGUgc3BtaV9kZXZfdHlwZSA9IHsKKwkucmVsZWFzZQk9IHNwbWlfZGV2X3JlbGVhc2UsCit9OworCitzdGF0aWMgdm9pZCBzcG1pX2N0cmxfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCA9IHRvX3NwbWlfY29udHJvbGxlcihkZXYpOworCWlkYV9zaW1wbGVfcmVtb3ZlKCZjdHJsX2lkYSwgY3RybC0+bnIpOworCWtmcmVlKGN0cmwpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldmljZV90eXBlIHNwbWlfY3RybF90eXBlID0geworCS5yZWxlYXNlCT0gc3BtaV9jdHJsX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHNwbWlfZGV2aWNlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlpZiAob2ZfZHJpdmVyX21hdGNoX2RldmljZShkZXYsIGRydikpCisJCXJldHVybiAxOworCisJaWYgKGRydi0+bmFtZSkKKwkJcmV0dXJuIHN0cm5jbXAoZGV2X25hbWUoZGV2KSwgZHJ2LT5uYW1lLAorCQkJICAgICAgIFNQTUlfTkFNRV9TSVpFKSA9PSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc3BtaV9kZXZpY2VfYWRkKCkgLSBhZGQgYSBkZXZpY2UgcHJldmlvdXNseSBjb25zdHJ1Y3RlZCB2aWEgc3BtaV9kZXZpY2VfYWxsb2MoKQorICogQHNkZXY6CXNwbWlfZGV2aWNlIHRvIGJlIGFkZGVkCisgKi8KK2ludCBzcG1pX2RldmljZV9hZGQoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2KQoreworCXN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwgPSBzZGV2LT5jdHJsOworCWludCBlcnI7CisKKwlkZXZfc2V0X25hbWUoJnNkZXYtPmRldiwgIiVkLSUwMngiLCBjdHJsLT5uciwgc2Rldi0+dXNpZCk7CisKKwllcnIgPSBkZXZpY2VfYWRkKCZzZGV2LT5kZXYpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoJnNkZXYtPmRldiwgIkNhbid0IGFkZCAlcywgc3RhdHVzICVkXG4iLAorCQkJZGV2X25hbWUoJnNkZXYtPmRldiksIGVycik7CisJCWdvdG8gZXJyX2RldmljZV9hZGQ7CisJfQorCisJZGV2X2RiZygmc2Rldi0+ZGV2LCAiZGV2aWNlICVzIHJlZ2lzdGVyZWRcbiIsIGRldl9uYW1lKCZzZGV2LT5kZXYpKTsKKworZXJyX2RldmljZV9hZGQ6CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfZGV2aWNlX2FkZCk7CisKKy8qKgorICogc3BtaV9kZXZpY2VfcmVtb3ZlKCk6IHJlbW92ZSBhbiBTUE1JIGRldmljZQorICogQHNkZXY6CXNwbWlfZGV2aWNlIHRvIGJlIHJlbW92ZWQKKyAqLwordm9pZCBzcG1pX2RldmljZV9yZW1vdmUoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2KQoreworCWRldmljZV91bnJlZ2lzdGVyKCZzZGV2LT5kZXYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BtaV9kZXZpY2VfcmVtb3ZlKTsKKworc3RhdGljIGlubGluZSBpbnQKK3NwbWlfY21kKHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwsIHU4IG9wY29kZSwgdTggc2lkKQoreworCWlmICghY3RybCB8fCAhY3RybC0+Y21kIHx8IGN0cmwtPmRldi50eXBlICE9ICZzcG1pX2N0cmxfdHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gY3RybC0+Y21kKGN0cmwsIG9wY29kZSwgc2lkKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3BtaV9yZWFkX2NtZChzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsLCB1OCBvcGNvZGUsCisJCQkJdTggc2lkLCB1MTYgYWRkciwgdTggKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpZiAoIWN0cmwgfHwgIWN0cmwtPnJlYWRfY21kIHx8IGN0cmwtPmRldi50eXBlICE9ICZzcG1pX2N0cmxfdHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gY3RybC0+cmVhZF9jbWQoY3RybCwgb3Bjb2RlLCBzaWQsIGFkZHIsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3BtaV93cml0ZV9jbWQoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCwgdTggb3Bjb2RlLAorCQkJCSB1OCBzaWQsIHUxNiBhZGRyLCBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKQoreworCWlmICghY3RybCB8fCAhY3RybC0+d3JpdGVfY21kIHx8IGN0cmwtPmRldi50eXBlICE9ICZzcG1pX2N0cmxfdHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gY3RybC0+d3JpdGVfY21kKGN0cmwsIG9wY29kZSwgc2lkLCBhZGRyLCBidWYsIGxlbik7Cit9CisKKy8qKgorICogc3BtaV9yZWdpc3Rlcl9yZWFkKCkgLSByZWdpc3RlciByZWFkCisgKiBAc2RldjoJU1BNSSBkZXZpY2UuCisgKiBAYWRkcjoJc2xhdmUgcmVnaXN0ZXIgYWRkcmVzcyAoNS1iaXQgYWRkcmVzcykuCisgKiBAYnVmOglidWZmZXIgdG8gYmUgcG9wdWxhdGVkIHdpdGggZGF0YSBmcm9tIHRoZSBTbGF2ZS4KKyAqCisgKiBSZWFkcyAxIGJ5dGUgb2YgZGF0YSBmcm9tIGEgU2xhdmUgZGV2aWNlIHJlZ2lzdGVyLgorICovCitpbnQgc3BtaV9yZWdpc3Rlcl9yZWFkKHN0cnVjdCBzcG1pX2RldmljZSAqc2RldiwgdTggYWRkciwgdTggKmJ1ZikKK3sKKwkvKiA1LWJpdCByZWdpc3RlciBhZGRyZXNzICovCisJaWYgKGFkZHIgPiAweDFGKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzcG1pX3JlYWRfY21kKHNkZXYtPmN0cmwsIFNQTUlfQ01EX1JFQUQsIHNkZXYtPnVzaWQsIGFkZHIsCisJCQkgICAgIGJ1ZiwgMSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX3JlZ2lzdGVyX3JlYWQpOworCisvKioKKyAqIHNwbWlfZXh0X3JlZ2lzdGVyX3JlYWQoKSAtIGV4dGVuZGVkIHJlZ2lzdGVyIHJlYWQKKyAqIEBzZGV2OglTUE1JIGRldmljZS4KKyAqIEBhZGRyOglzbGF2ZSByZWdpc3RlciBhZGRyZXNzICg4LWJpdCBhZGRyZXNzKS4KKyAqIEBidWY6CWJ1ZmZlciB0byBiZSBwb3B1bGF0ZWQgd2l0aCBkYXRhIGZyb20gdGhlIFNsYXZlLgorICogQGxlbjoJdGhlIHJlcXVlc3QgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgKHVwIHRvIDE2IGJ5dGVzKS4KKyAqCisgKiBSZWFkcyB1cCB0byAxNiBieXRlcyBvZiBkYXRhIGZyb20gdGhlIGV4dGVuZGVkIHJlZ2lzdGVyIHNwYWNlIG9uIGEKKyAqIFNsYXZlIGRldmljZS4KKyAqLworaW50IHNwbWlfZXh0X3JlZ2lzdGVyX3JlYWQoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LCB1OCBhZGRyLCB1OCAqYnVmLAorCQkJICAgc2l6ZV90IGxlbikKK3sKKwkvKiA4LWJpdCByZWdpc3RlciBhZGRyZXNzLCB1cCB0byAxNiBieXRlcyAqLworCWlmIChsZW4gPT0gMCB8fCBsZW4gPiAxNikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc3BtaV9yZWFkX2NtZChzZGV2LT5jdHJsLCBTUE1JX0NNRF9FWFRfUkVBRCwgc2Rldi0+dXNpZCwgYWRkciwKKwkJCSAgICAgYnVmLCBsZW4pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BtaV9leHRfcmVnaXN0ZXJfcmVhZCk7CisKKy8qKgorICogc3BtaV9leHRfcmVnaXN0ZXJfcmVhZGwoKSAtIGV4dGVuZGVkIHJlZ2lzdGVyIHJlYWQgbG9uZworICogQHNkZXY6CVNQTUkgZGV2aWNlLgorICogQGFkZHI6CXNsYXZlIHJlZ2lzdGVyIGFkZHJlc3MgKDE2LWJpdCBhZGRyZXNzKS4KKyAqIEBidWY6CWJ1ZmZlciB0byBiZSBwb3B1bGF0ZWQgd2l0aCBkYXRhIGZyb20gdGhlIFNsYXZlLgorICogQGxlbjoJdGhlIHJlcXVlc3QgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgKHVwIHRvIDggYnl0ZXMpLgorICoKKyAqIFJlYWRzIHVwIHRvIDggYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBleHRlbmRlZCByZWdpc3RlciBzcGFjZSBvbiBhCisgKiBTbGF2ZSBkZXZpY2UgdXNpbmcgMTYtYml0IGFkZHJlc3MuCisgKi8KK2ludCBzcG1pX2V4dF9yZWdpc3Rlcl9yZWFkbChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsIHUxNiBhZGRyLCB1OCAqYnVmLAorCQkJICAgIHNpemVfdCBsZW4pCit7CisJLyogMTYtYml0IHJlZ2lzdGVyIGFkZHJlc3MsIHVwIHRvIDggYnl0ZXMgKi8KKwlpZiAobGVuID09IDAgfHwgbGVuID4gOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc3BtaV9yZWFkX2NtZChzZGV2LT5jdHJsLCBTUE1JX0NNRF9FWFRfUkVBREwsIHNkZXYtPnVzaWQsIGFkZHIsCisJCQkgICAgIGJ1ZiwgbGVuKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfZXh0X3JlZ2lzdGVyX3JlYWRsKTsKKworLyoqCisgKiBzcG1pX3JlZ2lzdGVyX3dyaXRlKCkgLSByZWdpc3RlciB3cml0ZQorICogQHNkZXY6CVNQTUkgZGV2aWNlCisgKiBAYWRkcjoJc2xhdmUgcmVnaXN0ZXIgYWRkcmVzcyAoNS1iaXQgYWRkcmVzcykuCisgKiBAZGF0YToJYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIFNsYXZlLgorICoKKyAqIFdyaXRlcyAxIGJ5dGUgb2YgZGF0YSB0byBhIFNsYXZlIGRldmljZSByZWdpc3Rlci4KKyAqLworaW50IHNwbWlfcmVnaXN0ZXJfd3JpdGUoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LCB1OCBhZGRyLCB1OCBkYXRhKQoreworCS8qIDUtYml0IHJlZ2lzdGVyIGFkZHJlc3MgKi8KKwlpZiAoYWRkciA+IDB4MUYpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHNwbWlfd3JpdGVfY21kKHNkZXYtPmN0cmwsIFNQTUlfQ01EX1dSSVRFLCBzZGV2LT51c2lkLCBhZGRyLAorCQkJICAgICAgJmRhdGEsIDEpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BtaV9yZWdpc3Rlcl93cml0ZSk7CisKKy8qKgorICogc3BtaV9yZWdpc3Rlcl96ZXJvX3dyaXRlKCkgLSByZWdpc3RlciB6ZXJvIHdyaXRlCisgKiBAc2RldjoJU1BNSSBkZXZpY2UuCisgKiBAZGF0YToJdGhlIGRhdGEgdG8gYmUgd3JpdHRlbiB0byByZWdpc3RlciAwICg3LWJpdHMpLgorICoKKyAqIFdyaXRlcyBkYXRhIHRvIHJlZ2lzdGVyIDAgb2YgdGhlIFNsYXZlIGRldmljZS4KKyAqLworaW50IHNwbWlfcmVnaXN0ZXJfemVyb193cml0ZShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsIHU4IGRhdGEpCit7CisJcmV0dXJuIHNwbWlfd3JpdGVfY21kKHNkZXYtPmN0cmwsIFNQTUlfQ01EX1pFUk9fV1JJVEUsIHNkZXYtPnVzaWQsIDAsCisJCQkgICAgICAmZGF0YSwgMSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX3JlZ2lzdGVyX3plcm9fd3JpdGUpOworCisvKioKKyAqIHNwbWlfZXh0X3JlZ2lzdGVyX3dyaXRlKCkgLSBleHRlbmRlZCByZWdpc3RlciB3cml0ZQorICogQHNkZXY6CVNQTUkgZGV2aWNlLgorICogQGFkZHI6CXNsYXZlIHJlZ2lzdGVyIGFkZHJlc3MgKDgtYml0IGFkZHJlc3MpLgorICogQGJ1ZjoJYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIFNsYXZlLgorICogQGxlbjoJdGhlIHJlcXVlc3QgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgKHVwIHRvIDE2IGJ5dGVzKS4KKyAqCisgKiBXcml0ZXMgdXAgdG8gMTYgYnl0ZXMgb2YgZGF0YSB0byB0aGUgZXh0ZW5kZWQgcmVnaXN0ZXIgc3BhY2Ugb2YgYQorICogU2xhdmUgZGV2aWNlLgorICovCitpbnQgc3BtaV9leHRfcmVnaXN0ZXJfd3JpdGUoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LCB1OCBhZGRyLCBjb25zdCB1OCAqYnVmLAorCQkJICAgIHNpemVfdCBsZW4pCit7CisJLyogOC1iaXQgcmVnaXN0ZXIgYWRkcmVzcywgdXAgdG8gMTYgYnl0ZXMgKi8KKwlpZiAobGVuID09IDAgfHwgbGVuID4gMTYpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHNwbWlfd3JpdGVfY21kKHNkZXYtPmN0cmwsIFNQTUlfQ01EX0VYVF9XUklURSwgc2Rldi0+dXNpZCwgYWRkciwKKwkJCSAgICAgIGJ1ZiwgbGVuKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfZXh0X3JlZ2lzdGVyX3dyaXRlKTsKKworLyoqCisgKiBzcG1pX2V4dF9yZWdpc3Rlcl93cml0ZWwoKSAtIGV4dGVuZGVkIHJlZ2lzdGVyIHdyaXRlIGxvbmcKKyAqIEBzZGV2OglTUE1JIGRldmljZS4KKyAqIEBhZGRyOglzbGF2ZSByZWdpc3RlciBhZGRyZXNzICgxNi1iaXQgYWRkcmVzcykuCisgKiBAYnVmOglidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgU2xhdmUuCisgKiBAbGVuOgl0aGUgcmVxdWVzdCBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCAodXAgdG8gOCBieXRlcykuCisgKgorICogV3JpdGVzIHVwIHRvIDggYnl0ZXMgb2YgZGF0YSB0byB0aGUgZXh0ZW5kZWQgcmVnaXN0ZXIgc3BhY2Ugb2YgYQorICogU2xhdmUgZGV2aWNlIHVzaW5nIDE2LWJpdCBhZGRyZXNzLgorICovCitpbnQgc3BtaV9leHRfcmVnaXN0ZXJfd3JpdGVsKHN0cnVjdCBzcG1pX2RldmljZSAqc2RldiwgdTE2IGFkZHIsIGNvbnN0IHU4ICpidWYsCisJCQkgICAgIHNpemVfdCBsZW4pCit7CisJLyogNC1iaXQgU2xhdmUgSWRlbnRpZmllciwgMTYtYml0IHJlZ2lzdGVyIGFkZHJlc3MsIHVwIHRvIDggYnl0ZXMgKi8KKwlpZiAobGVuID09IDAgfHwgbGVuID4gOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc3BtaV93cml0ZV9jbWQoc2Rldi0+Y3RybCwgU1BNSV9DTURfRVhUX1dSSVRFTCwgc2Rldi0+dXNpZCwKKwkJCSAgICAgIGFkZHIsIGJ1ZiwgbGVuKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfZXh0X3JlZ2lzdGVyX3dyaXRlbCk7CisKKy8qKgorICogc3BtaV9jb21tYW5kX3Jlc2V0KCkgLSBzZW5kcyBSRVNFVCBjb21tYW5kIHRvIHRoZSBzcGVjaWZpZWQgc2xhdmUKKyAqIEBzZGV2OglTUE1JIGRldmljZS4KKyAqCisgKiBUaGUgUmVzZXQgY29tbWFuZCBpbml0aWFsaXplcyB0aGUgU2xhdmUgYW5kIGZvcmNlcyBhbGwgcmVnaXN0ZXJzIHRvCisgKiB0aGVpciByZXNldCB2YWx1ZXMuIFRoZSBTbGF2ZSBzaGFsbCBlbnRlciB0aGUgU1RBUlRVUCBzdGF0ZSBhZnRlcgorICogcmVjZWl2aW5nIGEgUmVzZXQgY29tbWFuZC4KKyAqLworaW50IHNwbWlfY29tbWFuZF9yZXNldChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpCit7CisJcmV0dXJuIHNwbWlfY21kKHNkZXYtPmN0cmwsIFNQTUlfQ01EX1JFU0VULCBzZGV2LT51c2lkKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfY29tbWFuZF9yZXNldCk7CisKKy8qKgorICogc3BtaV9jb21tYW5kX3NsZWVwKCkgLSBzZW5kcyBTTEVFUCBjb21tYW5kIHRvIHRoZSBzcGVjaWZpZWQgU1BNSSBkZXZpY2UKKyAqIEBzZGV2OglTUE1JIGRldmljZS4KKyAqCisgKiBUaGUgU2xlZXAgY29tbWFuZCBjYXVzZXMgdGhlIFNsYXZlIHRvIGVudGVyIHRoZSB1c2VyIGRlZmluZWQgU0xFRVAgc3RhdGUuCisgKi8KK2ludCBzcG1pX2NvbW1hbmRfc2xlZXAoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2KQoreworCXJldHVybiBzcG1pX2NtZChzZGV2LT5jdHJsLCBTUE1JX0NNRF9TTEVFUCwgc2Rldi0+dXNpZCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX2NvbW1hbmRfc2xlZXApOworCisvKioKKyAqIHNwbWlfY29tbWFuZF93YWtldXAoKSAtIHNlbmRzIFdBS0VVUCBjb21tYW5kIHRvIHRoZSBzcGVjaWZpZWQgU1BNSSBkZXZpY2UKKyAqIEBzZGV2OglTUE1JIGRldmljZS4KKyAqCisgKiBUaGUgV2FrZXVwIGNvbW1hbmQgY2F1c2VzIHRoZSBTbGF2ZSB0byBtb3ZlIGZyb20gdGhlIFNMRUVQIHN0YXRlIHRvCisgKiB0aGUgQUNUSVZFIHN0YXRlLgorICovCitpbnQgc3BtaV9jb21tYW5kX3dha2V1cChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpCit7CisJcmV0dXJuIHNwbWlfY21kKHNkZXYtPmN0cmwsIFNQTUlfQ01EX1dBS0VVUCwgc2Rldi0+dXNpZCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX2NvbW1hbmRfd2FrZXVwKTsKKworLyoqCisgKiBzcG1pX2NvbW1hbmRfc2h1dGRvd24oKSAtIHNlbmRzIFNIVVRET1dOIGNvbW1hbmQgdG8gdGhlIHNwZWNpZmllZCBTUE1JIGRldmljZQorICogQHNkZXY6CVNQTUkgZGV2aWNlLgorICoKKyAqIFRoZSBTaHV0ZG93biBjb21tYW5kIGNhdXNlcyB0aGUgU2xhdmUgdG8gZW50ZXIgdGhlIFNIVVRET1dOIHN0YXRlLgorICovCitpbnQgc3BtaV9jb21tYW5kX3NodXRkb3duKHN0cnVjdCBzcG1pX2RldmljZSAqc2RldikKK3sKKwlyZXR1cm4gc3BtaV9jbWQoc2Rldi0+Y3RybCwgU1BNSV9DTURfU0hVVERPV04sIHNkZXYtPnVzaWQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BtaV9jb21tYW5kX3NodXRkb3duKTsKKworc3RhdGljIGludCBzcG1pX2Rydl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IHNwbWlfZHJpdmVyICpzZHJ2ID0gdG9fc3BtaV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCXN0cnVjdCBzcG1pX2RldmljZSAqc2RldiA9IHRvX3NwbWlfZGV2aWNlKGRldik7CisJaW50IGVycjsKKworCS8qIEVuc3VyZSB0aGUgc2xhdmUgaXMgaW4gQUNUSVZFIHN0YXRlICovCisJZXJyID0gc3BtaV9jb21tYW5kX3dha2V1cChzZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxfd2FrZXVwOworCisJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCisJZXJyID0gc2Rydi0+cHJvYmUoc2Rldik7CisJaWYgKGVycikKKwkJZ290byBmYWlsX3Byb2JlOworCisJcmV0dXJuIDA7CisKK2ZhaWxfcHJvYmU6CisJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CisJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRldik7CisJcG1fcnVudGltZV9wdXRfbm9pZGxlKGRldik7CitmYWlsX3dha2V1cDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNwbWlfZHJ2X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IHNwbWlfZHJpdmVyICpzZHJ2ID0gdG9fc3BtaV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOworCXNkcnYtPnJlbW92ZSh0b19zcG1pX2RldmljZShkZXYpKTsKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2KTsKKworCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZChkZXYpOworCXBtX3J1bnRpbWVfcHV0X25vaWRsZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1c190eXBlIHNwbWlfYnVzX3R5cGUgPSB7CisJLm5hbWUJCT0gInNwbWkiLAorCS5tYXRjaAkJPSBzcG1pX2RldmljZV9tYXRjaCwKKwkucHJvYmUJCT0gc3BtaV9kcnZfcHJvYmUsCisJLnJlbW92ZQkJPSBzcG1pX2Rydl9yZW1vdmUsCit9OworCisvKioKKyAqIHNwbWlfY29udHJvbGxlcl9hbGxvYygpIC0gQWxsb2NhdGUgYSBuZXcgU1BNSSBkZXZpY2UKKyAqIEBjdHJsOglhc3NvY2lhdGVkIGNvbnRyb2xsZXIKKyAqCisgKiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVpdGhlciBjYWxsaW5nIHNwbWlfZGV2aWNlX2FkZCgpIHRvIGFkZCB0aGUKKyAqIG5ld2x5IGFsbG9jYXRlZCBjb250cm9sbGVyLCBvciBjYWxsaW5nIHNwbWlfZGV2aWNlX3B1dCgpIHRvIGRpc2NhcmQgaXQuCisgKi8KK3N0cnVjdCBzcG1pX2RldmljZSAqc3BtaV9kZXZpY2VfYWxsb2Moc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCkKK3sKKwlzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXY7CisKKwlzZGV2ID0ga3phbGxvYyhzaXplb2YoKnNkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNkZXYpCisJCXJldHVybiBOVUxMOworCisJc2Rldi0+Y3RybCA9IGN0cmw7CisJZGV2aWNlX2luaXRpYWxpemUoJnNkZXYtPmRldik7CisJc2Rldi0+ZGV2LnBhcmVudCA9ICZjdHJsLT5kZXY7CisJc2Rldi0+ZGV2LmJ1cyA9ICZzcG1pX2J1c190eXBlOworCXNkZXYtPmRldi50eXBlID0gJnNwbWlfZGV2X3R5cGU7CisJcmV0dXJuIHNkZXY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX2RldmljZV9hbGxvYyk7CisKKy8qKgorICogc3BtaV9jb250cm9sbGVyX2FsbG9jKCkgLSBBbGxvY2F0ZSBhIG5ldyBTUE1JIGNvbnRyb2xsZXIKKyAqIEBwYXJlbnQ6CXBhcmVudCBkZXZpY2UKKyAqIEBzaXplOglzaXplIG9mIHByaXZhdGUgZGF0YQorICoKKyAqIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZWl0aGVyIGNhbGxpbmcgc3BtaV9jb250cm9sbGVyX2FkZCgpIHRvIGFkZCB0aGUKKyAqIG5ld2x5IGFsbG9jYXRlZCBjb250cm9sbGVyLCBvciBjYWxsaW5nIHNwbWlfY29udHJvbGxlcl9wdXQoKSB0byBkaXNjYXJkIGl0LgorICogVGhlIGFsbG9jYXRlZCBwcml2YXRlIGRhdGEgcmVnaW9uIG1heSBiZSBhY2Nlc3NlZCB2aWEKKyAqIHNwbWlfY29udHJvbGxlcl9nZXRfZHJ2ZGF0YSgpCisgKi8KK3N0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKnNwbWlfY29udHJvbGxlcl9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCQkJCSAgICAgIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmw7CisJaW50IGlkOworCisJaWYgKFdBUk5fT04oIXBhcmVudCkpCisJCXJldHVybiBOVUxMOworCisJY3RybCA9IGt6YWxsb2Moc2l6ZW9mKCpjdHJsKSArIHNpemUsIEdGUF9LRVJORUwpOworCWlmICghY3RybCkKKwkJcmV0dXJuIE5VTEw7CisKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmY3RybC0+ZGV2KTsKKwljdHJsLT5kZXYudHlwZSA9ICZzcG1pX2N0cmxfdHlwZTsKKwljdHJsLT5kZXYuYnVzID0gJnNwbWlfYnVzX3R5cGU7CisJY3RybC0+ZGV2LnBhcmVudCA9IHBhcmVudDsKKwljdHJsLT5kZXYub2Zfbm9kZSA9IHBhcmVudC0+b2Zfbm9kZTsKKwlzcG1pX2NvbnRyb2xsZXJfc2V0X2RydmRhdGEoY3RybCwgJmN0cmxbMV0pOworCisJaWQgPSBpZGFfc2ltcGxlX2dldCgmY3RybF9pZGEsIDAsIDAsIEdGUF9LRVJORUwpOworCWlmIChpZCA8IDApIHsKKwkJZGV2X2VycihwYXJlbnQsCisJCQkidW5hYmxlIHRvIGFsbG9jYXRlIFNQTUkgY29udHJvbGxlciBpZGVudGlmaWVyLlxuIik7CisJCXNwbWlfY29udHJvbGxlcl9wdXQoY3RybCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWN0cmwtPm5yID0gaWQ7CisJZGV2X3NldF9uYW1lKCZjdHJsLT5kZXYsICJzcG1pLSVkIiwgaWQpOworCisJZGV2X2RiZygmY3RybC0+ZGV2LCAiYWxsb2NhdGVkIGNvbnRyb2xsZXIgMHglcCBpZCAlZFxuIiwgY3RybCwgaWQpOworCXJldHVybiBjdHJsOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BtaV9jb250cm9sbGVyX2FsbG9jKTsKKworc3RhdGljIHZvaWQgb2Zfc3BtaV9yZWdpc3Rlcl9kZXZpY2VzKHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlOworCWludCBlcnI7CisKKwlpZiAoIWN0cmwtPmRldi5vZl9ub2RlKQorCQlyZXR1cm47CisKKwlmb3JfZWFjaF9hdmFpbGFibGVfY2hpbGRfb2Zfbm9kZShjdHJsLT5kZXYub2Zfbm9kZSwgbm9kZSkgeworCQlzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXY7CisJCXUzMiByZWdbMl07CisKKwkJZGV2X2RiZygmY3RybC0+ZGV2LCAiYWRkaW5nIGNoaWxkICVzXG4iLCBub2RlLT5mdWxsX25hbWUpOworCisJCWVyciA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KG5vZGUsICJyZWciLCByZWcsIDIpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKCZjdHJsLT5kZXYsCisJCQkJIm5vZGUgJXMgZXJyICglZCkgZG9lcyBub3QgaGF2ZSAncmVnJyBwcm9wZXJ0eVxuIiwKKwkJCQlub2RlLT5mdWxsX25hbWUsIGVycik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChyZWdbMV0gIT0gU1BNSV9VU0lEKSB7CisJCQlkZXZfZXJyKCZjdHJsLT5kZXYsCisJCQkJIm5vZGUgJXMgY29udGFpbnMgdW5zdXBwb3J0ZWQgJ3JlZycgZW50cnlcbiIsCisJCQkJbm9kZS0+ZnVsbF9uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJlZ1swXSA+PSBTUE1JX01BWF9TTEFWRV9JRCkgeworCQkJZGV2X2VycigmY3RybC0+ZGV2LAorCQkJCSJpbnZhbGlkIHVzaWQgb24gbm9kZSAlc1xuIiwKKwkJCQlub2RlLT5mdWxsX25hbWUpOworCQkJY29udGludWU7CisJCX0KKworCQlkZXZfZGJnKCZjdHJsLT5kZXYsICJyZWFkIHVzaWQgJTAyeFxuIiwgcmVnWzBdKTsKKworCQlzZGV2ID0gc3BtaV9kZXZpY2VfYWxsb2MoY3RybCk7CisJCWlmICghc2RldikKKwkJCWNvbnRpbnVlOworCisJCXNkZXYtPmRldi5vZl9ub2RlID0gbm9kZTsKKwkJc2Rldi0+dXNpZCA9ICh1OCkgcmVnWzBdOworCisJCWVyciA9IHNwbWlfZGV2aWNlX2FkZChzZGV2KTsKKwkJaWYgKGVycikgeworCQkJZGV2X2Vycigmc2Rldi0+ZGV2LAorCQkJCSJmYWlsdXJlIGFkZGluZyBkZXZpY2UuIHN0YXR1cyAlZFxuIiwgZXJyKTsKKwkJCXNwbWlfZGV2aWNlX3B1dChzZGV2KTsKKwkJfQorCX0KK30KKworLyoqCisgKiBzcG1pX2NvbnRyb2xsZXJfYWRkKCkgLSBBZGQgYW4gU1BNSSBjb250cm9sbGVyCisgKiBAY3RybDoJY29udHJvbGxlciB0byBiZSByZWdpc3RlcmVkLgorICoKKyAqIFJlZ2lzdGVyIGEgY29udHJvbGxlciBwcmV2aW91c2x5IGFsbG9jYXRlZCB2aWEgc3BtaV9jb250cm9sbGVyX2FsbG9jKCkgd2l0aAorICogdGhlIFNQTUkgY29yZS4KKyAqLworaW50IHNwbWlfY29udHJvbGxlcl9hZGQoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCkKK3sKKwlpbnQgcmV0OworCisJLyogQ2FuJ3QgcmVnaXN0ZXIgdW50aWwgYWZ0ZXIgZHJpdmVyIG1vZGVsIGluaXQgKi8KKwlpZiAoV0FSTl9PTighc3BtaV9idXNfdHlwZS5wKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlyZXQgPSBkZXZpY2VfYWRkKCZjdHJsLT5kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfT0YpKQorCQlvZl9zcG1pX3JlZ2lzdGVyX2RldmljZXMoY3RybCk7CisKKwlkZXZfZGJnKCZjdHJsLT5kZXYsICJzcG1pLSVkIHJlZ2lzdGVyZWQ6IGRldjolcFxuIiwKKwkJY3RybC0+bnIsICZjdHJsLT5kZXYpOworCisJcmV0dXJuIDA7Cit9OworRVhQT1JUX1NZTUJPTF9HUEwoc3BtaV9jb250cm9sbGVyX2FkZCk7CisKKy8qIFJlbW92ZSBhIGRldmljZSBhc3NvY2lhdGVkIHdpdGggYSBjb250cm9sbGVyICovCitzdGF0aWMgaW50IHNwbWlfY3RybF9yZW1vdmVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNwbWlkZXYgPSB0b19zcG1pX2RldmljZShkZXYpOworCWlmIChkZXYtPnR5cGUgPT0gJnNwbWlfZGV2X3R5cGUpCisJCXNwbWlfZGV2aWNlX3JlbW92ZShzcG1pZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzcG1pX2NvbnRyb2xsZXJfcmVtb3ZlKCk6IHJlbW92ZSBhbiBTUE1JIGNvbnRyb2xsZXIKKyAqIEBjdHJsOgljb250cm9sbGVyIHRvIHJlbW92ZQorICoKKyAqIFJlbW92ZSBhIFNQTUkgY29udHJvbGxlci4gIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZworICogc3BtaV9jb250cm9sbGVyX3B1dCgpIHRvIGRpc2NhcmQgdGhlIGFsbG9jYXRlZCBjb250cm9sbGVyLgorICovCit2b2lkIHNwbWlfY29udHJvbGxlcl9yZW1vdmUoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCkKK3sKKwlpbnQgZHVtbXk7CisKKwlpZiAoIWN0cmwpCisJCXJldHVybjsKKworCWR1bW15ID0gZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZjdHJsLT5kZXYsIE5VTEwsCisJCQkJICAgICAgc3BtaV9jdHJsX3JlbW92ZV9kZXZpY2UpOworCWRldmljZV9kZWwoJmN0cmwtPmRldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX2NvbnRyb2xsZXJfcmVtb3ZlKTsKKworLyoqCisgKiBzcG1pX2RyaXZlcl9yZWdpc3RlcigpIC0gUmVnaXN0ZXIgY2xpZW50IGRyaXZlciB3aXRoIFNQTUkgY29yZQorICogQHNkcnY6CWNsaWVudCBkcml2ZXIgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGNsaWVudC1kZXZpY2UuCisgKgorICogVGhpcyBBUEkgd2lsbCByZWdpc3RlciB0aGUgY2xpZW50IGRyaXZlciB3aXRoIHRoZSBTUE1JIGZyYW1ld29yay4KKyAqIEl0IGlzIHR5cGljYWxseSBjYWxsZWQgZnJvbSB0aGUgZHJpdmVyJ3MgbW9kdWxlLWluaXQgZnVuY3Rpb24uCisgKi8KK2ludCBzcG1pX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3Qgc3BtaV9kcml2ZXIgKnNkcnYpCit7CisJc2Rydi0+ZHJpdmVyLmJ1cyA9ICZzcG1pX2J1c190eXBlOworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJnNkcnYtPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX2RyaXZlcl9yZWdpc3Rlcik7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzcG1pX2V4aXQodm9pZCkKK3sKKwlidXNfdW5yZWdpc3Rlcigmc3BtaV9idXNfdHlwZSk7Cit9Cittb2R1bGVfZXhpdChzcG1pX2V4aXQpOworCitzdGF0aWMgaW50IF9faW5pdCBzcG1pX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gYnVzX3JlZ2lzdGVyKCZzcG1pX2J1c190eXBlKTsKK30KK3Bvc3Rjb3JlX2luaXRjYWxsKHNwbWlfaW5pdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU1BNSSBtb2R1bGUiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06c3BtaSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwppbmRleCA5OTM3NWYwLi40N2NmMTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwpAQCAtMzQsOCArMzQsNiBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy93bGFuLW5nL0tjb25maWciCiAKLXNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2VjaG8vS2NvbmZpZyIKLQogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9LY29uZmlnIgpAQCAtODIsOCArODAsNiBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL0tjb25maWciCi0KIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9jeHQxZTEvS2NvbmZpZyIKQEAgLTEyOCw4ICsxMjQsNiBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9kZ3JwL0tjb25maWciCiAKLXNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9md3NlcmlhbC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9nb2xkZmlzaC9LY29uZmlnIgpAQCAtMTQ2LDQgKzE0MCwxMCBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9kZ2FwL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy91bmlzeXMvS2NvbmZpZyIKKwogZW5kaWYgIyBTVEFHSU5HCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKaW5kZXggZGRjM2M0YS4uZDEyZjYxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQpAQCAtOSw3ICs5LDYgQEAKIG9iai0kKENPTkZJR19VU0JJUF9DT1JFKQkrPSB1c2JpcC8KIG9iai0kKENPTkZJR19XMzVVTkQpCQkrPSB3aW5ib25kLwogb2JqLSQoQ09ORklHX1BSSVNNMl9VU0IpCSs9IHdsYW4tbmcvCi1vYmotJChDT05GSUdfRUNITykJCSs9IGVjaG8vCiBvYmotJChDT05GSUdfQ09NRURJKQkJKz0gY29tZWRpLwogb2JqLSQoQ09ORklHX0ZCX09MUENfRENPTikJKz0gb2xwY19kY29uLwogb2JqLSQoQ09ORklHX1BBTkVMKQkJKz0gcGFuZWwvCkBAIC0zNSw3ICszNCw2IEBACiBvYmotJChDT05GSUdfSUlPKQkJKz0gaWlvLwogb2JqLSQoQ09ORklHX1dMQUdTNDlfSDIpCSs9IHdsYWdzNDlfaDIvCiBvYmotJChDT05GSUdfV0xBR1M0OV9IMjUpCSs9IHdsYWdzNDlfaDI1Lwotb2JqLSQoQ09ORklHX0ZCX1NNN1hYKQkJKz0gc203eHhmYi8KIG9iai0kKENPTkZJR19DUllTVEFMSEQpCQkrPSBjcnlzdGFsaGQvCiBvYmotJChDT05GSUdfQ1hUMUUxKQkJKz0gY3h0MWUxLwogb2JqLSQoQ09ORklHX0ZCX1hHSSkJCSs9IHhnaWZiLwpAQCAtNTcsNyArNTUsNiBAQAogb2JqLSQoQ09ORklHX0NFRDE0MDEpCQkrPSBjZWQxNDAxLwogb2JqLSQoQ09ORklHX0RSTV9JTVgpCQkrPSBpbXgtZHJtLwogb2JqLSQoQ09ORklHX0RHUlApCQkrPSBkZ3JwLwotb2JqLSQoQ09ORklHX1NCMTA1WCkJCSs9IHNiMTA1eC8KIG9iai0kKENPTkZJR19GSVJFV0lSRV9TRVJJQUwpCSs9IGZ3c2VyaWFsLwogb2JqLSQoQ09ORklHX0dPTERGSVNIKQkJKz0gZ29sZGZpc2gvCiBvYmotJChDT05GSUdfTFVTVFJFX0ZTKQkJKz0gbHVzdHJlLwpAQCAtNjUsMyArNjIsNiBAQAogb2JqLSQoQ09ORklHX0RHTkMpCQkJKz0gZGduYy8KIG9iai0kKENPTkZJR19ER0FQKQkJCSs9IGRnYXAvCiBvYmotJChDT05GSUdfTVREX1NQSU5BTkRfTVQyOUYpCSs9IG10MjlmX3NwaW5hbmQvCitvYmotJChDT05GSUdfR1NfRlBHQUJPT1QpCSs9IGdzX2ZwZ2Fib290Lworb2JqLSQoQ09ORklHX0JUX05PS0lBX0g0UCkJKz0gbm9raWFfaDRwLworb2JqLSQoQ09ORklHX1VOSVNZU1NQQVIpCSs9IHVuaXN5cy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9LY29uZmlnCmluZGV4IGI5MWM3NTguLmFiMjhkMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvS2NvbmZpZwpAQCAtMjAsNiArMjAsMTkgQEAKIAkgIEFuZHJvaWQgcHJvY2VzcywgdXNpbmcgQmluZGVyIHRvIGlkZW50aWZ5LCBpbnZva2UgYW5kIHBhc3MgYXJndW1lbnRzCiAJICBiZXR3ZWVuIHNhaWQgcHJvY2Vzc2VzLgogCitjb25maWcgQU5EUk9JRF9CSU5ERVJfSVBDXzMyQklUCisJYm9vbAorCWRlcGVuZHMgb24gITY0QklUICYmIEFORFJPSURfQklOREVSX0lQQworCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIFRoZSBCaW5kZXIgQVBJIGhhcyBiZWVuIGNoYW5nZWQgdG8gc3VwcG9ydCBib3RoIDMyIGFuZCA2NGJpdAorCSAgYXBwbGljYXRpb25zIGluIGEgbWl4ZWQgZW52aXJvbm1lbnQuCisKKwkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgYW4gb2xkIDMyLWJpdCBBbmRyb2lkIHVzZXItc3BhY2UgKHY0LjQgYW5kCisJICBlYXJsaWVyKS4KKworCSAgTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgd2lsbCBicmVhayBuZXdlciBBbmRyb2lkIHVzZXItc3BhY2UuCisKIGNvbmZpZyBBU0hNRU0KIAlib29sICJFbmFibGUgdGhlIEFub255bW91cyBTaGFyZWQgTWVtb3J5IFN1YnN5c3RlbSIKIAlkZWZhdWx0IG4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2FuZHJvaWRfYWxhcm0uaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2FuZHJvaWRfYWxhcm0uaAppbmRleCA0ZmQzMmYzLi40OTViMjBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9hbmRyb2lkX2FsYXJtLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYW5kcm9pZF9hbGFybS5oCkBAIC0xNiw1MCArMTYsMTAgQEAKICNpZm5kZWYgX0xJTlVYX0FORFJPSURfQUxBUk1fSAogI2RlZmluZSBfTElOVVhfQU5EUk9JRF9BTEFSTV9ICiAKLSNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogCi1lbnVtIGFuZHJvaWRfYWxhcm1fdHlwZSB7Ci0JLyogcmV0dXJuIGNvZGUgYml0IG51bWJlcnMgb3Igc2V0IGFsYXJtIGFyZyAqLwotCUFORFJPSURfQUxBUk1fUlRDX1dBS0VVUCwKLQlBTkRST0lEX0FMQVJNX1JUQywKLQlBTkRST0lEX0FMQVJNX0VMQVBTRURfUkVBTFRJTUVfV0FLRVVQLAotCUFORFJPSURfQUxBUk1fRUxBUFNFRF9SRUFMVElNRSwKLQlBTkRST0lEX0FMQVJNX1NZU1RFTVRJTUUsCi0KLQlBTkRST0lEX0FMQVJNX1RZUEVfQ09VTlQsCi0KLQkvKiByZXR1cm4gY29kZSBiaXQgbnVtYmVycyAqLwotCS8qIEFORFJPSURfQUxBUk1fVElNRV9DSEFOR0UgPSAxNiAqLwotfTsKLQotZW51bSBhbmRyb2lkX2FsYXJtX3JldHVybl9mbGFncyB7Ci0JQU5EUk9JRF9BTEFSTV9SVENfV0FLRVVQX01BU0sgPSAxVSA8PCBBTkRST0lEX0FMQVJNX1JUQ19XQUtFVVAsCi0JQU5EUk9JRF9BTEFSTV9SVENfTUFTSyA9IDFVIDw8IEFORFJPSURfQUxBUk1fUlRDLAotCUFORFJPSURfQUxBUk1fRUxBUFNFRF9SRUFMVElNRV9XQUtFVVBfTUFTSyA9Ci0JCQkJMVUgPDwgQU5EUk9JRF9BTEFSTV9FTEFQU0VEX1JFQUxUSU1FX1dBS0VVUCwKLQlBTkRST0lEX0FMQVJNX0VMQVBTRURfUkVBTFRJTUVfTUFTSyA9Ci0JCQkJMVUgPDwgQU5EUk9JRF9BTEFSTV9FTEFQU0VEX1JFQUxUSU1FLAotCUFORFJPSURfQUxBUk1fU1lTVEVNVElNRV9NQVNLID0gMVUgPDwgQU5EUk9JRF9BTEFSTV9TWVNURU1USU1FLAotCUFORFJPSURfQUxBUk1fVElNRV9DSEFOR0VfTUFTSyA9IDFVIDw8IDE2Ci19OwotCi0vKiBEaXNhYmxlIGFsYXJtICovCi0jZGVmaW5lIEFORFJPSURfQUxBUk1fQ0xFQVIodHlwZSkgICAgICAgICAgIF9JTygnYScsIDAgfCAoKHR5cGUpIDw8IDQpKQotCi0vKiBBY2sgbGFzdCBhbGFybSBhbmQgd2FpdCBmb3IgbmV4dCAqLwotI2RlZmluZSBBTkRST0lEX0FMQVJNX1dBSVQgICAgICAgICAgICAgICAgICBfSU8oJ2EnLCAxKQotCi0jZGVmaW5lIEFMQVJNX0lPVyhjLCB0eXBlLCBzaXplKSAgICAgICAgICAgIF9JT1coJ2EnLCAoYykgfCAoKHR5cGUpIDw8IDQpLCBzaXplKQotLyogU2V0IGFsYXJtICovCi0jZGVmaW5lIEFORFJPSURfQUxBUk1fU0VUKHR5cGUpICAgICAgICAgICAgIEFMQVJNX0lPVygyLCB0eXBlLCBzdHJ1Y3QgdGltZXNwZWMpCi0jZGVmaW5lIEFORFJPSURfQUxBUk1fU0VUX0FORF9XQUlUKHR5cGUpICAgIEFMQVJNX0lPVygzLCB0eXBlLCBzdHJ1Y3QgdGltZXNwZWMpCi0jZGVmaW5lIEFORFJPSURfQUxBUk1fR0VUX1RJTUUodHlwZSkgICAgICAgIEFMQVJNX0lPVyg0LCB0eXBlLCBzdHJ1Y3QgdGltZXNwZWMpCi0jZGVmaW5lIEFORFJPSURfQUxBUk1fU0VUX1JUQyAgICAgICAgICAgICAgIF9JT1coJ2EnLCA1LCBzdHJ1Y3QgdGltZXNwZWMpCi0jZGVmaW5lIEFORFJPSURfQUxBUk1fQkFTRV9DTUQoY21kKSAgICAgICAgIChjbWQgJiB+KF9JT0MoMCwgMCwgMHhmMCwgMCkpKQotI2RlZmluZSBBTkRST0lEX0FMQVJNX0lPQ1RMX1RPX1RZUEUoY21kKSAgICAoX0lPQ19OUihjbWQpID4+IDQpCi0KKyNpbmNsdWRlICJ1YXBpL2FuZHJvaWRfYWxhcm0uaCIKIAogI2lmZGVmIENPTkZJR19DT01QQVQKICNkZWZpbmUgQU5EUk9JRF9BTEFSTV9TRVRfQ09NUEFUKHR5cGUpCQlBTEFSTV9JT1coMiwgdHlwZSwgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYXNobWVtLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9hc2htZW0uaAppbmRleCA4ZGMwZjBkLi41YWJjZmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9hc2htZW0uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9hc2htZW0uaApAQCAtMTYsMzUgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogCi0jZGVmaW5lIEFTSE1FTV9OQU1FX0xFTgkJMjU2Ci0KLSNkZWZpbmUgQVNITUVNX05BTUVfREVGCQkiZGV2L2FzaG1lbSIKLQotLyogUmV0dXJuIHZhbHVlcyBmcm9tIEFTSE1FTV9QSU46IFdhcyB0aGUgbWFwcGluZyBwdXJnZWQgd2hpbGUgdW5waW5uZWQ/ICovCi0jZGVmaW5lIEFTSE1FTV9OT1RfUFVSR0VECTAKLSNkZWZpbmUgQVNITUVNX1dBU19QVVJHRUQJMQotCi0vKiBSZXR1cm4gdmFsdWVzIGZyb20gQVNITUVNX0dFVF9QSU5fU1RBVFVTOiBJcyB0aGUgbWFwcGluZyBwaW5uZWQ/ICovCi0jZGVmaW5lIEFTSE1FTV9JU19VTlBJTk5FRAkwCi0jZGVmaW5lIEFTSE1FTV9JU19QSU5ORUQJMQotCi1zdHJ1Y3QgYXNobWVtX3BpbiB7Ci0JX191MzIgb2Zmc2V0OwkvKiBvZmZzZXQgaW50byByZWdpb24sIGluIGJ5dGVzLCBwYWdlLWFsaWduZWQgKi8KLQlfX3UzMiBsZW47CS8qIGxlbmd0aCBmb3J3YXJkIGZyb20gb2Zmc2V0LCBpbiBieXRlcywgcGFnZS1hbGlnbmVkICovCi19OwotCi0jZGVmaW5lIF9fQVNITUVNSU9DCQkweDc3Ci0KLSNkZWZpbmUgQVNITUVNX1NFVF9OQU1FCQlfSU9XKF9fQVNITUVNSU9DLCAxLCBjaGFyW0FTSE1FTV9OQU1FX0xFTl0pCi0jZGVmaW5lIEFTSE1FTV9HRVRfTkFNRQkJX0lPUihfX0FTSE1FTUlPQywgMiwgY2hhcltBU0hNRU1fTkFNRV9MRU5dKQotI2RlZmluZSBBU0hNRU1fU0VUX1NJWkUJCV9JT1coX19BU0hNRU1JT0MsIDMsIHNpemVfdCkKLSNkZWZpbmUgQVNITUVNX0dFVF9TSVpFCQlfSU8oX19BU0hNRU1JT0MsIDQpCi0jZGVmaW5lIEFTSE1FTV9TRVRfUFJPVF9NQVNLCV9JT1coX19BU0hNRU1JT0MsIDUsIHVuc2lnbmVkIGxvbmcpCi0jZGVmaW5lIEFTSE1FTV9HRVRfUFJPVF9NQVNLCV9JTyhfX0FTSE1FTUlPQywgNikKLSNkZWZpbmUgQVNITUVNX1BJTgkJX0lPVyhfX0FTSE1FTUlPQywgNywgc3RydWN0IGFzaG1lbV9waW4pCi0jZGVmaW5lIEFTSE1FTV9VTlBJTgkJX0lPVyhfX0FTSE1FTUlPQywgOCwgc3RydWN0IGFzaG1lbV9waW4pCi0jZGVmaW5lIEFTSE1FTV9HRVRfUElOX1NUQVRVUwlfSU8oX19BU0hNRU1JT0MsIDkpCi0jZGVmaW5lIEFTSE1FTV9QVVJHRV9BTExfQ0FDSEVTCV9JTyhfX0FTSE1FTUlPQywgMTApCisjaW5jbHVkZSAidWFwaS9hc2htZW0uaCIKIAogLyogc3VwcG9ydCBvZiAzMmJpdCB1c2Vyc3BhY2Ugb24gNjRiaXQgcGxhdGZvcm1zICovCiAjaWZkZWYgQ09ORklHX0NPTVBBVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYmluZGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuYwppbmRleCAxNDMyZDk1Li5jZmU0YmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuYwpAQCAtMjI4LDggKzIyOCw4IEBACiAJaW50IGludGVybmFsX3N0cm9uZ19yZWZzOwogCWludCBsb2NhbF93ZWFrX3JlZnM7CiAJaW50IGxvY2FsX3N0cm9uZ19yZWZzOwotCXZvaWQgX191c2VyICpwdHI7Ci0Jdm9pZCBfX3VzZXIgKmNvb2tpZTsKKwliaW5kZXJfdWludHB0cl90IHB0cjsKKwliaW5kZXJfdWludHB0cl90IGNvb2tpZTsKIAl1bnNpZ25lZCBoYXNfc3Ryb25nX3JlZjoxOwogCXVuc2lnbmVkIHBlbmRpbmdfc3Ryb25nX3JlZjoxOwogCXVuc2lnbmVkIGhhc193ZWFrX3JlZjoxOwpAQCAtMjQyLDcgKzI0Miw3IEBACiAKIHN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoIHsKIAlzdHJ1Y3QgYmluZGVyX3dvcmsgd29yazsKLQl2b2lkIF9fdXNlciAqY29va2llOworCWJpbmRlcl91aW50cHRyX3QgY29va2llOwogfTsKIAogc3RydWN0IGJpbmRlcl9yZWYgewpAQCAtNTE1LDE0ICs1MTUsMTQgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpiaW5kZXJfYnVmZmVyX2xvb2t1cChzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJCQkgIHZvaWQgX191c2VyICp1c2VyX3B0cikKKwkJCQkJCSAgdWludHB0cl90IHVzZXJfcHRyKQogewogCXN0cnVjdCByYl9ub2RlICpuID0gcHJvYy0+YWxsb2NhdGVkX2J1ZmZlcnMucmJfbm9kZTsKIAlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOwogCXN0cnVjdCBiaW5kZXJfYnVmZmVyICprZXJuX3B0cjsKIAotCWtlcm5fcHRyID0gdXNlcl9wdHIgLSBwcm9jLT51c2VyX2J1ZmZlcl9vZmZzZXQKLQkJLSBvZmZzZXRvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZGF0YSk7CisJa2Vybl9wdHIgPSAoc3RydWN0IGJpbmRlcl9idWZmZXIgKikodXNlcl9wdHIgLSBwcm9jLT51c2VyX2J1ZmZlcl9vZmZzZXQKKwkJLSBvZmZzZXRvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZGF0YSkpOwogCiAJd2hpbGUgKG4pIHsKIAkJYnVmZmVyID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpOwpAQCAtODU2LDcgKzg1Niw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmluZGVyX25vZGUgKmJpbmRlcl9nZXRfbm9kZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJCSAgIHZvaWQgX191c2VyICpwdHIpCisJCQkJCSAgIGJpbmRlcl91aW50cHRyX3QgcHRyKQogewogCXN0cnVjdCByYl9ub2RlICpuID0gcHJvYy0+bm9kZXMucmJfbm9kZTsKIAlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGU7CkBAIC04NzUsOCArODc1LDggQEAKIH0KIAogc3RhdGljIHN0cnVjdCBiaW5kZXJfbm9kZSAqYmluZGVyX25ld19ub2RlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQkJICAgdm9pZCBfX3VzZXIgKnB0ciwKLQkJCQkJICAgdm9pZCBfX3VzZXIgKmNvb2tpZSkKKwkJCQkJICAgYmluZGVyX3VpbnRwdHJfdCBwdHIsCisJCQkJCSAgIGJpbmRlcl91aW50cHRyX3QgY29va2llKQogewogCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwcm9jLT5ub2Rlcy5yYl9ub2RlOwogCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOwpAQCAtOTA4LDkgKzkwOCw5IEBACiAJSU5JVF9MSVNUX0hFQUQoJm5vZGUtPndvcmsuZW50cnkpOwogCUlOSVRfTElTVF9IRUFEKCZub2RlLT5hc3luY190b2RvKTsKIAliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMsCi0JCSAgICAgIiVkOiVkIG5vZGUgJWQgdSVwIGMlcCBjcmVhdGVkXG4iLAorCQkgICAgICIlZDolZCBub2RlICVkIHUlMDE2bGx4IGMlMDE2bGx4IGNyZWF0ZWRcbiIsCiAJCSAgICAgcHJvYy0+cGlkLCBjdXJyZW50LT5waWQsIG5vZGUtPmRlYnVnX2lkLAotCQkgICAgIG5vZGUtPnB0ciwgbm9kZS0+Y29va2llKTsKKwkJICAgICAodTY0KW5vZGUtPnB0ciwgKHU2NClub2RlLT5jb29raWUpOwogCXJldHVybiBub2RlOwogfQogCkBAIC0xMjI2LDkgKzEyMjYsOSBAQAogCiBzdGF0aWMgdm9pZCBiaW5kZXJfdHJhbnNhY3Rpb25fYnVmZmVyX3JlbGVhc2Uoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLAogCQkJCQkgICAgICBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyLAotCQkJCQkgICAgICBzaXplX3QgKmZhaWxlZF9hdCkKKwkJCQkJICAgICAgYmluZGVyX3NpemVfdCAqZmFpbGVkX2F0KQogewotCXNpemVfdCAqb2ZmcCwgKm9mZl9lbmQ7CisJYmluZGVyX3NpemVfdCAqb2ZmcCwgKm9mZl9lbmQ7CiAJaW50IGRlYnVnX2lkID0gYnVmZmVyLT5kZWJ1Z19pZDsKIAogCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04sCkBAIC0xMjM5LDcgKzEyMzksOCBAQAogCWlmIChidWZmZXItPnRhcmdldF9ub2RlKQogCQliaW5kZXJfZGVjX25vZGUoYnVmZmVyLT50YXJnZXRfbm9kZSwgMSwgMCk7CiAKLQlvZmZwID0gKHNpemVfdCAqKShidWZmZXItPmRhdGEgKyBBTElHTihidWZmZXItPmRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpKTsKKwlvZmZwID0gKGJpbmRlcl9zaXplX3QgKikoYnVmZmVyLT5kYXRhICsKKwkJCQkgQUxJR04oYnVmZmVyLT5kYXRhX3NpemUsIHNpemVvZih2b2lkICopKSk7CiAJaWYgKGZhaWxlZF9hdCkKIAkJb2ZmX2VuZCA9IGZhaWxlZF9hdDsKIAllbHNlCkBAIC0xMjQ5LDggKzEyNTAsOCBAQAogCQlpZiAoKm9mZnAgPiBidWZmZXItPmRhdGFfc2l6ZSAtIHNpemVvZigqZnApIHx8CiAJCSAgICBidWZmZXItPmRhdGFfc2l6ZSA8IHNpemVvZigqZnApIHx8CiAJCSAgICAhSVNfQUxJR05FRCgqb2ZmcCwgc2l6ZW9mKHUzMikpKSB7Ci0JCQlwcl9lcnIoInRyYW5zYWN0aW9uIHJlbGVhc2UgJWQgYmFkIG9mZnNldCAlemQsIHNpemUgJXpkXG4iLAotCQkJIGRlYnVnX2lkLCAqb2ZmcCwgYnVmZmVyLT5kYXRhX3NpemUpOworCQkJcHJfZXJyKCJ0cmFuc2FjdGlvbiByZWxlYXNlICVkIGJhZCBvZmZzZXQgJWxsZCwgc2l6ZSAlemRcbiIsCisJCQkgICAgICAgZGVidWdfaWQsICh1NjQpKm9mZnAsIGJ1ZmZlci0+ZGF0YV9zaXplKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWZwID0gKHN0cnVjdCBmbGF0X2JpbmRlcl9vYmplY3QgKikoYnVmZmVyLT5kYXRhICsgKm9mZnApOwpAQCAtMTI1OSwxMyArMTI2MCwxMyBAQAogCQljYXNlIEJJTkRFUl9UWVBFX1dFQUtfQklOREVSOiB7CiAJCQlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUgPSBiaW5kZXJfZ2V0X25vZGUocHJvYywgZnAtPmJpbmRlcik7CiAJCQlpZiAobm9kZSA9PSBOVUxMKSB7Ci0JCQkJcHJfZXJyKCJ0cmFuc2FjdGlvbiByZWxlYXNlICVkIGJhZCBub2RlICVwXG4iLAotCQkJCQlkZWJ1Z19pZCwgZnAtPmJpbmRlcik7CisJCQkJcHJfZXJyKCJ0cmFuc2FjdGlvbiByZWxlYXNlICVkIGJhZCBub2RlICUwMTZsbHhcbiIsCisJCQkJICAgICAgIGRlYnVnX2lkLCAodTY0KWZwLT5iaW5kZXIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiwKLQkJCQkgICAgICIgICAgICAgIG5vZGUgJWQgdSVwXG4iLAotCQkJCSAgICAgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0cik7CisJCQkJICAgICAiICAgICAgICBub2RlICVkIHUlMDE2bGx4XG4iLAorCQkJCSAgICAgbm9kZS0+ZGVidWdfaWQsICh1NjQpbm9kZS0+cHRyKTsKIAkJCWJpbmRlcl9kZWNfbm9kZShub2RlLCBmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9CSU5ERVIsIDApOwogCQl9IGJyZWFrOwogCQljYXNlIEJJTkRFUl9UWVBFX0hBTkRMRToKQEAgLTEzMDMsNyArMTMwNCw3IEBACiB7CiAJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdDsKIAlzdHJ1Y3QgYmluZGVyX3dvcmsgKnRjb21wbGV0ZTsKLQlzaXplX3QgKm9mZnAsICpvZmZfZW5kOworCWJpbmRlcl9zaXplX3QgKm9mZnAsICpvZmZfZW5kOwogCXN0cnVjdCBiaW5kZXJfcHJvYyAqdGFyZ2V0X3Byb2M7CiAJc3RydWN0IGJpbmRlcl90aHJlYWQgKnRhcmdldF90aHJlYWQgPSBOVUxMOwogCXN0cnVjdCBiaW5kZXJfbm9kZSAqdGFyZ2V0X25vZGUgPSBOVUxMOwpAQCAtMTQzMiwxOCArMTQzMywyMCBAQAogCiAJaWYgKHJlcGx5KQogCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJICAgICAiJWQ6JWQgQkNfUkVQTFkgJWQgLT4gJWQ6JWQsIGRhdGEgJXAtJXAgc2l6ZSAlemQtJXpkXG4iLAorCQkJICAgICAiJWQ6JWQgQkNfUkVQTFkgJWQgLT4gJWQ6JWQsIGRhdGEgJTAxNmxseC0lMDE2bGx4IHNpemUgJWxsZC0lbGxkXG4iLAogCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCB0LT5kZWJ1Z19pZCwKIAkJCSAgICAgdGFyZ2V0X3Byb2MtPnBpZCwgdGFyZ2V0X3RocmVhZC0+cGlkLAotCQkJICAgICB0ci0+ZGF0YS5wdHIuYnVmZmVyLCB0ci0+ZGF0YS5wdHIub2Zmc2V0cywKLQkJCSAgICAgdHItPmRhdGFfc2l6ZSwgdHItPm9mZnNldHNfc2l6ZSk7CisJCQkgICAgICh1NjQpdHItPmRhdGEucHRyLmJ1ZmZlciwKKwkJCSAgICAgKHU2NCl0ci0+ZGF0YS5wdHIub2Zmc2V0cywKKwkJCSAgICAgKHU2NCl0ci0+ZGF0YV9zaXplLCAodTY0KXRyLT5vZmZzZXRzX3NpemUpOwogCWVsc2UKIAkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiwKLQkJCSAgICAgIiVkOiVkIEJDX1RSQU5TQUNUSU9OICVkIC0+ICVkIC0gbm9kZSAlZCwgZGF0YSAlcC0lcCBzaXplICV6ZC0lemRcbiIsCisJCQkgICAgICIlZDolZCBCQ19UUkFOU0FDVElPTiAlZCAtPiAlZCAtIG5vZGUgJWQsIGRhdGEgJTAxNmxseC0lMDE2bGx4IHNpemUgJWxsZC0lbGxkXG4iLAogCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCB0LT5kZWJ1Z19pZCwKIAkJCSAgICAgdGFyZ2V0X3Byb2MtPnBpZCwgdGFyZ2V0X25vZGUtPmRlYnVnX2lkLAotCQkJICAgICB0ci0+ZGF0YS5wdHIuYnVmZmVyLCB0ci0+ZGF0YS5wdHIub2Zmc2V0cywKLQkJCSAgICAgdHItPmRhdGFfc2l6ZSwgdHItPm9mZnNldHNfc2l6ZSk7CisJCQkgICAgICh1NjQpdHItPmRhdGEucHRyLmJ1ZmZlciwKKwkJCSAgICAgKHU2NCl0ci0+ZGF0YS5wdHIub2Zmc2V0cywKKwkJCSAgICAgKHU2NCl0ci0+ZGF0YV9zaXplLCAodTY0KXRyLT5vZmZzZXRzX3NpemUpOwogCiAJaWYgKCFyZXBseSAmJiAhKHRyLT5mbGFncyAmIFRGX09ORV9XQVkpKQogCQl0LT5mcm9tID0gdGhyZWFkOwpAQCAtMTQ3MiwyMyArMTQ3NSwyNiBAQAogCWlmICh0YXJnZXRfbm9kZSkKIAkJYmluZGVyX2luY19ub2RlKHRhcmdldF9ub2RlLCAxLCAwLCBOVUxMKTsKIAotCW9mZnAgPSAoc2l6ZV90ICopKHQtPmJ1ZmZlci0+ZGF0YSArIEFMSUdOKHRyLT5kYXRhX3NpemUsIHNpemVvZih2b2lkICopKSk7CisJb2ZmcCA9IChiaW5kZXJfc2l6ZV90ICopKHQtPmJ1ZmZlci0+ZGF0YSArCisJCQkJIEFMSUdOKHRyLT5kYXRhX3NpemUsIHNpemVvZih2b2lkICopKSk7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIodC0+YnVmZmVyLT5kYXRhLCB0ci0+ZGF0YS5wdHIuYnVmZmVyLCB0ci0+ZGF0YV9zaXplKSkgeworCWlmIChjb3B5X2Zyb21fdXNlcih0LT5idWZmZXItPmRhdGEsIChjb25zdCB2b2lkIF9fdXNlciAqKSh1aW50cHRyX3QpCisJCQkgICB0ci0+ZGF0YS5wdHIuYnVmZmVyLCB0ci0+ZGF0YV9zaXplKSkgewogCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgZ290IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCBkYXRhIHB0clxuIiwKIAkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKIAkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwogCQlnb3RvIGVycl9jb3B5X2RhdGFfZmFpbGVkOwogCX0KLQlpZiAoY29weV9mcm9tX3VzZXIob2ZmcCwgdHItPmRhdGEucHRyLm9mZnNldHMsIHRyLT5vZmZzZXRzX3NpemUpKSB7CisJaWYgKGNvcHlfZnJvbV91c2VyKG9mZnAsIChjb25zdCB2b2lkIF9fdXNlciAqKSh1aW50cHRyX3QpCisJCQkgICB0ci0+ZGF0YS5wdHIub2Zmc2V0cywgdHItPm9mZnNldHNfc2l6ZSkpIHsKIAkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkIGdvdCB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgb2Zmc2V0cyBwdHJcbiIsCiAJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CiAJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKIAkJZ290byBlcnJfY29weV9kYXRhX2ZhaWxlZDsKIAl9Ci0JaWYgKCFJU19BTElHTkVEKHRyLT5vZmZzZXRzX3NpemUsIHNpemVvZihzaXplX3QpKSkgewotCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgZ290IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCBvZmZzZXRzIHNpemUsICV6ZFxuIiwKLQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCB0ci0+b2Zmc2V0c19zaXplKTsKKwlpZiAoIUlTX0FMSUdORUQodHItPm9mZnNldHNfc2l6ZSwgc2l6ZW9mKGJpbmRlcl9zaXplX3QpKSkgeworCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgZ290IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCBvZmZzZXRzIHNpemUsICVsbGRcbiIsCisJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgKHU2NCl0ci0+b2Zmc2V0c19zaXplKTsKIAkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwogCQlnb3RvIGVycl9iYWRfb2Zmc2V0OwogCX0KQEAgLTE0OTgsOCArMTUwNCw4IEBACiAJCWlmICgqb2ZmcCA+IHQtPmJ1ZmZlci0+ZGF0YV9zaXplIC0gc2l6ZW9mKCpmcCkgfHwKIAkJICAgIHQtPmJ1ZmZlci0+ZGF0YV9zaXplIDwgc2l6ZW9mKCpmcCkgfHwKIAkJICAgICFJU19BTElHTkVEKCpvZmZwLCBzaXplb2YodTMyKSkpIHsKLQkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIG9mZnNldCwgJXpkXG4iLAotCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCAqb2ZmcCk7CisJCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgZ290IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCBvZmZzZXQsICVsbGRcbiIsCisJCQkJCSAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgKHU2NCkqb2ZmcCk7CiAJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CiAJCQlnb3RvIGVycl9iYWRfb2Zmc2V0OwogCQl9CkBAIC0xNTE5LDEwICsxNTI1LDEwIEBACiAJCQkJbm9kZS0+YWNjZXB0X2ZkcyA9ICEhKGZwLT5mbGFncyAmIEZMQVRfQklOREVSX0ZMQUdfQUNDRVBUU19GRFMpOwogCQkJfQogCQkJaWYgKGZwLT5jb29raWUgIT0gbm9kZS0+Y29va2llKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkIHNlbmRpbmcgdSVwIG5vZGUgJWQsIGNvb2tpZSBtaXNtYXRjaCAlcCAhPSAlcFxuIiwKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgc2VuZGluZyB1JTAxNmxseCBub2RlICVkLCBjb29raWUgbWlzbWF0Y2ggJTAxNmxseCAhPSAlMDE2bGx4XG4iLAogCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAotCQkJCQlmcC0+YmluZGVyLCBub2RlLT5kZWJ1Z19pZCwKLQkJCQkJZnAtPmNvb2tpZSwgbm9kZS0+Y29va2llKTsKKwkJCQkJKHU2NClmcC0+YmluZGVyLCBub2RlLT5kZWJ1Z19pZCwKKwkJCQkJKHU2NClmcC0+Y29va2llLCAodTY0KW5vZGUtPmNvb2tpZSk7CiAJCQkJZ290byBlcnJfYmluZGVyX2dldF9yZWZfZm9yX25vZGVfZmFpbGVkOwogCQkJfQogCQkJcmVmID0gYmluZGVyX2dldF9yZWZfZm9yX25vZGUodGFyZ2V0X3Byb2MsIG5vZGUpOwpAQCAtMTU0MCw5ICsxNTQ2LDkgQEAKIAogCQkJdHJhY2VfYmluZGVyX3RyYW5zYWN0aW9uX25vZGVfdG9fcmVmKHQsIG5vZGUsIHJlZik7CiAJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJCSAgICAgIiAgICAgICAgbm9kZSAlZCB1JXAgLT4gcmVmICVkIGRlc2MgJWRcbiIsCi0JCQkJICAgICBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyLCByZWYtPmRlYnVnX2lkLAotCQkJCSAgICAgcmVmLT5kZXNjKTsKKwkJCQkgICAgICIgICAgICAgIG5vZGUgJWQgdSUwMTZsbHggLT4gcmVmICVkIGRlc2MgJWRcbiIsCisJCQkJICAgICBub2RlLT5kZWJ1Z19pZCwgKHU2NClub2RlLT5wdHIsCisJCQkJICAgICByZWYtPmRlYnVnX2lkLCByZWYtPmRlc2MpOwogCQl9IGJyZWFrOwogCQljYXNlIEJJTkRFUl9UWVBFX0hBTkRMRToKIAkJY2FzZSBCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRTogewpAQCAtMTU2NCw5ICsxNTcwLDkgQEAKIAkJCQliaW5kZXJfaW5jX25vZGUocmVmLT5ub2RlLCBmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9CSU5ERVIsIDAsIE5VTEwpOwogCQkJCXRyYWNlX2JpbmRlcl90cmFuc2FjdGlvbl9yZWZfdG9fbm9kZSh0LCByZWYpOwogCQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04sCi0JCQkJCSAgICAgIiAgICAgICAgcmVmICVkIGRlc2MgJWQgLT4gbm9kZSAlZCB1JXBcbiIsCisJCQkJCSAgICAgIiAgICAgICAgcmVmICVkIGRlc2MgJWQgLT4gbm9kZSAlZCB1JTAxNmxseFxuIiwKIAkJCQkJICAgICByZWYtPmRlYnVnX2lkLCByZWYtPmRlc2MsIHJlZi0+bm9kZS0+ZGVidWdfaWQsCi0JCQkJCSAgICAgcmVmLT5ub2RlLT5wdHIpOworCQkJCQkgICAgICh1NjQpcmVmLT5ub2RlLT5wdHIpOwogCQkJfSBlbHNlIHsKIAkJCQlzdHJ1Y3QgYmluZGVyX3JlZiAqbmV3X3JlZjsKIAkJCQluZXdfcmVmID0gYmluZGVyX2dldF9yZWZfZm9yX25vZGUodGFyZ2V0X3Byb2MsIHJlZi0+bm9kZSk7CkBAIC0xNjgyLDkgKzE2ODgsOSBAQAogZXJyX2ludmFsaWRfdGFyZ2V0X2hhbmRsZToKIGVycl9ub19jb250ZXh0X21ncl9ub2RlOgogCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfRkFJTEVEX1RSQU5TQUNUSU9OLAotCQkgICAgICIlZDolZCB0cmFuc2FjdGlvbiBmYWlsZWQgJWQsIHNpemUgJXpkLSV6ZFxuIiwKKwkJICAgICAiJWQ6JWQgdHJhbnNhY3Rpb24gZmFpbGVkICVkLCBzaXplICVsbGQtJWxsZFxuIiwKIAkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCByZXR1cm5fZXJyb3IsCi0JCSAgICAgdHItPmRhdGFfc2l6ZSwgdHItPm9mZnNldHNfc2l6ZSk7CisJCSAgICAgKHU2NCl0ci0+ZGF0YV9zaXplLCAodTY0KXRyLT5vZmZzZXRzX3NpemUpOwogCiAJewogCQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeSAqZmU7CkBAIC0xNzAyLDkgKzE3MDgsMTEgQEAKIAogc3RhdGljIGludCBiaW5kZXJfdGhyZWFkX3dyaXRlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKIAkJCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQsCi0JCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90ICpjb25zdW1lZCkKKwkJCWJpbmRlcl91aW50cHRyX3QgYmluZGVyX2J1ZmZlciwgc2l6ZV90IHNpemUsCisJCQliaW5kZXJfc2l6ZV90ICpjb25zdW1lZCkKIHsKIAl1aW50MzJfdCBjbWQ7CisJdm9pZCBfX3VzZXIgKmJ1ZmZlciA9ICh2b2lkIF9fdXNlciAqKSh1aW50cHRyX3QpYmluZGVyX2J1ZmZlcjsKIAl2b2lkIF9fdXNlciAqcHRyID0gYnVmZmVyICsgKmNvbnN1bWVkOwogCXZvaWQgX191c2VyICplbmQgPSBidWZmZXIgKyBzaXplOwogCkBAIC0xNzczLDMzICsxNzgxLDMzIEBACiAJCX0KIAkJY2FzZSBCQ19JTkNSRUZTX0RPTkU6CiAJCWNhc2UgQkNfQUNRVUlSRV9ET05FOiB7Ci0JCQl2b2lkIF9fdXNlciAqbm9kZV9wdHI7Ci0JCQl2b2lkIF9fdXNlciAqY29va2llOworCQkJYmluZGVyX3VpbnRwdHJfdCBub2RlX3B0cjsKKwkJCWJpbmRlcl91aW50cHRyX3QgY29va2llOwogCQkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlOwogCi0JCQlpZiAoZ2V0X3VzZXIobm9kZV9wdHIsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCWlmIChnZXRfdXNlcihub2RlX3B0ciwgKGJpbmRlcl91aW50cHRyX3QgX191c2VyICopcHRyKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKLQkJCWlmIChnZXRfdXNlcihjb29raWUsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCXB0ciArPSBzaXplb2YoYmluZGVyX3VpbnRwdHJfdCk7CisJCQlpZiAoZ2V0X3VzZXIoY29va2llLCAoYmluZGVyX3VpbnRwdHJfdCBfX3VzZXIgKilwdHIpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCQkJcHRyICs9IHNpemVvZihiaW5kZXJfdWludHB0cl90KTsKIAkJCW5vZGUgPSBiaW5kZXJfZ2V0X25vZGUocHJvYywgbm9kZV9wdHIpOwogCQkJaWYgKG5vZGUgPT0gTlVMTCkgewotCQkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCAlcyB1JXAgbm8gbWF0Y2hcbiIsCisJCQkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkICVzIHUlMDE2bGx4IG5vIG1hdGNoXG4iLAogCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAogCQkJCQljbWQgPT0gQkNfSU5DUkVGU19ET05FID8KIAkJCQkJIkJDX0lOQ1JFRlNfRE9ORSIgOgogCQkJCQkiQkNfQUNRVUlSRV9ET05FIiwKLQkJCQkJbm9kZV9wdHIpOworCQkJCQkodTY0KW5vZGVfcHRyKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWlmIChjb29raWUgIT0gbm9kZS0+Y29va2llKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkICVzIHUlcCBub2RlICVkIGNvb2tpZSBtaXNtYXRjaCAlcCAhPSAlcFxuIiwKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgJXMgdSUwMTZsbHggbm9kZSAlZCBjb29raWUgbWlzbWF0Y2ggJTAxNmxseCAhPSAlMDE2bGx4XG4iLAogCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAogCQkJCQljbWQgPT0gQkNfSU5DUkVGU19ET05FID8KIAkJCQkJIkJDX0lOQ1JFRlNfRE9ORSIgOiAiQkNfQUNRVUlSRV9ET05FIiwKLQkJCQkJbm9kZV9wdHIsIG5vZGUtPmRlYnVnX2lkLAotCQkJCQljb29raWUsIG5vZGUtPmNvb2tpZSk7CisJCQkJCSh1NjQpbm9kZV9wdHIsIG5vZGUtPmRlYnVnX2lkLAorCQkJCQkodTY0KWNvb2tpZSwgKHU2NClub2RlLT5jb29raWUpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJaWYgKGNtZCA9PSBCQ19BQ1FVSVJFX0RPTkUpIHsKQEAgLTE4MzUsMjcgKzE4NDMsMjggQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCWNhc2UgQkNfRlJFRV9CVUZGRVI6IHsKLQkJCXZvaWQgX191c2VyICpkYXRhX3B0cjsKKwkJCWJpbmRlcl91aW50cHRyX3QgZGF0YV9wdHI7CiAJCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOwogCi0JCQlpZiAoZ2V0X3VzZXIoZGF0YV9wdHIsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCWlmIChnZXRfdXNlcihkYXRhX3B0ciwgKGJpbmRlcl91aW50cHRyX3QgX191c2VyICopcHRyKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKwkJCXB0ciArPSBzaXplb2YoYmluZGVyX3VpbnRwdHJfdCk7CiAKIAkJCWJ1ZmZlciA9IGJpbmRlcl9idWZmZXJfbG9va3VwKHByb2MsIGRhdGFfcHRyKTsKIAkJCWlmIChidWZmZXIgPT0gTlVMTCkgewotCQkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBCQ19GUkVFX0JVRkZFUiB1JXAgbm8gbWF0Y2hcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGRhdGFfcHRyKTsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgQkNfRlJFRV9CVUZGRVIgdSUwMTZsbHggbm8gbWF0Y2hcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsICh1NjQpZGF0YV9wdHIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJaWYgKCFidWZmZXItPmFsbG93X3VzZXJfZnJlZSkgewotCQkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBCQ19GUkVFX0JVRkZFUiB1JXAgbWF0Y2hlZCB1bnJldHVybmVkIGJ1ZmZlclxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZGF0YV9wdHIpOworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBCQ19GUkVFX0JVRkZFUiB1JTAxNmxseCBtYXRjaGVkIHVucmV0dXJuZWQgYnVmZmVyXG4iLAorCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCAodTY0KWRhdGFfcHRyKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfRlJFRV9CVUZGRVIsCi0JCQkJICAgICAiJWQ6JWQgQkNfRlJFRV9CVUZGRVIgdSVwIGZvdW5kIGJ1ZmZlciAlZCBmb3IgJXMgdHJhbnNhY3Rpb25cbiIsCi0JCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBkYXRhX3B0ciwgYnVmZmVyLT5kZWJ1Z19pZCwKKwkJCQkgICAgICIlZDolZCBCQ19GUkVFX0JVRkZFUiB1JTAxNmxseCBmb3VuZCBidWZmZXIgJWQgZm9yICVzIHRyYW5zYWN0aW9uXG4iLAorCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgKHU2NClkYXRhX3B0ciwKKwkJCQkgICAgIGJ1ZmZlci0+ZGVidWdfaWQsCiAJCQkJICAgICBidWZmZXItPnRyYW5zYWN0aW9uID8gImFjdGl2ZSIgOiAiZmluaXNoZWQiKTsKIAogCQkJaWYgKGJ1ZmZlci0+dHJhbnNhY3Rpb24pIHsKQEAgLTE5MjUsMTYgKzE5MzQsMTYgQEAKIAkJY2FzZSBCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTjoKIAkJY2FzZSBCQ19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT046IHsKIAkJCXVpbnQzMl90IHRhcmdldDsKLQkJCXZvaWQgX191c2VyICpjb29raWU7CisJCQliaW5kZXJfdWludHB0cl90IGNvb2tpZTsKIAkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWY7CiAJCQlzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCAqZGVhdGg7CiAKIAkJCWlmIChnZXRfdXNlcih0YXJnZXQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7Ci0JCQlpZiAoZ2V0X3VzZXIoY29va2llLCAodm9pZCBfX3VzZXIgKiBfX3VzZXIgKilwdHIpKQorCQkJaWYgKGdldF91c2VyKGNvb2tpZSwgKGJpbmRlcl91aW50cHRyX3QgX191c2VyICopcHRyKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKwkJCXB0ciArPSBzaXplb2YoYmluZGVyX3VpbnRwdHJfdCk7CiAJCQlyZWYgPSBiaW5kZXJfZ2V0X3JlZihwcm9jLCB0YXJnZXQpOwogCQkJaWYgKHJlZiA9PSBOVUxMKSB7CiAJCQkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkICVzIGludmFsaWQgcmVmICVkXG4iLApAQCAtMTk0NywxMiArMTk1NiwxMiBAQAogCQkJfQogCiAJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0RFQVRIX05PVElGSUNBVElPTiwKLQkJCQkgICAgICIlZDolZCAlcyAlcCByZWYgJWQgZGVzYyAlZCBzICVkIHcgJWQgZm9yIG5vZGUgJWRcbiIsCisJCQkJICAgICAiJWQ6JWQgJXMgJTAxNmxseCByZWYgJWQgZGVzYyAlZCBzICVkIHcgJWQgZm9yIG5vZGUgJWRcbiIsCiAJCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLAogCQkJCSAgICAgY21kID09IEJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OID8KIAkJCQkgICAgICJCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiIgOgogCQkJCSAgICAgIkJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTiIsCi0JCQkJICAgICBjb29raWUsIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYywKKwkJCQkgICAgICh1NjQpY29va2llLCByZWYtPmRlYnVnX2lkLCByZWYtPmRlc2MsCiAJCQkJICAgICByZWYtPnN0cm9uZywgcmVmLT53ZWFrLCByZWYtPm5vZGUtPmRlYnVnX2lkKTsKIAogCQkJaWYgKGNtZCA9PSBCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTikgewpAQCAtMTk5MCw5ICsxOTk5LDEwIEBACiAJCQkJfQogCQkJCWRlYXRoID0gcmVmLT5kZWF0aDsKIAkJCQlpZiAoZGVhdGgtPmNvb2tpZSAhPSBjb29raWUpIHsKLQkJCQkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkIEJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTiBkZWF0aCBub3RpZmljYXRpb24gY29va2llIG1pc21hdGNoICVwICE9ICVwXG4iLAorCQkJCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OIGRlYXRoIG5vdGlmaWNhdGlvbiBjb29raWUgbWlzbWF0Y2ggJTAxNmxseCAhPSAlMDE2bGx4XG4iLAogCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCQkJCWRlYXRoLT5jb29raWUsIGNvb2tpZSk7CisJCQkJCQkodTY0KWRlYXRoLT5jb29raWUsCisJCQkJCQkodTY0KWNvb2tpZSk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQlyZWYtPmRlYXRoID0gTlVMTDsKQEAgLTIwMTIsOSArMjAyMiw5IEBACiAJCX0gYnJlYWs7CiAJCWNhc2UgQkNfREVBRF9CSU5ERVJfRE9ORTogewogCQkJc3RydWN0IGJpbmRlcl93b3JrICp3OwotCQkJdm9pZCBfX3VzZXIgKmNvb2tpZTsKKwkJCWJpbmRlcl91aW50cHRyX3QgY29va2llOwogCQkJc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggKmRlYXRoID0gTlVMTDsKLQkJCWlmIChnZXRfdXNlcihjb29raWUsICh2b2lkIF9fdXNlciAqIF9fdXNlciAqKXB0cikpCisJCQlpZiAoZ2V0X3VzZXIoY29va2llLCAoYmluZGVyX3VpbnRwdHJfdCBfX3VzZXIgKilwdHIpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCiAJCQlwdHIgKz0gc2l6ZW9mKHZvaWQgKik7CkBAIC0yMDI2LDExICsyMDM2LDEyIEBACiAJCQkJfQogCQkJfQogCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19ERUFEX0JJTkRFUiwKLQkJCQkgICAgICIlZDolZCBCQ19ERUFEX0JJTkRFUl9ET05FICVwIGZvdW5kICVwXG4iLAotCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgY29va2llLCBkZWF0aCk7CisJCQkJICAgICAiJWQ6JWQgQkNfREVBRF9CSU5ERVJfRE9ORSAlMDE2bGx4IGZvdW5kICVwXG4iLAorCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgKHU2NCljb29raWUsCisJCQkJICAgICBkZWF0aCk7CiAJCQlpZiAoZGVhdGggPT0gTlVMTCkgewotCQkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBCQ19ERUFEX0JJTkRFUl9ET05FICVwIG5vdCBmb3VuZFxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgY29va2llKTsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgQkNfREVBRF9CSU5ERVJfRE9ORSAlMDE2bGx4IG5vdCBmb3VuZFxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgKHU2NCljb29raWUpOwogCQkJCWJyZWFrOwogCQkJfQogCkBAIC0yMDgyLDkgKzIwOTMsMTAgQEAKIAogc3RhdGljIGludCBiaW5kZXJfdGhyZWFkX3JlYWQoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLAogCQkJICAgICAgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKLQkJCSAgICAgIHZvaWQgIF9fdXNlciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwKLQkJCSAgICAgIHNpemVfdCAqY29uc3VtZWQsIGludCBub25fYmxvY2spCisJCQkgICAgICBiaW5kZXJfdWludHB0cl90IGJpbmRlcl9idWZmZXIsIHNpemVfdCBzaXplLAorCQkJICAgICAgYmluZGVyX3NpemVfdCAqY29uc3VtZWQsIGludCBub25fYmxvY2spCiB7CisJdm9pZCBfX3VzZXIgKmJ1ZmZlciA9ICh2b2lkIF9fdXNlciAqKSh1aW50cHRyX3QpYmluZGVyX2J1ZmZlcjsKIAl2b2lkIF9fdXNlciAqcHRyID0gYnVmZmVyICsgKmNvbnN1bWVkOwogCXZvaWQgX191c2VyICplbmQgPSBidWZmZXIgKyBzaXplOwogCkBAIC0yMjI5LDMyICsyMjQxLDQwIEBACiAJCQkJaWYgKHB1dF91c2VyKGNtZCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCiAJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCXB0ciArPSBzaXplb2YodWludDMyX3QpOwotCQkJCWlmIChwdXRfdXNlcihub2RlLT5wdHIsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCQlpZiAocHV0X3VzZXIobm9kZS0+cHRyLAorCQkJCQkgICAgIChiaW5kZXJfdWludHB0cl90IF9fdXNlciAqKXB0cikpCiAJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKLQkJCQlpZiAocHV0X3VzZXIobm9kZS0+Y29va2llLCAodm9pZCAqIF9fdXNlciAqKXB0cikpCisJCQkJcHRyICs9IHNpemVvZihiaW5kZXJfdWludHB0cl90KTsKKwkJCQlpZiAocHV0X3VzZXIobm9kZS0+Y29va2llLAorCQkJCQkgICAgIChiaW5kZXJfdWludHB0cl90IF9fdXNlciAqKXB0cikpCiAJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKwkJCQlwdHIgKz0gc2l6ZW9mKGJpbmRlcl91aW50cHRyX3QpOwogCiAJCQkJYmluZGVyX3N0YXRfYnIocHJvYywgdGhyZWFkLCBjbWQpOwogCQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVVNFUl9SRUZTLAotCQkJCQkgICAgICIlZDolZCAlcyAlZCB1JXAgYyVwXG4iLAotCQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGNtZF9uYW1lLCBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyLCBub2RlLT5jb29raWUpOworCQkJCQkgICAgICIlZDolZCAlcyAlZCB1JTAxNmxseCBjJTAxNmxseFxuIiwKKwkJCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBjbWRfbmFtZSwKKwkJCQkJICAgICBub2RlLT5kZWJ1Z19pZCwKKwkJCQkJICAgICAodTY0KW5vZGUtPnB0ciwgKHU2NClub2RlLT5jb29raWUpOwogCQkJfSBlbHNlIHsKIAkJCQlsaXN0X2RlbF9pbml0KCZ3LT5lbnRyeSk7CiAJCQkJaWYgKCF3ZWFrICYmICFzdHJvbmcpIHsKIAkJCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTLAotCQkJCQkJICAgICAiJWQ6JWQgbm9kZSAlZCB1JXAgYyVwIGRlbGV0ZWRcbiIsCi0JCQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIG5vZGUtPmRlYnVnX2lkLAotCQkJCQkJICAgICBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSk7CisJCQkJCQkgICAgICIlZDolZCBub2RlICVkIHUlMDE2bGx4IGMlMDE2bGx4IGRlbGV0ZWRcbiIsCisJCQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJCQkgICAgIG5vZGUtPmRlYnVnX2lkLAorCQkJCQkJICAgICAodTY0KW5vZGUtPnB0ciwKKwkJCQkJCSAgICAgKHU2NClub2RlLT5jb29raWUpOwogCQkJCQlyYl9lcmFzZSgmbm9kZS0+cmJfbm9kZSwgJnByb2MtPm5vZGVzKTsKIAkJCQkJa2ZyZWUobm9kZSk7CiAJCQkJCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX05PREUpOwogCQkJCX0gZWxzZSB7CiAJCQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUywKLQkJCQkJCSAgICAgIiVkOiVkIG5vZGUgJWQgdSVwIGMlcCBzdGF0ZSB1bmNoYW5nZWRcbiIsCi0JCQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsCi0JCQkJCQkgICAgIG5vZGUtPmNvb2tpZSk7CisJCQkJCQkgICAgICIlZDolZCBub2RlICVkIHUlMDE2bGx4IGMlMDE2bGx4IHN0YXRlIHVuY2hhbmdlZFxuIiwKKwkJCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKKwkJCQkJCSAgICAgbm9kZS0+ZGVidWdfaWQsCisJCQkJCQkgICAgICh1NjQpbm9kZS0+cHRyLAorCQkJCQkJICAgICAodTY0KW5vZGUtPmNvb2tpZSk7CiAJCQkJfQogCQkJfQogCQl9IGJyZWFrOwpAQCAtMjI3MiwxNyArMjI5MiwxOCBAQAogCQkJaWYgKHB1dF91c2VyKGNtZCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKLQkJCWlmIChwdXRfdXNlcihkZWF0aC0+Y29va2llLCAodm9pZCAqIF9fdXNlciAqKXB0cikpCisJCQlpZiAocHV0X3VzZXIoZGVhdGgtPmNvb2tpZSwKKwkJCQkgICAgIChiaW5kZXJfdWludHB0cl90IF9fdXNlciAqKXB0cikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlwdHIgKz0gc2l6ZW9mKHZvaWQgKik7CisJCQlwdHIgKz0gc2l6ZW9mKGJpbmRlcl91aW50cHRyX3QpOwogCQkJYmluZGVyX3N0YXRfYnIocHJvYywgdGhyZWFkLCBjbWQpOwogCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19ERUFUSF9OT1RJRklDQVRJT04sCi0JCQkJICAgICAiJWQ6JWQgJXMgJXBcbiIsCisJCQkJICAgICAiJWQ6JWQgJXMgJTAxNmxseFxuIiwKIAkJCQkgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLAogCQkJCSAgICAgIGNtZCA9PSBCUl9ERUFEX0JJTkRFUiA/CiAJCQkJICAgICAgIkJSX0RFQURfQklOREVSIiA6CiAJCQkJICAgICAgIkJSX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTl9ET05FIiwKLQkJCQkgICAgICBkZWF0aC0+Y29va2llKTsKKwkJCQkgICAgICAodTY0KWRlYXRoLT5jb29raWUpOwogCiAJCQlpZiAody0+dHlwZSA9PSBCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04pIHsKIAkJCQlsaXN0X2RlbCgmdy0+ZW50cnkpOwpAQCAtMjMxMiw4ICsyMzMzLDggQEAKIAkJCQliaW5kZXJfc2V0X25pY2UodGFyZ2V0X25vZGUtPm1pbl9wcmlvcml0eSk7CiAJCQljbWQgPSBCUl9UUkFOU0FDVElPTjsKIAkJfSBlbHNlIHsKLQkJCXRyLnRhcmdldC5wdHIgPSBOVUxMOwotCQkJdHIuY29va2llID0gTlVMTDsKKwkJCXRyLnRhcmdldC5wdHIgPSAwOworCQkJdHIuY29va2llID0gMDsKIAkJCWNtZCA9IEJSX1JFUExZOwogCQl9CiAJCXRyLmNvZGUgPSB0LT5jb2RlOwpAQCAtMjMzMCw4ICsyMzUxLDkgQEAKIAogCQl0ci5kYXRhX3NpemUgPSB0LT5idWZmZXItPmRhdGFfc2l6ZTsKIAkJdHIub2Zmc2V0c19zaXplID0gdC0+YnVmZmVyLT5vZmZzZXRzX3NpemU7Ci0JCXRyLmRhdGEucHRyLmJ1ZmZlciA9ICh2b2lkICopdC0+YnVmZmVyLT5kYXRhICsKLQkJCQkJcHJvYy0+dXNlcl9idWZmZXJfb2Zmc2V0OworCQl0ci5kYXRhLnB0ci5idWZmZXIgPSAoYmluZGVyX3VpbnRwdHJfdCkoCisJCQkJCSh1aW50cHRyX3QpdC0+YnVmZmVyLT5kYXRhICsKKwkJCQkJcHJvYy0+dXNlcl9idWZmZXJfb2Zmc2V0KTsKIAkJdHIuZGF0YS5wdHIub2Zmc2V0cyA9IHRyLmRhdGEucHRyLmJ1ZmZlciArCiAJCQkJCUFMSUdOKHQtPmJ1ZmZlci0+ZGF0YV9zaXplLAogCQkJCQkgICAgc2l6ZW9mKHZvaWQgKikpOwpAQCAtMjM0NiwxNCArMjM2OCwxNCBAQAogCQl0cmFjZV9iaW5kZXJfdHJhbnNhY3Rpb25fcmVjZWl2ZWQodCk7CiAJCWJpbmRlcl9zdGF0X2JyKHByb2MsIHRocmVhZCwgY21kKTsKIAkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiwKLQkJCSAgICAgIiVkOiVkICVzICVkICVkOiVkLCBjbWQgJWQgc2l6ZSAlemQtJXpkIHB0ciAlcC0lcFxuIiwKKwkJCSAgICAgIiVkOiVkICVzICVkICVkOiVkLCBjbWQgJWQgc2l6ZSAlemQtJXpkIHB0ciAlMDE2bGx4LSUwMTZsbHhcbiIsCiAJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsCiAJCQkgICAgIChjbWQgPT0gQlJfVFJBTlNBQ1RJT04pID8gIkJSX1RSQU5TQUNUSU9OIiA6CiAJCQkgICAgICJCUl9SRVBMWSIsCiAJCQkgICAgIHQtPmRlYnVnX2lkLCB0LT5mcm9tID8gdC0+ZnJvbS0+cHJvYy0+cGlkIDogMCwKIAkJCSAgICAgdC0+ZnJvbSA/IHQtPmZyb20tPnBpZCA6IDAsIGNtZCwKIAkJCSAgICAgdC0+YnVmZmVyLT5kYXRhX3NpemUsIHQtPmJ1ZmZlci0+b2Zmc2V0c19zaXplLAotCQkJICAgICB0ci5kYXRhLnB0ci5idWZmZXIsIHRyLmRhdGEucHRyLm9mZnNldHMpOworCQkJICAgICAodTY0KXRyLmRhdGEucHRyLmJ1ZmZlciwgKHU2NCl0ci5kYXRhLnB0ci5vZmZzZXRzKTsKIAogCQlsaXN0X2RlbCgmdC0+d29yay5lbnRyeSk7CiAJCXQtPmJ1ZmZlci0+YWxsb3dfdXNlcl9mcmVlID0gMTsKQEAgLTI0MjMsOCArMjQ0NSw4IEBACiAKIAkJCWRlYXRoID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoLCB3b3JrKTsKIAkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfREVBRF9UUkFOU0FDVElPTiwKLQkJCQkidW5kZWxpdmVyZWQgZGVhdGggbm90aWZpY2F0aW9uLCAlcFxuIiwKLQkJCQlkZWF0aC0+Y29va2llKTsKKwkJCQkidW5kZWxpdmVyZWQgZGVhdGggbm90aWZpY2F0aW9uLCAlMDE2bGx4XG4iLAorCQkJCSh1NjQpZGVhdGgtPmNvb2tpZSk7CiAJCQlrZnJlZShkZWF0aCk7CiAJCQliaW5kZXJfc3RhdHNfZGVsZXRlZChCSU5ERVJfU1RBVF9ERUFUSCk7CiAJCX0gYnJlYWs7CkBAIC0yNTgwLDEyICsyNjAyLDE2IEBACiAJCQlnb3RvIGVycjsKIAkJfQogCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1JFQURfV1JJVEUsCi0JCQkgICAgICIlZDolZCB3cml0ZSAlemQgYXQgJTAxNmx4LCByZWFkICV6ZCBhdCAlMDE2bHhcbiIsCi0JCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGJ3ci53cml0ZV9zaXplLAotCQkJICAgICBid3Iud3JpdGVfYnVmZmVyLCBid3IucmVhZF9zaXplLCBid3IucmVhZF9idWZmZXIpOworCQkJICAgICAiJWQ6JWQgd3JpdGUgJWxsZCBhdCAlMDE2bGx4LCByZWFkICVsbGQgYXQgJTAxNmxseFxuIiwKKwkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKKwkJCSAgICAgKHU2NClid3Iud3JpdGVfc2l6ZSwgKHU2NClid3Iud3JpdGVfYnVmZmVyLAorCQkJICAgICAodTY0KWJ3ci5yZWFkX3NpemUsICh1NjQpYndyLnJlYWRfYnVmZmVyKTsKIAogCQlpZiAoYndyLndyaXRlX3NpemUgPiAwKSB7Ci0JCQlyZXQgPSBiaW5kZXJfdGhyZWFkX3dyaXRlKHByb2MsIHRocmVhZCwgKHZvaWQgX191c2VyICopYndyLndyaXRlX2J1ZmZlciwgYndyLndyaXRlX3NpemUsICZid3Iud3JpdGVfY29uc3VtZWQpOworCQkJcmV0ID0gYmluZGVyX3RocmVhZF93cml0ZShwcm9jLCB0aHJlYWQsCisJCQkJCQkgIGJ3ci53cml0ZV9idWZmZXIsCisJCQkJCQkgIGJ3ci53cml0ZV9zaXplLAorCQkJCQkJICAmYndyLndyaXRlX2NvbnN1bWVkKTsKIAkJCXRyYWNlX2JpbmRlcl93cml0ZV9kb25lKHJldCk7CiAJCQlpZiAocmV0IDwgMCkgewogCQkJCWJ3ci5yZWFkX2NvbnN1bWVkID0gMDsKQEAgLTI1OTUsNyArMjYyMSwxMCBAQAogCQkJfQogCQl9CiAJCWlmIChid3IucmVhZF9zaXplID4gMCkgewotCQkJcmV0ID0gYmluZGVyX3RocmVhZF9yZWFkKHByb2MsIHRocmVhZCwgKHZvaWQgX191c2VyICopYndyLnJlYWRfYnVmZmVyLCBid3IucmVhZF9zaXplLCAmYndyLnJlYWRfY29uc3VtZWQsIGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwkJCXJldCA9IGJpbmRlcl90aHJlYWRfcmVhZChwcm9jLCB0aHJlYWQsIGJ3ci5yZWFkX2J1ZmZlciwKKwkJCQkJCSBid3IucmVhZF9zaXplLAorCQkJCQkJICZid3IucmVhZF9jb25zdW1lZCwKKwkJCQkJCSBmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CiAJCQl0cmFjZV9iaW5kZXJfcmVhZF9kb25lKHJldCk7CiAJCQlpZiAoIWxpc3RfZW1wdHkoJnByb2MtPnRvZG8pKQogCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJvYy0+d2FpdCk7CkBAIC0yNjA2LDkgKzI2MzUsMTAgQEAKIAkJCX0KIAkJfQogCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1JFQURfV1JJVEUsCi0JCQkgICAgICIlZDolZCB3cm90ZSAlemQgb2YgJXpkLCByZWFkIHJldHVybiAlemQgb2YgJXpkXG4iLAotCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBid3Iud3JpdGVfY29uc3VtZWQsIGJ3ci53cml0ZV9zaXplLAotCQkJICAgICBid3IucmVhZF9jb25zdW1lZCwgYndyLnJlYWRfc2l6ZSk7CisJCQkgICAgICIlZDolZCB3cm90ZSAlbGxkIG9mICVsbGQsIHJlYWQgcmV0dXJuICVsbGQgb2YgJWxsZFxuIiwKKwkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKKwkJCSAgICAgKHU2NClid3Iud3JpdGVfY29uc3VtZWQsICh1NjQpYndyLndyaXRlX3NpemUsCisJCQkgICAgICh1NjQpYndyLnJlYWRfY29uc3VtZWQsICh1NjQpYndyLnJlYWRfc2l6ZSk7CiAJCWlmIChjb3B5X3RvX3VzZXIodWJ1ZiwgJmJ3ciwgc2l6ZW9mKGJ3cikpKSB7CiAJCQlyZXQgPSAtRUZBVUxUOwogCQkJZ290byBlcnI7CkBAIC0yNjM3LDcgKzI2NjcsNyBAQAogCQkJfQogCQl9IGVsc2UKIAkJCWJpbmRlcl9jb250ZXh0X21ncl91aWQgPSBjdXJyZW50LT5jcmVkLT5ldWlkOwotCQliaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSA9IGJpbmRlcl9uZXdfbm9kZShwcm9jLCBOVUxMLCBOVUxMKTsKKwkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUgPSBiaW5kZXJfbmV3X25vZGUocHJvYywgMCwgMCk7CiAJCWlmIChiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSA9PSBOVUxMKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJZ290byBlcnI7CkBAIC0zMTMyLDggKzMxNjIsOSBAQAogCQlicmVhazsKIAljYXNlIEJJTkRFUl9XT1JLX05PREU6CiAJCW5vZGUgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl9ub2RlLCB3b3JrKTsKLQkJc2VxX3ByaW50ZihtLCAiJXNub2RlIHdvcmsgJWQ6IHUlcCBjJXBcbiIsCi0JCQkgICBwcmVmaXgsIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSk7CisJCXNlcV9wcmludGYobSwgIiVzbm9kZSB3b3JrICVkOiB1JTAxNmxseCBjJTAxNmxseFxuIiwKKwkJCSAgIHByZWZpeCwgbm9kZS0+ZGVidWdfaWQsCisJCQkgICAodTY0KW5vZGUtPnB0ciwgKHU2NClub2RlLT5jb29raWUpOwogCQlicmVhazsKIAljYXNlIEJJTkRFUl9XT1JLX0RFQURfQklOREVSOgogCQlzZXFfcHJpbnRmKG0sICIlc2hhcyBkZWFkIGJpbmRlclxuIiwgcHJlZml4KTsKQEAgLTMxOTMsOCArMzIyNCw4IEBACiAJaGxpc3RfZm9yX2VhY2hfZW50cnkocmVmLCAmbm9kZS0+cmVmcywgbm9kZV9lbnRyeSkKIAkJY291bnQrKzsKIAotCXNlcV9wcmludGYobSwgIiAgbm9kZSAlZDogdSVwIGMlcCBocyAlZCBodyAlZCBscyAlZCBsdyAlZCBpcyAlZCBpdyAlZCIsCi0JCSAgIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSwKKwlzZXFfcHJpbnRmKG0sICIgIG5vZGUgJWQ6IHUlMDE2bGx4IGMlMDE2bGx4IGhzICVkIGh3ICVkIGxzICVkIGx3ICVkIGlzICVkIGl3ICVkIiwKKwkJICAgbm9kZS0+ZGVidWdfaWQsICh1NjQpbm9kZS0+cHRyLCAodTY0KW5vZGUtPmNvb2tpZSwKIAkJICAgbm9kZS0+aGFzX3N0cm9uZ19yZWYsIG5vZGUtPmhhc193ZWFrX3JlZiwKIAkJICAgbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMsIG5vZGUtPmxvY2FsX3dlYWtfcmVmcywKIAkJICAgbm9kZS0+aW50ZXJuYWxfc3Ryb25nX3JlZnMsIGNvdW50KTsKQEAgLTM0OTYsNiArMzUyNyw3IEBACiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLnBvbGwgPSBiaW5kZXJfcG9sbCwKIAkudW5sb2NrZWRfaW9jdGwgPSBiaW5kZXJfaW9jdGwsCisJLmNvbXBhdF9pb2N0bCA9IGJpbmRlcl9pb2N0bCwKIAkubW1hcCA9IGJpbmRlcl9tbWFwLAogCS5vcGVuID0gYmluZGVyX29wZW4sCiAJLmZsdXNoID0gYmluZGVyX2ZsdXNoLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYmluZGVyLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuaAppbmRleCBjYmUzNDUxLi5lYjA4MzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuaApAQCAtMjAsMzExICsyMCwxMSBAQAogI2lmbmRlZiBfTElOVVhfQklOREVSX0gKICNkZWZpbmUgX0xJTlVYX0JJTkRFUl9ICiAKLSNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2lmZGVmIENPTkZJR19BTkRST0lEX0JJTkRFUl9JUENfMzJCSVQKKyNkZWZpbmUgQklOREVSX0lQQ18zMkJJVCAxCisjZW5kaWYKIAotI2RlZmluZSBCX1BBQ0tfQ0hBUlMoYzEsIGMyLCBjMywgYzQpIFwKLQkoKCgoYzEpPDwyNCkpIHwgKCgoYzIpPDwxNikpIHwgKCgoYzMpPDw4KSkgfCAoYzQpKQotI2RlZmluZSBCX1RZUEVfTEFSR0UgMHg4NQotCi1lbnVtIHsKLQlCSU5ERVJfVFlQRV9CSU5ERVIJPSBCX1BBQ0tfQ0hBUlMoJ3MnLCAnYicsICcqJywgQl9UWVBFX0xBUkdFKSwKLQlCSU5ERVJfVFlQRV9XRUFLX0JJTkRFUgk9IEJfUEFDS19DSEFSUygndycsICdiJywgJyonLCBCX1RZUEVfTEFSR0UpLAotCUJJTkRFUl9UWVBFX0hBTkRMRQk9IEJfUEFDS19DSEFSUygncycsICdoJywgJyonLCBCX1RZUEVfTEFSR0UpLAotCUJJTkRFUl9UWVBFX1dFQUtfSEFORExFCT0gQl9QQUNLX0NIQVJTKCd3JywgJ2gnLCAnKicsIEJfVFlQRV9MQVJHRSksCi0JQklOREVSX1RZUEVfRkQJCT0gQl9QQUNLX0NIQVJTKCdmJywgJ2QnLCAnKicsIEJfVFlQRV9MQVJHRSksCi19OwotCi1lbnVtIHsKLQlGTEFUX0JJTkRFUl9GTEFHX1BSSU9SSVRZX01BU0sgPSAweGZmLAotCUZMQVRfQklOREVSX0ZMQUdfQUNDRVBUU19GRFMgPSAweDEwMCwKLX07Ci0KLS8qCi0gKiBUaGlzIGlzIHRoZSBmbGF0dGVuZWQgcmVwcmVzZW50YXRpb24gb2YgYSBCaW5kZXIgb2JqZWN0IGZvciB0cmFuc2ZlcgotICogYmV0d2VlbiBwcm9jZXNzZXMuICBUaGUgJ29mZnNldHMnIHN1cHBsaWVkIGFzIHBhcnQgb2YgYSBiaW5kZXIgdHJhbnNhY3Rpb24KLSAqIGNvbnRhaW5zIG9mZnNldHMgaW50byB0aGUgZGF0YSB3aGVyZSB0aGVzZSBzdHJ1Y3R1cmVzIG9jY3VyLiAgVGhlIEJpbmRlcgotICogZHJpdmVyIHRha2VzIGNhcmUgb2YgcmUtd3JpdGluZyB0aGUgc3RydWN0dXJlIHR5cGUgYW5kIGRhdGEgYXMgaXQgbW92ZXMKLSAqIGJldHdlZW4gcHJvY2Vzc2VzLgotICovCi1zdHJ1Y3QgZmxhdF9iaW5kZXJfb2JqZWN0IHsKLQkvKiA4IGJ5dGVzIGZvciBsYXJnZV9mbGF0X2hlYWRlci4gKi8KLQlfX3UzMgkJdHlwZTsKLQlfX3UzMgkJZmxhZ3M7Ci0KLQkvKiA4IGJ5dGVzIG9mIGRhdGEuICovCi0JdW5pb24gewotCQl2b2lkIF9fdXNlcgkqYmluZGVyOwkvKiBsb2NhbCBvYmplY3QgKi8KLQkJX191MzIJICAgIGhhbmRsZTsJCS8qIHJlbW90ZSBvYmplY3QgKi8KLQl9OwotCi0JLyogZXh0cmEgZGF0YSBhc3NvY2lhdGVkIHdpdGggbG9jYWwgb2JqZWN0ICovCi0Jdm9pZCBfX3VzZXIJCSpjb29raWU7Ci19OwotCi0vKgotICogT24gNjQtYml0IHBsYXRmb3JtcyB3aGVyZSB1c2VyIGNvZGUgbWF5IHJ1biBpbiAzMi1iaXRzIHRoZSBkcml2ZXIgbXVzdAotICogdHJhbnNsYXRlIHRoZSBidWZmZXIgKGFuZCBsb2NhbCBiaW5kZXIpIGFkZHJlc3NlcyBhcHByb3ByaWF0ZWx5LgotICovCi0KLXN0cnVjdCBiaW5kZXJfd3JpdGVfcmVhZCB7Ci0Jc2l6ZV90IHdyaXRlX3NpemU7CS8qIGJ5dGVzIHRvIHdyaXRlICovCi0Jc2l6ZV90IHdyaXRlX2NvbnN1bWVkOwkvKiBieXRlcyBjb25zdW1lZCBieSBkcml2ZXIgKi8KLQl1bnNpZ25lZCBsb25nCXdyaXRlX2J1ZmZlcjsKLQlzaXplX3QgcmVhZF9zaXplOwkvKiBieXRlcyB0byByZWFkICovCi0Jc2l6ZV90IHJlYWRfY29uc3VtZWQ7CS8qIGJ5dGVzIGNvbnN1bWVkIGJ5IGRyaXZlciAqLwotCXVuc2lnbmVkIGxvbmcJcmVhZF9idWZmZXI7Ci19OwotCi0vKiBVc2Ugd2l0aCBCSU5ERVJfVkVSU0lPTiwgZHJpdmVyIGZpbGxzIGluIGZpZWxkcy4gKi8KLXN0cnVjdCBiaW5kZXJfdmVyc2lvbiB7Ci0JLyogZHJpdmVyIHByb3RvY29sIHZlcnNpb24gLS0gaW5jcmVtZW50IHdpdGggaW5jb21wYXRpYmxlIGNoYW5nZSAqLwotCV9fczMyICAgICAgIHByb3RvY29sX3ZlcnNpb247Ci19OwotCi0vKiBUaGlzIGlzIHRoZSBjdXJyZW50IHByb3RvY29sIHZlcnNpb24uICovCi0jZGVmaW5lIEJJTkRFUl9DVVJSRU5UX1BST1RPQ09MX1ZFUlNJT04gNwotCi0jZGVmaW5lIEJJTkRFUl9XUklURV9SRUFECQlfSU9XUignYicsIDEsIHN0cnVjdCBiaW5kZXJfd3JpdGVfcmVhZCkKLSNkZWZpbmUJQklOREVSX1NFVF9JRExFX1RJTUVPVVQJCV9JT1coJ2InLCAzLCBfX3M2NCkKLSNkZWZpbmUJQklOREVSX1NFVF9NQVhfVEhSRUFEUwkJX0lPVygnYicsIDUsIF9fdTMyKQotI2RlZmluZQlCSU5ERVJfU0VUX0lETEVfUFJJT1JJVFkJX0lPVygnYicsIDYsIF9fczMyKQotI2RlZmluZQlCSU5ERVJfU0VUX0NPTlRFWFRfTUdSCQlfSU9XKCdiJywgNywgX19zMzIpCi0jZGVmaW5lCUJJTkRFUl9USFJFQURfRVhJVAkJX0lPVygnYicsIDgsIF9fczMyKQotI2RlZmluZSBCSU5ERVJfVkVSU0lPTgkJCV9JT1dSKCdiJywgOSwgc3RydWN0IGJpbmRlcl92ZXJzaW9uKQotCi0vKgotICogTk9URTogVHdvIHNwZWNpYWwgZXJyb3IgY29kZXMgeW91IHNob3VsZCBjaGVjayBmb3Igd2hlbiBjYWxsaW5nCi0gKiBpbiB0byB0aGUgZHJpdmVyIGFyZToKLSAqCi0gKiBFSU5UUiAtLSBUaGUgb3BlcmF0aW9uIGhhcyBiZWVuIGludGVydXB0ZWQuICBUaGlzIHNob3VsZCBiZQotICogaGFuZGxlZCBieSByZXRyeWluZyB0aGUgaW9jdGwoKSB1bnRpbCBhIGRpZmZlcmVudCBlcnJvciBjb2RlCi0gKiBpcyByZXR1cm5lZC4KLSAqCi0gKiBFQ09OTlJFRlVTRUQgLS0gVGhlIGRyaXZlciBpcyBubyBsb25nZXIgYWNjZXB0aW5nIG9wZXJhdGlvbnMKLSAqIGZyb20geW91ciBwcm9jZXNzLiAgVGhhdCBpcywgdGhlIHByb2Nlc3MgaXMgYmVpbmcgZGVzdHJveWVkLgotICogWW91IHNob3VsZCBoYW5kbGUgdGhpcyBieSBleGl0aW5nIGZyb20geW91ciBwcm9jZXNzLiAgTm90ZQotICogdGhhdCBvbmNlIHRoaXMgZXJyb3IgY29kZSBpcyByZXR1cm5lZCwgYWxsIGZ1cnRoZXIgY2FsbHMgdG8KLSAqIHRoZSBkcml2ZXIgZnJvbSBhbnkgdGhyZWFkIHdpbGwgcmV0dXJuIHRoaXMgc2FtZSBjb2RlLgotICovCi0KLWVudW0gdHJhbnNhY3Rpb25fZmxhZ3MgewotCVRGX09ORV9XQVkJPSAweDAxLAkvKiB0aGlzIGlzIGEgb25lLXdheSBjYWxsOiBhc3luYywgbm8gcmV0dXJuICovCi0JVEZfUk9PVF9PQkpFQ1QJPSAweDA0LAkvKiBjb250ZW50cyBhcmUgdGhlIGNvbXBvbmVudCdzIHJvb3Qgb2JqZWN0ICovCi0JVEZfU1RBVFVTX0NPREUJPSAweDA4LAkvKiBjb250ZW50cyBhcmUgYSAzMi1iaXQgc3RhdHVzIGNvZGUgKi8KLQlURl9BQ0NFUFRfRkRTCT0gMHgxMCwJLyogYWxsb3cgcmVwbGllcyB3aXRoIGZpbGUgZGVzY3JpcHRvcnMgKi8KLX07Ci0KLXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSB7Ci0JLyogVGhlIGZpcnN0IHR3byBhcmUgb25seSB1c2VkIGZvciBiY1RSQU5TQUNUSU9OIGFuZCBiclRSQU5TQUNUSU9OLAotCSAqIGlkZW50aWZ5aW5nIHRoZSB0YXJnZXQgYW5kIGNvbnRlbnRzIG9mIHRoZSB0cmFuc2FjdGlvbi4KLQkgKi8KLQl1bmlvbiB7Ci0JCV9fdTMyCWhhbmRsZTsJLyogdGFyZ2V0IGRlc2NyaXB0b3Igb2YgY29tbWFuZCB0cmFuc2FjdGlvbiAqLwotCQl2b2lkCSpwdHI7CS8qIHRhcmdldCBkZXNjcmlwdG9yIG9mIHJldHVybiB0cmFuc2FjdGlvbiAqLwotCX0gdGFyZ2V0OwotCXZvaWQJCSpjb29raWU7CS8qIHRhcmdldCBvYmplY3QgY29va2llICovCi0JX191MzIJCWNvZGU7CQkvKiB0cmFuc2FjdGlvbiBjb21tYW5kICovCi0KLQkvKiBHZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2FjdGlvbi4gKi8KLQlfX3UzMgkgICAgICAgIGZsYWdzOwotCXBpZF90CQlzZW5kZXJfcGlkOwotCXVpZF90CQlzZW5kZXJfZXVpZDsKLQlzaXplX3QJCWRhdGFfc2l6ZTsJLyogbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgKi8KLQlzaXplX3QJCW9mZnNldHNfc2l6ZTsJLyogbnVtYmVyIG9mIGJ5dGVzIG9mIG9mZnNldHMgKi8KLQotCS8qIElmIHRoaXMgdHJhbnNhY3Rpb24gaXMgaW5saW5lLCB0aGUgZGF0YSBpbW1lZGlhdGVseQotCSAqIGZvbGxvd3MgaGVyZTsgb3RoZXJ3aXNlLCBpdCBlbmRzIHdpdGggYSBwb2ludGVyIHRvCi0JICogdGhlIGRhdGEgYnVmZmVyLgotCSAqLwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCS8qIHRyYW5zYWN0aW9uIGRhdGEgKi8KLQkJCWNvbnN0IHZvaWQgX191c2VyCSpidWZmZXI7Ci0JCQkvKiBvZmZzZXRzIGZyb20gYnVmZmVyIHRvIGZsYXRfYmluZGVyX29iamVjdCBzdHJ1Y3RzICovCi0JCQljb25zdCB2b2lkIF9fdXNlcgkqb2Zmc2V0czsKLQkJfSBwdHI7Ci0JCV9fdTgJYnVmWzhdOwotCX0gZGF0YTsKLX07Ci0KLXN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSB7Ci0Jdm9pZCAqcHRyOwotCXZvaWQgKmNvb2tpZTsKLX07Ci0KLXN0cnVjdCBiaW5kZXJfcHJpX2Rlc2MgewotCV9fczMyIHByaW9yaXR5OwotCV9fdTMyIGRlc2M7Ci19OwotCi1zdHJ1Y3QgYmluZGVyX3ByaV9wdHJfY29va2llIHsKLQlfX3MzMiBwcmlvcml0eTsKLQl2b2lkICpwdHI7Ci0Jdm9pZCAqY29va2llOwotfTsKLQotZW51bSBiaW5kZXJfZHJpdmVyX3JldHVybl9wcm90b2NvbCB7Ci0JQlJfRVJST1IgPSBfSU9SKCdyJywgMCwgX19zMzIpLAotCS8qCi0JICogaW50OiBlcnJvciBjb2RlCi0JICovCi0KLQlCUl9PSyA9IF9JTygncicsIDEpLAotCS8qIE5vIHBhcmFtZXRlcnMhICovCi0KLQlCUl9UUkFOU0FDVElPTiA9IF9JT1IoJ3InLCAyLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEpLAotCUJSX1JFUExZID0gX0lPUigncicsIDMsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCi0JLyoKLQkgKiBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YTogdGhlIHJlY2VpdmVkIGNvbW1hbmQuCi0JICovCi0KLQlCUl9BQ1FVSVJFX1JFU1VMVCA9IF9JT1IoJ3InLCA0LCBfX3MzMiksCi0JLyoKLQkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAotCSAqIGludDogMCBpZiB0aGUgbGFzdCBiY0FUVEVNUFRfQUNRVUlSRSB3YXMgbm90IHN1Y2Nlc3NmdWwuCi0JICogRWxzZSB0aGUgcmVtb3RlIG9iamVjdCBoYXMgYWNxdWlyZWQgYSBwcmltYXJ5IHJlZmVyZW5jZS4KLQkgKi8KLQotCUJSX0RFQURfUkVQTFkgPSBfSU8oJ3InLCA1KSwKLQkvKgotCSAqIFRoZSB0YXJnZXQgb2YgdGhlIGxhc3QgdHJhbnNhY3Rpb24gKGVpdGhlciBhIGJjVFJBTlNBQ1RJT04gb3IKLQkgKiBhIGJjQVRURU1QVF9BQ1FVSVJFKSBpcyBubyBsb25nZXIgd2l0aCB1cy4gIE5vIHBhcmFtZXRlcnMuCi0JICovCi0KLQlCUl9UUkFOU0FDVElPTl9DT01QTEVURSA9IF9JTygncicsIDYpLAotCS8qCi0JICogTm8gcGFyYW1ldGVycy4uLiBhbHdheXMgcmVmZXJzIHRvIHRoZSBsYXN0IHRyYW5zYWN0aW9uIHJlcXVlc3RlZAotCSAqIChpbmNsdWRpbmcgcmVwbGllcykuICBOb3RlIHRoYXQgdGhpcyB3aWxsIGJlIHNlbnQgZXZlbiBmb3IKLQkgKiBhc3luY2hyb25vdXMgdHJhbnNhY3Rpb25zLgotCSAqLwotCi0JQlJfSU5DUkVGUyA9IF9JT1IoJ3InLCA3LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAotCUJSX0FDUVVJUkUgPSBfSU9SKCdyJywgOCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQlCUl9SRUxFQVNFID0gX0lPUigncicsIDksIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCi0JQlJfREVDUkVGUyA9IF9JT1IoJ3InLCAxMCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQkvKgotCSAqIHZvaWQgKjoJcHRyIHRvIGJpbmRlcgotCSAqIHZvaWQgKjogY29va2llIGZvciBiaW5kZXIKLQkgKi8KLQotCUJSX0FUVEVNUFRfQUNRVUlSRSA9IF9JT1IoJ3InLCAxMSwgc3RydWN0IGJpbmRlcl9wcmlfcHRyX2Nvb2tpZSksCi0JLyoKLQkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAotCSAqIGludDoJcHJpb3JpdHkKLQkgKiB2b2lkICo6IHB0ciB0byBiaW5kZXIKLQkgKiB2b2lkICo6IGNvb2tpZSBmb3IgYmluZGVyCi0JICovCi0KLQlCUl9OT09QID0gX0lPKCdyJywgMTIpLAotCS8qCi0JICogTm8gcGFyYW1ldGVycy4gIERvIG5vdGhpbmcgYW5kIGV4YW1pbmUgdGhlIG5leHQgY29tbWFuZC4gIEl0IGV4aXN0cwotCSAqIHByaW1hcmlseSBzbyB0aGF0IHdlIGNhbiByZXBsYWNlIGl0IHdpdGggYSBCUl9TUEFXTl9MT09QRVIgY29tbWFuZC4KLQkgKi8KLQotCUJSX1NQQVdOX0xPT1BFUiA9IF9JTygncicsIDEzKSwKLQkvKgotCSAqIE5vIHBhcmFtZXRlcnMuICBUaGUgZHJpdmVyIGhhcyBkZXRlcm1pbmVkIHRoYXQgYSBwcm9jZXNzIGhhcyBubwotCSAqIHRocmVhZHMgd2FpdGluZyB0byBzZXJ2aWNlIGluY29taW5nIHRyYW5zYWN0aW9ucy4gIFdoZW4gYSBwcm9jZXNzCi0JICogcmVjZWl2ZXMgdGhpcyBjb21tYW5kLCBpdCBtdXN0IHNwYXduIGEgbmV3IHNlcnZpY2UgdGhyZWFkIGFuZAotCSAqIHJlZ2lzdGVyIGl0IHZpYSBiY0VOVEVSX0xPT1BFUi4KLQkgKi8KLQotCUJSX0ZJTklTSEVEID0gX0lPKCdyJywgMTQpLAotCS8qCi0JICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKLQkgKiBzdG9wIHRocmVhZHBvb2wgdGhyZWFkCi0JICovCi0KLQlCUl9ERUFEX0JJTkRFUiA9IF9JT1IoJ3InLCAxNSwgdm9pZCAqKSwKLQkvKgotCSAqIHZvaWQgKjogY29va2llCi0JICovCi0JQlJfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OX0RPTkUgPSBfSU9SKCdyJywgMTYsIHZvaWQgKiksCi0JLyoKLQkgKiB2b2lkICo6IGNvb2tpZQotCSAqLwotCi0JQlJfRkFJTEVEX1JFUExZID0gX0lPKCdyJywgMTcpLAotCS8qCi0JICogVGhlIHRoZSBsYXN0IHRyYW5zYWN0aW9uIChlaXRoZXIgYSBiY1RSQU5TQUNUSU9OIG9yCi0JICogYSBiY0FUVEVNUFRfQUNRVUlSRSkgZmFpbGVkIChlLmcuIG91dCBvZiBtZW1vcnkpLiAgTm8gcGFyYW1ldGVycy4KLQkgKi8KLX07Ci0KLWVudW0gYmluZGVyX2RyaXZlcl9jb21tYW5kX3Byb3RvY29sIHsKLQlCQ19UUkFOU0FDVElPTiA9IF9JT1coJ2MnLCAwLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEpLAotCUJDX1JFUExZID0gX0lPVygnYycsIDEsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCi0JLyoKLQkgKiBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YTogdGhlIHNlbnQgY29tbWFuZC4KLQkgKi8KLQotCUJDX0FDUVVJUkVfUkVTVUxUID0gX0lPVygnYycsIDIsIF9fczMyKSwKLQkvKgotCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCi0JICogaW50OiAgMCBpZiB0aGUgbGFzdCBCUl9BVFRFTVBUX0FDUVVJUkUgd2FzIG5vdCBzdWNjZXNzZnVsLgotCSAqIEVsc2UgeW91IGhhdmUgYWNxdWlyZWQgYSBwcmltYXJ5IHJlZmVyZW5jZSBvbiB0aGUgb2JqZWN0LgotCSAqLwotCi0JQkNfRlJFRV9CVUZGRVIgPSBfSU9XKCdjJywgMywgdm9pZCAqKSwKLQkvKgotCSAqIHZvaWQgKjogcHRyIHRvIHRyYW5zYWN0aW9uIGRhdGEgcmVjZWl2ZWQgb24gYSByZWFkCi0JICovCi0KLQlCQ19JTkNSRUZTID0gX0lPVygnYycsIDQsIF9fdTMyKSwKLQlCQ19BQ1FVSVJFID0gX0lPVygnYycsIDUsIF9fdTMyKSwKLQlCQ19SRUxFQVNFID0gX0lPVygnYycsIDYsIF9fdTMyKSwKLQlCQ19ERUNSRUZTID0gX0lPVygnYycsIDcsIF9fdTMyKSwKLQkvKgotCSAqIGludDoJZGVzY3JpcHRvcgotCSAqLwotCi0JQkNfSU5DUkVGU19ET05FID0gX0lPVygnYycsIDgsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCi0JQkNfQUNRVUlSRV9ET05FID0gX0lPVygnYycsIDksIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCi0JLyoKLQkgKiB2b2lkICo6IHB0ciB0byBiaW5kZXIKLQkgKiB2b2lkICo6IGNvb2tpZSBmb3IgYmluZGVyCi0JICovCi0KLQlCQ19BVFRFTVBUX0FDUVVJUkUgPSBfSU9XKCdjJywgMTAsIHN0cnVjdCBiaW5kZXJfcHJpX2Rlc2MpLAotCS8qCi0JICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKLQkgKiBpbnQ6IHByaW9yaXR5Ci0JICogaW50OiBkZXNjcmlwdG9yCi0JICovCi0KLQlCQ19SRUdJU1RFUl9MT09QRVIgPSBfSU8oJ2MnLCAxMSksCi0JLyoKLQkgKiBObyBwYXJhbWV0ZXJzLgotCSAqIFJlZ2lzdGVyIGEgc3Bhd25lZCBsb29wZXIgdGhyZWFkIHdpdGggdGhlIGRldmljZS4KLQkgKi8KLQotCUJDX0VOVEVSX0xPT1BFUiA9IF9JTygnYycsIDEyKSwKLQlCQ19FWElUX0xPT1BFUiA9IF9JTygnYycsIDEzKSwKLQkvKgotCSAqIE5vIHBhcmFtZXRlcnMuCi0JICogVGhlc2UgdHdvIGNvbW1hbmRzIGFyZSBzZW50IGFzIGFuIGFwcGxpY2F0aW9uLWxldmVsIHRocmVhZAotCSAqIGVudGVycyBhbmQgZXhpdHMgdGhlIGJpbmRlciBsb29wLCByZXNwZWN0aXZlbHkuICBUaGV5IGFyZQotCSAqIHVzZWQgc28gdGhlIGJpbmRlciBjYW4gaGF2ZSBhbiBhY2N1cmF0ZSBjb3VudCBvZiB0aGUgbnVtYmVyCi0JICogb2YgbG9vcGluZyB0aHJlYWRzIGl0IGhhcyBhdmFpbGFibGUuCi0JICovCi0KLQlCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiA9IF9JT1coJ2MnLCAxNCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQkvKgotCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgotCSAqIHZvaWQgKjogY29va2llCi0JICovCi0KLQlCQ19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04gPSBfSU9XKCdjJywgMTUsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCi0JLyoKLQkgKiB2b2lkICo6IHB0ciB0byBiaW5kZXIKLQkgKiB2b2lkICo6IGNvb2tpZQotCSAqLwotCi0JQkNfREVBRF9CSU5ERVJfRE9ORSA9IF9JT1coJ2MnLCAxNiwgdm9pZCAqKSwKLQkvKgotCSAqIHZvaWQgKjogY29va2llCi0JICovCi19OworI2luY2x1ZGUgInVhcGkvYmluZGVyLmgiCiAKICNlbmRpZiAvKiBfTElOVVhfQklOREVSX0ggKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYmluZGVyX3RyYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXJfdHJhY2UuaAppbmRleCA4MmE1NjdjLi43ZjIwZjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXJfdHJhY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXJfdHJhY2UuaApAQCAtMTUyLDcgKzE1Miw3IEBACiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZChpbnQsIGRlYnVnX2lkKQogCQlfX2ZpZWxkKGludCwgbm9kZV9kZWJ1Z19pZCkKLQkJX19maWVsZCh2b2lkIF9fdXNlciAqLCBub2RlX3B0cikKKwkJX19maWVsZChiaW5kZXJfdWludHB0cl90LCBub2RlX3B0cikKIAkJX19maWVsZChpbnQsIHJlZl9kZWJ1Z19pZCkKIAkJX19maWVsZCh1aW50MzJfdCwgcmVmX2Rlc2MpCiAJKSwKQEAgLTE2Myw4ICsxNjMsOSBAQAogCQlfX2VudHJ5LT5yZWZfZGVidWdfaWQgPSByZWYtPmRlYnVnX2lkOwogCQlfX2VudHJ5LT5yZWZfZGVzYyA9IHJlZi0+ZGVzYzsKIAkpLAotCVRQX3ByaW50aygidHJhbnNhY3Rpb249JWQgbm9kZT0lZCBzcmNfcHRyPTB4JXAgPT0+IGRlc3RfcmVmPSVkIGRlc3RfZGVzYz0lZCIsCi0JCSAgX19lbnRyeS0+ZGVidWdfaWQsIF9fZW50cnktPm5vZGVfZGVidWdfaWQsIF9fZW50cnktPm5vZGVfcHRyLAorCVRQX3ByaW50aygidHJhbnNhY3Rpb249JWQgbm9kZT0lZCBzcmNfcHRyPTB4JTAxNmxseCA9PT4gZGVzdF9yZWY9JWQgZGVzdF9kZXNjPSVkIiwKKwkJICBfX2VudHJ5LT5kZWJ1Z19pZCwgX19lbnRyeS0+bm9kZV9kZWJ1Z19pZCwKKwkJICAodTY0KV9fZW50cnktPm5vZGVfcHRyLAogCQkgIF9fZW50cnktPnJlZl9kZWJ1Z19pZCwgX19lbnRyeS0+cmVmX2Rlc2MpCiApOwogCkBAIC0xNzcsNyArMTc4LDcgQEAKIAkJX19maWVsZChpbnQsIHJlZl9kZWJ1Z19pZCkKIAkJX19maWVsZCh1aW50MzJfdCwgcmVmX2Rlc2MpCiAJCV9fZmllbGQoaW50LCBub2RlX2RlYnVnX2lkKQotCQlfX2ZpZWxkKHZvaWQgX191c2VyICosIG5vZGVfcHRyKQorCQlfX2ZpZWxkKGJpbmRlcl91aW50cHRyX3QsIG5vZGVfcHRyKQogCSksCiAJVFBfZmFzdF9hc3NpZ24oCiAJCV9fZW50cnktPmRlYnVnX2lkID0gdC0+ZGVidWdfaWQ7CkBAIC0xODYsOSArMTg3LDEwIEBACiAJCV9fZW50cnktPm5vZGVfZGVidWdfaWQgPSByZWYtPm5vZGUtPmRlYnVnX2lkOwogCQlfX2VudHJ5LT5ub2RlX3B0ciA9IHJlZi0+bm9kZS0+cHRyOwogCSksCi0JVFBfcHJpbnRrKCJ0cmFuc2FjdGlvbj0lZCBub2RlPSVkIHNyY19yZWY9JWQgc3JjX2Rlc2M9JWQgPT0+IGRlc3RfcHRyPTB4JXAiLAorCVRQX3ByaW50aygidHJhbnNhY3Rpb249JWQgbm9kZT0lZCBzcmNfcmVmPSVkIHNyY19kZXNjPSVkID09PiBkZXN0X3B0cj0weCUwMTZsbHgiLAogCQkgIF9fZW50cnktPmRlYnVnX2lkLCBfX2VudHJ5LT5ub2RlX2RlYnVnX2lkLAotCQkgIF9fZW50cnktPnJlZl9kZWJ1Z19pZCwgX19lbnRyeS0+cmVmX2Rlc2MsIF9fZW50cnktPm5vZGVfcHRyKQorCQkgIF9fZW50cnktPnJlZl9kZWJ1Z19pZCwgX19lbnRyeS0+cmVmX2Rlc2MsCisJCSAgKHU2NClfX2VudHJ5LT5ub2RlX3B0cikKICk7CiAKIFRSQUNFX0VWRU5UKGJpbmRlcl90cmFuc2FjdGlvbl9yZWZfdG9fcmVmLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbi5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbi5jCmluZGV4IDU3NDA2NmYuLjNkNWJmMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uLmMKQEAgLTE2LDYgKzE2LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpAQCAtNTUsMTAgKzU2LDEyIEBACiAJc3RydWN0IG11dGV4IGJ1ZmZlcl9sb2NrOwogCXN0cnVjdCByd19zZW1hcGhvcmUgbG9jazsKIAlzdHJ1Y3QgcGxpc3RfaGVhZCBoZWFwczsKLQlsb25nICgqY3VzdG9tX2lvY3RsKSAoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKKwlsb25nICgqY3VzdG9tX2lvY3RsKShzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGFyZyk7CiAJc3RydWN0IHJiX3Jvb3QgY2xpZW50czsKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19yb290OworCXN0cnVjdCBkZW50cnkgKmhlYXBzX2RlYnVnX3Jvb3Q7CisJc3RydWN0IGRlbnRyeSAqY2xpZW50c19kZWJ1Z19yb290OwogfTsKIAogLyoqCkBAIC02OSw2ICs3Miw4IEBACiAgKiBAaWRyOgkJYW4gaWRyIHNwYWNlIGZvciBhbGxvY2F0aW5nIGhhbmRsZSBpZHMKICAqIEBsb2NrOgkJbG9jayBwcm90ZWN0aW5nIHRoZSB0cmVlIG9mIGhhbmRsZXMKICAqIEBuYW1lOgkJdXNlZCBmb3IgZGVidWdnaW5nCisgKiBAZGlzcGxheV9uYW1lOgl1c2VkIGZvciBkZWJ1Z2dpbmcgKHVuaXF1ZSB2ZXJzaW9uIG9mIEBuYW1lKQorICogQGRpc3BsYXlfc2VyaWFsOgl1c2VkIGZvciBkZWJ1Z2dpbmcgKHRvIG1ha2UgZGlzcGxheV9uYW1lIHVuaXF1ZSkKICAqIEB0YXNrOgkJdXNlZCBmb3IgZGVidWdnaW5nCiAgKgogICogQSBjbGllbnQgcmVwcmVzZW50cyBhIGxpc3Qgb2YgYnVmZmVycyB0aGlzIGNsaWVudCBtYXkgYWNjZXNzLgpAQCAtODIsNiArODcsOCBAQAogCXN0cnVjdCBpZHIgaWRyOwogCXN0cnVjdCBtdXRleCBsb2NrOwogCWNvbnN0IGNoYXIgKm5hbWU7CisJY2hhciAqZGlzcGxheV9uYW1lOworCWludCBkaXNwbGF5X3NlcmlhbDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiAJcGlkX3QgcGlkOwogCXN0cnVjdCBkZW50cnkgKmRlYnVnX3Jvb3Q7CkBAIC0yMDgsNyArMjE1LDcgQEAKIAlpZiAoSVNfRVJSKHRhYmxlKSkgewogCQloZWFwLT5vcHMtPmZyZWUoYnVmZmVyKTsKIAkJa2ZyZWUoYnVmZmVyKTsKLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUih0YWJsZSkpOworCQlyZXR1cm4gRVJSX0NBU1QodGFibGUpOwogCX0KIAlidWZmZXItPnNnX3RhYmxlID0gdGFibGU7CiAJaWYgKGlvbl9idWZmZXJfZmF1bHRfdXNlcl9tYXBwaW5ncyhidWZmZXIpKSB7CkBAIC00MjksNyArNDM2LDcgQEAKIAkJCQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKQogewogCVdBUk5fT04oIW11dGV4X2lzX2xvY2tlZCgmY2xpZW50LT5sb2NrKSk7Ci0JcmV0dXJuIChpZHJfZmluZCgmY2xpZW50LT5pZHIsIGhhbmRsZS0+aWQpID09IGhhbmRsZSk7CisJcmV0dXJuIGlkcl9maW5kKCZjbGllbnQtPmlkciwgaGFuZGxlLT5pZCkgPT0gaGFuZGxlOwogfQogCiBzdGF0aWMgaW50IGlvbl9oYW5kbGVfYWRkKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIHN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUpCkBAIC01MDEsNyArNTA4LDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CiAKIAlpZiAoSVNfRVJSKGJ1ZmZlcikpCi0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoYnVmZmVyKSk7CisJCXJldHVybiBFUlJfQ0FTVChidWZmZXIpOwogCiAJaGFuZGxlID0gaW9uX2hhbmRsZV9jcmVhdGUoY2xpZW50LCBidWZmZXIpOwogCkBAIC03MDgsNiArNzE1LDIxIEBACiAJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKK3N0YXRpYyBpbnQgaW9uX2dldF9jbGllbnRfc2VyaWFsKGNvbnN0IHN0cnVjdCByYl9yb290ICpyb290LAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lKQoreworCWludCBzZXJpYWwgPSAtMTsKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKKwlmb3IgKG5vZGUgPSByYl9maXJzdChyb290KTsgbm9kZTsgbm9kZSA9IHJiX25leHQobm9kZSkpIHsKKwkJc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBpb25fY2xpZW50LAorCQkJCQkJbm9kZSk7CisJCWlmIChzdHJjbXAoY2xpZW50LT5uYW1lLCBuYW1lKSkKKwkJCWNvbnRpbnVlOworCQlzZXJpYWwgPSBtYXgoc2VyaWFsLCBjbGllbnQtPmRpc3BsYXlfc2VyaWFsKTsKKwl9CisJcmV0dXJuIHNlcmlhbCArIDE7Cit9CisKIHN0cnVjdCBpb25fY2xpZW50ICppb25fY2xpZW50X2NyZWF0ZShzdHJ1Y3QgaW9uX2RldmljZSAqZGV2LAogCQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSkKIHsKQEAgLTcxNiw5ICs3MzgsMTMgQEAKIAlzdHJ1Y3QgcmJfbm9kZSAqKnA7CiAJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CiAJc3RydWN0IGlvbl9jbGllbnQgKmVudHJ5OwotCWNoYXIgZGVidWdfbmFtZVs2NF07CiAJcGlkX3QgcGlkOwogCisJaWYgKCFuYW1lKSB7CisJCXByX2VycigiJXM6IE5hbWUgY2Fubm90IGJlIG51bGxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCiAJZ2V0X3Rhc2tfc3RydWN0KGN1cnJlbnQtPmdyb3VwX2xlYWRlcik7CiAJdGFza19sb2NrKGN1cnJlbnQtPmdyb3VwX2xlYWRlcik7CiAJcGlkID0gdGFza19waWRfbnIoY3VycmVudC0+Z3JvdXBfbGVhZGVyKTsKQEAgLTczMywyMSArNzU5LDI3IEBACiAJdGFza191bmxvY2soY3VycmVudC0+Z3JvdXBfbGVhZGVyKTsKIAogCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpb25fY2xpZW50KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjbGllbnQpIHsKLQkJaWYgKHRhc2spCi0JCQlwdXRfdGFza19zdHJ1Y3QoY3VycmVudC0+Z3JvdXBfbGVhZGVyKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JfQorCWlmICghY2xpZW50KQorCQlnb3RvIGVycl9wdXRfdGFza19zdHJ1Y3Q7CiAKIAljbGllbnQtPmRldiA9IGRldjsKIAljbGllbnQtPmhhbmRsZXMgPSBSQl9ST09UOwogCWlkcl9pbml0KCZjbGllbnQtPmlkcik7CiAJbXV0ZXhfaW5pdCgmY2xpZW50LT5sb2NrKTsKLQljbGllbnQtPm5hbWUgPSBuYW1lOwogCWNsaWVudC0+dGFzayA9IHRhc2s7CiAJY2xpZW50LT5waWQgPSBwaWQ7CisJY2xpZW50LT5uYW1lID0ga3N0cmR1cChuYW1lLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNsaWVudC0+bmFtZSkKKwkJZ290byBlcnJfZnJlZV9jbGllbnQ7CiAKIAlkb3duX3dyaXRlKCZkZXYtPmxvY2spOworCWNsaWVudC0+ZGlzcGxheV9zZXJpYWwgPSBpb25fZ2V0X2NsaWVudF9zZXJpYWwoJmRldi0+Y2xpZW50cywgbmFtZSk7CisJY2xpZW50LT5kaXNwbGF5X25hbWUgPSBrYXNwcmludGYoCisJCUdGUF9LRVJORUwsICIlcy0lZCIsIG5hbWUsIGNsaWVudC0+ZGlzcGxheV9zZXJpYWwpOworCWlmICghY2xpZW50LT5kaXNwbGF5X25hbWUpIHsKKwkJdXBfd3JpdGUoJmRldi0+bG9jayk7CisJCWdvdG8gZXJyX2ZyZWVfY2xpZW50X25hbWU7CisJfQogCXAgPSAmZGV2LT5jbGllbnRzLnJiX25vZGU7CiAJd2hpbGUgKCpwKSB7CiAJCXBhcmVudCA9ICpwOwpAQCAtNzYxLDEzICs3OTMsMjggQEAKIAlyYl9saW5rX25vZGUoJmNsaWVudC0+bm9kZSwgcGFyZW50LCBwKTsKIAlyYl9pbnNlcnRfY29sb3IoJmNsaWVudC0+bm9kZSwgJmRldi0+Y2xpZW50cyk7CiAKLQlzbnByaW50ZihkZWJ1Z19uYW1lLCA2NCwgIiV1IiwgY2xpZW50LT5waWQpOwotCWNsaWVudC0+ZGVidWdfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZGVidWdfbmFtZSwgMDY2NCwKLQkJCQkJCSBkZXYtPmRlYnVnX3Jvb3QsIGNsaWVudCwKLQkJCQkJCSAmZGVidWdfY2xpZW50X2ZvcHMpOworCWNsaWVudC0+ZGVidWdfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoY2xpZW50LT5kaXNwbGF5X25hbWUsIDA2NjQsCisJCQkJCQlkZXYtPmNsaWVudHNfZGVidWdfcm9vdCwKKwkJCQkJCWNsaWVudCwgJmRlYnVnX2NsaWVudF9mb3BzKTsKKwlpZiAoIWNsaWVudC0+ZGVidWdfcm9vdCkgeworCQljaGFyIGJ1ZlsyNTZdLCAqcGF0aDsKKwkJcGF0aCA9IGRlbnRyeV9wYXRoKGRldi0+Y2xpZW50c19kZWJ1Z19yb290LCBidWYsIDI1Nik7CisJCXByX2VycigiRmFpbGVkIHRvIGNyZWF0ZSBjbGllbnQgZGVidWdmcyBhdCAlcy8lc1xuIiwKKwkJCXBhdGgsIGNsaWVudC0+ZGlzcGxheV9uYW1lKTsKKwl9CisKIAl1cF93cml0ZSgmZGV2LT5sb2NrKTsKIAogCXJldHVybiBjbGllbnQ7CisKK2Vycl9mcmVlX2NsaWVudF9uYW1lOgorCWtmcmVlKGNsaWVudC0+bmFtZSk7CitlcnJfZnJlZV9jbGllbnQ6CisJa2ZyZWUoY2xpZW50KTsKK2Vycl9wdXRfdGFza19zdHJ1Y3Q6CisJaWYgKHRhc2spCisJCXB1dF90YXNrX3N0cnVjdChjdXJyZW50LT5ncm91cF9sZWFkZXIpOworCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogfQogRVhQT1JUX1NZTUJPTChpb25fY2xpZW50X2NyZWF0ZSk7CiAKQEAgLTc5Miw2ICs4MzksOCBAQAogCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShjbGllbnQtPmRlYnVnX3Jvb3QpOwogCXVwX3dyaXRlKCZkZXYtPmxvY2spOwogCisJa2ZyZWUoY2xpZW50LT5kaXNwbGF5X25hbWUpOworCWtmcmVlKGNsaWVudC0+bmFtZSk7CiAJa2ZyZWUoY2xpZW50KTsKIH0KIEVYUE9SVF9TWU1CT0woaW9uX2NsaWVudF9kZXN0cm95KTsKQEAgLTk1NCw4ICsxMDAzLDggQEAKIAlpbnQgcmV0ID0gMDsKIAogCWlmICghYnVmZmVyLT5oZWFwLT5vcHMtPm1hcF91c2VyKSB7Ci0JCXByX2VycigiJXM6IHRoaXMgaGVhcCBkb2VzIG5vdCBkZWZpbmUgYSBtZXRob2QgZm9yIG1hcHBpbmcgIgotCQkgICAgICAgInRvIHVzZXJzcGFjZVxuIiwgX19mdW5jX18pOworCQlwcl9lcnIoIiVzOiB0aGlzIGhlYXAgZG9lcyBub3QgZGVmaW5lIGEgbWV0aG9kIGZvciBtYXBwaW5nIHRvIHVzZXJzcGFjZVxuIiwKKwkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMDE3LDkgKzEwNjYsNyBAQAogCW11dGV4X2xvY2soJmJ1ZmZlci0+bG9jayk7CiAJdmFkZHIgPSBpb25fYnVmZmVyX2ttYXBfZ2V0KGJ1ZmZlcik7CiAJbXV0ZXhfdW5sb2NrKCZidWZmZXItPmxvY2spOwotCWlmIChJU19FUlIodmFkZHIpKQotCQlyZXR1cm4gUFRSX0VSUih2YWRkcik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyh2YWRkcik7CiB9CiAKIHN0YXRpYyB2b2lkIGlvbl9kbWFfYnVmX2VuZF9jcHVfYWNjZXNzKHN0cnVjdCBkbWFfYnVmICpkbWFidWYsIHNpemVfdCBzdGFydCwKQEAgLTExMDAsNyArMTE0Nyw3IEBACiAKIAlkbWFidWYgPSBkbWFfYnVmX2dldChmZCk7CiAJaWYgKElTX0VSUihkbWFidWYpKQotCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGRtYWJ1ZikpOworCQlyZXR1cm4gRVJSX0NBU1QoZG1hYnVmKTsKIAkvKiBpZiB0aGlzIG1lbW9yeSBjYW1lIGZyb20gaW9uICovCiAKIAlpZiAoZG1hYnVmLT5vcHMgIT0gJmRtYV9idWZfb3BzKSB7CkBAIC0xMjkzLDkgKzEzNDAsMTEgQEAKIAlzdHJ1Y3QgbWlzY2RldmljZSAqbWlzY2RldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaW9uX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG1pc2NkZXYsIHN0cnVjdCBpb25fZGV2aWNlLCBkZXYpOwogCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQ7CisJY2hhciBkZWJ1Z19uYW1lWzY0XTsKIAogCXByX2RlYnVnKCIlczogJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JY2xpZW50ID0gaW9uX2NsaWVudF9jcmVhdGUoZGV2LCAidXNlciIpOworCXNucHJpbnRmKGRlYnVnX25hbWUsIDY0LCAiJXUiLCB0YXNrX3BpZF9ucihjdXJyZW50LT5ncm91cF9sZWFkZXIpKTsKKwljbGllbnQgPSBpb25fY2xpZW50X2NyZWF0ZShkZXYsIGRlYnVnX25hbWUpOwogCWlmIChJU19FUlIoY2xpZW50KSkKIAkJcmV0dXJuIFBUUl9FUlIoY2xpZW50KTsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBjbGllbnQ7CkBAIC0xMzM4LDcgKzEzODcsNyBAQAogCXNpemVfdCB0b3RhbF9vcnBoYW5lZF9zaXplID0gMDsKIAogCXNlcV9wcmludGYocywgIiUxNi5zICUxNi5zICUxNi5zXG4iLCAiY2xpZW50IiwgInBpZCIsICJzaXplIik7Ci0Jc2VxX3ByaW50ZihzLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJc2VxX3B1dHMocywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCiAJZm9yIChuID0gcmJfZmlyc3QoJmRldi0+Y2xpZW50cyk7IG47IG4gPSByYl9uZXh0KG4pKSB7CiAJCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQgPSByYl9lbnRyeShuLCBzdHJ1Y3QgaW9uX2NsaWVudCwKQEAgLTEzNTcsOSArMTQwNiw4IEBACiAJCQkJICAgY2xpZW50LT5waWQsIHNpemUpOwogCQl9CiAJfQotCXNlcV9wcmludGYocywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCXNlcV9wcmludGYocywgIm9ycGhhbmVkIGFsbG9jYXRpb25zIChpbmZvIGlzIGZyb20gbGFzdCBrbm93biBjbGllbnQpOiIKLQkJICAgIlxuIik7CisJc2VxX3B1dHMocywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCXNlcV9wdXRzKHMsICJvcnBoYW5lZCBhbGxvY2F0aW9ucyAoaW5mbyBpcyBmcm9tIGxhc3Qga25vd24gY2xpZW50KTpcbiIpOwogCW11dGV4X2xvY2soJmRldi0+YnVmZmVyX2xvY2spOwogCWZvciAobiA9IHJiX2ZpcnN0KCZkZXYtPmJ1ZmZlcnMpOyBuOyBuID0gcmJfbmV4dChuKSkgewogCQlzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyID0gcmJfZW50cnkobiwgc3RydWN0IGlvbl9idWZmZXIsCkBAIC0xMzc2LDE0ICsxNDI0LDE0IEBACiAJCX0KIAl9CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmJ1ZmZlcl9sb2NrKTsKLQlzZXFfcHJpbnRmKHMsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlzZXFfcHV0cyhzLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAJc2VxX3ByaW50ZihzLCAiJTE2LnMgJTE2enVcbiIsICJ0b3RhbCBvcnBoYW5lZCIsCiAJCSAgIHRvdGFsX29ycGhhbmVkX3NpemUpOwogCXNlcV9wcmludGYocywgIiUxNi5zICUxNnp1XG4iLCAidG90YWwgIiwgdG90YWxfc2l6ZSk7CiAJaWYgKGhlYXAtPmZsYWdzICYgSU9OX0hFQVBfRkxBR19ERUZFUl9GUkVFKQogCQlzZXFfcHJpbnRmKHMsICIlMTYucyAlMTZ6dVxuIiwgImRlZmVycmVkIGZyZWUiLAogCQkJCWhlYXAtPmZyZWVfbGlzdF9zaXplKTsKLQlzZXFfcHJpbnRmKHMsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlzZXFfcHV0cyhzLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAKIAlpZiAoaGVhcC0+ZGVidWdfc2hvdykKIAkJaGVhcC0+ZGVidWdfc2hvdyhoZWFwLCBzLCB1bnVzZWQpOwpAQCAtMTQ0Myw2ICsxNDkxLDggQEAKIAogdm9pZCBpb25fZGV2aWNlX2FkZF9oZWFwKHN0cnVjdCBpb25fZGV2aWNlICpkZXYsIHN0cnVjdCBpb25faGVhcCAqaGVhcCkKIHsKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19maWxlOworCiAJaWYgKCFoZWFwLT5vcHMtPmFsbG9jYXRlIHx8ICFoZWFwLT5vcHMtPmZyZWUgfHwgIWhlYXAtPm9wcy0+bWFwX2RtYSB8fAogCSAgICAhaGVhcC0+b3BzLT51bm1hcF9kbWEpCiAJCXByX2VycigiJXM6IGNhbiBub3QgYWRkIGhlYXAgd2l0aCBpbnZhbGlkIG9wcyBzdHJ1Y3QuXG4iLApAQCAtMTQ1MSwyMSArMTUwMSw0MCBAQAogCWlmIChoZWFwLT5mbGFncyAmIElPTl9IRUFQX0ZMQUdfREVGRVJfRlJFRSkKIAkJaW9uX2hlYXBfaW5pdF9kZWZlcnJlZF9mcmVlKGhlYXApOwogCisJaWYgKChoZWFwLT5mbGFncyAmIElPTl9IRUFQX0ZMQUdfREVGRVJfRlJFRSkgfHwgaGVhcC0+b3BzLT5zaHJpbmspCisJCWlvbl9oZWFwX2luaXRfc2hyaW5rZXIoaGVhcCk7CisKIAloZWFwLT5kZXYgPSBkZXY7CiAJZG93bl93cml0ZSgmZGV2LT5sb2NrKTsKIAkvKiB1c2UgbmVnYXRpdmUgaGVhcC0+aWQgdG8gcmV2ZXJzZSB0aGUgcHJpb3JpdHkgLS0gd2hlbiB0cmF2ZXJzaW5nCiAJICAgdGhlIGxpc3QgbGF0ZXIgYXR0ZW1wdCBoaWdoZXIgaWQgbnVtYmVycyBmaXJzdCAqLwogCXBsaXN0X25vZGVfaW5pdCgmaGVhcC0+bm9kZSwgLWhlYXAtPmlkKTsKIAlwbGlzdF9hZGQoJmhlYXAtPm5vZGUsICZkZXYtPmhlYXBzKTsKLQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGhlYXAtPm5hbWUsIDA2NjQsIGRldi0+ZGVidWdfcm9vdCwgaGVhcCwKLQkJCSAgICAmZGVidWdfaGVhcF9mb3BzKTsKKwlkZWJ1Z19maWxlID0gZGVidWdmc19jcmVhdGVfZmlsZShoZWFwLT5uYW1lLCAwNjY0LAorCQkJCQlkZXYtPmhlYXBzX2RlYnVnX3Jvb3QsIGhlYXAsCisJCQkJCSZkZWJ1Z19oZWFwX2ZvcHMpOworCisJaWYgKCFkZWJ1Z19maWxlKSB7CisJCWNoYXIgYnVmWzI1Nl0sICpwYXRoOworCQlwYXRoID0gZGVudHJ5X3BhdGgoZGV2LT5oZWFwc19kZWJ1Z19yb290LCBidWYsIDI1Nik7CisJCXByX2VycigiRmFpbGVkIHRvIGNyZWF0ZSBoZWFwIGRlYnVnZnMgYXQgJXMvJXNcbiIsCisJCQlwYXRoLCBoZWFwLT5uYW1lKTsKKwl9CisKICNpZmRlZiBERUJVR19IRUFQX1NIUklOS0VSCiAJaWYgKGhlYXAtPnNocmlua2VyLnNocmluaykgewogCQljaGFyIGRlYnVnX25hbWVbNjRdOwogCiAJCXNucHJpbnRmKGRlYnVnX25hbWUsIDY0LCAiJXNfc2hyaW5rIiwgaGVhcC0+bmFtZSk7Ci0JCWRlYnVnZnNfY3JlYXRlX2ZpbGUoZGVidWdfbmFtZSwgMDY0NCwgZGV2LT5kZWJ1Z19yb290LCBoZWFwLAotCQkJCSAgICAmZGVidWdfc2hyaW5rX2ZvcHMpOworCQlkZWJ1Z19maWxlID0gZGVidWdmc19jcmVhdGVfZmlsZSgKKwkJCWRlYnVnX25hbWUsIDA2NDQsIGRldi0+aGVhcHNfZGVidWdfcm9vdCwgaGVhcCwKKwkJCSZkZWJ1Z19zaHJpbmtfZm9wcyk7CisJCWlmICghZGVidWdfZmlsZSkgeworCQkJY2hhciBidWZbMjU2XSwgKnBhdGg7CisJCQlwYXRoID0gZGVudHJ5X3BhdGgoZGV2LT5oZWFwc19kZWJ1Z19yb290LCBidWYsIDI1Nik7CisJCQlwcl9lcnIoIkZhaWxlZCB0byBjcmVhdGUgaGVhcCBzaHJpbmtlciBkZWJ1Z2ZzIGF0ICVzLyVzXG4iLAorCQkJCXBhdGgsIGRlYnVnX25hbWUpOworCQl9CiAJfQogI2VuZGlmCiAJdXBfd3JpdGUoJmRldi0+bG9jayk7CkBAIC0xNDk0LDggKzE1NjMsMjEgQEAKIAl9CiAKIAlpZGV2LT5kZWJ1Z19yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKCJpb24iLCBOVUxMKTsKLQlpZiAoIWlkZXYtPmRlYnVnX3Jvb3QpCi0JCXByX2VycigiaW9uOiBmYWlsZWQgdG8gY3JlYXRlIGRlYnVnIGZpbGVzLlxuIik7CisJaWYgKCFpZGV2LT5kZWJ1Z19yb290KSB7CisJCXByX2VycigiaW9uOiBmYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgcm9vdCBkaXJlY3RvcnkuXG4iKTsKKwkJZ290byBkZWJ1Z2ZzX2RvbmU7CisJfQorCWlkZXYtPmhlYXBzX2RlYnVnX3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImhlYXBzIiwgaWRldi0+ZGVidWdfcm9vdCk7CisJaWYgKCFpZGV2LT5oZWFwc19kZWJ1Z19yb290KSB7CisJCXByX2VycigiaW9uOiBmYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgaGVhcHMgZGlyZWN0b3J5LlxuIik7CisJCWdvdG8gZGVidWdmc19kb25lOworCX0KKwlpZGV2LT5jbGllbnRzX2RlYnVnX3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImNsaWVudHMiLAorCQkJCQkJaWRldi0+ZGVidWdfcm9vdCk7CisJaWYgKCFpZGV2LT5jbGllbnRzX2RlYnVnX3Jvb3QpCisJCXByX2VycigiaW9uOiBmYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgY2xpZW50cyBkaXJlY3RvcnkuXG4iKTsKKworZGVidWdmc19kb25lOgogCiAJaWRldi0+Y3VzdG9tX2lvY3RsID0gY3VzdG9tX2lvY3RsOwogCWlkZXYtPmJ1ZmZlcnMgPSBSQl9ST09UOwpAQCAtMTUwOSw2ICsxNTkxLDcgQEAKIHZvaWQgaW9uX2RldmljZV9kZXN0cm95KHN0cnVjdCBpb25fZGV2aWNlICpkZXYpCiB7CiAJbWlzY19kZXJlZ2lzdGVyKCZkZXYtPmRldik7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRldi0+ZGVidWdfcm9vdCk7CiAJLyogWFhYIG5lZWQgdG8gZnJlZSB0aGUgaGVhcHMgYW5kIGNsaWVudHMgPyAqLwogCWtmcmVlKGRldik7CiB9CkBAIC0xNTI3LDggKzE2MTAsNyBAQAogCQkJCQkJICAgIGRhdGEtPmhlYXBzW2ldLmFsaWduLAogCQkJCQkJICAgIE1FTUJMT0NLX0FMTE9DX0FOWVdIRVJFKTsKIAkJCWlmICghcGFkZHIpIHsKLQkJCQlwcl9lcnIoIiVzOiBlcnJvciBhbGxvY2F0aW5nIG1lbWJsb2NrIGZvciAiCi0JCQkJICAgICAgICJoZWFwICVkXG4iLAorCQkJCXByX2VycigiJXM6IGVycm9yIGFsbG9jYXRpbmcgbWVtYmxvY2sgZm9yIGhlYXAgJWRcbiIsCiAJCQkJCV9fZnVuY19fLCBpKTsKIAkJCQljb250aW51ZTsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fY21hX2hlYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fY21hX2hlYXAuYwppbmRleCBmMGY5ODg5Li5jZTY4ZWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2NtYV9oZWFwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9jbWFfaGVhcC5jCkBAIC0xMzUsNyArMTM1LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjbWFfaGVhcC0+ZGV2OwogCXN0cnVjdCBpb25fY21hX2J1ZmZlcl9pbmZvICppbmZvID0gYnVmZmVyLT5wcml2X3ZpcnQ7CiAKLQlkZXZfZGJnKGRldiwgIlJldHVybiBidWZmZXIgJXAgcGh5c2ljYWwgYWRkcmVzcyAweCVwYVxuIiwgYnVmZmVyLAorCWRldl9kYmcoZGV2LCAiUmV0dXJuIGJ1ZmZlciAlcCBwaHlzaWNhbCBhZGRyZXNzICVwYVxuIiwgYnVmZmVyLAogCQkmaW5mby0+aGFuZGxlKTsKIAogCSphZGRyID0gaW5mby0+aGFuZGxlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9kdW1teV9kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fZHVtbXlfZHJpdmVyLmMKaW5kZXggMDFjZGM4YS4uM2E0NWU3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9kdW1teV9kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2R1bW15X2RyaXZlci5jCkBAIC0yNSwxMyArMjUsMTMgQEAKICNpbmNsdWRlICJpb24uaCIKICNpbmNsdWRlICJpb25fcHJpdi5oIgogCi1zdHJ1Y3QgaW9uX2RldmljZSAqaWRldjsKLXN0cnVjdCBpb25faGVhcCAqKmhlYXBzOworc3RhdGljIHN0cnVjdCBpb25fZGV2aWNlICppZGV2Oworc3RhdGljIHN0cnVjdCBpb25faGVhcCAqKmhlYXBzOwogCi12b2lkICpjYXJ2ZW91dF9wdHI7Ci12b2lkICpjaHVua19wdHI7CitzdGF0aWMgdm9pZCAqY2FydmVvdXRfcHRyOworc3RhdGljIHZvaWQgKmNodW5rX3B0cjsKIAotc3RydWN0IGlvbl9wbGF0Zm9ybV9oZWFwIGR1bW15X2hlYXBzW10gPSB7CitzdGF0aWMgc3RydWN0IGlvbl9wbGF0Zm9ybV9oZWFwIGR1bW15X2hlYXBzW10gPSB7CiAJCXsKIAkJCS5pZAk9IElPTl9IRUFQX1RZUEVfU1lTVEVNLAogCQkJLnR5cGUJPSBJT05fSEVBUF9UWVBFX1NZU1RFTSwKQEAgLTU4LDcgKzU4LDcgQEAKIAkJfSwKIH07CiAKLXN0cnVjdCBpb25fcGxhdGZvcm1fZGF0YSBkdW1teV9pb25fcGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IGlvbl9wbGF0Zm9ybV9kYXRhIGR1bW15X2lvbl9wZGF0YSA9IHsKIAkubnIgPSBBUlJBWV9TSVpFKGR1bW15X2hlYXBzKSwKIAkuaGVhcHMgPSBkdW1teV9oZWFwcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2hlYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25faGVhcC5jCmluZGV4IDM3ZTY0ZDUuLmJkYzZhMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25faGVhcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25faGVhcC5jCkBAIC0xNzgsNyArMTc4LDggQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotc2l6ZV90IGlvbl9oZWFwX2ZyZWVsaXN0X2RyYWluKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc2l6ZV90IHNpemUpCitzdGF0aWMgc2l6ZV90IF9pb25faGVhcF9mcmVlbGlzdF9kcmFpbihzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsIHNpemVfdCBzaXplLAorCQkJCWJvb2wgc2tpcF9wb29scykKIHsKIAlzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyOwogCXNpemVfdCB0b3RhbF9kcmFpbmVkID0gMDsKQEAgLTE5Nyw2ICsxOTgsOCBAQAogCQkJCQkgIGxpc3QpOwogCQlsaXN0X2RlbCgmYnVmZmVyLT5saXN0KTsKIAkJaGVhcC0+ZnJlZV9saXN0X3NpemUgLT0gYnVmZmVyLT5zaXplOworCQlpZiAoc2tpcF9wb29scykKKwkJCWJ1ZmZlci0+cHJpdmF0ZV9mbGFncyB8PSBJT05fUFJJVl9GTEFHX1NIUklOS0VSX0ZSRUU7CiAJCXRvdGFsX2RyYWluZWQgKz0gYnVmZmVyLT5zaXplOwogCQlzcGluX3VubG9jaygmaGVhcC0+ZnJlZV9sb2NrKTsKIAkJaW9uX2J1ZmZlcl9kZXN0cm95KGJ1ZmZlcik7CkBAIC0yMDcsNiArMjEwLDE2IEBACiAJcmV0dXJuIHRvdGFsX2RyYWluZWQ7CiB9CiAKK3NpemVfdCBpb25faGVhcF9mcmVlbGlzdF9kcmFpbihzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsIHNpemVfdCBzaXplKQoreworCXJldHVybiBfaW9uX2hlYXBfZnJlZWxpc3RfZHJhaW4oaGVhcCwgc2l6ZSwgZmFsc2UpOworfQorCitzaXplX3QgaW9uX2hlYXBfZnJlZWxpc3Rfc2hyaW5rKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc2l6ZV90IHNpemUpCit7CisJcmV0dXJuIF9pb25faGVhcF9mcmVlbGlzdF9kcmFpbihoZWFwLCBzaXplLCB0cnVlKTsKK30KKwogc3RhdGljIGludCBpb25faGVhcF9kZWZlcnJlZF9mcmVlKHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGlvbl9oZWFwICpoZWFwID0gZGF0YTsKQEAgLTI0NiwxMiArMjU5LDYyIEBACiAJaWYgKElTX0VSUihoZWFwLT50YXNrKSkgewogCQlwcl9lcnIoIiVzOiBjcmVhdGluZyB0aHJlYWQgZm9yIGRlZmVycmVkIGZyZWUgZmFpbGVkXG4iLAogCQkgICAgICAgX19mdW5jX18pOwotCQlyZXR1cm4gUFRSX1JFVChoZWFwLT50YXNrKTsKKwkJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhoZWFwLT50YXNrKTsKIAl9CiAJc2NoZWRfc2V0c2NoZWR1bGVyKGhlYXAtPnRhc2ssIFNDSEVEX0lETEUsICZwYXJhbSk7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlvbl9oZWFwX3Nocmlua19jb3VudChzdHJ1Y3Qgc2hyaW5rZXIgKnNocmlua2VyLAorCQkJCQkJc3RydWN0IHNocmlua19jb250cm9sICpzYykKK3sKKwlzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAgPSBjb250YWluZXJfb2Yoc2hyaW5rZXIsIHN0cnVjdCBpb25faGVhcCwKKwkJCQkJICAgICBzaHJpbmtlcik7CisJaW50IHRvdGFsID0gMDsKKworCXRvdGFsID0gaW9uX2hlYXBfZnJlZWxpc3Rfc2l6ZShoZWFwKSAvIFBBR0VfU0laRTsKKwlpZiAoaGVhcC0+b3BzLT5zaHJpbmspCisJCXRvdGFsICs9IGhlYXAtPm9wcy0+c2hyaW5rKGhlYXAsIHNjLT5nZnBfbWFzaywgMCk7CisJcmV0dXJuIHRvdGFsOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpb25faGVhcF9zaHJpbmtfc2NhbihzdHJ1Y3Qgc2hyaW5rZXIgKnNocmlua2VyLAorCQkJCQkJc3RydWN0IHNocmlua19jb250cm9sICpzYykKK3sKKwlzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAgPSBjb250YWluZXJfb2Yoc2hyaW5rZXIsIHN0cnVjdCBpb25faGVhcCwKKwkJCQkJICAgICBzaHJpbmtlcik7CisJaW50IGZyZWVkID0gMDsKKwlpbnQgdG9fc2NhbiA9IHNjLT5ucl90b19zY2FuOworCisJaWYgKHRvX3NjYW4gPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIHNocmluayB0aGUgZnJlZSBsaXN0IGZpcnN0LCBubyBwb2ludCBpbiB6ZXJvaW5nIHRoZSBtZW1vcnkgaWYgd2UncmUKKwkgKiBqdXN0IGdvaW5nIHRvIHJlY2xhaW0gaXQuIEFsc28sIHNraXAgYW55IHBvc3NpYmxlIHBhZ2UgcG9vbGluZy4KKwkgKi8KKwlpZiAoaGVhcC0+ZmxhZ3MgJiBJT05fSEVBUF9GTEFHX0RFRkVSX0ZSRUUpCisJCWZyZWVkID0gaW9uX2hlYXBfZnJlZWxpc3Rfc2hyaW5rKGhlYXAsIHRvX3NjYW4gKiBQQUdFX1NJWkUpIC8KKwkJCQlQQUdFX1NJWkU7CisKKwl0b19zY2FuIC09IGZyZWVkOworCWlmICh0b19zY2FuIDw9IDApCisJCXJldHVybiBmcmVlZDsKKworCWlmIChoZWFwLT5vcHMtPnNocmluaykKKwkJZnJlZWQgKz0gaGVhcC0+b3BzLT5zaHJpbmsoaGVhcCwgc2MtPmdmcF9tYXNrLCB0b19zY2FuKTsKKwlyZXR1cm4gZnJlZWQ7Cit9CisKK3ZvaWQgaW9uX2hlYXBfaW5pdF9zaHJpbmtlcihzdHJ1Y3QgaW9uX2hlYXAgKmhlYXApCit7CisJaGVhcC0+c2hyaW5rZXIuY291bnRfb2JqZWN0cyA9IGlvbl9oZWFwX3Nocmlua19jb3VudDsKKwloZWFwLT5zaHJpbmtlci5zY2FuX29iamVjdHMgPSBpb25faGVhcF9zaHJpbmtfc2NhbjsKKwloZWFwLT5zaHJpbmtlci5zZWVrcyA9IERFRkFVTFRfU0VFS1M7CisJaGVhcC0+c2hyaW5rZXIuYmF0Y2ggPSAwOworCXJlZ2lzdGVyX3Nocmlua2VyKCZoZWFwLT5zaHJpbmtlcik7Cit9CisKIHN0cnVjdCBpb25faGVhcCAqaW9uX2hlYXBfY3JlYXRlKHN0cnVjdCBpb25fcGxhdGZvcm1faGVhcCAqaGVhcF9kYXRhKQogewogCXN0cnVjdCBpb25faGVhcCAqaGVhcCA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3BhZ2VfcG9vbC5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9wYWdlX3Bvb2wuYwppbmRleCBmYTY5M2MyLi5lY2I1ZmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3BhZ2VfcG9vbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fcGFnZV9wb29sLmMKQEAgLTEzMCw4ICsxMzAsNyBAQAogaW50IGlvbl9wYWdlX3Bvb2xfc2hyaW5rKHN0cnVjdCBpb25fcGFnZV9wb29sICpwb29sLCBnZnBfdCBnZnBfbWFzaywKIAkJCQlpbnQgbnJfdG9fc2NhbikKIHsKLQlpbnQgbnJfZnJlZWQgPSAwOwotCWludCBpOworCWludCBmcmVlZDsKIAlib29sIGhpZ2g7CiAKIAloaWdoID0gISEoZ2ZwX21hc2sgJiBfX0dGUF9ISUdITUVNKTsKQEAgLTEzOSw3ICsxMzgsNyBAQAogCWlmIChucl90b19zY2FuID09IDApCiAJCXJldHVybiBpb25fcGFnZV9wb29sX3RvdGFsKHBvb2wsIGhpZ2gpOwogCi0JZm9yIChpID0gMDsgaSA8IG5yX3RvX3NjYW47IGkrKykgeworCWZvciAoZnJlZWQgPSAwOyBmcmVlZCA8IG5yX3RvX3NjYW47IGZyZWVkKyspIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKIAkJbXV0ZXhfbG9jaygmcG9vbC0+bXV0ZXgpOwpAQCAtMTUzLDEwICsxNTIsOSBAQAogCQl9CiAJCW11dGV4X3VubG9jaygmcG9vbC0+bXV0ZXgpOwogCQlpb25fcGFnZV9wb29sX2ZyZWVfcGFnZXMocG9vbCwgcGFnZSk7Ci0JCW5yX2ZyZWVkICs9ICgxIDw8IHBvb2wtPm9yZGVyKTsKIAl9CiAKLQlyZXR1cm4gbnJfZnJlZWQ7CisJcmV0dXJuIGZyZWVkOwogfQogCiBzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqaW9uX3BhZ2VfcG9vbF9jcmVhdGUoZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fcHJpdi5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9wcml2LmgKaW5kZXggZmMyZTRmYy4uMWViYTNmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9wcml2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9wcml2LmgKQEAgLTM4LDYgKzM4LDcgQEAKICAqIEBkZXY6CQliYWNrIHBvaW50ZXIgdG8gdGhlIGlvbl9kZXZpY2UKICAqIEBoZWFwOgkJYmFjayBwb2ludGVyIHRvIHRoZSBoZWFwIHRoZSBidWZmZXIgY2FtZSBmcm9tCiAgKiBAZmxhZ3M6CQlidWZmZXIgc3BlY2lmaWMgZmxhZ3MKKyAqIEBwcml2YXRlX2ZsYWdzOglpbnRlcm5hbCBidWZmZXIgc3BlY2lmaWMgZmxhZ3MKICAqIEBzaXplOgkJc2l6ZSBvZiB0aGUgYnVmZmVyCiAgKiBAcHJpdl92aXJ0OgkJcHJpdmF0ZSBkYXRhIHRvIHRoZSBidWZmZXIgcmVwcmVzZW50YWJsZSBhcwogICoJCQlhIHZvaWQgKgpAQCAtNjYsNiArNjcsNyBAQAogCXN0cnVjdCBpb25fZGV2aWNlICpkZXY7CiAJc3RydWN0IGlvbl9oZWFwICpoZWFwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBwcml2YXRlX2ZsYWdzOwogCXNpemVfdCBzaXplOwogCXVuaW9uIHsKIAkJdm9pZCAqcHJpdl92aXJ0OwpAQCAtOTgsMjIgKzEwMCwyNyBAQAogICogQG1hcF91c2VyCQltYXAgbWVtb3J5IHRvIHVzZXJzcGFjZQogICoKICAqIGFsbG9jYXRlLCBwaHlzLCBhbmQgbWFwX3VzZXIgcmV0dXJuIDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGVycm9yLgotICogbWFwX2RtYSBhbmQgbWFwX2tlcm5lbCByZXR1cm4gcG9pbnRlciBvbiBzdWNjZXNzLCBFUlJfUFRSIG9uIGVycm9yLgorICogbWFwX2RtYSBhbmQgbWFwX2tlcm5lbCByZXR1cm4gcG9pbnRlciBvbiBzdWNjZXNzLCBFUlJfUFRSIG9uCisgKiBlcnJvci4gQGZyZWUgd2lsbCBiZSBjYWxsZWQgd2l0aCBJT05fUFJJVl9GTEFHX1NIUklOS0VSX0ZSRUUgc2V0IGluCisgKiB0aGUgYnVmZmVyJ3MgcHJpdmF0ZV9mbGFncyB3aGVuIGNhbGxlZCBmcm9tIGEgc2hyaW5rZXIuIEluIHRoYXQKKyAqIGNhc2UsIHRoZSBwYWdlcyBiZWluZyBmcmVlJ2QgbXVzdCBiZSB0cnVseSBmcmVlJ2QgYmFjayB0byB0aGUKKyAqIHN5c3RlbSwgbm90IHB1dCBpbiBhIHBhZ2UgcG9vbCBvciBvdGhlcndpc2UgY2FjaGVkLgogICovCiBzdHJ1Y3QgaW9uX2hlYXBfb3BzIHsKLQlpbnQgKCphbGxvY2F0ZSkgKHN0cnVjdCBpb25faGVhcCAqaGVhcCwKLQkJCSBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJCSB1bnNpZ25lZCBsb25nIGFsaWduLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLQl2b2lkICgqZnJlZSkgKHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpOwotCWludCAoKnBoeXMpIChzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIsCi0JCSAgICAgaW9uX3BoeXNfYWRkcl90ICphZGRyLCBzaXplX3QgKmxlbik7Ci0Jc3RydWN0IHNnX3RhYmxlICooKm1hcF9kbWEpIChzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCi0JCQkJCXN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpOwotCXZvaWQgKCp1bm1hcF9kbWEpIChzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpOwotCXZvaWQgKiAoKm1hcF9rZXJuZWwpIChzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpOwotCXZvaWQgKCp1bm1hcF9rZXJuZWwpIChzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpOwotCWludCAoKm1hcF91c2VyKSAoc3RydWN0IGlvbl9oZWFwICptYXBwZXIsIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIsCi0JCQkgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCWludCAoKmFsbG9jYXRlKShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCisJCQlzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCXVuc2lnbmVkIGxvbmcgYWxpZ24sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCXZvaWQgKCpmcmVlKShzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKTsKKwlpbnQgKCpwaHlzKShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIsCisJCSAgICBpb25fcGh5c19hZGRyX3QgKmFkZHIsIHNpemVfdCAqbGVuKTsKKwlzdHJ1Y3Qgc2dfdGFibGUgKiAoKm1hcF9kbWEpKHN0cnVjdCBpb25faGVhcCAqaGVhcCwKKwkJCQkgICAgIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpOworCXZvaWQgKCp1bm1hcF9kbWEpKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7CisJdm9pZCAqICgqbWFwX2tlcm5lbCkoc3RydWN0IGlvbl9oZWFwICpoZWFwLCBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKTsKKwl2b2lkICgqdW5tYXBfa2VybmVsKShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpOworCWludCAoKm1hcF91c2VyKShzdHJ1Y3QgaW9uX2hlYXAgKm1hcHBlciwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlciwKKwkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKwlpbnQgKCpzaHJpbmspKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgZ2ZwX3QgZ2ZwX21hc2ssIGludCBucl90b19zY2FuKTsKIH07CiAKIC8qKgpAQCAtMTIyLDYgKzEyOSwxNyBAQAogI2RlZmluZSBJT05fSEVBUF9GTEFHX0RFRkVSX0ZSRUUgKDEgPDwgMCkKIAogLyoqCisgKiBwcml2YXRlIGZsYWdzIC0gZmxhZ3MgaW50ZXJuYWwgdG8gaW9uCisgKi8KKy8qCisgKiBCdWZmZXIgaXMgYmVpbmcgZnJlZWQgZnJvbSBhIHNocmlua2VyIGZ1bmN0aW9uLiBTa2lwIGFueSBwb3NzaWJsZQorICogaGVhcC1zcGVjaWZpYyBjYWNoaW5nIG1lY2hhbmlzbSAoZS5nLiBwYWdlIHBvb2xzKS4gR3VhcmFudGVlcyB0aGF0CisgKiBhbnkgYnVmZmVyIHN0b3JhZ2UgdGhhdCBjYW1lIGZyb20gdGhlIHN5c3RlbSBhbGxvY2F0b3Igd2lsbCBiZQorICogcmV0dXJuZWQgdG8gdGhlIHN5c3RlbSBhbGxvY2F0b3IuCisgKi8KKyNkZWZpbmUgSU9OX1BSSVZfRkxBR19TSFJJTktFUl9GUkVFICgxIDw8IDApCisKKy8qKgogICogc3RydWN0IGlvbl9oZWFwIC0gcmVwcmVzZW50cyBhIGhlYXAgaW4gdGhlIHN5c3RlbQogICogQG5vZGU6CQlyYiBub2RlIHRvIHB1dCB0aGUgaGVhcCBvbiB0aGUgZGV2aWNlJ3MgdHJlZSBvZiBoZWFwcwogICogQGRldjoJCWJhY2sgcG9pbnRlciB0byB0aGUgaW9uX2RldmljZQpAQCAtMTMyLDEwICsxNTAsNyBAQAogICoJCQlhbGxvY2F0aW5nLiAgVGhlc2UgYXJlIHNwZWNpZmllZCBieSBwbGF0Zm9ybSBkYXRhIGFuZAogICoJCQlNVVNUIGJlIHVuaXF1ZQogICogQG5hbWU6CQl1c2VkIGZvciBkZWJ1Z2dpbmcKLSAqIEBzaHJpbmtlcjoJCWEgc2hyaW5rZXIgZm9yIHRoZSBoZWFwLCBpZiB0aGUgaGVhcCBjYWNoZXMgc3lzdGVtCi0gKgkJCW1lbW9yeSwgaXQgbXVzdCBkZWZpbmUgYSBzaHJpbmtlciB0byByZXR1cm4gaXQgb24gbG93Ci0gKgkJCW1lbW9yeSBjb25kaXRpb25zLCB0aGlzIGluY2x1ZGVzIHN5c3RlbSBtZW1vcnkgY2FjaGVkCi0gKgkJCWluIHRoZSBkZWZlcnJlZCBmcmVlIGxpc3RzIGZvciBoZWFwcyB0aGF0IHN1cHBvcnQgaXQKKyAqIEBzaHJpbmtlcjoJCWEgc2hyaW5rZXIgZm9yIHRoZSBoZWFwCiAgKiBAZnJlZV9saXN0OgkJZnJlZSBsaXN0IGhlYWQgaWYgZGVmZXJyZWQgZnJlZSBpcyB1c2VkCiAgKiBAZnJlZV9saXN0X3NpemUJc2l6ZSBvZiB0aGUgZGVmZXJyZWQgZnJlZSBsaXN0IGluIGJ5dGVzCiAgKiBAbG9jazoJCXByb3RlY3RzIHRoZSBmcmVlIGxpc3QKQEAgLTIxOSw2ICsyMzQsMTYgQEAKIGludCBpb25faGVhcF9wYWdlc196ZXJvKHN0cnVjdCBwYWdlICpwYWdlLCBzaXplX3Qgc2l6ZSwgcGdwcm90X3QgcGdwcm90KTsKIAogLyoqCisgKiBpb25faGVhcF9pbml0X3Nocmlua2VyCisgKiBAaGVhcDoJCXRoZSBoZWFwCisgKgorICogSWYgYSBoZWFwIHNldHMgdGhlIElPTl9IRUFQX0ZMQUdfREVGRVJfRlJFRSBmbGFnIG9yIGRlZmluZXMgdGhlIHNocmluayBvcAorICogdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB0byBzZXR1cCBhIHNocmlua2VyIHRvIHNocmluayB0aGUgZnJlZWxpc3RzCisgKiBhbmQgY2FsbCB0aGUgaGVhcCdzIHNocmluayBvcC4KKyAqLwordm9pZCBpb25faGVhcF9pbml0X3Nocmlua2VyKHN0cnVjdCBpb25faGVhcCAqaGVhcCk7CisKKy8qKgogICogaW9uX2hlYXBfaW5pdF9kZWZlcnJlZF9mcmVlIC0tIGluaXRpYWxpemUgZGVmZXJyZWQgZnJlZSBmdW5jdGlvbmFsaXR5CiAgKiBAaGVhcDoJCXRoZSBoZWFwCiAgKgpAQCAtMjUwLDYgKzI3NSwyOSBAQAogc2l6ZV90IGlvbl9oZWFwX2ZyZWVsaXN0X2RyYWluKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc2l6ZV90IHNpemUpOwogCiAvKioKKyAqIGlvbl9oZWFwX2ZyZWVsaXN0X3NocmluayAtIGRyYWluIHRoZSBkZWZlcnJlZCBmcmVlCisgKgkJCQlsaXN0LCBza2lwcGluZyBhbnkgaGVhcC1zcGVjaWZpYworICoJCQkJcG9vbGluZyBvciBjYWNoaW5nIG1lY2hhbmlzbXMKKyAqCisgKiBAaGVhcDoJCXRoZSBoZWFwCisgKiBAc2l6ZToJCWFtb3VudCBvZiBtZW1vcnkgdG8gZHJhaW4gaW4gYnl0ZXMKKyAqCisgKiBEcmFpbnMgdGhlIGluZGljYXRlZCBhbW91bnQgb2YgbWVtb3J5IGZyb20gdGhlIGRlZmVycmVkIGZyZWVsaXN0IGltbWVkaWF0ZWx5LgorICogUmV0dXJucyB0aGUgdG90YWwgYW1vdW50IGZyZWVkLiAgVGhlIHRvdGFsIGZyZWVkIG1heSBiZSBoaWdoZXIgZGVwZW5kaW5nCisgKiBvbiB0aGUgc2l6ZSBvZiB0aGUgaXRlbXMgaW4gdGhlIGxpc3QsIG9yIGxvd2VyIGlmIHRoZXJlIGlzIGluc3VmZmljaWVudAorICogdG90YWwgbWVtb3J5IG9uIHRoZSBmcmVlbGlzdC4KKyAqCisgKiBVbmxpa2Ugd2l0aCBAaW9uX2hlYXBfZnJlZWxpc3RfZHJhaW4sIGRvbid0IHB1dCBhbnkgcGFnZXMgYmFjayBpbnRvCisgKiBwYWdlIHBvb2xzIG9yIG90aGVyd2lzZSBjYWNoZSB0aGUgcGFnZXMuIEV2ZXJ5dGhpbmcgbXVzdCBiZQorICogZ2VudWluZWx5IGZyZWUnZCBiYWNrIHRvIHRoZSBzeXN0ZW0uIElmIHlvdSdyZSBmcmVlJ2luZyBmcm9tIGEKKyAqIHNocmlua2VyIHlvdSBwcm9iYWJseSB3YW50IHRvIHVzZSB0aGlzLiBOb3RlIHRoYXQgdGhpcyByZWxpZXMgb24KKyAqIHRoZSBoZWFwLm9wcy5mcmVlIGNhbGxiYWNrIGhvbm9yaW5nIHRoZSBJT05fUFJJVl9GTEFHX1NIUklOS0VSX0ZSRUUKKyAqIGZsYWcuCisgKi8KK3NpemVfdCBpb25faGVhcF9mcmVlbGlzdF9zaHJpbmsoc3RydWN0IGlvbl9oZWFwICpoZWFwLAorCQkJCQlzaXplX3Qgc2l6ZSk7CisKKy8qKgogICogaW9uX2hlYXBfZnJlZWxpc3Rfc2l6ZSAtIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGZyZWVsaXN0IGluIGJ5dGVzCiAgKiBAaGVhcDoJCXRoZSBoZWFwCiAgKi8KQEAgLTMwNSwxMyArMzUzLDggQEAKICAqIEBsb3dfY291bnQ6CQludW1iZXIgb2YgbG93bWVtIGl0ZW1zIGluIHRoZSBwb29sCiAgKiBAaGlnaF9pdGVtczoJCWxpc3Qgb2YgaGlnaG1lbSBpdGVtcwogICogQGxvd19pdGVtczoJCWxpc3Qgb2YgbG93bWVtIGl0ZW1zCi0gKiBAc2hyaW5rZXI6CQlhIHNocmlua2VyIGZvciB0aGUgaXRlbXMKICAqIEBtdXRleDoJCWxvY2sgcHJvdGVjdGluZyB0aGlzIHN0cnVjdCBhbmQgZXNwZWNpYWxseSB0aGUgY291bnQKICAqCQkJaXRlbSBsaXN0Ci0gKiBAYWxsb2M6CQlmdW5jdGlvbiB0byBiZSB1c2VkIHRvIGFsbG9jYXRlIHBhZ2Vvcnkgd2hlbiB0aGUgcG9vbAotICoJCQlpcyBlbXB0eQotICogQGZyZWU6CQlmdW5jdGlvbiB0byBiZSB1c2VkIHRvIGZyZWUgcGFnZW9yeSBiYWNrIHRvIHRoZSBzeXN0ZW0KLSAqCQkJd2hlbiB0aGUgc2hyaW5rZXIgZmlyZXMKICAqIEBnZnBfbWFzazoJCWdmcF9tYXNrIHRvIHVzZSBmcm9tIGFsbG9jCiAgKiBAb3JkZXI6CQlvcmRlciBvZiBwYWdlcyBpbiB0aGUgcG9vbAogICogQGxpc3Q6CQlwbGlzdCBub2RlIGZvciBsaXN0IG9mIHBvb2xzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3N5c3RlbV9oZWFwLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3N5c3RlbV9oZWFwLmMKaW5kZXggOTg0OWYzOS4uYzkyMzYzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9zeXN0ZW1faGVhcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fc3lzdGVtX2hlYXAuYwpAQCAtOTAsNyArOTAsNyBAQAogewogCWJvb2wgY2FjaGVkID0gaW9uX2J1ZmZlcl9jYWNoZWQoYnVmZmVyKTsKIAotCWlmICghY2FjaGVkKSB7CisJaWYgKCFjYWNoZWQgJiYgIShidWZmZXItPnByaXZhdGVfZmxhZ3MgJiBJT05fUFJJVl9GTEFHX1NIUklOS0VSX0ZSRUUpKSB7CiAJCXN0cnVjdCBpb25fcGFnZV9wb29sICpwb29sID0gaGVhcC0+cG9vbHNbb3JkZXJfdG9faW5kZXgob3JkZXIpXTsKIAkJaW9uX3BhZ2VfcG9vbF9mcmVlKHBvb2wsIHBhZ2UpOwogCX0gZWxzZSB7CkBAIC0yMDksNyArMjA5LDcgQEAKIAogCS8qIHVuY2FjaGVkIHBhZ2VzIGNvbWUgZnJvbSB0aGUgcGFnZSBwb29scywgemVybyB0aGVtIGJlZm9yZSByZXR1cm5pbmcKIAkgICBmb3Igc2VjdXJpdHkgcHVycG9zZXMgKG90aGVyIGFsbG9jYXRpb25zIGFyZSB6ZXJvZCBhdCBhbGxvYyB0aW1lICovCi0JaWYgKCFjYWNoZWQpCisJaWYgKCFjYWNoZWQgJiYgIShidWZmZXItPnByaXZhdGVfZmxhZ3MgJiBJT05fUFJJVl9GTEFHX1NIUklOS0VSX0ZSRUUpKQogCQlpb25faGVhcF9idWZmZXJfemVybyhidWZmZXIpOwogCiAJZm9yX2VhY2hfc2codGFibGUtPnNnbCwgc2csIHRhYmxlLT5uZW50cywgaSkKQEAgLTIzMSw2ICsyMzEsMjMgQEAKIAlyZXR1cm47CiB9CiAKK3N0YXRpYyBpbnQgaW9uX3N5c3RlbV9oZWFwX3NocmluayhzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsIGdmcF90IGdmcF9tYXNrLAorCQkJCQlpbnQgbnJfdG9fc2NhbikKK3sKKwlzdHJ1Y3QgaW9uX3N5c3RlbV9oZWFwICpzeXNfaGVhcDsKKwlpbnQgbnJfdG90YWwgPSAwOworCWludCBpOworCisJc3lzX2hlYXAgPSBjb250YWluZXJfb2YoaGVhcCwgc3RydWN0IGlvbl9zeXN0ZW1faGVhcCwgaGVhcCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX29yZGVyczsgaSsrKSB7CisJCXN0cnVjdCBpb25fcGFnZV9wb29sICpwb29sID0gc3lzX2hlYXAtPnBvb2xzW2ldOworCQlucl90b3RhbCArPSBpb25fcGFnZV9wb29sX3Nocmluayhwb29sLCBnZnBfbWFzaywgbnJfdG9fc2Nhbik7CisJfQorCisJcmV0dXJuIG5yX3RvdGFsOworfQorCiBzdGF0aWMgc3RydWN0IGlvbl9oZWFwX29wcyBzeXN0ZW1faGVhcF9vcHMgPSB7CiAJLmFsbG9jYXRlID0gaW9uX3N5c3RlbV9oZWFwX2FsbG9jYXRlLAogCS5mcmVlID0gaW9uX3N5c3RlbV9oZWFwX2ZyZWUsCkBAIC0yMzksNjcgKzI1Niw5IEBACiAJLm1hcF9rZXJuZWwgPSBpb25faGVhcF9tYXBfa2VybmVsLAogCS51bm1hcF9rZXJuZWwgPSBpb25faGVhcF91bm1hcF9rZXJuZWwsCiAJLm1hcF91c2VyID0gaW9uX2hlYXBfbWFwX3VzZXIsCisJLnNocmluayA9IGlvbl9zeXN0ZW1faGVhcF9zaHJpbmssCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBpb25fc3lzdGVtX2hlYXBfc2hyaW5rX2NvdW50KHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIsCi0JCQkJICBzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKQotewotCXN0cnVjdCBpb25faGVhcCAqaGVhcCA9IGNvbnRhaW5lcl9vZihzaHJpbmtlciwgc3RydWN0IGlvbl9oZWFwLAotCQkJCQkgICAgIHNocmlua2VyKTsKLQlzdHJ1Y3QgaW9uX3N5c3RlbV9oZWFwICpzeXNfaGVhcCA9IGNvbnRhaW5lcl9vZihoZWFwLAotCQkJCQkJCXN0cnVjdCBpb25fc3lzdGVtX2hlYXAsCi0JCQkJCQkJaGVhcCk7Ci0JaW50IG5yX3RvdGFsID0gMDsKLQlpbnQgaTsKLQotCS8qIHRvdGFsIG51bWJlciBvZiBpdGVtcyBpcyB3aGF0ZXZlciB0aGUgcGFnZSBwb29scyBhcmUgaG9sZGluZwotCSAgIHBsdXMgd2hhdGV2ZXIncyBpbiB0aGUgZnJlZWxpc3QgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX29yZGVyczsgaSsrKSB7Ci0JCXN0cnVjdCBpb25fcGFnZV9wb29sICpwb29sID0gc3lzX2hlYXAtPnBvb2xzW2ldOwotCQlucl90b3RhbCArPSBpb25fcGFnZV9wb29sX3Nocmluayhwb29sLCBzYy0+Z2ZwX21hc2ssIDApOwotCX0KLQlucl90b3RhbCArPSBpb25faGVhcF9mcmVlbGlzdF9zaXplKGhlYXApIC8gUEFHRV9TSVpFOwotCXJldHVybiBucl90b3RhbDsKLQotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBpb25fc3lzdGVtX2hlYXBfc2hyaW5rX3NjYW4oc3RydWN0IHNocmlua2VyICpzaHJpbmtlciwKLQkJCQkgIHN0cnVjdCBzaHJpbmtfY29udHJvbCAqc2MpCi17Ci0KLQlzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAgPSBjb250YWluZXJfb2Yoc2hyaW5rZXIsIHN0cnVjdCBpb25faGVhcCwKLQkJCQkJICAgICBzaHJpbmtlcik7Ci0Jc3RydWN0IGlvbl9zeXN0ZW1faGVhcCAqc3lzX2hlYXAgPSBjb250YWluZXJfb2YoaGVhcCwKLQkJCQkJCQlzdHJ1Y3QgaW9uX3N5c3RlbV9oZWFwLAotCQkJCQkJCWhlYXApOwotCWludCBucl9mcmVlZCA9IDA7Ci0JaW50IGk7Ci0KLQlpZiAoc2MtPm5yX3RvX3NjYW4gPT0gMCkKLQkJZ290byBlbmQ7Ci0KLQkvKiBzaHJpbmsgdGhlIGZyZWUgbGlzdCBmaXJzdCwgbm8gcG9pbnQgaW4gemVyb2luZyB0aGUgbWVtb3J5IGlmCi0JICAgd2UncmUganVzdCBnb2luZyB0byByZWNsYWltIGl0ICovCi0JbnJfZnJlZWQgKz0gaW9uX2hlYXBfZnJlZWxpc3RfZHJhaW4oaGVhcCwgc2MtPm5yX3RvX3NjYW4gKiBQQUdFX1NJWkUpIC8KLQkJUEFHRV9TSVpFOwotCi0JaWYgKG5yX2ZyZWVkID49IHNjLT5ucl90b19zY2FuKQotCQlnb3RvIGVuZDsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fb3JkZXJzOyBpKyspIHsKLQkJc3RydWN0IGlvbl9wYWdlX3Bvb2wgKnBvb2wgPSBzeXNfaGVhcC0+cG9vbHNbaV07Ci0KLQkJbnJfZnJlZWQgKz0gaW9uX3BhZ2VfcG9vbF9zaHJpbmsocG9vbCwgc2MtPmdmcF9tYXNrLAotCQkJCQkJIHNjLT5ucl90b19zY2FuKTsKLQkJaWYgKG5yX2ZyZWVkID49IHNjLT5ucl90b19zY2FuKQotCQkJYnJlYWs7Ci0JfQotCi1lbmQ6Ci0JcmV0dXJuIG5yX2ZyZWVkOwotCi19Ci0KIHN0YXRpYyBpbnQgaW9uX3N5c3RlbV9oZWFwX2RlYnVnX3Nob3coc3RydWN0IGlvbl9oZWFwICpoZWFwLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCiAJCQkJICAgICAgdm9pZCAqdW51c2VkKQogewpAQCAtMzQ3LDExICszMDYsNiBAQAogCQloZWFwLT5wb29sc1tpXSA9IHBvb2w7CiAJfQogCi0JaGVhcC0+aGVhcC5zaHJpbmtlci5zY2FuX29iamVjdHMgPSBpb25fc3lzdGVtX2hlYXBfc2hyaW5rX3NjYW47Ci0JaGVhcC0+aGVhcC5zaHJpbmtlci5jb3VudF9vYmplY3RzID0gaW9uX3N5c3RlbV9oZWFwX3Nocmlua19jb3VudDsKLQloZWFwLT5oZWFwLnNocmlua2VyLnNlZWtzID0gREVGQVVMVF9TRUVLUzsKLQloZWFwLT5oZWFwLnNocmlua2VyLmJhdGNoID0gMDsKLQlyZWdpc3Rlcl9zaHJpbmtlcigmaGVhcC0+aGVhcC5zaHJpbmtlcik7CiAJaGVhcC0+aGVhcC5kZWJ1Z19zaG93ID0gaW9uX3N5c3RlbV9oZWFwX2RlYnVnX3Nob3c7CiAJcmV0dXJuICZoZWFwLT5oZWFwOwogZXJyX2NyZWF0ZV9wb29sOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL3RlZ3JhL3RlZ3JhX2lvbi5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL3RlZ3JhL3RlZ3JhX2lvbi5jCmluZGV4IDM0NzRjNjUuLjExYzdjY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi90ZWdyYS90ZWdyYV9pb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vdGVncmEvdGVncmFfaW9uLmMKQEAgLTMyLDEzICszMiwxMyBAQAogCiAJbnVtX2hlYXBzID0gcGRhdGEtPm5yOwogCi0JaGVhcHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW9uX2hlYXAgKikgKiBwZGF0YS0+bnIsIEdGUF9LRVJORUwpOworCWhlYXBzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgaW9uX2hlYXAgKikgKiBwZGF0YS0+bnIsCisJCQkgICAgIEdGUF9LRVJORUwpOwogCiAJaWRldiA9IGlvbl9kZXZpY2VfY3JlYXRlKE5VTEwpOwotCWlmIChJU19FUlJfT1JfTlVMTChpZGV2KSkgewotCQlrZnJlZShoZWFwcyk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGlkZXYpKQogCQlyZXR1cm4gUFRSX0VSUihpZGV2KTsKLQl9CiAKIAkvKiBjcmVhdGUgdGhlIGhlYXBzIGFzIHNwZWNpZmllZCBpbiB0aGUgYm9hcmQgZmlsZSAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1faGVhcHM7IGkrKykgewpAQCAtNTgsNyArNTgsNiBAQAogCQlpZiAoaGVhcHNbaV0pCiAJCQlpb25faGVhcF9kZXN0cm95KGhlYXBzW2ldKTsKIAl9Ci0Ja2ZyZWUoaGVhcHMpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTcwLDcgKzY5LDYgQEAKIAlpb25fZGV2aWNlX2Rlc3Ryb3koaWRldik7CiAJZm9yIChpID0gMDsgaSA8IG51bV9oZWFwczsgaSsrKQogCQlpb25faGVhcF9kZXN0cm95KGhlYXBzW2ldKTsKLQlrZnJlZShoZWFwcyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvd21lbW9yeWtpbGxlci5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG93bWVtb3J5a2lsbGVyLmMKaW5kZXggNmYwOTRiMy4uYjU0NWQzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG93bWVtb3J5a2lsbGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG93bWVtb3J5a2lsbGVyLmMKQEAgLTg4LDcgKzg4LDggQEAKIAlpbnQgYXJyYXlfc2l6ZSA9IEFSUkFZX1NJWkUobG93bWVtX2Fkaik7CiAJaW50IG90aGVyX2ZyZWUgPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9GUkVFX1BBR0VTKSAtIHRvdGFscmVzZXJ2ZV9wYWdlczsKIAlpbnQgb3RoZXJfZmlsZSA9IGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZJTEVfUEFHRVMpIC0KLQkJCQkJCWdsb2JhbF9wYWdlX3N0YXRlKE5SX1NITUVNKTsKKwkJCQkJCWdsb2JhbF9wYWdlX3N0YXRlKE5SX1NITUVNKSAtCisJCQkJCQl0b3RhbF9zd2FwY2FjaGVfcGFnZXMoKTsKIAogCWlmIChsb3dtZW1fYWRqX3NpemUgPCBhcnJheV9zaXplKQogCQlhcnJheV9zaXplID0gbG93bWVtX2Fkal9zaXplOwpAQCAtMTU5LDggKzE2MCw4IEBACiAJCQkgICAgIHNlbGVjdGVkLT5waWQsIHNlbGVjdGVkLT5jb21tLAogCQkJICAgICBzZWxlY3RlZF9vb21fc2NvcmVfYWRqLCBzZWxlY3RlZF90YXNrc2l6ZSk7CiAJCWxvd21lbV9kZWF0aHBlbmRpbmdfdGltZW91dCA9IGppZmZpZXMgKyBIWjsKLQkJc2VuZF9zaWcoU0lHS0lMTCwgc2VsZWN0ZWQsIDApOwogCQlzZXRfdHNrX3RocmVhZF9mbGFnKHNlbGVjdGVkLCBUSUZfTUVNRElFKTsKKwkJc2VuZF9zaWcoU0lHS0lMTCwgc2VsZWN0ZWQsIDApOwogCQlyZW0gKz0gc2VsZWN0ZWRfdGFza3NpemU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zd19zeW5jLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zd19zeW5jLmgKaW5kZXggNWFhZjcxZC4uMWE1MDY2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvc3dfc3luYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3N3X3N5bmMuaApAQCAtMTgsMTAgKzE4LDkgQEAKICNkZWZpbmUgX0xJTlVYX1NXX1NZTkNfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotI2lmZGVmIF9fS0VSTkVMX18KLQorI2luY2x1ZGUgPGxpbnV4L2tjb25maWcuaD4KICNpbmNsdWRlICJzeW5jLmgiCisjaW5jbHVkZSAidWFwaS9zd19zeW5jLmgiCiAKIHN0cnVjdCBzd19zeW5jX3RpbWVsaW5lIHsKIAlzdHJ1Y3QJc3luY190aW1lbGluZQlvYmo7CkBAIC01NywxOSArNTYsNCBAQAogfQogI2VuZGlmIC8qIElTX0VOQUJMRUQoQ09ORklHX1NXX1NZTkMpICovCiAKLSNlbmRpZiAvKiBfX0tFUk5FTCBfXyAqLwotCi1zdHJ1Y3Qgc3dfc3luY19jcmVhdGVfZmVuY2VfZGF0YSB7Ci0JX191MzIJdmFsdWU7Ci0JY2hhcgluYW1lWzMyXTsKLQlfX3MzMglmZW5jZTsgLyogZmQgb2YgbmV3IGZlbmNlICovCi19OwotCi0jZGVmaW5lIFNXX1NZTkNfSU9DX01BR0lDCSdXJwotCi0jZGVmaW5lIFNXX1NZTkNfSU9DX0NSRUFURV9GRU5DRQlfSU9XUihTV19TWU5DX0lPQ19NQUdJQywgMCxcCi0JCXN0cnVjdCBzd19zeW5jX2NyZWF0ZV9mZW5jZV9kYXRhKQotI2RlZmluZSBTV19TWU5DX0lPQ19JTkMJCQlfSU9XKFNXX1NZTkNfSU9DX01BR0lDLCAxLCBfX3UzMikKLQotCiAjZW5kaWYgLyogX0xJTlVYX1NXX1NZTkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvc3luYy5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvc3luYy5oCmluZGV4IDYyZTIyNTViLi5lYWY1N2NjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvc3luYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3N5bmMuaApAQCAtMTQsMTQgKzE0LDE0IEBACiAjZGVmaW5lIF9MSU5VWF9TWU5DX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaWZkZWYgX19LRVJORUxfXwotCiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogCisjaW5jbHVkZSAidWFwaS9zeW5jLmgiCisKIHN0cnVjdCBzeW5jX3RpbWVsaW5lOwogc3RydWN0IHN5bmNfcHQ7CiBzdHJ1Y3Qgc3luY19mZW5jZTsKQEAgLTUzLDcgKzUzLDcgQEAKIAljb25zdCBjaGFyICpkcml2ZXJfbmFtZTsKIAogCS8qIHJlcXVpcmVkICovCi0Jc3RydWN0IHN5bmNfcHQgKigqZHVwKShzdHJ1Y3Qgc3luY19wdCAqcHQpOworCXN0cnVjdCBzeW5jX3B0ICogKCpkdXApKHN0cnVjdCBzeW5jX3B0ICpwdCk7CiAKIAkvKiByZXF1aXJlZCAqLwogCWludCAoKmhhc19zaWduYWxlZCkoc3RydWN0IHN5bmNfcHQgKnB0KTsKQEAgLTM0MSw4NiArMzQxLDQgQEAKICAqLwogaW50IHN5bmNfZmVuY2Vfd2FpdChzdHJ1Y3Qgc3luY19mZW5jZSAqZmVuY2UsIGxvbmcgdGltZW91dCk7CiAKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KLS8qKgotICogc3RydWN0IHN5bmNfbWVyZ2VfZGF0YSAtIGRhdGEgcGFzc2VkIHRvIG1lcmdlIGlvY3RsCi0gKiBAZmQyOglmaWxlIGRlc2NyaXB0b3Igb2Ygc2Vjb25kIGZlbmNlCi0gKiBAbmFtZToJbmFtZSBvZiBuZXcgZmVuY2UKLSAqIEBmZW5jZToJcmV0dXJucyB0aGUgZmQgb2YgdGhlIG5ldyBmZW5jZSB0byB1c2Vyc3BhY2UKLSAqLwotc3RydWN0IHN5bmNfbWVyZ2VfZGF0YSB7Ci0JX19zMzIJZmQyOyAvKiBmZCBvZiBzZWNvbmQgZmVuY2UgKi8KLQljaGFyCW5hbWVbMzJdOyAvKiBuYW1lIG9mIG5ldyBmZW5jZSAqLwotCV9fczMyCWZlbmNlOyAvKiBmZCBvbiBuZXdseSBjcmVhdGVkIGZlbmNlICovCi19OwotCi0vKioKLSAqIHN0cnVjdCBzeW5jX3B0X2luZm8gLSBkZXRhaWxlZCBzeW5jX3B0IGluZm9ybWF0aW9uCi0gKiBAbGVuOgkJbGVuZ3RoIG9mIHN5bmNfcHRfaW5mbyBpbmNsdWRpbmcgYW55IGRyaXZlcl9kYXRhCi0gKiBAb2JqX25hbWU6CQluYW1lIG9mIHBhcmVudCBzeW5jX3RpbWVsaW5lCi0gKiBAZHJpdmVyX25hbWU6CW5hbWUgb2YgZHJpdmVyIGltcGxlbWVudGluZyB0aGUgcGFyZW50Ci0gKiBAc3RhdHVzOgkJc3RhdHVzIG9mIHRoZSBzeW5jX3B0IDA6YWN0aXZlIDE6c2lnbmFsZWQgPDA6ZXJyb3IKLSAqIEB0aW1lc3RhbXBfbnM6CXRpbWVzdGFtcCBvZiBzdGF0dXMgY2hhbmdlIGluIG5hbm9zZWNvbmRzCi0gKiBAZHJpdmVyX2RhdGE6CWFueSBkcml2ZXIgZGVwZW5kZW50IGRhdGEKLSAqLwotc3RydWN0IHN5bmNfcHRfaW5mbyB7Ci0JX191MzIJbGVuOwotCWNoYXIJb2JqX25hbWVbMzJdOwotCWNoYXIJZHJpdmVyX25hbWVbMzJdOwotCV9fczMyCXN0YXR1czsKLQlfX3U2NAl0aW1lc3RhbXBfbnM7Ci0KLQlfX3U4CWRyaXZlcl9kYXRhWzBdOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3Qgc3luY19mZW5jZV9pbmZvX2RhdGEgLSBkYXRhIHJldHVybmVkIGZyb20gZmVuY2UgaW5mbyBpb2N0bAotICogQGxlbjoJaW9jdGwgY2FsbGVyIHdyaXRlcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGl0cyBwYXNzaW5nIGluLgotICoJCWlvY3RsIHJldHVybnMgbGVuZ3RoIG9mIHN5bmNfZmVuY2VfZGF0YSByZXR1cm5lZCB0byB1c2Vyc3BhY2UKLSAqCQlpbmNsdWRpbmcgcHRfaW5mby4KLSAqIEBuYW1lOgluYW1lIG9mIGZlbmNlCi0gKiBAc3RhdHVzOglzdGF0dXMgb2YgZmVuY2UuIDE6IHNpZ25hbGVkIDA6YWN0aXZlIDwwOmVycm9yCi0gKiBAcHRfaW5mbzoJYSBzeW5jX3B0X2luZm8gc3RydWN0IGZvciBldmVyeSBzeW5jX3B0IGluIHRoZSBmZW5jZQotICovCi1zdHJ1Y3Qgc3luY19mZW5jZV9pbmZvX2RhdGEgewotCV9fdTMyCWxlbjsKLQljaGFyCW5hbWVbMzJdOwotCV9fczMyCXN0YXR1czsKLQotCV9fdTgJcHRfaW5mb1swXTsKLX07Ci0KLSNkZWZpbmUgU1lOQ19JT0NfTUFHSUMJCSc+JwotCi0vKioKLSAqIERPQzogU1lOQ19JT0NfV0FJVCAtIHdhaXQgZm9yIGEgZmVuY2UgdG8gc2lnbmFsCi0gKgotICogcGFzcyB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gIFdhaXRzIGluZGVmaW5pdGVseSB0aW1lb3V0IDwgMC4KLSAqLwotI2RlZmluZSBTWU5DX0lPQ19XQUlUCQlfSU9XKFNZTkNfSU9DX01BR0lDLCAwLCBfX3MzMikKLQotLyoqCi0gKiBET0M6IFNZTkNfSU9DX01FUkdFIC0gbWVyZ2UgdHdvIGZlbmNlcwotICoKLSAqIFRha2VzIGEgc3RydWN0IHN5bmNfbWVyZ2VfZGF0YS4gIENyZWF0ZXMgYSBuZXcgZmVuY2UgY29udGFpbmluZyBjb3BpZXMgb2YKLSAqIHRoZSBzeW5jX3B0cyBpbiBib3RoIHRoZSBjYWxsaW5nIGZkIGFuZCBzeW5jX21lcmdlX2RhdGEuZmQyLiAgUmV0dXJucyB0aGUKLSAqIG5ldyBmZW5jZSdzIGZkIGluIHN5bmNfbWVyZ2VfZGF0YS5mZW5jZQotICovCi0jZGVmaW5lIFNZTkNfSU9DX01FUkdFCQlfSU9XUihTWU5DX0lPQ19NQUdJQywgMSwgc3RydWN0IHN5bmNfbWVyZ2VfZGF0YSkKLQotLyoqCi0gKiBET0M6IFNZTkNfSU9DX0ZFTkNFX0lORk8gLSBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gYSBmZW5jZQotICoKLSAqIFRha2VzIGEgc3RydWN0IHN5bmNfZmVuY2VfaW5mb19kYXRhIHdpdGggZXh0cmEgc3BhY2UgYWxsb2NhdGVkIGZvciBwdF9pbmZvLgotICogQ2FsbGVyIHNob3VsZCB3cml0ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGludG8gbGVuLiAgT24gcmV0dXJuLCBsZW4gaXMKLSAqIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgc3luY19mZW5jZV9pbmZvX2RhdGEgaW5jbHVkaW5nCi0gKiBwdF9pbmZvLgotICoKLSAqIHB0X2luZm8gaXMgYSBidWZmZXIgY29udGFpbmluZyBzeW5jX3B0X2luZm9zIGZvciBldmVyeSBzeW5jX3B0IGluIHRoZSBmZW5jZS4KLSAqIFRvIGl0ZXJhdGUgb3ZlciB0aGUgc3luY19wdF9pbmZvcywgdXNlIHRoZSBzeW5jX3B0X2luZm8ubGVuIGZpZWxkLgotICovCi0jZGVmaW5lIFNZTkNfSU9DX0ZFTkNFX0lORk8JX0lPV1IoU1lOQ19JT0NfTUFHSUMsIDIsXAotCXN0cnVjdCBzeW5jX2ZlbmNlX2luZm9fZGF0YSkKLQogI2VuZGlmIC8qIF9MSU5VWF9TWU5DX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uYwppbmRleCBlODE0NTE0Li4wYzdmZGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9ncGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5jCkBAIC05MCw4ICs5MCw5IEBACiAJaWYgKCFwZGF0YSkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCWdwaW9fZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0aW1lZF9ncGlvX2RhdGEpICogcGRhdGEtPm51bV9ncGlvcywKLQkJCUdGUF9LRVJORUwpOworCWdwaW9fZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAorCQkJCXNpemVvZihzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhKSAqIHBkYXRhLT5udW1fZ3Bpb3MsCisJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFncGlvX2RhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xMzEsNyArMTMyLDYgQEAKIAkJdGltZWRfb3V0cHV0X2Rldl91bnJlZ2lzdGVyKCZncGlvX2RhdGFbaV0uZGV2KTsKIAkJZ3Bpb19mcmVlKGdwaW9fZGF0YVtpXS5ncGlvKTsKIAl9Ci0Ja2ZyZWUoZ3Bpb19kYXRhKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNDcsOCArMTQ3LDYgQEAKIAkJZ3Bpb19mcmVlKGdwaW9fZGF0YVtpXS5ncGlvKTsKIAl9CiAKLQlrZnJlZShncGlvX2RhdGEpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX291dHB1dC5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfb3V0cHV0LmgKaW5kZXggOTA1YzdjYy4uMTNkMmNhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfb3V0cHV0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfb3V0cHV0LmgKQEAgLTIwLDEwICsyMCwxMCBAQAogCWNvbnN0IGNoYXIJKm5hbWU7CiAKIAkvKiBlbmFibGUgdGhlIG91dHB1dCBhbmQgc2V0IHRoZSB0aW1lciAqLwotCXZvaWQJKCplbmFibGUpKHN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2ICpzZGV2LCBpbnQgdGltZW91dCk7CisJdm9pZCAoKmVuYWJsZSkoc3RydWN0IHRpbWVkX291dHB1dF9kZXYgKnNkZXYsIGludCB0aW1lb3V0KTsKIAogCS8qIHJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyByZW1haW5pbmcgb24gdGhlIHRpbWVyICovCi0JaW50CQkoKmdldF90aW1lKShzdHJ1Y3QgdGltZWRfb3V0cHV0X2RldiAqc2Rldik7CisJaW50ICgqZ2V0X3RpbWUpKHN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2ICpzZGV2KTsKIAogCS8qIHByaXZhdGUgZGF0YSAqLwogCXN0cnVjdCBkZXZpY2UJKmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvYW5kcm9pZF9hbGFybS5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9hbmRyb2lkX2FsYXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEwMTNmNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvYW5kcm9pZF9hbGFybS5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qIGRyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvYW5kcm9pZF9hbGFybS5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfVUFQSV9MSU5VWF9BTkRST0lEX0FMQVJNX0gKKyNkZWZpbmUgX1VBUElfTElOVVhfQU5EUk9JRF9BTEFSTV9ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworZW51bSBhbmRyb2lkX2FsYXJtX3R5cGUgeworCS8qIHJldHVybiBjb2RlIGJpdCBudW1iZXJzIG9yIHNldCBhbGFybSBhcmcgKi8KKwlBTkRST0lEX0FMQVJNX1JUQ19XQUtFVVAsCisJQU5EUk9JRF9BTEFSTV9SVEMsCisJQU5EUk9JRF9BTEFSTV9FTEFQU0VEX1JFQUxUSU1FX1dBS0VVUCwKKwlBTkRST0lEX0FMQVJNX0VMQVBTRURfUkVBTFRJTUUsCisJQU5EUk9JRF9BTEFSTV9TWVNURU1USU1FLAorCisJQU5EUk9JRF9BTEFSTV9UWVBFX0NPVU5ULAorCisJLyogcmV0dXJuIGNvZGUgYml0IG51bWJlcnMgKi8KKwkvKiBBTkRST0lEX0FMQVJNX1RJTUVfQ0hBTkdFID0gMTYgKi8KK307CisKK2VudW0gYW5kcm9pZF9hbGFybV9yZXR1cm5fZmxhZ3MgeworCUFORFJPSURfQUxBUk1fUlRDX1dBS0VVUF9NQVNLID0gMVUgPDwgQU5EUk9JRF9BTEFSTV9SVENfV0FLRVVQLAorCUFORFJPSURfQUxBUk1fUlRDX01BU0sgPSAxVSA8PCBBTkRST0lEX0FMQVJNX1JUQywKKwlBTkRST0lEX0FMQVJNX0VMQVBTRURfUkVBTFRJTUVfV0FLRVVQX01BU0sgPQorCQkJCTFVIDw8IEFORFJPSURfQUxBUk1fRUxBUFNFRF9SRUFMVElNRV9XQUtFVVAsCisJQU5EUk9JRF9BTEFSTV9FTEFQU0VEX1JFQUxUSU1FX01BU0sgPQorCQkJCTFVIDw8IEFORFJPSURfQUxBUk1fRUxBUFNFRF9SRUFMVElNRSwKKwlBTkRST0lEX0FMQVJNX1NZU1RFTVRJTUVfTUFTSyA9IDFVIDw8IEFORFJPSURfQUxBUk1fU1lTVEVNVElNRSwKKwlBTkRST0lEX0FMQVJNX1RJTUVfQ0hBTkdFX01BU0sgPSAxVSA8PCAxNgorfTsKKworLyogRGlzYWJsZSBhbGFybSAqLworI2RlZmluZSBBTkRST0lEX0FMQVJNX0NMRUFSKHR5cGUpICAgICAgICAgICBfSU8oJ2EnLCAwIHwgKCh0eXBlKSA8PCA0KSkKKworLyogQWNrIGxhc3QgYWxhcm0gYW5kIHdhaXQgZm9yIG5leHQgKi8KKyNkZWZpbmUgQU5EUk9JRF9BTEFSTV9XQUlUICAgICAgICAgICAgICAgICAgX0lPKCdhJywgMSkKKworI2RlZmluZSBBTEFSTV9JT1coYywgdHlwZSwgc2l6ZSkgICAgICAgICAgICBfSU9XKCdhJywgKGMpIHwgKCh0eXBlKSA8PCA0KSwgc2l6ZSkKKy8qIFNldCBhbGFybSAqLworI2RlZmluZSBBTkRST0lEX0FMQVJNX1NFVCh0eXBlKSAgICAgICAgICAgICBBTEFSTV9JT1coMiwgdHlwZSwgc3RydWN0IHRpbWVzcGVjKQorI2RlZmluZSBBTkRST0lEX0FMQVJNX1NFVF9BTkRfV0FJVCh0eXBlKSAgICBBTEFSTV9JT1coMywgdHlwZSwgc3RydWN0IHRpbWVzcGVjKQorI2RlZmluZSBBTkRST0lEX0FMQVJNX0dFVF9USU1FKHR5cGUpICAgICAgICBBTEFSTV9JT1coNCwgdHlwZSwgc3RydWN0IHRpbWVzcGVjKQorI2RlZmluZSBBTkRST0lEX0FMQVJNX1NFVF9SVEMgICAgICAgICAgICAgICBfSU9XKCdhJywgNSwgc3RydWN0IHRpbWVzcGVjKQorI2RlZmluZSBBTkRST0lEX0FMQVJNX0JBU0VfQ01EKGNtZCkgICAgICAgICAoY21kICYgfihfSU9DKDAsIDAsIDB4ZjAsIDApKSkKKyNkZWZpbmUgQU5EUk9JRF9BTEFSTV9JT0NUTF9UT19UWVBFKGNtZCkgICAgKF9JT0NfTlIoY21kKSA+PiA0KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvYXNobWVtLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC91YXBpL2FzaG1lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNDc0M2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC91YXBpL2FzaG1lbS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBkcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC91YXBpL2FzaG1lbS5oCisgKgorICogQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKyAqIEF1dGhvcjogUm9iZXJ0IExvdmUKKyAqCisgKiBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZC4gIEl0IG1heSBiZSByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgMi4wIExpY2Vuc2UgT1IgdmVyc2lvbiAyIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVUFQSV9MSU5VWF9BU0hNRU1fSAorI2RlZmluZSBfVUFQSV9MSU5VWF9BU0hNRU1fSAorCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2RlZmluZSBBU0hNRU1fTkFNRV9MRU4JCTI1NgorCisjZGVmaW5lIEFTSE1FTV9OQU1FX0RFRgkJImRldi9hc2htZW0iCisKKy8qIFJldHVybiB2YWx1ZXMgZnJvbSBBU0hNRU1fUElOOiBXYXMgdGhlIG1hcHBpbmcgcHVyZ2VkIHdoaWxlIHVucGlubmVkPyAqLworI2RlZmluZSBBU0hNRU1fTk9UX1BVUkdFRAkwCisjZGVmaW5lIEFTSE1FTV9XQVNfUFVSR0VECTEKKworLyogUmV0dXJuIHZhbHVlcyBmcm9tIEFTSE1FTV9HRVRfUElOX1NUQVRVUzogSXMgdGhlIG1hcHBpbmcgcGlubmVkPyAqLworI2RlZmluZSBBU0hNRU1fSVNfVU5QSU5ORUQJMAorI2RlZmluZSBBU0hNRU1fSVNfUElOTkVECTEKKworc3RydWN0IGFzaG1lbV9waW4geworCV9fdTMyIG9mZnNldDsJLyogb2Zmc2V0IGludG8gcmVnaW9uLCBpbiBieXRlcywgcGFnZS1hbGlnbmVkICovCisJX191MzIgbGVuOwkvKiBsZW5ndGggZm9yd2FyZCBmcm9tIG9mZnNldCwgaW4gYnl0ZXMsIHBhZ2UtYWxpZ25lZCAqLworfTsKKworI2RlZmluZSBfX0FTSE1FTUlPQwkJMHg3NworCisjZGVmaW5lIEFTSE1FTV9TRVRfTkFNRQkJX0lPVyhfX0FTSE1FTUlPQywgMSwgY2hhcltBU0hNRU1fTkFNRV9MRU5dKQorI2RlZmluZSBBU0hNRU1fR0VUX05BTUUJCV9JT1IoX19BU0hNRU1JT0MsIDIsIGNoYXJbQVNITUVNX05BTUVfTEVOXSkKKyNkZWZpbmUgQVNITUVNX1NFVF9TSVpFCQlfSU9XKF9fQVNITUVNSU9DLCAzLCBzaXplX3QpCisjZGVmaW5lIEFTSE1FTV9HRVRfU0laRQkJX0lPKF9fQVNITUVNSU9DLCA0KQorI2RlZmluZSBBU0hNRU1fU0VUX1BST1RfTUFTSwlfSU9XKF9fQVNITUVNSU9DLCA1LCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBBU0hNRU1fR0VUX1BST1RfTUFTSwlfSU8oX19BU0hNRU1JT0MsIDYpCisjZGVmaW5lIEFTSE1FTV9QSU4JCV9JT1coX19BU0hNRU1JT0MsIDcsIHN0cnVjdCBhc2htZW1fcGluKQorI2RlZmluZSBBU0hNRU1fVU5QSU4JCV9JT1coX19BU0hNRU1JT0MsIDgsIHN0cnVjdCBhc2htZW1fcGluKQorI2RlZmluZSBBU0hNRU1fR0VUX1BJTl9TVEFUVVMJX0lPKF9fQVNITUVNSU9DLCA5KQorI2RlZmluZSBBU0hNRU1fUFVSR0VfQUxMX0NBQ0hFUwlfSU8oX19BU0hNRU1JT0MsIDEwKQorCisjZW5kaWYJLyogX1VBUElfTElOVVhfQVNITUVNX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvYmluZGVyLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC91YXBpL2JpbmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNGFkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC91YXBpL2JpbmRlci5oCkBAIC0wLDAgKzEsMzUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgorICoKKyAqIEJhc2VkIG9uLCBidXQgbm8gbG9uZ2VyIGNvbXBhdGlibGUgd2l0aCwgdGhlIG9yaWdpbmFsCisgKiBPcGVuQmluZGVyLm9yZyBiaW5kZXIgZHJpdmVyIGludGVyZmFjZSwgd2hpY2ggaXM6CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFBhbG1zb3VyY2UsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9VQVBJX0xJTlVYX0JJTkRFUl9ICisjZGVmaW5lIF9VQVBJX0xJTlVYX0JJTkRFUl9ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjZGVmaW5lIEJfUEFDS19DSEFSUyhjMSwgYzIsIGMzLCBjNCkgXAorCSgoKChjMSk8PDI0KSkgfCAoKChjMik8PDE2KSkgfCAoKChjMyk8PDgpKSB8IChjNCkpCisjZGVmaW5lIEJfVFlQRV9MQVJHRSAweDg1CisKK2VudW0geworCUJJTkRFUl9UWVBFX0JJTkRFUgk9IEJfUEFDS19DSEFSUygncycsICdiJywgJyonLCBCX1RZUEVfTEFSR0UpLAorCUJJTkRFUl9UWVBFX1dFQUtfQklOREVSCT0gQl9QQUNLX0NIQVJTKCd3JywgJ2InLCAnKicsIEJfVFlQRV9MQVJHRSksCisJQklOREVSX1RZUEVfSEFORExFCT0gQl9QQUNLX0NIQVJTKCdzJywgJ2gnLCAnKicsIEJfVFlQRV9MQVJHRSksCisJQklOREVSX1RZUEVfV0VBS19IQU5ETEUJPSBCX1BBQ0tfQ0hBUlMoJ3cnLCAnaCcsICcqJywgQl9UWVBFX0xBUkdFKSwKKwlCSU5ERVJfVFlQRV9GRAkJPSBCX1BBQ0tfQ0hBUlMoJ2YnLCAnZCcsICcqJywgQl9UWVBFX0xBUkdFKSwKK307CisKK2VudW0geworCUZMQVRfQklOREVSX0ZMQUdfUFJJT1JJVFlfTUFTSyA9IDB4ZmYsCisJRkxBVF9CSU5ERVJfRkxBR19BQ0NFUFRTX0ZEUyA9IDB4MTAwLAorfTsKKworI2lmZGVmIEJJTkRFUl9JUENfMzJCSVQKK3R5cGVkZWYgX191MzIgYmluZGVyX3NpemVfdDsKK3R5cGVkZWYgX191MzIgYmluZGVyX3VpbnRwdHJfdDsKKyNlbHNlCit0eXBlZGVmIF9fdTY0IGJpbmRlcl9zaXplX3Q7Cit0eXBlZGVmIF9fdTY0IGJpbmRlcl91aW50cHRyX3Q7CisjZW5kaWYKKworLyoKKyAqIFRoaXMgaXMgdGhlIGZsYXR0ZW5lZCByZXByZXNlbnRhdGlvbiBvZiBhIEJpbmRlciBvYmplY3QgZm9yIHRyYW5zZmVyCisgKiBiZXR3ZWVuIHByb2Nlc3Nlcy4gIFRoZSAnb2Zmc2V0cycgc3VwcGxpZWQgYXMgcGFydCBvZiBhIGJpbmRlciB0cmFuc2FjdGlvbgorICogY29udGFpbnMgb2Zmc2V0cyBpbnRvIHRoZSBkYXRhIHdoZXJlIHRoZXNlIHN0cnVjdHVyZXMgb2NjdXIuICBUaGUgQmluZGVyCisgKiBkcml2ZXIgdGFrZXMgY2FyZSBvZiByZS13cml0aW5nIHRoZSBzdHJ1Y3R1cmUgdHlwZSBhbmQgZGF0YSBhcyBpdCBtb3ZlcworICogYmV0d2VlbiBwcm9jZXNzZXMuCisgKi8KK3N0cnVjdCBmbGF0X2JpbmRlcl9vYmplY3QgeworCS8qIDggYnl0ZXMgZm9yIGxhcmdlX2ZsYXRfaGVhZGVyLiAqLworCV9fdTMyCQl0eXBlOworCV9fdTMyCQlmbGFnczsKKworCS8qIDggYnl0ZXMgb2YgZGF0YS4gKi8KKwl1bmlvbiB7CisJCWJpbmRlcl91aW50cHRyX3QJYmluZGVyOwkvKiBsb2NhbCBvYmplY3QgKi8KKwkJX191MzIJCQloYW5kbGU7CS8qIHJlbW90ZSBvYmplY3QgKi8KKwl9OworCisJLyogZXh0cmEgZGF0YSBhc3NvY2lhdGVkIHdpdGggbG9jYWwgb2JqZWN0ICovCisJYmluZGVyX3VpbnRwdHJfdAljb29raWU7Cit9OworCisvKgorICogT24gNjQtYml0IHBsYXRmb3JtcyB3aGVyZSB1c2VyIGNvZGUgbWF5IHJ1biBpbiAzMi1iaXRzIHRoZSBkcml2ZXIgbXVzdAorICogdHJhbnNsYXRlIHRoZSBidWZmZXIgKGFuZCBsb2NhbCBiaW5kZXIpIGFkZHJlc3NlcyBhcHByb3ByaWF0ZWx5LgorICovCisKK3N0cnVjdCBiaW5kZXJfd3JpdGVfcmVhZCB7CisJYmluZGVyX3NpemVfdAkJd3JpdGVfc2l6ZTsJLyogYnl0ZXMgdG8gd3JpdGUgKi8KKwliaW5kZXJfc2l6ZV90CQl3cml0ZV9jb25zdW1lZDsJLyogYnl0ZXMgY29uc3VtZWQgYnkgZHJpdmVyICovCisJYmluZGVyX3VpbnRwdHJfdAl3cml0ZV9idWZmZXI7CisJYmluZGVyX3NpemVfdAkJcmVhZF9zaXplOwkvKiBieXRlcyB0byByZWFkICovCisJYmluZGVyX3NpemVfdAkJcmVhZF9jb25zdW1lZDsJLyogYnl0ZXMgY29uc3VtZWQgYnkgZHJpdmVyICovCisJYmluZGVyX3VpbnRwdHJfdAlyZWFkX2J1ZmZlcjsKK307CisKKy8qIFVzZSB3aXRoIEJJTkRFUl9WRVJTSU9OLCBkcml2ZXIgZmlsbHMgaW4gZmllbGRzLiAqLworc3RydWN0IGJpbmRlcl92ZXJzaW9uIHsKKwkvKiBkcml2ZXIgcHJvdG9jb2wgdmVyc2lvbiAtLSBpbmNyZW1lbnQgd2l0aCBpbmNvbXBhdGlibGUgY2hhbmdlICovCisJX19zMzIgICAgICAgcHJvdG9jb2xfdmVyc2lvbjsKK307CisKKy8qIFRoaXMgaXMgdGhlIGN1cnJlbnQgcHJvdG9jb2wgdmVyc2lvbi4gKi8KKyNpZmRlZiBCSU5ERVJfSVBDXzMyQklUCisjZGVmaW5lIEJJTkRFUl9DVVJSRU5UX1BST1RPQ09MX1ZFUlNJT04gNworI2Vsc2UKKyNkZWZpbmUgQklOREVSX0NVUlJFTlRfUFJPVE9DT0xfVkVSU0lPTiA4CisjZW5kaWYKKworI2RlZmluZSBCSU5ERVJfV1JJVEVfUkVBRAkJX0lPV1IoJ2InLCAxLCBzdHJ1Y3QgYmluZGVyX3dyaXRlX3JlYWQpCisjZGVmaW5lIEJJTkRFUl9TRVRfSURMRV9USU1FT1VUCQlfSU9XKCdiJywgMywgX19zNjQpCisjZGVmaW5lIEJJTkRFUl9TRVRfTUFYX1RIUkVBRFMJCV9JT1coJ2InLCA1LCBfX3UzMikKKyNkZWZpbmUgQklOREVSX1NFVF9JRExFX1BSSU9SSVRZCV9JT1coJ2InLCA2LCBfX3MzMikKKyNkZWZpbmUgQklOREVSX1NFVF9DT05URVhUX01HUgkJX0lPVygnYicsIDcsIF9fczMyKQorI2RlZmluZSBCSU5ERVJfVEhSRUFEX0VYSVQJCV9JT1coJ2InLCA4LCBfX3MzMikKKyNkZWZpbmUgQklOREVSX1ZFUlNJT04JCQlfSU9XUignYicsIDksIHN0cnVjdCBiaW5kZXJfdmVyc2lvbikKKworLyoKKyAqIE5PVEU6IFR3byBzcGVjaWFsIGVycm9yIGNvZGVzIHlvdSBzaG91bGQgY2hlY2sgZm9yIHdoZW4gY2FsbGluZworICogaW4gdG8gdGhlIGRyaXZlciBhcmU6CisgKgorICogRUlOVFIgLS0gVGhlIG9wZXJhdGlvbiBoYXMgYmVlbiBpbnRlcnVwdGVkLiAgVGhpcyBzaG91bGQgYmUKKyAqIGhhbmRsZWQgYnkgcmV0cnlpbmcgdGhlIGlvY3RsKCkgdW50aWwgYSBkaWZmZXJlbnQgZXJyb3IgY29kZQorICogaXMgcmV0dXJuZWQuCisgKgorICogRUNPTk5SRUZVU0VEIC0tIFRoZSBkcml2ZXIgaXMgbm8gbG9uZ2VyIGFjY2VwdGluZyBvcGVyYXRpb25zCisgKiBmcm9tIHlvdXIgcHJvY2Vzcy4gIFRoYXQgaXMsIHRoZSBwcm9jZXNzIGlzIGJlaW5nIGRlc3Ryb3llZC4KKyAqIFlvdSBzaG91bGQgaGFuZGxlIHRoaXMgYnkgZXhpdGluZyBmcm9tIHlvdXIgcHJvY2Vzcy4gIE5vdGUKKyAqIHRoYXQgb25jZSB0aGlzIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQsIGFsbCBmdXJ0aGVyIGNhbGxzIHRvCisgKiB0aGUgZHJpdmVyIGZyb20gYW55IHRocmVhZCB3aWxsIHJldHVybiB0aGlzIHNhbWUgY29kZS4KKyAqLworCitlbnVtIHRyYW5zYWN0aW9uX2ZsYWdzIHsKKwlURl9PTkVfV0FZCT0gMHgwMSwJLyogdGhpcyBpcyBhIG9uZS13YXkgY2FsbDogYXN5bmMsIG5vIHJldHVybiAqLworCVRGX1JPT1RfT0JKRUNUCT0gMHgwNCwJLyogY29udGVudHMgYXJlIHRoZSBjb21wb25lbnQncyByb290IG9iamVjdCAqLworCVRGX1NUQVRVU19DT0RFCT0gMHgwOCwJLyogY29udGVudHMgYXJlIGEgMzItYml0IHN0YXR1cyBjb2RlICovCisJVEZfQUNDRVBUX0ZEUwk9IDB4MTAsCS8qIGFsbG93IHJlcGxpZXMgd2l0aCBmaWxlIGRlc2NyaXB0b3JzICovCit9OworCitzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEgeworCS8qIFRoZSBmaXJzdCB0d28gYXJlIG9ubHkgdXNlZCBmb3IgYmNUUkFOU0FDVElPTiBhbmQgYnJUUkFOU0FDVElPTiwKKwkgKiBpZGVudGlmeWluZyB0aGUgdGFyZ2V0IGFuZCBjb250ZW50cyBvZiB0aGUgdHJhbnNhY3Rpb24uCisJICovCisJdW5pb24geworCQkvKiB0YXJnZXQgZGVzY3JpcHRvciBvZiBjb21tYW5kIHRyYW5zYWN0aW9uICovCisJCV9fdTMyCWhhbmRsZTsKKwkJLyogdGFyZ2V0IGRlc2NyaXB0b3Igb2YgcmV0dXJuIHRyYW5zYWN0aW9uICovCisJCWJpbmRlcl91aW50cHRyX3QgcHRyOworCX0gdGFyZ2V0OworCWJpbmRlcl91aW50cHRyX3QJY29va2llOwkvKiB0YXJnZXQgb2JqZWN0IGNvb2tpZSAqLworCV9fdTMyCQljb2RlOwkJLyogdHJhbnNhY3Rpb24gY29tbWFuZCAqLworCisJLyogR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNhY3Rpb24uICovCisJX191MzIJICAgICAgICBmbGFnczsKKwlwaWRfdAkJc2VuZGVyX3BpZDsKKwl1aWRfdAkJc2VuZGVyX2V1aWQ7CisJYmluZGVyX3NpemVfdAlkYXRhX3NpemU7CS8qIG51bWJlciBvZiBieXRlcyBvZiBkYXRhICovCisJYmluZGVyX3NpemVfdAlvZmZzZXRzX3NpemU7CS8qIG51bWJlciBvZiBieXRlcyBvZiBvZmZzZXRzICovCisKKwkvKiBJZiB0aGlzIHRyYW5zYWN0aW9uIGlzIGlubGluZSwgdGhlIGRhdGEgaW1tZWRpYXRlbHkKKwkgKiBmb2xsb3dzIGhlcmU7IG90aGVyd2lzZSwgaXQgZW5kcyB3aXRoIGEgcG9pbnRlciB0bworCSAqIHRoZSBkYXRhIGJ1ZmZlci4KKwkgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQkvKiB0cmFuc2FjdGlvbiBkYXRhICovCisJCQliaW5kZXJfdWludHB0cl90CWJ1ZmZlcjsKKwkJCS8qIG9mZnNldHMgZnJvbSBidWZmZXIgdG8gZmxhdF9iaW5kZXJfb2JqZWN0IHN0cnVjdHMgKi8KKwkJCWJpbmRlcl91aW50cHRyX3QJb2Zmc2V0czsKKwkJfSBwdHI7CisJCV9fdTgJYnVmWzhdOworCX0gZGF0YTsKK307CisKK3N0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSB7CisJYmluZGVyX3VpbnRwdHJfdCBwdHI7CisJYmluZGVyX3VpbnRwdHJfdCBjb29raWU7Cit9OworCitzdHJ1Y3QgYmluZGVyX2hhbmRsZV9jb29raWUgeworCV9fdTMyIGhhbmRsZTsKKwliaW5kZXJfdWludHB0cl90IGNvb2tpZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBiaW5kZXJfcHJpX2Rlc2MgeworCV9fczMyIHByaW9yaXR5OworCV9fdTMyIGRlc2M7Cit9OworCitzdHJ1Y3QgYmluZGVyX3ByaV9wdHJfY29va2llIHsKKwlfX3MzMiBwcmlvcml0eTsKKwliaW5kZXJfdWludHB0cl90IHB0cjsKKwliaW5kZXJfdWludHB0cl90IGNvb2tpZTsKK307CisKK2VudW0gYmluZGVyX2RyaXZlcl9yZXR1cm5fcHJvdG9jb2wgeworCUJSX0VSUk9SID0gX0lPUigncicsIDAsIF9fczMyKSwKKwkvKgorCSAqIGludDogZXJyb3IgY29kZQorCSAqLworCisJQlJfT0sgPSBfSU8oJ3InLCAxKSwKKwkvKiBObyBwYXJhbWV0ZXJzISAqLworCisJQlJfVFJBTlNBQ1RJT04gPSBfSU9SKCdyJywgMiwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhKSwKKwlCUl9SRVBMWSA9IF9JT1IoJ3InLCAzLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEpLAorCS8qCisJICogYmluZGVyX3RyYW5zYWN0aW9uX2RhdGE6IHRoZSByZWNlaXZlZCBjb21tYW5kLgorCSAqLworCisJQlJfQUNRVUlSRV9SRVNVTFQgPSBfSU9SKCdyJywgNCwgX19zMzIpLAorCS8qCisJICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKwkgKiBpbnQ6IDAgaWYgdGhlIGxhc3QgYmNBVFRFTVBUX0FDUVVJUkUgd2FzIG5vdCBzdWNjZXNzZnVsLgorCSAqIEVsc2UgdGhlIHJlbW90ZSBvYmplY3QgaGFzIGFjcXVpcmVkIGEgcHJpbWFyeSByZWZlcmVuY2UuCisJICovCisKKwlCUl9ERUFEX1JFUExZID0gX0lPKCdyJywgNSksCisJLyoKKwkgKiBUaGUgdGFyZ2V0IG9mIHRoZSBsYXN0IHRyYW5zYWN0aW9uIChlaXRoZXIgYSBiY1RSQU5TQUNUSU9OIG9yCisJICogYSBiY0FUVEVNUFRfQUNRVUlSRSkgaXMgbm8gbG9uZ2VyIHdpdGggdXMuICBObyBwYXJhbWV0ZXJzLgorCSAqLworCisJQlJfVFJBTlNBQ1RJT05fQ09NUExFVEUgPSBfSU8oJ3InLCA2KSwKKwkvKgorCSAqIE5vIHBhcmFtZXRlcnMuLi4gYWx3YXlzIHJlZmVycyB0byB0aGUgbGFzdCB0cmFuc2FjdGlvbiByZXF1ZXN0ZWQKKwkgKiAoaW5jbHVkaW5nIHJlcGxpZXMpLiAgTm90ZSB0aGF0IHRoaXMgd2lsbCBiZSBzZW50IGV2ZW4gZm9yCisJICogYXN5bmNocm9ub3VzIHRyYW5zYWN0aW9ucy4KKwkgKi8KKworCUJSX0lOQ1JFRlMgPSBfSU9SKCdyJywgNywgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwlCUl9BQ1FVSVJFID0gX0lPUigncicsIDgsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCisJQlJfUkVMRUFTRSA9IF9JT1IoJ3InLCA5LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAorCUJSX0RFQ1JFRlMgPSBfSU9SKCdyJywgMTAsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCisJLyoKKwkgKiB2b2lkICo6CXB0ciB0byBiaW5kZXIKKwkgKiB2b2lkICo6IGNvb2tpZSBmb3IgYmluZGVyCisJICovCisKKwlCUl9BVFRFTVBUX0FDUVVJUkUgPSBfSU9SKCdyJywgMTEsIHN0cnVjdCBiaW5kZXJfcHJpX3B0cl9jb29raWUpLAorCS8qCisJICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKwkgKiBpbnQ6CXByaW9yaXR5CisJICogdm9pZCAqOiBwdHIgdG8gYmluZGVyCisJICogdm9pZCAqOiBjb29raWUgZm9yIGJpbmRlcgorCSAqLworCisJQlJfTk9PUCA9IF9JTygncicsIDEyKSwKKwkvKgorCSAqIE5vIHBhcmFtZXRlcnMuICBEbyBub3RoaW5nIGFuZCBleGFtaW5lIHRoZSBuZXh0IGNvbW1hbmQuICBJdCBleGlzdHMKKwkgKiBwcmltYXJpbHkgc28gdGhhdCB3ZSBjYW4gcmVwbGFjZSBpdCB3aXRoIGEgQlJfU1BBV05fTE9PUEVSIGNvbW1hbmQuCisJICovCisKKwlCUl9TUEFXTl9MT09QRVIgPSBfSU8oJ3InLCAxMyksCisJLyoKKwkgKiBObyBwYXJhbWV0ZXJzLiAgVGhlIGRyaXZlciBoYXMgZGV0ZXJtaW5lZCB0aGF0IGEgcHJvY2VzcyBoYXMgbm8KKwkgKiB0aHJlYWRzIHdhaXRpbmcgdG8gc2VydmljZSBpbmNvbWluZyB0cmFuc2FjdGlvbnMuICBXaGVuIGEgcHJvY2VzcworCSAqIHJlY2VpdmVzIHRoaXMgY29tbWFuZCwgaXQgbXVzdCBzcGF3biBhIG5ldyBzZXJ2aWNlIHRocmVhZCBhbmQKKwkgKiByZWdpc3RlciBpdCB2aWEgYmNFTlRFUl9MT09QRVIuCisJICovCisKKwlCUl9GSU5JU0hFRCA9IF9JTygncicsIDE0KSwKKwkvKgorCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCisJICogc3RvcCB0aHJlYWRwb29sIHRocmVhZAorCSAqLworCisJQlJfREVBRF9CSU5ERVIgPSBfSU9SKCdyJywgMTUsIGJpbmRlcl91aW50cHRyX3QpLAorCS8qCisJICogdm9pZCAqOiBjb29raWUKKwkgKi8KKwlCUl9DTEVBUl9ERUFUSF9OT1RJRklDQVRJT05fRE9ORSA9IF9JT1IoJ3InLCAxNiwgYmluZGVyX3VpbnRwdHJfdCksCisJLyoKKwkgKiB2b2lkICo6IGNvb2tpZQorCSAqLworCisJQlJfRkFJTEVEX1JFUExZID0gX0lPKCdyJywgMTcpLAorCS8qCisJICogVGhlIHRoZSBsYXN0IHRyYW5zYWN0aW9uIChlaXRoZXIgYSBiY1RSQU5TQUNUSU9OIG9yCisJICogYSBiY0FUVEVNUFRfQUNRVUlSRSkgZmFpbGVkIChlLmcuIG91dCBvZiBtZW1vcnkpLiAgTm8gcGFyYW1ldGVycy4KKwkgKi8KK307CisKK2VudW0gYmluZGVyX2RyaXZlcl9jb21tYW5kX3Byb3RvY29sIHsKKwlCQ19UUkFOU0FDVElPTiA9IF9JT1coJ2MnLCAwLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEpLAorCUJDX1JFUExZID0gX0lPVygnYycsIDEsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCisJLyoKKwkgKiBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YTogdGhlIHNlbnQgY29tbWFuZC4KKwkgKi8KKworCUJDX0FDUVVJUkVfUkVTVUxUID0gX0lPVygnYycsIDIsIF9fczMyKSwKKwkvKgorCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCisJICogaW50OiAgMCBpZiB0aGUgbGFzdCBCUl9BVFRFTVBUX0FDUVVJUkUgd2FzIG5vdCBzdWNjZXNzZnVsLgorCSAqIEVsc2UgeW91IGhhdmUgYWNxdWlyZWQgYSBwcmltYXJ5IHJlZmVyZW5jZSBvbiB0aGUgb2JqZWN0LgorCSAqLworCisJQkNfRlJFRV9CVUZGRVIgPSBfSU9XKCdjJywgMywgYmluZGVyX3VpbnRwdHJfdCksCisJLyoKKwkgKiB2b2lkICo6IHB0ciB0byB0cmFuc2FjdGlvbiBkYXRhIHJlY2VpdmVkIG9uIGEgcmVhZAorCSAqLworCisJQkNfSU5DUkVGUyA9IF9JT1coJ2MnLCA0LCBfX3UzMiksCisJQkNfQUNRVUlSRSA9IF9JT1coJ2MnLCA1LCBfX3UzMiksCisJQkNfUkVMRUFTRSA9IF9JT1coJ2MnLCA2LCBfX3UzMiksCisJQkNfREVDUkVGUyA9IF9JT1coJ2MnLCA3LCBfX3UzMiksCisJLyoKKwkgKiBpbnQ6CWRlc2NyaXB0b3IKKwkgKi8KKworCUJDX0lOQ1JFRlNfRE9ORSA9IF9JT1coJ2MnLCA4LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAorCUJDX0FDUVVJUkVfRE9ORSA9IF9JT1coJ2MnLCA5LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAorCS8qCisJICogdm9pZCAqOiBwdHIgdG8gYmluZGVyCisJICogdm9pZCAqOiBjb29raWUgZm9yIGJpbmRlcgorCSAqLworCisJQkNfQVRURU1QVF9BQ1FVSVJFID0gX0lPVygnYycsIDEwLCBzdHJ1Y3QgYmluZGVyX3ByaV9kZXNjKSwKKwkvKgorCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCisJICogaW50OiBwcmlvcml0eQorCSAqIGludDogZGVzY3JpcHRvcgorCSAqLworCisJQkNfUkVHSVNURVJfTE9PUEVSID0gX0lPKCdjJywgMTEpLAorCS8qCisJICogTm8gcGFyYW1ldGVycy4KKwkgKiBSZWdpc3RlciBhIHNwYXduZWQgbG9vcGVyIHRocmVhZCB3aXRoIHRoZSBkZXZpY2UuCisJICovCisKKwlCQ19FTlRFUl9MT09QRVIgPSBfSU8oJ2MnLCAxMiksCisJQkNfRVhJVF9MT09QRVIgPSBfSU8oJ2MnLCAxMyksCisJLyoKKwkgKiBObyBwYXJhbWV0ZXJzLgorCSAqIFRoZXNlIHR3byBjb21tYW5kcyBhcmUgc2VudCBhcyBhbiBhcHBsaWNhdGlvbi1sZXZlbCB0aHJlYWQKKwkgKiBlbnRlcnMgYW5kIGV4aXRzIHRoZSBiaW5kZXIgbG9vcCwgcmVzcGVjdGl2ZWx5LiAgVGhleSBhcmUKKwkgKiB1c2VkIHNvIHRoZSBiaW5kZXIgY2FuIGhhdmUgYW4gYWNjdXJhdGUgY291bnQgb2YgdGhlIG51bWJlcgorCSAqIG9mIGxvb3BpbmcgdGhyZWFkcyBpdCBoYXMgYXZhaWxhYmxlLgorCSAqLworCisJQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04gPSBfSU9XKCdjJywgMTQsCisJCQkJCQlzdHJ1Y3QgYmluZGVyX2hhbmRsZV9jb29raWUpLAorCS8qCisJICogaW50OiBoYW5kbGUKKwkgKiB2b2lkICo6IGNvb2tpZQorCSAqLworCisJQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OID0gX0lPVygnYycsIDE1LAorCQkJCQkJc3RydWN0IGJpbmRlcl9oYW5kbGVfY29va2llKSwKKwkvKgorCSAqIGludDogaGFuZGxlCisJICogdm9pZCAqOiBjb29raWUKKwkgKi8KKworCUJDX0RFQURfQklOREVSX0RPTkUgPSBfSU9XKCdjJywgMTYsIGJpbmRlcl91aW50cHRyX3QpLAorCS8qCisJICogdm9pZCAqOiBjb29raWUKKwkgKi8KK307CisKKyNlbmRpZiAvKiBfVUFQSV9MSU5VWF9CSU5ERVJfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC91YXBpL3N3X3N5bmMuaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvc3dfc3luYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNWQ0ODYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC91YXBpL3N3X3N5bmMuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX1VBUElfTElOVVhfU1dfU1lOQ19ICisjZGVmaW5lIF9VQVBJX0xJTlVYX1NXX1NZTkNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IHN3X3N5bmNfY3JlYXRlX2ZlbmNlX2RhdGEgeworCV9fdTMyCXZhbHVlOworCWNoYXIJbmFtZVszMl07CisJX19zMzIJZmVuY2U7IC8qIGZkIG9mIG5ldyBmZW5jZSAqLworfTsKKworI2RlZmluZSBTV19TWU5DX0lPQ19NQUdJQwknVycKKworI2RlZmluZSBTV19TWU5DX0lPQ19DUkVBVEVfRkVOQ0UJX0lPV1IoU1dfU1lOQ19JT0NfTUFHSUMsIDAsXAorCQlzdHJ1Y3Qgc3dfc3luY19jcmVhdGVfZmVuY2VfZGF0YSkKKyNkZWZpbmUgU1dfU1lOQ19JT0NfSU5DCQkJX0lPVyhTV19TWU5DX0lPQ19NQUdJQywgMSwgX191MzIpCisKKyNlbmRpZiAvKiBfVUFQSV9MSU5VWF9TV19TWU5DX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvc3luYy5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9zeW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2NGM3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvc3luYy5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfVUFQSV9MSU5VWF9TWU5DX0gKKyNkZWZpbmUgX1VBUElfTElOVVhfU1lOQ19ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qKgorICogc3RydWN0IHN5bmNfbWVyZ2VfZGF0YSAtIGRhdGEgcGFzc2VkIHRvIG1lcmdlIGlvY3RsCisgKiBAZmQyOglmaWxlIGRlc2NyaXB0b3Igb2Ygc2Vjb25kIGZlbmNlCisgKiBAbmFtZToJbmFtZSBvZiBuZXcgZmVuY2UKKyAqIEBmZW5jZToJcmV0dXJucyB0aGUgZmQgb2YgdGhlIG5ldyBmZW5jZSB0byB1c2Vyc3BhY2UKKyAqLworc3RydWN0IHN5bmNfbWVyZ2VfZGF0YSB7CisJX19zMzIJZmQyOyAvKiBmZCBvZiBzZWNvbmQgZmVuY2UgKi8KKwljaGFyCW5hbWVbMzJdOyAvKiBuYW1lIG9mIG5ldyBmZW5jZSAqLworCV9fczMyCWZlbmNlOyAvKiBmZCBvbiBuZXdseSBjcmVhdGVkIGZlbmNlICovCit9OworCisvKioKKyAqIHN0cnVjdCBzeW5jX3B0X2luZm8gLSBkZXRhaWxlZCBzeW5jX3B0IGluZm9ybWF0aW9uCisgKiBAbGVuOgkJbGVuZ3RoIG9mIHN5bmNfcHRfaW5mbyBpbmNsdWRpbmcgYW55IGRyaXZlcl9kYXRhCisgKiBAb2JqX25hbWU6CQluYW1lIG9mIHBhcmVudCBzeW5jX3RpbWVsaW5lCisgKiBAZHJpdmVyX25hbWU6CW5hbWUgb2YgZHJpdmVyIGltcGxlbWVudGluZyB0aGUgcGFyZW50CisgKiBAc3RhdHVzOgkJc3RhdHVzIG9mIHRoZSBzeW5jX3B0IDA6YWN0aXZlIDE6c2lnbmFsZWQgPDA6ZXJyb3IKKyAqIEB0aW1lc3RhbXBfbnM6CXRpbWVzdGFtcCBvZiBzdGF0dXMgY2hhbmdlIGluIG5hbm9zZWNvbmRzCisgKiBAZHJpdmVyX2RhdGE6CWFueSBkcml2ZXIgZGVwZW5kZW50IGRhdGEKKyAqLworc3RydWN0IHN5bmNfcHRfaW5mbyB7CisJX191MzIJbGVuOworCWNoYXIJb2JqX25hbWVbMzJdOworCWNoYXIJZHJpdmVyX25hbWVbMzJdOworCV9fczMyCXN0YXR1czsKKwlfX3U2NAl0aW1lc3RhbXBfbnM7CisKKwlfX3U4CWRyaXZlcl9kYXRhWzBdOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc3luY19mZW5jZV9pbmZvX2RhdGEgLSBkYXRhIHJldHVybmVkIGZyb20gZmVuY2UgaW5mbyBpb2N0bAorICogQGxlbjoJaW9jdGwgY2FsbGVyIHdyaXRlcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGl0cyBwYXNzaW5nIGluLgorICoJCWlvY3RsIHJldHVybnMgbGVuZ3RoIG9mIHN5bmNfZmVuY2VfZGF0YSByZXR1cm5lZCB0byB1c2Vyc3BhY2UKKyAqCQlpbmNsdWRpbmcgcHRfaW5mby4KKyAqIEBuYW1lOgluYW1lIG9mIGZlbmNlCisgKiBAc3RhdHVzOglzdGF0dXMgb2YgZmVuY2UuIDE6IHNpZ25hbGVkIDA6YWN0aXZlIDwwOmVycm9yCisgKiBAcHRfaW5mbzoJYSBzeW5jX3B0X2luZm8gc3RydWN0IGZvciBldmVyeSBzeW5jX3B0IGluIHRoZSBmZW5jZQorICovCitzdHJ1Y3Qgc3luY19mZW5jZV9pbmZvX2RhdGEgeworCV9fdTMyCWxlbjsKKwljaGFyCW5hbWVbMzJdOworCV9fczMyCXN0YXR1czsKKworCV9fdTgJcHRfaW5mb1swXTsKK307CisKKyNkZWZpbmUgU1lOQ19JT0NfTUFHSUMJCSc+JworCisvKioKKyAqIERPQzogU1lOQ19JT0NfV0FJVCAtIHdhaXQgZm9yIGEgZmVuY2UgdG8gc2lnbmFsCisgKgorICogcGFzcyB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gIFdhaXRzIGluZGVmaW5pdGVseSB0aW1lb3V0IDwgMC4KKyAqLworI2RlZmluZSBTWU5DX0lPQ19XQUlUCQlfSU9XKFNZTkNfSU9DX01BR0lDLCAwLCBfX3MzMikKKworLyoqCisgKiBET0M6IFNZTkNfSU9DX01FUkdFIC0gbWVyZ2UgdHdvIGZlbmNlcworICoKKyAqIFRha2VzIGEgc3RydWN0IHN5bmNfbWVyZ2VfZGF0YS4gIENyZWF0ZXMgYSBuZXcgZmVuY2UgY29udGFpbmluZyBjb3BpZXMgb2YKKyAqIHRoZSBzeW5jX3B0cyBpbiBib3RoIHRoZSBjYWxsaW5nIGZkIGFuZCBzeW5jX21lcmdlX2RhdGEuZmQyLiAgUmV0dXJucyB0aGUKKyAqIG5ldyBmZW5jZSdzIGZkIGluIHN5bmNfbWVyZ2VfZGF0YS5mZW5jZQorICovCisjZGVmaW5lIFNZTkNfSU9DX01FUkdFCQlfSU9XUihTWU5DX0lPQ19NQUdJQywgMSwgc3RydWN0IHN5bmNfbWVyZ2VfZGF0YSkKKworLyoqCisgKiBET0M6IFNZTkNfSU9DX0ZFTkNFX0lORk8gLSBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gYSBmZW5jZQorICoKKyAqIFRha2VzIGEgc3RydWN0IHN5bmNfZmVuY2VfaW5mb19kYXRhIHdpdGggZXh0cmEgc3BhY2UgYWxsb2NhdGVkIGZvciBwdF9pbmZvLgorICogQ2FsbGVyIHNob3VsZCB3cml0ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGludG8gbGVuLiAgT24gcmV0dXJuLCBsZW4gaXMKKyAqIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgc3luY19mZW5jZV9pbmZvX2RhdGEgaW5jbHVkaW5nCisgKiBwdF9pbmZvLgorICoKKyAqIHB0X2luZm8gaXMgYSBidWZmZXIgY29udGFpbmluZyBzeW5jX3B0X2luZm9zIGZvciBldmVyeSBzeW5jX3B0IGluIHRoZSBmZW5jZS4KKyAqIFRvIGl0ZXJhdGUgb3ZlciB0aGUgc3luY19wdF9pbmZvcywgdXNlIHRoZSBzeW5jX3B0X2luZm8ubGVuIGZpZWxkLgorICovCisjZGVmaW5lIFNZTkNfSU9DX0ZFTkNFX0lORk8JX0lPV1IoU1lOQ19JT0NfTUFHSUMsIDIsXAorCXN0cnVjdCBzeW5jX2ZlbmNlX2luZm9fZGF0YSkKKworI2VuZGlmIC8qIF9VQVBJX0xJTlVYX1NZTkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9BZGFwdGVyLmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0FkYXB0ZXIuaAppbmRleCBmMGQ2ZjBjLi4xYjJkOWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0FkYXB0ZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0FkYXB0ZXIuaApAQCAtMzcsOCArMzcsMTAgQEAKIAogdW5pb24gdV9pcF9hZGRyZXNzIHsKIAlzdHJ1Y3QgewotCQlVTE9ORyB1bElwdjRBZGRyW01BWF9JUF9SQU5HRV9MRU5HVEhdOyAvKiBTb3VyY2UgSXAgQWRkcmVzcyBSYW5nZSAqLwotCQlVTE9ORyB1bElwdjRNYXNrW01BWF9JUF9SQU5HRV9MRU5HVEhdOyAvKiBTb3VyY2UgSXAgTWFzayBBZGRyZXNzIFJhbmdlICovCisJCS8qIFNvdXJjZSBJcCBBZGRyZXNzIFJhbmdlICovCisJCVVMT05HIHVsSXB2NEFkZHJbTUFYX0lQX1JBTkdFX0xFTkdUSF07CisJCSAvKiBTb3VyY2UgSXAgTWFzayBBZGRyZXNzIFJhbmdlICovCisJCVVMT05HIHVsSXB2NE1hc2tbTUFYX0lQX1JBTkdFX0xFTkdUSF07CiAJfTsKIAlzdHJ1Y3QgewogCQlVTE9ORyB1bElwdjZBZGRyW01BWF9JUF9SQU5HRV9MRU5HVEggKiA0XTsgLyogU291cmNlIElwIEFkZHJlc3MgUmFuZ2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQmNtY2hhci5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9CY21jaGFyLmMKaW5kZXggZjFiNmRlMC4uYWU3NDkwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9CY21jaGFyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9CY21jaGFyLmMKQEAgLTE1MCwxNSArMTUwLDIxNDYgQEAKIAlyZXR1cm4gUGt0TGVuOwogfQogCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX3JlZ19yZWFkX3ByaXZhdGUodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9yZG1fYnVmZmVyIHNSZG1CdWZmZXIgPSB7MH07CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJUENIQVIgdGVtcF9idWZmOworCUlOVCBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKwlVSU5UIEJ1ZmZsZW47CisJdTE2IHRlbXBfdmFsdWU7CisJaW50IGJ5dGVzOworCisJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKHNSZG1CdWZmZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc1JkbUJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCUlvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoID4gVVNIUlRfTUFYIHx8CisJCUlvQnVmZmVyLk91dHB1dExlbmd0aCA9PSAwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCUJ1ZmZsZW4gPSBJb0J1ZmZlci5PdXRwdXRMZW5ndGg7CisJdGVtcF92YWx1ZSA9IDQgLSAoQnVmZmxlbiAlIDQpOworCUJ1ZmZsZW4gKz0gdGVtcF92YWx1ZSAlIDQ7CisKKwl0ZW1wX2J1ZmYgPSBrbWFsbG9jKEJ1ZmZsZW4sIEdGUF9LRVJORUwpOworCWlmICghdGVtcF9idWZmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJ5dGVzID0gcmRtYWx0KEFkYXB0ZXIsIChVSU5UKXNSZG1CdWZmZXIuUmVnaXN0ZXIsCisJCQkoUFVJTlQpdGVtcF9idWZmLCBCdWZmbGVuKTsKKwlpZiAoYnl0ZXMgPiAwKSB7CisJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgdGVtcF9idWZmLCBieXRlcykpIHsKKwkJCWtmcmVlKHRlbXBfYnVmZik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZSB7CisJCVN0YXR1cyA9IGJ5dGVzOworCX0KKworCWtmcmVlKHRlbXBfYnVmZik7CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9yZWdfd3JpdGVfcHJpdmF0ZSh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX3dybV9idWZmZXIgc1dybUJ1ZmZlciA9IHswfTsKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlVSU5UIHVpVGVtcFZhciA9IDA7CisJSU5UIFN0YXR1czsKKworCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKHNXcm1CdWZmZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEdldCBXcm1CdWZmZXIgc3RydWN0dXJlICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzV3JtQnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKKwkJSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXVpVGVtcFZhciA9IHNXcm1CdWZmZXIuUmVnaXN0ZXIgJiBFRVBST01fUkVKRUNUX01BU0s7CisJaWYgKCEoKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkN1c3RvbWl6ZSkgJiBWU0dfTU9ERSkgJiYKKwkJKCh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMSkgfHwKKwkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMikgfHwKKwkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMykgfHwKKwkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfNCkpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiRUVQUk9NIEFjY2VzcyBEZW5pZWQsIG5vdCBpbiBWU0cgTW9kZVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCVN0YXR1cyA9IHdybWFsdChBZGFwdGVyLCAoVUlOVClzV3JtQnVmZmVyLlJlZ2lzdGVyLAorCQkJKFBVSU5UKXNXcm1CdWZmZXIuRGF0YSwgc2l6ZW9mKFVMT05HKSk7CisKKwlpZiAoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQkJCURCR19MVkxfQUxMLCAiV1JNIERvbmVcbiIpOworCX0gZWxzZSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQkJCURCR19MVkxfQUxMLCAiV1JNIEZhaWxlZFxuIik7CisJCVN0YXR1cyA9IC1FRkFVTFQ7CisJfQorCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZWVwcm9tX3JlZ19yZWFkKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21fcmRtX2J1ZmZlciBzUmRtQnVmZmVyID0gezB9OworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCVBDSEFSIHRlbXBfYnVmZiA9IE5VTEw7CisJVUlOVCB1aVRlbXBWYXIgPSAwOworCUlOVCBTdGF0dXM7CisJaW50IGJ5dGVzOworCisJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKKworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJEZXZpY2UgaW4gSWRsZSBNb2RlLCBCbG9ja2luZyBSZG1zXG4iKTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKHNSZG1CdWZmZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc1JkbUJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCUlvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoID4gVVNIUlRfTUFYIHx8CisJCUlvQnVmZmVyLk91dHB1dExlbmd0aCA9PSAwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRlbXBfYnVmZiA9IGttYWxsb2MoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRlbXBfYnVmZikKKwkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCisJaWYgKCgoKFVMT05HKXNSZG1CdWZmZXIuUmVnaXN0ZXIgJiAweDBGMDAwMDAwKSAhPSAweDBGMDAwMDAwKSB8fAorCQkoKFVMT05HKXNSZG1CdWZmZXIuUmVnaXN0ZXIgJiAweDMpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiUkRNIERvbmUgT24gaW52YWxpZCBBZGRyZXNzIDogJXggQWNjZXNzIERlbmllZC5cbiIsCisJCQkJKGludClzUmRtQnVmZmVyLlJlZ2lzdGVyKTsKKworCQlrZnJlZSh0ZW1wX2J1ZmYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl1aVRlbXBWYXIgPSBzUmRtQnVmZmVyLlJlZ2lzdGVyICYgRUVQUk9NX1JFSkVDVF9NQVNLOworCWJ5dGVzID0gcmRtYWx0V2l0aExvY2soQWRhcHRlciwgKFVJTlQpc1JkbUJ1ZmZlci5SZWdpc3RlciwKKwkJCSAgICAgICAoUFVJTlQpdGVtcF9idWZmLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgpOworCisJaWYgKGJ5dGVzID4gMCkgeworCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKwkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHRlbXBfYnVmZiwgYnl0ZXMpKSB7CisJCQlrZnJlZSh0ZW1wX2J1ZmYpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9IGVsc2UgeworCQlTdGF0dXMgPSBieXRlczsKKwl9CisKKwlrZnJlZSh0ZW1wX2J1ZmYpOworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZWVwcm9tX3JlZ193cml0ZSh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgVUlOVCBjbWQpCit7CisJc3RydWN0IGJjbV93cm1fYnVmZmVyIHNXcm1CdWZmZXIgPSB7MH07CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJVUlOVCB1aVRlbXBWYXIgPSAwOworCUlOVCBTdGF0dXM7CisKKwlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJIkRldmljZSBpbiBJZGxlIE1vZGUsIEJsb2NraW5nIFdybXNcbiIpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1dybUJ1ZmZlcikpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogR2V0IFdybUJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJnNXcm1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLAorCQlJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCgoKFVMT05HKXNXcm1CdWZmZXIuUmVnaXN0ZXIgJiAweDBGMDAwMDAwKSAhPSAweDBGMDAwMDAwKSB8fAorCQkoKFVMT05HKXNXcm1CdWZmZXIuUmVnaXN0ZXIgJiAweDMpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiV1JNIERvbmUgT24gaW52YWxpZCBBZGRyZXNzIDogJXggQWNjZXNzIERlbmllZC5cbiIsCisJCQkJKGludClzV3JtQnVmZmVyLlJlZ2lzdGVyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdWlUZW1wVmFyID0gc1dybUJ1ZmZlci5SZWdpc3RlciAmIEVFUFJPTV9SRUpFQ1RfTUFTSzsKKwlpZiAoISgoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyQ3VzdG9taXplKSAmIFZTR19NT0RFKSAmJgorCQkJKCh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMSkgfHwKKwkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMikgfHwKKwkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMykgfHwKKwkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfNCkpICYmCisJCQkoY21kID09IElPQ1RMX0JDTV9SRUdJU1RFUl9XUklURSkpIHsKKworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkJIkVFUFJPTSBBY2Nlc3MgRGVuaWVkLCBub3QgaW4gVlNHIE1vZGVcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJU3RhdHVzID0gd3JtYWx0V2l0aExvY2soQWRhcHRlciwgKFVJTlQpc1dybUJ1ZmZlci5SZWdpc3RlciwKKwkJCQkoUFVJTlQpc1dybUJ1ZmZlci5EYXRhLAorCQkJCXNXcm1CdWZmZXIuTGVuZ3RoKTsKKworCWlmIChTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgT1NBTF9EQkcsCisJCQkJREJHX0xWTF9BTEwsICJXUk0gRG9uZVxuIik7CisJfSBlbHNlIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCisJCQkJREJHX0xWTF9BTEwsICJXUk0gRmFpbGVkXG4iKTsKKwkJU3RhdHVzID0gLUVGQVVMVDsKKwl9CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9ncGlvX3NldF9yZXF1ZXN0KHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21fZ3Bpb19pbmZvIGdwaW9faW5mbyA9IHswfTsKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlVQ0hBUiB1Y1Jlc2V0VmFsdWVbNF07CisJVUlOVCB2YWx1ZSA9IDA7CisJVUlOVCB1aUJpdCA9IDA7CisJVUlOVCB1aU9wZXJhdGlvbiA9IDA7CisJSU5UIFN0YXR1czsKKwlpbnQgYnl0ZXM7CisKKwlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQkJCURCR19MVkxfQUxMLAorCQkJCSJHUElPIENhbid0IGJlIHNldC9jbGVhciBpbiBMb3cgcG93ZXIgTW9kZSIpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2YoZ3Bpb19pbmZvKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmdwaW9faW5mbywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl1aUJpdCAgPSBncGlvX2luZm8udWlHcGlvTnVtYmVyOworCXVpT3BlcmF0aW9uID0gZ3Bpb19pbmZvLnVpR3Bpb1ZhbHVlOworCXZhbHVlID0gKDE8PHVpQml0KTsKKworCWlmIChJc1JlcUdwaW9Jc0xlZEluTlZNKEFkYXB0ZXIsIHZhbHVlKSA9PSBmYWxzZSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJCQlEQkdfTFZMX0FMTCwKKwkJCQkiU29ycnksIFJlcXVlc3RlZCBHUElPPDB4JVg+IGlzIG5vdCBjb3JyZXNwb25kIHRvIExFRCAhISEiLAorCQkJCXZhbHVlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2V0IC0gc2V0dGluZyAxICovCisJaWYgKHVpT3BlcmF0aW9uKSB7CisJCS8qIFNldCB0aGUgZ3BpbyBvdXRwdXQgcmVnaXN0ZXIgKi8KKwkJU3RhdHVzID0gd3JtYWx0V2l0aExvY2soQWRhcHRlciwKKwkJCQkJQkNNX0dQSU9fT1VUUFVUX1NFVF9SRUcsCisJCQkJCShQVUlOVCkoJnZhbHVlKSwgc2l6ZW9mKFVJTlQpKTsKKworCQlpZiAoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAorCQkJCQlPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJCSJTZXQgdGhlIEdQSU8gYml0XG4iKTsKKwkJfSBlbHNlIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsCisJCQkJCU9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkJIkZhaWxlZCB0byBzZXQgdGhlICVkdGggR1BJT1xuIiwKKwkJCQkJdWlCaXQpOworCQkJcmV0dXJuIFN0YXR1czsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFNldCB0aGUgZ3BpbyBvdXRwdXQgcmVnaXN0ZXIgKi8KKwkJU3RhdHVzID0gd3JtYWx0V2l0aExvY2soQWRhcHRlciwKKwkJCQkJQkNNX0dQSU9fT1VUUFVUX0NMUl9SRUcsCisJCQkJCShQVUlOVCkoJnZhbHVlKSwgc2l6ZW9mKFVJTlQpKTsKKworCQlpZiAoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAorCQkJCQlPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJCSJTZXQgdGhlIEdQSU8gYml0XG4iKTsKKwkJfSBlbHNlIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsCisJCQkJCU9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkJIkZhaWxlZCB0byBjbGVhciB0aGUgJWR0aCBHUElPXG4iLAorCQkJCQl1aUJpdCk7CisJCQlyZXR1cm4gU3RhdHVzOworCQl9CisJfQorCisJYnl0ZXMgPSByZG1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClHUElPX01PREVfUkVHSVNURVIsCisJCQkgICAgICAgKFBVSU5UKXVjUmVzZXRWYWx1ZSwgc2l6ZW9mKFVJTlQpKTsKKwlpZiAoYnl0ZXMgPCAwKSB7CisJCVN0YXR1cyA9IGJ5dGVzOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJIkdQSU9fTU9ERV9SRUdJU1RFUiByZWFkIGZhaWxlZCIpOworCQlyZXR1cm4gU3RhdHVzOworCX0gZWxzZSB7CisJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCX0KKworCS8qIFNldCB0aGUgZ3BpbyBtb2RlIHJlZ2lzdGVyIHRvIG91dHB1dCAqLworCSooVUlOVCAqKXVjUmVzZXRWYWx1ZSB8PSAoMTw8dWlCaXQpOworCVN0YXR1cyA9IHdybWFsdFdpdGhMb2NrKEFkYXB0ZXIsIEdQSU9fTU9ERV9SRUdJU1RFUiwKKwkJCQkoUFVJTlQpdWNSZXNldFZhbHVlLCBzaXplb2YoVUlOVCkpOworCisJaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJCQlEQkdfTFZMX0FMTCwKKwkJCQkiU2V0IHRoZSBHUElPIHRvIG91dHB1dCBNb2RlXG4iKTsKKwl9IGVsc2UgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJCQlEQkdfTFZMX0FMTCwKKwkJCQkiRmFpbGVkIHRvIHB1dCBHUElPIGluIE91dHB1dCBNb2RlXG4iKTsKKwl9CisKKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2xlZF90aHJlYWRfc3RhdGVfY2hhbmdlX3JlcSh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX3VzZXJfdGhyZWFkX3JlcSB0aHJlYWRSZXEgPSB7MH07CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkiVXNlciBtYWRlIExFRCB0aHJlYWQgSW5BY3RpdmUiKTsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCisJCQkJREJHX0xWTF9BTEwsCisJCQkJIkdQSU8gQ2FuJ3QgYmUgc2V0L2NsZWFyIGluIExvdyBwb3dlciBNb2RlIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZih0aHJlYWRSZXEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdGhyZWFkUmVxLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIGlmIExFRCB0aHJlYWQgaXMgcnVubmluZyhBY3RpdmVseSBvciBJbmFjdGl2ZWx5KQorCSAqIHNldCBpdCBzdGF0ZSB0byBtYWtlIGluYWN0aXZlCisJICovCisJaWYgKEFkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nKSB7CisJCWlmICh0aHJlYWRSZXEuVGhyZWFkU3RhdGUgPT0gTEVEX1RIUkVBRF9BQ1RJVkFUSU9OX1JFUSkgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKKwkJCQkJT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJCQkiQWN0aXZhdGluZyB0aHJlYWQgcmVxIik7CisJCQlBZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IExFRF9USFJFQURfQUNUSVZFOworCQl9IGVsc2UgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKKwkJCQkJT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJCQkiRGVBY3RpdmF0aW5nIFRocmVhZCByZXEuLi4uLiIpOworCQkJQWRhcHRlci0+RHJpdmVyU3RhdGUgPSBMRURfVEhSRUFEX0lOQUNUSVZFOworCQl9CisKKwkJLyogc2lnbmFsIHRocmVhZC4gKi8KKwkJd2FrZV91cCgmQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKKwl9CisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2dwaW9fc3RhdHVzX3JlcXVlc3Qodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9ncGlvX2luZm8gZ3Bpb19pbmZvID0gezB9OworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCVVMT05HIHVpQml0ID0gMDsKKwlVQ0hBUiB1Y1JlYWRbNF07CisJSU5UIFN0YXR1czsKKwlpbnQgYnl0ZXM7CisKKwlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2YoZ3Bpb19pbmZvKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmdwaW9faW5mbywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCUlvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl1aUJpdCA9IGdwaW9faW5mby51aUdwaW9OdW1iZXI7CisKKwkvKiBTZXQgdGhlIGdwaW8gb3V0cHV0IHJlZ2lzdGVyICovCisJYnl0ZXMgPSByZG1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClHUElPX1BJTl9TVEFURV9SRUdJU1RFUiwKKwkJCQkoUFVJTlQpdWNSZWFkLCBzaXplb2YoVUlOVCkpOworCisJaWYgKGJ5dGVzIDwgMCkgeworCQlTdGF0dXMgPSBieXRlczsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiUkRNIEZhaWxlZFxuIik7CisJCXJldHVybiBTdGF0dXM7CisJfSBlbHNlIHsKKwkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJfQorCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZ3Bpb19tdWx0aV9yZXF1ZXN0KHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21fZ3Bpb19tdWx0aV9pbmZvIGdwaW9fbXVsdGlfaW5mb1tNQVhfSURYXTsKKwlzdHJ1Y3QgYmNtX2dwaW9fbXVsdGlfaW5mbyAqcGdwaW9fbXVsdGlfaW5mbyA9CisJCShzdHJ1Y3QgYmNtX2dwaW9fbXVsdGlfaW5mbyAqKWdwaW9fbXVsdGlfaW5mbzsKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlVQ0hBUiB1Y1Jlc2V0VmFsdWVbNF07CisJSU5UIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCWludCBieXRlczsKKworCW1lbXNldChwZ3Bpb19tdWx0aV9pbmZvLCAwLCBNQVhfSURYICogc2l6ZW9mKHN0cnVjdCBiY21fZ3Bpb19tdWx0aV9pbmZvKSk7CisKKwlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2YoZ3Bpb19tdWx0aV9pbmZvKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKElvQnVmZmVyLk91dHB1dExlbmd0aCA+IHNpemVvZihncGlvX211bHRpX2luZm8pKQorCQlJb0J1ZmZlci5PdXRwdXRMZW5ndGggPSBzaXplb2YoZ3Bpb19tdWx0aV9pbmZvKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZ3Bpb19tdWx0aV9pbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKKwkJSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJc1JlcUdwaW9Jc0xlZEluTlZNKEFkYXB0ZXIsCisJCXBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9NYXNrKSA9PSBmYWxzZSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJCQlEQkdfTFZMX0FMTCwKKwkJCQkiU29ycnksIFJlcXVlc3RlZCBHUElPPDB4JVg+IGlzIG5vdCBjb3JyZXNwb25kIHRvIE5WTSBMRUQgYml0IG1hcDwweCVYPiEhISIsCisJCQkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2ssCisJCQkJQWRhcHRlci0+Z3Bpb0JpdE1hcCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFNldCB0aGUgZ3BpbyBvdXRwdXQgcmVnaXN0ZXIgKi8KKwlpZiAoKHBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9NYXNrKSAmCisJCShwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPQ29tbWFuZCkpIHsKKwkJLyogU2V0IDEncyBpbiBHUElPIE9VVFBVVCBSRUdJU1RFUiAqLworCQkqKFVJTlQgKil1Y1Jlc2V0VmFsdWUgPSAgcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2sgJgorCQkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT0NvbW1hbmQgJgorCQkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT1ZhbHVlOworCisJCWlmICgqKFVJTlQgKikgdWNSZXNldFZhbHVlKQorCQkJU3RhdHVzID0gd3JtYWx0V2l0aExvY2soQWRhcHRlciwKKwkJCQlCQ01fR1BJT19PVVRQVVRfU0VUX1JFRywKKwkJCQkoUFVJTlQpdWNSZXNldFZhbHVlLCBzaXplb2YoVUxPTkcpKTsKKworCQlpZiAoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJXUk0gdG8gQkNNX0dQSU9fT1VUUFVUX1NFVF9SRUcgRmFpbGVkLiIpOworCQkJcmV0dXJuIFN0YXR1czsKKwkJfQorCisJCS8qIENsZWFyIHRvIDAncyBpbiBHUElPIE9VVFBVVCBSRUdJU1RFUiAqLworCQkqKFVJTlQgKil1Y1Jlc2V0VmFsdWUgPSAocGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2sgJgorCQkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT0NvbW1hbmQgJgorCQkJKH4ocGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT1ZhbHVlKSkpOworCisJCWlmICgqKFVJTlQgKikgdWNSZXNldFZhbHVlKQorCQkJU3RhdHVzID0gd3JtYWx0V2l0aExvY2soQWRhcHRlciwKKwkJCQlCQ01fR1BJT19PVVRQVVRfQ0xSX1JFRywgKFBVSU5UKXVjUmVzZXRWYWx1ZSwKKwkJCQlzaXplb2YoVUxPTkcpKTsKKworCQlpZiAoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCQkiV1JNIHRvIEJDTV9HUElPX09VVFBVVF9DTFJfUkVHIEZhaWxlZC4iKTsKKwkJCXJldHVybiBTdGF0dXM7CisJCX0KKwl9CisKKwlpZiAocGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2spIHsKKwkJYnl0ZXMgPSByZG1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClHUElPX1BJTl9TVEFURV9SRUdJU1RFUiwKKwkJCShQVUlOVCl1Y1Jlc2V0VmFsdWUsIHNpemVvZihVSU5UKSk7CisKKwkJaWYgKGJ5dGVzIDwgMCkgeworCQkJU3RhdHVzID0gYnl0ZXM7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCQkiUkRNIHRvIEdQSU9fUElOX1NUQVRFX1JFR0lTVEVSIEZhaWxlZC4iKTsKKwkJCXJldHVybiBTdGF0dXM7CisJCX0gZWxzZSB7CisJCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKwkJfQorCisJCXBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9WYWx1ZSA9ICgqKFVJTlQgKil1Y1Jlc2V0VmFsdWUgJgorCQkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2spOworCX0KKworCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZncGlvX211bHRpX2luZm8sCisJCUlvQnVmZmVyLk91dHB1dExlbmd0aCk7CisJaWYgKFN0YXR1cykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkZhaWxlZCB3aGlsZSBjb3B5aW5nIENvbnRlbnQgdG8gSU9CdWZlciBmb3IgdXNlciBzcGFjZSBlcnI6JWQiLAorCQkJU3RhdHVzKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZ3Bpb19tb2RlX3JlcXVlc3Qodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9ncGlvX211bHRpX21vZGUgZ3Bpb19tdWx0aV9tb2RlW01BWF9JRFhdOworCXN0cnVjdCBiY21fZ3Bpb19tdWx0aV9tb2RlICpwZ3Bpb19tdWx0aV9tb2RlID0KKwkJKHN0cnVjdCBiY21fZ3Bpb19tdWx0aV9tb2RlICopZ3Bpb19tdWx0aV9tb2RlOworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCVVDSEFSIHVjUmVzZXRWYWx1ZVs0XTsKKwlJTlQgU3RhdHVzOworCWludCBieXRlczsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihncGlvX211bHRpX21vZGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9fbXVsdGlfbW9kZSkpCisJCUlvQnVmZmVyLk91dHB1dExlbmd0aCA9IHNpemVvZihncGlvX211bHRpX21vZGUpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZncGlvX211bHRpX21vZGUsIElvQnVmZmVyLklucHV0QnVmZmVyLAorCQlJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCXJldHVybiAtRUZBVUxUOworCisJYnl0ZXMgPSByZG1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClHUElPX01PREVfUkVHSVNURVIsCisJCShQVUlOVCl1Y1Jlc2V0VmFsdWUsIHNpemVvZihVSU5UKSk7CisKKwlpZiAoYnl0ZXMgPCAwKSB7CisJCVN0YXR1cyA9IGJ5dGVzOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIlJlYWQgb2YgR1BJT19NT0RFX1JFR0lTVEVSIGZhaWxlZCIpOworCQlyZXR1cm4gU3RhdHVzOworCX0gZWxzZSB7CisJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCX0KKworCS8qIFZhbGlkYXRpbmcgdGhlIHJlcXVlc3QgKi8KKwlpZiAoSXNSZXFHcGlvSXNMZWRJbk5WTShBZGFwdGVyLAorCQlwZ3Bpb19tdWx0aV9tb2RlW1dJTUFYX0lEWF0udWlHUElPTWFzaykgPT0gZmFsc2UpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJCSJTb3JyeSwgUmVxdWVzdGVkIEdQSU88MHglWD4gaXMgbm90IGNvcnJlc3BvbmQgdG8gTlZNIExFRCBiaXQgbWFwPDB4JVg+ISEhIiwKKwkJCQlwZ3Bpb19tdWx0aV9tb2RlW1dJTUFYX0lEWF0udWlHUElPTWFzaywKKwkJCQlBZGFwdGVyLT5ncGlvQml0TWFwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9NYXNrKSB7CisJCS8qIHdyaXRlIGFsbCBPVVQncyAoMSdzKSAqLworCQkqKFVJTlQgKikgdWNSZXNldFZhbHVlIHw9IChwZ3Bpb19tdWx0aV9tb2RlW1dJTUFYX0lEWF0udWlHUElPTW9kZSAmCisJCQkJCXBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9NYXNrKTsKKworCQkvKiB3cml0ZSBhbGwgSU4ncyAoMCdzKSAqLworCQkqKFVJTlQgKikgdWNSZXNldFZhbHVlICY9IH4oKH5wZ3Bpb19tdWx0aV9tb2RlW1dJTUFYX0lEWF0udWlHUElPTW9kZSkgJgorCQkJCQlwZ3Bpb19tdWx0aV9tb2RlW1dJTUFYX0lEWF0udWlHUElPTWFzayk7CisKKwkJLyogQ3VycmVudGx5IGltcGxlbWVudGVkIHJldHVybiB0aGUgbW9kZXMgb2YgYWxsIEdQSU8ncworCQkgKiBlbHNlIG5lZWRzIHRvIGJpdCBBTkQgd2l0aCAgbWFzaworCQkgKi8KKwkJcGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01vZGUgPSAqKFVJTlQgKil1Y1Jlc2V0VmFsdWU7CisKKwkJU3RhdHVzID0gd3JtYWx0V2l0aExvY2soQWRhcHRlciwgR1BJT19NT0RFX1JFR0lTVEVSLAorCQkJKFBVSU5UKXVjUmVzZXRWYWx1ZSwgc2l6ZW9mKFVMT05HKSk7CisJCWlmIChTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLAorCQkJCURCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJCSJXUk0gdG8gR1BJT19NT0RFX1JFR0lTVEVSIERvbmUiKTsKKwkJfSBlbHNlIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJCSJXUk0gdG8gR1BJT19NT0RFX1JFR0lTVEVSIEZhaWxlZCIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9IGVsc2UgeworCQkvKiBpZiB1aUdQSU9NYXNrIGlzIDAgdGhlbiByZXR1cm4gbW9kZSByZWdpc3RlciBjb25maWd1cmF0aW9uICovCisJCXBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9Nb2RlID0gKihVSU5UICopdWNSZXNldFZhbHVlOworCX0KKworCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZncGlvX211bHRpX21vZGUsCisJCUlvQnVmZmVyLk91dHB1dExlbmd0aCk7CisJaWYgKFN0YXR1cykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkZhaWxlZCB3aGlsZSBjb3B5aW5nIENvbnRlbnQgdG8gSU9CdWZlciBmb3IgdXNlciBzcGFjZSBlcnI6JWQiLAorCQkJU3RhdHVzKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfbWlzY19yZXF1ZXN0KHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCVBWT0lEIHB2QnVmZmVyID0gTlVMTDsKKwlJTlQgU3RhdHVzOworCisJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBiY21fbGlua19yZXF1ZXN0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBNQVhfQ05UTF9QS1RfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwdkJ1ZmZlciA9IG1lbWR1cF91c2VyKElvQnVmZmVyLklucHV0QnVmZmVyLAorCQkJICAgICAgIElvQnVmZmVyLklucHV0TGVuZ3RoKTsKKwlpZiAoSVNfRVJSKHB2QnVmZmVyKSkKKwkJcmV0dXJuIFBUUl9FUlIocHZCdWZmZXIpOworCisJZG93bigmQWRhcHRlci0+TG93UG93ZXJNb2RlU3luYyk7CisJU3RhdHVzID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoQWRhcHRlci0+bG93cG93ZXJfbW9kZV93YWl0X3F1ZXVlLAorCQkhQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSwKKwkJKDEgKiBIWikpOworCWlmIChTdGF0dXMgPT0gLUVSRVNUQVJUU1lTKQorCQlnb3RvIGNudHJsRW5kOworCisJaWYgKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJCSJQcmVwYXJpbmcgSWRsZSBNb2RlIGlzIHN0aWxsIFRydWUgLSBIZW5jZSBSZWplY3RpbmcgY29udHJvbCBtZXNzYWdlXG4iKTsKKwkJU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisJCWdvdG8gY250cmxFbmQ7CisJfQorCVN0YXR1cyA9IENvcHlCdWZmZXJUb0NvbnRyb2xQYWNrZXQoQWRhcHRlciwgKFBWT0lEKXB2QnVmZmVyKTsKKworY250cmxFbmQ6CisJdXAoJkFkYXB0ZXItPkxvd1Bvd2VyTW9kZVN5bmMpOworCWtmcmVlKHB2QnVmZmVyKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2J1ZmZlcl9kb3dubG9hZF9zdGFydCgKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlJTlQgU3RhdHVzOworCisJaWYgKGRvd25fdHJ5bG9jaygmQWRhcHRlci0+TlZNUmRtV3JtTG9jaykpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJCSJJT0NUTF9CQ01fQ0hJUF9SRVNFVCBub3QgYWxsb3dlZCBhcyBFRVBST00gUmVhZC9Xcml0ZSBpcyBpbiBwcm9ncmVzc1xuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCSJTdGFydGluZyB0aGUgZmlybXdhcmUgZG93bmxvYWQgUElEID0weCV4ISEhIVxuIiwgY3VycmVudC0+cGlkKTsKKworCWlmIChkb3duX3RyeWxvY2soJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpKQorCQlyZXR1cm4gLUVCVVNZOworCisJQWRhcHRlci0+YkJpbkRvd25sb2FkZWQgPSBmYWxzZTsKKwlBZGFwdGVyLT5md19kb3dubG9hZF9wcm9jZXNzX3BpZCA9IGN1cnJlbnQtPnBpZDsKKwlBZGFwdGVyLT5iQ2ZnRG93bmxvYWRlZCA9IGZhbHNlOworCUFkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUgPSBmYWxzZTsKKwluZXRpZl9jYXJyaWVyX29mZihBZGFwdGVyLT5kZXYpOworCW5ldGlmX3N0b3BfcXVldWUoQWRhcHRlci0+ZGV2KTsKKwlTdGF0dXMgPSByZXNldF9jYXJkX3Byb2MoQWRhcHRlcik7CisJaWYgKFN0YXR1cykgeworCQlwcl9lcnIoUEZYICIlczogcmVzZXRfY2FyZF9wcm9jIEZhaWxlZCFcbiIsIEFkYXB0ZXItPmRldi0+bmFtZSk7CisJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKKwkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQlyZXR1cm4gU3RhdHVzOworCX0KKwltZGVsYXkoMTApOworCisJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfYnVmZmVyX2Rvd25sb2FkKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21fZmlybXdhcmVfaW5mbyAqcHNGd0luZm8gPSBOVUxMOworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCUlOVCBTdGF0dXM7CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkiU3RhcnRpbmcgdGhlIGZpcm13YXJlIGRvd25sb2FkIFBJRCA9MHgleCEhISFcbiIsIGN1cnJlbnQtPnBpZCk7CisKKwlpZiAoIWRvd25fdHJ5bG9jaygmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSkpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiSW52YWxpZCB3YXkgdG8gZG93bmxvYWQgYnVmZmVyLiBVc2UgU3RhcnQgYW5kIHRoZW4gY2FsbCB0aGlzISEhXG4iKTsKKwkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkgeworCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiTGVuZ3RoIGZvciBGVyBETEQgaXMgOiAlbHhcbiIsIElvQnVmZmVyLklucHV0TGVuZ3RoKTsKKworCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihzdHJ1Y3QgYmNtX2Zpcm13YXJlX2luZm8pKSB7CisJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHNGd0luZm8gPSBrbWFsbG9jKHNpemVvZigqcHNGd0luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBzRndJbmZvKSB7CisJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKHBzRndJbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKKwkJSW9CdWZmZXIuSW5wdXRMZW5ndGgpKSB7CisJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKKwkJa2ZyZWUocHNGd0luZm8pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoIXBzRndJbmZvLT5wdk1hcHBlZEZpcm13YXJlQWRkcmVzcyB8fAorCQkocHNGd0luZm8tPnUzMkZpcm13YXJlTGVuZ3RoID09IDApKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiU29tZXRoaW5nIGVsc2UgaXMgd3JvbmcgJWx1XG4iLAorCQkJCXBzRndJbmZvLT51MzJGaXJtd2FyZUxlbmd0aCk7CisJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKKwkJa2ZyZWUocHNGd0luZm8pOworCQlTdGF0dXMgPSAtRUlOVkFMOworCQlyZXR1cm4gU3RhdHVzOworCX0KKworCVN0YXR1cyA9IGJjbV9pb2N0bF9md19kb3dubG9hZChBZGFwdGVyLCBwc0Z3SW5mbyk7CisKKwlpZiAoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCWlmIChwc0Z3SW5mby0+dTMyU3RhcnRpbmdBZGRyZXNzID09IENPTkZJR19CRUdJTl9BRERSKQorCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiSU9DVEw6IENvbmZpZ3VyYXRpb24gRmlsZSBVcGxvYWQgRmFpbGVkXG4iKTsKKwkJZWxzZQorCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiSU9DVEw6IEZpcm13YXJlIEZpbGUgVXBsb2FkIEZhaWxlZFxuIik7CisKKwkJLyogdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOyAqLworCisJCWlmIChBZGFwdGVyLT5MRURJbmZvLmxlZF90aHJlYWRfcnVubmluZyAmCisJCQlCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZKSB7CisJCQlBZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IERSSVZFUl9JTklUOworCQkJQWRhcHRlci0+TEVESW5mby5iTGVkSW5pdERvbmUgPSBmYWxzZTsKKwkJCXdha2VfdXAoJkFkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7CisJCX0KKwl9CisKKwlpZiAoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQorCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJJT0NUTDogRmlybXdhcmUgRmlsZSBVcGxvYWRlZFxuIik7CisJa2ZyZWUocHNGd0luZm8pOworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfYnVmZmVyX2Rvd25sb2FkX3N0b3Aodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJSU5UIFN0YXR1czsKKwlpbnQgdGltZW91dCA9IDA7CisKKwlpZiAoIWRvd25fdHJ5bG9jaygmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSkpIHsKKwkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZG93bl90cnlsb2NrKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJGVyBkb3dubG9hZCBibG9ja2VkIGFzIEVFUFJPTSBSZWFkL1dyaXRlIGlzIGluIHByb2dyZXNzXG4iKTsKKwkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlBZGFwdGVyLT5iQmluRG93bmxvYWRlZCA9IFRSVUU7CisJQWRhcHRlci0+YkNmZ0Rvd25sb2FkZWQgPSBUUlVFOworCWF0b21pY19zZXQoJkFkYXB0ZXItPkN1cnJOdW1GcmVlVHhEZXNjLCAwKTsKKwlBZGFwdGVyLT5DdXJyTnVtUmVjdkRlc2NzID0gMDsKKwlBZGFwdGVyLT5kb3dubG9hZEREUiA9IDA7CisKKwkvKiBzZXR0aW5nIHRoZSBNaXBzIHRvIFJ1biAqLworCVN0YXR1cyA9IHJ1bl9jYXJkX3Byb2MoQWRhcHRlcik7CisKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiRmlybSBEb3dubG9hZCBGYWlsZWRcbiIpOworCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7CisJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwkJcmV0dXJuIFN0YXR1czsKKwl9IGVsc2UgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJCQlEQkdfTFZMX0FMTCwgIkZpcm0gRG93bmxvYWQgT3Zlci4uLlxuIik7CisJfQorCisJbWRlbGF5KDEwKTsKKworCS8qIFdhaXQgZm9yIE1haWxCb3ggSW50ZXJydXB0ICovCisJaWYgKFN0YXJ0SW50ZXJydXB0VXJiKChzdHJ1Y3QgYmNtX2ludGVyZmFjZV9hZGFwdGVyICopQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyKSkKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJVbmFibGUgdG8gc2VuZCBpbnRlcnJ1cHQuLi5cbiIpOworCisJdGltZW91dCA9IDUqSFo7CisJQWRhcHRlci0+d2FpdGluZ190b19md19kb3dubG9hZF9kb25lID0gZmFsc2U7CisJd2FpdF9ldmVudF90aW1lb3V0KEFkYXB0ZXItPmlvY3RsX2Z3X2RubGRfd2FpdF9xdWV1ZSwKKwkJCUFkYXB0ZXItPndhaXRpbmdfdG9fZndfZG93bmxvYWRfZG9uZSwgdGltZW91dCk7CisJQWRhcHRlci0+ZndfZG93bmxvYWRfcHJvY2Vzc19waWQgPSBJTlZBTElEX1BJRDsKKwlBZGFwdGVyLT5md19kb3dubG9hZF9kb25lID0gVFJVRTsKKwlhdG9taWNfc2V0KCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYywgMCk7CisJQWRhcHRlci0+Q3Vyck51bVJlY3ZEZXNjcyA9IDA7CisJQWRhcHRlci0+UHJldk51bVJlY3ZEZXNjcyA9IDA7CisJYXRvbWljX3NldCgmQWRhcHRlci0+Y250cmxwa3RDbnQsIDApOworCUFkYXB0ZXItPkxpbmtVcFN0YXR1cyA9IDA7CisJQWRhcHRlci0+TGlua1N0YXR1cyA9IDA7CisKKwlpZiAoQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJgorCQlCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZKSB7CisJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gRldfRE9XTkxPQURfRE9ORTsKKwkJd2FrZV91cCgmQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKKwl9CisKKwlpZiAoIXRpbWVvdXQpCisJCVN0YXR1cyA9IC1FTk9ERVY7CisKKwl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7CisJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfY2hpcF9yZXNldChzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlJTlQgU3RhdHVzOworCUlOVCBOVk1BY2Nlc3M7CisKKwlOVk1BY2Nlc3MgPSBkb3duX3RyeWxvY2soJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCWlmIChOVk1BY2Nlc3MpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSIgSU9DVExfQkNNX0NISVBfUkVTRVQgbm90IGFsbG93ZWQgYXMgRUVQUk9NIFJlYWQvV3JpdGUgaXMgaW4gcHJvZ3Jlc3NcbiIpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlkb3duKCZBZGFwdGVyLT5SeEFwcENvbnRyb2xRdWV1ZWxvY2spOworCVN0YXR1cyA9IHJlc2V0X2NhcmRfcHJvYyhBZGFwdGVyKTsKKwlmbHVzaEFsbEFwcFEoKTsKKwl1cCgmQWRhcHRlci0+UnhBcHBDb250cm9sUXVldWVsb2NrKTsKKwl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJUmVzZXRDb3VudGVycyhBZGFwdGVyKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX3Fvc190aHJlc2hvbGQoVUxPTkcgYXJnLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCVVTSE9SVCB1aUxvb3BJbmRleDsKKworCWZvciAodWlMb29wSW5kZXggPSAwOyB1aUxvb3BJbmRleCA8IE5PX09GX1FVRVVFUzsgdWlMb29wSW5kZXgrKykgeworCQlpZiAoZ2V0X3VzZXIoQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVpVGhyZXNob2xkLAorCQkJCSh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZykpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX3N3aXRjaF90cmFuc2Zlcl9tb2RlKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCVVJTlQgdWlEYXRhID0gMDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdWlEYXRhLCBhcmdwLCBzaXplb2YoVUlOVCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICh1aURhdGEpIHsKKwkJLyogQWxsb3cgQWxsIFBhY2tldHMgKi8KKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJIklPQ1RMX0JDTV9TV0lUQ0hfVFJBTlNGRVJfTU9ERTogRVRIX1BBQ0tFVF9UVU5ORUxJTkdfTU9ERVxuIik7CisJCQlBZGFwdGVyLT5UcmFuc2Zlck1vZGUgPSBFVEhfUEFDS0VUX1RVTk5FTElOR19NT0RFOworCX0gZWxzZSB7CisJCS8qIEFsbG93IElQIG9ubHkgUGFja2V0cyAqLworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkiSU9DVExfQkNNX1NXSVRDSF9UUkFOU0ZFUl9NT0RFOiBJUF9QQUNLRVRfT05MWV9NT0RFXG4iKTsKKwkJQWRhcHRlci0+VHJhbnNmZXJNb2RlID0gSVBfUEFDS0VUX09OTFlfTU9ERTsKKwl9CisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2dldF9kcml2ZXJfdmVyc2lvbih2b2lkIF9fdXNlciAqYXJncCkKK3sKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwl1bG9uZyBsZW47CisKKwkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlsZW4gPSBtaW5fdCh1bG9uZywgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLCBzdHJsZW4oRFJWX1ZFUlNJT04pICsgMSk7CisKKwlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgRFJWX1ZFUlNJT04sIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2dldF9jdXJyZW50X3N0YXR1cyh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX2xpbmtfc3RhdGUgbGlua19zdGF0ZTsKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKworCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiY29weV9mcm9tX3VzZXIgZmFpbGVkLi5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoICE9IHNpemVvZihsaW5rX3N0YXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoJmxpbmtfc3RhdGUsIDAsIHNpemVvZihsaW5rX3N0YXRlKSk7CisJbGlua19zdGF0ZS5iSWRsZU1vZGUgPSBBZGFwdGVyLT5JZGxlTW9kZTsKKwlsaW5rX3N0YXRlLmJTaHV0ZG93bk1vZGUgPSBBZGFwdGVyLT5iU2h1dFN0YXR1czsKKwlsaW5rX3N0YXRlLnVjTGlua1N0YXR1cyA9IEFkYXB0ZXItPkxpbmtTdGF0dXM7CisKKwlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJmxpbmtfc3RhdGUsIG1pbl90KHNpemVfdCwKKwkJc2l6ZW9mKGxpbmtfc3RhdGUpLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgpKSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkNvcHlfdG9fdXNlciBGYWlsZWQuLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9zZXRfbWFjX3RyYWNpbmcodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJVUlOVCB0cmFjaW5nX2ZsYWc7CisKKwkvKiBjb3B5IGlvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnRyYWNpbmdfZmxhZywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihVSU5UKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHRyYWNpbmdfZmxhZykKKwkJQWRhcHRlci0+cFRhcmFuZ3MtPk1hY1RyYWNpbmdFbmFibGVkID0gVFJVRTsKKwllbHNlCisJCUFkYXB0ZXItPnBUYXJhbmdzLT5NYWNUcmFjaW5nRW5hYmxlZCA9IGZhbHNlOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2dldF9kc3hfaW5kaWNhdGlvbih2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlVTE9ORyB1bFNGSWQgPSAwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKElvQnVmZmVyLk91dHB1dExlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYmNtX2FkZF9pbmRpY2F0aW9uX2FsdCkpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJNaXNtYXRjaCByZXE6ICVseCBuZWVkZWQgaXMgPTB4JXp4ISEhIiwKKwkJCUlvQnVmZmVyLk91dHB1dExlbmd0aCwKKwkJCXNpemVvZihzdHJ1Y3QgYmNtX2FkZF9pbmRpY2F0aW9uX2FsdCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnVsU0ZJZCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZih1bFNGSWQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJHZXQgRFNYIERhdGEgU0YgSUQgaXMgPSVseFxuIiwgdWxTRklkKTsKKwlnZXRfZHN4X3NmX2RhdGFfdG9fYXBwbGljYXRpb24oQWRhcHRlciwgdWxTRklkLCBJb0J1ZmZlci5PdXRwdXRCdWZmZXIpOworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9nZXRfaG9zdF9taWJzKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBzdHJ1Y3QgYmNtX3RhcmFuZ19kYXRhICpwVGFyYW5nKQoreworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCUlOVCBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKwlQVk9JRCB0ZW1wX2J1ZmY7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgYmNtX2hvc3Rfc3RhdHNfbWlicykpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJMZW5ndGggQ2hlY2sgZmFpbGVkICVsdSAlemRcbiIsIElvQnVmZmVyLk91dHB1dExlbmd0aCwKKwkJCXNpemVvZihzdHJ1Y3QgYmNtX2hvc3Rfc3RhdHNfbWlicykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBGSVhNRTogSE9TVF9TVEFUUyBhcmUgdG9vIGJpZyBmb3Iga21hbGxvYyAoMTIyMDQ4KSEgKi8KKwl0ZW1wX2J1ZmYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYmNtX2hvc3Rfc3RhdHNfbWlicyksIEdGUF9LRVJORUwpOworCWlmICghdGVtcF9idWZmKQorCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CisKKwlTdGF0dXMgPSBQcm9jZXNzR2V0SG9zdE1pYnMoQWRhcHRlciwgdGVtcF9idWZmKTsKKwlHZXREcm9wcGVkQXBwQ250cmxQa3RNaWJzKHRlbXBfYnVmZiwgcFRhcmFuZyk7CisKKwlpZiAoU3RhdHVzICE9IFNUQVRVU19GQUlMVVJFKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCB0ZW1wX2J1ZmYsCisJCQlzaXplb2Yoc3RydWN0IGJjbV9ob3N0X3N0YXRzX21pYnMpKSkgeworCQkJa2ZyZWUodGVtcF9idWZmKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCisJa2ZyZWUodGVtcF9idWZmKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2J1bGtfd3JtKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBVSU5UIGNtZCkKK3sKKwlzdHJ1Y3QgYmNtX2J1bGtfd3JtX2J1ZmZlciAqcEJ1bGtCdWZmZXI7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJVUlOVCB1aVRlbXBWYXIgPSAwOworCUlOVCBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKwlQQ0hBUiBwdkJ1ZmZlciA9IE5VTEw7CisKKwlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCisJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkRldmljZSBpbiBJZGxlL1NodXRkb3duIE1vZGUsIEJsb2NraW5nIFdybXNcbiIpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPCBzaXplb2YoVUxPTkcpICogMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwdkJ1ZmZlciA9IG1lbWR1cF91c2VyKElvQnVmZmVyLklucHV0QnVmZmVyLAorCQkJICAgICAgIElvQnVmZmVyLklucHV0TGVuZ3RoKTsKKwlpZiAoSVNfRVJSKHB2QnVmZmVyKSkKKwkJcmV0dXJuIFBUUl9FUlIocHZCdWZmZXIpOworCisJcEJ1bGtCdWZmZXIgPSAoc3RydWN0IGJjbV9idWxrX3dybV9idWZmZXIgKilwdkJ1ZmZlcjsKKworCWlmICgoKFVMT05HKXBCdWxrQnVmZmVyLT5SZWdpc3RlciAmIDB4MEYwMDAwMDApICE9IDB4MEYwMDAwMDAgfHwKKwkJKChVTE9ORylwQnVsa0J1ZmZlci0+UmVnaXN0ZXIgJiAweDMpKSB7CisJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIldSTSBEb25lIE9uIGludmFsaWQgQWRkcmVzcyA6ICV4IEFjY2VzcyBEZW5pZWQuXG4iLAorCQkJKGludClwQnVsa0J1ZmZlci0+UmVnaXN0ZXIpOworCQlrZnJlZShwdkJ1ZmZlcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXVpVGVtcFZhciA9IHBCdWxrQnVmZmVyLT5SZWdpc3RlciAmIEVFUFJPTV9SRUpFQ1RfTUFTSzsKKwlpZiAoISgoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyQ3VzdG9taXplKSZWU0dfTU9ERSkgJiYKKwkJKCh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMSkgfHwKKwkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMikgfHwKKwkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMykgfHwKKwkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfNCkpICYmCisJCShjbWQgPT0gSU9DVExfQkNNX1JFR0lTVEVSX1dSSVRFKSkgeworCisJCWtmcmVlKHB2QnVmZmVyKTsKKwkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiRUVQUk9NIEFjY2VzcyBEZW5pZWQsIG5vdCBpbiBWU0cgTW9kZVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChwQnVsa0J1ZmZlci0+U3dhcEVuZGlhbiA9PSBmYWxzZSkKKwkJU3RhdHVzID0gd3JtV2l0aExvY2soQWRhcHRlciwgKFVJTlQpcEJ1bGtCdWZmZXItPlJlZ2lzdGVyLAorCQkJKFBDSEFSKXBCdWxrQnVmZmVyLT5WYWx1ZXMsCisJCQlJb0J1ZmZlci5JbnB1dExlbmd0aCAtIDIqc2l6ZW9mKFVMT05HKSk7CisJZWxzZQorCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClwQnVsa0J1ZmZlci0+UmVnaXN0ZXIsCisJCQkoUFVJTlQpcEJ1bGtCdWZmZXItPlZhbHVlcywKKwkJCUlvQnVmZmVyLklucHV0TGVuZ3RoIC0gMipzaXplb2YoVUxPTkcpKTsKKworCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJXUk0gRmFpbGVkXG4iKTsKKworCWtmcmVlKHB2QnVmZmVyKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2dldF9udm1fc2l6ZSh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRUVQUk9NIHx8IEFkYXB0ZXItPmVOVk1UeXBlID09IE5WTV9GTEFTSCkgeworCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJkFkYXB0ZXItPnVpTlZNRFNEU2l6ZSwKKwkJCXNpemVvZihVSU5UKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfY2FsX2luaXQodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJVUlOVCB1aVNlY3RvclNpemUgPSAwOworCUlOVCBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKworCWlmIChBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRkxBU0gpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwKKwkJCXNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1aVNlY3RvclNpemUsIElvQnVmZmVyLklucHV0QnVmZmVyLAorCQkJc2l6ZW9mKFVJTlQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmICgodWlTZWN0b3JTaXplIDwgTUlOX1NFQ1RPUl9TSVpFKSB8fAorCQkJKHVpU2VjdG9yU2l6ZSA+IE1BWF9TRUNUT1JfU0laRSkpIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLAorCQkJCSZBZGFwdGVyLT51aVNlY3RvclNpemUsIHNpemVvZihVSU5UKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0gZWxzZSB7CisJCQlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpKSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsCisJCQkJCSZBZGFwdGVyLT51aVNlY3RvclNpemUsIHNpemVvZihVSU5UKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKFRSVUUgPT0gQWRhcHRlci0+YlNodXRTdGF0dXMpIHx8CisJCQkJCShUUlVFID09IEFkYXB0ZXItPklkbGVNb2RlKSkgeworCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwKKwkJCQkJCURCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkJCSJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKKwkJCQkJcmV0dXJuIC1FQUNDRVM7CisJCQkJfQorCisJCQkJQWRhcHRlci0+dWlTZWN0b3JTaXplID0gdWlTZWN0b3JTaXplOworCQkJCUJjbVVwZGF0ZVNlY3RvclNpemUoQWRhcHRlciwKKwkJCQkJQWRhcHRlci0+dWlTZWN0b3JTaXplKTsKKwkJCX0KKwkJfQorCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKwl9IGVsc2UgeworCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKwl9CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9zZXRfZGVidWcodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisjaWZkZWYgREVCVUcKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlzdHJ1Y3QgYmNtX3VzZXJfZGVidWdfc3RhdGUgc1VzZXJEZWJ1Z1N0YXRlOworCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiSW4gU0VUX0RFQlVHIGlvY3RsXG4iKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnNVc2VyRGVidWdTdGF0ZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCXNpemVvZihzdHJ1Y3QgYmNtX3VzZXJfZGVidWdfc3RhdGUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJJT0NUTF9CQ01fU0VUX0RFQlVHOiBPbk9mZj0lZCBUeXBlID0gMHgleCAiLAorCQkJc1VzZXJEZWJ1Z1N0YXRlLk9uT2ZmLCBzVXNlckRlYnVnU3RhdGUuVHlwZSk7CisJLyogc1VzZXJEZWJ1Z1N0YXRlLlN1YnR5cGUgPDw9IDE7ICovCisJc1VzZXJEZWJ1Z1N0YXRlLlN1YnR5cGUgPSAxIDw8IHNVc2VyRGVidWdTdGF0ZS5TdWJ0eXBlOworCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkiYWN0dWFsIFN1YnR5cGU9MHgleFxuIiwgc1VzZXJEZWJ1Z1N0YXRlLlN1YnR5cGUpOworCisJLyogVXBkYXRlIG5ldyAnRGVidWdTdGF0ZScgaW4gdGhlIEFkYXB0ZXIgKi8KKwlBZGFwdGVyLT5zdERlYnVnU3RhdGUudHlwZSB8PSBzVXNlckRlYnVnU3RhdGUuVHlwZTsKKwkvKiBTdWJ0eXBlOiBBIGJpdG1hcCBvZiAzMiBiaXRzIGZvciBTdWJ0eXBlIHBlciBUeXBlLgorCSAqIFZhbGlkIGluZGV4ZXMgaW4gJ3N1YnR5cGUnIGFycmF5OiAxLDIsNCw4CisJICogY29ycmVzcG9uZGluZyB0byB2YWxpZCBUeXBlIHZhbHVlcy4gSGVuY2Ugd2UgY2FuIHVzZSB0aGUgJ1R5cGUnIGZpZWxkCisJICogYXMgdGhlIGluZGV4IHZhbHVlLCBpZ25vcmluZyB0aGUgYXJyYXkgZW50cmllcyAwLDMsNSw2LDcgIQorCSAqLworCWlmIChzVXNlckRlYnVnU3RhdGUuT25PZmYpCisJCUFkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW3NVc2VyRGVidWdTdGF0ZS5UeXBlXSB8PQorCQkJc1VzZXJEZWJ1Z1N0YXRlLlN1YnR5cGU7CisJZWxzZQorCQlBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtzVXNlckRlYnVnU3RhdGUuVHlwZV0gJj0KKwkJCX5zVXNlckRlYnVnU3RhdGUuU3VidHlwZTsKKworCUJDTV9TSE9XX0RFQlVHX0JJVE1BUChBZGFwdGVyKTsKKyNlbmRpZgorCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9udm1fcncodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIFVJTlQgY21kKQoreworCXN0cnVjdCBiY21fbnZtX3JlYWR3cml0ZSBzdE5WTVJlYWRXcml0ZTsKKwlzdHJ1Y3QgdGltZXZhbCB0djAsIHR2MTsKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlQVUNIQVIgcFJlYWREYXRhID0gTlVMTDsKKwlVTE9ORyB1bERTRE1hZ2ljTnVtSW5Vc3JCdWZmID0gMDsKKwlJTlQgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisKKwltZW1zZXQoJnR2MCwgMCwgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSk7CisJbWVtc2V0KCZ0djEsIDAsIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOworCWlmICgoQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0ZMQVNIKSAmJgorCQkoQWRhcHRlci0+dWlGbGFzaExheW91dE1ham9yVmVyc2lvbiA9PSAwKSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIlRoZSBGbGFzaCBDb250cm9sIFNlY3Rpb24gaXMgQ29ycnVwdGVkLiBIZW5jZSBSZWplY3Rpb24gb24gTlZNIFJlYWQvV3JpdGVcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpKSB7CisJCWlmICgoQWRhcHRlci0+ZUFjdGl2ZURTRCAhPSBEU0QwKSAmJgorCQkJKEFkYXB0ZXItPmVBY3RpdmVEU0QgIT0gRFNEMSkgJiYKKwkJCShBZGFwdGVyLT5lQWN0aXZlRFNEICE9IERTRDIpKSB7CisKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJIk5vIERTRCBpcyBhY3RpdmUuLmhlbmNlIE5WTSBDb21tYW5kIGlzIGJsb2NrZWQiKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKKwkJfQorCX0KKworCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc3ROVk1SZWFkV3JpdGUsCisJCQkJKElPQ1RMX0JDTV9OVk1fUkVBRCA9PSBjbWQpID8KKwkJCQlJb0J1ZmZlci5PdXRwdXRCdWZmZXIgOiBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKKwkJCQlzaXplb2Yoc3RydWN0IGJjbV9udm1fcmVhZHdyaXRlKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyoKKwkgKiBEZW55IHRoZSBhY2Nlc3MgaWYgdGhlIG9mZnNldCBjcm9zc2VzIHRoZSBjYWwgYXJlYSBsaW1pdC4KKwkgKi8KKwlpZiAoc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyA+IEFkYXB0ZXItPnVpTlZNRFNEU2l6ZSkKKwkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCisJaWYgKHN0TlZNUmVhZFdyaXRlLnVpT2Zmc2V0ID4KKwkJQWRhcHRlci0+dWlOVk1EU0RTaXplIC0gc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcykKKwkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCisJcFJlYWREYXRhID0gbWVtZHVwX3VzZXIoc3ROVk1SZWFkV3JpdGUucEJ1ZmZlciwKKwkJCQlzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKTsKKwlpZiAoSVNfRVJSKHBSZWFkRGF0YSkpCisJCXJldHVybiBQVFJfRVJSKHBSZWFkRGF0YSk7CisKKwlkb19nZXR0aW1lb2ZkYXkoJnR2MCk7CisJaWYgKElPQ1RMX0JDTV9OVk1fUkVBRCA9PSBjbWQpIHsKKwkJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisKKwkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAorCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwKKwkJCQlEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7CisJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCQlrZnJlZShwUmVhZERhdGEpOworCQkJcmV0dXJuIC1FQUNDRVM7CisJCX0KKworCQlTdGF0dXMgPSBCZWNlZW1OVk1SZWFkKEFkYXB0ZXIsIChQVUlOVClwUmVhZERhdGEsCisJCQlzdE5WTVJlYWRXcml0ZS51aU9mZnNldCwgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyk7CisJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKworCQlpZiAoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlrZnJlZShwUmVhZERhdGEpOworCQkJcmV0dXJuIFN0YXR1czsKKwkJfQorCisJCWlmIChjb3B5X3RvX3VzZXIoc3ROVk1SZWFkV3JpdGUucEJ1ZmZlciwgcFJlYWREYXRhLAorCQkJc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcykpIHsKKwkJCWtmcmVlKHBSZWFkRGF0YSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZSB7CisJCWRvd24oJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCisJCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKKworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsCisJCQkJREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOworCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQkJa2ZyZWUocFJlYWREYXRhKTsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisKKwkJQWRhcHRlci0+YkhlYWRlckNoYW5nZUFsbG93ZWQgPSBUUlVFOworCQlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpKSB7CisJCQkvKgorCQkJICogTmV3IFJlcXVpcmVtZW50Oi0KKwkJCSAqIERTRCBzZWN0aW9uIHVwZGF0aW9uIHdpbGwgYmUgYWxsb3dlZCBpbiB0d28gY2FzZTotCisJCQkgKiAxLiAgaWYgRFNEIHNpZyBpcyBwcmVzZW50IGluIERTRCBoZWFkZXIgbWVhbnMgZG9uZ2xlCisJCQkgKiBpcyBvayBhbmQgdXBkYXRpb24gaXMgZnJ1aXRmdWxsCisJCQkgKiAyLiAgaWYgcG9pbnQgMSBmYWlsZXMgdGhlbiB1c2VyIGJ1ZmYgc2hvdWxkIGhhdmUKKwkJCSAqIERTRCBzaWcuIHRoaXMgcG9pbnQgZW5zdXJlcyB0aGF0IGlmIGRvbmdsZSBpcworCQkJICogY29ycnVwdGVkIHRoZW4gdXNlciBzcGFjZSBwcm9ncmFtIGZpcnN0IG1vZGlmeQorCQkJICogdGhlIERTRCBoZWFkZXIgd2l0aCB2YWxpZCBEU0Qgc2lnIHNvIHRoYXQgdGhpcworCQkJICogYXMgd2VsbCBhcyBmdXJ0aGVyIHdyaXRlIG1heSBiZSB3b3J0aHdoaWxlLgorCQkJICoKKwkJCSAqIFRoaXMgcmVzdHJpY3Rpb24gaGFzIGJlZW4gcHV0IGFzc3VtaW5nIHRoYXQKKwkJCSAqIGlmIERTRCBzaWcgaXMgY29ycnVwdGVkLCBEU0QgZGF0YSB3b24ndCBiZQorCQkJICogY29uc2lkZXJlZCB2YWxpZC4KKwkJCSAqLworCisJCQlTdGF0dXMgPSBCY21GbGFzaDJ4Q29ycnVwdFNpZyhBZGFwdGVyLAorCQkJCUFkYXB0ZXItPmVBY3RpdmVEU0QpOworCQkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCWlmICgoKHN0TlZNUmVhZFdyaXRlLnVpT2Zmc2V0ICsgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcykgIT0KKwkJCQkJQWRhcHRlci0+dWlOVk1EU0RTaXplKSB8fAorCQkJCQkoc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyA8IFNJR05BVFVSRV9TSVpFKSkgeworCisJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsCisJCQkJCQlPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJCQkiRFNEIFNpZyBpcyBwcmVzZW50IG5laXRoZXIgaW4gRmxhc2ggbm9yIFVzZXIgcHJvdmlkZWQgSW5wdXQuLiIpOworCQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCQkJCWtmcmVlKHBSZWFkRGF0YSk7CisJCQkJCXJldHVybiBTdGF0dXM7CisJCQkJfQorCisJCQkJdWxEU0RNYWdpY051bUluVXNyQnVmZiA9IG50b2hsKCooUFVJTlQpKHBSZWFkRGF0YSArIHN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMgLSBTSUdOQVRVUkVfU0laRSkpOworCQkJCWlmICh1bERTRE1hZ2ljTnVtSW5Vc3JCdWZmICE9CisJCQkJCURTRF9JTUFHRV9NQUdJQ19OVU1CRVIpIHsKKwkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsCisJCQkJCURCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJCQkJIkRTRCBTaWcgaXMgcHJlc2VudCBuZWl0aGVyIGluIEZsYXNoIG5vciBVc2VyIHByb3ZpZGVkIElucHV0Li4iKTsKKwkJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQkJCQlrZnJlZShwUmVhZERhdGEpOworCQkJCQlyZXR1cm4gU3RhdHVzOworCQkJCX0KKwkJCX0KKwkJfQorCisJCVN0YXR1cyA9IEJlY2VlbU5WTVdyaXRlKEFkYXB0ZXIsIChQVUlOVClwUmVhZERhdGEsCisJCQlzdE5WTVJlYWRXcml0ZS51aU9mZnNldCwgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcywKKwkJCXN0TlZNUmVhZFdyaXRlLmJWZXJpZnkpOworCQlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpKQorCQkJQmNtRmxhc2gyeFdyaXRlU2lnKEFkYXB0ZXIsIEFkYXB0ZXItPmVBY3RpdmVEU0QpOworCisJCUFkYXB0ZXItPmJIZWFkZXJDaGFuZ2VBbGxvd2VkID0gZmFsc2U7CisKKwkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCisJCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWtmcmVlKHBSZWFkRGF0YSk7CisJCQlyZXR1cm4gU3RhdHVzOworCQl9CisJfQorCisJZG9fZ2V0dGltZW9mZGF5KCZ0djEpOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIiB0aW1ldGFrZW4gYnkgV3JpdGUvcmVhZCA6JWxkIG1zZWNcbiIsCisJCSh0djEudHZfc2VjIC0gdHYwLnR2X3NlYykqMTAwMCArICh0djEudHZfdXNlYyAtIHR2MC50dl91c2VjKS8xMDAwKTsKKworCWtmcmVlKHBSZWFkRGF0YSk7CisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2ZsYXNoMnhfc2VjdGlvbl9yZWFkKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21fZmxhc2gyeF9yZWFkd3JpdGUgc0ZsYXNoMnhSZWFkID0gezB9OworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCVBVQ0hBUiBwUmVhZEJ1ZmYgPSBOVUxMOworCVVJTlQgTk9CID0gMDsKKwlVSU5UIEJ1ZmZTaXplID0gMDsKKwlVSU5UIFJlYWRCeXRlcyA9IDA7CisJVUlOVCBSZWFkT2Zmc2V0ID0gMDsKKwlJTlQgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisJdm9pZCBfX3VzZXIgKk91dFB1dEJ1ZmY7CisKKwlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpICE9IFRSVUUpCXsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJGbGFzaCBEb2VzIG5vdCBoYXZlIDIueCBtYXAiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCisJCURCR19MVkxfQUxMLCAiSU9DVExfQkNNX0ZMQVNIMlhfU0VDVElPTl9SRUFEIENhbGxlZCIpOworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIFJlYWRpbmcgRkxBU0ggMi54IFJFQUQgc3RydWN0dXJlICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzRmxhc2gyeFJlYWQsIElvQnVmZmVyLklucHV0QnVmZmVyLAorCQlzaXplb2Yoc3RydWN0IGJjbV9mbGFzaDJ4X3JlYWR3cml0ZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIlxuc0ZsYXNoMnhSZWFkLlNlY3Rpb24gOiV4Iiwgc0ZsYXNoMnhSZWFkLlNlY3Rpb24pOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIlxuc0ZsYXNoMnhSZWFkLm9mZnNldCA6JXgiLCBzRmxhc2gyeFJlYWQub2Zmc2V0KTsKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJcbnNGbGFzaDJ4UmVhZC5udW1PZkJ5dGVzIDoleCIsIHNGbGFzaDJ4UmVhZC5udW1PZkJ5dGVzKTsKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJcbnNGbGFzaDJ4UmVhZC5iVmVyaWZ5IDoleFxuIiwgc0ZsYXNoMnhSZWFkLmJWZXJpZnkpOworCisJLyogVGhpcyB3YXMgaW50ZXJuYWwgdG8gZHJpdmVyIGZvciByYXcgcmVhZC4KKwkgKiBub3cgaXQgaGFzIGJlbiBleHBvc2VkIHRvIHVzZXIgc3BhY2UgYXBwLgorCSAqLworCWlmICh2YWxpZGF0ZUZsYXNoMnhSZWFkV3JpdGUoQWRhcHRlciwgJnNGbGFzaDJ4UmVhZCkgPT0gZmFsc2UpCisJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKKworCU5PQiA9IHNGbGFzaDJ4UmVhZC5udW1PZkJ5dGVzOworCWlmIChOT0IgPiBBZGFwdGVyLT51aVNlY3RvclNpemUpCisJCUJ1ZmZTaXplID0gQWRhcHRlci0+dWlTZWN0b3JTaXplOworCWVsc2UKKwkJQnVmZlNpemUgPSBOT0I7CisKKwlSZWFkT2Zmc2V0ID0gc0ZsYXNoMnhSZWFkLm9mZnNldDsKKwlPdXRQdXRCdWZmID0gSW9CdWZmZXIuT3V0cHV0QnVmZmVyOworCXBSZWFkQnVmZiA9IChQQ0hBUilremFsbG9jKEJ1ZmZTaXplICwgR0ZQX0tFUk5FTCk7CisKKwlpZiAocFJlYWRCdWZmID09IE5VTEwpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIEZsYXNoIDIueCBSZWFkIFN0cnVjdHVyZSIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisKKwlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQkJREJHX0xWTF9BTEwsICJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKKwkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQlrZnJlZShwUmVhZEJ1ZmYpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwl3aGlsZSAoTk9CKSB7CisJCWlmIChOT0IgPiBBZGFwdGVyLT51aVNlY3RvclNpemUpCisJCQlSZWFkQnl0ZXMgPSBBZGFwdGVyLT51aVNlY3RvclNpemU7CisJCWVsc2UKKwkJCVJlYWRCeXRlcyA9IE5PQjsKKworCQkvKiBSZWFkaW5nIHRoZSBkYXRhIGZyb20gRmxhc2ggMi54ICovCisJCVN0YXR1cyA9IEJjbUZsYXNoMnhCdWxrUmVhZChBZGFwdGVyLCAoUFVJTlQpcFJlYWRCdWZmLAorCQkJc0ZsYXNoMnhSZWFkLlNlY3Rpb24sIFJlYWRPZmZzZXQsIFJlYWRCeXRlcyk7CisJCWlmIChTdGF0dXMpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLAorCQkJCURCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJCSJGbGFzaCAyeCByZWFkIGVyciB3aXRoIFN0YXR1cyA6JWQiLAorCQkJCVN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCisJCUJDTV9ERUJVR19QUklOVF9CVUZGRVIoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJCURCR19MVkxfQUxMLCBwUmVhZEJ1ZmYsIFJlYWRCeXRlcyk7CisKKwkJU3RhdHVzID0gY29weV90b191c2VyKE91dFB1dEJ1ZmYsIHBSZWFkQnVmZiwgUmVhZEJ5dGVzKTsKKwkJaWYgKFN0YXR1cykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsCisJCQkJREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJIkNvcHkgdG8gdXNlIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCBTdGF0dXMpOworCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQkJa2ZyZWUocFJlYWRCdWZmKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCU5PQiA9IE5PQiAtIFJlYWRCeXRlczsKKwkJaWYgKE5PQikgeworCQkJUmVhZE9mZnNldCA9IFJlYWRPZmZzZXQgKyBSZWFkQnl0ZXM7CisJCQlPdXRQdXRCdWZmID0gT3V0UHV0QnVmZiArIFJlYWRCeXRlczsKKwkJfQorCX0KKworCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwlrZnJlZShwUmVhZEJ1ZmYpOworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZmxhc2gyeF9zZWN0aW9uX3dyaXRlKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21fZmxhc2gyeF9yZWFkd3JpdGUgc0ZsYXNoMnhXcml0ZSA9IHswfTsKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlQVUNIQVIgcFdyaXRlQnVmZjsKKwl2b2lkIF9fdXNlciAqSW5wdXRBZGRyOworCVVJTlQgTk9CID0gMDsKKwlVSU5UIEJ1ZmZTaXplID0gMDsKKwlVSU5UIFdyaXRlT2Zmc2V0ID0gMDsKKwlVSU5UIFdyaXRlQnl0ZXMgPSAwOworCUlOVCBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKworCWlmIChJc0ZsYXNoMngoQWRhcHRlcikgIT0gVFJVRSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkZsYXNoIERvZXMgbm90IGhhdmUgMi54IG1hcCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBGaXJzdCBtYWtlIHRoaXMgRmFsc2Ugc28gdGhhdCB3ZSBjYW4gZW5hYmxlIHRoZSBTZWN0b3IKKwkgKiBQZXJtaXNzaW9uIENoZWNrIGluIEJlY2VlbUZsYXNoQnVsa1dyaXRlCisJICovCisJQWRhcHRlci0+YkFsbERTRFdyaXRlQWxsb3cgPSBmYWxzZTsKKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIklPQ1RMX0JDTV9GTEFTSDJYX1NFQ1RJT05fV1JJVEUgQ2FsbGVkIik7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBSZWFkaW5nIEZMQVNIIDIueCBSRUFEIHN0cnVjdHVyZSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmc0ZsYXNoMnhXcml0ZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCXNpemVvZihzdHJ1Y3QgYmNtX2ZsYXNoMnhfcmVhZHdyaXRlKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiXG5zRmxhc2gyeFJlYWQuU2VjdGlvbiA6JXgiLCBzRmxhc2gyeFdyaXRlLlNlY3Rpb24pOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIlxuc0ZsYXNoMnhSZWFkLm9mZnNldCA6JWQiLCBzRmxhc2gyeFdyaXRlLm9mZnNldCk7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiXG5zRmxhc2gyeFJlYWQubnVtT2ZCeXRlcyA6JXgiLCBzRmxhc2gyeFdyaXRlLm51bU9mQnl0ZXMpOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIlxuc0ZsYXNoMnhSZWFkLmJWZXJpZnkgOiV4XG4iLCBzRmxhc2gyeFdyaXRlLmJWZXJpZnkpOworCisJaWYgKChzRmxhc2gyeFdyaXRlLlNlY3Rpb24gIT0gVlNBMCkgJiYgKHNGbGFzaDJ4V3JpdGUuU2VjdGlvbiAhPSBWU0ExKQorCQkmJiAoc0ZsYXNoMnhXcml0ZS5TZWN0aW9uICE9IFZTQTIpKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCSJPbmx5IFZTQSB3cml0ZSBpcyBhbGxvd2VkIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh2YWxpZGF0ZUZsYXNoMnhSZWFkV3JpdGUoQWRhcHRlciwgJnNGbGFzaDJ4V3JpdGUpID09IGZhbHNlKQorCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CisKKwlJbnB1dEFkZHIgPSBzRmxhc2gyeFdyaXRlLnBEYXRhQnVmZjsKKwlXcml0ZU9mZnNldCA9IHNGbGFzaDJ4V3JpdGUub2Zmc2V0OworCU5PQiA9IHNGbGFzaDJ4V3JpdGUubnVtT2ZCeXRlczsKKworCWlmIChOT0IgPiBBZGFwdGVyLT51aVNlY3RvclNpemUpCisJCUJ1ZmZTaXplID0gQWRhcHRlci0+dWlTZWN0b3JTaXplOworCWVsc2UKKwkJQnVmZlNpemUgPSBOT0I7CisKKwlwV3JpdGVCdWZmID0ga21hbGxvYyhCdWZmU2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAocFdyaXRlQnVmZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGV4dHJhY3RpbmcgdGhlIHJlbWFpbmRlciBvZiB0aGUgZ2l2ZW4gb2Zmc2V0LiAqLworCVdyaXRlQnl0ZXMgPSBBZGFwdGVyLT51aVNlY3RvclNpemU7CisJaWYgKFdyaXRlT2Zmc2V0ICUgQWRhcHRlci0+dWlTZWN0b3JTaXplKQorCQlXcml0ZUJ5dGVzID0gQWRhcHRlci0+dWlTZWN0b3JTaXplIC0gKFdyaXRlT2Zmc2V0ICUgQWRhcHRlci0+dWlTZWN0b3JTaXplKTsKKworCWlmIChOT0IgPCBXcml0ZUJ5dGVzKQorCQlXcml0ZUJ5dGVzID0gTk9COworCisJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisKKwlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCSJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKKwkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQlrZnJlZShwV3JpdGVCdWZmKTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisJQmNtRmxhc2gyeENvcnJ1cHRTaWcoQWRhcHRlciwgc0ZsYXNoMnhXcml0ZS5TZWN0aW9uKTsKKwlkbyB7CisJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBXcml0ZUJ1ZmYsIElucHV0QWRkciwgV3JpdGVCeXRlcyk7CisJCWlmIChTdGF0dXMpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJIkNvcHkgdG8gdXNlciBmYWlsZWQgd2l0aCBzdGF0dXMgOiVkIiwgU3RhdHVzKTsKKwkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwkJCWtmcmVlKHBXcml0ZUJ1ZmYpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJQkNNX0RFQlVHX1BSSU5UX0JVRkZFUihBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsCisJCQlPU0FMX0RCRywgREJHX0xWTF9BTEwsIHBXcml0ZUJ1ZmYsIFdyaXRlQnl0ZXMpOworCisJCS8qIFdyaXRpbmcgdGhlIGRhdGEgZnJvbSBGbGFzaCAyLnggKi8KKwkJU3RhdHVzID0gQmNtRmxhc2gyeEJ1bGtXcml0ZShBZGFwdGVyLCAoUFVJTlQpcFdyaXRlQnVmZiwKKwkJCXNGbGFzaDJ4V3JpdGUuU2VjdGlvbiwgV3JpdGVPZmZzZXQsIFdyaXRlQnl0ZXMsCisJCQlzRmxhc2gyeFdyaXRlLmJWZXJpZnkpOworCisJCWlmIChTdGF0dXMpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJIkZsYXNoIDJ4IHJlYWQgZXJyIHdpdGggU3RhdHVzIDolZCIsIFN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCisJCU5PQiA9IE5PQiAtIFdyaXRlQnl0ZXM7CisJCWlmIChOT0IpIHsKKwkJCVdyaXRlT2Zmc2V0ID0gV3JpdGVPZmZzZXQgKyBXcml0ZUJ5dGVzOworCQkJSW5wdXRBZGRyID0gSW5wdXRBZGRyICsgV3JpdGVCeXRlczsKKwkJCWlmIChOT0IgPiBBZGFwdGVyLT51aVNlY3RvclNpemUpCisJCQkJV3JpdGVCeXRlcyA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZTsKKwkJCWVsc2UKKwkJCQlXcml0ZUJ5dGVzID0gTk9COworCQl9CisJfSB3aGlsZSAoTk9CID4gMCk7CisKKwlCY21GbGFzaDJ4V3JpdGVTaWcoQWRhcHRlciwgc0ZsYXNoMnhXcml0ZS5TZWN0aW9uKTsKKwl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJa2ZyZWUocFdyaXRlQnVmZik7CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9mbGFzaDJ4X3NlY3Rpb25fYml0bWFwKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21fZmxhc2gyeF9iaXRtYXAgKnBzRmxhc2gyeEJpdE1hcDsKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlJTlQgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisKK0JDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkiSU9DVExfQkNNX0dFVF9GTEFTSDJYX1NFQ1RJT05fQklUTUFQIENhbGxlZCIpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKElvQnVmZmVyLk91dHB1dExlbmd0aCAhPSBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaDJ4X2JpdG1hcCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcHNGbGFzaDJ4Qml0TWFwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJjbV9mbGFzaDJ4X2JpdG1hcCksIEdGUF9LRVJORUwpOworCWlmIChwc0ZsYXNoMnhCaXRNYXAgPT0gTlVMTCkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIk1lbW9yeSBpcyBub3QgYXZhaWxhYmxlIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFJlYWRpbmcgdGhlIEZsYXNoIFNlY3RpbyBCaXQgbWFwICovCisJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisKKwlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCSJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKKwkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQlrZnJlZShwc0ZsYXNoMnhCaXRNYXApOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlCY21HZXRGbGFzaDJ4U2VjdGlvbmFsQml0TWFwKEFkYXB0ZXIsIHBzRmxhc2gyeEJpdE1hcCk7CisJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBwc0ZsYXNoMnhCaXRNYXAsCisJCXNpemVvZihzdHJ1Y3QgYmNtX2ZsYXNoMnhfYml0bWFwKSkpIHsKKwkJa2ZyZWUocHNGbGFzaDJ4Qml0TWFwKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2ZyZWUocHNGbGFzaDJ4Qml0TWFwKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX3NldF9hY3RpdmVfc2VjdGlvbih2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwllbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGVGbGFzaDJ4U2VjdGlvblZhbCA9IDA7CisJSU5UIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiSU9DVExfQkNNX1NFVF9BQ1RJVkVfU0VDVElPTiBDYWxsZWQiKTsKKworCWlmIChJc0ZsYXNoMngoQWRhcHRlcikgIT0gVFJVRSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkZsYXNoIERvZXMgbm90IGhhdmUgMi54IG1hcCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpOworCWlmIChTdGF0dXMpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJDb3B5IG9mIElPQ1RMIEJVRkZFUiBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVGbGFzaDJ4U2VjdGlvblZhbCwKKwkJSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihJTlQpKTsKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiQ29weSBvZiBmbGFzaCBzZWN0aW9uIHZhbCBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisKKwlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCSJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKKwkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlTdGF0dXMgPSBCY21TZXRBY3RpdmVTZWN0aW9uKEFkYXB0ZXIsIGVGbGFzaDJ4U2VjdGlvblZhbCk7CisJaWYgKFN0YXR1cykKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJGYWlsZWQgdG8gbWFrZSBpdCdzIHByaW9yaXR5IEhpZ2hlc3QuIFN0YXR1cyAlZCIsCisJCQlTdGF0dXMpOworCisJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9jb3B5X3NlY3Rpb24odm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9mbGFzaDJ4X2NvcHlfc2VjdGlvbiBzQ29weVNlY3RTdHJ1dCA9IHswfTsKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlJTlQgU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJJT0NUTF9CQ01fQ09QWV9TRUNUSU9OICBDYWxsZWQiKTsKKworCUFkYXB0ZXItPmJBbGxEU0RXcml0ZUFsbG93ID0gZmFsc2U7CisJaWYgKElzRmxhc2gyeChBZGFwdGVyKSAhPSBUUlVFKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiRmxhc2ggRG9lcyBub3QgaGF2ZSAyLnggbWFwIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSk7CisJaWYgKFN0YXR1cykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCBTdGF0dXMgOiVkIiwgU3RhdHVzKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnNDb3B5U2VjdFN0cnV0LCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKKwkJCXNpemVvZihzdHJ1Y3QgYmNtX2ZsYXNoMnhfY29weV9zZWN0aW9uKSk7CisJaWYgKFN0YXR1cykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkNvcHkgb2YgQ29weV9TZWN0aW9uX1N0cnVjdCBmYWlsZWQgd2l0aCBTdGF0dXMgOiVkIiwKKwkJCVN0YXR1cyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIlNvdXJjZSBTRWN0aW9uIDoleCIsIHNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24pOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIkRlc3RpbmF0aW9uIFNFY3Rpb24gOiV4Iiwgc0NvcHlTZWN0U3RydXQuRHN0U2VjdGlvbik7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkib2Zmc2V0IDoleCIsIHNDb3B5U2VjdFN0cnV0Lm9mZnNldCk7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiTk9CIDoleCIsIHNDb3B5U2VjdFN0cnV0Lm51bU9mQnl0ZXMpOworCisJaWYgKElzU2VjdGlvbkV4aXN0SW5GbGFzaChBZGFwdGVyLCBzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uKSA9PSBmYWxzZSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIlNvdXJjZSBTZWN0aW9uPCV4PiBkb2VzIG5vdCBleGlzdCBpbiBGbGFzaCAiLAorCQkJc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChJc1NlY3Rpb25FeGlzdEluRmxhc2goQWRhcHRlciwgc0NvcHlTZWN0U3RydXQuRHN0U2VjdGlvbikgPT0gZmFsc2UpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJEZXN0aW5hdGlvIFNlY3Rpb248JXg+IGRvZXMgbm90IGV4aXN0IGluIEZsYXNoICIsCisJCQlzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24gPT0gc0NvcHlTZWN0U3RydXQuRHN0U2VjdGlvbikgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkiU291cmNlIGFuZCBEZXN0aW5hdGlvbiBzZWN0aW9uIHNob3VsZCBiZSBkaWZmZXJlbnQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisKKwlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCSJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKKwkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlpZiAoc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbiA9PSBJU09fSU1BR0UxIHx8CisJCXNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24gPT0gSVNPX0lNQUdFMikgeworCQlpZiAoSXNOb25DRExlc3NEZXZpY2UoQWRhcHRlcikpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJIkRldmljZSBpcyBOb24tQ0RMZXNzIGhlbmNlIHdvbid0IGhhdmUgSVNPICEhIik7CisJCQlTdGF0dXMgPSAtRUlOVkFMOworCQl9IGVsc2UgaWYgKHNDb3B5U2VjdFN0cnV0Lm51bU9mQnl0ZXMgPT0gMCkgeworCQkJU3RhdHVzID0gQmNtQ29weUlTTyhBZGFwdGVyLCBzQ29weVNlY3RTdHJ1dCk7CisJCX0gZWxzZSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJQYXJ0aWFsIENvcHkgb2YgSVNPIHNlY3Rpb24gaXMgbm90IEFsbG93ZWQuLiIpOworCQkJU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisJCX0KKwkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQlyZXR1cm4gU3RhdHVzOworCX0KKworCVN0YXR1cyA9IEJjbUNvcHlTZWN0aW9uKEFkYXB0ZXIsIHNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24sCisJCQkJc0NvcHlTZWN0U3RydXQuRHN0U2VjdGlvbiwKKwkJCQlzQ29weVNlY3RTdHJ1dC5vZmZzZXQsCisJCQkJc0NvcHlTZWN0U3RydXQubnVtT2ZCeXRlcyk7CisJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZ2V0X2ZsYXNoX2NzX2luZm8odm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJSU5UIFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiIElPQ1RMX0JDTV9HRVRfRkxBU0hfQ1NfSU5GTyBDYWxsZWQiKTsKKworCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSk7CisJaWYgKFN0YXR1cykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoQWRhcHRlci0+ZU5WTVR5cGUgIT0gTlZNX0ZMQVNIKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiQ29ubmVjdGVkIGRldmljZSBkb2VzIG5vdCBoYXZlIGZsYXNoIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChJc0ZsYXNoMngoQWRhcHRlcikgPT0gVFJVRSkgeworCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2gyeF9jc19pbmZvKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLAorCQkJQWRhcHRlci0+cHNGbGFzaDJ4Q1NJbmZvLAorCQkJc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2gyeF9jc19pbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9IGVsc2UgeworCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2hfY3NfaW5mbykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgQWRhcHRlci0+cHNGbGFzaENTSW5mbywKKwkJCXNpemVvZihzdHJ1Y3QgYmNtX2ZsYXNoX2NzX2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX3NlbGVjdF9kc2Qodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJSU5UIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCVVJTlQgU2VjdE9mc2V0ID0gMDsKKwllbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGVGbGFzaDJ4U2VjdGlvblZhbDsKKworCWVGbGFzaDJ4U2VjdGlvblZhbCA9IE5PX1NFQ1RJT05fVkFMOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIklPQ1RMX0JDTV9TRUxFQ1RfRFNEIENhbGxlZCIpOworCisJaWYgKElzRmxhc2gyeChBZGFwdGVyKSAhPSBUUlVFKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiRmxhc2ggRG9lcyBub3QgaGF2ZSAyLnggbWFwIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSk7CisJaWYgKFN0YXR1cykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVGbGFzaDJ4U2VjdGlvblZhbCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCXNpemVvZihJTlQpKTsKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiQ29weSBvZiBmbGFzaCBzZWN0aW9uIHZhbCBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiUmVhZCBTZWN0aW9uIDolZCIsIGVGbGFzaDJ4U2VjdGlvblZhbCk7CisJaWYgKChlRmxhc2gyeFNlY3Rpb25WYWwgIT0gRFNEMCkgJiYKKwkJKGVGbGFzaDJ4U2VjdGlvblZhbCAhPSBEU0QxKSAmJgorCQkoZUZsYXNoMnhTZWN0aW9uVmFsICE9IERTRDIpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJQYXNzZWQgc2VjdGlvbjwleD4gaXMgbm90IERTRCBzZWN0aW9uIiwKKwkJCWVGbGFzaDJ4U2VjdGlvblZhbCk7CisJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlTZWN0T2ZzZXQgPSBCY21HZXRTZWN0aW9uVmFsU3RhcnRPZmZzZXQoQWRhcHRlciwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKKwlpZiAoU2VjdE9mc2V0ID09IElOVkFMSURfT0ZGU0VUKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiUHJvdmlkZWQgU2VjdGlvbiB2YWwgPCVkPiBkb2VzIG5vdCBleGlzdCBpbiBGbGFzaCAyLngiLAorCQkJZUZsYXNoMnhTZWN0aW9uVmFsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJQWRhcHRlci0+YkFsbERTRFdyaXRlQWxsb3cgPSBUUlVFOworCUFkYXB0ZXItPnVsRmxhc2hDYWxTdGFydCA9IFNlY3RPZnNldDsKKwlBZGFwdGVyLT5lQWN0aXZlRFNEID0gZUZsYXNoMnhTZWN0aW9uVmFsOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX252bV9yYXdfcmVhZCh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX252bV9yZWFkd3JpdGUgc3ROVk1SZWFkOworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCXVuc2lnbmVkIGludCBOT0I7CisJSU5UIEJ1ZmZTaXplOworCUlOVCBSZWFkT2Zmc2V0ID0gMDsKKwlVSU5UIFJlYWRCeXRlcyA9IDA7CisJUFVDSEFSIHBSZWFkQnVmZjsKKwl2b2lkIF9fdXNlciAqT3V0UHV0QnVmZjsKKwlJTlQgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisKKwlpZiAoQWRhcHRlci0+ZU5WTVR5cGUgIT0gTlZNX0ZMQVNIKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiTlZNIFRZUEUgaXMgbm90IEZsYXNoIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiY29weV9mcm9tX3VzZXIgMSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnN0TlZNUmVhZCwgSW9CdWZmZXIuT3V0cHV0QnVmZmVyLAorCQlzaXplb2Yoc3RydWN0IGJjbV9udm1fcmVhZHdyaXRlKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJTk9CID0gc3ROVk1SZWFkLnVpTnVtQnl0ZXM7CisJLyogSW4gUmF3LVJlYWQgbWF4IEJ1ZmYgc2l6ZSA6IDY0TUIgKi8KKworCWlmIChOT0IgPiBERUZBVUxUX0JVRkZfU0laRSkKKwkJQnVmZlNpemUgPSBERUZBVUxUX0JVRkZfU0laRTsKKwllbHNlCisJCUJ1ZmZTaXplID0gTk9COworCisJUmVhZE9mZnNldCA9IHN0TlZNUmVhZC51aU9mZnNldDsKKwlPdXRQdXRCdWZmID0gc3ROVk1SZWFkLnBCdWZmZXI7CisKKwlwUmVhZEJ1ZmYgPSBremFsbG9jKEJ1ZmZTaXplICwgR0ZQX0tFUk5FTCk7CisJaWYgKHBSZWFkQnVmZiA9PSBOVUxMKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBGbGFzaCAyLnggUmVhZCBTdHJ1Y3R1cmUiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWRvd24oJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCisJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKKworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJCURCR19MVkxfQUxMLCAiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7CisJCWtmcmVlKHBSZWFkQnVmZik7CisJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisJQWRhcHRlci0+YkZsYXNoUmF3UmVhZCA9IFRSVUU7CisKKwl3aGlsZSAoTk9CKSB7CisJCWlmIChOT0IgPiBERUZBVUxUX0JVRkZfU0laRSkKKwkJCVJlYWRCeXRlcyA9IERFRkFVTFRfQlVGRl9TSVpFOworCQllbHNlCisJCQlSZWFkQnl0ZXMgPSBOT0I7CisKKwkJLyogUmVhZGluZyB0aGUgZGF0YSBmcm9tIEZsYXNoIDIueCAqLworCQlTdGF0dXMgPSBCZWNlZW1OVk1SZWFkKEFkYXB0ZXIsIChQVUlOVClwUmVhZEJ1ZmYsCisJCQlSZWFkT2Zmc2V0LCBSZWFkQnl0ZXMpOworCQlpZiAoU3RhdHVzKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJGbGFzaCAyeCByZWFkIGVyciB3aXRoIFN0YXR1cyA6JWQiLCBTdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKworCQlCQ01fREVCVUdfUFJJTlRfQlVGRkVSKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCisJCQlEQkdfTFZMX0FMTCwgcFJlYWRCdWZmLCBSZWFkQnl0ZXMpOworCisJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihPdXRQdXRCdWZmLCBwUmVhZEJ1ZmYsIFJlYWRCeXRlcyk7CisJCWlmIChTdGF0dXMpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJIkNvcHkgdG8gdXNlIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCBTdGF0dXMpOworCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQkJa2ZyZWUocFJlYWRCdWZmKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCU5PQiA9IE5PQiAtIFJlYWRCeXRlczsKKwkJaWYgKE5PQikgeworCQkJUmVhZE9mZnNldCA9IFJlYWRPZmZzZXQgKyBSZWFkQnl0ZXM7CisJCQlPdXRQdXRCdWZmID0gT3V0UHV0QnVmZiArIFJlYWRCeXRlczsKKwkJfQorCX0KKwlBZGFwdGVyLT5iRmxhc2hSYXdSZWFkID0gZmFsc2U7CisJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCWtmcmVlKHBSZWFkQnVmZik7CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9jbnRybG1zZ19tYXNrKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBzdHJ1Y3QgYmNtX3RhcmFuZ19kYXRhICpwVGFyYW5nKQoreworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCUlOVCBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKwlVTE9ORyBSeENudHJsTXNnQml0TWFzayA9IDA7CisKKwkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpOworCWlmIChTdGF0dXMpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJImNvcHkgb2YgSW9jdGwgYnVmZmVyIGlzIGZhaWxlZCBmcm9tIHVzZXIgc3BhY2UiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoICE9IHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUnhDbnRybE1zZ0JpdE1hc2ssCisJCUlvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCk7CisJaWYgKFN0YXR1cykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkiY29weSBvZiBjb250cm9sIGJpdCBtYXNrIGZhaWxlZCBmcm9tIHVzZXIgc3BhY2UiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIlxuIEdvdCB1c2VyIGRlZmluZWQgY250cmwgbXNnIGJpdCBtYXNrIDolbHgiLAorCQlSeENudHJsTXNnQml0TWFzayk7CisJcFRhcmFuZy0+UnhDbnRybE1zZ0JpdE1hc2sgPSBSeENudHJsTXNnQml0TWFzazsKKworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZ2V0X2RldmljZV9kcml2ZXJfaW5mbyh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX2RyaXZlcl9pbmZvIERldkluZm87CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJREJHX0xWTF9BTEwsICJDYWxsZWQgSU9DVExfQkNNX0dFVF9ERVZJQ0VfRFJJVkVSX0lORk9cbiIpOworCisJbWVtc2V0KCZEZXZJbmZvLCAwLCBzaXplb2YoRGV2SW5mbykpOworCURldkluZm8uTWF4UkRNQnVmZmVyU2l6ZSA9IEJVRkZFUl80SzsKKwlEZXZJbmZvLnUzMkRTRFN0YXJ0T2Zmc2V0ID0gRUVQUk9NX0NBTFBBUkFNX1NUQVJUOworCURldkluZm8udTMyUnhBbGlnbm1lbnRDb3JyZWN0aW9uID0gMDsKKwlEZXZJbmZvLnUzMk5WTVR5cGUgPSBBZGFwdGVyLT5lTlZNVHlwZTsKKwlEZXZJbmZvLnUzMkludGVyZmFjZVR5cGUgPSBCQ01fVVNCOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKElvQnVmZmVyLk91dHB1dExlbmd0aCA8IHNpemVvZihEZXZJbmZvKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJkRldkluZm8sIHNpemVvZihEZXZJbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX3RpbWVfc2luY2VfbmV0X2VudHJ5KHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21fdGltZV9lbGFwc2VkIHN0VGltZUVsYXBzZWRTaW5jZU5ldEVudHJ5ID0gezB9OworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiSU9DVExfQkNNX1RJTUVfU0lOQ0VfTkVUX0VOVFJZIGNhbGxlZCIpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKElvQnVmZmVyLk91dHB1dExlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYmNtX3RpbWVfZWxhcHNlZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnkudWw2NFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeSA9CisJCWdldF9zZWNvbmRzKCkgLSBBZGFwdGVyLT5saVRpbWVTaW5jZUxhc3ROZXRFbnRyeTsKKworCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmc3RUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnksCisJCXNpemVvZihzdHJ1Y3QgYmNtX3RpbWVfZWxhcHNlZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworCiBzdGF0aWMgbG9uZyBiY21fY2hhcl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgVUlOVCBjbWQsIFVMT05HIGFyZykKIHsKIAlzdHJ1Y3QgYmNtX3RhcmFuZ19kYXRhICpwVGFyYW5nID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyID0gcFRhcmFuZy0+QWRhcHRlcjsKIAlJTlQgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7Ci0JaW50IHRpbWVvdXQgPSAwOwotCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOwotCWludCBieXRlczsKIAogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKIAkJCSJQYXJhbWV0ZXJzIFBhc3NlZCB0byBjb250cm9sIElPQ1RMIGNtZD0weCVYIGFyZz0weCVsWCIsCkBAIC0yMDEsNzc4ICsyMzMyLDY1IEBACiAKIAlzd2l0Y2ggKGNtZCkgewogCS8qIFJkbXMgZm9yIFN3aW4gSWRsZS4uLiAqLwotCWNhc2UgSU9DVExfQkNNX1JFR0lTVEVSX1JFQURfUFJJVkFURTogewotCQlzdHJ1Y3QgYmNtX3JkbV9idWZmZXIgc1JkbUJ1ZmZlciA9IHswfTsKLQkJUENIQVIgdGVtcF9idWZmOwotCQlVSU5UIEJ1ZmZsZW47Ci0JCXUxNiB0ZW1wX3ZhbHVlOworCWNhc2UgSU9DVExfQkNNX1JFR0lTVEVSX1JFQURfUFJJVkFURToKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfcmVnX3JlYWRfcHJpdmF0ZShhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1JkbUJ1ZmZlcikpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnNSZG1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoID4gVVNIUlRfTUFYIHx8Ci0JCQlJb0J1ZmZlci5PdXRwdXRMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlCdWZmbGVuID0gSW9CdWZmZXIuT3V0cHV0TGVuZ3RoOwotCQl0ZW1wX3ZhbHVlID0gNCAtIChCdWZmbGVuICUgNCk7Ci0JCUJ1ZmZsZW4gKz0gdGVtcF92YWx1ZSAlIDQ7Ci0KLQkJdGVtcF9idWZmID0ga21hbGxvYyhCdWZmbGVuLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF0ZW1wX2J1ZmYpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlieXRlcyA9IHJkbWFsdChBZGFwdGVyLCAoVUlOVClzUmRtQnVmZmVyLlJlZ2lzdGVyLAotCQkJCShQVUlOVCl0ZW1wX2J1ZmYsIEJ1ZmZsZW4pOwotCQlpZiAoYnl0ZXMgPiAwKSB7Ci0JCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCB0ZW1wX2J1ZmYsIGJ5dGVzKSkgewotCQkJCWtmcmVlKHRlbXBfYnVmZik7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTdGF0dXMgPSBieXRlczsKLQkJfQotCi0JCWtmcmVlKHRlbXBfYnVmZik7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgSU9DVExfQkNNX1JFR0lTVEVSX1dSSVRFX1BSSVZBVEU6IHsKLQkJc3RydWN0IGJjbV93cm1fYnVmZmVyIHNXcm1CdWZmZXIgPSB7MH07Ci0JCVVJTlQgdWlUZW1wVmFyID0gMDsKLQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1dybUJ1ZmZlcikpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkvKiBHZXQgV3JtQnVmZmVyIHN0cnVjdHVyZSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnNXcm1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQl1aVRlbXBWYXIgPSBzV3JtQnVmZmVyLlJlZ2lzdGVyICYgRUVQUk9NX1JFSkVDVF9NQVNLOwotCQlpZiAoISgoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyQ3VzdG9taXplKSAmIFZTR19NT0RFKSAmJgotCQkJKCh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMSkgfHwKLQkJCQkodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzIpIHx8Ci0JCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18zKSB8fAotCQkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfNCkpKSB7Ci0KLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCSJFRVBST00gQWNjZXNzIERlbmllZCwgbm90IGluIFZTRyBNb2RlXG4iKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJU3RhdHVzID0gd3JtYWx0KEFkYXB0ZXIsIChVSU5UKXNXcm1CdWZmZXIuUmVnaXN0ZXIsCi0JCQkJKFBVSU5UKXNXcm1CdWZmZXIuRGF0YSwgc2l6ZW9mKFVMT05HKSk7Ci0KLQkJaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCi0JCQkJCURCR19MVkxfQUxMLCAiV1JNIERvbmVcbiIpOwotCQl9IGVsc2UgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCi0JCQkJCURCR19MVkxfQUxMLCAiV1JNIEZhaWxlZFxuIik7Ci0JCQlTdGF0dXMgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCX0KKwljYXNlIElPQ1RMX0JDTV9SRUdJU1RFUl9XUklURV9QUklWQVRFOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9yZWdfd3JpdGVfcHJpdmF0ZShhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAogCWNhc2UgSU9DVExfQkNNX1JFR0lTVEVSX1JFQUQ6Ci0JY2FzZSBJT0NUTF9CQ01fRUVQUk9NX1JFR0lTVEVSX1JFQUQ6IHsKLQkJc3RydWN0IGJjbV9yZG1fYnVmZmVyIHNSZG1CdWZmZXIgPSB7MH07Ci0JCVBDSEFSIHRlbXBfYnVmZiA9IE5VTEw7Ci0JCVVJTlQgdWlUZW1wVmFyID0gMDsKLQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCWNhc2UgSU9DVExfQkNNX0VFUFJPTV9SRUdJU1RFUl9SRUFEOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9lZXByb21fcmVnX3JlYWQoYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCSJEZXZpY2UgaW4gSWRsZSBNb2RlLCBCbG9ja2luZyBSZG1zXG4iKTsKLQkJCXJldHVybiAtRUFDQ0VTOwotCQl9Ci0KLQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKHNSZG1CdWZmZXIpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzUmRtQnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKElvQnVmZmVyLk91dHB1dExlbmd0aCA+IFVTSFJUX01BWCB8fAotCQkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoID09IDApIHsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJdGVtcF9idWZmID0ga21hbGxvYyhJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIEdGUF9LRVJORUwpOwotCQlpZiAoIXRlbXBfYnVmZikKLQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQotCQlpZiAoKCgoVUxPTkcpc1JkbUJ1ZmZlci5SZWdpc3RlciAmIDB4MEYwMDAwMDApICE9IDB4MEYwMDAwMDApIHx8Ci0JCQkoKFVMT05HKXNSZG1CdWZmZXIuUmVnaXN0ZXIgJiAweDMpKSB7Ci0KLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCSJSRE0gRG9uZSBPbiBpbnZhbGlkIEFkZHJlc3MgOiAleCBBY2Nlc3MgRGVuaWVkLlxuIiwKLQkJCQkJKGludClzUmRtQnVmZmVyLlJlZ2lzdGVyKTsKLQotCQkJa2ZyZWUodGVtcF9idWZmKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJdWlUZW1wVmFyID0gc1JkbUJ1ZmZlci5SZWdpc3RlciAmIEVFUFJPTV9SRUpFQ1RfTUFTSzsKLQkJYnl0ZXMgPSByZG1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClzUmRtQnVmZmVyLlJlZ2lzdGVyLAotCQkJCSAgICAgICAoUFVJTlQpdGVtcF9idWZmLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgpOwotCi0JCWlmIChieXRlcyA+IDApIHsKLQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHRlbXBfYnVmZiwgYnl0ZXMpKSB7Ci0JCQkJa2ZyZWUodGVtcF9idWZmKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN0YXR1cyA9IGJ5dGVzOwotCQl9Ci0KLQkJa2ZyZWUodGVtcF9idWZmKTsKLQkJYnJlYWs7Ci0JfQogCWNhc2UgSU9DVExfQkNNX1JFR0lTVEVSX1dSSVRFOgotCWNhc2UgSU9DVExfQkNNX0VFUFJPTV9SRUdJU1RFUl9XUklURTogewotCQlzdHJ1Y3QgYmNtX3dybV9idWZmZXIgc1dybUJ1ZmZlciA9IHswfTsKLQkJVUlOVCB1aVRlbXBWYXIgPSAwOworCWNhc2UgSU9DVExfQkNNX0VFUFJPTV9SRUdJU1RFUl9XUklURToKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfZWVwcm9tX3JlZ193cml0ZShhcmdwLCBBZGFwdGVyLCBjbWQpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKKwljYXNlIElPQ1RMX0JDTV9HUElPX1NFVF9SRVFVRVNUOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9ncGlvX3NldF9yZXF1ZXN0KGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAotCQkJCQkiRGV2aWNlIGluIElkbGUgTW9kZSwgQmxvY2tpbmcgV3Jtc1xuIik7Ci0JCQlyZXR1cm4gLUVBQ0NFUzsKLQkJfQorCWNhc2UgQkNNX0xFRF9USFJFQURfU1RBVEVfQ0hBTkdFX1JFUToKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfbGVkX3RocmVhZF9zdGF0ZV9jaGFuZ2VfcmVxKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOworCWNhc2UgSU9DVExfQkNNX0dQSU9fU1RBVFVTX1JFUVVFU1Q6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2dwaW9fc3RhdHVzX3JlcXVlc3QoYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKHNXcm1CdWZmZXIpKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBJT0NUTF9CQ01fR1BJT19NVUxUSV9SRVFVRVNUOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9ncGlvX211bHRpX3JlcXVlc3QoYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJLyogR2V0IFdybUJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzV3JtQnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKCgoKFVMT05HKXNXcm1CdWZmZXIuUmVnaXN0ZXIgJiAweDBGMDAwMDAwKSAhPSAweDBGMDAwMDAwKSB8fAotCQkJKChVTE9ORylzV3JtQnVmZmVyLlJlZ2lzdGVyICYgMHgzKSkgewotCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAotCQkJCQkiV1JNIERvbmUgT24gaW52YWxpZCBBZGRyZXNzIDogJXggQWNjZXNzIERlbmllZC5cbiIsCi0JCQkJCShpbnQpc1dybUJ1ZmZlci5SZWdpc3Rlcik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCXVpVGVtcFZhciA9IHNXcm1CdWZmZXIuUmVnaXN0ZXIgJiBFRVBST01fUkVKRUNUX01BU0s7Ci0JCWlmICghKChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJDdXN0b21pemUpICYgVlNHX01PREUpICYmCi0JCQkJKCh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMSkgfHwKLQkJCQkodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzIpIHx8Ci0JCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18zKSB8fAotCQkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfNCkpICYmCi0JCQkJKGNtZCA9PSBJT0NUTF9CQ01fUkVHSVNURVJfV1JJVEUpKSB7Ci0KLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAotCQkJCQkJIkVFUFJPTSBBY2Nlc3MgRGVuaWVkLCBub3QgaW4gVlNHIE1vZGVcbiIpOwotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJU3RhdHVzID0gd3JtYWx0V2l0aExvY2soQWRhcHRlciwgKFVJTlQpc1dybUJ1ZmZlci5SZWdpc3RlciwKLQkJCQkJKFBVSU5UKXNXcm1CdWZmZXIuRGF0YSwKLQkJCQkJc1dybUJ1ZmZlci5MZW5ndGgpOwotCi0JCWlmIChTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIE9TQUxfREJHLAotCQkJCQlEQkdfTFZMX0FMTCwgIldSTSBEb25lXG4iKTsKLQkJfSBlbHNlIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAotCQkJCQlEQkdfTFZMX0FMTCwgIldSTSBGYWlsZWRcbiIpOwotCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBJT0NUTF9CQ01fR1BJT19TRVRfUkVRVUVTVDogewotCQlVQ0hBUiB1Y1Jlc2V0VmFsdWVbNF07Ci0JCVVJTlQgdmFsdWUgPSAwOwotCQlVSU5UIHVpQml0ID0gMDsKLQkJVUlOVCB1aU9wZXJhdGlvbiA9IDA7Ci0JCXN0cnVjdCBiY21fZ3Bpb19pbmZvIGdwaW9faW5mbyA9IHswfTsKLQotCQlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7Ci0KLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAotCQkJCQlEQkdfTFZMX0FMTCwKLQkJCQkJIkdQSU8gQ2FuJ3QgYmUgc2V0L2NsZWFyIGluIExvdyBwb3dlciBNb2RlIik7Ci0JCQlyZXR1cm4gLUVBQ0NFUzsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9faW5mbykpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmdwaW9faW5mbywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCXVpQml0ICA9IGdwaW9faW5mby51aUdwaW9OdW1iZXI7Ci0JCXVpT3BlcmF0aW9uID0gZ3Bpb19pbmZvLnVpR3Bpb1ZhbHVlOwotCQl2YWx1ZSA9ICgxPDx1aUJpdCk7Ci0KLQkJaWYgKElzUmVxR3Bpb0lzTGVkSW5OVk0oQWRhcHRlciwgdmFsdWUpID09IGZhbHNlKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKLQkJCQkJREJHX0xWTF9BTEwsCi0JCQkJCSJTb3JyeSwgUmVxdWVzdGVkIEdQSU88MHglWD4gaXMgbm90IGNvcnJlc3BvbmQgdG8gTEVEICEhISIsCi0JCQkJCXZhbHVlKTsKLQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIFNldCAtIHNldHRpbmcgMSAqLwotCQlpZiAodWlPcGVyYXRpb24pIHsKLQkJCS8qIFNldCB0aGUgZ3BpbyBvdXRwdXQgcmVnaXN0ZXIgKi8KLQkJCVN0YXR1cyA9IHdybWFsdFdpdGhMb2NrKEFkYXB0ZXIsCi0JCQkJCQlCQ01fR1BJT19PVVRQVVRfU0VUX1JFRywKLQkJCQkJCShQVUlOVCkoJnZhbHVlKSwgc2l6ZW9mKFVJTlQpKTsKLQotCQkJaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsCi0JCQkJCQlPU0FMX0RCRywgREJHX0xWTF9BTEwsCi0JCQkJCQkiU2V0IHRoZSBHUElPIGJpdFxuIik7Ci0JCQl9IGVsc2UgewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsCi0JCQkJCQlPU0FMX0RCRywgREJHX0xWTF9BTEwsCi0JCQkJCQkiRmFpbGVkIHRvIHNldCB0aGUgJWR0aCBHUElPXG4iLAotCQkJCQkJdWlCaXQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogU2V0IHRoZSBncGlvIG91dHB1dCByZWdpc3RlciAqLwotCQkJU3RhdHVzID0gd3JtYWx0V2l0aExvY2soQWRhcHRlciwKLQkJCQkJCUJDTV9HUElPX09VVFBVVF9DTFJfUkVHLAotCQkJCQkJKFBVSU5UKSgmdmFsdWUpLCBzaXplb2YoVUlOVCkpOwotCi0JCQlpZiAoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKLQkJCQkJCU9TQUxfREJHLCBEQkdfTFZMX0FMTCwKLQkJCQkJCSJTZXQgdGhlIEdQSU8gYml0XG4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKLQkJCQkJCU9TQUxfREJHLCBEQkdfTFZMX0FMTCwKLQkJCQkJCSJGYWlsZWQgdG8gY2xlYXIgdGhlICVkdGggR1BJT1xuIiwKLQkJCQkJCXVpQml0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWJ5dGVzID0gcmRtYWx0V2l0aExvY2soQWRhcHRlciwgKFVJTlQpR1BJT19NT0RFX1JFR0lTVEVSLAotCQkJCSAgICAgICAoUFVJTlQpdWNSZXNldFZhbHVlLCBzaXplb2YoVUlOVCkpOwotCQlpZiAoYnl0ZXMgPCAwKSB7Ci0JCQlTdGF0dXMgPSBieXRlczsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKLQkJCQkJIkdQSU9fTU9ERV9SRUdJU1RFUiByZWFkIGZhaWxlZCIpOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQkJfQotCi0JCS8qIFNldCB0aGUgZ3BpbyBtb2RlIHJlZ2lzdGVyIHRvIG91dHB1dCAqLwotCQkqKFVJTlQgKil1Y1Jlc2V0VmFsdWUgfD0gKDE8PHVpQml0KTsKLQkJU3RhdHVzID0gd3JtYWx0V2l0aExvY2soQWRhcHRlciwgR1BJT19NT0RFX1JFR0lTVEVSLAotCQkJCQkoUFVJTlQpdWNSZXNldFZhbHVlLCBzaXplb2YoVUlOVCkpOwotCi0JCWlmIChTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAotCQkJCQlEQkdfTFZMX0FMTCwKLQkJCQkJIlNldCB0aGUgR1BJTyB0byBvdXRwdXQgTW9kZVxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKLQkJCQkJREJHX0xWTF9BTEwsCi0JCQkJCSJGYWlsZWQgdG8gcHV0IEdQSU8gaW4gT3V0cHV0IE1vZGVcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIEJDTV9MRURfVEhSRUFEX1NUQVRFX0NIQU5HRV9SRVE6IHsKLQkJc3RydWN0IGJjbV91c2VyX3RocmVhZF9yZXEgdGhyZWFkUmVxID0gezB9OwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCi0JCQkJIlVzZXIgbWFkZSBMRUQgdGhyZWFkIEluQWN0aXZlIik7Ci0KLQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgewotCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKLQkJCQkJREJHX0xWTF9BTEwsCi0JCQkJCSJHUElPIENhbid0IGJlIHNldC9jbGVhciBpbiBMb3cgcG93ZXIgTW9kZSIpOwotCQkJU3RhdHVzID0gLUVBQ0NFUzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2YodGhyZWFkUmVxKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmdGhyZWFkUmVxLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJLyogaWYgTEVEIHRocmVhZCBpcyBydW5uaW5nKEFjdGl2ZWx5IG9yIEluYWN0aXZlbHkpIHNldCBpdCBzdGF0ZSB0byBtYWtlIGluYWN0aXZlICovCi0JCWlmIChBZGFwdGVyLT5MRURJbmZvLmxlZF90aHJlYWRfcnVubmluZykgewotCQkJaWYgKHRocmVhZFJlcS5UaHJlYWRTdGF0ZSA9PSBMRURfVEhSRUFEX0FDVElWQVRJT05fUkVRKSB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKLQkJCQkJCU9TQUxfREJHLCBEQkdfTFZMX0FMTCwKLQkJCQkJCSJBY3RpdmF0aW5nIHRocmVhZCByZXEiKTsKLQkJCQlBZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IExFRF9USFJFQURfQUNUSVZFOwotCQkJfSBlbHNlIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAotCQkJCQkJT1NBTF9EQkcsIERCR19MVkxfQUxMLAotCQkJCQkJIkRlQWN0aXZhdGluZyBUaHJlYWQgcmVxLi4uLi4iKTsKLQkJCQlBZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IExFRF9USFJFQURfSU5BQ1RJVkU7Ci0JCQl9Ci0KLQkJCS8qIHNpZ25hbCB0aHJlYWQuICovCi0JCQl3YWtlX3VwKCZBZGFwdGVyLT5MRURJbmZvLm5vdGlmeV9sZWRfZXZlbnQpOwotCQl9Ci0JfQotCWJyZWFrOwotCi0JY2FzZSBJT0NUTF9CQ01fR1BJT19TVEFUVVNfUkVRVUVTVDogewotCQlVTE9ORyB1aUJpdCA9IDA7Ci0JCVVDSEFSIHVjUmVhZFs0XTsKLQkJc3RydWN0IGJjbV9ncGlvX2luZm8gZ3Bpb19pbmZvID0gezB9OwotCi0JCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpCi0JCQlyZXR1cm4gLUVBQ0NFUzsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihncGlvX2luZm8pKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZncGlvX2luZm8sIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQl1aUJpdCA9IGdwaW9faW5mby51aUdwaW9OdW1iZXI7Ci0KLQkJLyogU2V0IHRoZSBncGlvIG91dHB1dCByZWdpc3RlciAqLwotCQlieXRlcyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKUdQSU9fUElOX1NUQVRFX1JFR0lTVEVSLAotCQkJCQkoUFVJTlQpdWNSZWFkLCBzaXplb2YoVUlOVCkpOwotCi0JCWlmIChieXRlcyA8IDApIHsKLQkJCVN0YXR1cyA9IGJ5dGVzOwotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJIlJETSBGYWlsZWRcbiIpOwotCQkJcmV0dXJuIFN0YXR1czsKLQkJfSBlbHNlIHsKLQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCQl9Ci0JfQotCWJyZWFrOwotCi0JY2FzZSBJT0NUTF9CQ01fR1BJT19NVUxUSV9SRVFVRVNUOiB7Ci0JCVVDSEFSIHVjUmVzZXRWYWx1ZVs0XTsKLQkJc3RydWN0IGJjbV9ncGlvX211bHRpX2luZm8gZ3Bpb19tdWx0aV9pbmZvW01BWF9JRFhdOwotCQlzdHJ1Y3QgYmNtX2dwaW9fbXVsdGlfaW5mbyAqcGdwaW9fbXVsdGlfaW5mbyA9IChzdHJ1Y3QgYmNtX2dwaW9fbXVsdGlfaW5mbyAqKWdwaW9fbXVsdGlfaW5mbzsKLQotCQltZW1zZXQocGdwaW9fbXVsdGlfaW5mbywgMCwgTUFYX0lEWCAqIHNpemVvZihzdHJ1Y3QgYmNtX2dwaW9fbXVsdGlfaW5mbykpOwotCi0JCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihncGlvX211bHRpX2luZm8pKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZncGlvX211bHRpX2luZm8sIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSXNSZXFHcGlvSXNMZWRJbk5WTShBZGFwdGVyLCBwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzaykgPT0gZmFsc2UpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAotCQkJCQlEQkdfTFZMX0FMTCwKLQkJCQkJIlNvcnJ5LCBSZXF1ZXN0ZWQgR1BJTzwweCVYPiBpcyBub3QgY29ycmVzcG9uZCB0byBOVk0gTEVEIGJpdCBtYXA8MHglWD4hISEiLAotCQkJCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzaywKLQkJCQkJQWRhcHRlci0+Z3Bpb0JpdE1hcCk7Ci0JCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBTZXQgdGhlIGdwaW8gb3V0cHV0IHJlZ2lzdGVyICovCi0JCWlmICgocGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2spICYKLQkJCShwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPQ29tbWFuZCkpIHsKLQkJCS8qIFNldCAxJ3MgaW4gR1BJTyBPVVRQVVQgUkVHSVNURVIgKi8KLQkJCSooVUlOVCAqKXVjUmVzZXRWYWx1ZSA9ICBwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzayAmCi0JCQkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT0NvbW1hbmQgJgotCQkJCXBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9WYWx1ZTsKLQotCQkJaWYgKCooVUlOVCAqKSB1Y1Jlc2V0VmFsdWUpCi0JCQkJU3RhdHVzID0gd3JtYWx0V2l0aExvY2soQWRhcHRlciwgQkNNX0dQSU9fT1VUUFVUX1NFVF9SRUcsCi0JCQkJCQkJKFBVSU5UKXVjUmVzZXRWYWx1ZSwgc2l6ZW9mKFVMT05HKSk7Ci0KLQkJCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAotCQkJCQkJIldSTSB0byBCQ01fR1BJT19PVVRQVVRfU0VUX1JFRyBGYWlsZWQuIik7Ci0JCQkJcmV0dXJuIFN0YXR1czsKLQkJCX0KLQotCQkJLyogQ2xlYXIgdG8gMCdzIGluIEdQSU8gT1VUUFVUIFJFR0lTVEVSICovCi0JCQkqKFVJTlQgKil1Y1Jlc2V0VmFsdWUgPSAocGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2sgJgotCQkJCQkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT0NvbW1hbmQgJgotCQkJCQkJKH4ocGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT1ZhbHVlKSkpOwotCi0JCQlpZiAoKihVSU5UICopIHVjUmVzZXRWYWx1ZSkKLQkJCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCBCQ01fR1BJT19PVVRQVVRfQ0xSX1JFRywgKFBVSU5UKXVjUmVzZXRWYWx1ZSwgc2l6ZW9mKFVMT05HKSk7Ci0KLQkJCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAotCQkJCQkJIldSTSB0byBCQ01fR1BJT19PVVRQVVRfQ0xSX1JFRyBGYWlsZWQuIik7Ci0JCQkJcmV0dXJuIFN0YXR1czsKLQkJCX0KLQkJfQotCi0JCWlmIChwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzaykgewotCQkJYnl0ZXMgPSByZG1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClHUElPX1BJTl9TVEFURV9SRUdJU1RFUiwgKFBVSU5UKXVjUmVzZXRWYWx1ZSwgc2l6ZW9mKFVJTlQpKTsKLQotCQkJaWYgKGJ5dGVzIDwgMCkgewotCQkJCVN0YXR1cyA9IGJ5dGVzOwotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCQkiUkRNIHRvIEdQSU9fUElOX1NUQVRFX1JFR0lTVEVSIEZhaWxlZC4iKTsKLQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJfSBlbHNlIHsKLQkJCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQkJCX0KLQotCQkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT1ZhbHVlID0gKCooVUlOVCAqKXVjUmVzZXRWYWx1ZSAmCi0JCQkJCQkJCXBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9NYXNrKTsKLQkJfQotCi0JCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZncGlvX211bHRpX2luZm8sIElvQnVmZmVyLk91dHB1dExlbmd0aCk7Ci0JCWlmIChTdGF0dXMpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCSJGYWlsZWQgd2hpbGUgY29weWluZyBDb250ZW50IHRvIElPQnVmZXIgZm9yIHVzZXIgc3BhY2UgZXJyOiVkIiwgU3RhdHVzKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JfQotCWJyZWFrOwotCi0JY2FzZSBJT0NUTF9CQ01fR1BJT19NT0RFX1JFUVVFU1Q6IHsKLQkJVUNIQVIgdWNSZXNldFZhbHVlWzRdOwotCQlzdHJ1Y3QgYmNtX2dwaW9fbXVsdGlfbW9kZSBncGlvX211bHRpX21vZGVbTUFYX0lEWF07Ci0JCXN0cnVjdCBiY21fZ3Bpb19tdWx0aV9tb2RlICpwZ3Bpb19tdWx0aV9tb2RlID0gKHN0cnVjdCBiY21fZ3Bpb19tdWx0aV9tb2RlICopZ3Bpb19tdWx0aV9tb2RlOwotCi0JCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihncGlvX211bHRpX21vZGUpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZncGlvX211bHRpX21vZGUsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlieXRlcyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKUdQSU9fTU9ERV9SRUdJU1RFUiwgKFBVSU5UKXVjUmVzZXRWYWx1ZSwgc2l6ZW9mKFVJTlQpKTsKLQotCQlpZiAoYnl0ZXMgPCAwKSB7Ci0JCQlTdGF0dXMgPSBieXRlczsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJSZWFkIG9mIEdQSU9fTU9ERV9SRUdJU1RFUiBmYWlsZWQiKTsKLQkJCXJldHVybiBTdGF0dXM7Ci0JCX0gZWxzZSB7Ci0JCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQkJfQotCi0JCS8qIFZhbGlkYXRpbmcgdGhlIHJlcXVlc3QgKi8KLQkJaWYgKElzUmVxR3Bpb0lzTGVkSW5OVk0oQWRhcHRlciwgcGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01hc2spID09IGZhbHNlKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCi0JCQkJCSJTb3JyeSwgUmVxdWVzdGVkIEdQSU88MHglWD4gaXMgbm90IGNvcnJlc3BvbmQgdG8gTlZNIExFRCBiaXQgbWFwPDB4JVg+ISEhIiwKLQkJCQkJcGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01hc2ssIEFkYXB0ZXItPmdwaW9CaXRNYXApOwotCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9NYXNrKSB7Ci0JCQkvKiB3cml0ZSBhbGwgT1VUJ3MgKDEncykgKi8KLQkJCSooVUlOVCAqKSB1Y1Jlc2V0VmFsdWUgfD0gKHBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9Nb2RlICYKLQkJCQkJCXBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9NYXNrKTsKLQotCQkJLyogd3JpdGUgYWxsIElOJ3MgKDAncykgKi8KLQkJCSooVUlOVCAqKSB1Y1Jlc2V0VmFsdWUgJj0gfigofnBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9Nb2RlKSAmCi0JCQkJCQlwZ3Bpb19tdWx0aV9tb2RlW1dJTUFYX0lEWF0udWlHUElPTWFzayk7Ci0KLQkJCS8qIEN1cnJlbnRseSBpbXBsZW1lbnRlZCByZXR1cm4gdGhlIG1vZGVzIG9mIGFsbCBHUElPJ3MKLQkJCSAqIGVsc2UgbmVlZHMgdG8gYml0IEFORCB3aXRoICBtYXNrCi0JCQkgKi8KLQkJCXBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9Nb2RlID0gKihVSU5UICopdWNSZXNldFZhbHVlOwotCi0JCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCBHUElPX01PREVfUkVHSVNURVIsIChQVUlOVCl1Y1Jlc2V0VmFsdWUsIHNpemVvZihVTE9ORykpOwotCQkJaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKLQkJCQkJCSJXUk0gdG8gR1BJT19NT0RFX1JFR0lTVEVSIERvbmUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJCSJXUk0gdG8gR1BJT19NT0RFX1JFR0lTVEVSIEZhaWxlZCIpOwotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0vKiBpZiB1aUdQSU9NYXNrIGlzIDAgdGhlbiByZXR1cm4gbW9kZSByZWdpc3RlciBjb25maWd1cmF0aW9uICovCi0JCQlwZ3Bpb19tdWx0aV9tb2RlW1dJTUFYX0lEWF0udWlHUElPTW9kZSA9ICooVUlOVCAqKXVjUmVzZXRWYWx1ZTsKLQkJfQotCi0JCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZncGlvX211bHRpX21vZGUsIElvQnVmZmVyLk91dHB1dExlbmd0aCk7Ci0JCWlmIChTdGF0dXMpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCSJGYWlsZWQgd2hpbGUgY29weWluZyBDb250ZW50IHRvIElPQnVmZXIgZm9yIHVzZXIgc3BhY2UgZXJyOiVkIiwgU3RhdHVzKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JfQotCWJyZWFrOworCWNhc2UgSU9DVExfQkNNX0dQSU9fTU9ERV9SRVFVRVNUOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9ncGlvX21vZGVfcmVxdWVzdChhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAogCWNhc2UgSU9DVExfTUFDX0FERFJfUkVROgogCWNhc2UgSU9DVExfTElOS19SRVE6CiAJY2FzZSBJT0NUTF9DTV9SRVFVRVNUOgogCWNhc2UgSU9DVExfU1NfSU5GT19SRVE6CiAJY2FzZSBJT0NUTF9TRU5EX0NPTlRST0xfTUVTU0FHRToKLQljYXNlIElPQ1RMX0lETEVfUkVROiB7Ci0JCVBWT0lEIHB2QnVmZmVyID0gTlVMTDsKLQotCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPCBzaXplb2Yoc3RydWN0IGJjbV9saW5rX3JlcXVlc3QpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gTUFYX0NOVExfUEtUX1NJWkUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlwdkJ1ZmZlciA9IG1lbWR1cF91c2VyKElvQnVmZmVyLklucHV0QnVmZmVyLAotCQkJCSAgICAgICBJb0J1ZmZlci5JbnB1dExlbmd0aCk7Ci0JCWlmIChJU19FUlIocHZCdWZmZXIpKQotCQkJcmV0dXJuIFBUUl9FUlIocHZCdWZmZXIpOwotCi0JCWRvd24oJkFkYXB0ZXItPkxvd1Bvd2VyTW9kZVN5bmMpOwotCQlTdGF0dXMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChBZGFwdGVyLT5sb3dwb3dlcl9tb2RlX3dhaXRfcXVldWUsCi0JCQkJCQkJIUFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUsCi0JCQkJCQkJKDEgKiBIWikpOwotCQlpZiAoU3RhdHVzID09IC1FUkVTVEFSVFNZUykKLQkJCWdvdG8gY250cmxFbmQ7Ci0KLQkJaWYgKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKLQkJCQkJIlByZXBhcmluZyBJZGxlIE1vZGUgaXMgc3RpbGwgVHJ1ZSAtIEhlbmNlIFJlamVjdGluZyBjb250cm9sIG1lc3NhZ2VcbiIpOwotCQkJU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7Ci0JCQlnb3RvIGNudHJsRW5kOwotCQl9Ci0JCVN0YXR1cyA9IENvcHlCdWZmZXJUb0NvbnRyb2xQYWNrZXQoQWRhcHRlciwgKFBWT0lEKXB2QnVmZmVyKTsKLQotY250cmxFbmQ6Ci0JCXVwKCZBZGFwdGVyLT5Mb3dQb3dlck1vZGVTeW5jKTsKLQkJa2ZyZWUocHZCdWZmZXIpOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIElPQ1RMX0JDTV9CVUZGRVJfRE9XTkxPQURfU1RBUlQ6IHsKLQkJaWYgKGRvd25fdHJ5bG9jaygmQWRhcHRlci0+TlZNUmRtV3JtTG9jaykpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKLQkJCQkJIklPQ1RMX0JDTV9DSElQX1JFU0VUIG5vdCBhbGxvd2VkIGFzIEVFUFJPTSBSZWFkL1dyaXRlIGlzIGluIHByb2dyZXNzXG4iKTsKLQkJCXJldHVybiAtRUFDQ0VTOwotCQl9Ci0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkiU3RhcnRpbmcgdGhlIGZpcm13YXJlIGRvd25sb2FkIFBJRCA9MHgleCEhISFcbiIsIGN1cnJlbnQtPnBpZCk7Ci0KLQkJaWYgKGRvd25fdHJ5bG9jaygmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSkpCi0JCQlyZXR1cm4gLUVCVVNZOwotCi0JCUFkYXB0ZXItPmJCaW5Eb3dubG9hZGVkID0gZmFsc2U7Ci0JCUFkYXB0ZXItPmZ3X2Rvd25sb2FkX3Byb2Nlc3NfcGlkID0gY3VycmVudC0+cGlkOwotCQlBZGFwdGVyLT5iQ2ZnRG93bmxvYWRlZCA9IGZhbHNlOwotCQlBZGFwdGVyLT5md19kb3dubG9hZF9kb25lID0gZmFsc2U7Ci0JCW5ldGlmX2NhcnJpZXJfb2ZmKEFkYXB0ZXItPmRldik7Ci0JCW5ldGlmX3N0b3BfcXVldWUoQWRhcHRlci0+ZGV2KTsKLQkJU3RhdHVzID0gcmVzZXRfY2FyZF9wcm9jKEFkYXB0ZXIpOwotCQlpZiAoU3RhdHVzKSB7Ci0JCQlwcl9lcnIoUEZYICIlczogcmVzZXRfY2FyZF9wcm9jIEZhaWxlZCFcbiIsIEFkYXB0ZXItPmRldi0+bmFtZSk7Ci0JCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7Ci0JCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQlyZXR1cm4gU3RhdHVzOwotCQl9Ci0JCW1kZWxheSgxMCk7Ci0KLQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCWNhc2UgSU9DVExfSURMRV9SRVE6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX21pc2NfcmVxdWVzdChhcmdwLCBBZGFwdGVyKTsKIAkJcmV0dXJuIFN0YXR1czsKLQl9CiAKLQljYXNlIElPQ1RMX0JDTV9CVUZGRVJfRE9XTkxPQUQ6IHsKLQkJc3RydWN0IGJjbV9maXJtd2FyZV9pbmZvICpwc0Z3SW5mbyA9IE5VTEw7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJTdGFydGluZyB0aGUgZmlybXdhcmUgZG93bmxvYWQgUElEID0weCV4ISEhIVxuIiwgY3VycmVudC0+cGlkKTsKLQotCQlpZiAoIWRvd25fdHJ5bG9jaygmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSkpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCSJJbnZhbGlkIHdheSB0byBkb3dubG9hZCBidWZmZXIuIFVzZSBTdGFydCBhbmQgdGhlbiBjYWxsIHRoaXMhISFcbiIpOwotCQkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOwotCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCXJldHVybiBTdGF0dXM7Ci0JCX0KLQotCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpIHsKLQkJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkiTGVuZ3RoIGZvciBGVyBETEQgaXMgOiAlbHhcbiIsIElvQnVmZmVyLklucHV0TGVuZ3RoKTsKLQotCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc3RydWN0IGJjbV9maXJtd2FyZV9pbmZvKSkgewotCQkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlwc0Z3SW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpwc0Z3SW5mbyksIEdGUF9LRVJORUwpOwotCQlpZiAoIXBzRndJbmZvKSB7Ci0JCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihwc0Z3SW5mbywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkgewotCQkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOwotCQkJa2ZyZWUocHNGd0luZm8pOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlpZiAoIXBzRndJbmZvLT5wdk1hcHBlZEZpcm13YXJlQWRkcmVzcyB8fAotCQkJKHBzRndJbmZvLT51MzJGaXJtd2FyZUxlbmd0aCA9PSAwKSkgewotCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiU29tZXRoaW5nIGVsc2UgaXMgd3JvbmcgJWx1XG4iLAotCQkJCQlwc0Z3SW5mby0+dTMyRmlybXdhcmVMZW5ndGgpOwotCQkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOwotCQkJa2ZyZWUocHNGd0luZm8pOwotCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCXJldHVybiBTdGF0dXM7Ci0JCX0KLQotCQlTdGF0dXMgPSBiY21faW9jdGxfZndfZG93bmxvYWQoQWRhcHRlciwgcHNGd0luZm8pOwotCi0JCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCWlmIChwc0Z3SW5mby0+dTMyU3RhcnRpbmdBZGRyZXNzID09IENPTkZJR19CRUdJTl9BRERSKQotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJJT0NUTDogQ29uZmlndXJhdGlvbiBGaWxlIFVwbG9hZCBGYWlsZWRcbiIpOwotCQkJZWxzZQotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCSJJT0NUTDogRmlybXdhcmUgRmlsZSBVcGxvYWQgRmFpbGVkXG4iKTsKLQotCQkJLyogdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOyAqLwotCi0JCQlpZiAoQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJiBCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZKSB7Ci0JCQkJQWRhcHRlci0+RHJpdmVyU3RhdGUgPSBEUklWRVJfSU5JVDsKLQkJCQlBZGFwdGVyLT5MRURJbmZvLmJMZWRJbml0RG9uZSA9IGZhbHNlOwotCQkJCXdha2VfdXAoJkFkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQotCQkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOwotCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMOiBGaXJtd2FyZSBGaWxlIFVwbG9hZGVkXG4iKTsKLQkJa2ZyZWUocHNGd0luZm8pOworCWNhc2UgSU9DVExfQkNNX0JVRkZFUl9ET1dOTE9BRF9TVEFSVDoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfYnVmZmVyX2Rvd25sb2FkX3N0YXJ0KEFkYXB0ZXIpOwogCQlyZXR1cm4gU3RhdHVzOwotCX0KIAotCWNhc2UgSU9DVExfQkNNX0JVRkZFUl9ET1dOTE9BRF9TVE9QOiB7Ci0JCWlmICghZG93bl90cnlsb2NrKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKSkgewotCQkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAoZG93bl90cnlsb2NrKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJIkZXIGRvd25sb2FkIGJsb2NrZWQgYXMgRUVQUk9NIFJlYWQvV3JpdGUgaXMgaW4gcHJvZ3Jlc3NcbiIpOwotCQkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOwotCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCX0KLQotCQlBZGFwdGVyLT5iQmluRG93bmxvYWRlZCA9IFRSVUU7Ci0JCUFkYXB0ZXItPmJDZmdEb3dubG9hZGVkID0gVFJVRTsKLQkJYXRvbWljX3NldCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MsIDApOwotCQlBZGFwdGVyLT5DdXJyTnVtUmVjdkRlc2NzID0gMDsKLQkJQWRhcHRlci0+ZG93bmxvYWRERFIgPSAwOwotCi0JCS8qIHNldHRpbmcgdGhlIE1pcHMgdG8gUnVuICovCi0JCVN0YXR1cyA9IHJ1bl9jYXJkX3Byb2MoQWRhcHRlcik7Ci0KLQkJaWYgKFN0YXR1cykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkZpcm0gRG93bmxvYWQgRmFpbGVkXG4iKTsKLQkJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKLQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCXJldHVybiBTdGF0dXM7Ci0JCX0gZWxzZSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKLQkJCQkJREJHX0xWTF9BTEwsICJGaXJtIERvd25sb2FkIE92ZXIuLi5cbiIpOwotCQl9Ci0KLQkJbWRlbGF5KDEwKTsKLQotCQkvKiBXYWl0IGZvciBNYWlsQm94IEludGVycnVwdCAqLwotCQlpZiAoU3RhcnRJbnRlcnJ1cHRVcmIoKHN0cnVjdCBiY21faW50ZXJmYWNlX2FkYXB0ZXIgKilBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIpKQotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIlVuYWJsZSB0byBzZW5kIGludGVycnVwdC4uLlxuIik7Ci0KLQkJdGltZW91dCA9IDUqSFo7Ci0JCUFkYXB0ZXItPndhaXRpbmdfdG9fZndfZG93bmxvYWRfZG9uZSA9IGZhbHNlOwotCQl3YWl0X2V2ZW50X3RpbWVvdXQoQWRhcHRlci0+aW9jdGxfZndfZG5sZF93YWl0X3F1ZXVlLAotCQkJCUFkYXB0ZXItPndhaXRpbmdfdG9fZndfZG93bmxvYWRfZG9uZSwgdGltZW91dCk7Ci0JCUFkYXB0ZXItPmZ3X2Rvd25sb2FkX3Byb2Nlc3NfcGlkID0gSU5WQUxJRF9QSUQ7Ci0JCUFkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUgPSBUUlVFOwotCQlhdG9taWNfc2V0KCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYywgMCk7Ci0JCUFkYXB0ZXItPkN1cnJOdW1SZWN2RGVzY3MgPSAwOwotCQlBZGFwdGVyLT5QcmV2TnVtUmVjdkRlc2NzID0gMDsKLQkJYXRvbWljX3NldCgmQWRhcHRlci0+Y250cmxwa3RDbnQsIDApOwotCQlBZGFwdGVyLT5MaW5rVXBTdGF0dXMgPSAwOwotCQlBZGFwdGVyLT5MaW5rU3RhdHVzID0gMDsKLQotCQlpZiAoQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJiBCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZKSB7Ci0JCQlBZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IEZXX0RPV05MT0FEX0RPTkU7Ci0JCQl3YWtlX3VwKCZBZGFwdGVyLT5MRURJbmZvLm5vdGlmeV9sZWRfZXZlbnQpOwotCQl9Ci0KLQkJaWYgKCF0aW1lb3V0KQotCQkJU3RhdHVzID0gLUVOT0RFVjsKLQotCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7Ci0JCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwljYXNlIElPQ1RMX0JDTV9CVUZGRVJfRE9XTkxPQUQ6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2J1ZmZlcl9kb3dubG9hZChhcmdwLCBBZGFwdGVyKTsKIAkJcmV0dXJuIFN0YXR1czsKLQl9CisKKwljYXNlIElPQ1RMX0JDTV9CVUZGRVJfRE9XTkxPQURfU1RPUDoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfYnVmZmVyX2Rvd25sb2FkX3N0b3AoYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CisKIAogCWNhc2UgSU9DVExfQkVfQlVDS0VUX1NJWkU6CiAJCVN0YXR1cyA9IDA7CkBAIC05ODYsMzUgKzI0MDQsMTMgQEAKIAkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAJCWJyZWFrOwogCi0JY2FzZSBJT0NUTF9DSElQX1JFU0VUOiB7Ci0JCUlOVCBOVk1BY2Nlc3MgPSBkb3duX3RyeWxvY2soJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQlpZiAoTlZNQWNjZXNzKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiIElPQ1RMX0JDTV9DSElQX1JFU0VUIG5vdCBhbGxvd2VkIGFzIEVFUFJPTSBSZWFkL1dyaXRlIGlzIGluIHByb2dyZXNzXG4iKTsKLQkJCXJldHVybiAtRUFDQ0VTOwotCQl9CisJY2FzZSBJT0NUTF9DSElQX1JFU0VUOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9jaGlwX3Jlc2V0KEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCWRvd24oJkFkYXB0ZXItPlJ4QXBwQ29udHJvbFF1ZXVlbG9jayk7Ci0JCVN0YXR1cyA9IHJlc2V0X2NhcmRfcHJvYyhBZGFwdGVyKTsKLQkJZmx1c2hBbGxBcHBRKCk7Ci0JCXVwKCZBZGFwdGVyLT5SeEFwcENvbnRyb2xRdWV1ZWxvY2spOwotCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCVJlc2V0Q291bnRlcnMoQWRhcHRlcik7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgSU9DVExfUU9TX1RIUkVTSE9MRDogewotCQlVU0hPUlQgdWlMb29wSW5kZXg7Ci0KLQkJU3RhdHVzID0gMDsKLQkJZm9yICh1aUxvb3BJbmRleCA9IDA7IHVpTG9vcEluZGV4IDwgTk9fT0ZfUVVFVUVTOyB1aUxvb3BJbmRleCsrKSB7Ci0JCQlpZiAoZ2V0X3VzZXIoQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVpVGhyZXNob2xkLAotCQkJCQkodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcpKSB7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlicmVhazsKLQl9CisJY2FzZSBJT0NUTF9RT1NfVEhSRVNIT0xEOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9xb3NfdGhyZXNob2xkKGFyZywgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKIAljYXNlIElPQ1RMX0RVTVBfUEFDS0VUX0lORk86CiAJCUR1bXBQYWNrSW5mbyhBZGFwdGVyKTsKQEAgLTEwMjMsMTQyICsyNDE5LDM5IEBACiAJCWJyZWFrOwogCiAJY2FzZSBJT0NUTF9HRVRfUEFDS19JTkZPOgotCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZBZGFwdGVyLT5QYWNrSW5mbywgc2l6ZW9mKHN0cnVjdCBiY21fcGFja2V0X2luZm8pKk5PX09GX1FVRVVFUykpCisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJkFkYXB0ZXItPlBhY2tJbmZvLAorCQkJc2l6ZW9mKHN0cnVjdCBiY21fcGFja2V0X2luZm8pKk5PX09GX1FVRVVFUykpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAJCWJyZWFrOwogCi0JY2FzZSBJT0NUTF9CQ01fU1dJVENIX1RSQU5TRkVSX01PREU6IHsKLQkJVUlOVCB1aURhdGEgPSAwOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnVpRGF0YSwgYXJncCwgc2l6ZW9mKFVJTlQpKSkKLQkJCXJldHVybiAtRUZBVUxUOworCWNhc2UgSU9DVExfQkNNX1NXSVRDSF9UUkFOU0ZFUl9NT0RFOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9zd2l0Y2hfdHJhbnNmZXJfbW9kZShhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQlpZiAodWlEYXRhKSB7Ci0JCQkvKiBBbGxvdyBBbGwgUGFja2V0cyAqLwotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSU9DVExfQkNNX1NXSVRDSF9UUkFOU0ZFUl9NT0RFOiBFVEhfUEFDS0VUX1RVTk5FTElOR19NT0RFXG4iKTsKLQkJCQlBZGFwdGVyLT5UcmFuc2Zlck1vZGUgPSBFVEhfUEFDS0VUX1RVTk5FTElOR19NT0RFOwotCQl9IGVsc2UgewotCQkJLyogQWxsb3cgSVAgb25seSBQYWNrZXRzICovCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fU1dJVENIX1RSQU5TRkVSX01PREU6IElQX1BBQ0tFVF9PTkxZX01PREVcbiIpOwotCQkJQWRhcHRlci0+VHJhbnNmZXJNb2RlID0gSVBfUEFDS0VUX09OTFlfTU9ERTsKLQkJfQotCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQkJYnJlYWs7Ci0JfQorCWNhc2UgSU9DVExfQkNNX0dFVF9EUklWRVJfVkVSU0lPTjoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfZ2V0X2RyaXZlcl92ZXJzaW9uKGFyZ3ApOworCQlyZXR1cm4gU3RhdHVzOwogCi0JY2FzZSBJT0NUTF9CQ01fR0VUX0RSSVZFUl9WRVJTSU9OOiB7Ci0JCXVsb25nIGxlbjsKKwljYXNlIElPQ1RMX0JDTV9HRVRfQ1VSUkVOVF9TVEFUVVM6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2dldF9jdXJyZW50X3N0YXR1cyhhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKKwljYXNlIElPQ1RMX0JDTV9TRVRfTUFDX1RSQUNJTkc6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX3NldF9tYWNfdHJhY2luZyhhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQlsZW4gPSBtaW5fdCh1bG9uZywgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLCBzdHJsZW4oRFJWX1ZFUlNJT04pICsgMSk7CisJY2FzZSBJT0NUTF9CQ01fR0VUX0RTWF9JTkRJQ0FUSU9OOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9nZXRfZHN4X2luZGljYXRpb24oYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIERSVl9WRVJTSU9OLCBsZW4pKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIElPQ1RMX0JDTV9HRVRfQ1VSUkVOVF9TVEFUVVM6IHsKLQkJc3RydWN0IGJjbV9saW5rX3N0YXRlIGxpbmtfc3RhdGU7Ci0KLQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiY29weV9mcm9tX3VzZXIgZmFpbGVkLi5cbiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoICE9IHNpemVvZihsaW5rX3N0YXRlKSkgewotCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJbWVtc2V0KCZsaW5rX3N0YXRlLCAwLCBzaXplb2YobGlua19zdGF0ZSkpOwotCQlsaW5rX3N0YXRlLmJJZGxlTW9kZSA9IEFkYXB0ZXItPklkbGVNb2RlOwotCQlsaW5rX3N0YXRlLmJTaHV0ZG93bk1vZGUgPSBBZGFwdGVyLT5iU2h1dFN0YXR1czsKLQkJbGlua19zdGF0ZS51Y0xpbmtTdGF0dXMgPSBBZGFwdGVyLT5MaW5rU3RhdHVzOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmbGlua19zdGF0ZSwgbWluX3Qoc2l6ZV90LCBzaXplb2YobGlua19zdGF0ZSksIElvQnVmZmVyLk91dHB1dExlbmd0aCkpKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weV90b191c2VyIEZhaWxlZC4uXG4iKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIElPQ1RMX0JDTV9TRVRfTUFDX1RSQUNJTkc6IHsKLQkJVUlOVCAgdHJhY2luZ19mbGFnOwotCi0JCS8qIGNvcHkgaW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmdHJhY2luZ19mbGFnLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKFVJTlQpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmICh0cmFjaW5nX2ZsYWcpCi0JCQlBZGFwdGVyLT5wVGFyYW5ncy0+TWFjVHJhY2luZ0VuYWJsZWQgPSBUUlVFOwotCQllbHNlCi0JCQlBZGFwdGVyLT5wVGFyYW5ncy0+TWFjVHJhY2luZ0VuYWJsZWQgPSBmYWxzZTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBJT0NUTF9CQ01fR0VUX0RTWF9JTkRJQ0FUSU9OOiB7Ci0JCVVMT05HIHVsU0ZJZCA9IDA7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKElvQnVmZmVyLk91dHB1dExlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYmNtX2FkZF9pbmRpY2F0aW9uX2FsdCkpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCSJNaXNtYXRjaCByZXE6ICVseCBuZWVkZWQgaXMgPTB4JXp4ISEhIiwKLQkJCQkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLCBzaXplb2Yoc3RydWN0IGJjbV9hZGRfaW5kaWNhdGlvbl9hbHQpKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1bFNGSWQsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YodWxTRklkKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJHZXQgRFNYIERhdGEgU0YgSUQgaXMgPSVseFxuIiwgdWxTRklkKTsKLQkJZ2V0X2RzeF9zZl9kYXRhX3RvX2FwcGxpY2F0aW9uKEFkYXB0ZXIsIHVsU0ZJZCwgSW9CdWZmZXIuT3V0cHV0QnVmZmVyKTsKLQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JfQotCWJyZWFrOwotCi0JY2FzZSBJT0NUTF9CQ01fR0VUX0hPU1RfTUlCUzogewotCQlQVk9JRCB0ZW1wX2J1ZmY7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgYmNtX2hvc3Rfc3RhdHNfbWlicykpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCSJMZW5ndGggQ2hlY2sgZmFpbGVkICVsdSAlemRcbiIsCi0JCQkJCUlvQnVmZmVyLk91dHB1dExlbmd0aCwgc2l6ZW9mKHN0cnVjdCBiY21faG9zdF9zdGF0c19taWJzKSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCS8qIEZJWE1FOiBIT1NUX1NUQVRTIGFyZSB0b28gYmlnIGZvciBrbWFsbG9jICgxMjIwNDgpISAqLwotCQl0ZW1wX2J1ZmYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYmNtX2hvc3Rfc3RhdHNfbWlicyksIEdGUF9LRVJORUwpOwotCQlpZiAoIXRlbXBfYnVmZikKLQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQotCQlTdGF0dXMgPSBQcm9jZXNzR2V0SG9zdE1pYnMoQWRhcHRlciwgdGVtcF9idWZmKTsKLQkJR2V0RHJvcHBlZEFwcENudHJsUGt0TWlicyh0ZW1wX2J1ZmYsIHBUYXJhbmcpOwotCi0JCWlmIChTdGF0dXMgIT0gU1RBVFVTX0ZBSUxVUkUpCi0JCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgdGVtcF9idWZmLCBzaXplb2Yoc3RydWN0IGJjbV9ob3N0X3N0YXRzX21pYnMpKSkgewotCQkJCWtmcmVlKHRlbXBfYnVmZik7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0KLQkJa2ZyZWUodGVtcF9idWZmKTsKLQkJYnJlYWs7Ci0JfQorCWNhc2UgSU9DVExfQkNNX0dFVF9IT1NUX01JQlM6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2dldF9ob3N0X21pYnMoYXJncCwgQWRhcHRlciwgcFRhcmFuZyk7CisJCXJldHVybiBTdGF0dXM7CiAKIAljYXNlIElPQ1RMX0JDTV9XQUtFX1VQX0RFVklDRV9GUk9NX0lETEU6Ci0JCWlmICgoZmFsc2UgPT0gQWRhcHRlci0+YlRyaWVkVG9XYWtlVXBGcm9tbG93UG93ZXJNb2RlKSAmJiAoVFJVRSA9PSBBZGFwdGVyLT5JZGxlTW9kZSkpIHsKKwkJaWYgKChmYWxzZSA9PSBBZGFwdGVyLT5iVHJpZWRUb1dha2VVcEZyb21sb3dQb3dlck1vZGUpICYmCisJCQkoVFJVRSA9PSBBZGFwdGVyLT5JZGxlTW9kZSkpIHsKIAkJCUFkYXB0ZXItPnVzSWRsZU1vZGVQYXR0ZXJuID0gQUJPUlRfSURMRV9NT0RFOwogCQkJQWRhcHRlci0+Yldha2VVcERldmljZSA9IFRSVUU7CiAJCQl3YWtlX3VwKCZBZGFwdGVyLT5wcm9jZXNzX3J4X2NudHJscGt0KTsKQEAgLTExNjcsODg2ICsyNDYwLDgyIEBACiAJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCQlicmVhazsKIAotCWNhc2UgSU9DVExfQkNNX0JVTEtfV1JNOiB7Ci0JCXN0cnVjdCBiY21fYnVsa193cm1fYnVmZmVyICpwQnVsa0J1ZmZlcjsKLQkJVUlOVCB1aVRlbXBWYXIgPSAwOwotCQlQQ0hBUiBwdkJ1ZmZlciA9IE5VTEw7Ci0KLQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgewotCi0JCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkRldmljZSBpbiBJZGxlL1NodXRkb3duIE1vZGUsIEJsb2NraW5nIFdybXNcbiIpOwotCQkJU3RhdHVzID0gLUVBQ0NFUzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoIDwgc2l6ZW9mKFVMT05HKSAqIDIpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlwdkJ1ZmZlciA9IG1lbWR1cF91c2VyKElvQnVmZmVyLklucHV0QnVmZmVyLAotCQkJCSAgICAgICBJb0J1ZmZlci5JbnB1dExlbmd0aCk7Ci0JCWlmIChJU19FUlIocHZCdWZmZXIpKQotCQkJcmV0dXJuIFBUUl9FUlIocHZCdWZmZXIpOwotCi0JCXBCdWxrQnVmZmVyID0gKHN0cnVjdCBiY21fYnVsa193cm1fYnVmZmVyICopcHZCdWZmZXI7Ci0KLQkJaWYgKCgoVUxPTkcpcEJ1bGtCdWZmZXItPlJlZ2lzdGVyICYgMHgwRjAwMDAwMCkgIT0gMHgwRjAwMDAwMCB8fAotCQkJKChVTE9ORylwQnVsa0J1ZmZlci0+UmVnaXN0ZXIgJiAweDMpKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIldSTSBEb25lIE9uIGludmFsaWQgQWRkcmVzcyA6ICV4IEFjY2VzcyBEZW5pZWQuXG4iLCAoaW50KXBCdWxrQnVmZmVyLT5SZWdpc3Rlcik7Ci0JCQlrZnJlZShwdkJ1ZmZlcik7Ci0JCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQl1aVRlbXBWYXIgPSBwQnVsa0J1ZmZlci0+UmVnaXN0ZXIgJiBFRVBST01fUkVKRUNUX01BU0s7Ci0JCWlmICghKChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJDdXN0b21pemUpJlZTR19NT0RFKSAmJgotCQkJKCh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMSkgfHwKLQkJCQkodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzIpIHx8Ci0JCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18zKSB8fAotCQkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfNCkpICYmCi0JCQkoY21kID09IElPQ1RMX0JDTV9SRUdJU1RFUl9XUklURSkpIHsKLQotCQkJa2ZyZWUocHZCdWZmZXIpOwotCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJFRVBST00gQWNjZXNzIERlbmllZCwgbm90IGluIFZTRyBNb2RlXG4iKTsKLQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChwQnVsa0J1ZmZlci0+U3dhcEVuZGlhbiA9PSBmYWxzZSkKLQkJCVN0YXR1cyA9IHdybVdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKXBCdWxrQnVmZmVyLT5SZWdpc3RlciwgKFBDSEFSKXBCdWxrQnVmZmVyLT5WYWx1ZXMsIElvQnVmZmVyLklucHV0TGVuZ3RoIC0gMipzaXplb2YoVUxPTkcpKTsKLQkJZWxzZQotCQkJU3RhdHVzID0gd3JtYWx0V2l0aExvY2soQWRhcHRlciwgKFVJTlQpcEJ1bGtCdWZmZXItPlJlZ2lzdGVyLCAoUFVJTlQpcEJ1bGtCdWZmZXItPlZhbHVlcywgSW9CdWZmZXIuSW5wdXRMZW5ndGggLSAyKnNpemVvZihVTE9ORykpOwotCi0JCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiV1JNIEZhaWxlZFxuIik7Ci0KLQkJa2ZyZWUocHZCdWZmZXIpOwotCQlicmVhazsKLQl9CisJY2FzZSBJT0NUTF9CQ01fQlVMS19XUk06CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2J1bGtfd3JtKGFyZ3AsIEFkYXB0ZXIsIGNtZCk7CisJCXJldHVybiBTdGF0dXM7CiAKIAljYXNlIElPQ1RMX0JDTV9HRVRfTlZNX1NJWkU6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2dldF9udm1fc2l6ZShhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQlpZiAoQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0VFUFJPTSB8fCBBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRkxBU0gpIHsKLQkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmQWRhcHRlci0+dWlOVk1EU0RTaXplLCBzaXplb2YoVUlOVCkpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCWJyZWFrOwotCi0JY2FzZSBJT0NUTF9CQ01fQ0FMX0lOSVQ6IHsKLQkJVUlOVCB1aVNlY3RvclNpemUgPSAwOwotCQlpZiAoQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0ZMQVNIKSB7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1aVNlY3RvclNpemUsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoVUlOVCkpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQlpZiAoKHVpU2VjdG9yU2l6ZSA8IE1JTl9TRUNUT1JfU0laRSkgfHwgKHVpU2VjdG9yU2l6ZSA+IE1BWF9TRUNUT1JfU0laRSkpIHsKLQkJCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJkFkYXB0ZXItPnVpU2VjdG9yU2l6ZSwKLQkJCQkJCQlzaXplb2YoVUlOVCkpKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKElzRmxhc2gyeChBZGFwdGVyKSkgewotCQkJCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwJJkFkYXB0ZXItPnVpU2VjdG9yU2l6ZSwgc2l6ZW9mKFVJTlQpKSkKLQkJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICgoVFJVRSA9PSBBZGFwdGVyLT5iU2h1dFN0YXR1cykgfHwgKFRSVUUgPT0gQWRhcHRlci0+SWRsZU1vZGUpKSB7Ci0JCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7Ci0JCQkJCQlyZXR1cm4gLUVBQ0NFUzsKLQkJCQkJfQotCi0JCQkJCUFkYXB0ZXItPnVpU2VjdG9yU2l6ZSA9IHVpU2VjdG9yU2l6ZTsKLQkJCQkJQmNtVXBkYXRlU2VjdG9yU2l6ZShBZGFwdGVyLCBBZGFwdGVyLT51aVNlY3RvclNpemUpOwotCQkJCX0KLQkJCX0KLQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCQl9IGVsc2UgewotCQkJU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7Ci0JCX0KLQl9Ci0JYnJlYWs7CisJY2FzZSBJT0NUTF9CQ01fQ0FMX0lOSVQ6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2NhbF9pbml0KGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCiAJY2FzZSBJT0NUTF9CQ01fU0VUX0RFQlVHOgotI2lmZGVmIERFQlVHCi0JewotCQlzdHJ1Y3QgYmNtX3VzZXJfZGVidWdfc3RhdGUgc1VzZXJEZWJ1Z1N0YXRlOwotCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkluIFNFVF9ERUJVRyBpb2N0bFxuIik7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzVXNlckRlYnVnU3RhdGUsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2Yoc3RydWN0IGJjbV91c2VyX2RlYnVnX3N0YXRlKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIklPQ1RMX0JDTV9TRVRfREVCVUc6IE9uT2ZmPSVkIFR5cGUgPSAweCV4ICIsCi0JCQkJc1VzZXJEZWJ1Z1N0YXRlLk9uT2ZmLCBzVXNlckRlYnVnU3RhdGUuVHlwZSk7Ci0JCS8qIHNVc2VyRGVidWdTdGF0ZS5TdWJ0eXBlIDw8PSAxOyAqLwotCQlzVXNlckRlYnVnU3RhdGUuU3VidHlwZSA9IDEgPDwgc1VzZXJEZWJ1Z1N0YXRlLlN1YnR5cGU7Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiYWN0dWFsIFN1YnR5cGU9MHgleFxuIiwgc1VzZXJEZWJ1Z1N0YXRlLlN1YnR5cGUpOwotCi0JCS8qIFVwZGF0ZSBuZXcgJ0RlYnVnU3RhdGUnIGluIHRoZSBBZGFwdGVyICovCi0JCUFkYXB0ZXItPnN0RGVidWdTdGF0ZS50eXBlIHw9IHNVc2VyRGVidWdTdGF0ZS5UeXBlOwotCQkvKiBTdWJ0eXBlOiBBIGJpdG1hcCBvZiAzMiBiaXRzIGZvciBTdWJ0eXBlIHBlciBUeXBlLgotCQkgKiBWYWxpZCBpbmRleGVzIGluICdzdWJ0eXBlJyBhcnJheTogMSwyLDQsOAotCQkgKiBjb3JyZXNwb25kaW5nIHRvIHZhbGlkIFR5cGUgdmFsdWVzLiBIZW5jZSB3ZSBjYW4gdXNlIHRoZSAnVHlwZScgZmllbGQKLQkJICogYXMgdGhlIGluZGV4IHZhbHVlLCBpZ25vcmluZyB0aGUgYXJyYXkgZW50cmllcyAwLDMsNSw2LDcgIQotCQkgKi8KLQkJaWYgKHNVc2VyRGVidWdTdGF0ZS5Pbk9mZikKLQkJCUFkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW3NVc2VyRGVidWdTdGF0ZS5UeXBlXSB8PSBzVXNlckRlYnVnU3RhdGUuU3VidHlwZTsKLQkJZWxzZQotCQkJQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbc1VzZXJEZWJ1Z1N0YXRlLlR5cGVdICY9IH5zVXNlckRlYnVnU3RhdGUuU3VidHlwZTsKLQotCQlCQ01fU0hPV19ERUJVR19CSVRNQVAoQWRhcHRlcik7Ci0JfQotI2VuZGlmCi0JYnJlYWs7CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX3NldF9kZWJ1ZyhhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAogCWNhc2UgSU9DVExfQkNNX05WTV9SRUFEOgotCWNhc2UgSU9DVExfQkNNX05WTV9XUklURTogewotCQlzdHJ1Y3QgYmNtX252bV9yZWFkd3JpdGUgc3ROVk1SZWFkV3JpdGU7Ci0JCVBVQ0hBUiBwUmVhZERhdGEgPSBOVUxMOwotCQlVTE9ORyB1bERTRE1hZ2ljTnVtSW5Vc3JCdWZmID0gMDsKLQkJc3RydWN0IHRpbWV2YWwgdHYwLCB0djE7Ci0JCW1lbXNldCgmdHYwLCAwLCBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKLQkJbWVtc2V0KCZ0djEsIDAsIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOwotCQlpZiAoKEFkYXB0ZXItPmVOVk1UeXBlID09IE5WTV9GTEFTSCkgJiYgKEFkYXB0ZXItPnVpRmxhc2hMYXlvdXRNYWpvclZlcnNpb24gPT0gMCkpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJUaGUgRmxhc2ggQ29udHJvbCBTZWN0aW9uIGlzIENvcnJ1cHRlZC4gSGVuY2UgUmVqZWN0aW9uIG9uIE5WTSBSZWFkL1dyaXRlXG4iKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9CisJY2FzZSBJT0NUTF9CQ01fTlZNX1dSSVRFOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9udm1fcncoYXJncCwgQWRhcHRlciwgY21kKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpKSB7Ci0JCQlpZiAoKEFkYXB0ZXItPmVBY3RpdmVEU0QgIT0gRFNEMCkgJiYKLQkJCQkoQWRhcHRlci0+ZUFjdGl2ZURTRCAhPSBEU0QxKSAmJgotCQkJCShBZGFwdGVyLT5lQWN0aXZlRFNEICE9IERTRDIpKSB7CisJY2FzZSBJT0NUTF9CQ01fRkxBU0gyWF9TRUNUSU9OX1JFQUQ6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2ZsYXNoMnhfc2VjdGlvbl9yZWFkKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIk5vIERTRCBpcyBhY3RpdmUuLmhlbmNlIE5WTSBDb21tYW5kIGlzIGJsb2NrZWQiKTsKLQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0JCQl9Ci0JCX0KKwljYXNlIElPQ1RMX0JDTV9GTEFTSDJYX1NFQ1RJT05fV1JJVEU6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2ZsYXNoMnhfc2VjdGlvbl93cml0ZShhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKKwljYXNlIElPQ1RMX0JDTV9HRVRfRkxBU0gyWF9TRUNUSU9OX0JJVE1BUDoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfZmxhc2gyeF9zZWN0aW9uX2JpdG1hcChhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQlpZiAoY29weV9mcm9tX3VzZXIoJnN0TlZNUmVhZFdyaXRlLAotCQkJCQkoSU9DVExfQkNNX05WTV9SRUFEID09IGNtZCkgPyBJb0J1ZmZlci5PdXRwdXRCdWZmZXIgOiBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBiY21fbnZtX3JlYWR3cml0ZSkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJY2FzZSBJT0NUTF9CQ01fU0VUX0FDVElWRV9TRUNUSU9OOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9zZXRfYWN0aXZlX3NlY3Rpb24oYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJLyoKLQkJICogRGVueSB0aGUgYWNjZXNzIGlmIHRoZSBvZmZzZXQgY3Jvc3NlcyB0aGUgY2FsIGFyZWEgbGltaXQuCi0JCSAqLwotCQlpZiAoc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyA+IEFkYXB0ZXItPnVpTlZNRFNEU2l6ZSkKLQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQotCQlpZiAoc3ROVk1SZWFkV3JpdGUudWlPZmZzZXQgPiBBZGFwdGVyLT51aU5WTURTRFNpemUgLSBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKSB7Ci0JCQkvKiBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkNhbid0IGFsbG93IGFjY2VzcyBiZXlvbmQgTlZNIFNpemU6IDB4JXggMHgleFxuIiwgc3ROVk1SZWFkV3JpdGUudWlPZmZzZXQsIHN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMpOyAqLwotCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotCQl9Ci0KLQkJcFJlYWREYXRhID0gbWVtZHVwX3VzZXIoc3ROVk1SZWFkV3JpdGUucEJ1ZmZlciwKLQkJCQkJc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyk7Ci0JCWlmIChJU19FUlIocFJlYWREYXRhKSkKLQkJCXJldHVybiBQVFJfRVJSKHBSZWFkRGF0YSk7Ci0KLQkJZG9fZ2V0dGltZW9mZGF5KCZ0djApOwotCQlpZiAoSU9DVExfQkNNX05WTV9SRUFEID09IGNtZCkgewotCQkJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0KLQkJCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKLQkJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgewotCi0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7Ci0JCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCWtmcmVlKHBSZWFkRGF0YSk7Ci0JCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCQl9Ci0KLQkJCVN0YXR1cyA9IEJlY2VlbU5WTVJlYWQoQWRhcHRlciwgKFBVSU5UKXBSZWFkRGF0YSwgc3ROVk1SZWFkV3JpdGUudWlPZmZzZXQsIHN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMpOwotCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCi0JCQlpZiAoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQkJa2ZyZWUocFJlYWREYXRhKTsKLQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJfQotCi0JCQlpZiAoY29weV90b191c2VyKHN0TlZNUmVhZFdyaXRlLnBCdWZmZXIsIHBSZWFkRGF0YSwgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcykpIHsKLQkJCQlrZnJlZShwUmVhZERhdGEpOwotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCQl9IGVsc2UgewotCQkJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0KLQkJCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKLQkJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgewotCi0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7Ci0JCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCWtmcmVlKHBSZWFkRGF0YSk7Ci0JCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCQl9Ci0KLQkJCUFkYXB0ZXItPmJIZWFkZXJDaGFuZ2VBbGxvd2VkID0gVFJVRTsKLQkJCWlmIChJc0ZsYXNoMngoQWRhcHRlcikpIHsKLQkJCQkvKgotCQkJCSAqCQkJTmV3IFJlcXVpcmVtZW50Oi0KLQkJCQkgKgkJCURTRCBzZWN0aW9uIHVwZGF0aW9uIHdpbGwgYmUgYWxsb3dlZCBpbiB0d28gY2FzZTotCi0JCQkJICoJCQkxLiAgaWYgRFNEIHNpZyBpcyBwcmVzZW50IGluIERTRCBoZWFkZXIgbWVhbnMgZG9uZ2xlIGlzIG9rIGFuZCB1cGRhdGlvbiBpcyBmcnVpdGZ1bGwKLQkJCQkgKgkJCTIuICBpZiBwb2ludCAxIGZhaWxlcyB0aGVuIHVzZXIgYnVmZiBzaG91bGQgaGF2ZSBEU0Qgc2lnLiB0aGlzIHBvaW50IGVuc3VyZXMgdGhhdCBpZiBkb25nbGUgaXMKLQkJCQkgKgkJCSAgICAgIGNvcnJ1cHRlZCB0aGVuIHVzZXIgc3BhY2UgcHJvZ3JhbSBmaXJzdCBtb2RpZnkgdGhlIERTRCBoZWFkZXIgd2l0aCB2YWxpZCBEU0Qgc2lnIHNvCi0JCQkJICoJCQkgICAgICB0aGF0IHRoaXMgYXMgd2VsbCBhcyBmdXJ0aGVyIHdyaXRlIG1heSBiZSB3b3J0aHdoaWxlLgotCQkJCSAqCi0JCQkJICoJCQkgVGhpcyByZXN0cmljdGlvbiBoYXMgYmVlbiBwdXQgYXNzdW1pbmcgdGhhdCBpZiBEU0Qgc2lnIGlzIGNvcnJ1cHRlZCwgRFNECi0JCQkJICoJCQkgZGF0YSB3b24ndCBiZSBjb25zaWRlcmVkIHZhbGlkLgotCQkJCSAqLwotCi0JCQkJU3RhdHVzID0gQmNtRmxhc2gyeENvcnJ1cHRTaWcoQWRhcHRlciwgQWRhcHRlci0+ZUFjdGl2ZURTRCk7Ci0JCQkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJCQlpZiAoKChzdE5WTVJlYWRXcml0ZS51aU9mZnNldCArIHN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMpICE9IEFkYXB0ZXItPnVpTlZNRFNEU2l6ZSkgfHwKLQkJCQkJCShzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzIDwgU0lHTkFUVVJFX1NJWkUpKSB7Ci0KLQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkRTRCBTaWcgaXMgcHJlc2VudCBuZWl0aGVyIGluIEZsYXNoIG5vciBVc2VyIHByb3ZpZGVkIElucHV0Li4iKTsKLQkJCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQkJCWtmcmVlKHBSZWFkRGF0YSk7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJCQl9Ci0KLQkJCQkJdWxEU0RNYWdpY051bUluVXNyQnVmZiA9IG50b2hsKCooUFVJTlQpKHBSZWFkRGF0YSArIHN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMgLSBTSUdOQVRVUkVfU0laRSkpOwotCQkJCQlpZiAodWxEU0RNYWdpY051bUluVXNyQnVmZiAhPSBEU0RfSU1BR0VfTUFHSUNfTlVNQkVSKSB7Ci0JCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEU0QgU2lnIGlzIHByZXNlbnQgbmVpdGhlciBpbiBGbGFzaCBub3IgVXNlciBwcm92aWRlZCBJbnB1dC4uIik7Ci0JCQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJCQlrZnJlZShwUmVhZERhdGEpOwotCQkJCQkJcmV0dXJuIFN0YXR1czsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJU3RhdHVzID0gQmVjZWVtTlZNV3JpdGUoQWRhcHRlciwgKFBVSU5UKXBSZWFkRGF0YSwgc3ROVk1SZWFkV3JpdGUudWlPZmZzZXQsIHN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMsIHN0TlZNUmVhZFdyaXRlLmJWZXJpZnkpOwotCQkJaWYgKElzRmxhc2gyeChBZGFwdGVyKSkKLQkJCQlCY21GbGFzaDJ4V3JpdGVTaWcoQWRhcHRlciwgQWRhcHRlci0+ZUFjdGl2ZURTRCk7Ci0KLQkJCUFkYXB0ZXItPmJIZWFkZXJDaGFuZ2VBbGxvd2VkID0gZmFsc2U7Ci0KLQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQotCQkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJCWtmcmVlKHBSZWFkRGF0YSk7Ci0JCQkJcmV0dXJuIFN0YXR1czsKLQkJCX0KLQkJfQotCi0JCWRvX2dldHRpbWVvZmRheSgmdHYxKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiIHRpbWV0YWtlbiBieSBXcml0ZS9yZWFkIDolbGQgbXNlY1xuIiwgKHR2MS50dl9zZWMgLSB0djAudHZfc2VjKSoxMDAwICsgKHR2MS50dl91c2VjIC0gdHYwLnR2X3VzZWMpLzEwMDApOwotCi0JCWtmcmVlKHBSZWFkRGF0YSk7Ci0JCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKLQl9Ci0KLQljYXNlIElPQ1RMX0JDTV9GTEFTSDJYX1NFQ1RJT05fUkVBRDogewotCQlzdHJ1Y3QgYmNtX2ZsYXNoMnhfcmVhZHdyaXRlIHNGbGFzaDJ4UmVhZCA9IHswfTsKLQkJUFVDSEFSIHBSZWFkQnVmZiA9IE5VTEw7Ci0JCVVJTlQgTk9CID0gMDsKLQkJVUlOVCBCdWZmU2l6ZSA9IDA7Ci0JCVVJTlQgUmVhZEJ5dGVzID0gMDsKLQkJVUlOVCBSZWFkT2Zmc2V0ID0gMDsKLQkJdm9pZCBfX3VzZXIgKk91dFB1dEJ1ZmY7Ci0KLQkJaWYgKElzRmxhc2gyeChBZGFwdGVyKSAhPSBUUlVFKQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRmxhc2ggRG9lcyBub3QgaGF2ZSAyLnggbWFwIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9GTEFTSDJYX1NFQ1RJT05fUkVBRCBDYWxsZWQiKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkvKiBSZWFkaW5nIEZMQVNIIDIueCBSRUFEIHN0cnVjdHVyZSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnNGbGFzaDJ4UmVhZCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihzdHJ1Y3QgYmNtX2ZsYXNoMnhfcmVhZHdyaXRlKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJcbnNGbGFzaDJ4UmVhZC5TZWN0aW9uIDoleCIsIHNGbGFzaDJ4UmVhZC5TZWN0aW9uKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiXG5zRmxhc2gyeFJlYWQub2Zmc2V0IDoleCIsIHNGbGFzaDJ4UmVhZC5vZmZzZXQpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJcbnNGbGFzaDJ4UmVhZC5udW1PZkJ5dGVzIDoleCIsIHNGbGFzaDJ4UmVhZC5udW1PZkJ5dGVzKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiXG5zRmxhc2gyeFJlYWQuYlZlcmlmeSA6JXhcbiIsIHNGbGFzaDJ4UmVhZC5iVmVyaWZ5KTsKLQotCQkvKiBUaGlzIHdhcyBpbnRlcm5hbCB0byBkcml2ZXIgZm9yIHJhdyByZWFkLiBub3cgaXQgaGFzIGJlbiBleHBvc2VkIHRvIHVzZXIgc3BhY2UgYXBwLiAqLwotCQlpZiAodmFsaWRhdGVGbGFzaDJ4UmVhZFdyaXRlKEFkYXB0ZXIsICZzRmxhc2gyeFJlYWQpID09IGZhbHNlKQotCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotCi0JCU5PQiA9IHNGbGFzaDJ4UmVhZC5udW1PZkJ5dGVzOwotCQlpZiAoTk9CID4gQWRhcHRlci0+dWlTZWN0b3JTaXplKQotCQkJQnVmZlNpemUgPSBBZGFwdGVyLT51aVNlY3RvclNpemU7Ci0JCWVsc2UKLQkJCUJ1ZmZTaXplID0gTk9COwotCi0JCVJlYWRPZmZzZXQgPSBzRmxhc2gyeFJlYWQub2Zmc2V0OwotCQlPdXRQdXRCdWZmID0gSW9CdWZmZXIuT3V0cHV0QnVmZmVyOwotCQlwUmVhZEJ1ZmYgPSAoUENIQVIpa3phbGxvYyhCdWZmU2l6ZSAsIEdGUF9LRVJORUwpOwotCi0JCWlmIChwUmVhZEJ1ZmYgPT0gTlVMTCkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgRmxhc2ggMi54IFJlYWQgU3RydWN0dXJlIik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQotCQlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7Ci0KLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOwotCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJa2ZyZWUocFJlYWRCdWZmKTsKLQkJCXJldHVybiAtRUFDQ0VTOwotCQl9Ci0KLQkJd2hpbGUgKE5PQikgewotCQkJaWYgKE5PQiA+IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSkKLQkJCQlSZWFkQnl0ZXMgPSBBZGFwdGVyLT51aVNlY3RvclNpemU7Ci0JCQllbHNlCi0JCQkJUmVhZEJ5dGVzID0gTk9COwotCi0JCQkvKiBSZWFkaW5nIHRoZSBkYXRhIGZyb20gRmxhc2ggMi54ICovCi0JCQlTdGF0dXMgPSBCY21GbGFzaDJ4QnVsa1JlYWQoQWRhcHRlciwgKFBVSU5UKXBSZWFkQnVmZiwgc0ZsYXNoMnhSZWFkLlNlY3Rpb24sIFJlYWRPZmZzZXQsIFJlYWRCeXRlcyk7Ci0JCQlpZiAoU3RhdHVzKSB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRmxhc2ggMnggcmVhZCBlcnIgd2l0aCBTdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJQkNNX0RFQlVHX1BSSU5UX0JVRkZFUihBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgcFJlYWRCdWZmLCBSZWFkQnl0ZXMpOwotCi0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIoT3V0UHV0QnVmZiwgcFJlYWRCdWZmLCBSZWFkQnl0ZXMpOwotCQkJaWYgKFN0YXR1cykgewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkNvcHkgdG8gdXNlIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQlrZnJlZShwUmVhZEJ1ZmYpOwotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCQkJTk9CID0gTk9CIC0gUmVhZEJ5dGVzOwotCQkJaWYgKE5PQikgewotCQkJCVJlYWRPZmZzZXQgPSBSZWFkT2Zmc2V0ICsgUmVhZEJ5dGVzOwotCQkJCU91dFB1dEJ1ZmYgPSBPdXRQdXRCdWZmICsgUmVhZEJ5dGVzOwotCQkJfQotCQl9Ci0KLQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQlrZnJlZShwUmVhZEJ1ZmYpOwotCX0KLQlicmVhazsKLQotCWNhc2UgSU9DVExfQkNNX0ZMQVNIMlhfU0VDVElPTl9XUklURTogewotCQlzdHJ1Y3QgYmNtX2ZsYXNoMnhfcmVhZHdyaXRlIHNGbGFzaDJ4V3JpdGUgPSB7MH07Ci0JCVBVQ0hBUiBwV3JpdGVCdWZmOwotCQl2b2lkIF9fdXNlciAqSW5wdXRBZGRyOwotCQlVSU5UIE5PQiA9IDA7Ci0JCVVJTlQgQnVmZlNpemUgPSAwOwotCQlVSU5UIFdyaXRlT2Zmc2V0ID0gMDsKLQkJVUlOVCBXcml0ZUJ5dGVzID0gMDsKLQotCQlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpICE9IFRSVUUpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJGbGFzaCBEb2VzIG5vdCBoYXZlIDIueCBtYXAiKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJLyogRmlyc3QgbWFrZSB0aGlzIEZhbHNlIHNvIHRoYXQgd2UgY2FuIGVuYWJsZSB0aGUgU2VjdG9yIFBlcm1pc3Npb24gQ2hlY2sgaW4gQmVjZWVtRmxhc2hCdWxrV3JpdGUgKi8KLQkJQWRhcHRlci0+YkFsbERTRFdyaXRlQWxsb3cgPSBmYWxzZTsKLQotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fRkxBU0gyWF9TRUNUSU9OX1dSSVRFIENhbGxlZCIpOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJLyogUmVhZGluZyBGTEFTSCAyLnggUkVBRCBzdHJ1Y3R1cmUgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzRmxhc2gyeFdyaXRlLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2gyeF9yZWFkd3JpdGUpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlxuc0ZsYXNoMnhSZWFkLlNlY3Rpb24gOiV4Iiwgc0ZsYXNoMnhXcml0ZS5TZWN0aW9uKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiXG5zRmxhc2gyeFJlYWQub2Zmc2V0IDolZCIsIHNGbGFzaDJ4V3JpdGUub2Zmc2V0KTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiXG5zRmxhc2gyeFJlYWQubnVtT2ZCeXRlcyA6JXgiLCBzRmxhc2gyeFdyaXRlLm51bU9mQnl0ZXMpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJcbnNGbGFzaDJ4UmVhZC5iVmVyaWZ5IDoleFxuIiwgc0ZsYXNoMnhXcml0ZS5iVmVyaWZ5KTsKLQotCQlpZiAoKHNGbGFzaDJ4V3JpdGUuU2VjdGlvbiAhPSBWU0EwKSAmJiAoc0ZsYXNoMnhXcml0ZS5TZWN0aW9uICE9IFZTQTEpICYmIChzRmxhc2gyeFdyaXRlLlNlY3Rpb24gIT0gVlNBMikpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIk9ubHkgVlNBIHdyaXRlIGlzIGFsbG93ZWQiKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJaWYgKHZhbGlkYXRlRmxhc2gyeFJlYWRXcml0ZShBZGFwdGVyLCAmc0ZsYXNoMnhXcml0ZSkgPT0gZmFsc2UpCi0JCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0KLQkJSW5wdXRBZGRyID0gc0ZsYXNoMnhXcml0ZS5wRGF0YUJ1ZmY7Ci0JCVdyaXRlT2Zmc2V0ID0gc0ZsYXNoMnhXcml0ZS5vZmZzZXQ7Ci0JCU5PQiA9IHNGbGFzaDJ4V3JpdGUubnVtT2ZCeXRlczsKLQotCQlpZiAoTk9CID4gQWRhcHRlci0+dWlTZWN0b3JTaXplKQotCQkJQnVmZlNpemUgPSBBZGFwdGVyLT51aVNlY3RvclNpemU7Ci0JCWVsc2UKLQkJCUJ1ZmZTaXplID0gTk9COwotCi0JCXBXcml0ZUJ1ZmYgPSBrbWFsbG9jKEJ1ZmZTaXplLCBHRlBfS0VSTkVMKTsKLQotCQlpZiAocFdyaXRlQnVmZiA9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJLyogZXh0cmFjdGluZyB0aGUgcmVtYWluZGVyIG9mIHRoZSBnaXZlbiBvZmZzZXQuICovCi0JCVdyaXRlQnl0ZXMgPSBBZGFwdGVyLT51aVNlY3RvclNpemU7Ci0JCWlmIChXcml0ZU9mZnNldCAlIEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSkKLQkJCVdyaXRlQnl0ZXMgPSBBZGFwdGVyLT51aVNlY3RvclNpemUgLSAoV3JpdGVPZmZzZXQgJSBBZGFwdGVyLT51aVNlY3RvclNpemUpOwotCi0JCWlmIChOT0IgPCBXcml0ZUJ5dGVzKQotCQkJV3JpdGVCeXRlcyA9IE5PQjsKLQotCQlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQotCQlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7Ci0KLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOwotCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJa2ZyZWUocFdyaXRlQnVmZik7Ci0JCQlyZXR1cm4gLUVBQ0NFUzsKLQkJfQotCi0JCUJjbUZsYXNoMnhDb3JydXB0U2lnKEFkYXB0ZXIsIHNGbGFzaDJ4V3JpdGUuU2VjdGlvbik7Ci0JCWRvIHsKLQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBXcml0ZUJ1ZmYsIElucHV0QWRkciwgV3JpdGVCeXRlcyk7Ci0JCQlpZiAoU3RhdHVzKSB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgdG8gdXNlciBmYWlsZWQgd2l0aCBzdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJa2ZyZWUocFdyaXRlQnVmZik7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0JCQlCQ01fREVCVUdfUFJJTlRfQlVGRkVSKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCBwV3JpdGVCdWZmLCBXcml0ZUJ5dGVzKTsKLQotCQkJLyogV3JpdGluZyB0aGUgZGF0YSBmcm9tIEZsYXNoIDIueCAqLwotCQkJU3RhdHVzID0gQmNtRmxhc2gyeEJ1bGtXcml0ZShBZGFwdGVyLCAoUFVJTlQpcFdyaXRlQnVmZiwgc0ZsYXNoMnhXcml0ZS5TZWN0aW9uLCBXcml0ZU9mZnNldCwgV3JpdGVCeXRlcywgc0ZsYXNoMnhXcml0ZS5iVmVyaWZ5KTsKLQotCQkJaWYgKFN0YXR1cykgewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJGbGFzaCAyeCByZWFkIGVyciB3aXRoIFN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlOT0IgPSBOT0IgLSBXcml0ZUJ5dGVzOwotCQkJaWYgKE5PQikgewotCQkJCVdyaXRlT2Zmc2V0ID0gV3JpdGVPZmZzZXQgKyBXcml0ZUJ5dGVzOwotCQkJCUlucHV0QWRkciA9IElucHV0QWRkciArIFdyaXRlQnl0ZXM7Ci0JCQkJaWYgKE5PQiA+IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSkKLQkJCQkJV3JpdGVCeXRlcyA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZTsKLQkJCQllbHNlCi0JCQkJCVdyaXRlQnl0ZXMgPSBOT0I7Ci0JCQl9Ci0JCX0gd2hpbGUgKE5PQiA+IDApOwotCi0JCUJjbUZsYXNoMnhXcml0ZVNpZyhBZGFwdGVyLCBzRmxhc2gyeFdyaXRlLlNlY3Rpb24pOwotCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCWtmcmVlKHBXcml0ZUJ1ZmYpOwotCX0KLQlicmVhazsKLQotCWNhc2UgSU9DVExfQkNNX0dFVF9GTEFTSDJYX1NFQ1RJT05fQklUTUFQOiB7Ci0JCXN0cnVjdCBiY21fZmxhc2gyeF9iaXRtYXAgKnBzRmxhc2gyeEJpdE1hcDsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSU9DVExfQkNNX0dFVF9GTEFTSDJYX1NFQ1RJT05fQklUTUFQIENhbGxlZCIpOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKElvQnVmZmVyLk91dHB1dExlbmd0aCAhPSBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaDJ4X2JpdG1hcCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlwc0ZsYXNoMnhCaXRNYXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYmNtX2ZsYXNoMnhfYml0bWFwKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChwc0ZsYXNoMnhCaXRNYXAgPT0gTlVMTCkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIk1lbW9yeSBpcyBub3QgYXZhaWxhYmxlIik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCS8qIFJlYWRpbmcgdGhlIEZsYXNoIFNlY3RpbyBCaXQgbWFwICovCi0JCWRvd24oJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCi0JCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKLQotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7Ci0JCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQlrZnJlZShwc0ZsYXNoMnhCaXRNYXApOwotCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCX0KLQotCQlCY21HZXRGbGFzaDJ4U2VjdGlvbmFsQml0TWFwKEFkYXB0ZXIsIHBzRmxhc2gyeEJpdE1hcCk7Ci0JCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHBzRmxhc2gyeEJpdE1hcCwgc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2gyeF9iaXRtYXApKSkgewotCQkJa2ZyZWUocHNGbGFzaDJ4Qml0TWFwKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJa2ZyZWUocHNGbGFzaDJ4Qml0TWFwKTsKLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9TRVRfQUNUSVZFX1NFQ1RJT046IHsKLQkJZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBlRmxhc2gyeFNlY3Rpb25WYWwgPSAwOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fU0VUX0FDVElWRV9TRUNUSU9OIENhbGxlZCIpOwotCi0JCWlmIChJc0ZsYXNoMngoQWRhcHRlcikgIT0gVFJVRSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkZsYXNoIERvZXMgbm90IGhhdmUgMi54IG1hcCIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpOwotCQlpZiAoU3RhdHVzKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlRmxhc2gyeFNlY3Rpb25WYWwsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoSU5UKSk7Ci0JCWlmIChTdGF0dXMpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIGZsYXNoIHNlY3Rpb24gdmFsIGZhaWxlZCIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQotCQlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7Ci0KLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOwotCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCX0KLQotCQlTdGF0dXMgPSBCY21TZXRBY3RpdmVTZWN0aW9uKEFkYXB0ZXIsIGVGbGFzaDJ4U2VjdGlvblZhbCk7Ci0JCWlmIChTdGF0dXMpCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRmFpbGVkIHRvIG1ha2UgaXQncyBwcmlvcml0eSBIaWdoZXN0LiBTdGF0dXMgJWQiLCBTdGF0dXMpOwotCi0JCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9JREVOVElGWV9BQ1RJVkVfU0VDVElPTjogeworCWNhc2UgSU9DVExfQkNNX0lERU5USUZZX0FDVElWRV9TRUNUSU9OOgogCQkvKiBSaWdodCBOb3cgd2UgYXJlIHRha2luZyBjYXJlIG9mIG9ubHkgRFNEICovCiAJCUFkYXB0ZXItPmJBbGxEU0RXcml0ZUFsbG93ID0gZmFsc2U7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9JREVOVElGWV9BQ1RJVkVfU0VDVElPTiBjYWxsZWQiKTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJIklPQ1RMX0JDTV9JREVOVElGWV9BQ1RJVkVfU0VDVElPTiBjYWxsZWQiKTsKIAkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JfQotCWJyZWFrOwotCi0JY2FzZSBJT0NUTF9CQ01fQ09QWV9TRUNUSU9OOiB7Ci0JCXN0cnVjdCBiY21fZmxhc2gyeF9jb3B5X3NlY3Rpb24gc0NvcHlTZWN0U3RydXQgPSB7MH07Ci0JCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fQ09QWV9TRUNUSU9OICBDYWxsZWQiKTsKLQotCQlBZGFwdGVyLT5iQWxsRFNEV3JpdGVBbGxvdyA9IGZhbHNlOwotCQlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpICE9IFRSVUUpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJGbGFzaCBEb2VzIG5vdCBoYXZlIDIueCBtYXAiKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKTsKLQkJaWYgKFN0YXR1cykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCBTdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnNDb3B5U2VjdFN0cnV0LCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2gyeF9jb3B5X3NlY3Rpb24pKTsKLQkJaWYgKFN0YXR1cykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgQ29weV9TZWN0aW9uX1N0cnVjdCBmYWlsZWQgd2l0aCBTdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiU291cmNlIFNFY3Rpb24gOiV4Iiwgc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbik7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkRlc3RpbmF0aW9uIFNFY3Rpb24gOiV4Iiwgc0NvcHlTZWN0U3RydXQuRHN0U2VjdGlvbik7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIm9mZnNldCA6JXgiLCBzQ29weVNlY3RTdHJ1dC5vZmZzZXQpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJOT0IgOiV4Iiwgc0NvcHlTZWN0U3RydXQubnVtT2ZCeXRlcyk7Ci0KLQkJaWYgKElzU2VjdGlvbkV4aXN0SW5GbGFzaChBZGFwdGVyLCBzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uKSA9PSBmYWxzZSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIlNvdXJjZSBTZWN0aW9uPCV4PiBkb2VzIG5vdCBleGlzdCBpbiBGbGFzaCAiLCBzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJaWYgKElzU2VjdGlvbkV4aXN0SW5GbGFzaChBZGFwdGVyLCBzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uKSA9PSBmYWxzZSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkRlc3RpbmF0aW8gU2VjdGlvbjwleD4gZG9lcyBub3QgZXhpc3QgaW4gRmxhc2ggIiwgc0NvcHlTZWN0U3RydXQuRHN0U2VjdGlvbik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmIChzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uID09IHNDb3B5U2VjdFN0cnV0LkRzdFNlY3Rpb24pIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlNvdXJjZSBhbmQgRGVzdGluYXRpb24gc2VjdGlvbiBzaG91bGQgYmUgZGlmZmVyZW50Iik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWRvd24oJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCi0JCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKLQotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7Ci0JCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQlyZXR1cm4gLUVBQ0NFUzsKLQkJfQotCi0JCWlmIChzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uID09IElTT19JTUFHRTEgfHwgc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbiA9PSBJU09fSU1BR0UyKSB7Ci0JCQlpZiAoSXNOb25DRExlc3NEZXZpY2UoQWRhcHRlcikpIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRGV2aWNlIGlzIE5vbi1DRExlc3MgaGVuY2Ugd29uJ3QgaGF2ZSBJU08gISEiKTsKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJfSBlbHNlIGlmIChzQ29weVNlY3RTdHJ1dC5udW1PZkJ5dGVzID09IDApIHsKLQkJCQlTdGF0dXMgPSBCY21Db3B5SVNPKEFkYXB0ZXIsIHNDb3B5U2VjdFN0cnV0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIlBhcnRpYWwgQ29weSBvZiBJU08gc2VjdGlvbiBpcyBub3QgQWxsb3dlZC4uIik7Ci0JCQkJU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7Ci0JCQl9Ci0JCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQlyZXR1cm4gU3RhdHVzOwotCQl9Ci0KLQkJU3RhdHVzID0gQmNtQ29weVNlY3Rpb24oQWRhcHRlciwgc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbiwKLQkJCQkJc0NvcHlTZWN0U3RydXQuRHN0U2VjdGlvbiwgc0NvcHlTZWN0U3RydXQub2Zmc2V0LCBzQ29weVNlY3RTdHJ1dC5udW1PZkJ5dGVzKTsKLQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCX0KLQlicmVhazsKLQotCWNhc2UgSU9DVExfQkNNX0dFVF9GTEFTSF9DU19JTkZPOiB7Ci0JCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICIgSU9DVExfQkNNX0dFVF9GTEFTSF9DU19JTkZPIENhbGxlZCIpOwotCi0JCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSk7Ci0JCWlmIChTdGF0dXMpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIElPQ1RMIEJVRkZFUiBmYWlsZWQiKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJaWYgKEFkYXB0ZXItPmVOVk1UeXBlICE9IE5WTV9GTEFTSCkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvbm5lY3RlZCBkZXZpY2UgZG9lcyBub3QgaGF2ZSBmbGFzaCIpOwotCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKElzRmxhc2gyeChBZGFwdGVyKSA9PSBUUlVFKSB7Ci0JCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2gyeF9jc19pbmZvKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIEFkYXB0ZXItPnBzRmxhc2gyeENTSW5mbywgc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2gyeF9jc19pbmZvKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2hfY3NfaW5mbykpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBBZGFwdGVyLT5wc0ZsYXNoQ1NJbmZvLCBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaF9jc19pbmZvKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9TRUxFQ1RfRFNEOiB7Ci0JCVVJTlQgU2VjdE9mc2V0ID0gMDsKLQkJZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBlRmxhc2gyeFNlY3Rpb25WYWw7Ci0JCWVGbGFzaDJ4U2VjdGlvblZhbCA9IE5PX1NFQ1RJT05fVkFMOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fU0VMRUNUX0RTRCBDYWxsZWQiKTsKLQotCQlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpICE9IFRSVUUpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJGbGFzaCBEb2VzIG5vdCBoYXZlIDIueCBtYXAiKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKTsKLQkJaWYgKFN0YXR1cykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVGbGFzaDJ4U2VjdGlvblZhbCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihJTlQpKTsKLQkJaWYgKFN0YXR1cykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgZmxhc2ggc2VjdGlvbiB2YWwgZmFpbGVkIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlJlYWQgU2VjdGlvbiA6JWQiLCBlRmxhc2gyeFNlY3Rpb25WYWwpOwotCQlpZiAoKGVGbGFzaDJ4U2VjdGlvblZhbCAhPSBEU0QwKSAmJgotCQkJKGVGbGFzaDJ4U2VjdGlvblZhbCAhPSBEU0QxKSAmJgotCQkJKGVGbGFzaDJ4U2VjdGlvblZhbCAhPSBEU0QyKSkgewotCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiUGFzc2VkIHNlY3Rpb248JXg+IGlzIG5vdCBEU0Qgc2VjdGlvbiIsIGVGbGFzaDJ4U2VjdGlvblZhbCk7Ci0JCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0JCX0KLQotCQlTZWN0T2ZzZXQgPSBCY21HZXRTZWN0aW9uVmFsU3RhcnRPZmZzZXQoQWRhcHRlciwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKLQkJaWYgKFNlY3RPZnNldCA9PSBJTlZBTElEX09GRlNFVCkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIlByb3ZpZGVkIFNlY3Rpb24gdmFsIDwlZD4gZG9lcyBub3QgZXhpc3QgaW4gRmxhc2ggMi54IiwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJQWRhcHRlci0+YkFsbERTRFdyaXRlQWxsb3cgPSBUUlVFOwotCQlBZGFwdGVyLT51bEZsYXNoQ2FsU3RhcnQgPSBTZWN0T2ZzZXQ7Ci0JCUFkYXB0ZXItPmVBY3RpdmVEU0QgPSBlRmxhc2gyeFNlY3Rpb25WYWw7Ci0JfQotCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCWJyZWFrOwotCi0JY2FzZSBJT0NUTF9CQ01fTlZNX1JBV19SRUFEOiB7Ci0JCXN0cnVjdCBiY21fbnZtX3JlYWR3cml0ZSBzdE5WTVJlYWQ7Ci0JCUlOVCBOT0I7Ci0JCUlOVCBCdWZmU2l6ZTsKLQkJSU5UIFJlYWRPZmZzZXQgPSAwOwotCQlVSU5UIFJlYWRCeXRlcyA9IDA7Ci0JCVBVQ0hBUiBwUmVhZEJ1ZmY7Ci0JCXZvaWQgX191c2VyICpPdXRQdXRCdWZmOwotCi0JCWlmIChBZGFwdGVyLT5lTlZNVHlwZSAhPSBOVk1fRkxBU0gpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJOVk0gVFlQRSBpcyBub3QgRmxhc2giKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiY29weV9mcm9tX3VzZXIgMSBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnN0TlZNUmVhZCwgSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBzaXplb2Yoc3RydWN0IGJjbV9udm1fcmVhZHdyaXRlKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlOT0IgPSBzdE5WTVJlYWQudWlOdW1CeXRlczsKLQkJLyogSW4gUmF3LVJlYWQgbWF4IEJ1ZmYgc2l6ZSA6IDY0TUIgKi8KLQotCQlpZiAoTk9CID4gREVGQVVMVF9CVUZGX1NJWkUpCi0JCQlCdWZmU2l6ZSA9IERFRkFVTFRfQlVGRl9TSVpFOwotCQllbHNlCi0JCQlCdWZmU2l6ZSA9IE5PQjsKLQotCQlSZWFkT2Zmc2V0ID0gc3ROVk1SZWFkLnVpT2Zmc2V0OwotCQlPdXRQdXRCdWZmID0gc3ROVk1SZWFkLnBCdWZmZXI7Ci0KLQkJcFJlYWRCdWZmID0ga3phbGxvYyhCdWZmU2l6ZSAsIEdGUF9LRVJORUwpOwotCQlpZiAocFJlYWRCdWZmID09IE5VTEwpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIEZsYXNoIDIueCBSZWFkIFN0cnVjdHVyZSIpOwotCQkJU3RhdHVzID0gLUVOT01FTTsKLQkJCWJyZWFrOwotCQl9Ci0JCWRvd24oJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCi0JCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKLQotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7Ci0JCQlrZnJlZShwUmVhZEJ1ZmYpOwotCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCX0KLQotCQlBZGFwdGVyLT5iRmxhc2hSYXdSZWFkID0gVFJVRTsKLQotCQl3aGlsZSAoTk9CKSB7Ci0JCQlpZiAoTk9CID4gREVGQVVMVF9CVUZGX1NJWkUpCi0JCQkJUmVhZEJ5dGVzID0gREVGQVVMVF9CVUZGX1NJWkU7Ci0JCQllbHNlCi0JCQkJUmVhZEJ5dGVzID0gTk9COwotCi0JCQkvKiBSZWFkaW5nIHRoZSBkYXRhIGZyb20gRmxhc2ggMi54ICovCi0JCQlTdGF0dXMgPSBCZWNlZW1OVk1SZWFkKEFkYXB0ZXIsIChQVUlOVClwUmVhZEJ1ZmYsIFJlYWRPZmZzZXQsIFJlYWRCeXRlcyk7Ci0JCQlpZiAoU3RhdHVzKSB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkZsYXNoIDJ4IHJlYWQgZXJyIHdpdGggU3RhdHVzIDolZCIsIFN0YXR1cyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCUJDTV9ERUJVR19QUklOVF9CVUZGRVIoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIHBSZWFkQnVmZiwgUmVhZEJ5dGVzKTsKLQotCQkJU3RhdHVzID0gY29weV90b191c2VyKE91dFB1dEJ1ZmYsIHBSZWFkQnVmZiwgUmVhZEJ5dGVzKTsKLQkJCWlmIChTdGF0dXMpIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSB0byB1c2UgZmFpbGVkIHdpdGggc3RhdHVzIDolZCIsIFN0YXR1cyk7Ci0JCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCWtmcmVlKHBSZWFkQnVmZik7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0JCQlOT0IgPSBOT0IgLSBSZWFkQnl0ZXM7Ci0JCQlpZiAoTk9CKSB7Ci0JCQkJUmVhZE9mZnNldCA9IFJlYWRPZmZzZXQgKyBSZWFkQnl0ZXM7Ci0JCQkJT3V0UHV0QnVmZiA9IE91dFB1dEJ1ZmYgKyBSZWFkQnl0ZXM7Ci0JCQl9Ci0JCX0KLQkJQWRhcHRlci0+YkZsYXNoUmF3UmVhZCA9IGZhbHNlOwotCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCWtmcmVlKHBSZWFkQnVmZik7CiAJCWJyZWFrOwotCX0KIAotCWNhc2UgSU9DVExfQkNNX0NOVFJMTVNHX01BU0s6IHsKLQkJVUxPTkcgUnhDbnRybE1zZ0JpdE1hc2sgPSAwOworCWNhc2UgSU9DVExfQkNNX0NPUFlfU0VDVElPTjoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfY29weV9zZWN0aW9uKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpOwotCQlpZiAoU3RhdHVzKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJjb3B5IG9mIElvY3RsIGJ1ZmZlciBpcyBmYWlsZWQgZnJvbSB1c2VyIHNwYWNlIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQorCWNhc2UgSU9DVExfQkNNX0dFVF9GTEFTSF9DU19JTkZPOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9nZXRfZmxhc2hfY3NfaW5mbyhhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggIT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSB7Ci0JCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KKwljYXNlIElPQ1RMX0JDTV9TRUxFQ1RfRFNEOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9zZWxlY3RfZHNkKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSeENudHJsTXNnQml0TWFzaywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKTsKLQkJaWYgKFN0YXR1cykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiY29weSBvZiBjb250cm9sIGJpdCBtYXNrIGZhaWxlZCBmcm9tIHVzZXIgc3BhY2UiKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlxuIEdvdCB1c2VyIGRlZmluZWQgY250cmwgbXNnIGJpdCBtYXNrIDolbHgiLCBSeENudHJsTXNnQml0TWFzayk7Ci0JCXBUYXJhbmctPlJ4Q250cmxNc2dCaXRNYXNrID0gUnhDbnRybE1zZ0JpdE1hc2s7Ci0JfQotCWJyZWFrOworCWNhc2UgSU9DVExfQkNNX05WTV9SQVdfUkVBRDoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfbnZtX3Jhd19yZWFkKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JY2FzZSBJT0NUTF9CQ01fR0VUX0RFVklDRV9EUklWRVJfSU5GTzogewotCQlzdHJ1Y3QgYmNtX2RyaXZlcl9pbmZvIERldkluZm87CisJY2FzZSBJT0NUTF9CQ01fQ05UUkxNU0dfTUFTSzoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfY250cmxtc2dfbWFzayhhcmdwLCBBZGFwdGVyLCBwVGFyYW5nKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJDYWxsZWQgSU9DVExfQkNNX0dFVF9ERVZJQ0VfRFJJVkVSX0lORk9cbiIpOworCWNhc2UgSU9DVExfQkNNX0dFVF9ERVZJQ0VfRFJJVkVSX0lORk86CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2dldF9kZXZpY2VfZHJpdmVyX2luZm8oYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJbWVtc2V0KCZEZXZJbmZvLCAwLCBzaXplb2YoRGV2SW5mbykpOwotCQlEZXZJbmZvLk1heFJETUJ1ZmZlclNpemUgPSBCVUZGRVJfNEs7Ci0JCURldkluZm8udTMyRFNEU3RhcnRPZmZzZXQgPSBFRVBST01fQ0FMUEFSQU1fU1RBUlQ7Ci0JCURldkluZm8udTMyUnhBbGlnbm1lbnRDb3JyZWN0aW9uID0gMDsKLQkJRGV2SW5mby51MzJOVk1UeXBlID0gQWRhcHRlci0+ZU5WTVR5cGU7Ci0JCURldkluZm8udTMySW50ZXJmYWNlVHlwZSA9IEJDTV9VU0I7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKERldkluZm8pKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZEZXZJbmZvLCBzaXplb2YoRGV2SW5mbykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCWJyZWFrOwotCi0JY2FzZSBJT0NUTF9CQ01fVElNRV9TSU5DRV9ORVRfRU5UUlk6IHsKLQkJc3RydWN0IGJjbV90aW1lX2VsYXBzZWQgc3RUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnkgPSB7MH07Ci0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSU9DVExfQkNNX1RJTUVfU0lOQ0VfTkVUX0VOVFJZIGNhbGxlZCIpOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKElvQnVmZmVyLk91dHB1dExlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYmNtX3RpbWVfZWxhcHNlZCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlzdFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeS51bDY0VGltZUVsYXBzZWRTaW5jZU5ldEVudHJ5ID0gZ2V0X3NlY29uZHMoKSAtIEFkYXB0ZXItPmxpVGltZVNpbmNlTGFzdE5ldEVudHJ5OwotCi0JCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmc3RUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnksIHNpemVvZihzdHJ1Y3QgYmNtX3RpbWVfZWxhcHNlZCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCWJyZWFrOworCWNhc2UgSU9DVExfQkNNX1RJTUVfU0lOQ0VfTkVUX0VOVFJZOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF90aW1lX3NpbmNlX25ldF9lbnRyeShhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAogCWNhc2UgSU9DVExfQ0xPU0VfTk9USUZJQ0FUSU9OOgotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9DTE9TRV9OT1RJRklDQVRJT04iKTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCisJCQlEQkdfTFZMX0FMTCwgIklPQ1RMX0NMT1NFX05PVElGSUNBVElPTiIpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0NtSG9zdC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9DbUhvc3QuYwppbmRleCBjYzkxYjVlLi42MzJmODFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0NtSG9zdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vQ21Ib3N0LmMKQEAgLTk3NSw4ICs5NzUsOCBAQAogCQkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUudThFdGhlcm5ldERlc3RNYWNBZGRyZXNzTGVuZ3RoKTsKIAogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsCi0JCQkJREJHX0xWTF9BTEwsICJ1OEV0aGVybmV0U291cmNlTUFDQWRkcmVzc1s2XTogIgotCQkJCSIlcE0iLCBwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLgorCQkJCURCR19MVkxfQUxMLCAidThFdGhlcm5ldFNvdXJjZU1BQ0FkZHJlc3NbNl06ICVwTSIsCisJCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS4KIAkJCQkJCXU4RXRoZXJuZXRTb3VyY2VNQUNBZGRyZXNzKTsKIAogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAidThFdGhlcnR5cGVMZW5ndGg6IDB4JTAyWCAiLApAQCAtMTA5MiwxOCArMTA5MiwxNiBAQAogCQkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUudThQcm90b2NvbFNvdXJjZVBvcnRSYW5nZUxlbmd0aCk7CiAKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLAotCQkJCURCR19MVkxfQUxMLCAidThQcm90b2NvbFNvdXJjZVBvcnRSYW5nZVs0XTogIgotCQkJCSIweCUqcGggIiwgNCwgcHNmQ1NUeXBlLT4KLQkJCQkJCWNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLgorCQkJCURCR19MVkxfQUxMLCAidThQcm90b2NvbFNvdXJjZVBvcnRSYW5nZVs0XTogMHglKnBoICIsCisJCQkJNCwgcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS4KIAkJCQkJCXU4UHJvdG9jb2xTb3VyY2VQb3J0UmFuZ2UpOwogCiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJ1OFByb3RvY29sRGVzdFBvcnRSYW5nZUxlbmd0aDogMHglMDJYICIsCiAJCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OFByb3RvY29sRGVzdFBvcnRSYW5nZUxlbmd0aCk7CiAKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLAotCQkJCURCR19MVkxfQUxMLCAidThQcm90b2NvbERlc3RQb3J0UmFuZ2VbNF06ICIKLQkJCQkiMHglKnBoICIsIDQsIHBzZkNTVHlwZS0+Ci0JCQkJCQljQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS4KKwkJCQlEQkdfTFZMX0FMTCwgInU4UHJvdG9jb2xEZXN0UG9ydFJhbmdlWzRdOiAweCUqcGggIiwKKwkJCQk0LCBwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLgogCQkJCQkJdThQcm90b2NvbERlc3RQb3J0UmFuZ2UpOwogCiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJ1OEV0aGVybmV0RGVzdE1hY0FkZHJlc3NMZW5ndGg6IDB4JTAyWCAiLApAQCAtMTExOCw4ICsxMTE2LDggQEAKIAkJCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4RXRoZXJuZXREZXN0TWFjQWRkcmVzc0xlbmd0aCk7CiAKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLAotCQkJCURCR19MVkxfQUxMLCAidThFdGhlcm5ldFNvdXJjZU1BQ0FkZHJlc3NbNl06ICIKLQkJCQkiJXBNIiwgcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS4KKwkJCQlEQkdfTFZMX0FMTCwgInU4RXRoZXJuZXRTb3VyY2VNQUNBZGRyZXNzWzZdOiAlcE0iLAorCQkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUuCiAJCQkJCQl1OEV0aGVybmV0U291cmNlTUFDQWRkcmVzcyk7CiAKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgInU4RXRoZXJ0eXBlTGVuZ3RoOiAweCUwMlggIiwgcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OEV0aGVydHlwZUxlbmd0aCk7CkBAIC0xNjM3LDYgKzE2MzUsOCBAQAogCXN0cnVjdCBiY21fYWRkX2luZGljYXRpb25fYWx0ICpwc3RBZGRJbmRpY2F0aW9uID0gTlVMTDsKIAlzdHJ1Y3QgYmNtX2NoYW5nZV9pbmRpY2F0aW9uICpwc3RDaGFuZ2VJbmRpY2F0aW9uID0gTlVMTDsKIAlzdHJ1Y3QgYmNtX2xlYWRlciAqcExlYWRlciA9IE5VTEw7CisJSU5UIHVpU2VhcmNoUnVsZUluZGV4ID0gMDsKKwlVTE9ORyB1bFNGSUQ7CiAKIAkvKgogCSAqIE90aGVyd2lzZSB0aGUgbWVzc2FnZSBjb250YWlucyBhIHRhcmdldCBhZGRyZXNzIGZyb20gd2hlcmUgd2UgbmVlZCB0bwpAQCAtMTY2MCw3ICsxNjYwLDYgQEAKIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiIyMjIFRJRCBSRUNFSVZFRCAlZFxuIiwgcHN0QWRkSW5kaWNhdGlvbi0+dTE2VElEKTsKIAlzd2l0Y2ggKHBzdEFkZEluZGljYXRpb24tPnU4VHlwZSkgewogCWNhc2UgRFNBX1JFUToKLQl7CiAJCXBMZWFkZXItPlBMZW5ndGggPSBzaXplb2Yoc3RydWN0IGJjbV9hZGRfaW5kaWNhdGlvbl9hbHQpOwogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICJTZW5kaW5nIERTQSBSZXNwb25zZS4uLi5cbiIpOwogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICJTRU5ESU5HIERTQSBSRVNQT05TRSBUTyBNQUMgJWQiLCBwTGVhZGVyLT5QTGVuZ3RoKTsKQEAgLTE2NzEsMjIgKzE2NzAsMTYgQEAKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAiIFZDSUQgPSAleCIsIG50b2hzKHBzdEFkZEluZGljYXRpb24tPnUxNlZDSUQpKTsKIAkJQ29weUJ1ZmZlclRvQ29udHJvbFBhY2tldChBZGFwdGVyLCAoUFZPSUQpQWRhcHRlci0+Y2FEc3hSZXFSZXNwKTsKIAkJa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7Ci0JfQotCWJyZWFrOworCQlicmVhazsKIAljYXNlIERTQV9SU1A6Ci0JewogCQlwTGVhZGVyLT5QTGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBiY21fYWRkX2luZGljYXRpb25fYWx0KTsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAiU0VORElORyBEU0EgQUNLIFRPIE1BQyAlZCIsCiAJCQkJcExlYWRlci0+UExlbmd0aCk7CiAJCSooKHN0cnVjdCBiY21fYWRkX2luZGljYXRpb25fYWx0ICopJihBZGFwdGVyLT5jYURzeFJlcVJlc3BbTEVBREVSX1NJWkVdKSkKIAkJCT0gKnBzdEFkZEluZGljYXRpb247CiAJCSgoc3RydWN0IGJjbV9hZGRfaW5kaWNhdGlvbl9hbHQgKikmKEFkYXB0ZXItPmNhRHN4UmVxUmVzcFtMRUFERVJfU0laRV0pKS0+dThUeXBlID0gRFNBX0FDSzsKLQotCX0gLyogbm8gYnJlYWsgaGVyZS4ud2Ugc2hvdWxkIGdvIGRvd24uICovCisJCS8qIEZBTExUSFJPVUdIICovCiAJY2FzZSBEU0FfQUNLOgotCXsKLQkJVUlOVCB1aVNlYXJjaFJ1bGVJbmRleCA9IDA7Ci0KIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAiVkNJRDoweCVYIiwKIAkJCQludG9ocyhwc3RBZGRJbmRpY2F0aW9uLT51MTZWQ0lEKSk7CiAJCXVpU2VhcmNoUnVsZUluZGV4ID0gU2VhcmNoRnJlZVNmaWQoQWRhcHRlcik7CkBAIC0xNjk0LDcgKzE2ODcsNyBAQAogCQkJCXVpU2VhcmNoUnVsZUluZGV4KTsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAiRGlyZWN0aW9uOjB4JVggIiwKIAkJCQlwc3RBZGRJbmRpY2F0aW9uLT51OERpcmVjdGlvbik7Ci0JCWlmICgodWlTZWFyY2hSdWxlSW5kZXggPCBOT19PRl9RVUVVRVMpKSB7CisJCWlmICh1aVNlYXJjaFJ1bGVJbmRleCA8IE5PX09GX1FVRVVFUykgewogCQkJQWRhcHRlci0+UGFja0luZm9bdWlTZWFyY2hSdWxlSW5kZXhdLnVjRGlyZWN0aW9uID0KIAkJCQlwc3RBZGRJbmRpY2F0aW9uLT51OERpcmVjdGlvbjsKIAkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgImJWYWxpZDoweCVYICIsCkBAIC0xNzY5LDEwICsxNzYyLDggQEAKIAkJCWtmcmVlKHBzdEFkZEluZGljYXRpb24pOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9Ci0JfQotCWJyZWFrOworCQlicmVhazsKIAljYXNlIERTQ19SRVE6Ci0JewogCQlwTGVhZGVyLT5QTGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBiY21fY2hhbmdlX2luZGljYXRpb24pOwogCQlwc3RDaGFuZ2VJbmRpY2F0aW9uID0gKHN0cnVjdCBiY21fY2hhbmdlX2luZGljYXRpb24gKilwc3RBZGRJbmRpY2F0aW9uOwogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICJTRU5ESU5HIERTQyBSRVNQT05TRSBUTyBNQUMgJWQiLCBwTGVhZGVyLT5QTGVuZ3RoKTsKQEAgLTE3ODIsMjYgKzE3NzMsMjEgQEAKIAogCQlDb3B5QnVmZmVyVG9Db250cm9sUGFja2V0KEFkYXB0ZXIsIChQVk9JRClBZGFwdGVyLT5jYURzeFJlcVJlc3ApOwogCQlrZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKLQl9Ci0JYnJlYWs7CisJCWJyZWFrOwogCWNhc2UgRFNDX1JTUDoKLQl7CiAJCXBMZWFkZXItPlBMZW5ndGggPSBzaXplb2Yoc3RydWN0IGJjbV9jaGFuZ2VfaW5kaWNhdGlvbik7CiAJCXBzdENoYW5nZUluZGljYXRpb24gPSAoc3RydWN0IGJjbV9jaGFuZ2VfaW5kaWNhdGlvbiAqKXBzdEFkZEluZGljYXRpb247CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgIlNFTkRJTkcgRFNDIEFDSyBUTyBNQUMgJWQiLCBwTGVhZGVyLT5QTGVuZ3RoKTsKIAkJKigoc3RydWN0IGJjbV9jaGFuZ2VfaW5kaWNhdGlvbiAqKSYoQWRhcHRlci0+Y2FEc3hSZXFSZXNwW0xFQURFUl9TSVpFXSkpID0gKnBzdENoYW5nZUluZGljYXRpb247CiAJCSgoc3RydWN0IGJjbV9jaGFuZ2VfaW5kaWNhdGlvbiAqKSYoQWRhcHRlci0+Y2FEc3hSZXFSZXNwW0xFQURFUl9TSVpFXSkpLT51OFR5cGUgPSBEU0NfQUNLOwotCX0KKwkJLyogRkFMTFRIUk9VR0ggKi8KIAljYXNlIERTQ19BQ0s6Ci0JewotCQlVSU5UIHVpU2VhcmNoUnVsZUluZGV4ID0gMDsKLQogCQlwc3RDaGFuZ2VJbmRpY2F0aW9uID0gKHN0cnVjdCBiY21fY2hhbmdlX2luZGljYXRpb24gKilwc3RBZGRJbmRpY2F0aW9uOwogCQl1aVNlYXJjaFJ1bGVJbmRleCA9IFNlYXJjaFNmaWQoQWRhcHRlciwgbnRvaGwocHN0Q2hhbmdlSW5kaWNhdGlvbi0+c2ZBY3RpdmVTZXQudTMyU0ZJRCkpOwogCQlpZiAodWlTZWFyY2hSdWxlSW5kZXggPiBOT19PRl9RVUVVRVMtMSkKIAkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJTRiBkb2Vzbid0IGV4aXN0IGZvciB3aGljaCBEU0NfQUNLIGlzIHJlY2VpdmVkIik7CiAKLQkJaWYgKCh1aVNlYXJjaFJ1bGVJbmRleCA8IE5PX09GX1FVRVVFUykpIHsKKwkJaWYgKHVpU2VhcmNoUnVsZUluZGV4IDwgTk9fT0ZfUVVFVUVTKSB7CiAJCQlBZGFwdGVyLT5QYWNrSW5mb1t1aVNlYXJjaFJ1bGVJbmRleF0udWNEaXJlY3Rpb24gPSBwc3RDaGFuZ2VJbmRpY2F0aW9uLT51OERpcmVjdGlvbjsKIAkJCWlmIChwc3RDaGFuZ2VJbmRpY2F0aW9uLT5zZkFjdGl2ZVNldC5iVmFsaWQgPT0gVFJVRSkKIAkJCQlBZGFwdGVyLT5QYWNrSW5mb1t1aVNlYXJjaFJ1bGVJbmRleF0uYkFjdGl2ZVNldCA9IFRSVUU7CkBAIC0xODQ5LDEzICsxODM1LDggQEAKIAkJCWtmcmVlKHBzdEFkZEluZGljYXRpb24pOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9Ci0JfQotCWJyZWFrOworCQlicmVhazsKIAljYXNlIERTRF9SRVE6Ci0JewotCQlVSU5UIHVpU2VhcmNoUnVsZUluZGV4OwotCQlVTE9ORyB1bFNGSUQ7Ci0KIAkJcExlYWRlci0+UExlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYmNtX2RlbF9pbmRpY2F0aW9uKTsKIAkJKigoc3RydWN0IGJjbV9kZWxfaW5kaWNhdGlvbiAqKSYoQWRhcHRlci0+Y2FEc3hSZXFSZXNwW0xFQURFUl9TSVpFXSkpID0gKigoc3RydWN0IGJjbV9kZWxfaW5kaWNhdGlvbiAqKXBzdEFkZEluZGljYXRpb24pOwogCkBAIC0xODcyLDEyICsxODUzLDEwIEBACiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgIlNFTkRJTkcgRFNEIFJFU1BPTlNFIFRPIE1BQyIpOwogCQkoKHN0cnVjdCBiY21fZGVsX2luZGljYXRpb24gKikmKEFkYXB0ZXItPmNhRHN4UmVxUmVzcFtMRUFERVJfU0laRV0pKS0+dThUeXBlID0gRFNEX1JTUDsKIAkJQ29weUJ1ZmZlclRvQ29udHJvbFBhY2tldChBZGFwdGVyLCAoUFZPSUQpQWRhcHRlci0+Y2FEc3hSZXFSZXNwKTsKLQl9CisJCS8qIEZBTExUSFJPVUdIICovCiAJY2FzZSBEU0RfUlNQOgotCXsKIAkJLyogRG8gbm90aGluZyBhcyBTRiBoYXMgYWxyZWFkeSBnb3QgRGVsZXRlZCAqLwotCX0KLQlicmVhazsKKwkJYnJlYWs7CiAJY2FzZSBEU0RfQUNLOgogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICJEU0QgQUNLIFJjZCwgbGV0IEFwcCBoYW5kbGUgaXRcbiIpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vRERSSW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9ERFJJbml0LmMKaW5kZXggZWQyODViMi4uZjFkN2NiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9ERFJJbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9ERFJJbml0LmMKQEAgLTMsNyArMyw3IEBACiAKIAogI2RlZmluZSBERFJfRFVNUF9JTlRFUk5BTF9ERVZJQ0VfTUVNT1JZIDB4QkZDMDJCMDAKLSNkZWZpbmUgTUlQU19DTE9DS19SRUcgCTB4MGYwMDA4MjAKKyNkZWZpbmUgTUlQU19DTE9DS19SRUcgMHgwZjAwMDgyMAogCiAvKiBERFIgSU5JVC0xMzNNaHogKi8KICNkZWZpbmUgVDNfU0tJUF9DTE9DS19QUk9HUkFNX0RVTVBfMTMzTUhaIDEyICAvKiBpbmRleCBmb3IgMHgwRjAwNzAwMCAqLwpAQCAtODE4LDEzICs4MTgsMTMgQEAKIAlpZiAoKEFkYXB0ZXItPmNoaXBfaWQgIT0gIEJDUzIyMF8yKSAmJgogCQkoQWRhcHRlci0+Y2hpcF9pZCAhPSAgQkNTMjIwXzJCQykgJiYKIAkJKEFkYXB0ZXItPmNoaXBfaWQgIT0gQkNTMjIwXzMpKSB7Ci0JCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLChVSU5UKTB4MGYwMDA4MzAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKKwkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsIChVSU5UKTB4MGYwMDA4MzAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKIAkJaWYgKHJldHZhbCA8IDApIHsKIAkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBDTUhPU1QsIFJETSwgREJHX0xWTF9BTEwsICIlczolZCBSRE0gZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJcmV0dXJuIHJldHZhbDsKIAkJfQogCQl1aVJlc2V0VmFsdWUgfD0gMHg0NDsKLQkJcmV0dmFsID0gd3JtYWx0KEFkYXB0ZXIsKFVJTlQpMHgwZjAwMDgzMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOworCQlyZXR2YWwgPSB3cm1hbHQoQWRhcHRlciwgKFVJTlQpMHgwZjAwMDgzMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOwogCQlpZiAocmV0dmFsIDwgMCkgewogCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIENNSE9TVCwgUkRNLCBEQkdfTFZMX0FMTCwgIiVzOiVkIFJETSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQlyZXR1cm4gcmV0dmFsOwpAQCAtODcxLDcgKzg3MSw3IEBACiAJY2FzZSAweGJlY2UwMTIxOgogCWNhc2UgMHhiZWNlMDEzMDoKIAljYXNlIDB4YmVjZTAzMDA6Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJERFIgU2V0dGluZzogJXhcbiIsIEFkYXB0ZXItPkREUlNldHRpbmcpOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkREUiBTZXR0aW5nOiAleFxuIiwgQWRhcHRlci0+RERSU2V0dGluZyk7CiAJCXN3aXRjaCAoQWRhcHRlci0+RERSU2V0dGluZykgewogCQljYXNlIEREUl84MF9NSFo6CiAJCQlwc0REUlNldHRpbmcgPSBhc1QzX0REUlNldHRpbmc4ME1IejsKQEAgLTkzMyw3ICs5MzMsNyBAQAogCX0KIAogCXZhbHVlID0gMDsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIlJlZ2lzdGVyIENvdW50IGlzID0lbHVcbiIsIFJlZ0NvdW50KTsKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJSZWdpc3RlciBDb3VudCBpcyA9JWx1XG4iLCBSZWdDb3VudCk7CiAJd2hpbGUgKFJlZ0NvdW50ICYmICFyZXR2YWwpIHsKIAkJaWYgKHVpQ2xvY2tTZXR0aW5nICYmIHBzRERSU2V0dGluZy0+dWxSZWdBZGRyZXNzID09IE1JUFNfQ0xPQ0tfUkVHKQogCQkJdmFsdWUgPSB1aUNsb2NrU2V0dGluZzsKQEAgLTk5MCwxMiArOTkwLDEyIEBACiAJCSAqIHdlIHdpbGwgY2hhbmdlIHRoaXMgd2hlbiB3ZSB3aWxsIGhhdmUgaW50ZXJuYWwgUE1VLgogCQkgKi8KIAkJaWYgKEFkYXB0ZXItPlBtdU1vZGUgPT0gSFlCUklEX01PREVfN0MpIHsKLQkJCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLChVSU5UKTB4MGYwMDBjMDAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKKwkJCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLCAoVUlOVCkweDBmMDAwYzAwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CiAJCQlpZiAocmV0dmFsIDwgMCkgewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBDTUhPU1QsIFJETSwgREJHX0xWTF9BTEwsICIlczolZCBSRE0gZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJCXJldHVybiByZXR2YWw7CiAJCQl9Ci0JCQlyZXR2YWwgPSByZG1hbHQoQWRhcHRlciwoVUlOVCkweDBmMDAwYzAwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CisJCQlyZXR2YWwgPSByZG1hbHQoQWRhcHRlciwgKFVJTlQpMHgwZjAwMGMwMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOwogCQkJaWYgKHJldHZhbCA8IDApIHsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgQ01IT1NULCBSRE0sIERCR19MVkxfQUxMLCAiJXM6JWQgUkRNIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJCQlyZXR1cm4gcmV0dmFsOwpAQCAtMTAwNiwxMiArMTAwNiwxMiBAQAogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBDTUhPU1QsIFJETSwgREJHX0xWTF9BTEwsICIlczolZCBSRE0gZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJCXJldHVybiByZXR2YWw7CiAJCQl9Ci0JCQlyZXR2YWwgPSByZG1hbHQoQWRhcHRlciwoVUlOVCkweDBmMDAwYzAwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CisJCQlyZXR2YWwgPSByZG1hbHQoQWRhcHRlciwgKFVJTlQpMHgwZjAwMGMwMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOwogCQkJaWYgKHJldHZhbCA8IDApIHsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCBSRE0sIERCR19MVkxfQUxMLCAiJXM6JWQgUkRNIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJCQlyZXR1cm4gcmV0dmFsOwogCQkJfQotCQkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsKFVJTlQpMHgwZjAwMGMwMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOworCQkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsIChVSU5UKTB4MGYwMDBjMDAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKIAkJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIENNSE9TVCwgUkRNLCBEQkdfTFZMX0FMTCwgIiVzOiVkIFJETSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQkJcmV0dXJuIHJldHZhbDsKQEAgLTEwMjQsMTIgKzEwMjQsMTIgQEAKIAkJCX0KIAkJfSBlbHNlIGlmIChBZGFwdGVyLT5QbXVNb2RlID09IEhZQlJJRF9NT0RFXzYpIHsKIAotCQkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsKFVJTlQpMHgwZjAwMGMwMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOworCQkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsIChVSU5UKTB4MGYwMDBjMDAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKIAkJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIENNSE9TVCwgUkRNLCBEQkdfTFZMX0FMTCwgIiVzOiVkIFJETSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQkJcmV0dXJuIHJldHZhbDsKIAkJCX0KLQkJCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLChVSU5UKTB4MGYwMDBjMDAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKKwkJCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLCAoVUlOVCkweDBmMDAwYzAwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CiAJCQlpZiAocmV0dmFsIDwgMCkgewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBDTUhPU1QsIFJETSwgREJHX0xWTF9BTEwsICIlczolZCBSRE0gZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJCXJldHVybiByZXR2YWw7CkBAIC0xMDQwLDEyICsxMDQwLDEyIEBACiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIENNSE9TVCwgUkRNLCBEQkdfTFZMX0FMTCwgIiVzOiVkIFJETSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQkJcmV0dXJuIHJldHZhbDsKIAkJCX0KLQkJCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLChVSU5UKTB4MGYwMDBjMDAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKKwkJCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLCAoVUlOVCkweDBmMDAwYzAwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CiAJCQlpZiAocmV0dmFsIDwgMCkgewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBDTUhPU1QsIFJETSwgREJHX0xWTF9BTEwsICIlczolZCBSRE0gZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJCXJldHVybiByZXR2YWw7CiAJCQl9Ci0JCQlyZXR2YWwgPSByZG1hbHQoQWRhcHRlciwoVUlOVCkweDBmMDAwYzAwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CisJCQlyZXR2YWwgPSByZG1hbHQoQWRhcHRlciwgKFVJTlQpMHgwZjAwMGMwMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOwogCQkJaWYgKHJldHZhbCA8IDApIHsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgQ01IT1NULCBSRE0sIERCR19MVkxfQUxMLCAiJXM6JWQgUkRNIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJCQlyZXR1cm4gcmV0dmFsOwpAQCAtMTA5NCw4ICsxMDk0LDggQEAKIAkJCVJlZ0NvdW50IC09IFQzTFBfU0tJUF9DTE9DS19QUk9HUkFNX0RVTVBfMTMzTUhaOwogCQkJcHNERFJTZXR0aW5nICs9IFQzTFBfU0tJUF9DTE9DS19QUk9HUkFNX0RVTVBfMTMzTUhaOwogCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJICAgIHJldHVybiAtRUlOVkFMOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTEyMTUsNyArMTIxNSw3IEBACiAJCXVsX2Rkcl9zZXR0aW5nX2xvYWRfYWRkciArPSBzaXplb2YoVUxPTkcpOwogCQlpZiAoIXJldHZhbCkgewogCQkJaWYgKGJPdmVycmlkZVNlbGZSZWZyZXNoICYmIChwc0REUlNldHRpbmctPnVsUmVnQWRkcmVzcyA9PSAweDBGMDA3MDE4KSkgewotCQkJCXZhbHVlID0gKHBzRERSU2V0dGluZy0+dWxSZWdWYWx1ZSB8KDE8PDgpKTsKKwkJCQl2YWx1ZSA9IChwc0REUlNldHRpbmctPnVsUmVnVmFsdWUgfCAoMTw8OCkpOwogCQkJaWYgKFNUQVRVU19TVUNDRVNTICE9IHdybWFsdChBZGFwdGVyLCB1bF9kZHJfc2V0dGluZ19sb2FkX2FkZHIsCiAJCQkJJnZhbHVlLCBzaXplb2YodmFsdWUpKSkgewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJbml0LmMKaW5kZXggOTRmMzI3Mi4uN2MwNGM3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJbml0LmMKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSAiaGVhZGVycy5oIgotCisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIEludGVyZmFjZVVzYnRhYmxlW10gPSB7CiAJeyBVU0JfREVWSUNFKEJDTV9VU0JfVkVORE9SX0lEX1QzLCBCQ01fVVNCX1BST0RVQ1RfSURfVDMpIH0sCiAJeyBVU0JfREVWSUNFKEJDTV9VU0JfVkVORE9SX0lEX1QzLCBCQ01fVVNCX1BST0RVQ1RfSURfVDNCKSB9LApAQCAtMzAsMTkgKzMwLDIyIEBACiAJaW50IGkgPSAwOwogCiAJLyogV2FrZSB1cCB0aGUgd2FpdF9xdWV1ZS4uLiAqLwotCWlmIChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYgQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSkgeworCWlmIChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYKKwkJCUJDTV9MRURfVEhSRUFEX1JVTk5JTkdfQUNUSVZFTFkpIHsKIAkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IERSSVZFUl9IQUxUOwogCQl3YWtlX3VwKCZwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7CiAJfQogCXJlc2V0X2NhcmRfcHJvYyhwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIpOwogCiAJLyoKLQkgKiB3b3JzdCBjYXNlIHRpbWUgdGFrZW4gYnkgdGhlIFJETS9XUk0gd2lsbCBiZSA1IHNlYy4gd2lsbCBjaGVjayBhZnRlciBldmVyeSAxMDAgbXMKLQkgKiB0byBhY2NlcnRhaW4gdGhlIGRldmljZSBpcyBub3QgYmVpbmcgYWNjZXNzZWQuIEFmdGVyIHRoaXMgTm8gUkRNL1dSTSBzaG91bGQgYmUgbWFkZS4KKwkgKiB3b3JzdCBjYXNlIHRpbWUgdGFrZW4gYnkgdGhlIFJETS9XUk0gd2lsbCBiZSA1IHNlYy4gd2lsbCBjaGVjayBhZnRlcgorCSAqIGV2ZXJ5IDEwMCBtcyB0byBhY2NlcnRhaW4gdGhlIGRldmljZSBpcyBub3QgYmVpbmcgYWNjZXNzZWQuIEFmdGVyCisJICogdGhpcyBObyBSRE0vV1JNIHNob3VsZCBiZSBtYWRlLgogCSAqLwogCXdoaWxlIChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkRldmljZUFjY2VzcykgewotCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCSJEZXZpY2UgaXMgYmVpbmcgYWNjZXNzZWQuXG4iKTsKKwkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsCisJCQkJRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKKwkJCQkiRGV2aWNlIGlzIGJlaW5nIGFjY2Vzc2VkLlxuIik7CiAJCW1zbGVlcCgxMDApOwogCX0KIAkvKiBGcmVlIGludGVycnVwdCBVUkIgKi8KQEAgLTcxLDYgKzc0LDcgQEAKIHsKIAl1MzIgdWxSZWc7CiAJaW50IGJ5dGVzOworCXN0cnVjdCBiY21faW50ZXJmYWNlX2FkYXB0ZXIgKmludGVyZmFjZUFkYXB0ZXI7CiAKIAkvKiBQcm9ncmFtIEVQMiBNQVhfUEtUX1NJWkUgKi8KIAl1bFJlZyA9IG50b2hsKEVQMl9NUFNfUkVHKTsKQEAgLTgwLDcgKzg0LDkgQEAKIAogCXVsUmVnID0gbnRvaGwoRVAyX0NGR19SRUcpOwogCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLCAoUFVDSEFSKSZ1bFJlZywgMHgxMzIsIDQsIFRSVUUpOwotCWlmICgoKHN0cnVjdCBiY21faW50ZXJmYWNlX2FkYXB0ZXIgKikoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyKSktPmJIaWdoU3BlZWREZXZpY2UgPT0gVFJVRSkgeworCWludGVyZmFjZUFkYXB0ZXIgPQorCQkoc3RydWN0IGJjbV9pbnRlcmZhY2VfYWRhcHRlciAqKShBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIpOworCWlmIChpbnRlcmZhY2VBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlKSB7CiAJCXVsUmVnID0gbnRvaGwoRVAyX0NGR19JTlQpOwogCQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwgKFBVQ0hBUikmdWxSZWcsIDB4MTM2LCA0LCBUUlVFKTsKIAl9IGVsc2UgewpAQCAtOTgsOCArMTA0LDggQEAKIAkvKiBQcm9ncmFtIFRYIEVQIGFzIGludGVycnVwdChBbHRlcm5hdGUgU2V0dGluZykgKi8KIAlieXRlcyA9IHJkbWFsdChBZGFwdGVyLCAweDBGMDExMEY4LCAmdWxSZWcsIHNpemVvZih1MzIpKTsKIAlpZiAoYnl0ZXMgPCAwKSB7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCSJyZWFkaW5nIG9mIFR4IEVQIGZhaWxlZFxuIik7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLAorCQkJCURCR19MVkxfQUxMLCAicmVhZGluZyBvZiBUeCBFUCBmYWlsZWRcbiIpOwogCQlyZXR1cm47CiAJfQogCXVsUmVnIHw9IDB4NjsKQEAgLTE1MCw3ICsxNTYsOCBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwogCiAJLyogUmVzZXJ2ZSBvbmUgZXh0cmEgcXVldWUgZm9yIHRoZSBiaXQtYnVja2V0ICovCi0JbmRldiA9IGFsbG9jX2V0aGVyZGV2X21xKHNpemVvZihzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciksIE5PX09GX1FVRVVFUysxKTsKKwluZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXEoc2l6ZW9mKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyKSwKKwkJCU5PX09GX1FVRVVFUyArIDEpOwogCWlmIChuZGV2ID09IE5VTEwpIHsKIAkJZGV2X2VycigmdWRldi0+ZGV2LCBEUlZfTkFNRSAiOiBubyBtZW1vcnkgZm9yIGRldmljZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTY5LDEzICsxNzYsMTQgQEAKIAogCS8qCiAJICogVGVjaG5pY2FsbHksIG9uZSBjYW4gc3RhcnQgdXNpbmcgQkNNX0RFQlVHX1BSSU5UIGFmdGVyIHRoaXMgcG9pbnQuCi0JICogSG93ZXZlciwgcmVhbGl6ZSB0aGF0IGJ5IGRlZmF1bHQgdGhlIFR5cGUvU3VidHlwZSBiaXRtYXBzIGFyZSBhbGwgemVybyBub3c7Ci0JICogc28gbm8gcHJpbnRzIHdpbGwgYWN0dWFsbHkgYXBwZWFyIHVudGlsIHRoZSBUZXN0QXBwIHR1cm5zIG9uIGRlYnVnIHBhdGhzIHZpYQotCSAqIHRoZSBpb2N0bCgpOyBzbyBwcmFjdGljYWxseSBzcGVha2luZywgaW4gZWFybHkgaW5pdCwgbm8gbG9nZ2luZyBoYXBwZW5zLgorCSAqIEhvd2V2ZXIsIHJlYWxpemUgdGhhdCBieSBkZWZhdWx0IHRoZSBUeXBlL1N1YnR5cGUgYml0bWFwcyBhcmUgYWxsCisJICogemVybyBub3c7IHNvIG5vIHByaW50cyB3aWxsIGFjdHVhbGx5IGFwcGVhciB1bnRpbCB0aGUgVGVzdEFwcCB0dXJucworCSAqIG9uIGRlYnVnIHBhdGhzIHZpYSB0aGUgaW9jdGwoKTsgc28gcHJhY3RpY2FsbHkgc3BlYWtpbmcsIGluIGVhcmx5CisJICogaW5pdCwgbm8gbG9nZ2luZyBoYXBwZW5zLgogCSAqCi0JICogQSBzb2x1dGlvbiAodXNlZCBiZWxvdyk6IHdlIGV4cGxpY2l0bHkgc2V0IHRoZSBiaXRtYXBzIHRvIDEgZm9yIFR5cGU9REJHX1RZUEVfSU5JVEVYSVQKLQkgKiBhbmQgQUxMIHN1YnR5cGUncyBvZiB0aGUgc2FtZS4gTm93IGFsbCBiY20gZGVidWcgc3RhdGVtZW50cyBnZXQgbG9nZ2VkLCBlbmFibGluZyBkZWJ1ZwotCSAqIGR1cmluZyBlYXJseSBpbml0LgorCSAqIEEgc29sdXRpb24gKHVzZWQgYmVsb3cpOiB3ZSBleHBsaWNpdGx5IHNldCB0aGUgYml0bWFwcyB0byAxIGZvcgorCSAqIFR5cGU9REJHX1RZUEVfSU5JVEVYSVQgYW5kIEFMTCBzdWJ0eXBlJ3Mgb2YgdGhlIHNhbWUuIE5vdyBhbGwgYmNtCisJICogZGVidWcgc3RhdGVtZW50cyBnZXQgbG9nZ2VkLCBlbmFibGluZyBkZWJ1ZyBkdXJpbmcgZWFybHkgaW5pdC4KIAkgKiBGdXJ0aGVyLCB3ZSB0dXJuIHRoaXMgT0ZGIG9uY2UgaW5pdF9tb2R1bGUoKSBjb21wbGV0ZXMuCiAJICovCiAKQEAgLTE5MSw3ICsxOTksNyBAQAogCiAJLyogQWxsb2NhdGUgaW50ZXJmYWNlIGFkYXB0ZXIgc3RydWN0dXJlICovCiAJcHNJbnRmQWRhcHRlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBiY21faW50ZXJmYWNlX2FkYXB0ZXIpLAotCQkJCUdGUF9LRVJORUwpOworCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKHBzSW50ZkFkYXB0ZXIgPT0gTlVMTCkgewogCQlBZGFwdGVyRnJlZShwc0FkYXB0ZXIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIwNSw3ICsyMTMsNyBAQAogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgcHNJbnRmQWRhcHRlcik7CiAKIAlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJInBzSW50ZkFkYXB0ZXIgMHglcFxuIiwgcHNJbnRmQWRhcHRlcik7CisJCQkicHNJbnRmQWRhcHRlciAweCVwXG4iLCBwc0ludGZBZGFwdGVyKTsKIAlyZXR2YWwgPSBJbnRlcmZhY2VBZGFwdGVySW5pdChwc0ludGZBZGFwdGVyKTsKIAlpZiAocmV0dmFsKSB7CiAJCS8qIElmIHRoZSBGaXJtd2FyZS9DZmcgRmlsZSBpcyBub3QgcHJlc2VudApAQCAtMjEzLDEyICsyMjEsMTMgQEAKIAkJICogZG93bmxvYWQgdGhlIGZpbGVzLgogCQkgKi8KIAkJaWYgKC1FTk9FTlQgPT0gcmV0dmFsKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCQkiRmlsZSBOb3QgRm91bmQuICBVc2UgYXBwIHRvIGRvd25sb2FkLlxuIik7CisJCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLAorCQkJCQlEQkdfTFZMX0FMTCwKKwkJCQkJIkZpbGUgTm90IEZvdW5kLiAgVXNlIGFwcCB0byBkb3dubG9hZC5cbiIpOwogCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogCQl9Ci0JCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAotCQkJIkludGVyZmFjZUFkYXB0ZXJJbml0IGZhaWxlZC5cbiIpOworCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLAorCQkJCURCR19MVkxfQUxMLCAiSW50ZXJmYWNlQWRhcHRlckluaXQgZmFpbGVkLlxuIik7CiAJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CiAJCXVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwogCQl1c2JfcHV0X2Rldih1ZGV2KTsKQEAgLTIyOCw3ICsyMzcsMTAgQEAKIAlpZiAocHNBZGFwdGVyLT5jaGlwX2lkID4gVDMpIHsKIAkJdWludDMyX3QgdWlOYWNrWmVyb0xlbmd0aEludCA9IDQ7CiAKLQkJcmV0dmFsID0gd3JtYWx0KHBzQWRhcHRlciwgRElTQUJMRV9VU0JfWkVST19MRU5fSU5ULCAmdWlOYWNrWmVyb0xlbmd0aEludCwgc2l6ZW9mKHVpTmFja1plcm9MZW5ndGhJbnQpKTsKKwkJcmV0dmFsID0KKwkJCXdybWFsdChwc0FkYXB0ZXIsIERJU0FCTEVfVVNCX1pFUk9fTEVOX0lOVCwKKwkJCQkJJnVpTmFja1plcm9MZW5ndGhJbnQsCisJCQkJCXNpemVvZih1aU5hY2taZXJvTGVuZ3RoSW50KSk7CiAJCWlmIChyZXR2YWwpCiAJCQlyZXR1cm4gcmV0dmFsOwogCX0KQEAgLTI0Miw5ICsyNTQsMTEgQEAKIAkJCWludGYtPm5lZWRzX3JlbW90ZV93YWtldXAgPSAxOwogCQkJdXNiX2VuYWJsZV9hdXRvc3VzcGVuZCh1ZGV2KTsKIAkJCWRldmljZV9pbml0X3dha2V1cCgmaW50Zi0+ZGV2LCAxKTsKLQkJCUlOSVRfV09SSygmcHNJbnRmQWRhcHRlci0+dXNiU3VzcGVuZFdvcmssIHB1dFVzYlN1c3BlbmQpOwotCQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCi0JCQkJIkVuYWJsaW5nIFVTQiBBdXRvLVN1c3BlbmRcbiIpOworCQkJSU5JVF9XT1JLKCZwc0ludGZBZGFwdGVyLT51c2JTdXNwZW5kV29yaywKKwkJCQkJcHV0VXNiU3VzcGVuZCk7CisJCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLAorCQkJCQlEQkdfTFZMX0FMTCwKKwkJCQkJIkVuYWJsaW5nIFVTQiBBdXRvLVN1c3BlbmRcbiIpOwogI2VuZGlmCiAJCX0gZWxzZSB7CiAJCQlpbnRmLT5uZWVkc19yZW1vdGVfd2FrZXVwID0gMDsKQEAgLTI3MSw3ICsyODUsNyBAQAogCWlmIChwc0FkYXB0ZXItPmJEb1N1c3BlbmQpCiAJCWludGYtPm5lZWRzX3JlbW90ZV93YWtldXAgPSAwOwogCi0JcHNBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCA9IFRSVUUgOworCXBzQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQgPSBUUlVFOwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CiAJSW50ZXJmYWNlQWRhcHRlckZyZWUocHNJbnRmQWRhcHRlcik7CiAJdXNiX3B1dF9kZXYodWRldik7CkBAIC0yODUsOCArMjk5LDEwIEBACiAJCXBzSW50ZkFkYXB0ZXItPmFzVXNiVGNiW2ldLnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAKIAkJaWYgKHBzSW50ZkFkYXB0ZXItPmFzVXNiVGNiW2ldLnVyYiA9PSBOVUxMKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJIkNhbid0IGFsbG9jYXRlIFR4IHVyYiBmb3IgaW5kZXggJWRcbiIsIGkpOworCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCQkiQ2FuJ3QgYWxsb2NhdGUgVHggdXJiIGZvciBpbmRleCAlZFxuIiwKKwkJCQkJaSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KQEAgLTI5NSwxOSArMzExLDI1IEBACiAJCXBzSW50ZkFkYXB0ZXItPmFzVXNiUmNiW2ldLnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAKIAkJaWYgKHBzSW50ZkFkYXB0ZXItPmFzVXNiUmNiW2ldLnVyYiA9PSBOVUxMKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJIkNhbid0IGFsbG9jYXRlIFJ4IHVyYiBmb3IgaW5kZXggJWRcbiIsIGkpOworCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCQkiQ2FuJ3QgYWxsb2NhdGUgUnggdXJiIGZvciBpbmRleCAlZFxuIiwKKwkJCQkJaSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCi0JCXBzSW50ZkFkYXB0ZXItPmFzVXNiUmNiW2ldLnVyYi0+dHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyhNQVhfREFUQV9CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7CisJCXBzSW50ZkFkYXB0ZXItPmFzVXNiUmNiW2ldLnVyYi0+dHJhbnNmZXJfYnVmZmVyID0KKwkJCWttYWxsb2MoTUFYX0RBVEFfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOwogCiAJCWlmIChwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJIkNhbid0IGFsbG9jYXRlIFJ4IGJ1ZmZlciBmb3IgaW5kZXggJWRcbiIsIGkpOworCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCQkiQ2FuJ3QgYWxsb2NhdGUgUnggYnVmZmVyIGZvciBpbmRleCAlZFxuIiwKKwkJCQkJaSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQotCQlwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBNQVhfREFUQV9CVUZGRVJfU0laRTsKKwkJcHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0KKwkJCU1BWF9EQVRBX0JVRkZFUl9TSVpFOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTMyMiwyNCArMzQ0LDI5IEBACiAJCXByX2VycihEUlZfTkFNRSAiSW5pdENhcmRBbmREb3dubG9hZEZpcm13YXJlIGZhaWxlZC5cbiIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KLQlpZiAoVFJVRSA9PSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUpIHsKKwlpZiAocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5md19kb3dubG9hZF9kb25lKSB7CiAJCWlmIChTdGFydEludGVycnVwdFVyYihwc0ludGZBZGFwdGVyKSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCi0JCQkiQ2Fubm90IHNlbmQgaW50ZXJydXB0IGluIFVSQlxuIik7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLAorCQkJCQlEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLAorCQkJCQlEQkdfTFZMX0FMTCwKKwkJCQkJIkNhbm5vdCBzZW5kIGludGVycnVwdCBpbiBVUkJcbiIpOwogCQl9CiAKIAkJLyoKLQkJICogbm93IHJlZ2lzdGVyIHRoZSBjbnRybCBpbnRlcmZhY2UuCi0JCSAqIGFmdGVyIGRvd25sb2FkaW5nIHRoZSBmL3cgd2FpdGluZyBmb3IgNSBzZWMgdG8gZ2V0IHRoZSBtYWlsYm94IGludGVycnVwdC4KKwkJICogbm93IHJlZ2lzdGVyIHRoZSBjbnRybCBpbnRlcmZhY2UuICBhZnRlciBkb3dubG9hZGluZyB0aGUgZi93CisJCSAqIHdhaXRpbmcgZm9yIDUgc2VjIHRvIGdldCB0aGUgbWFpbGJveCBpbnRlcnJ1cHQuCiAJCSAqLwogCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPndhaXRpbmdfdG9fZndfZG93bmxvYWRfZG9uZSA9IGZhbHNlOwotCQl2YWx1ZSA9IHdhaXRfZXZlbnRfdGltZW91dChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmlvY3RsX2Z3X2RubGRfd2FpdF9xdWV1ZSwKLQkJCQkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT53YWl0aW5nX3RvX2Z3X2Rvd25sb2FkX2RvbmUsIDUqSFopOworCQl2YWx1ZSA9IHdhaXRfZXZlbnRfdGltZW91dCgKKwkJCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmlvY3RsX2Z3X2RubGRfd2FpdF9xdWV1ZSwKKwkJCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPndhaXRpbmdfdG9fZndfZG93bmxvYWRfZG9uZSwKKwkJCQk1ICogSFopOwogCiAJCWlmICh2YWx1ZSA9PSAwKQogCQkJcHJfZXJyKERSVl9OQU1FICI6IFRpbWVvdXQgd2FpdGluZyBmb3IgbWFpbGJveCBpbnRlcnJ1cHQuXG4iKTsKIAotCQlpZiAocmVnaXN0ZXJfY29udHJvbF9kZXZpY2VfaW50ZXJmYWNlKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcikgPCAwKSB7CisJCWlmIChyZWdpc3Rlcl9jb250cm9sX2RldmljZV9pbnRlcmZhY2UoCisJCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcikgPCAwKSB7CiAJCQlwcl9lcnIoRFJWX05BTUUgIjogUmVnaXN0ZXIgQ29udHJvbCBEZXZpY2UgZmFpbGVkLlxuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQpAQCAtMzQ3LDgxICszNzQsNiBAQAogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbmxpbmUgaW50IGJjbV91c2JfZW5kcG9pbnRfbnVtKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiBlcGQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJjbV91c2JfZW5kcG9pbnRfdHlwZShjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gZXBkLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSzsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYmNtX3VzYl9lbmRwb2ludF9kaXJfaW4oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCi17Ci0JcmV0dXJuICgoZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX0lOKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYmNtX3VzYl9lbmRwb2ludF9kaXJfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiAoKGVwZC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9PVVQpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBiY21fdXNiX2VuZHBvaW50X3hmZXJfYnVsayhjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQotCQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYmNtX3VzYl9lbmRwb2ludF94ZmVyX2NvbnRyb2woY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCi17Ci0JcmV0dXJuICgoZXBkLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0KLQkJVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJjbV91c2JfZW5kcG9pbnRfeGZlcl9pbnQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCi17Ci0JcmV0dXJuICgoZXBkLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0KLQkJVVNCX0VORFBPSU5UX1hGRVJfSU5UKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYmNtX3VzYl9lbmRwb2ludF94ZmVyX2lzb2MoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCi17Ci0JcmV0dXJuICgoZXBkLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0KLQkJVVNCX0VORFBPSU5UX1hGRVJfSVNPQyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJjbV91c2JfZW5kcG9pbnRfaXNfYnVsa19pbihjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gYmNtX3VzYl9lbmRwb2ludF94ZmVyX2J1bGsoZXBkKSAmJiBiY21fdXNiX2VuZHBvaW50X2Rpcl9pbihlcGQpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBiY21fdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiBiY21fdXNiX2VuZHBvaW50X3hmZXJfYnVsayhlcGQpICYmIGJjbV91c2JfZW5kcG9pbnRfZGlyX291dChlcGQpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBiY21fdXNiX2VuZHBvaW50X2lzX2ludF9pbihjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gYmNtX3VzYl9lbmRwb2ludF94ZmVyX2ludChlcGQpICYmIGJjbV91c2JfZW5kcG9pbnRfZGlyX2luKGVwZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X291dChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gYmNtX3VzYl9lbmRwb2ludF94ZmVyX2ludChlcGQpICYmIGJjbV91c2JfZW5kcG9pbnRfZGlyX291dChlcGQpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBiY21fdXNiX2VuZHBvaW50X2lzX2lzb2NfaW4oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCi17Ci0JcmV0dXJuIGJjbV91c2JfZW5kcG9pbnRfeGZlcl9pc29jKGVwZCkgJiYgYmNtX3VzYl9lbmRwb2ludF9kaXJfaW4oZXBkKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYmNtX3VzYl9lbmRwb2ludF9pc19pc29jX291dChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gYmNtX3VzYl9lbmRwb2ludF94ZmVyX2lzb2MoZXBkKSAmJiBiY21fdXNiX2VuZHBvaW50X2Rpcl9vdXQoZXBkKTsKLX0KLQogc3RhdGljIGludCBJbnRlcmZhY2VBZGFwdGVySW5pdChzdHJ1Y3QgYmNtX2ludGVyZmFjZV9hZGFwdGVyICpwc0ludGZBZGFwdGVyKQogewogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2M7CkBAIC00MjksMjMgKzM4MSwyNyBAQAogCXNpemVfdCBidWZmZXJfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwogCWludCByZXR2YWwgPSAwOwotCWludCB1c2VkSW50T3V0Rm9yQnVsa1RyYW5zZmVyID0gMCA7CisJaW50IHVzZWRJbnRPdXRGb3JCdWxrVHJhbnNmZXIgPSAwOwogCWJvb2wgYkJjbTE2ID0gZmFsc2U7CiAJVUlOVCB1aURhdGEgPSAwOwogCWludCBieXRlczsKIAogCS8qIFN0b3JlIHRoZSB1c2IgZGV2IGludG8gaW50ZXJmYWNlIGFkYXB0ZXIgKi8KLQlwc0ludGZBZGFwdGVyLT51ZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UpKTsKKwlwc0ludGZBZGFwdGVyLT51ZGV2ID0KKwkJdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UpKTsKIAotCXBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPSAocHNJbnRmQWRhcHRlci0+dWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpOworCXBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPQorCQkocHNJbnRmQWRhcHRlci0+dWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpOwogCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+aW50ZXJmYWNlX3JkbSA9IEJjbVJETTsKIAlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmludGVyZmFjZV93cm0gPSBCY21XUk07CiAKIAlieXRlcyA9IHJkbWFsdChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIENISVBfSURfUkVHLAotCQkJKHUzMiAqKSYocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkKSwgc2l6ZW9mKHUzMikpOworCQkJKHUzMiAqKSAmKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+Y2hpcF9pZCksCisJCQlzaXplb2YodTMyKSk7CiAJaWYgKGJ5dGVzIDwgMCkgewogCQlyZXR2YWwgPSBieXRlczsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ0hJUCBJRCBSZWFkIEZhaWxlZFxuIik7CisJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiQ0hJUCBJRCBSZWFkIEZhaWxlZFxuIik7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCkBAIC00NTMsODEgKzQwOSwxMTkgQEAKIAkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkICY9IH4weEYwOwogCiAJZGV2X2luZm8oJnBzSW50ZkFkYXB0ZXItPnVkZXYtPmRldiwgIlJETSBDaGlwIElEIDB4JWx4XG4iLAotCQkgcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkKTsKKwkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+Y2hpcF9pZCk7CiAKIAlpZmFjZV9kZXNjID0gcHNJbnRmQWRhcHRlci0+aW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZzsKIAogCWlmIChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQgPT0gVDNCKSB7Ci0JCS8qIFQzQiBkZXZpY2Ugd2lsbCBoYXZlIEVFUFJPTSwgY2hlY2sgaWYgRUVQUk9NIGlzIHByb3BlciBhbmQgQkNNMTYgY2FuIGJlIGRvbmUgb3Igbm90LiAqLworCQkvKiBUM0IgZGV2aWNlIHdpbGwgaGF2ZSBFRVBST00sIGNoZWNrIGlmIEVFUFJPTSBpcyBwcm9wZXIgYW5kCisJCSAqIEJDTTE2IGNhbiBiZSBkb25lIG9yIG5vdC4gKi8KIAkJQmVjZWVtRUVQUk9NQnVsa1JlYWQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCAmdWlEYXRhLCAweDAsIDQpOwogCQlpZiAodWlEYXRhID09IEJFQ00pCiAJCQliQmNtMTYgPSBUUlVFOwogCi0JCWRldl9pbmZvKCZwc0ludGZBZGFwdGVyLT51ZGV2LT5kZXYsICJudW1iZXIgb2YgYWx0ZXJuYXRlIHNldHRpbmcgJWRcbiIsCi0JCQkgcHNJbnRmQWRhcHRlci0+aW50ZXJmYWNlLT5udW1fYWx0c2V0dGluZyk7CisJCWRldl9pbmZvKCZwc0ludGZBZGFwdGVyLT51ZGV2LT5kZXYsCisJCQkJIm51bWJlciBvZiBhbHRlcm5hdGUgc2V0dGluZyAlZFxuIiwKKwkJCQlwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UtPm51bV9hbHRzZXR0aW5nKTsKIAogCQlpZiAoYkJjbTE2ID09IFRSVUUpIHsKLQkJCS8qIHNlbGVjdGluZyBhbHRlcm5hdGUgc2V0dGluZyBvbmUgYXMgYSBkZWZhdWx0IHNldHRpbmcgZm9yIEhpZ2ggU3BlZWQgIG1vZGVtLiAqLworCQkJLyogc2VsZWN0aW5nIGFsdGVybmF0ZSBzZXR0aW5nIG9uZSBhcyBhIGRlZmF1bHQgc2V0dGluZworCQkJICogZm9yIEhpZ2ggU3BlZWQgIG1vZGVtLiAqLwogCQkJaWYgKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UpCi0JCQkJcmV0dmFsID0gdXNiX3NldF9pbnRlcmZhY2UocHNJbnRmQWRhcHRlci0+dWRldiwgREVGQVVMVF9TRVRUSU5HXzAsIEFMVEVSTkFURV9TRVRUSU5HXzEpOwotCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCi0JCQkJIkJDTTE2IGlzIGFwcGxpY2FibGUgb24gdGhpcyBkb25nbGVcbiIpOwotCQkJaWYgKHJldHZhbCB8fCAocHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSA9PSBmYWxzZSkpIHsKLQkJCQl1c2VkSW50T3V0Rm9yQnVsa1RyYW5zZmVyID0gRVAyIDsKKwkJCQlyZXR2YWwgPSB1c2Jfc2V0X2ludGVyZmFjZShwc0ludGZBZGFwdGVyLT51ZGV2LAorCQkJCQkJREVGQVVMVF9TRVRUSU5HXzAsCisJCQkJCQlBTFRFUk5BVEVfU0VUVElOR18xKTsKKwkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsCisJCQkJCURCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksCisJCQkJCURCR19MVkxfQUxMLAorCQkJCQkiQkNNMTYgaXMgYXBwbGljYWJsZSBvbiB0aGlzIGRvbmdsZVxuIik7CisJCQlpZiAocmV0dmFsIHx8ICFwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlKSB7CisJCQkJdXNlZEludE91dEZvckJ1bGtUcmFuc2ZlciA9IEVQMjsKIAkJCQllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFtFUDJdLmRlc2M7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCi0JCQkJCSAiSW50ZXJmYWNlIGFsdHNldHRpbmcgZmFpbGVkIG9yIG1vZGVtIGlzIGNvbmZpZ3VyZWQgdG8gRnVsbCBTcGVlZCwgaGVuY2Ugd2lsbCB3b3JrIG9uIGRlZmF1bHQgc2V0dGluZyAwXG4iKTsKKwkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLAorCQkJCQkJREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwKKwkJCQkJCURCR19MVkxfQUxMLAorCQkJCQkJIkludGVyZmFjZSBhbHRzZXR0aW5nIGZhaWxlZCBvciBtb2RlbSBpcyBjb25maWd1cmVkIHRvIEZ1bGwgU3BlZWQsIGhlbmNlIHdpbGwgd29yayBvbiBkZWZhdWx0IHNldHRpbmcgMFxuIik7CiAJCQkJLyoKLQkJCQkgKiBJZiBNb2RlbSBpcyBoaWdoIHNwZWVkIGRldmljZSBFUDIgc2hvdWxkIGJlIElOVCBPVVQgRW5kIHBvaW50Ci0JCQkJICogSWYgTW9kZSBpcyBGUyB0aGVuIEVQMiBzaG91bGQgYmUgYnVsayBlbmQgcG9pbnQKKwkJCQkgKiBJZiBNb2RlbSBpcyBoaWdoIHNwZWVkIGRldmljZSBFUDIgc2hvdWxkIGJlCisJCQkJICogSU5UIE9VVCBFbmQgcG9pbnQKKwkJCQkgKgorCQkJCSAqIElmIE1vZGUgaXMgRlMgdGhlbiBFUDIgc2hvdWxkIGJlIGJ1bGsgZW5kCisJCQkJICogcG9pbnQKIAkJCQkgKi8KLQkJCQlpZiAoKChwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlID09IFRSVUUpICYmIChiY21fdXNiX2VuZHBvaW50X2lzX2ludF9vdXQoZW5kcG9pbnQpID09IGZhbHNlKSkKLQkJCQkJfHwgKChwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlID09IGZhbHNlKSAmJiAoYmNtX3VzYl9lbmRwb2ludF9pc19idWxrX291dChlbmRwb2ludCkgPT0gZmFsc2UpKSkgewotCQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCQkJCSJDb25maWd1cmluZyB0aGUgRUVQUk9NXG4iKTsKKwkJCQlpZiAoKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgJiYKKwkJCQkJCQkhdXNiX2VuZHBvaW50X2lzX2ludF9vdXQoZW5kcG9pbnQpKSB8fAorCQkJCQkJKCFwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlICYmCisJCQkJCQkgIXVzYl9lbmRwb2ludF9pc19idWxrX291dChlbmRwb2ludCkpKSB7CisJCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsCisJCQkJCQkJREJHX1RZUEVfSU5JVEVYSVQsCisJCQkJCQkJRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKKwkJCQkJCQkiQ29uZmlndXJpbmcgdGhlIEVFUFJPTVxuIik7CiAJCQkJCS8qIGNoYW5nZSB0aGUgRVAyLCBFUDQgdG8gSU5UIE9VVCBlbmQgcG9pbnQgKi8KLQkJCQkJQ29uZmlndXJlRW5kUG9pbnRUeXBlc1Rocm91Z2hFRVBST00ocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyKTsKKwkJCQkJQ29uZmlndXJlRW5kUG9pbnRUeXBlc1Rocm91Z2hFRVBST00oCisJCQkJCQkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyKTsKIAogCQkJCQkvKgotCQkJCQkgKiBJdCByZXNldHMgdGhlIGRldmljZSBhbmQgaWYgYW55IHRoaW5nIGdldHMgY2hhbmdlZAotCQkJCQkgKiAgaW4gVVNCIGRlc2NyaXB0b3IgaXQgd2lsbCBzaG93IGZhaWwgYW5kIHJlLWVudW1lcmF0ZQotCQkJCQkgKiB0aGUgZGV2aWNlCisJCQkJCSAqIEl0IHJlc2V0cyB0aGUgZGV2aWNlIGFuZCBpZiBhbnkgdGhpbmcKKwkJCQkJICogZ2V0cyBjaGFuZ2VkIGluIFVTQiBkZXNjcmlwdG9yIGl0CisJCQkJCSAqIHdpbGwgc2hvdyBmYWlsIGFuZCByZS1lbnVtZXJhdGUgdGhlCisJCQkJCSAqIGRldmljZQogCQkJCQkgKi8KLQkJCQkJcmV0dmFsID0gdXNiX3Jlc2V0X2RldmljZShwc0ludGZBZGFwdGVyLT51ZGV2KTsKKwkJCQkJcmV0dmFsID0gdXNiX3Jlc2V0X2RldmljZSgKKwkJCQkJCQlwc0ludGZBZGFwdGVyLT51ZGV2KTsKIAkJCQkJaWYgKHJldHZhbCkgewotCQkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCi0JCQkJCQkJInJlc2V0IGZhaWxlZC4gIFJlLWVudW1lcmF0aW5nIHRoZSBkZXZpY2UuXG4iKTsKLQkJCQkJCXJldHVybiByZXR2YWwgOworCQkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJCQkJREJHX1RZUEVfSU5JVEVYSVQsCisJCQkJCQkJCURSVl9FTlRSWSwKKwkJCQkJCQkJREJHX0xWTF9BTEwsCisJCQkJCQkJCSJyZXNldCBmYWlsZWQuICBSZS1lbnVtZXJhdGluZyB0aGUgZGV2aWNlLlxuIik7CisJCQkJCQlyZXR1cm4gcmV0dmFsOwogCQkJCQl9CiAKIAkJCQl9Ci0JCQkJaWYgKChwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlID09IGZhbHNlKSAmJiBiY21fdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSkgeworCQkJCWlmICghcHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSAmJgorCQkJCSAgICB1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoZW5kcG9pbnQpKSB7CiAJCQkJCS8qIE9uY2UgQlVMSyBpcyBzZWxlY3RlZCBpbiBGUyBtb2RlLiBSZXZlcnQgaXQgYmFjayB0byBJTlQuIEVsc2UgVVNCX0lGIHdpbGwgZmFpbC4gKi8KIAkJCQkJVUlOVCBfdWlEYXRhID0gbnRvaGwoRVAyX0NGR19JTlQpOwotCQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCQkJCSJSZXZlcnRpbmcgQnVsayB0byBJTlQgYXMgaXQgaXMgaW4gRnVsbCBTcGVlZCBtb2RlLlxuIik7Ci0JCQkJCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIChQVUNIQVIpJl91aURhdGEsIDB4MTM2LCA0LCBUUlVFKTsKKwkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJCQlEQkdfVFlQRV9JTklURVhJVCwKKwkJCQkJCQlEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCQkJCSJSZXZlcnRpbmcgQnVsayB0byBJTlQgYXMgaXQgaXMgaW4gRnVsbCBTcGVlZCBtb2RlLlxuIik7CisJCQkJCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZSgKKwkJCQkJCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsCisJCQkJCQkJKFBVQ0hBUikgJiBfdWlEYXRhLAorCQkJCQkJCTB4MTM2LCA0LCBUUlVFKTsKIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCXVzZWRJbnRPdXRGb3JCdWxrVHJhbnNmZXIgPSBFUDQgOworCQkJCXVzZWRJbnRPdXRGb3JCdWxrVHJhbnNmZXIgPSBFUDQ7CiAJCQkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbRVA0XS5kZXNjOwotCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAotCQkJCQkiQ2hvb3NpbmcgQWx0U2V0dGluZyBhcyBhIGRlZmF1bHQgc2V0dGluZy5cbiIpOwotCQkJCWlmIChiY21fdXNiX2VuZHBvaW50X2lzX2ludF9vdXQoZW5kcG9pbnQpID09IGZhbHNlKSB7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAotCQkJCQkJIkRvbmdsZSBkb2VzIG5vdCBoYXZlIEJDTTE2IEZpeC5cbiIpOworCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsCisJCQkJCQlEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLAorCQkJCQkJREJHX0xWTF9BTEwsCisJCQkJCQkiQ2hvb3NpbmcgQWx0U2V0dGluZyBhcyBhIGRlZmF1bHQgc2V0dGluZy5cbiIpOworCQkJCWlmICghdXNiX2VuZHBvaW50X2lzX2ludF9vdXQoZW5kcG9pbnQpKSB7CisJCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsCisJCQkJCQkJREJHX1RZUEVfSU5JVEVYSVQsCisJCQkJCQkJRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKKwkJCQkJCQkiRG9uZ2xlIGRvZXMgbm90IGhhdmUgQkNNMTYgRml4LlxuIik7CiAJCQkJCS8qIGNoYW5nZSB0aGUgRVAyLCBFUDQgdG8gSU5UIE9VVCBlbmQgcG9pbnQgYW5kIHVzZSBFUDQgaW4gYWx0c2V0dGluZyAqLwotCQkJCQlDb25maWd1cmVFbmRQb2ludFR5cGVzVGhyb3VnaEVFUFJPTShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIpOworCQkJCQlDb25maWd1cmVFbmRQb2ludFR5cGVzVGhyb3VnaEVFUFJPTSgKKwkJCQkJCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIpOwogCiAJCQkJCS8qCi0JCQkJCSAqIEl0IHJlc2V0cyB0aGUgZGV2aWNlIGFuZCBpZiBhbnkgdGhpbmcgZ2V0cyBjaGFuZ2VkIGluCi0JCQkJCSAqICBVU0IgZGVzY3JpcHRvciBpdCB3aWxsIHNob3cgZmFpbCBhbmQgcmUtZW51bWVyYXRlIHRoZQorCQkJCQkgKiBJdCByZXNldHMgdGhlIGRldmljZSBhbmQgaWYgYW55IHRoaW5nCisJCQkJCSAqIGdldHMgY2hhbmdlZCBpbiBVU0IgZGVzY3JpcHRvciBpdAorCQkJCQkgKiB3aWxsIHNob3cgZmFpbCBhbmQgcmUtZW51bWVyYXRlIHRoZQogCQkJCQkgKiBkZXZpY2UKIAkJCQkJICovCi0JCQkJCXJldHZhbCA9IHVzYl9yZXNldF9kZXZpY2UocHNJbnRmQWRhcHRlci0+dWRldik7CisJCQkJCXJldHZhbCA9IHVzYl9yZXNldF9kZXZpY2UoCisJCQkJCQkJcHNJbnRmQWRhcHRlci0+dWRldik7CiAJCQkJCWlmIChyZXR2YWwpIHsKLQkJCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAotCQkJCQkJCSJyZXNldCBmYWlsZWQuICBSZS1lbnVtZXJhdGluZyB0aGUgZGV2aWNlLlxuIik7CisJCQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLAorCQkJCQkJCQlEQkdfVFlQRV9JTklURVhJVCwKKwkJCQkJCQkJRFJWX0VOVFJZLAorCQkJCQkJCQlEQkdfTFZMX0FMTCwKKwkJCQkJCQkJInJlc2V0IGZhaWxlZC4gIFJlLWVudW1lcmF0aW5nIHRoZSBkZXZpY2UuXG4iKTsKIAkJCQkJCXJldHVybiByZXR2YWw7CiAJCQkJCX0KIApAQCAtNTQxLDQ5ICs1MzUsNjkgQEAKIAlmb3IgKHZhbHVlID0gMDsgdmFsdWUgPCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7ICsrdmFsdWUpIHsKIAkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbdmFsdWVdLmRlc2M7CiAKLQkJaWYgKCFwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fZW5kcG9pbnRBZGRyICYmIGJjbV91c2JfZW5kcG9pbnRfaXNfYnVsa19pbihlbmRwb2ludCkpIHsKKwkJaWYgKCFwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fZW5kcG9pbnRBZGRyICYmCisJCQkJdXNiX2VuZHBvaW50X2lzX2J1bGtfaW4oZW5kcG9pbnQpKSB7CiAJCQlidWZmZXJfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CiAJCQlwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fc2l6ZSA9IGJ1ZmZlcl9zaXplOwotCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtJbi5idWxrX2luX2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwotCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtJbi5idWxrX2luX3BpcGUgPQotCQkJCQl1c2JfcmN2YnVsa3BpcGUocHNJbnRmQWRhcHRlci0+dWRldiwKLQkJCQkJCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtJbi5idWxrX2luX2VuZHBvaW50QWRkcik7CisJCQlwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fZW5kcG9pbnRBZGRyID0KKwkJCQllbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrSW4uYnVsa19pbl9waXBlID0gdXNiX3JjdmJ1bGtwaXBlKAorCQkJCQlwc0ludGZBZGFwdGVyLT51ZGV2LAorCQkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fZW5kcG9pbnRBZGRyKTsKIAkJfQogCi0JCWlmICghcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfZW5kcG9pbnRBZGRyICYmIGJjbV91c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoZW5kcG9pbnQpKSB7Ci0JCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9lbmRwb2ludEFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKLQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X3BpcGUgPQotCQkJCXVzYl9zbmRidWxrcGlwZShwc0ludGZBZGFwdGVyLT51ZGV2LAorCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkciAmJgorCQkJCXVzYl9lbmRwb2ludF9pc19idWxrX291dChlbmRwb2ludCkpIHsKKwkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkciA9CisJCQkJZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9waXBlID0gdXNiX3NuZGJ1bGtwaXBlKAorCQkJCQlwc0ludGZBZGFwdGVyLT51ZGV2LAogCQkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9lbmRwb2ludEFkZHIpOwogCQl9CiAKLQkJaWYgKCFwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9lbmRwb2ludEFkZHIgJiYgYmNtX3VzYl9lbmRwb2ludF9pc19pbnRfaW4oZW5kcG9pbnQpKSB7CisJCWlmICghcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fZW5kcG9pbnRBZGRyICYmCisJCQkJdXNiX2VuZHBvaW50X2lzX2ludF9pbihlbmRwb2ludCkpIHsKIAkJCWJ1ZmZlcl9zaXplID0gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKIAkJCXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX3NpemUgPSBidWZmZXJfc2l6ZTsKLQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwotCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5faW50ZXJ2YWwgPSBlbmRwb2ludC0+YkludGVydmFsOworCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fZW5kcG9pbnRBZGRyID0KKwkJCQllbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJCXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2ludGVydmFsID0KKwkJCQllbmRwb2ludC0+YkludGVydmFsOwogCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fYnVmZmVyID0KLQkJCQkJCWttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOworCQkJCWttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwogCQkJaWYgKCFwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9idWZmZXIpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAotCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfZW5kcG9pbnRBZGRyICYmIGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkpIHsKKwkJaWYgKCFwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2VuZHBvaW50QWRkciAmJgorCQkJCXVzYl9lbmRwb2ludF9pc19pbnRfb3V0KGVuZHBvaW50KSkgewogCQkJaWYgKCFwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9lbmRwb2ludEFkZHIgJiYKLQkJCQkocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkID09IFQzQikgJiYgKHZhbHVlID09IHVzZWRJbnRPdXRGb3JCdWxrVHJhbnNmZXIpKSB7CisJCQkJCShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQgPT0gVDNCKSAmJgorCQkJCQkodmFsdWUgPT0gdXNlZEludE91dEZvckJ1bGtUcmFuc2ZlcikpIHsKIAkJCQkvKiB1c2UgZmlyc3QgaW50b3V0IGVuZCBwb2ludCBhcyBhIGJ1bGsgb3V0IGVuZCBwb2ludCAqLwotCQkJCWJ1ZmZlcl9zaXplID0gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKLQkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9zaXplID0gYnVmZmVyX3NpemU7Ci0JCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfZW5kcG9pbnRBZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7Ci0JCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfcGlwZSA9IHVzYl9zbmRpbnRwaXBlKHBzSW50ZkFkYXB0ZXItPnVkZXYsCi0JCQkJCQkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9lbmRwb2ludEFkZHIpOwotCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmludF9vdXRfaW50ZXJ2YWwgPSBlbmRwb2ludC0+YkludGVydmFsOworCQkJCWJ1ZmZlcl9zaXplID0KKwkJCQkJbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9zaXplID0KKwkJCQkJYnVmZmVyX3NpemU7CisJCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfZW5kcG9pbnRBZGRyID0KKwkJCQkJZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfcGlwZSA9CisJCQkJCXVzYl9zbmRpbnRwaXBlKHBzSW50ZkFkYXB0ZXItPnVkZXYsCisJCQkJCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQKKwkJCQkJCQkuYnVsa19vdXRfZW5kcG9pbnRBZGRyKTsKKwkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5pbnRfb3V0X2ludGVydmFsID0KKwkJCQkJZW5kcG9pbnQtPmJJbnRlcnZhbDsKIAkJCX0gZWxzZSBpZiAodmFsdWUgPT0gRVA2KSB7Ci0JCQkJYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOwotCQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfc2l6ZSA9IGJ1ZmZlcl9zaXplOwotCQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfZW5kcG9pbnRBZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7Ci0JCQkJcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9pbnRlcnZhbCA9IGVuZHBvaW50LT5iSW50ZXJ2YWw7Ci0JCQkJcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9idWZmZXIgPSBrbWFsbG9jKGJ1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKKwkJCQlidWZmZXJfc2l6ZSA9CisJCQkJCWxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCQkJcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9zaXplID0KKwkJCQkJYnVmZmVyX3NpemU7CisJCQkJcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9lbmRwb2ludEFkZHIgPQorCQkJCQllbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJCQlwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2ludGVydmFsID0KKwkJCQkJZW5kcG9pbnQtPmJJbnRlcnZhbDsKKwkJCQlwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2J1ZmZlciA9CisJCQkJCWttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwogCQkJCWlmICghcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9idWZmZXIpCiAJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQpAQCAtNTk0LDE0ICs2MDgsMTQgQEAKIAogCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+YmNtX2ZpbGVfZG93bmxvYWQgPSBJbnRlcmZhY2VGaWxlRG93bmxvYWQ7CiAJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5iY21fZmlsZV9yZWFkYmFja19mcm9tX2NoaXAgPQotCQkJCUludGVyZmFjZUZpbGVSZWFkYmFja0Zyb21DaGlwOworCQlJbnRlcmZhY2VGaWxlUmVhZGJhY2tGcm9tQ2hpcDsKIAlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmludGVyZmFjZV90cmFuc21pdCA9IEludGVyZmFjZVRyYW5zbWl0UGFja2V0OwogCiAJcmV0dmFsID0gQ3JlYXRlSW50ZXJydXB0VXJiKHBzSW50ZkFkYXB0ZXIpOwogCiAJaWYgKHJldHZhbCkgewogCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkiQ2Fubm90IGNyZWF0ZSBpbnRlcnJ1cHQgdXJiXG4iKTsKKwkJCQkiQ2Fubm90IGNyZWF0ZSBpbnRlcnJ1cHQgdXJiXG4iKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKQEAgLTYxOCwxNyArNjMyLDIxIEBACiAKIAlwc0ludGZBZGFwdGVyLT5iU3VzcGVuZGVkID0gVFJVRTsKIAotCWlmIChUUlVFID09IHBzSW50ZkFkYXB0ZXItPmJQcmVwYXJpbmdGb3JCdXNTdXNwZW5kKSB7CisJaWYgKHBzSW50ZkFkYXB0ZXItPmJQcmVwYXJpbmdGb3JCdXNTdXNwZW5kKSB7CiAJCXBzSW50ZkFkYXB0ZXItPmJQcmVwYXJpbmdGb3JCdXNTdXNwZW5kID0gZmFsc2U7CiAKIAkJaWYgKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+TGlua1N0YXR1cyA9PSBMSU5LVVBfRE9ORSkgewotCQkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5JZGxlTW9kZSA9IFRSVUUgOwotCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCi0JCQkJIkhvc3QgRW50ZXJlZCBpbiBQTVUgSWRsZSBNb2RlLlxuIik7CisJCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPklkbGVNb2RlID0gVFJVRTsKKwkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsCisJCQkJCURCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksCisJCQkJCURCR19MVkxfQUxMLAorCQkJCQkiSG9zdCBFbnRlcmVkIGluIFBNVSBJZGxlIE1vZGUuXG4iKTsKIAkJfSBlbHNlIHsKIAkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+YlNodXRTdGF0dXMgPSBUUlVFOwotCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCi0JCQkJIkhvc3QgRW50ZXJlZCBpbiBQTVUgU2h1dGRvd24gTW9kZS5cbiIpOworCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwKKwkJCQkJREJHX0xWTF9BTEwsCisJCQkJCSJIb3N0IEVudGVyZWQgaW4gUE1VIFNodXRkb3duIE1vZGUuXG4iKTsKIAkJfQogCX0KIAlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSXNyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUlzci5jCmluZGV4IDdiMzlmNGYuLmI5ZjhhN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSXNyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJc3IuYwpAQCAtNCwxMDggKzQsMTI2IEBACiBzdGF0aWMgdm9pZCByZWFkX2ludF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIvKiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MqLykKIHsKIAlpbnQJCXN0YXR1cyA9IHVyYi0+c3RhdHVzOwotCXN0cnVjdCBiY21faW50ZXJmYWNlX2FkYXB0ZXIgKnBzSW50ZkFkYXB0ZXIgPSAoc3RydWN0IGJjbV9pbnRlcmZhY2VfYWRhcHRlciAqKXVyYi0+Y29udGV4dDsKLQlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciA9IHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciA7CisJc3RydWN0IGJjbV9pbnRlcmZhY2VfYWRhcHRlciAqcHNJbnRmQWRhcHRlciA9CisJCShzdHJ1Y3QgYmNtX2ludGVyZmFjZV9hZGFwdGVyICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyID0gcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyOwogCiAJaWYgKG5ldGlmX21zZ19pbnRyKEFkYXB0ZXIpKQogCQlwcl9pbmZvKFBGWCAiJXM6IGludGVycnVwdCBzdGF0dXMgJWRcbiIsCi0JCQlBZGFwdGVyLT5kZXYtPm5hbWUsIHN0YXR1cyk7CisJCQkJQWRhcHRlci0+ZGV2LT5uYW1lLCBzdGF0dXMpOwogCi0JaWYoQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQgPT0gVFJVRSkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgSU5URl9JTklULCBEQkdfTFZMX0FMTCwiRGV2aWNlIGhhcyBHb3QgUmVtb3ZlZC4iKTsKLQkJcmV0dXJuIDsKKwlpZiAoQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgSU5URl9JTklULAorCQkJCURCR19MVkxfQUxMLCAiRGV2aWNlIGhhcyBHb3QgUmVtb3ZlZC4iKTsKKwkJcmV0dXJuOwogCX0KIAotCWlmKCgoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSAmJiAoQWRhcHRlci0+YkRvU3VzcGVuZCA9PSBUUlVFKSkgfHwKLQkJcHNJbnRmQWRhcHRlci0+YlN1c3BlbmRlZCB8fAotCQlwc0ludGZBZGFwdGVyLT5iUHJlcGFyaW5nRm9yQnVzU3VzcGVuZCkKLQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsIkludGVycnVwdCBjYWxsIGJhY2sgaXMgY2FsbGVkIHdoaWxlIHN1c3BlbmRpbmcgdGhlIGRldmljZSIpOwotCQkJcmV0dXJuIDsKKwlpZiAoKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgJiYgQWRhcHRlci0+YkRvU3VzcGVuZCkgfHwKKwkJCXBzSW50ZkFkYXB0ZXItPmJTdXNwZW5kZWQgfHwKKwkJCXBzSW50ZkFkYXB0ZXItPmJQcmVwYXJpbmdGb3JCdXNTdXNwZW5kKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwKKwkJCQlEQkdfTFZMX0FMTCwKKwkJCQkiSW50ZXJydXB0IGNhbGwgYmFjayBpcyBjYWxsZWQgd2hpbGUgc3VzcGVuZGluZyB0aGUgZGV2aWNlIik7CisJCXJldHVybjsKIAl9CiAKLQkvL0JDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBORVhUX1NFTkQsIERCR19MVkxfQUxMLCAiaW50ZXJydXB0IHVyYiBzdGF0dXMgJWQiLCBzdGF0dXMpOwogCXN3aXRjaCAoc3RhdHVzKSB7Ci0JICAgIC8qIHN1Y2Nlc3MgKi8KLQkgICAgY2FzZSBTVEFUVVNfU1VDQ0VTUzoKLQkJaWYgKCB1cmItPmFjdHVhbF9sZW5ndGggKQotCQl7CisJLyogc3VjY2VzcyAqLworCWNhc2UgU1RBVFVTX1NVQ0NFU1M6CisJCWlmICh1cmItPmFjdHVhbF9sZW5ndGgpIHsKIAotCQkJaWYocHNJbnRmQWRhcHRlci0+dWxJbnRlcnJ1cHREYXRhWzFdICYgMHhGRikKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsICJHb3QgVVNJTSBpbnRlcnJ1cHQiKTsKKwkJCWlmIChwc0ludGZBZGFwdGVyLT51bEludGVycnVwdERhdGFbMV0gJiAweEZGKSB7CisJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKKwkJCQkJCUlOVEZfSU5JVCwgREJHX0xWTF9BTEwsCisJCQkJCQkiR290IFVTSU0gaW50ZXJydXB0Iik7CiAJCQl9CiAKLQkJCWlmKHBzSW50ZkFkYXB0ZXItPnVsSW50ZXJydXB0RGF0YVsxXSAmIDB4RkYwMCkKLQkJCXsKKwkJCWlmIChwc0ludGZBZGFwdGVyLT51bEludGVycnVwdERhdGFbMV0gJiAweEZGMDApIHsKIAkJCQlhdG9taWNfc2V0KCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYywKLQkJCQkJKHBzSW50ZkFkYXB0ZXItPnVsSW50ZXJydXB0RGF0YVsxXSAmIDB4RkYwMCkgPj4gOCk7Ci0JCQkJYXRvbWljX3NldCAoJkFkYXB0ZXItPnVpTUJ1cGRhdGUsIFRSVUUpOwotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgSU5URl9JTklULCBEQkdfTFZMX0FMTCwgIlRYIG1haWxib3ggY29udGFpbnMgJWQiLAorCQkJCQkocHNJbnRmQWRhcHRlci0+dWxJbnRlcnJ1cHREYXRhWzFdICYKKwkJCQkJIDB4RkYwMCkgPj4gOCk7CisJCQkJYXRvbWljX3NldCgmQWRhcHRlci0+dWlNQnVwZGF0ZSwgVFJVRSk7CisJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKKwkJCQkJSU5URl9JTklULCBEQkdfTFZMX0FMTCwKKwkJCQkJIlRYIG1haWxib3ggY29udGFpbnMgJWQiLAogCQkJCQlhdG9taWNfcmVhZCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MpKTsKIAkJCX0KLQkJCWlmKHBzSW50ZkFkYXB0ZXItPnVsSW50ZXJydXB0RGF0YVsxXSA+PiAxNikKLQkJCXsKLQkJCQlBZGFwdGVyLT5DdXJyTnVtUmVjdkRlc2NzPQorCQkJaWYgKHBzSW50ZkFkYXB0ZXItPnVsSW50ZXJydXB0RGF0YVsxXSA+PiAxNikgeworCQkJCUFkYXB0ZXItPkN1cnJOdW1SZWN2RGVzY3MgPQogCQkJCQkocHNJbnRmQWRhcHRlci0+dWxJbnRlcnJ1cHREYXRhWzFdICA+PiAxNik7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsIERCR19MVkxfQUxMLCJSWCBtYWlsYm94IGNvbnRhaW5zICVkIiwKLQkJCQkJQWRhcHRlci0+Q3Vyck51bVJlY3ZEZXNjcyk7CisJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKKwkJCQkJCUlOVEZfSU5JVCwgREJHX0xWTF9BTEwsCisJCQkJCQkiUlggbWFpbGJveCBjb250YWlucyAlZCIsCisJCQkJCQlBZGFwdGVyLT5DdXJyTnVtUmVjdkRlc2NzKTsKIAkJCQlJbnRlcmZhY2VSeChwc0ludGZBZGFwdGVyKTsKIAkJCX0KLQkJCWlmKEFkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUgJiYKKwkJCWlmIChBZGFwdGVyLT5md19kb3dubG9hZF9kb25lICYmCiAJCQkJIUFkYXB0ZXItPmRvd25sb2FkRERSICYmCi0JCQkJYXRvbWljX3JlYWQoJkFkYXB0ZXItPkN1cnJOdW1GcmVlVHhEZXNjKSkKLQkJCXsKLQkJCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmRvd25sb2FkRERSICs9MTsKKwkJCQlhdG9taWNfcmVhZCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MpKSB7CisKKwkJCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmRvd25sb2FkRERSICs9IDE7CiAJCQkJd2FrZV91cCgmQWRhcHRlci0+dHhfcGFja2V0X3dhaXRfcXVldWUpOwogCQkJfQotCQkJaWYoZmFsc2UgPT0gQWRhcHRlci0+d2FpdGluZ190b19md19kb3dubG9hZF9kb25lKQotCQkJeworCQkJaWYgKCFBZGFwdGVyLT53YWl0aW5nX3RvX2Z3X2Rvd25sb2FkX2RvbmUpIHsKIAkJCQlBZGFwdGVyLT53YWl0aW5nX3RvX2Z3X2Rvd25sb2FkX2RvbmUgPSBUUlVFOwogCQkJCXdha2VfdXAoJkFkYXB0ZXItPmlvY3RsX2Z3X2RubGRfd2FpdF9xdWV1ZSk7CiAJCQl9Ci0JCQlpZighYXRvbWljX3JlYWQoJkFkYXB0ZXItPlR4UGt0QXZhaWwpKQotCQkJeworCQkJaWYgKCFhdG9taWNfcmVhZCgmQWRhcHRlci0+VHhQa3RBdmFpbCkpIHsKIAkJCQlhdG9taWNfc2V0KCZBZGFwdGVyLT5UeFBrdEF2YWlsLCAxKTsKIAkJCQl3YWtlX3VwKCZBZGFwdGVyLT50eF9wYWNrZXRfd2FpdF9xdWV1ZSk7CiAJCQl9Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsIkZpcmluZyBpbnRlcnJ1cHQgaW4gVVJCIik7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsCisJCQkJCURCR19MVkxfQUxMLCAiRmlyaW5nIGludGVycnVwdCBpbiBVUkIiKTsKIAkJfQogCQlicmVhazsKLQkJY2FzZSAtRU5PRU5UIDoKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsIERCR19MVkxfQUxMLCJVUkIgaGFzIGdvdCBkaXNjb25uZWN0ZWQgLi4uLiIpOwotCQkJcmV0dXJuIDsKLQkJfQotCQljYXNlIC1FSU5QUk9HUkVTUzoKLQkJewotCQkJLy9UaGlzIHNpdHVhdGlvbiBtYXkgaGFwcGVuZWQgd2hlbiBVUkJ1bmxpbmsgaXMgdXNlZC4gZm9yIGRldGFpbCBjaGVjayB1c2JfdW5saW5rX3VyYiBkb2N1bWVudGF0aW9uLgotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsIERCR19MVkxfQUxMLCJJbXBvc3NpYmUgY29uZGl0aW9uIGhhcyBvY2N1cnJlZC4uLiBzb21ldGhpbmcgdmVyeSBiYWQgaXMgZ29pbmcgb24iKTsKLQkJCWJyZWFrIDsKLQkJCS8vcmV0dXJuOwotCQl9Ci0JCWNhc2UgLUVQSVBFOgotCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsIERCR19MVkxfQUxMLCJJbnRlcnJ1cHQgSU4gZW5kUG9pbnQgIGhhcyBnb3QgaGFsdGVkL3N0YWxsZWQuLi5uZWVkIHRvIGNsZWFyIHRoaXMiKTsKLQkJCQlBZGFwdGVyLT5iRW5kUG9pbnRIYWx0ZWQgPSBUUlVFIDsKLQkJCQl3YWtlX3VwKCZBZGFwdGVyLT50eF9wYWNrZXRfd2FpdF9xdWV1ZSk7Ci0JCQkJdXJiLT5zdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUyA7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JICAgIC8qIHNvZnR3YXJlLWRyaXZlbiBpbnRlcmZhY2Ugc2h1dGRvd24gKi8KLQkgICAgY2FzZSAtRUNPTk5SRVNFVDogLy9VUkIgZ290IHVubGlua2VkLgotCSAgICBjYXNlIC1FU0hVVERPV046CQkvLyBoYXJkd2FyZSBnb25lLiB0aGlzIGlzIHRoZSBzZXJpb3VzIHByb2JsZW0uCi0JICAgIAkJCQkJCS8vT2NjdXJzIG9ubHkgd2hlbiBzb21ldGhpbmcgaGFwcGVucyB3aXRoIHRoZSBob3N0IGNvbnRyb2xsZXIgZGV2aWNlCi0JICAgIGNhc2UgLUVOT0RFViA6IC8vRGV2aWNlIGdvdCByZW1vdmVkCi0JCWNhc2UgLUVJTlZBTCA6IC8vU29tZSB0aGluZyB2ZXJ5IGJhZCBoYXBwZW5lZCB3aXRoIHRoZSBVUkIuIE5vIGRlc2NyaXB0aW9uIGlzIGF2YWlsYWJsZS4KLQkgICAgCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgSU5URl9JTklULCBEQkdfTFZMX0FMTCwiaW50ZXJydXB0IHVyYiBlcnJvciAlZCIsIHN0YXR1cyk7Ci0JCQl1cmItPnN0YXR1cyA9IFNUQVRVU19TVUNDRVNTIDsKLQkJCWJyZWFrIDsKLQkJCS8vcmV0dXJuOwotCSAgICBkZWZhdWx0OgotCQkJLy9UaGlzIGlzIHJlcXVpcmVkIHRvIGNoZWNrIHdoYXQgaXMgdGhlIGRlZmF1bHRzIGNvbmRpdGlvbnMgd2hlbiBpdCBvY2N1cnMuLgotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIE5FWFRfU0VORCwgREJHX0xWTF9BTEwsIkdPVCBERUZBVUxUIElOVEVSUlVQVCBVUkIgU1RBVFVTIDolZC4uUGxlYXNlIEFuYWx5emUgaXQuLi4iLCBzdGF0dXMpOworCWNhc2UgLUVOT0VOVDoKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgSU5URl9JTklULAorCQkJCURCR19MVkxfQUxMLCAiVVJCIGhhcyBnb3QgZGlzY29ubmVjdGVkLi4uLiIpOworCQlyZXR1cm47CisJY2FzZSAtRUlOUFJPR1JFU1M6CisJCS8qCisJCSAqIFRoaXMgc2l0dWF0aW9uIG1heSBoYXBwZW5lZCB3aGVuIFVSQnVubGluayBpcyB1c2VkLiAgZm9yCisJCSAqIGRldGFpbCBjaGVjayB1c2JfdW5saW5rX3VyYiBkb2N1bWVudGF0aW9uLgorCQkgKi8KKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgSU5URl9JTklULAorCQkJCURCR19MVkxfQUxMLAorCQkJCSJJbXBvc3NpYmUgY29uZGl0aW9uIGhhcyBvY2N1cnJlZC4uLiBzb21ldGhpbmcgdmVyeSBiYWQgaXMgZ29pbmcgb24iKTsKKwkJYnJlYWs7CisJCS8qIHJldHVybjsgKi8KKwljYXNlIC1FUElQRToKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgSU5URl9JTklULAorCQkJCURCR19MVkxfQUxMLAorCQkJCSJJbnRlcnJ1cHQgSU4gZW5kUG9pbnQgaGFzIGdvdCBoYWx0ZWQvc3RhbGxlZC4uLm5lZWQgdG8gY2xlYXIgdGhpcyIpOworCQlBZGFwdGVyLT5iRW5kUG9pbnRIYWx0ZWQgPSBUUlVFOworCQl3YWtlX3VwKCZBZGFwdGVyLT50eF9wYWNrZXRfd2FpdF9xdWV1ZSk7CisJCXVyYi0+c3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJCXJldHVybjsKKwkvKiBzb2Z0d2FyZS1kcml2ZW4gaW50ZXJmYWNlIHNodXRkb3duICovCisJY2FzZSAtRUNPTk5SRVNFVDoJLyogVVJCIGdvdCB1bmxpbmtlZCAqLworCWNhc2UgLUVTSFVURE9XTjoJLyogaGFyZHdhcmUgZ29uZS4gdGhpcyBpcyB0aGUgc2VyaW91cyBwcm9ibGVtICovCisJCS8qCisJCSAqIE9jY3VycyBvbmx5IHdoZW4gc29tZXRoaW5nIGhhcHBlbnMgd2l0aCB0aGUKKwkJICogaG9zdCBjb250cm9sbGVyIGRldmljZQorCQkgKi8KKwljYXNlIC1FTk9ERVY6IC8qIERldmljZSBnb3QgcmVtb3ZlZCAqLworCWNhc2UgLUVJTlZBTDoKKwkJLyoKKwkJICogU29tZSB0aGluZyB2ZXJ5IGJhZCBoYXBwZW5lZCB3aXRoIHRoZSBVUkIuIE5vCisJCSAqIGRlc2NyaXB0aW9uIGlzIGF2YWlsYWJsZS4KKwkJICovCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwKKwkJCQlEQkdfTFZMX0FMTCwgImludGVycnVwdCB1cmIgZXJyb3IgJWQiLCBzdGF0dXMpOworCQl1cmItPnN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCQlicmVhazsKKwkJLyogcmV0dXJuOyAqLworCWRlZmF1bHQ6CisJCS8qCisJCSAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gY2hlY2sgd2hhdCBpcyB0aGUgZGVmYXVsdHMgY29uZGl0aW9ucworCQkgKiB3aGVuIGl0IG9jY3Vycy4uCisJCSAqLworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIE5FWFRfU0VORCwgREJHX0xWTF9BTEwsCisJCQkJIkdPVCBERUZBVUxUIElOVEVSUlVQVCBVUkIgU1RBVFVTIDolZC4uUGxlYXNlIEFuYWx5emUgaXQuLi4iLAorCQkJCXN0YXR1cyk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTE3LDI4ICsxMzUsMzAgQEAKIGludCBDcmVhdGVJbnRlcnJ1cHRVcmIoc3RydWN0IGJjbV9pbnRlcmZhY2VfYWRhcHRlciAqcHNJbnRmQWRhcHRlcikKIHsKIAlwc0ludGZBZGFwdGVyLT5wc0ludGVycnVwdFVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwc0ludGZBZGFwdGVyLT5wc0ludGVycnVwdFVyYikKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsIERCR19MVkxfQUxMLCJDYW5ub3QgYWxsb2NhdGUgaW50ZXJydXB0IHVyYiIpOworCWlmICghcHNJbnRmQWRhcHRlci0+cHNJbnRlcnJ1cHRVcmIpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAorCQkJCUlOVEZfSU5JVCwgREJHX0xWTF9BTEwsCisJCQkJIkNhbm5vdCBhbGxvY2F0ZSBpbnRlcnJ1cHQgdXJiIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlwc0ludGZBZGFwdGVyLT5wc0ludGVycnVwdFVyYi0+dHJhbnNmZXJfYnVmZmVyID0KLQkJCQkJCQkJcHNJbnRmQWRhcHRlci0+dWxJbnRlcnJ1cHREYXRhOworCQlwc0ludGZBZGFwdGVyLT51bEludGVycnVwdERhdGE7CiAJcHNJbnRmQWRhcHRlci0+cHNJbnRlcnJ1cHRVcmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPQotCQkJCQkJCXNpemVvZihwc0ludGZBZGFwdGVyLT51bEludGVycnVwdERhdGEpOworCQlzaXplb2YocHNJbnRmQWRhcHRlci0+dWxJbnRlcnJ1cHREYXRhKTsKIAogCXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX3BpcGUgPSB1c2JfcmN2aW50cGlwZShwc0ludGZBZGFwdGVyLT51ZGV2LAotCQkJCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fZW5kcG9pbnRBZGRyKTsKKwkJCXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2VuZHBvaW50QWRkcik7CiAKIAl1c2JfZmlsbF9pbnRfdXJiKHBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiLCBwc0ludGZBZGFwdGVyLT51ZGV2LAotCQkJCQlwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9waXBlLAotCQkJCQlwc0ludGZBZGFwdGVyLT5wc0ludGVycnVwdFVyYi0+dHJhbnNmZXJfYnVmZmVyLAotCQkJCQlwc0ludGZBZGFwdGVyLT5wc0ludGVycnVwdFVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKLQkJCQkJcmVhZF9pbnRfY2FsbGJhY2ssIHBzSW50ZkFkYXB0ZXIsCi0JCQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2ludGVydmFsKTsKKwkJCXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX3BpcGUsCisJCQlwc0ludGZBZGFwdGVyLT5wc0ludGVycnVwdFVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJcHNJbnRmQWRhcHRlci0+cHNJbnRlcnJ1cHRVcmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCisJCQlyZWFkX2ludF9jYWxsYmFjaywgcHNJbnRmQWRhcHRlciwKKwkJCXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2ludGVydmFsKTsKIAotCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsIERCR19MVkxfQUxMLCJJbnRlcnJ1cHQgSW50ZXJ2YWw6ICVkXG4iLAotCQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2ludGVydmFsKTsKKwlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwKKwkJCURCR19MVkxfQUxMLCAiSW50ZXJydXB0IEludGVydmFsOiAlZFxuIiwKKwkJCXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2ludGVydmFsKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ3LDE5ICsxNjcsMjAgQEAKIHsKIAlJTlQgc3RhdHVzID0gMDsKIAotCWlmKCBmYWxzZSA9PSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmRldmljZV9yZW1vdmVkICYmCi0JCWZhbHNlID09IHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+YkVuZFBvaW50SGFsdGVkICYmCi0JCWZhbHNlID09IHBzSW50ZkFkYXB0ZXItPmJTdXNwZW5kZWQgJiYKLQkJZmFsc2UgPT0gcHNJbnRmQWRhcHRlci0+YlByZXBhcmluZ0ZvckJ1c1N1c3BlbmQgJiYKLQkJZmFsc2UgPT0gcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5TdG9wQWxsWGFjdGlvbikKLQl7Ci0JCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiLCBHRlBfQVRPTUlDKTsKLQkJaWYgKHN0YXR1cykKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsIkNhbm5vdCBzZW5kIGludCB1cmIgJWRcbiIsIHN0YXR1cyk7Ci0JCQlpZihzdGF0dXMgPT0gLUVQSVBFKQotCQkJewotCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+YkVuZFBvaW50SGFsdGVkID0gVFJVRSA7CisJaWYgKCEocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCB8fAorCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+YkVuZFBvaW50SGFsdGVkIHx8CisJCQkJcHNJbnRmQWRhcHRlci0+YlN1c3BlbmRlZCB8fAorCQkJCXBzSW50ZkFkYXB0ZXItPmJQcmVwYXJpbmdGb3JCdXNTdXNwZW5kIHx8CisJCQkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5TdG9wQWxsWGFjdGlvbikpIHsKKwkJc3RhdHVzID0KKwkJCXVzYl9zdWJtaXRfdXJiKHBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHN0YXR1cykgeworCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsIERCR19MVkxfQUxMLAorCQkJCQkiQ2Fubm90IHNlbmQgaW50dXJiICVkXG4iLCBzdGF0dXMpOworCQkJaWYgKHN0YXR1cyA9PSAtRVBJUEUpIHsKKwkJCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmJFbmRQb2ludEhhbHRlZCA9CisJCQkJCVRSVUU7CiAJCQkJd2FrZV91cCgmcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT50eF9wYWNrZXRfd2FpdF9xdWV1ZSk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vUW9zLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1Fvcy5jCmluZGV4IDA3Mjc1OTkuLjRmMzE1ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vUW9zLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9Rb3MuYwpAQCAtMjIyLDEwICsyMjIsNyBAQAogCiAJCS8vQ2hlY2tpbmcgY2xhc3NpZmllciB2YWxpZGl0eQogCQlpZiAoIXBzdENsYXNzaWZpZXJSdWxlLT5iVXNlZCB8fCBwc3RDbGFzc2lmaWVyUnVsZS0+dWNEaXJlY3Rpb24gPT0gRE9XTkxJTktfRElSKQotCQl7Ci0JCQliQ2xhc3NpZmljYXRpb25TdWNjZWVkID0gZmFsc2U7CiAJCQlicmVhazsKLQkJfQogCiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgSVBWNF9EQkcsIERCR19MVkxfQUxMLCAiaXMgSVB2NiBjaGVjayEiKTsKIAkJaWYgKHBzdENsYXNzaWZpZXJSdWxlLT5iSXB2NlByb3RvY29sKQpAQCAtMjMzLDUxICsyMzAsNDcgQEAKIAogCQkvLyoqKioqKioqKioqKioqQ2hlY2tpbmcgSVAgaGVhZGVyIHBhcmFtZXRlcioqKioqKioqKioqKioqKioqKioqKioqKioqLy8KIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1RYLCBJUFY0X0RCRywgREJHX0xWTF9BTEwsICJUcnlpbmcgdG8gbWF0Y2ggU291cmNlIElQIEFkZHJlc3MiKTsKLQkJaWYgKGZhbHNlID09IChiQ2xhc3NpZmljYXRpb25TdWNjZWVkID0KLQkJCU1hdGNoU3JjSXBBZGRyZXNzKHBzdENsYXNzaWZpZXJSdWxlLCBpcGhkLT5zYWRkcikpKQorCQlpZiAoIU1hdGNoU3JjSXBBZGRyZXNzKHBzdENsYXNzaWZpZXJSdWxlLCBpcGhkLT5zYWRkcikpCiAJCQlicmVhazsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1RYLCBJUFY0X0RCRywgREJHX0xWTF9BTEwsICJTb3VyY2UgSVAgQWRkcmVzcyBNYXRjaGVkIik7CiAKLQkJaWYgKGZhbHNlID09IChiQ2xhc3NpZmljYXRpb25TdWNjZWVkID0KLQkJCU1hdGNoRGVzdElwQWRkcmVzcyhwc3RDbGFzc2lmaWVyUnVsZSwgaXBoZC0+ZGFkZHIpKSkKKwkJaWYgKCFNYXRjaERlc3RJcEFkZHJlc3MocHN0Q2xhc3NpZmllclJ1bGUsIGlwaGQtPmRhZGRyKSkKIAkJCWJyZWFrOwogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIElQVjRfREJHLCBEQkdfTFZMX0FMTCwgIkRlc3RpbmF0aW9uIElQIEFkZHJlc3MgTWF0Y2hlZCIpOwogCi0JCWlmIChmYWxzZSA9PSAoYkNsYXNzaWZpY2F0aW9uU3VjY2VlZCA9Ci0JCQlNYXRjaFRvcyhwc3RDbGFzc2lmaWVyUnVsZSwgaXBoZC0+dG9zKSkpCi0JCXsKKwkJaWYgKCFNYXRjaFRvcyhwc3RDbGFzc2lmaWVyUnVsZSwgaXBoZC0+dG9zKSkgewogCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1RYLCBJUFY0X0RCRywgREJHX0xWTF9BTEwsICJUT1MgTWF0Y2ggZmFpbGVkXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgSVBWNF9EQkcsIERCR19MVkxfQUxMLCAiVE9TIE1hdGNoZWQiKTsKIAotCQlpZiAoZmFsc2UgPT0gKGJDbGFzc2lmaWNhdGlvblN1Y2NlZWQgPQotCQkJTWF0Y2hQcm90b2NvbChwc3RDbGFzc2lmaWVyUnVsZSwgaXBoZC0+cHJvdG9jb2wpKSkKKwkJaWYgKCFNYXRjaFByb3RvY29sKHBzdENsYXNzaWZpZXJSdWxlLCBpcGhkLT5wcm90b2NvbCkpCiAJCQlicmVhazsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1RYLCBJUFY0X0RCRywgREJHX0xWTF9BTEwsICJQcm90b2NvbCBNYXRjaGVkIik7CiAKIAkJLy9pZiBwcm90b2NvbCBpcyBub3QgVENQIG9yIFVEUCB0aGVuIG5vIG5lZWQgb2YgY29tcGFyaW5nIHNvdXJjZSBwb3J0IGFuZCBkZXN0aW5hdGlvbiBwb3J0Ci0JCWlmIChpcGhkLT5wcm90b2NvbCAhPSBUQ1AgJiYgaXBoZC0+cHJvdG9jb2wgIT0gVURQKQorCQlpZiAoaXBoZC0+cHJvdG9jb2wgIT0gVENQICYmIGlwaGQtPnByb3RvY29sICE9IFVEUCkgeworCQkJYkNsYXNzaWZpY2F0aW9uU3VjY2VlZCA9IFRSVUU7CiAJCQlicmVhazsKKwkJfQogCQkvLyoqKioqKioqKioqKioqKioqKkNoZWNraW5nIFRyYW5zcG9ydCBMYXllciBIZWFkZXIgZmllbGQgaWYgcHJlc2VudCAqKioqKioqKioqKioqKioqKi8vCiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgSVBWNF9EQkcsIERCR19MVkxfQUxMLCAiU291cmNlIFBvcnQgJTA0eCIsCiAJCQkoaXBoZC0+cHJvdG9jb2wgPT0gVURQKSA/IHhwcnRfaGRyLT51aGRyLnNvdXJjZSA6IHhwcnRfaGRyLT50aGRyLnNvdXJjZSk7CiAKLQkJaWYgKGZhbHNlID09IChiQ2xhc3NpZmljYXRpb25TdWNjZWVkID0KLQkJCU1hdGNoU3JjUG9ydChwc3RDbGFzc2lmaWVyUnVsZSwKLQkJCQludG9ocygoaXBoZC0+cHJvdG9jb2wgPT0gVURQKSA/Ci0JCQkJeHBydF9oZHItPnVoZHIuc291cmNlIDogeHBydF9oZHItPnRoZHIuc291cmNlKSkpKQorCQlpZiAoIU1hdGNoU3JjUG9ydChwc3RDbGFzc2lmaWVyUnVsZSwKKwkJCQkgIG50b2hzKChpcGhkLT5wcm90b2NvbCA9PSBVRFApID8KKwkJCQkgIHhwcnRfaGRyLT51aGRyLnNvdXJjZSA6IHhwcnRfaGRyLT50aGRyLnNvdXJjZSkpKQogCQkJYnJlYWs7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgSVBWNF9EQkcsIERCR19MVkxfQUxMLCAiU3JjIFBvcnQgTWF0Y2hlZCIpOwogCiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgSVBWNF9EQkcsIERCR19MVkxfQUxMLCAiRGVzdGluYXRpb24gUG9ydCAlMDR4IiwKIAkJCShpcGhkLT5wcm90b2NvbCA9PSBVRFApID8geHBydF9oZHItPnVoZHIuZGVzdCA6CiAJCQl4cHJ0X2hkci0+dGhkci5kZXN0KTsKLQkJaWYgKGZhbHNlID09IChiQ2xhc3NpZmljYXRpb25TdWNjZWVkID0KLQkJCU1hdGNoRGVzdFBvcnQocHN0Q2xhc3NpZmllclJ1bGUsCi0JCQludG9ocygoaXBoZC0+cHJvdG9jb2wgPT0gVURQKSA/Ci0JCQl4cHJ0X2hkci0+dWhkci5kZXN0IDogeHBydF9oZHItPnRoZHIuZGVzdCkpKSkKKwkJaWYgKCFNYXRjaERlc3RQb3J0KHBzdENsYXNzaWZpZXJSdWxlLAorCQkJCSAgIG50b2hzKChpcGhkLT5wcm90b2NvbCA9PSBVRFApID8KKwkJCQkgICB4cHJ0X2hkci0+dWhkci5kZXN0IDogeHBydF9oZHItPnRoZHIuZGVzdCkpKQogCQkJYnJlYWs7CisJCWJDbGFzc2lmaWNhdGlvblN1Y2NlZWQgPSBUUlVFOwogCX0gd2hpbGUgKDApOwogCiAJaWYgKFRSVUUgPT0gYkNsYXNzaWZpY2F0aW9uU3VjY2VlZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vVHlwZWRlZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vVHlwZWRlZnMuaAppbmRleCA4MzJhZGNmLi45MGIzYjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL1R5cGVkZWZzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9UeXBlZGVmcy5oCkBAIC0yNSwxNiArMjUsMTYgQEAKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBVTE9ORzsKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBEV09SRDsKIAotdHlwZWRlZiBjaGFyKiBQQ0hBUjsKLXR5cGVkZWYgc2hvcnQqIFBTSE9SVDsKLXR5cGVkZWYgaW50KiBQSU5UOwotdHlwZWRlZiBsb25nKiBQTE9ORzsKLXR5cGVkZWYgdm9pZCogUFZPSUQ7Cit0eXBlZGVmIGNoYXIgKlBDSEFSOwordHlwZWRlZiBzaG9ydCAqUFNIT1JUOwordHlwZWRlZiBpbnQgKlBJTlQ7Cit0eXBlZGVmIGxvbmcgKlBMT05HOwordHlwZWRlZiB2b2lkICpQVk9JRDsKIAotdHlwZWRlZiB1bnNpZ25lZCBjaGFyKiBQVUNIQVI7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0KiBQVVNIT1JUOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQqIFBVSU5UOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nKiBQVUxPTkc7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgKlBVQ0hBUjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgKlBVU0hPUlQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAqUFVJTlQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgKlBVTE9ORzsKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIFVMT05HNjQ7CiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBMQVJHRV9JTlRFR0VSOwogdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDMyOwpAQCAtNDMsNSArNDMsNSBAQAogI2VuZGlmCiAKIAotI2VuZGlmCS8vX19UWVBFREVGU19IX18KKyNlbmRpZgkvKiBfX1RZUEVERUZTX0hfXyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL2hlYWRlcnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vaGVhZGVycy5oCmluZGV4IDdmZDIxYzYuLjZmMzI3MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vaGVhZGVycy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vaGVhZGVycy5oCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CiAjaW5jbHVkZSA8bGludXgvdWRwLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAKICNpbmNsdWRlICJUeXBlZGVmcy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9ob3N0bWlicy5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9ob3N0bWlicy5jCmluZGV4IGY1NTMwMGQuLjM5YWNlNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vaG9zdG1pYnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL2hvc3RtaWJzLmMKQEAgLTI3LDkgKzI3LDkgQEAKIAkvKiBDb3B5IHRoZSBjbGFzc2lmaWVyIFRhYmxlICovCiAJZm9yIChuQ2xhc3NpZmllckluZGV4ID0gMDsgbkNsYXNzaWZpZXJJbmRleCA8IE1BWF9DTEFTU0lGSUVSUzsgbkNsYXNzaWZpZXJJbmRleCsrKSB7CiAJCWlmIChBZGFwdGVyLT5hc3RDbGFzc2lmaWVyVGFibGVbbkNsYXNzaWZpZXJJbmRleF0uYlVzZWQgPT0gVFJVRSkKLQkJCW1lbWNweSgoUFZPSUQpICYgcHN0SG9zdE1pYnMtPgorCQkJbWVtY3B5KChQVk9JRCkgJnBzdEhvc3RNaWJzLT4KIAkJCSAgICAgICBhc3RDbGFzc2lmaWVyVGFibGVbbkNsYXNzaWZpZXJJbmRleF0sCi0JCQkgICAgICAgKFBWT0lEKSAmIEFkYXB0ZXItPgorCQkJICAgICAgIChQVk9JRCkgJkFkYXB0ZXItPgogCQkJICAgICAgIGFzdENsYXNzaWZpZXJUYWJsZVtuQ2xhc3NpZmllckluZGV4XSwKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJjbV9taWJzX2NsYXNzaWZpZXJfcnVsZSkpOwogCX0KQEAgLTM3LDggKzM3LDggQEAKIAkvKiBDb3B5IHRoZSBTRiBUYWJsZSAqLwogCWZvciAoblNmSW5kZXggPSAwOyBuU2ZJbmRleCA8IE5PX09GX1FVRVVFUzsgblNmSW5kZXgrKykgewogCQlpZiAoQWRhcHRlci0+UGFja0luZm9bblNmSW5kZXhdLmJWYWxpZCkgewotCQkJbWVtY3B5KChQVk9JRCkgJiBwc3RIb3N0TWlicy0+YXN0U0Z0YWJsZVtuU2ZJbmRleF0sCi0JCQkgICAgICAgKFBWT0lEKSAmIEFkYXB0ZXItPlBhY2tJbmZvW25TZkluZGV4XSwKKwkJCW1lbWNweSgoUFZPSUQpICZwc3RIb3N0TWlicy0+YXN0U0Z0YWJsZVtuU2ZJbmRleF0sCisJCQkgICAgICAgKFBWT0lEKSAmQWRhcHRlci0+UGFja0luZm9bblNmSW5kZXhdLAogCQkJCXNpemVvZihzdHJ1Y3QgYmNtX21pYnNfdGFibGUpKTsKIAkJfSBlbHNlIHsKIAkJCS8qIElmIGluZGV4IGluIG5vdCB2YWxpZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vbnZtLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL252bS5jCmluZGV4IGZjYTE2NGYuLjYzYmUzYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vbnZtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9udm0uYwpAQCAtMTIyLDcgKzEyMiw3IEBACiAgKgkJT1NBTF9TVEFUVVNfQ09ERToKICAqLwogCi1pbnQgUmVhZEJlY2VlbUVFUFJPTUJ1bGsoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsCitzdGF0aWMgaW50IFJlYWRCZWNlZW1FRVBST01CdWxrKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLAogCQkJRFdPUkQgZHdBZGRyZXNzLAogCQkJRFdPUkQgKnBkd0RhdGEsCiAJCQlEV09SRCBkd051bVdvcmRzKQpAQCAtMjY5OCw3ICsyNjk4LDcgQEAKICAqIE9uIEZhaWx1cmUgLXJldHVybnMgU1RBVFVTX0ZBSUxVUkUKICAqLwogCi1pbnQgQmNtR2V0U2VjdGlvblZhbEVuZE9mZnNldChzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBlRmxhc2gyeFNlY3Rpb25WYWwpCitzdGF0aWMgaW50IEJjbUdldFNlY3Rpb25WYWxFbmRPZmZzZXQoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIGVudW0gYmNtX2ZsYXNoMnhfc2VjdGlvbl92YWwgZUZsYXNoMnhTZWN0aW9uVmFsKQogewogCWludCBTZWN0RW5kT2Zmc2V0ID0gMDsKIApAQCAtMjk4MCw3ICsyOTgwLDcgQEAKICAqCiAgKi8KIAotQl9VSU5UOCBJc09mZnNldFdyaXRhYmxlKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCB1bnNpZ25lZCBpbnQgdWlPZmZzZXQpCitzdGF0aWMgQl9VSU5UOCBJc09mZnNldFdyaXRhYmxlKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCB1bnNpZ25lZCBpbnQgdWlPZmZzZXQpCiB7CiAJdW5zaWduZWQgaW50IHVpU2VjdG9yTnVtID0gMDsKIAl1bnNpZ25lZCBpbnQgdWlXb3JkT2ZTZWN0b3JQZXJtaXNzaW9uID0gMDsKQEAgLTMzNzQsNyArMzM3NCw3IEBACiAJY2FzZSBEU0QyOgogCQlpZiAoUmVhZERTRFNpZ25hdHVyZShBZGFwdGVyLCBlRmxhc2gyeFNlY3RWYWwpID09IERTRF9JTUFHRV9NQUdJQ19OVU1CRVIpIHsKIAkJCUhpZ2hlc3RQcmlEU0QgPSBnZXRIaWdoZXN0UHJpRFNEKEFkYXB0ZXIpOwotCQkJaWYgKChIaWdoZXN0UHJpRFNEID09IGVGbGFzaDJ4U2VjdFZhbCkpIHsKKwkJCWlmIChIaWdoZXN0UHJpRFNEID09IGVGbGFzaDJ4U2VjdFZhbCkgewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsICJHaXZlbiBEU0Q8JXg+IGFscmVhZHkgaGFzIGhpZ2hlc3QgcHJpb3JpdHkiLCBlRmxhc2gyeFNlY3RWYWwpOwogCQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCQkJCWJyZWFrOwpAQCAtMzQwMiw3ICszNDAyLDcgQEAKIAogCQkJCUhpZ2hlc3RQcmlEU0QgPSBnZXRIaWdoZXN0UHJpRFNEKEFkYXB0ZXIpOwogCi0JCQkJaWYgKChIaWdoZXN0UHJpRFNEID09IGVGbGFzaDJ4U2VjdFZhbCkpIHsKKwkJCQlpZiAoSGlnaGVzdFByaURTRCA9PSBlRmxhc2gyeFNlY3RWYWwpIHsKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwgIk1hZGUgdGhlIERTRDogJXggaGlnaGVzdCBieSByZWR1Y2luZyBwcmlvcml0eSBvZiBvdGhlclxuIiwgZUZsYXNoMnhTZWN0VmFsKTsKIAkJCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAJCQkJCWJyZWFrOwpAQCAtMzQyMSw3ICszNDIxLDcgQEAKIAkJCQl9CiAKIAkJCQlIaWdoZXN0UHJpRFNEID0gZ2V0SGlnaGVzdFByaURTRChBZGFwdGVyKTsKLQkJCQlpZiAoKEhpZ2hlc3RQcmlEU0QgPT0gZUZsYXNoMnhTZWN0VmFsKSkgeworCQkJCWlmIChIaWdoZXN0UHJpRFNEID09IGVGbGFzaDJ4U2VjdFZhbCkgewogCQkJCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKIAkJCQkJYnJlYWs7CiAJCQkJfQpAQCAtNDA3NCw3ICs0MDc0LDcgQEAKICAqCUZhaWxsdXJlIDotIFJldHVybiBuZWdhdGl2ZSBlcnJvciBjb2RlCiAgKi8KIAotaW50IFNhdmVIZWFkZXJJZlByZXNlbnQoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIFBVQ0hBUiBwQnVmZiwgdW5zaWduZWQgaW50IHVpT2Zmc2V0KQorc3RhdGljIGludCBTYXZlSGVhZGVySWZQcmVzZW50KHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBQVUNIQVIgcEJ1ZmYsIHVuc2lnbmVkIGludCB1aU9mZnNldCkKIHsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0VG9Qcm90ZWN0ID0gMCwgSGVhZGVyU2l6ZVRvUHJvdGVjdCA9IDA7CiAJYm9vbCBiSGFzSGVhZGVyID0gZmFsc2U7CkBAIC00MjEzLDcgKzQyMTMsNyBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotaW50IFJlYWREU0RTaWduYXR1cmUoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIGVudW0gYmNtX2ZsYXNoMnhfc2VjdGlvbl92YWwgZHNkKQorc3RhdGljIGludCBSZWFkRFNEU2lnbmF0dXJlKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBlbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGRzZCkKIHsKIAl1bnNpZ25lZCBpbnQgdWlEU0RzaWcgPSAwOwogCS8qIHVuc2lnbmVkIGludCBzaWdvZmZzZXRJbk1hcCA9IDA7CkBAIC00MjM4LDcgKzQyMzgsNyBAQAogCXJldHVybiB1aURTRHNpZzsKIH0KIAotaW50IFJlYWREU0RQcmlvcml0eShzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBkc2QpCitzdGF0aWMgaW50IFJlYWREU0RQcmlvcml0eShzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBkc2QpCiB7CiAJLyogdW5zaWduZWQgaW50IHByaU9mZnNldEluTWFwID0gMCA7ICovCiAJdW5zaWduZWQgaW50IHVpRFNEUHJpID0gU1RBVFVTX0ZBSUxVUkU7CkBAIC00MjYxLDcgKzQyNjEsNyBAQAogCXJldHVybiB1aURTRFByaTsKIH0KIAotZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBnZXRIaWdoZXN0UHJpRFNEKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQorc3RhdGljIGVudW0gYmNtX2ZsYXNoMnhfc2VjdGlvbl92YWwgZ2V0SGlnaGVzdFByaURTRChzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKIHsKIAlpbnQgRFNESGlnaGVzdFByaSA9IFNUQVRVU19GQUlMVVJFOwogCWludCBEc2RQcmkgPSAwOwpAQCAtNDI5Myw3ICs0MjkzLDcgQEAKIAlyZXR1cm4gIEhpZ2hlc3RQcmlEU0Q7CiB9CiAKLWludCBSZWFkSVNPU2lnbmF0dXJlKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBlbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGlzbykKK3N0YXRpYyBpbnQgUmVhZElTT1NpZ25hdHVyZShzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBpc28pCiB7CiAJdW5zaWduZWQgaW50IHVpSVNPc2lnID0gMDsKIAkvKiB1bnNpZ25lZCBpbnQgc2lnb2Zmc2V0SW5NYXAgPSAwOwpAQCAtNDMxNiw3ICs0MzE2LDcgQEAKIAlyZXR1cm4gdWlJU09zaWc7CiB9CiAKLWludCBSZWFkSVNPUHJpb3JpdHkoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIGVudW0gYmNtX2ZsYXNoMnhfc2VjdGlvbl92YWwgaXNvKQorc3RhdGljIGludCBSZWFkSVNPUHJpb3JpdHkoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIGVudW0gYmNtX2ZsYXNoMnhfc2VjdGlvbl92YWwgaXNvKQogewogCXVuc2lnbmVkIGludCBJU09QcmkgPSBTVEFUVVNfRkFJTFVSRTsKIAlpZiAoSXNTZWN0aW9uV3JpdGFibGUoQWRhcHRlciwgaXNvKSkgewpAQCAtNDMzNSw3ICs0MzM1LDcgQEAKIAlyZXR1cm4gSVNPUHJpOwogfQogCi1lbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGdldEhpZ2hlc3RQcmlJU08oc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCitzdGF0aWMgZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBnZXRIaWdoZXN0UHJpSVNPKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQogewogCWludCBJU09IaWdoZXN0UHJpID0gU1RBVFVTX0ZBSUxVUkU7CiAJaW50IElTT1ByaSA9IDA7CkBAIC00MzU5LDcgKzQzNTksNyBAQAogCXJldHVybiBIaWdoZXN0UHJpSVNPOwogfQogCi1pbnQgV3JpdGVUb0ZsYXNoV2l0aG91dFNlY3RvckVyYXNlKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLAorc3RhdGljIGludCBXcml0ZVRvRmxhc2hXaXRob3V0U2VjdG9yRXJhc2Uoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsCiAJCQkJUFVJTlQgcEJ1ZmYsCiAJCQkJZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBlRmxhc2gyeFNlY3Rpb25WYWwsCiAJCQkJdW5zaWduZWQgaW50IHVpT2Zmc2V0LApAQCAtNDQ3Miw3ICs0NDcyLDcgQEAKIAlyZXR1cm4gU2VjdGlvblByZXNlbnQ7CiB9CiAKLWludCBJc1NlY3Rpb25Xcml0YWJsZShzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBTZWN0aW9uKQorc3RhdGljIGludCBJc1NlY3Rpb25Xcml0YWJsZShzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBTZWN0aW9uKQogewogCWludCBvZmZzZXQgPSBTVEFUVVNfRkFJTFVSRTsKIAlpbnQgU3RhdHVzID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS9jZWRfaW9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS9jZWRfaW9jLmMKaW5kZXggYmY1MzJiMS4uZWJiYzUwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvY2VkX2lvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL2NlZF9pb2MuYwpAQCAtMzgsOCArMzgsOCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIEZsdXNoT3V0QnVmZihERVZJQ0VfRVhURU5TSU9OICpwZHgpCiB7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGN1cnJlbnRTdGF0ZT0lZCIsIF9fZnVuY19fLAotCQlwZHgtPnNDdXJyZW50U3RhdGUpOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogY3VycmVudFN0YXRlPSVkXG4iLAorCQlfX2Z1bmNfXywgcGR4LT5zQ3VycmVudFN0YXRlKTsKIAlpZiAocGR4LT5zQ3VycmVudFN0YXRlID09IFUxNEVSUl9USU1FKQkvKiBEbyBub3RoaW5nIGlmIGhhcmR3YXJlIGluIHRyb3VibGUgKi8KIAkJcmV0dXJuOwogCS8qIEtpbGwgb2ZmIGFueSBwZW5kaW5nIEkvTyAqLwpAQCAtNTksOCArNTksOCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIEZsdXNoSW5CdWZmKERFVklDRV9FWFRFTlNJT04gKnBkeCkKIHsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgY3VycmVudFN0YXRlPSVkIiwgX19mdW5jX18sCi0JCXBkeC0+c0N1cnJlbnRTdGF0ZSk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBjdXJyZW50U3RhdGU9JWRcbiIsCisJCV9fZnVuY19fLCBwZHgtPnNDdXJyZW50U3RhdGUpOwogCWlmIChwZHgtPnNDdXJyZW50U3RhdGUgPT0gVTE0RVJSX1RJTUUpCS8qIERvIG5vdGhpbmcgaWYgaGFyZHdhcmUgaW4gdHJvdWJsZSAqLwogCQlyZXR1cm47CiAJLyogS2lsbCBvZmYgYW55IHBlbmRpbmcgSS9PICovCkBAIC0xMTgsOCArMTE4LDggQEAKIAogCW11dGV4X2xvY2soJnBkeC0+aW9fbXV0ZXgpOwkvKiAgUHJvdGVjdCBkaXNjb25uZWN0IGZyb20gbmV3IGkvbyAqLwogCWlmIChuID4gMCkgewkJLyogIGRvIG5vdGhpbmcgaWYgbm93dCB0byBkbyEgKi8KLQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIG49JWQ+JXM8IiwgX19mdW5jX18sIG4sCi0JCQlidWZmZXIpOworCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IG49JWQ+JXM8XG4iLAorCQkJX19mdW5jX18sIG4sIGJ1ZmZlcik7CiAJCWlSZXR1cm4gPSBQdXRDaGFycyhwZHgsIGJ1ZmZlciwgbik7CiAJfQogCkBAIC0xMzksNyArMTM5LDcgQEAKIAlpbnQgaVJldHVybjsKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsJLyogIFByb3RlY3QgZGlzY29ubmVjdCBmcm9tIG5ldyBpL28gKi8KIAlpUmV0dXJuID0gUHV0Q2hhcnMocGR4LCAmYywgMSk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIlNlbmRDaGFyID4lYzwgKDB4JTAyeCkiLCBjLCBjKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiU2VuZENoYXIgPiVjPCAoMHglMDJ4KVxuIiwgYywgYyk7CiAJQWxsb3dpKHBkeCk7CS8qICBNYWtlIHN1cmUgY2hhciByZWFkcyBhcmUgcnVubmluZyAqLwogCW11dGV4X3VubG9jaygmcGR4LT5pb19tdXRleCk7CiAJcmV0dXJuIGlSZXR1cm47CkBAIC0xNzQsNyArMTc0LDcgQEAKIGludCBHZXQxNDAxU3RhdGUoREVWSUNFX0VYVEVOU0lPTiAqcGR4LCBfX3UzMiAqc3RhdGUsIF9fdTMyICplcnJvcikKIHsKIAlpbnQgbkdvdDsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiR2V0MTQwMVN0YXRlKCkgZW50cnkiKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGVudHJ5XG4iLCBfX2Z1bmNfXyk7CiAKIAkqc3RhdGUgPSAweEZGRkZGRkZGOwkvKiAgU3RhcnQgb2ZmIHdpdGggaW52YWxpZCBzdGF0ZSAqLwogCW5Hb3QgPSB1c2JfY29udHJvbF9tc2cocGR4LT51ZGV2LCB1c2JfcmN2Y3RybHBpcGUocGR4LT51ZGV2LCAwKSwKQEAgLTE4MiwxNSArMTgyLDE1IEBACiAJCQkgICAgICAgcGR4LT5zdGF0QnVmLCBzaXplb2YocGR4LT5zdGF0QnVmKSwgSFopOwogCWlmIChuR290ICE9IHNpemVvZihwZHgtPnN0YXRCdWYpKSB7CiAJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkiR2V0MTQwMVN0YXRlKCkgRkFJTEVELCByZXR1cm4gY29kZSAlZCIsIG5Hb3QpOworCQkJIiVzOiBGQUlMRUQsIHJldHVybiBjb2RlICVkXG4iLCBfX2Z1bmNfXywgbkdvdCk7CiAJCXBkeC0+c0N1cnJlbnRTdGF0ZSA9IFUxNEVSUl9USU1FOwkvKiAgSW5kaWNhdGUgdGhhdCB0aGluZ3MgYXJlIHZlcnkgd3JvbmcgaW5kZWVkICovCiAJCSpzdGF0ZSA9IDA7CS8qICBGb3JjZSBzdGF0dXMgdmFsdWVzIHRvIGEga25vd24gc3RhdGUgKi8KIAkJKmVycm9yID0gMDsKIAl9IGVsc2UgewogCQlpbnQgbkRldmljZTsKIAkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCSJHZXQxNDAxU3RhdGUoKSBTdWNjZXNzLCBzdGF0ZTogMHgleCwgMHgleCIsCi0JCQlwZHgtPnN0YXRCdWZbMF0sIHBkeC0+c3RhdEJ1ZlsxXSk7CisJCQkiJXM6IFN1Y2Nlc3MsIHN0YXRlOiAweCV4LCAweCV4XG4iLAorCQkJX19mdW5jX18sIHBkeC0+c3RhdEJ1ZlswXSwgcGR4LT5zdGF0QnVmWzFdKTsKIAogCQkqc3RhdGUgPSBwZHgtPnN0YXRCdWZbMF07CS8qICBSZXR1cm4gdGhlIHN0YXRlIHZhbHVlcyB0byB0aGUgY2FsbGluZyBjb2RlICovCiAJCSplcnJvciA9IHBkeC0+c3RhdEJ1ZlsxXTsKQEAgLTIyMCw4ICsyMjAsOCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGludCBSZWFkV3JpdGVfQ2FuY2VsKERFVklDRV9FWFRFTlNJT04gKnBkeCkKIHsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiUmVhZFdyaXRlX0NhbmNlbCBlbnRyeSAlZCIsCi0JCXBkeC0+YlN0YWdlZFVyYlBlbmRpbmcpOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogZW50cnkgJWRcbiIsCisJCV9fZnVuY19fLCBwZHgtPmJTdGFnZWRVcmJQZW5kaW5nKTsKICNpZmRlZiBOT1RfV1JJVFRFTl9ZRVQKIAlpbnQgbnRTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKIAlib29sIGJSZXN1bHQgPSBmYWxzZTsKQEAgLTIzMSw3ICsyMzEsNyBAQAogCiAJaWYgKHBkeC0+YlN0YWdlZFVyYlBlbmRpbmcpIHsJLyogIGFueXRoaW5nIHRvIGJlIGNhbmNlbGxlZD8gTWF5IG5lZWQgbW9yZS4uLiAqLwogCQlkZXZfaW5mbygmcGR4LT5pbnRlcmZhY2UgLSBkZXYsCi0JCQkgIlJlYWRXcml0ZV9DYW5jZWwgYWJvdXQgdG8gY2FuY2VsIFVyYiIpOworCQkJICJSZWFkV3JpdGVfQ2FuY2VsIGFib3V0IHRvIGNhbmNlbCBVcmJcbiIpOwogCQkvKiBDbGVhciB0aGUgc3RhZ2luZyBkb25lIGZsYWcgKi8KIAkJLyogS2VDbGVhckV2ZW50KCZwZHgtPlN0YWdpbmdEb25lRXZlbnQpOyAqLwogCQlVU0JfQVNTRVJUKHBkeC0+cFN0YWdlZElycCAhPSBOVUxMKTsKQEAgLTI0NCwxNCArMjQ0LDE0IEBACiAJCQlMQVJHRV9JTlRFR0VSIHRpbWVvdXQ7CiAJCQl0aW1lb3V0LlF1YWRQYXJ0ID0gLTEwMDAwMDAwOwkvKiAgVXNlIGEgdGltZW91dCBvZiAxIHNlY29uZCAqLwogCQkJZGV2X2luZm8oJnBkeC0+aW50ZXJmYWNlIC0gZGV2LAotCQkJCSAiUmVhZFdyaXRlX0NhbmNlbCBhYm91dCB0byB3YWl0IHRpbGwgZG9uZSIpOworCQkJCSAiJXM6IGFib3V0IHRvIHdhaXQgdGlsbCBkb25lXG4iLCBfX2Z1bmNfXyk7CiAJCQludFN0YXR1cyA9CiAJCQkgICAgS2VXYWl0Rm9yU2luZ2xlT2JqZWN0KCZwZHgtPlN0YWdpbmdEb25lRXZlbnQsCiAJCQkJCQkgIEV4ZWN1dGl2ZSwgS2VybmVsTW9kZSwgRkFMU0UsCiAJCQkJCQkgICZ0aW1lb3V0KTsKIAkJfSBlbHNlIHsKIAkJCWRldl9pbmZvKCZwZHgtPmludGVyZmFjZSAtIGRldiwKLQkJCQkgIlJlYWRXcml0ZV9DYW5jZWwsIGNhbmNlbGxhdGlvbiBmYWlsZWQiKTsKKwkJCQkgIiVzOiBjYW5jZWxsYXRpb24gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCQludFN0YXR1cyA9IFUxNEVSUl9GQUlMOwogCQl9CiAJCVVTQl9LZFByaW50KERCR0xWTF9ERUZBVUxULApAQCAtMjYwLDcgKzI2MCw3IEBACiAJfSBlbHNlCiAJCXNwaW5fdW5sb2NrX2lycSgmcGR4LT5zdGFnZWRMb2NrKTsKIAotCWRldl9pbmZvKCZwZHgtPmludGVyZmFjZSAtIGRldiwgIlJlYWRXcml0ZV9DYW5jZWwgIGRvbmUiKTsKKwlkZXZfaW5mbygmcGR4LT5pbnRlcmZhY2UgLSBkZXYsICIlczogZG9uZVxuIiwgX19mdW5jX18pOwogCXJldHVybiBudFN0YXR1czsKICNlbHNlCiAJcmV0dXJuIFUxNEVSUl9OT0VSUk9SOwpAQCAtMzA0LDcgKzMwNCw3IEBACiBib29sIElzMTQwMShERVZJQ0VfRVhURU5TSU9OICpwZHgpCiB7CiAJaW50IGlSZXR1cm47Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJY2VkX2RyYXdfZG93bihwZHgpOwkvKiAgd2FpdCBmb3IsIHRoZW4ga2lsbCBvdXRzdGFuZGluZyBVcmJzICovCiAJRmx1c2hJbkJ1ZmYocGR4KTsJLyogIENsZWFyIG91dCBpbnB1dCBidWZmZXIgJiBwaXBlICovCkBAIC0zNjgsNyArMzY4LDcgQEAKIAkJICAgICAgKHBkeC0+c0N1cnJlbnRTdGF0ZSA+PSBVMTRFUlJfU1REKSk7CS8qICBObyAxNDAxIGVycm9ycyBzdG9yZWQgKi8KIAogCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCSIlcyBETUFGbGFnOiVkLCBzdGF0ZTolZCwgZm9yY2U6JWQsIHRlc3RCdWZmOiVkLCBzaG9ydDolZCIsCisJCSIlczogRE1BRmxhZzolZCwgc3RhdGU6JWQsIGZvcmNlOiVkLCB0ZXN0QnVmZjolZCwgc2hvcnQ6JWRcbiIsCiAJCV9fZnVuY19fLCBwZHgtPmR3RE1BRmxhZywgcGR4LT5zQ3VycmVudFN0YXRlLCBwZHgtPmJGb3JjZVJlc2V0LAogCQliVGVzdEJ1ZmYsIGJTaG9ydFRlc3QpOwogCkBAIC0zNzYsMTMgKzM3NiwxMyBAQAogCSAgICAocGR4LT5kd051bUlucHV0IHx8IHBkeC0+ZHdOdW1PdXRwdXQpKSB7CS8qICAuLi5jaGFyYWN0ZXJzIHdlcmUgaW4gdGhlIGJ1ZmZlcj8gKi8KIAkJYlNob3J0VGVzdCA9IGZhbHNlOwkvKiAgVGhlbiBkbyB0aGUgZnVsbCB0ZXN0ICovCiAJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkiJXMgd2lsbCByZXNldCBhcyBidWZmZXJzIG5vdCBlbXB0eSIsIF9fZnVuY19fKTsKKwkJCSIlczogd2lsbCByZXNldCBhcyBidWZmZXJzIG5vdCBlbXB0eVxuIiwgX19mdW5jX18pOwogCX0KIAogCWlmIChiU2hvcnRUZXN0IHx8ICFiQ2FuUmVzZXQpIHsJLyogIFN0aWxsIE9LIHRvIHRyeSB0aGUgc2hvcnQgdGVzdD8gKi8KIAkJCQkvKiAgQWx3YXlzIHRlc3QgaWYgbm8gcmVzZXQgLSB3ZSB3YW50IHN0YXRlIHVwZGF0ZSAqLwogCQl1bnNpZ25lZCBpbnQgc3RhdGUsIGVycm9yOwotCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMtPkdldDE0MDFTdGF0ZSIsIF9fZnVuY19fKTsKKwkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBHZXQxNDAxU3RhdGVcbiIsIF9fZnVuY19fKTsKIAkJaWYgKEdldDE0MDFTdGF0ZShwZHgsICZzdGF0ZSwgJmVycm9yKSA9PSBVMTRFUlJfTk9FUlJPUikgewkvKiAgQ2hlY2sgb24gdGhlIDE0MDEgc3RhdGUgKi8KIAkJCWlmICgoc3RhdGUgJiAweEZGKSA9PSAwKQkvKiAgSWYgY2FsbCB3b3JrZWQsIGNoZWNrIHRoZSBzdGF0dXMgdmFsdWUgKi8KIAkJCQliUmV0ID0gdHJ1ZTsJLyogIElmIHRoYXQgd2FzIHplcm8sIGFsbCBpcyBPSywgbm8gcmVzZXQgbmVlZGVkICovCkBAIC0zOTAsNyArMzkwLDcgQEAKIAl9CiAKIAlpZiAoIWJSZXQgJiYgYkNhblJlc2V0KQl7IC8qICBJZiBhbGwgbm90IE9LLCB0aGVuICovCi0JCWRldl9pbmZvKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMtPklzMTQwMSAlZCAlZCAlZCAlZCIsCisJCWRldl9pbmZvKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IElzMTQwMSAlZCAlZCAlZCAlZFxuIiwKIAkJCSBfX2Z1bmNfXywgYlNob3J0VGVzdCwgcGR4LT5zQ3VycmVudFN0YXRlLCBiVGVzdEJ1ZmYsCiAJCQkgcGR4LT5iRm9yY2VSZXNldCk7CiAJCWJSZXQgPSBJczE0MDEocGR4KTsJLyogICBkbyBmdWxsIHRlc3QgKi8KQEAgLTQwNyw3ICs0MDcsOCBAQAogaW50IFJlc2V0MTQwMShERVZJQ0VfRVhURU5TSU9OICpwZHgpCiB7CiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7CS8qICBQcm90ZWN0IGRpc2Nvbm5lY3QgZnJvbSBuZXcgaS9vICovCi0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIkFCb3V0IHRvIGNhbGwgUXVpY2tDaGVjayIpOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogQWJvdXQgdG8gY2FsbCBRdWlja0NoZWNrXG4iLAorCQlfX2Z1bmNfXyk7CiAJUXVpY2tDaGVjayhwZHgsIHRydWUsIHRydWUpOwkvKiAgQ2hlY2sgMTQwMSwgcmVzZXQgaWYgbm90IE9LICovCiAJbXV0ZXhfdW5sb2NrKCZwZHgtPmlvX211dGV4KTsKIAlyZXR1cm4gVTE0RVJSX05PRVJST1I7CkBAIC00MjMsNyArNDI0LDcgQEAKIAlpbnQgaVJldHVybiA9IFUxNEVSUl9OT0lOOwkvKiAgYXNzdW1lIHdlIHdpbGwgZ2V0ICBub3RoaW5nICovCiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7CS8qICBQcm90ZWN0IGRpc2Nvbm5lY3QgZnJvbSBuZXcgaS9vICovCiAKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiR2V0Q2hhciIpOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJQWxsb3dpKHBkeCk7CS8qICBNYWtlIHN1cmUgY2hhciByZWFkcyBhcmUgcnVubmluZyAqLwogCVNlbmRDaGFycyhwZHgpOwkvKiAgYW5kIHNlbmQgYW55IGJ1ZmZlcmVkIGNoYXJzICovCkBAIC00OTcsOCArNDk4LDggQEAKIAkJcGR4LT5kd051bUlucHV0IC09IG5Hb3Q7CiAJCXNwaW5fdW5sb2NrX2lycSgmcGR4LT5jaGFySW5Mb2NrKTsKIAotCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJIkdldFN0cmluZyByZWFkICVkIGNoYXJhY3RlcnMgPiVzPCIsIG5Hb3QsIGJ1ZmZlcik7CisJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogcmVhZCAlZCBjaGFyYWN0ZXJzID4lczxcbiIsCisJCQlfX2Z1bmNfXywgbkdvdCwgYnVmZmVyKTsKIAkJaWYgKGNvcHlfdG9fdXNlcihwVXNlciwgYnVmZmVyLCBuQ29weVRvVXNlcikpCiAJCQlpUmV0dXJuID0gLUVGQVVMVDsKIAkJZWxzZQpAQCAtNTU1LDcgKzU1Niw3IEBACiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxKCZwZHgtPmNoYXJJbkxvY2spOwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICJMaW5lQ291bnQgcmV0dXJuZWQgJWQiLCBpUmV0dXJuKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IHJldHVybmVkICVkXG4iLCBfX2Z1bmNfXywgaVJldHVybik7CiAJbXV0ZXhfdW5sb2NrKCZwZHgtPmlvX211dGV4KTsJLyogIFByb3RlY3QgZGlzY29ubmVjdCBmcm9tIG5ldyBpL28gKi8KIAlyZXR1cm4gaVJldHVybjsKIH0KQEAgLTU3MSw3ICs1NzIsNyBAQAogCW11dGV4X2xvY2soJnBkeC0+aW9fbXV0ZXgpOwkvKiAgUHJvdGVjdCBkaXNjb25uZWN0IGZyb20gbmV3IGkvbyAqLwogCVNlbmRDaGFycyhwZHgpOwkJLyogIHNlbmQgYW55IGJ1ZmZlcmVkIGNoYXJzICovCiAJaVJldHVybiA9IChpbnQpKE9VVEJVRl9TWiAtIHBkeC0+ZHdOdW1PdXRwdXQpOwkvKiAgbm8gbG9jayBuZWVkZWQgZm9yIHNpbmdsZSByZWFkICovCi0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIk91dEJ1ZlNwYWNlICVkIiwgaVJldHVybik7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiAlZFxuIiwgX19mdW5jX18sIGlSZXR1cm4pOwogCW11dGV4X3VubG9jaygmcGR4LT5pb19tdXRleCk7CS8qICBQcm90ZWN0IGRpc2Nvbm5lY3QgZnJvbSBuZXcgaS9vICovCiAJcmV0dXJuIGlSZXR1cm47CiB9CkBAIC01ODksNyArNTkwLDcgQEAKIAogCWlmICgobkFyZWEgPCAwKSB8fCAobkFyZWEgPj0gTUFYX1RSQU5TQVJFQVMpKSB7CiAJCWlSZXR1cm4gPSBVMTRFUlJfQkFEQVJFQTsKLQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIEF0dGVtcHQgdG8gY2xlYXIgYXJlYSAlZCIsCisJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogQXR0ZW1wdCB0byBjbGVhciBhcmVhICVkXG4iLAogCQkJX19mdW5jX18sIG5BcmVhKTsKIAl9IGVsc2UgewogCQlUUkFOU0FSRUEgKnBUQSA9ICZwZHgtPnJUcmFuc0RlZltuQXJlYV07CS8qICB0byBzYXZlIHR5cGluZyAqLwpAQCAtNjAyLDE0ICs2MDMsMTQgQEAKIAkJCWludCBuUGFnZXMgPSAwOwkvKiAgYW5kIG51bWJlciBvZiBwYWdlcyAqLwogCQkJaW50IG5wOwogCi0JCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgYXJlYSAlZCIsIF9fZnVuY19fLAotCQkJCW5BcmVhKTsKKwkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogYXJlYSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgbkFyZWEpOwogCQkJc3Bpbl9sb2NrX2lycSgmcGR4LT5zdGFnZWRMb2NrKTsKIAkJCWlmICgocGR4LT5TdGFnZWRJZCA9PSBuQXJlYSkKIAkJCSAgICAmJiAocGR4LT5kd0RNQUZsYWcgPiBNT0RFX0NIQVIpKSB7CiAJCQkJaVJldHVybiA9IFUxNEVSUl9VTkxPQ0tGQUlMOwkvKiAgY2Fubm90IGRlbGV0ZSBhcyBpbiB1c2UgKi8KIAkJCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkiJXMgY2FsbCBvbiBhcmVhICVkIHdoaWxlIGFjdGl2ZSIsCisJCQkJCSIlczogY2FsbCBvbiBhcmVhICVkIHdoaWxlIGFjdGl2ZVxuIiwKIAkJCQkJX19mdW5jX18sIG5BcmVhKTsKIAkJCX0gZWxzZSB7CiAJCQkJcFBhZ2VzID0gcFRBLT5wUGFnZXM7CS8qICBzYXZlIHBhZ2UgYWRkcmVzcyBsaXN0ICovCkBAIC02MzMsNyArNjM0LDcgQEAKIAkJCQkvKiAgTm93IHdlIG11c3QgdW5kbyB0aGUgcGlubmluZyBkb3duIG9mIHRoZSBwYWdlcy4gV2Ugd2lsbCBhc3N1bWUgdGhlIHdvcnN0IGFuZCBtYXJrICovCiAJCQkJLyogIGFsbCB0aGUgcGFnZXMgYXMgZGlydHkuIERvbid0IGJlIHRlbXB0ZWQgdG8gbW92ZSB0aGlzIHVwIGFib3ZlIGFzIHlvdSBtdXN0IG5vdCBiZSAqLwogCQkJCS8qICBob2xkaW5nIGEgc3BpbiBsb2NrIHRvIGRvIHRoaXMgc3R1ZmYgYXMgaXQgaXMgbm90IGF0b21pYy4gKi8KLQkJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgblBhZ2VzPSVkIiwKKwkJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IG5QYWdlcz0lZFxuIiwKIAkJCQkJX19mdW5jX18sIG5QYWdlcyk7CiAKIAkJCQlmb3IgKG5wID0gMDsgbnAgPCBuUGFnZXM7ICsrbnApIHsKQEAgLTY0NSw3ICs2NDYsNyBAQAogCiAJCQkJa2ZyZWUocFBhZ2VzKTsKIAkJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkiJXMga2ZyZWUocFBhZ2VzKSBkb25lIiwgX19mdW5jX18pOworCQkJCQkiJXM6IGtmcmVlKHBQYWdlcykgZG9uZVxuIiwgX19mdW5jX18pOwogCQkJfQogCQl9CiAJfQpAQCAtNjg3LDEyICs2ODgsMTIgQEAKIAkJaVJldHVybiA9IFUxNEVSUl9OT01FTU9SWTsKIAkJZ290byBlcnJvcjsKIAl9Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzICVwLCBsZW5ndGg9JTA2eCwgY2lyY3VsYXIgJWQiLAorCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogJXAsIGxlbmd0aD0lMDZ4LCBjaXJjdWxhciAlZFxuIiwKIAkJX19mdW5jX18sIHB1QnVmLCBkd0xlbmd0aCwgYkNpcmN1bGFyKTsKIAogCS8qICBUbyBwaW4gZG93biB1c2VyIHBhZ2VzIHdlIG11c3QgZmlyc3QgYWNxdWlyZSB0aGUgbWFwcGluZyBzZW1hcGhvcmUuICovCiAJblBhZ2VzID0gZ2V0X3VzZXJfcGFnZXNfZmFzdCh1bFN0YXJ0LCBsZW4sIDEsIHBQYWdlcyk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIG5QYWdlcyA9ICVkIiwgX19mdW5jX18sIG5QYWdlcyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBuUGFnZXMgPSAlZFxuIiwgX19mdW5jX18sIG5QYWdlcyk7CiAKIAlpZiAoblBhZ2VzID4gMCkgewkJLyogIGlmIHdlIHN1Y2NlZWRlZCAqLwogCQkvKiAgSWYgeW91IGFyZSB0ZW1wdGVkIHRvIHVzZSBwYWdlX2FkZHJlc3MgKGZvcm0gTEREMyksIGZvcmdldCBpdC4gWW91IE1VU1QgdXNlICovCkBAIC03MzUsMTcgKzczNiwxNyBAQAogKiogdW5zZXQgaXQuIFVuc2V0dGluZyB3aWxsIGZhaWwgaWYgdGhlIGFyZWEgaXMgYm9va2VkLCBhbmQgYSB0cmFuc2ZlciB0byB0aGF0CiAqKiBhcmVhIGlzIGluIHByb2dyZXNzLiBPdGhlcndpc2UsIHdlIHdpbGwgcmVsZWFzZSB0aGUgYXJlYSBhbmQgcmUtYXNzaWduIGl0LgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBTZXRUcmFuc2ZlcihERVZJQ0VfRVhURU5TSU9OICpwZHgsIFRSQU5TRkVSREVTQyBfX3VzZXIgKnBURCkKK2ludCBTZXRUcmFuc2ZlcihERVZJQ0VfRVhURU5TSU9OICpwZHgsIHN0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MgX191c2VyICpwVEQpCiB7CiAJaW50IGlSZXR1cm47Ci0JVFJBTlNGRVJERVNDIHRkOworCXN0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MgdGQ7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnRkLCBwVEQsIHNpemVvZih0ZCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCW11dGV4X2xvY2soJnBkeC0+aW9fbXV0ZXgpOwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBhcmVhOiVkLCBzaXplOiUwOHgiLCBfX2Z1bmNfXywKLQkJdGQud0FyZWFOdW0sIHRkLmR3TGVuZ3RoKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGFyZWE6JWQsIHNpemU6JTA4eFxuIiwKKwkJX19mdW5jX18sIHRkLndBcmVhTnVtLCB0ZC5kd0xlbmd0aCk7CiAJLyogIFRoZSBzdHJhbmdlIGNhc3QgaXMgZG9uZSBzbyB0aGF0IHdlIGRvbid0IGdldCB3YXJuaW5ncyBpbiAzMi1iaXQgbGludXggYWJvdXQgdGhlIHNpemUgb2YgdGhlICovCiAJLyogIHBvaW50ZXIuIFRoZSBwb2ludGVyIGlzIGFsd2F5cyBwYXNzZWQgYXMgYSA2NC1iaXQgb2JqZWN0IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSBwcm9ibGVtcyB1c2luZyAqLwogCS8qICBhIDMyLWJpdCBwcm9ncmFtIG9uIGEgNjQtYml0IHN5c3RlbS4gdW5zaWduZWQgbG9uZyBpcyA2NC1iaXRzIG9uIGEgNjQtYml0IHN5c3RlbS4gKi8KQEAgLTc3OCwxMCArNzc5LDEwIEBACiAqKiBwcmV0ZW5kIHRoYXQgd2hhdGV2ZXIgdGhlIHVzZXIgYXNrZWQgZm9yIHdhcyBhY2hpZXZlZCwgc28gd2UgcmV0dXJuIDEgaWYKICoqIHRyeSB0byBjcmVhdGUgb25lLCBhbmQgMCBpZiB0aGV5IGFzayB0byByZW1vdmUgKGFzc3VtaW5nIGFsbCBlbHNlIHdhcyBPSykuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFNldEV2ZW50KERFVklDRV9FWFRFTlNJT04gKnBkeCwgVFJBTlNGRVJFVkVOVCBfX3VzZXIgKnBURSkKK2ludCBTZXRFdmVudChERVZJQ0VfRVhURU5TSU9OICpwZHgsIHN0cnVjdCB0cmFuc2Zlcl9ldmVudCBfX3VzZXIgKnBURSkKIHsKIAlpbnQgaVJldHVybiA9IFUxNEVSUl9OT0VSUk9SOwotCVRSQU5TRkVSRVZFTlQgdGU7CisJc3RydWN0IHRyYW5zZmVyX2V2ZW50IHRlOwogCiAJLyogIGdldCBhIGxvY2FsIGNvcHkgb2YgdGhlIGRhdGEgKi8KIAlpZiAoY29weV9mcm9tX3VzZXIoJnRlLCBwVEUsIHNpemVvZih0ZSkpKQpAQCAtOTIyLDcgKzkyMyw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50IEtpbGxJTzE0MDEoREVWSUNFX0VYVEVOU0lPTiAqcGR4KQogewotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsKIAlGbHVzaE91dEJ1ZmYocGR4KTsKIAlGbHVzaEluQnVmZihwZHgpOwpAQCAtOTM4LDcgKzkzOSw3IEBACiBpbnQgQmxrVHJhbnNTdGF0ZShERVZJQ0VfRVhURU5TSU9OICpwZHgpCiB7CiAJaW50IGlSZXR1cm4gPSBwZHgtPmR3RE1BRmxhZyAhPSBNT0RFX0NIQVI7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzID0gJWQiLCBfX2Z1bmNfXywgaVJldHVybik7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiAlZFxuIiwgX19mdW5jX18sIGlSZXR1cm4pOwogCXJldHVybiBpUmV0dXJuOwogfQogCkBAIC05NTYsNyArOTU3LDcgQEAKIAlpUmV0dXJuID0gcGR4LT5zQ3VycmVudFN0YXRlOwogCiAJbXV0ZXhfdW5sb2NrKCZwZHgtPmlvX211dGV4KTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgPSAlZCIsIF9fZnVuY19fLCBpUmV0dXJuKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6ICVkXG4iLCBfX2Z1bmNfXywgaVJldHVybik7CiAKIAlyZXR1cm4gaVJldHVybjsKIH0KQEAgLTk3MSw3ICs5NzIsNyBAQAogewogCWludCBuR290OwogCW11dGV4X2xvY2soJnBkeC0+aW9fbXV0ZXgpOwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCWNlZF9kcmF3X2Rvd24ocGR4KTsJLyogIHdhaXQgZm9yLCB0aGVuIGtpbGwgb3V0c3RhbmRpbmcgVXJicyAqLwogCUZsdXNoSW5CdWZmKHBkeCk7CS8qICBDbGVhciBvdXQgaW5wdXQgYnVmZmVyICYgcGlwZSAqLwpAQCAtOTg3LDcgKzk4OCw3IEBACiAKIAltdXRleF91bmxvY2soJnBkeC0+aW9fbXV0ZXgpOwogCWlmIChuR290IDwgMCkKLQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGVycj0lZCIsIF9fZnVuY19fLCBuR290KTsKKwkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBlcnI9JWRcbiIsIF9fZnVuY19fLCBuR290KTsKIAlyZXR1cm4gbkdvdCA8IDAgPyBVMTRFUlJfRkFJTCA6IFUxNEVSUl9OT0VSUk9SOwogfQogCkBAIC0xMDA1LDcgKzEwMDYsNyBAQAogCiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7CiAKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAJaVJldHVybiA9IEdldDE0MDFTdGF0ZShwZHgsICZzdGF0ZSwgJmVycm9yKTsKIAlpZiAoaVJldHVybiA9PSBVMTRFUlJfTk9FUlJPUikJLyogIE9ubHkgYWNjZXB0IHplcm8gaWYgaXQgaGFwcGVucyB0d2ljZSAqLwogCQlpUmV0dXJuID0gR2V0MTQwMVN0YXRlKHBkeCwgJnN0YXRlLCAmZXJyb3IpOwpAQCAtMTAxMyw4ICsxMDE0LDggQEAKIAlpZiAoaVJldHVybiAhPSBVMTRFUlJfTk9FUlJPUikgewkvKiAgU2VsZi10ZXN0IGNhbiBjYXVzZSBjb21tcyBlcnJvcnMgKi8KIAkJCQkvKiAgc28gd2UgYXNzdW1lIHN0aWxsIHRlc3RpbmcgKi8KIAkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCSIlcyBHZXQxNDAxU3RhdGU9JWQsIGFzc3VtaW5nIHN0aWxsIHRlc3RpbmciLCBfX2Z1bmNfXywKLQkJCWlSZXR1cm4pOworCQkJIiVzOiBHZXQxNDAxU3RhdGU9JWQsIGFzc3VtaW5nIHN0aWxsIHRlc3RpbmdcbiIsCisJCQlfX2Z1bmNfXywgaVJldHVybik7CiAJCXN0YXRlID0gMHg4MDsJLyogIEZvcmNlIHN0aWxsLXRlc3RpbmcsIG5vIGVycm9yICovCiAJCWVycm9yID0gMDsKIAkJaVJldHVybiA9IFUxNEVSUl9OT0VSUk9SOwpAQCAtMTAyMiw3ICsxMDIzLDcgQEAKIAogCWlmICgoc3RhdGUgPT0gLTEpICYmIChlcnJvciA9PSAtMSkpIHsJLyogIElmIEdldDE0MDFTdGF0ZSBoYWQgcHJvYmxlbXMgKi8KIAkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCSIlcyBHZXQxNDAxU3RhdGUgZmFpbGVkLCBhc3N1bWluZyBzdGlsbCB0ZXN0aW5nIiwKKwkJCSIlczogR2V0MTQwMVN0YXRlIGZhaWxlZCwgYXNzdW1pbmcgc3RpbGwgdGVzdGluZ1xuIiwKIAkJCV9fZnVuY19fKTsKIAkJc3RhdGUgPSAweDgwOwkvKiAgRm9yY2Ugc3RpbGwtdGVzdGluZywgbm8gZXJyb3IgKi8KIAkJZXJyb3IgPSAwOwpAQCAtMTAzMywyMSArMTAzNCwyMSBAQAogCQkJZ3N0LmNvZGUgPSAoc3RhdGUgJiAweDAwRkYwMDAwKSA+PiAxNjsJLyogIHJlYWQgdGhlIGVycm9yIGNvZGUgKi8KIAkJCWdzdC54ID0gZXJyb3IgJiAweDAwMDBGRkZGOwkvKiAgRXJyb3IgZGF0YSBYICovCiAJCQlnc3QueSA9IChlcnJvciAmIDB4RkZGRjAwMDApID4+IDE2OwkvKiAgYW5kIGRhdGEgWSAqLwotCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIlNlbGYtdGVzdCBlcnJvciBjb2RlICVkIiwKLQkJCQlnc3QuY29kZSk7CisJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAorCQkJCSJTZWxmLXRlc3QgZXJyb3IgY29kZSAlZFxuIiwgZ3N0LmNvZGUpOwogCQl9IGVsc2UgewkJLyogIE5vIGVycm9yLCBjaGVjayBmb3IgdGltZW91dCAqLwogCQkJdW5zaWduZWQgbG9uZyB1bE5vdyA9IGppZmZpZXM7CS8qICBnZXQgY3VycmVudCB0aW1lICovCiAJCQlpZiAodGltZV9hZnRlcih1bE5vdywgcGR4LT51bFNlbGZUZXN0VGltZSkpIHsKIAkJCQlnc3QuY29kZSA9IC0yOwkvKiAgRmxhZyB0aGUgdGltZW91dCAqLwogCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCSJTZWxmLXRlc3QgdGltZWQtb3V0Iik7CisJCQkJCSJTZWxmLXRlc3QgdGltZWQtb3V0XG4iKTsKIAkJCX0gZWxzZQogCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCSJTZWxmLXRlc3Qgb24tZ29pbmciKTsKKwkJCQkJIlNlbGYtdGVzdCBvbi1nb2luZ1xuIik7CiAJCX0KIAl9IGVsc2UgewogCQlnc3QuY29kZSA9IC0xOwkvKiAgRmxhZyB0aGUgdGVzdCBpcyBkb25lICovCi0JCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICJTZWxmLXRlc3QgZG9uZSIpOworCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiU2VsZi10ZXN0IGRvbmVcbiIpOwogCX0KIAogCWlmIChnc3QuY29kZSA8IDApIHsJLyogIElmIHdlIGhhdmUgYSBwcm9ibGVtIG9yIGZpbmlzaGVkICovCkBAIC0xMDc0LDcgKzEwNzUsNyBAQAogewogCWludCBpUmV0dXJuID0gVFlQRVVOS05PV047CiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJc3dpdGNoIChwZHgtPnMxNDAxVHlwZSkgewogCWNhc2UgVFlQRTE0MDE6CkBAIC0xMDkyLDcgKzEwOTMsNyBAQAogCQllbHNlCQkvKiAgIGZvciB1cC1jb21pbmcgMTQwMSBkZXNpZ25zICovCiAJCQlpUmV0dXJuID0gVFlQRVVOS05PV047CS8qICBEb24ndCBrbm93IG9yIG5vdCB0aGVyZSAqLwogCX0KLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgJWQiLCBfX2Z1bmNfXywgaVJldHVybik7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzICVkXG4iLCBfX2Z1bmNfXywgaVJldHVybik7CiAJbXV0ZXhfdW5sb2NrKCZwZHgtPmlvX211dGV4KTsKIAogCXJldHVybiBpUmV0dXJuOwpAQCAtMTEwNyw3ICsxMTA4LDcgQEAKIHsKIAlpbnQgaVJldHVybiA9IFUxNFRGX01VTFRJQSB8IFUxNFRGX0RJQUcgfAkvKiAgd2UgYWx3YXlzIGhhdmUgbXVsdGlwbGUgRE1BIGFyZWEgKi8KIAkgICAgVTE0VEZfTk9USUZZIHwgVTE0VEZfQ0lSQ1RIOwkvKiAgZGlhZ25vc3RpY3MsIG5vdGlmeSBhbmQgY2lyY3VsYXIgKi8KLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7CiAJaWYgKHBkeC0+YklzVVNCMikJLyogIFNldCBmbGFnIGZvciBVU0IyIGlmIGFwcHJvcHJpYXRlICovCiAJCWlSZXR1cm4gfD0gVTE0VEZfVVNCMjsKQEAgLTExMjUsMTUgKzExMjYsMTUgQEAKIAkJICAgICAgdW5zaWduZWQgaW50IGRhdGEpCiB7CiAJaW50IGlSZXR1cm47Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGVudHJ5IiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogZW50cnlcbiIsIF9fZnVuY19fKTsKIAlpUmV0dXJuID0gdXNiX2NvbnRyb2xfbXNnKHBkeC0+dWRldiwgdXNiX3NuZGN0cmxwaXBlKHBkeC0+dWRldiwgMCksIGNtZCwKIAkJCQkgIChIX1RPX0QgfCBWRU5ET1IgfCBERVZSRVEpLAogCQkJCSAgKHVuc2lnbmVkIHNob3J0KWRhdGEsCiAJCQkJICAodW5zaWduZWQgc2hvcnQpKGRhdGEgPj4gMTYpLCBOVUxMLCAwLCBIWik7CiAJCQkJCQkvKiBhbGxvdyAxIHNlY29uZCB0aW1lb3V0ICovCiAJaWYgKGlSZXR1cm4gPCAwKQotCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgZmFpbCBjb2RlPSVkIiwgX19mdW5jX18sCi0JCQlpUmV0dXJuKTsKKwkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBmYWlsIGNvZGU9JWRcbiIsCisJCQlfX2Z1bmNfXywgaVJldHVybik7CiAKIAlyZXR1cm4gaVJldHVybjsKIH0KQEAgLTExNTIsNyArMTE1Myw3IEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIEAgJTA4eCIsIF9fZnVuY19fLCBkYi5pQWRkcik7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBAICUwOHhcbiIsIF9fZnVuY19fLCBkYi5pQWRkcik7CiAKIAlpUmV0dXJuID0gRGJnQ21kMTQwMShwZHgsIERCX1NFVEFERCwgZGIuaUFkZHIpOwogCWlmIChpUmV0dXJuID09IFUxNEVSUl9OT0VSUk9SKQpAQCAtMTE4MSw3ICsxMTgyLDcgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgQCAlMDh4IiwgX19mdW5jX18sIGRiLmlBZGRyKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IEAgJTA4eFxuIiwgX19mdW5jX18sIGRiLmlBZGRyKTsKIAogCWlSZXR1cm4gPSBEYmdDbWQxNDAxKHBkeCwgREJfU0VUQURELCBkYi5pQWRkcik7CiAJaWYgKGlSZXR1cm4gPT0gVTE0RVJSX05PRVJST1IpCkBAIC0xMjEwLDcgKzEyMTEsNyBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCW11dGV4X2xvY2soJnBkeC0+aW9fbXV0ZXgpOwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBAICUwOHgiLCBfX2Z1bmNfXywgZGIuaUFkZHIpOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogQCAlMDh4XG4iLCBfX2Z1bmNfXywgZGIuaUFkZHIpOwogCiAJaVJldHVybiA9IERiZ0NtZDE0MDEocGR4LCBEQl9TRVRBREQsIGRiLmlBZGRyKTsKIAlpZiAoaVJldHVybiA9PSBVMTRFUlJfTk9FUlJPUikKQEAgLTEyNDIsNyArMTI0Myw3IEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJaVJldHVybiA9IERiZ0NtZDE0MDEocGR4LCBEQl9TRVRERUYsIGRiLmlEZWZhdWx0KTsKIAlpZiAoaVJldHVybiA9PSBVMTRFUlJfTk9FUlJPUikKQEAgLTEyNzAsNyArMTI3MSw3IEBACiAJbWVtc2V0KCZkYiwgMCwgc2l6ZW9mKGRiKSk7CS8qICBmaWxsIHJldHVybmVkIGJsb2NrIHdpdGggMHMgKi8KIAogCW11dGV4X2xvY2soJnBkeC0+aW9fbXV0ZXgpOwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCS8qICBSZWFkIGJhY2sgdGhlIGxhc3QgcGVla2VkIHZhbHVlIGZyb20gdGhlIDE0MDEuICovCiAJaVJldHVybiA9IHVzYl9jb250cm9sX21zZyhwZHgtPnVkZXYsIHVzYl9yY3ZjdHJscGlwZShwZHgtPnVkZXYsIDApLApAQCAtMTI4Miw4ICsxMjgzLDggQEAKIAkJZWxzZQogCQkJaVJldHVybiA9IFUxNEVSUl9OT0VSUk9SOwogCX0gZWxzZQotCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgZmFpbGVkLCBjb2RlICVkIiwgX19mdW5jX18sCi0JCQlpUmV0dXJuKTsKKwkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBmYWlsZWQsIGNvZGUgJWRcbiIsCisJCQlfX2Z1bmNfXywgaVJldHVybik7CiAKIAltdXRleF91bmxvY2soJnBkeC0+aW9fbXV0ZXgpOwogCkBAIC0xMzAyLDcgKzEzMDMsNyBAQAogCXVuc2lnbmVkIGludCB1U3RhdGUsIHVFcnI7CiAKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAJaVJldHVybiA9IEdldDE0MDFTdGF0ZShwZHgsICZ1U3RhdGUsICZ1RXJyKTsKIAltdXRleF91bmxvY2soJnBkeC0+aW9fbXV0ZXgpOwogCkBAIC0xMzE3LDE4ICsxMzE4LDE4IEBACiAqKiBib29rZWQgYW5kIGEgdHJhbnNmZXIgdG8gdGhhdCBhcmVhIGlzIGluIHByb2dyZXNzLiBPdGhlcndpc2UsIHdlIHdpbGwKICoqIHJlbGVhc2UgdGhlIGFyZWEgYW5kIHJlLWFzc2lnbiBpdC4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgU2V0Q2lyY3VsYXIoREVWSUNFX0VYVEVOU0lPTiAqcGR4LCBUUkFOU0ZFUkRFU0MgX191c2VyICpwVEQpCitpbnQgU2V0Q2lyY3VsYXIoREVWSUNFX0VYVEVOU0lPTiAqcGR4LCBzdHJ1Y3QgdHJhbnNmZXJfYXJlYV9kZXNjIF9fdXNlciAqcFREKQogewogCWludCBpUmV0dXJuOwogCWJvb2wgYlRvSG9zdDsKLQlUUkFOU0ZFUkRFU0MgdGQ7CisJc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYyB0ZDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmdGQsIHBURCwgc2l6ZW9mKHRkKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGFyZWE6JWQsIHNpemU6JTA4eCIsIF9fZnVuY19fLAotCQl0ZC53QXJlYU51bSwgdGQuZHdMZW5ndGgpOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogYXJlYTolZCwgc2l6ZTolMDh4XG4iLAorCQlfX2Z1bmNfXywgdGQud0FyZWFOdW0sIHRkLmR3TGVuZ3RoKTsKIAliVG9Ib3N0ID0gdGQuZVNpemUgIT0gMDsJLyogIHRoaXMgaXMgdXNlZCBhcyB0aGUgdG9ob3N0IGZsYWcgKi8KIAogCS8qICBUaGUgc3RyYW5nZSBjYXN0IGlzIGRvbmUgc28gdGhhdCB3ZSBkb24ndCBnZXQgd2FybmluZ3MgaW4gMzItYml0IGxpbnV4IGFib3V0IHRoZSBzaXplIG9mIHRoZSAqLwpAQCAtMTM1Myw3ICsxMzU0LDcgQEAKIAl1bnNpZ25lZCBpbnQgbkFyZWE7CiAJVENJUkNCTE9DSyBjYjsKIAotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmY2IsIHBDQiwgc2l6ZW9mKGNiKSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMTM3NCw3ICsxMzc1LDcgQEAKIAkJCQljYi5kd09mZnNldCA9IHBBcmVhLT5hQmxvY2tzWzBdLmR3T2Zmc2V0OwogCQkJCWNiLmR3U2l6ZSA9IHBBcmVhLT5hQmxvY2tzWzBdLmR3U2l6ZTsKIAkJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkiJXMgcmV0dXJuIGJsb2NrIDA6ICVkIGJ5dGVzIGF0ICVkIiwKKwkJCQkJIiVzOiByZXR1cm4gYmxvY2sgMDogJWQgYnl0ZXMgYXQgJWRcbiIsCiAJCQkJCV9fZnVuY19fLCBjYi5kd1NpemUsIGNiLmR3T2Zmc2V0KTsKIAkJCX0KIAkJfSBlbHNlCkBAIC0xNDAyLDcgKzE0MDMsNyBAQAogCXVuc2lnbmVkIGludCBuQXJlYSwgdVN0YXJ0LCB1U2l6ZTsKIAlUQ0lSQ0JMT0NLIGNiOwogCi0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjYiwgcENCLCBzaXplb2YoY2IpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xNDM3LDcgKzE0MzgsNyBAQAogCQkJCX0KIAogCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCSIlcyBmcmVlICVkIGJ5dGVzIGF0ICVkLCByZXR1cm4gJWQgYnl0ZXMgYXQgJWQsIHdhaXQ9JWQiLAorCQkJCQkiJXM6IGZyZWUgJWQgYnl0ZXMgYXQgJWQsIHJldHVybiAlZCBieXRlcyBhdCAlZCwgd2FpdD0lZFxuIiwKIAkJCQkJX19mdW5jX18sIHVTaXplLCB1U3RhcnQsCiAJCQkJCXBBcmVhLT5hQmxvY2tzWzBdLmR3U2l6ZSwKIAkJCQkJcEFyZWEtPmFCbG9ja3NbMF0uZHdPZmZzZXQsCkBAIC0xNDUzLDEzICsxNDU0LDEzIEBACiAJCQkJYldhaXRpbmcgPSBwZHgtPmJYRmVyV2FpdGluZzsKIAkJCQlpZiAoYldhaXRpbmcgJiYgcGR4LT5iU3RhZ2VkVXJiUGVuZGluZykgewogCQkJCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkJIiVzIEVSUk9SOiB3YWl0aW5nIHhmZXIgYW5kIHN0YWdlZCBVcmIgcGVuZGluZyEiLAorCQkJCQkJIiVzOiBFUlJPUjogd2FpdGluZyB4ZmVyIGFuZCBzdGFnZWQgVXJiIHBlbmRpbmchXG4iLAogCQkJCQkJX19mdW5jX18pOwogCQkJCQliV2FpdGluZyA9IGZhbHNlOwogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJIiVzIEVSUk9SOiBmcmVlaW5nICVkIGJ5dGVzIGF0ICVkLCBibG9jayAwIGlzICVkIGJ5dGVzIGF0ICVkIiwKKwkJCQkJIiVzOiBFUlJPUjogZnJlZWluZyAlZCBieXRlcyBhdCAlZCwgYmxvY2sgMCBpcyAlZCBieXRlcyBhdCAlZFxuIiwKIAkJCQkJX19mdW5jX18sIHVTaXplLCB1U3RhcnQsCiAJCQkJCXBBcmVhLT5hQmxvY2tzWzBdLmR3U2l6ZSwKIAkJCQkJcEFyZWEtPmFCbG9ja3NbMF0uZHdPZmZzZXQpOwpAQCAtMTQ3NSw3ICsxNDc2LDcgQEAKIAkJCQkJCSBwZHgtPnJETUFJbmZvLmR3U2l6ZSk7CiAJCQkJaWYgKFJXTVN0YXQgIT0gVTE0RVJSX05PRVJST1IpCiAJCQkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCQkiJXMgcncgc2V0dXAgZmFpbGVkICVkIiwKKwkJCQkJCSIlczogcncgc2V0dXAgZmFpbGVkICVkXG4iLAogCQkJCQkJX19mdW5jX18sIFJXTVN0YXQpOwogCQkJfQogCQl9IGVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL2NlZF9pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvY2VkX2lvY3RsLmgKaW5kZXggYWE2ODg3OC4uNGI2YzlkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvY2VkX2lvY3RsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvY2VkX2lvY3RsLmgKQEAgLTI2LDI0ICsyNiwyMSBAQAogKiogVHlwZURlZnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IFRCTE9DS0VOVFJZOwkvKiBpbmRleCB0aGUgYmxrIHRyYW5zZmVyIHRhYmxlIDAtNyAqLwotCi10eXBlZGVmIHN0cnVjdCBUcmFuc2ZlckRlc2Mgeworc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYyB7CiAJbG9uZyBsb25nIGxwdkJ1ZmY7CS8qIGFkZHJlc3Mgb2YgdHJhbnNmZXIgYXJlYSAoZm9yIDY0IG9yIDMyIGJpdCkgKi8KIAl1bnNpZ25lZCBpbnQgZHdMZW5ndGg7CS8qIGxlbmd0aCBvZiB0aGUgYXJlYSAqLwotCVRCTE9DS0VOVFJZIHdBcmVhTnVtOwkvKiBudW1iZXIgb2YgdHJhbnNmZXIgYXJlYSB0byBzZXQgdXAgKi8KKwl1bnNpZ25lZCBzaG9ydCB3QXJlYU51bTsJLyogbnVtYmVyIG9mIHRyYW5zZmVyIGFyZWEgdG8gc2V0IHVwICovCiAJc2hvcnQgZVNpemU7CQkvKiBlbGVtZW50IHNpemUgLSBpcyB0b2hvc3QgZmxhZyBmb3IgY2lyY3VsYXIgKi8KLX0gVFJBTlNGRVJERVNDOworfTsKIAotdHlwZWRlZiBUUkFOU0ZFUkRFU0MgKkxQVFJBTlNGRVJERVNDOwogCi10eXBlZGVmIHN0cnVjdCBUcmFuc2ZlckV2ZW50IHsKK3N0cnVjdCB0cmFuc2Zlcl9ldmVudCB7CiAJdW5zaWduZWQgaW50IGR3U3RhcnQ7CQkvKiBvZmZzZXQgaW50byB0aGUgYXJlYSAqLwogCXVuc2lnbmVkIGludCBkd0xlbmd0aDsJCS8qIGxlbmd0aCBvZiB0aGUgcmVnaW9uICovCiAJdW5zaWduZWQgc2hvcnQgd0FyZWFOdW07CS8qIHRoZSBhcmVhIG51bWJlciAqLwogCXVuc2lnbmVkIHNob3J0IHdGbGFnczsJCS8qIGJpdCAwIHNldCBmb3IgdG9Ib3N0ICovCiAJaW50IGlTZXRFdmVudDsJCQkvKiBjb3VsZCBiZSBkdW1teSBpbiBMSU5VWCAqLwotfSBUUkFOU0ZFUkVWRU5UOworfTsKIAogI2RlZmluZSBNQVhfVFJBTlNGRVJfU0laRQkweDQwMDAJCS8qIE1heGltdW0gZGF0YSBieXRlcyBwZXIgSVJQICovCiAjZGVmaW5lIE1BWF9BUkVBX0xFTkdUSAkJMHgxMDAwMDAJLyogTWF4aW11bSBzaXplIG9mIHRyYW5zZmVyIGFyZWEgKi8KQEAgLTg1LDEyICs4Miw2IEBACiAgKi8KICNkZWZpbmUgQ0VEX01BR0lDX0lPQyAweGNlCiAKLS8qIE5CTkI6IFJFQUQgYW5kIFdSSVRFIGFyZSBmcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIHRoZSBkZXZpY2UsIG5vdCB1c2VyLiAqLwotdHlwZWRlZiBzdHJ1Y3QgY2VkX2lvY19zdHJpbmcgewotCWludCBuQ2hhcnM7Ci0JY2hhciBidWZmZXJbMjU2XTsKLX0gQ0VEX0lPQ19TVFJJTkc7Ci0KICNkZWZpbmUgSU9DVExfQ0VEX1NFTkRTVFJJTkcobikJCV9JT0MoX0lPQ19XUklURSwgQ0VEX01BR0lDX0lPQywgMiwgbikKIAogI2RlZmluZSBJT0NUTF9DRURfUkVTRVQxNDAxCQlfSU8oQ0VEX01BR0lDX0lPQywgMykKQEAgLTEwMCw5ICs5MSw5IEBACiAjZGVmaW5lIElPQ1RMX0NFRF9MSU5FQ09VTlQJCV9JTyhDRURfTUFHSUNfSU9DLCA3KQogI2RlZmluZSBJT0NUTF9DRURfR0VUU1RSSU5HKG5NYXgpCV9JT0MoX0lPQ19SRUFELCBDRURfTUFHSUNfSU9DLCA4LCBuTWF4KQogCi0jZGVmaW5lIElPQ1RMX0NFRF9TRVRUUkFOU0ZFUgkJX0lPVyhDRURfTUFHSUNfSU9DLCAxMSwgVFJBTlNGRVJERVNDKQorI2RlZmluZSBJT0NUTF9DRURfU0VUVFJBTlNGRVIJCV9JT1coQ0VEX01BR0lDX0lPQywgMTEsIHN0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MpCiAjZGVmaW5lIElPQ1RMX0NFRF9VTlNFVFRSQU5TRkVSCQlfSU8oQ0VEX01BR0lDX0lPQywgMTIpCi0jZGVmaW5lIElPQ1RMX0NFRF9TRVRFVkVOVAkJX0lPVyhDRURfTUFHSUNfSU9DLCAxMywgVFJBTlNGRVJFVkVOVCkKKyNkZWZpbmUgSU9DVExfQ0VEX1NFVEVWRU5UCQlfSU9XKENFRF9NQUdJQ19JT0MsIDEzLCBzdHJ1Y3QgdHJhbnNmZXJfZXZlbnQpCiAjZGVmaW5lIElPQ1RMX0NFRF9HRVRPVVRCVUZTUEFDRQlfSU8oQ0VEX01BR0lDX0lPQywgMTQpCiAjZGVmaW5lIElPQ1RMX0NFRF9HRVRCQVNFQUREUkVTUwlfSU8oQ0VEX01BR0lDX0lPQywgMTUpCiAjZGVmaW5lIElPQ1RMX0NFRF9HRVREUklWRVJSRVZJU0lPTglfSU8oQ0VEX01BR0lDX0lPQywgMTYpCkBAIC0xMjYsNyArMTE3LDcgQEAKICNkZWZpbmUgSU9DVExfQ0VEX0RCR0dFVERBVEEJCV9JT1IoQ0VEX01BR0lDX0lPQywgMzksIFREQkdCTE9DSykKICNkZWZpbmUgSU9DVExfQ0VEX0RCR1NUT1BMT09QCQlfSU8oQ0VEX01BR0lDX0lPQywgNDApCiAjZGVmaW5lIElPQ1RMX0NFRF9GVUxMUkVTRVQJCV9JTyhDRURfTUFHSUNfSU9DLCA0MSkKLSNkZWZpbmUgSU9DVExfQ0VEX1NFVENJUkNVTEFSCQlfSU9XKENFRF9NQUdJQ19JT0MsIDQyLCBUUkFOU0ZFUkRFU0MpCisjZGVmaW5lIElPQ1RMX0NFRF9TRVRDSVJDVUxBUgkJX0lPVyhDRURfTUFHSUNfSU9DLCA0Miwgc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYykKICNkZWZpbmUgSU9DVExfQ0VEX0dFVENJUkNCTE9DSwkJX0lPV1IoQ0VEX01BR0lDX0lPQywgNDMsIFRDSVJDQkxPQ0spCiAjZGVmaW5lIElPQ1RMX0NFRF9GUkVFQ0lSQ0JMT0NLCQlfSU9XUihDRURfTUFHSUNfSU9DLCA0NCwgVENJUkNCTE9DSykKICNkZWZpbmUgSU9DVExfQ0VEX1dBSVRFVkVOVAkJX0lPKENFRF9NQUdJQ19JT0MsIDQ1KQpAQCAtMTk4LDcgKzE4OSw3IEBACiAJcmV0dXJuIGlvY3RsKGZoLCBJT0NUTF9DRURfR0VURFJJVkVSUkVWSVNJT04pOwogfQogCi1pbmxpbmUgaW50IENFRF9TZXRUcmFuc2ZlcihpbnQgZmgsIFRSQU5TRkVSREVTQyAqcFREKQoraW5saW5lIGludCBDRURfU2V0VHJhbnNmZXIoaW50IGZoLCBzdHJ1Y3QgdHJhbnNmZXJfYXJlYV9kZXNjICpwVEQpCiB7CiAJcmV0dXJuIGlvY3RsKGZoLCBJT0NUTF9DRURfU0VUVFJBTlNGRVIsIHBURCk7CiB9CkBAIC0yMDgsNyArMTk5LDcgQEAKIAlyZXR1cm4gaW9jdGwoZmgsIElPQ1RMX0NFRF9VTlNFVFRSQU5TRkVSLCBuQXJlYSk7CiB9CiAKLWlubGluZSBpbnQgQ0VEX1NldEV2ZW50KGludCBmaCwgVFJBTlNGRVJFVkVOVCAqcFRFKQoraW5saW5lIGludCBDRURfU2V0RXZlbnQoaW50IGZoLCBzdHJ1Y3QgdHJhbnNmZXJfZXZlbnQgKnBURSkKIHsKIAlyZXR1cm4gaW9jdGwoZmgsIElPQ1RMX0NFRF9TRVRFVkVOVCwgcFRFKTsKIH0KQEAgLTI5OSw3ICsyOTAsNyBAQAogCXJldHVybiBpb2N0bChmaCwgSU9DVExfQ0VEX0ZVTExSRVNFVCk7CiB9CiAKLWlubGluZSBpbnQgQ0VEX1NldENpcmN1bGFyKGludCBmaCwgVFJBTlNGRVJERVNDICpwVEQpCitpbmxpbmUgaW50IENFRF9TZXRDaXJjdWxhcihpbnQgZmgsIHN0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MgKnBURCkKIHsKIAlyZXR1cm4gaW9jdGwoZmgsIElPQ1RMX0NFRF9TRVRDSVJDVUxBUiwgcFREKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL3VzYjE0MDEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL3VzYjE0MDEuYwppbmRleCBlZmMzMTBjLi4yODRhYmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS91c2IxNDAxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNiMTQwMS5jCkBAIC0xNjYsNyArMTY2LDcgQEAKIAkJZ290byBleGl0OwogCX0KIAotCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAiJXMgZ290IHBkeCIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZpbnRlcmZhY2UtPmRldiwgIiVzOiBnb3QgcGR4XG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBpbmNyZW1lbnQgb3VyIHVzYWdlIGNvdW50IGZvciB0aGUgZGV2aWNlICovCiAJa3JlZl9nZXQoJnBkeC0+a3JlZik7CkBAIC0xODQsNyArMTg0LDcgQEAKIAkJCWdvdG8gZXhpdDsKIAkJfQogCX0gZWxzZSB7CQkvKiB1bmNvbW1lbnQgdGhpcyBibG9jayBpZiB5b3Ugd2FudCBleGNsdXNpdmUgb3BlbiAqLwotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIiVzIGZhaWw6IGFscmVhZHkgb3BlbiIsIF9fZnVuY19fKTsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICIlczogZmFpbDogYWxyZWFkeSBvcGVuXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHZhbCA9IC1FQlVTWTsKIAkJcGR4LT5vcGVuX2NvdW50LS07CiAJCW11dGV4X3VubG9jaygmcGR4LT5pb19tdXRleCk7CkBAIC0yMDcsNyArMjA3LDcgQEAKIAlpZiAocGR4ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGNhbGxlZCIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGNhbGxlZFxuIiwgX19mdW5jX18pOwogCW11dGV4X2xvY2soJnBkeC0+aW9fbXV0ZXgpOwogCWlmICghLS1wZHgtPm9wZW5fY291bnQgJiYgcGR4LT5pbnRlcmZhY2UpCS8qICBBbGxvdyBhdXRvc3VzcGVuZCAqLwogCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UocGR4LT5pbnRlcmZhY2UpOwpAQCAtMjI0LDEyICsyMjQsMTIgQEAKIAlpZiAocGR4ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGNoYXIgaW4gcGVuZD0lZCIsIF9fZnVuY19fLAotCQlwZHgtPmJSZWFkQ2hhcnNQZW5kaW5nKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGNoYXIgaW4gcGVuZD0lZFxuIiwKKwkJX19mdW5jX18sIHBkeC0+YlJlYWRDaGFyc1BlbmRpbmcpOwogCiAJLyogd2FpdCBmb3IgaW8gdG8gc3RvcCAqLwogCW11dGV4X2xvY2soJnBkeC0+aW9fbXV0ZXgpOwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBnb3QgaW9fbXV0ZXgiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBnb3QgaW9fbXV0ZXhcbiIsIF9fZnVuY19fKTsKIAljZWRfZHJhd19kb3duKHBkeCk7CiAKIAkvKiByZWFkIG91dCBlcnJvcnMsIGxlYXZlIHN1YnNlcXVlbnQgb3BlbnMgYSBjbGVhbiBzbGF0ZSAqLwpAQCAtMjM5LDcgKzIzOSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZwZHgtPmVycl9sb2NrKTsKIAogCW11dGV4X3VubG9jaygmcGR4LT5pb19tdXRleCk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGV4aXQgcmVhY2hlZCIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGV4aXQgcmVhY2hlZFxuIiwgX19mdW5jX18pOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTI3MCw3ICsyNzAsNyBAQAogCQkgICAgKHBVcmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8IHBVcmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVAogCQkgICAgIHx8IHBVcmItPnN0YXR1cyA9PSAtRVNIVVRET1dOKSkgewogCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCisJCQkJIiVzOiBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZFxuIiwKIAkJCQlfX2Z1bmNfXywgcFVyYi0+c3RhdHVzKTsKIAkJfQogCkBAIC0yODcsMTAgKzI4NywxMCBAQAogCQlwZHgtPmJTZW5kQ2hhcnNQZW5kaW5nID0gZmFsc2U7CS8qICBBbGxvdyBvdGhlciB0aHJlYWRzIGFnYWluICovCiAJCXNwaW5fdW5sb2NrKCZwZHgtPmNoYXJPdXRMb2NrKTsJLyogIGFscmVhZHkgYXQgaXJxIGxldmVsICovCiAJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkiJXMgLSBjaGFyIG91dCBkb25lLCAwIGNoYXJzIHNlbnQiLCBfX2Z1bmNfXyk7CisJCQkiJXM6IGNoYXIgb3V0IGRvbmUsIDAgY2hhcnMgc2VudFxuIiwgX19mdW5jX18pOwogCX0gZWxzZSB7CiAJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkiJXMgLSBjaGFyIG91dCBkb25lLCAlZCBjaGFycyBzZW50IiwgX19mdW5jX18sIG5Hb3QpOworCQkJIiVzOiBjaGFyIG91dCBkb25lLCAlZCBjaGFycyBzZW50XG4iLCBfX2Z1bmNfXywgbkdvdCk7CiAJCXNwaW5fbG9jaygmcGR4LT5jaGFyT3V0TG9jayk7CS8qICBhbHJlYWR5IGF0IGlycSBsZXZlbCAqLwogCQlwZHgtPmR3TnVtT3V0cHV0IC09IG5Hb3Q7CS8qICBOb3cgYWRqdXN0IHRoZSBjaGFyIHNlbmQgYnVmZmVyICovCiAJCXBkeC0+ZHdPdXRCdWZmR2V0ICs9IG5Hb3Q7CS8qICB0byBtYXRjaCB3aGF0IHdlIGRpZCAqLwpAQCAtMzE1LDE1ICszMTUsMTUgQEAKIAkJCSAgICBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKIAkJCXVzYl9hbmNob3JfdXJiKHBkeC0+cFVyYkNoYXJPdXQsICZwZHgtPnN1Ym1pdHRlZCk7CS8qICBpbiBjYXNlIHdlIG5lZWQgdG8ga2lsbCBpdCAqLwogCQkJaVJldHVybiA9IHVzYl9zdWJtaXRfdXJiKHBkeC0+cFVyYkNoYXJPdXQsIEdGUF9BVE9NSUMpOwotCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIG49JWQ+JXM8IiwgX19mdW5jX18sCi0JCQkJZHdDb3VudCwgcERhdCk7CisJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IG49JWQ+JXM8XG4iLAorCQkJCV9fZnVuY19fLCBkd0NvdW50LCBwRGF0KTsKIAkJCXNwaW5fbG9jaygmcGR4LT5jaGFyT3V0TG9jayk7CS8qICBncmFiIGxvY2sgZm9yIGVycm9ycyAqLwogCQkJaWYgKGlSZXR1cm4pIHsKIAkJCQlwZHgtPmJQaXBlRXJyb3JbblBpcGVdID0gMTsJLyogIEZsYWcgYW4gZXJyb3IgdG8gYmUgaGFuZGxlZCBsYXRlciAqLwogCQkJCXBkeC0+YlNlbmRDaGFyc1BlbmRpbmcgPSBmYWxzZTsJLyogIEFsbG93IG90aGVyIHRocmVhZHMgYWdhaW4gKi8KIAkJCQl1c2JfdW5hbmNob3JfdXJiKHBkeC0+cFVyYkNoYXJPdXQpOwogCQkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCSIlcyB1c2Jfc3VibWl0X3VyYigpIHJldHVybmVkICVkIiwKKwkJCQkJIiVzOiB1c2Jfc3VibWl0X3VyYigpIHJldHVybmVkICVkXG4iLAogCQkJCQlfX2Z1bmNfXywgaVJldHVybik7CiAJCQl9CiAJCX0gZWxzZQpAQCAtMzUwLDggKzM1MCw4IEBACiAJCXBkeC0+YlNlbmRDaGFyc1BlbmRpbmcgPSB0cnVlOwkvKiAgU2V0IGZsYWcgdG8gbG9jayBvdXQgb3RoZXIgdGhyZWFkcyAqLwogCiAJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkiU2VuZCAlZCBjaGFycyB0byAxNDAxLCBFUDAgZmxhZyAlZFxuIiwgZHdDb3VudCwKLQkJCXBkeC0+blBpcGVzID09IDMpOworCQkJIlNlbmQgJWQgY2hhcnMgdG8gMTQwMSwgRVAwIGZsYWcgJWRcbiIsCisJCQlkd0NvdW50LCBwZHgtPm5QaXBlcyA9PSAzKTsKIAkJLyogIElmIHdlIGhhdmUgb25seSAzIGVuZCBwb2ludHMgd2UgbXVzdCBzZW5kIHRoZSBjaGFyYWN0ZXJzIHRvIHRoZSAxNDAxIHVzaW5nIEVQMC4gKi8KIAkJaWYgKHBkeC0+blBpcGVzID09IDMpIHsKIAkJCS8qICBGb3IgRVAwIGNoYXJhY3RlciB0cmFuc21pc3Npb25zIHRvIHRoZSAxNDAxLCB3ZSBoYXZlIHRvIGhhbmcgYWJvdXQgdW50aWwgdGhleSAqLwpAQCAtMzc1LDExICszNzUsMTEgQEAKIAkJCQlpZiAoblNlbnQgPD0gMCkgewogCQkJCQlpUmV0dXJuID0gblNlbnQgPyBuU2VudCA6IC1FVElNRURPVVQ7CS8qICBpZiAwIGNoYXJzIHNheXMgd2UgdGltZWQgb3V0ICovCiAJCQkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCQkiU2VuZCAlZCBjaGFycyBieSBFUDAgZmFpbGVkOiAlZCIsCisJCQkJCQkiU2VuZCAlZCBjaGFycyBieSBFUDAgZmFpbGVkOiAlZFxuIiwKIAkJCQkJCW4sIGlSZXR1cm4pOwogCQkJCX0gZWxzZSB7CiAJCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCQkiU2VudCAlZCBjaGFycyBieSBFUDAiLCBuKTsKKwkJCQkJCSJTZW50ICVkIGNoYXJzIGJ5IEVQMFxuIiwgbik7CiAJCQkJCWNvdW50IC09IG5TZW50OwogCQkJCQlpbmRleCArPSBuU2VudDsKIAkJCQl9CkBAIC00MTYsOSArNDE2LDkgQEAKIAkJfQogCX0gZWxzZSBpZiAocGR4LT5iU2VuZENoYXJzUGVuZGluZyAmJiAocGR4LT5kd051bU91dHB1dCA+IDApKQogCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJIlNlbmRDaGFycyBiU2VuZENoYXJzUGVuZGluZzp0cnVlIik7CisJCQkiJXM6IGJTZW5kQ2hhcnNQZW5kaW5nOnRydWVcbiIsIF9fZnVuY19fKTsKIAotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICJTZW5kQ2hhcnMgZXhpdCBjb2RlOiAlZCIsIGlSZXR1cm4pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogZXhpdCBjb2RlOiAlZFxuIiwgX19mdW5jX18sIGlSZXR1cm4pOwogCXNwaW5fdW5sb2NrX2lycSgmcGR4LT5jaGFyT3V0TG9jayk7CS8qICBOb3cgbGV0IGdvIG9mIHRoZSBzcGlubG9jayAqLwogCXJldHVybiBpUmV0dXJuOwogfQpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAJCSAgICBwZHgtPlN0YWdlZERvbmUgKyBwZHgtPlN0YWdlZE9mZnNldCArIHBBcmVhLT5kd0Jhc2VPZmZzZXQ7CiAJCWNoYXIgKnBDb2hlckJ1ZiA9IHBkeC0+cENvaGVyU3RhZ2VkSU87CS8qICBjb2hlcmVudCBidWZmZXIgKi8KIAkJaWYgKCFwQXJlYS0+YlVzZWQpIHsKLQkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBhcmVhICVkIHVudXNlZCIsCisJCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGFyZWEgJWQgdW51c2VkXG4iLAogCQkJCV9fZnVuY19fLCBuQXJlYSk7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTQ3NCwyMSArNDc0LDIxIEBACiAJCQkJCW4gLT0gdWlYZmVyOwogCQkJCX0gZWxzZSB7CiAJCQkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCQkiJXMgZGlkIG5vdCBtYXAgcGFnZSAlZCIsCisJCQkJCQkiJXM6IGRpZCBub3QgbWFwIHBhZ2UgJWRcbiIsCiAJCQkJCQlfX2Z1bmNfXywgblBhZ2UpOwogCQkJCQlyZXR1cm47CiAJCQkJfQogCiAJCQl9IGVsc2UgewogCQkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCSIlcyBleGNlZWRlZCBwYWdlcyAlZCIsIF9fZnVuY19fLAotCQkJCQluUGFnZSk7CisJCQkJCSIlczogZXhjZWVkZWQgcGFnZXMgJWRcbiIsCisJCQkJCV9fZnVuY19fLCBuUGFnZSk7CiAJCQkJcmV0dXJuOwogCQkJfQogCQl9CiAJfSBlbHNlCi0JCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBiYWQgYXJlYSAlZCIsIF9fZnVuY19fLAotCQkJbkFyZWEpOworCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGJhZCBhcmVhICVkXG4iLAorCQkJX19mdW5jX18sIG5BcmVhKTsKIH0KIAogLyogIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBzdHVmZiB1c2VkIGNpcmN1bGFybHkgKi8KQEAgLTUxMywxMSArNTEzLDExIEBACiAJCSAgICAocFVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwgcFVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUCiAJCSAgICAgfHwgcFVyYi0+c3RhdHVzID09IC1FU0hVVERPV04pKSB7CiAJCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCSIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJCQkiJXM6IG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAogCQkJCV9fZnVuY19fLCBwVXJiLT5zdGF0dXMpOwogCQl9IGVsc2UKIAkJCWRldl9pbmZvKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCSAiJXMgLSBzdGFnZWQgeGZlciBjYW5jZWxsZWQiLCBfX2Z1bmNfXyk7CisJCQkJICIlczogc3RhZ2VkIHhmZXIgY2FuY2VsbGVkXG4iLCBfX2Z1bmNfXyk7CiAKIAkJc3Bpbl9sb2NrKCZwZHgtPmVycl9sb2NrKTsKIAkJcGR4LT5lcnJvcnMgPSBwVXJiLT5zdGF0dXM7CkBAIC01MjUsMjYgKzUyNSwyNiBAQAogCQluR290ID0gMDsJLyogICBhbmQgdGlkeSB1cCBhZ2FpbiBpZiBzbyAqLwogCQliQ2FuY2VsID0gdHJ1ZTsKIAl9IGVsc2UgewotCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgJWQgY2hhcnMgeGZlcnJlZCIsIF9fZnVuY19fLAotCQkJbkdvdCk7CisJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogJWQgY2hhcnMgeGZlcnJlZFxuIiwKKwkJCV9fZnVuY19fLCBuR290KTsKIAkJaWYgKHBkeC0+U3RhZ2VkUmVhZCkJLyogIGlmIHJlYWRpbmcsIHNhdmUgdG8gdXNlciBzcGFjZSAqLwogCQkJQ29weVVzZXJTcGFjZShwZHgsIG5Hb3QpOwkvKiAgY29weSBmcm9tIGJ1ZmZlciB0byB1c2VyICovCiAJCWlmIChuR290ID09IDApCi0JCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgWkxQIiwgX19mdW5jX18pOworCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBaTFBcbiIsIF9fZnVuY19fKTsKIAl9CiAKIAkvKiAgVXBkYXRlIHRoZSB0cmFuc2ZlciBsZW5ndGggYmFzZWQgb24gdGhlIFRyYW5zZmVyQnVmZmVyTGVuZ3RoIHZhbHVlIGluIHRoZSBVUkIgKi8KIAlwZHgtPlN0YWdlZERvbmUgKz0gbkdvdDsKIAotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcywgZG9uZSAlZCBieXRlcyBvZiAlZCIsIF9fZnVuY19fLAotCQlwZHgtPlN0YWdlZERvbmUsIHBkeC0+U3RhZ2VkTGVuZ3RoKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGRvbmUgJWQgYnl0ZXMgb2YgJWRcbiIsCisJCV9fZnVuY19fLCBwZHgtPlN0YWdlZERvbmUsIHBkeC0+U3RhZ2VkTGVuZ3RoKTsKIAogCWlmICgocGR4LT5TdGFnZWREb25lID09IHBkeC0+U3RhZ2VkTGVuZ3RoKSB8fAkvKiAgSWYgbm8gbW9yZSB0byBkbyAqLwogCSAgICAoYkNhbmNlbCkpIHsJCS8qICBvciB0aGlzIElSUCB3YXMgY2FuY2VsbGVkICovCiAJCVRSQU5TQVJFQSAqcEFyZWEgPSAmcGR4LT5yVHJhbnNEZWZbcGR4LT5TdGFnZWRJZF07CS8qICBUcmFuc2ZlciBhcmVhIGluZm8gKi8KIAkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCSIlcyB0cmFuc2ZlciBkb25lLCBieXRlcyAlZCwgY2FuY2VsICVkIiwgX19mdW5jX18sCi0JCQlwZHgtPlN0YWdlZERvbmUsIGJDYW5jZWwpOworCQkJIiVzOiB0cmFuc2ZlciBkb25lLCBieXRlcyAlZCwgY2FuY2VsICVkXG4iLAorCQkJX19mdW5jX18sIHBkeC0+U3RhZ2VkRG9uZSwgYkNhbmNlbCk7CiAKIAkJLyogIEhlcmUgaXMgd2hlcmUgd2Ugc29ydCBvdXQgd2hhdCB0byBkbyB3aXRoIHRoaXMgdHJhbnNmZXIgaWYgdXNpbmcgYSBjaXJjdWxhciBidWZmZXIuIFdlIGhhdmUgKi8KIAkJLyogICBhIGNvbXBsZXRlZCB0cmFuc2ZlciB0aGF0IGNhbiBiZSBhc3N1bWVkIHRvIGZpdCBpbnRvIHRoZSB0cmFuc2ZlciBhcmVhLiBXZSBzaG91bGQgYmUgYWJsZSB0byAqLwpAQCAtNTU5LDcgKzU1OSw3IEBACiAJCQkJCXBBcmVhLT5hQmxvY2tzWzFdLmR3U2l6ZSArPQogCQkJCQkgICAgcGR4LT5TdGFnZWRMZW5ndGg7CiAJCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCQkiUldNX0NvbXBsZXRlLCBjaXJjIGJsb2NrIDEgbm93ICVkIGJ5dGVzIGF0ICVkIiwKKwkJCQkJCSJSV01fQ29tcGxldGUsIGNpcmMgYmxvY2sgMSBub3cgJWQgYnl0ZXMgYXQgJWRcbiIsCiAJCQkJCQlwQXJlYS0+YUJsb2Nrc1sxXS5kd1NpemUsCiAJCQkJCQlwQXJlYS0+YUJsb2Nrc1sxXS5kd09mZnNldCk7CiAJCQkJfSBlbHNlIHsKQEAgLTU2OSw3ICs1NjksNyBAQAogCQkJCQlwQXJlYS0+YUJsb2Nrc1sxXS5kd1NpemUgPQogCQkJCQkgICAgcGR4LT5TdGFnZWRMZW5ndGg7CiAJCQkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCQkiJXMgRVJST1IsIGNpcmMgYmxvY2sgMSByZS1zdGFydGVkICVkIGJ5dGVzIGF0ICVkIiwKKwkJCQkJCSIlczogRVJST1IsIGNpcmMgYmxvY2sgMSByZS1zdGFydGVkICVkIGJ5dGVzIGF0ICVkXG4iLAogCQkJCQkJX19mdW5jX18sCiAJCQkJCQlwQXJlYS0+YUJsb2Nrc1sxXS5kd1NpemUsCiAJCQkJCQlwQXJlYS0+YUJsb2Nrc1sxXS5kd09mZnNldCk7CkBAIC01ODIsNyArNTgyLDcgQEAKIAkJCQkJICAgICBwQXJlYS0+YUJsb2Nrc1swXS5kd1NpemUpKSB7CiAJCQkJCQlwQXJlYS0+YUJsb2Nrc1swXS5kd1NpemUgKz0gcGR4LT5TdGFnZWRMZW5ndGg7CS8qICBKdXN0IGFkZCB0aGlzIHRyYW5zZmVyIGluICovCiAJCQkJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkJCSJSV01fQ29tcGxldGUsIGNpcmMgYmxvY2sgMCBub3cgJWQgYnl0ZXMgYXQgJWQiLAorCQkJCQkJCSJSV01fQ29tcGxldGUsIGNpcmMgYmxvY2sgMCBub3cgJWQgYnl0ZXMgYXQgJWRcbiIsCiAJCQkJCQkJcEFyZWEtPmFCbG9ja3NbMF0uCiAJCQkJCQkJZHdTaXplLAogCQkJCQkJCXBBcmVhLT5hQmxvY2tzWzBdLgpAQCAtNTkzLDcgKzU5Myw3IEBACiAJCQkJCQlwQXJlYS0+YUJsb2Nrc1sxXS5kd1NpemUgPQogCQkJCQkJICAgIHBkeC0+U3RhZ2VkTGVuZ3RoOwogCQkJCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCQkiUldNX0NvbXBsZXRlLCBjaXJjIGJsb2NrIDEgc3RhcnRlZCAlZCBieXRlcyBhdCAlZCIsCisJCQkJCQkJIlJXTV9Db21wbGV0ZSwgY2lyYyBibG9jayAxIHN0YXJ0ZWQgJWQgYnl0ZXMgYXQgJWRcbiIsCiAJCQkJCQkJcEFyZWEtPmFCbG9ja3NbMV0uCiAJCQkJCQkJZHdTaXplLAogCQkJCQkJCXBBcmVhLT5hQmxvY2tzWzFdLgpAQCAtNjA1LDcgKzYwNSw3IEBACiAJCQkJCXBBcmVhLT5hQmxvY2tzWzBdLmR3U2l6ZSA9CiAJCQkJCSAgICBwZHgtPlN0YWdlZExlbmd0aDsKIAkJCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSJSV01fQ29tcGxldGUsIGNpcmMgYmxvY2sgMCBzdGFydGVkICVkIGJ5dGVzIGF0ICVkIiwKKwkJCQkJCSJSV01fQ29tcGxldGUsIGNpcmMgYmxvY2sgMCBzdGFydGVkICVkIGJ5dGVzIGF0ICVkXG4iLAogCQkJCQkJcEFyZWEtPmFCbG9ja3NbMF0uZHdTaXplLAogCQkJCQkJcEFyZWEtPmFCbG9ja3NbMF0uZHdPZmZzZXQpOwogCQkJCX0KQEAgLTYxNCw3ICs2MTQsNyBAQAogCiAJCWlmICghYkNhbmNlbCkgeyAvKiAgRG9uJ3QgZ2VuZXJhdGUgYW4gZXZlbnQgaWYgY2FuY2VsbGVkICovCiAJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCSJSV01fQ29tcGxldGUsICBiQ2lyY3VsYXIgJWQsIGJUb0hvc3QgJWQsIGVTdGFydCAlZCwgZVNpemUgJWQiLAorCQkJCSJSV01fQ29tcGxldGUsICBiQ2lyY3VsYXIgJWQsIGJUb0hvc3QgJWQsIGVTdGFydCAlZCwgZVNpemUgJWRcbiIsCiAJCQkJcEFyZWEtPmJDaXJjdWxhciwgcEFyZWEtPmJFdmVudFRvSG9zdCwKIAkJCQlwQXJlYS0+ZHdFdmVudFN0LCBwQXJlYS0+ZHdFdmVudFN6KTsKIAkJCWlmICgocEFyZWEtPmR3RXZlbnRTeikgJiYJLyogIFNldCBhIHVzZXItbW9kZSBldmVudC4uLiAqLwpAQCAtNjQxLDcgKzY0MSw3IEBACiAKIAkJCQlpZiAoaVdha2VVcCkgewogCQkJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkJIkFib3V0IHRvIHNldCBldmVudCB0byBub3RpZnkgYXBwIik7CisJCQkJCQkiQWJvdXQgdG8gc2V0IGV2ZW50IHRvIG5vdGlmeSBhcHBcbiIpOwogCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBBcmVhLT53cUV2ZW50KTsJLyogIHdha2UgdXAgd2FpdGluZyBwcm9jZXNzZXMgKi8KIAkJCQkJKytwQXJlYS0+aVdha2VVcDsJLyogIGluY3JlbWVudCB3YWtldXAgY291bnQgKi8KIAkJCQl9CkBAIC02NTUsNyArNjU1LDcgQEAKIAkJCWlmIChwZHgtPmJYRmVyV2FpdGluZykgewkvKiAgR290IGEgYmxvY2sgeGZlciB3YWl0aW5nPyAqLwogCQkJCWludCBpUmV0dXJuOwogCQkJCWRldl9pbmZvKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkgIioqKiBSV01fQ29tcGxldGUgKioqIHBlbmRpbmcgdHJhbnNmZXIgd2lsbCBub3cgYmUgc2V0IHVwISEhIik7CisJCQkJCSAiKioqIFJXTV9Db21wbGV0ZSAqKiogcGVuZGluZyB0cmFuc2ZlciB3aWxsIG5vdyBiZSBzZXQgdXAhISFcbiIpOwogCQkJCWlSZXR1cm4gPQogCQkJCSAgICBSZWFkV3JpdGVNZW0ocGR4LCAhcGR4LT5yRE1BSW5mby5iT3V0V2FyZCwKIAkJCQkJCSBwZHgtPnJETUFJbmZvLndJZGVudCwKQEAgLTY2NCw3ICs2NjQsNyBAQAogCiAJCQkJaWYgKGlSZXR1cm4pCiAJCQkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCQkiUldNX0NvbXBsZXRlIHJ3IHNldHVwIGZhaWxlZCAlZCIsCisJCQkJCQkiUldNX0NvbXBsZXRlIHJ3IHNldHVwIGZhaWxlZCAlZFxuIiwKIAkJCQkJCWlSZXR1cm4pOwogCQkJfQogCQl9CkBAIC02ODUsNyArNjg1LDcgQEAKIAkvKiAgbm90IGJlIHVwc2V0IGJ5IGNoYXIgaW5wdXQgZHVyaW5nIERNQS4uLiBzaWdoLiBOZWVkcyBzb3J0aW5nIG91dC4gKi8KIAlpZiAoYlJlc3RhcnRDaGFySW5wdXQpCS8qICBtYXkgYmUgb3V0IG9mIGRhdGUsIGJ1dC4uLiAqLwogCQlBbGxvd2kocGR4KTsJLyogIC4uLkFsbG93aSB0ZXN0cyBhIGxvY2sgdG9vLiAqLwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBkb25lIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogZG9uZVxuIiwgX19mdW5jX18pOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNzA3LDcgKzcwNyw3IEBACiAJCXJldHVybiBVMTRFUlJfRkFJTDsKIAogCWlmICghQ2FuQWNjZXB0SW9SZXF1ZXN0cyhwZHgpKSB7CS8qICBnb3Qgc3VkZGVuIHJlbW92ZT8gKi8KLQkJZGV2X2luZm8oJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBzdWRkZW4gcmVtb3ZlLCBnaXZpbmcgdXAiLAorCQlkZXZfaW5mbygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBzdWRkZW4gcmVtb3ZlLCBnaXZpbmcgdXBcbiIsCiAJCQkgX19mdW5jX18pOwogCQlyZXR1cm4gVTE0RVJSX0ZBSUw7CS8qICBjb3VsZCBkbyB3aXRoIGEgYmV0dGVyIGVycm9yICovCiAJfQpAQCAtNzMxLDExICs3MzEsMTEgQEAKIAlpZiAoaVJldHVybikgewogCQl1c2JfdW5hbmNob3JfdXJiKHBkeC0+cFN0YWdlZFVyYik7CS8qICBraWxsIGl0ICovCiAJCXBkeC0+YlBpcGVFcnJvcltuUGlwZV0gPSAxOwkvKiAgRmxhZyBhbiBlcnJvciB0byBiZSBoYW5kbGVkIGxhdGVyICovCi0JCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBzdWJtaXQgdXJiIGZhaWxlZCwgY29kZSAlZCIsCisJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogc3VibWl0IHVyYiBmYWlsZWQsIGNvZGUgJWRcbiIsCiAJCQlfX2Z1bmNfXywgaVJldHVybik7CiAJfSBlbHNlCiAJCXBkeC0+YlN0YWdlZFVyYlBlbmRpbmcgPSB0cnVlOwkvKiAgU2V0IHRoZSBmbGFnIGZvciBzdGFnZWQgVVJCIHBlbmRpbmcgKi8KLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgZG9uZSBzbyBmYXI6JWQsIHRoaXMgc2l6ZTolZCIsCisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBkb25lIHNvIGZhcjolZCwgdGhpcyBzaXplOiVkXG4iLAogCQlfX2Z1bmNfXywgcGR4LT5TdGFnZWREb25lLCBDaHVua1NpemUpOwogCiAJcmV0dXJuIGlSZXR1cm47CkBAIC03NjQsMjggKzc2NCwyOCBAQAogCVRSQU5TQVJFQSAqcEFyZWEgPSAmcGR4LT5yVHJhbnNEZWZbd0lkZW50XTsJLyogIFRyYW5zZmVyIGFyZWEgaW5mbyAqLwogCiAJaWYgKCFDYW5BY2NlcHRJb1JlcXVlc3RzKHBkeCkpIHsJLyogIEFyZSB3ZSBpbiBhIHN0YXRlIHRvIGFjY2VwdCBuZXcgcmVxdWVzdHM/ICovCi0JCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBjYW4ndCBhY2NlcHQgcmVxdWVzdHMiLAorCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGNhbid0IGFjY2VwdCByZXF1ZXN0c1xuIiwKIAkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIFUxNEVSUl9GQUlMOwogCX0KIAogCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCSIlcyB4ZmVyICVkIGJ5dGVzIHRvICVzLCBvZmZzZXQgJWQsIGFyZWEgJWQiLCBfX2Z1bmNfXywgZHdMZW4sCi0JCVJlYWQgPyAiaG9zdCIgOiAiMTQwMSIsIGR3T2Zmcywgd0lkZW50KTsKKwkJIiVzOiB4ZmVyICVkIGJ5dGVzIHRvICVzLCBvZmZzZXQgJWQsIGFyZWEgJWRcbiIsCisJCV9fZnVuY19fLCBkd0xlbiwgUmVhZCA/ICJob3N0IiA6ICIxNDAxIiwgZHdPZmZzLCB3SWRlbnQpOwogCiAJLyogIEFtYXppbmdseSwgd2UgY2FuIGdldCBhbiBlc2NhcGUgc2VxdWVuY2UgYmFjayBiZWZvcmUgdGhlIGN1cnJlbnQgc3RhZ2VkIFVyYiBpcyBkb25lLCBzbyB3ZSAqLwogCS8qICAgaGF2ZSB0byBjaGVjayBmb3IgdGhpcyBzaXR1YXRpb24gYW5kLCBpZiBzbywgd2FpdCB1bnRpbCBhbGwgaXMgT0suICovCiAJaWYgKHBkeC0+YlN0YWdlZFVyYlBlbmRpbmcpIHsKIAkJcGR4LT5iWEZlcldhaXRpbmcgPSB0cnVlOwkvKiAgRmxhZyB3ZSBhcmUgd2FpdGluZyAqLwogCQlkZXZfaW5mbygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCSAiJXMgeGZlciBpcyB3YWl0aW5nLCBhcyBwcmV2aW91cyBzdGFnZWQgcGVuZGluZyIsCisJCQkgIiVzOiB4ZmVyIGlzIHdhaXRpbmcsIGFzIHByZXZpb3VzIHN0YWdlZCBwZW5kaW5nXG4iLAogCQkJIF9fZnVuY19fKTsKIAkJcmV0dXJuIFUxNEVSUl9OT0VSUk9SOwogCX0KIAogCWlmIChkd0xlbiA9PSAwKSB7CQkvKiAgYWxsb3cgMC1sZW4gcmVhZCBvciB3cml0ZTsganVzdCByZXR1cm4gc3VjY2VzcyAqLwogCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJIiVzIE9LOyB6ZXJvLWxlbiByZWFkL3dyaXRlIHJlcXVlc3QiLCBfX2Z1bmNfXyk7CisJCQkiJXM6IE9LOyB6ZXJvLWxlbiByZWFkL3dyaXRlIHJlcXVlc3RcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIFUxNEVSUl9OT0VSUk9SOwogCX0KIApAQCAtNzk1LDcgKzc5NSw3IEBACiAJCWJvb2wgYldhaXQgPSBmYWxzZTsJLyogIEZsYWcgZm9yIHRyYW5zZmVyIGhhdmluZyB0byB3YWl0ICovCiAKIAkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCSJDaXJjdWxhciBidWZmZXJzIGFyZSAlZCBhdCAlZCBhbmQgJWQgYXQgJWQiLAorCQkJIkNpcmN1bGFyIGJ1ZmZlcnMgYXJlICVkIGF0ICVkIGFuZCAlZCBhdCAlZFxuIiwKIAkJCXBBcmVhLT5hQmxvY2tzWzBdLmR3U2l6ZSwgcEFyZWEtPmFCbG9ja3NbMF0uZHdPZmZzZXQsCiAJCQlwQXJlYS0+YUJsb2Nrc1sxXS5kd1NpemUsIHBBcmVhLT5hQmxvY2tzWzFdLmR3T2Zmc2V0KTsKIAkJaWYgKHBBcmVhLT5hQmxvY2tzWzFdLmR3U2l6ZSA+IDApIHsJLyogIFVzaW5nIHRoZSBzZWNvbmQgYmxvY2sgYWxyZWFkeT8gKi8KQEAgLTgxOSwxNCArODE5LDE0IEBACiAJCWlmIChiV2FpdCkgewkvKiAgVGhpcyB0cmFuc2ZlciB3aWxsIGhhdmUgdG8gd2FpdD8gKi8KIAkJCXBkeC0+YlhGZXJXYWl0aW5nID0gdHJ1ZTsJLyogIEZsYWcgd2UgYXJlIHdhaXRpbmcgKi8KIAkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJIiVzIHhmZXIgd2FpdGluZyBmb3IgY2lyY3VsYXIgYnVmZmVyIHNwYWNlIiwKKwkJCQkiJXM6IHhmZXIgd2FpdGluZyBmb3IgY2lyY3VsYXIgYnVmZmVyIHNwYWNlXG4iLAogCQkJCV9fZnVuY19fKTsKIAkJCXJldHVybiBVMTRFUlJfTk9FUlJPUjsKIAkJfQogCiAJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkiJXMgY2lyY3VsYXIgeGZlciwgJWQgYnl0ZXMgc3RhcnRpbmcgYXQgJWQiLCBfX2Z1bmNfXywKLQkJCWR3TGVuLCBkd09mZnMpOworCQkJIiVzOiBjaXJjdWxhciB4ZmVyLCAlZCBieXRlcyBzdGFydGluZyBhdCAlZFxuIiwKKwkJCV9fZnVuY19fLCBkd0xlbiwgZHdPZmZzKTsKIAl9CiAJLyogIFNhdmUgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSByZWFkXHdyaXRlIHRyYW5zZmVyICovCiAJcGR4LT5TdGFnZWRSZWFkID0gUmVhZDsJLyogIFNhdmUgdGhlIHBhcmFtZXRlcnMgZm9yIHRoaXMgcmVhZCAqLwpAQCAtOTQ4LDcgKzk0OCw3IEBACiAJdW5zaWduZWQgY2hhciB1Y0RhdGE7CiAJdW5zaWduZWQgaW50IGREb25lID0gMDsJLyogIFdlIGhhdmVuJ3QgcGFyc2VkIGFueXRoaW5nIHNvIGZhciAqLwogCi0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJaWYgKFJlYWRDaGFyKCZ1Y0RhdGEsIHBCdWYsICZkRG9uZSwgZHdDb3VudCkpIHsKIAkJdW5zaWduZWQgY2hhciB1Y1RyYW5zQ29kZSA9ICh1Y0RhdGEgJiAweDBGKTsJLyogIGdldCBjb2RlIGZvciB0cmFuc2ZlciB0eXBlICovCkBAIC05NjAsOCArOTYwLDggQEAKIAkJcERtYURlc2MtPmR3U2l6ZSA9IDA7CS8qICBpbml0aWFsaXNlIG90aGVyIGJpdHMgKi8KIAkJcERtYURlc2MtPmR3T2Zmc2V0ID0gMDsKIAotCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgdHlwZTogJWQgaWRlbnQ6ICVkIiwgX19mdW5jX18sCi0JCQlwRG1hRGVzYy0+d1RyYW5zVHlwZSwgcERtYURlc2MtPndJZGVudCk7CisJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogdHlwZTogJWQgaWRlbnQ6ICVkXG4iLAorCQkJX19mdW5jX18sIHBEbWFEZXNjLT53VHJhbnNUeXBlLCBwRG1hRGVzYy0+d0lkZW50KTsKIAogCQlwRG1hRGVzYy0+Yk91dFdhcmQgPSAodWNUcmFuc0NvZGUgIT0gVE1fRVhUVE9IT1NUKTsJLyogIHNldCB0cmFuc2ZlciBkaXJlY3Rpb24gKi8KIApAQCAtOTc2LDcgKzk3Niw3IEBACiAJCQkJCQkmZERvbmUsIGR3Q291bnQpOwogCQkJCWlmIChiUmVzdWx0KSB7CiAJCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCQkiJXMgeGZlciBvZmZzZXQgJiBzaXplICVkICVkIiwKKwkJCQkJCSIlczogeGZlciBvZmZzZXQgJiBzaXplICVkICVkXG4iLAogCQkJCQkJX19mdW5jX18sIHBEbWFEZXNjLT5kd09mZnNldCwKIAkJCQkJCXBEbWFEZXNjLT5kd1NpemUpOwogCkBAIC05ODksNyArOTg5LDcgQEAKIAkJCQkJICAgICAgZHdMZW5ndGgpKSkgewogCQkJCQkJYlJlc3VsdCA9IGZhbHNlOwkvKiAgYmFkIHBhcmFtZXRlcihzKSAqLwogCQkJCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCQkiJXMgYmFkIHBhcmFtIC0gaWQgJWQsIGJVc2VkICVkLCBvZmZzZXQgJWQsIHNpemUgJWQsIGFyZWEgbGVuZ3RoICVkIiwKKwkJCQkJCQkiJXM6IGJhZCBwYXJhbSAtIGlkICVkLCBiVXNlZCAlZCwgb2Zmc2V0ICVkLCBzaXplICVkLCBhcmVhIGxlbmd0aCAlZFxuIiwKIAkJCQkJCQlfX2Z1bmNfXywgd0lkZW50LAogCQkJCQkJCXBkeC0+clRyYW5zRGVmW3dJZGVudF0uCiAJCQkJCQkJYlVzZWQsCkBAIC0xMDA4LDcgKzEwMDgsNyBAQAogCQliUmVzdWx0ID0gZmFsc2U7CiAKIAlpZiAoIWJSZXN1bHQpCQkvKiAgbm93IGNoZWNrIHBhcmFtZXRlcnMgZm9yIHZhbGlkaXR5ICovCi0JCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBlcnJvciByZWFkaW5nIEVzYyBzZXF1ZW5jZSIsCisJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogZXJyb3IgcmVhZGluZyBFc2Mgc2VxdWVuY2VcbiIsCiAJCQlfX2Z1bmNfXyk7CiAKIAlyZXR1cm4gYlJlc3VsdDsKQEAgLTEwNDUsMTUgKzEwNDUsMTUgQEAKIAkJCXVuc2lnbmVkIHNob3J0IHdUcmFuc1R5cGUgPSBwZHgtPnJETUFJbmZvLndUcmFuc1R5cGU7CS8qICBjaGVjayB0cmFuc2ZlciB0eXBlICovCiAKIAkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJIiVzIHhmZXIgdG8gJXMsIG9mZnNldCAlZCwgbGVuZ3RoICVkIiwgX19mdW5jX18sCisJCQkJIiVzOiB4ZmVyIHRvICVzLCBvZmZzZXQgJWQsIGxlbmd0aCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywKIAkJCQlwZHgtPnJETUFJbmZvLmJPdXRXYXJkID8gIjE0MDEiIDogImhvc3QiLAogCQkJCXBkeC0+ckRNQUluZm8uZHdPZmZzZXQsIHBkeC0+ckRNQUluZm8uZHdTaXplKTsKIAogCQkJaWYgKHBkeC0+YlhGZXJXYWl0aW5nKSB7IC8qICBDaGVjayBoZXJlIGZvciBiYWRseSBvdXQgb2Yga2lsdGVyLi4uICovCiAJCQkJLyogIFRoaXMgY2FuIG5ldmVyIGhhcHBlbiwgcmVhbGx5ICovCiAJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJIkVSUk9SOiBETUEgc2V0dXAgd2hpbGUgdHJhbnNmZXIgc3RpbGwgd2FpdGluZyIpOwotCQkJCXNwaW5fdW5sb2NrKCZwZHgtPnN0YWdlZExvY2spOworCQkJCQkiRVJST1I6IERNQSBzZXR1cCB3aGlsZSB0cmFuc2ZlciBzdGlsbCB3YWl0aW5nXG4iKTsKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKCh3VHJhbnNUeXBlID09IFRNX0VYVFRPSE9TVCkKIAkJCQkgICAgfHwgKHdUcmFuc1R5cGUgPT0gVE1fRVhUVE8xNDAxKSkgewpAQCAtMTA2NiwyMSArMTA2NiwyMSBAQAogCQkJCQkJCSBwZHgtPnJETUFJbmZvLmR3U2l6ZSk7CiAJCQkJCWlmIChpUmV0dXJuICE9IFUxNEVSUl9OT0VSUk9SKQogCQkJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCQkiJXMgUmVhZFdyaXRlTWVtKCkgZmFpbGVkICVkIiwKKwkJCQkJCQkiJXM6IFJlYWRXcml0ZU1lbSgpIGZhaWxlZCAlZFxuIiwKIAkJCQkJCQlfX2Z1bmNfXywgaVJldHVybik7CiAJCQkJfSBlbHNlCS8qICBUaGlzIGNvdmVycyBub24tbGluZWFyIHRyYW5zZmVyIHNldHVwICovCiAJCQkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCQkiJXMgVW5rbm93biBibG9jayB4ZmVyIHR5cGUgJWQiLAorCQkJCQkJIiVzOiBVbmtub3duIGJsb2NrIHhmZXIgdHlwZSAlZFxuIiwKIAkJCQkJCV9fZnVuY19fLCB3VHJhbnNUeXBlKTsKIAkJCX0KIAkJfSBlbHNlCQkvKiAgRmFpbGVkIHRvIHJlYWQgcGFyYW1ldGVycyAqLwotCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIFJlYWRETUFJbmZvKCkgZmFpbCIsCisJCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IFJlYWRETUFJbmZvKCkgZmFpbFxuIiwKIAkJCQlfX2Z1bmNfXyk7CiAKIAkJc3Bpbl91bmxvY2soJnBkeC0+c3RhZ2VkTG9jayk7CS8qICBPSyBoZXJlICovCiAJfQogCi0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgaVJldHVybik7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiByZXR1cm5zICVkXG4iLCBfX2Z1bmNfXywgaVJldHVybik7CiAKIAlyZXR1cm4gaVJldHVybjsKIH0KQEAgLTExMDAsMTEgKzExMDAsMTEgQEAKIAkJICAgIChwVXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fCBwVXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQKIAkJICAgICB8fCBwVXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikpIHsKIAkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAorCQkJCSIlczogbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCiAJCQkJX19mdW5jX18sIHBVcmItPnN0YXR1cyk7CiAJCX0gZWxzZQogCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkiJXMgLSAwIGNoYXJzIHBVcmItPnN0YXR1cz0lZCAoc2h1dGRvd24/KSIsCisJCQkJIiVzOiAwIGNoYXJzIHBVcmItPnN0YXR1cz0lZCAoc2h1dGRvd24/KVxuIiwKIAkJCQlfX2Z1bmNfXywgcFVyYi0+c3RhdHVzKTsKIAogCQlzcGluX2xvY2soJnBkeC0+ZXJyX2xvY2spOwpAQCAtMTEyNSw3ICsxMTI1LDcgQEAKIAkJCQlpZiAobkdvdCA8IElOQlVGX1NaKSB7CiAJCQkJCXBkeC0+cENvaGVyQ2hhckluW25Hb3RdID0gMDsJLyogIHRpZHkgdGhlIHN0cmluZyAqLwogCQkJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkJIiVzIGdvdCAlZCBjaGFycyA+JXM8IiwKKwkJCQkJCSIlczogZ290ICVkIGNoYXJzID4lczxcbiIsCiAJCQkJCQlfX2Z1bmNfXywgbkdvdCwKIAkJCQkJCXBkeC0+cENvaGVyQ2hhckluKTsKIAkJCQl9CkBAIC0xMTQwLDcgKzExNDAsNyBAQAogCQkJCWlmICgocGR4LT5kd051bUlucHV0ICsgbkdvdCkgPD0gSU5CVUZfU1opCiAJCQkJCXBkeC0+ZHdOdW1JbnB1dCArPSBuR290OwkvKiAgQWRqdXN0IHRoZSBidWZmZXIgY291bnQgYWNjb3JkaW5nbHkgKi8KIAkJCX0gZWxzZQotCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyByZWFkIFpMUCIsCisJCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiByZWFkIFpMUFxuIiwKIAkJCQkJX19mdW5jX18pOwogCQl9CiAJfQpAQCAtMTE3OCw3ICsxMTc4LDcgQEAKIAkJdW5zaWduZWQgaW50IG5NYXggPSBJTkJVRl9TWiAtIHBkeC0+ZHdOdW1JbnB1dDsJLyogIG1heCB3ZSBjb3VsZCByZWFkICovCiAJCWludCBuUGlwZSA9IHBkeC0+blBpcGVzID09IDQgPyAxIDogMDsJLyogIFRoZSBwaXBlIG51bWJlciB0byB1c2UgKi8KIAotCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgJWQgY2hhcnMgaW4gaW5wdXQgYnVmZmVyIiwKKwkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiAlZCBjaGFycyBpbiBpbnB1dCBidWZmZXJcbiIsCiAJCQlfX2Z1bmNfXywgcGR4LT5kd051bUlucHV0KTsKIAogCQl1c2JfZmlsbF9pbnRfdXJiKHBkeC0+cFVyYkNoYXJJbiwgcGR4LT51ZGV2LApAQCAtMTE5Miw3ICsxMTkyLDggQEAKIAkJCXVzYl91bmFuY2hvcl91cmIocGR4LT5wVXJiQ2hhckluKTsJLyogIHJlbW92ZSBmcm9tIGxpc3Qgb2YgYWN0aXZlIFVyYnMgKi8KIAkJCXBkeC0+YlBpcGVFcnJvcltuUGlwZV0gPSAxOwkvKiAgRmxhZyBhbiBlcnJvciB0byBiZSBoYW5kbGVkIGxhdGVyICovCiAJCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCSIlcyBzdWJtaXQgdXJiIGZhaWxlZDogJWQiLCBfX2Z1bmNfXywgaVJldHVybik7CisJCQkJIiVzOiBzdWJtaXQgdXJiIGZhaWxlZDogJWRcbiIsCisJCQkJX19mdW5jX18sIGlSZXR1cm4pOwogCQl9IGVsc2UKIAkJCXBkeC0+YlJlYWRDaGFyc1BlbmRpbmcgPSB0cnVlOwkvKiAgRmxhZyB0aGF0IHdlIGFyZSBhY3RpdmUgaGVyZSAqLwogCX0KQEAgLTEyNTAsMTMgKzEyNTEsMTMgQEAKIAkJcmV0dXJuIEdldFN0cmluZyhwZHgsIChjaGFyIF9fdXNlciAqKXVsQXJnLCBfSU9DX1NJWkUoY21kKSk7CiAKIAljYXNlIF9JT0NfTlIoSU9DVExfQ0VEX1NFVFRSQU5TRkVSKToKLQkJcmV0dXJuIFNldFRyYW5zZmVyKHBkeCwgKFRSQU5TRkVSREVTQyBfX3VzZXIgKikgdWxBcmcpOworCQlyZXR1cm4gU2V0VHJhbnNmZXIocGR4LCAoc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYyBfX3VzZXIgKikgdWxBcmcpOwogCiAJY2FzZSBfSU9DX05SKElPQ1RMX0NFRF9VTlNFVFRSQU5TRkVSKToKIAkJcmV0dXJuIFVuc2V0VHJhbnNmZXIocGR4LCAoaW50KXVsQXJnKTsKIAogCWNhc2UgX0lPQ19OUihJT0NUTF9DRURfU0VURVZFTlQpOgotCQlyZXR1cm4gU2V0RXZlbnQocGR4LCAoVFJBTlNGRVJFVkVOVCBfX3VzZXIgKikgdWxBcmcpOworCQlyZXR1cm4gU2V0RXZlbnQocGR4LCAoc3RydWN0IHRyYW5zZmVyX2V2ZW50IF9fdXNlciAqKSB1bEFyZyk7CiAKIAljYXNlIF9JT0NfTlIoSU9DVExfQ0VEX0dFVE9VVEJVRlNQQUNFKToKIAkJcmV0dXJuIEdldE91dEJ1ZlNwYWNlKHBkeCk7CkBAIC0xMzE1LDcgKzEzMTYsNyBAQAogCQlicmVhazsKIAogCWNhc2UgX0lPQ19OUihJT0NUTF9DRURfU0VUQ0lSQ1VMQVIpOgotCQlyZXR1cm4gU2V0Q2lyY3VsYXIocGR4LCAoVFJBTlNGRVJERVNDIF9fdXNlciAqKSB1bEFyZyk7CisJCXJldHVybiBTZXRDaXJjdWxhcihwZHgsIChzdHJ1Y3QgdHJhbnNmZXJfYXJlYV9kZXNjIF9fdXNlciAqKSB1bEFyZyk7CiAKIAljYXNlIF9JT0NfTlIoSU9DVExfQ0VEX0dFVENJUkNCTE9DSyk6CiAJCXJldHVybiBHZXRDaXJjQmxvY2socGR4LCAoVENJUkNCTE9DSyBfX3VzZXIgKikgdWxBcmcpOwpAQCAtMTM5Nyw3ICsxMzk4LDcgQEAKIAllbHNlIGlmICgoaSA+PSAxKSAmJiAoaSA8PSAyMykpCiAJCXBkeC0+czE0MDFUeXBlID0gaSArIDI7CiAJZWxzZSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiJXMgVW5rbm93biBkZXZpY2UuIGJjZERldmljZSA9ICVkIiwKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICIlczogVW5rbm93biBkZXZpY2UuIGJjZERldmljZSA9ICVkXG4iLAogCQkJX19mdW5jX18sIGJjZERldmljZSk7CiAJCWdvdG8gZXJyb3I7CiAJfQpAQCAtMTQwNSw3ICsxNDA2LDcgQEAKIAkvKiAgd2Uga25vdyB0aGF0IHdlIGFyZSBkZWFsaW5nIHdpdGggYSAxNDAxIGRldmljZS4gKi8KIAlpZmFjZV9kZXNjID0gaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZzsKIAlwZHgtPm5QaXBlcyA9IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsKLQlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICIxNDAxVHlwZT0lZCB3aXRoICVkIEVuZCBQb2ludHMiLAorCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIjE0MDFUeXBlPSVkIHdpdGggJWQgRW5kIFBvaW50c1xuIiwKIAkJIHBkeC0+czE0MDFUeXBlLCBwZHgtPm5QaXBlcyk7CiAJaWYgKChwZHgtPm5QaXBlcyA8IDMpIHx8IChwZHgtPm5QaXBlcyA+IDQpKQogCQlnb3RvIGVycm9yOwpAQCAtMTQxNSw3ICsxNDE2LDcgQEAKIAlwZHgtPnBVcmJDaGFySW4gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwkvKiAgY2hhcmFjdGVyIGlucHV0IFVSQiAqLwogCXBkeC0+cFN0YWdlZFVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CS8qICBibG9jayB0cmFuc2ZlciBVUkIgKi8KIAlpZiAoIXBkeC0+cFVyYkNoYXJPdXQgfHwgIXBkeC0+cFVyYkNoYXJJbiB8fCAhcGR4LT5wU3RhZ2VkVXJiKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiJXMgVVJCIGFsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICIlczogVVJCIGFsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOwogCQlnb3RvIGVycm9yOwogCX0KIApAQCAtMTQyOSw3ICsxNDMwLDcgQEAKIAkgICAgdXNiX2FsbG9jX2NvaGVyZW50KHBkeC0+dWRldiwgSU5CVUZfU1osIEdGUF9LRVJORUwsCiAJCQkgICAgICAgJnBkeC0+cFVyYkNoYXJJbi0+dHJhbnNmZXJfZG1hKTsKIAlpZiAoIXBkeC0+cENvaGVyQ2hhck91dCB8fCAhcGR4LT5wQ29oZXJDaGFySW4gfHwgIXBkeC0+cENvaGVyU3RhZ2VkSU8pIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICIlcyBDb2hlcmVudCBidWZmZXIgYWxsb2MgZmFpbGVkIiwKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICIlczogQ29oZXJlbnQgYnVmZmVyIGFsbG9jIGZhaWxlZFxuIiwKIAkJCV9fZnVuY19fKTsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC0xNDM3LDE5ICsxNDM4LDE5IEBACiAJZm9yIChpID0gMDsgaSA8IHBkeC0+blBpcGVzOyArK2kpIHsKIAkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKIAkJcGR4LT5lcEFkZHJbaV0gPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKLQkJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiUGlwZSAlZCwgZXAgYWRkcmVzcyAlMDJ4IiwgaSwKLQkJCSBwZHgtPmVwQWRkcltpXSk7CisJCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIlBpcGUgJWQsIGVwIGFkZHJlc3MgJTAyeFxuIiwKKwkJCSBpLCBwZHgtPmVwQWRkcltpXSk7CiAJCWlmICgoKHBkeC0+blBpcGVzID09IDMpICYmIChpID09IDApKSB8fAkvKiAgaWYgY2hhciBpbnB1dCBlbmQgcG9pbnQgKi8KIAkJICAgICgocGR4LT5uUGlwZXMgPT0gNCkgJiYgKGkgPT0gMSkpKSB7CiAJCQlwZHgtPmJJbnRlcnZhbCA9IGVuZHBvaW50LT5iSW50ZXJ2YWw7CS8qICBzYXZlIHRoZSBlbmRwb2ludCBpbnRlcnJ1cHQgaW50ZXJ2YWwgKi8KLQkJCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIlBpcGUgJWQsIGJJbnRlcnZhbCA9ICVkIiwgaSwKLQkJCQkgcGR4LT5iSW50ZXJ2YWwpOworCQkJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiUGlwZSAlZCwgYkludGVydmFsID0gJWRcbiIsCisJCQkJIGksIHBkeC0+YkludGVydmFsKTsKIAkJfQogCQkvKiAgRGV0ZWN0IFVTQjIgYnkgY2hlY2tpbmcgbGFzdCBlcCBzaXplICg2NCBpZiBVU0IxKSAqLwogCQlpZiAoaSA9PSBwZHgtPm5QaXBlcyAtIDEpIHsJLyogIGlmIHRoaXMgaXMgdGhlIGxhc3QgZXAgKGJ1bGspICovCiAJCQlwZHgtPmJJc1VTQjIgPQogCQkJICAgIGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkgPiA2NDsKLQkJCWRldl9pbmZvKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiVVNCJWQiLAorCQkJZGV2X2luZm8oJnBkeC0+aW50ZXJmYWNlLT5kZXYsICJVU0IlZFxuIiwKIAkJCQkgcGR4LT5iSXNVU0IyICsgMSk7CiAJCX0KIAl9CkBAIC0xNDYyLDE0ICsxNDYzLDE0IEBACiAJaWYgKHJldHZhbCkgewogCQkvKiBzb21ldGhpbmcgcHJldmVudGVkIHVzIGZyb20gcmVnaXN0ZXJpbmcgdGhpcyBkcml2ZXIgKi8KIAkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsCi0JCQkiTm90IGFibGUgdG8gZ2V0IGEgbWlub3IgZm9yIHRoaXMgZGV2aWNlLlxuIik7CisJCQkiTm90IGFibGUgdG8gZ2V0IGEgbWlub3IgZm9yIHRoaXMgZGV2aWNlXG4iKTsKIAkJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOwogCQlnb3RvIGVycm9yOwogCX0KIAogCS8qIGxldCB0aGUgdXNlciBrbm93IHdoYXQgbm9kZSB0aGlzIGRldmljZSBpcyBub3cgYXR0YWNoZWQgdG8gKi8KIAlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsCi0JCSAiVVNCIENFRFVTQiBkZXZpY2Ugbm93IGF0dGFjaGVkIHRvIGNlZHVzYiAjJWQiLAorCQkgIlVTQiBDRURVU0IgZGV2aWNlIG5vdyBhdHRhY2hlZCB0byBjZWR1c2IgIyVkXG4iLAogCQkgaW50ZXJmYWNlLT5taW5vcik7CiAJcmV0dXJuIDA7CiAKQEAgLTE0OTMsNyArMTQ5NCw3IEBACiAJZm9yIChpID0gMDsgaSA8IE1BWF9UUkFOU0FSRUFTOyArK2kpIHsKIAkJaW50IGlFcnIgPSBDbGVhckFyZWEocGR4LCBpKTsJLyogIC4uLnJlbGVhc2UgYW55IHVzZWQgbWVtb3J5ICovCiAJCWlmIChpRXJyID09IFUxNEVSUl9VTkxPQ0tGQUlMKQotCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIEFyZWEgJWQgd2FzIGluIHVzZWQiLAorCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBBcmVhICVkIHdhcyBpbiB1c2VkXG4iLAogCQkJCV9fZnVuY19fLCBpKTsKIAl9CiAJcGR4LT5pbnRlcmZhY2UgPSBOVUxMOwkvKiAgLi4ud2Uga2lsbCBvZmYgbGluayB0byBpbnRlcmZhY2UgKi8KQEAgLTE1MDMsNyArMTUwNCw3IEBACiAKIAlrcmVmX3B1dCgmcGR4LT5rcmVmLCBjZWRfZGVsZXRlKTsJLyogIGRlY3JlbWVudCBvdXIgdXNhZ2UgY291bnQgKi8KIAotCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIlVTQiBjZWR1c2IgIyVkIG5vdyBkaXNjb25uZWN0ZWQiLCBtaW5vcik7CisJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiVVNCIGNlZHVzYiAjJWQgbm93IGRpc2Nvbm5lY3RlZFxuIiwgbWlub3IpOwogfQogCiAvKiAgV2FpdCBmb3IgYWxsIHRoZSB1cmJzIHdlIGtub3cgb2YgdG8gYmUgZG9uZSB3aXRoLCB0aGVuIGtpbGwgb2ZmIGFueSB0aGF0ICovCkBAIC0xNTEzLDEzICsxNTE0LDEzIEBACiB2b2lkIGNlZF9kcmF3X2Rvd24oREVWSUNFX0VYVEVOU0lPTiAqcGR4KQogewogCWludCB0aW1lOwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBjYWxsZWQiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBjYWxsZWRcbiIsIF9fZnVuY19fKTsKIAogCXBkeC0+YkluRHJhd0Rvd24gPSB0cnVlOwogCXRpbWUgPSB1c2Jfd2FpdF9hbmNob3JfZW1wdHlfdGltZW91dCgmcGR4LT5zdWJtaXR0ZWQsIDMwMDApOwogCWlmICghdGltZSkgewkJLyogIGlmIHdlIHRpbWVkIG91dCB3ZSBraWxsIHRoZSB1cmJzICovCiAJCXVzYl9raWxsX2FuY2hvcmVkX3VyYnMoJnBkeC0+c3VibWl0dGVkKTsKLQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIHRpbWVkIG91dCIsIF9fZnVuY19fKTsKKwkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiB0aW1lZCBvdXRcbiIsIF9fZnVuY19fKTsKIAl9CiAJcGR4LT5iSW5EcmF3RG93biA9IGZhbHNlOwogfQpAQCAtMTUzMSw3ICsxNTMyLDcgQEAKIAkJcmV0dXJuIDA7CiAJY2VkX2RyYXdfZG93bihwZHgpOwogCi0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGNhbGxlZCIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGNhbGxlZFxuIiwgX19mdW5jX18pOwogCXJldHVybiAwOwogfQogCkBAIC0xNTQwLDE0ICsxNTQxLDE0IEBACiAJREVWSUNFX0VYVEVOU0lPTiAqcGR4ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAlpZiAoIXBkeCkKIAkJcmV0dXJuIDA7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGNhbGxlZCIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGNhbGxlZFxuIiwgX19mdW5jX18pOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGNlZF9wcmVfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJREVWSUNFX0VYVEVOU0lPTiAqcGR4ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7CiAJY2VkX2RyYXdfZG93bihwZHgpOwogCXJldHVybiAwOwpAQCAtMTU1Niw3ICsxNTU3LDcgQEAKIHN0YXRpYyBpbnQgY2VkX3Bvc3RfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJREVWSUNFX0VYVEVOU0lPTiAqcGR4ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiB3ZSBhcmUgc3VyZSBubyBVUkJzIGFyZSBhY3RpdmUgLSBubyBsb2NraW5nIG5lZWRlZCAqLwogCXBkeC0+ZXJyb3JzID0gLUVQSVBFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNiMTQwMS5oIGIvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNiMTQwMS5oCmluZGV4IGYwMzFlM2EuLmVhMGZlNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL3VzYjE0MDEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS91c2IxNDAxLmgKQEAgLTIxOCw5ICsyMTgsOSBAQAogZXh0ZXJuIGludCBSZXNldDE0MDEoREVWSUNFX0VYVEVOU0lPTiAqcGR4KTsKIGV4dGVybiBpbnQgR2V0Q2hhcihERVZJQ0VfRVhURU5TSU9OICpwZHgpOwogZXh0ZXJuIGludCBHZXRTdHJpbmcoREVWSUNFX0VYVEVOU0lPTiAqcGR4LCBjaGFyIF9fdXNlciAqcFVzZXIsIGludCBuKTsKLWV4dGVybiBpbnQgU2V0VHJhbnNmZXIoREVWSUNFX0VYVEVOU0lPTiAqcGR4LCBUUkFOU0ZFUkRFU0MgX191c2VyICpwVEQpOworZXh0ZXJuIGludCBTZXRUcmFuc2ZlcihERVZJQ0VfRVhURU5TSU9OICpwZHgsIHN0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MgX191c2VyICpwVEQpOwogZXh0ZXJuIGludCBVbnNldFRyYW5zZmVyKERFVklDRV9FWFRFTlNJT04gKnBkeCwgaW50IG5BcmVhKTsKLWV4dGVybiBpbnQgU2V0RXZlbnQoREVWSUNFX0VYVEVOU0lPTiAqcGR4LCBUUkFOU0ZFUkVWRU5UIF9fdXNlciAqcFRFKTsKK2V4dGVybiBpbnQgU2V0RXZlbnQoREVWSUNFX0VYVEVOU0lPTiAqcGR4LCBzdHJ1Y3QgdHJhbnNmZXJfZXZlbnQgX191c2VyICpwVEUpOwogZXh0ZXJuIGludCBTdGF0MTQwMShERVZJQ0VfRVhURU5TSU9OICpwZHgpOwogZXh0ZXJuIGludCBMaW5lQ291bnQoREVWSUNFX0VYVEVOU0lPTiAqcGR4KTsKIGV4dGVybiBpbnQgR2V0T3V0QnVmU3BhY2UoREVWSUNFX0VYVEVOU0lPTiAqcGR4KTsKQEAgLTIzOCw3ICsyMzgsNyBAQAogZXh0ZXJuIGludCBEYmdSYW1wQWRkcihERVZJQ0VfRVhURU5TSU9OICpwZHgsIFREQkdCTE9DSyBfX3VzZXIgKnBEQik7CiBleHRlcm4gaW50IERiZ0dldERhdGEoREVWSUNFX0VYVEVOU0lPTiAqcGR4LCBUREJHQkxPQ0sgX191c2VyICpwREIpOwogZXh0ZXJuIGludCBEYmdTdG9wTG9vcChERVZJQ0VfRVhURU5TSU9OICpwZHgpOwotZXh0ZXJuIGludCBTZXRDaXJjdWxhcihERVZJQ0VfRVhURU5TSU9OICpwZHgsIFRSQU5TRkVSREVTQyBfX3VzZXIgKnBURCk7CitleHRlcm4gaW50IFNldENpcmN1bGFyKERFVklDRV9FWFRFTlNJT04gKnBkeCwgc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYyBfX3VzZXIgKnBURCk7CiBleHRlcm4gaW50IEdldENpcmNCbG9jayhERVZJQ0VfRVhURU5TSU9OICpwZHgsIFRDSVJDQkxPQ0sgX191c2VyICpwQ0IpOwogZXh0ZXJuIGludCBGcmVlQ2lyY0Jsb2NrKERFVklDRV9FWFRFTlNJT04gKnBkeCwgVENJUkNCTE9DSyBfX3VzZXIgKnBDQik7CiBleHRlcm4gaW50IFdhaXRFdmVudChERVZJQ0VfRVhURU5TSU9OICpwZHgsIGludCBuQXJlYSwgaW50IG1zVGltZU91dCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS91c2UxNF9pb2MuaCBiL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL3VzZTE0X2lvYy5oCmluZGV4IDk3ZDc5MTMuLjQyZDJlNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL3VzZTE0X2lvYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL3VzZTE0X2lvYy5oCkBAIC0yNzYsMTUgKzI3NiwxNCBAQAogCiB0eXBlZGVmIFBBUkFNQkxLKiAgIFBQQVJBTUJMSzsKIAotdHlwZWRlZiBzdHJ1Y3QgVHJhbnNmZXJEZXNjICAgICAgICAgIC8qIFN0cnVjdHVyZSBhbmQgdHlwZSBmb3IgU2V0VHJhbnNBcmVhICovCitzdHJ1Y3QgdHJhbnNmZXJfYXJlYV9kZXNjICAgICAgICAgIC8qIFN0cnVjdHVyZSBhbmQgdHlwZSBmb3IgU2V0VHJhbnNBcmVhICovCiB7CiAJdW5zaWduZWQgc2hvcnQgICAgICAgIHdBcmVhOyAgICAgICAgICAgIC8qIG51bWJlciBvZiB0cmFuc2ZlciBhcmVhIHRvIHNldCB1cCAgICAgICAqLwogCXZvaWQgRkFSICpscHZCdWZmOyAgICAgICAgICAvKiBhZGRyZXNzIG9mIHRyYW5zZmVyIGFyZWEgICAgICAgICAgICAgICAgKi8KIAl1bnNpZ25lZCBpbnQgICAgICAgZHdMZW5ndGg7ICAgICAgICAgLyogbGVuZ3RoIG9mIGFyZWEgdG8gc2V0IHVwICAgICAgICAgICAgICAgICovCiAJc2hvcnQgICAgICAgZVNpemU7ICAgICAgICAgICAgLyogc2l6ZSB0byBtb3ZlIChmb3Igc3dhcHBpbmcgb24gTUFDKSAgICAgICovCi19IFRSQU5TRkVSREVTQzsKK307CiAKLXR5cGVkZWYgVFJBTlNGRVJERVNDIEZBUiAqTFBUUkFOU0ZFUkRFU0M7CiAKIC8qIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB1c2VkIHRvIHNldCB1cCBhIHRyYW5zZmVyIGFyZWEgKi8KIHR5cGVkZWYgc3RydWN0IFZYVHJhbnNmZXJEZXNjICAgIC8qIHVzZTE0MDEuYyBhbmQgdXNlMTQzMngueCB1c2Ugb25seSAgICAgICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNlcnNwYWNlL3VzZTE0MDEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL3VzZXJzcGFjZS91c2UxNDAxLmMKaW5kZXggYzliYzJlYi4uN2I4YTIyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNlcnNwYWNlL3VzZTE0MDEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS91c2Vyc3BhY2UvdXNlMTQwMS5jCkBAIC0yMjMxLDcgKzIyMzEsNyBAQAogVTE0QVBJKHNob3J0KSBVMTRTZXRUcmFuc0FyZWEoc2hvcnQgaGFuZCwgdW5zaWduZWQgc2hvcnQgd0FyZWEsIHZvaWQgKnB2QnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkd0xlbmd0aCwgc2hvcnQgZVN6KQogewotICAgIFRSQU5TRkVSREVTQyB0ZDsKKyAgICBzdHJ1Y3QgdHJhbnNmZXJfYXJlYV9kZXNjIHRkOwogICAgIHNob3J0IHNFcnIgPSBDaGVja0hhbmRsZShoYW5kKTsKICAgICBpZiAoc0VyciAhPSBVMTRFUlJfTk9FUlJPUikKICAgICAgICAgcmV0dXJuIHNFcnI7CkBAIC0yMjkyLDcgKzIyOTIsNyBAQAogICAgICAgICB0ZC5lU2l6ZSA9IDA7ICAgICAgICAgICAgICAgIC8vIER1bW15IGVsZW1lbnQgc2l6ZQogCiAgICAgICAgIGlmIChEZXZpY2VJb0NvbnRyb2woYUhhbmQxNDAxW2hhbmRdLCh1bnNpZ25lZCBpbnQpVTE0X1NFVFRSQU5TRkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZCxzaXplb2YoVFJBTlNGRVJERVNDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGQsc2l6ZW9mKHN0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyV29yayxzaXplb2YoUEFSQU1CTEspLCZkd0J5dGVzLE5VTEwpKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoZHdCeXRlcyA+PSBzaXplb2YoUEFSQU1CTEspKSAgICAvLyBtYXliZSBlcnJvciBmcm9tIGRyaXZlcj8KQEAgLTI0OTYsMTQgKzI0OTYsMTQgQEAKICAgICB7CiAgICAgICAgIFBBUkFNQkxLIHJXb3JrOwogICAgICAgICB1bnNpZ25lZCBpbnQgZHdCeXRlczsKLSAgICAgICAgVFJBTlNGRVJERVNDIHR4RGVzYzsKKyAgICAgICAgc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYyB0eERlc2M7CiAgICAgICAgIHR4RGVzYy53QXJlYSA9IHdBcmVhOyAgICAgICAgICAgICAvKiBQdXJlIE5UIC0gcHV0IGRhdGEgaW50byBzdHJ1Y3QgKi8KICAgICAgICAgdHhEZXNjLmxwdkJ1ZmYgPSBwdkJ1ZmY7CiAgICAgICAgIHR4RGVzYy5kd0xlbmd0aCA9IGR3TGVuZ3RoOwogICAgICAgICB0eERlc2MuZVNpemUgPSAoc2hvcnQpYlRvSG9zdDsgICAgICAgLyogVXNlIHRoaXMgZm9yIGRpcmVjdGlvbiBmbGFnICovCiAgICAKICAgICAgICAgaWYgKERldmljZUlvQ29udHJvbChhSGFuZDE0MDFbaGFuZF0sKHVuc2lnbmVkIGludClVMTRfU0VUQ0lSQ1VMQVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmdHhEZXNjLCBzaXplb2YoVFJBTlNGRVJERVNDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eERlc2MsIHNpemVvZihzdHJ1Y3QgdHJhbnNmZXJfYXJlYV9kZXNjKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyV29yaywgc2l6ZW9mKFBBUkFNQkxLKSwmZHdCeXRlcyxOVUxMKSkKICAgICAgICAgewogICAgICAgICAgICBpZiAoZHdCeXRlcyA+PSBzaXplb2YoUEFSQU1CTEspKSAgICAgICAgICAvKiBlcnJvciBmcm9tIGRyaXZlcj8gKi8KQEAgLTI1MjgsNyArMjUyOCw3IEBACiAjaWZkZWYgTElOVVgKICAgICBlbHNlCiAgICAgewotICAgICAgICBUUkFOU0ZFUkRFU0MgdGQ7CisgICAgICAgIHN0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MgdGQ7CiAgICAgICAgIHRkLmxwdkJ1ZmYgPSAobG9uZyBsb25nKSgodW5zaWduZWQgbG9uZylwdkJ1ZmYpOwogICAgICAgICB0ZC53QXJlYU51bSA9IHdBcmVhOwogICAgICAgICB0ZC5kd0xlbmd0aCA9IGR3TGVuZ3RoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnCmluZGV4IDg5ZTI1YjQuLjcwM2M1ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWcKQEAgLTE3Nyw2ICsxNzcsNyBAQAogY29uZmlnIENPTUVESV9QQ0w4MTIKIAl0cmlzdGF0ZSAiQWR2YW50ZWNoIFBDTC04MTIvODEzIGFuZCBBRGxpbmsgQUNMLTgxMTIvODExMy84MTEzLzgyMTYiCiAJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUyAmJiBJU0FfRE1BX0FQSQorCXNlbGVjdCBDT01FRElfRkMKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQWR2YW50ZWNoIFBDTC04MTIvUEcsIFBDTC04MTMvQiwgQURMaW5rCiAJICBBQ0wtODExMkRHL0hHL1BHLCBBQ0wtODExMywgQUNMLTgyMTYsIElDUCBEQVMgQS04MjFQR0gvUEdML1BHTC1OREEsCkBAIC0xODgsNiArMTg5LDcgQEAKIGNvbmZpZyBDT01FRElfUENMODE2CiAJdHJpc3RhdGUgIkFkdmFudGVjaCBQQ0wtODE0IGFuZCBQQ0wtODE2IElTQSBjYXJkIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUyAmJiBJU0FfRE1BX0FQSQorCXNlbGVjdCBDT01FRElfRkMKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQWR2YW50ZWNoIFBDTC04MTQgYW5kIFBDTC04MTYgSVNBIGNhcmRzCiAKQEAgLTE5Nyw2ICsxOTksNyBAQAogY29uZmlnIENPTUVESV9QQ0w4MTgKIAl0cmlzdGF0ZSAiQWR2YW50ZWNoIFBDTC03MTggYW5kIFBDTC04MTggSVNBIGNhcmQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTICYmIElTQV9ETUFfQVBJCisJc2VsZWN0IENPTUVESV9GQwogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBZHZhbnRlY2ggUENMLTgxOCBJU0EgY2FyZHMKIAkgIFBDTC04MThMLCBQQ0wtODE4SCwgUENMLTgxOEhELCBQQ0wtODE4SEcsIFBDTC04MTggYW5kIFBDTC03MTgKQEAgLTI1Nyw2ICsyNjAsMTQgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQogCSAgY2FsbGVkIHJ0aTgwMi4KIAorY29uZmlnIENPTUVESV9EQUMwMgorCXRyaXN0YXRlICJLZWl0aGxleSBNZXRyYWJ5dGUgREFDMDIgY29tcGF0aWJsZSBJU0EgY2FyZCBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBLZWl0aGxleSBNZXRyYWJ5dGUgREFDMDIgY29tcGF0aWJsZSBJU0EgY2FyZHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGRhYzAyLgorCiBjb25maWcgQ09NRURJX0RBUzE2TTEKIAl0cmlzdGF0ZSAiTWVhc3VyZW1lbnRDb21wdXRpbmcgQ0lPLURBUzE2L00xREFTLTE2IElTQSBjYXJkIHN1cHBvcnQiCiAJc2VsZWN0IENPTUVESV84MjU1CkBAIC01NTksMTUgKzU3MCw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCBtdWx0aXEzLgogCi1jb25maWcgQ09NRURJX1BPQwotCXRyaXN0YXRlICJHZW5lcmljIGRyaXZlciBmb3IgdmVyeSBzaW1wbGUgZGV2aWNlcyIKLQktLS1oZWxwLS0tCi0JICBFbmFibGUgZ2VuZXJpYyBzdXBwb3J0IGZvciB2ZXJ5IHNpbXBsZSAvIFBPQyAoUGllY2Ugb2YgQ3JhcCkgYm9hcmRzLAotCSAgS2VpdGhsZXkgTWV0cmFieXRlIERBQy0wMiAoZGFjMDIpLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKLQkgIGNhbGxlZCBwb2MuCi0KIGNvbmZpZyBDT01FRElfUzUyNgogCXRyaXN0YXRlICJTZW5zb3JheSBzNTI2IHN1cHBvcnQiCiAJLS0taGVscC0tLQpAQCAtNzUzLDYgKzc1NSw3IEBACiAKIGNvbmZpZyBDT01FRElfQURWX1BDSTE3MTAKIAl0cmlzdGF0ZSAiQWR2YW50ZWNoIFBDSS0xNzF4LCBQQ0ktMTcyMCBhbmQgUENJLTE3MzEgc3VwcG9ydCIKKwlzZWxlY3QgQ09NRURJX0ZDCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFkdmFudGVjaCBQQ0ktMTcxMCwgUENJLTE3MTBIRywgUENJLTE3MTEsCiAJICBQQ0ktMTcxMywgUENJLTE3MjAgYW5kIFBDSS0xNzMxCkBAIC04NTYsNiArODU5LDcgQEAKIAogY29uZmlnIENPTUVESV9EVDMwMDAKIAl0cmlzdGF0ZSAiRGF0YSBUcmFuc2xhdGlvbiBEVDMwMDAgc2VyaWVzIHN1cHBvcnQiCisJc2VsZWN0IENPTUVESV9GQwogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBEYXRhIFRyYW5zbGF0aW9uIERUMzAwMCBzZXJpZXMKIAkgIERUMzAwMSwgRFQzMDAxLVBHTCwgRFQzMDAyLCBEVDMwMDMsIERUMzAwMy1QR0wsIERUMzAwNCwgRFQzMDA1IGFuZApAQCAtMTEwMSw2ICsxMTA1LDcgQEAKIAogY29uZmlnIENPTUVESV9NSVRFCiAJZGVwZW5kcyBvbiBIQVNfRE1BCisJc2VsZWN0IENPTUVESV9GQwogCXRyaXN0YXRlCiAKIGNvbmZpZyBDT01FRElfTklfVElPQ01ECkBAIC0xMTc5LDYgKzExODQsNyBAQAogCiBjb25maWcgQ09NRURJX1FVQVRFQ0hfREFRUF9DUwogCXRyaXN0YXRlICJRdWF0ZWNoIERBUVAgUENNQ0lBIGRhdGEgY2FwdHVyZSBjYXJkIHN1cHBvcnQiCisJc2VsZWN0IENPTUVESV9GQwogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgUXVhdGVjaCBEQVFQIFBDTUNJQSBkYXRhIGNhcHR1cmUgY2FyZHMKIAkgIERBUVAtMjA4IGFuZCBEQVFQLTMwOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jCmluZGV4IGMyMmM2MTcuLmVhNmRjMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CiAKIAljb21lZGlfZGV2X3B1dChkZXYpOwotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVpXG4iLCBzaXplKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgc2l6ZSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IG1heF9yZWFkX2J1ZmZlcl9rYl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpjc2RldiwKQEAgLTM1Myw3ICszNTMsNyBAQAogCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CiAKIAljb21lZGlfZGV2X3B1dChkZXYpOwotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVpXG4iLCBzaXplKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgc2l6ZSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHJlYWRfYnVmZmVyX2tiX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmNzZGV2LApAQCAtNDEwLDcgKzQxMCw3IEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKIAogCWNvbWVkaV9kZXZfcHV0KGRldik7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWlcbiIsIHNpemUpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCBzaXplKTsKIH0KIAogc3RhdGljIHNzaXplX3QgbWF4X3dyaXRlX2J1ZmZlcl9rYl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpjc2RldiwKQEAgLTQ2Niw3ICs0NjYsNyBAQAogCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CiAKIAljb21lZGlfZGV2X3B1dChkZXYpOwotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVpXG4iLCBzaXplKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgc2l6ZSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHdyaXRlX2J1ZmZlcl9rYl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpjc2RldiwKQEAgLTExOTQsNiArMTE5NCwxMSBAQAogCQlzd2l0Y2ggKGluc24tPmluc24pIHsKIAkJY2FzZSBJTlNOX1JFQUQ6CiAJCQlyZXQgPSBzLT5pbnNuX3JlYWQoZGV2LCBzLCBpbnNuLCBkYXRhKTsKKwkJCWlmIChyZXQgPT0gLUVUSU1FRE9VVCkgeworCQkJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsCisJCQkJCSJzdWJkZXZpY2UgJWQgcmVhZCBpbnN0cnVjdGlvbiB0aW1lZCBvdXRcbiIsCisJCQkJCXMtPmluZGV4KTsKKwkJCX0KIAkJCWJyZWFrOwogCQljYXNlIElOU05fV1JJVEU6CiAJCQltYXhkYXRhID0gcy0+bWF4ZGF0YV9saXN0CkBAIC0xMjA3LDggKzEyMTIsMTQgQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQotCQkJaWYgKHJldCA9PSAwKQorCQkJaWYgKHJldCA9PSAwKSB7CiAJCQkJcmV0ID0gcy0+aW5zbl93cml0ZShkZXYsIHMsIGluc24sIGRhdGEpOworCQkJCWlmIChyZXQgPT0gLUVUSU1FRE9VVCkgeworCQkJCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LAorCQkJCQkJInN1YmRldmljZSAlZCB3cml0ZSBpbnN0cnVjdGlvbiB0aW1lZCBvdXRcbiIsCisJCQkJCQlzLT5pbmRleCk7CisJCQkJfQorCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgSU5TTl9CSVRTOgogCQkJaWYgKGluc24tPm4gIT0gMikgewpAQCAtMTQwNSw0MSArMTQxNiw5NCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgX19jb21lZGlfZ2V0X3VzZXJfY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBjb21lZGlfY21kIF9fdXNlciAqYXJnLAorCQkJCSBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQoreworCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGNtZCwgYXJnLCBzaXplb2YoKmNtZCkpKSB7CisJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJiYWQgY21kIGFkZHJlc3NcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoY21kLT5zdWJkZXYgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIiVkIG5vIHN1Y2ggc3ViZGV2aWNlXG4iLCBjbWQtPnN1YmRldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXMgPSAmZGV2LT5zdWJkZXZpY2VzW2NtZC0+c3ViZGV2XTsKKworCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX1VOVVNFRCkgeworCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiJWQgbm90IHZhbGlkIHN1YmRldmljZVxuIiwgY21kLT5zdWJkZXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoIXMtPmRvX2NtZCB8fCAhcy0+ZG9fY21kdGVzdCB8fCAhcy0+YXN5bmMpIHsKKwkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwKKwkJCSJzdWJkZXZpY2UgJWQgZG9lcyBub3Qgc3VwcG9ydCBjb21tYW5kc1xuIiwgY21kLT5zdWJkZXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBtYWtlIHN1cmUgY2hhbm5lbC9nYWluIGxpc3QgaXNuJ3QgdG9vIGxvbmcgKi8KKwlpZiAoY21kLT5jaGFubGlzdF9sZW4gPiBzLT5sZW5fY2hhbmxpc3QpIHsKKwkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgImNoYW5uZWwvZ2FpbiBsaXN0IHRvbyBsb25nICVkID4gJWRcbiIsCisJCQljbWQtPmNoYW5saXN0X2xlbiwgcy0+bGVuX2NoYW5saXN0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19jb21lZGlfZ2V0X3VzZXJfY2hhbmxpc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgX191c2VyICp1c2VyX2NoYW5saXN0LAorCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCit7CisJdW5zaWduZWQgaW50ICpjaGFubGlzdDsKKwlpbnQgcmV0OworCisJLyogdXNlcl9jaGFubGlzdCBjb3VsZCBiZSBOVUxMIGZvciBkb19jbWR0ZXN0IGlvY3RscyAqLworCWlmICghdXNlcl9jaGFubGlzdCkKKwkJcmV0dXJuIDA7CisKKwljaGFubGlzdCA9IG1lbWR1cF91c2VyKHVzZXJfY2hhbmxpc3QsCisJCQkgICAgICAgY21kLT5jaGFubGlzdF9sZW4gKiBzaXplb2YodW5zaWduZWQgaW50KSk7CisJaWYgKElTX0VSUihjaGFubGlzdCkpCisJCXJldHVybiBQVFJfRVJSKGNoYW5saXN0KTsKKworCS8qIG1ha2Ugc3VyZSBlYWNoIGVsZW1lbnQgaW4gY2hhbm5lbC9nYWluIGxpc3QgaXMgdmFsaWQgKi8KKwlyZXQgPSBjb21lZGlfY2hlY2tfY2hhbmxpc3QocywgY21kLT5jaGFubGlzdF9sZW4sIGNoYW5saXN0KTsKKwlpZiAocmV0IDwgMCkgeworCQlrZnJlZShjaGFubGlzdCk7CisJCXJldHVybiByZXQ7CisJfQorCisJY21kLT5jaGFubGlzdCA9IGNoYW5saXN0OworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZG9fY21kX2lvY3RsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgY29tZWRpX2NtZCBfX3VzZXIgKmFyZywgdm9pZCAqZmlsZSkKIHsKIAlzdHJ1Y3QgY29tZWRpX2NtZCBjbWQ7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmM7Ci0JaW50IHJldCA9IDA7CiAJdW5zaWduZWQgaW50IF9fdXNlciAqdXNlcl9jaGFubGlzdDsKKwlpbnQgcmV0OwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGFyZywgc2l6ZW9mKGNtZCkpKSB7Ci0JCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJiYWQgY21kIGFkZHJlc3NcbiIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9CisJLyogZ2V0IHRoZSB1c2VyJ3MgY21kIGFuZCBkbyBzb21lIHNpbXBsZSB2YWxpZGF0aW9uICovCisJcmV0ID0gX19jb21lZGlfZ2V0X3VzZXJfY21kKGRldiwgYXJnLCAmY21kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJLyogc2F2ZSB1c2VyJ3MgY2hhbmxpc3QgcG9pbnRlciBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgbGF0ZXIgKi8KIAl1c2VyX2NoYW5saXN0ID0gKHVuc2lnbmVkIGludCBfX3VzZXIgKiljbWQuY2hhbmxpc3Q7CiAKLQlpZiAoY21kLnN1YmRldiA+PSBkZXYtPm5fc3ViZGV2aWNlcykgewotCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiJWQgbm8gc3VjaCBzdWJkZXZpY2VcbiIsIGNtZC5zdWJkZXYpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KIAlzID0gJmRldi0+c3ViZGV2aWNlc1tjbWQuc3ViZGV2XTsKIAlhc3luYyA9IHMtPmFzeW5jOwogCi0JaWYgKHMtPnR5cGUgPT0gQ09NRURJX1NVQkRfVU5VU0VEKSB7Ci0JCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICIlZCBub3QgdmFsaWQgc3ViZGV2aWNlXG4iLCBjbWQuc3ViZGV2KTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKCFzLT5kb19jbWQgfHwgIXMtPmRvX2NtZHRlc3QgfHwgIXMtPmFzeW5jKSB7Ci0JCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsCi0JCQkic3ViZGV2aWNlICVpIGRvZXMgbm90IHN1cHBvcnQgY29tbWFuZHNcbiIsIGNtZC5zdWJkZXYpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KIAkvKiBhcmUgd2UgbG9ja2VkPyAoaW9jdGwgbG9jaykgKi8KIAlpZiAocy0+bG9jayAmJiBzLT5sb2NrICE9IGZpbGUpIHsKIAkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgInN1YmRldmljZSBsb2NrZWRcbiIpOwpAQCAtMTQ1MiwxMyArMTUxNiw2IEBACiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JLyogbWFrZSBzdXJlIGNoYW5uZWwvZ2FpbiBsaXN0IGlzbid0IHRvbyBsb25nICovCi0JaWYgKGNtZC5jaGFubGlzdF9sZW4gPiBzLT5sZW5fY2hhbmxpc3QpIHsKLQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgImNoYW5uZWwvZ2FpbiBsaXN0IHRvbyBsb25nICV1ID4gJWRcbiIsCi0JCQljbWQuY2hhbmxpc3RfbGVuLCBzLT5sZW5fY2hhbmxpc3QpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAkvKiBtYWtlIHN1cmUgY2hhbm5lbC9nYWluIGxpc3QgaXNuJ3QgdG9vIHNob3J0ICovCiAJaWYgKGNtZC5jaGFubGlzdF9sZW4gPCAxKSB7CiAJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJjaGFubmVsL2dhaW4gbGlzdCB0b28gc2hvcnQgJXUgPCAxXG4iLApAQCAtMTQ2OCwyNSArMTUyNSwxMSBAQAogCiAJYXN5bmMtPmNtZCA9IGNtZDsKIAlhc3luYy0+Y21kLmRhdGEgPSBOVUxMOwotCS8qIGxvYWQgY2hhbm5lbC9nYWluIGxpc3QgKi8KLQlhc3luYy0+Y21kLmNoYW5saXN0ID0gbWVtZHVwX3VzZXIodXNlcl9jaGFubGlzdCwKLQkJCQkJICBhc3luYy0+Y21kLmNoYW5saXN0X2xlbiAqIHNpemVvZihpbnQpKTsKLQlpZiAoSVNfRVJSKGFzeW5jLT5jbWQuY2hhbmxpc3QpKSB7Ci0JCXJldCA9IFBUUl9FUlIoYXN5bmMtPmNtZC5jaGFubGlzdCk7Ci0JCWFzeW5jLT5jbWQuY2hhbmxpc3QgPSBOVUxMOwotCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAibWVtZHVwX3VzZXIgZmFpbGVkIHdpdGggY29kZSAlZFxuIiwKLQkJCXJldCk7Ci0JCWdvdG8gY2xlYW51cDsKLQl9CiAKLQkvKiBtYWtlIHN1cmUgZWFjaCBlbGVtZW50IGluIGNoYW5uZWwvZ2FpbiBsaXN0IGlzIHZhbGlkICovCi0JcmV0ID0gY29tZWRpX2NoZWNrX2NoYW5saXN0KHMsCi0JCQkJICAgIGFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuLAotCQkJCSAgICBhc3luYy0+Y21kLmNoYW5saXN0KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiYmFkIGNoYW5saXN0XG4iKTsKKwkvKiBsb2FkIGNoYW5uZWwvZ2FpbiBsaXN0ICovCisJcmV0ID0gX19jb21lZGlfZ2V0X3VzZXJfY2hhbmxpc3QoZGV2LCBzLCB1c2VyX2NoYW5saXN0LCAmYXN5bmMtPmNtZCk7CisJaWYgKHJldCkKIAkJZ290byBjbGVhbnVwOwotCX0KIAogCXJldCA9IHMtPmRvX2NtZHRlc3QoZGV2LCBzLCAmYXN5bmMtPmNtZCk7CiAKQEAgLTE1NTQsNjMgKzE1OTcsMjQgQEAKIHsKIAlzdHJ1Y3QgY29tZWRpX2NtZCBjbWQ7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7Ci0JaW50IHJldCA9IDA7CiAJdW5zaWduZWQgaW50ICpjaGFubGlzdCA9IE5VTEw7CiAJdW5zaWduZWQgaW50IF9fdXNlciAqdXNlcl9jaGFubGlzdDsKKwlpbnQgcmV0OwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGFyZywgc2l6ZW9mKGNtZCkpKSB7Ci0JCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJiYWQgY21kIGFkZHJlc3NcbiIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9CisJLyogZ2V0IHRoZSB1c2VyJ3MgY21kIGFuZCBkbyBzb21lIHNpbXBsZSB2YWxpZGF0aW9uICovCisJcmV0ID0gX19jb21lZGlfZ2V0X3VzZXJfY21kKGRldiwgYXJnLCAmY21kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJLyogc2F2ZSB1c2VyJ3MgY2hhbmxpc3QgcG9pbnRlciBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgbGF0ZXIgKi8KIAl1c2VyX2NoYW5saXN0ID0gKHVuc2lnbmVkIGludCBfX3VzZXIgKiljbWQuY2hhbmxpc3Q7CiAKLQlpZiAoY21kLnN1YmRldiA+PSBkZXYtPm5fc3ViZGV2aWNlcykgewotCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiJWQgbm8gc3VjaCBzdWJkZXZpY2VcbiIsIGNtZC5zdWJkZXYpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KIAlzID0gJmRldi0+c3ViZGV2aWNlc1tjbWQuc3ViZGV2XTsKLQlpZiAocy0+dHlwZSA9PSBDT01FRElfU1VCRF9VTlVTRUQpIHsKLQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIiVkIG5vdCB2YWxpZCBzdWJkZXZpY2VcbiIsIGNtZC5zdWJkZXYpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlpZiAoIXMtPmRvX2NtZCB8fCAhcy0+ZG9fY21kdGVzdCkgewotCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LAotCQkJInN1YmRldmljZSAlaSBkb2VzIG5vdCBzdXBwb3J0IGNvbW1hbmRzXG4iLCBjbWQuc3ViZGV2KTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JLyogbWFrZSBzdXJlIGNoYW5uZWwvZ2FpbiBsaXN0IGlzbid0IHRvbyBsb25nICovCi0JaWYgKGNtZC5jaGFubGlzdF9sZW4gPiBzLT5sZW5fY2hhbmxpc3QpIHsKLQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgImNoYW5uZWwvZ2FpbiBsaXN0IHRvbyBsb25nICVkID4gJWRcbiIsCi0JCQljbWQuY2hhbmxpc3RfbGVuLCBzLT5sZW5fY2hhbmxpc3QpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGNsZWFudXA7Ci0JfQogCiAJLyogbG9hZCBjaGFubmVsL2dhaW4gbGlzdCAqLwotCWlmIChjbWQuY2hhbmxpc3QpIHsKLQkJY2hhbmxpc3QgPSBtZW1kdXBfdXNlcih1c2VyX2NoYW5saXN0LAotCQkJCSAgICAgICBjbWQuY2hhbmxpc3RfbGVuICogc2l6ZW9mKGludCkpOwotCQlpZiAoSVNfRVJSKGNoYW5saXN0KSkgewotCQkJcmV0ID0gUFRSX0VSUihjaGFubGlzdCk7Ci0JCQljaGFubGlzdCA9IE5VTEw7Ci0JCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LAotCQkJCSJtZW1kdXBfdXNlciBleGl0ZWQgd2l0aCBjb2RlICVkIiwgcmV0KTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCi0JCS8qIG1ha2Ugc3VyZSBlYWNoIGVsZW1lbnQgaW4gY2hhbm5lbC9nYWluIGxpc3QgaXMgdmFsaWQgKi8KLQkJcmV0ID0gY29tZWRpX2NoZWNrX2NoYW5saXN0KHMsIGNtZC5jaGFubGlzdF9sZW4sIGNoYW5saXN0KTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJiYWQgY2hhbmxpc3RcbiIpOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0KLQkJY21kLmNoYW5saXN0ID0gY2hhbmxpc3Q7Ci0JfQorCXJldCA9IF9fY29tZWRpX2dldF91c2VyX2NoYW5saXN0KGRldiwgcywgdXNlcl9jaGFubGlzdCwgJmNtZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCXJldCA9IHMtPmRvX2NtZHRlc3QoZGV2LCBzLCAmY21kKTsKIApAQCAtMTYyMCw5ICsxNjI0LDggQEAKIAlpZiAoY29weV90b191c2VyKGFyZywgJmNtZCwgc2l6ZW9mKGNtZCkpKSB7CiAJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJiYWQgY21kIGFkZHJlc3NcbiIpOwogCQlyZXQgPSAtRUZBVUxUOwotCQlnb3RvIGNsZWFudXA7CiAJfQotY2xlYW51cDoKKwogCWtmcmVlKGNoYW5saXN0KTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaWRldi5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlkZXYuaAppbmRleCBmODJiZDQyLi5kNDYxMjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaWRldi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpZGV2LmgKQEAgLTYxLDMxICs2MSwzMSBAQAogCiAJdW5zaWduZWQgaW50ICpjaGFubGlzdDsJLyogZHJpdmVyLW93bmVkIGNoYW5saXN0IChub3QgdXNlZCkgKi8KIAotCWludCAoKmluc25fcmVhZCkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICosCisJaW50ICgqaW5zbl9yZWFkKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAorCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqLCB1bnNpZ25lZCBpbnQgKik7CisJaW50ICgqaW5zbl93cml0ZSkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKIAkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICosIHVuc2lnbmVkIGludCAqKTsKLQlpbnQgKCppbnNuX3dyaXRlKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKKwlpbnQgKCppbnNuX2JpdHMpKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICosCisJCQkgc3RydWN0IGNvbWVkaV9pbnNuICosIHVuc2lnbmVkIGludCAqKTsKKwlpbnQgKCppbnNuX2NvbmZpZykoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKIAkJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqLCB1bnNpZ25lZCBpbnQgKik7Ci0JaW50ICgqaW5zbl9iaXRzKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKLQkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICosIHVuc2lnbmVkIGludCAqKTsKLQlpbnQgKCppbnNuX2NvbmZpZykgKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICosCi0JCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICosIHVuc2lnbmVkIGludCAqKTsKIAotCWludCAoKmRvX2NtZCkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICopOwotCWludCAoKmRvX2NtZHRlc3QpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAotCQkJICAgc3RydWN0IGNvbWVkaV9jbWQgKik7Ci0JaW50ICgqcG9sbCkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICopOwotCWludCAoKmNhbmNlbCkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICopOworCWludCAoKmRvX2NtZCkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKik7CisJaW50ICgqZG9fY21kdGVzdCkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKKwkJCSAgc3RydWN0IGNvbWVkaV9jbWQgKik7CisJaW50ICgqcG9sbCkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKik7CisJaW50ICgqY2FuY2VsKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsKIAkvKiBpbnQgKCpkb19sb2NrKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsgKi8KIAkvKiBpbnQgKCpkb191bmxvY2spKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIFwKIAkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICopOyAqLwogCiAJLyogY2FsbGVkIHdoZW4gdGhlIGJ1ZmZlciBjaGFuZ2VzICovCi0JaW50ICgqYnVmX2NoYW5nZSkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgdW5zaWduZWQgbG9uZyBuZXdfc2l6ZSk7CisJaW50ICgqYnVmX2NoYW5nZSkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHVuc2lnbmVkIGxvbmcgbmV3X3NpemUpOwogCi0Jdm9pZCAoKm11bmdlKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCSAgICAgICB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzLAotCQkgICAgICAgdW5zaWduZWQgaW50IHN0YXJ0X2NoYW5faW5kZXgpOworCXZvaWQgKCptdW5nZSkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCSAgICAgIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBudW1fYnl0ZXMsCisJCSAgICAgIHVuc2lnbmVkIGludCBzdGFydF9jaGFuX2luZGV4KTsKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBhc3luY19kbWFfZGlyOwogCiAJdW5zaWduZWQgaW50IHN0YXRlOwpAQCAtMTQ2LDggKzE0Niw4IEBACiAKIAl1bnNpZ25lZCBpbnQgY2JfbWFzazsKIAotCWludCAoKmludHRyaWcpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCXVuc2lnbmVkIGludCB4KTsKKwlpbnQgKCppbnR0cmlnKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJICAgICAgIHVuc2lnbmVkIGludCB4KTsKIH07CiAKIHN0cnVjdCBjb21lZGlfZHJpdmVyIHsKQEAgLTE1NSw5ICsxNTUsOSBAQAogCiAJY29uc3QgY2hhciAqZHJpdmVyX25hbWU7CiAJc3RydWN0IG1vZHVsZSAqbW9kdWxlOwotCWludCAoKmF0dGFjaCkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICopOwotCXZvaWQgKCpkZXRhY2gpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqKTsKLQlpbnQgKCphdXRvX2F0dGFjaCkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpOworCWludCAoKmF0dGFjaCkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKik7CisJdm9pZCAoKmRldGFjaCkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKik7CisJaW50ICgqYXV0b19hdHRhY2gpKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpOwogCiAJLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGJvYXJkX25hbWUgYW5kIGJvYXJkX2lkIGFycmF5cyAqLwogCXVuc2lnbmVkIGludCBudW1fbmFtZXM7CkBAIC0yMDIsOCArMjAyLDggQEAKIAogCXN0cnVjdCBmYXN5bmNfc3RydWN0ICphc3luY19xdWV1ZTsKIAotCWludCAoKm9wZW4pIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KTsKLQl2b2lkICgqY2xvc2UpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KTsKKwlpbnQgKCpvcGVuKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KTsKKwl2b2lkICgqY2xvc2UpKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpOwogfTsKIAogc3RhdGljIGlubGluZSBjb25zdCB2b2lkICpjb21lZGlfYm9hcmQoY29uc3Qgc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKQEAgLTM1Myw2ICszNTMsMTQgQEAKIAogLyogZHJpdmVycy5jIC0gZ2VuZXJhbCBjb21lZGkgZHJpdmVyIGZ1bmN0aW9ucyAqLwogCisjZGVmaW5lIENPTUVESV9USU1FT1VUX01TCTEwMDAKKworaW50IGNvbWVkaV90aW1lb3V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICosCisJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqLAorCQkgICBpbnQgKCpjYikoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9pbnNuICosIHVuc2lnbmVkIGxvbmcgY29udGV4dCksCisJCSAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCk7CisKIGludCBjb21lZGlfZGlvX2luc25fY29uZmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICosCiAJCQkgICBzdHJ1Y3QgY29tZWRpX2luc24gKiwgdW5zaWduZWQgaW50ICpkYXRhLAogCQkJICAgdW5zaWduZWQgaW50IG1hc2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYwppbmRleCA1YjE1MDMzLi5hYjBlOGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYwpAQCAtMTU1LDYgKzE1NSwzNiBAQAogfQogCiAvKioKKyAqIGNvbWVkaV90aW1lb3V0KCkgLSBidXN5LXdhaXQgZm9yIGEgZHJpdmVyIGNvbmRpdGlvbiB0byBvY2N1ci4KKyAqIEBkZXY6IGNvbWVkaV9kZXZpY2Ugc3RydWN0CisgKiBAczogY29tZWRpX3N1YmRldmljZSBzdHJ1Y3QKKyAqIEBpbnNuOiBjb21lZGlfaW5zbiBzdHJ1Y3QKKyAqIEBjYjogY2FsbGJhY2sgdG8gY2hlY2sgZm9yIHRoZSBjb25kaXRpb24KKyAqIEBjb250ZXh0OiBwcml2YXRlIGNvbnRleHQgZnJvbSB0aGUgZHJpdmVyCisgKi8KK2ludCBjb21lZGlfdGltZW91dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkgICBpbnQgKCpjYikoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KSwKKwkJICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKENPTUVESV9USU1FT1VUX01TKTsKKwlpbnQgcmV0OworCisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCXJldCA9IGNiKGRldiwgcywgaW5zbiwgY29udGV4dCk7CisJCWlmIChyZXQgIT0gLUVCVVNZKQorCQkJcmV0dXJuIHJldDsJLyogc3VjY2VzcyAoMCkgb3Igbm9uIEVCVVNZIGVycm5vICovCisJCWNwdV9yZWxheCgpOworCX0KKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNvbWVkaV90aW1lb3V0KTsKKworLyoqCiAgKiBjb21lZGlfZGlvX2luc25fY29uZmlnKCkgLSBib2lsZXJwbGF0ZSAoKmluc25fY29uZmlnKSBmb3IgRElPIHN1YmRldmljZXMuCiAgKiBAZGV2OiBjb21lZGlfZGV2aWNlIHN0cnVjdAogICogQHM6IGNvbWVkaV9zdWJkZXZpY2Ugc3RydWN0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvODI1NV9wY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjU1X3BjaS5jCmluZGV4IDhhNTdjM2MuLjQ2YTM4NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjU1X3BjaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjU1X3BjaS5jCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKICNpbmNsdWRlICI4MjU1LmgiCisjaW5jbHVkZSAibWl0ZS5oIgogCiBlbnVtIHBjaV84MjU1X2JvYXJkaWQgewogCUJPQVJEX0FETElOS19QQ0k3MjI0LApAQCAtNzksNiArODAsNyBAQAogCWNvbnN0IGNoYXIgKm5hbWU7CiAJaW50IGRpb19iYWRyOwogCWludCBuXzgyNTU7CisJdW5zaWduZWQgaW50IGhhc19taXRlOjE7CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV84MjU1X2JvYXJkaW5mbyBwY2lfODI1NV9ib2FyZHNbXSA9IHsKQEAgLTEyNiwzNiArMTI4LDQzIEBACiAJCS5uYW1lCQk9ICJuaV9wY2ktZGlvLTk2IiwKIAkJLmRpb19iYWRyCT0gMSwKIAkJLm5fODI1NQkJPSA0LAorCQkuaGFzX21pdGUJPSAxLAogCX0sCiAJW0JPQVJEX05JX1BDSURJTzk2Ql0gPSB7CiAJCS5uYW1lCQk9ICJuaV9wY2ktZGlvLTk2YiIsCiAJCS5kaW9fYmFkcgk9IDEsCiAJCS5uXzgyNTUJCT0gNCwKKwkJLmhhc19taXRlCT0gMSwKIAl9LAogCVtCT0FSRF9OSV9QWEk2NTA4XSA9IHsKIAkJLm5hbWUJCT0gIm5pX3B4aS02NTA4IiwKIAkJLmRpb19iYWRyCT0gMSwKIAkJLm5fODI1NQkJPSA0LAorCQkuaGFzX21pdGUJPSAxLAogCX0sCiAJW0JPQVJEX05JX1BDSTY1MDNdID0gewogCQkubmFtZQkJPSAibmlfcGNpLTY1MDMiLAogCQkuZGlvX2JhZHIJPSAxLAogCQkubl84MjU1CQk9IDEsCisJCS5oYXNfbWl0ZQk9IDEsCiAJfSwKIAlbQk9BUkRfTklfUENJNjUwM0JdID0gewogCQkubmFtZQkJPSAibmlfcGNpLTY1MDNiIiwKIAkJLmRpb19iYWRyCT0gMSwKIAkJLm5fODI1NQkJPSAxLAorCQkuaGFzX21pdGUJPSAxLAogCX0sCiAJW0JPQVJEX05JX1BDSTY1MDNYXSA9IHsKIAkJLm5hbWUJCT0gIm5pX3BjaS02NTAzeCIsCiAJCS5kaW9fYmFkcgk9IDEsCiAJCS5uXzgyNTUJCT0gMSwKKwkJLmhhc19taXRlCT0gMSwKIAl9LAogCVtCT0FSRF9OSV9QWElfNjUwM10gPSB7CiAJCS5uYW1lCQk9ICJuaV9weGktNjUwMyIsCiAJCS5kaW9fYmFkcgk9IDEsCiAJCS5uXzgyNTUJCT0gMSwKKwkJLmhhc19taXRlCT0gMSwKIAl9LAogfTsKIApAQCAtMTYzLDYgKzE3MiwyNSBAQAogCXZvaWQgX19pb21lbSAqbW1pb19iYXNlOwogfTsKIAorc3RhdGljIGludCBwY2lfODI1NV9taXRlX2luaXQoc3RydWN0IHBjaV9kZXYgKnBjaWRldikKK3sKKwl2b2lkIF9faW9tZW0gKm1pdGVfYmFzZTsKKwl1MzIgbWFpbl9waHlzX2FkZHI7CisKKwkvKiBpb3JlbWFwIHRoZSBNSVRFIHJlZ2lzdGVycyAoQkFSIDApIHRlbXBvcmFyaWx5ICovCisJbWl0ZV9iYXNlID0gcGNpX2lvcmVtYXBfYmFyKHBjaWRldiwgMCk7CisJaWYgKCFtaXRlX2Jhc2UpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogc2V0IGRhdGEgd2luZG93IHRvIG1haW4gcmVnaXN0ZXJzIChCQVIgMSkgKi8KKwltYWluX3BoeXNfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDEpOworCXdyaXRlbChtYWluX3BoeXNfYWRkciB8IFdFTkFCLCBtaXRlX2Jhc2UgKyBNSVRFX0lPRFdCU1IpOworCisJLyogZmluaXNoZWQgd2l0aCBNSVRFIHJlZ2lzdGVycyAqLworCWlvdW5tYXAobWl0ZV9iYXNlKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBwY2lfODI1NV9tbWlvKGludCBkaXIsIGludCBwb3J0LCBpbnQgZGF0YSwgdW5zaWduZWQgbG9uZyBpb2Jhc2UpCiB7CiAJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2UgPSAodm9pZCBfX2lvbWVtICopaW9iYXNlOwpAQCAtMjAxLDYgKzIyOSwxMiBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwlpZiAoYm9hcmQtPmhhc19taXRlKSB7CisJCXJldCA9IHBjaV84MjU1X21pdGVfaW5pdChwY2lkZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKIAlpc19tbWlvID0gKHBjaV9yZXNvdXJjZV9mbGFncyhwY2lkZXYsIGJvYXJkLT5kaW9fYmFkcikgJgogCQkgICBJT1JFU09VUkNFX01FTSkgIT0gMDsKIAlpZiAoaXNfbW1pbykgewpAQCAtMjM1LDkgKzI2OSw2IEBACiAJCQlyZXR1cm4gcmV0OwogCX0KIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgYXR0YWNoZWQgKCVkIGRpZ2l0YWwgaS9vIGNoYW5uZWxzKVxuIiwKLQkJZGV2LT5ib2FyZF9uYW1lLCBib2FyZC0+bl84MjU1ICogMjQpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9NYWtlZmlsZQppbmRleCAyNzA2ZjU4Li4wNzU3YTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL01ha2VmaWxlCkBAIC0yNCw2ICsyNCw3IEBACiBvYmotJChDT05GSUdfQ09NRURJX1BDTTM3MjQpCQkrPSBwY20zNzI0Lm8KIG9iai0kKENPTkZJR19DT01FRElfUlRJODAwKQkJKz0gcnRpODAwLm8KIG9iai0kKENPTkZJR19DT01FRElfUlRJODAyKQkJKz0gcnRpODAyLm8KK29iai0kKENPTkZJR19DT01FRElfREFDMDIpCQkrPSBkYWMwMi5vCiBvYmotJChDT05GSUdfQ09NRURJX0RBUzE2TTEpCQkrPSBkYXMxNm0xLm8KIG9iai0kKENPTkZJR19DT01FRElfREFTMDhfSVNBKQkJKz0gZGFzMDhfaXNhLm8KIG9iai0kKENPTkZJR19DT01FRElfREFTMTYpCQkrPSBkYXMxNi5vCkBAIC01Myw3ICs1NCw2IEBACiBvYmotJChDT05GSUdfQ09NRURJX1BDTU1JTykJCSs9IHBjbW1pby5vCiBvYmotJChDT05GSUdfQ09NRURJX1BDTVVJTykJCSs9IHBjbXVpby5vCiBvYmotJChDT05GSUdfQ09NRURJX01VTFRJUTMpCQkrPSBtdWx0aXEzLm8KLW9iai0kKENPTkZJR19DT01FRElfUE9DKQkJKz0gcG9jLm8KIG9iai0kKENPTkZJR19DT01FRElfUzUyNikJCSs9IHM1MjYubwogCiAjIENvbWVkaSBQQ0kgZHJpdmVycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMDM1LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kwMzUuYwppbmRleCAxMTI4YzIyLi4yODQ1MGY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kwMzUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kwMzUuYwpAQCAtMSw0NiArMSwyNCBAQAotLyoqCi1AdmVyYmF0aW0KLQotQ29weXJpZ2h0IChDKSAyMDA0LDIwMDUgIEFEREktREFUQSBHbWJIIGZvciB0aGUgc291cmNlIGNvZGUgb2YgdGhpcyBtb2R1bGUuCi0KLQlBRERJLURBVEEgR21iSAotCURpZXNlbHN0cmFzc2UgMwotCUQtNzc4MzMgT3R0ZXJzd2VpZXIKLQlUZWw6ICsxOSgwKTcyMjMvOTQ5My0wCi0JRmF4OiArNDkoMCk3MjIzLzk0OTMtOTIKLQlodHRwOi8vd3d3LmFkZGktZGF0YS5jb20KLQlpbmZvQGFkZGktZGF0YS5jb20KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1AZW5kdmVyYmF0aW0KLSovCiAvKgotCi0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCAoQykgQURESS1EQVRBIEdtYkggICAgICAgICAgRGllc2Vsc3RyYcOfZSAzICAgICAgIEQtNzc4MzMgT3R0ZXJzd2VpZXIgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IFRlbCA6ICs0OSAoMCkgNzIyMy85NDkzLTAgICAgIHwgZW1haWwgICAgOiBpbmZvQGFkZGktZGF0YS5jb20gICAgICAgICB8Ci0gIHwgRmF4IDogKzQ5ICgwKSA3MjIzLzk0OTMtOTIgICAgfCBJbnRlcm5ldCA6IGh0dHA6Ly93d3cuYWRkaS1kYXRhLmNvbSAgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IFByb2plY3QgICAgIDogQVBDSS0wMzUgICAgICAgIHwgQ29tcGlsZXIgICA6IEdDQyAgICAgICAgICAgICAgICAgICAgICB8Ci0gIHwgTW9kdWxlIG5hbWUgOiBod2Rydl9hcGNpMDM1LmMgfCBWZXJzaW9uICAgIDogMi45NiAgICAgICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IFByb2plY3QgbWFuYWdlcjogRXJpYyBTdG9seiAgIHwgRGF0ZSAgICAgICA6ICAwMi8xMi8yMDAyICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCBEZXNjcmlwdGlvbiA6ICAgSGFyZHdhcmUgTGF5ZXIgQWNjZXNzIEZvciBBUENJLTAzNSAgICAgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8ICAgRGF0ZSAgIHwgICBBdXRob3IgIHwgICAgICAgICAgRGVzY3JpcHRpb24gb2YgdXBkYXRlcyAgICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICB8ICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gIHwgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KKyAqIENvcHlyaWdodCAoQykgMjAwNCwyMDA1ICBBRERJLURBVEEgR21iSCBmb3IgdGhlIHNvdXJjZSBjb2RlIG9mIHRoaXMgbW9kdWxlLgorICoKKyAqCUFEREktREFUQSBHbWJICisgKglEaWVzZWxzdHJhc3NlIDMKKyAqCUQtNzc4MzMgT3R0ZXJzd2VpZXIKKyAqCVRlbDogKzE5KDApNzIyMy85NDkzLTAKKyAqCUZheDogKzQ5KDApNzIyMy85NDkzLTkyCisgKglodHRwOi8vd3d3LmFkZGktZGF0YS5jb20KKyAqCWluZm9AYWRkaS1kYXRhLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKyAqIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCiAKIC8qIENhcmQgU3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KICNkZWZpbmUgQVBDSTAzNV9BRERSRVNTX1JBTkdFCQkyNTUKQEAgLTEwNiw5OSArODQsNjYgQEAKIAl9CiB9OwogCi1zdGF0aWMgaW50IGlfV2F0Y2hkb2dOYnIgPSAwOwotc3RhdGljIGludCBpX1RlbXAgPSAwOworc3RhdGljIGludCBpX1dhdGNoZG9nTmJyOworc3RhdGljIGludCBpX1RlbXA7CiBzdGF0aWMgaW50IGlfRmxhZyA9IDE7CisKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMDM1X0NvbmZpZ1RpbWVyV2F0Y2hkb2cgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCSAgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IENvbmZpZ3VyZXMgVGhlIFRpbWVyICwgQ291bnRlciBvciBXYXRjaGRvZyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2IDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93IHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCQkJICBkYXRhWzBdICAgICAgICAgICAgOiAwIENvbmZpZ3VyZSBBcyBUaW1lciAgICAgIHwKLXwJCQkJCQkJCQkJICAgMSBDb25maWd1cmUgQXMgV2F0Y2hkb2cgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdICAgICAgICAgICAgOiBXYXRjaGRvZyBudW1iZXIKLXwJCQkJCSAgZGF0YVsyXSAgICAgICAgICAgIDogVGltZSBiYXNlIFVuaXQgICAgICAgICAgICB8Ci18CQkJCQkgIGRhdGFbM10JCQkgOiBSZWxvYWQgVmFsdWUJCQkgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbNF0gICAgICAgICAgICA6IEV4dGVybmFsIFRyaWdnZXIgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTpFbmFibGUKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6RGlzYWJsZQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbNV0gICAgICAgICAgICA6RXh0ZXJuYWwgVHJpZ2dlciBMZXZlbAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDAgVHJpZ2dlciBEaXNhYmxlZAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDEgVHJpZ2dlciBFbmFibGVkIChMb3cgbGV2ZWwpCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCBUcmlnZ2VyIEVuYWJsZWQgKEhpZ2ggTGV2ZWwpCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSBUcmlnZ2VyIEVuYWJsZWQgKEhpZ2gvTG93IGxldmVsKQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbNl0gICAgICAgICAgICA6IEV4dGVybmFsIEdhdGUgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTpFbmFibGUKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOkRpc2FibGUKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzddICAgICAgICAgICAgOiBFeHRlcm5hbCBHYXRlIGxldmVsCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMCBHYXRlIERpc2FibGVkCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMSBHYXRlIEVuYWJsZWQgKExvdyBsZXZlbCkKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwIEdhdGUgRW5hYmxlZCAoSGlnaCBMZXZlbCkKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzhdICAgICAgICAgICAgOldhcm5pbmcgUmVsYXkKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IEVOQUJMRQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogRElTQUJMRQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbOV0gICAgICAgICAgICA6V2FybmluZyBEZWxheSBhdmFpbGFibGUKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzEwXSAgICAgICAgICAgOldhcm5pbmcgUmVsYXkgVGltZSB1bml0Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxMV0gICAgICAgICAgIDpXYXJuaW5nIFJlbGF5IFRpbWUgUmVsb2FkIHZhbHVlCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxMl0gICAgICAgICAgIDpSZXNldCBSZWxheQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA6IEVOQUJMRQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IERJU0FCTEUKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzEzXSAgICAgICAgICAgOkludGVycnVwdAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA6IEVOQUJMRQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IERJU0FCTEUKLXwKLXwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgaW50IGlfQVBDSTAzNV9Db25maWdUaW1lcldhdGNoZG9nKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJIHVuc2lnbmVkIGludCAqZGF0YSkKKyAqIENvbmZpZ3VyZXMgVGhlIFRpbWVyICwgQ291bnRlciBvciBXYXRjaGRvZworICoKKyAqIGRhdGFbMF0gMCA9IENvbmZpZ3VyZSBBcyBUaW1lciwgMSA9IENvbmZpZ3VyZSBBcyBXYXRjaGRvZworICogZGF0YVsxXSBXYXRjaGRvZyBudW1iZXIKKyAqIGRhdGFbMl0gVGltZSBiYXNlIFVuaXQKKyAqIGRhdGFbM10gUmVsb2FkIFZhbHVlCisgKiBkYXRhWzRdIEV4dGVybmFsIFRyaWdnZXIsIDEgPSBFbmFibGUsIDAgPSBEaXNhYmxlCisgKiBkYXRhWzVdIEV4dGVybmFsIFRyaWdnZXIgTGV2ZWwKKyAqCTAwID0gVHJpZ2dlciBEaXNhYmxlZAorICoJMDEgPSBUcmlnZ2VyIEVuYWJsZWQgKExvdyBsZXZlbCkKKyAqCTEwID0gVHJpZ2dlciBFbmFibGVkIChIaWdoIExldmVsKQorICoJMTEgPSBUcmlnZ2VyIEVuYWJsZWQgKEhpZ2gvTG93IGxldmVsKQorICogZGF0YVs2XSBFeHRlcm5hbCBHYXRlLCAxID0gRW5hYmxlLCAwID0gRGlzYWJsZQorICogZGF0YVs3XSBFeHRlcm5hbCBHYXRlIGxldmVsCisgKgkwMCA9IEdhdGUgRGlzYWJsZWQKKyAqCTAxID0gR2F0ZSBFbmFibGVkIChMb3cgbGV2ZWwpCisgKgkxMCA9IEdhdGUgRW5hYmxlZCAoSGlnaCBMZXZlbCkKKyAqIGRhdGFbOF0gV2FybmluZyBSZWxheSwgMSA9IEVuYWJsZSwgMCA9IERpc2FibGUKKyAqIGRhdGFbOV0gV2FybmluZyBEZWxheSBhdmFpbGFibGUKKyAqIGRhdGFbMTBdIFdhcm5pbmcgUmVsYXkgVGltZSB1bml0CisgKiBkYXRhWzExXSBXYXJuaW5nIFJlbGF5IFRpbWUgUmVsb2FkIHZhbHVlCisgKiBkYXRhWzEyXSBSZXNldCBSZWxheSwgMSA9IEVuYWJsZSwgMCA9IERpc2FibGUKKyAqIGRhdGFbMTNdIEludGVycnVwdCwgMSA9IEVuYWJsZSwgMCA9IERpc2FibGUKKyAqLworc3RhdGljIGludCBhcGNpMDM1X3RpbWVyX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgdWlfU3RhdHVzID0gMDsKLQl1bnNpZ25lZCBpbnQgdWlfQ29tbWFuZCA9IDA7Ci0JdW5zaWduZWQgaW50IHVpX01vZGUgPSAwOworCXVuc2lnbmVkIGludCB1aV9TdGF0dXM7CisJdW5zaWduZWQgaW50IHVpX0NvbW1hbmQ7CisJdW5zaWduZWQgaW50IHVpX01vZGU7CiAKIAlpX1RlbXAgPSAwOwogCWRldnByaXYtPnRza19DdXJyZW50ID0gY3VycmVudDsKIAlkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9IGRhdGFbMF07CiAJaV9XYXRjaGRvZ05iciA9IGRhdGFbMV07Ci0JaWYgKGRhdGFbMF0gPT0gMCkgeworCWlmIChkYXRhWzBdID09IDApCiAJCXVpX01vZGUgPSAyOwotCX0gZWxzZSB7CisJZWxzZQogCQl1aV9Nb2RlID0gMDsKLQl9Ci0vKiB1aV9Db21tYW5kID0gaW5sKGRldnByaXYtPmlvYmFzZSsoKGlfV2F0Y2hkb2dOYnItMSkqMzIpKzEyKTsgKi8KKwogCXVpX0NvbW1hbmQgPSAwOwotLyogdWlfQ29tbWFuZCA9IHVpX0NvbW1hbmQgJiAweEZGRkZGOUZFVUw7ICovCiAJb3V0bCh1aV9Db21tYW5kLCBkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDEyKTsKLQl1aV9Db21tYW5kID0gMDsKKwogCXVpX0NvbW1hbmQgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxMik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogU2V0IHRoZSByZWxvYWQgdmFsdWUgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiBTZXQgdGhlIHJlbG9hZCB2YWx1ZSAqLwogCW91dGwoZGF0YVszXSwgZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyA0KTsKLS8qKioqKioqKioqKioqKioqKioqKiovCi0vKiBTZXQgdGhlIHRpbWUgdW5pdCAqLwotLyoqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIFNldCB0aGUgdGltZSB1bml0ICovCiAJb3V0bChkYXRhWzJdLCBkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDgpOwogCWlmIChkYXRhWzBdID09IEFERElEQVRBX1RJTUVSKSB7CiAKLQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFNldCB0aGUgbW9kZSA6ICAgICAgICAgICAgICovCiAJCS8qIC0gRGlzYWJsZSB0aGUgaGFyZHdhcmUgICAgICovCiAJCS8qIC0gRGlzYWJsZSB0aGUgY291bnRlciBtb2RlICovCkBAIC0yMDYsMTAxICsxNTEsODIgQEAKIAkJLyogLSBEaXNhYmxlIHRoZSByZXNldCAgICAgICAgKi8KIAkJLyogLSBFbmFibGUgdGhlIHRpbWVyIG1vZGUgICAgKi8KIAkJLyogLSBTZXQgdGhlIHRpbWVyIG1vZGUgICAgICAgKi8KLQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJdWlfQ29tbWFuZCA9CiAJCQkodWlfQ29tbWFuZCAmIDB4RkZGNzE5RTJVTCkgfCB1aV9Nb2RlIDw8IDEzVUwgfCAweDEwVUw7CiAKLQl9CQkJLyogaWYgKGRhdGFbMF0gPT0gQURESURBVEFfVElNRVIpICovCi0JZWxzZSB7Ci0JCWlmIChkYXRhWzBdID09IEFERElEQVRBX1dBVENIRE9HKSB7CisJfSBlbHNlIGlmIChkYXRhWzBdID09IEFERElEQVRBX1dBVENIRE9HKSB7CiAKLQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCQkvKiBTZXQgdGhlIG1vZGUgOiAgICAgICAgICAgICAqLwotCQkJLyogLSBEaXNhYmxlIHRoZSBoYXJkd2FyZSAgICAgKi8KLQkJCS8qIC0gRGlzYWJsZSB0aGUgY291bnRlciBtb2RlICovCi0JCQkvKiAtIERpc2FibGUgdGhlIHdhcm5pbmcgICAgICAqLwotCQkJLyogLSBEaXNhYmxlIHRoZSByZXNldCAgICAgICAgKi8KLQkJCS8qIC0gRGlzYWJsZSB0aGUgdGltZXIgbW9kZSAgICovCi0JCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQkvKiBTZXQgdGhlIG1vZGUgOiAgICAgICAgICAgICAqLworCQkvKiAtIERpc2FibGUgdGhlIGhhcmR3YXJlICAgICAqLworCQkvKiAtIERpc2FibGUgdGhlIGNvdW50ZXIgbW9kZSAqLworCQkvKiAtIERpc2FibGUgdGhlIHdhcm5pbmcgICAgICAqLworCQkvKiAtIERpc2FibGUgdGhlIHJlc2V0ICAgICAgICAqLworCQkvKiAtIERpc2FibGUgdGhlIHRpbWVyIG1vZGUgICAqLwogCi0JCQl1aV9Db21tYW5kID0gdWlfQ29tbWFuZCAmIDB4RkZGODE5RTJVTDsKKwkJdWlfQ29tbWFuZCA9IHVpX0NvbW1hbmQgJiAweEZGRjgxOUUyVUw7CiAKLQkJfSBlbHNlIHsKLQkJCXByaW50aygiXG4gVGhlIHBhcmFtZXRlciBmb3IgVGltZXIvd2F0Y2hkb2cgc2VsZWN0aW9uIGlzIGluIGVycm9yXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9CisJfSBlbHNlIHsKKwkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIlRoZSBwYXJhbWV0ZXIgZm9yIFRpbWVyL3dhdGNoZG9nIHNlbGVjdGlvbiBpcyBpbiBlcnJvclxuIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KKwogCW91dGwodWlfQ29tbWFuZCwgZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxMik7Ci0JdWlfQ29tbWFuZCA9IDA7CisKIAl1aV9Db21tYW5kID0gaW5sKGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMTIpOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRGlzYWJsZSB0aGUgaGFyZHdhcmUgdHJpZ2dlciAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJLyogRGlzYWJsZSB0aGUgaGFyZHdhcmUgdHJpZ2dlciAqLwogCXVpX0NvbW1hbmQgPSB1aV9Db21tYW5kICYgMHhGRkZGRjg5RlVMOwogCWlmIChkYXRhWzRdID09IEFERElEQVRBX0VOQUJMRSkgewotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAJCS8qIFNldCB0aGUgaGFyZHdhcmUgdHJpZ2dlciBsZXZlbCAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQl1aV9Db21tYW5kID0gdWlfQ29tbWFuZCB8IChkYXRhWzVdIDw8IDUpOwogCX0KIAlvdXRsKHVpX0NvbW1hbmQsIGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMTIpOwotCXVpX0NvbW1hbmQgPSAwOworCiAJdWlfQ29tbWFuZCA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDEyKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIERpc2FibGUgdGhlIGhhcmR3YXJlIGdhdGUgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIERpc2FibGUgdGhlIGhhcmR3YXJlIGdhdGUgKi8KIAl1aV9Db21tYW5kID0gdWlfQ29tbWFuZCAmIDB4RkZGRkY4N0ZVTDsKIAlpZiAoZGF0YVs2XSA9PSBBRERJREFUQV9FTkFCTEUpIHsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogU2V0IHRoZSBoYXJkd2FyZSBnYXRlIGxldmVsICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCQkvKiBTZXQgdGhlIGhhcmR3YXJlIGdhdGUgbGV2ZWwgKi8KIAkJdWlfQ29tbWFuZCA9IHVpX0NvbW1hbmQgfCAoZGF0YVs3XSA8PCA3KTsKIAl9CiAJb3V0bCh1aV9Db21tYW5kLCBkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDEyKTsKLQl1aV9Db21tYW5kID0gMDsKKwogCXVpX0NvbW1hbmQgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxMik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIERpc2FibGUgdGhlIGhhcmR3YXJlIG91dHB1dCAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiBEaXNhYmxlIHRoZSBoYXJkd2FyZSBvdXRwdXQgKi8KIAl1aV9Db21tYW5kID0gdWlfQ29tbWFuZCAmIDB4RkZGRkY5RkJVTDsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTZXQgdGhlIGhhcmR3YXJlIG91dHB1dCBsZXZlbCAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIFNldCB0aGUgaGFyZHdhcmUgb3V0cHV0IGxldmVsICovCiAJdWlfQ29tbWFuZCA9IHVpX0NvbW1hbmQgfCAoZGF0YVs4XSA8PCAyKTsKIAlvdXRsKHVpX0NvbW1hbmQsIGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMTIpOwogCWlmIChkYXRhWzldID09IEFERElEQVRBX0VOQUJMRSkgewotICAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KKwogCQkvKiBTZXQgdGhlIHJlbG9hZCB2YWx1ZSAqLwotICAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJb3V0bChkYXRhWzExXSwKIAkJCWRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMjQpOwotICAgLyoqKioqKioqKioqKioqKioqKioqKiovCisKIAkJLyogU2V0IHRoZSB0aW1lIHVuaXRlICovCi0gICAvKioqKioqKioqKioqKioqKioqKioqKi8KIAkJb3V0bChkYXRhWzEwXSwKIAkJCWRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMjgpOwogCX0KIAotCXVpX0NvbW1hbmQgPSAwOwogCXVpX0NvbW1hbmQgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxMik7Ci0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIAkvKiBEaXNhYmxlIHRoZSBoYXJkd2FyZSBvdXRwdXQgKi8KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAl1aV9Db21tYW5kID0gdWlfQ29tbWFuZCAmIDB4RkZGRkY5RjdVTDsKLSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIAkvKiBTZXQgdGhlIGhhcmR3YXJlIG91dHB1dCBsZXZlbCAqLwotICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAl1aV9Db21tYW5kID0gdWlfQ29tbWFuZCB8IChkYXRhWzEyXSA8PCAzKTsKIAlvdXRsKHVpX0NvbW1hbmQsIGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMTIpOwotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC8qKiAgRW5hYmxlIHRoZSB3YXRjaGRvZyBpbnRlcnJ1cHQgICoqLwotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCXVpX0NvbW1hbmQgPSAwOworCisJLyogRW5hYmxlIHRoZSB3YXRjaGRvZyBpbnRlcnJ1cHQgKi8KIAl1aV9Db21tYW5kID0gaW5sKGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMTIpOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTZXQgdGhlIGludGVycnVwdCBzZWxlY3Rpb24gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJLyogU2V0IHRoZSBpbnRlcnJ1cHQgc2VsZWN0aW9uICovCiAJdWlfU3RhdHVzID0gaW5sKGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMTYpOwogCiAJdWlfQ29tbWFuZCA9ICh1aV9Db21tYW5kICYgMHhGRkZGRjlGRFVMKSB8IChkYXRhWzEzXSA8PCAxKTsKQEAgLTMxMCw4MiArMjM2LDYzIEBACiB9CiAKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMDM1X1N0YXJ0U3RvcFdyaXRlVGltZXJXYXRjaGRvZyAgICAgICAgICAgICAgfAotfAkJCSAgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IFN0YXJ0IC8gU3RvcCBUaGUgU2VsZWN0ZWQgVGltZXIgLCBvciBXYXRjaGRvZyAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA6IERyaXZlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgOiBEYXRhIFBvaW50ZXIgY29udGFpbnMgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcyBiZWxvdyB8Ci18CQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCQkJICBkYXRhWzBdIDogMCAtIFN0b3AgU2VsZWN0ZWQgVGltZXIvV2F0Y2hkb2cgICAgIHwKLXwJCQkJCSAgICAgICAgICAgIDEgLSBTdGFydCBTZWxlY3RlZCBUaW1lci9XYXRjaGRvZyAgICB8Ci18CQkJCQkgICAgICAgICAgICAyIC0gVHJpZ2dlciBTZWxlY3RlZCBUaW1lci9XYXRjaGRvZyAgfAotfAkJCQkJICAgICAgICAgICAgMyAtIFN0b3AgQWxsIFRpbWVyL1dhdGNoZG9nICAgICAgICAgIHwKLXwJCQkJCSAgICAgICAgICAgIDQgLSBTdGFydCBBbGwgVGltZXIvV2F0Y2hkb2cgICAgICAgICB8Ci18CQkJCQkgICAgICAgICAgICA1IC0gVHJpZ2dlciBBbGwgVGltZXIvV2F0Y2hkb2cgICAgICAgfAotfAkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yCQkJIHwKLXwJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgaW50IGlfQVBDSTAzNV9TdGFydFN0b3BXcml0ZVRpbWVyV2F0Y2hkb2coc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQorICogU3RhcnQgLyBTdG9wIFRoZSBTZWxlY3RlZCBUaW1lciAsIG9yIFdhdGNoZG9nCisgKgorICogZGF0YVswXQorICoJMCAtIFN0b3AgU2VsZWN0ZWQgVGltZXIvV2F0Y2hkb2cKKyAqCTEgLSBTdGFydCBTZWxlY3RlZCBUaW1lci9XYXRjaCpkb2cKKyAqCTIgLSBUcmlnZ2VyIFNlbGVjdGVkIFRpbWVyL1dhdGNoZG9nCisgKgkzIC0gU3RvcCBBbGwgVGltZXIvV2F0Y2hkb2cKKyAqCTQgLSBTdGFydCBBbGwgVGltZXIvV2F0Y2hkb2cKKyAqCTUgLSBUcmlnZ2VyIEFsbCBUaW1lci9XYXRjaGRvZworICovCitzdGF0aWMgaW50IGFwY2kwMzVfdGltZXJfd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IHVpX0NvbW1hbmQgPSAwOwotCWludCBpX0NvdW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgdWlfQ29tbWFuZDsKKwlpbnQgaV9Db3VudDsKIAogCWlmIChkYXRhWzBdID09IDEpIHsKIAkJdWlfQ29tbWFuZCA9CiAJCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxMik7Ci0JIC8qKioqKioqKioqKioqKioqKioqKioqLworCiAJCS8qIFN0YXJ0IHRoZSBoYXJkd2FyZSAqLwotCSAvKioqKioqKioqKioqKioqKioqKioqKi8KIAkJdWlfQ29tbWFuZCA9ICh1aV9Db21tYW5kICYgMHhGRkZGRjlGRlVMKSB8IDB4MVVMOwogCQlvdXRsKHVpX0NvbW1hbmQsCiAJCQlkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDEyKTsKLQl9CQkJLyogIGlmICAoZGF0YVswXT09MSkgKi8KKwl9CiAJaWYgKGRhdGFbMF0gPT0gMikgewogCQl1aV9Db21tYW5kID0KIAkJCWlubChkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDEyKTsKLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogCQkvKiBTZXQgdGhlIHRyaWdnZXIgY29tbWFuZCAqLwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQl1aV9Db21tYW5kID0gKHVpX0NvbW1hbmQgJiAweEZGRkZGOUZGVUwpIHwgMHgyMDBVTDsKIAkJb3V0bCh1aV9Db21tYW5kLAogCQkJZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxMik7CiAJfQogCi0JaWYgKGRhdGFbMF0gPT0gMCkJLyogU3RvcCBUaGUgV2F0Y2hkb2cgKi8KLQl7CisJaWYgKGRhdGFbMF0gPT0gMCkgewogCQkvKiBTdG9wIFRoZSBXYXRjaGRvZyAqLwogCQl1aV9Db21tYW5kID0gMDsKLS8qCi0qIHVpX0NvbW1hbmQgPSBpbmwoZGV2cHJpdi0+aW9iYXNlKygoaV9XYXRjaGRvZ05ici0xKSozMikrMTIpOwotKiB1aV9Db21tYW5kID0gdWlfQ29tbWFuZCAmIDB4RkZGRkY5RkVVTDsKLSovCisJCS8qCisJCSogdWlfQ29tbWFuZCA9IGlubChkZXZwcml2LT5pb2Jhc2UrKChpX1dhdGNoZG9nTmJyLTEpKjMyKSsxMik7CisJCSogdWlfQ29tbWFuZCA9IHVpX0NvbW1hbmQgJiAweEZGRkZGOUZFVUw7CisJCSovCiAJCW91dGwodWlfQ29tbWFuZCwKIAkJCWRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMTIpOwotCX0JCQkvKiAgIGlmIChkYXRhWzFdPT0wKSAqLwotCWlmIChkYXRhWzBdID09IDMpCS8qIHN0b3AgYWxsIFdhdGNoZG9ncyAqLwotCXsKKwl9CisJaWYgKGRhdGFbMF0gPT0gMykgeworCQkvKiBzdG9wIGFsbCBXYXRjaGRvZ3MgKi8KIAkJdWlfQ29tbWFuZCA9IDA7CiAJCWZvciAoaV9Db3VudCA9IDE7IGlfQ291bnQgPD0gNDsgaV9Db3VudCsrKSB7Ci0JCQlpZiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPT0gQURESURBVEFfV0FUQ0hET0cpIHsKKwkJCWlmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9PSBBRERJREFUQV9XQVRDSERPRykKIAkJCQl1aV9Db21tYW5kID0gMHgyVUw7Ci0JCQl9IGVsc2UgeworCQkJZWxzZQogCQkJCXVpX0NvbW1hbmQgPSAweDEwVUw7Ci0JCQl9CisKIAkJCWlfV2F0Y2hkb2dOYnIgPSBpX0NvdW50OwogCQkJb3V0bCh1aV9Db21tYW5kLAogCQkJCWRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsKQEAgLTM5MywzMCArMzAwLDI5IEBACiAJCX0KIAogCX0KLQlpZiAoZGF0YVswXSA9PSA0KQkvKiBzdGFydCBhbGwgV2F0Y2hkb2dzICovCi0JeworCWlmIChkYXRhWzBdID09IDQpIHsKKwkJLyogc3RhcnQgYWxsIFdhdGNoZG9ncyAqLwogCQl1aV9Db21tYW5kID0gMDsKIAkJZm9yIChpX0NvdW50ID0gMTsgaV9Db3VudCA8PSA0OyBpX0NvdW50KyspIHsKLQkJCWlmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9PSBBRERJREFUQV9XQVRDSERPRykgeworCQkJaWYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID09IEFERElEQVRBX1dBVENIRE9HKQogCQkJCXVpX0NvbW1hbmQgPSAweDFVTDsKLQkJCX0gZWxzZSB7CisJCQllbHNlCiAJCQkJdWlfQ29tbWFuZCA9IDB4OFVMOwotCQkJfQorCiAJCQlpX1dhdGNoZG9nTmJyID0gaV9Db3VudDsKIAkJCW91dGwodWlfQ29tbWFuZCwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArCiAJCQkJMCk7CiAJCX0KIAl9Ci0JaWYgKGRhdGFbMF0gPT0gNSkJLyogdHJpZ2dlciBhbGwgV2F0Y2hkb2dzICovCi0JeworCWlmIChkYXRhWzBdID09IDUpIHsKKwkJLyogdHJpZ2dlciBhbGwgV2F0Y2hkb2dzICovCiAJCXVpX0NvbW1hbmQgPSAwOwogCQlmb3IgKGlfQ291bnQgPSAxOyBpX0NvdW50IDw9IDQ7IGlfQ291bnQrKykgewotCQkJaWYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID09IEFERElEQVRBX1dBVENIRE9HKSB7CisJCQlpZiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPT0gQURESURBVEFfV0FUQ0hET0cpCiAJCQkJdWlfQ29tbWFuZCA9IDB4NFVMOwotCQkJfSBlbHNlIHsKKwkJCWVsc2UKIAkJCQl1aV9Db21tYW5kID0gMHgyMFVMOwotCQkJfQogCiAJCQlpX1dhdGNoZG9nTmJyID0gaV9Db3VudDsKIAkJCW91dGwodWlfQ29tbWFuZCwKQEAgLTQyOSwxMDkgKzMzNSw2MSBAQAogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTAzNV9SZWFkVGltZXJXYXRjaGRvZyAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSkgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBSZWFkIFRoZSBTZWxlY3RlZCBUaW1lciAsIENvdW50ZXIgb3IgV2F0Y2hkb2cgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA6IERyaXZlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgOiBEYXRhIFBvaW50ZXIgY29udGFpbnMgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcyBiZWxvdyB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgIAkJCQkJCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CWRhdGFbMF0gICAgICAgICAgICA6IHNvZnR3YXJlIHRyaWdnZXIgc3RhdHVzCi18ICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdICAgICAgICAgICAgOiBoYXJkd2FyZSB0cmlnZ2VyIHN0YXR1cwotfCAgICAgCSAgCSAgICAgICAgZGF0YVsyXSAgICAgICAgICAgIDogU29mdHdhcmUgY2xlYXIgc3RhdHVzCi18ICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzNdICAgICAgICAgICAgOiBPdmVyZmxvdyBzdGF0dXMKLXwgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbNF0gICAgICAgICAgICA6IFRpbWVyIGFjdHVhbCB2YWx1ZQotfAotCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgaW50IGlfQVBDSTAzNV9SZWFkVGltZXJXYXRjaGRvZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBSZWFkIFRoZSBTZWxlY3RlZCBUaW1lciAsIENvdW50ZXIgb3IgV2F0Y2hkb2cKKyAqCisgKiBkYXRhWzBdIHNvZnR3YXJlIHRyaWdnZXIgc3RhdHVzCisgKiBkYXRhWzFdIGhhcmR3YXJlIHRyaWdnZXIgc3RhdHVzCisgKiBkYXRhWzJdIFNvZnR3YXJlIGNsZWFyIHN0YXR1cworICogZGF0YVszXSBPdmVyZmxvdyBzdGF0dXMKKyAqIGRhdGFbNF0gVGltZXIgYWN0dWFsIHZhbHVlCisgKi8KK3N0YXRpYyBpbnQgYXBjaTAzNV90aW1lcl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCB1aV9TdGF0dXMgPSAwOwkvKiAgU3RhdHVzIHJlZ2lzdGVyICovCisJdW5zaWduZWQgaW50IHVpX1N0YXR1czsJLyogIFN0YXR1cyByZWdpc3RlciAqLwogCiAJaV9XYXRjaGRvZ05iciA9IGluc24tPnVudXNlZFswXTsKIAotCS8qKioqKioqKioqKioqKioqKiovCiAJLyogR2V0IHRoZSBzdGF0dXMgKi8KLQkvKioqKioqKioqKioqKioqKioqLwotCiAJdWlfU3RhdHVzID0gaW5sKGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMTYpOwogCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIEdldCB0aGUgc29mdHdhcmUgdHJpZ2dlciBzdGF0dXMgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIAlkYXRhWzBdID0gKCh1aV9TdGF0dXMgPj4gMSkgJiAxKTsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogR2V0IHRoZSBoYXJkd2FyZSB0cmlnZ2VyIHN0YXR1cyAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlkYXRhWzFdID0gKCh1aV9TdGF0dXMgPj4gMikgJiAxKTsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8qIEdldCB0aGUgc29mdHdhcmUgY2xlYXIgc3RhdHVzICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlkYXRhWzJdID0gKCh1aV9TdGF0dXMgPj4gMykgJiAxKTsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8qIEdldCB0aGUgb3ZlcmZsb3cgc3RhdHVzICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlkYXRhWzNdID0gKCh1aV9TdGF0dXMgPj4gMCkgJiAxKTsKLQlpZiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPT0gQURESURBVEFfVElNRVIpIHsKLQkJZGF0YVs0XSA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDApOwogCi0JfQkJCS8qICAgaWYgIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZT09QURESURBVEFfVElNRVIpICovCisJLyogR2V0IHRoZSBoYXJkd2FyZSB0cmlnZ2VyIHN0YXR1cyAqLworCWRhdGFbMV0gPSAoKHVpX1N0YXR1cyA+PiAyKSAmIDEpOworCisJLyogR2V0IHRoZSBzb2Z0d2FyZSBjbGVhciBzdGF0dXMgKi8KKwlkYXRhWzJdID0gKCh1aV9TdGF0dXMgPj4gMykgJiAxKTsKKworCS8qIEdldCB0aGUgb3ZlcmZsb3cgc3RhdHVzICovCisJZGF0YVszXSA9ICgodWlfU3RhdHVzID4+IDApICYgMSk7CisJaWYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID09IEFERElEQVRBX1RJTUVSKQorCQlkYXRhWzRdID0gaW5sKGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMCk7CiAKIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCBpX0FQQ0kwMzVfQ29uZmlnQW5hbG9nSW5wdXQgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJICAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogQ29uZmlndXJlcyBUaGUgQW5hbG9nIElucHV0IFN1YmRldmljZSAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgICAgICA6IERyaXZlciBoYW5kbGUgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzICAgICA6IFN1YmRldmljZSBQb2ludGVyICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiAgICAgICA6IEluc24gU3RydWN0dXJlIFBvaW50ZXIgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSAgICAgICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcyBiZWxvdyB8Ci18ICAgICAgICAgICAgICAgICAgICAgZGF0YVswXSAgICAgICAgICAgICAgICAgIDogV2FybmluZyBkZWxheSB2YWx1ZQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kwMzVfQ29uZmlnQW5hbG9nSW5wdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQorICogQ29uZmlndXJlcyBUaGUgQW5hbG9nIElucHV0IFN1YmRldmljZQorICoKKyAqIGRhdGFbMF0gV2FybmluZyBkZWxheSB2YWx1ZQorICovCitzdGF0aWMgaW50IGFwY2kwMzVfYWlfY29uZmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCiAJZGV2cHJpdi0+dHNrX0N1cnJlbnQgPSBjdXJyZW50OwogCW91dGwoMHgyMDAgfCAwLCBkZXZwcml2LT5pb2Jhc2UgKyAxMjggKyAweDQpOwogCW91dGwoMCwgZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgMCk7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBJbml0aWFsaXNlIHRoZSB3YXJuaW5nIHZhbHVlICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiBJbml0aWFsaXNlIHRoZSB3YXJuaW5nIHZhbHVlICovCiAJb3V0bCgweDMwMCB8IDAsIGRldnByaXYtPmlvYmFzZSArIDEyOCArIDB4NCk7CiAJb3V0bCgoZGF0YVswXSA8PCA4KSwgZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgMCk7CiAJb3V0bCgweDIwMDAwMFVMLCBkZXZwcml2LT5pb2Jhc2UgKyAxMjggKyAxMik7CkBAIC01NDAsMTQ1ICszOTgsODggQEAKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCBpX0FQQ0kwMzVfUmVhZEFuYWxvZ0lucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJICAgICAgICAgIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSkgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogUmVhZCAgdmFsdWUgIG9mIHRoZSBzZWxlY3RlZCBjaGFubmVsCQkJICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiAgICAgIDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHVpX05vT2ZDaGFubmVscyAgICA6IE5vIE9mIENoYW5uZWxzIFRvIHJlYWQgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSAgICAgICAgICAgICAgOiBEYXRhIFBvaW50ZXIgdG8gcmVhZCBzdGF0dXMgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci18CQkJICAgICAgICAgIGRhdGFbMF0gIDogRGlnaXRhbCBWYWx1ZSBPZiBJbnB1dCAgICAgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMDM1X1JlYWRBbmFsb2dJbnB1dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBSZWFkIHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBjaGFubmVsCisgKgorICogZGF0YVswXSBEaWdpdGFsIFZhbHVlIE9mIElucHV0CisgKi8KK3N0YXRpYyBpbnQgYXBjaTAzNV9haV9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCB1aV9Db21tYW5kUmVnaXN0ZXIgPSAwOworCXVuc2lnbmVkIGludCB1aV9Db21tYW5kUmVnaXN0ZXI7CiAKLS8qKioqKioqKioqKioqKioqKiovCi0vKiAgU2V0IHRoZSBzdGFydCAqLwotLyoqKioqKioqKioqKioqKioqKi8KKwkvKiAgU2V0IHRoZSBzdGFydCAqLwogCXVpX0NvbW1hbmRSZWdpc3RlciA9IDB4ODAwMDA7Ci0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogCS8qIFdyaXRlIHRoZSBjb21tYW5kIHJlZ2lzdGVyICovCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRsKHVpX0NvbW1hbmRSZWdpc3RlciwgZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgOCk7CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBSZWFkIHRoZSBkaWdpdGFsIHZhbHVlIG9mIHRoZSBpbnB1dCAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKiBSZWFkIHRoZSBkaWdpdGFsIHZhbHVlIG9mIHRoZSBpbnB1dCAqLwogCWRhdGFbMF0gPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgMjgpOwogCXJldHVybiBpbnNuLT5uOwogfQogCi0vKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogIGludCBpX0FQQ0kwMzVfUmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikJCQkgICAgIHwKLXwJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6UmVzZXRzIHRoZSByZWdpc3RlcnMgb2YgdGhlIGNhcmQgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgaW50IGlfQVBDSTAzNV9SZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQorc3RhdGljIGludCBhcGNpMDM1X3Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgaV9Db3VudCA9IDA7CisJaW50IGlfQ291bnQ7CiAKIAlmb3IgKGlfQ291bnQgPSAxOyBpX0NvdW50IDw9IDQ7IGlfQ291bnQrKykgewogCQlpX1dhdGNoZG9nTmJyID0gaV9Db3VudDsKLQkJb3V0bCgweDAsIGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMCk7CS8qIHN0b3AgYWxsIHRpbWVycyAqLworCisJCS8qIHN0b3AgYWxsIHRpbWVycyAqLworCQlvdXRsKDB4MCwgZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAwKTsKIAl9CiAJb3V0bCgweDAsIGRldnByaXYtPmlvYmFzZSArIDEyOCArIDEyKTsJLyogRGlzYWJsZSB0aGUgd2FybmluZyBkZWxheSAqLwogCiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBzdGF0aWMgdm9pZCB2X0FQQ0kwMzVfSW50ZXJydXB0CQkJCQkgICAgIHwKLXwJCQkJCSAgKGludCBpcnEgLCB2b2lkICpkKSAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IEludGVycnVwdCBwcm9jZXNzaW5nIFJvdXRpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBpbnQgaXJxICAgICAgICAgICAgICAgICA6IGlycSBudW1iZXIgICAgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmQgICAgICAgICAgICAgICAgIDogdm9pZCBwb2ludGVyICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIHZvaWQgdl9BUENJMDM1X0ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQorc3RhdGljIHZvaWQgYXBjaTAzNV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKIHsKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCB1aV9TdGF0dXNSZWdpc3RlcjEgPSAwOwotCXVuc2lnbmVkIGludCB1aV9TdGF0dXNSZWdpc3RlcjIgPSAwOwotCXVuc2lnbmVkIGludCB1aV9SZWFkQ29tbWFuZCA9IDA7Ci0JdW5zaWduZWQgaW50IHVpX0NoYW5uZWxOdW1iZXIgPSAwOwotCXVuc2lnbmVkIGludCB1aV9EaWdpdGFsVGVtcGVyYXR1cmUgPSAwOworCXVuc2lnbmVkIGludCB1aV9TdGF0dXNSZWdpc3RlcjE7CisJdW5zaWduZWQgaW50IHVpX1N0YXR1c1JlZ2lzdGVyMjsKKwl1bnNpZ25lZCBpbnQgdWlfUmVhZENvbW1hbmQ7CisJdW5zaWduZWQgaW50IHVpX0NoYW5uZWxOdW1iZXI7CisJdW5zaWduZWQgaW50IHVpX0RpZ2l0YWxUZW1wZXJhdHVyZTsKIAogCWlmIChpX1RlbXAgPT0gMSkgewogCQlpX1dhdGNoZG9nTmJyID0gaV9GbGFnOwogCQlpX0ZsYWcgPSBpX0ZsYWcgKyAxOwogCX0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8qIFJlYWQgdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGVtcGVyYXR1cmUgV2FybmluZyAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JdWlfU3RhdHVzUmVnaXN0ZXIxID0gaW5sKGRldnByaXYtPmlvYmFzZSArIDEyOCArIDE2KTsKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8qIFJlYWQgdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgZm9yIFdhdGNoZG9nL3RpbWVyICovCi0gICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKwkvKiBSZWFkIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRlbXBlcmF0dXJlIFdhcm5pbmcgKi8KKwl1aV9TdGF0dXNSZWdpc3RlcjEgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgMTYpOworCisJLyogUmVhZCB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciBmb3IgV2F0Y2hkb2cvdGltZXIgKi8KIAl1aV9TdGF0dXNSZWdpc3RlcjIgPQogCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAyMCk7CiAKLQlpZiAoKCgodWlfU3RhdHVzUmVnaXN0ZXIxKSAmIDB4OCkgPT0gMHg4KSkJLyogVGVzdCBpZiB3YXJuaW5nIHJlbGF5IGludGVycnVwdCAqLwotCXsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKiBUZXN0IGlmIHdhcm5pbmcgcmVsYXkgaW50ZXJydXB0ICovCisJaWYgKCgoKHVpX1N0YXR1c1JlZ2lzdGVyMSkgJiAweDgpID09IDB4OCkpIHsKKwogCQkvKiBEaXNhYmxlIHRoZSB0ZW1wZXJhdHVyZSB3YXJuaW5nICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCXVpX1JlYWRDb21tYW5kID0gaW5sKGRldnByaXYtPmlvYmFzZSArIDEyOCArIDEyKTsKIAkJdWlfUmVhZENvbW1hbmQgPSB1aV9SZWFkQ29tbWFuZCAmIDB4RkZERjAwMDBVTDsKIAkJb3V0bCh1aV9SZWFkQ29tbWFuZCwgZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgMTIpOwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJLyogUmVhZCB0aGUgY2hhbm5lbCBudW1iZXIgKi8KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCXVpX0NoYW5uZWxOdW1iZXIgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgNjApOwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJLyogUmVhZCB0aGUgZGlnaXRhbCB0ZW1wZXJhdHVyZSB2YWx1ZSAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJdWlfRGlnaXRhbFRlbXBlcmF0dXJlID0gaW5sKGRldnByaXYtPmlvYmFzZSArIDEyOCArIDYwKTsKLQkJc2VuZF9zaWcoU0lHSU8sIGRldnByaXYtPnRza19DdXJyZW50LCAwKTsJLyogIHNlbmQgc2lnbmFsIHRvIHRoZSBzYW1wbGUgKi8KLQl9CQkJLyogaWYgKCgodWlfU3RhdHVzUmVnaXN0ZXIxICYgMHg4KSA9PSAweDgpKSAqLwogCi0JZWxzZSB7Ci0JCWlmICgodWlfU3RhdHVzUmVnaXN0ZXIyICYgMHgxKSA9PSAweDEpIHsKLQkJCXNlbmRfc2lnKFNJR0lPLCBkZXZwcml2LT50c2tfQ3VycmVudCwgMCk7CS8qICBzZW5kIHNpZ25hbCB0byB0aGUgc2FtcGxlICovCi0JCX0KLQl9CQkJLyogZWxzZSBpZiAoKCh1aV9TdGF0dXNSZWdpc3RlcjEgJiAweDgpID09IDB4OCkpICovCisJCS8qIFJlYWQgdGhlIGNoYW5uZWwgbnVtYmVyICovCisJCXVpX0NoYW5uZWxOdW1iZXIgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgNjApOworCisJCS8qIFJlYWQgdGhlIGRpZ2l0YWwgdGVtcGVyYXR1cmUgdmFsdWUgKi8KKwkJdWlfRGlnaXRhbFRlbXBlcmF0dXJlID0gaW5sKGRldnByaXYtPmlvYmFzZSArIDEyOCArIDYwKTsKKworCQkvKiAgc2VuZCBzaWduYWwgdG8gdGhlIHNhbXBsZSAqLworCQlzZW5kX3NpZyhTSUdJTywgZGV2cHJpdi0+dHNrX0N1cnJlbnQsIDApOworCisJfSBlbHNlIGlmICgodWlfU3RhdHVzUmVnaXN0ZXIyICYgMHgxKSA9PSAweDEpIHsKKwkJLyogIHNlbmQgc2lnbmFsIHRvIHRoZSBzYW1wbGUgKi8KKwkJc2VuZF9zaWcoU0lHSU8sIGRldnByaXYtPnRza19DdXJyZW50LCAwKTsKKwl9CiAKIAlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTAwLmMKaW5kZXggMDU0OTEwNS4uYTYzMzk1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MDAuYwpAQCAtMSw0OCArMSwyNSBAQAotLyoqCi1AdmVyYmF0aW0KLQotQ29weXJpZ2h0IChDKSAyMDA0LDIwMDUgIEFEREktREFUQSBHbWJIIGZvciB0aGUgc291cmNlIGNvZGUgb2YgdGhpcyBtb2R1bGUuCi0KLQlBRERJLURBVEEgR21iSAotCURpZXNlbHN0cmFzc2UgMwotCUQtNzc4MzMgT3R0ZXJzd2VpZXIKLQlUZWw6ICsxOSgwKTcyMjMvOTQ5My0wCi0JRmF4OiArNDkoMCk3MjIzLzk0OTMtOTIKLQlodHRwOi8vd3d3LmFkZGktZGF0YS5jb20KLQlpbmZvQGFkZGktZGF0YS5jb20KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1AZW5kdmVyYmF0aW0KLSovCiAvKgotCi0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCAoQykgQURESS1EQVRBIEdtYkggICAgICAgICAgRGllc2Vsc3RyYcOfZSAzICAgICAgIEQtNzc4MzMgT3R0ZXJzd2VpZXIgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IFRlbCA6ICs0OSAoMCkgNzIyMy85NDkzLTAgICAgIHwgZW1haWwgICAgOiBpbmZvQGFkZGktZGF0YS5jb20gICAgICAgICB8Ci0gIHwgRmF4IDogKzQ5ICgwKSA3MjIzLzk0OTMtOTIgICAgfCBJbnRlcm5ldCA6IGh0dHA6Ly93d3cuYWRkaS1kYXRhLmNvbSAgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IFByb2plY3QgICAgIDogQVBDSS0xNTAwICAgICAgIHwgQ29tcGlsZXIgICA6IEdDQyAgICAgICAgICAgICAgICAgICAgICB8Ci0gIHwgTW9kdWxlIG5hbWUgOiBod2Rydl9hcGNpMTUwMC5jfCBWZXJzaW9uICAgIDogMi45NiAgICAgICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IFByb2plY3QgbWFuYWdlcjogRXJpYyBTdG9seiAgIHwgRGF0ZSAgICAgICA6ICAwMi8xMi8yMDAyICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCBEZXNjcmlwdGlvbiA6ICAgSGFyZHdhcmUgTGF5ZXIgQWNjZXNzIEZvciBBUENJLTE1MDAgICAgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8ICAgRGF0ZSAgIHwgICBBdXRob3IgIHwgICAgICAgICAgRGVzY3JpcHRpb24gb2YgdXBkYXRlcyAgICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICB8ICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gIHwgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLQotLyoqKioqKioqKiAgICAgIERlZmluaXRpb25zIGZvciBBUENJLTE1MDAgY2FyZCAgKioqKiovCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwNSAgQURESS1EQVRBIEdtYkggZm9yIHRoZSBzb3VyY2UgY29kZSBvZiB0aGlzIG1vZHVsZS4KKyAqCisgKglBRERJLURBVEEgR21iSAorICoJRGllc2Vsc3RyYXNzZSAzCisgKglELTc3ODMzIE90dGVyc3dlaWVyCisgKglUZWw6ICsxOSgwKTcyMjMvOTQ5My0wCisgKglGYXg6ICs0OSgwKTcyMjMvOTQ5My05MgorICoJaHR0cDovL3d3dy5hZGRpLWRhdGEuY29tCisgKglpbmZvQGFkZGktZGF0YS5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisgKiB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKi8KIAogLyogQ2FyZCBTcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwogI2RlZmluZSBBUENJMTUwMF9BRERSRVNTX1JBTkdFCQk0CkBAIC0xNDEsOTkgKzExOCw0NSBAQAogCUFQQ0kxNTAwX1JXX1BPUlRfQl9QQVRURVJOX01BU0sKIH07CiAKLXN0YXRpYyBpbnQgaV9UaW1lckNvdW50ZXIxSW5pdCA9IDA7Ci1zdGF0aWMgaW50IGlfVGltZXJDb3VudGVyMkluaXQgPSAwOwotc3RhdGljIGludCBpX1dhdGNoZG9nQ291bnRlcjNJbml0ID0gMDsKLXN0YXRpYyBpbnQgaV9FdmVudDFTdGF0dXMgPSAwLCBpX0V2ZW50MlN0YXR1cyA9IDA7Ci1zdGF0aWMgaW50IGlfVGltZXJDb3VudGVyV2F0Y2hkb2dJbnRlcnJ1cHQgPSAwOwotc3RhdGljIGludCBpX0xvZ2ljID0gMCwgaV9Db3VudGVyTG9naWMgPSAwOwotc3RhdGljIGludCBpX0ludGVycnVwdE1hc2sgPSAwOwotc3RhdGljIGludCBpX0lucHV0Q2hhbm5lbCA9IDA7Ci1zdGF0aWMgaW50IGlfVGltZXJDb3VudGVyMUVuYWJsZWQgPSAwLCBpX1RpbWVyQ291bnRlcjJFbmFibGVkID0gMCwKLQkgICBpX1dhdGNoZG9nQ291bnRlcjNFbmFibGVkID0gMDsKK3N0YXRpYyBpbnQgaV9UaW1lckNvdW50ZXIxSW5pdDsKK3N0YXRpYyBpbnQgaV9UaW1lckNvdW50ZXIySW5pdDsKK3N0YXRpYyBpbnQgaV9XYXRjaGRvZ0NvdW50ZXIzSW5pdDsKK3N0YXRpYyBpbnQgaV9FdmVudDFTdGF0dXMsIGlfRXZlbnQyU3RhdHVzOworc3RhdGljIGludCBpX1RpbWVyQ291bnRlcldhdGNoZG9nSW50ZXJydXB0Oworc3RhdGljIGludCBpX0xvZ2ljLCBpX0NvdW50ZXJMb2dpYzsKK3N0YXRpYyBpbnQgaV9JbnRlcnJ1cHRNYXNrOworc3RhdGljIGludCBpX0lucHV0Q2hhbm5lbDsKK3N0YXRpYyBpbnQgaV9UaW1lckNvdW50ZXIxRW5hYmxlZCwgaV9UaW1lckNvdW50ZXIyRW5hYmxlZCwKKwkgICBpX1dhdGNoZG9nQ291bnRlcjNFbmFibGVkOwogCiAvKgotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMTUwMF9Db25maWdEaWdpdGFsSW5wdXRFdmVudCAgICAgICAgICAgICAgICAgfAotfAkJCSAgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IEFuIGV2ZW50IGNhbiBiZSBnZW5lcmF0ZWQgZm9yIGVhY2ggcG9ydC4gICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgVGhlIGZpcnN0IGV2ZW50IGlzIHJlbGF0ZWQgdG8gdGhlIGZpcnN0IDggY2hhbm5lbHMgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAocG9ydCAxKSBhbmQgdGhlIHNlY29uZCB0byB0aGUgZm9sbG93aW5nIDYgY2hhbm5lbHMgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIChwb3J0IDIpLiBBbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIHdoZW4gb25lIG9yIGJvdGggICB8Ci18ICAgICAgICAgICAgICAgICAgICAgZXZlbnRzIGhhdmUgb2NjdXJyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgOiBEcml2ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSAgICAgOiBEYXRhIFBvaW50ZXIgY29udGFpbnMgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcyBiZWxvdyB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgIGRhdGFbMF0gICAgICAgICAgICA6TnVtYmVyIG9mIHRoZSBpbnB1dCBwb3J0IG9uICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB0aGUgZXZlbnQgd2lsbCB0YWtlIHBsYWNlICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIG9yIDIpCi18ICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV0gICAgICAgICAgICA6IFRoZSBldmVudCBsb2dpYyBmb3IgcG9ydCAxIGhhcyAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlZSBwb3NzaWJpbGl0aWVzICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjAgIEFQQ0kxNTAwX0FORCAgICAgICA6VGhpcyBsb2dpYyAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rcyAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnB1dHMgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhbiBBTkQgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpYy4gICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBBUENJMTUwMF9PUiAgICAgICAgOlRoaXMgbG9naWMgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3MgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXRzICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1IgbG9naWMuICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgQVBDSTE1MDBfT1JfUFJJT1JJVFkgICAgICAgIHwKLXwJCQkJCQkJCTpUaGlzIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtzICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlucHV0cyAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1IgbG9naWMuICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dCAxICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyB0aGUgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGVzdCAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsIGFuZCAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgICA4ICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc21hbGxlc3R8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhlIHNlY29uZCBwb3J0IHRoZSB1c2VyIGhhc3wKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgcG9zc2liaWxpdHk6ICAgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBDSTE1MDBfT1IgICAgICAgIDpUaGlzIGxvZ2ljICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtzICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlucHV0cyAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGFyaXR5ICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1IgbG9naWMgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIGRhdGFbMl0gICAgICAgICAgICAgIDogVGhlc2UgOC1jaGFyYWN0ZXIgd29yZCBmb3IgcG9ydDF8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgNi1jaGFyYWN0ZXIgd29yZCBmb3IgcG9ydCAyIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmUgdGhlIG1hc2sgb2YgdGhlIGV2ZW50LiAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWFjaCBwbGFjZSBnaXZlcyB0aGUgc3RhdGUgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgaW5wdXQgY2hhbm5lbHMgYW5kIGNhbiAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgb25lIG9mIHRoZXNlIHNpeCBjaGFyYWN0ZXJzfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIDogVGhpcyBpbnB1dCBtdXN0IGJlIG9uIDAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgOiBUaGlzIGlucHV0IG11c3QgYmUgb24gMSAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICA6IFRoaXMgaW5wdXQgcmVhY3RzIHRvICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBmYWxsaW5nIGVkZ2UgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgOiBUaGlzIGlucHV0IHJlYWN0cyB0byBhICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlICAgICAgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIDogVGhpcyBpbnB1dCByZWFjdHMgdG8gYm90aCBlZGdlcyB8Ci18Ci18CQkJCQkJCQk1ICA6IFRoaXMgaW5wdXQgaXMgbm90ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBmb3IgZXZlbnQgICAJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgaW50IGlfQVBDSTE1MDBfQ29uZmlnRGlnaXRhbElucHV0RXZlbnQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQorICogQW4gZXZlbnQgY2FuIGJlIGdlbmVyYXRlZCBmb3IgZWFjaCBwb3J0LiBUaGUgZmlyc3QgZXZlbnQgaXMgcmVsYXRlZCB0byB0aGUKKyAqIGZpcnN0IDggY2hhbm5lbHMgKHBvcnQgMSkgYW5kIHRoZSBzZWNvbmQgdG8gdGhlIGZvbGxvd2luZyA2IGNoYW5uZWxzIChwb3J0IDIpCisgKiBBbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIHdoZW4gb25lIG9yIGJvdGggZXZlbnRzIGhhdmUgb2NjdXJyZWQuCisgKgorICogZGF0YVswXSBOdW1iZXIgb2YgdGhlIGlucHV0IHBvcnQgb24gd2hpY2ggdGhlIGV2ZW50IHdpbGwgdGFrZSBwbGFjZSAoMSBvciAyKQorICogZGF0YVsxXSBUaGUgZXZlbnQgbG9naWMgZm9yIHBvcnQgMSBoYXMgdGhyZWUgcG9zc2liaWxpdGllczoKKyAqCUFQQ0kxNTAwX0FORAkJVGhpcyBsb2dpYyBsaW5rcyB0aGUgaW5wdXRzIHdpdGggYW4gQU5EIGxvZ2ljLgorICoJQVBDSTE1MDBfT1IJCVRoaXMgbG9naWMgbGlua3MgdGhlIGlucHV0cyB3aXRoIGEgT1IgbG9naWMuCisgKglBUENJMTUwMF9PUl9QUklPUklUWQlUaGlzIGxvZ2ljIGxpbmtzIHRoZSBpbnB1dHMgd2l0aCBhIHByaW9yaXR5IE9SCisgKgkJCQlsb2dpYy4gSW5wdXQgMSBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgbGV2ZWwKKyAqCQkJCWFuZCBpbnB1dCA4IHRoZQlzbWFsbGVzdC4KKyAqCUZvciB0aGUgc2Vjb25kIHBvcnQgdGhlIHVzZXIgaGFzIDEgcG9zc2liaWxpdHk6CisgKglBUENJMTUwMF9PUglUaGlzIGxvZ2ljIGxpbmtzIHRoZSBpbnB1dHMgd2l0aCBhIHBvbGFyaXR5IE9SIGxvZ2ljCisgKiBkYXRhWzJdIFRoZXNlIDgtY2hhcmFjdGVyIHdvcmQgZm9yIHBvcnQxIGFuZCA2LWNoYXJhY3RlciB3b3JkIGZvciBwb3J0IDIKKyAqCSAgIGdpdmUgdGhlIG1hc2sgb2YgdGhlIGV2ZW50LiBFYWNoIHBsYWNlIGdpdmVzIHRoZSBzdGF0ZSBvZiB0aGUgaW5wdXQKKyAqCSAgIGNoYW5uZWxzIGFuZCBjYW4gaGF2ZSBvbmUgb2YgdGhlc2Ugc2l4IGNoYXJhY3RlcnMKKyAqCTAgVGhpcyBpbnB1dCBtdXN0IGJlIG9uIDAKKyAqCTEgVGhpcyBpbnB1dCBtdXN0IGJlIG9uIDEKKyAqCTIgVGhpcyBpbnB1dCByZWFjdHMgdG8gYSBmYWxsaW5nIGVkZ2UKKyAqCTMgVGhpcyBpbnB1dCByZWFjdHMgdG8gYSByaXNpbmcgZWRnZQorICoJNCBUaGlzIGlucHV0IHJlYWN0cyB0byBib3RoIGVkZ2VzCisgKgk1IFRoaXMgaW5wdXQgaXMgbm90IHVzZWQgZm9yIGV2ZW50CisgKi8KK3N0YXRpYyBpbnQgYXBjaTE1MDBfZGlfY29uZmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBpX1BhdHRlcm5Qb2xhcml0eSA9IDAsIGlfUGF0dGVyblRyYW5zaXRpb24gPSAwLCBpX1BhdHRlcm5NYXNrID0gMDsKQEAgLTI0MSwxNCArMTY0LDEwIEBACiAJaW50IGlfUGF0dGVyblRyYW5zaXRpb25Db3VudCA9IDAsIGlfUmVnVmFsdWU7CiAJaW50IGk7CiAKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIG1hc3RlciBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciAqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19NQVNURVJfSU5URVJSVVBUX0NPTlRST0wsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogRGlzYWJsZXMgIHRoZSBtYWluIGludGVycnVwdCBvbiB0aGUgYm9hcmQgKi8KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoMHgwMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKIAlpZiAoZGF0YVswXSA9PSAxKSB7CkBAIC0yNTksNyArMTc4LDggQEAKIAkJCWlfTWF4Q2hhbm5lbCA9IDY7CiAJCX0JCS8qICBpZihkYXRhWzBdPT0yKSAqLwogCQllbHNlIHsKLQkJCXByaW50aygiXG5UaGUgc3BlY2lmaWVkIHBvcnQgZXZlbnQgIGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCSJUaGUgc3BlY2lmaWVkIHBvcnQgZXZlbnQgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qIGVsc2UgaWYoZGF0YVswXT09MikgKi8KIAl9CQkJLyogZWxzZSAgaWYgKGRhdGFbMF0gPT0gMSkgKi8KQEAgLTI3NCw3ICsxOTQsOCBAQAogCQlkYXRhWzFdID0gQVBDSTE1MDBfT1JfUFJJT1JJVFk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50aygiXG5UaGUgc3BlY2lmaWVkIGludGVycnVwdCBsb2dpYyBkb2VzIG5vdCBleGlzdFxuIik7CisJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJIlRoZSBzcGVjaWZpZWQgaW50ZXJydXB0IGxvZ2ljIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQkJCS8qIHN3aXRjaChkYXRhWzFdKTsgKi8KIApAQCAtMzE4LDM3ICsyMzksMzAgQEAKIAkJY2FzZSA1OgogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoIlxuVGhlIG9wdGlvbiBpbmRpY2F0ZWQgaW4gdGhlIGV2ZW50IG1hc2sgZG9lcyBub3QgZXhpc3RcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoZSBvcHRpb24gaW5kaWNhdGVkIGluIHRoZSBldmVudCBtYXNrIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiAgc3dpdGNoKGlfRXZlbnRNYXNrKSAqLwogCX0JCQkvKiBmb3IgKGlfQ291bnQgPSBpX01heENoYW5uZWw7IGlfQ291bnQgPjA7aV9Db3VudCAtLSkgKi8KIAogCWlmIChkYXRhWzBdID09IDEpIHsKLQkJICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBUZXN0IHRoZSBpbnRlcnJ1cHQgbG9naWMgKi8KLQkJICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCWlmIChkYXRhWzFdID09IEFQQ0kxNTAwX0FORCB8fAogCQkJZGF0YVsxXSA9PSBBUENJMTUwMF9PUiB8fAogCQkJZGF0YVsxXSA9PSBBUENJMTUwMF9PUl9QUklPUklUWSkgewotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogVGVzdHMgaWYgYSB0cmFuc2l0aW9uIHdhcyBkZWNsYXJlZCAqLwogCQkJLyogZm9yIGEgT1IgUFJJT1JJVFkgbG9naWMgICAgICAgICAgICAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQlpZiAoZGF0YVsxXSA9PSBBUENJMTUwMF9PUl9QUklPUklUWQogCQkJCSYmIGlfUGF0dGVyblRyYW5zaXRpb24gIT0gMCkgewotCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQkJCS8qIFRyYW5zaXRpb24gZXJyb3Igb24gYW4gT1IgUFJJT1JJVFkgbG9naWMgKi8KLQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJCQlwcmludGsoIlxuVHJhbnNpdGlvbiBlcnJvciBvbiBhbiBPUiBQUklPUklUWSBsb2dpY1xuIik7CisJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCSJUcmFuc2l0aW9uIGVycm9yIG9uIGFuIE9SIFBSSU9SSVRZIGxvZ2ljXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0JLyogIGlmIChkYXRhWzFdPT0gQVBDSTE1MDBfT1JfUFJJT1JJVFkgJiYgaV9QYXR0ZXJuVHJhbnNpdGlvbiAhPSAwKSAqLwogCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFRlc3RzIGlmIG1vcmUgdGhhbiBvbmUgdHJhbnNpdGlvbiAqLwogCQkJLyogd2FzIGRlY2xhcmVkIGZvciBhbiBBTkQgbG9naWMgICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJaWYgKGRhdGFbMV0gPT0gQVBDSTE1MDBfQU5EKSB7CiAJCQkJZm9yIChpX0NvdW50ID0gMDsgaV9Db3VudCA8IDg7IGlfQ291bnQrKykgewpAQCAtMzYwLDI5ICsyNzQsMjEgQEAKIAkJCQl9CS8qIGZvciAoaV9Db3VudCA9IDA7IGlfQ291bnQgPCA4OyBpX0NvdW50KyspICovCiAKIAkJCQlpZiAoaV9QYXR0ZXJuVHJhbnNpdGlvbkNvdW50ID4gMSkgewotCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCQkJCS8qIFRyYW5zaXRpb24gZXJyb3Igb24gYW4gQU5EIGxvZ2ljICAgICAqLwotCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCQkJCXByaW50aygiXG4gVHJhbnNpdGlvbiBlcnJvciBvbiBhbiBBTkQgbG9naWNcbiIpOworCQkJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkJCSJUcmFuc2l0aW9uIGVycm9yIG9uIGFuIEFORCBsb2dpY1xuIik7CiAJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCX0JLyogIGlmIChpX1BhdHRlcm5UcmFuc2l0aW9uQ291bnQgPiAxKSAqLwogCQkJfQkvKiAgaWYgKGRhdGFbMV09PSBBUENJMTUwMF9BTkQpICovCiAKLQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MIHJlZ2lzdGVyICovCi0JCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCQkvKioqKioqKioqKioqKioqKioqLwogCQkJLyogRGlzYWJsZSBQb3J0IEEgKi8KLQkJCSAgICAvKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YigweEYwLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIHBvbGFyaXR5IHJlZ2lzdGVyIG9mIHBvcnQgMSAgICAqLwotCQkJICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfUEFUVEVSTl9QT0xBUklUWSwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMzkwLDIwICsyOTYsMTYgQEAKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgcGF0dGVybiBtYXNrIHJlZ2lzdGVyIG9mICAgICAgKi8KIAkJCS8qIHBvcnQgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9BX1BBVFRFUk5fTUFTSywKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQkJb3V0YihpX1BhdHRlcm5NYXNrLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBwYXR0ZXJuIHRyYW5zaXRpb24gcmVnaXN0ZXIgICovCiAJCQkvKiBvZiBwb3J0IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfUEFUVEVSTl9UUkFOU0lUSU9OLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC00MTEsMTAgKzMxMyw4IEBACiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgbW9kZSBzcGVjaWZpY2F0aW9uIG1hc2sgICAgKi8KIAkJCS8qIHJlZ2lzdGVyIG9mIHBvcnQgMSAgICAgICAgICAgICAgICAgICAgICovCi0JCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQV9TUEVDSUZJQ0FUSU9OLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC00MjIsMTcgKzMyMiwxMyBAQAogCQkJCWluYihkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBtb2RlIHNwZWNpZmljYXRpb24gbWFzayAgICAqLwogCQkJLyogcmVnaXN0ZXIgb2YgcG9ydCAxICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9BX1NQRUNJRklDQVRJT04sCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFBvcnQgQSBuZXcgbW9kZSAgICAqLwotCQkJICAvKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJaV9SZWdWYWx1ZSA9IChpX1JlZ1ZhbHVlICYgMHhGOSkgfCBkYXRhWzFdIHwgMHg5OwogCQkJb3V0YihpX1JlZ1ZhbHVlLApAQCAtNDQxLDUzICszMzcsNDAgQEAKIAogCQkJaV9FdmVudDFTdGF0dXMgPSAxOwogCi0JCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wgcmVnaXN0ZXIgKi8KLQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgLyoqKioqKioqKioqKioqKioqLwogCQkJLyogRW5hYmxlIFBvcnQgQSAqLwotCQkJICAvKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKDB4RjQsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAogCQl9CQkvKiAgaWYoZGF0YVsxXT09QVBDSTE1MDBfQU5EfHxkYXRhWzFdPT1BUENJMTUwMF9PUnx8ZGF0YVsxXT09QVBDSTE1MDBfT1JfUFJJT1JJVFkpICovCiAJCWVsc2UgewotCQkJcHJpbnRrKCJcblRoZSBjaG9pY2UgZm9yIGludGVycnVwdCBsb2dpYyBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhlIGNob2ljZSBmb3IgaW50ZXJydXB0IGxvZ2ljIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiAgZWxzZSB9Ly8gaWYoZGF0YVsxXT09QVBDSTE1MDBfQU5EfHxkYXRhWzFdPT1BUENJMTUwMF9PUnx8ZGF0YVsxXT09QVBDSTE1MDBfT1JfUFJJT1JJVFkpICovCiAJfQkJCS8qICAgIGlmIChkYXRhWzBdPT0gMSkgKi8KIAotCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBUZXN0IGlmIGV2ZW50IHNldHRpbmcgZm9yIHBvcnQgMiAqLwotCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCWlmIChkYXRhWzBdID09IDIpIHsKLQkJICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFRlc3QgdGhlIGV2ZW50IGxvZ2ljICovCi0JCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCWlmIChkYXRhWzFdID09IEFQQ0kxNTAwX09SKSB7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MIHJlZ2lzdGVyICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKiovCiAJCQkvKiBEaXNhYmxlIFBvcnQgQiAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoMHg3NCwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBtb2RlIHNwZWNpZmljYXRpb24gbWFzayAgKi8KIAkJCS8qIHJlZ2lzdGVyIG9mIHBvcnQgQiAgICAgICAgICAgICAgICAgICAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9TUEVDSUZJQ0FUSU9OLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC00OTUsMTAgKzM3OCw4IEBACiAJCQkJaW5iKGRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBtb2RlIHNwZWNpZmljYXRpb24gbWFzayAgICAqLwogCQkJLyogcmVnaXN0ZXIgb2YgcG9ydCBCICAgICAgICAgICAgICAgICAgICAgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9TUEVDSUZJQ0FUSU9OLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC01MDcsMzcgKzM4OCwyOSBAQAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyBlcnJvciBjaGFubmVscyAxIGFuZCAyICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJaV9QYXR0ZXJuTWFzayA9IChpX1BhdHRlcm5NYXNrIHwgMHhDMCk7CiAJCQlpX1BhdHRlcm5Qb2xhcml0eSA9IChpX1BhdHRlcm5Qb2xhcml0eSB8IDB4QzApOwogCQkJaV9QYXR0ZXJuVHJhbnNpdGlvbiA9IChpX1BhdHRlcm5UcmFuc2l0aW9uIHwgMHhDMCk7CiAKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgcG9sYXJpdHkgcmVnaXN0ZXIgb2YgcG9ydCAyICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX1BBVFRFUk5fUE9MQVJJVFksCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJCW91dGIoaV9QYXR0ZXJuUG9sYXJpdHksCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgcGF0dGVybiB0cmFuc2l0aW9uIHJlZ2lzdGVyICAgICovCiAJCQkvKiBvZiBwb3J0IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfUEFUVEVSTl9UUkFOU0lUSU9OLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCQlvdXRiKGlfUGF0dGVyblRyYW5zaXRpb24sCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgcGF0dGVybiBNYXNrIHJlZ2lzdGVyICAgICovCiAJCQkvKiBvZiBwb3J0IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9QQVRURVJOX01BU0ssCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKQEAgLTU0NiwyMCArNDE5LDE2IEBACiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIG1vZGUgc3BlY2lmaWNhdGlvbiBtYXNrICAgICovCiAJCQkvKiByZWdpc3RlciBvZiBwb3J0IDIgICAgICAgICAgICAgICAgICAgICAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX1NQRUNJRklDQVRJT04sCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJCWlfUmVnVmFsdWUgPQogCQkJCWluYihkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIG1vZGUgc3BlY2lmaWNhdGlvbiBtYXNrICAgICovCiAJCQkvKiByZWdpc3RlciBvZiBwb3J0IDIgICAgICAgICAgICAgICAgICAgICAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX1NQRUNJRklDQVRJT04sCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTU2OSwyMyArNDM4LDIwIEBACiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKIAkJCWlfRXZlbnQyU3RhdHVzID0gMTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wgcmVnaXN0ZXIgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJb3V0YihBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKiovCiAJCQkvKiBFbmFibGUgUG9ydCBCICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKiovCiAKIAkJCW91dGIoMHhGNCwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQl9CQkvKiAgIGlmIChkYXRhWzFdID09IEFQQ0kxNTAwX09SKSAqLwogCQllbHNlIHsKLQkJCXByaW50aygiXG5UaGUgY2hvaWNlIGZvciBpbnRlcnJ1cHQgbG9naWMgZG9lcyBub3QgZXhpc3RcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoZSBjaG9pY2UgZm9yIGludGVycnVwdCBsb2dpYyBkb2VzIG5vdCBleGlzdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogZWxzZWlmIChkYXRhWzFdID09IEFQQ0kxNTAwX09SKSAqLwogCX0JCQkvKiBpZihkYXRhWzBdPT0yKSAqLwpAQCAtNTk0LDMxICs0NjAsMTUgQEAKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCBpX0FQQ0kxNTAwX1N0YXJ0U3RvcElucHV0RXZlbnQgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJICAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogIEFsbG93cyBvciBkaXNhbGxvd3MgYSBwb3J0IGV2ZW50ICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgICAgICA6IERyaXZlciBoYW5kbGUgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdWlfQ2hhbm5lbCA6IENoYW5uZWwgbnVtYmVyIHRvIHJlYWQgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSAgICAgICAgICA6IERhdGEgUG9pbnRlciB0byByZWFkIHN0YXR1cyAgfAotfCAgICAgICAgICAgICAgICAgICAgICBkYXRhWzBdICAgICAgICAgICAgICAgICA6MCBTdGFydCBpbnB1dCBldmVudAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBTdG9wIGlucHV0IGV2ZW50Ci18ICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV0gICAgICAgICAgICAgICAgIDpObyBvZiBwb3J0ICgxIG9yIDIpCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTAwX1N0YXJ0U3RvcElucHV0RXZlbnQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCSAgdW5zaWduZWQgaW50ICpkYXRhKQorICogQWxsb3dzIG9yIGRpc2FsbG93cyBhIHBvcnQgZXZlbnQKKyAqCisgKiBkYXRhWzBdIDAgPSBTdGFydCBpbnB1dCBldmVudCwgMSA9IFN0b3AgaW5wdXQgZXZlbnQKKyAqIGRhdGFbMV0gTnVtYmVyIG9mIHBvcnQgKDEgb3IgMikKKyAqLworc3RhdGljIGludCBhcGNpMTUwMF9kaV93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgaV9FdmVudDFJbnRlcnJ1cHRTdGF0dXMgPSAwLCBpX0V2ZW50MkludGVycnVwdFN0YXR1cyA9CkBAIC02MjYsNDggKzQ3NiwzMCBAQAogCiAJc3dpdGNoIChkYXRhWzBdKSB7CiAJY2FzZSBTVEFSVDoKLQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogVGVzdHMgdGhlIHBvcnQgbnVtYmVyICovCi0JICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJaWYgKGRhdGFbMV0gPT0gMSB8fCBkYXRhWzFdID09IDIpIHsKLQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogVGVzdCBpZiBwb3J0IDEgc2VsZWN0ZWQgKi8KLQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQlpZiAoZGF0YVsxXSA9PSAxKSB7Ci0JCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogVGVzdCBpZiBldmVudCBpbml0aWFsaXNlZCAqLwotCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCWlmIChpX0V2ZW50MVN0YXR1cyA9PSAxKSB7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wgcmVnaXN0ZXIgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YihBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIERpc2FibGUgUG9ydCBBICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKDB4RjAsCiAJCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgICAgICAqLwogCQkJCQkvKiBwb3J0IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfQ09NTUFORF9BTkRfU1RBVFVTLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBBbGxvd3MgdGhlIHBhdHRlcm4gaW50ZXJydXB0ICAgICAgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKDB4QzAsCiAJCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wgcmVnaXN0ZXIgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YihBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogRW5hYmxlIFBvcnQgQSAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKDB4RjQsCiAJCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC02ODAsMTg1ICs1MTIsMTQyIEBACiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAogCQkJCQkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9JTlRFUlJVUFRfQ09OVFJPTCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogQXV0aG9yaXplcyB0aGUgbWFpbiBpbnRlcnJ1cHQgb24gdGhlIGJvYXJkICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YigweEQwLAogCQkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCiAJCQkJfQkvKiAgaWYoaV9FdmVudDFTdGF0dXM9PTEpICovCiAJCQkJZWxzZSB7Ci0JCQkJCXByaW50aygiXG5FdmVudCAxIG5vdCBpbml0aWFsaXNlZFxuIik7CisJCQkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCQkJIkV2ZW50IDEgbm90IGluaXRpYWxpc2VkXG4iKTsKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJfQkvKiBlbHNlIGlmKGlfRXZlbnQxU3RhdHVzPT0xKSAqLwogCQkJfQkvKiBpZiAoZGF0YVsxXT09MSkgKi8KIAkJCWlmIChkYXRhWzFdID09IDIpIHsKIAogCQkJCWlmIChpX0V2ZW50MlN0YXR1cyA9PSAxKSB7Ci0JCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBTZWxlY3RzIHRoZSBBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MIHJlZ2lzdGVyICovCi0JCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogRGlzYWJsZSBQb3J0IEIgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoMHg3NCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiAgICAgICovCiAJCQkJCS8qIHBvcnQgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9DT01NQU5EX0FORF9TVEFUVVMsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIEFsbG93cyB0aGUgcGF0dGVybiBpbnRlcnJ1cHQgICAgICAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoMHhDMCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2VsZWN0cyB0aGUgQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCByZWdpc3RlciAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBFbmFibGUgUG9ydCBCICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoMHhGNCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAogCQkJCQkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9JTlRFUlJVUFRfQ09OVFJPTCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogQXV0aG9yaXplcyB0aGUgbWFpbiBpbnRlcnJ1cHQgb24gdGhlIGJvYXJkICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YigweEQwLAogCQkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQkJCQlpX0V2ZW50MkludGVycnVwdFN0YXR1cyA9IDE7CiAJCQkJfQkvKiAgaWYoaV9FdmVudDJTdGF0dXM9PTEpICovCiAJCQkJZWxzZSB7Ci0JCQkJCXByaW50aygiXG5FdmVudCAyIG5vdCBpbml0aWFsaXNlZFxuIik7CisJCQkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCQkJIkV2ZW50IDIgbm90IGluaXRpYWxpc2VkXG4iKTsKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJfQkvKiBlbHNlIGlmKGlfRXZlbnQyU3RhdHVzPT0xKSAqLwogCQkJfQkvKiAgaWYoZGF0YVsxXT09MikgKi8KIAkJfQkJLyogIGlmIChkYXRhWzFdID09IDEgfHwgZGF0YVswXSA9PSAyKSAqLwogCQllbHNlIHsKLQkJCXByaW50aygiXG5UaGUgcG9ydCBwYXJhbWV0ZXIgaXMgaW4gZXJyb3JcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoZSBwb3J0IHBhcmFtZXRlciBpcyBpbiBlcnJvclxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogZWxzZSBpZiAoZGF0YVsxXSA9PSAxIHx8IGRhdGFbMF0gPT0gMikgKi8KIAogCQlicmVhazsKIAogCWNhc2UgU1RPUDoKLQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogVGVzdHMgdGhlIHBvcnQgbnVtYmVyICovCi0JCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJaWYgKGRhdGFbMV0gPT0gMSB8fCBkYXRhWzFdID09IDIpIHsKLQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogVGVzdCBpZiBwb3J0IDEgc2VsZWN0ZWQgKi8KLQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQlpZiAoZGF0YVsxXSA9PSAxKSB7Ci0JCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogVGVzdCBpZiBldmVudCBpbml0aWFsaXNlZCAqLwotCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCWlmIChpX0V2ZW50MVN0YXR1cyA9PSAxKSB7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wgcmVnaXN0ZXIgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YihBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIERpc2FibGUgUG9ydCBBICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKDB4RjAsCiAJCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgICAgICAqLwogCQkJCQkvKiBwb3J0IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfQ09NTUFORF9BTkRfU1RBVFVTLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBJbmhpYml0cyB0aGUgcGF0dGVybiBpbnRlcnJ1cHQgICAgICAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoMHhFMCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2VsZWN0cyB0aGUgQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCByZWdpc3RlciAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBFbmFibGUgUG9ydCBBICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoMHhGNCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJCQkJaV9FdmVudDFJbnRlcnJ1cHRTdGF0dXMgPSAwOwogCQkJCX0JLyogIGlmKGlfRXZlbnQxU3RhdHVzPT0xKSAqLwogCQkJCWVsc2UgewotCQkJCQlwcmludGsoIlxuRXZlbnQgMSBub3QgaW5pdGlhbGlzZWRcbiIpOworCQkJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkJCSJFdmVudCAxIG5vdCBpbml0aWFsaXNlZFxuIik7CiAJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCX0JLyogZWxzZSBpZihpX0V2ZW50MVN0YXR1cz09MSkgKi8KIAkJCX0JLyogaWYgKGRhdGFbMV09PTEpICovCiAJCQlpZiAoZGF0YVsxXSA9PSAyKSB7Ci0JCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFRlc3QgaWYgZXZlbnQgaW5pdGlhbGlzZWQgKi8KLQkJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJaWYgKGlfRXZlbnQyU3RhdHVzID09IDEpIHsKLQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBTZWxlY3RzIHRoZSBBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MIHJlZ2lzdGVyICovCi0JCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YihBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCSAgLyoqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogRGlzYWJsZSBQb3J0IEIgKi8KLQkJCSAgLyoqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YigweDc0LAogCQkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgICAgICAqLwogCQkJCQkvKiBwb3J0IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX0NPTU1BTkRfQU5EX1NUQVRVUywgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogSW5oaWJpdHMgdGhlIHBhdHRlcm4gaW50ZXJydXB0ICAgICAgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKDB4RTAsCiAJCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wgcmVnaXN0ZXIgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YihBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogRW5hYmxlIFBvcnQgQiAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKDB4RjQsCiAJCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCQkJCWlfRXZlbnQySW50ZXJydXB0U3RhdHVzID0gMDsKIAkJCQl9CS8qICBpZihpX0V2ZW50MlN0YXR1cz09MSkgKi8KIAkJCQllbHNlIHsKLQkJCQkJcHJpbnRrKCJcbkV2ZW50IDIgbm90IGluaXRpYWxpc2VkXG4iKTsKKwkJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCQkiRXZlbnQgMiBub3QgaW5pdGlhbGlzZWRcbiIpOwogCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCQl9CS8qIGVsc2UgaWYoaV9FdmVudDJTdGF0dXM9PTEpICovCiAJCQl9CS8qIGlmKGRhdGFbMV09PTIpICovCiAKIAkJfQkJLyogIGlmIChkYXRhWzFdID09IDEgfHwgZGF0YVsxXSA9PSAyKSAqLwogCQllbHNlIHsKLQkJCXByaW50aygiXG5UaGUgcG9ydCBwYXJhbWV0ZXIgaXMgaW4gZXJyb3JcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoZSBwb3J0IHBhcmFtZXRlciBpcyBpbiBlcnJvclxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogZWxzZSBpZiAoZGF0YVsxXSA9PSAxIHx8IGRhdGFbMV0gPT0gMikgKi8KIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKCJcblRoZSBvcHRpb24gb2YgU1RBUlQvU1RPUCBsb2dpYyBkb2VzIG5vdCBleGlzdFxuIik7CisJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJIlRoZSBvcHRpb24gb2YgU1RBUlQvU1RPUCBsb2dpYyBkb2VzIG5vdCBleGlzdFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0JCQkvKiBzd2l0Y2goZGF0YVswXSkgKi8KIApAQCAtODY2LDM1ICs2NTUsMTcgQEAKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCBpX0FQQ0kxNTAwX0luaXRpYWxpc2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJICAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogUmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIGRpZ2l0YWwgaW5wdXQgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgICAgICA6IERyaXZlciBoYW5kbGUgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdWlfQ2hhbm5lbCA6IENoYW5uZWwgbnVtYmVyIHRvIHJlYWQgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSAgICAgICAgICA6IERhdGEgUG9pbnRlciB0byByZWFkIHN0YXR1cyAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMTUwMF9Jbml0aWFsaXNhdGlvbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBSZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgZGlnaXRhbCBpbnB1dAorICovCitzdGF0aWMgaW50IGFwY2kxNTAwX2RpX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGlfRHVtbXlSZWFkID0gMDsKIAotICAgIC8qKioqKioqKioqKioqKioqKiovCiAJLyogU29mdHdhcmUgcmVzZXQgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqLwogCWlfRHVtbXlSZWFkID0gaW5iKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCW91dGIoMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJaV9EdW1teVJlYWQgPSBpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC05MDIsMTYgKzY3MywxMiBAQAogCW91dGIoMSwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YigwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgY29uZmlndXJhdGlvbiBjb250cm9sIHJlZ2lzdGVyICovCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YigweEY0LCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBtb2RlIHNwZWNpZmljYXRpb24gcmVnaXN0ZXIgb2YgcG9ydCBBICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9BX1NQRUNJRklDQVRJT04sCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCW91dGIoMHgxMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC05NDMsOSArNzEwLDcgQEAKIAkvKiBEZWxldGVzIHRoZSByZWdpc3RlciAqLwogCW91dGIoMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIG1vZGUgc3BlY2lmaWNhdGlvbiByZWdpc3RlciBvZiBwb3J0IEIgKi8KLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX1NQRUNJRklDQVRJT04sCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCW91dGIoMHgxMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC05NzUsOSArNzQwLDcgQEAKIAkvKiBEZWxldGVzIHRoZSByZWdpc3RlciAqLwogCW91dGIoMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgZGF0YSBwYXRoIHBvbGFyaXR5IHJlZ2lzdGVyIG9mIHBvcnQgQyAqLwotCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQ19EQVRBX1BDSVRDSF9QT0xBUklUWSwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJLyogSGlnaCBsZXZlbCBvZiBwb3J0IEMgbWVhbnMgMSAqLwpAQCAtOTkyLDkgKzc1NSw3IEBACiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlbGV0ZXMgaXQgKi8KIAlvdXRiKDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDEgKi8KLQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjFfQ01EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJLyogRGVsZXRlcyBJUCBhbmQgSVVTICovCkBAIC0xMDA0LDkgKzc2NSw3IEBACiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlYWN0aXZhdGVzIHRoZSBpbnRlcnJ1cHQgbWFuYWdlbWVudCBvZiB0aW1lciAxICAgICAgICAgKi8KIAlvdXRiKDB4RTAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDIgKi8KLQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjJfQ01EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJLyogRGVsZXRlcyBJUCBhbmQgSVVTICovCkBAIC0xMDE2LDkgKzc3NSw3IEBACiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlYWN0aXZhdGVzIFRpbWVyIDIgaW50ZXJydXB0IG1hbmFnZW1lbnQ6ICAgICAgICAgICAgICAgKi8KIAlvdXRiKDB4RTAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGltZXIgMyAqLwotCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX0NNRF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlbGV0ZXMgSVAgYW5kIElVUyAqLwpAQCAtMTAyOCw5ICs3ODUsNyBAQAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkvKiBEZWFjdGl2YXRlcyBpbnRlcnJ1cHQgbWFuYWdlbWVudCBvZiB0aW1lciAzOiAgICAgICAgICAgICovCiAJb3V0YigweEUwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgbWFzdGVyIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyICovCi0JIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0lOVEVSUlVQVF9DT05UUk9MLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkvKiBEZWxldGVzIGFsbCBpbnRlcnJ1cHRzICovCkBAIC0xMDUxLDM3ICs4MDYsMTUgQEAKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCBpX0FQQ0kxNTAwX0NvbmZpZ0RpZ2l0YWxPdXRwdXRFcnJvckludGVycnVwdAotfCAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyBzdHJ1Y3QgY29tZWRpX2luc24KLXwgICAgICAgICAgICAgICAgICAgICAgKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogQ29uZmlndXJlcyB0aGUgZGlnaXRhbCBvdXRwdXQgbWVtb3J5IGFuZCB0aGUgZGlnaXRhbAotfCAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgZXJyb3IgaW50ZXJydXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA6IERyaXZlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgOiBEYXRhIFBvaW50ZXIgY29udGFpbnMgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93IHwKLXwgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgOnBvaW50ZXIgdG8gc3ViZGV2aWNlIHN0cnVjdHVyZQotfCAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuICAgICAgOnBvaW50ZXIgdG8gaW5zbiBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCQkJICBkYXRhWzBdICA6MTpNZW1vcnkgb24gICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkJCSAgICAgICAgICAgIDA6TWVtb3J5IG9mZiAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSAgOjEgRW5hYmxlIHRoZSB2b2x0YWdlIGVycm9yIGludGVycnVwdAotfAkJCQkJCQkgICA6MCBEaXNhYmxlIHRoZSB2b2x0YWdlIGVycm9yIGludGVycnVwdCAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJCQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMTUwMF9Db25maWdEaWdpdGFsT3V0cHV0RXJyb3JJbnRlcnJ1cHQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCQkJdW5zaWduZWQgaW50ICpkYXRhKQorICogQ29uZmlndXJlcyB0aGUgZGlnaXRhbCBvdXRwdXQgbWVtb3J5IGFuZCB0aGUgZGlnaXRhbCBvdXRwdXQgZXJyb3IgaW50ZXJydXB0CisgKgorICogZGF0YVsxXSAxID0gRW5hYmxlIHRoZSB2b2x0YWdlIGVycm9yIGludGVycnVwdAorICoJICAgMiA9IERpc2FibGUgdGhlIHZvbHRhZ2UgZXJyb3IgaW50ZXJydXB0CisgKi8KK3N0YXRpYyBpbnQgYXBjaTE1MDBfZG9fY29uZmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCkBAIC0xMDkwLDMxICs4MjMsMTUgQEAKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCBpX0FQQ0kxNTAwX1dyaXRlRGlnaXRhbE91dHB1dCAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJICAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogV3JpdGVzIHBvcnQgdmFsdWUgIFRvIHRoZSBzZWxlY3RlZCBwb3J0ICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgICAgICA6IERyaXZlciBoYW5kbGUgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB1aV9Ob09mQ2hhbm5lbHMgICAgOiBObyBPZiBDaGFubmVscyBUbyBXcml0ZSAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICAgICAgIDogRGF0YSBQb2ludGVyIHRvIHJlYWQgc3RhdHVzICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTAwX1dyaXRlRGlnaXRhbE91dHB1dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCSB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBXcml0ZXMgcG9ydCB2YWx1ZSB0byB0aGUgc2VsZWN0ZWQgcG9ydAorICovCitzdGF0aWMgaW50IGFwY2kxNTAwX2RvX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXN0YXRpYyB1bnNpZ25lZCBpbnQgdWlfVGVtcCA9IDA7CisJc3RhdGljIHVuc2lnbmVkIGludCB1aV9UZW1wOwogCXVuc2lnbmVkIGludCB1aV9UZW1wMTsKIAl1bnNpZ25lZCBpbnQgdWlfTm9PZkNoYW5uZWwgPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsJLyogIGdldCB0aGUgY2hhbm5lbCAqLwogCkBAIC0xMTY1LDcgKzg4Miw5IEBACiAJCQkJCUFQQ0kxNTAwX0RJR0lUQUxfT1ApOwogCQkJfQkvKiAgaWYoZGF0YVsxXT09MSkgKi8KIAkJCWVsc2UgewotCQkJCXByaW50aygiXG5TcGVjaWZpZWQgY2hhbm5lbCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkJIlNwZWNpZmllZCBjaGFubmVsIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQkvKiBlbHNlIGlmKGRhdGFbMV09PTEpICovCiAJCX0JCS8qIGVsc2VpZihkYXRhWzFdPT0wKSAqLwogCX0JCQkvKiBpZihkYXRhWzNdPT0wKSAqLwpAQCAtMTI0MiwxMiArOTYxLDE1IEBACiAJCQkJCQlBUENJMTUwMF9ESUdJVEFMX09QKTsKIAkJCQl9CS8qICBpZihkYXRhWzFdPT0xKSAqLwogCQkJCWVsc2UgewotCQkJCQlwcmludGsoIlxuU3BlY2lmaWVkIGNoYW5uZWwgbm90IHN1cHBvcnRlZFxuIik7CisJCQkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCQkJIlNwZWNpZmllZCBjaGFubmVsIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCQl9CS8qIGVsc2UgaWYoZGF0YVsxXT09MSkgKi8KIAkJCX0JLyogZWxzZWlmKGRhdGFbMV09PTApICovCiAJCX0JCS8qIGlmKGRhdGFbM109PTEpOyAqLwogCQllbHNlIHsKLQkJCXByaW50aygiXG5TcGVjaWZpZWQgZnVuY3Rpb25hbGl0eSBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiU3BlY2lmaWVkIGZ1bmN0aW9uYWxpdHkgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qIGlmIGVsc2UgZGF0YVszXT09MSkgKi8KIAl9CQkJLyogaWYgZWxzZSBkYXRhWzNdPT0wKSAqLwpAQCAtMTI1Niw1NyArOTc4LDIzIEBACiB9CiAKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMTUwMF9Db25maWdDb3VudGVyVGltZXJXYXRjaGRvZyhjb21lZGlfZGV2aWNlCi18ICAgICAgICAgICAgICAgICAgICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSl8Ci18CQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogQ29uZmlndXJlcyBUaGUgV2F0Y2hkb2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgICAgICA6IERyaXZlciBoYW5kbGUgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAgIDpwb2ludGVyIHRvIHN1YmRldmljZSBzdHJ1Y3R1cmUKLXwgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuICAgICAgOnBvaW50ZXIgdG8gaW5zbiBzdHJ1Y3R1cmUgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgOiBEYXRhIFBvaW50ZXIgdG8gcmVhZCBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVswXSAgICAgICAgICAgICAgICA6IDIgICAgIEFQQ0kxNTAwXzFfOF9LSFoKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgQVBDSTE1MDBfM182X0tIWiAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICBBUENJMTUwMF8xMTVfS0haCi18ICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV0gICAgICAgICAgICAgICAgOiAwICAgICBDb3VudGVyMS9UaW1lcjEKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgIENvdW50ZXIyL1RpbWVyMgotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgQ291bnRlcjMvV2F0Y2hkb2cKLXwgICAgICAgICAgICAgICAgICAgICAgZGF0YVsyXSAgICAgICAgICAgICAgICA6IDAgICAgIENvdW50ZXIKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgIFRpbWVyL1dhdGNoZG9nCi18ICAgICAgICAgICAgICAgICAgICAgIGRhdGFbM10gICAgICAgICAgICAgICAgOiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGhhcyAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvIG1lYW5pbmdzLiAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBJZiB0aGUgY291bnRlci90aW1lciAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHVzZWQgYXMgYSBjb3VudGVyICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpbWl0IHZhbHVlIG9mICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY291bnRlciBpcyBnaXZlbiAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gSWYgdGhlIGNvdW50ZXIvdGltZXIgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1c2VkIGFzIGEgdGltZXIsICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkaXZpZGVyIGZhY3RvciAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBvdXRwdXQgaXMgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbi4KLXwgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbNF0gICAgICAgICAgICAgICAgIDogMCAgICBBUENJMTUwMF9DT05USU5VT1VTCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgQVBDSTE1MDBfU0lOR0xFCi18ICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzVdICAgICAgICAgICAgICAgICA6IDAgICAgU29mdHdhcmUgVHJpZ2dlcgotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgIEhhcmR3YXJlIFRyaWdnZXIKLXwKLXwgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbNl0gICAgICAgICAgICAgICAgICA6MCAgICBTb2Z0d2FyZSBnYXRlCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgSGFyZHdhcmUgZ2F0ZQotfCAgICAgICAgICAgICAgICAgICAgICAgZGF0YVs3XSAgICAgICAgICAgICAgICAgIDowICAgIEludGVycnVwdCBEaXNhYmxlCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgSW50ZXJydXB0IEVuYWJsZQotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMTUwMF9Db25maWdDb3VudGVyVGltZXJXYXRjaGRvZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJCSB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBDb25maWd1cmVzIFRoZSBXYXRjaGRvZworICoKKyAqIGRhdGFbMF0gMCA9IEFQQ0kxNTAwXzExNV9LSFosIDEgPSBBUENJMTUwMF8zXzZfS0haLCAyID0gQVBDSTE1MDBfMV84X0tIWgorICogZGF0YVsxXSAwID0gQ291bnRlcjEvVGltZXIxLCAxID0gIENvdW50ZXIyL1RpbWVyMiwgMiA9IENvdW50ZXIzL1dhdGNoZG9nCisgKiBkYXRhWzJdIDAgPSBDb3VudGVyLCAxID0gVGltZXIvV2F0Y2hkb2cKKyAqIGRhdGFbM10gVGhpcyBwYXJhbWV0ZXIgaGFzIHR3byBtZWFuaW5ncy4gSWYgdGhlIGNvdW50ZXIvdGltZXIgaXMgdXNlZCBhcworICoJYSBjb3VudGVyIHRoZSBsaW1pdCB2YWx1ZSBvZiB0aGUgY291bnRlciBpcyBnaXZlbi4gSWYgdGhlIGNvdW50ZXIvdGltZXIKKyAqCWlzIHVzZWQgYXMgYSB0aW1lciwgdGhlIGRpdmlkZXIgZmFjdG9yIGZvciB0aGUgb3V0cHV0IGlzIGdpdmVuLgorICogZGF0YVs0XSAwID0gQVBDSTE1MDBfQ09OVElOVU9VUywgMSA9IEFQQ0kxNTAwX1NJTkdMRQorICogZGF0YVs1XSAwID0gU29mdHdhcmUgVHJpZ2dlciwgMSA9IEhhcmR3YXJlIFRyaWdnZXIKKyAqIGRhdGFbNl0gMCA9IFNvZnR3YXJlIGdhdGUsIDEgPSBIYXJkd2FyZSBnYXRlCisgKiBkYXRhWzddIDAgPSBJbnRlcnJ1cHQgRGlzYWJsZSwgMSA9IEludGVycnVwdCBFbmFibGUKKyAqLworc3RhdGljIGludCBhcGNpMTUwMF90aW1lcl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGlfVGltZXJDb3VudGVyTW9kZSwgaV9NYXN0ZXJDb25maWd1cmF0aW9uOwpAQCAtMTMxOSw3ICsxMDA3LDggQEAKIAl9CQkJLyogIGlmKGRhdGFbMF09PTB8fGRhdGFbMF09PTF8fGRhdGFbMF09PTIpICovCiAJZWxzZSB7CiAJCWlmIChkYXRhWzBdICE9IDMpIHsKLQkJCXByaW50aygiXG5UaGUgb3B0aW9uIGZvciBpbnB1dCBjbG9jayBzZWxlY3Rpb24gZG9lcyBub3QgZXhpc3RcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoZSBvcHRpb24gZm9yIGlucHV0IGNsb2NrIHNlbGVjdGlvbiBkb2VzIG5vdCBleGlzdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogIGlmKGRhdGFbMF0hPTMpICovCiAJfQkJCS8qIGVsc2VpZihkYXRhWzBdPT0wfHxkYXRhWzBdPT0xfHxkYXRhWzBdPT0yKSAqLwpAQCAtMTMzNSw3ICsxMDI0LDggQEAKIAkJCWRhdGFbMl0gPSBBUENJMTUwMF9USU1FUjsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJcblRoaXMgY2hvaWNlIGlzIG5vdCBhIHRpbWVyIG5vciBhIGNvdW50ZXJcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoaXMgY2hvaWNlIGlzIG5vdCBhIHRpbWVyIG5vciBhIGNvdW50ZXJcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qICBzd2l0Y2goZGF0YVsyXSkgKi8KIApAQCAtMTM0OCwxMzkgKzEwMzgsMTEwIEBACiAJCQlkYXRhWzRdID0gQVBDSTE1MDBfU0lOR0xFOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoIlxuVGhpcyBvcHRpb24gZm9yIHNpbmdsZS9jb250aW51b3VzIG1vZGUgZG9lcyBub3QgZXhpc3RcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoaXMgb3B0aW9uIGZvciBzaW5nbGUvY29udGludW91cyBtb2RlIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiAgc3dpdGNoKGRhdGFbNF0pICovCiAKIAkJaV9UaW1lckNvdW50ZXJNb2RlID0gZGF0YVsyXSB8IGRhdGFbNF0gfCA3OwotCQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBUZXN0IHRoZSByZWxvYWQgdmFsdWUgKi8KLQkJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQlpZiAoKGRhdGFbM10gPj0gMCkgJiYgKGRhdGFbM10gPD0gNjU1MzUpKSB7CiAJCQlpZiAoZGF0YVs3XSA9PSBBUENJMTUwMF9FTkFCTEUKIAkJCQl8fCBkYXRhWzddID09IEFQQ0kxNTAwX0RJU0FCTEUpIHsKIAotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2VsZWN0cyB0aGUgbW9kZSByZWdpc3RlciBvZiB0aW1lci9jb3VudGVyIDEgKi8KLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjFfTU9ERV9TUEVDSUZJQ0FUSU9OLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogV3JpdGVzIHRoZSBuZXcgbW9kZSAqLwotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKGlfVGltZXJDb3VudGVyTW9kZSwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb25zdGFudCByZWdpc3RlciBvZiB0aW1lci9jb3VudGVyIDEgKi8KLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjFfVElNRV9DU1RfTE9XLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogV3JpdGVzIHRoZSBsb3cgdmFsdWUgICovCi0JCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoZGF0YVszXSwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb25zdGFudCByZWdpc3RlciBvZiB0aW1lci9jb3VudGVyIDEgKi8KLQkJCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjFfVElNRV9DU1RfSElHSCwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBXcml0ZXMgdGhlIGhpZ2ggdmFsdWUgICovCi0JCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlkYXRhWzNdID0gZGF0YVszXSA+PiA4OwogCQkJCW91dGIoZGF0YVszXSwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2VsZWN0cyB0aGUgbWFzdGVyIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KLQkJCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAvKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBSZWFkcyB0aGUgcmVnaXN0ZXIgKi8KLQkJCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJaV9NYXN0ZXJDb25maWd1cmF0aW9uID0KIAkJCQkJaW5iKGRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBFbmFibGVzIHRpbWVyL2NvdW50ZXIgMSBhbmQgdHJpZ2dlcnMgdGltZXIvY291bnRlciAxICovCi0JCQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCWlfTWFzdGVyQ29uZmlndXJhdGlvbiA9CiAJCQkJCWlfTWFzdGVyQ29uZmlndXJhdGlvbiB8IDB4NDA7CiAKLQkJCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwotCQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogV3JpdGVzIHRoZSBuZXcgY29uZmlndXJhdGlvbiAqLwotCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKGlfTWFzdGVyQ29uZmlndXJhdGlvbiwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCQkJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyByZWdpc3RlciBvZiAgICAgKi8KIAkJCQkvKiB0aW1lci9jb3VudGVyIDEgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9DTURfU1RBVFVTLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIERpc2FibGUgdGltZXIvY291bnRlciAxICovCi0JCQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlvdXRiKDB4MCwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZHMgcmVnaXN0ZXIgb2YgICAgICovCiAJCQkJLyogdGltZXIvY291bnRlciAxICAgICAgICAgICAgICAgICAgICAgICovCi0JCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9DTURfU1RBVFVTLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogVHJpZ2dlciB0aW1lci9jb3VudGVyIDEgKi8KLQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoMHgyLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJCX0JLyogaWYoZGF0YVs3XT09IEFQQ0kxNTAwX0VOQUJMRSB8fGRhdGFbN109PSBBUENJMTUwMF9ESVNBQkxFKSAqLwogCQkJZWxzZSB7Ci0JCQkJcHJpbnRrKCJcbkVycm9yIGluIHNlbGVjdGlvbiBvZiBpbnRlcnJ1cHQgZW5hYmxlIG9yIGRpc2FibGVcbiIpOworCQkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCQkiRXJyb3IgaW4gc2VsZWN0aW9uIG9mIGludGVycnVwdCBlbmFibGUgb3IgZGlzYWJsZVxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CS8qIGVsc2VpZihkYXRhWzddPT0gQVBDSTE1MDBfRU5BQkxFIHx8ZGF0YVs3XT09IEFQQ0kxNTAwX0RJU0FCTEUpICovCiAJCX0JCS8qICBpZiAoKGRhdGFbM10+PSAwKSAmJiAoZGF0YVszXSA8PSA2NTUzNSkpICovCiAJCWVsc2UgewotCQkJcHJpbnRrKCJcbkVycm9yIGluIHNlbGVjdGlvbiBvZiByZWxvYWQgdmFsdWVcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIkVycm9yIGluIHNlbGVjdGlvbiBvZiByZWxvYWQgdmFsdWVcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qIGVsc2UgaWYgKChkYXRhWzNdPj0gMCkgJiYgKGRhdGFbM10gPD0gNjU1MzUpKSAqLwogCQlpX1RpbWVyQ291bnRlcldhdGNoZG9nSW50ZXJydXB0ID0gZGF0YVs3XTsKQEAgLTE0OTYsNyArMTE1Nyw4IEBACiAJCQlkYXRhWzJdID0gQVBDSTE1MDBfVElNRVI7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50aygiXG5UaGlzIGNob2ljZSBpcyBub3QgYSB0aW1lciBub3IgYSBjb3VudGVyXG4iKTsKKwkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCSJUaGlzIGNob2ljZSBpcyBub3QgYSB0aW1lciBub3IgYSBjb3VudGVyXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiAgc3dpdGNoKGRhdGFbMl0pICovCiAKQEAgLTE1MDksNyArMTE3MSw4IEBACiAJCQlkYXRhWzRdID0gQVBDSTE1MDBfU0lOR0xFOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoIlxuVGhpcyBvcHRpb24gZm9yIHNpbmdsZS9jb250aW51b3VzIG1vZGUgZG9lcyBub3QgZXhpc3RcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoaXMgb3B0aW9uIGZvciBzaW5nbGUvY29udGludW91cyBtb2RlIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiAgc3dpdGNoKGRhdGFbNF0pICovCiAKQEAgLTE1MjIsNyArMTE4NSw4IEBACiAJCQlkYXRhWzVdID0gQVBDSTE1MDBfSEFSRFdBUkVfVFJJR0dFUjsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJcblRoaXMgY2hvaWNlIGZvciBzb2Z0d2FyZSBvciBoYXJkd2FyZSB0cmlnZ2VyIGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCSJUaGlzIGNob2ljZSBmb3Igc29mdHdhcmUgb3IgaGFyZHdhcmUgdHJpZ2dlciBkb2VzIG5vdCBleGlzdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogIHN3aXRjaChkYXRhWzVdKSAqLwogCkBAIC0xNTM1LDE0MCArMTE5OSwxMTEgQEAKIAkJCWRhdGFbNl0gPSBBUENJMTUwMF9IQVJEV0FSRV9HQVRFOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoIlxuVGhpcyBjaG9pY2UgZm9yIHNvZnR3YXJlIG9yIGhhcmR3YXJlIGdhdGUgZG9lcyBub3QgZXhpc3RcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoaXMgY2hvaWNlIGZvciBzb2Z0d2FyZSBvciBoYXJkd2FyZSBnYXRlIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiAgc3dpdGNoKGRhdGFbNl0pICovCiAKIAkJaV9UaW1lckNvdW50ZXJNb2RlID0gZGF0YVsyXSB8IGRhdGFbNF0gfCBkYXRhWzVdIHwgZGF0YVs2XSB8IDc7CiAKLQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFRlc3QgdGhlIHJlbG9hZCB2YWx1ZSAqLwotCQkJICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQlpZiAoKGRhdGFbM10gPj0gMCkgJiYgKGRhdGFbM10gPD0gNjU1MzUpKSB7CiAJCQlpZiAoZGF0YVs3XSA9PSBBUENJMTUwMF9FTkFCTEUKIAkJCQl8fCBkYXRhWzddID09IEFQQ0kxNTAwX0RJU0FCTEUpIHsKIAotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2VsZWN0cyB0aGUgbW9kZSByZWdpc3RlciBvZiB0aW1lci9jb3VudGVyIDIgKi8KLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjJfTU9ERV9TUEVDSUZJQ0FUSU9OLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogV3JpdGVzIHRoZSBuZXcgbW9kZSAqLwotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKGlfVGltZXJDb3VudGVyTW9kZSwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb25zdGFudCByZWdpc3RlciBvZiB0aW1lci9jb3VudGVyIDIgKi8KLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjJfVElNRV9DU1RfTE9XLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogV3JpdGVzIHRoZSBsb3cgdmFsdWUgICovCi0JCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoZGF0YVszXSwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb25zdGFudCByZWdpc3RlciBvZiB0aW1lci9jb3VudGVyIDIgKi8KLQkJCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjJfVElNRV9DU1RfSElHSCwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBXcml0ZXMgdGhlIGhpZ2ggdmFsdWUgICovCi0JCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlkYXRhWzNdID0gZGF0YVszXSA+PiA4OwogCQkJCW91dGIoZGF0YVszXSwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2VsZWN0cyB0aGUgbWFzdGVyIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KLQkJCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAvKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBSZWFkcyB0aGUgcmVnaXN0ZXIgKi8KLQkJCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJaV9NYXN0ZXJDb25maWd1cmF0aW9uID0KIAkJCQkJaW5iKGRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBFbmFibGVzIHRpbWVyL2NvdW50ZXIgMiBhbmQgdHJpZ2dlcnMgdGltZXIvY291bnRlciAyICovCi0JCQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCWlfTWFzdGVyQ29uZmlndXJhdGlvbiA9CiAJCQkJCWlfTWFzdGVyQ29uZmlndXJhdGlvbiB8IDB4MjA7CiAKLQkJCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwotCQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogV3JpdGVzIHRoZSBuZXcgY29uZmlndXJhdGlvbiAqLwotCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKGlfTWFzdGVyQ29uZmlndXJhdGlvbiwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCQkJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyByZWdpc3RlciBvZiAgICAgKi8KIAkJCQkvKiB0aW1lci9jb3VudGVyIDIgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9DTURfU1RBVFVTLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIERpc2FibGUgdGltZXIvY291bnRlciAyICovCi0JCQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlvdXRiKDB4MCwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZHMgcmVnaXN0ZXIgb2YgICAgICovCiAJCQkJLyogdGltZXIvY291bnRlciAyICAgICAgICAgICAgICAgICAgICAgICovCi0JCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9DTURfU1RBVFVTLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogVHJpZ2dlciB0aW1lci9jb3VudGVyIDEgKi8KLQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoMHgyLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJCX0JLyogaWYoZGF0YVs3XT09IEFQQ0kxNTAwX0VOQUJMRSB8fGRhdGFbN109PSBBUENJMTUwMF9ESVNBQkxFKSAqLwogCQkJZWxzZSB7Ci0JCQkJcHJpbnRrKCJcbkVycm9yIGluIHNlbGVjdGlvbiBvZiBpbnRlcnJ1cHQgZW5hYmxlIG9yIGRpc2FibGVcbiIpOworCQkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCQkiRXJyb3IgaW4gc2VsZWN0aW9uIG9mIGludGVycnVwdCBlbmFibGUgb3IgZGlzYWJsZVxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CS8qIGVsc2VpZihkYXRhWzddPT0gQVBDSTE1MDBfRU5BQkxFIHx8ZGF0YVs3XT09IEFQQ0kxNTAwX0RJU0FCTEUpICovCiAJCX0JCS8qICBpZiAoKGRhdGFbM10+PSAwKSAmJiAoZGF0YVszXSA8PSA2NTUzNSkpICovCiAJCWVsc2UgewotCQkJcHJpbnRrKCJcbkVycm9yIGluIHNlbGVjdGlvbiBvZiByZWxvYWQgdmFsdWVcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIkVycm9yIGluIHNlbGVjdGlvbiBvZiByZWxvYWQgdmFsdWVcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qIGVsc2UgaWYgKChkYXRhWzNdPj0gMCkgJiYgKGRhdGFbM10gPD0gNjU1MzUpKSAqLwogCQlpX1RpbWVyQ291bnRlcldhdGNoZG9nSW50ZXJydXB0ID0gZGF0YVs3XTsKQEAgLTE2ODQsNyArMTMxOSw4IEBACiAJCQlkYXRhWzJdID0gQVBDSTE1MDBfV0FUQ0hET0c7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50aygiXG5UaGlzIGNob2ljZSBpcyBub3QgYSB3YXRjaGRvZyBub3IgYSBjb3VudGVyXG4iKTsKKwkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCSJUaGlzIGNob2ljZSBpcyBub3QgYSB3YXRjaGRvZyBub3IgYSBjb3VudGVyXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiAgc3dpdGNoKGRhdGFbMl0pICovCiAKQEAgLTE2OTcsNyArMTMzMyw4IEBACiAJCQlkYXRhWzRdID0gQVBDSTE1MDBfU0lOR0xFOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoIlxuVGhpcyBvcHRpb24gZm9yIHNpbmdsZS9jb250aW51b3VzIG1vZGUgZG9lcyBub3QgZXhpc3RcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoaXMgb3B0aW9uIGZvciBzaW5nbGUvY29udGludW91cyBtb2RlIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiAgc3dpdGNoKGRhdGFbNF0pICovCiAKQEAgLTE3MTAsMTQ2ICsxMzQ3LDEwOSBAQAogCQkJZGF0YVs2XSA9IEFQQ0kxNTAwX0hBUkRXQVJFX0dBVEU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50aygiXG5UaGlzIGNob2ljZSBmb3Igc29mdHdhcmUgb3IgaGFyZHdhcmUgZ2F0ZSBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhpcyBjaG9pY2UgZm9yIHNvZnR3YXJlIG9yIGhhcmR3YXJlIGdhdGUgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qICBzd2l0Y2goZGF0YVs2XSkgKi8KIAotCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFRlc3QgaWYgdXNlZCBmb3Igd2F0Y2hkb2cgKi8KLQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCWlmIChkYXRhWzJdID09IEFQQ0kxNTAwX1dBVENIRE9HKSB7Ci0JCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIC0gRW5hYmxlcyB0aGUgb3V0cHV0IGxpbmUgKi8KIAkJCS8qIC0gRW5hYmxlcyByZXRyaWdnZXIgICAgICAgKi8KIAkJCS8qIC0gUHVsc2VzIG91dHB1dCAgICAgICAgICAgKi8KLQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJaV9UaW1lckNvdW50ZXJNb2RlID0gZGF0YVsyXSB8IGRhdGFbNF0gfCAweDU0OwogCQl9CQkvKiBpZiAoZGF0YVsyXSA9PSBBUENJMTUwMF9XQVRDSERPRykgKi8KIAkJZWxzZSB7CiAJCQlpX1RpbWVyQ291bnRlck1vZGUgPSBkYXRhWzJdIHwgZGF0YVs0XSB8IGRhdGFbNl0gfCA3OwogCQl9CQkvKiBlbHNlaWYgKGRhdGFbMl0gPT0gQVBDSTE1MDBfV0FUQ0hET0cpICovCi0JCQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBUZXN0IHRoZSByZWxvYWQgdmFsdWUgKi8KLQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJaWYgKChkYXRhWzNdID49IDApICYmIChkYXRhWzNdIDw9IDY1NTM1KSkgewogCQkJaWYgKGRhdGFbN10gPT0gQVBDSTE1MDBfRU5BQkxFCiAJCQkJfHwgZGF0YVs3XSA9PSBBUENJMTUwMF9ESVNBQkxFKSB7CiAKLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIG1vZGUgcmVnaXN0ZXIgb2Ygd2F0Y2hkb2cvY291bnRlciAzICovCi0JCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX01PREVfU1BFQ0lGSUNBVElPTiwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCQkJLyoqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFdyaXRlcyB0aGUgbmV3IG1vZGUgKi8KLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YihpX1RpbWVyQ291bnRlck1vZGUsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2VsZWN0cyB0aGUgY29uc3RhbnQgcmVnaXN0ZXIgb2Ygd2F0Y2hkb2cvY291bnRlciAzICovCi0JCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX1RJTUVfQ1NUX0xPVywKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFdyaXRlcyB0aGUgbG93IHZhbHVlICAqLwotCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlvdXRiKGRhdGFbM10sCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2VsZWN0cyB0aGUgY29uc3RhbnQgcmVnaXN0ZXIgb2Ygd2F0Y2hkb2cvY291bnRlciAzICovCi0JCQkJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX1RJTUVfQ1NUX0hJR0gsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogV3JpdGVzIHRoZSBoaWdoIHZhbHVlICAqLwotCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJZGF0YVszXSA9IGRhdGFbM10gPj4gODsKIAkJCQlvdXRiKGRhdGFbM10sCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIG1hc3RlciBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JCQkJICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJb3V0YihBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogUmVhZHMgdGhlIHJlZ2lzdGVyICovCi0JCQkJICAgICAvKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCWlfTWFzdGVyQ29uZmlndXJhdGlvbiA9CiAJCQkJCWluYihkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogRW5hYmxlcyB3YXRjaGRvZy9jb3VudGVyIDMgYW5kIHRyaWdnZXJzIHdhdGNoZG9nL2NvdW50ZXIgMyAqLwotCQkJCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlpX01hc3RlckNvbmZpZ3VyYXRpb24gPQogCQkJCQlpX01hc3RlckNvbmZpZ3VyYXRpb24gfCAweDEwOwogCi0JCQkJICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2VsZWN0cyB0aGUgbWFzdGVyIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KLQkJCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFdyaXRlcyB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gKi8KLQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YihpX01hc3RlckNvbmZpZ3VyYXRpb24sCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFRlc3QgaWYgQ09VTlRFUiAqLwotCQkJCQkgIC8qKioqKioqKioqKioqKioqKioqKi8KIAkJCQlpZiAoZGF0YVsyXSA9PSBBUENJMTUwMF9DT1VOVEVSKSB7CiAKLQkJCQkJICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIHJlZ2lzdGVyIG9mICAgKi8KIAkJCQkJLyogd2F0Y2hkb2cvY291bnRlciAzICAgICAgICAgICAgICAgICovCi0JCQkJCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfQ01EX1NUQVRVUywKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIERpc2FibGUgdGhlICB3YXRjaGRvZy9jb3VudGVyIDMgYW5kIHN0YXJ0cyBpdCAqLwotCQkJCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YigweDAsCiAJCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgcmVnaXN0ZXIgb2YgICAqLwogCQkJCQkvKiB3YXRjaGRvZy9jb3VudGVyIDMgICAgICAgICAgICAgICAgKi8KLQkJCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SM19DTURfU1RBVFVTLAogCQkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkJCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBUcmlnZ2VyIHRoZSAgd2F0Y2hkb2cvY291bnRlciAzIGFuZCBzdGFydHMgaXQgKi8KLQkJCQkJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YigweDIsCiAJCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0xODU4LDEyICsxNDU4LDE0IEBACiAKIAkJCX0JLyogaWYoZGF0YVs3XT09IEFQQ0kxNTAwX0VOQUJMRSB8fGRhdGFbN109PSBBUENJMTUwMF9ESVNBQkxFKSAqLwogCQkJZWxzZSB7Ci0JCQkJcHJpbnRrKCJcbkVycm9yIGluIHNlbGVjdGlvbiBvZiBpbnRlcnJ1cHQgZW5hYmxlIG9yIGRpc2FibGVcbiIpOworCQkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCQkiRXJyb3IgaW4gc2VsZWN0aW9uIG9mIGludGVycnVwdCBlbmFibGUgb3IgZGlzYWJsZVxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CS8qIGVsc2VpZihkYXRhWzddPT0gQVBDSTE1MDBfRU5BQkxFIHx8ZGF0YVs3XT09IEFQQ0kxNTAwX0RJU0FCTEUpICovCiAJCX0JCS8qICBpZiAoKGRhdGFbM10+PSAwKSAmJiAoZGF0YVszXSA8PSA2NTUzNSkpICovCiAJCWVsc2UgewotCQkJcHJpbnRrKCJcbkVycm9yIGluIHNlbGVjdGlvbiBvZiByZWxvYWQgdmFsdWVcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIkVycm9yIGluIHNlbGVjdGlvbiBvZiByZWxvYWQgdmFsdWVcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qIGVsc2UgaWYgKChkYXRhWzNdPj0gMCkgJiYgKGRhdGFbM10gPD0gNjU1MzUpKSAqLwogCQlpX1RpbWVyQ291bnRlcldhdGNoZG9nSW50ZXJydXB0ID0gZGF0YVs3XTsKQEAgLTE4NzEsNDQgKzE0NzMsMjUgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlwcmludGsoIlxuVGhlIHNwZWNpZmllZCBjb3VudGVyXHRpbWVyIG9wdGlvbiBkb2VzIG5vdCBleGlzdFxuIik7CisJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJIlRoZSBzcGVjaWZpZWQgY291bnRlci90aW1lciBvcHRpb24gZG9lcyBub3QgZXhpc3RcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CQkJLyogc3dpdGNoKGRhdGFbMV0pICovCiAJaV9Db3VudGVyTG9naWMgPSBkYXRhWzJdOwogCXJldHVybiBpbnNuLT5uOwogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTE1MDBfU3RhcnRTdG9wVHJpZ2dlclRpbWVyQ291bnRlcldhdGNoZG9nICAgICAgfAotfAkJCQkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLXwgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSk7ICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogU3RhcnQgLyBTdG9wIG9yIHRyaWdnZXIgdGhlIHRpbWVyIGNvdW50ZXIgb3IgV2F0Y2hkb2cgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgICAgIDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAgIDpwb2ludGVyIHRvIHN1YmRldmljZSBzdHJ1Y3R1cmUKLXwgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuICAgICAgOnBvaW50ZXIgdG8gaW5zbiBzdHJ1Y3R1cmUgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgOiBEYXRhIFBvaW50ZXIgdG8gcmVhZCBzdGF0dXMgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gICAgICAgICAgICAgICAgOiAwICAgICBDb3VudGVyMS9UaW1lcjEKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgIENvdW50ZXIyL1RpbWVyMgotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgQ291bnRlcjMvV2F0Y2hkb2cKLXwgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSAgICAgICAgICAgICAgICA6IDAgICAgIHN0YXJ0Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICBzdG9wCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICBUcmlnZ2VyCi18ICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMl0gICAgICAgICAgICAgICAgOiAwICAgICBDb3VudGVyCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICBUaW1lci9XYXRjaGRvZwotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMTUwMF9TdGFydFN0b3BUcmlnZ2VyVGltZXJDb3VudGVyV2F0Y2hkb2coc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJCQkgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCQkJICAgdW5zaWduZWQgaW50ICpkYXRhKQorICogU3RhcnQgLyBTdG9wIG9yIHRyaWdnZXIgdGhlIHRpbWVyIGNvdW50ZXIgb3IgV2F0Y2hkb2cKKyAqCisgKiBkYXRhWzBdIDAgPSBDb3VudGVyMS9UaW1lcjEsIDEgPSAgQ291bnRlcjIvVGltZXIyLCAyID0gQ291bnRlcjMvV2F0Y2hkb2cKKyAqIGRhdGFbMV0gMCA9IFN0YXJ0LCAxID0gU3RvcCwgMiA9IFRyaWdnZXIKKyAqIGRhdGFbMl0gMCA9IENvdW50ZXIsIDEgPSBUaW1lci9XYXRjaGRvZworICovCitzdGF0aWMgaW50IGFwY2kxNTAwX3RpbWVyX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCXVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZTsKQEAgLTE5MjQsMTMgKzE1MDcsOSBAQAogCQkJCWVsc2UgewogCQkJCQlpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZSA9IDB4RTQ7CS8qIGRpc2FibGUgdGhlIGludGVycnVwdCAqLwogCQkJCX0JLyogZWxzZWlmKGlfVGltZXJDb3VudGVyV2F0Y2hkb2dJbnRlcnJ1cHQ9PTEpICovCi0JCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTdGFydHMgdGltZXIvY291bnRlciAxICovCi0JCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlpX1RpbWVyQ291bnRlcjFFbmFibGVkID0gMTsKLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCi0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9DTURfU1RBVFVTLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTE5MzksMjAgKzE1MTgsMTcgQEAKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCQl9CS8qIGlmKCBpX1RpbWVyQ291bnRlcjFJbml0PT0xKSAqLwogCQkJZWxzZSB7Ci0JCQkJcHJpbnRrKCJcbkNvdW50ZXIvVGltZXIxIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkJIkNvdW50ZXIvVGltZXIxIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCWJyZWFrOwogCiAJCWNhc2UgU1RPUDoKIAotCQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTdG9wIHRpbWVyL2NvdW50ZXIgMSAqLwotCQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjFfQ01EX1NUQVRVUywKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMTk2NSwyMyArMTU0MSwxNyBAQAogCQljYXNlIFRSSUdHRVI6CiAJCQlpZiAoaV9UaW1lckNvdW50ZXIxSW5pdCA9PSAxKSB7CiAJCQkJaWYgKGlfVGltZXJDb3VudGVyMUVuYWJsZWQgPT0gMSkgewotCQkJCQkJIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNldCBUcmlnZ2VyIGFuZCBnYXRlICovCi0JCQkJCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCQlpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZSA9IDB4NjsKIAkJCQl9CS8qIGlmKCBpX1RpbWVyQ291bnRlcjFFbmFibGVkPT0xKSAqLwogCQkJCWVsc2UgewotCQkJCQkJICAgLyoqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2V0IFRyaWdnZXIgKi8KLQkJCQkJCSAgIC8qKioqKioqKioqKioqKiovCiAKIAkJCQkJaV9Db21tYW5kQW5kU3RhdHVzVmFsdWUgPSAweDI7CiAJCQkJfQkvKiBlbHNlaWYoaV9UaW1lckNvdW50ZXIxRW5hYmxlZD09MSkgKi8KIAotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIxX0NNRF9TVEFUVVMsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMTk5MCwxMyArMTU2MCwxNSBAQAogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJCX0JLyogaWYoIGlfVGltZXJDb3VudGVyMUluaXQ9PTEpICovCiAJCQllbHNlIHsKLQkJCQlwcmludGsoIlxuQ291bnRlci9UaW1lcjEgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCQkiQ291bnRlci9UaW1lcjEgbm90IGNvbmZpZ3VyZWRcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCXByaW50aygiXG5UaGUgc3BlY2lmaWVkIG9wdGlvbiBmb3Igc3RhcnQvc3RvcC90cmlnZ2VyIGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCSJUaGUgc3BlY2lmaWVkIG9wdGlvbiBmb3Igc3RhcnQvc3RvcC90cmlnZ2VyIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiBzd2l0Y2goZGF0YVsxXSkgKi8KIAkJYnJlYWs7CkBAIC0yMDExLDEzICsxNTgzLDkgQEAKIAkJCQllbHNlIHsKIAkJCQkJaV9Db21tYW5kQW5kU3RhdHVzVmFsdWUgPSAweEU0OwkvKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgKi8KIAkJCQl9CS8qIGVsc2VpZihpX1RpbWVyQ291bnRlcldhdGNoZG9nSW50ZXJydXB0PT0xKSAqLwotCQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU3RhcnRzIHRpbWVyL2NvdW50ZXIgMiAqLwotCQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJaV9UaW1lckNvdW50ZXIyRW5hYmxlZCA9IDE7Ci0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZHMgYW5kIHN0YXR1cyByZWdpc3RlciAqLwotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjJfQ01EX1NUQVRVUywKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0yMDI2LDIwICsxNTk0LDE3IEBACiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQkJfQkvKiBpZiggaV9UaW1lckNvdW50ZXIySW5pdD09MSkgKi8KIAkJCWVsc2UgewotCQkJCXByaW50aygiXG5Db3VudGVyL1RpbWVyMiBub3QgY29uZmlndXJlZFxuIik7CisJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCSJDb3VudGVyL1RpbWVyMiBub3QgY29uZmlndXJlZFxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlicmVhazsKIAogCQljYXNlIFNUT1A6CiAKLQkJCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU3RvcCB0aW1lci9jb3VudGVyIDIgKi8KLQkJCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCi0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIyX0NNRF9TVEFUVVMsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTIwNTEsMjMgKzE2MTYsMTcgQEAKIAkJY2FzZSBUUklHR0VSOgogCQkJaWYgKGlfVGltZXJDb3VudGVyMkluaXQgPT0gMSkgewogCQkJCWlmIChpX1RpbWVyQ291bnRlcjJFbmFibGVkID09IDEpIHsKLQkJCQkJCSAvKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBTZXQgVHJpZ2dlciBhbmQgZ2F0ZSAqLwotCQkJCQkJIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQkJaV9Db21tYW5kQW5kU3RhdHVzVmFsdWUgPSAweDY7CiAJCQkJfQkvKiBpZiggaV9UaW1lckNvdW50ZXIyRW5hYmxlZD09MSkgKi8KIAkJCQllbHNlIHsKLQkJCQkJCSAgIC8qKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNldCBUcmlnZ2VyICovCi0JCQkJCQkgICAvKioqKioqKioqKioqKioqLwogCiAJCQkJCWlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlID0gMHgyOwogCQkJCX0JLyogZWxzZWlmKGlfVGltZXJDb3VudGVyMkVuYWJsZWQ9PTEpICovCiAKLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCi0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9DTURfU1RBVFVTLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTIwNzYsMTIgKzE2MzUsMTQgQEAKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCQl9CS8qIGlmKCBpX1RpbWVyQ291bnRlcjJJbml0PT0xKSAqLwogCQkJZWxzZSB7Ci0JCQkJcHJpbnRrKCJcbkNvdW50ZXIvVGltZXIyIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkJIkNvdW50ZXIvVGltZXIyIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJcblRoZSBzcGVjaWZpZWQgb3B0aW9uIGZvciBzdGFydC9zdG9wL3RyaWdnZXIgZG9lcyBub3QgZXhpc3RcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoZSBzcGVjaWZpZWQgb3B0aW9uIGZvciBzdGFydC9zdG9wL3RyaWdnZXIgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qIHN3aXRjaChkYXRhWzFdKSAqLwogCQlicmVhazsKQEAgLTIwOTYsMTMgKzE2NTcsOSBAQAogCQkJCWVsc2UgewogCQkJCQlpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZSA9IDB4RTQ7CS8qIGRpc2FibGUgdGhlIGludGVycnVwdCAqLwogCQkJCX0JLyogZWxzZWlmKGlfVGltZXJDb3VudGVyV2F0Y2hkb2dJbnRlcnJ1cHQ9PTEpICovCi0JCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTdGFydHMgV2F0Y2hkb2cvY291bnRlciAzICovCi0JCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlpX1dhdGNoZG9nQ291bnRlcjNFbmFibGVkID0gMTsKLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCi0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SM19DTURfU1RBVFVTLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTIxMTIsMjAgKzE2NjksMTcgQEAKIAogCQkJfQkvKiAgaWYoIGlfV2F0Y2hkb2dDb3VudGVyM2luaXQ9PTEpICovCiAJCQllbHNlIHsKLQkJCQlwcmludGsoIlxuV2F0Y2hkb2cvQ291bnRlcjMgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCQkiV2F0Y2hkb2cvQ291bnRlcjMgbm90IGNvbmZpZ3VyZWRcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJYnJlYWs7CiAKIAkJY2FzZSBTVE9QOgogCi0JCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFN0b3AgV2F0Y2hkb2cvY291bnRlciAzICovCi0JCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZHMgYW5kIHN0YXR1cyByZWdpc3RlciAqLwotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SM19DTURfU1RBVFVTLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0yMTQwLDIzICsxNjk0LDE3IEBACiAJCQljYXNlIDA6CS8qIHRyaWdnZXJpbmcgY291bnRlciAzICovCiAJCQkJaWYgKGlfV2F0Y2hkb2dDb3VudGVyM0luaXQgPT0gMSkgewogCQkJCQlpZiAoaV9XYXRjaGRvZ0NvdW50ZXIzRW5hYmxlZCA9PSAxKSB7Ci0JCQkJCQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCQkvKiBTZXQgVHJpZ2dlciBhbmQgZ2F0ZSAqLwotCQkJCQkJCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJCQlpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZSA9IDB4NjsKIAkJCQkJfQkvKiBpZiggaV9XYXRjaGRvZ0NvdW50ZXIzRW5hYmxlZD09MSkgKi8KIAkJCQkJZWxzZSB7Ci0JCQkJCQkJICAgLyoqKioqKioqKioqKioqKi8KIAkJCQkJCS8qIFNldCBUcmlnZ2VyICovCi0JCQkJCQkJICAgLyoqKioqKioqKioqKioqKi8KIAogCQkJCQkJaV9Db21tYW5kQW5kU3RhdHVzVmFsdWUgPSAweDI7CiAJCQkJCX0JLyogZWxzZWlmKGlfV2F0Y2hkb2dDb3VudGVyM0VuYWJsZWQ9PTEpICovCiAKLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZHMgYW5kIHN0YXR1cyByZWdpc3RlciAqLwotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX0NNRF9TVEFUVVMsCiAJCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0yMTY1LDcgKzE3MTMsOCBAQAogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCQkJfQkvKiBpZiggaV9XYXRjaGRvZ0NvdW50ZXIzSW5pdD09MSkgKi8KIAkJCQllbHNlIHsKLQkJCQkJcHJpbnRrKCJcbkNvdW50ZXIzIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCQkiQ291bnRlcjMgbm90IGNvbmZpZ3VyZWRcbiIpOwogCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCQl9CiAJCQkJYnJlYWs7CkBAIC0yMTczLDkgKzE3MjIsNyBAQAogCQkJCS8qIHRyaWdnZXJpbmcgV2F0Y2hkb2cgMyAqLwogCQkJCWlmIChpX1dhdGNoZG9nQ291bnRlcjNJbml0ID09IDEpIHsKIAotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCi0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfQ01EX1NUQVRVUywKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTIxODQsNTUgKzE3MzEsNDAgQEAKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQkJCX0JLyogaWYoIGlfV2F0Y2hkb2dDb3VudGVyM0luaXQ9PTEpICovCiAJCQkJZWxzZSB7Ci0JCQkJCXByaW50aygiXG5XYXRjaGRvZyAzIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCQkiV2F0Y2hkb2cgMyBub3QgY29uZmlndXJlZFxuIik7CiAJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRrKCJcbldyb25nIGNob2ljZSBvZiB3YXRjaGRvZy9jb3VudGVyM1xuIik7CisJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCSJXcm9uZyBjaG9pY2Ugb2Ygd2F0Y2hkb2cvY291bnRlcjNcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQkvKiBzd2l0Y2goZGF0YVsyXSkgKi8KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJcblRoZSBzcGVjaWZpZWQgb3B0aW9uIGZvciBzdGFydC9zdG9wL3RyaWdnZXIgZG9lcyBub3QgZXhpc3RcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoZSBzcGVjaWZpZWQgb3B0aW9uIGZvciBzdGFydC9zdG9wL3RyaWdnZXIgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qIHN3aXRjaChkYXRhWzFdKSAqLwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoIlxuVGhlIHNwZWNpZmllZCBjaG9pY2UgZm9yIGNvdW50ZXIvd2F0Y2hkb2cvdGltZXIgZG9lcyBub3QgZXhpc3RcbiIpOworCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCSJUaGUgc3BlY2lmaWVkIGNob2ljZSBmb3IgY291bnRlci93YXRjaGRvZy90aW1lciBkb2VzIG5vdCBleGlzdFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0JCQkvKiBzd2l0Y2goZGF0YVswXSkgKi8KIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCBpX0FQQ0kxNTAwX1JlYWRDb3VudGVyVGltZXJXYXRjaGRvZyAgICAgICAgICAgICAgICB8Ci18CQkJKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotfCAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKTsgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBSZWFkIFRoZSBXYXRjaGRvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogICBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ICAgICAgOiBEcml2ZXIgaGFuZGxlICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgOnBvaW50ZXIgdG8gc3ViZGV2aWNlIHN0cnVjdHVyZQotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24gICAgICA6cG9pbnRlciB0byBpbnNuIHN0cnVjdHVyZSAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICAgOiBEYXRhIFBvaW50ZXIgdG8gcmVhZCBzdGF0dXMgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgZGF0YVswXSAgICAgICAgICAgICAgICA6IDAgICAgIENvdW50ZXIxL1RpbWVyMQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgQ291bnRlcjIvVGltZXIyCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICBDb3VudGVyMy9XYXRjaGRvZwotfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMTUwMF9SZWFkQ291bnRlclRpbWVyV2F0Y2hkb2coc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQorICogUmVhZCBUaGUgV2F0Y2hkb2cKKyAqCisgKiBkYXRhWzBdIDAgPSBDb3VudGVyMS9UaW1lcjEsIDEgPSAgQ291bnRlcjIvVGltZXIyLCAyID0gQ291bnRlcjMvV2F0Y2hkb2cKKyAqLworc3RhdGljIGludCBhcGNpMTUwMF90aW1lcl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZTsKQEAgLTIyNDIsMjMgKzE3NzQsMTcgQEAKIAkJLyogUmVhZCBjb3VudGVyL3RpbWVyMSAqLwogCQlpZiAoaV9UaW1lckNvdW50ZXIxSW5pdCA9PSAxKSB7CiAJCQlpZiAoaV9UaW1lckNvdW50ZXIxRW5hYmxlZCA9PSAxKSB7Ci0JCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZXQgUkNDIGFuZCBnYXRlICovCi0JCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCWlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlID0gMHhDOwogCQkJfQkvKiBpZiggaV9UaW1lckNvdW50ZXIxSW5pdD09MSkgKi8KIAkJCWVsc2UgewotCQkgICAgLyoqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZXQgUkNDICovCi0JCSAgICAvKioqKioqKioqKioqKioqLwogCiAJCQkJaV9Db21tYW5kQW5kU3RhdHVzVmFsdWUgPSAweDg7CiAJCQl9CS8qIGVsc2VpZihpX1RpbWVyQ291bnRlcjFJbml0PT0xKSAqLwogCi0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9DTURfU1RBVFVTLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0yMjY2LDkgKzE3OTIsNyBAQAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBjb3VudGVyIHJlZ2lzdGVyIChoaWdoKSAqLwotCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUl9DUFRfVE1SMV9WQUxVRV9ISUdILAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0yMjg1LDcgKzE4MDksOCBAQAogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQl9CQkvKiBpZiggaV9UaW1lckNvdW50ZXIxSW5pdD09MSkgKi8KIAkJZWxzZSB7Ci0JCQlwcmludGsoIlxuVGltZXIvQ291bnRlcjEgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRpbWVyL0NvdW50ZXIxIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiBlbHNlaWYoIGlfVGltZXJDb3VudGVyMUluaXQ9PTEpICovCiAJCWJyZWFrOwpAQCAtMjI5MywyMyArMTgxOCwxNyBAQAogCQkvKiBSZWFkIGNvdW50ZXIvdGltZXIyICovCiAJCWlmIChpX1RpbWVyQ291bnRlcjJJbml0ID09IDEpIHsKIAkJCWlmIChpX1RpbWVyQ291bnRlcjJFbmFibGVkID09IDEpIHsKLQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNldCBSQ0MgYW5kIGdhdGUgKi8KLQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJaV9Db21tYW5kQW5kU3RhdHVzVmFsdWUgPSAweEM7CiAJCQl9CS8qIGlmKCBpX1RpbWVyQ291bnRlcjJJbml0PT0xKSAqLwogCQkJZWxzZSB7Ci0JCSAgICAvKioqKioqKioqKioqKioqLwogCQkJCS8qIFNldCBSQ0MgKi8KLQkJICAgIC8qKioqKioqKioqKioqKiovCiAKIAkJCQlpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZSA9IDB4ODsKIAkJCX0JLyogZWxzZWlmKGlfVGltZXJDb3VudGVyMkluaXQ9PTEpICovCiAKLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZHMgYW5kIHN0YXR1cyByZWdpc3RlciAqLwotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIyX0NNRF9TVEFUVVMsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTIzMTcsOSArMTgzNiw3IEBACiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIGNvdW50ZXIgcmVnaXN0ZXIgKGhpZ2gpICovCi0JCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SX0NQVF9UTVIyX1ZBTFVFX0hJR0gsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTIzMzYsNyArMTg1Myw4IEBACiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCX0JCS8qIGlmKCBpX1RpbWVyQ291bnRlcjJJbml0PT0xKSAqLwogCQllbHNlIHsKLQkJCXByaW50aygiXG5UaW1lci9Db3VudGVyMiBub3QgY29uZmlndXJlZFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGltZXIvQ291bnRlcjIgbm90IGNvbmZpZ3VyZWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qIGVsc2VpZiggaV9UaW1lckNvdW50ZXIySW5pdD09MSkgKi8KIAkJYnJlYWs7CkBAIC0yMzQ0LDIzICsxODYyLDE3IEBACiAJCS8qIFJlYWQgY291bnRlci93YXRjaGRvZzIgKi8KIAkJaWYgKGlfV2F0Y2hkb2dDb3VudGVyM0luaXQgPT0gMSkgewogCQkJaWYgKGlfV2F0Y2hkb2dDb3VudGVyM0VuYWJsZWQgPT0gMSkgewotCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2V0IFJDQyBhbmQgZ2F0ZSAqLwotCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZSA9IDB4QzsKIAkJCX0JLyogaWYoIGlfVGltZXJDb3VudGVyMkluaXQ9PTEpICovCiAJCQllbHNlIHsKLQkJICAgIC8qKioqKioqKioqKioqKiovCiAJCQkJLyogU2V0IFJDQyAqLwotCQkgICAgLyoqKioqKioqKioqKioqKi8KIAogCQkJCWlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlID0gMHg4OwogCQkJfQkvKiBlbHNlaWYoaV9XYXRjaGRvZ0NvdW50ZXIzSW5pdD09MSkgKi8KIAotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCi0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfQ01EX1NUQVRVUywKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMjM2OCw5ICsxODgwLDcgQEAKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgY291bnRlciByZWdpc3RlciAoaGlnaCkgKi8KLQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JfQ1BUX1RNUjNfVkFMVUVfSElHSCwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMjM4NywxMiArMTg5NywxNCBAQAogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQl9CQkvKiBpZiggaV9XYXRjaGRvZ0NvdW50ZXIzSW5pdD09MSkgKi8KIAkJZWxzZSB7Ci0JCQlwcmludGsoIlxuV2F0Y2hkb2dDb3VudGVyMyBub3QgY29uZmlndXJlZFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiV2F0Y2hkb2dDb3VudGVyMyBub3QgY29uZmlndXJlZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogZWxzZWlmKCBpX1dhdGNoZG9nQ291bnRlcjNJbml0PT0xKSAqLwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoIlxuVGhlIGNob2ljZSBvZiB0aW1lci9jb3VudGVyL3dhdGNoZG9nIGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkiVGhlIGNob2ljZSBvZiB0aW1lci9jb3VudGVyL3dhdGNoZG9nIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQkJCS8qIHN3aXRjaChkYXRhWzBdKSAqLwogCkBAIC0yNDAwLDMxICsxOTEyLDE1IEBACiB9CiAKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgIGlfQVBDSTE1MDBfUmVhZEludGVycnVwdE1hc2sgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLXwgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSk7IAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogUmVhZCB0aGUgaW50ZXJydXB0IG1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6ICAgc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiAgICAgIDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAgIDpwb2ludGVyIHRvIHN1YmRldmljZSBzdHJ1Y3R1cmUKLXwgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuICAgICAgOnBvaW50ZXIgdG8gaW5zbiBzdHJ1Y3R1cmUgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgIDogRGF0YSBQb2ludGVyIHRvIHJlYWQgc3RhdHVzICB8Ci0KLQotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JZGF0YVswXTpUaGUgaW50ZXJydXB0IG1hc2sgdmFsdWUJCQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdOkNoYW5uZWwgbm8KLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMTUwMF9SZWFkSW50ZXJydXB0TWFzayhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBSZWFkIHRoZSBpbnRlcnJ1cHQgbWFzaworICoKKyAqIGRhdGFbMF0gVGhlIGludGVycnVwdCBtYXNrIHZhbHVlCisgKiBkYXRhWzFdIENoYW5uZWwgTnVtYmVyCisgKi8KK3N0YXRpYyBpbnQgYXBjaTE1MDBfdGltZXJfcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJZGF0YVswXSA9IGlfSW50ZXJydXB0TWFzazsKIAlkYXRhWzFdID0gaV9JbnB1dENoYW5uZWw7CkBAIC0yNDMzLDMxICsxOTI5LDEyIEBACiB9CiAKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgIGlfQVBDSTE1MDBfQ29uZmlndXJlSW50ZXJydXB0ICAgICAgICAgICAgICAgICAgICAgfAotfAkJCShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLXwgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSk7IAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogQ29uZmlndXJlcyB0aGUgaW50ZXJydXB0IHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6ICAgc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiAgICAgIDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAgIDpwb2ludGVyIHRvIHN1YmRldmljZSBzdHJ1Y3R1cmUKLXwgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuICAgICAgOnBvaW50ZXIgdG8gaW5zbiBzdHJ1Y3R1cmUgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgIDogRGF0YSBQb2ludGVyICAgICAgICAgICAgICAgICB8Ci18Ci0KLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgaW50IGlfQVBDSTE1MDBfQ29uZmlndXJlSW50ZXJydXB0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJIHVuc2lnbmVkIGludCAqZGF0YSkKKyAqIENvbmZpZ3VyZXMgdGhlIGludGVycnVwdCByZWdpc3RlcnMKKyAqLworc3RhdGljIGludCBhcGNpMTUwMF9kb19iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVuc2lnbmVkIGludCB1aV9TdGF0dXM7CkBAIC0yNDc0LDE0MCArMTk1MSwxMDEgQEAKIAkJCWlfQ29uc3RhbnQgPSAweDAwOwogCQl9CQkvKiBpZntkYXRhWzBdPT0wKSAqLwogCQllbHNlIHsKLQkJCXByaW50aygiXG5UaGUgcGFyYW1ldGVyIHBhc3NlZCB0byBkcml2ZXIgaXMgaW4gZXJyb3IgZm9yIGVuYWJsaW5nIHRoZSB2b2x0YWdlIGludGVycnVwdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhlIHBhcmFtZXRlciBwYXNzZWQgdG8gZHJpdmVyIGlzIGluIGVycm9yIGZvciBlbmFibGluZyB0aGUgdm9sdGFnZSBpbnRlcnJ1cHRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qIGVsc2UgaWYoZGF0YVswXT09MCkgKi8KIAl9CQkJLyogZWxzZWlmKGRhdGFbMF09PTEpICovCiAKLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIG1vZGUgc3BlY2lmaWNhdGlvbiByZWdpc3RlciBvZiBwb3J0IEIgKi8KLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX1NQRUNJRklDQVRJT04sCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCWlfUmVnVmFsdWUgPSBpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfU1BFQ0lGSUNBVElPTiwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFdyaXRlcyB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gKEFQQ0kxNTAwX09SKSAqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlpX1JlZ1ZhbHVlID0gKGlfUmVnVmFsdWUgJiAweEY5KSB8IEFQQ0kxNTAwX09SOwogCiAJb3V0YihpX1JlZ1ZhbHVlLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHBvcnQgQiAqLwotICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9DT01NQU5EX0FORF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBBdXRob3Jpc2VzIHRoZSBpbnRlcnJ1cHQgb24gdGhlIGJvYXJkICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoMHhDMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBwYXR0ZXJuIHBvbGFyaXR5IHJlZ2lzdGVyIG9mIHBvcnQgQiAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfUEFUVEVSTl9QT0xBUklUWSwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YihpX0NvbnN0YW50LCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgcGF0dGVybiB0cmFuc2l0aW9uIHJlZ2lzdGVyIG9mIHBvcnQgQiAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9QQVRURVJOX1RSQU5TSVRJT04sCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCW91dGIoaV9Db25zdGFudCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIHBhdHRlcm4gbWFzayByZWdpc3RlciBvZiBwb3J0IEIgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfUEFUVEVSTl9NQVNLLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlvdXRiKGlfQ29uc3RhbnQsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiBwb3J0IEEgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfQ09NTUFORF9BTkRfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlpX1JlZ1ZhbHVlID0gaW5iKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9BX0NPTU1BTkRfQU5EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBEZWxldGVzIHRoZSBpbnRlcnJ1cHQgb2YgcG9ydCBBICovCi0JIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCWlfUmVnVmFsdWUgPSAoaV9SZWdWYWx1ZSAmIDB4MEYpIHwgMHgyMDsKIAlvdXRiKGlfUmVnVmFsdWUsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgcG9ydCAgQiAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9DT01NQU5EX0FORF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCWlfUmVnVmFsdWUgPSBpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfQ09NTUFORF9BTkRfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIERlbGV0ZXMgdGhlIGludGVycnVwdCBvZiBwb3J0IEIgKi8KLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJaV9SZWdWYWx1ZSA9IChpX1JlZ1ZhbHVlICYgMHgwRikgfCAweDIwOwogCW91dGIoaV9SZWdWYWx1ZSwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDEgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9DTURfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlpX1JlZ1ZhbHVlID0gaW5iKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjFfQ01EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBEZWxldGVzIHRoZSBpbnRlcnJ1cHQgb2YgdGltZXIgMSAqLwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAlpX1JlZ1ZhbHVlID0gKGlfUmVnVmFsdWUgJiAweDBGKSB8IDB4MjA7CiAJb3V0YihpX1JlZ1ZhbHVlLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDIgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9DTURfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlpX1JlZ1ZhbHVlID0gaW5iKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjJfQ01EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBEZWxldGVzIHRoZSBpbnRlcnJ1cHQgb2YgdGltZXIgMiAqLwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAlpX1JlZ1ZhbHVlID0gKGlfUmVnVmFsdWUgJiAweDBGKSB8IDB4MjA7CiAJb3V0YihpX1JlZ1ZhbHVlLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGltZXIgMyAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX0NNRF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCWlfUmVnVmFsdWUgPSBpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SM19DTURfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIERlbGV0ZXMgdGhlIGludGVycnVwdCBvZiB0aW1lciAzICovCi0JIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCWlfUmVnVmFsdWUgPSAoaV9SZWdWYWx1ZSAmIDB4MEYpIHwgMHgyMDsKIAlvdXRiKGlfUmVnVmFsdWUsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIG1hc3RlciBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciAqLwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9JTlRFUlJVUFRfQ09OVFJPTCwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogQXV0aG9yaXplcyB0aGUgbWFpbiBpbnRlcnJ1cHQgb24gdGhlIGJvYXJkICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YigweEQwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBFbmFibGVzIHRoZSBQQ0kgaW50ZXJydXB0ICovCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0bCgweDMwMDAsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIDB4MzgpOwogCXVpX1N0YXR1cyA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyAweDEwKTsKIAl1aV9TdGF0dXMgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHgzOCk7CkBAIC0yNjE2LDI0ICsyMDU0LDcgQEAKIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAotLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IHN0YXRpYyB2b2lkIHZfQVBDSTE1MDBfSW50ZXJydXB0CQkJCQkgICAgIHwKLXwJCQkJCSAgKGludCBpcnEgLCB2b2lkICpkKSAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IEludGVycnVwdCBoYW5kbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBpbnQgaXJxICAgICAgICAgICAgICAgICA6IGlycSBudW1iZXIgICAgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmQgICAgICAgICAgICAgICAgIDogdm9pZCBwb2ludGVyICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIHZvaWQgdl9BUENJMTUwMF9JbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKK3N0YXRpYyB2b2lkIGFwY2kxNTAwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQogewogCiAJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7CkBAIC0yNjQyLDQ0ICsyMDYzLDI4IEBACiAJaW50IGlfUmVnVmFsdWUgPSAwOwogCWlfSW50ZXJydXB0TWFzayA9IDA7CiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogUmVhZCB0aGUgYm9hcmQgaW50ZXJydXB0IHN0YXR1cyAqLwotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAl1aV9JbnRlcnJ1cHRTdGF0dXMgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHgzOCk7CiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBUZXN0IGlmIGJvYXJkIGdlbmVyYXRlZCBhIGludGVycnVwdCAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCWlmICgodWlfSW50ZXJydXB0U3RhdHVzICYgMHg4MDAwMDApID09IDB4ODAwMDAwKSB7Ci0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBEaXNhYmxlIGFsbCBJbnRlcnJ1cHQgKi8KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogU2VsZWN0cyB0aGUgbWFzdGVyIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyICovCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogb3V0YihBUENJMTUwMF9SV19NQVNURVJfSU5URVJSVVBUX0NPTlRST0wsZGV2cHJpdi0+aW9iYXNlK0FQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOyAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBEaXNhYmxlcyAgdGhlIG1haW4gaW50ZXJydXB0IG9uIHRoZSBib2FyZCAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBvdXRiKDB4MDAsZGV2cHJpdi0+aW9iYXNlK0FQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOyAqLwogCi0gICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiBwb3J0IEEgKi8KLSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfQ09NTUFORF9BTkRfU1RBVFVTLAogCQkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCWlfUmVnVmFsdWUgPQogCQkJaW5iKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQlpZiAoKGlfUmVnVmFsdWUgJiAweDYwKSA9PSAweDYwKSB7Ci0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHBvcnQgQSAqLwotCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9BX0NPTU1BTkRfQU5EX1NUQVRVUywKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBEZWxldGVzIHRoZSBpbnRlcnJ1cHQgb2YgcG9ydCBBICovCi0JICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCWlfUmVnVmFsdWUgPSAoaV9SZWdWYWx1ZSAmIDB4MEYpIHwgMHgyMDsKIAkJCW91dGIoaV9SZWdWYWx1ZSwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwpAQCAtMjY5Myw5ICsyMDk4LDcgQEAKIAkJCQkJaW5iKGRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBpbnRlcnJ1cHQgdmVjdG9yIHJlZ2lzdGVyIG9mIHBvcnQgQSAqLwotCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfSU5URVJSVVBUX0NPTlRST0wsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMjcxMSw0NSArMjExNCwzMiBAQAogCQkJfQkvKiBlbHNlaWYoaV9Mb2dpYz09QVBDSTE1MDBfT1JfUFJJT1JJVFkpICovCiAJCX0JCS8qICBpZiAoKGlfUmVnVmFsdWUgJiAweDYwKSA9PSAweDYwKSAqLwogCi0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgcG9ydCBCICovCi0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9DT01NQU5EX0FORF9TVEFUVVMsCiAJCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJaV9SZWdWYWx1ZSA9CiAJCQlpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCWlmICgoaV9SZWdWYWx1ZSAmIDB4NjApID09IDB4NjApIHsKLQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiBwb3J0IEIgKi8KLQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX0NPTU1BTkRfQU5EX1NUQVRVUywKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogRGVsZXRlcyB0aGUgaW50ZXJydXB0IG9mIHBvcnQgQiAqLwotCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJaV9SZWdWYWx1ZSA9IChpX1JlZ1ZhbHVlICYgMHgwRikgfCAweDIwOwogCQkJb3V0YihpX1JlZ1ZhbHVlLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCQlwcmludGsoIlxuXG5cbiIpOwotCSAgICAgLyoqKioqKioqKioqKioqKiovCiAJCQkvKiBSZWFkcyBwb3J0IEIgKi8KLQkgICAgIC8qKioqKioqKioqKioqKioqLwogCQkJaV9SZWdWYWx1ZSA9CiAJCQkJaW5iKCh1bnNpZ25lZCBpbnQpIGRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfUE9SVF9CKTsKIAogCQkJaV9SZWdWYWx1ZSA9IGlfUmVnVmFsdWUgJiAweEMwOwotCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFRlc3RzIGlmIHRoaXMgaXMgYW4gZXh0ZXJuYWwgZXJyb3IgKi8KLQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCWlmIChpX1JlZ1ZhbHVlKSB7CiAJCQkJLyogRGlzYWJsZSB0aGUgaW50ZXJydXB0ICovCi0JCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiBwb3J0IEIgKi8KLQkJICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0bCgweDAsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIDB4MzgpOwogCiAJCQkJaWYgKGlfUmVnVmFsdWUgJiAweDgwKSB7CkBAIC0yNzY3LDQ2ICsyMTU3LDM0IEBACiAJCQl9CS8qICBpZiAoaV9SZWdWYWx1ZSkgKi8KIAkJfQkJLyogaWYgKChpX1JlZ1ZhbHVlICYgMHg2MCkgPT0gMHg2MCkgKi8KIAotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiB0aW1lciAxICovCi0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9DTURfU1RBVFVTLAogCQkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCWlfUmVnVmFsdWUgPQogCQkJaW5iKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQlpZiAoKGlfUmVnVmFsdWUgJiAweDYwKSA9PSAweDYwKSB7Ci0JCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiB0aW1lciAxICovCi0JCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjFfQ01EX1NUQVRVUywKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBEZWxldGVzIHRoZSBpbnRlcnJ1cHQgb2YgdGltZXIgMSAqLwotCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlpX1JlZ1ZhbHVlID0gKGlfUmVnVmFsdWUgJiAweDBGKSB8IDB4MjA7CiAJCQlvdXRiKGlfUmVnVmFsdWUsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJCWlfSW50ZXJydXB0TWFzayA9IGlfSW50ZXJydXB0TWFzayB8IDQ7CiAJCX0JCS8qICBpZiAoKGlfUmVnVmFsdWUgJiAweDYwKSA9PSAweDYwKSAqLwotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiB0aW1lciAyICovCi0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9DTURfU1RBVFVTLAogCQkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCWlfUmVnVmFsdWUgPQogCQkJaW5iKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQlpZiAoKGlfUmVnVmFsdWUgJiAweDYwKSA9PSAweDYwKSB7Ci0JCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiB0aW1lciAyICovCi0JCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjJfQ01EX1NUQVRVUywKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBEZWxldGVzIHRoZSBpbnRlcnJ1cHQgb2YgdGltZXIgMiAqLwotCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlpX1JlZ1ZhbHVlID0gKGlfUmVnVmFsdWUgJiAweDBGKSB8IDB4MjA7CiAJCQlvdXRiKGlfUmVnVmFsdWUsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKQEAgLTI4MTQsMjMgKzIxOTIsMTcgQEAKIAkJCWlfSW50ZXJydXB0TWFzayA9IGlfSW50ZXJydXB0TWFzayB8IDg7CiAJCX0JCS8qICBpZiAoKGlfUmVnVmFsdWUgJiAweDYwKSA9PSAweDYwKSAqLwogCi0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDMgKi8KLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX0NNRF9TVEFUVVMsCiAJCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJaV9SZWdWYWx1ZSA9CiAJCQlpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCWlmICgoaV9SZWdWYWx1ZSAmIDB4NjApID09IDB4NjApIHsKLQkJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDMgKi8KLQkJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SM19DTURfU1RBVFVTLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIERlbGV0ZXMgdGhlIGludGVycnVwdCBvZiB0aW1lciAzICovCi0JCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCWlfUmVnVmFsdWUgPSAoaV9SZWdWYWx1ZSAmIDB4MEYpIHwgMHgyMDsKIAkJCW91dGIoaV9SZWdWYWx1ZSwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwpAQCAtMjg0NCw0MiArMjIxNiwyMyBAQAogCQl9CQkvKiAgaWYgKChpX1JlZ1ZhbHVlICYgMHg2MCkgPT0gMHg2MCkgKi8KIAogCQlzZW5kX3NpZyhTSUdJTywgZGV2cHJpdi0+dHNrX0N1cnJlbnQsIDApOwkvKiAgc2VuZCBzaWduYWwgdG8gdGhlIHNhbXBsZSAqLwotCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIEVuYWJsZSBhbGwgSW50ZXJydXB0cyAqLwotCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFNlbGVjdHMgdGhlIG1hc3RlciBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciAqLwotCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJb3V0YihBUENJMTUwMF9SV19NQVNURVJfSU5URVJSVVBUX0NPTlRST0wsCiAJCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIEF1dGhvcml6ZXMgdGhlIG1haW4gaW50ZXJydXB0IG9uIHRoZSBib2FyZCAqLwotCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJb3V0YigweEQwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAl9CQkJLyogICBpZiAoKHVpX0ludGVycnVwdFN0YXR1cyAmIDB4ODAwMDAwKSA9PSAweDgwMDAwMCkgKi8KIAllbHNlIHsKLQkJcHJpbnRrKCJcbkludGVycnVwdCBmcm9tIHVua25vd24gc291cmNlXG4iKTsKKwkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkiSW50ZXJydXB0IGZyb20gdW5rbm93biBzb3VyY2VcbiIpOwogCiAJfQkJCS8qIGVsc2UgaWYgKCh1aV9JbnRlcnJ1cHRTdGF0dXMgJiAweDgwMDAwMCkgPT0gMHg4MDAwMDApICovCiAJcmV0dXJuOwogfQogCi0vKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTE1MDBfUmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6cmVzZXRzIGFsbCB0aGUgcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgaW50IGlfQVBDSTE1MDBfUmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgYXBjaTE1MDBfcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBpX0R1bW15UmVhZCA9IDA7CkBAIC0yODk4LDkgKzIyNTEsNyBAQAogCWlfVGltZXJDb3VudGVyMkVuYWJsZWQgPSAwOwogCWlfV2F0Y2hkb2dDb3VudGVyM0VuYWJsZWQgPSAwOwogCi0gICAgLyoqKioqKioqKioqKioqKioqKi8KIAkvKiBTb2Z0d2FyZSByZXNldCAqLwotICAgIC8qKioqKioqKioqKioqKioqKiovCiAJaV9EdW1teVJlYWQgPSBpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YigwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlpX0R1bW15UmVhZCA9IGluYihkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTI5MDgsMTYgKzIyNTksMTIgQEAKIAlvdXRiKDEsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCW91dGIoMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgbWFzdGVyIGNvbmZpZ3VyYXRpb24gY29udHJvbCByZWdpc3RlciAqLwotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCW91dGIoMHhGNCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgbW9kZSBzcGVjaWZpY2F0aW9uIHJlZ2lzdGVyIG9mIHBvcnQgQSAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQV9TUEVDSUZJQ0FUSU9OLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlvdXRiKDB4MTAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMjk0OSw5ICsyMjk2LDcgQEAKIAkvKiBEZWxldGVzIHRoZSByZWdpc3RlciAqLwogCW91dGIoMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIG1vZGUgc3BlY2lmaWNhdGlvbiByZWdpc3RlciBvZiBwb3J0IEIgKi8KLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX1NQRUNJRklDQVRJT04sCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCW91dGIoMHgxMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0yOTgxLDkgKzIzMjYsNyBAQAogCS8qIERlbGV0ZXMgdGhlIHJlZ2lzdGVyICovCiAJb3V0YigwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBkYXRhIHBhdGggcG9sYXJpdHkgcmVnaXN0ZXIgb2YgcG9ydCBDICovCi0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9DX0RBVEFfUENJVENIX1BPTEFSSVRZLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkvKiBIaWdoIGxldmVsIG9mIHBvcnQgQyBtZWFucyAxICovCkBAIC0yOTk4LDkgKzIzNDEsNyBAQAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkvKiBEZWxldGVzIGl0ICovCiAJb3V0YigwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiB0aW1lciAxICovCi0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIxX0NNRF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlbGV0ZXMgSVAgYW5kIElVUyAqLwpAQCAtMzAxMCw5ICsyMzUxLDcgQEAKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJLyogRGVhY3RpdmF0ZXMgdGhlIGludGVycnVwdCBtYW5hZ2VtZW50IG9mIHRpbWVyIDEgICAgICAgICAqLwogCW91dGIoMHhFMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGltZXIgMiAqLwotCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9DTURfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkvKiBEZWxldGVzIElQIGFuZCBJVVMgKi8KQEAgLTMwMjIsOSArMjM2MSw3IEBACiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlYWN0aXZhdGVzIFRpbWVyIDIgaW50ZXJydXB0IG1hbmFnZW1lbnQ6ICAgICAgICAgICAgICAgKi8KIAlvdXRiKDB4RTAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGltZXIgMyAqLwotCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX0NNRF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlbGV0ZXMgSVAgYW5kIElVUyAqLwpAQCAtMzAzNCw3MSArMjM3MSw0MyBAQAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkvKiBEZWFjdGl2YXRlcyBpbnRlcnJ1cHQgbWFuYWdlbWVudCBvZiB0aW1lciAzOiAgICAgICAgICAgICovCiAJb3V0YigweEUwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgbWFzdGVyIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyICovCi0JIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0lOVEVSUlVQVF9DT05UUk9MLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkvKiBEZWxldGVzIGFsbCBpbnRlcnJ1cHRzICovCiAJb3V0YigwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkvKiByZXNldCBhbGwgdGhlIGRpZ2l0YWwgb3V0cHV0cyAqLwogCW91dHcoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFkZG9uICsgQVBDSTE1MDBfRElHSVRBTF9PUCk7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERpc2FibGUgdGhlIGJvYXJkIGludGVycnVwdCAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgbWFzdGVyIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyICovCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19NQVNURVJfSU5URVJSVVBUX0NPTlRST0wsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZWFjdGl2YXRlcyBhbGwgaW50ZXJydXB0cyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgcG9ydCBBICovCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9BX0NPTU1BTkRfQU5EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlYWN0aXZhdGVzIGFsbCBpbnRlcnJ1cHRzICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoMHgwMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHBvcnQgQiAqLwotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9DT01NQU5EX0FORF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZWFjdGl2YXRlcyBhbGwgaW50ZXJydXB0cyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKDB4MDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiB0aW1lciAxICovCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjFfQ01EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlYWN0aXZhdGVzIGFsbCBpbnRlcnJ1cHRzICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoMHgwMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDIgKi8KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9DTURfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVhY3RpdmF0ZXMgYWxsIGludGVycnVwdHMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YigweDAwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiB0aW1lciAzKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX0NNRF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZWFjdGl2YXRlcyBhbGwgaW50ZXJydXB0cyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKDB4MDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTU2NC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTU2NC5jCmluZGV4IDg0NjY4NTQuLjljODZiMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1NjQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTY0LmMKQEAgLTEsNzQgKzEsMzIgQEAKLS8qKgotQHZlcmJhdGltCi0KLUNvcHlyaWdodCAoQykgMjAwNCwyMDA1ICBBRERJLURBVEEgR21iSCBmb3IgdGhlIHNvdXJjZSBjb2RlIG9mIHRoaXMgbW9kdWxlLgotCi0JQURESS1EQVRBIEdtYkgKLQlEaWVzZWxzdHJhc3NlIDMKLQlELTc3ODMzIE90dGVyc3dlaWVyCi0JVGVsOiArMTkoMCk3MjIzLzk0OTMtMAotCUZheDogKzQ5KDApNzIyMy85NDkzLTkyCi0JaHR0cDovL3d3dy5hZGRpLWRhdGEuY29tCi0JaW5mb0BhZGRpLWRhdGEuY29tCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotQGVuZHZlcmJhdGltCi0qLwogLyoKLQotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgKEMpIEFEREktREFUQSBHbWJIICAgICAgICAgIERpZXNlbHN0cmHDn2UgMyAgICAgICBELTc3ODMzIE90dGVyc3dlaWVyICB8Ci0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCBUZWwgOiArNDkgKDApIDcyMjMvOTQ5My0wICAgICB8IGVtYWlsICAgIDogaW5mb0BhZGRpLWRhdGEuY29tICAgICAgICAgfAotICB8IEZheCA6ICs0OSAoMCkgNzIyMy85NDkzLTkyICAgIHwgSW50ZXJuZXQgOiBodHRwOi8vd3d3LmFkZGktZGF0YS5jb20gICB8Ci0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCBQcm9qZWN0ICAgICA6IEFQQ0ktMTU2NCAgICAgICB8IENvbXBpbGVyICAgOiBHQ0MgICAgICAgICAgICAgICAgICAgICAgfAotICB8IE1vZHVsZSBuYW1lIDogaHdkcnZfYXBjaTE1NjQuY3wgVmVyc2lvbiAgICA6IDIuOTYgICAgICAgICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCBQcm9qZWN0IG1hbmFnZXI6IEVyaWMgU3RvbHogICB8IERhdGUgICAgICAgOiAgMDIvMTIvMjAwMiAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgRGVzY3JpcHRpb24gOiAgIEhhcmR3YXJlIExheWVyIEFjY2VzcyBGb3IgQVBDSS0xNTY0ICAgICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCAgIERhdGUgICB8ICAgQXV0aG9yICB8ICAgICAgICAgIERlc2NyaXB0aW9uIG9mIHVwZGF0ZXMgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgfCAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICB8ICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi0KLS8qKioqKioqKiogICAgICBEZWZpbml0aW9ucyBmb3IgQVBDSS0xNTY0IGNhcmQgICoqKioqLworICogQ29weXJpZ2h0IChDKSAyMDA0LDIwMDUgIEFEREktREFUQSBHbWJIIGZvciB0aGUgc291cmNlIGNvZGUgb2YgdGhpcyBtb2R1bGUuCisgKgorICoJQURESS1EQVRBIEdtYkgKKyAqCURpZXNlbHN0cmFzc2UgMworICoJRC03NzgzMyBPdHRlcnN3ZWllcgorICoJVGVsOiArMTkoMCk3MjIzLzk0OTMtMAorICoJRmF4OiArNDkoMCk3MjIzLzk0OTMtOTIKKyAqCWh0dHA6Ly93d3cuYWRkaS1kYXRhLmNvbQorICoJaW5mb0BhZGRpLWRhdGEuY29tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorICogdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICovCiAKICNkZWZpbmUgQVBDSTE1NjRfQUREUkVTU19SQU5HRQkJCQkxMjgKIAotLyogRElHSVRBTCBJTlBVVC1PVVRQVVQgREVGSU5FICovCi0vKiBJbnB1dCBkZWZpbmVzICovCi0jZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfSVAJCQkJMHgwNAotI2RlZmluZSBBUENJMTU2NF9ESUdJVEFMX0lQX0lOVEVSUlVQVF9NT0RFMQkJNAotI2RlZmluZSBBUENJMTU2NF9ESUdJVEFMX0lQX0lOVEVSUlVQVF9NT0RFMgkJOAotI2RlZmluZSBBUENJMTU2NF9ESUdJVEFMX0lQX0lSUQkJCQkxNgotCi0vKiBPdXRwdXQgZGVmaW5lcyAqLwotI2RlZmluZSBBUENJMTU2NF9ESUdJVEFMX09QCQkJCTB4MTgKLSNkZWZpbmUgQVBDSTE1NjRfRElHSVRBTF9PUF9SVwkJCQkwCi0jZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfT1BfSU5URVJSVVBUCQkJNAotI2RlZmluZSBBUENJMTU2NF9ESUdJVEFMX09QX0lSUQkJCQkxMgotCiAvKiBEaWdpdGFsIElucHV0IElSUSBGdW5jdGlvbiBTZWxlY3Rpb24gKi8KICNkZWZpbmUgQURESURBVEFfT1IJCQkJCTAKICNkZWZpbmUgQURESURBVEFfQU5ECQkJCQkxCiAKLS8qIERpZ2l0YWwgSW5wdXQgSW50ZXJydXB0IFN0YXR1cyAqLwotI2RlZmluZSBBUENJMTU2NF9ESUdJVEFMX0lQX0lOVEVSUlVQVF9TVEFUVVMJCTEyCi0KLS8qIERpZ2l0YWwgT3V0cHV0IEludGVycnVwdCBTdGF0dXMgKi8KLSNkZWZpbmUgQVBDSTE1NjRfRElHSVRBTF9PUF9JTlRFUlJVUFRfU1RBVFVTCQk4Ci0KIC8qIERpZ2l0YWwgSW5wdXQgSW50ZXJydXB0IEVuYWJsZSBEaXNhYmxlLiAqLwogI2RlZmluZSBBUENJMTU2NF9ESUdJVEFMX0lQX0lOVEVSUlVQVF9FTkFCTEUJCTB4NAogI2RlZmluZSBBUENJMTU2NF9ESUdJVEFMX0lQX0lOVEVSUlVQVF9ESVNBQkxFCQkweGZmZmZmZmZiCkBAIC04MCw5OCArMzgsOTEgQEAKICNkZWZpbmUgQVBDSTE1NjRfRElHSVRBTF9PUF9DQ19JTlRFUlJVUFRfRElTQUJMRQkweGZmZmZmZmZkCiAKIC8qIFRJTUVSIENPVU5URVIgV0FUQ0hET0cgREVGSU5FUyAqLwotCiAjZGVmaW5lIEFERElEQVRBX1RJTUVSCQkJCQkwCiAjZGVmaW5lIEFERElEQVRBX0NPVU5URVIJCQkJMQogI2RlZmluZSBBRERJREFUQV9XQVRDSERPRwkJCQkyCi0jZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfT1BfV0FUQ0hET0cJCQkweDI4Ci0jZGVmaW5lIEFQQ0kxNTY0X1RJTUVSCQkJCQkweDQ4Ci0jZGVmaW5lIEFQQ0kxNTY0X0NPVU5URVIxCQkJCTB4MAotI2RlZmluZSBBUENJMTU2NF9DT1VOVEVSMgkJCQkweDIwCi0jZGVmaW5lIEFQQ0kxNTY0X0NPVU5URVIzCQkJCTB4NDAKLSNkZWZpbmUgQVBDSTE1NjRfQ09VTlRFUjQJCQkJMHg2MAotI2RlZmluZSBBUENJMTU2NF9UQ1dfU1lOQ19FTkFCTEVESVNBQkxFCQkJMAotI2RlZmluZSBBUENJMTU2NF9UQ1dfUkVMT0FEX1ZBTFVFCQkJNAotI2RlZmluZSBBUENJMTU2NF9UQ1dfVElNRUJBU0UJCQkJOAotI2RlZmluZSBBUENJMTU2NF9UQ1dfUFJPRwkJCQkxMgotI2RlZmluZSBBUENJMTU2NF9UQ1dfVFJJR19TVEFUVVMJCQkxNgotI2RlZmluZSBBUENJMTU2NF9UQ1dfSVJRCQkJCTIwCi0jZGVmaW5lIEFQQ0kxNTY0X1RDV19XQVJOX1RJTUVWQUwJCQkyNAotI2RlZmluZSBBUENJMTU2NF9UQ1dfV0FSTl9USU1FQkFTRQkJCTI4CisjZGVmaW5lIEFQQ0kxNTY0X0NPVU5URVIxCQkJCTAKKyNkZWZpbmUgQVBDSTE1NjRfQ09VTlRFUjIJCQkJMQorI2RlZmluZSBBUENJMTU2NF9DT1VOVEVSMwkJCQkyCisjZGVmaW5lIEFQQ0kxNTY0X0NPVU5URVI0CQkJCTMKKworLyoKKyAqIGRldnByaXYtPmlfSW9iYXNlQW1jYyBSZWdpc3RlciBNYXAKKyAqLworI2RlZmluZSBBUENJMTU2NF9ESV9SRUcJCQkJCTB4MDQKKyNkZWZpbmUgQVBDSTE1NjRfRElfSU5UX01PREUxX1JFRwkJCTB4MDgKKyNkZWZpbmUgQVBDSTE1NjRfRElfSU5UX01PREUyX1JFRwkJCTB4MGMKKyNkZWZpbmUgQVBDSTE1NjRfRElfSU5UX1NUQVRVU19SRUcJCQkweDEwCisjZGVmaW5lIEFQQ0kxNTY0X0RJX0lSUV9SRUcJCQkJMHgxNAorI2RlZmluZSBBUENJMTU2NF9ET19SRUcJCQkJCTB4MTgKKyNkZWZpbmUgQVBDSTE1NjRfRE9fSU5UX0NUUkxfUkVHCQkJMHgxYworI2RlZmluZSBBUENJMTU2NF9ET19JTlRfU1RBVFVTX1JFRwkJCTB4MjAKKyNkZWZpbmUgQVBDSTE1NjRfRE9fSVJRX1JFRwkJCQkweDI0CisjZGVmaW5lIEFQQ0kxNTY0X1dET0dfUkVHCQkJCTB4MjgKKyNkZWZpbmUgQVBDSTE1NjRfV0RPR19SRUxPQURfUkVHCQkJMHgyYworI2RlZmluZSBBUENJMTU2NF9XRE9HX1RJTUVCQVNFX1JFRwkJCTB4MzAKKyNkZWZpbmUgQVBDSTE1NjRfV0RPR19DVFJMX1JFRwkJCQkweDM0CisjZGVmaW5lIEFQQ0kxNTY0X1dET0dfU1RBVFVTX1JFRwkJCTB4MzgKKyNkZWZpbmUgQVBDSTE1NjRfV0RPR19JUlFfUkVHCQkJCTB4M2MKKyNkZWZpbmUgQVBDSTE1NjRfV0RPR19XQVJOX1RJTUVWQUxfUkVHCQkJMHg0MAorI2RlZmluZSBBUENJMTU2NF9XRE9HX1dBUk5fVElNRUJBU0VfUkVHCQkJMHg0NAorI2RlZmluZSBBUENJMTU2NF9USU1FUl9SRUcJCQkJMHg0OAorI2RlZmluZSBBUENJMTU2NF9USU1FUl9SRUxPQURfUkVHCQkJMHg0YworI2RlZmluZSBBUENJMTU2NF9USU1FUl9USU1FQkFTRV9SRUcJCQkweDUwCisjZGVmaW5lIEFQQ0kxNTY0X1RJTUVSX0NUUkxfUkVHCQkJCTB4NTQKKyNkZWZpbmUgQVBDSTE1NjRfVElNRVJfU1RBVFVTX1JFRwkJCTB4NTgKKyNkZWZpbmUgQVBDSTE1NjRfVElNRVJfSVJRX1JFRwkJCQkweDVjCisjZGVmaW5lIEFQQ0kxNTY0X1RJTUVSX1dBUk5fVElNRVZBTF9SRUcJCQkweDYwCisjZGVmaW5lIEFQQ0kxNTY0X1RJTUVSX1dBUk5fVElNRUJBU0VfUkVHCQkweDY0CisKKy8qCisgKiBkZXZwcml2LT5pb2Jhc2UgUmVnaXN0ZXIgTWFwCisgKi8KKyNkZWZpbmUgQVBDSTE1NjRfVENXX1JFRyh4KQkJCQkoMHgwMCArICgoeCkgKiAweDIwKSkKKyNkZWZpbmUgQVBDSTE1NjRfVENXX1JFTE9BRF9SRUcoeCkJCQkoMHgwNCArICgoeCkgKiAweDIwKSkKKyNkZWZpbmUgQVBDSTE1NjRfVENXX1RJTUVCQVNFX1JFRyh4KQkJCSgweDA4ICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoeCkJCQkoMHgwYyArICgoeCkgKiAweDIwKSkKKyNkZWZpbmUgQVBDSTE1NjRfVENXX1NUQVRVU19SRUcoeCkJCQkoMHgxMCArICgoeCkgKiAweDIwKSkKKyNkZWZpbmUgQVBDSTE1NjRfVENXX0lSUV9SRUcoeCkJCQkJKDB4MTQgKyAoKHgpICogMHgyMCkpCisjZGVmaW5lIEFQQ0kxNTY0X1RDV19XQVJOX1RJTUVWQUxfUkVHKHgpCQkoMHgxOCArICgoeCkgKiAweDIwKSkKKyNkZWZpbmUgQVBDSTE1NjRfVENXX1dBUk5fVElNRUJBU0VfUkVHKHgpCQkoMHgxYyArICgoeCkgKiAweDIwKSkKIAogLyogR2xvYmFsIHZhcmlhYmxlcyAqLwotc3RhdGljIHVuc2lnbmVkIGludCB1aV9JbnRlcnJ1cHRTdGF0dXNfMTU2NCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IHVpX0ludGVycnVwdFN0YXR1c18xNTY0Owogc3RhdGljIHVuc2lnbmVkIGludCB1aV9JbnRlcnJ1cHREYXRhLCB1aV9UeXBlOwogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTE1NjRfQ29uZmlnRGlnaXRhbElucHV0ICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSkgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBDb25maWd1cmVzIHRoZSBkaWdpdGFsIGlucHV0IFN1YmRldmljZSAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA6IERyaXZlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgOiBEYXRhIFBvaW50ZXIgY29udGFpbnMgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93IHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCSAgZGF0YVswXSAgICAgICAgICAgIDogMSBFbmFibGUgIERpZ2l0YWwgSW5wdXQgSW50ZXJydXB0IHwKLXwJCQkJCQkJCSAgIDAgRGlzYWJsZSBEaWdpdGFsIElucHV0IEludGVycnVwdCB8Ci18CQkJICBkYXRhWzFdICAgICAgICAgICAgOiAwIEFERElEQVRBIEludGVycnVwdCBPUiBMT0dJQwkgfAotfAkJCQkJCQkJIDogMSBBRERJREFUQSBJbnRlcnJ1cHQgQU5EIExPR0lDICAgIHwKLXwJCQkgIGRhdGFbMl0JCQkgOiBJbnRlcnJ1cHQgbWFzayBmb3IgdGhlIG1vZGUgMQkgfAotfAkJCSAgZGF0YVszXQkJCSA6IEludGVycnVwdCBtYXNrIGZvciB0aGUgbW9kZSAyCSB8Ci18CQkJCQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMTU2NF9Db25maWdEaWdpdGFsSW5wdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQorICogQ29uZmlndXJlcyB0aGUgZGlnaXRhbCBpbnB1dCBTdWJkZXZpY2UKKyAqCisgKiBkYXRhWzBdIDEgPSBFbmFibGUgaW50ZXJydXB0LCAwID0gRGlzYWJsZSBpbnRlcnJ1cHQKKyAqIGRhdGFbMV0gMCA9IEFERElEQVRBIEludGVycnVwdCBPUiBMT0dJQywgMSA9IEFERElEQVRBIEludGVycnVwdCBBTkQgTE9HSUMKKyAqIGRhdGFbMl0gSW50ZXJydXB0IG1hc2sgZm9yIHRoZSBtb2RlIDEKKyAqIGRhdGFbM10gSW50ZXJydXB0IG1hc2sgZm9yIHRoZSBtb2RlIDIKKyAqLworc3RhdGljIGludCBhcGNpMTU2NF9kaV9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKIAlkZXZwcml2LT50c2tfQ3VycmVudCA9IGN1cnJlbnQ7Ci0gICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogCS8qIFNldCB0aGUgZGlnaXRhbCBpbnB1dCBsb2dpYyAqLwotICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJaWYgKGRhdGFbMF0gPT0gQURESURBVEFfRU5BQkxFKSB7CiAJCWRhdGFbMl0gPSBkYXRhWzJdIDw8IDQ7CiAJCWRhdGFbM10gPSBkYXRhWzNdIDw8IDQ7Ci0JCW91dGwoZGF0YVsyXSwKLQkJCWRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfSVAgKwotCQkJQVBDSTE1NjRfRElHSVRBTF9JUF9JTlRFUlJVUFRfTU9ERTEpOwotCQlvdXRsKGRhdGFbM10sCi0JCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX0lQICsKLQkJCUFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX01PREUyKTsKLQkJaWYgKGRhdGFbMV0gPT0gQURESURBVEFfT1IpIHsKLQkJCW91dGwoMHg0LAotCQkJCWRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfSVAgKwotCQkJCUFQQ0kxNTY0X0RJR0lUQUxfSVBfSVJRKTsKLQkJfQkJLyogIGlmICAoZGF0YVsxXSA9PSBBRERJREFUQV9PUikgKi8KLQkJZWxzZSB7Ci0JCQlvdXRsKDB4NiwKLQkJCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX0lQICsKLQkJCQlBUENJMTU2NF9ESUdJVEFMX0lQX0lSUSk7Ci0JCX0JCS8qICBlbHNlIGlmICAoZGF0YVsxXSA9PSBBRERJREFUQV9PUikgKi8KLQl9CQkJLyogIGlmICAoZGF0YVswXSA9PSBBRERJREFUQV9FTkFCTEUpICovCi0JZWxzZSB7Ci0JCW91dGwoMHgwLAotCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCArCi0JCQlBUENJMTU2NF9ESUdJVEFMX0lQX0lOVEVSUlVQVF9NT0RFMSk7Ci0JCW91dGwoMHgwLAotCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCArCi0JCQlBUENJMTU2NF9ESUdJVEFMX0lQX0lOVEVSUlVQVF9NT0RFMik7Ci0JCW91dGwoMHgwLAotCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCArCi0JCQlBUENJMTU2NF9ESUdJVEFMX0lQX0lSUSk7Ci0JfQkJCS8qICBlbHNlIGlmICAoZGF0YVswXSA9PSBBRERJREFUQV9FTkFCTEUpICovCisJCW91dGwoZGF0YVsyXSwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSU5UX01PREUxX1JFRyk7CisJCW91dGwoZGF0YVszXSwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSU5UX01PREUyX1JFRyk7CisJCWlmIChkYXRhWzFdID09IEFERElEQVRBX09SKQorCQkJb3V0bCgweDQsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJX0lSUV9SRUcpOworCQllbHNlCisJCQlvdXRsKDB4NiwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSVJRX1JFRyk7CisJfSBlbHNlIHsKKwkJb3V0bCgweDAsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJX0lOVF9NT0RFMV9SRUcpOworCQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSU5UX01PREUyX1JFRyk7CisJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JUlFfUkVHKTsKKwl9CiAKIAlyZXR1cm4gaW5zbi0+bjsKIH0KQEAgLTE4Myw0MCArMTM0LDIxIEBACiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAotCWRhdGFbMV0gPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCk7CisJZGF0YVsxXSA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9SRUcpOwogCiAJcmV0dXJuIGluc24tPm47CiB9CiAKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMTU2NF9Db25maWdEaWdpdGFsT3V0cHV0ICAgICAgICAgICAgICAgICAgICAgfAotfAkJCSAgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IENvbmZpZ3VyZXMgVGhlIERpZ2l0YWwgT3V0cHV0IFN1YmRldmljZS4gICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2IDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93IHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCQkJICBkYXRhWzFdICAgICAgICAgICAgOiAxIEVuYWJsZSAgVkNDICBJbnRlcnJ1cHQgIHwKLXwJCQkJCQkJCQkJICAgMCBEaXNhYmxlIFZDQyAgSW50ZXJydXB0ICB8Ci18CQkJCQkgIGRhdGFbMl0gICAgICAgICAgICA6IDEgRW5hYmxlICBDQyAgSW50ZXJydXB0ICAgfAotfAkJCQkJCQkJCQkgICAwIERpc2FibGUgQ0MgIEludGVycnVwdCAgIHwKLXwJCQkJCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTY0X0NvbmZpZ0RpZ2l0YWxPdXRwdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCSAgdW5zaWduZWQgaW50ICpkYXRhKQorICogQ29uZmlndXJlcyBUaGUgRGlnaXRhbCBPdXRwdXQgU3ViZGV2aWNlLgorICoKKyAqIGRhdGFbMV0gMCA9IERpc2FibGUgVkNDIEludGVycnVwdCwgMSA9IEVuYWJsZSBWQ0MgSW50ZXJydXB0CisgKiBkYXRhWzJdIDAgPSBEaXNhYmxlIENDIEludGVycnVwdCwgMSA9IEVuYWJsZSBDQyBJbnRlcnJ1cHQKKyAqLworc3RhdGljIGludCBhcGNpMTU2NF9kb19jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IHVsX0NvbW1hbmQgPSAwOwpAQCAtMjI1LDMxICsxNTcsMjUgQEAKIAkJY29tZWRpX2Vycm9yKGRldiwKIAkJCSJOb3QgYSB2YWxpZCBEYXRhICEhISAsRGF0YSBzaG91bGQgYmUgMSBvciAwXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQkJCS8qICBpZiAgKChkYXRhWzBdIT0wKSAmJiAoZGF0YVswXSE9MSkpICovCi0JaWYgKGRhdGFbMF0pIHsKKwl9CisKKwlpZiAoZGF0YVswXSkKIAkJZGV2cHJpdi0+Yl9PdXRwdXRNZW1vcnlTdGF0dXMgPSBBRERJREFUQV9FTkFCTEU7Ci0JfQkJCS8qICBpZiAgKGRhdGFbMF0pICovCi0JZWxzZSB7CisJZWxzZQogCQlkZXZwcml2LT5iX091dHB1dE1lbW9yeVN0YXR1cyA9IEFERElEQVRBX0RJU0FCTEU7Ci0JfQkJCS8qICBlbHNlIGlmICAoZGF0YVswXSkgKi8KLQlpZiAoZGF0YVsxXSA9PSBBRERJREFUQV9FTkFCTEUpIHsKKworCWlmIChkYXRhWzFdID09IEFERElEQVRBX0VOQUJMRSkKIAkJdWxfQ29tbWFuZCA9IHVsX0NvbW1hbmQgfCAweDE7Ci0JfQkJCS8qICBpZiAgKGRhdGFbMV0gPT0gQURESURBVEFfRU5BQkxFKSAqLwotCWVsc2UgeworCWVsc2UKIAkJdWxfQ29tbWFuZCA9IHVsX0NvbW1hbmQgJiAweEZGRkZGRkZFOwotCX0JCQkvKiAgZWxzZSBpZiAgKGRhdGFbMV0gPT0gQURESURBVEFfRU5BQkxFKSAqLwotCWlmIChkYXRhWzJdID09IEFERElEQVRBX0VOQUJMRSkgeworCisJaWYgKGRhdGFbMl0gPT0gQURESURBVEFfRU5BQkxFKQogCQl1bF9Db21tYW5kID0gdWxfQ29tbWFuZCB8IDB4MjsKLQl9CQkJLyogIGlmICAoZGF0YVsyXSA9PSBBRERJREFUQV9FTkFCTEUpICovCi0JZWxzZSB7CisJZWxzZQogCQl1bF9Db21tYW5kID0gdWxfQ29tbWFuZCAmIDB4RkZGRkZGRkQ7Ci0JfQkJCS8qICBlbHNlIGlmICAoZGF0YVsyXSA9PSBBRERJREFUQV9FTkFCTEUpICovCi0Jb3V0bCh1bF9Db21tYW5kLAotCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX09QICsKLQkJQVBDSTE1NjRfRElHSVRBTF9PUF9JTlRFUlJVUFQpOwotCXVpX0ludGVycnVwdERhdGEgPQotCQlpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9PUCArCi0JCUFQQ0kxNTY0X0RJR0lUQUxfT1BfSU5URVJSVVBUKTsKKworCW91dGwodWxfQ29tbWFuZCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRE9fSU5UX0NUUkxfUkVHKTsKKwl1aV9JbnRlcnJ1cHREYXRhID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RPX0lOVF9DVFJMX1JFRyk7CiAJZGV2cHJpdi0+dHNrX0N1cnJlbnQgPSBjdXJyZW50OwogCXJldHVybiBpbnNuLT5uOwogfQpAQCAtMjYxLDEyICsxODcsMTAgQEAKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCi0Jcy0+c3RhdGUgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9PUCArCi0JCQlBUENJMTU2NF9ESUdJVEFMX09QX1JXKTsKKwlzLT5zdGF0ZSA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ET19SRUcpOwogCiAJaWYgKGNvbWVkaV9kaW9fdXBkYXRlX3N0YXRlKHMsIGRhdGEpKQotCQlvdXRsKHMtPnN0YXRlLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX09QICsKLQkJCUFQQ0kxNTY0X0RJR0lUQUxfT1BfUlcpOworCQlvdXRsKHMtPnN0YXRlLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ET19SRUcpOwogCiAJZGF0YVsxXSA9IHMtPnN0YXRlOwogCkBAIC0yNzQsMzkgKzE5OCwyMCBAQAogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTE1NjRfQ29uZmlnVGltZXJDb3VudGVyV2F0Y2hkb2cgICAgICAgICAgICAgIHwKLXwJCQkgIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSkgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBDb25maWd1cmVzIFRoZSBUaW1lciAsIENvdW50ZXIgb3IgV2F0Y2hkb2cgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA6IERyaXZlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgOiBEYXRhIFBvaW50ZXIgY29udGFpbnMgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcyBiZWxvdyB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkJCSAgZGF0YVswXSAgICAgICAgICAgIDogMCBDb25maWd1cmUgQXMgVGltZXIgICAgICB8Ci18CQkJCQkJCQkJCSAgIDEgQ29uZmlndXJlIEFzIENvdW50ZXIgICAgfAotfAkJCQkJCQkJCQkgICAyIENvbmZpZ3VyZSBBcyBXYXRjaGRvZyAgIHwKLXwJCQkJCSAgZGF0YVsxXSAgICAgICAgICAgIDogMSBFbmFibGUgIEludGVycnVwdCAgICAgICB8Ci18CQkJCQkJCQkJCSAgIDAgRGlzYWJsZSBJbnRlcnJ1cHQgCSAgICAgfAotfAkJCQkJICBkYXRhWzJdICAgICAgICAgICAgOiBUaW1lIFVuaXQgICAgICAgICAgICAgICAgIHwKLXwJCQkJCSAgZGF0YVszXQkJCSA6IFJlbG9hZCBWYWx1ZQkJCSAgICAgfAotfAkJCQkJICBkYXRhWzRdICAgICAgICAgICAgOiBUaW1lciBNb2RlICAgICAgICAgICAgIAkgfAotfAkJCQkJICBkYXRhWzVdCQkJIDogVGltZXIgQ291bnRlciBXYXRjaGRvZyBOdW1iZXJ8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzZdICAgICAgICAgICAgOiAgQ291bnRlciBEaXJlY3Rpb24KLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgaW50IGlfQVBDSTE1NjRfQ29uZmlnVGltZXJDb3VudGVyV2F0Y2hkb2coc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQorICogQ29uZmlndXJlcyBUaGUgVGltZXIsIENvdW50ZXIgb3IgV2F0Y2hkb2cKKyAqCisgKiBkYXRhWzBdIENvbmZpZ3VyZSBhczogMCA9IFRpbWVyLCAxID0gQ291bnRlciwgMiA9IFdhdGNoZG9nCisgKiBkYXRhWzFdIDEgPSBFbmFibGUgSW50ZXJydXB0LCAwID0gRGlzYWJsZSBJbnRlcnJ1cHQKKyAqIGRhdGFbMl0gVGltZSBVbml0CisgKiBkYXRhWzNdIFJlbG9hZCBWYWx1ZQorICogZGF0YVs0XSBUaW1lciBNb2RlCisgKiBkYXRhWzVdIFRpbWVyIENvdW50ZXIgV2F0Y2hkb2cgTnVtYmVyCisgKiBkYXRhWzZdIENvdW50ZXIgRGlyZWN0aW9uCisgKi8KK3N0YXRpYyBpbnQgYXBjaTE1NjRfdGltZXJfY29uZmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVuc2lnbmVkIGludCB1bF9Db21tYW5kMSA9IDA7CkBAIC0zMTYsODkgKzIyMSw1OSBAQAogCQlkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9IEFERElEQVRBX1dBVENIRE9HOwogCiAJCS8qIERpc2FibGUgdGhlIHdhdGNoZG9nICovCi0JCW91dGwoMHgwLAotCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9PUF9XQVRDSERPRyArCi0JCQlBUENJMTU2NF9UQ1dfUFJPRyk7CisJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9XRE9HX0NUUkxfUkVHKTsKIAkJLyogTG9hZGluZyB0aGUgUmVsb2FkIHZhbHVlICovCi0JCW91dGwoZGF0YVszXSwKLQkJCWRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfT1BfV0FUQ0hET0cgKwotCQkJQVBDSTE1NjRfVENXX1JFTE9BRF9WQUxVRSk7Ci0JfQkJCS8qICBpZiAgKGRhdGFbMF09PUFERElEQVRBX1dBVENIRE9HKSAqLwotCWVsc2UgaWYgKGRhdGFbMF0gPT0gQURESURBVEFfVElNRVIpIHsKKwkJb3V0bChkYXRhWzNdLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9XRE9HX1JFTE9BRF9SRUcpOworCX0gZWxzZSBpZiAoZGF0YVswXSA9PSBBRERJREFUQV9USU1FUikgewogCQkvKiBGaXJzdCBTdG9wIFRoZSBUaW1lciAqLwotCQl1bF9Db21tYW5kMSA9Ci0JCQlpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKwotCQkJQVBDSTE1NjRfVENXX1BST0cpOworCQl1bF9Db21tYW5kMSA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CiAJCXVsX0NvbW1hbmQxID0gdWxfQ29tbWFuZDEgJiAweEZGRkZGOUZFVUw7Ci0JCW91dGwodWxfQ29tbWFuZDEsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSICsgQVBDSTE1NjRfVENXX1BST0cpOwkvKiBTdG9wIFRoZSBUaW1lciAqLworCQkvKiBTdG9wIFRoZSBUaW1lciAqLworCQlvdXRsKHVsX0NvbW1hbmQxLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CiAKIAkJZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPSBBRERJREFUQV9USU1FUjsKIAkJaWYgKGRhdGFbMV0gPT0gMSkgewotCQkJb3V0bCgweDAyLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUiArIEFQQ0kxNTY0X1RDV19QUk9HKTsJLyogRW5hYmxlIFRJTUVSIGludCAmIERJU0FCTEUgQUxMIFRIRSBPVEhFUiBpbnQgU09VUkNFUyAqLworCQkJLyogRW5hYmxlIFRJTUVSIGludCAmIERJU0FCTEUgQUxMIFRIRSBPVEhFUiBpbnQgU09VUkNFUyAqLworCQkJb3V0bCgweDAyLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CisJCQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSVJRX1JFRyk7CisJCQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRE9fSVJRX1JFRyk7CisJCQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfV0RPR19JUlFfUkVHKTsKIAkJCW91dGwoMHgwLAotCQkJCWRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfSVAgKwotCQkJCUFQQ0kxNTY0X0RJR0lUQUxfSVBfSVJRKTsKKwkJCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfSVJRX1JFRyhBUENJMTU2NF9DT1VOVEVSMSkpOwogCQkJb3V0bCgweDAsCi0JCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9PUCArCi0JCQkJQVBDSTE1NjRfRElHSVRBTF9PUF9JUlEpOworCQkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19JUlFfUkVHKEFQQ0kxNTY0X0NPVU5URVIyKSk7CiAJCQlvdXRsKDB4MCwKLQkJCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKwotCQkJCUFQQ0kxNTY0X0RJR0lUQUxfT1BfV0FUQ0hET0cgKwotCQkJCUFQQ0kxNTY0X1RDV19JUlEpOworCQkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19JUlFfUkVHKEFQQ0kxNTY0X0NPVU5URVIzKSk7CiAJCQlvdXRsKDB4MCwKLQkJCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSMSArCi0JCQkJQVBDSTE1NjRfVENXX0lSUSk7Ci0JCQlvdXRsKDB4MCwKLQkJCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSMiArCi0JCQkJQVBDSTE1NjRfVENXX0lSUSk7Ci0JCQlvdXRsKDB4MCwKLQkJCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSMyArCi0JCQkJQVBDSTE1NjRfVENXX0lSUSk7Ci0JCQlvdXRsKDB4MCwKLQkJCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSNCArCi0JCQkJQVBDSTE1NjRfVENXX0lSUSk7Ci0JCX0JCS8qICBpZiAgKGRhdGFbMV09PTEpICovCi0JCWVsc2UgewotCQkJb3V0bCgweDAsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSICsgQVBDSTE1NjRfVENXX1BST0cpOwkvKiBkaXNhYmxlIFRpbWVyIGludGVycnVwdCAqLwotCQl9CQkvKiAgZWxzZSBpZiAgKGRhdGFbMV09PTEpICovCisJCQkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0lSUV9SRUcoQVBDSTE1NjRfQ09VTlRFUjQpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGRpc2FibGUgVGltZXIgaW50ZXJydXB0ICovCisJCQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVJfQ1RSTF9SRUcpOworCQl9CiAKIAkJLyogIExvYWRpbmcgVGltZWJhc2UgKi8KLQotCQlvdXRsKGRhdGFbMl0sCi0JCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUiArCi0JCQlBUENJMTU2NF9UQ1dfVElNRUJBU0UpOworCQlvdXRsKGRhdGFbMl0sIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSX1RJTUVCQVNFX1JFRyk7CiAKIAkJLyogTG9hZGluZyB0aGUgUmVsb2FkIHZhbHVlICovCi0JCW91dGwoZGF0YVszXSwKLQkJCWRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSICsKLQkJCUFQQ0kxNTY0X1RDV19SRUxPQURfVkFMVUUpOworCQlvdXRsKGRhdGFbM10sIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSX1JFTE9BRF9SRUcpOwogCi0JCXVsX0NvbW1hbmQxID0KLQkJCWlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUiArCi0JCQlBUENJMTU2NF9UQ1dfUFJPRyk7Ci0JCXVsX0NvbW1hbmQxID0KLQkJCSh1bF9Db21tYW5kMSAmIDB4RkZGNzE5RTJVTCkgfCAyVUwgPDwgMTNVTCB8IDB4MTBVTDsKLQkJb3V0bCh1bF9Db21tYW5kMSwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKyBBUENJMTU2NF9UQ1dfUFJPRyk7CS8qIG1vZGUgMiAqLwotCX0JCQkvKiAgZWxzZSBpZiAgKGRhdGFbMF09PUFERElEQVRBX1RJTUVSKSAqLwotCWVsc2UgaWYgKGRhdGFbMF0gPT0gQURESURBVEFfQ09VTlRFUikgeworCQl1bF9Db21tYW5kMSA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CisJCXVsX0NvbW1hbmQxID0gKHVsX0NvbW1hbmQxICYgMHhGRkY3MTlFMlVMKSB8IDJVTCA8PCAxM1VMIHwgMHgxMFVMOworCQkvKiBtb2RlIDIgKi8KKwkJb3V0bCh1bF9Db21tYW5kMSwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVJfQ1RSTF9SRUcpOworCX0gZWxzZSBpZiAoZGF0YVswXSA9PSBBRERJREFUQV9DT1VOVEVSKSB7CiAJCWRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID0gQURESURBVEFfQ09VTlRFUjsKIAkJZGV2cHJpdi0+Yl9Nb2RlU2VsZWN0UmVnaXN0ZXIgPSBkYXRhWzVdOwogCiAJCS8qIEZpcnN0IFN0b3AgVGhlIENvdW50ZXIgKi8KLQkJdWxfQ29tbWFuZDEgPQotCQkJaW5sKGRldnByaXYtPmlvYmFzZSArICgoZGF0YVs1XSAtIDEpICogMHgyMCkgKwotCQkJQVBDSTE1NjRfVENXX1BST0cpOworCQl1bF9Db21tYW5kMSA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoZGF0YVs1XSAtIDEpKTsKIAkJdWxfQ29tbWFuZDEgPSB1bF9Db21tYW5kMSAmIDB4RkZGRkY5RkVVTDsKLQkJb3V0bCh1bF9Db21tYW5kMSwgZGV2cHJpdi0+aW9iYXNlICsgKChkYXRhWzVdIC0gMSkgKiAweDIwKSArIEFQQ0kxNTY0X1RDV19QUk9HKTsJLyogU3RvcCBUaGUgVGltZXIgKi8KKwkJLyogU3RvcCBUaGUgVGltZXIgKi8KKwkJb3V0bCh1bF9Db21tYW5kMSwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKGRhdGFbNV0gLSAxKSk7CiAKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFNldCB0aGUgcmVsb2FkIHZhbHVlICovCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqLwotCQlvdXRsKGRhdGFbM10sCi0JCQlkZXZwcml2LT5pb2Jhc2UgKyAoKGRhdGFbNV0gLSAxKSAqIDB4MjApICsKLQkJCUFQQ0kxNTY0X1RDV19SRUxPQURfVkFMVUUpOworCQlvdXRsKGRhdGFbM10sIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19SRUxPQURfUkVHKGRhdGFbNV0gLSAxKSk7CiAKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFNldCB0aGUgbW9kZSA6ICAgICAgICAgICAgICovCiAJCS8qIC0gRGlzYWJsZSB0aGUgaGFyZHdhcmUgICAgICovCiAJCS8qIC0gRGlzYWJsZSB0aGUgY291bnRlciBtb2RlICovCkBAIC00MDYsNjUgKzI4MSwzNiBAQAogCQkvKiAtIERpc2FibGUgdGhlIHJlc2V0ICAgICAgICAqLwogCQkvKiAtIERpc2FibGUgdGhlIHRpbWVyIG1vZGUgICAqLwogCQkvKiAtIEVuYWJsZSB0aGUgY291bnRlciBtb2RlICAqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogCQl1bF9Db21tYW5kMSA9CiAJCQkodWxfQ29tbWFuZDEgJiAweEZGRkMxOUUyVUwpIHwgMHg4MDAwMFVMIHwKIAkJCSh1bnNpZ25lZCBpbnQpICgodW5zaWduZWQgaW50KSBkYXRhWzRdIDw8IDE2VUwpOwotCQlvdXRsKHVsX0NvbW1hbmQxLAotCQkJZGV2cHJpdi0+aW9iYXNlICsgKChkYXRhWzVdIC0gMSkgKiAweDIwKSArCi0JCQlBUENJMTU2NF9UQ1dfUFJPRyk7CisJCW91dGwodWxfQ29tbWFuZDEsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhkYXRhWzVdIC0gMSkpOwogCiAJCS8qICBFbmFibGUgb3IgRGlzYWJsZSBJbnRlcnJ1cHQgKi8KIAkJdWxfQ29tbWFuZDEgPSAodWxfQ29tbWFuZDEgJiAweEZGRkZGOUZEKSB8IChkYXRhWzFdIDw8IDEpOwotCQlvdXRsKHVsX0NvbW1hbmQxLAotCQkJZGV2cHJpdi0+aW9iYXNlICsgKChkYXRhWzVdIC0gMSkgKiAweDIwKSArCi0JCQlBUENJMTU2NF9UQ1dfUFJPRyk7CisJCW91dGwodWxfQ29tbWFuZDEsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhkYXRhWzVdIC0gMSkpOwogCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFNldCB0aGUgVXAvRG93biBzZWxlY3Rpb24gKi8KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJdWxfQ29tbWFuZDEgPSAodWxfQ29tbWFuZDEgJiAweEZGRkJGOUZGVUwpIHwgKGRhdGFbNl0gPDwgMTgpOwotCQlvdXRsKHVsX0NvbW1hbmQxLAotCQkJZGV2cHJpdi0+aW9iYXNlICsgKChkYXRhWzVdIC0gMSkgKiAweDIwKSArCi0JCQlBUENJMTU2NF9UQ1dfUFJPRyk7Ci0JfQkJCS8qICBlbHNlIGlmICAoZGF0YVswXT09QURESURBVEFfQ09VTlRFUikgKi8KLQllbHNlIHsKLQkJcHJpbnRrKCIgSW52YWxpZCBzdWJkZXZpY2UuIik7Ci0JfQkJCS8qICBlbHNlIGlmICAoZGF0YVswXT09QURESURBVEFfV0FUQ0hET0cpICovCisJCW91dGwodWxfQ29tbWFuZDEsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhkYXRhWzVdIC0gMSkpOworCX0gZWxzZSB7CisJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCX0KIAogCXJldHVybiBpbnNuLT5uOwogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTE1NjRfU3RhcnRTdG9wV3JpdGVUaW1lckNvdW50ZXJXYXRjaGRvZyAgICAgIHwKLXwJCQkgIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSkgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBTdGFydCAvIFN0b3AgVGhlIFNlbGVjdGVkIFRpbWVyICwgQ291bnRlciBvciBXYXRjaGRvZyAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA6IERyaXZlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgOiBEYXRhIFBvaW50ZXIgY29udGFpbnMgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcyBiZWxvdyB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkJCSAgZGF0YVswXSAgICAgICAgICAgIDogMCBUaW1lciAgICAgICAgICAgICAgICAgICB8Ci18CQkJCQkJCQkJCSAgIDEgQ291bnRlciAgICAgICAgICAgICAgICAgfAotfAkJCQkJCQkJCQkgICAyIFdhdGNoZG9nICAgICAgICAJCSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CQkJCQkgICAgICAgICBkYXRhWzFdICAgICAgICAgICAgOiAxIFN0YXJ0ICAgICAgICAgICAgICAgICAgIHwKLXwJCQkJCQkJCQkJICAgMCBTdG9wICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIFRyaWdnZXIgICAgICAgICAgICAgCSB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsZWFyIChPbmx5IENvdW50ZXIpICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgaW50IGlfQVBDSTE1NjRfU3RhcnRTdG9wV3JpdGVUaW1lckNvdW50ZXJXYXRjaGRvZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkJCSB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBTdGFydCAvIFN0b3AgVGhlIFNlbGVjdGVkIFRpbWVyLCBDb3VudGVyIG9yIFdhdGNoZG9nCisgKgorICogZGF0YVswXSBDb25maWd1cmUgYXM6IDAgPSBUaW1lciwgMSA9IENvdW50ZXIsIDIgPSBXYXRjaGRvZworICogZGF0YVsxXSAwID0gU3RvcCwgMSA9IFN0YXJ0LCAyID0gVHJpZ2dlciBDbGVhciAoT25seSBDb3VudGVyKQorICovCitzdGF0aWMgaW50IGFwY2kxNTY0X3RpbWVyX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCXVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVuc2lnbmVkIGludCB1bF9Db21tYW5kMSA9IDA7CkBAIC00NzIsMjAzICszMTgsMTIyIEBACiAJaWYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID09IEFERElEQVRBX1dBVENIRE9HKSB7CiAJCXN3aXRjaCAoZGF0YVsxXSkgewogCQljYXNlIDA6CS8qIHN0b3AgdGhlIHdhdGNoZG9nICovCi0JCQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9PUF9XQVRDSERPRyArIEFQQ0kxNTY0X1RDV19QUk9HKTsJLyogZGlzYWJsZSB0aGUgd2F0Y2hkb2cgKi8KKwkJCS8qIGRpc2FibGUgdGhlIHdhdGNoZG9nICovCisJCQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfV0RPR19DVFJMX1JFRyk7CiAJCQlicmVhazsKIAkJY2FzZSAxOgkvKiBzdGFydCB0aGUgd2F0Y2hkb2cgKi8KLQkJCW91dGwoMHgwMDAxLAotCQkJCWRldnByaXYtPmlfSW9iYXNlQW1jYyArCi0JCQkJQVBDSTE1NjRfRElHSVRBTF9PUF9XQVRDSERPRyArCi0JCQkJQVBDSTE1NjRfVENXX1BST0cpOworCQkJb3V0bCgweDAwMDEsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1dET0dfQ1RSTF9SRUcpOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoJLyogU29mdHdhcmUgdHJpZ2dlciAqLwotCQkJb3V0bCgweDAyMDEsCi0JCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsKLQkJCQlBUENJMTU2NF9ESUdJVEFMX09QX1dBVENIRE9HICsKLQkJCQlBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQlvdXRsKDB4MDIwMSwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfV0RPR19DVFJMX1JFRyk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50aygiXG5TcGVjaWZpZWQgZnVuY3Rpb25hbGl0eSBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiU3BlY2lmaWVkIGZ1bmN0aW9uYWxpdHkgZG9lcyBub3QgZXhpc3QuXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwotCQl9CQkvKiAgc3dpdGNoIChkYXRhWzFdKSAqLwotCX0JCQkvKiAgaWYgIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZT09QURESURBVEFfV0FUQ0hET0cpICovCisJCX0KKwl9CiAJaWYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID09IEFERElEQVRBX1RJTUVSKSB7CiAJCWlmIChkYXRhWzFdID09IDEpIHsKLQkJCXVsX0NvbW1hbmQxID0KLQkJCQlpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKwotCQkJCUFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJCXVsX0NvbW1hbmQxID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSX0NUUkxfUkVHKTsKIAkJCXVsX0NvbW1hbmQxID0gKHVsX0NvbW1hbmQxICYgMHhGRkZGRjlGRlVMKSB8IDB4MVVMOwogCiAJCQkvKiBFbmFibGUgdGhlIFRpbWVyICovCi0JCQlvdXRsKHVsX0NvbW1hbmQxLAotCQkJCWRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSICsKLQkJCQlBUENJMTU2NF9UQ1dfUFJPRyk7Ci0JCX0JCS8qICBpZiAgKGRhdGFbMV09PTEpICovCi0JCWVsc2UgaWYgKGRhdGFbMV0gPT0gMCkgeworCQkJb3V0bCh1bF9Db21tYW5kMSwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVJfQ1RSTF9SRUcpOworCQl9IGVsc2UgaWYgKGRhdGFbMV0gPT0gMCkgewogCQkJLyogU3RvcCBUaGUgVGltZXIgKi8KIAotCQkJdWxfQ29tbWFuZDEgPQotCQkJCWlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUiArCi0JCQkJQVBDSTE1NjRfVENXX1BST0cpOworCQkJdWxfQ29tbWFuZDEgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVJfQ1RSTF9SRUcpOwogCQkJdWxfQ29tbWFuZDEgPSB1bF9Db21tYW5kMSAmIDB4RkZGRkY5RkVVTDsKLQkJCW91dGwodWxfQ29tbWFuZDEsCi0JCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKwotCQkJCUFQQ0kxNTY0X1RDV19QUk9HKTsKLQkJfQkJLyogIGVsc2UgaWYoZGF0YVsxXT09MCkgKi8KLQl9CQkJLyogIGlmICAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGU9PUFERElEQVRBX1RJTUVSKSAqLworCQkJb3V0bCh1bF9Db21tYW5kMSwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVJfQ1RSTF9SRUcpOworCQl9CisJfQogCWlmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9PSBBRERJREFUQV9DT1VOVEVSKSB7CiAJCXVsX0NvbW1hbmQxID0KLQkJCWlubChkZXZwcml2LT5pb2Jhc2UgKyAoKGRldnByaXYtPmJfTW9kZVNlbGVjdFJlZ2lzdGVyIC0KLQkJCQkJMSkgKiAweDIwKSArIEFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJCWlubChkZXZwcml2LT5pb2Jhc2UgKworCQkJCUFQQ0kxNTY0X1RDV19DVFJMX1JFRyhkZXZwcml2LT5iX01vZGVTZWxlY3RSZWdpc3RlciAtIDEpKTsKIAkJaWYgKGRhdGFbMV0gPT0gMSkgewogCQkJLyogU3RhcnQgdGhlIENvdW50ZXIgc3ViZGV2aWNlICovCiAJCQl1bF9Db21tYW5kMSA9ICh1bF9Db21tYW5kMSAmIDB4RkZGRkY5RkZVTCkgfCAweDFVTDsKLQkJfQkJLyogIGlmICAoZGF0YVsxXSA9PSAxKSAqLwotCQllbHNlIGlmIChkYXRhWzFdID09IDApIHsKKwkJfSBlbHNlIGlmIChkYXRhWzFdID09IDApIHsKIAkJCS8qICBTdG9wcyB0aGUgQ291bnRlciBzdWJkZXZpY2UgKi8KIAkJCXVsX0NvbW1hbmQxID0gMDsKIAotCQl9CQkvKiAgZWxzZSBpZiAgKGRhdGFbMV0gPT0gMCkgKi8KLQkJZWxzZSBpZiAoZGF0YVsxXSA9PSAyKSB7CisJCX0gZWxzZSBpZiAoZGF0YVsxXSA9PSAyKSB7CiAJCQkvKiAgQ2xlYXJzIHRoZSBDb3VudGVyIHN1YmRldmljZSAqLwogCQkJdWxfQ29tbWFuZDEgPSAodWxfQ29tbWFuZDEgJiAweEZGRkZGOUZGVUwpIHwgMHg0MDA7Ci0JCX0JCS8qICBlbHNlIGlmICAoZGF0YVsxXSA9PSAzKSAqLworCQl9CiAJCW91dGwodWxfQ29tbWFuZDEsCi0JCQlkZXZwcml2LT5pb2Jhc2UgKyAoKGRldnByaXYtPmJfTW9kZVNlbGVjdFJlZ2lzdGVyIC0KLQkJCQkJMSkgKiAweDIwKSArIEFQQ0kxNTY0X1RDV19QUk9HKTsKLQl9CQkJLyogIGlmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZT09QURESURBVEFfQ09VTlRFUikgKi8KKwkJCWRldnByaXYtPmlvYmFzZSArCisJCQlBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoZGV2cHJpdi0+Yl9Nb2RlU2VsZWN0UmVnaXN0ZXIgLSAxKSk7CisJfQogCXJldHVybiBpbnNuLT5uOwogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTE1NjRfUmVhZFRpbWVyQ291bnRlcldhdGNoZG9nICAgICAgICAgICAgICAgIHwKLXwJCQkgIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSkgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBSZWFkIFRoZSBTZWxlY3RlZCBUaW1lciAsIENvdW50ZXIgb3IgV2F0Y2hkb2cgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA6IERyaXZlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgOiBEYXRhIFBvaW50ZXIgY29udGFpbnMgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcyBiZWxvdyB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMTU2NF9SZWFkVGltZXJDb3VudGVyV2F0Y2hkb2coc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQorICogUmVhZCBUaGUgU2VsZWN0ZWQgVGltZXIsIENvdW50ZXIgb3IgV2F0Y2hkb2cKKyAqLworc3RhdGljIGludCBhcGNpMTU2NF90aW1lcl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVuc2lnbmVkIGludCB1bF9Db21tYW5kMSA9IDA7CiAKIAlpZiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPT0gQURESURBVEFfV0FUQ0hET0cpIHsKIAkJLyogIFN0b3JlcyB0aGUgc3RhdHVzIG9mIHRoZSBXYXRjaGRvZyAqLwotCQlkYXRhWzBdID0KLQkJCWlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKwotCQkJQVBDSTE1NjRfRElHSVRBTF9PUF9XQVRDSERPRyArCi0JCQlBUENJMTU2NF9UQ1dfVFJJR19TVEFUVVMpICYgMHgxOwotCQlkYXRhWzFdID0KLQkJCWlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKwotCQkJQVBDSTE1NjRfRElHSVRBTF9PUF9XQVRDSERPRyk7Ci0JfQkJCS8qICBpZiAgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlPT1BRERJREFUQV9XQVRDSERPRykgKi8KLQllbHNlIGlmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9PSBBRERJREFUQV9USU1FUikgeworCQlkYXRhWzBdID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1dET0dfU1RBVFVTX1JFRykgJiAweDE7CisJCWRhdGFbMV0gPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfV0RPR19SRUcpOworCX0gZWxzZSBpZiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPT0gQURESURBVEFfVElNRVIpIHsKIAkJLyogIFN0b3JlcyB0aGUgc3RhdHVzIG9mIHRoZSBUaW1lciAqLwotCQlkYXRhWzBdID0KLQkJCWlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUiArCi0JCQlBUENJMTU2NF9UQ1dfVFJJR19TVEFUVVMpICYgMHgxOworCQlkYXRhWzBdID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSX1NUQVRVU19SRUcpICYgMHgxOwogCiAJCS8qICBTdG9yZXMgdGhlIEFjdHVhbCB2YWx1ZSBvZiB0aGUgVGltZXIgKi8KLQkJZGF0YVsxXSA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUik7Ci0JfQkJCS8qICBlbHNlIGlmICAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGU9PUFERElEQVRBX1RJTUVSKSAqLwotCWVsc2UgaWYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID09IEFERElEQVRBX0NPVU5URVIpIHsKKwkJZGF0YVsxXSA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9SRUcpOworCX0gZWxzZSBpZiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPT0gQURESURBVEFfQ09VTlRFUikgewogCQkvKiAgUmVhZCB0aGUgQ291bnRlciBBY3R1YWwgVmFsdWUuICovCiAJCWRhdGFbMF0gPQotCQkJaW5sKGRldnByaXYtPmlvYmFzZSArICgoZGV2cHJpdi0+Yl9Nb2RlU2VsZWN0UmVnaXN0ZXIgLQotCQkJCQkxKSAqIDB4MjApICsKLQkJCUFQQ0kxNTY0X1RDV19TWU5DX0VOQUJMRURJU0FCTEUpOworCQkJaW5sKGRldnByaXYtPmlvYmFzZSArCisJCQkJQVBDSTE1NjRfVENXX1JFRyhkZXZwcml2LT5iX01vZGVTZWxlY3RSZWdpc3RlciAtIDEpKTsKIAkJdWxfQ29tbWFuZDEgPQotCQkJaW5sKGRldnByaXYtPmlvYmFzZSArICgoZGV2cHJpdi0+Yl9Nb2RlU2VsZWN0UmVnaXN0ZXIgLQotCQkJCQkxKSAqIDB4MjApICsgQVBDSTE1NjRfVENXX1RSSUdfU1RBVFVTKTsKKwkJCWlubChkZXZwcml2LT5pb2Jhc2UgKworCQkJCUFQQ0kxNTY0X1RDV19TVEFUVVNfUkVHKGRldnByaXYtPmJfTW9kZVNlbGVjdFJlZ2lzdGVyIC0gMSkpOwogCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIEdldCB0aGUgc29mdHdhcmUgdHJpZ2dlciBzdGF0dXMgKi8KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJZGF0YVsxXSA9ICh1bnNpZ25lZCBjaGFyKSAoKHVsX0NvbW1hbmQxID4+IDEpICYgMSk7CiAKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogR2V0IHRoZSBoYXJkd2FyZSB0cmlnZ2VyIHN0YXR1cyAqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlkYXRhWzJdID0gKHVuc2lnbmVkIGNoYXIpICgodWxfQ29tbWFuZDEgPj4gMikgJiAxKTsKIAotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogR2V0IHRoZSBzb2Z0d2FyZSBjbGVhciBzdGF0dXMgKi8KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCWRhdGFbM10gPSAodW5zaWduZWQgY2hhcikgKCh1bF9Db21tYW5kMSA+PiAzKSAmIDEpOwogCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBHZXQgdGhlIG92ZXJmbG93IHN0YXR1cyAqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJZGF0YVs0XSA9ICh1bnNpZ25lZCBjaGFyKSAoKHVsX0NvbW1hbmQxID4+IDApICYgMSk7Ci0JfQkJCS8qICBlbHNlICBpZiAgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlPT1BRERJREFUQV9DT1VOVEVSKSAqLwotCWVsc2UgaWYgKChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSAhPSBBRERJREFUQV9USU1FUikKKwl9IGVsc2UgaWYgKChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSAhPSBBRERJREFUQV9USU1FUikKIAkJJiYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlICE9IEFERElEQVRBX1dBVENIRE9HKQogCQkmJiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgIT0gQURESURBVEFfQ09VTlRFUikpIHsKLQkJcHJpbnRrKCJcbiBJbnZhbGlkIFN1YmRldmljZSAhISFcbiIpOwotCX0JCQkvKiAgZWxzZSBpZiAoKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlIT1BRERJREFUQV9USU1FUikgJiYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlIT1BRERJREFUQV9XQVRDSERPRykmJiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUhPUFERElEQVRBX0NPVU5URVIpKSAqLworCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiSW52YWxpZCBTdWJkZXZpY2UhXG4iKTsKKwl9CiAJcmV0dXJuIGluc24tPm47CiB9CiAKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiAgaW50IGlfQVBDSTE1NjRfUmVhZEludGVycnVwdFN0YXR1cyAgICAgICAgICAgICAgICAgICAgfAotfAkJCSAgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6UmVhZHMgdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotCi1zdGF0aWMgaW50IGlfQVBDSTE1NjRfUmVhZEludGVycnVwdFN0YXR1cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJICB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBSZWFkcyB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcgorICovCitzdGF0aWMgaW50IGFwY2kxNTY0X2RvX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCSpkYXRhID0gdWlfVHlwZTsKIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IHN0YXRpYyB2b2lkIHZfQVBDSTE1NjRfSW50ZXJydXB0CQkJCQkgICAgIHwKLXwJCQkJCSAgKGludCBpcnEgLCB2b2lkICpkKSAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IEludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgaW50ZXJydXB0aWJsZSBkaWdpdGFsIGlucHV0cyB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBpbnQgaXJxICAgICAgICAgICAgICAgICA6IGlycSBudW1iZXIgICAgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmQgICAgICAgICAgICAgICAgIDogdm9pZCBwb2ludGVyICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIHZvaWQgdl9BUENJMTU2NF9JbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKKyAqIEludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgaW50ZXJydXB0aWJsZSBkaWdpdGFsIGlucHV0cworICovCitzdGF0aWMgdm9pZCBhcGNpMTU2NF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKIHsKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwpAQCAtNjc3LDc5ICs0NDIsNjMgQEAKIAl1bnNpZ25lZCBpbnQgdWlfQzEsIHVpX0MyLCB1aV9DMywgdWlfQzQ7CiAJdW5zaWduZWQgaW50IHVsX0NvbW1hbmQyID0gMDsKIAotCXVpX0RJID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfSVAgKwotCQlBUENJMTU2NF9ESUdJVEFMX0lQX0lSUSkgJiAweDAxOwotCXVpX0RPID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfT1AgKwotCQlBUENJMTU2NF9ESUdJVEFMX09QX0lSUSkgJiAweDAxOwotCXVpX1RpbWVyID0KLQkJaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSICsKLQkJQVBDSTE1NjRfVENXX0lSUSkgJiAweDAxOwotCXVpX0MxID0gaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIxICsKLQkJQVBDSTE1NjRfVENXX0lSUSkgJiAweDE7Ci0JdWlfQzIgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjIgKwotCQlBUENJMTU2NF9UQ1dfSVJRKSAmIDB4MTsKLQl1aV9DMyA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSMyArCi0JCUFQQ0kxNTY0X1RDV19JUlEpICYgMHgxOwotCXVpX0M0ID0gaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVI0ICsKLQkJQVBDSTE1NjRfVENXX0lSUSkgJiAweDE7CisJdWlfREkgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSVJRX1JFRykgJiAweDAxOworCXVpX0RPID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RPX0lSUV9SRUcpICYgMHgwMTsKKwl1aV9UaW1lciA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9JUlFfUkVHKSAmIDB4MDE7CisJdWlfQzEgPQorCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0lSUV9SRUcoQVBDSTE1NjRfQ09VTlRFUjEpKSAmIDB4MTsKKwl1aV9DMiA9CisJCWlubChkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfSVJRX1JFRyhBUENJMTU2NF9DT1VOVEVSMikpICYgMHgxOworCXVpX0MzID0KKwkJaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19JUlFfUkVHKEFQQ0kxNTY0X0NPVU5URVIzKSkgJiAweDE7CisJdWlfQzQgPQorCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0lSUV9SRUcoQVBDSTE1NjRfQ09VTlRFUjQpKSAmIDB4MTsKIAlpZiAodWlfREkgPT0gMCAmJiB1aV9ETyA9PSAwICYmIHVpX1RpbWVyID09IDAgJiYgdWlfQzEgPT0gMAogCQkmJiB1aV9DMiA9PSAwICYmIHVpX0MzID09IDAgJiYgdWlfQzQgPT0gMCkgewotCQlwcmludGsoIlxuSW50ZXJydXB0IGZyb20gdW5rbm93biBzb3VyY2VcbiIpOwotCX0JCQkvKiAgaWYodWlfREk9PTAgJiYgdWlfRE89PTAgJiYgdWlfVGltZXI9PTAgJiYgdWlfQzE9PTAgJiYgdWlfQzI9PTAgJiYgdWlfQzM9PTAgJiYgdWlfQzQ9PTApICovCisJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJJbnRlcnJ1cHQgZnJvbSB1bmtub3duIHNvdXJjZS5cbiIpOworCX0KIAogCWlmICh1aV9ESSA9PSAxKSB7Ci0JCXVpX0RJID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfSVAgKwotCQkJQVBDSTE1NjRfRElHSVRBTF9JUF9JUlEpOwotCQlvdXRsKDB4MCwKLQkJCWRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfSVAgKwotCQkJQVBDSTE1NjRfRElHSVRBTF9JUF9JUlEpOworCQl1aV9ESSA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JUlFfUkVHKTsKKwkJb3V0bCgweDAsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJX0lSUV9SRUcpOwogCQl1aV9JbnRlcnJ1cHRTdGF0dXNfMTU2NCA9Ci0JCQlpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCArCi0JCQlBUENJMTU2NF9ESUdJVEFMX0lQX0lOVEVSUlVQVF9TVEFUVVMpOworCQkJaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJX0lOVF9TVEFUVVNfUkVHKTsKIAkJdWlfSW50ZXJydXB0U3RhdHVzXzE1NjQgPSB1aV9JbnRlcnJ1cHRTdGF0dXNfMTU2NCAmIDBYMDAwRkZGRjA7Ci0JCXNlbmRfc2lnKFNJR0lPLCBkZXZwcml2LT50c2tfQ3VycmVudCwgMCk7CS8qICBzZW5kIHNpZ25hbCB0byB0aGUgc2FtcGxlICovCi0JCW91dGwodWlfREksIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfSVAgKyBBUENJMTU2NF9ESUdJVEFMX0lQX0lSUSk7CS8qIGVuYWJsZSB0aGUgaW50ZXJydXB0ICovCisJCS8qIHNlbmQgc2lnbmFsIHRvIHRoZSBzYW1wbGUgKi8KKwkJc2VuZF9zaWcoU0lHSU8sIGRldnByaXYtPnRza19DdXJyZW50LCAwKTsKKwkJLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHQgKi8KKwkJb3V0bCh1aV9ESSwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSVJRX1JFRyk7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAodWlfRE8gPT0gMSkgewotCQkvKiAgQ2hlY2sgZm9yIERpZ2l0YWwgT3V0cHV0IGludGVycnVwdCBUeXBlIC0gMTogVmNjIGludGVycnVwdCAyOiBDQyBpbnRlcnJ1cHQuICovCi0JCXVpX1R5cGUgPQotCQkJaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfT1AgKwotCQkJQVBDSTE1NjRfRElHSVRBTF9PUF9JTlRFUlJVUFRfU1RBVFVTKSAmIDB4MzsKKwkJLyogQ2hlY2sgZm9yIERpZ2l0YWwgT3V0cHV0IGludGVycnVwdCBUeXBlICovCisJCS8qIDE6IFZDQyBpbnRlcnJ1cHQJCQkgICAqLworCQkvKiAyOiBDQyBpbnRlcnJ1cHQJCQkgICAqLworCQl1aV9UeXBlID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RPX0lOVF9TVEFUVVNfUkVHKSAmIDB4MzsKIAkJLyogRGlzYWJsZSB0aGUgIEludGVycnVwdCAqLwotCQlvdXRsKDB4MCwKLQkJCWRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfT1AgKwotCQkJQVBDSTE1NjRfRElHSVRBTF9PUF9JTlRFUlJVUFQpOworCQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRE9fSU5UX0NUUkxfUkVHKTsKIAogCQkvKiBTZW5kcyBzaWduYWwgdG8gdXNlciBzcGFjZSAqLwogCQlzZW5kX3NpZyhTSUdJTywgZGV2cHJpdi0+dHNrX0N1cnJlbnQsIDApOwotCi0JfQkJCS8qICBpZiAgKHVpX0RPKSAqLworCX0KIAogCWlmICh1aV9UaW1lciA9PSAxKSB7CiAJCWRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID0gQURESURBVEFfVElNRVI7CiAJCWlmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSkgewogCiAJCQkvKiAgRGlzYWJsZSBUaW1lciBJbnRlcnJ1cHQgKi8KLQkJCXVsX0NvbW1hbmQyID0KLQkJCQlpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKwotCQkJCSAgICBBUENJMTU2NF9UQ1dfUFJPRyk7Ci0JCQlvdXRsKDB4MCwKLQkJCSAgICAgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKwotCQkJICAgICBBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQl1bF9Db21tYW5kMiA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CisJCQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVJfQ1RSTF9SRUcpOwogCiAJCQkvKiBTZW5kIGEgc2lnbmFsIHRvIGZyb20ga2VybmVsIHRvIHVzZXIgc3BhY2UgKi8KIAkJCXNlbmRfc2lnKFNJR0lPLCBkZXZwcml2LT50c2tfQ3VycmVudCwgMCk7CiAKIAkJCS8qICBFbmFibGUgVGltZXIgSW50ZXJydXB0ICovCiAKLQkJCW91dGwodWxfQ29tbWFuZDIsCi0JCQkgICAgIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSICsKLQkJCSAgICAgQVBDSTE1NjRfVENXX1BST0cpOworCQkJb3V0bCh1bF9Db21tYW5kMiwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVJfQ1RSTF9SRUcpOwogCQl9Ci0JfS8qIGlmICAodWlfVGltZXIgPT0gMSkgKi8KLQorCX0KIAogCWlmICh1aV9DMSA9PSAxKSB7CiAJCWRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID0gQURESURBVEFfQ09VTlRFUjsKQEAgLTc1NywyMSArNTA2LDE4IEBACiAKIAkJCS8qICBEaXNhYmxlIENvdW50ZXIgSW50ZXJydXB0ICovCiAJCQl1bF9Db21tYW5kMiA9Ci0JCQkJaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIxICsKLQkJCQkgICAgQVBDSTE1NjRfVENXX1BST0cpOworCQkJCWlubChkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoQVBDSTE1NjRfQ09VTlRFUjEpKTsKIAkJCW91dGwoMHgwLAotCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSMSArCi0JCQkgICAgIEFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJCSAgICAgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKEFQQ0kxNTY0X0NPVU5URVIxKSk7CiAKIAkJCS8qIFNlbmQgYSBzaWduYWwgdG8gZnJvbSBrZXJuZWwgdG8gdXNlciBzcGFjZSAqLwogCQkJc2VuZF9zaWcoU0lHSU8sIGRldnByaXYtPnRza19DdXJyZW50LCAwKTsKIAogCQkJLyogIEVuYWJsZSBDb3VudGVyIEludGVycnVwdCAqLwogCQkJb3V0bCh1bF9Db21tYW5kMiwKLQkJCSAgICAgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjEgKwotCQkJICAgICBBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQkgICAgIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhBUENJMTU2NF9DT1VOVEVSMSkpOwogCQl9Ci0JfSAvKiBpZiAgKHVpX0MxID09IDEpICovCisJfQogCiAJaWYgKHVpX0MyID09IDEpIHsKIAkJZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPSBBRERJREFUQV9DT1VOVEVSOwpAQCAtNzc5LDIxICs1MjUsMTggQEAKIAogCQkJLyogIERpc2FibGUgQ291bnRlciBJbnRlcnJ1cHQgKi8KIAkJCXVsX0NvbW1hbmQyID0KLQkJCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjIgKwotCQkJCSAgICBBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQkJaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhBUENJMTU2NF9DT1VOVEVSMikpOwogCQkJb3V0bCgweDAsCi0JCQkgICAgIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIyICsKLQkJCSAgICAgQVBDSTE1NjRfVENXX1BST0cpOworCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoQVBDSTE1NjRfQ09VTlRFUjIpKTsKIAogCQkJLyogU2VuZCBhIHNpZ25hbCB0byBmcm9tIGtlcm5lbCB0byB1c2VyIHNwYWNlICovCiAJCQlzZW5kX3NpZyhTSUdJTywgZGV2cHJpdi0+dHNrX0N1cnJlbnQsIDApOwogCiAJCQkvKiAgRW5hYmxlIENvdW50ZXIgSW50ZXJydXB0ICovCiAJCQlvdXRsKHVsX0NvbW1hbmQyLAotCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSMiArCi0JCQkgICAgIEFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJCSAgICAgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKEFQQ0kxNTY0X0NPVU5URVIyKSk7CiAJCX0KLQl9IC8qICBpZiAgKCh1aV9DMiA9PSAxKSAqLworCX0KIAogCWlmICh1aV9DMyA9PSAxKSB7CiAJCWRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID0gQURESURBVEFfQ09VTlRFUjsKQEAgLTgwMSwyMSArNTQ0LDE4IEBACiAKIAkJCS8qICBEaXNhYmxlIENvdW50ZXIgSW50ZXJydXB0ICovCiAJCQl1bF9Db21tYW5kMiA9Ci0JCQkJaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIzICsKLQkJCQkgICAgQVBDSTE1NjRfVENXX1BST0cpOworCQkJCWlubChkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoQVBDSTE1NjRfQ09VTlRFUjMpKTsKIAkJCW91dGwoMHgwLAotCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSMyArCi0JCQkgICAgIEFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJCSAgICAgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKEFQQ0kxNTY0X0NPVU5URVIzKSk7CiAKIAkJCS8qIFNlbmQgYSBzaWduYWwgdG8gZnJvbSBrZXJuZWwgdG8gdXNlciBzcGFjZSAqLwogCQkJc2VuZF9zaWcoU0lHSU8sIGRldnByaXYtPnRza19DdXJyZW50LCAwKTsKIAogCQkJLyogIEVuYWJsZSBDb3VudGVyIEludGVycnVwdCAqLwogCQkJb3V0bCh1bF9Db21tYW5kMiwKLQkJCSAgICAgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjMgKwotCQkJICAgICBBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQkgICAgIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhBUENJMTU2NF9DT1VOVEVSMykpOwogCQl9Ci0JfQkvKiAgaWYgKCh1aV9DMyA9PSAxKSAqLworCX0KIAogCWlmICh1aV9DNCA9PSAxKSB7CiAJCWRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID0gQURESURBVEFfQ09VTlRFUjsKQEAgLTgyMyw2MCArNTYzLDQ1IEBACiAKIAkJCS8qICBEaXNhYmxlIENvdW50ZXIgSW50ZXJydXB0ICovCiAJCQl1bF9Db21tYW5kMiA9Ci0JCQkJaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVI0ICsKLQkJCQkgICAgQVBDSTE1NjRfVENXX1BST0cpOworCQkJCWlubChkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoQVBDSTE1NjRfQ09VTlRFUjQpKTsKIAkJCW91dGwoMHgwLAotCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSNCArCi0JCQkgICAgIEFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJCSAgICAgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKEFQQ0kxNTY0X0NPVU5URVI0KSk7CiAKIAkJCS8qIFNlbmQgYSBzaWduYWwgdG8gZnJvbSBrZXJuZWwgdG8gdXNlciBzcGFjZSAqLwogCQkJc2VuZF9zaWcoU0lHSU8sIGRldnByaXYtPnRza19DdXJyZW50LCAwKTsKIAogCQkJLyogIEVuYWJsZSBDb3VudGVyIEludGVycnVwdCAqLwogCQkJb3V0bCh1bF9Db21tYW5kMiwKLQkJCSAgICAgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjQgKwotCQkJICAgICBBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQkgICAgIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhBUENJMTU2NF9DT1VOVEVSNCkpOwogCQl9Ci0JfQkvKiAgaWYgKHVpX0M0ID09IDEpICovCisJfQogCXJldHVybjsKIH0KIAotLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCBpX0FQQ0kxNTY0X1Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOnJlc2V0cyBhbGwgdGhlIHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotCi1zdGF0aWMgaW50IGlfQVBDSTE1NjRfUmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgYXBjaTE1NjRfcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCi0Jb3V0bCgweDAsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSVJRKTsJLyogZGlzYWJsZSB0aGUgaW50ZXJydXB0cyAqLwotCWlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX0lQX0lOVEVSUlVQVF9TVEFUVVMpOwkvKiBSZXNldCB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLwotCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX0lQX0lOVEVSUlVQVF9NT0RFMSk7CS8qIERpc2FibGUgdGhlIGFuZC9vciBpbnRlcnJ1cHQgKi8KLQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUF9JTlRFUlJVUFRfTU9ERTIpOworCS8qIGRpc2FibGUgdGhlIGludGVycnVwdHMgKi8KKwlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSVJRX1JFRyk7CisJLyogUmVzZXQgdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKwlpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSU5UX1NUQVRVU19SRUcpOworCS8qIERpc2FibGUgdGhlIGFuZC9vciBpbnRlcnJ1cHQgKi8KKwlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSU5UX01PREUxX1JFRyk7CisJb3V0bCgweDAsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJX0lOVF9NT0RFMl9SRUcpOwogCWRldnByaXYtPmJfRGlnaXRhbE91dHB1dFJlZ2lzdGVyID0gMDsKIAl1aV9UeXBlID0gMDsKLQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9PUCk7CS8qIFJlc2V0cyB0aGUgb3V0cHV0IGNoYW5uZWxzICovCi0Jb3V0bCgweDAsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfT1BfSU5URVJSVVBUKTsJLyogRGlzYWJsZXMgdGhlIGludGVycnVwdC4gKi8KLQlvdXRsKDB4MCwKLQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9PUF9XQVRDSERPRyArCi0JCUFQQ0kxNTY0X1RDV19SRUxPQURfVkFMVUUpOwotCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUik7Ci0Jb3V0bCgweDAsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSICsgQVBDSTE1NjRfVENXX1BST0cpOworCS8qIFJlc2V0cyB0aGUgb3V0cHV0IGNoYW5uZWxzICovCisJb3V0bCgweDAsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RPX1JFRyk7CisJLyogRGlzYWJsZXMgdGhlIGludGVycnVwdC4gKi8KKwlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRE9fSU5UX0NUUkxfUkVHKTsKKwlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfV0RPR19SRUxPQURfUkVHKTsKKwlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVJfUkVHKTsKKwlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVJfQ1RSTF9SRUcpOwogCi0Jb3V0bCgweDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIxICsgQVBDSTE1NjRfVENXX1BST0cpOwotCW91dGwoMHgwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSMiArIEFQQ0kxNTY0X1RDV19QUk9HKTsKLQlvdXRsKDB4MCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjMgKyBBUENJMTU2NF9UQ1dfUFJPRyk7Ci0Jb3V0bCgweDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVI0ICsgQVBDSTE1NjRfVENXX1BST0cpOworCW91dGwoMHgwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoQVBDSTE1NjRfQ09VTlRFUjEpKTsKKwlvdXRsKDB4MCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKEFQQ0kxNTY0X0NPVU5URVIyKSk7CisJb3V0bCgweDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhBUENJMTU2NF9DT1VOVEVSMykpOworCW91dGwoMHgwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoQVBDSTE1NjRfQ09VTlRFUjQpKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMxMjAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMxMjAuYwppbmRleCBiZDA1ODU3Li43MGU4ZjQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMTIwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzEyMC5jCkBAIC0yNDgsMTAgKzI0OCwxMCBAQAogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAqLwogCi1zdGF0aWMgaW50IGlfQVBDSTMxMjBfSW5zbkNvbmZpZ0FuYWxvZ0lucHV0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyBpbnQgYXBjaTMxMjBfYWlfaW5zbl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCWNvbnN0IHN0cnVjdCBhZGRpX2JvYXJkICp0aGlzX2JvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKQEAgLTMwNCwxMSArMzA0LDExIEBACiAgKiBJZiB0aGUgbGFzdCBhcmd1bWVudCBvZiBmdW5jdGlvbiAiY2hlY2siaXMgMSB0aGVuIGl0IG9ubHkgY2hlY2tzCiAgKiB0aGUgY2hhbm5lbCBsaXN0IGlzIG9rIG9yIG5vdC4KICAqLwotc3RhdGljIGludCBpX0FQQ0kzMTIwX1NldHVwQ2hhbm5lbExpc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJICAgICAgIGludCBuX2NoYW4sCi0JCQkJICAgICAgIHVuc2lnbmVkIGludCAqY2hhbmxpc3QsCi0JCQkJICAgICAgIGNoYXIgY2hlY2spCitzdGF0aWMgaW50IGFwY2kzMTIwX3NldHVwX2NoYW5fbGlzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICAgaW50IG5fY2hhbiwKKwkJCQkgICAgdW5zaWduZWQgaW50ICpjaGFubGlzdCwKKwkJCQkgICAgY2hhciBjaGVjaykKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVuc2lnbmVkIGludCBpOwkJLyogLCBkaWZmZXJlbmNpYWw9MCwgYmlwb2xhcj0wOyAqLwpAQCAtMzU4LDEwICszNTgsMTAgQEAKICAqIGFzIHBlciBjb25maWd1cmVkIGlmIG5vIGNvbnZlcnNpb24gdGltZSBpcyBzZXQgdXNlcyBkZWZhdWx0CiAgKiBjb252ZXJzaW9uIHRpbWUgMTAgbWljcm9zZWMuCiAgKi8KLXN0YXRpYyBpbnQgaV9BUENJMzEyMF9JbnNuUmVhZEFuYWxvZ0lucHV0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkgIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyBpbnQgYXBjaTMxMjBfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAljb25zdCBzdHJ1Y3QgYWRkaV9ib2FyZCAqdGhpc19ib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CkBAIC00MTcsMTAgKzQxNyw3IEBACiAJCQlpbncoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTMxMjBfUkVTRVRfRklGTyk7CiAKIAkJCS8qICBJbml0aWFsaXplIHRoZSBzZXF1ZW5jZSBhcnJheSAqLwotCi0JCQkvKiBpZiAoIWlfQVBDSTMxMjBfU2V0dXBDaGFubmVsTGlzdChkZXYscywxLGNoYW5saXN0LDApKSAgcmV0dXJuIC1FSU5WQUw7ICovCi0KLQkJCWlmICghaV9BUENJMzEyMF9TZXR1cENoYW5uZWxMaXN0KGRldiwgcywgMSwKKwkJCWlmICghYXBjaTMxMjBfc2V0dXBfY2hhbl9saXN0KGRldiwgcywgMSwKIAkJCQkJJmluc24tPmNoYW5zcGVjLCAwKSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNTEyLDcgKzUwOSw3IEBACiAJCQlvdXR3KGRldnByaXYtPnVzX091dHB1dFJlZ2lzdGVyLAogCQkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kzMTIwX1dSX0FERFJFU1MpOwogCi0JCQlpZiAoIWlfQVBDSTMxMjBfU2V0dXBDaGFubmVsTGlzdChkZXYsIHMsCisJCQlpZiAoIWFwY2kzMTIwX3NldHVwX2NoYW5fbGlzdChkZXYsIHMsCiAJCQkJCWRldnByaXYtPnVpX0FpTmJyb2ZDaGFubmVscywKIAkJCQkJZGV2cHJpdi0+dWlfQWlDaGFubmVsTGlzdCwgMCkpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC02MDYsNyArNjAzLDcgQEAKIAogfQogCi1zdGF0aWMgaW50IGlfQVBDSTMxMjBfUmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgYXBjaTMxMjBfcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVuc2lnbmVkIGludCBpOwpAQCAtNjYzLDcgKzY2MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaV9BUENJMzEyMF9FeHR0cmlnRW5hYmxlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGFwY2kzMTIwX2V4dHRyaWdfZW5hYmxlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIApAQCAtNjcyLDcgKzY2OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaV9BUENJMzEyMF9FeHR0cmlnRGlzYWJsZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQorc3RhdGljIGludCBhcGNpMzEyMF9leHR0cmlnX2Rpc2FibGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCkBAIC02ODEsOCArNjc4LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpX0FQQ0kzMTIwX1N0b3BDeWNsaWNBY3F1aXNpdGlvbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCitzdGF0aWMgaW50IGFwY2kzMTIwX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIApAQCAtNzA1LDcgKzcwMiw3IEBACiAJICogZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjK0FNQ0NfT1BfUkVHX01DU1IpOyAgc3RvcCBETUEgKi8KIAogCS8qIERpc2FibGUgZXh0IHRyaWdnZXIgKi8KLQlpX0FQQ0kzMTIwX0V4dHRyaWdEaXNhYmxlKGRldik7CisJYXBjaTMxMjBfZXh0dHJpZ19kaXNhYmxlKGRldik7CiAKIAlkZXZwcml2LT51c19PdXRwdXRSZWdpc3RlciA9IDA7CiAJLyogc3RvcCAgY291bnRlcnMgKi8KQEAgLTcyOSwxMyArNzI2LDEzIEBACiAJZGV2cHJpdi0+Yl9BaUN5Y2xpY0FjcXVpc2l0aW9uID0gQVBDSTMxMjBfRElTQUJMRTsKIAlkZXZwcml2LT5iX0ludGVycnVwdE1vZGUgPSBBUENJMzEyMF9FT0NfTU9ERTsKIAlkZXZwcml2LT5iX0VvY0Vvc0ludGVycnVwdCA9IEFQQ0kzMTIwX0RJU0FCTEU7Ci0JaV9BUENJMzEyMF9SZXNldChkZXYpOworCWFwY2kzMTIwX3Jlc2V0KGRldik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaV9BUENJMzEyMF9Db21tYW5kVGVzdEFuYWxvZ0lucHV0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCSAgICAgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKK3N0YXRpYyBpbnQgYXBjaTMxMjBfYWlfY21kdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7CiAJY29uc3Qgc3RydWN0IGFkZGlfYm9hcmQgKnRoaXNfYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKIAlpbnQgZXJyID0gMDsKQEAgLTgxOCw5ICs4MTUsOSBAQAogICogSWYgRE1BIGlzIGNvbmZpZ3VyZWQgZG9lcyBETUEgaW5pdGlhbGl6YXRpb24gb3RoZXJ3aXNlIGRvZXMgdGhlCiAgKiBhY3F1aXNpdGlvbiB3aXRoIEVPUyBpbnRlcnJ1cHQuCiAgKi8KLXN0YXRpYyBpbnQgaV9BUENJMzEyMF9DeWNsaWNBbmFsb2dJbnB1dChpbnQgbW9kZSwKLQkJCQkJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCitzdGF0aWMgaW50IGFwY2kzMTIwX2N5Y2xpY19haShpbnQgbW9kZSwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAljb25zdCBzdHJ1Y3QgYWRkaV9ib2FyZCAqdGhpc19ib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CkBAIC05MDQsNyArOTAxLDcgQEAKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIEluaXRpYWxpemVzIHRoZSBzZXF1ZW5jZSBhcnJheSAqLwogICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JaWYgKCFpX0FQQ0kzMTIwX1NldHVwQ2hhbm5lbExpc3QoZGV2LCBzLCBkZXZwcml2LT51aV9BaU5icm9mQ2hhbm5lbHMsCisJaWYgKCFhcGNpMzEyMF9zZXR1cF9jaGFuX2xpc3QoZGV2LCBzLCBkZXZwcml2LT51aV9BaU5icm9mQ2hhbm5lbHMsCiAJCQlkZXZwcml2LT5wdWlfQWlDaGFubmVsTGlzdCwgMCkpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC05NTcsNyArOTU0LDcgQEAKIC8qKiogRUwyNDEwMDMgRW5kICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCWlmIChkZXZwcml2LT5iX0V4dHRyaWdFbmFibGUgPT0gQVBDSTMxMjBfRU5BQkxFKQotCQlpX0FQQ0kzMTIwX0V4dHRyaWdFbmFibGUoZGV2KTsJLyogIGFjdGl2YXRlIEVYVCB0cmlnZ2VyICovCisJCWFwY2kzMTIwX2V4dHRyaWdfZW5hYmxlKGRldik7CS8qICBhY3RpdmF0ZSBFWFQgdHJpZ2dlciAqLwogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgMToKIAkJLyogIGluaXQgdGltZXIwIGluIG1vZGUgMiAqLwpAQCAtMTMzMyw4ICsxMzMwLDggQEAKICAqIERvZXMgYXN5bmNocm9ub3VzIGFjcXVpc2l0aW9uLgogICogRGV0ZXJtaW5lcyB0aGUgbW9kZSAxIG9yIDIuCiAgKi8KLXN0YXRpYyBpbnQgaV9BUENJMzEyMF9Db21tYW5kQW5hbG9nSW5wdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQorc3RhdGljIGludCBhcGNpMzEyMF9haV9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOwpAQCAtMTM3MSw3ICsxMzY4LDcgQEAKIAogCQkJZGV2cHJpdi0+dWlfQWlUaW1lcjAgPSBjbWQtPmNvbnZlcnRfYXJnOwkvKiAgdGltZXIgY29uc3RhbnQgaW4gbmFubyBzZWNvbmRzICovCiAJCQkvKiByZXR1cm4gdGhpc19ib2FyZC0+YWlfY21kKDEsZGV2LHMpOyAqLwotCQkJcmV0dXJuIGlfQVBDSTMxMjBfQ3ljbGljQW5hbG9nSW5wdXQoMSwgZGV2LCBzKTsKKwkJCXJldHVybiBhcGNpMzEyMF9jeWNsaWNfYWkoMSwgZGV2LCBzKTsKIAkJfQogCiAJfQpAQCAtMTM4MSw3ICsxMzc4LDcgQEAKIAkJZGV2cHJpdi0+dWlfQWlUaW1lcjEgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOwogCQlkZXZwcml2LT51aV9BaVRpbWVyMCA9IGNtZC0+Y29udmVydF9hcmc7CS8qICB2YXJpYWJsZSBjaGFuZ2VkIHRpbWVyMiB0byB0aW1lcjAgKi8KIAkJLyogcmV0dXJuIHRoaXNfYm9hcmQtPmFpX2NtZCgyLGRldixzKTsgKi8KLQkJcmV0dXJuIGlfQVBDSTMxMjBfQ3ljbGljQW5hbG9nSW5wdXQoMiwgZGV2LCBzKTsKKwkJcmV0dXJuIGFwY2kzMTIwX2N5Y2xpY19haSgyLCBkZXYsIHMpOwogCX0KIAlyZXR1cm4gLTE7CiB9CkBAIC0xNDEwLDcgKzE0MDcsNyBAQAogICogRm9yIGNvbnRpbnVvdXMgRE1BIGl0IHJlaW5pdGlhbGl6ZXMgdGhlIERNQSBvcGVyYXRpb24uCiAgKiBGb3Igc2luZ2xlIG1vZGUgRE1BIGl0IHN0b3AgdGhlIGFjcXVpc2l0aW9uLgogICovCi1zdGF0aWMgdm9pZCB2X0FQQ0kzMTIwX0ludGVycnVwdERtYShpbnQgaXJxLCB2b2lkICpkKQorc3RhdGljIHZvaWQgYXBjaTMxMjBfaW50ZXJydXB0X2RtYShpbnQgaXJxLCB2b2lkICpkKQogewogCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkOwogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CkBAIC0xNDI5LDcgKzE0MjYsNyBAQAogCX0KIAlpZiAoc2FtcGxlc2luYnVmICYgMSkgewogCQljb21lZGlfZXJyb3IoZGV2LCAiT2RkIGNvdW50IG9mIGJ5dGVzIGluIERNQSByaW5nISIpOwotCQlpX0FQQ0kzMTIwX1N0b3BDeWNsaWNBY3F1aXNpdGlvbihkZXYsIHMpOworCQlhcGNpMzEyMF9jYW5jZWwoZGV2LCBzKTsKIAkJZGV2cHJpdi0+Yl9BaUN5Y2xpY0FjcXVpc2l0aW9uID0gQVBDSTMxMjBfRElTQUJMRTsKIAogCQlyZXR1cm47CkBAIC0xNTAwLDcgKzE0OTcsNyBAQAogCWlmICghZGV2cHJpdi0+Yl9BaUNvbnRpbnVvdXMpCiAJCWlmIChkZXZwcml2LT51aV9BaUFjdHVhbFNjYW4gPj0gZGV2cHJpdi0+dWlfQWlOYnJvZlNjYW5zKSB7CiAJCQkvKiAgYWxsIGRhdGEgc2FtcGxlZCAqLwotCQkJaV9BUENJMzEyMF9TdG9wQ3ljbGljQWNxdWlzaXRpb24oZGV2LCBzKTsKKwkJCWFwY2kzMTIwX2NhbmNlbChkZXYsIHMpOwogCQkJZGV2cHJpdi0+Yl9BaUN5Y2xpY0FjcXVpc2l0aW9uID0gQVBDSTMxMjBfRElTQUJMRTsKIAkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKIAkJCWNvbWVkaV9ldmVudChkZXYsIHMpOwpAQCAtMTU2NSw3ICsxNTYyLDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBFT1MgaW50ZXJydXB0LgogICogVGhpcyBmdW5jdGlvbiBjb3BpZXMgdGhlIGFjcXVpcmVkIGRhdGEoZnJvbSBGSUZPKSB0byBDb21lZGkgYnVmZmVyLgogICovCi1zdGF0aWMgaW50IGlfQVBDSTMxMjBfSW50ZXJydXB0SGFuZGxlRW9zKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGFwY2kzMTIwX2ludGVycnVwdF9oYW5kbGVfZW9zKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7CkBAIC0xNTc0LDggKzE1NzEsNiBAQAogCiAJbl9jaGFuID0gZGV2cHJpdi0+dWlfQWlOYnJvZkNoYW5uZWxzOwogCi0Jcy0+YXN5bmMtPmV2ZW50cyA9IDA7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgbl9jaGFuOyBpKyspCiAJCWVyciAmPSBjb21lZGlfYnVmX3B1dChzLT5hc3luYywgaW53KGRldi0+aW9iYXNlICsgMCkpOwogCkBAIC0xNTg5LDcgKzE1ODQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB2X0FQQ0kzMTIwX0ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQorc3RhdGljIHZvaWQgYXBjaTMxMjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCiB7CiAJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKQEAgLTE2MTUsNyArMTYxMCw3IEBACiAKIAlpZiAoZGV2cHJpdi0+Yl9FeHR0cmlnRW5hYmxlID09IEFQQ0kzMTIwX0VOQUJMRSkgewogCQkvKiBEaXNhYmxlIGV4dCB0cmlnZ2VyICovCi0JCWlfQVBDSTMxMjBfRXh0dHJpZ0Rpc2FibGUoZGV2KTsKKwkJYXBjaTMxMjBfZXh0dHJpZ19kaXNhYmxlKGRldik7CiAJCWRldnByaXYtPmJfRXh0dHJpZ0VuYWJsZSA9IEFQQ0kzMTIwX0RJU0FCTEU7CiAJfQogCS8qIGNsZWFyIHRoZSB0aW1lciAyIGludGVycnVwdCAqLwpAQCAtMTY1NSw3ICsxNjUwLDcgQEAKIAogCQkJaWYgKGRldnByaXYtPmJfQWlDeWNsaWNBY3F1aXNpdGlvbiA9PSBBUENJMzEyMF9FTkFCTEUpIHsKIAkJCQl1aV9DaGVjayA9IDA7Ci0JCQkJaV9BUENJMzEyMF9JbnRlcnJ1cHRIYW5kbGVFb3MoZGV2KTsKKwkJCQlhcGNpMzEyMF9pbnRlcnJ1cHRfaGFuZGxlX2VvcyhkZXYpOwogCQkJCWRldnByaXYtPnVpX0FpQWN0dWFsU2NhbisrOwogCQkJCWRldnByaXYtPmJfTW9kZVNlbGVjdFJlZ2lzdGVyID0KIAkJCQkJZGV2cHJpdi0+CkBAIC0xNzExLDcgKzE3MDYsNyBAQAogCQkJCWRldi0+aW9iYXNlICsgQVBDSTMxMjBfV1JfQUREUkVTUyk7CiAKIAkJCS8qIHN0b3AgdGltZXIgMCBhbmQgdGltZXIgMSAqLwotCQkJaV9BUENJMzEyMF9TdG9wQ3ljbGljQWNxdWlzaXRpb24oZGV2LCBzKTsKKwkJCWFwY2kzMTIwX2NhbmNlbChkZXYsIHMpOwogCQkJZGV2cHJpdi0+Yl9BaUN5Y2xpY0FjcXVpc2l0aW9uID0gQVBDSTMxMjBfRElTQUJMRTsKIAogCQkJLyogVVBEQVRFLTAuNy41Ny0+MC43LjY4Y29tZWRpX2RvbmUoZGV2LHMpOyAqLwpAQCAtMTc2NSw3ICsxNzYwLDggQEAKIAkJCS8qIENsZWFycyB0aGUgdGltZXIgc3RhdHVzIHJlZ2lzdGVyICovCiAJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJaW53KGRldi0+aW9iYXNlICsgQVBDSTMxMjBfVElNRVJfU1RBVFVTX1JFR0lTVEVSKTsKLQkJCXZfQVBDSTMxMjBfSW50ZXJydXB0RG1hKGlycSwgZCk7CS8qICBkbyBzb21lIGRhdGEgdHJhbnNmZXIgKi8KKwkJCS8qIGRvIHNvbWUgZGF0YSB0cmFuc2ZlciAqLworCQkJYXBjaTMxMjBfaW50ZXJydXB0X2RtYShpcnEsIGQpOwogCQl9IGVsc2UgewogCQkJLyogU3RvcHMgdGhlIFRpbWVyICovCiAJCQlvdXR3KGRldnByaXYtPgpAQCAtMTc4Nyw3ICsxNzgzLDcgQEAKICAqIGRhdGFbMV0gPSBUaW1lciBjb25zdGFudAogICogZGF0YVsyXSA9IFRpbWVyMiBpbnRlcnJ1cHQgKDEpZW5hYmxlIG9yKDApIGRpc2FibGUKICAqLwotc3RhdGljIGludCBpX0FQQ0kzMTIwX0luc25Db25maWdUaW1lcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorc3RhdGljIGludCBhcGNpMzEyMF9jb25maWdfaW5zbl90aW1lcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCkBAIC0xOTMyLDcgKzE5MjgsNyBAQAogICoJCQkgPSAxIFRpbWVyCiAgKgkJCSA9IDIgV2F0Y2ggZG9nCiAgKi8KLXN0YXRpYyBpbnQgaV9BUENJMzEyMF9JbnNuV3JpdGVUaW1lcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorc3RhdGljIGludCBhcGNpMzEyMF93cml0ZV9pbnNuX3RpbWVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKIAkJCQkgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKQEAgLTIxMDQsNyArMjEwMCw3IEBACiAgKiBmb3Igd2F0Y2hkb2c6IGRhdGFbMF0gPSAwIChzdGlsbCBydW5uaW5nKQogICoJCQkgPSAxIChydW4gZG93bikKICAqLwotc3RhdGljIGludCBpX0FQQ0kzMTIwX0luc25SZWFkVGltZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgYXBjaTMxMjBfcmVhZF9pbnNuX3RpbWVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCiAJCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YSkKQEAgLTIxODksMTAgKzIxODUsMTAgQEAKIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAotc3RhdGljIGludCBpX0FQQ0kzMTIwX0luc25Xcml0ZUFuYWxvZ091dHB1dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCSAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCitzdGF0aWMgaW50IGFwY2kzMTIwX2FvX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IHVpX1JhbmdlLCB1aV9DaGFubmVsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzIwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzIwMC5jCmluZGV4IDhjODVhMDkuLjA1MzZkODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMyMDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMjAwLmMKQEAgLTEyNjgsNyArMTI2OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaV9BUENJMzIwMF9SZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQorc3RhdGljIGludCBhcGNpMzIwMF9yZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGlfVGVtcDsKQEAgLTEzMjIsMTAgKzEzMjIsMTAgQEAKICAqIGRhdGFbN10gOiBDaGFubmVsIGN1cnJlbnQgc291cmNlIGZyb20gZWVwcm9tCiAgKiBkYXRhWzhdIDogQ2hhbm5sZSBnYWluIGZhY3RvciBmcm9tIGVlcHJvbQogICovCi1zdGF0aWMgaW50IGlfQVBDSTMyMDBfUmVhZEFuYWxvZ0lucHV0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyBpbnQgYXBjaTMyMDBfYWlfcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJdW5zaWduZWQgaW50IHVpX0R1bW15VmFsdWUgPSAwOwogCWludCBpX0NvbnZlcnRDSkNDYWxpYnJhdGlvbjsKQEAgLTEzMzYsNyArMTMzNiw3IEBACiAJaWYgKHNfQm9hcmRJbmZvc1tkZXYtPm1pbm9yXS5pX0luaXRpYWxpc2VkID09IDApCiAJCS8qIEVORCBKSyAwNi4wNy4wNDogTWFuYWdlbWVudCBvZiBzZXZyYWxzIGJvYXJkcyAqLwogCXsKLQkJaV9BUENJMzIwMF9SZXNldChkZXYpOworCQlhcGNpMzIwMF9yZXNldChkZXYpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CQkJLyogaWYoaV9Jbml0aWFsaXNlZD09MCk7ICovCiAKQEAgLTE1ODYsNyArMTU4Niw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50aygiXG5UaGUgcGFyYW1ldGVycyBwYXNzZWQgYXJlIGluIGVycm9yXG4iKTsKLQkJaV9BUENJMzIwMF9SZXNldChkZXYpOworCQlhcGNpMzIwMF9yZXNldChkZXYpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CQkJLyogc3dpdGNoKGluc24tPnVudXNlZFswXSkgKi8KIApAQCAtMTYyNiwxMCArMTYyNiwxMCBAQAogICoJICAgID0gMiAgUlREIDMgd2lyZSBjb25uZWN0aW9uCiAgKgkgICAgPSAzICBSVEQgNCB3aXJlIGNvbm5lY3Rpb24KICAqLwotc3RhdGljIGludCBpX0FQQ0kzMjAwX0NvbmZpZ0FuYWxvZ0lucHV0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCXVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyBpbnQgYXBjaTMyMDBfYWlfY29uZmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVuc2lnbmVkIGludCB1bF9Db25maWcgPSAwLCB1bF9UZW1wID0gMDsKQEAgLTE5NzAsNyArMTk3MCw3IEBACiAJCX0JCS8qICBzd2l0Y2goZGF0YVsxMV0pICovCiAJfQkJCS8qICBlbHNlaWYoZGF0YVsxMl09PTAgfHwgZGF0YVsxMl09PTEpICovCiAJaWYgKGlfZXJyKSB7Ci0JCWlfQVBDSTMyMDBfUmVzZXQoZGV2KTsKKwkJYXBjaTMyMDBfcmVzZXQoZGV2KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCS8qIGlmKGlfU2NhblR5cGUhPTEpICovCkBAIC0yMDc5LDcgKzIwNzksNyBAQAogCQkvKiBFTkQgSksgMDYuMDcuMDQ6IE1hbmFnZW1lbnQgb2Ygc2V2cmFscyBib2FyZHMgKi8KIAogCQlpbnNuLT51bnVzZWRbMF0gPSAwOwotCQlpX0FQQ0kzMjAwX1JlYWRBbmFsb2dJbnB1dChkZXYsIHMsIGluc24sICZ1aV9EdW1teSk7CisJCWFwY2kzMjAwX2FpX3JlYWQoZGV2LCBzLCBpbnNuLCAmdWlfRHVtbXkpOwogCX0KIAogCXJldHVybiBpbnNuLT5uOwpAQCAtMjA5NSwxMCArMjA5NSwxMCBAQAogICogZGF0YVsxXSA6IGNhbGlicmF0aW9uIG9mZnNldAogICogZGF0YVsyXSA6IGNhbGlicmF0aW9uIGdhaW4KICAqLwotc3RhdGljIGludCBpX0FQQ0kzMjAwX0luc25CaXRzX0FuYWxvZ0lucHV0X1Rlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkJdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBhcGNpMzIwMF9haV9iaXRzX3Rlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IHVpX0NvbmZpZ3VyYXRpb24gPSAwOwpAQCAtMjEwNywxMiArMjEwNywxMiBAQAogCS8qIGlmKGlfSW5pdGlhbGlzZWQ9PTApICovCiAKIAlpZiAoc19Cb2FyZEluZm9zW2Rldi0+bWlub3JdLmlfSW5pdGlhbGlzZWQgPT0gMCkgewotCQlpX0FQQ0kzMjAwX1Jlc2V0KGRldik7CisJCWFwY2kzMjAwX3Jlc2V0KGRldik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0JCQkvKiBpZihpX0luaXRpYWxpc2VkPT0wKTsgKi8KIAlpZiAoZGF0YVswXSAhPSAwICYmIGRhdGFbMF0gIT0gMSkgewogCQlwcmludGsoIlxuRXJyb3IgaW4gc2VsZWN0aW9uIG9mIGZ1bmN0aW9uYWxpdHlcbiIpOwotCQlpX0FQQ0kzMjAwX1Jlc2V0KGRldik7CisJCWFwY2kzMjAwX3Jlc2V0KGRldik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0JCQkvKiBpZihkYXRhWzBdIT0wICYmIGRhdGFbMF0hPTEpICovCiAKQEAgLTIyMDIsMTggKzIyMDIsMTggQEAKIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAotc3RhdGljIGludCBpX0FQQ0kzMjAwX0luc25Xcml0ZVJlbGVhc2VBbmFsb2dJbnB1dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkJICB1bnNpZ25lZCBpbnQgKmRhdGEpCitzdGF0aWMgaW50IGFwY2kzMjAwX2FpX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQlpX0FQQ0kzMjAwX1Jlc2V0KGRldik7CisJYXBjaTMyMDBfcmVzZXQoZGV2KTsKIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAotc3RhdGljIGludCBpX0FQQ0kzMjAwX0NvbW1hbmRUZXN0QW5hbG9nSW5wdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQorc3RhdGljIGludCBhcGNpMzIwMF9haV9jbWR0ZXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKIAogCWludCBlcnIgPSAwOwpAQCAtMjI0MSw3ICsyMjQxLDcgQEAKIAkJZXJyIHw9IC1FSU5WQUw7CiAKIAlpZiAoZXJyKSB7Ci0JCWlfQVBDSTMyMDBfUmVzZXQoZGV2KTsKKwkJYXBjaTMyMDBfcmVzZXQoZGV2KTsKIAkJcmV0dXJuIDE7CiAJfQogCkBAIC0yMjY3LDcgKzIyNjcsNyBAQAogCX0KIAogCWlmIChlcnIpIHsKLQkJaV9BUENJMzIwMF9SZXNldChkZXYpOworCQlhcGNpMzIwMF9yZXNldChkZXYpOwogCQlyZXR1cm4gMjsKIAl9CiAJLyogaV9GaXJzdENoYW5uZWw9Y21kLT5jaGFubGlzdFswXTsgKi8KQEAgLTIzMDgsNyArMjMwOCw3IEBACiAJCQlwcmludGsoIlxuVGhlIERlbGF5IHRpbWUgdmFsdWUgaXMgaW4gZXJyb3JcbiIpOwogCQl9CiAJCWlmIChlcnIpIHsKLQkJCWlfQVBDSTMyMDBfUmVzZXQoZGV2KTsKKwkJCWFwY2kzMjAwX3Jlc2V0KGRldik7CiAJCQlyZXR1cm4gMzsKIAkJfQogCQlmcHVfYmVnaW4oKTsKQEAgLTIzNjYsMTUgKzIzNjYsMTUgQEAKIAl9CQkJLyogZWxzZSBpZihjbWQtPnNjYW5fYmVnaW5fc3JjPT1UUklHX0ZPTExPVykgKi8KIAogCWlmIChlcnIpIHsKLQkJaV9BUENJMzIwMF9SZXNldChkZXYpOworCQlhcGNpMzIwMF9yZXNldChkZXYpOwogCQlyZXR1cm4gNDsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpX0FQQ0kzMjAwX1N0b3BDeWNsaWNBY3F1aXNpdGlvbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCitzdGF0aWMgaW50IGFwY2kzMjAwX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgdWlfQ29uZmlndXJhdGlvbiA9IDA7CkBAIC0yNDEwLDggKzI0MTAsOCBAQAogICogRG9lcyBhc3luY2hyb25vdXMgYWNxdWlzaXRpb24KICAqIERldGVybWluZXMgdGhlIG1vZGUgMSBvciAyLgogICovCi1zdGF0aWMgaW50IGlfQVBDSTMyMDBfQ29tbWFuZEFuYWxvZ0lucHV0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3N0YXRpYyBpbnQgYXBjaTMyMDBfYWlfY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKQEAgLTI2MTksNyArMjYxOSw2IEBACiAJCS8qIEJFR0lOIEpLIDE4LjEwLjIwMDQ6IEFQQ0ktMzIwMCBEcml2ZXIgdXBkYXRlIDAuNy41NyAtPiAwLjcuNjggKi8KIAkJLyogVGhpcyB2YWx1ZSBpcyBub3QgdXNlZCAqLwogCQkvKiB1aV9DaGFubmVsTnVtYmVyID0gaW5sKGRldnByaXYtPmlvYmFzZStzX0JvYXJkSW5mb3MgW2Rldi0+bWlub3JdLmlfT2Zmc2V0ICsgMjQpOyAqLwotCQlzLT5hc3luYy0+ZXZlbnRzID0gMDsKIAkJLyogRU5EIEpLIDE4LjEwLjIwMDQ6IEFQQ0ktMzIwMCBEcml2ZXIgdXBkYXRlIDAuNy41NyAtPiAwLjcuNjggKi8KIAogICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNzMwLDcgKzI3MjksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB2X0FQQ0kzMjAwX0ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQorc3RhdGljIHZvaWQgYXBjaTMyMDBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCiB7CiAJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTM1MDEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTM1MDEuYwppbmRleCBlYmMxNTM0Li4yMGU4OWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzNTAxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzUwMS5jCkBAIC0xNiwxMCArMTYsMTAgQEAKICAqCWRhdGFbMl0gOiBUaW1lIFVuaXQKICAqCWRhdGFbM10gOiBSZWxvYWQgVmFsdWUKICAqLwotc3RhdGljIGludCBpX0FQQ0kzNTAxX0NvbmZpZ1RpbWVyQ291bnRlcldhdGNoZG9nKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkJIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyBpbnQgYXBjaTM1MDFfY29uZmlnX2luc25fdGltZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhcGNpMzUwMV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVuc2lnbmVkIGludCB1bF9Db21tYW5kMSA9IDA7CkBAIC04NiwxMCArODYsMTAgQEAKICAqCQkgIDAgU3RvcAogICoJCSAgMiBUcmlnZ2VyCiAgKi8KLXN0YXRpYyBpbnQgaV9BUENJMzUwMV9TdGFydFN0b3BXcml0ZVRpbWVyQ291bnRlcldhdGNoZG9nKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCQkJIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyBpbnQgYXBjaTM1MDFfd3JpdGVfaW5zbl90aW1lcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFwY2kzNTAxX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IHVsX0NvbW1hbmQxID0gMDsKQEAgLTE1MywxMCArMTUzLDEwIEBACiAgKgkJICAyIFdhdGNoZG9nCiAgKglkYXRhWzFdIDogVGltZXIgQ291bnRlciBXYXRjaGRvZyBOdW1iZXIKICAqLwotc3RhdGljIGludCBpX0FQQ0kzNTAxX1JlYWRUaW1lckNvdW50ZXJXYXRjaGRvZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCitzdGF0aWMgaW50IGFwY2kzNTAxX3JlYWRfaW5zbl90aW1lcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFwY2kzNTAxX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMDM1LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzAzNS5jCmluZGV4IGNjZDQ5MjEuLjRkYTlkYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMDM1LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8wMzUuYwpAQCAtMjcsMTMgKzI3LDEzIEBACiAJCS5pX1RpbWVyCQk9IDEsCiAJCS51aV9NaW5BY3F1aXNpdGlvbnRpbWVOcyA9IDEwMDAwLAogCQkudWlfTWluRGVsYXl0aW1lTnMJPSAxMDAwMDAsCi0JCS5pbnRlcnJ1cHQJCT0gdl9BUENJMDM1X0ludGVycnVwdCwKLQkJLnJlc2V0CQkJPSBpX0FQQ0kwMzVfUmVzZXQsCi0JCS5haV9jb25maWcJCT0gaV9BUENJMDM1X0NvbmZpZ0FuYWxvZ0lucHV0LAotCQkuYWlfcmVhZAkJPSBpX0FQQ0kwMzVfUmVhZEFuYWxvZ0lucHV0LAotCQkudGltZXJfY29uZmlnCQk9IGlfQVBDSTAzNV9Db25maWdUaW1lcldhdGNoZG9nLAotCQkudGltZXJfd3JpdGUJCT0gaV9BUENJMDM1X1N0YXJ0U3RvcFdyaXRlVGltZXJXYXRjaGRvZywKLQkJLnRpbWVyX3JlYWQJCT0gaV9BUENJMDM1X1JlYWRUaW1lcldhdGNoZG9nLAorCQkuaW50ZXJydXB0CQk9IGFwY2kwMzVfaW50ZXJydXB0LAorCQkucmVzZXQJCQk9IGFwY2kwMzVfcmVzZXQsCisJCS5haV9jb25maWcJCT0gYXBjaTAzNV9haV9jb25maWcsCisJCS5haV9yZWFkCQk9IGFwY2kwMzVfYWlfcmVhZCwKKwkJLnRpbWVyX2NvbmZpZwkJPSBhcGNpMDM1X3RpbWVyX2NvbmZpZywKKwkJLnRpbWVyX3dyaXRlCQk9IGFwY2kwMzVfdGltZXJfd3JpdGUsCisJCS50aW1lcl9yZWFkCQk9IGFwY2kwMzVfdGltZXJfcmVhZCwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xNTAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1MDAuYwppbmRleCA3NGY3YWNlLi5iZDhlMDhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1MDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1MDAuYwpAQCAtMjAsMTkgKzIwLDE5IEBACiAJCS5pX05ickRvQ2hhbm5lbAkJPSAxNiwKIAkJLmlfRG9NYXhkYXRhCQk9IDB4ZmZmZiwKIAkJLmlfVGltZXIJCT0gMSwKLQkJLmludGVycnVwdAkJPSB2X0FQQ0kxNTAwX0ludGVycnVwdCwKLQkJLnJlc2V0CQkJPSBpX0FQQ0kxNTAwX1Jlc2V0LAotCQkuZGlfY29uZmlnCQk9IGlfQVBDSTE1MDBfQ29uZmlnRGlnaXRhbElucHV0RXZlbnQsCi0JCS5kaV9yZWFkCQk9IGlfQVBDSTE1MDBfSW5pdGlhbGlzYXRpb24sCi0JCS5kaV93cml0ZQkJPSBpX0FQQ0kxNTAwX1N0YXJ0U3RvcElucHV0RXZlbnQsCisJCS5pbnRlcnJ1cHQJCT0gYXBjaTE1MDBfaW50ZXJydXB0LAorCQkucmVzZXQJCQk9IGFwY2kxNTAwX3Jlc2V0LAorCQkuZGlfY29uZmlnCQk9IGFwY2kxNTAwX2RpX2NvbmZpZywKKwkJLmRpX3JlYWQJCT0gYXBjaTE1MDBfZGlfcmVhZCwKKwkJLmRpX3dyaXRlCQk9IGFwY2kxNTAwX2RpX3dyaXRlLAogCQkuZGlfYml0cwkJPSBhcGNpMTUwMF9kaV9pbnNuX2JpdHMsCi0JCS5kb19jb25maWcJCT0gaV9BUENJMTUwMF9Db25maWdEaWdpdGFsT3V0cHV0RXJyb3JJbnRlcnJ1cHQsCi0JCS5kb193cml0ZQkJPSBpX0FQQ0kxNTAwX1dyaXRlRGlnaXRhbE91dHB1dCwKLQkJLmRvX2JpdHMJCT0gaV9BUENJMTUwMF9Db25maWd1cmVJbnRlcnJ1cHQsCi0JCS50aW1lcl9jb25maWcJCT0gaV9BUENJMTUwMF9Db25maWdDb3VudGVyVGltZXJXYXRjaGRvZywKLQkJLnRpbWVyX3dyaXRlCQk9IGlfQVBDSTE1MDBfU3RhcnRTdG9wVHJpZ2dlclRpbWVyQ291bnRlcldhdGNoZG9nLAotCQkudGltZXJfcmVhZAkJPSBpX0FQQ0kxNTAwX1JlYWRJbnRlcnJ1cHRNYXNrLAotCQkudGltZXJfYml0cwkJPSBpX0FQQ0kxNTAwX1JlYWRDb3VudGVyVGltZXJXYXRjaGRvZywKKwkJLmRvX2NvbmZpZwkJPSBhcGNpMTUwMF9kb19jb25maWcsCisJCS5kb193cml0ZQkJPSBhcGNpMTUwMF9kb193cml0ZSwKKwkJLmRvX2JpdHMJCT0gYXBjaTE1MDBfZG9fYml0cywKKwkJLnRpbWVyX2NvbmZpZwkJPSBhcGNpMTUwMF90aW1lcl9jb25maWcsCisJCS50aW1lcl93cml0ZQkJPSBhcGNpMTUwMF90aW1lcl93cml0ZSwKKwkJLnRpbWVyX3JlYWQJCT0gYXBjaTE1MDBfdGltZXJfcmVhZCwKKwkJLnRpbWVyX2JpdHMJCT0gYXBjaTE1MDBfdGltZXJfYml0cywKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xNTY0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1NjQuYwppbmRleCA2MjQ4Mjg0Li4yN2FhOWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1NjQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1NjQuYwpAQCAtMjEsMTYgKzIxLDE2IEBACiAJCS5pX05ickRvQ2hhbm5lbAkJPSAzMiwKIAkJLmlfRG9NYXhkYXRhCQk9IDB4ZmZmZmZmZmYsCiAJCS5pX1RpbWVyCQk9IDEsCi0JCS5pbnRlcnJ1cHQJCT0gdl9BUENJMTU2NF9JbnRlcnJ1cHQsCi0JCS5yZXNldAkJCT0gaV9BUENJMTU2NF9SZXNldCwKLQkJLmRpX2NvbmZpZwkJPSBpX0FQQ0kxNTY0X0NvbmZpZ0RpZ2l0YWxJbnB1dCwKKwkJLmludGVycnVwdAkJPSBhcGNpMTU2NF9pbnRlcnJ1cHQsCisJCS5yZXNldAkJCT0gYXBjaTE1NjRfcmVzZXQsCisJCS5kaV9jb25maWcJCT0gYXBjaTE1NjRfZGlfY29uZmlnLAogCQkuZGlfYml0cwkJPSBhcGNpMTU2NF9kaV9pbnNuX2JpdHMsCi0JCS5kb19jb25maWcJCT0gaV9BUENJMTU2NF9Db25maWdEaWdpdGFsT3V0cHV0LAorCQkuZG9fY29uZmlnCQk9IGFwY2kxNTY0X2RvX2NvbmZpZywKIAkJLmRvX2JpdHMJCT0gYXBjaTE1NjRfZG9faW5zbl9iaXRzLAotCQkuZG9fcmVhZAkJPSBpX0FQQ0kxNTY0X1JlYWRJbnRlcnJ1cHRTdGF0dXMsCi0JCS50aW1lcl9jb25maWcJCT0gaV9BUENJMTU2NF9Db25maWdUaW1lckNvdW50ZXJXYXRjaGRvZywKLQkJLnRpbWVyX3dyaXRlCQk9IGlfQVBDSTE1NjRfU3RhcnRTdG9wV3JpdGVUaW1lckNvdW50ZXJXYXRjaGRvZywKLQkJLnRpbWVyX3JlYWQJCT0gaV9BUENJMTU2NF9SZWFkVGltZXJDb3VudGVyV2F0Y2hkb2csCisJCS5kb19yZWFkCQk9IGFwY2kxNTY0X2RvX3JlYWQsCisJCS50aW1lcl9jb25maWcJCT0gYXBjaTE1NjRfdGltZXJfY29uZmlnLAorCQkudGltZXJfd3JpdGUJCT0gYXBjaTE1NjRfdGltZXJfd3JpdGUsCisJCS50aW1lcl9yZWFkCQk9IGFwY2kxNTY0X3RpbWVyX3JlYWQsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMzEyMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zMTIwLmMKaW5kZXggMWU2ZmE1Ni4uNTdlZTZlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zMTIwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zMTIwLmMKQEAgLTI2LDcgKzI2LDcgQEAKIAkJLmlfTmJyRGlDaGFubmVsCQk9IDQsCiAJCS5pX05ickRvQ2hhbm5lbAkJPSA0LAogCQkuaV9Eb01heGRhdGEJCT0gMHgwZiwKLQkJLmludGVycnVwdAkJPSB2X0FQQ0kzMTIwX0ludGVycnVwdCwKKwkJLmludGVycnVwdAkJPSBhcGNpMzEyMF9pbnRlcnJ1cHQsCiAJfSwKIAlbQk9BUkRfQVBDSTMwMDFdID0gewogCQkucGNfRHJpdmVyTmFtZQkJPSAiYXBjaTMwMDEiLApAQCAtMzcsNyArMzcsNyBAQAogCQkuaV9OYnJEaUNoYW5uZWwJCT0gNCwKIAkJLmlfTmJyRG9DaGFubmVsCQk9IDQsCiAJCS5pX0RvTWF4ZGF0YQkJPSAweDBmLAotCQkuaW50ZXJydXB0CQk9IHZfQVBDSTMxMjBfSW50ZXJydXB0LAorCQkuaW50ZXJydXB0CQk9IGFwY2kzMTIwX2ludGVycnVwdCwKIAl9LAogfTsKIApAQCAtMTM2LDExICsxMzYsMTEgQEAKIAlzLT5sZW5fY2hhbmxpc3QgPSB0aGlzX2JvYXJkLT5pX0FpQ2hhbm5lbExpc3Q7CiAJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYXBjaTMxMjBfYWk7CiAKLQlzLT5pbnNuX2NvbmZpZyA9IGlfQVBDSTMxMjBfSW5zbkNvbmZpZ0FuYWxvZ0lucHV0OwotCXMtPmluc25fcmVhZCA9IGlfQVBDSTMxMjBfSW5zblJlYWRBbmFsb2dJbnB1dDsKLQlzLT5kb19jbWR0ZXN0ID0gaV9BUENJMzEyMF9Db21tYW5kVGVzdEFuYWxvZ0lucHV0OwotCXMtPmRvX2NtZCA9IGlfQVBDSTMxMjBfQ29tbWFuZEFuYWxvZ0lucHV0OwotCXMtPmNhbmNlbCA9IGlfQVBDSTMxMjBfU3RvcEN5Y2xpY0FjcXVpc2l0aW9uOworCXMtPmluc25fY29uZmlnID0gYXBjaTMxMjBfYWlfaW5zbl9jb25maWc7CisJcy0+aW5zbl9yZWFkID0gYXBjaTMxMjBfYWlfaW5zbl9yZWFkOworCXMtPmRvX2NtZHRlc3QgPSBhcGNpMzEyMF9haV9jbWR0ZXN0OworCXMtPmRvX2NtZCA9IGFwY2kzMTIwX2FpX2NtZDsKKwlzLT5jYW5jZWwgPSBhcGNpMzEyMF9jYW5jZWw7CiAKIAkvKiAgQWxsb2NhdGUgYW5kIEluaXRpYWxpc2UgQU8gU3ViZGV2aWNlIFN0cnVjdHVyZXMgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1sxXTsKQEAgLTE1MSw3ICsxNTEsNyBAQAogCQlzLT5tYXhkYXRhID0gdGhpc19ib2FyZC0+aV9Bb01heGRhdGE7CiAJCXMtPmxlbl9jaGFubGlzdCA9IHRoaXNfYm9hcmQtPmlfTmJyQW9DaGFubmVsOwogCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9hcGNpMzEyMF9hbzsKLQkJcy0+aW5zbl93cml0ZSA9IGlfQVBDSTMxMjBfSW5zbldyaXRlQW5hbG9nT3V0cHV0OworCQlzLT5pbnNuX3dyaXRlID0gYXBjaTMxMjBfYW9faW5zbl93cml0ZTsKIAl9IGVsc2UgewogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwogCX0KQEAgLTE4NiwxMSArMTg2LDExIEBACiAJcy0+bGVuX2NoYW5saXN0ID0gMTsKIAlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOwogCi0Jcy0+aW5zbl93cml0ZSA9IGlfQVBDSTMxMjBfSW5zbldyaXRlVGltZXI7Ci0Jcy0+aW5zbl9yZWFkID0gaV9BUENJMzEyMF9JbnNuUmVhZFRpbWVyOwotCXMtPmluc25fY29uZmlnID0gaV9BUENJMzEyMF9JbnNuQ29uZmlnVGltZXI7CisJcy0+aW5zbl93cml0ZSA9IGFwY2kzMTIwX3dyaXRlX2luc25fdGltZXI7CisJcy0+aW5zbl9yZWFkID0gYXBjaTMxMjBfcmVhZF9pbnNuX3RpbWVyOworCXMtPmluc25fY29uZmlnID0gYXBjaTMxMjBfY29uZmlnX2luc25fdGltZXI7CiAKLQlpX0FQQ0kzMTIwX1Jlc2V0KGRldik7CisJYXBjaTMxMjBfcmVzZXQoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjAwLDcgKzIwMCw3IEBACiAKIAlpZiAoZGV2cHJpdikgewogCQlpZiAoZGV2LT5pb2Jhc2UpCi0JCQlpX0FQQ0kzMTIwX1Jlc2V0KGRldik7CisJCQlhcGNpMzEyMF9yZXNldChkZXYpOwogCQlpZiAoZGV2LT5pcnEpCiAJCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIAkJaWYgKGRldnByaXYtPnVsX0RtYUJ1ZmZlclZpcnR1YWxbMF0pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMzIwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zMjAwLmMKaW5kZXggOTg2OGE1My4uZjBmODkxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zMjAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zMjAwLmMKQEAgLTQzLDE1ICs0MywxNSBAQAogCQkuaV9OYnJEb0NoYW5uZWwJCT0gNCwKIAkJLnVpX01pbkFjcXVpc2l0aW9udGltZU5zID0gMTAwMDAsCiAJCS51aV9NaW5EZWxheXRpbWVOcwk9IDEwMDAwMCwKLQkJLmludGVycnVwdAkJPSB2X0FQQ0kzMjAwX0ludGVycnVwdCwKLQkJLnJlc2V0CQkJPSBpX0FQQ0kzMjAwX1Jlc2V0LAotCQkuYWlfY29uZmlnCQk9IGlfQVBDSTMyMDBfQ29uZmlnQW5hbG9nSW5wdXQsCi0JCS5haV9yZWFkCQk9IGlfQVBDSTMyMDBfUmVhZEFuYWxvZ0lucHV0LAotCQkuYWlfd3JpdGUJCT0gaV9BUENJMzIwMF9JbnNuV3JpdGVSZWxlYXNlQW5hbG9nSW5wdXQsCi0JCS5haV9iaXRzCQk9IGlfQVBDSTMyMDBfSW5zbkJpdHNfQW5hbG9nSW5wdXRfVGVzdCwKLQkJLmFpX2NtZHRlc3QJCT0gaV9BUENJMzIwMF9Db21tYW5kVGVzdEFuYWxvZ0lucHV0LAotCQkuYWlfY21kCQkJPSBpX0FQQ0kzMjAwX0NvbW1hbmRBbmFsb2dJbnB1dCwKLQkJLmFpX2NhbmNlbAkJPSBpX0FQQ0kzMjAwX1N0b3BDeWNsaWNBY3F1aXNpdGlvbiwKKwkJLmludGVycnVwdAkJPSBhcGNpMzIwMF9pbnRlcnJ1cHQsCisJCS5yZXNldAkJCT0gYXBjaTMyMDBfcmVzZXQsCisJCS5haV9jb25maWcJCT0gYXBjaTMyMDBfYWlfY29uZmlnLAorCQkuYWlfcmVhZAkJPSBhcGNpMzIwMF9haV9yZWFkLAorCQkuYWlfd3JpdGUJCT0gYXBjaTMyMDBfYWlfd3JpdGUsCisJCS5haV9iaXRzCQk9IGFwY2kzMjAwX2FpX2JpdHNfdGVzdCwKKwkJLmFpX2NtZHRlc3QJCT0gYXBjaTMyMDBfYWlfY21kdGVzdCwKKwkJLmFpX2NtZAkJCT0gYXBjaTMyMDBfYWlfY21kLAorCQkuYWlfY2FuY2VsCQk9IGFwY2kzMjAwX2NhbmNlbCwKIAkJLmRpX2JpdHMJCT0gYXBjaTMyMDBfZGlfaW5zbl9iaXRzLAogCQkuZG9fYml0cwkJPSBhcGNpMzIwMF9kb19pbnNuX2JpdHMsCiAJfSwKQEAgLTY4LDE1ICs2OCwxNSBAQAogCQkuaV9OYnJEb0NoYW5uZWwJCT0gNCwKIAkJLnVpX01pbkFjcXVpc2l0aW9udGltZU5zID0gMTAwMDAsCiAJCS51aV9NaW5EZWxheXRpbWVOcwk9IDEwMDAwMCwKLQkJLmludGVycnVwdAkJPSB2X0FQQ0kzMjAwX0ludGVycnVwdCwKLQkJLnJlc2V0CQkJPSBpX0FQQ0kzMjAwX1Jlc2V0LAotCQkuYWlfY29uZmlnCQk9IGlfQVBDSTMyMDBfQ29uZmlnQW5hbG9nSW5wdXQsCi0JCS5haV9yZWFkCQk9IGlfQVBDSTMyMDBfUmVhZEFuYWxvZ0lucHV0LAotCQkuYWlfd3JpdGUJCT0gaV9BUENJMzIwMF9JbnNuV3JpdGVSZWxlYXNlQW5hbG9nSW5wdXQsCi0JCS5haV9iaXRzCQk9IGlfQVBDSTMyMDBfSW5zbkJpdHNfQW5hbG9nSW5wdXRfVGVzdCwKLQkJLmFpX2NtZHRlc3QJCT0gaV9BUENJMzIwMF9Db21tYW5kVGVzdEFuYWxvZ0lucHV0LAotCQkuYWlfY21kCQkJPSBpX0FQQ0kzMjAwX0NvbW1hbmRBbmFsb2dJbnB1dCwKLQkJLmFpX2NhbmNlbAkJPSBpX0FQQ0kzMjAwX1N0b3BDeWNsaWNBY3F1aXNpdGlvbiwKKwkJLmludGVycnVwdAkJPSBhcGNpMzIwMF9pbnRlcnJ1cHQsCisJCS5yZXNldAkJCT0gYXBjaTMyMDBfcmVzZXQsCisJCS5haV9jb25maWcJCT0gYXBjaTMyMDBfYWlfY29uZmlnLAorCQkuYWlfcmVhZAkJPSBhcGNpMzIwMF9haV9yZWFkLAorCQkuYWlfd3JpdGUJCT0gYXBjaTMyMDBfYWlfd3JpdGUsCisJCS5haV9iaXRzCQk9IGFwY2kzMjAwX2FpX2JpdHNfdGVzdCwKKwkJLmFpX2NtZHRlc3QJCT0gYXBjaTMyMDBfYWlfY21kdGVzdCwKKwkJLmFpX2NtZAkJCT0gYXBjaTMyMDBfYWlfY21kLAorCQkuYWlfY2FuY2VsCQk9IGFwY2kzMjAwX2NhbmNlbCwKIAkJLmRpX2JpdHMJCT0gYXBjaTMyMDBfZGlfaW5zbl9iaXRzLAogCQkuZG9fYml0cwkJPSBhcGNpMzIwMF9kb19pbnNuX2JpdHMsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMzUwMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zNTAxLmMKaW5kZXggNGNiNjllYy4uNDliZjFmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zNTAxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zNTAxLmMKQEAgLTM5MCw5ICszOTAsOSBAQAogCXMtPm1heGRhdGEgPSAwOwogCXMtPmxlbl9jaGFubGlzdCA9IDE7CiAJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKLQlzLT5pbnNuX3dyaXRlID0gaV9BUENJMzUwMV9TdGFydFN0b3BXcml0ZVRpbWVyQ291bnRlcldhdGNoZG9nOwotCXMtPmluc25fcmVhZCA9IGlfQVBDSTM1MDFfUmVhZFRpbWVyQ291bnRlcldhdGNoZG9nOwotCXMtPmluc25fY29uZmlnID0gaV9BUENJMzUwMV9Db25maWdUaW1lckNvdW50ZXJXYXRjaGRvZzsKKwlzLT5pbnNuX3dyaXRlID0gYXBjaTM1MDFfd3JpdGVfaW5zbl90aW1lcjsKKwlzLT5pbnNuX3JlYWQgPSBhcGNpMzUwMV9yZWFkX2luc25fdGltZXI7CisJcy0+aW5zbl9jb25maWcgPSBhcGNpMzUwMV9jb25maWdfaW5zbl90aW1lcjsKIAogCS8qIEluaXRpYWxpemUgdGhlIGVlcHJvbSBzdWJkZXZpY2UgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1s0XTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfM3h4eC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zeHh4LmMKaW5kZXggY2VhZGY4ZS4uNmRjMTFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zeHh4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zeHh4LmMKQEAgLTQzNCwxMyArNDM0LDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYXBjaTN4eHhfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgYXBjaTN4eHhfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gcmVhZGwoZGV2cHJpdi0+bW1pbyArIDIwKTsKKwlpZiAoc3RhdHVzICYgMHgxKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IGFwY2kzeHh4X2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAogCQkJCSB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFwY2kzeHh4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IHZhbDsKIAlpbnQgcmV0OwogCWludCBpOwogCkBAIC00NTMsMTAgKzQ2Niw5IEBACiAJCXdyaXRlbCgweDgwMDAwLCBkZXZwcml2LT5tbWlvICsgOCk7CiAKIAkJLyogV2FpdCB0aGUgRU9TICovCi0JCWRvIHsKLQkJCXZhbCA9IHJlYWRsKGRldnByaXYtPm1taW8gKyAyMCk7Ci0JCQl2YWwgJj0gMHgxOwotCQl9IHdoaWxlICghdmFsKTsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBhcGNpM3h4eF9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQkvKiBSZWFkIHRoZSBhbmFsb2cgdmFsdWUgKi8KIAkJZGF0YVtpXSA9IHJlYWRsKGRldnByaXYtPm1taW8gKyAyOCk7CkBAIC02MjIsNiArNjM0LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYXBjaTN4eHhfYW9fZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgYXBjaTN4eHhfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gcmVhZGwoZGV2cHJpdi0+bW1pbyArIDk2KTsKKwlpZiAoc3RhdHVzICYgMHgxMDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgYXBjaTN4eHhfYW9faW5zbl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCkBAIC02MzAsNyArNjU2LDcgQEAKIAlzdHJ1Y3QgYXBjaTN4eHhfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwogCXVuc2lnbmVkIGludCByYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzOworCWludCByZXQ7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CkBAIC02NDEsOSArNjY3LDkgQEAKIAkJd3JpdGVsKChkYXRhW2ldIDw8IDgpIHwgY2hhbiwgZGV2cHJpdi0+bW1pbyArIDEwMCk7CiAKIAkJLyogV2FpdCB0aGUgZW5kIG9mIHRyYW5zZmVyICovCi0JCWRvIHsKLQkJCXN0YXR1cyA9IHJlYWRsKGRldnByaXYtPm1taW8gKyA5Nik7Ci0JCX0gd2hpbGUgKChzdGF0dXMgJiAweDEwMCkgIT0gMHgxMDApOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGFwY2kzeHh4X2FvX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldHVybiBpbnNuLT5uOwpAQCAtNjgwLDcgKzcwNiw3IEBACiAJCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCXVuc2lnbmVkIGludCBtYXNrOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKIAlpbnQgcmV0OwogCiAJLyoKQEAgLTY4OCwxMiArNzE0LDEzIEBACiAJICogUG9ydCAxIChjaGFubmVscyA4LTE1KSBhcmUgYWx3YXlzIG91dHB1dHMKIAkgKiBQb3J0IDIgKGNoYW5uZWxzIDE2LTIzKSBhcmUgcHJvZ3JhbW1hYmxlIGkvbwogCSAqLwotCWlmIChjaGFuIDwgMTYpIHsKLQkJaWYgKGRhdGFbMF0gIT0gSU5TTl9DT05GSUdfRElPX1FVRVJZKQorCWlmIChkYXRhWzBdICE9IElOU05fQ09ORklHX0RJT19RVUVSWSkgeworCQkvKiBpZ25vcmUgYWxsIG90aGVyIGluc3RydWN0aW9ucyBmb3IgcG9ydHMgMCBhbmQgMSAqLworCQlpZiAoY2hhbiA8IDE2KQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfSBlbHNlIHsKLQkJLyogY2hhbmdpbmcgYW55IGNoYW5uZWwgaW4gcG9ydCAyIGNoYW5nZXMgdGhlIGVudGlyZSBwb3J0ICovCi0JCW1hc2sgPSAweGZmMDAwMDsKKwkJZWxzZQorCQkJLyogY2hhbmdpbmcgYW55IGNoYW5uZWwgaW4gcG9ydCAyIGNoYW5nZXMgdGhlIGVudGlyZSBwb3J0ICovCisJCQltYXNrID0gMHhmZjAwMDA7CiAJfQogCiAJcmV0ID0gY29tZWRpX2Rpb19pbnNuX2NvbmZpZyhkZXYsIHMsIGluc24sIGRhdGEsIG1hc2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k2MjA4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTYyMDguYwppbmRleCA1YzE0MTNhLi45MjFmNjk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTYyMDguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTYyMDguYwpAQCAtNzMsMTkgKzczLDE3IEBACiAJdW5zaWduZWQgaW50IGFvX3JlYWRiYWNrW1BDSTYyMDhfTUFYX0FPX0NIQU5ORUxTXTsKIH07CiAKLXN0YXRpYyBpbnQgcGNpNjIwOF9hb193YWl0X2Zvcl9kYXRhX3NlbmQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJIHVuc2lnbmVkIGludCB0aW1lb3V0KQorc3RhdGljIGludCBwY2k2MjA4X2FvX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7CiAJdW5zaWduZWQgaW50IHN0YXR1czsKIAotCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJc3RhdHVzID0gaW53KGRldi0+aW9iYXNlICsgUENJNjIwOF9BT19TVEFUVVMpOwotCQlpZiAoKHN0YXR1cyAmIFBDSTYyMDhfQU9fU1RBVFVTX0RBVEFfU0VORCkgPT0gMCkKLQkJCXJldHVybiAwOwotCQl1ZGVsYXkoMSk7Ci0JfQotCi0JcmV0dXJuIC1FVElNRTsKKwlzdGF0dXMgPSBpbncoZGV2LT5pb2Jhc2UgKyBQQ0k2MjA4X0FPX1NUQVRVUyk7CisJaWYgKChzdGF0dXMgJiBQQ0k2MjA4X0FPX1NUQVRVU19EQVRBX1NFTkQpID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7CiB9CiAKIHN0YXRpYyBpbnQgcGNpNjIwOF9hb19pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC0xMDIsOCArMTAwLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CiAJCXZhbCA9IGRhdGFbaV07CiAKLQkJLyogRC9BIHRyYW5zZmVyIHJhdGUgaXMgMi4ydXMsIHdhaXQgdXAgdG8gMTB1cyAqLwotCQlyZXQgPSBwY2k2MjA4X2FvX3dhaXRfZm9yX2RhdGFfc2VuZChkZXYsIDEwKTsKKwkJLyogRC9BIHRyYW5zZmVyIHJhdGUgaXMgMi4ydXMgKi8KKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBwY2k2MjA4X2FvX2VvYywgMCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTd4M3guYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpN3gzeC5jCmluZGV4IDZmNjIyYjQuLjVlM2NjNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpN3gzeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpN3gzeC5jCkBAIC0yMzksOSArMjM5LDYgQEAKIAkJfQogCX0KIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgYXR0YWNoZWQgKCVkIGlucHV0cy8lZCBvdXRwdXRzKVxuIiwKLQkJZGV2LT5ib2FyZF9uYW1lLCBib2FyZC0+ZGlfbmNoYW4sIGJvYXJkLT5kb19uY2hhbik7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTExLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTEuYwppbmRleCAzNjNmMmU0Li5hMjljZWFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTEuYwpAQCAtODQsNyArODQsNiBAQAogCiAjZGVmaW5lIFBDSTkxMTFfUkFOR0VfU0VUVElOR19ERUxBWQkJMTAKICNkZWZpbmUgUENJOTExMV9BSV9JTlNUQU5UX1JFQURfVURFTEFZX1VTCTIKLSNkZWZpbmUgUENJOTExMV9BSV9JTlNUQU5UX1JFQURfVElNRU9VVAkJMTAwCiAKIC8qCiAgKiBJTyBhZGRyZXNzIG1hcCBhbmQgYml0IGRlZmluZXMKQEAgLTQ5MCwyOSArNDg5LDE4IEBACiAJCWRldi0+aW9iYXNlICsgUENJOTExMV9BSV9SQU5HRV9TVEFUX1JFRyk7CiAKIAkvKiBTZXQgY291bnRlciAqLwotCi0Jc3dpdGNoIChhc3luY19jbWQtPnN0b3Bfc3JjKSB7Ci0JY2FzZSBUUklHX0NPVU5UOgorCWlmIChhc3luY19jbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKIAkJZGV2X3ByaXZhdGUtPnN0b3BfY291bnRlciA9CiAJCSAgICBhc3luY19jbWQtPnN0b3BfYXJnICogYXN5bmNfY21kLT5jaGFubGlzdF9sZW47CiAJCWRldl9wcml2YXRlLT5zdG9wX2lzX25vbmUgPSAwOwotCQlicmVhazsKLQotCWNhc2UgVFJJR19OT05FOgorCX0gZWxzZSB7CS8qIFRSSUdfTk9ORSAqLwogCQlkZXZfcHJpdmF0ZS0+c3RvcF9jb3VudGVyID0gMDsKIAkJZGV2X3ByaXZhdGUtPnN0b3BfaXNfbm9uZSA9IDE7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJY29tZWRpX2Vycm9yKGRldiwgIkludmFsaWQgc3RvcCB0cmlnZ2VyIik7Ci0JCXJldHVybiAtMTsKIAl9CiAKIAkvKiAgU2V0IHRpbWVyIHBhY2VyICovCi0KIAlkZXZfcHJpdmF0ZS0+c2Nhbl9kZWxheSA9IDA7Ci0Jc3dpdGNoIChhc3luY19jbWQtPmNvbnZlcnRfc3JjKSB7Ci0JY2FzZSBUUklHX1RJTUVSOgorCWlmIChhc3luY19jbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKIAkJcGNpOTExMV90cmlnZ2VyX3NvdXJjZV9zZXQoZGV2LCBzb2Z0d2FyZSk7CiAJCXBjaTkxMTFfdGltZXJfc2V0KGRldik7CiAJCXBjaTkxMTFfZmlmb19yZXNldChkZXYpOwpAQCAtNTI4LDExICs1MTYsNyBAQAogCQkJCSAoYXN5bmNfY21kLT5jb252ZXJ0X2FyZyAqCiAJCQkJICBhc3luY19jbWQtPmNoYW5saXN0X2xlbikpIC0gMTsKIAkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBUUklHX0VYVDoKLQorCX0gZWxzZSB7CS8qIFRSSUdfRVhUICovCiAJCXBjaTkxMTFfdHJpZ2dlcl9zb3VyY2Vfc2V0KGRldiwgZXh0ZXJuYWwpOwogCQlwY2k5MTExX2ZpZm9fcmVzZXQoZGV2KTsKIAkJcGNpOTExMV9pbnRlcnJ1cHRfc291cmNlX3NldChkZXYsIGlycV9vbl9maWZvX2hhbGZfZnVsbCwKQEAgLTU0MCwxMSArNTI0LDYgQEAKIAkJcGx4OTA1MF9pbnRlcnJ1cHRfY29udHJvbChkZXZfcHJpdmF0ZS0+bGNyX2lvX2Jhc2UsIHRydWUsIHRydWUsCiAJCQkJCSAgZmFsc2UsIHRydWUsIHRydWUpOwogCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJY29tZWRpX2Vycm9yKGRldiwgIkludmFsaWQgY29udmVydCB0cmlnZ2VyIik7Ci0JCXJldHVybiAtMTsKIAl9CiAKIAlkZXZfcHJpdmF0ZS0+c3RvcF9jb3VudGVyICo9ICgxICsgZGV2X3ByaXZhdGUtPnNjYW5fZGVsYXkpOwpAQCAtNjEzLDkgKzU5Miw4IEBACiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBpcnFfZmxhZ3MpOwogCQkJY29tZWRpX2Vycm9yKGRldiwgUENJOTExMV9EUklWRVJfTkFNRSAiIGZpZm8gb3ZlcmZsb3ciKTsKIAkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0k5MTExX0lOVF9DTFJfUkVHKTsKLQkJCXBjaTkxMTFfYWlfY2FuY2VsKGRldiwgcyk7CiAJCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9FT0E7Ci0JCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAKIAkJCXJldHVybiBJUlFfSEFORExFRDsKIAkJfQpAQCAtNjkzLDIwICs2NzEsMzEgQEAKIAkJfQogCX0KIAotCWlmICgoZGV2X3ByaXZhdGUtPnN0b3BfY291bnRlciA9PSAwKSAmJiAoIWRldl9wcml2YXRlLT5zdG9wX2lzX25vbmUpKSB7CisJaWYgKGRldl9wcml2YXRlLT5zdG9wX2NvdW50ZXIgPT0gMCAmJiAhZGV2X3ByaXZhdGUtPnN0b3BfaXNfbm9uZSkKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwotCQlwY2k5MTExX2FpX2NhbmNlbChkZXYsIHMpOwotCX0KIAogCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0k5MTExX0lOVF9DTFJfUkVHKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGlycV9mbGFncyk7CiAKLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitzdGF0aWMgaW50IHBjaTkxMTFfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgUENJOTExMV9BSV9SQU5HRV9TVEFUX1JFRyk7CisJaWYgKHN0YXR1cyAmIFBDSTkxMTFfQUlfU1RBVF9GRl9FRikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBwY2k5MTExX2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQpAQCAtNzE3LDcgKzcwNiw3IEBACiAJdW5zaWduZWQgaW50IGludmVydCA9IChtYXhkYXRhICsgMSkgPj4gMTsKIAl1bnNpZ25lZCBpbnQgc2hpZnQgPSAobWF4ZGF0YSA9PSAweGZmZmYpID8gMCA6IDQ7CiAJdW5zaWduZWQgaW50IHN0YXR1czsKLQlpbnQgdGltZW91dDsKKwlpbnQgcmV0OwogCWludCBpOwogCiAJb3V0YihjaGFuLCBkZXYtPmlvYmFzZSArIFBDSTkxMTFfQUlfQ0hBTk5FTF9SRUcpOwpAQCAtNzM0LDIyICs3MjMsMTIgQEAKIAkJLyogR2VuZXJhdGUgYSBzb2Z0d2FyZSB0cmlnZ2VyICovCiAJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0k5MTExX1NPRlRfVFJJR19SRUcpOwogCi0JCXRpbWVvdXQgPSBQQ0k5MTExX0FJX0lOU1RBTlRfUkVBRF9USU1FT1VUOwotCi0JCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIFBDSTkxMTFfQUlfUkFOR0VfU1RBVF9SRUcpOwotCQkJLyogJzEnIG1lYW5zIEZJRk8gaXMgbm90IGVtcHR5ICovCi0JCQlpZiAoc3RhdHVzICYgUENJOTExMV9BSV9TVEFUX0ZGX0VGKQotCQkJCWdvdG8gY29udmVyc2lvbl9kb25lOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHBjaTkxMTFfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkgeworCQkJcGNpOTExMV9maWZvX3Jlc2V0KGRldik7CisJCQlyZXR1cm4gcmV0OwogCQl9CiAKLQkJY29tZWRpX2Vycm9yKGRldiwgIkEvRCByZWFkIHRpbWVvdXQiKTsKLQkJZGF0YVtpXSA9IDA7Ci0JCXBjaTkxMTFfZmlmb19yZXNldChkZXYpOwotCQlyZXR1cm4gLUVUSU1FOwotCi1jb252ZXJzaW9uX2RvbmU6Ci0KIAkJZGF0YVtpXSA9IGludyhkZXYtPmlvYmFzZSArIFBDSTkxMTFfQUlfRklGT19SRUcpOwogCQlkYXRhW2ldID0gKChkYXRhW2ldID4+IHNoaWZ0KSAmIG1heGRhdGEpIF4gaW52ZXJ0OwogCX0KQEAgLTkwNiw4ICs4ODUsNiBAQAogCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2RpZ2l0YWw7CiAJcy0+aW5zbl9iaXRzCT0gcGNpOTExMV9kb19pbnNuX2JpdHM7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIGF0dGFjaGVkXG4iLCBkZXYtPmJvYXJkX25hbWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExOC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTE4LmMKaW5kZXggNGJkZDk3Mi4uM2NmYTE3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTE4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTE4LmMKQEAgLTU3MSwxMiArNTcxLDI2IEBACiAJcmV0dXJuIDE7CQkvKiB3ZSBjYW4gc2VydmUgdGhpcyB3aXRoIHNjYW4gbG9naWMgKi8KIH0KIAorc3RhdGljIGludCBwY2k5MTE4X2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGlubChkZXYtPmlvYmFzZSArIFBDSTkxMThfQURTVEFUKTsKKwlpZiAoc3RhdHVzICYgQWRTdGF0dXNfQURyZHkpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgcGNpOTExOF9pbnNuX3JlYWRfYWkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcGNpOTExOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBuLCB0aW1lb3V0OworCWludCByZXQ7CisJaW50IG47CiAKIAlkZXZwcml2LT5BZENvbnRyb2xSZWcgPSBBZENvbnRyb2xfSW50ICYgMHhmZjsKIAlkZXZwcml2LT5BZEZ1bmN0aW9uUmVnID0gQWRGdW5jdGlvbl9QRFRyZyB8IEFkRnVuY3Rpb25fUEVUcmc7CkBAIC01OTcsMTkgKzYxMSwxMyBAQAogCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKIAkJb3V0dygwLCBkZXYtPmlvYmFzZSArIFBDSTkxMThfU09GVFRSRyk7CS8qIHN0YXJ0IGNvbnZlcnNpb24gKi8KIAkJdWRlbGF5KDIpOwotCQl0aW1lb3V0ID0gMTAwOwotCQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCQlpZiAoaW5sKGRldi0+aW9iYXNlICsgUENJOTExOF9BRFNUQVQpICYgQWRTdGF0dXNfQURyZHkpCi0JCQkJZ290byBjb252X2ZpbmlzaDsKLQkJCXVkZWxheSgxKTsKKworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHBjaTkxMThfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkgeworCQkJb3V0bCgwLCBkZXYtPmlvYmFzZSArIFBDSTkxMThfREVMRklGTyk7CS8qIGZsdXNoIEZJRk8gKi8KKwkJCXJldHVybiByZXQ7CiAJCX0KIAotCQljb21lZGlfZXJyb3IoZGV2LCAiQS9EIGluc24gdGltZW91dCIpOwotCQlkYXRhW25dID0gMDsKLQkJb3V0bCgwLCBkZXYtPmlvYmFzZSArIFBDSTkxMThfREVMRklGTyk7CS8qIGZsdXNoIEZJRk8gKi8KLQkJcmV0dXJuIC1FVElNRTsKLQotY29udl9maW5pc2g6CiAJCWlmIChkZXZwcml2LT5haTE2Yml0cykgewogCQkJZGF0YVtuXSA9CiAJCQkgICAgKGlubChkZXYtPmlvYmFzZSArCkBAIC05MTEsOCArOTE5LDcgQEAKIAl9CiAJaWYgKG0gJiBkZXZwcml2LT5haV9tYXNraGFyZGVycikgewogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9FT0E7Ci0JCXBjaTkxMThfYWlfY2FuY2VsKGRldiwgcyk7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQlyZXR1cm4gMTsKIAl9CiAKQEAgLTk0OCw4ICs5NTUsNiBAQAogCXN0cnVjdCBwY2k5MTE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgc2hvcnQgc2FtcGw7CiAKLQlzLT5hc3luYy0+ZXZlbnRzID0gMDsKLQogCWlmIChpbnRfYWRzdGF0ICYgZGV2cHJpdi0+YWlfbWFza2VycikKIAkJaWYgKHBjaTkxMThfZGVjb2RlX2Vycm9yX3N0YXR1cyhkZXYsIHMsIGludF9hZHN0YXQpKQogCQkJcmV0dXJuOwpAQCAtOTY1LDggKzk3MCw3IEBACiAJCQkJIHNhbXBsICYgMHgwMDBmLAogCQkJCSBkZXZwcml2LT5jaGFubGlzdFtzLT5hc3luYy0+Y3VyX2NoYW5dKTsKIAkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SIHwgQ09NRURJX0NCX0VPQTsKLQkJCXBjaTkxMThfYWlfY2FuY2VsKGRldiwgcyk7Ci0JCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC05NzcsMTYgKzk4MSwxNCBAQAogCQkJCQkJCS8qIG9uZSBzY2FuIGRvbmUgKi8KIAkJcy0+YXN5bmMtPmN1cl9jaGFuICU9IGRldnByaXYtPmFpX25fc2NhbmxlbjsKIAkJZGV2cHJpdi0+YWlfYWN0X3NjYW4rKzsKLQkJaWYgKCEoZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcpKQotCQkJaWYgKGRldnByaXYtPmFpX2FjdF9zY2FuID49IGRldnByaXYtPmFpX3NjYW5zKSB7Ci0JCQkJCQkJLyogYWxsIGRhdGEgc2FtcGxlZCAqLwotCQkJCXBjaTkxMThfYWlfY2FuY2VsKGRldiwgcyk7CisJCWlmICghZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcpIHsKKwkJCS8qIGFsbCBkYXRhIHNhbXBsZWQ/ICovCisJCQlpZiAoZGV2cHJpdi0+YWlfYWN0X3NjYW4gPj0gZGV2cHJpdi0+YWlfc2NhbnMpCiAJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwotCQkJfQorCQl9CiAJfQogCi0JaWYgKHMtPmFzeW5jLT5ldmVudHMpCi0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiB9CiAKIHN0YXRpYyB2b2lkIGludGVycnVwdF9wY2k5MTE4X2FpX2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtMTAwMSwxNiArMTAwMywxNCBAQAogCWlmIChpbnRfYW1jYyAmIE1BU1RFUl9BQk9SVF9JTlQpIHsKIAkJY29tZWRpX2Vycm9yKGRldiwgIkFNQ0MgSVJRIC0gTUFTVEVSIERNQSBBQk9SVCEiKTsKIAkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOwotCQlwY2k5MTE4X2FpX2NhbmNlbChkZXYsIHMpOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChpbnRfYW1jYyAmIFRBUkdFVF9BQk9SVF9JTlQpIHsKIAkJY29tZWRpX2Vycm9yKGRldiwgIkFNQ0MgSVJRIC0gVEFSR0VUIERNQSBBQk9SVCEiKTsKIAkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOwotCQlwY2k5MTE4X2FpX2NhbmNlbChkZXYsIHMpOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoaW50X2Fkc3RhdCAmIGRldnByaXYtPmFpX21hc2tlcnIpCkBAIC0xMDQ4LDEyICsxMDQ4LDExIEBACiAJCW0gPSBtIC0gc2FtcGxzOwkJLyogbT0gaG93IG1hbnkgc2FtcGxlcyB3YXMgdHJhbnNmZXJyZWQgKi8KIAl9CiAKLQlpZiAoIWRldnByaXYtPmFpX25ldmVyZW5kaW5nKQotCQlpZiAoZGV2cHJpdi0+YWlfYWN0X3NjYW4gPj0gZGV2cHJpdi0+YWlfc2NhbnMpIHsKLQkJCQkJCQkvKiBhbGwgZGF0YSBzYW1wbGVkICovCi0JCQlwY2k5MTE4X2FpX2NhbmNlbChkZXYsIHMpOworCWlmICghZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcpIHsKKwkJLyogYWxsIGRhdGEgc2FtcGxlZD8gKi8KKwkJaWYgKGRldnByaXYtPmFpX2FjdF9zY2FuID49IGRldnByaXYtPmFpX3NjYW5zKQogCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwotCQl9CisJfQogCiAJaWYgKGRldnByaXYtPmRtYV9kb3VibGVidWYpIHsJLyogc3dpdGNoIGRtYSBidWZmZXJzICovCiAJCWRldnByaXYtPmRtYV9hY3RidWYgPSAxIC0gZGV2cHJpdi0+ZG1hX2FjdGJ1ZjsKQEAgLTEwNjYsNyArMTA2NSw3IEBACiAJCQlpbnRlcnJ1cHRfcGNpOTExOF9haV9tb2RlNF9zd2l0Y2goZGV2KTsKIAl9CiAKLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgaW50ZXJydXB0X3BjaTkxMTgoaW50IGlycSwgdm9pZCAqZCkKQEAgLTE5MzYsMjggKzE5MzUsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBwY2k5MTE4X3JlcG9ydF9hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gY29tZWRpX3RvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgcGNpOTExOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWNoYXIgaXJxYnVmWzMwXTsKLQljaGFyIG11eGJ1ZlszMF07Ci0KLQlpZiAoaXJxKQotCQlzbnByaW50ZihpcnFidWYsIHNpemVvZihpcnFidWYpLCAiaXJxICV1JXMiLCBpcnEsCi0JCQkgKGRldi0+aXJxID8gIiIgOiAiIFVOQVZBSUxBQkxFIikpOwotCWVsc2UKLQkJc25wcmludGYoaXJxYnVmLCBzaXplb2YoaXJxYnVmKSwgImlycSBESVNBQkxFRCIpOwotCWlmIChkZXZwcml2LT51c2VtdXgpCi0JCXNucHJpbnRmKG11eGJ1Ziwgc2l6ZW9mKG11eGJ1ZiksICJleHQgbXV4ICV1IGNoYW5zIiwKLQkJCSBkZXZwcml2LT51c2VtdXgpOwotCWVsc2UKLQkJc25wcmludGYobXV4YnVmLCBzaXplb2YobXV4YnVmKSwgIm5vIGV4dCBtdXgiKTsKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIChwY2kgJXMsICVzLCAlc2J1cyBtYXN0ZXIsICVzKSBhdHRhY2hlZFxuIiwKLQkJIGRldi0+Ym9hcmRfbmFtZSwgcGNpX25hbWUocGNpZGV2KSwgaXJxYnVmLAotCQkgKGRldnByaXYtPm1hc3RlciA/ICIiIDogIm5vICIpLCBtdXhidWYpOwotfQotCiBzdGF0aWMgaW50IHBjaTkxMThfY29tbW9uX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBpbnQgZGlzYWJsZV9pcnEsCiAJCQkJIGludCBtYXN0ZXIsIGludCBleHRfbXV4LCBpbnQgc29mdHNzaGRlbGF5LAogCQkJCSBpbnQgaHdfZXJyX21hc2spCkBAIC0yMTEzLDcgKzIwOTAsNiBAQAogCQlicmVhazsKIAl9CiAKLQlwY2k5MTE4X3JlcG9ydF9hdHRhY2goZGV2LCBkZXYtPmlycSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHExMmIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHExMmIuYwppbmRleCAzMTkwZWY3Li5iNGVhMzc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRxMTJiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkcTEyYi5jCkBAIC05NCw4ICs5NCw2IEBACiAvKiBtYXNrIG9mIHRoZSBiaXQgYXQgU1RJTlIgdG8gY2hlY2sgZW5kIG9mIGNvbnZlcnNpb24gKi8KICNkZWZpbmUgQURRMTJCX0VPQyAgICAgMHgyMAogCi0jZGVmaW5lIFRJTUVPVVQgICAgICAgIDIwCi0KIC8qIGF2YWlsYWJsZSByYW5nZXMgdGhyb3VnaCB0aGUgUEdBIGdhaW5zICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYWRxMTJiX2FpX2JpcG9sYXIgPSB7CiAJNCwgewpAQCAtMTIyLDE5ICsxMjAsMjggQEAKIAlpbnQgbGFzdF9yYW5nZTsKIH07CiAKLS8qCi0gKiAiaW5zdHJ1Y3Rpb25zIiByZWFkL3dyaXRlIGRhdGEgaW4gIm9uZS1zaG90IiBvciAic29mdHdhcmUtdHJpZ2dlcmVkIgotICogbW9kZS4KLSAqLworc3RhdGljIGludCBhZHExMmJfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIEFEUTEyQl9TVElOUik7CisJaWYgKHN0YXR1cyAmIEFEUTEyQl9FT0MpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CiAKIHN0YXRpYyBpbnQgYWRxMTJiX2FpX3JpbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAogCQkJICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZHExMmJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgbiwgaTsKKwlpbnQgbjsKIAlpbnQgcmFuZ2UsIGNoYW5uZWw7CiAJdW5zaWduZWQgY2hhciBoaSwgbG8sIHN0YXR1czsKKwlpbnQgcmV0OwogCiAJLyogY2hhbmdlIGNoYW5uZWwgYW5kIHJhbmdlIG9ubHkgaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIHByZXZpb3VzICovCiAJcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CkBAIC0xNTEsMTMgKzE1OCw5IEBACiAJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewogCiAJCS8qIHdhaXQgZm9yIGVuZCBvZiBjb252ZXJzaW9uICovCi0JCWkgPSAwOwotCQlkbyB7Ci0JCQkvKiB1ZGVsYXkoMSk7ICovCi0JCQlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBBRFExMkJfU1RJTlIpOwotCQkJc3RhdHVzID0gc3RhdHVzICYgQURRMTJCX0VPQzsKLQkJfSB3aGlsZSAoc3RhdHVzID09IDAgJiYgKytpIDwgVElNRU9VVCk7Ci0JCS8qIH0gd2hpbGUgKCsraSA8IDEwKTsgKi8KKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBhZHExMmJfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKIAkJLyogcmVhZCBkYXRhICovCiAJCWhpID0gaW5iKGRldi0+aW9iYXNlICsgQURRMTJCX0FESElHKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpMTcxMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzEwLmMKaW5kZXggZDlhZDJjMC4uMjhlYzQ4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzEwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzEwLmMKQEAgLTQyOSwxNSArNDI5LDI2IEBACiAJb3V0dyhkZXZwcml2LT5haV9ldF9NdXhWYWwsIGRldi0+aW9iYXNlICsgUENJMTcxeF9NVVgpOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLworc3RhdGljIGludCBwY2kxNzF4X2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIFBDSTE3MXhfU1RBVFVTKTsKKwlpZiAoKHN0YXR1cyAmIFN0YXR1c19GRSkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBwY2kxNzF4X2luc25fcmVhZF9haShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBwY2kxNzEwX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IG4sIHRpbWVvdXQ7CisJaW50IHJldDsKKwlpbnQgbjsKICNpZmRlZiBQQ0kxNzF4X1BBUkFOT0lEQ0hFQ0sKIAljb25zdCBzdHJ1Y3QgYm9hcmR0eXBlICp0aGlzX2JvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CiAJdW5zaWduZWQgaW50IGlkYXRhOwpAQCAtNDUzLDE5ICs0NjQsMTQgQEAKIAogCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKIAkJb3V0dygwLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfU09GVFRSRyk7CS8qIHN0YXJ0IGNvbnZlcnNpb24gKi8KLQkJLyogdWRlbGF5KDEpOyAqLwotCQl0aW1lb3V0ID0gMTAwOwotCQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCQlpZiAoIShpbncoZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X1NUQVRVUykgJiBTdGF0dXNfRkUpKQotCQkJCWdvdG8gY29udl9maW5pc2g7Ci0JCX0KLQkJY29tZWRpX2Vycm9yKGRldiwgIkEvRCBpbnNuIHRpbWVvdXQiKTsKLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ0xSRklGTyk7Ci0JCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X0NMUklOVCk7Ci0JCWRhdGFbbl0gPSAwOwotCQlyZXR1cm4gLUVUSU1FOwogCi1jb252X2ZpbmlzaDoKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBwY2kxNzF4X2FpX2VvYywgMCk7CisJCWlmIChyZXQpIHsKKwkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X0NMUkZJRk8pOworCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ0xSSU5UKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwogI2lmZGVmIFBDSTE3MXhfUEFSQU5PSURDSEVDSwogCQlpZGF0YSA9IGludyhkZXYtPmlvYmFzZSArIFBDSTE3MXhfQURfREFUQSk7CiAJCWlmICh0aGlzX2JvYXJkLT5jYXJkdHlwZSAhPSBUWVBFX1BDSTE3MTMpCkBAIC03NTMsMTcgKzc1OSwxNSBAQAogCW0gPSBpbncoZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X1NUQVRVUyk7CiAJaWYgKG0gJiBTdGF0dXNfRkUpIHsKIAkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIkEvRCBGSUZPIGVtcHR5ICglNHgpXG4iLCBtKTsKLQkJcGNpMTcxeF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAobSAmIFN0YXR1c19GRikgewogCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LAogCQkJIkEvRCBGSUZPIEZ1bGwgc3RhdHVzIChGYXRhbCBFcnJvciEpICglNHgpXG4iLCBtKTsKLQkJcGNpMTcxeF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNzgyLDEwICs3ODYsOSBAQAogCQkJCSAgICAgIGFjdF9jaGFubGlzdFtzLT4KIAkJCQkJCSAgIGFzeW5jLT5jdXJfY2hhbl0gJiAweGYwMDApID4+CiAJCQkJICAgICAxMik7Ci0JCQkJcGNpMTcxeF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9CiAJCQkJICAgIENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCQkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCBzYW1wbCAmIDB4MGZmZik7CkBAIC04MDQsOSArODA3LDggQEAKIAkJCWlmICgoIWRldnByaXYtPm5ldmVyZW5kaW5nX2FpKSAmJgogCQkJICAgIChkZXZwcml2LT5haV9hY3Rfc2NhbiA+PSBkZXZwcml2LT5haV9zY2FucykpIHsKIAkJCQkvKiAgYWxsIGRhdGEgc2FtcGxlZCAqLwotCQkJCXBjaTE3MXhfYWlfY2FuY2VsKGRldiwgcyk7CiAJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwotCQkJCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQkJCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAJCQkJcmV0dXJuOwogCQkJfQogCQl9CkBAIC04MTQsNyArODE2LDcgQEAKIAogCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X0NMUklOVCk7CS8qICBjbGVhciBvdXIgSU5UIHJlcXVlc3QgKi8KIAotCWNvbWVkaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiB9CiAKIC8qCkBAIC04NDIsMTAgKzg0NCw5IEBACiAJCQkJCShkZXZwcml2LT5hY3RfY2hhbmxpc3Rbal0gJiAweGYwMDApID4+IDEyLAogCQkJCQlpLCBqLCBkZXZwcml2LT5haV9hY3Rfc2NhbiwgbiwgdHVybiwKIAkJCQkJc2FtcGwpOwotCQkJCXBjaTE3MXhfYWlfY2FuY2VsKGRldiwgcyk7CiAJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PQogCQkJCSAgICBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOwotCQkJCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQkJCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAJCQkJcmV0dXJuIDE7CiAJCQl9CiAJCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCBzYW1wbCAmIDB4MGZmZik7CkBAIC04NzcsMTcgKzg3OCwxNSBAQAogCW0gPSBpbncoZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X1NUQVRVUyk7CiAJaWYgKCEobSAmIFN0YXR1c19GSCkpIHsKIAkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIkEvRCBGSUZPIG5vdCBoYWxmIGZ1bGwhICglNHgpXG4iLCBtKTsKLQkJcGNpMTcxeF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAobSAmIFN0YXR1c19GRikgewogCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LAogCQkJIkEvRCBGSUZPIEZ1bGwgc3RhdHVzIChGYXRhbCBFcnJvciEpICglNHgpXG4iLCBtKTsKLQkJcGNpMTcxeF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtOTA3LDE0ICs5MDYsMTMgQEAKIAlpZiAoIWRldnByaXYtPm5ldmVyZW5kaW5nX2FpKQogCQlpZiAoZGV2cHJpdi0+YWlfYWN0X3NjYW4gPj0gZGV2cHJpdi0+YWlfc2NhbnMpIHsgLyogYWxsIGRhdGEKIAkJCQkJCQkJICAgIHNhbXBsZWQgKi8KLQkJCXBjaTE3MXhfYWlfY2FuY2VsKGRldiwgcyk7CiAJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAJCQlyZXR1cm47CiAJCX0KIAlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENJMTcxeF9DTFJJTlQpOwkvKiAgY2xlYXIgb3VyIElOVCByZXF1ZXN0ICovCiAKLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogfQogCiAvKgpAQCAtMTM1NCw5ICsxMzUyLDYgQEAKIAkJc3ViZGV2Kys7CiAJfQogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlcyBhdHRhY2hlZCwgaXJxICVzYWJsZWRcbiIsCi0JCWRldi0+Ym9hcmRfbmFtZSwgZGV2LT5pcnEgPyAiZW4iIDogImRpcyIpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpMTcyMy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzIzLmMKaW5kZXggNzIzOTQyNi4uMDdiMTA3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzIzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzIzLmMKQEAgLTI4MCw4ICsyODAsNiBAQAogCiAJcGNpMTcyM19yZXNldChkZXYpOwogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlcyBhdHRhY2hlZFxuIiwgZGV2LT5ib2FyZF9uYW1lKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaV9kaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpX2Rpby5jCmluZGV4IGQ0YmQ2MWQuLjJkOTY2YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpX2Rpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpX2Rpby5jCkBAIC0xMTMwLDEwICsxMTMwLDEyIEBACiAJZm9yIChpID0gMDsgaSA8IE1BWF9ESU9fU1VCREVWRzsgaSsrKQogCQlmb3IgKGogPSAwOyBqIDwgdGhpc19ib2FyZC0+c2Rpb1tpXS5yZWdzOyBqKyspIHsKIAkJCXMgPSAmZGV2LT5zdWJkZXZpY2VzW3N1YmRldl07Ci0JCQlzdWJkZXZfODI1NV9pbml0KGRldiwgcywgTlVMTCwKLQkJCQkJIGRldi0+aW9iYXNlICsKLQkJCQkJIHRoaXNfYm9hcmQtPnNkaW9baV0uYWRkciArCi0JCQkJCSBTSVpFXzgyNTUgKiBqKTsKKwkJCXJldCA9IHN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBOVUxMLAorCQkJCQkgICAgICAgZGV2LT5pb2Jhc2UgKworCQkJCQkgICAgICAgdGhpc19ib2FyZC0+c2Rpb1tpXS5hZGRyICsKKwkJCQkJICAgICAgIFNJWkVfODI1NSAqIGopOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OwogCQkJc3ViZGV2Kys7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fpb19haW8xMl84LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWlvX2FpbzEyXzguYwppbmRleCA2OGMzZmIzLi4zMjQ3NDZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWlvX2FpbzEyXzguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWlvX2FpbzEyXzguYwpAQCAtMTAxLDE0ICsxMDEsMjcgQEAKIAl1bnNpZ25lZCBpbnQgYW9fcmVhZGJhY2tbNF07CiB9OwogCitzdGF0aWMgaW50IGFpb19haW8xMl84X2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIEFJTzEyXzhfU1RBVFVTX1JFRyk7CisJaWYgKHN0YXR1cyAmIEFJTzEyXzhfU1RBVFVTX0FEQ19FT0MpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgYWlvX2FpbzEyXzhfYWlfcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJdW5zaWduZWQgaW50IHJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOwotCXVuc2lnbmVkIGludCB2YWw7CiAJdW5zaWduZWQgY2hhciBjb250cm9sOworCWludCByZXQ7CiAJaW50IG47CiAKIAkvKgpAQCAtMTIyLDIwICsxMzUsMTMgQEAKIAlpbmIoZGV2LT5pb2Jhc2UgKyBBSU8xMl84X1NUQVRVU19SRUcpOwogCiAJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewotCQlpbnQgdGltZW91dCA9IDU7Ci0KIAkJLyogIFNldHVwIGFuZCBzdGFydCBjb252ZXJzaW9uICovCiAJCW91dGIoY29udHJvbCwgZGV2LT5pb2Jhc2UgKyBBSU8xMl84X0FEQ19SRUcpOwogCiAJCS8qICBXYWl0IGZvciBjb252ZXJzaW9uIHRvIGNvbXBsZXRlICovCi0JCWRvIHsKLQkJCXZhbCA9IGluYihkZXYtPmlvYmFzZSArIEFJTzEyXzhfU1RBVFVTX1JFRyk7Ci0JCQl0aW1lb3V0LS07Ci0JCQlpZiAodGltZW91dCA9PSAwKSB7Ci0JCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIkFEQyB0aW1lb3V0XG4iKTsKLQkJCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQkJCX0KLQkJfSB3aGlsZSAoISh2YWwgJiBBSU8xMl84X1NUQVRVU19BRENfRU9DKSk7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgYWlvX2FpbzEyXzhfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKIAkJZGF0YVtuXSA9IGludyhkZXYtPmlvYmFzZSArIEFJTzEyXzhfQURDX1JFRykgJiBzLT5tYXhkYXRhOwogCX0KQEAgLTI0Nyw5ICsyNTMsNiBAQAogCS8qIDgyNTQgY291bnRlci90aW1lciBzdWJkZXZpY2UgKi8KIAlzLT50eXBlCQk9IENPTUVESV9TVUJEX1VOVVNFRDsKIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXM6ICVzIGF0dGFjaGVkXG4iLAotCQlkZXYtPmRyaXZlci0+ZHJpdmVyX25hbWUsIGRldi0+Ym9hcmRfbmFtZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fpb19paXJvXzE2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWlvX2lpcm9fMTYuYwppbmRleCAyMmIzZGRhLi43ODExMDRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWlvX2lpcm9fMTYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWlvX2lpcm9fMTYuYwpAQCAtOTgsNyArOTgsNyBAQAogCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CiAJcy0+aW5zbl9iaXRzID0gYWlvX2lpcm9fMTZfZGlvX2luc25fYml0c19yZWFkOwogCi0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY29tZWRpX2RyaXZlciBhaW9faWlyb18xNl9kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfZGlvMjAwX2NvbW1vbi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX2RpbzIwMF9jb21tb24uYwppbmRleCA5Yzk1NTlmLi44MThhMGQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfZGlvMjAwX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19kaW8yMDBfY29tbW9uLmMKQEAgLTEyMDgsNyArMTIwOCw3IEBACiAJCQkJICJ3YXJuaW5nISBpcnEgJXUgdW5hdmFpbGFibGUhXG4iLCBpcnEpOwogCQl9CiAJfQotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiYXR0YWNoZWRcbiIpOworCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhbXBsY19kaW8yMDBfY29tbW9uX2F0dGFjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGMyMzYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wYzIzNi5jCmluZGV4IDMxNzM0ZTEuLmIyMWQ3YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wYzIzNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wYzIzNi5jCkBAIC0zNjgsMzIgKzM2OCw2IEBACiAJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7CiB9CiAKLXN0YXRpYyB2b2lkIHBjMjM2X3JlcG9ydF9hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlycSkKLXsKLQljb25zdCBzdHJ1Y3QgcGMyMzZfYm9hcmQgKnRoaXNib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwotCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjb21lZGlfdG9fcGNpX2RldihkZXYpOwotCWNoYXIgdG1wYnVmWzYwXTsKLQlpbnQgdG1wbGVuOwotCi0JaWYgKGlzX2lzYV9ib2FyZCh0aGlzYm9hcmQpKQotCQl0bXBsZW4gPSBzY25wcmludGYodG1wYnVmLCBzaXplb2YodG1wYnVmKSwKLQkJCQkgICAiKGJhc2UgJSNseCkgIiwgZGV2LT5pb2Jhc2UpOwotCWVsc2UgaWYgKGlzX3BjaV9ib2FyZCh0aGlzYm9hcmQpKQotCQl0bXBsZW4gPSBzY25wcmludGYodG1wYnVmLCBzaXplb2YodG1wYnVmKSwKLQkJCQkgICAiKHBjaSAlcykgIiwgcGNpX25hbWUocGNpZGV2KSk7Ci0JZWxzZQotCQl0bXBsZW4gPSAwOwotCWlmIChpcnEpCi0JCXRtcGxlbiArPSBzY25wcmludGYoJnRtcGJ1Zlt0bXBsZW5dLCBzaXplb2YodG1wYnVmKSAtIHRtcGxlbiwKLQkJCQkgICAgIihpcnEgJXUlcykgIiwgaXJxLAotCQkJCSAgICAoZGV2LT5pcnEgPyAiIiA6ICIgVU5BVkFJTEFCTEUiKSk7Ci0JZWxzZQotCQl0bXBsZW4gKz0gc2NucHJpbnRmKCZ0bXBidWZbdG1wbGVuXSwgc2l6ZW9mKHRtcGJ1ZikgLSB0bXBsZW4sCi0JCQkJICAgICIobm8gaXJxKSAiKTsKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzICVzYXR0YWNoZWRcbiIsCi0JCSBkZXYtPmJvYXJkX25hbWUsIHRtcGJ1Zik7Ci19Ci0KIHN0YXRpYyBpbnQgcGMyMzZfY29tbW9uX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGlvYmFzZSwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBsb25nIHJlcV9pcnFfZmxhZ3MpCiB7CkBAIC00MTEsMTAgKzM4NSw5IEBACiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMF07CiAJLyogZGlnaXRhbCBpL28gc3ViZGV2aWNlICg4MjU1KSAqLwogCXJldCA9IHN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBOVUxMLCBpb2Jhc2UpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJlcnJvciEgb3V0IG9mIG1lbW9yeSFcbiIpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JfQorCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMV07CiAJZGV2LT5yZWFkX3N1YmRldiA9IHM7CiAJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKQEAgLTQzNCw4ICs0MDcsOCBAQAogCQkJcy0+Y2FuY2VsID0gcGMyMzZfaW50cl9jYW5jZWw7CiAJCX0KIAl9Ci0JcGMyMzZfcmVwb3J0X2F0dGFjaChkZXYsIGlycSk7Ci0JcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBwYzIzNl9wY2lfY29tbW9uX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjMjYzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGMyNjMuYwppbmRleCA1YjRiNWFiLi43YzEwZDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGMyNjMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGMyNjMuYwpAQCAtOTQsOCArOTQsNiBAQAogCS8qIHJlYWQgaW5pdGlhbCByZWxheSBzdGF0ZSAqLwogCXMtPnN0YXRlID0gaW5iKGRldi0+aW9iYXNlKSB8IChpbmIoZGV2LT5pb2Jhc2UgKyAxKSA8PCA4KTsKIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgKGJhc2UgJSNseCkgYXR0YWNoZWRcbiIsIGRldi0+Ym9hcmRfbmFtZSwKLQkJIGRldi0+aW9iYXNlKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIyNC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIyNC5jCmluZGV4IGFlNDA0OGEuLjI5ZTAxZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMjQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjI0LmMKQEAgLTUzMyw5ICs1MzMsOCBAQAogCXNldF9iaXQoQU9fQ01EX1NUQVJURUQsICZkZXZwcml2LT5zdGF0ZSk7CiAJaWYgKCFkZXZwcml2LT5hb19zdG9wX2NvbnRpbnVvdXMgJiYgZGV2cHJpdi0+YW9fc3RvcF9jb3VudCA9PSAwKSB7CiAJCS8qIEFuIGVtcHR5IGFjcXVpc2l0aW9uISAqLwotCQlwY2kyMjRfYW9fc3RvcChkZXYsIHMpOwogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCX0gZWxzZSB7CiAJCS8qIEVuYWJsZSBpbnRlcnJ1cHRzLiAqLwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2cHJpdi0+YW9fc3BpbmxvY2ssIGZsYWdzKTsKQEAgLTU4NSw5ICs1ODQsOCBAQAogCQlyb29tID0gUENJMjI0X0ZJRk9fUk9PTV9FTVBUWTsKIAkJaWYgKCFkZXZwcml2LT5hb19zdG9wX2NvbnRpbnVvdXMgJiYgZGV2cHJpdi0+YW9fc3RvcF9jb3VudCA9PSAwKSB7CiAJCQkvKiBGSUZPIGVtcHR5IGF0IGVuZCBvZiBjb3VudGVkIGFjcXVpc2l0aW9uLiAqLwotCQkJcGNpMjI0X2FvX3N0b3AoZGV2LCBzKTsKIAkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQkJCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJCXJldHVybjsKIAkJfQogCQlicmVhazsKQEAgLTYwNSw5ICs2MDMsOCBAQAogCQkvKiBGSUZPIGlzIGxlc3MgdGhhbiBoYWxmLWZ1bGwuICovCiAJCWlmIChudW1fc2NhbnMgPT0gMCkgewogCQkJLyogTm90aGluZyBsZWZ0IHRvIHB1dCBpbiB0aGUgRklGTy4gKi8KLQkJCXBjaTIyNF9hb19zdG9wKGRldiwgcyk7Ci0JCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKIAkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJBTyBidWZmZXIgdW5kZXJydW5cbiIpOworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfT1ZFUkZMT1c7CiAJCX0KIAl9CiAJLyogRGV0ZXJtaW5lIGhvdyBtYW55IG5ldyBzY2FucyBjYW4gYmUgcHV0IGluIHRoZSBGSUZPLiAqLwpAQCAtNjcwLDkgKzY2Nyw4IEBACiAJCQkJCSAgUENJMjI0X0RBQ0NPTl9UUklHX01BU0spOwogCQlvdXR3KGRldnByaXYtPmRhY2NvbiwgZGV2LT5pb2Jhc2UgKyBQQ0kyMjRfREFDQ09OKTsKIAl9Ci0JaWYgKHMtPmFzeW5jLT5ldmVudHMpCi0JCWNvbWVkaV9ldmVudChkZXYsIHMpOwogCisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIH0KIAogLyoKQEAgLTEyMzcsMjAgKzEyMzMsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBwY2kyMjRfcmVwb3J0X2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjb21lZGlfdG9fcGNpX2RldihkZXYpOwotCWNoYXIgdG1wYnVmWzMwXTsKLQotCWlmIChpcnEpCi0JCXNucHJpbnRmKHRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZiksICJpcnEgJXUlcyIsIGlycSwKLQkJCSAoZGV2LT5pcnEgPyAiIiA6ICIgVU5BVkFJTEFCTEUiKSk7Ci0JZWxzZQotCQlzbnByaW50Zih0bXBidWYsIHNpemVvZih0bXBidWYpLCAibm8gaXJxIik7Ci0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlcyAocGNpICVzKSAoJXMpIGF0dGFjaGVkXG4iLAotCQkgZGV2LT5ib2FyZF9uYW1lLCBwY2lfbmFtZShwY2lkZXYpLCB0bXBidWYpOwotfQotCiAvKgogICogQ29tbW9uIHBhcnQgb2YgYXR0YWNoIGFuZCBhdXRvX2F0dGFjaC4KICAqLwpAQCAtMTM5OSw4ICsxMzgxLDcgQEAKIAkJfQogCX0KIAotCXBjaTIyNF9yZXBvcnRfYXR0YWNoKGRldiwgaXJxKTsKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBwY2kyMjRfYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMzAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMzAuYwppbmRleCBjMDhkZmJiLi45OWU2MDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjMwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIzMC5jCkBAIC03OTksMTkgKzc5OSwyOSBAQAogCS8qIENvdW50ZXIgY3QsIDgyNTQgbW9kZSAxLCBpbml0aWFsIGNvdW50IG5vdCB3cml0dGVuLiAqLwogfQogCi0vKgotICogIENPTUVESV9TVUJEX0FJIGluc3RydWN0aW9uOwotICovCitzdGF0aWMgaW50IHBjaTIzMF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbncoZGV2LT5pb2Jhc2UgKyBQQ0kyMzBfQURDQ09OKTsKKwlpZiAoKHN0YXR1cyAmIFBDSTIzMF9BRENfRklGT19FTVBUWSkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBwY2kyMzBfYWlfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCiAJCQkgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IHBjaTIzMF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCBuLCBpOworCXVuc2lnbmVkIGludCBuOwogCXVuc2lnbmVkIGludCBjaGFuLCByYW5nZSwgYXJlZjsKIAl1bnNpZ25lZCBpbnQgZ2FpbnNoaWZ0OwotCXVuc2lnbmVkIGludCBzdGF0dXM7CiAJdW5zaWduZWQgc2hvcnQgYWRjY29uLCBhZGNlbjsKKwlpbnQgcmV0OwogCiAJLyogVW5wYWNrIGNoYW5uZWwgYW5kIHJhbmdlLiAqLwogCWNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKQEAgLTg4MywxOCArODkzLDEwIEBACiAJCWk4MjU0X3NldF9tb2RlKGRldnByaXYtPmlvYmFzZTEgKyBQQ0kyMzBfWjJfQ1RfQkFTRSwgMCwgMiwKIAkJCSAgICAgICBJODI1NF9NT0RFMSk7CiAKLSNkZWZpbmUgVElNRU9VVCAxMDAKIAkJLyogd2FpdCBmb3IgY29udmVyc2lvbiB0byBlbmQgKi8KLQkJZm9yIChpID0gMDsgaSA8IFRJTUVPVVQ7IGkrKykgewotCQkJc3RhdHVzID0gaW53KGRldi0+aW9iYXNlICsgUENJMjMwX0FEQ0NPTik7Ci0JCQlpZiAoIShzdGF0dXMgJiBQQ0kyMzBfQURDX0ZJRk9fRU1QVFkpKQotCQkJCWJyZWFrOwotCQkJdWRlbGF5KDEpOwotCQl9Ci0JCWlmIChpID09IFRJTUVPVVQpIHsKLQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJ0aW1lb3V0XG4iKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCQl9CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcGNpMjMwX2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCS8qIHJlYWQgZGF0YSAqLwogCQlkYXRhW25dID0gcGNpMjMwX2FpX3JlYWQoZGV2KTsKQEAgLTI3NjIsMTQgKzI3NjQsMTQgQEAKIAkvKiBkaWdpdGFsIGkvbyBzdWJkZXZpY2UgKi8KIAlpZiAodGhpc2JvYXJkLT5oYXZlX2RpbykgewogCQlyYyA9IHN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBOVUxMLAotCQkJCSAgICAgIChkZXZwcml2LT5pb2Jhc2UxICsgUENJMjMwX1BQSV9YX0JBU0UpKTsKLQkJaWYgKHJjIDwgMCkKKwkJCQkgICAgICBkZXZwcml2LT5pb2Jhc2UxICsgUENJMjMwX1BQSV9YX0JBU0UpOworCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7CiAJfSBlbHNlIHsKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKIAl9Ci0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICJhdHRhY2hlZFxuIik7Ci0JcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBwY2kyMzBfYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyNjMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyNjMuYwppbmRleCBiZTI4ZTZjLi45M2VkMDNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjYzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTI2My5jCkBAIC04NCw4ICs4NCw2IEBACiAJLyogcmVhZCBpbml0aWFsIHJlbGF5IHN0YXRlICovCiAJcy0+c3RhdGUgPSBpbmIoZGV2LT5pb2Jhc2UpIHwgKGluYihkZXYtPmlvYmFzZSArIDEpIDw8IDgpOwogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlcyAocGNpICVzKSBhdHRhY2hlZFxuIiwgZGV2LT5ib2FyZF9uYW1lLAotCQkgcGNpX25hbWUocGNpX2RldikpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYzZ4ZGlnaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jNnhkaWdpby5jCmluZGV4IDUwMzRmNjYuLmUwM2RkNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jNnhkaWdpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jNnhkaWdpby5jCkBAIC0xLDM0ICsxLDMzIEBACiAvKgotICAgY29tZWRpL2RyaXZlcnMvYzZ4ZGlnaW8uYwotCi0gICBIYXJkd2FyZSBkcml2ZXIgZm9yIE1lY2hhdHJvbmljIFN5c3RlbXMgSW5jLiBDNnhfRElHSU8gRFNQIGRhdWdodGVyIGNhcmQuCi0gICAoaHR0cDovL3JvYm90MC5nZS51aXVjLmVkdS9+c3BvbmcvbWVjaGEvKQotCi0gICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRGFuIEJsb2NrCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiBjNnhkaWdpby5jCisgKiBIYXJkd2FyZSBkcml2ZXIgZm9yIE1lY2hhdHJvbmljIFN5c3RlbXMgSW5jLiBDNnhfRElHSU8gRFNQIGRhdWdodGVyIGNhcmQuCisgKiBodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8lMkEvaHR0cDovL3JvYm90MC5nZS51aXVjLmVkdS9+c3BvbmcvbWVjaGEvCisgKgorICogQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICogQ29weXJpZ2h0IChDKSAxOTk5IERhbiBCbG9jaworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLworCiAvKgotRHJpdmVyOiBjNnhkaWdpbwotRGVzY3JpcHRpb246IE1lY2hhdHJvbmljIFN5c3RlbXMgSW5jLiBDNnhfRElHSU8gRFNQIGRhdWdodGVyIGNhcmQKLUF1dGhvcjogRGFuIEJsb2NrCi1TdGF0dXM6IHVua25vd24KLURldmljZXM6IFtNZWNoYXRyb25pYyBTeXN0ZW1zIEluYy5dIEM2eF9ESUdJTyBEU1AgZGF1Z2h0ZXIgY2FyZCAoYzZ4ZGlnaW8pCi1VcGRhdGVkOiBTdW4gTm92IDIwIDIwOjE4OjM0IEVTVCAyMDA1Ci0KLVRoaXMgZHJpdmVyIHdpbGwgbm90IHdvcmsgd2l0aCBhIDIuNCBrZXJuZWwuCi1odHRwOi8vcm9ib3QwLmdlLnVpdWMuZWR1L35zcG9uZy9tZWNoYS8KLQotKi8KKyAqIERyaXZlcjogYzZ4ZGlnaW8KKyAqIERlc2NyaXB0aW9uOiBNZWNoYXRyb25pYyBTeXN0ZW1zIEluYy4gQzZ4X0RJR0lPIERTUCBkYXVnaHRlciBjYXJkCisgKiBBdXRob3I6IERhbiBCbG9jaworICogU3RhdHVzOiB1bmtub3duCisgKiBEZXZpY2VzOiAoTWVjaGF0cm9uaWMgU3lzdGVtcyBJbmMuKSBDNnhfRElHSU8gRFNQIGRhdWdodGVyIGNhcmQgW2M2eGRpZ2lvXQorICogVXBkYXRlZDogU3VuIE5vdiAyMCAyMDoxODozNCBFU1QgMjAwNQorICoKKyAqIENvbmZpZ3VyYXRpb24gT3B0aW9uczoKKyAqCVswXSAtIGJhc2UgYWRkcmVzcworICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTQzLDMwOSArNDIsMTk0IEBACiAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAotc3RhdGljIHU4IFJlYWRCeXRlRnJvbUh3UG9ydCh1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JdTggcmVzdWx0ID0gaW5iKGFkZHIpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIFdyaXRlQnl0ZVRvSHdQb3J0KHVuc2lnbmVkIGxvbmcgYWRkciwgdTggdmFsKQotewotCW91dGJfcCh2YWwsIGFkZHIpOwotfQotCi0jZGVmaW5lIEM2WERJR0lPX1NJWkUgMwotCiAvKgotICogcG9ydCBvZmZzZXRzCisgKiBSZWdpc3RlciBJL08gbWFwCiAgKi8KLSNkZWZpbmUgQzZYRElHSU9fUEFSQUxMRUxfREFUQSAwCi0jZGVmaW5lIEM2WERJR0lPX1BBUkFMTEVMX1NUQVRVUyAxCi0jZGVmaW5lIEM2WERJR0lPX1BBUkFMTEVMX0NPTlRST0wgMgotc3RydWN0IHB3bWJpdHN0eXBlIHsKLQl1bnNpZ25lZCBzYjA6MjsKLQl1bnNpZ25lZCBzYjE6MjsKLQl1bnNpZ25lZCBzYjI6MjsKLQl1bnNpZ25lZCBzYjM6MjsKLQl1bnNpZ25lZCBzYjQ6MjsKLX07Ci11bmlvbiBwd21jbWR0eXBlIHsKLQl1bnNpZ25lZCBjbWQ7CQkvKiAgYXNzdW1pbmcgaGVyZSB0aGF0IGludCBpcyAzMmJpdCAqLwotCXN0cnVjdCBwd21iaXRzdHlwZSBiaXRzOwotfTsKLXN0cnVjdCBlbmNiaXRzdHlwZSB7Ci0JdW5zaWduZWQgc2IwOjM7Ci0JdW5zaWduZWQgc2IxOjM7Ci0JdW5zaWduZWQgc2IyOjM7Ci0JdW5zaWduZWQgc2IzOjM7Ci0JdW5zaWduZWQgc2I0OjM7Ci0JdW5zaWduZWQgc2I1OjM7Ci0JdW5zaWduZWQgc2I2OjM7Ci0JdW5zaWduZWQgc2I3OjM7Ci19OwotdW5pb24gZW5jdmFsdWV0eXBlIHsKLQl1bnNpZ25lZCB2YWx1ZTsKLQlzdHJ1Y3QgZW5jYml0c3R5cGUgYml0czsKLX07CisjZGVmaW5lIEM2WERJR0lPX0RBVEFfUkVHCTB4MDAKKyNkZWZpbmUgQzZYRElHSU9fREFUQV9DSEFOKHgpCSgoKHgpICsgMSkgPDwgNCkKKyNkZWZpbmUgQzZYRElHSU9fREFUQV9QV00JKDEgPDwgNSkKKyNkZWZpbmUgQzZYRElHSU9fREFUQV9FTkNPREVSCSgxIDw8IDYpCisjZGVmaW5lIEM2WERJR0lPX1NUQVRVU19SRUcJMHgwMQorI2RlZmluZSBDNlhESUdJT19DVFJMX1JFRwkweDAyCiAKICNkZWZpbmUgQzZYRElHSU9fVElNRV9PVVQgMjAKIAotc3RhdGljIHZvaWQgQzZYX3B3bUluaXQodW5zaWduZWQgbG9uZyBiYXNlQWRkcikKK3N0YXRpYyBpbnQgYzZ4ZGlnaW9fY2hrX3N0YXR1cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7CisJdW5zaWduZWQgaW50IHN0YXR1czsKIAlpbnQgdGltZW91dCA9IDA7CiAKLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgMHg3MCk7Ci0Jd2hpbGUgKCgoUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSkgJiAweDgwKSA9PSAwKQotCSAgICAgICAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgeworCWRvIHsKKwkJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgQzZYRElHSU9fU1RBVFVTX1JFRyk7CisJCWlmICgoc3RhdHVzICYgMHg4MCkgIT0gY29udGV4dCkKKwkJCXJldHVybiAwOwogCQl0aW1lb3V0Kys7Ci0JfQorCX0gd2hpbGUgICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpOwogCi0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIDB4NzQpOwotCXRpbWVvdXQgPSAwOwotCXdoaWxlICgoKFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpICYgMHg4MCkgPT0gMHg4MCkKLQkgICAgICAgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdGltZW91dCsrOwotCX0KLQotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCAweDcwKTsKLQl0aW1lb3V0ID0gMDsKLQl3aGlsZSAoKChSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKSAmIDB4ODApID09IDB4MCkKLQkgICAgICAgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdGltZW91dCsrOwotCX0KLQotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCAweDApOwotCXRpbWVvdXQgPSAwOwotCXdoaWxlICgoKFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpICYgMHg4MCkgPT0gMHg4MCkKLQkgICAgICAgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdGltZW91dCsrOwotCX0KLQorCXJldHVybiAtRUJVU1k7CiB9CiAKLXN0YXRpYyB2b2lkIEM2WF9wd21PdXRwdXQodW5zaWduZWQgbG9uZyBiYXNlQWRkciwgdW5zaWduZWQgY2hhbm5lbCwgaW50IHZhbHVlKQorc3RhdGljIGludCBjNnhkaWdpb193cml0ZV9kYXRhKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHZhbCwgdW5zaWduZWQgaW50IHN0YXR1cykKIHsKLQl1bnNpZ25lZCBwcGNtZDsKLQl1bmlvbiBwd21jbWR0eXBlIHB3bTsKLQlpbnQgdGltZW91dCA9IDA7Ci0JdW5zaWduZWQgdG1wOwotCi0JcHdtLmNtZCA9IHZhbHVlOwotCWlmIChwd20uY21kID4gNDk4KQotCQlwd20uY21kID0gNDk4OwotCWlmIChwd20uY21kIDwgMikKLQkJcHdtLmNtZCA9IDI7Ci0KLQlpZiAoY2hhbm5lbCA9PSAwKSB7Ci0JCXBwY21kID0gMHgyODsKLQl9IGVsc2UgewkJLyogIGlmIGNoYW5uZWwgPT0gMSAqLwotCQlwcGNtZCA9IDB4MzA7Ci0JfQkJCS8qIGVuZGlmICovCi0KLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgcHBjbWQgKyBwd20uYml0cy5zYjApOwotCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCXdoaWxlICgoKHRtcCAmIDB4ODApID09IDApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCi0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIHBwY21kICsgcHdtLmJpdHMuc2IxICsgMHg0KTsKLQl0aW1lb3V0ID0gMDsKLQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQl3aGlsZSAoKCh0bXAgJiAweDgwKSA9PSAweDgwKSAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQkJdGltZW91dCsrOwotCX0KLQotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCBwcGNtZCArIHB3bS5iaXRzLnNiMik7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMCkgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0JCXRpbWVvdXQrKzsKLQl9Ci0KLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgcHBjbWQgKyBwd20uYml0cy5zYjMgKyAweDQpOwotCXRpbWVvdXQgPSAwOwotCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCXdoaWxlICgoKHRtcCAmIDB4ODApID09IDB4ODApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCi0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIHBwY21kICsgcHdtLmJpdHMuc2I0KTsKLQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQl3aGlsZSAoKCh0bXAgJiAweDgwKSA9PSAwKSAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQkJdGltZW91dCsrOwotCX0KLQotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCAweDApOwotCXRpbWVvdXQgPSAwOwotCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCXdoaWxlICgoKHRtcCAmIDB4ODApID09IDB4ODApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCisJb3V0Yl9wKHZhbCwgZGV2LT5pb2Jhc2UgKyBDNlhESUdJT19EQVRBX1JFRyk7CisJcmV0dXJuIGM2eGRpZ2lvX2Noa19zdGF0dXMoZGV2LCBzdGF0dXMpOwogfQogCi1zdGF0aWMgaW50IEM2WF9lbmNJbnB1dCh1bnNpZ25lZCBsb25nIGJhc2VBZGRyLCB1bnNpZ25lZCBjaGFubmVsKQorc3RhdGljIGludCBjNnhkaWdpb19nZXRfZW5jb2Rlcl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKmJpdHMsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHN0YXR1cykKIHsKLQl1bnNpZ25lZCBwcGNtZDsKLQl1bmlvbiBlbmN2YWx1ZXR5cGUgZW5jOwotCWludCB0aW1lb3V0ID0gMDsKLQlpbnQgdG1wOworCXVuc2lnbmVkIGludCB2YWw7CiAKLQllbmMudmFsdWUgPSAwOwotCWlmIChjaGFubmVsID09IDApCi0JCXBwY21kID0gMHg0ODsKLQllbHNlCi0JCXBwY21kID0gMHg1MDsKKwl2YWwgPSBpbmIoZGV2LT5pb2Jhc2UgKyBDNlhESUdJT19TVEFUVVNfUkVHKTsKKwl2YWwgPj49IDM7CisJdmFsICY9IDB4MDc7CiAKLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgcHBjbWQpOwotCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCXdoaWxlICgoKHRtcCAmIDB4ODApID09IDApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQorCSpiaXRzID0gdmFsOwogCi0JZW5jLmJpdHMuc2IwID0gKChSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKSA+PiAzKSAmIDB4Nyk7Ci0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIHBwY21kICsgMHg0KTsKLQl0aW1lb3V0ID0gMDsKLQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQl3aGlsZSAoKCh0bXAgJiAweDgwKSA9PSAweDgwKSAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQkJdGltZW91dCsrOwotCX0KLQllbmMuYml0cy5zYjEgPSAoKFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpID4+IDMpICYgMHg3KTsKLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgcHBjbWQpOwotCXRpbWVvdXQgPSAwOwotCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCXdoaWxlICgoKHRtcCAmIDB4ODApID09IDApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCWVuYy5iaXRzLnNiMiA9ICgoUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSkgPj4gMykgJiAweDcpOwotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCBwcGNtZCArIDB4NCk7Ci0JdGltZW91dCA9IDA7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMHg4MCkgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0JCXRpbWVvdXQrKzsKLQl9Ci0JZW5jLmJpdHMuc2IzID0gKChSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKSA+PiAzKSAmIDB4Nyk7Ci0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIHBwY21kKTsKLQl0aW1lb3V0ID0gMDsKLQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQl3aGlsZSAoKCh0bXAgJiAweDgwKSA9PSAwKSAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQkJdGltZW91dCsrOwotCX0KLQllbmMuYml0cy5zYjQgPSAoKFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpID4+IDMpICYgMHg3KTsKLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgcHBjbWQgKyAweDQpOwotCXRpbWVvdXQgPSAwOwotCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCXdoaWxlICgoKHRtcCAmIDB4ODApID09IDB4ODApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCWVuYy5iaXRzLnNiNSA9ICgoUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSkgPj4gMykgJiAweDcpOwotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCBwcGNtZCk7Ci0JdGltZW91dCA9IDA7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMHgwKSAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQkJdGltZW91dCsrOwotCX0KLQllbmMuYml0cy5zYjYgPSAoKFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpID4+IDMpICYgMHg3KTsKLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgcHBjbWQgKyAweDQpOwotCXRpbWVvdXQgPSAwOwotCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCXdoaWxlICgoKHRtcCAmIDB4ODApID09IDB4ODApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCWVuYy5iaXRzLnNiNyA9ICgoUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSkgPj4gMykgJiAweDcpOwotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCBwcGNtZCk7Ci0JdGltZW91dCA9IDA7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMHgwKSAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQkJdGltZW91dCsrOwotCX0KLQotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCAweDApOwotCXRpbWVvdXQgPSAwOwotCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCXdoaWxlICgoKHRtcCAmIDB4ODApID09IDB4ODApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCi0JcmV0dXJuIGVuYy52YWx1ZSBeIDB4ODAwMDAwOworCXJldHVybiBjNnhkaWdpb193cml0ZV9kYXRhKGRldiwgY21kLCBzdGF0dXMpOwogfQogCi1zdGF0aWMgdm9pZCBDNlhfZW5jUmVzZXRBbGwodW5zaWduZWQgbG9uZyBiYXNlQWRkcikKK3N0YXRpYyB2b2lkIGM2eGRpZ2lvX3B3bV93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBjaGFuLCB1bnNpZ25lZCBpbnQgdmFsKQogewotCXVuc2lnbmVkIHRpbWVvdXQgPSAwOworCXVuc2lnbmVkIGludCBjbWQgPSBDNlhESUdJT19EQVRBX1BXTSB8IEM2WERJR0lPX0RBVEFfQ0hBTihjaGFuKTsKKwl1bnNpZ25lZCBpbnQgYml0czsKIAotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCAweDY4KTsKLQl3aGlsZSAoKChSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKSAmIDB4ODApID09IDApCi0JICAgICAgICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRpbWVvdXQrKzsKLQl9Ci0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIDB4NkMpOwotCXRpbWVvdXQgPSAwOwotCXdoaWxlICgoKFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpICYgMHg4MCkgPT0gMHg4MCkKLQkgICAgICAgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdGltZW91dCsrOwotCX0KLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgMHg2OCk7Ci0JdGltZW91dCA9IDA7Ci0Jd2hpbGUgKCgoUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSkgJiAweDgwKSA9PSAweDApCi0JICAgICAgICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRpbWVvdXQrKzsKLQl9Ci0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIDB4MCk7Ci0JdGltZW91dCA9IDA7Ci0Jd2hpbGUgKCgoUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSkgJiAweDgwKSA9PSAweDgwKQotCSAgICAgICAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0aW1lb3V0Kys7Ci0JfQorCWlmICh2YWwgPiA0OTgpCisJCXZhbCA9IDQ5ODsKKwlpZiAodmFsIDwgMikKKwkJdmFsID0gMjsKKworCWJpdHMgPSAodmFsID4+IDApICYgMHgwMzsKKwljNnhkaWdpb193cml0ZV9kYXRhKGRldiwgY21kIHwgYml0cyB8ICgwIDw8IDIpLCAweDAwKTsKKwliaXRzID0gKHZhbCA+PiAyKSAmIDB4MDM7CisJYzZ4ZGlnaW9fd3JpdGVfZGF0YShkZXYsIGNtZCB8IGJpdHMgfCAoMSA8PCAyKSwgMHg4MCk7CisJYml0cyA9ICh2YWwgPj4gNCkgJiAweDAzOworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCBjbWQgfCBiaXRzIHwgKDAgPDwgMiksIDB4MDApOworCWJpdHMgPSAodmFsID4+IDYpICYgMHgwMzsKKwljNnhkaWdpb193cml0ZV9kYXRhKGRldiwgY21kIHwgYml0cyB8ICgxIDw8IDIpLCAweDgwKTsKKwliaXRzID0gKHZhbCA+PiA4KSAmIDB4MDM7CisJYzZ4ZGlnaW9fd3JpdGVfZGF0YShkZXYsIGNtZCB8IGJpdHMgfCAoMCA8PCAyKSwgMHgwMCk7CisKKwljNnhkaWdpb193cml0ZV9kYXRhKGRldiwgMHgwMCwgMHg4MCk7CiB9CiAKLXN0YXRpYyBpbnQgYzZ4ZGlnaW9fcHdtb19pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyBpbnQgYzZ4ZGlnaW9fZW5jb2Rlcl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJIHVuc2lnbmVkIGludCBjaGFuKQogeworCXVuc2lnbmVkIGludCBjbWQgPSBDNlhESUdJT19EQVRBX0VOQ09ERVIgfCBDNlhESUdJT19EQVRBX0NIQU4oY2hhbik7CisJdW5zaWduZWQgaW50IHZhbCA9IDA7CisJdW5zaWduZWQgaW50IGJpdHM7CisKKwljNnhkaWdpb193cml0ZV9kYXRhKGRldiwgY21kLCAweDAwKTsKKworCWM2eGRpZ2lvX2dldF9lbmNvZGVyX2JpdHMoZGV2LCAmYml0cywgY21kIHwgKDEgPDwgMiksIDB4ODApOworCXZhbCB8PSAoYml0cyA8PCAwKTsKKworCWM2eGRpZ2lvX2dldF9lbmNvZGVyX2JpdHMoZGV2LCAmYml0cywgY21kIHwgKDAgPDwgMiksIDB4MDApOworCXZhbCB8PSAoYml0cyA8PCAzKTsKKworCWM2eGRpZ2lvX2dldF9lbmNvZGVyX2JpdHMoZGV2LCAmYml0cywgY21kIHwgKDEgPDwgMiksIDB4ODApOworCXZhbCB8PSAoYml0cyA8PCA2KTsKKworCWM2eGRpZ2lvX2dldF9lbmNvZGVyX2JpdHMoZGV2LCAmYml0cywgY21kIHwgKDAgPDwgMiksIDB4MDApOworCXZhbCB8PSAoYml0cyA8PCA5KTsKKworCWM2eGRpZ2lvX2dldF9lbmNvZGVyX2JpdHMoZGV2LCAmYml0cywgY21kIHwgKDEgPDwgMiksIDB4ODApOworCXZhbCB8PSAoYml0cyA8PCAxMik7CisKKwljNnhkaWdpb19nZXRfZW5jb2Rlcl9iaXRzKGRldiwgJmJpdHMsIGNtZCB8ICgwIDw8IDIpLCAweDAwKTsKKwl2YWwgfD0gKGJpdHMgPDwgMTUpOworCisJYzZ4ZGlnaW9fZ2V0X2VuY29kZXJfYml0cyhkZXYsICZiaXRzLCBjbWQgfCAoMSA8PCAyKSwgMHg4MCk7CisJdmFsIHw9IChiaXRzIDw8IDE4KTsKKworCWM2eGRpZ2lvX2dldF9lbmNvZGVyX2JpdHMoZGV2LCAmYml0cywgY21kIHwgKDAgPDwgMiksIDB4MDApOworCXZhbCB8PSAoYml0cyA8PCAyMSk7CisKKwljNnhkaWdpb193cml0ZV9kYXRhKGRldiwgMHgwMCwgMHg4MCk7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IGM2eGRpZ2lvX3B3bV9pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCB2YWwgPSAocy0+c3RhdGUgPj4gKDE2ICogY2hhbikpICYgMHhmZmZmOwogCWludCBpOwotCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7Ci0JCUM2WF9wd21PdXRwdXQoZGV2LT5pb2Jhc2UsIGNoYW4sIGRhdGFbaV0pOwotCQkvKiAgICBkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXSA9IGRhdGFbaV07ICovCisJCXZhbCA9IGRhdGFbaV07CisJCWM2eGRpZ2lvX3B3bV93cml0ZShkZXYsIGNoYW4sIHZhbCk7CiAJfQotCXJldHVybiBpOworCisJLyoKKwkgKiBUaGVyZSBhcmUgb25seSAyIFBXTSBjaGFubmVscyBhbmQgdGhleSBoYXZlIGEgbWF4ZGF0YSBvZiA1MDAuCisJICogSW5zdGVhZCBvZiBhbGxvY2F0aW5nIHByaXZhdGUgZGF0YSB0byBzYXZlIHRoZSB2YWx1ZXMgaW4gZm9yCisJICogcmVhZGJhY2sgdGhpcyBkcml2ZXIganVzdCBwYWNrcyB0aGUgdmFsdWVzIGZvciB0aGUgdHdvIGNoYW5uZWxzCisJICogaW4gdGhlIHMtPnN0YXRlLgorCSAqLworCXMtPnN0YXRlICY9ICgweGZmZmYgPDwgKDE2ICogY2hhbikpOworCXMtPnN0YXRlIHw9ICh2YWwgPDwgKDE2ICogY2hhbikpOworCisJcmV0dXJuIGluc24tPm47CiB9CiAKLXN0YXRpYyBpbnQgYzZ4ZGlnaW9fZWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyBpbnQgYzZ4ZGlnaW9fcHdtX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7Ci0JaW50IG47Ci0JaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGk7CiAKLQlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKQotCQlkYXRhW25dID0gKEM2WF9lbmNJbnB1dChkZXYtPmlvYmFzZSwgY2hhbikgJiAweGZmZmZmZik7CisJdmFsID0gKHMtPnN0YXRlID4+ICgxNiAqIGNoYW4pKSAmIDB4ZmZmZjsKIAotCXJldHVybiBuOworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspCisJCWRhdGFbaV0gPSB2YWw7CisKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAotc3RhdGljIHZvaWQgYm9hcmRfaW5pdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQorc3RhdGljIGludCBjNnhkaWdpb19lbmNvZGVyX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7Ci0JQzZYX3B3bUluaXQoZGV2LT5pb2Jhc2UpOwotCUM2WF9lbmNSZXNldEFsbChkZXYtPmlvYmFzZSk7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQl2YWwgPSBjNnhkaWdpb19lbmNvZGVyX3JlYWQoZGV2LCBjaGFuKTsKKworCQkvKiBtdW5nZSB0d28ncyBjb21wbGVtZW50IHZhbHVlIHRvIG9mZnNldCBiaW5hcnkgKi8KKwkJZGF0YVtpXSA9IGNvbWVkaV9vZmZzZXRfbXVuZ2UocywgdmFsKTsKKwl9CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIHZvaWQgYzZ4ZGlnaW9faW5pdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQoreworCS8qIEluaXRpYWxpemUgdGhlIFBXTSAqLworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCAweDcwLCAweDAwKTsKKwljNnhkaWdpb193cml0ZV9kYXRhKGRldiwgMHg3NCwgMHg4MCk7CisJYzZ4ZGlnaW9fd3JpdGVfZGF0YShkZXYsIDB4NzAsIDB4MDApOworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCAweDAwLCAweDgwKTsKKworCS8qIFJlc2V0IHRoZSBlbmNvZGVycyAqLworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCAweDY4LCAweDAwKTsKKwljNnhkaWdpb193cml0ZV9kYXRhKGRldiwgMHg2YywgMHg4MCk7CisJYzZ4ZGlnaW9fd3JpdGVfZGF0YShkZXYsIDB4NjgsIDB4MDApOworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCAweDAwLCAweDgwKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkIGM2eGRpZ2lvX3BucF90YmxbXSA9IHsKQEAgLTM2Nyw3ICsyNTEsNyBAQAogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwogCWludCByZXQ7CiAKLQlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgQzZYRElHSU9fU0laRSk7CisJcmV0ID0gY29tZWRpX3JlcXVlc3RfcmVnaW9uKGRldiwgaXQtPm9wdGlvbnNbMF0sIDB4MDMpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTM4MCwyNyArMjY0LDI2IEBACiAKIAlzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKIAkvKiBwd20gb3V0cHV0IHN1YmRldmljZSAqLwotCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BTzsJLyogIE5vdCBzdXJlIHdoYXQgdG8gcHV0IGhlcmUgKi8KLQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEVBQkxFOwotCXMtPm5fY2hhbiA9IDI7Ci0JLyogICAgICBzLT50cmlnWzBdID0gYzZ4ZGlnaW9fcHdtbzsgKi8KLQlzLT5pbnNuX3dyaXRlID0gYzZ4ZGlnaW9fcHdtb19pbnNuX3dyaXRlOwotCXMtPm1heGRhdGEgPSA1MDA7Ci0Jcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYmlwb2xhcjEwOwkvKiAgQSBzdWl0YWJsZSBsaWUgKi8KKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX1BXTTsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfV1JJVEVBQkxFOworCXMtPm5fY2hhbgk9IDI7CisJcy0+bWF4ZGF0YQk9IDUwMDsKKwlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV91bmtub3duOworCXMtPmluc25fd3JpdGUJPSBjNnhkaWdpb19wd21faW5zbl93cml0ZTsKKwlzLT5pbnNuX3JlYWQJPSBjNnhkaWdpb19wd21faW5zbl9yZWFkOwogCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMV07CiAJLyogZW5jb2RlciAoY291bnRlcikgc3ViZGV2aWNlICovCi0Jcy0+dHlwZSA9IENPTUVESV9TVUJEX0NPVU5URVI7Ci0Jcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0xTQU1QTDsKLQlzLT5uX2NoYW4gPSAyOwotCS8qIHMtPnRyaWdbMF0gPSBjNnhkaWdpb19laTsgKi8KLQlzLT5pbnNuX3JlYWQgPSBjNnhkaWdpb19laV9pbnNuX3JlYWQ7Ci0Jcy0+bWF4ZGF0YSA9IDB4ZmZmZmZmOwotCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3Vua25vd247CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9DT1VOVEVSOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9SRUFEQUJMRSB8IFNERl9MU0FNUEw7CisJcy0+bl9jaGFuCT0gMjsKKwlzLT5tYXhkYXRhCT0gMHhmZmZmZmY7CisJcy0+cmFuZ2VfdGFibGUJPSAmcmFuZ2VfdW5rbm93bjsKKwlzLT5pbnNuX3JlYWQJPSBjNnhkaWdpb19lbmNvZGVyX2luc25fcmVhZDsKIAogCS8qICBJIHdpbGwgY2FsbCB0aGlzIGluaXQgYW55d2F5IGJ1dCBtb3JlIHRoYW4gbGlrZWx5IHRoZSBEU1AgYm9hcmQgKi8KIAkvKiAgd2lsbCBub3QgYmUgY29ubmVjdGVkIHdoZW4gZGV2aWNlIGRyaXZlciBpcyBsb2FkZWQuICovCi0JYm9hcmRfaW5pdChkZXYpOworCWM2eGRpZ2lvX2luaXQoZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtNDIwLDUgKzMwMyw1IEBACiBtb2R1bGVfY29tZWRpX2RyaXZlcihjNnhkaWdpb19kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBkcml2ZXIgZm9yIHRoZSBDNnhfRElHSU8gRFNQIGRhdWdodGVyIGNhcmQiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX2RhczE2X2NzLmMKaW5kZXggNjRkNWYyOS4uNjQ1ZmNiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX2RhczE2X2NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX2RhczE2X2NzLmMKQEAgLTk1LDEwICs5NSwxNyBAQAogCX0KIH07CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBkYXMxNmNzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQorc3RhdGljIGludCBkYXMxNmNzX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7Ci0JLyogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7ICovCi0JcmV0dXJuIElSUV9IQU5ETEVEOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbncoZGV2LT5pb2Jhc2UgKyBEQVMxNkNTX01JU0MxKTsKKwlpZiAoc3RhdHVzICYgMHgwMDgwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOwogfQogCiBzdGF0aWMgaW50IGRhczE2Y3NfYWlfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTEwOSw4ICsxMTYsOCBAQAogCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJaW50IHJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOwogCWludCBhcmVmID0gQ1JfQVJFRihpbnNuLT5jaGFuc3BlYyk7CisJaW50IHJldDsKIAlpbnQgaTsKLQlpbnQgdG87CiAKIAlvdXR3KGNoYW4sIGRldi0+aW9iYXNlICsgREFTMTZDU19ESU9fTVVYKTsKIApAQCAtMTM4LDEzMiArMTQ1LDE2IEBACiAJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgewogCQlvdXR3KDAsIGRldi0+aW9iYXNlICsgREFTMTZDU19BRENfREFUQSk7CiAKLSNkZWZpbmUgVElNRU9VVCAxMDAwCi0JCWZvciAodG8gPSAwOyB0byA8IFRJTUVPVVQ7IHRvKyspIHsKLQkJCWlmIChpbncoZGV2LT5pb2Jhc2UgKyBEQVMxNkNTX01JU0MxKSAmIDB4MDA4MCkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAodG8gPT0gVElNRU9VVCkgewotCQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgImNiX2RhczE2X2NzOiBhaSB0aW1lb3V0XG4iKTsKLQkJCXJldHVybiAtRVRJTUU7Ci0JCX0KKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBkYXMxNmNzX2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCiAJCWRhdGFbaV0gPSBpbncoZGV2LT5pb2Jhc2UgKyBEQVMxNkNTX0FEQ19EQVRBKTsKIAl9CiAKIAlyZXR1cm4gaTsKIH0KIAotc3RhdGljIGludCBkYXMxNmNzX2FpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKLXsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCBkYXMxNmNzX2FpX2NtZHRlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICAgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKLXsKLQlpbnQgZXJyID0gMDsKLQlpbnQgdG1wOwotCi0JLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwotCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAotCQkJCQlUUklHX1RJTUVSIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsCi0JCQkJCVRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwotCi0JaWYgKGVycikKLQkJcmV0dXJuIDE7Ci0KLQkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCi0KLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKLQotCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwotCi0JaWYgKGVycikKLQkJcmV0dXJuIDI7Ci0KLQkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCi0KLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7Ci0KLSNkZWZpbmUgTUFYX1NQRUVECTEwMDAwCS8qIGluIG5hbm9zZWNvbmRzICovCi0jZGVmaW5lIE1JTl9TUEVFRAkxMDAwMDAwMDAwCS8qIGluIG5hbm9zZWNvbmRzICovCi0KLQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJIE1BWF9TUEVFRCk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJIE1JTl9TUEVFRCk7Ci0JfSBlbHNlIHsKLQkJLyogZXh0ZXJuYWwgdHJpZ2dlciAqLwotCQkvKiBzaG91bGQgYmUgbGV2ZWwvZWRnZSwgaGkvbG8gc3BlY2lmaWNhdGlvbiBoZXJlICovCi0JCS8qIHNob3VsZCBzcGVjaWZ5IG11bHRpcGxlIGV4dGVybmFsIHRyaWdnZXJzICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLCA5KTsKLQl9Ci0JaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSBNQVhfU1BFRUQpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSBNSU5fU1BFRUQpOwotCX0gZWxzZSB7Ci0JCS8qIGV4dGVybmFsIHRyaWdnZXIgKi8KLQkJLyogc2VlIGFib3ZlICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLCA5KTsKLQl9Ci0KLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOwotCi0JaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c3RvcF9hcmcsIDB4MDBmZmZmZmYpOwotCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwotCi0JaWYgKGVycikKLQkJcmV0dXJuIDM7Ci0KLQkvKiBzdGVwIDQ6IGZpeCB1cCBhbnkgYXJndW1lbnRzICovCi0KLQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCXVuc2lnbmVkIGludCBkaXYxID0gMCwgZGl2MiA9IDA7Ci0KLQkJdG1wID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihJODI1NF9PU0NfQkFTRV8xME1IWiwKLQkJCQkJICAmZGl2MSwgJmRpdjIsCi0JCQkJCSAgJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGNtZC0+ZmxhZ3MpOwotCQlpZiAodG1wICE9IGNtZC0+c2Nhbl9iZWdpbl9hcmcpCi0JCQllcnIrKzsKLQl9Ci0JaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCQl1bnNpZ25lZCBpbnQgZGl2MSA9IDAsIGRpdjIgPSAwOwotCi0JCXRtcCA9IGNtZC0+Y29udmVydF9hcmc7Ci0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoSTgyNTRfT1NDX0JBU0VfMTBNSFosCi0JCQkJCSAgJmRpdjEsICZkaXYyLAotCQkJCQkgICZjbWQtPnNjYW5fYmVnaW5fYXJnLCBjbWQtPmZsYWdzKTsKLQkJaWYgKHRtcCAhPSBjbWQtPmNvbnZlcnRfYXJnKQotCQkJZXJyKys7Ci0JCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIgJiYKLQkJICAgIGNtZC0+c2Nhbl9iZWdpbl9hcmcgPAotCQkgICAgY21kLT5jb252ZXJ0X2FyZyAqIGNtZC0+c2Nhbl9lbmRfYXJnKSB7Ci0JCQljbWQtPnNjYW5fYmVnaW5fYXJnID0KLQkJCSAgICBjbWQtPmNvbnZlcnRfYXJnICogY21kLT5zY2FuX2VuZF9hcmc7Ci0JCQllcnIrKzsKLQkJfQotCX0KLQotCWlmIChlcnIpCi0JCXJldHVybiA0OwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgZGFzMTZjc19hb193aW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQpAQCAtNDAxLDEwICsyOTIsNiBAQAogCWRldi0+aW9iYXNlID0gbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCiAJbGluay0+cHJpdiA9IGRldjsKLQlyZXQgPSBwY21jaWFfcmVxdWVzdF9pcnEobGluaywgZGFzMTZjc19pbnRlcnJ1cHQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JZGV2LT5pcnEgPSBsaW5rLT5pcnE7CiAKIAlkZXZwcml2ID0gY29tZWRpX2FsbG9jX2RldnByaXYoZGV2LCBzaXplb2YoKmRldnByaXYpKTsKIAlpZiAoIWRldnByaXYpCkBAIC00MTUsNyArMzAyLDYgQEAKIAkJcmV0dXJuIHJldDsKIAogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzBdOwotCWRldi0+cmVhZF9zdWJkZXYgPSBzOwogCS8qIGFuYWxvZyBpbnB1dCBzdWJkZXZpY2UgKi8KIAlzLT50eXBlCQk9IENPTUVESV9TVUJEX0FJOwogCXMtPnN1YmRldl9mbGFncwk9IFNERl9SRUFEQUJMRSB8IFNERl9HUk9VTkQgfCBTREZfRElGRiB8IFNERl9DTURfUkVBRDsKQEAgLTQyNCw4ICszMTAsNiBAQAogCXMtPnJhbmdlX3RhYmxlCT0gJmRhczE2Y3NfYWlfcmFuZ2U7CiAJcy0+bGVuX2NoYW5saXN0CT0gMTY7CiAJcy0+aW5zbl9yZWFkCT0gZGFzMTZjc19haV9yaW5zbjsKLQlzLT5kb19jbWQJPSBkYXMxNmNzX2FpX2NtZDsKLQlzLT5kb19jbWR0ZXN0CT0gZGFzMTZjc19haV9jbWR0ZXN0OwogCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMV07CiAJLyogYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgKi8KQEAgLTQ1MSwxMCArMzM1LDYgQEAKIAlzLT5pbnNuX2JpdHMJPSBkYXMxNmNzX2Rpb19pbnNuX2JpdHM7CiAJcy0+aW5zbl9jb25maWcJPSBkYXMxNmNzX2Rpb19pbnNuX2NvbmZpZzsKIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXM6ICVzLCBJL08gYmFzZT0weCUwNGx4LCBpcnE9JXVcbiIsCi0JCWRldi0+ZHJpdmVyLT5kcml2ZXJfbmFtZSwgZGV2LT5ib2FyZF9uYW1lLAotCQlkZXYtPmlvYmFzZSwgZGV2LT5pcnEpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXMuYwppbmRleCA5ODE5YmUwLi44M2EyNjVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGFzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhcy5jCkBAIC0zNzYsNiArMzc2LDIwIEBACiAJcmV0dXJuIENBTF9FTl9CSVQgfCBDQUxfU1JDX0JJVFMoZGV2cHJpdi0+Y2FsaWJyYXRpb25fc291cmNlKTsKIH0KIAorc3RhdGljIGludCBjYl9wY2lkYXNfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgY2JfcGNpZGFzX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGludyhkZXZwcml2LT5jb250cm9sX3N0YXR1cyArIEFEQ01VWF9DT05UKTsKKwlpZiAoc3RhdHVzICYgRU9DKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IGNiX3BjaWRhc19haV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKQEAgLTM4NSw3ICszOTksOCBAQAogCXVuc2lnbmVkIGludCByYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKIAl1bnNpZ25lZCBpbnQgYXJlZiA9IENSX0FSRUYoaW5zbi0+Y2hhbnNwZWMpOwogCXVuc2lnbmVkIGludCBiaXRzOwotCWludCBuLCBpOworCWludCByZXQ7CisJaW50IG47CiAKIAkvKiBlbmFibGUgY2FsaWJyYXRpb24gaW5wdXQgaWYgYXBwcm9wcmlhdGUgKi8KIAlpZiAoaW5zbi0+Y2hhbnNwZWMgJiBDUl9BTFRfU09VUkNFKSB7CkBAIC00MTUsMTMgKzQzMCw5IEBACiAJCW91dHcoMCwgZGV2cHJpdi0+YWRjX2ZpZm8gKyBBRENEQVRBKTsKIAogCQkvKiB3YWl0IGZvciBjb252ZXJzaW9uIHRvIGVuZCAqLwotCQkvKiByZXR1cm4gLUVUSU1FRE9VVCBpZiB0aGVyZSBpcyBhIHRpbWVvdXQgKi8KLQkJZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKLQkJCWlmIChpbncoZGV2cHJpdi0+Y29udHJvbF9zdGF0dXMgKyBBRENNVVhfQ09OVCkgJiBFT0MpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGkgPT0gMTAwMDApCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBjYl9wY2lkYXNfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKIAkJLyogcmVhZCBkYXRhICovCiAJCWRhdGFbbl0gPSBpbncoZGV2cHJpdi0+YWRjX2ZpZm8gKyBBRENEQVRBKTsKQEAgLTEwMDYsOSArMTAxNyw5IEBACiAKIAkvKiAgc2V0IHN0YXJ0IHRyaWdnZXIgYW5kIGJ1cnN0IG1vZGUgKi8KIAliaXRzID0gMDsKLQlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cpCisJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfTk9XKSB7CiAJCWJpdHMgfD0gU1dfVFJJR0dFUjsKLQllbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCkgeworCX0gZWxzZSB7CS8qIFRSSUdfRVhUICovCiAJCWJpdHMgfD0gRVhUX1RSSUdHRVIgfCBUR0VOIHwgWFRSQ0w7CiAJCWlmICh0aGlzYm9hcmQtPmlzXzE2MDIpIHsKIAkJCWlmIChjbWQtPnN0YXJ0X2FyZyAmIENSX0lOVkVSVCkKQEAgLTEwMTYsOSArMTAyNyw2IEBACiAJCQlpZiAoY21kLT5zdGFydF9hcmcgJiBDUl9FREdFKQogCQkJCWJpdHMgfD0gVEdTRUw7CiAJCX0KLQl9IGVsc2UgewotCQljb21lZGlfZXJyb3IoZGV2LCAiYnVnISIpOwotCQlyZXR1cm4gLTE7CiAJfQogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfTk9XICYmIGNtZC0+Y2hhbmxpc3RfbGVuID4gMSkKIAkJYml0cyB8PSBCVVJTVEU7CkBAIC0xMjY5LDggKzEyNzcsNiBAQAogCXVuc2lnbmVkIGludCBudW1fcG9pbnRzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlhc3luYy0+ZXZlbnRzID0gMDsKLQogCWlmIChzdGF0dXMgJiBEQUVNSSkgewogCQkvKiAgY2xlYXIgZGFjIGVtcHR5IGludGVycnVwdCBsYXRjaCAqLwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwpAQCAtMTI4Miw3ICsxMjg4LDYgQEAKIAkJCSAgICAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UCiAJCQkgICAgICYmIGRldnByaXYtPmFvX2NvdW50KSkgewogCQkJCWNvbWVkaV9lcnJvcihkZXYsICJkYWMgZmlmbyB1bmRlcmZsb3ciKTsKLQkJCQljYl9wY2lkYXNfYW9fY2FuY2VsKGRldiwgcyk7CiAJCQkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CiAJCQl9CiAJCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CkBAIC0xMzEyLDcgKzEzMTcsNyBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CiAJfQogCi0JY29tZWRpX2V2ZW50KGRldiwgcyk7CisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IGNiX3BjaWRhc19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKQEAgLTEzMzIsNyArMTMzNyw2IEBACiAJCXJldHVybiBJUlFfTk9ORTsKIAogCWFzeW5jID0gcy0+YXN5bmM7Ci0JYXN5bmMtPmV2ZW50cyA9IDA7CiAKIAlzNTkzM19zdGF0dXMgPSBpbmwoZGV2cHJpdi0+czU5MzNfY29uZmlnICsgQU1DQ19PUF9SRUdfSU5UQ1NSKTsKIApAQCAtMTM2NCwxMCArMTM2OCw4IEBACiAJCWNmY193cml0ZV9hcnJheV90b19idWZmZXIocywgZGV2cHJpdi0+YWlfYnVmZmVyLAogCQkJCQkgIG51bV9zYW1wbGVzICogc2l6ZW9mKHNob3J0KSk7CiAJCWRldnByaXYtPmNvdW50IC09IG51bV9zYW1wbGVzOwotCQlpZiAoYXN5bmMtPmNtZC5zdG9wX3NyYyA9PSBUUklHX0NPVU5UICYmIGRldnByaXYtPmNvdW50ID09IDApIHsKKwkJaWYgKGFzeW5jLT5jbWQuc3RvcF9zcmMgPT0gVFJJR19DT1VOVCAmJiBkZXZwcml2LT5jb3VudCA9PSAwKQogCQkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwotCQkJY2JfcGNpZGFzX2NhbmNlbChkZXYsIHMpOwotCQl9CiAJCS8qICBjbGVhciBoYWxmLWZ1bGwgaW50ZXJydXB0IGxhdGNoICovCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CiAJCW91dHcoZGV2cHJpdi0+YWRjX2ZpZm9fYml0cyB8IElOVCwKQEAgLTEzODQsNyArMTM4Niw2IEBACiAJCQlpZiAoYXN5bmMtPmNtZC5zdG9wX3NyYyA9PSBUUklHX0NPVU5UICYmCiAJCQkgICAgLS1kZXZwcml2LT5jb3VudCA9PSAwKSB7CiAJCQkJLyogZW5kIG9mIGFjcXVpc2l0aW9uICovCi0JCQkJY2JfcGNpZGFzX2NhbmNlbChkZXYsIHMpOwogCQkJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTE0MTEsMTEgKzE0MTIsMTAgQEAKIAkJb3V0dyhkZXZwcml2LT5hZGNfZmlmb19iaXRzIHwgTEFERlVMLAogCQkgICAgIGRldnByaXYtPmNvbnRyb2xfc3RhdHVzICsgSU5UX0FEQ0ZJRk8pOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7Ci0JCWNiX3BjaWRhc19jYW5jZWwoZGV2LCBzKTsKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOwogCX0KIAotCWNvbWVkaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0xNTc2LDkgKzE1NzYsNiBAQAogCW91dGwoZGV2cHJpdi0+czU5MzNfaW50Y3NyX2JpdHMgfCBJTlRDU1JfSU5CT1hfSU5UUl9TVEFUVVMsCiAJICAgICBkZXZwcml2LT5zNTkzM19jb25maWcgKyBBTUNDX09QX1JFR19JTlRDU1IpOwogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlczogJXMgYXR0YWNoZWRcbiIsCi0JCWRldi0+ZHJpdmVyLT5kcml2ZXJfbmFtZSwgZGV2LT5ib2FyZF9uYW1lKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGFzNjQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXM2NC5jCmluZGV4IDRmZmYxNzMuLmY5YWZjYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXM2NC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXM2NC5jCkBAIC0xNjY0LDE1ICsxNjY0LDM2IEBACiAJaTJjX3N0b3AoZGV2KTsKIH0KIAorc3RhdGljIGludCBjYl9wY2lkYXM2NF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCWNvbnN0IHN0cnVjdCBwY2lkYXM2NF9ib2FyZCAqdGhpc2JvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CisJc3RydWN0IHBjaWRhczY0X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHJlYWR3KGRldnByaXYtPm1haW5faW9iYXNlICsgSFdfU1RBVFVTX1JFRyk7CisJaWYgKHRoaXNib2FyZC0+bGF5b3V0ID09IExBWU9VVF80MDIwKSB7CisJCXN0YXR1cyA9IHJlYWR3KGRldnByaXYtPm1haW5faW9iYXNlICsgQURDX1dSSVRFX1BOVFJfUkVHKTsKKwkJaWYgKHN0YXR1cykKKwkJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWlmIChwaXBlX2Z1bGxfYml0cyhzdGF0dXMpKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgYWlfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAljb25zdCBzdHJ1Y3QgcGNpZGFzNjRfYm9hcmQgKnRoaXNib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCXN0cnVjdCBwY2lkYXM2NF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCBiaXRzID0gMCwgbiwgaTsKKwl1bnNpZ25lZCBpbnQgYml0cyA9IDAsIG47CiAJdW5zaWduZWQgaW50IGNoYW5uZWwsIHJhbmdlLCBhcmVmOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RhdGljIGNvbnN0IGludCB0aW1lb3V0ID0gMTAwOworCWludCByZXQ7CiAKIAljaGFubmVsID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CkBAIC0xNzcwLDIzICsxNzkxLDEwIEBACiAJCSAgICAgICBkZXZwcml2LT5tYWluX2lvYmFzZSArIEFEQ19DT05WRVJUX1JFRyk7CiAKIAkJLyogIHdhaXQgZm9yIGRhdGEgKi8KLQkJZm9yIChpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgewotCQkJYml0cyA9IHJlYWR3KGRldnByaXYtPm1haW5faW9iYXNlICsgSFdfU1RBVFVTX1JFRyk7Ci0JCQlpZiAodGhpc2JvYXJkLT5sYXlvdXQgPT0gTEFZT1VUXzQwMjApIHsKLQkJCQlpZiAocmVhZHcoZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKwotCQkJCQkgIEFEQ19XUklURV9QTlRSX1JFRykpCi0JCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocGlwZV9mdWxsX2JpdHMoYml0cykpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJdWRlbGF5KDEpOwotCQl9Ci0JCWlmIChpID09IHRpbWVvdXQpIHsKLQkJCWNvbWVkaV9lcnJvcihkZXYsICIgYW5hbG9nIGlucHV0IHJlYWQgaW5zbiB0aW1lZCBvdXQiKTsKLQkJCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAic3RhdHVzIDB4JXhcbiIsIGJpdHMpOwotCQkJcmV0dXJuIC1FVElNRTsKLQkJfQorCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGNiX3BjaWRhczY0X2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCiAJCWlmICh0aGlzYm9hcmQtPmxheW91dCA9PSBMQVlPVVRfNDAyMCkKIAkJCWRhdGFbbl0gPSByZWFkbChkZXZwcml2LT5kaW9fY291bnRlcl9pb2Jhc2UgKwogCQkJCQlBRENfRklGT19SRUcpICYgMHhmZmZmOwpAQCAtMzgxNiwxNiArMzgyNCwxOSBAQAogCWlmICh0aGlzYm9hcmQtPmhhc184MjU1KSB7CiAJCWlmICh0aGlzYm9hcmQtPmxheW91dCA9PSBMQVlPVVRfNDAyMCkgewogCQkJZGlvXzgyNTVfaW9iYXNlID0gZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBJODI1NV80MDIwX1JFRzsKLQkJCXN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBkaW9fY2FsbGJhY2tfNDAyMCwKLQkJCQkJICh1bnNpZ25lZCBsb25nKWRpb184MjU1X2lvYmFzZSk7CisJCQlyZXQgPSBzdWJkZXZfODI1NV9pbml0KGRldiwgcywgZGlvX2NhbGxiYWNrXzQwMjAsCisJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylkaW9fODI1NV9pb2Jhc2UpOwogCQl9IGVsc2UgewogCQkJZGlvXzgyNTVfaW9iYXNlID0KIAkJCQlkZXZwcml2LT5kaW9fY291bnRlcl9pb2Jhc2UgKyBESU9fODI1NV9PRkZTRVQ7Ci0JCQlzdWJkZXZfODI1NV9pbml0KGRldiwgcywgZGlvX2NhbGxiYWNrLAotCQkJCQkgKHVuc2lnbmVkIGxvbmcpZGlvXzgyNTVfaW9iYXNlKTsKKwkJCXJldCA9IHN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBkaW9fY2FsbGJhY2ssCisJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylkaW9fODI1NV9pb2Jhc2UpOwogCQl9Ci0JfSBlbHNlCisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CisJfQogCiAJLyogIDggY2hhbm5lbCBkaW8gZm9yIDYweHggKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1s1XTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkZGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkZGEuYwppbmRleCA4Y2NhMDUxLi45MDFkYzVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGRhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRkYS5jCkBAIC0zODgsOCArMzg4LDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgdGhpc2JvYXJkLT5hb19jaGFuczsgaSsrKQogCQljYl9wY2lkZGFfY2FsaWJyYXRlKGRldiwgaSwgZGV2cHJpdi0+YW9fcmFuZ2VbaV0pOwogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlcyBhdHRhY2hlZFxuIiwgZGV2LT5ib2FyZF9uYW1lKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpbWRhcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaW1kYXMuYwppbmRleCA1NzI5NWQxLi5kMzE0MWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpbWRhcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2ltZGFzLmMKQEAgLTg1LDIxICs4NSwzMSBAQAogCXVuc2lnbmVkIGludCBhb19yZWFkYmFja1syXTsKIH07CiAKLS8qCi0gKiAiaW5zdHJ1Y3Rpb25zIiByZWFkL3dyaXRlIGRhdGEgaW4gIm9uZS1zaG90IiBvciAic29mdHdhcmUtdHJpZ2dlcmVkIgotICogbW9kZS4KLSAqLworc3RhdGljIGludCBjYl9wY2ltZGFzX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJc3RydWN0IGNiX3BjaW1kYXNfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW5iKGRldnByaXYtPkJBRFIzICsgMik7CisJaWYgKChzdGF0dXMgJiAweDgwKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IGNiX3BjaW1kYXNfYWlfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgY2JfcGNpbWRhc19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBuLCBpOworCWludCBuOwogCXVuc2lnbmVkIGludCBkOwotCXVuc2lnbmVkIGludCBidXN5OwogCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJdW5zaWduZWQgc2hvcnQgY2hhbmxpbXM7CiAJaW50IG1heGNoYW5zOworCWludCByZXQ7CiAKIAkvKiAgb25seSBzdXBwb3J0IHN3IGluaXRpYXRlZCByZWFkcyBmcm9tIGEgc2luZ2xlIGNoYW5uZWwgKi8KIApAQCAtMTMzLDE3ICsxNDMsMTAgQEAKIAkJLyogdHJpZ2dlciBjb252ZXJzaW9uICovCiAJCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyAwKTsKIAotI2RlZmluZSBUSU1FT1VUIDEwMDAJCS8qIHR5cGljYWxseSB0YWtlcyA1IGxvb3BzIG9uIGEgbGlnaHRseSBsb2FkZWQgUGVudGl1bSAxMDBNSHosICovCi0JCS8qIHRoaXMgaXMgbGlrZWx5IHRvIGJlIDEwMCBsb29wcyBvbiBhIDJHSHogbWFjaGluZSwgc28gc2V0IDEwMDAgYXMgdGhlIGxpbWl0LiAqLwotCiAJCS8qIHdhaXQgZm9yIGNvbnZlcnNpb24gdG8gZW5kICovCi0JCWZvciAoaSA9IDA7IGkgPCBUSU1FT1VUOyBpKyspIHsKLQkJCWJ1c3kgPSBpbmIoZGV2cHJpdi0+QkFEUjMgKyAyKSAmIDB4ODA7Ci0JCQlpZiAoIWJ1c3kpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGkgPT0gVElNRU9VVCkKLQkJCXJldHVybiAtRVRJTUVET1VUOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGNiX3BjaW1kYXNfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKIAkJLyogcmVhZCBkYXRhICovCiAJCWRhdGFbbl0gPSBpbncoZGV2LT5pb2Jhc2UgKyAwKTsKQEAgLTI0Nyw5ICsyNTAsOSBAQAogCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMl07CiAJLyogZGlnaXRhbCBpL28gc3ViZGV2aWNlICovCi0Jc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIE5VTEwsIGlvYmFzZV84MjU1KTsKLQotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgYXR0YWNoZWRcbiIsIGRldi0+Ym9hcmRfbmFtZSk7CisJcmV0ID0gc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIE5VTEwsIGlvYmFzZV84MjU1KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpbWRkYS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaW1kZGEuYwppbmRleCA0M2E4NjYzLi40YTJiMjAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpbWRkYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2ltZGRhLmMKQEAgLTE4Nyw5ICsxODcsNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIGF0dGFjaGVkXG4iLCBkZXYtPmJvYXJkX25hbWUpOwotCi0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY29tZWRpX2RyaXZlciBjYl9wY2ltZGRhX2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9ib25kLmMKaW5kZXggNTFhNTllNS4uODQ1MGM5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9ib25kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9ib25kLmMKQEAgLTIxMSw3ICsyMTEsNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAotCQlzbnByaW50ZihmaWxlLCBzaXplb2YoZmlsZSksICIvZGV2L2NvbWVkaSV1IiwgbWlub3IpOworCQlzbnByaW50ZihmaWxlLCBzaXplb2YoZmlsZSksICIvZGV2L2NvbWVkaSVkIiwgbWlub3IpOwogCQlmaWxlW3NpemVvZihmaWxlKSAtIDFdID0gMDsKIAogCQlkID0gY29tZWRpX29wZW4oZmlsZSk7CkBAIC0yNTQsNiArMjU0LDcgQEAKIAkJCWlmICghZGV2cykgewogCQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCiAJCQkJCSJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5LiBPdXQgb2YgbWVtb3J5P1xuIik7CisJCQkJa2ZyZWUoYmRldik7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CiAJCQlkZXZwcml2LT5kZXZzID0gZGV2czsKQEAgLTI2Myw3ICsyNjQsNyBAQAogCQkJCWNoYXIgYnVmWzIwXTsKIAkJCQlpbnQgbGVmdCA9CiAJCQkJICAgIE1BWF9CT0FSRF9OQU1FIC0gc3RybGVuKGRldnByaXYtPm5hbWUpIC0gMTsKLQkJCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQ6JWQgIiwKKwkJCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXU6JXUgIiwKIAkJCQkJIGJkZXYtPm1pbm9yLCBiZGV2LT5zdWJkZXYpOwogCQkJCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKIAkJCQlzdHJuY2F0KGRldnByaXYtPm5hbWUsIGJ1ZiwgbGVmdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmMKaW5kZXggMjZkOWRiYy4uOWQ5YjE0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuYwpAQCAtMSwzNCArMSw1MyBAQAogLyoKLSAgICBjb21lZGkvZHJpdmVycy9jb21lZGlfZmMuYwotCi0gICAgVGhpcyBpcyBhIHBsYWNlIGZvciBjb2RlIGRyaXZlciB3cml0ZXJzIHdpc2ggdG8gc2hhcmUgYmV0d2VlbgotICAgIHR3byBvciBtb3JlIGRyaXZlcnMuICBmYyBpcyBzaG9ydAotICAgIGZvciBmcmFuay1jb21tb24uCi0KLSAgICBBdXRob3I6ICBGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0gICAgQ29weXJpZ2h0IChDKSAyMDAyIEZyYW5rIE1vcmkgSGVzcwotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qLworICogY29tZWRpX2ZjLmMKKyAqIFRoaXMgaXMgYSBwbGFjZSBmb3IgY29kZSBkcml2ZXIgd3JpdGVycyB3aXNoIHRvIHNoYXJlIGJldHdlZW4KKyAqIHR3byBvciBtb3JlIGRyaXZlcnMuICBmYyBpcyBzaG9ydCBmb3IgZnJhbmstY29tbW9uLgorICoKKyAqIEF1dGhvcjogRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDAyIEZyYW5rIE1vcmkgSGVzcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKICNpbmNsdWRlICJjb21lZGlfZmMuaCIKIAotc3RhdGljIHZvaWQgaW5jcmVtZW50X3NjYW5fcHJvZ3Jlc3Moc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnN1YmQsCi0JCQkJICAgIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpCit1bnNpZ25lZCBpbnQgY2ZjX2J5dGVzX3Blcl9zY2FuKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewotCXN0cnVjdCBjb21lZGlfYXN5bmMgKmFzeW5jID0gc3ViZC0+YXN5bmM7Ci0JdW5zaWduZWQgaW50IHNjYW5fbGVuZ3RoID0gY2ZjX2J5dGVzX3Blcl9zY2FuKHN1YmQpOworCXVuc2lnbmVkIGludCBjaGFubGlzdF9sZW4gPSBzLT5hc3luYy0+Y21kLmNoYW5saXN0X2xlbjsKKwl1bnNpZ25lZCBpbnQgbnVtX3NhbXBsZXM7CisJdW5zaWduZWQgaW50IGJpdHNfcGVyX3NhbXBsZTsKKworCXN3aXRjaCAocy0+dHlwZSkgeworCWNhc2UgQ09NRURJX1NVQkRfREk6CisJY2FzZSBDT01FRElfU1VCRF9ETzoKKwljYXNlIENPTUVESV9TVUJEX0RJTzoKKwkJYml0c19wZXJfc2FtcGxlID0gOCAqIGJ5dGVzX3Blcl9zYW1wbGUocyk7CisJCW51bV9zYW1wbGVzID0gKGNoYW5saXN0X2xlbiArIGJpdHNfcGVyX3NhbXBsZSAtIDEpIC8KKwkJCQliaXRzX3Blcl9zYW1wbGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW51bV9zYW1wbGVzID0gY2hhbmxpc3RfbGVuOworCQlicmVhazsKKwl9CisJcmV0dXJuIG51bV9zYW1wbGVzICogYnl0ZXNfcGVyX3NhbXBsZShzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNmY19ieXRlc19wZXJfc2Nhbik7CisKK3ZvaWQgY2ZjX2luY19zY2FuX3Byb2dyZXNzKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKQoreworCXN0cnVjdCBjb21lZGlfYXN5bmMgKmFzeW5jID0gcy0+YXN5bmM7CisJdW5zaWduZWQgaW50IHNjYW5fbGVuZ3RoID0gY2ZjX2J5dGVzX3Blcl9zY2FuKHMpOwogCiAJYXN5bmMtPnNjYW5fcHJvZ3Jlc3MgKz0gbnVtX2J5dGVzOwogCWlmIChhc3luYy0+c2Nhbl9wcm9ncmVzcyA+PSBzY2FuX2xlbmd0aCkgewpAQCAtMzYsMTIgKzU1LDEzIEBACiAJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPUzsKIAl9CiB9CitFWFBPUlRfU1lNQk9MX0dQTChjZmNfaW5jX3NjYW5fcHJvZ3Jlc3MpOwogCiAvKiBXcml0ZXMgYW4gYXJyYXkgb2YgZGF0YSBwb2ludHMgdG8gY29tZWRpJ3MgYnVmZmVyICovCi11bnNpZ25lZCBpbnQgY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqc3ViZCwKK3Vuc2lnbmVkIGludCBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCSAgICAgICB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKQogewotCXN0cnVjdCBjb21lZGlfYXN5bmMgKmFzeW5jID0gc3ViZC0+YXN5bmM7CisJc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMgPSBzLT5hc3luYzsKIAl1bnNpZ25lZCBpbnQgcmV0dmFsOwogCiAJaWYgKG51bV9ieXRlcyA9PSAwKQpAQCAtNDksMjQgKzY5LDI0IEBACiAKIAlyZXR2YWwgPSBjb21lZGlfYnVmX3dyaXRlX2FsbG9jKGFzeW5jLCBudW1fYnl0ZXMpOwogCWlmIChyZXR2YWwgIT0gbnVtX2J5dGVzKSB7Ci0JCWRldl93YXJuKHN1YmQtPmRldmljZS0+Y2xhc3NfZGV2LCAiY29tZWRpOiBidWZmZXIgb3ZlcnJ1blxuIik7CisJCWRldl93YXJuKHMtPmRldmljZS0+Y2xhc3NfZGV2LCAiYnVmZmVyIG92ZXJydW5cbiIpOwogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKIAkJcmV0dXJuIDA7CiAJfQogCiAJY29tZWRpX2J1Zl9tZW1jcHlfdG8oYXN5bmMsIDAsIGRhdGEsIG51bV9ieXRlcyk7CiAJY29tZWRpX2J1Zl93cml0ZV9mcmVlKGFzeW5jLCBudW1fYnl0ZXMpOwotCWluY3JlbWVudF9zY2FuX3Byb2dyZXNzKHN1YmQsIG51bV9ieXRlcyk7CisJY2ZjX2luY19zY2FuX3Byb2dyZXNzKHMsIG51bV9ieXRlcyk7CiAJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0s7CiAKIAlyZXR1cm4gbnVtX2J5dGVzOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcik7CiAKLXVuc2lnbmVkIGludCBjZmNfcmVhZF9hcnJheV9mcm9tX2J1ZmZlcihzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqc3ViZCwKK3Vuc2lnbmVkIGludCBjZmNfcmVhZF9hcnJheV9mcm9tX2J1ZmZlcihzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQkJdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IG51bV9ieXRlcykKIHsKLQlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYyA9IHN1YmQtPmFzeW5jOworCXN0cnVjdCBjb21lZGlfYXN5bmMgKmFzeW5jID0gcy0+YXN5bmM7CiAKIAlpZiAobnVtX2J5dGVzID09IDApCiAJCXJldHVybiAwOwpAQCAtNzQsNyArOTQsNyBAQAogCW51bV9ieXRlcyA9IGNvbWVkaV9idWZfcmVhZF9hbGxvYyhhc3luYywgbnVtX2J5dGVzKTsKIAljb21lZGlfYnVmX21lbWNweV9mcm9tKGFzeW5jLCAwLCBkYXRhLCBudW1fYnl0ZXMpOwogCWNvbWVkaV9idWZfcmVhZF9mcmVlKGFzeW5jLCBudW1fYnl0ZXMpOwotCWluY3JlbWVudF9zY2FuX3Byb2dyZXNzKHN1YmQsIG51bV9ieXRlcyk7CisJY2ZjX2luY19zY2FuX3Byb2dyZXNzKHMsIG51bV9ieXRlcyk7CiAJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0s7CiAKIAlyZXR1cm4gbnVtX2J5dGVzOwpAQCAtODIsMzQgKzEwMiwzMyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoY2ZjX3JlYWRfYXJyYXlfZnJvbV9idWZmZXIpOwogCiB1bnNpZ25lZCBpbnQgY2ZjX2hhbmRsZV9ldmVudHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqc3ViZCkKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKLQl1bnNpZ25lZCBpbnQgZXZlbnRzID0gc3ViZC0+YXN5bmMtPmV2ZW50czsKKwl1bnNpZ25lZCBpbnQgZXZlbnRzID0gcy0+YXN5bmMtPmV2ZW50czsKIAogCWlmIChldmVudHMgPT0gMCkKIAkJcmV0dXJuIGV2ZW50czsKIAogCWlmIChldmVudHMgJiAoQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9PVkVSRkxPVykpCi0JCXN1YmQtPmNhbmNlbChkZXYsIHN1YmQpOworCQlzLT5jYW5jZWwoZGV2LCBzKTsKIAotCWNvbWVkaV9ldmVudChkZXYsIHN1YmQpOworCWNvbWVkaV9ldmVudChkZXYsIHMpOwogCiAJcmV0dXJuIGV2ZW50czsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNmY19oYW5kbGVfZXZlbnRzKTsKIAotTU9EVUxFX0FVVEhPUigiRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTaGFyZWQgZnVuY3Rpb25zIGZvciBDb21lZGkgbG93LWxldmVsIGRyaXZlcnMiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQogc3RhdGljIGludCBfX2luaXQgY29tZWRpX2ZjX2luaXRfbW9kdWxlKHZvaWQpCiB7CiAJcmV0dXJuIDA7CiB9Cittb2R1bGVfaW5pdChjb21lZGlfZmNfaW5pdF9tb2R1bGUpOwogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY29tZWRpX2ZjX2NsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiB9Ci0KLW1vZHVsZV9pbml0KGNvbWVkaV9mY19pbml0X21vZHVsZSk7CiBtb2R1bGVfZXhpdChjb21lZGlfZmNfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNoYXJlZCBmdW5jdGlvbnMgZm9yIENvbWVkaSBsb3ctbGV2ZWwgZHJpdmVycyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5oCmluZGV4IDg1NThiMDcuLjU0MWI5MzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmgKQEAgLTEsNzIgKzEsNTIgQEAKIC8qCi0gICAgY29tZWRpX2ZjLmgKLQotICAgIFRoaXMgaXMgYSBwbGFjZSBmb3IgY29kZSBkcml2ZXIgd3JpdGVycyB3aXNoIHRvIHNoYXJlIGJldHdlZW4KLSAgICB0d28gb3IgbW9yZSBkcml2ZXJzLiBUaGVzZSBmdW5jdGlvbnMgYXJlIG1lYW50IHRvIGJlIHVzZWQgb25seQotICAgIGJ5IGRyaXZlcnMsIHRoZXkgYXJlIE5PVCBwYXJ0IG9mIHRoZSBrY29tZWRpbGliIEFQSSEKLQotICAgIEF1dGhvcjogIEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLSAgICBDb3B5cmlnaHQgKEMpIDIwMDIgRnJhbmsgTW9yaSBIZXNzCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSovCisgKiBjb21lZGlfZmMuaAorICogVGhpcyBpcyBhIHBsYWNlIGZvciBjb2RlIGRyaXZlciB3cml0ZXJzIHdpc2ggdG8gc2hhcmUgYmV0d2VlbgorICogdHdvIG9yIG1vcmUgZHJpdmVycy4gVGhlc2UgZnVuY3Rpb25zIGFyZSBtZWFudCB0byBiZSB1c2VkIG9ubHkKKyAqIGJ5IGRyaXZlcnMsIHRoZXkgYXJlIE5PVCBwYXJ0IG9mIHRoZSBrY29tZWRpbGliIEFQSSEKKyAqCisgKiBBdXRob3I6IEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwMiBGcmFuayBNb3JpIEhlc3MKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KIAogI2lmbmRlZiBfQ09NRURJX0ZDX0gKICNkZWZpbmUgX0NPTUVESV9GQ19ICiAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAotLyogV3JpdGVzIGFuIGFycmF5IG9mIGRhdGEgcG9pbnRzIHRvIGNvbWVkaSdzIGJ1ZmZlciAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzdWJkLAotCQkJCQkgICAgICB2b2lkICpkYXRhLAotCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKTsKK3Vuc2lnbmVkIGludCBjZmNfYnl0ZXNfcGVyX3NjYW4oc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKik7Cit2b2lkIGNmY19pbmNfc2Nhbl9wcm9ncmVzcyhzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLCB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKTsKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2ZjX3dyaXRlX3RvX2J1ZmZlcihzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqc3ViZCwKKy8qIFdyaXRlcyBhbiBhcnJheSBvZiBkYXRhIHBvaW50cyB0byBjb21lZGkncyBidWZmZXIgKi8KK3Vuc2lnbmVkIGludCBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICosCisJCQkJICAgICAgIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjZmNfd3JpdGVfdG9fYnVmZmVyKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgZGF0YSkKIHsKLQlyZXR1cm4gY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihzdWJkLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKwlyZXR1cm4gY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihzLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNmY193cml0ZV9sb25nX3RvX2J1ZmZlcihzdHJ1Y3QgY29tZWRpX3N1YmRldmljZQotCQkJCQkJICAgICpzdWJkLCB1bnNpZ25lZCBpbnQgZGF0YSkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNmY193cml0ZV9sb25nX3RvX2J1ZmZlcihzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkJCSAgICB1bnNpZ25lZCBpbnQgZGF0YSkKIHsKLQlyZXR1cm4gY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihzdWJkLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKwlyZXR1cm4gY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihzLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKIH07CiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgY2ZjX3JlYWRfYXJyYXlfZnJvbV9idWZmZXIoc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnN1YmQsCi0JCQkJCSAgICAgICB2b2lkICpkYXRhLAotCQkJCQkgICAgICAgdW5zaWduZWQgaW50IG51bV9ieXRlcyk7Cit1bnNpZ25lZCBpbnQgY2ZjX3JlYWRfYXJyYXlfZnJvbV9idWZmZXIoc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKKwkJCQkJdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IG51bV9ieXRlcyk7CiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgY2ZjX2hhbmRsZV9ldmVudHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqc3ViZCk7Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNmY19ieXRlc19wZXJfc2NhbihzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqc3ViZCkKLXsKLQlpbnQgbnVtX3NhbXBsZXM7Ci0JaW50IGJpdHNfcGVyX3NhbXBsZTsKLQotCXN3aXRjaCAoc3ViZC0+dHlwZSkgewotCWNhc2UgQ09NRURJX1NVQkRfREk6Ci0JY2FzZSBDT01FRElfU1VCRF9ETzoKLQljYXNlIENPTUVESV9TVUJEX0RJTzoKLQkJYml0c19wZXJfc2FtcGxlID0gOCAqIGJ5dGVzX3Blcl9zYW1wbGUoc3ViZCk7Ci0JCW51bV9zYW1wbGVzID0gKHN1YmQtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuICsKLQkJCSAgICAgICBiaXRzX3Blcl9zYW1wbGUgLSAxKSAvIGJpdHNfcGVyX3NhbXBsZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJbnVtX3NhbXBsZXMgPSBzdWJkLT5hc3luYy0+Y21kLmNoYW5saXN0X2xlbjsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBudW1fc2FtcGxlcyAqIGJ5dGVzX3Blcl9zYW1wbGUoc3ViZCk7Ci19Cit1bnNpZ25lZCBpbnQgY2ZjX2hhbmRsZV9ldmVudHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsKIAogLyoqCiAgKiBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoKSAtIHRyaXZpYWxseSB2YWxpZGF0ZSBhIGNvbWVkaV9jbWQgdHJpZ2dlciBzb3VyY2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfdGVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMKaW5kZXggZDUzOWVhZi4uY2Q5NTYyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMKQEAgLTE4NSw3ICsxODUsNiBAQAogCSAgICAoZGV2cHJpdi0+dXNlY19yZW1haW5kZXIgKyBlbGFwc2VkX3RpbWUpIC8gZGV2cHJpdi0+c2Nhbl9wZXJpb2Q7CiAJZGV2cHJpdi0+dXNlY19yZW1haW5kZXIgPQogCSAgICAoZGV2cHJpdi0+dXNlY19yZW1haW5kZXIgKyBlbGFwc2VkX3RpbWUpICUgZGV2cHJpdi0+c2Nhbl9wZXJpb2Q7Ci0JYXN5bmMtPmV2ZW50cyA9IDA7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CiAJCXVuc2lnbmVkIGludCByZW1haW5pbmcgPSBjbWQtPnN0b3BfYXJnIC0gZGV2cHJpdi0+YWlfY291bnQ7CkBAIC0zMTgsMTIgKzMxNyw4IEBACiAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX05PVykKIAkJZGV2cHJpdi0+Y29udmVydF9wZXJpb2QgPSAwOwotCWVsc2UgaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKKwllbHNlCS8qIFRSSUdfVElNRVIgKi8KIAkJZGV2cHJpdi0+Y29udmVydF9wZXJpb2QgPSBjbWQtPmNvbnZlcnRfYXJnIC8gbmFub19wZXJfbWljcm87Ci0JZWxzZSB7Ci0JCWNvbWVkaV9lcnJvcihkZXYsICJidWcgc2V0dGluZyBjb252ZXJzaW9uIHBlcmlvZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQogCiAJZG9fZ2V0dGltZW9mZGF5KCZkZXZwcml2LT5sYXN0KTsKIAlkZXZwcml2LT51c2VjX2N1cnJlbnQgPSBkZXZwcml2LT5sYXN0LnR2X3VzZWMgJSBkZXZwcml2LT51c2VjX3BlcmlvZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb250ZWNfcGNpX2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbnRlY19wY2lfZGlvLmMKaW5kZXggMzIzYTdmMy4uMGE5YzMyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbnRlY19wY2lfZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbnRlY19wY2lfZGlvLmMKQEAgLTkyLDggKzkyLDYgQEAKIAlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV9kaWdpdGFsOwogCXMtPmluc25fYml0cwk9IGNvbnRlY19kb19pbnNuX2JpdHM7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIGF0dGFjaGVkXG4iLCBkZXYtPmJvYXJkX25hbWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYWMwMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhYzAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0NmUwYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYWMwMi5jCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogZGFjMDIuYworICogQ29tZWRpIGRyaXZlciBmb3IgREFDMDIgY29tcGF0aWJsZSBib2FyZHMKKyAqIENvcHlyaWdodCAoQykgMjAxNCBIIEhhcnRsZXkgU3dlZXRlbiA8aHN3ZWV0ZW5AdmlzaW9uZW5ncmF2ZXJzLmNvbT4KKyAqCisgKiBCYXNlZCBvbiB0aGUgcG9jIGRyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDAwIEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwMSBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qCisgKiBEcml2ZXI6IGRhYzAyCisgKiBEZXNjcmlwdGlvbjogQ29tZWRpIGRyaXZlciBmb3IgREFDMDIgY29tcGF0aWJsZSBib2FyZHMKKyAqIERldmljZXM6IChLZWl0aGxleSBNZXRyYWJ5dGUpIERBQy0wMiBbZGFjMDJdCisgKiBBdXRob3I6IEggSGFydGxleSBTd2VldGVuIDxoc3dlZXRlbkB2aXNpb25lbmdyYXZlcnMuY29tPgorICogVXBkYXRlZDogVHVlLCAxMSBNYXIgMjAxNCAxMToyNzoxOSAtMDcwMAorICogU3RhdHVzOiB1bmtub3duCisgKgorICogQ29uZmlndXJhdGlvbiBvcHRpb25zOgorICoJWzBdIC0gSS9PIHBvcnQgYmFzZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCisvKgorICogVGhlIG91dHB1dCByYW5nZSBpcyBzZWxlY3RlZCBieSBqdW1wZXJpbmcgcGlucyBvbiB0aGUgSS9PIGNvbm5lY3Rvci4KKyAqCisgKgkgICAgUmFuZ2UgICAgICBDaGFuICMgICBKdW1wZXIgcGlucyAgICAgICAgT3V0cHV0CisgKgktLS0tLS0tLS0tLS0tICAtLS0tLS0gIC0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tCisgKgkgICAwIHRvIDVWICAgICAgIDAgICAgICAgIDIxIHRvIDIyICAgICAgMjQKKyAqCSAgICAgICAgICAgICAgICAgMSAgICAgICAgMTUgdG8gMTYgICAgICAxOAorICoJICAgMCB0byAxMFYgICAgICAwICAgICAgICAyMCB0byAyMiAgICAgIDI0CisgKgkgICAgICAgICAgICAgICAgIDEgICAgICAgIDE0IHRvIDE2ICAgICAgMTgKKyAqCSAgICArLy01ViAgICAgICAgMCAgICAgICAgMjEgdG8gMjIgICAgICAyMworICoJICAgICAgICAgICAgICAgICAxICAgICAgICAxNSB0byAxNiAgICAgIDE3CisgKgkgICAgKy8tMTBWICAgICAgIDAgICAgICAgIDIwIHRvIDIyICAgICAgMjMKKyAqCSAgICAgICAgICAgICAgICAgMSAgICAgICAgMTQgdG8gMTYgICAgICAxNworICoJICA0IHRvIDIwbUEgICAgICAwICAgICAgICAyMSB0byAyMiAgICAgIDI1CisgKgkgICAgICAgICAgICAgICAgIDEgICAgICAgIDE1IHRvIDE2ICAgICAgMTkKKyAqCUFDIHJlZmVyZW5jZSAgICAgMCAgICAgIEluIG9uIHBpbiAyMiAgICAyNCAoMi1xdWFkcmFudCkKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgIEluIG9uIHBpbiAyMiAgICAyMyAoNC1xdWFkcmFudCkKKyAqCSAgICAgICAgICAgICAgICAgMSAgICAgIEluIG9uIHBpbiAxNiAgICAxOCAoMi1xdWFkcmFudCkKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgIEluIG9uIHBpbiAxNiAgICAxNyAoNC1xdWFkcmFudCkKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIGRhczAyX2FvX3JhbmdlcyA9IHsKKwk2LCB7CisJCVVOSV9SQU5HRSg1KSwKKwkJVU5JX1JBTkdFKDEwKSwKKwkJQklQX1JBTkdFKDUpLAorCQlCSVBfUkFOR0UoMTApLAorCQlSQU5HRV9tQSg0LCAyMCksCisJCVJBTkdFX2V4dCgwLCAxKQorCX0KK307CisKK3N0cnVjdCBkYWMwMl9wcml2YXRlIHsKKwl1bnNpZ25lZCBpbnQgYW9fcmVhZGJhY2tbMl07Cit9OworCisvKgorICogUmVnaXN0ZXIgSS9PIG1hcAorICovCisjZGVmaW5lIERBQzAyX0FPX0xTQih4KQkJKDB4MDAgKyAoKHgpICogMikpCisjZGVmaW5lIERBQzAyX0FPX01TQih4KQkJKDB4MDEgKyAoKHgpICogMikpCisKK3N0YXRpYyBpbnQgZGFjMDJfYW9faW5zbl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJc3RydWN0IGRhYzAyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJdmFsID0gZGF0YVtpXTsKKworCQlkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXSA9IHZhbDsKKworCQkvKgorCQkgKiBVbmlwb2xhciBvdXRwdXRzIGFyZSB0cnVlIGJpbmFyeSBlbmNvZGluZy4KKwkJICogQmlwb2xhciBvdXRwdXRzIGFyZSBjb21wbGVtZW50YXJ5IG9mZnNldCBiaW5hcnkKKwkJICogKHRoYXQgaXMsIDAgPSArZnVsbCBzY2FsZSwgbWF4ZGF0YSA9IC1mdWxsIHNjYWxlKS4KKwkJICovCisJCWlmIChjb21lZGlfcmFuZ2VfaXNfYmlwb2xhcihzLCByYW5nZSkpCisJCQl2YWwgPSBzLT5tYXhkYXRhIC0gdmFsOworCisJCS8qCisJCSAqIERBQ3MgYXJlIGRvdWJsZS1idWZmZXJlZC4KKwkJICogV3JpdGUgTFNCIHRoZW4gTVNCIHRvIGxhdGNoIG91dHB1dC4KKwkJICovCisJCW91dGIoKHZhbCA8PCA0KSAmIDB4ZjAsIGRldi0+aW9iYXNlICsgREFDMDJfQU9fTFNCKGNoYW4pKTsKKwkJb3V0YigodmFsID4+IDQpICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBEQUMwMl9BT19NU0IoY2hhbikpOworCX0KKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IGRhYzAyX2FvX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJc3RydWN0IGRhYzAyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspCisJCWRhdGFbaV0gPSBkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IGRhYzAyX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpCit7CisJc3RydWN0IGRhYzAyX3ByaXZhdGUgKmRldnByaXY7CisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CisJaW50IHJldDsKKworCWRldnByaXYgPSBjb21lZGlfYWxsb2NfZGV2cHJpdihkZXYsIHNpemVvZigqZGV2cHJpdikpOworCWlmICghZGV2cHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgMHgwOCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEFuYWxvZyBPdXRwdXQgc3ViZGV2aWNlICovCisJcyA9ICZkZXYtPnN1YmRldmljZXNbMF07CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9BTzsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfV1JJVEFCTEU7CisJcy0+bl9jaGFuCT0gMjsKKwlzLT5tYXhkYXRhCT0gMHgwZmZmOworCXMtPnJhbmdlX3RhYmxlCT0gJmRhczAyX2FvX3JhbmdlczsKKwlzLT5pbnNuX3dyaXRlCT0gZGFjMDJfYW9faW5zbl93cml0ZTsKKwlzLT5pbnNuX3JlYWQJPSBkYWMwMl9hb19pbnNuX3JlYWQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIGRhYzAyX2RyaXZlciA9IHsKKwkuZHJpdmVyX25hbWUJPSAiZGFjMDIiLAorCS5tb2R1bGUJCT0gVEhJU19NT0RVTEUsCisJLmF0dGFjaAkJPSBkYWMwMl9hdHRhY2gsCisJLmRldGFjaAkJPSBjb21lZGlfbGVnYWN5X2RldGFjaCwKK307Cittb2R1bGVfY29tZWRpX2RyaXZlcihkYWMwMl9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJIIEhhcnRsZXkgU3dlZXRlbiA8aHN3ZWV0ZW5AdmlzaW9uZW5ncmF2ZXJzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGRyaXZlciBmb3IgREFDMDIgY29tcGF0aWJsZSBib2FyZHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXFib2FyZDIwMDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXFib2FyZDIwMDAuYwppbmRleCBjZTE1M2ZjLi5hOGY2MDM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFxYm9hcmQyMDAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhcWJvYXJkMjAwMC5jCkBAIC0zMzMsMTQgKzMzMywyOCBAQAogCXdyaXRlQWNxU2Nhbkxpc3RFbnRyeShkZXYsIHdvcmQzKTsKIH0KIAorc3RhdGljIGludCBkYXFib2FyZDIwMDBfYWlfc3RhdHVzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgZGFxYm9hcmQyMDAwX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHJlYWR3KGRldnByaXYtPmRhcSArIGFjcUNvbnRyb2wpOworCWlmIChzdGF0dXMgJiBjb250ZXh0KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IGRhcWJvYXJkMjAwMF9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCSAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAogCQkJCSAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBkYXFib2FyZDIwMDBfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCWludCBnYWluLCBjaGFuLCB0aW1lb3V0OworCWludCBnYWluLCBjaGFuOworCWludCByZXQ7CiAJaW50IGk7CiAKIAl3cml0ZXcoREFRQk9BUkQyMDAwX0FjcVJlc2V0U2Nhbkxpc3RGaWZvIHwKQEAgLTM2NywyNSArMzgxLDI0IEBACiAJCS8qIEVuYWJsZSByZWFkaW5nIGZyb20gdGhlIHNjYW5saXN0IEZJRk8gKi8KIAkJd3JpdGV3KERBUUJPQVJEMjAwMF9TZXFTdGFydFNjYW5MaXN0LAogCQkgICAgICAgZGV2cHJpdi0+ZGFxICsgYWNxQ29udHJvbCk7Ci0JCWZvciAodGltZW91dCA9IDA7IHRpbWVvdXQgPCAyMDsgdGltZW91dCsrKSB7Ci0JCQl2YWwgPSByZWFkdyhkZXZwcml2LT5kYXEgKyBhY3FDb250cm9sKTsKLQkJCWlmICh2YWwgJiBEQVFCT0FSRDIwMDBfQWNxQ29uZmlnUGlwZUZ1bGwpCi0JCQkJYnJlYWs7Ci0JCQkvKiB1ZGVsYXkoMik7ICovCi0JCX0KKworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGRhcWJvYXJkMjAwMF9haV9zdGF0dXMsCisJCQkJICAgICBEQVFCT0FSRDIwMDBfQWNxQ29uZmlnUGlwZUZ1bGwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwogCQl3cml0ZXcoREFRQk9BUkQyMDAwX0FkY1BhY2VyRW5hYmxlLCBkZXZwcml2LT5kYXEgKyBhY3FDb250cm9sKTsKLQkJZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDIwOyB0aW1lb3V0KyspIHsKLQkJCXZhbCA9IHJlYWR3KGRldnByaXYtPmRhcSArIGFjcUNvbnRyb2wpOwotCQkJaWYgKHZhbCAmIERBUUJPQVJEMjAwMF9BY3FMb2dpY1NjYW5uaW5nKQotCQkJCWJyZWFrOwotCQkJLyogdWRlbGF5KDIpOyAqLwotCQl9Ci0JCWZvciAodGltZW91dCA9IDA7IHRpbWVvdXQgPCAyMDsgdGltZW91dCsrKSB7Ci0JCQl2YWwgPSByZWFkdyhkZXZwcml2LT5kYXEgKyBhY3FDb250cm9sKTsKLQkJCWlmICh2YWwgJiBEQVFCT0FSRDIwMDBfQWNxUmVzdWx0c0ZJRk9IYXNWYWxpZERhdGEpCi0JCQkJYnJlYWs7Ci0JCQkvKiB1ZGVsYXkoMik7ICovCi0JCX0KKworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGRhcWJvYXJkMjAwMF9haV9zdGF0dXMsCisJCQkJICAgICBEQVFCT0FSRDIwMDBfQWNxTG9naWNTY2FubmluZyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZGFxYm9hcmQyMDAwX2FpX3N0YXR1cywKKwkJCQkgICAgIERBUUJPQVJEMjAwMF9BY3FSZXN1bHRzRklGT0hhc1ZhbGlkRGF0YSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCiAJCWRhdGFbaV0gPSByZWFkdyhkZXZwcml2LT5kYXEgKyBhY3FSZXN1bHRzRklGTyk7CiAJCXdyaXRldyhEQVFCT0FSRDIwMDBfQWRjUGFjZXJEaXNhYmxlLCBkZXZwcml2LT5kYXEgKyBhY3FDb250cm9sKTsKIAkJd3JpdGV3KERBUUJPQVJEMjAwMF9TZXFTdG9wU2Nhbkxpc3QsIGRldnByaXYtPmRhcSArIGFjcUNvbnRyb2wpOwpAQCAtNDA5LDYgKzQyMiwyMSBAQAogCXJldHVybiBpOwogfQogCitzdGF0aWMgaW50IGRhcWJvYXJkMjAwMF9hb19lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXN0cnVjdCBkYXFib2FyZDIwMDBfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSByZWFkdyhkZXZwcml2LT5kYXEgKyBkYWNDb250cm9sKTsKKwlpZiAoKHN0YXR1cyAmICgoY2hhbiArIDEpICogMHgwMDEwKSkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBkYXFib2FyZDIwMDBfYW9faW5zbl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKQEAgLTQxNiw4ICs0NDQsNyBAQAogewogCXN0cnVjdCBkYXFib2FyZDIwMDBfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCXVuc2lnbmVkIGludCB2YWw7Ci0JaW50IHRpbWVvdXQ7CisJaW50IHJldDsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKQEAgLTQzMSwxMiArNDU4LDExIEBACiAJCXVkZWxheSgxMDAwKTsKICNlbmRpZgogCQl3cml0ZXcoZGF0YVtpXSwgZGV2cHJpdi0+ZGFxICsgZGFjU2V0dGluZyhjaGFuKSk7Ci0JCWZvciAodGltZW91dCA9IDA7IHRpbWVvdXQgPCAyMDsgdGltZW91dCsrKSB7Ci0JCQl2YWwgPSByZWFkdyhkZXZwcml2LT5kYXEgKyBkYWNDb250cm9sKTsKLQkJCWlmICgodmFsICYgKChjaGFuICsgMSkgKiAweDAwMTApKSA9PSAwKQotCQkJCWJyZWFrOwotCQkJLyogdWRlbGF5KDIpOyAqLwotCQl9CisKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBkYXFib2FyZDIwMDBfYW9fZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKIAkJZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl0gPSBkYXRhW2ldOwogI2lmIDAKIAkJLyoKQEAgLTczNyw5ICs3NjMsNiBAQAogCWlmIChyZXN1bHQpCiAJCXJldHVybiByZXN1bHQ7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzOiAlcyBhdHRhY2hlZFxuIiwKLQkJZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lLCBkZXYtPmJvYXJkX25hbWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMwOC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczA4LmMKaW5kZXggZTVjMGVlOS4uYzVlMzUyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczA4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczA4LmMKQEAgLTIwMSwxNyArMjAxLDI5IEBACiAJZGFzMDhfcGdtX2dhaW5saXN0LAogfTsKIAotI2RlZmluZSBUSU1FT1VUIDEwMDAwMAorc3RhdGljIGludCBkYXMwOF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEQVMwOF9TVEFUVVMpOworCWlmICgoc3RhdHVzICYgREFTMDhfRU9DKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQogCiBzdGF0aWMgaW50IGRhczA4X2FpX3JpbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAljb25zdCBzdHJ1Y3QgZGFzMDhfYm9hcmRfc3RydWN0ICp0aGlzYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKIAlzdHJ1Y3QgZGFzMDhfcHJpdmF0ZV9zdHJ1Y3QgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IGksIG47CisJaW50IG47CiAJaW50IGNoYW47CiAJaW50IHJhbmdlOwogCWludCBsc2IsIG1zYjsKKwlpbnQgcmV0OwogCiAJY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwogCXJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOwpAQCAtMjQ0LDE0ICsyNTYsMTAgQEAKIAkJLyogdHJpZ2dlciBjb252ZXJzaW9uICovCiAJCW91dGJfcCgwLCBkZXYtPmlvYmFzZSArIERBUzA4X1RSSUdfMTJCSVQpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBUSU1FT1VUOyBpKyspIHsKLQkJCWlmICghKGluYihkZXYtPmlvYmFzZSArIERBUzA4X1NUQVRVUykgJiBEQVMwOF9FT0MpKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpID09IFRJTUVPVVQpIHsKLQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJ0aW1lb3V0XG4iKTsKLQkJCXJldHVybiAtRVRJTUU7Ci0JCX0KKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBkYXMwOF9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwogCQltc2IgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEQVMwOF9NU0IpOwogCQlsc2IgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEQVMwOF9MU0IpOwogCQlpZiAodGhpc2JvYXJkLT5haV9lbmNvZGluZyA9PSBkYXMwOF9lbmNvZGUxMikgewpAQCAtNTI5LDkgKzUzNywxMCBAQAogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzRdOwogCS8qIDgyNTUgKi8KIAlpZiAodGhpc2JvYXJkLT5pODI1NV9vZmZzZXQgIT0gMCkgewotCQlzdWJkZXZfODI1NV9pbml0KGRldiwgcywgTlVMTCwgKHVuc2lnbmVkIGxvbmcpKGRldi0+aW9iYXNlICsKLQkJCQkJCQkgICAgICAgdGhpc2JvYXJkLT4KLQkJCQkJCQkgICAgICAgaTgyNTVfb2Zmc2V0KSk7CisJCXJldCA9IHN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBOVUxMLAorCQkJCSAgICAgICBkZXYtPmlvYmFzZSArIHRoaXNib2FyZC0+aTgyNTVfb2Zmc2V0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfSBlbHNlIHsKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxNi5jCmluZGV4IGE4NDQ2Y2EuLjZhN2Q2NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxNi5jCkBAIC04NTYsMTggKzg1NiwxNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBkYXMxNl9haV93YWl0X2Zvcl9jb252KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICB1bnNpZ25lZCBpbnQgdGltZW91dCkKK3N0YXRpYyBpbnQgZGFzMTZfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCXVuc2lnbmVkIGxvbmcgY29udGV4dCkKIHsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzOwotCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgewotCQlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEQVMxNl9TVEFUVVNfUkVHKTsKLQkJaWYgKCEoc3RhdHVzICYgREFTMTZfU1RBVFVTX0JVU1kpKQotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRVRJTUU7CisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgREFTMTZfU1RBVFVTX1JFRyk7CisJaWYgKChzdGF0dXMgJiBEQVMxNl9TVEFUVVNfQlVTWSkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKIH0KIAogc3RhdGljIGludCBkYXMxNl9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTg5Nyw3ICs4OTYsNyBAQAogCQkvKiB0cmlnZ2VyIGNvbnZlcnNpb24gKi8KIAkJb3V0Yl9wKDAsIGRldi0+aW9iYXNlICsgREFTMTZfVFJJR19SRUcpOwogCi0JCXJldCA9IGRhczE2X2FpX3dhaXRfZm9yX2NvbnYoZGV2LCAxMDAwKTsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBkYXMxNl9haV9lb2MsIDApOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2bTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxNm0xLmMKaW5kZXggZmVlNWZhYy4uNzc5MjI1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2bTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTZtMS5jCkBAIC0zMzEsMTQgKzMzMSwyNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGRhczE2bTFfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgREFTMTZNMV9DUyk7CisJaWYgKHN0YXR1cyAmIElSUURBVEEpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgZGFzMTZtMV9haV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBkYXMxNm0xX3ByaXZhdGVfc3RydWN0ICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBpLCBuOworCWludCByZXQ7CisJaW50IG47CiAJaW50IGJ5dGU7Ci0JY29uc3QgaW50IHRpbWVvdXQgPSAxMDAwOwogCiAJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBpbnRlcm5hbCBwYWNlciAqLwogCWRldnByaXYtPmNvbnRyb2xfc3RhdGUgJj0gfklOVEUgJiB+UEFDRVJfTUFTSzsKQEAgLTM1NiwxNCArMzY5LDEwIEBACiAJCS8qIHRyaWdnZXIgY29udmVyc2lvbiAqLwogCQlvdXRiKDAsIGRldi0+aW9iYXNlKTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7Ci0JCQlpZiAoaW5iKGRldi0+aW9iYXNlICsgREFTMTZNMV9DUykgJiBJUlFEQVRBKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpID09IHRpbWVvdXQpIHsKLQkJCWNvbWVkaV9lcnJvcihkZXYsICJ0aW1lb3V0Iik7Ci0JCQlyZXR1cm4gLUVUSU1FOwotCQl9CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZGFzMTZtMV9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwogCQlkYXRhW25dID0gbXVuZ2Vfc2FtcGxlKGludyhkZXYtPmlvYmFzZSkpOwogCX0KIApAQCAtNDA3LDcgKzQxNiw2IEBACiAKIAlzID0gZGV2LT5yZWFkX3N1YmRldjsKIAlhc3luYyA9IHMtPmFzeW5jOwotCWFzeW5jLT5ldmVudHMgPSAwOwogCWNtZCA9ICZhc3luYy0+Y21kOwogCiAJLyogIGZpZ3VyZSBvdXQgaG93IG1hbnkgc2FtcGxlcyBhcmUgaW4gZmlmbyAqLwpAQCAtNDQwLDggKzQ0OCw4IEBACiAJZGV2cHJpdi0+YWRjX2NvdW50ICs9IG51bV9zYW1wbGVzOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgewotCQlpZiAoZGV2cHJpdi0+YWRjX2NvdW50ID49IGNtZC0+c3RvcF9hcmcgKiBjbWQtPmNoYW5saXN0X2xlbikgewkvKiBlbmQgb2YgYWNxdWlzaXRpb24gKi8KLQkJCWRhczE2bTFfY2FuY2VsKGRldiwgcyk7CisJCWlmIChkZXZwcml2LT5hZGNfY291bnQgPj0gY21kLT5zdG9wX2FyZyAqIGNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCQkvKiBlbmQgb2YgYWNxdWlzaXRpb24gKi8KIAkJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKIAkJfQogCX0KQEAgLTQ0OSwxMyArNDU3LDExIEBACiAJLyogdGhpcyBwcm9iYWJseSB3b24ndCBjYXRjaCBvdmVycnVucyBzaW5jZSB0aGUgY2FyZCBkb2Vzbid0IGdlbmVyYXRlCiAJICogb3ZlcnJ1biBpbnRlcnJ1cHRzLCBidXQgd2UgbWlnaHQgYXMgd2VsbCB0cnkgKi8KIAlpZiAoc3RhdHVzICYgT1ZSVU4pIHsKLQkJZGFzMTZtMV9jYW5jZWwoZGV2LCBzKTsKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOwogCQljb21lZGlfZXJyb3IoZGV2LCAiZmlmbyBvdmVyZmxvdyIpOwogCX0KIAotCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIH0KIAogc3RhdGljIGludCBkYXMxNm0xX3BvbGwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTgwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE4MDAuYwppbmRleCAzMjBkOTVhLi44ZTk3NWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTgwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxODAwLmMKQEAgLTY0Niw3ICs2NDYsNiBAQAogCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmYXN5bmMtPmNtZDsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgREFTMTgwMF9TVEFUVVMpOwogCi0JYXN5bmMtPmV2ZW50cyA9IDA7CiAJLyogIHNlbGVjdCBhZGMgZm9yIGJhc2UgYWRkcmVzcyArIDAgKi8KIAlvdXRiKEFEQywgZGV2LT5pb2Jhc2UgKyBEQVMxODAwX1NFTEVDVCk7CiAJLyogIGRtYSBidWZmZXIgZnVsbCAqLwpAQCAtNjY1LDkgKzY2NCw4IEBACiAJCS8qICBjbGVhciBPVkYgaW50ZXJydXB0IGJpdCAqLwogCQlvdXRiKENMRUFSX0lOVFJfTUFTSyAmIH5PVkYsIGRldi0+aW9iYXNlICsgREFTMTgwMF9TVEFUVVMpOwogCQljb21lZGlfZXJyb3IoZGV2LCAiREFTMTgwMCBGSUZPIG92ZXJmbG93Iik7Ci0JCWRhczE4MDBfY2FuY2VsKGRldiwgcyk7CiAJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SIHwgQ09NRURJX0NCX0VPQTsKLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAJCXJldHVybjsKIAl9CiAJLyogIHN0b3AgdGFraW5nIGRhdGEgaWYgYXBwcm9wcmlhdGUgKi8KQEAgLTY4MCwxNiArNjc4LDEyIEBACiAJCQlkYXMxODAwX2ZsdXNoX2RtYShkZXYsIHMpOwogCQllbHNlCiAJCQlkYXMxODAwX2hhbmRsZV9maWZvX25vdF9lbXB0eShkZXYsIHMpOwotCQlkYXMxODAwX2NhbmNlbChkZXYsIHMpOwkvKiBkaXNhYmxlIGhhcmR3YXJlIGNvbnZlcnNpb25zICovCiAJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKIAl9IGVsc2UgaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCAmJiBkZXZwcml2LT5jb3VudCA9PSAwKSB7CS8qICBzdG9wX3NyYyBUUklHX0NPVU5UICovCi0JCWRhczE4MDBfY2FuY2VsKGRldiwgcyk7CS8qIGRpc2FibGUgaGFyZHdhcmUgY29udmVyc2lvbnMgKi8KIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwogCX0KIAotCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCi0JcmV0dXJuOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiB9CiAKIHN0YXRpYyBpbnQgZGFzMTgwMF9haV9wb2xsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzNjQwMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczY0MDIuYwppbmRleCA0MzAyN2VlLi5lMGNmYjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzNjQwMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXM2NDAyLmMKQEAgLTEsMzA5ICsxLDUzMiBAQAogLyoKLSAgIFNvbWUgY29tbWVudHMgb24gdGhlIGNvZGUuLgotCi0gICAtIGl0IHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgdG8gdXNlIG91dGJfcCgpLgotCi0gICAtIGlnbm9yZWlycSBjcmVhdGVzIGEgcmFjZSBjb25kaXRpb24uICBJdCBuZWVkcyB0byBiZSBmaXhlZC4KLQorICogZGFzNjQwMi5jCisgKiBDb21lZGkgZHJpdmVyIGZvciBEQVM2NDAyIGNvbXBhdGlibGUgYm9hcmRzCisgKiBDb3B5cmlnaHQoYykgMjAxNCBIIEhhcnRsZXkgU3dlZXRlbiA8aHN3ZWV0ZW5AdmlzaW9uZW5ncmF2ZXJzLmNvbT4KKyAqCisgKiBSZXdyaXRlIG9mIGFuIGV4cGVyaW1lbnRhbCBkcml2ZXIgYnk6CisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgT3lzdGVpbiBTdmVuZHNlbiA8c3ZlbmRzZW5AcHZ2Lm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAogLyoKLSAgIGNvbWVkaS9kcml2ZXJzL2RhczY0MDIuYwotICAgQW4gZXhwZXJpbWVudGFsIGRyaXZlciBmb3IgQ29tcHV0ZXJib2FyZHMnIERBUzY0MDIgSS9PIGNhcmQKLQotICAgQ29weXJpZ2h0IChDKSAxOTk5IE95c3RlaW4gU3ZlbmRzZW4gPHN2ZW5kc2VuQHB2di5vcmc+Ci0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiBEcml2ZXI6IGRhczY0MDIKKyAqIERlc2NyaXB0aW9uOiBLZWl0aGxleSBNZXRyYWJ5dGUgREFTNjQwMiAoJiBjb21wYXRpYmxlcykKKyAqIERldmljZXM6IChLZWl0aGxleSBNZXRyYWJ5dGUpIERBUzY0MDItMTIgKGRhczY0MDItMTIpCisgKgkgICAgKEtlaXRobGV5IE1ldHJhYnl0ZSkgREFTNjQwMi0xNiAoZGFzNjQwMi0xNikKKyAqIEF1dGhvcjogSCBIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+CisgKiBVcGRhdGVkOiBGcmksIDE0IE1hciAyMDE0IDEwOjE4OjQzIC0wNzAwCisgKiBTdGF0dXM6IHVua25vd24KKyAqCisgKiBDb25maWd1cmF0aW9uIE9wdGlvbnM6CisgKiAgIFswXSAtIEkvTyBiYXNlIGFkZHJlc3MKKyAqICAgWzFdIC0gSVJRIChvcHRpb25hbCwgbmVlZGVkIGZvciBhc3luYyBjb21tYW5kIHN1cHBvcnQpCiAgKi8KLS8qCi1Ecml2ZXI6IGRhczY0MDIKLURlc2NyaXB0aW9uOiBLZWl0aGxleSBNZXRyYWJ5dGUgREFTNjQwMiAoJiBjb21wYXRpYmxlcykKLUF1dGhvcjogT3lzdGVpbiBTdmVuZHNlbiA8c3ZlbmRzZW5AcHZ2Lm9yZz4KLVN0YXR1czogYml0cm90dGVuCi1EZXZpY2VzOiBbS2VpdGhsZXkgTWV0cmFieXRlXSBEQVM2NDAyIChkYXM2NDAyKQotCi1UaGlzIGRyaXZlciBoYXMgc3VmZmVyZWQgYml0cm90LgotKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiODI1My5oIgogCi0jZGVmaW5lIERBUzY0MDJfU0laRSAxNgorLyoKKyAqIFJlZ2lzdGVyIEkvTyBtYXAKKyAqLworI2RlZmluZSBEQVM2NDAyX0FJX0RBVEFfUkVHCQkweDAwCisjZGVmaW5lIERBUzY0MDJfQUlfTVVYX1JFRwkJMHgwMgorI2RlZmluZSBEQVM2NDAyX0FJX01VWF9MTyh4KQkJKCgoeCkgJiAweDNmKSA8PCAwKQorI2RlZmluZSBEQVM2NDAyX0FJX01VWF9ISSh4KQkJKCgoeCkgJiAweDNmKSA8PCA4KQorI2RlZmluZSBEQVM2NDAyX0RJX0RPX1JFRwkJMHgwMworI2RlZmluZSBEQVM2NDAyX0FPX0RBVEFfUkVHKHgpCQkoMHgwNCArICgoeCkgKiAyKSkKKyNkZWZpbmUgREFTNjQwMl9BT19MU0JfUkVHKHgpCQkoMHgwNCArICgoeCkgKiAyKSkKKyNkZWZpbmUgREFTNjQwMl9BT19NU0JfUkVHKHgpCQkoMHgwNSArICgoeCkgKiAyKSkKKyNkZWZpbmUgREFTNjQwMl9TVEFUVVNfUkVHCQkweDA4CisjZGVmaW5lIERBUzY0MDJfU1RBVFVTX0ZGTkUJCSgxIDw8IDApCisjZGVmaW5lIERBUzY0MDJfU1RBVFVTX0ZIQUxGCQkoMSA8PCAxKQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19GRlVMTAkJKDEgPDwgMikKKyNkZWZpbmUgREFTNjQwMl9TVEFUVVNfWElOVAkJKDEgPDwgMykKKyNkZWZpbmUgREFTNjQwMl9TVEFUVVNfSU5UCQkoMSA8PCA0KQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19YVFJJRwkJKDEgPDwgNSkKKyNkZWZpbmUgREFTNjQwMl9TVEFUVVNfSU5ER1QJCSgxIDw8IDYpCisjZGVmaW5lIERBUzY0MDJfU1RBVFVTXzEwTUhaCQkoMSA8PCA3KQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19XX0NMUklOVAkJKDEgPDwgMCkKKyNkZWZpbmUgREFTNjQwMl9TVEFUVVNfV19DTFJYVFIJCSgxIDw8IDEpCisjZGVmaW5lIERBUzY0MDJfU1RBVFVTX1dfQ0xSWElOCQkoMSA8PCAyKQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19XX0VYVEVORAkJKDEgPDwgNCkKKyNkZWZpbmUgREFTNjQwMl9TVEFUVVNfV19BUk1FRAkJKDEgPDwgNSkKKyNkZWZpbmUgREFTNjQwMl9TVEFUVVNfV19QT1NUTU9ERQkoMSA8PCA2KQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19XXzEwTUhaCQkoMSA8PCA3KQorI2RlZmluZSBEQVM2NDAyX0NUUkxfUkVHCQkweDA5CisjZGVmaW5lIERBUzY0MDJfQ1RSTF9TT0ZUX1RSSUcJCSgwIDw8IDApCisjZGVmaW5lIERBUzY0MDJfQ1RSTF9FWFRfRkFMTF9UUklHCSgxIDw8IDApCisjZGVmaW5lIERBUzY0MDJfQ1RSTF9FWFRfUklTRV9UUklHCSgyIDw8IDApCisjZGVmaW5lIERBUzY0MDJfQ1RSTF9QQUNFUl9UUklHCQkoMyA8PCAwKQorI2RlZmluZSBEQVM2NDAyX0NUUkxfQlVSU1RFTgkJKDEgPDwgMikKKyNkZWZpbmUgREFTNjQwMl9DVFJMX1hJTlRFCQkoMSA8PCAzKQorI2RlZmluZSBEQVM2NDAyX0NUUkxfSVJRKHgpCQkoKHgpIDw8IDQpCisjZGVmaW5lIERBUzY0MDJfQ1RSTF9JTlRFCQkoMSA8PCA3KQorI2RlZmluZSBEQVM2NDAyX1RSSUdfUkVHCQkweDBhCisjZGVmaW5lIERBUzY0MDJfVFJJR19UR0VOCQkoMSA8PCAwKQorI2RlZmluZSBEQVM2NDAyX1RSSUdfVEdTRUwJCSgxIDw8IDEpCisjZGVmaW5lIERBUzY0MDJfVFJJR19UR1BPTAkJKDEgPDwgMikKKyNkZWZpbmUgREFTNjQwMl9UUklHX1BSRVRSSUcJCSgxIDw8IDMpCisjZGVmaW5lIERBUzY0MDJfQU9fUkFOR0UoX2NoYW4sIF9yYW5nZSkJKChfcmFuZ2UpIDw8ICgoX2NoYW4pID8gNiA6IDQpKQorI2RlZmluZSBEQVM2NDAyX0FPX1JBTkdFX01BU0soX2NoYW4pCSgzIDw8ICgoX2NoYW4pID8gNiA6IDQpKQorI2RlZmluZSBEQVM2NDAyX01PREVfUkVHCQkweDBiCisjZGVmaW5lIERBUzY0MDJfTU9ERV9SQU5HRSh4KQkJKCh4KSA8PCAwKQorI2RlZmluZSBEQVM2NDAyX01PREVfUE9MTEVECQkoMCA8PCAyKQorI2RlZmluZSBEQVM2NDAyX01PREVfRklGT05FUFRZCQkoMSA8PCAyKQorI2RlZmluZSBEQVM2NDAyX01PREVfRklGT0hGVUxMCQkoMiA8PCAyKQorI2RlZmluZSBEQVM2NDAyX01PREVfRU9CCQkoMyA8PCAyKQorI2RlZmluZSBEQVM2NDAyX01PREVfRU5IQU5DRUQJCSgxIDw8IDQpCisjZGVmaW5lIERBUzY0MDJfTU9ERV9TRQkJCSgxIDw8IDUpCisjZGVmaW5lIERBUzY0MDJfTU9ERV9VTkkJCSgxIDw8IDYpCisjZGVmaW5lIERBUzY0MDJfTU9ERV9ETUExCQkoMCA8PCA3KQorI2RlZmluZSBEQVM2NDAyX01PREVfRE1BMwkJKDEgPDwgNykKKyNkZWZpbmUgREFTNjQwMl9USU1FUl9CQVNFCQkweDBjCiAKLSNkZWZpbmUgTl9XT1JEUyAoMzAwMCo2NCkKLQotI2RlZmluZSBTVE9QICAgIDAKLSNkZWZpbmUgU1RBUlQgICAxCi0KLSNkZWZpbmUgU0NBTkwgMHgzZjAwCi0jZGVmaW5lIEJZVEUgdW5zaWduZWQgY2hhcgotI2RlZmluZSBXT1JEIHVuc2lnbmVkIHNob3J0Ci0KLS8qLS0tLS0gcmVnaXN0ZXIgOCAtLS0tKi8KLSNkZWZpbmUgQ0xSSU5UIDB4MDEKLSNkZWZpbmUgQ0xSWFRSIDB4MDIKLSNkZWZpbmUgQ0xSWElOIDB4MDQKLSNkZWZpbmUgRVhURU5EIDB4MTAKLSNkZWZpbmUgQVJNRUQgMHgyMAkJLyogZW5hYmxlIGNvbnRpbmcgb2YgcG9zdCBzYW1wbGUgY29udiAqLwotI2RlZmluZSBQT1NUTU9ERSAweDQwCi0jZGVmaW5lIE1IWiAweDgwCQkvKiAxMCBNSHogY2xvY2sgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLSByZWdpc3RlciA5IC0tLS0qLwotI2RlZmluZSBJUlEgKDB4MDQgPDwgNCkJCS8qIHRoZXNlIHR3byBhcmUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSVJRViAxMAkJCS8qICAgICAgICAgICAgICAgZGVwZW5kZW50IG9uIGVhY2ggb3RoZXIgKi8KLQotI2RlZmluZSBDT05WU1JDIDB4MDMJCS8qIHRyaWcgc3JjIGlzIEludGFybmFsIHBhY2VyICovCi0jZGVmaW5lIEJVUlNURU4gMHgwNAkJLyogZW5hYmxlIGJ1cnN0ICovCi0jZGVmaW5lIFhJTlRFIDB4MDgJCS8qIHVzZSBleHRlcm5hbCBpbnQuIHRyaWcgKi8KLSNkZWZpbmUgSU5URSAweDgwCQkvKiBlbmFibGUgYW5hbG9nIGludGVycnVwdHMgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLSByZWdpc3RlciAxMCAtLS0qLwotI2RlZmluZSBUR0VOIDB4MDEJCS8qIFVzZSBwaW4gREkxIGZvciBleHRlcm5sIHRyaWdnaW5nPyAqLwotI2RlZmluZSBUR1NFTCAweDAyCQkvKiBVc2UgZWRnZSB0cmlnZ2VyaW5nICovCi0jZGVmaW5lIFRHUE9MIDB4MDQJCS8qIGFjdGl2ZSBlZGdlIGlzIGZhbGxpbmcgKi8KLSNkZWZpbmUgUFJFVFJJRyAweDA4CQkvKiBwcmV0cmlnICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0gcmVnaXN0ZXIgMTEgLS0tKi8KLSNkZWZpbmUgRU9CIDB4MGMKLSNkZWZpbmUgRklGT0hGVUxMIDB4MDgKLSNkZWZpbmUgR0FJTiAweDAxCi0jZGVmaW5lIEZJRk9ORVBUWSAweDA0Ci0jZGVmaW5lIE1PREUgMHgxMAotI2RlZmluZSBTRU0gMHgyMAotI2RlZmluZSBCSVAgMHg0MAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIE0wIDB4MDAKLSNkZWZpbmUgTTIgMHgwNAotCi0jZGVmaW5lCUMwIDB4MDAKLSNkZWZpbmUJQzEgMHg0MAotI2RlZmluZQlDMiAweDgwCi0jZGVmaW5lCVJXTEggMHgzMAotCi1zdHJ1Y3QgZGFzNjQwMl9wcml2YXRlIHsKLQlpbnQgYWlfYnl0ZXNfdG9fcmVhZDsKLQotCWludCBkYXM2NDAyX2lnbm9yZWlycTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSBkYXM2NDAyX2FpX3JhbmdlcyA9IHsKKwk4LCB7CisJCUJJUF9SQU5HRSgxMCksCisJCUJJUF9SQU5HRSg1KSwKKwkJQklQX1JBTkdFKDIuNSksCisJCUJJUF9SQU5HRSgxLjI1KSwKKwkJVU5JX1JBTkdFKDEwKSwKKwkJVU5JX1JBTkdFKDUpLAorCQlVTklfUkFOR0UoMi41KSwKKwkJVU5JX1JBTkdFKDEuMjUpCisJfQogfTsKIAotc3RhdGljIHZvaWQgZGFzNjQwMl9haV9maWZvX2RyZWdzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKKy8qCisgKiBBbmFsb2cgb3V0cHV0IHJhbmdlcyBhcmUgcHJvZ3JhbW1hYmxlIG9uIHRoZSBEQVM2NDAyLzEyLgorICogRm9yIHRoZSBEQVM2NDAyLzE2IHRoZSByYW5nZSBiaXRzIGhhdmUgbm8gZnVuY3Rpb24sIHRoZQorICogREFDIHJhbmdlcyBhcmUgc2VsZWN0ZWQgYnkgc3dpdGNoZXMgb24gdGhlIGJvYXJkLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgZGFzNjQwMl9hb19yYW5nZXMgPSB7CisJNCwgeworCQlCSVBfUkFOR0UoNSksCisJCUJJUF9SQU5HRSgxMCksCisJCVVOSV9SQU5HRSg1KSwKKwkJVU5JX1JBTkdFKDEwKQorCX0KK307CisKK3N0cnVjdCBkYXM2NDAyX2JvYXJkaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgbWF4ZGF0YTsKK307CisKK3N0cnVjdCBkYXM2NDAyX2JvYXJkaW5mbyBkYXM2NDAyX2JvYXJkc1tdID0geworCXsKKwkJLm5hbWUJCT0gImRhczY0MDItMTIiLAorCQkubWF4ZGF0YQk9IDB4MGZmZiwKKwl9LCB7CisJCS5uYW1lCQk9ICJkYXM2NDAyLTE2IiwKKwkJLm1heGRhdGEJPSAweGZmZmYsCisJfSwKK307CisKK3N0cnVjdCBkYXM2NDAyX3ByaXZhdGUgeworCXVuc2lnbmVkIGludCBpcnE7CisKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdW5zaWduZWQgaW50IGRpdmlkZXIxOworCXVuc2lnbmVkIGludCBkaXZpZGVyMjsKKworCXVuc2lnbmVkIGludCBhb19yYW5nZTsKKwl1bnNpZ25lZCBpbnQgYW9fcmVhZGJhY2tbMl07Cit9OworCitzdGF0aWMgdm9pZCBkYXM2NDAyX3NldF9tb2RlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgIHVuc2lnbmVkIGludCBtb2RlKQogewotCXdoaWxlICgxKSB7Ci0JCWlmICghKGluYihkZXYtPmlvYmFzZSArIDgpICYgMHgwMSkpCi0JCQlyZXR1cm47Ci0JCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCBpbncoZGV2LT5pb2Jhc2UpKTsKKwlvdXRiKERBUzY0MDJfTU9ERV9FTkhBTkNFRCB8IG1vZGUsIGRldi0+aW9iYXNlICsgREFTNjQwMl9NT0RFX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIGRhczY0MDJfc2V0X2V4dGVuZGVkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJIHVuc2lnbmVkIGludCB2YWwpCit7CisJb3V0YihEQVM2NDAyX1NUQVRVU19XX0VYVEVORCwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX1NUQVRVU19SRUcpOworCW91dGIoREFTNjQwMl9TVEFUVVNfV19FWFRFTkQgfCB2YWwsIGRldi0+aW9iYXNlICsgREFTNjQwMl9TVEFUVVNfUkVHKTsKKwlvdXRiKHZhbCwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX1NUQVRVU19SRUcpOworfQorCitzdGF0aWMgdm9pZCBkYXM2NDAyX2NsZWFyX2FsbF9pbnRlcnJ1cHRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCit7CisJb3V0YihEQVM2NDAyX1NUQVRVU19XX0NMUklOVCB8CisJICAgICBEQVM2NDAyX1NUQVRVU19XX0NMUlhUUiB8CisJICAgICBEQVM2NDAyX1NUQVRVU19XX0NMUlhJTiwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX1NUQVRVU19SRUcpOworfQorCitzdGF0aWMgdm9pZCBkYXM2NDAyX2FpX2NsZWFyX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQoreworCW91dGIoREFTNjQwMl9TVEFUVVNfV19DTFJJTlQsIGRldi0+aW9iYXNlICsgREFTNjQwMl9TVEFUVVNfUkVHKTsKK30KKworc3RhdGljIHZvaWQgZGFzNjQwMl9lbmFibGVfY291bnRlcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBib29sIGxvYWQpCit7CisJc3RydWN0IGRhczY0MDJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nIHRpbWVyX2lvYmFzZSA9IGRldi0+aW9iYXNlICsgREFTNjQwMl9USU1FUl9CQVNFOworCisJaWYgKGxvYWQpIHsKKwkJaTgyNTRfc2V0X21vZGUodGltZXJfaW9iYXNlLCAwLCAwLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CisJCWk4MjU0X3NldF9tb2RlKHRpbWVyX2lvYmFzZSwgMCwgMSwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOworCQlpODI1NF9zZXRfbW9kZSh0aW1lcl9pb2Jhc2UsIDAsIDIsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKKworCQlpODI1NF93cml0ZSh0aW1lcl9pb2Jhc2UsIDAsIDAsIGRldnByaXYtPmNvdW50KTsKKwkJaTgyNTRfd3JpdGUodGltZXJfaW9iYXNlLCAwLCAxLCBkZXZwcml2LT5kaXZpZGVyMSk7CisJCWk4MjU0X3dyaXRlKHRpbWVyX2lvYmFzZSwgMCwgMiwgZGV2cHJpdi0+ZGl2aWRlcjIpOworCisJfSBlbHNlIHsKKwkJaTgyNTRfc2V0X21vZGUodGltZXJfaW9iYXNlLCAwLCAwLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CisJCWk4MjU0X3NldF9tb2RlKHRpbWVyX2lvYmFzZSwgMCwgMSwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOworCQlpODI1NF9zZXRfbW9kZSh0aW1lcl9pb2Jhc2UsIDAsIDIsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGRhczY0MDJfc2V0Y291bnRlcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQotewotCUJZVEUgcDsKLQl1bnNpZ25lZCBzaG9ydCBjdHJsd3JkOwotCi0JLyogc2V0IHVwIGNvdW50ZXIwIGZpcnN0LCBtb2RlIDAgKi8KLQlwID0gTTAgfCBDMCB8IFJXTEg7Ci0Jb3V0Yl9wKHAsIGRldi0+aW9iYXNlICsgMTUpOwotCWN0cmx3cmQgPSAyMDAwOwotCXAgPSAoQllURSkgKDB4ZmYgJiBjdHJsd3JkKTsKLQlvdXRiX3AocCwgZGV2LT5pb2Jhc2UgKyAxMik7Ci0JcCA9IChCWVRFKSAoMHhmZiAmIChjdHJsd3JkID4+IDgpKTsKLQlvdXRiX3AocCwgZGV2LT5pb2Jhc2UgKyAxMik7Ci0KLQkvKiBzZXQgdXAgY291bnRlcjEsIG1vZGUgMiAqLwotCXAgPSBNMiB8IEMxIHwgUldMSDsKLQlvdXRiX3AocCwgZGV2LT5pb2Jhc2UgKyAxNSk7Ci0JY3RybHdyZCA9IDEwOwotCXAgPSAoQllURSkgKDB4ZmYgJiBjdHJsd3JkKTsKLQlvdXRiX3AocCwgZGV2LT5pb2Jhc2UgKyAxMyk7Ci0JcCA9IChCWVRFKSAoMHhmZiAmIChjdHJsd3JkID4+IDgpKTsKLQlvdXRiX3AocCwgZGV2LT5pb2Jhc2UgKyAxMyk7Ci0KLQkvKiBzZXQgdXAgY291bnRlcjEsIG1vZGUgMiAqLwotCXAgPSBNMiB8IEMyIHwgUldMSDsKLQlvdXRiX3AocCwgZGV2LT5pb2Jhc2UgKyAxNSk7Ci0JY3RybHdyZCA9IDEwMDA7Ci0JcCA9IChCWVRFKSAoMHhmZiAmIGN0cmx3cmQpOwotCW91dGJfcChwLCBkZXYtPmlvYmFzZSArIDE0KTsKLQlwID0gKEJZVEUpICgweGZmICYgKGN0cmx3cmQgPj4gOCkpOwotCW91dGJfcChwLCBkZXYtPmlvYmFzZSArIDE0KTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkKQorc3RhdGljIGlycXJldHVybl90IGRhczY0MDJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCiB7CiAJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7Ci0Jc3RydWN0IGRhczY0MDJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9ICZkZXYtPnN1YmRldmljZXNbMF07CiAKLQlpZiAoIWRldi0+YXR0YWNoZWQgfHwgZGV2cHJpdi0+ZGFzNjQwMl9pZ25vcmVpcnEpIHsKLQkJZGV2X3dhcm4oZGV2LT5jbGFzc19kZXYsICJCVUc6IHNwdXJpb3VzIGludGVycnVwdFxuIik7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9CisJZGFzNjQwMl9jbGVhcl9hbGxfaW50ZXJydXB0cyhkZXYpOwogCi0JZGFzNjQwMl9haV9maWZvX2RyZWdzKGRldiwgcyk7Ci0KLQlpZiAocy0+YXN5bmMtPmJ1Zl93cml0ZV9jb3VudCA+PSBkZXZwcml2LT5haV9ieXRlc190b19yZWFkKSB7Ci0JCW91dHdfcChTQ0FOTCwgZGV2LT5pb2Jhc2UgKyAyKTsJLyogY2xlYXJzIHRoZSBmaWZvICovCi0JCW91dGIoMHgwNywgZGV2LT5pb2Jhc2UgKyA4KTsJLyogY2xlYXJzIGFsbCBmbGlwLWZsb3BzICovCi0JCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JfQotCi0Jb3V0YigweDAxLCBkZXYtPmlvYmFzZSArIDgpOwkvKiBjbGVhciBvbmx5IHRoZSBpbnRlcnJ1cHQgZmxpcC1mbG9wICovCi0KLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLSNpZiAwCi1zdGF0aWMgdm9pZCBkYXM2NDAyX2FpX2ZpZm9fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzaG9ydCAqZGF0YSwgaW50IG4pCitzdGF0aWMgaW50IGRhczY0MDJfYWlfY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykKLQkJZGF0YVtpXSA9IGludyhkZXYtPmlvYmFzZSk7CisJcmV0dXJuIC1FSU5WQUw7CiB9Ci0jZW5kaWYKKworc3RhdGljIGludCBkYXM2NDAyX2FpX2NtZHRlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KIAogc3RhdGljIGludCBkYXM2NDAyX2FpX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKKwlvdXRiKERBUzY0MDJfQ1RSTF9TT0ZUX1RSSUcsIGRldi0+aW9iYXNlICsgREFTNjQwMl9DVFJMX1JFRyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGFzNjQwMl9haV9zb2Z0X3RyaWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlvdXR3KDAsIGRldi0+aW9iYXNlICsgREFTNjQwMl9BSV9EQVRBX1JFRyk7Cit9CisKK3N0YXRpYyBpbnQgZGFzNjQwMl9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX1NUQVRVU19SRUcpOworCWlmIChzdGF0dXMgJiBEQVM2NDAyX1NUQVRVU19GRk5FKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgaW50IGRhczY0MDJfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCXVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCByYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgYXJlZiA9IENSX0FSRUYoaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IHJldDsKKwlpbnQgaTsKKworCXZhbCA9IERBUzY0MDJfTU9ERV9SQU5HRShyYW5nZSkgfCBEQVM2NDAyX01PREVfUE9MTEVEOworCWlmIChhcmVmID09IEFSRUZfRElGRikgeworCQlpZiAoY2hhbiA+IHMtPm5fY2hhbiAvIDIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQl2YWwgfD0gREFTNjQwMl9NT0RFX1NFOworCX0KKwlpZiAoY29tZWRpX3JhbmdlX2lzX3VuaXBvbGFyKHMsIHJhbmdlKSkKKwkJdmFsIHw9IERBUzY0MDJfTU9ERV9VTkk7CisKKwkvKiBlbmFibGUgc29mdHdhcmUgY29udmVyc2lvbiB0cmlnZ2VyICovCisJb3V0YihEQVM2NDAyX0NUUkxfU09GVF9UUklHLCBkZXYtPmlvYmFzZSArIERBUzY0MDJfQ1RSTF9SRUcpOworCisJZGFzNjQwMl9zZXRfbW9kZShkZXYsIHZhbCk7CisKKwkvKiBsb2FkIHRoZSBtdXggZm9yIHNpbmdsZSBjaGFubmVsIGNvbnZlcnNpb24gKi8KKwlvdXR3KERBUzY0MDJfQUlfTVVYX0hJKGNoYW4pIHwgREFTNjQwMl9BSV9NVVhfTE8oY2hhbiksCisJICAgICBkZXYtPmlvYmFzZSArIERBUzY0MDJfQUlfTVVYX1JFRyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCWRhczY0MDJfYWlfY2xlYXJfZW9jKGRldik7CisJCWRhczY0MDJfYWlfc29mdF90cmlnKGRldik7CisKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBkYXM2NDAyX2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQl2YWwgPSBpbncoZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0FJX0RBVEFfUkVHKTsKKworCQlpZiAocy0+bWF4ZGF0YSA9PSAweDBmZmYpCisJCQl2YWwgPj49IDQ7CisKKwkJZGF0YVtpXSA9IHZhbDsKKwl9CisKKwlkYXM2NDAyX2FpX2NsZWFyX2VvYyhkZXYpOworCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgZGFzNjQwMl9hb19pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKIAlzdHJ1Y3QgZGFzNjQwMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGk7CisKKwkvKiBzZXQgdGhlIHJhbmdlIGZvciB0aGlzIGNoYW5uZWwgKi8KKwl2YWwgPSBkZXZwcml2LT5hb19yYW5nZTsKKwl2YWwgJj0gfkRBUzY0MDJfQU9fUkFOR0VfTUFTSyhjaGFuKTsKKwl2YWwgfD0gREFTNjQwMl9BT19SQU5HRShjaGFuLCByYW5nZSk7CisJaWYgKHZhbCAhPSBkZXZwcml2LT5hb19yYW5nZSkgeworCQlkZXZwcml2LT5hb19yYW5nZSA9IHZhbDsKKwkJb3V0Yih2YWwsIGRldi0+aW9iYXNlICsgREFTNjQwMl9UUklHX1JFRyk7CisJfQogCiAJLyoKLQkgKiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgcmVzZXQgdGhlIGJvYXJkIGZyb20gd2hhdGV2ZXIgY29uZGl0aW9uIGl0Ci0JICogIGlzIGluIChpLmUuLCBhY3F1aXJpbmcgZGF0YSksIHRvIGEgbm9uLWFjdGl2ZSBzdGF0ZS4KKwkgKiBUaGUgREFTNjQwMi8xNiBoYXMgYSBqdW1wZXIgdG8gc2VsZWN0IGVpdGhlciBpbmRpdmlkdWFsCisJICogdXBkYXRlIChVUERBVEUpIG9yIHNpbXVsdGFuZW91cyB1cGRhdGluZyAoWEZFUikgb2YgYm90aAorCSAqIERBQydzLiBJbiBVUERBVEUgbW9kZSwgd2hlbiB0aGUgTVNCIGlzIHdyaXR0ZW4sIHRoYXQgREFDCisJICogaXMgdXBkYXRlZC4gSW4gWEZFUiBtb2RlLCBhZnRlciBib3RoIERBQydzIGFyZSBsb2FkZWQsCisJICogYSByZWFkIGN5Y2xlIG9mIGFueSBEQUMgcmVnaXN0ZXIgd2lsbCB1cGRhdGUgYm90aCBEQUMncworCSAqIHNpbXVsdGFuZW91c2x5LgorCSAqCisJICogSWYgeW91IGhhdmUgWEZFUiBtb2RlIGVuYWJsZWQgYSAoKmluc25fcmVhZCkgd2lsbCBuZWVkCisJICogdG8gYmUgcGVyZm9ybWVkIGluIG9yZGVyIHRvIHVwZGF0ZSB0aGUgREFDJ3Mgd2l0aCB0aGUKKwkgKiBsYXN0IHZhbHVlIHdyaXR0ZW4uCiAJICovCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQl2YWwgPSBkYXRhW2ldOwogCi0JZGV2cHJpdi0+ZGFzNjQwMl9pZ25vcmVpcnEgPSAxOwotCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJTdG9wcGluZyBhY3F1aXNpdGlvblxuIik7Ci0JZGV2cHJpdi0+ZGFzNjQwMl9pZ25vcmVpcnEgPSAxOwotCW91dGJfcCgweDAyLCBkZXYtPmlvYmFzZSArIDEwKTsJLyogZGlzYWJsZSBleHRlcm5hbCB0cmlnZ2luZyAqLwotCW91dHdfcChTQ0FOTCwgZGV2LT5pb2Jhc2UgKyAyKTsJLyogcmVzZXRzIHRoZSBjYXJkIGZpZm8gKi8KLQlvdXRiX3AoMCwgZGV2LT5pb2Jhc2UgKyA5KTsJLyogZGlzYWJsZXMgaW50ZXJydXB0cyAqLworCQlkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXSA9IHZhbDsKIAotCW91dHdfcChTQ0FOTCwgZGV2LT5pb2Jhc2UgKyAyKTsKKwkJaWYgKHMtPm1heGRhdGEgPT0gMHgwZmZmKSB7CisJCQkvKgorCQkJICogREFTNjQwMi8xMiBoYXMgdGhlIHR3byA4LWJpdCBEQUMgcmVnaXN0ZXJzLCBsZWZ0CisJCQkgKiBqdXN0aWZpZWQgKHRoZSA0IExTQiBiaXRzIGFyZSBkb24ndCBjYXJlKS4gRGF0YQorCQkJICogY2FuIGJlIHdyaXR0ZW4gYXMgb25lIHdvcmQuCisJCQkgKi8KKwkJCXZhbCA8PD0gNDsKKwkJCW91dHcodmFsLCBkZXYtPmlvYmFzZSArIERBUzY0MDJfQU9fREFUQV9SRUcoY2hhbikpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIERBUzY0MDIvMTYgdXNlcyBib3RoIDgtYml0IERBQyByZWdpc3RlcnMgYW5kIG5lZWRzCisJCQkgKiB0byBiZSB3cml0dGVuIExTQiB0aGVuIE1TQi4KKwkJCSAqLworCQkJb3V0Yih2YWwgJiAweGZmLAorCQkJICAgICBkZXYtPmlvYmFzZSArIERBUzY0MDJfQU9fTFNCX1JFRyhjaGFuKSk7CisJCQlvdXRiKCh2YWwgPj4gOCkgJiAweGZmLAorCQkJICAgICBkZXYtPmlvYmFzZSArIERBUzY0MDJfQU9fTFNCX1JFRyhjaGFuKSk7CisJCX0KKwl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAotI2lmZGVmIHVudXNlZAotc3RhdGljIGludCBkYXM2NDAyX2FpX21vZGUyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIGNvbWVkaV90cmlnICppdCkKK3N0YXRpYyBpbnQgZGFzNjQwMl9hb19pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJdW5zaWduZWQgaW50ICpkYXRhKQoreworCXN0cnVjdCBkYXM2NDAyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgaTsKKworCS8qCisJICogSWYgWEZFUiBtb2RlIGlzIGVuYWJsZWQsIHJlYWRpbmcgYW55IERBQyByZWdpc3RlcgorCSAqIHdpbGwgdXBkYXRlIGJvdGggREFDJ3Mgc2ltdWx0YW5lb3VzbHkuCisJICovCisJaW53KGRldi0+aW9iYXNlICsgREFTNjQwMl9BT19MU0JfUkVHKGNoYW4pKTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspCisJCWRhdGFbaV0gPSBkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IGRhczY0MDJfZGlfaW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCXVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlkYXRhWzFdID0gaW5iKGRldi0+aW9iYXNlICsgREFTNjQwMl9ESV9ET19SRUcpOworCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgZGFzNjQwMl9kb19pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJdW5zaWduZWQgaW50ICpkYXRhKQoreworCWlmIChjb21lZGlfZGlvX3VwZGF0ZV9zdGF0ZShzLCBkYXRhKSkKKwkJb3V0YihzLT5zdGF0ZSwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0RJX0RPX1JFRyk7CisKKwlkYXRhWzFdID0gcy0+c3RhdGU7CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIHZvaWQgZGFzNjQwMl9yZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkYXM2NDAyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKLQlkZXZwcml2LT5kYXM2NDAyX2lnbm9yZWlycSA9IDE7Ci0JZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIlN0YXJ0aW5nIGFjcXVpc2l0aW9uXG4iKTsKLQlvdXRiX3AoMHgwMywgZGV2LT5pb2Jhc2UgKyAxMCk7CS8qIGVuYWJsZSBleHRlcm5hbCB0cmlnZ2luZyAqLwotCW91dHdfcChTQ0FOTCwgZGV2LT5pb2Jhc2UgKyAyKTsJLyogcmVzZXRzIHRoZSBjYXJkIGZpZm8gKi8KLQlvdXRiX3AoSVJRIHwgQ09OVlNSQyB8IEJVUlNURU4gfCBJTlRFLCBkZXYtPmlvYmFzZSArIDkpOworCS8qIGVuYWJsZSAiRW5oYW5jZWQiIG1vZGUgKi8KKwlvdXRiKERBUzY0MDJfTU9ERV9FTkhBTkNFRCwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX01PREVfUkVHKTsKIAotCWRldnByaXYtPmFpX2J5dGVzX3RvX3JlYWQgPSBpdC0+biAqIHNpemVvZihzaG9ydCk7CisJLyogZW5hYmxlIDEwTUh6IHBhY2VyIGNsb2NrICovCisJZGFzNjQwMl9zZXRfZXh0ZW5kZWQoZGV2LCBEQVM2NDAyX1NUQVRVU19XXzEwTUhaKTsKIAotCS8qIHVtLi4uIGlnbm9yZWlycSBpcyBhIG5hc3R5IHJhY2UgY29uZGl0aW9uICovCi0JZGV2cHJpdi0+ZGFzNjQwMl9pZ25vcmVpcnEgPSAwOworCS8qIGVuYWJsZSBzb2Z0d2FyZSBjb252ZXJzaW9uIHRyaWdnZXIgKi8KKwlvdXRiKERBUzY0MDJfQ1RSTF9TT0ZUX1RSSUcsIGRldi0+aW9iYXNlICsgREFTNjQwMl9DVFJMX1JFRyk7CiAKLQlvdXR3X3AoU0NBTkwsIGRldi0+aW9iYXNlICsgMik7CisJLyogZGVmYXVsdCBBREMgdG8gc2luZ2xlLWVuZGVkIHVuaXBvbGFyIDEwViBpbnB1dHMgKi8KKwlkYXM2NDAyX3NldF9tb2RlKGRldiwgREFTNjQwMl9NT0RFX1JBTkdFKDApIHwKKwkJCSAgICAgIERBUzY0MDJfTU9ERV9QT0xMRUQgfAorCQkJICAgICAgREFTNjQwMl9NT0RFX1NFIHwKKwkJCSAgICAgIERBUzY0MDJfTU9ERV9VTkkpOwogCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKKwkvKiBkZWZhdWx0IG11eCBmb3Igc2luZ2xlIGNoYW5uZWwgY29udmVyc2lvbiAoY2hhbm5lbCAwKSAqLworCW91dHcoREFTNjQwMl9BSV9NVVhfSEkoMCkgfCBEQVM2NDAyX0FJX01VWF9MTygwKSwKKwkgICAgIGRldi0+aW9iYXNlICsgREFTNjQwMl9BSV9NVVhfUkVHKTsKIAotc3RhdGljIGludCBib2FyZF9pbml0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGRhczY0MDJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlCWVRFIGI7CisJLyogc2V0IGJvdGggREFDJ3MgZm9yIHVuaXBvbGFyIDVWIG91dHB1dCByYW5nZSAqLworCWRldnByaXYtPmFvX3JhbmdlID0gREFTNjQwMl9BT19SQU5HRSgwLCAyKSB8IERBUzY0MDJfQU9fUkFOR0UoMSwgMik7CisJb3V0YihkZXZwcml2LT5hb19yYW5nZSwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX1RSSUdfUkVHKTsKIAotCWRldnByaXYtPmRhczY0MDJfaWdub3JlaXJxID0gMTsKKwkvKiBzZXQgYm90aCBEQUMncyB0byAwViAqLworCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0FPX0RBVEFfUkVHKDApKTsKKwlvdXR3KDAsIGRldi0+aW9iYXNlICsgREFTNjQwMl9BT19EQVRBX1JFRygwKSk7CisJaW53KGRldi0+aW9iYXNlICsgREFTNjQwMl9BT19MU0JfUkVHKDApKTsKIAotCW91dGIoMHgwNywgZGV2LT5pb2Jhc2UgKyA4KTsKKwlkYXM2NDAyX2VuYWJsZV9jb3VudGVyKGRldiwgZmFsc2UpOwogCi0JLyogcmVnaXN0ZXIgMTEgICovCi0Jb3V0Yl9wKE1PREUsIGRldi0+aW9iYXNlICsgMTEpOwotCWIgPSBCSVAgfCBTRU0gfCBNT0RFIHwgR0FJTiB8IEZJRk9IRlVMTDsKLQlvdXRiX3AoYiwgZGV2LT5pb2Jhc2UgKyAxMSk7CisJLyogc2V0IGFsbCBkaWdpdGFsIG91dHB1dHMgbG93ICovCisJb3V0YigwLCBkZXYtPmlvYmFzZSArIERBUzY0MDJfRElfRE9fUkVHKTsKIAotCS8qIHJlZ2lzdGVyIDggICAqLwotCW91dGJfcChFWFRFTkQsIGRldi0+aW9iYXNlICsgOCk7Ci0JYiA9IEVYVEVORCB8IE1IWjsKLQlvdXRiX3AoYiwgZGV2LT5pb2Jhc2UgKyA4KTsKLQliID0gTUhaIHwgQ0xSSU5UIHwgQ0xSWFRSIHwgQ0xSWElOOwotCW91dGJfcChiLCBkZXYtPmlvYmFzZSArIDgpOwotCi0JLyogcmVnaXN0ZXIgOSAgICAqLwotCWIgPSBJUlEgfCBDT05WU1JDIHwgQlVSU1RFTiB8IElOVEU7Ci0Jb3V0Yl9wKGIsIGRldi0+aW9iYXNlICsgOSk7Ci0KLQkvKiByZWdpc3RlciAxMCAgICovCi0JYiA9IFRHU0VMIHwgVEdFTjsKLQlvdXRiX3AoYiwgZGV2LT5pb2Jhc2UgKyAxMCk7Ci0KLQliID0gMHgwNzsKLQlvdXRiX3AoYiwgZGV2LT5pb2Jhc2UgKyA4KTsKLQotCWRhczY0MDJfc2V0Y291bnRlcihkZXYpOwotCi0Jb3V0d19wKFNDQU5MLCBkZXYtPmlvYmFzZSArIDIpOwkvKiByZXNldCBjYXJkIGZpZm8gKi8KLQotCWRldnByaXYtPmRhczY0MDJfaWdub3JlaXJxID0gMDsKLQotCXJldHVybiAwOworCWRhczY0MDJfY2xlYXJfYWxsX2ludGVycnVwdHMoZGV2KTsKIH0KIAogc3RhdGljIGludCBkYXM2NDAyX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpCiB7CisJY29uc3Qgc3RydWN0IGRhczY0MDJfYm9hcmRpbmZvICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCXN0cnVjdCBkYXM2NDAyX3ByaXZhdGUgKmRldnByaXY7Ci0JdW5zaWduZWQgaW50IGlycTsKLQlpbnQgcmV0OwogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwotCi0JcmV0ID0gY29tZWRpX3JlcXVlc3RfcmVnaW9uKGRldiwgaXQtPm9wdGlvbnNbMF0sIERBUzY0MDJfU0laRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWlycSA9IGl0LT5vcHRpb25zWzBdOwotCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICIoIGlycSA9ICV1IClcbiIsIGlycSk7Ci0JcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBpbnRyX2hhbmRsZXIsIDAsICJkYXM2NDAyIiwgZGV2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWRldi0+aXJxID0gaXJxOworCWludCByZXQ7CiAKIAlkZXZwcml2ID0gY29tZWRpX2FsbG9jX2RldnByaXYoZGV2LCBzaXplb2YoKmRldnByaXYpKTsKIAlpZiAoIWRldnByaXYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCAxKTsKKwlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgMHgxMCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCS8qIGFpIHN1YmRldmljZSAqLwotCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzBdOwotCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BSTsKLQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfR1JPVU5EOwotCXMtPm5fY2hhbiA9IDg7Ci0JLyogcy0+dHJpZ1syXT1kYXM2NDAyX2FpX21vZGUyOyAqLwotCXMtPmNhbmNlbCA9IGRhczY0MDJfYWlfY2FuY2VsOwotCXMtPm1heGRhdGEgPSAoMSA8PCAxMikgLSAxOwotCXMtPmxlbl9jaGFubGlzdCA9IDE2OwkvKiA/ICovCi0Jcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfdW5rbm93bjsKKwlkYXM2NDAyX3Jlc2V0KGRldik7CiAKLQlib2FyZF9pbml0KGRldik7CisJLyogSVJRcyAyLDMsNSw2LDcsIDEwLDExLDE1IGFyZSB2YWxpZCBmb3IgImVuaGFuY2VkIiBtb2RlICovCisJaWYgKCgxIDw8IGl0LT5vcHRpb25zWzFdKSAmIDB4OGNlYykgeworCQlyZXQgPSByZXF1ZXN0X2lycShpdC0+b3B0aW9uc1sxXSwgZGFzNjQwMl9pbnRlcnJ1cHQsIDAsCisJCQkJICBkZXYtPmJvYXJkX25hbWUsIGRldik7CisJCWlmIChyZXQgPT0gMCkgeworCQkJZGV2LT5pcnEgPSBpdC0+b3B0aW9uc1sxXTsKKworCQkJc3dpdGNoIChkZXYtPmlycSkgeworCQkJY2FzZSAxMDoKKwkJCQlkZXZwcml2LT5pcnEgPSA0OworCQkJCWJyZWFrOworCQkJY2FzZSAxMToKKwkJCQlkZXZwcml2LT5pcnEgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAxNToKKwkJCQlkZXZwcml2LT5pcnEgPSA2OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkZXZwcml2LT5pcnEgPSBkZXYtPmlycTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgNCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEFuYWxvZyBJbnB1dCBzdWJkZXZpY2UgKi8KKwlzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0FJOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9SRUFEQUJMRSB8IFNERl9HUk9VTkQgfCBTREZfRElGRjsKKwlzLT5uX2NoYW4JPSA2NDsKKwlzLT5tYXhkYXRhCT0gYm9hcmQtPm1heGRhdGE7CisJcy0+cmFuZ2VfdGFibGUJPSAmZGFzNjQwMl9haV9yYW5nZXM7CisJcy0+aW5zbl9yZWFkCT0gZGFzNjQwMl9haV9pbnNuX3JlYWQ7CisJaWYgKGRldi0+aXJxKSB7CisJCWRldi0+cmVhZF9zdWJkZXYgPSBzOworCQlzLT5zdWJkZXZfZmxhZ3MJfD0gU0RGX0NNRF9SRUFEOworCQlzLT5sZW5fY2hhbmxpc3QJPSBzLT5uX2NoYW47CisJCXMtPmRvX2NtZHRlc3QJPSBkYXM2NDAyX2FpX2NtZHRlc3Q7CisJCXMtPmRvX2NtZAk9IGRhczY0MDJfYWlfY21kOworCQlzLT5jYW5jZWwJPSBkYXM2NDAyX2FpX2NhbmNlbDsKKwl9CisKKwkvKiBBbmFsb2cgT3V0cHV0IHN1YmRldmljZSAqLworCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzFdOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQU87CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1dSSVRFQUJMRTsKKwlzLT5uX2NoYW4JPSAyOworCXMtPm1heGRhdGEJPSBib2FyZC0+bWF4ZGF0YTsKKwlzLT5yYW5nZV90YWJsZQk9ICZkYXM2NDAyX2FvX3JhbmdlczsKKwlzLT5pbnNuX3dyaXRlCT0gZGFzNjQwMl9hb19pbnNuX3dyaXRlOworCXMtPmluc25fcmVhZAk9IGRhczY0MDJfYW9faW5zbl9yZWFkOworCisJLyogRGlnaXRhbCBJbnB1dCBzdWJkZXZpY2UgKi8KKwlzID0gJmRldi0+c3ViZGV2aWNlc1syXTsKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0RJOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9SRUFEQUJMRTsKKwlzLT5uX2NoYW4JPSA4OworCXMtPm1heGRhdGEJPSAxOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9iaXRzCT0gZGFzNjQwMl9kaV9pbnNuX2JpdHM7CisKKwkvKiBEaWdpdGFsIElucHV0IHN1YmRldmljZSAqLworCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzNdOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfRE87CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1dSSVRFQUJMRTsKKwlzLT5uX2NoYW4JPSA4OworCXMtPm1heGRhdGEJPSAxOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9iaXRzCT0gZGFzNjQwMl9kb19pbnNuX2JpdHM7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMxMyw5ICs1MzYsMTIgQEAKIAkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAogCS5hdHRhY2gJCT0gZGFzNjQwMl9hdHRhY2gsCiAJLmRldGFjaAkJPSBjb21lZGlfbGVnYWN5X2RldGFjaCwKKwkuYm9hcmRfbmFtZQk9ICZkYXM2NDAyX2JvYXJkc1swXS5uYW1lLAorCS5udW1fbmFtZXMJPSBBUlJBWV9TSVpFKGRhczY0MDJfYm9hcmRzKSwKKwkub2Zmc2V0CQk9IHNpemVvZihzdHJ1Y3QgZGFzNjQwMl9ib2FyZGluZm8pLAogfTsKIG1vZHVsZV9jb21lZGlfZHJpdmVyKGRhczY0MDJfZHJpdmVyKQogCi1NT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJIIEhhcnRsZXkgU3dlZXRlbiA8aHN3ZWV0ZW5AdmlzaW9uZW5ncmF2ZXJzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGRyaXZlciBmb3IgREFTNjQwMiBjb21wYXRpYmxlIGJvYXJkcyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczgwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczgwMC5jCmluZGV4IDVhZjBhNTcuLjNlNDA4MzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXM4MDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzODAwLmMKQEAgLTQyMCwxNyArNDIwLDEyIEBACiAJZ2FpbiAmPSAweGY7CiAJb3V0YihnYWluLCBkZXYtPmlvYmFzZSArIERBUzgwMF9HQUlOKTsKIAotCXN3aXRjaCAoYXN5bmMtPmNtZC5zdG9wX3NyYykgewotCWNhc2UgVFJJR19DT1VOVDoKKwlpZiAoYXN5bmMtPmNtZC5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CiAJCWRldnByaXYtPmNvdW50ID0gYXN5bmMtPmNtZC5zdG9wX2FyZyAqIGFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuOwogCQlkZXZwcml2LT5mb3JldmVyID0gZmFsc2U7Ci0JCWJyZWFrOwotCWNhc2UgVFJJR19OT05FOgorCX0gZWxzZSB7CS8qIFRSSUdfTk9ORSAqLwogCQlkZXZwcml2LT5mb3JldmVyID0gdHJ1ZTsKIAkJZGV2cHJpdi0+Y291bnQgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKIAl9CiAKIAkvKiBlbmFibGUgYXV0byBjaGFubmVsIHNjYW4sIHNlbmQgaW50ZXJydXB0cyBvbiBlbmQgb2YgY29udmVyc2lvbgpAQCAtNDQwLDI2ICs0MzUsMTkgQEAKIAljb252X2JpdHMgfD0gRUFDUyB8IElFT0M7CiAJaWYgKGFzeW5jLT5jbWQuc3RhcnRfc3JjID09IFRSSUdfRVhUKQogCQljb252X2JpdHMgfD0gRFRFTjsKLQlzd2l0Y2ggKGFzeW5jLT5jbWQuY29udmVydF9zcmMpIHsKLQljYXNlIFRSSUdfVElNRVI6CisJaWYgKGFzeW5jLT5jbWQuY29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewogCQljb252X2JpdHMgfD0gQ0FTQyB8IElURTsKIAkJLyogc2V0IGNvbnZlcnNpb24gZnJlcXVlbmN5ICovCiAJCWlmIChkYXM4MDBfc2V0X2ZyZXF1ZW5jeShkZXYpIDwgMCkgewogCQkJY29tZWRpX2Vycm9yKGRldiwgIkVycm9yIHNldHRpbmcgdXAgY291bnRlcnMiKTsKIAkJCXJldHVybiAtMTsKIAkJfQotCQlicmVhazsKLQljYXNlIFRSSUdfRVhUOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgaXJxX2ZsYWdzKTsKIAlkYXM4MDBfaW5kX3dyaXRlKGRldiwgY29udl9iaXRzLCBDT05WX0NPTlRST0wpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGlycV9mbGFncyk7CiAKLQlhc3luYy0+ZXZlbnRzID0gMDsKIAlkYXM4MDBfZW5hYmxlKGRldik7CiAJcmV0dXJuIDA7CiB9CkBAIC01MzIsMTAgKzUyMCw4IEBACiAKIAlpZiAoZmlmb19vdmVyZmxvdykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBpcnFfZmxhZ3MpOwotCQlkYXM4MDBfY2FuY2VsKGRldiwgcyk7CiAJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SIHwgQ09NRURJX0NCX0VPQTsKLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JCWFzeW5jLT5ldmVudHMgPSAwOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQogCkBAIC01NTEsMjAgKzUzNywyMSBAQAogCQlkYXM4MDBfZGlzYWJsZShkZXYpOwogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CiAJfQotCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCWFzeW5jLT5ldmVudHMgPSAwOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaW50IGRhczgwMF93YWl0X2Zvcl9jb252KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCB0aW1lb3V0KQorc3RhdGljIGludCBkYXM4MDBfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKIHsKLQlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCi0JZm9yIChpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgewotCQlpZiAoIShpbmIoZGV2LT5pb2Jhc2UgKyBEQVM4MDBfU1RBVFVTKSAmIEJVU1kpKQotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRVRJTUU7CisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgREFTODAwX1NUQVRVUyk7CisJaWYgKChzdGF0dXMgJiBCVVNZKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOwogfQogCiBzdGF0aWMgaW50IGRhczgwMF9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTU5OSw3ICs1ODYsNyBAQAogCQkvKiB0cmlnZ2VyIGNvbnZlcnNpb24gKi8KIAkJb3V0Yl9wKDAsIGRldi0+aW9iYXNlICsgREFTODAwX01TQik7CiAKLQkJcmV0ID0gZGFzODAwX3dhaXRfZm9yX2NvbnYoZGV2LCAxMDAwKTsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBkYXM4MDBfYWlfZW9jLCAwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kbW0zMmF0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZG1tMzJhdC5jCmluZGV4IDc4YTE5NjIuLmM4YTM2ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kbW0zMmF0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RtbTMyYXQuYwpAQCAtMTY0LDE2ICsxNjQsMjkgQEAKIAogfTsKIAorc3RhdGljIGludCBkbW0zMmF0X2FpX3N0YXR1cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBjb250ZXh0KTsKKwlpZiAoKHN0YXR1cyAmIERNTTMyQVRfU1RBVFVTKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IGRtbTMyYXRfYWlfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQlpbnQgbiwgaTsKKwlpbnQgbjsKIAl1bnNpZ25lZCBpbnQgZDsKLQl1bnNpZ25lZCBjaGFyIHN0YXR1czsKIAl1bnNpZ25lZCBzaG9ydCBtc2IsIGxzYjsKIAl1bnNpZ25lZCBjaGFyIGNoYW47CiAJaW50IHJhbmdlOworCWludCByZXQ7CiAKIAkvKiBnZXQgdGhlIGNoYW5uZWwgYW5kIHJhbmdlIG51bWJlciAqLwogCkBAIC0xOTAsMjYgKzIwMywyMCBAQAogCW91dGIoZG1tMzJhdF9yYW5nZWJpdHNbcmFuZ2VdLCBkZXYtPmlvYmFzZSArIERNTTMyQVRfQUlDT05GKTsKIAogCS8qIHdhaXQgZm9yIGNpcmN1aXQgdG8gc2V0dGxlICovCi0JZm9yIChpID0gMDsgaSA8IDQwMDAwOyBpKyspIHsKLQkJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgRE1NMzJBVF9BSVJCQUNLKTsKLQkJaWYgKChzdGF0dXMgJiBETU0zMkFUX1NUQVRVUykgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQlpZiAoaSA9PSA0MDAwMCkKLQkJcmV0dXJuIC1FVElNRURPVVQ7CisJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBkbW0zMmF0X2FpX3N0YXR1cywgRE1NMzJBVF9BSVJCQUNLKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJLyogY29udmVydCBuIHNhbXBsZXMgKi8KIAlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CiAJCS8qIHRyaWdnZXIgY29udmVyc2lvbiAqLwogCQlvdXRiKDB4ZmYsIGRldi0+aW9iYXNlICsgRE1NMzJBVF9DT05WKTsKKwogCQkvKiB3YWl0IGZvciBjb252ZXJzaW9uIHRvIGVuZCAqLwotCQlmb3IgKGkgPSAwOyBpIDwgNDAwMDA7IGkrKykgewotCQkJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgRE1NMzJBVF9BSVNUQVQpOwotCQkJaWYgKChzdGF0dXMgJiBETU0zMkFUX1NUQVRVUykgPT0gMCkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaSA9PSA0MDAwMCkKLQkJCXJldHVybiAtRVRJTUVET1VUOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGRtbTMyYXRfYWlfc3RhdHVzLAorCQkJCSAgICAgRE1NMzJBVF9BSVNUQVQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQkvKiByZWFkIGRhdGEgKi8KIAkJbHNiID0gaW5iKGRldi0+aW9iYXNlICsgRE1NMzJBVF9BSUxTQik7CkBAIC00MDMsOCArNDEwLDkgQEAKIHsKIAlzdHJ1Y3QgZG1tMzJhdF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKLQlpbnQgaSwgcmFuZ2U7Ci0JdW5zaWduZWQgY2hhciBjaGFubG8sIGNoYW5oaSwgc3RhdHVzOworCWludCByYW5nZTsKKwl1bnNpZ25lZCBjaGFyIGNoYW5sbywgY2hhbmhpOworCWludCByZXQ7CiAKIAlpZiAoIWNtZC0+Y2hhbmxpc3QpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDM5LDE0ICs0NDcsMTMgQEAKIAkJCQkJCSAgICAgICogaXNyICovCiAJfQogCi0JLyogd2FpdCBmb3IgY2lyY3VpdCB0byBzZXR0bGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNDAwMDA7IGkrKykgewotCQlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBETU0zMkFUX0FJUkJBQ0spOwotCQlpZiAoKHN0YXR1cyAmIERNTTMyQVRfU1RBVFVTKSA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpID09IDQwMDAwKQotCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkvKgorCSAqIHdhaXQgZm9yIGNpcmN1aXQgdG8gc2V0dGxlCisJICogd2UgZG9uJ3QgaGF2ZSB0aGUgJ2luc24nIGhlcmUgYnV0IGl0J3Mgbm90IG5lZWRlZAorCSAqLworCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgTlVMTCwgZG1tMzJhdF9haV9zdGF0dXMsIERNTTMyQVRfQUlSQkFDSyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWlmIChkZXZwcml2LT5haV9zY2Fuc19sZWZ0ID4gMSkgewogCQkvKiBzdGFydCB0aGUgY2xvY2sgYW5kIGVuYWJsZSB0aGUgaW50ZXJydXB0cyAqLwpAQCAtNTI1LDYgKzUzMiwxOSBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorc3RhdGljIGludCBkbW0zMmF0X2FvX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBETU0zMkFUX0RBQ1NUQVQpOworCWlmICgoc3RhdHVzICYgRE1NMzJBVF9EQUNCVVNZKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IGRtbTMyYXRfYW9fd2luc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKQEAgLTUzMyw2ICs1NTMsNyBAQAogCWludCBpOwogCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJdW5zaWduZWQgY2hhciBoaSwgbG8sIHN0YXR1czsKKwlpbnQgcmV0OwogCiAJLyogV3JpdGluZyBhIGxpc3Qgb2YgdmFsdWVzIHRvIGFuIEFPIGNoYW5uZWwgaXMgcHJvYmFibHkgbm90CiAJICogdmVyeSB1c2VmdWwsIGJ1dCB0aGF0J3MgaG93IHRoZSBpbnRlcmZhY2UgaXMgZGVmaW5lZC4gKi8KQEAgLTU0OSwxMyArNTcwLDkgQEAKIAkJb3V0YihoaSwgZGV2LT5pb2Jhc2UgKyBETU0zMkFUX0RBQ01TQik7CiAKIAkJLyogd2FpdCBmb3IgY2lyY3VpdCB0byBzZXR0bGUgKi8KLQkJZm9yIChpID0gMDsgaSA8IDQwMDAwOyBpKyspIHsKLQkJCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIERNTTMyQVRfREFDU1RBVCk7Ci0JCQlpZiAoKHN0YXR1cyAmIERNTTMyQVRfREFDQlVTWSkgPT0gMCkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaSA9PSA0MDAwMCkKLQkJCXJldHVybiAtRVRJTUVET1VUOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGRtbTMyYXRfYW9fZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKIAkJLyogZHVtbXkgcmVhZCB0byB1cGRhdGUgdHJpZ2dlciB0aGUgb3V0cHV0ICovCiAJCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIERNTTMyQVRfREFDTVNCKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTEuYwppbmRleCA0MjcxOTAzLi5iYTdjMmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxMS5jCkBAIC0yMjQsMjMgKzIyNCwzMiBAQAogCSZyYW5nZV91bmlwb2xhcjUKIH07CiAKLSNkZWZpbmUgRFQyODExX1RJTUVPVVQgNQorc3RhdGljIGludCBkdDI4MTFfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgRFQyODExX0FEQ1NSKTsKKwlpZiAoKHN0YXR1cyAmIERUMjgxMV9BREJVU1kpID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CiAKIHN0YXRpYyBpbnQgZHQyODExX2FpX2luc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JaW50IHRpbWVvdXQgPSBEVDI4MTFfVElNRU9VVDsKKwlpbnQgcmV0OwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgewogCQlvdXRiKGNoYW4sIGRldi0+aW9iYXNlICsgRFQyODExX0FER0NSKTsKIAotCQl3aGlsZSAodGltZW91dAotCQkgICAgICAgJiYgaW5iKGRldi0+aW9iYXNlICsgRFQyODExX0FEQ1NSKSAmIERUMjgxMV9BREJVU1kpCi0JCQl0aW1lb3V0LS07Ci0JCWlmICghdGltZW91dCkKLQkJCXJldHVybiAtRVRJTUU7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZHQyODExX2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCWRhdGFbaV0gPSBpbmIoZGV2LT5pb2Jhc2UgKyBEVDI4MTFfQUREQVRMTyk7CiAJCWRhdGFbaV0gfD0gaW5iKGRldi0+aW9iYXNlICsgRFQyODExX0FEREFUSEkpIDw8IDg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE0LmMKaW5kZXggYWJhZDZlNC4uMzc5NGI3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTQuYwpAQCAtNjYsMjYgKzY2LDM1IEBACiAjZGVmaW5lIERUMjgxNF9USU1FT1VUIDEwCiAjZGVmaW5lIERUMjgxNF9NQVhfU1BFRUQgMTAwMDAwCS8qIEFyYml0cmFyeSAxMCBraHogbGltaXQgKi8KIAorc3RhdGljIGludCBkdDI4MTRfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgRFQyODE0X0NTUik7CisJaWYgKHN0YXR1cyAmIERUMjgxNF9GSU5JU0gpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgZHQyODE0X2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewotCWludCBuLCBpLCBoaSwgbG87CisJaW50IG4sIGhpLCBsbzsKIAlpbnQgY2hhbjsKLQlpbnQgc3RhdHVzID0gMDsKKwlpbnQgcmV0OwogCiAJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewogCQljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAKIAkJb3V0YihjaGFuLCBkZXYtPmlvYmFzZSArIERUMjgxNF9DU1IpOwotCQlmb3IgKGkgPSAwOyBpIDwgRFQyODE0X1RJTUVPVVQ7IGkrKykgewotCQkJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgRFQyODE0X0NTUik7Ci0JCQl1ZGVsYXkoMTApOwotCQkJaWYgKHN0YXR1cyAmIERUMjgxNF9GSU5JU0gpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGkgPj0gRFQyODE0X1RJTUVPVVQpCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGR0MjgxNF9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQloaSA9IGluYihkZXYtPmlvYmFzZSArIERUMjgxNF9EQVRBKTsKIAkJbG8gPSBpbmIoZGV2LT5pb2Jhc2UgKyBEVDI4MTRfREFUQSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE1LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE1LmMKaW5kZXggZWUyNDcxNy4uYjlhYzRlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTUuYwpAQCAtNjcsMTUgKzY3LDE3IEBACiAJdW5zaWduZWQgaW50IGFvX3JlYWRiYWNrWzhdOwogfTsKIAotc3RhdGljIGludCBkdDI4MTVfd2FpdF9mb3Jfc3RhdHVzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBzdGF0dXMpCitzdGF0aWMgaW50IGR0MjgxNV9hb19zdGF0dXMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQogewotCWludCBpOworCXVuc2lnbmVkIGludCBzdGF0dXM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJaWYgKGluYihkZXYtPmlvYmFzZSArIERUMjgxNV9TVEFUVVMpID09IHN0YXR1cykKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gc3RhdHVzOworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIERUMjgxNV9TVEFUVVMpOworCWlmIChzdGF0dXMgPT0gY29udGV4dCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKIH0KIAogc3RhdGljIGludCBkdDI4MTVfYW9faW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC05OCwzMCArMTAwLDIzIEBACiAJc3RydWN0IGR0MjgxNV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBpOwogCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JdW5zaWduZWQgaW50IHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgbG8sIGhpOworCWludCByZXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CiAJCWxvID0gKChkYXRhW2ldICYgMHgwZikgPDwgNCkgfCAoY2hhbiA8PCAxKSB8IDB4MDE7CiAJCWhpID0gKGRhdGFbaV0gJiAweGZmMCkgPj4gNDsKIAotCQlzdGF0dXMgPSBkdDI4MTVfd2FpdF9mb3Jfc3RhdHVzKGRldiwgMHgwMCk7Ci0JCWlmIChzdGF0dXMgIT0gMCkgewotCQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwKLQkJCQkiZmFpbGVkIHRvIHdyaXRlIGxvdyBieXRlIG9uICVkIHJlYXNvbiAleFxuIiwKLQkJCQljaGFuLCBzdGF0dXMpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQorCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGR0MjgxNV9hb19zdGF0dXMsIDB4MDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQlvdXRiKGxvLCBkZXYtPmlvYmFzZSArIERUMjgxNV9EQVRBKTsKIAotCQlzdGF0dXMgPSBkdDI4MTVfd2FpdF9mb3Jfc3RhdHVzKGRldiwgMHgxMCk7Ci0JCWlmIChzdGF0dXMgIT0gMHgxMCkgewotCQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwKLQkJCQkiZmFpbGVkIHRvIHdyaXRlIGhpZ2ggYnl0ZSBvbiAlZCByZWFzb24gJXhcbiIsCi0JCQkJY2hhbiwgc3RhdHVzKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBkdDI4MTVfYW9fc3RhdHVzLCAweDEwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKIAkJZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl0gPSBkYXRhW2ldOwogCX0KIAlyZXR1cm4gaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MnguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MnguYwppbmRleCA4OTVmNzNhLi4xNmNjMTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODJ4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgyeC5jCkBAIC02Myw3ICs2Myw2IEBACiAKICNpbmNsdWRlICJjb21lZGlfZmMuaCIKIAotI2RlZmluZSBEVDI4MjFfVElNRU9VVAkJMTAwCS8qIDUwMCB1cyAqLwogI2RlZmluZSBEVDI4MjFfU0laRSAweDEwCiAKIC8qCkBAIC0yNDgsMjcgKzI0Nyw2IEBACiAgKiAgICBTb21lIHVzZWxlc3MgYWJzdHJhY3Rpb25zCiAgKi8KICNkZWZpbmUgY2hhbl90b19EQUMoYSkJKChhKSYxKQotI2RlZmluZSBtdXhfYnVzeSgpIChpbncoZGV2LT5pb2Jhc2UrRFQyODIxX0FEQ1NSKSZEVDI4MjFfTVVYQlVTWSkKLSNkZWZpbmUgYWRfZG9uZSgpIChpbncoZGV2LT5pb2Jhc2UrRFQyODIxX0FEQ1NSKSZEVDI4MjFfQURET05FKQotCi0vKgotICogICAgZGFuZ2VyISBtYWNybyBhYnVzZS4uLiBhIGlzIHRoZSBleHByZXNzaW9uIHRvIHdhaXQgb24sIGFuZCBiIGlzCi0gKiAgICAgIHRoZSBzdGF0ZW1lbnQocykgdG8gZXhlY3V0ZSBpZiBpdCBkb2Vzbid0IGhhcHBlbi4KLSAqLwotI2RlZmluZSB3YWl0X2ZvcihhLCBiKQkJCQkJCVwKLQlkbyB7CQkJCQkJCVwKLQkJaW50IF9pOwkJCQkJCVwKLQkJZm9yIChfaSA9IDA7IF9pIDwgRFQyODIxX1RJTUVPVVQ7IF9pKyspIHsJXAotCQkJaWYgKGEpIHsJCQkJXAotCQkJCV9pID0gMDsJCQkJXAotCQkJCWJyZWFrOwkJCQlcCi0JCQl9CQkJCQlcCi0JCQl1ZGVsYXkoNSk7CQkJCVwKLQkJfQkJCQkJCVwKLQkJaWYgKF9pKSB7CQkJCQlcCi0JCQliCQkJCQlcCi0JCX0JCQkJCQlcCi0JfSB3aGlsZSAoMCkKIAogc3RhdGljIGludCBwcmVwX2FpX2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBpbnQgY2hhbiwgaW50IHNpemUpOwogc3RhdGljIGludCBwcmVwX2FvX2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBpbnQgY2hhbiwgaW50IHNpemUpOwpAQCAtMzI4LDcgKzMwNiw2IEBACiAJc2l6ZSA9IGNmY19yZWFkX2FycmF5X2Zyb21fYnVmZmVyKHMsIHB0ciwgZGV2cHJpdi0+ZG1hX21heHNpemUpOwogCWlmIChzaXplID09IDApIHsKIAkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIkFPIHVuZGVycnVuXG4iKTsKLQkJZHQyODJ4X2FvX2NhbmNlbChkZXYsIHMpOwogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKIAkJcmV0dXJuOwogCX0KQEAgLTM2Myw3ICszNDAsNyBAQAogCWR0MjgyeF9tdW5nZShkZXYsIHB0ciwgc2l6ZSk7CiAJcmV0ID0gY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihzLCBwdHIsIHNpemUpOwogCWlmIChyZXQgIT0gc2l6ZSkgewotCQlkdDI4MnhfYWlfY2FuY2VsKGRldiwgcyk7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOwogCQlyZXR1cm47CiAJfQogCWRldnByaXYtPm5yZWFkIC09IHNpemUgLyAyOwpAQCAtMzczLDcgKzM1MCw2IEBACiAJCWRldnByaXYtPm5yZWFkID0gMDsKIAl9CiAJaWYgKCFkZXZwcml2LT5ucmVhZCkgewotCQlkdDI4MnhfYWlfY2FuY2VsKGRldiwgcyk7CiAJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKIAkJcmV0dXJuOwogCX0KQEAgLTQ3MSwxNSArNDQ3LDEzIEBACiAJaWYgKGFkY3NyICYgRFQyODIxX0FERVJSKSB7CiAJCWlmIChkZXZwcml2LT5ucmVhZCAhPSAwKSB7CiAJCQljb21lZGlfZXJyb3IoZGV2LCAiQS9EIGVycm9yIik7Ci0JCQlkdDI4MnhfYWlfY2FuY2VsKGRldiwgcyk7CiAJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKIAkJfQogCQloYW5kbGVkID0gMTsKIAl9CiAJaWYgKGRhY3NyICYgRFQyODIxX0RBRVJSKSB7CiAJCWNvbWVkaV9lcnJvcihkZXYsICJEL0EgZXJyb3IiKTsKLQkJZHQyODJ4X2FvX2NhbmNlbChkZXYsIHNfYW8pOwotCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKKwkJc19hby0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CiAJCWhhbmRsZWQgPSAxOwogCX0KICNpZiAwCkBAIC01MDgsNyArNDgyLDggQEAKIAkJaGFuZGxlZCA9IDE7CiAJfQogI2VuZGlmCi0JY29tZWRpX2V2ZW50KGRldiwgcyk7CisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHNfYW8pOwogCiAJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7CiB9CkBAIC01MzAsNiArNTA1LDI5IEBACiAJb3V0dyhuIC0gMSwgZGV2LT5pb2Jhc2UgKyBEVDI4MjFfQ0hBTkNTUik7CiB9CiAKK3N0YXRpYyBpbnQgZHQyODJ4X2FpX3RpbWVvdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbncoZGV2LT5pb2Jhc2UgKyBEVDI4MjFfQURDU1IpOworCXN3aXRjaCAoY29udGV4dCkgeworCWNhc2UgRFQyODIxX01VWEJVU1k6CisJCWlmICgoc3RhdHVzICYgRFQyODIxX01VWEJVU1kpID09IDApCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBEVDI4MjFfQURET05FOgorCQlpZiAoc3RhdHVzICYgRFQyODIxX0FERE9ORSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKwogLyoKICAqICAgIFBlcmZvcm1zIGEgc2luZ2xlIEEvRCBjb252ZXJzaW9uLgogICogICAgICAtIFB1dCBjaGFubmVsL2dhaW4gaW50byBjaGFubmVsLWdhaW4gbGlzdApAQCAtNTQyLDYgKzU0MCw3IEBACiB7CiAJY29uc3Qgc3RydWN0IGR0MjgyeF9ib2FyZCAqYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKIAlzdHJ1Y3QgZHQyODJ4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJaW50IHJldDsKIAlpbnQgaTsKIAogCS8qIFhYWCBzaG91bGQgd2UgcmVhbGx5IGJlIGVuYWJsaW5nIHRoZSBhZCBjbG9jayBoZXJlPyAqLwpAQCAtNTUxLDEzICs1NTAsMTggQEAKIAlkdDI4MnhfbG9hZF9jaGFuZ2FpbihkZXYsIDEsICZpbnNuLT5jaGFuc3BlYyk7CiAKIAlvdXR3KGRldnByaXYtPnN1cGNzciB8IERUMjgyMV9QUkxELCBkZXYtPmlvYmFzZSArIERUMjgyMV9TVVBDU1IpOwotCXdhaXRfZm9yKCFtdXhfYnVzeSgpLCBjb21lZGlfZXJyb3IoZGV2LCAidGltZW91dFxuIik7IHJldHVybiAtRVRJTUU7KTsKKwlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGR0MjgyeF9haV90aW1lb3V0LCBEVDI4MjFfTVVYQlVTWSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKIAkJb3V0dyhkZXZwcml2LT5zdXBjc3IgfCBEVDI4MjFfU1RSSUcsCiAJCQlkZXYtPmlvYmFzZSArIERUMjgyMV9TVVBDU1IpOwotCQl3YWl0X2ZvcihhZF9kb25lKCksIGNvbWVkaV9lcnJvcihkZXYsICJ0aW1lb3V0XG4iKTsKLQkJCSByZXR1cm4gLUVUSU1FOyk7CisKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBkdDI4MnhfYWlfdGltZW91dCwKKwkJCQkgICAgIERUMjgyMV9BRERPTkUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQlkYXRhW2ldID0KIAkJICAgIGludyhkZXYtPmlvYmFzZSArCkBAIC02NDYsNiArNjUwLDcgQEAKIAlzdHJ1Y3QgZHQyODJ4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOwogCWludCB0aW1lcjsKKwlpbnQgcmV0OwogCiAJaWYgKGRldnByaXYtPnVzZWRtYSA9PSAwKSB7CiAJCWNvbWVkaV9lcnJvcihkZXYsCkBAIC02OTEsNyArNjk2LDkgQEAKIAlvdXR3KGRldnByaXYtPmFkY3NyLCBkZXYtPmlvYmFzZSArIERUMjgyMV9BRENTUik7CiAKIAlvdXR3KGRldnByaXYtPnN1cGNzciB8IERUMjgyMV9QUkxELCBkZXYtPmlvYmFzZSArIERUMjgyMV9TVVBDU1IpOwotCXdhaXRfZm9yKCFtdXhfYnVzeSgpLCBjb21lZGlfZXJyb3IoZGV2LCAidGltZW91dFxuIik7IHJldHVybiAtRVRJTUU7KTsKKwlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIE5VTEwsIGR0MjgyeF9haV90aW1lb3V0LCBEVDI4MjFfTVVYQlVTWSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XKSB7CiAJCW91dHcoZGV2cHJpdi0+c3VwY3NyIHwgRFQyODIxX1NUUklHLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MzAwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MzAwMC5jCmluZGV4IGY1MmE0NDcuLjQzNmU0NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDMwMDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQzMDAwLmMKQEAgLTM2OSwxMiArMzY5LDEwIEBACiAJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SIHwgQ09NRURJX0NCX0VPQTsKIAogCWRlYnVnX25faW50cysrOwotCWlmIChkZWJ1Z19uX2ludHMgPj0gMTApIHsKLQkJZHQza19haV9jYW5jZWwoZGV2LCBzKTsKKwlpZiAoZGVidWdfbl9pbnRzID49IDEwKQogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JfQogCi0JY29tZWRpX2V2ZW50KGRldiwgcyk7CisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTc2Nyw4ICs3NjUsNiBAQAogCXMtPnR5cGUgPSBDT01FRElfU1VCRF9QUk9DOwogI2VuZGlmCiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIGF0dGFjaGVkXG4iLCBkZXYtPmJvYXJkX25hbWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9keW5hX3BjaTEweHguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9keW5hX3BjaTEweHguYwppbmRleCBmMjI0ODI1Li5lNTU5M2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHluYV9wY2kxMHh4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R5bmFfcGNpMTB4eC5jCkBAIC01NywxOCArNTcsMjcgQEAKIAl1bnNpZ25lZCBsb25nIEJBRFIzOwogfTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiBSRUFEIFdSSVRFIEZVTkNUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBkeW5hX3BjaTEweHhfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCi0vKiBhbmFsb2cgaW5wdXQgY2FsbGJhY2sgKi8KKwlzdGF0dXMgPSBpbndfcChkZXYtPmlvYmFzZSk7CisJaWYgKHN0YXR1cyAmICgxIDw8IDE1KSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBkeW5hX3BjaTEweHhfaW5zbl9yZWFkX2FpKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBkeW5hX3BjaTEweHhfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgbiwgY291bnRlcjsKKwlpbnQgbjsKIAl1MTYgZCA9IDA7CisJaW50IHJldCA9IDA7CiAJdW5zaWduZWQgaW50IGNoYW4sIHJhbmdlOwogCiAJLyogZ2V0IHRoZSBjaGFubmVsIG51bWJlciBhbmQgcmFuZ2UgKi8KQEAgLTgyLDE4ICs5MSwxMyBAQAogCQlzbXBfbWIoKTsKIAkJb3V0d19wKDB4MDAwMCArIHJhbmdlICsgY2hhbiwgZGV2LT5pb2Jhc2UgKyAyKTsKIAkJdWRlbGF5KDEwKTsKLQkJLyogcmVhZCBkYXRhICovCi0JCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBSRUFEX1RJTUVPVVQ7IGNvdW50ZXIrKykgewotCQkJZCA9IGlud19wKGRldi0+aW9iYXNlKTsKIAotCQkJLyogY2hlY2sgaWYgcmVhZCBpcyBzdWNjZXNzZnVsIGlmIHRoZSBFT0MgYml0IGlzIHNldCAqLwotCQkJaWYgKGQgJiAoMSA8PCAxNSkpCi0JCQkJZ290byBjb252X2ZpbmlzaDsKLQkJfQotCQlkYXRhW25dID0gMDsKLQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgInRpbWVvdXQgcmVhZGluZyBhbmFsb2cgaW5wdXRcbiIpOwotCQljb250aW51ZTsKLWNvbnZfZmluaXNoOgorCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGR5bmFfcGNpMTB4eF9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJLyogcmVhZCBkYXRhICovCisJCWQgPSBpbndfcChkZXYtPmlvYmFzZSk7CiAJCS8qIG1hc2sgdGhlIGZpcnN0IDQgYml0cyAtIEVPQyBiaXRzICovCiAJCWQgJj0gMHgwRkZGOwogCQlkYXRhW25dID0gZDsKQEAgLTEwMSw3ICsxMDUsNyBAQAogCW11dGV4X3VubG9jaygmZGV2cHJpdi0+bXV0ZXgpOwogCiAJLyogcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyByZWFkL3dyaXR0ZW4gKi8KLQlyZXR1cm4gbjsKKwlyZXR1cm4gcmV0ID8gcmV0IDogbjsKIH0KIAogLyogYW5hbG9nIG91dHB1dCBjYWxsYmFjayAqLwpAQCAtMjMyLDggKzIzNiw2IEBACiAJcy0+c3RhdGUgPSAwOwogCXMtPmluc25fYml0cyA9IGR5bmFfcGNpMTB4eF9kb19pbnNuX2JpdHM7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIGF0dGFjaGVkXG4iLCBkZXYtPmJvYXJkX25hbWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9mbDUxMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ZsNTEyLmMKaW5kZXggYTk5ZGRmMC4uNGU0MTBmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ZsNTEyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ZsNTEyLmMKQEAgLTEsMjcgKzEsNDkgQEAKIC8qCi0gICAgY29tZWRpL2RyaXZlcnMvZmw1MTIuYwotICAgIEFuZGVycyBHbmlzdHJ1cCA8ZXgxOEBrYWxtYW4uaWF1LmR0dS5kaz4KLSovCisgKiBmbDUxMi5jCisgKiBBbmRlcnMgR25pc3RydXAgPGV4MThAa2FsbWFuLmlhdS5kdHUuZGs+CisgKgorICogQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICogQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLwogCiAvKgotRHJpdmVyOiBmbDUxMgotRGVzY3JpcHRpb246IHVua25vd24KLUF1dGhvcjogQW5kZXJzIEduaXN0cnVwIDxleDE4QGthbG1hbi5pYXUuZHR1LmRrPgotRGV2aWNlczogW3Vua25vd25dIEZMNTEyIChmbDUxMikKLVN0YXR1czogdW5rbm93bgotCi1EaWdpdGFsIEkvTyBpcyBub3Qgc3VwcG9ydGVkLgotCi1Db25maWd1cmF0aW9uIG9wdGlvbnM6Ci0gIFswXSAtIEkvTyBwb3J0IGJhc2UgYWRkcmVzcwotKi8KKyAqIERyaXZlcjogZmw1MTIKKyAqIERlc2NyaXB0aW9uOiB1bmtub3duCisgKiBBdXRob3I6IEFuZGVycyBHbmlzdHJ1cCA8ZXgxOEBrYWxtYW4uaWF1LmR0dS5kaz4KKyAqIERldmljZXM6IFt1bmtub3duXSBGTDUxMiAoZmw1MTIpCisgKiBTdGF0dXM6IHVua25vd24KKyAqCisgKiBEaWdpdGFsIEkvTyBpcyBub3Qgc3VwcG9ydGVkLgorICoKKyAqIENvbmZpZ3VyYXRpb24gb3B0aW9uczoKKyAqICAgWzBdIC0gSS9PIHBvcnQgYmFzZSBhZGRyZXNzCisgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAotI2RlZmluZSBGTDUxMl9TSVpFIDE2CQkvKiB0aGUgc2l6ZSBvZiB0aGUgdXNlZCBtZW1vcnkgKi8KKy8qCisgKiBSZWdpc3RlciBJL08gbWFwCisgKi8KKyNkZWZpbmUgRkw1MTJfQUlfTFNCX1JFRwkJMHgwMgorI2RlZmluZSBGTDUxMl9BSV9NU0JfUkVHCQkweDAzCisjZGVmaW5lIEZMNTEyX0FJX01VWF9SRUcJCTB4MDIKKyNkZWZpbmUgRkw1MTJfQUlfU1RBUlRfQ09OVl9SRUcJCTB4MDMKKyNkZWZpbmUgRkw1MTJfQU9fREFUQV9SRUcoeCkJCSgweDA0ICsgKCh4KSAqIDIpKQorI2RlZmluZSBGTDUxMl9BT19UUklHX1JFRyh4KQkJKDB4MDQgKyAoKHgpICogMikpCisKIHN0cnVjdCBmbDUxMl9wcml2YXRlIHsKIAl1bnNpZ25lZCBzaG9ydCBhb19yZWFkYmFja1syXTsKIH07CkBAIC0zOCw3MiArNjAsNjkgQEAKIAl9CiB9OwogCi0vKgotICogZmw1MTJfYWlfaW5zbiA6IHRoaXMgaXMgdGhlIGFuYWxvZyBpbnB1dCBmdW5jdGlvbgotICovCi1zdGF0aWMgaW50IGZsNTEyX2FpX2luc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyBpbnQgZmw1MTJfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQlpbnQgbjsKLQl1bnNpZ25lZCBpbnQgbG9fYnl0ZSwgaGlfYnl0ZTsKLQljaGFyIGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQl1bnNpZ25lZCBsb25nIGlvYmFzZSA9IGRldi0+aW9iYXNlOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgaTsKIAotCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsJLyogc2FtcGxlIG4gdGltZXMgb24gc2VsZWN0ZWQgY2hhbm5lbCAqLwotCQkvKiBYWFggcHJvYmFibHkgY2FuIG1vdmUgbmV4dCBzdGVwIG91dCBvZiBmb3IoKSBsb29wIC0tIHdpbGwKLQkJICogbWFrZSBBSSBhIGxpdHRsZSBiaXQgZmFzdGVyLiAqLwotCQlvdXRiKGNoYW4sIGlvYmFzZSArIDIpOwkvKiBzZWxlY3QgY2hhbiAqLwotCQlvdXRiKDAsIGlvYmFzZSArIDMpOwkvKiBzdGFydCBjb252ZXJzaW9uICovCisJb3V0YihjaGFuLCBkZXYtPmlvYmFzZSArIEZMNTEyX0FJX01VWF9SRUcpOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgRkw1MTJfQUlfU1RBUlRfQ09OVl9SRUcpOworCiAJCS8qIFhYWCBzaG91bGQgdGVzdCAiZG9uZSIgZmxhZyBpbnN0ZWFkIG9mIGRlbGF5ICovCi0JCXVkZWxheSgzMCk7CS8qIHNsZWVwIDMwIHVzZWMgKi8KLQkJbG9fYnl0ZSA9IGluYihpb2Jhc2UgKyAyKTsJLyogbG93IDggYnl0ZSAqLwotCQloaV9ieXRlID0gaW5iKGlvYmFzZSArIDMpICYgMHhmOyAvKiBoaWdoIDQgYml0IGFuZCBtYXNrICovCi0JCWRhdGFbbl0gPSBsb19ieXRlICsgKGhpX2J5dGUgPDwgOCk7CisJCXVkZWxheSgzMCk7CisKKwkJdmFsID0gaW5iKGRldi0+aW9iYXNlICsgRkw1MTJfQUlfTFNCX1JFRyk7CisJCXZhbCB8PSAoaW5iKGRldi0+aW9iYXNlICsgRkw1MTJfQUlfTVNCX1JFRykgPDwgOCk7CisJCXZhbCAmPSBzLT5tYXhkYXRhOworCisJCWRhdGFbaV0gPSB2YWw7CiAJfQotCXJldHVybiBuOworCisJcmV0dXJuIGluc24tPm47CiB9CiAKLS8qCi0gKiBmbDUxMl9hb19pbnNuIDogdXNlZCB0byB3cml0ZSB0byBhIERBIHBvcnQgbiB0aW1lcwotICovCi1zdGF0aWMgaW50IGZsNTEyX2FvX2luc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyBpbnQgZmw1MTJfYW9faW5zbl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGZsNTEyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IG47Ci0JaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsJLyogZ2V0IGNoYW4gdG8gd3JpdGUgKi8KLQl1bnNpZ25lZCBsb25nIGlvYmFzZSA9IGRldi0+aW9iYXNlOwkvKiBnZXQgYmFzZSBhZGRyZXNzICAqLworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHZhbCA9IGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dOworCWludCBpOwogCi0JZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewkvKiB3cml0ZSBuIGRhdGEgc2V0ICovCi0JCS8qIHdyaXRlIGxvdyBieXRlICAgKi8KLQkJb3V0YihkYXRhW25dICYgMHgwZmYsIGlvYmFzZSArIDQgKyAyICogY2hhbik7Ci0JCS8qIHdyaXRlIGhpZ2ggYnl0ZSAgKi8KLQkJb3V0YigoZGF0YVtuXSAmIDB4ZjAwKSA+PiA4LCBpb2Jhc2UgKyA0ICsgMiAqIGNoYW4pOwotCQlpbmIoaW9iYXNlICsgNCArIDIgKiBjaGFuKTsJLyogdHJpZyAqLworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJdmFsID0gZGF0YVtpXTsKIAotCQlkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXSA9IGRhdGFbbl07CisJCS8qIHdyaXRlIExTQiwgTVNCIHRoZW4gdHJpZ2dlciBjb252ZXJzaW9uICovCisJCW91dGIodmFsICYgMHgwZmYsIGRldi0+aW9iYXNlICsgRkw1MTJfQU9fREFUQV9SRUcoY2hhbikpOworCQlvdXRiKCh2YWwgPj4gOCkgJiAweGYsIGRldi0+aW9iYXNlICsgRkw1MTJfQU9fREFUQV9SRUcoY2hhbikpOworCQlpbmIoZGV2LT5pb2Jhc2UgKyBGTDUxMl9BT19UUklHX1JFRyhjaGFuKSk7CiAJfQotCXJldHVybiBuOworCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gdmFsOworCisJcmV0dXJuIGluc24tPm47CiB9CiAKLS8qCi0gKiBmbDUxMl9hb19pbnNuX3JlYWRiYWNrIDogdXNlZCB0byByZWFkIHByZXZpb3VzIHZhbHVlcyB3cml0dGVuIHRvCi0gKiBEQSBwb3J0Ci0gKi8KLXN0YXRpYyBpbnQgZmw1MTJfYW9faW5zbl9yZWFkYmFjayhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyBpbnQgZmw1MTJfYW9faW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgZmw1MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgbjsKLQlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJaW50IGk7CiAKLQlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKQotCQlkYXRhW25dID0gZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl07CisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKKwkJZGF0YVtpXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dOwogCi0JcmV0dXJuIG47CisJcmV0dXJuIGluc24tPm47CiB9CiAKIHN0YXRpYyBpbnQgZmw1MTJfYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCkKQEAgLTExMiw3ICsxMzEsNyBAQAogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwogCWludCByZXQ7CiAKLQlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgRkw1MTJfU0laRSk7CisJcmV0ID0gY29tZWRpX3JlcXVlc3RfcmVnaW9uKGRldiwgaXQtPm9wdGlvbnNbMF0sIDB4MTApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTEyNCw0MiArMTQzLDI2IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCS8qCi0JICogdGhpcyBpZiB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIHN1cGRldmljZXMsIDIgaGF2ZSBiZWVuIGRlZmluZWQKLQkgKi8KLQkvKiBBbmFsb2cgaW5kcHV0ICovCisJLyogQW5hbG9nIElucHV0IHN1YmRldmljZSAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzBdOwotCS8qIGRlZmluZSBzdWJkZXZpY2UgYXMgQW5hbG9nIEluICovCi0Jcy0+dHlwZSA9IENPTUVESV9TVUJEX0FJOwotCS8qIHlvdSBjYW4gcmVhZCBpdCBmcm9tIHVzZXJzcGFjZSAqLwotCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9HUk9VTkQ7Ci0JLyogTnVtYmVyIG9mIEFuYWxvZyBpbnB1dCBjaGFubmVscyAqLwotCXMtPm5fY2hhbiA9IDE2OwotCS8qIGFjY2VwdCBvbmx5IDEyIGJpdHMgb2YgZGF0YSAqLwotCXMtPm1heGRhdGEgPSAweDBmZmY7Ci0JLyogZGV2aWNlIHVzZSBvbmUgb2YgdGhlIHJhbmdlcyAqLwotCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2ZsNTEyOwotCS8qIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiByZWFkIEFEICovCi0Jcy0+aW5zbl9yZWFkID0gZmw1MTJfYWlfaW5zbjsKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0FJOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9SRUFEQUJMRSB8IFNERl9HUk9VTkQ7CisJcy0+bl9jaGFuCT0gMTY7CisJcy0+bWF4ZGF0YQk9IDB4MGZmZjsKKwlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV9mbDUxMjsKKwlzLT5pbnNuX3JlYWQJPSBmbDUxMl9haV9pbnNuX3JlYWQ7CiAKLQkvKiBBbmFsb2cgb3V0cHV0ICovCisJLyogQW5hbG9nIE91dHB1dCBzdWJkZXZpY2UgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1sxXTsKLQkvKiBkZWZpbmUgc3ViZGV2aWNlIGFzIEFuYWxvZyBPVVQgKi8KLQlzLT50eXBlID0gQ09NRURJX1NVQkRfQU87Ci0JLyogeW91IGNhbiB3cml0ZSBpdCBmcm9tIHVzZXJzcGFjZSAqLwotCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRTsKLQkvKiBOdW1iZXIgb2YgQW5hbG9nIG91dHB1dCBjaGFubmVscyAqLwotCXMtPm5fY2hhbiA9IDI7Ci0JLyogYWNjZXB0IG9ubHkgMTIgYml0cyBvZiBkYXRhICovCi0Jcy0+bWF4ZGF0YSA9IDB4MGZmZjsKLQkvKiBkZXZpY2UgdXNlIG9uZSBvZiB0aGUgcmFuZ2VzICovCi0Jcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZmw1MTI7Ci0JLyogZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHdyaXRlIERBICovCi0Jcy0+aW5zbl93cml0ZSA9IGZsNTEyX2FvX2luc247Ci0JLyogZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHJlYWRpbmcgREEgKi8KLQlzLT5pbnNuX3JlYWQgPSBmbDUxMl9hb19pbnNuX3JlYWRiYWNrOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQU87CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1dSSVRBQkxFOworCXMtPm5fY2hhbgk9IDI7CisJcy0+bWF4ZGF0YQk9IDB4MGZmZjsKKwlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV9mbDUxMjsKKwlzLT5pbnNuX3dyaXRlCT0gZmw1MTJfYW9faW5zbl93cml0ZTsKKwlzLT5pbnNuX3JlYWQJPSBmbDUxMl9hb19pbnNuX3JlYWQ7CiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIGZsNTEyX2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9nc2NfaHBkaS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMKaW5kZXggZGU2MGEyOC4uMDhkNzY1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMKQEAgLTEsMjQgKzEsMjQgQEAKIC8qCi0gICAgY29tZWRpL2RyaXZlcnMvZ3NjX2hwZGkuYwotICAgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBHZW5lcmFsIFN0YW5kYXJkcyBDb3Jwb3JhdGlvbiBIaWdoCi0gICAgU3BlZWQgUGFyYWxsZWwgRGlnaXRhbCBJbnRlcmZhY2UgcnM0ODUgYm9hcmRzLgotCi0gICAgQXV0aG9yOiAgRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PgotICAgIENvcHlyaWdodCAoQykgMjAwMyBDb2hlcmVudCBJbWFnaW5nIFN5c3RlbXMKLQotICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctOCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKi8KKyAqIGdzY19ocGRpLmMKKyAqIENvbWVkaSBkcml2ZXIgdGhlIEdlbmVyYWwgU3RhbmRhcmRzIENvcnBvcmF0aW9uCisgKiBIaWdoIFNwZWVkIFBhcmFsbGVsIERpZ2l0YWwgSW50ZXJmYWNlIHJzNDg1IGJvYXJkcy4KKyAqCisgKiBBdXRob3I6ICBGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29oZXJlbnQgSW1hZ2luZyBTeXN0ZW1zCisgKgorICogQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICogQ29weXJpZ2h0IChDKSAxOTk3LTggRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCiAKIC8qCiAgKiBEcml2ZXI6IGdzY19ocGRpCkBAIC00MCw4ICs0MCw2IEBACiAgKiBzdXBwb3J0IGNvdWxkIGJlIGFkZGVkIHRvIHRoaXMgZHJpdmVyLgogICovCiAKLSNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKLQogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC01MiwxNDkgKzUwLDEwNSBAQAogI2luY2x1ZGUgInBseDkwODAuaCIKICNpbmNsdWRlICJjb21lZGlfZmMuaCIKIAotc3RhdGljIHZvaWQgYWJvcnRfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjaGFubmVsKTsKLXN0YXRpYyBpbnQgaHBkaV9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpOwotc3RhdGljIGludCBocGRpX2NtZF90ZXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJIHN0cnVjdCBjb21lZGlfY21kICpjbWQpOwotc3RhdGljIGludCBocGRpX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyk7Ci1zdGF0aWMgaXJxcmV0dXJuX3QgaGFuZGxlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKTsKLXN0YXRpYyBpbnQgZGlvX2NvbmZpZ19ibG9ja19zaXplKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqZGF0YSk7CisvKgorICogUENJIEJBUjIgUmVnaXN0ZXIgbWFwIChkZXZwcml2LT5tbWlvKQorICovCisjZGVmaW5lIEZJUk1XQVJFX1JFVl9SRUcJCQkweDAwCisjZGVmaW5lIEZFQVRVUkVTX1JFR19QUkVTRU5UX0JJVAkJKDEgPDwgMTUpCisjZGVmaW5lIEJPQVJEX0NPTlRST0xfUkVHCQkJMHgwNAorI2RlZmluZSBCT0FSRF9SRVNFVF9CSVQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgVFhfRklGT19SRVNFVF9CSVQJCQkoMSA8PCAxKQorI2RlZmluZSBSWF9GSUZPX1JFU0VUX0JJVAkJCSgxIDw8IDIpCisjZGVmaW5lIFRYX0VOQUJMRV9CSVQJCQkJKDEgPDwgNCkKKyNkZWZpbmUgUlhfRU5BQkxFX0JJVAkJCQkoMSA8PCA1KQorI2RlZmluZSBERU1BTkRfRE1BX0RJUkVDVElPTl9UWF9CSVQJCSgxIDw8IDYpICAvKiBjaCAwIG9ubHkgKi8KKyNkZWZpbmUgTElORV9WQUxJRF9PTl9TVEFUVVNfVkFMSURfQklUCQkoMSA8PCA3KQorI2RlZmluZSBTVEFSVF9UWF9CSVQJCQkJKDEgPDwgOCkKKyNkZWZpbmUgQ0FCTEVfVEhST1RUTEVfRU5BQkxFX0JJVAkJKDEgPDwgOSkKKyNkZWZpbmUgVEVTVF9NT0RFX0VOQUJMRV9CSVQJCQkoMSA8PCAzMSkKKyNkZWZpbmUgQk9BUkRfU1RBVFVTX1JFRwkJCTB4MDgKKyNkZWZpbmUgQ09NTUFORF9MSU5FX1NUQVRVU19NQVNLCQkoMHg3ZiA8PCAwKQorI2RlZmluZSBUWF9JTl9QUk9HUkVTU19CSVQJCQkoMSA8PCA3KQorI2RlZmluZSBUWF9OT1RfRU1QVFlfQklUCQkJKDEgPDwgOCkKKyNkZWZpbmUgVFhfTk9UX0FMTU9TVF9FTVBUWV9CSVQJCQkoMSA8PCA5KQorI2RlZmluZSBUWF9OT1RfQUxNT1NUX0ZVTExfQklUCQkJKDEgPDwgMTApCisjZGVmaW5lIFRYX05PVF9GVUxMX0JJVAkJCQkoMSA8PCAxMSkKKyNkZWZpbmUgUlhfTk9UX0VNUFRZX0JJVAkJCSgxIDw8IDEyKQorI2RlZmluZSBSWF9OT1RfQUxNT1NUX0VNUFRZX0JJVAkJCSgxIDw8IDEzKQorI2RlZmluZSBSWF9OT1RfQUxNT1NUX0ZVTExfQklUCQkJKDEgPDwgMTQpCisjZGVmaW5lIFJYX05PVF9GVUxMX0JJVAkJCQkoMSA8PCAxNSkKKyNkZWZpbmUgQk9BUkRfSlVNUEVSMF9JTlNUQUxMRURfQklUCQkoMSA8PCAxNikKKyNkZWZpbmUgQk9BUkRfSlVNUEVSMV9JTlNUQUxMRURfQklUCQkoMSA8PCAxNykKKyNkZWZpbmUgVFhfT1ZFUlJVTl9CSVQJCQkJKDEgPDwgMjEpCisjZGVmaW5lIFJYX1VOREVSUlVOX0JJVAkJCQkoMSA8PCAyMikKKyNkZWZpbmUgUlhfT1ZFUlJVTl9CSVQJCQkJKDEgPDwgMjMpCisjZGVmaW5lIFRYX1BST0dfQUxNT1NUX1JFRwkJCTB4MGMKKyNkZWZpbmUgUlhfUFJPR19BTE1PU1RfUkVHCQkJMHgxMAorI2RlZmluZSBBTE1PU1RfRU1QVFlfQklUUyh4KQkJCSgoKHgpICYgMHhmZmZmKSA8PCAwKQorI2RlZmluZSBBTE1PU1RfRlVMTF9CSVRTKHgpCQkJKCgoeCkgJiAweGZmKSA8PCAxNikKKyNkZWZpbmUgRkVBVFVSRVNfUkVHCQkJCTB4MTQKKyNkZWZpbmUgRklGT19TSVpFX1BSRVNFTlRfQklUCQkJKDEgPDwgMCkKKyNkZWZpbmUgRklGT19XT1JEU19QUkVTRU5UX0JJVAkJCSgxIDw8IDEpCisjZGVmaW5lIExFVkVMX0VER0VfSU5URVJSVVBUU19QUkVTRU5UX0JJVAkoMSA8PCAyKQorI2RlZmluZSBHUElPX1NVUFBPUlRFRF9CSVQJCQkoMSA8PCAzKQorI2RlZmluZSBQTFhfRE1BX0NIMV9TVVBQT1JURURfQklUCQkoMSA8PCA0KQorI2RlZmluZSBPVkVSUlVOX1VOREVSUlVOX1NVUFBPUlRFRF9CSVQJCSgxIDw8IDUpCisjZGVmaW5lIEZJRk9fUkVHCQkJCTB4MTgKKyNkZWZpbmUgVFhfU1RBVFVTX0NPVU5UX1JFRwkJCTB4MWMKKyNkZWZpbmUgVFhfTElORV9WQUxJRF9DT1VOVF9SRUcJCQkweDIwLAorI2RlZmluZSBUWF9MSU5FX0lOVkFMSURfQ09VTlRfUkVHCQkweDI0CisjZGVmaW5lIFJYX1NUQVRVU19DT1VOVF9SRUcJCQkweDI4CisjZGVmaW5lIFJYX0xJTkVfQ09VTlRfUkVHCQkJMHgyYworI2RlZmluZSBJTlRFUlJVUFRfQ09OVFJPTF9SRUcJCQkweDMwCisjZGVmaW5lIEZSQU1FX1ZBTElEX1NUQVJUX0lOVFIJCQkoMSA8PCAwKQorI2RlZmluZSBGUkFNRV9WQUxJRF9FTkRfSU5UUgkJCSgxIDw8IDEpCisjZGVmaW5lIFRYX0ZJRk9fRU1QVFlfSU5UUgkJCSgxIDw8IDgpCisjZGVmaW5lIFRYX0ZJRk9fQUxNT1NUX0VNUFRZX0lOVFIJCSgxIDw8IDkpCisjZGVmaW5lIFRYX0ZJRk9fQUxNT1NUX0ZVTExfSU5UUgkJKDEgPDwgMTApCisjZGVmaW5lIFRYX0ZJRk9fRlVMTF9JTlRSCQkJKDEgPDwgMTEpCisjZGVmaW5lIFJYX0VNUFRZX0lOVFIJCQkJKDEgPDwgMTIpCisjZGVmaW5lIFJYX0FMTU9TVF9FTVBUWV9JTlRSCQkJKDEgPDwgMTMpCisjZGVmaW5lIFJYX0FMTU9TVF9GVUxMX0lOVFIJCQkoMSA8PCAxNCkKKyNkZWZpbmUgUlhfRlVMTF9JTlRSCQkJCSgxIDw8IDE1KQorI2RlZmluZSBJTlRFUlJVUFRfU1RBVFVTX1JFRwkJCTB4MzQKKyNkZWZpbmUgVFhfQ0xPQ0tfRElWSURFUl9SRUcJCQkweDM4CisjZGVmaW5lIFRYX0ZJRk9fU0laRV9SRUcJCQkweDQwCisjZGVmaW5lIFJYX0ZJRk9fU0laRV9SRUcJCQkweDQ0CisjZGVmaW5lIEZJRk9fU0laRV9NQVNLCQkJCSgweGZmZmZmIDw8IDApCisjZGVmaW5lIFRYX0ZJRk9fV09SRFNfUkVHCQkJMHg0OAorI2RlZmluZSBSWF9GSUZPX1dPUkRTX1JFRwkJCTB4NGMKKyNkZWZpbmUgSU5URVJSVVBUX0VER0VfTEVWRUxfUkVHCQkweDUwCisjZGVmaW5lIElOVEVSUlVQVF9QT0xBUklUWV9SRUcJCQkweDU0CiAKLSNkZWZpbmUgVElNRVJfQkFTRSA1MAkJLyogIDIwTUh6IG1hc3RlciBjbG9jayAqLwotI2RlZmluZSBETUFfQlVGRkVSX1NJWkUgMHgxMDAwMAotI2RlZmluZSBOVU1fRE1BX0JVRkZFUlMgNAotI2RlZmluZSBOVU1fRE1BX0RFU0NSSVBUT1JTIDI1NgotCi1lbnVtIGhwZGlfcmVnaXN0ZXJzIHsKLQlGSVJNV0FSRV9SRVZfUkVHID0gMHgwLAotCUJPQVJEX0NPTlRST0xfUkVHID0gMHg0LAotCUJPQVJEX1NUQVRVU19SRUcgPSAweDgsCi0JVFhfUFJPR19BTE1PU1RfUkVHID0gMHhjLAotCVJYX1BST0dfQUxNT1NUX1JFRyA9IDB4MTAsCi0JRkVBVFVSRVNfUkVHID0gMHgxNCwKLQlGSUZPX1JFRyA9IDB4MTgsCi0JVFhfU1RBVFVTX0NPVU5UX1JFRyA9IDB4MWMsCi0JVFhfTElORV9WQUxJRF9DT1VOVF9SRUcgPSAweDIwLAotCVRYX0xJTkVfSU5WQUxJRF9DT1VOVF9SRUcgPSAweDI0LAotCVJYX1NUQVRVU19DT1VOVF9SRUcgPSAweDI4LAotCVJYX0xJTkVfQ09VTlRfUkVHID0gMHgyYywKLQlJTlRFUlJVUFRfQ09OVFJPTF9SRUcgPSAweDMwLAotCUlOVEVSUlVQVF9TVEFUVVNfUkVHID0gMHgzNCwKLQlUWF9DTE9DS19ESVZJREVSX1JFRyA9IDB4MzgsCi0JVFhfRklGT19TSVpFX1JFRyA9IDB4NDAsCi0JUlhfRklGT19TSVpFX1JFRyA9IDB4NDQsCi0JVFhfRklGT19XT1JEU19SRUcgPSAweDQ4LAotCVJYX0ZJRk9fV09SRFNfUkVHID0gMHg0YywKLQlJTlRFUlJVUFRfRURHRV9MRVZFTF9SRUcgPSAweDUwLAotCUlOVEVSUlVQVF9QT0xBUklUWV9SRUcgPSAweDU0LAotfTsKLQotLyogYml0IGRlZmluaXRpb25zICovCi0KLWVudW0gZmlybXdhcmVfcmV2aXNpb25fYml0cyB7Ci0JRkVBVFVSRVNfUkVHX1BSRVNFTlRfQklUID0gMHg4MDAwLAotfTsKLQotZW51bSBib2FyZF9jb250cm9sX2JpdHMgewotCUJPQVJEX1JFU0VUX0JJVCA9IDB4MSwJLyogd2FpdCAxMHVzZWMgYmVmb3JlIGFjY2Vzc2luZyBmaWZvcyAqLwotCVRYX0ZJRk9fUkVTRVRfQklUID0gMHgyLAotCVJYX0ZJRk9fUkVTRVRfQklUID0gMHg0LAotCVRYX0VOQUJMRV9CSVQgPSAweDEwLAotCVJYX0VOQUJMRV9CSVQgPSAweDIwLAotCURFTUFORF9ETUFfRElSRUNUSU9OX1RYX0JJVCA9IDB4NDAsCi0JCS8qIGZvciBjaCAwLCBjaCAxIGNhbiBvbmx5IHRyYW5zbWl0ICh3aGVuIHByZXNlbnQpICovCi0JTElORV9WQUxJRF9PTl9TVEFUVVNfVkFMSURfQklUID0gMHg4MCwKLQlTVEFSVF9UWF9CSVQgPSAweDEwLAotCUNBQkxFX1RIUk9UVExFX0VOQUJMRV9CSVQgPSAweDIwLAotCVRFU1RfTU9ERV9FTkFCTEVfQklUID0gMHg4MDAwMDAwMCwKLX07Ci0KLWVudW0gYm9hcmRfc3RhdHVzX2JpdHMgewotCUNPTU1BTkRfTElORV9TVEFUVVNfTUFTSyA9IDB4N2YsCi0JVFhfSU5fUFJPR1JFU1NfQklUID0gMHg4MCwKLQlUWF9OT1RfRU1QVFlfQklUID0gMHgxMDAsCi0JVFhfTk9UX0FMTU9TVF9FTVBUWV9CSVQgPSAweDIwMCwKLQlUWF9OT1RfQUxNT1NUX0ZVTExfQklUID0gMHg0MDAsCi0JVFhfTk9UX0ZVTExfQklUID0gMHg4MDAsCi0JUlhfTk9UX0VNUFRZX0JJVCA9IDB4MTAwMCwKLQlSWF9OT1RfQUxNT1NUX0VNUFRZX0JJVCA9IDB4MjAwMCwKLQlSWF9OT1RfQUxNT1NUX0ZVTExfQklUID0gMHg0MDAwLAotCVJYX05PVF9GVUxMX0JJVCA9IDB4ODAwMCwKLQlCT0FSRF9KVU1QRVIwX0lOU1RBTExFRF9CSVQgPSAweDEwMDAwLAotCUJPQVJEX0pVTVBFUjFfSU5TVEFMTEVEX0JJVCA9IDB4MjAwMDAsCi0JVFhfT1ZFUlJVTl9CSVQgPSAweDIwMDAwMCwKLQlSWF9VTkRFUlJVTl9CSVQgPSAweDQwMDAwMCwKLQlSWF9PVkVSUlVOX0JJVCA9IDB4ODAwMDAwLAotfTsKLQotc3RhdGljIHVpbnQzMl90IGFsbW9zdF9mdWxsX2JpdHModW5zaWduZWQgaW50IG51bV93b3JkcykKLXsKLQkvKiBYWFggbmVlZCB0byBhZGQgb3Igc3VidHJhY3Qgb25lPyAqLwotCXJldHVybiAobnVtX3dvcmRzIDw8IDE2KSAmIDB4ZmYwMDAwOwotfQotCi1zdGF0aWMgdWludDMyX3QgYWxtb3N0X2VtcHR5X2JpdHModW5zaWduZWQgaW50IG51bV93b3JkcykKLXsKLQlyZXR1cm4gbnVtX3dvcmRzICYgMHhmZmZmOwotfQotCi1lbnVtIGZlYXR1cmVzX2JpdHMgewotCUZJRk9fU0laRV9QUkVTRU5UX0JJVCA9IDB4MSwKLQlGSUZPX1dPUkRTX1BSRVNFTlRfQklUID0gMHgyLAotCUxFVkVMX0VER0VfSU5URVJSVVBUU19QUkVTRU5UX0JJVCA9IDB4NCwKLQlHUElPX1NVUFBPUlRFRF9CSVQgPSAweDgsCi0JUExYX0RNQV9DSDFfU1VQUE9SVEVEX0JJVCA9IDB4MTAsCi0JT1ZFUlJVTl9VTkRFUlJVTl9TVVBQT1JURURfQklUID0gMHgyMCwKLX07Ci0KLWVudW0gaW50ZXJydXB0X3NvdXJjZXMgewotCUZSQU1FX1ZBTElEX1NUQVJUX0lOVFIgPSAwLAotCUZSQU1FX1ZBTElEX0VORF9JTlRSID0gMSwKLQlUWF9GSUZPX0VNUFRZX0lOVFIgPSA4LAotCVRYX0ZJRk9fQUxNT1NUX0VNUFRZX0lOVFIgPSA5LAotCVRYX0ZJRk9fQUxNT1NUX0ZVTExfSU5UUiA9IDEwLAotCVRYX0ZJRk9fRlVMTF9JTlRSID0gMTEsCi0JUlhfRU1QVFlfSU5UUiA9IDEyLAotCVJYX0FMTU9TVF9FTVBUWV9JTlRSID0gMTMsCi0JUlhfQUxNT1NUX0ZVTExfSU5UUiA9IDE0LAotCVJYX0ZVTExfSU5UUiA9IDE1LAotfTsKLQotc3RhdGljIHVpbnQzMl90IGludHJfYml0KGludCBpbnRlcnJ1cHRfc291cmNlKQotewotCXJldHVybiAweDEgPDwgaW50ZXJydXB0X3NvdXJjZTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBmaWZvX3NpemUodWludDMyX3QgZmlmb19zaXplX2JpdHMpCi17Ci0JcmV0dXJuIGZpZm9fc2l6ZV9iaXRzICYgMHhmZmZmZjsKLX0KKyNkZWZpbmUgVElNRVJfQkFTRQkJCQk1MAkvKiAyME1IeiBtYXN0ZXIgY2xvY2sgKi8KKyNkZWZpbmUgRE1BX0JVRkZFUl9TSVpFCQkJCTB4MTAwMDAKKyNkZWZpbmUgTlVNX0RNQV9CVUZGRVJTCQkJCTQKKyNkZWZpbmUgTlVNX0RNQV9ERVNDUklQVE9SUwkJCTI1NgogCiBzdHJ1Y3QgaHBkaV9ib2FyZCB7Ci0JY29uc3QgY2hhciAqbmFtZTsJLyogIGJvYXJkIG5hbWUgKi8KLQlpbnQgZGV2aWNlX2lkOwkJLyogIHBjaSBkZXZpY2UgaWQgKi8KLQlpbnQgc3ViZGV2aWNlX2lkOwkvKiAgcGNpIHN1YmRldmljZSBpZCAqLworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGRldmljZV9pZDsKKwlpbnQgc3ViZGV2aWNlX2lkOwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBocGRpX2JvYXJkIGhwZGlfYm9hcmRzW10gPSB7CiAJewotCSAubmFtZSA9ICJwY2ktaHBkaTMyIiwKLQkgLmRldmljZV9pZCA9IFBDSV9ERVZJQ0VfSURfUExYXzkwODAsCi0JIC5zdWJkZXZpY2VfaWQgPSAweDI0MDAsCisJCS5uYW1lCQk9ICJwY2ktaHBkaTMyIiwKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfUExYXzkwODAsCisJCS5zdWJkZXZpY2VfaWQJPSAweDI0MDAsCiAJIH0sCiAjaWYgMAogCXsKLQkgLm5hbWUgPSAicHhpLWhwZGkzMiIsCi0JIC5kZXZpY2VfaWQgPSAweDk2NTYsCi0JIC5zdWJkZXZpY2VfaWQgPSAweDI3MDUsCisJCS5uYW1lCQk9ICJweGktaHBkaTMyIiwKKwkJLmRldmljZV9pZAk9IDB4OTY1NiwKKwkJLnN1YmRldmljZV9pZAk9IDB4MjcwNSwKIAkgfSwKICNlbmRpZgogfTsKIAogc3RydWN0IGhwZGlfcHJpdmF0ZSB7Ci0JLyogIGJhc2UgYWRkcmVzc2VzIChpb3JlbWFwcGVkKSAqLwotCXZvaWQgX19pb21lbSAqcGx4OTA4MF9pb2Jhc2U7Ci0Jdm9pZCBfX2lvbWVtICpocGRpX2lvYmFzZTsKKwl2b2lkIF9faW9tZW0gKnBseDkwODBfbW1pbzsKKwl2b2lkIF9faW9tZW0gKm1taW87CiAJdWludDMyX3QgKmRpb19idWZmZXJbTlVNX0RNQV9CVUZGRVJTXTsJLyogIGRtYSBidWZmZXJzICovCiAJLyogcGh5c2ljYWwgYWRkcmVzc2VzIG9mIGRtYSBidWZmZXJzICovCiAJZG1hX2FkZHJfdCBkaW9fYnVmZmVyX3BoeXNfYWRkcltOVU1fRE1BX0JVRkZFUlNdOwpAQCAtMjA3LDI2ICsxNjEsMzM0IEBACiAJLyogcG9pbnRlciB0byBzdGFydCBvZiBidWZmZXJzIGluZGV4ZWQgYnkgZGVzY3JpcHRvciAqLwogCXVpbnQzMl90ICpkZXNjX2Rpb19idWZmZXJbTlVNX0RNQV9ERVNDUklQVE9SU107CiAJLyogaW5kZXggb2YgdGhlIGRtYSBkZXNjcmlwdG9yIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgZG1hX2Rlc2NfaW5kZXg7CisJdW5zaWduZWQgaW50IGRtYV9kZXNjX2luZGV4OwogCXVuc2lnbmVkIGludCB0eF9maWZvX3NpemU7CiAJdW5zaWduZWQgaW50IHJ4X2ZpZm9fc2l6ZTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGRpb19jb3VudDsKLQkvKiBzb2Z0d2FyZSBjb3BpZXMgb2YgdmFsdWVzIHdyaXR0ZW4gdG8gaHBkaSByZWdpc3RlcnMgKi8KLQl2b2xhdGlsZSB1aW50MzJfdCBiaXRzWzI0XTsKKwl1bnNpZ25lZCBsb25nIGRpb19jb3VudDsKIAkvKiBudW1iZXIgb2YgYnl0ZXMgYXQgd2hpY2ggdG8gZ2VuZXJhdGUgQ09NRURJX0NCX0JMT0NLIGV2ZW50cyAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBibG9ja19zaXplOworCXVuc2lnbmVkIGludCBibG9ja19zaXplOwogfTsKIAotc3RhdGljIGludCBkaW9fY29uZmlnX2luc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJICAgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIHZvaWQgZ3NjX2hwZGlfZHJhaW5fZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXN0cnVjdCBocGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnJlYWRfc3ViZGV2OworCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKwl1bnNpZ25lZCBpbnQgaWR4OworCXVuc2lnbmVkIGludCBzdGFydDsKKwl1bnNpZ25lZCBpbnQgZGVzYzsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgbmV4dDsKKworCWlmIChjaGFubmVsKQorCQluZXh0ID0gcmVhZGwoZGV2cHJpdi0+cGx4OTA4MF9tbWlvICsgUExYX0RNQTFfUENJX0FERFJFU1NfUkVHKTsKKwllbHNlCisJCW5leHQgPSByZWFkbChkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfRE1BMF9QQ0lfQUREUkVTU19SRUcpOworCisJaWR4ID0gZGV2cHJpdi0+ZG1hX2Rlc2NfaW5kZXg7CisJc3RhcnQgPSBsZTMyX3RvX2NwdShkZXZwcml2LT5kbWFfZGVzY1tpZHhdLnBjaV9zdGFydF9hZGRyKTsKKwkvKiBsb29wIHVudGlsIHdlIGhhdmUgcmVhZCBhbGwgdGhlIGZ1bGwgYnVmZmVycyAqLworCWZvciAoZGVzYyA9IDA7IChuZXh0IDwgc3RhcnQgfHwgbmV4dCA+PSBzdGFydCArIGRldnByaXYtPmJsb2NrX3NpemUpICYmCisJICAgICBkZXNjIDwgZGV2cHJpdi0+bnVtX2RtYV9kZXNjcmlwdG9yczsgZGVzYysrKSB7CisJCS8qIHRyYW5zZmVyIGRhdGEgZnJvbSBkbWEgYnVmZmVyIHRvIGNvbWVkaSBidWZmZXIgKi8KKwkJc2l6ZSA9IGRldnByaXYtPmJsb2NrX3NpemUgLyBzaXplb2YodWludDMyX3QpOworCQlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJCQlpZiAoc2l6ZSA+IGRldnByaXYtPmRpb19jb3VudCkKKwkJCQlzaXplID0gZGV2cHJpdi0+ZGlvX2NvdW50OworCQkJZGV2cHJpdi0+ZGlvX2NvdW50IC09IHNpemU7CisJCX0KKwkJY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihzLCBkZXZwcml2LT5kZXNjX2Rpb19idWZmZXJbaWR4XSwKKwkJCQkJICBzaXplICogc2l6ZW9mKHVpbnQzMl90KSk7CisJCWlkeCsrOworCQlpZHggJT0gZGV2cHJpdi0+bnVtX2RtYV9kZXNjcmlwdG9yczsKKwkJc3RhcnQgPSBsZTMyX3RvX2NwdShkZXZwcml2LT5kbWFfZGVzY1tpZHhdLnBjaV9zdGFydF9hZGRyKTsKKworCQlkZXZwcml2LT5kbWFfZGVzY19pbmRleCA9IGlkeDsKKwl9CisJLyogIFhYWCBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW4gc29tZWhvdyAqLworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZ3NjX2hwZGlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCit7CisJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7CisJc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7CisJc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMgPSBzLT5hc3luYzsKKwl1aW50MzJfdCBocGRpX2ludHJfc3RhdHVzLCBocGRpX2JvYXJkX3N0YXR1czsKKwl1aW50MzJfdCBwbHhfc3RhdHVzOworCXVpbnQzMl90IHBseF9iaXRzOworCXVpbnQ4X3QgZG1hMF9zdGF0dXMsIGRtYTFfc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWRldi0+YXR0YWNoZWQpCisJCXJldHVybiBJUlFfTk9ORTsKKworCXBseF9zdGF0dXMgPSByZWFkbChkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfSU5UUkNTX1JFRyk7CisJaWYgKChwbHhfc3RhdHVzICYgKElDU19ETUEwX0EgfCBJQ1NfRE1BMV9BIHwgSUNTX0xJQSkpID09IDApCisJCXJldHVybiBJUlFfTk9ORTsKKworCWhwZGlfaW50cl9zdGF0dXMgPSByZWFkbChkZXZwcml2LT5tbWlvICsgSU5URVJSVVBUX1NUQVRVU19SRUcpOworCWhwZGlfYm9hcmRfc3RhdHVzID0gcmVhZGwoZGV2cHJpdi0+bW1pbyArIEJPQVJEX1NUQVRVU19SRUcpOworCisJaWYgKGhwZGlfaW50cl9zdGF0dXMpCisJCXdyaXRlbChocGRpX2ludHJfc3RhdHVzLCBkZXZwcml2LT5tbWlvICsgSU5URVJSVVBUX1NUQVRVU19SRUcpOworCisJLyogIHNwaW4gbG9jayBtYWtlcyBzdXJlIG5vIG9uZSBlbHNlIGNoYW5nZXMgcGx4IGRtYSBjb250cm9sIHJlZyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CisJZG1hMF9zdGF0dXMgPSByZWFkYihkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfRE1BMF9DU19SRUcpOworCWlmIChwbHhfc3RhdHVzICYgSUNTX0RNQTBfQSkgewkvKiAgZG1hIGNoYW4gMCBpbnRlcnJ1cHQgKi8KKwkJd3JpdGViKChkbWEwX3N0YXR1cyAmIFBMWF9ETUFfRU5fQklUKSB8IFBMWF9DTEVBUl9ETUFfSU5UUl9CSVQsCisJCSAgICAgICBkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfRE1BMF9DU19SRUcpOworCisJCWlmIChkbWEwX3N0YXR1cyAmIFBMWF9ETUFfRU5fQklUKQorCQkJZ3NjX2hwZGlfZHJhaW5fZG1hKGRldiwgMCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCS8qICBzcGluIGxvY2sgbWFrZXMgc3VyZSBubyBvbmUgZWxzZSBjaGFuZ2VzIHBseCBkbWEgY29udHJvbCByZWcgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworCWRtYTFfc3RhdHVzID0gcmVhZGIoZGV2cHJpdi0+cGx4OTA4MF9tbWlvICsgUExYX0RNQTFfQ1NfUkVHKTsKKwlpZiAocGx4X3N0YXR1cyAmIElDU19ETUExX0EpIHsJLyogIFhYWCAqLy8qICBkbWEgY2hhbiAxIGludGVycnVwdCAqLworCQl3cml0ZWIoKGRtYTFfc3RhdHVzICYgUExYX0RNQV9FTl9CSVQpIHwgUExYX0NMRUFSX0RNQV9JTlRSX0JJVCwKKwkJICAgICAgIGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9ETUExX0NTX1JFRyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCS8qICBjbGVhciBwb3NzaWJsZSBwbHg5MDgwIGludGVycnVwdCBzb3VyY2VzICovCisJaWYgKHBseF9zdGF0dXMgJiBJQ1NfTERJQSkgewkvKiAgY2xlYXIgbG9jYWwgZG9vcmJlbGwgaW50ZXJydXB0ICovCisJCXBseF9iaXRzID0gcmVhZGwoZGV2cHJpdi0+cGx4OTA4MF9tbWlvICsgUExYX0RCUl9PVVRfUkVHKTsKKwkJd3JpdGVsKHBseF9iaXRzLCBkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfREJSX09VVF9SRUcpOworCX0KKworCWlmIChocGRpX2JvYXJkX3N0YXR1cyAmIFJYX09WRVJSVU5fQklUKSB7CisJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJyeCBmaWZvIG92ZXJydW5cbiIpOworCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7CisJfQorCisJaWYgKGhwZGlfYm9hcmRfc3RhdHVzICYgUlhfVU5ERVJSVU5fQklUKSB7CisJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJyeCBmaWZvIHVuZGVycnVuXG4iKTsKKwkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOworCX0KKworCWlmIChkZXZwcml2LT5kaW9fY291bnQgPT0gMCkKKwkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgZ3NjX2hwZGlfYWJvcnRfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXN0cnVjdCBocGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qICBzcGlubG9jayBmb3IgcGx4IGRtYSBjb250cm9sL3N0YXR1cyByZWcgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworCisJcGx4OTA4MF9hYm9ydF9kbWEoZGV2cHJpdi0+cGx4OTA4MF9tbWlvLCBjaGFubmVsKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBnc2NfaHBkaV9jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXN0cnVjdCBocGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisKKwl3cml0ZWwoMCwgZGV2cHJpdi0+bW1pbyArIEJPQVJEX0NPTlRST0xfUkVHKTsKKwl3cml0ZWwoMCwgZGV2cHJpdi0+bW1pbyArIElOVEVSUlVQVF9DT05UUk9MX1JFRyk7CisKKwlnc2NfaHBkaV9hYm9ydF9kbWEoZGV2LCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzY19ocGRpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYyA9IHMtPmFzeW5jOworCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmYXN5bmMtPmNtZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVpbnQzMl90IGJpdHM7CisKKwlpZiAocy0+aW9fYml0cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZWwoUlhfRklGT19SRVNFVF9CSVQsIGRldnByaXYtPm1taW8gKyBCT0FSRF9DT05UUk9MX1JFRyk7CisKKwlnc2NfaHBkaV9hYm9ydF9kbWEoZGV2LCAwKTsKKworCWRldnByaXYtPmRtYV9kZXNjX2luZGV4ID0gMDsKKworCS8qCisJICogVGhlc2UgcmVnaXN0ZXIgYXJlIHN1cHBvc2VkbHkgdW51c2VkIGR1cmluZyBjaGFpbmVkIGRtYSwKKwkgKiBidXQgSSBoYXZlIGZvdW5kIHRoYXQgbGVmdCBvdmVyIHZhbHVlcyBmcm9tIGxhc3Qgb3BlcmF0aW9uCisJICogb2NjYXNpb25hbGx5IGNhdXNlIHByb2JsZW1zIHdpdGggdHJhbnNmZXIgb2YgZmlyc3QgZG1hCisJICogYmxvY2suICBJbml0aWFsaXppbmcgdGhlbSB0byB6ZXJvIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbS4KKwkgKi8KKwl3cml0ZWwoMCwgZGV2cHJpdi0+cGx4OTA4MF9tbWlvICsgUExYX0RNQTBfVFJBTlNGRVJfU0laRV9SRUcpOworCXdyaXRlbCgwLCBkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfRE1BMF9QQ0lfQUREUkVTU19SRUcpOworCXdyaXRlbCgwLCBkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfRE1BMF9MT0NBTF9BRERSRVNTX1JFRyk7CisKKwkvKiBnaXZlIGxvY2F0aW9uIG9mIGZpcnN0IGRtYSBkZXNjcmlwdG9yICovCisJYml0cyA9IGRldnByaXYtPmRtYV9kZXNjX3BoeXNfYWRkciB8IFBMWF9ERVNDX0lOX1BDSV9CSVQgfAorCSAgICAgICBQTFhfSU5UUl9URVJNX0NPVU5UIHwgUExYX1hGRVJfTE9DQUxfVE9fUENJOworCXdyaXRlbChiaXRzLCBkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfRE1BMF9ERVNDUklQVE9SX1JFRyk7CisKKwkvKiBlbmFibGUgZG1hIHRyYW5zZmVyICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKKwl3cml0ZWIoUExYX0RNQV9FTl9CSVQgfCBQTFhfRE1BX1NUQVJUX0JJVCB8IFBMWF9DTEVBUl9ETUFfSU5UUl9CSVQsCisJICAgICAgIGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9ETUEwX0NTX1JFRyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKKwkJZGV2cHJpdi0+ZGlvX2NvdW50ID0gY21kLT5zdG9wX2FyZzsKKwllbHNlCisJCWRldnByaXYtPmRpb19jb3VudCA9IDE7CisKKwkvKiBjbGVhciBvdmVyL3VuZGVyIHJ1biBzdGF0dXMgZmxhZ3MgKi8KKwl3cml0ZWwoUlhfVU5ERVJSVU5fQklUIHwgUlhfT1ZFUlJVTl9CSVQsCisJICAgICAgIGRldnByaXYtPm1taW8gKyBCT0FSRF9TVEFUVVNfUkVHKTsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJd3JpdGVsKFJYX0ZVTExfSU5UUiwgZGV2cHJpdi0+bW1pbyArIElOVEVSUlVQVF9DT05UUk9MX1JFRyk7CisKKwl3cml0ZWwoUlhfRU5BQkxFX0JJVCwgZGV2cHJpdi0+bW1pbyArIEJPQVJEX0NPTlRST0xfUkVHKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzY19ocGRpX2NtZF90ZXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQoreworCWludCBlcnIgPSAwOworCWludCBpOworCisJaWYgKHMtPmlvX2JpdHMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLworCisJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7CisJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKworCWlmIChlcnIpCisJCXJldHVybiAxOworCisJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLworCisJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKworCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLworCisJaWYgKGVycikKKwkJcmV0dXJuIDI7CisKKwkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCisKKwlpZiAoIWNtZC0+Y2hhbmxpc3RfbGVuIHx8ICFjbWQtPmNoYW5saXN0KSB7CisJCWNtZC0+Y2hhbmxpc3RfbGVuID0gMzI7CisJCWVyciB8PSAtRUlOVkFMOworCX0KKwllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKKwkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCWVsc2UJLyogVFJJR19OT05FICovCisJCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCisJaWYgKGVycikKKwkJcmV0dXJuIDM7CisKKwkvKiBzdGVwIDQ6IGZpeCB1cCBhbnkgYXJndW1lbnRzICovCisKKwlpZiAoZXJyKQorCQlyZXR1cm4gNDsKKworCS8qIHN0ZXAgNTogY29tcGxhaW4gYWJvdXQgc3BlY2lhbCBjaGFubGlzdCBjb25zaWRlcmF0aW9ucyAqLworCisJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyBpKyspIHsKKwkJaWYgKENSX0NIQU4oY21kLT5jaGFubGlzdFtpXSkgIT0gaSkgeworCQkJLyogIFhYWCBjb3VsZCBzdXBwb3J0IDggb3IgMTYgY2hhbm5lbHMgKi8KKwkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCisJCQkJImNoYW5saXN0IG11c3QgYmUgY2ggMCB0byAzMSBpbiBvcmRlciIpOworCQkJZXJyIHw9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChlcnIpCisJCXJldHVybiA1OworCisJcmV0dXJuIDA7CisKK30KKworLyogc2V0dXAgZG1hIGRlc2NyaXB0b3JzIHNvIGEgbGluayBjb21wbGV0ZXMgZXZlcnkgJ2xlbicgYnl0ZXMgKi8KK3N0YXRpYyBpbnQgZ3NjX2hwZGlfc2V0dXBfZG1hX2Rlc2NyaXB0b3JzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJCSAgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCWRtYV9hZGRyX3QgcGh5c19hZGRyID0gZGV2cHJpdi0+ZG1hX2Rlc2NfcGh5c19hZGRyOworCXVpbnQzMl90IG5leHRfYml0cyA9IFBMWF9ERVNDX0lOX1BDSV9CSVQgfCBQTFhfSU5UUl9URVJNX0NPVU5UIHwKKwkJCSAgICAgUExYX1hGRVJfTE9DQUxfVE9fUENJOworCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwOworCXVuc2lnbmVkIGludCBpZHggPSAwOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKGxlbiA+IERNQV9CVUZGRVJfU0laRSkKKwkJbGVuID0gRE1BX0JVRkZFUl9TSVpFOworCWxlbiAtPSBsZW4gJSBzaXplb2YodWludDMyX3QpOworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0RNQV9ERVNDUklQVE9SUyAmJiBpZHggPCBOVU1fRE1BX0JVRkZFUlM7IGkrKykgeworCQlkZXZwcml2LT5kbWFfZGVzY1tpXS5wY2lfc3RhcnRfYWRkciA9CisJCSAgICBjcHVfdG9fbGUzMihkZXZwcml2LT5kaW9fYnVmZmVyX3BoeXNfYWRkcltpZHhdICsgb2Zmc2V0KTsKKwkJZGV2cHJpdi0+ZG1hX2Rlc2NbaV0ubG9jYWxfc3RhcnRfYWRkciA9IGNwdV90b19sZTMyKEZJRk9fUkVHKTsKKwkJZGV2cHJpdi0+ZG1hX2Rlc2NbaV0udHJhbnNmZXJfc2l6ZSA9IGNwdV90b19sZTMyKGxlbik7CisJCWRldnByaXYtPmRtYV9kZXNjW2ldLm5leHQgPSBjcHVfdG9fbGUzMigocGh5c19hZGRyICsKKwkJCShpICsgMSkgKiBzaXplb2YoZGV2cHJpdi0+ZG1hX2Rlc2NbMF0pKSB8IG5leHRfYml0cyk7CisKKwkJZGV2cHJpdi0+ZGVzY19kaW9fYnVmZmVyW2ldID0gZGV2cHJpdi0+ZGlvX2J1ZmZlcltpZHhdICsKKwkJCQkJICAgICAgKG9mZnNldCAvIHNpemVvZih1aW50MzJfdCkpOworCisJCW9mZnNldCArPSBsZW47CisJCWlmIChsZW4gKyBvZmZzZXQgPiBETUFfQlVGRkVSX1NJWkUpIHsKKwkJCW9mZnNldCA9IDA7CisJCQlpZHgrKzsKKwkJfQorCX0KKwlkZXZwcml2LT5udW1fZG1hX2Rlc2NyaXB0b3JzID0gaTsKKwkvKiBmaXggbGFzdCBkZXNjcmlwdG9yIHRvIHBvaW50IGJhY2sgdG8gZmlyc3QgKi8KKwlkZXZwcml2LT5kbWFfZGVzY1tpIC0gMV0ubmV4dCA9IGNwdV90b19sZTMyKHBoeXNfYWRkciB8IG5leHRfYml0cyk7CisKKwlkZXZwcml2LT5ibG9ja19zaXplID0gbGVuOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBnc2NfaHBkaV9kaW9faW5zbl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCWludCByZXQ7CiAKIAlzd2l0Y2ggKGRhdGFbMF0pIHsKIAljYXNlIElOU05fQ09ORklHX0JMT0NLX1NJWkU6Ci0JCXJldHVybiBkaW9fY29uZmlnX2Jsb2NrX3NpemUoZGV2LCBkYXRhKTsKKwkJcmV0ID0gZ3NjX2hwZGlfc2V0dXBfZG1hX2Rlc2NyaXB0b3JzKGRldiwgZGF0YVsxXSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWRhdGFbMV0gPSByZXQ7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IGNvbWVkaV9kaW9faW5zbl9jb25maWcoZGV2LCBzLCBpbnNuLCBkYXRhLCAweGZmZmZmZmZmKTsKIAkJaWYgKHJldCkKQEAgLTIzNywzMSArNDk5LDUzIEBACiAJcmV0dXJuIGluc24tPm47CiB9CiAKLXN0YXRpYyB2b2lkIGRpc2FibGVfcGx4X2ludGVycnVwdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgZ3NjX2hwZGlfaW5pdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBocGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdWludDMyX3QgcGx4X2ludGNzcl9iaXRzOwogCi0Jd3JpdGVsKDAsIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0lOVFJDU19SRUcpOworCS8qIHdhaXQgMTB1c2VjIGFmdGVyIHJlc2V0IGJlZm9yZSBhY2Nlc3NpbmcgZmlmb3MgKi8KKwl3cml0ZWwoQk9BUkRfUkVTRVRfQklULCBkZXZwcml2LT5tbWlvICsgQk9BUkRfQ09OVFJPTF9SRUcpOworCXVkZWxheSgxMCk7CisKKwl3cml0ZWwoQUxNT1NUX0VNUFRZX0JJVFMoMzIpIHwgQUxNT1NUX0ZVTExfQklUUygzMiksCisJICAgICAgIGRldnByaXYtPm1taW8gKyBSWF9QUk9HX0FMTU9TVF9SRUcpOworCXdyaXRlbChBTE1PU1RfRU1QVFlfQklUUygzMikgfCBBTE1PU1RfRlVMTF9CSVRTKDMyKSwKKwkgICAgICAgZGV2cHJpdi0+bW1pbyArIFRYX1BST0dfQUxNT1NUX1JFRyk7CisKKwlkZXZwcml2LT50eF9maWZvX3NpemUgPSByZWFkbChkZXZwcml2LT5tbWlvICsgVFhfRklGT19TSVpFX1JFRykgJgorCQkJCUZJRk9fU0laRV9NQVNLOworCWRldnByaXYtPnJ4X2ZpZm9fc2l6ZSA9IHJlYWRsKGRldnByaXYtPm1taW8gKyBSWF9GSUZPX1NJWkVfUkVHKSAmCisJCQkJRklGT19TSVpFX01BU0s7CisKKwl3cml0ZWwoMCwgZGV2cHJpdi0+bW1pbyArIElOVEVSUlVQVF9DT05UUk9MX1JFRyk7CisKKwkvKiAgZW5hYmxlIGludGVycnVwdHMgKi8KKwlwbHhfaW50Y3NyX2JpdHMgPQorCSAgICBJQ1NfQUVSUiB8IElDU19QRVJSIHwgSUNTX1BJRSB8IElDU19QTElFIHwgSUNTX1BBSUUgfCBJQ1NfTElFIHwKKwkgICAgSUNTX0RNQTBfRTsKKwl3cml0ZWwocGx4X2ludGNzcl9iaXRzLCBkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfSU5UUkNTX1JFRyk7CisKKwlyZXR1cm4gMDsKIH0KIAotLyogaW5pdGlhbGl6ZSBwbHg5MDgwIGNoaXAgKi8KLXN0YXRpYyB2b2lkIGluaXRfcGx4OTA4MChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgZ3NjX2hwZGlfaW5pdF9wbHg5MDgwKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1aW50MzJfdCBiaXRzOwotCXZvaWQgX19pb21lbSAqcGx4X2lvYmFzZSA9IGRldnByaXYtPnBseDkwODBfaW9iYXNlOworCXZvaWQgX19pb21lbSAqcGx4X2lvYmFzZSA9IGRldnByaXYtPnBseDkwODBfbW1pbzsKIAogI2lmZGVmIF9fQklHX0VORElBTgogCWJpdHMgPSBCSUdFTkRfRE1BMCB8IEJJR0VORF9ETUExOwogI2Vsc2UKIAliaXRzID0gMDsKICNlbmRpZgotCXdyaXRlbChiaXRzLCBkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArIFBMWF9CSUdFTkRfUkVHKTsKKwl3cml0ZWwoYml0cywgZGV2cHJpdi0+cGx4OTA4MF9tbWlvICsgUExYX0JJR0VORF9SRUcpOwogCi0JZGlzYWJsZV9wbHhfaW50ZXJydXB0cyhkZXYpOworCXdyaXRlbCgwLCBkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfSU5UUkNTX1JFRyk7CiAKLQlhYm9ydF9kbWEoZGV2LCAwKTsKLQlhYm9ydF9kbWEoZGV2LCAxKTsKKwlnc2NfaHBkaV9hYm9ydF9kbWEoZGV2LCAwKTsKKwlnc2NfaHBkaV9hYm9ydF9kbWEoZGV2LCAxKTsKIAogCS8qICBjb25maWd1cmUgZG1hMCBtb2RlICovCiAJYml0cyA9IDA7CkBAIC0yODUsMTE3ICs1NjksNyBAQAogCXdyaXRlbChiaXRzLCBwbHhfaW9iYXNlICsgUExYX0RNQTBfTU9ERV9SRUcpOwogfQogCi0vKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgc3ViZGV2aWNlIHN0cnVjdHVyZXMuCi0gKi8KLXN0YXRpYyBpbnQgc2V0dXBfc3ViZGV2aWNlcyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwotCWludCByZXQ7Ci0KLQlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDEpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKLQkvKiBhbmFsb2cgaW5wdXQgc3ViZGV2aWNlICovCi0JZGV2LT5yZWFkX3N1YmRldiA9IHM7Ci0vKglkZXYtPndyaXRlX3N1YmRldiA9IHM7ICovCi0Jcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJTzsKLQlzLT5zdWJkZXZfZmxhZ3MgPQotCSAgICBTREZfUkVBREFCTEUgfCBTREZfV1JJVEVBQkxFIHwgU0RGX0xTQU1QTCB8IFNERl9DTURfUkVBRDsKLQlzLT5uX2NoYW4gPSAzMjsKLQlzLT5sZW5fY2hhbmxpc3QgPSAzMjsKLQlzLT5tYXhkYXRhID0gMTsKLQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOwotCXMtPmluc25fY29uZmlnID0gZGlvX2NvbmZpZ19pbnNuOwotCXMtPmRvX2NtZCA9IGhwZGlfY21kOwotCXMtPmRvX2NtZHRlc3QgPSBocGRpX2NtZF90ZXN0OwotCXMtPmNhbmNlbCA9IGhwZGlfY2FuY2VsOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW5pdF9ocGRpKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1aW50MzJfdCBwbHhfaW50Y3NyX2JpdHM7Ci0KLQl3cml0ZWwoQk9BUkRfUkVTRVRfQklULCBkZXZwcml2LT5ocGRpX2lvYmFzZSArIEJPQVJEX0NPTlRST0xfUkVHKTsKLQl1ZGVsYXkoMTApOwotCi0Jd3JpdGVsKGFsbW9zdF9lbXB0eV9iaXRzKDMyKSB8IGFsbW9zdF9mdWxsX2JpdHMoMzIpLAotCSAgICAgICBkZXZwcml2LT5ocGRpX2lvYmFzZSArIFJYX1BST0dfQUxNT1NUX1JFRyk7Ci0Jd3JpdGVsKGFsbW9zdF9lbXB0eV9iaXRzKDMyKSB8IGFsbW9zdF9mdWxsX2JpdHMoMzIpLAotCSAgICAgICBkZXZwcml2LT5ocGRpX2lvYmFzZSArIFRYX1BST0dfQUxNT1NUX1JFRyk7Ci0KLQlkZXZwcml2LT50eF9maWZvX3NpemUgPSBmaWZvX3NpemUocmVhZGwoZGV2cHJpdi0+aHBkaV9pb2Jhc2UgKwotCQkJCQkJICBUWF9GSUZPX1NJWkVfUkVHKSk7Ci0JZGV2cHJpdi0+cnhfZmlmb19zaXplID0gZmlmb19zaXplKHJlYWRsKGRldnByaXYtPmhwZGlfaW9iYXNlICsKLQkJCQkJCSAgUlhfRklGT19TSVpFX1JFRykpOwotCi0Jd3JpdGVsKDAsIGRldnByaXYtPmhwZGlfaW9iYXNlICsgSU5URVJSVVBUX0NPTlRST0xfUkVHKTsKLQotCS8qICBlbmFibGUgaW50ZXJydXB0cyAqLwotCXBseF9pbnRjc3JfYml0cyA9Ci0JICAgIElDU19BRVJSIHwgSUNTX1BFUlIgfCBJQ1NfUElFIHwgSUNTX1BMSUUgfCBJQ1NfUEFJRSB8IElDU19MSUUgfAotCSAgICBJQ1NfRE1BMF9FOwotCXdyaXRlbChwbHhfaW50Y3NyX2JpdHMsIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0lOVFJDU19SRUcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIHNldHVwIGRtYSBkZXNjcmlwdG9ycyBzbyBhIGxpbmsgY29tcGxldGVzIGV2ZXJ5ICd0cmFuc2Zlcl9zaXplJyBieXRlcyAqLwotc3RhdGljIGludCBzZXR1cF9kbWFfZGVzY3JpcHRvcnMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgdW5zaWduZWQgaW50IHRyYW5zZmVyX3NpemUpCi17Ci0Jc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgYnVmZmVyX2luZGV4LCBidWZmZXJfb2Zmc2V0OwotCXVpbnQzMl90IG5leHRfYml0cyA9IFBMWF9ERVNDX0lOX1BDSV9CSVQgfCBQTFhfSU5UUl9URVJNX0NPVU5UIHwKLQkgICAgUExYX1hGRVJfTE9DQUxfVE9fUENJOwotCXVuc2lnbmVkIGludCBpOwotCi0JaWYgKHRyYW5zZmVyX3NpemUgPiBETUFfQlVGRkVSX1NJWkUpCi0JCXRyYW5zZmVyX3NpemUgPSBETUFfQlVGRkVSX1NJWkU7Ci0JdHJhbnNmZXJfc2l6ZSAtPSB0cmFuc2Zlcl9zaXplICUgc2l6ZW9mKHVpbnQzMl90KTsKLQlpZiAodHJhbnNmZXJfc2l6ZSA9PSAwKQotCQlyZXR1cm4gLTE7Ci0KLQlidWZmZXJfb2Zmc2V0ID0gMDsKLQlidWZmZXJfaW5kZXggPSAwOwotCWZvciAoaSA9IDA7IGkgPCBOVU1fRE1BX0RFU0NSSVBUT1JTICYmCi0JICAgICBidWZmZXJfaW5kZXggPCBOVU1fRE1BX0JVRkZFUlM7IGkrKykgewotCQlkZXZwcml2LT5kbWFfZGVzY1tpXS5wY2lfc3RhcnRfYWRkciA9Ci0JCSAgICBjcHVfdG9fbGUzMihkZXZwcml2LT5kaW9fYnVmZmVyX3BoeXNfYWRkcltidWZmZXJfaW5kZXhdICsKLQkJCQlidWZmZXJfb2Zmc2V0KTsKLQkJZGV2cHJpdi0+ZG1hX2Rlc2NbaV0ubG9jYWxfc3RhcnRfYWRkciA9IGNwdV90b19sZTMyKEZJRk9fUkVHKTsKLQkJZGV2cHJpdi0+ZG1hX2Rlc2NbaV0udHJhbnNmZXJfc2l6ZSA9Ci0JCSAgICBjcHVfdG9fbGUzMih0cmFuc2Zlcl9zaXplKTsKLQkJZGV2cHJpdi0+ZG1hX2Rlc2NbaV0ubmV4dCA9Ci0JCSAgICBjcHVfdG9fbGUzMigoZGV2cHJpdi0+ZG1hX2Rlc2NfcGh5c19hZGRyICsgKGkgKwotCQkJCQkJCQkgIDEpICoKLQkJCQkgc2l6ZW9mKGRldnByaXYtPmRtYV9kZXNjWzBdKSkgfCBuZXh0X2JpdHMpOwotCi0JCWRldnByaXYtPmRlc2NfZGlvX2J1ZmZlcltpXSA9Ci0JCSAgICBkZXZwcml2LT5kaW9fYnVmZmVyW2J1ZmZlcl9pbmRleF0gKwotCQkgICAgKGJ1ZmZlcl9vZmZzZXQgLyBzaXplb2YodWludDMyX3QpKTsKLQotCQlidWZmZXJfb2Zmc2V0ICs9IHRyYW5zZmVyX3NpemU7Ci0JCWlmICh0cmFuc2Zlcl9zaXplICsgYnVmZmVyX29mZnNldCA+IERNQV9CVUZGRVJfU0laRSkgewotCQkJYnVmZmVyX29mZnNldCA9IDA7Ci0JCQlidWZmZXJfaW5kZXgrKzsKLQkJfQotCX0KLQlkZXZwcml2LT5udW1fZG1hX2Rlc2NyaXB0b3JzID0gaTsKLQkvKiAgZml4IGxhc3QgZGVzY3JpcHRvciB0byBwb2ludCBiYWNrIHRvIGZpcnN0ICovCi0JZGV2cHJpdi0+ZG1hX2Rlc2NbaSAtIDFdLm5leHQgPQotCSAgICBjcHVfdG9fbGUzMihkZXZwcml2LT5kbWFfZGVzY19waHlzX2FkZHIgfCBuZXh0X2JpdHMpOwotCi0JZGV2cHJpdi0+YmxvY2tfc2l6ZSA9IHRyYW5zZmVyX3NpemU7Ci0KLQlyZXR1cm4gdHJhbnNmZXJfc2l6ZTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBocGRpX2JvYXJkICpocGRpX2ZpbmRfYm9hcmQoc3RydWN0IHBjaV9kZXYgKnBjaWRldikKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHBkaV9ib2FyZCAqZ3NjX2hwZGlfZmluZF9ib2FyZChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQogewogCXVuc2lnbmVkIGludCBpOwogCkBAIC00MDYsMTYgKzU4MCwxNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IGhwZGlfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQorc3RhdGljIGludCBnc2NfaHBkaV9hdXRvX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCXVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNvbWVkaV90b19wY2lfZGV2KGRldik7CiAJY29uc3Qgc3RydWN0IGhwZGlfYm9hcmQgKnRoaXNib2FyZDsKIAlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2OworCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwogCWludCBpOwogCWludCByZXR2YWw7CiAKLQl0aGlzYm9hcmQgPSBocGRpX2ZpbmRfYm9hcmQocGNpZGV2KTsKKwl0aGlzYm9hcmQgPSBnc2NfaHBkaV9maW5kX2JvYXJkKHBjaWRldik7CiAJaWYgKCF0aGlzYm9hcmQpIHsKIAkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgImdzY19ocGRpOiBwY2kgJXMgbm90IHN1cHBvcnRlZFxuIiwKIAkJCXBjaV9uYW1lKHBjaWRldikpOwpAQCAtNDMzLDE3ICs2MDgsMTcgQEAKIAkJcmV0dXJuIHJldHZhbDsKIAlwY2lfc2V0X21hc3RlcihwY2lkZXYpOwogCi0JZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgPSBwY2lfaW9yZW1hcF9iYXIocGNpZGV2LCAwKTsKLQlkZXZwcml2LT5ocGRpX2lvYmFzZSA9IHBjaV9pb3JlbWFwX2JhcihwY2lkZXYsIDIpOwotCWlmICghZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgfHwgIWRldnByaXYtPmhwZGlfaW9iYXNlKSB7CisJZGV2cHJpdi0+cGx4OTA4MF9tbWlvID0gcGNpX2lvcmVtYXBfYmFyKHBjaWRldiwgMCk7CisJZGV2cHJpdi0+bW1pbyA9IHBjaV9pb3JlbWFwX2JhcihwY2lkZXYsIDIpOworCWlmICghZGV2cHJpdi0+cGx4OTA4MF9tbWlvIHx8ICFkZXZwcml2LT5tbWlvKSB7CiAJCWRldl93YXJuKGRldi0+Y2xhc3NfZGV2LCAiZmFpbGVkIHRvIHJlbWFwIGlvIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWluaXRfcGx4OTA4MChkZXYpOworCWdzY19ocGRpX2luaXRfcGx4OTA4MChkZXYpOwogCiAJLyogIGdldCBpcnEgKi8KLQlpZiAocmVxdWVzdF9pcnEocGNpZGV2LT5pcnEsIGhhbmRsZV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAorCWlmIChyZXF1ZXN0X2lycShwY2lkZXYtPmlycSwgZ3NjX2hwZGlfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCWRldi0+Ym9hcmRfbmFtZSwgZGV2KSkgewogCQlkZXZfd2FybihkZXYtPmNsYXNzX2RldiwKIAkJCSAidW5hYmxlIHRvIGFsbG9jYXRlIGlycSAldVxuIiwgcGNpZGV2LT5pcnEpOwpAQCAtNDcwLDE4ICs2NDUsMzMgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JcmV0dmFsID0gc2V0dXBfZG1hX2Rlc2NyaXB0b3JzKGRldiwgMHgxMDAwKTsKKwlyZXR2YWwgPSBnc2NfaHBkaV9zZXR1cF9kbWFfZGVzY3JpcHRvcnMoZGV2LCAweDEwMDApOwogCWlmIChyZXR2YWwgPCAwKQogCQlyZXR1cm4gcmV0dmFsOwogCi0JcmV0dmFsID0gc2V0dXBfc3ViZGV2aWNlcyhkZXYpOwotCWlmIChyZXR2YWwgPCAwKQorCXJldHZhbCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgMSk7CisJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCXJldHVybiBpbml0X2hwZGkoZGV2KTsKKwkvKiBEaWdpdGFsIEkvTyBzdWJkZXZpY2UgKi8KKwlzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKKwlkZXYtPnJlYWRfc3ViZGV2ID0gczsKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0RJTzsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfUkVBREFCTEUgfCBTREZfV1JJVEVBQkxFIHwgU0RGX0xTQU1QTCB8CisJCQkgIFNERl9DTURfUkVBRDsKKwlzLT5uX2NoYW4JPSAzMjsKKwlzLT5sZW5fY2hhbmxpc3QJPSAzMjsKKwlzLT5tYXhkYXRhCT0gMTsKKwlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fY29uZmlnCT0gZ3NjX2hwZGlfZGlvX2luc25fY29uZmlnOworCXMtPmRvX2NtZAk9IGdzY19ocGRpX2NtZDsKKwlzLT5kb19jbWR0ZXN0CT0gZ3NjX2hwZGlfY21kX3Rlc3Q7CisJcy0+Y2FuY2VsCT0gZ3NjX2hwZGlfY2FuY2VsOworCisJcmV0dXJuIGdzY19ocGRpX2luaXQoZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgaHBkaV9kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGdzY19ocGRpX2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjb21lZGlfdG9fcGNpX2RldihkZXYpOwogCXN0cnVjdCBocGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CkBAIC00OTAsMTIgKzY4MCwxMiBAQAogCWlmIChkZXYtPmlycSkKIAkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiAJaWYgKGRldnByaXYpIHsKLQkJaWYgKGRldnByaXYtPnBseDkwODBfaW9iYXNlKSB7Ci0JCQlkaXNhYmxlX3BseF9pbnRlcnJ1cHRzKGRldik7Ci0JCQlpb3VubWFwKGRldnByaXYtPnBseDkwODBfaW9iYXNlKTsKKwkJaWYgKGRldnByaXYtPnBseDkwODBfbW1pbykgeworCQkJd3JpdGVsKDAsIGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9JTlRSQ1NfUkVHKTsKKwkJCWlvdW5tYXAoZGV2cHJpdi0+cGx4OTA4MF9tbWlvKTsKIAkJfQotCQlpZiAoZGV2cHJpdi0+aHBkaV9pb2Jhc2UpCi0JCQlpb3VubWFwKGRldnByaXYtPmhwZGlfaW9iYXNlKTsKKwkJaWYgKGRldnByaXYtPm1taW8pCisJCQlpb3VubWFwKGRldnByaXYtPm1taW8pOwogCQkvKiAgZnJlZSBwY2kgZG1hIGJ1ZmZlcnMgKi8KIAkJZm9yIChpID0gMDsgaSA8IE5VTV9ETUFfQlVGRkVSUzsgaSsrKSB7CiAJCQlpZiAoZGV2cHJpdi0+ZGlvX2J1ZmZlcltpXSkKQEAgLTUxNiwzMTggKzcwNiwxMSBAQAogCWNvbWVkaV9wY2lfZGlzYWJsZShkZXYpOwogfQogCi1zdGF0aWMgaW50IGRpb19jb25maWdfYmxvY2tfc2l6ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0JdW5zaWduZWQgaW50IHJlcXVlc3RlZF9ibG9ja19zaXplOwotCWludCByZXR2YWw7Ci0KLQlyZXF1ZXN0ZWRfYmxvY2tfc2l6ZSA9IGRhdGFbMV07Ci0KLQlyZXR2YWwgPSBzZXR1cF9kbWFfZGVzY3JpcHRvcnMoZGV2LCByZXF1ZXN0ZWRfYmxvY2tfc2l6ZSk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCXJldHVybiByZXR2YWw7Ci0KLQlkYXRhWzFdID0gcmV0dmFsOwotCi0JcmV0dXJuIDI7Ci19Ci0KLXN0YXRpYyBpbnQgZGlfY21kX3Rlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCSAgICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQotewotCWludCBlcnIgPSAwOwotCWludCBpOwotCi0JLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwotCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKLQotCWlmIChlcnIpCi0JCXJldHVybiAxOwotCi0JLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwotCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKLQotCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwotCi0JaWYgKGVycikKLQkJcmV0dXJuIDI7Ci0KLQkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCi0KLQlpZiAoIWNtZC0+Y2hhbmxpc3RfbGVuKSB7Ci0JCWNtZC0+Y2hhbmxpc3RfbGVuID0gMzI7Ci0JCWVyciB8PSAtRUlOVkFMOwotCX0KLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOwotCi0Jc3dpdGNoIChjbWQtPnN0b3Bfc3JjKSB7Ci0JY2FzZSBUUklHX0NPVU5UOgotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7Ci0JCWJyZWFrOwotCWNhc2UgVFJJR19OT05FOgotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKGVycikKLQkJcmV0dXJuIDM7Ci0KLQkvKiBzdGVwIDQ6IGZpeCB1cCBhbnkgYXJndW1lbnRzICovCi0KLQlpZiAoZXJyKQotCQlyZXR1cm4gNDsKLQotCWlmICghY21kLT5jaGFubGlzdCkKLQkJcmV0dXJuIDA7Ci0KLQlmb3IgKGkgPSAxOyBpIDwgY21kLT5jaGFubGlzdF9sZW47IGkrKykgewotCQlpZiAoQ1JfQ0hBTihjbWQtPmNoYW5saXN0W2ldKSAhPSBpKSB7Ci0JCQkvKiAgWFhYIGNvdWxkIHN1cHBvcnQgOCBvciAxNiBjaGFubmVscyAqLwotCQkJY29tZWRpX2Vycm9yKGRldiwKLQkJCQkgICAgICJjaGFubGlzdCBtdXN0IGJlIGNoIDAgdG8gMzEgaW4gb3JkZXIiKTsKLQkJCWVycisrOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoZXJyKQotCQlyZXR1cm4gNTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhwZGlfY21kX3Rlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKLXsKLQlpZiAocy0+aW9fYml0cykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZWxzZQotCQlyZXR1cm4gZGlfY21kX3Rlc3QoZGV2LCBzLCBjbWQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaHBkaV93cml0ZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdWludDMyX3QgYml0cywKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQotewotCXN0cnVjdCBocGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0KLQl3cml0ZWwoYml0cyB8IGRldnByaXYtPmJpdHNbb2Zmc2V0IC8gc2l6ZW9mKHVpbnQzMl90KV0sCi0JICAgICAgIGRldnByaXYtPmhwZGlfaW9iYXNlICsgb2Zmc2V0KTsKLX0KLQotc3RhdGljIGludCBkaV9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCi17Ci0Jc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1aW50MzJfdCBiaXRzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMgPSBzLT5hc3luYzsKLQlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJmFzeW5jLT5jbWQ7Ci0KLQlocGRpX3dyaXRlbChkZXYsIFJYX0ZJRk9fUkVTRVRfQklULCBCT0FSRF9DT05UUk9MX1JFRyk7Ci0KLQlhYm9ydF9kbWEoZGV2LCAwKTsKLQotCWRldnByaXYtPmRtYV9kZXNjX2luZGV4ID0gMDsKLQotCS8qIFRoZXNlIHJlZ2lzdGVyIGFyZSBzdXBwb3NlZGx5IHVudXNlZCBkdXJpbmcgY2hhaW5lZCBkbWEsCi0JICogYnV0IEkgaGF2ZSBmb3VuZCB0aGF0IGxlZnQgb3ZlciB2YWx1ZXMgZnJvbSBsYXN0IG9wZXJhdGlvbgotCSAqIG9jY2FzaW9uYWxseSBjYXVzZSBwcm9ibGVtcyB3aXRoIHRyYW5zZmVyIG9mIGZpcnN0IGRtYQotCSAqIGJsb2NrLiAgSW5pdGlhbGl6aW5nIHRoZW0gdG8gemVybyBzZWVtcyB0byBmaXggdGhlIHByb2JsZW0uICovCi0Jd3JpdGVsKDAsIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0RNQTBfVFJBTlNGRVJfU0laRV9SRUcpOwotCXdyaXRlbCgwLCBkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArIFBMWF9ETUEwX1BDSV9BRERSRVNTX1JFRyk7Ci0Jd3JpdGVsKDAsIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0RNQTBfTE9DQUxfQUREUkVTU19SRUcpOwotCS8qICBnaXZlIGxvY2F0aW9uIG9mIGZpcnN0IGRtYSBkZXNjcmlwdG9yICovCi0JYml0cyA9Ci0JICAgIGRldnByaXYtPmRtYV9kZXNjX3BoeXNfYWRkciB8IFBMWF9ERVNDX0lOX1BDSV9CSVQgfAotCSAgICBQTFhfSU5UUl9URVJNX0NPVU5UIHwgUExYX1hGRVJfTE9DQUxfVE9fUENJOwotCXdyaXRlbChiaXRzLCBkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArIFBMWF9ETUEwX0RFU0NSSVBUT1JfUkVHKTsKLQotCS8qICBzcGlubG9jayBmb3IgcGx4IGRtYSBjb250cm9sL3N0YXR1cyByZWcgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwotCS8qICBlbmFibGUgZG1hIHRyYW5zZmVyICovCi0Jd3JpdGViKFBMWF9ETUFfRU5fQklUIHwgUExYX0RNQV9TVEFSVF9CSVQgfCBQTFhfQ0xFQVJfRE1BX0lOVFJfQklULAotCSAgICAgICBkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArIFBMWF9ETUEwX0NTX1JFRyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwotCi0JaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZGV2cHJpdi0+ZGlvX2NvdW50ID0gY21kLT5zdG9wX2FyZzsKLQllbHNlCi0JCWRldnByaXYtPmRpb19jb3VudCA9IDE7Ci0KLQkvKiAgY2xlYXIgb3Zlci91bmRlciBydW4gc3RhdHVzIGZsYWdzICovCi0Jd3JpdGVsKFJYX1VOREVSUlVOX0JJVCB8IFJYX09WRVJSVU5fQklULAotCSAgICAgICBkZXZwcml2LT5ocGRpX2lvYmFzZSArIEJPQVJEX1NUQVRVU19SRUcpOwotCS8qICBlbmFibGUgaW50ZXJydXB0cyAqLwotCXdyaXRlbChpbnRyX2JpdChSWF9GVUxMX0lOVFIpLAotCSAgICAgICBkZXZwcml2LT5ocGRpX2lvYmFzZSArIElOVEVSUlVQVF9DT05UUk9MX1JFRyk7Ci0KLQlocGRpX3dyaXRlbChkZXYsIFJYX0VOQUJMRV9CSVQsIEJPQVJEX0NPTlRST0xfUkVHKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhwZGlfY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQotewotCWlmIChzLT5pb19iaXRzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQllbHNlCi0JCXJldHVybiBkaV9jbWQoZGV2LCBzKTsKLX0KLQotc3RhdGljIHZvaWQgZHJhaW5fZG1hX2J1ZmZlcnMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0Jc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYyA9IGRldi0+cmVhZF9zdWJkZXYtPmFzeW5jOwotCXVpbnQzMl90IG5leHRfdHJhbnNmZXJfYWRkcjsKLQlpbnQgajsKLQlpbnQgbnVtX3NhbXBsZXMgPSAwOwotCXZvaWQgX19pb21lbSAqcGNpX2FkZHJfcmVnOwotCi0JaWYgKGNoYW5uZWwpCi0JCXBjaV9hZGRyX3JlZyA9Ci0JCSAgICBkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArIFBMWF9ETUExX1BDSV9BRERSRVNTX1JFRzsKLQllbHNlCi0JCXBjaV9hZGRyX3JlZyA9Ci0JCSAgICBkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArIFBMWF9ETUEwX1BDSV9BRERSRVNTX1JFRzsKLQotCS8qICBsb29wIHVudGlsIHdlIGhhdmUgcmVhZCBhbGwgdGhlIGZ1bGwgYnVmZmVycyAqLwotCWogPSAwOwotCWZvciAobmV4dF90cmFuc2Zlcl9hZGRyID0gcmVhZGwocGNpX2FkZHJfcmVnKTsKLQkgICAgIChuZXh0X3RyYW5zZmVyX2FkZHIgPAotCSAgICAgIGxlMzJfdG9fY3B1KGRldnByaXYtPmRtYV9kZXNjW2RldnByaXYtPmRtYV9kZXNjX2luZGV4XS4KLQkJCSAgcGNpX3N0YXJ0X2FkZHIpCi0JICAgICAgfHwgbmV4dF90cmFuc2Zlcl9hZGRyID49Ci0JICAgICAgbGUzMl90b19jcHUoZGV2cHJpdi0+ZG1hX2Rlc2NbZGV2cHJpdi0+ZG1hX2Rlc2NfaW5kZXhdLgotCQkJICBwY2lfc3RhcnRfYWRkcikgKyBkZXZwcml2LT5ibG9ja19zaXplKQotCSAgICAgJiYgaiA8IGRldnByaXYtPm51bV9kbWFfZGVzY3JpcHRvcnM7IGorKykgewotCQkvKiAgdHJhbnNmZXIgZGF0YSBmcm9tIGRtYSBidWZmZXIgdG8gY29tZWRpIGJ1ZmZlciAqLwotCQludW1fc2FtcGxlcyA9IGRldnByaXYtPmJsb2NrX3NpemUgLyBzaXplb2YodWludDMyX3QpOwotCQlpZiAoYXN5bmMtPmNtZC5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7Ci0JCQlpZiAobnVtX3NhbXBsZXMgPiBkZXZwcml2LT5kaW9fY291bnQpCi0JCQkJbnVtX3NhbXBsZXMgPSBkZXZwcml2LT5kaW9fY291bnQ7Ci0JCQlkZXZwcml2LT5kaW9fY291bnQgLT0gbnVtX3NhbXBsZXM7Ci0JCX0KLQkJY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihkZXYtPnJlYWRfc3ViZGV2LAotCQkJCQkgIGRldnByaXYtPmRlc2NfZGlvX2J1ZmZlcltkZXZwcml2LT4KLQkJCQkJCQkJICAgICBkbWFfZGVzY19pbmRleF0sCi0JCQkJCSAgbnVtX3NhbXBsZXMgKiBzaXplb2YodWludDMyX3QpKTsKLQkJZGV2cHJpdi0+ZG1hX2Rlc2NfaW5kZXgrKzsKLQkJZGV2cHJpdi0+ZG1hX2Rlc2NfaW5kZXggJT0gZGV2cHJpdi0+bnVtX2RtYV9kZXNjcmlwdG9yczsKLQl9Ci0JLyogIFhYWCBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW4gc29tZWhvdyAqLwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgaGFuZGxlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQotewotCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkOwotCXN0cnVjdCBocGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0Jc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnJlYWRfc3ViZGV2OwotCXN0cnVjdCBjb21lZGlfYXN5bmMgKmFzeW5jID0gcy0+YXN5bmM7Ci0JdWludDMyX3QgaHBkaV9pbnRyX3N0YXR1cywgaHBkaV9ib2FyZF9zdGF0dXM7Ci0JdWludDMyX3QgcGx4X3N0YXR1czsKLQl1aW50MzJfdCBwbHhfYml0czsKLQl1aW50OF90IGRtYTBfc3RhdHVzLCBkbWExX3N0YXR1czsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFkZXYtPmF0dGFjaGVkKQotCQlyZXR1cm4gSVJRX05PTkU7Ci0KLQlwbHhfc3RhdHVzID0gcmVhZGwoZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfSU5UUkNTX1JFRyk7Ci0JaWYgKChwbHhfc3RhdHVzICYgKElDU19ETUEwX0EgfCBJQ1NfRE1BMV9BIHwgSUNTX0xJQSkpID09IDApCi0JCXJldHVybiBJUlFfTk9ORTsKLQotCWhwZGlfaW50cl9zdGF0dXMgPSByZWFkbChkZXZwcml2LT5ocGRpX2lvYmFzZSArIElOVEVSUlVQVF9TVEFUVVNfUkVHKTsKLQlocGRpX2JvYXJkX3N0YXR1cyA9IHJlYWRsKGRldnByaXYtPmhwZGlfaW9iYXNlICsgQk9BUkRfU1RBVFVTX1JFRyk7Ci0KLQlhc3luYy0+ZXZlbnRzID0gMDsKLQotCWlmIChocGRpX2ludHJfc3RhdHVzKSB7Ci0JCXdyaXRlbChocGRpX2ludHJfc3RhdHVzLAotCQkgICAgICAgZGV2cHJpdi0+aHBkaV9pb2Jhc2UgKyBJTlRFUlJVUFRfU1RBVFVTX1JFRyk7Ci0JfQotCS8qICBzcGluIGxvY2sgbWFrZXMgc3VyZSBubyBvbmUgZWxzZSBjaGFuZ2VzIHBseCBkbWEgY29udHJvbCByZWcgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwotCWRtYTBfc3RhdHVzID0gcmVhZGIoZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfRE1BMF9DU19SRUcpOwotCWlmIChwbHhfc3RhdHVzICYgSUNTX0RNQTBfQSkgewkvKiAgZG1hIGNoYW4gMCBpbnRlcnJ1cHQgKi8KLQkJd3JpdGViKChkbWEwX3N0YXR1cyAmIFBMWF9ETUFfRU5fQklUKSB8IFBMWF9DTEVBUl9ETUFfSU5UUl9CSVQsCi0JCSAgICAgICBkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArIFBMWF9ETUEwX0NTX1JFRyk7Ci0KLQkJaWYgKGRtYTBfc3RhdHVzICYgUExYX0RNQV9FTl9CSVQpCi0JCQlkcmFpbl9kbWFfYnVmZmVycyhkZXYsIDApOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7Ci0KLQkvKiAgc3BpbiBsb2NrIG1ha2VzIHN1cmUgbm8gb25lIGVsc2UgY2hhbmdlcyBwbHggZG1hIGNvbnRyb2wgcmVnICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKLQlkbWExX3N0YXR1cyA9IHJlYWRiKGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0RNQTFfQ1NfUkVHKTsKLQlpZiAocGx4X3N0YXR1cyAmIElDU19ETUExX0EpIHsJLyogIFhYWCAqLy8qICBkbWEgY2hhbiAxIGludGVycnVwdCAqLwotCQl3cml0ZWIoKGRtYTFfc3RhdHVzICYgUExYX0RNQV9FTl9CSVQpIHwgUExYX0NMRUFSX0RNQV9JTlRSX0JJVCwKLQkJICAgICAgIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0RNQTFfQ1NfUkVHKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwotCi0JLyogIGNsZWFyIHBvc3NpYmxlIHBseDkwODAgaW50ZXJydXB0IHNvdXJjZXMgKi8KLQlpZiAocGx4X3N0YXR1cyAmIElDU19MRElBKSB7CS8qICBjbGVhciBsb2NhbCBkb29yYmVsbCBpbnRlcnJ1cHQgKi8KLQkJcGx4X2JpdHMgPSByZWFkbChkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArIFBMWF9EQlJfT1VUX1JFRyk7Ci0JCXdyaXRlbChwbHhfYml0cywgZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfREJSX09VVF9SRUcpOwotCX0KLQotCWlmIChocGRpX2JvYXJkX3N0YXR1cyAmIFJYX09WRVJSVU5fQklUKSB7Ci0JCWNvbWVkaV9lcnJvcihkZXYsICJyeCBmaWZvIG92ZXJydW4iKTsKLQkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOwotCX0KLQotCWlmIChocGRpX2JvYXJkX3N0YXR1cyAmIFJYX1VOREVSUlVOX0JJVCkgewotCQljb21lZGlfZXJyb3IoZGV2LCAicnggZmlmbyB1bmRlcnJ1biIpOwotCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JfQotCi0JaWYgKGRldnByaXYtPmRpb19jb3VudCA9PSAwKQotCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0KLQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgdm9pZCBhYm9ydF9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0Jc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogIHNwaW5sb2NrIGZvciBwbHggZG1hIGNvbnRyb2wvc3RhdHVzIHJlZyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7Ci0KLQlwbHg5MDgwX2Fib3J0X2RtYShkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSwgY2hhbm5lbCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgaHBkaV9jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCi17Ci0Jc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQotCWhwZGlfd3JpdGVsKGRldiwgMCwgQk9BUkRfQ09OVFJPTF9SRUcpOwotCi0Jd3JpdGVsKDAsIGRldnByaXYtPmhwZGlfaW9iYXNlICsgSU5URVJSVVBUX0NPTlRST0xfUkVHKTsKLQotCWFib3J0X2RtYShkZXYsIDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgY29tZWRpX2RyaXZlciBnc2NfaHBkaV9kcml2ZXIgPSB7CiAJLmRyaXZlcl9uYW1lCT0gImdzY19ocGRpIiwKIAkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAotCS5hdXRvX2F0dGFjaAk9IGhwZGlfYXV0b19hdHRhY2gsCi0JLmRldGFjaAkJPSBocGRpX2RldGFjaCwKKwkuYXV0b19hdHRhY2gJPSBnc2NfaHBkaV9hdXRvX2F0dGFjaCwKKwkuZGV0YWNoCQk9IGdzY19ocGRpX2RldGFjaCwKIH07CiAKIHN0YXRpYyBpbnQgZ3NjX2hwZGlfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMKaW5kZXggODA1MzliMi4uMGI4YjIxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuYwpAQCAtMTcxLDEyICsxNzEsMjcgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgaWNwX211bHRpX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJc3RydWN0IGljcF9tdWx0aV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSByZWFkdyhkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FEQ19DU1IpOworCWlmICgoc3RhdHVzICYgQURDX0JTWSkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBpY3BfbXVsdGlfaW5zbl9yZWFkX2FpKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBpY3BfbXVsdGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgbiwgdGltZW91dDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbjsKIAogCS8qICBEaXNhYmxlIEEvRCBjb252ZXJzaW9uIHJlYWR5IGludGVycnVwdCAqLwogCWRldnByaXYtPkludEVuYWJsZSAmPSB+QURDX1JFQURZOwpAQCAtMTk5LDMzICsyMTQsMTAgQEAKIAkJdWRlbGF5KDEpOwogCiAJCS8qICBXYWl0IGZvciBjb252ZXJzaW9uIHRvIGNvbXBsZXRlLCBvciBnZXQgZmVkIHVwIHdhaXRpbmcgKi8KLQkJdGltZW91dCA9IDEwMDsKLQkJd2hpbGUgKHRpbWVvdXQtLSkgewotCQkJaWYgKCEocmVhZHcoZGV2cHJpdi0+aW9fYWRkciArCi0JCQkJICAgIElDUF9NVUxUSV9BRENfQ1NSKSAmIEFEQ19CU1kpKQotCQkJCWdvdG8gY29udl9maW5pc2g7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgaWNwX211bHRpX2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKIAotCQkJdWRlbGF5KDEpOwotCQl9Ci0KLQkJLyogIElmIHdlIHJlYWNoIGhlcmUsIGEgdGltZW91dCBoYXMgb2NjdXJyZWQgKi8KLQkJY29tZWRpX2Vycm9yKGRldiwgIkEvRCBpbnNuIHRpbWVvdXQiKTsKLQotCQkvKiAgRGlzYWJsZSBpbnRlcnJ1cHQgKi8KLQkJZGV2cHJpdi0+SW50RW5hYmxlICY9IH5BRENfUkVBRFk7Ci0JCXdyaXRldyhkZXZwcml2LT5JbnRFbmFibGUsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX0VOKTsKLQotCQkvKiAgQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLwotCQlkZXZwcml2LT5JbnRTdGF0dXMgfD0gQURDX1JFQURZOwotCQl3cml0ZXcoZGV2cHJpdi0+SW50U3RhdHVzLAotCQkgICAgICAgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCk7Ci0KLQkJLyogIENsZWFyIGRhdGEgcmVjZWl2ZWQgKi8KLQkJZGF0YVtuXSA9IDA7Ci0KLQkJcmV0dXJuIC1FVElNRTsKLQotY29udl9maW5pc2g6CiAJCWRhdGFbbl0gPQogCQkgICAgKHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfQUkpID4+IDQpICYgMHgwZmZmOwogCX0KQEAgLTIzOCw3ICsyMzAsMjEgQEAKIAlkZXZwcml2LT5JbnRTdGF0dXMgfD0gQURDX1JFQURZOwogCXdyaXRldyhkZXZwcml2LT5JbnRTdGF0dXMsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX1NUQVQpOwogCi0JcmV0dXJuIG47CisJcmV0dXJuIHJldCA/IHJldCA6IG47Cit9CisKK3N0YXRpYyBpbnQgaWNwX211bHRpX2FvX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJc3RydWN0IGljcF9tdWx0aV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSByZWFkdyhkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0RBQ19DU1IpOworCWlmICgoc3RhdHVzICYgREFDX0JTWSkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKIH0KIAogc3RhdGljIGludCBpY3BfbXVsdGlfaW5zbl93cml0ZV9hbyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtMjQ2LDcgKzI1Miw4IEBACiAJCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGljcF9tdWx0aV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBuLCBjaGFuLCByYW5nZSwgdGltZW91dDsKKwlpbnQgbiwgY2hhbiwgcmFuZ2U7CisJaW50IHJldDsKIAogCS8qICBEaXNhYmxlIEQvQSBjb252ZXJzaW9uIHJlYWR5IGludGVycnVwdCAqLwogCWRldnByaXYtPkludEVuYWJsZSAmPSB+REFDX1JFQURZOwpAQCAtMjc0LDMzICsyODEsMjQgQEAKIAlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CiAJCS8qICBXYWl0IGZvciBhbmFsb2d1ZSBvdXRwdXQgZGF0YSByZWdpc3RlciB0byBiZQogCQkgKiAgcmVhZHkgZm9yIG5ldyBkYXRhLCBvciBnZXQgZmVkIHVwIHdhaXRpbmcgKi8KLQkJdGltZW91dCA9IDEwMDsKLQkJd2hpbGUgKHRpbWVvdXQtLSkgewotCQkJaWYgKCEocmVhZHcoZGV2cHJpdi0+aW9fYWRkciArCi0JCQkJICAgIElDUF9NVUxUSV9EQUNfQ1NSKSAmIERBQ19CU1kpKQotCQkJCWdvdG8gZGFjX3JlYWR5OworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGljcF9tdWx0aV9hb19lb2MsIDApOworCQlpZiAocmV0KSB7CisJCQkvKiAgRGlzYWJsZSBpbnRlcnJ1cHQgKi8KKwkJCWRldnByaXYtPkludEVuYWJsZSAmPSB+REFDX1JFQURZOworCQkJd3JpdGV3KGRldnByaXYtPkludEVuYWJsZSwKKwkJCSAgICAgICBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9FTik7CiAKLQkJCXVkZWxheSgxKTsKKwkJCS8qICBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCisJCQlkZXZwcml2LT5JbnRTdGF0dXMgfD0gREFDX1JFQURZOworCQkJd3JpdGV3KGRldnByaXYtPkludFN0YXR1cywKKwkJCSAgICAgICBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKTsKKworCQkJLyogIENsZWFyIGRhdGEgcmVjZWl2ZWQgKi8KKwkJCWRldnByaXYtPmFvX2RhdGFbY2hhbl0gPSAwOworCisJCQlyZXR1cm4gcmV0OwogCQl9CiAKLQkJLyogIElmIHdlIHJlYWNoIGhlcmUsIGEgdGltZW91dCBoYXMgb2NjdXJyZWQgKi8KLQkJY29tZWRpX2Vycm9yKGRldiwgIkQvQSBpbnNuIHRpbWVvdXQiKTsKLQotCQkvKiAgRGlzYWJsZSBpbnRlcnJ1cHQgKi8KLQkJZGV2cHJpdi0+SW50RW5hYmxlICY9IH5EQUNfUkVBRFk7Ci0JCXdyaXRldyhkZXZwcml2LT5JbnRFbmFibGUsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX0VOKTsKLQotCQkvKiAgQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLwotCQlkZXZwcml2LT5JbnRTdGF0dXMgfD0gREFDX1JFQURZOwotCQl3cml0ZXcoZGV2cHJpdi0+SW50U3RhdHVzLAotCQkgICAgICAgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCk7Ci0KLQkJLyogIENsZWFyIGRhdGEgcmVjZWl2ZWQgKi8KLQkJZGV2cHJpdi0+YW9fZGF0YVtjaGFuXSA9IDA7Ci0KLQkJcmV0dXJuIC1FVElNRTsKLQotZGFjX3JlYWR5OgogCQkvKiAgV3JpdGUgZGF0YSB0byBhbmFsb2d1ZSBvdXRwdXQgZGF0YSByZWdpc3RlciAqLwogCQl3cml0ZXcoZGF0YVtuXSwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BTyk7CiAKQEAgLTU2NSw5ICs1NjMsNiBAQAogCiAJZGV2cHJpdi0+dmFsaWQgPSAxOwogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlcyBhdHRhY2hlZCwgaXJxICVzYWJsZWRcbiIsCi0JCWRldi0+Ym9hcmRfbmFtZSwgZGV2LT5pcnEgPyAiZW4iIDogImRpcyIpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9paV9wY2kyMGtjLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWlfcGNpMjBrYy5jCmluZGV4IDg1Nzc3NzguLjM1NThhYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9paV9wY2kyMGtjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2lpX3BjaTIwa2MuYwpAQCAtMTkwLDIwICsxOTAsMTggQEAKIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAotc3RhdGljIGludCBpaTIwa19haV93YWl0X2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgICAgaW50IHRpbWVvdXQpCitzdGF0aWMgaW50IGlpMjBrX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQl1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7CiAJdm9pZCBfX2lvbWVtICppb2Jhc2UgPSBpaTIwa19tb2R1bGVfaW9iYXNlKGRldiwgcyk7CiAJdW5zaWduZWQgY2hhciBzdGF0dXM7CiAKLQlkbyB7Ci0JCXN0YXR1cyA9IHJlYWRiKGlvYmFzZSArIElJMjBLX0FJX1NUQVRVU19SRUcpOwotCQlpZiAoKHN0YXR1cyAmIElJMjBLX0FJX1NUQVRVU19JTlQpID09IDApCi0JCQlyZXR1cm4gMDsKLQl9IHdoaWxlICh0aW1lb3V0LS0pOwotCi0JcmV0dXJuIC1FVElNRTsKKwlzdGF0dXMgPSByZWFkYihpb2Jhc2UgKyBJSTIwS19BSV9TVEFUVVNfUkVHKTsKKwlpZiAoKHN0YXR1cyAmIElJMjBLX0FJX1NUQVRVU19JTlQpID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7CiB9CiAKIHN0YXRpYyB2b2lkIGlpMjBrX2FpX3NldHVwKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC0yNjMsNyArMjYxLDcgQEAKIAkJLyogZ2VuZXJhdGUgYSBzb2Z0d2FyZSBzdGFydCBjb252ZXJ0IHNpZ25hbCAqLwogCQlyZWFkYihpb2Jhc2UgKyBJSTIwS19BSV9QQUNFUl9SRVNFVF9SRUcpOwogCi0JCXJldCA9IGlpMjBrX2FpX3dhaXRfZW9jKGRldiwgcywgMTAwKTsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBpaTIwa19haV9lb2MsIDApOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMKaW5kZXggNjEwMGMxMi4uYThkYjlkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5jCkBAIC01MSwyMyArNTEsNTUgQEAKICNpbmNsdWRlICJqcjNfcGNpLmgiCiAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9KUjMgMHgxNzYyCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSlIzXzFfQ0hBTk5FTCAweDMxMTEKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9KUjNfMV9DSEFOTkVMX05FVyAweDExMTEKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9KUjNfMl9DSEFOTkVMIDB4MzExMgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pSM18zX0NIQU5ORUwgMHgzMTEzCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSlIzXzRfQ0hBTk5FTCAweDMxMTQKKworZW51bSBqcjNfcGNpX2JvYXJkaWQgeworCUJPQVJEX0pSM18xLAorCUJPQVJEX0pSM18yLAorCUJPQVJEX0pSM18zLAorCUJPQVJEX0pSM180LAorfTsKKworc3RydWN0IGpyM19wY2lfYm9hcmQgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IG5fc3ViZGV2czsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QganIzX3BjaV9ib2FyZCBqcjNfcGNpX2JvYXJkc1tdID0geworCVtCT0FSRF9KUjNfMV0gPSB7CisJCS5uYW1lCQk9ICJqcjNfcGNpXzEiLAorCQkubl9zdWJkZXZzCT0gMSwKKwl9LAorCVtCT0FSRF9KUjNfMl0gPSB7CisJCS5uYW1lCQk9ICJqcjNfcGNpXzIiLAorCQkubl9zdWJkZXZzCT0gMiwKKwl9LAorCVtCT0FSRF9KUjNfM10gPSB7CisJCS5uYW1lCQk9ICJqcjNfcGNpXzMiLAorCQkubl9zdWJkZXZzCT0gMywKKwl9LAorCVtCT0FSRF9KUjNfNF0gPSB7CisJCS5uYW1lCQk9ICJqcjNfcGNpXzQiLAorCQkubl9zdWJkZXZzCT0gNCwKKwl9LAorfTsKKworc3RydWN0IGpyM19wY2lfdHJhbnNmb3JtIHsKKwlzdHJ1Y3QgeworCQl1MTYgbGlua190eXBlOworCQlzMTYgbGlua19hbW91bnQ7CisJfSBsaW5rWzhdOworfTsKKworc3RydWN0IGpyM19wY2lfcG9sbF9kZWxheSB7CisJaW50IG1pbjsKKwlpbnQgbWF4OworfTsKIAogc3RydWN0IGpyM19wY2lfZGV2X3ByaXZhdGUgewogCXN0cnVjdCBqcjNfdCBfX2lvbWVtICppb2Jhc2U7Ci0JaW50IG5fY2hhbm5lbHM7CiAJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiB9OwogCi1zdHJ1Y3QgcG9sbF9kZWxheV90IHsKLQlpbnQgbWluOwotCWludCBtYXg7Ci19OwotCiBzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSB7CiAJc3RydWN0IGpyM19jaGFubmVsIF9faW9tZW0gKmNoYW5uZWw7CiAJdW5zaWduZWQgbG9uZyBuZXh0X3RpbWVfbWluOwpAQCAtNzksNyArMTExLDYgQEAKIAkJc3RhdGVfanIzX2luaXRfdXNlX29mZnNldF9jb21wbGV0ZSwKIAkJc3RhdGVfanIzX2RvbmUKIAl9IHN0YXRlOwotCWludCBjaGFubmVsX25vOwogCWludCBzZXJpYWxfbm87CiAJaW50IG1vZGVsX25vOwogCXN0cnVjdCB7CkBAIC05Miw5ICsxMjMsOSBAQAogCWludCByZXRyaWVzOwogfTsKIAotc3RhdGljIHN0cnVjdCBwb2xsX2RlbGF5X3QgcG9sbF9kZWxheV9taW5fbWF4KGludCBtaW4sIGludCBtYXgpCitzdGF0aWMgc3RydWN0IGpyM19wY2lfcG9sbF9kZWxheSBwb2xsX2RlbGF5X21pbl9tYXgoaW50IG1pbiwgaW50IG1heCkKIHsKLQlzdHJ1Y3QgcG9sbF9kZWxheV90IHJlc3VsdDsKKwlzdHJ1Y3QganIzX3BjaV9wb2xsX2RlbGF5IHJlc3VsdDsKIAogCXJlc3VsdC5taW4gPSBtaW47CiAJcmVzdWx0Lm1heCA9IG1heDsKQEAgLTEwNiwxNSArMTM3LDggQEAKIAlyZXR1cm4gZ2V0X3MxNigmY2hhbm5lbC0+Y29tbWFuZF93b3JkMCkgPT0gMDsKIH0KIAotc3RydWN0IHRyYW5zZm9ybV90IHsKLQlzdHJ1Y3QgewotCQl1MTYgbGlua190eXBlOwotCQlzMTYgbGlua19hbW91bnQ7Ci0JfSBsaW5rWzhdOwotfTsKLQogc3RhdGljIHZvaWQgc2V0X3RyYW5zZm9ybXMoc3RydWN0IGpyM19jaGFubmVsIF9faW9tZW0gKmNoYW5uZWwsCi0JCQkgICBzdHJ1Y3QgdHJhbnNmb3JtX3QgdHJhbnNmLCBzaG9ydCBudW0pCisJCQkgICBzdHJ1Y3QganIzX3BjaV90cmFuc2Zvcm0gdHJhbnNmLCBzaG9ydCBudW0pCiB7CiAJaW50IGk7CiAKQEAgLTE5NCwxMTAgKzIxOCw5OSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQganIzX3BjaV9haV9yZWFkX2NoYW4oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCQkgdW5zaWduZWQgaW50IGNoYW4pCit7CisJc3RydWN0IGpyM19wY2lfc3ViZGV2X3ByaXZhdGUgKnNwcml2ID0gcy0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgdmFsID0gMDsKKworCWlmIChzcHJpdi0+c3RhdGUgIT0gc3RhdGVfanIzX2RvbmUpCisJCXJldHVybiAwOworCisJaWYgKGNoYW4gPCA1NikgeworCQl1bnNpZ25lZCBpbnQgYXhpcyA9IGNoYW4gJSA4OworCQl1bnNpZ25lZCBmaWx0ZXIgPSBjaGFuIC8gODsKKworCQlzd2l0Y2ggKGF4aXMpIHsKKwkJY2FzZSAwOgorCQkJdmFsID0gZ2V0X3MxNigmc3ByaXYtPmNoYW5uZWwtPmZpbHRlcltmaWx0ZXJdLmZ4KTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQl2YWwgPSBnZXRfczE2KCZzcHJpdi0+Y2hhbm5lbC0+ZmlsdGVyW2ZpbHRlcl0uZnkpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXZhbCA9IGdldF9zMTYoJnNwcml2LT5jaGFubmVsLT5maWx0ZXJbZmlsdGVyXS5meik7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJdmFsID0gZ2V0X3MxNigmc3ByaXYtPmNoYW5uZWwtPmZpbHRlcltmaWx0ZXJdLm14KTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQl2YWwgPSBnZXRfczE2KCZzcHJpdi0+Y2hhbm5lbC0+ZmlsdGVyW2ZpbHRlcl0ubXkpOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCXZhbCA9IGdldF9zMTYoJnNwcml2LT5jaGFubmVsLT5maWx0ZXJbZmlsdGVyXS5teik7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJdmFsID0gZ2V0X3MxNigmc3ByaXYtPmNoYW5uZWwtPmZpbHRlcltmaWx0ZXJdLnYxKTsKKwkJCWJyZWFrOworCQljYXNlIDc6CisJCQl2YWwgPSBnZXRfczE2KCZzcHJpdi0+Y2hhbm5lbC0+ZmlsdGVyW2ZpbHRlcl0udjIpOworCQkJYnJlYWs7CisJCX0KKwkJdmFsICs9IDB4NDAwMDsKKwl9IGVsc2UgaWYgKGNoYW4gPT0gNTYpIHsKKwkJdmFsID0gZ2V0X3UxNigmc3ByaXYtPmNoYW5uZWwtPm1vZGVsX25vKTsKKwl9IGVsc2UgaWYgKGNoYW4gPT0gNTcpIHsKKwkJdmFsID0gZ2V0X3UxNigmc3ByaXYtPmNoYW5uZWwtPnNlcmlhbF9ubyk7CisJfQorCisJcmV0dXJuIHZhbDsKK30KKwogc3RhdGljIGludCBqcjNfcGNpX2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQorCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCiB7Ci0JaW50IHJlc3VsdDsKLQlzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSAqcDsKLQlpbnQgY2hhbm5lbDsKKwlzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSAqc3ByaXYgPSBzLT5wcml2YXRlOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdTE2IGVycm9yczsKKwlpbnQgaTsKIAotCXAgPSBzLT5wcml2YXRlOwotCWNoYW5uZWwgPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQlpZiAocCA9PSBOVUxMIHx8IGNoYW5uZWwgPiA1NykgewotCQlyZXN1bHQgPSAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCWludCBpOworCWlmICghc3ByaXYpCisJCXJldHVybiAtRUlOVkFMOwogCi0JCXJlc3VsdCA9IGluc24tPm47Ci0JCWlmIChwLT5zdGF0ZSAhPSBzdGF0ZV9qcjNfZG9uZSB8fAotCQkgICAgKGdldF91MTYoJnAtPmNoYW5uZWwtPmVycm9ycykgJiAod2F0Y2hfZG9nIHwgd2F0Y2hfZG9nMiB8Ci0JCQkJCQkgICAgIHNlbnNvcl9jaGFuZ2UpKSkgewotCQkJLyogTm8gc2Vuc29yIG9yIHNlbnNvciBjaGFuZ2VkICovCi0JCQlpZiAocC0+c3RhdGUgPT0gc3RhdGVfanIzX2RvbmUpIHsKLQkJCQkvKiBSZXN0YXJ0IHBvbGxpbmcgKi8KLQkJCQlwLT5zdGF0ZSA9IHN0YXRlX2pyM19wb2xsOwotCQkJfQotCQkJcmVzdWx0ID0gLUVBR0FJTjsKKwllcnJvcnMgPSBnZXRfdTE2KCZzcHJpdi0+Y2hhbm5lbC0+ZXJyb3JzKTsKKwlpZiAoc3ByaXYtPnN0YXRlICE9IHN0YXRlX2pyM19kb25lIHx8CisJICAgIChlcnJvcnMgJiAod2F0Y2hfZG9nIHwgd2F0Y2hfZG9nMiB8IHNlbnNvcl9jaGFuZ2UpKSkgeworCQkvKiBObyBzZW5zb3Igb3Igc2Vuc29yIGNoYW5nZWQgKi8KKwkJaWYgKHNwcml2LT5zdGF0ZSA9PSBzdGF0ZV9qcjNfZG9uZSkgeworCQkJLyogUmVzdGFydCBwb2xsaW5nICovCisJCQlzcHJpdi0+c3RhdGUgPSBzdGF0ZV9qcjNfcG9sbDsKIAkJfQotCQlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7Ci0JCQlpZiAoY2hhbm5lbCA8IDU2KSB7Ci0JCQkJaW50IGF4aXMsIGZpbHRlcjsKLQotCQkJCWF4aXMgPSBjaGFubmVsICUgODsKLQkJCQlmaWx0ZXIgPSBjaGFubmVsIC8gODsKLQkJCQlpZiAocC0+c3RhdGUgIT0gc3RhdGVfanIzX2RvbmUpIHsKLQkJCQkJZGF0YVtpXSA9IDA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW50IEYgPSAwOwotCQkJCQlzd2l0Y2ggKGF4aXMpIHsKLQkJCQkJY2FzZSAwOgotCQkJCQkJRiA9IGdldF9zMTYoJnAtPmNoYW5uZWwtPgotCQkJCQkJCSAgICBmaWx0ZXJbZmlsdGVyXS5meCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAxOgotCQkJCQkJRiA9IGdldF9zMTYoJnAtPmNoYW5uZWwtPgotCQkJCQkJCSAgICBmaWx0ZXJbZmlsdGVyXS5meSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAyOgotCQkJCQkJRiA9IGdldF9zMTYoJnAtPmNoYW5uZWwtPgotCQkJCQkJCSAgICBmaWx0ZXJbZmlsdGVyXS5meik7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAzOgotCQkJCQkJRiA9IGdldF9zMTYoJnAtPmNoYW5uZWwtPgotCQkJCQkJCSAgICBmaWx0ZXJbZmlsdGVyXS5teCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSA0OgotCQkJCQkJRiA9IGdldF9zMTYoJnAtPmNoYW5uZWwtPgotCQkJCQkJCSAgICBmaWx0ZXJbZmlsdGVyXS5teSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSA1OgotCQkJCQkJRiA9IGdldF9zMTYoJnAtPmNoYW5uZWwtPgotCQkJCQkJCSAgICBmaWx0ZXJbZmlsdGVyXS5teik7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSA2OgotCQkJCQkJRiA9IGdldF9zMTYoJnAtPmNoYW5uZWwtPgotCQkJCQkJCSAgICBmaWx0ZXJbZmlsdGVyXS52MSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSA3OgotCQkJCQkJRiA9IGdldF9zMTYoJnAtPmNoYW5uZWwtPgotCQkJCQkJCSAgICBmaWx0ZXJbZmlsdGVyXS52Mik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlkYXRhW2ldID0gRiArIDB4NDAwMDsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGNoYW5uZWwgPT0gNTYpIHsKLQkJCQlpZiAocC0+c3RhdGUgIT0gc3RhdGVfanIzX2RvbmUpCi0JCQkJCWRhdGFbaV0gPSAwOwotCQkJCWVsc2UKLQkJCQkJZGF0YVtpXSA9Ci0JCQkJCWdldF91MTYoJnAtPmNoYW5uZWwtPm1vZGVsX25vKTsKLQkJCX0gZWxzZSBpZiAoY2hhbm5lbCA9PSA1NykgewotCQkJCWlmIChwLT5zdGF0ZSAhPSBzdGF0ZV9qcjNfZG9uZSkKLQkJCQkJZGF0YVtpXSA9IDA7Ci0JCQkJZWxzZQotCQkJCQlkYXRhW2ldID0KLQkJCQkJZ2V0X3UxNigmcC0+Y2hhbm5lbC0+c2VyaWFsX25vKTsKLQkJCX0KLQkJfQorCQlyZXR1cm4gLUVBR0FJTjsKIAl9Ci0JcmV0dXJuIHJlc3VsdDsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspCisJCWRhdGFbaV0gPSBqcjNfcGNpX2FpX3JlYWRfY2hhbihkZXYsIHMsIGNoYW4pOworCisJcmV0dXJuIGluc24tPm47CiB9CiAKIHN0YXRpYyBpbnQganIzX3BjaV9vcGVuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IGpyM19wY2lfc3ViZGV2X3ByaXZhdGUgKnNwcml2OworCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwogCWludCBpOwotCXN0cnVjdCBqcjNfcGNpX2Rldl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCiAJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgImpyM19wY2lfb3BlblxuIik7Ci0JZm9yIChpID0gMDsgaSA8IGRldnByaXYtPm5fY2hhbm5lbHM7IGkrKykgewotCQlzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSAqcDsKLQotCQlwID0gZGV2LT5zdWJkZXZpY2VzW2ldLnByaXZhdGU7Ci0JCWlmIChwKSB7Ci0JCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAic2VyaWFsOiAlcCAlZCAoJWQpXG4iLCBwLAotCQkJCXAtPnNlcmlhbF9ubywgcC0+Y2hhbm5lbF9ubyk7Ci0JCX0KKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5uX3N1YmRldmljZXM7IGkrKykgeworCQlzID0gJmRldi0+c3ViZGV2aWNlc1tpXTsKKwkJc3ByaXYgPSBzLT5wcml2YXRlOworCQlpZiAoc3ByaXYpCisJCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAic2VyaWFsOiAlcCAlZCAoJWQpXG4iLAorCQkJCXNwcml2LCBzcHJpdi0+c2VyaWFsX25vLCBzLT5pbmRleCk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMzI2LDI3MSArMzM5LDI2MiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQganIzX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJIGNvbnN0IHU4ICpkYXRhLCBzaXplX3Qgc2l6ZSwKLQkJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQorc3RhdGljIGludCBqcjNfY2hlY2tfZmlybXdhcmUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIGNvbnN0IHU4ICpkYXRhLCBzaXplX3Qgc2l6ZSkKIHsKKwlpbnQgbW9yZSA9IDE7CisJaW50IHBvcyA9IDA7CisKIAkvKgogCSAqIElETSBmaWxlIGZvcm1hdCBpczoKIAkgKiAgIHsgY291bnQsIGFkZHJlc3MsIGRhdGEgPGNvdW50PiB9ICoKIAkgKiAgIGZmZmYKIAkgKi8KLQlpbnQgcmVzdWx0LCBtb3JlLCBwb3MsIE9LOwotCi0JcmVzdWx0ID0gMDsKLQltb3JlID0gMTsKLQlwb3MgPSAwOwotCU9LID0gMDsKIAl3aGlsZSAobW9yZSkgewotCQl1bnNpZ25lZCBpbnQgY291bnQsIGFkZHI7CisJCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisJCXVuc2lnbmVkIGludCBhZGRyID0gMDsKIAogCQltb3JlID0gbW9yZSAmJiByZWFkX2lkbV93b3JkKGRhdGEsIHNpemUsICZwb3MsICZjb3VudCk7Ci0JCWlmIChtb3JlICYmIGNvdW50ID09IDB4ZmZmZikgewotCQkJT0sgPSAxOwotCQkJYnJlYWs7Ci0JCX0KKwkJaWYgKG1vcmUgJiYgY291bnQgPT0gMHhmZmZmKQorCQkJcmV0dXJuIDA7CisKIAkJbW9yZSA9IG1vcmUgJiYgcmVhZF9pZG1fd29yZChkYXRhLCBzaXplLCAmcG9zLCAmYWRkcik7CiAJCXdoaWxlIChtb3JlICYmIGNvdW50ID4gMCkgewotCQkJdW5zaWduZWQgaW50IGR1bW15OworCQkJdW5zaWduZWQgaW50IGR1bW15ID0gMDsKKwogCQkJbW9yZSA9IG1vcmUgJiYgcmVhZF9pZG1fd29yZChkYXRhLCBzaXplLCAmcG9zLCAmZHVtbXkpOwogCQkJY291bnQtLTsKIAkJfQogCX0KIAotCWlmICghT0spIHsKLQkJcmVzdWx0ID0gLUVOT0RBVEE7Ci0JfSBlbHNlIHsKLQkJaW50IGk7Ci0JCXN0cnVjdCBqcjNfcGNpX2Rldl9wcml2YXRlICpwID0gZGV2LT5wcml2YXRlOwotCi0JCWZvciAoaSA9IDA7IGkgPCBwLT5uX2NoYW5uZWxzOyBpKyspIHsKLQkJCXN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlICpzcDsKLQotCQkJc3AgPSBkZXYtPnN1YmRldmljZXNbaV0ucHJpdmF0ZTsKLQkJCW1vcmUgPSAxOwotCQkJcG9zID0gMDsKLQkJCXdoaWxlIChtb3JlKSB7Ci0JCQkJdW5zaWduZWQgaW50IGNvdW50LCBhZGRyOwotCQkJCW1vcmUgPSBtb3JlICYmCi0JCQkJICAgICAgIHJlYWRfaWRtX3dvcmQoZGF0YSwgc2l6ZSwgJnBvcywgJmNvdW50KTsKLQkJCQlpZiAobW9yZSAmJiBjb3VudCA9PSAweGZmZmYpCi0JCQkJCWJyZWFrOwotCQkJCW1vcmUgPSBtb3JlICYmCi0JCQkJICAgICAgIHJlYWRfaWRtX3dvcmQoZGF0YSwgc2l6ZSwgJnBvcywgJmFkZHIpOwotCQkJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsCi0JCQkJCSJMb2FkaW5nIyVkICU0LjR4IGJ5dGVzIGF0ICU0LjR4XG4iLAotCQkJCQlpLCBjb3VudCwgYWRkcik7Ci0JCQkJd2hpbGUgKG1vcmUgJiYgY291bnQgPiAwKSB7Ci0JCQkJCWlmIChhZGRyICYgMHg0MDAwKSB7Ci0JCQkJCQkvKiAgMTYgYml0IGRhdGEsIG5ldmVyIHNlZW4KLQkJCQkJCSAqICBpbiByZWFsIGxpZmUhISAqLwotCQkJCQkJdW5zaWduZWQgaW50IGRhdGExOwotCi0JCQkJCQltb3JlID0gbW9yZSAmJgotCQkJCQkJICAgICAgIHJlYWRfaWRtX3dvcmQoZGF0YSwKLQkJCQkJCQkJICAgICBzaXplLCAmcG9zLAotCQkJCQkJCQkgICAgICZkYXRhMSk7Ci0JCQkJCQljb3VudC0tOwotCQkJCQkJLyoganIzW2FkZHIgKyAweDIwMDAwICogcG51bV0gPQotCQkJCQkJICAgZGF0YTE7ICovCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvKiAgIERvd25sb2FkIDI0IGJpdCBwcm9ncmFtICovCi0JCQkJCQl1bnNpZ25lZCBpbnQgZGF0YTEsIGRhdGEyOwotCi0JCQkJCQltb3JlID0gbW9yZSAmJgotCQkJCQkJICAgICAgIHJlYWRfaWRtX3dvcmQoZGF0YSwKLQkJCQkJCQkJICAgICBzaXplLCAmcG9zLAotCQkJCQkJCQkgICAgICZkYXRhMSk7Ci0JCQkJCQltb3JlID0gbW9yZSAmJgotCQkJCQkJICAgICAgIHJlYWRfaWRtX3dvcmQoZGF0YSwgc2l6ZSwKLQkJCQkJCQkJICAgICAmcG9zLAotCQkJCQkJCQkgICAgICZkYXRhMik7Ci0JCQkJCQljb3VudCAtPSAyOwotCQkJCQkJaWYgKG1vcmUpIHsKLQkJCQkJCQlzZXRfdTE2KCZwLT4KLQkJCQkJCQkJaW9iYXNlLT5jaGFubmVsCi0JCQkJCQkJCVtpXS5wcm9ncmFtX2xvdwotCQkJCQkJCQlbYWRkcl0sIGRhdGExKTsKLQkJCQkJCQl1ZGVsYXkoMSk7Ci0JCQkJCQkJc2V0X3UxNigmcC0+Ci0JCQkJCQkJCWlvYmFzZS0+Y2hhbm5lbAotCQkJCQkJCQlbaV0ucHJvZ3JhbV9oaWdoCi0JCQkJCQkJCVthZGRyXSwgZGF0YTIpOwotCQkJCQkJCXVkZWxheSgxKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlhZGRyKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIC1FTk9EQVRBOwogfQogCi1zdGF0aWMgc3RydWN0IHBvbGxfZGVsYXlfdCBqcjNfcGNpX3BvbGxfc3ViZGV2aWNlKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQorc3RhdGljIHZvaWQganIzX3dyaXRlX2Zpcm13YXJlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgaW50IHN1YmRldiwgY29uc3QgdTggKmRhdGEsIHNpemVfdCBzaXplKQogewotCXN0cnVjdCBwb2xsX2RlbGF5X3QgcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDEwMDAsIDIwMDApOwotCXN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlICpwID0gcy0+cHJpdmF0ZTsKLQlpbnQgaTsKKwlzdHJ1Y3QganIzX3BjaV9kZXZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QganIzX3QgX19pb21lbSAqaW9iYXNlID0gZGV2cHJpdi0+aW9iYXNlOworCXUzMiBfX2lvbWVtICpsbzsKKwl1MzIgX19pb21lbSAqaGk7CisJaW50IG1vcmUgPSAxOworCWludCBwb3MgPSAwOwogCi0JaWYgKHApIHsKLQkJc3RydWN0IGpyM19jaGFubmVsIF9faW9tZW0gKmNoYW5uZWwgPSBwLT5jaGFubmVsOwotCQlpbnQgZXJyb3JzID0gZ2V0X3UxNigmY2hhbm5lbC0+ZXJyb3JzKTsKKwl3aGlsZSAobW9yZSkgeworCQl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCQl1bnNpZ25lZCBpbnQgYWRkciA9IDA7CiAKLQkJaWYgKGVycm9ycyAhPSBwLT5lcnJvcnMpCi0JCQlwLT5lcnJvcnMgPSBlcnJvcnM7CisJCW1vcmUgPSBtb3JlICYmIHJlYWRfaWRtX3dvcmQoZGF0YSwgc2l6ZSwgJnBvcywgJmNvdW50KTsKKwkJaWYgKG1vcmUgJiYgY291bnQgPT0gMHhmZmZmKQorCQkJcmV0dXJuOwogCi0JCWlmIChlcnJvcnMgJiAod2F0Y2hfZG9nIHwgd2F0Y2hfZG9nMiB8IHNlbnNvcl9jaGFuZ2UpKQotCQkJLyogIFNlbnNvciBjb21tdW5pY2F0aW9uIGxvc3QsIGZvcmNlIHBvbGwgbW9kZSAqLwotCQkJcC0+c3RhdGUgPSBzdGF0ZV9qcjNfcG9sbDsKKwkJbW9yZSA9IG1vcmUgJiYgcmVhZF9pZG1fd29yZChkYXRhLCBzaXplLCAmcG9zLCAmYWRkcik7CiAKLQkJc3dpdGNoIChwLT5zdGF0ZSkgewotCQljYXNlIHN0YXRlX2pyM19wb2xsOiB7Ci0JCQkJdTE2IG1vZGVsX25vID0gZ2V0X3UxNigmY2hhbm5lbC0+bW9kZWxfbm8pOwotCQkJCXUxNiBzZXJpYWxfbm8gPSBnZXRfdTE2KCZjaGFubmVsLT5zZXJpYWxfbm8pOwotCQkJCWlmICgoZXJyb3JzICYgKHdhdGNoX2RvZyB8IHdhdGNoX2RvZzIpKSB8fAotCQkJCSAgICBtb2RlbF9ubyA9PSAwIHx8IHNlcmlhbF9ubyA9PSAwKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIFN0aWxsIG5vIHNlbnNvciwga2VlcCBvbiBwb2xsaW5nLgotCQkJCQkgKiBTaW5jZSBpdCB0YWtlcyB1cCB0byAxMCBzZWNvbmRzCi0JCQkJCSAqIGZvciBvZmZzZXRzIHRvIHN0YWJpbGl6ZSwgcG9sbGluZwotCQkJCQkgKiBlYWNoIHNlY29uZCBzaG91bGQgc3VmZmljZS4KLQkJCQkJICovCi0JCQkJCXJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCgxMDAwLCAyMDAwKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwLT5yZXRyaWVzID0gMDsKLQkJCQkJcC0+c3RhdGUgPQotCQkJCQkJc3RhdGVfanIzX2luaXRfd2FpdF9mb3Jfb2Zmc2V0OwotCQkJCQlyZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoMTAwMCwgMjAwMCk7CisJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJMb2FkaW5nIyVkICU0LjR4IGJ5dGVzIGF0ICU0LjR4XG4iLAorCQkJc3ViZGV2LCBjb3VudCwgYWRkcik7CisKKwkJd2hpbGUgKG1vcmUgJiYgY291bnQgPiAwKSB7CisJCQlpZiAoYWRkciAmIDB4NDAwMCkgeworCQkJCS8qIDE2IGJpdCBkYXRhLCBuZXZlciBzZWVuIGluIHJlYWwgbGlmZSEhICovCisJCQkJdW5zaWduZWQgaW50IGRhdGExID0gMDsKKworCQkJCW1vcmUgPSBtb3JlICYmCisJCQkJICAgICAgIHJlYWRfaWRtX3dvcmQoZGF0YSwgc2l6ZSwgJnBvcywgJmRhdGExKTsKKwkJCQljb3VudC0tOworCQkJCS8qIGpyM1thZGRyICsgMHgyMDAwMCAqIHBudW1dID0gZGF0YTE7ICovCisJCQl9IGVsc2UgeworCQkJCS8qIERvd25sb2FkIDI0IGJpdCBwcm9ncmFtICovCisJCQkJdW5zaWduZWQgaW50IGRhdGExID0gMDsKKwkJCQl1bnNpZ25lZCBpbnQgZGF0YTIgPSAwOworCisJCQkJbG8gPSAmaW9iYXNlLT5jaGFubmVsW3N1YmRldl0ucHJvZ3JhbV9sb1thZGRyXTsKKwkJCQloaSA9ICZpb2Jhc2UtPmNoYW5uZWxbc3ViZGV2XS5wcm9ncmFtX2hpW2FkZHJdOworCisJCQkJbW9yZSA9IG1vcmUgJiYKKwkJCQkgICAgICAgcmVhZF9pZG1fd29yZChkYXRhLCBzaXplLCAmcG9zLCAmZGF0YTEpOworCQkJCW1vcmUgPSBtb3JlICYmCisJCQkJICAgICAgIHJlYWRfaWRtX3dvcmQoZGF0YSwgc2l6ZSwgJnBvcywgJmRhdGEyKTsKKwkJCQljb3VudCAtPSAyOworCQkJCWlmIChtb3JlKSB7CisJCQkJCXNldF91MTYobG8sIGRhdGExKTsKKwkJCQkJdWRlbGF5KDEpOworCQkJCQlzZXRfdTE2KGhpLCBkYXRhMik7CisJCQkJCXVkZWxheSgxKTsKIAkJCQl9CiAJCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBzdGF0ZV9qcjNfaW5pdF93YWl0X2Zvcl9vZmZzZXQ6Ci0JCQlwLT5yZXRyaWVzKys7Ci0JCQlpZiAocC0+cmV0cmllcyA8IDEwKSB7Ci0JCQkJLyogIFdhaXQgZm9yIG9mZmVzZXQgdG8gc3RhYmlsaXplCi0JCQkJICogICg8IDEwIHMgYWNjb3JkaW5nIHRvIG1hbnVhbCkgKi8KLQkJCQlyZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoMTAwMCwgMjAwMCk7Ci0JCQl9IGVsc2UgewotCQkJCXN0cnVjdCB0cmFuc2Zvcm1fdCB0cmFuc2Y7Ci0KLQkJCQlwLT5tb2RlbF9ubyA9IGdldF91MTYoJmNoYW5uZWwtPm1vZGVsX25vKTsKLQkJCQlwLT5zZXJpYWxfbm8gPSBnZXRfdTE2KCZjaGFubmVsLT5zZXJpYWxfbm8pOwotCi0JCQkJLyogIFRyYW5zZm9ybWF0aW9uIGFsbCB6ZXJvcyAqLwotCQkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRyYW5zZi5saW5rKTsgaSsrKSB7Ci0JCQkJCXRyYW5zZi5saW5rW2ldLmxpbmtfdHlwZSA9Ci0JCQkJCQkoZW51bSBsaW5rX3R5cGVzKTA7Ci0JCQkJCXRyYW5zZi5saW5rW2ldLmxpbmtfYW1vdW50ID0gMDsKLQkJCQl9Ci0KLQkJCQlzZXRfdHJhbnNmb3JtcyhjaGFubmVsLCB0cmFuc2YsIDApOwotCQkJCXVzZV90cmFuc2Zvcm0oY2hhbm5lbCwgMCk7Ci0JCQkJcC0+c3RhdGUgPSBzdGF0ZV9qcjNfaW5pdF90cmFuc2Zvcm1fY29tcGxldGU7Ci0JCQkJLyogIEFsbG93IDIwIG1zIGZvciBjb21wbGV0aW9uICovCi0JCQkJcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDIwLCAxMDApOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2Ugc3RhdGVfanIzX2luaXRfdHJhbnNmb3JtX2NvbXBsZXRlOgotCQkJaWYgKCFpc19jb21wbGV0ZShjaGFubmVsKSkgewotCQkJCXJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCgyMCwgMTAwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogIFNldCBmdWxsIHNjYWxlICovCi0JCQkJc3RydWN0IHNpeF9heGlzX3QgbWluX2Z1bGxfc2NhbGU7Ci0JCQkJc3RydWN0IHNpeF9heGlzX3QgbWF4X2Z1bGxfc2NhbGU7Ci0KLQkJCQltaW5fZnVsbF9zY2FsZSA9IGdldF9taW5fZnVsbF9zY2FsZXMoY2hhbm5lbCk7Ci0JCQkJbWF4X2Z1bGxfc2NhbGUgPSBnZXRfbWF4X2Z1bGxfc2NhbGVzKGNoYW5uZWwpOwotCQkJCXNldF9mdWxsX3NjYWxlcyhjaGFubmVsLCBtYXhfZnVsbF9zY2FsZSk7Ci0KLQkJCQlwLT5zdGF0ZSA9Ci0JCQkJCXN0YXRlX2pyM19pbml0X3NldF9mdWxsX3NjYWxlX2NvbXBsZXRlOwotCQkJCS8qICBBbGxvdyAyMCBtcyBmb3IgY29tcGxldGlvbiAqLwotCQkJCXJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCgyMCwgMTAwKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIHN0YXRlX2pyM19pbml0X3NldF9mdWxsX3NjYWxlX2NvbXBsZXRlOgotCQkJaWYgKCFpc19jb21wbGV0ZShjaGFubmVsKSkgewotCQkJCXJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCgyMCwgMTAwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RydWN0IGZvcmNlX2FycmF5IF9faW9tZW0gKmZ1bGxfc2NhbGU7Ci0KLQkJCQkvKiAgVXNlIHJhbmdlcyBpbiBrTiBvciB3ZSB3aWxsCi0JCQkJICogIG92ZXJmbG93IGFyb3VuZCAyMDAwTiEgKi8KLQkJCQlmdWxsX3NjYWxlID0gJmNoYW5uZWwtPmZ1bGxfc2NhbGU7Ci0JCQkJcC0+cmFuZ2VbMF0ucmFuZ2UubWluID0KLQkJCQkJLWdldF9zMTYoJmZ1bGxfc2NhbGUtPmZ4KSAqIDEwMDA7Ci0JCQkJcC0+cmFuZ2VbMF0ucmFuZ2UubWF4ID0KLQkJCQkJZ2V0X3MxNigmZnVsbF9zY2FsZS0+ZngpICogMTAwMDsKLQkJCQlwLT5yYW5nZVsxXS5yYW5nZS5taW4gPQotCQkJCQktZ2V0X3MxNigmZnVsbF9zY2FsZS0+ZnkpICogMTAwMDsKLQkJCQlwLT5yYW5nZVsxXS5yYW5nZS5tYXggPQotCQkJCQlnZXRfczE2KCZmdWxsX3NjYWxlLT5meSkgKiAxMDAwOwotCQkJCXAtPnJhbmdlWzJdLnJhbmdlLm1pbiA9Ci0JCQkJCS1nZXRfczE2KCZmdWxsX3NjYWxlLT5meikgKiAxMDAwOwotCQkJCXAtPnJhbmdlWzJdLnJhbmdlLm1heCA9Ci0JCQkJCWdldF9zMTYoJmZ1bGxfc2NhbGUtPmZ6KSAqIDEwMDA7Ci0JCQkJcC0+cmFuZ2VbM10ucmFuZ2UubWluID0KLQkJCQkJLWdldF9zMTYoJmZ1bGxfc2NhbGUtPm14KSAqIDEwMDsKLQkJCQlwLT5yYW5nZVszXS5yYW5nZS5tYXggPQotCQkJCQlnZXRfczE2KCZmdWxsX3NjYWxlLT5teCkgKiAxMDA7Ci0JCQkJcC0+cmFuZ2VbNF0ucmFuZ2UubWluID0KLQkJCQkJLWdldF9zMTYoJmZ1bGxfc2NhbGUtPm15KSAqIDEwMDsKLQkJCQlwLT5yYW5nZVs0XS5yYW5nZS5tYXggPQotCQkJCQlnZXRfczE2KCZmdWxsX3NjYWxlLT5teSkgKiAxMDA7Ci0JCQkJcC0+cmFuZ2VbNV0ucmFuZ2UubWluID0KLQkJCQkJLWdldF9zMTYoJmZ1bGxfc2NhbGUtPm16KSAqIDEwMDsKLQkJCQlwLT5yYW5nZVs1XS5yYW5nZS5tYXggPQotCQkJCQlnZXRfczE2KCZmdWxsX3NjYWxlLT5teikgKiAxMDA7CS8qID8/ICovCi0JCQkJcC0+cmFuZ2VbNl0ucmFuZ2UubWluID0KLQkJCQkJLWdldF9zMTYoJmZ1bGxfc2NhbGUtPnYxKSAqIDEwMDsvKiA/PyAqLwotCQkJCXAtPnJhbmdlWzZdLnJhbmdlLm1heCA9Ci0JCQkJCWdldF9zMTYoJmZ1bGxfc2NhbGUtPnYxKSAqIDEwMDsJLyogPz8gKi8KLQkJCQlwLT5yYW5nZVs3XS5yYW5nZS5taW4gPQotCQkJCQktZ2V0X3MxNigmZnVsbF9zY2FsZS0+djIpICogMTAwOy8qID8/ICovCi0JCQkJcC0+cmFuZ2VbN10ucmFuZ2UubWF4ID0KLQkJCQkJZ2V0X3MxNigmZnVsbF9zY2FsZS0+djIpICogMTAwOwkvKiA/PyAqLwotCQkJCXAtPnJhbmdlWzhdLnJhbmdlLm1pbiA9IDA7Ci0JCQkJcC0+cmFuZ2VbOF0ucmFuZ2UubWF4ID0gNjU1MzU7Ci0KLQkJCQl1c2Vfb2Zmc2V0KGNoYW5uZWwsIDApOwotCQkJCXAtPnN0YXRlID0gc3RhdGVfanIzX2luaXRfdXNlX29mZnNldF9jb21wbGV0ZTsKLQkJCQkvKiAgQWxsb3cgNDAgbXMgZm9yIGNvbXBsZXRpb24gKi8KLQkJCQlyZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoNDAsIDEwMCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBzdGF0ZV9qcjNfaW5pdF91c2Vfb2Zmc2V0X2NvbXBsZXRlOgotCQkJaWYgKCFpc19jb21wbGV0ZShjaGFubmVsKSkgewotCQkJCXJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCgyMCwgMTAwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0X3MxNigmY2hhbm5lbC0+b2Zmc2V0cy5meCwgMCk7Ci0JCQkJc2V0X3MxNigmY2hhbm5lbC0+b2Zmc2V0cy5meSwgMCk7Ci0JCQkJc2V0X3MxNigmY2hhbm5lbC0+b2Zmc2V0cy5meiwgMCk7Ci0JCQkJc2V0X3MxNigmY2hhbm5lbC0+b2Zmc2V0cy5teCwgMCk7Ci0JCQkJc2V0X3MxNigmY2hhbm5lbC0+b2Zmc2V0cy5teSwgMCk7Ci0JCQkJc2V0X3MxNigmY2hhbm5lbC0+b2Zmc2V0cy5teiwgMCk7Ci0KLQkJCQlzZXRfb2Zmc2V0KGNoYW5uZWwpOwotCi0JCQkJcC0+c3RhdGUgPSBzdGF0ZV9qcjNfZG9uZTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIHN0YXRlX2pyM19kb25lOgotCQkJcG9sbF9kZWxheV9taW5fbWF4KDEwMDAwLCAyMDAwMCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXBvbGxfZGVsYXlfbWluX21heCgxMDAwLCAyMDAwKTsKLQkJCWJyZWFrOworCQkJYWRkcisrOwogCQl9CiAJfQorfQorCitzdGF0aWMgaW50IGpyM19kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSBjb25zdCB1OCAqZGF0YSwgc2l6ZV90IHNpemUsCisJCQkJIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlpbnQgc3ViZGV2OworCWludCByZXQ7CisKKwkvKiB2ZXJpZnkgSURNIGZpbGUgZm9ybWF0ICovCisJcmV0ID0ganIzX2NoZWNrX2Zpcm13YXJlKGRldiwgZGF0YSwgc2l6ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHdyaXRlIGZpcm13YXJlIHRvIGVhY2ggc3ViZGV2aWNlICovCisJZm9yIChzdWJkZXYgPSAwOyBzdWJkZXYgPCBkZXYtPm5fc3ViZGV2aWNlczsgc3ViZGV2KyspCisJCWpyM193cml0ZV9maXJtd2FyZShkZXYsIHN1YmRldiwgZGF0YSwgc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBqcjNfcGNpX3BvbGxfZGVsYXkganIzX3BjaV9wb2xsX3N1YmRldmljZShzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSAqc3ByaXYgPSBzLT5wcml2YXRlOworCXN0cnVjdCBqcjNfcGNpX3BvbGxfZGVsYXkgcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDEwMDAsIDIwMDApOworCXN0cnVjdCBqcjNfY2hhbm5lbCBfX2lvbWVtICpjaGFubmVsOworCXUxNiBtb2RlbF9ubzsKKwl1MTYgc2VyaWFsX25vOworCWludCBlcnJvcnM7CisJaW50IGk7CisKKwlpZiAoIXNwcml2KQorCQlyZXR1cm4gcmVzdWx0OworCisJY2hhbm5lbCA9IHNwcml2LT5jaGFubmVsOworCWVycm9ycyA9IGdldF91MTYoJmNoYW5uZWwtPmVycm9ycyk7CisKKwlpZiAoZXJyb3JzICE9IHNwcml2LT5lcnJvcnMpCisJCXNwcml2LT5lcnJvcnMgPSBlcnJvcnM7CisKKwkvKiBTZW5zb3IgY29tbXVuaWNhdGlvbiBsb3N0PyBmb3JjZSBwb2xsIG1vZGUgKi8KKwlpZiAoZXJyb3JzICYgKHdhdGNoX2RvZyB8IHdhdGNoX2RvZzIgfCBzZW5zb3JfY2hhbmdlKSkKKwkJc3ByaXYtPnN0YXRlID0gc3RhdGVfanIzX3BvbGw7CisKKwlzd2l0Y2ggKHNwcml2LT5zdGF0ZSkgeworCWNhc2Ugc3RhdGVfanIzX3BvbGw6CisJCW1vZGVsX25vID0gZ2V0X3UxNigmY2hhbm5lbC0+bW9kZWxfbm8pOworCQlzZXJpYWxfbm8gPSBnZXRfdTE2KCZjaGFubmVsLT5zZXJpYWxfbm8pOworCisJCWlmICgoZXJyb3JzICYgKHdhdGNoX2RvZyB8IHdhdGNoX2RvZzIpKSB8fAorCQkgICAgbW9kZWxfbm8gPT0gMCB8fCBzZXJpYWxfbm8gPT0gMCkgeworCQkJLyoKKwkJCSAqIFN0aWxsIG5vIHNlbnNvciwga2VlcCBvbiBwb2xsaW5nLgorCQkJICogU2luY2UgaXQgdGFrZXMgdXAgdG8gMTAgc2Vjb25kcyBmb3Igb2Zmc2V0cyB0bworCQkJICogc3RhYmlsaXplLCBwb2xsaW5nIGVhY2ggc2Vjb25kIHNob3VsZCBzdWZmaWNlLgorCQkJICovCisJCX0gZWxzZSB7CisJCQlzcHJpdi0+cmV0cmllcyA9IDA7CisJCQlzcHJpdi0+c3RhdGUgPSBzdGF0ZV9qcjNfaW5pdF93YWl0X2Zvcl9vZmZzZXQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBzdGF0ZV9qcjNfaW5pdF93YWl0X2Zvcl9vZmZzZXQ6CisJCXNwcml2LT5yZXRyaWVzKys7CisJCWlmIChzcHJpdi0+cmV0cmllcyA8IDEwKSB7CisJCQkvKgorCQkJICogV2FpdCBmb3Igb2ZmZXNldCB0byBzdGFiaWxpemUKKwkJCSAqICg8IDEwIHMgYWNjb3JkaW5nIHRvIG1hbnVhbCkKKwkJCSAqLworCQl9IGVsc2UgeworCQkJc3RydWN0IGpyM19wY2lfdHJhbnNmb3JtIHRyYW5zZjsKKworCQkJc3ByaXYtPm1vZGVsX25vID0gZ2V0X3UxNigmY2hhbm5lbC0+bW9kZWxfbm8pOworCQkJc3ByaXYtPnNlcmlhbF9ubyA9IGdldF91MTYoJmNoYW5uZWwtPnNlcmlhbF9ubyk7CisKKwkJCS8qIFRyYW5zZm9ybWF0aW9uIGFsbCB6ZXJvcyAqLworCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodHJhbnNmLmxpbmspOyBpKyspIHsKKwkJCQl0cmFuc2YubGlua1tpXS5saW5rX3R5cGUgPSAoZW51bSBsaW5rX3R5cGVzKTA7CisJCQkJdHJhbnNmLmxpbmtbaV0ubGlua19hbW91bnQgPSAwOworCQkJfQorCisJCQlzZXRfdHJhbnNmb3JtcyhjaGFubmVsLCB0cmFuc2YsIDApOworCQkJdXNlX3RyYW5zZm9ybShjaGFubmVsLCAwKTsKKwkJCXNwcml2LT5zdGF0ZSA9IHN0YXRlX2pyM19pbml0X3RyYW5zZm9ybV9jb21wbGV0ZTsKKwkJCS8qIEFsbG93IDIwIG1zIGZvciBjb21wbGV0aW9uICovCisJCQlyZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoMjAsIDEwMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBzdGF0ZV9qcjNfaW5pdF90cmFuc2Zvcm1fY29tcGxldGU6CisJCWlmICghaXNfY29tcGxldGUoY2hhbm5lbCkpIHsKKwkJCXJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCgyMCwgMTAwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFNldCBmdWxsIHNjYWxlICovCisJCQlzdHJ1Y3Qgc2l4X2F4aXNfdCBtaW5fZnVsbF9zY2FsZTsKKwkJCXN0cnVjdCBzaXhfYXhpc190IG1heF9mdWxsX3NjYWxlOworCisJCQltaW5fZnVsbF9zY2FsZSA9IGdldF9taW5fZnVsbF9zY2FsZXMoY2hhbm5lbCk7CisJCQltYXhfZnVsbF9zY2FsZSA9IGdldF9tYXhfZnVsbF9zY2FsZXMoY2hhbm5lbCk7CisJCQlzZXRfZnVsbF9zY2FsZXMoY2hhbm5lbCwgbWF4X2Z1bGxfc2NhbGUpOworCisJCQlzcHJpdi0+c3RhdGUgPSBzdGF0ZV9qcjNfaW5pdF9zZXRfZnVsbF9zY2FsZV9jb21wbGV0ZTsKKwkJCS8qIEFsbG93IDIwIG1zIGZvciBjb21wbGV0aW9uICovCisJCQlyZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoMjAsIDEwMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBzdGF0ZV9qcjNfaW5pdF9zZXRfZnVsbF9zY2FsZV9jb21wbGV0ZToKKwkJaWYgKCFpc19jb21wbGV0ZShjaGFubmVsKSkgeworCQkJcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDIwLCAxMDApOworCQl9IGVsc2UgeworCQkJc3RydWN0IGZvcmNlX2FycmF5IF9faW9tZW0gKmZzID0gJmNoYW5uZWwtPmZ1bGxfc2NhbGU7CisKKwkJCS8qIFVzZSByYW5nZXMgaW4ga04gb3Igd2Ugd2lsbCBvdmVyZmxvdyBhcm91bmQgMjAwME4hICovCisJCQlzcHJpdi0+cmFuZ2VbMF0ucmFuZ2UubWluID0gLWdldF9zMTYoJmZzLT5meCkgKiAxMDAwOworCQkJc3ByaXYtPnJhbmdlWzBdLnJhbmdlLm1heCA9IGdldF9zMTYoJmZzLT5meCkgKiAxMDAwOworCQkJc3ByaXYtPnJhbmdlWzFdLnJhbmdlLm1pbiA9IC1nZXRfczE2KCZmcy0+ZnkpICogMTAwMDsKKwkJCXNwcml2LT5yYW5nZVsxXS5yYW5nZS5tYXggPSBnZXRfczE2KCZmcy0+ZnkpICogMTAwMDsKKwkJCXNwcml2LT5yYW5nZVsyXS5yYW5nZS5taW4gPSAtZ2V0X3MxNigmZnMtPmZ6KSAqIDEwMDA7CisJCQlzcHJpdi0+cmFuZ2VbMl0ucmFuZ2UubWF4ID0gZ2V0X3MxNigmZnMtPmZ6KSAqIDEwMDA7CisJCQlzcHJpdi0+cmFuZ2VbM10ucmFuZ2UubWluID0gLWdldF9zMTYoJmZzLT5teCkgKiAxMDA7CisJCQlzcHJpdi0+cmFuZ2VbM10ucmFuZ2UubWF4ID0gZ2V0X3MxNigmZnMtPm14KSAqIDEwMDsKKwkJCXNwcml2LT5yYW5nZVs0XS5yYW5nZS5taW4gPSAtZ2V0X3MxNigmZnMtPm15KSAqIDEwMDsKKwkJCXNwcml2LT5yYW5nZVs0XS5yYW5nZS5tYXggPSBnZXRfczE2KCZmcy0+bXkpICogMTAwOworCQkJc3ByaXYtPnJhbmdlWzVdLnJhbmdlLm1pbiA9IC1nZXRfczE2KCZmcy0+bXopICogMTAwOworCQkJLyogdGhlIG5leHQgZml2ZSBhcmUgcXVlc3Rpb25hYmxlICovCisJCQlzcHJpdi0+cmFuZ2VbNV0ucmFuZ2UubWF4ID0gZ2V0X3MxNigmZnMtPm16KSAqIDEwMDsKKwkJCXNwcml2LT5yYW5nZVs2XS5yYW5nZS5taW4gPSAtZ2V0X3MxNigmZnMtPnYxKSAqIDEwMDsKKwkJCXNwcml2LT5yYW5nZVs2XS5yYW5nZS5tYXggPSBnZXRfczE2KCZmcy0+djEpICogMTAwOworCQkJc3ByaXYtPnJhbmdlWzddLnJhbmdlLm1pbiA9IC1nZXRfczE2KCZmcy0+djIpICogMTAwOworCQkJc3ByaXYtPnJhbmdlWzddLnJhbmdlLm1heCA9IGdldF9zMTYoJmZzLT52MikgKiAxMDA7CisJCQlzcHJpdi0+cmFuZ2VbOF0ucmFuZ2UubWluID0gMDsKKwkJCXNwcml2LT5yYW5nZVs4XS5yYW5nZS5tYXggPSA2NTUzNTsKKworCQkJdXNlX29mZnNldChjaGFubmVsLCAwKTsKKwkJCXNwcml2LT5zdGF0ZSA9IHN0YXRlX2pyM19pbml0X3VzZV9vZmZzZXRfY29tcGxldGU7CisJCQkvKiBBbGxvdyA0MCBtcyBmb3IgY29tcGxldGlvbiAqLworCQkJcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDQwLCAxMDApOworCQl9CisJCWJyZWFrOworCWNhc2Ugc3RhdGVfanIzX2luaXRfdXNlX29mZnNldF9jb21wbGV0ZToKKwkJaWYgKCFpc19jb21wbGV0ZShjaGFubmVsKSkgeworCQkJcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDIwLCAxMDApOworCQl9IGVsc2UgeworCQkJc2V0X3MxNigmY2hhbm5lbC0+b2Zmc2V0cy5meCwgMCk7CisJCQlzZXRfczE2KCZjaGFubmVsLT5vZmZzZXRzLmZ5LCAwKTsKKwkJCXNldF9zMTYoJmNoYW5uZWwtPm9mZnNldHMuZnosIDApOworCQkJc2V0X3MxNigmY2hhbm5lbC0+b2Zmc2V0cy5teCwgMCk7CisJCQlzZXRfczE2KCZjaGFubmVsLT5vZmZzZXRzLm15LCAwKTsKKwkJCXNldF9zMTYoJmNoYW5uZWwtPm9mZnNldHMubXosIDApOworCisJCQlzZXRfb2Zmc2V0KGNoYW5uZWwpOworCisJCQlzcHJpdi0+c3RhdGUgPSBzdGF0ZV9qcjNfZG9uZTsKKwkJfQorCQlicmVhazsKKwljYXNlIHN0YXRlX2pyM19kb25lOgorCQlyZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoMTAwMDAsIDIwMDAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIHZvaWQganIzX3BjaV9wb2xsX2Rldih1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gKHN0cnVjdCBjb21lZGlfZGV2aWNlICopZGF0YTsKIAlzdHJ1Y3QganIzX3BjaV9kZXZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSAqc3ByaXY7CisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIG5vdzsKIAlpbnQgZGVsYXk7CiAJaW50IGk7CkBAIC01OTgsMTggKzYwMiwyMiBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CiAJZGVsYXkgPSAxMDAwOwogCW5vdyA9IGppZmZpZXM7Ci0JLyogIFBvbGwgYWxsIGNoYW5uZWxzIHRoYXQgYXJlIHJlYWR5IHRvIGJlIHBvbGxlZCAqLwotCWZvciAoaSA9IDA7IGkgPCBkZXZwcml2LT5uX2NoYW5uZWxzOyBpKyspIHsKLQkJc3RydWN0IGpyM19wY2lfc3ViZGV2X3ByaXZhdGUgKnN1YmRldnByaXYgPQotCQkJZGV2LT5zdWJkZXZpY2VzW2ldLnByaXZhdGU7Ci0JCWlmIChub3cgPiBzdWJkZXZwcml2LT5uZXh0X3RpbWVfbWluKSB7Ci0JCQlzdHJ1Y3QgcG9sbF9kZWxheV90IHN1Yl9kZWxheTsKIAotCQkJc3ViX2RlbGF5ID0ganIzX3BjaV9wb2xsX3N1YmRldmljZSgmZGV2LT5zdWJkZXZpY2VzW2ldKTsKLQkJCXN1YmRldnByaXYtPm5leHRfdGltZV9taW4gPQotCQkJCWppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHN1Yl9kZWxheS5taW4pOwotCQkJc3ViZGV2cHJpdi0+bmV4dF90aW1lX21heCA9Ci0JCQkJamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoc3ViX2RlbGF5Lm1heCk7CisJLyogUG9sbCBhbGwgY2hhbm5lbHMgdGhhdCBhcmUgcmVhZHkgdG8gYmUgcG9sbGVkICovCisJZm9yIChpID0gMDsgaSA8IGRldi0+bl9zdWJkZXZpY2VzOyBpKyspIHsKKwkJcyA9ICZkZXYtPnN1YmRldmljZXNbaV07CisJCXNwcml2ID0gcy0+cHJpdmF0ZTsKKworCQlpZiAobm93ID4gc3ByaXYtPm5leHRfdGltZV9taW4pIHsKKwkJCXN0cnVjdCBqcjNfcGNpX3BvbGxfZGVsYXkgc3ViX2RlbGF5OworCisJCQlzdWJfZGVsYXkgPSBqcjNfcGNpX3BvbGxfc3ViZGV2aWNlKHMpOworCisJCQlzcHJpdi0+bmV4dF90aW1lX21pbiA9IGppZmZpZXMgKworCQkJCQkgICAgICAgbXNlY3NfdG9famlmZmllcyhzdWJfZGVsYXkubWluKTsKKwkJCXNwcml2LT5uZXh0X3RpbWVfbWF4ID0gamlmZmllcyArCisJCQkJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKHN1Yl9kZWxheS5tYXgpOworCiAJCQlpZiAoc3ViX2RlbGF5Lm1heCAmJiBzdWJfZGVsYXkubWF4IDwgZGVsYXkpCiAJCQkJLyoKIAkJCQkgKiBXYWtlIHVwIGFzIGxhdGUgYXMgcG9zc2libGUgLT4KQEAgLTYyNCwxMyArNjMyLDU4IEBACiAJYWRkX3RpbWVyKCZkZXZwcml2LT50aW1lcik7CiB9CiAKLXN0YXRpYyBpbnQganIzX3BjaV9hdXRvX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKK3N0YXRpYyBzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSAqCitqcjNfcGNpX2FsbG9jX3Nwcml2KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewotCWludCByZXN1bHQ7CisJc3RydWN0IGpyM19wY2lfZGV2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJc3RydWN0IGpyM19wY2lfc3ViZGV2X3ByaXZhdGUgKnNwcml2OworCWludCBqOworCWludCBrOworCisJc3ByaXYgPSBjb21lZGlfYWxsb2Nfc3ByaXYocywgc2l6ZW9mKCpzcHJpdikpOworCWlmICghc3ByaXYpCisJCXJldHVybiBOVUxMOworCisJc3ByaXYtPmNoYW5uZWwgPSAmZGV2cHJpdi0+aW9iYXNlLT5jaGFubmVsW3MtPmluZGV4XS5kYXRhOworCisJZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCQlzcHJpdi0+cmFuZ2Vbal0ubGVuZ3RoID0gMTsKKwkJc3ByaXYtPnJhbmdlW2pdLnJhbmdlLm1pbiA9IC0xMDAwMDAwOworCQlzcHJpdi0+cmFuZ2Vbal0ucmFuZ2UubWF4ID0gMTAwMDAwMDsKKworCQlmb3IgKGsgPSAwOyBrIDwgNzsgaysrKSB7CisJCQlzcHJpdi0+cmFuZ2VfdGFibGVfbGlzdFtqICsgayAqIDhdID0KKwkJCQkoc3RydWN0IGNvbWVkaV9scmFuZ2UgKikmc3ByaXYtPnJhbmdlW2pdOworCQkJc3ByaXYtPm1heGRhdGFfbGlzdFtqICsgayAqIDhdID0gMHg3ZmZmOworCQl9CisJfQorCXNwcml2LT5yYW5nZVs4XS5sZW5ndGggPSAxOworCXNwcml2LT5yYW5nZVs4XS5yYW5nZS5taW4gPSAwOworCXNwcml2LT5yYW5nZVs4XS5yYW5nZS5tYXggPSA2NTUzNjsKKworCXNwcml2LT5yYW5nZV90YWJsZV9saXN0WzU2XSA9IChzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqKSZzcHJpdi0+cmFuZ2VbOF07CisJc3ByaXYtPnJhbmdlX3RhYmxlX2xpc3RbNTddID0gKHN0cnVjdCBjb21lZGlfbHJhbmdlICopJnNwcml2LT5yYW5nZVs4XTsKKwlzcHJpdi0+bWF4ZGF0YV9saXN0WzU2XSA9IDB4ZmZmZjsKKwlzcHJpdi0+bWF4ZGF0YV9saXN0WzU3XSA9IDB4ZmZmZjsKKworCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJwLT5jaGFubmVsICVwICVwICgldHgpXG4iLAorCQlzcHJpdi0+Y2hhbm5lbCwgZGV2cHJpdi0+aW9iYXNlLAorCQkoKGNoYXIgX19pb21lbSAqKXNwcml2LT5jaGFubmVsIC0KKwkJIChjaGFyIF9faW9tZW0gKilkZXZwcml2LT5pb2Jhc2UpKTsKKworCXJldHVybiBzcHJpdjsKK30KKworc3RhdGljIGludCBqcjNfcGNpX2F1dG9fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQorewogCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjb21lZGlfdG9fcGNpX2RldihkZXYpOwotCWludCBpOworCXN0YXRpYyBjb25zdCBzdHJ1Y3QganIzX3BjaV9ib2FyZCAqYm9hcmQgPSBOVUxMOwogCXN0cnVjdCBqcjNfcGNpX2Rldl9wcml2YXRlICpkZXZwcml2OworCXN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlICpzcHJpdjsKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKKwlpbnQgcmV0OworCWludCBpOwogCiAJaWYgKHNpemVvZihzdHJ1Y3QganIzX2NoYW5uZWwpICE9IDB4YzAwKSB7CiAJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCkBAIC02MzksMTA2ICs2OTIsNTYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKGNvbnRleHQgPCBBUlJBWV9TSVpFKGpyM19wY2lfYm9hcmRzKSkKKwkJYm9hcmQgPSAmanIzX3BjaV9ib2FyZHNbY29udGV4dF07CisJaWYgKCFib2FyZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZGV2LT5ib2FyZF9wdHIgPSBib2FyZDsKKwlkZXYtPmJvYXJkX25hbWUgPSBib2FyZC0+bmFtZTsKKwogCWRldnByaXYgPSBjb21lZGlfYWxsb2NfZGV2cHJpdihkZXYsIHNpemVvZigqZGV2cHJpdikpOwogCWlmICghZGV2cHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpbml0X3RpbWVyKCZkZXZwcml2LT50aW1lcik7Ci0Jc3dpdGNoIChwY2lkZXYtPmRldmljZSkgewotCWNhc2UgUENJX0RFVklDRV9JRF9KUjNfMV9DSEFOTkVMOgotCWNhc2UgUENJX0RFVklDRV9JRF9KUjNfMV9DSEFOTkVMX05FVzoKLQkJZGV2cHJpdi0+bl9jaGFubmVscyA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgUENJX0RFVklDRV9JRF9KUjNfMl9DSEFOTkVMOgotCQlkZXZwcml2LT5uX2NoYW5uZWxzID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBQQ0lfREVWSUNFX0lEX0pSM18zX0NIQU5ORUw6Ci0JCWRldnByaXYtPm5fY2hhbm5lbHMgPSAzOwotCQlicmVhazsKLQljYXNlIFBDSV9ERVZJQ0VfSURfSlIzXzRfQ0hBTk5FTDoKLQkJZGV2cHJpdi0+bl9jaGFubmVscyA9IDQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJqcjNfcGNpOiBwY2kgJXMgbm90IHN1cHBvcnRlZFxuIiwKLQkJCXBjaV9uYW1lKHBjaWRldikpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQogCi0JcmVzdWx0ID0gY29tZWRpX3BjaV9lbmFibGUoZGV2KTsKLQlpZiAocmVzdWx0KQotCQlyZXR1cm4gcmVzdWx0OworCXJldCA9IGNvbWVkaV9wY2lfZW5hYmxlKGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWRldnByaXYtPmlvYmFzZSA9IHBjaV9pb3JlbWFwX2JhcihwY2lkZXYsIDApOwogCWlmICghZGV2cHJpdi0+aW9iYXNlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJlc3VsdCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgZGV2cHJpdi0+bl9jaGFubmVscyk7Ci0JaWYgKHJlc3VsdCkKLQkJcmV0dXJuIHJlc3VsdDsKKwlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIGJvYXJkLT5uX3N1YmRldnMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlkZXYtPm9wZW4gPSBqcjNfcGNpX29wZW47Ci0JZm9yIChpID0gMDsgaSA8IGRldnByaXYtPm5fY2hhbm5lbHM7IGkrKykgewotCQlkZXYtPnN1YmRldmljZXNbaV0udHlwZSA9IENPTUVESV9TVUJEX0FJOwotCQlkZXYtPnN1YmRldmljZXNbaV0uc3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0dST1VORDsKLQkJZGV2LT5zdWJkZXZpY2VzW2ldLm5fY2hhbiA9IDggKiA3ICsgMjsKLQkJZGV2LT5zdWJkZXZpY2VzW2ldLmluc25fcmVhZCA9IGpyM19wY2lfYWlfaW5zbl9yZWFkOwotCQlkZXYtPnN1YmRldmljZXNbaV0ucHJpdmF0ZSA9Ci0JCQlremFsbG9jKHNpemVvZihzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSksCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmIChkZXYtPnN1YmRldmljZXNbaV0ucHJpdmF0ZSkgewotCQkJc3RydWN0IGpyM19wY2lfc3ViZGV2X3ByaXZhdGUgKnA7Ci0JCQlpbnQgajsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5uX3N1YmRldmljZXM7IGkrKykgeworCQlzID0gJmRldi0+c3ViZGV2aWNlc1tpXTsKKwkJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9BSTsKKwkJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFIHwgU0RGX0dST1VORDsKKwkJcy0+bl9jaGFuCT0gOCAqIDcgKyAyOworCQlzLT5pbnNuX3JlYWQJPSBqcjNfcGNpX2FpX2luc25fcmVhZDsKIAotCQkJcCA9IGRldi0+c3ViZGV2aWNlc1tpXS5wcml2YXRlOwotCQkJcC0+Y2hhbm5lbCA9ICZkZXZwcml2LT5pb2Jhc2UtPmNoYW5uZWxbaV0uZGF0YTsKLQkJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJwLT5jaGFubmVsICVwICVwICgldHgpXG4iLAotCQkJCXAtPmNoYW5uZWwsIGRldnByaXYtPmlvYmFzZSwKLQkJCQkoKGNoYXIgX19pb21lbSAqKXAtPmNoYW5uZWwgLQotCQkJCSAoY2hhciBfX2lvbWVtICopZGV2cHJpdi0+aW9iYXNlKSk7Ci0JCQlwLT5jaGFubmVsX25vID0gaTsKLQkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKLQkJCQlpbnQgazsKLQotCQkJCXAtPnJhbmdlW2pdLmxlbmd0aCA9IDE7Ci0JCQkJcC0+cmFuZ2Vbal0ucmFuZ2UubWluID0gLTEwMDAwMDA7Ci0JCQkJcC0+cmFuZ2Vbal0ucmFuZ2UubWF4ID0gMTAwMDAwMDsKLQkJCQlmb3IgKGsgPSAwOyBrIDwgNzsgaysrKSB7Ci0JCQkJCXAtPnJhbmdlX3RhYmxlX2xpc3RbaiArIGsgKiA4XSA9Ci0JCQkJCSAgICAoc3RydWN0IGNvbWVkaV9scmFuZ2UgKikmcC0+Ci0JCQkJCSAgICByYW5nZVtqXTsKLQkJCQkJcC0+bWF4ZGF0YV9saXN0W2ogKyBrICogOF0gPSAweDdmZmY7Ci0JCQkJfQotCQkJfQotCQkJcC0+cmFuZ2VbOF0ubGVuZ3RoID0gMTsKLQkJCXAtPnJhbmdlWzhdLnJhbmdlLm1pbiA9IDA7Ci0JCQlwLT5yYW5nZVs4XS5yYW5nZS5tYXggPSA2NTUzNjsKLQotCQkJcC0+cmFuZ2VfdGFibGVfbGlzdFs1Nl0gPQotCQkJCShzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqKSZwLT5yYW5nZVs4XTsKLQkJCXAtPnJhbmdlX3RhYmxlX2xpc3RbNTddID0KLQkJCQkoc3RydWN0IGNvbWVkaV9scmFuZ2UgKikmcC0+cmFuZ2VbOF07Ci0JCQlwLT5tYXhkYXRhX2xpc3RbNTZdID0gMHhmZmZmOwotCQkJcC0+bWF4ZGF0YV9saXN0WzU3XSA9IDB4ZmZmZjsKLQkJCS8qICBDaGFubmVsIHNwZWNpZmljIHJhbmdlIGFuZCBtYXhkYXRhICovCi0JCQlkZXYtPnN1YmRldmljZXNbaV0ucmFuZ2VfdGFibGUgPSBOVUxMOwotCQkJZGV2LT5zdWJkZXZpY2VzW2ldLnJhbmdlX3RhYmxlX2xpc3QgPQotCQkJCXAtPnJhbmdlX3RhYmxlX2xpc3Q7Ci0JCQlkZXYtPnN1YmRldmljZXNbaV0ubWF4ZGF0YSA9IDA7Ci0JCQlkZXYtPnN1YmRldmljZXNbaV0ubWF4ZGF0YV9saXN0ID0gcC0+bWF4ZGF0YV9saXN0OworCQlzcHJpdiA9IGpyM19wY2lfYWxsb2Nfc3ByaXYoZGV2LCBzKTsKKwkJaWYgKHNwcml2KSB7CisJCQkvKiBDaGFubmVsIHNwZWNpZmljIHJhbmdlIGFuZCBtYXhkYXRhICovCisJCQlzLT5yYW5nZV90YWJsZV9saXN0CT0gc3ByaXYtPnJhbmdlX3RhYmxlX2xpc3Q7CisJCQlzLT5tYXhkYXRhX2xpc3QJCT0gc3ByaXYtPm1heGRhdGFfbGlzdDsKIAkJfQogCX0KIAogCS8qICBSZXNldCBEU1AgY2FyZCAqLwogCXdyaXRlbCgwLCAmZGV2cHJpdi0+aW9iYXNlLT5jaGFubmVsWzBdLnJlc2V0KTsKIAotCXJlc3VsdCA9IGNvbWVkaV9sb2FkX2Zpcm13YXJlKGRldiwgJmNvbWVkaV90b19wY2lfZGV2KGRldiktPmRldiwKLQkJCQkgICAgICAiY29tZWRpL2pyM3BjaS5pZG0iLAotCQkJCSAgICAgIGpyM19kb3dubG9hZF9maXJtd2FyZSwgMCk7Ci0JZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIkZpcm1hcmUgbG9hZCAlZFxuIiwgcmVzdWx0KTsKLQotCWlmIChyZXN1bHQgPCAwKQotCQlyZXR1cm4gcmVzdWx0OworCXJldCA9IGNvbWVkaV9sb2FkX2Zpcm13YXJlKGRldiwgJmNvbWVkaV90b19wY2lfZGV2KGRldiktPmRldiwKKwkJCQkgICAiY29tZWRpL2pyM3BjaS5pZG0iLAorCQkJCSAgIGpyM19kb3dubG9hZF9maXJtd2FyZSwgMCk7CisJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIkZpcm1hcmUgbG9hZCAlZFxuIiwgcmV0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAkvKgogCSAqIFRPRE86IHVzZSBmaXJtd2FyZSB0byBsb2FkIHByZWZlcnJlZCBvZmZzZXQgdGFibGVzLiBTdWdnZXN0ZWQKIAkgKiBmb3JtYXQ6CkBAIC03NjEsMTEgKzc2NCwxMiBAQAogCX0KIAogCS8qICBTdGFydCBjYXJkIHRpbWVyICovCi0JZm9yIChpID0gMDsgaSA8IGRldnByaXYtPm5fY2hhbm5lbHM7IGkrKykgewotCQlzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSAqcCA9IGRldi0+c3ViZGV2aWNlc1tpXS5wcml2YXRlOworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5fc3ViZGV2aWNlczsgaSsrKSB7CisJCXMgPSAmZGV2LT5zdWJkZXZpY2VzW2ldOworCQlzcHJpdiA9IHMtPnByaXZhdGU7CiAKLQkJcC0+bmV4dF90aW1lX21pbiA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwMCk7Ci0JCXAtPm5leHRfdGltZV9tYXggPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDAwKTsKKwkJc3ByaXYtPm5leHRfdGltZV9taW4gPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDApOworCQlzcHJpdi0+bmV4dF90aW1lX21heCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMDApOwogCX0KIAogCWRldnByaXYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CkBAIC03NzMsMjEgKzc3NywxNiBAQAogCWRldnByaXYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwKTsKIAlhZGRfdGltZXIoJmRldnByaXYtPnRpbWVyKTsKIAotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGpyM19wY2lfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7Ci0JaW50IGk7CiAJc3RydWN0IGpyM19wY2lfZGV2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKIAlpZiAoZGV2cHJpdikgewogCQlkZWxfdGltZXJfc3luYygmZGV2cHJpdi0+dGltZXIpOwogCi0JCWlmIChkZXYtPnN1YmRldmljZXMpIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBkZXZwcml2LT5uX2NoYW5uZWxzOyBpKyspCi0JCQkJa2ZyZWUoZGV2LT5zdWJkZXZpY2VzW2ldLnByaXZhdGUpOwotCQl9CiAJCWlmIChkZXZwcml2LT5pb2Jhc2UpCiAJCQlpb3VubWFwKGRldnByaXYtPmlvYmFzZSk7CiAJfQpAQCAtODA4LDExICs4MDcsMTEgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGpyM19wY2lfcGNpX3RhYmxlW10gPSB7Ci0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSlIzLCBQQ0lfREVWSUNFX0lEX0pSM18xX0NIQU5ORUwpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSlIzLCBQQ0lfREVWSUNFX0lEX0pSM18xX0NIQU5ORUxfTkVXKSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0pSMywgUENJX0RFVklDRV9JRF9KUjNfMl9DSEFOTkVMKSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0pSMywgUENJX0RFVklDRV9JRF9KUjNfM19DSEFOTkVMKSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0pSMywgUENJX0RFVklDRV9JRF9KUjNfNF9DSEFOTkVMKSB9LAorCXsgUENJX1ZERVZJQ0UoSlIzLCAweDExMTEpLCBCT0FSRF9KUjNfMSB9LAorCXsgUENJX1ZERVZJQ0UoSlIzLCAweDMxMTEpLCBCT0FSRF9KUjNfMSB9LAorCXsgUENJX1ZERVZJQ0UoSlIzLCAweDMxMTIpLCBCT0FSRF9KUjNfMiB9LAorCXsgUENJX1ZERVZJQ0UoSlIzLCAweDMxMTMpLCBCT0FSRF9KUjNfMyB9LAorCXsgUENJX1ZERVZJQ0UoSlIzLCAweDMxMTQpLCBCT0FSRF9KUjNfNCB9LAogCXsgMCB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGpyM19wY2lfcGNpX3RhYmxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5oCmluZGV4IDMzMTdmN2EuLjIwNDc4YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuaApAQCAtNjcxLDExICs2NzEsMTEgQEAKIAogc3RydWN0IGpyM190IHsKIAlzdHJ1Y3QgewotCQl1MzIgcHJvZ3JhbV9sb3dbMHg0MDAwXTsJLyogIDB4MDAwMDAgLSAweDEwMDAwICovCisJCXUzMiBwcm9ncmFtX2xvWzB4NDAwMF07CQkvKiAgMHgwMDAwMCAtIDB4MTAwMDAgKi8KIAkJc3RydWN0IGpyM19jaGFubmVsIGRhdGE7CS8qICAweDEwMDAwIC0gMHgxMGMwMCAqLwogCQljaGFyIHBhZDJbMHgzMDAwMCAtIDB4MDBjMDBdOwkvKiAgMHgxMGMwMCAtIDB4NDAwMDAgKi8KLQkJdTMyIHByb2dyYW1faGlnaFsweDgwMDBdOwkvKiAgMHg0MDAwMCAtIDB4NjAwMDAgKi8KLQkJdTMyIHJlc2V0OwkvKiAgMHg2MDAwMCAtIDB4NjAwMDQgKi8KKwkJdTMyIHByb2dyYW1faGlbMHg4MDAwXTsJCS8qICAweDQwMDAwIC0gMHg2MDAwMCAqLworCQl1MzIgcmVzZXQ7CQkJLyogIDB4NjAwMDAgLSAweDYwMDA0ICovCiAJCWNoYXIgcGFkM1sweDIwMDAwIC0gMHgwMDAwNF07CS8qICAweDYwMDA0IC0gMHg4MDAwMCAqLwogCX0gY2hhbm5lbFs0XTsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMva2VfY291bnRlci5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2tlX2NvdW50ZXIuYwppbmRleCA2Yjk4NDZmLi5lYzQzYzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMva2VfY291bnRlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9rZV9jb3VudGVyLmMKQEAgLTEsOTIgKzEsMTEzIEBACiAvKgotICAgIGNvbWVkaS9kcml2ZXJzL2tlX2NvdW50ZXIuYwotICAgIENvbWVkaSBkcml2ZXIgZm9yIEtvbHRlci1FbGVjdHJvbmljIFBDSSBDb3VudGVyIDEgQ2FyZAorICoga2VfY291bnRlci5jCisgKiBDb21lZGkgZHJpdmVyIGZvciBLb2x0ZXItRWxlY3Ryb25pYyBQQ0kgQ291bnRlciAxIENhcmQKKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCiAKLSAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCi0gICAgQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qLwogLyoKLURyaXZlcjoga2VfY291bnRlcgotRGVzY3JpcHRpb246IERyaXZlciBmb3IgS29sdGVyIEVsZWN0cm9uaWMgQ291bnRlciBDYXJkCi1EZXZpY2VzOiBbS29sdGVyIEVsZWN0cm9uaWNdIFBDSSBDb3VudGVyIENhcmQgKGtlX2NvdW50ZXIpCi1BdXRob3I6IE1pY2hhZWwgSGlsbG1hbm4KLVVwZGF0ZWQ6IE1vbiwgMTQgQXByIDIwMDggMTU6NDI6NDIgKzAxMDAKLVN0YXR1czogdGVzdGVkCi0KLUNvbmZpZ3VyYXRpb24gT3B0aW9uczogbm90IGFwcGxpY2FibGUsIHVzZXMgUENJIGF1dG8gY29uZmlnCi0KLVRoaXMgZHJpdmVyIGlzIGEgc2ltcGxlIGRyaXZlciB0byByZWFkIHRoZSBjb3VudGVyIHZhbHVlcyBmcm9tCi1Lb2x0ZXIgRWxlY3Ryb25pYyBQQ0kgQ291bnRlciBDYXJkLgotKi8KKyAqIERyaXZlcjoga2VfY291bnRlcgorICogRGVzY3JpcHRpb246IERyaXZlciBmb3IgS29sdGVyIEVsZWN0cm9uaWMgQ291bnRlciBDYXJkCisgKiBEZXZpY2VzOiAoS29sdGVyIEVsZWN0cm9uaWMpIFBDSSBDb3VudGVyIENhcmQgW2tlX2NvdW50ZXJdCisgKiBBdXRob3I6IE1pY2hhZWwgSGlsbG1hbm4KKyAqIFVwZGF0ZWQ6IE1vbiwgMTQgQXByIDIwMDggMTU6NDI6NDIgKzAxMDAKKyAqIFN0YXR1czogdGVzdGVkCisgKgorICogQ29uZmlndXJhdGlvbiBPcHRpb25zOiBub3QgYXBwbGljYWJsZSwgdXNlcyBQQ0kgYXV0byBjb25maWcKKyAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAotI2RlZmluZSBDTlRfQ0FSRF9ERVZJQ0VfSUQgICAgICAweDAwMTQKKy8qCisgKiBQQ0kgQkFSIDAgUmVnaXN0ZXIgSS9PIG1hcAorICovCisjZGVmaW5lIEtFX1JFU0VUX1JFRyh4KQkJCSgweDAwICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBLRV9MQVRDSF9SRUcoeCkJCQkoMHgwMCArICgoeCkgKiAweDIwKSkKKyNkZWZpbmUgS0VfTFNCX1JFRyh4KQkJCSgweDA0ICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBLRV9NSURfUkVHKHgpCQkJKDB4MDggKyAoKHgpICogMHgyMCkpCisjZGVmaW5lIEtFX01TQl9SRUcoeCkJCQkoMHgwYyArICgoeCkgKiAweDIwKSkKKyNkZWZpbmUgS0VfU0lHTl9SRUcoeCkJCQkoMHgxMCArICgoeCkgKiAweDIwKSkKKyNkZWZpbmUgS0VfT1NDX1NFTF9SRUcJCQkweGY4CisjZGVmaW5lIEtFX09TQ19TRUxfRVhUCQkJKDEgPDwgMCkKKyNkZWZpbmUgS0VfT1NDX1NFTF80TUhaCQkJKDIgPDwgMCkKKyNkZWZpbmUgS0VfT1NDX1NFTF8yME1IWgkJKDMgPDwgMCkKKyNkZWZpbmUgS0VfRE9fUkVHCQkJMHhmYwogCi0vKi0tIGNvdW50ZXIgd3JpdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFRoaXMgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgcmVzZXR0aW5nIHRoZSBjb3VudGVyczsgbWF5YmUgaXQgaXMgYmV0dGVyCi0gICB0byBtYWtlIGEgc3BlY2lhbCBjb21tYW5kICdyZXNldCcuICovCi1zdGF0aWMgaW50IGNudF93aW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCSAgICAgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBrZV9jb3VudGVyX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQogewotCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBpOwogCi0Jb3V0YigodW5zaWduZWQgY2hhcikoKGRhdGFbMF0gPj4gMjQpICYgMHhmZiksCi0JICAgICBkZXYtPmlvYmFzZSArIGNoYW4gKiAweDIwICsgMHgxMCk7Ci0Jb3V0YigodW5zaWduZWQgY2hhcikoKGRhdGFbMF0gPj4gMTYpICYgMHhmZiksCi0JICAgICBkZXYtPmlvYmFzZSArIGNoYW4gKiAweDIwICsgMHgwYyk7Ci0Jb3V0YigodW5zaWduZWQgY2hhcikoKGRhdGFbMF0gPj4gOCkgJiAweGZmKSwKLQkgICAgIGRldi0+aW9iYXNlICsgY2hhbiAqIDB4MjAgKyAweDA4KTsKLQlvdXRiKCh1bnNpZ25lZCBjaGFyKSgoZGF0YVswXSA+PiAwKSAmIDB4ZmYpLAotCSAgICAgZGV2LT5pb2Jhc2UgKyBjaGFuICogMHgyMCArIDB4MDQpOworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJdmFsID0gZGF0YVswXTsKIAotCS8qIHJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgd3JpdHRlbiAqLwotCXJldHVybiAxOworCQkvKiBPcmRlciBtYXR0ZXJzICovCisJCW91dGIoKHZhbCA+PiAyNCkgJiAweGZmLCBkZXYtPmlvYmFzZSArIEtFX1NJR05fUkVHKGNoYW4pKTsKKwkJb3V0YigodmFsID4+IDE2KSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgS0VfTVNCX1JFRyhjaGFuKSk7CisJCW91dGIoKHZhbCA+PiA4KSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgS0VfTUlEX1JFRyhjaGFuKSk7CisJCW91dGIoKHZhbCA+PiAwKSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgS0VfTFNCX1JFRyhjaGFuKSk7CisJfQorCisJcmV0dXJuIGluc24tPm47CiB9CiAKLS8qLS0gY291bnRlciByZWFkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBjbnRfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyBpbnQga2VfY291bnRlcl9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJdW5zaWduZWQgaW50ICpkYXRhKQogewotCXVuc2lnbmVkIGNoYXIgYTAsIGExLCBhMiwgYTMsIGE0OwotCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGk7CiAKLQlhMCA9IGluYihkZXYtPmlvYmFzZSArIGNoYW4gKiAweDIwKTsKLQlhMSA9IGluYihkZXYtPmlvYmFzZSArIGNoYW4gKiAweDIwICsgMHgwNCk7Ci0JYTIgPSBpbmIoZGV2LT5pb2Jhc2UgKyBjaGFuICogMHgyMCArIDB4MDgpOwotCWEzID0gaW5iKGRldi0+aW9iYXNlICsgY2hhbiAqIDB4MjAgKyAweDBjKTsKLQlhNCA9IGluYihkZXYtPmlvYmFzZSArIGNoYW4gKiAweDIwICsgMHgxMCk7CisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQkvKiBPcmRlciBtYXR0ZXJzICovCisJCWluYihkZXYtPmlvYmFzZSArIEtFX0xBVENIX1JFRyhjaGFuKSk7CiAKLQlyZXN1bHQgPSAoYTEgKyAoYTIgKiAyNTYpICsgKGEzICogNjU1MzYpKTsKLQlpZiAoYTQgPiAwKQotCQlyZXN1bHQgPSByZXN1bHQgLSBzLT5tYXhkYXRhOworCQl2YWwgPSBpbmIoZGV2LT5pb2Jhc2UgKyBLRV9MU0JfUkVHKGNoYW4pKTsKKwkJdmFsIHw9IChpbmIoZGV2LT5pb2Jhc2UgKyBLRV9NSURfUkVHKGNoYW4pKSA8PCA4KTsKKwkJdmFsIHw9IChpbmIoZGV2LT5pb2Jhc2UgKyBLRV9NU0JfUkVHKGNoYW4pKSA8PCAxNik7CisJCXZhbCB8PSAoaW5iKGRldi0+aW9iYXNlICsgS0VfU0lHTl9SRUcoY2hhbikpIDw8IDI0KTsKIAotCSpkYXRhID0gKHVuc2lnbmVkIGludClyZXN1bHQ7CisJCWRhdGFbaV0gPSB2YWw7CisJfQogCi0JLyogcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyByZWFkICovCi0JcmV0dXJuIDE7CisJcmV0dXJuIGluc24tPm47CiB9CiAKLXN0YXRpYyBpbnQgY250X2F1dG9fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQorc3RhdGljIGludCBrZV9jb3VudGVyX2RvX2luc25fYml0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJaWYgKGNvbWVkaV9kaW9fdXBkYXRlX3N0YXRlKHMsIGRhdGEpKQorCQlvdXRiKHMtPnN0YXRlLCBkZXYtPmlvYmFzZSArIEtFX0RPX1JFRyk7CisKKwlkYXRhWzFdID0gcy0+c3RhdGU7CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCBrZV9jb3VudGVyX2F1dG9fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQogewogCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjb21lZGlfdG9fcGNpX2RldihkZXYpOwogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwpAQCAtOTcsMzAgKzExOCwzMiBAQAogCQlyZXR1cm4gcmV0OwogCWRldi0+aW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMCk7CiAKLQlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDEpOworCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgMik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzBdOwotCWRldi0+cmVhZF9zdWJkZXYgPSBzOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQ09VTlRFUjsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfUkVBREFCTEU7CisJcy0+bl9jaGFuCT0gMzsKKwlzLT5tYXhkYXRhCT0gMHgwMWZmZmZmZjsKKwlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV91bmtub3duOworCXMtPmluc25fcmVhZAk9IGtlX2NvdW50ZXJfaW5zbl9yZWFkOworCXMtPmluc25fd3JpdGUJPSBrZV9jb3VudGVyX2luc25fd3JpdGU7CiAKLQlzLT50eXBlID0gQ09NRURJX1NVQkRfQ09VTlRFUjsKLQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgLyogfCBTREZfQ09NTU9OICovIDsKLQlzLT5uX2NoYW4gPSAzOwotCXMtPm1heGRhdGEgPSAweDAwZmZmZmZmOwotCXMtPmluc25fcmVhZCA9IGNudF9yaW5zbjsKLQlzLT5pbnNuX3dyaXRlID0gY250X3dpbnNuOworCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzFdOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfRE87CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1dSSVRBQkxFOworCXMtPm5fY2hhbgk9IDM7CisJcy0+bWF4ZGF0YQk9IDE7CisJcy0+cmFuZ2VfdGFibGUJPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX2JpdHMJPSBrZV9jb3VudGVyX2RvX2luc25fYml0czsKIAotCS8qICBzZWxlY3QgMjBNSHogY2xvY2sgKi8KLQlvdXRiKDMsIGRldi0+aW9iYXNlICsgMjQ4KTsKKwlvdXRiKEtFX09TQ19TRUxfMjBNSFosIGRldi0+aW9iYXNlICsgS0VfT1NDX1NFTF9SRUcpOwogCi0JLyogIHJlc2V0IGFsbCBjb3VudGVycyAqLwotCW91dGIoMCwgZGV2LT5pb2Jhc2UpOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyAweDIwKTsKLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgMHg0MCk7Ci0KLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzOiAlcyBhdHRhY2hlZFxuIiwKLQkJZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lLCBkZXYtPmJvYXJkX25hbWUpOworCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBLRV9SRVNFVF9SRUcoMCkpOworCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBLRV9SRVNFVF9SRUcoMSkpOworCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBLRV9SRVNFVF9SRUcoMikpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMjgsNyArMTUxLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgY29tZWRpX2RyaXZlciBrZV9jb3VudGVyX2RyaXZlciA9IHsKIAkuZHJpdmVyX25hbWUJPSAia2VfY291bnRlciIsCiAJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKLQkuYXV0b19hdHRhY2gJPSBjbnRfYXV0b19hdHRhY2gsCisJLmF1dG9fYXR0YWNoCT0ga2VfY291bnRlcl9hdXRvX2F0dGFjaCwKIAkuZGV0YWNoCQk9IGNvbWVkaV9wY2lfZGlzYWJsZSwKIH07CiAKQEAgLTE0MCw3ICsxNjMsNyBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQga2VfY291bnRlcl9wY2lfdGFibGVbXSA9IHsKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9LT0xURVIsIENOVF9DQVJEX0RFVklDRV9JRCkgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9LT0xURVIsIDB4MDAxNCkgfSwKIAl7IDAgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBrZV9jb3VudGVyX3BjaV90YWJsZSk7CkBAIC0xNTQsNSArMTc3LDUgQEAKIG1vZHVsZV9jb21lZGlfcGNpX2RyaXZlcihrZV9jb3VudGVyX2RyaXZlciwga2VfY291bnRlcl9wY2lfZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgZHJpdmVyIGZvciBLb2x0ZXIgRWxlY3Ryb25pYyBDb3VudGVyIENhcmQiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuYwppbmRleCBlNzM5YmNkLi5mMDJiMzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5jCkBAIC0xMTEyLDkgKzExMTIsNiBAQAogCWlmICghZGV2LT5hdHRhY2hlZCkKIAkJcmV0dXJuIElSUV9OT05FOwogCi0JLyogUmVzZXQgYWxsIGV2ZW50cyAqLwotCXMtPmFzeW5jLT5ldmVudHMgPSAwOwotCiAJaWYgKGlubChkZXYtPmlvYmFzZSArIE1FNDAwMF9JUlFfU1RBVFVTX1JFRykgJgogCSAgICBNRTQwMDBfSVJRX1NUQVRVU19CSVRfQUlfSEYpIHsKIAkJLyogUmVhZCBzdGF0dXMgcmVnaXN0ZXIgdG8gZmluZCBvdXQgd2hhdCBoYXBwZW5lZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lX2RhcS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lX2RhcS5jCmluZGV4IDdmNjY4NzguLjBmZjEyNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZV9kYXEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWVfZGFxLmMKQEAgLTI0OCw2ICsyNDgsMjAgQEAKIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAorc3RhdGljIGludCBtZV9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCSAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXN0cnVjdCBtZV9wcml2YXRlX2RhdGEgKmRldl9wcml2YXRlID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSByZWFkdyhkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX1NUQVRVUyk7CisJaWYgKChzdGF0dXMgJiAweDAwMDQpID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgbWVfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKQEAgLTI1OCw3ICsyNzIsNyBAQAogCXVuc2lnbmVkIGludCByYW5nID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOwogCXVuc2lnbmVkIGludCBhcmVmID0gQ1JfQVJFRihpbnNuLT5jaGFuc3BlYyk7CiAJdW5zaWduZWQgc2hvcnQgdmFsOwotCWludCBpOworCWludCByZXQ7CiAKIAkvKiBzdG9wIGFueSBydW5uaW5nIGNvbnZlcnNpb24gKi8KIAlkZXZfcHJpdmF0ZS0+Y29udHJvbF8xICY9IDB4RkZGQzsKQEAgLTI5MCwxOSArMzA0LDE0IEBACiAJcmVhZHcoZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9BRENfU1RBUlQpOwogCiAJLyogd2FpdCBmb3IgQURDIGZpZm8gbm90IGVtcHR5IGZsYWcgKi8KLQlmb3IgKGkgPSAxMDAwMDA7IGkgPiAwOyBpLS0pCi0JCWlmICghKHJlYWR3KGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfU1RBVFVTKSAmIDB4MDAwNCkpCi0JCQlicmVhazsKKwlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIG1lX2FpX2VvYywgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCS8qIGdldCB2YWx1ZSBmcm9tIEFEQyBmaWZvICovCi0JaWYgKGkpIHsKLQkJdmFsID0gcmVhZHcoZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9SRUFEX0FEX0ZJRk8pOwotCQl2YWwgPSAodmFsIF4gMHg4MDApICYgMHgwZmZmOwotCQlkYXRhWzBdID0gdmFsOwotCX0gZWxzZSB7Ci0JCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJDYW5ub3QgZ2V0IHNpbmdsZSB2YWx1ZVxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KKwl2YWwgPSByZWFkdyhkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX1JFQURfQURfRklGTyk7CisJdmFsID0gKHZhbCBeIDB4ODAwKSAmIDB4MGZmZjsKKwlkYXRhWzBdID0gdmFsOwogCiAJLyogc3RvcCBhbnkgcnVubmluZyBjb252ZXJzaW9uICovCiAJZGV2X3ByaXZhdGUtPmNvbnRyb2xfMSAmPSAweEZGRkM7CkBAIC01NDIsOSArNTUxLDYgQEAKIAlzLT5pbnNuX2JpdHMJPSBtZV9kaW9faW5zbl9iaXRzOwogCXMtPmluc25fY29uZmlnCT0gbWVfZGlvX2luc25fY29uZmlnOwogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlczogJXMgYXR0YWNoZWRcbiIsCi0JCWRldi0+ZHJpdmVyLT5kcml2ZXJfbmFtZSwgZGV2LT5ib2FyZF9uYW1lKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWY2eDQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZjZ4NC5jCmluZGV4IDgxYjc4ZTAuLmE0ZjdkNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZjZ4NC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZjZ4NC5jCkBAIC0xMzMsMjEgKzEzMywxOCBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCi1zdGF0aWMgaW50IG1mNng0X2FpX3dhaXRfZm9yX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSB1bnNpZ25lZCBpbnQgdGltZW91dCkKK3N0YXRpYyBpbnQgbWY2eDRfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCXVuc2lnbmVkIGxvbmcgY29udGV4dCkKIHsKIAlzdHJ1Y3QgbWY2eDRfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgZW9sYzsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCi0Jd2hpbGUgKHRpbWVvdXQtLSkgewotCQllb2xjID0gaW9yZWFkMzIoZGV2cHJpdi0+Z3Bpb2NfUikgJiBNRjZYNF9HUElPQ19FT0xDOwotCQlpZiAoZW9sYykKLQkJCXJldHVybiAwOwotCi0JCXVkZWxheSgxKTsKLQl9Ci0KLQlyZXR1cm4gLUVUSU1FOworCXN0YXR1cyA9IGlvcmVhZDMyKGRldnByaXYtPmdwaW9jX1IpOworCWlmIChzdGF0dXMgJiBNRjZYNF9HUElPQ19FT0xDKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOwogfQogCiBzdGF0aWMgaW50IG1mNng0X2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtMTY4LDcgKzE2NSw3IEBACiAJCS8qIFRyaWdnZXIgQURDIGNvbnZlcnNpb24gYnkgcmVhZGluZyBBRFNUQVJUICovCiAJCWlvcmVhZDE2KGRldnByaXYtPmJhcjFfbWVtICsgTUY2WDRfQURTVEFSVF9SKTsKIAotCQlyZXQgPSBtZjZ4NF9haV93YWl0X2Zvcl9lb2MoZGV2LCAxMDApOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIG1mNng0X2FpX2VvYywgMCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuYwppbmRleCA5YzlhMGVlLi4xYTU3MmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmMKQEAgLTUyNyw5ICs1MjcsOSBAQAogaW50IG1pdGVfc3luY19pbnB1dF9kbWEoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuLAogCQkJc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMpCiB7CisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMgPSBhc3luYy0+c3ViZGV2aWNlOwogCWludCBjb3VudDsKIAl1bnNpZ25lZCBpbnQgbmJ5dGVzLCBvbGRfYWxsb2NfY291bnQ7Ci0JY29uc3QgdW5zaWduZWQgYnl0ZXNfcGVyX3NjYW4gPSBjZmNfYnl0ZXNfcGVyX3NjYW4oYXN5bmMtPnN1YmRldmljZSk7CiAKIAlvbGRfYWxsb2NfY291bnQgPSBhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50OwogCS8qIHdyaXRlIGFsbG9jIGFzIG11Y2ggYXMgd2UgY2FuICovCkBAIC01MzgsNyArNTM4LDcgQEAKIAluYnl0ZXMgPSBtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X2xiKG1pdGVfY2hhbik7CiAJaWYgKChpbnQpKG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfdWIobWl0ZV9jaGFuKSAtCiAJCSAgb2xkX2FsbG9jX2NvdW50KSA+IDApIHsKLQkJZGV2X3dhcm4oYXN5bmMtPnN1YmRldmljZS0+ZGV2aWNlLT5jbGFzc19kZXYsCisJCWRldl93YXJuKHMtPmRldmljZS0+Y2xhc3NfZGV2LAogCQkJICJtaXRlOiBETUEgb3ZlcndyaXRlIG9mIGZyZWUgYXJlYVxuIik7CiAJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOwogCQlyZXR1cm4gLTE7CkBAIC01NTEsMTIgKzU1MSw3IEBACiAJCXJldHVybiAwOwogCiAJY29tZWRpX2J1Zl93cml0ZV9mcmVlKGFzeW5jLCBjb3VudCk7Ci0KLQlhc3luYy0+c2Nhbl9wcm9ncmVzcyArPSBjb3VudDsKLQlpZiAoYXN5bmMtPnNjYW5fcHJvZ3Jlc3MgPj0gYnl0ZXNfcGVyX3NjYW4pIHsKLQkJYXN5bmMtPnNjYW5fcHJvZ3Jlc3MgJT0gYnl0ZXNfcGVyX3NjYW47Ci0JCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPUzsKLQl9CisJY2ZjX2luY19zY2FuX3Byb2dyZXNzKHMsIGNvdW50KTsKIAlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5oCmluZGV4IGJjZjJmOTcuLjc4ZjIzNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuaApAQCAtMjksOSArMjksOSBAQAogI2RlZmluZSBNQVhfTUlURV9ETUFfQ0hBTk5FTFMgOAogCiBzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvciB7Ci0JdTMyIGNvdW50OwotCXUzMiBhZGRyOwotCXUzMiBuZXh0OworCV9fbGUzMiBjb3VudDsKKwlfX2xlMzIgYWRkcjsKKwlfX2xlMzIgbmV4dDsKIAl1MzIgZGFyOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21wYzYyNC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21wYzYyNC5jCmluZGV4IGZlNDYyMWUuLmY3NzA0MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tcGM2MjQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXBjNjI0LmMKQEAgLTE0Miw4ICsxNDIsMTggQEAKIAkgfQogfTsKIAotLyogVGltZW91dCAyMDBtcyAqLwotI2RlZmluZSBUSU1FT1VUIDIwMAorc3RhdGljIGludCBtcGM2MjRfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIE1QQzYyNF9BREMpOworCWlmICgoc3RhdHVzICYgTVBDNjI0X0FEQlVTWSkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KIAogc3RhdGljIGludCBtcGM2MjRfYWlfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCkBAIC0xNTIsNyArMTYyLDcgQEAKIAlzdHJ1Y3QgbXBjNjI0X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IG4sIGk7CiAJdW5zaWduZWQgbG9uZyBpbnQgZGF0YV9pbiwgZGF0YV9vdXQ7Ci0JdW5zaWduZWQgY2hhciB1Y1BvcnQ7CisJaW50IHJldDsKIAogCS8qCiAJICogIFdBUk5JTkc6CkBAIC0xNzAsMTUgKzE4MCw5IEBACiAJCXVkZWxheSgxKTsKIAogCQkvKiAgV2FpdCBmb3IgdGhlIGNvbnZlcnNpb24gdG8gZW5kICovCi0JCWZvciAoaSA9IDA7IGkgPCBUSU1FT1VUOyBpKyspIHsKLQkJCXVjUG9ydCA9IGluYihkZXYtPmlvYmFzZSArIE1QQzYyNF9BREMpOwotCQkJaWYgKHVjUG9ydCAmIE1QQzYyNF9BREJVU1kpCi0JCQkJdWRlbGF5KDEwMDApOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpID09IFRJTUVPVVQpCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBtcGM2MjRfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKIAkJLyogIFN0YXJ0IHJlYWRpbmcgZGF0YSAqLwogCQlkYXRhX2luID0gMDsKQEAgLTM0MSw3ICszNDUsNyBAQAogCXMtPmxlbl9jaGFubGlzdCA9IDE7CiAJcy0+aW5zbl9yZWFkID0gbXBjNjI0X2FpX3JpbnNuOwogCi0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY29tZWRpX2RyaXZlciBtcGM2MjRfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL211bHRpcTMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tdWx0aXEzLmMKaW5kZXggM2NhNzU1ZS4uYjc0YjllOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL211bHRpcTMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXVsdGlxMy5jCkBAIC04MSwzNCArODEsNDQgQEAKIAl1bnNpZ25lZCBpbnQgYW9fcmVhZGJhY2tbMl07CiB9OwogCitzdGF0aWMgaW50IG11bHRpcTNfYWlfc3RhdHVzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW53KGRldi0+aW9iYXNlICsgTVVMVElRM19TVEFUVVMpOworCWlmIChzdGF0dXMgJiBjb250ZXh0KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IG11bHRpcTNfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7Ci0JaW50IGksIG47CisJaW50IG47CiAJaW50IGNoYW47CiAJdW5zaWduZWQgaW50IGhpLCBsbzsKKwlpbnQgcmV0OwogCiAJY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwogCW91dHcoTVVMVElRM19DT05UUk9MX01VU1QgfCBNVUxUSVEzX0FEX01VWF9FTiB8IChjaGFuIDw8IDMpLAogCSAgICAgZGV2LT5pb2Jhc2UgKyBNVUxUSVEzX0NPTlRST0wpOwogCi0JZm9yIChpID0gMDsgaSA8IE1VTFRJUTNfVElNRU9VVDsgaSsrKSB7Ci0JCWlmIChpbncoZGV2LT5pb2Jhc2UgKyBNVUxUSVEzX1NUQVRVUykgJiBNVUxUSVEzX1NUQVRVU19FT0MpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPT0gTVVMVElRM19USU1FT1VUKQotCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIG11bHRpcTNfYWlfc3RhdHVzLAorCQkJICAgICBNVUxUSVEzX1NUQVRVU19FT0MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CiAJCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBNVUxUSVEzX0FEX0NTKTsKLQkJZm9yIChpID0gMDsgaSA8IE1VTFRJUTNfVElNRU9VVDsgaSsrKSB7Ci0JCQlpZiAoaW53KGRldi0+aW9iYXNlICsKLQkJCQlNVUxUSVEzX1NUQVRVUykgJiBNVUxUSVEzX1NUQVRVU19FT0NfSSkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaSA9PSBNVUxUSVEzX1RJTUVPVVQpCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIG11bHRpcTNfYWlfc3RhdHVzLAorCQkJCSAgICAgTVVMVElRM19TVEFUVVNfRU9DX0kpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQloaSA9IGluYihkZXYtPmlvYmFzZSArIE1VTFRJUTNfQURfQ1MpOwogCQlsbyA9IGluYihkZXYtPmlvYmFzZSArIE1VTFRJUTNfQURfQ1MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY2MHguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NjB4LmMKaW5kZXggZGY0MmUzOS4uMGQ0YjkwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY2MHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjYweC5jCkBAIC00MCw2ICs0MCw3IEBACiAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAorI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogI2luY2x1ZGUgIm1pdGUuaCIKICNpbmNsdWRlICJuaV90aW8uaCIKIApAQCAtNzg5LDEzICs3OTAsNyBAQAogCXN0cnVjdCBuaV9ncGN0ICpjb3VudGVyID0gcy0+cHJpdmF0ZTsKIAogCW5pX3Rpb19oYW5kbGVfaW50ZXJydXB0KGNvdW50ZXIsIHMpOwotCWlmIChzLT5hc3luYy0+ZXZlbnRzKSB7Ci0JCWlmIChzLT5hc3luYy0+ZXZlbnRzICYgKENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1IgfAotCQkJCQlDT01FRElfQ0JfT1ZFUkZMT1cpKSB7Ci0JCQluaV82NjB4X2NhbmNlbChkZXYsIHMpOwotCQl9Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCX0KKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgbmlfNjYweF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKQEAgLTExODcsNyArMTE4Miw3IEBACiAJCWdsb2JhbF9pbnRlcnJ1cHRfY29uZmlnX2JpdHMgfD0gQ2FzY2FkZV9JbnRfRW5hYmxlX0JpdDsKIAluaV82NjB4X3dyaXRlX3JlZ2lzdGVyKGRldiwgMCwgZ2xvYmFsX2ludGVycnVwdF9jb25maWdfYml0cywKIAkJCSAgICAgICBOSTY2MFhfR0xPQkFMX0lOVF9DRkcpOwotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAibmlfNjYweDogJXMgYXR0YWNoZWRcbiIsIGRldi0+Ym9hcmRfbmFtZSk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY3MHguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NzB4LmMKaW5kZXggODU1MGZkYy4uMTAwMmNlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY3MHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjcweC5jCkBAIC0yNDYsOSArMjQ2LDYgQEAKIAkvKiBDb25maWcgb2YgYW8gcmVnaXN0ZXJzICovCiAJd3JpdGVsKDB4MDAsIGRldnByaXYtPm1pdGUtPmRhcV9pb19hZGRyICsgQU9fQ09OVFJPTF9PRkZTRVQpOwogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlczogJXMgYXR0YWNoZWRcbiIsCi0JCWRldi0+ZHJpdmVyLT5kcml2ZXJfbmFtZSwgZGV2LT5ib2FyZF9uYW1lKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRfYTIxNTAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hMjE1MC5jCmluZGV4IGY4M2ViOWUuLjRlMzliMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hMjE1MC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hMjE1MC5jCkBAIC0xODQsNyArMTg0LDYgQEAKIAl9CiAJLyogIGluaXRpYWxpemUgYXN5bmMgaGVyZSB0byBtYWtlIHN1cmUgcyBpcyBub3QgTlVMTCAqLwogCWFzeW5jID0gcy0+YXN5bmM7Ci0JYXN5bmMtPmV2ZW50cyA9IDA7CiAJY21kID0gJmFzeW5jLT5jbWQ7CiAKIAlzdGF0dXMgPSBpbncoZGV2LT5pb2Jhc2UgKyBTVEFUVVNfUkVHKTsKQEAgLTE5NiwxNSArMTk1LDE0IEBACiAKIAlpZiAoc3RhdHVzICYgT1ZGTF9CSVQpIHsKIAkJY29tZWRpX2Vycm9yKGRldiwgImZpZm8gb3ZlcmZsb3ciKTsKLQkJYTIxNTBfY2FuY2VsKGRldiwgcyk7CiAJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SIHwgQ09NRURJX0NCX0VPQTsKKwkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAl9CiAKIAlpZiAoKHN0YXR1cyAmIERNQV9UQ19CSVQpID09IDApIHsKIAkJY29tZWRpX2Vycm9yKGRldiwgImNhdWdodCBub24tZG1hIGludGVycnVwdD8gIEFib3J0aW5nLiIpOwotCQlhMjE1MF9jYW5jZWwoZGV2LCBzKTsKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KIApAQCAtMjQ5LDcgKzI0Nyw2IEBACiAJCWNmY193cml0ZV90b19idWZmZXIocywgZHBudCk7CiAJCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKIAkJCWlmICgtLWRldnByaXYtPmNvdW50ID09IDApIHsJLyogZW5kIG9mIGFjcXVpc2l0aW9uICovCi0JCQkJYTIxNTBfY2FuY2VsKGRldiwgcyk7CiAJCQkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMjY1LDcgKzI2Miw3IEBACiAKIAlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKIAotCWNvbWVkaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAKIAkvKiBjbGVhciBpbnRlcnJ1cHQgKi8KIAlvdXR3KDB4MDAsIGRldi0+aW9iYXNlICsgRE1BX1RDX0NMRUFSX1JFRyk7CkBAIC00ODgsMTMgKzQ4NSwyNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGEyMTUwX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQl1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIFNUQVRVU19SRUcpOworCWlmIChzdGF0dXMgJiBGTkVfQklUKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IGEyMTUwX2FpX3JpbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYTIxNTBfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgaSwgbjsKLQlzdGF0aWMgY29uc3QgaW50IHRpbWVvdXQgPSAxMDAwMDA7Ci0Jc3RhdGljIGNvbnN0IGludCBmaWx0ZXJfZGVsYXkgPSAzNjsKKwl1bnNpZ25lZCBpbnQgbjsKKwlpbnQgcmV0OwogCiAJLyogIGNsZWFyIGZpZm8gYW5kIHJlc2V0IHRyaWdnZXJpbmcgY2lyY3VpdHJ5ICovCiAJb3V0dygwLCBkZXYtPmlvYmFzZSArIEZJRk9fUkVTRVRfUkVHKTsKQEAgLTUyNCwzMCArNTMzLDIwIEBACiAJICogdGhlcmUgaXMgYSAzNS42IHNhbXBsZSBkZWxheSBmb3IgZGF0YSB0byBnZXQgdGhyb3VnaCB0aGUKIAkgKiBhbnRpYWxpYXMgZmlsdGVyCiAJICovCi0JZm9yIChuID0gMDsgbiA8IGZpbHRlcl9kZWxheTsgbisrKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCB0aW1lb3V0OyBpKyspIHsKLQkJCWlmIChpbncoZGV2LT5pb2Jhc2UgKyBTVEFUVVNfUkVHKSAmIEZORV9CSVQpCi0JCQkJYnJlYWs7Ci0JCQl1ZGVsYXkoMSk7Ci0JCX0KLQkJaWYgKGkgPT0gdGltZW91dCkgewotCQkJY29tZWRpX2Vycm9yKGRldiwgInRpbWVvdXQiKTsKLQkJCXJldHVybiAtRVRJTUU7Ci0JCX0KKwlmb3IgKG4gPSAwOyBuIDwgMzY7IG4rKykgeworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGEyMTUwX2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCiAJCWludyhkZXYtPmlvYmFzZSArIEZJRk9fREFUQV9SRUcpOwogCX0KIAogCS8qICByZWFkIGRhdGEgKi8KIAlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCB0aW1lb3V0OyBpKyspIHsKLQkJCWlmIChpbncoZGV2LT5pb2Jhc2UgKyBTVEFUVVNfUkVHKSAmIEZORV9CSVQpCi0JCQkJYnJlYWs7Ci0JCQl1ZGVsYXkoMSk7Ci0JCX0KLQkJaWYgKGkgPT0gdGltZW91dCkgewotCQkJY29tZWRpX2Vycm9yKGRldiwgInRpbWVvdXQiKTsKLQkJCXJldHVybiAtRVRJTUU7Ci0JCX0KKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBhMjE1MF9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwogCQlkYXRhW25dID0gaW53KGRldi0+aW9iYXNlICsgRklGT19EQVRBX1JFRyk7CiAJCWRhdGFbbl0gXj0gMHg4MDAwOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pbzE2ZC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvMTZkLmMKaW5kZXggZThjZDVkZC4uNDI2MjM4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvMTZkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvMTZkLmMKQEAgLTk2LDcgKzk2LDYgQEAKICNkZWZpbmUgQ0xPQ0tfMTAwX0haCTB4OEYyNQogLyogT3RoZXIgbWlzY2VsbGFuZW91cyBkZWZpbmVzICovCiAjZGVmaW5lIEFUTUlPMTZEX1NJWkUJMzIJLyogYnVzIGFkZHJlc3MgcmFuZ2UgKi8KLSNkZWZpbmUgQVRNSU8xNkRfVElNRU9VVCAxMAogCiBzdHJ1Y3QgYXRtaW8xNl9ib2FyZF90IHsKIApAQCAtNDQ4LDE2ICs0NDcsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogTW9kZSAwIGlzIHVzZWQgdG8gZ2V0IGEgc2luZ2xlIGNvbnZlcnNpb24gb24gZGVtYW5kICovCitzdGF0aWMgaW50IGF0bWlvMTZkX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIFNUQVRfUkVHKTsKKwlpZiAoc3RhdHVzICYgU1RBVF9BRF9DT05WQVZBSUwpCisJCXJldHVybiAwOworCWlmIChzdGF0dXMgJiBTVEFUX0FEX09WRVJGTE9XKSB7CisJCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBBRF9DTEVBUl9SRUcpOworCQlyZXR1cm4gLUVPVkVSRkxPVzsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBhdG1pbzE2ZF9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhdG1pbzE2ZF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBpLCB0OworCWludCBpOwogCWludCBjaGFuOwogCWludCBnYWluOwotCWludCBzdGF0dXM7CisJaW50IHJldDsKIAogCWNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAlnYWluID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOwpAQCAtNDczLDI2ICs0ODgsMTcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CiAJCS8qIHN0YXJ0IHRoZSBjb252ZXJzaW9uICovCiAJCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBTVEFSVF9DT05WRVJUX1JFRyk7CisKIAkJLyogd2FpdCBmb3IgaXQgdG8gZmluaXNoICovCi0JCWZvciAodCA9IDA7IHQgPCBBVE1JTzE2RF9USU1FT1VUOyB0KyspIHsKLQkJCS8qIGNoZWNrIGNvbnZlcnNpb24gc3RhdHVzICovCi0JCQlzdGF0dXMgPSBpbncoZGV2LT5pb2Jhc2UgKyBTVEFUX1JFRyk7Ci0JCQlpZiAoc3RhdHVzICYgU1RBVF9BRF9DT05WQVZBSUwpIHsKLQkJCQkvKiByZWFkIHRoZSBkYXRhIG5vdyAqLwotCQkJCWRhdGFbaV0gPSBpbncoZGV2LT5pb2Jhc2UgKyBBRF9GSUZPX1JFRyk7Ci0JCQkJLyogY2hhbmdlIHRvIHR3bydzIGNvbXBsZW1lbnQgaWYgbmVlZCBiZSAqLwotCQkJCWlmIChkZXZwcml2LT5hZGNfY29kaW5nID09IGFkY18yY29tcCkKLQkJCQkJZGF0YVtpXSBePSAweDgwMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChzdGF0dXMgJiBTVEFUX0FEX09WRVJGTE9XKSB7Ci0JCQkJb3V0dygwLCBkZXYtPmlvYmFzZSArIEFEX0NMRUFSX1JFRyk7Ci0JCQkJcmV0dXJuIC1FVElNRTsKLQkJCX0KLQkJfQotCQkvKiBlbmQgd2FpdGluZywgbm93IGNoZWNrIGlmIGl0IHRpbWVkIG91dCAqLwotCQlpZiAodCA9PSBBVE1JTzE2RF9USU1FT1VUKQotCQkJcmV0dXJuIC1FVElNRTsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBhdG1pbzE2ZF9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQkvKiByZWFkIHRoZSBkYXRhIG5vdyAqLworCQlkYXRhW2ldID0gaW53KGRldi0+aW9iYXNlICsgQURfRklGT19SRUcpOworCQkvKiBjaGFuZ2UgdG8gdHdvJ3MgY29tcGxlbWVudCBpZiBuZWVkIGJlICovCisJCWlmIChkZXZwcml2LT5hZGNfY29kaW5nID09IGFkY18yY29tcCkKKwkJCWRhdGFbaV0gXj0gMHg4MDA7CiAJfQogCiAJcmV0dXJuIGk7CkBAIC03MjMsMTAgKzcyOSwxMyBAQAogCiAJLyogODI1NSBzdWJkZXZpY2UgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1szXTsKLQlpZiAoYm9hcmQtPmhhc184MjU1KQotCQlzdWJkZXZfODI1NV9pbml0KGRldiwgcywgTlVMTCwgZGV2LT5pb2Jhc2UpOwotCWVsc2UKKwlpZiAoYm9hcmQtPmhhc184MjU1KSB7CisJCXJldCA9IHN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBOVUxMLCBkZXYtPmlvYmFzZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CisJfQogCiAvKiBkb24ndCB5ZXQga25vdyBob3cgdG8gZGVhbCB3aXRoIGNvdW50ZXIvdGltZXJzICovCiAjaWYgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2RhcV83MDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9kYXFfNzAwLmMKaW5kZXggZTRjZGNhMy4uMTcxYTcxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2RhcV83MDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxXzcwMC5jCkBAIC0xMDksMTQgKzEwOSwzMSBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCitzdGF0aWMgaW50IGRhcTcwMF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBTVEFfUjIpOworCWlmICgoc3RhdHVzICYgMHgwMykpCisJCXJldHVybiAtRU9WRVJGTE9XOworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIFNUQV9SMSk7CisJaWYgKChzdGF0dXMgJiAweDAyKSkKKwkJcmV0dXJuIC1FTk9EQVRBOworCWlmICgoc3RhdHVzICYgMHgxMSkgPT0gMHgwMSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBkYXE3MDBfYWlfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7Ci0JaW50IG4sIGksIGNoYW47CisJaW50IG4sIGNoYW47CiAJaW50IGQ7Ci0JdW5zaWduZWQgaW50IHN0YXR1czsKLQllbnVtIHsgVElNRU9VVCA9IDEwMCB9OworCWludCByZXQ7CiAKIAljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJLyogd3JpdGUgY2hhbm5lbCB0byBtdWx0aXBsZXhlciAqLwpAQCAtMTMwLDMwICsxNDcsMTIgQEAKIAkJb3V0YigweDMwLCBkZXYtPmlvYmFzZSArIENNT19SKTsgLyogbW9kZSAwIG91dDAgTCwgZnJvbSBIICovCiAJCS8qIG1vZGUgMSBvdXQwIEgsIEwgdG8gSCwgc3RhcnQgY29udmVyc2lvbiAqLwogCQlvdXRiKDB4MzIsIGRldi0+aW9iYXNlICsgQ01PX1IpOworCiAJCS8qIHdhaXQgZm9yIGNvbnZlcnNpb24gdG8gZW5kICovCi0JCWZvciAoaSA9IDA7IGkgPCBUSU1FT1VUOyBpKyspIHsKLQkJCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIFNUQV9SMik7Ci0JCQlpZiAoKHN0YXR1cyAmIDB4MDMpICE9IDApIHsKLQkJCQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwKLQkJCQkJICJPdmVyZmxvdy9ydW4gRXJyb3JcbiIpOwotCQkJCXJldHVybiAtRU9WRVJGTE9XOwotCQkJfQotCQkJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgU1RBX1IxKTsKLQkJCWlmICgoc3RhdHVzICYgMHgwMikgIT0gMCkgewotCQkJCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiRGF0YSBFcnJvclxuIik7Ci0JCQkJcmV0dXJuIC1FTk9EQVRBOwotCQkJfQotCQkJaWYgKChzdGF0dXMgJiAweDExKSA9PSAweDAxKSB7Ci0JCQkJLyogQURDIGNvbnZlcnNpb24gY29tcGxldGUgKi8KLQkJCQlicmVhazsKLQkJCX0KLQkJCXVkZWxheSgxKTsKLQkJfQotCQlpZiAoaSA9PSBUSU1FT1VUKSB7Ci0JCQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwKLQkJCQkgInRpbWVvdXQgZHVyaW5nIEFEQyBjb252ZXJzaW9uXG4iKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCQl9CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZGFxNzAwX2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCiAJCS8qIHJlYWQgZGF0YSAqLwogCQlkID0gaW53KGRldi0+aW9iYXNlICsgQURGSUZPX1IpOwogCQkvKiBtYW5nbGUgdGhlIGRhdGEgYXMgbmVjZXNzYXJ5ICovCkBAIC0yMjksMTEgKzIyOCw2IEBACiAJcy0+aW5zbl9yZWFkID0gZGFxNzAwX2FpX3JpbnNuOwogCWRhcTcwMF9haV9jb25maWcoZGV2LCBzKTsKIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXM6ICVzLCBpbyAweCVseFxuIiwKLQkJZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lLAotCQlkZXYtPmJvYXJkX25hbWUsCi0JCWRldi0+aW9iYXNlKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxX2RpbzI0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxX2RpbzI0LmMKaW5kZXggMzM1ZWEzNC4uOTI1ZTgyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2RhcV9kaW8yNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9kYXFfZGlvMjQuYwpAQCAtMyw4ICszLDggQEAKICAgICBEcml2ZXIgZm9yIE5hdGlvbmFsIEluc3RydW1lbnRzIFBDTUNJQSBEQVEtQ2FyZCBESU8tMjQKICAgICBDb3B5cmlnaHQgKEMpIDIwMDIgRGFuaWVsIFZlY2lubyBDYXN0ZWwgPGR2ZWNpbm9AYWJsZS5lcz4KIAotICAgIFBDTUNJQSBjcmFwIGF0IGVuZCBvZiBmaWxlIGlzIGFkYXB0ZWQgZnJvbSBkdW1teV9jcy5jIDEuMzEgMjAwMS8wOC8yNCAxMjoxMzoxMwotICAgIGZyb20gdGhlIHBjbWNpYSBwYWNrYWdlLgorICAgIFBDTUNJQSBjcmFwIGF0IGVuZCBvZiBmaWxlIGlzIGFkYXB0ZWQgZnJvbSBkdW1teV9jcy5jIDEuMzEKKyAgICAyMDAxLzA4LzI0IDEyOjEzOjEzIGZyb20gdGhlIHBjbWNpYSBwYWNrYWdlLgogICAgIFRoZSBpbml0aWFsIGRldmVsb3BlciBvZiB0aGUgcGNtY2lhIGR1bW15X2NzLmMgY29kZSBpcyBEYXZpZCBBLiBIaW5kcwogICAgIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uICBQb3J0aW9ucyBjcmVhdGVkIGJ5IERhdmlkIEEuIEhpbmRzCiAgICAgYXJlIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwYy5jCmluZGV4IDA1MTI0NDUuLmY0MjE2ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwYy5jCkBAIC03Myw3ICs3Myw2IEBACiAjaW5jbHVkZSAibmlfbGFicGNfaXNhZG1hLmgiCiAKICNkZWZpbmUgTEFCUENfU0laRQkJMHgyMAkvKiBzaXplIG9mIElTQSBpbyByZWdpb24gKi8KLSNkZWZpbmUgTEFCUENfQURDX1RJTUVPVVQJMTAwMAogCiBlbnVtIHNjYW5fbW9kZSB7CiAJTU9ERV9TSU5HTEVfQ0hBTiwKQEAgLTMwOCwxOSArMzA3LDE3IEBACiAJbGFicGNfcmVhZF9hZGNfZmlmbyhkZXYpOwogfQogCi1zdGF0aWMgaW50IGxhYnBjX2FpX3dhaXRfZm9yX2RhdGEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgIGludCB0aW1lb3V0KQorc3RhdGljIGludCBsYWJwY19haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJdW5zaWduZWQgbG9uZyBjb250ZXh0KQogewogCXN0cnVjdCBsYWJwY19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgewotCQlkZXZwcml2LT5zdGF0MSA9IGRldnByaXYtPnJlYWRfYnl0ZShkZXYtPmlvYmFzZSArIFNUQVQxX1JFRyk7Ci0JCWlmIChkZXZwcml2LT5zdGF0MSAmIFNUQVQxX0RBVkFJTCkKLQkJCXJldHVybiAwOwotCQl1ZGVsYXkoMSk7Ci0JfQotCXJldHVybiAtRVRJTUU7CisJZGV2cHJpdi0+c3RhdDEgPSBkZXZwcml2LT5yZWFkX2J5dGUoZGV2LT5pb2Jhc2UgKyBTVEFUMV9SRUcpOworCWlmIChkZXZwcml2LT5zdGF0MSAmIFNUQVQxX0RBVkFJTCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKIH0KIAogc3RhdGljIGludCBsYWJwY19haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTM2Myw3ICszNjAsNyBAQAogCQkvKiB0cmlnZ2VyIGNvbnZlcnNpb24gKi8KIAkJZGV2cHJpdi0+d3JpdGVfYnl0ZSgweDEsIGRldi0+aW9iYXNlICsgQURDX1NUQVJUX0NPTlZFUlRfUkVHKTsKIAotCQlyZXQgPSBsYWJwY19haV93YWl0X2Zvcl9kYXRhKGRldiwgTEFCUENfQURDX1RJTUVPVVQpOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGxhYnBjX2FpX2VvYywgMCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCkBAIC05NTAsNyArOTQ3LDYgQEAKIAogCWFzeW5jID0gcy0+YXN5bmM7CiAJY21kID0gJmFzeW5jLT5jbWQ7Ci0JYXN5bmMtPmV2ZW50cyA9IDA7CiAKIAkvKiByZWFkIGJvYXJkIHN0YXR1cyAqLwogCWRldnByaXYtPnN0YXQxID0gZGV2cHJpdi0+cmVhZF9ieXRlKGRldi0+aW9iYXNlICsgU1RBVDFfUkVHKTsKQEAgLTk2OCw3ICs5NjQsNyBAQAogCQkvKiBjbGVhciBlcnJvciBpbnRlcnJ1cHQgKi8KIAkJZGV2cHJpdi0+d3JpdGVfYnl0ZSgweDEsIGRldi0+aW9iYXNlICsgQURDX0ZJRk9fQ0xFQVJfUkVHKTsKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJY29tZWRpX2Vycm9yKGRldiwgIm92ZXJydW4iKTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KQEAgLTk4OCw3ICs5ODQsNyBAQAogCQkvKiAgY2xlYXIgZXJyb3IgaW50ZXJydXB0ICovCiAJCWRldnByaXYtPndyaXRlX2J5dGUoMHgxLCBkZXYtPmlvYmFzZSArIEFEQ19GSUZPX0NMRUFSX1JFRyk7CiAJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SIHwgQ09NRURJX0NCX0VPQTsKLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAJCWNvbWVkaV9lcnJvcihkZXYsICJvdmVyZmxvdyIpOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQpAQCAtOTk2LDIwICs5OTIsMTcgQEAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0VYVCkgewogCQlpZiAoZGV2cHJpdi0+c3RhdDIgJiBTVEFUMl9PVVRBMSkgewogCQkJbGFicGNfZHJhaW5fZHJlZ3MoZGV2KTsKLQkJCWxhYnBjX2NhbmNlbChkZXYsIHMpOwogCQkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwogCQl9CiAJfQogCiAJLyogVFJJR19DT1VOVCBlbmQgb2YgYWNxdWlzaXRpb24gKi8KIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7Ci0JCWlmIChkZXZwcml2LT5jb3VudCA9PSAwKSB7Ci0JCQlsYWJwY19jYW5jZWwoZGV2LCBzKTsKKwkJaWYgKGRldnByaXYtPmNvdW50ID09IDApCiAJCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCX0KIAl9CiAKLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jb21tb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY29tbW9uLmMKaW5kZXggNDU3Yjg4NC4uOGEwZTNiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jb21tb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NvbW1vbi5jCkBAIC0yNTYsNyArMjU2LDYgQEAKIHN0YXRpYyB2b2lkIGNhbGRhY19zZXR1cChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyk7CiBzdGF0aWMgaW50IG5pX3JlYWRfZWVwcm9tKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBhZGRyKTsKIAotc3RhdGljIGludCBuaV9haV9yZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyk7CiAjaWZuZGVmIFBDSURNQQogc3RhdGljIHZvaWQgbmlfaGFuZGxlX2ZpZm9faGFsZl9mdWxsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCBuaV9hb19maWZvX2hhbGZfZW1wdHkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTI3MiwxNSArMjcxLDEyIEBACiBzdGF0aWMgaW50IG5pX2FvX2ludHRyaWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgdW5zaWduZWQgaW50IHRyaWdudW0pOwogCi1zdGF0aWMgaW50IG5pX2FvX3Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKTsKLQogc3RhdGljIGludCBuaV84MjU1X2NhbGxiYWNrKGludCBkaXIsIGludCBwb3J0LCBpbnQgZGF0YSwgdW5zaWduZWQgbG9uZyBhcmcpOwogCiAjaWZkZWYgUENJRE1BCiBzdGF0aWMgaW50IG5pX2dwY3RfY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKTsKK3N0YXRpYyBpbnQgbmlfZ3BjdF9jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpOwogI2VuZGlmCi1zdGF0aWMgaW50IG5pX2dwY3RfY2FuY2VsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKTsKIHN0YXRpYyB2b2lkIGhhbmRsZV9ncGN0X2ludGVycnVwdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCSAgdW5zaWduZWQgc2hvcnQgY291bnRlcl9pbmRleCk7CiAKQEAgLTY4NywxMiArNjgzLDIyIEBACiB7CiAJY29uc3Qgc3RydWN0IG5pX2JvYXJkX3N0cnVjdCAqYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKIAlzdHJ1Y3QgbmlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlzdGF0aWMgY29uc3QgaW50IHRpbWVvdXQgPSAxMDAwMDsKKwlpbnQgaTsKIAogCWlmIChib2FyZC0+cmVnX3R5cGUgPT0gbmlfcmVnXzYxNDMpIHsKIAkJLyogIEZsdXNoIHRoZSA2MTQzIGRhdGEgRklGTyAqLwogCQluaV93cml0ZWwoMHgxMCwgQUlGSUZPX0NvbnRyb2xfNjE0Myk7CS8qICBGbHVzaCBmaWZvICovCiAJCW5pX3dyaXRlbCgweDAwLCBBSUZJRk9fQ29udHJvbF82MTQzKTsJLyogIEZsdXNoIGZpZm8gKi8KLQkJd2hpbGUgKG5pX3JlYWRsKEFJRklGT19TdGF0dXNfNjE0MykgJiAweDEwKSA7CS8qICBXYWl0IGZvciBjb21wbGV0ZSAqLworCQkvKiAgV2FpdCBmb3IgY29tcGxldGUgKi8KKwkJZm9yIChpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgeworCQkJaWYgKCEobmlfcmVhZGwoQUlGSUZPX1N0YXR1c182MTQzKSAmIDB4MTApKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDEpOworCQl9CisJCWlmIChpID09IHRpbWVvdXQpIHsKKwkJCWNvbWVkaV9lcnJvcihkZXYsICJGSUZPIGZsdXNoIHRpbWVvdXQuIik7CisJCX0KIAl9IGVsc2UgewogCQlkZXZwcml2LT5zdGNfd3JpdGV3KGRldiwgMSwgQURDX0ZJRk9fQ2xlYXIpOwogCQlpZiAoYm9hcmQtPnJlZ190eXBlID09IG5pX3JlZ182MjV4KSB7CkBAIC05MzcsMzIgKzk0Myw2IEBACiAJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwogfQogCi1zdGF0aWMgdm9pZCBuaV9ldmVudChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKLXsKLQlpZiAocy0+Ci0JICAgIGFzeW5jLT5ldmVudHMgJiAoQ09NRURJX0NCX0VSUk9SIHwgQ09NRURJX0NCX09WRVJGTE9XIHwKLQkJCSAgICAgQ09NRURJX0NCX0VPQSkpIHsKLQkJc3dpdGNoIChzLT5pbmRleCkgewotCQljYXNlIE5JX0FJX1NVQkRFVjoKLQkJCW5pX2FpX3Jlc2V0KGRldiwgcyk7Ci0JCQlicmVhazsKLQkJY2FzZSBOSV9BT19TVUJERVY6Ci0JCQluaV9hb19yZXNldChkZXYsIHMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTklfR1BDVDBfU1VCREVWOgotCQljYXNlIE5JX0dQQ1QxX1NVQkRFVjoKLQkJCW5pX2dwY3RfY2FuY2VsKGRldiwgcyk7Ci0JCQlicmVhazsKLQkJY2FzZSBOSV9ESU9fU1VCREVWOgotCQkJbmlfY2Rpb19jYW5jZWwoZGV2LCBzKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JY29tZWRpX2V2ZW50KGRldiwgcyk7Ci19Ci0KIHN0YXRpYyB2b2lkIGhhbmRsZV9ncGN0X2ludGVycnVwdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCSAgdW5zaWduZWQgc2hvcnQgY291bnRlcl9pbmRleCkKIHsKQEAgLTk3NCw4ICs5NTQsNyBAQAogCiAJbmlfdGlvX2hhbmRsZV9pbnRlcnJ1cHQoJmRldnByaXYtPmNvdW50ZXJfZGV2LT5jb3VudGVyc1tjb3VudGVyX2luZGV4XSwKIAkJCQlzKTsKLQlpZiAocy0+YXN5bmMtPmV2ZW50cykKLQkJbmlfZXZlbnQoZGV2LCBzKTsKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogI2VuZGlmCiB9CiAKQEAgLTEwMzMsNyArMTAxMiw3IEBACiAJCQlpZiAoY29tZWRpX2lzX3N1YmRldmljZV9ydW5uaW5nKHMpKSB7CiAJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PQogCQkJCSAgICBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOwotCQkJCW5pX2V2ZW50KGRldiwgcyk7CisJCQkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJCX0KIAkJCXJldHVybjsKIAkJfQpAQCAtMTA0OCw4ICsxMDI3LDcgQEAKIAkJCWlmIChzdGF0dXMgJiAoQUlfT3ZlcnJ1bl9TdCB8IEFJX092ZXJmbG93X1N0KSkKIAkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKIAotCQkJbmlfZXZlbnQoZGV2LCBzKTsKLQorCQkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJCXJldHVybjsKIAkJfQogCQlpZiAoc3RhdHVzICYgQUlfU0NfVENfU3QpIHsKQEAgLTEwNzYsNyArMTA1NCw3IEBACiAJaWYgKChzdGF0dXMgJiBBSV9TVE9QX1N0KSkKIAkJbmlfaGFuZGxlX2VvcyhkZXYsIHMpOwogCi0JbmlfZXZlbnQoZGV2LCBzKTsKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogfQogCiBzdGF0aWMgdm9pZCBhY2tfYl9pbnRlcnJ1cHQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgYl9zdGF0dXMpCkBAIC0xMTUxLDcgKzExMjksNyBAQAogCX0KICNlbmRpZgogCi0JbmlfZXZlbnQoZGV2LCBzKTsKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogfQogCiAjaWZuZGVmIFBDSURNQQpAQCAtMzY2Miw3ICszNjQwLDcgQEAKIAkJCSAgTV9PZmZzZXRfQ0RJT19Db21tYW5kKTsKIAkJLyogcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOyAqLwogCX0KLQluaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiB9CiAKIHN0YXRpYyBpbnQgbmlfc2VyaWFsX2luc25fY29uZmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC00MjgyLDEwICs0MjYwLDE0IEBACiAKIAkvKiA4MjU1IGRldmljZSAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzW05JXzgyNTVfRElPX1NVQkRFVl07Ci0JaWYgKGJvYXJkLT5oYXNfODI1NSkKLQkJc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIG5pXzgyNTVfY2FsbGJhY2ssICh1bnNpZ25lZCBsb25nKWRldik7Ci0JZWxzZQorCWlmIChib2FyZC0+aGFzXzgyNTUpIHsKKwkJcmV0ID0gc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIG5pXzgyNTVfY2FsbGJhY2ssCisJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWRldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CisJfQogCiAJLyogZm9ybWVybHkgZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIvdGltZXIgZGV2aWNlLCBidXQgbm8gbG9uZ2VyIHVzZWQgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1tOSV9VTlVTRURfU1VCREVWXTsKQEAgLTQzOTMsNiArNDM3NSw5IEBACiAJCQkJCQkJJm5pX2dwY3RfcmVhZF9yZWdpc3RlciwKIAkJCQkJCQljb3VudGVyX3ZhcmlhbnQsCiAJCQkJCQkJTlVNX0dQQ1QpOworCWlmICghZGV2cHJpdi0+Y291bnRlcl9kZXYpCisJCXJldHVybiAtRU5PTUVNOworCiAJLyogR2VuZXJhbCBwdXJwb3NlIGNvdW50ZXJzICovCiAJZm9yIChqID0gMDsgaiA8IE5VTV9HUENUOyArK2opIHsKIAkJcyA9ICZkZXYtPnN1YmRldmljZXNbTklfR1BDVF9TVUJERVYoaildOwpAQCAtNDQ4Myw3ICs0NDY4LDYgQEAKIAkJbmlfd3JpdGViKDB4MCwgTV9PZmZzZXRfQU9fQ2FsaWJyYXRpb24pOwogCX0KIAotCXByaW50aygiXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDk5Miw5ICs0OTc2LDkgQEAKIH0KICNlbmRpZgogCisjaWZkZWYgUENJRE1BCiBzdGF0aWMgaW50IG5pX2dwY3RfY2FuY2VsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewotI2lmZGVmIFBDSURNQQogCXN0cnVjdCBuaV9ncGN0ICpjb3VudGVyID0gcy0+cHJpdmF0ZTsKIAlpbnQgcmV0dmFsOwogCkBAIC01MDAyLDEwICs0OTg2LDggQEAKIAluaV9lX3Nlcmllc19lbmFibGVfc2Vjb25kX2lycShkZXYsIGNvdW50ZXItPmNvdW50ZXJfaW5kZXgsIDApOwogCW5pX3JlbGVhc2VfZ3BjdF9taXRlX2NoYW5uZWwoZGV2LCBjb3VudGVyLT5jb3VudGVyX2luZGV4KTsKIAlyZXR1cm4gcmV0dmFsOwotI2Vsc2UKLQlyZXR1cm4gMDsKLSNlbmRpZgogfQorI2VuZGlmCiAKIC8qCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaWRpby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaWRpby5jCmluZGV4IDMwYzQ2YTMuLjg1YWMyZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2lkaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMKQEAgLTI2Myw5ICsyNjMsNiBAQAogI2RlZmluZSBJbnRFbiAoVHJhbnNmZXJSZWFkeXxDb3VudEV4cGlyZWR8V2FpdGVkfFByaW1hcnlUQ3xTZWNvbmRhcnlUQykKICNlbmRpZgogCi1zdGF0aWMgaW50IG5pX3BjaWRpb19jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyk7Ci0KIGVudW0gbmlkaW9fYm9hcmRpZCB7CiAJQk9BUkRfUENJRElPXzMySFMsCiAJQk9BUkRfUFhJNjUzMywKQEAgLTM1MywxNyArMzUwLDYgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZwcml2LT5taXRlX2NoYW5uZWxfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBuaV9wY2lkaW9fZXZlbnQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKLXsKLQlpZiAocy0+Ci0JICAgIGFzeW5jLT5ldmVudHMgJiAoQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUiB8Ci0JCQkgICAgIENPTUVESV9DQl9PVkVSRkxPVykpIHsKLQkJbmlfcGNpZGlvX2NhbmNlbChkZXYsIHMpOwotCX0KLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLX0KLQogc3RhdGljIGludCBuaV9wY2lkaW9fcG9sbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgbmlkaW85Nl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwpAQCAtNTAxLDcgKzQ4Nyw3IEBACiAJfQogCiBvdXQ6Ci0JbmlfcGNpZGlvX2V2ZW50KGRldiwgcyk7CisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKICNpZiAwCiAJaWYgKCF0YWcpIHsKIAkJd3JpdGViKDB4MDMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpbWlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpbWlvLmMKaW5kZXggMGVkOTgwNC4uZDQwZGYwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaW1pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2ltaW8uYwpAQCAtMTU1MSw3ICsxNTUxLDcgQEAKIAlkZXYtPnN1YmRldmljZXNbTklfR1BDVF9TVUJERVYoMSldLmJ1Zl9jaGFuZ2UgPSAmcGNpbWlvX2dwY3QxX2NoYW5nZTsKIAlkZXYtPnN1YmRldmljZXNbTklfRElPX1NVQkRFVl0uYnVmX2NoYW5nZSA9ICZwY2ltaW9fZGlvX2NoYW5nZTsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcGNpbWlvX2FpX2NoYW5nZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3Rpby5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3Rpby5oCmluZGV4IDY4Mzc4ZGEuLjEwNTZiZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV90aW8uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfdGlvLmgKQEAgLTExNSwxMCArMTE1LDEwIEBACiAKIHN0cnVjdCBuaV9ncGN0X2RldmljZSB7CiAJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldjsKLQl2b2lkICgqd3JpdGVfcmVnaXN0ZXIpIChzdHJ1Y3QgbmlfZ3BjdCAqY291bnRlciwgdW5zaWduZWQgYml0cywKLQkJCQllbnVtIG5pX2dwY3RfcmVnaXN0ZXIgcmVnKTsKLQl1bnNpZ25lZCAoKnJlYWRfcmVnaXN0ZXIpIChzdHJ1Y3QgbmlfZ3BjdCAqY291bnRlciwKLQkJCQkgICBlbnVtIG5pX2dwY3RfcmVnaXN0ZXIgcmVnKTsKKwl2b2lkICgqd3JpdGVfcmVnaXN0ZXIpKHN0cnVjdCBuaV9ncGN0ICpjb3VudGVyLCB1bnNpZ25lZCBiaXRzLAorCQkJICAgICAgIGVudW0gbmlfZ3BjdF9yZWdpc3RlciByZWcpOworCXVuc2lnbmVkICgqcmVhZF9yZWdpc3Rlcikoc3RydWN0IG5pX2dwY3QgKmNvdW50ZXIsCisJCQkJICBlbnVtIG5pX2dwY3RfcmVnaXN0ZXIgcmVnKTsKIAllbnVtIG5pX2dwY3RfdmFyaWFudCB2YXJpYW50OwogCXN0cnVjdCBuaV9ncGN0ICpjb3VudGVyczsKIAl1bnNpZ25lZCBudW1fY291bnRlcnM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzExLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzExLmMKaW5kZXggZjBmYzEyMy4uN2MwM2E1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MTEuYwpAQCAtMjUzLDE4ICsyNTMsMTcgQEAKIAlvdXRiKG11eCB8IFBDTDcxMV9NVVhfQ0hBTihjaGFuKSwgZGV2LT5pb2Jhc2UgKyBQQ0w3MTFfTVVYX1JFRyk7CiB9CiAKLXN0YXRpYyBpbnQgcGNsNzExX2FpX3dhaXRfZm9yX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgdW5zaWduZWQgaW50IHRpbWVvdXQpCitzdGF0aWMgaW50IHBjbDcxMV9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQogewotCXVuc2lnbmVkIGludCBtc2I7CisJdW5zaWduZWQgaW50IHN0YXR1czsKIAotCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJbXNiID0gaW5iKGRldi0+aW9iYXNlICsgUENMNzExX0FJX01TQl9SRUcpOwotCQlpZiAoKG1zYiAmIFBDTDcxMV9BSV9NU0JfRFJEWSkgPT0gMCkKLQkJCXJldHVybiAwOwotCQl1ZGVsYXkoMSk7Ci0JfQotCXJldHVybiAtRVRJTUU7CisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgUENMNzExX0FJX01TQl9SRUcpOworCWlmICgoc3RhdHVzICYgUENMNzExX0FJX01TQl9EUkRZKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOwogfQogCiBzdGF0aWMgaW50IHBjbDcxMV9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTI4Miw3ICsyODEsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKIAkJb3V0YihQQ0w3MTFfU09GVFRSSUcsIGRldi0+aW9iYXNlICsgUENMNzExX1NPRlRUUklHX1JFRyk7CiAKLQkJcmV0ID0gcGNsNzExX2FpX3dhaXRfZm9yX2VvYyhkZXYsIDEwMCk7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcGNsNzExX2FpX2VvYywgMCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCkBAIC0zMzYsMTEgKzMzNSw4IEBACiAJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CiAJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAotCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfTk9ORSkgeworCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfTk9ORSkKIAkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7Ci0JfSBlbHNlIHsKLQkJLyogaWdub3JlICovCi0JfQogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODEyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODEyLmMKaW5kZXggNTM2MTNiMy4uMTYwZWFjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTIuYwpAQCAtMTMxLDM0ICsxMzEsMzIgQEAKICNkZWZpbmUgYm9hcmRBQ0w4MjE2CSAgICAgIDgJLyogYW5kIElDUCBEQVMgQS04MjZQRyAqLwogI2RlZmluZSBib2FyZEE4MjEJICAgICAgOQkvKiBQR0gsIFBHTCwgUEdML05EQSB2ZXJzaW9ucyAqLwogCi0jZGVmaW5lIFBDTHgxeF9JT1JBTkdFCSAgICAgMTYKLQotI2RlZmluZSBQQ0w4MTJfQ1RSMAkgICAgICAwCi0jZGVmaW5lIFBDTDgxMl9DVFIxCSAgICAgIDEKLSNkZWZpbmUgUENMODEyX0NUUjIJICAgICAgMgotI2RlZmluZSBQQ0w4MTJfQ1RSQ1RMCSAgICAgIDMKLSNkZWZpbmUgUENMODEyX0FEX0xPCSAgICAgIDQKLSNkZWZpbmUgUENMODEyX0RBMV9MTwkgICAgICA0Ci0jZGVmaW5lIFBDTDgxMl9BRF9ISQkgICAgICA1Ci0jZGVmaW5lIFBDTDgxMl9EQTFfSEkJICAgICAgNQotI2RlZmluZSBQQ0w4MTJfREEyX0xPCSAgICAgIDYKLSNkZWZpbmUgUENMODEyX0RJX0xPCSAgICAgIDYKLSNkZWZpbmUgUENMODEyX0RBMl9ISQkgICAgICA3Ci0jZGVmaW5lIFBDTDgxMl9ESV9ISQkgICAgICA3Ci0jZGVmaW5lIFBDTDgxMl9DTFJJTlQJICAgICAgOAotI2RlZmluZSBQQ0w4MTJfR0FJTgkgICAgICA5Ci0jZGVmaW5lIFBDTDgxMl9NVVgJICAgICAxMAotI2RlZmluZSBQQ0w4MTJfTU9ERQkgICAgIDExCi0jZGVmaW5lIFBDTDgxMl9DTlRFTkFCTEUgICAgIDEwCi0jZGVmaW5lIFBDTDgxMl9TT0ZUVFJJRwkgICAgIDEyCi0jZGVmaW5lIFBDTDgxMl9ET19MTwkgICAgIDEzCi0jZGVmaW5lIFBDTDgxMl9ET19ISQkgICAgIDE0Ci0KLSNkZWZpbmUgUENMODEyX0RSRFkJICAgMHgxMAkvKiA9MCBkYXRhIHJlYWR5ICovCi0KLSNkZWZpbmUgQUNMODIxNl9TVEFUVVMJICAgICAgOAkvKiA1LiBiaXQgc2lnbmFsaXplIGRhdGEgcmVhZHkgKi8KLQotI2RlZmluZSBBQ0w4MjE2X0RSRFkJICAgMHgyMAkvKiA9MCBkYXRhIHJlYWR5ICovCisvKgorICogUmVnaXN0ZXIgSS9PIG1hcAorICovCisjZGVmaW5lIFBDTDgxMl9USU1FUl9CQVNFCQkJMHgwMAorI2RlZmluZSBQQ0w4MTJfQUlfTFNCX1JFRwkJCTB4MDQKKyNkZWZpbmUgUENMODEyX0FJX01TQl9SRUcJCQkweDA1CisjZGVmaW5lIFBDTDgxMl9BSV9NU0JfRFJEWQkJCSgxIDw8IDQpCisjZGVmaW5lIFBDTDgxMl9BT19MU0JfUkVHKHgpCQkJKDB4MDQgKyAoKHgpICogMikpCisjZGVmaW5lIFBDTDgxMl9BT19NU0JfUkVHKHgpCQkJKDB4MDUgKyAoKHgpICogMikpCisjZGVmaW5lIFBDTDgxMl9ESV9MU0JfUkVHCQkJMHgwNgorI2RlZmluZSBQQ0w4MTJfRElfTVNCX1JFRwkJCTB4MDcKKyNkZWZpbmUgUENMODEyX1NUQVRVU19SRUcJCQkweDA4CisjZGVmaW5lIFBDTDgxMl9TVEFUVVNfRFJEWQkJCSgxIDw8IDUpCisjZGVmaW5lIFBDTDgxMl9SQU5HRV9SRUcJCQkweDA5CisjZGVmaW5lIFBDTDgxMl9NVVhfUkVHCQkJCTB4MGEKKyNkZWZpbmUgUENMODEyX01VWF9DSEFOKHgpCQkJKCh4KSA8PCAwKQorI2RlZmluZSBQQ0w4MTJfTVVYX0NTMAkJCQkoMSA8PCA0KQorI2RlZmluZSBQQ0w4MTJfTVVYX0NTMQkJCQkoMSA8PCA1KQorI2RlZmluZSBQQ0w4MTJfQ1RSTF9SRUcJCQkJMHgwYgorI2RlZmluZSBQQ0w4MTJfQ1RSTF9ESVNBQkxFX1RSSUcJCSgwIDw8IDApCisjZGVmaW5lIFBDTDgxMl9DVFJMX1NPRlRfVFJJRwkJCSgxIDw8IDApCisjZGVmaW5lIFBDTDgxMl9DVFJMX1BBQ0VSX0RNQV9UUklHCQkoMiA8PCAwKQorI2RlZmluZSBQQ0w4MTJfQ1RSTF9QQUNFUl9FT0NfVFJJRwkJKDYgPDwgMCkKKyNkZWZpbmUgUENMODEyX1NPRlRUUklHX1JFRwkJCTB4MGMKKyNkZWZpbmUgUENMODEyX0RPX0xTQl9SRUcJCQkweDBkCisjZGVmaW5lIFBDTDgxMl9ET19NU0JfUkVHCQkJMHgwZQogCiAjZGVmaW5lIE1BWF9DSEFOTElTVF9MRU4gICAgMjU2CS8qIGxlbmd0aCBvZiBzY2FuIGxpc3QgKi8KIApAQCAtMzMxLDIxMyArMzI5LDM5MSBAQAogfTsKIAogc3RydWN0IHBjbDgxMl9ib2FyZCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgYm9hcmRfdHlwZTsKKwlpbnQgbl9haWNoYW47CisJaW50IG5fYW9jaGFuOworCXVuc2lnbmVkIGludCBhaV9uc19taW47CisJY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKnJhbmdlbGlzdF9haTsKKwl1bnNpZ25lZCBpbnQgSVJRYml0czsKKwl1bnNpZ25lZCBpbnQgaGFzX2RtYToxOworCXVuc2lnbmVkIGludCBoYXNfMTZiaXRfYWk6MTsKKwl1bnNpZ25lZCBpbnQgaGFzX21wYzUwOF9tdXg6MTsKKwl1bnNpZ25lZCBpbnQgaGFzX2RpbzoxOworfTsKIAotCWNvbnN0IGNoYXIgKm5hbWU7CS8qICBib2FyZCBuYW1lICovCi0JaW50IGJvYXJkX3R5cGU7CQkvKiAgdHlwZSBvZiB0aGlzIGJvYXJkICovCi0JaW50IG5fYWljaGFuOwkJLyogIG51bSBvZiBBSSBjaGFucyBpbiBTLkUuICovCi0JaW50IG5fYWljaGFuX2RpZmY7CS8qICBESUZGIG51bSBvZiBjaGFucyAqLwotCWludCBuX2FvY2hhbjsJCS8qICBudW0gb2YgREEgY2hhbnMgKi8KLQlpbnQgbl9kaWNoYW47CQkvKiAgREkgYW5kIERPIGNoYW5zICovCi0JaW50IG5fZG9jaGFuOwotCWludCBhaV9tYXhkYXRhOwkJLyogIEFJIHJlc29sdXRpb24gKi8KLQl1bnNpZ25lZCBpbnQgYWlfbnNfbWluOwkvKiAgbWF4IHNhbXBsZSBzcGVlZCBvZiBjYXJkIHYgbnMgKi8KLQl1bnNpZ25lZCBpbnQgaTgyNTRfb3NjX2Jhc2U7CS8qICBjbG9jayBiYXNlICovCi0JY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKnJhbmdlbGlzdF9haTsJLyogIHJhbmdlbGlzdCBmb3IgQS9EICovCi0JY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKnJhbmdlbGlzdF9hbzsJLyogIHJhbmdlbGlzdCBmb3IgRC9BICovCi0JdW5zaWduZWQgaW50IElSUWJpdHM7CS8qICBhbGxvd2VkIElSUSAqLwotCXVuc2lnbmVkIGNoYXIgRE1BYml0czsJLyogIGFsbG93ZWQgRE1BIGNoYW5zICovCi0JdW5zaWduZWQgY2hhciBpb19yYW5nZTsJLyogIGlvcmFuZ2UgZm9yIHRoaXMgYm9hcmQgKi8KLQl1bnNpZ25lZCBjaGFyIGhhdmVNUEM1MDg7CS8qICAxPWJvYXJkIHVzZSBNUEM1MDhBIG11bHRpcGxleG9yICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjbDgxMl9ib2FyZCBib2FyZHR5cGVzW10gPSB7CisJeworCQkubmFtZQkJPSAicGNsODEyIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZFBDTDgxMiwKKwkJLm5fYWljaGFuCT0gMTYsCisJCS5uX2FvY2hhbgk9IDIsCisJCS5haV9uc19taW4JPSAzMzAwMCwKKwkJLnJhbmdlbGlzdF9haQk9ICZyYW5nZV9iaXBvbGFyMTAsCisJCS5JUlFiaXRzCT0gMHhkY2ZjLAorCQkuaGFzX2RtYQk9IDEsCisJCS5oYXNfZGlvCT0gMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJwY2w4MTJwZyIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRQQ0w4MTJQRywKKwkJLm5fYWljaGFuCT0gMTYsCisJCS5uX2FvY2hhbgk9IDIsCisJCS5haV9uc19taW4JPSAzMzAwMCwKKwkJLnJhbmdlbGlzdF9haQk9ICZyYW5nZV9wY2w4MTJwZ19haSwKKwkJLklSUWJpdHMJPSAweGRjZmMsCisJCS5oYXNfZG1hCT0gMSwKKwkJLmhhc19kaW8JPSAxLAorCX0sIHsKKwkJLm5hbWUJCT0gImFjbDgxMTJwZyIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRQQ0w4MTJQRywKKwkJLm5fYWljaGFuCT0gMTYsCisJCS5uX2FvY2hhbgk9IDIsCisJCS5haV9uc19taW4JPSAxMDAwMCwKKwkJLnJhbmdlbGlzdF9haQk9ICZyYW5nZV9wY2w4MTJwZ19haSwKKwkJLklSUWJpdHMJPSAweGRjZmMsCisJCS5oYXNfZG1hCT0gMSwKKwkJLmhhc19kaW8JPSAxLAorCX0sIHsKKwkJLm5hbWUJCT0gImFjbDgxMTJkZyIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRBQ0w4MTEyLAorCQkubl9haWNoYW4JPSAxNiwJLyogOCBkaWZmZXJlbnRpYWwgKi8KKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX25zX21pbgk9IDEwMDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX2FjbDgxMTJkZ19haSwKKwkJLklSUWJpdHMJPSAweGRjZmMsCisJCS5oYXNfZG1hCT0gMSwKKwkJLmhhc19tcGM1MDhfbXV4CT0gMSwKKwkJLmhhc19kaW8JPSAxLAorCX0sIHsKKwkJLm5hbWUJCT0gImFjbDgxMTJoZyIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRBQ0w4MTEyLAorCQkubl9haWNoYW4JPSAxNiwJLyogOCBkaWZmZXJlbnRpYWwgKi8KKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX25zX21pbgk9IDEwMDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX2FjbDgxMTJoZ19haSwKKwkJLklSUWJpdHMJPSAweGRjZmMsCisJCS5oYXNfZG1hCT0gMSwKKwkJLmhhc19tcGM1MDhfbXV4CT0gMSwKKwkJLmhhc19kaW8JPSAxLAorCX0sIHsKKwkJLm5hbWUJCT0gImE4MjFwZ2wiLAorCQkuYm9hcmRfdHlwZQk9IGJvYXJkQTgyMSwKKwkJLm5fYWljaGFuCT0gMTYsCS8qIDggZGlmZmVyZW50aWFsICovCisJCS5uX2FvY2hhbgk9IDEsCisJCS5haV9uc19taW4JPSAxMDAwMCwKKwkJLnJhbmdlbGlzdF9haQk9ICZyYW5nZV9wY2w4MTNiX2FpLAorCQkuSVJRYml0cwk9IDB4MDAwYywKKwkJLmhhc19kaW8JPSAxLAorCX0sIHsKKwkJLm5hbWUJCT0gImE4MjFwZ2xuZGEiLAorCQkuYm9hcmRfdHlwZQk9IGJvYXJkQTgyMSwKKwkJLm5fYWljaGFuCT0gMTYsCS8qIDggZGlmZmVyZW50aWFsICovCisJCS5haV9uc19taW4JPSAxMDAwMCwKKwkJLnJhbmdlbGlzdF9haQk9ICZyYW5nZV9wY2w4MTNiX2FpLAorCQkuSVJRYml0cwk9IDB4MDAwYywKKwl9LCB7CisJCS5uYW1lCQk9ICJhODIxcGdoIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZEE4MjEsCisJCS5uX2FpY2hhbgk9IDE2LAkvKiA4IGRpZmZlcmVudGlhbCAqLworCQkubl9hb2NoYW4JPSAxLAorCQkuYWlfbnNfbWluCT0gMTAwMDAsCisJCS5yYW5nZWxpc3RfYWkJPSAmcmFuZ2VfYTgyMXBnaF9haSwKKwkJLklSUWJpdHMJPSAweDAwMGMsCisJCS5oYXNfZGlvCT0gMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJhODIycGdsIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZEFDTDgxMTIsCisJCS5uX2FpY2hhbgk9IDE2LAkvKiA4IGRpZmZlcmVudGlhbCAqLworCQkubl9hb2NoYW4JPSAyLAorCQkuYWlfbnNfbWluCT0gMTAwMDAsCisJCS5yYW5nZWxpc3RfYWkJPSAmcmFuZ2VfYWNsODExMmRnX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzX2Rpbwk9IDEsCisJfSwgeworCQkubmFtZQkJPSAiYTgyMnBnaCIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRBQ0w4MTEyLAorCQkubl9haWNoYW4JPSAxNiwJLyogOCBkaWZmZXJlbnRpYWwgKi8KKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX25zX21pbgk9IDEwMDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX2FjbDgxMTJoZ19haSwKKwkJLklSUWJpdHMJPSAweGRjZmMsCisJCS5oYXNfZG1hCT0gMSwKKwkJLmhhc19kaW8JPSAxLAorCX0sIHsKKwkJLm5hbWUJCT0gImE4MjNwZ2wiLAorCQkuYm9hcmRfdHlwZQk9IGJvYXJkQUNMODExMiwKKwkJLm5fYWljaGFuCT0gMTYsCS8qIDggZGlmZmVyZW50aWFsICovCisJCS5uX2FvY2hhbgk9IDIsCisJCS5haV9uc19taW4JPSA4MDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX2FjbDgxMTJkZ19haSwKKwkJLklSUWJpdHMJPSAweGRjZmMsCisJCS5oYXNfZG1hCT0gMSwKKwkJLmhhc19kaW8JPSAxLAorCX0sIHsKKwkJLm5hbWUJCT0gImE4MjNwZ2giLAorCQkuYm9hcmRfdHlwZQk9IGJvYXJkQUNMODExMiwKKwkJLm5fYWljaGFuCT0gMTYsCS8qIDggZGlmZmVyZW50aWFsICovCisJCS5uX2FvY2hhbgk9IDIsCisJCS5haV9uc19taW4JPSA4MDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX2FjbDgxMTJoZ19haSwKKwkJLklSUWJpdHMJPSAweGRjZmMsCisJCS5oYXNfZG1hCT0gMSwKKwkJLmhhc19kaW8JPSAxLAorCX0sIHsKKwkJLm5hbWUJCT0gInBjbDgxMyIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRQQ0w4MTMsCisJCS5uX2FpY2hhbgk9IDMyLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX3BjbDgxM2JfYWksCisJfSwgeworCQkubmFtZQkJPSAicGNsODEzYiIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRQQ0w4MTNCLAorCQkubl9haWNoYW4JPSAzMiwKKwkJLnJhbmdlbGlzdF9haQk9ICZyYW5nZV9wY2w4MTNiX2FpLAorCX0sIHsKKwkJLm5hbWUJCT0gImFjbDgxMTMiLAorCQkuYm9hcmRfdHlwZQk9IGJvYXJkQUNMODExMywKKwkJLm5fYWljaGFuCT0gMzIsCisJCS5yYW5nZWxpc3RfYWkJPSAmcmFuZ2VfYWNsODExM18xX2FpLAorCX0sIHsKKwkJLm5hbWUJCT0gImlzbzgxMyIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRJU084MTMsCisJCS5uX2FpY2hhbgk9IDMyLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX2lzbzgxM18xX2FpLAorCX0sIHsKKwkJLm5hbWUJCT0gImFjbDgyMTYiLAorCQkuYm9hcmRfdHlwZQk9IGJvYXJkQUNMODIxNiwKKwkJLm5fYWljaGFuCT0gMTYsCS8qIDggZGlmZmVyZW50aWFsICovCisJCS5uX2FvY2hhbgk9IDIsCisJCS5haV9uc19taW4JPSAxMDAwMCwKKwkJLnJhbmdlbGlzdF9haQk9ICZyYW5nZV9wY2w4MTNiMl9haSwKKwkJLklSUWJpdHMJPSAweGRjZmMsCisJCS5oYXNfZG1hCT0gMSwKKwkJLmhhc18xNmJpdF9haQk9IDEsCisJCS5oYXNfbXBjNTA4X211eAk9IDEsCisJCS5oYXNfZGlvCT0gMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJhODI2cGciLAorCQkuYm9hcmRfdHlwZQk9IGJvYXJkQUNMODIxNiwKKwkJLm5fYWljaGFuCT0gMTYsCS8qIDggZGlmZmVyZW50aWFsICovCisJCS5uX2FvY2hhbgk9IDIsCisJCS5haV9uc19taW4JPSAxMDAwMCwKKwkJLnJhbmdlbGlzdF9haQk9ICZyYW5nZV9wY2w4MTNiMl9haSwKKwkJLklSUWJpdHMJPSAweGRjZmMsCisJCS5oYXNfZG1hCT0gMSwKKwkJLmhhc18xNmJpdF9haQk9IDEsCisJCS5oYXNfZGlvCT0gMSwKKwl9LAogfTsKIAogc3RydWN0IHBjbDgxMl9wcml2YXRlIHsKLQotCXVuc2lnbmVkIGNoYXIgdmFsaWQ7CS8qICA9MSBkZXZpY2UgaXMgT0sgKi8KIAl1bnNpZ25lZCBjaGFyIGRtYTsJLyogID4wIHVzZSBkbWEgKCB1c2VkRE1BIGNoYW5uZWwpICovCi0JdW5zaWduZWQgY2hhciB1c2VfZGlmZjsJLyogID0xIGRpZmYgaW5wdXRzICovCi0JdW5zaWduZWQgY2hhciB1c2VfTVBDOwkvKiAgMT1ib2FyZCB1c2VzIE1QQzUwOEEgbXVsdGlwbGV4b3IgKi8KLQl1bnNpZ25lZCBjaGFyIHVzZV9leHRfdHJnOwkvKiAgMT1ib2FyZCB1c2VzIGV4dGVybmFsIHRyaWdnZXIgKi8KIAl1bnNpZ25lZCBjaGFyIHJhbmdlX2NvcnJlY3Rpb247CS8qICA9MSB3ZSBtdXN0IGFkZCAxIHRvIHJhbmdlIG51bWJlciAqLwotCXVuc2lnbmVkIGNoYXIgb2xkX2NoYW5fcmVnOwkvKiAgbGFzdGx5IHVzZWQgY2hhbi9nYWluIHBhaXIgKi8KLQl1bnNpZ25lZCBjaGFyIG9sZF9nYWluX3JlZzsKKwl1bnNpZ25lZCBpbnQgbGFzdF9haV9jaGFuc3BlYzsKIAl1bnNpZ25lZCBjaGFyIG1vZGVfcmVnX2ludDsJLyogIHRoZXJlIGlzIHN0b3JlZCBJTlQgbnVtYmVyIGZvciBzb21lIGNhcmQgKi8KLQl1bnNpZ25lZCBjaGFyIGFpX25ldmVyZW5kaW5nOwkvKiAgPTEgd2UgZG8gdW5saW1pdGVkIEFJICovCi0JdW5zaWduZWQgY2hhciBhaV9lb3M7CS8qICAxPUVPUyB3YWtlIHVwICovCi0JdW5zaWduZWQgY2hhciBhaV9kbWE7CS8qICA9MSB3ZSB1c2UgRE1BICovCiAJdW5zaWduZWQgaW50IGFpX3BvbGxfcHRyOwkvKiAgaG93IG1hbnkgc2FtcGVzIHRyYW5zZmVyIHBvbGwgKi8KLQl1bnNpZ25lZCBpbnQgYWlfc2NhbnM7CS8qICBsZW4gb2Ygc2Nhbmxpc3QgKi8KIAl1bnNpZ25lZCBpbnQgYWlfYWN0X3NjYW47CS8qICBob3cgbWFueSBzY2FucyB3ZSBmaW5pc2hlZCAqLwotCXVuc2lnbmVkIGludCBhaV9jaGFubGlzdFtNQVhfQ0hBTkxJU1RfTEVOXTsJLyogIG91ciBjb3B5IG9mIGNoYW5uZWwvcmFuZ2UgbGlzdCAqLwotCXVuc2lnbmVkIGludCBhaV9uX2NoYW47CS8qICBob3cgbWFueSBjaGFubmVscyBpcyBtZWFzdXJlZCAqLwotCXVuc2lnbmVkIGludCBhaV9mbGFnczsJLyogIGZsYWdsaXN0ICovCi0JdW5zaWduZWQgaW50IGFpX2RhdGFfbGVuOwkvKiAgbGVuIG9mIGRhdGEgYnVmZmVyICovCi0JdW5zaWduZWQgaW50IGFpX2lzMTZiOwkvKiAgPTEgd2UgaGF2ZSAxNiBiaXQgY2FyZCAqLworCXVuc2lnbmVkIGludCBkbWFwYWdlczsKKwl1bnNpZ25lZCBpbnQgaHdkbWFzaXplOwogCXVuc2lnbmVkIGxvbmcgZG1hYnVmWzJdOwkvKiAgUFRSIHRvIERNQSBidWYgKi8KLQl1bnNpZ25lZCBpbnQgZG1hcGFnZXNbMl07CS8qICBob3cgbWFueSBwYWdlcyB3ZSBoYXZlIGFsbG9jYXRlZCAqLwogCXVuc2lnbmVkIGludCBod2RtYXB0clsyXTsJLyogIEhXIFBUUiB0byBETUEgYnVmICovCi0JdW5zaWduZWQgaW50IGh3ZG1hc2l6ZVsyXTsJLyogIERNQSBidWYgc2l6ZSBpbiBieXRlcyAqLwogCXVuc2lnbmVkIGludCBkbWFieXRlc3RvbW92ZVsyXTsJLyogIGhvdyBtYW55IGJ5dGVzIERNQSB0cmFuc2ZlciAqLwogCWludCBuZXh0X2RtYV9idWY7CS8qICB3aGljaCBidWZmZXIgaXMgbmV4dCB0byB1c2UgKi8KIAl1bnNpZ25lZCBpbnQgZG1hX3J1bnNfdG9fZW5kOwkvKiAgaG93IG1hbnkgdGltZXMgd2UgbXVzdCBzd2l0Y2ggRE1BIGJ1ZmZlcnMgKi8KIAl1bnNpZ25lZCBpbnQgbGFzdF9kbWFfcnVuOwkvKiAgaG93IG1hbnkgYnl0ZXMgdG8gdHJhbnNmZXIgb24gbGFzdCBETUEgYnVmZmVyICovCiAJdW5zaWduZWQgaW50IG1heF84MTJfYWlfbW9kZTBfcmFuZ2V3YWl0OwkvKiAgc2V0bGluZyB0aW1lIGZvciBnYWluICovCiAJdW5zaWduZWQgaW50IGFvX3JlYWRiYWNrWzJdOwkvKiAgZGF0YSBmb3IgQU8gcmVhZGJhY2sgKi8KKwl1bnNpZ25lZCBpbnQgZGl2aXNvcjE7CisJdW5zaWduZWQgaW50IGRpdmlzb3IyOworCXVuc2lnbmVkIGludCB1c2VfZGlmZjoxOworCXVuc2lnbmVkIGludCB1c2VfbXBjNTA4OjE7CisJdW5zaWduZWQgaW50IHVzZV9leHRfdHJnOjE7CisJdW5zaWduZWQgaW50IGFpX2RtYToxOworCXVuc2lnbmVkIGludCBhaV9lb3M6MTsKIH07CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgdm9pZCBzdGFydF9wYWNlcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBpbnQgbW9kZSwKLQkJCXVuc2lnbmVkIGludCBkaXZpc29yMSwgdW5zaWduZWQgaW50IGRpdmlzb3IyKTsKLXN0YXRpYyB2b2lkIHNldHVwX3JhbmdlX2NoYW5uZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQl1bnNpZ25lZCBpbnQgcmFuZ2VjaGFuLCBjaGFyIHdhaXQpOwotc3RhdGljIGludCBwY2w4MTJfYWlfY2FuY2VsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpOwotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBpbnQgcGNsODEyX2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIHZvaWQgcGNsODEyX3N0YXJ0X3BhY2VyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGJvb2wgbG9hZF90aW1lcnMpCiB7CiAJc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBuOwotCWludCB0aW1lb3V0LCBoaTsKKwl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIFBDTDgxMl9USU1FUl9CQVNFOwogCi0JLyogc2VsZWN0IHNvZnR3YXJlIHRyaWdnZXIgKi8KLQlvdXRiKGRldnByaXYtPm1vZGVfcmVnX2ludCB8IDEsIGRldi0+aW9iYXNlICsgUENMODEyX01PREUpOwotCS8qICBzZWxlY3QgY2hhbm5lbCBhbmQgcmVuZ2UgKi8KLQlzZXR1cF9yYW5nZV9jaGFubmVsKGRldiwgcywgaW5zbi0+Y2hhbnNwZWMsIDEpOwotCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKLQkJLyogc3RhcnQgY29udmVyc2lvbiAqLwotCQlvdXRiKDI1NSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfU09GVFRSSUcpOwotCQl1ZGVsYXkoNSk7Ci0JCXRpbWVvdXQgPSA1MDsJLyogd2FpdCBtYXggNTB1cywgaXQgbXVzdCBmaW5pc2ggdW5kZXIgMzN1cyAqLwotCQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCQloaSA9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxMl9BRF9ISSk7Ci0JCQlpZiAoIShoaSAmIFBDTDgxMl9EUkRZKSkKLQkJCQlnb3RvIGNvbnZfZmluaXNoOwotCQkJdWRlbGF5KDEpOworCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDIsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKKwlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7CisJdWRlbGF5KDEpOworCisJaWYgKGxvYWRfdGltZXJzKSB7CisJCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDIsIGRldnByaXYtPmRpdmlzb3IyKTsKKwkJaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMSwgZGV2cHJpdi0+ZGl2aXNvcjEpOworCX0KK30KKworc3RhdGljIHZvaWQgcGNsODEyX2FpX3NldHVwX2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CisJdW5zaWduZWQgaW50IGRtYV9mbGFnczsKKwl1bnNpZ25lZCBpbnQgYnl0ZXM7CisKKwkvKiAgd2UgdXNlIEVPUywgc28gYWRhcHQgRE1BIGJ1ZmZlciB0byBvbmUgc2NhbiAqLworCWlmIChkZXZwcml2LT5haV9lb3MpIHsKKwkJZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMF0gPQorCQkJY21kLT5jaGFubGlzdF9sZW4gKiBzaXplb2Yoc2hvcnQpOworCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVsxXSA9CisJCQljbWQtPmNoYW5saXN0X2xlbiAqIHNpemVvZihzaG9ydCk7CisJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9IDE7CisJfSBlbHNlIHsKKwkJZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMF0gPSBkZXZwcml2LT5od2RtYXNpemU7CisJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzFdID0gZGV2cHJpdi0+aHdkbWFzaXplOworCQlpZiAocy0+YXN5bmMtPnByZWFsbG9jX2J1ZnN6IDwgZGV2cHJpdi0+aHdkbWFzaXplKSB7CisJCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSA9CisJCQkJcy0+YXN5bmMtPnByZWFsbG9jX2J1ZnN6OworCQkJZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMV0gPQorCQkJCXMtPmFzeW5jLT5wcmVhbGxvY19idWZzejsKIAkJfQotCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiQS9EIGluc24gcmVhZCB0aW1lb3V0XG4iKTsKLQkJb3V0YihkZXZwcml2LT5tb2RlX3JlZ19pbnQgfCAwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9NT0RFKTsKLQkJcmV0dXJuIC1FVElNRTsKKwkJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19OT05FKSB7CisJCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPSAxOworCQl9IGVsc2UgeworCQkJLyogIGhvdyBtYW55IHNhbXBsZXMgd2UgbXVzdCB0cmFuc2Zlcj8gKi8KKwkJCWJ5dGVzID0gY21kLT5jaGFubGlzdF9sZW4gKgorCQkJCWNtZC0+c3RvcF9hcmcgKiBzaXplb2Yoc2hvcnQpOwogCi1jb252X2ZpbmlzaDoKLQkJZGF0YVtuXSA9ICgoaGkgJiAweGYpIDw8IDgpIHwgaW5iKGRldi0+aW9iYXNlICsgUENMODEyX0FEX0xPKTsKLQl9Ci0Jb3V0YihkZXZwcml2LT5tb2RlX3JlZ19pbnQgfCAwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9NT0RFKTsKLQlyZXR1cm4gbjsKLX0KKwkJCS8qICBob3cgbWFueSBETUEgcGFnZXMgd2UgbXVzdCBmaWxsICovCisJCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPQorCQkJCWJ5dGVzIC8gZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMF07CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgaW50IGFjbDgyMTZfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0JaW50IG47Ci0JaW50IHRpbWVvdXQ7Ci0KLQkvKiBzZWxlY3Qgc29mdHdhcmUgdHJpZ2dlciAqLwotCW91dGIoMSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTU9ERSk7Ci0JLyogIHNlbGVjdCBjaGFubmVsIGFuZCByZW5nZSAqLwotCXNldHVwX3JhbmdlX2NoYW5uZWwoZGV2LCBzLCBpbnNuLT5jaGFuc3BlYywgMSk7Ci0JZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewotCQkvKiBzdGFydCBjb252ZXJzaW9uICovCi0JCW91dGIoMjU1LCBkZXYtPmlvYmFzZSArIFBDTDgxMl9TT0ZUVFJJRyk7Ci0JCXVkZWxheSg1KTsKLQkJdGltZW91dCA9IDUwOwkvKiB3YWl0IG1heCA1MHVzLCBpdCBtdXN0IGZpbmlzaCB1bmRlciAzM3VzICovCi0JCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJCWlmICghKGluYihkZXYtPmlvYmFzZSArIEFDTDgyMTZfU1RBVFVTKSAmIEFDTDgyMTZfRFJEWSkpCi0JCQkJZ290byBjb252X2ZpbmlzaDsKLQkJCXVkZWxheSgxKTsKKwkJCS8qIG9uIGxhc3QgZG1hIHRyYW5zZmVyIG11c3QgYmUgbW92ZWQgKi8KKwkJCWRldnByaXYtPmxhc3RfZG1hX3J1biA9CisJCQkJYnl0ZXMgJSBkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXTsKKwkJCWlmIChkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPT0gMCkKKwkJCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSA9CisJCQkJCWRldnByaXYtPmxhc3RfZG1hX3J1bjsKKwkJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZC0tOwogCQl9Ci0JCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJBL0QgaW5zbiByZWFkIHRpbWVvdXRcbiIpOwotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX01PREUpOwotCQlyZXR1cm4gLUVUSU1FOwotCi1jb252X2ZpbmlzaDoKLQkJZGF0YVtuXSA9Ci0JCSAgICAoaW5iKGRldi0+aW9iYXNlICsKLQkJCSBQQ0w4MTJfQURfSEkpIDw8IDgpIHwgaW5iKGRldi0+aW9iYXNlICsgUENMODEyX0FEX0xPKTsKIAl9Ci0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9NT0RFKTsKLQlyZXR1cm4gbjsKKwlpZiAoZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMF0gPiBkZXZwcml2LT5od2RtYXNpemUpIHsKKwkJZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMF0gPSBkZXZwcml2LT5od2RtYXNpemU7CisJCWRldnByaXYtPmFpX2VvcyA9IDA7CisJfQorCWlmIChkZXZwcml2LT5kbWFieXRlc3RvbW92ZVsxXSA+IGRldnByaXYtPmh3ZG1hc2l6ZSkgeworCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVsxXSA9IGRldnByaXYtPmh3ZG1hc2l6ZTsKKwkJZGV2cHJpdi0+YWlfZW9zID0gMDsKKwl9CisJZGV2cHJpdi0+bmV4dF9kbWFfYnVmID0gMDsKKwlzZXRfZG1hX21vZGUoZGV2cHJpdi0+ZG1hLCBETUFfTU9ERV9SRUFEKTsKKwlkbWFfZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCWNsZWFyX2RtYV9mZihkZXZwcml2LT5kbWEpOworCXNldF9kbWFfYWRkcihkZXZwcml2LT5kbWEsIGRldnByaXYtPmh3ZG1hcHRyWzBdKTsKKwlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwgZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMF0pOworCXJlbGVhc2VfZG1hX2xvY2soZG1hX2ZsYWdzKTsKKwllbmFibGVfZG1hKGRldnByaXYtPmRtYSk7CiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgaW50IHBjbDgxMl9hb19pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCitzdGF0aWMgdm9pZCBwY2w4MTJfYWlfc2V0dXBfbmV4dF9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewogCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCWludCBpOworCXVuc2lnbmVkIGxvbmcgZG1hX2ZsYWdzOwogCi0JZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgewotCQlvdXRiKChkYXRhW2ldICYgMHhmZiksCi0JCSAgICAgZGV2LT5pb2Jhc2UgKyAoY2hhbiA/IFBDTDgxMl9EQTJfTE8gOiBQQ0w4MTJfREExX0xPKSk7Ci0JCW91dGIoKGRhdGFbaV0gPj4gOCkgJiAweDBmLAotCQkgICAgIGRldi0+aW9iYXNlICsgKGNoYW4gPyBQQ0w4MTJfREEyX0hJIDogUENMODEyX0RBMV9ISSkpOwotCQlkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXSA9IGRhdGFbaV07CisJZGV2cHJpdi0+bmV4dF9kbWFfYnVmID0gMSAtIGRldnByaXYtPm5leHRfZG1hX2J1ZjsKKwlkaXNhYmxlX2RtYShkZXZwcml2LT5kbWEpOworCXNldF9kbWFfbW9kZShkZXZwcml2LT5kbWEsIERNQV9NT0RFX1JFQUQpOworCWRtYV9mbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisJc2V0X2RtYV9hZGRyKGRldnByaXYtPmRtYSwgZGV2cHJpdi0+aHdkbWFwdHJbZGV2cHJpdi0+bmV4dF9kbWFfYnVmXSk7CisJaWYgKGRldnByaXYtPmFpX2VvcykgeworCQlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwKKwkJCSAgICAgIGRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlW2RldnByaXYtPm5leHRfZG1hX2J1Zl0pOworCX0gZWxzZSB7CisJCWlmIChkZXZwcml2LT5kbWFfcnVuc190b19lbmQpIHsKKwkJCXNldF9kbWFfY291bnQoZGV2cHJpdi0+ZG1hLAorCQkJCSAgICAgIGRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlW2RldnByaXYtPgorCQkJCQkJCSAgICAgIG5leHRfZG1hX2J1Zl0pOworCQl9IGVsc2UgeworCQkJc2V0X2RtYV9jb3VudChkZXZwcml2LT5kbWEsIGRldnByaXYtPmxhc3RfZG1hX3J1bik7CisJCX0KKwkJZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kLS07CiAJfQotCi0JcmV0dXJuIGk7CisJcmVsZWFzZV9kbWFfbG9jayhkbWFfZmxhZ3MpOworCWVuYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBpbnQgcGNsODEyX2FvX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIHZvaWQgcGNsODEyX2FpX3NldF9jaGFuX3JhbmdlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbnNwZWMsIGNoYXIgd2FpdCkKIHsKIAlzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oY2hhbnNwZWMpOworCXVuc2lnbmVkIGludCByYW5nZSA9IENSX1JBTkdFKGNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgbXV4ID0gMDsKIAotCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspCi0JCWRhdGFbaV0gPSBkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXTsKKwlpZiAoY2hhbnNwZWMgPT0gZGV2cHJpdi0+bGFzdF9haV9jaGFuc3BlYykKKwkJcmV0dXJuOwogCi0JcmV0dXJuIGk7Ci19CisJZGV2cHJpdi0+bGFzdF9haV9jaGFuc3BlYyA9IGNoYW5zcGVjOwogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIGludCBwY2w4MTJfZGlfaW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0JZGF0YVsxXSA9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxMl9ESV9MTyk7Ci0JZGF0YVsxXSB8PSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfRElfSEkpIDw8IDg7Ci0KLQlyZXR1cm4gaW5zbi0+bjsKLX0KLQotc3RhdGljIGludCBwY2w4MTJfZG9faW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQlpZiAoY29tZWRpX2Rpb191cGRhdGVfc3RhdGUocywgZGF0YSkpIHsKLQkJb3V0YihzLT5zdGF0ZSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODEyX0RPX0xPKTsKLQkJb3V0Yigocy0+c3RhdGUgPj4gOCksIGRldi0+aW9iYXNlICsgUENMODEyX0RPX0hJKTsKKwlpZiAoZGV2cHJpdi0+dXNlX21wYzUwOCkgeworCQlpZiAoZGV2cHJpdi0+dXNlX2RpZmYpIHsKKwkJCW11eCB8PSBQQ0w4MTJfTVVYX0NTMCB8IFBDTDgxMl9NVVhfQ1MxOworCQl9IGVsc2UgeworCQkJaWYgKGNoYW4gPCA4KQorCQkJCW11eCB8PSBQQ0w4MTJfTVVYX0NTMDsKKwkJCWVsc2UKKwkJCQltdXggfD0gUENMODEyX01VWF9DUzE7CisJCX0KIAl9CiAKLQlkYXRhWzFdID0gcy0+c3RhdGU7CisJb3V0YihtdXggfCBQQ0w4MTJfTVVYX0NIQU4oY2hhbiksIGRldi0+aW9iYXNlICsgUENMODEyX01VWF9SRUcpOworCW91dGIocmFuZ2UgKyBkZXZwcml2LT5yYW5nZV9jb3JyZWN0aW9uLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9SQU5HRV9SRUcpOwogCi0JcmV0dXJuIGluc24tPm47CisJaWYgKHdhaXQpCisJCS8qCisJCSAqIFhYWCB0aGlzIGRlcGVuZHMgb24gc2VsZWN0ZWQgcmFuZ2UgYW5kIGNhbiBiZSB2ZXJ5IGxvbmcgZm9yCisJCSAqIHNvbWUgaGlnaCBnYWluIHJhbmdlcyEKKwkJICovCisJCXVkZWxheShkZXZwcml2LT5tYXhfODEyX2FpX21vZGUwX3Jhbmdld2FpdCk7CiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCitzdGF0aWMgdm9pZCBwY2w4MTJfYWlfY2xlYXJfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCit7CisJLyogd3JpdGluZyBhbnkgdmFsdWUgY2xlYXJzIHRoZSBpbnRlcnJ1cHQgcmVxdWVzdCAqLworCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfU1RBVFVTX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbDgxMl9haV9zb2Z0X3RyaWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwkvKiB3cml0aW5nIGFueSB2YWx1ZSB0cmlnZ2VycyBhIHNvZnR3YXJlIGNvbnZlcnNpb24gKi8KKwlvdXRiKDI1NSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfU09GVFRSSUdfUkVHKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwY2w4MTJfYWlfZ2V0X3NhbXBsZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXZhbCA9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxMl9BSV9NU0JfUkVHKSA8PCA4OworCXZhbCB8PSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQUlfTFNCX1JFRyk7CisKKwlyZXR1cm4gdmFsICYgcy0+bWF4ZGF0YTsKK30KKworc3RhdGljIGludCBwY2w4MTJfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJaWYgKHMtPm1heGRhdGEgPiAweDBmZmYpIHsKKwkJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgUENMODEyX1NUQVRVU19SRUcpOworCQlpZiAoKHN0YXR1cyAmIFBDTDgxMl9TVEFUVVNfRFJEWSkgPT0gMCkKKwkJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxMl9BSV9NU0JfUkVHKTsKKwkJaWYgKChzdGF0dXMgJiBQQ0w4MTJfQUlfTVNCX0RSRFkpID09IDApCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBwY2w4MTJfYWlfY21kdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKQEAgLTU0NSw3ICs3MjEsNyBAQAogCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgZXJyID0gMDsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0JaW50IHRtcCwgZGl2aXNvcjEsIGRpdmlzb3IyOworCWludCB0bXA7CiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKQEAgLTYwMCw4ICs3NzYsOSBAQAogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewogCQl0bXAgPSBjbWQtPmNvbnZlcnRfYXJnOwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKGJvYXJkLT5pODI1NF9vc2NfYmFzZSwKLQkJCQkJICAmZGl2aXNvcjEsICZkaXZpc29yMiwKKwkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihJODI1NF9PU0NfQkFTRV8yTUhaLAorCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMSwKKwkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjIsCiAJCQkJCSAgJmNtZC0+Y29udmVydF9hcmcsIGNtZC0+ZmxhZ3MpOwogCQlpZiAoY21kLT5jb252ZXJ0X2FyZyA8IGJvYXJkLT5haV9uc19taW4pCiAJCQljbWQtPmNvbnZlcnRfYXJnID0gYm9hcmQtPmFpX25zX21pbjsKQEAgLTYxNSw1NCArNzkyLDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCiBzdGF0aWMgaW50IHBjbDgxMl9haV9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7Ci0JY29uc3Qgc3RydWN0IHBjbDgxMl9ib2FyZCAqYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKIAlzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IGRpdmlzb3IxID0gMCwgZGl2aXNvcjIgPSAwLCBpLCBkbWFfZmxhZ3MsIGJ5dGVzOwogCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKwl1bnNpZ25lZCBpbnQgY3RybCA9IDA7CisJdW5zaWduZWQgaW50IGk7CiAKLQlpZiAoY21kLT5zdGFydF9zcmMgIT0gVFJJR19OT1cpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRk9MTE9XKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoZGV2cHJpdi0+dXNlX2V4dF90cmcpIHsKLQkJaWYgKGNtZC0+Y29udmVydF9zcmMgIT0gVFJJR19FWFQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9IGVsc2UgewotCQlpZiAoY21kLT5jb252ZXJ0X3NyYyAhPSBUUklHX1RJTUVSKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChjbWQtPnNjYW5fZW5kX3NyYyAhPSBUUklHX0NPVU5UKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoY21kLT5zY2FuX2VuZF9hcmcgIT0gY21kLT5jaGFubGlzdF9sZW4pCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChjbWQtPmNoYW5saXN0X2xlbiA+IE1BWF9DSEFOTElTVF9MRU4pCi0JCXJldHVybiAtRUlOVkFMOworCXBjbDgxMl9zdGFydF9wYWNlcihkZXYsIGZhbHNlKTsKIAotCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKLQkJaWYgKGNtZC0+Y29udmVydF9hcmcgPCBib2FyZC0+YWlfbnNfbWluKQotCQkJY21kLT5jb252ZXJ0X2FyZyA9IGJvYXJkLT5haV9uc19taW47Ci0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoYm9hcmQtPmk4MjU0X29zY19iYXNlLAotCQkJCQkgICZkaXZpc29yMSwgJmRpdmlzb3IyLAotCQkJCQkgICZjbWQtPmNvbnZlcnRfYXJnLCBjbWQtPmZsYWdzKTsKLQl9Ci0KLQlzdGFydF9wYWNlcihkZXYsIC0xLCAwLCAwKTsJLyogIHN0b3AgcGFjZXIgKi8KLQotCWRldnByaXYtPmFpX25fY2hhbiA9IGNtZC0+Y2hhbmxpc3RfbGVuOwotCW1lbWNweShkZXZwcml2LT5haV9jaGFubGlzdCwgY21kLT5jaGFubGlzdCwKLQkgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGludCkgKiBjbWQtPnNjYW5fZW5kX2FyZyk7Ci0JLyogIHNlbGVjdCBmaXJzdCBjaGFubmVsIGFuZCByYW5nZSAqLwotCXNldHVwX3JhbmdlX2NoYW5uZWwoZGV2LCBzLCBkZXZwcml2LT5haV9jaGFubGlzdFswXSwgMSk7CisJcGNsODEyX2FpX3NldF9jaGFuX3JhbmdlKGRldiwgY21kLT5jaGFubGlzdFswXSwgMSk7CiAKIAlpZiAoZGV2cHJpdi0+ZG1hKSB7CS8qICBjaGVjayBpZiB3ZSBjYW4gdXNlIERNQSB0cmFuc2ZlciAqLwogCQlkZXZwcml2LT5haV9kbWEgPSAxOwotCQlmb3IgKGkgPSAxOyBpIDwgZGV2cHJpdi0+YWlfbl9jaGFuOyBpKyspCi0JCQlpZiAoZGV2cHJpdi0+YWlfY2hhbmxpc3RbMF0gIT0gZGV2cHJpdi0+YWlfY2hhbmxpc3RbaV0pIHsKKwkJZm9yIChpID0gMTsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyBpKyspCisJCQlpZiAoY21kLT5jaGFubGlzdFswXSAhPSBjbWQtPmNoYW5saXN0W2ldKSB7CiAJCQkJLyogIHdlIGNhbm4ndCB1c2UgRE1BIDotKCAqLwogCQkJCWRldnByaXYtPmFpX2RtYSA9IDA7CiAJCQkJYnJlYWs7CkBAIC02NzAsMjEyICs4MTQsMTA1IEBACiAJfSBlbHNlCiAJCWRldnByaXYtPmFpX2RtYSA9IDA7CiAKLQlkZXZwcml2LT5haV9mbGFncyA9IGNtZC0+ZmxhZ3M7Ci0JZGV2cHJpdi0+YWlfZGF0YV9sZW4gPSBzLT5hc3luYy0+cHJlYWxsb2NfYnVmc3o7Ci0JaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgewotCQlkZXZwcml2LT5haV9zY2FucyA9IGNtZC0+c3RvcF9hcmc7Ci0JCWRldnByaXYtPmFpX25ldmVyZW5kaW5nID0gMDsKLQl9IGVsc2UgewotCQlkZXZwcml2LT5haV9zY2FucyA9IDA7Ci0JCWRldnByaXYtPmFpX25ldmVyZW5kaW5nID0gMTsKLQl9Ci0KIAlkZXZwcml2LT5haV9hY3Rfc2NhbiA9IDA7CiAJZGV2cHJpdi0+YWlfcG9sbF9wdHIgPSAwOwogCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7CiAKIAkvKiAgZG9uJ3Qgd2Ugd2FudCB3YWtlIHVwIGV2ZXJ5IHNjYW4/ICovCi0JaWYgKChkZXZwcml2LT5haV9mbGFncyAmIFRSSUdfV0FLRV9FT1MpKSB7CisJaWYgKGNtZC0+ZmxhZ3MgJiBUUklHX1dBS0VfRU9TKSB7CiAJCWRldnByaXYtPmFpX2VvcyA9IDE7CiAKIAkJLyogIERNQSBpcyB1c2VsZXNzIGZvciB0aGlzIHNpdHVhdGlvbiAqLwotCQlpZiAoZGV2cHJpdi0+YWlfbl9jaGFuID09IDEpCisJCWlmIChjbWQtPmNoYW5saXN0X2xlbiA9PSAxKQogCQkJZGV2cHJpdi0+YWlfZG1hID0gMDsKIAl9CiAKLQlpZiAoZGV2cHJpdi0+YWlfZG1hKSB7Ci0JCS8qICB3ZSB1c2UgRU9TLCBzbyBhZGFwdCBETUEgYnVmZmVyIHRvIG9uZSBzY2FuICovCi0JCWlmIChkZXZwcml2LT5haV9lb3MpIHsKLQkJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdID0KLQkJCSAgICBkZXZwcml2LT5haV9uX2NoYW4gKiBzaXplb2Yoc2hvcnQpOwotCQkJZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMV0gPQotCQkJICAgIGRldnByaXYtPmFpX25fY2hhbiAqIHNpemVvZihzaG9ydCk7Ci0JCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPSAxOwotCQl9IGVsc2UgewotCQkJZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMF0gPSBkZXZwcml2LT5od2RtYXNpemVbMF07Ci0JCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVsxXSA9IGRldnByaXYtPmh3ZG1hc2l6ZVsxXTsKLQkJCWlmIChkZXZwcml2LT5haV9kYXRhX2xlbiA8IGRldnByaXYtPmh3ZG1hc2l6ZVswXSkKLQkJCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSA9Ci0JCQkJICAgIGRldnByaXYtPmFpX2RhdGFfbGVuOwotCQkJaWYgKGRldnByaXYtPmFpX2RhdGFfbGVuIDwgZGV2cHJpdi0+aHdkbWFzaXplWzFdKQotCQkJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzFdID0KLQkJCQkgICAgZGV2cHJpdi0+YWlfZGF0YV9sZW47Ci0JCQlpZiAoZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcpIHsKLQkJCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQkvKiAgaG93IG1hbnkgc2FtcGxlcyB3ZSBtdXN0IHRyYW5zZmVyPyAqLwotCQkJCWJ5dGVzID0gZGV2cHJpdi0+YWlfbl9jaGFuICoKLQkJCQkJZGV2cHJpdi0+YWlfc2NhbnMgKiBzaXplb2Yoc2hvcnQpOwotCi0JCQkJLyogIGhvdyBtYW55IERNQSBwYWdlcyB3ZSBtdXN0IGZpbGwgKi8KLQkJCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPQotCQkJCQlieXRlcyAvIGRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdOwotCi0JCQkJLyogb24gbGFzdCBkbWEgdHJhbnNmZXIgbXVzdCBiZSBtb3ZlZCAqLwotCQkJCWRldnByaXYtPmxhc3RfZG1hX3J1biA9Ci0JCQkJCWJ5dGVzICUgZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMF07Ci0JCQkJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9PSAwKQotCQkJCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSA9Ci0JCQkJCSAgICBkZXZwcml2LT5sYXN0X2RtYV9ydW47Ci0JCQkJZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kLS07Ci0JCQl9Ci0JCX0KLQkJaWYgKGRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdID4gZGV2cHJpdi0+aHdkbWFzaXplWzBdKSB7Ci0JCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSA9IGRldnByaXYtPmh3ZG1hc2l6ZVswXTsKLQkJCWRldnByaXYtPmFpX2VvcyA9IDA7Ci0JCX0KLQkJaWYgKGRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzFdID4gZGV2cHJpdi0+aHdkbWFzaXplWzFdKSB7Ci0JCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVsxXSA9IGRldnByaXYtPmh3ZG1hc2l6ZVsxXTsKLQkJCWRldnByaXYtPmFpX2VvcyA9IDA7Ci0JCX0KLQkJZGV2cHJpdi0+bmV4dF9kbWFfYnVmID0gMDsKLQkJc2V0X2RtYV9tb2RlKGRldnByaXYtPmRtYSwgRE1BX01PREVfUkVBRCk7Ci0JCWRtYV9mbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7Ci0JCWNsZWFyX2RtYV9mZihkZXZwcml2LT5kbWEpOwotCQlzZXRfZG1hX2FkZHIoZGV2cHJpdi0+ZG1hLCBkZXZwcml2LT5od2RtYXB0clswXSk7Ci0JCXNldF9kbWFfY291bnQoZGV2cHJpdi0+ZG1hLCBkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSk7Ci0JCXJlbGVhc2VfZG1hX2xvY2soZG1hX2ZsYWdzKTsKLQkJZW5hYmxlX2RtYShkZXZwcml2LT5kbWEpOwotCX0KKwlpZiAoZGV2cHJpdi0+YWlfZG1hKQorCQlwY2w4MTJfYWlfc2V0dXBfZG1hKGRldiwgcyk7CiAKIAlzd2l0Y2ggKGNtZC0+Y29udmVydF9zcmMpIHsKIAljYXNlIFRSSUdfVElNRVI6Ci0JCXN0YXJ0X3BhY2VyKGRldiwgMSwgZGl2aXNvcjEsIGRpdmlzb3IyKTsKKwkJcGNsODEyX3N0YXJ0X3BhY2VyKGRldiwgdHJ1ZSk7CiAJCWJyZWFrOwogCX0KIAotCWlmIChkZXZwcml2LT5haV9kbWEpCQkJCQkvKiAgbGV0J3MgZ28hICovCi0JCW91dGIoZGV2cHJpdi0+bW9kZV9yZWdfaW50IHwgMiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTU9ERSk7Ci0JZWxzZQkJCQkJCQkvKiAgbGV0J3MgZ28hICovCi0JCW91dGIoZGV2cHJpdi0+bW9kZV9yZWdfaW50IHwgNiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTU9ERSk7CisJaWYgKGRldnByaXYtPmFpX2RtYSkKKwkJY3RybCB8PSBQQ0w4MTJfQ1RSTF9QQUNFUl9ETUFfVFJJRzsKKwllbHNlCisJCWN0cmwgfD0gUENMODEyX0NUUkxfUEFDRVJfRU9DX1RSSUc7CisJb3V0YihkZXZwcml2LT5tb2RlX3JlZ19pbnQgfCBjdHJsLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9DVFJMX1JFRyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBpbnRlcnJ1cHRfcGNsODEyX2FpX2ludChpbnQgaXJxLCB2b2lkICpkKQorc3RhdGljIGJvb2wgcGNsODEyX2FpX25leHRfY2hhbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewotCWNoYXIgZXJyID0gMTsKLQl1bnNpZ25lZCBpbnQgbWFzaywgdGltZW91dDsKLQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKIAlzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0Jc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnJlYWRfc3ViZGV2OworCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKworCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLOworCisJcy0+YXN5bmMtPmN1cl9jaGFuKys7CisJaWYgKHMtPmFzeW5jLT5jdXJfY2hhbiA+PSBjbWQtPmNoYW5saXN0X2xlbikgeworCQlzLT5hc3luYy0+Y3VyX2NoYW4gPSAwOworCQlkZXZwcml2LT5haV9hY3Rfc2NhbisrOworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT1M7CisJfQorCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCAmJgorCSAgICBkZXZwcml2LT5haV9hY3Rfc2NhbiA+PSBjbWQtPnN0b3BfYXJnKSB7CisJCS8qIGFsbCBkYXRhIHNhbXBsZWQgKi8KKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHBjbDgxMl9oYW5kbGVfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CiAJdW5zaWduZWQgaW50IG5leHRfY2hhbjsKIAotCXMtPmFzeW5jLT5ldmVudHMgPSAwOwotCi0JdGltZW91dCA9IDUwOwkJLyogd2FpdCBtYXggNTB1cywgaXQgbXVzdCBmaW5pc2ggdW5kZXIgMzN1cyAqLwotCWlmIChkZXZwcml2LT5haV9pczE2YikgewotCQltYXNrID0gMHhmZmZmOwotCQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCQlpZiAoIShpbmIoZGV2LT5pb2Jhc2UgKyBBQ0w4MjE2X1NUQVRVUykgJiBBQ0w4MjE2X0RSRFkpKSB7Ci0JCQkJZXJyID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXVkZWxheSgxKTsKLQkJfQotCX0gZWxzZSB7Ci0JCW1hc2sgPSAweDBmZmY7Ci0JCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJCWlmICghKGluYihkZXYtPmlvYmFzZSArIFBDTDgxMl9BRF9ISSkgJiBQQ0w4MTJfRFJEWSkpIHsKLQkJCQllcnIgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJdWRlbGF5KDEpOwotCQl9Ci0JfQotCi0JaWYgKGVycikgeworCWlmIChwY2w4MTJfYWlfZW9jKGRldiwgcywgTlVMTCwgMCkpIHsKIAkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIkEvRCBjbWQgSVJRIHdpdGhvdXQgRFJEWSFcbiIpOwotCQlwY2w4MTJfYWlfY2FuY2VsKGRldiwgcyk7CiAJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKKwkJcmV0dXJuOwogCX0KIAotCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLAotCQkgICAgICAgKChpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQURfSEkpIDw8IDgpIHwKLQkJCWluYihkZXYtPmlvYmFzZSArIFBDTDgxMl9BRF9MTykpICYgbWFzayk7CisJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIHBjbDgxMl9haV9nZXRfc2FtcGxlKGRldiwgcykpOwogCiAJLyogU2V0IHVwIG5leHQgY2hhbm5lbC4gQWRkZWQgYnkgYWJib3R0aSAyMDEwLTAxLTIwLCBidXQgdW50ZXN0ZWQuICovCiAJbmV4dF9jaGFuID0gcy0+YXN5bmMtPmN1cl9jaGFuICsgMTsKLQlpZiAobmV4dF9jaGFuID49IGRldnByaXYtPmFpX25fY2hhbikKKwlpZiAobmV4dF9jaGFuID49IGNtZC0+Y2hhbmxpc3RfbGVuKQogCQluZXh0X2NoYW4gPSAwOwotCWlmIChkZXZwcml2LT5haV9jaGFubGlzdFtzLT5hc3luYy0+Y3VyX2NoYW5dICE9Ci0JCQlkZXZwcml2LT5haV9jaGFubGlzdFtuZXh0X2NoYW5dKQotCQlzZXR1cF9yYW5nZV9jaGFubmVsKGRldiwgcywgZGV2cHJpdi0+YWlfY2hhbmxpc3RbbmV4dF9jaGFuXSwgMCk7CisJaWYgKGNtZC0+Y2hhbmxpc3Rbcy0+YXN5bmMtPmN1cl9jaGFuXSAhPSBjbWQtPmNoYW5saXN0W25leHRfY2hhbl0pCisJCXBjbDgxMl9haV9zZXRfY2hhbl9yYW5nZShkZXYsIGNtZC0+Y2hhbmxpc3RbbmV4dF9jaGFuXSwgMCk7CiAKLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX0NMUklOVCk7CS8qIGNsZWFyIElOVCByZXF1ZXN0ICovCi0KLQlzLT5hc3luYy0+Y3VyX2NoYW4gPSBuZXh0X2NoYW47Ci0JaWYgKG5leHRfY2hhbiA9PSAwKSB7CS8qIG9uZSBzY2FuIGRvbmUgKi8KLQkJZGV2cHJpdi0+YWlfYWN0X3NjYW4rKzsKLQkJaWYgKCEoZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcpKQotCQkJCQkJCS8qIGFsbCBkYXRhIHNhbXBsZWQgKi8KLQkJCWlmIChkZXZwcml2LT5haV9hY3Rfc2NhbiA+PSBkZXZwcml2LT5haV9zY2FucykgewotCQkJCXBjbDgxMl9haV9jYW5jZWwoZGV2LCBzKTsKLQkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCQl9Ci0JfQotCi0JY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOworCXBjbDgxMl9haV9uZXh0X2NoYW4oZGV2LCBzKTsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KIHN0YXRpYyB2b2lkIHRyYW5zZmVyX2Zyb21fZG1hX2J1ZihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJICB1bnNpZ25lZCBzaG9ydCAqcHRyLAogCQkJCSAgdW5zaWduZWQgaW50IGJ1ZnB0ciwgdW5zaWduZWQgaW50IGxlbikKIHsKLQlzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlzLT5hc3luYy0+ZXZlbnRzID0gMDsKIAlmb3IgKGkgPSBsZW47IGk7IGktLSkgewotCQkJCQkJCS8qICBnZXQgb25lIHNhbXBsZSAqLwogCQljb21lZGlfYnVmX3B1dChzLT5hc3luYywgcHRyW2J1ZnB0cisrXSk7CiAKLQkJcy0+YXN5bmMtPmN1cl9jaGFuKys7Ci0JCWlmIChzLT5hc3luYy0+Y3VyX2NoYW4gPj0gZGV2cHJpdi0+YWlfbl9jaGFuKSB7Ci0JCQlzLT5hc3luYy0+Y3VyX2NoYW4gPSAwOwotCQkJZGV2cHJpdi0+YWlfYWN0X3NjYW4rKzsKLQkJCWlmICghZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcpCi0JCQkJCQkJLyogYWxsIGRhdGEgc2FtcGxlZCAqLwotCQkJCWlmIChkZXZwcml2LT5haV9hY3Rfc2NhbiA+PSBkZXZwcml2LT5haV9zY2FucykgewotCQkJCQlwY2w4MTJfYWlfY2FuY2VsKGRldiwgcyk7Ci0JCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQl9CisJCWlmICghcGNsODEyX2FpX25leHRfY2hhbihkZXYsIHMpKQorCQkJYnJlYWs7CiAJfQotCi0JY29tZWRpX2V2ZW50KGRldiwgcyk7CiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgaXJxcmV0dXJuX3QgaW50ZXJydXB0X3BjbDgxMl9haV9kbWEoaW50IGlycSwgdm9pZCAqZCkKK3N0YXRpYyB2b2lkIHBjbDgxMl9oYW5kbGVfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKLQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKIAlzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0Jc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnJlYWRfc3ViZGV2OwotCXVuc2lnbmVkIGxvbmcgZG1hX2ZsYWdzOwogCWludCBsZW4sIGJ1ZnB0cjsKIAl1bnNpZ25lZCBzaG9ydCAqcHRyOwogCkBAIC04ODMsNTggKzkyMCwzNiBAQAogCWxlbiA9IChkZXZwcml2LT5kbWFieXRlc3RvbW92ZVtkZXZwcml2LT5uZXh0X2RtYV9idWZdID4+IDEpIC0KIAkgICAgZGV2cHJpdi0+YWlfcG9sbF9wdHI7CiAKLQlkZXZwcml2LT5uZXh0X2RtYV9idWYgPSAxIC0gZGV2cHJpdi0+bmV4dF9kbWFfYnVmOwotCWRpc2FibGVfZG1hKGRldnByaXYtPmRtYSk7Ci0Jc2V0X2RtYV9tb2RlKGRldnByaXYtPmRtYSwgRE1BX01PREVfUkVBRCk7Ci0JZG1hX2ZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKLQlzZXRfZG1hX2FkZHIoZGV2cHJpdi0+ZG1hLCBkZXZwcml2LT5od2RtYXB0cltkZXZwcml2LT5uZXh0X2RtYV9idWZdKTsKLQlpZiAoZGV2cHJpdi0+YWlfZW9zKSB7Ci0JCXNldF9kbWFfY291bnQoZGV2cHJpdi0+ZG1hLAotCQkJICAgICAgZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbZGV2cHJpdi0+bmV4dF9kbWFfYnVmXSk7Ci0JfSBlbHNlIHsKLQkJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCkgewotCQkJc2V0X2RtYV9jb3VudChkZXZwcml2LT5kbWEsCi0JCQkJICAgICAgZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbZGV2cHJpdi0+Ci0JCQkJCQkJICAgICAgbmV4dF9kbWFfYnVmXSk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwgZGV2cHJpdi0+bGFzdF9kbWFfcnVuKTsKLQkJfQotCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQtLTsKLQl9Ci0JcmVsZWFzZV9kbWFfbG9jayhkbWFfZmxhZ3MpOwotCWVuYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKLQotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQ0xSSU5UKTsJLyogY2xlYXIgSU5UIHJlcXVlc3QgKi8KKwlwY2w4MTJfYWlfc2V0dXBfbmV4dF9kbWEoZGV2LCBzKTsKIAogCWJ1ZnB0ciA9IGRldnByaXYtPmFpX3BvbGxfcHRyOwogCWRldnByaXYtPmFpX3BvbGxfcHRyID0gMDsKIAogCXRyYW5zZmVyX2Zyb21fZG1hX2J1ZihkZXYsIHMsIHB0ciwgYnVmcHRyLCBsZW4pOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIGlycXJldHVybl90IGludGVycnVwdF9wY2w4MTIoaW50IGlycSwgdm9pZCAqZCkKK3N0YXRpYyBpcnFyZXR1cm5fdCBwY2w4MTJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCiB7CiAJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7CisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnJlYWRfc3ViZGV2OwogCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAogCWlmICghZGV2LT5hdHRhY2hlZCkgewotCQljb21lZGlfZXJyb3IoZGV2LCAic3B1cmlvdXMgaW50ZXJydXB0Iik7CisJCXBjbDgxMl9haV9jbGVhcl9lb2MoZGV2KTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KKwogCWlmIChkZXZwcml2LT5haV9kbWEpCi0JCXJldHVybiBpbnRlcnJ1cHRfcGNsODEyX2FpX2RtYShpcnEsIGQpOworCQlwY2w4MTJfaGFuZGxlX2RtYShkZXYsIHMpOwogCWVsc2UKLQkJcmV0dXJuIGludGVycnVwdF9wY2w4MTJfYWlfaW50KGlycSwgZCk7CisJCXBjbDgxMl9oYW5kbGVfZW9jKGRldiwgcyk7CisKKwlwY2w4MTJfYWlfY2xlYXJfZW9jKGRldik7CisKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOworCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KIHN0YXRpYyBpbnQgcGNsODEyX2FpX3BvbGwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwpAQCAtOTc5LDcyICs5OTQsNiBAQAogCXJldHVybiBzLT5hc3luYy0+YnVmX3dyaXRlX2NvdW50IC0gcy0+YXN5bmMtPmJ1Zl9yZWFkX2NvdW50OwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIHZvaWQgc2V0dXBfcmFuZ2VfY2hhbm5lbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCXVuc2lnbmVkIGludCByYW5nZWNoYW4sIGNoYXIgd2FpdCkKLXsKLQlzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgY2hhciBjaGFuX3JlZyA9IENSX0NIQU4ocmFuZ2VjaGFuKTsJLyogIG5vcm1hbCBib2FyZCAqLwotCQkJCQkJCS8qICBnYWluIGluZGV4ICovCi0JdW5zaWduZWQgY2hhciBnYWluX3JlZyA9IENSX1JBTkdFKHJhbmdlY2hhbikgKwotCQkJCSBkZXZwcml2LT5yYW5nZV9jb3JyZWN0aW9uOwotCi0JaWYgKChjaGFuX3JlZyA9PSBkZXZwcml2LT5vbGRfY2hhbl9yZWcpCi0JICAgICYmIChnYWluX3JlZyA9PSBkZXZwcml2LT5vbGRfZ2Fpbl9yZWcpKQotCQlyZXR1cm47CQkvKiAgd2UgY2FuIHJldHVybiwgbm8gY2hhbmdlICovCi0KLQlkZXZwcml2LT5vbGRfY2hhbl9yZWcgPSBjaGFuX3JlZzsKLQlkZXZwcml2LT5vbGRfZ2Fpbl9yZWcgPSBnYWluX3JlZzsKLQotCWlmIChkZXZwcml2LT51c2VfTVBDKSB7Ci0JCWlmIChkZXZwcml2LT51c2VfZGlmZikgewotCQkJY2hhbl9yZWcgPSBjaGFuX3JlZyB8IDB4MzA7CS8qICBESUZGIGlucHV0cyAqLwotCQl9IGVsc2UgewotCQkJaWYgKGNoYW5fcmVnICYgMHg4MCkKLQkJCQkJCQkvKiAgU0UgaW5wdXRzIDgtMTUgKi8KLQkJCQljaGFuX3JlZyA9IGNoYW5fcmVnIHwgMHgyMDsKLQkJCWVsc2UKLQkJCQkJCQkvKiAgU0UgaW5wdXRzIDAtNyAqLwotCQkJCWNoYW5fcmVnID0gY2hhbl9yZWcgfCAweDEwOwotCQl9Ci0JfQotCi0Jb3V0YihjaGFuX3JlZywgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTVVYKTsJLyogc2VsZWN0IGNoYW5uZWwgKi8KLQlvdXRiKGdhaW5fcmVnLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9HQUlOKTsJLyogc2VsZWN0IGdhaW4gKi8KLQotCi0JaWYgKHdhaXQpCi0JCS8qCi0JCSAqIFhYWCB0aGlzIGRlcGVuZHMgb24gc2VsZWN0ZWQgcmFuZ2UgYW5kIGNhbiBiZSB2ZXJ5IGxvbmcgZm9yCi0JCSAqIHNvbWUgaGlnaCBnYWluIHJhbmdlcyEKLQkJICovCi0JCXVkZWxheShkZXZwcml2LT5tYXhfODEyX2FpX21vZGUwX3Jhbmdld2FpdCk7Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgdm9pZCBzdGFydF9wYWNlcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBpbnQgbW9kZSwKLQkJCXVuc2lnbmVkIGludCBkaXZpc29yMSwgdW5zaWduZWQgaW50IGRpdmlzb3IyKQotewotCW91dGIoMHhiNCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQ1RSQ1RMKTsKLQlvdXRiKDB4NzQsIGRldi0+aW9iYXNlICsgUENMODEyX0NUUkNUTCk7Ci0JdWRlbGF5KDEpOwotCi0JaWYgKG1vZGUgPT0gMSkgewotCQlvdXRiKGRpdmlzb3IyICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQ1RSMik7Ci0JCW91dGIoKGRpdmlzb3IyID4+IDgpICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQ1RSMik7Ci0JCW91dGIoZGl2aXNvcjEgJiAweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9DVFIxKTsKLQkJb3V0YigoZGl2aXNvcjEgPj4gOCkgJiAweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9DVFIxKTsKLQl9Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCiBzdGF0aWMgaW50IHBjbDgxMl9haV9jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKQEAgLTEwNTIsMTMxICsxMDAxLDMwMSBAQAogCiAJaWYgKGRldnByaXYtPmFpX2RtYSkKIAkJZGlzYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX0NMUklOVCk7CS8qIGNsZWFyIElOVCByZXF1ZXN0ICovCi0JCQkJCQkJLyogU3RvcCBBL0QgKi8KLQlvdXRiKGRldnByaXYtPm1vZGVfcmVnX2ludCB8IDAsIGRldi0+aW9iYXNlICsgUENMODEyX01PREUpOwotCXN0YXJ0X3BhY2VyKGRldiwgLTEsIDAsIDApOwkvKiAgc3RvcCA4MjU0ICovCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9DTFJJTlQpOwkvKiBjbGVhciBJTlQgcmVxdWVzdCAqLworCisJb3V0YihkZXZwcml2LT5tb2RlX3JlZ19pbnQgfCBQQ0w4MTJfQ1RSTF9ESVNBQkxFX1RSSUcsCisJICAgICBkZXYtPmlvYmFzZSArIFBDTDgxMl9DVFJMX1JFRyk7CisJcGNsODEyX3N0YXJ0X3BhY2VyKGRldiwgZmFsc2UpOworCXBjbDgxMl9haV9jbGVhcl9lb2MoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KK3N0YXRpYyBpbnQgcGNsODEyX2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCWludCByZXQgPSAwOworCWludCBpOworCisJb3V0YihkZXZwcml2LT5tb2RlX3JlZ19pbnQgfCBQQ0w4MTJfQ1RSTF9TT0ZUX1RSSUcsCisJICAgICBkZXYtPmlvYmFzZSArIFBDTDgxMl9DVFJMX1JFRyk7CisKKwlwY2w4MTJfYWlfc2V0X2NoYW5fcmFuZ2UoZGV2LCBpbnNuLT5jaGFuc3BlYywgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCXBjbDgxMl9haV9jbGVhcl9lb2MoZGV2KTsKKwkJcGNsODEyX2FpX3NvZnRfdHJpZyhkZXYpOworCisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcGNsODEyX2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQlkYXRhW2ldID0gcGNsODEyX2FpX2dldF9zYW1wbGUoZGV2LCBzKTsKKwl9CisJb3V0YihkZXZwcml2LT5tb2RlX3JlZ19pbnQgfCBQQ0w4MTJfQ1RSTF9ESVNBQkxFX1RSSUcsCisJICAgICBkZXYtPmlvYmFzZSArIFBDTDgxMl9DVFJMX1JFRyk7CisJcGNsODEyX2FpX2NsZWFyX2VvYyhkZXYpOworCisJcmV0dXJuIHJldCA/IHJldCA6IGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgcGNsODEyX2FvX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJdW5zaWduZWQgaW50ICpkYXRhKQoreworCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQlvdXRiKChkYXRhW2ldICYgMHhmZiksCisJCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQU9fTFNCX1JFRyhjaGFuKSk7CisJCW91dGIoKGRhdGFbaV0gPj4gOCkgJiAweDBmLAorCQkgICAgIGRldi0+aW9iYXNlICsgUENMODEyX0FPX01TQl9SRUcoY2hhbikpOworCQlkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXSA9IGRhdGFbaV07CisJfQorCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgcGNsODEyX2FvX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKQorCQlkYXRhW2ldID0gZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl07CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCBwY2w4MTJfZGlfaW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlkYXRhWzFdID0gaW5iKGRldi0+aW9iYXNlICsgUENMODEyX0RJX0xTQl9SRUcpIHwKKwkJICAoaW5iKGRldi0+aW9iYXNlICsgUENMODEyX0RJX01TQl9SRUcpIDw8IDgpOworCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgcGNsODEyX2RvX2luc25fYml0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJaWYgKGNvbWVkaV9kaW9fdXBkYXRlX3N0YXRlKHMsIGRhdGEpKSB7CisJCW91dGIocy0+c3RhdGUgJiAweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9ET19MU0JfUkVHKTsKKwkJb3V0Yigocy0+c3RhdGUgPj4gOCksIGRldi0+aW9iYXNlICsgUENMODEyX0RPX01TQl9SRUcpOworCX0KKworCWRhdGFbMV0gPSBzLT5zdGF0ZTsKKworCXJldHVybiBpbnNuLT5uOworfQorCiBzdGF0aWMgdm9pZCBwY2w4MTJfcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAljb25zdCBzdHJ1Y3QgcGNsODEyX2JvYXJkICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbjsKIAotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTVVYKTsKLQlvdXRiKDAgKyBkZXZwcml2LT5yYW5nZV9jb3JyZWN0aW9uLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9HQUlOKTsKLQlkZXZwcml2LT5vbGRfY2hhbl9yZWcgPSAtMTsJLyogIGludmFsaWRhdGUgY2hhaW4vZ2FpbiBtZW1vcnkgKi8KLQlkZXZwcml2LT5vbGRfZ2Fpbl9yZWcgPSAtMTsKKwkvKiBkaXNhYmxlIGFuYWxvZyBpbnB1dCB0cmlnZ2VyICovCisJb3V0YihkZXZwcml2LT5tb2RlX3JlZ19pbnQgfCBQQ0w4MTJfQ1RSTF9ESVNBQkxFX1RSSUcsCisJICAgICBkZXYtPmlvYmFzZSArIFBDTDgxMl9DVFJMX1JFRyk7CisJcGNsODEyX2FpX2NsZWFyX2VvYyhkZXYpOwogCisJLyogc3RvcCBwYWNlciAqLworCWlmIChib2FyZC0+SVJRYml0cykKKwkJcGNsODEyX3N0YXJ0X3BhY2VyKGRldiwgZmFsc2UpOworCisJLyoKKwkgKiBJbnZhbGlkYXRlIGxhc3RfYWlfY2hhbnNwZWMgdGhlbiBzZXQgYW5hbG9nIGlucHV0IHRvCisJICoga25vd24gY2hhbm5lbC9yYW5nZS4KKwkgKi8KKwlkZXZwcml2LT5sYXN0X2FpX2NoYW5zcGVjID0gQ1JfUEFDSygxNiwgMCwgMCk7CisJcGNsODEyX2FpX3NldF9jaGFuX3JhbmdlKGRldiwgQ1JfUEFDSygwLCAwLCAwKSwgMCk7CisKKwkvKiBzZXQgYW5hbG9nIG91dHB1dCBjaGFubmVscyB0byAwViAqLworCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBib2FyZC0+bl9hb2NoYW47IGNoYW4rKykgeworCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX0FPX0xTQl9SRUcoY2hhbikpOworCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX0FPX01TQl9SRUcoY2hhbikpOworCX0KKworCS8qIHNldCBhbGwgZGlnaXRhbCBvdXRwdXRzIGxvdyAqLworCWlmIChib2FyZC0+aGFzX2RpbykgeworCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX0RPX01TQl9SRUcpOworCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX0RPX0xTQl9SRUcpOworCX0KK30KKworc3RhdGljIHZvaWQgcGNsODEyX3NldF9haV9yYW5nZV90YWJsZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCkKK3sKKwljb25zdCBzdHJ1Y3QgcGNsODEyX2JvYXJkICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOworCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKworCS8qIGRlZmF1bHQgdG8gdGhlIHJhbmdlIHRhYmxlIGZyb20gdGhlIGJvYXJkaW5mbyAqLworCXMtPnJhbmdlX3RhYmxlID0gYm9hcmQtPnJhbmdlbGlzdF9haTsKKworCS8qIG5vdyBjaGVjayB0aGUgdXNlciBjb25maWcgb3B0aW9uIGJhc2VkIG9uIHRoZSBib2FyZHR5cGUgKi8KIAlzd2l0Y2ggKGJvYXJkLT5ib2FyZF90eXBlKSB7CiAJY2FzZSBib2FyZFBDTDgxMlBHOgorCQlpZiAoaXQtPm9wdGlvbnNbNF0gPT0gMSkKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3BjbDgxMnBnMl9haTsKKwkJYnJlYWs7CiAJY2FzZSBib2FyZFBDTDgxMjoKLQljYXNlIGJvYXJkQUNMODExMjoKLQljYXNlIGJvYXJkQUNMODIxNjoKLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9EQTJfTE8pOwotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX0RBMl9ISSk7Ci0JY2FzZSBib2FyZEE4MjE6Ci0JCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfREExX0xPKTsKLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9EQTFfSEkpOwotCQlzdGFydF9wYWNlcihkZXYsIC0xLCAwLCAwKTsJLyogIHN0b3AgODI1NCAqLwotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX0RPX0hJKTsKLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9ET19MTyk7Ci0JCW91dGIoZGV2cHJpdi0+bW9kZV9yZWdfaW50IHwgMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTU9ERSk7Ci0JCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQ0xSSU5UKTsKKwkJc3dpdGNoIChpdC0+b3B0aW9uc1s0XSkgeworCQljYXNlIDA6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9iaXBvbGFyMTA7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYmlwb2xhcjU7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYmlwb2xhcjJfNTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZTgxMl9iaXBvbGFyMV8yNTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZTgxMl9iaXBvbGFyMF82MjU7CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2U4MTJfYmlwb2xhcjBfMzEyNTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYmlwb2xhcjEwOworCQkJYnJlYWs7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBib2FyZFBDTDgxM0I6Ci0JY2FzZSBib2FyZFBDTDgxMzoKKwkJaWYgKGl0LT5vcHRpb25zWzFdID09IDEpCisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9wY2w4MTNiMl9haTsKKwkJYnJlYWs7CiAJY2FzZSBib2FyZElTTzgxMzoKKwkJc3dpdGNoIChpdC0+b3B0aW9uc1sxXSkgeworCQljYXNlIDA6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9pc284MTNfMV9haTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9pc284MTNfMV8yX2FpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2lzbzgxM18yX2FpOworCQkJZGV2cHJpdi0+cmFuZ2VfY29ycmVjdGlvbiA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfaXNvODEzXzJfMl9haTsKKwkJCWRldnByaXYtPnJhbmdlX2NvcnJlY3Rpb24gPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9pc284MTNfMV9haTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOwogCWNhc2UgYm9hcmRBQ0w4MTEzOgotCQl1ZGVsYXkoNSk7CisJCXN3aXRjaCAoaXQtPm9wdGlvbnNbMV0pIHsKKwkJY2FzZSAwOgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYWNsODExM18xX2FpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2FjbDgxMTNfMV8yX2FpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2FjbDgxMTNfMl9haTsKKwkJCWRldnByaXYtPnJhbmdlX2NvcnJlY3Rpb24gPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2FjbDgxMTNfMl8yX2FpOworCQkJZGV2cHJpdi0+cmFuZ2VfY29ycmVjdGlvbiA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2FjbDgxMTNfMV9haTsKKwkJCWJyZWFrOworCQl9CiAJCWJyZWFrOwogCX0KLQl1ZGVsYXkoNSk7CiB9CiAKIHN0YXRpYyBpbnQgcGNsODEyX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpCiB7CiAJY29uc3Qgc3RydWN0IHBjbDgxMl9ib2FyZCAqYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKIAlzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgKmRldnByaXY7Ci0JaW50IHJldCwgc3ViZGV2OwotCXVuc2lnbmVkIGludCBkbWE7Ci0JdW5zaWduZWQgbG9uZyBwYWdlczsKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKIAlpbnQgbl9zdWJkZXZpY2VzOwotCi0JcmV0ID0gY29tZWRpX3JlcXVlc3RfcmVnaW9uKGRldiwgaXQtPm9wdGlvbnNbMF0sIGJvYXJkLT5pb19yYW5nZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlpbnQgc3ViZGV2OworCWludCByZXQ7CisJaW50IGk7CiAKIAlkZXZwcml2ID0gY29tZWRpX2FsbG9jX2RldnByaXYoZGV2LCBzaXplb2YoKmRldnByaXYpKTsKIAlpZiAoIWRldnByaXYpCiAJCXJldHVybiAtRU5PTUVNOwogCisJcmV0ID0gY29tZWRpX3JlcXVlc3RfcmVnaW9uKGRldiwgaXQtPm9wdGlvbnNbMF0sIDB4MTApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlpZiAoKDEgPDwgaXQtPm9wdGlvbnNbMV0pICYgYm9hcmQtPklSUWJpdHMpIHsKLQkJcmV0ID0gcmVxdWVzdF9pcnEoaXQtPm9wdGlvbnNbMV0sIGludGVycnVwdF9wY2w4MTIsIDAsCisJCXJldCA9IHJlcXVlc3RfaXJxKGl0LT5vcHRpb25zWzFdLCBwY2w4MTJfaW50ZXJydXB0LCAwLAogCQkJCSAgZGV2LT5ib2FyZF9uYW1lLCBkZXYpOwogCQlpZiAocmV0ID09IDApCiAJCQlkZXYtPmlycSA9IGl0LT5vcHRpb25zWzFdOwogCX0KIAotCWRtYSA9IDA7Ci0JZGV2cHJpdi0+ZG1hID0gZG1hOwotCWlmICghZGV2LT5pcnEpCi0JCWdvdG8gbm9fZG1hOwkvKiBpZiB3ZSBoYXZlbid0IElSUSwgd2UgY2FuJ3QgdXNlIERNQSAqLwotCWlmIChib2FyZC0+RE1BYml0cyAhPSAwKSB7CS8qIGJvYXJkIHN1cHBvcnQgRE1BICovCi0JCWRtYSA9IGl0LT5vcHRpb25zWzJdOwotCQlpZiAoKCgxIDw8IGRtYSkgJiBib2FyZC0+RE1BYml0cykgPT0gMCkgewotCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCQkiRE1BIGlzIG91dCBvZiBhbGxvd2VkIHJhbmdlLCBGQUlMIVxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsJLyogQmFkIERNQSAqLwotCQl9Ci0JCXJldCA9IHJlcXVlc3RfZG1hKGRtYSwgZGV2LT5ib2FyZF9uYW1lKTsKKwkvKiB3ZSBuZWVkIGFuIElSUSB0byBkbyBETUEgb24gY2hhbm5lbCAzIG9yIDEgKi8KKwlpZiAoZGV2LT5pcnEgJiYgYm9hcmQtPmhhc19kbWEgJiYKKwkgICAgKGl0LT5vcHRpb25zWzJdID09IDMgfHwgaXQtPm9wdGlvbnNbMl0gPT0gMSkpIHsKKwkJcmV0ID0gcmVxdWVzdF9kbWEoaXQtPm9wdGlvbnNbMl0sIGRldi0+Ym9hcmRfbmFtZSk7CiAJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkJInVuYWJsZSB0byBhbGxvY2F0ZSBETUEgJXUsIEZBSUwhXG4iLCBkbWEpOwotCQkJcmV0dXJuIC1FQlVTWTsJLyogRE1BIGlzbid0IGZyZWUgKi8KLQkJfQotCQlkZXZwcml2LT5kbWEgPSBkbWE7Ci0JCXBhZ2VzID0gMTsJLyogd2Ugd2FudCA4S0IgKi8KLQkJZGV2cHJpdi0+ZG1hYnVmWzBdID0gX19nZXRfZG1hX3BhZ2VzKEdGUF9LRVJORUwsIHBhZ2VzKTsKLQkJaWYgKCFkZXZwcml2LT5kbWFidWZbMF0pIHsKLQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkJInVuYWJsZSB0byBhbGxvY2F0ZSBETUEgYnVmZmVyLCBGQUlMIVxuIik7Ci0JCQkvKgotCQkJICogbWF5YmUgZXhwZXJpbWVudCB3aXRoIHRyeV90b19mcmVlX3BhZ2VzKCkKLQkJCSAqIHdpbGwgaGVscCAuLi4uCi0JCQkgKi8KLQkJCXJldHVybiAtRUJVU1k7CS8qIG5vIGJ1ZmZlciA6LSggKi8KLQkJfQotCQlkZXZwcml2LT5kbWFwYWdlc1swXSA9IHBhZ2VzOwotCQlkZXZwcml2LT5od2RtYXB0clswXSA9IHZpcnRfdG9fYnVzKCh2b2lkICopZGV2cHJpdi0+ZG1hYnVmWzBdKTsKLQkJZGV2cHJpdi0+aHdkbWFzaXplWzBdID0gUEFHRV9TSVpFICogKDEgPDwgcGFnZXMpOwotCQlkZXZwcml2LT5kbWFidWZbMV0gPSBfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgcGFnZXMpOwotCQlpZiAoIWRldnByaXYtPmRtYWJ1ZlsxXSkgewotCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCQkidW5hYmxlIHRvIGFsbG9jYXRlIERNQSBidWZmZXIsIEZBSUwhXG4iKTsKKwkJCQkidW5hYmxlIHRvIHJlcXVlc3QgRE1BIGNoYW5uZWwgJWRcbiIsCisJCQkJaXQtPm9wdGlvbnNbMl0pOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQotCQlkZXZwcml2LT5kbWFwYWdlc1sxXSA9IHBhZ2VzOwotCQlkZXZwcml2LT5od2RtYXB0clsxXSA9IHZpcnRfdG9fYnVzKCh2b2lkICopZGV2cHJpdi0+ZG1hYnVmWzFdKTsKLQkJZGV2cHJpdi0+aHdkbWFzaXplWzFdID0gUEFHRV9TSVpFICogKDEgPDwgcGFnZXMpOwotCX0KLW5vX2RtYToKKwkJZGV2cHJpdi0+ZG1hID0gaXQtPm9wdGlvbnNbMl07CiAKLQluX3N1YmRldmljZXMgPSAwOwotCWlmIChib2FyZC0+bl9haWNoYW4gPiAwKQotCQluX3N1YmRldmljZXMrKzsKKwkJZGV2cHJpdi0+ZG1hcGFnZXMgPSAxOwkvKiB3ZSB3YW50IDhLQiAqLworCQlkZXZwcml2LT5od2RtYXNpemUgPSAoMSA8PCBkZXZwcml2LT5kbWFwYWdlcykgKiBQQUdFX1NJWkU7CisKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJdW5zaWduZWQgbG9uZyBkbWFidWY7CisKKwkJCWRtYWJ1ZiA9ICBfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgZGV2cHJpdi0+ZG1hcGFnZXMpOworCQkJaWYgKCFkbWFidWYpCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCWRldnByaXYtPmRtYWJ1ZltpXSA9IGRtYWJ1ZjsKKwkJCWRldnByaXYtPmh3ZG1hcHRyW2ldID0gdmlydF90b19idXMoKHZvaWQgKilkbWFidWYpOworCQl9CisJfQorCisJLyogZGlmZmVyZW50aWFsIGFuYWxvZyBpbnB1dHM/ICovCisJc3dpdGNoIChib2FyZC0+Ym9hcmRfdHlwZSkgeworCWNhc2UgYm9hcmRBODIxOgorCQlpZiAoaXQtPm9wdGlvbnNbMl0gPT0gMSkKKwkJCWRldnByaXYtPnVzZV9kaWZmID0gMTsKKwkJYnJlYWs7CisJY2FzZSBib2FyZEFDTDgxMTI6CisJY2FzZSBib2FyZEFDTDgyMTY6CisJCWlmIChpdC0+b3B0aW9uc1s0XSA9PSAxKQorCQkJZGV2cHJpdi0+dXNlX2RpZmYgPSAxOworCQlicmVhazsKKwl9CisKKwluX3N1YmRldmljZXMgPSAxOwkJLyogYWxsIGJvYXJkdHlwZXMgaGF2ZSBhbmFsb2cgaW5wdXRzICovCiAJaWYgKGJvYXJkLT5uX2FvY2hhbiA+IDApCiAJCW5fc3ViZGV2aWNlcysrOwotCWlmIChib2FyZC0+bl9kaWNoYW4gPiAwKQotCQluX3N1YmRldmljZXMrKzsKLQlpZiAoYm9hcmQtPm5fZG9jaGFuID4gMCkKLQkJbl9zdWJkZXZpY2VzKys7CisJaWYgKGJvYXJkLT5oYXNfZGlvKQorCQluX3N1YmRldmljZXMgKz0gMjsKIAogCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgbl9zdWJkZXZpY2VzKTsKIAlpZiAocmV0KQpAQCAtMTE4NCwxNDYgKzEzMDMsNDcgQEAKIAogCXN1YmRldiA9IDA7CiAKLQkvKiBhbmFsb2cgaW5wdXQgKi8KLQlpZiAoYm9hcmQtPm5fYWljaGFuID4gMCkgewotCQlzID0gJmRldi0+c3ViZGV2aWNlc1tzdWJkZXZdOwotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfQUk7Ci0JCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRTsKLQkJc3dpdGNoIChib2FyZC0+Ym9hcmRfdHlwZSkgewotCQljYXNlIGJvYXJkQTgyMToKLQkJCWlmIChpdC0+b3B0aW9uc1syXSA9PSAxKSB7Ci0JCQkJcy0+bl9jaGFuID0gYm9hcmQtPm5fYWljaGFuX2RpZmY7Ci0JCQkJcy0+c3ViZGV2X2ZsYWdzIHw9IFNERl9ESUZGOwotCQkJCWRldnByaXYtPnVzZV9kaWZmID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJcy0+bl9jaGFuID0gYm9hcmQtPm5fYWljaGFuOwotCQkJCXMtPnN1YmRldl9mbGFncyB8PSBTREZfR1JPVU5EOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgYm9hcmRBQ0w4MTEyOgotCQljYXNlIGJvYXJkQUNMODIxNjoKLQkJCWlmIChpdC0+b3B0aW9uc1s0XSA9PSAxKSB7Ci0JCQkJcy0+bl9jaGFuID0gYm9hcmQtPm5fYWljaGFuX2RpZmY7Ci0JCQkJcy0+c3ViZGV2X2ZsYWdzIHw9IFNERl9ESUZGOwotCQkJCWRldnByaXYtPnVzZV9kaWZmID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJcy0+bl9jaGFuID0gYm9hcmQtPm5fYWljaGFuOwotCQkJCXMtPnN1YmRldl9mbGFncyB8PSBTREZfR1JPVU5EOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9haWNoYW47Ci0JCQlzLT5zdWJkZXZfZmxhZ3MgfD0gU0RGX0dST1VORDsKLQkJCWJyZWFrOwotCQl9Ci0JCXMtPm1heGRhdGEgPSBib2FyZC0+YWlfbWF4ZGF0YTsKLQkJcy0+cmFuZ2VfdGFibGUgPSBib2FyZC0+cmFuZ2VsaXN0X2FpOwotCQlpZiAoYm9hcmQtPmJvYXJkX3R5cGUgPT0gYm9hcmRBQ0w4MjE2KQotCQkJcy0+aW5zbl9yZWFkID0gYWNsODIxNl9haV9pbnNuX3JlYWQ7Ci0JCWVsc2UKLQkJCXMtPmluc25fcmVhZCA9IHBjbDgxMl9haV9pbnNuX3JlYWQ7Ci0KLQkJZGV2cHJpdi0+dXNlX01QQyA9IGJvYXJkLT5oYXZlTVBDNTA4OwotCQlpZiAoZGV2LT5pcnEpIHsKLQkJCWRldi0+cmVhZF9zdWJkZXYgPSBzOwotCQkJcy0+c3ViZGV2X2ZsYWdzIHw9IFNERl9DTURfUkVBRDsKLQkJCXMtPmxlbl9jaGFubGlzdCA9IE1BWF9DSEFOTElTVF9MRU47Ci0JCQlzLT5kb19jbWR0ZXN0ID0gcGNsODEyX2FpX2NtZHRlc3Q7Ci0JCQlzLT5kb19jbWQgPSBwY2w4MTJfYWlfY21kOwotCQkJcy0+cG9sbCA9IHBjbDgxMl9haV9wb2xsOwotCQkJcy0+Y2FuY2VsID0gcGNsODEyX2FpX2NhbmNlbDsKLQkJfQotCQlzd2l0Y2ggKGJvYXJkLT5ib2FyZF90eXBlKSB7Ci0JCWNhc2UgYm9hcmRQQ0w4MTJQRzoKLQkJCWlmIChpdC0+b3B0aW9uc1s0XSA9PSAxKQotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3BjbDgxMnBnMl9haTsKLQkJCWJyZWFrOwotCQljYXNlIGJvYXJkUENMODEyOgotCQkJc3dpdGNoIChpdC0+b3B0aW9uc1s0XSkgewotCQkJY2FzZSAwOgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2JpcG9sYXIxMDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9iaXBvbGFyNTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9iaXBvbGFyMl81OwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlODEyX2JpcG9sYXIxXzI1OwotCQkJCWJyZWFrOwotCQkJY2FzZSA0OgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlODEyX2JpcG9sYXIwXzYyNTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNToKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZTgxMl9iaXBvbGFyMF8zMTI1OwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9iaXBvbGFyMTA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJCWJyZWFrOwotCQljYXNlIGJvYXJkUENMODEzQjoKLQkJCWlmIChpdC0+b3B0aW9uc1sxXSA9PSAxKQotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3BjbDgxM2IyX2FpOwotCQkJYnJlYWs7Ci0JCWNhc2UgYm9hcmRJU084MTM6Ci0JCQlzd2l0Y2ggKGl0LT5vcHRpb25zWzFdKSB7Ci0JCQljYXNlIDA6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfaXNvODEzXzFfYWk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfaXNvODEzXzFfMl9haTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9pc284MTNfMl9haTsKLQkJCQlkZXZwcml2LT5yYW5nZV9jb3JyZWN0aW9uID0gMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9pc284MTNfMl8yX2FpOwotCQkJCWRldnByaXYtPnJhbmdlX2NvcnJlY3Rpb24gPSAxOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9pc284MTNfMV9haTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIGJvYXJkQUNMODExMzoKLQkJCXN3aXRjaCAoaXQtPm9wdGlvbnNbMV0pIHsKLQkJCWNhc2UgMDoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9hY2w4MTEzXzFfYWk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYWNsODExM18xXzJfYWk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYWNsODExM18yX2FpOwotCQkJCWRldnByaXYtPnJhbmdlX2NvcnJlY3Rpb24gPSAxOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2FjbDgxMTNfMl8yX2FpOwotCQkJCWRldnByaXYtPnJhbmdlX2NvcnJlY3Rpb24gPSAxOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9hY2w4MTEzXzFfYWk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlzdWJkZXYrKzsKKwkvKiBBbmFsb2cgSW5wdXQgc3ViZGV2aWNlICovCisJcyA9ICZkZXYtPnN1YmRldmljZXNbc3ViZGV2XTsKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0FJOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9SRUFEQUJMRTsKKwlpZiAoZGV2cHJpdi0+dXNlX2RpZmYpIHsKKwkJcy0+c3ViZGV2X2ZsYWdzCXw9IFNERl9ESUZGOworCQlzLT5uX2NoYW4JPSBib2FyZC0+bl9haWNoYW4gLyAyOworCX0gZWxzZSB7CisJCXMtPnN1YmRldl9mbGFncwl8PSBTREZfR1JPVU5EOworCQlzLT5uX2NoYW4JPSBib2FyZC0+bl9haWNoYW47CiAJfQorCXMtPm1heGRhdGEJPSBib2FyZC0+aGFzXzE2Yml0X2FpID8gMHhmZmZmIDogMHgwZmZmOworCisJcGNsODEyX3NldF9haV9yYW5nZV90YWJsZShkZXYsIHMsIGl0KTsKKworCXMtPmluc25fcmVhZAk9IHBjbDgxMl9haV9pbnNuX3JlYWQ7CisKKwlpZiAoZGV2LT5pcnEpIHsKKwkJZGV2LT5yZWFkX3N1YmRldiA9IHM7CisJCXMtPnN1YmRldl9mbGFncwl8PSBTREZfQ01EX1JFQUQ7CisJCXMtPmxlbl9jaGFubGlzdAk9IE1BWF9DSEFOTElTVF9MRU47CisJCXMtPmRvX2NtZHRlc3QJPSBwY2w4MTJfYWlfY21kdGVzdDsKKwkJcy0+ZG9fY21kCT0gcGNsODEyX2FpX2NtZDsKKwkJcy0+cG9sbAkJPSBwY2w4MTJfYWlfcG9sbDsKKwkJcy0+Y2FuY2VsCT0gcGNsODEyX2FpX2NhbmNlbDsKKwl9CisKKwlkZXZwcml2LT51c2VfbXBjNTA4ID0gYm9hcmQtPmhhc19tcGM1MDhfbXV4OworCisJc3ViZGV2Kys7CiAKIAkvKiBhbmFsb2cgb3V0cHV0ICovCiAJaWYgKGJvYXJkLT5uX2FvY2hhbiA+IDApIHsKIAkJcyA9ICZkZXYtPnN1YmRldmljZXNbc3ViZGV2XTsKLQkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FPOwotCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfR1JPVU5EOwotCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9hb2NoYW47Ci0JCXMtPm1heGRhdGEgPSAweGZmZjsKLQkJcy0+cmFuZ2VfdGFibGUgPSBib2FyZC0+cmFuZ2VsaXN0X2FvOwotCQlzLT5pbnNuX3JlYWQgPSBwY2w4MTJfYW9faW5zbl9yZWFkOwotCQlzLT5pbnNuX3dyaXRlID0gcGNsODEyX2FvX2luc25fd3JpdGU7CisJCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQU87CisJCXMtPnN1YmRldl9mbGFncwk9IFNERl9XUklUQUJMRSB8IFNERl9HUk9VTkQ7CisJCXMtPm5fY2hhbgk9IGJvYXJkLT5uX2FvY2hhbjsKKwkJcy0+bWF4ZGF0YQk9IDB4ZmZmOworCQlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV91bmlwb2xhcjU7CisJCXMtPmluc25fcmVhZAk9IHBjbDgxMl9hb19pbnNuX3JlYWQ7CisJCXMtPmluc25fd3JpdGUJPSBwY2w4MTJfYW9faW5zbl93cml0ZTsKIAkJc3dpdGNoIChib2FyZC0+Ym9hcmRfdHlwZSkgewogCQljYXNlIGJvYXJkQTgyMToKIAkJCWlmIChpdC0+b3B0aW9uc1szXSA9PSAxKQpAQCAtMTM0MiwzMyArMTM2MiwzMCBAQAogCQlzdWJkZXYrKzsKIAl9CiAKLQkvKiBkaWdpdGFsIGlucHV0ICovCi0JaWYgKGJvYXJkLT5uX2RpY2hhbiA+IDApIHsKKwlpZiAoYm9hcmQtPmhhc19kaW8pIHsKKwkJLyogRGlnaXRhbCBJbnB1dCBzdWJkZXZpY2UgKi8KIAkJcyA9ICZkZXYtPnN1YmRldmljZXNbc3ViZGV2XTsKLQkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJOwotCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEU7Ci0JCXMtPm5fY2hhbiA9IGJvYXJkLT5uX2RpY2hhbjsKLQkJcy0+bWF4ZGF0YSA9IDE7Ci0JCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7Ci0JCXMtPmluc25fYml0cyA9IHBjbDgxMl9kaV9pbnNuX2JpdHM7CisJCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfREk7CisJCXMtPnN1YmRldl9mbGFncwk9IFNERl9SRUFEQUJMRTsKKwkJcy0+bl9jaGFuCT0gMTY7CisJCXMtPm1heGRhdGEJPSAxOworCQlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV9kaWdpdGFsOworCQlzLT5pbnNuX2JpdHMJPSBwY2w4MTJfZGlfaW5zbl9iaXRzOwogCQlzdWJkZXYrKzsKLQl9CiAKLQkvKiBkaWdpdGFsIG91dHB1dCAqLwotCWlmIChib2FyZC0+bl9kb2NoYW4gPiAwKSB7CisJCS8qIERpZ2l0YWwgT3V0cHV0IHN1YmRldmljZSAqLwogCQlzID0gJmRldi0+c3ViZGV2aWNlc1tzdWJkZXZdOwotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfRE87Ci0JCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRTsKLQkJcy0+bl9jaGFuID0gYm9hcmQtPm5fZG9jaGFuOwotCQlzLT5tYXhkYXRhID0gMTsKLQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKLQkJcy0+aW5zbl9iaXRzID0gcGNsODEyX2RvX2luc25fYml0czsKKwkJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9ETzsKKwkJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1dSSVRBQkxFOworCQlzLT5uX2NoYW4JPSAxNjsKKwkJcy0+bWF4ZGF0YQk9IDE7CisJCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2RpZ2l0YWw7CisJCXMtPmluc25fYml0cwk9IHBjbDgxMl9kb19pbnNuX2JpdHM7CiAJCXN1YmRldisrOwogCX0KIAogCXN3aXRjaCAoYm9hcmQtPmJvYXJkX3R5cGUpIHsKIAljYXNlIGJvYXJkQUNMODIxNjoKLQkJZGV2cHJpdi0+YWlfaXMxNmIgPSAxOwogCWNhc2UgYm9hcmRQQ0w4MTJQRzoKIAljYXNlIGJvYXJkUENMODEyOgogCWNhc2UgYm9hcmRBQ0w4MTEyOgpAQCAtMTM5MCw4ICsxNDA3LDYgQEAKIAkJYnJlYWs7CiAJfQogCi0JZGV2cHJpdi0+dmFsaWQgPSAxOwotCiAJcGNsODEyX3Jlc2V0KGRldik7CiAKIAlyZXR1cm4gMDsKQEAgLTE0MDMsNzIgKzE0MTgsMTUgQEAKIAogCWlmIChkZXZwcml2KSB7CiAJCWlmIChkZXZwcml2LT5kbWFidWZbMF0pCi0JCQlmcmVlX3BhZ2VzKGRldnByaXYtPmRtYWJ1ZlswXSwgZGV2cHJpdi0+ZG1hcGFnZXNbMF0pOworCQkJZnJlZV9wYWdlcyhkZXZwcml2LT5kbWFidWZbMF0sIGRldnByaXYtPmRtYXBhZ2VzKTsKIAkJaWYgKGRldnByaXYtPmRtYWJ1ZlsxXSkKLQkJCWZyZWVfcGFnZXMoZGV2cHJpdi0+ZG1hYnVmWzFdLCBkZXZwcml2LT5kbWFwYWdlc1sxXSk7CisJCQlmcmVlX3BhZ2VzKGRldnByaXYtPmRtYWJ1ZlsxXSwgZGV2cHJpdi0+ZG1hcGFnZXMpOwogCQlpZiAoZGV2cHJpdi0+ZG1hKQogCQkJZnJlZV9kbWEoZGV2cHJpdi0+ZG1hKTsKIAl9CiAJY29tZWRpX2xlZ2FjeV9kZXRhY2goZGV2KTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2w4MTJfYm9hcmQgYm9hcmR0eXBlc1tdID0gewotCXsicGNsODEyIiwgYm9hcmRQQ0w4MTIsIDE2LCAwLCAyLCAxNiwgMTYsIDB4MGZmZiwKLQkgMzMwMDAsIEk4MjU0X09TQ19CQVNFXzJNSFosICZyYW5nZV9iaXBvbGFyMTAsICZyYW5nZV91bmlwb2xhcjUsCi0JIDB4ZGNmYywgMHgwYSwgUENMeDF4X0lPUkFOR0UsIDB9LAotCXsicGNsODEycGciLCBib2FyZFBDTDgxMlBHLCAxNiwgMCwgMiwgMTYsIDE2LCAweDBmZmYsCi0JIDMzMDAwLCBJODI1NF9PU0NfQkFTRV8yTUhaLCAmcmFuZ2VfcGNsODEycGdfYWksICZyYW5nZV91bmlwb2xhcjUsCi0JIDB4ZGNmYywgMHgwYSwgUENMeDF4X0lPUkFOR0UsIDB9LAotCXsiYWNsODExMnBnIiwgYm9hcmRQQ0w4MTJQRywgMTYsIDAsIDIsIDE2LCAxNiwgMHgwZmZmLAotCSAxMDAwMCwgSTgyNTRfT1NDX0JBU0VfMk1IWiwgJnJhbmdlX3BjbDgxMnBnX2FpLCAmcmFuZ2VfdW5pcG9sYXI1LAotCSAweGRjZmMsIDB4MGEsIFBDTHgxeF9JT1JBTkdFLCAwfSwKLQl7ImFjbDgxMTJkZyIsIGJvYXJkQUNMODExMiwgMTYsIDgsIDIsIDE2LCAxNiwgMHgwZmZmLAotCSAxMDAwMCwgSTgyNTRfT1NDX0JBU0VfMk1IWiwgJnJhbmdlX2FjbDgxMTJkZ19haSwgJnJhbmdlX3VuaXBvbGFyNSwKLQkgMHhkY2ZjLCAweDBhLCBQQ0x4MXhfSU9SQU5HRSwgMX0sCi0JeyJhY2w4MTEyaGciLCBib2FyZEFDTDgxMTIsIDE2LCA4LCAyLCAxNiwgMTYsIDB4MGZmZiwKLQkgMTAwMDAsIEk4MjU0X09TQ19CQVNFXzJNSFosICZyYW5nZV9hY2w4MTEyaGdfYWksICZyYW5nZV91bmlwb2xhcjUsCi0JIDB4ZGNmYywgMHgwYSwgUENMeDF4X0lPUkFOR0UsIDF9LAotCXsiYTgyMXBnbCIsIGJvYXJkQTgyMSwgMTYsIDgsIDEsIDE2LCAxNiwgMHgwZmZmLAotCSAxMDAwMCwgSTgyNTRfT1NDX0JBU0VfMk1IWiwgJnJhbmdlX3BjbDgxM2JfYWksICZyYW5nZV91bmlwb2xhcjUsCi0JIDB4MDAwYywgMHgwMCwgUENMeDF4X0lPUkFOR0UsIDB9LAotCXsiYTgyMXBnbG5kYSIsIGJvYXJkQTgyMSwgMTYsIDgsIDAsIDAsIDAsIDB4MGZmZiwKLQkgMTAwMDAsIEk4MjU0X09TQ19CQVNFXzJNSFosICZyYW5nZV9wY2w4MTNiX2FpLCBOVUxMLAotCSAweDAwMGMsIDB4MDAsIFBDTHgxeF9JT1JBTkdFLCAwfSwKLQl7ImE4MjFwZ2giLCBib2FyZEE4MjEsIDE2LCA4LCAxLCAxNiwgMTYsIDB4MGZmZiwKLQkgMTAwMDAsIEk4MjU0X09TQ19CQVNFXzJNSFosICZyYW5nZV9hODIxcGdoX2FpLCAmcmFuZ2VfdW5pcG9sYXI1LAotCSAweDAwMGMsIDB4MDAsIFBDTHgxeF9JT1JBTkdFLCAwfSwKLQl7ImE4MjJwZ2wiLCBib2FyZEFDTDgxMTIsIDE2LCA4LCAyLCAxNiwgMTYsIDB4MGZmZiwKLQkgMTAwMDAsIEk4MjU0X09TQ19CQVNFXzJNSFosICZyYW5nZV9hY2w4MTEyZGdfYWksICZyYW5nZV91bmlwb2xhcjUsCi0JIDB4ZGNmYywgMHgwYSwgUENMeDF4X0lPUkFOR0UsIDB9LAotCXsiYTgyMnBnaCIsIGJvYXJkQUNMODExMiwgMTYsIDgsIDIsIDE2LCAxNiwgMHgwZmZmLAotCSAxMDAwMCwgSTgyNTRfT1NDX0JBU0VfMk1IWiwgJnJhbmdlX2FjbDgxMTJoZ19haSwgJnJhbmdlX3VuaXBvbGFyNSwKLQkgMHhkY2ZjLCAweDBhLCBQQ0x4MXhfSU9SQU5HRSwgMH0sCi0JeyJhODIzcGdsIiwgYm9hcmRBQ0w4MTEyLCAxNiwgOCwgMiwgMTYsIDE2LCAweDBmZmYsCi0JIDgwMDAsIEk4MjU0X09TQ19CQVNFXzJNSFosICZyYW5nZV9hY2w4MTEyZGdfYWksICZyYW5nZV91bmlwb2xhcjUsCi0JIDB4ZGNmYywgMHgwYSwgUENMeDF4X0lPUkFOR0UsIDB9LAotCXsiYTgyM3BnaCIsIGJvYXJkQUNMODExMiwgMTYsIDgsIDIsIDE2LCAxNiwgMHgwZmZmLAotCSA4MDAwLCBJODI1NF9PU0NfQkFTRV8yTUhaLCAmcmFuZ2VfYWNsODExMmhnX2FpLCAmcmFuZ2VfdW5pcG9sYXI1LAotCSAweGRjZmMsIDB4MGEsIFBDTHgxeF9JT1JBTkdFLCAwfSwKLQl7InBjbDgxMyIsIGJvYXJkUENMODEzLCAzMiwgMCwgMCwgMCwgMCwgMHgwZmZmLAotCSAwLCAwLCAmcmFuZ2VfcGNsODEzYl9haSwgTlVMTCwKLQkgMHgwMDAwLCAweDAwLCBQQ0x4MXhfSU9SQU5HRSwgMH0sCi0JeyJwY2w4MTNiIiwgYm9hcmRQQ0w4MTNCLCAzMiwgMCwgMCwgMCwgMCwgMHgwZmZmLAotCSAwLCAwLCAmcmFuZ2VfcGNsODEzYl9haSwgTlVMTCwKLQkgMHgwMDAwLCAweDAwLCBQQ0x4MXhfSU9SQU5HRSwgMH0sCi0JeyJhY2w4MTEzIiwgYm9hcmRBQ0w4MTEzLCAzMiwgMCwgMCwgMCwgMCwgMHgwZmZmLAotCSAwLCAwLCAmcmFuZ2VfYWNsODExM18xX2FpLCBOVUxMLAotCSAweDAwMDAsIDB4MDAsIFBDTHgxeF9JT1JBTkdFLCAwfSwKLQl7ImlzbzgxMyIsIGJvYXJkSVNPODEzLCAzMiwgMCwgMCwgMCwgMCwgMHgwZmZmLAotCSAwLCAwLCAmcmFuZ2VfaXNvODEzXzFfYWksIE5VTEwsCi0JIDB4MDAwMCwgMHgwMCwgUENMeDF4X0lPUkFOR0UsIDB9LAotCXsiYWNsODIxNiIsIGJvYXJkQUNMODIxNiwgMTYsIDgsIDIsIDE2LCAxNiwgMHhmZmZmLAotCSAxMDAwMCwgSTgyNTRfT1NDX0JBU0VfMk1IWiwgJnJhbmdlX3BjbDgxM2IyX2FpLCAmcmFuZ2VfdW5pcG9sYXI1LAotCSAweGRjZmMsIDB4MGEsIFBDTHgxeF9JT1JBTkdFLCAxfSwKLQl7ImE4MjZwZyIsIGJvYXJkQUNMODIxNiwgMTYsIDgsIDIsIDE2LCAxNiwgMHhmZmZmLAotCSAxMDAwMCwgSTgyNTRfT1NDX0JBU0VfMk1IWiwgJnJhbmdlX3BjbDgxM2IyX2FpLCAmcmFuZ2VfdW5pcG9sYXI1LAotCSAweGRjZmMsIDB4MGEsIFBDTHgxeF9JT1JBTkdFLCAwfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgY29tZWRpX2RyaXZlciBwY2w4MTJfZHJpdmVyID0gewogCS5kcml2ZXJfbmFtZQk9ICJwY2w4MTIiLAogCS5tb2R1bGUJCT0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE2LmMKaW5kZXggZTlkNDcwNC4uNmYyNzZmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTYuYwpAQCAtNDQsNDAgKzQ0LDM4IEBACiAjaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAjaW5jbHVkZSAiODI1My5oIgogCi0vKiBib2FyZHMgY29uc3RhbnRzICovCi0vKiBJTyBzcGFjZSBsZW4gKi8KLSNkZWZpbmUgUENMeDF4X1JBTkdFIDE2Ci0KLS8qIElOVEVMIDgyNTQgY291bnRlcnMgKi8KLSNkZWZpbmUgUENMODE2X0NUUjAgNAotI2RlZmluZSBQQ0w4MTZfQ1RSMSA1Ci0jZGVmaW5lIFBDTDgxNl9DVFIyIDYKLS8qIFI6IGNvdW50ZXIgcmVhZC1iYWNrIHJlZ2lzdGVyIFc6IGNvdW50ZXIgY29udHJvbCAqLwotI2RlZmluZSBQQ0w4MTZfQ1RSQ1RMIDcKLQotLyogUjogQS9EIGhpZ2ggYnl0ZSBXOiBBL0QgcmFuZ2UgY29udHJvbCAqLwotI2RlZmluZSBQQ0w4MTZfUkFOR0UgOQotLyogVzogY2xlYXIgSU5UIHJlcXVlc3QgKi8KLSNkZWZpbmUgUENMODE2X0NMUklOVCAxMAotLyogUjogbmV4dCBtdXggc2NhbiBjaGFubmVsIFc6IG11eCBzY2FuIGNoYW5uZWwgJiByYW5nZSBjb250cm9sIHBvaW50ZXIgKi8KLSNkZWZpbmUgUENMODE2X01VWCAxMQotLyogUi9XOiBvcGVyYXRpb24gY29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZSBQQ0w4MTZfQ09OVFJPTCAxMgotCi0vKiBSOiByZXR1cm4gc3RhdHVzIGJ5dGUgIFc6IHNldCBETUEvSVJRICovCi0jZGVmaW5lIFBDTDgxNl9TVEFUVVMgMTMKLSNkZWZpbmUgUENMODE2X1NUQVRVU19EUkRZX01BU0sgMHg4MAotCi0vKiBSOiBsb3cgYnl0ZSBvZiBBL0QgVzogc29mdCBBL0QgdHJpZ2dlciAqLwotI2RlZmluZSBQQ0w4MTZfQURfTE8gOAotLyogUjogaGlnaCBieXRlIG9mIEEvRCBXOiBBL0QgcmFuZ2UgY29udHJvbCAqLwotI2RlZmluZSBQQ0w4MTZfQURfSEkgOQotCi0vKiB0eXBlIG9mIGludGVycnVwdCBoYW5kbGVyICovCi0jZGVmaW5lIElOVF9UWVBFX0FJMV9JTlQgMQotI2RlZmluZSBJTlRfVFlQRV9BSTFfRE1BIDIKLSNkZWZpbmUgSU5UX1RZUEVfQUkzX0lOVCA0Ci0jZGVmaW5lIElOVF9UWVBFX0FJM19ETUEgNQorLyoKKyAqIFJlZ2lzdGVyIEkvTyBtYXAKKyAqLworI2RlZmluZSBQQ0w4MTZfRE9fRElfTFNCX1JFRwkJCTB4MDAKKyNkZWZpbmUgUENMODE2X0RPX0RJX01TQl9SRUcJCQkweDAxCisjZGVmaW5lIFBDTDgxNl9USU1FUl9CQVNFCQkJMHgwNAorI2RlZmluZSBQQ0w4MTZfQUlfTFNCX1JFRwkJCTB4MDgKKyNkZWZpbmUgUENMODE2X0FJX01TQl9SRUcJCQkweDA5CisjZGVmaW5lIFBDTDgxNl9SQU5HRV9SRUcJCQkweDA5CisjZGVmaW5lIFBDTDgxNl9DTFJJTlRfUkVHCQkJMHgwYQorI2RlZmluZSBQQ0w4MTZfTVVYX1JFRwkJCQkweDBiCisjZGVmaW5lIFBDTDgxNl9NVVhfU0NBTihfZmlyc3QsIF9sYXN0KQkJKCgoX2xhc3QpIDw8IDQpIHwgKF9maXJzdCkpCisjZGVmaW5lIFBDTDgxNl9DVFJMX1JFRwkJCQkweDBjCisjZGVmaW5lIFBDTDgxNl9DVFJMX0RJU0FCTEVfVFJJRwkJKDAgPDwgMCkKKyNkZWZpbmUgUENMODE2X0NUUkxfU09GVF9UUklHCQkJKDEgPDwgMCkKKyNkZWZpbmUgUENMODE2X0NUUkxfUEFDRVJfVFJJRwkJCSgxIDw8IDEpCisjZGVmaW5lIFBDTDgxNl9DVFJMX0VYVF9UUklHCQkJKDEgPDwgMikKKyNkZWZpbmUgUENMODE2X0NUUkxfUE9FCQkJCSgxIDw8IDMpCisjZGVmaW5lIFBDTDgxNl9DVFJMX0RNQUVOCQkJKDEgPDwgNCkKKyNkZWZpbmUgUENMODE2X0NUUkxfSU5URU4JCQkoMSA8PCA1KQorI2RlZmluZSBQQ0w4MTZfQ1RSTF9ETUFTUkNfU0xPVDAJCSgwIDw8IDYpCisjZGVmaW5lIFBDTDgxNl9DVFJMX0RNQVNSQ19TTE9UMQkJKDEgPDwgNikKKyNkZWZpbmUgUENMODE2X0NUUkxfRE1BU1JDX1NMT1QyCQkoMiA8PCA2KQorI2RlZmluZSBQQ0w4MTZfU1RBVFVTX1JFRwkJCTB4MGQKKyNkZWZpbmUgUENMODE2X1NUQVRVU19ORVhUX0NIQU5fTUFTSwkJKDB4ZiA8PCAwKQorI2RlZmluZSBQQ0w4MTZfU1RBVFVTX0lOVFNSQ19NQVNLCQkoMyA8PCA0KQorI2RlZmluZSBQQ0w4MTZfU1RBVFVTX0lOVFNSQ19TTE9UMAkJKDAgPDwgNCkKKyNkZWZpbmUgUENMODE2X1NUQVRVU19JTlRTUkNfU0xPVDEJCSgxIDw8IDQpCisjZGVmaW5lIFBDTDgxNl9TVEFUVVNfSU5UU1JDX1NMT1QyCQkoMiA8PCA0KQorI2RlZmluZSBQQ0w4MTZfU1RBVFVTX0lOVFNSQ19ETUEJCSgzIDw8IDQpCisjZGVmaW5lIFBDTDgxNl9TVEFUVVNfSU5UQUNUCQkJKDEgPDwgNikKKyNkZWZpbmUgUENMODE2X1NUQVRVU19EUkRZCQkJKDEgPDwgNykKIAogI2RlZmluZSBNQUdJQ19ETUFfV09SRCAweDVhNWEKIApAQCAtOTUsMzE0ICs5MywyODQgQEAKIH07CiAKIHN0cnVjdCBwY2w4MTZfYm9hcmQgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGFpX21heGRhdGE7CisJaW50IGFvX21heGRhdGE7CisJaW50IGFpX2NoYW5saXN0OworfTsKIAotCWNvbnN0IGNoYXIgKm5hbWU7CS8qICBib2FyZCBuYW1lICovCi0JaW50IG5fcmFuZ2VzOwkJLyogIGxlbiBvZiByYW5nZSBsaXN0ICovCi0JaW50IG5fYWljaGFuOwkJLyogIG51bSBvZiBBL0QgY2hhbnMgaW4gZGlmZXJlbmNpYWwgbW9kZSAqLwotCXVuc2lnbmVkIGludCBhaV9uc19taW47CS8qICBtaW5pbWFsIGFsbG93ZWQgZGVsYXkgYmV0d2VlbiBzYW1wbGVzIChpbiBucykgKi8KLQlpbnQgbl9hb2NoYW47CQkvKiAgbnVtIG9mIEQvQSBjaGFucyAqLwotCWludCBuX2RpY2hhbjsJCS8qICBudW0gb2YgREkgY2hhbnMgKi8KLQlpbnQgbl9kb2NoYW47CQkvKiAgbnVtIG9mIERPIGNoYW5zICovCi0JY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKmFpX3JhbmdlX3R5cGU7CS8qICBkZWZhdWx0IEEvRCByYW5nZWxpc3QgKi8KLQljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqYW9fcmFuZ2VfdHlwZTsJLyogIGRlZmF1bHQgRC9BIHJhbmdlbGlzdCAqLwotCXVuc2lnbmVkIGludCBpb19yYW5nZTsJLyogIGxlbiBvZiBJTyBzcGFjZSAqLwotCXVuc2lnbmVkIGludCBJUlFiaXRzOwkvKiAgYWxsb3dlZCBpbnRlcnJ1cHRzICovCi0JdW5zaWduZWQgaW50IERNQWJpdHM7CS8qICBhbGxvd2VkIERNQSBjaGFucyAqLwotCWludCBhaV9tYXhkYXRhOwkJLyogIG1heGRhdGEgZm9yIEEvRCAqLwotCWludCBhb19tYXhkYXRhOwkJLyogIG1heGRhdGEgZm9yIEQvQSAqLwotCWludCBhaV9jaGFubGlzdDsJLyogIGFsbG93ZWQgbGVuIG9mIGNoYW5uZWwgbGlzdCBBL0QgKi8KLQlpbnQgYW9fY2hhbmxpc3Q7CS8qICBhbGxvd2VkIGxlbiBvZiBjaGFubmVsIGxpc3QgRC9BICovCi0JaW50IGk4MjU0X29zY19iYXNlOwkvKiAgMS9mcmVxdWVuY3kgb2Ygb24gYm9hcmQgb3NjaWxhdG9yIGluIG5zICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjbDgxNl9ib2FyZCBib2FyZHR5cGVzW10gPSB7CisJeworCQkubmFtZQkJPSAicGNsODE2IiwKKwkJLmFpX21heGRhdGEJPSAweGZmZmYsCisJCS5hb19tYXhkYXRhCT0gMHhmZmZmLAorCQkuYWlfY2hhbmxpc3QJPSAxMDI0LAorCX0sIHsKKwkJLm5hbWUJCT0gInBjbDgxNGIiLAorCQkuYWlfbWF4ZGF0YQk9IDB4M2ZmZiwKKwkJLmFvX21heGRhdGEJPSAweDNmZmYsCisJCS5haV9jaGFubGlzdAk9IDEwMjQsCisJfSwKIH07CiAKIHN0cnVjdCBwY2w4MTZfcHJpdmF0ZSB7Ci0KIAl1bnNpZ25lZCBpbnQgZG1hOwkvKiAgdXNlZCBETUEsIDA9ZG9uJ3QgdXNlIERNQSAqLworCXVuc2lnbmVkIGludCBkbWFwYWdlczsKKwl1bnNpZ25lZCBpbnQgaHdkbWFzaXplOwogCXVuc2lnbmVkIGxvbmcgZG1hYnVmWzJdOwkvKiAgcG9pbnRlcnMgdG8gYmVnaW4gb2YgRE1BIGJ1ZmZlcnMgKi8KLQl1bnNpZ25lZCBpbnQgZG1hcGFnZXNbMl07CS8qICBsZW4gb2YgRE1BIGJ1ZmZlcnMgaW4gUEFHRV9TSVpFcyAqLwogCXVuc2lnbmVkIGludCBod2RtYXB0clsyXTsJLyogIGhhcmR3YXJlIGFkZHJlc3Mgb2YgRE1BIGJ1ZmZlcnMgKi8KLQl1bnNpZ25lZCBpbnQgaHdkbWFzaXplWzJdOwkvKiAgbGVuIG9mIERNQSBidWZmZXJzIGluIEJ5dGVzICovCi0JdW5zaWduZWQgaW50IGRtYXNhbXBsc2l6ZTsJLyogIHNpemUgaW4gc2FtcGxlcyBod2RtYXNpemVbMF0vMiAqLwogCWludCBuZXh0X2RtYV9idWY7CS8qICB3aGljaCBETUEgYnVmZmVyIHdpbGwgYmUgdXNlZCBuZXh0IHJvdW5kICovCiAJbG9uZyBkbWFfcnVuc190b19lbmQ7CS8qICBob3cgbWFueSB3ZSBtdXN0IHBlcm1vcm0gRE1BIHRyYW5zZmVyIHRvIGVuZCBvZiByZWNvcmQgKi8KIAl1bnNpZ25lZCBsb25nIGxhc3RfZG1hX3J1bjsJLyogIGhvdyBtYW55IGJ5dGVzIHdlIG11c3QgdHJhbnNmZXIgb24gbGFzdCBETUEgcGFnZSAqLwotCi0JdW5zaWduZWQgaW50IGFpX3NjYW5zOwkvKiAgbGVuIG9mIHNjYW5saXN0ICovCi0JdW5zaWduZWQgY2hhciBhaV9uZXZlcmVuZGluZzsJLyogIGlmPTEsIHRoZW4gd2UgZG8gbmV2ZXJlbmRpbmcgcmVjb3JkICh5b3UgbXVzdCB1c2UgY2FuY2VsKCkpICovCi0JaW50IGlycV9ibG9ja2VkOwkvKiAgMT1JUlEgbm93IHVzZXMgYW55IHN1YmRldiAqLwotCWludCBpcnFfd2FzX25vd19jbG9zZWQ7CS8qICB3aGVuIElSUSBmaW5pc2gsIHRoZXJlJ3Mgc3RvcmVkIGludDgxNl9tb2RlIGZvciBsYXN0IGludGVycnVwdCAqLwotCWludCBpbnQ4MTZfbW9kZTsJLyogIHdobyBub3cgdXNlcyBJUlEgLSAxPUFJMSBpbnQsIDI9QUkxIGRtYSwgMz1BSTMgaW50LCA0QUkzIGRtYSAqLwotCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpsYXN0X2ludF9zdWI7CS8qICBwdHIgdG8gc3ViZGV2aWNlIHdoaWNoIG5vdyBmaW5pc2ggKi8KIAlpbnQgYWlfYWN0X3NjYW47CS8qICBob3cgbWFueSBzY2FucyB3ZSBmaW5pc2hlZCAqLwotCXVuc2lnbmVkIGludCBhaV9hY3RfY2hhbmxpc3RbMTZdOwkvKiAgTVVYIHNldHRpbmcgZm9yIGFjdHVhbCBBSSBvcGVyYXRpb25zICovCi0JdW5zaWduZWQgaW50IGFpX2FjdF9jaGFubGlzdF9sZW47CS8qICBob3cgbG9uZyBpcyBhY3R1YWwgTVVYIGxpc3QgKi8KLQl1bnNpZ25lZCBpbnQgYWlfYWN0X2NoYW5saXN0X3BvczsJLyogIGFjdHVhbCBwb3NpdGlvbiBpbiBNVVggbGlzdCAqLwotCXVuc2lnbmVkIGludCBhaV9uX2NoYW47CQkvKiAgaG93IG1hbnkgY2hhbm5lbHMgcGVyIHNjYW4gKi8KIAl1bnNpZ25lZCBpbnQgYWlfcG9sbF9wdHI7CS8qICBob3cgbWFueSBzYW1wZXMgdHJhbnNmZXIgcG9sbCAqLworCXVuc2lnbmVkIGludCBkaXZpc29yMTsKKwl1bnNpZ25lZCBpbnQgZGl2aXNvcjI7CisJdW5zaWduZWQgaW50IGFpX2NtZF9ydW5uaW5nOjE7CisJdW5zaWduZWQgaW50IGFpX2NtZF9jYW5jZWxlZDoxOwogfTsKIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KIHN0YXRpYyBpbnQgY2hlY2tfY2hhbm5lbF9saXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSAgICAgIHVuc2lnbmVkIGludCAqY2hhbmxpc3QsIHVuc2lnbmVkIGludCBjaGFubGVuKTsKLXN0YXRpYyB2b2lkIHNldHVwX2NoYW5uZWxfbGlzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICAgIHVuc2lnbmVkIGludCAqY2hhbmxpc3QsIHVuc2lnbmVkIGludCBzZWdsZW4pOwotc3RhdGljIGludCBwY2w4MTZfYWlfY2FuY2VsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpOwotc3RhdGljIHZvaWQgc3RhcnRfcGFjZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgaW50IG1vZGUsCi0JCQl1bnNpZ25lZCBpbnQgZGl2aXNvcjEsIHVuc2lnbmVkIGludCBkaXZpc29yMik7CiAKLXN0YXRpYyBpbnQgcGNsODE2X2FpX2NtZHRlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgIHN0cnVjdCBjb21lZGlfY21kICpjbWQpOwotc3RhdGljIGludCBwY2w4MTZfYWlfY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKTsKLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgQU5BTE9HIElOUFVUIE1PREUwLCA4MTYgY2FyZHMsIHNsb3cgdmVyc2lvbgotKi8KLXN0YXRpYyBpbnQgcGNsODE2X2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQotewotCWludCBuOwotCWludCB0aW1lb3V0OwotCi0JLyogIHNvZnR3YXJlIHRyaWdnZXIsIERNQSBhbmQgSU5UIG9mZiAqLwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCk7Ci0JLyogIGNsZWFyIElOVCAoY29udmVyc2lvbiBlbmQpIGZsYWcgKi8KLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NMUklOVCk7Ci0KLQkvKiAgU2V0IHRoZSBpbnB1dCBjaGFubmVsICovCi0Jb3V0YihDUl9DSEFOKGluc24tPmNoYW5zcGVjKSAmIDB4ZiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfTVVYKTsKLQkvKiBzZWxlY3QgZ2FpbiAqLwotCW91dGIoQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9SQU5HRSk7Ci0KLQlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7Ci0KLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9BRF9MTyk7CS8qIHN0YXJ0IGNvbnZlcnNpb24gKi8KLQotCQl0aW1lb3V0ID0gMTAwOwotCQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCQlpZiAoIShpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfU1RBVFVTKSAmCi0JCQkgICAgICBQQ0w4MTZfU1RBVFVTX0RSRFlfTUFTSykpIHsKLQkJCQkvKiAgcmV0dXJuIHJlYWQgdmFsdWUgKi8KLQkJCQlkYXRhW25dID0KLQkJCQkgICAgKChpbmIoZGV2LT5pb2Jhc2UgKwotCQkJCQkgIFBDTDgxNl9BRF9ISSkgPDwgOCkgfAotCQkJCSAgICAgKGluYihkZXYtPmlvYmFzZSArIFBDTDgxNl9BRF9MTykpKTsKLQkJCQkvKiBjbGVhciBJTlQgKGNvbnZlcnNpb24gZW5kKSBmbGFnICovCi0JCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DTFJJTlQpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJdWRlbGF5KDEpOwotCQl9Ci0JCS8qICBSZXR1cm4gdGltZW91dCBlcnJvciAqLwotCQlpZiAoIXRpbWVvdXQpIHsKLQkJCWNvbWVkaV9lcnJvcihkZXYsICJBL0QgaW5zbiB0aW1lb3V0XG4iKTsKLQkJCWRhdGFbMF0gPSAwOwotCQkJLyogY2xlYXIgSU5UIChjb252ZXJzaW9uIGVuZCkgZmxhZyAqLwotCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DTFJJTlQpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQotCX0KLQlyZXR1cm4gbjsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgYW5hbG9nIGlucHV0IGludGVycnVwdCBtb2RlIDEgJiAzLCA4MTggY2FyZHMKLSAgIG9uZSBzYW1wbGUgcGVyIGludGVycnVwdCB2ZXJzaW9uCi0qLwotc3RhdGljIGlycXJldHVybl90IGludGVycnVwdF9wY2w4MTZfYWlfbW9kZTEzX2ludChpbnQgaXJxLCB2b2lkICpkKQotewotCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkOwotCXN0cnVjdCBwY2w4MTZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7Ci0JdW5zaWduZWQgY2hhciBsb3csIGhpOwotCWludCB0aW1lb3V0ID0gNTA7CS8qIHdhaXQgbWF4IDUwdXMgKi8KLQotCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJaWYgKCEoaW5iKGRldi0+aW9iYXNlICsgUENMODE2X1NUQVRVUykgJgotCQkgICAgICBQQ0w4MTZfU1RBVFVTX0RSRFlfTUFTSykpCi0JCQlicmVhazsKLQkJdWRlbGF5KDEpOwotCX0KLQlpZiAoIXRpbWVvdXQpIHsJCS8qICB0aW1lb3V0LCBiYWlsIGVycm9yICovCi0JCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ0xSSU5UKTsJLyogY2xlYXIgSU5UIHJlcXVlc3QgKi8KLQkJY29tZWRpX2Vycm9yKGRldiwgIkEvRCBtb2RlMS8zIElSUSB3aXRob3V0IERSRFkhIik7Ci0JCXBjbDgxNl9haV9jYW5jZWwoZGV2LCBzKTsKLQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCi0JfQotCi0JLyogIGdldCB0aGUgc2FtcGxlICovCi0JbG93ID0gaW5iKGRldi0+aW9iYXNlICsgUENMODE2X0FEX0xPKTsKLQloaSA9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxNl9BRF9ISSk7Ci0KLQljb21lZGlfYnVmX3B1dChzLT5hc3luYywgKGhpIDw8IDgpIHwgbG93KTsKLQotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ0xSSU5UKTsJLyogY2xlYXIgSU5UIHJlcXVlc3QgKi8KLQotCWlmICgrK2RldnByaXYtPmFpX2FjdF9jaGFubGlzdF9wb3MgPj0gZGV2cHJpdi0+YWlfYWN0X2NoYW5saXN0X2xlbikKLQkJZGV2cHJpdi0+YWlfYWN0X2NoYW5saXN0X3BvcyA9IDA7Ci0KLQlzLT5hc3luYy0+Y3VyX2NoYW4rKzsKLQlpZiAocy0+YXN5bmMtPmN1cl9jaGFuID49IGRldnByaXYtPmFpX25fY2hhbikgewotCQlzLT5hc3luYy0+Y3VyX2NoYW4gPSAwOwotCQlkZXZwcml2LT5haV9hY3Rfc2NhbisrOwotCX0KLQotCWlmICghZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcpCi0JCQkJCS8qIGFsbCBkYXRhIHNhbXBsZWQgKi8KLQkJaWYgKGRldnByaXYtPmFpX2FjdF9zY2FuID49IGRldnByaXYtPmFpX3NjYW5zKSB7Ci0JCQkvKiBhbGwgZGF0YSBzYW1wbGVkICovCi0JCQlwY2w4MTZfYWlfY2FuY2VsKGRldiwgcyk7Ci0JCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCX0KLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIGFuYWxvZyBpbnB1dCBkbWEgbW9kZSAxICYgMywgODE2IGNhcmRzCi0qLwotc3RhdGljIHZvaWQgdHJhbnNmZXJfZnJvbV9kbWFfYnVmKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgIHVuc2lnbmVkIHNob3J0ICpwdHIsCi0JCQkJICB1bnNpZ25lZCBpbnQgYnVmcHRyLCB1bnNpZ25lZCBpbnQgbGVuKQorc3RhdGljIHZvaWQgcGNsODE2X3N0YXJ0X3BhY2VyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGJvb2wgbG9hZF9jb3VudGVycykKIHsKIAlzdHJ1Y3QgcGNsODE2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IGk7CisJdW5zaWduZWQgbG9uZyB0aW1lcl9iYXNlID0gZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfVElNRVJfQkFTRTsKIAotCXMtPmFzeW5jLT5ldmVudHMgPSAwOworCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDAsIEk4MjU0X01PREUxIHwgSTgyNTRfQklOQVJZKTsKKwlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAwLCAweDAwZmYpOworCXVkZWxheSgxKTsKIAotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDIsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKKwlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7CisJdWRlbGF5KDEpOwogCi0JCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCBwdHJbYnVmcHRyKytdKTsKLQotCQlpZiAoKytkZXZwcml2LT5haV9hY3RfY2hhbmxpc3RfcG9zID49Ci0JCSAgICBkZXZwcml2LT5haV9hY3RfY2hhbmxpc3RfbGVuKSB7Ci0JCQlkZXZwcml2LT5haV9hY3RfY2hhbmxpc3RfcG9zID0gMDsKLQkJfQotCi0JCXMtPmFzeW5jLT5jdXJfY2hhbisrOwotCQlpZiAocy0+YXN5bmMtPmN1cl9jaGFuID49IGRldnByaXYtPmFpX25fY2hhbikgewotCQkJcy0+YXN5bmMtPmN1cl9jaGFuID0gMDsKLQkJCWRldnByaXYtPmFpX2FjdF9zY2FuKys7Ci0JCX0KLQotCQlpZiAoIWRldnByaXYtPmFpX25ldmVyZW5kaW5nKQotCQkJCQkJLyogIGFsbCBkYXRhIHNhbXBsZWQgKi8KLQkJCWlmIChkZXZwcml2LT5haV9hY3Rfc2NhbiA+PSBkZXZwcml2LT5haV9zY2FucykgewotCQkJCXBjbDgxNl9haV9jYW5jZWwoZGV2LCBzKTsKLQkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0s7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJaWYgKGxvYWRfY291bnRlcnMpIHsKKwkJaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMiwgZGV2cHJpdi0+ZGl2aXNvcjIpOworCQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAxLCBkZXZwcml2LT5kaXZpc29yMSk7CiAJfQotCi0JY29tZWRpX2V2ZW50KGRldiwgcyk7CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBpbnRlcnJ1cHRfcGNsODE2X2FpX21vZGUxM19kbWEoaW50IGlycSwgdm9pZCAqZCkKK3N0YXRpYyB2b2lkIHBjbDgxNl9haV9zZXR1cF9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKLQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKIAlzdHJ1Y3QgcGNsODE2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0Jc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnJlYWRfc3ViZGV2OwotCWludCBsZW4sIGJ1ZnB0ciwgdGhpc19kbWFfYnVmOworCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKwl1bnNpZ25lZCBpbnQgZG1hX2ZsYWdzOworCXVuc2lnbmVkIGludCBieXRlczsKKworCWJ5dGVzID0gZGV2cHJpdi0+aHdkbWFzaXplOworCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJLyogIGhvdyBtYW55ICovCisJCWJ5dGVzID0gcy0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW4gKgorCQlzLT5hc3luYy0+Y21kLmNoYW5saXN0X2xlbiAqCisJCXNpemVvZihzaG9ydCk7CisKKwkJLyogIGhvdyBtYW55IERNQSBwYWdlcyB3ZSBtdXN0IGZpbGwgKi8KKwkJZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kID0gYnl0ZXMgLyBkZXZwcml2LT5od2RtYXNpemU7CisKKwkJLyogb24gbGFzdCBkbWEgdHJhbnNmZXIgbXVzdCBiZSBtb3ZlZCAqLworCQlkZXZwcml2LT5sYXN0X2RtYV9ydW4gPSBieXRlcyAlIGRldnByaXYtPmh3ZG1hc2l6ZTsKKwkJZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kLS07CisJCWlmIChkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPj0gMCkKKwkJCWJ5dGVzID0gZGV2cHJpdi0+aHdkbWFzaXplOworCX0gZWxzZQorCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPSAtMTsKKworCWRldnByaXYtPm5leHRfZG1hX2J1ZiA9IDA7CisJc2V0X2RtYV9tb2RlKGRldnByaXYtPmRtYSwgRE1BX01PREVfUkVBRCk7CisJZG1hX2ZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKwljbGVhcl9kbWFfZmYoZGV2cHJpdi0+ZG1hKTsKKwlzZXRfZG1hX2FkZHIoZGV2cHJpdi0+ZG1hLCBkZXZwcml2LT5od2RtYXB0clswXSk7CisJc2V0X2RtYV9jb3VudChkZXZwcml2LT5kbWEsIGJ5dGVzKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGRtYV9mbGFncyk7CisJZW5hYmxlX2RtYShkZXZwcml2LT5kbWEpOworfQorCitzdGF0aWMgdm9pZCBwY2w4MTZfYWlfc2V0dXBfbmV4dF9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXN0cnVjdCBwY2w4MTZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CiAJdW5zaWduZWQgbG9uZyBkbWFfZmxhZ3M7Ci0JdW5zaWduZWQgc2hvcnQgKnB0cjsKIAogCWRpc2FibGVfZG1hKGRldnByaXYtPmRtYSk7Ci0JdGhpc19kbWFfYnVmID0gZGV2cHJpdi0+bmV4dF9kbWFfYnVmOwotCi0JLyogIHN3aXRjaCBkbWEgYnVmcyAqLwotCWlmICgoZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kID4gLTEpIHx8IGRldnByaXYtPmFpX25ldmVyZW5kaW5nKSB7Ci0KKwlpZiAoZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kID4gLTEgfHwgY21kLT5zdG9wX3NyYyA9PSBUUklHX05PTkUpIHsKKwkJLyogc3dpdGNoIGRtYSBidWZzICovCiAJCWRldnByaXYtPm5leHRfZG1hX2J1ZiA9IDEgLSBkZXZwcml2LT5uZXh0X2RtYV9idWY7CiAJCXNldF9kbWFfbW9kZShkZXZwcml2LT5kbWEsIERNQV9NT0RFX1JFQUQpOwogCQlkbWFfZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOwotLyogY2xlYXJfZG1hX2ZmIChkZXZwcml2LT5kbWEpOyAqLwogCQlzZXRfZG1hX2FkZHIoZGV2cHJpdi0+ZG1hLAogCQkJICAgICBkZXZwcml2LT5od2RtYXB0cltkZXZwcml2LT5uZXh0X2RtYV9idWZdKTsKLQkJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCkgewotCQkJc2V0X2RtYV9jb3VudChkZXZwcml2LT5kbWEsCi0JCQkJICAgICAgZGV2cHJpdi0+aHdkbWFzaXplW2RldnByaXYtPgotCQkJCQkJCSBuZXh0X2RtYV9idWZdKTsKLQkJfSBlbHNlIHsKKwkJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCkKKwkJCXNldF9kbWFfY291bnQoZGV2cHJpdi0+ZG1hLCBkZXZwcml2LT5od2RtYXNpemUpOworCQllbHNlCiAJCQlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwgZGV2cHJpdi0+bGFzdF9kbWFfcnVuKTsKLQkJfQogCQlyZWxlYXNlX2RtYV9sb2NrKGRtYV9mbGFncyk7CiAJCWVuYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKIAl9CiAKIAlkZXZwcml2LT5kbWFfcnVuc190b19lbmQtLTsKLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NMUklOVCk7CS8qIGNsZWFyIElOVCByZXF1ZXN0ICovCit9CiAKLQlwdHIgPSAodW5zaWduZWQgc2hvcnQgKilkZXZwcml2LT5kbWFidWZbdGhpc19kbWFfYnVmXTsKK3N0YXRpYyB2b2lkIHBjbDgxNl9haV9zZXRfY2hhbl9yYW5nZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgdW5zaWduZWQgaW50IGNoYW4sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgcmFuZ2UpCit7CisJb3V0YihjaGFuLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9NVVhfUkVHKTsKKwlvdXRiKHJhbmdlLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9SQU5HRV9SRUcpOworfQogCi0JbGVuID0gKGRldnByaXYtPmh3ZG1hc2l6ZVswXSA+PiAxKSAtIGRldnByaXYtPmFpX3BvbGxfcHRyOworc3RhdGljIHZvaWQgcGNsODE2X2FpX3NldF9jaGFuX3NjYW4oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgdW5zaWduZWQgaW50IGZpcnN0X2NoYW4sCisJCQkJICAgIHVuc2lnbmVkIGludCBsYXN0X2NoYW4pCit7CisJb3V0YihQQ0w4MTZfTVVYX1NDQU4oZmlyc3RfY2hhbiwgbGFzdF9jaGFuKSwKKwkgICAgIGRldi0+aW9iYXNlICsgUENMODE2X01VWF9SRUcpOworfQorCitzdGF0aWMgdm9pZCBwY2w4MTZfYWlfc2V0dXBfY2hhbmxpc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqY2hhbmxpc3QsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgc2VnbGVuKQoreworCXVuc2lnbmVkIGludCBmaXJzdF9jaGFuID0gQ1JfQ0hBTihjaGFubGlzdFswXSk7CisJdW5zaWduZWQgaW50IGxhc3RfY2hhbjsKKwl1bnNpZ25lZCBpbnQgcmFuZ2U7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBzdG9yZSByYW5nZSBsaXN0IHRvIGNhcmQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2VnbGVuOyBpKyspIHsKKwkJbGFzdF9jaGFuID0gQ1JfQ0hBTihjaGFubGlzdFtpXSk7CisJCXJhbmdlID0gQ1JfUkFOR0UoY2hhbmxpc3RbaV0pOworCisJCXBjbDgxNl9haV9zZXRfY2hhbl9yYW5nZShkZXYsIGxhc3RfY2hhbiwgcmFuZ2UpOworCX0KKworCXVkZWxheSgxKTsKKworCXBjbDgxNl9haV9zZXRfY2hhbl9zY2FuKGRldiwgZmlyc3RfY2hhbiwgbGFzdF9jaGFuKTsKK30KKworc3RhdGljIHZvaWQgcGNsODE2X2FpX2NsZWFyX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQoreworCS8qIHdyaXRpbmcgYW55IHZhbHVlIGNsZWFycyB0aGUgaW50ZXJydXB0IHJlcXVlc3QgKi8KKwlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NMUklOVF9SRUcpOworfQorCitzdGF0aWMgdm9pZCBwY2w4MTZfYWlfc29mdF90cmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCit7CisJLyogd3JpdGluZyBhbnkgdmFsdWUgdHJpZ2dlcnMgYSBzb2Z0d2FyZSBjb252ZXJzaW9uICovCisJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9BSV9MU0JfUkVHKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwY2w4MTZfYWlfZ2V0X3NhbXBsZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXZhbCA9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxNl9BSV9NU0JfUkVHKSA8PCA4OworCXZhbCB8PSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQUlfTFNCX1JFRyk7CisKKwlyZXR1cm4gdmFsICYgcy0+bWF4ZGF0YTsKK30KKworc3RhdGljIGludCBwY2w4MTZfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgUENMODE2X1NUQVRVU19SRUcpOworCWlmICgoc3RhdHVzICYgUENMODE2X1NUQVRVU19EUkRZKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgYm9vbCBwY2w4MTZfYWlfbmV4dF9jaGFuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJc3RydWN0IHBjbDgxNl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKworCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLOworCisJcy0+YXN5bmMtPmN1cl9jaGFuKys7CisJaWYgKHMtPmFzeW5jLT5jdXJfY2hhbiA+PSBjbWQtPmNoYW5saXN0X2xlbikgeworCQlzLT5hc3luYy0+Y3VyX2NoYW4gPSAwOworCQlkZXZwcml2LT5haV9hY3Rfc2NhbisrOworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT1M7CisJfQorCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCAmJgorCSAgICBkZXZwcml2LT5haV9hY3Rfc2NhbiA+PSBjbWQtPnN0b3BfYXJnKSB7CisJCS8qIGFsbCBkYXRhIHNhbXBsZWQgKi8KKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHRyYW5zZmVyX2Zyb21fZG1hX2J1ZihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICB1bnNpZ25lZCBzaG9ydCAqcHRyLAorCQkJCSAgdW5zaWduZWQgaW50IGJ1ZnB0ciwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQljb21lZGlfYnVmX3B1dChzLT5hc3luYywgcHRyW2J1ZnB0cisrXSk7CisKKwkJaWYgKCFwY2w4MTZfYWlfbmV4dF9jaGFuKGRldiwgcykpCisJCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcGNsODE2X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQoreworCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkOworCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5yZWFkX3N1YmRldjsKKwlzdHJ1Y3QgcGNsODE2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgc2hvcnQgKnB0cjsKKwl1bnNpZ25lZCBpbnQgYnVmcHRyOworCXVuc2lnbmVkIGludCBsZW47CisKKwlpZiAoIWRldi0+YXR0YWNoZWQgfHwgIWRldnByaXYtPmFpX2NtZF9ydW5uaW5nKSB7CisJCXBjbDgxNl9haV9jbGVhcl9lb2MoZGV2KTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmIChkZXZwcml2LT5haV9jbWRfY2FuY2VsZWQpIHsKKwkJZGV2cHJpdi0+YWlfY21kX2NhbmNlbGVkID0gMDsKKwkJcGNsODE2X2FpX2NsZWFyX2VvYyhkZXYpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcHRyID0gKHVuc2lnbmVkIHNob3J0ICopZGV2cHJpdi0+ZG1hYnVmW2RldnByaXYtPm5leHRfZG1hX2J1Zl07CisKKwlwY2w4MTZfYWlfc2V0dXBfbmV4dF9kbWEoZGV2LCBzKTsKKworCWxlbiA9IChkZXZwcml2LT5od2RtYXNpemUgPj4gMSkgLSBkZXZwcml2LT5haV9wb2xsX3B0cjsKIAlidWZwdHIgPSBkZXZwcml2LT5haV9wb2xsX3B0cjsKIAlkZXZwcml2LT5haV9wb2xsX3B0ciA9IDA7CiAKIAl0cmFuc2Zlcl9mcm9tX2RtYV9idWYoZGV2LCBzLCBwdHIsIGJ1ZnB0ciwgbGVuKTsKKworCXBjbDgxNl9haV9jbGVhcl9lb2MoZGV2KTsKKworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgSU5UIHByb2NlZHVyZQotKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBpbnRlcnJ1cHRfcGNsODE2KGludCBpcnEsIHZvaWQgKmQpCi17Ci0Jc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7Ci0Jc3RydWN0IHBjbDgxNl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCi0JaWYgKCFkZXYtPmF0dGFjaGVkKSB7Ci0JCWNvbWVkaV9lcnJvcihkZXYsICJwcmVtYXR1cmUgaW50ZXJydXB0Iik7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlzd2l0Y2ggKGRldnByaXYtPmludDgxNl9tb2RlKSB7Ci0JY2FzZSBJTlRfVFlQRV9BSTFfRE1BOgotCWNhc2UgSU5UX1RZUEVfQUkzX0RNQToKLQkJcmV0dXJuIGludGVycnVwdF9wY2w4MTZfYWlfbW9kZTEzX2RtYShpcnEsIGQpOwotCWNhc2UgSU5UX1RZUEVfQUkxX0lOVDoKLQljYXNlIElOVF9UWVBFX0FJM19JTlQ6Ci0JCXJldHVybiBpbnRlcnJ1cHRfcGNsODE2X2FpX21vZGUxM19pbnQoaXJxLCBkKTsKLQl9Ci0KLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NMUklOVCk7CS8qIGNsZWFyIElOVCByZXF1ZXN0ICovCi0JaWYgKCFkZXYtPmlycSB8fCAhZGV2cHJpdi0+aXJxX2Jsb2NrZWQgfHwgIWRldnByaXYtPmludDgxNl9tb2RlKSB7Ci0JCWlmIChkZXZwcml2LT5pcnFfd2FzX25vd19jbG9zZWQpIHsKLQkJCWRldnByaXYtPmlycV93YXNfbm93X2Nsb3NlZCA9IDA7Ci0JCQkvKiAgY29tZWRpX2Vycm9yKGRldiwibGFzdCBJUlEuLiIpOyAqLwotCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQl9Ci0JCWNvbWVkaV9lcnJvcihkZXYsICJiYWQgSVJRISIpOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCWNvbWVkaV9lcnJvcihkZXYsICJJUlEgZnJvbSB1bmtub3duIHNvdXJjZSEiKTsKLQlyZXR1cm4gSVJRX05PTkU7Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCiBzdGF0aWMgaW50IHBjbDgxNl9haV9jbWR0ZXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewotCWNvbnN0IHN0cnVjdCBwY2w4MTZfYm9hcmQgKmJvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CisJc3RydWN0IHBjbDgxNl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBlcnIgPSAwOwotCWludCB0bXAsIGRpdmlzb3IxID0gMCwgZGl2aXNvcjIgPSAwOworCWludCB0bXA7CiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKQEAgLTQzMiw4ICs0MDAsNyBAQAogCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCi0JCQkJCQkgYm9hcmQtPmFpX25zX21pbik7CisJCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCAxMDAwMCk7CiAJZWxzZQkvKiBUUklHX0VYVCAqLwogCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKIApAQCAtNDUxLDExICs0MTgsMTIgQEAKIAkvKiBzdGVwIDQ6IGZpeCB1cCBhbnkgYXJndW1lbnRzICovCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewogCQl0bXAgPSBjbWQtPmNvbnZlcnRfYXJnOwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKGJvYXJkLT5pODI1NF9vc2NfYmFzZSwKLQkJCQkJICAmZGl2aXNvcjEsICZkaXZpc29yMiwKKwkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihJODI1NF9PU0NfQkFTRV8xME1IWiwKKwkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjEsCisJCQkJCSAgJmRldnByaXYtPmRpdmlzb3IyLAogCQkJCQkgICZjbWQtPmNvbnZlcnRfYXJnLCBjbWQtPmZsYWdzKTsKLQkJaWYgKGNtZC0+Y29udmVydF9hcmcgPCBib2FyZC0+YWlfbnNfbWluKQotCQkJY21kLT5jb252ZXJ0X2FyZyA9IGJvYXJkLT5haV9uc19taW47CisJCWlmIChjbWQtPmNvbnZlcnRfYXJnIDwgMTAwMDApCisJCQljbWQtPmNvbnZlcnRfYXJnID0gMTAwMDA7CiAJCWlmICh0bXAgIT0gY21kLT5jb252ZXJ0X2FyZykKIAkJCWVycisrOwogCX0KQEAgLTQ3NywxMjAgKzQ0NSw0MCBAQAogCiBzdGF0aWMgaW50IHBjbDgxNl9haV9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7Ci0JY29uc3Qgc3RydWN0IHBjbDgxNl9ib2FyZCAqYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKIAlzdHJ1Y3QgcGNsODE2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IGRpdmlzb3IxID0gMCwgZGl2aXNvcjIgPSAwLCBkbWFfZmxhZ3MsIGJ5dGVzLCBkbWFpcnE7CiAJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCXVuc2lnbmVkIGludCBjdHJsOwogCXVuc2lnbmVkIGludCBzZWdsZW47CiAKLQlpZiAoY21kLT5zdGFydF9zcmMgIT0gVFJJR19OT1cpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRk9MTE9XKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoY21kLT5zY2FuX2VuZF9zcmMgIT0gVFJJR19DT1VOVCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGNtZC0+c2Nhbl9lbmRfYXJnICE9IGNtZC0+Y2hhbmxpc3RfbGVuKQotCQlyZXR1cm4gLUVJTlZBTDsKLS8qIGlmKGNtZC0+Y2hhbmxpc3RfbGVuPk1BWF9DSEFOTElTVF9MRU4pIHJldHVybiAtRUlOVkFMOyAqLwotCWlmIChkZXZwcml2LT5pcnFfYmxvY2tlZCkKKwlpZiAoZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCWlmIChjbWQtPmNvbnZlcnRfYXJnIDwgYm9hcmQtPmFpX25zX21pbikKLQkJCWNtZC0+Y29udmVydF9hcmcgPSBib2FyZC0+YWlfbnNfbWluOwotCi0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoYm9hcmQtPmk4MjU0X29zY19iYXNlLAotCQkJCQkgICZkaXZpc29yMSwgJmRpdmlzb3IyLAotCQkJCQkgICZjbWQtPmNvbnZlcnRfYXJnLCBjbWQtPmZsYWdzKTsKLQotCQkvKiAgUENMODE2IGNyYXNoIGlmIGFueSBkaXZpc29yIGlzIHNldCB0byAxICovCi0JCWlmIChkaXZpc29yMSA9PSAxKSB7Ci0JCQlkaXZpc29yMSA9IDI7Ci0JCQlkaXZpc29yMiAvPSAyOwotCQl9Ci0JCWlmIChkaXZpc29yMiA9PSAxKSB7Ci0JCQlkaXZpc29yMiA9IDI7Ci0JCQlkaXZpc29yMSAvPSAyOwotCQl9Ci0JfQotCi0Jc3RhcnRfcGFjZXIoZGV2LCAtMSwgMCwgMCk7CS8qICBzdG9wIHBhY2VyICovCisJcGNsODE2X3N0YXJ0X3BhY2VyKGRldiwgZmFsc2UpOwogCiAJc2VnbGVuID0gY2hlY2tfY2hhbm5lbF9saXN0KGRldiwgcywgY21kLT5jaGFubGlzdCwgY21kLT5jaGFubGlzdF9sZW4pOwogCWlmIChzZWdsZW4gPCAxKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlzZXR1cF9jaGFubmVsX2xpc3QoZGV2LCBzLCBjbWQtPmNoYW5saXN0LCBzZWdsZW4pOworCXBjbDgxNl9haV9zZXR1cF9jaGFubGlzdChkZXYsIGNtZC0+Y2hhbmxpc3QsIHNlZ2xlbik7CiAJdWRlbGF5KDEpOwogCi0JZGV2cHJpdi0+YWlfbl9jaGFuID0gY21kLT5jaGFubGlzdF9sZW47CiAJZGV2cHJpdi0+YWlfYWN0X3NjYW4gPSAwOwogCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7Ci0JZGV2cHJpdi0+aXJxX2Jsb2NrZWQgPSAxOworCWRldnByaXYtPmFpX2NtZF9ydW5uaW5nID0gMTsKIAlkZXZwcml2LT5haV9wb2xsX3B0ciA9IDA7Ci0JZGV2cHJpdi0+aXJxX3dhc19ub3dfY2xvc2VkID0gMDsKKwlkZXZwcml2LT5haV9jbWRfY2FuY2VsZWQgPSAwOwogCi0JaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgewotCQlkZXZwcml2LT5haV9zY2FucyA9IGNtZC0+c3RvcF9hcmc7Ci0JCWRldnByaXYtPmFpX25ldmVyZW5kaW5nID0gMDsKLQl9IGVsc2UgewotCQlkZXZwcml2LT5haV9zY2FucyA9IDA7Ci0JCWRldnByaXYtPmFpX25ldmVyZW5kaW5nID0gMTsKLQl9CisJcGNsODE2X2FpX3NldHVwX2RtYShkZXYsIHMpOwogCi0JaWYgKGRldnByaXYtPmRtYSkgewotCQlieXRlcyA9IGRldnByaXYtPmh3ZG1hc2l6ZVswXTsKLQkJaWYgKCFkZXZwcml2LT5haV9uZXZlcmVuZGluZykgewotCQkJLyogIGhvdyBtYW55ICovCi0JCQlieXRlcyA9IHMtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuICoKLQkJCXMtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuICoKLQkJCXNpemVvZihzaG9ydCk7CisJcGNsODE2X3N0YXJ0X3BhY2VyKGRldiwgdHJ1ZSk7CiAKLQkJCS8qICBob3cgbWFueSBETUEgcGFnZXMgd2UgbXVzdCBmaWxsICovCi0JCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPSBieXRlcyAvCi0JCQlkZXZwcml2LT5od2RtYXNpemVbMF07CisJY3RybCA9IFBDTDgxNl9DVFJMX0lOVEVOIHwgUENMODE2X0NUUkxfRE1BRU4gfCBQQ0w4MTZfQ1RSTF9ETUFTUkNfU0xPVDA7CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKKwkJY3RybCB8PSBQQ0w4MTZfQ1RSTF9QQUNFUl9UUklHOworCWVsc2UJLyogVFJJR19FWFQgKi8KKwkJY3RybCB8PSBQQ0w4MTZfQ1RSTF9FWFRfVFJJRzsKIAotCQkJLyogb24gbGFzdCBkbWEgdHJhbnNmZXIgbXVzdCBiZSBtb3ZlZCAqLwotCQkJZGV2cHJpdi0+bGFzdF9kbWFfcnVuID0gYnl0ZXMgJSBkZXZwcml2LT5od2RtYXNpemVbMF07Ci0JCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQtLTsKLQkJCWlmIChkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPj0gMCkKLQkJCQlieXRlcyA9IGRldnByaXYtPmh3ZG1hc2l6ZVswXTsKLQkJfSBlbHNlCi0JCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPSAtMTsKLQotCQlkZXZwcml2LT5uZXh0X2RtYV9idWYgPSAwOwotCQlzZXRfZG1hX21vZGUoZGV2cHJpdi0+ZG1hLCBETUFfTU9ERV9SRUFEKTsKLQkJZG1hX2ZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKLQkJY2xlYXJfZG1hX2ZmKGRldnByaXYtPmRtYSk7Ci0JCXNldF9kbWFfYWRkcihkZXZwcml2LT5kbWEsIGRldnByaXYtPmh3ZG1hcHRyWzBdKTsKLQkJc2V0X2RtYV9jb3VudChkZXZwcml2LT5kbWEsIGJ5dGVzKTsKLQkJcmVsZWFzZV9kbWFfbG9jayhkbWFfZmxhZ3MpOwotCQllbmFibGVfZG1hKGRldnByaXYtPmRtYSk7Ci0JfQotCi0Jc3RhcnRfcGFjZXIoZGV2LCAxLCBkaXZpc29yMSwgZGl2aXNvcjIpOwotCWRtYWlycSA9ICgoZGV2cHJpdi0+ZG1hICYgMHgzKSA8PCA0KSB8IChkZXYtPmlycSAmIDB4Nyk7Ci0KLQlzd2l0Y2ggKGNtZC0+Y29udmVydF9zcmMpIHsKLQljYXNlIFRSSUdfVElNRVI6Ci0JCWRldnByaXYtPmludDgxNl9tb2RlID0gSU5UX1RZUEVfQUkxX0RNQTsKLQotCQkvKiAgUGFjZXIrSVJRK0RNQSAqLwotCQlvdXRiKDB4MzIsIGRldi0+aW9iYXNlICsgUENMODE2X0NPTlRST0wpOwotCi0JCS8qICB3cml0ZSBpcnEgYW5kIERNQSB0byBjYXJkICovCi0JCW91dGIoZG1haXJxLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9TVEFUVVMpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWRldnByaXYtPmludDgxNl9tb2RlID0gSU5UX1RZUEVfQUkzX0RNQTsKLQotCQkvKiAgRXh0IHRyaWcrSVJRK0RNQSAqLwotCQlvdXRiKDB4MzQsIGRldi0+aW9iYXNlICsgUENMODE2X0NPTlRST0wpOwotCi0JCS8qICB3cml0ZSBpcnEgdG8gY2FyZCAqLwotCQlvdXRiKGRtYWlycSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfU1RBVFVTKTsKLQkJYnJlYWs7Ci0JfQorCW91dGIoY3RybCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSTF9SRUcpOworCW91dGIoKGRldnByaXYtPmRtYSA8PCA0KSB8IGRldi0+aXJxLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9TVEFUVVNfUkVHKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjAxLDkgKzQ4OSw2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgdG9wMSwgdG9wMiwgaTsKIAotCWlmICghZGV2cHJpdi0+ZG1hKQotCQlyZXR1cm4gMDsJLyogIHBvbGwgaXMgdmFsaWQgb25seSBmb3IgRE1BIHRyYW5zZmVyICovCi0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwogCiAJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKQEAgLTYxOCw3ICs1MDMsNyBAQAogCX0KIAogCS8qICB3aGVyZSBpcyBub3cgRE1BIGluIGJ1ZmZlciAqLwotCXRvcDEgPSBkZXZwcml2LT5od2RtYXNpemVbMF0gLSB0b3AxOworCXRvcDEgPSBkZXZwcml2LT5od2RtYXNpemUgLSB0b3AxOwogCXRvcDEgPj49IDE7CQkvKiAgc2FtcGxlIHBvc2l0aW9uICovCiAJdG9wMiA9IHRvcDEgLSBkZXZwcml2LT5haV9wb2xsX3B0cjsKIAlpZiAodG9wMiA8IDEpIHsJCS8qICBubyBuZXcgc2FtcGxlcyAqLwpAQCAtNjM0LDEzNCArNTE5LDM0IEBACiAJZGV2cHJpdi0+YWlfcG9sbF9wdHIgPSB0b3AxOwkvKiAgbmV3IGJ1ZmZlciBwb3NpdGlvbiAqLwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKIAorCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CisKIAlyZXR1cm4gcy0+YXN5bmMtPmJ1Zl93cml0ZV9jb3VudCAtIHMtPmFzeW5jLT5idWZfcmVhZF9jb3VudDsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIGNhbmNlbCBhbnkgbW9kZSAxLTQgQUkKLSovCiBzdGF0aWMgaW50IHBjbDgxNl9haV9jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgcGNsODE2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKLQlpZiAoZGV2cHJpdi0+aXJxX2Jsb2NrZWQgPiAwKSB7Ci0JCXN3aXRjaCAoZGV2cHJpdi0+aW50ODE2X21vZGUpIHsKLQkJY2FzZSBJTlRfVFlQRV9BSTFfRE1BOgotCQljYXNlIElOVF9UWVBFX0FJM19ETUE6Ci0JCQlkaXNhYmxlX2RtYShkZXZwcml2LT5kbWEpOwotCQljYXNlIElOVF9UWVBFX0FJMV9JTlQ6Ci0JCWNhc2UgSU5UX1RZUEVfQUkzX0lOVDoKLQkJCW91dGIoaW5iKGRldi0+aW9iYXNlICsgUENMODE2X0NPTlRST0wpICYgMHg3MywKLQkJCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCk7CS8qIFN0b3AgQS9EICovCi0JCQl1ZGVsYXkoMSk7Ci0JCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NPTlRST0wpOwkvKiBTdG9wIEEvRCAqLworCWlmICghZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcpCisJCXJldHVybiAwOwogCi0JCQkvKiBTdG9wIHBhY2VyICovCi0JCQlvdXRiKDB4YjAsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkNUTCk7Ci0JCQlvdXRiKDB4NzAsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkNUTCk7Ci0JCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0FEX0xPKTsKLQkJCWluYihkZXYtPmlvYmFzZSArIFBDTDgxNl9BRF9MTyk7Ci0JCQlpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQURfSEkpOworCW91dGIoUENMODE2X0NUUkxfRElTQUJMRV9UUklHLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFJMX1JFRyk7CisJcGNsODE2X2FpX2NsZWFyX2VvYyhkZXYpOwogCi0JCQkvKiBjbGVhciBJTlQgcmVxdWVzdCAqLwotCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DTFJJTlQpOworCS8qIFN0b3AgcGFjZXIgKi8KKwlpODI1NF9zZXRfbW9kZShkZXYtPmlvYmFzZSArIFBDTDgxNl9USU1FUl9CQVNFLCAwLAorCQkJMiwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOworCWk4MjU0X3NldF9tb2RlKGRldi0+aW9iYXNlICsgUENMODE2X1RJTUVSX0JBU0UsIDAsCisJCQkxLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CiAKLQkJCS8qIFN0b3AgQS9EICovCi0JCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NPTlRST0wpOwotCQkJZGV2cHJpdi0+aXJxX2Jsb2NrZWQgPSAwOwotCQkJZGV2cHJpdi0+aXJxX3dhc19ub3dfY2xvc2VkID0gZGV2cHJpdi0+aW50ODE2X21vZGU7Ci0JCQlkZXZwcml2LT5pbnQ4MTZfbW9kZSA9IDA7Ci0JCQlkZXZwcml2LT5sYXN0X2ludF9zdWIgPSBzOwotLyogcy0+YnVzeSA9IDA7ICovCi0JCQlicmVhazsKLQkJfQotCX0KKwlkZXZwcml2LT5haV9jbWRfcnVubmluZyA9IDA7CisJZGV2cHJpdi0+YWlfY21kX2NhbmNlbGVkID0gMTsKKwogCXJldHVybiAwOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gY2hlY2ggZm9yIFBDTDgxNgotKi8KLXN0YXRpYyBpbnQgcGNsODE2X2NoZWNrKHVuc2lnbmVkIGxvbmcgaW9iYXNlKQotewotCW91dGIoMHgwMCwgaW9iYXNlICsgUENMODE2X01VWCk7Ci0JdWRlbGF5KDEpOwotCWlmIChpbmIoaW9iYXNlICsgUENMODE2X01VWCkgIT0gMHgwMCkKLQkJcmV0dXJuIDE7CS8qIHRoZXJlIGlzbid0IGNhcmQgKi8KLQlvdXRiKDB4NTUsIGlvYmFzZSArIFBDTDgxNl9NVVgpOwotCXVkZWxheSgxKTsKLQlpZiAoaW5iKGlvYmFzZSArIFBDTDgxNl9NVVgpICE9IDB4NTUpCi0JCXJldHVybiAxOwkvKiB0aGVyZSBpc24ndCBjYXJkICovCi0Jb3V0YigweDAwLCBpb2Jhc2UgKyBQQ0w4MTZfTVVYKTsKLQl1ZGVsYXkoMSk7Ci0Jb3V0YigweDE4LCBpb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCk7Ci0JdWRlbGF5KDEpOwotCWlmIChpbmIoaW9iYXNlICsgUENMODE2X0NPTlRST0wpICE9IDB4MTgpCi0JCXJldHVybiAxOwkvKiB0aGVyZSBpc24ndCBjYXJkICovCi0JcmV0dXJuIDA7CQkvKiAgb2ssIGNhcmQgZXhpc3QgKi8KLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIHJlc2V0IHdob2xlIFBDTC04MTYgY2FyZHMKLSovCi1zdGF0aWMgdm9pZCBwY2w4MTZfcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKLXsKLS8qIG91dGIgKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0RBX0xPKTsgICAgICAgICBEQUM9MFYgKi8KLS8qIG91dGIgKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0RBX0hJKTsgKi8KLS8qIHVkZWxheSAoMSk7ICovCi0vKiBvdXRiICgwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9ET19ISSk7ICAgICAgICBETz0kMDAwMCAqLwotLyogb3V0YiAoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRE9fTE8pOyAqLwotLyogdWRlbGF5ICgxKTsgKi8KLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NPTlRST0wpOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfTVVYKTsKLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NMUklOVCk7Ci0Jb3V0YigweGIwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFJDVEwpOwkvKiBTdG9wIHBhY2VyICovCi0Jb3V0YigweDcwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFJDVEwpOwotCW91dGIoMHgzMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSQ1RMKTsKLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X1JBTkdFKTsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIFN0YXJ0L3N0b3AgcGFjZXIgb25ib2FyZCBwYWNlcgotKi8KLXN0YXRpYyB2b2lkCi1zdGFydF9wYWNlcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBpbnQgbW9kZSwgdW5zaWduZWQgaW50IGRpdmlzb3IxLAotCSAgICB1bnNpZ25lZCBpbnQgZGl2aXNvcjIpCi17Ci0Jb3V0YigweDMyLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFJDVEwpOwotCW91dGIoMHhmZiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSMCk7Ci0Jb3V0YigweDAwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFIwKTsKLQl1ZGVsYXkoMSk7Ci0KLQkvKiAgc2V0IGNvdW50ZXIgMiBhcyBtb2RlIDMgKi8KLQlvdXRiKDB4YjQsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkNUTCk7Ci0JLyogIHNldCBjb3VudGVyIDEgYXMgbW9kZSAzICovCi0Jb3V0YigweDc0LCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFJDVEwpOwotCXVkZWxheSgxKTsKLQotCWlmIChtb2RlID09IDEpIHsKLQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIm1vZGUgJWQsIGRpdmlzb3IxICVkLCBkaXZpc29yMiAlZFxuIiwKLQkJCW1vZGUsIGRpdmlzb3IxLCBkaXZpc29yMik7Ci0JCW91dGIoZGl2aXNvcjIgJiAweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFIyKTsKLQkJb3V0YigoZGl2aXNvcjIgPj4gOCkgJiAweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFIyKTsKLQkJb3V0YihkaXZpc29yMSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUjEpOwotCQlvdXRiKChkaXZpc29yMSA+PiA4KSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUjEpOwotCX0KLQotCS8qIGNsZWFyIHBlbmRpbmcgaW50ZXJydXB0cyAoanVzdCBpbiBjYXNlKSAqLwotLyogb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DTFJJTlQpOyAqLwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gQ2hlY2sgaWYgY2hhbm5lbCBsaXN0IGZyb20gdXNlciBpcyBidWlsdCBjb3JyZWN0bHkKLSBJZiBpdCdzIG9rLCB0aGVuIHJldHVybiBub24temVybyBsZW5ndGggb2YgcmVwZWF0ZWQgc2VnbWVudCBvZiBjaGFubmVsIGxpc3QKLSovCiBzdGF0aWMgaW50CiBjaGVja19jaGFubmVsX2xpc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHVuc2lnbmVkIGludCAqY2hhbmxpc3QsCkBAIC04MTgsMTgwICs2MDMsMTgxIEBACiAJcmV0dXJuIHNlZ2xlbjsJLyogIHdlIGNhbiBzZXJ2ZSB0aGlzIHdpdGggTVVYIGxvZ2ljICovCiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSBQcm9ncmFtIHNjYW4vZ2FpbiBsb2dpYyB3aXRoIGNoYW5uZWwgbGlzdC4KLSovCi1zdGF0aWMgdm9pZAotc2V0dXBfY2hhbm5lbF9saXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCB1bnNpZ25lZCBpbnQgKmNoYW5saXN0LAotCQkgICB1bnNpZ25lZCBpbnQgc2VnbGVuKQorc3RhdGljIGludCBwY2w4MTZfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQlzdHJ1Y3QgcGNsODE2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CisJaW50IHJldCA9IDA7CisJaW50IGk7CiAKLQlkZXZwcml2LT5haV9hY3RfY2hhbmxpc3RfbGVuID0gc2VnbGVuOwotCWRldnByaXYtPmFpX2FjdF9jaGFubGlzdF9wb3MgPSAwOworCW91dGIoUENMODE2X0NUUkxfU09GVF9UUklHLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFJMX1JFRyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgc2VnbGVuOyBpKyspIHsJLyogIHN0b3JlIHJhbmdlIGxpc3QgdG8gY2FyZCAqLwotCQlkZXZwcml2LT5haV9hY3RfY2hhbmxpc3RbaV0gPSBDUl9DSEFOKGNoYW5saXN0W2ldKTsKLQkJb3V0YihDUl9DSEFOKGNoYW5saXN0WzBdKSAmIDB4ZiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfTVVYKTsKLQkJLyogc2VsZWN0IGdhaW4gKi8KLQkJb3V0YihDUl9SQU5HRShjaGFubGlzdFswXSksIGRldi0+aW9iYXNlICsgUENMODE2X1JBTkdFKTsKKwlwY2w4MTZfYWlfc2V0X2NoYW5fcmFuZ2UoZGV2LCBjaGFuLCByYW5nZSk7CisJcGNsODE2X2FpX3NldF9jaGFuX3NjYW4oZGV2LCBjaGFuLCBjaGFuKTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJcGNsODE2X2FpX2NsZWFyX2VvYyhkZXYpOworCQlwY2w4MTZfYWlfc29mdF90cmlnKGRldik7CisKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBwY2w4MTZfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCWRhdGFbaV0gPSBwY2w4MTZfYWlfZ2V0X3NhbXBsZShkZXYsIHMpOworCX0KKwlvdXRiKFBDTDgxNl9DVFJMX0RJU0FCTEVfVFJJRywgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSTF9SRUcpOworCXBjbDgxNl9haV9jbGVhcl9lb2MoZGV2KTsKKworCXJldHVybiByZXQgPyByZXQgOiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IHBjbDgxNl9kaV9pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQoreworCWRhdGFbMV0gPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfRE9fRElfTFNCX1JFRykgfAorCQkgIChpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfRE9fRElfTVNCX1JFRykgPDwgOCk7CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCBwY2w4MTZfZG9faW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlpZiAoY29tZWRpX2Rpb191cGRhdGVfc3RhdGUocywgZGF0YSkpIHsKKwkJb3V0YihzLT5zdGF0ZSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODE2X0RPX0RJX0xTQl9SRUcpOworCQlvdXRiKChzLT5zdGF0ZSA+PiA4KSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfRE9fRElfTVNCX1JFRyk7CiAJfQogCi0JdWRlbGF5KDEpOwotCS8qIHNlbGVjdCBjaGFubmVsIGludGVydmFsIHRvIHNjYW4gKi8KLQlvdXRiKGRldnByaXYtPmFpX2FjdF9jaGFubGlzdFswXSB8Ci0JICAgICAoZGV2cHJpdi0+YWlfYWN0X2NoYW5saXN0W3NlZ2xlbiAtIDFdIDw8IDQpLAotCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfTVVYKTsKKwlkYXRhWzFdID0gcy0+c3RhdGU7CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIHZvaWQgcGNsODE2X3Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lcl9iYXNlID0gZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfVElNRVJfQkFTRTsKKworCW91dGIoUENMODE2X0NUUkxfRElTQUJMRV9UUklHLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFJMX1JFRyk7CisJcGNsODE2X2FpX3NldF9jaGFuX3JhbmdlKGRldiwgMCwgMCk7CisJcGNsODE2X2FpX2NsZWFyX2VvYyhkZXYpOworCisJLyogU3RvcCBwYWNlciAqLworCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDIsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKKwlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CisJaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMCwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOworCisJLyogc2V0IGFsbCBkaWdpdGFsIG91dHB1dHMgbG93ICovCisJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9ET19ESV9MU0JfUkVHKTsKKwlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0RPX0RJX01TQl9SRUcpOwogfQogCiBzdGF0aWMgaW50IHBjbDgxNl9hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQogewogCWNvbnN0IHN0cnVjdCBwY2w4MTZfYm9hcmQgKmJvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CiAJc3RydWN0IHBjbDgxNl9wcml2YXRlICpkZXZwcml2OwotCWludCByZXQ7Ci0JdW5zaWduZWQgaW50IGRtYTsKLQl1bnNpZ25lZCBsb25nIHBhZ2VzOwotCS8qIGludCBpOyAqLwogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwotCi0JcmV0ID0gY29tZWRpX3JlcXVlc3RfcmVnaW9uKGRldiwgaXQtPm9wdGlvbnNbMF0sIGJvYXJkLT5pb19yYW5nZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChwY2w4MTZfY2hlY2soZGV2LT5pb2Jhc2UpKSB7Ci0JCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJJIGNhbid0IGRldGVjdCBib2FyZC4gRkFJTCFcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9CisJaW50IHJldDsKKwlpbnQgaTsKIAogCWRldnByaXYgPSBjb21lZGlfYWxsb2NfZGV2cHJpdihkZXYsIHNpemVvZigqZGV2cHJpdikpOwogCWlmICghZGV2cHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAoKDEgPDwgaXQtPm9wdGlvbnNbMV0pICYgYm9hcmQtPklSUWJpdHMpIHsKLQkJcmV0ID0gcmVxdWVzdF9pcnEoaXQtPm9wdGlvbnNbMV0sIGludGVycnVwdF9wY2w4MTYsIDAsCisJcmV0ID0gY29tZWRpX3JlcXVlc3RfcmVnaW9uKGRldiwgaXQtPm9wdGlvbnNbMF0sIDB4MTApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiB3ZSBjYW4gdXNlIElSUSAyLTcgZm9yIGFzeW5jIGNvbW1hbmQgc3VwcG9ydCAqLworCWlmIChpdC0+b3B0aW9uc1sxXSA+PSAyICYmIGl0LT5vcHRpb25zWzFdIDw9IDcpIHsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoaXQtPm9wdGlvbnNbMV0sIHBjbDgxNl9pbnRlcnJ1cHQsIDAsCiAJCQkJICBkZXYtPmJvYXJkX25hbWUsIGRldik7CiAJCWlmIChyZXQgPT0gMCkKIAkJCWRldi0+aXJxID0gaXQtPm9wdGlvbnNbMV07CiAJfQogCi0JZGV2cHJpdi0+aXJxX2Jsb2NrZWQgPSAwOwkvKiBudW1iZXIgb2Ygc3ViZGV2aWNlIHdoaWNoIHVzZSBJUlEgKi8KLQlkZXZwcml2LT5pbnQ4MTZfbW9kZSA9IDA7CS8qIG1vZGUgb2YgaXJxICovCi0KLQkvKiBncmFiIG91ciBETUEgKi8KLQlkbWEgPSAwOwotCWRldnByaXYtPmRtYSA9IGRtYTsKLQlpZiAoIWRldi0+aXJxKQotCQlnb3RvIG5vX2RtYTsJLyogaWYgd2UgaGF2ZW4ndCBJUlEsIHdlIGNhbid0IHVzZSBETUEgKi8KLQotCWlmIChib2FyZC0+RE1BYml0cyAhPSAwKSB7CS8qIGJvYXJkIHN1cHBvcnQgRE1BICovCi0JCWRtYSA9IGl0LT5vcHRpb25zWzJdOwotCQlpZiAoZG1hIDwgMSkKLQkJCWdvdG8gbm9fZG1hOwkvKiBETUEgZGlzYWJsZWQgKi8KLQotCQlpZiAoKCgxIDw8IGRtYSkgJiBib2FyZC0+RE1BYml0cykgPT0gMCkgewotCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCQkiRE1BIGlzIG91dCBvZiBhbGxvd2VkIHJhbmdlLCBGQUlMIVxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsJLyogQmFkIERNQSAqLwotCQl9Ci0JCXJldCA9IHJlcXVlc3RfZG1hKGRtYSwgZGV2LT5ib2FyZF9uYW1lKTsKKwkvKiB3ZSBuZWVkIGFuIElSUSB0byBkbyBETUEgb24gY2hhbm5lbCAzIG9yIDEgKi8KKwlpZiAoZGV2LT5pcnEgJiYgKGl0LT5vcHRpb25zWzJdID09IDMgfHwgaXQtPm9wdGlvbnNbMl0gPT0gMSkpIHsKKwkJcmV0ID0gcmVxdWVzdF9kbWEoaXQtPm9wdGlvbnNbMl0sIGRldi0+Ym9hcmRfbmFtZSk7CiAJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkJInVuYWJsZSB0byBhbGxvY2F0ZSBETUEgJXUsIEZBSUwhXG4iLCBkbWEpOwotCQkJcmV0dXJuIC1FQlVTWTsJLyogRE1BIGlzbid0IGZyZWUgKi8KLQkJfQotCi0JCWRldnByaXYtPmRtYSA9IGRtYTsKLQkJcGFnZXMgPSAyOwkvKiB3ZSBuZWVkIDE2S0IgKi8KLQkJZGV2cHJpdi0+ZG1hYnVmWzBdID0gX19nZXRfZG1hX3BhZ2VzKEdGUF9LRVJORUwsIHBhZ2VzKTsKLQotCQlpZiAoIWRldnByaXYtPmRtYWJ1ZlswXSkgewotCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCQkidW5hYmxlIHRvIGFsbG9jYXRlIERNQSBidWZmZXIsIEZBSUwhXG4iKTsKLQkJCS8qCi0JCQkgKiBtYXliZSBleHBlcmltZW50IHdpdGggdHJ5X3RvX2ZyZWVfcGFnZXMoKQotCQkJICogd2lsbCBoZWxwIC4uLi4KLQkJCSAqLwotCQkJcmV0dXJuIC1FQlVTWTsJLyogbm8gYnVmZmVyIDotKCAqLwotCQl9Ci0JCWRldnByaXYtPmRtYXBhZ2VzWzBdID0gcGFnZXM7Ci0JCWRldnByaXYtPmh3ZG1hcHRyWzBdID0gdmlydF90b19idXMoKHZvaWQgKilkZXZwcml2LT5kbWFidWZbMF0pOwotCQlkZXZwcml2LT5od2RtYXNpemVbMF0gPSAoMSA8PCBwYWdlcykgKiBQQUdFX1NJWkU7Ci0KLQkJZGV2cHJpdi0+ZG1hYnVmWzFdID0gX19nZXRfZG1hX3BhZ2VzKEdGUF9LRVJORUwsIHBhZ2VzKTsKLQkJaWYgKCFkZXZwcml2LT5kbWFidWZbMV0pIHsKLQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkJInVuYWJsZSB0byBhbGxvY2F0ZSBETUEgYnVmZmVyLCBGQUlMIVxuIik7CisJCQkJInVuYWJsZSB0byByZXF1ZXN0IERNQSBjaGFubmVsICVkXG4iLAorCQkJCWl0LT5vcHRpb25zWzJdKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KLQkJZGV2cHJpdi0+ZG1hcGFnZXNbMV0gPSBwYWdlczsKLQkJZGV2cHJpdi0+aHdkbWFwdHJbMV0gPSB2aXJ0X3RvX2J1cygodm9pZCAqKWRldnByaXYtPmRtYWJ1ZlsxXSk7Ci0JCWRldnByaXYtPmh3ZG1hc2l6ZVsxXSA9ICgxIDw8IHBhZ2VzKSAqIFBBR0VfU0laRTsKKwkJZGV2cHJpdi0+ZG1hID0gaXQtPm9wdGlvbnNbMl07CisKKwkJZGV2cHJpdi0+ZG1hcGFnZXMgPSAyOwkvKiB3ZSBuZWVkIDE2S0IgKi8KKwkJZGV2cHJpdi0+aHdkbWFzaXplID0gKDEgPDwgZGV2cHJpdi0+ZG1hcGFnZXMpICogUEFHRV9TSVpFOworCisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCXVuc2lnbmVkIGxvbmcgZG1hYnVmOworCisJCQlkbWFidWYgPSBfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgZGV2cHJpdi0+ZG1hcGFnZXMpOworCQkJaWYgKCFkbWFidWYpCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCWRldnByaXYtPmRtYWJ1ZltpXSA9IGRtYWJ1ZjsKKwkJCWRldnByaXYtPmh3ZG1hcHRyW2ldID0gdmlydF90b19idXMoKHZvaWQgKilkbWFidWYpOworCQl9CiAJfQogCi1ub19kbWE6Ci0KLS8qICBpZiAoYm9hcmQtPm5fYW9jaGFuID4gMCkKLSAgICBzdWJkZXZzWzFdID0gQ09NRURJX1NVQkRfQU87Ci0gIGlmIChib2FyZC0+bl9kaWNoYW4gPiAwKQotICAgIHN1YmRldnNbMl0gPSBDT01FRElfU1VCRF9ESTsKLSAgaWYgKGJvYXJkLT5uX2RvY2hhbiA+IDApCi0gICAgc3ViZGV2c1szXSA9IENPTUVESV9TVUJEX0RPOwotKi8KLQotCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgMSk7CisJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCA0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMF07Ci0JaWYgKGJvYXJkLT5uX2FpY2hhbiA+IDApIHsKLQkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FJOwotCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfQ01EX1JFQUQgfCBTREZfRElGRjsKLQkJcy0+bl9jaGFuID0gYm9hcmQtPm5fYWljaGFuOwotCQlzLT5tYXhkYXRhID0gYm9hcmQtPmFpX21heGRhdGE7Ci0JCXMtPnJhbmdlX3RhYmxlID0gYm9hcmQtPmFpX3JhbmdlX3R5cGU7Ci0JCXMtPmluc25fcmVhZCA9IHBjbDgxNl9haV9pbnNuX3JlYWQ7Ci0JCWlmIChkZXYtPmlycSkgewotCQkJZGV2LT5yZWFkX3N1YmRldiA9IHM7Ci0JCQlzLT5zdWJkZXZfZmxhZ3MgfD0gU0RGX0NNRF9SRUFEOwotCQkJcy0+bGVuX2NoYW5saXN0ID0gYm9hcmQtPmFpX2NoYW5saXN0OwotCQkJcy0+ZG9fY21kdGVzdCA9IHBjbDgxNl9haV9jbWR0ZXN0OwotCQkJcy0+ZG9fY21kID0gcGNsODE2X2FpX2NtZDsKLQkJCXMtPnBvbGwgPSBwY2w4MTZfYWlfcG9sbDsKLQkJCXMtPmNhbmNlbCA9IHBjbDgxNl9haV9jYW5jZWw7Ci0JCX0KLQl9IGVsc2UgewotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQUk7CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX0NNRF9SRUFEIHwgU0RGX0RJRkY7CisJcy0+bl9jaGFuCT0gMTY7CisJcy0+bWF4ZGF0YQk9IGJvYXJkLT5haV9tYXhkYXRhOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX3BjbDgxNjsKKwlzLT5pbnNuX3JlYWQJPSBwY2w4MTZfYWlfaW5zbl9yZWFkOworCWlmIChkZXZwcml2LT5kbWEpIHsKKwkJZGV2LT5yZWFkX3N1YmRldiA9IHM7CisJCXMtPnN1YmRldl9mbGFncwl8PSBTREZfQ01EX1JFQUQ7CisJCXMtPmxlbl9jaGFubGlzdAk9IGJvYXJkLT5haV9jaGFubGlzdDsKKwkJcy0+ZG9fY21kdGVzdAk9IHBjbDgxNl9haV9jbWR0ZXN0OworCQlzLT5kb19jbWQJPSBwY2w4MTZfYWlfY21kOworCQlzLT5wb2xsCQk9IHBjbDgxNl9haV9wb2xsOworCQlzLT5jYW5jZWwJPSBwY2w4MTZfYWlfY2FuY2VsOwogCX0KIAorCS8qIEFuYWxvZyBPVXRwdXQgc3ViZGV2aWNlICovCisJcyA9ICZkZXYtPnN1YmRldmljZXNbMl07CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9VTlVTRUQ7CiAjaWYgMAotY2FzZSBDT01FRElfU1VCRF9BTzoKKwlzdWJkZXZzWzFdID0gQ09NRURJX1NVQkRfQU87CiAJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX0dST1VORDsKLQlzLT5uX2NoYW4gPSBib2FyZC0+bl9hb2NoYW47CisJcy0+bl9jaGFuID0gMTsKIAlzLT5tYXhkYXRhID0gYm9hcmQtPmFvX21heGRhdGE7Ci0Jcy0+bGVuX2NoYW5saXN0ID0gYm9hcmQtPmFvX2NoYW5saXN0OwotCXMtPnJhbmdlX3RhYmxlID0gYm9hcmQtPmFvX3JhbmdlX3R5cGU7Ci0JYnJlYWs7Ci0KLWNhc2UgQ09NRURJX1NVQkRfREk6Ci0Jcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFOwotCXMtPm5fY2hhbiA9IGJvYXJkLT5uX2RpY2hhbjsKLQlzLT5tYXhkYXRhID0gMTsKLQlzLT5sZW5fY2hhbmxpc3QgPSBib2FyZC0+bl9kaWNoYW47Ci0Jcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKLQlicmVhazsKLQotY2FzZSBDT01FRElfU1VCRF9ETzoKLQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEU7Ci0Jcy0+bl9jaGFuID0gYm9hcmQtPm5fZG9jaGFuOwotCXMtPm1heGRhdGEgPSAxOwotCXMtPmxlbl9jaGFubGlzdCA9IGJvYXJkLT5uX2RvY2hhbjsKLQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOwotCWJyZWFrOworCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3BjbDgxNjsKICNlbmRpZgogCisJLyogRGlnaXRhbCBJbnB1dCBzdWJkZXZpY2UgKi8KKwlzID0gJmRldi0+c3ViZGV2aWNlc1syXTsKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0RJOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9SRUFEQUJMRTsKKwlzLT5uX2NoYW4JPSAxNjsKKwlzLT5tYXhkYXRhCT0gMTsKKwlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fYml0cwk9IHBjbDgxNl9kaV9pbnNuX2JpdHM7CisKKwkvKiBEaWdpdGFsIE91dHB1dCBzdWJkZXZpY2UgKi8KKwlzID0gJmRldi0+c3ViZGV2aWNlc1szXTsKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0RPOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9XUklUQUJMRTsKKwlzLT5uX2NoYW4JPSAxNjsKKwlzLT5tYXhkYXRhCT0gMTsKKwlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fYml0cwk9IHBjbDgxNl9kb19pbnNuX2JpdHM7CisKIAlwY2w4MTZfcmVzZXQoZGV2KTsKIAogCXJldHVybiAwOwpAQCAtMTAwNywzNCArNzkzLDEzIEBACiAJCWlmIChkZXZwcml2LT5kbWEpCiAJCQlmcmVlX2RtYShkZXZwcml2LT5kbWEpOwogCQlpZiAoZGV2cHJpdi0+ZG1hYnVmWzBdKQotCQkJZnJlZV9wYWdlcyhkZXZwcml2LT5kbWFidWZbMF0sIGRldnByaXYtPmRtYXBhZ2VzWzBdKTsKKwkJCWZyZWVfcGFnZXMoZGV2cHJpdi0+ZG1hYnVmWzBdLCBkZXZwcml2LT5kbWFwYWdlcyk7CiAJCWlmIChkZXZwcml2LT5kbWFidWZbMV0pCi0JCQlmcmVlX3BhZ2VzKGRldnByaXYtPmRtYWJ1ZlsxXSwgZGV2cHJpdi0+ZG1hcGFnZXNbMV0pOworCQkJZnJlZV9wYWdlcyhkZXZwcml2LT5kbWFidWZbMV0sIGRldnByaXYtPmRtYXBhZ2VzKTsKIAl9CiAJY29tZWRpX2xlZ2FjeV9kZXRhY2goZGV2KTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2w4MTZfYm9hcmQgYm9hcmR0eXBlc1tdID0gewotCXsicGNsODE2IiwgOCwgMTYsIDEwMDAwLCAxLCAxNiwgMTYsICZyYW5nZV9wY2w4MTYsCi0JICZyYW5nZV9wY2w4MTYsIFBDTHgxeF9SQU5HRSwKLQkgMHgwMGZjLAkJLyogIElSUSBtYXNrICovCi0JIDB4MGEsCQkJLyogIERNQSBtYXNrICovCi0JIDB4ZmZmZiwJCS8qICAxNi1iaXQgY2FyZCAqLwotCSAweGZmZmYsCQkvKiAgRC9BIG1heGRhdGEgKi8KLQkgMTAyNCwKLQkgMSwJCQkvKiAgYW8gY2hhbiBsaXN0ICovCi0JIEk4MjU0X09TQ19CQVNFXzEwTUhafSwKLQl7InBjbDgxNGIiLCA4LCAxNiwgMTAwMDAsIDEsIDE2LCAxNiwgJnJhbmdlX3BjbDgxNiwKLQkgJnJhbmdlX3BjbDgxNiwgUENMeDF4X1JBTkdFLAotCSAweDAwZmMsCi0JIDB4MGEsCi0JIDB4M2ZmZiwJCS8qIDE0IGJpdCBjYXJkICovCi0JIDB4M2ZmZiwKLQkgMTAyNCwKLQkgMSwKLQkgSTgyNTRfT1NDX0JBU0VfMTBNSFp9LAotfTsKLQogc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIHBjbDgxNl9kcml2ZXIgPSB7CiAJLmRyaXZlcl9uYW1lCT0gInBjbDgxNiIsCiAJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTguYwppbmRleCBmYTE3NThhLi42NDYzNDc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxOC5jCkBAIC0xMTAsOCArMTEwLDYgQEAKICNpbmNsdWRlICJjb21lZGlfZmMuaCIKICNpbmNsdWRlICI4MjUzLmgiCiAKLS8qICNkZWZpbmUgUENMODE4X01PREUxM19BTyAxICovCi0KIC8qIGJvYXJkcyBjb25zdGFudHMgKi8KIAogI2RlZmluZSBib2FyZFBDTDgxOEwgMApAQCAtMTIxLDQ2ICsxMTksMzggQEAKICNkZWZpbmUgYm9hcmRQQ0w4MTggNAogI2RlZmluZSBib2FyZFBDTDcxOCA1CiAKLS8qIElPIHNwYWNlIGxlbiAqLwotI2RlZmluZSBQQ0x4MXhfUkFOR0UgMTYKLS8qIElPIHNwYWNlIGxlbiBpZiB3ZSB1c2UgRklGTyAqLwotI2RlZmluZSBQQ0x4MXhGSUZPX1JBTkdFIDMyCi0KLS8qIFc6IGNsZWFyIElOVCByZXF1ZXN0ICovCi0jZGVmaW5lIFBDTDgxOF9DTFJJTlQgOAotLyogUjogcmV0dXJuIHN0YXR1cyBieXRlICovCi0jZGVmaW5lIFBDTDgxOF9TVEFUVVMgOAotLyogUjogQS9EIGhpZ2ggYnl0ZSBXOiBBL0QgcmFuZ2UgY29udHJvbCAqLwotI2RlZmluZSBQQ0w4MThfUkFOR0UgMQotLyogUjogbmV4dCBtdXggc2NhbiBjaGFubmVsIFc6IG11eCBzY2FuIGNoYW5uZWwgJiByYW5nZSBjb250cm9sIHBvaW50ZXIgKi8KLSNkZWZpbmUgUENMODE4X01VWCAyCi0vKiBSL1c6IG9wZXJhdGlvbiBjb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lIFBDTDgxOF9DT05UUk9MIDkKLS8qIFc6IGNvdW50ZXIgZW5hYmxlICovCi0jZGVmaW5lIFBDTDgxOF9DTlRFTkFCTEUgMTAKLQotLyogUjogbG93IGJ5dGUgb2YgQS9EIFc6IHNvZnQgQS9EIHRyaWdnZXIgKi8KLSNkZWZpbmUgUENMODE4X0FEX0xPIDAKLS8qIFI6IGhpZ2ggYnl0ZSBvZiBBL0QgVzogQS9EIHJhbmdlIGNvbnRyb2wgKi8KLSNkZWZpbmUgUENMODE4X0FEX0hJIDEKLS8qIFc6IEQvQSBsb3cmaGlnaCBieXRlICovCi0jZGVmaW5lIFBDTDgxOF9EQV9MTyA0Ci0jZGVmaW5lIFBDTDgxOF9EQV9ISSA1Ci0vKiBSOiBsb3cmaGlnaCBieXRlIG9mIERJICovCi0jZGVmaW5lIFBDTDgxOF9ESV9MTyAzCi0jZGVmaW5lIFBDTDgxOF9ESV9ISSAxMQotLyogVzogbG93JmhpZ2ggYnl0ZSBvZiBETyAqLwotI2RlZmluZSBQQ0w4MThfRE9fTE8gMwotI2RlZmluZSBQQ0w4MThfRE9fSEkgMTEKLS8qIFc6IFBDTDcxOCBzZWNvbmQgRC9BICovCi0jZGVmaW5lIFBDTDcxOF9EQTJfTE8gNgotI2RlZmluZSBQQ0w3MThfREEyX0hJIDcKLS8qIGNvdW50ZXJzICovCi0jZGVmaW5lIFBDTDgxOF9DVFIwIDEyCi0jZGVmaW5lIFBDTDgxOF9DVFIxIDEzCi0jZGVmaW5lIFBDTDgxOF9DVFIyIDE0Ci0vKiBXOiBjb3VudGVyIGNvbnRyb2wgKi8KLSNkZWZpbmUgUENMODE4X0NUUkNUTCAxNQorLyoKKyAqIFJlZ2lzdGVyIEkvTyBtYXAKKyAqLworI2RlZmluZSBQQ0w4MThfQUlfTFNCX1JFRwkJCTB4MDAKKyNkZWZpbmUgUENMODE4X0FJX01TQl9SRUcJCQkweDAxCisjZGVmaW5lIFBDTDgxOF9SQU5HRV9SRUcJCQkweDAxCisjZGVmaW5lIFBDTDgxOF9NVVhfUkVHCQkJCTB4MDIKKyNkZWZpbmUgUENMODE4X01VWF9TQ0FOKF9maXJzdCwgX2xhc3QpCQkoKChfbGFzdCkgPDwgNCkgfCAoX2ZpcnN0KSkKKyNkZWZpbmUgUENMODE4X0RPX0RJX0xTQl9SRUcJCQkweDAzCisjZGVmaW5lIFBDTDgxOF9BT19MU0JfUkVHKHgpCQkJKDB4MDQgKyAoKHgpICogMikpCisjZGVmaW5lIFBDTDgxOF9BT19NU0JfUkVHKHgpCQkJKDB4MDUgKyAoKHgpICogMikpCisjZGVmaW5lIFBDTDgxOF9TVEFUVVNfUkVHCQkJMHgwOAorI2RlZmluZSBQQ0w4MThfU1RBVFVTX05FWFRfQ0hBTl9NQVNLCQkoMHhmIDw8IDApCisjZGVmaW5lIFBDTDgxOF9TVEFUVVNfSU5UCQkJKDEgPDwgNCkKKyNkZWZpbmUgUENMODE4X1NUQVRVU19NVVgJCQkoMSA8PCA1KQorI2RlZmluZSBQQ0w4MThfU1RBVFVTX1VOSQkJCSgxIDw8IDYpCisjZGVmaW5lIFBDTDgxOF9TVEFUVVNfRU9DCQkJKDEgPDwgNykKKyNkZWZpbmUgUENMODE4X0NUUkxfUkVHCQkJCTB4MDkKKyNkZWZpbmUgUENMODE4X0NUUkxfRElTQUJMRV9UUklHCQkoMCA8PCAwKQorI2RlZmluZSBQQ0w4MThfQ1RSTF9TT0ZUX1RSSUcJCQkoMSA8PCAwKQorI2RlZmluZSBQQ0w4MThfQ1RSTF9FWFRfVFJJRwkJCSgyIDw8IDApCisjZGVmaW5lIFBDTDgxOF9DVFJMX1BBQ0VSX1RSSUcJCQkoMyA8PCAwKQorI2RlZmluZSBQQ0w4MThfQ1RSTF9ETUFFCQkJKDEgPDwgMikKKyNkZWZpbmUgUENMODE4X0NUUkxfSVJRKHgpCQkJKCh4KSA8PCA0KQorI2RlZmluZSBQQ0w4MThfQ1RSTF9JTlRFCQkJKDEgPDwgNykKKyNkZWZpbmUgUENMODE4X0NOVEVOQUJMRV9SRUcJCQkweDBhCisjZGVmaW5lIFBDTDgxOF9DTlRFTkFCTEVfUEFDRVJfRU5BCQkoMCA8PCAwKQorI2RlZmluZSBQQ0w4MThfQ05URU5BQkxFX1BBQ0VSX1RSSUcwCQkoMSA8PCAwKQorI2RlZmluZSBQQ0w4MThfQ05URU5BQkxFX0NOVDBfRVhUX0NMSwkJKDAgPDwgMSkKKyNkZWZpbmUgUENMODE4X0NOVEVOQUJMRV9DTlQwX0lOVF9DTEsJCSgxIDw8IDEpCisjZGVmaW5lIFBDTDgxOF9ET19ESV9NU0JfUkVHCQkJMHgwYgorI2RlZmluZSBQQ0w4MThfVElNRVJfQkFTRQkJCTB4MGMKIAogLyogVzogZmlmbyBlbmFibGUvZGlzYWJsZSAqLwogI2RlZmluZSBQQ0w4MThfRklfRU5BQkxFIDYKQEAgLTE3MiwxOSArMTYyLDcgQEAKICNkZWZpbmUgUENMODE4X0ZJX1NUQVRVUyAyNQogLyogUjogb25lIHJlY29yZCBmcm9tIEZJRk8gKi8KICNkZWZpbmUgUENMODE4X0ZJX0RBVEFMTyAyMwotI2RlZmluZSBQQ0w4MThfRklfREFUQUhJIDIzCi0KLS8qIHR5cGUgb2YgaW50ZXJydXB0IGhhbmRsZXIgKi8KLSNkZWZpbmUgSU5UX1RZUEVfQUkxX0lOVCAxCi0jZGVmaW5lIElOVF9UWVBFX0FJMV9ETUEgMgotI2RlZmluZSBJTlRfVFlQRV9BSTFfRklGTyAzCi0jZGVmaW5lIElOVF9UWVBFX0FJM19JTlQgNAotI2RlZmluZSBJTlRfVFlQRV9BSTNfRE1BIDUKLSNkZWZpbmUgSU5UX1RZUEVfQUkzX0ZJRk8gNgotI2lmZGVmIFBDTDgxOF9NT0RFMTNfQU8KLSNkZWZpbmUgSU5UX1RZUEVfQU8xX0lOVCA3Ci0jZGVmaW5lIElOVF9UWVBFX0FPM19JTlQgOAotI2VuZGlmCisjZGVmaW5lIFBDTDgxOF9GSV9EQVRBSEkgMjQKIAogI2RlZmluZSBNQUdJQ19ETUFfV09SRCAweDVhNWEKIApAQCAtMjYyLDQ5MyArMjQwLDEyNSBAQAogfTsKIAogc3RydWN0IHBjbDgxOF9ib2FyZCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgbnNfbWluOworCWludCBuX2FvY2hhbjsKKwljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqYWlfcmFuZ2VfdHlwZTsKKwl1bnNpZ25lZCBpbnQgaGFzX2RtYToxOworCXVuc2lnbmVkIGludCBoYXNfZmlmbzoxOworCXVuc2lnbmVkIGludCBpc184MTg6MTsKK307CiAKLQljb25zdCBjaGFyICpuYW1lOwkvKiAgZHJpdmVyIG5hbWUgKi8KLQlpbnQgbl9yYW5nZXM7CQkvKiAgbGVuIG9mIHJhbmdlIGxpc3QgKi8KLQlpbnQgbl9haWNoYW5fc2U7CS8qICBudW0gb2YgQS9EIGNoYW5zIGluIHNpbmdsZSBlbmRlZCAgbW9kZSAqLwotCWludCBuX2FpY2hhbl9kaWZmOwkvKiAgbnVtIG9mIEEvRCBjaGFucyBpbiBkaWZlcmVuY2lhbCBtb2RlICovCi0JdW5zaWduZWQgaW50IG5zX21pbjsJLyogIG1pbmltYWwgYWxsb3dlZCBkZWxheSBiZXR3ZWVuIHNhbXBsZXMgKGluIG5zKSAqLwotCWludCBuX2FvY2hhbjsJCS8qICBudW0gb2YgRC9BIGNoYW5zICovCi0JaW50IG5fZGljaGFuOwkJLyogIG51bSBvZiBESSBjaGFucyAqLwotCWludCBuX2RvY2hhbjsJCS8qICBudW0gb2YgRE8gY2hhbnMgKi8KLQljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqYWlfcmFuZ2VfdHlwZTsJLyogIGRlZmF1bHQgQS9EIHJhbmdlbGlzdCAqLwotCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICphb19yYW5nZV90eXBlOwkvKiAgZGVmYXVsdCBEL0EgcmFuZ2VsaXN0ICovCi0JdW5zaWduZWQgaW50IGlvX3JhbmdlOwkvKiAgbGVuIG9mIElPIHNwYWNlICovCi0JdW5zaWduZWQgaW50IElSUWJpdHM7CS8qICBhbGxvd2VkIGludGVycnVwdHMgKi8KLQl1bnNpZ25lZCBpbnQgRE1BYml0czsJLyogIGFsbG93ZWQgRE1BIGNoYW5zICovCi0JaW50IGFpX21heGRhdGE7CQkvKiAgbWF4ZGF0YSBmb3IgQS9EICovCi0JaW50IGFvX21heGRhdGE7CQkvKiAgbWF4ZGF0YSBmb3IgRC9BICovCi0JdW5zaWduZWQgY2hhciBmaWZvOwkvKiAgMT1ib2FyZCBoYXMgRklGTyAqLwotCWludCBpc184MTg7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBjbDgxOF9ib2FyZCBib2FyZHR5cGVzW10gPSB7CisJeworCQkubmFtZQkJPSAicGNsODE4bCIsCisJCS5uc19taW4JCT0gMjUwMDAsCisJCS5uX2FvY2hhbgk9IDEsCisJCS5haV9yYW5nZV90eXBlCT0gJnJhbmdlX3BjbDgxOGxfbF9haSwKKwkJLmhhc19kbWEJPSAxLAorCQkuaXNfODE4CQk9IDEsCisJfSwgeworCQkubmFtZQkJPSAicGNsODE4aCIsCisJCS5uc19taW4JCT0gMTAwMDAsCisJCS5uX2FvY2hhbgk9IDEsCisJCS5haV9yYW5nZV90eXBlCT0gJnJhbmdlX3BjbDgxOGhfYWksCisJCS5oYXNfZG1hCT0gMSwKKwkJLmlzXzgxOAkJPSAxLAorCX0sIHsKKwkJLm5hbWUJCT0gInBjbDgxOGhkIiwKKwkJLm5zX21pbgkJPSAxMDAwMCwKKwkJLm5fYW9jaGFuCT0gMSwKKwkJLmFpX3JhbmdlX3R5cGUJPSAmcmFuZ2VfcGNsODE4aF9haSwKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzX2ZpZm8JPSAxLAorCQkuaXNfODE4CQk9IDEsCisJfSwgeworCQkubmFtZQkJPSAicGNsODE4aGciLAorCQkubnNfbWluCQk9IDEwMDAwLAorCQkubl9hb2NoYW4JPSAxLAorCQkuYWlfcmFuZ2VfdHlwZQk9ICZyYW5nZV9wY2w4MThoZ19haSwKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzX2ZpZm8JPSAxLAorCQkuaXNfODE4CQk9IDEsCisJfSwgeworCQkubmFtZQkJPSAicGNsODE4IiwKKwkJLm5zX21pbgkJPSAxMDAwMCwKKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX3JhbmdlX3R5cGUJPSAmcmFuZ2VfcGNsODE4aF9haSwKKwkJLmhhc19kbWEJPSAxLAorCQkuaXNfODE4CQk9IDEsCisJfSwgeworCQkubmFtZQkJPSAicGNsNzE4IiwKKwkJLm5zX21pbgkJPSAxNjAwMCwKKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX3JhbmdlX3R5cGUJPSAmcmFuZ2VfdW5pcG9sYXI1LAorCQkuaGFzX2RtYQk9IDEsCisJfSwgeworCQkubmFtZQkJPSAicGNtMzcxOCIsCisJCS5uc19taW4JCT0gMTAwMDAsCisJCS5haV9yYW5nZV90eXBlCT0gJnJhbmdlX3BjbDgxOGhfYWksCisJCS5oYXNfZG1hCT0gMSwKKwkJLmlzXzgxOAkJPSAxLAorCX0sCiB9OwogCiBzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgewotCiAJdW5zaWduZWQgaW50IGRtYTsJLyogIHVzZWQgRE1BLCAwPWRvbid0IHVzZSBETUEgKi8KLQl1bnNpZ25lZCBpbnQgaW9fcmFuZ2U7CisJdW5zaWduZWQgaW50IGRtYXBhZ2VzOworCXVuc2lnbmVkIGludCBod2RtYXNpemU7CiAJdW5zaWduZWQgbG9uZyBkbWFidWZbMl07CS8qICBwb2ludGVycyB0byBiZWdpbiBvZiBETUEgYnVmZmVycyAqLwotCXVuc2lnbmVkIGludCBkbWFwYWdlc1syXTsJLyogIGxlbiBvZiBETUEgYnVmZmVycyBpbiBQQUdFX1NJWkVzICovCiAJdW5zaWduZWQgaW50IGh3ZG1hcHRyWzJdOwkvKiAgaGFyZHdhcmUgYWRkcmVzcyBvZiBETUEgYnVmZmVycyAqLwotCXVuc2lnbmVkIGludCBod2RtYXNpemVbMl07CS8qICBsZW4gb2YgRE1BIGJ1ZmZlcnMgaW4gQnl0ZXMgKi8KIAlpbnQgbmV4dF9kbWFfYnVmOwkvKiAgd2hpY2ggRE1BIGJ1ZmZlciB3aWxsIGJlIHVzZWQgbmV4dCByb3VuZCAqLwogCWxvbmcgZG1hX3J1bnNfdG9fZW5kOwkvKiAgaG93IG1hbnkgd2UgbXVzdCBwZXJtb3JtIERNQSB0cmFuc2ZlciB0byBlbmQgb2YgcmVjb3JkICovCiAJdW5zaWduZWQgbG9uZyBsYXN0X2RtYV9ydW47CS8qICBob3cgbWFueSBieXRlcyB3ZSBtdXN0IHRyYW5zZmVyIG9uIGxhc3QgRE1BIHBhZ2UgKi8KLQl1bnNpZ25lZCBjaGFyIG5ldmVyZW5kaW5nX2FpOwkvKiAgaWY9MSwgdGhlbiB3ZSBkbyBuZXZlcmVuZGluZyByZWNvcmQgKHlvdSBtdXN0IHVzZSBjYW5jZWwoKSkgKi8KIAl1bnNpZ25lZCBpbnQgbnNfbWluOwkvKiAgbWFuaW1hbCBhbGxvd2VkIGRlbGF5IGJldHdlZW4gc2FtcGxlcyAoaW4gdXMpIGZvciBhY3R1YWwgY2FyZCAqLwogCWludCBpODI1M19vc2NfYmFzZTsJLyogIDEvZnJlcXVlbmN5IG9mIG9uIGJvYXJkIG9zY2lsYXRvciBpbiBucyAqLwotCWludCBpcnFfYmxvY2tlZDsJLyogIDE9SVJRIG5vdyB1c2VzIGFueSBzdWJkZXYgKi8KLQlpbnQgaXJxX3dhc19ub3dfY2xvc2VkOwkvKiAgd2hlbiBJUlEgZmluaXNoLCB0aGVyZSdzIHN0b3JlZCBpbnQ4MThfbW9kZSBmb3IgbGFzdCBpbnRlcnJ1cHQgKi8KLQlpbnQgYWlfbW9kZTsJCS8qICB3aG8gbm93IHVzZXMgSVJRIC0gMT1BSTEgaW50LCAyPUFJMSBkbWEsIDM9QUkzIGludCwgNEFJMyBkbWEgKi8KLQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqbGFzdF9pbnRfc3ViOwkvKiAgcHRyIHRvIHN1YmRldmljZSB3aGljaCBub3cgZmluaXNoICovCiAJaW50IGFpX2FjdF9zY2FuOwkvKiAgaG93IG1hbnkgc2NhbnMgd2UgZmluaXNoZWQgKi8KIAlpbnQgYWlfYWN0X2NoYW47CS8qICBhY3R1YWwgcG9zaXRpb24gaW4gYWN0dWFsIHNjYW4gKi8KIAl1bnNpZ25lZCBpbnQgYWN0X2NoYW5saXN0WzE2XTsJLyogIE1VWCBzZXR0aW5nIGZvciBhY3R1YWwgQUkgb3BlcmF0aW9ucyAqLwogCXVuc2lnbmVkIGludCBhY3RfY2hhbmxpc3RfbGVuOwkvKiAgaG93IGxvbmcgaXMgYWN0dWFsIE1VWCBsaXN0ICovCiAJdW5zaWduZWQgaW50IGFjdF9jaGFubGlzdF9wb3M7CS8qICBhY3R1YWwgcG9zaXRpb24gaW4gTVVYIGxpc3QgKi8KLQl1bnNpZ25lZCBpbnQgYWlfc2NhbnM7CS8qICBsZW4gb2Ygc2Nhbmxpc3QgKi8KLQl1bnNpZ25lZCBpbnQgYWlfbl9jaGFuOwkvKiAgaG93IG1hbnkgY2hhbm5lbHMgaXMgbWVhc3VyZWQgKi8KLQl1bnNpZ25lZCBpbnQgKmFpX2NoYW5saXN0OwkvKiAgYWN0YXVsIGNoYW5saXN0ICovCi0JdW5zaWduZWQgaW50IGFpX2ZsYWdzOwkvKiAgZmxhZ2xpc3QgKi8KIAl1bnNpZ25lZCBpbnQgYWlfZGF0YV9sZW47CS8qICBsZW4gb2YgZGF0YSBidWZmZXIgKi8KLQl1bnNpZ25lZCBpbnQgYWlfdGltZXIxOwkvKiAgdGltZXJzICovCi0JdW5zaWduZWQgaW50IGFpX3RpbWVyMjsKLQl1bnNpZ25lZCBjaGFyIHVzZWZpZm87CS8qICAxPXVzZSBmaWZvICovCiAJdW5zaWduZWQgaW50IGFvX3JlYWRiYWNrWzJdOworCXVuc2lnbmVkIGludCBkaXZpc29yMTsKKwl1bnNpZ25lZCBpbnQgZGl2aXNvcjI7CisJdW5zaWduZWQgaW50IHVzZWZpZm86MTsKKwl1bnNpZ25lZCBpbnQgYWlfY21kX3J1bm5pbmc6MTsKKwl1bnNpZ25lZCBpbnQgYWlfY21kX2NhbmNlbGVkOjE7CiB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG11eG9uZWNoYW5bXSA9IHsgMHgwMCwgMHgxMSwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSwgMHg2NiwgMHg3NywJLyogIHVzZWQgZm9yIGdhaW4gbGlzdCBwcm9ncmFtbWluZyAqLwotCTB4ODgsIDB4OTksIDB4YWEsIDB4YmIsIDB4Y2MsIDB4ZGQsIDB4ZWUsIDB4ZmYKLX07Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgdm9pZCBzZXR1cF9jaGFubmVsX2xpc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmNoYW5saXN0LCB1bnNpZ25lZCBpbnQgbl9jaGFuLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBzZWdsZW4pOwotc3RhdGljIGludCBjaGVja19jaGFubmVsX2xpc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICAgdW5zaWduZWQgaW50ICpjaGFubGlzdCwgdW5zaWduZWQgaW50IG5fY2hhbik7Ci0KLXN0YXRpYyBpbnQgcGNsODE4X2FpX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKTsKLXN0YXRpYyB2b2lkIHN0YXJ0X3BhY2VyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBtb2RlLAotCQkJdW5zaWduZWQgaW50IGRpdmlzb3IxLCB1bnNpZ25lZCBpbnQgZGl2aXNvcjIpOwotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBBTkFMT0cgSU5QVVQgTU9ERTAsIDgxOCBjYXJkcywgc2xvdyB2ZXJzaW9uCi0qLwotc3RhdGljIGludCBwY2w4MThfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0JaW50IG47Ci0JaW50IHRpbWVvdXQ7Ci0KLQkvKiBzb2Z0d2FyZSB0cmlnZ2VyLCBETUEgYW5kIElOVCBvZmYgKi8KLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0NPTlRST0wpOwotCi0JLyogc2VsZWN0IGNoYW5uZWwgKi8KLQlvdXRiKG11eG9uZWNoYW5bQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyldLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9NVVgpOwotCi0JLyogc2VsZWN0IGdhaW4gKi8KLQlvdXRiKENSX1JBTkdFKGluc24tPmNoYW5zcGVjKSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfUkFOR0UpOwotCi0JZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewotCi0JCS8qIGNsZWFyIElOVCAoY29udmVyc2lvbiBlbmQpIGZsYWcgKi8KLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DTFJJTlQpOwotCi0JCS8qIHN0YXJ0IGNvbnZlcnNpb24gKi8KLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9BRF9MTyk7Ci0KLQkJdGltZW91dCA9IDEwMDsKLQkJd2hpbGUgKHRpbWVvdXQtLSkgewotCQkJaWYgKGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9TVEFUVVMpICYgMHgxMCkKLQkJCQlnb3RvIGNvbnZfZmluaXNoOwotCQkJdWRlbGF5KDEpOwotCQl9Ci0JCWNvbWVkaV9lcnJvcihkZXYsICJBL0QgaW5zbiB0aW1lb3V0Iik7Ci0JCS8qIGNsZWFyIElOVCAoY29udmVyc2lvbiBlbmQpIGZsYWcgKi8KLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DTFJJTlQpOwotCQlyZXR1cm4gLUVJTzsKLQotY29udl9maW5pc2g6Ci0JCWRhdGFbbl0gPSAoKGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9BRF9ISSkgPDwgNCkgfAotCQkJICAgKGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9BRF9MTykgPj4gNCkpOwotCX0KLQotCXJldHVybiBuOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBBTkFMT0cgT1VUUFVUIE1PREUwLCA4MTggY2FyZHMKLSAgIG9ubHkgb25lIHNhbXBsZSBwZXIgY2FsbCBpcyBzdXBwb3J0ZWQKLSovCi1zdGF0aWMgaW50IHBjbDgxOF9hb19pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyB2b2lkIHBjbDgxOF9zdGFydF9wYWNlcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBib29sIGxvYWRfY291bnRlcnMpCiB7CiAJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBuOwotCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgbG9uZyB0aW1lcl9iYXNlID0gZGV2LT5pb2Jhc2UgKyBQQ0w4MThfVElNRVJfQkFTRTsKIAotCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspCi0JCWRhdGFbbl0gPSBkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXTsKKwlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAyLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7CisJaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMSwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOworCXVkZWxheSgxKTsKIAotCXJldHVybiBuOworCWlmIChsb2FkX2NvdW50ZXJzKSB7CisJCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDIsIGRldnByaXYtPmRpdmlzb3IyKTsKKwkJaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMSwgZGV2cHJpdi0+ZGl2aXNvcjEpOworCX0KIH0KIAotc3RhdGljIGludCBwY2w4MThfYW9faW5zbl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIHZvaWQgcGNsODE4X2FpX3NldHVwX2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewogCXN0cnVjdCBwY2w4MThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgbjsKLQlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCi0JZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewotCQlkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXSA9IGRhdGFbbl07Ci0JCW91dGIoKGRhdGFbbl0gJiAweDAwMGYpIDw8IDQsIGRldi0+aW9iYXNlICsKLQkJICAgICAoY2hhbiA/IFBDTDcxOF9EQTJfTE8gOiBQQ0w4MThfREFfTE8pKTsKLQkJb3V0YigoZGF0YVtuXSAmIDB4MGZmMCkgPj4gNCwgZGV2LT5pb2Jhc2UgKwotCQkgICAgIChjaGFuID8gUENMNzE4X0RBMl9ISSA6IFBDTDgxOF9EQV9ISSkpOwotCX0KLQotCXJldHVybiBuOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBESUdJVEFMIElOUFVUIE1PREUwLCA4MTggY2FyZHMKLQotICAgb25seSBvbmUgc2FtcGxlIHBlciBjYWxsIGlzIHN1cHBvcnRlZAotKi8KLXN0YXRpYyBpbnQgcGNsODE4X2RpX2luc25fYml0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQotewotCWRhdGFbMV0gPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRElfTE8pIHwKLQkgICAgKGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9ESV9ISSkgPDwgOCk7Ci0KLQlyZXR1cm4gaW5zbi0+bjsKLX0KLQotc3RhdGljIGludCBwY2w4MThfZG9faW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQlpZiAoY29tZWRpX2Rpb191cGRhdGVfc3RhdGUocywgZGF0YSkpIHsKLQkJb3V0YihzLT5zdGF0ZSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODE4X0RPX0xPKTsKLQkJb3V0Yigocy0+c3RhdGUgPj4gOCksIGRldi0+aW9iYXNlICsgUENMODE4X0RPX0hJKTsKLQl9Ci0KLQlkYXRhWzFdID0gcy0+c3RhdGU7Ci0KLQlyZXR1cm4gaW5zbi0+bjsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgYW5hbG9nIGlucHV0IGludGVycnVwdCBtb2RlIDEgJiAzLCA4MTggY2FyZHMKLSAgIG9uZSBzYW1wbGUgcGVyIGludGVycnVwdCB2ZXJzaW9uCi0qLwotc3RhdGljIGlycXJldHVybl90IGludGVycnVwdF9wY2w4MThfYWlfbW9kZTEzX2ludChpbnQgaXJxLCB2b2lkICpkKQotewotCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkOwotCXN0cnVjdCBwY2w4MThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7Ci0JdW5zaWduZWQgY2hhciBsb3c7Ci0JaW50IHRpbWVvdXQgPSA1MDsJLyogd2FpdCBtYXggNTB1cyAqLwotCi0Jd2hpbGUgKHRpbWVvdXQtLSkgewotCQlpZiAoaW5iKGRldi0+aW9iYXNlICsgUENMODE4X1NUQVRVUykgJiAweDEwKQotCQkJZ290byBjb252X2ZpbmlzaDsKLQkJdWRlbGF5KDEpOwotCX0KLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X1NUQVRVUyk7CS8qIGNsZWFyIElOVCByZXF1ZXN0ICovCi0JY29tZWRpX2Vycm9yKGRldiwgIkEvRCBtb2RlMS8zIElSUSB3aXRob3V0IERSRFkhIik7Ci0JcGNsODE4X2FpX2NhbmNlbChkZXYsIHMpOwotCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KLWNvbnZfZmluaXNoOgotCWxvdyA9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9BRF9MTyk7Ci0JY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsICgoaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0FEX0hJKSA8PCA0KSB8IChsb3cgPj4gNCkpKTsJLyogIGdldCBvbmUgc2FtcGxlICovCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DTFJJTlQpOwkvKiBjbGVhciBJTlQgcmVxdWVzdCAqLwotCi0JaWYgKChsb3cgJiAweGYpICE9IGRldnByaXYtPmFjdF9jaGFubGlzdFtkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zXSkgewkvKiAgZHJvcG91dCEgKi8KLQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwKLQkJCSJBL0QgbW9kZTEvMyBJUlEgLSBjaGFubmVsIGRyb3BvdXQgJXghPSV4ICFcbiIsCi0JCQkobG93ICYgMHhmKSwKLQkJCWRldnByaXYtPmFjdF9jaGFubGlzdFtkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zXSk7Ci0JCXBjbDgxOF9haV9jYW5jZWwoZGV2LCBzKTsKLQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQlkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zKys7Ci0JaWYgKGRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MgPj0gZGV2cHJpdi0+YWN0X2NoYW5saXN0X2xlbikKLQkJZGV2cHJpdi0+YWN0X2NoYW5saXN0X3BvcyA9IDA7Ci0KLQlzLT5hc3luYy0+Y3VyX2NoYW4rKzsKLQlpZiAocy0+YXN5bmMtPmN1cl9jaGFuID49IGRldnByaXYtPmFpX25fY2hhbikgewotCQlzLT5hc3luYy0+Y3VyX2NoYW4gPSAwOwotCQlkZXZwcml2LT5haV9hY3Rfc2Nhbi0tOwotCX0KLQotCWlmICghZGV2cHJpdi0+bmV2ZXJlbmRpbmdfYWkpIHsKLQkJaWYgKGRldnByaXYtPmFpX2FjdF9zY2FuID09IDApIHsJLyogYWxsIGRhdGEgc2FtcGxlZCAqLwotCQkJcGNsODE4X2FpX2NhbmNlbChkZXYsIHMpOwotCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwotCQl9Ci0JfQotCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgYW5hbG9nIGlucHV0IGRtYSBtb2RlIDEgJiAzLCA4MTggY2FyZHMKLSovCi1zdGF0aWMgaXJxcmV0dXJuX3QgaW50ZXJydXB0X3BjbDgxOF9haV9tb2RlMTNfZG1hKGludCBpcnEsIHZvaWQgKmQpCi17Ci0Jc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7Ci0Jc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5yZWFkX3N1YmRldjsKLQlpbnQgaSwgbGVuLCBidWZwdHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBzaG9ydCAqcHRyOwotCi0JZGlzYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKLQlkZXZwcml2LT5uZXh0X2RtYV9idWYgPSAxIC0gZGV2cHJpdi0+bmV4dF9kbWFfYnVmOwotCWlmICgoZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kKSA+IC0xIHx8IGRldnByaXYtPm5ldmVyZW5kaW5nX2FpKSB7CS8qICBzd2l0Y2ggZG1hIGJ1ZnMgKi8KLQkJc2V0X2RtYV9tb2RlKGRldnByaXYtPmRtYSwgRE1BX01PREVfUkVBRCk7Ci0JCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKLQkJc2V0X2RtYV9hZGRyKGRldnByaXYtPmRtYSwKLQkJCSAgICAgZGV2cHJpdi0+aHdkbWFwdHJbZGV2cHJpdi0+bmV4dF9kbWFfYnVmXSk7Ci0JCWlmIChkZXZwcml2LT5kbWFfcnVuc190b19lbmQgfHwgZGV2cHJpdi0+bmV2ZXJlbmRpbmdfYWkpIHsKLQkJCXNldF9kbWFfY291bnQoZGV2cHJpdi0+ZG1hLAotCQkJCSAgICAgIGRldnByaXYtPmh3ZG1hc2l6ZVtkZXZwcml2LT4KLQkJCQkJCQkgbmV4dF9kbWFfYnVmXSk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwgZGV2cHJpdi0+bGFzdF9kbWFfcnVuKTsKLQkJfQotCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKLQkJZW5hYmxlX2RtYShkZXZwcml2LT5kbWEpOwotCX0KLQotCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZC0tOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ0xSSU5UKTsJLyogY2xlYXIgSU5UIHJlcXVlc3QgKi8KLQlwdHIgPSAodW5zaWduZWQgc2hvcnQgKilkZXZwcml2LT5kbWFidWZbMSAtIGRldnByaXYtPm5leHRfZG1hX2J1Zl07Ci0KLQlsZW4gPSBkZXZwcml2LT5od2RtYXNpemVbMF0gPj4gMTsKLQlidWZwdHIgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWlmICgocHRyW2J1ZnB0cl0gJiAweGYpICE9IGRldnByaXYtPmFjdF9jaGFubGlzdFtkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zXSkgewkvKiAgZHJvcG91dCEgKi8KLQkJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsCi0JCQkJIkEvRCBtb2RlMS8zIERNQSAtIGNoYW5uZWwgZHJvcG91dCAlZChjYXJkKSE9JWQoY2hhbmxpc3QpIGF0ICVkICFcbiIsCi0JCQkJKHB0cltidWZwdHJdICYgMHhmKSwKLQkJCQlkZXZwcml2LT5hY3RfY2hhbmxpc3RbZGV2cHJpdi0+YWN0X2NoYW5saXN0X3Bvc10sCi0JCQkJZGV2cHJpdi0+YWN0X2NoYW5saXN0X3Bvcyk7Ci0JCQlwY2w4MThfYWlfY2FuY2VsKGRldiwgcyk7Ci0JCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQkJCXJldHVybiBJUlFfSEFORExFRDsKLQkJfQotCi0JCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCBwdHJbYnVmcHRyKytdID4+IDQpOwkvKiAgZ2V0IG9uZSBzYW1wbGUgKi8KLQotCQlkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zKys7Ci0JCWlmIChkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zID49IGRldnByaXYtPmFjdF9jaGFubGlzdF9sZW4pCi0JCQlkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zID0gMDsKLQotCQlzLT5hc3luYy0+Y3VyX2NoYW4rKzsKLQkJaWYgKHMtPmFzeW5jLT5jdXJfY2hhbiA+PSBkZXZwcml2LT5haV9uX2NoYW4pIHsKLQkJCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7Ci0JCQlkZXZwcml2LT5haV9hY3Rfc2Nhbi0tOwotCQl9Ci0KLQkJaWYgKCFkZXZwcml2LT5uZXZlcmVuZGluZ19haSkKLQkJCWlmIChkZXZwcml2LT5haV9hY3Rfc2NhbiA9PSAwKSB7CS8qIGFsbCBkYXRhIHNhbXBsZWQgKi8KLQkJCQlwY2w4MThfYWlfY2FuY2VsKGRldiwgcyk7Ci0JCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwotCQkJCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCQkJCXJldHVybiBJUlFfSEFORExFRDsKLQkJCX0KLQl9Ci0KLQlpZiAobGVuID4gMCkKLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBhbmFsb2cgaW5wdXQgaW50ZXJydXB0IG1vZGUgMSAmIDMsIDgxOEhEL0hHIGNhcmRzCi0qLwotc3RhdGljIGlycXJldHVybl90IGludGVycnVwdF9wY2w4MThfYWlfbW9kZTEzX2ZpZm8oaW50IGlycSwgdm9pZCAqZCkKLXsKLQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKLQlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0Jc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnJlYWRfc3ViZGV2OwotCWludCBpLCBsZW47Ci0JdW5zaWduZWQgY2hhciBsbzsKLQotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfSU5UQ0xSKTsJLyogIGNsZWFyIGZpZm8gaW50IHJlcXVlc3QgKi8KLQotCWxvID0gaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0ZJX1NUQVRVUyk7Ci0KLQlpZiAobG8gJiA0KSB7Ci0JCWNvbWVkaV9lcnJvcihkZXYsICJBL0QgbW9kZTEvMyBGSUZPIG92ZXJmbG93ISIpOwotCQlwY2w4MThfYWlfY2FuY2VsKGRldiwgcyk7Ci0JCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlpZiAobG8gJiAxKSB7Ci0JCWNvbWVkaV9lcnJvcihkZXYsICJBL0QgbW9kZTEvMyBGSUZPIGludGVycnVwdCB3aXRob3V0IGRhdGEhIik7Ci0JCXBjbDgxOF9haV9jYW5jZWwoZGV2LCBzKTsKLQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCWlmIChsbyAmIDIpCi0JCWxlbiA9IDUxMjsKLQllbHNlCi0JCWxlbiA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJbG8gPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfREFUQUxPKTsKLQkJaWYgKChsbyAmIDB4ZikgIT0gZGV2cHJpdi0+YWN0X2NoYW5saXN0W2RldnByaXYtPmFjdF9jaGFubGlzdF9wb3NdKSB7CS8qICBkcm9wb3V0ISAqLwotCQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwKLQkJCQkiQS9EIG1vZGUxLzMgRklGTyAtIGNoYW5uZWwgZHJvcG91dCAlZCE9JWQgIVxuIiwKLQkJCQkobG8gJiAweGYpLAotCQkJCWRldnByaXYtPmFjdF9jaGFubGlzdFtkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zXSk7Ci0JCQlwY2w4MThfYWlfY2FuY2VsKGRldiwgcyk7Ci0JCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQkJCXJldHVybiBJUlFfSEFORExFRDsKLQkJfQotCi0JCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCAobG8gPj4gNCkgfCAoaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0ZJX0RBVEFISSkgPDwgNCkpOwkvKiAgZ2V0IG9uZSBzYW1wbGUgKi8KLQotCQlkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zKys7Ci0JCWlmIChkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zID49IGRldnByaXYtPmFjdF9jaGFubGlzdF9sZW4pCi0JCQlkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zID0gMDsKLQotCQlzLT5hc3luYy0+Y3VyX2NoYW4rKzsKLQkJaWYgKHMtPmFzeW5jLT5jdXJfY2hhbiA+PSBkZXZwcml2LT5haV9uX2NoYW4pIHsKLQkJCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7Ci0JCQlkZXZwcml2LT5haV9hY3Rfc2Nhbi0tOwotCQl9Ci0KLQkJaWYgKCFkZXZwcml2LT5uZXZlcmVuZGluZ19haSkKLQkJCWlmIChkZXZwcml2LT5haV9hY3Rfc2NhbiA9PSAwKSB7CS8qIGFsbCBkYXRhIHNhbXBsZWQgKi8KLQkJCQlwY2w4MThfYWlfY2FuY2VsKGRldiwgcyk7Ci0JCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwotCQkJCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCQkJCXJldHVybiBJUlFfSEFORExFRDsKLQkJCX0KLQl9Ci0KLQlpZiAobGVuID4gMCkKLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgSU5UIHByb2NlZHVyZQotKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBpbnRlcnJ1cHRfcGNsODE4KGludCBpcnEsIHZvaWQgKmQpCi17Ci0Jc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7Ci0Jc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCi0JaWYgKCFkZXYtPmF0dGFjaGVkKSB7Ci0JCWNvbWVkaV9lcnJvcihkZXYsICJwcmVtYXR1cmUgaW50ZXJydXB0Iik7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlpZiAoZGV2cHJpdi0+aXJxX2Jsb2NrZWQgJiYgZGV2cHJpdi0+aXJxX3dhc19ub3dfY2xvc2VkKSB7Ci0JCWlmICgoZGV2cHJpdi0+bmV2ZXJlbmRpbmdfYWkgfHwgKCFkZXZwcml2LT5uZXZlcmVuZGluZ19haSAmJgotCQkJCQkJIGRldnByaXYtPmFpX2FjdF9zY2FuID4gMCkpICYmCi0JCSAgICAoZGV2cHJpdi0+YWlfbW9kZSA9PSBJTlRfVFlQRV9BSTFfRE1BIHx8Ci0JCSAgICAgZGV2cHJpdi0+YWlfbW9kZSA9PSBJTlRfVFlQRV9BSTNfRE1BKSkgewotCQkJLyogVGhlIGNsZWFudXAgZnJvbSBhaV9jYW5jZWwoKSBoYXMgYmVlbiBkZWxheWVkCi0JCQkgICB1bnRpbCBub3cgYmVjYXVzZSB0aGUgY2FyZCBkb2Vzbid0IHNlZW0gdG8gbGlrZQotCQkJICAgYmVpbmcgcmVwcm9ncmFtbWVkIHdoaWxlIGEgRE1BIHRyYW5zZmVyIGlzIGluCi0JCQkgICBwcm9ncmVzcy4KLQkJCSAqLwotCQkJZGV2cHJpdi0+YWlfYWN0X3NjYW4gPSAwOwotCQkJZGV2cHJpdi0+bmV2ZXJlbmRpbmdfYWkgPSAwOwotCQkJcGNsODE4X2FpX2NhbmNlbChkZXYsIGRldi0+cmVhZF9zdWJkZXYpOwotCQl9Ci0KLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DTFJJTlQpOwkvKiBjbGVhciBJTlQgcmVxdWVzdCAqLwotCi0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlzd2l0Y2ggKGRldnByaXYtPmFpX21vZGUpIHsKLQljYXNlIElOVF9UWVBFX0FJMV9ETUE6Ci0JY2FzZSBJTlRfVFlQRV9BSTNfRE1BOgotCQlyZXR1cm4gaW50ZXJydXB0X3BjbDgxOF9haV9tb2RlMTNfZG1hKGlycSwgZCk7Ci0JY2FzZSBJTlRfVFlQRV9BSTFfSU5UOgotCWNhc2UgSU5UX1RZUEVfQUkzX0lOVDoKLQkJcmV0dXJuIGludGVycnVwdF9wY2w4MThfYWlfbW9kZTEzX2ludChpcnEsIGQpOwotCWNhc2UgSU5UX1RZUEVfQUkxX0ZJRk86Ci0JY2FzZSBJTlRfVFlQRV9BSTNfRklGTzoKLQkJcmV0dXJuIGludGVycnVwdF9wY2w4MThfYWlfbW9kZTEzX2ZpZm8oaXJxLCBkKTsKLSNpZmRlZiBQQ0w4MThfTU9ERTEzX0FPCi0JY2FzZSBJTlRfVFlQRV9BTzFfSU5UOgotCWNhc2UgSU5UX1RZUEVfQU8zX0lOVDoKLQkJcmV0dXJuIGludGVycnVwdF9wY2w4MThfYW9fbW9kZTEzX2ludChpcnEsIGQpOwotI2VuZGlmCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DTFJJTlQpOwkvKiBjbGVhciBJTlQgcmVxdWVzdCAqLwotCi0JaWYgKCFkZXZwcml2LT5pcnFfYmxvY2tlZCB8fCAhZGV2cHJpdi0+YWlfbW9kZSkgewotCQljb21lZGlfZXJyb3IoZGV2LCAiYmFkIElSUSEiKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KLQotCWNvbWVkaV9lcnJvcihkZXYsICJJUlEgZnJvbSB1bmtub3duIHNvdXJjZSEiKTsKLQlyZXR1cm4gSVJRX05PTkU7Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEFOQUxPRyBJTlBVVCBNT0RFIDEgb3IgMyBETUEgLCA4MTggY2FyZHMKLSovCi1zdGF0aWMgdm9pZCBwY2w4MThfYWlfbW9kZTEzZG1hX2ludChpbnQgbW9kZSwgc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCi17Ci0Jc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGJ5dGVzOwogCiAJZGlzYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsJLyogIGRpc2FibGUgZG1hICovCi0JYnl0ZXMgPSBkZXZwcml2LT5od2RtYXNpemVbMF07Ci0JaWYgKCFkZXZwcml2LT5uZXZlcmVuZGluZ19haSkgewotCQlieXRlcyA9IGRldnByaXYtPmFpX25fY2hhbiAqIGRldnByaXYtPmFpX3NjYW5zICogc2l6ZW9mKHNob3J0KTsJLyogIGhvdyBtYW55ICovCi0JCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9IGJ5dGVzIC8gZGV2cHJpdi0+aHdkbWFzaXplWzBdOwkvKiAgaG93IG1hbnkgRE1BIHBhZ2VzIHdlIG11c3QgZmlpbCAqLwotCQlkZXZwcml2LT5sYXN0X2RtYV9ydW4gPSBieXRlcyAlIGRldnByaXYtPmh3ZG1hc2l6ZVswXTsJLyogb24gbGFzdCBkbWEgdHJhbnNmZXIgbXVzdCBiZSBtb3ZlZCAqLworCWJ5dGVzID0gZGV2cHJpdi0+aHdkbWFzaXplOworCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJYnl0ZXMgPSBjbWQtPmNoYW5saXN0X2xlbiAqIGNtZC0+c3RvcF9hcmcgKiBzaXplb2Yoc2hvcnQpOworCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPSBieXRlcyAvIGRldnByaXYtPmh3ZG1hc2l6ZTsKKwkJZGV2cHJpdi0+bGFzdF9kbWFfcnVuID0gYnl0ZXMgJSBkZXZwcml2LT5od2RtYXNpemU7CiAJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZC0tOwogCQlpZiAoZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kID49IDApCi0JCQlieXRlcyA9IGRldnByaXYtPmh3ZG1hc2l6ZVswXTsKKwkJCWJ5dGVzID0gZGV2cHJpdi0+aHdkbWFzaXplOwogCX0KIAogCWRldnByaXYtPm5leHRfZG1hX2J1ZiA9IDA7CkBAIC03NTksMTMzICszNjksMzEwIEBACiAJc2V0X2RtYV9jb3VudChkZXZwcml2LT5kbWEsIGJ5dGVzKTsKIAlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKIAllbmFibGVfZG1hKGRldnByaXYtPmRtYSk7Ci0KLQlpZiAobW9kZSA9PSAxKSB7Ci0JCWRldnByaXYtPmFpX21vZGUgPSBJTlRfVFlQRV9BSTFfRE1BOwotCQlvdXRiKDB4ODcgfCAoZGV2LT5pcnEgPDwgNCksIGRldi0+aW9iYXNlICsgUENMODE4X0NPTlRST0wpOwkvKiBQYWNlcitJUlErRE1BICovCi0JfSBlbHNlIHsKLQkJZGV2cHJpdi0+YWlfbW9kZSA9IElOVF9UWVBFX0FJM19ETUE7Ci0JCW91dGIoMHg4NiB8IChkZXYtPmlycSA8PCA0KSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ09OVFJPTCk7CS8qIEV4dCB0cmlnK0lSUStETUEgKi8KLQl9CiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEFOQUxPRyBJTlBVVCBNT0RFIDEgb3IgMywgODE4IGNhcmRzCi0qLwotc3RhdGljIGludCBwY2w4MThfYWlfY21kX21vZGUoaW50IG1vZGUsIHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3N0YXRpYyB2b2lkIHBjbDgxOF9haV9zZXR1cF9uZXh0X2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKLQlpbnQgZGl2aXNvcjEgPSAwLCBkaXZpc29yMiA9IDA7Ci0JdW5zaWduZWQgaW50IHNlZ2xlbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKGRldnByaXYtPmlycV9ibG9ja2VkKQotCQlyZXR1cm4gLUVCVVNZOwotCi0Jc3RhcnRfcGFjZXIoZGV2LCAtMSwgMCwgMCk7CS8qICBzdG9wIHBhY2VyICovCi0KLQlzZWdsZW4gPSBjaGVja19jaGFubmVsX2xpc3QoZGV2LCBzLCBkZXZwcml2LT5haV9jaGFubGlzdCwKLQkJCQkgICAgZGV2cHJpdi0+YWlfbl9jaGFuKTsKLQlpZiAoc2VnbGVuIDwgMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0Jc2V0dXBfY2hhbm5lbF9saXN0KGRldiwgcywgZGV2cHJpdi0+YWlfY2hhbmxpc3QsCi0JCQkgICBkZXZwcml2LT5haV9uX2NoYW4sIHNlZ2xlbik7Ci0KLQl1ZGVsYXkoMSk7Ci0KLQlkZXZwcml2LT5haV9hY3Rfc2NhbiA9IGRldnByaXYtPmFpX3NjYW5zOwotCWRldnByaXYtPmFpX2FjdF9jaGFuID0gMDsKLQlkZXZwcml2LT5pcnFfYmxvY2tlZCA9IDE7Ci0JZGV2cHJpdi0+aXJxX3dhc19ub3dfY2xvc2VkID0gMDsKLQlkZXZwcml2LT5uZXZlcmVuZGluZ19haSA9IDA7Ci0JZGV2cHJpdi0+YWN0X2NoYW5saXN0X3BvcyA9IDA7Ci0JZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kID0gMDsKLQotCWlmICgoZGV2cHJpdi0+YWlfc2NhbnMgPT0gMCkgfHwgKGRldnByaXYtPmFpX3NjYW5zID09IC0xKSkKLQkJZGV2cHJpdi0+bmV2ZXJlbmRpbmdfYWkgPSAxOwkvKiB3ZWxsLCB1c2VyIHdhbnQgbmV2ZXJlbmRpbmcgKi8KLQotCWlmIChtb2RlID09IDEpIHsKLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihkZXZwcml2LT5pODI1M19vc2NfYmFzZSwKLQkJCQkJICAmZGl2aXNvcjEsICZkaXZpc29yMiwKLQkJCQkJICAmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJICBUUklHX1JPVU5EX05FQVJFU1QpOwotCQlpZiAoZGl2aXNvcjEgPT0gMSkgewkvKiBQQ0w3MTgvODE4IGNyYXNoIGlmIGFueSBkaXZpc29yIGlzIHNldCB0byAxICovCi0JCQlkaXZpc29yMSA9IDI7Ci0JCQlkaXZpc29yMiAvPSAyOwotCQl9Ci0JCWlmIChkaXZpc29yMiA9PSAxKSB7Ci0JCQlkaXZpc29yMiA9IDI7Ci0JCQlkaXZpc29yMSAvPSAyOwotCQl9CisJZGlzYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKKwlkZXZwcml2LT5uZXh0X2RtYV9idWYgPSAxIC0gZGV2cHJpdi0+bmV4dF9kbWFfYnVmOworCWlmIChkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPiAtMSB8fCBjbWQtPnN0b3Bfc3JjID09IFRSSUdfTk9ORSkgeworCQkvKiBzd2l0Y2ggZG1hIGJ1ZnMgKi8KKwkJc2V0X2RtYV9tb2RlKGRldnByaXYtPmRtYSwgRE1BX01PREVfUkVBRCk7CisJCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKwkJc2V0X2RtYV9hZGRyKGRldnByaXYtPmRtYSwKKwkJCSAgICAgZGV2cHJpdi0+aHdkbWFwdHJbZGV2cHJpdi0+bmV4dF9kbWFfYnVmXSk7CisJCWlmIChkZXZwcml2LT5kbWFfcnVuc190b19lbmQgfHwgY21kLT5zdG9wX3NyYyA9PSBUUklHX05PTkUpCisJCQlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwgZGV2cHJpdi0+aHdkbWFzaXplKTsKKwkJZWxzZQorCQkJc2V0X2RtYV9jb3VudChkZXZwcml2LT5kbWEsIGRldnByaXYtPmxhc3RfZG1hX3J1bik7CisJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCQllbmFibGVfZG1hKGRldnByaXYtPmRtYSk7CiAJfQogCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DTlRFTkFCTEUpOwkvKiBlbmFibGUgcGFjZXIgKi8KLQotCXN3aXRjaCAoZGV2cHJpdi0+ZG1hKSB7Ci0JY2FzZSAxOgkJLyogIERNQSAqLwotCWNhc2UgMzoKLQkJcGNsODE4X2FpX21vZGUxM2RtYV9pbnQobW9kZSwgZGV2LCBzKTsKLQkJYnJlYWs7Ci0JY2FzZSAwOgotCQlpZiAoIWRldnByaXYtPnVzZWZpZm8pIHsKLQkJCS8qIElSUSAqLwotCQkJaWYgKG1vZGUgPT0gMSkgewotCQkJCWRldnByaXYtPmFpX21vZGUgPSBJTlRfVFlQRV9BSTFfSU5UOwotCQkJCS8qIFBhY2VyK0lSUSAqLwotCQkJCW91dGIoMHg4MyB8IChkZXYtPmlycSA8PCA0KSwKLQkJCQkgICAgIGRldi0+aW9iYXNlICsgUENMODE4X0NPTlRST0wpOwotCQkJfSBlbHNlIHsKLQkJCQlkZXZwcml2LT5haV9tb2RlID0gSU5UX1RZUEVfQUkzX0lOVDsKLQkJCQkvKiBFeHQgdHJpZytJUlEgKi8KLQkJCQlvdXRiKDB4ODIgfCAoZGV2LT5pcnEgPDwgNCksCi0JCQkJICAgICBkZXYtPmlvYmFzZSArIFBDTDgxOF9DT05UUk9MKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIEZJRk8gKi8KLQkJCS8qIGVuYWJsZSBGSUZPICovCi0JCQlvdXRiKDEsIGRldi0+aW9iYXNlICsgUENMODE4X0ZJX0VOQUJMRSk7Ci0JCQlpZiAobW9kZSA9PSAxKSB7Ci0JCQkJZGV2cHJpdi0+YWlfbW9kZSA9IElOVF9UWVBFX0FJMV9GSUZPOwotCQkJCS8qIFBhY2VyICovCi0JCQkJb3V0YigweDAzLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DT05UUk9MKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGV2cHJpdi0+YWlfbW9kZSA9IElOVF9UWVBFX0FJM19GSUZPOwotCQkJCW91dGIoMHgwMiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ09OVFJPTCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzdGFydF9wYWNlcihkZXYsIG1vZGUsIGRpdmlzb3IxLCBkaXZpc29yMik7Ci0KLQlyZXR1cm4gMDsKKwlkZXZwcml2LT5kbWFfcnVuc190b19lbmQtLTsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIFN0YXJ0L3N0b3AgcGFjZXIgb25ib2FyZCBwYWNlcgotKi8KLXN0YXRpYyB2b2lkIHN0YXJ0X3BhY2VyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBtb2RlLAotCQkJdW5zaWduZWQgaW50IGRpdmlzb3IxLCB1bnNpZ25lZCBpbnQgZGl2aXNvcjIpCitzdGF0aWMgdm9pZCBwY2w4MThfYWlfc2V0X2NoYW5fcmFuZ2Uoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBjaGFuLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHJhbmdlKQogewotCW91dGIoMHhiNCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ1RSQ1RMKTsKLQlvdXRiKDB4NzQsIGRldi0+aW9iYXNlICsgUENMODE4X0NUUkNUTCk7CisJb3V0YihjaGFuLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9NVVhfUkVHKTsKKwlvdXRiKHJhbmdlLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9SQU5HRV9SRUcpOworfQorCitzdGF0aWMgdm9pZCBwY2w4MThfYWlfc2V0X2NoYW5fc2NhbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgZmlyc3RfY2hhbiwKKwkJCQkgICAgdW5zaWduZWQgaW50IGxhc3RfY2hhbikKK3sKKwlvdXRiKFBDTDgxOF9NVVhfU0NBTihmaXJzdF9jaGFuLCBsYXN0X2NoYW4pLAorCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfTVVYX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbDgxOF9haV9zZXR1cF9jaGFubGlzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgdW5zaWduZWQgaW50ICpjaGFubGlzdCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBzZWdsZW4pCit7CisJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBmaXJzdF9jaGFuID0gQ1JfQ0hBTihjaGFubGlzdFswXSk7CisJdW5zaWduZWQgaW50IGxhc3RfY2hhbjsKKwl1bnNpZ25lZCBpbnQgcmFuZ2U7CisJaW50IGk7CisKKwlkZXZwcml2LT5hY3RfY2hhbmxpc3RfbGVuID0gc2VnbGVuOworCWRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MgPSAwOworCisJLyogc3RvcmUgcmFuZ2UgbGlzdCB0byBjYXJkICovCisJZm9yIChpID0gMDsgaSA8IHNlZ2xlbjsgaSsrKSB7CisJCWxhc3RfY2hhbiA9IENSX0NIQU4oY2hhbmxpc3RbaV0pOworCQlyYW5nZSA9IENSX1JBTkdFKGNoYW5saXN0W2ldKTsKKworCQlkZXZwcml2LT5hY3RfY2hhbmxpc3RbaV0gPSBsYXN0X2NoYW47CisKKwkJcGNsODE4X2FpX3NldF9jaGFuX3JhbmdlKGRldiwgbGFzdF9jaGFuLCByYW5nZSk7CisJfQorCiAJdWRlbGF5KDEpOwogCi0JaWYgKG1vZGUgPT0gMSkgewotCQlvdXRiKGRpdmlzb3IyICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ1RSMik7Ci0JCW91dGIoKGRpdmlzb3IyID4+IDgpICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ1RSMik7Ci0JCW91dGIoZGl2aXNvcjEgJiAweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DVFIxKTsKLQkJb3V0YigoZGl2aXNvcjEgPj4gOCkgJiAweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DVFIxKTsKKwlwY2w4MThfYWlfc2V0X2NoYW5fc2NhbihkZXYsIGZpcnN0X2NoYW4sIGxhc3RfY2hhbik7Cit9CisKK3N0YXRpYyB2b2lkIHBjbDgxOF9haV9jbGVhcl9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwkvKiB3cml0aW5nIGFueSB2YWx1ZSBjbGVhcnMgdGhlIGludGVycnVwdCByZXF1ZXN0ICovCisJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9TVEFUVVNfUkVHKTsKK30KKworc3RhdGljIHZvaWQgcGNsODE4X2FpX3NvZnRfdHJpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQoreworCS8qIHdyaXRpbmcgYW55IHZhbHVlIHRyaWdnZXJzIGEgc29mdHdhcmUgY29udmVyc2lvbiAqLworCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQUlfTFNCX1JFRyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGNsODE4X2FpX2dldF9maWZvX3NhbXBsZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkJICAgICAgdW5zaWduZWQgaW50ICpjaGFuKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwl2YWwgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfREFUQUxPKTsKKwl2YWwgfD0gKGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9EQVRBSEkpIDw8IDgpOworCisJaWYgKGNoYW4pCisJCSpjaGFuID0gdmFsICYgMHhmOworCisJcmV0dXJuICh2YWwgPj4gNCkgJiBzLT5tYXhkYXRhOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBjbDgxOF9haV9nZXRfc2FtcGxlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkJIHVuc2lnbmVkIGludCAqY2hhbikKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJdmFsID0gaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0FJX01TQl9SRUcpIDw8IDg7CisJdmFsIHw9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9BSV9MU0JfUkVHKTsKKworCWlmIChjaGFuKQorCQkqY2hhbiA9IHZhbCAmIDB4ZjsKKworCXJldHVybiAodmFsID4+IDQpICYgcy0+bWF4ZGF0YTsKK30KKworc3RhdGljIGludCBwY2w4MThfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgUENMODE4X1NUQVRVU19SRUcpOworCWlmIChzdGF0dXMgJiBQQ0w4MThfU1RBVFVTX0lOVCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGJvb2wgcGNsODE4X2FpX2Ryb3BvdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgdW5zaWduZWQgaW50IGNoYW4pCit7CisJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBleHBlY3RlZF9jaGFuOworCisJZXhwZWN0ZWRfY2hhbiA9IGRldnByaXYtPmFjdF9jaGFubGlzdFtkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zXTsKKwlpZiAoY2hhbiAhPSBleHBlY3RlZF9jaGFuKSB7CisJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsCisJCQkiQS9EIG1vZGUxLzMgJXMgLSBjaGFubmVsIGRyb3BvdXQgJWQhPSVkICFcbiIsCisJCQkoZGV2cHJpdi0+ZG1hKSA/ICJETUEiIDoKKwkJCShkZXZwcml2LT51c2VmaWZvKSA/ICJGSUZPIiA6ICJJUlEiLAorCQkJY2hhbiwgZXhwZWN0ZWRfY2hhbik7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgcGNsODE4X2FpX25leHRfY2hhbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXN0cnVjdCBwY2w4MThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CisKKwlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKKworCWRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MrKzsKKwlpZiAoZGV2cHJpdi0+YWN0X2NoYW5saXN0X3BvcyA+PSBkZXZwcml2LT5hY3RfY2hhbmxpc3RfbGVuKQorCQlkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zID0gMDsKKworCXMtPmFzeW5jLT5jdXJfY2hhbisrOworCWlmIChzLT5hc3luYy0+Y3VyX2NoYW4gPj0gY21kLT5jaGFubGlzdF9sZW4pIHsKKwkJcy0+YXN5bmMtPmN1cl9jaGFuID0gMDsKKwkJZGV2cHJpdi0+YWlfYWN0X3NjYW4tLTsKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9TOworCX0KKworCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQgJiYgZGV2cHJpdi0+YWlfYWN0X3NjYW4gPT0gMCkgeworCQkvKiBhbGwgZGF0YSBzYW1wbGVkICovCisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBwY2w4MThfaGFuZGxlX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJdW5zaWduZWQgaW50IGNoYW47CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmIChwY2w4MThfYWlfZW9jKGRldiwgcywgTlVMTCwgMCkpIHsKKwkJY29tZWRpX2Vycm9yKGRldiwgIkEvRCBtb2RlMS8zIElSUSB3aXRob3V0IERSRFkhIik7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKKwkJcmV0dXJuOworCX0KKworCXZhbCA9IHBjbDgxOF9haV9nZXRfc2FtcGxlKGRldiwgcywgJmNoYW4pOworCisJaWYgKHBjbDgxOF9haV9kcm9wb3V0KGRldiwgcywgY2hhbikpCisJCXJldHVybjsKKworCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCB2YWwpOworCisJcGNsODE4X2FpX25leHRfY2hhbihkZXYsIHMpOworfQorCitzdGF0aWMgdm9pZCBwY2w4MThfaGFuZGxlX2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIHNob3J0ICpwdHI7CisJdW5zaWduZWQgaW50IGNoYW47CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgaSwgbGVuLCBidWZwdHI7CisKKwlwY2w4MThfYWlfc2V0dXBfbmV4dF9kbWEoZGV2LCBzKTsKKworCXB0ciA9ICh1bnNpZ25lZCBzaG9ydCAqKWRldnByaXYtPmRtYWJ1ZlsxIC0gZGV2cHJpdi0+bmV4dF9kbWFfYnVmXTsKKworCWxlbiA9IGRldnByaXYtPmh3ZG1hc2l6ZSA+PiAxOworCWJ1ZnB0ciA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJdmFsID0gcHRyW2J1ZnB0cisrXTsKKwkJY2hhbiA9IHZhbCAmIDB4ZjsKKwkJdmFsID0gKHZhbCA+PiA0KSAmIHMtPm1heGRhdGE7CisKKwkJaWYgKHBjbDgxOF9haV9kcm9wb3V0KGRldiwgcywgY2hhbikpCisJCQlicmVhazsKKworCQljb21lZGlfYnVmX3B1dChzLT5hc3luYywgdmFsKTsKKworCQlpZiAoIXBjbDgxOF9haV9uZXh0X2NoYW4oZGV2LCBzKSkKKwkJCWJyZWFrOwogCX0KIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIENoZWNrIGlmIGNoYW5uZWwgbGlzdCBmcm9tIHVzZXIgaXMgYnVpbGRlZCBjb3JyZWN0bHkKLSBJZiBpdCdzIG9rLCB0aGVuIHByb2dyYW0gc2Nhbi9nYWluIGxvZ2ljCi0qLworc3RhdGljIHZvaWQgcGNsODE4X2hhbmRsZV9maWZvKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgY2hhbjsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBpLCBsZW47CisKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfU1RBVFVTKTsKKworCWlmIChzdGF0dXMgJiA0KSB7CisJCWNvbWVkaV9lcnJvcihkZXYsICJBL0QgbW9kZTEvMyBGSUZPIG92ZXJmbG93ISIpOworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3RhdHVzICYgMSkgeworCQljb21lZGlfZXJyb3IoZGV2LCAiQS9EIG1vZGUxLzMgRklGTyBpbnRlcnJ1cHQgd2l0aG91dCBkYXRhISIpOworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3RhdHVzICYgMikKKwkJbGVuID0gNTEyOworCWVsc2UKKwkJbGVuID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQl2YWwgPSBwY2w4MThfYWlfZ2V0X2ZpZm9fc2FtcGxlKGRldiwgcywgJmNoYW4pOworCisJCWlmIChwY2w4MThfYWlfZHJvcG91dChkZXYsIHMsIGNoYW4pKQorCQkJYnJlYWs7CisKKwkJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIHZhbCk7CisKKwkJaWYgKCFwY2w4MThfYWlfbmV4dF9jaGFuKGRldiwgcykpCisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBwY2w4MThfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCit7CisJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7CisJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5yZWFkX3N1YmRldjsKKworCWlmICghZGV2LT5hdHRhY2hlZCB8fCAhZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcpIHsKKwkJcGNsODE4X2FpX2NsZWFyX2VvYyhkZXYpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGRldnByaXYtPmFpX2NtZF9jYW5jZWxlZCkgeworCQkvKgorCQkgKiBUaGUgY2xlYW51cCBmcm9tIGFpX2NhbmNlbCgpIGhhcyBiZWVuIGRlbGF5ZWQKKwkJICogdW50aWwgbm93IGJlY2F1c2UgdGhlIGNhcmQgZG9lc24ndCBzZWVtIHRvIGxpa2UKKwkJICogYmVpbmcgcmVwcm9ncmFtbWVkIHdoaWxlIGEgRE1BIHRyYW5zZmVyIGlzIGluCisJCSAqIHByb2dyZXNzLgorCQkgKi8KKwkJZGV2cHJpdi0+YWlfYWN0X3NjYW4gPSAwOworCQlzLT5jYW5jZWwoZGV2LCBzKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmIChkZXZwcml2LT5kbWEpCisJCXBjbDgxOF9oYW5kbGVfZG1hKGRldiwgcyk7CisJZWxzZSBpZiAoZGV2cHJpdi0+dXNlZmlmbykKKwkJcGNsODE4X2hhbmRsZV9maWZvKGRldiwgcyk7CisJZWxzZQorCQlwY2w4MThfaGFuZGxlX2VvYyhkZXYsIHMpOworCisJcGNsODE4X2FpX2NsZWFyX2VvYyhkZXYpOworCisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKIHN0YXRpYyBpbnQgY2hlY2tfY2hhbm5lbF9saXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSAgICAgIHVuc2lnbmVkIGludCAqY2hhbmxpc3QsIHVuc2lnbmVkIGludCBuX2NoYW4pCkBAIC05NDEsNTIgKzcyOCwyMCBAQAogCXJldHVybiBzZWdsZW47CiB9CiAKLXN0YXRpYyB2b2lkIHNldHVwX2NoYW5uZWxfbGlzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICAgIHVuc2lnbmVkIGludCAqY2hhbmxpc3QsIHVuc2lnbmVkIGludCBuX2NoYW4sCi0JCQkgICAgICAgdW5zaWduZWQgaW50IHNlZ2xlbikKLXsKLQlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IGk7Ci0KLQlkZXZwcml2LT5hY3RfY2hhbmxpc3RfbGVuID0gc2VnbGVuOwotCWRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IHNlZ2xlbjsgaSsrKSB7CS8qICBzdG9yZSByYW5nZSBsaXN0IHRvIGNhcmQgKi8KLQkJZGV2cHJpdi0+YWN0X2NoYW5saXN0W2ldID0gQ1JfQ0hBTihjaGFubGlzdFtpXSk7Ci0JCW91dGIobXV4b25lY2hhbltDUl9DSEFOKGNoYW5saXN0W2ldKV0sIGRldi0+aW9iYXNlICsgUENMODE4X01VWCk7CS8qIHNlbGVjdCBjaGFubmVsICovCi0JCW91dGIoQ1JfUkFOR0UoY2hhbmxpc3RbaV0pLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9SQU5HRSk7CS8qIHNlbGVjdCBnYWluICovCi0JfQotCi0JdWRlbGF5KDEpOwotCi0JLyogc2VsZWN0IGNoYW5uZWwgaW50ZXJ2YWwgdG8gc2NhbiAqLwotCW91dGIoZGV2cHJpdi0+YWN0X2NoYW5saXN0WzBdIHwgKGRldnByaXYtPmFjdF9jaGFubGlzdFtzZWdsZW4gLQotCQkJCQkJCSAgICAgICAxXSA8PCA0KSwKLQkgICAgIGRldi0+aW9iYXNlICsgUENMODE4X01VWCk7Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSBDaGVjayBpZiBib2FyZCBpcyBzd2l0Y2hlZCB0byBTRSAoMSkgb3IgRElGRigwKSBtb2RlCi0qLwogc3RhdGljIGludCBjaGVja19zaW5nbGVfZW5kZWQodW5zaWduZWQgaW50IHBvcnQpCiB7Ci0JaWYgKGluYihwb3J0ICsgUENMODE4X1NUQVRVUykgJiAweDIwKQorCWlmIChpbmIocG9ydCArIFBDTDgxOF9TVEFUVVNfUkVHKSAmIFBDTDgxOF9TVEFUVVNfTVVYKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KIHN0YXRpYyBpbnQgYWlfY21kdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJICAgICAgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKIAljb25zdCBzdHJ1Y3QgcGNsODE4X2JvYXJkICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCXN0cnVjdCBwY2w4MThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgZXJyID0gMDsKLQlpbnQgdG1wLCBkaXZpc29yMSA9IDAsIGRpdmlzb3IyID0gMDsKKwlpbnQgdG1wOwogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCkBAIC0xMDM1LDcgKzc5MCw4IEBACiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewogCQl0bXAgPSBjbWQtPmNvbnZlcnRfYXJnOwogCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKGRldnByaXYtPmk4MjUzX29zY19iYXNlLAotCQkJCQkgICZkaXZpc29yMSwgJmRpdmlzb3IyLAorCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMSwKKwkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjIsCiAJCQkJCSAgJmNtZC0+Y29udmVydF9hcmcsIGNtZC0+ZmxhZ3MpOwogCQlpZiAoY21kLT5jb252ZXJ0X2FyZyA8IGJvYXJkLT5uc19taW4pCiAJCQljbWQtPmNvbnZlcnRfYXJnID0gYm9hcmQtPm5zX21pbjsKQEAgLTEwNTcsMTUyICs4MTMsMjcyIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgaW50IGFpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3N0YXRpYyBpbnQgcGNsODE4X2FpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewogCXN0cnVjdCBwY2w4MThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7Ci0JaW50IHJldHZhbDsKKwl1bnNpZ25lZCBpbnQgY3RybCA9IDA7CisJdW5zaWduZWQgaW50IHNlZ2xlbjsKIAotCWRldnByaXYtPmFpX25fY2hhbiA9IGNtZC0+Y2hhbmxpc3RfbGVuOwotCWRldnByaXYtPmFpX2NoYW5saXN0ID0gY21kLT5jaGFubGlzdDsKLQlkZXZwcml2LT5haV9mbGFncyA9IGNtZC0+ZmxhZ3M7CisJaWYgKGRldnByaXYtPmFpX2NtZF9ydW5uaW5nKQorCQlyZXR1cm4gLUVCVVNZOworCisJcGNsODE4X3N0YXJ0X3BhY2VyKGRldiwgZmFsc2UpOworCisJc2VnbGVuID0gY2hlY2tfY2hhbm5lbF9saXN0KGRldiwgcywgY21kLT5jaGFubGlzdCwgY21kLT5jaGFubGlzdF9sZW4pOworCWlmIChzZWdsZW4gPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwY2w4MThfYWlfc2V0dXBfY2hhbmxpc3QoZGV2LCBjbWQtPmNoYW5saXN0LCBzZWdsZW4pOworCiAJZGV2cHJpdi0+YWlfZGF0YV9sZW4gPSBzLT5hc3luYy0+cHJlYWxsb2NfYnVmc3o7Ci0JZGV2cHJpdi0+YWlfdGltZXIxID0gMDsKLQlkZXZwcml2LT5haV90aW1lcjIgPSAwOworCWRldnByaXYtPmFpX2FjdF9zY2FuID0gY21kLT5zdG9wX2FyZzsKKwlkZXZwcml2LT5haV9hY3RfY2hhbiA9IDA7CisJZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcgPSAxOworCWRldnByaXYtPmFpX2NtZF9jYW5jZWxlZCA9IDA7CisJZGV2cHJpdi0+YWN0X2NoYW5saXN0X3BvcyA9IDA7CisJZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kID0gMDsKIAotCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWRldnByaXYtPmFpX3NjYW5zID0gY21kLT5zdG9wX2FyZzsKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQorCQljdHJsIHw9IFBDTDgxOF9DVFJMX1BBQ0VSX1RSSUc7CiAJZWxzZQotCQlkZXZwcml2LT5haV9zY2FucyA9IDA7CisJCWN0cmwgfD0gUENMODE4X0NUUkxfRVhUX1RSSUc7CiAKLQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVykgewkvKiAgbW9kZSAxLCAzICovCi0JCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsJLyogIG1vZGUgMSAqLwotCQkJZGV2cHJpdi0+YWlfdGltZXIxID0gY21kLT5jb252ZXJ0X2FyZzsKLQkJCXJldHZhbCA9IHBjbDgxOF9haV9jbWRfbW9kZSgxLCBkZXYsIHMpOwotCQkJcmV0dXJuIHJldHZhbDsKLQkJfQotCQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX0VYVCkgewkvKiAgbW9kZSAzICovCi0JCQlyZXR1cm4gcGNsODE4X2FpX2NtZF9tb2RlKDMsIGRldiwgcyk7Ci0JCX0KKwlvdXRiKFBDTDgxOF9DTlRFTkFCTEVfUEFDRVJfRU5BLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DTlRFTkFCTEVfUkVHKTsKKworCWlmIChkZXZwcml2LT5kbWEpIHsKKwkJcGNsODE4X2FpX3NldHVwX2RtYShkZXYsIHMpOworCisJCWN0cmwgfD0gUENMODE4X0NUUkxfSU5URSB8IFBDTDgxOF9DVFJMX0lSUShkZXYtPmlycSkgfAorCQkJUENMODE4X0NUUkxfRE1BRTsKKwl9IGVsc2UgaWYgKGRldnByaXYtPnVzZWZpZm8pIHsKKwkJLyogZW5hYmxlIEZJRk8gKi8KKwkJb3V0YigxLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9FTkFCTEUpOworCX0gZWxzZSB7CisJCWN0cmwgfD0gUENMODE4X0NUUkxfSU5URSB8IFBDTDgxOF9DVFJMX0lSUShkZXYtPmlycSk7CiAJfQorCW91dGIoY3RybCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ1RSTF9SRUcpOwogCi0JcmV0dXJuIC0xOworCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpCisJCXBjbDgxOF9zdGFydF9wYWNlcihkZXYsIHRydWUpOworCisJcmV0dXJuIDA7CiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSBjYW5jZWwgYW55IG1vZGUgMS00IEFJCi0qLwogc3RhdGljIGludCBwY2w4MThfYWlfY2FuY2VsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKIAotCWlmIChkZXZwcml2LT5pcnFfYmxvY2tlZCA+IDApIHsKLQkJZGV2cHJpdi0+aXJxX3dhc19ub3dfY2xvc2VkID0gMTsKKwlpZiAoIWRldnByaXYtPmFpX2NtZF9ydW5uaW5nKQorCQlyZXR1cm4gMDsKIAotCQlzd2l0Y2ggKGRldnByaXYtPmFpX21vZGUpIHsKLQkJY2FzZSBJTlRfVFlQRV9BSTFfRE1BOgotCQljYXNlIElOVF9UWVBFX0FJM19ETUE6Ci0JCQlpZiAoZGV2cHJpdi0+bmV2ZXJlbmRpbmdfYWkgfHwKLQkJCSAgICAoIWRldnByaXYtPm5ldmVyZW5kaW5nX2FpICYmCi0JCQkgICAgIGRldnByaXYtPmFpX2FjdF9zY2FuID4gMCkpIHsKLQkJCQkvKiB3YWl0IGZvciBydW5uaW5nIGRtYSB0cmFuc2ZlciB0byBlbmQsIGRvIGNsZWFudXAgaW4gaW50ZXJydXB0ICovCi0JCQkJZ290byBlbmQ7CisJaWYgKGRldnByaXYtPmRtYSkgeworCQlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX05PTkUgfHwKKwkJICAgIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQgJiYgZGV2cHJpdi0+YWlfYWN0X3NjYW4gPiAwKSkgeworCQkJaWYgKCFkZXZwcml2LT5haV9jbWRfY2FuY2VsZWQpIHsKKwkJCQkvKgorCQkJCSogV2FpdCBmb3IgcnVubmluZyBkbWEgdHJhbnNmZXIgdG8gZW5kLAorCQkJCSogZG8gY2xlYW51cCBpbiBpbnRlcnJ1cHQuCisJCQkJKi8KKwkJCQlkZXZwcml2LT5haV9jbWRfY2FuY2VsZWQgPSAxOworCQkJCXJldHVybiAwOwogCQkJfQotCQkJZGlzYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKLQkJY2FzZSBJTlRfVFlQRV9BSTFfSU5UOgotCQljYXNlIElOVF9UWVBFX0FJM19JTlQ6Ci0JCWNhc2UgSU5UX1RZUEVfQUkxX0ZJRk86Ci0JCWNhc2UgSU5UX1RZUEVfQUkzX0ZJRk86Ci0jaWZkZWYgUENMODE4X01PREUxM19BTwotCQljYXNlIElOVF9UWVBFX0FPMV9JTlQ6Ci0JCWNhc2UgSU5UX1RZUEVfQU8zX0lOVDoKLSNlbmRpZgotCQkJb3V0YihpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ09OVFJPTCkgJiAweDczLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DT05UUk9MKTsJLyogU3RvcCBBL0QgKi8KLQkJCXVkZWxheSgxKTsKLQkJCXN0YXJ0X3BhY2VyKGRldiwgLTEsIDAsIDApOwotCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9BRF9MTyk7Ci0JCQlpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQURfTE8pOwotCQkJaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0FEX0hJKTsKLQkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ0xSSU5UKTsJLyogY2xlYXIgSU5UIHJlcXVlc3QgKi8KLQkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ09OVFJPTCk7CS8qIFN0b3AgQS9EICovCi0JCQlpZiAoZGV2cHJpdi0+dXNlZmlmbykgewkvKiAgRklGTyBzaHV0ZG93biAqLwotCQkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfSU5UQ0xSKTsKLQkJCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0ZJX0ZMVVNIKTsKLQkJCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0ZJX0VOQUJMRSk7Ci0JCQl9Ci0JCQlkZXZwcml2LT5pcnFfYmxvY2tlZCA9IDA7Ci0JCQlkZXZwcml2LT5sYXN0X2ludF9zdWIgPSBzOwotCQkJZGV2cHJpdi0+bmV2ZXJlbmRpbmdfYWkgPSAwOwotCQkJZGV2cHJpdi0+YWlfbW9kZSA9IDA7Ci0JCQlkZXZwcml2LT5pcnFfd2FzX25vd19jbG9zZWQgPSAwOwotCQkJYnJlYWs7CiAJCX0KKwkJZGlzYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKIAl9CiAKLWVuZDoKLQlyZXR1cm4gMDsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIGNoZWNoIGZvciBQQ0w4MTgKLSovCi1zdGF0aWMgaW50IHBjbDgxOF9jaGVjayh1bnNpZ25lZCBsb25nIGlvYmFzZSkKLXsKLQlvdXRiKDB4MDAsIGlvYmFzZSArIFBDTDgxOF9NVVgpOwotCXVkZWxheSgxKTsKLQlpZiAoaW5iKGlvYmFzZSArIFBDTDgxOF9NVVgpICE9IDB4MDApCi0JCXJldHVybiAxOwkvKiB0aGVyZSBpc24ndCBjYXJkICovCi0Jb3V0YigweDU1LCBpb2Jhc2UgKyBQQ0w4MThfTVVYKTsKLQl1ZGVsYXkoMSk7Ci0JaWYgKGluYihpb2Jhc2UgKyBQQ0w4MThfTVVYKSAhPSAweDU1KQotCQlyZXR1cm4gMTsJLyogdGhlcmUgaXNuJ3QgY2FyZCAqLwotCW91dGIoMHgwMCwgaW9iYXNlICsgUENMODE4X01VWCk7Ci0JdWRlbGF5KDEpOwotCW91dGIoMHgxOCwgaW9iYXNlICsgUENMODE4X0NPTlRST0wpOwotCXVkZWxheSgxKTsKLQlpZiAoaW5iKGlvYmFzZSArIFBDTDgxOF9DT05UUk9MKSAhPSAweDE4KQotCQlyZXR1cm4gMTsJLyogdGhlcmUgaXNuJ3QgY2FyZCAqLwotCXJldHVybiAwOwkJLyogIG9rLCBjYXJkIGV4aXN0ICovCi19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSByZXNldCB3aG9sZSBQQ0wtODE4IGNhcmRzCi0qLwotc3RhdGljIHZvaWQgcGNsODE4X3Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCi17Ci0JY29uc3Qgc3RydWN0IHBjbDgxOF9ib2FyZCAqYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKLQlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJb3V0YihQQ0w4MThfQ1RSTF9ESVNBQkxFX1RSSUcsIGRldi0+aW9iYXNlICsgUENMODE4X0NUUkxfUkVHKTsKKwlwY2w4MThfc3RhcnRfcGFjZXIoZGV2LCBmYWxzZSk7CisJcGNsODE4X2FpX2NsZWFyX2VvYyhkZXYpOwogCiAJaWYgKGRldnByaXYtPnVzZWZpZm8pIHsJLyogIEZJRk8gc2h1dGRvd24gKi8KIAkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9JTlRDTFIpOwogCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0ZJX0ZMVVNIKTsKIAkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9FTkFCTEUpOwogCX0KLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0RBX0xPKTsJLyogIERBQz0wViAqLwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfREFfSEkpOwotCXVkZWxheSgxKTsKLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0RPX0hJKTsJLyogIERPPSQwMDAwICovCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9ET19MTyk7Ci0JdWRlbGF5KDEpOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ09OVFJPTCk7Ci0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DTlRFTkFCTEUpOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfTVVYKTsKLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0NMUklOVCk7Ci0Jb3V0YigweGIwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DVFJDVEwpOwkvKiBTdG9wIHBhY2VyICovCi0Jb3V0YigweDcwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DVFJDVEwpOwotCW91dGIoMHgzMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ1RSQ1RMKTsKKwlkZXZwcml2LT5haV9jbWRfcnVubmluZyA9IDA7CisJZGV2cHJpdi0+YWlfY21kX2NhbmNlbGVkID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjbDgxOF9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQoreworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOworCWludCByZXQgPSAwOworCWludCBpOworCisJb3V0YihQQ0w4MThfQ1RSTF9TT0ZUX1RSSUcsIGRldi0+aW9iYXNlICsgUENMODE4X0NUUkxfUkVHKTsKKworCXBjbDgxOF9haV9zZXRfY2hhbl9yYW5nZShkZXYsIGNoYW4sIHJhbmdlKTsKKwlwY2w4MThfYWlfc2V0X2NoYW5fc2NhbihkZXYsIGNoYW4sIGNoYW4pOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQlwY2w4MThfYWlfY2xlYXJfZW9jKGRldik7CisJCXBjbDgxOF9haV9zb2Z0X3RyaWcoZGV2KTsKKworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHBjbDgxOF9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJZGF0YVtpXSA9IHBjbDgxOF9haV9nZXRfc2FtcGxlKGRldiwgcywgTlVMTCk7CisJfQorCXBjbDgxOF9haV9jbGVhcl9lb2MoZGV2KTsKKworCXJldHVybiByZXQgPyByZXQgOiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IHBjbDgxOF9hb19pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCXVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl0gPSBkYXRhW2ldOworCQlvdXRiKChkYXRhW2ldICYgMHgwMDBmKSA8PCA0LAorCQkgICAgIGRldi0+aW9iYXNlICsgUENMODE4X0FPX0xTQl9SRUcoY2hhbikpOworCQlvdXRiKChkYXRhW2ldICYgMHgwZmYwKSA+PiA0LAorCQkgICAgIGRldi0+aW9iYXNlICsgUENMODE4X0FPX01TQl9SRUcoY2hhbikpOworCX0KKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IHBjbDgxOF9hb19pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQoreworCXN0cnVjdCBwY2w4MThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKKwkJZGF0YVtpXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dOworCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgcGNsODE4X2RpX2luc25fYml0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJZGF0YVsxXSA9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9ET19ESV9MU0JfUkVHKSB8CisJCSAgKGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9ET19ESV9NU0JfUkVHKSA8PCA4KTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IHBjbDgxOF9kb19pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQoreworCWlmIChjb21lZGlfZGlvX3VwZGF0ZV9zdGF0ZShzLCBkYXRhKSkgeworCQlvdXRiKHMtPnN0YXRlICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRE9fRElfTFNCX1JFRyk7CisJCW91dGIoKHMtPnN0YXRlID4+IDgpLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9ET19ESV9NU0JfUkVHKTsKKwl9CisKKwlkYXRhWzFdID0gcy0+c3RhdGU7CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIHZvaWQgcGNsODE4X3Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IHBjbDgxOF9ib2FyZCAqYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIFBDTDgxOF9USU1FUl9CQVNFOworCXVuc2lnbmVkIGludCBjaGFuOworCisJLyogZmx1c2ggYW5kIGRpc2FibGUgdGhlIEZJRk8gKi8KKwlpZiAoYm9hcmQtPmhhc19maWZvKSB7CisJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfSU5UQ0xSKTsKKwkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9GTFVTSCk7CisJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfRU5BQkxFKTsKKwl9CisKKwkvKiBkaXNhYmxlIGFuYWxvZyBpbnB1dCB0cmlnZ2VyICovCisJb3V0YihQQ0w4MThfQ1RSTF9ESVNBQkxFX1RSSUcsIGRldi0+aW9iYXNlICsgUENMODE4X0NUUkxfUkVHKTsKKwlwY2w4MThfYWlfY2xlYXJfZW9jKGRldik7CisKKwlwY2w4MThfYWlfc2V0X2NoYW5fcmFuZ2UoZGV2LCAwLCAwKTsKKworCS8qIHN0b3AgcGFjZXIgKi8KKwlvdXRiKFBDTDgxOF9DTlRFTkFCTEVfUEFDRVJfRU5BLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DTlRFTkFCTEVfUkVHKTsKKwlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAyLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CisJaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMSwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOworCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDAsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKKworCS8qIHNldCBhbmFsb2cgb3V0cHV0IGNoYW5uZWxzIHRvIDBWICovCisJZm9yIChjaGFuID0gMDsgY2hhbiA8IGJvYXJkLT5uX2FvY2hhbjsgY2hhbisrKSB7CisJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQU9fTFNCX1JFRyhjaGFuKSk7CisJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQU9fTVNCX1JFRyhjaGFuKSk7CisJfQorCisJLyogc2V0IGFsbCBkaWdpdGFsIG91dHB1dHMgbG93ICovCisJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9ET19ESV9NU0JfUkVHKTsKKwlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0RPX0RJX0xTQl9SRUcpOworfQorCitzdGF0aWMgdm9pZCBwY2w4MThfc2V0X2FpX3JhbmdlX3RhYmxlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgICAgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQoreworCWNvbnN0IHN0cnVjdCBwY2w4MThfYm9hcmQgKmJvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CisKKwkvKiBkZWZhdWx0IHRvIHRoZSByYW5nZSB0YWJsZSBmcm9tIHRoZSBib2FyZGluZm8gKi8KKwlzLT5yYW5nZV90YWJsZSA9IGJvYXJkLT5haV9yYW5nZV90eXBlOworCisJLyogbm93IGNoZWNrIHRoZSB1c2VyIGNvbmZpZyBvcHRpb24gYmFzZWQgb24gdGhlIGJvYXJkdHlwZSAqLwogCWlmIChib2FyZC0+aXNfODE4KSB7Ci0JCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfUkFOR0UpOworCQlpZiAoaXQtPm9wdGlvbnNbNF0gPT0gMSB8fCBpdC0+b3B0aW9uc1s0XSA9PSAxMCkgeworCQkJLyogc2Vjb25kYXJ5IHJhbmdlIGxpc3QganVtcGVyIHNlbGVjdGFibGUgKi8KKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3BjbDgxOGxfaF9haTsKKwkJfQogCX0gZWxzZSB7Ci0JCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w3MThfREEyX0xPKTsKLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDcxOF9EQTJfSEkpOworCQlzd2l0Y2ggKGl0LT5vcHRpb25zWzRdKSB7CisJCWNhc2UgMDoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2JpcG9sYXIxMDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9iaXBvbGFyNTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9iaXBvbGFyMl81OworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlNzE4X2JpcG9sYXIxOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlNzE4X2JpcG9sYXIwXzU7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfdW5pcG9sYXIxMDsKKwkJCWJyZWFrOworCQljYXNlIDc6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV91bmlwb2xhcjU7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2U3MThfdW5pcG9sYXIyOworCQkJYnJlYWs7CisJCWNhc2UgOToKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlNzE4X3VuaXBvbGFyMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfdW5rbm93bjsKKwkJCWJyZWFrOworCQl9CiAJfQogfQogCkBAIC0xMjEwLDE1NCArMTA4Niw5NiBAQAogewogCWNvbnN0IHN0cnVjdCBwY2w4MThfYm9hcmQgKmJvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CiAJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2OwotCWludCByZXQ7Ci0JaW50IGRtYTsKLQl1bnNpZ25lZCBsb25nIHBhZ2VzOwogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOworCWludCByZXQ7CisJaW50IGk7CiAKIAlkZXZwcml2ID0gY29tZWRpX2FsbG9jX2RldnByaXYoZGV2LCBzaXplb2YoKmRldnByaXYpKTsKIAlpZiAoIWRldnByaXYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZGV2cHJpdi0+aW9fcmFuZ2UgPSBib2FyZC0+aW9fcmFuZ2U7Ci0JaWYgKChib2FyZC0+ZmlmbykgJiYgKGl0LT5vcHRpb25zWzJdID09IC0xKSkgewotCQkvKiAgd2UndmUgYm9hcmQgd2l0aCBGSUZPIGFuZCB3ZSB3YW50IHRvIHVzZSBGSUZPICovCi0JCWRldnByaXYtPmlvX3JhbmdlID0gUENMeDF4RklGT19SQU5HRTsKLQkJZGV2cHJpdi0+dXNlZmlmbyA9IDE7Ci0JfQotCXJldCA9IGNvbWVkaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIGl0LT5vcHRpb25zWzBdLCBkZXZwcml2LT5pb19yYW5nZSk7CisJcmV0ID0gY29tZWRpX3JlcXVlc3RfcmVnaW9uKGRldiwgaXQtPm9wdGlvbnNbMF0sCisJCQkJICAgIGJvYXJkLT5oYXNfZmlmbyA/IDB4MjAgOiAweDEwKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKHBjbDgxOF9jaGVjayhkZXYtPmlvYmFzZSkpIHsKLQkJY29tZWRpX2Vycm9yKGRldiwgIkkgY2FuJ3QgZGV0ZWN0IGJvYXJkLiBGQUlMIVxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWlmICgoMSA8PCBpdC0+b3B0aW9uc1sxXSkgJiBib2FyZC0+SVJRYml0cykgewotCQlyZXQgPSByZXF1ZXN0X2lycShpdC0+b3B0aW9uc1sxXSwgaW50ZXJydXB0X3BjbDgxOCwgMCwKKwkvKiB3ZSBjYW4gdXNlIElSUSAyLTcgZm9yIGFzeW5jIGNvbW1hbmQgc3VwcG9ydCAqLworCWlmIChpdC0+b3B0aW9uc1sxXSA+PSAyICYmIGl0LT5vcHRpb25zWzFdIDw9IDcpIHsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoaXQtPm9wdGlvbnNbMV0sIHBjbDgxOF9pbnRlcnJ1cHQsIDAsCiAJCQkJICBkZXYtPmJvYXJkX25hbWUsIGRldik7CiAJCWlmIChyZXQgPT0gMCkKIAkJCWRldi0+aXJxID0gaXQtPm9wdGlvbnNbMV07CiAJfQogCi0JZGV2cHJpdi0+aXJxX2Jsb2NrZWQgPSAwOwkvKiBudW1iZXIgb2Ygc3ViZGV2aWNlIHdoaWNoIHVzZSBJUlEgKi8KLQlkZXZwcml2LT5haV9tb2RlID0gMDsJLyogbW9kZSBvZiBpcnEgKi8KKwkvKiBzaG91bGQgd2UgdXNlIHRoZSBGSUZPPyAqLworCWlmIChkZXYtPmlycSAmJiBib2FyZC0+aGFzX2ZpZm8gJiYgaXQtPm9wdGlvbnNbMl0gPT0gLTEpCisJCWRldnByaXYtPnVzZWZpZm8gPSAxOwogCi0JLyogZ3JhYiBvdXIgRE1BICovCi0JZG1hID0gMDsKLQlkZXZwcml2LT5kbWEgPSBkbWE7Ci0JaWYgKCFkZXYtPmlycSkKLQkJZ290byBub19kbWE7CS8qIGlmIHdlIGhhdmVuJ3QgSVJRLCB3ZSBjYW4ndCB1c2UgRE1BICovCi0JaWYgKGJvYXJkLT5ETUFiaXRzICE9IDApIHsJLyogYm9hcmQgc3VwcG9ydCBETUEgKi8KLQkJZG1hID0gaXQtPm9wdGlvbnNbMl07Ci0JCWlmIChkbWEgPCAxKQotCQkJZ290byBub19kbWE7CS8qIERNQSBkaXNhYmxlZCAqLwotCQlpZiAoKCgxIDw8IGRtYSkgJiBib2FyZC0+RE1BYml0cykgPT0gMCkgeworCS8qIHdlIG5lZWQgYW4gSVJRIHRvIGRvIERNQSBvbiBjaGFubmVsIDMgb3IgMSAqLworCWlmIChkZXYtPmlycSAmJiBib2FyZC0+aGFzX2RtYSAmJgorCSAgICAoaXQtPm9wdGlvbnNbMl0gPT0gMyB8fCBpdC0+b3B0aW9uc1syXSA9PSAxKSkgeworCQlyZXQgPSByZXF1ZXN0X2RtYShpdC0+b3B0aW9uc1syXSwgZGV2LT5ib2FyZF9uYW1lKTsKKwkJaWYgKHJldCkgewogCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCQkiRE1BIGlzIG91dCBvZiBhbGxvd2VkIHJhbmdlLCBGQUlMIVxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsJLyogQmFkIERNQSAqLwotCQl9Ci0JCXJldCA9IHJlcXVlc3RfZG1hKGRtYSwgZGV2LT5ib2FyZF9uYW1lKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiAtRUJVU1k7CS8qIERNQSBpc24ndCBmcmVlICovCi0JCWRldnByaXYtPmRtYSA9IGRtYTsKLQkJcGFnZXMgPSAyOwkvKiB3ZSBuZWVkIDE2S0IgKi8KLQkJZGV2cHJpdi0+ZG1hYnVmWzBdID0gX19nZXRfZG1hX3BhZ2VzKEdGUF9LRVJORUwsIHBhZ2VzKTsKLQkJaWYgKCFkZXZwcml2LT5kbWFidWZbMF0pCi0JCQkvKiBtYXliZSBleHBlcmltZW50IHdpdGggdHJ5X3RvX2ZyZWVfcGFnZXMoKSB3aWxsIGhlbHAgLi4uLiAqLwotCQkJcmV0dXJuIC1FQlVTWTsJLyogbm8gYnVmZmVyIDotKCAqLwotCQlkZXZwcml2LT5kbWFwYWdlc1swXSA9IHBhZ2VzOwotCQlkZXZwcml2LT5od2RtYXB0clswXSA9IHZpcnRfdG9fYnVzKCh2b2lkICopZGV2cHJpdi0+ZG1hYnVmWzBdKTsKLQkJZGV2cHJpdi0+aHdkbWFzaXplWzBdID0gKDEgPDwgcGFnZXMpICogUEFHRV9TSVpFOwotCQlkZXZwcml2LT5kbWFidWZbMV0gPSBfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgcGFnZXMpOwotCQlpZiAoIWRldnByaXYtPmRtYWJ1ZlsxXSkKKwkJCQkidW5hYmxlIHRvIHJlcXVlc3QgRE1BIGNoYW5uZWwgJWRcbiIsCisJCQkJaXQtPm9wdGlvbnNbMl0pOwogCQkJcmV0dXJuIC1FQlVTWTsKLQkJZGV2cHJpdi0+ZG1hcGFnZXNbMV0gPSBwYWdlczsKLQkJZGV2cHJpdi0+aHdkbWFwdHJbMV0gPSB2aXJ0X3RvX2J1cygodm9pZCAqKWRldnByaXYtPmRtYWJ1ZlsxXSk7Ci0JCWRldnByaXYtPmh3ZG1hc2l6ZVsxXSA9ICgxIDw8IHBhZ2VzKSAqIFBBR0VfU0laRTsKLQl9CisJCX0KKwkJZGV2cHJpdi0+ZG1hID0gaXQtPm9wdGlvbnNbMl07CiAKLW5vX2RtYToKKwkJZGV2cHJpdi0+ZG1hcGFnZXMgPSAyOwkvKiB3ZSBuZWVkIDE2S0IgKi8KKwkJZGV2cHJpdi0+aHdkbWFzaXplID0gKDEgPDwgZGV2cHJpdi0+ZG1hcGFnZXMpICogUEFHRV9TSVpFOworCisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCXVuc2lnbmVkIGxvbmcgZG1hYnVmOworCisJCQlkbWFidWYgPSBfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgZGV2cHJpdi0+ZG1hcGFnZXMpOworCQkJaWYgKCFkbWFidWYpCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCWRldnByaXYtPmRtYWJ1ZltpXSA9IGRtYWJ1ZjsKKwkJCWRldnByaXYtPmh3ZG1hcHRyW2ldID0gdmlydF90b19idXMoKHZvaWQgKilkbWFidWYpOworCQl9CisJfQogCiAJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCA0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMF07Ci0JaWYgKCFib2FyZC0+bl9haWNoYW5fc2UpIHsKLQkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0FJOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9SRUFEQUJMRTsKKwlpZiAoY2hlY2tfc2luZ2xlX2VuZGVkKGRldi0+aW9iYXNlKSkgeworCQlzLT5uX2NoYW4JPSAxNjsKKwkJcy0+c3ViZGV2X2ZsYWdzCXw9IFNERl9DT01NT04gfCBTREZfR1JPVU5EOwogCX0gZWxzZSB7Ci0JCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BSTsKLQkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFOwotCQlpZiAoY2hlY2tfc2luZ2xlX2VuZGVkKGRldi0+aW9iYXNlKSkgewotCQkJcy0+bl9jaGFuID0gYm9hcmQtPm5fYWljaGFuX3NlOwotCQkJcy0+c3ViZGV2X2ZsYWdzIHw9IFNERl9DT01NT04gfCBTREZfR1JPVU5EOwotCQl9IGVsc2UgewotCQkJcy0+bl9jaGFuID0gYm9hcmQtPm5fYWljaGFuX2RpZmY7Ci0JCQlzLT5zdWJkZXZfZmxhZ3MgfD0gU0RGX0RJRkY7Ci0JCX0KLQkJcy0+bWF4ZGF0YSA9IGJvYXJkLT5haV9tYXhkYXRhOwotCQlzLT5yYW5nZV90YWJsZSA9IGJvYXJkLT5haV9yYW5nZV90eXBlOwotCQlzLT5pbnNuX3JlYWQgPSBwY2w4MThfYWlfaW5zbl9yZWFkOwotCQlpZiAoZGV2LT5pcnEpIHsKLQkJCWRldi0+cmVhZF9zdWJkZXYgPSBzOwotCQkJcy0+c3ViZGV2X2ZsYWdzIHw9IFNERl9DTURfUkVBRDsKLQkJCXMtPmxlbl9jaGFubGlzdCA9IHMtPm5fY2hhbjsKLQkJCXMtPmRvX2NtZHRlc3QgPSBhaV9jbWR0ZXN0OwotCQkJcy0+ZG9fY21kID0gYWlfY21kOwotCQkJcy0+Y2FuY2VsID0gcGNsODE4X2FpX2NhbmNlbDsKLQkJfQotCQlpZiAoYm9hcmQtPmlzXzgxOCkgewotCQkJaWYgKChpdC0+b3B0aW9uc1s0XSA9PSAxKSB8fCAoaXQtPm9wdGlvbnNbNF0gPT0gMTApKQotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3BjbDgxOGxfaF9haTsJLyogIHNlY29uZGFyeSByYW5nZSBsaXN0IGp1bXBlciBzZWxlY3RhYmxlICovCi0JCX0gZWxzZSB7Ci0JCQlzd2l0Y2ggKGl0LT5vcHRpb25zWzRdKSB7Ci0JCQljYXNlIDA6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYmlwb2xhcjEwOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2JpcG9sYXI1OwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2JpcG9sYXIyXzU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2U3MThfYmlwb2xhcjE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQ6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2U3MThfYmlwb2xhcjBfNTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNjoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV91bmlwb2xhcjEwOwotCQkJCWJyZWFrOwotCQkJY2FzZSA3OgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3VuaXBvbGFyNTsKLQkJCQlicmVhazsKLQkJCWNhc2UgODoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZTcxOF91bmlwb2xhcjI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDk6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2U3MThfdW5pcG9sYXIxOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV91bmtub3duOwotCQkJCWJyZWFrOwotCQkJfQotCQl9CisJCXMtPm5fY2hhbgk9IDg7CisJCXMtPnN1YmRldl9mbGFncwl8PSBTREZfRElGRjsKKwl9CisJcy0+bWF4ZGF0YQk9IDB4MGZmZjsKKworCXBjbDgxOF9zZXRfYWlfcmFuZ2VfdGFibGUoZGV2LCBzLCBpdCk7CisKKwlzLT5pbnNuX3JlYWQJPSBwY2w4MThfYWlfaW5zbl9yZWFkOworCWlmIChkZXYtPmlycSkgeworCQlkZXYtPnJlYWRfc3ViZGV2ID0gczsKKwkJcy0+c3ViZGV2X2ZsYWdzCXw9IFNERl9DTURfUkVBRDsKKwkJcy0+bGVuX2NoYW5saXN0CT0gcy0+bl9jaGFuOworCQlzLT5kb19jbWR0ZXN0CT0gYWlfY21kdGVzdDsKKwkJcy0+ZG9fY21kCT0gcGNsODE4X2FpX2NtZDsKKwkJcy0+Y2FuY2VsCT0gcGNsODE4X2FpX2NhbmNlbDsKIAl9CiAKKwkvKiBBbmFsb2cgT3V0cHV0IHN1YmRldmljZSAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzFdOwotCWlmICghYm9hcmQtPm5fYW9jaGFuKSB7Ci0JCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7Ci0JfSBlbHNlIHsKLQkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FPOwotCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfR1JPVU5EOwotCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9hb2NoYW47Ci0JCXMtPm1heGRhdGEgPSBib2FyZC0+YW9fbWF4ZGF0YTsKLQkJcy0+cmFuZ2VfdGFibGUgPSBib2FyZC0+YW9fcmFuZ2VfdHlwZTsKLQkJcy0+aW5zbl9yZWFkID0gcGNsODE4X2FvX2luc25fcmVhZDsKLQkJcy0+aW5zbl93cml0ZSA9IHBjbDgxOF9hb19pbnNuX3dyaXRlOworCWlmIChib2FyZC0+bl9hb2NoYW4pIHsKKwkJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9BTzsKKwkJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1dSSVRBQkxFIHwgU0RGX0dST1VORDsKKwkJcy0+bl9jaGFuCT0gYm9hcmQtPm5fYW9jaGFuOworCQlzLT5tYXhkYXRhCT0gMHgwZmZmOworCQlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV91bmlwb2xhcjU7CisJCXMtPmluc25fcmVhZAk9IHBjbDgxOF9hb19pbnNuX3JlYWQ7CisJCXMtPmluc25fd3JpdGUJPSBwY2w4MThfYW9faW5zbl93cml0ZTsKIAkJaWYgKGJvYXJkLT5pc184MTgpIHsKIAkJCWlmICgoaXQtPm9wdGlvbnNbNF0gPT0gMSkgfHwgKGl0LT5vcHRpb25zWzRdID09IDEwKSkKIAkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV91bmlwb2xhcjEwOwpAQCAtMTM2OSwzMSArMTE4NywyNyBAQAogCQkJaWYgKGl0LT5vcHRpb25zWzVdID09IDIpCiAJCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfdW5rbm93bjsKIAkJfQorCX0gZWxzZSB7CisJCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfVU5VU0VEOwogCX0KIAorCS8qIERpZ2l0YWwgSW5wdXQgc3ViZGV2aWNlICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMl07Ci0JaWYgKCFib2FyZC0+bl9kaWNoYW4pIHsKLQkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKLQl9IGVsc2UgewotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfREk7Ci0JCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRTsKLQkJcy0+bl9jaGFuID0gYm9hcmQtPm5fZGljaGFuOwotCQlzLT5tYXhkYXRhID0gMTsKLQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKLQkJcy0+aW5zbl9iaXRzID0gcGNsODE4X2RpX2luc25fYml0czsKLQl9CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9ESTsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfUkVBREFCTEU7CisJcy0+bl9jaGFuCT0gMTY7CisJcy0+bWF4ZGF0YQk9IDE7CisJcy0+cmFuZ2VfdGFibGUJPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX2JpdHMJPSBwY2w4MThfZGlfaW5zbl9iaXRzOwogCisJLyogRGlnaXRhbCBPdXRwdXQgc3ViZGV2aWNlICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbM107Ci0JaWYgKCFib2FyZC0+bl9kb2NoYW4pIHsKLQkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKLQl9IGVsc2UgewotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfRE87Ci0JCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRTsKLQkJcy0+bl9jaGFuID0gYm9hcmQtPm5fZG9jaGFuOwotCQlzLT5tYXhkYXRhID0gMTsKLQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKLQkJcy0+aW5zbl9iaXRzID0gcGNsODE4X2RvX2luc25fYml0czsKLQl9CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9ETzsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfV1JJVEFCTEU7CisJcy0+bl9jaGFuCT0gMTY7CisJcy0+bWF4ZGF0YQk9IDE7CisJcy0+cmFuZ2VfdGFibGUJPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX2JpdHMJPSBwY2w4MThfZG9faW5zbl9iaXRzOwogCiAJLyogc2VsZWN0IDEvMTBNSHogb3NjaWxhdG9yICovCiAJaWYgKChpdC0+b3B0aW9uc1szXSA9PSAwKSB8fCAoaXQtPm9wdGlvbnNbM10gPT0gMTApKQpAQCAtMTQyNCwzOCArMTIzOCwxMyBAQAogCQlpZiAoZGV2cHJpdi0+ZG1hKQogCQkJZnJlZV9kbWEoZGV2cHJpdi0+ZG1hKTsKIAkJaWYgKGRldnByaXYtPmRtYWJ1ZlswXSkKLQkJCWZyZWVfcGFnZXMoZGV2cHJpdi0+ZG1hYnVmWzBdLCBkZXZwcml2LT5kbWFwYWdlc1swXSk7CisJCQlmcmVlX3BhZ2VzKGRldnByaXYtPmRtYWJ1ZlswXSwgZGV2cHJpdi0+ZG1hcGFnZXMpOwogCQlpZiAoZGV2cHJpdi0+ZG1hYnVmWzFdKQotCQkJZnJlZV9wYWdlcyhkZXZwcml2LT5kbWFidWZbMV0sIGRldnByaXYtPmRtYXBhZ2VzWzFdKTsKKwkJCWZyZWVfcGFnZXMoZGV2cHJpdi0+ZG1hYnVmWzFdLCBkZXZwcml2LT5kbWFwYWdlcyk7CiAJfQogCWNvbWVkaV9sZWdhY3lfZGV0YWNoKGRldik7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNsODE4X2JvYXJkIGJvYXJkdHlwZXNbXSA9IHsKLQl7InBjbDgxOGwiLCA0LCAxNiwgOCwgMjUwMDAsIDEsIDE2LCAxNiwgJnJhbmdlX3BjbDgxOGxfbF9haSwKLQkgJnJhbmdlX3VuaXBvbGFyNSwgUENMeDF4X1JBTkdFLCAweDAwZmMsCi0JIDB4MGEsIDB4ZmZmLCAweGZmZiwgMCwgMX0sCi0JeyJwY2w4MThoIiwgOSwgMTYsIDgsIDEwMDAwLCAxLCAxNiwgMTYsICZyYW5nZV9wY2w4MThoX2FpLAotCSAmcmFuZ2VfdW5pcG9sYXI1LCBQQ0x4MXhfUkFOR0UsIDB4MDBmYywKLQkgMHgwYSwgMHhmZmYsIDB4ZmZmLCAwLCAxfSwKLQl7InBjbDgxOGhkIiwgOSwgMTYsIDgsIDEwMDAwLCAxLCAxNiwgMTYsICZyYW5nZV9wY2w4MThoX2FpLAotCSAmcmFuZ2VfdW5pcG9sYXI1LCBQQ0x4MXhfUkFOR0UsIDB4MDBmYywKLQkgMHgwYSwgMHhmZmYsIDB4ZmZmLCAxLCAxfSwKLQl7InBjbDgxOGhnIiwgMTIsIDE2LCA4LCAxMDAwMCwgMSwgMTYsIDE2LCAmcmFuZ2VfcGNsODE4aGdfYWksCi0JICZyYW5nZV91bmlwb2xhcjUsIFBDTHgxeF9SQU5HRSwgMHgwMGZjLAotCSAweDBhLCAweGZmZiwgMHhmZmYsIDEsIDF9LAotCXsicGNsODE4IiwgOSwgMTYsIDgsIDEwMDAwLCAyLCAxNiwgMTYsICZyYW5nZV9wY2w4MThoX2FpLAotCSAmcmFuZ2VfdW5pcG9sYXI1LCBQQ0x4MXhfUkFOR0UsIDB4MDBmYywKLQkgMHgwYSwgMHhmZmYsIDB4ZmZmLCAwLCAxfSwKLQl7InBjbDcxOCIsIDEsIDE2LCA4LCAxNjAwMCwgMiwgMTYsIDE2LCAmcmFuZ2VfdW5pcG9sYXI1LAotCSAmcmFuZ2VfdW5pcG9sYXI1LCBQQ0x4MXhfUkFOR0UsIDB4MDBmYywKLQkgMHgwYSwgMHhmZmYsIDB4ZmZmLCAwLCAwfSwKLQkvKiBwY20zNzE4ICovCi0JeyJwY20zNzE4IiwgOSwgMTYsIDgsIDEwMDAwLCAwLCAxNiwgMTYsICZyYW5nZV9wY2w4MThoX2FpLAotCSAmcmFuZ2VfdW5pcG9sYXI1LCBQQ0x4MXhfUkFOR0UsIDB4MDBmYywKLQkgMHgwYSwgMHhmZmYsIDB4ZmZmLCAwLCAxIC8qIFhYWCA/ICovIH0sCi19OwotCiBzdGF0aWMgc3RydWN0IGNvbWVkaV9kcml2ZXIgcGNsODE4X2RyaXZlciA9IHsKIAkuZHJpdmVyX25hbWUJPSAicGNsODE4IiwKIAkubW9kdWxlCQk9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbTM3MjQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY20zNzI0LmMKaW5kZXggZjRhNDliZC4uNTNlNzM3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbTM3MjQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtMzcyNC5jCkBAIC0yMjUsOCArMjI1LDEwIEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgZGV2LT5uX3N1YmRldmljZXM7IGkrKykgewogCQlzID0gJmRldi0+c3ViZGV2aWNlc1tpXTsKLQkJc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIHN1YmRldl84MjU1X2NiLAotCQkJCSAodW5zaWduZWQgbG9uZykoZGV2LT5pb2Jhc2UgKyBTSVpFXzgyNTUgKiBpKSk7CisJCXJldCA9IHN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBzdWJkZXZfODI1NV9jYiwKKwkJCQkgICAgICAgZGV2LT5pb2Jhc2UgKyBTSVpFXzgyNTUgKiBpKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJCXMtPmluc25fY29uZmlnID0gc3ViZGV2XzM3MjRfaW5zbl9jb25maWc7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbWFkLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtYWQuYwppbmRleCBmZTQ4MmZkLi44N2M2MWQ5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbWFkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbWFkLmMKQEAgLTYxLDE4ICs2MSwxNyBAQAogCX0sCiB9OwogCi0jZGVmaW5lIFRJTUVPVVQJMTAwCi0KLXN0YXRpYyBpbnQgcGNtYWRfYWlfd2FpdF9mb3JfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJIGludCB0aW1lb3V0KQorc3RhdGljIGludCBwY21hZF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJdW5zaWduZWQgbG9uZyBjb250ZXh0KQogewotCWludCBpOworCXVuc2lnbmVkIGludCBzdGF0dXM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7Ci0JCWlmICgoaW5iKGRldi0+aW9iYXNlICsgUENNQURfU1RBVFVTKSAmIDB4MykgPT0gMHgzKQotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRVRJTUU7CisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgUENNQURfU1RBVFVTKTsKKwlpZiAoKHN0YXR1cyAmIDB4MykgPT0gMHgzKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOwogfQogCiBzdGF0aWMgaW50IHBjbWFkX2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtODksNyArODgsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKIAkJb3V0YihjaGFuLCBkZXYtPmlvYmFzZSArIFBDTUFEX0NPTlZFUlQpOwogCi0JCXJldCA9IHBjbWFkX2FpX3dhaXRfZm9yX2VvYyhkZXYsIFRJTUVPVVQpOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHBjbWFkX2FpX2VvYywgMCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtbWlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtbWlvLmMKaW5kZXggYzM4OGY3Zi4uZTg5YmNhODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21taW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtbWlvLmMKQEAgLTU4OSwxNiArNTg5LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGNtbWlvX2FpX3dhaXRfZm9yX2VvYyh1bnNpZ25lZCBsb25nIGlvYmFzZSwgdW5zaWduZWQgaW50IHRpbWVvdXQpCitzdGF0aWMgaW50IHBjbW1pb19haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQogewogCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwogCi0Jd2hpbGUgKHRpbWVvdXQtLSkgewotCQlzdGF0dXMgPSBpbmIoaW9iYXNlICsgUENNTUlPX0FJX1NUQVRVU19SRUcpOwotCQlpZiAoc3RhdHVzICYgUENNTUlPX0FJX1NUQVRVU19EQVRBX1JFQURZKQotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRVRJTUU7CisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgUENNTUlPX0FJX1NUQVRVU19SRUcpOworCWlmIChzdGF0dXMgJiBQQ01NSU9fQUlfU1RBVFVTX0RBVEFfUkVBRFkpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7CiB9CiAKIHN0YXRpYyBpbnQgcGNtbWlvX2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtNjQzLDcgKzY0NCw4IEBACiAJY21kIHw9IFBDTU1JT19BSV9DTURfUkFOR0UocmFuZ2UpOwogCiAJb3V0YihjbWQsIGlvYmFzZSArIFBDTU1JT19BSV9DTURfUkVHKTsKLQlyZXQgPSBwY21taW9fYWlfd2FpdF9mb3JfZW9jKGlvYmFzZSwgMTAwMDAwKTsKKworCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcGNtbWlvX2FpX2VvYywgMCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNjUyLDcgKzY1NCw4IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CiAJCW91dGIoY21kLCBpb2Jhc2UgKyBQQ01NSU9fQUlfQ01EX1JFRyk7Ci0JCXJldCA9IHBjbW1pb19haV93YWl0X2Zvcl9lb2MoaW9iYXNlLCAxMDAwMDApOworCisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcGNtbWlvX2FpX2VvYywgMCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCkBAIC02ODQsMTYgKzY4NywxNyBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCi1zdGF0aWMgaW50IHBjbW1pb19hb193YWl0X2Zvcl9lb2ModW5zaWduZWQgbG9uZyBpb2Jhc2UsIHVuc2lnbmVkIGludCB0aW1lb3V0KQorc3RhdGljIGludCBwY21taW9fYW9fZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKIHsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czsKIAotCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJc3RhdHVzID0gaW5iKGlvYmFzZSArIFBDTU1JT19BT19TVEFUVVNfUkVHKTsKLQkJaWYgKHN0YXR1cyAmIFBDTU1JT19BT19TVEFUVVNfREFUQV9SRUFEWSkKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVUSU1FOworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIFBDTU1JT19BT19TVEFUVVNfUkVHKTsKKwlpZiAoc3RhdHVzICYgUENNTUlPX0FPX1NUQVRVU19EQVRBX1JFQURZKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOwogfQogCiBzdGF0aWMgaW50IHBjbW1pb19hb19pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC03MjYsNyArNzMwLDggQEAKIAlvdXRiKFBDTU1JT19BT19MU0JfU1BBTihyYW5nZSksIGlvYmFzZSArIFBDTU1JT19BT19MU0JfUkVHKTsKIAlvdXRiKDAsIGlvYmFzZSArIFBDTU1JT19BT19NU0JfUkVHKTsKIAlvdXRiKGNtZCB8IFBDTU1JT19BT19DTURfV1JfU1BBTl9VUERBVEUsIGlvYmFzZSArIFBDTU1JT19BT19DTURfUkVHKTsKLQlyZXQgPSBwY21taW9fYW9fd2FpdF9mb3JfZW9jKGlvYmFzZSwgMTAwMDAwKTsKKworCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcGNtbWlvX2FvX2VvYywgMCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNzM4LDcgKzc0Myw4IEBACiAJCW91dGIoKHZhbCA+PiA4KSAmIDB4ZmYsIGlvYmFzZSArIFBDTU1JT19BT19NU0JfUkVHKTsKIAkJb3V0YihjbWQgfCBQQ01NSU9fQU9fQ01EX1dSX0NPREVfVVBEQVRFLAogCQkgICAgIGlvYmFzZSArIFBDTU1JT19BT19DTURfUkVHKTsKLQkJcmV0ID0gcGNtbWlvX2FvX3dhaXRfZm9yX2VvYyhpb2Jhc2UsIDEwMDAwMCk7CisKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBwY21taW9fYW9fZW9jLCAwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wbHg5MDgwLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGx4OTA4MC5oCmluZGV4IDU1ZTNjMmUuLjI1NzA2NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wbHg5MDgwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BseDkwODAuaApAQCAtMjksMTMgKzI5LDEzIEBACiAKIC8qICBkZXNjcmlwdG9yIGJsb2NrIHVzZWQgZm9yIGNoYWluZWQgZG1hIHRyYW5zZmVycyAqLwogc3RydWN0IHBseF9kbWFfZGVzYyB7Ci0Jdm9sYXRpbGUgdWludDMyX3QgcGNpX3N0YXJ0X2FkZHI7Ci0Jdm9sYXRpbGUgdWludDMyX3QgbG9jYWxfc3RhcnRfYWRkcjsKKwlfX2xlMzIgcGNpX3N0YXJ0X2FkZHI7CisJX19sZTMyIGxvY2FsX3N0YXJ0X2FkZHI7CiAJLyogdHJhbnNmZXJfc2l6ZSBpcyBpbiBieXRlcywgb25seSBmaXJzdCAyMyBiaXRzIG9mIHJlZ2lzdGVyIGFyZSB1c2VkICovCi0Jdm9sYXRpbGUgdWludDMyX3QgdHJhbnNmZXJfc2l6ZTsKKwlfX2xlMzIgdHJhbnNmZXJfc2l6ZTsKIAkvKiBhZGRyZXNzIG9mIG5leHQgZGVzY3JpcHRvciAocXVhZCB3b3JkIGFsaWduZWQpLCBwbHVzIHNvbWUKIAkgKiBhZGRpdGlvbmFsIGJpdHMgKHNlZSBQTFhfRE1BMF9ERVNDUklQVE9SX1JFRykgKi8KLQl2b2xhdGlsZSB1aW50MzJfdCBuZXh0OworCV9fbGUzMiBuZXh0OwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlNGVlMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcG9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAgICBjb21lZGkvZHJpdmVycy9wb2MuYwotICAgIE1pbmktZHJpdmVycyBmb3IgUE9DIChQaWVjZSBvZiBDcmFwKSBib2FyZHMKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDAgRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PgotICAgIENvcHlyaWdodCAoQykgMjAwMSBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKi8KLS8qCi1Ecml2ZXI6IHBvYwotRGVzY3JpcHRpb246IEdlbmVyaWMgZHJpdmVyIGZvciB2ZXJ5IHNpbXBsZSBkZXZpY2VzCi1BdXRob3I6IGRzCi1EZXZpY2VzOiBbS2VpdGhsZXkgTWV0cmFieXRlXSBEQUMtMDIgKGRhYzAyKQotVXBkYXRlZDogU2F0LCAxNiBNYXIgMjAwMiAxNzozNDo0OCAtMDgwMAotU3RhdHVzOiB1bmtub3duCi0KLVRoaXMgZHJpdmVyIGlzIGluZGVuZGVkIHRvIHN1cHBvcnQgdmVyeSBzaW1wbGUgSVNBLWJhc2VkIGRldmljZXMsCi1pbmNsdWRpbmc6Ci0gIGRhYzAyIC0gS2VpdGhsZXkgREFDLTAyIGFuYWxvZyBvdXRwdXQgYm9hcmQKLQotQ29uZmlndXJhdGlvbiBvcHRpb25zOgotICBbMF0gLSBJL08gcG9ydCBiYXNlCi0qLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCi0KLXN0cnVjdCBib2FyZGRlZl9zdHJ1Y3QgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JdW5zaWduZWQgaW50IGlvc2l6ZTsKLQlpbnQgKCpzZXR1cCkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICopOwotCWludCB0eXBlOwotCWludCBuX2NoYW47Ci0JaW50IG5fYml0czsKLQlpbnQgKCp3aW5zbikgKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICosCi0JCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqLCB1bnNpZ25lZCBpbnQgKik7Ci0JaW50ICgqcmluc24pIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAotCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKiwgdW5zaWduZWQgaW50ICopOwotCWludCAoKmluc25iaXRzKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKLQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKiwgdW5zaWduZWQgaW50ICopOwotCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICpyYW5nZTsKLX07Ci0KLXN0cnVjdCBwb2NfcHJpdmF0ZSB7Ci0JdW5zaWduZWQgaW50IGFvX3JlYWRiYWNrWzMyXTsKLX07Ci0KLXN0YXRpYyBpbnQgcmVhZGJhY2tfaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQlzdHJ1Y3QgcG9jX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IGNoYW47Ci0KLQljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JZGF0YVswXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qIERBQy0wMiByZWdpc3RlcnMgKi8KLSNkZWZpbmUgREFDMDJfTFNCKGEpCSgyICogYSkKLSNkZWZpbmUgREFDMDJfTVNCKGEpCSgyICogYSArIDEpCi0KLXN0YXRpYyBpbnQgZGFjMDJfYW9fd2luc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQotewotCXN0cnVjdCBwb2NfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgdGVtcDsKLQlpbnQgY2hhbjsKLQlpbnQgb3V0cHV0OwotCi0JY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gZGF0YVswXTsKLQlvdXRwdXQgPSBkYXRhWzBdOwotI2lmZGVmIHdyb25nCi0JLyogIGNvbnZlcnQgdG8gY29tcGxlbWVudGFyeSBiaW5hcnkgaWYgcmFuZ2UgaXMgYmlwb2xhciAqLwotCWlmICgoQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpICYgMHgyKSA9PSAwKQotCQlvdXRwdXQgPSB+b3V0cHV0OwotI2VuZGlmCi0JdGVtcCA9IChvdXRwdXQgPDwgNCkgJiAweGYwOwotCW91dGIodGVtcCwgZGV2LT5pb2Jhc2UgKyBEQUMwMl9MU0IoY2hhbikpOwotCXRlbXAgPSAob3V0cHV0ID4+IDQpICYgMHhmZjsKLQlvdXRiKHRlbXAsIGRldi0+aW9iYXNlICsgREFDMDJfTVNCKGNoYW4pKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHBvY19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQotewotCWNvbnN0IHN0cnVjdCBib2FyZGRlZl9zdHJ1Y3QgKmJvYXJkID0gY29tZWRpX2JvYXJkKGRldik7Ci0Jc3RydWN0IHBvY19wcml2YXRlICpkZXZwcml2OwotCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwotCWludCByZXQ7Ci0KLQlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgYm9hcmQtPmlvc2l6ZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgMSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWRldnByaXYgPSBjb21lZGlfYWxsb2NfZGV2cHJpdihkZXYsIHNpemVvZigqZGV2cHJpdikpOwotCWlmICghZGV2cHJpdikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSAqLwotCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzBdOwotCXMtPnR5cGUgPSBib2FyZC0+dHlwZTsKLQlzLT5uX2NoYW4gPSBib2FyZC0+bl9jaGFuOwotCXMtPm1heGRhdGEgPSAoMSA8PCBib2FyZC0+bl9iaXRzKSAtIDE7Ci0Jcy0+cmFuZ2VfdGFibGUgPSBib2FyZC0+cmFuZ2U7Ci0Jcy0+aW5zbl93cml0ZSA9IGJvYXJkLT53aW5zbjsKLQlzLT5pbnNuX3JlYWQgPSBib2FyZC0+cmluc247Ci0Jcy0+aW5zbl9iaXRzID0gYm9hcmQtPmluc25iaXRzOwotCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX0FPIHx8IHMtPnR5cGUgPT0gQ09NRURJX1NVQkRfRE8pCi0JCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGJvYXJkZGVmX3N0cnVjdCBib2FyZHNbXSA9IHsKLQl7Ci0JCS5uYW1lCQk9ICJkYWMwMiIsCi0JCS5pb3NpemUJCT0gOCwKLQkJLyogLnNldHVwCT0gZGFjMDJfc2V0dXAsICovCi0JCS50eXBlCQk9IENPTUVESV9TVUJEX0FPLAotCQkubl9jaGFuCQk9IDIsCi0JCS5uX2JpdHMJCT0gMTIsCi0JCS53aW5zbgkJPSBkYWMwMl9hb193aW5zbiwKLQkJLnJpbnNuCQk9IHJlYWRiYWNrX2luc24sCi0JCS5yYW5nZQkJPSAmcmFuZ2VfdW5rbm93biwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIHBvY19kcml2ZXIgPSB7Ci0JLmRyaXZlcl9uYW1lCT0gInBvYyIsCi0JLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKLQkuYXR0YWNoCQk9IHBvY19hdHRhY2gsCi0JLmRldGFjaAkJPSBjb21lZGlfbGVnYWN5X2RldGFjaCwKLQkuYm9hcmRfbmFtZQk9ICZib2FyZHNbMF0ubmFtZSwKLQkubnVtX25hbWVzCT0gQVJSQVlfU0laRShib2FyZHMpLAotCS5vZmZzZXQJCT0gc2l6ZW9mKGJvYXJkc1swXSksCi19OwotbW9kdWxlX2NvbWVkaV9kcml2ZXIocG9jX2RyaXZlcik7Ci0KLU1PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9xdWF0ZWNoX2RhcXBfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9xdWF0ZWNoX2RhcXBfY3MuYwppbmRleCA5NmE0Njk1Li4yOThkYmEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcXVhdGVjaF9kYXFwX2NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3F1YXRlY2hfZGFxcF9jcy5jCkBAIC0yMTQsNyArMjE0LDYgQEAKIAkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9CiAJCQkJICAgIENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfT1ZFUkZMT1c7CiAJCQkJZGV2X3dhcm4oZGV2LT5jbGFzc19kZXYsICJkYXRhIGxvc3RcbiIpOwotCQkJCWRhcXBfYWlfY2FuY2VsKGRldiwgcyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTIzMSw3ICsyMzAsNiBAQAogCQkJaWYgKGRldnByaXYtPmNvdW50ID4gMCkgewogCQkJCWRldnByaXYtPmNvdW50LS07CiAJCQkJaWYgKGRldnByaXYtPmNvdW50ID09IDApIHsKLQkJCQkJZGFxcF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwogCQkJCQlicmVhazsKIAkJCQl9CkBAIC0yNDQsMTMgKzI0MiwxMiBAQAogCQlpZiAobG9vcF9saW1pdCA8PSAwKSB7CiAJCQlkZXZfd2FybihkZXYtPmNsYXNzX2RldiwKIAkJCQkgImxvb3BfbGltaXQgcmVhY2hlZCBpbiBkYXFwX2ludGVycnVwdCgpXG4iKTsKLQkJCWRhcXBfYWlfY2FuY2VsKGRldiwgcyk7CiAJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7CiAJCX0KIAogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKIAotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAl9CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jCmluZGV4IDBmMDI2YWYuLmNkM2ZkZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMKQEAgLTIzNywyMCArMjM3LDYgQEAKIC8qIFRoZSBib2FyZCBzdXBwb3J0IGEgY2hhbm5lbCBsaXN0IHVwIHRvIHRoZSBGSUZPIGxlbmd0aCAoMUsgb3IgOEspICovCiAjZGVmaW5lIFJURF9NQVhfQ0hBTkxJU1QJMTI4CS8qIG1heCBjaGFubmVsIGxpc3QgdGhhdCB3ZSBhbGxvdyAqLwogCi0vKiB0dW5pbmcgZm9yIGFpL2FvIGluc3RydWN0aW9uIGRvbmUgcG9sbGluZyAqLwotI2lmZGVmIEZBU1RfU1BJTgotI2RlZmluZSBXQUlUX1FVSUVUTFkJCS8qIGFzIG5vdGhpbmcsIHNwaW4gb24gZG9uZSBiaXQgKi8KLSNkZWZpbmUgUlREX0FEQ19USU1FT1VUCTY2MDAwCS8qIDIgbXNlYyBhdCAzM21oeiBidXMgcmF0ZSAqLwotI2RlZmluZSBSVERfREFDX1RJTUVPVVQJNjYwMDAKLSNkZWZpbmUgUlREX0RNQV9USU1FT1VUCTMzMDAwCS8qIDEgbXNlYyAqLwotI2Vsc2UKLS8qIGJ5IGRlbGF5aW5nLCBwb3dlciBhbmQgZWxlY3RyaWNhbCBub2lzZSBhcmUgcmVkdWNlZCBzb21ld2hhdCAqLwotI2RlZmluZSBXQUlUX1FVSUVUTFkJdWRlbGF5KDEpCi0jZGVmaW5lIFJURF9BRENfVElNRU9VVAkyMDAwCS8qIGluIHVzZWMgKi8KLSNkZWZpbmUgUlREX0RBQ19USU1FT1VUCTIwMDAJLyogaW4gdXNlYyAqLwotI2RlZmluZSBSVERfRE1BX1RJTUVPVVQJMTAwMAkvKiBpbiB1c2VjICovCi0jZW5kaWYKLQogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIEJvYXJkIHNwZWNpZmljIHN0dWZmCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTU2MiwyMSArNTQ4LDI3IEBACiAJcmV0dXJuIGZpZm9fc2l6ZTsKIH0KIAotLyoKLSAgImluc3RydWN0aW9ucyIgcmVhZC93cml0ZSBkYXRhIGluICJvbmUtc2hvdCIgb3IgInNvZnR3YXJlLXRyaWdnZXJlZCIKLSAgbW9kZSAoc2ltcGxlc3QgY2FzZSkuCi0gIFRoaXMgZG9lc24ndCB1c2UgaW50ZXJydXB0cy4KK3N0YXRpYyBpbnQgcnRkX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJc3RydWN0IHJ0ZF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBzdGF0dXM7CiAKLSAgTm90ZSwgd2UgZG9uJ3QgZG8gYW55IHNldHRsaW5nIGRlbGF5cy4gIFVzZSBhIGluc3RydWN0aW9uIGxpc3QgdG8KLSAgc2VsZWN0LCBkZWxheSwgdGhlbiByZWFkLgotICovCisJc3RhdHVzID0gcmVhZGwoZGV2cHJpdi0+bGFzMCArIExBUzBfQURDKTsKKwlpZiAoc3RhdHVzICYgRlNfQURDX05PVF9FTVBUWSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBydGRfYWlfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCiAJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IHJ0ZF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBuLCBpaTsKLQlpbnQgc3RhdDsKKwlpbnQgcmV0OworCWludCBuOwogCiAJLyogY2xlYXIgYW55IG9sZCBmaWZvIGRhdGEgKi8KIAl3cml0ZWwoMCwgZGV2cHJpdi0+bGFzMCArIExBUzBfQURDX0ZJRk9fQ0xFQVIpOwpAQCAtNTkzLDE0ICs1ODUsOSBAQAogCQkvKiB0cmlnZ2VyIGNvbnZlcnNpb24gKi8KIAkJd3JpdGV3KDAsIGRldnByaXYtPmxhczAgKyBMQVMwX0FEQyk7CiAKLQkJZm9yIChpaSA9IDA7IGlpIDwgUlREX0FEQ19USU1FT1VUOyArK2lpKSB7Ci0JCQlzdGF0ID0gcmVhZGwoZGV2cHJpdi0+bGFzMCArIExBUzBfQURDKTsKLQkJCWlmIChzdGF0ICYgRlNfQURDX05PVF9FTVBUWSkJLyogMSAtPiBub3QgZW1wdHkgKi8KLQkJCQlicmVhazsKLQkJCVdBSVRfUVVJRVRMWTsKLQkJfQotCQlpZiAoaWkgPj0gUlREX0FEQ19USU1FT1VUKQotCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcnRkX2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCS8qIHJlYWQgZGF0YSAqLwogCQlkID0gcmVhZHcoZGV2cHJpdi0+bGFzMSArIExBUzFfQURDX0ZJRk8pOwpAQCAtMTExNiw5ICsxMTAzLDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gIE91dHB1dCBvbmUgKG9yIG1vcmUpIGFuYWxvZyB2YWx1ZXMgdG8gYSBzaW5nbGUgcG9ydCBhcyBmYXN0IGFzIHBvc3NpYmxlLgotKi8KK3N0YXRpYyBpbnQgcnRkX2FvX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJc3RydWN0IHJ0ZF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IGJpdCA9IChjaGFuID09IDApID8gRlNfREFDMV9OT1RfRU1QVFkgOiBGU19EQUMyX05PVF9FTVBUWTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gcmVhZGwoZGV2cHJpdi0+bGFzMCArIExBUzBfQURDKTsKKwlpZiAoc3RhdHVzICYgYml0KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IHJ0ZF9hb193aW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKIAkJCXVuc2lnbmVkIGludCAqZGF0YSkKQEAgLTExMjcsNiArMTEyNyw3IEBACiAJaW50IGk7CiAJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAlpbnQgcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CisJaW50IHJldDsKIAogCS8qIENvbmZpZ3VyZSB0aGUgb3V0cHV0IHJhbmdlICh0YWJsZSBpbmRleCBtYXRjaGVzIHRoZSByYW5nZSB2YWx1ZXMpICovCiAJd3JpdGV3KHJhbmdlICYgNywgZGV2cHJpdi0+bGFzMCArCkBAIC0xMTM2LDggKzExMzcsNiBAQAogCSAqIHZlcnkgdXNlZnVsLCBidXQgdGhhdCdzIGhvdyB0aGUgaW50ZXJmYWNlIGlzIGRlZmluZWQuICovCiAJZm9yIChpID0gMDsgaSA8IGluc24tPm47ICsraSkgewogCQlpbnQgdmFsID0gZGF0YVtpXSA8PCAzOwotCQlpbnQgc3RhdCA9IDA7CS8qIGluaXRpYWxpemUgdG8gYXZvaWQgYm9ndXMgd2FybmluZyAqLwotCQlpbnQgaWk7CiAKIAkJLyogVkVSSUZZOiBjb21lZGkgcmFuZ2UgYW5kIG9mZnNldCBjb252ZXJzaW9ucyAqLwogCkBAIC0xMTU3LDE2ICsxMTU2LDkgQEAKIAogCQlkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXSA9IGRhdGFbaV07CiAKLQkJZm9yIChpaSA9IDA7IGlpIDwgUlREX0RBQ19USU1FT1VUOyArK2lpKSB7Ci0JCQlzdGF0ID0gcmVhZGwoZGV2cHJpdi0+bGFzMCArIExBUzBfQURDKTsKLQkJCS8qIDEgLT4gbm90IGVtcHR5ICovCi0JCQlpZiAoc3RhdCAmICgoMCA9PSBjaGFuKSA/IEZTX0RBQzFfTk9UX0VNUFRZIDoKLQkJCQkgICAgRlNfREFDMl9OT1RfRU1QVFkpKQotCQkJCWJyZWFrOwotCQkJV0FJVF9RVUlFVExZOwotCQl9Ci0JCWlmIChpaSA+PSBSVERfREFDX1RJTUVPVVQpCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBydGRfYW9fZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfQogCiAJLyogcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyByZWFkL3dyaXR0ZW4gKi8KQEAgLTEzODIsOCArMTM3NCw2IEBACiAJaWYgKGRldi0+aXJxKQogCQl3cml0ZWwoSUNTX1BJRSB8IElDU19QTElFLCBkZXZwcml2LT5sY2ZnICsgUExYX0lOVFJDU19SRUcpOwogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlcyBhdHRhY2hlZFxuIiwgZGV2LT5ib2FyZF9uYW1lKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRpODAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRpODAwLmMKaW5kZXggZTFmMzY3MS4uYmQ0NDdiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0aTgwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGk4MDAuYwpAQCAtODMsOCArODMsNiBAQAogCiAjZGVmaW5lIFJUSTgwMF9JT1NJWkUJCTB4MTAKIAotI2RlZmluZSBSVEk4MDBfQUlfVElNRU9VVAkxMDAKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX3J0aTgwMF9haV8xMF9iaXBvbGFyID0gewogCTQsIHsKIAkJQklQX1JBTkdFKDEwKSwKQEAgLTE0NSwyMyArMTQzLDIxIEBACiAJdW5zaWduZWQgY2hhciBtdXhnYWluX2JpdHM7CiB9OwogCi1zdGF0aWMgaW50IHJ0aTgwMF9haV93YWl0X2Zvcl9jb252ZXJzaW9uKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSBpbnQgdGltZW91dCkKK3N0YXRpYyBpbnQgcnRpODAwX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSB1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7CiAJdW5zaWduZWQgY2hhciBzdGF0dXM7Ci0JaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7Ci0JCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIFJUSTgwMF9DU1IpOwotCQlpZiAoc3RhdHVzICYgUlRJODAwX0NTUl9PVkVSUlVOKSB7Ci0JCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUlRJODAwX0NMUkZMQUdTKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0JCWlmIChzdGF0dXMgJiBSVEk4MDBfQ1NSX0RPTkUpCi0JCQlyZXR1cm4gMDsKLQkJdWRlbGF5KDEpOworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIFJUSTgwMF9DU1IpOworCWlmIChzdGF0dXMgJiBSVEk4MDBfQ1NSX09WRVJSVU4pIHsKKwkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFJUSTgwMF9DTFJGTEFHUyk7CisJCXJldHVybiAtRU9WRVJGTE9XOwogCX0KLQlyZXR1cm4gLUVUSU1FOworCWlmIChzdGF0dXMgJiBSVEk4MDBfQ1NSX0RPTkUpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7CiB9CiAKIHN0YXRpYyBpbnQgcnRpODAwX2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtMTk4LDcgKzE5NCw4IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CiAJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBSVEk4MDBfQ09OVkVSVCk7Ci0JCXJldCA9IHJ0aTgwMF9haV93YWl0X2Zvcl9jb252ZXJzaW9uKGRldiwgUlRJODAwX0FJX1RJTUVPVVQpOworCisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcnRpODAwX2FpX2VvYywgMCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRpODAyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRpODAyLmMKaW5kZXggYTNmYTJhNC4uNjA1YTMxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0aTgwMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGk4MDIuYwpAQCAtMSw0NSArMSw0NCBAQAogLyoKLSAgIGNvbWVkaS9kcml2ZXJzL3J0aTgwMi5jCi0gICBIYXJkd2FyZSBkcml2ZXIgZm9yIEFuYWxvZyBEZXZpY2VzIFJUSS04MDIgYm9hcmQKLQotICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQotICAgQ29weXJpZ2h0IChDKSAxOTk5IEFuZGVycyBCbG9tZGVsbCA8YW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlPgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogcnRpODAyLmMKKyAqIENvbWVkaSBkcml2ZXIgZm9yIEFuYWxvZyBEZXZpY2VzIFJUSS04MDIgYm9hcmQKKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgQW5kZXJzIEJsb21kZWxsIDxhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2U+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCi0vKgotRHJpdmVyOiBydGk4MDIKLURlc2NyaXB0aW9uOiBBbmFsb2cgRGV2aWNlcyBSVEktODAyCi1BdXRob3I6IEFuZGVycyBCbG9tZGVsbCA8YW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlPgotRGV2aWNlczogW0FuYWxvZyBEZXZpY2VzXSBSVEktODAyIChydGk4MDIpCi1TdGF0dXM6IHdvcmtzCiAKLUNvbmZpZ3VyYXRpb24gT3B0aW9uczoKLSAgICBbMF0gLSBpL28gYmFzZQotICAgIFsxXSAtIHVudXNlZAotICAgIFsyXSAtIGRhYyMwICAwPXR3bydzIGNvbXAsIDE9c3RyYWlnaHQKLSAgICBbM10gLSBkYWMjMCAgMD1iaXBvbGFyLCAxPXVuaXBvbGFyCi0gICAgWzRdIC0gZGFjIzEgLi4uCi0gICAgLi4uCi0gICAgWzE3XSAtIGRhYyM3IC4uLgotKi8KKy8qCisgKiBEcml2ZXI6IHJ0aTgwMgorICogRGVzY3JpcHRpb246IEFuYWxvZyBEZXZpY2VzIFJUSS04MDIKKyAqIEF1dGhvcjogQW5kZXJzIEJsb21kZWxsIDxhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2U+CisgKiBEZXZpY2VzOiAoQW5hbG9nIERldmljZXMpIFJUSS04MDIgW3J0aTgwMl0KKyAqIFN0YXR1czogd29ya3MKKyAqCisgKiBDb25maWd1cmF0aW9uIE9wdGlvbnM6CisgKiAgIFswXSAtIGkvbyBiYXNlCisgKiAgIFsxXSAtIHVudXNlZAorICogICBbMiw0LDYsOCwxMCwxMiwxNCwxNl0gLSBkYWMjWzAtN10gIDA9dHdvJ3MgY29tcCwgMT1zdHJhaWdodAorICogICBbMyw1LDcsOSwxMSwxMywxNSwxN10gLSBkYWMjWzAtN10gIDA9Ymlwb2xhciwgMT11bmlwb2xhcgorICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAotI2RlZmluZSBSVEk4MDJfU0laRSA0Ci0KLSNkZWZpbmUgUlRJODAyX1NFTEVDVCAwCi0jZGVmaW5lIFJUSTgwMl9EQVRBTE9XIDEKLSNkZWZpbmUgUlRJODAyX0RBVEFISUdIIDIKKy8qCisgKiBSZWdpc3RlciBJL08gbWFwCisgKi8KKyNkZWZpbmUgUlRJODAyX1NFTEVDVAkJMHgwMAorI2RlZmluZSBSVEk4MDJfREFUQUxPVwkJMHgwMQorI2RlZmluZSBSVEk4MDJfREFUQUhJR0gJCTB4MDIKIAogc3RydWN0IHJ0aTgwMl9wcml2YXRlIHsKIAllbnVtIHsKQEAgLTUxLDM0ICs1MCw0NSBAQAogCiBzdGF0aWMgaW50IHJ0aTgwMl9hb19pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBydGk4MDJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKLQkJZGF0YVtpXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW0NSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpXTsKKwkJZGF0YVtpXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dOwogCi0JcmV0dXJuIGk7CisJcmV0dXJuIGluc24tPm47CiB9CiAKIHN0YXRpYyBpbnQgcnRpODAyX2FvX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKKwkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBydGk4MDJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgaSwgZDsKLQlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgaTsKKworCW91dGIoY2hhbiwgZGV2LT5pb2Jhc2UgKyBSVEk4MDJfU0VMRUNUKTsKIAogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKLQkJZCA9IGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gZGF0YVtpXTsKKwkJdmFsID0gZGF0YVtpXTsKKworCQlkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXSA9IHZhbDsKKworCQkvKiBtdW5nZSBvZmZzZXQgYmluYXJ5IHRvIHR3bydzIGNvbXBsZW1lbnQgaWYgbmVlZGVkICovCiAJCWlmIChkZXZwcml2LT5kYWNfY29kaW5nW2NoYW5dID09IGRhY18yY29tcCkKLQkJCWQgXj0gMHg4MDA7Ci0JCW91dGIoY2hhbiwgZGV2LT5pb2Jhc2UgKyBSVEk4MDJfU0VMRUNUKTsKLQkJb3V0YihkICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBSVEk4MDJfREFUQUxPVyk7Ci0JCW91dGIoZCA+PiA4LCBkZXYtPmlvYmFzZSArIFJUSTgwMl9EQVRBSElHSCk7CisJCQl2YWwgPSBjb21lZGlfb2Zmc2V0X211bmdlKHMsIHZhbCk7CisKKwkJb3V0Yih2YWwgJiAweGZmLCBkZXYtPmlvYmFzZSArIFJUSTgwMl9EQVRBTE9XKTsKKwkJb3V0YigodmFsID4+IDgpICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBSVEk4MDJfREFUQUhJR0gpOwogCX0KLQlyZXR1cm4gaTsKKworCXJldHVybiBpbnNuLT5uOwogfQogCiBzdGF0aWMgaW50IHJ0aTgwMl9hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQpAQCAtODgsNyArOTgsNyBAQAogCWludCBpOwogCWludCByZXQ7CiAKLQlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgUlRJODAyX1NJWkUpOworCXJldCA9IGNvbWVkaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIGl0LT5vcHRpb25zWzBdLCAweDA0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC0xMDAsMjIgKzExMCwyMSBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwkvKiBBbmFsb2cgT3V0cHV0IHN1YmRldmljZSAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzBdOwotCS8qIGFvIHN1YmRldmljZSAqLwotCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BTzsKLQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEU7Ci0Jcy0+bWF4ZGF0YSA9IDB4ZmZmOwotCXMtPm5fY2hhbiA9IDg7Ci0Jcy0+aW5zbl9yZWFkID0gcnRpODAyX2FvX2luc25fcmVhZDsKLQlzLT5pbnNuX3dyaXRlID0gcnRpODAyX2FvX2luc25fd3JpdGU7CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9BTzsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfV1JJVEFCTEU7CisJcy0+bWF4ZGF0YQk9IDB4ZmZmOworCXMtPm5fY2hhbgk9IDg7CisJcy0+aW5zbl9yZWFkCT0gcnRpODAyX2FvX2luc25fcmVhZDsKKwlzLT5pbnNuX3dyaXRlCT0gcnRpODAyX2FvX2luc25fd3JpdGU7CiAJcy0+cmFuZ2VfdGFibGVfbGlzdCA9IGRldnByaXYtPnJhbmdlX3R5cGVfbGlzdDsKIAogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKIAkJZGV2cHJpdi0+ZGFjX2NvZGluZ1tpXSA9IChpdC0+b3B0aW9uc1szICsgMiAqIGldKQotCQkgICAgPyAoZGFjX3N0cmFpZ2h0KQotCQkgICAgOiAoZGFjXzJjb21wKTsKKwkJCT8gKGRhY19zdHJhaWdodCkgOiAoZGFjXzJjb21wKTsKIAkJZGV2cHJpdi0+cmFuZ2VfdHlwZV9saXN0W2ldID0gKGl0LT5vcHRpb25zWzIgKyAyICogaV0pCi0JCSAgICA/ICZyYW5nZV91bmlwb2xhcjEwIDogJnJhbmdlX2JpcG9sYXIxMDsKKwkJCT8gJnJhbmdlX3VuaXBvbGFyMTAgOiAmcmFuZ2VfYmlwb2xhcjEwOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTMwLDUgKzEzOSw1IEBACiBtb2R1bGVfY29tZWRpX2RyaXZlcihydGk4MDJfZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgZHJpdmVyIGZvciBBbmFsb2cgRGV2aWNlcyBSVEktODAyIGJvYXJkIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczUyNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M1MjYuYwppbmRleCA5OTUwZjU5Li44NWQyYjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczUyNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNTI2LmMKQEAgLTQyMCwxNSArNDIwLDI4IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdGljIGludCBzNTI2X2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIFJFR19JU1IpOworCWlmIChzdGF0dXMgJiBJU1JfQURDX0RPTkUpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgczUyNl9haV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgczUyNl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JaW50IG4sIGk7CisJaW50IG47CiAJdW5zaWduZWQgc2hvcnQgdmFsdWU7CiAJdW5zaWduZWQgaW50IGQ7Ci0JdW5zaWduZWQgaW50IHN0YXR1czsKKwlpbnQgcmV0OwogCiAJLyogU2V0IGNvbmZpZ3VyZWQgZGVsYXksIGVuYWJsZSBjaGFubmVsIGZvciB0aGlzIGNoYW5uZWwgb25seSwKIAkgKiBzZWxlY3QgIkFEQyByZWFkIiBjaGFubmVsLCBzZXQgIkFEQyBzdGFydCIgYml0LiAqLwpAQCAtNDQwLDE3ICs0NTMsMTIgQEAKIAkJLyogdHJpZ2dlciBjb252ZXJzaW9uICovCiAJCW91dHcodmFsdWUsIGRldi0+aW9iYXNlICsgUkVHX0FEQyk7CiAKLSNkZWZpbmUgVElNRU9VVCAxMDAKIAkJLyogd2FpdCBmb3IgY29udmVyc2lvbiB0byBlbmQgKi8KLQkJZm9yIChpID0gMDsgaSA8IFRJTUVPVVQ7IGkrKykgewotCQkJc3RhdHVzID0gaW53KGRldi0+aW9iYXNlICsgUkVHX0lTUik7Ci0JCQlpZiAoc3RhdHVzICYgSVNSX0FEQ19ET05FKSB7Ci0JCQkJb3V0dyhJU1JfQURDX0RPTkUsIGRldi0+aW9iYXNlICsgUkVHX0lTUik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGkgPT0gVElNRU9VVCkKLQkJCXJldHVybiAtRVRJTUVET1VUOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHM1MjZfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJb3V0dyhJU1JfQURDX0RPTkUsIGRldi0+aW9iYXNlICsgUkVHX0lTUik7CiAKIAkJLyogcmVhZCBkYXRhICovCiAJCWQgPSBpbncoZGV2LT5pb2Jhc2UgKyBSRUdfQUREKTsKQEAgLTYwNCw3ICs2MTIsNyBAQAogCXMtPmluc25fYml0cyA9IHM1MjZfZGlvX2luc25fYml0czsKIAlzLT5pbnNuX2NvbmZpZyA9IHM1MjZfZGlvX2luc25fY29uZmlnOwogCi0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY29tZWRpX2RyaXZlciBzNTI2X2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5jCmluZGV4IDE5ZGExZGIuLjk1ZmFkZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuYwpAQCAtMTA2LDE2ICsxMDYsMTYgQEAKIHN0cnVjdCBzNjI2X2VuY19pbmZvIHsKIAkvKiBQb2ludGVycyB0byBmdW5jdGlvbnMgdGhhdCBkaWZmZXIgZm9yIEEgYW5kIEIgY291bnRlcnM6ICovCiAJLyogUmV0dXJuIGNsb2NrIGVuYWJsZS4gKi8KLQl1aW50MTZfdCgqZ2V0X2VuYWJsZSkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwl1aW50MTZfdCAoKmdldF9lbmFibGUpKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgczYyNl9lbmNfaW5mbyAqayk7CiAJLyogUmV0dXJuIGludGVycnVwdCBzb3VyY2UuICovCi0JdWludDE2X3QoKmdldF9pbnRfc3JjKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCXVpbnQxNl90ICgqZ2V0X2ludF9zcmMpKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IHM2MjZfZW5jX2luZm8gKmspOwogCS8qIFJldHVybiBwcmVsb2FkIHRyaWdnZXIgc291cmNlLiAqLwotCXVpbnQxNl90KCpnZXRfbG9hZF90cmlnKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCXVpbnQxNl90ICgqZ2V0X2xvYWRfdHJpZykoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkgY29uc3Qgc3RydWN0IHM2MjZfZW5jX2luZm8gKmspOwogCS8qIFJldHVybiBzdGFuZGFyZGl6ZWQgb3BlcmF0aW5nIG1vZGUuICovCi0JdWludDE2X3QoKmdldF9tb2RlKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCXVpbnQxNl90ICgqZ2V0X21vZGUpKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgY29uc3Qgc3RydWN0IHM2MjZfZW5jX2luZm8gKmspOwogCS8qIEdlbmVyYXRlIHNvZnQgaW5kZXggc3Ryb2JlLiAqLwogCXZvaWQgKCpwdWxzZV9pbmRleCkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTIwOSw2ICsyMDksOCBAQAogc3RhdGljIHZvaWQgczYyNl9kZWJpX3RyYW5zZmVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHM2MjZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlzdGF0aWMgY29uc3QgaW50IHRpbWVvdXQgPSAxMDAwMDsKKwlpbnQgaTsKIAogCS8qIEluaXRpYXRlIHVwbG9hZCBvZiBzaGFkb3cgUkFNIHRvIERFQkkgY29udHJvbCByZWdpc3RlciAqLwogCXM2MjZfbWNfZW5hYmxlKGRldiwgUzYyNl9NQzJfVVBMRF9ERUJJLCBTNjI2X1BfTUMyKTsKQEAgLTIxNywxMiArMjE5LDIzIEBACiAJICogV2FpdCBmb3IgY29tcGxldGlvbiBvZiB1cGxvYWQgZnJvbSBzaGFkb3cgUkFNIHRvCiAJICogREVCSSBjb250cm9sIHJlZ2lzdGVyLgogCSAqLwotCXdoaWxlICghczYyNl9tY190ZXN0KGRldiwgUzYyNl9NQzJfVVBMRF9ERUJJLCBTNjI2X1BfTUMyKSkKLQkJOworCWZvciAoaSA9IDA7IGkgPCB0aW1lb3V0OyBpKyspIHsKKwkJaWYgKHM2MjZfbWNfdGVzdChkZXYsIFM2MjZfTUMyX1VQTERfREVCSSwgUzYyNl9QX01DMikpCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCX0KKwlpZiAoaSA9PSB0aW1lb3V0KQorCQljb21lZGlfZXJyb3IoZGV2LAorCQkJIlRpbWVvdXQgd2hpbGUgdXBsb2FkaW5nIHRvIERFQkkgY29udHJvbCByZWdpc3Rlci4iKTsKIAogCS8qIFdhaXQgdW50aWwgREVCSSB0cmFuc2ZlciBpcyBkb25lICovCi0Jd2hpbGUgKHJlYWRsKGRldnByaXYtPm1taW8gKyBTNjI2X1BfUFNSKSAmIFM2MjZfUFNSX0RFQklfUykKLQkJOworCWZvciAoaSA9IDA7IGkgPCB0aW1lb3V0OyBpKyspIHsKKwkJaWYgKCEocmVhZGwoZGV2cHJpdi0+bW1pbyArIFM2MjZfUF9QU1IpICYgUzYyNl9QU1JfREVCSV9TKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfQorCWlmIChpID09IHRpbWVvdXQpCisJCWNvbWVkaV9lcnJvcihkZXYsICJERUJJIHRyYW5zZmVyIHRpbWVvdXQuIik7CiB9CiAKIC8qCkBAIC0zNTEsMTQgKzM2NCw1NyBAQAogCTB4NDAsIDB4NDEsIDB4NDIsIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NjAsIDB4NjEsIDB4NjIsIDB4NjMKIH07CiAKK2VudW0geworCXM2MjZfc2VuZF9kYWNfd2FpdF9ub3RfbWMxX2Eyb3V0LAorCXM2MjZfc2VuZF9kYWNfd2FpdF9zc3JfYWYyX291dCwKKwlzNjI2X3NlbmRfZGFjX3dhaXRfZmJfYnVmZmVyMl9tc2JfMDAsCisJczYyNl9zZW5kX2RhY193YWl0X2ZiX2J1ZmZlcjJfbXNiX2ZmCit9OworCitzdGF0aWMgaW50IHM2MjZfc2VuZF9kYWNfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgczYyNl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzd2l0Y2ggKGNvbnRleHQpIHsKKwljYXNlIHM2MjZfc2VuZF9kYWNfd2FpdF9ub3RfbWMxX2Eyb3V0OgorCQlzdGF0dXMgPSByZWFkbChkZXZwcml2LT5tbWlvICsgUzYyNl9QX01DMSk7CisJCWlmICghKHN0YXR1cyAmIFM2MjZfTUMxX0EyT1VUKSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIHM2MjZfc2VuZF9kYWNfd2FpdF9zc3JfYWYyX291dDoKKwkJc3RhdHVzID0gcmVhZGwoZGV2cHJpdi0+bW1pbyArIFM2MjZfUF9TU1IpOworCQlpZiAoc3RhdHVzICYgUzYyNl9TU1JfQUYyX09VVCkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIHM2MjZfc2VuZF9kYWNfd2FpdF9mYl9idWZmZXIyX21zYl8wMDoKKwkJc3RhdHVzID0gcmVhZGwoZGV2cHJpdi0+bW1pbyArIFM2MjZfUF9GQl9CVUZGRVIyKTsKKwkJaWYgKCEoc3RhdHVzICYgMHhmZjAwMDAwMCkpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBzNjI2X3NlbmRfZGFjX3dhaXRfZmJfYnVmZmVyMl9tc2JfZmY6CisJCXN0YXR1cyA9IHJlYWRsKGRldnByaXYtPm1taW8gKyBTNjI2X1BfRkJfQlVGRkVSMik7CisJCWlmIChzdGF0dXMgJiAweGZmMDAwMDAwKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gLUVCVVNZOworfQorCiAvKgogICogUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb246IFRyYW5zbWl0IHNlcmlhbCBkYXRhIHRvIERBQyB2aWEgQXVkaW8KICAqIGNoYW5uZWwgMi4gIEFzc3VtZXM6ICgxKSBUU0wyIHNsb3QgcmVjb3JkcyBpbml0aWFsaXplZCwgYW5kICgyKQogICogZGFjcG9sIGNvbnRhaW5zIHZhbGlkIHRhcmdldCBpbWFnZS4KICAqLwotc3RhdGljIHZvaWQgczYyNl9zZW5kX2RhYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1aW50MzJfdCB2YWwpCitzdGF0aWMgaW50IHM2MjZfc2VuZF9kYWMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdWludDMyX3QgdmFsKQogewogCXN0cnVjdCBzNjI2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJaW50IHJldDsKIAogCS8qIFNUQVJUIFRIRSBTRVJJQUwgQ0xPQ0sgUlVOTklORyAtLS0tLS0tLS0tLS0tICovCiAKQEAgLTQwNCw4ICs0NjAsMTIgQEAKIAkgKiBEb25lIGJ5IHBvbGxpbmcgdGhlIERNQUMgZW5hYmxlIGZsYWc7IHRoaXMgZmxhZyBpcyBhdXRvbWF0aWNhbGx5CiAJICogY2xlYXJlZCB3aGVuIHRoZSB0cmFuc2ZlciBoYXMgZmluaXNoZWQuCiAJICovCi0Jd2hpbGUgKHJlYWRsKGRldnByaXYtPm1taW8gKyBTNjI2X1BfTUMxKSAmIFM2MjZfTUMxX0EyT1VUKQotCQk7CisJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBOVUxMLCBOVUxMLCBzNjI2X3NlbmRfZGFjX2VvYywKKwkJCSAgICAgczYyNl9zZW5kX2RhY193YWl0X25vdF9tYzFfYTJvdXQpOworCWlmIChyZXQpIHsKKwkJY29tZWRpX2Vycm9yKGRldiwgIkRNQSB0cmFuc2ZlciB0aW1lb3V0LiIpOworCQlyZXR1cm4gcmV0OworCX0KIAogCS8qIFNUQVJUIFRIRSBPVVRQVVQgU1RSRUFNIFRPIFRIRSBUQVJHRVQgREFDIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTQyNSw4ICs0ODUsMTIgQEAKIAkgKiBmaW5pc2hlZCB0cmFuc2ZlcnJpbmcgdGhlIERBQydzIGRhdGEgRFdPUkQgZnJvbSB0aGUgb3V0cHV0IEZJRk8KIAkgKiB0byB0aGUgb3V0cHV0IGJ1ZmZlciByZWdpc3Rlci4KIAkgKi8KLQl3aGlsZSAoIShyZWFkbChkZXZwcml2LT5tbWlvICsgUzYyNl9QX1NTUikgJiBTNjI2X1NTUl9BRjJfT1VUKSkKLQkJOworCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgTlVMTCwgTlVMTCwgczYyNl9zZW5kX2RhY19lb2MsCisJCQkgICAgIHM2MjZfc2VuZF9kYWNfd2FpdF9zc3JfYWYyX291dCk7CisJaWYgKHJldCkgeworCQljb21lZGlfZXJyb3IoZGV2LCAiVFNMIHRpbWVvdXQgd2FpdGluZyBmb3Igc2xvdCAxIHRvIGV4ZWN1dGUuIik7CisJCXJldHVybiByZXQ7CisJfQogCiAJLyoKIAkgKiBTZXQgdXAgdG8gdHJhcCBleGVjdXRpb24gYXQgc2xvdCAwIHdoZW4gdGhlIFRTTCBzZXF1ZW5jZXIgY3ljbGVzCkBAIC00NjYsOCArNTMwLDEzIEBACiAJCSAqIGZyb20gMHhGRiB0byAweDAwLCB3aGljaCBzbG90IDAgY2F1c2VzIHRvIGhhcHBlbiBieSBzaGlmdGluZwogCQkgKiBvdXQvaW4gb24gU0QyIHRoZSAweDAwIHRoYXQgaXMgYWx3YXlzIHJlZmVyZW5jZWQgYnkgc2xvdCA1LgogCQkgKi8KLQkJd2hpbGUgKHJlYWRsKGRldnByaXYtPm1taW8gKyBTNjI2X1BfRkJfQlVGRkVSMikgJiAweGZmMDAwMDAwKQotCQkJOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIE5VTEwsIE5VTEwsIHM2MjZfc2VuZF9kYWNfZW9jLAorCQkJCSAgICAgczYyNl9zZW5kX2RhY193YWl0X2ZiX2J1ZmZlcjJfbXNiXzAwKTsKKwkJaWYgKHJldCkgeworCQkJY29tZWRpX2Vycm9yKGRldiwKKwkJCQkiVFNMIHRpbWVvdXQgd2FpdGluZyBmb3Igc2xvdCAwIHRvIGV4ZWN1dGUuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfQogCS8qCiAJICogRWl0aGVyICgxKSB3ZSB3ZXJlIHRvbyBsYXRlIHNldHRpbmcgdGhlIHNsb3QgMCB0cmFwOyB0aGUgVFNMCkBAIC00ODYsMTQgKzU1NSwxOSBAQAogCSAqIHRoZSBuZXh0IERBQyB3cml0ZS4gIFRoaXMgaXMgZGV0ZWN0ZWQgd2hlbiBGQl9CVUZGRVIyIE1TQiBjaGFuZ2VzCiAJICogZnJvbSAweDAwIHRvIDB4RkYuCiAJICovCi0Jd2hpbGUgKCEocmVhZGwoZGV2cHJpdi0+bW1pbyArIFM2MjZfUF9GQl9CVUZGRVIyKSAmIDB4ZmYwMDAwMDApKQotCQk7CisJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBOVUxMLCBOVUxMLCBzNjI2X3NlbmRfZGFjX2VvYywKKwkJCSAgICAgczYyNl9zZW5kX2RhY193YWl0X2ZiX2J1ZmZlcjJfbXNiX2ZmKTsKKwlpZiAocmV0KSB7CisJCWNvbWVkaV9lcnJvcihkZXYsICJUU0wgdGltZW91dCB3YWl0aW5nIGZvciBzbG90IDAgdG8gZXhlY3V0ZS4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbjogV3JpdGUgc2V0cG9pbnQgdG8gYW4gYXBwbGljYXRpb24gREFDIGNoYW5uZWwuCiAgKi8KLXN0YXRpYyB2b2lkIHM2MjZfc2V0X2RhYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1aW50MTZfdCBjaGFuLAorc3RhdGljIGludCBzNjI2X3NldF9kYWMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdWludDE2X3QgY2hhbiwKIAkJCSBpbnQxNl90IGRhY2RhdGEpCiB7CiAJc3RydWN0IHM2MjZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKQEAgLTU1NiwxMCArNjMwLDEwIEBACiAJdmFsIHw9ICgodWludDMyX3QpKGNoYW4gJiAxKSA8PCAxNSk7CS8qIEFkZHJlc3MgdGhlIERBQyBjaGFubmVsCiAJCQkJCQkgKiB3aXRoaW4gdGhlIGRldmljZS4gKi8KIAl2YWwgfD0gKHVpbnQzMl90KWRhY2RhdGE7CS8qIEluY2x1ZGUgREFDIHNldHBvaW50IGRhdGEuICovCi0JczYyNl9zZW5kX2RhYyhkZXYsIHZhbCk7CisJcmV0dXJuIHM2MjZfc2VuZF9kYWMoZGV2LCB2YWwpOwogfQogCi1zdGF0aWMgdm9pZCBzNjI2X3dyaXRlX3RyaW1fZGFjKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVpbnQ4X3QgbG9naWNhbF9jaGFuLAorc3RhdGljIGludCBzNjI2X3dyaXRlX3RyaW1fZGFjKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVpbnQ4X3QgbG9naWNhbF9jaGFuLAogCQkJCXVpbnQ4X3QgZGFjX2RhdGEpCiB7CiAJc3RydWN0IHM2MjZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKQEAgLTYwNiwxNyArNjgwLDIyIEBACiAJICogQWRkcmVzcyB0aGUgREFDIGNoYW5uZWwgd2l0aGluIHRoZSB0cmltZGFjIGRldmljZS4KIAkgKiBJbmNsdWRlIERBQyBzZXRwb2ludCBkYXRhLgogCSAqLwotCXM2MjZfc2VuZF9kYWMoZGV2LCAoY2hhbiA8PCA4KSB8IGRhY19kYXRhKTsKKwlyZXR1cm4gczYyNl9zZW5kX2RhYyhkZXYsIChjaGFuIDw8IDgpIHwgZGFjX2RhdGEpOwogfQogCi1zdGF0aWMgdm9pZCBzNjI2X2xvYWRfdHJpbV9kYWNzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHM2MjZfbG9hZF90cmltX2RhY3Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAl1aW50OF90IGk7CisJaW50IHJldDsKIAogCS8qIENvcHkgVHJpbURhYyBzZXRwb2ludCB2YWx1ZXMgZnJvbSBFRVBST00gdG8gVHJpbURhY3MuICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoczYyNl90cmltY2hhbik7IGkrKykKLQkJczYyNl93cml0ZV90cmltX2RhYyhkZXYsIGksCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoczYyNl90cmltY2hhbik7IGkrKykgeworCQlyZXQgPSBzNjI2X3dyaXRlX3RyaW1fZGFjKGRldiwgaSwKIAkJCQkgICAgczYyNl9pMmNfcmVhZChkZXYsIHM2MjZfdHJpbWFkcnNbaV0pKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOwogfQogCiAvKiAqKioqKiogIENPVU5URVIgRlVOQ1RJT05TICAqKioqKioqICovCkBAIC0xODQ2LDYgKzE5MjUsMjAgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgaW50IHM2MjZfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgczYyNl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSByZWFkbChkZXZwcml2LT5tbWlvICsgUzYyNl9QX1BTUik7CisJaWYgKHN0YXR1cyAmIFM2MjZfUFNSX0dQSU8yKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IHM2MjZfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKQEAgLTE4NTYsNiArMTk0OSw3IEBACiAJdWludDE2X3QgYWRjX3NwZWMgPSAwOwogCXVpbnQzMl90IGdwaW9faW1hZ2U7CiAJdWludDMyX3QgdG1wOworCWludCByZXQ7CiAJaW50IG47CiAKIAkvKgpAQCAtMTg5Nyw4ICsxOTkxLDkgQEAKIAkJICovCiAKIAkJLyogV2FpdCBmb3IgQURDIGRvbmUgKi8KLQkJd2hpbGUgKCEocmVhZGwoZGV2cHJpdi0+bW1pbyArIFM2MjZfUF9QU1IpICYgUzYyNl9QU1JfR1BJTzIpKQotCQkJOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHM2MjZfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKIAkJLyogRmV0Y2ggQURDIGRhdGEgKi8KIAkJaWYgKG4gIT0gMCkgewpAQCAtMjI5OSw2ICsyMzk0LDcgQEAKIHsKIAlzdHJ1Y3QgczYyNl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBpOworCWludCByZXQ7CiAJdWludDE2X3QgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwogCWludDE2X3QgZGFjZGF0YTsKIApAQCAtMjMwNyw3ICsyNDAzLDkgQEAKIAkJZGV2cHJpdi0+YW9fcmVhZGJhY2tbQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyldID0gZGF0YVtpXTsKIAkJZGFjZGF0YSAtPSAoMHgxZmZmKTsKIAotCQlzNjI2X3NldF9kYWMoZGV2LCBjaGFuLCBkYWNkYXRhKTsKKwkJcmV0ID0gczYyNl9zZXRfZGFjKGRldiwgY2hhbiwgZGFjZGF0YSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldHVybiBpOwpAQCAtMjU0MywxMiArMjY0MSwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBzNjI2X2luaXRpYWxpemUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgczYyNl9pbml0aWFsaXplKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHM2MjZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlkbWFfYWRkcl90IHBoeXNfYnVmOwogCXVpbnQxNl90IGNoYW47CiAJaW50IGk7CisJaW50IHJldDsKIAogCS8qIEVuYWJsZSBERUJJIGFuZCBhdWRpbyBwaW5zLCBlbmFibGUgSTJDIGludGVyZmFjZSAqLwogCXM2MjZfbWNfZW5hYmxlKGRldiwgUzYyNl9NQzFfREVCSSB8IFM2MjZfTUMxX0FVRElPIHwgUzYyNl9NQzFfSTJDLApAQCAtMjc0OSw3ICsyODQ4LDkgQEAKIAkgKiBzb21ldGltZXMgY2F1c2VzIHRoZSBmaXJzdCBmZXcgVHJpbURBQyB3cml0ZXMgdG8gbWFsZnVuY3Rpb24uCiAJICovCiAJczYyNl9sb2FkX3RyaW1fZGFjcyhkZXYpOwotCXM2MjZfbG9hZF90cmltX2RhY3MoZGV2KTsKKwlyZXQgPSBzNjI2X2xvYWRfdHJpbV9kYWNzKGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCS8qCiAJICogTWFudWFsbHkgaW5pdCBhbGwgZ2F0ZSBhcnJheSBoYXJkd2FyZSBpbiBjYXNlIHRoaXMgaXMgYSBzb2Z0CkBAIC0yNzYzLDggKzI4NjQsMTEgQEAKIAkgKiBJbml0IGFsbCBEQUMgb3V0cHV0cyB0byAwViBhbmQgaW5pdCBhbGwgREFDIHNldHBvaW50IGFuZAogCSAqIHBvbGFyaXR5IGltYWdlcy4KIAkgKi8KLQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgUzYyNl9EQUNfQ0hBTk5FTFM7IGNoYW4rKykKLQkJczYyNl9zZXRfZGFjKGRldiwgY2hhbiwgMCk7CisJZm9yIChjaGFuID0gMDsgY2hhbiA8IFM2MjZfREFDX0NIQU5ORUxTOyBjaGFuKyspIHsKKwkJcmV0ID0gczYyNl9zZXRfZGFjKGRldiwgY2hhbiwgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KIAogCS8qIEluaXQgY291bnRlcnMgKi8KIAlzNjI2X2NvdW50ZXJzX2luaXQoZGV2KTsKQEAgLTI3ODAsNiArMjg4NCw4IEBACiAKIAkvKiBJbml0aWFsaXplIHRoZSBkaWdpdGFsIEkvTyBzdWJzeXN0ZW0gKi8KIAlzNjI2X2Rpb19pbml0KGRldik7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzNjI2X2F1dG9fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC0yOTAwLDkgKzMwMDYsOSBAQAogCXMtPmluc25fcmVhZAk9IHM2MjZfZW5jX2luc25fcmVhZDsKIAlzLT5pbnNuX3dyaXRlCT0gczYyNl9lbmNfaW5zbl93cml0ZTsKIAotCXM2MjZfaW5pdGlhbGl6ZShkZXYpOwotCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlcyBhdHRhY2hlZFxuIiwgZGV2LT5ib2FyZF9uYW1lKTsKKwlyZXQgPSBzNjI2X2luaXRpYWxpemUoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2tlbC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3NrZWwuYwppbmRleCA3N2UyMDU5Li4zOTAwOGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2tlbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9za2VsLmMKQEAgLTE0Miw2ICsxNDIsMjkgQEAKIH0KIAogLyoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lc24ndCByZXF1aXJlIGEgcGFydGljdWxhciBmb3JtLCB0aGlzIGlzIGp1c3QKKyAqIHdoYXQgaGFwcGVucyB0byBiZSB1c2VkIGluIHNvbWUgb2YgdGhlIGRyaXZlcnMuIFRoZSBjb21lZGlfdGltZW91dCgpCisgKiBoZWxwZXIgdXNlcyB0aGlzIGNhbGxiYWNrIHRvIGNoZWNrIGZvciB0aGUgZW5kLW9mLWNvbnZlcnNpb24gd2hpbGUKKyAqIHdhaXRpbmcgZm9yIHVwIHRvIDEgc2Vjb25kLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gMCB3aGVuIHRoZQorICogY29udmVyc2lvbiBpcyBmaW5pc2hlZCBhbmQgLUVCVVNZIHRvIGtlZXAgd2FpdGluZy4gQW55IG90aGVyIGVycm5vCisgKiB3aWxsIHRlcm1pbmF0ZSBjb21lZGlfdGltZW91dCgpIGFuZCByZXR1cm4gdGhhdCBlcnJubyB0byB0aGUgY2FsbGVyLgorICogSWYgdGhlIHRpbWVvdXQgb2NjdXJzLCBjb21lZGlfdGltZW91dCgpIHdpbGwgcmV0dXJuIC1FVElNRURPVVQuCisgKi8KK3N0YXRpYyBpbnQgc2tlbF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwkvKiBzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBTS0VMX1NUQVRVUyk7ICovCisJc3RhdHVzID0gMTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCisvKgogICogImluc3RydWN0aW9ucyIgcmVhZC93cml0ZSBkYXRhIGluICJvbmUtc2hvdCIgb3IgInNvZnR3YXJlLXRyaWdnZXJlZCIKICAqIG1vZGUuCiAgKi8KQEAgLTE0OSw5ICsxNzIsOSBAQAogCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCWNvbnN0IHN0cnVjdCBza2VsX2JvYXJkICp0aGlzYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKLQlpbnQgbiwgaTsKKwlpbnQgbjsKIAl1bnNpZ25lZCBpbnQgZDsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzOworCWludCByZXQ7CiAKIAkvKiBhIHR5cGljYWwgcHJvZ3JhbW1pbmcgc2VxdWVuY2UgKi8KIApAQCAtMTY1LDE4ICsxODgsMTAgQEAKIAkJLyogdHJpZ2dlciBjb252ZXJzaW9uICovCiAJCS8qIG91dHcoMCxkZXYtPmlvYmFzZSArIFNLRUxfQ09OVkVSVCk7ICovCiAKLSNkZWZpbmUgVElNRU9VVCAxMDAKIAkJLyogd2FpdCBmb3IgY29udmVyc2lvbiB0byBlbmQgKi8KLQkJZm9yIChpID0gMDsgaSA8IFRJTUVPVVQ7IGkrKykgewotCQkJc3RhdHVzID0gMTsKLQkJCS8qIHN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIFNLRUxfU1RBVFVTKTsgKi8KLQkJCWlmIChzdGF0dXMpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGkgPT0gVElNRU9VVCkgewotCQkJZGV2X3dhcm4oZGV2LT5jbGFzc19kZXYsICJhaSB0aW1lb3V0XG4iKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCQl9CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgc2tlbF9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQkvKiByZWFkIGRhdGEgKi8KIAkJLyogZCA9IGludyhkZXYtPmlvYmFzZSArIFNLRUxfQUlfREFUQSk7ICovCkBAIC00NTYsOCArNDcxLDYgQEAKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKIAl9CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgInNrZWw6IGF0dGFjaGVkXG4iKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc3N2X2RucC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3Nzdl9kbnAuYwppbmRleCBkZjIyYTc4Li44NDhjMzA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc3N2X2RucC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zc3ZfZG5wLmMKQEAgLTE2MSw4ICsxNjEsNyBAQAogCW91dGIoUENNUiwgQ1NDSVIpOwogCW91dGIoKGluYihDU0NEUikgJiAweEFBKSwgQ1NDRFIpOwogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlczogYXR0YWNoZWRcbiIsIGRldi0+Ym9hcmRfbmFtZSk7Ci0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGRucF9kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhmYXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jCmluZGV4IDVmODVjNTUuLmQ2ZmFlMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhmYXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYwpAQCAtMzcyLDcgKzM3Miw3IEBACiAJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsCiAJCQkJCVRSSUdfTk9XIHwgVFJJR19FWFQgfCBUUklHX0lOVCk7CiAJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKLQkJCQkJVFJJR19USU1FUiB8IFRSSUdfRk9MTE9XIHwgVFJJR19FWFQpOworCQkJCQlUUklHX0ZPTExPVyB8IFRSSUdfRVhUKTsKIAllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX1RJTUVSIHwgVFJJR19FWFQpOwogCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKIAllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKQEAgLTQyNCw5ICs0MjQsNiBAQAogCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCB0bXApOwogCX0KIAotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpCi0JCWVyciB8PSAtRUlOVkFMOwotCiAJLyogc3RvcCBzb3VyY2UgKi8KIAlzd2l0Y2ggKGNtZC0+c3RvcF9zcmMpIHsKIAljYXNlIFRSSUdfQ09VTlQ6CkBAIC01MTQsMzYgKzUxMSwyOCBAQAogCSAqLwogCWRldnByaXYtPmlnbm9yZSA9IFBBQ0tFVFNfVE9fSUdOT1JFOwogCi0JaWYgKGNtZC0+Y2hhbmxpc3RfbGVuID4gMCkgewotCQlnYWluID0gQ1JfUkFOR0UoY21kLT5jaGFubGlzdFswXSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgKytpKSB7Ci0JCQljaGFuID0gQ1JfQ0hBTihjbWQtPmNoYW5saXN0W2ldKTsKLQkJCWlmIChjaGFuICE9IGkpIHsKLQkJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAotCQkJCQkiY2hhbm5lbHMgYXJlIG5vdCBjb25zZWN1dGl2ZVxuIik7Ci0JCQkJdXAoJmRldnByaXYtPnNlbSk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlpZiAoKGdhaW4gIT0gQ1JfUkFOR0UoY21kLT5jaGFubGlzdFtpXSkpCi0JCQkgICAgJiYgKGNtZC0+Y2hhbmxpc3RfbGVuID4gMykpIHsKLQkJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAotCQkJCQkiZ2FpbiBtdXN0IGJlIHRoZSBzYW1lIGZvciBhbGwgY2hhbm5lbHNcbiIpOwotCQkJCXVwKCZkZXZwcml2LT5zZW0pOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJaWYgKGkgPj0gTlVNQ0hBTk5FTFMpIHsKLQkJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiY2hhbmxpc3QgdG9vIGxvbmdcbiIpOwotCQkJCWJyZWFrOwotCQkJfQorCWdhaW4gPSBDUl9SQU5HRShjbWQtPmNoYW5saXN0WzBdKTsKKwlmb3IgKGkgPSAwOyBpIDwgY21kLT5jaGFubGlzdF9sZW47ICsraSkgeworCQljaGFuID0gQ1JfQ0hBTihjbWQtPmNoYW5saXN0W2ldKTsKKwkJaWYgKGNoYW4gIT0gaSkgeworCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKKwkJCQkiY2hhbm5lbHMgYXJlIG5vdCBjb25zZWN1dGl2ZVxuIik7CisJCQl1cCgmZGV2cHJpdi0+c2VtKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICgoZ2FpbiAhPSBDUl9SQU5HRShjbWQtPmNoYW5saXN0W2ldKSkKKwkJCSYmIChjbWQtPmNoYW5saXN0X2xlbiA+IDMpKSB7CisJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAorCQkJCSJnYWluIG11c3QgYmUgdGhlIHNhbWUgZm9yIGFsbCBjaGFubmVsc1xuIik7CisJCQl1cCgmZGV2cHJpdi0+c2VtKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChpID49IE5VTUNIQU5ORUxTKSB7CisJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiY2hhbmxpc3QgdG9vIGxvbmdcbiIpOworCQkJYnJlYWs7CiAJCX0KIAl9CiAJc3RlcHMgPSAwOwotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCSJzY2FuX2JlZ2luX3NyYz09VFJJR19USU1FUiBub3QgdmFsaWRcbiIpOwotCQl1cCgmZGV2cHJpdi0+c2VtKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpCiAJCXN0ZXBzID0gKGNtZC0+Y29udmVydF9hcmcgKiAzMCkgLyAxMDAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIva2NvbWVkaWxpYl9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIva2NvbWVkaWxpYl9tYWluLmMKaW5kZXggN2RjNWExOC4uODc3N2Y5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2tjb21lZGlsaWJfbWFpbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9rY29tZWRpbGliX21haW4uYwpAQCAtNDEsNyArNDEsOCBAQAogCWlmIChzdHJuY21wKGZpbGVuYW1lLCAiL2Rldi9jb21lZGkiLCAxMSkgIT0gMCkKIAkJcmV0dXJuIE5VTEw7CiAKLQltaW5vciA9IHNpbXBsZV9zdHJ0b3VsKGZpbGVuYW1lICsgMTEsIE5VTEwsIDApOworCWlmIChrc3RydG91aW50KGZpbGVuYW1lICsgMTEsIDAsICZtaW5vcikpCisJCXJldHVybiBOVUxMOwogCiAJaWYgKG1pbm9yID49IENPTUVESV9OVU1fQk9BUkRfTUlOT1JTKQogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9wcm9jLmMKaW5kZXggZGE2YmM1OC4uOTFkZWEyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9wcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9wcm9jLmMKQEAgLTEsMjcgKzEsMjYgQEAKIC8qCi0gICAgbW9kdWxlL3Byb2MuYwotICAgIC9wcm9jIGludGVyZmFjZSBmb3IgY29tZWRpCi0KLSAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCi0gICAgQ29weXJpZ2h0IChDKSAxOTk4IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qLworICogL3Byb2MgaW50ZXJmYWNlIGZvciBjb21lZGkKKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCiAKIC8qCi0JVGhpcyBpcyBzb21lIHNlcmlvdXMgYmxvYXR3YXJlLgotCi0JVGFrZW4gZnJvbSBEYXZlIEEuJ3MgUENMLTcxMSBkcml2ZXIsICdjdXogSSB0aG91Z2h0IGl0Ci0Jd2FzIGNvb2wuCi0qLworICogVGhpcyBpcyBzb21lIHNlcmlvdXMgYmxvYXR3YXJlLgorICoKKyAqIFRha2VuIGZyb20gRGF2ZSBBLidzIFBDTC03MTEgZHJpdmVyLCAnY3V6IEkgdGhvdWdodCBpdAorICogd2FzIGNvb2wuCisgKi8KIAogI2luY2x1ZGUgImNvbWVkaWRldi5oIgogI2luY2x1ZGUgImNvbWVkaV9pbnRlcm5hbC5oIgpAQCAtMzQsMTEgKzMzLDggQEAKIAlpbnQgZGV2aWNlc19xID0gMDsKIAlzdHJ1Y3QgY29tZWRpX2RyaXZlciAqZHJpdjsKIAotCXNlcV9wcmludGYobSwKLQkJICAgICAiY29tZWRpIHZlcnNpb24gIiBDT01FRElfUkVMRUFTRSAiXG4iCi0JCSAgICAgImZvcm1hdCBzdHJpbmc6ICVzXG4iLAotCQkgICAgICJcIiUyZDogJS0yMHMgJS0yMHMgJTRkXCIsIGksICIKLQkJICAgICAiZHJpdmVyX25hbWUsIGJvYXJkX25hbWUsIG5fc3ViZGV2aWNlcyIpOworCXNlcV9wcmludGYobSwgImNvbWVkaSB2ZXJzaW9uICIgQ09NRURJX1JFTEVBU0UgIlxuZm9ybWF0IHN0cmluZzogJXNcbiIsCisJCSAgICJcIiUyZDogJS0yMHMgJS0yMHMgJTRkXCIsIGksIGRyaXZlcl9uYW1lLCBib2FyZF9uYW1lLCBuX3N1YmRldmljZXMiKTsKIAogCWZvciAoaSA9IDA7IGkgPCBDT01FRElfTlVNX0JPQVJEX01JTk9SUzsgaSsrKSB7CiAJCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBjb21lZGlfZGV2X2dldF9mcm9tX21pbm9yKGkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9yYW5nZS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9yYW5nZS5jCmluZGV4IDQ2YjNkYTYuLmI2ODQ5NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcmFuZ2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3JhbmdlLmMKQEAgLTE0MywyOCArMTQzLDIzIEBACiAJdW5zaWduZWQgaW50IGNoYW5zcGVjOwogCWludCBjaGFuLCByYW5nZV9sZW4sIGk7CiAKLQlpZiAocy0+cmFuZ2VfdGFibGUgfHwgcy0+cmFuZ2VfdGFibGVfbGlzdCkgewotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQljaGFuc3BlYyA9IGNoYW5saXN0W2ldOwotCQkJY2hhbiA9IENSX0NIQU4oY2hhbnNwZWMpOwotCQkJaWYgKHMtPnJhbmdlX3RhYmxlKQotCQkJCXJhbmdlX2xlbiA9IHMtPnJhbmdlX3RhYmxlLT5sZW5ndGg7Ci0JCQllbHNlIGlmIChzLT5yYW5nZV90YWJsZV9saXN0ICYmIGNoYW4gPCBzLT5uX2NoYW4pCi0JCQkJcmFuZ2VfbGVuID0gcy0+cmFuZ2VfdGFibGVfbGlzdFtjaGFuXS0+bGVuZ3RoOwotCQkJZWxzZQotCQkJCXJhbmdlX2xlbiA9IDA7Ci0JCQlpZiAoY2hhbiA+PSBzLT5uX2NoYW4gfHwKLQkJCSAgICBDUl9SQU5HRShjaGFuc3BlYykgPj0gcmFuZ2VfbGVuIHx8Ci0JCQkgICAgYXJlZl9pbnZhbGlkKHMsIGNoYW5zcGVjKSkgewotCQkJCWRldl93YXJuKGRldi0+Y2xhc3NfZGV2LAotCQkJCQkgImJhZCBjaGFubGlzdFslZF09MHglMDh4IGNoYW49JWQgcmFuZ2UgbGVuZ3RoPSVkXG4iLAotCQkJCQkgaSwgY2hhbnNwZWMsIGNoYW4sIHJhbmdlX2xlbik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQljaGFuc3BlYyA9IGNoYW5saXN0W2ldOworCQljaGFuID0gQ1JfQ0hBTihjaGFuc3BlYyk7CisJCWlmIChzLT5yYW5nZV90YWJsZSkKKwkJCXJhbmdlX2xlbiA9IHMtPnJhbmdlX3RhYmxlLT5sZW5ndGg7CisJCWVsc2UgaWYgKHMtPnJhbmdlX3RhYmxlX2xpc3QgJiYgY2hhbiA8IHMtPm5fY2hhbikKKwkJCXJhbmdlX2xlbiA9IHMtPnJhbmdlX3RhYmxlX2xpc3RbY2hhbl0tPmxlbmd0aDsKKwkJZWxzZQorCQkJcmFuZ2VfbGVuID0gMDsKKwkJaWYgKGNoYW4gPj0gcy0+bl9jaGFuIHx8CisJCSAgICBDUl9SQU5HRShjaGFuc3BlYykgPj0gcmFuZ2VfbGVuIHx8CisJCSAgICBhcmVmX2ludmFsaWQocywgY2hhbnNwZWMpKSB7CisJCQlkZXZfd2FybihkZXYtPmNsYXNzX2RldiwKKwkJCQkgImJhZCBjaGFubGlzdFslZF09MHglMDh4IGNoYW49JWQgcmFuZ2UgbGVuZ3RoPSVkXG4iLAorCQkJCSBpLCBjaGFuc3BlYywgY2hhbiwgcmFuZ2VfbGVuKTsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JfSBlbHNlIHsKLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIihidWcpIG5vIHJhbmdlIHR5cGUgbGlzdCFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2JjbV83MDAxMl9yZWdzLmggYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2JjbV83MDAxMl9yZWdzLmgKaW5kZXggZjNhYjMxNC4uZGExOTlhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9iY21fNzAwMTJfcmVncy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvYmNtXzcwMDEyX3JlZ3MuaApAQCAtMzEsNyArMzEsOCBAQAogI2RlZmluZSBCUkNNX1NISUZUKGMsIHIsIGYpICAgYyMjXyMjciMjXyMjZiMjX1NISUZUCiAKICNkZWZpbmUgR0VUX0ZJRUxEKG0sIGMsIHIsIGYpIFwKLQkoKCgobSkgJiBCUkNNX01BU0soYywgciwgZikpID4+IEJSQ01fU0hJRlQoYywgciwgZikpIDw8IEJSQ01fQUxJR04oYywgciwgZikpCisJKCgoKG0pICYgQlJDTV9NQVNLKGMsIHIsIGYpKSA+PiBCUkNNX1NISUZUKGMsIHIsIGYpKSA8PCBcCisJIEJSQ01fQUxJR04oYywgciwgZikpCiAKICNkZWZpbmUgU0VUX0ZJRUxEKG0sIGMsIHIsIGYsIGQpIFwKIAkoKG0pID0gKCgobSkgJiB+QlJDTV9NQVNLKGMsIHIsIGYpKSB8ICgoKChkKSA+PiBCUkNNX0FMSUdOKGMsIHIsIGYpKSA8PCBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9ody5jIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfaHcuYwppbmRleCA4ZDA2ODBkLi40NzY1ZDUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9ody5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2h3LmMKQEAgLTQzMywxMCArNDMzLDEyIEBACiB9CiAKICNkZWZpbmUgY3J5c3RhbGhkX2h3X2RlbGV0ZV9pb3EoYWRwLCBxKQkJXAorZG8gewkJCQkJCVwKIAlpZiAocSkgewkJCQlcCiAJCWNyeXN0YWxoZF9kZWxldGVfZGlvcShhZHAsIHEpOwlcCiAJCXEgPSBOVUxMOwkJCVwKLQl9CisJfQkJCQkJXAorfSB3aGlsZSAoMCkKIAogc3RhdGljIHZvaWQgY3J5c3RhbGhkX2h3X2RlbGV0ZV9pb3FzKHN0cnVjdCBjcnlzdGFsaGRfaHcgKmh3KQogewpAQCAtMTQzNyw3ICsxNDM5LDcgQEAKIAkJY3J5c3RhbGhkX3JlZ193cihody0+YWRwLCBNSVNDMV9VVl9SWF9FUlJPUl9TVEFUVVMsIHRtcCk7CiAJfQogCi0JcmV0dXJuICh0bXBfbHN0cyAhPSBody0+cnhfbGlzdF9zdHNbMF0pOworCXJldHVybiB0bXBfbHN0cyAhPSBody0+cnhfbGlzdF9zdHNbMF07CiB9CiAKIHN0YXRpYyBib29sIGNyeXN0YWxoZF9yeF9saXN0MV9oYW5kbGVyKHN0cnVjdCBjcnlzdGFsaGRfaHcgKmh3LApAQCAtMTUwNyw3ICsxNTA5LDcgQEAKIAkJY3J5c3RhbGhkX3JlZ193cihody0+YWRwLCBNSVNDMV9VVl9SWF9FUlJPUl9TVEFUVVMsIHRtcCk7CiAJfQogCi0JcmV0dXJuICh0bXBfbHN0cyAhPSBody0+cnhfbGlzdF9zdHNbMV0pOworCXJldHVybiB0bXBfbHN0cyAhPSBody0+cnhfbGlzdF9zdHNbMV07CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbG54LmMgYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9sbnguYwppbmRleCA5OWVlZmQwLi4yMGJlOTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9sbnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9sbnguYwpAQCAtMTExLDcgKzExMSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRwLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNyeXN0YWxoZF91c2VyX2RhdGEodW5zaWduZWQgbG9uZyB1ZCwgdm9pZCAqZHIsCitzdGF0aWMgaW5saW5lIGludCBjcnlzdGFsaGRfdXNlcl9kYXRhKHZvaWQgX191c2VyICp1ZCwgdm9pZCAqZHIsCiAJCQkgaW50IHNpemUsIGludCBzZXQpCiB7CiAJaW50IHJjOwpAQCAtMTIyLDkgKzEyMiw5IEBACiAJfQogCiAJaWYgKHNldCkKLQkJcmMgPSBjb3B5X3RvX3VzZXIoKHZvaWQgKil1ZCwgZHIsIHNpemUpOworCQlyYyA9IGNvcHlfdG9fdXNlcih1ZCwgZHIsIHNpemUpOwogCWVsc2UKLQkJcmMgPSBjb3B5X2Zyb21fdXNlcihkciwgKHZvaWQgKil1ZCwgc2l6ZSk7CisJCXJjID0gY29weV9mcm9tX3VzZXIoZHIsIHVkLCBzaXplKTsKIAogCWlmIChyYykgewogCQlCQ01MT0dfRVJSKCJJbnZhbGlkIGFyZ3MgZm9yIGNvbW1hbmRcbiIpOwpAQCAtMTUzLDcgKzE1Myw4IEBACiAKIAlpby0+YWRkX2NkYXRhX3N6ID0gbV9zejsKIAl1YV9vZmYgPSB1YSArIHNpemVvZihpby0+dWRhdGEpOwotCXJjID0gY3J5c3RhbGhkX3VzZXJfZGF0YSh1YV9vZmYsIGlvLT5hZGRfY2RhdGEsIGlvLT5hZGRfY2RhdGFfc3osIDApOworCXJjID0gY3J5c3RhbGhkX3VzZXJfZGF0YSgodm9pZCBfX3VzZXIgKil1YV9vZmYsIGlvLT5hZGRfY2RhdGEsCisJCQlpby0+YWRkX2NkYXRhX3N6LCAwKTsKIAlpZiAocmMpIHsKIAkJQkNNTE9HX0VSUigiZmFpbGVkIHRvIHB1bGwgYWRkX2NkYXRhIHN6OiV4IHVhX29mZjoleFxuIiwKIAkJCSAgIGlvLT5hZGRfY2RhdGFfc3osICh1bnNpZ25lZCBpbnQpdWFfb2ZmKTsKQEAgLTE3OCw3ICsxNzksNyBAQAogCiAJaWYgKGlvLT5jbWQgIT0gQkNNX0lPQ19GV19ET1dOTE9BRCkgewogCQl1YV9vZmYgPSB1YSArIHNpemVvZihpby0+dWRhdGEpOwotCQlyYyA9IGNyeXN0YWxoZF91c2VyX2RhdGEodWFfb2ZmLCBpby0+YWRkX2NkYXRhLAorCQlyYyA9IGNyeXN0YWxoZF91c2VyX2RhdGEoKHZvaWQgX191c2VyICopdWFfb2ZmLCBpby0+YWRkX2NkYXRhLAogCQkJCQlpby0+YWRkX2NkYXRhX3N6LCAxKTsKIAkJaWYgKHJjKSB7CiAJCQlCQ01MT0dfRVJSKApAQCAtMjA4LDcgKzIwOSw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJjID0gY3J5c3RhbGhkX3VzZXJfZGF0YSh1YSwgJmlvLT51ZGF0YSwgc2l6ZW9mKGlvLT51ZGF0YSksIHNldCk7CisJcmMgPSBjcnlzdGFsaGRfdXNlcl9kYXRhKCh2b2lkIF9fdXNlciAqKXVhLCAmaW8tPnVkYXRhLAorCQkJc2l6ZW9mKGlvLT51ZGF0YSksIHNldCk7CiAJaWYgKHJjKSB7CiAJCUJDTUxPR19FUlIoImZhaWxlZCB0byAlcyBpb2RhdGFcbiIsIChzZXQgPyAic2V0IiA6ICJnZXQiKSk7CiAJCXJldHVybiByYzsKQEAgLTU0Niw5ICs1NDgsMTAgQEAKIAlpbnQgcmM7CiAJZW51bSBCQ19TVEFUVVMgc3RzID0gQkNfU1RTX1NVQ0NFU1M7CiAKLQlCQ01MT0coQkNNTE9HX0RCRywgIlBDSV9JTkZPOiBWZW5kb3I6MHglMDR4IERldmljZToweCUwNHggc192ZW5kb3I6MHglMDR4IHNfZGV2aWNlOiAweCUwNHhcbiIsCi0JICAgICAgIHBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlLCBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLAotCSAgICAgICBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKKwlCQ01MT0coQkNNTE9HX0RCRywKKwkJIlBDSV9JTkZPOiBWZW5kb3I6MHglMDR4IERldmljZToweCUwNHggc192ZW5kb3I6MHglMDR4IHNfZGV2aWNlOiAweCUwNHhcbiIsCisJCXBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlLCBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLAorCQlwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKIAogCXBpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNyeXN0YWxoZF9hZHApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBpbmZvKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9sbnguaCBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2xueC5oCmluZGV4IDgxNmUxY2QuLjQ5ZTFlZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2xueC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2xueC5oCkBAIC01OCwxMSArNTgsMTEgQEAKIAogCXVuc2lnbmVkIGxvbmcJCXBjaV9tZW1fc3RhcnQ7CiAJdWludDMyX3QJCXBjaV9tZW1fbGVuOwotCXZvaWQJCQkqYWRkcjsKKwl2b2lkIF9faW9tZW0JCSphZGRyOwogCiAJdW5zaWduZWQgbG9uZwkJcGNpX2kyb19zdGFydDsKIAl1aW50MzJfdAkJcGNpX2kyb19sZW47Ci0Jdm9pZAkJCSppMm9fYWRkcjsKKwl2b2lkIF9faW9tZW0JCSppMm9fYWRkcjsKIAogCXVuc2lnbmVkIGludAkJZHJ2X2RhdGE7CiAJdW5zaWduZWQgaW50CQlkbWFiaXRzOwkvKiAzMiB8IDY0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9taXNjLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9taXNjLmMKaW5kZXggYzNkMDI0NC4uM2FhYmY3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbWlzYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX21pc2MuYwpAQCAtNzQwLDcgKzc0MCw3IEBACiAJZGlvLT5mYl9zaXplID0gdWJ1ZmZfc3ogJiAweDAzOwogCWlmIChkaW8tPmZiX3NpemUpIHsKIAkJcmVzID0gY29weV9mcm9tX3VzZXIoZGlvLT5mYl92YSwKLQkJCQkgICAgICh2b2lkICopKHVhZGRyICsgY291bnQgLSBkaW8tPmZiX3NpemUpLAorCQkJCSAgICAgKHZvaWQgX191c2VyICopKHVhZGRyICsgY291bnQgLSBkaW8tPmZiX3NpemUpLAogCQkJCSAgICAgZGlvLT5mYl9zaXplKTsKIAkJaWYgKHJlcykgewogCQkJQkNNTE9HX0VSUigiZmFpbGVkICVkIHRvIGNvcHkgJXUgZmlsbCBieXRlcyBmcm9tICVwXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbWlzYy5oIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbWlzYy5oCmluZGV4IDc3YWI3MmEuLjBmNjM4MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX21pc2MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9taXNjLmgKQEAgLTIyNSw3ICsyMjUsNyBAQAogI2RlZmluZSBCQ01MT0dfRVJSKGZtdCwgYXJncy4uLikJCQkJXAogZG8gewkJCQkJCQkJXAogCWlmIChnX2xpbmtsb2dfbGV2ZWwgJiBCQ01MT0dfRVJST1IpCQkJXAotCQlwcmludGsoS0VSTl9FUlIgIipFUlIqOiVzOiVkOiAiZm10LAkJXAorCQlwcl9lcnIoIipFUlIqOiVzOiVkOiAiZm10LAkJCVwKIAkJCQlfX0ZJTEVfXywgX19MSU5FX18sICMjYXJncyk7CVwKIH0gd2hpbGUgKDApCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL01ha2VmaWxlCmluZGV4IDJmMjE3ZTkuLmI4NzllN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9NYWtlZmlsZQpAQCAtNCw3ICs0LDYgQEAKIGNjZmxhZ3MteSArPSAtRFNCRV9JU1JfVEFTS0xFVAogCiBjeHQxZTEteSA6PSAJXAotICBvc3NpUmVsZWFzZS5vIAlcCiAgIG11c3ljYy5vIAkJXAogICBwbWNjNF9kcnYubyAJCVwKICAgY29tZXQubyAJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvY29tZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvY29tZXQuYwppbmRleCBjNGM4YzBmLi43MDA1YWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2NvbWV0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9jb21ldC5jCkBAIC0yMiwxOCArMjIsMjAgQEAKICNpbmNsdWRlICJjb21ldC5oIgogI2luY2x1ZGUgImNvbWV0X3RhYmxlcy5oIgogCi1leHRlcm4gaW50ICBjeHQxZTFfbG9nX2xldmVsOwogCiAjZGVmaW5lIENPTUVUX05VTV9TQU1QTEVTICAgMjQgIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSB3YXZlZm9ybSB0YWJsZSAqLwogI2RlZmluZSBDT01FVF9OVU1fVU5JVFMgICAgIDUgICAvKiBOdW1iZXIgb2YgcG9pbnRzIHBlciBlbnRyeSBpbiB0YWJsZSAqLwogCiAvKiBmb3J3YXJkIHJlZmVyZW5jZXMgKi8KIHN0YXRpYyB2b2lkIFNldFB3ckxldmVsKHN0cnVjdCBzX2NvbWV0X3JlZyAqY29tZXQpOwotc3RhdGljIHZvaWQgV3J0UmN2RXF1YWxpemVyVGJsKGNpX3QgKmNpLCBzdHJ1Y3Qgc19jb21ldF9yZWcgKmNvbWV0LCB1X2ludDMyX3QgKnRhYmxlKTsKLXN0YXRpYyB2b2lkIFdydFhtdFdhdmVmb3JtVGJsKGNpX3QgKmNpLCBzdHJ1Y3Qgc19jb21ldF9yZWcgKmNvbWV0LCB1X2ludDhfdCB0YWJsZVtDT01FVF9OVU1fU0FNUExFU11bQ09NRVRfTlVNX1VOSVRTXSk7CitzdGF0aWMgdm9pZCBXcnRSY3ZFcXVhbGl6ZXJUYmwoY2lfdCAqY2ksIHN0cnVjdCBzX2NvbWV0X3JlZyAqY29tZXQsCisJCQkJdV9pbnQzMl90ICp0YWJsZSk7CitzdGF0aWMgdm9pZCBXcnRYbXRXYXZlZm9ybVRibChjaV90ICpjaSwgc3RydWN0IHNfY29tZXRfcmVnICpjb21ldCwKKwkJCQl1X2ludDhfdCB0YWJsZVtDT01FVF9OVU1fU0FNUExFU10KKwkJCQlbQ09NRVRfTlVNX1VOSVRTXSk7CiAKIAotdm9pZCAgICAgICAqVFdWX3RhYmxlWzEyXSA9IHsKK3N0YXRpYyB2b2lkICpUV1ZfdGFibGVbMTJdID0gewogCVRXVkxvbmdIYXVsMERCLCBUV1ZMb25nSGF1bDdfNURCLCBUV1ZMb25nSGF1bDE1REIsIFRXVkxvbmdIYXVsMjJfNURCLAogCVRXVlNob3J0SGF1bDAsIFRXVlNob3J0SGF1bDEsIFRXVlNob3J0SGF1bDIsIFRXVlNob3J0SGF1bDMsCiAJVFdWU2hvcnRIYXVsNCwgVFdWU2hvcnRIYXVsNSwKQEAgLTUwLDYgKzUyLDcgQEAKIAkJaWYgKHQxKQogCQkJLyogZGVmYXVsdCBUMSB3YXZlZm9ybSB0YWJsZSAqLwogCQkJbGJvID0gQ0ZHX0xCT19MSDA7CisKIAkJZWxzZQogCQkJLyogZGVmYXVsdCBFMSB3YXZlZm9ybSB0YWJsZSAqLwogCQkJbGJvID0gQ0ZHX0xCT19FMTIwOwpAQCAtNTgsOCArNjEsOCBAQAogCXJldHVybiBsYm8gLSAxOwogfQogCi12b2lkIGluaXRfY29tZXQodm9pZCAqY2ksIHN0cnVjdCBzX2NvbWV0X3JlZyAqY29tZXQsIHVfaW50MzJfdCBwb3J0X21vZGUsIGludCBjbG9ja21hc3RlciwKLQkJdV9pbnQ4X3QgbW9yZVBhcmFtcykKK3ZvaWQgaW5pdF9jb21ldCh2b2lkICpjaSwgc3RydWN0IHNfY29tZXRfcmVnICpjb21ldCwgdV9pbnQzMl90IHBvcnRfbW9kZSwKKwkJaW50IGNsb2NrbWFzdGVyLCB1X2ludDhfdCBtb3JlUGFyYW1zKQogewogCXVfaW50OF90IGlzVDFtb2RlOwogCS8qIFQxIGRlZmF1bHQgKi8KQEAgLTE0Niw3ICsxNDksOSBAQAogCSAvKiB0MVJCT0MgZW5hYmxlKEJPQzpCaXRPcmllbnRlZCBDb2RlKSAqLwogCXBjaV93cml0ZV8zMigodV9pbnQzMl90ICopICZjb21ldC0+dDFfcmJvY19lbmEsIDB4MDApOwogCWlmIChpc1QxbW9kZSkgewotCQkvKiBJQkNEIGNmZzogYWthIEluYmFuZCBDb2RlIERldGVjdGlvbiAqKiBsb29wYmFjayBjb2RlIGxlbmd0aCBzZXQgdG8gKi8KKwkJLyogSUJDRCBjZmc6IGFrYSBJbmJhbmQgQ29kZSBEZXRlY3Rpb24gKiogbG9vcGJhY2sgY29kZSBsZW5ndGgKKwkJICogc2V0IHRvCisJCSAqLwogCQkvKiA2IGJpdCBkb3duLCA1IGJpdCB1cCAoYXNzZXJ0KSAqLwogCQlwY2lfd3JpdGVfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPmliY2RfY2ZnLCAweDA0KTsKIAkJLyogbGluZSBsb29wYmFjayBhY3RpdmF0ZSBwYXR0ZXJuICovCkBAIC0yODYsNyArMjkxLDkgQEAKICAgICAvKiAweDMwOiAiQlJJRiBjZmciOyAweDIwIGlzICdDTU9ERScsIDB4MDMgaXMgKGJpdCkgcmF0ZSAqLwogICAgIC8qIG5vdGUgInJhdGUgYml0cyBjYW4gb25seSBiZSBzZXQgb25jZSBhZnRlciByZXNldCIgKi8KIAlpZiAoY2xvY2ttYXN0ZXIpIHsKLQkJLyogQ01PREUgPT0gY2xvY2tNb2RlLCAwPWNsb2NrIG1hc3RlciAoc28gYWxsIDMgb3RoZXJzIHNob3VsZCBiZSBzbGF2ZSkgKi8KKwkJLyogQ01PREUgPT0gY2xvY2tNb2RlLCAwPWNsb2NrIG1hc3RlcgorCQkgKiAoc28gYWxsIDMgb3RoZXJzIHNob3VsZCBiZSBzbGF2ZSkKKwkJICovCiAJCS8qIHJhdGUgPSAxLjU0NCBNYi9zICovCiAJCWlmIChpc1QxbW9kZSkKIAkJCS8qIENvbWV0IDAgTWFzdGVyIE1vZGUoQ01PREU9MCkgKi8KQEAgLTM5OCw3ICs0MDUsOCBAQAogKiogUmV0dXJuczogICAgIE5vdGhpbmcKICovCiBzdGF0aWMgdm9pZAotV3J0WG10V2F2ZWZvcm0oY2lfdCAqY2ksIHN0cnVjdCBzX2NvbWV0X3JlZyAqY29tZXQsIHVfaW50MzJfdCBzYW1wbGUsIHVfaW50MzJfdCB1bml0LCB1X2ludDhfdCBkYXRhKQorV3J0WG10V2F2ZWZvcm0oY2lfdCAqY2ksIHN0cnVjdCBzX2NvbWV0X3JlZyAqY29tZXQsIHVfaW50MzJfdCBzYW1wbGUsCisJCXVfaW50MzJfdCB1bml0LCB1X2ludDhfdCBkYXRhKQogewogCXVfaW50OF90ICAgIFdhdmVmb3JtQWRkcjsKIApAQCAtNDQ3LDcgKzQ1NSw3IEBACiBXcnRSY3ZFcXVhbGl6ZXJUYmwoY2lfdCAqY2ksIHN0cnVjdCBzX2NvbWV0X3JlZyAqY29tZXQsIHVfaW50MzJfdCAqdGFibGUpCiB7CiAJdV9pbnQzMl90ICAgcmFtYWRkcjsKLQl2b2xhdGlsZSB1X2ludDMyX3QgdmFsdWU7CisJdV9pbnQzMl90IHZhbHVlOwogCiAJZm9yIChyYW1hZGRyID0gMDsgcmFtYWRkciA8IDI1NjsgcmFtYWRkcisrKSB7CiAJCS8qKiogdGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgcGVyIEVycmF0YSA3LCAyLjUgKioqLwpAQCAtNTE1LDcgKzUyMyw3IEBACiBzdGF0aWMgdm9pZAogU2V0UHdyTGV2ZWwoc3RydWN0IHNfY29tZXRfcmVnICpjb21ldCkKIHsKLQl2b2xhdGlsZSB1X2ludDMyX3QgdGVtcDsKKwl1X2ludDMyX3QgdGVtcDsKIAogLyoKICoqICAgIEFsZ29yaXRobSB0byBCYWxhbmNlIHRoZSBQb3dlciBEaXN0cmlidXRpb24gb2YgVHRpcCBUcmluZwpAQCAtNTU3LDE3ICs1NjUsMjEgQEAKIHN0YXRpYyB2b2lkCiBTZXRDb21ldE9wcyhzdHJ1Y3Qgc19jb21ldF9yZWcgKmNvbWV0KQogewotCXZvbGF0aWxlIHVfaW50OF90IHJkX3ZhbHVlOworCXVfaW50OF90IHJkX3ZhbHVlOwogCiAJaWYgKGNvbWV0ID09IG1Db25maWcuQzRGdW5jMUJhc2UgKyAoQ09NRVQwX09GRlNFVCA+PiAyKSkgewogCQkvKiByZWFkIHRoZSBCUklGIENvbmZpZ3VyYXRpb24gKi8KLQkJcmRfdmFsdWUgPSAodV9pbnQ4X3QpIHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5icmlmX2NmZyk7CisJCXJkX3ZhbHVlID0gKHVfaW50OF90KSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopCisJCQkJJmNvbWV0LT5icmlmX2NmZyk7CiAJCXJkX3ZhbHVlICY9IH4weDIwOwotCQlwY2lfd3JpdGVfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPmJyaWZfY2ZnLCAodV9pbnQzMl90KSByZF92YWx1ZSk7CisJCXBjaV93cml0ZV8zMigodV9pbnQzMl90ICopICZjb21ldC0+YnJpZl9jZmcsCisJCQkJKHVfaW50MzJfdCkgcmRfdmFsdWUpOwogCQkvKiByZWFkIHRoZSBCUklGIEZyYW1lIFB1bHNlIENvbmZpZ3VyYXRpb24gKi8KLQkJcmRfdmFsdWUgPSAodV9pbnQ4X3QpIHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5icmlmX2ZwY2ZnKTsKKwkJcmRfdmFsdWUgPSAodV9pbnQ4X3QpIHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikKKwkJCQkmY29tZXQtPmJyaWZfZnBjZmcpOwogCQlyZF92YWx1ZSAmPSB+MHgyMDsKLQkJcGNpX3dyaXRlXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5icmlmX2ZwY2ZnLCAodV9pbnQ4X3QpIHJkX3ZhbHVlKTsKKwkJcGNpX3dyaXRlXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5icmlmX2ZwY2ZnLAorCQkJCSh1X2ludDhfdCkgcmRfdmFsdWUpOwogCX0gZWxzZSB7CiAJLyogcmVhZCB0aGUgQlJJRiBDb25maWd1cmF0aW9uICovCiAJcmRfdmFsdWUgPSAodV9pbnQ4X3QpIHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5icmlmX2NmZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2NvbWV0X3RhYmxlcy5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9jb21ldF90YWJsZXMuYwppbmRleCA4NDkzMTExLi5lOTY2NjVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2NvbWV0X3RhYmxlcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvY29tZXRfdGFibGVzLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlICJjb21ldF90YWJsZXMuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2Z1bmN0aW9ucy5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9mdW5jdGlvbnMuYwppbmRleCA5NTIxOGUyOC4uZWU5ZDM5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9mdW5jdGlvbnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2Z1bmN0aW9ucy5jCkBAIC0yNSw3ICsyNSw4IEBACiAjaW5jbHVkZSAicG1jYzQuaCIKIAogI2lmIGRlZmluZWQoQ09ORklHX1NCRV9IRExDX1Y3KSB8fCBkZWZpbmVkKENPTkZJR19TQkVfV0FOMjU2VDNfSERMQ19WNykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX1NCRV9IRExDX1Y3X01PRFVMRSkgfHwgZGVmaW5lZChDT05GSUdfU0JFX1dBTjI1NlQzX0hETENfVjdfTU9EVUxFKQorZGVmaW5lZChDT05GSUdfU0JFX0hETENfVjdfTU9EVUxFKSB8fCBcCitkZWZpbmVkKENPTkZJR19TQkVfV0FOMjU2VDNfSERMQ19WN19NT0RVTEUpCiAjZGVmaW5lIF92N19oZGxjXyAgMQogI2Vsc2UKICNkZWZpbmUgX3Y3X2hkbGNfICAwCkBAIC0zMyw5ICszNCw5IEBACiAKICNpZiBfdjdfaGRsY18KICNkZWZpbmUgVjcoeCkgKHggIyMgX3Y3KQotZXh0ZXJuIGludCAgaGRsY19uZXRpZl9yeF92NyAoaGRsY19kZXZpY2UgKiwgc3RydWN0IHNrX2J1ZmYgKik7Ci1leHRlcm4gaW50ICByZWdpc3Rlcl9oZGxjX2RldmljZV92NyAoaGRsY19kZXZpY2UgKik7Ci1leHRlcm4gaW50ICB1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlX3Y3IChoZGxjX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIGhkbGNfbmV0aWZfcnhfdjcoaGRsY19kZXZpY2UgKiwgc3RydWN0IHNrX2J1ZmYgKik7CitleHRlcm4gaW50ICByZWdpc3Rlcl9oZGxjX2RldmljZV92NyhoZGxjX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIHVucmVnaXN0ZXJfaGRsY19kZXZpY2VfdjcoaGRsY19kZXZpY2UgKik7CiAKICNlbHNlCiAjZGVmaW5lIFY3KHgpIHgKQEAgLTQ3LDU1ICs0OCw1NCBAQAogCiAjZW5kaWYKIAotZXh0ZXJuIGludCAgY3h0MWUxX2xvZ19sZXZlbDsKIGV4dGVybiBpbnQgIGRydnJfc3RhdGU7CiAKIAogI2lmIDEKIHVfaW50MzJfdAotcGNpX3JlYWRfMzIgKHVfaW50MzJfdCAqcCkKK3BjaV9yZWFkXzMyKHVfaW50MzJfdCAqcCkKIHsKICNpZmRlZiBGTE9XX0RFQlVHCi0gICAgdV9pbnQzMl90ICAgdjsKKwl1X2ludDMyX3QgICB2OwogCi0gICAgRkxVU0hfUENJX1JFQUQgKCk7Ci0gICAgdiA9IGxlMzJfdG9fY3B1ICgqcCk7Ci0gICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQotICAgICAgICBwcl9pbmZvKCJwY2lfcmVhZCA6ICV4ID0gJXhcbiIsICh1X2ludDMyX3QpIHAsIHYpOwotICAgIHJldHVybiB2OworCUZMVVNIX1BDSV9SRUFEKCk7CisJdiA9IGxlMzJfdG9fY3B1KCpwKTsKKwlpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCisJCXByX2luZm8oInBjaV9yZWFkIDogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7CisJcmV0dXJuIHY7CiAjZWxzZQotICAgIEZMVVNIX1BDSV9SRUFEICgpOyAgICAgICAgICAgICAgLyogKi8KLSAgICByZXR1cm4gbGUzMl90b19jcHUgKCpwKTsKKwlGTFVTSF9QQ0lfUkVBRCgpOyAgICAgICAgICAgICAgLyogKi8KKwlyZXR1cm4gbGUzMl90b19jcHUoKnApOwogI2VuZGlmCiB9CiAKIHZvaWQKLXBjaV93cml0ZV8zMiAodV9pbnQzMl90ICpwLCB1X2ludDMyX3QgdikKK3BjaV93cml0ZV8zMih1X2ludDMyX3QgKnAsIHVfaW50MzJfdCB2KQogewogI2lmZGVmIEZMT1dfREVCVUcKLSAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCi0gICAgICAgIHByX2luZm8oInBjaV93cml0ZTogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7CisJaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQorCQlwcl9pbmZvKCJwY2lfd3JpdGU6ICV4ID0gJXhcbiIsICh1X2ludDMyX3QpIHAsIHYpOwogI2VuZGlmCi0gICAgKnAgPSBjcHVfdG9fbGUzMiAodik7Ci0gICAgRkxVU0hfUENJX1dSSVRFICgpOyAgICAgICAgICAgICAvKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gcm91dGluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoaWNoIGRvIG11bHRpcGxlIHJlZ2lzdGVyIHdyaXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2hpY2ggdGhlbXNlbHZlcyBuZWVkIGZsdXNoaW5nIGJldHdlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdyaXRlcyBpbiBvcmRlciB0byBndWFyYW50ZWUgd3JpdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9yZGVyaW5nLiAgSXQgaXMgbGVzcyBjb2RlLWN1bWJlcnNvbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIGZsdXNoIGhlcmUtaW4gdGhlbiB0byBpbnZlc3RpZ2F0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGNvZGUgdGhlIG1hbnkgb3RoZXIgcmVnaXN0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdyaXRpbmcgcm91dGluZXMuICovCisJKnAgPSBjcHVfdG9fbGUzMiAodik7CisJRkxVU0hfUENJX1dSSVRFKCk7ICAgICAgICAgICAgIC8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSByb3V0aW5lcworCQkJCQkqIHdoaWNoIGRvIG11bHRpcGxlIHJlZ2lzdGVyIHdyaXRlcworCQkJCQkqIHdoaWNoIHRoZW1zZWx2ZXMgbmVlZCBmbHVzaGluZyBiZXR3ZWVuCisJCQkJCSogd3JpdGVzIGluIG9yZGVyIHRvIGd1YXJhbnRlZSB3cml0ZQorCQkJCQkqIG9yZGVyaW5nLiAgSXQgaXMgbGVzcyBjb2RlLWN1bWJlcnNvbWUKKwkJCQkJKiB0byBmbHVzaCBoZXJlLWluIHRoZW4gdG8gaW52ZXN0aWdhdGUKKwkJCQkJKiBhbmQgY29kZSB0aGUgbWFueSBvdGhlciByZWdpc3RlcgorCQkJCQkqIHdyaXRpbmcgcm91dGluZXMuICovCiB9CiAjZW5kaWYKIAogCiB2b2lkCi1wY2lfZmx1c2hfd3JpdGUgKGNpX3QgKmNpKQorcGNpX2ZsdXNoX3dyaXRlKGNpX3QgKmNpKQogewotICAgIHZvbGF0aWxlIHVfaW50MzJfdCB2OworCXZvbGF0aWxlIHVfaW50MzJfdCB2OwogCiAgICAgLyogaXNzdWUgYSBQQ0kgcmVhZCB0byBmbHVzaCBQQ0kgd3JpdGUgdGhydSBicmlkZ2UgKi8KLSAgICB2ID0gKih1X2ludDMyX3QgKikgJmNpLT5yZWctPmdsY2Q7ICAvKiBhbnkgYWRkcmVzcyB3b3VsZCBkbyAqLworCXYgPSAqKHVfaW50MzJfdCAqKSAmY2ktPnJlZy0+Z2xjZDsgIC8qIGFueSBhZGRyZXNzIHdvdWxkIGRvICovCiAKICAgICAvKgogICAgICAqIHJldHVybiBub3RoaW5nLCB0aGlzIGp1c3QgcmVhZHMgUENJIGJyaWRnZSBpbnRlcmZhY2UgdG8gZmx1c2gKQEAgLTEwNSw1NSArMTA1LDUzIEBACiAKIAogc3RhdGljIHZvaWQKLXdhdGNoZG9nX2Z1bmMgKHVuc2lnbmVkIGxvbmcgYXJnKQord2F0Y2hkb2dfZnVuYyh1bnNpZ25lZCBsb25nIGFyZykKIHsKLSAgICBzdHJ1Y3Qgd2F0Y2hkb2cgKndkID0gKHZvaWQgKikgYXJnOworCXN0cnVjdCB3YXRjaGRvZyAqd2QgPSAodm9pZCAqKSBhcmc7CiAKLSAgICBpZiAoZHJ2cl9zdGF0ZSAhPSBTQkVfRFJWUl9BVkFJTEFCTEUpCi0gICAgewotICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKLSAgICAgICAgICAgIHByX3dhcm5pbmcoIiVzOiBkcnZyIG5vdCBhdmFpbGFibGUgKCV4KVxuIiwgX19mdW5jX18sIGRydnJfc3RhdGUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNjaGVkdWxlX3dvcmsgKCZ3ZC0+d29yayk7Ci0gICAgbW9kX3RpbWVyICgmd2QtPmgsIGppZmZpZXMgKyB3ZC0+dGlja3MpOworCWlmIChkcnZyX3N0YXRlICE9IFNCRV9EUlZSX0FWQUlMQUJMRSkgeworCQlpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKwkJCXByX3dhcm5pbmcoIiVzOiBkcnZyIG5vdCBhdmFpbGFibGUgKCV4KVxuIiwKKwkJCQkgICBfX2Z1bmNfXywgZHJ2cl9zdGF0ZSk7CisJCXJldHVybjsKKwl9CisJc2NoZWR1bGVfd29yaygmd2QtPndvcmspOworCW1vZF90aW1lcigmd2QtPmgsIGppZmZpZXMgKyB3ZC0+dGlja3MpOwogfQogCi1pbnQgT1NfaW5pdF93YXRjaGRvZyhzdHJ1Y3Qgd2F0Y2hkb2cgKndkcCwgdm9pZCAoKmYpICh2b2lkICopLCB2b2lkICpjLCBpbnQgdXNlYykKK2ludCBPU19pbml0X3dhdGNoZG9nKHN0cnVjdCB3YXRjaGRvZyAqd2RwLCB2b2lkICgqZikgKHZvaWQgKiksCisJCSAgICAgdm9pZCAqYywgaW50IHVzZWMpCiB7Ci0gICAgd2RwLT5mdW5jID0gZjsKLSAgICB3ZHAtPnNvZnRjID0gYzsKLSAgICB3ZHAtPnRpY2tzID0gKEhaKSAqICh1c2VjIC8gMTAwMCkgLyAxMDAwOwotICAgIElOSVRfV09SSygmd2RwLT53b3JrLCAodm9pZCAqKWYpOwotICAgIGluaXRfdGltZXIgKCZ3ZHAtPmgpOwotICAgIHsKLSAgICAgICAgY2lfdCAgICAgICAqY2kgPSAoY2lfdCAqKSBjOworCXdkcC0+ZnVuYyA9IGY7CisJd2RwLT5zb2Z0YyA9IGM7CisJd2RwLT50aWNrcyA9IChIWikgKiAodXNlYyAvIDEwMDApIC8gMTAwMDsKKwlJTklUX1dPUksoJndkcC0+d29yaywgKHZvaWQgKilmKTsKKwlpbml0X3RpbWVyKCZ3ZHAtPmgpOworCXsKKwkJY2lfdCAgICAgICAqY2kgPSAoY2lfdCAqKSBjOwogCi0gICAgICAgIHdkcC0+aC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZjaS0+d2Q7Ci0gICAgfQotICAgIHdkcC0+aC5mdW5jdGlvbiA9IHdhdGNoZG9nX2Z1bmM7Ci0gICAgcmV0dXJuIDA7CisJCXdkcC0+aC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZjaS0+d2Q7CisJfQorCXdkcC0+aC5mdW5jdGlvbiA9IHdhdGNoZG9nX2Z1bmM7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQKLU9TX3V3YWl0IChpbnQgdXNlYywgY2hhciAqZGVzY3JpcHRpb24pCitPU191d2FpdChpbnQgdXNlYywgY2hhciAqZGVzY3JpcHRpb24pCiB7Ci0gICAgaW50ICAgICAgICAgdG1wOworCWludCAgICAgICAgIHRtcDsKIAotICAgIGlmICh1c2VjID49IDEwMDApCi0gICAgewotICAgICAgICBtZGVsYXkgKHVzZWMgLyAxMDAwKTsKLSAgICAgICAgLyogbm93IGRlbGF5IHJlc2lkdWFsICovCi0gICAgICAgIHRtcCA9ICh1c2VjIC8gMTAwMCkgKiAxMDAwOyAvKiByb3VuZCAqLwotICAgICAgICB0bXAgPSB1c2VjIC0gdG1wOyAgICAgICAgICAgLyogcmVzaWR1YWwgKi8KLSAgICAgICAgaWYgKHRtcCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdhaXQgb24gcmVzaWR1YWwgKi8KLSAgICAgICAgICAgIHVkZWxheSAodG1wKTsKLSAgICAgICAgfQotICAgIH0gZWxzZQotICAgIHsKLSAgICAgICAgdWRlbGF5ICh1c2VjKTsKLSAgICB9CisJaWYgKHVzZWMgPj0gMTAwMCkgeworCQltZGVsYXkodXNlYyAvIDEwMDApOworCQkvKiBub3cgZGVsYXkgcmVzaWR1YWwgKi8KKwkJdG1wID0gKHVzZWMgLyAxMDAwKSAqIDEwMDA7IC8qIHJvdW5kICovCisJCXRtcCA9IHVzZWMgLSB0bXA7ICAgICAgICAgICAvKiByZXNpZHVhbCAqLworCQlpZiAodG1wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2FpdCBvbiByZXNpZHVhbCAqLworCQkJdWRlbGF5KHRtcCk7CisJCX0KKwl9IGVsc2UgeworCQl1ZGVsYXkodXNlYyk7CisJfQogfQogCiAvKiBkdW1teSBzaG9ydCBkZWxheSByb3V0aW5lIGNhbGxlZCBhcyBhIHN1YnJvdXRpbmUgc28gdGhhdCBjb21waWxlcgpAQCAtMTYxLDk2ICsxNTksOTUgQEAKICAqLwogCiB2b2lkCi1PU191d2FpdF9kdW1teSAodm9pZCkKK09TX3V3YWl0X2R1bW15KHZvaWQpCiB7CiAjaWZuZGVmIFVTRV9NQVhfSU5UX0RFTEFZCi0gICAgZHVtbXkrKzsKKwlkdW1teSsrOwogI2Vsc2UKLSAgICB1ZGVsYXkgKDEpOworCXVkZWxheSgxKTsKICNlbmRpZgogfQogCiAKIHZvaWQKLU9TX3NlbV9pbml0ICh2b2lkICpzZW0sIGludCBzdGF0ZSkKK09TX3NlbV9pbml0KHZvaWQgKnNlbSwgaW50IHN0YXRlKQogewotICAgIHN3aXRjaCAoc3RhdGUpCi0gICAgewotICAgICAgICBjYXNlIFNFTV9UQUtFTjoKLQkJc2VtYV9pbml0KChzdHJ1Y3Qgc2VtYXBob3JlICopIHNlbSwgMCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU0VNX0FWQUlMQUJMRToKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTRU1fVEFLRU46CisJICAgIHNlbWFfaW5pdCgoc3RydWN0IHNlbWFwaG9yZSAqKSBzZW0sIDApOworCSAgICBicmVhazsKKwljYXNlIFNFTV9BVkFJTEFCTEU6CiAJICAgIHNlbWFfaW5pdCgoc3RydWN0IHNlbWFwaG9yZSAqKSBzZW0sIDEpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIC8qIG90aGVyd2lzZSwgc2V0IHNlbS5jb3VudCB0byBzdGF0ZSdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB2YWx1ZSAqLwotICAgICAgICBzZW1hX2luaXQgKHNlbSwgc3RhdGUpOwotICAgICAgICBicmVhazsKLSAgICB9CisJICAgIGJyZWFrOworCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlLCBzZXQgc2VtLmNvdW50IHRvIHN0YXRlJ3MKKwkJCQkJKiB2YWx1ZSAqLworCSAgICBzZW1hX2luaXQoc2VtLCBzdGF0ZSk7CisJICAgIGJyZWFrOworCX0KIH0KIAogCiBpbnQKLXNkX2xpbmVfaXNfb2sgKHZvaWQgKnVzZXIpCitzZF9saW5lX2lzX29rKHZvaWQgKnVzZXIpCiB7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgdXNlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSB1c2VyOwogCi0gICAgcmV0dXJuIG5ldGlmX2NhcnJpZXJfb2sgKG5kZXYpOworCXJldHVybiBuZXRpZl9jYXJyaWVyX29rKG5kZXYpOwogfQogCiB2b2lkCi1zZF9saW5lX2lzX3VwICh2b2lkICp1c2VyKQorc2RfbGluZV9pc191cCh2b2lkICp1c2VyKQogewotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHVzZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgdXNlcjsKIAotICAgIG5ldGlmX2NhcnJpZXJfb24gKG5kZXYpOwotICAgIHJldHVybjsKKwluZXRpZl9jYXJyaWVyX29uKG5kZXYpOworCXJldHVybjsKIH0KIAogdm9pZAotc2RfbGluZV9pc19kb3duICh2b2lkICp1c2VyKQorc2RfbGluZV9pc19kb3duKHZvaWQgKnVzZXIpCiB7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgdXNlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSB1c2VyOwogCi0gICAgbmV0aWZfY2Fycmllcl9vZmYgKG5kZXYpOwotICAgIHJldHVybjsKKwluZXRpZl9jYXJyaWVyX29mZihuZGV2KTsKKwlyZXR1cm47CiB9CiAKIHZvaWQKLXNkX2Rpc2FibGVfeG1pdCAodm9pZCAqdXNlcikKK3NkX2Rpc2FibGVfeG1pdCh2b2lkICp1c2VyKQogewotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgdXNlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHVzZXI7CiAKLSAgICBuZXRpZl9zdG9wX3F1ZXVlIChkZXYpOwotICAgIHJldHVybjsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJcmV0dXJuOwogfQogCiB2b2lkCi1zZF9lbmFibGVfeG1pdCAodm9pZCAqdXNlcikKK3NkX2VuYWJsZV94bWl0KHZvaWQgKnVzZXIpCiB7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSB1c2VyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgdXNlcjsKIAotICAgIG5ldGlmX3dha2VfcXVldWUgKGRldik7Ci0gICAgcmV0dXJuOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlyZXR1cm47CiB9CiAKIGludAotc2RfcXVldWVfc3RvcHBlZCAodm9pZCAqdXNlcikKK3NkX3F1ZXVlX3N0b3BwZWQodm9pZCAqdXNlcikKIHsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSB1c2VyOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHVzZXI7CiAKLSAgICByZXR1cm4gbmV0aWZfcXVldWVfc3RvcHBlZCAobmRldik7CisJcmV0dXJuIG5ldGlmX3F1ZXVlX3N0b3BwZWQobmRldik7CiB9CiAKIHZvaWQgc2RfcmVjdl9jb25zdW1lKHZvaWQgKnRva2VuLCBzaXplX3QgbGVuLCB2b2lkICp1c2VyKQogewotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gdXNlcjsKLSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdG9rZW47CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSB1c2VyOworCXN0cnVjdCBza19idWZmICpza2IgPSB0b2tlbjsKIAotICAgIHNrYi0+ZGV2ID0gbmRldjsKLSAgICBza2JfcHV0IChza2IsIGxlbik7Ci0gICAgc2tiLT5wcm90b2NvbCA9IGhkbGNfdHlwZV90cmFucyhza2IsIG5kZXYpOwotICAgIG5ldGlmX3J4KHNrYik7CisJc2tiLT5kZXYgPSBuZGV2OworCXNrYl9wdXQoc2tiLCBsZW4pOworCXNrYi0+cHJvdG9jb2wgPSBoZGxjX3R5cGVfdHJhbnMoc2tiLCBuZGV2KTsKKwluZXRpZl9yeChza2IpOwogfQogCiAKQEAgLTI2Myw4NiArMjYwLDc2IEBACiAKIGV4dGVybiBjaV90ICpDSTsgICAgICAgICAgICAgICAgLyogZHVtbXkgcG9pbnRlciB0byBib2FyZCBaRVJPJ3MgZGF0YSAqLwogdm9pZAotVk1FVFJPX1RSQUNFICh2b2lkICp4KQorVk1FVFJPX1RSSUdHRVIoY2lfdCAqY2ksIGludCB4KQogewotICAgIHVfaW50MzJfdCAgIHkgPSAodV9pbnQzMl90KSB4OworCXN0cnVjdCBzX2NvbWV0X3JlZyAgICAqY29tZXQ7CisJdm9sYXRpbGUgdV9pbnQzMl90IGRhdGE7CiAKLSAgICBwY2lfd3JpdGVfMzIgKCh1X2ludDMyX3QgKikgJkNJLT5jcGxkYmFzZS0+bGVkcywgeSk7Ci19CisJY29tZXQgPSBjaS0+cG9ydFswXS5jb21ldGJhc2U7ICAvKiBkZWZhdWx0IHRvIENPTUVUICMgMCAqLwogCi0KLXZvaWQKLVZNRVRST19UUklHR0VSIChjaV90ICpjaSwgaW50IHgpCi17Ci0gICAgc3RydWN0IHNfY29tZXRfcmVnICAgICpjb21ldDsKLSAgICB2b2xhdGlsZSB1X2ludDMyX3QgZGF0YTsKLQotICAgIGNvbWV0ID0gY2ktPnBvcnRbMF0uY29tZXRiYXNlOyAgLyogZGVmYXVsdCB0byBDT01FVCAjIDAgKi8KLQotICAgIHN3aXRjaCAoeCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzMjQpOyAgICAgLyogMHg5MCAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzMjUpOyAgICAgLyogMHg5NCAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzMjYpOyAgICAgLyogMHg5OCAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzMjcpOyAgICAgLyogMHg5QyAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzODgpOyAgICAgLyogMHgyMjAgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlczg5KTsgICAgIC8qIDB4MjI0ICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNjoKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXM4QSk7ICAgICAvKiAweDIyOCAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDc6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzOEIpOyAgICAgLyogMHgyMkMgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlc0EwKTsgICAgIC8qIDB4MjgwICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgOToKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXNBMSk7ICAgICAvKiAweDI4NCAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDEwOgotICAgICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlc0EyKTsgICAgIC8qIDB4Mjg4ICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTE6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzQTMpOyAgICAgLyogMHgyOEMgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjoKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXNBNCk7ICAgICAvKiAweDI5MCAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDEzOgotICAgICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlc0E1KTsgICAgIC8qIDB4Mjk0ICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTQ6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzQTYpOyAgICAgLyogMHgyOTggKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNToKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXNBNyk7ICAgICAvKiAweDI5QyAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlczc0KTsgICAgIC8qIDB4MUQwICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTc6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzNzUpOyAgICAgLyogMHgxRDQgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxODoKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXM3Nik7ICAgICAvKiAweDFEOCAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE5OgotICAgICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlczc3KTsgICAgIC8qIDB4MURDICovCi0gICAgICAgIGJyZWFrOwotICAgIH0KKwlzd2l0Y2ggKHgpIHsKKwlkZWZhdWx0OgorCWNhc2UgMDoKKwkgICAgZGF0YSA9IHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3JlczI0KTsgICAgIC8qIDB4OTAgKi8KKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzMjUpOyAgICAgLyogMHg5NCAqLworCSAgICBicmVhazsKKwljYXNlIDI6CisJICAgIGRhdGEgPSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+X19yZXMyNik7ICAgICAvKiAweDk4ICovCisJICAgIGJyZWFrOworCWNhc2UgMzoKKwkgICAgZGF0YSA9IHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3JlczI3KTsgICAgIC8qIDB4OUMgKi8KKwkgICAgYnJlYWs7CisJY2FzZSA0OgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzODgpOyAgICAgLyogMHgyMjAgKi8KKwkgICAgYnJlYWs7CisJY2FzZSA1OgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzODkpOyAgICAgLyogMHgyMjQgKi8KKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzOEEpOyAgICAgLyogMHgyMjggKi8KKwkgICAgYnJlYWs7CisJY2FzZSA3OgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzOEIpOyAgICAgLyogMHgyMkMgKi8KKwkgICAgYnJlYWs7CisJY2FzZSA4OgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzQTApOyAgICAgLyogMHgyODAgKi8KKwkgICAgYnJlYWs7CisJY2FzZSA5OgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzQTEpOyAgICAgLyogMHgyODQgKi8KKwkgICAgYnJlYWs7CisJY2FzZSAxMDoKKwkgICAgZGF0YSA9IHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlc0EyKTsgICAgIC8qIDB4Mjg4ICovCisJICAgIGJyZWFrOworCWNhc2UgMTE6CisJICAgIGRhdGEgPSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+X19yZXNBMyk7ICAgICAvKiAweDI4QyAqLworCSAgICBicmVhazsKKwljYXNlIDEyOgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzQTQpOyAgICAgLyogMHgyOTAgKi8KKwkgICAgYnJlYWs7CisJY2FzZSAxMzoKKwkgICAgZGF0YSA9IHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlc0E1KTsgICAgIC8qIDB4Mjk0ICovCisJICAgIGJyZWFrOworCWNhc2UgMTQ6CisJICAgIGRhdGEgPSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+X19yZXNBNik7ICAgICAvKiAweDI5OCAqLworCSAgICBicmVhazsKKwljYXNlIDE1OgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzQTcpOyAgICAgLyogMHgyOUMgKi8KKwkgICAgYnJlYWs7CisJY2FzZSAxNjoKKwkgICAgZGF0YSA9IHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlczc0KTsgICAgIC8qIDB4MUQwICovCisJICAgIGJyZWFrOworCWNhc2UgMTc6CisJICAgIGRhdGEgPSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+X19yZXM3NSk7ICAgICAvKiAweDFENCAqLworCSAgICBicmVhazsKKwljYXNlIDE4OgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzNzYpOyAgICAgLyogMHgxRDggKi8KKwkgICAgYnJlYWs7CisJY2FzZSAxOToKKwkgICAgZGF0YSA9IHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlczc3KTsgICAgIC8qIDB4MURDICovCisJICAgIGJyZWFrOworCX0KIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2h3cHJvYmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvaHdwcm9iZS5jCmluZGV4IDAyYjRmOGYuLjliNDE5OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvaHdwcm9iZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvaHdwcm9iZS5jCkBAIC0zMSwzNjAgKzMxLDM1MiBAQAogI2luY2x1ZGUgInNiZXByb2MuaCIKICNlbmRpZgogCi1leHRlcm4gaW50ICBjeHQxZTFfbG9nX2xldmVsOwogZXh0ZXJuIGludCAgZXJyb3JfZmxhZzsKIGV4dGVybiBpbnQgIGRydnJfc3RhdGU7CiAKIC8qIGZvcndhcmQgcmVmZXJlbmNlcyAqLwotdm9pZCAgICAgICAgYzRfc3RvcHdkIChjaV90ICopOwotc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgYzRfYWRkX2RldiAoaGR3X2luZm9fdCAqLCBpbnQsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGludCwgaW50KTsKK3ZvaWQgICAgICAgIGM0X3N0b3B3ZChjaV90ICopOworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgYzRfYWRkX2RldihoZHdfaW5mb190ICosIGludCwgdW5zaWduZWQgbG9uZywKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nLCBpbnQsIGludCk7CiAKIAogc3RydWN0IHNfaGR3X2luZm8gaGR3X2luZm9bTUFYX0JPQVJEU107CiAKIAotdm9pZCAgICAgICAgX19pbml0Ci1zaG93X3R3byAoaGR3X2luZm9fdCAqaGksIGludCBicmRubykKK3ZvaWQgX19pbml0CitzaG93X3R3byhoZHdfaW5mb190ICpoaSwgaW50IGJyZG5vKQogewotICAgIGNpX3QgICAgICAgKmNpOwotICAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2OwotICAgIGNoYXIgICAgICAgKmJpZDsKLSAgICBjaGFyICAgICAgICpicCwgYmFubmVyWzgwXTsKLSAgICBjaGFyICAgICAgICBzbls2XTsKKwljaV90ICAgICAgICpjaTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwljaGFyICAgICAgICpiaWQ7CisJY2hhciAgICAgICBiYW5uZXJbODBdOworCWNoYXIJc25bNl0gPSB7MCx9OwogCi0gICAgYnAgPSBiYW5uZXI7Ci0gICAgbWVtc2V0IChiYW5uZXIsIDAsIDgwKTsgICAgICAgICAvKiBjbGVhciBwcmludCBidWZmZXIgKi8KKwljaSA9IChjaV90ICopKG5ldGRldl9wcml2KGhpLT5uZGV2KSk7CisJYmlkID0gc2JlaWRfZ2V0X2JkbmFtZShjaSk7CisJc3dpdGNoIChoaS0+cHJvbWZtdCkgeworCWNhc2UgUFJPTV9GT1JNQVRfVFlQRTE6CisJCW1lbWNweShzbiwgaGktPm1mZ19pbmZvLnBmdDEuU2VyaWFsLCA2KTsKKwkJYnJlYWs7CisJY2FzZSBQUk9NX0ZPUk1BVF9UWVBFMjoKKwkJbWVtY3B5KHNuLCBoaS0+bWZnX2luZm8ucGZ0Mi5TZXJpYWwsIDYpOworCQlicmVhazsKKwl9CiAKLSAgICBjaSA9IChjaV90ICopKG5ldGRldl9wcml2KGhpLT5uZGV2KSk7Ci0gICAgYmlkID0gc2JlaWRfZ2V0X2JkbmFtZSAoY2kpOwotICAgIHN3aXRjaCAoaGktPnByb21mbXQpCi0gICAgewotICAgIGNhc2UgUFJPTV9GT1JNQVRfVFlQRTE6Ci0gICAgICAgIG1lbWNweSAoc24sIChGTERfVFlQRTEgKikgKGhpLT5tZmdfaW5mby5wZnQxLlNlcmlhbCksIDYpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBST01fRk9STUFUX1RZUEUyOgotICAgICAgICBtZW1jcHkgKHNuLCAoRkxEX1RZUEUyICopIChoaS0+bWZnX2luZm8ucGZ0Mi5TZXJpYWwpLCA2KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgbWVtc2V0IChzbiwgMCwgNik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KKwlzcHJpbnRmKGJhbm5lciwgIiVzOiAlcyAgUy9OICUwNlgsIE1VU1lDQyBSZXYgJTAyWCIsCisJCWhpLT5kZXZuYW1lLCBiaWQsCisJCSgoc25bM10gPDwgMTYpICYgMHhmZjAwMDApIHwKKwkJKChzbls0XSA8PCA4KSAmIDB4MDBmZjAwKSB8CisJCShzbls1XSAmIDB4MDAwMGZmKSwKKwkJKHVfaW50OF90KSBoaS0+cmV2aWRbMF0pOwogCi0gICAgc3ByaW50ZiAoYmFubmVyLCAiJXM6ICVzICBTL04gJTA2WCwgTVVTWUNDIFJldiAlMDJYIiwKLSAgICAgICAgICAgICBoaS0+ZGV2bmFtZSwgYmlkLAotICAgICAgICAgICAgICgoc25bM10gPDwgMTYpICYgMHhmZjAwMDApIHwKLSAgICAgICAgICAgICAgKChzbls0XSA8PCA4KSAmIDB4MDBmZjAwKSB8Ci0gICAgICAgICAgICAgIChzbls1XSAmIDB4MDAwMGZmKSwKLSAgICAgICAgICAgICAodV9pbnQ4X3QpIGhpLT5yZXZpZFswXSk7CisJcHJfaW5mbygiJXNcbiIsIGJhbm5lcik7CiAKLSAgICBwcl9pbmZvKCIlc1xuIiwgYmFubmVyKTsKKwlwZGV2ID0gaGktPnBkZXZbMF07CisJcHJfaW5mbygiJXM6ICVzIGF0IHYvcD0lbHgvJWx4ICglMDJ4OiUwMnguJXgpIGlycSAlZFxuIiwKKwkJaGktPmRldm5hbWUsICJNVVNZQ0MiLAorCQkodW5zaWduZWQgbG9uZykgaGktPmFkZHJfbWFwcGVkWzBdLCBoaS0+YWRkclswXSwKKwkJaGktPnBjaV9idXNubywgKHVfaW50OF90KSBQQ0lfU0xPVChwZGV2LT5kZXZmbiksCisJCSh1X2ludDhfdCkgUENJX0ZVTkMocGRldi0+ZGV2Zm4pLCBwZGV2LT5pcnEpOwogCi0gICAgcGRldiA9IGhpLT5wZGV2WzBdOwotICAgIHByX2luZm8oIiVzOiAlcyBhdCB2L3A9JWx4LyVseCAoJTAyeDolMDJ4LiV4KSBpcnEgJWRcbiIsCi0gICAgICAgICAgICBoaS0+ZGV2bmFtZSwgIk1VU1lDQyIsCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZykgaGktPmFkZHJfbWFwcGVkWzBdLCBoaS0+YWRkclswXSwKLSAgICAgICAgICAgIGhpLT5wY2lfYnVzbm8sICh1X2ludDhfdCkgUENJX1NMT1QgKHBkZXYtPmRldmZuKSwKLSAgICAgICAgICAgICh1X2ludDhfdCkgUENJX0ZVTkMgKHBkZXYtPmRldmZuKSwgcGRldi0+aXJxKTsKLQotICAgIHBkZXYgPSBoaS0+cGRldlsxXTsKLSAgICBwcl9pbmZvKCIlczogJXMgYXQgdi9wPSVseC8lbHggKCUwMng6JTAyeC4leCkgaXJxICVkXG4iLAotICAgICAgICAgICAgaGktPmRldm5hbWUsICJFQlVTICAiLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGhpLT5hZGRyX21hcHBlZFsxXSwgaGktPmFkZHJbMV0sCi0gICAgICAgICAgICBoaS0+cGNpX2J1c25vLCAodV9pbnQ4X3QpIFBDSV9TTE9UIChwZGV2LT5kZXZmbiksCi0gICAgICAgICAgICAodV9pbnQ4X3QpIFBDSV9GVU5DIChwZGV2LT5kZXZmbiksIHBkZXYtPmlycSk7CisJcGRldiA9IGhpLT5wZGV2WzFdOworCXByX2luZm8oIiVzOiAlcyBhdCB2L3A9JWx4LyVseCAoJTAyeDolMDJ4LiV4KSBpcnEgJWRcbiIsCisJCWhpLT5kZXZuYW1lLCAiRUJVUyAgIiwKKwkJKHVuc2lnbmVkIGxvbmcpIGhpLT5hZGRyX21hcHBlZFsxXSwgaGktPmFkZHJbMV0sCisJCWhpLT5wY2lfYnVzbm8sICh1X2ludDhfdCkgUENJX1NMT1QocGRldi0+ZGV2Zm4pLAorCQkodV9pbnQ4X3QpIFBDSV9GVU5DKHBkZXYtPmRldmZuKSwgcGRldi0+aXJxKTsKIH0KIAogCi12b2lkICAgICAgICBfX2luaXQKLWhkd19zbl9nZXQgKGhkd19pbmZvX3QgKmhpLCBpbnQgYnJkbm8pCit2b2lkIF9faW5pdAoraGR3X3NuX2dldChoZHdfaW5mb190ICpoaSwgaW50IGJyZG5vKQogewotICAgIC8qIG9idGFpbiBoYXJkd2FyZSBFRVBST00gaW5mb3JtYXRpb24gKi8KLSAgICBsb25nICAgICAgICBhZGRyOworCS8qIG9idGFpbiBoYXJkd2FyZSBFRVBST00gaW5mb3JtYXRpb24gKi8KKwlsb25nICAgICAgICBhZGRyOwogCi0gICAgYWRkciA9IChsb25nKSBoaS0+YWRkcl9tYXBwZWRbMV0gKyBFRVBST01fT0ZGU0VUOworCWFkZHIgPSAobG9uZykgaGktPmFkZHJfbWFwcGVkWzFdICsgRUVQUk9NX09GRlNFVDsKIAotICAgIC8qIHJlYWQgRUVQUk9NIHdpdGggbGFyZ2VzdCBrbm93biBmb3JtYXQgc2l6ZS4uLiAqLwotICAgIHBtY19lZXByb21fcmVhZF9idWZmZXIgKGFkZHIsIDAsIChjaGFyICopIGhpLT5tZmdfaW5mby5kYXRhLCBzaXplb2YgKEZMRF9UWVBFMikpOworCS8qIHJlYWQgRUVQUk9NIHdpdGggbGFyZ2VzdCBrbm93biBmb3JtYXQgc2l6ZS4uLiAqLworCXBtY19lZXByb21fcmVhZF9idWZmZXIoYWRkciwgMCwgKGNoYXIgKiloaS0+bWZnX2luZm8uZGF0YSwKKwkJCSAgICAgICBzaXplb2YoRkxEX1RZUEUyKSk7CiAKICNpZiAwCi0gICAgewotICAgICAgICB1bnNpZ25lZCBjaGFyICp1Y3AgPSAodW5zaWduZWQgY2hhciAqKSAmaGktPm1mZ19pbmZvLmRhdGE7CisJeworCQl1bnNpZ25lZCBjaGFyICp1Y3AgPSAodW5zaWduZWQgY2hhciAqKSAmaGktPm1mZ19pbmZvLmRhdGE7CiAKLSAgICAgICAgcHJfaW5mbygiZWVwcm9tWzAwXTogICUwMnggJTAyeCAlMDJ4ICUwMnggICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCi0gICAgICAgICAgICAgICAgKih1Y3AgKyAwKSwgKih1Y3AgKyAxKSwgKih1Y3AgKyAyKSwgKih1Y3AgKyAzKSwgKih1Y3AgKyA0KSwgKih1Y3AgKyA1KSwgKih1Y3AgKyA2KSwgKih1Y3AgKyA3KSk7Ci0gICAgICAgIHByX2luZm8oImVlcHJvbVswOF06ICAlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAotICAgICAgICAgICAgICAgICoodWNwICsgOCksICoodWNwICsgOSksICoodWNwICsgMTApLCAqKHVjcCArIDExKSwgKih1Y3AgKyAxMiksICoodWNwICsgMTMpLCAqKHVjcCArIDE0KSwgKih1Y3AgKyAxNSkpOwotICAgICAgICBwcl9pbmZvKCJlZXByb21bMTZdOiAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLSAgICAgICAgICAgICAgICAqKHVjcCArIDE2KSwgKih1Y3AgKyAxNyksICoodWNwICsgMTgpLCAqKHVjcCArIDE5KSwgKih1Y3AgKyAyMCksICoodWNwICsgMjEpLCAqKHVjcCArIDIyKSwgKih1Y3AgKyAyMykpOwotICAgICAgICBwcl9pbmZvKCJlZXByb21bMjRdOiAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLSAgICAgICAgICAgICAgICAqKHVjcCArIDI0KSwgKih1Y3AgKyAyNSksICoodWNwICsgMjYpLCAqKHVjcCArIDI3KSwgKih1Y3AgKyAyOCksICoodWNwICsgMjkpLCAqKHVjcCArIDMwKSwgKih1Y3AgKyAzMSkpOwotICAgICAgICBwcl9pbmZvKCJlZXByb21bMzJdOiAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLSAgICAgICAgICAgICAgICAqKHVjcCArIDMyKSwgKih1Y3AgKyAzMyksICoodWNwICsgMzQpLCAqKHVjcCArIDM1KSwgKih1Y3AgKyAzNiksICoodWNwICsgMzcpLCAqKHVjcCArIDM4KSwgKih1Y3AgKyAzOSkpOwotICAgICAgICBwcl9pbmZvKCJlZXByb21bNDBdOiAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLSAgICAgICAgICAgICAgICAqKHVjcCArIDQwKSwgKih1Y3AgKyA0MSksICoodWNwICsgNDIpLCAqKHVjcCArIDQzKSwgKih1Y3AgKyA0NCksICoodWNwICsgNDUpLCAqKHVjcCArIDQ2KSwgKih1Y3AgKyA0NykpOwotICAgIH0KKwkJcHJfaW5mbygiZWVwcm9tWzAwXTogICUwMnggJTAyeCAlMDJ4ICUwMnggICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkqKHVjcCArIDApLCAqKHVjcCArIDEpLCAqKHVjcCArIDIpLCAqKHVjcCArIDMpLAorCQkJKih1Y3AgKyA0KSwgKih1Y3AgKyA1KSwgKih1Y3AgKyA2KSwgKih1Y3AgKyA3KSk7CisJCXByX2luZm8oImVlcHJvbVswOF06ICAlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJKih1Y3AgKyA4KSwgKih1Y3AgKyA5KSwgKih1Y3AgKyAxMCksICoodWNwICsgMTEpLAorCQkJKih1Y3AgKyAxMiksICoodWNwICsgMTMpLCAqKHVjcCArIDE0KSwgKih1Y3AgKyAxNSkpOworCQlwcl9pbmZvKCJlZXByb21bMTZdOiAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCSoodWNwICsgMTYpLCAqKHVjcCArIDE3KSwgKih1Y3AgKyAxOCksICoodWNwICsgMTkpLAorCQkJKih1Y3AgKyAyMCksICoodWNwICsgMjEpLCAqKHVjcCArIDIyKSwgKih1Y3AgKyAyMykpOworCQlwcl9pbmZvKCJlZXByb21bMjRdOiAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCSoodWNwICsgMjQpLCAqKHVjcCArIDI1KSwgKih1Y3AgKyAyNiksICoodWNwICsgMjcpLAorCQkJKih1Y3AgKyAyOCksICoodWNwICsgMjkpLCAqKHVjcCArIDMwKSwgKih1Y3AgKyAzMSkpOworCQlwcl9pbmZvKCJlZXByb21bMzJdOiAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCSoodWNwICsgMzIpLCAqKHVjcCArIDMzKSwgKih1Y3AgKyAzNCksICoodWNwICsgMzUpLAorCQkJKih1Y3AgKyAzNiksICoodWNwICsgMzcpLCAqKHVjcCArIDM4KSwgKih1Y3AgKyAzOSkpOworCQlwcl9pbmZvKCJlZXByb21bNDBdOiAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCSoodWNwICsgNDApLCAqKHVjcCArIDQxKSwgKih1Y3AgKyA0MiksICoodWNwICsgNDMpLAorCQkJKih1Y3AgKyA0NCksICoodWNwICsgNDUpLCAqKHVjcCArIDQ2KSwgKih1Y3AgKyA0NykpOworCX0KICNlbmRpZgogI2lmIDAKLSAgICBwcl9pbmZvKCJzbjogJXggJXggJXggJXggJXggJXhcbiIsCi0gICAgICAgICAgICBoaS0+bWZnX2luZm8uU2VyaWFsWzBdLAotICAgICAgICAgICAgaGktPm1mZ19pbmZvLlNlcmlhbFsxXSwKLSAgICAgICAgICAgIGhpLT5tZmdfaW5mby5TZXJpYWxbMl0sCi0gICAgICAgICAgICBoaS0+bWZnX2luZm8uU2VyaWFsWzNdLAotICAgICAgICAgICAgaGktPm1mZ19pbmZvLlNlcmlhbFs0XSwKLSAgICAgICAgICAgIGhpLT5tZmdfaW5mby5TZXJpYWxbNV0pOworCXByX2luZm8oInNuOiAleCAleCAleCAleCAleCAleFxuIiwKKwkJCWhpLT5tZmdfaW5mby5TZXJpYWxbMF0sCisJCQloaS0+bWZnX2luZm8uU2VyaWFsWzFdLAorCQkJaGktPm1mZ19pbmZvLlNlcmlhbFsyXSwKKwkJCWhpLT5tZmdfaW5mby5TZXJpYWxbM10sCisJCQloaS0+bWZnX2luZm8uU2VyaWFsWzRdLAorCQkJaGktPm1mZ19pbmZvLlNlcmlhbFs1XSk7CiAjZW5kaWYKIAotICAgIGlmICgoaGktPnByb21mbXQgPSBwbWNfdmVyaWZ5X2Nrc3VtICgmaGktPm1mZ19pbmZvLmRhdGEpKSA9PSBQUk9NX0ZPUk1BVF9VbmspCi0gICAgewotICAgICAgICAvKiBiYWQgY3JjLCBkYXRhIGlzIHN1c3BlY3QgKi8KLSAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pCi0gICAgICAgICAgICBwcl9pbmZvKCIlczogRUVQUk9NIGNrc3VtIGVycm9yXG4iLCBoaS0+ZGV2bmFtZSk7Ci0gICAgICAgIGhpLT5tZmdfaW5mb19zdHMgPSBFRVBST01fQ1JDRVJSOwotICAgIH0gZWxzZQotICAgICAgICBoaS0+bWZnX2luZm9fc3RzID0gRUVQUk9NX09LOworCWhpLT5wcm9tZm10ID0gcG1jX3ZlcmlmeV9ja3N1bSgmaGktPm1mZ19pbmZvLmRhdGEpOworCWlmIChoaS0+cHJvbWZtdCA9PSBQUk9NX0ZPUk1BVF9VbmspIHsKKwkJLyogYmFkIGNyYywgZGF0YSBpcyBzdXNwZWN0ICovCisJCWlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19XQVJOKQorCQkJcHJfaW5mbygiJXM6IEVFUFJPTSBja3N1bSBlcnJvclxuIiwgaGktPmRldm5hbWUpOworCQloaS0+bWZnX2luZm9fc3RzID0gRUVQUk9NX0NSQ0VSUjsKKwl9IGVsc2UKKwkJaGktPm1mZ19pbmZvX3N0cyA9IEVFUFJPTV9PSzsKIH0KIAogCi12b2lkICAgICAgICBfX2luaXQKLXByZXBfaGR3X2luZm8gKHZvaWQpCisJdm9pZCBfX2luaXQKK3ByZXBfaGR3X2luZm8odm9pZCkKIHsKLSAgICBoZHdfaW5mb190ICpoaTsKLSAgICBpbnQgICAgICAgICBpOworCWhkd19pbmZvX3QgKmhpOworCWludCAgICAgICAgIGk7CiAKLSAgICBmb3IgKGkgPSAwLCBoaSA9IGhkd19pbmZvOyBpIDwgTUFYX0JPQVJEUzsgaSsrLCBoaSsrKQotICAgIHsKLSAgICAgICAgaGktPnBjaV9idXNubyA9IDB4ZmY7Ci0gICAgICAgIGhpLT5wY2lfc2xvdCA9IDB4ZmY7Ci0gICAgICAgIGhpLT5wY2lfcGluWzBdID0gMDsKLSAgICAgICAgaGktPnBjaV9waW5bMV0gPSAwOwotICAgICAgICBoaS0+bmRldiA9IE5VTEw7Ci0gICAgICAgIGhpLT5hZGRyWzBdID0gMEw7Ci0gICAgICAgIGhpLT5hZGRyWzFdID0gMEw7Ci0gICAgICAgIGhpLT5hZGRyX21hcHBlZFswXSA9IDBMOwotICAgICAgICBoaS0+YWRkcl9tYXBwZWRbMV0gPSAwTDsKLSAgICB9CisJZm9yIChpID0gMCwgaGkgPSBoZHdfaW5mbzsgaSA8IE1BWF9CT0FSRFM7IGkrKywgaGkrKykgeworCQloaS0+cGNpX2J1c25vID0gMHhmZjsKKwkJaGktPnBjaV9zbG90ID0gMHhmZjsKKwkJaGktPnBjaV9waW5bMF0gPSAwOworCQloaS0+cGNpX3BpblsxXSA9IDA7CisJCWhpLT5uZGV2ID0gTlVMTDsKKwkJaGktPmFkZHJbMF0gPSAwTDsKKwkJaGktPmFkZHJbMV0gPSAwTDsKKwkJaGktPmFkZHJfbWFwcGVkWzBdID0gMEw7CisJCWhpLT5hZGRyX21hcHBlZFsxXSA9IDBMOworCX0KIH0KIAogdm9pZAotY2xlYW51cF9pb3JlbWFwICh2b2lkKQorY2xlYW51cF9pb3JlbWFwKHZvaWQpCiB7Ci0gICAgaGR3X2luZm9fdCAqaGk7Ci0gICAgaW50ICAgICAgICAgaTsKKwloZHdfaW5mb190ICpoaTsKKwlpbnQgICAgICAgICBpOwogCi0gICAgZm9yIChpID0gMCwgaGkgPSBoZHdfaW5mbzsgaSA8IE1BWF9CT0FSRFM7IGkrKywgaGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChoaS0+cGNpX3Nsb3QgPT0gMHhmZikKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoaGktPmFkZHJfbWFwcGVkWzBdKQotICAgICAgICB7Ci0gICAgICAgICAgICBpb3VubWFwICgodm9pZCAqKSAoaGktPmFkZHJfbWFwcGVkWzBdKSk7Ci0gICAgICAgICAgICByZWxlYXNlX21lbV9yZWdpb24gKChsb25nKSBoaS0+YWRkclswXSwgaGktPmxlblswXSk7Ci0gICAgICAgICAgICBoaS0+YWRkcl9tYXBwZWRbMF0gPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoaS0+YWRkcl9tYXBwZWRbMV0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlvdW5tYXAgKCh2b2lkICopIChoaS0+YWRkcl9tYXBwZWRbMV0pKTsKLSAgICAgICAgICAgIHJlbGVhc2VfbWVtX3JlZ2lvbiAoKGxvbmcpIGhpLT5hZGRyWzFdLCBoaS0+bGVuWzFdKTsKLSAgICAgICAgICAgIGhpLT5hZGRyX21hcHBlZFsxXSA9IDA7Ci0gICAgICAgIH0KLSAgICB9CisJZm9yIChpID0gMCwgaGkgPSBoZHdfaW5mbzsgaSA8IE1BWF9CT0FSRFM7IGkrKywgaGkrKykgeworCQlpZiAoaGktPnBjaV9zbG90ID09IDB4ZmYpCisJCQlicmVhazsKKwkJaWYgKGhpLT5hZGRyX21hcHBlZFswXSkgeworCQkJaW91bm1hcCgodm9pZCAqKShoaS0+YWRkcl9tYXBwZWRbMF0pKTsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbigobG9uZykgaGktPmFkZHJbMF0sIGhpLT5sZW5bMF0pOworCQkJaGktPmFkZHJfbWFwcGVkWzBdID0gMDsKKwkJfQorCQlpZiAoaGktPmFkZHJfbWFwcGVkWzFdKSB7CisJCQlpb3VubWFwKCh2b2lkICopKGhpLT5hZGRyX21hcHBlZFsxXSkpOworCQkJcmVsZWFzZV9tZW1fcmVnaW9uKChsb25nKSBoaS0+YWRkclsxXSwgaGktPmxlblsxXSk7CisJCQloaS0+YWRkcl9tYXBwZWRbMV0gPSAwOworCQl9CisJfQogfQogCiAKIHZvaWQKLWNsZWFudXBfZGV2cyAodm9pZCkKK2NsZWFudXBfZGV2cyh2b2lkKQogewotICAgIGhkd19pbmZvX3QgKmhpOwotICAgIGludCAgICAgICAgIGk7CisJaGR3X2luZm9fdCAqaGk7CisJaW50ICAgICAgICAgaTsKIAotICAgIGZvciAoaSA9IDAsIGhpID0gaGR3X2luZm87IGkgPCBNQVhfQk9BUkRTOyBpKyssIGhpKyspCi0gICAgewotICAgICAgICBpZiAoaGktPnBjaV9zbG90ID09IDB4ZmYgfHwgIWhpLT5uZGV2KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGM0X3N0b3B3ZChuZXRkZXZfcHJpdihoaS0+bmRldikpOworCWZvciAoaSA9IDAsIGhpID0gaGR3X2luZm87IGkgPCBNQVhfQk9BUkRTOyBpKyssIGhpKyspIHsKKwkJaWYgKGhpLT5wY2lfc2xvdCA9PSAweGZmIHx8ICFoaS0+bmRldikKKwkJCWJyZWFrOworCQljNF9zdG9wd2QobmV0ZGV2X3ByaXYoaGktPm5kZXYpKTsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwotICAgICAgICBzYmVjb21fcHJvY19icmRfY2xlYW51cChuZXRkZXZfcHJpdihoaS0+bmRldikpOworCQlzYmVjb21fcHJvY19icmRfY2xlYW51cChuZXRkZXZfcHJpdihoaS0+bmRldikpOwogI2VuZGlmCi0gICAgICAgIHVucmVnaXN0ZXJfbmV0ZGV2IChoaS0+bmRldik7Ci0gICAgICAgIGZyZWVfaXJxIChoaS0+cGRldlswXS0+aXJxLCBoaS0+bmRldik7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGhpLT5uZGV2KTsKKwkJZnJlZV9pcnEoaGktPnBkZXZbMF0tPmlycSwgaGktPm5kZXYpOwogI2lmZGVmIENPTkZJR19TQkVfUE1DQzRfTkNPTU0KLSAgICAgICAgZnJlZV9pcnEgKGhpLT5wZGV2WzFdLT5pcnEsIGhpLT5uZGV2KTsKKwkJZnJlZV9pcnEoaGktPnBkZXZbMV0tPmlycSwgaGktPm5kZXYpOwogI2VuZGlmCi0gICAgICAgIE9TX2tmcmVlIChoaS0+bmRldik7Ci0gICAgfQorCQlPU19rZnJlZShoaS0+bmRldik7CisJfQogfQogCiAKIHN0YXRpYyBpbnQgIF9faW5pdAotYzRfaGR3X2luaXQgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgZm91bmQpCitjNF9oZHdfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGZvdW5kKQogewotICAgIGhkd19pbmZvX3QgKmhpOwotICAgIGludCAgICAgICAgIGk7Ci0gICAgaW50ICAgICAgICAgZnVuLCBzbG90OwotICAgIHVuc2lnbmVkIGNoYXIgYnVzbm8gPSAweGZmOworCWhkd19pbmZvX3QgKmhpOworCWludCAgICAgICAgIGk7CisJaW50ICAgICAgICAgZnVuLCBzbG90OworCXVuc2lnbmVkIGNoYXIgYnVzbm8gPSAweGZmOwogCi0gICAgLyogb3VyIE1VU1lDQyBjaGlwIHN1cHBvcnRzIHR3byBmdW5jdGlvbnMsIDAgJiAxICovCi0gICAgaWYgKChmdW4gPSBQQ0lfRlVOQyAocGRldi0+ZGV2Zm4pKSA+IDEpCi0gICAgewotICAgICAgICBwcl93YXJuaW5nKCJ1bmV4cGVjdGVkIGRldmZ1bjogMHgleFxuIiwgcGRldi0+ZGV2Zm4pOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHBkZXYtPmJ1cykgICAgICAgICAgICAgICAgICAvKiBvYnRhaW4gYnVzIG51bWJlciAqLwotICAgICAgICBidXNubyA9IHBkZXYtPmJ1cy0+bnVtYmVyOwotICAgIGVsc2UKLSAgICAgICAgYnVzbm8gPSAwOyAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgZm9yIHN5c3RlbSBQQ0kgaW5jb25zaXN0ZW5jeSAqLwotICAgIHNsb3QgPSBwZGV2LT5kZXZmbiAmIH4weDA3OworCS8qIG91ciBNVVNZQ0MgY2hpcCBzdXBwb3J0cyB0d28gZnVuY3Rpb25zLCAwICYgMSAqLworCWZ1biA9IFBDSV9GVU5DKHBkZXYtPmRldmZuKTsKKwlpZiAoZnVuID4gMSkgeworCQlwcl93YXJuaW5nKCJ1bmV4cGVjdGVkIGRldmZ1bjogMHgleFxuIiwgcGRldi0+ZGV2Zm4pOworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICAvKgotICAgICAqIEZ1bmN0aW9ucyAwICYgMSBmb3IgYSBnaXZlbiBib2FyZCAoaWRlbnRpZmllZCBieSBzYW1lIGJ1cyhidXNubykgYW5kCi0gICAgICogc2xvdChzbG90KSkgYXJlIHBsYWNlZCBpbnRvIHRoZSBzYW1lICdoYXJkd2FyZScgc3RydWN0dXJlLiAgVGhlIGZpcnN0Ci0gICAgICogcGFydCBvZiB0aGUgYm9hcmQncyBmdW5jdGlvbmFsaXR5IHdpbGwgYmUgcGxhY2VkIGludG8gYW4gdW5wb3B1bGF0ZWQKLSAgICAgKiBlbGVtZW50LCBpZGVudGlmaWVkIGJ5ICJzbG90PT0oMHhmZikiLiAgVGhlIHNlY29uZCBwYXJ0IG9mIGEgYm9hcmQncwotICAgICAqIGZ1bmN0aW9uYWxpdHkgd2lsbCBtYXRjaCB0aGUgcHJldmlvdXNseSBsb2FkZWQgc2xvdC9idXNuby4KLSAgICAgKi8KLSAgICBmb3IgKGkgPSAwLCBoaSA9IGhkd19pbmZvOyBpIDwgTUFYX0JPQVJEUzsgaSsrLCBoaSsrKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogbWF0Y2ggd2l0aCBib2FyZCdzIGZpcnN0IGZvdW5kIGludGVyZmFjZSwgb3RoZXJ3aXNlIHRoaXMgaXMgZmlyc3QKLSAgICAgICAgICogZm91bmQKLSAgICAgICAgICovCi0gICAgICAgIGlmICgoaGktPnBjaV9zbG90ID09IDB4ZmYpIHx8ICAgLyogbmV3IGJvYXJkICovCi0gICAgICAgICAgICAoKGhpLT5wY2lfc2xvdCA9PSBzbG90KSAmJiAoaGktPmJ1cyA9PSBwZGV2LT5idXMpKSkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGZvdW5kIGZvci1sb29wIGV4aXQgKi8KLSAgICB9Ci0gICAgaWYgKGkgPT0gTUFYX0JPQVJEUykgICAgICAgICAgICAvKiBubyBtYXRjaCBpbiBhYm92ZSBsb29wIG1lYW5zIE1BWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZXhjZWVkZWQgKi8KLSAgICB7Ci0gICAgICAgIHByX3dhcm5pbmcoImV4Y2VlZGVkIG51bWJlciBvZiBhbGxvd2VkIGRldmljZXMgKD4lZCk/XG4iLCBNQVhfQk9BUkRTKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChwZGV2LT5idXMpCi0gICAgICAgIGhpLT5wY2lfYnVzbm8gPSBwZGV2LT5idXMtPm51bWJlcjsKLSAgICBlbHNlCi0gICAgICAgIGhpLT5wY2lfYnVzbm8gPSAwOyAgICAgICAgICAvKiBkZWZhdWx0IGZvciBzeXN0ZW0gUENJIGluY29uc2lzdGVuY3kgKi8KLSAgICBoaS0+cGNpX3Nsb3QgPSBzbG90OwotICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlIChwZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJmhpLT5wY2lfcGluW2Z1bl0pOwotICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlIChwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZoaS0+cmV2aWRbZnVuXSk7Ci0gICAgaGktPmJ1cyA9IHBkZXYtPmJ1czsKLSAgICBoaS0+YWRkcltmdW5dID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAwKTsKLSAgICBoaS0+bGVuW2Z1bl0gPSBwY2lfcmVzb3VyY2VfZW5kIChwZGV2LCAwKSAtIGhpLT5hZGRyW2Z1bl0gKyAxOwotICAgIGhpLT5wZGV2W2Z1bl0gPSBwZGV2OworCS8qIG9idGFpbiBidXMgbnVtYmVyICovCisJaWYgKHBkZXYtPmJ1cykKKwkJYnVzbm8gPSBwZGV2LT5idXMtPm51bWJlcjsKKwllbHNlCisJCWJ1c25vID0gMDsgLyogZGVmYXVsdCBmb3Igc3lzdGVtIFBDSSBpbmNvbnNpc3RlbmN5ICovCisJc2xvdCA9IHBkZXYtPmRldmZuICYgfjB4MDc7CiAKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIGNyZWF0ZSBkZXZpY2UgbmFtZSBmcm9tIG1vZHVsZSBuYW1lLCBwbHVzIGFkZCB0aGUgYXBwcm9wcmlhdGUKLSAgICAgICAgICogYm9hcmQgbnVtYmVyCi0gICAgICAgICAqLwotICAgICAgICBjaGFyICAgICAgICpjcCA9IGhpLT5kZXZuYW1lOworCS8qCisJICogRnVuY3Rpb25zIDAgJiAxIGZvciBhIGdpdmVuIGJvYXJkIChpZGVudGlmaWVkIGJ5IHNhbWUgYnVzKGJ1c25vKSBhbmQKKwkgKiBzbG90KHNsb3QpKSBhcmUgcGxhY2VkIGludG8gdGhlIHNhbWUgJ2hhcmR3YXJlJyBzdHJ1Y3R1cmUuICBUaGUgZmlyc3QKKwkgKiBwYXJ0IG9mIHRoZSBib2FyZCdzIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZSBwbGFjZWQgaW50byBhbiB1bnBvcHVsYXRlZAorCSAqIGVsZW1lbnQsIGlkZW50aWZpZWQgYnkgInNsb3Q9PSgweGZmKSIuICBUaGUgc2Vjb25kIHBhcnQgb2YgYSBib2FyZCdzCisJICogZnVuY3Rpb25hbGl0eSB3aWxsIG1hdGNoIHRoZSBwcmV2aW91c2x5IGxvYWRlZCBzbG90L2J1c25vLgorCSAqLworCWZvciAoaSA9IDAsIGhpID0gaGR3X2luZm87IGkgPCBNQVhfQk9BUkRTOyBpKyssIGhpKyspIHsKKwkJLyoKKwkJICogbWF0Y2ggd2l0aCBib2FyZCdzIGZpcnN0IGZvdW5kIGludGVyZmFjZSwgb3RoZXJ3aXNlIHRoaXMgaXMKKwkJICogZmlzcnQgZm91bmQKKwkJICovCisJCWlmICgoaGktPnBjaV9zbG90ID09IDB4ZmYpIHx8ICAgLyogbmV3IGJvYXJkICovCisJCSAgICAoKGhpLT5wY2lfc2xvdCA9PSBzbG90KSAmJiAoaGktPmJ1cyA9PSBwZGV2LT5idXMpKSkKKwkJCWJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGZvdW5kIGZvci1sb29wIGV4aXQgKi8KKwl9CiAKLSAgICAgICAgc3RyY3B5IChjcCwgS0JVSUxEX01PRE5BTUUpOwotICAgICAgICBjcCArPSBzdHJsZW4gKGNwKTsgICAgICAgICAgLyogcmVwb3NpdGlvbiAqLwotICAgICAgICAqY3ArKyA9ICctJzsKLSAgICAgICAgKmNwKysgPSAnMCcgKyAoZm91bmQgLyAyKTsgIC8qIHRoZXJlIGFyZSB0d28gZm91bmQgaW50ZXJmYWNlcyBwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJvYXJkICovCi0gICAgICAgICpjcCA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiB0ZXJtaW5hdGlvbiAqLwotICAgIH0KKwkvKiBubyBtYXRjaCBpbiBhYm92ZSBsb29wIG1lYW5zIE1BWCBleGNlZWRlZCAqLworCWlmIChpID09IE1BWF9CT0FSRFMpIHsKKwkJcHJfd2FybmluZygiZXhjZWVkZWQgbnVtYmVyIG9mIGFsbG93ZWQgZGV2aWNlcyAoPiVkKT9cbiIsCisJCQkgICBNQVhfQk9BUkRTKTsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgcmV0dXJuIDE7CisJaWYgKHBkZXYtPmJ1cykKKwkJaGktPnBjaV9idXNubyA9IHBkZXYtPmJ1cy0+bnVtYmVyOworCWVsc2UKKwkJaGktPnBjaV9idXNubyA9IDA7IC8qIGRlZmF1bHQgZm9yIHN5c3RlbSBQQ0kgaW5jb25zaXN0ZW5jeSAqLworCisJaGktPnBjaV9zbG90ID0gc2xvdDsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJmhpLT5wY2lfcGluW2Z1bl0pOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmhpLT5yZXZpZFtmdW5dKTsKKwloaS0+YnVzID0gcGRldi0+YnVzOworCWhpLT5hZGRyW2Z1bl0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJaGktPmxlbltmdW5dID0gcGNpX3Jlc291cmNlX2VuZChwZGV2LCAwKSAtIGhpLT5hZGRyW2Z1bl0gKyAxOworCWhpLT5wZGV2W2Z1bl0gPSBwZGV2OworCisJeworCQkvKgorCQkgKiBjcmVhdGUgZGV2aWNlIG5hbWUgZnJvbSBtb2R1bGUgbmFtZSwgcGx1cyBhZGQgdGhlIGFwcHJvcHJpYXRlCisJCSAqIGJvYXJkIG51bWJlcgorCQkgKi8KKwkJY2hhciAgICAgICAqY3AgPSBoaS0+ZGV2bmFtZTsKKworCQlzdHJjcHkoY3AsIEtCVUlMRF9NT0ROQU1FKTsKKwkJY3AgKz0gc3RybGVuKGNwKTsgICAgICAgICAgLyogcmVwb3NpdGlvbiAqLworCQkqY3ArKyA9ICctJzsKKwkJKmNwKysgPSAnMCcgKyAoZm91bmQgLyAyKTsgIC8qIHRoZXJlIGFyZSB0d28gZm91bmQgaW50ZXJmYWNlcyBwZXIKKwkJKiBib2FyZCAqLworCQkqY3AgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogdGVybWluYXRpb24gKi8KKwl9CisKKwlyZXR1cm4gMTsKIH0KIAotCi1zdGF0dXNfdCAgICBfX2luaXQKLWM0aHdfYXR0YWNoX2FsbCAodm9pZCkKK3N0YXR1c190IF9faW5pdAorYzRod19hdHRhY2hfYWxsKHZvaWQpCiB7Ci0gICAgaGR3X2luZm9fdCAqaGk7Ci0gICAgc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOwotICAgIGludCAgICAgICAgIGZvdW5kID0gMCwgaSwgajsKKwloZHdfaW5mb190ICpoaTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJaW50ICAgICAgICAgZm91bmQgPSAwLCBpLCBqOwogCi0gICAgZXJyb3JfZmxhZyA9IDA7Ci0gICAgcHJlcF9oZHdfaW5mbyAoKTsKLSAgICAvKioqIHNjYW4gUENJIGJ1cyBmb3IgYWxsIHBvc3NpYmxlIGJvYXJkcyAqLwotICAgIHdoaWxlICgocGRldiA9IHBjaV9nZXRfZGV2aWNlIChQQ0lfVkVORE9SX0lEX0NPTkVYQU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9DTjg0NzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGV2KSkpCi0gICAgewotICAgICAgICBpZiAoYzRfaGR3X2luaXQgKHBkZXYsIGZvdW5kKSkKLSAgICAgICAgICAgIGZvdW5kKys7Ci0gICAgfQotICAgIGlmICghZm91bmQpCi0gICAgewotICAgICAgICBwcl93YXJuaW5nKCJObyBib2FyZHMgZm91bmRcbiIpOwotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgLyogc2FuaXR5IGNoZWNrIGZvciBjb25zaXN0ZW50IGhhcmR3YXJlIGZvdW5kICovCi0gICAgZm9yIChpID0gMCwgaGkgPSBoZHdfaW5mbzsgaSA8IE1BWF9CT0FSRFM7IGkrKywgaGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChoaS0+cGNpX3Nsb3QgIT0gMHhmZiAmJiAoIWhpLT5hZGRyWzBdIHx8ICFoaS0+YWRkclsxXSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByX3dhcm5pbmcoIiVzOiBzb21ldGhpbmcgdmVyeSB3cm9uZyB3aXRoIHBjaV9nZXRfZGV2aWNlXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBoaS0+ZGV2bmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTzsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBicmluZyBib2FyZCdzIG1lbW9yeSByZWdpb25zIG9uL2xpbmUgKi8KLSAgICBmb3IgKGkgPSAwLCBoaSA9IGhkd19pbmZvOyBpIDwgTUFYX0JPQVJEUzsgaSsrLCBoaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGhpLT5wY2lfc2xvdCA9PSAweGZmKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0gICAgICAgIHsKLQkgICAgaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24gKGhpLT5hZGRyW2pdLCBoaS0+bGVuW2pdLCBoaS0+ZGV2bmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJfd2FybmluZygiJXM6IG1lbW9yeSBpbiB1c2UsIGFkZHI9MHglbHgsIGxlbj0weCVseCA/XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGktPmRldm5hbWUsIGhpLT5hZGRyW2pdLCBoaS0+bGVuW2pdKTsKLSAgICAgICAgICAgICAgICBjbGVhbnVwX2lvcmVtYXAgKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoaS0+YWRkcl9tYXBwZWRbal0gPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcCAoaGktPmFkZHJbal0sIGhpLT5sZW5bal0pOwotICAgICAgICAgICAgaWYgKCFoaS0+YWRkcl9tYXBwZWRbal0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJfd2FybmluZygiJXM6IGlvcmVtYXAgZmFpbHMsIGFkZHI9MHglbHgsIGxlbj0weCVseCA/XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGktPmRldm5hbWUsIGhpLT5hZGRyW2pdLCBoaS0+bGVuW2pdKTsKLSAgICAgICAgICAgICAgICBjbGVhbnVwX2lvcmVtYXAgKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgICAgICB9CisJZXJyb3JfZmxhZyA9IDA7CisJcHJlcF9oZHdfaW5mbygpOworCS8qKiogc2NhbiBQQ0kgYnVzIGZvciBhbGwgcG9zc2libGUgYm9hcmRzICovCisJd2hpbGUgKChwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9DT05FWEFOVCwKKwkJCQkgICAgICBQQ0lfREVWSUNFX0lEX0NOODQ3NCwKKwkJCQkgICAgICBwZGV2KSkpIHsKKwkJaWYgKGM0X2hkd19pbml0KHBkZXYsIGZvdW5kKSkKKwkJCWZvdW5kKys7CisJfQorCisJaWYgKCFmb3VuZCkgeworCQlwcl93YXJuaW5nKCJObyBib2FyZHMgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBzYW5pdHkgY2hlY2sgZm9yIGNvbnNpc3RlbnQgaGFyZHdhcmUgZm91bmQgKi8KKwlmb3IgKGkgPSAwLCBoaSA9IGhkd19pbmZvOyBpIDwgTUFYX0JPQVJEUzsgaSsrLCBoaSsrKSB7CisJCWlmIChoaS0+cGNpX3Nsb3QgIT0gMHhmZiAmJiAoIWhpLT5hZGRyWzBdIHx8ICFoaS0+YWRkclsxXSkpIHsKKwkJCXByX3dhcm5pbmcoIiVzOiBzb21ldGhpbmcgdmVyeSB3cm9uZyB3aXRoIHBjaV9nZXRfZGV2aWNlXG4iLAorCQkJCSAgIGhpLT5kZXZuYW1lKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCS8qIGJyaW5nIGJvYXJkJ3MgbWVtb3J5IHJlZ2lvbnMgb24vbGluZSAqLworCWZvciAoaSA9IDAsIGhpID0gaGR3X2luZm87IGkgPCBNQVhfQk9BUkRTOyBpKyssIGhpKyspIHsKKwkJaWYgKGhpLT5wY2lfc2xvdCA9PSAweGZmKQorCQkJYnJlYWs7CisJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGhpLT5hZGRyW2pdLCBoaS0+bGVuW2pdLCBoaS0+ZGV2bmFtZSkpIHsKKwkJCQlwcl93YXJuaW5nKCIlczogbWVtb3J5IGluIHVzZSwgYWRkcj0weCVseCwgbGVuPTB4JWx4ID9cbiIsCisJCQkJCSAgIGhpLT5kZXZuYW1lLCBoaS0+YWRkcltqXSwgaGktPmxlbltqXSk7CisJCQkJY2xlYW51cF9pb3JlbWFwKCk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisKKwkJCWhpLT5hZGRyX21hcHBlZFtqXSA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXAoaGktPmFkZHJbal0sIGhpLT5sZW5bal0pOworCQkJaWYgKCFoaS0+YWRkcl9tYXBwZWRbal0pIHsKKwkJCQlwcl93YXJuaW5nKCIlczogaW9yZW1hcCBmYWlscywgYWRkcj0weCVseCwgbGVuPTB4JWx4ID9cbiIsCisJCQkJCSAgIGhpLT5kZXZuYW1lLCBoaS0+YWRkcltqXSwgaGktPmxlbltqXSk7CisJCQkJY2xlYW51cF9pb3JlbWFwKCk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CiAjaWZkZWYgU0JFX01BUF9ERUJVRwotICAgICAgICAgICAgcHJfd2FybmluZygiJXM6IGlvIHJlbWFwcGVkIGZyb20gcGh5cyAleCB0byB2aXJ0ICV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICBoaS0+ZGV2bmFtZSwgKHVfaW50MzJfdCkgaGktPmFkZHJbal0sICh1X2ludDMyX3QpIGhpLT5hZGRyX21hcHBlZFtqXSk7CisJCQlwcl93YXJuaW5nKCIlczogaW8gcmVtYXBwZWQgZnJvbSBwaHlzICV4IHRvIHZpcnQgJXhcbiIsCisJCQkJICAgaGktPmRldm5hbWUsICh1X2ludDMyX3QpIGhpLT5hZGRyW2pdLAorCQkJCSAgICh1X2ludDMyX3QpIGhpLT5hZGRyX21hcHBlZFtqXSk7CiAjZW5kaWYKLSAgICAgICAgfQotICAgIH0KKwkJfQorCX0KIAotICAgIGRydnJfc3RhdGUgPSBTQkVfRFJWUl9BVkFJTEFCTEU7CisJZHJ2cl9zdGF0ZSA9IFNCRV9EUlZSX0FWQUlMQUJMRTsKIAotICAgIC8qIEhhdmUgbm93IG1lbW9yeSBtYXBwZWQgYWxsIGJvYXJkcy4gIE5vdyBhbGxvdyBib2FyZCdzIGFjY2VzcyB0byBzeXN0ZW0gKi8KLSAgICBmb3IgKGkgPSAwLCBoaSA9IGhkd19pbmZvOyBpIDwgTUFYX0JPQVJEUzsgaSsrLCBoaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGhpLT5wY2lfc2xvdCA9PSAweGZmKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChwY2lfZW5hYmxlX2RldmljZSAoaGktPnBkZXZbMF0pIHx8Ci0gICAgICAgICAgICBwY2lfZW5hYmxlX2RldmljZSAoaGktPnBkZXZbMV0pKQotICAgICAgICB7Ci0gICAgICAgICAgICBkcnZyX3N0YXRlID0gU0JFX0RSVlJfRE9XTjsKLSAgICAgICAgICAgIHByX3dhcm5pbmcoIiVzOiBmYWlsZWQgdG8gZW5hYmxlIGNhcmQgJWQgc2xvdCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaGktPmRldm5hbWUsIGksIGhpLT5wY2lfc2xvdCk7Ci0gICAgICAgICAgICBjbGVhbnVwX2RldnMgKCk7Ci0gICAgICAgICAgICBjbGVhbnVwX2lvcmVtYXAgKCk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTzsKLSAgICAgICAgfQotICAgICAgICBwY2lfc2V0X21hc3RlciAoaGktPnBkZXZbMF0pOwotICAgICAgICBwY2lfc2V0X21hc3RlciAoaGktPnBkZXZbMV0pOwotICAgICAgICBpZiAoIShoaS0+bmRldiA9IGM0X2FkZF9kZXYgKGhpLCBpLCAobG9uZykgaGktPmFkZHJfbWFwcGVkWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBoaS0+YWRkcl9tYXBwZWRbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGktPnBkZXZbMF0tPmlycSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaS0+cGRldlsxXS0+aXJxKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRydnJfc3RhdGUgPSBTQkVfRFJWUl9ET1dOOwotICAgICAgICAgICAgY2xlYW51cF9pb3JlbWFwICgpOwotICAgICAgICAgICAgLyogTk9URTogYzRfYWRkX2RldigpIGRvZXMgaXRzIG93biBkZXZpY2UgY2xlYW51cCAqLworCS8qIEhhdmUgbm93IG1lbW9yeSBtYXBwZWQgYWxsIGJvYXJkcy4gIE5vdyBhbGxvdyBib2FyZCdzIGFjY2VzcyB0byBzeXN0ZW0gKi8KKwlmb3IgKGkgPSAwLCBoaSA9IGhkd19pbmZvOyBpIDwgTUFYX0JPQVJEUzsgaSsrLCBoaSsrKSB7CisJCWlmIChoaS0+cGNpX3Nsb3QgPT0gMHhmZikKKwkJCWJyZWFrOworCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UoaGktPnBkZXZbMF0pIHx8CisJCSAgICBwY2lfZW5hYmxlX2RldmljZShoaS0+cGRldlsxXSkpIHsKKwkJCWRydnJfc3RhdGUgPSBTQkVfRFJWUl9ET1dOOworCQkJcHJfd2FybmluZygiJXM6IGZhaWxlZCB0byBlbmFibGUgY2FyZCAlZCBzbG90ICVkXG4iLAorCQkJCSAgIGhpLT5kZXZuYW1lLCBpLCBoaS0+cGNpX3Nsb3QpOworCQkJY2xlYW51cF9kZXZzKCk7CisJCQljbGVhbnVwX2lvcmVtYXAoKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCXBjaV9zZXRfbWFzdGVyKGhpLT5wZGV2WzBdKTsKKwkJcGNpX3NldF9tYXN0ZXIoaGktPnBkZXZbMV0pOworCQloaS0+bmRldiA9IGM0X2FkZF9kZXYoaGksIGksIChsb25nKSBoaS0+YWRkcl9tYXBwZWRbMF0sCisJCQkJICAgICAgKGxvbmcpIGhpLT5hZGRyX21hcHBlZFsxXSwKKwkJCQkgICAgICBoaS0+cGRldlswXS0+aXJxLAorCQkJCSAgICAgIGhpLT5wZGV2WzFdLT5pcnEpOworCQlpZiAoIWhpLT5uZGV2KSB7CisJCQlkcnZyX3N0YXRlID0gU0JFX0RSVlJfRE9XTjsKKwkJCWNsZWFudXBfaW9yZW1hcCgpOworCQkJLyogTk9URTogYzRfYWRkX2RldigpIGRvZXMgaXRzIG93biBkZXZpY2UgY2xlYW51cCAqLwogI2lmIDAKLSAgICAgICAgICAgIGNsZWFudXBfZGV2cyAoKTsKKwkJCWNsZWFudXBfZGV2cygpOwogI2VuZGlmCi0gICAgICAgICAgICByZXR1cm4gZXJyb3JfZmxhZzsgICAgICAvKiBlcnJvcl9mbGFnIHNldCB3L2luIGFkZF9kZXYoKSAqLwotICAgICAgICB9Ci0gICAgICAgIHNob3dfdHdvIChoaSwgaSk7ICAgICAgICAgICAvKiBkaXNwbGF5cyBmb3VuZCBpbmZvcm1hdGlvbiAqLwotICAgIH0KLSAgICByZXR1cm4gMDsKKwkJCXJldHVybiBlcnJvcl9mbGFnOyAvKiBlcnJvcl9mbGFnIHNldCB3L2luIGFkZF9kZXYoKSAqLworCQl9CisJCXNob3dfdHdvKGhpLCBpKTsgLyogZGlzcGxheXMgZm91bmQgaW5mb3JtYXRpb24gKi8KKwl9CisJcmV0dXJuIDA7CiB9CiAKIC8qKiogIEVuZC1vZi1GaWxlICAqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2xpYnNiZXcuaCBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbGlic2Jldy5oCmluZGV4IDQyNTRjMDQuLmJkMmJmYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbGlic2Jldy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbGlic2Jldy5oCkBAIC01MTQsMzYgKzUxNCwzNiBAQAogICAgIH07CiAgICAgdHlwZWRlZiBzdHJ1Y3Qgd2FuY2ZnIHdjZmdfdDsKIAotICAgIGV4dGVybiB3Y2ZnX3QgKndhbmNmZ19pbml0IChjaGFyICosIGNoYXIgKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2NhcmRfYmxpbmsgKHdjZmdfdCAqLCBpbnQpOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19jdGwgKHdjZmdfdCAqLCBpbnQsIHZvaWQgKiwgaW50LCB2b2lkICosIGludCk7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2RlbF9jYXJkX3N0YXRzICh3Y2ZnX3QgKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2RlbF9jaGFuX3N0YXRzICh3Y2ZnX3QgKiwgaW50KTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZW5hYmxlX3BvcnRzICh3Y2ZnX3QgKiwgaW50KTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZnJlZSAod2NmZ190ICopOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19nZXRfYnJkYWRkciAod2NmZ190ICosIHN0cnVjdCBzYmVfYnJkX2FkZHIgKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF9icmRpbmZvICh3Y2ZnX3QgKiwgc3RydWN0IHNiZV9icmRfaW5mbyAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZ2V0X2NhcmQgKHdjZmdfdCAqLCBzdHJ1Y3Qgc2JlY29tX2NhcmRfcGFyYW0gKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF9jYXJkX2NoYW5fc3RhdHMgKHdjZmdfdCAqLCBzdHJ1Y3Qgc2JlY29tX2NoYW5fc3RhdHMgKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF9jYXJkX3NuICh3Y2ZnX3QgKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF9jYXJkX3N0YXRzICh3Y2ZnX3QgKiwgc3RydWN0IHRlbXV4X2NhcmRfc3RhdHMgKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF9jaGFuICh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0gKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF9jaGFuX3N0YXRzICh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX2NoYW5fc3RhdHMgKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF9kcnZpbmZvICh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlX2Rydl9pbmZvICopOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19nZXRfZnJhbWVyICh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX2ZyYW1lcl9wYXJhbSAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZ2V0X2lpZCAod2NmZ190ICosIGludCwgc3RydWN0IHNiZV9paWRfaW5mbyAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZ2V0X3NuICh3Y2ZnX3QgKiwgdW5zaWduZWQgaW50ICopOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19yZWFkICh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX3dydF92ZWMgKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX3Jlc2V0X2RldmljZSAod2NmZ190ICosIGludCk7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX3NldF9jYXJkICh3Y2ZnX3QgKiwgc3RydWN0IHNiZWNvbV9jYXJkX3BhcmFtICopOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19zZXRfY2hhbiAod2NmZ190ICosIGludCwgc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtICopOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19zZXRfZnJhbWVyICh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX2ZyYW1lcl9wYXJhbSAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfc2V0X2xvZ2xldmVsICh3Y2ZnX3QgKiwgdWludCk7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX3dyaXRlICh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX3dydF92ZWMgKik7CisgICAgZXh0ZXJuIHdjZmdfdCAqd2FuY2ZnX2luaXQoY2hhciAqLCBjaGFyICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2NhcmRfYmxpbmsod2NmZ190ICosIGludCk7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfY3RsKHdjZmdfdCAqLCBpbnQsIHZvaWQgKiwgaW50LCB2b2lkICosIGludCk7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfZGVsX2NhcmRfc3RhdHMod2NmZ190ICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2RlbF9jaGFuX3N0YXRzKHdjZmdfdCAqLCBpbnQpOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2VuYWJsZV9wb3J0cyh3Y2ZnX3QgKiwgaW50KTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19mcmVlKHdjZmdfdCAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19nZXRfYnJkYWRkcih3Y2ZnX3QgKiwgc3RydWN0IHNiZV9icmRfYWRkciAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19nZXRfYnJkaW5mbyh3Y2ZnX3QgKiwgc3RydWN0IHNiZV9icmRfaW5mbyAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19nZXRfY2FyZCh3Y2ZnX3QgKiwgc3RydWN0IHNiZWNvbV9jYXJkX3BhcmFtICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2dldF9jYXJkX2NoYW5fc3RhdHMod2NmZ190ICosIHN0cnVjdCBzYmVjb21fY2hhbl9zdGF0cyAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19nZXRfY2FyZF9zbih3Y2ZnX3QgKik7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfZ2V0X2NhcmRfc3RhdHMod2NmZ190ICosIHN0cnVjdCB0ZW11eF9jYXJkX3N0YXRzICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2dldF9jaGFuKHdjZmdfdCAqLCBpbnQsIHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19nZXRfY2hhbl9zdGF0cyh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX2NoYW5fc3RhdHMgKik7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfZ2V0X2RydmluZm8od2NmZ190ICosIGludCwgc3RydWN0IHNiZV9kcnZfaW5mbyAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19nZXRfZnJhbWVyKHdjZmdfdCAqLCBpbnQsIHN0cnVjdCBzYmVjb21fZnJhbWVyX3BhcmFtICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2dldF9paWQod2NmZ190ICosIGludCwgc3RydWN0IHNiZV9paWRfaW5mbyAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19nZXRfc24od2NmZ190ICosIHVuc2lnbmVkIGludCAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19yZWFkKHdjZmdfdCAqLCBpbnQsIHN0cnVjdCBzYmVjb21fd3J0X3ZlYyAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19yZXNldF9kZXZpY2Uod2NmZ190ICosIGludCk7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfc2V0X2NhcmQod2NmZ190ICosIHN0cnVjdCBzYmVjb21fY2FyZF9wYXJhbSAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19zZXRfY2hhbih3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0gKik7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfc2V0X2ZyYW1lcih3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX2ZyYW1lcl9wYXJhbSAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19zZXRfbG9nbGV2ZWwod2NmZ190ICosIHVpbnQpOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX3dyaXRlKHdjZmdfdCAqLCBpbnQsIHN0cnVjdCBzYmVjb21fd3J0X3ZlYyAqKTsKIAogI2lmZGVmIE5PVF9ZRVRfQ09NTU9OCi0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF90c2lvYyAod2NmZ190ICosIHN0cnVjdCB3YW5jMXQzX3RzX2hkciAqLCBzdHJ1Y3Qgd2FuYzF0M190c19wYXJhbSAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfc2V0X3RzaW9jICh3Y2ZnX3QgKiwgc3RydWN0IHdhbmMxdDNfdHNfcGFyYW0gKik7CisgICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF90c2lvYyh3Y2ZnX3QgKiwgc3RydWN0IHdhbmMxdDNfdHNfaGRyICosIHN0cnVjdCB3YW5jMXQzX3RzX3BhcmFtICopOworICAgIGV4dGVybiBpbnQgIHdhbmNmZ19zZXRfdHNpb2Mod2NmZ190ICosIHN0cnVjdCB3YW5jMXQzX3RzX3BhcmFtICopOwogI2VuZGlmCiAKICNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKiBfSU5DX0xJQlNCRVdfSF8gKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saW51eC5jCmluZGV4IDc5MjA2Y2IuLmIwMmY1YWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saW51eC5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSAicG1jYzRfcHJpdmF0ZS5oIgogI2luY2x1ZGUgInNiZXByb2MuaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXJyb3Igb3V0IGVhcmx5IGlmIHdlIGhhdmUgY29tcGlsZXIgdHJvdWJsZS4KICAqCiAgKiAgIChUaGlzIHNlY3Rpb24gaXMgaW5jbHVkZWQgZnJvbSB0aGUga2VybmVsJ3MgaW5pdC9tYWluLmMgYXMgYSBmcmllbmRseQpAQCAtNTAsNDMgKzUwLDQyIEBACiAjd2FybmluZyBnY2MtNC4xLjAgaXMga25vd24gdG8gbWlzY29tcGlsZSB0aGUga2VybmVsLiAgQSBkaWZmZXJlbnQgY29tcGlsZXIgdmVyc2lvbiBpcyByZWNvbW1lbmRlZC4KICNlbmRpZgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2RlZmluZSBDSEFOTkFNRSAiaGRsYyIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBmb3J3YXJkIHJlZmVyZW5jZXMgKi8KLXN0YXR1c190ICAgIGM0X2NoYW5fd29ya19pbml0IChtcGlfdCAqLCBtY2hfdCAqKTsKLXZvaWQgICAgICAgIG11c3ljY193cV9jaGFuX3Jlc3RhcnQgKHZvaWQgKik7Ci1zdGF0dXNfdCBfX2luaXQgYzRfaW5pdCAoY2lfdCAqLCB1X2NoYXIgKiwgdV9jaGFyICopOwotc3RhdHVzX3QgX19pbml0IGM0X2luaXQyIChjaV90ICopOwotY2lfdCAgICAgICAqX19pbml0IGM0X25ldyAodm9pZCAqKTsKLWludCBfX2luaXQgIGM0aHdfYXR0YWNoX2FsbCAodm9pZCk7Ci12b2lkIF9faW5pdCBoZHdfc25fZ2V0IChoZHdfaW5mb190ICosIGludCk7CitzdGF0dXNfdCAgICBjNF9jaGFuX3dvcmtfaW5pdChtcGlfdCAqLCBtY2hfdCAqKTsKK3ZvaWQgICAgICAgIG11c3ljY193cV9jaGFuX3Jlc3RhcnQodm9pZCAqKTsKK3N0YXR1c190IF9faW5pdCBjNF9pbml0KGNpX3QgKiwgdV9jaGFyICosIHVfY2hhciAqKTsKK3N0YXR1c190IF9faW5pdCBjNF9pbml0MihjaV90ICopOworY2lfdCAgICAgICAqX19pbml0IGM0X25ldyh2b2lkICopOworaW50IF9faW5pdCAgYzRod19hdHRhY2hfYWxsKHZvaWQpOwordm9pZCBfX2luaXQgaGR3X3NuX2dldChoZHdfaW5mb190ICosIGludCk7CiAKICNpZmRlZiBDT05GSUdfU0JFX1BNQ0M0X05DT01NCi1pcnFyZXR1cm5fdCBjNF9lYnVzX2ludHJfdGhfaGFuZGxlciAodm9pZCAqKTsKK2lycXJldHVybl90IGM0X2VidXNfaW50cl90aF9oYW5kbGVyKHZvaWQgKik7CiAKICNlbmRpZgotaW50ICAgICAgICAgYzRfZnJhbWVfcncgKGNpX3QgKiwgc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtICopOwotc3RhdHVzX3QgICAgYzRfZ2V0X3BvcnQgKGNpX3QgKiwgaW50KTsKLWludCAgICAgICAgIGM0X2xvb3BfcG9ydCAoY2lfdCAqLCBpbnQsIHVfaW50OF90KTsKLWludCAgICAgICAgIGM0X211c3ljY19ydyAoY2lfdCAqLCBzdHJ1Y3QgYzRfbXVzeWNjX3BhcmFtICopOwotaW50ICAgICAgICAgYzRfbmV3X2NoYW4gKGNpX3QgKiwgaW50LCBpbnQsIHZvaWQgKik7Ci1zdGF0dXNfdCAgICBjNF9zZXRfcG9ydCAoY2lfdCAqLCBpbnQpOwotaW50ICAgICAgICAgYzRfcGxkX3J3IChjaV90ICosIHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSAqKTsKLXZvaWQgICAgICAgIGNsZWFudXBfZGV2cyAodm9pZCk7Ci12b2lkICAgICAgICBjbGVhbnVwX2lvcmVtYXAgKHZvaWQpOwotc3RhdHVzX3QgICAgbXVzeWNjX2NoYW5fZG93biAoY2lfdCAqLCBpbnQpOwotaXJxcmV0dXJuX3QgbXVzeWNjX2ludHJfdGhfaGFuZGxlciAodm9pZCAqKTsKLWludCAgICAgICAgIG11c3ljY19zdGFydF94bWl0IChjaV90ICosIGludCwgdm9pZCAqKTsKK2ludCAgICAgICAgIGM0X2ZyYW1lX3J3KGNpX3QgKiwgc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtICopOworc3RhdHVzX3QgICAgYzRfZ2V0X3BvcnQoY2lfdCAqLCBpbnQpOworaW50ICAgICAgICAgYzRfbG9vcF9wb3J0KGNpX3QgKiwgaW50LCB1X2ludDhfdCk7CitpbnQgICAgICAgICBjNF9tdXN5Y2NfcncoY2lfdCAqLCBzdHJ1Y3QgYzRfbXVzeWNjX3BhcmFtICopOworaW50ICAgICAgICAgYzRfbmV3X2NoYW4oY2lfdCAqLCBpbnQsIGludCwgdm9pZCAqKTsKK3N0YXR1c190ICAgIGM0X3NldF9wb3J0KGNpX3QgKiwgaW50KTsKK2ludCAgICAgICAgIGM0X3BsZF9ydyhjaV90ICosIHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSAqKTsKK3ZvaWQgICAgICAgIGNsZWFudXBfZGV2cyh2b2lkKTsKK3ZvaWQgICAgICAgIGNsZWFudXBfaW9yZW1hcCh2b2lkKTsKK3N0YXR1c190ICAgIG11c3ljY19jaGFuX2Rvd24oY2lfdCAqLCBpbnQpOworaXJxcmV0dXJuX3QgbXVzeWNjX2ludHJfdGhfaGFuZGxlcih2b2lkICopOworaW50ICAgICAgICAgbXVzeWNjX3N0YXJ0X3htaXQoY2lfdCAqLCBpbnQsIHZvaWQgKik7CiAKLWV4dGVybiBjaGFyIHBtY2M0X09TU0lfcmVsZWFzZVtdOwogZXh0ZXJuIGNpX3QgKkNJOwogZXh0ZXJuIHN0cnVjdCBzX2hkd19pbmZvIGhkd19pbmZvW107CiAKICNpZiBkZWZpbmVkKENPTkZJR19TQkVfSERMQ19WNykgfHwgZGVmaW5lZChDT05GSUdfU0JFX1dBTjI1NlQzX0hETENfVjcpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19TQkVfSERMQ19WN19NT0RVTEUpIHx8IGRlZmluZWQoQ09ORklHX1NCRV9XQU4yNTZUM19IRExDX1Y3X01PRFVMRSkKKwlkZWZpbmVkKENPTkZJR19TQkVfSERMQ19WN19NT0RVTEUpIHx8IGRlZmluZWQoQ09ORklHX1NCRV9XQU4yNTZUM19IRExDX1Y3X01PRFVMRSkKICNkZWZpbmUgX3Y3X2hkbGNfICAxCiAjZWxzZQogI2RlZmluZSBfdjdfaGRsY18gIDAKQEAgLTk0LDkgKzkzLDkgQEAKIAogI2lmIF92N19oZGxjXwogI2RlZmluZSBWNyh4KSAoeCAjIyBfdjcpCi1leHRlcm4gaW50ICBoZGxjX25ldGlmX3J4X3Y3IChoZGxjX2RldmljZSAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKLWV4dGVybiBpbnQgIHJlZ2lzdGVyX2hkbGNfZGV2aWNlX3Y3IChoZGxjX2RldmljZSAqKTsKLWV4dGVybiBpbnQgIHVucmVnaXN0ZXJfaGRsY19kZXZpY2VfdjcgKGhkbGNfZGV2aWNlICopOworZXh0ZXJuIGludCAgaGRsY19uZXRpZl9yeF92NyhoZGxjX2RldmljZSAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK2V4dGVybiBpbnQgIHJlZ2lzdGVyX2hkbGNfZGV2aWNlX3Y3KGhkbGNfZGV2aWNlICopOworZXh0ZXJuIGludCAgdW5yZWdpc3Rlcl9oZGxjX2RldmljZV92NyhoZGxjX2RldmljZSAqKTsKIAogI2Vsc2UKICNkZWZpbmUgVjcoeCkgeApAQCAtMTA0LDExICsxMDMsMTEgQEAKIAogaW50ICAgICAgICAgZXJyb3JfZmxhZzsgICAgICAgICAvKiBtb2R1bGUgbG9hZCBlcnJvciByZXBvcnRpbmcgKi8KIGludCAgICAgICAgIGN4dDFlMV9sb2dfbGV2ZWwgPSBMT0dfRVJST1I7Ci1pbnQgICAgICAgICBsb2dfbGV2ZWxfZGVmYXVsdCA9IExPR19FUlJPUjsKK3N0YXRpYyBpbnQgIGxvZ19sZXZlbF9kZWZhdWx0ID0gTE9HX0VSUk9SOwogbW9kdWxlX3BhcmFtKGN4dDFlMV9sb2dfbGV2ZWwsIGludCwgMDQ0NCk7CiAKIGludCAgICAgICAgIGN4dDFlMV9tYXhfbXJ1ID0gTVVTWUNDX01SVTsKLWludCAgICAgICAgIG1heF9tcnVfZGVmYXVsdCA9IE1VU1lDQ19NUlU7CitzdGF0aWMgaW50ICBtYXhfbXJ1X2RlZmF1bHQgPSBNVVNZQ0NfTVJVOwogbW9kdWxlX3BhcmFtKGN4dDFlMV9tYXhfbXJ1LCBpbnQsIDA0NDQpOwogCiBpbnQgICAgICAgICBjeHQxZTFfbWF4X210dSA9IE1VU1lDQ19NVFU7CkBAIC0xMjcsMzMgKzEyNiwyMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAgICAgICAqCi1nZXR1c2VyYnljaGFuIChpbnQgY2hhbm51bSkKK3ZvaWQgKgorZ2V0dXNlcmJ5Y2hhbihpbnQgY2hhbm51bSkKIHsKLSAgICBtY2hfdCAgICAgICpjaDsKKwltY2hfdCAgICAgICpjaDsKIAotICAgIGNoID0gYzRfZmluZF9jaGFuIChjaGFubnVtKTsKLSAgICByZXR1cm4gY2ggPyBjaC0+dXNlciA6IE5VTEw7CisJY2ggPSBjNF9maW5kX2NoYW4oY2hhbm51bSk7CisJcmV0dXJuIGNoID8gY2gtPnVzZXIgOiBOVUxMOwogfQogCiAKLWNoYXIgICAgICAgKgotZ2V0X2hkbGNfbmFtZSAoaGRsY19kZXZpY2UgKmhkbGMpCitjaGFyICoKK2dldF9oZGxjX25hbWUoaGRsY19kZXZpY2UgKmhkbGMpCiB7Ci0gICAgc3RydWN0IGM0X3ByaXYgKnByaXYgPSBoZGxjLT5wcml2OwotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBnZXR1c2VyYnljaGFuIChwcml2LT5jaGFubnVtKTsKKwlzdHJ1Y3QgYzRfcHJpdiAqcHJpdiA9IGhkbGMtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGdldHVzZXJieWNoYW4ocHJpdi0+Y2hhbm51bSk7CiAKLSAgICByZXR1cm4gZGV2LT5uYW1lOwotfQotCi0KLXN0YXRpYyAgICAgIHN0YXR1c190Ci1ta3JldCAoaW50IGJzZCkKLXsKLSAgICBpZiAoYnNkID4gMCkKLSAgICAgICAgcmV0dXJuIC1ic2Q7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gYnNkOworCXJldHVybiBkZXYtPm5hbWU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNzksOTU4ICsxNjgsOTQ2IEBACiAgKiB3aXRoaW4gYSBwb3J0J3MgZ3JvdXAuCiAgKi8KIHZvaWQKLWM0X3drX2NoYW5fcmVzdGFydCAobWNoX3QgKmNoKQorYzRfd2tfY2hhbl9yZXN0YXJ0KG1jaF90ICpjaCkKIHsKLSAgICBtcGlfdCAgICAgICpwaSA9IGNoLT51cDsKKwltcGlfdCAgICAgICpwaSA9IGNoLT51cDsKIAogI2lmZGVmIFJMRF9SRVNUQVJUX0RFQlVHCi0gICAgcHJfaW5mbygiPj4gJXM6IHF1ZXVlaW5nIFBvcnQgJWQgQ2hhbiAlZCwgbWNoX3QgQCAlcFxuIiwKLSAgICAgICAgICAgIF9fZnVuY19fLCBwaS0+cG9ydG51bSwgY2gtPmNoYW5udW0sIGNoKTsKKwlwcl9pbmZvKCI+PiAlczogcXVldWVpbmcgUG9ydCAlZCBDaGFuICVkLCBtY2hfdCBAICVwXG4iLAorCQlfX2Z1bmNfXywgcGktPnBvcnRudW0sIGNoLT5jaGFubnVtLCBjaCk7CiAjZW5kaWYKIAotICAgIC8qIGNyZWF0ZSBuZXcgZW50cnkgdy9pbiB3b3JrcXVldWUgZm9yIHRoaXMgY2hhbm5lbCBhbmQgbGV0J2VyIHJpcCAqLworCS8qIGNyZWF0ZSBuZXcgZW50cnkgdy9pbiB3b3JrcXVldWUgZm9yIHRoaXMgY2hhbm5lbCBhbmQgbGV0J2VyIHJpcCAqLwogCi0gICAgLyoqIHF1ZXVlX3dvcmsgKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpxdWV1ZSwKLSAgICAgKiogICAgICAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLSAgICAgKiovCi0gICAgcXVldWVfd29yayAocGktPndxX3BvcnQsICZjaC0+Y2hfd29yayk7CisJLyoqIHF1ZXVlX3dvcmsoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnF1ZXVlLAorCSAqKiAgICAgICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisJICoqLworCXF1ZXVlX3dvcmsocGktPndxX3BvcnQsICZjaC0+Y2hfd29yayk7CiB9CiAKIHN0YXR1c190Ci1jNF93a19jaGFuX2luaXQgKG1waV90ICpwaSwgbWNoX3QgKmNoKQorYzRfd2tfY2hhbl9pbml0KG1waV90ICpwaSwgbWNoX3QgKmNoKQogewotICAgIC8qCi0gICAgICogdGhpcyB3aWxsIGJlIHVzZWQgdG8gcmVzdGFydCBhIHN0b3BwZWQgY2hhbm5lbAotICAgICAqLworCS8qCisJICogdGhpcyB3aWxsIGJlIHVzZWQgdG8gcmVzdGFydCBhIHN0b3BwZWQgY2hhbm5lbAorCSAqLwogCi0gICAgLyoqIElOSVRfV09SSyAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrLAotICAgICAqKiAgICAgICAgICAgIHZvaWQgKCpmdW5jdGlvbikodm9pZCAqKSwKLSAgICAgKiogICAgICAgICAgICB2b2lkICpkYXRhKTsKLSAgICAgKiovCi0gICAgSU5JVF9XT1JLKCZjaC0+Y2hfd29yaywgKHZvaWQgKiltdXN5Y2Nfd3FfY2hhbl9yZXN0YXJ0KTsKLSAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1Y2Nlc3MgKi8KKwkvKiogSU5JVF9XT1JLKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaywKKwkgKiogICAgICAgICAgIHZvaWQgKCpmdW5jdGlvbikodm9pZCAqKSwKKwkgKiogICAgICAgICAgIHZvaWQgKmRhdGEpOworCSAqKi8KKwlJTklUX1dPUksoJmNoLT5jaF93b3JrLCAodm9pZCAqKW11c3ljY193cV9jaGFuX3Jlc3RhcnQpOworCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogc3VjY2VzcyAqLwogfQogCiBzdGF0dXNfdAotYzRfd3FfcG9ydF9pbml0IChtcGlfdCAqcGkpCitjNF93cV9wb3J0X2luaXQobXBpX3QgKnBpKQogewogCi0gICAgY2hhciAgICAgICAgbmFtZVsxNl0sICpucDsgIC8qIE5PVEU6IG5hbWUgb2YgdGhlIHF1ZXVlIGxpbWl0ZWQgYnkgc3lzdGVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIDEwIGNoYXJhY3RlcnMgKi8KKwljaGFyICAgICAgICBuYW1lWzE2XTsgIC8qIE5PVEU6IG5hbWUgb2YgdGhlIHF1ZXVlIGxpbWl0ZWQgYnkgc3lzdGVtCisJCQkJICAgICAqIHRvIDEwIGNoYXJhY3RlcnMgKi8KKwlpZiAocGktPndxX3BvcnQpCisJCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAvKiBhbHJlYWR5IGluaXRpYWxpemVkICovCiAKLSAgICBpZiAocGktPndxX3BvcnQpCi0gICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAvKiBhbHJlYWR5IGluaXRpYWxpemVkICovCi0KLSAgICBucCA9IG5hbWU7Ci0gICAgbWVtc2V0IChuYW1lLCAwLCAxNik7Ci0gICAgc3ByaW50ZiAobnAsICIlcyVkIiwgcGktPnVwLT5kZXZuYW1lLCBwaS0+cG9ydG51bSk7IC8qIElFIHBtY2M0LTAxKSAqLworCS8qIElFIHBtY2M0LTAxICovCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMlZCIsIHBpLT51cC0+ZGV2bmFtZSwgcGktPnBvcnRudW0pOwogCiAjaWZkZWYgUkxEX1JFU1RBUlRfREVCVUcKLSAgICBwcl9pbmZvKCI+PiAlczogY3JlYXRpbmcgd29ya3F1ZXVlIDwlcz4gZm9yIFBvcnQgJWQuXG4iLAotICAgICAgICAgICAgX19mdW5jX18sIG5hbWUsIHBpLT5wb3J0bnVtKTsgLyogUkxEIERFQlVHICovCisJcHJfaW5mbygiPj4gJXM6IGNyZWF0aW5nIHdvcmtxdWV1ZSA8JXM+IGZvciBQb3J0ICVkLlxuIiwKKwkJX19mdW5jX18sIG5hbWUsIHBpLT5wb3J0bnVtKTsgLyogUkxEIERFQlVHICovCiAjZW5kaWYKLSAgICBpZiAoIShwaS0+d3FfcG9ydCA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlIChuYW1lKSkpCi0gICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogc3VjY2VzcyAqLworCXBpLT53cV9wb3J0ID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUobmFtZSk7CisJaWYgKCFwaS0+d3FfcG9ydCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzdWNjZXNzICovCiB9CiAKIHZvaWQKLWM0X3dxX3BvcnRfY2xlYW51cCAobXBpX3QgKnBpKQorYzRfd3FfcG9ydF9jbGVhbnVwKG1waV90ICpwaSkKIHsKLSAgICAvKgotICAgICAqIFBPUlQgUE9JTlQ6IGNhbm5vdCBjYWxsIHRoaXMgaWYgV1EgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgdy9pbgotICAgICAqIHN0cnVjdHVyZSBzaW5jZSBpdCBjYWxscyBrZnJlZSh3cSk7Ci0gICAgICovCi0gICAgaWYgKHBpLT53cV9wb3J0KQotICAgIHsKLSAgICAgICAgZGVzdHJveV93b3JrcXVldWUgKHBpLT53cV9wb3J0KTsgICAgICAgIC8qIHRoaXMgYWxzbyBjYWxscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZmx1c2hfd29ya3F1ZXVlKCkgKi8KLSAgICAgICAgcGktPndxX3BvcnQgPSBOVUxMOwotICAgIH0KKwkvKgorCSAqIFBPUlQgUE9JTlQ6IGNhbm5vdCBjYWxsIHRoaXMgaWYgV1EgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgdy9pbgorCSAqIHN0cnVjdHVyZSBzaW5jZSBpdCBjYWxscyBrZnJlZSh3cSk7CisJICovCisJaWYgKHBpLT53cV9wb3J0KSB7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKHBpLT53cV9wb3J0KTsgICAgICAgIC8qIHRoaXMgYWxzbyBjYWxscworCQkJCQkJCSogZmx1c2hfd29ya3F1ZXVlKCkgKi8KKwkJcGktPndxX3BvcnQgPSBOVUxMOworCX0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotaXJxcmV0dXJuX3QKLWM0X2xpbnV4X2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQorc3RhdGljIGlycXJldHVybl90CitjNF9saW51eF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQogewotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2luc3RhbmNlOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2luc3RhbmNlOwogCi0gICAgcmV0dXJuIG11c3ljY19pbnRyX3RoX2hhbmRsZXIobmV0ZGV2X3ByaXYobmRldikpOworCXJldHVybiBtdXN5Y2NfaW50cl90aF9oYW5kbGVyKG5ldGRldl9wcml2KG5kZXYpKTsKIH0KIAogCiAjaWZkZWYgQ09ORklHX1NCRV9QTUNDNF9OQ09NTQotaXJxcmV0dXJuX3QKLWM0X2VidXNfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCitzdGF0aWMgaXJxcmV0dXJuX3QKK2M0X2VidXNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKIHsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGRldl9pbnN0YW5jZTsKIAotICAgIHJldHVybiBjNF9lYnVzX2ludHJfdGhfaGFuZGxlcihuZXRkZXZfcHJpdihuZGV2KSk7CisJcmV0dXJuIGM0X2VidXNfaW50cl90aF9oYW5kbGVyKG5ldGRldl9wcml2KG5kZXYpKTsKIH0KICNlbmRpZgogCiAKIHN0YXRpYyBpbnQKLXZvaWRfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit2b2lkX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0gICAgcHJfaW5mbygiJXM6IHRyeWluZyB0byBvcGVuIG1hc3RlciBkZXZpY2UgIVxuIiwgbmRldi0+bmFtZSk7Ci0gICAgcmV0dXJuIC0xOworCXByX2luZm8oIiVzOiB0cnlpbmcgdG8gb3BlbiBtYXN0ZXIgZGV2aWNlICFcbiIsIG5kZXYtPm5hbWUpOworCXJldHVybiAtMTsKIH0KIAogCiBzdGF0aWMgaW50Ci1jaGFuX29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQorY2hhbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewotICAgIGhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMgKG5kZXYpOwotICAgIGNvbnN0IHN0cnVjdCBjNF9wcml2ICpwcml2ID0gaGRsYy0+cHJpdjsKLSAgICBpbnQgICAgICAgICByZXQ7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhuZGV2KTsKKwljb25zdCBzdHJ1Y3QgYzRfcHJpdiAqcHJpdiA9IGhkbGMtPnByaXY7CisJaW50ICAgICAgICAgcmV0OwogCi0gICAgaWYgKChyZXQgPSBoZGxjX29wZW4gKG5kZXYpKSkKLSAgICB7Ci0gICAgICAgIHByX2luZm8oImhkbGNfb3BlbiBmYWlsdXJlLCBlcnIgJWQuXG4iLCByZXQpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBpZiAoKHJldCA9IGM0X2NoYW5fdXAgKHByaXYtPmNpLCBwcml2LT5jaGFubnVtKSkpCi0gICAgICAgIHJldHVybiAtcmV0OwotICAgIHRyeV9tb2R1bGVfZ2V0IChUSElTX01PRFVMRSk7Ci0gICAgbmV0aWZfc3RhcnRfcXVldWUgKG5kZXYpOwotICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gZXJyb3IgPSBzdWNjZXNzICovCisJcmV0ID0gaGRsY19vcGVuKG5kZXYpOworCWlmIChyZXQpIHsKKwkJcHJfaW5mbygiaGRsY19vcGVuIGZhaWx1cmUsIGVyciAlZC5cbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYzRfY2hhbl91cChwcml2LT5jaSwgcHJpdi0+Y2hhbm51bSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5kZXYpOworCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gZXJyb3IgPSBzdWNjZXNzICovCiB9CiAKIAogc3RhdGljIGludAotY2hhbl9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCitjaGFuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewotICAgIGhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMgKG5kZXYpOwotICAgIGNvbnN0IHN0cnVjdCBjNF9wcml2ICpwcml2ID0gaGRsYy0+cHJpdjsKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKG5kZXYpOworCWNvbnN0IHN0cnVjdCBjNF9wcml2ICpwcml2ID0gaGRsYy0+cHJpdjsKIAotICAgIG5ldGlmX3N0b3BfcXVldWUgKG5kZXYpOwotICAgIG11c3ljY19jaGFuX2Rvd24gKChjaV90ICopIDAsIHByaXYtPmNoYW5udW0pOwotICAgIGhkbGNfY2xvc2UgKG5kZXYpOwotICAgIG1vZHVsZV9wdXQgKFRISVNfTU9EVUxFKTsKLSAgICByZXR1cm4gMDsKKwluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCW11c3ljY19jaGFuX2Rvd24oKGNpX3QgKikgMCwgcHJpdi0+Y2hhbm51bSk7CisJaGRsY19jbG9zZShuZGV2KTsKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKwlyZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50Ci1jaGFuX2Rldl9pb2N0bCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCitjaGFuX2Rldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKIHsKLSAgICByZXR1cm4gaGRsY19pb2N0bCAoZGV2LCBpZnIsIGNtZCk7CisJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CiB9CiAKIAogc3RhdGljIGludAotY2hhbl9hdHRhY2hfbm9vcCAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHVuc2lnbmVkIHNob3J0IGZvb18xLCB1bnNpZ25lZCBzaG9ydCBmb29fMikKK2NoYW5fYXR0YWNoX25vb3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHVuc2lnbmVkIHNob3J0IGZvb18xLAorCQkgdW5zaWduZWQgc2hvcnQgZm9vXzIpCiB7Ci0gICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgIC8qIG91ciBkcml2ZXIgaGFzIG5vdGhpbmcgdG8gZG8gaGVyZSwgc2hvdydzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG92ZXIsIGdvIGhvbWUgKi8KKwkvKiBvdXIgZHJpdmVyIGhhcyBub3RoaW5nIHRvIGRvIGhlcmUsIHNob3cncworCSAqIG92ZXIsIGdvIGhvbWUKKwkgKi8KKwlyZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgotY2hhbl9nZXRfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQorY2hhbl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0gICAgbWNoX3QgICAgICAqY2g7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5zdGF0czsKLSAgICBzdHJ1Y3Qgc2JlY29tX2NoYW5fc3RhdHMgKnN0YXRzOwotICAgIGludCAgICAgICAgIGNoYW5udW07CisJbWNoX3QgICAgICAqY2g7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5zdGF0czsKKwlzdHJ1Y3Qgc2JlY29tX2NoYW5fc3RhdHMgKnN0YXRzOworCWludCAgICAgICAgIGNoYW5udW07CiAKLSAgICB7Ci0gICAgICAgIHN0cnVjdCBjNF9wcml2ICpwcml2OworCXsKKwkJc3RydWN0IGM0X3ByaXYgKnByaXY7CiAKLSAgICAgICAgcHJpdiA9IChzdHJ1Y3QgYzRfcHJpdiAqKSBkZXZfdG9faGRsYyAobmRldiktPnByaXY7Ci0gICAgICAgIGNoYW5udW0gPSBwcml2LT5jaGFubnVtOwotICAgIH0KKwkJcHJpdiA9IChzdHJ1Y3QgYzRfcHJpdiAqKWRldl90b19oZGxjKG5kZXYpLT5wcml2OworCQljaGFubnVtID0gcHJpdi0+Y2hhbm51bTsKKwl9CiAKLSAgICBjaCA9IGM0X2ZpbmRfY2hhbiAoY2hhbm51bSk7Ci0gICAgaWYgKGNoID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOworCWNoID0gYzRfZmluZF9jaGFuKGNoYW5udW0pOworCWlmIChjaCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKIAotICAgIG5zdGF0cyA9ICZuZGV2LT5zdGF0czsKLSAgICBzdGF0cyA9ICZjaC0+czsKKwluc3RhdHMgPSAmbmRldi0+c3RhdHM7CisJc3RhdHMgPSAmY2gtPnM7CiAKLSAgICBtZW1zZXQgKG5zdGF0cywgMCwgc2l6ZW9mIChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOwotICAgIG5zdGF0cy0+cnhfcGFja2V0cyA9IHN0YXRzLT5yeF9wYWNrZXRzOwotICAgIG5zdGF0cy0+dHhfcGFja2V0cyA9IHN0YXRzLT50eF9wYWNrZXRzOwotICAgIG5zdGF0cy0+cnhfYnl0ZXMgPSBzdGF0cy0+cnhfYnl0ZXM7Ci0gICAgbnN0YXRzLT50eF9ieXRlcyA9IHN0YXRzLT50eF9ieXRlczsKLSAgICBuc3RhdHMtPnJ4X2Vycm9ycyA9IHN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzICsKLSAgICAgICAgc3RhdHMtPnJ4X292ZXJfZXJyb3JzICsKLSAgICAgICAgc3RhdHMtPnJ4X2NyY19lcnJvcnMgKwotICAgICAgICBzdGF0cy0+cnhfZnJhbWVfZXJyb3JzICsKLSAgICAgICAgc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzICsKLSAgICAgICAgc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnM7Ci0gICAgbnN0YXRzLT50eF9lcnJvcnMgPSBzdGF0cy0+dHhfZHJvcHBlZCArCi0gICAgICAgIHN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycyArCi0gICAgICAgIHN0YXRzLT50eF9maWZvX2Vycm9yczsKLSAgICBuc3RhdHMtPnJ4X2Ryb3BwZWQgPSBzdGF0cy0+cnhfZHJvcHBlZDsKLSAgICBuc3RhdHMtPnR4X2Ryb3BwZWQgPSBzdGF0cy0+dHhfZHJvcHBlZDsKKwltZW1zZXQobnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKwluc3RhdHMtPnJ4X3BhY2tldHMgPSBzdGF0cy0+cnhfcGFja2V0czsKKwluc3RhdHMtPnR4X3BhY2tldHMgPSBzdGF0cy0+dHhfcGFja2V0czsKKwluc3RhdHMtPnJ4X2J5dGVzID0gc3RhdHMtPnJ4X2J5dGVzOworCW5zdGF0cy0+dHhfYnl0ZXMgPSBzdGF0cy0+dHhfYnl0ZXM7CisJbnN0YXRzLT5yeF9lcnJvcnMgPSBzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyArCisJCXN0YXRzLT5yeF9vdmVyX2Vycm9ycyArCisJCXN0YXRzLT5yeF9jcmNfZXJyb3JzICsKKwkJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyArCisJCXN0YXRzLT5yeF9maWZvX2Vycm9ycyArCisJCXN0YXRzLT5yeF9taXNzZWRfZXJyb3JzOworCW5zdGF0cy0+dHhfZXJyb3JzID0gc3RhdHMtPnR4X2Ryb3BwZWQgKworCQlzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMgKworCQlzdGF0cy0+dHhfZmlmb19lcnJvcnM7CisJbnN0YXRzLT5yeF9kcm9wcGVkID0gc3RhdHMtPnJ4X2Ryb3BwZWQ7CisJbnN0YXRzLT50eF9kcm9wcGVkID0gc3RhdHMtPnR4X2Ryb3BwZWQ7CiAKLSAgICBuc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgPSBzdGF0cy0+cnhfbGVuZ3RoX2Vycm9yczsKLSAgICBuc3RhdHMtPnJ4X292ZXJfZXJyb3JzID0gc3RhdHMtPnJ4X292ZXJfZXJyb3JzOwotICAgIG5zdGF0cy0+cnhfY3JjX2Vycm9ycyA9IHN0YXRzLT5yeF9jcmNfZXJyb3JzOwotICAgIG5zdGF0cy0+cnhfZnJhbWVfZXJyb3JzID0gc3RhdHMtPnJ4X2ZyYW1lX2Vycm9yczsKLSAgICBuc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzID0gc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzOwotICAgIG5zdGF0cy0+cnhfbWlzc2VkX2Vycm9ycyA9IHN0YXRzLT5yeF9taXNzZWRfZXJyb3JzOworCW5zdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyA9IHN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzOworCW5zdGF0cy0+cnhfb3Zlcl9lcnJvcnMgPSBzdGF0cy0+cnhfb3Zlcl9lcnJvcnM7CisJbnN0YXRzLT5yeF9jcmNfZXJyb3JzID0gc3RhdHMtPnJ4X2NyY19lcnJvcnM7CisJbnN0YXRzLT5yeF9mcmFtZV9lcnJvcnMgPSBzdGF0cy0+cnhfZnJhbWVfZXJyb3JzOworCW5zdGF0cy0+cnhfZmlmb19lcnJvcnMgPSBzdGF0cy0+cnhfZmlmb19lcnJvcnM7CisJbnN0YXRzLT5yeF9taXNzZWRfZXJyb3JzID0gc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnM7CiAKLSAgICBuc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzID0gc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzOwotICAgIG5zdGF0cy0+dHhfZmlmb19lcnJvcnMgPSBzdGF0cy0+dHhfZmlmb19lcnJvcnM7CisJbnN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycyA9IHN0YXRzLT50eF9hYm9ydGVkX2Vycm9yczsKKwluc3RhdHMtPnR4X2ZpZm9fZXJyb3JzID0gc3RhdHMtPnR4X2ZpZm9fZXJyb3JzOwogCi0gICAgcmV0dXJuIG5zdGF0czsKKwlyZXR1cm4gbnN0YXRzOwogfQogCiAKIHN0YXRpYyBjaV90ICoKLWdldF9jaV9ieV9kZXYgKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQorZ2V0X2NpX2J5X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKLSAgICByZXR1cm4gKGNpX3QgKikobmV0ZGV2X3ByaXYobmRldikpOworCXJldHVybiAoY2lfdCAqKShuZXRkZXZfcHJpdihuZGV2KSk7CiB9CiAKIAogc3RhdGljIGludAotYzRfbGludXhfeG1pdCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCitjNF9saW51eF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewotICAgIGNvbnN0IHN0cnVjdCBjNF9wcml2ICpwcml2OwotICAgIGludCAgICAgICAgIHJ2YWw7CisJY29uc3Qgc3RydWN0IGM0X3ByaXYgKnByaXY7CisJaW50ICAgICAgICAgcnZhbDsKIAotICAgIGhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMgKG5kZXYpOworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMobmRldik7CiAKLSAgICBwcml2ID0gaGRsYy0+cHJpdjsKKwlwcml2ID0gaGRsYy0+cHJpdjsKIAotICAgIHJ2YWwgPSBtdXN5Y2Nfc3RhcnRfeG1pdCAocHJpdi0+Y2ksIHByaXYtPmNoYW5udW0sIHNrYik7Ci0gICAgcmV0dXJuIHJ2YWw7CisJcnZhbCA9IG11c3ljY19zdGFydF94bWl0KHByaXYtPmNpLCBwcml2LT5jaGFubnVtLCBza2IpOworCXJldHVybiBydmFsOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGNoYW5fb3BzID0gewotICAgICAgIC5uZG9fb3BlbiAgICAgICA9IGNoYW5fb3BlbiwKLSAgICAgICAubmRvX3N0b3AgICAgICAgPSBjaGFuX2Nsb3NlLAotICAgICAgIC5uZG9fc3RhcnRfeG1pdCA9IGM0X2xpbnV4X3htaXQsCi0gICAgICAgLm5kb19kb19pb2N0bCAgID0gY2hhbl9kZXZfaW9jdGwsCi0gICAgICAgLm5kb19nZXRfc3RhdHMgID0gY2hhbl9nZXRfc3RhdHMsCisJLm5kb19vcGVuICAgICAgID0gY2hhbl9vcGVuLAorCS5uZG9fc3RvcCAgICAgICA9IGNoYW5fY2xvc2UsCisJLm5kb19zdGFydF94bWl0ID0gYzRfbGludXhfeG1pdCwKKwkubmRvX2RvX2lvY3RsICAgPSBjaGFuX2Rldl9pb2N0bCwKKwkubmRvX2dldF9zdGF0cyAgPSBjaGFuX2dldF9zdGF0cywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqCi1jcmVhdGVfY2hhbiAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGNpX3QgKmNpLAotICAgICAgICAgICAgIHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSAqY3ApCitjcmVhdGVfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgY2lfdCAqY2ksCisJICAgIHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSAqY3ApCiB7Ci0gICAgaGRsY19kZXZpY2UgKmhkbGM7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLSAgICBoZHdfaW5mb190ICpoaTsKLSAgICBpbnQgICAgICAgICByZXQ7CisJaGRsY19kZXZpY2UgKmhkbGM7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwloZHdfaW5mb190ICpoaTsKKwlpbnQgICAgICAgICByZXQ7CiAKLSAgICBpZiAoYzRfZmluZF9jaGFuIChjcC0+Y2hhbm51bSkpCi0gICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAvKiBjaGFubmVsIGFscmVhZHkgZXhpc3RzICovCisJaWYgKGM0X2ZpbmRfY2hhbihjcC0+Y2hhbm51bSkpCisJCXJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAvKiBjaGFubmVsIGFscmVhZHkgZXhpc3RzICovCiAKLSAgICB7Ci0gICAgICAgIHN0cnVjdCBjNF9wcml2ICpwcml2OworCXsKKwkJc3RydWN0IGM0X3ByaXYgKnByaXY7CiAKLSAgICAgICAgLyogYWxsb2NhdGUgdGhlbiBmaWxsIGluIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgcHJpdiA9IE9TX2ttYWxsb2MgKHNpemVvZiAoc3RydWN0IGM0X3ByaXYpKTsKLSAgICAgICAgaWYgKCFwcml2KQotICAgICAgICB7Ci0gICAgICAgICAgICBwcl93YXJuaW5nKCIlczogbm8gbWVtb3J5IGZvciBuZXRfZGV2aWNlICFcbiIsIGNpLT5kZXZuYW1lKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZGV2ID0gYWxsb2NfaGRsY2RldiAocHJpdik7Ci0gICAgICAgIGlmICghZGV2KQotICAgICAgICB7Ci0gICAgICAgICAgICBwcl93YXJuaW5nKCIlczogbm8gbWVtb3J5IGZvciBoZGxjX2RldmljZSAhXG4iLCBjaS0+ZGV2bmFtZSk7Ci0gICAgICAgICAgICBPU19rZnJlZSAocHJpdik7Ci0JICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHByaXYtPmNpID0gY2k7Ci0gICAgICAgIHByaXYtPmNoYW5udW0gPSBjcC0+Y2hhbm51bTsKLSAgICB9CisJCS8qIGFsbG9jYXRlIHRoZW4gZmlsbCBpbiBwcml2YXRlIGRhdGEgc3RydWN0dXJlICovCisJCXByaXYgPSBPU19rbWFsbG9jKHNpemVvZihzdHJ1Y3QgYzRfcHJpdikpOworCQlpZiAoIXByaXYpIHsKKwkJCXByX3dhcm5pbmcoIiVzOiBubyBtZW1vcnkgZm9yIG5ldF9kZXZpY2UgIVxuIiwKKwkJCQkgICBjaS0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlkZXYgPSBhbGxvY19oZGxjZGV2KHByaXYpOworCQlpZiAoIWRldikgeworCQkJcHJfd2FybmluZygiJXM6IG5vIG1lbW9yeSBmb3IgaGRsY19kZXZpY2UgIVxuIiwKKwkJCQkgICBjaS0+ZGV2bmFtZSk7CisJCQlPU19rZnJlZShwcml2KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXByaXYtPmNpID0gY2k7CisJCXByaXYtPmNoYW5udW0gPSBjcC0+Y2hhbm51bTsKKwl9CiAKLSAgICBoZGxjID0gZGV2X3RvX2hkbGMgKGRldik7CisJaGRsYyA9IGRldl90b19oZGxjKGRldik7CiAKLSAgICBkZXYtPmJhc2VfYWRkciA9IDA7ICAgICAgICAgICAgIC8qIG5vdCBJL08gbWFwcGVkICovCi0gICAgZGV2LT5pcnEgPSBuZGV2LT5pcnE7Ci0gICAgZGV2LT50eXBlID0gQVJQSFJEX1JBV0hETEM7Ci0gICAgKmRldi0+bmFtZSA9IDA7ICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0IGlmY29uZmlnIG5hbWUgPSAiaGRsYyIgKi8KKwlkZXYtPmJhc2VfYWRkciA9IDA7ICAgICAgICAgICAgIC8qIG5vdCBJL08gbWFwcGVkICovCisJZGV2LT5pcnEgPSBuZGV2LT5pcnE7CisJZGV2LT50eXBlID0gQVJQSFJEX1JBV0hETEM7CisJKmRldi0+bmFtZSA9IDA7ICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0IGlmY29uZmlnIG5hbWUgPSAiaGRsYyIgKi8KIAotICAgIGhpID0gKGhkd19pbmZvX3QgKikgY2ktPmhkd19pbmZvOwotICAgIGlmIChoaS0+bWZnX2luZm9fc3RzID09IEVFUFJPTV9PSykKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoaGktPnByb21mbXQpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBQUk9NX0ZPUk1BVF9UWVBFMToKLSAgICAgICAgICAgIG1lbWNweSAoZGV2LT5kZXZfYWRkciwgKEZMRF9UWVBFMSAqKSAoaGktPm1mZ19pbmZvLnBmdDEuU2VyaWFsKSwgNik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQUk9NX0ZPUk1BVF9UWVBFMjoKLSAgICAgICAgICAgIG1lbWNweSAoZGV2LT5kZXZfYWRkciwgKEZMRF9UWVBFMiAqKSAoaGktPm1mZ19pbmZvLnBmdDIuU2VyaWFsKSwgNik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIG1lbXNldCAoZGV2LT5kZXZfYWRkciwgMCwgNik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gZWxzZQotICAgIHsKLSAgICAgICAgbWVtc2V0IChkZXYtPmRldl9hZGRyLCAwLCA2KTsKLSAgICB9CisJaGkgPSAoaGR3X2luZm9fdCAqKWNpLT5oZHdfaW5mbzsKKwlpZiAoaGktPm1mZ19pbmZvX3N0cyA9PSBFRVBST01fT0spIHsKKwkJc3dpdGNoIChoaS0+cHJvbWZtdCkgeworCQljYXNlIFBST01fRk9STUFUX1RZUEUxOgorCQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsCisJCQkgICAgICAgKEZMRF9UWVBFMSAqKSAoaGktPm1mZ19pbmZvLnBmdDEuU2VyaWFsKSwgNik7CisJCQlicmVhazsKKwkJY2FzZSBQUk9NX0ZPUk1BVF9UWVBFMjoKKwkJCW1lbWNweShkZXYtPmRldl9hZGRyLAorCQkJICAgICAgIChGTERfVFlQRTIgKikgKGhpLT5tZmdfaW5mby5wZnQyLlNlcmlhbCksIDYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltZW1zZXQoZGV2LT5kZXZfYWRkciwgMCwgNik7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZQorCQltZW1zZXQoZGV2LT5kZXZfYWRkciwgMCwgNik7CiAKLSAgICBoZGxjLT54bWl0ID0gYzRfbGludXhfeG1pdDsKKwloZGxjLT54bWl0ID0gYzRfbGludXhfeG1pdDsKIAotICAgIGRldi0+bmV0ZGV2X29wcyA9ICZjaGFuX29wczsKLSAgICAvKgotICAgICAqIFRoZSBuYXRpdmUgaGRsYyBzdGFjayBjYWxscyB0aGlzICdhdHRhY2gnIHJvdXRpbmUgZHVyaW5nCi0gICAgICogaGRsY19yYXdfaW9jdGwoKSwgcGFzc2luZyBwYXJhbWV0ZXJzIGZvciBsaW5lIGVuY29kaW5nIGFuZCBwYXJpdHkuCi0gICAgICogU2luY2UgaGRsY19yYXdfaW9jdGwoKSBzdGFjayBkb2VzIG5vdCBpbnRlcnJvZ2F0ZSB3aGV0aGVyIGFuICdhdHRhY2gnCi0gICAgICogcm91dGluZSBpcyBhY3R1YWxseSByZWdpc3RlcmVkIG9yIG5vdCwgd2Ugc3VwcGx5IGEgZHVtbXkgcm91dGluZSB3aGljaAotICAgICAqIGRvZXMgbm90aGluZyAoc2luY2UgZW5jb2RpbmcgYW5kIHBhcml0eSBhcmUgc2V0dXAgZm9yIG91ciBkcml2ZXIgdmlhIGEKLSAgICAgKiBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gYXBwbGljYXRpb24pLgotICAgICAqLworCWRldi0+bmV0ZGV2X29wcyA9ICZjaGFuX29wczsKKwkvKgorCSAqIFRoZSBuYXRpdmUgaGRsYyBzdGFjayBjYWxscyB0aGlzICdhdHRhY2gnIHJvdXRpbmUgZHVyaW5nCisJICogaGRsY19yYXdfaW9jdGwoKSwgcGFzc2luZyBwYXJhbWV0ZXJzIGZvciBsaW5lIGVuY29kaW5nIGFuZCBwYXJpdHkuCisJICogU2luY2UgaGRsY19yYXdfaW9jdGwoKSBzdGFjayBkb2VzIG5vdCBpbnRlcnJvZ2F0ZSB3aGV0aGVyIGFuICdhdHRhY2gnCisJICogcm91dGluZSBpcyBhY3R1YWxseSByZWdpc3RlcmVkIG9yIG5vdCwgd2Ugc3VwcGx5IGEgZHVtbXkgcm91dGluZSB3aGljaAorCSAqIGRvZXMgbm90aGluZyAoc2luY2UgZW5jb2RpbmcgYW5kIHBhcml0eSBhcmUgc2V0dXAgZm9yIG91ciBkcml2ZXIgdmlhIGEKKwkgKiBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gYXBwbGljYXRpb24pLgorCSAqLwogCi0gICAgaGRsYy0+YXR0YWNoID0gY2hhbl9hdHRhY2hfbm9vcDsKKwloZGxjLT5hdHRhY2ggPSBjaGFuX2F0dGFjaF9ub29wOwogCi0gICAgcnRubF91bmxvY2sgKCk7ICAgICAgICAgICAgICAgICAvKiBuZWVkZWQgZHVlIHRvIElvY3RsIGNhbGxpbmcgc2VxdWVuY2UgKi8KLSAgICByZXQgPSByZWdpc3Rlcl9oZGxjX2RldmljZSAoZGV2KTsKLSAgICAvKiBOT1RFOiA8c3RhdHM+IHNldHRpbmcgbXVzdCBvY2N1ciBBRlRFUiByZWdpc3RyYXRpb24gaW4gb3JkZXIgdG8gInRha2UiICovCi0gICAgZGV2LT50eF9xdWV1ZV9sZW4gPSBNQVhfREVGQVVMVF9JRlFMRU47CisJLyogbmVlZGVkIGR1ZSB0byBJb2N0bCBjYWxsaW5nIHNlcXVlbmNlICovCisJcnRubF91bmxvY2soKTsKKwlyZXQgPSByZWdpc3Rlcl9oZGxjX2RldmljZShkZXYpOworCS8qIE5PVEU6IDxzdGF0cz4gc2V0dGluZyBtdXN0IG9jY3VyIEFGVEVSIHJlZ2lzdHJhdGlvbiBpbiBvcmRlciB0byAidGFrZSIgKi8KKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IE1BWF9ERUZBVUxUX0lGUUxFTjsKIAotICAgIHJ0bmxfbG9jayAoKTsgICAgICAgICAgICAgICAgICAgLyogbmVlZGVkIGR1ZSB0byBJb2N0bCBjYWxsaW5nIHNlcXVlbmNlICovCi0gICAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19XQVJOKQotICAgICAgICAgICAgcHJfaW5mbygiJXM6IGNyZWF0ZV9jaGFuWyVkXSByZWdpc3RyYXRpb24gZXJyb3IgPSAlZC5cbiIsCi0gICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjcC0+Y2hhbm51bSwgcmV0KTsKLSAgICAgICAgZnJlZV9uZXRkZXYgKGRldik7ICAgICAgICAgIC8qIGNsZWFudXAgKi8KLQlyZXR1cm4gTlVMTDsJCS8qIGZhaWxlZCB0byByZWdpc3RlciAqLwotICAgIH0KLSAgICByZXR1cm4gZGV2OworCS8qIG5lZWRlZCBkdWUgdG8gSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLworCXJ0bmxfbG9jaygpOworCWlmIChyZXQpIHsKKwkJaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pCisJCQlwcl9pbmZvKCIlczogY3JlYXRlX2NoYW5bJWRdIHJlZ2lzdHJhdGlvbiBlcnJvciA9ICVkLlxuIiwKKwkJCQljaS0+ZGV2bmFtZSwgY3AtPmNoYW5udW0sIHJldCk7CisJCS8qIGNsZWFudXAgKi8KKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJLyogZmFpbGVkIHRvIHJlZ2lzdGVyICovCisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gZGV2OwogfQogCiAKIC8qIHRoZSBpZGVhIGhlcmUgaXMgdG8gZ2V0IHBvcnQgaW5mb3JtYXRpb24gYW5kIHBhc3MgaXQgYmFjayAodXNpbmcgcG9pbnRlcikgKi8KLXN0YXRpYyAgICAgIHN0YXR1c190Ci1kb19nZXRfcG9ydCAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgc3RhdHVzX3QKK2RvX2dldF9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQogewotICAgIGludCAgICAgICAgIHJldDsKLSAgICBjaV90ICAgICAgICpjaTsgICAgICAgICAgICAgLyogY2kgc3RhbmRzIGZvciBjYXJkIGluZm9ybWF0aW9uICovCi0gICAgc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtIHBwOy8qIGNvcHkgZGF0YSB0byBrZXJuZWwgbGFuZCAqLworCWludCAgICAgICAgIHJldDsKKwljaV90ICAgICAgICpjaTsgICAgICAgICAgICAgLyogY2kgc3RhbmRzIGZvciBjYXJkIGluZm9ybWF0aW9uICovCisJc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtIHBwOy8qIGNvcHkgZGF0YSB0byBrZXJuZWwgbGFuZCAqLwogCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmcHAsIGRhdGEsIHNpemVvZiAoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIGlmIChwcC5wb3J0bnVtID49IE1VU1lDQ19OUE9SVFMpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIGNpID0gZ2V0X2NpX2J5X2RldiAobmRldik7Ci0gICAgaWYgKCFjaSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgIC8qIGdldCBjYXJkIGluZm8gKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJnBwLCBkYXRhLCBzaXplb2Yoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChwcC5wb3J0bnVtID49IE1VU1lDQ19OUE9SVFMpCisJCXJldHVybiAtRUZBVUxUOworCWNpID0gZ2V0X2NpX2J5X2RldihuZGV2KTsKKwlpZiAoIWNpKQorCQlyZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgLyogZ2V0IGNhcmQgaW5mbyAqLwogCi0gICAgcmV0ID0gbWtyZXQgKGM0X2dldF9wb3J0IChjaSwgcHAucG9ydG51bSkpOwotICAgIGlmIChyZXQpCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgaWYgKGNvcHlfdG9fdXNlciAoZGF0YSwgJmNpLT5wb3J0W3BwLnBvcnRudW1dLnAsCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0pKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgcmV0dXJuIDA7CisJcmV0ID0gYzRfZ2V0X3BvcnQoY2ksIHBwLnBvcnRudW0pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJmNpLT5wb3J0W3BwLnBvcnRudW1dLnAsCisJCQkgc2l6ZW9mKHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKIH0KIAogLyogdGhpcyBmdW5jdGlvbiBjb3B5cyB0aGUgdXNlciBkYXRhIGFuZCB0aGVuIGNhbGxzIHRoZSByZWFsIGFjdGlvbiBmdW5jdGlvbiAqLwotc3RhdGljICAgICAgc3RhdHVzX3QKLWRvX3NldF9wb3J0IChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBzdGF0dXNfdAorZG9fc2V0X3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgY2lfdCAgICAgICAqY2k7ICAgICAgICAgICAgIC8qIGNpIHN0YW5kcyBmb3IgY2FyZCBpbmZvcm1hdGlvbiAqLwotICAgIHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSBwcDsvKiBjb3B5IGRhdGEgdG8ga2VybmVsIGxhbmQgKi8KKwljaV90ICAgICAgICpjaTsgICAgICAgICAgICAgLyogY2kgc3RhbmRzIGZvciBjYXJkIGluZm9ybWF0aW9uICovCisJc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtIHBwOy8qIGNvcHkgZGF0YSB0byBrZXJuZWwgbGFuZCAqLwogCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmcHAsIGRhdGEsIHNpemVvZiAoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIGlmIChwcC5wb3J0bnVtID49IE1VU1lDQ19OUE9SVFMpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIGNpID0gZ2V0X2NpX2J5X2RldiAobmRldik7Ci0gICAgaWYgKCFjaSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgIC8qIGdldCBjYXJkIGluZm8gKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJnBwLCBkYXRhLCBzaXplb2Yoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChwcC5wb3J0bnVtID49IE1VU1lDQ19OUE9SVFMpCisJCXJldHVybiAtRUZBVUxUOworCWNpID0gZ2V0X2NpX2J5X2RldihuZGV2KTsKKwlpZiAoIWNpKQorCQlyZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgLyogZ2V0IGNhcmQgaW5mbyAqLwogCi0gICAgaWYgKHBwLnBvcnRudW0gPj0gY2ktPm1heF9wb3J0KSAvKiBzYW5pdHkgY2hlY2sgKi8KLSAgICAgICAgcmV0dXJuIC1FTlhJTzsKKwlpZiAocHAucG9ydG51bSA+PSBjaS0+bWF4X3BvcnQpIC8qIHNhbml0eSBjaGVjayAqLworCQlyZXR1cm4gLUVOWElPOwogCi0gICAgbWVtY3B5ICgmY2ktPnBvcnRbcHAucG9ydG51bV0ucCwgJnBwLCBzaXplb2YgKHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSkpOwotICAgIHJldHVybiBta3JldCAoYzRfc2V0X3BvcnQgKGNpLCBwcC5wb3J0bnVtKSk7CisJbWVtY3B5KCZjaS0+cG9ydFtwcC5wb3J0bnVtXS5wLCAmcHAsIHNpemVvZihzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0pKTsKKwlyZXR1cm4gYzRfc2V0X3BvcnQoY2ksIHBwLnBvcnRudW0pOwogfQogCiAvKiB3b3JrIHRoZSBwb3J0IGxvb3BiYWNrIG1vZGUgYXMgcGVyIGRpcmVjdGVkICovCi1zdGF0aWMgICAgICBzdGF0dXNfdAotZG9fcG9ydF9sb29wIChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBzdGF0dXNfdAorZG9fcG9ydF9sb29wKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQogewotICAgIHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSBwcDsKLSAgICBjaV90ICAgICAgICpjaTsKKwlzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0gcHA7CisJY2lfdCAgICAgICAqY2k7CiAKLSAgICBpZiAoY29weV9mcm9tX3VzZXIgKCZwcCwgZGF0YSwgc2l6ZW9mIChzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0pKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgY2kgPSBnZXRfY2lfYnlfZGV2IChuZGV2KTsKLSAgICBpZiAoIWNpKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICByZXR1cm4gbWtyZXQgKGM0X2xvb3BfcG9ydCAoY2ksIHBwLnBvcnRudW0sIHBwLnBvcnRfbW9kZSkpOworCWlmIChjb3B5X2Zyb21fdXNlcigmcHAsIGRhdGEsIHNpemVvZihzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJY2kgPSBnZXRfY2lfYnlfZGV2KG5kZXYpOworCWlmICghY2kpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBjNF9sb29wX3BvcnQoY2ksIHBwLnBvcnRudW0sIHBwLnBvcnRfbW9kZSk7CiB9CiAKIC8qIHNldCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIHdpdGggdGhlIGdpdmVuIHZhbHVlIC8gb3IganVzdCByZWFkIGl0ICovCi1zdGF0aWMgICAgICBzdGF0dXNfdAotZG9fZnJhbWVyX3J3IChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBzdGF0dXNfdAorZG9fZnJhbWVyX3J3KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQogewotICAgIHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSBwcDsKLSAgICBjaV90ICAgICAgICpjaTsKLSAgICBpbnQgICAgICAgICByZXQ7CisJc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtIHBwOworCWNpX3QgICAgICAgKmNpOworCWludCAgICAgICAgIHJldDsKIAotICAgIGlmIChjb3B5X2Zyb21fdXNlciAoJnBwLCBkYXRhLCBzaXplb2YgKHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICBjaSA9IGdldF9jaV9ieV9kZXYgKG5kZXYpOwotICAgIGlmICghY2kpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIHJldCA9IG1rcmV0IChjNF9mcmFtZV9ydyAoY2ksICZwcCkpOwotICAgIGlmIChyZXQpCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgaWYgKGNvcHlfdG9fdXNlciAoZGF0YSwgJnBwLCBzaXplb2YgKHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICByZXR1cm4gMDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnBwLCBkYXRhLCBzaXplb2Yoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCWNpID0gZ2V0X2NpX2J5X2RldihuZGV2KTsKKwlpZiAoIWNpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSBjNF9mcmFtZV9ydyhjaSwgJnBwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoY29weV90b191c2VyKGRhdGEsICZwcCwgc2l6ZW9mKHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKIH0KIAogLyogc2V0IHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUgLyBvciBqdXN0IHJlYWQgaXQgKi8KLXN0YXRpYyAgICAgIHN0YXR1c190Ci1kb19wbGRfcncgKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQorc3RhdGljIHN0YXR1c190Citkb19wbGRfcncoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtIHBwOwotICAgIGNpX3QgICAgICAgKmNpOwotICAgIGludCAgICAgICAgIHJldDsKKwlzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0gcHA7CisJY2lfdCAgICAgICAqY2k7CisJaW50ICAgICAgICAgcmV0OwogCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmcHAsIGRhdGEsIHNpemVvZiAoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIGNpID0gZ2V0X2NpX2J5X2RldiAobmRldik7Ci0gICAgaWYgKCFjaSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgcmV0ID0gbWtyZXQgKGM0X3BsZF9ydyAoY2ksICZwcCkpOwotICAgIGlmIChyZXQpCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgaWYgKGNvcHlfdG9fdXNlciAoZGF0YSwgJnBwLCBzaXplb2YgKHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICByZXR1cm4gMDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnBwLCBkYXRhLCBzaXplb2Yoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCWNpID0gZ2V0X2NpX2J5X2RldihuZGV2KTsKKwlpZiAoIWNpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGM0X3BsZF9ydyhjaSwgJnBwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJnBwLCBzaXplb2Yoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOwogfQogCiAvKiBzZXQgdGhlIHNwZWNpZmllZCByZWdpc3RlciB3aXRoIHRoZSBnaXZlbiB2YWx1ZSAvIG9yIGp1c3QgcmVhZCBpdCAqLwotc3RhdGljICAgICAgc3RhdHVzX3QKLWRvX211c3ljY19ydyAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgc3RhdHVzX3QKK2RvX211c3ljY19ydyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKIHsKLSAgICBzdHJ1Y3QgYzRfbXVzeWNjX3BhcmFtIG1wOwotICAgIGNpX3QgICAgICAgKmNpOwotICAgIGludCAgICAgICAgIHJldDsKKwlzdHJ1Y3QgYzRfbXVzeWNjX3BhcmFtIG1wOworCWNpX3QgICAgICAgKmNpOworCWludCAgICAgICAgIHJldDsKIAotICAgIGlmIChjb3B5X2Zyb21fdXNlciAoJm1wLCBkYXRhLCBzaXplb2YgKHN0cnVjdCBjNF9tdXN5Y2NfcGFyYW0pKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgY2kgPSBnZXRfY2lfYnlfZGV2IChuZGV2KTsKLSAgICBpZiAoIWNpKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICByZXQgPSBta3JldCAoYzRfbXVzeWNjX3J3IChjaSwgJm1wKSk7Ci0gICAgaWYgKHJldCkKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICBpZiAoY29weV90b191c2VyIChkYXRhLCAmbXAsIHNpemVvZiAoc3RydWN0IGM0X211c3ljY19wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICByZXR1cm4gMDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJm1wLCBkYXRhLCBzaXplb2Yoc3RydWN0IGM0X211c3ljY19wYXJhbSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwljaSA9IGdldF9jaV9ieV9kZXYobmRldik7CisJaWYgKCFjaSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0gYzRfbXVzeWNjX3J3KGNpLCAmbXApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJm1wLCBzaXplb2Yoc3RydWN0IGM0X211c3ljY19wYXJhbSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljICAgICAgc3RhdHVzX3QKLWRvX2dldF9jaGFuIChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBzdGF0dXNfdAorZG9fZ2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtIGNwOwotICAgIGludCAgICAgICAgIHJldDsKKwlzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0gY3A7CisJaW50ICAgICAgICAgcmV0OwogCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmY3AsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNwLCBkYXRhLAorCQkJCXNpemVvZihzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKLSAgICBpZiAoKHJldCA9IG1rcmV0IChjNF9nZXRfY2hhbiAoY3AuY2hhbm51bSwgJmNwKSkpKQotICAgICAgICByZXR1cm4gcmV0OworCXJldCA9IGM0X2dldF9jaGFuKGNwLmNoYW5udW0sICZjcCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKLSAgICBpZiAoY29weV90b191c2VyIChkYXRhLCAmY3AsIHNpemVvZiAoc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIHJldHVybiAwOworCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJmNwLCBzaXplb2Yoc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgICAgICBzdGF0dXNfdAotZG9fc2V0X2NoYW4gKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQorc3RhdGljIHN0YXR1c190Citkb19zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKIHsKLSAgICBzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0gY3A7Ci0gICAgaW50ICAgICAgICAgcmV0OwotICAgIGNpX3QgICAgICAgKmNpOworCXN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSBjcDsKKwljaV90ICAgICAgICpjaTsKIAotICAgIGlmIChjb3B5X2Zyb21fdXNlciAoJmNwLCBkYXRhLCBzaXplb2YgKHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICBjaSA9IGdldF9jaV9ieV9kZXYgKG5kZXYpOwotICAgIGlmICghY2kpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIHN3aXRjaCAocmV0ID0gbWtyZXQgKGM0X3NldF9jaGFuIChjcC5jaGFubnVtLCAmY3ApKSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgICByZXR1cm4gMDsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KKwlpZiAoY29weV9mcm9tX3VzZXIoJmNwLCBkYXRhLCBzaXplb2Yoc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCWNpID0gZ2V0X2NpX2J5X2RldihuZGV2KTsKKwlpZiAoIWNpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gYzRfc2V0X2NoYW4oY3AuY2hhbm51bSwgJmNwKTsKIH0KIAotc3RhdGljICAgICAgc3RhdHVzX3QKLWRvX2NyZWF0ZV9jaGFuIChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBzdGF0dXNfdAorZG9fY3JlYXRlX2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgY2lfdCAgICAgICAqY2k7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLSAgICBzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0gY3A7Ci0gICAgaW50ICAgICAgICAgcmV0OworCWNpX3QgICAgICAgKmNpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtIGNwOworCWludCAgICAgICAgIHJldDsKIAotICAgIGlmIChjb3B5X2Zyb21fdXNlciAoJmNwLCBkYXRhLCBzaXplb2YgKHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICBjaSA9IGdldF9jaV9ieV9kZXYgKG5kZXYpOwotICAgIGlmICghY2kpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIGRldiA9IGNyZWF0ZV9jaGFuIChuZGV2LCBjaSwgJmNwKTsKLSAgICBpZiAoIWRldikKLSAgICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICByZXQgPSBta3JldCAoYzRfbmV3X2NoYW4gKGNpLCBjcC5wb3J0LCBjcC5jaGFubnVtLCBkZXYpKTsKLSAgICBpZiAocmV0KQotICAgIHsKLSAgICAgICAgcnRubF91bmxvY2sgKCk7ICAgICAgICAgICAgIC8qIG5lZWRlZCBkdWUgdG8gSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLwotICAgICAgICB1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlIChkZXYpOwotICAgICAgICBydG5sX2xvY2sgKCk7ICAgICAgICAgICAgICAgLyogbmVlZGVkIGR1ZSB0byBJb2N0bCBjYWxsaW5nIHNlcXVlbmNlICovCi0gICAgICAgIGZyZWVfbmV0ZGV2IChkZXYpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OworCWlmIChjb3B5X2Zyb21fdXNlcigmY3AsIGRhdGEsIHNpemVvZihzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJY2kgPSBnZXRfY2lfYnlfZGV2KG5kZXYpOworCWlmICghY2kpCisJCXJldHVybiAtRUlOVkFMOworCWRldiA9IGNyZWF0ZV9jaGFuKG5kZXYsIGNpLCAmY3ApOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVCVVNZOworCXJldCA9IGM0X25ld19jaGFuKGNpLCBjcC5wb3J0LCBjcC5jaGFubnVtLCBkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCS8qIG5lZWRlZCBkdWUgdG8gSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLworCQlydG5sX3VubG9jaygpOworCQl1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldik7CisJCS8qIG5lZWRlZCBkdWUgdG8gSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLworCQlydG5sX2xvY2soKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljICAgICAgc3RhdHVzX3QKLWRvX2dldF9jaGFuX3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBzdGF0dXNfdAorZG9fZ2V0X2NoYW5fc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgc3RydWN0IGM0X2NoYW5fc3RhdHNfd3JhcCBjY3M7Ci0gICAgaW50ICAgICAgICAgcmV0OworCXN0cnVjdCBjNF9jaGFuX3N0YXRzX3dyYXAgY2NzOworCWludCAgICAgICAgIHJldDsKIAotICAgIGlmIChjb3B5X2Zyb21fdXNlciAoJmNjcywgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IGM0X2NoYW5fc3RhdHNfd3JhcCkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICBzd2l0Y2ggKHJldCA9IG1rcmV0IChjNF9nZXRfY2hhbl9zdGF0cyAoY2NzLmNoYW5udW0sICZjY3Muc3RhdHMpKSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBpZiAoY29weV90b191c2VyIChkYXRhLCAmY2NzLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IGM0X2NoYW5fc3RhdHNfd3JhcCkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICByZXR1cm4gMDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNjcywgZGF0YSwKKwkJCSAgIHNpemVvZihzdHJ1Y3QgYzRfY2hhbl9zdGF0c193cmFwKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0ID0gYzRfZ2V0X2NoYW5fc3RhdHMoY2NzLmNoYW5udW0sICZjY3Muc3RhdHMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGNvcHlfdG9fdXNlcihkYXRhLCAmY2NzLAorCQkJIHNpemVvZihzdHJ1Y3QgYzRfY2hhbl9zdGF0c193cmFwKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOwogfQotc3RhdGljICAgICAgc3RhdHVzX3QKLWRvX3NldF9sb2dsZXZlbCAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgc3RhdHVzX3QKK2RvX3NldF9sb2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKIHsKLSAgICB1bnNpZ25lZCBpbnQgY3h0MWUxX2xvZ19sZXZlbDsKKwl1bnNpZ25lZCBpbnQgY3h0MWUxX2xvZ19sZXZlbDsKIAotICAgIGlmIChjb3B5X2Zyb21fdXNlciAoJmN4dDFlMV9sb2dfbGV2ZWwsIGRhdGEsIHNpemVvZiAoaW50KSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIHNiZWNvbV9zZXRfbG9nbGV2ZWwgKGN4dDFlMV9sb2dfbGV2ZWwpOwotICAgIHJldHVybiAwOworCWlmIChjb3B5X2Zyb21fdXNlcigmY3h0MWUxX2xvZ19sZXZlbCwgZGF0YSwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlzYmVjb21fc2V0X2xvZ2xldmVsKGN4dDFlMV9sb2dfbGV2ZWwpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgICAgICBzdGF0dXNfdAotZG9fZGVsdXNlciAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGludCBsb2NraXQpCitzdGF0aWMgc3RhdHVzX3QKK2RvX2RlbHVzZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGludCBsb2NraXQpCiB7Ci0gICAgaWYgKG5kZXYtPmZsYWdzICYgSUZGX1VQKQotICAgICAgICByZXR1cm4gLUVCVVNZOworCWlmIChuZGV2LT5mbGFncyAmIElGRl9VUCkKKwkJcmV0dXJuIC1FQlVTWTsKIAotICAgIHsKLSAgICAgICAgY2lfdCAgICAgICAqY2k7Ci0gICAgICAgIG1jaF90ICAgICAgKmNoOwotICAgICAgICBjb25zdCBzdHJ1Y3QgYzRfcHJpdiAqcHJpdjsKLSAgICAgICAgaW50ICAgICAgICAgY2hhbm51bTsKKwl7CisJCWNpX3QgICAgICAgKmNpOworCQltY2hfdCAgICAgICpjaDsKKwkJY29uc3Qgc3RydWN0IGM0X3ByaXYgKnByaXY7CisJCWludCAgICAgICAgIGNoYW5udW07CiAKLSAgICAgICAgcHJpdiA9IChzdHJ1Y3QgYzRfcHJpdiAqKSBkZXZfdG9faGRsYyAobmRldiktPnByaXY7Ci0gICAgICAgIGNpID0gcHJpdi0+Y2k7Ci0gICAgICAgIGNoYW5udW0gPSBwcml2LT5jaGFubnVtOworCQlwcml2ID0gKHN0cnVjdCBjNF9wcml2ICopZGV2X3RvX2hkbGMobmRldiktPnByaXY7CisJCWNpID0gcHJpdi0+Y2k7CisJCWNoYW5udW0gPSBwcml2LT5jaGFubnVtOwogCi0gICAgICAgIGNoID0gYzRfZmluZF9jaGFuIChjaGFubnVtKTsKLSAgICAgICAgaWYgKGNoID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gLUVOT0VOVDsKLQljaC0+dXNlciA9IE5VTEw7CS8qIHdpbGwgYmUgZnJlZWQsIGJlbG93ICovCi0gICAgfQorCQljaCA9IGM0X2ZpbmRfY2hhbihjaGFubnVtKTsKKwkJaWYgKGNoID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJY2gtPnVzZXIgPSBOVUxMOwkvKiB3aWxsIGJlIGZyZWVkLCBiZWxvdyAqLworCX0KIAotICAgIGlmIChsb2NraXQpCi0gICAgICAgIHJ0bmxfdW5sb2NrICgpOyAgICAgICAgICAgICAvKiBuZWVkZWQgaWYgSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLwotICAgIHVucmVnaXN0ZXJfaGRsY19kZXZpY2UgKG5kZXYpOwotICAgIGlmIChsb2NraXQpCi0gICAgICAgIHJ0bmxfbG9jayAoKTsgICAgICAgICAgICAgICAvKiBuZWVkZWQgaWYgSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLwotICAgIGZyZWVfbmV0ZGV2IChuZGV2KTsKLSAgICByZXR1cm4gMDsKKwkvKiBuZWVkZWQgaWYgSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLworCWlmIChsb2NraXQpCisJCXJ0bmxfdW5sb2NrKCk7CisJdW5yZWdpc3Rlcl9oZGxjX2RldmljZShuZGV2KTsKKwkvKiBuZWVkZWQgaWYgSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLworCWlmIChsb2NraXQpCisJCXJ0bmxfbG9jaygpOworCWZyZWVfbmV0ZGV2KG5kZXYpOworCXJldHVybiAwOwogfQogCiBpbnQKLWRvX2RlbF9jaGFuIChzdHJ1Y3QgbmV0X2RldmljZSAqbXVzeWNjX2Rldiwgdm9pZCAqZGF0YSkKK2RvX2RlbF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICptdXN5Y2NfZGV2LCB2b2lkICpkYXRhKQogewotICAgIHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSBjcDsKLSAgICBjaGFyICAgICAgICBidWZbc2l6ZW9mIChDSEFOTkFNRSkgKyAzXTsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotICAgIGludCAgICAgICAgIHJldDsKKwlzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0gY3A7CisJY2hhciAgICAgICAgYnVmW3NpemVvZihDSEFOTkFNRSkgKyAzXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCAgICAgICAgIHJldDsKIAotICAgIGlmIChjb3B5X2Zyb21fdXNlciAoJmNwLCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0pKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgaWYgKGNwLmNoYW5udW0gPiA5OTkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIHNucHJpbnRmIChidWYsIHNpemVvZihidWYpLCBDSEFOTkFNRSAiJWQiLCBjcC5jaGFubnVtKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNwLCBkYXRhLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoY3AuY2hhbm51bSA+IDk5OSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgQ0hBTk5BTUUgIiVkIiwgY3AuY2hhbm51bSk7CiAJZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBidWYpOwogCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKLSAgICByZXQgPSBkb19kZWx1c2VyIChkZXYsIDEpOwotICAgIGlmIChyZXQpCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgcmV0dXJuIGM0X2RlbF9jaGFuIChjcC5jaGFubnVtKTsKKwlyZXQgPSBkb19kZWx1c2VyKGRldiwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gYzRfZGVsX2NoYW4oY3AuY2hhbm51bSk7CiB9Ci1pbnQgICAgICAgICBjNF9yZXNldF9ib2FyZCAodm9pZCAqKTsKK2ludCBjNF9yZXNldF9ib2FyZCh2b2lkICopOwogCiBpbnQKLWRvX3Jlc2V0IChzdHJ1Y3QgbmV0X2RldmljZSAqbXVzeWNjX2Rldiwgdm9pZCAqZGF0YSkKK2RvX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICptdXN5Y2NfZGV2LCB2b2lkICpkYXRhKQogewotICAgIGNvbnN0IHN0cnVjdCBjNF9wcml2ICpwcml2OwotICAgIGludCAgICAgICAgIGk7CisJY29uc3Qgc3RydWN0IGM0X3ByaXYgKnByaXY7CisJaW50ICAgICAgICAgaTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKLSAgICB7Ci0gICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwotICAgICAgICBjaGFyICAgICAgICBidWZbc2l6ZW9mIChDSEFOTkFNRSkgKyAzXTsKKwlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJCWNoYXIgICAgICAgIGJ1ZltzaXplb2YoQ0hBTk5BTUUpICsgM107CiAKLSAgICAgICAgc3ByaW50ZiAoYnVmLCBDSEFOTkFNRSAiJWQiLCBpKTsKLQluZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBidWYpOwotCWlmICghbmRldikKLQkJY29udGludWU7Ci0gICAgICAgIHByaXYgPSBkZXZfdG9faGRsYyAobmRldiktPnByaXY7CisJCXNwcmludGYoYnVmLCBDSEFOTkFNRSAiJWQiLCBpKTsKKwkJbmRldiA9IF9fZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgYnVmKTsKKwkJaWYgKCFuZGV2KQorCQkJY29udGludWU7CisJCXByaXYgPSBkZXZfdG9faGRsYyhuZGV2KS0+cHJpdjsKIAotICAgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIChwcml2LT5jaSkgPT0KLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSAobmV0ZGV2X3ByaXYobXVzeWNjX2RldikpKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZGV2LT5mbGFncyAmPSB+SUZGX1VQOwotICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZSAobmRldik7Ci0gICAgICAgICAgICBkb19kZWx1c2VyIChuZGV2LCAxKTsKKwkJaWYgKCh1bnNpZ25lZCBsb25nKSAocHJpdi0+Y2kpID09CisJCQkodW5zaWduZWQgbG9uZykgKG5ldGRldl9wcml2KG11c3ljY19kZXYpKSkgeworCQkJbmRldi0+ZmxhZ3MgJj0gfklGRl9VUDsKKwkJCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJCQlkb19kZWx1c2VyKG5kZXYsIDEpOworCQl9CiAJfQotICAgIH0KLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogaW50Ci1kb19yZXNldF9jaGFuX3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqbXVzeWNjX2Rldiwgdm9pZCAqZGF0YSkKK2RvX3Jlc2V0X2NoYW5fc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm11c3ljY19kZXYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtIGNwOworCXN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSBjcDsKIAotICAgIGlmIChjb3B5X2Zyb21fdXNlciAoJmNwLCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0pKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgcmV0dXJuIG1rcmV0IChjNF9kZWxfY2hhbl9zdGF0cyAoY3AuY2hhbm51bSkpOworCWlmIChjb3B5X2Zyb21fdXNlcigmY3AsIGRhdGEsCisJCQkgICBzaXplb2Yoc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiBjNF9kZWxfY2hhbl9zdGF0cyhjcC5jaGFubnVtKTsKIH0KIAotc3RhdGljICAgICAgc3RhdHVzX3QKLWM0X2lvY3RsIChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCitzdGF0aWMgc3RhdHVzX3QKK2M0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKIHsKLSAgICBjaV90ICAgICAgICpjaTsKLSAgICB2b2lkICAgICAgICpkYXRhOwotICAgIGludCAgICAgICAgIGlvY21kLCBpb2xlbjsKLSAgICBzdGF0dXNfdCAgICByZXQ7Ci0gICAgc3RhdGljIHN0cnVjdCBkYXRhCi0gICAgewotICAgICAgICB1bmlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB1X2ludDhfdCBjOwotICAgICAgICAgICAgdV9pbnQzMl90IGk7Ci0gICAgICAgICAgICBzdHJ1Y3Qgc2JlX2JyZF9pbmZvIGJpcDsKLSAgICAgICAgICAgIHN0cnVjdCBzYmVfZHJ2X2luZm8gZGlwOwotICAgICAgICAgICAgc3RydWN0IHNiZV9paWRfaW5mbyBpaXA7Ci0gICAgICAgICAgICBzdHJ1Y3Qgc2JlX2JyZF9hZGRyIGJhcDsKLSAgICAgICAgICAgIHN0cnVjdCBzYmVjb21fY2hhbl9zdGF0cyBzdGF0czsKLSAgICAgICAgICAgIHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSBwYXJhbTsKLSAgICAgICAgICAgIHN0cnVjdCB0ZW11eF9jYXJkX3N0YXRzIGNhcmRzOwotICAgICAgICAgICAgc3RydWN0IHNiZWNvbV9jYXJkX3BhcmFtIGNhcmRwOwotICAgICAgICAgICAgc3RydWN0IHNiZWNvbV9mcmFtZXJfcGFyYW0gZnJwOwotICAgICAgICB9ICAgICAgICAgICB1OwotICAgIH0gICAgICAgICAgIGFyZzsKKwljaV90ICAgICAgICpjaTsKKwl2b2lkICAgICAgICpkYXRhOworCWludCAgICAgICAgIGlvY21kLCBpb2xlbjsKKwlzdGF0dXNfdCAgICByZXQ7CisJc3RhdGljIHN0cnVjdCBkYXRhIHsKKwkJdW5pb24geworCQkJdV9pbnQ4X3QgYzsKKwkJCXVfaW50MzJfdCBpOworCQkJc3RydWN0IHNiZV9icmRfaW5mbyBiaXA7CisJCQlzdHJ1Y3Qgc2JlX2Rydl9pbmZvIGRpcDsKKwkJCXN0cnVjdCBzYmVfaWlkX2luZm8gaWlwOworCQkJc3RydWN0IHNiZV9icmRfYWRkciBiYXA7CisJCQlzdHJ1Y3Qgc2JlY29tX2NoYW5fc3RhdHMgc3RhdHM7CisJCQlzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0gcGFyYW07CisJCQlzdHJ1Y3QgdGVtdXhfY2FyZF9zdGF0cyBjYXJkczsKKwkJCXN0cnVjdCBzYmVjb21fY2FyZF9wYXJhbSBjYXJkcDsKKwkJCXN0cnVjdCBzYmVjb21fZnJhbWVyX3BhcmFtIGZycDsKKwkJfSB1OworCX0gYXJnOwogCiAKLSAgICBpZiAoIWNhcGFibGUgKENBUF9TWVNfQURNSU4pKQotICAgICAgICByZXR1cm4gLUVQRVJNOwotICAgIGlmIChjbWQgIT0gU0lPQ0RFVlBSSVZBVEUgKyAxNSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKCEoY2kgPSBnZXRfY2lfYnlfZGV2IChuZGV2KSkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIGlmIChjaS0+c3RhdGUgIT0gQ19SVU5OSU5HKQotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICBpZiAoY29weV9mcm9tX3VzZXIgKCZpb2NtZCwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mIChpb2NtZCkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJaWYgKGNtZCAhPSBTSU9DREVWUFJJVkFURSArIDE1KQorCQlyZXR1cm4gLUVJTlZBTDsKKwljaSA9IGdldF9jaV9ieV9kZXYobmRldik7CisJaWYgKCFjaSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNpLT5zdGF0ZSAhPSBDX1JVTk5JTkcpCisJCXJldHVybiAtRU5PREVWOworCWlmIChjb3B5X2Zyb21fdXNlcigmaW9jbWQsIGlmci0+aWZyX2RhdGEsIHNpemVvZihpb2NtZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKICNpZiAwCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmbGVuLCBpZnItPmlmcl9kYXRhICsgc2l6ZW9mIChpb2NtZCksIHNpemVvZiAobGVuKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmbGVuLCBpZnItPmlmcl9kYXRhICsgc2l6ZW9mKGlvY21kKSwgc2l6ZW9mKGxlbikpKQorCQlyZXR1cm4gLUVGQVVMVDsKICNlbmRpZgogCiAjaWYgMAotICAgIHByX2luZm8oImM0X2lvY3RsOiBpb2NtZCAleCwgZGlyICV4IHR5cGUgJXggbnIgJXggaW9sZW4gJWQuXG4iLCBpb2NtZCwKLSAgICAgICAgICAgIF9JT0NfRElSIChpb2NtZCksIF9JT0NfVFlQRSAoaW9jbWQpLCBfSU9DX05SIChpb2NtZCksCi0gICAgICAgICAgICBfSU9DX1NJWkUgKGlvY21kKSk7CisJcHJfaW5mbygiYzRfaW9jdGw6IGlvY21kICV4LCBkaXIgJXggdHlwZSAleCBuciAleCBpb2xlbiAlZC5cbiIsIGlvY21kLAorCQlfSU9DX0RJUihpb2NtZCksIF9JT0NfVFlQRShpb2NtZCksIF9JT0NfTlIoaW9jbWQpLAorCQlfSU9DX1NJWkUoaW9jbWQpKTsKICNlbmRpZgotICAgIGlvbGVuID0gX0lPQ19TSVpFIChpb2NtZCk7Ci0gICAgaWYgKGlvbGVuID4gc2l6ZW9mKGFyZykpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIGRhdGEgPSBpZnItPmlmcl9kYXRhICsgc2l6ZW9mIChpb2NtZCk7Ci0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmYXJnLCBkYXRhLCBpb2xlbikpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOworCWlvbGVuID0gX0lPQ19TSVpFKGlvY21kKTsKKwlpZiAoaW9sZW4gPiBzaXplb2YoYXJnKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZGF0YSA9IGlmci0+aWZyX2RhdGEgKyBzaXplb2YoaW9jbWQpOworCWlmIChjb3B5X2Zyb21fdXNlcigmYXJnLCBkYXRhLCBpb2xlbikpCisJCXJldHVybiAtRUZBVUxUOwogCi0gICAgcmV0ID0gMDsKLSAgICBzd2l0Y2ggKGlvY21kKQotICAgIHsKLSAgICBjYXNlIFNCRV9JT0NfUE9SVF9HRVQ6Ci0gICAgICAgIC8vcHJfaW5mbygiPj4gU0JFX0lPQ19QT1JUX0dFVCBJb2N0bC4uLlxuIik7Ci0gICAgICAgIHJldCA9IGRvX2dldF9wb3J0IChuZGV2LCBkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTQkVfSU9DX1BPUlRfU0VUOgotICAgICAgICAvL3ByX2luZm8oIj4+IFNCRV9JT0NfUE9SVF9TRVQgSW9jdGwuLi5cbiIpOwotICAgICAgICByZXQgPSBkb19zZXRfcG9ydCAobmRldiwgZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU0JFX0lPQ19DSEFOX0dFVDoKLSAgICAgICAgLy9wcl9pbmZvKCI+PiBTQkVfSU9DX0NIQU5fR0VUIElvY3RsLi4uXG4iKTsKLSAgICAgICAgcmV0ID0gZG9fZ2V0X2NoYW4gKG5kZXYsIGRhdGEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFNCRV9JT0NfQ0hBTl9TRVQ6Ci0gICAgICAgIC8vcHJfaW5mbygiPj4gU0JFX0lPQ19DSEFOX1NFVCBJb2N0bC4uLlxuIik7Ci0gICAgICAgIHJldCA9IGRvX3NldF9jaGFuIChuZGV2LCBkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDNF9ERUxfQ0hBTjoKLSAgICAgICAgLy9wcl9pbmZvKCI+PiBDNF9ERUxfQ0hBTiBJb2N0bC4uLlxuIik7Ci0gICAgICAgIHJldCA9IGRvX2RlbF9jaGFuIChuZGV2LCBkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTQkVfSU9DX0NIQU5fTkVXOgotICAgICAgICByZXQgPSBkb19jcmVhdGVfY2hhbiAobmRldiwgZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU0JFX0lPQ19DSEFOX0dFVF9TVEFUOgotICAgICAgICByZXQgPSBkb19nZXRfY2hhbl9zdGF0cyAobmRldiwgZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU0JFX0lPQ19MT0dMRVZFTDoKLSAgICAgICAgcmV0ID0gZG9fc2V0X2xvZ2xldmVsIChuZGV2LCBkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTQkVfSU9DX1JFU0VUX0RFVjoKLSAgICAgICAgcmV0ID0gZG9fcmVzZXQgKG5kZXYsIGRhdGEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFNCRV9JT0NfQ0hBTl9ERUxfU1RBVDoKLSAgICAgICAgcmV0ID0gZG9fcmVzZXRfY2hhbl9zdGF0cyAobmRldiwgZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQzRfTE9PUF9QT1JUOgotICAgICAgICByZXQgPSBkb19wb3J0X2xvb3AgKG5kZXYsIGRhdGEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEM0X1JXX0ZSTVI6Ci0gICAgICAgIHJldCA9IGRvX2ZyYW1lcl9ydyAobmRldiwgZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQzRfUldfTVNZQzoKLSAgICAgICAgcmV0ID0gZG9fbXVzeWNjX3J3IChuZGV2LCBkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDNF9SV19QTEQ6Ci0gICAgICAgIHJldCA9IGRvX3BsZF9ydyAobmRldiwgZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU0JFX0lPQ19JSURfR0VUOgotICAgICAgICByZXQgPSAoaW9sZW4gPT0gc2l6ZW9mIChzdHJ1Y3Qgc2JlX2lpZF9pbmZvKSkgPyBjNF9nZXRfaWlkaW5mbyAoY2ksICZhcmcudS5paXApIDogLUVGQVVMVDsKLSAgICAgICAgaWYgKHJldCA9PSAwKSAgICAgICAgICAgICAgIC8qIG5vIGVycm9yLCBjb3B5IGRhdGEgKi8KLSAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIgKGRhdGEsICZhcmcsIGlvbGVuKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgLy9wcl9pbmZvKCI+PiBjNF9pb2N0bDogRUlOVkFMIC0gdW5rbm93biBpb2NtZCA8JXg+XG4iLCBpb2NtZCk7Ci0gICAgICAgIHJldCA9IC1FSU5WQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gbWtyZXQgKHJldCk7CisJcmV0ID0gMDsKKwlzd2l0Y2ggKGlvY21kKSB7CisJY2FzZSBTQkVfSU9DX1BPUlRfR0VUOgorCQlyZXQgPSBkb19nZXRfcG9ydChuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTQkVfSU9DX1BPUlRfU0VUOgorCQlyZXQgPSBkb19zZXRfcG9ydChuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTQkVfSU9DX0NIQU5fR0VUOgorCQlyZXQgPSBkb19nZXRfY2hhbihuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTQkVfSU9DX0NIQU5fU0VUOgorCQlyZXQgPSBkb19zZXRfY2hhbihuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBDNF9ERUxfQ0hBTjoKKwkJcmV0ID0gZG9fZGVsX2NoYW4obmRldiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU0JFX0lPQ19DSEFOX05FVzoKKwkJcmV0ID0gZG9fY3JlYXRlX2NoYW4obmRldiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU0JFX0lPQ19DSEFOX0dFVF9TVEFUOgorCQlyZXQgPSBkb19nZXRfY2hhbl9zdGF0cyhuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTQkVfSU9DX0xPR0xFVkVMOgorCQlyZXQgPSBkb19zZXRfbG9nbGV2ZWwobmRldiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU0JFX0lPQ19SRVNFVF9ERVY6CisJCXJldCA9IGRvX3Jlc2V0KG5kZXYsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNCRV9JT0NfQ0hBTl9ERUxfU1RBVDoKKwkJcmV0ID0gZG9fcmVzZXRfY2hhbl9zdGF0cyhuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBDNF9MT09QX1BPUlQ6CisJCXJldCA9IGRvX3BvcnRfbG9vcChuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBDNF9SV19GUk1SOgorCQlyZXQgPSBkb19mcmFtZXJfcncobmRldiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgQzRfUldfTVNZQzoKKwkJcmV0ID0gZG9fbXVzeWNjX3J3KG5kZXYsIGRhdGEpOworCQlicmVhazsKKwljYXNlIEM0X1JXX1BMRDoKKwkJcmV0ID0gZG9fcGxkX3J3KG5kZXYsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNCRV9JT0NfSUlEX0dFVDoKKwkJcmV0ID0gKGlvbGVuID09IHNpemVvZihzdHJ1Y3Qgc2JlX2lpZF9pbmZvKSkgPworCQkgICAgICAgYzRfZ2V0X2lpZGluZm8oY2ksICZhcmcudS5paXApIDogLUVGQVVMVDsKKwkJaWYgKHJldCA9PSAwKSAgICAgICAgICAgICAgIC8qIG5vIGVycm9yLCBjb3B5IGRhdGEgKi8KKwkJCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJmFyZywgaW9sZW4pKQorCQkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBjNF9vcHMgPSB7Ci0gICAgICAgLm5kb19vcGVuICAgICAgID0gdm9pZF9vcGVuLAotICAgICAgIC5uZG9fc3RhcnRfeG1pdCA9IGM0X2xpbnV4X3htaXQsCi0gICAgICAgLm5kb19kb19pb2N0bCAgID0gYzRfaW9jdGwsCisJLm5kb19vcGVuICAgICAgID0gdm9pZF9vcGVuLAorCS5uZG9fc3RhcnRfeG1pdCA9IGM0X2xpbnV4X3htaXQsCisJLm5kb19kb19pb2N0bCAgID0gYzRfaW9jdGwsCiB9OwogCiBzdGF0aWMgdm9pZCBjNF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotICAgICAgIGRldi0+dHlwZSA9IEFSUEhSRF9WT0lEOwotICAgICAgIGRldi0+bmV0ZGV2X29wcyA9ICZjNF9vcHM7CisJZGV2LT50eXBlID0gQVJQSFJEX1ZPSUQ7CisJZGV2LT5uZXRkZXZfb3BzID0gJmM0X29wczsKIH0KIAogc3RydWN0IG5ldF9kZXZpY2UgKl9faW5pdAotYzRfYWRkX2RldiAoaGR3X2luZm9fdCAqaGksIGludCBicmRubywgdW5zaWduZWQgbG9uZyBmMCwgdW5zaWduZWQgbG9uZyBmMSwKLSAgICAgICAgICAgIGludCBpcnEwLCBpbnQgaXJxMSkKK2M0X2FkZF9kZXYoaGR3X2luZm9fdCAqaGksIGludCBicmRubywgdW5zaWduZWQgbG9uZyBmMCwgdW5zaWduZWQgbG9uZyBmMSwKKwkgICBpbnQgaXJxMCwgaW50IGlycTEpCiB7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7Ci0gICAgY2lfdCAgICAgICAqY2k7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJY2lfdCAgICAgICAqY2k7CiAKLSAgICBuZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihjaV90KSwgU0JFX0lGQUNFVE1QTCwgYzRfc2V0dXApOwotICAgIGlmICghbmRldikKLSAgICB7Ci0gICAgICAgIHByX3dhcm5pbmcoIiVzOiBubyBtZW1vcnkgZm9yIHN0cnVjdCBuZXRfZGV2aWNlICFcbiIsIGhpLT5kZXZuYW1lKTsKLSAgICAgICAgZXJyb3JfZmxhZyA9IEVOT01FTTsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgY2kgPSAoY2lfdCAqKShuZXRkZXZfcHJpdihuZGV2KSk7Ci0gICAgbmRldi0+aXJxID0gaXJxMDsKKwluZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihjaV90KSwgU0JFX0lGQUNFVE1QTCwgYzRfc2V0dXApOworCWlmICghbmRldikgeworCQlwcl93YXJuaW5nKCIlczogbm8gbWVtb3J5IGZvciBzdHJ1Y3QgbmV0X2RldmljZSAhXG4iLAorCQkJICAgaGktPmRldm5hbWUpOworCQllcnJvcl9mbGFnID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWNpID0gKGNpX3QgKikobmV0ZGV2X3ByaXYobmRldikpOworCW5kZXYtPmlycSA9IGlycTA7CiAKLSAgICBjaS0+aGR3X2luZm8gPSBoaTsKLSAgICBjaS0+c3RhdGUgPSBDX0lOSVQ7ICAgICAgICAgLyogbWFyayBhcyBoYXJkd2FyZSBub3QgYXZhaWxhYmxlICovCi0gICAgY2ktPm5leHQgPSBjNF9saXN0OwotICAgIGM0X2xpc3QgPSBjaTsKLSAgICBjaS0+YnJkbm8gPSBjaS0+bmV4dCA/IGNpLT5uZXh0LT5icmRubyArIDEgOiAwOworCWNpLT5oZHdfaW5mbyA9IGhpOworCWNpLT5zdGF0ZSA9IENfSU5JVDsgICAgICAgICAvKiBtYXJrIGFzIGhhcmR3YXJlIG5vdCBhdmFpbGFibGUgKi8KKwljaS0+bmV4dCA9IGM0X2xpc3Q7CisJYzRfbGlzdCA9IGNpOworCWNpLT5icmRubyA9IGNpLT5uZXh0ID8gY2ktPm5leHQtPmJyZG5vICsgMSA6IDA7CiAKLSAgICBpZiAoIUNJKQotICAgICAgICBDSSA9IGNpOyAgICAgICAgICAgICAgICAgICAgLyogREVCVUcsIG9ubHkgYm9hcmQgMCB1c2FnZSAqLworCWlmICghQ0kpCisJCUNJID0gY2k7ICAgICAgICAgICAgICAgICAgICAvKiBERUJVRywgb25seSBib2FyZCAwIHVzYWdlICovCiAKLSAgICBzdHJjcHkgKGNpLT5kZXZuYW1lLCBoaS0+ZGV2bmFtZSk7Ci0gICAgY2ktPnJlbGVhc2UgPSAmcG1jYzRfT1NTSV9yZWxlYXNlWzBdOworCXN0cmNweShjaS0+ZGV2bmFtZSwgaGktPmRldm5hbWUpOwogCi0gICAgLyogdGFza2xldCAqLworCS8qIHRhc2tsZXQgKi8KICNpZiBkZWZpbmVkKFNCRV9JU1JfVEFTS0xFVCkKLSAgICB0YXNrbGV0X2luaXQgKCZjaS0+Y2lfbXVzeWNjX2lzcl90YXNrbGV0LAotICAgICAgICAgICAgICAgICAgKHZvaWQgKCopICh1bnNpZ25lZCBsb25nKSkgbXVzeWNjX2ludHJfYmhfdGFza2xldCwKLSAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBjaSk7CisJdGFza2xldF9pbml0KCZjaS0+Y2lfbXVzeWNjX2lzcl90YXNrbGV0LAorCQkgICAgICh2b2lkICgqKSAodW5zaWduZWQgbG9uZykpIG11c3ljY19pbnRyX2JoX3Rhc2tsZXQsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpIGNpKTsKIAotICAgIGlmIChhdG9taWNfcmVhZCAoJmNpLT5jaV9tdXN5Y2NfaXNyX3Rhc2tsZXQuY291bnQpID09IDApCi0gICAgICAgIHRhc2tsZXRfZGlzYWJsZV9ub3N5bmMgKCZjaS0+Y2lfbXVzeWNjX2lzcl90YXNrbGV0KTsKKwlpZiAoYXRvbWljX3JlYWQoJmNpLT5jaV9tdXN5Y2NfaXNyX3Rhc2tsZXQuY291bnQpID09IDApCisJCXRhc2tsZXRfZGlzYWJsZV9ub3N5bmMoJmNpLT5jaV9tdXN5Y2NfaXNyX3Rhc2tsZXQpOwogI2VsaWYgZGVmaW5lZChTQkVfSVNSX0lNTUVESUFURSkKLSAgICBjaS0+Y2lfbXVzeWNjX2lzcl90cS5yb3V0aW5lID0gKHZvaWQgKikgKHVuc2lnbmVkIGxvbmcpIG11c3ljY19pbnRyX2JoX3Rhc2tsZXQ7Ci0gICAgY2ktPmNpX211c3ljY19pc3JfdHEuZGF0YSA9IGNpOworCWNpLT5jaV9tdXN5Y2NfaXNyX3RxLnJvdXRpbmUgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKW11c3ljY19pbnRyX2JoX3Rhc2tsZXQ7CisJY2ktPmNpX211c3ljY19pc3JfdHEuZGF0YSA9IGNpOwogI2VuZGlmCiAKIAotICAgIGlmIChyZWdpc3Rlcl9uZXRkZXYgKG5kZXYpIHx8Ci0gICAgICAgIChjNF9pbml0IChjaSwgKHVfY2hhciAqKSBmMCwgKHVfY2hhciAqKSBmMSkgIT0gU0JFX0RSVlJfU1VDQ0VTUykpCi0gICAgewotICAgICAgICBPU19rZnJlZSAobmV0ZGV2X3ByaXYobmRldikpOwotICAgICAgICBPU19rZnJlZSAobmRldik7Ci0gICAgICAgIGVycm9yX2ZsYWcgPSBFTk9ERVY7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICogIGludCByZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLAotICAgICAqICAgICAgICAgICAgICAgICAgdm9pZCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwKLSAgICAgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkZXZfaWQpOwotICAgICAqICB3aGVyZWluOgotICAgICAqICBpcnEgICAgICAtPiBUaGUgaW50ZXJydXB0IG51bWJlciB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC4KLSAgICAgKiAgaGFuZGxlciAgLT4gUG9pbnRlciB0byBoYW5kbGluZyBmdW5jdGlvbiBiZWluZyBpbnN0YWxsZWQuCi0gICAgICogIGZsYWdzICAgIC0+IEEgYml0IG1hc2sgb2Ygb3B0aW9ucyByZWxhdGVkIHRvIGludGVycnVwdCBtYW5hZ2VtZW50LgotICAgICAqICBkZXZfbmFtZSAtPiBTdHJpbmcgdXNlZCBpbiAvcHJvYy9pbnRlcnJ1cHRzIHRvIHNob3cgb3duZXIgb2YgaW50ZXJydXB0LgotICAgICAqICBkZXZfaWQgICAtPiBQb2ludGVyIChmb3Igc2hhcmVkIGludGVycnVwdCBsaW5lcykgdG8gcG9pbnQgdG8gaXRzIG93bgotICAgICAqICAgICAgICAgICAgICBwcml2YXRlIGRhdGEgYXJlYSAodG8gaWRlbnRpZnkgd2hpY2ggZGV2aWNlIGlzIGludGVycnVwdGluZykuCi0gICAgICoKLSAgICAgKiAgZXh0ZXJuIHZvaWQgZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLSAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJaWYgKHJlZ2lzdGVyX25ldGRldihuZGV2KSB8fAorCQkoYzRfaW5pdChjaSwgKHVfY2hhciAqKSBmMCwgKHVfY2hhciAqKSBmMSkgIT0gU0JFX0RSVlJfU1VDQ0VTUykpIHsKKwkJT1Nfa2ZyZWUobmV0ZGV2X3ByaXYobmRldikpOworCQlPU19rZnJlZShuZGV2KTsKKwkJZXJyb3JfZmxhZyA9IC1FTk9ERVY7CisJCXJldHVybiBOVUxMOworCX0KKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqICBpbnQgcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwKKwkgKiAgICAgICAgICAgICAgICAgIHZvaWQgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCisJICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGV2X2lkKTsKKwkgKiAgd2hlcmVpbjoKKwkgKiAgaXJxICAgICAgLT4gVGhlIGludGVycnVwdCBudW1iZXIgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQuCisJICogIGhhbmRsZXIgIC0+IFBvaW50ZXIgdG8gaGFuZGxpbmcgZnVuY3Rpb24gYmVpbmcgaW5zdGFsbGVkLgorCSAqICBmbGFncyAgICAtPiBBIGJpdCBtYXNrIG9mIG9wdGlvbnMgcmVsYXRlZCB0byBpbnRlcnJ1cHQgbWFuYWdlbWVudC4KKwkgKiAgZGV2X25hbWUgLT4gU3RyaW5nIHVzZWQgaW4gL3Byb2MvaW50ZXJydXB0cyB0byBzaG93IG93bmVyIG9mIGludGVycnVwdC4KKwkgKiAgZGV2X2lkICAgLT4gUG9pbnRlciAoZm9yIHNoYXJlZCBpbnRlcnJ1cHQgbGluZXMpIHRvIHBvaW50IHRvIGl0cyBvd24KKwkgKiAgICAgICAgICAgICAgcHJpdmF0ZSBkYXRhIGFyZWEgKHRvIGlkZW50aWZ5IHdoaWNoIGRldmljZSBpcyBpbnRlcnJ1cHRpbmcpLgorCSAqCisJICogIGV4dGVybiB2b2lkIGZyZWVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCk7CisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gICAgaWYgKHJlcXVlc3RfaXJxIChpcnEwLCAmYzRfbGludXhfaW50ZXJydXB0LAotICAgICAgICAgICAgICAgICAgICAgSVJRRl9TSEFSRUQsCi0gICAgICAgICAgICAgICAgICAgICBuZGV2LT5uYW1lLCBuZGV2KSkKLSAgICB7Ci0gICAgICAgIHByX3dhcm5pbmcoIiVzOiBNVVNZQ0MgY291bGQgbm90IGdldCBpcnE6ICVkXG4iLCBuZGV2LT5uYW1lLCBpcnEwKTsKLSAgICAgICAgdW5yZWdpc3Rlcl9uZXRkZXYgKG5kZXYpOwotICAgICAgICBPU19rZnJlZSAobmV0ZGV2X3ByaXYobmRldikpOwotICAgICAgICBPU19rZnJlZSAobmRldik7Ci0gICAgICAgIGVycm9yX2ZsYWcgPSBFSU87Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQorCWlmIChyZXF1ZXN0X2lycShpcnEwLCAmYzRfbGludXhfaW50ZXJydXB0LAorCQkJSVJRRl9TSEFSRUQsCisJCQluZGV2LT5uYW1lLCBuZGV2KSkgeworCQlwcl93YXJuaW5nKCIlczogTVVTWUNDIGNvdWxkIG5vdCBnZXQgaXJxOiAlZFxuIiwKKwkJCSAgIG5kZXYtPm5hbWUsIGlycTApOworCQl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKKwkJT1Nfa2ZyZWUobmV0ZGV2X3ByaXYobmRldikpOworCQlPU19rZnJlZShuZGV2KTsKKwkJZXJyb3JfZmxhZyA9IC1FSU87CisJCXJldHVybiBOVUxMOworCX0KICNpZmRlZiBDT05GSUdfU0JFX1BNQ0M0X05DT01NCi0gICAgaWYgKHJlcXVlc3RfaXJxIChpcnExLCAmYzRfZWJ1c19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBuZGV2LT5uYW1lLCBuZGV2KSkKLSAgICB7Ci0gICAgICAgIHByX3dhcm5pbmcoIiVzOiBFQlVTIGNvdWxkIG5vdCBnZXQgaXJxOiAlZFxuIiwgaGktPmRldm5hbWUsIGlycTEpOwotICAgICAgICB1bnJlZ2lzdGVyX25ldGRldiAobmRldik7Ci0gICAgICAgIGZyZWVfaXJxIChpcnEwLCBuZGV2KTsKLSAgICAgICAgT1Nfa2ZyZWUgKG5ldGRldl9wcml2KG5kZXYpKTsKLSAgICAgICAgT1Nfa2ZyZWUgKG5kZXYpOwotICAgICAgICBlcnJvcl9mbGFnID0gRUlPOwotCXJldHVybiBOVUxMOwotICAgIH0KKwlpZiAocmVxdWVzdF9pcnEoaXJxMSwgJmM0X2VidXNfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgbmRldi0+bmFtZSwgbmRldikpIHsKKwkJcHJfd2FybmluZygiJXM6IEVCVVMgY291bGQgbm90IGdldCBpcnE6ICVkXG4iLCBoaS0+ZGV2bmFtZSwgaXJxMSk7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOworCQlmcmVlX2lycShpcnEwLCBuZGV2KTsKKwkJT1Nfa2ZyZWUobmV0ZGV2X3ByaXYobmRldikpOworCQlPU19rZnJlZShuZGV2KTsKKwkJZXJyb3JfZmxhZyA9IC1FSU87CisJCXJldHVybiBOVUxMOworCX0KICNlbmRpZgogCi0gICAgLyogc2V0dXAgYm9hcmQgaWRlbnRpZmljYXRpb24gaW5mb3JtYXRpb24gKi8KKwkvKiBzZXR1cCBib2FyZCBpZGVudGlmaWNhdGlvbiBpbmZvcm1hdGlvbiAqLwogCi0gICAgewotICAgICAgICB1X2ludDMyX3QgICB0bXA7CisJeworCQl1X2ludDMyX3QgICB0bXA7CiAKLSAgICAgICAgaGR3X3NuX2dldCAoaGksIGJyZG5vKTsgICAgIC8qIGFsc28gc2V0cyBQUk9NIGZvcm1hdCB0eXBlIChwcm9tZm10KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZm9yIGxhdGVyIHVzYWdlICovCisJCS8qIGFsc28gc2V0cyBQUk9NIGZvcm1hdCB0eXBlIChwcm9tZm10KSBmb3IgbGF0ZXIgdXNhZ2UgKi8KKwkJaGR3X3NuX2dldChoaSwgYnJkbm8pOwogCi0gICAgICAgIHN3aXRjaCAoaGktPnByb21mbXQpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBQUk9NX0ZPUk1BVF9UWVBFMToKLSAgICAgICAgICAgIG1lbWNweSAobmRldi0+ZGV2X2FkZHIsIChGTERfVFlQRTEgKikgKGhpLT5tZmdfaW5mby5wZnQxLlNlcmlhbCksIDYpOwotICAgICAgICAgICAgbWVtY3B5ICgmdG1wLCAoRkxEX1RZUEUxICopIChoaS0+bWZnX2luZm8ucGZ0MS5JZCksIDQpOyAgICAgLyogdW5hbGlnbmVkIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFjcXVpc2l0aW9uICovCi0gICAgICAgICAgICBjaS0+YnJkX2lkID0gY3B1X3RvX2JlMzIgKHRtcCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQUk9NX0ZPUk1BVF9UWVBFMjoKLSAgICAgICAgICAgIG1lbWNweSAobmRldi0+ZGV2X2FkZHIsIChGTERfVFlQRTIgKikgKGhpLT5tZmdfaW5mby5wZnQyLlNlcmlhbCksIDYpOwotICAgICAgICAgICAgbWVtY3B5ICgmdG1wLCAoRkxEX1RZUEUyICopIChoaS0+bWZnX2luZm8ucGZ0Mi5JZCksIDQpOyAgICAgLyogdW5hbGlnbmVkIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFjcXVpc2l0aW9uICovCi0gICAgICAgICAgICBjaS0+YnJkX2lkID0gY3B1X3RvX2JlMzIgKHRtcCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNpLT5icmRfaWQgPSAwOwotICAgICAgICAgICAgbWVtc2V0IChuZGV2LT5kZXZfYWRkciwgMCwgNik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorCQlzd2l0Y2ggKGhpLT5wcm9tZm10KSB7CisJCWNhc2UgUFJPTV9GT1JNQVRfVFlQRTE6CisJCQltZW1jcHkobmRldi0+ZGV2X2FkZHIsCisJCQkgICAgICAgKEZMRF9UWVBFMSAqKSAoaGktPm1mZ19pbmZvLnBmdDEuU2VyaWFsKSwgNik7CisJCQkvKiB1bmFsaWduZWQgZGF0YSBhY3F1aXNpdGlvbiAqLworCQkJbWVtY3B5KCZ0bXAsIChGTERfVFlQRTEgKikgKGhpLT5tZmdfaW5mby5wZnQxLklkKSwgNCk7CisJCQljaS0+YnJkX2lkID0gY3B1X3RvX2JlMzIodG1wKTsKKwkJCWJyZWFrOworCQljYXNlIFBST01fRk9STUFUX1RZUEUyOgorCQkJbWVtY3B5KG5kZXYtPmRldl9hZGRyLAorCQkJICAgICAgIChGTERfVFlQRTIgKikgKGhpLT5tZmdfaW5mby5wZnQyLlNlcmlhbCksIDYpOworCQkJLyogdW5hbGlnbmVkIGRhdGEgYWNxdWlzaXRpb24gKi8KKwkJCW1lbWNweSgmdG1wLCAoRkxEX1RZUEUyICopIChoaS0+bWZnX2luZm8ucGZ0Mi5JZCksIDQpOworCQkJY2ktPmJyZF9pZCA9IGNwdV90b19iZTMyKHRtcCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNpLT5icmRfaWQgPSAwOworCQkJbWVtc2V0KG5kZXYtPmRldl9hZGRyLCAwLCA2KTsKKwkJCWJyZWFrOworCQl9CiAKICNpZiAxCi0gICAgICAgIHNiZWlkX3NldF9oZHdiaWQgKGNpKTsgICAgICAvKiByZXF1aXJlcyBiaWQgdG8gYmUgcHJlc2V0ICovCisJCS8qIHJlcXVpcmVzIGJpZCB0byBiZSBwcmVzZXQgKi8KKwkJc2JlaWRfc2V0X2hkd2JpZChjaSk7CiAjZWxzZQotICAgICAgICBzYmVpZF9zZXRfYmR0eXBlIChjaSk7ICAgICAgLyogcmVxdWlyZXMgaGR3X2JpZCB0byBiZSBwcmVzZXQgKi8KKwkJLyogcmVxdWlyZXMgaGR3X2JpZCB0byBiZSBwcmVzZXQgKi8KKwkJc2JlaWRfc2V0X2JkdHlwZShjaSk7CiAjZW5kaWYKLQotICAgIH0KKwl9CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwotICAgIHNiZWNvbV9wcm9jX2JyZF9pbml0IChjaSk7CisJc2JlY29tX3Byb2NfYnJkX2luaXQoY2kpOwogI2VuZGlmCiAjaWYgZGVmaW5lZChTQkVfSVNSX1RBU0tMRVQpCi0gICAgdGFza2xldF9lbmFibGUgKCZjaS0+Y2lfbXVzeWNjX2lzcl90YXNrbGV0KTsKKwl0YXNrbGV0X2VuYWJsZSgmY2ktPmNpX211c3ljY19pc3JfdGFza2xldCk7CiAjZW5kaWYKIAotCi0gICAgaWYgKChlcnJvcl9mbGFnID0gYzRfaW5pdDIgKGNpKSkgIT0gU0JFX0RSVlJfU1VDQ0VTUykKLSAgICB7CisJZXJyb3JfZmxhZyA9IGM0X2luaXQyKGNpKTsKKwlpZiAoZXJyb3JfZmxhZyAhPSBTQkVfRFJWUl9TVUNDRVNTKSB7CiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLSAgICAgICAgc2JlY29tX3Byb2NfYnJkX2NsZWFudXAgKGNpKTsKKwkJc2JlY29tX3Byb2NfYnJkX2NsZWFudXAoY2kpOwogI2VuZGlmCi0gICAgICAgIHVucmVnaXN0ZXJfbmV0ZGV2IChuZGV2KTsKLSAgICAgICAgZnJlZV9pcnEgKGlycTEsIG5kZXYpOwotICAgICAgICBmcmVlX2lycSAoaXJxMCwgbmRldik7Ci0gICAgICAgIE9TX2tmcmVlIChuZXRkZXZfcHJpdihuZGV2KSk7Ci0gICAgICAgIE9TX2tmcmVlIChuZGV2KTsKLQlyZXR1cm4gTlVMTDsJCS8qIGZhaWx1cmUsIGVycm9yX2ZsYWcgaXMgc2V0ICovCi0gICAgfQotICAgIHJldHVybiBuZGV2OworCQl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKKwkJZnJlZV9pcnEoaXJxMSwgbmRldik7CisJCWZyZWVfaXJxKGlycTAsIG5kZXYpOworCQlPU19rZnJlZShuZXRkZXZfcHJpdihuZGV2KSk7CisJCU9TX2tmcmVlKG5kZXYpOworCQkvKiBmYWlsdXJlLCBlcnJvcl9mbGFnIGlzIHNldCAqLworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIG5kZXY7CiB9CiAKIHN0YXRpYyBpbnQgIF9faW5pdAotYzRfbW9kX2luaXQgKHZvaWQpCitjNF9tb2RfaW5pdCh2b2lkKQogewotICAgIGludCAgICAgICAgIHJ0bjsKKwlpbnQgICAgICAgICBydG47CiAKLSAgICBwcl93YXJuaW5nKCIlc1xuIiwgcG1jYzRfT1NTSV9yZWxlYXNlKTsKLSAgICBpZiAoKHJ0biA9IGM0aHdfYXR0YWNoX2FsbCAoKSkpCi0gICAgICAgIHJldHVybiAtcnRuOyAgICAgICAgICAgICAgICAvKiBpbnN0YWxsYXRpb24gZmFpbHVyZSAtIHNlZSBzeXN0ZW0gbG9nICovCisJcnRuID0gYzRod19hdHRhY2hfYWxsKCk7CisJaWYgKHJ0bikKKwkJcmV0dXJuIC1ydG47IC8qIGluc3RhbGxhdGlvbiBmYWlsdXJlIC0gc2VlIHN5c3RlbSBsb2cgKi8KIAotICAgIC8qIGhvdXNla2VlcGluZyBub3RpZmljYXRpb25zICovCi0gICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgIT0gbG9nX2xldmVsX2RlZmF1bHQpCi0gICAgICAgIHByX2luZm8oIk5PVEU6IGRyaXZlciBwYXJhbWV0ZXIgPGN4dDFlMV9sb2dfbGV2ZWw+IGNoYW5nZWQgZnJvbSBkZWZhdWx0ICVkIHRvICVkLlxuIiwKLSAgICAgICAgICAgICAgICBsb2dfbGV2ZWxfZGVmYXVsdCwgY3h0MWUxX2xvZ19sZXZlbCk7Ci0gICAgICAgaWYgKGN4dDFlMV9tYXhfbXJ1ICE9IG1heF9tcnVfZGVmYXVsdCkKLSAgICAgICAgICAgICAgIHByX2luZm8oIk5PVEU6IGRyaXZlciBwYXJhbWV0ZXIgPGN4dDFlMV9tYXhfbXJ1PiBjaGFuZ2VkIGZyb20gZGVmYXVsdCAlZCB0byAlZC5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X21ydV9kZWZhdWx0LCBjeHQxZTFfbWF4X21ydSk7Ci0gICAgICAgaWYgKGN4dDFlMV9tYXhfbXR1ICE9IG1heF9tdHVfZGVmYXVsdCkKLSAgICAgICAgICAgICAgIHByX2luZm8oIk5PVEU6IGRyaXZlciBwYXJhbWV0ZXIgPGN4dDFlMV9tYXhfbXR1PiBjaGFuZ2VkIGZyb20gZGVmYXVsdCAlZCB0byAlZC5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X210dV9kZWZhdWx0LCBjeHQxZTFfbWF4X210dSk7Ci0gICAgaWYgKG1heF9yeGRlc2NfdXNlZCAhPSBtYXhfcnhkZXNjX2RlZmF1bHQpCi0gICAgewotICAgICAgICBpZiAobWF4X3J4ZGVzY191c2VkID4gMjAwMCkKLSAgICAgICAgICAgIG1heF9yeGRlc2NfdXNlZCA9IDIwMDA7IC8qIG91dC1vZi1ib3VuZHMgcmVzZXQgKi8KLSAgICAgICAgcHJfaW5mbygiTk9URTogZHJpdmVyIHBhcmFtZXRlciA8bWF4X3J4ZGVzY191c2VkPiBjaGFuZ2VkIGZyb20gZGVmYXVsdCAlZCB0byAlZC5cbiIsCi0gICAgICAgICAgICAgICAgbWF4X3J4ZGVzY19kZWZhdWx0LCBtYXhfcnhkZXNjX3VzZWQpOwotICAgIH0KLSAgICBpZiAobWF4X3R4ZGVzY191c2VkICE9IG1heF90eGRlc2NfZGVmYXVsdCkKLSAgICB7Ci0gICAgICAgIGlmIChtYXhfdHhkZXNjX3VzZWQgPiAxMDAwKQotICAgICAgICAgICAgbWF4X3R4ZGVzY191c2VkID0gMTAwMDsgLyogb3V0LW9mLWJvdW5kcyByZXNldCAqLwotICAgICAgICBwcl9pbmZvKCJOT1RFOiBkcml2ZXIgcGFyYW1ldGVyIDxtYXhfdHhkZXNjX3VzZWQ+IGNoYW5nZWQgZnJvbSBkZWZhdWx0ICVkIHRvICVkLlxuIiwKLSAgICAgICAgICAgICAgICBtYXhfdHhkZXNjX2RlZmF1bHQsIG1heF90eGRlc2NfdXNlZCk7Ci0gICAgfQotICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogaW5zdGFsbGF0aW9uIHN1Y2Nlc3MgKi8KKwkvKiBob3VzZWtlZXBpbmcgbm90aWZpY2F0aW9ucyAqLworCWlmIChjeHQxZTFfbG9nX2xldmVsICE9IGxvZ19sZXZlbF9kZWZhdWx0KQorCQlwcl9pbmZvKCJOT1RFOiBkcml2ZXIgcGFyYW1ldGVyIDxjeHQxZTFfbG9nX2xldmVsPiBjaGFuZ2VkIGZyb20gZGVmYXVsdCAlZCB0byAlZC5cbiIsCisJCQlsb2dfbGV2ZWxfZGVmYXVsdCwgY3h0MWUxX2xvZ19sZXZlbCk7CisJaWYgKGN4dDFlMV9tYXhfbXJ1ICE9IG1heF9tcnVfZGVmYXVsdCkKKwkJcHJfaW5mbygiTk9URTogZHJpdmVyIHBhcmFtZXRlciA8Y3h0MWUxX21heF9tcnU+IGNoYW5nZWQgZnJvbSBkZWZhdWx0ICVkIHRvICVkLlxuIiwKKwkJCW1heF9tcnVfZGVmYXVsdCwgY3h0MWUxX21heF9tcnUpOworCWlmIChjeHQxZTFfbWF4X210dSAhPSBtYXhfbXR1X2RlZmF1bHQpCisJCXByX2luZm8oIk5PVEU6IGRyaXZlciBwYXJhbWV0ZXIgPGN4dDFlMV9tYXhfbXR1PiBjaGFuZ2VkIGZyb20gZGVmYXVsdCAlZCB0byAlZC5cbiIsCisJCQltYXhfbXR1X2RlZmF1bHQsIGN4dDFlMV9tYXhfbXR1KTsKKwlpZiAobWF4X3J4ZGVzY191c2VkICE9IG1heF9yeGRlc2NfZGVmYXVsdCkgeworCQlpZiAobWF4X3J4ZGVzY191c2VkID4gMjAwMCkKKwkJCW1heF9yeGRlc2NfdXNlZCA9IDIwMDA7IC8qIG91dC1vZi1ib3VuZHMgcmVzZXQgKi8KKwkJcHJfaW5mbygiTk9URTogZHJpdmVyIHBhcmFtZXRlciA8bWF4X3J4ZGVzY191c2VkPiBjaGFuZ2VkIGZyb20gZGVmYXVsdCAlZCB0byAlZC5cbiIsCisJCQltYXhfcnhkZXNjX2RlZmF1bHQsIG1heF9yeGRlc2NfdXNlZCk7CisJfQorCWlmIChtYXhfdHhkZXNjX3VzZWQgIT0gbWF4X3R4ZGVzY19kZWZhdWx0KSB7CisJCWlmIChtYXhfdHhkZXNjX3VzZWQgPiAxMDAwKQorCQkJbWF4X3R4ZGVzY191c2VkID0gMTAwMDsgLyogb3V0LW9mLWJvdW5kcyByZXNldCAqLworCQlwcl9pbmZvKCJOT1RFOiBkcml2ZXIgcGFyYW1ldGVyIDxtYXhfdHhkZXNjX3VzZWQ+IGNoYW5nZWQgZnJvbSBkZWZhdWx0ICVkIHRvICVkLlxuIiwKKwkJCW1heF90eGRlc2NfZGVmYXVsdCwgbWF4X3R4ZGVzY191c2VkKTsKKwl9CisJcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnN0YWxsYXRpb24gc3VjY2VzcyAqLwogfQogCiAKQEAgLTExNDAsMzEgKzExMTcsMjkgQEAKICAgKi8KIAogc3RhdGljIHZvaWQgX19leGl0Ci1jbGVhbnVwX2hkbGMgKHZvaWQpCitjbGVhbnVwX2hkbGModm9pZCkKIHsKLSAgICBoZHdfaW5mb190ICpoaTsKLSAgICBjaV90ICAgICAgICpjaTsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKLSAgICBpbnQgICAgICAgICBpLCBqLCBrOworCWhkd19pbmZvX3QgKmhpOworCWNpX3QgICAgICAgKmNpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCWludCAgICAgICAgIGksIGosIGs7CiAKLSAgICBmb3IgKGkgPSAwLCBoaSA9IGhkd19pbmZvOyBpIDwgTUFYX0JPQVJEUzsgaSsrLCBoaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGhpLT5uZGV2KSAgICAgICAgICAgICAgIC8qIGEgYm9hcmQgaGFzIGJlZW4gYXR0YWNoZWQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgY2kgPSAoY2lfdCAqKShuZXRkZXZfcHJpdihoaS0+bmRldikpOwotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNpLT5tYXhfcG9ydDsgaisrKQotICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBNVVNZQ0NfTkNIQU5TOyBrKyspCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmRldiA9IGNpLT5wb3J0W2pdLmNoYW5ba10tPnVzZXIpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb19kZWx1c2VyIChuZGV2LCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorCWZvciAoaSA9IDAsIGhpID0gaGR3X2luZm87IGkgPCBNQVhfQk9BUkRTOyBpKyssIGhpKyspIHsKKwkJaWYgKGhpLT5uZGV2KSB7ICAgICAgICAgIC8qIGEgYm9hcmQgaGFzIGJlZW4gYXR0YWNoZWQgKi8KKwkJCWNpID0gKGNpX3QgKikobmV0ZGV2X3ByaXYoaGktPm5kZXYpKTsKKwkJCWZvciAoaiA9IDA7IGogPCBjaS0+bWF4X3BvcnQ7IGorKykKKwkJCQlmb3IgKGsgPSAwOyBrIDwgTVVTWUNDX05DSEFOUzsgaysrKSB7CisJCQkJCW5kZXYgPSBjaS0+cG9ydFtqXS5jaGFuW2tdLT51c2VyOworCQkJCQlpZiAobmRldikKKwkJCQkJCWRvX2RlbHVzZXIobmRldiwgMCk7CisJCQkJfQorCQl9CisJfQogfQogCiAKIHN0YXRpYyB2b2lkIF9fZXhpdAotYzRfbW9kX3JlbW92ZSAodm9pZCkKK2M0X21vZF9yZW1vdmUodm9pZCkKIHsKIAljbGVhbnVwX2hkbGMoKTsgICAgICAgICAgICAvKiBkZWxldGUgYW55IG1pc3NlZCBjaGFubmVscyAqLwogCWNsZWFudXBfZGV2cygpOwpAQCAtMTE3MywxMyArMTE0OCwxMyBAQAogCXByX2luZm8oIlNCRSAtIGRyaXZlciByZW1vdmVkLlxuIik7CiB9CiAKLW1vZHVsZV9pbml0IChjNF9tb2RfaW5pdCk7Ci1tb2R1bGVfZXhpdCAoYzRfbW9kX3JlbW92ZSk7Cittb2R1bGVfaW5pdChjNF9tb2RfaW5pdCk7Cittb2R1bGVfZXhpdChjNF9tb2RfcmVtb3ZlKTsKIAotTU9EVUxFX0FVVEhPUiAoIlNCRSBUZWNobmljYWwgU2VydmljZXMgPHN1cHBvcnRAc2JlaS5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04gKCJ3YW5QQ0ktQ3hUMUUxIEdlbmVyaWMgSERMQyBXQU4gRHJpdmVyIG1vZHVsZSIpOworTU9EVUxFX0FVVEhPUigiU0JFIFRlY2huaWNhbCBTZXJ2aWNlcyA8c3VwcG9ydEBzYmVpLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigid2FuUENJLUN4VDFFMSBHZW5lcmljIEhETEMgV0FOIERyaXZlciBtb2R1bGUiKTsKICNpZmRlZiBNT0RVTEVfTElDRU5TRQotTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKICNlbmRpZgogCiAvKioqICBFbmQtb2YtRmlsZSAgKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9tdXN5Y2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbXVzeWNjLmMKaW5kZXggN2EzYTMwYy4uN2I0ZjZmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9tdXN5Y2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL211c3ljYy5jCkBAIC00Miw3ICs0Miw2IEBACiAvKiBnbG9iYWwgZHJpdmVyIHZhcmlhYmxlcyAqLwogZXh0ZXJuIGNpX3QgKmM0X2xpc3Q7CiBleHRlcm4gaW50ICBkcnZyX3N0YXRlOwotZXh0ZXJuIGludCAgY3h0MWUxX2xvZ19sZXZlbDsKIAogZXh0ZXJuIGludCAgY3h0MWUxX21heF9tcnU7CiBleHRlcm4gaW50ICBjeHQxZTFfbWF4X210dTsKQEAgLTIxNyw3ICsyMTYsOCBAQAogCW1heF9pbnRjbnQgPSAwOyAgICAgICAgICAgICAvKiByZXNldCBjb3VudGVyICovCiAgICAgfQogCi0gICAgaWYgKCEoY2ggPSBzZF9maW5kX2NoYW4oZHVtbXksIGNoYW4pKSkgeworICAgIGNoID0gc2RfZmluZF9jaGFuKGR1bW15LCBjaGFuKTsKKyAgICBpZiAoIWNoKSB7CiAJcHJfaW5mbygiPj4gbXVzeWNjX2R1bXBfcmluZzogY2hhbm5lbCAlZCBub3QgdXAuXG4iLCBjaGFuKTsKIAlyZXR1cm4gRU5PRU5UOwogICAgIH0KQEAgLTEwNDQsMTcgKzEwNDQsMTkgQEAKICNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiogQ09ORklHX1NCRV9XQU4yNTZUM19OQ09NTSAqKiovCiAKIAkgICAgewotCQlpZiAoKG0yID0gT1NfbWVtX3Rva2VuX2FsbG9jKGN4dDFlMV9tYXhfbXJ1KSkpIHsKLQkJICAgIC8qIHN1YnN0aXR1dGUgdGhlIG1idWYrY2x1c3RlciAqLwotCQkgICAgbWQtPm1lbV90b2tlbiA9IG0yOwotCQkgICAgbWQtPmRhdGEgPSBjcHVfdG9fbGUzMihPU192dG9waHlzKE9TX21lbV90b2tlbl9kYXRhKG0yKSkpOworCQltMiA9IE9TX21lbV90b2tlbl9hbGxvYyhjeHQxZTFfbWF4X21ydSk7CisJCWlmIChtMikgeworCQkJLyogc3Vic3RpdHV0ZSB0aGUgbWJ1ZitjbHVzdGVyICovCisJCQltZC0+bWVtX3Rva2VuID0gbTI7CisJCQltZC0+ZGF0YSA9IGNwdV90b19sZTMyKE9TX3Z0b3BoeXMoCisJCQkJT1NfbWVtX3Rva2VuX2RhdGEobTIpKSk7CiAKLQkJICAgIC8qIHBhc3MgdGhlIHJlY2VpdmVkIG1idWYgdXB3YXJkICovCi0JCSAgICBzZF9yZWN2X2NvbnN1bWUobSwgc3RhdHVzICYgTEVOR1RIX01BU0ssIGNoLT51c2VyKTsKLQkJICAgIGNoLT5zLnJ4X3BhY2tldHMrKzsKLQkJICAgIGNoLT5zLnJ4X2J5dGVzICs9IHN0YXR1cyAmIExFTkdUSF9NQVNLOworCQkJLyogcGFzcyB0aGUgcmVjZWl2ZWQgbWJ1ZiB1cHdhcmQgKi8KKwkJCXNkX3JlY3ZfY29uc3VtZShtLCBzdGF0dXMgJiBMRU5HVEhfTUFTSywgY2gtPnVzZXIpOworCQkJY2gtPnMucnhfcGFja2V0cysrOworCQkJY2gtPnMucnhfYnl0ZXMgKz0gc3RhdHVzICYgTEVOR1RIX01BU0s7CiAJCX0gZWxzZQotCQkgICAgY2gtPnMucnhfZHJvcHBlZCsrOworCQkJY2gtPnMucnhfZHJvcHBlZCsrOwogCSAgICB9CiAJfSBlbHNlIGlmIChlcnJvciA9PSBFUlJfRkNTKQogCSAgICBjaC0+cy5yeF9jcmNfZXJyb3JzKys7CkBAIC0xNTQ1LDggKzE1NDcsOSBAQAogICAgIG1jaF90ICAgICAgKmNoOwogICAgIGludCAgICAgICAgIGksIGdjaGFuOwogCi0gICAgaWYgKCEoY2ggPSBzZF9maW5kX2NoYW4oZHVtbXksIGNoYW5udW0pKSkKLQlyZXR1cm4gRUlOVkFMOworICAgIGNoID0gc2RfZmluZF9jaGFuKGR1bW15LCBjaGFubnVtKTsKKyAgICBpZiAoIWNoKQorCXJldHVybiAtRUlOVkFMOwogICAgIHBpID0gY2gtPnVwOwogICAgIGdjaGFuID0gY2gtPmdjaGFuOwogCkBAIC0xNTg5LDYgKzE1OTIsOCBAQAogI2VuZGlmCiAKIAorI2lmIDAKKy8qIFRPRE86IGRldGVybWluZSBpZiB0aGVzZSBmdW5jdGlvbnMgd2lsbCBub3QgYmUgbmVlZGVkIGFuZCBjYW4gYmUgcmVtb3ZlZCAqLwogaW50CiBtdXN5Y2NfZGVsX2NoYW4oY2lfdCAqY2ksIGludCBjaGFubnVtKQogewpAQCAtMTU5Niw3ICsxNjAxLDggQEAKIAogICAgIGlmICgoY2hhbm51bSA8IDApIHx8IChjaGFubnVtID49IChNVVNZQ0NfTlBPUlRTICogTVVTWUNDX05DSEFOUykpKSAgLyogc2FuaXR5IGNoayBwYXJhbSAqLwogCXJldHVybiBFQ0hSTkc7Ci0gICAgaWYgKCEoY2ggPSBzZF9maW5kX2NoYW4oY2ksIGNoYW5udW0pKSkKKyAgICBjaCA9IHNkX2ZpbmRfY2hhbihjaSwgY2hhbm51bSk7CisgICAgaWYgKCFjaCkKIAlyZXR1cm4gRU5PRU5UOwogICAgIGlmIChjaC0+c3RhdGUgPT0gVVApCiAJbXVzeWNjX2NoYW5fZG93bihjaSwgY2hhbm51bSk7CkBAIC0xNjEyLDEyICsxNjE4LDE0IEBACiAKICAgICBpZiAoY2hhbm51bSA8IDAgfHwgY2hhbm51bSA+PSAoTVVTWUNDX05QT1JUUyAqIE1VU1lDQ19OQ0hBTlMpKSAgICAgIC8qIHNhbml0eSBjaGsgcGFyYW0gKi8KIAlyZXR1cm4gRUNIUk5HOwotICAgIGlmICghKGNoID0gc2RfZmluZF9jaGFuKGNpLCBjaGFubnVtKSkpCisgICAgY2ggPSBzZF9maW5kX2NoYW4oY2ksIGNoYW5udW0pOworICAgIGlmICghY2gpCiAJcmV0dXJuIEVOT0VOVDsKIAogICAgIG1lbXNldCgmY2gtPnMsIDAsIHNpemVvZihzdHJ1Y3Qgc2JlY29tX2NoYW5fc3RhdHMpKTsKICAgICByZXR1cm4gMDsKIH0KKyNlbmRpZgogCiAKIGludApAQCAtMTYzMiw3ICsxNjQwLDggQEAKICAgICBpbnQgICAgICAgICB0eGRfbmVlZF9jbnQ7CiAgICAgdV9pbnQzMl90ICAgbGVuOwogCi0gICAgaWYgKCEoY2ggPSBzZF9maW5kX2NoYW4oY2ksIGNoYW5udW0pKSkKKyAgICBjaCA9IHNkX2ZpbmRfY2hhbihjaSwgY2hhbm51bSk7CisgICAgaWYgKCFjaCkKIAlyZXR1cm4gLUVOT0VOVDsKIAogICAgIGlmIChjaS0+c3RhdGUgIT0gQ19SVU5OSU5HKSAgICAgLyogZnVsbCBpbnRlcnJ1cHQgcHJvY2Vzc2luZyBhdmFpbGFibGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvb3NzaVJlbGVhc2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvb3NzaVJlbGVhc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3YTkwMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL29zc2lSZWxlYXNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBvc3NpUmVsZWFzZS5jIC0KLSAqCi0gKiBUaGlzIHN0cmluZyB3aWxsIGJlIGVtYmVkZGVkIGludG8gdGhlIGV4ZWN1dGFibGUgYW5kIHdpbGwgdHJhY2sgdGhlCi0gKiByZWxlYXNlLiAgVGhlIGVtYmVkZGVkIHN0cmluZyBtYXkgYmUgZGlzcGxheWVkIHVzaW5nIHRoZSBmb2xsb3dpbmc6Ci0gKgotICogICAgICBzdHJpbmdzIDxmaWxlbmFtZT4gfCBncmVwIFwkUmVsCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDggIE9uZSBTdG9wIFN5c3RlbXMsIEluYy4KLSAqCi0gKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBjb250YWN0IHZpYSBlbWFpbDogc3VwcG9ydEBvbmVzdG9wc3lzdGVtcy5jb20KLSAqIE9uZSBTdG9wIFN5c3RlbXMsIEluYy4gIEVzY29uZGlkbywgQ2FsaWZvcm5pYSAgVS5TLkEuCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLWNoYXIgcG1jYzRfT1NTSV9yZWxlYXNlW10gPSAiJFJlbGVhc2U6IFBNQ0M0XzNfMUIsICBDb3B5cmlnaHQgKGMpIDIwMDggT25lIFN0b3AgU3lzdGVtcyQiOwotCi0vKioqICBFbmQtb2YtRmlsZSAgKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWM5M3g2X2VlcHJvbS5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWM5M3g2X2VlcHJvbS5jCmluZGV4IDEzN2I2M2MuLjc4Y2MxNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jOTN4Nl9lZXByb20uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtYzkzeDZfZWVwcm9tLmMKQEAgLTkwLDcgKzkwLDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIAotc2hvcnQgICAgICAgbWZnX3RlbXBsYXRlW3NpemVvZiAoRkxEX1RZUEUyKV0gPQorc3RhdGljIHU4IG1mZ190ZW1wbGF0ZVtzaXplb2YoRkxEX1RZUEUyKV0gPQogewogICAgIFBST01fRk9STUFUX1RZUEUyLCAgICAgICAgICAvKiB0eXBlOyAqLwogICAgIDB4MDAsIDB4MUEsICAgICAgICAgICAgICAgICAvKiBsZW5ndGhbMl07ICovCkBAIC00OTEsMTMgKzQ5MSwxMSBAQAogICAgIFBST01GT1JNQVQgIGJ1ZmZlcjsgICAgICAgICAvKiBNZW1vcnkgaW1hZ2Ugb2Ygc3RydWN0dXJlICovCiAgICAgdV9pbnQzMl90ICAgY3JjOyAgICAgICAgICAgIC8qIENSQyBvZiBzdHJ1Y3R1cmUgKi8KICAgICB0aW1lX3QgICAgICBjcmVhdGVUaW1lOwotICAgIGludCAgICAgICAgIGk7CiAKICAgICBjcmVhdGVUaW1lID0gZ2V0X3NlY29uZHMgKCk7CiAKICAgICAvKiB1c2UgdGVtcGxhdGUgZGF0YSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKEZMRF9UWVBFMik7ICsraSkKLSAgICAgICAgYnVmZmVyLmJ5dGVzW2ldID0gbWZnX3RlbXBsYXRlW2ldOworICAgIG1lbWNweSgmYnVmZmVyLmZsZFR5cGUyLCBtZmdfdGVtcGxhdGUsIHNpemVvZihidWZmZXIuZmxkVHlwZTIpKTsKIAogICAgIC8qIFVwZGF0ZSBzZXJpYWwgbnVtYmVyIGZpZWxkIGluIGJ1ZmZlciAqLwogICAgIHBtY1NldEJ1ZmZWYWx1ZSAoJmJ1ZmZlci5mbGRUeXBlMi5TZXJpYWxbM10sIHNlcmlhbE51bSwgMyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0LmggYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0LmgKaW5kZXggMDAzZWI4Ni4uYjRiNWU1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzQuaApAQCAtOTYsNyArOTYsNiBAQAogdm9pZCAgICAgICAgc2JlaWRfc2V0X2hkd2JpZCAoY2lfdCAqY2kpOwogdV9pbnQzMl90ICAgc2JlQ3JjICh1X2ludDhfdCAqLCB1X2ludDMyX3QsIHVfaW50MzJfdCwgdV9pbnQzMl90ICopOwogCi12b2lkICAgICAgICBWTUVUUk9fVFJBQ0UgKHZvaWQgKik7ICAgICAgIC8qIHB1dCBkYXRhIGludG8gOCBMRURzICovCiB2b2lkICAgICAgICBWTUVUUk9fVFJJR0dFUiAoY2lfdCAqLCBpbnQpOyAgICAgICAvKiBOb3RlOiBpbnQgPSAwKGRlZmF1bHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aHJ1IDE1ICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0X2Rydi5jCmluZGV4IGE5ZDk1NzUuLjYyMWE3MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfZHJ2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNF9kcnYuYwpAQCAtMTEyLDEyICsxMTIsMTIgQEAKICAgICAgICAgZm9yIChwb3J0bnVtID0gMDsgcG9ydG51bSA8IGNpLT5tYXhfcG9ydDsgcG9ydG51bSsrKQogICAgICAgICAgICAgZm9yIChnY2hhbiA9IDA7IGdjaGFuIDwgTVVTWUNDX05DSEFOUzsgZ2NoYW4rKykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKGNoID0gY2ktPnBvcnRbcG9ydG51bV0uY2hhbltnY2hhbl0pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjaC0+c3RhdGUgIT0gVU5BU1NJR05FRCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChjaC0+Y2hhbm51bSA9PSBjaGFubnVtKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaDsKLSAgICAgICAgICAgICAgICB9CisJCWNoID0gY2ktPnBvcnRbcG9ydG51bV0uY2hhbltnY2hhbl07CisJCWlmIChjaCkgeworCQkJaWYgKChjaC0+c3RhdGUgIT0gVU5BU1NJR05FRCkgJiYKKwkJCSAgIChjaC0+Y2hhbm51bSA9PSBjaGFubnVtKSkKKwkJCQlyZXR1cm4gY2g7CisJCX0KICAgICAgICAgICAgIH0KICAgICByZXR1cm4gTlVMTDsKIH0KQEAgLTY2OCw4ICs2NjgsOSBAQAogICAgIHN0YXR1c190ICAgIHJldDsKIAogICAgIC8qIFBPUlQgUE9JTlQ6IHRoaXMgcm91dGluZSBnZW5lcmF0ZXMgZmlyc3QgaW50ZXJydXB0ICovCi0gICAgaWYgKChyZXQgPSBtdXN5Y2NfaW5pdCAoY2kpKSAhPSBTQkVfRFJWUl9TVUNDRVNTKQotICAgICAgICByZXR1cm4gcmV0OworCXJldCA9IG11c3ljY19pbml0KGNpKTsKKwlpZiAocmV0ICE9IFNCRV9EUlZSX1NVQ0NFU1MpCisJCXJldHVybiByZXQ7CiAKICNpZiAwCiAgICAgY2ktPnAuZnJhbWluZ190eXBlID0gRlJBTUlOR19DQlA7CkBAIC03NTYsNyArNzU3LDcgQEAKICAgICB2b2xhdGlsZSB1X2ludDMyX3QgZGF0YTsKIAogICAgIGlmIChwcC0+cG9ydG51bSA+PSBjaS0+bWF4X3BvcnQpLyogc2FuaXR5IGNoZWNrICovCi0gICAgICAgIHJldHVybiBFTlhJTzsKKyAgICAgICAgcmV0dXJuIC1FTlhJTzsKIAogICAgIGNvbWV0ID0gY2ktPnBvcnRbcHAtPnBvcnRudW1dLmNvbWV0YmFzZTsKICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgY29tZXQgKyBwcC0+cG9ydF9tb2RlKSAmIDB4ZmY7CkBAIC04NDUsNyArODQ2LDcgQEAKICAgICAgKi8KICAgICBwb3J0bnVtID0gKG1jcC0+b2Zmc2V0ICUgMHg2MDAwKSAvIDB4ODAwOwogICAgIGlmIChwb3J0bnVtID49IGNpLT5tYXhfcG9ydCkKLSAgICAgICAgcmV0dXJuIEVOWElPOworICAgICAgICByZXR1cm4gLUVOWElPOwogICAgIHBpID0gJmNpLT5wb3J0W3BvcnRudW1dOwogICAgIGlmIChtY3AtPm9mZnNldCA+PSAweDYwMDApCiAgICAgICAgIG9mZnNldCArPSAweDYwMDA7ICAgICAgICAgICAvKiBwdXQgYmFjayBpbiBNc2dDZmdEZXNjIGFkZHJlc3Mgb2Zmc2V0ICovCkBAIC04OTQsNyArODk1LDcgQEAKIGM0X2dldF9wb3J0IChjaV90ICpjaSwgaW50IHBvcnRudW0pCiB7CiAgICAgaWYgKHBvcnRudW0gPj0gY2ktPm1heF9wb3J0KSAgICAvKiBzYW5pdHkgY2hlY2sgKi8KLSAgICAgICAgcmV0dXJuIEVOWElPOworICAgICAgICByZXR1cm4gLUVOWElPOwogCiAgICAgU0RfU0VNX1RBS0UgKCZjaS0+c2VtX3dkYnVzeSwgIl93ZF8iKTsgICAgICAvKiBvbmx5IDEgdGhydSBoZXJlLCBwZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJvYXJkICovCkBAIC05MTUsNyArOTE2LDcgQEAKICAgICBpbnQgICAgICAgICBpOwogCiAgICAgaWYgKHBvcnRudW0gPj0gY2ktPm1heF9wb3J0KSAgICAvKiBzYW5pdHkgY2hlY2sgKi8KLSAgICAgICAgcmV0dXJuIEVOWElPOworICAgICAgICByZXR1cm4gLUVOWElPOwogCiAgICAgcGkgPSAmY2ktPnBvcnRbcG9ydG51bV07CiAgICAgcHAgPSAmY2ktPnBvcnRbcG9ydG51bV0ucDsKQEAgLTkyNywxNSArOTI4LDE1IEBACiAgICAgICAgICAgICAgICAgcG9ydG51bSwgZTFtb2RlLCBwaS0+b3BlbmNoYW5zKTsKICAgICB9CiAgICAgaWYgKHBpLT5vcGVuY2hhbnMpCi0gICAgICAgIHJldHVybiBFQlVTWTsgICAgICAgICAgICAgICAvKiBncm91cCBuZWVkcyBpbml0aWFsaXphdGlvbiBvbmx5IGZvcgorICAgICAgICByZXR1cm4gLUVCVVNZOyAgICAgICAgICAgICAgIC8qIGdyb3VwIG5lZWRzIGluaXRpYWxpemF0aW9uIG9ubHkgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmaXJzdCBjaGFubmVsIG9mIGEgZ3JvdXAgKi8KIAogICAgIHsKICAgICAgICAgc3RhdHVzX3QgICAgcmV0OwogCi0gICAgICAgIGlmICgocmV0ID0gYzRfd3FfcG9ydF9pbml0IChwaSkpKSAgICAgICAvKiBjcmVhdGUvaW5pdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd29ya3F1ZXVlX3N0cnVjdCAqLwotICAgICAgICAgICAgcmV0dXJuIHJldDsKKwlyZXQgPSBjNF93cV9wb3J0X2luaXQocGkpOworCWlmIChyZXQpICAgICAgIC8qIGNyZWF0ZS9pbml0IHdvcmtxdWV1ZV9zdHJ1Y3QgKi8KKwkJcmV0dXJuIHJldDsKICAgICB9CiAKICAgICBpbml0X2NvbWV0IChjaSwgcGktPmNvbWV0YmFzZSwgcHAtPnBvcnRfbW9kZSwgMSAvKiBjbG9ja21hc3RlciA9PSB0cnVlICovICwgcHAtPnBvcnRQKTsKQEAgLTEwMTgsMTAgKzEwMTksMTAgQEAKICAgICBpbnQgICAgICAgICBnY2hhbjsKIAogICAgIGlmIChjNF9maW5kX2NoYW4gKGNoYW5udW0pKSAgICAgLyogYSBuZXcgY2hhbm5lbCBzaG91bGRuJ3QgYWxyZWFkeSBleGlzdCAqLwotICAgICAgICByZXR1cm4gRUVYSVNUOworICAgICAgICByZXR1cm4gLUVFWElTVDsKIAogICAgIGlmIChwb3J0bnVtID49IGNpLT5tYXhfcG9ydCkgICAgLyogc2FuaXR5IGNoZWNrICovCi0gICAgICAgIHJldHVybiBFTlhJTzsKKyAgICAgICAgcmV0dXJuIC1FTlhJTzsKIAogICAgIHBpID0gJihjaS0+cG9ydFtwb3J0bnVtXSk7CiAgICAgLyogZmluZCBhbnkgYXZhaWxhYmxlIGNoYW5uZWwgd2l0aGluIHRoaXMgcG9ydCAqLwpAQCAtMTAzMiw3ICsxMDMzLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBpZiAoZ2NoYW4gPT0gTVVTWUNDX05DSEFOUykgICAgIC8qIGV4aGF1c3RlZCB0YWJsZSwgYWxsIHdlcmUgYXNzaWduZWQgKi8KLSAgICAgICAgcmV0dXJuIEVORklMRTsKKyAgICAgICAgcmV0dXJuIC1FTkZJTEU7CiAKICAgICBjaC0+dXAgPSBwaTsKIApAQCAtMTA1NSw4ICsxMDU2LDkgQEAKICAgICB7CiAgICAgICAgIHN0YXR1c190ICAgIHJldDsKIAotICAgICAgICBpZiAoKHJldCA9IGM0X3drX2NoYW5faW5pdCAocGksIGNoKSkpCi0gICAgICAgICAgICByZXR1cm4gcmV0OworCXJldCA9IGM0X3drX2NoYW5faW5pdChwaSwgY2gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAgICAgfQogCiAgICAgLyogc2F2ZSBvZmYgaW50ZXJmYWNlIGFzc2lnbm1lbnRzIHdoaWNoIGJvdW5kIGEgYm9hcmQgKi8KQEAgLTEwNzksOCArMTA4MSwxMCBAQAogewogICAgIG1jaF90ICAgICAgKmNoOwogCi0gICAgaWYgKCEoY2ggPSBjNF9maW5kX2NoYW4gKGNoYW5udW0pKSkKLSAgICAgICAgcmV0dXJuIEVOT0VOVDsKKwljaCA9IGM0X2ZpbmRfY2hhbihjaGFubnVtKTsKKwlpZiAoIWNoKQorCQlyZXR1cm4gLUVOT0VOVDsKKwogICAgIGlmIChjaC0+c3RhdGUgPT0gVVApCiAgICAgICAgIG11c3ljY19jaGFuX2Rvd24gKChjaV90ICopIDAsIGNoYW5udW0pOwogICAgIGNoLT5zdGF0ZSA9IFVOQVNTSUdORUQ7CkBAIC0xMDk1LDggKzEwOTksOSBAQAogewogICAgIG1jaF90ICAgICAgKmNoOwogCi0gICAgaWYgKCEoY2ggPSBjNF9maW5kX2NoYW4gKGNoYW5udW0pKSkKLSAgICAgICAgcmV0dXJuIEVOT0VOVDsKKwljaCA9IGM0X2ZpbmRfY2hhbihjaGFubnVtKTsKKwlpZiAoIWNoKQorCQlyZXR1cm4gLUVOT0VOVDsKIAogICAgIG1lbXNldCAoJmNoLT5zLCAwLCBzaXplb2YgKHN0cnVjdCBzYmVjb21fY2hhbl9zdGF0cykpOwogICAgIHJldHVybiAwOwpAQCAtMTEwOSwxOSArMTExNCwyMCBAQAogICAgIG1jaF90ICAgICAgKmNoOwogICAgIGludCAgICAgICAgIGksIHggPSAwOwogCi0gICAgaWYgKCEoY2ggPSBjNF9maW5kX2NoYW4gKGNoYW5udW0pKSkKLSAgICAgICAgcmV0dXJuIEVOT0VOVDsKKwljaCA9IGM0X2ZpbmRfY2hhbihjaGFubnVtKTsKKwlpZiAoIWNoKQorCQlyZXR1cm4gLUVOT0VOVDsKIAogI2lmIDEKICAgICBpZiAoY2gtPnAuY2FyZCAhPSBwLT5jYXJkIHx8CiAgICAgICAgIGNoLT5wLnBvcnQgIT0gcC0+cG9ydCB8fAogICAgICAgICBjaC0+cC5jaGFubnVtICE9IHAtPmNoYW5udW0pCi0gICAgICAgIHJldHVybiBFSU5WQUw7CisgICAgICAgIHJldHVybiAtRUlOVkFMOwogI2VuZGlmCiAKICAgICBpZiAoIShjaC0+dXAtPmdyb3VwX2lzX3NldCkpCiAgICAgewotICAgICAgICByZXR1cm4gRUlPOyAgICAgICAgICAgICAgICAgLyogb3V0IG9mIG9yZGVyLCBTRVRfUE9SVCBjb21tYW5kCisgICAgICAgIHJldHVybiAtRUlPOyAgICAgICAgICAgICAgICAgLyogb3V0IG9mIG9yZGVyLCBTRVRfUE9SVCBjb21tYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZXF1aXJlZCBwcmlvciB0byBmaXJzdCBncm91cCdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTRVRfQ0hBTiBjb21tYW5kICovCiAgICAgfQpAQCAtMTE0MywxMCArMTE0OSwxMiBAQAogICAgIHsKICAgICAgICAgc3RhdHVzX3QgICAgcmV0OwogCi0gICAgICAgIGlmICgocmV0ID0gbXVzeWNjX2NoYW5fZG93biAoKGNpX3QgKikgMCwgY2hhbm51bSkpKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgaWYgKChyZXQgPSBjNF9jaGFuX3VwIChjaC0+dXAtPnVwLCBjaGFubnVtKSkpCi0gICAgICAgICAgICByZXR1cm4gcmV0OworCXJldCA9IG11c3ljY19jaGFuX2Rvd24oKGNpX3QgKikwLCBjaGFubnVtKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IGM0X2NoYW5fdXAoY2gtPnVwLT51cCwgY2hhbm51bSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKICAgICAgICAgc2RfZW5hYmxlX3htaXQgKGNoLT51c2VyKTsgIC8qIHJlLWVuYWJsZSB0byBjYXRjaCBmbG93IGNvbnRyb2xsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNoYW5uZWwgKi8KICAgICB9CkBAIC0xMTU5LDggKzExNjcsMTAgQEAKIHsKICAgICBtY2hfdCAgICAgICpjaDsKIAotICAgIGlmICghKGNoID0gYzRfZmluZF9jaGFuIChjaGFubnVtKSkpCi0gICAgICAgIHJldHVybiBFTk9FTlQ7CisJY2ggPSBjNF9maW5kX2NoYW4oY2hhbm51bSk7CisJaWYgKCFjaCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKICAgICAqcCA9IGNoLT5wOwogICAgIHJldHVybiAwOwogfQpAQCAtMTE3MCw4ICsxMTgwLDEwIEBACiB7CiAgICAgbWNoX3QgICAgICAqY2g7CiAKLSAgICBpZiAoIShjaCA9IGM0X2ZpbmRfY2hhbiAoY2hhbm51bSkpKQotICAgICAgICByZXR1cm4gRU5PRU5UOworCWNoID0gYzRfZmluZF9jaGFuKGNoYW5udW0pOworCWlmICghY2gpCisJCXJldHVybiAtRU5PRU5UOworCiAgICAgKnAgPSBjaC0+czsKICAgICBwLT50eF9wZW5kaW5nID0gYXRvbWljX3JlYWQgKCZjaC0+dHhfcGVuZGluZyk7CiAgICAgcmV0dXJuIDA7CkBAIC0xMjQwLDggKzEyNTIsMTAgQEAKICAgICB1X2ludDMyX3QgICB0bXA7ICAgICAgICAgICAgLyogZm9yIG9wdGltaXppbmcgY29udmVyc2lvbiBhY3Jvc3MgQkUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGxhdGZvcm0gKi8KIAotICAgIGlmICghKGNoID0gYzRfZmluZF9jaGFuIChjaGFubnVtKSkpCi0gICAgICAgIHJldHVybiBFTk9FTlQ7CisJY2ggPSBjNF9maW5kX2NoYW4oY2hhbm51bSk7CisJaWYgKCFjaCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKICAgICBpZiAoY2gtPnN0YXRlID09IFVQKQogICAgIHsKICAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCkBAIC0xMjY0LDcgKzEyNzgsNyBAQAogICAgICAgICAgICAgICAgIHByX2luZm8oIisgYXNrNCAleCwgY3VycmVudGx5ICV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgY2gtPnAuYml0bWFza1tpXSwgcGktPnRzbVtpXSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRUlOVkFMOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKICAgICAgICAgICAgIGlmIChjaC0+cC5iaXRtYXNrW2ldICYgKDEgPDwgaikpCkBAIC0xMjc3LDcgKzEyOTEsNyBAQAogICAgICAgICAvKiBpZiggY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikgICovCiAgICAgICAgIHByX2luZm8oIiVzOiBjNF9jaGFuX3VwWyVkXSBFTk9CVUZTIChubyBUaW1lU2xvdHMgYXNzaWduZWQpXG4iLAogICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjaGFubnVtKTsKLSAgICAgICAgcmV0dXJuIEVOT0JVRlM7ICAgICAgICAgICAgIC8qIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKi8KKyAgICAgICAgcmV0dXJuIC1FTk9CVUZTOyAgICAgICAgICAgICAvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuICovCiAgICAgfQogICAgIGFkZHIgPSBjNF9maWZvX2FsbG9jIChwaSwgZ2NoYW4sICZuYnVmKTsKICAgICBjaC0+c3RhdGUgPSBVUDsKQEAgLTEzNzIsMTIgKzEzODYsMTMgQEAKICAgICAgICAgfQogICAgICAgICBtZC0+bmV4dCA9IGNwdV90b19sZTMyIChPU192dG9waHlzIChtZC0+c25leHQpKTsKIAotICAgICAgICAgICAgICAgaWYgKCEobSA9IE9TX21lbV90b2tlbl9hbGxvYyAoY3h0MWUxX21heF9tcnUpKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCi0gICAgICAgICAgICAgICAgcHJfaW5mbygiJXM6IGM0X2NoYW5fdXBbJWRdIC0gdG9rZW4gYWxsb2MgZmFpbHVyZSwgc2l6ZSA9ICVkLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsIGNoYW5udW0sIGN4dDFlMV9tYXhfbXJ1KTsKLSAgICAgICAgICAgIGdvdG8gZXJyZnJlZTsKKwltID0gT1NfbWVtX3Rva2VuX2FsbG9jKGN4dDFlMV9tYXhfbXJ1KTsKKwlpZiAoIW0pIHsKKwkJaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCisJCQlwcl9pbmZvKAorCQkJIiVzOiBjNF9jaGFuX3VwWyVkXSAtIHRva2VuIGFsbG9jIGZhaWx1cmUsIHNpemUgPSAlZC5cbiIsCisJCQljaS0+ZGV2bmFtZSwgY2hhbm51bSwgY3h0MWUxX21heF9tcnUpOworCQlnb3RvIGVycmZyZWU7CiAgICAgICAgIH0KICAgICAgICAgbWQtPm1lbV90b2tlbiA9IG07CiAgICAgICAgIG1kLT5kYXRhID0gY3B1X3RvX2xlMzIgKE9TX3Z0b3BoeXMgKE9TX21lbV90b2tlbl9kYXRhIChtKSkpOwpAQCAtMTQ1NCw3ICsxNDY5LDcgQEAKICAgICBjaC0+bWRyID0gTlVMTDsKICAgICBjaC0+cnhkX251bSA9IDA7CiAgICAgY2gtPnN0YXRlID0gRE9XTjsKLSAgICByZXR1cm4gRU5PQlVGUzsKKyAgICByZXR1cm4gLUVOT0JVRlM7CiB9CiAKIC8qIHN0b3AgdGhlIGhhcmR3YXJlIGZyb20gc2VydmljaW5nICYgaW50ZXJydXB0aW5nICovCkBAIC0xNTMzLDggKzE1NDgsOSBAQAogICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAgICAgY2hhciAgICAgICAqbnA7CiAKLSAgICBpZiAoIShkZXYgPSBnZXR1c2VyYnljaGFuIChpaXAtPmNoYW5udW0pKSkKLSAgICAgICAgcmV0dXJuIEVOT0VOVDsKKwlkZXYgPSBnZXR1c2VyYnljaGFuKGlpcC0+Y2hhbm51bSk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PRU5UOwogCiAgICAgbnAgPSBkZXYtPm5hbWU7CiAgICAgc3RybmNweSAoaWlwLT5pbmFtZSwgbnAsIENITk1fU1RSTEVOIC0gMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0X3ByaXZhdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfcHJpdmF0ZS5oCmluZGV4IDdlZGJkNGUuLmViMjhmMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfcHJpdmF0ZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfcHJpdmF0ZS5oCkBAIC0yMTMsNyArMjEzLDYgQEAKICAgICBzdHJ1Y3Qgc2JlX2NhcmRfaW5mbyAqbmV4dDsKICAgICB1X2ludDMyX3QgICplZXByb21iYXNlOyAgICAgLyogbWFwcGVkIGFkZHJlc3Mgb2YgYm9hcmQncyBFRVBST00gKi8KICAgICBjNGNwbGRfdCAgICpjcGxkYmFzZTsgICAgICAgLyogbWFwcGVkIGFkZHJlc3Mgb2YgYm9hcmQncyBDUExEIGhhcmR3YXJlICovCi0gICAgY2hhciAgICAgICAqcmVsZWFzZTsgICAgICAgIC8qIFNCRSBJRCBzdHJpbmcgdy9pbiBzYmVSZWxlYXNlLmMgKi8KICAgICB2b2lkICAgICAgICpoZHdfaW5mbzsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyX2RldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfc3lzZGVwLmggYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0X3N5c2RlcC5oCmluZGV4IDY5N2YxOTQuLjI5MTZjMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfc3lzZGVwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNF9zeXNkZXAuaApAQCAtNjAsMyArNjAsNCBAQAogaW50ICAgICAgICAgc2RfcXVldWVfc3RvcHBlZCAodm9pZCAqdXNlcik7CiAKICNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKiBfSU5DX1BNQ0M0X1NZU0RFUF9IXyAqKiovCitleHRlcm4gaW50ICBjeHQxZTFfbG9nX2xldmVsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9zYmVwcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3NiZXByb2MuYwppbmRleCAzNTNjMDAxLi44NDBjNjQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3NiZXByb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3NiZXByb2MuYwpAQCAtNzIsNyArNzIsOCBAQAogCWNoYXIgICAgICAgKnNwZDsKIAlzdHJ1Y3Qgc2JlX2JyZF9pbmZvICpiaXA7CiAKLQlpZiAoIShiaXAgPSBPU19rbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2JlX2JyZF9pbmZvKSkpKQorCWJpcCA9IE9TX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYmVfYnJkX2luZm8pKTsKKwlpZiAoIWJpcCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlwcl9kZXZlbCgiPj4gc2JlY29tX3Byb2NfZ2V0X3NiZV9pbmZvOiBlbnRlcmVkXG4iKTsKQEAgLTE1MCw3ICsxNTEsNiBAQAogCQlicmVhazsKIAl9CiAJc2VxX3ByaW50ZihtLCAiUENJIEJ1cyBTcGVlZDogJXNcbiIsIHNwZCk7Ci0Jc2VxX3ByaW50ZihtLCAiUmVsZWFzZTogICAgICAgJXNcbiIsIGNpLT5yZWxlYXNlKTsKIAogI2lmZGVmIFNCRV9QTUNDNF9FTkFCTEUKIAl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL01ha2VmaWxlCmluZGV4IDNhYmU4ZDIuLjAwNjNkMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL01ha2VmaWxlCkBAIC0xLDcgKzEgQEAKIG9iai0kKENPTkZJR19ER0FQKSArPSBkZ2FwLm8KLQotCi1kZ2FwLW9ianMgOj0JZGdhcF9kcml2ZXIubyAgIGRnYXBfZmVwNS5vIFwKLQkJZGdhcF9wYXJzZS5vCWRnYXBfdHJhY2UubyBcCi0JCWRnYXBfdHR5Lm8JZGdhcF9zeXNmcy5vCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWZjM2M3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcC5jCkBAIC0wLDAgKzEsNzY3NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQorICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQorICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoKKyAqCU5PVEUgVE8gTElOVVggS0VSTkVMIEhBQ0tFUlM6ICBETyBOT1QgUkVGT1JNQVQgVEhJUyBDT0RFIQorICoKKyAqCVRoaXMgaXMgc2hhcmVkIGNvZGUgYmV0d2VlbiBEaWdpJ3MgQ1ZTIGFyY2hpdmUgYW5kIHRoZQorICoJTGludXggS2VybmVsIHNvdXJjZXMuCisgKglDaGFuZ2luZyB0aGUgc291cmNlIGp1c3QgZm9yIHJlZm9ybWF0dGluZyBuZWVkbGVzc2x5IGJyZWFrcworICoJb3VyIENWUyBkaWZmIGhpc3RvcnkuCisgKgorICoJU2VuZCBhbnkgYnVnIGZpeGVzL2NoYW5nZXMgdG86ICBFbmcuTGludXggYXQgZGlnaSBkb3QgY29tLgorICoJVGhhbmsgeW91LgorICoKKyAqLworCisvKgorICogICAgICBJbiB0aGUgb3JpZ2luYWwgb3V0IG9mIGtlcm5lbCBEaWdpIGRnYXAgZHJpdmVyLCBmaXJtd2FyZQorICogICAgICBsb2FkaW5nIHdhcyBkb25lIHZpYSB1c2VyIGxhbmQgdG8gZHJpdmVyIGhhbmRzaGFraW5nLgorICoKKyAqICAgICAgRm9yIGNhcmRzIHRoYXQgc3VwcG9ydCBhIGNvbmNlbnRyYXRvciAocG9ydCBleHBhbmRlciksCisgKiAgICAgIEkgYmVsaWV2ZSB0aGUgY29uY2VudHJhdG9yIGl0cyBzZWxmIHRvbGQgdGhlIGNhcmQgd2hpY2gKKyAqICAgICAgY29uY2VudHJhdG9yIGlzIGFjdHVhbGx5IGF0dGFjaGVkIGFuZCB0aGVuIHRoYXQgaW5mbworICogICAgICB3YXMgdXNlZCB0byB0ZWxsIHVzZXIgbGFuZCB3aGljaCBjb25jZW50cmF0b3IgZmlybXdhcmUKKyAqICAgICAgaW1hZ2Ugd2FzIHRvIGJlIGRvd25sb2FkZWQuIEkgdGhpbmsgZXZlbiB0aGUgQklPUyBvcgorICogICAgICBGRVAgaW1hZ2VzIHJlcXVpcmVkIGNvdWxkIGNoYW5nZSB3aXRoIHRoZSBjb25uZWN0aW9uCisgKiAgICAgIG9mIGEgcGFydGljdWxhciBjb25jZW50cmF0b3IuCisgKgorICogICAgICBTaW5jZSBJIGhhdmUgbm8gYWNjZXNzIHRvIGFueSBvZiB0aGVzZSBjYXJkcyBvcgorICogICAgICBjb25jZW50cmF0b3JzLCBJIGNhbm5vdCBwdXQgdGhlIGNvcnJlY3QgY29uY2VudHJhdG9yCisgKiAgICAgIGZpcm13YXJlIGZpbGUgbmFtZXMgaW50byB0aGUgZmlybXdhcmVfaW5mbyBzdHJ1Y3R1cmUKKyAqICAgICAgYXMgaXMgbm93IGRvbmUgZm9yIHRoZSBCSU9TIGFuZCBGRVAgaW1hZ2VzLgorICoKKyAqICAgICAgSSB0aGluaywgYnV0IGFtIG5vdCBjZXJ0YWluLCB0aGF0IHRoZSBjYXJkcyBzdXBwb3J0aW5nCisgKiAgICAgIGNvbmNlbnRyYXRvcnMgd2lsbCBmdW5jdGlvbiB3aXRob3V0IHRoZW0uIFNvIHN1cHBvcnQKKyAqICAgICAgb2YgdGhlc2UgY2FyZHMgaGFzIGJlZW4gbGVmdCBpbiB0aGlzIGRyaXZlci4KKyAqCisgKiAgICAgIEluIG9yZGVyIHRvIGZ1bGx5IHN1cHBvcnQgdGhvc2UgY2FyZHMsIHRoZXkgd291bGQKKyAqICAgICAgZWl0aGVyIGhhdmUgdG8gYmUgYWNxdWlyZWQgZm9yIGRpc3NlY3Rpb24gb3IgbWF5YmUKKyAqICAgICAgRGlnaSBJbnRlcm5hdGlvbmFsIGNvdWxkIHByb3ZpZGUgc29tZSBhc3Npc3RhbmNlLgorICovCisjdW5kZWYgRElHSV9DT05DRU5UUkFUT1JTX1NVUFBPUlRFRAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogRm9yIHVkZWxheSAqLworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgkvKiBGb3IgdGFza2xldCBhbmQgaW50ZXJydXB0IHN0cnVjdHMvZGVmaW5lcyAqLworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4JCS8qIEZvciByZWFkW2J3bF0vd3JpdGVbYndsXSAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKworI2luY2x1ZGUgImRnYXAuaCIKKworI2RlZmluZSBpbml0X01VVEVYKHNlbSkgICAgICAgICBzZW1hX2luaXQoc2VtLCAxKQorI2RlZmluZSBERUNMQVJFX01VVEVYKG5hbWUpICAgICBcCisJc3RydWN0IHNlbWFwaG9yZSBuYW1lID0gX19TRU1BUEhPUkVfSU5JVElBTElaRVIobmFtZSwgMSkKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRGlnaSBJbnRlcm5hdGlvbmFsLCBodHRwOi8vd3d3LmRpZ2kuY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgdGhlIERpZ2kgSW50ZXJuYXRpb25hbCBFUENBIFBDSSBiYXNlZCBwcm9kdWN0IGxpbmUiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJkZ2FwIik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHByb3RvcyBmb3IgdGhpcyBmaWxlCisgKgorICovCisKK3N0YXRpYyBpbnQgZGdhcF9zdGFydCh2b2lkKTsKK3N0YXRpYyB2b2lkIGRnYXBfaW5pdF9nbG9iYWxzKHZvaWQpOworc3RhdGljIGludCBkZ2FwX2ZvdW5kX2JvYXJkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgaWQpOworc3RhdGljIHZvaWQgZGdhcF9jbGVhbnVwX2JvYXJkKHN0cnVjdCBib2FyZF90ICpicmQpOworc3RhdGljIHZvaWQgZGdhcF9wb2xsX2hhbmRsZXIodWxvbmcgZHVtbXkpOworc3RhdGljIGludCBkZ2FwX2luaXRfcGNpKHZvaWQpOworc3RhdGljIGludCBkZ2FwX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyB2b2lkIGRnYXBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgZGdhcF9wcm9iZTEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBjYXJkX3R5cGUpOworc3RhdGljIGludCBkZ2FwX2RvX3JlbWFwKHN0cnVjdCBib2FyZF90ICpicmQpOworc3RhdGljIGlycXJldHVybl90IGRnYXBfaW50cihpbnQgaXJxLCB2b2lkICp2b2lkYnJkKTsKKworLyogT3VyIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgdm9pZCBkZ2FwX3R0eV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGRnYXBfYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCXN0cnVjdCBjaGFubmVsX3QgKmNoKTsKK3N0YXRpYyBpbnQgZGdhcF90dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lnZXRhKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkJc3RydWN0IGRpZ2lfdCBfX3VzZXIgKnJldGluZm8pOworc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpc2V0YShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJCXN0cnVjdCBkaWdpX3QgX191c2VyICpuZXdfaW5mbyk7CitzdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lnZXRlZGVsYXkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IF9fdXNlciAqcmV0aW5mbyk7CitzdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lzZXRlZGVsYXkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IF9fdXNlciAqbmV3X2luZm8pOworc3RhdGljIGludCBkZ2FwX3R0eV93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIGludCBkZ2FwX3R0eV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBkZ2FwX3R0eV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBkZ2FwX3R0eV90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBkZ2FwX3R0eV9mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBpbnQgZGdhcF93YWl0X2Zvcl9kcmFpbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBpbnQgZGdhcF9zZXRfbW9kZW1faW5mbyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBpbnQgY29tbWFuZCwKKwkJCQl1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSk7CitzdGF0aWMgaW50IGRnYXBfZ2V0X21vZGVtX2luZm8oc3RydWN0IGNoYW5uZWxfdCAqY2gsCisJCQkJdW5zaWduZWQgaW50IF9fdXNlciAqdmFsdWUpOworc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpc2V0Y3VzdG9tYmF1ZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJCWludCBfX3VzZXIgKm5ld19pbmZvKTsKK3N0YXRpYyBpbnQgZGdhcF90dHlfZGlnaWdldGN1c3RvbWJhdWQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQlpbnQgX191c2VyICpyZXRpbmZvKTsKK3N0YXRpYyBpbnQgZGdhcF90dHlfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgaW50IGRnYXBfdHR5X3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBzZXQsCisJCQkJdW5zaWduZWQgaW50IGNsZWFyKTsKK3N0YXRpYyBpbnQgZGdhcF90dHlfc2VuZF9icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgbXNlYyk7CitzdGF0aWMgdm9pZCBkZ2FwX3R0eV93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpOworc3RhdGljIGludCBkZ2FwX3R0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkJaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkJc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcyk7CitzdGF0aWMgaW50IGRnYXBfdHR5X3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgYyk7CitzdGF0aWMgdm9pZCBkZ2FwX3R0eV9zZW5kX3hjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpOworCitzdGF0aWMgaW50IGRnYXBfdHR5X3JlZ2lzdGVyKHN0cnVjdCBib2FyZF90ICpicmQpOworc3RhdGljIGludCBkZ2FwX3R0eV9pbml0KHN0cnVjdCBib2FyZF90ICopOworc3RhdGljIHZvaWQgZGdhcF90dHlfdW5pbml0KHN0cnVjdCBib2FyZF90ICopOworc3RhdGljIHZvaWQgZGdhcF9jYXJyaWVyKHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKK3N0YXRpYyB2b2lkIGRnYXBfaW5wdXQoc3RydWN0IGNoYW5uZWxfdCAqY2gpOworCisvKgorICogT3VyIGZ1bmN0aW9uIHByb3RvdHlwZXMgZnJvbSBkZ2FwX2ZlcDUKKyAqLworc3RhdGljIHZvaWQgZGdhcF9jbWR3X2V4dChzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdTE2IGNtZCwgdTE2IHdvcmQsIHVpbnQgbmNtZHMpOworc3RhdGljIGludCBkZ2FwX2V2ZW50KHN0cnVjdCBib2FyZF90ICpiZCk7CisKK3N0YXRpYyB2b2lkIGRnYXBfcG9sbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBkZ2FwX2NtZGIoc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVjaGFyIGNtZCwgdWNoYXIgYnl0ZTEsCisJCQl1Y2hhciBieXRlMiwgdWludCBuY21kcyk7CitzdGF0aWMgdm9pZCBkZ2FwX2NtZHcoc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVjaGFyIGNtZCwgdTE2IHdvcmQsIHVpbnQgbmNtZHMpOworc3RhdGljIHZvaWQgZGdhcF93bW92ZShzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgY2hhciAqYnVmLCB1aW50IGNudCk7CitzdGF0aWMgaW50IGRnYXBfcGFyYW0oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBkZ2FwX3Bhcml0eV9zY2FuKHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1bnNpZ25lZCBjaGFyICpjYnVmLAorCQkJCXVuc2lnbmVkIGNoYXIgKmZidWYsIGludCAqbGVuKTsKK3N0YXRpYyB1aW50IGRnYXBfZ2V0X2N1c3RvbV9iYXVkKHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKK3N0YXRpYyB2b2lkIGRnYXBfZmlybXdhcmVfcmVzZXRfcG9ydChzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7CisKKy8qCisgKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZyb20gZGdhcF9wYXJzZS5jLgorICovCitzdGF0aWMgaW50IGRnYXBfZ2V0dG9rKGNoYXIgKippbiwgc3RydWN0IGNub2RlICpwKTsKK3N0YXRpYyBjaGFyICpkZ2FwX2dldHdvcmQoY2hhciAqKmluKTsKK3N0YXRpYyBjaGFyICpkZ2FwX3NhdmVzdHJpbmcoY2hhciAqcyk7CitzdGF0aWMgc3RydWN0IGNub2RlICpkZ2FwX25ld25vZGUoaW50IHQpOworc3RhdGljIGludCBkZ2FwX2NoZWNrbm9kZShzdHJ1Y3QgY25vZGUgKnApOworc3RhdGljIHZvaWQgZGdhcF9lcnIoY2hhciAqcyk7CisKKy8qCisgKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZyb20gZGdhcF9zeXNmcy5oCisgKi8KK3N0cnVjdCBib2FyZF90Oworc3RydWN0IGNoYW5uZWxfdDsKK3N0cnVjdCB1bl90Oworc3RydWN0IHBjaV9kcml2ZXI7CitzdHJ1Y3QgY2xhc3NfZGV2aWNlOworCitzdGF0aWMgdm9pZCBkZ2FwX2NyZWF0ZV9wb3J0c19zeXNmaWxlcyhzdHJ1Y3QgYm9hcmRfdCAqYmQpOworc3RhdGljIHZvaWQgZGdhcF9yZW1vdmVfcG9ydHNfc3lzZmlsZXMoc3RydWN0IGJvYXJkX3QgKmJkKTsKKworc3RhdGljIGludCBkZ2FwX2NyZWF0ZV9kcml2ZXJfc3lzZmlsZXMoc3RydWN0IHBjaV9kcml2ZXIgKik7CitzdGF0aWMgdm9pZCBkZ2FwX3JlbW92ZV9kcml2ZXJfc3lzZmlsZXMoc3RydWN0IHBjaV9kcml2ZXIgKik7CisKK3N0YXRpYyB2b2lkIGRnYXBfY3JlYXRlX3R0eV9zeXNmcyhzdHJ1Y3QgdW5fdCAqdW4sIHN0cnVjdCBkZXZpY2UgKmMpOworc3RhdGljIHZvaWQgZGdhcF9yZW1vdmVfdHR5X3N5c2ZzKHN0cnVjdCBkZXZpY2UgKmMpOworCisvKgorICogRnVuY3Rpb24gcHJvdG90eXBlcyBmcm9tIGRnYXBfcGFyc2UuaAorICovCitzdGF0aWMgaW50IGRnYXBfcGFyc2VmaWxlKGNoYXIgKippbiwgaW50IFJlbW92ZSk7CitzdGF0aWMgc3RydWN0IGNub2RlICpkZ2FwX2ZpbmRfY29uZmlnKGludCB0eXBlLCBpbnQgYnVzLCBpbnQgc2xvdCk7CitzdGF0aWMgdWludCBkZ2FwX2NvbmZpZ19nZXRfbnVtX3BydHMoc3RydWN0IGJvYXJkX3QgKmJkKTsKK3N0YXRpYyBjaGFyICpkZ2FwX2NyZWF0ZV9jb25maWdfc3RyaW5nKHN0cnVjdCBib2FyZF90ICpiZCwgY2hhciAqc3RyaW5nKTsKK3N0YXRpYyB1aW50IGRnYXBfY29uZmlnX2dldF91c2VpbnRyKHN0cnVjdCBib2FyZF90ICpiZCk7CitzdGF0aWMgdWludCBkZ2FwX2NvbmZpZ19nZXRfYWx0cGluKHN0cnVjdCBib2FyZF90ICpiZCk7CisKK3N0YXRpYyBpbnQgZGdhcF9tc19zbGVlcCh1bG9uZyBtcyk7CitzdGF0aWMgdm9pZCBkZ2FwX2RvX2Jpb3NfbG9hZChzdHJ1Y3QgYm9hcmRfdCAqYnJkLCBjb25zdCB1Y2hhciAqdWJpb3MsIGludCBsZW4pOworc3RhdGljIHZvaWQgZGdhcF9kb19mZXBfbG9hZChzdHJ1Y3QgYm9hcmRfdCAqYnJkLCBjb25zdCB1Y2hhciAqdWZlcCwgaW50IGxlbik7CisjaWZkZWYgRElHSV9DT05DRU5UUkFUT1JTX1NVUFBPUlRFRAorc3RhdGljIHZvaWQgZGdhcF9kb19jb25jX2xvYWQoc3RydWN0IGJvYXJkX3QgKmJyZCwgdWNoYXIgKnVhZGRyLCBpbnQgbGVuKTsKKyNlbmRpZgorc3RhdGljIGludCBkZ2FwX2FmdGVyX2NvbmZpZ19sb2FkZWQoaW50IGJvYXJkKTsKK3N0YXRpYyBpbnQgZGdhcF9maW5hbGl6ZV9ib2FyZF9pbml0KHN0cnVjdCBib2FyZF90ICpicmQpOworCitzdGF0aWMgdm9pZCBkZ2FwX2dldF92cGQoc3RydWN0IGJvYXJkX3QgKmJyZCk7CitzdGF0aWMgdm9pZCBkZ2FwX2RvX3Jlc2V0X2JvYXJkKHN0cnVjdCBib2FyZF90ICpicmQpOworc3RhdGljIGludCBkZ2FwX2RvX3dhaXRfZm9yX2Jpb3Moc3RydWN0IGJvYXJkX3QgKmJyZCk7CitzdGF0aWMgaW50IGRnYXBfZG9fd2FpdF9mb3JfZmVwKHN0cnVjdCBib2FyZF90ICpicmQpOworc3RhdGljIGludCBkZ2FwX3R0eV9yZWdpc3Rlcl9wb3J0cyhzdHJ1Y3QgYm9hcmRfdCAqYnJkKTsKK3N0YXRpYyBpbnQgZGdhcF9maXJtd2FyZV9sb2FkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgY2FyZF90eXBlKTsKKworLyogRHJpdmVyIHVubG9hZCBmdW5jdGlvbiAqLworc3RhdGljIHZvaWQgZGdhcF9jbGVhbnVwX21vZHVsZSh2b2lkKTsKKworbW9kdWxlX2V4aXQoZGdhcF9jbGVhbnVwX21vZHVsZSk7CisKKy8qCisgKiBGaWxlIG9wZXJhdGlvbnMgcGVybWl0dGVkIG9uIENvbnRyb2wvTWFuYWdlbWVudCBtYWpvci4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgRGdhcEJvYXJkRm9wcyA9IHsKKwkub3duZXIJPSBUSElTX01PRFVMRSwKK307CisKKy8qCisgKiBHbG9iYWxzCisgKi8KK3N0YXRpYyB1aW50IGRnYXBfTnVtQm9hcmRzOworc3RhdGljIHN0cnVjdCBib2FyZF90ICpkZ2FwX0JvYXJkW01BWEJPQVJEU107CitzdGF0aWMgdWxvbmcgZGdhcF9wb2xsX2NvdW50ZXI7CitzdGF0aWMgY2hhciAqZGdhcF9jb25maWdfYnVmOworc3RhdGljIGludCBkZ2FwX2RyaXZlcl9zdGF0ZSA9IERSSVZFUl9JTklUSUFMSVpFRDsKK0RFRklORV9TUElOTE9DSyhkZ2FwX2RsX2xvY2spOworc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IGRnYXBfZGxfd2FpdDsKK3N0YXRpYyBpbnQgZGdhcF9kbF9hY3Rpb247CitzdGF0aWMgaW50IGRnYXBfcG9sbF90aWNrID0gMjA7CS8qIFBvbGwgaW50ZXJ2YWwgLSAyMCBtcyAqLworCisvKgorICogU3RhdGljIHZhcnMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKmRnYXBfY2xhc3M7CisKK3N0YXRpYyBzdHJ1Y3QgYm9hcmRfdCAqZGdhcF9Cb2FyZHNCeU1ham9yWzI1Nl07CitzdGF0aWMgdWludCBkZ2FwX2NvdW50ID0gNTAwOworCisvKgorICogUG9sbGVyIHN0dWZmCisgKi8KK0RFRklORV9TUElOTE9DSyhkZ2FwX3BvbGxfbG9jayk7CS8qIFBvbGwgc2NoZWR1bGluZyBsb2NrICovCitzdGF0aWMgdWxvbmcgZGdhcF9wb2xsX3RpbWU7CQkvKiBUaW1lIG9mIG5leHQgcG9sbCAqLworc3RhdGljIHVpbnQgZGdhcF9wb2xsX3N0b3A7CQkvKiBVc2VkIHRvIHRlbGwgcG9sbGVyIHRvIHN0b3AgKi8KK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBkZ2FwX3BvbGxfdGltZXI7CisKKy8qCisgICAgIFNVUFBPUlRFRCBQUk9EVUNUUworCisgICAgIENhcmQgTW9kZWwgICAgICAgICAgICAgICBOdW1iZXIgb2YgUG9ydHMgICAgICBJbnRlcmZhY2UKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBBY2NlbGVwb3J0IFhlbSAgICAgICAgICAgNCAtIDY0ICAgICAgICAgICAgICAoRUlBMjMyICYgRUlBNDIyKQorICAgICBBY2NlbGVwb3J0IFhyICAgICAgICAgICAgNCAmIDggICAgICAgICAgICAgICAoRUlBMjMyKQorICAgICBBY2NlbGVwb3J0IFhyIDkyMCAgICAgICAgNCAmIDggICAgICAgICAgICAgICAoRUlBMjMyKQorICAgICBBY2NlbGVwb3J0IEMvWCAgICAgICAgICAgOCAtIDEyOCAgICAgICAgICAgICAoRUlBMjMyKQorICAgICBBY2NlbGVwb3J0IEVQQy9YICAgICAgICAgOCAtIDIyNCAgICAgICAgICAgICAoRUlBMjMyKQorICAgICBBY2NlbGVwb3J0IFhyLzQyMiAgICAgICAgNCAmIDggICAgICAgICAgICAgICAoRUlBNDIyKQorICAgICBBY2NlbGVwb3J0IDJyLzkyMCAgICAgICAgMiAgICAgICAgICAgICAgICAgICAoRUlBMjMyKQorICAgICBBY2NlbGVwb3J0IDRyLzkyMCAgICAgICAgNCAgICAgICAgICAgICAgICAgICAoRUlBMjMyKQorICAgICBBY2NlbGVwb3J0IDhyLzkyMCAgICAgICAgOCAgICAgICAgICAgICAgICAgICAoRUlBMjMyKQorCisgICAgIElCTSA4LVBvcnQgQXN5bmNocm9ub3VzIFBDSSBBZGFwdGVyICAgICAgICAgIChFSUEyMzIpCisgICAgIElCTSAxMjgtUG9ydCBBc3luY2hyb25vdXMgUENJIEFkYXB0ZXIgICAgICAgIChFSUEyMzIgJiBFSUE0MjIpCisqLworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZGdhcF9wY2lfdGJsW10gPSB7CisJeyBESUdJX1ZJRCwgUENJX0RFVl9YRU1fRElELCAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICAwIH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9DWF9ESUQsICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICAxIH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9DWF9JQk1fRElELCAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICAyIH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9FUENKX0RJRCwgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICAzIH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl85MjBfMl9ESUQsICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICA0IH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl85MjBfNF9ESUQsICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICA1IH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl85MjBfOF9ESUQsICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICA2IH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9YUl9ESUQsICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICA3IH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9YUkpfRElELCAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICA4IH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9YUl80MjJfRElELCAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICA5IH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9YUl9JQk1fRElELCAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEwIH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9YUl9TQUlQX0RJRCwgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDExIH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9YUl9CVUxMX0RJRCwgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEyIH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl85MjBfOF9IUF9ESUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEzIH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9YRU1fSFBfRElELCAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDE0IH0sCisJezAsfQkJCQkJLyogMCB0ZXJtaW5hdGVkIGxpc3QuICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGRnYXBfcGNpX3RibCk7CisKKy8qCisgKiBBIGdlbmVyaWMgbGlzdCBvZiBQcm9kdWN0IG5hbWVzLCBQQ0kgVmVuZG9yIElELCBhbmQgUENJIERldmljZSBJRC4KKyAqLworc3RydWN0IGJvYXJkX2lkIHsKKwl1aW50IGNvbmZpZ190eXBlOworCXVjaGFyICpuYW1lOworCXVpbnQgbWF4cG9ydHM7CisJdWludCBkcGF0eXBlOworfTsKKworc3RhdGljIHN0cnVjdCBib2FyZF9pZCBkZ2FwX0lkc1tdID0geworCXsgUFBDTSwgICAgICAgIFBDSV9ERVZfWEVNX05BTUUsICAgICA2NCwgKFRfUENYTXxUX1BDTElURXxUX1BDSUJVUykgfSwKKwl7IFBDWCwgICAgICAgICBQQ0lfREVWX0NYX05BTUUsICAgICAxMjgsIChUX0NYfFRfUENJQlVTKSAgICAgICAgICAgIH0sCisJeyBQQ1gsICAgICAgICAgUENJX0RFVl9DWF9JQk1fTkFNRSwgMTI4LCAoVF9DWHxUX1BDSUJVUykgICAgICAgICAgICB9LAorCXsgUEVQQywgICAgICAgIFBDSV9ERVZfRVBDSl9OQU1FLCAgIDIyNCwgKFRfRVBDfFRfUENJQlVTKSAgICAgICAgICAgfSwKKwl7IEFQT1JUMl85MjBQLCBQQ0lfREVWXzkyMF8yX05BTUUsICAgIDIsIChUX1BDWFJ8VF9QQ0xJVEV8VF9QQ0lCVVMpIH0sCisJeyBBUE9SVDRfOTIwUCwgUENJX0RFVl85MjBfNF9OQU1FLCAgICA0LCAoVF9QQ1hSfFRfUENMSVRFfFRfUENJQlVTKSB9LAorCXsgQVBPUlQ4XzkyMFAsIFBDSV9ERVZfOTIwXzhfTkFNRSwgICAgOCwgKFRfUENYUnxUX1BDTElURXxUX1BDSUJVUykgfSwKKwl7IFBBUE9SVDgsICAgICBQQ0lfREVWX1hSX05BTUUsICAgICAgIDgsIChUX1BDWFJ8VF9QQ0xJVEV8VF9QQ0lCVVMpIH0sCisJeyBQQVBPUlQ4LCAgICAgUENJX0RFVl9YUkpfTkFNRSwgICAgICA4LCAoVF9QQ1hSfFRfUENMSVRFfFRfUENJQlVTKSB9LAorCXsgUEFQT1JUOCwgICAgIFBDSV9ERVZfWFJfNDIyX05BTUUsICAgOCwgKFRfUENYUnxUX1BDTElURXxUX1BDSUJVUykgfSwKKwl7IFBBUE9SVDgsICAgICBQQ0lfREVWX1hSX0lCTV9OQU1FLCAgIDgsIChUX1BDWFJ8VF9QQ0xJVEV8VF9QQ0lCVVMpIH0sCisJeyBQQVBPUlQ4LCAgICAgUENJX0RFVl9YUl9TQUlQX05BTUUsICA4LCAoVF9QQ1hSfFRfUENMSVRFfFRfUENJQlVTKSB9LAorCXsgUEFQT1JUOCwgICAgIFBDSV9ERVZfWFJfQlVMTF9OQU1FLCAgOCwgKFRfUENYUnxUX1BDTElURXxUX1BDSUJVUykgfSwKKwl7IEFQT1JUOF85MjBQLCBQQ0lfREVWXzkyMF84X0hQX05BTUUsIDgsIChUX1BDWFJ8VF9QQ0xJVEV8VF9QQ0lCVVMpIH0sCisJeyBQUENNLCAgICAgICAgUENJX0RFVl9YRU1fSFBfTkFNRSwgIDY0LCAoVF9QQ1hNfFRfUENMSVRFfFRfUENJQlVTKSB9LAorCXswLH0JCQkJCQkvKiAwIHRlcm1pbmF0ZWQgbGlzdC4gKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkZ2FwX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZGdhcCIsCisJLnByb2JlCQk9IGRnYXBfaW5pdF9vbmUsCisJLmlkX3RhYmxlCT0gZGdhcF9wY2lfdGJsLAorCS5yZW1vdmUJCT0gZGdhcF9yZW1vdmVfb25lLAorfTsKKworc3RydWN0IGZpcm13YXJlX2luZm8geworCXVjaGFyICpjb25mX25hbWU7ICAgICAgIC8qIGRnYXAuY29uZiAqLworCXVjaGFyICpiaW9zX25hbWU7CS8qIEJJT1MgZmlsZW5hbWUgKi8KKwl1Y2hhciAqZmVwX25hbWU7CS8qIEZFUCAgZmlsZW5hbWUgKi8KKwl1Y2hhciAqY29uX25hbWU7CS8qIENvbmNlbnRyYXRvciBmaWxlbmFtZSAgRklYTUUqLworCWludCBudW07ICAgICAgICAgICAgICAgIC8qIHNlcXVlbmNlIG51bWJlciAqLworfTsKKworLyoKKyAqIEZpcm13YXJlIC0gQklPUywgRkVQLCBhbmQgQ09OQyBmaWxlbmFtZXMKKyAqLworc3RhdGljIHN0cnVjdCBmaXJtd2FyZV9pbmZvIGZ3X2luZm9bXSA9IHsKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3N4Ymlvcy5iaW4iLCAgImRnYXAvc3hmZXAuYmluIiwgIDAsIDAgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL2N4cGJpb3MuYmluIiwgImRnYXAvY3hwZmVwLmJpbiIsIDAsIDEgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL2N4cGJpb3MuYmluIiwgImRnYXAvY3hwZmVwLmJpbiIsIDAsIDIgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3BjaWJpb3MuYmluIiwgImRnYXAvcGNpZmVwLmJpbiIsIDAsIDMgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3hyYmlvcy5iaW4iLCAgImRnYXAveHJmZXAuYmluIiwgIDAsIDQgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3hyYmlvcy5iaW4iLCAgImRnYXAveHJmZXAuYmluIiwgIDAsIDUgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3hyYmlvcy5iaW4iLCAgImRnYXAveHJmZXAuYmluIiwgIDAsIDYgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3hyYmlvcy5iaW4iLCAgImRnYXAveHJmZXAuYmluIiwgIDAsIDcgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3hyYmlvcy5iaW4iLCAgImRnYXAveHJmZXAuYmluIiwgIDAsIDggfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3hyYmlvcy5iaW4iLCAgImRnYXAveHJmZXAuYmluIiwgIDAsIDkgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3hyYmlvcy5iaW4iLCAgImRnYXAveHJmZXAuYmluIiwgIDAsIDEwIH0sCisJeyAiZGdhcC9kZ2FwLmNvbmYiLCAiZGdhcC94cmJpb3MuYmluIiwgICJkZ2FwL3hyZmVwLmJpbiIsICAwLCAxMSB9LAorCXsgImRnYXAvZGdhcC5jb25mIiwgImRnYXAveHJiaW9zLmJpbiIsICAiZGdhcC94cmZlcC5iaW4iLCAgMCwgMTIgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3hyYmlvcy5iaW4iLCAgImRnYXAveHJmZXAuYmluIiwgIDAsIDEzIH0sCisJeyAiZGdhcC9kZ2FwLmNvbmYiLCAiZGdhcC9zeGJpb3MuYmluIiwgICJkZ2FwL3N4ZmVwLmJpbiIsICAwLCAxNCB9LAorCXswLH0KK307CisKKy8qCisgKiBEZWZhdWx0IHRyYW5zcGFyZW50IHByaW50IGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgc3RydWN0IGRpZ2lfdCBkZ2FwX2RpZ2lfaW5pdCA9IHsKKwkuZGlnaV9mbGFncyA9CURJR0lfQ09PSywJLyogRmxhZ3MJCQkqLworCS5kaWdpX21heGNwcyA9CTEwMCwJCS8qIE1heCBDUFMJCQkqLworCS5kaWdpX21heGNoYXIgPQk1MCwJCS8qIE1heCBjaGFycyBpbiBwcmludCBxdWV1ZQkqLworCS5kaWdpX2J1ZnNpemUgPQkxMDAsCQkvKiBQcmludGVyIGJ1ZmZlciBzaXplCQkqLworCS5kaWdpX29ubGVuID0JNCwJCS8qIHNpemUgb2YgcHJpbnRlciBvbiBzdHJpbmcJKi8KKwkuZGlnaV9vZmZsZW4gPQk0LAkJLyogc2l6ZSBvZiBwcmludGVyIG9mZiBzdHJpbmcJKi8KKwkuZGlnaV9vbnN0ciA9CSJcMDMzWzVpIiwJLyogQU5TSSBwcmludGVyIG9uIHN0cmluZyBdCSovCisJLmRpZ2lfb2Zmc3RyID0JIlwwMzNbNGkiLAkvKiBBTlNJIHByaW50ZXIgb2ZmIHN0cmluZyBdCSovCisJLmRpZ2lfdGVybSA9CSJhbnNpIgkJLyogZGVmYXVsdCB0ZXJtaW5hbCB0eXBlCSovCit9OworCisvKgorICogRGVmaW5lIGEgbG9jYWwgZGVmYXVsdCB0ZXJtaW9zIHN0cnVjdC4gQWxsIHBvcnRzIHdpbGwgYmUgY3JlYXRlZAorICogd2l0aCB0aGlzIHRlcm1pb3MgaW5pdGlhbGx5LgorICoKKyAqIFRoaXMgZGVmaW5lcyBhIHJhdyBwb3J0IGF0IDk2MDAgYmF1ZCwgOCBkYXRhIGJpdHMsIG5vIHBhcml0eSwKKyAqIDEgc3RvcCBiaXQuCisgKi8KKworc3RhdGljIHN0cnVjdCBrdGVybWlvcyBEZ2FwRGVmYXVsdFRlcm1pb3MgPSB7CisJLmNfaWZsYWcgPQkoREVGQVVMVF9JRkxBR1MpLAkvKiBpZmxhZ3MgKi8KKwkuY19vZmxhZyA9CShERUZBVUxUX09GTEFHUyksCS8qIG9mbGFncyAqLworCS5jX2NmbGFnID0JKERFRkFVTFRfQ0ZMQUdTKSwJLyogY2ZsYWdzICovCisJLmNfbGZsYWcgPQkoREVGQVVMVF9MRkxBR1MpLAkvKiBsZmxhZ3MgKi8KKwkuY19jYyA9CQlJTklUX0NfQ0MsCisJLmNfbGluZSA9CTAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9vcGVyYXRpb25zIGRnYXBfdHR5X29wcyA9IHsKKwkub3BlbiA9IGRnYXBfdHR5X29wZW4sCisJLmNsb3NlID0gZGdhcF90dHlfY2xvc2UsCisJLndyaXRlID0gZGdhcF90dHlfd3JpdGUsCisJLndyaXRlX3Jvb20gPSBkZ2FwX3R0eV93cml0ZV9yb29tLAorCS5mbHVzaF9idWZmZXIgPSBkZ2FwX3R0eV9mbHVzaF9idWZmZXIsCisJLmNoYXJzX2luX2J1ZmZlciA9IGRnYXBfdHR5X2NoYXJzX2luX2J1ZmZlciwKKwkuZmx1c2hfY2hhcnMgPSBkZ2FwX3R0eV9mbHVzaF9jaGFycywKKwkuaW9jdGwgPSBkZ2FwX3R0eV9pb2N0bCwKKwkuc2V0X3Rlcm1pb3MgPSBkZ2FwX3R0eV9zZXRfdGVybWlvcywKKwkuc3RvcCA9IGRnYXBfdHR5X3N0b3AsCisJLnN0YXJ0ID0gZGdhcF90dHlfc3RhcnQsCisJLnRocm90dGxlID0gZGdhcF90dHlfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPSBkZ2FwX3R0eV91bnRocm90dGxlLAorCS5oYW5ndXAgPSBkZ2FwX3R0eV9oYW5ndXAsCisJLnB1dF9jaGFyID0gZGdhcF90dHlfcHV0X2NoYXIsCisJLnRpb2NtZ2V0ID0gZGdhcF90dHlfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gZGdhcF90dHlfdGlvY21zZXQsCisJLmJyZWFrX2N0bCA9IGRnYXBfdHR5X3NlbmRfYnJlYWssCisJLndhaXRfdW50aWxfc2VudCA9IGRnYXBfdHR5X3dhaXRfdW50aWxfc2VudCwKKwkuc2VuZF94Y2hhciA9IGRnYXBfdHR5X3NlbmRfeGNoYXIKK307CisKKy8qCisgKiBPdXIgbmVlZGVkIGludGVybmFsIHN0YXRpYyB2YXJpYWJsZXMgZnJvbSBkZ2FwX3BhcnNlLmMKKyAqLworc3RhdGljIHN0cnVjdCBjbm9kZSBkZ2FwX2hlYWQ7CisjZGVmaW5lIE1BWENXT1JEIDIwMAorc3RhdGljIGNoYXIgZGdhcF9jd29yZFtNQVhDV09SRF07CisKK3N0cnVjdCB0b2tsaXN0IHsKKwlpbnQJdG9rZW47CisJY2hhcgkqc3RyaW5nOworfTsKKworc3RhdGljIHN0cnVjdCB0b2tsaXN0IGRnYXBfdGxpc3RbXSA9IHsKKwl7IEJFR0lOLAkiY29uZmlnX2JlZ2luIiB9LAorCXsgRU5ELAkJImNvbmZpZ19lbmQiIH0sCisJeyBCT0FSRCwJImJvYXJkIgl9LAorCXsgUENYLAkJIkRpZ2lfQWNjZWxlUG9ydF9DL1hfUENJIiB9LAorCXsgUEVQQywJCSJEaWdpX0FjY2VsZVBvcnRfRVBDL1hfUENJIiB9LAorCXsgUFBDTSwJCSJEaWdpX0FjY2VsZVBvcnRfWGVtX1BDSSIgfSwKKwl7IEFQT1JUMl85MjBQLAkiRGlnaV9BY2NlbGVQb3J0XzJyXzkyMF9QQ0kiIH0sCisJeyBBUE9SVDRfOTIwUCwJIkRpZ2lfQWNjZWxlUG9ydF80cl85MjBfUENJIiB9LAorCXsgQVBPUlQ4XzkyMFAsCSJEaWdpX0FjY2VsZVBvcnRfOHJfOTIwX1BDSSIgfSwKKwl7IFBBUE9SVDQsCSJEaWdpX0FjY2VsZVBvcnRfNHJfUENJKEVJQS0yMzIvUlMtNDIyKSIgfSwKKwl7IFBBUE9SVDgsCSJEaWdpX0FjY2VsZVBvcnRfOHJfUENJKEVJQS0yMzIvUlMtNDIyKSIgfSwKKwl7IElPLAkJImlvIiB9LAorCXsgUENJSU5GTywJInBjaWluZm8iIH0sCisJeyBMSU5FLAkJImxpbmUiIH0sCisJeyBDT05DLAkJImNvbmMiIH0sCisJeyBDT05DLAkJImNvbmNlbnRyYXRvciIgfSwKKwl7IENYLAkJImN4IiB9LAorCXsgQ1gsCQkiY2NvbiIgfSwKKwl7IEVQQywJCSJlcGNjb24iIH0sCisJeyBFUEMsCQkiZXBjIiB9LAorCXsgTU9ELAkJIm1vZHVsZSIgfSwKKwl7IElELAkJImlkIiB9LAorCXsgU1RBUlRPLAkic3RhcnQiIH0sCisJeyBTUEVFRCwJInNwZWVkIgl9LAorCXsgQ0FCTEUsCSJjYWJsZSIJfSwKKwl7IENPTk5FQ1QsCSJjb25uZWN0IiB9LAorCXsgTUVUSE9ELAkibWV0aG9kIiB9LAorCXsgU1RBVFVTLAkic3RhdHVzIiB9LAorCXsgQ1VTVE9NLAkiQ3VzdG9tIiB9LAorCXsgQkFTSUMsCSJCYXNpYyIJfSwKKwl7IE1FTSwJCSJtZW0iIH0sCisJeyBNRU0sCQkibWVtb3J5IiB9LAorCXsgUE9SVFMsCSJwb3J0cyIJfSwKKwl7IE1PREVNLAkibW9kZW0iCX0sCisJeyBOUE9SVFMsCSJucG9ydHMiIH0sCisJeyBUVFlOLAkJInR0eW5hbWUiIH0sCisJeyBDVSwJCSJjdW5hbWUiIH0sCisJeyBQUklOVCwJInBybmFtZSIgfSwKKwl7IENNQUpPUiwJIm1ham9yIgkgfSwKKwl7IEFMVFBJTiwJImFsdHBpbiIgfSwKKwl7IFVTRUlOVFIsCSJ1c2VpbnRyIiB9LAorCXsgVFRTSVosCSJ0dHlzaXplIiB9LAorCXsgQ0hTSVosCSJjaHNpemUiIH0sCisJeyBCU1NJWiwJImJvYXJkc2l6ZSIgfSwKKwl7IFVOVFNJWiwJInNjaGVkc2l6ZSIgfSwKKwl7IEYyU0laLAkiZjIyMDBzaXplIiB9LAorCXsgVlBTSVosCSJ2cGl4c2l6ZSIgfSwKKwl7IDAsCQlOVUxMIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEcml2ZXIgbG9hZC91bmxvYWQgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIGluaXRfbW9kdWxlKCkKKyAqCisgKiBNb2R1bGUgbG9hZC4gIFRoaXMgaXMgd2hlcmUgaXQgYWxsIHN0YXJ0cy4KKyAqLworc3RhdGljIGludCBkZ2FwX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJjID0gMDsKKworCXByX2luZm8oIiVzLCBEaWdpIEludGVybmF0aW9uYWwgUGFydCBOdW1iZXIgJXNcbiIsIERHX05BTUUsIERHX1BBUlQpOworCisJcmMgPSBkZ2FwX3N0YXJ0KCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IGRnYXBfaW5pdF9wY2koKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX2NsZWFudXA7CisKKwlyYyA9IGRnYXBfY3JlYXRlX2RyaXZlcl9zeXNmaWxlcygmZGdhcF9kcml2ZXIpOworCWlmIChyYykKKwkJZ290byBlcnJfY2xlYW51cDsKKworCWRnYXBfZHJpdmVyX3N0YXRlID0gRFJJVkVSX1JFQURZOworCisJcmV0dXJuIDA7CisKK2Vycl9jbGVhbnVwOgorCisJZGdhcF9jbGVhbnVwX21vZHVsZSgpOworCisJcmV0dXJuIHJjOworfQorbW9kdWxlX2luaXQoZGdhcF9pbml0X21vZHVsZSk7CisKKy8qCisgKiBTdGFydCBvZiBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF9zdGFydCh2b2lkKQoreworCWludCByYyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7CisKKwkvKgorCSAqIG1ha2Ugc3VyZSB0aGF0IHRoZSBnbG9iYWxzIGFyZQorCSAqIGluaXQnZCBiZWZvcmUgd2UgZG8gYW55dGhpbmcgZWxzZQorCSAqLworCWRnYXBfaW5pdF9nbG9iYWxzKCk7CisKKwlkZ2FwX051bUJvYXJkcyA9IDA7CisKKwlwcl9pbmZvKCJGb3IgdGhlIHRvb2xzIHBhY2thZ2UgcGxlYXNlIHZpc2l0IGh0dHA6Ly93d3cuZGlnaS5jb21cbiIpOworCisJLyoKKwkgKiBSZWdpc3RlciBvdXIgYmFzZSBjaGFyYWN0ZXIgZGV2aWNlIGludG8gdGhlIGtlcm5lbC4KKwkgKi8KKworCS8qCisJICogUmVnaXN0ZXIgbWFuYWdlbWVudC9kcGEgZGV2aWNlcworCSAqLworCXJjID0gcmVnaXN0ZXJfY2hyZGV2KERJR0lfREdBUF9NQUpPUiwgImRnYXAiLCAmRGdhcEJvYXJkRm9wcyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJZGdhcF9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgImRnYXBfbWdtdCIpOworCWlmIChJU19FUlIoZGdhcF9jbGFzcykpIHsKKwkJcmMgPSBQVFJfRVJSKGRnYXBfY2xhc3MpOworCQlnb3RvIGZhaWxlZF9jbGFzczsKKwl9CisKKwlkZXZpY2UgPSBkZXZpY2VfY3JlYXRlKGRnYXBfY2xhc3MsIE5VTEwsCisJCU1LREVWKERJR0lfREdBUF9NQUpPUiwgMCksCisJCU5VTEwsICJkZ2FwX21nbXQiKTsKKwlpZiAoSVNfRVJSKGRldmljZSkpIHsKKwkJcmMgPSBQVFJfRVJSKGRldmljZSk7CisJCWdvdG8gZmFpbGVkX2RldmljZTsKKwl9CisKKwkvKiBTdGFydCB0aGUgcG9sbGVyICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRnYXBfcG9sbF9sb2NrLCBmbGFncyk7CisJaW5pdF90aW1lcigmZGdhcF9wb2xsX3RpbWVyKTsKKwlkZ2FwX3BvbGxfdGltZXIuZnVuY3Rpb24gPSBkZ2FwX3BvbGxfaGFuZGxlcjsKKwlkZ2FwX3BvbGxfdGltZXIuZGF0YSA9IDA7CisJZGdhcF9wb2xsX3RpbWUgPSBqaWZmaWVzICsgZGdhcF9qaWZmaWVzX2Zyb21fbXMoZGdhcF9wb2xsX3RpY2spOworCWRnYXBfcG9sbF90aW1lci5leHBpcmVzID0gZGdhcF9wb2xsX3RpbWU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGdhcF9wb2xsX2xvY2ssIGZsYWdzKTsKKworCWFkZF90aW1lcigmZGdhcF9wb2xsX3RpbWVyKTsKKworCXJldHVybiByYzsKKworZmFpbGVkX2RldmljZToKKwljbGFzc19kZXN0cm95KGRnYXBfY2xhc3MpOworZmFpbGVkX2NsYXNzOgorCXVucmVnaXN0ZXJfY2hyZGV2KERJR0lfREdBUF9NQUpPUiwgImRnYXAiKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBSZWdpc3RlciBwY2kgZHJpdmVyLCBhbmQgcmV0dXJuIGhvdyBtYW55IGJvYXJkcyB3ZSBoYXZlLgorICovCitzdGF0aWMgaW50IGRnYXBfaW5pdF9wY2kodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZGdhcF9kcml2ZXIpOworfQorCisvKiByZXR1cm5zIGNvdW50ICg+PSAwKSwgb3IgbmVnYXRpdmUgb24gZXJyb3IgKi8KK3N0YXRpYyBpbnQgZGdhcF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgcmM7CisKKwkvKiB3YWtlIHVwIGFuZCBlbmFibGUgZGV2aWNlICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKworCWlmIChyYyA8IDApIHsKKwkJcmMgPSAtRUlPOworCX0gZWxzZSB7CisJCXJjID0gZGdhcF9wcm9iZTEocGRldiwgZW50LT5kcml2ZXJfZGF0YSk7CisJCWlmIChyYyA9PSAwKSB7CisJCQlkZ2FwX051bUJvYXJkcysrOworCQkJcmMgPSBkZ2FwX2Zpcm13YXJlX2xvYWQocGRldiwgZW50LT5kcml2ZXJfZGF0YSk7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGRnYXBfcHJvYmUxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgY2FyZF90eXBlKQoreworCXJldHVybiBkZ2FwX2ZvdW5kX2JvYXJkKHBkZXYsIGNhcmRfdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRnYXBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCS8qIERvIE5vdGhpbmcgKi8KK30KKworLyoKKyAqIGRnYXBfY2xlYW51cF9tb2R1bGUoKQorICoKKyAqIE1vZHVsZSB1bmxvYWQuICBUaGlzIGlzIHdoZXJlIGl0IGFsbCBlbmRzLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisJdWxvbmcgbG9ja19mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZ2FwX3BvbGxfbG9jaywgbG9ja19mbGFncyk7CisJZGdhcF9wb2xsX3N0b3AgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRnYXBfcG9sbF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCS8qIFR1cm4gb2ZmIHBvbGxlciByaWdodCBhd2F5LiAqLworCWRlbF90aW1lcl9zeW5jKCZkZ2FwX3BvbGxfdGltZXIpOworCisJZGdhcF9yZW1vdmVfZHJpdmVyX3N5c2ZpbGVzKCZkZ2FwX2RyaXZlcik7CisKKwlkZXZpY2VfZGVzdHJveShkZ2FwX2NsYXNzLCBNS0RFVihESUdJX0RHQVBfTUFKT1IsIDApKTsKKwljbGFzc19kZXN0cm95KGRnYXBfY2xhc3MpOworCXVucmVnaXN0ZXJfY2hyZGV2KERJR0lfREdBUF9NQUpPUiwgImRnYXAiKTsKKworCWtmcmVlKGRnYXBfY29uZmlnX2J1Zik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGdhcF9OdW1Cb2FyZHM7ICsraSkgeworCQlkZ2FwX3JlbW92ZV9wb3J0c19zeXNmaWxlcyhkZ2FwX0JvYXJkW2ldKTsKKwkJZGdhcF90dHlfdW5pbml0KGRnYXBfQm9hcmRbaV0pOworCQlkZ2FwX2NsZWFudXBfYm9hcmQoZGdhcF9Cb2FyZFtpXSk7CisJfQorCisJaWYgKGRnYXBfTnVtQm9hcmRzKQorCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRnYXBfZHJpdmVyKTsKK30KKworLyoKKyAqIGRnYXBfY2xlYW51cF9ib2FyZCgpCisgKgorICogRnJlZSBhbGwgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYSBib2FyZAorICovCitzdGF0aWMgdm9pZCBkZ2FwX2NsZWFudXBfYm9hcmQoc3RydWN0IGJvYXJkX3QgKmJyZCkKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAoIWJyZCB8fCBicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybjsKKworCWlmIChicmQtPmludHJfdXNlZCAmJiBicmQtPmlycSkKKwkJZnJlZV9pcnEoYnJkLT5pcnEsIGJyZCk7CisKKwl0YXNrbGV0X2tpbGwoJmJyZC0+aGVscGVyX3Rhc2tsZXQpOworCisJaWYgKGJyZC0+cmVfbWFwX3BvcnQpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSArIDB4MjAwMDAwLCAweDIwMDAwMCk7CisJCWlvdW5tYXAoYnJkLT5yZV9tYXBfcG9ydCk7CisJCWJyZC0+cmVfbWFwX3BvcnQgPSBOVUxMOworCX0KKworCWlmIChicmQtPnJlX21hcF9tZW1iYXNlKSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihicmQtPm1lbWJhc2UsIDB4MjAwMDAwKTsKKwkJaW91bm1hcChicmQtPnJlX21hcF9tZW1iYXNlKTsKKwkJYnJkLT5yZV9tYXBfbWVtYmFzZSA9IE5VTEw7CisJfQorCisJLyogRnJlZSBhbGwgYWxsb2NhdGVkIGNoYW5uZWxzIHN0cnVjdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYUE9SVFMgOyBpKyspCisJCWtmcmVlKGJyZC0+Y2hhbm5lbHNbaV0pOworCisJa2ZyZWUoYnJkLT5mbGlwYnVmKTsKKwlrZnJlZShicmQtPmZsaXBmbGFnYnVmKTsKKworCWRnYXBfQm9hcmRbYnJkLT5ib2FyZG51bV0gPSBOVUxMOworCisJa2ZyZWUoYnJkKTsKK30KKworLyoKKyAqIGRnYXBfZm91bmRfYm9hcmQoKQorICoKKyAqIEEgYm9hcmQgaGFzIGJlZW4gZm91bmQsIGluaXQgaXQuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF9mb3VuZF9ib2FyZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGlkKQoreworCXN0cnVjdCBib2FyZF90ICpicmQ7CisJdW5zaWduZWQgaW50IHBjaV9pcnE7CisJaW50IGkgPSAwOworCisJLyogZ2V0IHRoZSBib2FyZCBzdHJ1Y3R1cmUgYW5kIHByZXAgaXQgKi8KKwlicmQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYm9hcmRfdCksIEdGUF9LRVJORUwpOworCWlmICghYnJkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRnYXBfQm9hcmRbZGdhcF9OdW1Cb2FyZHNdID0gYnJkOworCisJLyogc3RvcmUgdGhlIGluZm8gZm9yIHRoZSBib2FyZCB3ZSd2ZSBmb3VuZCAqLworCWJyZC0+bWFnaWMgPSBER0FQX0JPQVJEX01BR0lDOworCWJyZC0+Ym9hcmRudW0gPSBkZ2FwX051bUJvYXJkczsKKwlicmQtPmZpcnN0bWlub3IgPSAwOworCWJyZC0+dmVuZG9yID0gZGdhcF9wY2lfdGJsW2lkXS52ZW5kb3I7CisJYnJkLT5kZXZpY2UgPSBkZ2FwX3BjaV90YmxbaWRdLmRldmljZTsKKwlicmQtPnBkZXYgPSBwZGV2OworCWJyZC0+cGNpX2J1cyA9IHBkZXYtPmJ1cy0+bnVtYmVyOworCWJyZC0+cGNpX3Nsb3QgPSBQQ0lfU0xPVChwZGV2LT5kZXZmbik7CisJYnJkLT5uYW1lID0gZGdhcF9JZHNbaWRdLm5hbWU7CisJYnJkLT5tYXhwb3J0cyA9IGRnYXBfSWRzW2lkXS5tYXhwb3J0czsKKwlicmQtPnR5cGUgPSBkZ2FwX0lkc1tpZF0uY29uZmlnX3R5cGU7CisJYnJkLT5kcGF0eXBlID0gZGdhcF9JZHNbaWRdLmRwYXR5cGU7CisJYnJkLT5kcGFzdGF0dXMgPSBCRF9OT0ZFUDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZicmQtPnN0YXRlX3dhaXQpOworCisJc3Bpbl9sb2NrX2luaXQoJmJyZC0+YmRfbG9jayk7CisKKwlicmQtPnJ1bndhaXQJCT0gMDsKKwlicmQtPmluaGliaXRfcG9sbGVyCT0gRkFMU0U7CisJYnJkLT53YWl0X2Zvcl9iaW9zCT0gMDsKKwlicmQtPndhaXRfZm9yX2ZlcAk9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYUE9SVFM7IGkrKykKKwkJYnJkLT5jaGFubmVsc1tpXSA9IE5VTEw7CisKKwkvKiBzdG9yZSB3aGljaCBjYXJkICYgcmV2aXNpb24gd2UgaGF2ZSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmYnJkLT5zdWJ2ZW5kb3IpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVUJTWVNURU1fSUQsICZicmQtPnN1YmRldmljZSk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmYnJkLT5yZXYpOworCisJcGNpX2lycSA9IHBkZXYtPmlycTsKKwlicmQtPmlycSA9IHBjaV9pcnE7CisKKwkvKiBnZXQgdGhlIFBDSSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXJzICovCisKKwkvKiBYciBKdXBpdGVyIGFuZCBFUEMgdXNlIEJBUiAyICovCisJaWYgKGJyZC0+ZGV2aWNlID09IFBDSV9ERVZfWFJKX0RJRCB8fCBicmQtPmRldmljZSA9PSBQQ0lfREVWX0VQQ0pfRElEKSB7CisJCWJyZC0+bWVtYmFzZSAgICAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7CisJCWJyZC0+bWVtYmFzZV9lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIDIpOworCX0KKwkvKiBFdmVyeW9uZSBlbHNlIHVzZXMgQkFSIDAgKi8KKwllbHNlIHsKKwkJYnJkLT5tZW1iYXNlICAgICA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwkJYnJkLT5tZW1iYXNlX2VuZCA9IHBjaV9yZXNvdXJjZV9lbmQocGRldiwgMCk7CisJfQorCisJaWYgKCFicmQtPm1lbWJhc2UpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGJyZC0+bWVtYmFzZSAmIDEpCisJCWJyZC0+bWVtYmFzZSAmPSB+MzsKKwllbHNlCisJCWJyZC0+bWVtYmFzZSAmPSB+MTU7CisKKwkvKgorCSAqIE9uIHRoZSBQQ0kgYm9hcmRzLCB0aGVyZSBpcyBubyBJTyBzcGFjZSBhbGxvY2F0ZWQKKwkgKiBUaGUgSS9PIHJlZ2lzdGVycyB3aWxsIGJlIGluIHRoZSBmaXJzdCAzIGJ5dGVzIG9mIHRoZQorCSAqIHVwcGVyIDJNQiBvZiB0aGUgNE1CIG1lbW9yeSBzcGFjZS4gIFRoZSBib2FyZCBtZW1vcnkKKwkgKiB3aWxsIGJlIG1hcHBlZCBpbnRvIHRoZSBsb3cgMk1CIG9mIHRoZSA0TUIgbWVtb3J5IHNwYWNlCisJICovCisJYnJkLT5wb3J0ID0gYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVDsKKwlicmQtPnBvcnRfZW5kID0gYnJkLT5wb3J0ICsgUENJX0lPX1NJWkU7CisKKwkvKgorCSAqIFNwZWNpYWwgaW5pdGlhbGl6YXRpb24gZm9yIG5vbi1QTFggYm9hcmRzCisJICovCisJaWYgKGJyZC0+ZGV2aWNlICE9IFBDSV9ERVZfWFJKX0RJRCAmJiBicmQtPmRldmljZSAhPSBQQ0lfREVWX0VQQ0pfRElEKSB7CisJCXVuc2lnbmVkIHNob3J0IGNtZDsKKworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0MCwgMCk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDQ2LCAwKTsKKworCQkvKiBMaW1pdCBidXJzdCBsZW5ndGggdG8gMiBkb3VibGV3b3JkIHRyYW5zYWN0aW9ucyAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0MiwgMSk7CisKKwkJLyoKKwkJICogRW5hYmxlIElPIGFuZCBtZW0gaWYgbm90IGFscmVhZHkgZG9uZS4KKwkJICogVGhpcyB3YXMgbmVlZGVkIGZvciBzdXBwb3J0IG9uIEl0YW5pdW0uCisJCSAqLworCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CisJCWNtZCB8PSAoUENJX0NPTU1BTkRfSU8gfCBQQ0lfQ09NTUFORF9NRU1PUlkpOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIGNtZCk7CisJfQorCisJLyogaW5pdCBvdXIgcG9sbCBoZWxwZXIgdGFza2xldCAqLworCXRhc2tsZXRfaW5pdCgmYnJkLT5oZWxwZXJfdGFza2xldCwgZGdhcF9wb2xsX3Rhc2tsZXQsCisJCQkodW5zaWduZWQgbG9uZykgYnJkKTsKKworCWkgPSBkZ2FwX2RvX3JlbWFwKGJyZCk7CisJaWYgKGkpCisJCWJyZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7CisKKwlwcl9pbmZvKCJkZ2FwOiBib2FyZCAlZDogJXMgKHJldiAlZCksIGlycSAlbGQsICVzXG4iLAorCQlkZ2FwX051bUJvYXJkcywgYnJkLT5uYW1lLCBicmQtPnJldiwgYnJkLT5pcnEsCisJCWJyZC0+c3RhdGUgPyAiTk9UIFJFQURZXDAiIDogIlJFQURZXDAiKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZGdhcF9maW5hbGl6ZV9ib2FyZF9pbml0KHN0cnVjdCBib2FyZF90ICpicmQpCit7CisJaW50IHJjOworCisJaWYgKCFicmQgfHwgYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWJyZC0+dXNlX2ludGVycnVwdHMgPSBkZ2FwX2NvbmZpZ19nZXRfdXNlaW50cihicmQpOworCisJLyoKKwkgKiBTZXQgdXAgb3VyIGludGVycnVwdCBoYW5kbGVyIGlmIHdlIGFyZSBzZXQgdG8gZG8gaW50ZXJydXB0cy4KKwkgKi8KKwlpZiAoYnJkLT51c2VfaW50ZXJydXB0cyAmJiBicmQtPmlycSkgeworCisJCXJjID0gcmVxdWVzdF9pcnEoYnJkLT5pcnEsIGRnYXBfaW50ciwgSVJRRl9TSEFSRUQsICJER0FQIiwgYnJkKTsKKworCQlpZiAocmMpCisJCQlicmQtPmludHJfdXNlZCA9IDA7CisJCWVsc2UKKwkJCWJyZC0+aW50cl91c2VkID0gMTsKKwl9IGVsc2UgeworCQlicmQtPmludHJfdXNlZCA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGdhcF9maXJtd2FyZV9sb2FkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgY2FyZF90eXBlKQoreworCXN0cnVjdCBib2FyZF90ICpicmQgPSBkZ2FwX0JvYXJkW2RnYXBfTnVtQm9hcmRzIC0gMV07CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwlpbnQgcmV0OworCisJZGdhcF9nZXRfdnBkKGJyZCk7CisJZGdhcF9kb19yZXNldF9ib2FyZChicmQpOworCisJaWYgKGZ3X2luZm9bY2FyZF90eXBlXS5jb25mX25hbWUpIHsKKwkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3X2luZm9bY2FyZF90eXBlXS5jb25mX25hbWUsCisJCQkJCSAmcGRldi0+ZGV2KTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCJkZ2FwOiBjb25maWcgZmlsZSAlcyBub3QgZm91bmRcbiIsCisJCQkJZndfaW5mb1tjYXJkX3R5cGVdLmNvbmZfbmFtZSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWlmICghZGdhcF9jb25maWdfYnVmKSB7CisJCQlkZ2FwX2NvbmZpZ19idWYgPSBrbWFsbG9jKGZ3LT5zaXplICsgMSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoIWRnYXBfY29uZmlnX2J1ZikgeworCQkJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQl9CisKKwkJbWVtY3B5KGRnYXBfY29uZmlnX2J1ZiwgZnctPmRhdGEsIGZ3LT5zaXplKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJCWRnYXBfY29uZmlnX2J1Zltmdy0+c2l6ZSArIDFdID0gJ1wwJzsKKworCQlpZiAoZGdhcF9wYXJzZWZpbGUoJmRnYXBfY29uZmlnX2J1ZiwgVFJVRSkgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGRnYXBfYWZ0ZXJfY29uZmlnX2xvYWRlZChicmQtPmJvYXJkbnVtKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCS8qCisJICogTWF0Y2ggdGhpcyBib2FyZCB0byBhIGNvbmZpZyB0aGUgdXNlciBjcmVhdGVkIGZvciB1cy4KKwkgKi8KKwlicmQtPmJkX2NvbmZpZyA9CisJCWRnYXBfZmluZF9jb25maWcoYnJkLT50eXBlLCBicmQtPnBjaV9idXMsIGJyZC0+cGNpX3Nsb3QpOworCisJLyoKKwkgKiBCZWNhdXNlIHRoZSA0IHBvcnQgWHIgcHJvZHVjdHMgc2hhcmUgdGhlIHNhbWUgUENJIElECisJICogYXMgdGhlIDggcG9ydCBYciBwcm9kdWN0cywgaWYgd2UgcmVjZWl2ZSBhIE5VTEwgY29uZmlnCisJICogYmFjaywgYW5kIHRoaXMgaXMgYSBQQVBPUlQ4IGJvYXJkLCByZXRyeSB3aXRoIGEKKwkgKiBQQVBPUlQ0IGF0dGVtcHQgYXMgd2VsbC4KKwkgKi8KKwlpZiAoYnJkLT50eXBlID09IFBBUE9SVDggJiYgIWJyZC0+YmRfY29uZmlnKQorCQlicmQtPmJkX2NvbmZpZyA9CisJCQlkZ2FwX2ZpbmRfY29uZmlnKFBBUE9SVDQsIGJyZC0+cGNpX2J1cywgYnJkLT5wY2lfc2xvdCk7CisKKwlpZiAoIWJyZC0+YmRfY29uZmlnKSB7CisJCXByX2VycigiZGdhcDogTm8gdmFsaWQgY29uZmlndXJhdGlvbiBmb3VuZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRnYXBfdHR5X3JlZ2lzdGVyKGJyZCk7CisJZGdhcF9maW5hbGl6ZV9ib2FyZF9pbml0KGJyZCk7CisKKwlpZiAoZndfaW5mb1tjYXJkX3R5cGVdLmJpb3NfbmFtZSkgeworCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfaW5mb1tjYXJkX3R5cGVdLmJpb3NfbmFtZSwKKwkJCQkJJnBkZXYtPmRldik7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiZGdhcDogYmlvcyBmaWxlICVzIG5vdCBmb3VuZFxuIiwKKwkJCQlmd19pbmZvW2NhcmRfdHlwZV0uYmlvc19uYW1lKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZGdhcF9kb19iaW9zX2xvYWQoYnJkLCBmdy0+ZGF0YSwgZnctPnNpemUpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKworCQkvKiBXYWl0IGZvciBCSU9TIHRvIHRlc3QgYm9hcmQuLi4gKi8KKwkJaWYgKCFkZ2FwX2RvX3dhaXRfZm9yX2Jpb3MoYnJkKSkKKwkJCXJldHVybiAtRU5YSU87CisJfQorCisJaWYgKGZ3X2luZm9bY2FyZF90eXBlXS5mZXBfbmFtZSkgeworCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfaW5mb1tjYXJkX3R5cGVdLmZlcF9uYW1lLAorCQkJCQkmcGRldi0+ZGV2KTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCJkZ2FwOiBmZXAgZmlsZSAlcyBub3QgZm91bmRcbiIsCisJCQkJZndfaW5mb1tjYXJkX3R5cGVdLmZlcF9uYW1lKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZGdhcF9kb19mZXBfbG9hZChicmQsIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJCS8qIFdhaXQgZm9yIEZFUCB0byBsb2FkIG9uIGJvYXJkLi4uICovCisJCWlmICghZGdhcF9kb193YWl0X2Zvcl9mZXAoYnJkKSkKKwkJCXJldHVybiAtRU5YSU87CisJfQorCisjaWZkZWYgRElHSV9DT05DRU5UUkFUT1JTX1NVUFBPUlRFRAorCS8qCisJICogSWYgdGhpcyBpcyBhIENYIG9yIEVQQ1gsIHdlIG5lZWQgdG8gc2VlIGlmIHRoZSBmaXJtd2FyZQorCSAqIGlzIHJlcXVlc3RpbmcgYSBjb25jZW50cmF0b3IgaW1hZ2UgZnJvbSB1cy4KKwkgKi8KKwlpZiAoKGJkLT50eXBlID09IFBDWCkgfHwgKGJkLT50eXBlID09IFBFUEMpKSB7CisJCWNoa19hZGRyID0gKHUxNiAqKSAodmFkZHIgKyBET1dOUkVRKTsKKwkJLyogTm9uemVybyBpZiBGRVAgaXMgcmVxdWVzdGluZyBjb25jZW50cmF0b3IgaW1hZ2UuICovCisJCWNoZWNrID0gcmVhZHcoY2hrX2FkZHIpOworCQl2YWRkciA9IGJyZC0+cmVfbWFwX21lbWJhc2U7CisJfQorCisJaWYgKGZ3X2luZm9bY2FyZF90eXBlXS5jb25fbmFtZSAmJiBjaGVjayAmJiB2YWRkcikgeworCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfaW5mb1tjYXJkX3R5cGVdLmNvbl9uYW1lLAorCQkJCQkmcGRldi0+ZGV2KTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCJkZ2FwOiBjb25jIGZpbGUgJXMgbm90IGZvdW5kXG4iLAorCQkJCWZ3X2luZm9bY2FyZF90eXBlXS5jb25fbmFtZSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCS8qIFB1dCBjb25jZW50cmF0b3IgZmlybXdhcmUgbG9hZGluZyBjb2RlIGhlcmUgKi8KKwkJb2Zmc2V0ID0gcmVhZHcoKHUxNiAqKSAodmFkZHIgKyBET1dOUkVRKSk7CisJCW1lbWNweV90b2lvKG9mZnNldCwgZnctPmRhdGEsIGZ3LT5zaXplKTsKKworCQlkZ2FwX2RvX2NvbmNfbG9hZChicmQsIChjaGFyICopZnctPmRhdGEsIGZ3LT5zaXplKQorCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwl9CisjZW5kaWYKKwkvKgorCSAqIERvIHR0eSBkZXZpY2UgaW5pdGlhbGl6YXRpb24uCisJICovCisJcmV0ID0gZGdhcF90dHlfaW5pdChicmQpOworCWlmIChyZXQgPCAwKSB7CisJCWRnYXBfdHR5X3VuaW5pdChicmQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGRnYXBfdHR5X3JlZ2lzdGVyX3BvcnRzKGJyZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWJyZC0+c3RhdGUgPSBCT0FSRF9SRUFEWTsKKwlicmQtPmRwYXN0YXR1cyA9IEJEX1JVTk5JTkc7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlbWFwIFBDSSBtZW1vcnkuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF9kb19yZW1hcChzdHJ1Y3QgYm9hcmRfdCAqYnJkKQoreworCWlmICghYnJkIHx8IGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSwgMHgyMDAwMDAsICJkZ2FwIikpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVCwgMHgyMDAwMDAsCisJCQkJCSJkZ2FwIikpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSwgMHgyMDAwMDApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlicmQtPnJlX21hcF9tZW1iYXNlID0gaW9yZW1hcChicmQtPm1lbWJhc2UsIDB4MjAwMDAwKTsKKwlpZiAoIWJyZC0+cmVfbWFwX21lbWJhc2UpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSwgMHgyMDAwMDApOworCQlyZWxlYXNlX21lbV9yZWdpb24oYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVCwgMHgyMDAwMDApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlicmQtPnJlX21hcF9wb3J0ID0gaW9yZW1hcCgoYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVCksIDB4MjAwMDAwKTsKKwlpZiAoIWJyZC0+cmVfbWFwX3BvcnQpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSwgMHgyMDAwMDApOworCQlyZWxlYXNlX21lbV9yZWdpb24oYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVCwgMHgyMDAwMDApOworCQlpb3VubWFwKGJyZC0+cmVfbWFwX21lbWJhc2UpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOgorKgorKiAgICBkZ2FwX3BvbGxfaGFuZGxlcgorKgorKiBBdXRob3I6CisqCisqICAgIFNjb3R0IEggS2lsYXUKKyoKKyogUGFyYW1ldGVyczoKKyoKKyogICAgZHVtbXkgLS0gaWdub3JlZAorKgorKiBSZXR1cm4gVmFsdWVzOgorKgorKiAgICBub25lCisqCisqIERlc2NyaXB0aW9uOgorKgorKiAgICBBcyBlYWNoIHRpbWVyIGV4cGlyZXMsIGl0IGRldGVybWluZXMgKGEpIHdoZXRoZXIgdGhlICJ0cmFuc21pdCIKKyogICAgd2FpdGVyIG5lZWRzIHRvIGJlIHdva2VuIHVwLCBhbmQgKGIpIHdoZXRoZXIgdGhlIHBvbGxlciBuZWVkcyB0bworKiAgICBiZSByZXNjaGVkdWxlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgZGdhcF9wb2xsX2hhbmRsZXIodWxvbmcgZHVtbXkpCit7CisJaW50IGk7CisJc3RydWN0IGJvYXJkX3QgKmJyZDsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CisJdWxvbmcgbmV3X3RpbWU7CisKKwlkZ2FwX3BvbGxfY291bnRlcisrOworCisJLyoKKwkgKiBEbyBub3Qgc3RhcnQgdGhlIGJvYXJkIHN0YXRlIG1hY2hpbmUgdW50aWwKKwkgKiBkcml2ZXIgdGVsbHMgdXMgaXRzIHVwIGFuZCBydW5uaW5nLCBhbmQgaGFzCisJICogZXZlcnl0aGluZyBpdCBuZWVkcy4KKwkgKi8KKwlpZiAoZGdhcF9kcml2ZXJfc3RhdGUgIT0gRFJJVkVSX1JFQURZKQorCQlnb3RvIHNjaGVkdWxlX3BvbGxlcjsKKworCS8qCisJICogSWYgd2UgaGF2ZSBqdXN0IDEgYm9hcmQsIG9yIHRoZSBzeXN0ZW0gaXMgbm90IFNNUCwKKwkgKiB0aGVuIHVzZSB0aGUgdHlwaWNhbCBvbGQgc3R5bGUgcG9sbGVyLgorCSAqIE90aGVyd2lzZSwgdXNlIG91ciBuZXcgdGFza2xldCBiYXNlZCBwb2xsZXIsIHdoaWNoIHNob3VsZAorCSAqIHNwZWVkIHRoaW5ncyB1cCBmb3IgbXVsdGlwbGUgYm9hcmRzLgorCSAqLworCWlmICgoZGdhcF9OdW1Cb2FyZHMgPT0gMSkgfHwgKG51bV9vbmxpbmVfY3B1cygpIDw9IDEpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZ2FwX051bUJvYXJkczsgaSsrKSB7CisKKwkJCWJyZCA9IGRnYXBfQm9hcmRbaV07CisKKwkJCWlmIChicmQtPnN0YXRlID09IEJPQVJEX0ZBSUxFRCkKKwkJCQljb250aW51ZTsKKwkJCWlmICghYnJkLT5pbnRyX3J1bm5pbmcpCisJCQkJLyogQ2FsbCB0aGUgcmVhbCBib2FyZCBwb2xsZXIgZGlyZWN0bHkgKi8KKwkJCQlkZ2FwX3BvbGxfdGFza2xldCgodW5zaWduZWQgbG9uZykgYnJkKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIEdvIHRocnUgZWFjaCBib2FyZCwga2lja2luZyBvZmYgYQorCQkgKiB0YXNrbGV0IGZvciBlYWNoIGlmIG5lZWRlZAorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IGRnYXBfTnVtQm9hcmRzOyBpKyspIHsKKwkJCWJyZCA9IGRnYXBfQm9hcmRbaV07CisKKwkJCS8qCisJCQkgKiBBdHRlbXB0IHRvIGdyYWIgdGhlIGJvYXJkIGxvY2suCisJCQkgKgorCQkJICogSWYgd2UgY2FuJ3QgZ2V0IGl0LCBubyBiaWcgZGVhbCwgdGhlIG5leHQgcG9sbAorCQkJICogd2lsbCBnZXQgaXQuIEJhc2ljYWxseSwgSSBqdXN0IHJlYWxseSBkb24ndCB3YW50CisJCQkgKiB0byBzcGluIGluIGhlcmUsIGJlY2F1c2UgSSB3YW50IHRvIGtpY2sgb2ZmIG15CisJCQkgKiB0YXNrbGV0cyBhcyBmYXN0IGFzIEkgY2FuLCBhbmQgdGhlbiBnZXQgb3V0IHRoZQorCQkJICogcG9sbGVyLgorCQkJICovCisJCQlpZiAoIXNwaW5fdHJ5bG9jaygmYnJkLT5iZF9sb2NrKSkKKwkJCQljb250aW51ZTsKKworCQkJLyoKKwkJCSAqIElmIGJvYXJkIGlzIGluIGEgZmFpbGVkIHN0YXRlLCBkb24ndCBib3RoZXIKKwkJCSAqICBzY2hlZHVsaW5nIGEgdGFza2xldAorCQkJICovCisJCQlpZiAoYnJkLT5zdGF0ZSA9PSBCT0FSRF9GQUlMRUQpIHsKKwkJCQlzcGluX3VubG9jaygmYnJkLT5iZF9sb2NrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogU2NoZWR1bGUgYSBwb2xsIGhlbHBlciB0YXNrICovCisJCQlpZiAoIWJyZC0+aW50cl9ydW5uaW5nKQorCQkJCXRhc2tsZXRfc2NoZWR1bGUoJmJyZC0+aGVscGVyX3Rhc2tsZXQpOworCisJCQkvKgorCQkJICogQ2FuJ3QgZG8gREdBUF9VTkxPQ0sgaGVyZSwgYXMgd2UgZG9uJ3QgaGF2ZQorCQkJICogbG9ja19mbGFncyBiZWNhdXNlIHdlIGRpZCBhIHRyeWxvY2sgYWJvdmUuCisJCQkgKi8KKwkJCXNwaW5fdW5sb2NrKCZicmQtPmJkX2xvY2spOworCQl9CisJfQorCitzY2hlZHVsZV9wb2xsZXI6CisKKwkvKgorCSAqIFNjaGVkdWxlIG91cnNlbGYgYmFjayBhdCB0aGUgbm9taW5hbCB3YWtldXAgaW50ZXJ2YWwuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRnYXBfcG9sbF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlkZ2FwX3BvbGxfdGltZSArPSAgZGdhcF9qaWZmaWVzX2Zyb21fbXMoZGdhcF9wb2xsX3RpY2spOworCisJbmV3X3RpbWUgPSBkZ2FwX3BvbGxfdGltZSAtIGppZmZpZXM7CisKKwlpZiAoKHVsb25nKSBuZXdfdGltZSA+PSAyICogZGdhcF9wb2xsX3RpY2spIHsKKwkJZGdhcF9wb2xsX3RpbWUgPQorCQkJamlmZmllcyArICBkZ2FwX2ppZmZpZXNfZnJvbV9tcyhkZ2FwX3BvbGxfdGljayk7CisJfQorCisJZGdhcF9wb2xsX3RpbWVyLmZ1bmN0aW9uID0gZGdhcF9wb2xsX2hhbmRsZXI7CisJZGdhcF9wb2xsX3RpbWVyLmRhdGEgPSAwOworCWRnYXBfcG9sbF90aW1lci5leHBpcmVzID0gZGdhcF9wb2xsX3RpbWU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGdhcF9wb2xsX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJaWYgKCFkZ2FwX3BvbGxfc3RvcCkKKwkJYWRkX3RpbWVyKCZkZ2FwX3BvbGxfdGltZXIpOworfQorCisvKgorICogZGdhcF9pbnRyKCkKKyAqCisgKiBEcml2ZXIgaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBkZ2FwX2ludHIoaW50IGlycSwgdm9pZCAqdm9pZGJyZCkKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYnJkID0gKHN0cnVjdCBib2FyZF90ICopIHZvaWRicmQ7CisKKwlpZiAoIWJyZCkKKwkJcmV0dXJuIElSUV9OT05FOworCisJLyoKKwkgKiBDaGVjayB0byBtYWtlIHN1cmUgaXRzIGZvciB1cy4KKwkgKi8KKwlpZiAoYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlicmQtPmludHJfY291bnQrKzsKKworCS8qCisJICogU2NoZWR1bGUgdGFza2xldCB0byBydW4gYXQgYSBiZXR0ZXIgdGltZS4KKwkgKi8KKwl0YXNrbGV0X3NjaGVkdWxlKCZicmQtPmhlbHBlcl90YXNrbGV0KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBkZ2FwX2luaXRfZ2xvYmFscygpCisgKgorICogVGhpcyBpcyB3aGVyZSB3ZSBpbml0aWFsaXplIHRoZSBnbG9iYWxzIGZyb20gdGhlIHN0YXRpYyBpbnNtb2QKKyAqIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzLiAgVGhlc2UgYXJlIGRlY2xhcmVkIG5lYXIgdGhlIGhlYWQgb2YKKyAqIHRoaXMgZmlsZS4KKyAqLworc3RhdGljIHZvaWQgZGdhcF9pbml0X2dsb2JhbHModm9pZCkKK3sKKwlpbnQgaSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYQk9BUkRTOyBpKyspCisJCWRnYXBfQm9hcmRbaV0gPSBOVUxMOworCisJaW5pdF90aW1lcigmZGdhcF9wb2xsX3RpbWVyKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRnYXBfZGxfd2FpdCk7CisJZGdhcF9kbF9hY3Rpb24gPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVXRpbGl0eSBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogZGdhcF9tc19zbGVlcCgpCisgKgorICogUHV0IHRoZSBkcml2ZXIgdG8gc2xlZXAgZm9yIHggbXMncworICoKKyAqIFJldHVybnMgMCBpZiB0aW1lZCBvdXQsICEwIChzaG93aW5nIHNpZ25hbCkgaWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF9tc19zbGVlcCh1bG9uZyBtcykKK3sKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZV90aW1lb3V0KChtcyAqIEhaKSAvIDEwMDApOworCXJldHVybiBzaWduYWxfcGVuZGluZyhjdXJyZW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRUWSBJbml0aWFsaXphdGlvbi9DbGVhbnVwIEZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBkZ2FwX3R0eV9yZWdpc3RlcigpCisgKgorICogSW5pdCB0aGUgdHR5IHN1YnN5c3RlbSBmb3IgdGhpcyBib2FyZC4KKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9yZWdpc3RlcihzdHJ1Y3QgYm9hcmRfdCAqYnJkKQoreworCWludCByYyA9IDA7CisKKwlicmQtPlNlcmlhbERyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTUFYUE9SVFMpOworCisJc25wcmludGYoYnJkLT5TZXJpYWxOYW1lLCBNQVhUVFlOQU1FTEVOLCAidHR5X2RnYXBfJWRfIiwgYnJkLT5ib2FyZG51bSk7CisJYnJkLT5TZXJpYWxEcml2ZXItPm5hbWUgPSBicmQtPlNlcmlhbE5hbWU7CisJYnJkLT5TZXJpYWxEcml2ZXItPm5hbWVfYmFzZSA9IDA7CisJYnJkLT5TZXJpYWxEcml2ZXItPm1ham9yID0gMDsKKwlicmQtPlNlcmlhbERyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworCWJyZC0+U2VyaWFsRHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlicmQtPlNlcmlhbERyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlicmQtPlNlcmlhbERyaXZlci0+aW5pdF90ZXJtaW9zID0gRGdhcERlZmF1bHRUZXJtaW9zOworCWJyZC0+U2VyaWFsRHJpdmVyLT5kcml2ZXJfbmFtZSA9IERSVlNUUjsKKwlicmQtPlNlcmlhbERyaXZlci0+ZmxhZ3MgPSAoVFRZX0RSSVZFUl9SRUFMX1JBVyB8CisJCQkJICAgIFRUWV9EUklWRVJfRFlOQU1JQ19ERVYgfAorCQkJCSAgICBUVFlfRFJJVkVSX0hBUkRXQVJFX0JSRUFLKTsKKworCS8qIFRoZSBrZXJuZWwgd2FudHMgc3BhY2UgdG8gc3RvcmUgcG9pbnRlcnMgdG8gdHR5X3N0cnVjdHMgKi8KKwlicmQtPlNlcmlhbERyaXZlci0+dHR5cyA9CisJCWt6YWxsb2MoTUFYUE9SVFMgKiBzaXplb2Yoc3RydWN0IHR0eV9zdHJ1Y3QgKiksIEdGUF9LRVJORUwpOworCWlmICghYnJkLT5TZXJpYWxEcml2ZXItPnR0eXMpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBFbnRyeSBwb2ludHMgZm9yIGRyaXZlci4gIENhbGxlZCBieSB0aGUga2VybmVsIGZyb20KKwkgKiB0dHlfaW8uYyBhbmQgbl90dHkuYy4KKwkgKi8KKwl0dHlfc2V0X29wZXJhdGlvbnMoYnJkLT5TZXJpYWxEcml2ZXIsICZkZ2FwX3R0eV9vcHMpOworCisJLyoKKwkgKiBJZiB3ZSdyZSBkb2luZyB0cmFuc3BhcmVudCBwcmludCwgd2UgaGF2ZSB0byBkbyBhbGwgb2YgdGhlIGFib3ZlCisJICogYWdhaW4sIHNlcGFyYXRlbHkgc28gd2UgZG9uJ3QgZ2V0IHRoZSBMRCBjb25mdXNlZCBhYm91dCB3aGF0IG1ham9yCisJICogd2UgYXJlIHdoZW4gd2UgZ2V0IGludG8gdGhlIGRnYXBfdHR5X29wZW4oKSByb3V0aW5lLgorCSAqLworCWJyZC0+UHJpbnREcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKE1BWFBPUlRTKTsKKworCXNucHJpbnRmKGJyZC0+UHJpbnROYW1lLCBNQVhUVFlOQU1FTEVOLCAicHJfZGdhcF8lZF8iLCBicmQtPmJvYXJkbnVtKTsKKwlicmQtPlByaW50RHJpdmVyLT5uYW1lID0gYnJkLT5QcmludE5hbWU7CisJYnJkLT5QcmludERyaXZlci0+bmFtZV9iYXNlID0gMDsKKwlicmQtPlByaW50RHJpdmVyLT5tYWpvciA9IDA7CisJYnJkLT5QcmludERyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworCWJyZC0+UHJpbnREcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCWJyZC0+UHJpbnREcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJYnJkLT5QcmludERyaXZlci0+aW5pdF90ZXJtaW9zID0gRGdhcERlZmF1bHRUZXJtaW9zOworCWJyZC0+UHJpbnREcml2ZXItPmRyaXZlcl9uYW1lID0gRFJWU1RSOworCWJyZC0+UHJpbnREcml2ZXItPmZsYWdzID0gKFRUWV9EUklWRVJfUkVBTF9SQVcgfAorCQkJCSAgIFRUWV9EUklWRVJfRFlOQU1JQ19ERVYgfAorCQkJCSAgIFRUWV9EUklWRVJfSEFSRFdBUkVfQlJFQUspOworCisJLyogVGhlIGtlcm5lbCB3YW50cyBzcGFjZSB0byBzdG9yZSBwb2ludGVycyB0byB0dHlfc3RydWN0cyAqLworCWJyZC0+UHJpbnREcml2ZXItPnR0eXMgPQorCQlremFsbG9jKE1BWFBPUlRTICogc2l6ZW9mKHN0cnVjdCB0dHlfc3RydWN0ICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJyZC0+UHJpbnREcml2ZXItPnR0eXMpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBFbnRyeSBwb2ludHMgZm9yIGRyaXZlci4gIENhbGxlZCBieSB0aGUga2VybmVsIGZyb20KKwkgKiB0dHlfaW8uYyBhbmQgbl90dHkuYy4KKwkgKi8KKwl0dHlfc2V0X29wZXJhdGlvbnMoYnJkLT5QcmludERyaXZlciwgJmRnYXBfdHR5X29wcyk7CisKKwlpZiAoIWJyZC0+ZGdhcF9NYWpvcl9TZXJpYWxfUmVnaXN0ZXJlZCkgeworCQkvKiBSZWdpc3RlciB0dHkgZGV2aWNlcyAqLworCQlyYyA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoYnJkLT5TZXJpYWxEcml2ZXIpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCQlicmQtPmRnYXBfTWFqb3JfU2VyaWFsX1JlZ2lzdGVyZWQgPSBUUlVFOworCQlkZ2FwX0JvYXJkc0J5TWFqb3JbYnJkLT5TZXJpYWxEcml2ZXItPm1ham9yXSA9IGJyZDsKKwkJYnJkLT5kZ2FwX1NlcmlhbF9NYWpvciA9IGJyZC0+U2VyaWFsRHJpdmVyLT5tYWpvcjsKKwl9CisKKwlpZiAoIWJyZC0+ZGdhcF9NYWpvcl9UcmFuc3BhcmVudFByaW50X1JlZ2lzdGVyZWQpIHsKKwkJLyogUmVnaXN0ZXIgVHJhbnNwYXJlbnQgUHJpbnQgZGV2aWNlcyAqLworCQlyYyA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoYnJkLT5QcmludERyaXZlcik7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJCWJyZC0+ZGdhcF9NYWpvcl9UcmFuc3BhcmVudFByaW50X1JlZ2lzdGVyZWQgPSBUUlVFOworCQlkZ2FwX0JvYXJkc0J5TWFqb3JbYnJkLT5QcmludERyaXZlci0+bWFqb3JdID0gYnJkOworCQlicmQtPmRnYXBfVHJhbnNwYXJlbnRQcmludF9NYWpvciA9IGJyZC0+UHJpbnREcml2ZXItPm1ham9yOworCX0KKworCXJldHVybiByYzsKK30KKworLyoKKyAqIGRnYXBfdHR5X2luaXQoKQorICoKKyAqIEluaXQgdGhlIHR0eSBzdWJzeXN0ZW0uICBDYWxsZWQgb25jZSBwZXIgYm9hcmQgYWZ0ZXIgYm9hcmQgaGFzIGJlZW4KKyAqIGRvd25sb2FkZWQgYW5kIGluaXQnZWQuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfaW5pdChzdHJ1Y3QgYm9hcmRfdCAqYnJkKQoreworCWludCBpOworCWludCB0bHc7CisJdWludCB0cnVlX2NvdW50ID0gMDsKKwl1Y2hhciAqdmFkZHI7CisJdWNoYXIgbW9kZW0gPSAwOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCBic190ICpiczsKKwlzdHJ1Y3QgY21fdCAqY207CisKKwlpZiAoIWJyZCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCS8qCisJICogSW5pdGlhbGl6ZSBib2FyZCBzdHJ1Y3R1cmUgZWxlbWVudHMuCisJICovCisKKwl2YWRkciA9IGJyZC0+cmVfbWFwX21lbWJhc2U7CisJdHJ1ZV9jb3VudCA9IHJlYWR3KCh2YWRkciArIE5DSEFOKSk7CisKKwlicmQtPm5hc3luYyA9IGRnYXBfY29uZmlnX2dldF9udW1fcHJ0cyhicmQpOworCisJaWYgKCFicmQtPm5hc3luYykKKwkJYnJkLT5uYXN5bmMgPSBicmQtPm1heHBvcnRzOworCisJaWYgKGJyZC0+bmFzeW5jID4gYnJkLT5tYXhwb3J0cykKKwkJYnJkLT5uYXN5bmMgPSBicmQtPm1heHBvcnRzOworCisJaWYgKHRydWVfY291bnQgIT0gYnJkLT5uYXN5bmMpIHsKKwkJaWYgKChicmQtPnR5cGUgPT0gUFBDTSkgJiYgKHRydWVfY291bnQgPT0gNjQpKSB7CisJCQlwcl93YXJuKCJkZ2FwOiAlcyBjb25maWd1cmVkIGZvciAlZCBwb3J0cywgaGFzICVkIHBvcnRzLlxuIiwKKwkJCQlicmQtPm5hbWUsIGJyZC0+bmFzeW5jLCB0cnVlX2NvdW50KTsKKwkJCXByX3dhcm4oImRnYXA6IFBsZWFzZSBtYWtlIFNVUkUgdGhlIEVCSSBjYWJsZSBydW5uaW5nIGZyb20gdGhlIGNhcmRcbiIpOworCQkJcHJfd2FybigiZGdhcDogdG8gZWFjaCBFTSBtb2R1bGUgaXMgcGx1Z2dlZCBpbnRvIEVCSSBJTiFcbiIpOworCQl9IGVsc2UgaWYgKChicmQtPnR5cGUgPT0gUFBDTSkgJiYgKHRydWVfY291bnQgPT0gMCkpIHsKKwkJCXByX3dhcm4oImRnYXA6ICVzIGNvbmZpZ3VyZWQgZm9yICVkIHBvcnRzLCBoYXMgJWQgcG9ydHMuXG4iLAorCQkJCWJyZC0+bmFtZSwgYnJkLT5uYXN5bmMsIHRydWVfY291bnQpOworCQkJcHJfd2FybigiZGdhcDogUGxlYXNlIG1ha2UgU1VSRSB0aGUgRUJJIGNhYmxlIHJ1bm5pbmcgZnJvbSB0aGUgY2FyZFxuIik7CisJCQlwcl93YXJuKCJkZ2FwOiB0byBlYWNoIEVNIG1vZHVsZSBpcyBwbHVnZ2VkIGludG8gRUJJIElOIVxuIik7CisJCX0gZWxzZQorCQkJcHJfd2FybigiZGdhcDogJXMgY29uZmlndXJlZCBmb3IgJWQgcG9ydHMsIGhhcyAlZCBwb3J0cy5cbiIsCisJCQkJYnJkLT5uYW1lLCBicmQtPm5hc3luYywgdHJ1ZV9jb3VudCk7CisKKwkJYnJkLT5uYXN5bmMgPSB0cnVlX2NvdW50OworCisJCS8qIElmIG5vIHBvcnRzLCBkb24ndCBib3RoZXIgZ29pbmcgYW55IGZ1cnRoZXIgKi8KKwkJaWYgKCFicmQtPm5hc3luYykgeworCQkJYnJkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKKwkJCWJyZC0+ZHBhc3RhdHVzID0gQkRfTk9GRVA7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBjaGFubmVsIG1lbW9yeSB0aGF0IG1pZ2h0IG5vdCBoYXZlIGJlZW4gYWxsb2NhdGVkCisJICogd2hlbiB0aGUgZHJpdmVyIHdhcyBmaXJzdCBsb2FkZWQuCisJICovCisJZm9yIChpID0gMDsgaSA8IGJyZC0+bmFzeW5jOyBpKyspIHsKKwkJaWYgKCFicmQtPmNoYW5uZWxzW2ldKSB7CisJCQlicmQtPmNoYW5uZWxzW2ldID0KKwkJCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgY2hhbm5lbF90KSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoIWJyZC0+Y2hhbm5lbHNbaV0pCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwljaCA9IGJyZC0+Y2hhbm5lbHNbMF07CisJdmFkZHIgPSBicmQtPnJlX21hcF9tZW1iYXNlOworCisJYnMgPSAoc3RydWN0IGJzX3QgKikgKCh1bG9uZykgdmFkZHIgKyBDSEFOQlVGKTsKKwljbSA9IChzdHJ1Y3QgY21fdCAqKSAoKHVsb25nKSB2YWRkciArIENNREJVRik7CisKKwlicmQtPmJkX2JzID0gYnM7CisKKwkvKiBTZXQgdXAgY2hhbm5lbCB2YXJpYWJsZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYnJkLT5uYXN5bmM7IGkrKywgY2ggPSBicmQtPmNoYW5uZWxzW2ldLCBicysrKSB7CisKKwkJaWYgKCFicmQtPmNoYW5uZWxzW2ldKQorCQkJY29udGludWU7CisKKwkJc3Bpbl9sb2NrX2luaXQoJmNoLT5jaF9sb2NrKTsKKworCQkvKiBTdG9yZSBhbGwgb3VyIG1hZ2ljIG51bWJlcnMgKi8KKwkJY2gtPm1hZ2ljID0gREdBUF9DSEFOTkVMX01BR0lDOworCQljaC0+Y2hfdHVuLm1hZ2ljID0gREdBUF9VTklUX01BR0lDOworCQljaC0+Y2hfdHVuLnVuX3R5cGUgPSBER0FQX1NFUklBTDsKKwkJY2gtPmNoX3R1bi51bl9jaCA9IGNoOworCQljaC0+Y2hfdHVuLnVuX2RldiA9IGk7CisKKwkJY2gtPmNoX3B1bi5tYWdpYyA9IERHQVBfVU5JVF9NQUdJQzsKKwkJY2gtPmNoX3B1bi51bl90eXBlID0gREdBUF9QUklOVDsKKwkJY2gtPmNoX3B1bi51bl9jaCA9IGNoOworCQljaC0+Y2hfcHVuLnVuX2RldiA9IGk7CisKKwkJY2gtPmNoX3ZhZGRyID0gdmFkZHI7CisJCWNoLT5jaF9icyA9IGJzOworCQljaC0+Y2hfY20gPSBjbTsKKwkJY2gtPmNoX2JkID0gYnJkOworCQljaC0+Y2hfcG9ydG51bSA9IGk7CisJCWNoLT5jaF9kaWdpID0gZGdhcF9kaWdpX2luaXQ7CisKKwkJLyoKKwkJICogU2V0IHVwIGRpZ2kgZHNyIGFuZCBkY2QgYml0cyBiYXNlZCBvbiBhbHRwaW4gZmxhZy4KKwkJICovCisJCWlmIChkZ2FwX2NvbmZpZ19nZXRfYWx0cGluKGJyZCkpIHsKKwkJCWNoLT5jaF9kc3IJPSBETV9DRDsKKwkJCWNoLT5jaF9jZAk9IERNX0RTUjsKKwkJCWNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgfD0gRElHSV9BTFRQSU47CisJCX0gZWxzZSB7CisJCQljaC0+Y2hfY2QJPSBETV9DRDsKKwkJCWNoLT5jaF9kc3IJPSBETV9EU1I7CisJCX0KKworCQljaC0+Y2hfdGFkZHIgPSB2YWRkciArICgoY2gtPmNoX2JzLT50eF9zZWcpIDw8IDQpOworCQljaC0+Y2hfcmFkZHIgPSB2YWRkciArICgoY2gtPmNoX2JzLT5yeF9zZWcpIDw8IDQpOworCQljaC0+Y2hfdHhfd2luID0gMDsKKwkJY2gtPmNoX3J4X3dpbiA9IDA7CisJCWNoLT5jaF90c2l6ZSA9IHJlYWR3KCYoY2gtPmNoX2JzLT50eF9tYXgpKSArIDE7CisJCWNoLT5jaF9yc2l6ZSA9IHJlYWR3KCYoY2gtPmNoX2JzLT5yeF9tYXgpKSArIDE7CisJCWNoLT5jaF90c3RhcnQgPSAwOworCQljaC0+Y2hfcnN0YXJ0ID0gMDsKKworCQkvKiAuMjUgc2Vjb25kIGRlbGF5ICovCisJCWNoLT5jaF9jbG9zZV9kZWxheSA9IDI1MDsKKworCQkvKgorCQkgKiBTZXQgcXVldWUgd2F0ZXIgbWFya3MsIGludGVycnVwdCBtYXNrLAorCQkgKiBhbmQgZ2VuZXJhbCB0dHkgcGFyYW1ldGVycy4KKwkJICovCisJCXRsdyA9IGNoLT5jaF90c2l6ZSA+PSAyMDAwID8gKChjaC0+Y2hfdHNpemUgKiA1KSAvIDgpIDoKKwkJCQkJCWNoLT5jaF90c2l6ZSAvIDI7CisJCWNoLT5jaF90bHcgPSB0bHc7CisKKwkJZGdhcF9jbWR3KGNoLCBTVExPVywgdGx3LCAwKTsKKworCQlkZ2FwX2NtZHcoY2gsIFNSTE9XLCBjaC0+Y2hfcnNpemUgLyAyLCAwKTsKKworCQlkZ2FwX2NtZHcoY2gsIFNSSElHSCwgNyAqIGNoLT5jaF9yc2l6ZSAvIDgsIDApOworCisJCWNoLT5jaF9taXN0YXQgPSByZWFkYigmKGNoLT5jaF9icy0+bV9zdGF0KSk7CisKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPmNoX2ZsYWdzX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaC0+Y2hfdHVuLnVuX2ZsYWdzX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaC0+Y2hfcHVuLnVuX2ZsYWdzX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaC0+Y2hfc25pZmZfd2FpdCk7CisKKwkJLyogVHVybiBvbiBhbGwgbW9kZW0gaW50ZXJydXB0cyBmb3Igbm93ICovCisJCW1vZGVtID0gKERNX0NEIHwgRE1fRFNSIHwgRE1fQ1RTIHwgRE1fUkkpOworCQl3cml0ZWIobW9kZW0sICYoY2gtPmNoX2JzLT5tX2ludCkpOworCisJCS8qCisJCSAqIFNldCBlZGVsYXkgdG8gMCBpZiBpbnRlcnJ1cHRzIGFyZSB0dXJuZWQgb24sCisJCSAqIG90aGVyd2lzZSBzZXQgZWRlbGF5IHRvIHRoZSB1c3VhbCAxMDAuCisJCSAqLworCQlpZiAoYnJkLT5pbnRyX3VzZWQpCisJCQl3cml0ZXcoMCwgJihjaC0+Y2hfYnMtPmVkZWxheSkpOworCQllbHNlCisJCQl3cml0ZXcoMTAwLCAmKGNoLT5jaF9icy0+ZWRlbGF5KSk7CisKKwkJd3JpdGViKDEsICYoY2gtPmNoX2JzLT5pZGF0YSkpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogZGdhcF90dHlfdW5pbml0KCkKKyAqCisgKiBVbmluaXRpYWxpemUgdGhlIFRUWSBwb3J0aW9uIG9mIHRoaXMgZHJpdmVyLiAgRnJlZSBhbGwgbWVtb3J5IGFuZAorICogcmVzb3VyY2VzLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX3R0eV91bmluaXQoc3RydWN0IGJvYXJkX3QgKmJyZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IGkgPSAwOworCisJaWYgKGJyZC0+ZGdhcF9NYWpvcl9TZXJpYWxfUmVnaXN0ZXJlZCkgeworCQlkZ2FwX0JvYXJkc0J5TWFqb3JbYnJkLT5TZXJpYWxEcml2ZXItPm1ham9yXSA9IE5VTEw7CisJCWJyZC0+ZGdhcF9TZXJpYWxfTWFqb3IgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgYnJkLT5uYXN5bmM7IGkrKykgeworCQkJdHR5X3BvcnRfZGVzdHJveSgmYnJkLT5TZXJpYWxQb3J0c1tpXSk7CisJCQlkZXYgPSBicmQtPmNoYW5uZWxzW2ldLT5jaF90dW4udW5fc3lzZnM7CisJCQlkZ2FwX3JlbW92ZV90dHlfc3lzZnMoZGV2KTsKKwkJCXR0eV91bnJlZ2lzdGVyX2RldmljZShicmQtPlNlcmlhbERyaXZlciwgaSk7CisJCX0KKwkJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGJyZC0+U2VyaWFsRHJpdmVyKTsKKwkJa2ZyZWUoYnJkLT5TZXJpYWxEcml2ZXItPnR0eXMpOworCQlicmQtPlNlcmlhbERyaXZlci0+dHR5cyA9IE5VTEw7CisJCXB1dF90dHlfZHJpdmVyKGJyZC0+U2VyaWFsRHJpdmVyKTsKKwkJa2ZyZWUoYnJkLT5TZXJpYWxQb3J0cyk7CisJCWJyZC0+ZGdhcF9NYWpvcl9TZXJpYWxfUmVnaXN0ZXJlZCA9IEZBTFNFOworCX0KKworCWlmIChicmQtPmRnYXBfTWFqb3JfVHJhbnNwYXJlbnRQcmludF9SZWdpc3RlcmVkKSB7CisJCWRnYXBfQm9hcmRzQnlNYWpvclticmQtPlByaW50RHJpdmVyLT5tYWpvcl0gPSBOVUxMOworCQlicmQtPmRnYXBfVHJhbnNwYXJlbnRQcmludF9NYWpvciA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBicmQtPm5hc3luYzsgaSsrKSB7CisJCQl0dHlfcG9ydF9kZXN0cm95KCZicmQtPlByaW50ZXJQb3J0c1tpXSk7CisJCQlkZXYgPSBicmQtPmNoYW5uZWxzW2ldLT5jaF9wdW4udW5fc3lzZnM7CisJCQlkZ2FwX3JlbW92ZV90dHlfc3lzZnMoZGV2KTsKKwkJCXR0eV91bnJlZ2lzdGVyX2RldmljZShicmQtPlByaW50RHJpdmVyLCBpKTsKKwkJfQorCQl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoYnJkLT5QcmludERyaXZlcik7CisJCWtmcmVlKGJyZC0+UHJpbnREcml2ZXItPnR0eXMpOworCQlicmQtPlByaW50RHJpdmVyLT50dHlzID0gTlVMTDsKKwkJcHV0X3R0eV9kcml2ZXIoYnJkLT5QcmludERyaXZlcik7CisJCWtmcmVlKGJyZC0+UHJpbnRlclBvcnRzKTsKKwkJYnJkLT5kZ2FwX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZCA9IEZBTFNFOworCX0KK30KKworI2RlZmluZSBUTVBCVUZMRU4gKDEwMjQpCisvKgorICogZGdhcF9zbmlmZiAtIER1bXAgZGF0YSBvdXQgdG8gdGhlICJzbmlmZiIgYnVmZmVyIGlmIHRoZQorICogcHJvYyBzbmlmZiBmaWxlIGlzIG9wZW5lZC4uLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX3NuaWZmX25vd2FpdF9ub2xvY2soc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVjaGFyICp0ZXh0LAorCQkJCSAgICAgdWNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlpbnQgbjsKKwlpbnQgcjsKKwlpbnQgbmJ1ZjsKKwlpbnQgaTsKKwlpbnQgdG1wYnVmbGVuOworCWNoYXIgdG1wYnVmW1RNUEJVRkxFTl07CisJY2hhciAqcCA9IHRtcGJ1ZjsKKwlpbnQgdG9vX211Y2hfZGF0YTsKKworCS8qIExlYXZlIGlmIHNuaWZmIG5vdCBvcGVuICovCisJaWYgKCEoY2gtPmNoX3NuaWZmX2ZsYWdzICYgU05JRkZfT1BFTikpCisJCXJldHVybjsKKworCWRvX2dldHRpbWVvZmRheSgmdHYpOworCisJLyogQ3JlYXRlIG91ciBoZWFkZXIgZm9yIGRhdGEgZHVtcCAqLworCXAgKz0gc3ByaW50ZihwLCAiPCVsZCAlbGQ+PCVzPjwiLCB0di50dl9zZWMsIHR2LnR2X3VzZWMsIHRleHQpOworCXRtcGJ1ZmxlbiA9IHAgLSB0bXBidWY7CisKKwlkbyB7CisJCXRvb19tdWNoX2RhdGEgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBsZW4gJiYgdG1wYnVmbGVuIDwgKFRNUEJVRkxFTiAtIDQpOyBpKyspIHsKKwkJCXAgKz0gc3ByaW50ZihwLCAiJTAyeCAiLCAqYnVmKTsKKwkJCWJ1ZisrOworCQkJdG1wYnVmbGVuID0gcCAtIHRtcGJ1ZjsKKwkJfQorCisJCWlmICh0bXBidWZsZW4gPCAoVE1QQlVGTEVOIC0gNCkpIHsKKwkJCWlmIChpID4gMCkKKwkJCQlwICs9IHNwcmludGYocCAtIDEsICIlc1xuIiwgIj4iKTsKKwkJCWVsc2UKKwkJCQlwICs9IHNwcmludGYocCwgIiVzXG4iLCAiPiIpOworCQl9IGVsc2UgeworCQkJdG9vX211Y2hfZGF0YSA9IDE7CisJCQlsZW4gLT0gaTsKKwkJfQorCisJCW5idWYgPSBzdHJsZW4odG1wYnVmKTsKKwkJcCA9IHRtcGJ1ZjsKKworCQkvKgorCQkgKiAgTG9vcCB3aGlsZSBkYXRhIHJlbWFpbnMuCisJCSAqLworCQl3aGlsZSAobmJ1ZiA+IDAgJiYgY2gtPmNoX3NuaWZmX2J1ZikgeworCQkJLyoKKwkJCSAqICBEZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgc3BhY2UgbGVmdCBpbiB0aGUKKwkJCSAqICBidWZmZXIuICBJZiB0aGVyZSdzIG5vbmUsIHdhaXQgdW50aWwgc29tZSBhcHBlYXJzLgorCQkJICovCisJCQluID0gKGNoLT5jaF9zbmlmZl9vdXQgLSBjaC0+Y2hfc25pZmZfaW4gLSAxKSAmCisJCQkgICAgIFNOSUZGX01BU0s7CisKKwkJCS8qCisJCQkgKiBJZiB0aGVyZSBpcyBubyBzcGFjZSBsZWZ0IHRvIHdyaXRlIHRvIGluIG91ciBzbmlmZgorCQkJICogYnVmZmVyLCB3ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8gZHJvcCB0aGUgZGF0YS4KKwkJCSAqIFdlICpjYW5ub3QqIHNsZWVwIGhlcmUgd2FpdGluZyBmb3Igc3BhY2UsIGJlY2F1c2UKKwkJCSAqIHRoaXMgZnVuY3Rpb24gd2FzIHByb2JhYmx5IGNhbGxlZCBieSB0aGUKKwkJCSAqIGludGVycnVwdC90aW1lciByb3V0aW5lcyEKKwkJCSAqLworCQkJaWYgKG4gPT0gMCkKKwkJCQlyZXR1cm47CisKKwkJCS8qCisJCQkgKiBDb3B5IGFzIG11Y2ggZGF0YSBhcyB3aWxsIGZpdC4KKwkJCSAqLworCisJCQlpZiAobiA+IG5idWYpCisJCQkJbiA9IG5idWY7CisKKwkJCXIgPSBTTklGRl9NQVggLSBjaC0+Y2hfc25pZmZfaW47CisKKwkJCWlmIChyIDw9IG4pIHsKKwkJCQltZW1jcHkoY2gtPmNoX3NuaWZmX2J1ZiArCisJCQkJICAgICAgIGNoLT5jaF9zbmlmZl9pbiwgcCwgcik7CisKKwkJCQluIC09IHI7CisJCQkJY2gtPmNoX3NuaWZmX2luID0gMDsKKwkJCQlwICs9IHI7CisJCQkJbmJ1ZiAtPSByOworCQkJfQorCisJCQltZW1jcHkoY2gtPmNoX3NuaWZmX2J1ZiArIGNoLT5jaF9zbmlmZl9pbiwgcCwgbik7CisKKwkJCWNoLT5jaF9zbmlmZl9pbiArPSBuOworCQkJcCArPSBuOworCQkJbmJ1ZiAtPSBuOworCisJCQkvKgorCQkJICogIFdha2V1cCBhbnkgdGhyZWFkIHdhaXRpbmcgZm9yIGRhdGEKKwkJCSAqLworCQkJaWYgKGNoLT5jaF9zbmlmZl9mbGFncyAmIFNOSUZGX1dBSVRfREFUQSkgeworCQkJCWNoLT5jaF9zbmlmZl9mbGFncyAmPSB+U05JRkZfV0FJVF9EQVRBOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3NuaWZmX3dhaXQpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogSWYgdGhlIHVzZXIgc2VudCB1cyB0b28gbXVjaCBkYXRhIHRvIHB1c2ggaW50byBvdXIgdG1wYnVmLAorCQkgKiB3ZSBuZWVkIHRvIGtlZXAgbG9vcGluZyBhcm91bmQgb24gYWxsIHRoZSBkYXRhLgorCQkgKi8KKwkJaWYgKHRvb19tdWNoX2RhdGEpIHsKKwkJCXAgPSB0bXBidWY7CisJCQl0bXBidWZsZW4gPSAwOworCQl9CisKKwl9IHdoaWxlICh0b29fbXVjaF9kYXRhKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICAgICAgZGdhcF9pbnB1dCAtIFByb2Nlc3MgcmVjZWl2ZWQgZGF0YS4KKyAqCisgKiAgICAgICAgICAgICAgY2ggICAgICAtIFBvaW50ZXIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUuCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGRnYXBfaW5wdXQoc3RydWN0IGNoYW5uZWxfdCAqY2gpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBic190CSpiczsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHA7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisJdWludAlybWFzazsKKwl1aW50CWhlYWQ7CisJdWludAl0YWlsOworCWludAlkYXRhX2xlbjsKKwl1bG9uZwlsb2NrX2ZsYWdzOworCXVsb25nICAgbG9ja19mbGFnczI7CisJaW50IGZsaXBfbGVuOworCWludCBsZW4gPSAwOworCWludCBuID0gMDsKKwl1Y2hhciAqYnVmOworCXVjaGFyIHRtcGNoYXI7CisJaW50IHMgPSAwOworCisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwl0cCA9IGNoLT5jaF90dW4udW5fdHR5OworCisJYnMgID0gY2gtPmNoX2JzOworCWlmICghYnMpCisJCXJldHVybjsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwkvKgorCSAqICAgICAgRmlndXJlIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgYnVmZmVyLgorCSAqICAgICAgRXhpdCBpbW1lZGlhdGVseSBpZiBub25lLgorCSAqLworCisJcm1hc2sgPSBjaC0+Y2hfcnNpemUgLSAxOworCisJaGVhZCA9IHJlYWR3KCYoYnMtPnJ4X2hlYWQpKTsKKwloZWFkICY9IHJtYXNrOworCXRhaWwgPSByZWFkdygmKGJzLT5yeF90YWlsKSk7CisJdGFpbCAmPSBybWFzazsKKworCWRhdGFfbGVuID0gKGhlYWQgLSB0YWlsKSAmIHJtYXNrOworCisJaWYgKGRhdGFfbGVuID09IDApIHsKKwkJd3JpdGViKDEsICYoYnMtPmlkYXRhKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSWYgdGhlIGRldmljZSBpcyBub3Qgb3Blbiwgb3IgQ1JFQUQgaXMgb2ZmLCBmbHVzaAorCSAqIGlucHV0IGRhdGEgYW5kIHJldHVybiBpbW1lZGlhdGVseS4KKwkgKi8KKwlpZiAoKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkgfHwgIXRwICB8fAorCSAgICAodHAtPm1hZ2ljICE9IFRUWV9NQUdJQykgfHwKKwkgICAgIShjaC0+Y2hfdHVuLnVuX2ZsYWdzICYgVU5fSVNPUEVOKSB8fAorCSAgICAhKHRwLT50ZXJtaW9zLmNfY2ZsYWcgJiBDUkVBRCkgfHwKKwkgICAgKGNoLT5jaF90dW4udW5fZmxhZ3MgJiBVTl9DTE9TSU5HKSkgeworCisJCXdyaXRldyhoZWFkLCAmKGJzLT5yeF90YWlsKSk7CisJCXdyaXRlYigxLCAmKGJzLT5pZGF0YSkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIElmIHdlIGFyZSB0aHJvdHRsZWQsIHNpbXBseSBkb24ndCByZWFkIGFueSBkYXRhLgorCSAqLworCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9SWEJMT0NLKSB7CisJCXdyaXRlYigxLCAmKGJzLT5pZGF0YSkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqICAgICAgSWdub3JlIG9ydW5zLgorCSAqLworCXRtcGNoYXIgPSByZWFkYigmKGJzLT5vcnVuKSk7CisJaWYgKHRtcGNoYXIpIHsKKwkJY2gtPmNoX2Vycl9vdmVycnVuKys7CisJCXdyaXRlYigwLCAmKGJzLT5vcnVuKSk7CisJfQorCisJLyogRGVjaWRlIGhvdyBtdWNoIGRhdGEgd2UgY2FuIHNlbmQgaW50byB0aGUgdHR5IGxheWVyICovCisJZmxpcF9sZW4gPSBUVFlfRkxJUEJVRl9TSVpFOworCisJLyogQ2hvcCBkb3duIHRoZSBsZW5ndGgsIGlmIG5lZWRlZCAqLworCWxlbiA9IG1pbihkYXRhX2xlbiwgZmxpcF9sZW4pOworCWxlbiA9IG1pbihsZW4sIChOX1RUWV9CVUZfU0laRSAtIDEpKTsKKworCWxkID0gdHR5X2xkaXNjX3JlZih0cCk7CisKKyNpZmRlZiBUVFlfRE9OVF9GTElQCisJLyoKKwkgKiBJZiB0aGUgRE9OVF9GTElQIGZsYWcgaXMgb24sIGRvbid0IGZsdXNoIG91ciBidWZmZXIsIGFuZCBhY3QKKwkgKiBsaWtlIHRoZSBsZCBkb2Vzbid0IGhhdmUgYW55IHNwYWNlIHRvIHB1dCB0aGUgZGF0YSByaWdodCBub3cuCisJICovCisJaWYgKHRlc3RfYml0KFRUWV9ET05UX0ZMSVAsICZ0cC0+ZmxhZ3MpKQorCQlsZW4gPSAwOworI2VuZGlmCisKKwkvKgorCSAqIElmIHdlIHdlcmUgdW5hYmxlIHRvIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgbGQsCisJICogZG9uJ3QgZmx1c2ggb3VyIGJ1ZmZlciwgYW5kIGFjdCBsaWtlIHRoZSBsZCBkb2Vzbid0CisJICogaGF2ZSBhbnkgc3BhY2UgdG8gcHV0IHRoZSBkYXRhIHJpZ2h0IG5vdy4KKwkgKi8KKwlpZiAoIWxkKSB7CisJCWxlbiA9IDA7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSWYgbGQgZG9lc24ndCBoYXZlIGEgcG9pbnRlciB0byBhIHJlY2VpdmVfYnVmIGZ1bmN0aW9uLAorCQkgKiBmbHVzaCB0aGUgZGF0YSwgdGhlbiBhY3QgbGlrZSB0aGUgbGQgZG9lc24ndCBoYXZlIGFueQorCQkgKiBzcGFjZSB0byBwdXQgdGhlIGRhdGEgcmlnaHQgbm93LgorCQkgKi8KKwkJaWYgKCFsZC0+b3BzLT5yZWNlaXZlX2J1ZikgeworCQkJd3JpdGV3KGhlYWQsICYoYnMtPnJ4X3RhaWwpKTsKKwkJCWxlbiA9IDA7CisJCX0KKwl9CisKKwlpZiAobGVuIDw9IDApIHsKKwkJd3JpdGViKDEsICYoYnMtPmlkYXRhKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJaWYgKGxkKQorCQkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKKwkJcmV0dXJuOworCX0KKworCWJ1ZiA9IGNoLT5jaF9iZC0+ZmxpcGJ1ZjsKKwluID0gbGVuOworCisJLyoKKwkgKiBuIG5vdyBjb250YWlucyB0aGUgbW9zdCBhbW91bnQgb2YgZGF0YSB3ZSBjYW4gY29weSwKKwkgKiBib3VuZGVkIGVpdGhlciBieSBvdXIgYnVmZmVyIHNpemUgb3IgdGhlIGFtb3VudAorCSAqIG9mIGRhdGEgdGhlIGNhcmQgYWN0dWFsbHkgaGFzIHBlbmRpbmcuLi4KKwkgKi8KKwl3aGlsZSAobikgeworCisJCXMgPSAoKGhlYWQgPj0gdGFpbCkgPyBoZWFkIDogY2gtPmNoX3JzaXplKSAtIHRhaWw7CisJCXMgPSBtaW4ocywgbik7CisKKwkJaWYgKHMgPD0gMCkKKwkJCWJyZWFrOworCisJCW1lbWNweV9mcm9taW8oYnVmLCAoY2hhciAqKSBjaC0+Y2hfcmFkZHIgKyB0YWlsLCBzKTsKKwkJZGdhcF9zbmlmZl9ub3dhaXRfbm9sb2NrKGNoLCAiVVNFUiBSRUFEIiwgYnVmLCBzKTsKKworCQl0YWlsICs9IHM7CisJCWJ1ZiArPSBzOworCisJCW4gLT0gczsKKwkJLyogRmxpcCBxdWV1ZSBpZiBuZWVkZWQgKi8KKwkJdGFpbCAmPSBybWFzazsKKwl9CisKKwl3cml0ZXcodGFpbCwgJihicy0+cnhfdGFpbCkpOworCXdyaXRlYigxLCAmKGJzLT5pZGF0YSkpOworCWNoLT5jaF9yeGNvdW50ICs9IGxlbjsKKworCS8qCisJICogSWYgd2UgYXJlIGNvbXBsZXRlbHkgcmF3LCB3ZSBkb24ndCBuZWVkIHRvIGdvIHRocm91Z2ggYSBsb3QKKwkgKiBvZiB0aGUgdHR5IGxheWVycyB0aGF0IGV4aXN0LgorCSAqIEluIHRoaXMgY2FzZSwgd2UgdGFrZSB0aGUgc2hvcnRlc3QgYW5kIGZhc3Rlc3Qgcm91dGUgd2UKKwkgKiBjYW4gdG8gcmVsYXkgdGhlIGRhdGEgdG8gdGhlIHVzZXIuCisJICoKKwkgKiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgd2UgYXJlIG5vdCByYXcsIHdlIG5lZWQgdG8gZ28gdGhyb3VnaAorCSAqIHRoZSB0dHkgbGF5ZXIsIHdoaWNoIGhhcyBpdHMgQVBJIG1vcmUgd2VsbCBkZWZpbmVkLgorCSAqLworCWlmIChJX1BBUk1SSyh0cCkgfHwgSV9CUktJTlQodHApIHx8IElfSU5QQ0sodHApKSB7CisJCWRnYXBfcGFyaXR5X3NjYW4oY2gsIGNoLT5jaF9iZC0+ZmxpcGJ1ZiwKKwkJCQkgY2gtPmNoX2JkLT5mbGlwZmxhZ2J1ZiwgJmxlbik7CisKKwkJbGVuID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHAtPnBvcnQsIGxlbik7CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmdfZmxhZ3ModHAtPnBvcnQsIGNoLT5jaF9iZC0+ZmxpcGJ1ZiwKKwkJCWNoLT5jaF9iZC0+ZmxpcGZsYWdidWYsIGxlbik7CisJfSBlbHNlIHsKKwkJbGVuID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHAtPnBvcnQsIGxlbik7CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHAtPnBvcnQsIGNoLT5jaF9iZC0+ZmxpcGJ1ZiwgbGVuKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCS8qIFRlbGwgdGhlIHR0eSBsYXllciBpdHMgb2theSB0byAiZWF0IiB0aGUgZGF0YSBub3cgKi8KKwl0dHlfZmxpcF9idWZmZXJfcHVzaCh0cC0+cG9ydCk7CisKKwlpZiAobGQpCisJCXR0eV9sZGlzY19kZXJlZihsZCk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGV0ZXJtaW5lcyB3aGVuIENBUlJJRVIgY2hhbmdlcyBzdGF0ZSBhbmQgdGFrZXMgYXBwcm9wcmlhdGUKKyAqIGFjdGlvbi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBkZ2FwX2NhcnJpZXIoc3RydWN0IGNoYW5uZWxfdCAqY2gpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCisJaW50IHZpcnRfY2FycmllciA9IDA7CisJaW50IHBoeXNfY2FycmllciA9IDA7CisKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCWJkID0gY2gtPmNoX2JkOworCisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuOworCisJLyogTWFrZSBzdXJlIGFsdHBpbiBpcyBhbHdheXMgc2V0IGNvcnJlY3RseSAqLworCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9BTFRQSU4pIHsKKwkJY2gtPmNoX2RzciAgICAgID0gRE1fQ0Q7CisJCWNoLT5jaF9jZCAgICAgICA9IERNX0RTUjsKKwl9IGVsc2UgeworCQljaC0+Y2hfZHNyICAgICAgPSBETV9EU1I7CisJCWNoLT5jaF9jZCAgICAgICA9IERNX0NEOworCX0KKworCWlmIChjaC0+Y2hfbWlzdGF0ICYgRF9DRChjaCkpCisJCXBoeXNfY2FycmllciA9IDE7CisKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfRk9SQ0VEQ0QpCisJCXZpcnRfY2FycmllciA9IDE7CisKKwlpZiAoY2gtPmNoX2NfY2ZsYWcgJiBDTE9DQUwpCisJCXZpcnRfY2FycmllciA9IDE7CisKKwkvKgorCSAqIFRlc3QgZm9yIGEgVklSVFVBTCBjYXJyaWVyIHRyYW5zaXRpb24gdG8gSElHSC4KKwkgKi8KKwlpZiAoKChjaC0+Y2hfZmxhZ3MgJiBDSF9GQ0FSKSA9PSAwKSAmJiAodmlydF9jYXJyaWVyID09IDEpKSB7CisKKwkJLyoKKwkJICogV2hlbiBjYXJyaWVyIHJpc2VzLCB3YWtlIGFueSB0aHJlYWRzIHdhaXRpbmcKKwkJICogZm9yIGNhcnJpZXIgaW4gdGhlIG9wZW4gcm91dGluZS4KKwkJICovCisKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJihjaC0+Y2hfZmxhZ3Nfd2FpdCkpKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfZmxhZ3Nfd2FpdCk7CisJfQorCisJLyoKKwkgKiBUZXN0IGZvciBhIFBIWVNJQ0FMIGNhcnJpZXIgdHJhbnNpdGlvbiB0byBISUdILgorCSAqLworCWlmICgoKGNoLT5jaF9mbGFncyAmIENIX0NEKSA9PSAwKSAmJiAocGh5c19jYXJyaWVyID09IDEpKSB7CisKKwkJLyoKKwkJICogV2hlbiBjYXJyaWVyIHJpc2VzLCB3YWtlIGFueSB0aHJlYWRzIHdhaXRpbmcKKwkJICogZm9yIGNhcnJpZXIgaW4gdGhlIG9wZW4gcm91dGluZS4KKwkJICovCisKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJihjaC0+Y2hfZmxhZ3Nfd2FpdCkpKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfZmxhZ3Nfd2FpdCk7CisJfQorCisJLyoKKwkgKiAgVGVzdCBmb3IgYSBQSFlTSUNBTCB0cmFuc2l0aW9uIHRvIGxvdywgc28gbG9uZyBhcyB3ZSBhcmVuJ3QKKwkgKiAgY3VycmVudGx5IGlnbm9yaW5nIHBoeXNpY2FsIHRyYW5zaXRpb25zICh3aGljaCBpcyB3aGF0ICJ2aXJ0dWFsCisJICogIGNhcnJpZXIiIGluZGljYXRlcykuCisJICoKKwkgKiAgVGhlIHRyYW5zaXRpb24gb2YgdGhlIHZpcnR1YWwgY2FycmllciB0byBsb3cgcmVhbGx5IGRvZXNuJ3QKKwkgKiAgbWF0dGVyLi4uIGl0IHJlYWxseSBvbmx5IG1lYW5zICJpZ25vcmUgY2FycmllciBzdGF0ZSIsIG5vdAorCSAqICAibWFrZSBwcmV0ZW5kIHRoYXQgY2FycmllciBpcyB0aGVyZSIuCisJICovCisJaWYgKCh2aXJ0X2NhcnJpZXIgPT0gMCkgJiYKKwkgICAgKChjaC0+Y2hfZmxhZ3MgJiBDSF9DRCkgIT0gMCkgJiYKKwkgICAgKHBoeXNfY2FycmllciA9PSAwKSkgeworCisJCS8qCisJCSAqICAgV2hlbiBjYXJyaWVyIGRyb3BzOgorCQkgKgorCQkgKiAgIERyb3AgY2FycmllciBvbiBhbGwgb3BlbiB1bml0cy4KKwkJICoKKwkJICogICBGbHVzaCBxdWV1ZXMsIHdha2luZyB1cCBhbnkgdGFzayB3YWl0aW5nIGluIHRoZQorCQkgKiAgIGxpbmUgZGlzY2lwbGluZS4KKwkJICoKKwkJICogICBTZW5kIGEgaGFuZ3VwIHRvIHRoZSBjb250cm9sIHRlcm1pbmFsLgorCQkgKgorCQkgKiAgIEVuYWJsZSBhbGwgc2VsZWN0IGNhbGxzLgorCQkgKi8KKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJihjaC0+Y2hfZmxhZ3Nfd2FpdCkpKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfZmxhZ3Nfd2FpdCk7CisKKwkJaWYgKGNoLT5jaF90dW4udW5fb3Blbl9jb3VudCA+IDApCisJCQl0dHlfaGFuZ3VwKGNoLT5jaF90dW4udW5fdHR5KTsKKworCQlpZiAoY2gtPmNoX3B1bi51bl9vcGVuX2NvdW50ID4gMCkKKwkJCXR0eV9oYW5ndXAoY2gtPmNoX3B1bi51bl90dHkpOworCX0KKworCS8qCisJICogIE1ha2Ugc3VyZSB0aGF0IG91ciBjYWNoZWQgdmFsdWVzIHJlZmxlY3QgdGhlIGN1cnJlbnQgcmVhbGl0eS4KKwkgKi8KKwlpZiAodmlydF9jYXJyaWVyID09IDEpCisJCWNoLT5jaF9mbGFncyB8PSBDSF9GQ0FSOworCWVsc2UKKwkJY2gtPmNoX2ZsYWdzICY9IH5DSF9GQ0FSOworCisJaWYgKHBoeXNfY2FycmllciA9PSAxKQorCQljaC0+Y2hfZmxhZ3MgfD0gQ0hfQ0Q7CisJZWxzZQorCQljaC0+Y2hfZmxhZ3MgJj0gfkNIX0NEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVFRZIEVudHJ5IHBvaW50cyBhbmQgaGVscGVyIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBkZ2FwX3R0eV9vcGVuKCkKKyAqCisgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYm9hcmRfdAkqYnJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90CSp1bjsKKwlzdHJ1Y3QgYnNfdAkqYnM7CisJdWludAkJbWFqb3IgPSAwOworCXVpbnQJCW1pbm9yID0gMDsKKwlpbnQJCXJjID0gMDsKKwl1bG9uZwkJbG9ja19mbGFnczsKKwl1bG9uZwkJbG9ja19mbGFnczI7CisJdTE2CQloZWFkOworCisJcmMgPSAwOworCisJbWFqb3IgPSBNQUpPUih0dHlfZGV2bnVtKHR0eSkpOworCW1pbm9yID0gTUlOT1IodHR5X2Rldm51bSh0dHkpKTsKKworCWlmIChtYWpvciA+IDI1NSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCS8qIEdldCBib2FyZCBwb2ludGVyIGZyb20gb3VyIGFycmF5IG9mIG1ham9ycyB3ZSBoYXZlIGFsbG9jYXRlZCAqLworCWJyZCA9IGRnYXBfQm9hcmRzQnlNYWpvclttYWpvcl07CisJaWYgKCFicmQpCisJCXJldHVybiAtRU5YSU87CisKKwkvKgorCSAqIElmIGJvYXJkIGlzIG5vdCB5ZXQgdXAgdG8gYSBzdGF0ZSBvZiBSRUFEWSwgZ28gdG8KKwkgKiBzbGVlcCB3YWl0aW5nIGZvciBpdCB0byBoYXBwZW4gb3IgdGhleSBjYW5jZWwgdGhlIG9wZW4uCisJICovCisJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYnJkLT5zdGF0ZV93YWl0LAorCQkoYnJkLT5zdGF0ZSAmIEJPQVJEX1JFQURZKSk7CisKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJLyogVGhlIHdhaXQgYWJvdmUgc2hvdWxkIGd1YXJhbnRlZSB0aGlzIGNhbm5vdCBoYXBwZW4gKi8KKwlpZiAoYnJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIElmIG9wZW5lZCBkZXZpY2UgaXMgZ3JlYXRlciB0aGFuIG91ciBudW1iZXIgb2YgcG9ydHMsIGJhaWwuICovCisJaWYgKE1JTk9SKHR0eV9kZXZudW0odHR5KSkgPiBicmQtPm5hc3luYykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWNoID0gYnJkLT5jaGFubmVsc1ttaW5vcl07CisJaWYgKCFjaCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIEdyYWIgY2hhbm5lbCBsb2NrICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwkvKiBGaWd1cmUgb3V0IG91ciB0eXBlICovCisJaWYgKG1ham9yID09IGJyZC0+ZGdhcF9TZXJpYWxfTWFqb3IpIHsKKwkJdW4gPSAmYnJkLT5jaGFubmVsc1ttaW5vcl0tPmNoX3R1bjsKKwkJdW4tPnVuX3R5cGUgPSBER0FQX1NFUklBTDsKKwl9IGVsc2UgaWYgKG1ham9yID09IGJyZC0+ZGdhcF9UcmFuc3BhcmVudFByaW50X01ham9yKSB7CisJCXVuID0gJmJyZC0+Y2hhbm5lbHNbbWlub3JdLT5jaF9wdW47CisJCXVuLT51bl90eXBlID0gREdBUF9QUklOVDsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIFN0b3JlIG91ciB1bml0IGludG8gZHJpdmVyX2RhdGEsIHNvIHdlIGFsd2F5cyBoYXZlIGl0IGF2YWlsYWJsZS4gKi8KKwl0dHktPmRyaXZlcl9kYXRhID0gdW47CisKKwkvKgorCSAqIEVycm9yIGlmIGNoYW5uZWwgaW5mbyBwb2ludGVyIGlzIE5VTEwuCisJICovCisJYnMgPSBjaC0+Y2hfYnM7CisJaWYgKCFicykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSB0dHkncworCSAqLworCWlmICghKHVuLT51bl9mbGFncyAmIFVOX0lTT1BFTikpIHsKKwkJLyogU3RvcmUgaW1wb3J0YW50IHZhcmlhYmxlcy4gKi8KKwkJdW4tPnVuX3R0eSAgICAgPSB0dHk7CisKKwkJLyogTWF5YmUgZG8gc29tZXRoaW5nIGhlcmUgdG8gdGhlIFRUWSBzdHJ1Y3QgYXMgd2VsbD8gKi8KKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgaWYgbmVpdGhlciB0ZXJtaW5hbCBvciBwcmludGVyIGlzIG9wZW4uCisJICovCisJaWYgKCEoKGNoLT5jaF90dW4udW5fZmxhZ3MgfCBjaC0+Y2hfcHVuLnVuX2ZsYWdzKSAmIFVOX0lTT1BFTikpIHsKKworCQljaC0+Y2hfbWZvcmNlID0gMDsKKwkJY2gtPmNoX212YWwgPSAwOworCisJCS8qCisJCSAqIEZsdXNoIGlucHV0IHF1ZXVlLgorCQkgKi8KKwkJaGVhZCA9IHJlYWR3KCYoYnMtPnJ4X2hlYWQpKTsKKwkJd3JpdGV3KGhlYWQsICYoYnMtPnJ4X3RhaWwpKTsKKworCQljaC0+Y2hfZmxhZ3MgPSAwOworCQljaC0+cHNjYW5fc3RhdGUgPSAwOworCQljaC0+cHNjYW5fc2F2ZWNoYXIgPSAwOworCisJCWNoLT5jaF9jX2NmbGFnICAgPSB0dHktPnRlcm1pb3MuY19jZmxhZzsKKwkJY2gtPmNoX2NfaWZsYWcgICA9IHR0eS0+dGVybWlvcy5jX2lmbGFnOworCQljaC0+Y2hfY19vZmxhZyAgID0gdHR5LT50ZXJtaW9zLmNfb2ZsYWc7CisJCWNoLT5jaF9jX2xmbGFnICAgPSB0dHktPnRlcm1pb3MuY19sZmxhZzsKKwkJY2gtPmNoX3N0YXJ0YyA9IHR0eS0+dGVybWlvcy5jX2NjW1ZTVEFSVF07CisJCWNoLT5jaF9zdG9wYyAgPSB0dHktPnRlcm1pb3MuY19jY1tWU1RPUF07CisKKwkJLyogVE9ETzogZmx1c2ggb3VyIFRUWSBzdHJ1Y3QgaGVyZT8gKi8KKwl9CisKKwlkZ2FwX2NhcnJpZXIoY2gpOworCS8qCisJICogUnVuIHBhcmFtIGluIGNhc2Ugd2UgY2hhbmdlZCBhbnl0aGluZworCSAqLworCWRnYXBfcGFyYW0odHR5KTsKKworCS8qCisJICogZm9sbG93IHByb3RvY29sIGZvciBvcGVuaW5nIHBvcnQKKwkgKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCXJjID0gZGdhcF9ibG9ja190aWxfcmVhZHkodHR5LCBmaWxlLCBjaCk7CisKKwlpZiAoIXVuLT51bl90dHkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogTm8gZ29pbmcgYmFjayBub3csIGluY3JlbWVudCBvdXIgdW5pdCBhbmQgY2hhbm5lbCBjb3VudGVycyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisJY2gtPmNoX29wZW5fY291bnQrKzsKKwl1bi0+dW5fb3Blbl9jb3VudCsrOworCXVuLT51bl9mbGFncyB8PSAoVU5fSVNPUEVOKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBkZ2FwX2Jsb2NrX3RpbF9yZWFkeSgpCisgKgorICogV2FpdCBmb3IgRENELCBpZiBuZWVkZWQuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF9ibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJc3RydWN0IGNoYW5uZWxfdCAqY2gpCit7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHVuX3QgKnVuID0gTlVMTDsKKwl1bG9uZyAgIGxvY2tfZmxhZ3M7CisJdWludAlvbGRfZmxhZ3MgPSAwOworCWludCBzbGVlcF9vbl91bl9mbGFncyA9IDA7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQyB8fCAhZmlsZSB8fCAhY2ggfHwKKwkJY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIC1FTlhJTzsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAtRU5YSU87CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJY2gtPmNoX3dvcGVuKys7CisKKwkvKiBMb29wIGZvcmV2ZXIgKi8KKwl3aGlsZSAoMSkgeworCisJCXNsZWVwX29uX3VuX2ZsYWdzID0gMDsKKworCQkvKgorCQkgKiBJZiBib2FyZCBoYXMgZmFpbGVkIHNvbWVob3cgZHVyaW5nIG91ciBzbGVlcCwKKwkJICogYmFpbCB3aXRoIGVycm9yLgorCQkgKi8KKwkJaWYgKGNoLT5jaF9iZC0+c3RhdGUgPT0gQk9BUkRfRkFJTEVEKSB7CisJCQlyZXR2YWwgPSAtRU5YSU87CisJCQlicmVhazsKKwkJfQorCisJCS8qIElmIHR0eSB3YXMgaHVuZyB1cCwgYnJlYWsgb3V0IG9mIGxvb3AgYW5kIHNldCBlcnJvci4gKi8KKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlsZSkpIHsKKwkJCXJldHZhbCA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIElmIGVpdGhlciB1bml0IGlzIGluIHRoZSBtaWRkbGUgb2YgdGhlIGZyYWdpbGUgcGFydCBvZiBjbG9zZSwKKwkJICogd2UganVzdCBjYW5ub3QgdG91Y2ggdGhlIGNoYW5uZWwgc2FmZWx5LgorCQkgKiBHbyBiYWNrIHRvIHNsZWVwLCBrbm93aW5nIHRoYXQgd2hlbiB0aGUgY2hhbm5lbCBjYW4gYmUKKwkJICogdG91Y2hlZCBzYWZlbHksIHRoZSBjbG9zZSByb3V0aW5lIHdpbGwgc2lnbmFsIHRoZQorCQkgKiBjaF93YWl0X2ZsYWdzIHRvIHdha2UgdXMgYmFjayB1cC4KKwkJICovCisJCWlmICghKChjaC0+Y2hfdHVuLnVuX2ZsYWdzIHwgY2gtPmNoX3B1bi51bl9mbGFncykgJgorCQkgICAgICBVTl9DTE9TSU5HKSkgeworCisJCQkvKgorCQkJICogT3VyIGNvbmRpdGlvbnMgdG8gbGVhdmUgY2xlYW5seSBhbmQgaGFwcGlseToKKwkJCSAqIDEpIE5PTkJMT0NLSU5HIG9uIHRoZSB0dHkgaXMgc2V0LgorCQkJICogMikgQ0xPQ0FMIGlzIHNldC4KKwkJCSAqIDMpIERDRCAoZmFrZSBvciByZWFsKSBpcyBhY3RpdmUuCisJCQkgKi8KKworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCWJyZWFrOworCisJCQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCisJCQkJYnJlYWs7CisKKwkJCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9DRCkKKwkJCQlicmVhazsKKworCQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX0ZDQVIpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlzbGVlcF9vbl91bl9mbGFncyA9IDE7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGVyZSBpcyBhIHNpZ25hbCBwZW5kaW5nLCB0aGUgdXNlciBwcm9iYWJseQorCQkgKiBpbnRlcnJ1cHRlZCAoY3RybC1jKSB1cy4KKwkJICogTGVhdmUgbG9vcCB3aXRoIGVycm9yIHNldC4KKwkJICovCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBTdG9yZSB0aGUgZmxhZ3MgYmVmb3JlIHdlIGxldCBnbyBvZiBjaGFubmVsIGxvY2sKKwkJICovCisJCWlmIChzbGVlcF9vbl91bl9mbGFncykKKwkJCW9sZF9mbGFncyA9IGNoLT5jaF90dW4udW5fZmxhZ3MgfCBjaC0+Y2hfcHVuLnVuX2ZsYWdzOworCQllbHNlCisJCQlvbGRfZmxhZ3MgPSBjaC0+Y2hfZmxhZ3M7CisKKwkJLyoKKwkJICogTGV0IGdvIG9mIGNoYW5uZWwgbG9jayBiZWZvcmUgY2FsbGluZyBzY2hlZHVsZS4KKwkJICogT3VyIHBvbGxlciB3aWxsIGdldCBhbnkgRkVQIGV2ZW50cyBhbmQgd2FrZSB1cyB1cCB3aGVuIERDRAorCQkgKiBldmVudHVhbGx5IGdvZXMgYWN0aXZlLgorCQkgKi8KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisKKwkJLyoKKwkJICogV2FpdCBmb3Igc29tZXRoaW5nIGluIHRoZSBmbGFncyB0byBjaGFuZ2UKKwkJICogZnJvbSB0aGUgY3VycmVudCB2YWx1ZS4KKwkJICovCisJCWlmIChzbGVlcF9vbl91bl9mbGFncykgeworCQkJcmV0dmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHVuLT51bl9mbGFnc193YWl0LAorCQkJCShvbGRfZmxhZ3MgIT0gKGNoLT5jaF90dW4udW5fZmxhZ3MgfAorCQkJCQkgICAgICAgY2gtPmNoX3B1bi51bl9mbGFncykpKTsKKwkJfSBlbHNlIHsKKwkJCXJldHZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShjaC0+Y2hfZmxhZ3Nfd2FpdCwKKwkJCQkob2xkX2ZsYWdzICE9IGNoLT5jaF9mbGFncykpOworCQl9CisKKwkJLyoKKwkJICogV2UgZ290IHdva2VuIHVwIGZvciBzb21lIHJlYXNvbi4KKwkJICogQmVmb3JlIGxvb3BpbmcgYXJvdW5kLCBncmFiIG91ciBjaGFubmVsIGxvY2suCisJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCX0KKworCWNoLT5jaF93b3Blbi0tOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiAwOworfQorCisvKgorICogZGdhcF90dHlfaGFuZ3VwKCkKKyAqCisgKiBIYW5ndXAgdGhlIHBvcnQuICBMaWtlIGEgY2xvc2UsIGJ1dCBkb24ndCB3YWl0IGZvciBvdXRwdXQgdG8gZHJhaW4uCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfdHR5X2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBib2FyZF90CSpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdAkqdW47CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm47CisKKwkvKiBmbHVzaCB0aGUgdHJhbnNtaXQgcXVldWVzICovCisJZGdhcF90dHlfZmx1c2hfYnVmZmVyKHR0eSk7CisKK30KKworLyoKKyAqIGRnYXBfdHR5X2Nsb3NlKCkKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBrdGVybWlvcyAqdHM7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwl1bG9uZyBsb2NrX2ZsYWdzOworCWludCByYyA9IDA7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm47CisKKwl0cyA9ICZ0dHktPnRlcm1pb3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJLyoKKwkgKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBjbG9zZSBvciBub3QgLSBhbmQgaWYgd2UgYWdyZWUgYWJvdXQKKwkgKiB3aGljaCB0eXBlIG9mIGNsb3NlIGl0IGlzIHdpdGggdGhlIExpbmUgRGlzY2lwbGluZQorCSAqLworCWlmICgodHR5LT5jb3VudCA9PSAxKSAmJiAodW4tPnVuX29wZW5fY291bnQgIT0gMSkpIHsKKwkJLyoKKwkJICogVWgsIG9oLiAgdHR5LT5jb3VudCBpcyAxLCB3aGljaCBtZWFucyB0aGF0IHRoZSB0dHkKKwkJICogc3RydWN0dXJlIHdpbGwgYmUgZnJlZWQuICB1bl9vcGVuX2NvdW50IHNob3VsZCBhbHdheXMKKwkJICogYmUgb25lIGluIHRoZXNlIGNvbmRpdGlvbnMuICBJZiBpdCdzIGdyZWF0ZXIgdGhhbgorCQkgKiBvbmUsIHdlJ3ZlIGdvdCByZWFsIHByb2JsZW1zLCBzaW5jZSBpdCBtZWFucyB0aGUKKwkJICogc2VyaWFsIHBvcnQgd29uJ3QgYmUgc2h1dGRvd24uCisJCSAqLworCQl1bi0+dW5fb3Blbl9jb3VudCA9IDE7CisJfQorCisJaWYgKC0tdW4tPnVuX29wZW5fY291bnQgPCAwKQorCQl1bi0+dW5fb3Blbl9jb3VudCA9IDA7CisKKwljaC0+Y2hfb3Blbl9jb3VudC0tOworCisJaWYgKGNoLT5jaF9vcGVuX2NvdW50ICYmIHVuLT51bl9vcGVuX2NvdW50KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE9LLCBpdHMgdGhlIGxhc3QgY2xvc2Ugb24gdGhlIHVuaXQgKi8KKworCXVuLT51bl9mbGFncyB8PSBVTl9DTE9TSU5HOworCisJdHR5LT5jbG9zaW5nID0gMTsKKworCS8qCisJICogT25seSBvZmZpY2lhbGx5IGNsb3NlIGNoYW5uZWwgaWYgY291bnQgaXMgMCBhbmQKKwkgKiBESUdJX1BSSU5URVIgYml0IGlzIG5vdCBzZXQuCisJICovCisJaWYgKChjaC0+Y2hfb3Blbl9jb3VudCA9PSAwKSAmJgorCSAgICAhKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX1BSSU5URVIpKSB7CisKKwkJY2gtPmNoX2ZsYWdzICY9IH4oQ0hfUlhCTE9DSyk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJCS8qIHdhaXQgZm9yIG91dHB1dCB0byBkcmFpbiAqLworCQkvKiBUaGlzIHdpbGwgYWxzbyByZXR1cm4gaWYgd2UgdGFrZSBhbiBpbnRlcnJ1cHQgKi8KKworCQlyYyA9IGRnYXBfd2FpdF9mb3JfZHJhaW4odHR5KTsKKworCQlkZ2FwX3R0eV9mbHVzaF9idWZmZXIodHR5KTsKKwkJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQl0dHktPmNsb3NpbmcgPSAwOworCisJCS8qCisJCSAqIElmIHdlIGhhdmUgSFVQQ0wgc2V0LCBsb3dlciBEVFIgYW5kIFJUUworCQkgKi8KKwkJaWYgKGNoLT5jaF9jX2NmbGFnICYgSFVQQ0wpIHsKKwkJCWNoLT5jaF9tb3N0YXQgJj0gfihEX1JUUyhjaCl8RF9EVFIoY2gpKTsKKwkJCWRnYXBfY21kYihjaCwgU01PREVNLCAwLCBEX0RUUihjaCl8RF9SVFMoY2gpLCAwKTsKKworCQkJLyoKKwkJCSAqIEdvIHRvIHNsZWVwIHRvIGVuc3VyZSBSVFMvRFRSCisJCQkgKiBoYXZlIGJlZW4gZHJvcHBlZCBmb3IgbW9kZW1zIHRvIHNlZSBpdC4KKwkJCSAqLworCQkJaWYgKGNoLT5jaF9jbG9zZV9kZWxheSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLAorCQkJCQkJICAgICAgIGxvY2tfZmxhZ3MpOworCQkJCWRnYXBfbXNfc2xlZXAoY2gtPmNoX2Nsb3NlX2RlbGF5KTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCQkJfQorCQl9CisKKwkJY2gtPnBzY2FuX3N0YXRlID0gMDsKKwkJY2gtPnBzY2FuX3NhdmVjaGFyID0gMDsKKwkJY2gtPmNoX2JhdWRfaW5mbyA9IDA7CisKKwl9CisKKwkvKgorCSAqIHR1cm4gb2ZmIHByaW50IGRldmljZSB3aGVuIGNsb3NpbmcgcHJpbnQgZGV2aWNlLgorCSAqLworCWlmICgodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkgICYmIChjaC0+Y2hfZmxhZ3MgJiBDSF9QUk9OKSkgeworCQlkZ2FwX3dtb3ZlKGNoLCBjaC0+Y2hfZGlnaS5kaWdpX29mZnN0ciwKKwkJCShpbnQpIGNoLT5jaF9kaWdpLmRpZ2lfb2ZmbGVuKTsKKwkJY2gtPmNoX2ZsYWdzICY9IH5DSF9QUk9OOworCX0KKworCXVuLT51bl90dHkgPSBOVUxMOworCXVuLT51bl9mbGFncyAmPSB+KFVOX0lTT1BFTiB8IFVOX0NMT1NJTkcpOworCXR0eS0+ZHJpdmVyX2RhdGEgPSBOVUxMOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfZmxhZ3Nfd2FpdCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ1bi0+dW5fZmxhZ3Nfd2FpdCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Cit9CisKKy8qCisgKiBkZ2FwX3R0eV9jaGFyc19pbl9idWZmZXIoKQorICoKKyAqIFJldHVybiBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGhhdmUgbm90IGJlZW4gdHJhbnNtaXR0ZWQgeWV0LgorICoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIGJ5IHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlCisgKiBpcyBkYXRhIHdhaXRpbmcgdG8gYmUgdHJhbnNtaXR0ZWQvZHJhaW5lZC9mbHVzaGVkIG9yIG5vdC4KKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQgPSBOVUxMOworCXN0cnVjdCBjaGFubmVsX3QgKmNoID0gTlVMTDsKKwlzdHJ1Y3QgdW5fdCAqdW4gPSBOVUxMOworCXN0cnVjdCBic190ICpicyA9IE5VTEw7CisJdWNoYXIgdGJ1c3k7CisJdWludCBjaGFycyA9IDA7CisJdTE2IHRoZWFkLCB0dGFpbCwgdG1hc2ssIGNoZWFkLCBjdGFpbDsKKwl1bG9uZyAgIGxvY2tfZmxhZ3MgPSAwOworCXVsb25nICAgbG9ja19mbGFnczIgPSAwOworCisJaWYgKHR0eSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gMDsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiAwOworCisJYnMgPSBjaC0+Y2hfYnM7CisJaWYgKCFicykKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJdG1hc2sgPSAoY2gtPmNoX3RzaXplIC0gMSk7CisKKwkvKiBHZXQgVHJhbnNtaXQgcXVldWUgcG9pbnRlcnMgKi8KKwl0aGVhZCA9IHJlYWR3KCYoYnMtPnR4X2hlYWQpKSAmIHRtYXNrOworCXR0YWlsID0gcmVhZHcoJihicy0+dHhfdGFpbCkpICYgdG1hc2s7CisKKwkvKiBHZXQgdGJ1c3kgZmxhZyAqLworCXRidXN5ID0gcmVhZGIoJihicy0+dGJ1c3kpKTsKKworCS8qIEdldCBDb21tYW5kIHF1ZXVlIHBvaW50ZXJzICovCisJY2hlYWQgPSByZWFkdygmKGNoLT5jaF9jbS0+Y21faGVhZCkpOworCWN0YWlsID0gcmVhZHcoJihjaC0+Y2hfY20tPmNtX3RhaWwpKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJLyoKKwkgKiBUaGUgb25seSB3YXkgd2Uga25vdyBmb3Igc3VyZSBpZiB0aGVyZSBpcyBubyBwZW5kaW5nCisJICogZGF0YSBsZWZ0IHRvIGJlIHRyYW5zZmVycmVkLCBpcyBpZjoKKwkgKiAxKSBUcmFuc21pdCBoZWFkIGFuZCB0YWlsIGFyZSBlcXVhbCAoZW1wdHkpLgorCSAqIDIpIENvbW1hbmQgcXVldWUgaGVhZCBhbmQgdGFpbCBhcmUgZXF1YWwgKGVtcHR5KS4KKwkgKiAzKSBUaGUgIlRCVVNZIiBmbGFnIGlzIDAuIChUcmFuc21pdHRlciBub3QgYnVzeSkuCisJICovCisKKwlpZiAoKHR0YWlsID09IHRoZWFkKSAmJiAodGJ1c3kgPT0gMCkgJiYgKGNoZWFkID09IGN0YWlsKSkgeworCQljaGFycyA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHRoZWFkID49IHR0YWlsKQorCQkJY2hhcnMgPSB0aGVhZCAtIHR0YWlsOworCQllbHNlCisJCQljaGFycyA9IHRoZWFkIC0gdHRhaWwgKyBjaC0+Y2hfdHNpemU7CisJCS8qCisJCSAqIEZ1ZGdlIGZhY3RvciBoZXJlLgorCQkgKiBJZiBjaGFycyBpcyB6ZXJvLCB3ZSBrbm93IHRoYXQgdGhlIGNvbW1hbmQgcXVldWUgaGFkCisJCSAqIHNvbWV0aGluZyBpbiBpdCBvciB0YnVzeSB3YXMgc2V0LiAgQmVjYXVzZSB3ZSBjYW5ub3QKKwkJICogYmUgc3VyZSBpZiB0aGVyZSBpcyBzdGlsbCBzb21lIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQsCisJCSAqIGxldHMgbGllLCBhbmQgdGVsbCBsZCB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LgorCQkgKi8KKwkJaWYgKGNoYXJzID09IDApIHsKKwkJCS8qCisJCQkgKiBJZiBUQlVTWSBpcyBzdGlsbCBzZXQsIGFuZCBvdXIgdHggYnVmZmVycyBhcmUgZW1wdHksCisJCQkgKiBmb3JjZSB0aGUgZmlybXdhcmUgdG8gc2VuZCBtZSBhbm90aGVyIHdha2V1cCBhZnRlcgorCQkJICogVEJVU1kgaGFzIGJlZW4gY2xlYXJlZC4KKwkJCSAqLworCQkJaWYgKHRidXN5ICE9IDApIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCQkJCXVuLT51bl9mbGFncyB8PSBVTl9FTVBUWTsKKwkJCQl3cml0ZWIoMSwgJihicy0+aWVtcHR5KSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssCisJCQkJCQkgICAgICAgbG9ja19mbGFncyk7CisJCQl9CisJCQljaGFycyA9IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gY2hhcnM7Cit9CisKK3N0YXRpYyBpbnQgZGdhcF93YWl0X2Zvcl9kcmFpbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwlzdHJ1Y3QgYnNfdCAqYnM7CisJaW50IHJldCA9IC1FSU87CisJdWludCBjb3VudCA9IDE7CisJdWxvbmcgICBsb2NrX2ZsYWdzID0gMDsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm4gcmV0OworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIHJldDsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIHJldDsKKworCWJzID0gY2gtPmNoX2JzOworCWlmICghYnMpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSAwOworCisJLyogTG9vcCB1bnRpbCBkYXRhIGlzIGRyYWluZWQgKi8KKwl3aGlsZSAoY291bnQgIT0gMCkgeworCisJCWNvdW50ID0gZGdhcF90dHlfY2hhcnNfaW5fYnVmZmVyKHR0eSk7CisKKwkJaWYgKGNvdW50ID09IDApCisJCQlicmVhazsKKworCQkvKiBTZXQgZmxhZyB3YWl0aW5nIGZvciBkcmFpbiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCQl1bi0+dW5fZmxhZ3MgfD0gVU5fRU1QVFk7CisJCXdyaXRlYigxLCAmKGJzLT5pZW1wdHkpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJCS8qIEdvIHRvIHNsZWVwIHRpbGwgd2UgZ2V0IHdva2VuIHVwICovCisJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh1bi0+dW5fZmxhZ3Nfd2FpdCwKKwkJCQkJKCh1bi0+dW5fZmxhZ3MgJiBVTl9FTVBUWSkgPT0gMCkpOworCQkvKiBJZiByZXQgaXMgbm9uLXplcm8sIHVzZXIgY3RybC1jJ2VkIHVzICovCisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCXVuLT51bl9mbGFncyAmPSB+KFVOX0VNUFRZKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZGdhcF9tYXhjcHNfcm9vbQorICoKKyAqIFJlZHVjZXMgYnl0ZXNfYXZhaWxhYmxlIHRvIHRoZSBtYXggbnVtYmVyIG9mIGNoYXJhY3RlcnMKKyAqIHRoYXQgY2FuIGJlIHNlbnQgY3VycmVudGx5IGdpdmVuIHRoZSBtYXhjcHMgdmFsdWUsIGFuZAorICogcmV0dXJucyB0aGUgbmV3IGJ5dGVzX2F2YWlsYWJsZS4gIFRoaXMgb25seSBhZmZlY3RzIHByaW50ZXIKKyAqIG91dHB1dC4KKyAqLworc3RhdGljIGludCBkZ2FwX21heGNwc19yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBieXRlc19hdmFpbGFibGUpCit7CisJc3RydWN0IGNoYW5uZWxfdCAqY2ggPSBOVUxMOworCXN0cnVjdCB1bl90ICp1biA9IE5VTEw7CisKKwlpZiAodHR5ID09IE5VTEwpCisJCXJldHVybiBieXRlc19hdmFpbGFibGU7CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gYnl0ZXNfYXZhaWxhYmxlOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gYnl0ZXNfYXZhaWxhYmxlOworCisJLyoKKwkgKiBJZiBpdHMgbm90IHRoZSBUcmFuc3BhcmVudCBwcmludCBkZXZpY2UsIHJldHVybgorCSAqIHRoZSBmdWxsIGRhdGEgYW1vdW50LgorCSAqLworCWlmICh1bi0+dW5fdHlwZSAhPSBER0FQX1BSSU5UKQorCQlyZXR1cm4gYnl0ZXNfYXZhaWxhYmxlOworCisJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzID4gMCAmJiBjaC0+Y2hfZGlnaS5kaWdpX2J1ZnNpemUgPiAwKSB7CisJCWludCBjcHNfbGltaXQgPSAwOworCQl1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGltZSA9IGppZmZpZXM7CisJCXVuc2lnbmVkIGxvbmcgYnVmZmVyX3RpbWUgPSBjdXJyZW50X3RpbWUgKworCQkJKEhaICogY2gtPmNoX2RpZ2kuZGlnaV9idWZzaXplKSAvCisJCQljaC0+Y2hfZGlnaS5kaWdpX21heGNwczsKKworCQlpZiAoY2gtPmNoX2Nwc3RpbWUgPCBjdXJyZW50X3RpbWUpIHsKKwkJCS8qIGJ1ZmZlciBpcyBlbXB0eSAqLworCQkJY2gtPmNoX2Nwc3RpbWUgPSBjdXJyZW50X3RpbWU7ICAgLyogcmVzZXQgY2hfY3BzdGltZSAqLworCQkJY3BzX2xpbWl0ID0gY2gtPmNoX2RpZ2kuZGlnaV9idWZzaXplOworCQl9IGVsc2UgaWYgKGNoLT5jaF9jcHN0aW1lIDwgYnVmZmVyX3RpbWUpIHsKKwkJCS8qIHN0aWxsIHJvb20gaW4gdGhlIGJ1ZmZlciAqLworCQkJY3BzX2xpbWl0ID0gKChidWZmZXJfdGltZSAtIGNoLT5jaF9jcHN0aW1lKSAqCisJCQkJICAgICBjaC0+Y2hfZGlnaS5kaWdpX21heGNwcykgLyBIWjsKKwkJfSBlbHNlIHsKKwkJCS8qIG5vIHJvb20gaW4gdGhlIGJ1ZmZlciAqLworCQkJY3BzX2xpbWl0ID0gMDsKKwkJfQorCisJCWJ5dGVzX2F2YWlsYWJsZSA9IG1pbihjcHNfbGltaXQsIGJ5dGVzX2F2YWlsYWJsZSk7CisJfQorCisJcmV0dXJuIGJ5dGVzX2F2YWlsYWJsZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRnYXBfc2V0X2Zpcm13YXJlX2V2ZW50KHN0cnVjdCB1bl90ICp1biwgdW5zaWduZWQgaW50IGV2ZW50KQoreworCXN0cnVjdCBjaGFubmVsX3QgKmNoID0gTlVMTDsKKwlzdHJ1Y3QgYnNfdCAqYnMgPSBOVUxMOworCisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm47CisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisJYnMgPSBjaC0+Y2hfYnM7CisJaWYgKCFicykKKwkJcmV0dXJuOworCisJaWYgKChldmVudCAmIFVOX0xPVykgIT0gMCkgeworCQlpZiAoKHVuLT51bl9mbGFncyAmIFVOX0xPVykgPT0gMCkgeworCQkJdW4tPnVuX2ZsYWdzIHw9IFVOX0xPVzsKKwkJCXdyaXRlYigxLCAmKGJzLT5pbG93KSk7CisJCX0KKwl9CisJaWYgKChldmVudCAmIFVOX0xPVykgIT0gMCkgeworCQlpZiAoKHVuLT51bl9mbGFncyAmIFVOX0VNUFRZKSA9PSAwKSB7CisJCQl1bi0+dW5fZmxhZ3MgfD0gVU5fRU1QVFk7CisJCQl3cml0ZWIoMSwgJihicy0+aWVtcHR5KSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBkZ2FwX3R0eV93cml0ZV9yb29tKCkKKyAqCisgKiBSZXR1cm4gc3BhY2UgYXZhaWxhYmxlIGluIFR4IGJ1ZmZlcgorICovCitzdGF0aWMgaW50IGRnYXBfdHR5X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaCA9IE5VTEw7CisJc3RydWN0IHVuX3QgKnVuID0gTlVMTDsKKwlzdHJ1Y3QgYnNfdCAqYnMgPSBOVUxMOworCXUxNiBoZWFkLCB0YWlsLCB0bWFzazsKKwlpbnQgcmV0ID0gMDsKKwl1bG9uZyAgIGxvY2tfZmxhZ3MgPSAwOworCisJaWYgKCF0dHkpCisJCXJldHVybiAwOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIDA7CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAwOworCisJYnMgPSBjaC0+Y2hfYnM7CisJaWYgKCFicykKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJdG1hc2sgPSBjaC0+Y2hfdHNpemUgLSAxOworCWhlYWQgPSByZWFkdygmKGJzLT50eF9oZWFkKSkgJiB0bWFzazsKKwl0YWlsID0gcmVhZHcoJihicy0+dHhfdGFpbCkpICYgdG1hc2s7CisKKwlyZXQgPSB0YWlsIC0gaGVhZCAtIDE7CisJaWYgKHJldCA8IDApCisJCXJldCArPSBjaC0+Y2hfdHNpemU7CisKKwkvKiBMaW1pdCBwcmludGVyIHRvIG1heGNwcyAqLworCXJldCA9IGRnYXBfbWF4Y3BzX3Jvb20odHR5LCByZXQpOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgcHJpbnRlciBkZXZpY2UsIGxlYXZlIHNwYWNlIGZvcgorCSAqIHBvc3NpYmx5IGJvdGggdGhlIG9uIGFuZCBvZmYgc3RyaW5ncy4KKwkgKi8KKwlpZiAodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkgeworCQlpZiAoIShjaC0+Y2hfZmxhZ3MgJiBDSF9QUk9OKSkKKwkJCXJldCAtPSBjaC0+Y2hfZGlnaS5kaWdpX29ubGVuOworCQlyZXQgLT0gY2gtPmNoX2RpZ2kuZGlnaV9vZmZsZW47CisJfSBlbHNlIHsKKwkJaWYgKGNoLT5jaF9mbGFncyAmIENIX1BST04pCisJCQlyZXQgLT0gY2gtPmNoX2RpZ2kuZGlnaV9vZmZsZW47CisJfQorCisJaWYgKHJldCA8IDApCisJCXJldCA9IDA7CisKKwkvKgorCSAqIFNjaGVkdWxlIEZFUCB0byB3YWtlIHVzIHVwIGlmIG5lZWRlZC4KKwkgKgorCSAqIFRPRE86ICBUaGlzIG1pZ2h0IGJlIG92ZXJraWxsLi4uCisJICogRG8gd2UgcmVhbGx5IG5lZWQgdG8gc2NoZWR1bGUgY2FsbGJhY2tzIGZyb20gdGhlIEZFUAorCSAqIGluIGV2ZXJ5IGNhc2U/ICBDYW4gd2UgZ2V0IHNtYXJ0ZXIgYmFzZWQgb24gcmV0PworCSAqLworCWRnYXBfc2V0X2Zpcm13YXJlX2V2ZW50KHVuLCBVTl9MT1cgfCBVTl9FTVBUWSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGRnYXBfdHR5X3B1dF9jaGFyKCkKKyAqCisgKiBQdXQgYSBjaGFyYWN0ZXIgaW50byBjaC0+Y2hfYnVmCisgKgorICogICAgICAtIHVzZWQgYnkgdGhlIGxpbmUgZGlzY2lwbGluZSBmb3IgT1BPU1QgcHJvY2Vzc2luZworICovCitzdGF0aWMgaW50IGRnYXBfdHR5X3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgYykKK3sKKwkvKgorCSAqIFNpbXBseSBjYWxsIHR0eV93cml0ZS4KKwkgKi8KKwlkZ2FwX3R0eV93cml0ZSh0dHksICZjLCAxKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIGRnYXBfdHR5X3dyaXRlKCkKKyAqCisgKiBUYWtlIGRhdGEgZnJvbSB0aGUgdXNlciBvciBrZXJuZWwgYW5kIHNlbmQgaXQgb3V0IHRvIHRoZSBGRVAuCisgKiBJbiBoZXJlIGV4aXN0cyBhbGwgdGhlIFRyYW5zcGFyZW50IFByaW50IG1hZ2ljIGFzIHdlbGwuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJCWludCBjb3VudCkKK3sKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaCA9IE5VTEw7CisJc3RydWN0IHVuX3QgKnVuID0gTlVMTDsKKwlzdHJ1Y3QgYnNfdCAqYnMgPSBOVUxMOworCWNoYXIgKnZhZGRyID0gTlVMTDsKKwl1MTYgaGVhZCwgdGFpbCwgdG1hc2ssIHJlbWFpbjsKKwlpbnQgYnVmY291bnQgPSAwLCBuID0gMDsKKwlpbnQgb3JpZ19jb3VudCA9IDA7CisJdWxvbmcgbG9ja19mbGFnczsKKworCWlmICghdHR5KQorCQlyZXR1cm4gMDsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gMDsKKworCWJzID0gY2gtPmNoX2JzOworCWlmICghYnMpCisJCXJldHVybiAwOworCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFN0b3JlIG9yaWdpbmFsIGFtb3VudCBvZiBjaGFyYWN0ZXJzIHBhc3NlZCBpbi4KKwkgKiBUaGlzIGhlbHBzIHRvIGZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIGFzayB0aGUgRkVQCisJICogdG8gc2VuZCB1cyBhbiBldmVudCB3aGVuIGl0IGhhcyBtb3JlIHNwYWNlIGF2YWlsYWJsZS4KKwkgKi8KKwlvcmlnX2NvdW50ID0gY291bnQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJLyogR2V0IG91ciBzcGFjZSBhdmFpbGFibGUgZm9yIHRoZSBjaGFubmVsIGZyb20gdGhlIGJvYXJkICovCisJdG1hc2sgPSBjaC0+Y2hfdHNpemUgLSAxOworCWhlYWQgPSByZWFkdygmKGJzLT50eF9oZWFkKSkgJiB0bWFzazsKKwl0YWlsID0gcmVhZHcoJihicy0+dHhfdGFpbCkpICYgdG1hc2s7CisKKwlidWZjb3VudCA9IHRhaWwgLSBoZWFkIC0gMTsKKwlpZiAoYnVmY291bnQgPCAwKQorCQlidWZjb3VudCArPSBjaC0+Y2hfdHNpemU7CisKKwkvKgorCSAqIExpbWl0IHByaW50ZXIgb3V0cHV0IHRvIG1heGNwcyBvdmVyYWxsLCB3aXRoIGJ1cnN0cyBhbGxvd2VkCisJICogdXAgdG8gYnVmc2l6ZSBjaGFyYWN0ZXJzLgorCSAqLworCWJ1ZmNvdW50ID0gZGdhcF9tYXhjcHNfcm9vbSh0dHksIGJ1ZmNvdW50KTsKKworCS8qCisJICogVGFrZSBtaW5pbXVtIG9mIHdoYXQgdGhlIHVzZXIgd2FudHMgdG8gc2VuZCwgYW5kIHRoZQorCSAqIHNwYWNlIGF2YWlsYWJsZSBpbiB0aGUgRkVQIGJ1ZmZlci4KKwkgKi8KKwljb3VudCA9IG1pbihjb3VudCwgYnVmY291bnQpOworCisJLyoKKwkgKiBCYWlsIGlmIG5vIHNwYWNlIGxlZnQuCisJICovCisJaWYgKGNvdW50IDw9IDApIHsKKwkJZGdhcF9zZXRfZmlybXdhcmVfZXZlbnQodW4sIFVOX0xPVyB8IFVOX0VNUFRZKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIE91dHB1dCB0aGUgcHJpbnRlciBPTiBzdHJpbmcsIGlmIHdlIGFyZSBpbiB0ZXJtaW5hbCBtb2RlLCBidXQKKwkgKiBuZWVkIHRvIGJlIGluIHByaW50ZXIgbW9kZS4KKwkgKi8KKwlpZiAoKHVuLT51bl90eXBlID09IERHQVBfUFJJTlQpICYmICEoY2gtPmNoX2ZsYWdzICYgQ0hfUFJPTikpIHsKKwkJZGdhcF93bW92ZShjaCwgY2gtPmNoX2RpZ2kuZGlnaV9vbnN0ciwKKwkJICAgIChpbnQpIGNoLT5jaF9kaWdpLmRpZ2lfb25sZW4pOworCQloZWFkID0gcmVhZHcoJihicy0+dHhfaGVhZCkpICYgdG1hc2s7CisJCWNoLT5jaF9mbGFncyB8PSBDSF9QUk9OOworCX0KKworCS8qCisJICogT24gdGhlIG90aGVyIGhhbmQsIG91dHB1dCB0aGUgcHJpbnRlciBPRkYgc3RyaW5nLCBpZiB3ZSBhcmUKKwkgKiBjdXJyZW50bHkgaW4gcHJpbnRlciBtb2RlLCBidXQgbmVlZCB0byBvdXRwdXQgdG8gdGhlIHRlcm1pbmFsLgorCSAqLworCWlmICgodW4tPnVuX3R5cGUgIT0gREdBUF9QUklOVCkgJiYgKGNoLT5jaF9mbGFncyAmIENIX1BST04pKSB7CisJCWRnYXBfd21vdmUoY2gsIGNoLT5jaF9kaWdpLmRpZ2lfb2Zmc3RyLAorCQkJKGludCkgY2gtPmNoX2RpZ2kuZGlnaV9vZmZsZW4pOworCQloZWFkID0gcmVhZHcoJihicy0+dHhfaGVhZCkpICYgdG1hc2s7CisJCWNoLT5jaF9mbGFncyAmPSB+Q0hfUFJPTjsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBjb3B5LCBvcgorCSAqIEkgY2FuJ3QgaGFuZGxlIGFueSBtb3JlIGRhdGEsIGxlYXZlLgorCSAqLworCWlmIChjb3VudCA8PSAwKSB7CisJCWRnYXBfc2V0X2Zpcm13YXJlX2V2ZW50KHVuLCBVTl9MT1cgfCBVTl9FTVBUWSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbiA9IGNvdW50OworCisJLyoKKwkgKiBJZiB0aGUgd3JpdGUgd3JhcHMgb3ZlciB0aGUgdG9wIG9mIHRoZSBjaXJjdWxhciBidWZmZXIsCisJICogbW92ZSB0aGUgcG9ydGlvbiB1cCB0byB0aGUgd3JhcCBwb2ludCwgYW5kIHJlc2V0IHRoZQorCSAqIHBvaW50ZXJzIHRvIHRoZSBib3R0b20uCisJICovCisJcmVtYWluID0gY2gtPmNoX3RzdGFydCArIGNoLT5jaF90c2l6ZSAtIGhlYWQ7CisKKwlpZiAobiA+PSByZW1haW4pIHsKKwkJbiAtPSByZW1haW47CisJCXZhZGRyID0gY2gtPmNoX3RhZGRyICsgaGVhZDsKKworCQltZW1jcHlfdG9pbyh2YWRkciwgKHVjaGFyICopIGJ1ZiwgcmVtYWluKTsKKwkJZGdhcF9zbmlmZl9ub3dhaXRfbm9sb2NrKGNoLCAiVVNFUiBXUklURSIsICh1Y2hhciAqKSBidWYsCisJCQkJCXJlbWFpbik7CisKKwkJaGVhZCA9IGNoLT5jaF90c3RhcnQ7CisJCWJ1ZiArPSByZW1haW47CisJfQorCisJaWYgKG4gPiAwKSB7CisKKwkJLyoKKwkJICogTW92ZSByZXN0IG9mIGRhdGEuCisJCSAqLworCQl2YWRkciA9IGNoLT5jaF90YWRkciArIGhlYWQ7CisJCXJlbWFpbiA9IG47CisKKwkJbWVtY3B5X3RvaW8odmFkZHIsICh1Y2hhciAqKSBidWYsIHJlbWFpbik7CisJCWRnYXBfc25pZmZfbm93YWl0X25vbG9jayhjaCwgIlVTRVIgV1JJVEUiLCAodWNoYXIgKilidWYsCisJCQkJCXJlbWFpbik7CisKKwkJaGVhZCArPSByZW1haW47CisKKwl9CisKKwlpZiAoY291bnQpIHsKKwkJY2gtPmNoX3R4Y291bnQgKz0gY291bnQ7CisJCWhlYWQgJj0gdG1hc2s7CisJCXdyaXRldyhoZWFkLCAmKGJzLT50eF9oZWFkKSk7CisJfQorCisJZGdhcF9zZXRfZmlybXdhcmVfZXZlbnQodW4sIFVOX0xPVyB8IFVOX0VNUFRZKTsKKworCS8qCisJICogSWYgdGhpcyBpcyB0aGUgcHJpbnQgZGV2aWNlLCBhbmQgdGhlCisJICogcHJpbnRlciBpcyBzdGlsbCBvbiwgd2UgbmVlZCB0byB0dXJuIGl0CisJICogb2ZmIGJlZm9yZSBnb2luZyBpZGxlLiAgSWYgdGhlIGJ1ZmZlciBpcworCSAqIG5vbi1lbXB0eSwgd2FpdCB1bnRpbCBpdCBnb2VzIGVtcHR5LgorCSAqIE90aGVyd2lzZSB0dXJuIGl0IG9mZiByaWdodCBub3cuCisJICovCisJaWYgKCh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSAmJiAoY2gtPmNoX2ZsYWdzICYgQ0hfUFJPTikpIHsKKwkJdGFpbCA9IHJlYWR3KCYoYnMtPnR4X3RhaWwpKSAmIHRtYXNrOworCisJCWlmICh0YWlsICE9IGhlYWQpIHsKKwkJCXVuLT51bl9mbGFncyB8PSBVTl9FTVBUWTsKKwkJCXdyaXRlYigxLCAmKGJzLT5pZW1wdHkpKTsKKwkJfSBlbHNlIHsKKwkJCWRnYXBfd21vdmUoY2gsIGNoLT5jaF9kaWdpLmRpZ2lfb2Zmc3RyLAorCQkJCShpbnQpIGNoLT5jaF9kaWdpLmRpZ2lfb2ZmbGVuKTsKKwkJCWhlYWQgPSByZWFkdygmKGJzLT50eF9oZWFkKSkgJiB0bWFzazsKKwkJCWNoLT5jaF9mbGFncyAmPSB+Q0hfUFJPTjsKKwkJfQorCX0KKworCS8qIFVwZGF0ZSBwcmludGVyIGJ1ZmZlciBlbXB0eSB0aW1lLiAqLworCWlmICgodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkgJiYgKGNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzID4gMCkKKwkgICAgJiYgKGNoLT5jaF9kaWdpLmRpZ2lfYnVmc2l6ZSA+IDApKSB7CisJCWNoLT5jaF9jcHN0aW1lICs9IChIWiAqIGNvdW50KSAvIGNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCXJldHVybiBjb3VudDsKK30KKworLyoKKyAqIFJldHVybiBtb2RlbSBzaWduYWxzIHRvIGxkLgorICovCitzdGF0aWMgaW50IGRnYXBfdHR5X3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCWludCByZXN1bHQgPSAtRUlPOworCXVjaGFyIG1zdGF0ID0gMDsKKwl1bG9uZyBsb2NrX2ZsYWdzOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiByZXN1bHQ7CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gcmVzdWx0OworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gcmVzdWx0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCW1zdGF0ID0gcmVhZGIoJihjaC0+Y2hfYnMtPm1fc3RhdCkpOworCS8qIEFwcGVuZCBhbnkgb3V0Ym91bmQgc2lnbmFscyB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuLi4gKi8KKwltc3RhdCB8PSBjaC0+Y2hfbW9zdGF0OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJcmVzdWx0ID0gMDsKKworCWlmIChtc3RhdCAmIERfRFRSKGNoKSkKKwkJcmVzdWx0IHw9IFRJT0NNX0RUUjsKKwlpZiAobXN0YXQgJiBEX1JUUyhjaCkpCisJCXJlc3VsdCB8PSBUSU9DTV9SVFM7CisJaWYgKG1zdGF0ICYgRF9DVFMoY2gpKQorCQlyZXN1bHQgfD0gVElPQ01fQ1RTOworCWlmIChtc3RhdCAmIERfRFNSKGNoKSkKKwkJcmVzdWx0IHw9IFRJT0NNX0RTUjsKKwlpZiAobXN0YXQgJiBEX1JJKGNoKSkKKwkJcmVzdWx0IHw9IFRJT0NNX1JJOworCWlmIChtc3RhdCAmIERfQ0QoY2gpKQorCQlyZXN1bHQgfD0gVElPQ01fQ0Q7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogZGdhcF90dHlfdGlvY21zZXQoKQorICoKKyAqIFNldCBtb2RlbSBzaWduYWxzLCBjYWxsZWQgYnkgbGQuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJaW50IHJldCA9IC1FSU87CisJdWxvbmcgbG9ja19mbGFnczsKKwl1bG9uZyBsb2NrX2ZsYWdzMjsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm4gcmV0OworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIHJldDsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIHJldDsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJaWYgKHNldCAmIFRJT0NNX1JUUykgeworCQljaC0+Y2hfbWZvcmNlIHw9IERfUlRTKGNoKTsKKwkJY2gtPmNoX212YWwgICB8PSBEX1JUUyhjaCk7CisJfQorCisJaWYgKHNldCAmIFRJT0NNX0RUUikgeworCQljaC0+Y2hfbWZvcmNlIHw9IERfRFRSKGNoKTsKKwkJY2gtPmNoX212YWwgICB8PSBEX0RUUihjaCk7CisJfQorCisJaWYgKGNsZWFyICYgVElPQ01fUlRTKSB7CisJCWNoLT5jaF9tZm9yY2UgfD0gRF9SVFMoY2gpOworCQljaC0+Y2hfbXZhbCAgICY9IH4oRF9SVFMoY2gpKTsKKwl9CisKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpIHsKKwkJY2gtPmNoX21mb3JjZSB8PSBEX0RUUihjaCk7CisJCWNoLT5jaF9tdmFsICAgJj0gfihEX0RUUihjaCkpOworCX0KKworCWRnYXBfcGFyYW0odHR5KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkZ2FwX3R0eV9zZW5kX2JyZWFrKCkKKyAqCisgKiBTZW5kIGEgQnJlYWssIGNhbGxlZCBieSBsZC4KKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9zZW5kX2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBtc2VjKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJaW50IHJldCA9IC1FSU87CisJdWxvbmcgbG9ja19mbGFnczsKKwl1bG9uZyBsb2NrX2ZsYWdzMjsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm4gcmV0OworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIHJldDsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIHJldDsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKG1zZWMpIHsKKwljYXNlIC0xOgorCQltc2VjID0gMHhGRkZGOworCQlicmVhazsKKwljYXNlIDA6CisJCW1zZWMgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltc2VjIC89IDEwOworCQlicmVhazsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworI2lmIDAKKwlkZ2FwX2NtZHcoY2gsIFNCUkVBSywgKHUxNikgU0JSRUFLX1RJTUUsIDApOworI2VuZGlmCisJZGdhcF9jbWR3KGNoLCBTQlJFQUssICh1MTYpIG1zZWMsIDApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRnYXBfdHR5X3dhaXRfdW50aWxfc2VudCgpCisgKgorICogd2FpdCB1bnRpbCBkYXRhIGhhcyBiZWVuIHRyYW5zbWl0dGVkLCBjYWxsZWQgYnkgbGQuCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCkKK3sKKwlkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7Cit9CisKKy8qCisgKiBkZ2FwX3NlbmRfeGNoYXIoKQorICoKKyAqIHNlbmQgYSBoaWdoIHByaW9yaXR5IGNoYXJhY3RlciwgY2FsbGVkIGJ5IGxkLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX3R0eV9zZW5kX3hjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgYykKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCXVsb25nIGxvY2tfZmxhZ3M7CisJdWxvbmcgbG9ja19mbGFnczI7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJLyoKKwkgKiBUaGlzIGlzIHRlY2huaWNhbGx5IHdoYXQgd2Ugc2hvdWxkIGRvLgorCSAqIEhvd2V2ZXIsIHRoZSBOSVNUIHRlc3RzIHNwZWNpZmljYWxseSB3YW50CisJICogdG8gc2VlIGVhY2ggWE9OIG9yIFhPRkYgY2hhcmFjdGVyIHRoYXQgaXQKKwkgKiBzZW5kcywgc28gbGV0cyBqdXN0IHNlbmQgZWFjaCBjaGFyYWN0ZXIKKwkgKiBieSBoYW5kLi4uCisJICovCisjaWYgMAorCWlmIChjID09IFNUT1BfQ0hBUih0dHkpKQorCQlkZ2FwX2NtZHcoY2gsIFJQQVVTRSwgMCwgMCk7CisJZWxzZSBpZiAoYyA9PSBTVEFSVF9DSEFSKHR0eSkpCisJCWRnYXBfY21kdyhjaCwgUlJFU1VNRSwgMCwgMCk7CisJZWxzZQorCQlkZ2FwX3dtb3ZlKGNoLCAmYywgMSk7CisjZWxzZQorCWRnYXBfd21vdmUoY2gsICZjLCAxKTsKKyNlbmRpZgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBSZXR1cm4gbW9kZW0gc2lnbmFscyB0byBsZC4KKyAqLworc3RhdGljIGludCBkZ2FwX2dldF9tb2RlbV9pbmZvKHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl1Y2hhciBtc3RhdCA9IDA7CisJdWxvbmcgbG9ja19mbGFnczsKKwlpbnQgcmMgPSAwOworCisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gLUVOWElPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCW1zdGF0ID0gcmVhZGIoJihjaC0+Y2hfYnMtPm1fc3RhdCkpOworCS8qIEFwcGVuZCBhbnkgb3V0Ym91bmQgc2lnbmFscyB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuLi4gKi8KKwltc3RhdCB8PSBjaC0+Y2hfbW9zdGF0OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJcmVzdWx0ID0gMDsKKworCWlmIChtc3RhdCAmIERfRFRSKGNoKSkKKwkJcmVzdWx0IHw9IFRJT0NNX0RUUjsKKwlpZiAobXN0YXQgJiBEX1JUUyhjaCkpCisJCXJlc3VsdCB8PSBUSU9DTV9SVFM7CisJaWYgKG1zdGF0ICYgRF9DVFMoY2gpKQorCQlyZXN1bHQgfD0gVElPQ01fQ1RTOworCWlmIChtc3RhdCAmIERfRFNSKGNoKSkKKwkJcmVzdWx0IHw9IFRJT0NNX0RTUjsKKwlpZiAobXN0YXQgJiBEX1JJKGNoKSkKKwkJcmVzdWx0IHw9IFRJT0NNX1JJOworCWlmIChtc3RhdCAmIERfQ0QoY2gpKQorCQlyZXN1bHQgfD0gVElPQ01fQ0Q7CisKKwlyYyA9IHB1dF91c2VyKHJlc3VsdCwgdmFsdWUpOworCisJcmV0dXJuIHJjOworfQorCisvKgorICogZGdhcF9zZXRfbW9kZW1faW5mbygpCisgKgorICogU2V0IG1vZGVtIHNpZ25hbHMsIGNhbGxlZCBieSBsZC4KKyAqLworc3RhdGljIGludCBkZ2FwX3NldF9tb2RlbV9pbmZvKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBjb21tYW5kLAorCQkJCXVuc2lnbmVkIGludCBfX3VzZXIgKnZhbHVlKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJaW50IHJldCA9IC1FTlhJTzsKKwl1bnNpZ25lZCBpbnQgYXJnID0gMDsKKwl1bG9uZyBsb2NrX2ZsYWdzOworCXVsb25nIGxvY2tfZmxhZ3MyOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiByZXQ7CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gcmV0OworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gcmV0OworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdldF91c2VyKGFyZywgdmFsdWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIFRJT0NNQklTOgorCQlpZiAoYXJnICYgVElPQ01fUlRTKSB7CisJCQljaC0+Y2hfbWZvcmNlIHw9IERfUlRTKGNoKTsKKwkJCWNoLT5jaF9tdmFsICAgfD0gRF9SVFMoY2gpOworCQl9CisKKwkJaWYgKGFyZyAmIFRJT0NNX0RUUikgeworCQkJY2gtPmNoX21mb3JjZSB8PSBEX0RUUihjaCk7CisJCQljaC0+Y2hfbXZhbCAgIHw9IERfRFRSKGNoKTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBUSU9DTUJJQzoKKwkJaWYgKGFyZyAmIFRJT0NNX1JUUykgeworCQkJY2gtPmNoX21mb3JjZSB8PSBEX1JUUyhjaCk7CisJCQljaC0+Y2hfbXZhbCAgICY9IH4oRF9SVFMoY2gpKTsKKwkJfQorCisJCWlmIChhcmcgJiBUSU9DTV9EVFIpIHsKKwkJCWNoLT5jaF9tZm9yY2UgfD0gRF9EVFIoY2gpOworCQkJY2gtPmNoX212YWwgICAmPSB+KERfRFRSKGNoKSk7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgVElPQ01TRVQ6CisJCWNoLT5jaF9tZm9yY2UgPSBEX0RUUihjaCl8RF9SVFMoY2gpOworCisJCWlmIChhcmcgJiBUSU9DTV9SVFMpCisJCQljaC0+Y2hfbXZhbCB8PSBEX1JUUyhjaCk7CisJCWVsc2UKKwkJCWNoLT5jaF9tdmFsICY9IH4oRF9SVFMoY2gpKTsKKworCQlpZiAoYXJnICYgVElPQ01fRFRSKQorCQkJY2gtPmNoX212YWwgfD0gKERfRFRSKGNoKSk7CisJCWVsc2UKKwkJCWNoLT5jaF9tdmFsICY9IH4oRF9EVFIoY2gpKTsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwlkZ2FwX3BhcmFtKHR0eSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKgorICogZGdhcF90dHlfZGlnaWdldGEoKQorICoKKyAqIElvY3RsIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gZm9yIGRpdHR5LgorICoKKyAqCisgKgorICovCitzdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lnZXRhKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkJc3RydWN0IGRpZ2lfdCBfX3VzZXIgKnJldGluZm8pCit7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCXN0cnVjdCBkaWdpX3QgdG1wOworCXVsb25nIGxvY2tfZmxhZ3M7CisKKwlpZiAoIXJldGluZm8pCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisJbWVtY3B5KCZ0bXAsICZjaC0+Y2hfZGlnaSwgc2l6ZW9mKHRtcCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWlmIChjb3B5X3RvX3VzZXIocmV0aW5mbywgJnRtcCwgc2l6ZW9mKCpyZXRpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkZ2FwX3R0eV9kaWdpc2V0YSgpCisgKgorICogSW9jdGwgdG8gc2V0IHRoZSBpbmZvcm1hdGlvbiBmb3IgZGl0dHkuCisgKgorICoKKyAqCisgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfZGlnaXNldGEoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQlzdHJ1Y3QgZGlnaV90IF9fdXNlciAqbmV3X2luZm8pCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwlzdHJ1Y3QgZGlnaV90IG5ld19kaWdpOworCXVsb25nICAgbG9ja19mbGFncyA9IDA7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzMjsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfZGlnaSwgbmV3X2luZm8sIHNpemVvZihzdHJ1Y3QgZGlnaV90KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCW1lbWNweSgmY2gtPmNoX2RpZ2ksICZuZXdfZGlnaSwgc2l6ZW9mKHN0cnVjdCBkaWdpX3QpKTsKKworCWlmIChjaC0+Y2hfZGlnaS5kaWdpX21heGNwcyA8IDEpCisJCWNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzID0gMTsKKworCWlmIChjaC0+Y2hfZGlnaS5kaWdpX21heGNwcyA+IDEwMDAwKQorCQljaC0+Y2hfZGlnaS5kaWdpX21heGNwcyA9IDEwMDAwOworCisJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfYnVmc2l6ZSA8IDEwKQorCQljaC0+Y2hfZGlnaS5kaWdpX2J1ZnNpemUgPSAxMDsKKworCWlmIChjaC0+Y2hfZGlnaS5kaWdpX21heGNoYXIgPCAxKQorCQljaC0+Y2hfZGlnaS5kaWdpX21heGNoYXIgPSAxOworCisJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfbWF4Y2hhciA+IGNoLT5jaF9kaWdpLmRpZ2lfYnVmc2l6ZSkKKwkJY2gtPmNoX2RpZ2kuZGlnaV9tYXhjaGFyID0gY2gtPmNoX2RpZ2kuZGlnaV9idWZzaXplOworCisJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfb25sZW4gPiBESUdJX1BMRU4pCisJCWNoLT5jaF9kaWdpLmRpZ2lfb25sZW4gPSBESUdJX1BMRU47CisKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9vZmZsZW4gPiBESUdJX1BMRU4pCisJCWNoLT5jaF9kaWdpLmRpZ2lfb2ZmbGVuID0gRElHSV9QTEVOOworCisJZGdhcF9wYXJhbSh0dHkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRnYXBfdHR5X2RpZ2lnZXRlZGVsYXkoKQorICoKKyAqIElvY3RsIHRvIGdldCB0aGUgY3VycmVudCBlZGVsYXkgc2V0dGluZy4KKyAqCisgKgorICoKKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpZ2V0ZWRlbGF5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBfX3VzZXIgKnJldGluZm8pCit7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCWludCB0bXA7CisJdWxvbmcgbG9ja19mbGFnczsKKworCWlmICghcmV0aW5mbykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwl0bXAgPSByZWFkdygmKGNoLT5jaF9icy0+ZWRlbGF5KSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRnYXBfdHR5X2RpZ2lzZXRlZGVsYXkoKQorICoKKyAqIElvY3RsIHRvIHNldCB0aGUgRURFTEFZIHNldHRpbmcKKyAqCisgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfZGlnaXNldGVkZWxheShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpuZXdfaW5mbykKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCWludCBuZXdfZGlnaTsKKwl1bG9uZyBsb2NrX2ZsYWdzOworCXVsb25nIGxvY2tfZmxhZ3MyOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19kaWdpLCBuZXdfaW5mbywgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwl3cml0ZXcoKHUxNikgbmV3X2RpZ2ksICYoY2gtPmNoX2JzLT5lZGVsYXkpKTsKKworCWRnYXBfcGFyYW0odHR5KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkZ2FwX3R0eV9kaWdpZ2V0Y3VzdG9tYmF1ZCgpCisgKgorICogSW9jdGwgdG8gZ2V0IHRoZSBjdXJyZW50IGN1c3RvbSBiYXVkIHJhdGUgc2V0dGluZy4KKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpZ2V0Y3VzdG9tYmF1ZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJCQlpbnQgX191c2VyICpyZXRpbmZvKQoreworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwlpbnQgdG1wOworCXVsb25nIGxvY2tfZmxhZ3M7CisKKwlpZiAoIXJldGluZm8pCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisJdG1wID0gZGdhcF9nZXRfY3VzdG9tX2JhdWQoY2gpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWlmIChjb3B5X3RvX3VzZXIocmV0aW5mbywgJnRtcCwgc2l6ZW9mKCpyZXRpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkZ2FwX3R0eV9kaWdpc2V0Y3VzdG9tYmF1ZCgpCisgKgorICogSW9jdGwgdG8gc2V0IHRoZSBjdXN0b20gYmF1ZCByYXRlIHNldHRpbmcKKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpc2V0Y3VzdG9tYmF1ZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJCQlpbnQgX191c2VyICpuZXdfaW5mbykKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCXVpbnQgbmV3X3JhdGU7CisJdWxvbmcgbG9ja19mbGFnczsKKwl1bG9uZyBsb2NrX2ZsYWdzMjsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19yYXRlLCBuZXdfaW5mbywgc2l6ZW9mKHVuc2lnbmVkIGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChiZC0+YmRfZmxhZ3MgJiBCRF9GRVA1UExVUykgeworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJCWNoLT5jaF9jdXN0b21fc3BlZWQgPSBuZXdfcmF0ZTsKKworCQlkZ2FwX3BhcmFtKHR0eSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogZGdhcF9zZXRfdGVybWlvcygpCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkJc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MyOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybjsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybjsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCWNoLT5jaF9jX2NmbGFnICAgPSB0dHktPnRlcm1pb3MuY19jZmxhZzsKKwljaC0+Y2hfY19pZmxhZyAgID0gdHR5LT50ZXJtaW9zLmNfaWZsYWc7CisJY2gtPmNoX2Nfb2ZsYWcgICA9IHR0eS0+dGVybWlvcy5jX29mbGFnOworCWNoLT5jaF9jX2xmbGFnICAgPSB0dHktPnRlcm1pb3MuY19sZmxhZzsKKwljaC0+Y2hfc3RhcnRjICAgID0gdHR5LT50ZXJtaW9zLmNfY2NbVlNUQVJUXTsKKwljaC0+Y2hfc3RvcGMgICAgID0gdHR5LT50ZXJtaW9zLmNfY2NbVlNUT1BdOworCisJZGdhcF9jYXJyaWVyKGNoKTsKKwlkZ2FwX3BhcmFtKHR0eSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZGdhcF90dHlfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCXVsb25nICAgbG9ja19mbGFnczsKKwl1bG9uZyAgIGxvY2tfZmxhZ3MyOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybjsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybjsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCWNoLT5jaF9mbGFncyB8PSAoQ0hfUlhCTE9DSyk7CisjaWYgMQorCWRnYXBfY21kdyhjaCwgUlBBVVNFLCAwLCAwKTsKKyNlbmRpZgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKK30KKworc3RhdGljIHZvaWQgZGdhcF90dHlfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJdWxvbmcgICBsb2NrX2ZsYWdzOworCXVsb25nICAgbG9ja19mbGFnczI7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJY2gtPmNoX2ZsYWdzICY9IH4oQ0hfUlhCTE9DSyk7CisKKyNpZiAxCisJZGdhcF9jbWR3KGNoLCBSUkVTVU1FLCAwLCAwKTsKKyNlbmRpZgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwl1bG9uZyAgIGxvY2tfZmxhZ3M7CisJdWxvbmcgICBsb2NrX2ZsYWdzMjsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm47CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm47CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwlkZ2FwX2NtZHcoY2gsIFJFU1VNRVRYLCAwLCAwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCit9CisKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCXVsb25nICAgbG9ja19mbGFnczsKKwl1bG9uZyAgIGxvY2tfZmxhZ3MyOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybjsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybjsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCWRnYXBfY21kdyhjaCwgUEFVU0VUWCwgMCwgMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworfQorCisvKgorICogZGdhcF90dHlfZmx1c2hfY2hhcnMoKQorICoKKyAqIEZsdXNoIHRoZSBjb29rIGJ1ZmZlcgorICoKKyAqIE5vdGUgdG8gc2VsZiwgYW5kIGFueSBvdGhlciBwb29yIHNvdWxzIHdobyB2ZW50dXJlIGhlcmU6CisgKgorICogZmx1c2ggaW4gdGhpcyBjYXNlIERPRVMgTk9UIG1lYW4gZGlzcG9zZSBvZiB0aGUgZGF0YS4KKyAqIGluc3RlYWQsIGl0IG1lYW5zICJzdG9wIGJ1ZmZlcmluZyBhbmQgc2VuZCBpdCBpZiB5b3UKKyAqIGhhdmVuJ3QgYWxyZWFkeS4iICBKdXN0IGd1ZXNzIGhvdyBJIGZpZ3VyZWQgdGhhdCBvdXQuLi4gICBTUlcgMi1KdW4tOTgKKyAqCisgKiBJdCBpcyBhbHNvIGFsd2F5cyBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQgLSBKQVIgOC1TZXB0LTk5CisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfdHR5X2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwl1bG9uZyAgIGxvY2tfZmxhZ3M7CisJdWxvbmcgICBsb2NrX2ZsYWdzMjsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm47CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm47CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwkvKiBUT0RPOiBEbyBzb21ldGhpbmcgaGVyZSAqLworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Cit9CisKKy8qCisgKiBkZ2FwX3R0eV9mbHVzaF9idWZmZXIoKQorICoKKyAqIEZsdXNoIFR4IGJ1ZmZlciAobWFrZSBpbiA9PSBvdXQpCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfdHR5X2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJdWxvbmcgICBsb2NrX2ZsYWdzOworCXVsb25nICAgbG9ja19mbGFnczI7CisJdTE2CWhlYWQgPSAwOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybjsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybjsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCWNoLT5jaF9mbGFncyAmPSB+Q0hfU1RPUDsKKwloZWFkID0gcmVhZHcoJihjaC0+Y2hfYnMtPnR4X2hlYWQpKTsKKwlkZ2FwX2NtZHcoY2gsIEZMVVNIVFgsICh1MTYpIGhlYWQsIDApOworCWRnYXBfY21kdyhjaCwgUkVTVU1FVFgsIDAsIDApOworCWlmIChjaC0+Y2hfdHVuLnVuX2ZsYWdzICYgKFVOX0xPV3xVTl9FTVBUWSkpIHsKKwkJY2gtPmNoX3R1bi51bl9mbGFncyAmPSB+KFVOX0xPV3xVTl9FTVBUWSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3R1bi51bl9mbGFnc193YWl0KTsKKwl9CisJaWYgKGNoLT5jaF9wdW4udW5fZmxhZ3MgJiAoVU5fTE9XfFVOX0VNUFRZKSkgeworCQljaC0+Y2hfcHVuLnVuX2ZsYWdzICY9IH4oVU5fTE9XfFVOX0VNUFRZKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfcHVuLnVuX2ZsYWdzX3dhaXQpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ0dHktPndyaXRlX3dhaXQpKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJdHR5X3dha2V1cCh0dHkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgSU9DVEwgZnVuY3Rpb24gYW5kIGFsbCBvZiBpdHMgaGVscGVycworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIGRnYXBfdHR5X2lvY3RsKCkKKyAqCisgKiBUaGUgdXN1YWwgYXNzb3J0bWVudCBvZiBpb2N0bCdzCisgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwlpbnQgcmM7CisJdTE2CWhlYWQgPSAwOworCXVsb25nICAgbG9ja19mbGFncyA9IDA7CisJdWxvbmcgICBsb2NrX2ZsYWdzMiA9IDA7CisJdm9pZCBfX3VzZXIgKnVhcmcgPSAodm9pZCBfX3VzZXIgKikgYXJnOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiAtRU5PREVWOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAtRU5PREVWOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJaWYgKHVuLT51bl9vcGVuX2NvdW50IDw9IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCisJLyogSGVyZSBhcmUgYWxsIHRoZSBzdGFuZGFyZCBpb2N0bCdzIHRoYXQgd2UgTVVTVCBpbXBsZW1lbnQgKi8KKworCWNhc2UgVENTQlJLOgorCQkvKgorCQkgKiBUQ1NCUksgaXMgU1ZJRCB2ZXJzaW9uOiBub24temVybyBhcmcgLS0+IG5vIGJyZWFrCisJCSAqIHRoaXMgYmVoYXZpb3VyIGlzIGV4cGxvaXRlZCBieSB0Y2RyYWluKCkuCisJCSAqCisJCSAqIEFjY29yZGluZyB0byBQT1NJWC4xIHNwZWMgKDcuMi4yLjEuMikgYnJlYWtzIHNob3VsZCBiZQorCQkgKiBiZXR3ZWVuIDAuMjUgYW5kIDAuNSBzZWNvbmRzIHNvIHdlJ2xsIGFzayBmb3Igc29tZXRoaW5nCisJCSAqIGluIHRoZSBtaWRkbGU6IDAuMzc1IHNlY29uZHMuCisJCSAqLworCQlyYyA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7CisKKwkJaWYgKHJjKQorCQkJcmV0dXJuIC1FSU5UUjsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCQlpZiAoKChjbWQgPT0gVENTQlJLKSAmJiAoIWFyZykpIHx8IChjbWQgPT0gVENTQlJLUCkpCisJCQlkZ2FwX2NtZHcoY2gsIFNCUkVBSywgKHUxNikgU0JSRUFLX1RJTUUsIDApOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQlyZXR1cm4gMDsKKworCWNhc2UgVENTQlJLUDoKKwkJLyogc3VwcG9ydCBmb3IgUE9TSVggdGNzZW5kYnJlYWsoKQorCisJCSAqIEFjY29yZGluZyB0byBQT1NJWC4xIHNwZWMgKDcuMi4yLjEuMikgYnJlYWtzIHNob3VsZCBiZQorCQkgKiBiZXR3ZWVuIDAuMjUgYW5kIDAuNSBzZWNvbmRzIHNvIHdlJ2xsIGFzayBmb3Igc29tZXRoaW5nCisJCSAqIGluIHRoZSBtaWRkbGU6IDAuMzc1IHNlY29uZHMuCisJCSAqLworCQlyYyA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7CisJCWlmIChyYykKKwkJCXJldHVybiAtRUlOVFI7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwkJZGdhcF9jbWR3KGNoLCBTQlJFQUssICh1MTYpIFNCUkVBS19USU1FLCAwKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwkJcmV0dXJuIDA7CisKKwljYXNlIFRJT0NTQlJLOgorCQkvKgorCQkgKiBGRVA1IGRvZXNuJ3Qgc3VwcG9ydCB0dXJuaW5nIG9uIGEgYnJlYWsgdW5jb25kaXRpb25hbGx5LgorCQkgKiBUaGUgRkVQNSBkZXZpY2Ugd2lsbCBzdG9wIHNlbmRpbmcgYSBicmVhayBhdXRvbWF0aWNhbGx5CisJCSAqIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZSB2YWx1ZSB0aGF0IHdhcyBzZW50IHdoZW4gdHVybmluZyBvbgorCQkgKiB0aGUgYnJlYWsuCisJCSAqLworCQlyYyA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7CisJCWlmIChyYykKKwkJCXJldHVybiAtRUlOVFI7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwkJZGdhcF9jbWR3KGNoLCBTQlJFQUssICh1MTYpIFNCUkVBS19USU1FLCAwKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwkJcmV0dXJuIDA7CisKKwljYXNlIFRJT0NDQlJLOgorCQkvKgorCQkgKiBGRVA1IGRvZXNuJ3Qgc3VwcG9ydCB0dXJuaW5nIG9mZiBhIGJyZWFrIHVuY29uZGl0aW9uYWxseS4KKwkJICogVGhlIEZFUDUgZGV2aWNlIHdpbGwgc3RvcCBzZW5kaW5nIGEgYnJlYWsgYXV0b21hdGljYWxseQorCQkgKiBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWUgdmFsdWUgdGhhdCB3YXMgc2VudCB3aGVuIHR1cm5pbmcgb24KKwkJICogdGhlIGJyZWFrLgorCQkgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gMDsKKworCWNhc2UgVElPQ0dTT0ZUQ0FSOgorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQlyYyA9IHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwKKwkJCQkodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJnKTsKKwkJcmV0dXJuIHJjOworCisJY2FzZSBUSU9DU1NPRlRDQVI6CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQlyYyA9IGdldF91c2VyKGFyZywgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJdHR5LT50ZXJtaW9zLmNfY2ZsYWcgPSAoKHR0eS0+dGVybWlvcy5jX2NmbGFnICYgfkNMT0NBTCkgfAorCQkJCQkJKGFyZyA/IENMT0NBTCA6IDApKTsKKwkJZGdhcF9wYXJhbSh0dHkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwkJcmV0dXJuIDA7CisKKwljYXNlIFRJT0NNR0VUOgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiBkZ2FwX2dldF9tb2RlbV9pbmZvKGNoLCB1YXJnKTsKKworCWNhc2UgVElPQ01CSVM6CisJY2FzZSBUSU9DTUJJQzoKKwljYXNlIFRJT0NNU0VUOgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiBkZ2FwX3NldF9tb2RlbV9pbmZvKHR0eSwgY21kLCB1YXJnKTsKKworCQkvKgorCQkgKiBIZXJlIGFyZSBhbnkgYWRkaXRpb25hbCBpb2N0bCdzIHRoYXQgd2Ugd2FudCB0byBpbXBsZW1lbnQKKwkJICovCisKKwljYXNlIFRDRkxTSDoKKwkJLyoKKwkJICogVGhlIGxpbnV4IHR0eSBkcml2ZXIgZG9lc24ndCBoYXZlIGEgZmx1c2gKKwkJICogaW5wdXQgcm91dGluZSBmb3IgdGhlIGRyaXZlciwgYXNzdW1pbmcgYWxsIGJhY2tlZAorCQkgKiB1cCBkYXRhIGlzIGluIHRoZSBsaW5lIGRpc2MuIGJ1ZmZlcnMuICBIb3dldmVyLAorCQkgKiB3ZSBhbGwga25vdyB0aGF0J3Mgbm90IHRoZSBjYXNlLiAgSGVyZSwgd2UKKwkJICogYWN0IG9uIHRoZSBpb2N0bCwgYnV0IHRoZW4gbGllIGFuZCBzYXkgd2UgZGlkbid0CisJCSAqIHNvIHRoZSBsaW5lIGRpc2NpcGxpbmUgd2lsbCBwcm9jZXNzIHRoZSBmbHVzaAorCQkgKiBhbHNvLgorCQkgKi8KKwkJcmMgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCWlmIChyYykgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCWlmICgoYXJnID09IFRDSUZMVVNIKSB8fCAoYXJnID09IFRDSU9GTFVTSCkpIHsKKwkJCWlmICghKHVuLT51bl90eXBlID09IERHQVBfUFJJTlQpKSB7CisJCQkJaGVhZCA9IHJlYWR3KCYoY2gtPmNoX2JzLT5yeF9oZWFkKSk7CisJCQkJd3JpdGV3KGhlYWQsICYoY2gtPmNoX2JzLT5yeF90YWlsKSk7CisJCQkJd3JpdGViKDAsICYoY2gtPmNoX2JzLT5vcnVuKSk7CisJCQl9CisJCX0KKworCQlpZiAoKGFyZyAhPSBUQ09GTFVTSCkgJiYgKGFyZyAhPSBUQ0lPRkxVU0gpKSB7CisJCQkvKiBwcmV0ZW5kIHdlIGRpZG4ndCByZWNvZ25pemUgdGhpcyBJT0NUTCAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJfQorCisJCWNoLT5jaF9mbGFncyAmPSB+Q0hfU1RPUDsKKwkJaGVhZCA9IHJlYWR3KCYoY2gtPmNoX2JzLT50eF9oZWFkKSk7CisJCWRnYXBfY21kdyhjaCwgRkxVU0hUWCwgKHUxNikgaGVhZCwgMCk7CisJCWRnYXBfY21kdyhjaCwgUkVTVU1FVFgsIDAsIDApOworCQlpZiAoY2gtPmNoX3R1bi51bl9mbGFncyAmIChVTl9MT1d8VU5fRU1QVFkpKSB7CisJCQljaC0+Y2hfdHVuLnVuX2ZsYWdzICY9IH4oVU5fTE9XfFVOX0VNUFRZKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3R1bi51bl9mbGFnc193YWl0KTsKKwkJfQorCQlpZiAoY2gtPmNoX3B1bi51bl9mbGFncyAmIChVTl9MT1d8VU5fRU1QVFkpKSB7CisJCQljaC0+Y2hfcHVuLnVuX2ZsYWdzICY9IH4oVU5fTE9XfFVOX0VNUFRZKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3B1bi51bl9mbGFnc193YWl0KTsKKwkJfQorCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmdHR5LT53cml0ZV93YWl0KSkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKworCQkvKiBDYW4ndCBob2xkIGFueSBsb2NrcyB3aGVuIGNhbGxpbmcgdHR5X3dha2V1cCEgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQl0dHlfd2FrZXVwKHR0eSk7CisKKwkJLyogcHJldGVuZCB3ZSBkaWRuJ3QgcmVjb2duaXplIHRoaXMgSU9DVEwgKi8KKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCWNhc2UgVENTRVRTRjoKKwljYXNlIFRDU0VUU1c6CisJCS8qCisJCSAqIFRoZSBsaW51eCB0dHkgZHJpdmVyIGRvZXNuJ3QgaGF2ZSBhIGZsdXNoCisJCSAqIGlucHV0IHJvdXRpbmUgZm9yIHRoZSBkcml2ZXIsIGFzc3VtaW5nIGFsbCBiYWNrZWQKKwkJICogdXAgZGF0YSBpcyBpbiB0aGUgbGluZSBkaXNjLiBidWZmZXJzLiAgSG93ZXZlciwKKwkJICogd2UgYWxsIGtub3cgdGhhdCdzIG5vdCB0aGUgY2FzZS4gIEhlcmUsIHdlCisJCSAqIGFjdCBvbiB0aGUgaW9jdGwsIGJ1dCB0aGVuIGxpZSBhbmQgc2F5IHdlIGRpZG4ndAorCQkgKiBzbyB0aGUgbGluZSBkaXNjaXBsaW5lIHdpbGwgcHJvY2VzcyB0aGUgZmx1c2gKKwkJICogYWxzby4KKwkJICovCisJCWlmIChjbWQgPT0gVENTRVRTRikgeworCQkJLyogZmx1c2ggcnggKi8KKwkJCWNoLT5jaF9mbGFncyAmPSB+Q0hfU1RPUDsKKwkJCWhlYWQgPSByZWFkdygmKGNoLT5jaF9icy0+cnhfaGVhZCkpOworCQkJd3JpdGV3KGhlYWQsICYoY2gtPmNoX2JzLT5yeF90YWlsKSk7CisJCX0KKworCQkvKiBub3cgd2FpdCBmb3IgYWxsIHRoZSBvdXRwdXQgdG8gZHJhaW4gKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyYyA9IGRnYXBfd2FpdF9mb3JfZHJhaW4odHR5KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIC1FSU5UUjsKKworCQkvKiBwcmV0ZW5kIHdlIGRpZG4ndCByZWNvZ25pemUgdGhpcyAqLworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJY2FzZSBUQ1NFVEFXOgorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7CisJCWlmIChyYykKKwkJCXJldHVybiAtRUlOVFI7CisKKwkJLyogcHJldGVuZCB3ZSBkaWRuJ3QgcmVjb2duaXplIHRoaXMgKi8KKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCWNhc2UgVENYT05DOgorCQkvKgorCQkgKiBUaGUgTGludXggTGluZSBEaXNjaXBsaW5lIChMRCkgd291bGQgZG8gdGhpcyBmb3IgdXMgaWYgd2UKKwkJICogbGV0IGl0LCBidXQgd2UgaGF2ZSB0aGUgc3BlY2lhbCBmaXJtd2FyZSBvcHRpb25zIHRvIGRvIHRoaXMKKwkJICogdGhlICJyaWdodCB3YXkiIHJlZ2FyZGxlc3Mgb2YgaGFyZHdhcmUgb3Igc29mdHdhcmUgZmxvdworCQkgKiBjb250cm9sIHNvIHdlJ2xsIGRvIGl0IG91dHNlbHZlcyBpbnN0ZWFkIG9mIGxldHRpbmcgdGhlIExECisJCSAqIGRvIGl0LgorCQkgKi8KKwkJcmMgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCWlmIChyYykgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCXN3aXRjaCAoYXJnKSB7CisKKwkJY2FzZSBUQ09PTjoKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCQlkZ2FwX3R0eV9zdGFydCh0dHkpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgVENPT0ZGOgorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCWRnYXBfdHR5X3N0b3AodHR5KTsKKwkJCXJldHVybiAwOworCQljYXNlIFRDSU9OOgorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCS8qIE1ha2UgdGhlIGxkIGRvIGl0ICovCisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQljYXNlIFRDSU9GRjoKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCQkvKiBNYWtlIHRoZSBsZCBkbyBpdCAqLworCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJZGVmYXVsdDoKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJY2FzZSBESUdJX0dFVEE6CisJCS8qIGdldCBpbmZvcm1hdGlvbiBmb3IgZGl0dHkgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gZGdhcF90dHlfZGlnaWdldGEodHR5LCB1YXJnKTsKKworCWNhc2UgRElHSV9TRVRBVzoKKwljYXNlIERJR0lfU0VUQUY6CisKKwkJLyogc2V0IGluZm9ybWF0aW9uIGZvciBkaXR0eSAqLworCQlpZiAoY21kID09IChESUdJX1NFVEFXKSkgeworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIC1FSU5UUjsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJfSBlbHNlCisJCQl0dHlfbGRpc2NfZmx1c2godHR5KTsKKwkJLyogZmFsbCB0aHJ1ICovCisKKwljYXNlIERJR0lfU0VUQToKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gZGdhcF90dHlfZGlnaXNldGEodHR5LCB1YXJnKTsKKworCWNhc2UgRElHSV9HRURFTEFZOgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiBkZ2FwX3R0eV9kaWdpZ2V0ZWRlbGF5KHR0eSwgdWFyZyk7CisKKwljYXNlIERJR0lfU0VERUxBWToKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gZGdhcF90dHlfZGlnaXNldGVkZWxheSh0dHksIHVhcmcpOworCisJY2FzZSBESUdJX0dFVENVU1RPTUJBVUQ6CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuIGRnYXBfdHR5X2RpZ2lnZXRjdXN0b21iYXVkKHR0eSwgdWFyZyk7CisKKwljYXNlIERJR0lfU0VUQ1VTVE9NQkFVRDoKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gZGdhcF90dHlfZGlnaXNldGN1c3RvbWJhdWQodHR5LCB1YXJnKTsKKworCWNhc2UgRElHSV9SRVNFVF9QT1JUOgorCQlkZ2FwX2Zpcm13YXJlX3Jlc2V0X3BvcnQoY2gpOworCQlkZ2FwX3BhcmFtKHR0eSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZGdhcF9hZnRlcl9jb25maWdfbG9hZGVkKGludCBib2FyZCkKK3sKKwkvKgorCSAqIEluaXRpYWxpemUgS01FIHdhaXRxdWV1ZXMuLi4KKwkgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCYoZGdhcF9Cb2FyZFtib2FyZF0tPmttZV93YWl0KSk7CisKKwkvKgorCSAqIGFsbG9jYXRlIGZsaXAgYnVmZmVyIGZvciBib2FyZC4KKwkgKi8KKwlkZ2FwX0JvYXJkW2JvYXJkXS0+ZmxpcGJ1ZiA9IGttYWxsb2MoTVlGTElQTEVOLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWRnYXBfQm9hcmRbYm9hcmRdLT5mbGlwYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRnYXBfQm9hcmRbYm9hcmRdLT5mbGlwZmxhZ2J1ZiA9IGttYWxsb2MoTVlGTElQTEVOLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWRnYXBfQm9hcmRbYm9hcmRdLT5mbGlwZmxhZ2J1ZikgeworCQlrZnJlZShkZ2FwX0JvYXJkW2JvYXJkXS0+ZmxpcGJ1Zik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogQ3JlYXRlIHByIGFuZCB0dHkgZGV2aWNlIGVudHJpZXMKKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9yZWdpc3Rlcl9wb3J0cyhzdHJ1Y3QgYm9hcmRfdCAqYnJkKQoreworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCWludCBpOworCisJYnJkLT5TZXJpYWxQb3J0cyA9IGtjYWxsb2MoYnJkLT5uYXN5bmMsIHNpemVvZigqYnJkLT5TZXJpYWxQb3J0cyksCisJCQkJCUdGUF9LRVJORUwpOworCWlmIChicmQtPlNlcmlhbFBvcnRzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWZvciAoaSA9IDA7IGkgPCBicmQtPm5hc3luYzsgaSsrKQorCQl0dHlfcG9ydF9pbml0KCZicmQtPlNlcmlhbFBvcnRzW2ldKTsKKworCWJyZC0+UHJpbnRlclBvcnRzID0ga2NhbGxvYyhicmQtPm5hc3luYywgc2l6ZW9mKCpicmQtPlByaW50ZXJQb3J0cyksCisJCQkJCUdGUF9LRVJORUwpOworCWlmIChicmQtPlByaW50ZXJQb3J0cyA9PSBOVUxMKSB7CisJCWtmcmVlKGJyZC0+U2VyaWFsUG9ydHMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGJyZC0+bmFzeW5jOyBpKyspCisJCXR0eV9wb3J0X2luaXQoJmJyZC0+UHJpbnRlclBvcnRzW2ldKTsKKworCWNoID0gYnJkLT5jaGFubmVsc1swXTsKKwlmb3IgKGkgPSAwOyBpIDwgYnJkLT5uYXN5bmM7IGkrKywgY2ggPSBicmQtPmNoYW5uZWxzW2ldKSB7CisKKwkJc3RydWN0IGRldmljZSAqY2xhc3NwOworCisJCWNsYXNzcCA9IHR0eV9wb3J0X3JlZ2lzdGVyX2RldmljZSgmYnJkLT5TZXJpYWxQb3J0c1tpXSwKKwkJCQkJYnJkLT5TZXJpYWxEcml2ZXIsCisJCQkJCWJyZC0+Zmlyc3RtaW5vciArIGksIE5VTEwpOworCisJCWRnYXBfY3JlYXRlX3R0eV9zeXNmcygmY2gtPmNoX3R1biwgY2xhc3NwKTsKKwkJY2gtPmNoX3R1bi51bl9zeXNmcyA9IGNsYXNzcDsKKworCQljbGFzc3AgPSB0dHlfcG9ydF9yZWdpc3Rlcl9kZXZpY2UoJmJyZC0+UHJpbnRlclBvcnRzW2ldLAorCQkJCQlicmQtPlByaW50RHJpdmVyLAorCQkJCQlicmQtPmZpcnN0bWlub3IgKyBpLCBOVUxMKTsKKworCQlkZ2FwX2NyZWF0ZV90dHlfc3lzZnMoJmNoLT5jaF9wdW4sIGNsYXNzcCk7CisJCWNoLT5jaF9wdW4udW5fc3lzZnMgPSBjbGFzc3A7CisJfQorCWRnYXBfY3JlYXRlX3BvcnRzX3N5c2ZpbGVzKGJyZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvcGllcyB0aGUgQklPUyBjb2RlIGZyb20gdGhlIHVzZXIgdG8gdGhlIGJvYXJkLAorICogYW5kIHN0YXJ0cyB0aGUgQklPUyBydW5uaW5nLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX2RvX2Jpb3NfbG9hZChzdHJ1Y3QgYm9hcmRfdCAqYnJkLCBjb25zdCB1Y2hhciAqdWJpb3MsIGludCBsZW4pCit7CisJdWNoYXIgKmFkZHI7CisJdWludCBvZmZzZXQ7CisJaW50IGk7CisKKwlpZiAoIWJyZCB8fCAoYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKSB8fCAhYnJkLT5yZV9tYXBfbWVtYmFzZSkKKwkJcmV0dXJuOworCisJYWRkciA9IGJyZC0+cmVfbWFwX21lbWJhc2U7CisKKwkvKgorCSAqIGNsZWFyIFBPU1QgYXJlYQorCSAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQl3cml0ZWIoMCwgYWRkciArIFBPU1RBUkVBICsgaSk7CisKKwkvKgorCSAqIERvd25sb2FkIGJpb3MKKwkgKi8KKwlvZmZzZXQgPSAweDEwMDA7CisJbWVtY3B5X3RvaW8oYWRkciArIG9mZnNldCwgdWJpb3MsIGxlbik7CisKKwl3cml0ZWwoMHgwYmYwMDQwMSwgYWRkcik7CisJd3JpdGVsKDAsIChhZGRyICsgNCkpOworCisJLyogQ2xlYXIgdGhlIHJlc2V0LCBhbmQgY2hhbmdlIHN0YXRlcy4gKi8KKwl3cml0ZWIoRkVQQ0xSLCBicmQtPnJlX21hcF9wb3J0KTsKK30KKworLyoKKyAqIENoZWNrcyB0byBzZWUgaWYgdGhlIEJJT1MgY29tcGxldGVkIHJ1bm5pbmcgb24gdGhlIGNhcmQuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF9kb193YWl0X2Zvcl9iaW9zKHN0cnVjdCBib2FyZF90ICpicmQpCit7CisJdWNoYXIgKmFkZHI7CisJdTE2IHdvcmQ7CisJdTE2IGVycjE7CisJdTE2IGVycjI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWJyZCB8fCAoYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKSB8fCAhYnJkLT5yZV9tYXBfbWVtYmFzZSkKKwkJcmV0dXJuIHJldDsKKworCWFkZHIgPSBicmQtPnJlX21hcF9tZW1iYXNlOworCXdvcmQgPSByZWFkdyhhZGRyICsgUE9TVEFSRUEpOworCisJLyoKKwkgKiBJdCBjYW4gdGFrZSA1LTYgc2Vjb25kcyBmb3IgYSBib2FyZCB0bworCSAqIHBhc3MgdGhlIGJpb3Mgc2VsZiB0ZXN0IGFuZCBwb3N0IHJlc3VsdHMuCisJICogR2l2ZSBpdCAxMCBzZWNvbmRzLgorCSAqLworCWJyZC0+d2FpdF9mb3JfYmlvcyA9IDA7CisJd2hpbGUgKGJyZC0+d2FpdF9mb3JfYmlvcyA8IDEwMDApIHsKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIEJJT1MgdGhpbmtzIGJvYXJkIGlzIGdvb2QuIChHRCkuICovCisJCWlmICh3b3JkID09ICoodTE2ICopICJHRCIpCisJCQlyZXR1cm4gMTsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMTApOworCQlicmQtPndhaXRfZm9yX2Jpb3MrKzsKKwkJd29yZCA9IHJlYWR3KGFkZHIgKyBQT1NUQVJFQSk7CisJfQorCisJLyogR2F2ZSB1cCBvbiBib2FyZCBhZnRlciB0b28gbG9uZyBvZiB0aW1lIHRha2VuICovCisJZXJyMSA9IHJlYWR3KGFkZHIgKyBTRVFVRU5DRSk7CisJZXJyMiA9IHJlYWR3KGFkZHIgKyBFUlJPUik7CisJcHJfd2FybigiZGdhcDogJXMgZmFpbGVkIGRpYWdub3N0aWNzLiAgRXJyb3IgIygleCwleCkuXG4iLAorCQlicmQtPm5hbWUsIGVycjEsIGVycjIpOworCWJyZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7CisJYnJkLT5kcGFzdGF0dXMgPSBCRF9OT0JJT1M7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQ29waWVzIHRoZSBGRVAgY29kZSBmcm9tIHRoZSB1c2VyIHRvIHRoZSBib2FyZCwKKyAqIGFuZCBzdGFydHMgdGhlIEZFUCBydW5uaW5nLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX2RvX2ZlcF9sb2FkKHN0cnVjdCBib2FyZF90ICpicmQsIGNvbnN0IHVjaGFyICp1ZmVwLCBpbnQgbGVuKQoreworCXVjaGFyICphZGRyOworCXVpbnQgb2Zmc2V0OworCisJaWYgKCFicmQgfHwgKGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykgfHwgIWJyZC0+cmVfbWFwX21lbWJhc2UpCisJCXJldHVybjsKKworCWFkZHIgPSBicmQtPnJlX21hcF9tZW1iYXNlOworCisJLyoKKwkgKiBEb3dubG9hZCBGRVAKKwkgKi8KKwlvZmZzZXQgPSAweDEwMDA7CisJbWVtY3B5X3RvaW8oYWRkciArIG9mZnNldCwgdWZlcCwgbGVuKTsKKworCS8qCisJICogSWYgYm9hcmQgaXMgYSBjb25jZW50cmF0b3IgcHJvZHVjdCwgd2UgbmVlZCB0byBnaXZlCisJICogaXQgaXRzIGNvbmZpZyBzdHJpbmcgZGVzY3JpYmluZyBob3cgdGhlIGNvbmNlbnRyYXRvcnMgbG9vay4KKwkgKi8KKwlpZiAoKGJyZC0+dHlwZSA9PSBQQ1gpIHx8IChicmQtPnR5cGUgPT0gUEVQQykpIHsKKwkJdWNoYXIgc3RyaW5nWzEwMF07CisJCXVjaGFyICpjb25maWcsICp4Y29uZmlnOworCQlpbnQgaSA9IDA7CisKKwkJeGNvbmZpZyA9IGRnYXBfY3JlYXRlX2NvbmZpZ19zdHJpbmcoYnJkLCBzdHJpbmcpOworCisJCS8qIFdyaXRlIHN0cmluZyB0byBib2FyZCBtZW1vcnkgKi8KKwkJY29uZmlnID0gYWRkciArIENPTkZJRzsKKwkJZm9yICg7IGkgPCBDT05GSUdTSVpFOyBpKyssIGNvbmZpZysrLCB4Y29uZmlnKyspIHsKKwkJCXdyaXRlYigqeGNvbmZpZywgY29uZmlnKTsKKwkJCWlmICgoKnhjb25maWcgJiAweGZmKSA9PSAweGZmKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJd3JpdGVsKDB4YmZjMDEwMDQsIChhZGRyICsgMHhjMzQpKTsKKwl3cml0ZWwoMHgzLCAoYWRkciArIDB4YzMwKSk7CisKK30KKworLyoKKyAqIFdhaXRzIGZvciB0aGUgRkVQIHRvIHJlcG9ydCB0aGF0cyBpdHMgcmVhZHkgZm9yIHVzIHRvIHVzZS4KKyAqLworc3RhdGljIGludCBkZ2FwX2RvX3dhaXRfZm9yX2ZlcChzdHJ1Y3QgYm9hcmRfdCAqYnJkKQoreworCXVjaGFyICphZGRyOworCXUxNiB3b3JkOworCXUxNiBlcnIxOworCXUxNiBlcnIyOworCWludCByZXQgPSAwOworCisJaWYgKCFicmQgfHwgKGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykgfHwgIWJyZC0+cmVfbWFwX21lbWJhc2UpCisJCXJldHVybiByZXQ7CisKKwlhZGRyID0gYnJkLT5yZV9tYXBfbWVtYmFzZTsKKwl3b3JkID0gcmVhZHcoYWRkciArIEZFUFNUQVQpOworCisJLyoKKwkgKiBJdCBjYW4gdGFrZSAyLTMgc2Vjb25kcyBmb3IgdGhlIEZFUCB0bworCSAqIGJlIHVwIGFuZCBydW5uaW5nLiBHaXZlIGl0IDUgc2Vjcy4KKwkgKi8KKwlicmQtPndhaXRfZm9yX2ZlcCA9IDA7CisJd2hpbGUgKGJyZC0+d2FpdF9mb3JfZmVwIDwgNTAwKSB7CisJCS8qIENoZWNrIHRvIHNlZSBpZiBGRVAgaXMgdXAgYW5kIHJ1bm5pbmcgbm93LiAqLworCQlpZiAod29yZCA9PSAqKHUxNiAqKSAiT1MiKSB7CisJCQkvKgorCQkJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBib2FyZCBjYW4gc3VwcG9ydCBGRVA1KyBjb21tYW5kcy4KKwkJCSovCisJCQl3b3JkID0gcmVhZHcoYWRkciArIEZFUDVfUExVUyk7CisJCQlpZiAod29yZCA9PSAqKHUxNiAqKSAiNUEiKQorCQkJCWJyZC0+YmRfZmxhZ3MgfD0gQkRfRkVQNVBMVVM7CisKKwkJCXJldHVybiAxOworCQl9CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwKTsKKwkJYnJkLT53YWl0X2Zvcl9mZXArKzsKKwkJd29yZCA9IHJlYWR3KGFkZHIgKyBGRVBTVEFUKTsKKwl9CisKKwkvKiBHYXZlIHVwIG9uIGJvYXJkIGFmdGVyIHRvbyBsb25nIG9mIHRpbWUgdGFrZW4gKi8KKwllcnIxID0gcmVhZHcoYWRkciArIFNFUVVFTkNFKTsKKwllcnIyID0gcmVhZHcoYWRkciArIEVSUk9SKTsKKwlwcl93YXJuKCJkZ2FwOiBGRVBPUyBmb3IgJXMgbm90IGZ1bmN0aW9uaW5nLiAgRXJyb3IgIygleCwleCkuXG4iLAorCQlicmQtPm5hbWUsIGVycjEsIGVycjIpOworCWJyZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7CisJYnJkLT5kcGFzdGF0dXMgPSBCRF9OT0ZFUDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBQaHlzaWNhbGx5IGZvcmNlcyB0aGUgRkVQNSBjYXJkIHRvIHJlc2V0IGl0c2VsZi4KKyAqLworc3RhdGljIHZvaWQgZGdhcF9kb19yZXNldF9ib2FyZChzdHJ1Y3QgYm9hcmRfdCAqYnJkKQoreworCXVjaGFyIGNoZWNrOworCXUzMiBjaGVjazE7CisJdTMyIGNoZWNrMjsKKwlpbnQgaSA9IDA7CisKKwlpZiAoIWJyZCB8fCAoYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKSB8fAorCSAgICAhYnJkLT5yZV9tYXBfbWVtYmFzZSB8fCAhYnJkLT5yZV9tYXBfcG9ydCkKKwkJcmV0dXJuOworCisJLyogRkVQUlNUIGRvZXMgbm90IHZhcnkgYW1vbmcgc3VwcG9ydGVkIGJvYXJkcyAqLworCXdyaXRlYihGRVBSU1QsIGJyZC0+cmVfbWFwX3BvcnQpOworCisJZm9yIChpID0gMDsgaSA8PSAxMDAwOyBpKyspIHsKKwkJY2hlY2sgPSByZWFkYihicmQtPnJlX21hcF9wb3J0KSAmIDB4ZTsKKwkJaWYgKGNoZWNrID09IEZFUFJTVCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCisJfQorCWlmIChpID4gMTAwMCkgeworCQlwcl93YXJuKCJkZ2FwOiBCb2FyZCBub3QgcmVzZXR0aW5nLi4uICBGYWlsaW5nIGJvYXJkLlxuIik7CisJCWJyZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7CisJCWJyZC0+ZHBhc3RhdHVzID0gQkRfTk9GRVA7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGVyZSByZWFsbHkgaXMgbWVtb3J5IG91dCB0aGVyZS4KKwkgKi8KKwl3cml0ZWwoMHhhNTVhM2NjMywgKGJyZC0+cmVfbWFwX21lbWJhc2UgKyBMT1dNRU0pKTsKKwl3cml0ZWwoMHg1YWE1YzMzYywgKGJyZC0+cmVfbWFwX21lbWJhc2UgKyBISUdITUVNKSk7CisJY2hlY2sxID0gcmVhZGwoYnJkLT5yZV9tYXBfbWVtYmFzZSArIExPV01FTSk7CisJY2hlY2syID0gcmVhZGwoYnJkLT5yZV9tYXBfbWVtYmFzZSArIEhJR0hNRU0pOworCisJaWYgKChjaGVjazEgIT0gMHhhNTVhM2NjMykgfHwgKGNoZWNrMiAhPSAweDVhYTVjMzNjKSkgeworCQlwcl93YXJuKCJkZ2FwOiBObyBtZW1vcnkgYXQgJXAgZm9yIGJvYXJkLlxuIiwKKwkJCWJyZC0+cmVfbWFwX21lbWJhc2UpOworCQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOworCQlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOworCQlyZXR1cm47CisJfQorCit9CisKKyNpZmRlZiBESUdJX0NPTkNFTlRSQVRPUlNfU1VQUE9SVEVECisvKgorICogU2VuZHMgYSBjb25jZW50cmF0b3IgaW1hZ2UgaW50byB0aGUgRkVQNSBib2FyZC4KKyAqLworc3RhdGljIHZvaWQgZGdhcF9kb19jb25jX2xvYWQoc3RydWN0IGJvYXJkX3QgKmJyZCwgdWNoYXIgKnVhZGRyLCBpbnQgbGVuKQoreworCWNoYXIgKnZhZGRyOworCXUxNiBvZmZzZXQgPSAwOworCXN0cnVjdCBkb3dubGRfdCAqdG9fZHA7CisKKwlpZiAoIWJyZCB8fCAoYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKSB8fCAhYnJkLT5yZV9tYXBfbWVtYmFzZSkKKwkJcmV0dXJuOworCisJdmFkZHIgPSBicmQtPnJlX21hcF9tZW1iYXNlOworCisJb2Zmc2V0ID0gcmVhZHcoKHUxNiAqKSAodmFkZHIgKyBET1dOUkVRKSk7CisJdG9fZHAgPSAoc3RydWN0IGRvd25sZF90ICopICh2YWRkciArIChpbnQpIG9mZnNldCk7CisJbWVtY3B5X3RvaW8odG9fZHAsIHVhZGRyLCBsZW4pOworCisJLyogVGVsbCBjYXJkIHdlIGhhdmUgZGF0YSBmb3IgaXQgKi8KKwl3cml0ZXcoMCwgdmFkZHIgKyAoRE9XTlJFUSkpOworCisJYnJkLT5jb25jX2RsX3N0YXR1cyA9IE5PX1BFTkRJTkdfQ09OQ0VOVFJBVE9SX1JFUVVFU1RTOworfQorI2VuZGlmCisKKyNkZWZpbmUgRVhQQU5TSU9OX1JPTV9TSVpFCSg2NCAqIDEwMjQpCisjZGVmaW5lIEZFUDVfUk9NX01BR0lDCQkoMHhGRUZGRkZGRikKKworc3RhdGljIHZvaWQgZGdhcF9nZXRfdnBkKHN0cnVjdCBib2FyZF90ICpicmQpCit7CisJdTMyIG1hZ2ljOworCXUzMiBiYXNlX29mZnNldDsKKwl1MTYgcm9tX29mZnNldDsKKwl1MTYgdnBkX29mZnNldDsKKwl1MTYgaW1hZ2VfbGVuZ3RoOworCXUxNiBpOworCXVjaGFyIGJ5dGUxOworCXVjaGFyIGJ5dGUyOworCisJLyoKKwkgKiBQb2tlIHRoZSBtYWdpYyBudW1iZXIgYXQgdGhlIFBDSSBSb20gQWRkcmVzcyBsb2NhdGlvbi4KKwkgKiBJZiBWUEQgaXMgc3VwcG9ydGVkLCB0aGUgdmFsdWUgcmVhZCBmcm9tIHRoYXQgYWRkcmVzcworCSAqIHdpbGwgYmUgbm9uLXplcm8uCisJICovCisJbWFnaWMgPSBGRVA1X1JPTV9NQUdJQzsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyZC0+cGRldiwgUENJX1JPTV9BRERSRVNTLCBtYWdpYyk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGJyZC0+cGRldiwgUENJX1JPTV9BRERSRVNTLCAmbWFnaWMpOworCisJLyogVlBEIG5vdCBzdXBwb3J0ZWQsIGJhaWwgKi8KKwlpZiAoIW1hZ2ljKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFRvIGdldCB0byB0aGUgT1RQUk9NIG1lbW9yeSwgd2UgaGF2ZSB0byBzZW5kIHRoZSBib2FyZHMgYmFzZQorCSAqIGFkZHJlc3Mgb3InZWQgd2l0aCAxIGludG8gdGhlIFBDSSBSb20gQWRkcmVzcyBsb2NhdGlvbi4KKwkgKi8KKwltYWdpYyA9IGJyZC0+bWVtYmFzZSB8IDB4MDE7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmQtPnBkZXYsIFBDSV9ST01fQUREUkVTUywgbWFnaWMpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChicmQtPnBkZXYsIFBDSV9ST01fQUREUkVTUywgJm1hZ2ljKTsKKworCWJ5dGUxID0gcmVhZGIoYnJkLT5yZV9tYXBfbWVtYmFzZSk7CisJYnl0ZTIgPSByZWFkYihicmQtPnJlX21hcF9tZW1iYXNlICsgMSk7CisKKwkvKgorCSAqIElmIHRoZSBib2FyZCBjb3JyZWN0bHkgc3dhcHBlZCB0byB0aGUgT1RQUk9NIG1lbW9yeSwKKwkgKiB0aGUgZmlyc3QgMiBieXRlcyAoaGVhZGVyKSBzaG91bGQgYmUgMHg1NSwgMHhBQQorCSAqLworCWlmIChieXRlMSA9PSAweDU1ICYmIGJ5dGUyID09IDB4QUEpIHsKKworCQliYXNlX29mZnNldCA9IDA7CisKKwkJLyoKKwkJICogV2UgaGF2ZSB0byBydW4gdGhyb3VnaCBhbGwgdGhlIE9UUFJPTSBtZW1vcnkgbG9va2luZworCQkgKiBmb3IgdGhlIFZQRCBvZmZzZXQuCisJCSAqLworCQl3aGlsZSAoYmFzZV9vZmZzZXQgPD0gRVhQQU5TSU9OX1JPTV9TSVpFKSB7CisKKwkJCS8qCisJCQkgKiBMb3RzIG9mIG1hZ2ljIG51bWJlcnMgaGVyZS4KKwkJCSAqCisJCQkgKiBUaGUgVlBEIG9mZnNldCBpcyBsb2NhdGVkIGluc2lkZSB0aGUgUk9NIERhdGEKKwkJCSAqIFN0cnVjdHVyZS4KKwkJCSAqCisJCQkgKiBXZSBhbHNvIGhhdmUgdG8gcmVtZW1iZXIgdGhlIGxlbmd0aCBvZiBlYWNoCisJCQkgKiBST00gRGF0YSBTdHJ1Y3R1cmUsIHNvIHdlIGNhbiAiaG9wIiB0byB0aGUgbmV4dAorCQkJICogZW50cnkgaWYgdGhlIFZQRCBpc24ndCBpbiB0aGUgY3VycmVudAorCQkJICogUk9NIERhdGEgU3RydWN0dXJlLgorCQkJICovCisJCQlyb21fb2Zmc2V0ID0gcmVhZHcoYnJkLT5yZV9tYXBfbWVtYmFzZSArCisJCQkJCQliYXNlX29mZnNldCArIDB4MTgpOworCQkJaW1hZ2VfbGVuZ3RoID0gcmVhZHcoYnJkLT5yZV9tYXBfbWVtYmFzZSArCisJCQkJCQlyb21fb2Zmc2V0ICsgMHgxMCkgKiA1MTI7CisJCQl2cGRfb2Zmc2V0ID0gcmVhZHcoYnJkLT5yZV9tYXBfbWVtYmFzZSArCisJCQkJCQlyb21fb2Zmc2V0ICsgMHgwOCk7CisKKwkJCS8qIEZvdW5kIHRoZSBWUEQgZW50cnkgKi8KKwkJCWlmICh2cGRfb2Zmc2V0KQorCQkJCWJyZWFrOworCisJCQkvKiBXZSBkaWRuJ3QgZmluZCBhIFZQRCBlbnRyeSwgZ28gdG8gbmV4dCBST00gZW50cnkuICovCisJCQliYXNlX29mZnNldCArPSBpbWFnZV9sZW5ndGg7CisKKwkJCWJ5dGUxID0gcmVhZGIoYnJkLT5yZV9tYXBfbWVtYmFzZSArIGJhc2Vfb2Zmc2V0KTsKKwkJCWJ5dGUyID0gcmVhZGIoYnJkLT5yZV9tYXBfbWVtYmFzZSArIGJhc2Vfb2Zmc2V0ICsgMSk7CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgbmV3IFJPTSBvZmZzZXQgZG9lc24ndCBoYXZlIDB4NTUsIDB4QUEKKwkJCSAqIGFzIGl0cyBoZWFkZXIsIHdlIGhhdmUgcnVuIG91dCBvZiBST00uCisJCQkgKi8KKwkJCWlmIChieXRlMSAhPSAweDU1IHx8IGJ5dGUyICE9IDB4QUEpCisJCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGEgVlBEIG9mZnNldCwgdGhlbiBtYXJrIHRoZSBib2FyZAorCQkgKiBhcyBoYXZpbmcgYSB2YWxpZCBWUEQsIGFuZCBjb3B5IFZQRFNJWkUgKDUxMikgYnl0ZXMgb2YKKwkJICogdGhhdCBWUEQgdG8gdGhlIGJ1ZmZlciB3ZSBoYXZlIGluIG91ciBib2FyZCBzdHJ1Y3R1cmUuCisJCSAqLworCQlpZiAodnBkX29mZnNldCkgeworCQkJYnJkLT5iZF9mbGFncyB8PSBCRF9IQVNfVlBEOworCQkJZm9yIChpID0gMDsgaSA8IFZQRFNJWkU7IGkrKykgeworCQkJCWJyZC0+dnBkW2ldID0gcmVhZGIoYnJkLT5yZV9tYXBfbWVtYmFzZSArCisJCQkJCQkJdnBkX29mZnNldCArIGkpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBXZSBNVVNUIHBva2UgdGhlIG1hZ2ljIG51bWJlciBhdCB0aGUgUENJIFJvbSBBZGRyZXNzIGxvY2F0aW9uIGFnYWluLgorCSAqIFRoaXMgbWFrZXMgdGhlIGNhcmQgcmVwb3J0IHRoZSByZWd1bGFyIGJvYXJkIG1lbW9yeSBiYWNrIHRvIHVzLAorCSAqIHJhdGhlciB0aGFuIHRoZSBPVFBST00gbWVtb3J5LgorCSAqLworCW1hZ2ljID0gRkVQNV9ST01fTUFHSUM7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmQtPnBkZXYsIFBDSV9ST01fQUREUkVTUywgbWFnaWMpOworfQorCisvKgorICogT3VyIGJvYXJkIHBvbGxlciBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgZGdhcF9wb2xsX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBib2FyZF90ICpiZCA9IChzdHJ1Y3QgYm9hcmRfdCAqKSBkYXRhOworCXVsb25nICBsb2NrX2ZsYWdzOworCWNoYXIgKnZhZGRyOworCXUxNiBoZWFkLCB0YWlsOworCisJaWYgKCFiZCB8fCAoYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpKQorCQlyZXR1cm47CisKKwlpZiAoYmQtPmluaGliaXRfcG9sbGVyKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJdmFkZHIgPSBiZC0+cmVfbWFwX21lbWJhc2U7CisKKwkvKgorCSAqIElmIGJvYXJkIGlzIHJlYWR5LCBwYXJzZSBkZWVwZXIgdG8gc2VlIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRvIGRvLgorCSAqLworCWlmIChiZC0+c3RhdGUgPT0gQk9BUkRfUkVBRFkpIHsKKworCQlzdHJ1Y3QgZXZfdCAqZWFkZHIgPSBOVUxMOworCisJCWlmICghYmQtPnJlX21hcF9tZW1iYXNlKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCFiZC0+cmVfbWFwX3BvcnQpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICghYmQtPm5hc3luYykKKwkJCWdvdG8gb3V0OworCisJCWVhZGRyID0gKHN0cnVjdCBldl90ICopICh2YWRkciArIEVWQlVGKTsKKworCQkvKiBHZXQgb3VyIGhlYWQgYW5kIHRhaWwgKi8KKwkJaGVhZCA9IHJlYWR3KCYoZWFkZHItPmV2X2hlYWQpKTsKKwkJdGFpbCA9IHJlYWR3KCYoZWFkZHItPmV2X3RhaWwpKTsKKworCQkvKgorCQkgKiBJZiB0aGVyZSBpcyBhbiBldmVudCBwZW5kaW5nLiBHbyBzZXJ2aWNlIGl0LgorCQkgKi8KKwkJaWYgKGhlYWQgIT0gdGFpbCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQkJZGdhcF9ldmVudChiZCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQl9CisKK291dDoKKwkJLyoKKwkJICogSWYgYm9hcmQgaXMgZG9pbmcgaW50ZXJydXB0cywgQUNLIHRoZSBpbnRlcnJ1cHQuCisJCSAqLworCQlpZiAoYmQgJiYgYmQtPmludHJfcnVubmluZykKKwkJCXJlYWRiKGJkLT5yZV9tYXBfcG9ydCArIDIpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICAgICAgZGdhcF9jbWRiIC0gU2VuZHMgYSAyIGJ5dGUgY29tbWFuZCB0byB0aGUgRkVQLgorICoKKyAqICAgICAgICAgICAgICBjaCAgICAgIC0gUG9pbnRlciB0byBjaGFubmVsIHN0cnVjdHVyZS4KKyAqICAgICAgICAgICAgICBjbWQgICAgIC0gQ29tbWFuZCB0byBiZSBzZW50LgorICogICAgICAgICAgICAgIGJ5dGUxICAgLSBJbnRlZ2VyIGNvbnRhaW5pbmcgZmlyc3QgYnl0ZSB0byBiZSBzZW50LgorICogICAgICAgICAgICAgIGJ5dGUyICAgLSBJbnRlZ2VyIGNvbnRhaW5pbmcgc2Vjb25kIGJ5dGUgdG8gYmUgc2VudC4KKyAqICAgICAgICAgICAgICBuY21kcyAgIC0gV2FpdCB1bnRpbCBuY21kcyBvciBmZXdlciBjbWRzIGFyZSBsZWZ0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBjbWQgYnVmZmVyIGJlZm9yZSByZXR1cm5pbmcuCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBkZ2FwX2NtZGIoc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVjaGFyIGNtZCwgdWNoYXIgYnl0ZTEsCisJCQl1Y2hhciBieXRlMiwgdWludCBuY21kcykKK3sKKwljaGFyCQkqdmFkZHIgPSBOVUxMOworCXN0cnVjdCBjbV90CSpjbV9hZGRyID0gTlVMTDsKKwl1aW50CQljb3VudDsKKwl1aW50CQluOworCXUxNgkJaGVhZDsKKwl1MTYJCXRhaWw7CisKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCS8qCisJICogQ2hlY2sgaWYgYm9hcmQgaXMgc3RpbGwgYWxpdmUuCisJICovCisJaWYgKGNoLT5jaF9iZC0+c3RhdGUgPT0gQk9BUkRfRkFJTEVEKQorCQlyZXR1cm47CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgcG9pbnRlcnMgYXJlIGluIHJhbmdlIGJlZm9yZQorCSAqIHdyaXRpbmcgdG8gdGhlIEZFUCBtZW1vcnkuCisJICovCisJdmFkZHIgPSBjaC0+Y2hfYmQtPnJlX21hcF9tZW1iYXNlOworCisJaWYgKCF2YWRkcikKKwkJcmV0dXJuOworCisJY21fYWRkciA9IChzdHJ1Y3QgY21fdCAqKSAodmFkZHIgKyBDTURCVUYpOworCWhlYWQgPSByZWFkdygmKGNtX2FkZHItPmNtX2hlYWQpKTsKKworCS8qCisJICogRm9yZ2V0IGl0IGlmIHBvaW50ZXJzIG91dCBvZiByYW5nZS4KKwkgKi8KKwlpZiAoaGVhZCA+PSAoQ01ETUFYIC0gQ01EU1RBUlQpIHx8IChoZWFkICYgMDMpKSB7CisJCWNoLT5jaF9iZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFB1dCB0aGUgZGF0YSBpbiB0aGUgY2lyY3VsYXIgY29tbWFuZCBidWZmZXIuCisJICovCisJd3JpdGViKGNtZCwgKGNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMCkpOworCXdyaXRlYigodWNoYXIpIGNoLT5jaF9wb3J0bnVtLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyAxKSk7CisJd3JpdGViKGJ5dGUxLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyAyKSk7CisJd3JpdGViKGJ5dGUyLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyAzKSk7CisKKwloZWFkID0gKGhlYWQgKyA0KSAmIChDTURNQVggLSBDTURTVEFSVCAtIDQpOworCisJd3JpdGV3KGhlYWQsICYoY21fYWRkci0+Y21faGVhZCkpOworCisJLyoKKwkgKiBXYWl0IGlmIG5lY2Vzc2FyeSBiZWZvcmUgdXBkYXRpbmcgdGhlIGhlYWQKKwkgKiBwb2ludGVyIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcKKwkgKiBjb21tYW5kcyB0byB0aGUgRkVQLiAgIElmIHRoZSB0aW1lIHNwZW50IHdhaXRpbmcKKwkgKiBpcyBvdXRsYW5kaXNoLCBkZWNsYXJlIHRoZSBGRVAgZGVhZC4KKwkgKi8KKwlmb3IgKGNvdW50ID0gZGdhcF9jb3VudCA7OykgeworCisJCWhlYWQgPSByZWFkdygmKGNtX2FkZHItPmNtX2hlYWQpKTsKKwkJdGFpbCA9IHJlYWR3KCYoY21fYWRkci0+Y21fdGFpbCkpOworCisJCW4gPSAoaGVhZCAtIHRhaWwpICYgKENNRE1BWCAtIENNRFNUQVJUIC0gNCk7CisKKwkJaWYgKG4gPD0gbmNtZHMgKiBzaXplb2Yoc3RydWN0IGNtX3QpKQorCQkJYnJlYWs7CisKKwkJaWYgKC0tY291bnQgPT0gMCkgeworCQkJY2gtPmNoX2JkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKKwkJCXJldHVybjsKKwkJfQorCQl1ZGVsYXkoMTApOworCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICAgICAgZGdhcF9jbWR3IC0gU2VuZHMgYSAxIHdvcmQgY29tbWFuZCB0byB0aGUgRkVQLgorICoKKyAqICAgICAgICAgICAgICBjaCAgICAgIC0gUG9pbnRlciB0byBjaGFubmVsIHN0cnVjdHVyZS4KKyAqICAgICAgICAgICAgICBjbWQgICAgIC0gQ29tbWFuZCB0byBiZSBzZW50LgorICogICAgICAgICAgICAgIHdvcmQgICAgLSBJbnRlZ2VyIGNvbnRhaW5pbmcgd29yZCB0byBiZSBzZW50LgorICogICAgICAgICAgICAgIG5jbWRzICAgLSBXYWl0IHVudGlsIG5jbWRzIG9yIGZld2VyIGNtZHMgYXJlIGxlZnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGNtZCBidWZmZXIgYmVmb3JlIHJldHVybmluZy4KKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIGRnYXBfY21kdyhzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdWNoYXIgY21kLCB1MTYgd29yZCwgdWludCBuY21kcykKK3sKKwljaGFyCQkqdmFkZHIgPSBOVUxMOworCXN0cnVjdCBjbV90CSpjbV9hZGRyID0gTlVMTDsKKwl1aW50CQljb3VudDsKKwl1aW50CQluOworCXUxNgkJaGVhZDsKKwl1MTYJCXRhaWw7CisKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCS8qCisJICogQ2hlY2sgaWYgYm9hcmQgaXMgc3RpbGwgYWxpdmUuCisJICovCisJaWYgKGNoLT5jaF9iZC0+c3RhdGUgPT0gQk9BUkRfRkFJTEVEKQorCQlyZXR1cm47CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgcG9pbnRlcnMgYXJlIGluIHJhbmdlIGJlZm9yZQorCSAqIHdyaXRpbmcgdG8gdGhlIEZFUCBtZW1vcnkuCisJICovCisJdmFkZHIgPSBjaC0+Y2hfYmQtPnJlX21hcF9tZW1iYXNlOworCWlmICghdmFkZHIpCisJCXJldHVybjsKKworCWNtX2FkZHIgPSAoc3RydWN0IGNtX3QgKikgKHZhZGRyICsgQ01EQlVGKTsKKwloZWFkID0gcmVhZHcoJihjbV9hZGRyLT5jbV9oZWFkKSk7CisKKwkvKgorCSAqIEZvcmdldCBpdCBpZiBwb2ludGVycyBvdXQgb2YgcmFuZ2UuCisJICovCisJaWYgKGhlYWQgPj0gKENNRE1BWCAtIENNRFNUQVJUKSB8fCAoaGVhZCAmIDAzKSkgeworCQljaC0+Y2hfYmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBQdXQgdGhlIGRhdGEgaW4gdGhlIGNpcmN1bGFyIGNvbW1hbmQgYnVmZmVyLgorCSAqLworCXdyaXRlYihjbWQsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDApKTsKKwl3cml0ZWIoKHVjaGFyKSBjaC0+Y2hfcG9ydG51bSwgKGNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMSkpOworCXdyaXRldygodTE2KSB3b3JkLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyAyKSk7CisKKwloZWFkID0gKGhlYWQgKyA0KSAmIChDTURNQVggLSBDTURTVEFSVCAtIDQpOworCisJd3JpdGV3KGhlYWQsICYoY21fYWRkci0+Y21faGVhZCkpOworCisJLyoKKwkgKiBXYWl0IGlmIG5lY2Vzc2FyeSBiZWZvcmUgdXBkYXRpbmcgdGhlIGhlYWQKKwkgKiBwb2ludGVyIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcKKwkgKiBjb21tYW5kcyB0byB0aGUgRkVQLiAgIElmIHRoZSB0aW1lIHNwZW50IHdhaXRpbmcKKwkgKiBpcyBvdXRsYW5kaXNoLCBkZWNsYXJlIHRoZSBGRVAgZGVhZC4KKwkgKi8KKwlmb3IgKGNvdW50ID0gZGdhcF9jb3VudCA7OykgeworCisJCWhlYWQgPSByZWFkdygmKGNtX2FkZHItPmNtX2hlYWQpKTsKKwkJdGFpbCA9IHJlYWR3KCYoY21fYWRkci0+Y21fdGFpbCkpOworCisJCW4gPSAoaGVhZCAtIHRhaWwpICYgKENNRE1BWCAtIENNRFNUQVJUIC0gNCk7CisKKwkJaWYgKG4gPD0gbmNtZHMgKiBzaXplb2Yoc3RydWN0IGNtX3QpKQorCQkJYnJlYWs7CisKKwkJaWYgKC0tY291bnQgPT0gMCkgeworCQkJY2gtPmNoX2JkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKKwkJCXJldHVybjsKKwkJfQorCQl1ZGVsYXkoMTApOworCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICAgICAgZGdhcF9jbWR3X2V4dCAtIFNlbmRzIGEgZXh0ZW5kZWQgd29yZCBjb21tYW5kIHRvIHRoZSBGRVAuCisgKgorICogICAgICAgICAgICAgIGNoICAgICAgLSBQb2ludGVyIHRvIGNoYW5uZWwgc3RydWN0dXJlLgorICogICAgICAgICAgICAgIGNtZCAgICAgLSBDb21tYW5kIHRvIGJlIHNlbnQuCisgKiAgICAgICAgICAgICAgd29yZCAgICAtIEludGVnZXIgY29udGFpbmluZyB3b3JkIHRvIGJlIHNlbnQuCisgKiAgICAgICAgICAgICAgbmNtZHMgICAtIFdhaXQgdW50aWwgbmNtZHMgb3IgZmV3ZXIgY21kcyBhcmUgbGVmdAorICogICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgY21kIGJ1ZmZlciBiZWZvcmUgcmV0dXJuaW5nLgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgZGdhcF9jbWR3X2V4dChzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdTE2IGNtZCwgdTE2IHdvcmQsIHVpbnQgbmNtZHMpCit7CisJY2hhcgkJKnZhZGRyID0gTlVMTDsKKwlzdHJ1Y3QgY21fdAkqY21fYWRkciA9IE5VTEw7CisJdWludAkJY291bnQ7CisJdWludAkJbjsKKwl1MTYJCWhlYWQ7CisJdTE2CQl0YWlsOworCisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwkvKgorCSAqIENoZWNrIGlmIGJvYXJkIGlzIHN0aWxsIGFsaXZlLgorCSAqLworCWlmIChjaC0+Y2hfYmQtPnN0YXRlID09IEJPQVJEX0ZBSUxFRCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIHBvaW50ZXJzIGFyZSBpbiByYW5nZSBiZWZvcmUKKwkgKiB3cml0aW5nIHRvIHRoZSBGRVAgbWVtb3J5LgorCSAqLworCXZhZGRyID0gY2gtPmNoX2JkLT5yZV9tYXBfbWVtYmFzZTsKKwlpZiAoIXZhZGRyKQorCQlyZXR1cm47CisKKwljbV9hZGRyID0gKHN0cnVjdCBjbV90ICopICh2YWRkciArIENNREJVRik7CisJaGVhZCA9IHJlYWR3KCYoY21fYWRkci0+Y21faGVhZCkpOworCisJLyoKKwkgKiBGb3JnZXQgaXQgaWYgcG9pbnRlcnMgb3V0IG9mIHJhbmdlLgorCSAqLworCWlmIChoZWFkID49IChDTURNQVggLSBDTURTVEFSVCkgfHwgKGhlYWQgJiAwMykpIHsKKwkJY2gtPmNoX2JkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogUHV0IHRoZSBkYXRhIGluIHRoZSBjaXJjdWxhciBjb21tYW5kIGJ1ZmZlci4KKwkgKi8KKworCS8qIFdyaXRlIGFuIEZGIHRvIHRlbGwgdGhlIEZFUCB0aGF0IHdlIHdhbnQgYW4gZXh0ZW5kZWQgY29tbWFuZCAqLworCXdyaXRlYigodWNoYXIpIDB4ZmYsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDApKTsKKworCXdyaXRlYigodWNoYXIpIGNoLT5jaF9wb3J0bnVtLCAodWNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMSkpOworCXdyaXRldygodTE2KSBjbWQsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDIpKTsKKworCS8qCisJICogSWYgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBjb21tYW5kIHdvbid0IGZpdCwKKwkgKiBwdXQgaXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyLgorCSAqLworCWlmICgoKGhlYWQgKyA0KSA+PSAoKENNRE1BWCAtIENNRFNUQVJUKSkgfHwgKGhlYWQgJiAwMykpKQorCQl3cml0ZXcoKHUxNikgd29yZCwgKGNoYXIgKikgKHZhZGRyICsgQ01EU1RBUlQpKTsKKwllbHNlCisJCXdyaXRldygodTE2KSB3b3JkLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyA0KSk7CisKKwloZWFkID0gKGhlYWQgKyA4KSAmIChDTURNQVggLSBDTURTVEFSVCAtIDQpOworCisJd3JpdGV3KGhlYWQsICYoY21fYWRkci0+Y21faGVhZCkpOworCisJLyoKKwkgKiBXYWl0IGlmIG5lY2Vzc2FyeSBiZWZvcmUgdXBkYXRpbmcgdGhlIGhlYWQKKwkgKiBwb2ludGVyIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcKKwkgKiBjb21tYW5kcyB0byB0aGUgRkVQLiAgIElmIHRoZSB0aW1lIHNwZW50IHdhaXRpbmcKKwkgKiBpcyBvdXRsYW5kaXNoLCBkZWNsYXJlIHRoZSBGRVAgZGVhZC4KKwkgKi8KKwlmb3IgKGNvdW50ID0gZGdhcF9jb3VudCA7OykgeworCisJCWhlYWQgPSByZWFkdygmKGNtX2FkZHItPmNtX2hlYWQpKTsKKwkJdGFpbCA9IHJlYWR3KCYoY21fYWRkci0+Y21fdGFpbCkpOworCisJCW4gPSAoaGVhZCAtIHRhaWwpICYgKENNRE1BWCAtIENNRFNUQVJUIC0gNCk7CisKKwkJaWYgKG4gPD0gbmNtZHMgKiBzaXplb2Yoc3RydWN0IGNtX3QpKQorCQkJYnJlYWs7CisKKwkJaWYgKC0tY291bnQgPT0gMCkgeworCQkJY2gtPmNoX2JkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKKwkJCXJldHVybjsKKwkJfQorCQl1ZGVsYXkoMTApOworCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICAgICAgZGdhcF93bW92ZSAtIFdyaXRlIGRhdGEgdG8gRkVQIGJ1ZmZlci4KKyAqCisgKiAgICAgICAgICAgICAgY2ggICAgICAtIFBvaW50ZXIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUuCisgKiAgICAgICAgICAgICAgYnVmICAgICAtIFBvaXRlciB0byBjaGFyYWN0ZXJzIHRvIGJlIG1vdmVkLgorICogICAgICAgICAgICAgIGNudCAgICAgLSBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBtb3ZlLgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgZGdhcF93bW92ZShzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgY2hhciAqYnVmLCB1aW50IGNudCkKK3sKKwlpbnQgICAgbjsKKwljaGFyICAgKnRhZGRyOworCXN0cnVjdCBic190ICAgICpiczsKKwl1MTYgICAgaGVhZDsKKworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBDaGVjayBwYXJhbWV0ZXJzLgorCSAqLworCWJzICAgPSBjaC0+Y2hfYnM7CisJaGVhZCA9IHJlYWR3KCYoYnMtPnR4X2hlYWQpKTsKKworCS8qCisJICogSWYgcG9pbnRlcnMgYXJlIG91dCBvZiByYW5nZSwganVzdCByZXR1cm4uCisJICovCisJaWYgKChjbnQgPiBjaC0+Y2hfdHNpemUpIHx8CisJICAgICh1bnNpZ25lZCkoaGVhZCAtIGNoLT5jaF90c3RhcnQpID49IGNoLT5jaF90c2l6ZSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZiB0aGUgd3JpdGUgd3JhcHMgb3ZlciB0aGUgdG9wIG9mIHRoZSBjaXJjdWxhciBidWZmZXIsCisJICogbW92ZSB0aGUgcG9ydGlvbiB1cCB0byB0aGUgd3JhcCBwb2ludCwgYW5kIHJlc2V0IHRoZQorCSAqIHBvaW50ZXJzIHRvIHRoZSBib3R0b20uCisJICovCisJbiA9IGNoLT5jaF90c3RhcnQgKyBjaC0+Y2hfdHNpemUgLSBoZWFkOworCisJaWYgKGNudCA+PSBuKSB7CisJCWNudCAtPSBuOworCQl0YWRkciA9IGNoLT5jaF90YWRkciArIGhlYWQ7CisJCW1lbWNweV90b2lvKHRhZGRyLCBidWYsIG4pOworCQloZWFkID0gY2gtPmNoX3RzdGFydDsKKwkJYnVmICs9IG47CisJfQorCisJLyoKKwkgKiBNb3ZlIHJlc3Qgb2YgZGF0YS4KKwkgKi8KKwl0YWRkciA9IGNoLT5jaF90YWRkciArIGhlYWQ7CisJbiA9IGNudDsKKwltZW1jcHlfdG9pbyh0YWRkciwgYnVmLCBuKTsKKwloZWFkICs9IGNudDsKKworCXdyaXRldyhoZWFkLCAmKGJzLT50eF9oZWFkKSk7Cit9CisKKy8qCisgKiBSZXRyaXZlcyB0aGUgY3VycmVudCBjdXN0b20gYmF1ZCByYXRlIGZyb20gRkVQIG1lbW9yeSwKKyAqIGFuZCByZXR1cm5zIGl0IGJhY2sgdG8gdGhlIHVzZXIuCisgKiBSZXR1cm5zIDAgb24gZXJyb3IuCisgKi8KK3N0YXRpYyB1aW50IGRnYXBfZ2V0X2N1c3RvbV9iYXVkKHN0cnVjdCBjaGFubmVsX3QgKmNoKQoreworCXVjaGFyICp2YWRkcjsKKwl1bG9uZyBvZmZzZXQgPSAwOworCXVpbnQgdmFsdWUgPSAwOworCisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gMDsKKworCWlmICghY2gtPmNoX2JkIHx8IGNoLT5jaF9iZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShjaC0+Y2hfYmQtPmJkX2ZsYWdzICYgQkRfRkVQNVBMVVMpKQorCQlyZXR1cm4gMDsKKworCXZhZGRyID0gY2gtPmNoX2JkLT5yZV9tYXBfbWVtYmFzZTsKKworCWlmICghdmFkZHIpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBHbyBnZXQgZnJvbSBmZXAgbWVtLCB3aGF0IHRoZSBmZXAKKwkgKiBiZWxpZXZlcyB0aGUgY3VzdG9tIGJhdWQgcmF0ZSBpcy4KKwkgKi8KKwlvZmZzZXQgPSAoKCgoKih1bnNpZ25lZCBzaG9ydCAqKSh2YWRkciArIEVDU19TRUcpKSA8PCA0KSArCisJCShjaC0+Y2hfcG9ydG51bSAqIDB4MjgpICsgTElORV9TUEVFRCkpOworCisJdmFsdWUgPSByZWFkdyh2YWRkciArIG9mZnNldCk7CisJcmV0dXJuIHZhbHVlOworfQorCisvKgorICogQ2FsbHMgdGhlIGZpcm13YXJlIHRvIHJlc2V0IHRoaXMgY2hhbm5lbC4KKyAqLworc3RhdGljIHZvaWQgZGdhcF9maXJtd2FyZV9yZXNldF9wb3J0KHN0cnVjdCBjaGFubmVsX3QgKmNoKQoreworCWRnYXBfY21kYihjaCwgQ0hSRVNFVCwgMCwgMCwgMCk7CisKKwkvKgorCSAqIE5vdyB0aGF0IHRoZSBjaGFubmVsIGlzIHJlc2V0LCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorCSAqIGFsbCB0aGUgY3VycmVudCBzZXR0aW5ncyBnZXQgcmVhcHBsaWVkIHRvIHRoZSBwb3J0CisJICogaW4gdGhlIGZpcm13YXJlLgorCSAqCisJICogU28gd2Ugd2lsbCBzZXQgdGhlIGRyaXZlcidzIGNhY2hlIG9mIGZpcm13YXJlCisJICogc2V0dGluZ3MgYWxsIHRvIDAsIGFuZCB0aGVuIGNhbGwgcGFyYW0uCisJICovCisJY2gtPmNoX2ZlcGlmbGFnID0gMDsKKwljaC0+Y2hfZmVwY2ZsYWcgPSAwOworCWNoLT5jaF9mZXBvZmxhZyA9IDA7CisJY2gtPmNoX2ZlcHN0YXJ0YyA9IDA7CisJY2gtPmNoX2ZlcHN0b3BjID0gMDsKKwljaC0+Y2hfZmVwYXN0YXJ0YyA9IDA7CisJY2gtPmNoX2ZlcGFzdG9wYyA9IDA7CisJY2gtPmNoX21vc3RhdCA9IDA7CisJY2gtPmNoX2hmbG93ID0gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICAgICAgZGdhcF9wYXJhbSAtIFNldCBEaWdpIHBhcmFtZXRlcnMuCisgKgorICogICAgICAgICAgICAgIHN0cnVjdCB0dHlfc3RydWN0ICogICAgIC0gVFRZIGZvciBwb3J0LgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCBkZ2FwX3BhcmFtKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGt0ZXJtaW9zICp0czsKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IGJzX3QgICAqYnM7CisJc3RydWN0IHVuX3QgICAqdW47CisJdTE2CWhlYWQ7CisJdTE2CWNmbGFnOworCXUxNglpZmxhZzsKKwl1Y2hhcgltdmFsOworCXVjaGFyCWhmbG93OworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiAtRU5YSU87CisKKwl1biA9IChzdHJ1Y3QgdW5fdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiAtRU5YSU87CisKKwlicyA9IGNoLT5jaF9iczsKKwlpZiAoIWJzKQorCQlyZXR1cm4gLUVOWElPOworCisJdHMgPSAmdHR5LT50ZXJtaW9zOworCisJLyoKKwkgKiBJZiBiYXVkIHJhdGUgaXMgemVybywgZmx1c2ggcXVldWVzLCBhbmQgc2V0IG12YWwgdG8gZHJvcCBEVFIuCisJICovCisJaWYgKChjaC0+Y2hfY19jZmxhZyAmIChDQkFVRCkpID09IDApIHsKKworCQkvKiBmbHVzaCByeCAqLworCQloZWFkID0gcmVhZHcoJihjaC0+Y2hfYnMtPnJ4X2hlYWQpKTsKKwkJd3JpdGV3KGhlYWQsICYoY2gtPmNoX2JzLT5yeF90YWlsKSk7CisKKwkJLyogZmx1c2ggdHggKi8KKwkJaGVhZCA9IHJlYWR3KCYoY2gtPmNoX2JzLT50eF9oZWFkKSk7CisJCXdyaXRldyhoZWFkLCAmKGNoLT5jaF9icy0+dHhfdGFpbCkpOworCisJCWNoLT5jaF9mbGFncyB8PSAoQ0hfQkFVRDApOworCisJCS8qIERyb3AgUlRTIGFuZCBEVFIgKi8KKwkJY2gtPmNoX212YWwgJj0gfihEX1JUUyhjaCl8RF9EVFIoY2gpKTsKKwkJbXZhbCA9IERfRFRSKGNoKSB8IERfUlRTKGNoKTsKKwkJY2gtPmNoX2JhdWRfaW5mbyA9IDA7CisKKwl9IGVsc2UgaWYgKGNoLT5jaF9jdXN0b21fc3BlZWQgJiYgKGJkLT5iZF9mbGFncyAmIEJEX0ZFUDVQTFVTKSkgeworCQkvKgorCQkgKiBUZWxsIHRoZSBmZXAgdG8gZG8gdGhlIGNvbW1hbmQKKwkJICovCisKKwkJZGdhcF9jbWR3X2V4dChjaCwgMHhmZjAxLCBjaC0+Y2hfY3VzdG9tX3NwZWVkLCAwKTsKKworCQkvKgorCQkgKiBOb3cgZ28gZ2V0IGZyb20gZmVwIG1lbSwgd2hhdCB0aGUgZmVwCisJCSAqIGJlbGlldmVzIHRoZSBjdXN0b20gYmF1ZCByYXRlIGlzLgorCQkgKi8KKwkJY2gtPmNoX2N1c3RvbV9zcGVlZCA9IGRnYXBfZ2V0X2N1c3RvbV9iYXVkKGNoKTsKKwkJY2gtPmNoX2JhdWRfaW5mbyA9IGNoLT5jaF9jdXN0b21fc3BlZWQ7CisKKwkJLyogSGFuZGxlIHRyYW5zaXRpb24gZnJvbSBCMCAqLworCQlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfQkFVRDApIHsKKwkJCWNoLT5jaF9mbGFncyAmPSB+KENIX0JBVUQwKTsKKwkJCWNoLT5jaF9tdmFsIHw9IChEX1JUUyhjaCl8RF9EVFIoY2gpKTsKKwkJfQorCQltdmFsID0gRF9EVFIoY2gpIHwgRF9SVFMoY2gpOworCisJfSBlbHNlIHsKKwkJLyoKKwkJICogU2V0IGJhdWQgcmF0ZSwgY2hhcmFjdGVyIHNpemUsIGFuZCBwYXJpdHkuCisJCSAqLworCisKKwkJaW50IGlpbmRleCA9IDA7CisJCWludCBqaW5kZXggPSAwOworCQlpbnQgYmF1ZCA9IDA7CisKKwkJdWxvbmcgYmF1ZHNbNF1bMTZdID0geworCQkJeyAvKiBzbG93YmF1ZCAqLworCQkJCTAsCTUwLAk3NSwJMTEwLAorCQkJCTEzNCwJMTUwLAkyMDAsCTMwMCwKKwkJCQk2MDAsCTEyMDAsCTE4MDAsCTI0MDAsCisJCQkJNDgwMCwJOTYwMCwJMTkyMDAsCTM4NDAwIH0sCisJCQl7IC8qIHNsb3diYXVkICYgQ0JBVURFWCAqLworCQkJCTAsCTU3NjAwLAkxMTUyMDAsCTIzMDQwMCwKKwkJCQk0NjA4MDAsCTE1MCwJMjAwLAk5MjE2MDAsCisJCQkJNjAwLAkxMjAwLAkxODAwLAkyNDAwLAorCQkJCTQ4MDAsCTk2MDAsCTE5MjAwLAkzODQwMCB9LAorCQkJeyAvKiBmYXN0YmF1ZCAqLworCQkJCTAsCTU3NjAwLAk3NjgwMCwJMTE1MjAwLAorCQkJCTE0NDAwLAk1NzYwMCwJMjMwNDAwLAk3NjgwMCwKKwkJCQkxMTUyMDAsCTIzMDQwMCwJMjg4MDAsCTQ2MDgwMCwKKwkJCQk5MjE2MDAsCTk2MDAsCTE5MjAwLAkzODQwMCB9LAorCQkJeyAvKiBmYXN0YmF1ZCAmIENCQVVERVggKi8KKwkJCQkwLAk1NzYwMCwJMTE1MjAwLAkyMzA0MDAsCisJCQkJNDYwODAwLAkxNTAsCTIwMCwJOTIxNjAwLAorCQkJCTYwMCwJMTIwMCwJMTgwMCwJMjQwMCwKKwkJCQk0ODAwLAk5NjAwLAkxOTIwMCwJMzg0MDAgfQorCQl9OworCisJCS8qCisJCSAqIE9ubHkgdXNlIHRoZSBUWFByaW50IGJhdWQgcmF0ZSBpZiB0aGUKKwkJICogdGVybWluYWwgdW5pdCBpcyBOT1Qgb3BlbgorCQkgKi8KKwkJaWYgKCEoY2gtPmNoX3R1bi51bl9mbGFncyAmIFVOX0lTT1BFTikgJiYKKwkJICAgICAodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkpCisJCQliYXVkID0gQ19CQVVEKGNoLT5jaF9wdW4udW5fdHR5KSAmIDB4ZmY7CisJCWVsc2UKKwkJCWJhdWQgPSBDX0JBVUQoY2gtPmNoX3R1bi51bl90dHkpICYgMHhmZjsKKworCQlpZiAoY2gtPmNoX2NfY2ZsYWcgJiBDQkFVREVYKQorCQkJaWluZGV4ID0gMTsKKworCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfRkFTVCkKKwkJCWlpbmRleCArPSAyOworCisJCWppbmRleCA9IGJhdWQ7CisKKwkJaWYgKChpaW5kZXggPj0gMCkgJiYgKGlpbmRleCA8IDQpICYmCisJCSAgICAoamluZGV4ID49IDApICYmIChqaW5kZXggPCAxNikpCisJCQliYXVkID0gYmF1ZHNbaWluZGV4XVtqaW5kZXhdOworCQllbHNlCisJCQliYXVkID0gMDsKKworCQlpZiAoYmF1ZCA9PSAwKQorCQkJYmF1ZCA9IDk2MDA7CisKKwkJY2gtPmNoX2JhdWRfaW5mbyA9IGJhdWQ7CisKKwkJLyoKKwkJICogQ0JBVUQgaGFzIGJpdCBwb3NpdGlvbiAweDEwMDAgc2V0IHRoZXNlIGRheXMgdG8KKwkJICogaW5kaWNhdGUgTGludXggYmF1ZCByYXRlIHJlbWFwLgorCQkgKiBXZSB1c2UgYSBkaWZmZXJlbnQgYml0IGFzc2lnbm1lbnQgZm9yIGhpZ2ggc3BlZWQuCisJCSAqIENsZWFyIHRoaXMgYml0IG91dCB3aGlsZSBncmFiYmluZyB0aGUgcGFydHMgb2YKKwkJICogImNmbGFnIiB3ZSB3YW50LgorCQkgKi8KKwkJY2ZsYWcgPSBjaC0+Y2hfY19jZmxhZyAmICgoQ0JBVUQgXiBDQkFVREVYKSB8IFBBUk9ERCB8IFBBUkVOQiB8CisJCQkJCQkgICBDU1RPUEIgfCBDU0laRSk7CisKKwkJLyoKKwkJICogSFVQQ0wgYml0IGlzIHVzZWQgYnkgRkVQIHRvIGluZGljYXRlIGZhc3QgYmF1ZAorCQkgKiB0YWJsZSBpcyB0byBiZSB1c2VkLgorCQkgKi8KKwkJaWYgKChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9GQVNUKSB8fAorCQkgICAgKGNoLT5jaF9jX2NmbGFnICYgQ0JBVURFWCkpCisJCQljZmxhZyB8PSBIVVBDTDsKKworCQlpZiAoKGNoLT5jaF9jX2NmbGFnICYgQ0JBVURFWCkgJiYKKwkJICAgICEoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfRkFTVCkpIHsKKwkJCS8qCisJCQkgKiBUaGUgYmVsb3cgY29kZSBpcyB0cnlpbmcgdG8gZ3VhcmFudGVlIHRoYXQgb25seQorCQkJICogYmF1ZCByYXRlcyAxMTUyMDAsIDIzMDQwMCwgNDYwODAwLCA5MjE2MDAgYXJlCisJCQkgKiByZW1hcHBlZC4gV2UgdXNlIGV4Y2x1c2l2ZSBvciAgYmVjYXVzZSB0aGUgdmFyaW91cworCQkJICogYmF1ZCByYXRlcyBzaGFyZSBjb21tb24gYml0IHBvc2l0aW9ucyBhbmQgdGhlcmVmb3JlCisJCQkgKiBjYW4ndCBiZSB0ZXN0ZWQgZm9yIGVhc2lseS4KKwkJCSAqLworCQkJdGNmbGFnX3QgdGNmbGFnID0gKGNoLT5jaF9jX2NmbGFnICYgQ0JBVUQpIHwgQ0JBVURFWDsKKwkJCWludCBiYXVkcGFydCA9IDA7CisKKwkJCS8qCisJCQkgKiBNYXAgaGlnaCBzcGVlZCByZXF1ZXN0cyB0byBpbmRleAorCQkJICogaW50byBGRVAncyBiYXVkIHRhYmxlCisJCQkgKi8KKwkJCXN3aXRjaCAodGNmbGFnKSB7CisJCQljYXNlIEI1NzYwMDoKKwkJCQliYXVkcGFydCA9IDE7CisJCQkJYnJlYWs7CisjaWZkZWYgQjc2ODAwCisJCQljYXNlIEI3NjgwMDoKKwkJCQliYXVkcGFydCA9IDI7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCWNhc2UgQjExNTIwMDoKKwkJCQliYXVkcGFydCA9IDM7CisJCQkJYnJlYWs7CisJCQljYXNlIEIyMzA0MDA6CisJCQkJYmF1ZHBhcnQgPSA5OworCQkJCWJyZWFrOworCQkJY2FzZSBCNDYwODAwOgorCQkJCWJhdWRwYXJ0ID0gMTE7CisJCQkJYnJlYWs7CisjaWZkZWYgQjkyMTYwMAorCQkJY2FzZSBCOTIxNjAwOgorCQkJCWJhdWRwYXJ0ID0gMTI7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCWRlZmF1bHQ6CisJCQkJYmF1ZHBhcnQgPSAwOworCQkJfQorCisJCQlpZiAoYmF1ZHBhcnQpCisJCQkJY2ZsYWcgPSAoY2ZsYWcgJiB+KENCQVVEIHwgQ0JBVURFWCkpIHwgYmF1ZHBhcnQ7CisJCX0KKworCQljZmxhZyAmPSAweGZmZmY7CisKKwkJaWYgKGNmbGFnICE9IGNoLT5jaF9mZXBjZmxhZykgeworCQkJY2gtPmNoX2ZlcGNmbGFnID0gKHUxNikgKGNmbGFnICYgMHhmZmZmKTsKKworCQkJLyoKKwkJCSAqIE9rYXkgdG8gaGF2ZSBjaGFubmVsIGFuZCBib2FyZAorCQkJICogbG9ja3MgaGVsZCBjYWxsaW5nIHRoaXMKKwkJCSAqLworCQkJZGdhcF9jbWR3KGNoLCBTQ0ZMQUcsICh1MTYpIGNmbGFnLCAwKTsKKwkJfQorCisJCS8qIEhhbmRsZSB0cmFuc2l0aW9uIGZyb20gQjAgKi8KKwkJaWYgKGNoLT5jaF9mbGFncyAmIENIX0JBVUQwKSB7CisJCQljaC0+Y2hfZmxhZ3MgJj0gfihDSF9CQVVEMCk7CisJCQljaC0+Y2hfbXZhbCB8PSAoRF9SVFMoY2gpfERfRFRSKGNoKSk7CisJCX0KKwkJbXZhbCA9IERfRFRSKGNoKSB8IERfUlRTKGNoKTsKKwl9CisKKwkvKgorCSAqIEdldCBpbnB1dCBmbGFncy4KKwkgKi8KKwlpZmxhZyA9IGNoLT5jaF9jX2lmbGFnICYgKElHTkJSSyB8IEJSS0lOVCB8IElHTlBBUiB8IFBBUk1SSyB8CisJCQkJICBJTlBDSyB8IElTVFJJUCB8IElYT04gfCBJWEFOWSB8IElYT0ZGKTsKKworCWlmICgoY2gtPmNoX3N0YXJ0YyA9PSBfUE9TSVhfVkRJU0FCTEUpIHx8CisJICAgIChjaC0+Y2hfc3RvcGMgPT0gX1BPU0lYX1ZESVNBQkxFKSkgeworCQlpZmxhZyAmPSB+KElYT04gfCBJWE9GRik7CisJCWNoLT5jaF9jX2lmbGFnICY9IH4oSVhPTiB8IElYT0ZGKTsKKwl9CisKKwkvKgorCSAqIE9ubHkgdGhlIElCTSBYciBjYXJkIGNhbiBzd2l0Y2ggYmV0d2VlbgorCSAqIDIzMiBhbmQgNDIyIG1vZGVzIG9uIHRoZSBmbHkKKwkgKi8KKwlpZiAoYmQtPmRldmljZSA9PSBQQ0lfREVWX1hSX0lCTV9ESUQpIHsKKwkJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJXzQyMikKKwkJCWRnYXBfY21kYihjaCwgU0NPTU1PREUsIE1PREVfNDIyLCAwLCAwKTsKKwkJZWxzZQorCQkJZGdhcF9jbWRiKGNoLCBTQ09NTU9ERSwgTU9ERV8yMzIsIDAsIDApOworCX0KKworCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9BTFRQSU4pCisJCWlmbGFnIHw9IElBTFRQSU47CisKKwlpZiAoaWZsYWcgIT0gY2gtPmNoX2ZlcGlmbGFnKSB7CisJCWNoLT5jaF9mZXBpZmxhZyA9IGlmbGFnOworCisJCS8qIE9rYXkgdG8gaGF2ZSBjaGFubmVsIGFuZCBib2FyZCBsb2NrcyBoZWxkIGNhbGxpbmcgdGhpcyAqLworCQlkZ2FwX2NtZHcoY2gsIFNJRkxBRywgKHUxNikgY2gtPmNoX2ZlcGlmbGFnLCAwKTsKKwl9CisKKwkvKgorCSAqIFNlbGVjdCBoYXJkd2FyZSBoYW5kc2hha2luZy4KKwkgKi8KKwloZmxvdyA9IDA7CisKKwlpZiAoY2gtPmNoX2NfY2ZsYWcgJiBDUlRTQ1RTKQorCQloZmxvdyB8PSAoRF9SVFMoY2gpIHwgRF9DVFMoY2gpKTsKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIFJUU1BBQ0UpCisJCWhmbG93IHw9IERfUlRTKGNoKTsKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERUUlBBQ0UpCisJCWhmbG93IHw9IERfRFRSKGNoKTsKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIENUU1BBQ0UpCisJCWhmbG93IHw9IERfQ1RTKGNoKTsKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERTUlBBQ0UpCisJCWhmbG93IHw9IERfRFNSKGNoKTsKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERDRFBBQ0UpCisJCWhmbG93IHw9IERfQ0QoY2gpOworCisJaWYgKGhmbG93ICE9IGNoLT5jaF9oZmxvdykgeworCQljaC0+Y2hfaGZsb3cgPSBoZmxvdzsKKworCQkvKiBPa2F5IHRvIGhhdmUgY2hhbm5lbCBhbmQgYm9hcmQgbG9ja3MgaGVsZCBjYWxsaW5nIHRoaXMgKi8KKwkJZGdhcF9jbWRiKGNoLCBTSEZMT1csICh1Y2hhcikgaGZsb3csIDB4ZmYsIDApOworCX0KKworCisJLyoKKwkgKiBTZXQgUlRTIGFuZC9vciBEVFIgVG9nZ2xlIGlmIG5lZWRlZCwKKwkgKiBidXQgb25seSBpZiBwcm9kdWN0IGlzIEZFUDUrIGJhc2VkLgorCSAqLworCWlmIChiZC0+YmRfZmxhZ3MgJiBCRF9GRVA1UExVUykgeworCQl1MTYgaGZsb3cyID0gMDsKKwkJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX1JUU19UT0dHTEUpCisJCQloZmxvdzIgfD0gKERfUlRTKGNoKSk7CisJCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9EVFJfVE9HR0xFKQorCQkJaGZsb3cyIHw9IChEX0RUUihjaCkpOworCisJCWRnYXBfY21kd19leHQoY2gsIDB4ZmYwMywgaGZsb3cyLCAwKTsKKwl9CisKKwkvKgorCSAqIFNldCBtb2RlbSBjb250cm9sIGxpbmVzLgorCSAqLworCisJbXZhbCBePSBjaC0+Y2hfbWZvcmNlICYgKG12YWwgXiBjaC0+Y2hfbXZhbCk7CisKKwlpZiAoY2gtPmNoX21vc3RhdCBeIG12YWwpIHsKKwkJY2gtPmNoX21vc3RhdCA9IG12YWw7CisKKwkJLyogT2theSB0byBoYXZlIGNoYW5uZWwgYW5kIGJvYXJkIGxvY2tzIGhlbGQgY2FsbGluZyB0aGlzICovCisJCWRnYXBfY21kYihjaCwgU01PREVNLCAodWNoYXIpIG12YWwsIERfUlRTKGNoKXxEX0RUUihjaCksIDApOworCX0KKworCS8qCisJICogUmVhZCBtb2RlbSBzaWduYWxzLCBhbmQgdGhlbiBjYWxsIGNhcnJpZXIgZnVuY3Rpb24uCisJICovCisJY2gtPmNoX21pc3RhdCA9IHJlYWRiKCYoYnMtPm1fc3RhdCkpOworCWRnYXBfY2FycmllcihjaCk7CisKKwkvKgorCSAqIFNldCB0aGUgc3RhcnQgYW5kIHN0b3AgY2hhcmFjdGVycy4KKwkgKi8KKwlpZiAoY2gtPmNoX3N0YXJ0YyAhPSBjaC0+Y2hfZmVwc3RhcnRjIHx8CisJICAgIGNoLT5jaF9zdG9wYyAhPSBjaC0+Y2hfZmVwc3RvcGMpIHsKKwkJY2gtPmNoX2ZlcHN0YXJ0YyA9IGNoLT5jaF9zdGFydGM7CisJCWNoLT5jaF9mZXBzdG9wYyA9ICBjaC0+Y2hfc3RvcGM7CisKKwkJLyogT2theSB0byBoYXZlIGNoYW5uZWwgYW5kIGJvYXJkIGxvY2tzIGhlbGQgY2FsbGluZyB0aGlzICovCisJCWRnYXBfY21kYihjaCwgU0ZMT1dDLCBjaC0+Y2hfZmVwc3RhcnRjLCBjaC0+Y2hfZmVwc3RvcGMsIDApOworCX0KKworCS8qCisJICogU2V0IHRoZSBBdXhpbGlhcnkgc3RhcnQgYW5kIHN0b3AgY2hhcmFjdGVycy4KKwkgKi8KKwlpZiAoY2gtPmNoX2FzdGFydGMgIT0gY2gtPmNoX2ZlcGFzdGFydGMgfHwKKwkgICAgY2gtPmNoX2FzdG9wYyAhPSBjaC0+Y2hfZmVwYXN0b3BjKSB7CisJCWNoLT5jaF9mZXBhc3RhcnRjID0gY2gtPmNoX2FzdGFydGM7CisJCWNoLT5jaF9mZXBhc3RvcGMgPSBjaC0+Y2hfYXN0b3BjOworCisJCS8qIE9rYXkgdG8gaGF2ZSBjaGFubmVsIGFuZCBib2FyZCBsb2NrcyBoZWxkIGNhbGxpbmcgdGhpcyAqLworCQlkZ2FwX2NtZGIoY2gsIFNBRkxPV0MsIGNoLT5jaF9mZXBhc3RhcnRjLCBjaC0+Y2hfZmVwYXN0b3BjLCAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRnYXBfcGFyaXR5X3NjYW4oKQorICoKKyAqIENvbnZlcnQgdGhlIEZFUDUgd2F5IG9mIHJlcG9ydGluZyBwYXJpdHkgZXJyb3JzIGFuZCBicmVha3MgaW50bworICogdGhlIExpbnV4IGxpbmUgZGlzY2lwbGluZSB3YXkuCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfcGFyaXR5X3NjYW4oc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVuc2lnbmVkIGNoYXIgKmNidWYsCisJCQkJdW5zaWduZWQgY2hhciAqZmJ1ZiwgaW50ICpsZW4pCit7CisJaW50IGwgPSAqbGVuOworCWludCBjb3VudCA9IDA7CisJdW5zaWduZWQgY2hhciAqaW4sICpjb3V0LCAqZm91dDsKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwlpbiA9IGNidWY7CisJY291dCA9IGNidWY7CisJZm91dCA9IGZidWY7CisKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCXdoaWxlIChsLS0pIHsKKwkJYyA9ICppbisrOworCQlzd2l0Y2ggKGNoLT5wc2Nhbl9zdGF0ZSkgeworCQlkZWZhdWx0OgorCQkJLyogcmVzZXQgdG8gc2FuaXR5IGFuZCBmYWxsIHRocm91Z2ggKi8KKwkJCWNoLT5wc2Nhbl9zdGF0ZSA9IDA7CisKKwkJY2FzZSAwOgorCQkJLyogTm8gRkYgc2VlbiB5ZXQgKi8KKwkJCWlmIChjID09ICh1bnNpZ25lZCBjaGFyKSAnXDM3NycpCisJCQkJLyogZGVsZXRlIHRoaXMgY2hhcmFjdGVyIGZyb20gc3RyZWFtICovCisJCQkJY2gtPnBzY2FuX3N0YXRlID0gMTsKKwkJCWVsc2UgeworCQkJCSpjb3V0KysgPSBjOworCQkJCSpmb3V0KysgPSBUVFlfTk9STUFMOworCQkJCWNvdW50ICs9IDE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDE6CisJCQkvKiBmaXJzdCBGRiBzZWVuICovCisJCQlpZiAoYyA9PSAodW5zaWduZWQgY2hhcikgJ1wzNzcnKSB7CisJCQkJLyogZG91YmxlZCBmZiwgdHJhbnNmb3JtIHRvIHNpbmdsZSBmZiAqLworCQkJCSpjb3V0KysgPSBjOworCQkJCSpmb3V0KysgPSBUVFlfTk9STUFMOworCQkJCWNvdW50ICs9IDE7CisJCQkJY2gtPnBzY2FuX3N0YXRlID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJLyogc2F2ZSB2YWx1ZSBleGFtaW5hdGlvbiBpbiBuZXh0IHN0YXRlICovCisJCQkJY2gtPnBzY2FuX3NhdmVjaGFyID0gYzsKKwkJCQljaC0+cHNjYW5fc3RhdGUgPSAyOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAyOgorCQkJLyogdGhpcmQgY2hhcmFjdGVyIG9mIGZmIHNlcXVlbmNlICovCisKKwkJCSpjb3V0KysgPSBjOworCisJCQlpZiAoY2gtPnBzY2FuX3NhdmVjaGFyID09IDB4MCkgeworCisJCQkJaWYgKGMgPT0gMHgwKSB7CisJCQkJCWNoLT5jaF9lcnJfYnJlYWsrKzsKKwkJCQkJKmZvdXQrKyA9IFRUWV9CUkVBSzsKKwkJCQl9IGVsc2UgeworCQkJCQljaC0+Y2hfZXJyX3Bhcml0eSsrOworCQkJCQkqZm91dCsrID0gVFRZX1BBUklUWTsKKwkJCQl9CisJCQl9CisKKwkJCWNvdW50ICs9IDE7CisJCQljaC0+cHNjYW5fc3RhdGUgPSAwOworCQl9CisJfQorCSpsZW4gPSBjb3VudDsKK30KKworc3RhdGljIHZvaWQgZGdhcF93cml0ZV93YWtldXAoc3RydWN0IGJvYXJkX3QgKmJkLCBzdHJ1Y3QgY2hhbm5lbF90ICpjaCwKKwkJCSAgICAgIHN0cnVjdCB1bl90ICp1biwgdTMyIG1hc2ssCisJCQkgICAgICB1bnNpZ25lZCBsb25nICppcnFfZmxhZ3MxLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyAqaXJxX2ZsYWdzMikKK3sKKwlpZiAoISh1bi0+dW5fZmxhZ3MgJiBtYXNrKSkKKwkJcmV0dXJuOworCisJdW4tPnVuX2ZsYWdzICY9IH5tYXNrOworCisJaWYgKCEodW4tPnVuX2ZsYWdzICYgVU5fSVNPUEVOKSkKKwkJcmV0dXJuOworCisJaWYgKCh1bi0+dW5fdHR5LT5mbGFncyAmICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApKSAmJgorCSAgICB1bi0+dW5fdHR5LT5sZGlzYy0+b3BzLT53cml0ZV93YWtldXApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssICppcnFfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssICppcnFfZmxhZ3MxKTsKKworCQkodW4tPnVuX3R0eS0+bGRpc2MtPm9wcy0+d3JpdGVfd2FrZXVwKSh1bi0+dW5fdHR5KTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssICppcnFfZmxhZ3MxKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCAqaXJxX2ZsYWdzMik7CisJfQorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdW4tPnVuX3R0eS0+d3JpdGVfd2FpdCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ1bi0+dW5fZmxhZ3Nfd2FpdCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiAgICAgIGRnYXBfZXZlbnQgLSBGRVAgdG8gaG9zdCBldmVudCBwcm9jZXNzaW5nIHJvdXRpbmUuCisgKgorICogICAgICAgICAgICAgIGJkICAgICAtIEJvYXJkIG9mIGN1cnJlbnQgZXZlbnQuCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IGRnYXBfZXZlbnQoc3RydWN0IGJvYXJkX3QgKmJkKQoreworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXVsb25nCQlsb2NrX2ZsYWdzOworCXVsb25nCQlsb2NrX2ZsYWdzMjsKKwlzdHJ1Y3QgYnNfdAkqYnM7CisJdWNoYXIJCSpldmVudDsKKwl1Y2hhcgkJKnZhZGRyID0gTlVMTDsKKwlzdHJ1Y3QgZXZfdAkqZWFkZHIgPSBOVUxMOworCXVpbnQJCWhlYWQ7CisJdWludAkJdGFpbDsKKwlpbnQJCXBvcnQ7CisJaW50CQlyZWFzb247CisJaW50CQltb2RlbTsKKwlpbnQJCWIxOworCisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIC1FTlhJTzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwl2YWRkciA9IGJkLT5yZV9tYXBfbWVtYmFzZTsKKworCWlmICghdmFkZHIpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWVhZGRyID0gKHN0cnVjdCBldl90ICopICh2YWRkciArIEVWQlVGKTsKKworCS8qIEdldCBvdXIgaGVhZCBhbmQgdGFpbCAqLworCWhlYWQgPSByZWFkdygmKGVhZGRyLT5ldl9oZWFkKSk7CisJdGFpbCA9IHJlYWR3KCYoZWFkZHItPmV2X3RhaWwpKTsKKworCS8qCisJICogRm9yZ2V0IGl0IGlmIHBvaW50ZXJzIG91dCBvZiByYW5nZS4KKwkgKi8KKworCWlmIChoZWFkID49IEVWTUFYIC0gRVZTVEFSVCB8fCB0YWlsID49IEVWTUFYIC0gRVZTVEFSVCB8fAorCSAgICAoaGVhZCB8IHRhaWwpICYgMDMpIHsKKwkJLyogTGV0IGdvIG9mIGJvYXJkIGxvY2sgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qCisJICogTG9vcCB0byBwcm9jZXNzIGFsbCB0aGUgZXZlbnRzIGluIHRoZSBidWZmZXIuCisJICovCisJd2hpbGUgKHRhaWwgIT0gaGVhZCkgeworCisJCS8qCisJCSAqIEdldCBpbnRlcnJ1cHQgaW5mb3JtYXRpb24uCisJCSAqLworCisJCWV2ZW50ID0gYmQtPnJlX21hcF9tZW1iYXNlICsgdGFpbCArIEVWU1RBUlQ7CisKKwkJcG9ydCAgID0gZXZlbnRbMF07CisJCXJlYXNvbiA9IGV2ZW50WzFdOworCQltb2RlbSAgPSBldmVudFsyXTsKKwkJYjEgICAgID0gZXZlbnRbM107CisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSBpbnRlcnJ1cHQgaXMgdmFsaWQuCisJCSAqLworCQlpZiAocG9ydCA+PSBiZC0+bmFzeW5jKQorCQkJZ290byBuZXh0OworCisJCWlmICghKHJlYXNvbiAmIChJRk1PREVNIHwgSUZCUkVBSyB8IElGVExXIHwgSUZURU0gfCBJRkRBVEEpKSkKKwkJCWdvdG8gbmV4dDsKKworCQljaCA9IGJkLT5jaGFubmVsc1twb3J0XTsKKworCQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCQlnb3RvIG5leHQ7CisKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBtYWRlIGl0IGhlcmUsIHRoZSBldmVudCB3YXMgdmFsaWQuCisJCSAqIExvY2sgZG93biB0aGUgY2hhbm5lbC4KKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJCWJzID0gY2gtPmNoX2JzOworCisJCWlmICghYnMpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCQlnb3RvIG5leHQ7CisJCX0KKworCQkvKgorCQkgKiBQcm9jZXNzIHJlY2VpdmVkIGRhdGEuCisJCSAqLworCQlpZiAocmVhc29uICYgSUZEQVRBKSB7CisKKwkJCS8qCisJCQkgKiBBTEwgTE9DS1MgKk1VU1QqIEJFIERST1BQRUQgQkVGT1JFIENBTExJTkcgSU5QVVQhCisJCQkgKiBpbnB1dCBjb3VsZCBzZW5kIHNvbWUgZGF0YSB0byBsZCwgd2hpY2ggaW4gdHVybgorCQkJICogY291bGQgZG8gYSBjYWxsYmFjayB0byBvbmUgb2Ygb3VyIG90aGVyIGZ1bmN0aW9ucy4KKwkJCSAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQkJZGdhcF9pbnB1dChjaCk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX1JBQ1RJVkUpCisJCQkJY2gtPmNoX2ZsYWdzIHw9IENIX1JFTkFCTEU7CisJCQllbHNlCisJCQkJd3JpdGViKDEsICYoYnMtPmlkYXRhKSk7CisKKwkJCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9SV0FJVCkgeworCQkJCWNoLT5jaF9mbGFncyAmPSB+Q0hfUldBSVQ7CisKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUKKwkJCQkJKCZjaC0+Y2hfdHVuLnVuX2ZsYWdzX3dhaXQpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogUHJvY2VzcyBNb2RlbSBjaGFuZ2Ugc2lnbmFscy4KKwkJICovCisJCWlmIChyZWFzb24gJiBJRk1PREVNKSB7CisJCQljaC0+Y2hfbWlzdGF0ID0gbW9kZW07CisJCQlkZ2FwX2NhcnJpZXIoY2gpOworCQl9CisKKwkJLyoKKwkJICogUHJvY2VzcyBicmVhay4KKwkJICovCisJCWlmIChyZWFzb24gJiBJRkJSRUFLKSB7CisKKwkJCWlmIChjaC0+Y2hfdHVuLnVuX3R0eSkgeworCQkJCS8qIEEgYnJlYWsgaGFzIGJlZW4gaW5kaWNhdGVkICovCisJCQkJY2gtPmNoX2Vycl9icmVhaysrOworCQkJCXR0eV9idWZmZXJfcmVxdWVzdF9yb29tCisJCQkJCShjaC0+Y2hfdHVuLnVuX3R0eS0+cG9ydCwgMSk7CisJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIoY2gtPmNoX3R1bi51bl90dHktPnBvcnQsCisJCQkJCQkgICAgIDAsIFRUWV9CUkVBSyk7CisJCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2goY2gtPmNoX3R1bi51bl90dHktPnBvcnQpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogUHJvY2VzcyBUcmFuc21pdCBsb3cuCisJCSAqLworCQlpZiAocmVhc29uICYgSUZUTFcpIHsKKwkJCWRnYXBfd3JpdGVfd2FrZXVwKGJkLCBjaCwgJmNoLT5jaF90dW4sIFVOX0xPVywKKwkJCQkJICAmbG9ja19mbGFncywgJmxvY2tfZmxhZ3MyKTsKKwkJCWRnYXBfd3JpdGVfd2FrZXVwKGJkLCBjaCwgJmNoLT5jaF9wdW4sIFVOX0xPVywKKwkJCQkJICAmbG9ja19mbGFncywgJmxvY2tfZmxhZ3MyKTsKKwkJCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9XTE9XKSB7CisJCQkJY2gtPmNoX2ZsYWdzICY9IH5DSF9XTE9XOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX2ZsYWdzX3dhaXQpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogUHJvY2VzcyBUcmFuc21pdCBlbXB0eS4KKwkJICovCisJCWlmIChyZWFzb24gJiBJRlRFTSkgeworCQkJZGdhcF93cml0ZV93YWtldXAoYmQsIGNoLCAmY2gtPmNoX3R1biwgVU5fRU1QVFksCisJCQkJCSAgJmxvY2tfZmxhZ3MsICZsb2NrX2ZsYWdzMik7CisJCQlkZ2FwX3dyaXRlX3dha2V1cChiZCwgY2gsICZjaC0+Y2hfcHVuLCBVTl9FTVBUWSwKKwkJCQkJICAmbG9ja19mbGFncywgJmxvY2tfZmxhZ3MyKTsKKwkJCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9XRU1QVFkpIHsKKwkJCQljaC0+Y2hfZmxhZ3MgJj0gfkNIX1dFTVBUWTsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9mbGFnc193YWl0KTsKKwkJCX0KKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKK25leHQ6CisJCXRhaWwgPSAodGFpbCArIDQpICYgKEVWTUFYIC0gRVZTVEFSVCAtIDQpOworCX0KKworCXdyaXRldyh0YWlsLCAmKGVhZGRyLT5ldl90YWlsKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfZHJpdmVyX3ZlcnNpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIERHX1BBUlQpOworfQorc3RhdGljIERSSVZFUl9BVFRSKHZlcnNpb24sIFNfSVJVU1IsIGRnYXBfZHJpdmVyX3ZlcnNpb25fc2hvdywgTlVMTCk7CisKKworc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfYm9hcmRzX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBkZ2FwX051bUJvYXJkcyk7Cit9CitzdGF0aWMgRFJJVkVSX0FUVFIoYm9hcmRzLCBTX0lSVVNSLCBkZ2FwX2RyaXZlcl9ib2FyZHNfc2hvdywgTlVMTCk7CisKKworc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfbWF4Ym9hcmRzX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBNQVhCT0FSRFMpOworfQorc3RhdGljIERSSVZFUl9BVFRSKG1heGJvYXJkcywgU19JUlVTUiwgZGdhcF9kcml2ZXJfbWF4Ym9hcmRzX3Nob3csIE5VTEwpOworCisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfZHJpdmVyX3BvbGxjb3VudGVyX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwKKwkJCQkJICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGRcbiIsIGRnYXBfcG9sbF9jb3VudGVyKTsKK30KK3N0YXRpYyBEUklWRVJfQVRUUihwb2xsY291bnRlciwgU19JUlVTUiwgZGdhcF9kcml2ZXJfcG9sbGNvdW50ZXJfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfZHJpdmVyX3BvbGxyYXRlX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkbXNcbiIsIGRnYXBfcG9sbF90aWNrKTsKK30KKworc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfcG9sbHJhdGVfc3RvcmUoc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwKKwkJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkXG4iLCAmZGdhcF9wb2xsX3RpY2spICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBEUklWRVJfQVRUUihwb2xscmF0ZSwgKFNfSVJVU1IgfCBTX0lXVVNSKSwgZGdhcF9kcml2ZXJfcG9sbHJhdGVfc2hvdywKKwkJICAgZGdhcF9kcml2ZXJfcG9sbHJhdGVfc3RvcmUpOworCitzdGF0aWMgaW50IGRnYXBfY3JlYXRlX2RyaXZlcl9zeXNmaWxlcyhzdHJ1Y3QgcGNpX2RyaXZlciAqZGdhcF9kcml2ZXIpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyZnMgPSAmZGdhcF9kcml2ZXItPmRyaXZlcjsKKworCXJjIHw9IGRyaXZlcl9jcmVhdGVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3ZlcnNpb24pOworCXJjIHw9IGRyaXZlcl9jcmVhdGVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX2JvYXJkcyk7CisJcmMgfD0gZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfbWF4Ym9hcmRzKTsKKwlyYyB8PSBkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9wb2xscmF0ZSk7CisJcmMgfD0gZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfcG9sbGNvdW50ZXIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBkZ2FwX3JlbW92ZV9kcml2ZXJfc3lzZmlsZXMoc3RydWN0IHBjaV9kcml2ZXIgKmRnYXBfZHJpdmVyKQoreworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXJmcyA9ICZkZ2FwX2RyaXZlci0+ZHJpdmVyOworCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3ZlcnNpb24pOworCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX2JvYXJkcyk7CisJZHJpdmVyX3JlbW92ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfbWF4Ym9hcmRzKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9wb2xscmF0ZSk7CisJZHJpdmVyX3JlbW92ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfcG9sbGNvdW50ZXIpOworfQorCitzdGF0aWMgc3RydWN0IGJvYXJkX3QgKmRnYXBfdmVyaWZ5X2JvYXJkKHN0cnVjdCBkZXZpY2UgKnApCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCisJaWYgKCFwKQorCQlyZXR1cm4gTlVMTDsKKworCWJkID0gZGV2X2dldF9kcnZkYXRhKHApOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMgfHwgYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBiZDsKK30KKworc3RhdGljIHNzaXplX3QgZGdhcF9wb3J0c19zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKnAsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgaSA9IDA7CisKKwliZCA9IGRnYXBfdmVyaWZ5X2JvYXJkKHApOworCWlmICghYmQpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykgeworCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsCisJCQkiJWQgJXNcbiIsIGJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSwKKwkJCWJkLT5jaGFubmVsc1tpXS0+Y2hfb3Blbl9jb3VudCA/ICJPcGVuIiA6ICJDbG9zZWQiKTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSKHBvcnRzX3N0YXRlLCBTX0lSVVNSLCBkZ2FwX3BvcnRzX3N0YXRlX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3BvcnRzX2JhdWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlpbnQgY291bnQgPSAwOworCWludCBpID0gMDsKKworCWJkID0gZGdhcF92ZXJpZnlfYm9hcmQocCk7CisJaWYgKCFiZCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmQtPm5hc3luYzsgaSsrKSB7CisJCWNvdW50ICs9ICBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICIlZCAlZFxuIiwKKwkJCQkgICBiZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sCisJCQkJICAgYmQtPmNoYW5uZWxzW2ldLT5jaF9iYXVkX2luZm8pOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfYmF1ZCwgU19JUlVTUiwgZGdhcF9wb3J0c19iYXVkX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3BvcnRzX21zaWduYWxzX3Nob3coc3RydWN0IGRldmljZSAqcCwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgaSA9IDA7CisKKwliZCA9IGRnYXBfdmVyaWZ5X2JvYXJkKHApOworCWlmICghYmQpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykgeworCQlpZiAoYmQtPmNoYW5uZWxzW2ldLT5jaF9vcGVuX2NvdW50KQorCQkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LAorCQkJCSIlZCAlcyAlcyAlcyAlcyAlcyAlc1xuIiwKKwkJCQliZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sCisJCQkJKGJkLT5jaGFubmVsc1tpXS0+Y2hfbW9zdGF0ICYKKwkJCQkgVUFSVF9NQ1JfUlRTKSA/ICJSVFMiIDogIiIsCisJCQkJKGJkLT5jaGFubmVsc1tpXS0+Y2hfbWlzdGF0ICYKKwkJCQkgVUFSVF9NU1JfQ1RTKSA/ICJDVFMiIDogIiIsCisJCQkJKGJkLT5jaGFubmVsc1tpXS0+Y2hfbW9zdGF0ICYKKwkJCQkgVUFSVF9NQ1JfRFRSKSA/ICJEVFIiIDogIiIsCisJCQkJKGJkLT5jaGFubmVsc1tpXS0+Y2hfbWlzdGF0ICYKKwkJCQkgVUFSVF9NU1JfRFNSKSA/ICJEU1IiIDogIiIsCisJCQkJKGJkLT5jaGFubmVsc1tpXS0+Y2hfbWlzdGF0ICYKKwkJCQkgVUFSVF9NU1JfRENEKSA/ICJEQ0QiIDogIiIsCisJCQkJKGJkLT5jaGFubmVsc1tpXS0+Y2hfbWlzdGF0ICYKKwkJCQkgVUFSVF9NU1JfUkkpICA/ICJSSSIgIDogIiIpOworCQllbHNlCisJCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsCisJCQkJIiVkXG4iLCBiZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0pOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfbXNpZ25hbHMsIFNfSVJVU1IsIGRnYXBfcG9ydHNfbXNpZ25hbHNfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfaWZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCWludCBjb3VudCA9IDA7CisJaW50IGkgPSAwOworCisJYmQgPSBkZ2FwX3ZlcmlmeV9ib2FyZChwKTsKKwlpZiAoIWJkKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspCisJCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwgIiVkICV4XG4iLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9jX2lmbGFnKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfaWZsYWcsIFNfSVJVU1IsIGRnYXBfcG9ydHNfaWZsYWdfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfY2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCWludCBjb3VudCA9IDA7CisJaW50IGkgPSAwOworCisJYmQgPSBkZ2FwX3ZlcmlmeV9ib2FyZChwKTsKKwlpZiAoIWJkKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspCisJCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwgIiVkICV4XG4iLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9jX2NmbGFnKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfY2ZsYWcsIFNfSVJVU1IsIGRnYXBfcG9ydHNfY2ZsYWdfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfb2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCWludCBjb3VudCA9IDA7CisJaW50IGkgPSAwOworCisJYmQgPSBkZ2FwX3ZlcmlmeV9ib2FyZChwKTsKKwlpZiAoIWJkKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspCisJCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwgIiVkICV4XG4iLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9jX29mbGFnKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfb2ZsYWcsIFNfSVJVU1IsIGRnYXBfcG9ydHNfb2ZsYWdfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfbGZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCWludCBjb3VudCA9IDA7CisJaW50IGkgPSAwOworCisJYmQgPSBkZ2FwX3ZlcmlmeV9ib2FyZChwKTsKKwlpZiAoIWJkKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspCisJCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwgIiVkICV4XG4iLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9jX2xmbGFnKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfbGZsYWcsIFNfSVJVU1IsIGRnYXBfcG9ydHNfbGZsYWdfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfZGlnaV9mbGFnX3Nob3coc3RydWN0IGRldmljZSAqcCwKKwkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlpbnQgY291bnQgPSAwOworCWludCBpID0gMDsKKworCWJkID0gZGdhcF92ZXJpZnlfYm9hcmQocCk7CisJaWYgKCFiZCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmQtPm5hc3luYzsgaSsrKQorCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICIlZCAleFxuIiwKKwkJCQkgIGJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSwKKwkJCQkgIGJkLT5jaGFubmVsc1tpXS0+Y2hfZGlnaS5kaWdpX2ZsYWdzKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfZGlnaV9mbGFnLCBTX0lSVVNSLCBkZ2FwX3BvcnRzX2RpZ2lfZmxhZ19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF9wb3J0c19yeGNvdW50X3Nob3coc3RydWN0IGRldmljZSAqcCwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgaSA9IDA7CisKKwliZCA9IGRnYXBfdmVyaWZ5X2JvYXJkKHApOworCWlmICghYmQpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykKKwkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LCAiJWQgJWxkXG4iLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9yeGNvdW50KTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfcnhjb3VudCwgU19JUlVTUiwgZGdhcF9wb3J0c19yeGNvdW50X3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3BvcnRzX3R4Y291bnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlpbnQgY291bnQgPSAwOworCWludCBpID0gMDsKKworCWJkID0gZGdhcF92ZXJpZnlfYm9hcmQocCk7CisJaWYgKCFiZCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmQtPm5hc3luYzsgaSsrKQorCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICIlZCAlbGRcbiIsCisJCQkJICBiZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sCisJCQkJICBiZC0+Y2hhbm5lbHNbaV0tPmNoX3R4Y291bnQpOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihwb3J0c190eGNvdW50LCBTX0lSVVNSLCBkZ2FwX3BvcnRzX3R4Y291bnRfc2hvdywgTlVMTCk7CisKKy8qIHRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGUgc3lzIGZpbGVzIHRoYXQgd2lsbCBleHBvcnQgZWFjaCBzaWduYWwgc3RhdHVzCisgKiB0byBzeXNmcyBlYWNoIHZhbHVlIHdpbGwgYmUgcHV0IGluIGEgc2VwYXJhdGUgZmlsZW5hbWUKKyAqLworc3RhdGljIHZvaWQgZGdhcF9jcmVhdGVfcG9ydHNfc3lzZmlsZXMoc3RydWN0IGJvYXJkX3QgKmJkKQoreworCWRldl9zZXRfZHJ2ZGF0YSgmYmQtPnBkZXYtPmRldiwgYmQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfc3RhdGUpOworCWRldmljZV9jcmVhdGVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfYmF1ZCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19tc2lnbmFscyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19pZmxhZyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19jZmxhZyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19vZmxhZyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19sZmxhZyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19kaWdpX2ZsYWcpOworCWRldmljZV9jcmVhdGVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfcnhjb3VudCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c190eGNvdW50KTsKK30KKworLyogcmVtb3ZlcyBhbGwgdGhlIHN5cyBmaWxlcyBjcmVhdGVkIGZvciB0aGF0IHBvcnQgKi8KK3N0YXRpYyB2b2lkIGRnYXBfcmVtb3ZlX3BvcnRzX3N5c2ZpbGVzKHN0cnVjdCBib2FyZF90ICpiZCkKK3sKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX3N0YXRlKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2JhdWQpOworCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfbXNpZ25hbHMpOworCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfaWZsYWcpOworCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfY2ZsYWcpOworCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfb2ZsYWcpOworCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfbGZsYWcpOworCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfZGlnaV9mbGFnKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX3J4Y291bnQpOworCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfdHhjb3VudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqZCwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKworCWlmICghZCkKKwkJcmV0dXJuIDA7CisJdW4gPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gMDsKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAwOworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiAwOworCWlmIChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpCisJCXJldHVybiAwOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXMiLCB1bi0+dW5fb3Blbl9jb3VudCA/CisJCQkiT3BlbiIgOiAiQ2xvc2VkIik7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoc3RhdGUsIFNfSVJVU1IsIGRnYXBfdHR5X3N0YXRlX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9iYXVkX3Nob3coc3RydWN0IGRldmljZSAqZCwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisKKwlpZiAoIWQpCisJCXJldHVybiAwOworCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIDA7CisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gMDsKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gMDsKKwlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBjaC0+Y2hfYmF1ZF9pbmZvKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihiYXVkLCBTX0lSVVNSLCBkZ2FwX3R0eV9iYXVkX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9tc2lnbmFsc19zaG93KHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisKKwlpZiAoIWQpCisJCXJldHVybiAwOworCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIDA7CisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gMDsKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gMDsKKwlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQorCQlyZXR1cm4gMDsKKworCWlmIChjaC0+Y2hfb3Blbl9jb3VudCkgeworCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyAlcyAlcyAlcyAlcyAlc1xuIiwKKwkJCShjaC0+Y2hfbW9zdGF0ICYgVUFSVF9NQ1JfUlRTKSA/ICJSVFMiIDogIiIsCisJCQkoY2gtPmNoX21pc3RhdCAmIFVBUlRfTVNSX0NUUykgPyAiQ1RTIiA6ICIiLAorCQkJKGNoLT5jaF9tb3N0YXQgJiBVQVJUX01DUl9EVFIpID8gIkRUUiIgOiAiIiwKKwkJCShjaC0+Y2hfbWlzdGF0ICYgVUFSVF9NU1JfRFNSKSA/ICJEU1IiIDogIiIsCisJCQkoY2gtPmNoX21pc3RhdCAmIFVBUlRfTVNSX0RDRCkgPyAiRENEIiA6ICIiLAorCQkJKGNoLT5jaF9taXN0YXQgJiBVQVJUX01TUl9SSSkgID8gIlJJIiAgOiAiIik7CisJfQorCXJldHVybiAwOworfQorc3RhdGljIERFVklDRV9BVFRSKG1zaWduYWxzLCBTX0lSVVNSLCBkZ2FwX3R0eV9tc2lnbmFsc19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF90dHlfaWZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCisJaWYgKCFkKQorCQlyZXR1cm4gMDsKKwl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIDA7CisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIDA7CisJaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIleFxuIiwgY2gtPmNoX2NfaWZsYWcpOworfQorc3RhdGljIERFVklDRV9BVFRSKGlmbGFnLCBTX0lSVVNSLCBkZ2FwX3R0eV9pZmxhZ19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF90dHlfY2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCisJaWYgKCFkKQorCQlyZXR1cm4gMDsKKwl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIDA7CisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIDA7CisJaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIleFxuIiwgY2gtPmNoX2NfY2ZsYWcpOworfQorc3RhdGljIERFVklDRV9BVFRSKGNmbGFnLCBTX0lSVVNSLCBkZ2FwX3R0eV9jZmxhZ19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF90dHlfb2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCisJaWYgKCFkKQorCQlyZXR1cm4gMDsKKwl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIDA7CisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIDA7CisJaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIleFxuIiwgY2gtPmNoX2Nfb2ZsYWcpOworfQorc3RhdGljIERFVklDRV9BVFRSKG9mbGFnLCBTX0lSVVNSLCBkZ2FwX3R0eV9vZmxhZ19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF90dHlfbGZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCisJaWYgKCFkKQorCQlyZXR1cm4gMDsKKwl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIDA7CisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIDA7CisJaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIleFxuIiwgY2gtPmNoX2NfbGZsYWcpOworfQorc3RhdGljIERFVklDRV9BVFRSKGxmbGFnLCBTX0lSVVNSLCBkZ2FwX3R0eV9sZmxhZ19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF90dHlfZGlnaV9mbGFnX3Nob3coc3RydWN0IGRldmljZSAqZCwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCisJaWYgKCFkKQorCQlyZXR1cm4gMDsKKwl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIDA7CisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIDA7CisJaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIleFxuIiwgY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoZGlnaV9mbGFnLCBTX0lSVVNSLCBkZ2FwX3R0eV9kaWdpX2ZsYWdfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X3J4Y291bnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKworCWlmICghZCkKKwkJcmV0dXJuIDA7CisJdW4gPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gMDsKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAwOworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiAwOworCWlmIChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpCisJCXJldHVybiAwOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxkXG4iLCBjaC0+Y2hfcnhjb3VudCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocnhjb3VudCwgU19JUlVTUiwgZGdhcF90dHlfcnhjb3VudF9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF90dHlfdHhjb3VudF9zaG93KHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCisJaWYgKCFkKQorCQlyZXR1cm4gMDsKKwl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIDA7CisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIDA7CisJaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGRcbiIsIGNoLT5jaF90eGNvdW50KTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUih0eGNvdW50LCBTX0lSVVNSLCBkZ2FwX3R0eV90eGNvdW50X3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9uYW1lX3Nob3coc3RydWN0IGRldmljZSAqZCwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJaW50CWNuOworCWludAlibjsKKwlzdHJ1Y3QgY25vZGUgKmNwdHIgPSBOVUxMOworCWludCBmb3VuZCA9IEZBTFNFOworCWludCBuY291bnQgPSAwOworCWludCBzdGFydG8gPSAwOworCWludCBpID0gMDsKKworCWlmICghZCkKKwkJcmV0dXJuIDA7CisJdW4gPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gMDsKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAwOworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiAwOworCWlmIChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpCisJCXJldHVybiAwOworCisJYm4gPSBiZC0+Ym9hcmRudW07CisJY24gPSBjaC0+Y2hfcG9ydG51bTsKKworCWZvciAoY3B0ciA9IGJkLT5iZF9jb25maWc7IGNwdHI7IGNwdHIgPSBjcHRyLT5uZXh0KSB7CisKKwkJaWYgKChjcHRyLT50eXBlID09IEJOT0RFKSAmJgorCQkgICAgKChjcHRyLT51LmJvYXJkLnR5cGUgPT0gQVBPUlQyXzkyMFApIHx8CisJCSAgICAgKGNwdHItPnUuYm9hcmQudHlwZSA9PSBBUE9SVDRfOTIwUCkgfHwKKwkJICAgICAoY3B0ci0+dS5ib2FyZC50eXBlID09IEFQT1JUOF85MjBQKSB8fAorCQkgICAgIChjcHRyLT51LmJvYXJkLnR5cGUgPT0gUEFQT1JUNCkgfHwKKwkJICAgICAoY3B0ci0+dS5ib2FyZC50eXBlID09IFBBUE9SVDgpKSkgeworCisJCQlmb3VuZCA9IFRSVUU7CisJCQlpZiAoY3B0ci0+dS5ib2FyZC52X3N0YXJ0KQorCQkJCXN0YXJ0byA9IGNwdHItPnUuYm9hcmQuc3RhcnQ7CisJCQllbHNlCisJCQkJc3RhcnRvID0gMTsKKwkJfQorCisJCWlmIChjcHRyLT50eXBlID09IFROT0RFICYmIGZvdW5kID09IFRSVUUpIHsKKwkJCWNoYXIgKnB0cjE7CisJCQlpZiAoc3Ryc3RyKGNwdHItPnUudHR5bmFtZSwgInR0eSIpKSB7CisJCQkJcHRyMSA9IGNwdHItPnUudHR5bmFtZTsKKwkJCQlwdHIxICs9IDM7CisJCQl9IGVsc2UKKwkJCQlwdHIxID0gY3B0ci0+dS50dHluYW1lOworCisJCQlmb3IgKGkgPSAwOyBpIDwgZGdhcF9jb25maWdfZ2V0X251bV9wcnRzKGJkKTsgaSsrKSB7CisJCQkJaWYgKGNuICE9IGkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXMlcyUwMmRcbiIsCisJCQkJCQkodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkgPworCQkJCQkJICJwciIgOiAidHR5IiwKKwkJCQkJCXB0cjEsIGkgKyBzdGFydG8pOworCQkJfQorCQl9CisKKwkJaWYgKGNwdHItPnR5cGUgPT0gQ05PREUpIHsKKworCQkJZm9yIChpID0gMDsgaSA8IGNwdHItPnUuY29uYy5ucG9ydDsgaSsrKSB7CisJCQkJaWYgKGNuICE9IChpICsgbmNvdW50KSkKKwkJCQkJY29udGludWU7CisKKwkJCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyVzJTAybGRcbiIsCisJCQkJCQkodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkgPworCQkJCQkJICJwciIgOiAidHR5IiwKKwkJCQkJCWNwdHItPnUuY29uYy5pZCwKKwkJCQkJCWkgKyAoY3B0ci0+dS5jb25jLnZfc3RhcnQgPworCQkJCQkJICAgICBjcHRyLT51LmNvbmMuc3RhcnQgOiAxKSk7CisJCQl9CisKKwkJCW5jb3VudCArPSBjcHRyLT51LmNvbmMubnBvcnQ7CisJCX0KKworCQlpZiAoY3B0ci0+dHlwZSA9PSBNTk9ERSkgeworCisJCQlmb3IgKGkgPSAwOyBpIDwgY3B0ci0+dS5tb2R1bGUubnBvcnQ7IGkrKykgeworCQkJCWlmIChjbiAhPSAoaSArIG5jb3VudCkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXMlcyUwMmxkXG4iLAorCQkJCQkJKHVuLT51bl90eXBlID09IERHQVBfUFJJTlQpID8KKwkJCQkJCSAicHIiIDogInR0eSIsCisJCQkJCQljcHRyLT51Lm1vZHVsZS5pZCwKKwkJCQkJCWkgKyAoY3B0ci0+dS5tb2R1bGUudl9zdGFydCA/CisJCQkJCQkgICAgIGNwdHItPnUubW9kdWxlLnN0YXJ0IDogMSkpOworCQkJfQorCisJCQluY291bnQgKz0gY3B0ci0+dS5tb2R1bGUubnBvcnQ7CisKKwkJfQorCX0KKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzX2RnYXBfJWRfJWRcbiIsCisJCSh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSA/ICJwciIgOiAidHR5IiwgYm4sIGNuKTsKKworfQorc3RhdGljIERFVklDRV9BVFRSKGN1c3RvbV9uYW1lLCBTX0lSVVNSLCBkZ2FwX3R0eV9uYW1lX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGdhcF9zeXNmc190dHlfZW50cmllc1tdID0geworCSZkZXZfYXR0cl9zdGF0ZS5hdHRyLAorCSZkZXZfYXR0cl9iYXVkLmF0dHIsCisJJmRldl9hdHRyX21zaWduYWxzLmF0dHIsCisJJmRldl9hdHRyX2lmbGFnLmF0dHIsCisJJmRldl9hdHRyX2NmbGFnLmF0dHIsCisJJmRldl9hdHRyX29mbGFnLmF0dHIsCisJJmRldl9hdHRyX2xmbGFnLmF0dHIsCisJJmRldl9hdHRyX2RpZ2lfZmxhZy5hdHRyLAorCSZkZXZfYXR0cl9yeGNvdW50LmF0dHIsCisJJmRldl9hdHRyX3R4Y291bnQuYXR0ciwKKwkmZGV2X2F0dHJfY3VzdG9tX25hbWUuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBkZ2FwX3R0eV9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUgPSBOVUxMLAorCS5hdHRycyA9IGRnYXBfc3lzZnNfdHR5X2VudHJpZXMsCit9OworCitzdGF0aWMgdm9pZCBkZ2FwX2NyZWF0ZV90dHlfc3lzZnMoc3RydWN0IHVuX3QgKnVuLCBzdHJ1Y3QgZGV2aWNlICpjKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmMtPmtvYmosICZkZ2FwX3R0eV9hdHRyaWJ1dGVfZ3JvdXApOworCWlmIChyZXQpCisJCXJldHVybjsKKworCWRldl9zZXRfZHJ2ZGF0YShjLCB1bik7CisKK30KKworc3RhdGljIHZvaWQgZGdhcF9yZW1vdmVfdHR5X3N5c2ZzKHN0cnVjdCBkZXZpY2UgKmMpCit7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjLT5rb2JqLCAmZGdhcF90dHlfYXR0cmlidXRlX2dyb3VwKTsKK30KKworLyoKKyAqIFBhcnNlIGEgY29uZmlndXJhdGlvbiBmaWxlIHJlYWQgaW50byBtZW1vcnkgYXMgYSBzdHJpbmcuCisgKi8KK3N0YXRpYyBpbnQJZGdhcF9wYXJzZWZpbGUoY2hhciAqKmluLCBpbnQgUmVtb3ZlKQoreworCXN0cnVjdCBjbm9kZSAqcCwgKmJyZCwgKmxpbmUsICpjb25jOworCWludAlyYzsKKwljaGFyCSpzID0gTlVMTDsKKwlpbnQJbGluZWNudCA9IDA7CisKKwlwID0gJmRnYXBfaGVhZDsKKwlicmQgPSBsaW5lID0gY29uYyA9IE5VTEw7CisKKwkvKiBwZXJoYXBzIHdlIGFyZSBhZGRpbmcgdG8gYW4gZXhpc3RpbmcgbGlzdD8gKi8KKwl3aGlsZSAocC0+bmV4dCAhPSBOVUxMKQorCQlwID0gcC0+bmV4dDsKKworCS8qIGZpbGUgbXVzdCBzdGFydCB3aXRoIGEgQkVHSU4gKi8KKwl3aGlsZSAoKHJjID0gZGdhcF9nZXR0b2soaW4sIHApKSAhPSBCRUdJTikgeworCQlpZiAocmMgPT0gMCkgeworCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRU9GIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlmb3IgKDsgOykgeworCQlyYyA9IGRnYXBfZ2V0dG9rKGluLCBwKTsKKwkJaWYgKHJjID09IDApIHsKKwkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIEVPRiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJc3dpdGNoIChyYykgeworCQljYXNlIDA6CisJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJcmV0dXJuIC0xOworCisJCWNhc2UgQkVHSU46CS8qIHNob3VsZCBvbmx5IGJlIDEgYmVnaW4gKi8KKwkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGNvbmZpZ19iZWdpblxuIik7CisJCQlyZXR1cm4gLTE7CisKKwkJY2FzZSBFTkQ6CisJCQlyZXR1cm4gMDsKKworCQljYXNlIEJPQVJEOgkvKiBib2FyZCBpbmZvICovCisJCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCisJCQkJcmV0dXJuIC0xOworCQkJcC0+bmV4dCA9IGRnYXBfbmV3bm9kZShCTk9ERSk7CisJCQlpZiAoIXAtPm5leHQpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAgPSBwLT5uZXh0OworCisJCQlwLT51LmJvYXJkLnN0YXR1cyA9IGRnYXBfc2F2ZXN0cmluZygiTm8iKTsKKwkJCWxpbmUgPSBjb25jID0gTlVMTDsKKwkJCWJyZCA9IHA7CisJCQlsaW5lY250ID0gLTE7CisJCQlicmVhazsKKworCQljYXNlIEFQT1JUMl85MjBQOgkvKiBBY2NlbGVQb3J0XzQgKi8KKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRGlnaV8ycl85MjAgc3RyaW5nIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC50eXBlID0gQVBPUlQyXzkyMFA7CisJCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7CisJCQlicmVhazsKKworCQljYXNlIEFQT1JUNF85MjBQOgkvKiBBY2NlbGVQb3J0XzQgKi8KKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRGlnaV80cl85MjAgc3RyaW5nIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC50eXBlID0gQVBPUlQ0XzkyMFA7CisJCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7CisJCQlicmVhazsKKworCQljYXNlIEFQT1JUOF85MjBQOgkvKiBBY2NlbGVQb3J0XzggKi8KKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRGlnaV84cl85MjAgc3RyaW5nIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC50eXBlID0gQVBPUlQ4XzkyMFA7CisJCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7CisJCQlicmVhazsKKworCQljYXNlIFBBUE9SVDQ6CS8qIEFjY2VsZVBvcnRfNCBQQ0kgKi8KKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRGlnaV80cihQQ0kpIHN0cmluZyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuYm9hcmQudHlwZSA9IFBBUE9SVDQ7CisJCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7CisJCQlicmVhazsKKworCQljYXNlIFBBUE9SVDg6CS8qIEFjY2VsZVBvcnRfOCBQQ0kgKi8KKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRGlnaV84ciBzdHJpbmciKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51LmJvYXJkLnR5cGUgPSBQQVBPUlQ4OworCQkJcC0+dS5ib2FyZC52X3R5cGUgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBQQ1g6CS8qIFBDSSBDL1ggKi8KKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRGlnaV9DL1hfKFBDSSkgc3RyaW5nIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC50eXBlID0gUENYOworCQkJcC0+dS5ib2FyZC52X3R5cGUgPSAxOworCQkJcC0+dS5ib2FyZC5jb25jMSA9IDA7CisJCQlwLT51LmJvYXJkLmNvbmMyID0gMDsKKwkJCXAtPnUuYm9hcmQubW9kdWxlMSA9IDA7CisJCQlwLT51LmJvYXJkLm1vZHVsZTIgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBQRVBDOgkvKiBQQ0kgRVBDL1ggKi8KKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgXCJEaWdpX0VQQy9YXyhQQ0kpXCIgc3RyaW5nIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC50eXBlID0gUEVQQzsKKwkJCXAtPnUuYm9hcmQudl90eXBlID0gMTsKKwkJCXAtPnUuYm9hcmQuY29uYzEgPSAwOworCQkJcC0+dS5ib2FyZC5jb25jMiA9IDA7CisJCQlwLT51LmJvYXJkLm1vZHVsZTEgPSAwOworCQkJcC0+dS5ib2FyZC5tb2R1bGUyID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUFBDTToJLyogUENJL1hlbSAqLworCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBQQ0kvWGVtIHN0cmluZyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuYm9hcmQudHlwZSA9IFBQQ007CisJCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7CisJCQlwLT51LmJvYXJkLmNvbmMxID0gMDsKKwkJCXAtPnUuYm9hcmQuY29uYzIgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBJTzoJLyogaS9vIHBvcnQgKi8KKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoIklPIHBvcnQgb25seSB2YWlsZCBmb3IgYm9hcmRzIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51LmJvYXJkLnBvcnRzdHIgPSBkZ2FwX3NhdmVzdHJpbmcocyk7CisJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5ib2FyZC5wb3J0KSkgeworCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBJTyBwb3J0Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC52X3BvcnQgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRU06CS8qIG1lbW9yeSBhZGRyZXNzICovCisJCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgeworCQkJCWRnYXBfZXJyKCJtZW1vcnkgYWRkcmVzcyBvbmx5IHZhaWxkIGZvciBib2FyZHMiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmIChzID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuYm9hcmQuYWRkcnN0ciA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKKwkJCWlmIChrc3RydG91bChzLCAwLCAmcC0+dS5ib2FyZC5hZGRyKSkgeworCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBtZW1vcnkgYWRkcmVzcyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuYm9hcmQudl9hZGRyID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgUENJSU5GTzoJLyogcGNpIGluZm9ybWF0aW9uICovCisJCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgeworCQkJCWRnYXBfZXJyKCJtZW1vcnkgYWRkcmVzcyBvbmx5IHZhaWxkIGZvciBib2FyZHMiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmIChzID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuYm9hcmQucGNpYnVzc3RyID0gZGdhcF9zYXZlc3RyaW5nKHMpOworCQkJaWYgKGtzdHJ0b3VsKHMsIDAsICZwLT51LmJvYXJkLnBjaWJ1cykpIHsKKwkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgcGNpIGJ1cyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuYm9hcmQudl9wY2lidXMgPSAxOworCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51LmJvYXJkLnBjaXNsb3RzdHIgPSBkZ2FwX3NhdmVzdHJpbmcocyk7CisJCQlpZiAoa3N0cnRvdWwocywgMCwgJnAtPnUuYm9hcmQucGNpc2xvdCkpIHsKKwkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgcGNpIHNsb3QiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51LmJvYXJkLnZfcGNpc2xvdCA9IDE7CisJCQlicmVhazsKKworCQljYXNlIE1FVEhPRDoKKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoImluc3RhbGwgbWV0aG9kIG9ubHkgdmFpbGQgZm9yIGJvYXJkcyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC5tZXRob2QgPSBkZ2FwX3NhdmVzdHJpbmcocyk7CisJCQlwLT51LmJvYXJkLnZfbWV0aG9kID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1RBVFVTOgorCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKKwkJCQlkZ2FwX2VycigiY29uZmlnIHN0YXR1cyBvbmx5IHZhaWxkIGZvciBib2FyZHMiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmIChzID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuYm9hcmQuc3RhdHVzID0gZGdhcF9zYXZlc3RyaW5nKHMpOworCQkJYnJlYWs7CisKKwkJY2FzZSBOUE9SVFM6CS8qIG51bWJlciBvZiBwb3J0cyAqLworCQkJaWYgKHAtPnR5cGUgPT0gQk5PREUpIHsKKwkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJaWYgKGtzdHJ0b2wocywgMCwgJnAtPnUuYm9hcmQubnBvcnQpKSB7CisJCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBudW1iZXIgb2YgcG9ydHMiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlwLT51LmJvYXJkLnZfbnBvcnQgPSAxOworCQkJfSBlbHNlIGlmIChwLT50eXBlID09IENOT0RFKSB7CisJCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCWlmIChrc3RydG9sKHMsIDAsICZwLT51LmNvbmMubnBvcnQpKSB7CisJCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBudW1iZXIgb2YgcG9ydHMiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlwLT51LmNvbmMudl9ucG9ydCA9IDE7CisJCQl9IGVsc2UgaWYgKHAtPnR5cGUgPT0gTU5PREUpIHsKKwkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJaWYgKGtzdHJ0b2wocywgMCwgJnAtPnUubW9kdWxlLm5wb3J0KSkgeworCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgbnVtYmVyIG9mIHBvcnRzIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJcC0+dS5tb2R1bGUudl9ucG9ydCA9IDE7CisJCQl9IGVsc2UgeworCQkJCWRnYXBfZXJyKCJucG9ydHMgb25seSB2YWxpZCBmb3IgY29uY2VudHJhdG9ycyBvciBtb2R1bGVzIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJRDoJLyogbGV0dGVyIElEIHVzZWQgaW4gdHR5IG5hbWUgKi8KKwkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlwLT51LmJvYXJkLnN0YXR1cyA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKKworCQkJaWYgKHAtPnR5cGUgPT0gQ05PREUpIHsKKwkJCQlwLT51LmNvbmMuaWQgPSBkZ2FwX3NhdmVzdHJpbmcocyk7CisJCQkJcC0+dS5jb25jLnZfaWQgPSAxOworCQkJfSBlbHNlIGlmIChwLT50eXBlID09IE1OT0RFKSB7CisJCQkJcC0+dS5tb2R1bGUuaWQgPSBkZ2FwX3NhdmVzdHJpbmcocyk7CisJCQkJcC0+dS5tb2R1bGUudl9pZCA9IDE7CisJCQl9IGVsc2UgeworCQkJCWRnYXBfZXJyKCJpZCBvbmx5IHZhbGlkIGZvciBjb25jZW50cmF0b3JzIG9yIG1vZHVsZXMiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNUQVJUTzoJLyogc3RhcnQgb2Zmc2V0IG9mIElEICovCisJCQlpZiAocC0+dHlwZSA9PSBCTk9ERSkgeworCQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJCWlmIChzID09IE5VTEwpIHsKKwkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5ib2FyZC5zdGFydCkpIHsKKwkJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIHN0YXJ0IG9mIHR0eSBjb3VudCIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCXAtPnUuYm9hcmQudl9zdGFydCA9IDE7CisJCQl9IGVsc2UgaWYgKHAtPnR5cGUgPT0gQ05PREUpIHsKKwkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJaWYgKGtzdHJ0b2wocywgMCwgJnAtPnUuY29uYy5zdGFydCkpIHsKKwkJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIHN0YXJ0IG9mIHR0eSBjb3VudCIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCXAtPnUuY29uYy52X3N0YXJ0ID0gMTsKKwkJCX0gZWxzZSBpZiAocC0+dHlwZSA9PSBNTk9ERSkgeworCQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJCWlmIChzID09IE5VTEwpIHsKKwkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5tb2R1bGUuc3RhcnQpKSB7CisJCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBzdGFydCBvZiB0dHkgY291bnQiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlwLT51Lm1vZHVsZS52X3N0YXJ0ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJZGdhcF9lcnIoInN0YXJ0IG9ubHkgdmFsaWQgZm9yIGNvbmNlbnRyYXRvcnMgb3IgbW9kdWxlcyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVFRZTjoJLyogdHR5IG5hbWUgcHJlZml4ICovCisJCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCisJCQkJcmV0dXJuIC0xOworCQkJcC0+bmV4dCA9IGRnYXBfbmV3bm9kZShUTk9ERSk7CisJCQlpZiAoIXAtPm5leHQpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAgPSBwLT5uZXh0OworCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAoIXMpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY2VkIGVuZCBvZiBmaWxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS50dHluYW1lID0gZGdhcF9zYXZlc3RyaW5nKHMpOworCQkJaWYgKCFwLT51LnR0eW5hbWUpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQ1U6CS8qIGN1IG5hbWUgcHJlZml4ICovCisJCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCisJCQkJcmV0dXJuIC0xOworCQkJcC0+bmV4dCA9IGRnYXBfbmV3bm9kZShDVU5PREUpOworCQkJaWYgKCFwLT5uZXh0KSB7CisJCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwID0gcC0+bmV4dDsKKwkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJaWYgKCFzKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWNlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuY3VuYW1lID0gZGdhcF9zYXZlc3RyaW5nKHMpOworCQkJaWYgKCFwLT51LmN1bmFtZSkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBMSU5FOgkvKiBsaW5lIGluZm9ybWF0aW9uICovCisJCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCisJCQkJcmV0dXJuIC0xOworCQkJaWYgKGJyZCA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoIm11c3Qgc3BlY2lmeSBib2FyZCBiZWZvcmUgbGluZSBpbmZvIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJc3dpdGNoIChicmQtPnUuYm9hcmQudHlwZSkgeworCQkJY2FzZSBQUENNOgorCQkJCWRnYXBfZXJyKCJsaW5lIG5vdCB2YWlsZCBmb3IgUEMvZW0iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT5uZXh0ID0gZGdhcF9uZXdub2RlKExOT0RFKTsKKwkJCWlmICghcC0+bmV4dCkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcCA9IHAtPm5leHQ7CisJCQljb25jID0gTlVMTDsKKwkJCWxpbmUgPSBwOworCQkJbGluZWNudCsrOworCQkJYnJlYWs7CisKKwkJY2FzZSBDT05DOgkvKiBjb25jZW50cmF0b3IgaW5mb3JtYXRpb24gKi8KKwkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAobGluZSA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoIm11c3Qgc3BlY2lmeSBsaW5lIGluZm8gYmVmb3JlIGNvbmNlbnRyYXRvciIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoQ05PREUpOworCQkJaWYgKCFwLT5uZXh0KSB7CisJCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwID0gcC0+bmV4dDsKKwkJCWNvbmMgPSBwOworCQkJaWYgKGxpbmVjbnQpCisJCQkJYnJkLT51LmJvYXJkLmNvbmMyKys7CisJCQllbHNlCisJCQkJYnJkLT51LmJvYXJkLmNvbmMxKys7CisKKwkJCWJyZWFrOworCisJCWNhc2UgQ1g6CS8qIGMveCB0eXBlIGNvbmNlbnRyYXRvciAqLworCQkJaWYgKHAtPnR5cGUgIT0gQ05PREUpIHsKKwkJCQlkZ2FwX2VycigiY3ggb25seSB2YWxpZCBmb3IgY29uY2VudHJhdG9ycyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuY29uYy50eXBlID0gQ1g7CisJCQlwLT51LmNvbmMudl90eXBlID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVBDOgkvKiBlcGMgdHlwZSBjb25jZW50cmF0b3IgKi8KKwkJCWlmIChwLT50eXBlICE9IENOT0RFKSB7CisJCQkJZGdhcF9lcnIoImN4IG9ubHkgdmFsaWQgZm9yIGNvbmNlbnRyYXRvcnMiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51LmNvbmMudHlwZSA9IEVQQzsKKwkJCXAtPnUuY29uYy52X3R5cGUgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBNT0Q6CS8qIEVCSSBtb2R1bGUgKi8KKwkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAoYnJkID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigibXVzdCBzcGVjaWZ5IGJvYXJkIGluZm8gYmVmb3JlIEVCSSBtb2R1bGVzIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJc3dpdGNoIChicmQtPnUuYm9hcmQudHlwZSkgeworCQkJY2FzZSBQUENNOgorCQkJCWxpbmVjbnQgPSAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlpZiAoY29uYyA9PSBOVUxMKSB7CisJCQkJCWRnYXBfZXJyKCJtdXN0IHNwZWNpZnkgY29uY2VudHJhdG9yIGluZm8gYmVmb3JlIEVCSSBtb2R1bGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0KKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoTU5PREUpOworCQkJaWYgKCFwLT5uZXh0KSB7CisJCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwID0gcC0+bmV4dDsKKwkJCWlmIChsaW5lY250KQorCQkJCWJyZC0+dS5ib2FyZC5tb2R1bGUyKys7CisJCQllbHNlCisJCQkJYnJkLT51LmJvYXJkLm1vZHVsZTErKzsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBQT1JUUzoJLyogcG9ydHMgdHlwZSBFQkkgbW9kdWxlICovCisJCQlpZiAocC0+dHlwZSAhPSBNTk9ERSkgeworCQkJCWRnYXBfZXJyKCJwb3J0cyBvbmx5IHZhbGlkIGZvciBFQkkgbW9kdWxlcyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUubW9kdWxlLnR5cGUgPSBQT1JUUzsKKwkJCXAtPnUubW9kdWxlLnZfdHlwZSA9IDE7CisJCQlicmVhazsKKworCQljYXNlIE1PREVNOgkvKiBwb3J0cyB0eXBlIEVCSSBtb2R1bGUgKi8KKwkJCWlmIChwLT50eXBlICE9IE1OT0RFKSB7CisJCQkJZGdhcF9lcnIoIm1vZGVtIG9ubHkgdmFsaWQgZm9yIG1vZGVtIG1vZHVsZXMiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51Lm1vZHVsZS50eXBlID0gTU9ERU07CisJCQlwLT51Lm1vZHVsZS52X3R5cGUgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBDQUJMRToKKwkJCWlmIChwLT50eXBlID09IExOT0RFKSB7CisJCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQkJaWYgKCFzKSB7CisJCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJcC0+dS5saW5lLmNhYmxlID0gZGdhcF9zYXZlc3RyaW5nKHMpOworCQkJCXAtPnUubGluZS52X2NhYmxlID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1BFRUQ6CS8qIHN5bmMgbGluZSBzcGVlZCBpbmRpY2F0aW9uICovCisJCQlpZiAocC0+dHlwZSA9PSBMTk9ERSkgeworCQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJCWlmIChzID09IE5VTEwpIHsKKwkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5saW5lLnNwZWVkKSkgeworCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgbGluZSBzcGVlZCIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCXAtPnUubGluZS52X3NwZWVkID0gMTsKKwkJCX0gZWxzZSBpZiAocC0+dHlwZSA9PSBDTk9ERSkgeworCQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJCWlmIChzID09IE5VTEwpIHsKKwkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5jb25jLnNwZWVkKSkgeworCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgbGluZSBzcGVlZCIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCXAtPnUuY29uYy52X3NwZWVkID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJZGdhcF9lcnIoInNwZWVkIHZhbGlkIG9ubHkgZm9yIGxpbmVzIG9yIGNvbmNlbnRyYXRvcnMuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBDT05ORUNUOgorCQkJaWYgKHAtPnR5cGUgPT0gQ05PREUpIHsKKwkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCQlpZiAoIXMpIHsKKwkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlwLT51LmNvbmMuY29ubmVjdCA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKKwkJCQlwLT51LmNvbmMudl9jb25uZWN0ID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBSSU5UOgkvKiB0cmFuc3BhcmVudCBwcmludCBuYW1lIHByZWZpeCAqLworCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQorCQkJCXJldHVybiAtMTsKKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoUE5PREUpOworCQkJaWYgKCFwLT5uZXh0KSB7CisJCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwID0gcC0+bmV4dDsKKwkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJaWYgKCFzKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWNlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUucHJpbnRuYW1lID0gZGdhcF9zYXZlc3RyaW5nKHMpOworCQkJaWYgKCFwLT51LnByaW50bmFtZSkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBDTUFKT1I6CS8qIG1ham9yIG51bWJlciAqLworCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQorCQkJCXJldHVybiAtMTsKKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoSk5PREUpOworCQkJaWYgKCFwLT5uZXh0KSB7CisJCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwID0gcC0+bmV4dDsKKwkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGtzdHJ0b2wocywgMCwgJnAtPnUubWFqb3JudW1iZXIpKSB7CisJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIG1ham9yIG51bWJlciIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQUxUUElOOgkvKiBhbHRwaW4gc2V0dGluZyAqLworCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQorCQkJCXJldHVybiAtMTsKKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoQU5PREUpOworCQkJaWYgKCFwLT5uZXh0KSB7CisJCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwID0gcC0+bmV4dDsKKwkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGtzdHJ0b2wocywgMCwgJnAtPnUuYWx0cGluKSkgeworCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBhbHRwaW4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFVTRUlOVFI6CQkvKiBlbmFibGUgaW50ZXJydXB0IHNldHRpbmcgKi8KKwkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlwLT5uZXh0ID0gZGdhcF9uZXdub2RlKElOVFJOT0RFKTsKKwkJCWlmICghcC0+bmV4dCkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcCA9IHAtPm5leHQ7CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmIChzID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChrc3RydG9sKHMsIDAsICZwLT51LnVzZWludHIpKSB7CisJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIHVzZWludHIiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRUU0laOgkvKiBzaXplIG9mIHR0eSBzdHJ1Y3R1cmUgKi8KKwkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlwLT5uZXh0ID0gZGdhcF9uZXdub2RlKFRTTk9ERSk7CisJCQlpZiAoIXAtPm5leHQpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAgPSBwLT5uZXh0OworCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS50dHlzaXplKSkgeworCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciB0dHlzaXplIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBDSFNJWjoJLyogY2hhbm5lbCBzdHJ1Y3R1cmUgc2l6ZSAqLworCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQorCQkJCXJldHVybiAtMTsKKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoQ1NOT0RFKTsKKwkJCWlmICghcC0+bmV4dCkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcCA9IHAtPm5leHQ7CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmIChzID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChrc3RydG9sKHMsIDAsICZwLT51LmNoc2l6ZSkpIHsKKwkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgY2hzaXplIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBCU1NJWjoJLyogYm9hcmQgc3RydWN0dXJlIHNpemUgKi8KKwkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlwLT5uZXh0ID0gZGdhcF9uZXdub2RlKEJTTk9ERSk7CisJCQlpZiAoIXAtPm5leHQpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAgPSBwLT5uZXh0OworCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5ic3NpemUpKSB7CisJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIGJzc2l6ZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVU5UU0laOgkvKiBzY2hlZCBzdHJ1Y3R1cmUgc2l6ZSAqLworCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQorCQkJCXJldHVybiAtMTsKKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoVVNOT0RFKTsKKwkJCWlmICghcC0+bmV4dCkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcCA9IHAtPm5leHQ7CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmIChzID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChrc3RydG9sKHMsIDAsICZwLT51LnVuc2l6ZSkpIHsKKwkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3Igc2NoZWRzaXplIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBGMlNJWjoJLyogZjIyMDAgc3RydWN0dXJlIHNpemUgKi8KKwkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlwLT5uZXh0ID0gZGdhcF9uZXdub2RlKEZTTk9ERSk7CisJCQlpZiAoIXAtPm5leHQpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAgPSBwLT5uZXh0OworCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5mMnNpemUpKSB7CisJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIGYyMjAwc2l6ZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVlBTSVo6CS8qIHZwaXggc3RydWN0dXJlIHNpemUgKi8KKwkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlwLT5uZXh0ID0gZGdhcF9uZXdub2RlKFZTTk9ERSk7CisJCQlpZiAoIXAtPm5leHQpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAgPSBwLT5uZXh0OworCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS52cGl4c2l6ZSkpIHsKKwkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgdnBpeHNpemUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoKKyAqIGRnYXBfc2luZGV4OiBtdWNoIGxpa2UgaW5kZXgoKSwgYnV0IGl0IGxvb2tzIGZvciBhIG1hdGNoIG9mIGFueSBjaGFyYWN0ZXIgaW4KKyAqIHRoZSBncm91cCwgYW5kIHJldHVybnMgdGhhdCBwb3NpdGlvbi4gIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYSBeLCB0aGVuCisgKiB0aGlzIHdpbGwgbWF0Y2ggdGhlIGZpcnN0IG9jY3VycmVuY2Ugbm90IGluIHRoYXQgZ3JvdXAuCisgKi8KK3N0YXRpYyBjaGFyICpkZ2FwX3NpbmRleChjaGFyICpzdHJpbmcsIGNoYXIgKmdyb3VwKQoreworCWNoYXIgICAgKnB0cjsKKworCWlmICghc3RyaW5nIHx8ICFncm91cCkKKwkJcmV0dXJuIChjaGFyICopIE5VTEw7CisKKwlpZiAoKmdyb3VwID09ICdeJykgeworCQlncm91cCsrOworCQlmb3IgKDsgKnN0cmluZzsgc3RyaW5nKyspIHsKKwkJCWZvciAocHRyID0gZ3JvdXA7ICpwdHI7IHB0cisrKSB7CisJCQkJaWYgKCpwdHIgPT0gKnN0cmluZykKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoKnB0ciA9PSAnXDAnKQorCQkJCXJldHVybiBzdHJpbmc7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKDsgKnN0cmluZzsgc3RyaW5nKyspIHsKKwkJCWZvciAocHRyID0gZ3JvdXA7ICpwdHI7IHB0cisrKSB7CisJCQkJaWYgKCpwdHIgPT0gKnN0cmluZykKKwkJCQkJcmV0dXJuIHN0cmluZzsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAoY2hhciAqKSBOVUxMOworfQorCisvKgorICogR2V0IGEgdG9rZW4gZnJvbSB0aGUgaW5wdXQgZmlsZTsgcmV0dXJuIDAgaWYgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAorICovCitzdGF0aWMgaW50IGRnYXBfZ2V0dG9rKGNoYXIgKippbiwgc3RydWN0IGNub2RlICpwKQoreworCWNoYXIJKnc7CisJc3RydWN0IHRva2xpc3QgKnQ7CisKKwlpZiAoc3Ryc3RyKGRnYXBfY3dvcmQsICJib2FyIikpIHsKKwkJdyA9IGRnYXBfZ2V0d29yZChpbik7CisJCXNucHJpbnRmKGRnYXBfY3dvcmQsIE1BWENXT1JELCAiJXMiLCB3KTsKKwkJZm9yICh0ID0gZGdhcF90bGlzdDsgdC0+dG9rZW4gIT0gMDsgdCsrKSB7CisJCQlpZiAoIXN0cmNtcCh3LCB0LT5zdHJpbmcpKQorCQkJCXJldHVybiB0LT50b2tlbjsKKwkJfQorCQlkZ2FwX2VycigiYm9hcmQgISF0eXBlIG5vdCBzcGVjaWZpZWQiKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJd2hpbGUgKCh3ID0gZGdhcF9nZXR3b3JkKGluKSkpIHsKKwkJCXNucHJpbnRmKGRnYXBfY3dvcmQsIE1BWENXT1JELCAiJXMiLCB3KTsKKwkJCWZvciAodCA9IGRnYXBfdGxpc3Q7IHQtPnRva2VuICE9IDA7IHQrKykgeworCQkJCWlmICghc3RyY21wKHcsIHQtPnN0cmluZykpCisJCQkJCXJldHVybiB0LT50b2tlbjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qCisgKiBnZXQgYSB3b3JkIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgYWxzbyBrZWVwIHRyYWNrIG9mIGN1cnJlbnQgbGluZSBudW1iZXIuCisgKiB3b3JkcyBhcmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuCisgKi8KK3N0YXRpYyBjaGFyICpkZ2FwX2dldHdvcmQoY2hhciAqKmluKQoreworCWNoYXIgKnJldF9wdHIgPSAqaW47CisKKwljaGFyICpwdHIgPSBkZ2FwX3NpbmRleCgqaW4sICIgXHRcbiIpOworCisJLyogSWYgbm8gd29yZCBmb3VuZCwgcmV0dXJuIG51bGwgKi8KKwlpZiAoIXB0cikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBNYXJrIG5ldyBsb2NhdGlvbiBmb3Igb3VyIGJ1ZmZlciAqLworCSpwdHIgPSAnXDAnOworCSppbiA9IHB0ciArIDE7CisKKwkvKiBFYXQgYW55IGV4dHJhIHNwYWNlcy90YWJzL25ld2xpbmVzIHRoYXQgbWlnaHQgYmUgcHJlc2VudCAqLworCXdoaWxlICgqaW4gJiYgKippbiAmJiAoKCoqaW4gPT0gJyAnKSB8fAorCQkJICAgICAgICgqKmluID09ICdcdCcpIHx8CisJCQkgICAgICAgKCoqaW4gPT0gJ1xuJykpKSB7CisJCSoqaW4gPSAnXDAnOworCQkqaW4gPSAqaW4gKyAxOworCX0KKworCXJldHVybiByZXRfcHRyOworfQorCisvKgorICogcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSwgZ2l2aW5nIHRoZSBsaW5lIG51bWJlciBpbiB0aGUgZmlsZSB3aGVyZQorICogdGhlIGVycm9yIG9jY3VycmVkLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX2VycihjaGFyICpzKQoreworCXByX2VycigiZGdhcDogcGFyc2U6ICVzXG4iLCBzKTsKK30KKworLyoKKyAqIGFsbG9jYXRlIGEgbmV3IGNvbmZpZ3VyYXRpb24gbm9kZSBvZiB0eXBlIHQKKyAqLworc3RhdGljIHN0cnVjdCBjbm9kZSAqZGdhcF9uZXdub2RlKGludCB0KQoreworCXN0cnVjdCBjbm9kZSAqbjsKKworCW4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY25vZGUpLCBHRlBfQVRPTUlDKTsKKwlpZiAobiAhPSBOVUxMKSB7CisJCW1lbXNldCgoY2hhciAqKW4sIDAsIHNpemVvZihzdHJ1Y3QgY25vZGUpKTsKKwkJbi0+dHlwZSA9IHQ7CisJfQorCXJldHVybiBuOworfQorCisvKgorICogZGdhcF9jaGVja25vZGU6IHNlZSBpZiBhbGwgdGhlIG5lY2Vzc2FyeSBpbmZvIGhhcyBiZWVuIHN1cHBsaWVkIGZvciBhIG5vZGUKKyAqIGJlZm9yZSBjcmVhdGluZyB0aGUgbmV4dCBub2RlLgorICovCitzdGF0aWMgaW50IGRnYXBfY2hlY2tub2RlKHN0cnVjdCBjbm9kZSAqcCkKK3sKKwlzd2l0Y2ggKHAtPnR5cGUpIHsKKwljYXNlIEJOT0RFOgorCQlpZiAocC0+dS5ib2FyZC52X3R5cGUgPT0gMCkgeworCQkJZGdhcF9lcnIoImJvYXJkIHR5cGUgIW5vdCBzcGVjaWZpZWQiKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJcmV0dXJuIDA7CisKKwljYXNlIExOT0RFOgorCQlpZiAocC0+dS5saW5lLnZfc3BlZWQgPT0gMCkgeworCQkJZGdhcF9lcnIoImxpbmUgc3BlZWQgbm90IHNwZWNpZmllZCIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIENOT0RFOgorCQlpZiAocC0+dS5jb25jLnZfdHlwZSA9PSAwKSB7CisJCQlkZ2FwX2VycigiY29uY2VudHJhdG9yIHR5cGUgbm90IHNwZWNpZmllZCIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKHAtPnUuY29uYy52X3NwZWVkID09IDApIHsKKwkJCWRnYXBfZXJyKCJjb25jZW50cmF0b3IgbGluZSBzcGVlZCBub3Qgc3BlY2lmaWVkIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAocC0+dS5jb25jLnZfbnBvcnQgPT0gMCkgeworCQkJZGdhcF9lcnIoIm51bWJlciBvZiBwb3J0cyBvbiBjb25jZW50cmF0b3Igbm90IHNwZWNpZmllZCIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKHAtPnUuY29uYy52X2lkID09IDApIHsKKwkJCWRnYXBfZXJyKCJjb25jZW50cmF0b3IgaWQgbGV0dGVyIG5vdCBzcGVjaWZpZWQiKTsKKwkJCXJldHVybiAxOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBNTk9ERToKKwkJaWYgKHAtPnUubW9kdWxlLnZfdHlwZSA9PSAwKSB7CisJCQlkZ2FwX2VycigiRUJJIG1vZHVsZSB0eXBlIG5vdCBzcGVjaWZpZWQiKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChwLT51Lm1vZHVsZS52X25wb3J0ID09IDApIHsKKwkJCWRnYXBfZXJyKCJudW1iZXIgb2YgcG9ydHMgb24gRUJJIG1vZHVsZSBub3Qgc3BlY2lmaWVkIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAocC0+dS5tb2R1bGUudl9pZCA9PSAwKSB7CisJCQlkZ2FwX2VycigiRUJJIG1vZHVsZSBpZCBsZXR0ZXIgbm90IHNwZWNpZmllZCIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogc2F2ZSBhIHN0cmluZyBzb21ld2hlcmUKKyAqLworc3RhdGljIGNoYXIJKmRnYXBfc2F2ZXN0cmluZyhjaGFyICpzKQoreworCWNoYXIJKnA7CisKKwlwID0ga21hbGxvYyhzdHJsZW4ocykgKyAxLCBHRlBfQVRPTUlDKTsKKwlpZiAocCkKKwkJc3RyY3B5KHAsIHMpOworCXJldHVybiBwOworfQorCisvKgorICogR2l2ZW4gYSBib2FyZCBwb2ludGVyLCByZXR1cm5zIHdoZXRoZXIgd2Ugc2hvdWxkIHVzZSBpbnRlcnJ1cHRzIG9yIG5vdC4KKyAqLworc3RhdGljIHVpbnQgZGdhcF9jb25maWdfZ2V0X3VzZWludHIoc3RydWN0IGJvYXJkX3QgKmJkKQoreworCXN0cnVjdCBjbm9kZSAqcCA9IE5VTEw7CisKKwlpZiAoIWJkKQorCQlyZXR1cm4gMDsKKworCWZvciAocCA9IGJkLT5iZF9jb25maWc7IHA7IHAgPSBwLT5uZXh0KSB7CisJCXN3aXRjaCAocC0+dHlwZSkgeworCQljYXNlIElOVFJOT0RFOgorCQkJLyoKKwkJCSAqIGNoZWNrIGZvciBwY3hyIHR5cGVzLgorCQkJICovCisJCQlyZXR1cm4gcC0+dS51c2VpbnRyOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBJZiBub3QgZm91bmQsIHRoZW4gZG9uJ3QgdHVybiBvbiBpbnRlcnJ1cHRzLiAqLworCXJldHVybiAwOworfQorCisvKgorICogR2l2ZW4gYSBib2FyZCBwb2ludGVyLCByZXR1cm5zIHdoZXRoZXIgd2UgdHVybiBvbiBhbHRwaW4gb3Igbm90LgorICovCitzdGF0aWMgdWludCBkZ2FwX2NvbmZpZ19nZXRfYWx0cGluKHN0cnVjdCBib2FyZF90ICpiZCkKK3sKKwlzdHJ1Y3QgY25vZGUgKnAgPSBOVUxMOworCisJaWYgKCFiZCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKHAgPSBiZC0+YmRfY29uZmlnOyBwOyBwID0gcC0+bmV4dCkgeworCQlzd2l0Y2ggKHAtPnR5cGUpIHsKKwkJY2FzZSBBTk9ERToKKwkJCS8qCisJCQkgKiBjaGVjayBmb3IgcGN4ciB0eXBlcy4KKwkJCSAqLworCQkJcmV0dXJuIHAtPnUuYWx0cGluOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBJZiBub3QgZm91bmQsIHRoZW4gZG9uJ3QgdHVybiBvbiBpbnRlcnJ1cHRzLiAqLworCXJldHVybiAwOworfQorCisvKgorICogR2l2ZW4gYSBzcGVjaWZpYyB0eXBlIG9mIGJvYXJkLCBpZiBmb3VuZCwgZGV0YWNoZWQgbGluayBhbmQKKyAqIHJldHVybnMgdGhlIGZpcnN0IG9jY3VycmVuY2UgaW4gdGhlIGxpc3QuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY25vZGUgKmRnYXBfZmluZF9jb25maWcoaW50IHR5cGUsIGludCBidXMsIGludCBzbG90KQoreworCXN0cnVjdCBjbm9kZSAqcCwgKnByZXYgPSBOVUxMLCAqcHJldjIgPSBOVUxMLCAqZm91bmQgPSBOVUxMOworCisJcCA9ICZkZ2FwX2hlYWQ7CisKKwl3aGlsZSAocC0+bmV4dCAhPSBOVUxMKSB7CisJCXByZXYgPSBwOworCQlwID0gcC0+bmV4dDsKKworCQlpZiAocC0+dHlwZSA9PSBCTk9ERSkgeworCisJCQlpZiAocC0+dS5ib2FyZC50eXBlID09IHR5cGUpIHsKKworCQkJCWlmIChwLT51LmJvYXJkLnZfcGNpYnVzICYmCisJCQkJICAgIHAtPnUuYm9hcmQucGNpYnVzICE9IGJ1cykKKwkJCQkJY29udGludWU7CisJCQkJaWYgKHAtPnUuYm9hcmQudl9wY2lzbG90ICYmCisJCQkJICAgIHAtPnUuYm9hcmQucGNpc2xvdCAhPSBzbG90KQorCQkJCQljb250aW51ZTsKKworCQkJCWZvdW5kID0gcDsKKwkJCQkvKgorCQkJCSAqIEtlZXAgd2Fsa2luZyB0aHJ1IHRoZSBsaXN0IHRpbGwgd2UKKwkJCQkgKiBmaW5kIHRoZSBuZXh0IGJvYXJkLgorCQkJCSAqLworCQkJCXdoaWxlIChwLT5uZXh0ICE9IE5VTEwpIHsKKwkJCQkJcHJldjIgPSBwOworCQkJCQlwID0gcC0+bmV4dDsKKwkJCQkJaWYgKHAtPnR5cGUgPT0gQk5PREUpIHsKKworCQkJCQkJLyoKKwkJCQkJCSAqIE1hcmsgdGhlIGVuZCBvZiBvdXIgMSBib2FyZAorCQkJCQkJICogY2hhaW4gb2YgY29uZmlncy4KKwkJCQkJCSAqLworCQkJCQkJcHJldjItPm5leHQgPSBOVUxMOworCisJCQkJCQkvKgorCQkJCQkJICogTGluayB0aGUgIm5leHQiIGJvYXJkIHRvIHRoZQorCQkJCQkJICogcHJldmlvdXMgYm9hcmQsIGVmZmVjdGl2ZWx5CisJCQkJCQkgKiAidW5saW5raW5nIiBvdXIgYm9hcmQgZnJvbQorCQkJCQkJICogdGhlIG1haW4gY29uZmlnLgorCQkJCQkJICovCisJCQkJCQlwcmV2LT5uZXh0ID0gcDsKKworCQkJCQkJcmV0dXJuIGZvdW5kOworCQkJCQl9CisJCQkJfQorCQkJCS8qCisJCQkJICogSXQgbXVzdCBiZSB0aGUgbGFzdCBib2FyZCBpbiB0aGUgbGlzdC4KKwkJCQkgKi8KKwkJCQlwcmV2LT5uZXh0ID0gTlVMTDsKKwkJCQlyZXR1cm4gZm91bmQ7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBHaXZlbiBhIGJvYXJkIHBvaW50ZXIsIHdhbGtzIHRoZSBjb25maWcgbGluaywgY291bnRpbmcgdXAKKyAqIGFsbCBwb3J0cyB1c2VyIHNwZWNpZmllZCBzaG91bGQgYmUgb24gdGhlIGJvYXJkLgorICogKFRoaXMgZG9lcyBOT1QgbWVhbiB0aGV5IGFyZSBhbGwgYWN0dWFsbHkgcHJlc2VudCByaWdodCBub3cgdGhvKQorICovCitzdGF0aWMgdWludCBkZ2FwX2NvbmZpZ19nZXRfbnVtX3BydHMoc3RydWN0IGJvYXJkX3QgKmJkKQoreworCWludCBjb3VudCA9IDA7CisJc3RydWN0IGNub2RlICpwID0gTlVMTDsKKworCWlmICghYmQpCisJCXJldHVybiAwOworCisJZm9yIChwID0gYmQtPmJkX2NvbmZpZzsgcDsgcCA9IHAtPm5leHQpIHsKKworCQlzd2l0Y2ggKHAtPnR5cGUpIHsKKwkJY2FzZSBCTk9ERToKKwkJCS8qCisJCQkgKiBjaGVjayBmb3IgcGN4ciB0eXBlcy4KKwkJCSAqLworCQkJaWYgKHAtPnUuYm9hcmQudHlwZSA+IEVQQ0ZFKQorCQkJCWNvdW50ICs9IHAtPnUuYm9hcmQubnBvcnQ7CisJCQlicmVhazsKKwkJY2FzZSBDTk9ERToKKwkJCWNvdW50ICs9IHAtPnUuY29uYy5ucG9ydDsKKwkJCWJyZWFrOworCQljYXNlIE1OT0RFOgorCQkJY291bnQgKz0gcC0+dS5tb2R1bGUubnBvcnQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjaGFyICpkZ2FwX2NyZWF0ZV9jb25maWdfc3RyaW5nKHN0cnVjdCBib2FyZF90ICpiZCwgY2hhciAqc3RyaW5nKQoreworCWNoYXIgKnB0ciA9IHN0cmluZzsKKwlzdHJ1Y3QgY25vZGUgKnAgPSBOVUxMOworCXN0cnVjdCBjbm9kZSAqcSA9IE5VTEw7CisJaW50IHNwZWVkOworCisJaWYgKCFiZCkgeworCQkqcHRyID0gMHhmZjsKKwkJcmV0dXJuIHN0cmluZzsKKwl9CisKKwlmb3IgKHAgPSBiZC0+YmRfY29uZmlnOyBwOyBwID0gcC0+bmV4dCkgeworCisJCXN3aXRjaCAocC0+dHlwZSkgeworCQljYXNlIExOT0RFOgorCQkJKnB0ciA9ICdcMCc7CisJCQlwdHIrKzsKKwkJCSpwdHIgPSBwLT51LmxpbmUuc3BlZWQ7CisJCQlwdHIrKzsKKwkJCWJyZWFrOworCQljYXNlIENOT0RFOgorCQkJLyoKKwkJCSAqIEJlY2F1c2UgdGhlIEVQQy9jb24gY29uY2VudHJhdG9ycyBjYW4gaGF2ZSBFTSBtb2R1bGVzCisJCQkgKiBoYW5naW5nIG9mZiBvZiB0aGVtLCB3ZSBoYXZlIHRvIHdhbGsgYWhlYWQgaW4gdGhlCisJCQkgKiBsaXN0IGFuZCBrZWVwIGFkZGluZyB0aGUgbnVtYmVyIG9mIHBvcnRzIG9uIGVhY2ggRU0KKwkJCSAqIHRvIHRoZSBjb25maWcuIFVHSCEKKwkJCSAqLworCQkJc3BlZWQgPSBwLT51LmNvbmMuc3BlZWQ7CisJCQlxID0gcC0+bmV4dDsKKwkJCWlmICgocSAhPSBOVUxMKSAmJiAocS0+dHlwZSA9PSBNTk9ERSkpIHsKKwkJCQkqcHRyID0gKHAtPnUuY29uYy5ucG9ydCArIDB4ODApOworCQkJCXB0cisrOworCQkJCXAgPSBxOworCQkJCXdoaWxlICgocS0+bmV4dCAhPSBOVUxMKSAmJgorCQkJCSAgICAgICAocS0+bmV4dC0+dHlwZSkgPT0gTU5PREUpIHsKKworCQkJCQkqcHRyID0gKHEtPnUubW9kdWxlLm5wb3J0ICsgMHg4MCk7CisJCQkJCXB0cisrOworCQkJCQlwID0gcTsKKwkJCQkJcSA9IHEtPm5leHQ7CisJCQkJfQorCQkJCSpwdHIgPSBxLT51Lm1vZHVsZS5ucG9ydDsKKwkJCQlwdHIrKzsKKwkJCX0gZWxzZSB7CisJCQkJKnB0ciA9IHAtPnUuY29uYy5ucG9ydDsKKwkJCQlwdHIrKzsKKwkJCX0KKworCQkJKnB0ciA9IHNwZWVkOworCQkJcHRyKys7CisJCQlicmVhazsKKwkJfQorCX0KKworCSpwdHIgPSAweGZmOworCXJldHVybiBzdHJpbmc7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwLmggYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4ZjVmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXAuaApAQCAtMCwwICsxLDEzMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMyBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKKyAqICAgICAgU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQorICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEcml2ZXIgaW5jbHVkZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0RHQVBfRFJJVkVSX0gKKyNkZWZpbmUgX19ER0FQX0RSSVZFUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPiAgICAgICAgLyogVG8gcGljayB1cCB0aGUgdmFyaW9ucyBMaW51eCB0eXBlcyAqLworI2luY2x1ZGUgPGxpbnV4L3R0eS5oPiAgICAgICAgICAvKiBUbyBwaWNrIHVwIHRoZSB2YXJpb3VzIHR0eSBzdHJ1Y3RzL2RlZmluZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4gICAgLyogRm9yIGlycXJldHVybl90IHR5cGUgKi8KKworI2lmbmRlZiBUUlVFCisjIGRlZmluZSBUUlVFIDEKKyNlbmRpZgorCisjaWZuZGVmIEZBTFNFCisjIGRlZmluZSBGQUxTRSAwCisjZW5kaWYKKworLyogUmVxdWlyZWQgZm9yIG91ciBzaGFyZWQgaGVhZGVycyEgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJdWNoYXI7CisKKyNpZiAhZGVmaW5lZChUVFlfRkxJUEJVRl9TSVpFKQorIyBkZWZpbmUgVFRZX0ZMSVBCVUZfU0laRSA1MTIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERyaXZlciBkZWZpbmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBEcml2ZXIgaWRlbnRpZmljYXRpb24KKyAqLworI2RlZmluZQlER19OQU1FCQkiZGdhcC0xLjMtMTYiCisjZGVmaW5lCURHX1BBUlQJCSI0MDAwMjM0N19DIgorI2RlZmluZQlEUlZTVFIJCSJkZ2FwIgorCisvKgorICogZGVmaW5lcyBmcm9tIGRnYXBfcGNpLmgKKyAqLyAKKyNkZWZpbmUgUENJTUFYIDMyCQkJLyogbWF4aW11bSBudW1iZXIgb2YgUENJIGJvYXJkcyAqLworCisjZGVmaW5lIERJR0lfVklECQkweDExNEYKKworI2RlZmluZSBQQ0lfREVWX0VQQ19ESUQJCTB4MDAwMgorI2RlZmluZSBQQ0lfREVWX1hFTV9ESUQJCTB4MDAwNAorI2RlZmluZSBQQ0lfREVWX1hSX0RJRAkJMHgwMDA1CisjZGVmaW5lIFBDSV9ERVZfQ1hfRElECQkweDAwMDYKKyNkZWZpbmUgUENJX0RFVl9YUkpfRElECQkweDAwMDkJLyogUExYLWJhc2VkIFhyIGFkYXB0ZXIgKi8KKyNkZWZpbmUgUENJX0RFVl9YUl9JQk1fRElECTB4MDAxMQkvKiBJQk0gOC1wb3J0IEFzeW5jIEFkYXB0ZXIgKi8KKyNkZWZpbmUgUENJX0RFVl9YUl9CVUxMX0RJRAkweDAwMTMJLyogQlVMTCA4LXBvcnQgQXN5bmMgQWRhcHRlciAqLworI2RlZmluZSBQQ0lfREVWX1hSX1NBSVBfRElECTB4MDAxYwkvKiBTQUlQIGNhcmQgLSBYciBhZGFwdGVyICovCisjZGVmaW5lIFBDSV9ERVZfWFJfNDIyX0RJRAkweDAwMTIJLyogWHItNDIyICovCisjZGVmaW5lIFBDSV9ERVZfOTIwXzJfRElECTB4MDAzNAkvKiBYUi1QbHVzIDkyMCBLLCAyIHBvcnQgKi8KKyNkZWZpbmUgUENJX0RFVl85MjBfNF9ESUQJMHgwMDI2CS8qIFhSLVBsdXMgOTIwIEssIDQgcG9ydCAqLworI2RlZmluZSBQQ0lfREVWXzkyMF84X0RJRAkweDAwMjcJLyogWFItUGx1cyA5MjAgSywgOCBwb3J0ICovCisjZGVmaW5lIFBDSV9ERVZfRVBDSl9ESUQJMHgwMDBhCS8qIFBMWCA5MDYwIGNoaXAgZm9yIFBDSSAgKi8KKyNkZWZpbmUgUENJX0RFVl9DWF9JQk1fRElECTB4MDAxYgkvKiBJQk0gMTI4LXBvcnQgQXN5bmMgQWRhcHRlciAqLworI2RlZmluZSBQQ0lfREVWXzkyMF84X0hQX0RJRAkweDAwNTgJLyogSFAgWFItUGx1cyA5MjAgSywgOCBwb3J0ICovCisjZGVmaW5lIFBDSV9ERVZfWEVNX0hQX0RJRAkweDAwNTkgIC8qIEhQIFhlbSBQQ0kgKi8KKworI2RlZmluZSBQQ0lfREVWX1hFTV9OQU1FCSJBY2NlbGVQb3J0IFhFTSIKKyNkZWZpbmUgUENJX0RFVl9DWF9OQU1FCQkiQWNjZWxlUG9ydCBDWCIKKyNkZWZpbmUgUENJX0RFVl9YUl9OQU1FCQkiQWNjZWxlUG9ydCBYciIKKyNkZWZpbmUgUENJX0RFVl9YUkpfTkFNRQkiQWNjZWxlUG9ydCBYciAoUExYKSIKKyNkZWZpbmUgUENJX0RFVl9YUl9TQUlQX05BTUUJIkFjY2VsZVBvcnQgWHIgKFNBSVApIgorI2RlZmluZSBQQ0lfREVWXzkyMF8yX05BTUUJIkFjY2VsZVBvcnQgWHI5MjAgMiBwb3J0IgorI2RlZmluZSBQQ0lfREVWXzkyMF80X05BTUUJIkFjY2VsZVBvcnQgWHI5MjAgNCBwb3J0IgorI2RlZmluZSBQQ0lfREVWXzkyMF84X05BTUUJIkFjY2VsZVBvcnQgWHI5MjAgOCBwb3J0IgorI2RlZmluZSBQQ0lfREVWX1hSXzQyMl9OQU1FCSJBY2NlbGVQb3J0IFhyIDQyMiIKKyNkZWZpbmUgUENJX0RFVl9FUENKX05BTUUJIkFjY2VsZVBvcnQgRVBDIChQTFgpIgorI2RlZmluZSBQQ0lfREVWX1hSX0JVTExfTkFNRQkiQWNjZWxlUG9ydCBYciAoQlVMTCkiCisjZGVmaW5lIFBDSV9ERVZfWFJfSUJNX05BTUUJIkFjY2VsZVBvcnQgWHIgKElCTSkiCisjZGVmaW5lIFBDSV9ERVZfQ1hfSUJNX05BTUUJIkFjY2VsZVBvcnQgQ1ggKElCTSkiCisjZGVmaW5lIFBDSV9ERVZfOTIwXzhfSFBfTkFNRQkiQWNjZWxlUG9ydCBYcjkyMCA4IHBvcnQgKEhQKSIKKyNkZWZpbmUgUENJX0RFVl9YRU1fSFBfTkFNRQkiQWNjZWxlUG9ydCBYRU0gKEhQKSIKKworLyoKKyAqIE9uIHRoZSBQQ0kgYm9hcmRzLCB0aGVyZSBpcyBubyBJTyBzcGFjZSBhbGxvY2F0ZWQKKyAqIFRoZSBJL08gcmVnaXN0ZXJzIHdpbGwgYmUgaW4gdGhlIGZpcnN0IDMgYnl0ZXMgb2YgdGhlCisgKiB1cHBlciAyTUIgb2YgdGhlIDRNQiBtZW1vcnkgc3BhY2UuICBUaGUgYm9hcmQgbWVtb3J5CisgKiB3aWxsIGJlIG1hcHBlZCBpbnRvIHRoZSBsb3cgMk1CIG9mIHRoZSA0TUIgbWVtb3J5IHNwYWNlCisgKi8KKworLyogUG90ZW50aWFsIGxvY2F0aW9uIG9mIFBDSSBCaW9zIGZyb20gRTAwMDAgdG8gRkZGRkYqLworI2RlZmluZSBQQ0lfQklPU19TSVpFCQkweDAwMDIwMDAwCisKKy8qIFNpemUgb2YgTWVtb3J5IGFuZCBJL08gZm9yIFBDSSAoNE1CKSAqLworI2RlZmluZSBQQ0lfUkFNX1NJWkUJCTB4MDA0MDAwMDAKKworLyogU2l6ZSBvZiBNZW1vcnkgKDJNQikgKi8KKyNkZWZpbmUgUENJX01FTV9TSVpFCQkweDAwMjAwMDAwCisKKy8qIE1heCBQQ0kgV2luZG93IFNpemUgKDJNQikgKi8KKyNkZWZpbmUgUENJX1dJTl9TSVpFCQkweDAwMjAwMDAwCisKKyNkZWZpbmUgUENJX1dJTl9TSElGVAkJMjEgLyogMjEgYml0cyBtYXggKi8KKworLyogT2Zmc2V0IG9mIEkvMCBpbiBNZW1vcnkgKDJNQikgKi8KKyNkZWZpbmUgUENJX0lPX09GRlNFVAkJMHgwMDIwMDAwMAorCisvKiBTaXplIG9mIElPICgyTUIpICovCisjZGVmaW5lIFBDSV9JT19TSVpFCQkweDAwMjAwMDAwCisKKy8qIE51bWJlciBvZiBib2FyZHMgd2Ugc3VwcG9ydCBhdCBvbmNlLiAqLworI2RlZmluZQlNQVhCT0FSRFMJMzIKKyNkZWZpbmUJTUFYUE9SVFMJMjI0CisjZGVmaW5lIE1BWFRUWU5BTUVMRU4JMjAwCisKKy8qIE91ciAzIG1hZ2ljIG51bWJlcnMgZm9yIG91ciBib2FyZCwgY2hhbm5lbCBhbmQgdW5pdCBzdHJ1Y3RzICovCisjZGVmaW5lIERHQVBfQk9BUkRfTUFHSUMJMHg1YzZkZjEwNAorI2RlZmluZSBER0FQX0NIQU5ORUxfTUFHSUMJMHg2YzZkZjEwNAorI2RlZmluZSBER0FQX1VOSVRfTUFHSUMJCTB4N2M2ZGYxMDQKKworLyogU2VyaWFsIHBvcnQgdHlwZXMgKi8KKyNkZWZpbmUgREdBUF9TRVJJQUwJCTAKKyNkZWZpbmUgREdBUF9QUklOVAkJMQorCisjZGVmaW5lCVNFUklBTF9UWVBFX05PUk1BTAkxCisKKy8qIDQgZXh0cmEgZm9yIGFsaWdubWVudCBwbGF5IHNwYWNlICovCisjZGVmaW5lIFdSSVRFQlVGTEVOCQkoKDQwOTYpICsgNCkKKyNkZWZpbmUgTVlGTElQTEVOCQlOX1RUWV9CVUZfU0laRQorCisjZGVmaW5lIFNCUkVBS19USU1FIDB4MjUKKyNkZWZpbmUgVTJCU0laRSAweDQwMAorCisjZGVmaW5lIGRnYXBfamlmZmllc19mcm9tX21zKGEpICgoKGEpICogSFopIC8gMTAwMCkKKworLyoKKyAqIE91ciBtYWpvciBmb3IgdGhlIG1nbXQgZGV2aWNlcy4KKyAqCisgKiBXZSBjYW4gdXNlIDIyLCBiZWNhdXNlIERpZ2kgd2FzIGFsbG9jYXRlZCAyMiBhbmQgMjMgZm9yIHRoZSBlcGNhIGRyaXZlci4KKyAqIDIyIGhhcyBub3cgYmVjb21lIG9ic29sZXRlIG5vdyB0aGF0IHRoZSAiY3UiIGRldmljZXMgaGF2ZQorICogYmVlbiByZW1vdmVkIGZyb20gMi42LgorICogQWxzbywgdGhpcyAqSVMqIHRoZSBlcGNhIGRyaXZlciwganVzdCBQQ0kgb25seSBub3cuCisgKi8KKyNpZm5kZWYgRElHSV9ER0FQX01BSk9SCisjIGRlZmluZSBESUdJX0RHQVBfTUFKT1IgICAgICAgICAyMgorI2VuZGlmCisKKy8qCisgKiBUaGUgcGFyYW1ldGVycyB3ZSB1c2UgdG8gZGVmaW5lIHRoZSBwZXJpb2RzIG9mIHRoZSBtb3ZpbmcgYXZlcmFnZXMuCisgKi8KKyNkZWZpbmUJCU1BX1BFUklPRAkoSFogLyAxMCkKKyNkZWZpbmUJCVNNQV9EVVIJCSgxICogSFopCisjZGVmaW5lCQlFTUFfRFVSCQkoMSAqIEhaKQorI2RlZmluZQkJU01BX05QRVJJT0RTCShTTUFfRFVSIC8gTUFfUEVSSU9EKQorI2RlZmluZQkJRU1BX05QRVJJT0RTCShFTUFfRFVSIC8gTUFfUEVSSU9EKQorCisvKgorICogRGVmaW5lIGEgbG9jYWwgZGVmYXVsdCB0ZXJtaW9zIHN0cnVjdC4gQWxsIHBvcnRzIHdpbGwgYmUgY3JlYXRlZAorICogd2l0aCB0aGlzIHRlcm1pb3MgaW5pdGlhbGx5LiAgVGhpcyBpcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgdGhhdCBpcyBkZWZpbmVkCisgKiBhcyB0aGUgZGVmYXVsdCBpbiB0dHlfaW8uYyB3aXRoIHRoZSBzYW1lIHNldHRpbmdzIG92ZXJyaWRlbiBhcyBpbiBzZXJpYWwuYworICoKKyAqIEluIHNob3J0LCB0aGlzIHNob3VsZCBtYXRjaCB0aGUgaW50ZXJuYWwgc2VyaWFsIHBvcnRzJyBkZWZhdWx0cy4KKyAqLworI2RlZmluZQlERUZBVUxUX0lGTEFHUwkoSUNSTkwgfCBJWE9OKQorI2RlZmluZQlERUZBVUxUX09GTEFHUwkoT1BPU1QgfCBPTkxDUikKKyNkZWZpbmUJREVGQVVMVF9DRkxBR1MJKEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTCkKKyNkZWZpbmUJREVGQVVMVF9MRkxBR1MJKElTSUcgfCBJQ0FOT04gfCBFQ0hPIHwgRUNIT0UgfCBFQ0hPSyB8IFwKKwkJCUVDSE9DVEwgfCBFQ0hPS0UgfCBJRVhURU4pCisKKyNpZm5kZWYgX1BPU0lYX1ZESVNBQkxFCisjZGVmaW5lICAgX1BPU0lYX1ZESVNBQkxFICdcMCcKKyNlbmRpZgorCisjZGVmaW5lIFNOSUZGX01BWAk2NTUzNgkJLyogU25pZmYgYnVmZmVyIHNpemUgKDJebikgKi8KKyNkZWZpbmUgU05JRkZfTUFTSwkoU05JRkZfTUFYIC0gMSkJLyogU25pZmYgd3JhcCBtYXNrICovCisKKyNkZWZpbmUgVlBEU0laRSAoNTEyKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgIEZFUCBtZW1vcnkgb2Zmc2V0cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgU1RBUlQgICAgICAgICAgIDB4MDAwNEwgICAgICAgICAvKiBFeGVjdXRpb24gc3RhcnQgYWRkcmVzcyAgICAgICovCisKKyNkZWZpbmUgQ01EQlVGICAgICAgICAgIDB4MGQxMEwgICAgICAgICAvKiBDb21tYW5kIChjbV90KSBzdHJ1Y3R1cmUgb2Zmc2V0ICovCisjZGVmaW5lIENNRFNUQVJUICAgICAgICAweDA0MDBMICAgICAgICAgLyogU3RhcnQgb2YgY29tbWFuZCBidWZmZXIgICAgICAqLworI2RlZmluZSBDTURNQVggICAgICAgICAgMHgwODAwTCAgICAgICAgIC8qIEVuZCBvZiBjb21tYW5kIGJ1ZmZlciAgICAgICAgKi8KKworI2RlZmluZSBFVkJVRiAgICAgICAgICAgMHgwZDE4TCAgICAgICAgIC8qIEV2ZW50IChldl90KSBzdHJ1Y3R1cmUgICAgICAgKi8KKyNkZWZpbmUgRVZTVEFSVCAgICAgICAgIDB4MDgwMEwgICAgICAgICAvKiBTdGFydCBvZiBldmVudCBidWZmZXIgICAgICAgICovCisjZGVmaW5lIEVWTUFYICAgICAgICAgICAweDBjMDBMICAgICAgICAgLyogRW5kIG9mIGV2ZW50IGJ1ZmZlciAgICAgICAgICAqLworI2RlZmluZSBGRVA1X1BMVVMgICAgICAgMHgwRTQwICAgICAgICAgIC8qIEFTQ0lJICc1JyBhbmQgQVNDSUkgJ0EnIGlzIGhlcmUgICovCisjZGVmaW5lIEVDU19TRUcgICAgICAgICAweDBFNDQgICAgICAgICAgLyogU2VnbWVudCBvZiB0aGUgZXh0ZW5kZWQgY2hhbm5lbCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgTElORV9TUEVFRCAgICAgIDB4MTAgICAgICAgICAgICAvKiBPZmZzZXQgaW50byBFQ1NfU0VHIGZvciBsaW5lIHNwZWVkICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0aGUgZmVwIGhhcyBleHRlbmRlZCBjYXBhYmlsaXRpZXMgKi8KKworLyogQklPUyBNQUdJQyBTUE9UUyAqLworI2RlZmluZSBFUlJPUiAgICAgICAgICAgMHgwQzE0TAkJLyogQklPUyBlcnJvciBjb2RlICAgICAgICAgICAgICAqLworI2RlZmluZSBTRVFVRU5DRQkweDBDMTJMCQkvKiBCSU9TIHNlcXVlbmNlIGluZGljYXRvciAgICAgICovCisjZGVmaW5lIFBPU1RBUkVBCTB4MEMwMEwJCS8qIFBPU1QgY29tcGxldGUgbWVzc2FnZSBhcmVhICAgKi8KKworLyogRkVQIE1BR0lDIFNQT1RTICovCisjZGVmaW5lIEZFUFNUQVQgICAgICAgICBQT1NUQVJFQSAgICAgICAgLyogT1MgaGVyZSB3aGVuIEZFUCBjb21lcyB1cCAgICAqLworI2RlZmluZSBOQ0hBTiAgICAgICAgICAgMHgwQzAyTCAgICAgICAgIC8qIG51bWJlciBvZiBwb3J0cyBGRVAgc2VlcyAgICAgKi8KKyNkZWZpbmUgUEFOSUMgICAgICAgICAgIDB4MEMxMEwgICAgICAgICAvKiBQQU5JQyBhcmVhIGZvciBGRVAgICAgICAgICAgICovCisjZGVmaW5lIEtNRU1FTSAgICAgICAgICAweDBDMzBMICAgICAgICAgLyogTWVtb3J5IGZvciBLTUUgdXNlICAgICAgICAgICAqLworI2RlZmluZSBDT05GSUcgICAgICAgICAgMHgwQ0QwTCAgICAgICAgIC8qIENvbmNlbnRyYXRvciBjb25maWd1cmF0aW9uIGluZm8gKi8KKyNkZWZpbmUgQ09ORklHU0laRSAgICAgIDB4MDAzMCAgICAgICAgICAvKiBjb25maWd1cmF0aW9uIGluZm8gc2l6ZSAgICAgICovCisjZGVmaW5lIERPV05SRVEgICAgICAgICAweDBEMDAgICAgICAgICAgLyogRG93bmxvYWQgcmVxdWVzdCBidWZmZXIgcG9pbnRlciAqLworCisjZGVmaW5lIENIQU5CVUYgICAgICAgICAweDEwMDBMICAgICAgICAgLyogQXN5bmMgY2hhbm5lbCAoYnNfdCkgc3RydWN0cyAqLworI2RlZmluZSBGRVBPU1NJWkUgICAgICAgMHgxRkZGICAgICAgICAgIC8qIDhLIEZFUE9TICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBYRU1QT1JUUyAgICAweEMwMgkvKgorCQkJCSAqIE9mZnNldCBpbiBib2FyZCBtZW1vcnkgd2hlcmUgRkVQNSBzdG9yZXMKKwkJCQkgKiBob3cgbWFueSBwb3J0cyBpdCBoYXMgZGV0ZWN0ZWQuCisJCQkJICogTk9URTogRkVQNSByZXBvcnRzIDY0IHBvcnRzIHdoZW4gdGhlIHVzZXIKKwkJCQkgKiBoYXMgdGhlIGNhYmxlIGluIEVCSSBPVVQgaW5zdGVhZCBvZiBFQkkgSU4uCisJCQkJICovCisKKyNkZWZpbmUgRkVQQ0xSICAgICAgMHgwMAorI2RlZmluZSBGRVBNRU0gICAgICAweDAyCisjZGVmaW5lIEZFUFJTVCAgICAgIDB4MDQKKyNkZWZpbmUgRkVQSU5UICAgICAgMHgwOAorI2RlZmluZSBGRVBNQVNLICAgICAweDBlCisjZGVmaW5lIEZFUFdJTiAgICAgIDB4ODAKKworI2RlZmluZSBMT1dNRU0gICAgICAweDAxMDAKKyNkZWZpbmUgSElHSE1FTSAgICAgMHg3ZjAwCisKKyNkZWZpbmUgRkVQVElNRU9VVCAyMDAwMDAKKworI2RlZmluZSBFTkFCTEVfSU5UUgkJMHgwZTA0CQkvKiBFbmFibGUgaW50ZXJydXB0cyBmbGFnICovCisjZGVmaW5lIEZFUFBPTExfTUlOCQkxCQkvKiBtaW5pbXVtIG9mIDEgbWlsbGlzZWNvbmQgKi8KKyNkZWZpbmUgRkVQUE9MTF9NQVgJCTIwCQkvKiBtYXhpbXVtIG9mIDIwIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBGRVBQT0xMCQkJMHgwYzI2CQkvKiBGZXAgZXZlbnQgcG9sbCBpbnRlcnZhbCAqLworCisjZGVmaW5lCUlBTFRQSU4JCQkweDAwODAJCS8qIElucHV0IGZsYWcgdG8gc3dhcCBEU1IgPC0+IERDRCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGRVAgc3VwcG9ydGVkIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgU1JMT1cJCTB4ZTAJCS8qIFNldCByZWNlaXZlIGxvdyB3YXRlcgkqLworI2RlZmluZSBTUkhJR0gJCTB4ZTEJCS8qIFNldCByZWNlaXZlIGhpZ2ggd2F0ZXIJKi8KKyNkZWZpbmUgRkxVU0hUWAkJMHhlMgkJLyogRmx1c2ggdHJhbnNtaXQgYnVmZmVyCSovCisjZGVmaW5lIFBBVVNFVFgJCTB4ZTMJCS8qIFBhdXNlIGRhdGEgdHJhbnNtaXNzaW9uCSovCisjZGVmaW5lIFJFU1VNRVRYCTB4ZTQJCS8qIFJlc3VtZSBkYXRhIHRyYW5zbWlzc2lvbgkqLworI2RlZmluZSBTTUlOVAkJMHhlNQkJLyogU2V0IE1vZGVtIEludGVycnVwdAkJKi8KKyNkZWZpbmUgU0FGTE9XQwkJMHhlNgkJLyogU2V0IEF1eC4gZmxvdyBjb250cm9sIGNoYXJzCSovCisjZGVmaW5lIFNCUkVBSwkJMHhlOAkJLyogU2VuZCBicmVhawkJCSovCisjZGVmaW5lIFNNT0RFTQkJMHhlOQkJLyogU2V0IDg1MzAgbW9kZW0gY29udHJvbCBsaW5lcwkqLworI2RlZmluZSBTSUZMQUcJCTB4ZWEJCS8qIFNldCBVTklYIGlmbGFncwkJKi8KKyNkZWZpbmUgU0ZMT1dDCQkweGViCQkvKiBTZXQgZmxvdyBjb250cm9sIGNoYXJhY3RlcnMJKi8KKyNkZWZpbmUgU1RMT1cJCTB4ZWMJCS8qIFNldCB0cmFuc21pdCBsb3cgd2F0ZXIgbWFyawkqLworI2RlZmluZSBSUEFVU0UJCTB4ZWUJCS8qIFBhdXNlIHJlY2VpdmUJCSovCisjZGVmaW5lIFJSRVNVTUUJCTB4ZWYJCS8qIFJlc3VtZSByZWNlaXZlCQkqLworI2RlZmluZSBDSFJFU0VUCQkweGYwCQkvKiBSZXNldCBDaGFubmVsCQkqLworI2RlZmluZSBCVUZTRVRBTEwJMHhmMgkJLyogU2V0IFR4ICYgUnggYnVmZmVyIHNpemUgYXZhaWwqLworI2RlZmluZSBTT0ZMQUcJCTB4ZjMJCS8qIFNldCBVTklYIG9mbGFncwkJKi8KKyNkZWZpbmUgU0hGTE9XCQkweGY0CQkvKiBTZXQgaGFyZHdhcmUgaGFuZHNoYWtlCSovCisjZGVmaW5lIFNDRkxBRwkJMHhmNQkJLyogU2V0IFVOSVggY2ZsYWdzCQkqLworI2RlZmluZSBTVk5FWFQJCTB4ZjYJCS8qIFNldCBWTkVYVCBjaGFyYWN0ZXIJCSovCisjZGVmaW5lIFNQSU5URkMJCTB4ZmMJCS8qIFJlc2VydmVkCQkJKi8KKyNkZWZpbmUgU0NPTU1PREUJMHhmZAkJLyogU2V0IFJTMjMyLzQyMiBtb2RlCQkqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU1vZGVzIGZvciBTQ09NTU9ERQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTU9ERV8yMzIJMHgwMAorI2RlZmluZSBNT0RFXzQyMgkweDAxCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICBFdmVudCBmbGFncy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElGQlJFQUsgICAgICAgICAweDAxICAgICAgICAgICAgLyogQnJlYWsgcmVjZWl2ZWQgICAgICAgICAgICAgICAqLworI2RlZmluZSBJRlRMVyAgICAgICAgICAgMHgwMiAgICAgICAgICAgIC8qIFRyYW5zbWl0IGxvdyB3YXRlciAgICAgICAgICAgKi8KKyNkZWZpbmUgSUZURU0gICAgICAgICAgIDB4MDQgICAgICAgICAgICAvKiBUcmFuc21pdHRlciBlbXB0eSAgICAgICAgICAgICovCisjZGVmaW5lIElGREFUQSAgICAgICAgICAweDA4ICAgICAgICAgICAgLyogUmVjZWl2ZSBkYXRhIHByZXNlbnQgICAgICAgICAqLworI2RlZmluZSBJRk1PREVNICAgICAgICAgMHgyMCAgICAgICAgICAgIC8qIE1vZGVtIHN0YXR1cyBjaGFuZ2UgICAgICAgICAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICBNb2RlbSBmbGFncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyMgICAgICAgZGVmaW5lICBETV9SVFMgICAgICAgICAgMHgwMiAgICAvKiBSZXF1ZXN0IHRvIHNlbmQgICAgICAgICAgICAgICovCisjICAgICAgIGRlZmluZSAgRE1fQ0QgICAgICAgICAgIDB4ODAgICAgLyogQ2FycmllciBkZXRlY3QgICAgICAgICAgICAgICAqLworIyAgICAgICBkZWZpbmUgIERNX0RTUiAgICAgICAgICAweDIwICAgIC8qIERhdGEgc2V0IHJlYWR5ICAgICAgICAgICAgICAgKi8KKyMgICAgICAgZGVmaW5lICBETV9DVFMgICAgICAgICAgMHgxMCAgICAvKiBDbGVhciB0byBzZW5kICAgICAgICAgICAgICAgICovCisjICAgICAgIGRlZmluZSAgRE1fUkkgICAgICAgICAgIDB4NDAgICAgLyogUmluZyBpbmRpY2F0b3IgICAgICAgICAgICAgICAqLworIyAgICAgICBkZWZpbmUgIERNX0RUUiAgICAgICAgICAweDAxICAgIC8qIERhdGEgdGVybWluYWwgcmVhZHkgICAgICAgICAgKi8KKworLyoKKyAqIGRlZmluZXMgZnJvbSBkZ2FwX2NvbmYuaAorICovCisjZGVmaW5lIE5VTExOT0RFIDAJCS8qIGhlYWRlciBub2RlLCBub3QgdXNlZCAqLworI2RlZmluZSBCTk9ERSAxCQkJLyogQm9hcmQgbm9kZSAqLworI2RlZmluZSBMTk9ERSAyCQkJLyogTGluZSBub2RlICovCisjZGVmaW5lIENOT0RFIDMJCQkvKiBDb25jZW50cmF0b3Igbm9kZSAqLworI2RlZmluZSBNTk9ERSA0CQkJLyogRUJJIE1vZHVsZSBub2RlICovCisjZGVmaW5lIFROT0RFIDUJCQkvKiB0dHkgbmFtZSBwcmVmaXggbm9kZSAqLworI2RlZmluZQlDVU5PREUgNgkJLyogY3UgbmFtZSBwcmVmaXggKG5vbi1TQ08pICovCisjZGVmaW5lIFBOT0RFIDcJCQkvKiB0cmFucy4gcHJpbnQgcHJlZml4IG5vZGUgKi8KKyNkZWZpbmUgSk5PREUgOAkJCS8qIG1hSm9yIG51bWJlciBub2RlICovCisjZGVmaW5lIEFOT0RFIDkJCQkvKiBhbHRwaW4gKi8KKyNkZWZpbmUJVFNOT0RFIDEwCQkvKiB0dHkgc3RydWN0dXJlIHNpemUgKi8KKyNkZWZpbmUgQ1NOT0RFIDExCQkvKiBjaGFubmVsIHN0cnVjdHVyZSBzaXplICovCisjZGVmaW5lIEJTTk9ERSAxMgkJLyogYm9hcmQgc3RydWN0dXJlIHNpemUgKi8KKyNkZWZpbmUgVVNOT0RFIDEzCQkvKiB1bml0IHNjaGVkdWxlIHN0cnVjdHVyZSBzaXplICovCisjZGVmaW5lIEZTTk9ERSAxNAkJLyogZjIyMDAgc3RydWN0dXJlIHNpemUgKi8KKyNkZWZpbmUgVlNOT0RFIDE1CQkvKiBzaXplIG9mIFZQSVggc3RydWN0dXJlcyAqLworI2RlZmluZSBJTlRSTk9ERSAxNgkJLyogZW5hYmxlIGludGVycnVwdCAqLworCisvKiBFbnVtZXJhdGlvbiBvZiB0b2tlbnMgKi8KKyNkZWZpbmUJQkVHSU4JMQorI2RlZmluZQlFTkQJMgorI2RlZmluZQlCT0FSRAkxMAorCisjZGVmaW5lIEVQQ0ZTCTExIC8qIHN0YXJ0IG9mIEVQQyBmYW1pbHkgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUJSUNYCQkxMQorI2RlZmluZQlNQ1gJCTEzCisjZGVmaW5lIFBDWAkxNAorI2RlZmluZQlJRVBDCTE1CisjZGVmaW5lCUVFUEMJMTYKKyNkZWZpbmUJTUVQQwkxNworI2RlZmluZQlJUENNCTE4CisjZGVmaW5lCUVQQ00JMTkKKyNkZWZpbmUJTVBDTQkyMAorI2RlZmluZSBQRVBDCTIxCisjZGVmaW5lIFBQQ00JMjIKKyNpZmRlZiBDUAorI2RlZmluZSBJQ1AgICAgIDIzCisjZGVmaW5lIEVDUCAgICAgMjQKKyNkZWZpbmUgTUNQICAgICAyNQorI2VuZGlmCisjZGVmaW5lIEVQQ0ZFCTI1IC8qIGVuZCBvZiBFUEMgZmFtaWx5IGRlZmluaXRpb25zICovCisjZGVmaW5lCVBDMkUJMjYKKyNkZWZpbmUJUEM0RQkyNworI2RlZmluZQlQQzRFOEsJMjgKKyNkZWZpbmUJUEM4RQkyOQorI2RlZmluZQlQQzhFOEsJMzAKKyNkZWZpbmUJUEMxNkUJMzEKKyNkZWZpbmUgTUMyRThLICAzNAorI2RlZmluZSBNQzRFOEsgIDM1CisjZGVmaW5lIE1DOEU4SyAgMzYKKworI2RlZmluZSBBVkFORlMJNDIJLyogc3RhcnQgb2YgQXZhbnN0YXIgZmFtaWx5IGRlZmluaXRpb25zICovCisjZGVmaW5lIEE4UCAJNDIKKyNkZWZpbmUgQTE2UAk0MworI2RlZmluZSBBVkFORkUJNDMJLyogZW5kIG9mIEF2YW5zdGFyIGZhbWlseSBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIERBMjAwMEZTCTQ0CS8qIHN0YXJ0IG9mIEFjY2VsZVBvcnQgMjAwMCBmYW1pbHkgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgREEyMiAJCTQ0IC8qIEFjY2VsZVBvcnQgMjAwMiAqLworI2RlZmluZSBEQTI0IAkJNDUgLyogQWNjZWxlUG9ydCAyMDA0ICovCisjZGVmaW5lIERBMjgJCTQ2IC8qIEFjY2VsZVBvcnQgMjAwOCAqLworI2RlZmluZSBEQTIxNgkJNDcgLyogQWNjZWxlUG9ydCAyMDE2ICovCisjZGVmaW5lIERBUjQJCTQ4IC8qIEFjY2VsZVBvcnQgUkFTIDQgcG9ydCAqLworI2RlZmluZSBEQVI4CQk0OSAvKiBBY2NlbGVQb3J0IFJBUyA4IHBvcnQgKi8KKyNkZWZpbmUgRERSMjQJCTUwIC8qIERhdGFGaXJlIFJBUyAyNCBwb3J0ICovCisjZGVmaW5lIEREUjMwCQk1MSAvKiBEYXRhRmlyZSBSQVMgMzAgcG9ydCAqLworI2RlZmluZSBERFI0OAkJNTIgLyogRGF0YUZpcmUgUkFTIDQ4IHBvcnQgKi8KKyNkZWZpbmUgRERSNjAJCTUzIC8qIERhdGFGaXJlIFJBUyA2MCBwb3J0ICovCisjZGVmaW5lIERBMjAwMEZFCTUzIC8qIGVuZCBvZiBBY2NlbGVQb3J0IDIwMDAvUkFTIGZhbWlseSBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIFBDWFJGUwkxMDYJLyogc3RhcnQgb2YgUENYUiBmYW1pbHkgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUJQVBPUlQ0CTEwNgorI2RlZmluZQlBUE9SVDgJMTA3CisjZGVmaW5lIFBBUE9SVDQgMTA4CisjZGVmaW5lIFBBUE9SVDggMTA5CisjZGVmaW5lIEFQT1JUNF85MjBJCTExMAorI2RlZmluZSBBUE9SVDhfOTIwSQkxMTEKKyNkZWZpbmUgQVBPUlQ0XzkyMFAJMTEyCisjZGVmaW5lIEFQT1JUOF85MjBQCTExMworI2RlZmluZSBBUE9SVDJfOTIwUCAxMTQKKyNkZWZpbmUgUENYUkZFCTExNwkvKiBlbmQgb2YgUENYUiBmYW1pbHkgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZQlMSU5FCTgyCisjaWZkZWYgVDEKKyNkZWZpbmUgVDFNCTgzCisjZGVmaW5lIEUxTQk4NAorI2VuZGlmCisjZGVmaW5lCUNPTkMJNjQKKyNkZWZpbmUJQ1gJNjUKKyNkZWZpbmUJRVBDCTY2CisjZGVmaW5lCU1PRAk2NworI2RlZmluZQlQT1JUUwk2OAorI2RlZmluZSBNRVRIT0QJNjkKKyNkZWZpbmUgQ1VTVE9NCTcwCisjZGVmaW5lIEJBU0lDCTcxCisjZGVmaW5lIFNUQVRVUwk3MgorI2RlZmluZSBNT0RFTQk3MworLyogVGhlIGZvbGxvd2luZyB0b2tlbnMgY2FuIGFwcGVhciBpbiBtdWx0aXBsZSBwbGFjZXMgKi8KKyNkZWZpbmUJU1BFRUQJNzQKKyNkZWZpbmUJTlBPUlRTCTc1CisjZGVmaW5lCUlECTc2CisjZGVmaW5lIENBQkxFCTc3CisjZGVmaW5lIENPTk5FQ1QJNzgKKyNkZWZpbmUJSU8JNzkKKyNkZWZpbmUJTUVNCTgwCisjZGVmaW5lIERQU1oJODEKKworI2RlZmluZQlUVFlOCTkwCisjZGVmaW5lCUNVCTkxCisjZGVmaW5lCVBSSU5UCTkyCisjZGVmaW5lCVhQUklOVAk5MworI2RlZmluZSBDTUFKT1IgICA5NAorI2RlZmluZSBBTFRQSU4gIDk1CisjZGVmaW5lIFNUQVJUTyA5NgorI2RlZmluZSBVU0VJTlRSICA5NworI2RlZmluZSBQQ0lJTkZPICA5OAorCisjZGVmaW5lCVRUU0laCTEwMAorI2RlZmluZQlDSFNJWgkxMDEKKyNkZWZpbmUgQlNTSVoJMTAyCisjZGVmaW5lCVVOVFNJWgkxMDMKKyNkZWZpbmUJRjJTSVoJMTA0CisjZGVmaW5lCVZQU0laCTEwNQorCisjZGVmaW5lCVRPVEFMX0JPQVJECTIKKyNkZWZpbmUJQ1VSUkVOVF9CUkQJNAorI2RlZmluZQlCT0FSRF9UWVBFCTYKKyNkZWZpbmUJSU9fQUREUkVTUwk4CisjZGVmaW5lCU1FTV9BRERSRVNTCTEwCisKKyNkZWZpbmUJRklFTERTX1BFUl9QQUdFCTE4CisKKyNkZWZpbmUgVEJfRklFTEQJMQorI2RlZmluZSBDQl9GSUVMRAkzCisjZGVmaW5lIEJUX0ZJRUxECTUKKyNkZWZpbmUgSU9fRklFTEQJNworI2RlZmluZSBJRF9GSUVMRAk4CisjZGVmaW5lIE1FX0ZJRUxECTkKKyNkZWZpbmUgVFRZX0ZJRUxECTExCisjZGVmaW5lIENVX0ZJRUxECTEzCisjZGVmaW5lIFBSX0ZJRUxECTE1CisjZGVmaW5lIE1QUl9GSUVMRAkxNworCisjZGVmaW5lCU1BWF9GSUVMRAk1MTIKKworI2RlZmluZQlJTklUCQkwCisjZGVmaW5lCU5JVEVNUwkJMTI4CisjZGVmaW5lIE1BWF9JVEVNCTUxMgorCisjZGVmaW5lCURTQ1JJTlNUCTEKKyNkZWZpbmUJRFNDUk5VTQkJMworI2RlZmluZQlBTFRQSU5RCQk1CisjZGVmaW5lCVNTQVZFCQk3CisKKyNkZWZpbmUJRFNDUgkJIjMyIgorI2RlZmluZQlPTkVUT05JTkUJIjEyMzQ1Njc4OSIKKyNkZWZpbmUJQUxMCQkiMTIzNDU2Nzg5MCIKKworLyoKKyAqIEFsbCB0aGUgcG9zc2libGUgc3RhdGVzIHRoZSBkcml2ZXIgY2FuIGJlIHdoaWxlIGJlaW5nIGxvYWRlZC4KKyAqLworZW51bSB7CisJRFJJVkVSX0lOSVRJQUxJWkVEID0gMCwKKwlEUklWRVJfUkVBRFkKK307CisKKy8qCisgKiBBbGwgdGhlIHBvc3NpYmxlIHN0YXRlcyB0aGUgYm9hcmQgY2FuIGJlIHdoaWxlIGJvb3RpbmcgdXAuCisgKi8KK2VudW0geworCUJPQVJEX0ZBSUxFRCA9IDAsCisJQk9BUkRfUkVBRFkKK307CisKKy8qCisgKiBBbGwgdGhlIHBvc3NpYmxlIHN0YXRlcyB0aGF0IGEgcmVxdWVzdGVkIGNvbmNlbnRyYXRvciBpbWFnZSBjYW4gYmUgaW4uCisgKi8KK2VudW0geworCU5PX1BFTkRJTkdfQ09OQ0VOVFJBVE9SX1JFUVVFU1RTID0gMCwKKwlORUVEX0NPTkNFTlRSQVRPUiwKKwlSRVFVRVNURURfQ09OQ0VOVFJBVE9SCit9OworCisKKworLyoKKyAqIE1vZGVtIGxpbmUgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGFzIG1hY3JvcyBiZWNhdXNlIERTUiBhbmQKKyAqIERDRCBhcmUgc3dhcGFibGUgdXNpbmcgdGhlIGRpdHR5IGFsdHBpbiBvcHRpb24uCisgKi8KKyNkZWZpbmUgRF9DRChjaCkgICAgICAgIGNoLT5jaF9jZCAgICAgICAvKiBDYXJyaWVyIGRldGVjdCAgICAgICAqLworI2RlZmluZSBEX0RTUihjaCkgICAgICAgY2gtPmNoX2RzciAgICAgIC8qIERhdGEgc2V0IHJlYWR5ICAgICAgICovCisjZGVmaW5lIERfUlRTKGNoKSAgICAgICBETV9SVFMgICAgICAgICAgLyogUmVxdWVzdCB0byBzZW5kICAgICAgKi8KKyNkZWZpbmUgRF9DVFMoY2gpICAgICAgIERNX0NUUyAgICAgICAgICAvKiBDbGVhciB0byBzZW5kICAgICAgICAqLworI2RlZmluZSBEX1JJKGNoKSAgICAgICAgRE1fUkkgICAgICAgICAgIC8qIFJpbmcgaW5kaWNhdG9yICAgICAgICovCisjZGVmaW5lIERfRFRSKGNoKSAgICAgICBETV9EVFIgICAgICAgICAgLyogRGF0YSB0ZXJtaW5hbCByZWFkeSAgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFN0cnVjdHVyZXMgYW5kIGNsb3NlbHkgcmVsYXRlZCBkZWZpbmVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qCisgKiBBIHN0cnVjdHVyZSB0byBob2xkIGEgc3RhdGlzdGljcyBjb3VudGVyLiAgV2UgYWxzbworICogY29tcHV0ZSBtb3ZpbmcgYXZlcmFnZXMgZm9yIHRoaXMgY291bnRlci4KKyAqLworc3RydWN0IG1hY291bnRlciB7CisJdTMyCQljbnQ7CS8qIFRvdGFsIGNvdW50ICovCisJdWxvbmcJCWFjY3VtOwkvKiBBY3V1bXVsYXRvciBwZXIgcGVyaW9kICovCisJdWxvbmcJCXNtYTsJLyogU2ltcGxlIG1vdmluZyBhdmVyYWdlICovCisJdWxvbmcJCWVtYTsJLyogRXhwb25lbnRpYWwgbW92aW5nIGF2ZXJhZ2UgKi8KK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGV2aWNlIGZsYWcgZGVmaW5pdGlvbnMgZm9yIGJkX2ZsYWdzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJQkRfRkVQNVBMVVMJMHgwMDAxICAgICAgICAgIC8qIFN1cHBvcnRzIEZFUDUgUGx1cyBjb21tYW5kcyAqLworI2RlZmluZSBCRF9IQVNfVlBECTB4MDAwMgkJLyogQm9hcmQgaGFzIFZQRCBpbmZvIGF2YWlsYWJsZSAqLworCisvKgorICoJUGVyLWJvYXJkIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBib2FyZF90IHsKKwlpbnQJCW1hZ2ljOwkJLyogQm9hcmQgTWFnaWMgbnVtYmVyLiAgKi8KKwlpbnQJCWJvYXJkbnVtOwkvKiBCb2FyZCBudW1iZXI6IDAtMyAqLworCWludAkJZmlyc3RtaW5vcjsJLyogRmlyc3QgbWlub3IsIGUuZy4gMCwgMzAsIDYwICovCisKKwlpbnQJCXR5cGU7CQkvKiBUeXBlIG9mIGJvYXJkICovCisJY2hhcgkJKm5hbWU7CQkvKiBQcm9kdWN0IE5hbWUgKi8KKwlzdHJ1Y3QgcGNpX2RldgkqcGRldjsJCS8qIFBvaW50ZXIgdG8gdGhlIHBjaV9kZXYgc3RydWN0ICovCisJdTE2CQl2ZW5kb3I7CQkvKiBQQ0kgdmVuZG9yIElEICovCisJdTE2CQlkZXZpY2U7CQkvKiBQQ0kgZGV2aWNlIElEICovCisJdTE2CQlzdWJ2ZW5kb3I7CS8qIFBDSSBzdWJzeXN0ZW0gdmVuZG9yIElEICovCisJdTE2CQlzdWJkZXZpY2U7CS8qIFBDSSBzdWJzeXN0ZW0gZGV2aWNlIElEICovCisJdWNoYXIJCXJldjsJCS8qIFBDSSByZXZpc2lvbiBJRCAqLworCXVpbnQJCXBjaV9idXM7CS8qIFBDSSBidXMgdmFsdWUgKi8KKwl1aW50CQlwY2lfc2xvdDsJLyogUENJIHNsb3QgdmFsdWUgKi8KKwl1MTYJCW1heHBvcnRzOwkvKiBNQVggcG9ydHMgdGhpcyBib2FyZCBjYW4gaGFuZGxlICovCisJdWNoYXIJCXZwZFtWUERTSVpFXTsJLyogVlBEIG9mIGJvYXJkLCBpZiBmb3VuZCAqLworCXUzMgkJYmRfZmxhZ3M7CS8qIEJvYXJkIGZsYWdzICovCisKKwlzcGlubG9ja190CWJkX2xvY2s7CS8qIFVzZWQgdG8gcHJvdGVjdCBib2FyZCAqLworCisJdTMyCQlzdGF0ZTsJCS8qIFN0YXRlIG9mIGNhcmQuICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgc3RhdGVfd2FpdDsJLyogUGxhY2UgdG8gc2xlZXAgb24gZm9yIHN0YXRlIGNoYW5nZSAqLworCisJc3RydWN0CQl0YXNrbGV0X3N0cnVjdCBoZWxwZXJfdGFza2xldDsgLyogUG9sbCBoZWxwZXIgdGFza2xldCAqLworCisJdTMyCQl3YWl0X2Zvcl9iaW9zOworCXUzMgkJd2FpdF9mb3JfZmVwOworCisJc3RydWN0IGNub2RlICAgICpiZF9jb25maWc7CS8qIENvbmZpZyBvZiBib2FyZCAqLworCisJdTE2CQluYXN5bmM7CQkvKiBOdW1iZXIgb2YgcG9ydHMgb24gY2FyZCAqLworCisJdTMyCQl1c2VfaW50ZXJydXB0czsJLyogU2hvdWxkIHdlIGJlIGludGVycnVwdCBkcml2ZW4/ICovCisJdWxvbmcJCWlycTsJCS8qIEludGVycnVwdCByZXF1ZXN0IG51bWJlciAqLworCXVsb25nCQlpbnRyX2NvdW50OwkvKiBDb3VudCBvZiBpbnRlcnJ1cHRzICovCisJdTMyCQlpbnRyX3VzZWQ7CS8qIE5vbi16ZXJvIGlmIHVzaW5nIGludGVycnVwdHMgKi8KKwl1MzIJCWludHJfcnVubmluZzsJLyogTm9uLXplcm8gaWYgRkVQIGtub3dzIGl0cyBkb2luZyBpbnRlcnJ1cHRzICovCisKKwl1bG9uZwkJcG9ydDsJCS8qIFN0YXJ0IG9mIGJhc2UgaW8gcG9ydCBvZiB0aGUgY2FyZCAqLworCXVsb25nCQlwb3J0X2VuZDsJLyogRW5kIG9mIGJhc2UgaW8gcG9ydCBvZiB0aGUgY2FyZCAqLworCXVsb25nCQltZW1iYXNlOwkvKiBTdGFydCBvZiBiYXNlIG1lbW9yeSBvZiB0aGUgY2FyZCAqLworCXVsb25nCQltZW1iYXNlX2VuZDsJLyogRW5kIG9mIGJhc2UgbWVtb3J5IG9mIHRoZSBjYXJkICovCisKKwl1Y2hhciAJCSpyZV9tYXBfcG9ydDsJLyogUmVtYXBwZWQgaW8gcG9ydCBvZiB0aGUgY2FyZCAqLworCXVjaGFyCQkqcmVfbWFwX21lbWJhc2U7LyogUmVtYXBwZWQgbWVtb3J5IG9mIHRoZSBjYXJkICovCisKKwl1Y2hhcgkJcnVud2FpdDsJLyogIyBQcm9jZXNzZXMgd2FpdGluZyBmb3IgRkVQICAqLworCXVjaGFyCQlpbmhpYml0X3BvbGxlcjsgLyogVGVsbHMgIHRoZSBwb2xsZXIgdG8gbGVhdmUgdXMgYWxvbmUgKi8KKworCXN0cnVjdCBjaGFubmVsX3QgKmNoYW5uZWxzW01BWFBPUlRTXTsgLyogYXJyYXkgb2YgcG9pbnRlcnMgdG8gb3VyIGNoYW5uZWxzLiAqLworCisJc3RydWN0IHR0eV9kcml2ZXIJKlNlcmlhbERyaXZlcjsKKwlzdHJ1Y3QgdHR5X3BvcnQgKlNlcmlhbFBvcnRzOworCWNoYXIJCVNlcmlhbE5hbWVbMjAwXTsKKwlzdHJ1Y3QgdHR5X2RyaXZlcgkqUHJpbnREcml2ZXI7CisJc3RydWN0IHR0eV9wb3J0ICpQcmludGVyUG9ydHM7CisJY2hhcgkJUHJpbnROYW1lWzIwMF07CisKKwl1MzIJCWRnYXBfTWFqb3JfU2VyaWFsX1JlZ2lzdGVyZWQ7CisJdTMyCQlkZ2FwX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZDsKKworCXUzMgkJZGdhcF9TZXJpYWxfTWFqb3I7CisJdTMyCQlkZ2FwX1RyYW5zcGFyZW50UHJpbnRfTWFqb3I7CisKKwlzdHJ1Y3QgYnNfdAkqYmRfYnM7CQkJLyogQmFzZSBzdHJ1Y3R1cmUgcG9pbnRlciAgICAgICAqLworCisJY2hhcgkqZmxpcGJ1ZjsJCS8qIE91ciBmbGlwIGJ1ZmZlciwgYWxsb2NlZCBpZiBib2FyZCBpcyBmb3VuZCAqLworCWNoYXIJKmZsaXBmbGFnYnVmOwkJLyogT3VyIGZsaXAgZmxhZyBidWZmZXIsIGFsbG9jZWQgaWYgYm9hcmQgaXMgZm91bmQgKi8KKworCXUxNgkJZHBhdHlwZTsJLyogVGhlIGJvYXJkICJ0eXBlIiwgYXMgZGVmaW5lZCBieSBEUEEgKi8KKwl1MTYJCWRwYXN0YXR1czsJLyogVGhlIGJvYXJkICJzdGF0dXMiLCBhcyBkZWZpbmVkIGJ5IERQQSAqLworCXdhaXRfcXVldWVfaGVhZF90IGttZV93YWl0OwkvKiBOZWVkZWQgZm9yIERQQSBzdXBwb3J0ICovCisKKwl1MzIJCWNvbmNfZGxfc3RhdHVzOwkvKiBTdGF0dXMgb2YgYW55IHBlbmRpbmcgY29uYyBkb3dubG9hZCAqLworfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFVuaXQgZmxhZyBkZWZpbml0aW9ucyBmb3IgdW5fZmxhZ3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBVTl9JU09QRU4JMHgwMDAxCQkvKiBEZXZpY2UgaXMgb3BlbgkJKi8KKyNkZWZpbmUgVU5fQ0xPU0lORwkweDAwMDIJCS8qIExpbmUgaXMgYmVpbmcgY2xvc2VkCQkqLworI2RlZmluZSBVTl9JTU0JCTB4MDAwNAkJLyogU2VydmljZSBpbW1lZGlhdGVseQkJKi8KKyNkZWZpbmUgVU5fQlVTWQkJMHgwMDA4CQkvKiBTb21lIHdvcmsgdGhpcyBjaGFubmVsCSovCisjZGVmaW5lIFVOX0JSRUFLSQkweDAwMTAJCS8qIElucHV0IGJyZWFrIHJlY2VpdmVkCQkqLworI2RlZmluZSBVTl9QV0FJVAkweDAwMjAJCS8qIFByaW50ZXIgd2FpdGluZyBmb3IgdGVybWluYWwJKi8KKyNkZWZpbmUgVU5fVElNRQkJMHgwMDQwCQkvKiBXYWl0aW5nIG9uIHRpbWUJCSovCisjZGVmaW5lIFVOX0VNUFRZCTB4MDA4MAkJLyogV2FpdGluZyBvdXRwdXQgcXVldWUgZW1wdHkJKi8KKyNkZWZpbmUgVU5fTE9XCQkweDAxMDAJCS8qIFdhaXRpbmcgb3V0cHV0IGxvdyB3YXRlciBtYXJrKi8KKyNkZWZpbmUgVU5fRVhDTF9PUEVOCTB4MDIwMAkJLyogT3BlbiBmb3IgZXhjbHVzaXZlIHVzZQkqLworI2RlZmluZSBVTl9XT1BFTgkweDA0MDAJCS8qIERldmljZSB3YWl0aW5nIGZvciBvcGVuCSovCisjZGVmaW5lIFVOX1dJT0NUTAkweDA4MDAJCS8qIERldmljZSB3YWl0aW5nIGZvciBvcGVuCSovCisjZGVmaW5lIFVOX0hBTkdVUAkweDgwMDAJCS8qIENhcnJpZXIgbG9zdAkJCSovCisKK3N0cnVjdCBkZXZpY2U7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN0cnVjdHVyZSBmb3IgdGVybWluYWwgb3IgcHJpbnRlciB1bml0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCB1bl90IHsKKwlpbnQJbWFnaWM7CQkvKiBVbml0IE1hZ2ljIE51bWJlci4JCQkqLworCXN0cnVjdAljaGFubmVsX3QgKnVuX2NoOworCXUzMgl1bl90aW1lOworCXUzMgl1bl90eXBlOworCXUzMgl1bl9vcGVuX2NvdW50OwkvKiBDb3VudGVyIG9mIG9wZW5zIHRvIHBvcnQJCSovCisJc3RydWN0IHR0eV9zdHJ1Y3QgKnVuX3R0eTsvKiBQb2ludGVyIHRvIHVuaXQgdHR5IHN0cnVjdHVyZQkqLworCXUzMgl1bl9mbGFnczsJLyogVW5pdCBmbGFncwkJCQkqLworCXdhaXRfcXVldWVfaGVhZF90IHVuX2ZsYWdzX3dhaXQ7IC8qIFBsYWNlIHRvIHNsZWVwIHRvIHdhaXQgb24gdW5pdCAqLworCXUzMgl1bl9kZXY7CQkvKiBNaW5vciBkZXZpY2UgbnVtYmVyCQkJKi8KKwl0Y2ZsYWdfdCB1bl9vZmxhZzsJLyogb2ZsYWdzIGJlaW5nIGRvbmUgb24gYm9hcmQJCSovCisJdGNmbGFnX3QgdW5fbGZsYWc7CS8qIGxmbGFncyBiZWluZyBkb25lIG9uIGJvYXJkCQkqLworCXN0cnVjdCBkZXZpY2UgKnVuX3N5c2ZzOworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZXZpY2UgZmxhZyBkZWZpbml0aW9ucyBmb3IgY2hfZmxhZ3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDSF9QUk9OICAgICAgICAgMHgwMDAxICAgICAgICAgIC8qIFByaW50ZXIgb24gc3RyaW5nICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENIX09VVCAgICAgICAgICAweDAwMDIgICAgICAgICAgLyogRGlhbC1vdXQgZGV2aWNlIG9wZW4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0hfU1RPUCAgICAgICAgIDB4MDAwNCAgICAgICAgICAvKiBPdXRwdXQgaXMgc3RvcHBlZCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDSF9TVE9QSSAgICAgICAgMHgwMDA4ICAgICAgICAgIC8qIElucHV0IGlzIHN0b3BwZWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENIX0NEICAgICAgICAgICAweDAwMTAgICAgICAgICAgLyogQ2FycmllciBpcyBwcmVzZW50ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0hfRkNBUiAgICAgICAgIDB4MDAyMCAgICAgICAgICAvKiBDYXJyaWVyIGZvcmNlZCBvbiAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIENIX1JYQkxPQ0sgICAgICAweDAwODAgICAgICAgICAgLyogRW5hYmxlIHJ4IGJsb2NrZWQgZmxhZyAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0hfV0xPVyAgICAgICAgIDB4MDEwMCAgICAgICAgICAvKiBUZXJtIHdhaXRpbmcgbG93IGV2ZW50ICAgICAgICAgICAqLworI2RlZmluZSBDSF9XRU1QVFkgICAgICAgMHgwMjAwICAgICAgICAgIC8qIFRlcm0gd2FpdGluZyBlbXB0eSBldmVudCAgICAgICAgICovCisjZGVmaW5lIENIX1JFTkFCTEUgICAgICAweDA0MDAgICAgICAgICAgLyogQnVmZmVyIGp1c3QgZW1wdGllZCAgICAgICAgICAqLworI2RlZmluZSBDSF9SQUNUSVZFICAgICAgMHgwODAwICAgICAgICAgIC8qIFByb2Nlc3MgYWN0aXZlIGluIHh4cmVhZCgpICAgKi8KKyNkZWZpbmUgQ0hfUldBSVQgICAgICAgIDB4MTAwMCAgICAgICAgICAvKiBQcm9jZXNzIHdhaXRpbmcgaW4geHhyZWFkKCkgICovCisjZGVmaW5lIENIX0JBVUQwCTB4MjAwMAkJLyogVXNlZCBmb3IgY2hlY2tpbmcgQjAgdHJhbnNpdGlvbnMgKi8KKyNkZWZpbmUgQ0hfSEFOR1VQICAgICAgIDB4ODAwMAkJLyogSGFuZ3VwIHJlY2VpdmVkICAgICAgICAgICAgICAgICAgKi8KKworLyoKKyAqIERlZmluaXRpb25zIGZvciBjaF9zbmlmZl9mbGFncworICovCisjZGVmaW5lIFNOSUZGX09QRU4JMHgxCisjZGVmaW5lIFNOSUZGX1dBSVRfREFUQQkweDIKKyNkZWZpbmUgU05JRkZfV0FJVF9TUEFDRSAweDQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqCURlZmluaXRpb25zIGZvciBEaWdpIGRpdHR5KDEpIGNvbW1hbmQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhcHBsaWNhdGlvbiBhY2Nlc3MgdG8gc3BlY2lhbCBEaWdpCisgKiBzZXJpYWwgbGluZSBlbmhhbmNlbWVudHMgd2hpY2ggYXJlIG5vdCBzdGFuZGFyZCBVTklYKHRtKSBmZWF0dXJlcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChUSU9DTU9ERykKKworI2RlZmluZQlUSU9DTU9ERwkoKCdkJzw8OCkgfCAyNTApCQkvKiBnZXQgbW9kZW0gY3RybCBzdGF0ZQkqLworI2RlZmluZQlUSU9DTU9EUwkoKCdkJzw8OCkgfCAyNTEpCQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLworCisjaWZuZGVmIFRJT0NNX0xFCisjZGVmaW5lCQlUSU9DTV9MRQkweDAxCQkvKiBsaW5lIGVuYWJsZQkJKi8KKyNkZWZpbmUJCVRJT0NNX0RUUgkweDAyCQkvKiBkYXRhIHRlcm1pbmFsIHJlYWR5CSovCisjZGVmaW5lCQlUSU9DTV9SVFMJMHgwNAkJLyogcmVxdWVzdCB0byBzZW5kCSovCisjZGVmaW5lCQlUSU9DTV9TVAkweDA4CQkvKiBzZWNvbmRhcnkgdHJhbnNtaXQJKi8KKyNkZWZpbmUJCVRJT0NNX1NSCTB4MTAJCS8qIHNlY29uZGFyeSByZWNlaXZlCSovCisjZGVmaW5lCQlUSU9DTV9DVFMJMHgyMAkJLyogY2xlYXIgdG8gc2VuZAkqLworI2RlZmluZQkJVElPQ01fQ0FSCTB4NDAJCS8qIGNhcnJpZXIgZGV0ZWN0CSovCisjZGVmaW5lCQlUSU9DTV9STkcJMHg4MAkJLyogcmluZwlpbmRpY2F0b3IJKi8KKyNkZWZpbmUJCVRJT0NNX0RTUgkweDEwMAkJLyogZGF0YSBzZXQgcmVhZHkJKi8KKyNkZWZpbmUJCVRJT0NNX1JJCVRJT0NNX1JORwkvKiByaW5nIChhbHRlcm5hdGUpCSovCisjZGVmaW5lCQlUSU9DTV9DRAlUSU9DTV9DQVIJLyogY2FycmllciBkZXRlY3QgKGFsdCkJKi8KKyNlbmRpZgorCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFRJT0NNU0VUKQorI2RlZmluZQlUSU9DTVNFVAkoKCdkJzw8OCkgfCAyNTIpCQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLworI2RlZmluZQlUSU9DTUdFVAkoKCdkJzw8OCkgfCAyNTMpCQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChUSU9DTUJJQykKKyNkZWZpbmUJVElPQ01CSUMJKCgnZCc8PDgpIHwgMjU0KQkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUgKi8KKyNkZWZpbmUJVElPQ01CSVMJKCgnZCc8PDgpIHwgMjU1KQkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUgKi8KKyNlbmRpZgorCisKKyNpZiAhZGVmaW5lZChUSU9DU0RUUikKKyNkZWZpbmUJVElPQ1NEVFIJKCgnZSc8PDgpIHwgMCkJCS8qIHNldCBEVFIJCSovCisjZGVmaW5lCVRJT0NDRFRSCSgoJ2UnPDw4KSB8IDEpCQkvKiBjbGVhciBEVFIJCSovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW9jdGwgY29tbWFuZCBhcmd1bWVudHMgZm9yIERJR0kgcGFyYW1ldGVycy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIERJR0lfR0VUQQkoKCdlJzw8OCkgfCA5NCkJCS8qIFJlYWQgcGFyYW1zCQkqLworCisjZGVmaW5lIERJR0lfU0VUQQkoKCdlJzw8OCkgfCA5NSkJCS8qIFNldCBwYXJhbXMJCSovCisjZGVmaW5lIERJR0lfU0VUQVcJKCgnZSc8PDgpIHwgOTYpCQkvKiBEcmFpbiAmIHNldCBwYXJhbXMJKi8KKyNkZWZpbmUgRElHSV9TRVRBRgkoKCdlJzw8OCkgfCA5NykJCS8qIERyYWluLCBmbHVzaCAmIHNldCBwYXJhbXMgKi8KKworI2RlZmluZSBESUdJX0tNRQkoKCdlJzw8OCkgfCA5OCkJCS8qIFJlYWQvV3JpdGUgSG9zdAkqLworCQkJCQkJLyogQWRhcHRlciBNZW1vcnkJKi8KKworI2RlZmluZQlESUdJX0dFVEZMT1cJKCgnZSc8PDgpIHwgOTkpCQkvKiBHZXQgc3RhcnRjL3N0b3BjIGZsb3cgKi8KKwkJCQkJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAJICovCisjZGVmaW5lCURJR0lfU0VURkxPVwkoKCdlJzw8OCkgfCAxMDApCQkvKiBTZXQgc3RhcnRjL3N0b3BjIGZsb3cgKi8KKwkJCQkJCS8qIGNvbnRyb2wgY2hhcmFjdGVycwkgKi8KKyNkZWZpbmUJRElHSV9HRVRBRkxPVwkoKCdlJzw8OCkgfCAxMDEpCQkvKiBHZXQgQXV4LiBzdGFydGMvc3RvcGMgKi8KKwkJCQkJCS8qIGZsb3cgY29udHJvbCBjaGFycyAJICovCisjZGVmaW5lCURJR0lfU0VUQUZMT1cJKCgnZSc8PDgpIHwgMTAyKQkJLyogU2V0IEF1eC4gc3RhcnRjL3N0b3BjICovCisJCQkJCQkvKiBmbG93IGNvbnRyb2wgY2hhcnMJICovCisKKyNkZWZpbmUgRElHSV9HRURFTEFZCSgoJ2QnPDw4KSB8IDI0NikJCS8qIEdldCBlZGVsYXkgKi8KKyNkZWZpbmUgRElHSV9TRURFTEFZCSgoJ2QnPDw4KSB8IDI0NykJCS8qIFNldCBlZGVsYXkgKi8KKworc3RydWN0CWRpZ2lmbG93X3QgeworCXVuc2lnbmVkIGNoYXIJc3RhcnRjOwkJCQkvKiBmbG93IGNudGwgc3RhcnQgY2hhcgkqLworCXVuc2lnbmVkIGNoYXIJc3RvcGM7CQkJCS8qIGZsb3cgY250bCBzdG9wIGNoYXIJKi8KK307CisKKworI2lmZGVmCUZMT1dfMjIwMAorI2RlZmluZQlGMjIwMF9HRVRBCSgoJ2UnPDw4KSB8IDEwNCkJCS8qIEdldCAyeDM2IGZsb3cgY250bCBmbGFncyAqLworI2RlZmluZQlGMjIwMF9TRVRBVwkoKCdlJzw8OCkgfCAxMDUpCQkvKiBTZXQgMngzNiBmbG93IGNudGwgZmxhZ3MgKi8KKyNkZWZpbmUJCUYyMjAwX01BU0sJMHgwMwkJLyogMjIwMCBmbG93IGNudGwgYml0IG1hc2sgICovCisjZGVmaW5lCQlGQ05UTF8yMjAwCTB4MDEJCS8qIDJ4MzYgdGVybWluYWwgZmxvdyBjbnRsICAqLworI2RlZmluZQkJUENOVExfMjIwMAkweDAyCQkvKiAyeDM2IHByaW50ZXIgZmxvdyBjbnRsICAgKi8KKyNkZWZpbmUJRjIyMDBfWE9OCTB4ZjgKKyNkZWZpbmUJUDIyMDBfWE9OCTB4ZjkKKyNkZWZpbmUJRjIyMDBfWE9GRgkweGZhCisjZGVmaW5lCVAyMjAwX1hPRkYJMHhmYgorCisjZGVmaW5lCUZYT0ZGX01BU0sJMHgwMwkJCS8qIDIyMDAgZmxvdyBzdGF0dXMgbWFzayAgICAqLworI2RlZmluZQlSQ1ZEX0ZYT0ZGCTB4MDEJCQkvKiAyeDM2IFRlcm1pbmFsIFhPRkYgcmN2ZCAgKi8KKyNkZWZpbmUJUkNWRF9QWE9GRgkweDAyCQkJLyogMngzNiBQcmludGVyIFhPRkYgcmN2ZCAgICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFsdWVzIGZvciBkaWdpX2ZsYWdzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBESUdJX0lYT04JMHgwMDAxCQkvKiBIYW5kbGUgSVhPTiBpbiB0aGUgRkVQCSovCisjZGVmaW5lIERJR0lfRkFTVAkweDAwMDIJCS8qIEZhc3QgYmF1ZCByYXRlcwkJKi8KKyNkZWZpbmUgUlRTUEFDRQkJMHgwMDA0CQkvKiBSVFMgaW5wdXQgZmxvdyBjb250cm9sCSovCisjZGVmaW5lIENUU1BBQ0UJCTB4MDAwOAkJLyogQ1RTIG91dHB1dCBmbG93IGNvbnRyb2wJKi8KKyNkZWZpbmUgRFNSUEFDRQkJMHgwMDEwCQkvKiBEU1Igb3V0cHV0IGZsb3cgY29udHJvbAkqLworI2RlZmluZSBEQ0RQQUNFCQkweDAwMjAJCS8qIERDRCBvdXRwdXQgZmxvdyBjb250cm9sCSovCisjZGVmaW5lIERUUlBBQ0UJCTB4MDA0MAkJLyogRFRSIGlucHV0IGZsb3cgY29udHJvbAkqLworI2RlZmluZSBESUdJX0NPT0sJMHgwMDgwCQkvKiBDb29rZWQgcHJvY2Vzc2luZyBkb25lIGluIEZFUCAqLworI2RlZmluZSBESUdJX0ZPUkNFRENECTB4MDEwMAkJLyogRm9yY2UgY2FycmllcgkJKi8KKyNkZWZpbmUJRElHSV9BTFRQSU4JMHgwMjAwCQkvKiBBbHRlcm5hdGUgUkotNDUgcGluIGNvbmZpZwkqLworI2RlZmluZQlESUdJX0FJWE9OCTB4MDQwMAkJLyogQXV4IGZsb3cgY29udHJvbCBpbiBmZXAJKi8KKyNkZWZpbmUJRElHSV9QUklOVEVSCTB4MDgwMAkJLyogSG9sZCBwb3J0IG9wZW4gZm9yIGZsb3cgY250cmwqLworI2RlZmluZSBESUdJX1BQX0lOUFVUCTB4MTAwMAkJLyogQ2hhbmdlIHBhcmFsbGVsIHBvcnQgdG8gaW5wdXQqLworI2RlZmluZSBESUdJX0RUUl9UT0dHTEUgMHgyMDAwCQkvKiBTdXBwb3J0IERUUiBUb2dnbGUJCSovCisjZGVmaW5lCURJR0lfNDIyCTB4NDAwMAkJLyogZm9yIDQyMi8yMzIgc2VsZWN0YWJsZSBwYW5lbCAqLworI2RlZmluZSBESUdJX1JUU19UT0dHTEUJMHg4MDAwCQkvKiBTdXBwb3J0IFJUUyBUb2dnbGUJCSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZXNlIG9wdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhlIGNvbXhpLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJRElHSV9DT01YSQkoRElHSV9GQVNUfERJR0lfQ09PS3xEU1JQQUNFfERDRFBBQ0V8RFRSUEFDRSkKKworI2RlZmluZSBESUdJX1BMRU4JMjgJCS8qIFN0cmluZyBsZW5ndGgJCSovCisjZGVmaW5lCURJR0lfVFNJWgkxMAkJLyogVGVybWluYWwgc3RyaW5nIGxlbgkJKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3RydWN0dXJlIHVzZWQgd2l0aCBpb2N0bCBjb21tYW5kcyBmb3IgRElHSSBwYXJhbWV0ZXJzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBkaWdpX3QgeworCXVuc2lnbmVkIHNob3J0CWRpZ2lfZmxhZ3M7CQkvKiBGbGFncyAoc2VlIGFib3ZlKQkqLworCXVuc2lnbmVkIHNob3J0CWRpZ2lfbWF4Y3BzOwkJLyogTWF4IHByaW50ZXIgQ1BTCSovCisJdW5zaWduZWQgc2hvcnQJZGlnaV9tYXhjaGFyOwkJLyogTWF4IGNoYXJzIGluIHByaW50IHF1ZXVlICovCisJdW5zaWduZWQgc2hvcnQJZGlnaV9idWZzaXplOwkJLyogQnVmZmVyIHNpemUJCSovCisJdW5zaWduZWQgY2hhcglkaWdpX29ubGVuOwkJLyogTGVuZ3RoIG9mIE9OIHN0cmluZwkqLworCXVuc2lnbmVkIGNoYXIJZGlnaV9vZmZsZW47CQkvKiBMZW5ndGggb2YgT0ZGIHN0cmluZwkqLworCWNoYXIJCWRpZ2lfb25zdHJbRElHSV9QTEVOXTsJLyogUHJpbnRlciBvbiBzdHJpbmcJKi8KKwljaGFyCQlkaWdpX29mZnN0cltESUdJX1BMRU5dOwkvKiBQcmludGVyIG9mZiBzdHJpbmcJKi8KKwljaGFyCQlkaWdpX3Rlcm1bRElHSV9UU0laXTsJLyogdGVybWluYWwgc3RyaW5nCSovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBLTUUgZGVmaW5pdGlvbnMgYW5kIHN0cnVjdHVyZXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlSV19JRExFCQkwCS8qIE9wZXJhdGlvbiBjb21wbGV0ZQkJCSovCisjZGVmaW5lCVJXX1JFQUQJCTEJLyogUmVhZCBDb25jZW50cmF0b3IgTWVtb3J5CQkqLworI2RlZmluZQlSV19XUklURQkyCS8qIFdyaXRlIENvbmNlbnRyYXRvciBNZW1vcnkJCSovCisKK3N0cnVjdCByd190IHsKKwl1bnNpZ25lZCBjaGFyCXJ3X3JlcTsJCS8qIFJlcXVlc3QgdHlwZQkJCSovCisJdW5zaWduZWQgY2hhcglyd19ib2FyZDsJLyogSG9zdCBBZGFwdGVyIGJvYXJkIG51bWJlcgkqLworCXVuc2lnbmVkIGNoYXIJcndfY29uYzsJLyogQ29uY2VudHJhdG9yIG51bWJlcgkJKi8KKwl1bnNpZ25lZCBjaGFyCXJ3X3Jlc2VydmVkOwkvKiBSZXNlcnZlZCBmb3IgZXhwYW5zaW9uCSovCisJdW5zaWduZWQgbG9uZwlyd19hZGRyOwkvKiBBZGRyZXNzIGluIGNvbmNlbnRyYXRvcgkqLworCXVuc2lnbmVkIHNob3J0CXJ3X3NpemU7CS8qIFJlYWQvd3JpdGUgcmVxdWVzdCBsZW5ndGgJKi8KKwl1bnNpZ25lZCBjaGFyCXJ3X2RhdGFbMTI4XTsJLyogRGF0YSB0byByZWFkL3dyaXRlCQkqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTaHJpbmsgQnVmZmVyIGFuZCBCb2FyZCBJbmZvcm1hdGlvbiBkZWZpbml0aW9ucyBhbmQgc3RydWN0dXJlcy4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkJCS8qIEJvYXJkIHR5cGUgcmV0dXJuIGNvZGVzICovCisjZGVmaW5lCVBDWElfVFlQRSAxICAgICAvKiBCb2FyZCB0eXBlIGF0IHRoZSBkZXNpZ25hdGVkIHBvcnQgaXMgYSBQQy9YaSAqLworI2RlZmluZSBQQ1hNX1RZUEUgMiAgICAgLyogQm9hcmQgdHlwZSBhdCB0aGUgZGVzaWduYXRlZCBwb3J0IGlzIGEgUEMvWG0gKi8KKyNkZWZpbmUJUENYRV9UWVBFIDMgICAgIC8qIEJvYXJkIHR5cGUgYXQgdGhlIGRlc2lnbmF0ZWQgcG9ydCBpcyBhIFBDL1hlICovCisjZGVmaW5lCU1DWElfVFlQRSA0ICAgICAvKiBCb2FyZCB0eXBlIGF0IHRoZSBkZXNpZ25hdGVkIHBvcnQgaXMgYSBNQy9YaSAqLworI2RlZmluZSBDT01YSV9UWVBFIDUgICAgIC8qIEJvYXJkIHR5cGUgYXQgdGhlIGRlc2lnbmF0ZWQgcG9ydCBpcyBhIENPTS9YaSAqLworCisJCQkgLyogTm9uLVplcm8gUmVzdWx0IGNvZGVzLiAqLworI2RlZmluZSBSRVNVTFRfTk9CREZORCAxIC8qIEEgRGlnaSBwcm9kdWN0IGF0IHRoYXQgcG9ydCBpcyBub3QgY29uZmlnIGluc3RhbGxlZCAqLworI2RlZmluZSBSRVNVTFRfTk9ERVNDVCAyIC8qIEEgbWVtb3J5IGRlc2NyaXB0b3Igd2FzIG5vdCBvYnRhaW5hYmxlICovCisjZGVmaW5lIFJFU1VMVF9OT09TU0lHIDMgLyogRkVQL09TIHNpZ25hdHVyZSB3YXMgbm90IGRldGVjdGVkIG9uIHRoZSBib2FyZCAqLworI2RlZmluZSBSRVNVTFRfVE9PU01MICA0IC8qIFRvbyBzbWFsbCBhbiBhcmVhIHRvIHNocmluay4gICovCisjZGVmaW5lIFJFU1VMVF9OT0NIQU4gIDUgLyogQ2hhbm5lbCBzdHJ1Y3R1cmUgZm9yIHRoZSBib2FyZCB3YXMgbm90IGZvdW5kICovCisKK3N0cnVjdCBzaHJpbmtfYnVmX3N0cnVjdCB7CisJdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX3ZhZGRyOwkvKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgYm9hcmQgKi8KKwl1bnNpZ25lZCBsb25nCXNocmlua19idWZfcGh5czsJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiBib2FyZCAqLworCXVuc2lnbmVkIGxvbmcJc2hyaW5rX2J1Zl9ic2VnOwkvKiBBbW91bnQgb2YgYm9hcmQgbWVtb3J5ICovCisJdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX2hzZWc7CS8qICcxODYgQmVnaW5uaW5nIG9mIER1YWwtUG9ydCAqLworCisJdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX2xzZWc7CS8qICcxODYgQmVnaW5uaW5nIG9mIGZyZWVkIG1lbW9yeQkJCQkJCSovCisJdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX21zZWc7CS8qIExpbmVhciBhZGRyZXNzIGZyb20gc3RhcnQgb2YKKwkJCQkJCSAgIGR1YWwtcG9ydCB3ZXJlIGZyZWVkIG1lbW9yeQorCQkJCQkJICAgYmVnaW5zLCBob3N0IHZpZXdwb2ludC4gKi8KKworCXVuc2lnbmVkIGxvbmcJc2hyaW5rX2J1Zl9iZHBhcmFtOwkvKiBQYXJhbWV0ZXIgZm9yIHh4bWVtb24gYW5kCisJCQkJCQkgICB4eG1lbW9mZiAqLworCisJdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX3Jlc2VydmE7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX3Jlc2VydmI7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX3Jlc2VydmM7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX3Jlc2VydmQ7CS8qIFJlc2VydmVkICovCisKKwl1bnNpZ25lZCBjaGFyCXNocmlua19idWZfcmVzdWx0OwkvKiBSZWFzb24gZm9yIGNhbGwgZmFpbGluZworCQkJCQkJICAgWmVybyBpcyBHb29kIHJldHVybiAqLworCXVuc2lnbmVkIGNoYXIJc2hyaW5rX2J1Zl9pbml0OwkvKiBOb24tWmVybyBpZiBpdCBjYXVzZWQgYW4KKwkJCQkJCSAgIHh4aW5pdCBjYWxsLiAqLworCisJdW5zaWduZWQgY2hhcglzaHJpbmtfYnVmX2FucG9ydHM7CS8qIE51bWJlciBvZiBhc3luYyBwb3J0cyAgKi8KKwl1bnNpZ25lZCBjaGFyCXNocmlua19idWZfc25wb3J0czsgCS8qIE51bWJlciBvZiBzeW5jICBwb3J0cyAqLworCXVuc2lnbmVkIGNoYXIJc2hyaW5rX2J1Zl90eXBlOwkvKiBCb2FyZCB0eXBlIDEgPSBQQy9YaSwKKwkJCQkJCQkgICAgICAyID0gUEMvWG0sCisJCQkJCQkJICAgICAgMyA9IFBDL1hlCisJCQkJCQkJICAgICAgNCA9IE1DL1hpCisJCQkJCQkJICAgICAgNSA9IENPTVgvaSAqLworCXVuc2lnbmVkIGNoYXIJc2hyaW5rX2J1Zl9jYXJkOwkvKiBDYXJkIG51bWJlciAqLworCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdHJ1Y3R1cmUgdG8gZ2V0IGRyaXZlciBzdGF0dXMgaW5mb3JtYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZGlnaV9kaW5mbyB7CisJdW5zaWduZWQgbG9uZwlkaW5mb19uYm9hcmRzOwkJLyogIyBib2FyZHMgY29uZmlndXJlZAkqLworCWNoYXIJCWRpbmZvX3Jlc2VydmVkWzEyXTsJLyogZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKwljaGFyCQlkaW5mb192ZXJzaW9uWzE2XTsJLyogZHJpdmVyIHZlcnNpb24gICAgICAgKi8KK307CisKKyNkZWZpbmUJRElHSV9HRVRERAkoKCdkJzw8OCkgfCAyNDgpCQkvKiBnZXQgZHJpdmVyIGluZm8gICAgICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdHJ1Y3R1cmUgdXNlZCB3aXRoIGlvY3RsIGNvbW1hbmRzIGZvciBwZXItYm9hcmQgaW5mb3JtYXRpb24KKyAqCisgKiBwaHlzc2l6ZSBhbmQgbWVtc2l6ZSBkaWZmZXIgd2hlbiBib2FyZCBoYXMgIndpbmRvd2VkIiBtZW1vcnkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZGlnaV9pbmZvIHsKKwl1bnNpZ25lZCBsb25nCWluZm9fYmRudW07CQkvKiBCb2FyZCBudW1iZXIgKDAgYmFzZWQpICAqLworCXVuc2lnbmVkIGxvbmcJaW5mb19pb3BvcnQ7CQkvKiBpbyBwb3J0IGFkZHJlc3MgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcJaW5mb19waHlzYWRkcjsJCS8qIG1lbW9yeSBhZGRyZXNzICAgICAgICAgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX3BoeXNzaXplOwkJLyogU2l6ZSBvZiBob3N0IG1lbSB3aW5kb3cgKi8KKwl1bnNpZ25lZCBsb25nCWluZm9fbWVtc2l6ZTsJCS8qIEFtb3VudCBvZiBkdWFsLXBvcnQgbWVtICovCisJCQkJCQkvKiBvbiBib2FyZCAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIHNob3J0CWluZm9fYmR0eXBlOwkJLyogQm9hcmQgdHlwZSAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydAlpbmZvX25wb3J0czsJCS8qIG51bWJlciBvZiBwb3J0cyAgICAgICAgICovCisJY2hhcgkJaW5mb19iZHN0YXRlOwkJLyogYm9hcmQgc3RhdGUgICAgICAgICAgICAgKi8KKwljaGFyCQlpbmZvX3Jlc2VydmVkWzddOwkvKiBmb3IgZnV0dXJlIGV4cGFuc2lvbiAgICAqLworfTsKKworI2RlZmluZQlESUdJX0dFVEJECSgoJ2QnPDw4KSB8IDI0OSkJCS8qIGdldCBib2FyZCBpbmZvICAgICAgICAgICovCisKK3N0cnVjdCBkaWdpX3N0YXQgeworCXVuc2lnbmVkIGludAlpbmZvX2NoYW47CQkvKiBDaGFubmVsIG51bWJlciAoMCBiYXNlZCkgICovCisJdW5zaWduZWQgaW50CWluZm9fYnJkOwkJLyogQm9hcmQgbnVtYmVyICgwIGJhc2VkKSAgKi8KKwl1bnNpZ25lZCBsb25nCWluZm9fY2ZsYWc7CQkvKiBjZmxhZyBmb3IgY2hhbm5lbCAgICAgICAqLworCXVuc2lnbmVkIGxvbmcJaW5mb19pZmxhZzsJCS8qIGlmbGFnIGZvciBjaGFubmVsICAgICAgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX29mbGFnOwkJLyogb2ZsYWcgZm9yIGNoYW5uZWwgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nCWluZm9fbXN0YXQ7CQkvKiBtc3RhdCBmb3IgY2hhbm5lbCAgICAgICAqLworCXVuc2lnbmVkIGxvbmcJaW5mb190eF9kYXRhOwkJLyogdHhfZGF0YSBmb3IgY2hhbm5lbCAgICAgICAqLworCXVuc2lnbmVkIGxvbmcJaW5mb19yeF9kYXRhOwkJLyogcnhfZGF0YSBmb3IgY2hhbm5lbCAgICAgICAqLworCXVuc2lnbmVkIGxvbmcJaW5mb19oZmxvdzsJCS8qIGhmbG93IGZvciBjaGFubmVsICAgICAgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX3Jlc2VydmVkWzhdOwkvKiBmb3IgZnV0dXJlIGV4cGFuc2lvbiAgICAqLworfTsKKworI2RlZmluZQlESUdJX0dFVFNUQVQJKCgnZCc8PDgpIHwgMjQ0KQkJLyogZ2V0IGJvYXJkIGluZm8gICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTdHJ1Y3R1cmUgdXNlZCB3aXRoIGlvY3RsIGNvbW1hbmRzIGZvciBwZXItY2hhbm5lbCBpbmZvcm1hdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZGlnaV9jaCB7CisJdW5zaWduZWQgbG9uZwlpbmZvX2JkbnVtOwkJLyogQm9hcmQgbnVtYmVyICgwIGJhc2VkKSAgKi8KKwl1bnNpZ25lZCBsb25nCWluZm9fY2hhbm5lbDsJCS8qIENoYW5uZWwgaW5kZXggbnVtYmVyICAgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX2NoX2NmbGFnOwkJLyogQ2hhbm5lbCBjZmxhZyAgIAkgICAqLworCXVuc2lnbmVkIGxvbmcJaW5mb19jaF9pZmxhZzsJCS8qIENoYW5uZWwgaWZsYWcgICAJICAgKi8KKwl1bnNpZ25lZCBsb25nCWluZm9fY2hfb2ZsYWc7CQkvKiBDaGFubmVsIG9mbGFnICAgCSAgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX2Noc2l6ZTsJCS8qIENoYW5uZWwgc3RydWN0dXJlIHNpemUgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX3NsZWVwX3N0YXQ7CS8qIHNsZWVwIHN0YXR1cwkJICAgKi8KKwlkZXZfdAkJaW5mb19kZXY7CQkvKiBkZXZpY2UgbnVtYmVyCSAgICovCisJdW5zaWduZWQgY2hhcglpbmZvX2luaXRzdGF0ZTsJCS8qIENoYW5uZWwgaW5pdCBzdGF0ZQkgICAqLworCXVuc2lnbmVkIGNoYXIJaW5mb19ydW5uaW5nOwkJLyogQ2hhbm5lbCBydW5uaW5nIHN0YXRlICAgKi8KKwlsb25nCQlyZXNlcnZlZFs4XTsJCS8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCit9OworCisvKgorKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHdpdGggdGhlIERJR0lfRkVQQ01EIGlvY3RsIHRvCisqIHRlbGwgdGhlIGRyaXZlciB3aGljaCBwb3J0IHRvIHNlbmQgdGhlIGNvbW1hbmQgZm9yLgorKi8KK3N0cnVjdCBkaWdpX2NtZCB7CisJaW50CWNtZDsKKwlpbnQJd29yZDsKKwlpbnQJbmNtZHM7CisJaW50CWNoYW47IC8qIGNoYW5uZWwgaW5kZXggKHplcm8gYmFzZWQpICovCisJaW50CWJkaWQ7IC8qIGJvYXJkIGluZGV4ICh6ZXJvIGJhc2VkKSAqLworfTsKKworLyoKKyogIGluZm9fc2xlZXBfc3RhdCBkZWZpbmVzCisqLworI2RlZmluZSBJTkZPX1JVTldBSVQJMHgwMDAxCisjZGVmaW5lIElORk9fV09QRU4JMHgwMDAyCisjZGVmaW5lIElORk9fVFRJT1cJMHgwMDA0CisjZGVmaW5lIElORk9fQ0hfUldBSVQJMHgwMDA4CisjZGVmaW5lIElORk9fQ0hfV0VNUFRZCTB4MDAxMAorI2RlZmluZSBJTkZPX0NIX1dMT1cJMHgwMDIwCisjZGVmaW5lIElORk9fWFhCVUZfQlVTWSAweDAwNDAKKworI2RlZmluZQlESUdJX0dFVENICSgoJ2QnPDw4KSB8IDI0NSkJCS8qIGdldCBib2FyZCBpbmZvICAgICAgICAgICovCisKKy8qIEJvYXJkIHR5cGUgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZQlTVUJUWVBFCQkwMDA3CisjZGVmaW5lCVRfUENYSQkJMDAwMAorI2RlZmluZSBUX1BDWE0JCTAwMDEKKyNkZWZpbmUgVF9QQ1hFCQkwMDAyCisjZGVmaW5lIFRfUENYUgkJMDAwMworI2RlZmluZSBUX1NQCQkwMDA0CisjZGVmaW5lIFRfU1BfUExVUwkwMDA1CisjCWRlZmluZSBUX0hFUkMJMDAwMAorIwlkZWZpbmUgVF9IT1UJMDAwMQorIwlkZWZpbmUgVF9MT04JMDAwMgorIwlkZWZpbmUgVF9DSEEJMDAwMworI2RlZmluZSBGQU1JTFkJCTAwNzAKKyNkZWZpbmUgVF9DT01YSQkJMDAwMAorI2RlZmluZSBUX1BDWFgJCTAwMTAKKyNkZWZpbmUgVF9DWAkJMDAyMAorI2RlZmluZSBUX0VQQwkJMDAzMAorI2RlZmluZQlUX1BDTElURQkwMDQwCisjZGVmaW5lCVRfU1BYWAkJMDA1MAorI2RlZmluZQlUX0FWWFgJCTAwNjAKKyNkZWZpbmUgVF9EWEIJCTAwNzAKKyNkZWZpbmUgVF9BMktfNF84CTAwNzAKKyNkZWZpbmUgQlVTVFlQRQkJMDcwMAorI2RlZmluZSBUX0lTQUJVUwkwMDAwCisjZGVmaW5lIFRfTUNCVVMJCTAxMDAKKyNkZWZpbmUJVF9FSVNBQlVTCTAyMDAKKyNkZWZpbmUJVF9QQ0lCVVMJMDQwMAorCisvKiBCb2FyZCBTdGF0ZSBEZWZpbml0aW9ucyAqLworCisjZGVmaW5lCUJEX1JVTk5JTkcJMHgwCisjZGVmaW5lCUJEX1JFQVNPTgkweDdmCisjZGVmaW5lCUJEX05PVEZPVU5ECTB4MQorI2RlZmluZQlCRF9OT0lPUE9SVAkweDIKKyNkZWZpbmUJQkRfTk9NRU0JMHgzCisjZGVmaW5lCUJEX05PQklPUwkweDQKKyNkZWZpbmUJQkRfTk9GRVAJMHg1CisjZGVmaW5lCUJEX0ZBSUxFRAkweDYKKyNkZWZpbmUgQkRfQUxMT0NBVEVECTB4NworI2RlZmluZSBCRF9UUklCT09UCTB4OAorI2RlZmluZQlCRF9CQURLTUUJMHg4MAorCisjZGVmaW5lIERJR0lfTE9PUEJBQ0sJICAgICAgKCgnZCc8PDgpIHwgMjUyKQkJLyogRW5hYmxlL2Rpc2FibGUgVUFSVCBpbnRlcm5hbCBsb29wYmFjayAqLworI2RlZmluZSBESUdJX1NQT0xMICAgICAgICAgICAgKCgnZCc8PDgpIHwgMjU0KQkJLyogY2hhbmdlIHBvbGxlciByYXRlICAgKi8KKworI2RlZmluZSBESUdJX1NFVENVU1RPTUJBVUQJX0lPVygnZScsIDEwNiwgaW50KQkvKiBTZXQgaW50ZWdlciBiYXVkIHJhdGUgKi8KKyNkZWZpbmUgRElHSV9HRVRDVVNUT01CQVVECV9JT1IoJ2UnLCAxMDcsIGludCkJLyogR2V0IGludGVnZXIgYmF1ZCByYXRlICovCisjZGVmaW5lIERJR0lfUkVTRVRfUE9SVAkJKCgnZSc8PDgpIHwgOTMpCQkvKiBSZXNldCBwb3J0CQkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDaGFubmVsIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgY2hhbm5lbF90IHsKKwlpbnQgbWFnaWM7CQkJLyogQ2hhbm5lbCBNYWdpYyBOdW1iZXIJCSovCisJc3RydWN0IGJzX3QJKmNoX2JzOwkJLyogQmFzZSBzdHJ1Y3R1cmUgcG9pbnRlciAgICAgICAqLworCXN0cnVjdCBjbV90CSpjaF9jbTsJCS8qIENvbW1hbmQgcXVldWUgcG9pbnRlciAgICAgICAgKi8KKwlzdHJ1Y3QgYm9hcmRfdCAqY2hfYmQ7CQkvKiBCb2FyZCBzdHJ1Y3R1cmUgcG9pbnRlciAgICAgICovCisJdW5zaWduZWQgY2hhciAqY2hfdmFkZHI7CS8qIEZFUCBtZW1vcnkgb3JpZ2luICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyICpjaF90YWRkcjsJLyogV3JpdGUgYnVmZmVyIG9yaWdpbiAgICAgICAgICAqLworCXVuc2lnbmVkIGNoYXIgKmNoX3JhZGRyOwkvKiBSZWFkIGJ1ZmZlciBvcmlnaW4gICAgICAgICAgICovCisJc3RydWN0IGRpZ2lfdCAgY2hfZGlnaTsJCS8qIFRyYW5zcGFyZW50IFByaW50IHN0cnVjdHVyZSAgKi8KKwlzdHJ1Y3QgdW5fdCBjaF90dW47CQkvKiBUZXJtaW5hbCB1bml0IGluZm8gICAgICAgICAgICovCisJc3RydWN0IHVuX3QgY2hfcHVuOwkJLyogUHJpbnRlciB1bml0IGluZm8gICAgICAgICAgICAqLworCisJc3BpbmxvY2tfdAljaF9sb2NrOwkvKiBwcm92aWRlIGZvciBzZXJpYWxpemF0aW9uICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgY2hfZmxhZ3Nfd2FpdDsKKworCXUzMglwc2Nhbl9zdGF0ZTsKKwl1Y2hhcglwc2Nhbl9zYXZlY2hhcjsKKworCXUzMiBjaF9wb3J0bnVtOwkJCS8qIFBvcnQgbnVtYmVyLCAwIG9mZnNldC4JKi8KKwl1MzIgY2hfb3Blbl9jb3VudDsJCS8qIG9wZW4gY291bnQJCQkqLworCXUzMgljaF9mbGFnczsJCS8qIENoYW5uZWwgZmxhZ3MgICAgICAgICAgICAgICAgKi8KKworCisJdTMyCWNoX2Nsb3NlX2RlbGF5OwkJLyogSG93IGxvbmcgd2Ugc2hvdWxkIGRyb3AgUlRTL0RUUiBmb3IgKi8KKworCXUzMgljaF9jcHN0aW1lOwkJLyogVGltZSBmb3IgQ1BTIGNhbGN1bGF0aW9ucyAgICAqLworCisJdGNmbGFnX3QgY2hfY19pZmxhZzsJCS8qIGNoYW5uZWwgaWZsYWdzICAgICAgICAgICAgICAgKi8KKwl0Y2ZsYWdfdCBjaF9jX2NmbGFnOwkJLyogY2hhbm5lbCBjZmxhZ3MgICAgICAgICAgICAgICAqLworCXRjZmxhZ190IGNoX2Nfb2ZsYWc7CQkvKiBjaGFubmVsIG9mbGFncyAgICAgICAgICAgICAgICovCisJdGNmbGFnX3QgY2hfY19sZmxhZzsJCS8qIGNoYW5uZWwgbGZsYWdzICAgICAgICAgICAgICAgKi8KKworCXUxNiAgY2hfZmVwaWZsYWc7ICAgICAgICAgICAgLyogRkVQIHR0eSBpZmxhZ3MgICAgICAgICAgICAgICAqLworCXUxNiAgY2hfZmVwY2ZsYWc7CQkvKiBGRVAgdHR5IGNmbGFncyAgICAgICAgICAgICAgICovCisJdTE2ICBjaF9mZXBvZmxhZzsJCS8qIEZFUCB0dHkgb2ZsYWdzICAgICAgICAgICAgICAgKi8KKwl1MTYgIGNoX3dvcGVuOwkJCS8qIFdhaXRpbmcgZm9yIG9wZW4gcHJvY2VzcyBjbnQgKi8KKwl1MTYgIGNoX3RzdGFydDsJCQkvKiBUcmFuc21pdCBidWZmZXIgc3RhcnQgICAgICAgICovCisJdTE2ICBjaF90c2l6ZTsJCQkvKiBUcmFuc21pdCBidWZmZXIgc2l6ZSAgICAgICAgICovCisJdTE2ICBjaF9yc3RhcnQ7CQkJLyogUmVjZWl2ZSBidWZmZXIgc3RhcnQgICAgICAgICAqLworCXUxNiAgY2hfcnNpemU7CQkJLyogUmVjZWl2ZSBidWZmZXIgc2l6ZSAgICAgICAgICAqLworCXUxNiAgY2hfcmRlbGF5OwkJCS8qIFJlY2VpdmUgZGVsYXkgdGltZSAgICAgICAgICAgKi8KKworCXUxNgljaF90bHc7CQkJLyogT3VyIGN1cnJlbnRseSBzZXQgbG93IHdhdGVyIG1hcmsgKi8KKworCXUxNiAgY2hfY29vazsJCQkvKiBPdXRwdXQgY2hhcmFjdGVyIG1hc2sgICAgICAgICovCisKKwl1Y2hhciAgIGNoX2NhcmQ7CQkvKiBDYXJkIGNoYW5uZWwgaXMgb24gICAgICAgICAgICovCisJdWNoYXIgICBjaF9zdG9wYzsJCS8qIFN0b3AgY2hhcmFjdGVyICAgICAgICAgICAgICAgKi8KKwl1Y2hhciAgIGNoX3N0YXJ0YzsJCS8qIFN0YXJ0IGNoYXJhY3RlciAgICAgICAgICAgICAgKi8KKworCXVjaGFyICAgY2hfbW9zdGF0OwkJLyogRkVQIG91dHB1dCBtb2RlbSBzdGF0dXMgICAgICAqLworCXVjaGFyICAgY2hfbWlzdGF0OwkJLyogRkVQIGlucHV0IG1vZGVtIHN0YXR1cyAgICAgICAqLworCXVjaGFyICAgY2hfbWZvcmNlOwkJLyogTW9kZW0gdmFsdWVzIHRvIGJlIGZvcmNlZCAgICAqLworCXVjaGFyICAgY2hfbXZhbDsJCS8qIEZvcmNlIHZhbHVlcyAgICAgICAgICAgICAgICAgKi8KKwl1Y2hhciAgIGNoX2ZlcHN0b3BjOwkJLyogRkVQIHN0b3AgY2hhcmFjdGVyICAgICAgICAgICAqLworCXVjaGFyICAgY2hfZmVwc3RhcnRjOwkJLyogRkVQIHN0YXJ0IGNoYXJhY3RlciAgICAgICAgICAqLworCisJdWNoYXIgICBjaF9hc3RvcGM7CQkvKiBBdXhpbGlhcnkgU3RvcCBjaGFyYWN0ZXIgICAgICovCisJdWNoYXIgICBjaF9hc3RhcnRjOwkJLyogQXV4aWxpYXJ5IFN0YXJ0IGNoYXJhY3RlciAgICAqLworCXVjaGFyICAgY2hfZmVwYXN0b3BjOwkJLyogQXV4aWxpYXJ5IEZFUCBzdG9wIGNoYXIgICAgICAqLworCXVjaGFyICAgY2hfZmVwYXN0YXJ0YzsJCS8qIEF1eGlsaWFyeSBGRVAgc3RhcnQgY2hhciAgICAgKi8KKworCXVjaGFyICAgY2hfaGZsb3c7CQkvKiBGRVAgaGFyZHdhcmUgaGFuZHNoYWtlICAgICAgICovCisJdWNoYXIgICBjaF9kc3I7CQkJLyogc3RvcmVzIHJlYWwgZHNyIHZhbHVlICAgICAgICAqLworCXVjaGFyICAgY2hfY2Q7CQkJLyogc3RvcmVzIHJlYWwgY2QgdmFsdWUgICAgICAgICAqLworCXVjaGFyICAgY2hfdHhfd2luOwkJLyogY2hhbm5lbCB0eCBidWZmZXIgd2luZG93ICAgICAqLworCXVjaGFyICAgY2hfcnhfd2luOwkJLyogY2hhbm5lbCByeCBidWZmZXIgd2luZG93ICAgICAqLworCXVpbnQJY2hfY3VzdG9tX3NwZWVkOwkvKiBDdXN0b20gYmF1ZCwgaWYgc2V0CQkqLworCXVpbnQJY2hfYmF1ZF9pbmZvOwkJLyogQ3VycmVudCBiYXVkIGluZm8gZm9yIC9wcm9jIG91dHB1dAkqLworCXVsb25nCWNoX3J4Y291bnQ7CQkvKiB0b3RhbCBvZiBkYXRhIHJlY2VpdmVkIHNvIGZhcgkqLworCXVsb25nCWNoX3R4Y291bnQ7CQkvKiB0b3RhbCBvZiBkYXRhIHRyYW5zbWl0dGVkIHNvIGZhcgkqLworCXVsb25nCWNoX2Vycl9wYXJpdHk7CQkvKiBDb3VudCBvZiBwYXJpdHkgZXJyb3JzIG9uIGNoYW5uZWwJKi8KKwl1bG9uZwljaF9lcnJfZnJhbWU7CQkvKiBDb3VudCBvZiBmcmFtaW5nIGVycm9ycyBvbiBjaGFubmVsCSovCisJdWxvbmcJY2hfZXJyX2JyZWFrOwkJLyogQ291bnQgb2YgYnJlYWtzIG9uIGNoYW5uZWwJKi8KKwl1bG9uZwljaF9lcnJfb3ZlcnJ1bjsJCS8qIENvdW50IG9mIG92ZXJydW5zIG9uIGNoYW5uZWwJKi8KKworCXVpbnQgY2hfc25pZmZfaW47CisJdWludCBjaF9zbmlmZl9vdXQ7CisJY2hhciAqY2hfc25pZmZfYnVmOwkJLyogU25pZmYgYnVmZmVyIGZvciBwcm9jICovCisJdWxvbmcgY2hfc25pZmZfZmxhZ3M7CQkvKiBDaGFubmVsIGZsYWdzICAgICAgICAgICAgICAgICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgY2hfc25pZmZfd2FpdDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvbW1hbmQgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGNtX3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGNtX2hlYWQ7CS8qIENvbW1hbmQgYnVmZmVyIGhlYWQgb2Zmc2V0CSovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgY21fdGFpbDsJLyogQ29tbWFuZCBidWZmZXIgdGFpbCBvZmZzZXQJKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBjbV9zdGFydDsJLyogc3RhcnQgb2Zmc2V0IG9mIGJ1ZmZlcgkqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGNtX21heDsJCS8qIGxhc3Qgb2Zmc2V0IG9mIGJ1ZmZlcgkqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXZlbnQgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGV2X3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGV2X2hlYWQ7CS8qIENvbW1hbmQgYnVmZmVyIGhlYWQgb2Zmc2V0CSovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgZXZfdGFpbDsJLyogQ29tbWFuZCBidWZmZXIgdGFpbCBvZmZzZXQJKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBldl9zdGFydDsJLyogc3RhcnQgb2Zmc2V0IG9mIGJ1ZmZlcgkqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGV2X21heDsJCS8qIGxhc3Qgb2Zmc2V0IG9mIGJ1ZmZlcgkqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRG93bmxvYWQgYnVmZmVyIHN0cnVjdHVyZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZG93bmxkX3QgeworCXVjaGFyCWRsX3R5cGU7CQkvKiBIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICovCisJdWNoYXIJZGxfc2VxOwkJCS8qIERvd25sb2FkIHNlcXVlbmNlICAgICAgICAgICAgKi8KKwl1c2hvcnQJZGxfc3JldjsJCS8qIFNvZnR3YXJlIHJldmlzaW9uIG51bWJlciAgICAgKi8KKwl1c2hvcnQJZGxfbHJldjsJCS8qIExvdyByZXZpc2lvbiBudW1iZXIgICAgICAgICAgKi8KKwl1c2hvcnQJZGxfaHJldjsJCS8qIEhpZ2ggcmV2aXNpb24gbnVtYmVyICAgICAgICAgKi8KKwl1c2hvcnQJZGxfc2VnOwkJCS8qIFN0YXJ0IHNlZ21lbnQgYWRkcmVzcyAgICAgICAgKi8KKwl1c2hvcnQJZGxfc2l6ZTsJCS8qIE51bWJlciBvZiBieXRlcyB0byBkb3dubG9hZCAgKi8KKwl1Y2hhcglkbF9kYXRhWzEwMjRdOwkJLyogRG93bmxvYWQgZGF0YSAgICAgICAgICAgICAgICAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGVyIGNoYW5uZWwgYnVmZmVyIHN0cnVjdHVyZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIEJhc2UgU3RydWN0dXJlIEVudHJpZXMgVXNhZ2UgTWVhbmluZ3MgdG8gSG9zdCAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgIFcgPSByZWFkIHdyaXRlICAgICAgICBSID0gcmVhZCBvbmx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgIEMgPSBjaGFuZ2VkIGJ5IGNvbW1hbmRzIG9ubHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgIFUgPSB1bmtub3duIChtYXkgYmUgY2hhbmdlZCB3L28gbm90aWNlKSAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBic190IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgdHBfam1wOwkvKiBUcmFuc21pdCBwb2xsIGp1bXAJCSAqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICB0Y19qbXA7CS8qIENvb2tlZCBwcm9jZWR1cmUganVtcAkgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgcmlfam1wOwkvKiBOb3QgY3VycmVudGx5IHVzZWQJCSAqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICBycF9qbXA7CS8qIFJlY2VpdmUgcG9sbCBqdW1wCQkgKi8KKworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICB0eF9zZWc7CS8qIFcgIFR4IHNlZ21lbnQJICovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHR4X2hlYWQ7CS8qIFcgIFR4IGJ1ZmZlciBoZWFkIG9mZnNldAkqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICB0eF90YWlsOwkvKiBSICBUeCBidWZmZXIgdGFpbCBvZmZzZXQJKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgdHhfbWF4OwkvKiBXICBUeCBidWZmZXIgc2l6ZSAtIDEJICovCisKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgcnhfc2VnOwkvKiBXICBSeCBzZWdtZW50CQkqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICByeF9oZWFkOwkvKiBXICBSeCBidWZmZXIgaGVhZCBvZmZzZXQJKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgcnhfdGFpbDsJLyogUiAgUnggYnVmZmVyIHRhaWwgb2Zmc2V0CSovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHJ4X21heDsJLyogVyAgUnggYnVmZmVyIHNpemUgLSAxCSAqLworCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHR4X2x3OwkJLyogVyAgVHggYnVmZmVyIGxvdyB3YXRlciBtYXJrICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICByeF9sdzsJCS8qIFcgIFJ4IGJ1ZmZlciBsb3cgd2F0ZXIgbWFyayAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgcnhfaHc7CQkvKiBXICBSeCBidWZmZXIgaGlnaCB3YXRlciBtYXJrICovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIGluY3I7CQkvKiBXICBJbmNyZW1lbnQgdG8gbmV4dCBjaGFubmVsICovCisKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgZmVwZGV2OwkvKiBVICBTQ0MgZGV2aWNlIGJhc2UgYWRkcmVzcyAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICBlZGVsYXk7CS8qIFcgIEV4Y2VwdGlvbiBkZWxheSAgICAgICAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIGJsZW47CQkvKiBXICBCcmVhayBsZW5ndGggICAgICAgICAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIGJ0aW1lOwkJLyogVSAgQnJlYWsgY29tcGxldGUgdGltZSAgICAgICAqLworCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIGlmbGFnOwkJLyogQyAgVU5JWCBpbnB1dCBmbGFncyAgICAgICAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICBvZmxhZzsJCS8qIEMgIFVOSVggb3V0cHV0IGZsYWdzICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgY2ZsYWc7CQkvKiBDICBVTklYIGNvbnRyb2wgZmxhZ3MgICAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHdmaWxsWzEzXTsJLyogVSAgUmVzZXJ2ZWQgZm9yIGV4cGFuc2lvbiAgICAqLworCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIG51bTsJCS8qIFUgIENoYW5uZWwgbnVtYmVyICAgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgcmFjdDsJCS8qIFUgIFJlY2VpdmVyIGFjdGl2ZSBjb3VudGVyICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgYnN0YXQ7CQkvKiBVICBCcmVhayBzdGF0dXMgYml0cyAgICAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHRidXN5OwkJLyogVyAgVHJhbnNtaXQgYnVzeSAgICAgICAgICAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBpZW1wdHk7CS8qIFcgIFRyYW5zbWl0IGVtcHR5IGV2ZW50IGVuYWJsZSAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBpbG93OwkJLyogVyAgVHJhbnNtaXQgbG93LXdhdGVyIGV2ZW50IGVuYWJsZSAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBpZGF0YTsJCS8qIFcgIFJlY2VpdmUgZGF0YSBpbnRlcnJ1cHQgZW5hYmxlICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGVmbGFnOwkJLyogVSAgSG9zdCBldmVudCBmbGFncyAgICAgICAgICAqLworCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHRmbGFnOwkJLyogVSAgVHJhbnNtaXQgZmxhZ3MgICAgICAgICAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICByZmxhZzsJCS8qIFUgIFJlY2VpdmUgZmxhZ3MgICAgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgeG1hc2s7CQkvKiBVICBUcmFuc21pdCByZWFkeSBmbGFncyAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHh2YWw7CQkvKiBVICBUcmFuc21pdCByZWFkeSB2YWx1ZSAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIG1fc3RhdDsJLyogUkMgTW9kZW0gc3RhdHVzIGJpdHMgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgbV9jaGFuZ2U7CS8qIFUgIE1vZGVtIGJpdHMgd2hpY2ggY2hhbmdlZCAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgbV9pbnQ7CQkvKiBXICBNb2RlbSBpbnRlcnJ1cHQgZW5hYmxlIGJpdHMgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgbV9sYXN0OwkvKiBVICBMYXN0IG1vZGVtIHN0YXR1cyAgICAgICAgICovCisKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgbXRyYW47CQkvKiBDICAgVW5yZXBvcnRlZCBtb2RlbSB0cmFucyAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIG9ydW47CQkvKiBDICAgQnVmZmVyIG92ZXJydW4gb2NjdXJyZWQgICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGFzdGFydGM7CS8qIFcgICBBdXhpbGlhcnkgWG9uIGNoYXIgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgYXN0b3BjOwkvKiBXICAgQXV4aWxpYXJ5IFhvZmYgY2hhciAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHN0YXJ0YzsJLyogVyAgIFhvbiBjaGFyYWN0ZXIgICAgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgc3RvcGM7CQkvKiBXICAgWG9mZiBjaGFyYWN0ZXIgICAgICAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHZuZXh0YzsJLyogVyAgIFZuZXh0IGNoYXJhY3RlciAgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgaGZsb3c7CQkvKiBDICAgU29mdHdhcmUgZmxvdyBjb250cm9sICAgICovCisJCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGZpbGxjOwkJLyogVSAgIERlbGF5IEZpbGwgY2hhcmFjdGVyICAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBvY2hhcjsJCS8qIFUgICBTYXZlZCBvdXRwdXQgY2hhcmFjdGVyICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgb21hc2s7CQkvKiBVICAgT3V0cHV0IGNoYXJhY3RlciBtYXNrICAgICovCisKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgYmZpbGxbMTNdOwkvKiBVICAgUmVzZXJ2ZWQgZm9yIGV4cGFuc2lvbiAgICovCisKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgc2NjWzE2XTsJLyogVSAgIFNDQyByZWdpc3RlcnMgICAgICAgICAgICAqLworfTsKKworc3RydWN0IGNub2RlIHsKKwlzdHJ1Y3QgY25vZGUgKm5leHQ7CisJaW50IHR5cGU7CisJaW50IG51bWJyZDsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCWNoYXIgIHR5cGU7CS8qIEJvYXJkIFR5cGUgCQkqLworCQkJbG9uZyAgcG9ydDsJLyogSS9PIEFkZHJlc3MJCSovCisJCQljaGFyICAqcG9ydHN0cjsgLyogSS9PIEFkZHJlc3MgaW4gc3RyaW5nICovCisJCQlsb25nICBhZGRyOwkvKiBNZW1vcnkgQWRkcmVzcwkqLworCQkJY2hhciAgKmFkZHJzdHI7IC8qIE1lbW9yeSBBZGRyZXNzIGluIHN0cmluZyAqLworCQkJbG9uZyAgcGNpYnVzOwkvKiBQQ0kgQlVTCQkqLworCQkJY2hhciAgKnBjaWJ1c3N0cjsgLyogUENJIEJVUyBpbiBzdHJpbmcgKi8KKwkJCWxvbmcgIHBjaXNsb3Q7CS8qIFBDSSBTTE9UCQkqLworCQkJY2hhciAgKnBjaXNsb3RzdHI7IC8qIFBDSSBTTE9UIGluIHN0cmluZyAqLworCQkJbG9uZyAgbnBvcnQ7CS8qIE51bWJlciBvZiBQb3J0cwkqLworCQkJY2hhciAgKmlkOwkvKiB0dHkgaWQJCSovCisJCQlsb25nICBzdGFydDsJLyogc3RhcnQgb2YgdHR5IGNvdW50aW5nICovCisJCQljaGFyICAqbWV0aG9kOyAgLyogSW5zdGFsbCBtZXRob2QgICAgICAgKi8KKwkJCWNoYXIgIHZfdHlwZTsKKwkJCWNoYXIgIHZfcG9ydDsKKwkJCWNoYXIgIHZfYWRkcjsKKwkJCWNoYXIgIHZfcGNpYnVzOworCQkJY2hhciAgdl9wY2lzbG90OworCQkJY2hhciAgdl9ucG9ydDsKKwkJCWNoYXIgIHZfaWQ7CisJCQljaGFyICB2X3N0YXJ0OworCQkJY2hhciAgdl9tZXRob2Q7CisJCQljaGFyICBsaW5lMTsKKwkJCWNoYXIgIGxpbmUyOworCQkJY2hhciAgY29uYzE7ICAgLyogdG90YWwgY29uY3MgaW4gbGluZTEgKi8KKwkJCWNoYXIgIGNvbmMyOyAgIC8qIHRvdGFsIGNvbmNzIGluIGxpbmUyICovCisJCQljaGFyICBtb2R1bGUxOyAvKiB0b3RhbCBtb2R1bGVzIGZvciBsaW5lMSAqLworCQkJY2hhciAgbW9kdWxlMjsgLyogdG90YWwgbW9kdWxlcyBmb3IgbGluZTIgKi8KKwkJCWNoYXIgICpzdGF0dXM7IC8qIGNvbmZpZyBzdGF0dXMgKi8KKwkJCWNoYXIgICpkaW1zdGF0dXM7CSAvKiBZL04gKi8KKwkJCWludCAgIHN0YXR1c19pbmRleDsgLyogZmllbGQgcG9pbnRlciAqLworCQl9IGJvYXJkOworCisJCXN0cnVjdCB7CisJCQljaGFyICAqY2FibGU7CisJCQljaGFyICB2X2NhYmxlOworCQkJbG9uZyAgc3BlZWQ7CisJCQljaGFyICB2X3NwZWVkOworCQl9IGxpbmU7CisKKwkJc3RydWN0IHsKKwkJCWNoYXIgIHR5cGU7CisJCQljaGFyICAqY29ubmVjdDsKKwkJCWxvbmcgIHNwZWVkOworCQkJbG9uZyAgbnBvcnQ7CisJCQljaGFyICAqaWQ7CisJCQljaGFyICAqaWRzdHI7CisJCQlsb25nICBzdGFydDsKKwkJCWNoYXIgIHZfdHlwZTsKKwkJCWNoYXIgIHZfY29ubmVjdDsKKwkJCWNoYXIgIHZfc3BlZWQ7CisJCQljaGFyICB2X25wb3J0OworCQkJY2hhciAgdl9pZDsKKwkJCWNoYXIgIHZfc3RhcnQ7CisJCX0gY29uYzsKKworCQlzdHJ1Y3QgeworCQkJY2hhciB0eXBlOworCQkJbG9uZyBucG9ydDsKKwkJCWNoYXIgKmlkOworCQkJY2hhciAqaWRzdHI7CisJCQlsb25nIHN0YXJ0OworCQkJY2hhciB2X3R5cGU7CisJCQljaGFyIHZfbnBvcnQ7CisJCQljaGFyIHZfaWQ7CisJCQljaGFyIHZfc3RhcnQ7CisJCX0gbW9kdWxlOworCisJCWNoYXIgKnR0eW5hbWU7CisKKwkJY2hhciAqY3VuYW1lOworCisJCWNoYXIgKnByaW50bmFtZTsKKworCQlsb25nIG1ham9ybnVtYmVyOworCisJCWxvbmcgYWx0cGluOworCisJCWxvbmcgdHR5c2l6ZTsKKworCQlsb25nIGNoc2l6ZTsKKworCQlsb25nIGJzc2l6ZTsKKworCQlsb25nIHVuc2l6ZTsKKworCQlsb25nIGYyc2l6ZTsKKworCQlsb25nIHZwaXhzaXplOworCisJCWxvbmcgdXNlaW50cjsKKwl9IHU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfY29uZi5oIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9jb25mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NGVkNzIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9jb25mLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICoJZGdhcF9jb25mLmggLSBIZWFkZXIgZmlsZSBmb3IgaW5zdGFsbGF0aW9ucyBhbmQgcGFyc2UgZmlsZXMuCi0gKgotICoJJElkOiBkZ2FwX2NvbmYuaCx2IDEuMSAyMDA5LzEwLzIzIDE0OjAxOjU3IG1hcmtoIEV4cCAkCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKi8KLQotI2lmbmRlZiBfREdBUF9DT05GX0gKLSNkZWZpbmUgX0RHQVBfQ09ORl9ICi0KLSNkZWZpbmUgTlVMTE5PREUgMAkJLyogaGVhZGVyIG5vZGUsIG5vdCB1c2VkICovCi0jZGVmaW5lIEJOT0RFIDEJCQkvKiBCb2FyZCBub2RlICovCi0jZGVmaW5lIExOT0RFIDIJCQkvKiBMaW5lIG5vZGUgKi8KLSNkZWZpbmUgQ05PREUgMwkJCS8qIENvbmNlbnRyYXRvciBub2RlICovCi0jZGVmaW5lIE1OT0RFIDQJCQkvKiBFQkkgTW9kdWxlIG5vZGUgKi8KLSNkZWZpbmUgVE5PREUgNQkJCS8qIHR0eSBuYW1lIHByZWZpeCBub2RlICovCi0jZGVmaW5lCUNVTk9ERSA2CQkvKiBjdSBuYW1lIHByZWZpeCAobm9uLVNDTykgKi8KLSNkZWZpbmUgUE5PREUgNwkJCS8qIHRyYW5zLiBwcmludCBwcmVmaXggbm9kZSAqLwotI2RlZmluZSBKTk9ERSA4CQkJLyogbWFKb3IgbnVtYmVyIG5vZGUgKi8KLSNkZWZpbmUgQU5PREUgOQkJCS8qIGFsdHBpbiAqLwotI2RlZmluZQlUU05PREUgMTAJCS8qIHR0eSBzdHJ1Y3R1cmUgc2l6ZSAqLwotI2RlZmluZSBDU05PREUgMTEJCS8qIGNoYW5uZWwgc3RydWN0dXJlIHNpemUgKi8KLSNkZWZpbmUgQlNOT0RFIDEyCQkvKiBib2FyZCBzdHJ1Y3R1cmUgc2l6ZSAqLwotI2RlZmluZSBVU05PREUgMTMJCS8qIHVuaXQgc2NoZWR1bGUgc3RydWN0dXJlIHNpemUgKi8KLSNkZWZpbmUgRlNOT0RFIDE0CQkvKiBmMjIwMCBzdHJ1Y3R1cmUgc2l6ZSAqLwotI2RlZmluZSBWU05PREUgMTUJCS8qIHNpemUgb2YgVlBJWCBzdHJ1Y3R1cmVzICovCi0jZGVmaW5lIElOVFJOT0RFIDE2CQkvKiBlbmFibGUgaW50ZXJydXB0ICovCi0KLS8qIEVudW1lcmF0aW9uIG9mIHRva2VucyAqLwotI2RlZmluZQlCRUdJTgkxCi0jZGVmaW5lCUVORAkyCi0jZGVmaW5lCUJPQVJECTEwCi0KLSNkZWZpbmUgRVBDRlMJMTEgLyogc3RhcnQgb2YgRVBDIGZhbWlseSBkZWZpbml0aW9ucyAqLwotI2RlZmluZQlJQ1gJCTExCi0jZGVmaW5lCU1DWAkJMTMKLSNkZWZpbmUgUENYCTE0Ci0jZGVmaW5lCUlFUEMJMTUKLSNkZWZpbmUJRUVQQwkxNgotI2RlZmluZQlNRVBDCTE3Ci0jZGVmaW5lCUlQQ00JMTgKLSNkZWZpbmUJRVBDTQkxOQotI2RlZmluZQlNUENNCTIwCi0jZGVmaW5lIFBFUEMJMjEKLSNkZWZpbmUgUFBDTQkyMgotI2lmZGVmIENQCi0jZGVmaW5lIElDUCAgICAgMjMKLSNkZWZpbmUgRUNQICAgICAyNAotI2RlZmluZSBNQ1AgICAgIDI1Ci0jZW5kaWYKLSNkZWZpbmUgRVBDRkUJMjUgLyogZW5kIG9mIEVQQyBmYW1pbHkgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUJUEMyRQkyNgotI2RlZmluZQlQQzRFCTI3Ci0jZGVmaW5lCVBDNEU4SwkyOAotI2RlZmluZQlQQzhFCTI5Ci0jZGVmaW5lCVBDOEU4SwkzMAotI2RlZmluZQlQQzE2RQkzMQotI2RlZmluZSBNQzJFOEsgIDM0Ci0jZGVmaW5lIE1DNEU4SyAgMzUKLSNkZWZpbmUgTUM4RThLICAzNgotCi0jZGVmaW5lIEFWQU5GUwk0MgkvKiBzdGFydCBvZiBBdmFuc3RhciBmYW1pbHkgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgQThQIAk0MgotI2RlZmluZSBBMTZQCTQzCi0jZGVmaW5lIEFWQU5GRQk0MwkvKiBlbmQgb2YgQXZhbnN0YXIgZmFtaWx5IGRlZmluaXRpb25zICovCi0KLSNkZWZpbmUgREEyMDAwRlMJNDQJLyogc3RhcnQgb2YgQWNjZWxlUG9ydCAyMDAwIGZhbWlseSBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBEQTIyIAkJNDQgLyogQWNjZWxlUG9ydCAyMDAyICovCi0jZGVmaW5lIERBMjQgCQk0NSAvKiBBY2NlbGVQb3J0IDIwMDQgKi8KLSNkZWZpbmUgREEyOAkJNDYgLyogQWNjZWxlUG9ydCAyMDA4ICovCi0jZGVmaW5lIERBMjE2CQk0NyAvKiBBY2NlbGVQb3J0IDIwMTYgKi8KLSNkZWZpbmUgREFSNAkJNDggLyogQWNjZWxlUG9ydCBSQVMgNCBwb3J0ICovCi0jZGVmaW5lIERBUjgJCTQ5IC8qIEFjY2VsZVBvcnQgUkFTIDggcG9ydCAqLwotI2RlZmluZSBERFIyNAkJNTAgLyogRGF0YUZpcmUgUkFTIDI0IHBvcnQgKi8KLSNkZWZpbmUgRERSMzAJCTUxIC8qIERhdGFGaXJlIFJBUyAzMCBwb3J0ICovCi0jZGVmaW5lIEREUjQ4CQk1MiAvKiBEYXRhRmlyZSBSQVMgNDggcG9ydCAqLwotI2RlZmluZSBERFI2MAkJNTMgLyogRGF0YUZpcmUgUkFTIDYwIHBvcnQgKi8KLSNkZWZpbmUgREEyMDAwRkUJNTMgLyogZW5kIG9mIEFjY2VsZVBvcnQgMjAwMC9SQVMgZmFtaWx5IGRlZmluaXRpb25zICovCi0KLSNkZWZpbmUgUENYUkZTCTEwNgkvKiBzdGFydCBvZiBQQ1hSIGZhbWlseSBkZWZpbml0aW9ucyAqLwotI2RlZmluZQlBUE9SVDQJMTA2Ci0jZGVmaW5lCUFQT1JUOAkxMDcKLSNkZWZpbmUgUEFQT1JUNCAxMDgKLSNkZWZpbmUgUEFQT1JUOCAxMDkKLSNkZWZpbmUgQVBPUlQ0XzkyMEkJMTEwCi0jZGVmaW5lIEFQT1JUOF85MjBJCTExMQotI2RlZmluZSBBUE9SVDRfOTIwUAkxMTIKLSNkZWZpbmUgQVBPUlQ4XzkyMFAJMTEzCi0jZGVmaW5lIEFQT1JUMl85MjBQIDExNAotI2RlZmluZSBQQ1hSRkUJMTE3CS8qIGVuZCBvZiBQQ1hSIGZhbWlseSBkZWZpbml0aW9ucyAqLwotCi0jZGVmaW5lCUxJTkUJODIKLSNpZmRlZiBUMQotI2RlZmluZSBUMU0JODMKLSNkZWZpbmUgRTFNCTg0Ci0jZW5kaWYKLSNkZWZpbmUJQ09OQwk2NAotI2RlZmluZQlDWAk2NQotI2RlZmluZQlFUEMJNjYKLSNkZWZpbmUJTU9ECTY3Ci0jZGVmaW5lCVBPUlRTCTY4Ci0jZGVmaW5lIE1FVEhPRAk2OQotI2RlZmluZSBDVVNUT00JNzAKLSNkZWZpbmUgQkFTSUMJNzEKLSNkZWZpbmUgU1RBVFVTCTcyCi0jZGVmaW5lIE1PREVNCTczCi0vKiBUaGUgZm9sbG93aW5nIHRva2VucyBjYW4gYXBwZWFyIGluIG11bHRpcGxlIHBsYWNlcyAqLwotI2RlZmluZQlTUEVFRAk3NAotI2RlZmluZQlOUE9SVFMJNzUKLSNkZWZpbmUJSUQJNzYKLSNkZWZpbmUgQ0FCTEUJNzcKLSNkZWZpbmUgQ09OTkVDVAk3OAotI2RlZmluZQlJTwk3OQotI2RlZmluZQlNRU0JODAKLSNkZWZpbmUgRFBTWgk4MQotCi0jZGVmaW5lCVRUWU4JOTAKLSNkZWZpbmUJQ1UJOTEKLSNkZWZpbmUJUFJJTlQJOTIKLSNkZWZpbmUJWFBSSU5UCTkzCi0jZGVmaW5lIENNQUpPUiAgIDk0Ci0jZGVmaW5lIEFMVFBJTiAgOTUKLSNkZWZpbmUgU1RBUlRPIDk2Ci0jZGVmaW5lIFVTRUlOVFIgIDk3Ci0jZGVmaW5lIFBDSUlORk8gIDk4Ci0KLSNkZWZpbmUJVFRTSVoJMTAwCi0jZGVmaW5lCUNIU0laCTEwMQotI2RlZmluZSBCU1NJWgkxMDIKLSNkZWZpbmUJVU5UU0laCTEwMwotI2RlZmluZQlGMlNJWgkxMDQKLSNkZWZpbmUJVlBTSVoJMTA1Ci0KLSNkZWZpbmUJVE9UQUxfQk9BUkQJMgotI2RlZmluZQlDVVJSRU5UX0JSRAk0Ci0jZGVmaW5lCUJPQVJEX1RZUEUJNgotI2RlZmluZQlJT19BRERSRVNTCTgKLSNkZWZpbmUJTUVNX0FERFJFU1MJMTAKLQotI2RlZmluZQlGSUVMRFNfUEVSX1BBR0UJMTgKLQotI2RlZmluZSBUQl9GSUVMRAkxCi0jZGVmaW5lIENCX0ZJRUxECTMKLSNkZWZpbmUgQlRfRklFTEQJNQotI2RlZmluZSBJT19GSUVMRAk3Ci0jZGVmaW5lIElEX0ZJRUxECTgKLSNkZWZpbmUgTUVfRklFTEQJOQotI2RlZmluZSBUVFlfRklFTEQJMTEKLSNkZWZpbmUgQ1VfRklFTEQJMTMKLSNkZWZpbmUgUFJfRklFTEQJMTUKLSNkZWZpbmUgTVBSX0ZJRUxECTE3Ci0KLSNkZWZpbmUJTUFYX0ZJRUxECTUxMgotCi0jZGVmaW5lCUlOSVQJCTAKLSNkZWZpbmUJTklURU1TCQkxMjgKLSNkZWZpbmUgTUFYX0lURU0JNTEyCi0KLSNkZWZpbmUJRFNDUklOU1QJMQotI2RlZmluZQlEU0NSTlVNCQkzCi0jZGVmaW5lCUFMVFBJTlEJCTUKLSNkZWZpbmUJU1NBVkUJCTcKLQotI2RlZmluZQlEU0NSCQkiMzIiCi0jZGVmaW5lCU9ORVRPTklORQkiMTIzNDU2Nzg5IgotI2RlZmluZQlBTEwJCSIxMjM0NTY3ODkwIgotCi0KLXN0cnVjdCBjbm9kZSB7Ci0Jc3RydWN0IGNub2RlICpuZXh0OwotCWludCB0eXBlOwotCWludCBudW1icmQ7Ci0KLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQljaGFyICB0eXBlOwkvKiBCb2FyZCBUeXBlIAkJKi8KLQkJCXNob3J0IHBvcnQ7CS8qIEkvTyBBZGRyZXNzCQkqLwotCQkJY2hhciAgKnBvcnRzdHI7IC8qIEkvTyBBZGRyZXNzIGluIHN0cmluZyAqLwotCQkJbG9uZyAgYWRkcjsJLyogTWVtb3J5IEFkZHJlc3MJKi8KLQkJCWNoYXIgICphZGRyc3RyOyAvKiBNZW1vcnkgQWRkcmVzcyBpbiBzdHJpbmcgKi8KLQkJCWxvbmcgIHBjaWJ1czsJLyogUENJIEJVUwkJKi8KLQkJCWNoYXIgICpwY2lidXNzdHI7IC8qIFBDSSBCVVMgaW4gc3RyaW5nICovCi0JCQlsb25nICBwY2lzbG90OwkvKiBQQ0kgU0xPVAkJKi8KLQkJCWNoYXIgICpwY2lzbG90c3RyOyAvKiBQQ0kgU0xPVCBpbiBzdHJpbmcgKi8KLQkJCWNoYXIgIG5wb3J0OwkvKiBOdW1iZXIgb2YgUG9ydHMJKi8KLQkJCWNoYXIgICppZDsJLyogdHR5IGlkCQkqLwotCQkJaW50ICAgc3RhcnQ7CS8qIHN0YXJ0IG9mIHR0eSBjb3VudGluZyAqLwotCQkJY2hhciAgKm1ldGhvZDsgIC8qIEluc3RhbGwgbWV0aG9kICAgICAgICovCi0JCQljaGFyICB2X3R5cGU7Ci0JCQljaGFyICB2X3BvcnQ7Ci0JCQljaGFyICB2X2FkZHI7Ci0JCQljaGFyICB2X3BjaWJ1czsKLQkJCWNoYXIgIHZfcGNpc2xvdDsKLQkJCWNoYXIgIHZfbnBvcnQ7Ci0JCQljaGFyICB2X2lkOwotCQkJY2hhciAgdl9zdGFydDsKLQkJCWNoYXIgIHZfbWV0aG9kOwotCQkJY2hhciAgbGluZTE7Ci0JCQljaGFyICBsaW5lMjsKLQkJCWNoYXIgIGNvbmMxOyAgIC8qIHRvdGFsIGNvbmNzIGluIGxpbmUxICovCi0JCQljaGFyICBjb25jMjsgICAvKiB0b3RhbCBjb25jcyBpbiBsaW5lMiAqLwotCQkJY2hhciAgbW9kdWxlMTsgLyogdG90YWwgbW9kdWxlcyBmb3IgbGluZTEgKi8KLQkJCWNoYXIgIG1vZHVsZTI7IC8qIHRvdGFsIG1vZHVsZXMgZm9yIGxpbmUyICovCi0JCQljaGFyICAqc3RhdHVzOyAvKiBjb25maWcgc3RhdHVzICovCi0JCQljaGFyICAqZGltc3RhdHVzOwkgLyogWS9OICovCi0JCQlpbnQgICBzdGF0dXNfaW5kZXg7IC8qIGZpZWxkIHBvaW50ZXIgKi8KLQkJfSBib2FyZDsKLQotCQlzdHJ1Y3QgewotCQkJY2hhciAgKmNhYmxlOwotCQkJY2hhciAgdl9jYWJsZTsKLQkJCWNoYXIgIHNwZWVkOwotCQkJY2hhciAgdl9zcGVlZDsKLQkJfSBsaW5lOwotCi0JCXN0cnVjdCB7Ci0JCQljaGFyICB0eXBlOwotCQkJY2hhciAgKmNvbm5lY3Q7Ci0JCQljaGFyICBzcGVlZDsKLQkJCWNoYXIgIG5wb3J0OwotCQkJY2hhciAgKmlkOwotCQkJY2hhciAgKmlkc3RyOwotCQkJaW50ICAgc3RhcnQ7Ci0JCQljaGFyICB2X3R5cGU7Ci0JCQljaGFyICB2X2Nvbm5lY3Q7Ci0JCQljaGFyICB2X3NwZWVkOwotCQkJY2hhciAgdl9ucG9ydDsKLQkJCWNoYXIgIHZfaWQ7Ci0JCQljaGFyICB2X3N0YXJ0OwotCQl9IGNvbmM7Ci0KLQkJc3RydWN0IHsKLQkJCWNoYXIgdHlwZTsKLQkJCWNoYXIgbnBvcnQ7Ci0JCQljaGFyICppZDsKLQkJCWNoYXIgKmlkc3RyOwotCQkJaW50ICBzdGFydDsKLQkJCWNoYXIgdl90eXBlOwotCQkJY2hhciB2X25wb3J0OwotCQkJY2hhciB2X2lkOwotCQkJY2hhciB2X3N0YXJ0OwotCQl9IG1vZHVsZTsKLQotCQljaGFyICp0dHluYW1lOwotCi0JCWNoYXIgKmN1bmFtZTsKLQotCQljaGFyICpwcmludG5hbWU7Ci0KLQkJaW50ICBtYWpvcm51bWJlcjsKLQotCQlpbnQgIGFsdHBpbjsKLQotCQlpbnQgIHR0eXNpemU7Ci0KLQkJaW50ICBjaHNpemU7Ci0KLQkJaW50ICBic3NpemU7Ci0KLQkJaW50ICB1bnNpemU7Ci0KLQkJaW50ICBmMnNpemU7Ci0KLQkJaW50ICB2cGl4c2l6ZTsKLQotCQlpbnQgIHVzZWludHI7Ci0JfSB1OwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2Rvd25sZC5oIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9kb3dubGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcxYWMxOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2Rvd25sZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICogICAgICBTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiAkSWQ6IGRnYXBfZG93bmxkLmgsdiAxLjEgMjAwOS8xMC8yMyAxNDowMTo1NyBtYXJraCBFeHAgJAotICoKLSAqCU5PVEU6IFRISVMgSVMgQSBTSEFSRUQgSEVBREVSLiBETyBOT1QgQ0hBTkdFIENPRElORyBTVFlMRSEhIQotICoKLSAqLwotCi0vKgotKiogZG93bmxkLmggCi0qKiAgLSBkZXNjcmliZXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSB1c2VyIGxldmVsIGRvd25sb2FkIHByb2Nlc3MKLSoqICAgIGFuZCB0aGUgY29uY2VudHJhdG9yIGRvd25sb2FkIGRyaXZlci4KLSovCi0KLSNpZm5kZWYgX0RHQVBfRE9XTkxEX0hfCi0jZGVmaW5lIF9ER0FQX0RPV05MRF9IXwotCi0KLXN0cnVjdCBmZXBpbWcgewotICAgIGludCB0eXBlOwkJCQkvKiBib2FyZCB0eXBlICovCi0gICAgaW50CWxlbjsJCQkJLyogbGVuZ3RoIG9mIGltYWdlICovCi0gICAgY2hhciBmZXBpbWFnZVsxXTsJCQkvKiBiZWdpbm5pbmcgb2YgaW1hZ2UgKi8KLX07Ci0KLXN0cnVjdCBkb3dubGRpbyB7Ci0gICAgdW5zaWduZWQgaW50IHJlcV90eXBlOwkJLyogRkVQIG9yIGNvbmNlbnRyYXRvciAqLwotICAgIHVuc2lnbmVkIGludCBiZGlkOwkJCS8qIG9wYXF1ZSBib2FyZCBpZGVudGlmaWVyICovCi0gICAgdW5pb24gewotCXN0cnVjdCBkb3dubGRfdCBkbDsJCS8qIGRvd25sb2FkIHN0cnVjdHVyZSAqLwotCXN0cnVjdCBmZXBpbWcgICBmaTsJCS8qIGZlcC9iaW9zIGltYWdlIHN0cnVjdHVyZSAqLwotICAgIH0gaW1hZ2U7Ci19OwotCi0jZGVmaW5lIERJR0lfRExSRVFfR0VUCSgoJ2QnPDw4KSB8IDIyMCkKLSNkZWZpbmUgRElHSV9ETFJFUV9TRVQJKCgnZCc8PDgpIHwgMjIxKQotCi0jZGVmaW5lIERJR0lfRExfTlVLRSAgICAoKCdkJzw8OCkgfCAyMjIpIC8qIE5vdCByZWFsbHkgYSBkbCByZXF1ZXN0LCBidXQKLQkJCQkJICBkYW5nZXJvdXMgZW51ZmYgdG8gbm90IHB1dCBpbgotCQkJCQkgIGRpZ2kuaCAqLwotLyogUGFja2VkIGJpdHMgb2YgaW50YXJnIGZvciBESUdJX0RMX05VS0UgKi8KLSNkZWZpbmUgRElHSV9OVUtFX1JFU0VUX0FMTAkgKDEgPDwgMzEpCi0jZGVmaW5lIERJR0lfTlVLRV9JTkhJQklUX1BPTExFUiAoMSA8PCAzMCkKLSNkZWZpbmUgRElHSV9OVUtFX0JSRF9OVU1CICAgICAgICAweDBmCi0JCi0KLQotI2RlZmluZQlETFJFUV9CSU9TCTAKLSNkZWZpbmUJRExSRVFfRkVQCTEKLSNkZWZpbmUJRExSRVFfQ09OQwkyCi0jZGVmaW5lCURMUkVRX0NPTkZJRwkzCi0jZGVmaW5lIERMUkVRX0RFVkNSRUFURSA0Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfZHJpdmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4OWQwMTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9kcml2ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKiAKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUgCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICogCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCi0gKglOT1RFIFRPIExJTlVYIEtFUk5FTCBIQUNLRVJTOiAgRE8gTk9UIFJFRk9STUFUIFRISVMgQ09ERSEKLSAqCi0gKglUaGlzIGlzIHNoYXJlZCBjb2RlIGJldHdlZW4gRGlnaSdzIENWUyBhcmNoaXZlIGFuZCB0aGUKLSAqCUxpbnV4IEtlcm5lbCBzb3VyY2VzLgotICoJQ2hhbmdpbmcgdGhlIHNvdXJjZSBqdXN0IGZvciByZWZvcm1hdHRpbmcgbmVlZGxlc3NseSBicmVha3MKLSAqCW91ciBDVlMgZGlmZiBoaXN0b3J5LgotICoKLSAqCVNlbmQgYW55IGJ1ZyBmaXhlcy9jaGFuZ2VzIHRvOiAgRW5nLkxpbnV4IGF0IGRpZ2kgZG90IGNvbS4KLSAqCVRoYW5rIHlvdS4KLSAqCi0gKiAkSWQ6IGRnYXBfZHJpdmVyLmMsdiAxLjMgMjAxMS8wNi8yMSAxMDozNToxNiBtYXJraCBFeHAgJAotICovCi0KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIEZvciB1ZGVsYXkgKi8KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JLyogRm9yIGNvcHlfZnJvbV91c2VyL2NvcHlfdG9fdXNlciAqLwotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0KLSNpbmNsdWRlICJkZ2FwX2RyaXZlci5oIgotI2luY2x1ZGUgImRnYXBfcGNpLmgiCi0jaW5jbHVkZSAiZGdhcF9mZXA1LmgiCi0jaW5jbHVkZSAiZGdhcF90dHkuaCIKLSNpbmNsdWRlICJkZ2FwX2NvbmYuaCIKLSNpbmNsdWRlICJkZ2FwX3BhcnNlLmgiCi0jaW5jbHVkZSAiZGdhcF90cmFjZS5oIgotI2luY2x1ZGUgImRnYXBfc3lzZnMuaCIKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiRGlnaSBJbnRlcm5hdGlvbmFsLCBodHRwOi8vd3d3LmRpZ2kuY29tIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgdGhlIERpZ2kgSW50ZXJuYXRpb25hbCBFUENBIFBDSSBiYXNlZCBwcm9kdWN0IGxpbmUiKTsKLU1PRFVMRV9TVVBQT1JURURfREVWSUNFKCJkZ2FwIik7Ci0KLS8qCi0gKiBpbnNtb2QgY29tbWFuZCBsaW5lIG92ZXJyaWRlYWJsZSBwYXJhbWV0ZXJzCi0gKgotICogTk9URTogd2UgdXNlIGEgc2V0IG9mIG1hY3JvcyB0byBjcmVhdGUgdGhlIHZhcmlhYmxlcywgd2hpY2ggYWxsb3dzCi0gKiB1cyB0byBzcGVjaWZ5IHRoZSB2YXJpYWJsZSB0eXBlLCBuYW1lLCBpbml0aWFsIHZhbHVlLCBhbmQgZGVzY3JpcHRpb24uCi0gKi8KLVBBUk1fSU5UKGRlYnVnLAkJMHgwMCwJCTA2NDQsCSJEcml2ZXIgZGVidWdnaW5nIGxldmVsIik7Ci1QQVJNX0lOVChyYXdyZWFkb2ssCTEsCQkwNjQ0LAkiQnlwYXNzIGZsaXAgYnVmZmVycyBvbiBpbnB1dCIpOwotUEFSTV9JTlQodHJjYnVmX3NpemUsCTB4MTAwMDAwLAkwNjQ0LAkiRGVidWdnaW5nIHRyYWNlIGJ1ZmZlciBzaXplLiIpOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIHByb3RvcyBmb3IgdGhpcyBmaWxlCi0gKgotICovCi0KLXN0YXRpYyBpbnQJCWRnYXBfc3RhcnQodm9pZCk7Ci1zdGF0aWMgdm9pZAkJZGdhcF9pbml0X2dsb2JhbHModm9pZCk7Ci1zdGF0aWMgaW50CQlkZ2FwX2ZvdW5kX2JvYXJkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgaWQpOwotc3RhdGljIHZvaWQJCWRnYXBfY2xlYW51cF9ib2FyZChzdHJ1Y3QgYm9hcmRfdCAqYnJkKTsKLXN0YXRpYyB2b2lkCQlkZ2FwX3BvbGxfaGFuZGxlcih1bG9uZyBkdW1teSk7Ci1zdGF0aWMgaW50CQlkZ2FwX2luaXRfcGNpKHZvaWQpOwotc3RhdGljIGludAkJZGdhcF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7Ci1zdGF0aWMgdm9pZAkJZGdhcF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotc3RhdGljIGludAkJZGdhcF9wcm9iZTEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBjYXJkX3R5cGUpOwotc3RhdGljIHZvaWQJCWRnYXBfbWJ1ZihzdHJ1Y3QgYm9hcmRfdCAqYnJkLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Ci1zdGF0aWMgaW50CQlkZ2FwX2RvX3JlbWFwKHN0cnVjdCBib2FyZF90ICpicmQpOwotc3RhdGljIGlycXJldHVybl90CWRnYXBfaW50cihpbnQgaXJxLCB2b2lkICp2b2lkYnJkKTsKLQotLyogRHJpdmVyIGxvYWQvdW5sb2FkIGZ1bmN0aW9ucyAqLwotaW50CQkJZGdhcF9pbml0X21vZHVsZSh2b2lkKTsKLXZvaWQJCQlkZ2FwX2NsZWFudXBfbW9kdWxlKHZvaWQpOwotCi1tb2R1bGVfaW5pdChkZ2FwX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KGRnYXBfY2xlYW51cF9tb2R1bGUpOwotCi0KLS8qCi0gKiBGaWxlIG9wZXJhdGlvbnMgcGVybWl0dGVkIG9uIENvbnRyb2wvTWFuYWdlbWVudCBtYWpvci4KLSAqLwotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgRGdhcEJvYXJkRm9wcyA9Ci17Ci0JLm93bmVyCQk9CVRISVNfTU9EVUxFLAotfTsKLQotCi0vKgotICogR2xvYmFscwotICovCi11aW50CQkJZGdhcF9OdW1Cb2FyZHM7Ci1zdHJ1Y3QgYm9hcmRfdAkJKmRnYXBfQm9hcmRbTUFYQk9BUkRTXTsKLURFRklORV9TUElOTE9DSyhkZ2FwX2dsb2JhbF9sb2NrKTsKLXVsb25nCQkJZGdhcF9wb2xsX2NvdW50ZXI7Ci1jaGFyCQkJKmRnYXBfY29uZmlnX2J1ZjsKLWludAkJCWRnYXBfZHJpdmVyX3N0YXRlID0gRFJJVkVSX0lOSVRJQUxJWkVEOwotREVGSU5FX1NQSU5MT0NLKGRnYXBfZGxfbG9jayk7Ci13YWl0X3F1ZXVlX2hlYWRfdAlkZ2FwX2RsX3dhaXQ7Ci1pbnQJCQlkZ2FwX2RsX2FjdGlvbjsKLWludAkJCWRnYXBfcG9sbF90aWNrID0gMjA7CS8qIFBvbGwgaW50ZXJ2YWwgLSAyMCBtcyAqLwotCi0vKgotICogU3RhdGljIHZhcnMuCi0gKi8KLXN0YXRpYyBpbnQJCWRnYXBfTWFqb3JfQ29udHJvbF9SZWdpc3RlcmVkID0gRkFMU0U7Ci1zdGF0aWMgdWludAkJZGdhcF9kcml2ZXJfc3RhcnQgPSBGQUxTRTsKLQotc3RhdGljIHN0cnVjdCBjbGFzcyAqCWRnYXBfY2xhc3M7Ci0KLS8qCi0gKiBQb2xsZXIgc3R1ZmYKLSAqLwotc3RhdGljIAkJCURFRklORV9TUElOTE9DSyhkZ2FwX3BvbGxfbG9jayk7CS8qIFBvbGwgc2NoZWR1bGluZyBsb2NrICovCi1zdGF0aWMgdWxvbmcJCWRnYXBfcG9sbF90aW1lOwkJCQkvKiBUaW1lIG9mIG5leHQgcG9sbCAqLwotc3RhdGljIHVpbnQJCWRnYXBfcG9sbF9zdG9wOwkJCQkvKiBVc2VkIHRvIHRlbGwgcG9sbGVyIHRvIHN0b3AgKi8KLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBkZ2FwX3BvbGxfdGltZXI7Ci0KLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGRnYXBfcGNpX3RibFtdID0gewotCXsgICAgICAgRElHSV9WSUQsIFBDSV9ERVZJQ0VfWEVNX0RJRCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwJMCB9LAotCXsgICAgICAgRElHSV9WSUQsIFBDSV9ERVZJQ0VfQ1hfRElELAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAgIDEgfSwKLQl7ICAgICAgIERJR0lfVklELCBQQ0lfREVWSUNFX0NYX0lCTV9ESUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCTIgfSwKLQl7ICAgICAgIERJR0lfVklELCBQQ0lfREVWSUNFX0VQQ0pfRElELAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAkzIH0sCi0JeyAgICAgICBESUdJX1ZJRCwgUENJX0RFVklDRV85MjBfMl9ESUQsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCTQgfSwKLQl7ICAgICAgIERJR0lfVklELCBQQ0lfREVWSUNFXzkyMF80X0RJRCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwJNSB9LAotCXsgICAgICAgRElHSV9WSUQsIFBDSV9ERVZJQ0VfOTIwXzhfRElELAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAk2IH0sCi0JeyAgICAgICBESUdJX1ZJRCwgUENJX0RFVklDRV9YUl9ESUQsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCTcgfSwKLQl7ICAgICAgIERJR0lfVklELCBQQ0lfREVWSUNFX1hSSl9ESUQsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCTggfSwKLQl7ICAgICAgIERJR0lfVklELCBQQ0lfREVWSUNFX1hSXzQyMl9ESUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCTkgfSwKLQl7ICAgICAgIERJR0lfVklELCBQQ0lfREVWSUNFX1hSX0lCTV9ESUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCTEwIH0sCi0JeyAgICAgICBESUdJX1ZJRCwgUENJX0RFVklDRV9YUl9TQUlQX0RJRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwJMTEgfSwKLQl7ICAgICAgIERJR0lfVklELCBQQ0lfREVWSUNFX1hSX0JVTExfRElELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAkxMiB9LAotCXsgICAgICAgRElHSV9WSUQsIFBDSV9ERVZJQ0VfOTIwXzhfSFBfRElELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMyB9LAotCXsgICAgICAgRElHSV9WSUQsIFBDSV9ERVZJQ0VfWEVNX0hQX0RJRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwJMTQgfSwKLQl7MCx9CQkJCQkvKiAwIHRlcm1pbmF0ZWQgbGlzdC4gKi8KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZGdhcF9wY2lfdGJsKTsKLQotCi0vKgotICogQSBnZW5lcmljIGxpc3Qgb2YgUHJvZHVjdCBuYW1lcywgUENJIFZlbmRvciBJRCwgYW5kIFBDSSBEZXZpY2UgSUQuCi0gKi8KLXN0cnVjdCBib2FyZF9pZCB7Ci0JdWludCBjb25maWdfdHlwZTsKLQl1Y2hhciAqbmFtZTsKLQl1aW50IG1heHBvcnRzOwotCXVpbnQgZHBhdHlwZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYm9hcmRfaWQgZGdhcF9JZHNbXSA9Ci17Ci0JewlQUENNLAkJUENJX0RFVklDRV9YRU1fTkFNRSwJNjQsCShUX1BDWE0gfCBUX1BDTElURSB8IFRfUENJQlVTKQl9LAotCXsJUENYLAkJUENJX0RFVklDRV9DWF9OQU1FLAkxMjgsCShUX0NYIHwgVF9QQ0lCVVMpCQl9LAotCXsJUENYLAkJUENJX0RFVklDRV9DWF9JQk1fTkFNRSwJMTI4LAkoVF9DWCB8IFRfUENJQlVTKQkJfSwKLQl7CVBFUEMsCQlQQ0lfREVWSUNFX0VQQ0pfTkFNRSwJMjI0LAkoVF9FUEMgIHwgVF9QQ0lCVVMpCQl9LAotCXsJQVBPUlQyXzkyMFAsCVBDSV9ERVZJQ0VfOTIwXzJfTkFNRSwJMiwJKFRfUENYUiB8IFRfUENMSVRFIHwgVF9QQ0lCVVMpCX0sCi0JewlBUE9SVDRfOTIwUCwJUENJX0RFVklDRV85MjBfNF9OQU1FLAk0LAkoVF9QQ1hSIHwgVF9QQ0xJVEUgfCBUX1BDSUJVUykJfSwKLQl7CUFQT1JUOF85MjBQLAlQQ0lfREVWSUNFXzkyMF84X05BTUUsCTgsCShUX1BDWFIgfCBUX1BDTElURSB8IFRfUENJQlVTKQl9LAotCXsJUEFQT1JUOCwJUENJX0RFVklDRV9YUl9OQU1FLAk4LAkoVF9QQ1hSIHwgVF9QQ0xJVEUgfCBUX1BDSUJVUykJfSwKLQl7CVBBUE9SVDgsCVBDSV9ERVZJQ0VfWFJKX05BTUUsCTgsCShUX1BDWFIgfCBUX1BDTElURSB8IFRfUENJQlVTKQl9LAotCXsJUEFQT1JUOCwJUENJX0RFVklDRV9YUl80MjJfTkFNRSwJOCwJKFRfUENYUiB8IFRfUENMSVRFIHwgVF9QQ0lCVVMpCX0sCi0JewlQQVBPUlQ4LAlQQ0lfREVWSUNFX1hSX0lCTV9OQU1FLAk4LAkoVF9QQ1hSIHwgVF9QQ0xJVEUgfCBUX1BDSUJVUykJfSwKLQl7CVBBUE9SVDgsCVBDSV9ERVZJQ0VfWFJfU0FJUF9OQU1FLCA4LAkoVF9QQ1hSIHwgVF9QQ0xJVEUgfCBUX1BDSUJVUykJfSwKLQl7CVBBUE9SVDgsCVBDSV9ERVZJQ0VfWFJfQlVMTF9OQU1FLCA4LAkoVF9QQ1hSIHwgVF9QQ0xJVEUgfCBUX1BDSUJVUykJfSwKLQl7CUFQT1JUOF85MjBQLAlQQ0lfREVWSUNFXzkyMF84X0hQX05BTUUsIDgsCShUX1BDWFIgfCBUX1BDTElURSB8IFRfUENJQlVTKQl9LAotCXsJUFBDTSwJCVBDSV9ERVZJQ0VfWEVNX0hQX05BTUUsCTY0LAkoVF9QQ1hNIHwgVF9QQ0xJVEUgfCBUX1BDSUJVUykJfSwKLQl7MCx9CQkJCQkJLyogMCB0ZXJtaW5hdGVkIGxpc3QuICovCi19OwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZGdhcF9kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gImRnYXAiLAotCS5wcm9iZQkJPSBkZ2FwX2luaXRfb25lLAotCS5pZF90YWJsZQk9IGRnYXBfcGNpX3RibCwKLQkucmVtb3ZlCQk9IGRnYXBfcmVtb3ZlX29uZSwKLX07Ci0KLQotY2hhciAqZGdhcF9zdGF0ZV90ZXh0W10gPSB7Ci0JIkJvYXJkIEZhaWxlZCIsCi0JIkNvbmZpZ3VyYXRpb24gZm9yIGJvYXJkIG5vdCBmb3VuZC5cblx0XHRcdFJ1biBtcGkgdG8gY29uZmlndXJlIGJvYXJkLiIsCi0JIkJvYXJkIEZvdW5kIiwKLQkiTmVlZCBSZXNldCIsCi0JIkZpbmlzaGVkIFJlc2V0IiwKLQkiTmVlZCBDb25maWciLAotCSJGaW5pc2hlZCBDb25maWciLAotCSJOZWVkIERldmljZSBDcmVhdGlvbiIsCi0JIlJlcXVlc3RlZCBEZXZpY2UgQ3JlYXRpb24iLAotCSJGaW5pc2hlZCBEZXZpY2UgQ3JlYXRpb24iLAotCSJOZWVkIEJJT1MgTG9hZCIsIAotCSJSZXF1ZXN0ZWQgQklPUyIsIAotCSJEb2luZyBCSU9TIExvYWQiLAotCSJGaW5pc2hlZCBCSU9TIExvYWQiLAotCSJOZWVkIEZFUCBMb2FkIiwgCi0JIlJlcXVlc3RlZCBGRVAiLAotCSJEb2luZyBGRVAgTG9hZCIsCi0JIkZpbmlzaGVkIEZFUCBMb2FkIiwKLQkiUmVxdWVzdGVkIFBST0MgY3JlYXRpb24iLAotCSJGaW5pc2hlZCBQUk9DIGNyZWF0aW9uIiwKLQkiQm9hcmQgUkVBRFkiLAotfTsKLQotY2hhciAqZGdhcF9kcml2ZXJfc3RhdGVfdGV4dFtdID0gewotCSJEcml2ZXIgSW5pdGlhbGl6ZWQiLAotCSJEcml2ZXIgbmVlZHMgY29uZmlndXJhdGlvbiBsb2FkLiIsCi0JIkRyaXZlciByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbiBmcm9tIGRvd25sb2FkIGRhZW1vbi4iLAotCSJEcml2ZXIgUmVhZHkuIgotfTsKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBEcml2ZXIgbG9hZC91bmxvYWQgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIGluaXRfbW9kdWxlKCkKLSAqCi0gKiBNb2R1bGUgbG9hZC4gIFRoaXMgaXMgd2hlcmUgaXQgYWxsIHN0YXJ0cy4KLSAqLwotaW50IGRnYXBfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlpbnQgcmMgPSAwOwotCi0JQVBSKCgiJXMsIERpZ2kgSW50ZXJuYXRpb25hbCBQYXJ0IE51bWJlciAlc1xuIiwgREdfTkFNRSwgREdfUEFSVCkpOwotCi0JLyoKLQkgKiBJbml0aWFsaXplIGdsb2JhbCBzdHVmZgotCSAqLwotCXJjID0gZGdhcF9zdGFydCgpOwotCi0JaWYgKHJjIDwgMCkgewotCQlyZXR1cm4ocmMpOwotCX0KLQotCS8qCi0JICogRmluZCBhbmQgY29uZmlndXJlIGFsbCB0aGUgY2FyZHMKLQkgKi8KLQlyYyA9IGRnYXBfaW5pdF9wY2koKTsKLQotCS8qCi0JICogSWYgc29tZXRoaW5nIHdlbnQgd3JvbmcgaW4gdGhlIHNjYW4sIGJhaWwgb3V0IG9mIGRyaXZlci4KLQkgKi8KLQlpZiAocmMgPCAwKSB7Ci0JCS8qIE9ubHkgdW5yZWdpc3RlciB0aGUgcGNpIGRyaXZlciBpZiBpdCB3YXMgYWN0dWFsbHkgcmVnaXN0ZXJlZC4gKi8KLQkJaWYgKGRnYXBfTnVtQm9hcmRzKQotCQkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkZ2FwX2RyaXZlcik7Ci0JCWVsc2UKLQkJCXByaW50aygiV0FSTklORzogZGdhcCBkcml2ZXIgbG9hZCBmYWlsZWQuICBObyBER0FQIGJvYXJkcyBmb3VuZC5cbiIpOwotCi0JCWRnYXBfY2xlYW51cF9tb2R1bGUoKTsKLQl9Ci0JZWxzZSB7Ci0JCWRnYXBfY3JlYXRlX2RyaXZlcl9zeXNmaWxlcygmZGdhcF9kcml2ZXIpOwotCX0KLSAgCi0JRFBSX0lOSVQoKCJGaW5pc2hlZCBpbml0X21vZHVsZS4gUmV0dXJuaW5nICVkXG4iLCByYykpOwotCXJldHVybiAocmMpOwotfQotCi0KLS8qCi0gKiBTdGFydCBvZiBkcml2ZXIuCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF9zdGFydCh2b2lkKQotewotCWludCByYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChkZ2FwX2RyaXZlcl9zdGFydCA9PSBGQUxTRSkgewotCi0JCWRnYXBfZHJpdmVyX3N0YXJ0ID0gVFJVRTsKLQotCSAgICAgICAgLyogbWFrZSBzdXJlIHRoYXQgdGhlIGdsb2JhbHMgYXJlIGluaXQnZCBiZWZvcmUgd2UgZG8gYW55dGhpbmcgZWxzZSAqLwotCSAgICAgICAgZGdhcF9pbml0X2dsb2JhbHMoKTsKLQotCQlkZ2FwX051bUJvYXJkcyA9IDA7Ci0KLQkJQVBSKCgiRm9yIHRoZSB0b29scyBwYWNrYWdlIG9yIHVwZGF0ZWQgZHJpdmVycyBwbGVhc2UgdmlzaXQgaHR0cDovL3d3dy5kaWdpLmNvbVxuIikpOwotCi0JCS8qCi0JCSAqIFJlZ2lzdGVyIG91ciBiYXNlIGNoYXJhY3RlciBkZXZpY2UgaW50byB0aGUga2VybmVsLgotCQkgKiBUaGlzIGFsbG93cyB0aGUgZG93bmxvYWQgZGFlbW9uIHRvIGNvbm5lY3QgdG8gdGhlIGRvd25sZCBkZXZpY2UKLQkJICogYmVmb3JlIGFueSBvZiB0aGUgYm9hcmRzIGFyZSBpbml0J2VkLgotCQkgKi8KLQkJaWYgKCFkZ2FwX01ham9yX0NvbnRyb2xfUmVnaXN0ZXJlZCkgewotCQkJLyoKLQkJCSAqIFJlZ2lzdGVyIG1hbmFnZW1lbnQvZHBhIGRldmljZXMKLQkJCSAqLwotCQkJcmMgPSByZWdpc3Rlcl9jaHJkZXYoRElHSV9ER0FQX01BSk9SLCAiZGdhcCIsICZEZ2FwQm9hcmRGb3BzKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlBUFIoKCJDYW4ndCByZWdpc3RlciBkZ2FwIGRyaXZlciBkZXZpY2UgKCVkKVxuIiwgcmMpKTsKLQkJCQlyZXR1cm4gKHJjKTsKLQkJCX0KLQotCQkJZGdhcF9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgImRnYXBfbWdtdCIpOwotCQkJZGV2aWNlX2NyZWF0ZShkZ2FwX2NsYXNzLCBOVUxMLAotCQkJCU1LREVWKERJR0lfREdBUF9NQUpPUiwgMCksCi0JCQkJTlVMTCwgImRnYXBfbWdtdCIpOwotCQkJZGV2aWNlX2NyZWF0ZShkZ2FwX2NsYXNzLCBOVUxMLAotCQkJCU1LREVWKERJR0lfREdBUF9NQUpPUiwgMSksCi0JCQkJTlVMTCwgImRnYXBfZG93bmxkIik7Ci0JCQlkZ2FwX01ham9yX0NvbnRyb2xfUmVnaXN0ZXJlZCA9IFRSVUU7Ci0JCX0KLQotCQkvKgotCQkgKiBJbml0IGFueSBnbG9iYWwgdHR5IHN0dWZmLgotCQkgKi8KLQkJcmMgPSBkZ2FwX3R0eV9wcmVpbml0KCk7Ci0KLQkJaWYgKHJjIDwgMCkgewotCQkJQVBSKCgidHR5IHByZWluaXQgLSBub3QgZW5vdWdoIG1lbW9yeSAoJWQpXG4iLCByYykpOwotCQkJcmV0dXJuKHJjKTsgCi0JCX0KLQotCQkvKiBTdGFydCB0aGUgcG9sbGVyICovCi0JCURHQVBfTE9DSyhkZ2FwX3BvbGxfbG9jaywgZmxhZ3MpOwotCQlpbml0X3RpbWVyKCZkZ2FwX3BvbGxfdGltZXIpOwotCQlkZ2FwX3BvbGxfdGltZXIuZnVuY3Rpb24gPSBkZ2FwX3BvbGxfaGFuZGxlcjsKLQkJZGdhcF9wb2xsX3RpbWVyLmRhdGEgPSAwOwotCQlkZ2FwX3BvbGxfdGltZSA9IGppZmZpZXMgKyBkZ2FwX2ppZmZpZXNfZnJvbV9tcyhkZ2FwX3BvbGxfdGljayk7Ci0JCWRnYXBfcG9sbF90aW1lci5leHBpcmVzID0gZGdhcF9wb2xsX3RpbWU7Ci0JCURHQVBfVU5MT0NLKGRnYXBfcG9sbF9sb2NrLCBmbGFncyk7Ci0KLQkJYWRkX3RpbWVyKCZkZ2FwX3BvbGxfdGltZXIpOwotCi0JCWRnYXBfZHJpdmVyX3N0YXRlID0gRFJJVkVSX05FRURfQ09ORklHX0xPQUQ7Ci0JfQotCi0JcmV0dXJuIChyYyk7Ci19Ci0KLQotLyoKLSAqIFJlZ2lzdGVyIHBjaSBkcml2ZXIsIGFuZCByZXR1cm4gaG93IG1hbnkgYm9hcmRzIHdlIGhhdmUuCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF9pbml0X3BjaSh2b2lkKQotewotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkZ2FwX2RyaXZlcik7Ci19Ci0KLQotLyogcmV0dXJucyBjb3VudCAoPj0gMCksIG9yIG5lZ2F0aXZlIG9uIGVycm9yICovCi1zdGF0aWMgaW50IGRnYXBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCi17Ci0JaW50IHJjOwotCi0JLyogd2FrZSB1cCBhbmQgZW5hYmxlIGRldmljZSAqLwotCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCXJjID0gLUVJTzsKLQl9IGVsc2UgeyAgCi0JCXJjID0gZGdhcF9wcm9iZTEocGRldiwgZW50LT5kcml2ZXJfZGF0YSk7Ci0JCWlmIChyYyA9PSAwKSB7Ci0JCQlkZ2FwX051bUJvYXJkcysrOwotCQkJRFBSX0lOSVQoKCJJbmNyZW1lbnRpbmcgbnVtYm9hcmRzIHRvICVkXG4iLCBkZ2FwX051bUJvYXJkcykpOwotCQl9Ci0JfQotCXJldHVybiByYzsKLX0gICAgICAgICAgICAgICAKLQotCi1zdGF0aWMgaW50IGRnYXBfcHJvYmUxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgY2FyZF90eXBlKQotewotCXJldHVybiBkZ2FwX2ZvdW5kX2JvYXJkKHBkZXYsIGNhcmRfdHlwZSk7Ci19Ci0gICAgICAgICAKLSAgICAgICAgCi1zdGF0aWMgdm9pZCBkZ2FwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQkvKiBEbyBOb3RoaW5nICovCi19Ci0KLQotLyoKLSAqIGRnYXBfY2xlYW51cF9tb2R1bGUoKQotICoKLSAqIE1vZHVsZSB1bmxvYWQuICBUaGlzIGlzIHdoZXJlIGl0IGFsbCBlbmRzLgotICovCi12b2lkIGRnYXBfY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQlpbnQgaTsKLQl1bG9uZyBsb2NrX2ZsYWdzOwotCi0JREdBUF9MT0NLKGRnYXBfcG9sbF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQlkZ2FwX3BvbGxfc3RvcCA9IDE7Ci0JREdBUF9VTkxPQ0soZGdhcF9wb2xsX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JLyogVHVybiBvZmYgcG9sbGVyIHJpZ2h0IGF3YXkuICovCi0JZGVsX3RpbWVyX3N5bmMoICZkZ2FwX3BvbGxfdGltZXIpOwotCi0JZGdhcF9yZW1vdmVfZHJpdmVyX3N5c2ZpbGVzKCZkZ2FwX2RyaXZlcik7Ci0KLQotCWlmIChkZ2FwX01ham9yX0NvbnRyb2xfUmVnaXN0ZXJlZCkgewotCQlkZXZpY2VfZGVzdHJveShkZ2FwX2NsYXNzLCBNS0RFVihESUdJX0RHQVBfTUFKT1IsIDApKTsKLQkJZGV2aWNlX2Rlc3Ryb3koZGdhcF9jbGFzcywgTUtERVYoRElHSV9ER0FQX01BSk9SLCAxKSk7Ci0JCWNsYXNzX2Rlc3Ryb3koZGdhcF9jbGFzcyk7Ci0JCXVucmVnaXN0ZXJfY2hyZGV2KERJR0lfREdBUF9NQUpPUiwgImRnYXAiKTsKLQl9Ci0KLQlrZnJlZShkZ2FwX2NvbmZpZ19idWYpOwotCi0JZm9yIChpID0gMDsgaSA8IGRnYXBfTnVtQm9hcmRzOyArK2kpIHsKLQkJZGdhcF9yZW1vdmVfcG9ydHNfc3lzZmlsZXMoZGdhcF9Cb2FyZFtpXSk7Ci0JCWRnYXBfdHR5X3VuaW5pdChkZ2FwX0JvYXJkW2ldKTsKLQkJZGdhcF9jbGVhbnVwX2JvYXJkKGRnYXBfQm9hcmRbaV0pOwotCX0KLQotCWRnYXBfdHR5X3Bvc3RfdW5pbml0KCk7Ci0KLSNpZiBkZWZpbmVkKERHQVBfVFJBQ0VSKQotCS8qIGxhc3QgdGhpbmcsIG1ha2Ugc3VyZSB3ZSByZWxlYXNlIHRoZSB0cmFjZWJ1ZmZlciAqLwotCWRnYXBfdHJhY2VyX2ZyZWUoKTsKLSNlbmRpZgotCWlmIChkZ2FwX051bUJvYXJkcykKLQkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkZ2FwX2RyaXZlcik7Ci19Ci0KLQotLyoKLSAqIGRnYXBfY2xlYW51cF9ib2FyZCgpCi0gKgotICogRnJlZSBhbGwgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYSBib2FyZAotICovCi1zdGF0aWMgdm9pZCBkZ2FwX2NsZWFudXBfYm9hcmQoc3RydWN0IGJvYXJkX3QgKmJyZCkKLXsKLQlpbnQgaSA9IDA7Ci0KLSAgICAgICAgaWYoIWJyZCB8fCBicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0JaWYgKGJyZC0+aW50cl91c2VkICYmIGJyZC0+aXJxKQotCQlmcmVlX2lycShicmQtPmlycSwgYnJkKTsKLQotCXRhc2tsZXRfa2lsbCgmYnJkLT5oZWxwZXJfdGFza2xldCk7Ci0KLQlpZiAoYnJkLT5yZV9tYXBfcG9ydCkgewotCQlyZWxlYXNlX21lbV9yZWdpb24oYnJkLT5tZW1iYXNlICsgMHgyMDAwMDAsIDB4MjAwMDAwKTsKLQkJaW91bm1hcChicmQtPnJlX21hcF9wb3J0KTsKLQkJYnJkLT5yZV9tYXBfcG9ydCA9IE5VTEw7Ci0JfQotCi0JaWYgKGJyZC0+cmVfbWFwX21lbWJhc2UpIHsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSwgMHgyMDAwMDApOwotCQlpb3VubWFwKGJyZC0+cmVfbWFwX21lbWJhc2UpOwotCQlicmQtPnJlX21hcF9tZW1iYXNlID0gTlVMTDsKLQl9Ci0KLSAgICAgICAgaWYgKGJyZC0+bXNnYnVmX2hlYWQpIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gICAgICAgICAgICAgICAgREdBUF9MT0NLKGRnYXBfZ2xvYmFsX2xvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBicmQtPm1zZ2J1ZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKCIlcyIsIGJyZC0+bXNnYnVmX2hlYWQpOwotICAgICAgICAgICAgICAgIGtmcmVlKGJyZC0+bXNnYnVmX2hlYWQpOwotICAgICAgICAgICAgICAgIGJyZC0+bXNnYnVmX2hlYWQgPSBOVUxMOwotICAgICAgICAgICAgICAgIERHQVBfVU5MT0NLKGRnYXBfZ2xvYmFsX2xvY2ssIGZsYWdzKTsKLSAgICAgICAgfQotCi0JLyogRnJlZSBhbGwgYWxsb2NhdGVkIGNoYW5uZWxzIHN0cnVjdHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTUFYUE9SVFMgOyBpKyspIHsKLQkJaWYgKGJyZC0+Y2hhbm5lbHNbaV0pIHsKLQkJCWtmcmVlKGJyZC0+Y2hhbm5lbHNbaV0pOwotCQkJYnJkLT5jaGFubmVsc1tpXSA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQlrZnJlZShicmQtPmZsaXBidWYpOwotCWtmcmVlKGJyZC0+ZmxpcGZsYWdidWYpOwotCi0JZGdhcF9Cb2FyZFticmQtPmJvYXJkbnVtXSA9IE5VTEw7Ci0KLSAgICAgICAga2ZyZWUoYnJkKTsKLX0KLQotCi0vKgotICogZGdhcF9mb3VuZF9ib2FyZCgpCi0gKgotICogQSBib2FyZCBoYXMgYmVlbiBmb3VuZCwgaW5pdCBpdC4KLSAqLwotc3RhdGljIGludCBkZ2FwX2ZvdW5kX2JvYXJkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgaWQpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJyZDsKLQl1bnNpZ25lZCBpbnQgcGNpX2lycTsKLQlpbnQgaSA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIGdldCB0aGUgYm9hcmQgc3RydWN0dXJlIGFuZCBwcmVwIGl0ICovCi0JYnJkID0gZGdhcF9Cb2FyZFtkZ2FwX051bUJvYXJkc10gPQotCShzdHJ1Y3QgYm9hcmRfdCAqKSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYm9hcmRfdCksIEdGUF9LRVJORUwpOwotCWlmICghYnJkKSB7Ci0JCUFQUigoIm1lbW9yeSBhbGxvY2F0aW9uIGZvciBib2FyZCBzdHJ1Y3R1cmUgZmFpbGVkXG4iKSk7Ci0JCXJldHVybigtRU5PTUVNKTsKLQl9Ci0KLQkvKiBtYWtlIGEgdGVtcG9yYXJ5IG1lc3NhZ2UgYnVmZmVyIGZvciB0aGUgYm9vdCBtZXNzYWdlcyAqLwotCWJyZC0+bXNnYnVmID0gYnJkLT5tc2didWZfaGVhZCA9Ci0JCShjaGFyICopIGt6YWxsb2Moc2l6ZW9mKGNoYXIpICogODE5MiwgR0ZQX0tFUk5FTCk7Ci0JaWYoIWJyZC0+bXNnYnVmKSB7Ci0JCWtmcmVlKGJyZCk7Ci0JCUFQUigoIm1lbW9yeSBhbGxvY2F0aW9uIGZvciBib2FyZCBtc2didWYgZmFpbGVkXG4iKSk7Ci0JCXJldHVybigtRU5PTUVNKTsKLQl9Ci0KLQkvKiBzdG9yZSB0aGUgaW5mbyBmb3IgdGhlIGJvYXJkIHdlJ3ZlIGZvdW5kICovCi0JYnJkLT5tYWdpYyA9IERHQVBfQk9BUkRfTUFHSUM7Ci0JYnJkLT5ib2FyZG51bSA9IGRnYXBfTnVtQm9hcmRzOwotCWJyZC0+Zmlyc3RtaW5vciA9IDA7Ci0JYnJkLT52ZW5kb3IgPSBkZ2FwX3BjaV90YmxbaWRdLnZlbmRvcjsKLQlicmQtPmRldmljZSA9IGRnYXBfcGNpX3RibFtpZF0uZGV2aWNlOwotCWJyZC0+cGRldiA9IHBkZXY7Ci0JYnJkLT5wY2lfYnVzID0gcGRldi0+YnVzLT5udW1iZXI7Ci0JYnJkLT5wY2lfc2xvdCA9IFBDSV9TTE9UKHBkZXYtPmRldmZuKTsKLQlicmQtPm5hbWUgPSBkZ2FwX0lkc1tpZF0ubmFtZTsKLQlicmQtPm1heHBvcnRzID0gZGdhcF9JZHNbaWRdLm1heHBvcnRzOwotCWJyZC0+dHlwZSA9IGRnYXBfSWRzW2lkXS5jb25maWdfdHlwZTsKLQlicmQtPmRwYXR5cGUgPSBkZ2FwX0lkc1tpZF0uZHBhdHlwZTsKLQlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJyZC0+c3RhdGVfd2FpdCk7Ci0KLQlER0FQX1NQSU5MT0NLX0lOSVQoYnJkLT5iZF9sb2NrKTsKLQotCWJyZC0+c3RhdGUJCT0gQk9BUkRfRk9VTkQ7Ci0JYnJkLT5ydW53YWl0CQk9IDA7Ci0JYnJkLT5pbmhpYml0X3BvbGxlcgk9IEZBTFNFOwotCWJyZC0+d2FpdF9mb3JfYmlvcwk9IDA7Ci0JYnJkLT53YWl0X2Zvcl9mZXAJPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWFBPUlRTOyBpKyspIHsKLQkJYnJkLT5jaGFubmVsc1tpXSA9IE5VTEw7Ci0JfQotCi0JLyogc3RvcmUgd2hpY2ggY2FyZCAmIHJldmlzaW9uIHdlIGhhdmUgKi8KLQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJmJyZC0+c3VidmVuZG9yKTsKLQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfU1VCU1lTVEVNX0lELCAmYnJkLT5zdWJkZXZpY2UpOwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmJyZC0+cmV2KTsKLQotCXBjaV9pcnEgPSBwZGV2LT5pcnE7Ci0JYnJkLT5pcnEgPSBwY2lfaXJxOwotCi0JLyogZ2V0IHRoZSBQQ0kgQmFzZSBBZGRyZXNzIFJlZ2lzdGVycyAqLwotCi0JLyogWHIgSnVwaXRlciBhbmQgRVBDIHVzZSBCQVIgMiAqLwotCWlmIChicmQtPmRldmljZSA9PSBQQ0lfREVWSUNFX1hSSl9ESUQgfHwgYnJkLT5kZXZpY2UgPT0gUENJX0RFVklDRV9FUENKX0RJRCkgewotCQlicmQtPm1lbWJhc2UgICAgID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpOwotCQlicmQtPm1lbWJhc2VfZW5kID0gcGNpX3Jlc291cmNlX2VuZChwZGV2LCAyKTsKLQl9Ci0JLyogRXZlcnlvbmUgZWxzZSB1c2VzIEJBUiAwICovCi0JZWxzZSB7Ci0JCWJyZC0+bWVtYmFzZSAgICAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7Ci0JCWJyZC0+bWVtYmFzZV9lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIDApOwotCX0KLQotCWlmICghYnJkLT5tZW1iYXNlKSB7Ci0JCUFQUigoImNhcmQgaGFzIG5vIFBDSSBJTyByZXNvdXJjZXMsIGZhaWxpbmcgYm9hcmQuXG4iKSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmIChicmQtPm1lbWJhc2UgJiAxKQotCQlicmQtPm1lbWJhc2UgJj0gfjM7Ci0JZWxzZQotCQlicmQtPm1lbWJhc2UgJj0gfjE1OwotCi0JLyoKLQkgKiBPbiB0aGUgUENJIGJvYXJkcywgdGhlcmUgaXMgbm8gSU8gc3BhY2UgYWxsb2NhdGVkCi0JICogVGhlIEkvTyByZWdpc3RlcnMgd2lsbCBiZSBpbiB0aGUgZmlyc3QgMyBieXRlcyBvZiB0aGUKLQkgKiB1cHBlciAyTUIgb2YgdGhlIDRNQiBtZW1vcnkgc3BhY2UuICBUaGUgYm9hcmQgbWVtb3J5Ci0JICogd2lsbCBiZSBtYXBwZWQgaW50byB0aGUgbG93IDJNQiBvZiB0aGUgNE1CIG1lbW9yeSBzcGFjZQotCSAqLwotCWJyZC0+cG9ydCA9IGJyZC0+bWVtYmFzZSArIFBDSV9JT19PRkZTRVQ7Ci0JYnJkLT5wb3J0X2VuZCA9IGJyZC0+cG9ydCArIFBDSV9JT19TSVpFOwotCi0KLQkvKgotCSAqIFNwZWNpYWwgaW5pdGlhbGl6YXRpb24gZm9yIG5vbi1QTFggYm9hcmRzCi0JICovCi0JaWYgKGJyZC0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfWFJKX0RJRCAmJiBicmQtPmRldmljZSAhPSBQQ0lfREVWSUNFX0VQQ0pfRElEKSB7Ci0JCXVuc2lnbmVkIHNob3J0IGNtZDsKLQotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0MCwgMCk7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDQ2LCAwKTsKLQotCQkvKiBMaW1pdCBidXJzdCBsZW5ndGggdG8gMiBkb3VibGV3b3JkIHRyYW5zYWN0aW9ucyAqLyAKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDIsIDEpOwotCi0JCS8qCi0JCSAqIEVuYWJsZSBJTyBhbmQgbWVtIGlmIG5vdCBhbHJlYWR5IGRvbmUuCi0JCSAqIFRoaXMgd2FzIG5lZWRlZCBmb3Igc3VwcG9ydCBvbiBJdGFuaXVtLgotCQkgKi8KLQkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwotCQljbWQgfD0gKFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZKTsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBjbWQpOwotCX0KLQotCS8qIGluaXQgb3VyIHBvbGwgaGVscGVyIHRhc2tsZXQgKi8KLQl0YXNrbGV0X2luaXQoJmJyZC0+aGVscGVyX3Rhc2tsZXQsIGRnYXBfcG9sbF90YXNrbGV0LCAodW5zaWduZWQgbG9uZykgYnJkKTsKLQotCSAvKiBMb2cgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBib2FyZCAqLwotCWRnYXBfbWJ1ZihicmQsIERSVlNUUiI6IGJvYXJkICVkOiAlcyAocmV2ICVkKSwgaXJxICVkXG4iLAotCQlkZ2FwX051bUJvYXJkcywgYnJkLT5uYW1lLCBicmQtPnJldiwgYnJkLT5pcnEpOwotCi0JRFBSX0lOSVQoKCJkZ2FwX3NjYW4oJWQpIC0gcHJpbnRpbmcgb3V0IHRoZSBtc2didWZcbiIsIGkpKTsKLQlER0FQX0xPQ0soZGdhcF9nbG9iYWxfbG9jaywgZmxhZ3MpOwotCWJyZC0+bXNnYnVmID0gTlVMTDsKLQlwcmludGsoIiVzIiwgYnJkLT5tc2didWZfaGVhZCk7Ci0Ja2ZyZWUoYnJkLT5tc2didWZfaGVhZCk7Ci0JYnJkLT5tc2didWZfaGVhZCA9IE5VTEw7Ci0JREdBUF9VTkxPQ0soZGdhcF9nbG9iYWxfbG9jaywgZmxhZ3MpOwotCi0JaSA9IGRnYXBfZG9fcmVtYXAoYnJkKTsKLQlpZiAoaSkKLQkJYnJkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKLQllbHNlCi0JCWJyZC0+c3RhdGUgPSBORUVEX1JFU0VUOwotCi0gICAgICAgIHJldHVybigwKTsKLX0KLQotCi1pbnQgZGdhcF9maW5hbGl6ZV9ib2FyZF9pbml0KHN0cnVjdCBib2FyZF90ICpicmQpIHsKLQotICAgICAgICBpbnQgcmM7Ci0KLSAgICAgICAgRFBSX0lOSVQoKCJkZ2FwX2ZpbmFsaXplX2JvYXJkX2luaXQoKSAtIHN0YXJ0XG4iKSk7Ci0KLQlpZiAoIWJyZCB8fCBicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0gICAgICAgICAgICAgICAgcmV0dXJuKC1FTk9ERVYpOwotCi0gICAgICAgIERQUl9JTklUKCgiZGdhcF9maW5hbGl6ZV9ib2FyZF9pbml0KCkgLSBzdGFydCAjMlxuIikpOwotCi0JYnJkLT51c2VfaW50ZXJydXB0cyA9IGRnYXBfY29uZmlnX2dldF91c2VpbnRyKGJyZCk7Ci0KLQkvKgotCSAqIFNldCB1cCBvdXIgaW50ZXJydXB0IGhhbmRsZXIgaWYgd2UgYXJlIHNldCB0byBkbyBpbnRlcnJ1cHRzLgotCSAqLwotCWlmIChicmQtPnVzZV9pbnRlcnJ1cHRzICYmIGJyZC0+aXJxKSB7Ci0KLQkJcmMgPSByZXF1ZXN0X2lycShicmQtPmlycSwgZGdhcF9pbnRyLCBJUlFGX1NIQVJFRCwgIkRHQVAiLCBicmQpOwotCi0JCWlmIChyYykgewotCQkJZGdhcF9tYnVmKGJyZCwgRFJWU1RSIjogRmFpbGVkIHRvIGhvb2sgSVJRICVkLiBCb2FyZCB3aWxsIHdvcmsgaW4gcG9sbCBtb2RlLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmQtPmlycSk7Ci0JCQlicmQtPmludHJfdXNlZCA9IDA7Ci0JCX0KLQkJZWxzZQotCQkJYnJkLT5pbnRyX3VzZWQgPSAxOwotCX0gZWxzZSB7Ci0JCWJyZC0+aW50cl91c2VkID0gMDsKLQl9Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLQotLyoKLSAqIFJlbWFwIFBDSSBtZW1vcnkuCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF9kb19yZW1hcChzdHJ1Y3QgYm9hcmRfdCAqYnJkKQotewotCWlmICghYnJkIHx8IGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuIC1FTlhJTzsKLQotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSwgMHgyMDAwMDAsICJkZ2FwIikpIHsKLQkJQVBSKCgiZGdhcDogbWVtX3JlZ2lvbiAlbHggYWxyZWFkeSBpbiB1c2UuXG4iLCBicmQtPm1lbWJhc2UpKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgIH0KLQotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSArIFBDSV9JT19PRkZTRVQsIDB4MjAwMDAwLCAiZGdhcCIpKSB7Ci0JCUFQUigoImRnYXA6IG1lbV9yZWdpb24gSU8gJWx4IGFscmVhZHkgaW4gdXNlLlxuIiwKLQkJCWJyZC0+bWVtYmFzZSArIFBDSV9JT19PRkZTRVQpKTsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSwgMHgyMDAwMDApOwotCQlyZXR1cm4gLUVOT01FTTsKLSAgICAgICAgfQotCi0JYnJkLT5yZV9tYXBfbWVtYmFzZSA9IGlvcmVtYXAoYnJkLT5tZW1iYXNlLCAweDIwMDAwMCk7Ci0JaWYgKCFicmQtPnJlX21hcF9tZW1iYXNlKSB7Ci0JCUFQUigoImRnYXA6IGlvcmVtYXAgbWVtICVseCBjYW5ub3QgYmUgbWFwcGVkLlxuIiwgYnJkLT5tZW1iYXNlKSk7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihicmQtPm1lbWJhc2UsIDB4MjAwMDAwKTsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSArIFBDSV9JT19PRkZTRVQsIDB4MjAwMDAwKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JYnJkLT5yZV9tYXBfcG9ydCA9IGlvcmVtYXAoKGJyZC0+bWVtYmFzZSArIFBDSV9JT19PRkZTRVQpLCAweDIwMDAwMCk7Ci0JaWYgKCFicmQtPnJlX21hcF9wb3J0KSB7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihicmQtPm1lbWJhc2UsIDB4MjAwMDAwKTsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSArIFBDSV9JT19PRkZTRVQsIDB4MjAwMDAwKTsKLQkJaW91bm1hcChicmQtPnJlX21hcF9tZW1iYXNlKTsKLQkJQVBSKCgiZGdhcDogaW9yZW1hcCBJTyBtZW0gJWx4IGNhbm5vdCBiZSBtYXBwZWQuXG4iLAotCQkJYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVCkpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlEUFJfSU5JVCgoInJlbWFwcGVkIGlvOiAweCVwICByZW1hcHBlZCBtZW06IDB4JXBcbiIsCi0JCWJyZC0+cmVfbWFwX3BvcnQsIGJyZC0+cmVfbWFwX21lbWJhc2UpKTsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246Ci0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0qICAgIGRnYXBfcG9sbF9oYW5kbGVyCi0qCi0qIEF1dGhvcjoKLSoKLSogICAgU2NvdHQgSCBLaWxhdQotKiAgICAgICAKLSogUGFyYW1ldGVyczoKLSoKLSogICAgZHVtbXkgLS0gaWdub3JlZCAgICAgICAgICAgICAgICAgICAgCi0qCi0qIFJldHVybiBWYWx1ZXM6Ci0qCi0qICAgIG5vbmUKLSoKLSogRGVzY3JpcHRpb246ICAgCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0qICAgIEFzIGVhY2ggdGltZXIgZXhwaXJlcywgaXQgZGV0ZXJtaW5lcyAoYSkgd2hldGhlciB0aGUgInRyYW5zbWl0IgotKiAgICB3YWl0ZXIgbmVlZHMgdG8gYmUgd29rZW4gdXAsIGFuZCAoYikgd2hldGhlciB0aGUgcG9sbGVyIG5lZWRzIHRvCi0qICAgIGJlIHJlc2NoZWR1bGVkLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBkZ2FwX3BvbGxfaGFuZGxlcih1bG9uZyBkdW1teSkKLXsKLQlpbnQgaTsKLSAgICAgICAgc3RydWN0IGJvYXJkX3QgKmJyZDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOwotICAgICAgICB1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MyOwotCXVsb25nIG5ld190aW1lOwotCi0JZGdhcF9wb2xsX2NvdW50ZXIrKzsKLQotCi0JLyoKLQkgKiBJZiBkcml2ZXIgbmVlZHMgdGhlIGNvbmZpZyBmaWxlIHN0aWxsLAotCSAqIGtlZXAgdHJ5aW5nIHRvIHdha2UgdXAgdGhlIGRvd25sb2FkZXIgdG8KLQkgKiBzZW5kIHVzIHRoZSBmaWxlLgotCSAqLwotICAgICAgICBpZiAoZGdhcF9kcml2ZXJfc3RhdGUgPT0gRFJJVkVSX05FRURfQ09ORklHX0xPQUQpIHsKLQkJLyoKLQkJICogU2lnbmFsIGRvd25sb2FkZXIsIGl0cyBnb3Qgc29tZSB3b3JrIHRvIGRvLgotCQkgKi8KLQkJREdBUF9MT0NLKGRnYXBfZGxfbG9jaywgbG9ja19mbGFnczIpOwotCQlpZiAoZGdhcF9kbF9hY3Rpb24gIT0gMSkgewotCQkJZGdhcF9kbF9hY3Rpb24gPSAxOwotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZ2FwX2RsX3dhaXQpOwotCQl9Ci0JCURHQVBfVU5MT0NLKGRnYXBfZGxfbG9jaywgbG9ja19mbGFnczIpOwotCQlnb3RvIHNjaGVkdWxlX3BvbGxlcjsKLSAgICAgICAgfQotCS8qCi0JICogRG8gbm90IHN0YXJ0IHRoZSBib2FyZCBzdGF0ZSBtYWNoaW5lIHVudGlsCi0JICogZHJpdmVyIHRlbGxzIHVzIGl0cyB1cCBhbmQgcnVubmluZywgYW5kIGhhcwotCSAqIGV2ZXJ5dGhpbmcgaXQgbmVlZHMuCi0JICovCi0JZWxzZSBpZiAoZGdhcF9kcml2ZXJfc3RhdGUgIT0gRFJJVkVSX1JFQURZKSB7Ci0JCWdvdG8gc2NoZWR1bGVfcG9sbGVyOwotCX0KLQotCS8qCi0JICogSWYgd2UgaGF2ZSBqdXN0IDEgYm9hcmQsIG9yIHRoZSBzeXN0ZW0gaXMgbm90IFNNUCwKLQkgKiB0aGVuIHVzZSB0aGUgdHlwaWNhbCBvbGQgc3R5bGUgcG9sbGVyLgotCSAqIE90aGVyd2lzZSwgdXNlIG91ciBuZXcgdGFza2xldCBiYXNlZCBwb2xsZXIsIHdoaWNoIHNob3VsZAotCSAqIHNwZWVkIHRoaW5ncyB1cCBmb3IgbXVsdGlwbGUgYm9hcmRzLgotCSAqLwotCWlmICggKGRnYXBfTnVtQm9hcmRzID09IDEpIHx8IChudW1fb25saW5lX2NwdXMoKSA8PSAxKSApIHsKLQkJZm9yIChpID0gMDsgaSA8IGRnYXBfTnVtQm9hcmRzOyBpKyspIHsKLQotCQkJYnJkID0gZGdhcF9Cb2FyZFtpXTsKLQotCQkJaWYgKGJyZC0+c3RhdGUgPT0gQk9BUkRfRkFJTEVEKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoIWJyZC0+aW50cl9ydW5uaW5nKSB7Ci0JCQkJLyogQ2FsbCB0aGUgcmVhbCBib2FyZCBwb2xsZXIgZGlyZWN0bHkgKi8KLQkJCQlkZ2FwX3BvbGxfdGFza2xldCgodW5zaWduZWQgbG9uZykgYnJkKTsKLQkJCX0KLQkJfQotCX0KLQllbHNlIHsKLQkJLyogR28gdGhydSBlYWNoIGJvYXJkLCBraWNraW5nIG9mZiBhIHRhc2tsZXQgZm9yIGVhY2ggaWYgbmVlZGVkICovCi0JCWZvciAoaSA9IDA7IGkgPCBkZ2FwX051bUJvYXJkczsgaSsrKSB7Ci0JCQlicmQgPSBkZ2FwX0JvYXJkW2ldOwotCi0JCQkvKgotCQkJICogQXR0ZW1wdCB0byBncmFiIHRoZSBib2FyZCBsb2NrLgotCQkJICoKLQkJCSAqIElmIHdlIGNhbid0IGdldCBpdCwgbm8gYmlnIGRlYWwsIHRoZSBuZXh0IHBvbGwgd2lsbCBnZXQgaXQuCi0JCQkgKiBCYXNpY2FsbHksIEkganVzdCByZWFsbHkgZG9uJ3Qgd2FudCB0byBzcGluIGluIGhlcmUsIGJlY2F1c2UgSSB3YW50Ci0JCQkgKiB0byBraWNrIG9mZiBteSB0YXNrbGV0cyBhcyBmYXN0IGFzIEkgY2FuLCBhbmQgdGhlbiBnZXQgb3V0IHRoZSBwb2xsZXIuCi0JCQkgKi8KLQkJCWlmICghc3Bpbl90cnlsb2NrKCZicmQtPmJkX2xvY2spKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIElmIGJvYXJkIGlzIGluIGEgZmFpbGVkIHN0YXRlLCBkb24ndCBib3RoZXIgc2NoZWR1bGluZyBhIHRhc2tsZXQgKi8KLQkJCWlmIChicmQtPnN0YXRlID09IEJPQVJEX0ZBSUxFRCkgewotCQkJCXNwaW5fdW5sb2NrKCZicmQtPmJkX2xvY2spOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKiBTY2hlZHVsZSBhIHBvbGwgaGVscGVyIHRhc2sgKi8KLQkJCWlmICghYnJkLT5pbnRyX3J1bm5pbmcpIHsKLQkJCQl0YXNrbGV0X3NjaGVkdWxlKCZicmQtPmhlbHBlcl90YXNrbGV0KTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIENhbid0IGRvIERHQVBfVU5MT0NLIGhlcmUsIGFzIHdlIGRvbid0IGhhdmUKLQkJCSAqIGxvY2tfZmxhZ3MgYmVjYXVzZSB3ZSBkaWQgYSB0cnlsb2NrIGFib3ZlLgotCQkJICovCi0JCQlzcGluX3VubG9jaygmYnJkLT5iZF9sb2NrKTsKLQkJfQotCX0KLQotc2NoZWR1bGVfcG9sbGVyOgotCi0JLyoKLQkgKiBTY2hlZHVsZSBvdXJzZWxmIGJhY2sgYXQgdGhlIG5vbWluYWwgd2FrZXVwIGludGVydmFsLgotCSAqLwotCURHQVBfTE9DSyhkZ2FwX3BvbGxfbG9jaywgbG9ja19mbGFncyApOwotCWRnYXBfcG9sbF90aW1lICs9ICBkZ2FwX2ppZmZpZXNfZnJvbV9tcyhkZ2FwX3BvbGxfdGljayk7Ci0KLQluZXdfdGltZSA9IGRnYXBfcG9sbF90aW1lIC0gamlmZmllczsKLQotCWlmICgodWxvbmcpIG5ld190aW1lID49IDIgKiBkZ2FwX3BvbGxfdGljaykgewotCQlkZ2FwX3BvbGxfdGltZSA9IGppZmZpZXMgKyAgZGdhcF9qaWZmaWVzX2Zyb21fbXMoZGdhcF9wb2xsX3RpY2spOwotCX0KLQotCWRnYXBfcG9sbF90aW1lci5mdW5jdGlvbiA9IGRnYXBfcG9sbF9oYW5kbGVyOwotCWRnYXBfcG9sbF90aW1lci5kYXRhID0gMDsKLQlkZ2FwX3BvbGxfdGltZXIuZXhwaXJlcyA9IGRnYXBfcG9sbF90aW1lOwotCURHQVBfVU5MT0NLKGRnYXBfcG9sbF9sb2NrLCBsb2NrX2ZsYWdzICk7Ci0KLQlpZiAoIWRnYXBfcG9sbF9zdG9wKQotCQlhZGRfdGltZXIoJmRnYXBfcG9sbF90aW1lcik7Ci19Ci0KLQotCi0KLS8qCi0gKiBkZ2FwX2ludHIoKQotICoKLSAqIERyaXZlciBpbnRlcnJ1cHQgaGFuZGxlci4KLSAqLwotc3RhdGljIGlycXJldHVybl90IGRnYXBfaW50cihpbnQgaXJxLCB2b2lkICp2b2lkYnJkKQotewotCXN0cnVjdCBib2FyZF90ICpicmQgPSAoc3RydWN0IGJvYXJkX3QgKikgdm9pZGJyZDsKLQotCWlmICghYnJkKSB7Ci0JCUFQUigoIlJlY2VpdmVkIGludGVycnVwdCAoJWQpIHdpdGggbnVsbCBib2FyZCBhc3NvY2lhdGVkXG4iLCBpcnEpKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KLQotCS8qCi0JICogQ2hlY2sgdG8gbWFrZSBzdXJlIGl0cyBmb3IgdXMuCi0JICovCi0JaWYgKGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykgewotCQlBUFIoKCJSZWNlaXZlZCBpbnRlcnJ1cHQgKCVkKSB3aXRoIGEgYm9hcmQgcG9pbnRlciB0aGF0IHdhc24ndCBvdXJzIVxuIiwgaXJxKSk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0KLQlicmQtPmludHJfY291bnQrKzsKLQotCS8qCi0JICogU2NoZWR1bGUgdGFza2xldCB0byBydW4gYXQgYSBiZXR0ZXIgdGltZS4KLQkgKi8KLQl0YXNrbGV0X3NjaGVkdWxlKCZicmQtPmhlbHBlcl90YXNrbGV0KTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLQotLyoKLSAqIGRnYXBfaW5pdF9nbG9iYWxzKCkKLSAqCi0gKiBUaGlzIGlzIHdoZXJlIHdlIGluaXRpYWxpemUgdGhlIGdsb2JhbHMgZnJvbSB0aGUgc3RhdGljIGluc21vZAotICogY29uZmlndXJhdGlvbiB2YXJpYWJsZXMuICBUaGVzZSBhcmUgZGVjbGFyZWQgbmVhciB0aGUgaGVhZCBvZgotICogdGhpcyBmaWxlLgotICovCi1zdGF0aWMgdm9pZCBkZ2FwX2luaXRfZ2xvYmFscyh2b2lkKQotewotCWludCBpID0gMDsKLQotCWRnYXBfcmF3cmVhZG9rCQk9IHJhd3JlYWRvazsKLSAgICAgICAgZGdhcF90cmNidWZfc2l6ZQk9IHRyY2J1Zl9zaXplOwotCWRnYXBfZGVidWcJCT0gZGVidWc7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYQk9BUkRTOyBpKyspIHsKLQkJZGdhcF9Cb2FyZFtpXSA9IE5VTEw7Ci0JfQotCi0JaW5pdF90aW1lciggJmRnYXBfcG9sbF90aW1lciApOyAKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRnYXBfZGxfd2FpdCk7Ci0JZGdhcF9kbF9hY3Rpb24gPSAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBVdGlsaXR5IGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoKLSAqIGRnYXBfbWJ1ZigpCi0gKgotICogVXNlZCB0byBwcmludCB0byB0aGUgbWVzc2FnZSBidWZmZXIgZHVyaW5nIGJvYXJkIGluaXQuCi0gKi8KLXN0YXRpYyB2b2lkIGRnYXBfbWJ1ZihzdHJ1Y3QgYm9hcmRfdCAqYnJkLCBjb25zdCBjaGFyICpmbXQsIC4uLikgewotCXZhX2xpc3QJCWFwOwotCWNoYXIJCWJ1ZlsxMDI0XTsKLQlpbnQJCWk7Ci0JdW5zaWduZWQgbG9uZwlmbGFnczsKLQlzaXplX3QJCWxlbmd0aDsKLQotCURHQVBfTE9DSyhkZ2FwX2dsb2JhbF9sb2NrLCBmbGFncyk7Ci0KLQkvKiBGb3JtYXQgYnVmIHVzaW5nIGZtdCBhbmQgYXJndW1lbnRzIGNvbnRhaW5lZCBpbiBhcC4gKi8KLQl2YV9zdGFydChhcCwgZm10KTsKLQlpID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgIGFwKTsKLQl2YV9lbmQoYXApOwotCi0JRFBSKChidWYpKTsKLQotCWlmICghYnJkIHx8ICFicmQtPm1zZ2J1ZikgewotCQlwcmludGsoIiVzIiwgYnVmKTsKLQkJREdBUF9VTkxPQ0soZGdhcF9nbG9iYWxfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JbGVuZ3RoID0gc3RybGVuKGJ1ZikgKyAxOwotCWlmIChicmQtPm1zZ2J1ZiAtIGJyZC0+bXNnYnVmX2hlYWQgPCBsZW5ndGgpCi0JCWxlbmd0aCA9IGJyZC0+bXNnYnVmIC0gYnJkLT5tc2didWZfaGVhZDsKLQltZW1jcHkoYnJkLT5tc2didWYsIGJ1ZiwgbGVuZ3RoKTsKLQlicmQtPm1zZ2J1ZiArPSBsZW5ndGg7Ci0KLQlER0FQX1VOTE9DSyhkZ2FwX2dsb2JhbF9sb2NrLCBmbGFncyk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfbXNfc2xlZXAoKQotICoKLSAqIFB1dCB0aGUgZHJpdmVyIHRvIHNsZWVwIGZvciB4IG1zJ3MKLSAqCi0gKiBSZXR1cm5zIDAgaWYgdGltZWQgb3V0LCAhMCAoc2hvd2luZyBzaWduYWwpIGlmIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLgotICovCi1pbnQgZGdhcF9tc19zbGVlcCh1bG9uZyBtcykKLXsKLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQlzY2hlZHVsZV90aW1lb3V0KChtcyAqIEhaKSAvIDEwMDApOwotCXJldHVybiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpOwotfQotCi0KLQotLyoKLSAqICAgICAgZGdhcF9pb2N0bF9uYW1lKCkgOiBSZXR1cm5zIGEgdGV4dCB2ZXJzaW9uIG9mIGVhY2ggaW9jdGwgdmFsdWUuCi0gKi8KLWNoYXIgKmRnYXBfaW9jdGxfbmFtZShpbnQgY21kKQotewotCXN3aXRjaChjbWQpIHsKLQotCWNhc2UgVENHRVRBOgkJcmV0dXJuKCJUQ0dFVEEiKTsKLQljYXNlIFRDR0VUUzoJCXJldHVybigiVENHRVRTIik7Ci0JY2FzZSBUQ1NFVEE6CQlyZXR1cm4oIlRDU0VUQSIpOwotCWNhc2UgVENTRVRTOgkJcmV0dXJuKCJUQ1NFVFMiKTsKLQljYXNlIFRDU0VUQVc6CQlyZXR1cm4oIlRDU0VUQVciKTsKLQljYXNlIFRDU0VUU1c6CQlyZXR1cm4oIlRDU0VUU1ciKTsKLQljYXNlIFRDU0VUQUY6CQlyZXR1cm4oIlRDU0VUQUYiKTsKLQljYXNlIFRDU0VUU0Y6CQlyZXR1cm4oIlRDU0VUU0YiKTsKLQljYXNlIFRDU0JSSzoJCXJldHVybigiVENTQlJLIik7Ci0JY2FzZSBUQ1hPTkM6CQlyZXR1cm4oIlRDWE9OQyIpOwotCWNhc2UgVENGTFNIOgkJcmV0dXJuKCJUQ0ZMU0giKTsKLQljYXNlIFRJT0NHU0lEOgkJcmV0dXJuKCJUSU9DR1NJRCIpOwotCi0JY2FzZSBUSU9DR0VURDoJCXJldHVybigiVElPQ0dFVEQiKTsKLQljYXNlIFRJT0NTRVREOgkJcmV0dXJuKCJUSU9DU0VURCIpOwotCWNhc2UgVElPQ0dXSU5TWjoJcmV0dXJuKCJUSU9DR1dJTlNaIik7Ci0JY2FzZSBUSU9DU1dJTlNaOglyZXR1cm4oIlRJT0NTV0lOU1oiKTsKLQotCWNhc2UgVElPQ01HRVQ6CQlyZXR1cm4oIlRJT0NNR0VUIik7Ci0JY2FzZSBUSU9DTVNFVDoJCXJldHVybigiVElPQ01TRVQiKTsKLQljYXNlIFRJT0NNQklTOgkJcmV0dXJuKCJUSU9DTUJJUyIpOwotCWNhc2UgVElPQ01CSUM6CQlyZXR1cm4oIlRJT0NNQklDIik7Ci0KLQkvKiBmcm9tIGRpZ2kuaCAqLwotCWNhc2UgRElHSV9TRVRBOgkJcmV0dXJuKCJESUdJX1NFVEEiKTsKLQljYXNlIERJR0lfU0VUQVc6CXJldHVybigiRElHSV9TRVRBVyIpOwotCWNhc2UgRElHSV9TRVRBRjoJcmV0dXJuKCJESUdJX1NFVEFGIik7Ci0JY2FzZSBESUdJX1NFVEZMT1c6CXJldHVybigiRElHSV9TRVRGTE9XIik7Ci0JY2FzZSBESUdJX1NFVEFGTE9XOglyZXR1cm4oIkRJR0lfU0VUQUZMT1ciKTsKLQljYXNlIERJR0lfR0VURkxPVzoJcmV0dXJuKCJESUdJX0dFVEZMT1ciKTsKLQljYXNlIERJR0lfR0VUQUZMT1c6CXJldHVybigiRElHSV9HRVRBRkxPVyIpOwotCWNhc2UgRElHSV9HRVRBOgkJcmV0dXJuKCJESUdJX0dFVEEiKTsKLQljYXNlIERJR0lfR0VERUxBWToJcmV0dXJuKCJESUdJX0dFREVMQVkiKTsKLQljYXNlIERJR0lfU0VERUxBWToJcmV0dXJuKCJESUdJX1NFREVMQVkiKTsKLQljYXNlIERJR0lfR0VUQ1VTVE9NQkFVRDogcmV0dXJuKCJESUdJX0dFVENVU1RPTUJBVUQiKTsKLQljYXNlIERJR0lfU0VUQ1VTVE9NQkFVRDogcmV0dXJuKCJESUdJX1NFVENVU1RPTUJBVUQiKTsKLQljYXNlIFRJT0NNT0RHOgkJcmV0dXJuKCJUSU9DTU9ERyIpOwotCWNhc2UgVElPQ01PRFM6CQlyZXR1cm4oIlRJT0NNT0RTIik7Ci0JY2FzZSBUSU9DU0RUUjoJCXJldHVybigiVElPQ1NEVFIiKTsKLQljYXNlIFRJT0NDRFRSOgkJcmV0dXJuKCJUSU9DQ0RUUiIpOwotCi0JZGVmYXVsdDoJCXJldHVybigidW5rbm93biIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfZHJpdmVyLmggYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2RyaXZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjdhNTVhNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2RyaXZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKLSAqICAgICAgU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBEcml2ZXIgaW5jbHVkZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0RHQVBfRFJJVkVSX0gKLSNkZWZpbmUgX19ER0FQX0RSSVZFUl9ICi0KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CS8qIFRvIGdldCB0aGUgY3VycmVudCBMaW51eCB2ZXJzaW9uICovCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4gICAgICAgIC8qIFRvIHBpY2sgdXAgdGhlIHZhcmlvbnMgTGludXggdHlwZXMgKi8KLSNpbmNsdWRlIDxsaW51eC90dHkuaD4gICAgICAgICAgLyogVG8gcGljayB1cCB0aGUgdmFyaW91cyB0dHkgc3RydWN0cy9kZWZpbmVzICovCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+ICAgIC8qIEZvciBpcnFyZXR1cm5fdCB0eXBlICovCi0KLSNpbmNsdWRlICJkZ2FwX3R5cGVzLmgiICAgICAgICAgLyogQWRkaXRpb25hbCB0eXBlcyBuZWVkZWQgYnkgdGhlIERpZ2kgaGVhZGVyIGZpbGVzICovCi0jaW5jbHVkZSAiZGlnaS5oIiAgICAgICAgICAgICAgIC8qIERpZ2kgc3BlY2lmaWMgaW9jdGwgaGVhZGVyICovCi0jaW5jbHVkZSAiZGdhcF9rY29tcGF0LmgiICAgICAgIC8qIEtlcm5lbCAyLjQvMi42IGNvbXBhdCBpbmNsdWRlcyAqLwotI2luY2x1ZGUgImRnYXBfc3lzZnMuaCIJCS8qIFN1cHBvcnQgZm9yIFNZU0ZTICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRHJpdmVyIGRlZmluZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIERyaXZlciBpZGVudGlmaWNhdGlvbiwgZXJyb3IgYW5kIGRlYnVnZ2luZyBzdGF0bWVudHMKLSAqCi0gKiBJbiB0aGVvcnksIHlvdSBjYW4gY2hhbmdlIGFsbCBvY2N1cnJlbmNlcyBvZiAiZGlnaSIgaW4gdGhlIG5leHQKLSAqIHRocmVlIGxpbmVzLCBhbmQgdGhlIGRyaXZlciBwcmludGsncyB3aWxsIGFsbCBhdXRvbWFnaWNhbGx5IGNoYW5nZS4KLSAqCi0gKiBBUFIoKGZtdCwgYXJncywgLi4uKSk7CUFsd2F5cyBwcmludHMgbWVzc2FnZQotICogRFBSKChmbXQsIGFyZ3MsIC4uLikpOwlPbmx5IHByaW50cyBpZiBER0FQX1RSQUNFUiBpcyBkZWZpbmVkIGF0Ci0gKgkJCQkgIGNvbXBpbGUgdGltZSBhbmQgZGdhcF9kZWJ1ZyE9MAotICovCi0jZGVmaW5lCURHX05BTUUJCSJkZ2FwLTEuMy0xNiIKLSNkZWZpbmUJREdfUEFSVAkJIjQwMDAyMzQ3X0MiCi0KLSNkZWZpbmUJUFJPQ1NUUgkJImRnYXAiCQkJLyogL3Byb2MgZW50cmllcwkgKi8KLSNkZWZpbmUJREVWU1RSCQkiL2Rldi9kZy9kZ2FwIgkJLyogL2RldiBlbnRyaWVzCQkgKi8KLSNkZWZpbmUJRFJWU1RSCQkiZGdhcCIJCQkvKiBEcml2ZXIgbmFtZSBzdHJpbmcgCi0JCQkJCQkgKiBkaXNwbGF5ZWQgYnkgQVBSCSAqLwotI2RlZmluZQlBUFIoYXJncykJZG8geyBQUklOVEZfVE9fS01FTShhcmdzKTsgcHJpbnRrKERSVlNUUiI6ICIpOyBwcmludGsgYXJnczsgXAotCQkJICAgfSB3aGlsZSAoMCkKLSNkZWZpbmUJUkFQUihhcmdzKQlkbyB7IFBSSU5URl9UT19LTUVNKGFyZ3MpOyBwcmludGsgYXJnczsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBUUkNfVE9fQ09OU09MRSAxCi0KLS8qCi0gKiBEZWJ1Z2dpbmcgbGV2ZWxzIGNhbiBiZSBzZXQgdXNpbmcgZGVidWcgaW5zbW9kIHZhcmlhYmxlCi0gKiBUaGV5IGNhbiBhbHNvIGJlIGNvbXBpbGVkIG91dCBjb21wbGV0ZWx5LgotICovCi0KLSNkZWZpbmUJREJHX0lOSVQJCShkZ2FwX2RlYnVnICYgMHgwMSkKLSNkZWZpbmUJREJHX0JBU0lDCQkoZGdhcF9kZWJ1ZyAmIDB4MDIpCi0jZGVmaW5lCURCR19DT1JFCQkoZGdhcF9kZWJ1ZyAmIDB4MDQpCi0KLSNkZWZpbmUJREJHX09QRU4JCShkZ2FwX2RlYnVnICYgMHgwOCkKLSNkZWZpbmUJREJHX0NMT1NFCQkoZGdhcF9kZWJ1ZyAmIDB4MTApCi0jZGVmaW5lCURCR19SRUFECQkoZGdhcF9kZWJ1ZyAmIDB4MjApCi0jZGVmaW5lCURCR19XUklURQkJKGRnYXBfZGVidWcgJiAweDQwKQotCi0jZGVmaW5lCURCR19JT0NUTAkJKGRnYXBfZGVidWcgJiAweDgwKQotCi0jZGVmaW5lCURCR19QUk9DCQkoZGdhcF9kZWJ1ZyAmIDB4MTAwKQotI2RlZmluZQlEQkdfUEFSQU0JCShkZ2FwX2RlYnVnICYgMHgyMDApCi0jZGVmaW5lCURCR19QU0NBTgkJKGRnYXBfZGVidWcgJiAweDQwMCkKLSNkZWZpbmUJREJHX0VWRU5UCQkoZGdhcF9kZWJ1ZyAmIDB4ODAwKQotCi0jZGVmaW5lCURCR19EUkFJTgkJKGRnYXBfZGVidWcgJiAweDEwMDApCi0jZGVmaW5lCURCR19DQVJSCQkoZGdhcF9kZWJ1ZyAmIDB4MjAwMCkKLQotI2RlZmluZQlEQkdfTUdNVAkJKGRnYXBfZGVidWcgJiAweDQwMDApCi0KLQotI2lmIGRlZmluZWQoREdBUF9UUkFDRVIpCi0KLSMgaWYgZGVmaW5lZChUUkNfVE9fS01FTSkKLS8qIENob29zZSBvbmU6ICovCi0jICBkZWZpbmUgVFJDX09OX09WRVJGTE9XX1dSQVBfQVJPVU5ECi0jICB1bmRlZiAgVFJDX09OX09WRVJGTE9XX1NISUZUX0JVRkZFUgotIyBlbmRpZiAvL1RSQ19UT19LTUVNCi0KLSMgZGVmaW5lIFRSQ19NQVhNU0cJCTEwMjQKLSMgZGVmaW5lIFRSQ19PVkVSRkxPVwkJIihPVkVSRkxPVykiCi0jIGRlZmluZSBUUkNfRFRSQwkJIi91c3IvYmluL2R0cmMiCi0KLSNpZiBkZWZpbmVkIFRSQ19UT19DT05TT0xFCi0jZGVmaW5lIFBSSU5URl9UT19DT05TT0xFKGFyZ3MpIHsgcHJpbnRrKERSVlNUUiI6ICIpOyBwcmludGsgYXJnczsgfQotI2Vsc2UgLy8hZGVmaW5lZCBUUkFDRV9UT19DT05TT0xFCi0jZGVmaW5lIFBSSU5URl9UT19DT05TT0xFKGFyZ3MpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgVFJDX1RPX0tNRU0KLSNkZWZpbmUgUFJJTlRGX1RPX0tNRU0oYXJncykgZGdhcF90cmFjZWYgYXJncyAKLSNlbHNlIC8vIWRlZmluZWQgVFJDX1RPX0tNRU0KLSNkZWZpbmUgUFJJTlRGX1RPX0tNRU0oYXJncykKLSNlbmRpZgotCi0jZGVmaW5lCVRSQyhhcmdzKQl7IFBSSU5URl9UT19LTUVNKGFyZ3MpOyBQUklOVEZfVE9fQ09OU09MRShhcmdzKSB9Ci0KLSMgZGVmaW5lIERQUl9JTklUKEFSR1MpCQlpZiAoREJHX0lOSVQpIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX0JBU0lDKEFSR1MpCWlmIChEQkdfQkFTSUMpIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX0NPUkUoQVJHUykJCWlmIChEQkdfQ09SRSkgVFJDKEFSR1MpCi0jIGRlZmluZSBEUFJfT1BFTihBUkdTKQkJaWYgKERCR19PUEVOKSAgVFJDKEFSR1MpCi0jIGRlZmluZSBEUFJfQ0xPU0UoQVJHUykJaWYgKERCR19DTE9TRSkgIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX1JFQUQoQVJHUykJCWlmIChEQkdfUkVBRCkgIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX1dSSVRFKEFSR1MpCWlmIChEQkdfV1JJVEUpIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX0lPQ1RMKEFSR1MpCWlmIChEQkdfSU9DVEwpIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX1BST0MoQVJHUykJCWlmIChEQkdfUFJPQykgIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX1BBUkFNKEFSR1MpCWlmIChEQkdfUEFSQU0pICBUUkMoQVJHUykKLSMgZGVmaW5lIERQUl9QU0NBTihBUkdTKQlpZiAoREJHX1BTQ0FOKSAgVFJDKEFSR1MpCi0jIGRlZmluZSBEUFJfRVZFTlQoQVJHUykJaWYgKERCR19FVkVOVCkgIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX0RSQUlOKEFSR1MpCWlmIChEQkdfRFJBSU4pICBUUkMoQVJHUykKLSMgZGVmaW5lIERQUl9DQVJSKEFSR1MpCQlpZiAoREJHX0NBUlIpICBUUkMoQVJHUykKLSMgZGVmaW5lIERQUl9NR01UKEFSR1MpCQlpZiAoREJHX01HTVQpICBUUkMoQVJHUykKLQotIyBkZWZpbmUgRFBSKEFSR1MpCQlpZiAoZGdhcF9kZWJ1ZykgVFJDKEFSR1MpCi0jIGRlZmluZSBQKFgpCQkJZGdhcF90cmFjZWYoI1ggIj0lcFxuIiwgWCkKLSMgZGVmaW5lIFgoWCkJCQlkZ2FwX3RyYWNlZigjWCAiPSV4XG4iLCBYKQotCi0jZWxzZS8vIWRlZmluZWQgREdBUF9UUkFDRVIKLQotI2RlZmluZSBQUklOVEZfVE9fS01FTShhcmdzKQotIyBkZWZpbmUgVFJDKEFSR1MpCi0jIGRlZmluZSBEUFJfSU5JVChBUkdTKQotIyBkZWZpbmUgRFBSX0JBU0lDKEFSR1MpCi0jIGRlZmluZSBEUFJfQ09SRShBUkdTKQotIyBkZWZpbmUgRFBSX09QRU4oQVJHUykKLSMgZGVmaW5lIERQUl9DTE9TRShBUkdTKQotIyBkZWZpbmUgRFBSX1JFQUQoQVJHUykKLSMgZGVmaW5lIERQUl9XUklURShBUkdTKQotIyBkZWZpbmUgRFBSX0lPQ1RMKEFSR1MpCi0jIGRlZmluZSBEUFJfUFJPQyhBUkdTKQotIyBkZWZpbmUgRFBSX1BBUkFNKEFSR1MpCi0jIGRlZmluZSBEUFJfUFNDQU4oQVJHUykKLSMgZGVmaW5lIERQUl9FVkVOVChBUkdTKQotIyBkZWZpbmUgRFBSX0RSQUlOKEFSR1MpCi0jIGRlZmluZSBEUFJfQ0FSUihBUkdTKQotIyBkZWZpbmUgRFBSX01HTVQoQVJHUykKLQotIyBkZWZpbmUgRFBSKGFyZ3MpCi0KLSNlbmRpZi8vREdBUF9UUkFDRVIKLQotLyogTnVtYmVyIG9mIGJvYXJkcyB3ZSBzdXBwb3J0IGF0IG9uY2UuICovCi0jZGVmaW5lCU1BWEJPQVJEUwkzMgotI2RlZmluZQlNQVhQT1JUUwkyMjQKLSNkZWZpbmUgTUFYVFRZTkFNRUxFTgkyMDAKLQotLyogT3VyIDMgbWFnaWMgbnVtYmVycyBmb3Igb3VyIGJvYXJkLCBjaGFubmVsIGFuZCB1bml0IHN0cnVjdHMgKi8KLSNkZWZpbmUgREdBUF9CT0FSRF9NQUdJQwkweDVjNmRmMTA0Ci0jZGVmaW5lIERHQVBfQ0hBTk5FTF9NQUdJQwkweDZjNmRmMTA0Ci0jZGVmaW5lIERHQVBfVU5JVF9NQUdJQwkJMHg3YzZkZjEwNAotCi0vKiBTZXJpYWwgcG9ydCB0eXBlcyAqLwotI2RlZmluZSBER0FQX1NFUklBTAkJMAotI2RlZmluZSBER0FQX1BSSU5UCQkxCi0KLSNkZWZpbmUJU0VSSUFMX1RZUEVfTk9STUFMCTEKLQotLyogNCBleHRyYSBmb3IgYWxpZ25tZW50IHBsYXkgc3BhY2UgKi8KLSNkZWZpbmUgV1JJVEVCVUZMRU4JCSgoNDA5NikgKyA0KQotI2RlZmluZSBNWUZMSVBMRU4JCU5fVFRZX0JVRl9TSVpFCi0KLSNkZWZpbmUgU0JSRUFLX1RJTUUgMHgyNQotI2RlZmluZSBVMkJTSVpFIDB4NDAwCi0KLSNkZWZpbmUgZGdhcF9qaWZmaWVzX2Zyb21fbXMoYSkgKCgoYSkgKiBIWikgLyAxMDAwKQotCi0vKgotICogT3VyIG1ham9yIGZvciB0aGUgbWdtdCBkZXZpY2VzLgotICoKLSAqIFdlIGNhbiB1c2UgMjIsIGJlY2F1c2UgRGlnaSB3YXMgYWxsb2NhdGVkIDIyIGFuZCAyMyBmb3IgdGhlIGVwY2EgZHJpdmVyLgotICogMjIgaGFzIG5vdyBiZWNvbWUgb2Jzb2xldGUgbm93IHRoYXQgdGhlICJjdSIgZGV2aWNlcyBoYXZlIAotICogYmVlbiByZW1vdmVkIGZyb20gMi42LgotICogQWxzbywgdGhpcyAqSVMqIHRoZSBlcGNhIGRyaXZlciwganVzdCBQQ0kgb25seSBub3cuCi0gKi8KLSNpZm5kZWYgRElHSV9ER0FQX01BSk9SCi0jIGRlZmluZSBESUdJX0RHQVBfTUFKT1IgICAgICAgICAyMgotI2VuZGlmCi0KLS8qCi0gKiBUaGUgcGFyYW1ldGVycyB3ZSB1c2UgdG8gZGVmaW5lIHRoZSBwZXJpb2RzIG9mIHRoZSBtb3ZpbmcgYXZlcmFnZXMuCi0gKi8KLSNkZWZpbmUJCU1BX1BFUklPRAkoSFogLyAxMCkKLSNkZWZpbmUJCVNNQV9EVVIJCSgxICogSFopCi0jZGVmaW5lCQlFTUFfRFVSCQkoMSAqIEhaKQotI2RlZmluZQkJU01BX05QRVJJT0RTCShTTUFfRFVSIC8gTUFfUEVSSU9EKQotI2RlZmluZQkJRU1BX05QRVJJT0RTCShFTUFfRFVSIC8gTUFfUEVSSU9EKQotCi0vKgotICogRGVmaW5lIGEgbG9jYWwgZGVmYXVsdCB0ZXJtaW9zIHN0cnVjdC4gQWxsIHBvcnRzIHdpbGwgYmUgY3JlYXRlZAotICogd2l0aCB0aGlzIHRlcm1pb3MgaW5pdGlhbGx5LiAgVGhpcyBpcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgdGhhdCBpcyBkZWZpbmVkCi0gKiBhcyB0aGUgZGVmYXVsdCBpbiB0dHlfaW8uYyB3aXRoIHRoZSBzYW1lIHNldHRpbmdzIG92ZXJyaWRlbiBhcyBpbiBzZXJpYWwuYwotICoKLSAqIEluIHNob3J0LCB0aGlzIHNob3VsZCBtYXRjaCB0aGUgaW50ZXJuYWwgc2VyaWFsIHBvcnRzJyBkZWZhdWx0cy4KLSAqLwotI2RlZmluZQlERUZBVUxUX0lGTEFHUwkoSUNSTkwgfCBJWE9OKQotI2RlZmluZQlERUZBVUxUX09GTEFHUwkoT1BPU1QgfCBPTkxDUikKLSNkZWZpbmUJREVGQVVMVF9DRkxBR1MJKEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTCkKLSNkZWZpbmUJREVGQVVMVF9MRkxBR1MJKElTSUcgfCBJQ0FOT04gfCBFQ0hPIHwgRUNIT0UgfCBFQ0hPSyB8IFwKLQkJCUVDSE9DVEwgfCBFQ0hPS0UgfCBJRVhURU4pCi0KLSNpZm5kZWYgX1BPU0lYX1ZESVNBQkxFCi0jZGVmaW5lICAgX1BPU0lYX1ZESVNBQkxFICdcMCcKLSNlbmRpZgotCi0jZGVmaW5lIFNOSUZGX01BWAk2NTUzNgkJLyogU25pZmYgYnVmZmVyIHNpemUgKDJebikgKi8KLSNkZWZpbmUgU05JRkZfTUFTSwkoU05JRkZfTUFYIC0gMSkJLyogU25pZmYgd3JhcCBtYXNrICovCi0KLSNkZWZpbmUgVlBEU0laRSAoNTEyKQotCi0vKgotICogTG9jayBmdW5jdGlvbi9kZWZpbmVzLgotICogTWFrZXMgc3BvdHRpbmcgbG9jay91bmxvY2sgbG9jYXRpb25zIGVhc2llci4KLSAqLwotIyBkZWZpbmUgREdBUF9TUElOTE9DS19JTklUKHgpCQlzcGluX2xvY2tfaW5pdCgmKHgpKQotIyBkZWZpbmUgREdBUF9MT0NLKHgseSkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmKHgpLCB5KQotIyBkZWZpbmUgREdBUF9VTkxPQ0soeCx5KQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHgpLCB5KQotIyBkZWZpbmUgREdBUF9UUllMT0NLKHgseSkJCXNwaW5fdHJ5bG9jaygmKHgpKQotCi0vKgotICogQWxsIHRoZSBwb3NzaWJsZSBzdGF0ZXMgdGhlIGRyaXZlciBjYW4gYmUgd2hpbGUgYmVpbmcgbG9hZGVkLgotICovCi1lbnVtIHsKLQlEUklWRVJfSU5JVElBTElaRUQgPSAwLAotCURSSVZFUl9ORUVEX0NPTkZJR19MT0FELAotCURSSVZFUl9SRVFVRVNURURfQ09ORklHLAotCURSSVZFUl9SRUFEWQotfTsKLQotLyoKLSAqIEFsbCB0aGUgcG9zc2libGUgc3RhdGVzIHRoZSBib2FyZCBjYW4gYmUgd2hpbGUgYm9vdGluZyB1cC4KLSAqLwotZW51bSB7Ci0JQk9BUkRfRkFJTEVEID0gMCwKLQlDT05GSUdfTk9UX0ZPVU5ELAotCUJPQVJEX0ZPVU5ELAotCU5FRURfUkVTRVQsCi0JRklOSVNIRURfUkVTRVQsCi0JTkVFRF9DT05GSUcsCi0JRklOSVNIRURfQ09ORklHLAotCU5FRURfREVWSUNFX0NSRUFUSU9OLAotCVJFUVVFU1RFRF9ERVZJQ0VfQ1JFQVRJT04sCi0JRklOSVNIRURfREVWSUNFX0NSRUFUSU9OLAotCU5FRURfQklPU19MT0FELAotCVJFUVVFU1RFRF9CSU9TLAotCVdBSVRfQklPU19MT0FELAotCUZJTklTSEVEX0JJT1NfTE9BRCwKLQlORUVEX0ZFUF9MT0FELAotCVJFUVVFU1RFRF9GRVAsCi0JV0FJVF9GRVBfTE9BRCwKLQlGSU5JU0hFRF9GRVBfTE9BRCwKLQlORUVEX1BST0NfQ1JFQVRJT04sCi0JRklOSVNIRURfUFJPQ19DUkVBVElPTiwKLQlCT0FSRF9SRUFEWQotfTsKLQotLyoKLSAqIEFsbCB0aGUgcG9zc2libGUgc3RhdGVzIHRoYXQgYSByZXF1ZXN0ZWQgY29uY2VudHJhdG9yIGltYWdlIGNhbiBiZSBpbi4KLSAqLwotZW51bSB7Ci0JTk9fUEVORElOR19DT05DRU5UUkFUT1JfUkVRVUVTVFMgPSAwLAotCU5FRURfQ09OQ0VOVFJBVE9SLAotCVJFUVVFU1RFRF9DT05DRU5UUkFUT1IKLX07Ci0KLWV4dGVybiBjaGFyICpkZ2FwX3N0YXRlX3RleHRbXTsKLWV4dGVybiBjaGFyICpkZ2FwX2RyaXZlcl9zdGF0ZV90ZXh0W107Ci0KLQotLyogCi0gKiBNb2RlbSBsaW5lIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBhcyBtYWNyb3MgYmVjYXVzZSBEU1IgYW5kCi0gKiBEQ0QgYXJlIHN3YXBhYmxlIHVzaW5nIHRoZSBkaXR0eSBhbHRwaW4gb3B0aW9uLgotICovCi0jZGVmaW5lIERfQ0QoY2gpICAgICAgICBjaC0+Y2hfY2QgICAgICAgLyogQ2FycmllciBkZXRlY3QgICAgICAgKi8KLSNkZWZpbmUgRF9EU1IoY2gpICAgICAgIGNoLT5jaF9kc3IgICAgICAvKiBEYXRhIHNldCByZWFkeSAgICAgICAqLwotI2RlZmluZSBEX1JUUyhjaCkgICAgICAgRE1fUlRTICAgICAgICAgIC8qIFJlcXVlc3QgdG8gc2VuZCAgICAgICovCi0jZGVmaW5lIERfQ1RTKGNoKSAgICAgICBETV9DVFMgICAgICAgICAgLyogQ2xlYXIgdG8gc2VuZCAgICAgICAgKi8KLSNkZWZpbmUgRF9SSShjaCkgICAgICAgIERNX1JJICAgICAgICAgICAvKiBSaW5nIGluZGljYXRvciAgICAgICAqLwotI2RlZmluZSBEX0RUUihjaCkgICAgICAgRE1fRFRSICAgICAgICAgIC8qIERhdGEgdGVybWluYWwgcmVhZHkgICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBTdHJ1Y3R1cmVzIGFuZCBjbG9zZWx5IHJlbGF0ZWQgZGVmaW5lcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKgotICogQSBzdHJ1Y3R1cmUgdG8gaG9sZCBhIHN0YXRpc3RpY3MgY291bnRlci4gIFdlIGFsc28KLSAqIGNvbXB1dGUgbW92aW5nIGF2ZXJhZ2VzIGZvciB0aGlzIGNvdW50ZXIuCi0gKi8KLXN0cnVjdCBtYWNvdW50ZXIKLXsKLQl1MzIJCWNudDsJLyogVG90YWwgY291bnQgKi8KLQl1bG9uZwkJYWNjdW07CS8qIEFjdXVtdWxhdG9yIHBlciBwZXJpb2QgKi8KLQl1bG9uZwkJc21hOwkvKiBTaW1wbGUgbW92aW5nIGF2ZXJhZ2UgKi8KLQl1bG9uZwkJZW1hOwkvKiBFeHBvbmVudGlhbCBtb3ZpbmcgYXZlcmFnZSAqLwotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogRGV2aWNlIGZsYWcgZGVmaW5pdGlvbnMgZm9yIGJkX2ZsYWdzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUJQkRfRkVQNVBMVVMJMHgwMDAxICAgICAgICAgIC8qIFN1cHBvcnRzIEZFUDUgUGx1cyBjb21tYW5kcyAqLwotI2RlZmluZSBCRF9IQVNfVlBECTB4MDAwMgkJLyogQm9hcmQgaGFzIFZQRCBpbmZvIGF2YWlsYWJsZSAqLwotCi0KLS8qCi0gKglQZXItYm9hcmQgaW5mb3JtYXRpb24KLSAqLwotc3RydWN0IGJvYXJkX3QKLXsKLQlpbnQJCW1hZ2ljOwkJLyogQm9hcmQgTWFnaWMgbnVtYmVyLiAgKi8KLQlpbnQJCWJvYXJkbnVtOwkvKiBCb2FyZCBudW1iZXI6IDAtMyAqLwotCWludAkJZmlyc3RtaW5vcjsJLyogRmlyc3QgbWlub3IsIGUuZy4gMCwgMzAsIDYwICovCi0KLQlpbnQJCXR5cGU7CQkvKiBUeXBlIG9mIGJvYXJkICovCi0JY2hhcgkJKm5hbWU7CQkvKiBQcm9kdWN0IE5hbWUgKi8KLQlzdHJ1Y3QgcGNpX2RldgkqcGRldjsJCS8qIFBvaW50ZXIgdG8gdGhlIHBjaV9kZXYgc3RydWN0ICovIAotCXUxNgkJdmVuZG9yOwkJLyogUENJIHZlbmRvciBJRCAqLwotCXUxNgkJZGV2aWNlOwkJLyogUENJIGRldmljZSBJRCAqLwotCXUxNgkJc3VidmVuZG9yOwkvKiBQQ0kgc3Vic3lzdGVtIHZlbmRvciBJRCAqLwotCXUxNgkJc3ViZGV2aWNlOwkvKiBQQ0kgc3Vic3lzdGVtIGRldmljZSBJRCAqLwotCXVjaGFyCQlyZXY7CQkvKiBQQ0kgcmV2aXNpb24gSUQgKi8KLQl1aW50CQlwY2lfYnVzOwkvKiBQQ0kgYnVzIHZhbHVlICovCi0JdWludAkJcGNpX3Nsb3Q7CS8qIFBDSSBzbG90IHZhbHVlICovCi0JdTE2CQltYXhwb3J0czsJLyogTUFYIHBvcnRzIHRoaXMgYm9hcmQgY2FuIGhhbmRsZSAqLwotCXVjaGFyCQl2cGRbVlBEU0laRV07CS8qIFZQRCBvZiBib2FyZCwgaWYgZm91bmQgKi8KLQl1MzIJCWJkX2ZsYWdzOwkvKiBCb2FyZCBmbGFncyAqLwotCi0Jc3BpbmxvY2tfdAliZF9sb2NrOwkvKiBVc2VkIHRvIHByb3RlY3QgYm9hcmQgKi8KLQotCXUzMgkJc3RhdGU7CQkvKiBTdGF0ZSBvZiBjYXJkLiAqLwotCXdhaXRfcXVldWVfaGVhZF90IHN0YXRlX3dhaXQ7CS8qIFBsYWNlIHRvIHNsZWVwIG9uIGZvciBzdGF0ZSBjaGFuZ2UgKi8KLQotCXN0cnVjdAkJdGFza2xldF9zdHJ1Y3QgaGVscGVyX3Rhc2tsZXQ7IC8qIFBvbGwgaGVscGVyIHRhc2tsZXQgKi8KLQotCXUzMgkJd2FpdF9mb3JfYmlvczsKLQl1MzIJCXdhaXRfZm9yX2ZlcDsKLQotCXN0cnVjdCBjbm9kZSAqICBiZF9jb25maWc7CS8qIENvbmZpZyBvZiBib2FyZCAqLwotCi0JdTE2CQluYXN5bmM7CQkvKiBOdW1iZXIgb2YgcG9ydHMgb24gY2FyZCAqLwotCi0JdTMyCQl1c2VfaW50ZXJydXB0czsJLyogU2hvdWxkIHdlIGJlIGludGVycnVwdCBkcml2ZW4/ICovCi0JdWxvbmcJCWlycTsJCS8qIEludGVycnVwdCByZXF1ZXN0IG51bWJlciAqLwotCXVsb25nCQlpbnRyX2NvdW50OwkvKiBDb3VudCBvZiBpbnRlcnJ1cHRzICovCi0JdTMyCQlpbnRyX3VzZWQ7CS8qIE5vbi16ZXJvIGlmIHVzaW5nIGludGVycnVwdHMgKi8KLQl1MzIJCWludHJfcnVubmluZzsJLyogTm9uLXplcm8gaWYgRkVQIGtub3dzIGl0cyBkb2luZyBpbnRlcnJ1cHRzICovCi0KLQl1bG9uZwkJcG9ydDsJCS8qIFN0YXJ0IG9mIGJhc2UgaW8gcG9ydCBvZiB0aGUgY2FyZCAqLwotCXVsb25nCQlwb3J0X2VuZDsJLyogRW5kIG9mIGJhc2UgaW8gcG9ydCBvZiB0aGUgY2FyZCAqLwotCXVsb25nCQltZW1iYXNlOwkvKiBTdGFydCBvZiBiYXNlIG1lbW9yeSBvZiB0aGUgY2FyZCAqLwotCXVsb25nCQltZW1iYXNlX2VuZDsJLyogRW5kIG9mIGJhc2UgbWVtb3J5IG9mIHRoZSBjYXJkICovCi0KLQl1Y2hhciAJCSpyZV9tYXBfcG9ydDsJLyogUmVtYXBwZWQgaW8gcG9ydCBvZiB0aGUgY2FyZCAqLwotCXVjaGFyCQkqcmVfbWFwX21lbWJhc2U7LyogUmVtYXBwZWQgbWVtb3J5IG9mIHRoZSBjYXJkICovCi0KLQl1Y2hhcgkJcnVud2FpdDsJLyogIyBQcm9jZXNzZXMgd2FpdGluZyBmb3IgRkVQICAqLwotCXVjaGFyCQlpbmhpYml0X3BvbGxlcjsgLyogVGVsbHMgIHRoZSBwb2xsZXIgdG8gbGVhdmUgdXMgYWxvbmUgKi8KLQotCXN0cnVjdCBjaGFubmVsX3QgKmNoYW5uZWxzW01BWFBPUlRTXTsgLyogYXJyYXkgb2YgcG9pbnRlcnMgdG8gb3VyIGNoYW5uZWxzLiAqLwotCi0Jc3RydWN0IHR0eV9kcml2ZXIJKlNlcmlhbERyaXZlcjsKLQljaGFyCQlTZXJpYWxOYW1lWzIwMF07Ci0Jc3RydWN0IHR0eV9kcml2ZXIJKlByaW50RHJpdmVyOwotCWNoYXIJCVByaW50TmFtZVsyMDBdOwotCi0JdTMyCQlkZ2FwX01ham9yX1NlcmlhbF9SZWdpc3RlcmVkOwotCXUzMgkJZGdhcF9NYWpvcl9UcmFuc3BhcmVudFByaW50X1JlZ2lzdGVyZWQ7Ci0KLQl1MzIJCWRnYXBfU2VyaWFsX01ham9yOwotCXUzMgkJZGdhcF9UcmFuc3BhcmVudFByaW50X01ham9yOwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI4KQotCXUzMgkJVHR5UmVmQ250OwotI2VuZGlmCi0KLQlzdHJ1Y3QgYnNfdAkqYmRfYnM7CQkJLyogQmFzZSBzdHJ1Y3R1cmUgcG9pbnRlciAgICAgICAqLwotCi0JY2hhcgkqZmxpcGJ1ZjsJCS8qIE91ciBmbGlwIGJ1ZmZlciwgYWxsb2NlZCBpZiBib2FyZCBpcyBmb3VuZCAqLwotCWNoYXIJKmZsaXBmbGFnYnVmOwkJLyogT3VyIGZsaXAgZmxhZyBidWZmZXIsIGFsbG9jZWQgaWYgYm9hcmQgaXMgZm91bmQgKi8KLQotCXUxNgkJZHBhdHlwZTsJLyogVGhlIGJvYXJkICJ0eXBlIiwgYXMgZGVmaW5lZCBieSBEUEEgKi8KLQl1MTYJCWRwYXN0YXR1czsJLyogVGhlIGJvYXJkICJzdGF0dXMiLCBhcyBkZWZpbmVkIGJ5IERQQSAqLwotCXdhaXRfcXVldWVfaGVhZF90IGttZV93YWl0OwkvKiBOZWVkZWQgZm9yIERQQSBzdXBwb3J0ICovCi0KLQl1MzIJCWNvbmNfZGxfc3RhdHVzOwkvKiBTdGF0dXMgb2YgYW55IHBlbmRpbmcgY29uYyBkb3dubG9hZCAqLwotCS8qCi0JICoJTWdtdCBkYXRhLgotCSAqLwotICAgICAgICBjaGFyCQkqbXNnYnVmX2hlYWQ7Ci0gICAgICAgIGNoYXIJCSptc2didWY7Ci19OwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIFVuaXQgZmxhZyBkZWZpbml0aW9ucyBmb3IgdW5fZmxhZ3MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBVTl9JU09QRU4JMHgwMDAxCQkvKiBEZXZpY2UgaXMgb3BlbgkJKi8KLSNkZWZpbmUgVU5fQ0xPU0lORwkweDAwMDIJCS8qIExpbmUgaXMgYmVpbmcgY2xvc2VkCQkqLwotI2RlZmluZSBVTl9JTU0JCTB4MDAwNAkJLyogU2VydmljZSBpbW1lZGlhdGVseQkJKi8KLSNkZWZpbmUgVU5fQlVTWQkJMHgwMDA4CQkvKiBTb21lIHdvcmsgdGhpcyBjaGFubmVsCSovCi0jZGVmaW5lIFVOX0JSRUFLSQkweDAwMTAJCS8qIElucHV0IGJyZWFrIHJlY2VpdmVkCQkqLwotI2RlZmluZSBVTl9QV0FJVAkweDAwMjAJCS8qIFByaW50ZXIgd2FpdGluZyBmb3IgdGVybWluYWwJKi8KLSNkZWZpbmUgVU5fVElNRQkJMHgwMDQwCQkvKiBXYWl0aW5nIG9uIHRpbWUJCSovCi0jZGVmaW5lIFVOX0VNUFRZCTB4MDA4MAkJLyogV2FpdGluZyBvdXRwdXQgcXVldWUgZW1wdHkJKi8KLSNkZWZpbmUgVU5fTE9XCQkweDAxMDAJCS8qIFdhaXRpbmcgb3V0cHV0IGxvdyB3YXRlciBtYXJrKi8KLSNkZWZpbmUgVU5fRVhDTF9PUEVOCTB4MDIwMAkJLyogT3BlbiBmb3IgZXhjbHVzaXZlIHVzZQkqLwotI2RlZmluZSBVTl9XT1BFTgkweDA0MDAJCS8qIERldmljZSB3YWl0aW5nIGZvciBvcGVuCSovCi0jZGVmaW5lIFVOX1dJT0NUTAkweDA4MDAJCS8qIERldmljZSB3YWl0aW5nIGZvciBvcGVuCSovCi0jZGVmaW5lIFVOX0hBTkdVUAkweDgwMDAJCS8qIENhcnJpZXIgbG9zdAkJCSovCi0KLXN0cnVjdCBkZXZpY2U7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFN0cnVjdHVyZSBmb3IgdGVybWluYWwgb3IgcHJpbnRlciB1bml0LiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgdW5fdCB7Ci0JaW50CW1hZ2ljOwkJLyogVW5pdCBNYWdpYyBOdW1iZXIuCQkJKi8KLQlzdHJ1Y3QJY2hhbm5lbF90ICp1bl9jaDsKLQl1MzIJdW5fdGltZTsKLQl1MzIJdW5fdHlwZTsKLQl1MzIJdW5fb3Blbl9jb3VudDsJLyogQ291bnRlciBvZiBvcGVucyB0byBwb3J0CQkqLwotCXN0cnVjdCB0dHlfc3RydWN0ICp1bl90dHk7LyogUG9pbnRlciB0byB1bml0IHR0eSBzdHJ1Y3R1cmUJKi8KLQl1MzIJdW5fZmxhZ3M7CS8qIFVuaXQgZmxhZ3MJCQkJKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCB1bl9mbGFnc193YWl0OyAvKiBQbGFjZSB0byBzbGVlcCB0byB3YWl0IG9uIHVuaXQgKi8KLQl1MzIJdW5fZGV2OwkJLyogTWlub3IgZGV2aWNlIG51bWJlcgkJCSovCi0JdGNmbGFnX3QgdW5fb2ZsYWc7CS8qIG9mbGFncyBiZWluZyBkb25lIG9uIGJvYXJkCQkqLwotCXRjZmxhZ190IHVuX2xmbGFnOwkvKiBsZmxhZ3MgYmVpbmcgZG9uZSBvbiBib2FyZAkJKi8KLQlzdHJ1Y3QgZGV2aWNlICp1bl9zeXNmczsKLX07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIERldmljZSBmbGFnIGRlZmluaXRpb25zIGZvciBjaF9mbGFncy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIENIX1BST04gICAgICAgICAweDAwMDEgICAgICAgICAgLyogUHJpbnRlciBvbiBzdHJpbmcgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0hfT1VUICAgICAgICAgIDB4MDAwMiAgICAgICAgICAvKiBEaWFsLW91dCBkZXZpY2Ugb3BlbiAgICAgICAgICAgICAqLwotI2RlZmluZSBDSF9TVE9QICAgICAgICAgMHgwMDA0ICAgICAgICAgIC8qIE91dHB1dCBpcyBzdG9wcGVkICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENIX1NUT1BJICAgICAgICAweDAwMDggICAgICAgICAgLyogSW5wdXQgaXMgc3RvcHBlZCAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0hfQ0QgICAgICAgICAgIDB4MDAxMCAgICAgICAgICAvKiBDYXJyaWVyIGlzIHByZXNlbnQgICAgICAgICAgICAgICAqLwotI2RlZmluZSBDSF9GQ0FSICAgICAgICAgMHgwMDIwICAgICAgICAgIC8qIENhcnJpZXIgZm9yY2VkIG9uICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgQ0hfUlhCTE9DSyAgICAgIDB4MDA4MCAgICAgICAgICAvKiBFbmFibGUgcnggYmxvY2tlZCBmbGFnICAgICAgICAgICAqLwotI2RlZmluZSBDSF9XTE9XICAgICAgICAgMHgwMTAwICAgICAgICAgIC8qIFRlcm0gd2FpdGluZyBsb3cgZXZlbnQgICAgICAgICAgICovCi0jZGVmaW5lIENIX1dFTVBUWSAgICAgICAweDAyMDAgICAgICAgICAgLyogVGVybSB3YWl0aW5nIGVtcHR5IGV2ZW50ICAgICAgICAgKi8KLSNkZWZpbmUgQ0hfUkVOQUJMRSAgICAgIDB4MDQwMCAgICAgICAgICAvKiBCdWZmZXIganVzdCBlbXB0aWVkICAgICAgICAgICovCi0jZGVmaW5lIENIX1JBQ1RJVkUgICAgICAweDA4MDAgICAgICAgICAgLyogUHJvY2VzcyBhY3RpdmUgaW4geHhyZWFkKCkgICAqLwotI2RlZmluZSBDSF9SV0FJVCAgICAgICAgMHgxMDAwICAgICAgICAgIC8qIFByb2Nlc3Mgd2FpdGluZyBpbiB4eHJlYWQoKSAgKi8KLSNkZWZpbmUgQ0hfQkFVRDAJMHgyMDAwCQkvKiBVc2VkIGZvciBjaGVja2luZyBCMCB0cmFuc2l0aW9ucyAqLwotI2RlZmluZSBDSF9IQU5HVVAgICAgICAgMHg4MDAwCQkvKiBIYW5ndXAgcmVjZWl2ZWQgICAgICAgICAgICAgICAgICAqLwotCi0vKgotICogRGVmaW5pdGlvbnMgZm9yIGNoX3NuaWZmX2ZsYWdzCi0gKi8KLSNkZWZpbmUgU05JRkZfT1BFTgkweDEKLSNkZWZpbmUgU05JRkZfV0FJVF9EQVRBCTB4MgotI2RlZmluZSBTTklGRl9XQUlUX1NQQUNFIDB4NAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBDaGFubmVsIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgY2hhbm5lbF90IHsKLQlpbnQgbWFnaWM7CQkJLyogQ2hhbm5lbCBNYWdpYyBOdW1iZXIJCSovCi0Jc3RydWN0IGJzX3QJKmNoX2JzOwkJLyogQmFzZSBzdHJ1Y3R1cmUgcG9pbnRlciAgICAgICAqLwotCXN0cnVjdCBjbV90CSpjaF9jbTsJCS8qIENvbW1hbmQgcXVldWUgcG9pbnRlciAgICAgICAgKi8KLQlzdHJ1Y3QgYm9hcmRfdCAqY2hfYmQ7CQkvKiBCb2FyZCBzdHJ1Y3R1cmUgcG9pbnRlciAgICAgICovCi0JdW5zaWduZWQgY2hhciAqY2hfdmFkZHI7CS8qIEZFUCBtZW1vcnkgb3JpZ2luICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBjaGFyICpjaF90YWRkcjsJLyogV3JpdGUgYnVmZmVyIG9yaWdpbiAgICAgICAgICAqLwotCXVuc2lnbmVkIGNoYXIgKmNoX3JhZGRyOwkvKiBSZWFkIGJ1ZmZlciBvcmlnaW4gICAgICAgICAgICovCi0Jc3RydWN0IGRpZ2lfdCAgY2hfZGlnaTsJCS8qIFRyYW5zcGFyZW50IFByaW50IHN0cnVjdHVyZSAgKi8KLQlzdHJ1Y3QgdW5fdCBjaF90dW47CQkvKiBUZXJtaW5hbCB1bml0IGluZm8gICAgICAgICAgICovCi0Jc3RydWN0IHVuX3QgY2hfcHVuOwkJLyogUHJpbnRlciB1bml0IGluZm8gICAgICAgICAgICAqLwotCi0Jc3BpbmxvY2tfdAljaF9sb2NrOwkvKiBwcm92aWRlIGZvciBzZXJpYWxpemF0aW9uICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QgY2hfZmxhZ3Nfd2FpdDsKLQotCXUzMglwc2Nhbl9zdGF0ZTsKLQl1Y2hhcglwc2Nhbl9zYXZlY2hhcjsKLQotCXUzMiBjaF9wb3J0bnVtOwkJCS8qIFBvcnQgbnVtYmVyLCAwIG9mZnNldC4JKi8KLQl1MzIgY2hfb3Blbl9jb3VudDsJCS8qIG9wZW4gY291bnQJCQkqLwotCXUzMgljaF9mbGFnczsJCS8qIENoYW5uZWwgZmxhZ3MgICAgICAgICAgICAgICAgKi8KLQotCi0JdTMyCWNoX2Nsb3NlX2RlbGF5OwkJLyogSG93IGxvbmcgd2Ugc2hvdWxkIGRyb3AgUlRTL0RUUiBmb3IgKi8KLQotCXUzMgljaF9jcHN0aW1lOwkJLyogVGltZSBmb3IgQ1BTIGNhbGN1bGF0aW9ucyAgICAqLwotCi0JdGNmbGFnX3QgY2hfY19pZmxhZzsJCS8qIGNoYW5uZWwgaWZsYWdzICAgICAgICAgICAgICAgKi8KLQl0Y2ZsYWdfdCBjaF9jX2NmbGFnOwkJLyogY2hhbm5lbCBjZmxhZ3MgICAgICAgICAgICAgICAqLwotCXRjZmxhZ190IGNoX2Nfb2ZsYWc7CQkvKiBjaGFubmVsIG9mbGFncyAgICAgICAgICAgICAgICovCi0JdGNmbGFnX3QgY2hfY19sZmxhZzsJCS8qIGNoYW5uZWwgbGZsYWdzICAgICAgICAgICAgICAgKi8KLQotCXUxNiAgY2hfZmVwaWZsYWc7ICAgICAgICAgICAgLyogRkVQIHR0eSBpZmxhZ3MgICAgICAgICAgICAgICAqLwotCXUxNiAgY2hfZmVwY2ZsYWc7CQkvKiBGRVAgdHR5IGNmbGFncyAgICAgICAgICAgICAgICovCi0JdTE2ICBjaF9mZXBvZmxhZzsJCS8qIEZFUCB0dHkgb2ZsYWdzICAgICAgICAgICAgICAgKi8KLQl1MTYgIGNoX3dvcGVuOwkJCS8qIFdhaXRpbmcgZm9yIG9wZW4gcHJvY2VzcyBjbnQgKi8KLQl1MTYgIGNoX3RzdGFydDsJCQkvKiBUcmFuc21pdCBidWZmZXIgc3RhcnQgICAgICAgICovCi0JdTE2ICBjaF90c2l6ZTsJCQkvKiBUcmFuc21pdCBidWZmZXIgc2l6ZSAgICAgICAgICovCi0JdTE2ICBjaF9yc3RhcnQ7CQkJLyogUmVjZWl2ZSBidWZmZXIgc3RhcnQgICAgICAgICAqLwotCXUxNiAgY2hfcnNpemU7CQkJLyogUmVjZWl2ZSBidWZmZXIgc2l6ZSAgICAgICAgICAqLwotCXUxNiAgY2hfcmRlbGF5OwkJCS8qIFJlY2VpdmUgZGVsYXkgdGltZSAgICAgICAgICAgKi8KLQotCXUxNgljaF90bHc7CQkJLyogT3VyIGN1cnJlbnRseSBzZXQgbG93IHdhdGVyIG1hcmsgKi8KLQotCXUxNiAgY2hfY29vazsJCQkvKiBPdXRwdXQgY2hhcmFjdGVyIG1hc2sgICAgICAgICovCi0KLQl1Y2hhciAgIGNoX2NhcmQ7CQkvKiBDYXJkIGNoYW5uZWwgaXMgb24gICAgICAgICAgICovCi0JdWNoYXIgICBjaF9zdG9wYzsJCS8qIFN0b3AgY2hhcmFjdGVyICAgICAgICAgICAgICAgKi8KLQl1Y2hhciAgIGNoX3N0YXJ0YzsJCS8qIFN0YXJ0IGNoYXJhY3RlciAgICAgICAgICAgICAgKi8KLQotCXVjaGFyICAgY2hfbW9zdGF0OwkJLyogRkVQIG91dHB1dCBtb2RlbSBzdGF0dXMgICAgICAqLwotCXVjaGFyICAgY2hfbWlzdGF0OwkJLyogRkVQIGlucHV0IG1vZGVtIHN0YXR1cyAgICAgICAqLwotCXVjaGFyICAgY2hfbWZvcmNlOwkJLyogTW9kZW0gdmFsdWVzIHRvIGJlIGZvcmNlZCAgICAqLwotCXVjaGFyICAgY2hfbXZhbDsJCS8qIEZvcmNlIHZhbHVlcyAgICAgICAgICAgICAgICAgKi8KLQl1Y2hhciAgIGNoX2ZlcHN0b3BjOwkJLyogRkVQIHN0b3AgY2hhcmFjdGVyICAgICAgICAgICAqLwotCXVjaGFyICAgY2hfZmVwc3RhcnRjOwkJLyogRkVQIHN0YXJ0IGNoYXJhY3RlciAgICAgICAgICAqLwotCi0JdWNoYXIgICBjaF9hc3RvcGM7CQkvKiBBdXhpbGlhcnkgU3RvcCBjaGFyYWN0ZXIgICAgICovCi0JdWNoYXIgICBjaF9hc3RhcnRjOwkJLyogQXV4aWxpYXJ5IFN0YXJ0IGNoYXJhY3RlciAgICAqLwotCXVjaGFyICAgY2hfZmVwYXN0b3BjOwkJLyogQXV4aWxpYXJ5IEZFUCBzdG9wIGNoYXIgICAgICAqLwotCXVjaGFyICAgY2hfZmVwYXN0YXJ0YzsJCS8qIEF1eGlsaWFyeSBGRVAgc3RhcnQgY2hhciAgICAgKi8KLQotCXVjaGFyICAgY2hfaGZsb3c7CQkvKiBGRVAgaGFyZHdhcmUgaGFuZHNoYWtlICAgICAgICovCi0JdWNoYXIgICBjaF9kc3I7CQkJLyogc3RvcmVzIHJlYWwgZHNyIHZhbHVlICAgICAgICAqLwotCXVjaGFyICAgY2hfY2Q7CQkJLyogc3RvcmVzIHJlYWwgY2QgdmFsdWUgICAgICAgICAqLwotCXVjaGFyICAgY2hfdHhfd2luOwkJLyogY2hhbm5lbCB0eCBidWZmZXIgd2luZG93ICAgICAqLwotCXVjaGFyICAgY2hfcnhfd2luOwkJLyogY2hhbm5lbCByeCBidWZmZXIgd2luZG93ICAgICAqLwotCXVpbnQJY2hfY3VzdG9tX3NwZWVkOwkvKiBDdXN0b20gYmF1ZCwgaWYgc2V0CQkqLwotCXVpbnQJY2hfYmF1ZF9pbmZvOwkJLyogQ3VycmVudCBiYXVkIGluZm8gZm9yIC9wcm9jIG91dHB1dAkqLwotCXVsb25nCWNoX3J4Y291bnQ7CQkvKiB0b3RhbCBvZiBkYXRhIHJlY2VpdmVkIHNvIGZhcgkqLwotCXVsb25nCWNoX3R4Y291bnQ7CQkvKiB0b3RhbCBvZiBkYXRhIHRyYW5zbWl0dGVkIHNvIGZhcgkqLwotCXVsb25nCWNoX2Vycl9wYXJpdHk7CQkvKiBDb3VudCBvZiBwYXJpdHkgZXJyb3JzIG9uIGNoYW5uZWwJKi8KLQl1bG9uZwljaF9lcnJfZnJhbWU7CQkvKiBDb3VudCBvZiBmcmFtaW5nIGVycm9ycyBvbiBjaGFubmVsCSovCi0JdWxvbmcJY2hfZXJyX2JyZWFrOwkJLyogQ291bnQgb2YgYnJlYWtzIG9uIGNoYW5uZWwJKi8KLQl1bG9uZwljaF9lcnJfb3ZlcnJ1bjsJCS8qIENvdW50IG9mIG92ZXJydW5zIG9uIGNoYW5uZWwJKi8KLQotCXVpbnQgY2hfc25pZmZfaW47Ci0JdWludCBjaF9zbmlmZl9vdXQ7Ci0JY2hhciAqY2hfc25pZmZfYnVmOwkJLyogU25pZmYgYnVmZmVyIGZvciBwcm9jICovCi0JdWxvbmcgY2hfc25pZmZfZmxhZ3M7CQkvKiBDaGFubmVsIGZsYWdzICAgICAgICAgICAgICAgICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QgY2hfc25pZmZfd2FpdDsKLX07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBQcm90b3R5cGVzIGZvciBub24tc3RhdGljIGZ1bmN0aW9ucyB1c2VkIGluIG1vcmUgdGhhbiBvbmUgbW9kdWxlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWV4dGVybiBpbnQJCWRnYXBfbXNfc2xlZXAodWxvbmcgbXMpOwotZXh0ZXJuIGNoYXIJCSpkZ2FwX2lvY3RsX25hbWUoaW50IGNtZCk7Ci1leHRlcm4gdm9pZAkJZGdhcF9kb19iaW9zX2xvYWQoc3RydWN0IGJvYXJkX3QgKmJyZCwgdWNoYXIgX191c2VyICp1YmlvcywgaW50IGxlbik7Ci1leHRlcm4gdm9pZAkJZGdhcF9kb19mZXBfbG9hZChzdHJ1Y3QgYm9hcmRfdCAqYnJkLCB1Y2hhciBfX3VzZXIgKnVmZXAsIGludCBsZW4pOwotZXh0ZXJuIHZvaWQJCWRnYXBfZG9fY29uY19sb2FkKHN0cnVjdCBib2FyZF90ICpicmQsIHVjaGFyICp1YWRkciwgaW50IGxlbik7Ci1leHRlcm4gdm9pZAkJZGdhcF9kb19jb25maWdfbG9hZCh1Y2hhciBfX3VzZXIgKnVhZGRyLCBpbnQgbGVuKTsKLWV4dGVybiBpbnQJCWRnYXBfYWZ0ZXJfY29uZmlnX2xvYWRlZCh2b2lkKTsKLWV4dGVybiBpbnQJCWRnYXBfZmluYWxpemVfYm9hcmRfaW5pdChzdHJ1Y3QgYm9hcmRfdCAqYnJkKTsKLQotLyoKLSAqIE91ciBHbG9iYWwgVmFyaWFibGVzLgotICovCi1leHRlcm4gaW50CQlkZ2FwX2RyaXZlcl9zdGF0ZTsJLyogVGhlIHN0YXRlIG9mIHRoZSBkcml2ZXIJKi8KLWV4dGVybiBpbnQJCWRnYXBfZGVidWc7CQkvKiBEZWJ1ZyB2YXJpYWJsZQkJKi8KLWV4dGVybiBpbnQJCWRnYXBfcmF3cmVhZG9rOwkJLyogU2V0IGlmIHVzZXIgd2FudHMgcmF3cmVhZHMJKi8KLWV4dGVybiBpbnQJCWRnYXBfcG9sbF90aWNrOwkJLyogUG9sbCBpbnRlcnZhbCAtIDIwIG1zCSovCi1leHRlcm4gc3BpbmxvY2tfdAlkZ2FwX2dsb2JhbF9sb2NrOwkvKiBEcml2ZXIgZ2xvYmFsIHNwaW5sb2NrCSovCi1leHRlcm4gdWludAkJZGdhcF9OdW1Cb2FyZHM7CQkvKiBUb3RhbCBudW1iZXIgb2YgYm9hcmRzCSovCi1leHRlcm4gc3RydWN0IGJvYXJkX3QJKmRnYXBfQm9hcmRbTUFYQk9BUkRTXTsJLyogQXJyYXkgb2YgYm9hcmQgc3RydWN0cwkqLwotZXh0ZXJuIHVsb25nCQlkZ2FwX3BvbGxfY291bnRlcjsJLyogVGltZXMgdGhlIHBvbGxlciBoYXMgcnVuCSovCi1leHRlcm4gY2hhcgkJKmRnYXBfY29uZmlnX2J1ZjsJLyogVGhlIGNvbmZpZyBmaWxlIGJ1ZmZlcgkqLwotZXh0ZXJuIHNwaW5sb2NrX3QJZGdhcF9kbF9sb2NrOwkJLyogRG93bmxvYWRlciBzcGlubG9jawkJKi8KLWV4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdCBkZ2FwX2RsX3dhaXQ7CQkvKiBXYWl0IHF1ZXVlIGZvciBkb3dubG9hZGVyCSovCi1leHRlcm4gaW50CQlkZ2FwX2RsX2FjdGlvbjsJCS8qIEFjdGlvbiBmbGFnIGZvciBkb3dubG9hZGVyCSovCi1leHRlcm4gaW50CQlkZ2FwX3JlZ2lzdGVydHR5c3dpdGhzeXNmczsgLyogU2hvdWxkIHdlIHJlZ2lzdGVyIHRoZQkqLwotCQkJCQkJICAgIC8qIHR0eXMgd2l0aCBzeXNmcyBvciBub3QJKi8KLQotLyoKLSAqIEdsb2JhbCBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gZGdhcF9mZXA1LmMsIGJ1dCBtdXN0IGJlIGhpZGRlbiBmcm9tCi0gKiB1c2VyIHNwYWNlIHByb2dyYW1zLgotICovCi1leHRlcm4gdm9pZAlkZ2FwX3BvbGxfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOyAKLWV4dGVybiB2b2lkCWRnYXBfY21kYihzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdWNoYXIgY21kLCB1Y2hhciBieXRlMSwgdWNoYXIgYnl0ZTIsIHVpbnQgbmNtZHMpOwotZXh0ZXJuIHZvaWQJZGdhcF9jbWR3KHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1Y2hhciBjbWQsIHUxNiB3b3JkLCB1aW50IG5jbWRzKTsKLWV4dGVybiB2b2lkCWRnYXBfd21vdmUoc3RydWN0IGNoYW5uZWxfdCAqY2gsIGNoYXIgKmJ1ZiwgdWludCBjbnQpOwotZXh0ZXJuIGludAlkZ2FwX3BhcmFtKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotZXh0ZXJuIHZvaWQJZGdhcF9wYXJpdHlfc2NhbihzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdW5zaWduZWQgY2hhciAqY2J1ZiwgdW5zaWduZWQgY2hhciAqZmJ1ZiwgaW50ICpsZW4pOwotZXh0ZXJuIHVpbnQJZGdhcF9nZXRfY3VzdG9tX2JhdWQoc3RydWN0IGNoYW5uZWxfdCAqY2gpOwotZXh0ZXJuIHZvaWQJZGdhcF9maXJtd2FyZV9yZXNldF9wb3J0KHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2ZlcDUuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfZmVwNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzU4MzFhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfZmVwNS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKglOT1RFIFRPIExJTlVYIEtFUk5FTCBIQUNLRVJTOiAgRE8gTk9UIFJFRk9STUFUIFRISVMgQ09ERSEKLSAqCi0gKglUaGlzIGlzIHNoYXJlZCBjb2RlIGJldHdlZW4gRGlnaSdzIENWUyBhcmNoaXZlIGFuZCB0aGUKLSAqCUxpbnV4IEtlcm5lbCBzb3VyY2VzLgotICoJQ2hhbmdpbmcgdGhlIHNvdXJjZSBqdXN0IGZvciByZWZvcm1hdHRpbmcgbmVlZGxlc3NseSBicmVha3MKLSAqCW91ciBDVlMgZGlmZiBoaXN0b3J5LgotICoKLSAqCVNlbmQgYW55IGJ1ZyBmaXhlcy9jaGFuZ2VzIHRvOiAgRW5nLkxpbnV4IGF0IGRpZ2kgZG90IGNvbS4KLSAqCVRoYW5rIHlvdS4KLSAqCi0gKiAkSWQ6IGRnYXBfZmVwNS5jLHYgMS4yIDIwMTEvMDYvMjEgMTA6MzU6NDAgbWFya2ggRXhwICQKLSAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogRm9yIHVkZWxheSAqLwotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CS8qIEZvciBjb3B5X2Zyb21fdXNlci9jb3B5X3RvX3VzZXIgKi8KLSNpbmNsdWRlIDxsaW51eC90dHkuaD4KLSNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgkvKiBGb3IgdHR5X3NjaGVkdWxlX2ZsaXAgKi8KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDM5KQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImRnYXBfZHJpdmVyLmgiCi0jaW5jbHVkZSAiZGdhcF9wY2kuaCIKLSNpbmNsdWRlICJkZ2FwX2ZlcDUuaCIKLSNpbmNsdWRlICJkZ2FwX3R0eS5oIgotI2luY2x1ZGUgImRnYXBfY29uZi5oIgotI2luY2x1ZGUgImRnYXBfcGFyc2UuaCIKLSNpbmNsdWRlICJkZ2FwX3RyYWNlLmgiCi0KLS8qCi0gKiBPdXIgZnVuY3Rpb24gcHJvdG90eXBlcwotICovCi1zdGF0aWMgdm9pZCBkZ2FwX2NtZHdfZXh0KHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1MTYgY21kLCB1MTYgd29yZCwgdWludCBuY21kcyk7Ci1zdGF0aWMgaW50IGRnYXBfZXZlbnQoc3RydWN0IGJvYXJkX3QgKmJkKTsKLQotLyoKLSAqIGludGVybmFsIHZhcmlhYmxlcwotICovCi1zdGF0aWMgdWludCBkZ2FwX2NvdW50ID0gNTAwOwotCi0KLS8qCi0gKiBMb2FkcyB0aGUgZGdhcC5jb25mIGNvbmZpZyBmaWxlIGZyb20gdGhlIHVzZXIuCi0gKi8KLXZvaWQgZGdhcF9kb19jb25maWdfbG9hZCh1Y2hhciBfX3VzZXIgKnVhZGRyLCBpbnQgbGVuKQotewotCWludCBvcmlnX2xlbiA9IGxlbjsKLQljaGFyICp0b19hZGRyOwotCXVjaGFyIF9fdXNlciAqZnJvbV9hZGRyID0gdWFkZHI7Ci0JY2hhciBidWZbVTJCU0laRV07Ci0JaW50IG47Ci0KLQl0b19hZGRyID0gZGdhcF9jb25maWdfYnVmID0ga3phbGxvYyhsZW4gKyAxLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWRnYXBfY29uZmlnX2J1ZikgewotCQlEUFJfSU5JVCgoImRnYXBfZG9fY29uZmlnX2xvYWQgLSB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBmaWxlXG4iKSk7Ci0JCWRnYXBfZHJpdmVyX3N0YXRlID0gRFJJVkVSX05FRURfQ09ORklHX0xPQUQ7Ci0JCXJldHVybjsKLQl9Ci0KLQluID0gVTJCU0laRTsKLQl3aGlsZSAobGVuKSB7Ci0KLQkJaWYgKG4gPiBsZW4pCi0JCQluID0gbGVuOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigoY2hhciAqKSAmYnVmLCBmcm9tX2FkZHIsIG4pID09IC0xICkKLQkJCXJldHVybjsKLQotCQkvKiBDb3B5IGRhdGEgZnJvbSBidWZmZXIgdG8ga2VybmVsIG1lbW9yeSAqLwotCQltZW1jcHkodG9fYWRkciwgYnVmLCBuKTsKLQotCQkvKiBpbmNyZW1lbnQgY291bnRzICovCi0JCWxlbiAtPSBuOwotCQl0b19hZGRyICs9IG47Ci0JCWZyb21fYWRkciArPSBuOwotCQluID0gVTJCU0laRTsKLQl9Ci0KLQlkZ2FwX2NvbmZpZ19idWZbb3JpZ19sZW5dID0gJ1wwJzsKLQotCXRvX2FkZHIgPSBkZ2FwX2NvbmZpZ19idWY7Ci0JZGdhcF9wYXJzZWZpbGUoJnRvX2FkZHIsIFRSVUUpOwotCi0JRFBSX0lOSVQoKCJkZ2FwX2NvbmZpZ19sb2FkKCkgZmluaXNoXG4iKSk7Ci0KLQlyZXR1cm47Ci19Ci0KLQotaW50IGRnYXBfYWZ0ZXJfY29uZmlnX2xvYWRlZCh2b2lkKQotewotCWludCBpID0gMDsKLQlpbnQgcmMgPSAwOwotCi0JLyoKLQkgKiBSZWdpc3RlciBvdXIgdHR5cywgbm93IHRoYXQgd2UgaGF2ZSB0aGUgY29uZmlnIGxvYWRlZC4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZGdhcF9OdW1Cb2FyZHM7ICsraSkgewotCi0JCS8qCi0JCSAqIEluaXRpYWxpemUgS01FIHdhaXRxdWV1ZXMuLi4KLQkJICovCi0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJihkZ2FwX0JvYXJkW2ldLT5rbWVfd2FpdCkpOwotCi0JCS8qCi0JCSAqIGFsbG9jYXRlIGZsaXAgYnVmZmVyIGZvciBib2FyZC4KLQkJICovCi0JCWRnYXBfQm9hcmRbaV0tPmZsaXBidWYgPSBremFsbG9jKE1ZRkxJUExFTiwgR0ZQX0FUT01JQyk7Ci0JCWRnYXBfQm9hcmRbaV0tPmZsaXBmbGFnYnVmID0ga3phbGxvYyhNWUZMSVBMRU4sIEdGUF9BVE9NSUMpOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiAgICAgIHVzZXJ0b2JvYXJkIC0gY29weSBmcm9tIHVzZXIgc3BhY2UgdG8gYm9hcmQgc3BhY2UuCi0gKgotICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgaW50IGRnYXBfdXNlcnRvYm9hcmQoc3RydWN0IGJvYXJkX3QgKmJyZCwgY2hhciAqdG9fYWRkciwgY2hhciBfX3VzZXIgKmZyb21fYWRkciwgaW50IGxlbikKLXsKLQljaGFyIGJ1ZltVMkJTSVpFXTsKLQlpbnQgbiA9IFUyQlNJWkU7Ci0KLQlpZiAoIWJyZCB8fCBicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAtRUZBVUxUOwotCi0Jd2hpbGUgKGxlbikgewotCQlpZiAobiA+IGxlbikKLQkJCW4gPSBsZW47Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKChjaGFyICopICZidWYsIGZyb21fYWRkciwgbikgPT0gLTEgKSB7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCS8qIENvcHkgZGF0YSBmcm9tIGJ1ZmZlciB0byBjYXJkIG1lbW9yeSAqLwotCQltZW1jcHlfdG9pbyh0b19hZGRyLCBidWYsIG4pOwotCi0JCS8qIGluY3JlbWVudCBjb3VudHMgKi8KLQkJbGVuIC09IG47Ci0JCXRvX2FkZHIgKz0gbjsKLQkJZnJvbV9hZGRyICs9IG47Ci0JCW4gPSBVMkJTSVpFOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogQ29waWVzIHRoZSBCSU9TIGNvZGUgZnJvbSB0aGUgdXNlciB0byB0aGUgYm9hcmQsCi0gKiBhbmQgc3RhcnRzIHRoZSBCSU9TIHJ1bm5pbmcuCi0gKi8KLXZvaWQgZGdhcF9kb19iaW9zX2xvYWQoc3RydWN0IGJvYXJkX3QgKmJyZCwgdWNoYXIgX191c2VyICp1YmlvcywgaW50IGxlbikKLXsKLQl1Y2hhciAqYWRkcjsKLQl1aW50IG9mZnNldDsKLQlpbnQgaTsKLQotCWlmICghYnJkIHx8IChicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpIHx8ICFicmQtPnJlX21hcF9tZW1iYXNlKQotCQlyZXR1cm47Ci0KLQlEUFJfSU5JVCgoImRnYXBfZG9fYmlvc19sb2FkKCkgc3RhcnRcbiIpKTsKLQotCWFkZHIgPSBicmQtPnJlX21hcF9tZW1iYXNlOwotCi0JLyoKLQkgKiBjbGVhciBQT1NUIGFyZWEKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJd3JpdGViKDAsIGFkZHIgKyBQT1NUQVJFQSArIGkpOwotCi0JLyoKLQkgKiBEb3dubG9hZCBiaW9zCi0JICovCi0Jb2Zmc2V0ID0gMHgxMDAwOwotCWlmIChkZ2FwX3VzZXJ0b2JvYXJkKGJyZCwgYWRkciArIG9mZnNldCwgdWJpb3MsIGxlbikgPT0gLTEgKSB7Ci0JCWJyZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7Ci0JCWJyZC0+ZHBhc3RhdHVzID0gQkRfTk9GRVA7Ci0JCXJldHVybjsKLQl9Ci0KLQl3cml0ZWwoMHgwYmYwMDQwMSwgYWRkcik7Ci0Jd3JpdGVsKDAsIChhZGRyICsgNCkpOwotCi0JLyogQ2xlYXIgdGhlIHJlc2V0LCBhbmQgY2hhbmdlIHN0YXRlcy4gKi8KLQl3cml0ZWIoRkVQQ0xSLCBicmQtPnJlX21hcF9wb3J0KTsKLQlicmQtPnN0YXRlID0gV0FJVF9CSU9TX0xPQUQ7Ci19Ci0KLQotLyoKLSAqIENoZWNrcyB0byBzZWUgaWYgdGhlIEJJT1MgY29tcGxldGVkIHJ1bm5pbmcgb24gdGhlIGNhcmQuCi0gKi8KLXN0YXRpYyB2b2lkIGRnYXBfZG9fd2FpdF9mb3JfYmlvcyhzdHJ1Y3QgYm9hcmRfdCAqYnJkKQotewotCXVjaGFyICphZGRyOwotCXUxNiB3b3JkOwotCi0JaWYgKCFicmQgfHwgKGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykgfHwgIWJyZC0+cmVfbWFwX21lbWJhc2UpCi0JCXJldHVybjsKLQotCWFkZHIgPSBicmQtPnJlX21hcF9tZW1iYXNlOwotCXdvcmQgPSByZWFkdyhhZGRyICsgUE9TVEFSRUEpOwotCi0JLyogQ2hlY2sgdG8gc2VlIGlmIEJJT1MgdGhpbmtzIGJvYXJkIGlzIGdvb2QuIChHRCkuICovCi0JaWYgKHdvcmQgPT0gKih1MTYgKikgIkdEIikgewotCQlEUFJfSU5JVCgoIkdPVCBHRCBpbiBtZW1vcnksIG1vdmluZyBzdGF0ZXMuXG4iKSk7Ci0JCWJyZC0+c3RhdGUgPSBGSU5JU0hFRF9CSU9TX0xPQUQ7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBHaXZlIHVwIG9uIGJvYXJkIGFmdGVyIHRvbyBsb25nIG9mIHRpbWUgdGFrZW4gKi8KLQlpZiAoYnJkLT53YWl0X2Zvcl9iaW9zKysgPiA1MDAwKSB7Ci0JCXUxNiBlcnIxID0gcmVhZHcoYWRkciArIFNFUVVFTkNFKTsKLQkJdTE2IGVycjIgPSByZWFkdyhhZGRyICsgRVJST1IpOwotCQlBUFIoKCIqKipXQVJOSU5HKioqICVzIGZhaWxlZCBkaWFnbm9zdGljcy4gIEVycm9yICMoJXgsJXgpLlxuIiwKLQkJCWJyZC0+bmFtZSwgZXJyMSwgZXJyMikpOwotCQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOwotCX0KLX0KLQotCi0vKgotICogQ29waWVzIHRoZSBGRVAgY29kZSBmcm9tIHRoZSB1c2VyIHRvIHRoZSBib2FyZCwKLSAqIGFuZCBzdGFydHMgdGhlIEZFUCBydW5uaW5nLgotICovCi12b2lkIGRnYXBfZG9fZmVwX2xvYWQoc3RydWN0IGJvYXJkX3QgKmJyZCwgdWNoYXIgX191c2VyICp1ZmVwLCBpbnQgbGVuKQotewotCXVjaGFyICphZGRyOwotCXVpbnQgb2Zmc2V0OwotCi0JaWYgKCFicmQgfHwgKGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykgfHwgIWJyZC0+cmVfbWFwX21lbWJhc2UpCi0JCXJldHVybjsKLQotCWFkZHIgPSBicmQtPnJlX21hcF9tZW1iYXNlOwotCi0JRFBSX0lOSVQoKCJkZ2FwX2RvX2ZlcF9sb2FkKCkgZm9yIGJvYXJkICVzIDogc3RhcnRcbiIsIGJyZC0+bmFtZSkpOwotCi0JLyoKLQkgKiBEb3dubG9hZCBGRVAKLQkgKi8KLQlvZmZzZXQgPSAweDEwMDA7Ci0JaWYgKGRnYXBfdXNlcnRvYm9hcmQoYnJkLCBhZGRyICsgb2Zmc2V0LCB1ZmVwLCBsZW4pID09IC0xICkgewotCQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBJZiBib2FyZCBpcyBhIGNvbmNlbnRyYXRvciBwcm9kdWN0LCB3ZSBuZWVkIHRvIGdpdmUKLQkgKiBpdCBpdHMgY29uZmlnIHN0cmluZyBkZXNjcmliaW5nIGhvdyB0aGUgY29uY2VudHJhdG9ycyBsb29rLgotCSAqLwotCWlmICgoYnJkLT50eXBlID09IFBDWCkgfHwgKGJyZC0+dHlwZSA9PSBQRVBDKSkgewotCQl1Y2hhciBzdHJpbmdbMTAwXTsKLQkJdWNoYXIgKmNvbmZpZywgKnhjb25maWc7Ci0JCWludCBpID0gMDsKLQotCQl4Y29uZmlnID0gZGdhcF9jcmVhdGVfY29uZmlnX3N0cmluZyhicmQsIHN0cmluZyk7Ci0KLQkJLyogV3JpdGUgc3RyaW5nIHRvIGJvYXJkIG1lbW9yeSAqLwotCQljb25maWcgPSBhZGRyICsgQ09ORklHOwotCQlmb3IgKDsgaSA8IENPTkZJR1NJWkU7IGkrKywgY29uZmlnKyssIHhjb25maWcrKykgewotCQkJd3JpdGViKCp4Y29uZmlnLCBjb25maWcpOwotCQkJaWYgKCgqeGNvbmZpZyAmIDB4ZmYpID09IDB4ZmYpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQl3cml0ZWwoMHhiZmMwMTAwNCwgKGFkZHIgKyAweGMzNCkpOwotCXdyaXRlbCgweDMsIChhZGRyICsgMHhjMzApKTsKLQotCS8qIGNoYW5nZSBzdGF0ZXMuICovCi0JYnJkLT5zdGF0ZSA9IFdBSVRfRkVQX0xPQUQ7Ci0KLQlEUFJfSU5JVCgoImRnYXBfZG9fZmVwX2xvYWQoKSBmb3IgYm9hcmQgJXMgOiBmaW5pc2hcbiIsIGJyZC0+bmFtZSkpOwotCi19Ci0KLQotLyoKLSAqIFdhaXRzIGZvciB0aGUgRkVQIHRvIHJlcG9ydCB0aGF0cyBpdHMgcmVhZHkgZm9yIHVzIHRvIHVzZS4KLSAqLwotc3RhdGljIHZvaWQgZGdhcF9kb193YWl0X2Zvcl9mZXAoc3RydWN0IGJvYXJkX3QgKmJyZCkKLXsKLQl1Y2hhciAqYWRkcjsKLQl1MTYgd29yZDsKLQotCWlmICghYnJkIHx8IChicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpIHx8ICFicmQtPnJlX21hcF9tZW1iYXNlKQotCQlyZXR1cm47Ci0KLQlhZGRyID0gYnJkLT5yZV9tYXBfbWVtYmFzZTsKLQotCURQUl9JTklUKCgiZGdhcF9kb193YWl0X2Zvcl9mZXAoKSBmb3IgYm9hcmQgJXMgOiBzdGFydC4gYWRkcjogJXBcbiIsIGJyZC0+bmFtZSwgYWRkcikpOwotCi0Jd29yZCA9IHJlYWR3KGFkZHIgKyBGRVBTVEFUKTsKLQotCS8qIENoZWNrIHRvIHNlZSBpZiBGRVAgaXMgdXAgYW5kIHJ1bm5pbmcgbm93LiAqLwotCWlmICh3b3JkID09ICoodTE2ICopICJPUyIpIHsKLQkJRFBSX0lOSVQoKCJHT1QgT1MgaW4gbWVtb3J5IGZvciBib2FyZCAlcywgbW92aW5nIHN0YXRlcy5cbiIsIGJyZC0+bmFtZSkpOwotCQlicmQtPnN0YXRlID0gRklOSVNIRURfRkVQX0xPQUQ7Ci0KLQkJLyoKLQkJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBib2FyZCBjYW4gc3VwcG9ydCBGRVA1KyBjb21tYW5kcy4KLQkJICovCi0JCXdvcmQgPSByZWFkdyhhZGRyICsgRkVQNV9QTFVTKTsKLQkJaWYgKHdvcmQgPT0gKih1MTYgKikgIjVBIikgewotCQkJRFBSX0lOSVQoKCJHT1QgNUEgaW4gbWVtb3J5IGZvciBib2FyZCAlcywgYm9hcmQgc3VwcG9ydHMgZXh0ZW5kZWQgRkVQNSBjb21tYW5kcy5cbiIsIGJyZC0+bmFtZSkpOwotCQkJYnJkLT5iZF9mbGFncyB8PSBCRF9GRVA1UExVUzsKLQkJfQotCi0JCXJldHVybjsKLQl9Ci0KLQkvKiBHaXZlIHVwIG9uIGJvYXJkIGFmdGVyIHRvbyBsb25nIG9mIHRpbWUgdGFrZW4gKi8KLQlpZiAoYnJkLT53YWl0X2Zvcl9mZXArKyA+IDUwMDApIHsKLQkJdTE2IGVycjEgPSByZWFkdyhhZGRyICsgU0VRVUVOQ0UpOwotCQl1MTYgZXJyMiA9IHJlYWR3KGFkZHIgKyBFUlJPUik7Ci0JCUFQUigoIioqKldBUk5JTkcqKiogRkVQT1MgZm9yICVzIG5vdCBmdW5jdGlvbmluZy4gIEVycm9yICMoJXgsJXgpLlxuIiwKLQkJCWJyZC0+bmFtZSwgZXJyMSwgZXJyMikpOwotCQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOwotCX0KLQotCURQUl9JTklUKCgiZGdhcF9kb193YWl0X2Zvcl9mZXAoKSBmb3IgYm9hcmQgJXMgOiBmaW5pc2hcbiIsIGJyZC0+bmFtZSkpOwotfQotCi0KLS8qCi0gKiBQaHlzaWNhbGx5IGZvcmNlcyB0aGUgRkVQNSBjYXJkIHRvIHJlc2V0IGl0c2VsZi4KLSAqLwotc3RhdGljIHZvaWQgZGdhcF9kb19yZXNldF9ib2FyZChzdHJ1Y3QgYm9hcmRfdCAqYnJkKQotewotCXVjaGFyIGNoZWNrOwotCXUzMiBjaGVjazE7Ci0JdTMyIGNoZWNrMjsKLQlpbnQgaSA9IDA7Ci0KLQlpZiAoIWJyZCB8fCAoYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKSB8fCAhYnJkLT5yZV9tYXBfbWVtYmFzZSB8fCAhYnJkLT5yZV9tYXBfcG9ydCkgewotCQlEUFJfSU5JVCgoImRnYXBfZG9fcmVzZXRfYm9hcmQoKSBzdGFydC4gYmFkIHZhbHVlcy4gYnJkOiAlcCBtZW06ICVwIGlvOiAlcFxuIiwKLQkJCWJyZCwgYnJkID8gYnJkLT5yZV9tYXBfbWVtYmFzZSA6IDAsIGJyZCA/IGJyZC0+cmVfbWFwX3BvcnQgOiAwKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlEUFJfSU5JVCgoImRnYXBfZG9fcmVzZXRfYm9hcmQoKSBzdGFydC4gaW86ICVwXG4iLCBicmQtPnJlX21hcF9wb3J0KSk7Ci0KLQkvKiBGRVBSU1QgZG9lcyBub3QgdmFyeSBhbW9uZyBzdXBwb3J0ZWQgYm9hcmRzICovCi0Jd3JpdGViKEZFUFJTVCwgYnJkLT5yZV9tYXBfcG9ydCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDw9IDEwMDA7IGkrKykgewotCQljaGVjayA9IHJlYWRiKGJyZC0+cmVfbWFwX3BvcnQpICYgMHhlOwotCQlpZiAoY2hlY2sgPT0gRkVQUlNUKQotCQkJYnJlYWs7Ci0JCXVkZWxheSgxMCk7Ci0KLQl9Ci0JaWYgKGkgPiAxMDAwKSB7Ci0JCUFQUigoIioqKiBXQVJOSU5HICoqKiBCb2FyZCBub3QgcmVzZXR0aW5nLi4uICBGYWlsaW5nIGJvYXJkLlxuIikpOwotCQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSB0aGVyZSByZWFsbHkgaXMgbWVtb3J5IG91dCB0aGVyZS4KLQkgKi8KLQl3cml0ZWwoMHhhNTVhM2NjMywgKGJyZC0+cmVfbWFwX21lbWJhc2UgKyBMT1dNRU0pKTsKLQl3cml0ZWwoMHg1YWE1YzMzYywgKGJyZC0+cmVfbWFwX21lbWJhc2UgKyBISUdITUVNKSk7Ci0JY2hlY2sxID0gcmVhZGwoYnJkLT5yZV9tYXBfbWVtYmFzZSArIExPV01FTSk7Ci0JY2hlY2syID0gcmVhZGwoYnJkLT5yZV9tYXBfbWVtYmFzZSArIEhJR0hNRU0pOwotCi0JaWYgKChjaGVjazEgIT0gMHhhNTVhM2NjMykgfHwgKGNoZWNrMiAhPSAweDVhYTVjMzNjKSkgewotCQlBUFIoKCIqKiogV2FybmluZyAqKiogTm8gbWVtb3J5IGF0ICVwIGZvciBib2FyZC5cbiIsIGJyZC0+cmVfbWFwX21lbWJhc2UpKTsKLQkJYnJkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKLQkJYnJkLT5kcGFzdGF0dXMgPSBCRF9OT0ZFUDsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JaWYgKGJyZC0+c3RhdGUgIT0gQk9BUkRfRkFJTEVEKQotCQlicmQtPnN0YXRlID0gRklOSVNIRURfUkVTRVQ7Ci0KLWZhaWxlZDoKLQlEUFJfSU5JVCgoImRnYXBfZG9fcmVzZXRfYm9hcmQoKSBmaW5pc2hcbiIpKTsKLX0KLQotCi0vKgotICogU2VuZHMgYSBjb25jZW50cmF0b3IgaW1hZ2UgaW50byB0aGUgRkVQNSBib2FyZC4KLSAqLwotdm9pZCBkZ2FwX2RvX2NvbmNfbG9hZChzdHJ1Y3QgYm9hcmRfdCAqYnJkLCB1Y2hhciAqdWFkZHIsIGludCBsZW4pCi17Ci0JY2hhciAqdmFkZHI7Ci0JdTE2IG9mZnNldCA9IDA7Ci0Jc3RydWN0IGRvd25sZF90ICp0b19kcDsKLQotCWlmICghYnJkIHx8IChicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpIHx8ICFicmQtPnJlX21hcF9tZW1iYXNlKQotCQlyZXR1cm47Ci0KLQl2YWRkciA9IGJyZC0+cmVfbWFwX21lbWJhc2U7Ci0KLQlvZmZzZXQgPSByZWFkdygodTE2ICopICh2YWRkciArIERPV05SRVEpKTsKLQl0b19kcCA9IChzdHJ1Y3QgZG93bmxkX3QgKikgKHZhZGRyICsgKGludCkgb2Zmc2V0KTsKLQotCS8qCi0JICogVGhlIGltYWdlIHdhcyBhbHJlYWR5IHJlYWQgaW50byBrZXJuZWwgc3BhY2UsCi0JICogd2UgZG8gTk9UIG5lZWQgYSB1c2VyIHNwYWNlIHJlYWQgaGVyZQotCSAqLwotCW1lbWNweV90b2lvKChjaGFyICopIHRvX2RwLCB1YWRkciwgc2l6ZW9mKHN0cnVjdCBkb3dubGRfdCkpOwotCi0JLyogVGVsbCBjYXJkIHdlIGhhdmUgZGF0YSBmb3IgaXQgKi8KLQl3cml0ZXcoMCwgdmFkZHIgKyAoRE9XTlJFUSkpOwotCi0JYnJkLT5jb25jX2RsX3N0YXR1cyA9IE5PX1BFTkRJTkdfQ09OQ0VOVFJBVE9SX1JFUVVFU1RTOwotfQotCi0KLSNkZWZpbmUgRVhQQU5TSU9OX1JPTV9TSVpFCSg2NCAqIDEwMjQpCi0jZGVmaW5lIEZFUDVfUk9NX01BR0lDCQkoMHhGRUZGRkZGRikKLQotc3RhdGljIHZvaWQgZGdhcF9nZXRfdnBkKHN0cnVjdCBib2FyZF90ICpicmQpCi17Ci0JdTMyIG1hZ2ljOwotCXUzMiBiYXNlX29mZnNldDsKLQl1MTYgcm9tX29mZnNldDsKLQl1MTYgdnBkX29mZnNldDsKLQl1MTYgaW1hZ2VfbGVuZ3RoOwotCXUxNiBpOwotCXVjaGFyIGJ5dGUxOwotCXVjaGFyIGJ5dGUyOwotCi0JLyoKLQkgKiBQb2tlIHRoZSBtYWdpYyBudW1iZXIgYXQgdGhlIFBDSSBSb20gQWRkcmVzcyBsb2NhdGlvbi4KLQkgKiBJZiBWUEQgaXMgc3VwcG9ydGVkLCB0aGUgdmFsdWUgcmVhZCBmcm9tIHRoYXQgYWRkcmVzcwotCSAqIHdpbGwgYmUgbm9uLXplcm8uCi0JICovCi0JbWFnaWMgPSBGRVA1X1JPTV9NQUdJQzsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyZC0+cGRldiwgUENJX1JPTV9BRERSRVNTLCBtYWdpYyk7Ci0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGJyZC0+cGRldiwgUENJX1JPTV9BRERSRVNTLCAmbWFnaWMpOwotCi0JLyogVlBEIG5vdCBzdXBwb3J0ZWQsIGJhaWwgKi8KLQlpZiAoIW1hZ2ljKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIFRvIGdldCB0byB0aGUgT1RQUk9NIG1lbW9yeSwgd2UgaGF2ZSB0byBzZW5kIHRoZSBib2FyZHMgYmFzZQotCSAqIGFkZHJlc3Mgb3InZWQgd2l0aCAxIGludG8gdGhlIFBDSSBSb20gQWRkcmVzcyBsb2NhdGlvbi4KLQkgKi8KLQltYWdpYyA9IGJyZC0+bWVtYmFzZSB8IDB4MDE7Ci0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmQtPnBkZXYsIFBDSV9ST01fQUREUkVTUywgbWFnaWMpOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChicmQtPnBkZXYsIFBDSV9ST01fQUREUkVTUywgJm1hZ2ljKTsKLQotCWJ5dGUxID0gcmVhZGIoYnJkLT5yZV9tYXBfbWVtYmFzZSk7Ci0JYnl0ZTIgPSByZWFkYihicmQtPnJlX21hcF9tZW1iYXNlICsgMSk7Ci0KLQkvKgotCSAqIElmIHRoZSBib2FyZCBjb3JyZWN0bHkgc3dhcHBlZCB0byB0aGUgT1RQUk9NIG1lbW9yeSwKLQkgKiB0aGUgZmlyc3QgMiBieXRlcyAoaGVhZGVyKSBzaG91bGQgYmUgMHg1NSwgMHhBQQotCSAqLwotCWlmIChieXRlMSA9PSAweDU1ICYmIGJ5dGUyID09IDB4QUEpIHsKLQotCQliYXNlX29mZnNldCA9IDA7Ci0KLQkJLyoKLQkJICogV2UgaGF2ZSB0byBydW4gdGhyb3VnaCBhbGwgdGhlIE9UUFJPTSBtZW1vcnkgbG9va2luZwotCQkgKiBmb3IgdGhlIFZQRCBvZmZzZXQuCi0JCSAqLwotCQl3aGlsZSAoYmFzZV9vZmZzZXQgPD0gRVhQQU5TSU9OX1JPTV9TSVpFKSB7Ci0KLQkJCS8qCi0JCQkgKiBMb3RzIG9mIG1hZ2ljIG51bWJlcnMgaGVyZS4KLQkJCSAqCi0JCQkgKiBUaGUgVlBEIG9mZnNldCBpcyBsb2NhdGVkIGluc2lkZSB0aGUgUk9NIERhdGEgU3RydWN0dXJlLgotCQkJICogV2UgYWxzbyBoYXZlIHRvIHJlbWVtYmVyIHRoZSBsZW5ndGggb2YgZWFjaAotCQkJICogUk9NIERhdGEgU3RydWN0dXJlLCBzbyB3ZSBjYW4gImhvcCIgdG8gdGhlIG5leHQKLQkJCSAqIGVudHJ5IGlmIHRoZSBWUEQgaXNuJ3QgaW4gdGhlIGN1cnJlbnQKLQkJCSAqIFJPTSBEYXRhIFN0cnVjdHVyZS4KLQkJCSAqLwotCQkJcm9tX29mZnNldCA9IHJlYWR3KGJyZC0+cmVfbWFwX21lbWJhc2UgKyBiYXNlX29mZnNldCArIDB4MTgpOwotCQkJaW1hZ2VfbGVuZ3RoID0gcmVhZHcoYnJkLT5yZV9tYXBfbWVtYmFzZSArIHJvbV9vZmZzZXQgKyAweDEwKSAqIDUxMjsKLQkJCXZwZF9vZmZzZXQgPSByZWFkdyhicmQtPnJlX21hcF9tZW1iYXNlICsgcm9tX29mZnNldCArIDB4MDgpOwotCi0JCQkvKiBGb3VuZCB0aGUgVlBEIGVudHJ5ICovCi0JCQlpZiAodnBkX29mZnNldCkKLQkJCQlicmVhazsKLQotCQkJLyogV2UgZGlkbid0IGZpbmQgYSBWUEQgZW50cnksIGdvIHRvIG5leHQgUk9NIGVudHJ5LiAqLwotCQkJYmFzZV9vZmZzZXQgKz0gaW1hZ2VfbGVuZ3RoOwotCi0JCQlieXRlMSA9IHJlYWRiKGJyZC0+cmVfbWFwX21lbWJhc2UgKyBiYXNlX29mZnNldCk7Ci0JCQlieXRlMiA9IHJlYWRiKGJyZC0+cmVfbWFwX21lbWJhc2UgKyBiYXNlX29mZnNldCArIDEpOwotCi0JCQkvKgotCQkJICogSWYgdGhlIG5ldyBST00gb2Zmc2V0IGRvZXNuJ3QgaGF2ZSAweDU1LCAweEFBCi0JCQkgKiBhcyBpdHMgaGVhZGVyLCB3ZSBoYXZlIHJ1biBvdXQgb2YgUk9NLgotCQkJICovCi0JCQlpZiAoYnl0ZTEgIT0gMHg1NSB8fCBieXRlMiAhPSAweEFBKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJLyoKLQkJICogSWYgd2UgaGF2ZSBhIFZQRCBvZmZzZXQsIHRoZW4gbWFyayB0aGUgYm9hcmQKLQkJICogYXMgaGF2aW5nIGEgdmFsaWQgVlBELCBhbmQgY29weSBWUERTSVpFICg1MTIpIGJ5dGVzIG9mCi0JCSAqIHRoYXQgVlBEIHRvIHRoZSBidWZmZXIgd2UgaGF2ZSBpbiBvdXIgYm9hcmQgc3RydWN0dXJlLgotCQkgKi8KLQkJaWYgKHZwZF9vZmZzZXQpIHsKLQkJCWJyZC0+YmRfZmxhZ3MgfD0gQkRfSEFTX1ZQRDsKLQkJCWZvciAoaSA9IDA7IGkgPCBWUERTSVpFOyBpKyspCi0JCQkJYnJkLT52cGRbaV0gPSByZWFkYihicmQtPnJlX21hcF9tZW1iYXNlICsgdnBkX29mZnNldCArIGkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBXZSBNVVNUIHBva2UgdGhlIG1hZ2ljIG51bWJlciBhdCB0aGUgUENJIFJvbSBBZGRyZXNzIGxvY2F0aW9uIGFnYWluLgotCSAqIFRoaXMgbWFrZXMgdGhlIGNhcmQgcmVwb3J0IHRoZSByZWd1bGFyIGJvYXJkIG1lbW9yeSBiYWNrIHRvIHVzLAotCSAqIHJhdGhlciB0aGFuIHRoZSBPVFBST00gbWVtb3J5LgotCSAqLwotCW1hZ2ljID0gRkVQNV9ST01fTUFHSUM7Ci0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmQtPnBkZXYsIFBDSV9ST01fQUREUkVTUywgbWFnaWMpOwotfQotCi0KLS8qCi0gKiBPdXIgYm9hcmQgcG9sbGVyIGZ1bmN0aW9uLgotICovCi12b2lkIGRnYXBfcG9sbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQgPSAoc3RydWN0IGJvYXJkX3QgKikgZGF0YTsKLQl1bG9uZyAgbG9ja19mbGFnczsKLQl1bG9uZyAgbG9ja19mbGFnczI7Ci0JY2hhciAqdmFkZHI7Ci0JdTE2IGhlYWQsIHRhaWw7Ci0JdTE2ICpjaGtfYWRkcjsKLQl1MTYgY2hlY2sgPSAwOwotCi0JaWYgKCFiZCB8fCAoYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpKSB7Ci0JCUFQUigoImRnYXBfcG9sbF90YXNrbGV0KCkgLSBOVUxMIG9yIGJhZCBiZC5cbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChiZC0+aW5oaWJpdF9wb2xsZXIpCi0JCXJldHVybjsKLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQl2YWRkciA9IGJkLT5yZV9tYXBfbWVtYmFzZTsKLQotCS8qCi0JICogSWYgYm9hcmQgaXMgcmVhZHksIHBhcnNlIGRlZXBlciB0byBzZWUgaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gZG8uCi0JICovCi0JaWYgKGJkLT5zdGF0ZSA9PSBCT0FSRF9SRUFEWSkgewotCi0JCXN0cnVjdCBldl90ICplYWRkciA9IE5VTEw7Ci0KLQkJaWYgKCFiZC0+cmVfbWFwX21lbWJhc2UpIHsKLQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIWJkLT5yZV9tYXBfcG9ydCkgewotCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFiZC0+bmFzeW5jKSB7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCS8qCi0JCSAqIElmIHRoaXMgaXMgYSBDWCBvciBFUENYLCB3ZSBuZWVkIHRvIHNlZSBpZiB0aGUgZmlybXdhcmUKLQkJICogaXMgcmVxdWVzdGluZyBhIGNvbmNlbnRyYXRvciBpbWFnZSBmcm9tIHVzLgotCQkgKi8KLQkJaWYgKChiZC0+dHlwZSA9PSBQQ1gpIHx8IChiZC0+dHlwZSA9PSBQRVBDKSkgewotCQkJY2hrX2FkZHIgPSAodTE2ICopICh2YWRkciArIERPV05SRVEpOwotCQkJY2hlY2sgPSByZWFkdyhjaGtfYWRkcik7Ci0JCQkvKiBOb256ZXJvIGlmIEZFUCBpcyByZXF1ZXN0aW5nIGNvbmNlbnRyYXRvciBpbWFnZS4gKi8KLQkJCWlmIChjaGVjaykgewotCQkJCWlmIChiZC0+Y29uY19kbF9zdGF0dXMgPT0gTk9fUEVORElOR19DT05DRU5UUkFUT1JfUkVRVUVTVFMpCi0JCQkJCWJkLT5jb25jX2RsX3N0YXR1cyA9IE5FRURfQ09OQ0VOVFJBVE9SOwotCQkJCS8qCi0JCQkJICogU2lnbmFsIGRvd25sb2FkZXIsIGl0cyBnb3Qgc29tZSB3b3JrIHRvIGRvLgotCQkJCSAqLwotCQkJCURHQVBfTE9DSyhkZ2FwX2RsX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCQlpZiAoZGdhcF9kbF9hY3Rpb24gIT0gMSkgewotCQkJCQlkZ2FwX2RsX2FjdGlvbiA9IDE7Ci0JCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGdhcF9kbF93YWl0KTsKLQkJCQl9Ci0JCQkJREdBUF9VTkxPQ0soZGdhcF9kbF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQkJCX0KLQkJfQotCi0JCWVhZGRyID0gKHN0cnVjdCBldl90ICopICh2YWRkciArIEVWQlVGKTsKLQotCQkvKiBHZXQgb3VyIGhlYWQgYW5kIHRhaWwgKi8KLQkJaGVhZCA9IHJlYWR3KCYoZWFkZHItPmV2X2hlYWQpKTsKLQkJdGFpbCA9IHJlYWR3KCYoZWFkZHItPmV2X3RhaWwpKTsKLQotCQkvKgotCQkgKiBJZiB0aGVyZSBpcyBhbiBldmVudCBwZW5kaW5nLiBHbyBzZXJ2aWNlIGl0LgotCQkgKi8KLQkJaWYgKGhlYWQgIT0gdGFpbCkgewotCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJZGdhcF9ldmVudChiZCk7Ci0JCQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQl9Ci0KLW91dDoKLQkJLyoKLQkJICogSWYgYm9hcmQgaXMgZG9pbmcgaW50ZXJydXB0cywgQUNLIHRoZSBpbnRlcnJ1cHQuCi0JCSAqLwotCQlpZiAoYmQgJiYgYmQtPmludHJfcnVubmluZykgewotCQkJcmVhZGIoYmQtPnJlX21hcF9wb3J0ICsgMik7Ci0JCX0KLQotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBPdXIgc3RhdGUgbWFjaGluZSB0byBnZXQgdGhlIGJvYXJkIHVwIGFuZCBydW5uaW5nICovCi0KLQkvKiBSZXNldCBib2FyZCAqLwotCWlmIChiZC0+c3RhdGUgPT0gTkVFRF9SRVNFVCkgewotCi0JCS8qIEdldCBWUEQgaW5mbyAqLwotCQlkZ2FwX2dldF92cGQoYmQpOwotCi0JCWRnYXBfZG9fcmVzZXRfYm9hcmQoYmQpOwotCX0KLQotCS8qIE1vdmUgdG8gbmV4dCBzdGF0ZSAqLwotCWlmIChiZC0+c3RhdGUgPT0gRklOSVNIRURfUkVTRVQpIHsKLQkJYmQtPnN0YXRlID0gTkVFRF9DT05GSUc7Ci0JfQotCi0JaWYgKGJkLT5zdGF0ZSA9PSBORUVEX0NPTkZJRykgewotCQkvKgotCQkgKiBNYXRjaCB0aGlzIGJvYXJkIHRvIGEgY29uZmlnIHRoZSB1c2VyIGNyZWF0ZWQgZm9yIHVzLgotCQkgKi8KLQkJYmQtPmJkX2NvbmZpZyA9IGRnYXBfZmluZF9jb25maWcoYmQtPnR5cGUsIGJkLT5wY2lfYnVzLCBiZC0+cGNpX3Nsb3QpOwotCi0JCS8qCi0JCSAqIEJlY2F1c2UgdGhlIDQgcG9ydCBYciBwcm9kdWN0cyBzaGFyZSB0aGUgc2FtZSBQQ0kgSUQKLQkJICogYXMgdGhlIDggcG9ydCBYciBwcm9kdWN0cywgaWYgd2UgcmVjZWl2ZSBhIE5VTEwgY29uZmlnCi0JCSAqIGJhY2ssIGFuZCB0aGlzIGlzIGEgUEFQT1JUOCBib2FyZCwgcmV0cnkgd2l0aCBhCi0JCSAqIFBBUE9SVDQgYXR0ZW1wdCBhcyB3ZWxsLgotCQkgKi8KLQkJaWYgKGJkLT50eXBlID09IFBBUE9SVDggJiYgIWJkLT5iZF9jb25maWcpIHsKLQkJCWJkLT5iZF9jb25maWcgPSBkZ2FwX2ZpbmRfY29uZmlnKFBBUE9SVDQsIGJkLT5wY2lfYnVzLCBiZC0+cGNpX3Nsb3QpOwotCQl9Ci0KLQkJLyoKLQkJICogUmVnaXN0ZXIgdGhlIHR0eXMgKGlmIGFueSkgaW50byB0aGUga2VybmVsLgotCQkgKi8KLQkJaWYgKGJkLT5iZF9jb25maWcpIHsKLQkJCWJkLT5zdGF0ZSA9IEZJTklTSEVEX0NPTkZJRzsKLQkJfQotCQllbHNlIHsKLQkJCWJkLT5zdGF0ZSA9IENPTkZJR19OT1RfRk9VTkQ7Ci0JCX0KLQl9Ci0KLQkvKiBNb3ZlIHRvIG5leHQgc3RhdGUgKi8KLQlpZiAoYmQtPnN0YXRlID09IEZJTklTSEVEX0NPTkZJRykgewotCQliZC0+c3RhdGUgPSBORUVEX0RFVklDRV9DUkVBVElPTjsKLQl9Ci0KLQkvKiBNb3ZlIHRvIG5leHQgc3RhdGUgKi8KLQlpZiAoYmQtPnN0YXRlID09IE5FRURfREVWSUNFX0NSRUFUSU9OKSB7Ci0JCS8qCi0JCSAqIFNpZ25hbCBkb3dubG9hZGVyLCBpdHMgZ290IHNvbWUgd29yayB0byBkby4KLQkJICovCi0JCURHQVBfTE9DSyhkZ2FwX2RsX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJaWYgKGRnYXBfZGxfYWN0aW9uICE9IDEpIHsKLQkJCWRnYXBfZGxfYWN0aW9uID0gMTsKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGdhcF9kbF93YWl0KTsKLQkJfQotCQlER0FQX1VOTE9DSyhkZ2FwX2RsX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQl9Ci0KLQkvKiBNb3ZlIHRvIG5leHQgc3RhdGUgKi8KLQlpZiAoYmQtPnN0YXRlID09IEZJTklTSEVEX0RFVklDRV9DUkVBVElPTikgewotCQliZC0+c3RhdGUgPSBORUVEX0JJT1NfTE9BRDsKLQl9Ci0KLQkvKiBNb3ZlIHRvIG5leHQgc3RhdGUgKi8KLQlpZiAoYmQtPnN0YXRlID09IE5FRURfQklPU19MT0FEKSB7Ci0JCS8qCi0JCSAqIFNpZ25hbCBkb3dubG9hZGVyLCBpdHMgZ290IHNvbWUgd29yayB0byBkby4KLQkJICovCi0JCURHQVBfTE9DSyhkZ2FwX2RsX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJaWYgKGRnYXBfZGxfYWN0aW9uICE9IDEpIHsKLQkJCWRnYXBfZGxfYWN0aW9uID0gMTsKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGdhcF9kbF93YWl0KTsKLQkJfQotCQlER0FQX1VOTE9DSyhkZ2FwX2RsX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQl9Ci0KLQkvKiBXYWl0IGZvciBCSU9TIHRvIHRlc3QgYm9hcmQuLi4gKi8KLQlpZiAoYmQtPnN0YXRlID09IFdBSVRfQklPU19MT0FEKSB7Ci0JCWRnYXBfZG9fd2FpdF9mb3JfYmlvcyhiZCk7Ci0JfQotCi0JLyogTW92ZSB0byBuZXh0IHN0YXRlICovCi0JaWYgKGJkLT5zdGF0ZSA9PSBGSU5JU0hFRF9CSU9TX0xPQUQpIHsKLQkJYmQtPnN0YXRlID0gTkVFRF9GRVBfTE9BRDsKLQotCQkvKgotCQkgKiBTaWduYWwgZG93bmxvYWRlciwgaXRzIGdvdCBzb21lIHdvcmsgdG8gZG8uCi0JCSAqLwotCQlER0FQX0xPQ0soZGdhcF9kbF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCWlmIChkZ2FwX2RsX2FjdGlvbiAhPSAxKSB7Ci0JCQlkZ2FwX2RsX2FjdGlvbiA9IDE7Ci0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRnYXBfZGxfd2FpdCk7Ci0JCX0KLQkJREdBUF9VTkxPQ0soZGdhcF9kbF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JfQotCi0JLyogV2FpdCBmb3IgRkVQIHRvIGxvYWQgb24gYm9hcmQuLi4gKi8KLQlpZiAoYmQtPnN0YXRlID09IFdBSVRfRkVQX0xPQUQpIHsKLQkJZGdhcF9kb193YWl0X2Zvcl9mZXAoYmQpOwotCX0KLQotCi0JLyogTW92ZSB0byBuZXh0IHN0YXRlICovCi0JaWYgKGJkLT5zdGF0ZSA9PSBGSU5JU0hFRF9GRVBfTE9BRCkgewotCi0JCS8qCi0JCSAqIERvIHR0eSBkZXZpY2UgaW5pdGlhbGl6YXRpb24uCi0JCSAqLwotCQlpbnQgcmMgPSBkZ2FwX3R0eV9pbml0KGJkKTsKLQotCQlpZiAocmMgPCAwKSB7Ci0JCQlkZ2FwX3R0eV91bmluaXQoYmQpOwotCQkJQVBSKCgiQ2FuJ3QgaW5pdCB0dHkgZGV2aWNlcyAoJWQpXG4iLCByYykpOwotCQkJYmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQkJYmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOwotCQl9Ci0JCWVsc2UgewotCQkJYmQtPnN0YXRlID0gTkVFRF9QUk9DX0NSRUFUSU9OOwotCi0JCQkvKgotCQkJICogU2lnbmFsIGRvd25sb2FkZXIsIGl0cyBnb3Qgc29tZSB3b3JrIHRvIGRvLgotCQkJICovCi0JCQlER0FQX0xPQ0soZGdhcF9kbF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCQlpZiAoZGdhcF9kbF9hY3Rpb24gIT0gMSkgewotCQkJCWRnYXBfZGxfYWN0aW9uID0gMTsKLQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRnYXBfZGxfd2FpdCk7Ci0JCQl9Ci0JCQlER0FQX1VOTE9DSyhkZ2FwX2RsX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJfQotCX0KLQotCS8qIE1vdmUgdG8gbmV4dCBzdGF0ZSAqLwotCWlmIChiZC0+c3RhdGUgPT0gRklOSVNIRURfUFJPQ19DUkVBVElPTikgewotCi0JCWJkLT5zdGF0ZSA9IEJPQVJEX1JFQURZOwotCQliZC0+ZHBhc3RhdHVzID0gQkRfUlVOTklORzsKLQotCQkvKgotCQkgKiBJZiB1c2VyIHJlcXVlc3RlZCB0aGUgYm9hcmQgdG8gcnVuIGluIGludGVycnVwdCBtb2RlLAotCQkgKiBnbyBhbmQgc2V0IGl0IHVwIG9uIHRoZSBib2FyZC4KLQkJICovCi0JCWlmIChiZC0+aW50cl91c2VkKSB7Ci0JCQl3cml0ZXcoMSwgKGJkLT5yZV9tYXBfbWVtYmFzZSArIEVOQUJMRV9JTlRSKSk7Ci0JCQkvKgotCQkJICogVGVsbCB0aGUgYm9hcmQgdG8gcG9sbCB0aGUgVUFSVFMgYXMgZmFzdCBhcyBwb3NzaWJsZS4KLQkJCSAqLwotCQkJd3JpdGV3KEZFUFBPTExfTUlOLCAoYmQtPnJlX21hcF9tZW1iYXNlICsgRkVQUE9MTCkpOwotCQkJYmQtPmludHJfcnVubmluZyA9IDE7Ci0JCX0KLQotCQkvKiBXYWtlIHVwIGFueW9uZSB3YWl0aW5nIGZvciBib2FyZCBzdGF0ZSB0byBjaGFuZ2UgdG8gcmVhZHkgKi8KLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZiZC0+c3RhdGVfd2FpdCk7Ci0JfQotCi0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotfQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiAgICAgIGRnYXBfY21kYiAtIFNlbmRzIGEgMiBieXRlIGNvbW1hbmQgdG8gdGhlIEZFUC4KLSAqCi0gKiAgICAgICAgICAgICAgY2ggICAgICAtIFBvaW50ZXIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUuCi0gKiAgICAgICAgICAgICAgY21kICAgICAtIENvbW1hbmQgdG8gYmUgc2VudC4KLSAqICAgICAgICAgICAgICBieXRlMSAgIC0gSW50ZWdlciBjb250YWluaW5nIGZpcnN0IGJ5dGUgdG8gYmUgc2VudC4KLSAqICAgICAgICAgICAgICBieXRlMiAgIC0gSW50ZWdlciBjb250YWluaW5nIHNlY29uZCBieXRlIHRvIGJlIHNlbnQuCi0gKiAgICAgICAgICAgICAgbmNtZHMgICAtIFdhaXQgdW50aWwgbmNtZHMgb3IgZmV3ZXIgY21kcyBhcmUgbGVmdAotICogICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgY21kIGJ1ZmZlciBiZWZvcmUgcmV0dXJuaW5nLgotICoKLSAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdm9pZCBkZ2FwX2NtZGIoc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVjaGFyIGNtZCwgdWNoYXIgYnl0ZTEsIHVjaGFyIGJ5dGUyLCB1aW50IG5jbWRzKQotewotCWNoYXIJCSp2YWRkciA9IE5VTEw7Ci0Jc3RydWN0IGNtX3QJKmNtX2FkZHIgPSBOVUxMOwotCXVpbnQJCWNvdW50OwotCXVpbnQJCW47Ci0JdTE2CQloZWFkOwotCXUxNgkJdGFpbDsKLQotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBDaGVjayBpZiBib2FyZCBpcyBzdGlsbCBhbGl2ZS4KLQkgKi8KLQlpZiAoY2gtPmNoX2JkLT5zdGF0ZSA9PSBCT0FSRF9GQUlMRUQpIHsKLQkJRFBSX0NPUkUoKCIlczolZCBib2FyZCBpcyBpbiBmYWlsZWQgc3RhdGUuXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogTWFrZSBzdXJlIHRoZSBwb2ludGVycyBhcmUgaW4gcmFuZ2UgYmVmb3JlCi0JICogd3JpdGluZyB0byB0aGUgRkVQIG1lbW9yeS4KLQkgKi8KLQl2YWRkciA9IGNoLT5jaF9iZC0+cmVfbWFwX21lbWJhc2U7Ci0KLQlpZiAoIXZhZGRyKQotCQlyZXR1cm47Ci0KLQljbV9hZGRyID0gKHN0cnVjdCBjbV90ICopICh2YWRkciArIENNREJVRik7Ci0JaGVhZCA9IHJlYWR3KCYoY21fYWRkci0+Y21faGVhZCkpOwotCi0JLyoKLQkgKiBGb3JnZXQgaXQgaWYgcG9pbnRlcnMgb3V0IG9mIHJhbmdlLgotCSAqLwotCWlmIChoZWFkID49IChDTURNQVggLSBDTURTVEFSVCkgfHwgKGhlYWQgJiAwMykpIHsKLQkJRFBSX0NPUkUoKCIlczolZCBwb2ludGVycyBvdXQgb2YgcmFuZ2UsIGZhaWxpbmcgYm9hcmQhXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pKTsKLQkJY2gtPmNoX2JkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogUHV0IHRoZSBkYXRhIGluIHRoZSBjaXJjdWxhciBjb21tYW5kIGJ1ZmZlci4KLQkgKi8KLQl3cml0ZWIoY21kLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyAwKSk7Ci0Jd3JpdGViKCh1Y2hhcikgY2gtPmNoX3BvcnRudW0sIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDEpKTsKLQl3cml0ZWIoYnl0ZTEsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDIpKTsKLQl3cml0ZWIoYnl0ZTIsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDMpKTsKLQotCWhlYWQgPSAoaGVhZCArIDQpICYgKENNRE1BWCAtIENNRFNUQVJUIC0gNCk7Ci0KLQl3cml0ZXcoaGVhZCwgJihjbV9hZGRyLT5jbV9oZWFkKSk7Ci0KLQkvKgotCSAqIFdhaXQgaWYgbmVjZXNzYXJ5IGJlZm9yZSB1cGRhdGluZyB0aGUgaGVhZAotCSAqIHBvaW50ZXIgdG8gbGltaXQgdGhlIG51bWJlciBvZiBvdXRzdGFuZGluZwotCSAqIGNvbW1hbmRzIHRvIHRoZSBGRVAuICAgSWYgdGhlIHRpbWUgc3BlbnQgd2FpdGluZwotCSAqIGlzIG91dGxhbmRpc2gsIGRlY2xhcmUgdGhlIEZFUCBkZWFkLgotCSAqLwotCWZvciAoY291bnQgPSBkZ2FwX2NvdW50IDs7KSB7Ci0KLQkJaGVhZCA9IHJlYWR3KCYoY21fYWRkci0+Y21faGVhZCkpOwotCQl0YWlsID0gcmVhZHcoJihjbV9hZGRyLT5jbV90YWlsKSk7Ci0KLQkJbiA9IChoZWFkIC0gdGFpbCkgJiAoQ01ETUFYIC0gQ01EU1RBUlQgLSA0KTsKLQotCQlpZiAobiA8PSBuY21kcyAqIHNpemVvZihzdHJ1Y3QgY21fdCkpCi0JCQlicmVhazsKLQotCQlpZiAoLS1jb3VudCA9PSAwKSB7Ci0JCQlEUFJfQ09SRSgoIiVzOiVkIGZhaWxpbmcgYm9hcmQuXG4iLF9fRklMRV9fLCBfX0xJTkVfXykpOwotCQkJY2gtPmNoX2JkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKLQkJCXJldHVybjsKLQkJfQotCQl1ZGVsYXkoMTApOwotCX0KLX0KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogICAgICBkZ2FwX2NtZHcgLSBTZW5kcyBhIDEgd29yZCBjb21tYW5kIHRvIHRoZSBGRVAuCi0gKgotICogICAgICAgICAgICAgIGNoICAgICAgLSBQb2ludGVyIHRvIGNoYW5uZWwgc3RydWN0dXJlLgotICogICAgICAgICAgICAgIGNtZCAgICAgLSBDb21tYW5kIHRvIGJlIHNlbnQuCi0gKiAgICAgICAgICAgICAgd29yZCAgICAtIEludGVnZXIgY29udGFpbmluZyB3b3JkIHRvIGJlIHNlbnQuCi0gKiAgICAgICAgICAgICAgbmNtZHMgICAtIFdhaXQgdW50aWwgbmNtZHMgb3IgZmV3ZXIgY21kcyBhcmUgbGVmdAotICogICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgY21kIGJ1ZmZlciBiZWZvcmUgcmV0dXJuaW5nLgotICoKLSAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdm9pZCBkZ2FwX2NtZHcoc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVjaGFyIGNtZCwgdTE2IHdvcmQsIHVpbnQgbmNtZHMpCi17Ci0JY2hhcgkJKnZhZGRyID0gTlVMTDsKLQlzdHJ1Y3QgY21fdAkqY21fYWRkciA9IE5VTEw7Ci0JdWludAkJY291bnQ7Ci0JdWludAkJbjsKLQl1MTYJCWhlYWQ7Ci0JdTE2CQl0YWlsOwotCi0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIENoZWNrIGlmIGJvYXJkIGlzIHN0aWxsIGFsaXZlLgotCSAqLwotCWlmIChjaC0+Y2hfYmQtPnN0YXRlID09IEJPQVJEX0ZBSUxFRCkgewotCQlEUFJfQ09SRSgoIiVzOiVkIGJvYXJkIGlzIGZhaWxlZCFcbiIsIF9fRklMRV9fLCBfX0xJTkVfXykpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBNYWtlIHN1cmUgdGhlIHBvaW50ZXJzIGFyZSBpbiByYW5nZSBiZWZvcmUKLQkgKiB3cml0aW5nIHRvIHRoZSBGRVAgbWVtb3J5LgotCSAqLwotCXZhZGRyID0gY2gtPmNoX2JkLT5yZV9tYXBfbWVtYmFzZTsKLQlpZiAoIXZhZGRyKQotCQlyZXR1cm47Ci0KLQljbV9hZGRyID0gKHN0cnVjdCBjbV90ICopICh2YWRkciArIENNREJVRik7Ci0JaGVhZCA9IHJlYWR3KCYoY21fYWRkci0+Y21faGVhZCkpOwotCi0JLyoKLQkgKiBGb3JnZXQgaXQgaWYgcG9pbnRlcnMgb3V0IG9mIHJhbmdlLgotCSAqLwotCWlmIChoZWFkID49IChDTURNQVggLSBDTURTVEFSVCkgfHwgKGhlYWQgJiAwMykpIHsKLQkJRFBSX0NPUkUoKCIlczolZCBQb2ludGVycyBvdXQgb2YgcmFuZ2UuICBGYWlsaW5nIGJvYXJkLlxuIixfX0ZJTEVfXywgX19MSU5FX18pKTsKLQkJY2gtPmNoX2JkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogUHV0IHRoZSBkYXRhIGluIHRoZSBjaXJjdWxhciBjb21tYW5kIGJ1ZmZlci4KLQkgKi8KLQl3cml0ZWIoY21kLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyAwKSk7Ci0Jd3JpdGViKCh1Y2hhcikgY2gtPmNoX3BvcnRudW0sIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDEpKTsKLQl3cml0ZXcoKHUxNikgd29yZCwgKGNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMikpOwotCi0JaGVhZCA9IChoZWFkICsgNCkgJiAoQ01ETUFYIC0gQ01EU1RBUlQgLSA0KTsKLQotCXdyaXRldyhoZWFkLCAmKGNtX2FkZHItPmNtX2hlYWQpKTsKLQotCS8qCi0JICogV2FpdCBpZiBuZWNlc3NhcnkgYmVmb3JlIHVwZGF0aW5nIHRoZSBoZWFkCi0JICogcG9pbnRlciB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nCi0JICogY29tbWFuZHMgdG8gdGhlIEZFUC4gICBJZiB0aGUgdGltZSBzcGVudCB3YWl0aW5nCi0JICogaXMgb3V0bGFuZGlzaCwgZGVjbGFyZSB0aGUgRkVQIGRlYWQuCi0JICovCi0JZm9yIChjb3VudCA9IGRnYXBfY291bnQgOzspIHsKLQotCQloZWFkID0gcmVhZHcoJihjbV9hZGRyLT5jbV9oZWFkKSk7Ci0JCXRhaWwgPSByZWFkdygmKGNtX2FkZHItPmNtX3RhaWwpKTsKLQotCQluID0gKGhlYWQgLSB0YWlsKSAmIChDTURNQVggLSBDTURTVEFSVCAtIDQpOwotCi0JCWlmIChuIDw9IG5jbWRzICogc2l6ZW9mKHN0cnVjdCBjbV90KSkKLQkJCWJyZWFrOwotCi0JCWlmICgtLWNvdW50ID09IDApIHsKLQkJCURQUl9DT1JFKCgiJXM6JWQgRmFpbGluZyBib2FyZC5cbiIsX19GSUxFX18sIF9fTElORV9fKSk7Ci0JCQljaC0+Y2hfYmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQkJcmV0dXJuOwotCQl9Ci0JCXVkZWxheSgxMCk7Ci0JfQotfQotCi0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqICAgICAgZGdhcF9jbWR3X2V4dCAtIFNlbmRzIGEgZXh0ZW5kZWQgd29yZCBjb21tYW5kIHRvIHRoZSBGRVAuCi0gKgotICogICAgICAgICAgICAgIGNoICAgICAgLSBQb2ludGVyIHRvIGNoYW5uZWwgc3RydWN0dXJlLgotICogICAgICAgICAgICAgIGNtZCAgICAgLSBDb21tYW5kIHRvIGJlIHNlbnQuCi0gKiAgICAgICAgICAgICAgd29yZCAgICAtIEludGVnZXIgY29udGFpbmluZyB3b3JkIHRvIGJlIHNlbnQuCi0gKiAgICAgICAgICAgICAgbmNtZHMgICAtIFdhaXQgdW50aWwgbmNtZHMgb3IgZmV3ZXIgY21kcyBhcmUgbGVmdAotICogICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgY21kIGJ1ZmZlciBiZWZvcmUgcmV0dXJuaW5nLgotICoKLSAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotc3RhdGljIHZvaWQgZGdhcF9jbWR3X2V4dChzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdTE2IGNtZCwgdTE2IHdvcmQsIHVpbnQgbmNtZHMpCi17Ci0JY2hhcgkJKnZhZGRyID0gTlVMTDsKLQlzdHJ1Y3QgY21fdAkqY21fYWRkciA9IE5VTEw7Ci0JdWludAkJY291bnQ7Ci0JdWludAkJbjsKLQl1MTYJCWhlYWQ7Ci0JdTE2CQl0YWlsOwotCi0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIENoZWNrIGlmIGJvYXJkIGlzIHN0aWxsIGFsaXZlLgotCSAqLwotCWlmIChjaC0+Y2hfYmQtPnN0YXRlID09IEJPQVJEX0ZBSUxFRCkgewotCQlEUFJfQ09SRSgoIiVzOiVkIGJvYXJkIGlzIGZhaWxlZCFcbiIsIF9fRklMRV9fLCBfX0xJTkVfXykpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBNYWtlIHN1cmUgdGhlIHBvaW50ZXJzIGFyZSBpbiByYW5nZSBiZWZvcmUKLQkgKiB3cml0aW5nIHRvIHRoZSBGRVAgbWVtb3J5LgotCSAqLwotCXZhZGRyID0gY2gtPmNoX2JkLT5yZV9tYXBfbWVtYmFzZTsKLQlpZiAoIXZhZGRyKQotCQlyZXR1cm47Ci0KLQljbV9hZGRyID0gKHN0cnVjdCBjbV90ICopICh2YWRkciArIENNREJVRik7Ci0JaGVhZCA9IHJlYWR3KCYoY21fYWRkci0+Y21faGVhZCkpOwotCi0JLyoKLQkgKiBGb3JnZXQgaXQgaWYgcG9pbnRlcnMgb3V0IG9mIHJhbmdlLgotCSAqLwotCWlmIChoZWFkID49IChDTURNQVggLSBDTURTVEFSVCkgfHwgKGhlYWQgJiAwMykpIHsKLQkJRFBSX0NPUkUoKCIlczolZCBQb2ludGVycyBvdXQgb2YgcmFuZ2UuICBGYWlsaW5nIGJvYXJkLlxuIixfX0ZJTEVfXywgX19MSU5FX18pKTsKLQkJY2gtPmNoX2JkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogUHV0IHRoZSBkYXRhIGluIHRoZSBjaXJjdWxhciBjb21tYW5kIGJ1ZmZlci4KLQkgKi8KLQotCS8qIFdyaXRlIGFuIEZGIHRvIHRlbGwgdGhlIEZFUCB0aGF0IHdlIHdhbnQgYW4gZXh0ZW5kZWQgY29tbWFuZCAqLwotCXdyaXRlYigodWNoYXIpIDB4ZmYsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDApKTsKLQotCXdyaXRlYigodWNoYXIpIGNoLT5jaF9wb3J0bnVtLCAodWNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMSkpOwotCXdyaXRldygodTE2KSBjbWQsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDIpKTsKLQotCS8qCi0JICogSWYgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBjb21tYW5kIHdvbid0IGZpdCwKLQkgKiBwdXQgaXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyLgotCSAqLwotCWlmICgoKGhlYWQgKyA0KSA+PSAoKENNRE1BWCAtIENNRFNUQVJUKSkgfHwgKGhlYWQgJiAwMykpKSB7Ci0JCXdyaXRldygodTE2KSB3b3JkLCAoY2hhciAqKSAodmFkZHIgKyBDTURTVEFSVCkpOwotCX0gZWxzZSB7Ci0JCXdyaXRldygodTE2KSB3b3JkLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyA0KSk7Ci0JfQotCi0JaGVhZCA9IChoZWFkICsgOCkgJiAoQ01ETUFYIC0gQ01EU1RBUlQgLSA0KTsKLQotCXdyaXRldyhoZWFkLCAmKGNtX2FkZHItPmNtX2hlYWQpKTsKLQotCS8qCi0JICogV2FpdCBpZiBuZWNlc3NhcnkgYmVmb3JlIHVwZGF0aW5nIHRoZSBoZWFkCi0JICogcG9pbnRlciB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nCi0JICogY29tbWFuZHMgdG8gdGhlIEZFUC4gICBJZiB0aGUgdGltZSBzcGVudCB3YWl0aW5nCi0JICogaXMgb3V0bGFuZGlzaCwgZGVjbGFyZSB0aGUgRkVQIGRlYWQuCi0JICovCi0JZm9yIChjb3VudCA9IGRnYXBfY291bnQgOzspIHsKLQotCQloZWFkID0gcmVhZHcoJihjbV9hZGRyLT5jbV9oZWFkKSk7Ci0JCXRhaWwgPSByZWFkdygmKGNtX2FkZHItPmNtX3RhaWwpKTsKLQotCQluID0gKGhlYWQgLSB0YWlsKSAmIChDTURNQVggLSBDTURTVEFSVCAtIDQpOwotCi0JCWlmIChuIDw9IG5jbWRzICogc2l6ZW9mKHN0cnVjdCBjbV90KSkKLQkJCWJyZWFrOwotCi0JCWlmICgtLWNvdW50ID09IDApIHsKLQkJCURQUl9DT1JFKCgiJXM6JWQgRmFpbGluZyBib2FyZC5cbiIsX19GSUxFX18sIF9fTElORV9fKSk7Ci0JCQljaC0+Y2hfYmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQkJcmV0dXJuOwotCQl9Ci0JCXVkZWxheSgxMCk7Ci0JfQotfQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiAgICAgIGRnYXBfd21vdmUgLSBXcml0ZSBkYXRhIHRvIEZFUCBidWZmZXIuCi0gKgotICogICAgICAgICAgICAgIGNoICAgICAgLSBQb2ludGVyIHRvIGNoYW5uZWwgc3RydWN0dXJlLgotICogICAgICAgICAgICAgIGJ1ZiAgICAgLSBQb2l0ZXIgdG8gY2hhcmFjdGVycyB0byBiZSBtb3ZlZC4KLSAqICAgICAgICAgICAgICBjbnQgICAgIC0gTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gbW92ZS4KLSAqCi0gKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXZvaWQgZGdhcF93bW92ZShzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgY2hhciAqYnVmLCB1aW50IGNudCkKLXsKLQlpbnQgICAgbjsKLQljaGFyICAgKnRhZGRyOwotCXN0cnVjdCBic190ICAgICpiczsKLQl1MTYgICAgaGVhZDsKLQotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBDaGVjayBwYXJhbWV0ZXJzLgotCSAqLwotCWJzICAgPSBjaC0+Y2hfYnM7Ci0JaGVhZCA9IHJlYWR3KCYoYnMtPnR4X2hlYWQpKTsKLQotCS8qCi0JICogSWYgcG9pbnRlcnMgYXJlIG91dCBvZiByYW5nZSwganVzdCByZXR1cm4uCi0JICovCi0JaWYgKChjbnQgPiBjaC0+Y2hfdHNpemUpIHx8ICh1bnNpZ25lZCkoaGVhZCAtIGNoLT5jaF90c3RhcnQpID49IGNoLT5jaF90c2l6ZSkgewotCQlEUFJfQ09SRSgoIiVzOiVkIHBvaW50ZXIgb3V0IG9mIHJhbmdlIiwgX19GSUxFX18sIF9fTElORV9fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIElmIHRoZSB3cml0ZSB3cmFwcyBvdmVyIHRoZSB0b3Agb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlciwKLQkgKiBtb3ZlIHRoZSBwb3J0aW9uIHVwIHRvIHRoZSB3cmFwIHBvaW50LCBhbmQgcmVzZXQgdGhlCi0JICogcG9pbnRlcnMgdG8gdGhlIGJvdHRvbS4KLQkgKi8KLQluID0gY2gtPmNoX3RzdGFydCArIGNoLT5jaF90c2l6ZSAtIGhlYWQ7Ci0KLQlpZiAoY250ID49IG4pIHsKLQkJY250IC09IG47Ci0JCXRhZGRyID0gY2gtPmNoX3RhZGRyICsgaGVhZDsKLQkJbWVtY3B5X3RvaW8odGFkZHIsIGJ1Ziwgbik7Ci0JCWhlYWQgPSBjaC0+Y2hfdHN0YXJ0OwotCQlidWYgKz0gbjsKLQl9Ci0KLQkvKgotCSAqIE1vdmUgcmVzdCBvZiBkYXRhLgotCSAqLwotCXRhZGRyID0gY2gtPmNoX3RhZGRyICsgaGVhZDsKLQluID0gY250OwotCW1lbWNweV90b2lvKHRhZGRyLCBidWYsIG4pOwotCWhlYWQgKz0gY250OwotCi0Jd3JpdGV3KGhlYWQsICYoYnMtPnR4X2hlYWQpKTsKLX0KLQotLyoKLSAqIFJldHJpdmVzIHRoZSBjdXJyZW50IGN1c3RvbSBiYXVkIHJhdGUgZnJvbSBGRVAgbWVtb3J5LAotICogYW5kIHJldHVybnMgaXQgYmFjayB0byB0aGUgdXNlci4KLSAqIFJldHVybnMgMCBvbiBlcnJvci4KLSAqLwotdWludCBkZ2FwX2dldF9jdXN0b21fYmF1ZChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKLXsKLQl1Y2hhciAqdmFkZHI7Ci0JdWxvbmcgb2Zmc2V0ID0gMDsKLQl1aW50IHZhbHVlID0gMDsKLQotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoIWNoLT5jaF9iZCB8fCBjaC0+Y2hfYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCEoY2gtPmNoX2JkLT5iZF9mbGFncyAmIEJEX0ZFUDVQTFVTKSkKLQkJcmV0dXJuIDA7Ci0KLQl2YWRkciA9IGNoLT5jaF9iZC0+cmVfbWFwX21lbWJhc2U7Ci0KLQlpZiAoIXZhZGRyKQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogR28gZ2V0IGZyb20gZmVwIG1lbSwgd2hhdCB0aGUgZmVwCi0JICogYmVsaWV2ZXMgdGhlIGN1c3RvbSBiYXVkIHJhdGUgaXMuCi0JICovCi0Jb2Zmc2V0ID0gKCgoKCoodW5zaWduZWQgc2hvcnQgKikodmFkZHIgKyBFQ1NfU0VHKSkgPDwgNCkgKwotCQkoY2gtPmNoX3BvcnRudW0gKiAweDI4KSArIExJTkVfU1BFRUQpKTsKLQotCXZhbHVlID0gcmVhZHcodmFkZHIgKyBvZmZzZXQpOwotCXJldHVybiB2YWx1ZTsKLX0KLQotCi0vKgotICogQ2FsbHMgdGhlIGZpcm13YXJlIHRvIHJlc2V0IHRoaXMgY2hhbm5lbC4KLSAqLwotdm9pZCBkZ2FwX2Zpcm13YXJlX3Jlc2V0X3BvcnQoc3RydWN0IGNoYW5uZWxfdCAqY2gpCi17Ci0JZGdhcF9jbWRiKGNoLCBDSFJFU0VULCAwLCAwLCAwKTsKLQotCS8qCi0JICogTm93IHRoYXQgdGhlIGNoYW5uZWwgaXMgcmVzZXQsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCi0JICogYWxsIHRoZSBjdXJyZW50IHNldHRpbmdzIGdldCByZWFwcGxpZWQgdG8gdGhlIHBvcnQKLQkgKiBpbiB0aGUgZmlybXdhcmUuCi0JICoKLQkgKiBTbyB3ZSB3aWxsIHNldCB0aGUgZHJpdmVyJ3MgY2FjaGUgb2YgZmlybXdhcmUKLQkgKiBzZXR0aW5ncyBhbGwgdG8gMCwgYW5kIHRoZW4gY2FsbCBwYXJhbS4KLQkgKi8KLQljaC0+Y2hfZmVwaWZsYWcgPSAwOwotCWNoLT5jaF9mZXBjZmxhZyA9IDA7Ci0JY2gtPmNoX2ZlcG9mbGFnID0gMDsKLQljaC0+Y2hfZmVwc3RhcnRjID0gMDsKLQljaC0+Y2hfZmVwc3RvcGMgPSAwOwotCWNoLT5jaF9mZXBhc3RhcnRjID0gMDsKLQljaC0+Y2hfZmVwYXN0b3BjID0gMDsKLQljaC0+Y2hfbW9zdGF0ID0gMDsKLQljaC0+Y2hfaGZsb3cgPSAwOwotfQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiAgICAgIGRnYXBfcGFyYW0gLSBTZXQgRGlnaSBwYXJhbWV0ZXJzLgotICoKLSAqICAgICAgICAgICAgICBzdHJ1Y3QgdHR5X3N0cnVjdCAqICAgICAtIFRUWSBmb3IgcG9ydC4KLSAqCi0gKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCBkZ2FwX3BhcmFtKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGt0ZXJtaW9zICp0czsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IGJzX3QgICAqYnM7Ci0Jc3RydWN0IHVuX3QgICAqdW47Ci0JdTE2CWhlYWQ7Ci0JdTE2CWNmbGFnOwotCXUxNglpZmxhZzsKLQl1Y2hhcgltdmFsOwotCXVjaGFyCWhmbG93OwotCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCi0JCXJldHVybiAtRU5YSU87Ci0KLQl1biA9IChzdHJ1Y3QgdW5fdCAqKSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuIC1FTlhJTzsKLQotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuIC1FTlhJTzsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAtRU5YSU87Ci0KLQlicyA9IGNoLT5jaF9iczsKLQlpZiAoIWJzKQotCQlyZXR1cm4gLUVOWElPOwotCi0JRFBSX1BBUkFNKCgicGFyYW0gc3RhcnQ6IHRkZXY6ICV4IGNmbGFnczogJXggb2ZsYWdzOiAleCBpZmxhZ3M6ICV4XG4iLAotCQljaC0+Y2hfdHVuLnVuX2RldiwgY2gtPmNoX2NfY2ZsYWcsIGNoLT5jaF9jX29mbGFnLCBjaC0+Y2hfY19pZmxhZykpOwotCi0JdHMgPSAmdHR5LT50ZXJtaW9zOwotCi0JLyoKLQkgKiBJZiBiYXVkIHJhdGUgaXMgemVybywgZmx1c2ggcXVldWVzLCBhbmQgc2V0IG12YWwgdG8gZHJvcCBEVFIuCi0JICovCi0JaWYgKChjaC0+Y2hfY19jZmxhZyAmIChDQkFVRCkpID09IDApIHsKLQotCQkvKiBmbHVzaCByeCAqLwotCQloZWFkID0gcmVhZHcoJihjaC0+Y2hfYnMtPnJ4X2hlYWQpKTsKLQkJd3JpdGV3KGhlYWQsICYoY2gtPmNoX2JzLT5yeF90YWlsKSk7Ci0KLQkJLyogZmx1c2ggdHggKi8KLQkJaGVhZCA9IHJlYWR3KCYoY2gtPmNoX2JzLT50eF9oZWFkKSk7Ci0JCXdyaXRldyhoZWFkLCAmKGNoLT5jaF9icy0+dHhfdGFpbCkpOwotCi0JCWNoLT5jaF9mbGFncyB8PSAoQ0hfQkFVRDApOwotCi0JCS8qIERyb3AgUlRTIGFuZCBEVFIgKi8KLQkJY2gtPmNoX212YWwgJj0gfihEX1JUUyhjaCl8RF9EVFIoY2gpKTsKLQkJbXZhbCA9IERfRFRSKGNoKSB8IERfUlRTKGNoKTsKLQkJY2gtPmNoX2JhdWRfaW5mbyA9IDA7Ci0KLQl9IGVsc2UgaWYgKGNoLT5jaF9jdXN0b21fc3BlZWQgJiYgKGJkLT5iZF9mbGFncyAmIEJEX0ZFUDVQTFVTKSkgewotCQkvKgotCQkgKiBUZWxsIHRoZSBmZXAgdG8gZG8gdGhlIGNvbW1hbmQKLQkJICovCi0KLQkJRFBSX1BBUkFNKCgicGFyYW06IFdhbnQgJWQgc3BlZWRcbiIsIGNoLT5jaF9jdXN0b21fc3BlZWQpKTsKLQotCQlkZ2FwX2NtZHdfZXh0KGNoLCAweGZmMDEsIGNoLT5jaF9jdXN0b21fc3BlZWQsIDApOwotCi0JCS8qCi0JCSAqIE5vdyBnbyBnZXQgZnJvbSBmZXAgbWVtLCB3aGF0IHRoZSBmZXAKLQkJICogYmVsaWV2ZXMgdGhlIGN1c3RvbSBiYXVkIHJhdGUgaXMuCi0JCSAqLwotCQljaC0+Y2hfYmF1ZF9pbmZvID0gY2gtPmNoX2N1c3RvbV9zcGVlZCA9IGRnYXBfZ2V0X2N1c3RvbV9iYXVkKGNoKTsKLQotCQlEUFJfUEFSQU0oKCJwYXJhbTogR290ICVkIHNwZWVkXG4iLCBjaC0+Y2hfY3VzdG9tX3NwZWVkKSk7Ci0KLQkJLyogSGFuZGxlIHRyYW5zaXRpb24gZnJvbSBCMCAqLwotCQlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfQkFVRDApIHsKLQkJCWNoLT5jaF9mbGFncyAmPSB+KENIX0JBVUQwKTsKLQkJCWNoLT5jaF9tdmFsIHw9IChEX1JUUyhjaCl8RF9EVFIoY2gpKTsKLQkJfQotCQltdmFsID0gRF9EVFIoY2gpIHwgRF9SVFMoY2gpOwotCi0JfSBlbHNlIHsKLQkJLyoKLQkJICogU2V0IGJhdWQgcmF0ZSwgY2hhcmFjdGVyIHNpemUsIGFuZCBwYXJpdHkuCi0JCSAqLwotCi0KLQkJaW50IGlpbmRleCA9IDA7Ci0JCWludCBqaW5kZXggPSAwOwotCQlpbnQgYmF1ZCA9IDA7Ci0KLQkJdWxvbmcgYmF1ZHNbNF1bMTZdID0gewotCQkJeyAvKiBzbG93YmF1ZCAqLwotCQkJCTAsCTUwLAk3NSwJMTEwLAotCQkJCTEzNCwJMTUwLAkyMDAsCTMwMCwKLQkJCQk2MDAsCTEyMDAsCTE4MDAsCTI0MDAsCi0JCQkJNDgwMCwJOTYwMCwJMTkyMDAsCTM4NDAwIH0sCi0JCQl7IC8qIHNsb3diYXVkICYgQ0JBVURFWCAqLwotCQkJCTAsCTU3NjAwLAkxMTUyMDAsCTIzMDQwMCwKLQkJCQk0NjA4MDAsCTE1MCwJMjAwLAk5MjE2MDAsCi0JCQkJNjAwLAkxMjAwLAkxODAwLAkyNDAwLAotCQkJCTQ4MDAsCTk2MDAsCTE5MjAwLAkzODQwMCB9LAotCQkJeyAvKiBmYXN0YmF1ZCAqLwotCQkJCTAsCTU3NjAwLAk3NjgwMCwJMTE1MjAwLAotCQkJCTE0NDAwLAk1NzYwMCwJMjMwNDAwLAk3NjgwMCwKLQkJCQkxMTUyMDAsCTIzMDQwMCwJMjg4MDAsCTQ2MDgwMCwKLQkJCQk5MjE2MDAsCTk2MDAsCTE5MjAwLAkzODQwMCB9LAotCQkJeyAvKiBmYXN0YmF1ZCAmIENCQVVERVggKi8KLQkJCQkwLAk1NzYwMCwJMTE1MjAwLAkyMzA0MDAsCi0JCQkJNDYwODAwLAkxNTAsCTIwMCwJOTIxNjAwLAotCQkJCTYwMCwJMTIwMCwJMTgwMCwJMjQwMCwKLQkJCQk0ODAwLAk5NjAwLAkxOTIwMCwJMzg0MDAgfQotCQl9OwotCi0JCS8qIE9ubHkgdXNlIHRoZSBUWFByaW50IGJhdWQgcmF0ZSBpZiB0aGUgdGVybWluYWwgdW5pdCBpcyBOT1Qgb3BlbiAqLwotCQlpZiAoIShjaC0+Y2hfdHVuLnVuX2ZsYWdzICYgVU5fSVNPUEVOKSAmJiAodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkpCi0JCQliYXVkID0gQ19CQVVEKGNoLT5jaF9wdW4udW5fdHR5KSAmIDB4ZmY7Ci0JCWVsc2UKLQkJCWJhdWQgPSBDX0JBVUQoY2gtPmNoX3R1bi51bl90dHkpICYgMHhmZjsKLQotCQlpZiAoY2gtPmNoX2NfY2ZsYWcgJiBDQkFVREVYKQotCQkJaWluZGV4ID0gMTsKLQotCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfRkFTVCkKLQkJCWlpbmRleCArPSAyOwotCi0JCWppbmRleCA9IGJhdWQ7Ci0KLQkJaWYgKChpaW5kZXggPj0gMCkgJiYgKGlpbmRleCA8IDQpICYmIChqaW5kZXggPj0gMCkgJiYgKGppbmRleCA8IDE2KSkgewotCQkJYmF1ZCA9IGJhdWRzW2lpbmRleF1bamluZGV4XTsKLQkJfSBlbHNlIHsKLQkJCURQUl9JT0NUTCgoImJhdWQgaW5kaWNlcyB3ZXJlIG91dCBvZiByYW5nZSAoJWQpKCVkKSIsCi0JCQkJaWluZGV4LCBqaW5kZXgpKTsKLQkJCWJhdWQgPSAwOwotCQl9Ci0KLQkJaWYgKGJhdWQgPT0gMCkKLQkJCWJhdWQgPSA5NjAwOwotCi0JCWNoLT5jaF9iYXVkX2luZm8gPSBiYXVkOwotCi0KLQkJLyoKLQkJICogQ0JBVUQgaGFzIGJpdCBwb3NpdGlvbiAweDEwMDAgc2V0IHRoZXNlIGRheXMgdG8gaW5kaWNhdGUgTGludXgKLQkJICogYmF1ZCByYXRlIHJlbWFwLgotCQkgKiBXZSB1c2UgYSBkaWZmZXJlbnQgYml0IGFzc2lnbm1lbnQgZm9yIGhpZ2ggc3BlZWQuICBDbGVhciB0aGlzCi0JCSAqIGJpdCBvdXQgd2hpbGUgZ3JhYmJpbmcgdGhlIHBhcnRzIG9mICJjZmxhZyIgd2Ugd2FudC4KLQkJICovCi0JCWNmbGFnID0gY2gtPmNoX2NfY2ZsYWcgJiAoKENCQVVEIF4gQ0JBVURFWCkgfCBQQVJPREQgfCBQQVJFTkIgfCBDU1RPUEIgfCBDU0laRSk7Ci0KLQkJLyoKLQkJICogSFVQQ0wgYml0IGlzIHVzZWQgYnkgRkVQIHRvIGluZGljYXRlIGZhc3QgYmF1ZAotCQkgKiB0YWJsZSBpcyB0byBiZSB1c2VkLgotCQkgKi8KLQkJaWYgKChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9GQVNUKSB8fCAoY2gtPmNoX2NfY2ZsYWcgJiBDQkFVREVYKSkKLQkJCWNmbGFnIHw9IEhVUENMOwotCi0KLQkJaWYgKChjaC0+Y2hfY19jZmxhZyAmIENCQVVERVgpICYmICEoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfRkFTVCkpIHsKLQkJLyoKLQkJICogVGhlIGJlbG93IGNvZGUgaXMgdHJ5aW5nIHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYmF1ZCByYXRlcwotCQkgKiAxMTUyMDAsIDIzMDQwMCwgNDYwODAwLCA5MjE2MDAgYXJlIHJlbWFwcGVkLiAgV2UgdXNlIGV4Y2x1c2l2ZSBvcgotCQkgKiBiZWNhdXNlIHRoZSB2YXJpb3VzIGJhdWQgcmF0ZXMgc2hhcmUgY29tbW9uIGJpdCBwb3NpdGlvbnMKLQkJICogYW5kIHRoZXJlZm9yZSBjYW4ndCBiZSB0ZXN0ZWQgZm9yIGVhc2lseS4KLQkJICovCi0JCQl0Y2ZsYWdfdCB0Y2ZsYWcgPSAoY2gtPmNoX2NfY2ZsYWcgJiBDQkFVRCkgfCBDQkFVREVYOwotCQkJaW50IGJhdWRwYXJ0ID0gMDsKLQotCQkJLyogTWFwIGhpZ2ggc3BlZWQgcmVxdWVzdHMgdG8gaW5kZXggaW50byBGRVAncyBiYXVkIHRhYmxlICovCi0JCQlzd2l0Y2ggKHRjZmxhZykgewotCQkJY2FzZSBCNTc2MDAgOgotCQkJCWJhdWRwYXJ0ID0gMTsKLQkJCQlicmVhazsKLSNpZmRlZiBCNzY4MDAKLQkJCWNhc2UgQjc2ODAwIDoKLQkJCQliYXVkcGFydCA9IDI7Ci0JCQkJYnJlYWs7Ci0jZW5kaWYKLQkJCWNhc2UgQjExNTIwMCA6Ci0JCQkJYmF1ZHBhcnQgPSAzOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCMjMwNDAwIDoKLQkJCQliYXVkcGFydCA9IDk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEI0NjA4MDAgOgotCQkJCWJhdWRwYXJ0ID0gMTE7Ci0JCQkJYnJlYWs7Ci0jaWZkZWYgQjkyMTYwMAotCQkJY2FzZSBCOTIxNjAwIDoKLQkJCQliYXVkcGFydCA9IDEyOwotCQkJCWJyZWFrOwotI2VuZGlmCi0JCQlkZWZhdWx0OgotCQkJCWJhdWRwYXJ0ID0gMDsKLQkJCX0KLQotCQkJaWYgKGJhdWRwYXJ0KQotCQkJCWNmbGFnID0gKGNmbGFnICYgfihDQkFVRCB8IENCQVVERVgpKSB8IGJhdWRwYXJ0OwotCQl9Ci0KLQkJY2ZsYWcgJj0gMHhmZmZmOwotCi0JCWlmIChjZmxhZyAhPSBjaC0+Y2hfZmVwY2ZsYWcpIHsKLQkJCWNoLT5jaF9mZXBjZmxhZyA9ICh1MTYpIChjZmxhZyAmIDB4ZmZmZik7Ci0KLQkJCS8qIE9rYXkgdG8gaGF2ZSBjaGFubmVsIGFuZCBib2FyZCBsb2NrcyBoZWxkIGNhbGxpbmcgdGhpcyAqLwotCQkJZGdhcF9jbWR3KGNoLCBTQ0ZMQUcsICh1MTYpIGNmbGFnLCAwKTsKLQkJfQotCi0JCS8qIEhhbmRsZSB0cmFuc2l0aW9uIGZyb20gQjAgKi8KLQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX0JBVUQwKSB7Ci0JCQljaC0+Y2hfZmxhZ3MgJj0gfihDSF9CQVVEMCk7Ci0JCQljaC0+Y2hfbXZhbCB8PSAoRF9SVFMoY2gpfERfRFRSKGNoKSk7Ci0JCX0KLQkJbXZhbCA9IERfRFRSKGNoKSB8IERfUlRTKGNoKTsKLQl9Ci0KLQkvKgotCSAqIEdldCBpbnB1dCBmbGFncy4KLQkgKi8KLQlpZmxhZyA9IGNoLT5jaF9jX2lmbGFnICYgKElHTkJSSyB8IEJSS0lOVCB8IElHTlBBUiB8IFBBUk1SSyB8IElOUENLIHwgSVNUUklQIHwgSVhPTiB8IElYQU5ZIHwgSVhPRkYpOwotCi0JaWYgKChjaC0+Y2hfc3RhcnRjID09IF9QT1NJWF9WRElTQUJMRSkgfHwgKGNoLT5jaF9zdG9wYyA9PSBfUE9TSVhfVkRJU0FCTEUpKSB7Ci0JCWlmbGFnICY9IH4oSVhPTiB8IElYT0ZGKTsKLQkJY2gtPmNoX2NfaWZsYWcgJj0gfihJWE9OIHwgSVhPRkYpOwotCX0KLQotCS8qCi0JICogT25seSB0aGUgSUJNIFhyIGNhcmQgY2FuIHN3aXRjaCBiZXR3ZWVuCi0JICogMjMyIGFuZCA0MjIgbW9kZXMgb24gdGhlIGZseQotCSAqLwotCWlmIChiZC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfWFJfSUJNX0RJRCkgewotCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfNDIyKQotCQkJZGdhcF9jbWRiKGNoLCBTQ09NTU9ERSwgTU9ERV80MjIsIDAsIDApOwotCQllbHNlCi0JCQlkZ2FwX2NtZGIoY2gsIFNDT01NT0RFLCBNT0RFXzIzMiwgMCwgMCk7Ci0JfQotCi0JaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX0FMVFBJTikKLQkJaWZsYWcgfD0gSUFMVFBJTiA7Ci0KLQlpZiAoaWZsYWcgIT0gY2gtPmNoX2ZlcGlmbGFnKSB7Ci0JCWNoLT5jaF9mZXBpZmxhZyA9IGlmbGFnOwotCi0JCS8qIE9rYXkgdG8gaGF2ZSBjaGFubmVsIGFuZCBib2FyZCBsb2NrcyBoZWxkIGNhbGxpbmcgdGhpcyAqLwotCQlkZ2FwX2NtZHcoY2gsIFNJRkxBRywgKHUxNikgY2gtPmNoX2ZlcGlmbGFnLCAwKTsKLQl9Ci0KLQkvKgotCSAqIFNlbGVjdCBoYXJkd2FyZSBoYW5kc2hha2luZy4KLQkgKi8KLQloZmxvdyA9IDA7Ci0KLQlpZiAoY2gtPmNoX2NfY2ZsYWcgJiBDUlRTQ1RTKSB7Ci0JCWhmbG93IHw9IChEX1JUUyhjaCkgfCBEX0NUUyhjaCkpOwotCX0KLQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIFJUU1BBQ0UpCi0JCWhmbG93IHw9IERfUlRTKGNoKTsKLQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERUUlBBQ0UpCi0JCWhmbG93IHw9IERfRFRSKGNoKTsKLQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIENUU1BBQ0UpCi0JCWhmbG93IHw9IERfQ1RTKGNoKTsKLQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERTUlBBQ0UpCi0JCWhmbG93IHw9IERfRFNSKGNoKTsKLQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERDRFBBQ0UpCi0JCWhmbG93IHw9IERfQ0QoY2gpOwotCi0JaWYgKGhmbG93ICE9IGNoLT5jaF9oZmxvdykgewotCQljaC0+Y2hfaGZsb3cgPSBoZmxvdzsKLQotCQkvKiBPa2F5IHRvIGhhdmUgY2hhbm5lbCBhbmQgYm9hcmQgbG9ja3MgaGVsZCBjYWxsaW5nIHRoaXMgKi8KLQkJZGdhcF9jbWRiKGNoLCBTSEZMT1csICh1Y2hhcikgaGZsb3csIDB4ZmYsIDApOwotCX0KLQotCi0JLyoKLQkgKiBTZXQgUlRTIGFuZC9vciBEVFIgVG9nZ2xlIGlmIG5lZWRlZCwgYnV0IG9ubHkgaWYgcHJvZHVjdCBpcyBGRVA1KyBiYXNlZC4KLQkgKi8KLQlpZiAoYmQtPmJkX2ZsYWdzICYgQkRfRkVQNVBMVVMpIHsKLQkJdTE2IGhmbG93MiA9IDA7Ci0JCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9SVFNfVE9HR0xFKSB7Ci0JCQloZmxvdzIgfD0gKERfUlRTKGNoKSk7Ci0JCX0KLQkJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX0RUUl9UT0dHTEUpIHsKLQkJCWhmbG93MiB8PSAoRF9EVFIoY2gpKTsKLQkJfQotCi0JCWRnYXBfY21kd19leHQoY2gsIDB4ZmYwMywgaGZsb3cyLCAwKTsKLQl9Ci0KLQkvKgotCSAqIFNldCBtb2RlbSBjb250cm9sIGxpbmVzLgotCSAqLwotCi0JbXZhbCBePSBjaC0+Y2hfbWZvcmNlICYgKG12YWwgXiBjaC0+Y2hfbXZhbCk7Ci0KLQlEUFJfUEFSQU0oKCJkZ2FwX3BhcmFtOiBtdmFsOiAleCBjaF9tZm9yY2U6ICV4IGNoX212YWw6ICV4IGNoX21vc3RhdDogJXhcbiIsCi0JCW12YWwsIGNoLT5jaF9tZm9yY2UsIGNoLT5jaF9tdmFsLCBjaC0+Y2hfbW9zdGF0KSk7Ci0KLQlpZiAoY2gtPmNoX21vc3RhdCBeIG12YWwpIHsKLQkJY2gtPmNoX21vc3RhdCA9IG12YWw7Ci0KLQkJLyogT2theSB0byBoYXZlIGNoYW5uZWwgYW5kIGJvYXJkIGxvY2tzIGhlbGQgY2FsbGluZyB0aGlzICovCi0JCURQUl9QQVJBTSgoImRnYXBfcGFyYW06IFNlbmRpbmcgU01PREVNIG12YWw6ICV4XG4iLCBtdmFsKSk7Ci0JCWRnYXBfY21kYihjaCwgU01PREVNLCAodWNoYXIpIG12YWwsIERfUlRTKGNoKXxEX0RUUihjaCksIDApOwotCX0KLQotCS8qCi0JICogUmVhZCBtb2RlbSBzaWduYWxzLCBhbmQgdGhlbiBjYWxsIGNhcnJpZXIgZnVuY3Rpb24uCi0JICovCi0JY2gtPmNoX21pc3RhdCA9IHJlYWRiKCYoYnMtPm1fc3RhdCkpOwotCWRnYXBfY2FycmllcihjaCk7Ci0KLQkvKgotCSAqIFNldCB0aGUgc3RhcnQgYW5kIHN0b3AgY2hhcmFjdGVycy4KLQkgKi8KLQlpZiAoY2gtPmNoX3N0YXJ0YyAhPSBjaC0+Y2hfZmVwc3RhcnRjIHx8IGNoLT5jaF9zdG9wYyAhPSBjaC0+Y2hfZmVwc3RvcGMpIHsKLQkJY2gtPmNoX2ZlcHN0YXJ0YyA9IGNoLT5jaF9zdGFydGM7Ci0JCWNoLT5jaF9mZXBzdG9wYyA9ICBjaC0+Y2hfc3RvcGM7Ci0KLQkJLyogT2theSB0byBoYXZlIGNoYW5uZWwgYW5kIGJvYXJkIGxvY2tzIGhlbGQgY2FsbGluZyB0aGlzICovCi0JCWRnYXBfY21kYihjaCwgU0ZMT1dDLCBjaC0+Y2hfZmVwc3RhcnRjLCBjaC0+Y2hfZmVwc3RvcGMsIDApOwotCX0KLQotCS8qCi0JICogU2V0IHRoZSBBdXhpbGlhcnkgc3RhcnQgYW5kIHN0b3AgY2hhcmFjdGVycy4KLQkgKi8KLQlpZiAoY2gtPmNoX2FzdGFydGMgIT0gY2gtPmNoX2ZlcGFzdGFydGMgfHwgY2gtPmNoX2FzdG9wYyAhPSBjaC0+Y2hfZmVwYXN0b3BjKSB7Ci0JCWNoLT5jaF9mZXBhc3RhcnRjID0gY2gtPmNoX2FzdGFydGM7Ci0JCWNoLT5jaF9mZXBhc3RvcGMgPSBjaC0+Y2hfYXN0b3BjOwotCi0JCS8qIE9rYXkgdG8gaGF2ZSBjaGFubmVsIGFuZCBib2FyZCBsb2NrcyBoZWxkIGNhbGxpbmcgdGhpcyAqLwotCQlkZ2FwX2NtZGIoY2gsIFNBRkxPV0MsIGNoLT5jaF9mZXBhc3RhcnRjLCBjaC0+Y2hfZmVwYXN0b3BjLCAwKTsKLQl9Ci0KLQlEUFJfUEFSQU0oKCJwYXJhbSBmaW5pc2hcbiIpKTsKLQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBkZ2FwX3Bhcml0eV9zY2FuKCkKLSAqCi0gKiBDb252ZXJ0IHRoZSBGRVA1IHdheSBvZiByZXBvcnRpbmcgcGFyaXR5IGVycm9ycyBhbmQgYnJlYWtzIGludG8KLSAqIHRoZSBMaW51eCBsaW5lIGRpc2NpcGxpbmUgd2F5LgotICovCi12b2lkIGRnYXBfcGFyaXR5X3NjYW4oc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVuc2lnbmVkIGNoYXIgKmNidWYsIHVuc2lnbmVkIGNoYXIgKmZidWYsIGludCAqbGVuKQotewotCWludCBsID0gKmxlbjsKLQlpbnQgY291bnQgPSAwOwotCXVuc2lnbmVkIGNoYXIgKmluLCAqY291dCwgKmZvdXQ7Ci0JdW5zaWduZWQgY2hhciBjOwotCi0JaW4gPSBjYnVmOwotCWNvdXQgPSBjYnVmOwotCWZvdXQgPSBmYnVmOwotCi0JRFBSX1BTQ0FOKCgiZGdhcF9wYXJpdHlfc2NhbiBzdGFydFxuIikpOwotCi0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQl3aGlsZSAobC0tKSB7Ci0JCWMgPSAqaW4rKzsKLQkJc3dpdGNoIChjaC0+cHNjYW5fc3RhdGUpIHsKLQkJZGVmYXVsdDoKLQkJCS8qIHJlc2V0IHRvIHNhbml0eSBhbmQgZmFsbCB0aHJvdWdoICovCi0JCQljaC0+cHNjYW5fc3RhdGUgPSAwOwotCi0JCWNhc2UgMDoKLQkJCS8qIE5vIEZGIHNlZW4geWV0ICovCi0JCQlpZiAoYyA9PSAodW5zaWduZWQgY2hhcikgJ1wzNzcnKSB7Ci0JCQkJLyogZGVsZXRlIHRoaXMgY2hhcmFjdGVyIGZyb20gc3RyZWFtICovCi0JCQkJY2gtPnBzY2FuX3N0YXRlID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJKmNvdXQrKyA9IGM7Ci0JCQkJKmZvdXQrKyA9IFRUWV9OT1JNQUw7Ci0JCQkJY291bnQgKz0gMTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgMToKLQkJCS8qIGZpcnN0IEZGIHNlZW4gKi8KLQkJCWlmIChjID09ICh1bnNpZ25lZCBjaGFyKSAnXDM3NycpIHsKLQkJCQkvKiBkb3VibGVkIGZmLCB0cmFuc2Zvcm0gdG8gc2luZ2xlIGZmICovCi0JCQkJKmNvdXQrKyA9IGM7Ci0JCQkJKmZvdXQrKyA9IFRUWV9OT1JNQUw7Ci0JCQkJY291bnQgKz0gMTsKLQkJCQljaC0+cHNjYW5fc3RhdGUgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBzYXZlIHZhbHVlIGV4YW1pbmF0aW9uIGluIG5leHQgc3RhdGUgKi8KLQkJCQljaC0+cHNjYW5fc2F2ZWNoYXIgPSBjOwotCQkJCWNoLT5wc2Nhbl9zdGF0ZSA9IDI7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIDI6Ci0JCQkvKiB0aGlyZCBjaGFyYWN0ZXIgb2YgZmYgc2VxdWVuY2UgKi8KLQotCQkJKmNvdXQrKyA9IGM7Ci0KLQkJCWlmIChjaC0+cHNjYW5fc2F2ZWNoYXIgPT0gMHgwKSB7Ci0KLQkJCQlpZiAoYyA9PSAweDApIHsKLQkJCQkJRFBSX1BTQ0FOKCgiZGdhcF9wYXJpdHlfc2NhbiBpbiAzcmQgY2hhciBvZiBmZiBzZXEuIGM6ICV4IHNldHRpbmcgYnJlYWsuXG4iLCBjKSk7Ci0JCQkJCWNoLT5jaF9lcnJfYnJlYWsrKzsKLQkJCQkJKmZvdXQrKyA9IFRUWV9CUkVBSzsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCURQUl9QU0NBTigoImRnYXBfcGFyaXR5X3NjYW4gaW4gM3JkIGNoYXIgb2YgZmYgc2VxLiBjOiAleCBzZXR0aW5nIHBhcml0eS5cbiIsIGMpKTsKLQkJCQkJY2gtPmNoX2Vycl9wYXJpdHkrKzsKLQkJCQkJKmZvdXQrKyA9IFRUWV9QQVJJVFk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJRFBSX1BTQ0FOKCgiJXM6JWQgTG9naWMgRXJyb3IuXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pKTsKLQkJCX0KLQotCQkJY291bnQgKz0gMTsKLQkJCWNoLT5wc2Nhbl9zdGF0ZSA9IDA7Ci0JCX0KLQl9Ci0JKmxlbiA9IGNvdW50OwotCURQUl9QU0NBTigoImRnYXBfcGFyaXR5X3NjYW4gZmluaXNoXG4iKSk7Ci19Ci0KLQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiAgICAgIGRnYXBfZXZlbnQgLSBGRVAgdG8gaG9zdCBldmVudCBwcm9jZXNzaW5nIHJvdXRpbmUuCi0gKgotICogICAgICAgICAgICAgIGJkICAgICAtIEJvYXJkIG9mIGN1cnJlbnQgZXZlbnQuCi0gKgotICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgaW50IGRnYXBfZXZlbnQoc3RydWN0IGJvYXJkX3QgKmJkKQotewotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXVsb25nCQlsb2NrX2ZsYWdzOwotCXVsb25nCQlsb2NrX2ZsYWdzMjsKLQlzdHJ1Y3QgYnNfdAkqYnM7Ci0JdWNoYXIJCSpldmVudDsKLQl1Y2hhcgkJKnZhZGRyID0gTlVMTDsKLQlzdHJ1Y3QgZXZfdAkqZWFkZHIgPSBOVUxMOwotCXVpbnQJCWhlYWQ7Ci0JdWludAkJdGFpbDsKLQlpbnQJCXBvcnQ7Ci0JaW50CQlyZWFzb247Ci0JaW50CQltb2RlbTsKLQlpbnQJCWIxOwotCi0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuIC1FTlhJTzsKLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQl2YWRkciA9IGJkLT5yZV9tYXBfbWVtYmFzZTsKLQotCWlmICghdmFkZHIpIHsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCWVhZGRyID0gKHN0cnVjdCBldl90ICopICh2YWRkciArIEVWQlVGKTsKLQotCS8qIEdldCBvdXIgaGVhZCBhbmQgdGFpbCAqLwotCWhlYWQgPSByZWFkdygmKGVhZGRyLT5ldl9oZWFkKSk7Ci0JdGFpbCA9IHJlYWR3KCYoZWFkZHItPmV2X3RhaWwpKTsKLQotCS8qCi0JICogRm9yZ2V0IGl0IGlmIHBvaW50ZXJzIG91dCBvZiByYW5nZS4KLQkgKi8KLQotCWlmIChoZWFkID49IEVWTUFYIC0gRVZTVEFSVCB8fCB0YWlsID49IEVWTUFYIC0gRVZTVEFSVCB8fAotCSAgICAoaGVhZCB8IHRhaWwpICYgMDMpIHsKLQkJRFBSX0VWRU5UKCgic2hvdWxkIGJlIGNhbGxpbmcgeHhmYWlsICVkXG4iLCBfX0xJTkVfXykpOwotCQkvKiBMZXQgZ28gb2YgYm9hcmQgbG9jayAqLwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JLyoKLQkgKiBMb29wIHRvIHByb2Nlc3MgYWxsIHRoZSBldmVudHMgaW4gdGhlIGJ1ZmZlci4KLQkgKi8KLQl3aGlsZSAodGFpbCAhPSBoZWFkKSB7Ci0KLQkJLyoKLQkJICogR2V0IGludGVycnVwdCBpbmZvcm1hdGlvbi4KLQkJICovCi0KLQkJZXZlbnQgPSBiZC0+cmVfbWFwX21lbWJhc2UgKyB0YWlsICsgRVZTVEFSVDsKLQotCQlwb3J0ICAgPSBldmVudFswXTsKLQkJcmVhc29uID0gZXZlbnRbMV07Ci0JCW1vZGVtICA9IGV2ZW50WzJdOwotCQliMSAgICAgPSBldmVudFszXTsKLQotCQlEUFJfRVZFTlQoKCJldmVudDogamlmZmllczogJWxkIHBvcnQ6ICVkIHJlYXNvbjogJXggbW9kZW06ICV4XG4iLAotCQkJamlmZmllcywgcG9ydCwgcmVhc29uLCBtb2RlbSkpOwotCi0JCS8qCi0JCSAqIE1ha2Ugc3VyZSB0aGUgaW50ZXJydXB0IGlzIHZhbGlkLgotCQkgKi8KLQkJaWYgKHBvcnQgPj0gYmQtPm5hc3luYykKLQkJCWdvdG8gbmV4dDsKLQotCQlpZiAoIShyZWFzb24gJiAoSUZNT0RFTSB8IElGQlJFQUsgfCBJRlRMVyB8IElGVEVNIHwgSUZEQVRBKSkpIHsKLQkJCWdvdG8gbmV4dDsKLQkJfQotCi0JCWNoID0gYmQtPmNoYW5uZWxzW3BvcnRdOwotCi0JCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykgewotCQkJZ290byBuZXh0OwotCQl9Ci0KLQkJLyoKLQkJICogSWYgd2UgaGF2ZSBtYWRlIGl0IGhlcmUsIHRoZSBldmVudCB3YXMgdmFsaWQuCi0JCSAqIExvY2sgZG93biB0aGUgY2hhbm5lbC4KLQkJICovCi0JCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JCWJzID0gY2gtPmNoX2JzOwotCi0JCWlmICghYnMpIHsKLQkJCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCQlnb3RvIG5leHQ7Ci0JCX0KLQotCQkvKgotCQkgKiBQcm9jZXNzIHJlY2VpdmVkIGRhdGEuCi0JCSAqLwotCQlpZiAocmVhc29uICYgSUZEQVRBKSB7Ci0KLQkJCS8qCi0JCQkgKiBBTEwgTE9DS1MgKk1VU1QqIEJFIERST1BQRUQgQkVGT1JFIENBTExJTkcgSU5QVVQhCi0JCQkgKiBpbnB1dCBjb3VsZCBzZW5kIHNvbWUgZGF0YSB0byBsZCwgd2hpY2ggaW4gdHVybgotCQkJICogY291bGQgZG8gYSBjYWxsYmFjayB0byBvbmUgb2Ygb3VyIG90aGVyIGZ1bmN0aW9ucy4KLQkJCSAqLwotCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCQkJZGdhcF9pbnB1dChjaCk7Ci0KLQkJCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX1JBQ1RJVkUpCi0JCQkJY2gtPmNoX2ZsYWdzIHw9IENIX1JFTkFCTEU7Ci0JCQllbHNlCi0JCQkJd3JpdGViKDEsICYoYnMtPmlkYXRhKSk7Ci0KLQkJCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9SV0FJVCkgewotCQkJCWNoLT5jaF9mbGFncyAmPSB+Q0hfUldBSVQ7Ci0KLQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF90dW4udW5fZmxhZ3Nfd2FpdCk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBQcm9jZXNzIE1vZGVtIGNoYW5nZSBzaWduYWxzLgotCQkgKi8KLQkJaWYgKHJlYXNvbiAmIElGTU9ERU0pIHsKLQkJCWNoLT5jaF9taXN0YXQgPSBtb2RlbTsKLQkJCWRnYXBfY2FycmllcihjaCk7Ci0JCX0KLQotCQkvKgotCQkgKiBQcm9jZXNzIGJyZWFrLgotCQkgKi8KLQkJaWYgKHJlYXNvbiAmIElGQlJFQUspIHsKLQotCQkJRFBSX0VWRU5UKCgiZ290IElGQlJFQUtcbiIpKTsKLQotCQkJaWYgKGNoLT5jaF90dW4udW5fdHR5KSB7Ci0JCQkJLyogQSBicmVhayBoYXMgYmVlbiBpbmRpY2F0ZWQgKi8KLQkJCQljaC0+Y2hfZXJyX2JyZWFrKys7Ci0JCQkJdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20oY2gtPmNoX3R1bi51bl90dHktPnBvcnQsIDEpOwotCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKGNoLT5jaF90dW4udW5fdHR5LT5wb3J0LCAwLCBUVFlfQlJFQUspOwotCQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKGNoLT5jaF90dW4udW5fdHR5LT5wb3J0KTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFByb2Nlc3MgVHJhbnNtaXQgbG93LgotCQkgKi8KLQkJaWYgKHJlYXNvbiAmIElGVExXKSB7Ci0KLQkJCURQUl9FVkVOVCgoImV2ZW50OiBnb3QgbG93IGV2ZW50XG4iKSk7Ci0KLQkJCWlmIChjaC0+Y2hfdHVuLnVuX2ZsYWdzICYgVU5fTE9XKSB7Ci0JCQkJY2gtPmNoX3R1bi51bl9mbGFncyAmPSB+VU5fTE9XOwotCi0JCQkJaWYgKGNoLT5jaF90dW4udW5fZmxhZ3MgJiBVTl9JU09QRU4pIHsKLQkJCQkJaWYgKChjaC0+Y2hfdHVuLnVuX3R0eS0+ZmxhZ3MgJgotCQkJCQkgICAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKSkgJiYKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMxKQotCQkJCQkJY2gtPmNoX3R1bi51bl90dHktPmxkaXNjLT5vcHMtPndyaXRlX3dha2V1cCkKLSNlbHNlCi0JCQkJCQljaC0+Y2hfdHVuLnVuX3R0eS0+bGRpc2Mub3BzLT53cml0ZV93YWtldXApCi0jZW5kaWYKLQkJCQkJewotCQkJCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMxKQotCQkJCQkJKGNoLT5jaF90dW4udW5fdHR5LT5sZGlzYy0+b3BzLT53cml0ZV93YWtldXApKGNoLT5jaF90dW4udW5fdHR5KTsKLSNlbHNlCi0JCQkJCQkoY2gtPmNoX3R1bi51bl90dHktPmxkaXNjLm9wcy0+d3JpdGVfd2FrZXVwKShjaC0+Y2hfdHVuLnVuX3R0eSk7Ci0jZW5kaWYKLQkJCQkJCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCQkJCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCQkJfQotCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF90dW4udW5fdHR5LT53cml0ZV93YWl0KTsKLQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfdHVuLnVuX2ZsYWdzX3dhaXQpOwotCi0JCQkJCURQUl9FVkVOVCgoImV2ZW50OiBHb3QgbG93IGV2ZW50LiBqaWZmaWVzOiAlbHVcbiIsIGppZmZpZXMpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjaC0+Y2hfcHVuLnVuX2ZsYWdzICYgVU5fTE9XKSB7Ci0JCQkJY2gtPmNoX3B1bi51bl9mbGFncyAmPSB+VU5fTE9XOwotCQkJCWlmIChjaC0+Y2hfcHVuLnVuX2ZsYWdzICYgVU5fSVNPUEVOKSB7Ci0JCQkJCWlmICgoY2gtPmNoX3B1bi51bl90dHktPmZsYWdzICYKLQkJCQkJICAgKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCkpICYmCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzMSkKLQkJCQkJCWNoLT5jaF9wdW4udW5fdHR5LT5sZGlzYy0+b3BzLT53cml0ZV93YWtldXApCi0jZWxzZQotCQkJCQkJY2gtPmNoX3B1bi51bl90dHktPmxkaXNjLm9wcy0+d3JpdGVfd2FrZXVwKQotI2VuZGlmCi0JCQkJCXsKLQkJCQkJCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCQkJCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzMSkKLQkJCQkJCShjaC0+Y2hfcHVuLnVuX3R0eS0+bGRpc2MtPm9wcy0+d3JpdGVfd2FrZXVwKShjaC0+Y2hfcHVuLnVuX3R0eSk7Ci0jZWxzZQotCQkJCQkJKGNoLT5jaF9wdW4udW5fdHR5LT5sZGlzYy5vcHMtPndyaXRlX3dha2V1cCkoY2gtPmNoX3B1bi51bl90dHkpOwotI2VuZGlmCi0JCQkJCQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJCQkJREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCQkJCX0KLQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfcHVuLnVuX3R0eS0+d3JpdGVfd2FpdCk7Ci0JCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3B1bi51bl9mbGFnc193YWl0KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9XTE9XKSB7Ci0JCQkJY2gtPmNoX2ZsYWdzICY9IH5DSF9XTE9XOwotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX2ZsYWdzX3dhaXQpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogUHJvY2VzcyBUcmFuc21pdCBlbXB0eS4KLQkJICovCi0JCWlmIChyZWFzb24gJiBJRlRFTSkgewotCQkJRFBSX0VWRU5UKCgiZXZlbnQ6IGdvdCBlbXB0eSBldmVudFxuIikpOwotCi0JCQlpZiAoY2gtPmNoX3R1bi51bl9mbGFncyAmIFVOX0VNUFRZKSB7Ci0JCQkJY2gtPmNoX3R1bi51bl9mbGFncyAmPSB+VU5fRU1QVFk7Ci0JCQkJaWYgKGNoLT5jaF90dW4udW5fZmxhZ3MgJiBVTl9JU09QRU4pIHsKLQkJCQkJaWYgKChjaC0+Y2hfdHVuLnVuX3R0eS0+ZmxhZ3MgJgotCQkJCQkgICAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKSkgJiYKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMxKQotCQkJCQkJY2gtPmNoX3R1bi51bl90dHktPmxkaXNjLT5vcHMtPndyaXRlX3dha2V1cCkKLSNlbHNlCi0JCQkJCQljaC0+Y2hfdHVuLnVuX3R0eS0+bGRpc2Mub3BzLT53cml0ZV93YWtldXApCi0jZW5kaWYKLQkJCQkJewotCQkJCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMxKQotCQkJCQkJKGNoLT5jaF90dW4udW5fdHR5LT5sZGlzYy0+b3BzLT53cml0ZV93YWtldXApKGNoLT5jaF90dW4udW5fdHR5KTsKLSNlbHNlCi0JCQkJCQkoY2gtPmNoX3R1bi51bl90dHktPmxkaXNjLm9wcy0+d3JpdGVfd2FrZXVwKShjaC0+Y2hfdHVuLnVuX3R0eSk7Ci0jZW5kaWYKLQkJCQkJCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCQkJCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCQkJfQotCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF90dW4udW5fdHR5LT53cml0ZV93YWl0KTsKLQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfdHVuLnVuX2ZsYWdzX3dhaXQpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNoLT5jaF9wdW4udW5fZmxhZ3MgJiBVTl9FTVBUWSkgewotCQkJCWNoLT5jaF9wdW4udW5fZmxhZ3MgJj0gflVOX0VNUFRZOwotCQkJCWlmIChjaC0+Y2hfcHVuLnVuX2ZsYWdzICYgVU5fSVNPUEVOKSB7Ci0JCQkJCWlmICgoY2gtPmNoX3B1bi51bl90dHktPmZsYWdzICYKLQkJCQkJICAgKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCkpICYmCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzMSkKLQkJCQkJCWNoLT5jaF9wdW4udW5fdHR5LT5sZGlzYy0+b3BzLT53cml0ZV93YWtldXApCi0jZWxzZQotCQkJCQkJY2gtPmNoX3B1bi51bl90dHktPmxkaXNjLm9wcy0+d3JpdGVfd2FrZXVwKQotI2VuZGlmCi0JCQkJCXsKLQkJCQkJCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCQkJCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzMSkKLQkJCQkJCShjaC0+Y2hfcHVuLnVuX3R0eS0+bGRpc2MtPm9wcy0+d3JpdGVfd2FrZXVwKShjaC0+Y2hfcHVuLnVuX3R0eSk7Ci0jZWxzZQotCQkJCQkJKGNoLT5jaF9wdW4udW5fdHR5LT5sZGlzYy5vcHMtPndyaXRlX3dha2V1cCkoY2gtPmNoX3B1bi51bl90dHkpOwotI2VuZGlmCi0JCQkJCQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJCQkJREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCQkJCX0KLQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfcHVuLnVuX3R0eS0+d3JpdGVfd2FpdCk7Ci0JCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3B1bi51bl9mbGFnc193YWl0KTsKLQkJCQl9Ci0JCQl9Ci0KLQotCQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX1dFTVBUWSkgewotCQkJCWNoLT5jaF9mbGFncyAmPSB+Q0hfV0VNUFRZOwotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX2ZsYWdzX3dhaXQpOwotCQkJfQotCQl9Ci0KLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotbmV4dDoKLQkJdGFpbCA9ICh0YWlsICsgNCkgJiAoRVZNQVggLSBFVlNUQVJUIC0gNCk7Ci0JfQotCi0Jd3JpdGV3KHRhaWwsICYoZWFkZHItPmV2X3RhaWwpKTsKLQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfZmVwNS5oIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9mZXA1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YWJjNDAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9mZXA1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqKioJRkVQIFZlcnNpb24gNSBkZXBlbmRlbnQgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19ER0FQX0ZFUDVfSAotI2RlZmluZSBfX0RHQVBfRkVQNV9ICi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgRkVQIG1lbW9yeSBvZmZzZXRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTVEFSVCAgICAgICAgICAgMHgwMDA0TCAgICAgICAgIC8qIEV4ZWN1dGlvbiBzdGFydCBhZGRyZXNzICAgICAgKi8KLQotI2RlZmluZSBDTURCVUYgICAgICAgICAgMHgwZDEwTCAgICAgICAgIC8qIENvbW1hbmQgKGNtX3QpIHN0cnVjdHVyZSBvZmZzZXQgKi8KLSNkZWZpbmUgQ01EU1RBUlQgICAgICAgIDB4MDQwMEwgICAgICAgICAvKiBTdGFydCBvZiBjb21tYW5kIGJ1ZmZlciAgICAgICovICAgCi0jZGVmaW5lIENNRE1BWCAgICAgICAgICAweDA4MDBMICAgICAgICAgLyogRW5kIG9mIGNvbW1hbmQgYnVmZmVyICAgICAgICAqLwotCi0jZGVmaW5lIEVWQlVGICAgICAgICAgICAweDBkMThMICAgICAgICAgLyogRXZlbnQgKGV2X3QpIHN0cnVjdHVyZSAgICAgICAqLwotI2RlZmluZSBFVlNUQVJUICAgICAgICAgMHgwODAwTCAgICAgICAgIC8qIFN0YXJ0IG9mIGV2ZW50IGJ1ZmZlciAgICAgICAgKi8KLSNkZWZpbmUgRVZNQVggICAgICAgICAgIDB4MGMwMEwgICAgICAgICAvKiBFbmQgb2YgZXZlbnQgYnVmZmVyICAgICAgICAgICovCi0jZGVmaW5lIEZFUDVfUExVUyAgICAgICAweDBFNDAgICAgICAgICAgLyogQVNDSUkgJzUnIGFuZCBBU0NJSSAnQScgaXMgaGVyZSAgKi8KLSNkZWZpbmUgRUNTX1NFRyAgICAgICAgIDB4MEU0NCAgICAgICAgICAvKiBTZWdtZW50IG9mIHRoZSBleHRlbmRlZCBjaGFubmVsIHN0cnVjdHVyZSAqLwotI2RlZmluZSBMSU5FX1NQRUVEICAgICAgMHgxMCAgICAgICAgICAgIC8qIE9mZnNldCBpbnRvIEVDU19TRUcgZm9yIGxpbmUgc3BlZWQgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBmZXAgaGFzIGV4dGVuZGVkIGNhcGFiaWxpdGllcyAqLwotCi0vKiBCSU9TIE1BR0lDIFNQT1RTICovCi0jZGVmaW5lIEVSUk9SICAgICAgICAgICAweDBDMTRMCQkvKiBCSU9TIGVycm9yIGNvZGUgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNFUVVFTkNFCTB4MEMxMkwJCS8qIEJJT1Mgc2VxdWVuY2UgaW5kaWNhdG9yICAgICAgKi8KLSNkZWZpbmUgUE9TVEFSRUEJMHgwQzAwTAkJLyogUE9TVCBjb21wbGV0ZSBtZXNzYWdlIGFyZWEgICAqLwotCi0vKiBGRVAgTUFHSUMgU1BPVFMgKi8KLSNkZWZpbmUgRkVQU1RBVCAgICAgICAgIFBPU1RBUkVBICAgICAgICAvKiBPUyBoZXJlIHdoZW4gRkVQIGNvbWVzIHVwICAgICovCi0jZGVmaW5lIE5DSEFOICAgICAgICAgICAweDBDMDJMICAgICAgICAgLyogbnVtYmVyIG9mIHBvcnRzIEZFUCBzZWVzICAgICAqLwotI2RlZmluZSBQQU5JQyAgICAgICAgICAgMHgwQzEwTCAgICAgICAgIC8qIFBBTklDIGFyZWEgZm9yIEZFUCAgICAgICAgICAgKi8KLSNkZWZpbmUgS01FTUVNICAgICAgICAgIDB4MEMzMEwgICAgICAgICAvKiBNZW1vcnkgZm9yIEtNRSB1c2UgICAgICAgICAgICovICAgCi0jZGVmaW5lIENPTkZJRyAgICAgICAgICAweDBDRDBMICAgICAgICAgLyogQ29uY2VudHJhdG9yIGNvbmZpZ3VyYXRpb24gaW5mbyAqLwotI2RlZmluZSBDT05GSUdTSVpFICAgICAgMHgwMDMwICAgICAgICAgIC8qIGNvbmZpZ3VyYXRpb24gaW5mbyBzaXplICAgICAgKi8KLSNkZWZpbmUgRE9XTlJFUSAgICAgICAgIDB4MEQwMCAgICAgICAgICAvKiBEb3dubG9hZCByZXF1ZXN0IGJ1ZmZlciBwb2ludGVyICovCi0KLSNkZWZpbmUgQ0hBTkJVRiAgICAgICAgIDB4MTAwMEwgICAgICAgICAvKiBBc3luYyBjaGFubmVsIChic190KSBzdHJ1Y3RzICovCi0jZGVmaW5lIEZFUE9TU0laRSAgICAgICAweDFGRkYgICAgICAgICAgLyogOEsgRkVQT1MgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIFhFTVBPUlRTICAgIDB4QzAyCS8qCi0JCQkJICogT2Zmc2V0IGluIGJvYXJkIG1lbW9yeSB3aGVyZSBGRVA1IHN0b3JlcwotCQkJCSAqIGhvdyBtYW55IHBvcnRzIGl0IGhhcyBkZXRlY3RlZC4KLQkJCQkgKiBOT1RFOiBGRVA1IHJlcG9ydHMgNjQgcG9ydHMgd2hlbiB0aGUgdXNlcgotCQkJCSAqIGhhcyB0aGUgY2FibGUgaW4gRUJJIE9VVCBpbnN0ZWFkIG9mIEVCSSBJTi4KLQkJCQkgKi8KLQotI2RlZmluZSBGRVBDTFIgICAgICAweDAwCi0jZGVmaW5lIEZFUE1FTSAgICAgIDB4MDIgCi0jZGVmaW5lIEZFUFJTVCAgICAgIDB4MDQgCi0jZGVmaW5lIEZFUElOVCAgICAgIDB4MDgKLSNkZWZpbmUgRkVQTUFTSyAgICAgMHgwZQotI2RlZmluZSBGRVBXSU4gICAgICAweDgwCi0KLSNkZWZpbmUgTE9XTUVNICAgICAgMHgwMTAwCi0jZGVmaW5lIEhJR0hNRU0gICAgIDB4N2YwMAotCi0jZGVmaW5lIEZFUFRJTUVPVVQgMjAwMDAwCi0KLSNkZWZpbmUgRU5BQkxFX0lOVFIJCTB4MGUwNAkJLyogRW5hYmxlIGludGVycnVwdHMgZmxhZyAqLwotI2RlZmluZSBGRVBQT0xMX01JTgkJMQkJLyogbWluaW11bSBvZiAxIG1pbGxpc2Vjb25kICovICAKLSNkZWZpbmUgRkVQUE9MTF9NQVgJCTIwCQkvKiBtYXhpbXVtIG9mIDIwIG1pbGxpc2Vjb25kcyAqLwotI2RlZmluZSBGRVBQT0xMCQkJMHgwYzI2CQkvKiBGZXAgZXZlbnQgcG9sbCBpbnRlcnZhbCAqLyAgIAotCi0jZGVmaW5lCUlBTFRQSU4JCQkweDAwODAJCS8qIElucHV0IGZsYWcgdG8gc3dhcCBEU1IgPC0+IERDRCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogQ29tbWFuZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgY21fdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgY21faGVhZDsJLyogQ29tbWFuZCBidWZmZXIgaGVhZCBvZmZzZXQJKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBjbV90YWlsOwkvKiBDb21tYW5kIGJ1ZmZlciB0YWlsIG9mZnNldAkqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGNtX3N0YXJ0OwkvKiBzdGFydCBvZmZzZXQgb2YgYnVmZmVyCSovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgY21fbWF4OwkJLyogbGFzdCBvZmZzZXQgb2YgYnVmZmVyCSovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFdmVudCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgZXZfdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgZXZfaGVhZDsJLyogQ29tbWFuZCBidWZmZXIgaGVhZCBvZmZzZXQJKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBldl90YWlsOwkvKiBDb21tYW5kIGJ1ZmZlciB0YWlsIG9mZnNldAkqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGV2X3N0YXJ0OwkvKiBzdGFydCBvZmZzZXQgb2YgYnVmZmVyCSovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgZXZfbWF4OwkJLyogbGFzdCBvZmZzZXQgb2YgYnVmZmVyCSovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEb3dubG9hZCBidWZmZXIgc3RydWN0dXJlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBkb3dubGRfdCB7Ci0JdWNoYXIJZGxfdHlwZTsJCS8qIEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl1Y2hhcglkbF9zZXE7CQkJLyogRG93bmxvYWQgc2VxdWVuY2UgICAgICAgICAgICAqLwotCXVzaG9ydAlkbF9zcmV2OwkJLyogU29mdHdhcmUgcmV2aXNpb24gbnVtYmVyICAgICAqLwotCXVzaG9ydAlkbF9scmV2OwkJLyogTG93IHJldmlzaW9uIG51bWJlciAgICAgICAgICAqLwotCXVzaG9ydAlkbF9ocmV2OwkJLyogSGlnaCByZXZpc2lvbiBudW1iZXIgICAgICAgICAqLwotCXVzaG9ydAlkbF9zZWc7CQkJLyogU3RhcnQgc2VnbWVudCBhZGRyZXNzICAgICAgICAqLwotCXVzaG9ydAlkbF9zaXplOwkJLyogTnVtYmVyIG9mIGJ5dGVzIHRvIGRvd25sb2FkICAqLwotCXVjaGFyCWRsX2RhdGFbMTAyNF07CQkvKiBEb3dubG9hZCBkYXRhICAgICAgICAgICAgICAgICovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogUGVyIGNoYW5uZWwgYnVmZmVyIHN0cnVjdHVyZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgIEJhc2UgU3RydWN0dXJlIEVudHJpZXMgVXNhZ2UgTWVhbmluZ3MgdG8gSG9zdCAgICAgICAgICAgKiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKiAgICAgICAgVyA9IHJlYWQgd3JpdGUgICAgICAgIFIgPSByZWFkIG9ubHkgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICogICAgICAgIEMgPSBjaGFuZ2VkIGJ5IGNvbW1hbmRzIG9ubHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAqICAgICAgICBVID0gdW5rbm93biAobWF5IGJlIGNoYW5nZWQgdy9vIG5vdGljZSkgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgYnNfdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHRwX2ptcDsJLyogVHJhbnNtaXQgcG9sbCBqdW1wCQkgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgdGNfam1wOwkvKiBDb29rZWQgcHJvY2VkdXJlIGp1bXAJICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHJpX2ptcDsJLyogTm90IGN1cnJlbnRseSB1c2VkCQkgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgcnBfam1wOwkvKiBSZWNlaXZlIHBvbGwganVtcAkJICovCi0KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgdHhfc2VnOwkvKiBXICBUeCBzZWdtZW50CSAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICB0eF9oZWFkOwkvKiBXICBUeCBidWZmZXIgaGVhZCBvZmZzZXQJKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgdHhfdGFpbDsJLyogUiAgVHggYnVmZmVyIHRhaWwgb2Zmc2V0CSovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHR4X21heDsJLyogVyAgVHggYnVmZmVyIHNpemUgLSAxCSAqLwotIAotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICByeF9zZWc7CS8qIFcgIFJ4IHNlZ21lbnQJCSovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHJ4X2hlYWQ7CS8qIFcgIFJ4IGJ1ZmZlciBoZWFkIG9mZnNldAkqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICByeF90YWlsOwkvKiBSICBSeCBidWZmZXIgdGFpbCBvZmZzZXQJKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgcnhfbWF4OwkvKiBXICBSeCBidWZmZXIgc2l6ZSAtIDEJICovCi0KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgdHhfbHc7CQkvKiBXICBUeCBidWZmZXIgbG93IHdhdGVyIG1hcmsgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHJ4X2x3OwkJLyogVyAgUnggYnVmZmVyIGxvdyB3YXRlciBtYXJrICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICByeF9odzsJCS8qIFcgIFJ4IGJ1ZmZlciBoaWdoIHdhdGVyIG1hcmsgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgaW5jcjsJCS8qIFcgIEluY3JlbWVudCB0byBuZXh0IGNoYW5uZWwgKi8KLQotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICBmZXBkZXY7CS8qIFUgIFNDQyBkZXZpY2UgYmFzZSBhZGRyZXNzICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIGVkZWxheTsJLyogVyAgRXhjZXB0aW9uIGRlbGF5ICAgICAgICAgICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgYmxlbjsJCS8qIFcgIEJyZWFrIGxlbmd0aCAgICAgICAgICAgICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgYnRpbWU7CQkvKiBVICBCcmVhayBjb21wbGV0ZSB0aW1lICAgICAgICovCi0KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgaWZsYWc7CQkvKiBDICBVTklYIGlucHV0IGZsYWdzICAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIG9mbGFnOwkJLyogQyAgVU5JWCBvdXRwdXQgZmxhZ3MgICAgICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICBjZmxhZzsJCS8qIEMgIFVOSVggY29udHJvbCBmbGFncyAgICAgICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgd2ZpbGxbMTNdOwkvKiBVICBSZXNlcnZlZCBmb3IgZXhwYW5zaW9uICAgICovCi0KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgbnVtOwkJLyogVSAgQ2hhbm5lbCBudW1iZXIgICAgICAgICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICByYWN0OwkJLyogVSAgUmVjZWl2ZXIgYWN0aXZlIGNvdW50ZXIgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBic3RhdDsJCS8qIFUgIEJyZWFrIHN0YXR1cyBiaXRzICAgICAgICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgdGJ1c3k7CQkvKiBXICBUcmFuc21pdCBidXN5ICAgICAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGllbXB0eTsJLyogVyAgVHJhbnNtaXQgZW1wdHkgZXZlbnQgZW5hYmxlICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGlsb3c7CQkvKiBXICBUcmFuc21pdCBsb3ctd2F0ZXIgZXZlbnQgZW5hYmxlICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGlkYXRhOwkJLyogVyAgUmVjZWl2ZSBkYXRhIGludGVycnVwdCBlbmFibGUgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgZWZsYWc7CQkvKiBVICBIb3N0IGV2ZW50IGZsYWdzICAgICAgICAgICovCi0KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgdGZsYWc7CQkvKiBVICBUcmFuc21pdCBmbGFncyAgICAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHJmbGFnOwkJLyogVSAgUmVjZWl2ZSBmbGFncyAgICAgICAgICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICB4bWFzazsJCS8qIFUgIFRyYW5zbWl0IHJlYWR5IGZsYWdzICAgICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgeHZhbDsJCS8qIFUgIFRyYW5zbWl0IHJlYWR5IHZhbHVlICAgICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgbV9zdGF0OwkvKiBSQyBNb2RlbSBzdGF0dXMgYml0cyAgICAgICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBtX2NoYW5nZTsJLyogVSAgTW9kZW0gYml0cyB3aGljaCBjaGFuZ2VkICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBtX2ludDsJCS8qIFcgIE1vZGVtIGludGVycnVwdCBlbmFibGUgYml0cyAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBtX2xhc3Q7CS8qIFUgIExhc3QgbW9kZW0gc3RhdHVzICAgICAgICAgKi8KLQotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBtdHJhbjsJCS8qIEMgICBVbnJlcG9ydGVkIG1vZGVtIHRyYW5zICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgb3J1bjsJCS8qIEMgICBCdWZmZXIgb3ZlcnJ1biBvY2N1cnJlZCAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgYXN0YXJ0YzsJLyogVyAgIEF1eGlsaWFyeSBYb24gY2hhciAgICAgICAqLyAgCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGFzdG9wYzsJLyogVyAgIEF1eGlsaWFyeSBYb2ZmIGNoYXIgICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBzdGFydGM7CS8qIFcgICBYb24gY2hhcmFjdGVyICAgICAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHN0b3BjOwkJLyogVyAgIFhvZmYgY2hhcmFjdGVyICAgICAgICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICB2bmV4dGM7CS8qIFcgICBWbmV4dCBjaGFyYWN0ZXIgICAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGhmbG93OwkJLyogQyAgIFNvZnR3YXJlIGZsb3cgY29udHJvbCAgICAqLwotCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGZpbGxjOwkJLyogVSAgIERlbGF5IEZpbGwgY2hhcmFjdGVyICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBvY2hhcjsJCS8qIFUgICBTYXZlZCBvdXRwdXQgY2hhcmFjdGVyICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgb21hc2s7CQkvKiBVICAgT3V0cHV0IGNoYXJhY3RlciBtYXNrICAgICovCi0KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgYmZpbGxbMTNdOwkvKiBVICAgUmVzZXJ2ZWQgZm9yIGV4cGFuc2lvbiAgICovICAKLQotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBzY2NbMTZdOwkvKiBVICAgU0NDIHJlZ2lzdGVycyAgICAgICAgICAgICovCi19OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAKLSAqIEZFUCBzdXBwb3J0ZWQgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTUkxPVwkJMHhlMAkJLyogU2V0IHJlY2VpdmUgbG93IHdhdGVyCSovCi0jZGVmaW5lIFNSSElHSAkJMHhlMQkJLyogU2V0IHJlY2VpdmUgaGlnaCB3YXRlcgkqLwotI2RlZmluZSBGTFVTSFRYCQkweGUyCQkvKiBGbHVzaCB0cmFuc21pdCBidWZmZXIJKi8KLSNkZWZpbmUgUEFVU0VUWAkJMHhlMwkJLyogUGF1c2UgZGF0YSB0cmFuc21pc3Npb24JKi8KLSNkZWZpbmUgUkVTVU1FVFgJMHhlNAkJLyogUmVzdW1lIGRhdGEgdHJhbnNtaXNzaW9uCSovCi0jZGVmaW5lIFNNSU5UCQkweGU1CQkvKiBTZXQgTW9kZW0gSW50ZXJydXB0CQkqLwotI2RlZmluZSBTQUZMT1dDCQkweGU2CQkvKiBTZXQgQXV4LiBmbG93IGNvbnRyb2wgY2hhcnMJKi8KLSNkZWZpbmUgU0JSRUFLCQkweGU4CQkvKiBTZW5kIGJyZWFrCQkJKi8KLSNkZWZpbmUgU01PREVNCQkweGU5CQkvKiBTZXQgODUzMCBtb2RlbSBjb250cm9sIGxpbmVzCSovICAKLSNkZWZpbmUgU0lGTEFHCQkweGVhCQkvKiBTZXQgVU5JWCBpZmxhZ3MJCSovCi0jZGVmaW5lIFNGTE9XQwkJMHhlYgkJLyogU2V0IGZsb3cgY29udHJvbCBjaGFyYWN0ZXJzCSovCi0jZGVmaW5lIFNUTE9XCQkweGVjCQkvKiBTZXQgdHJhbnNtaXQgbG93IHdhdGVyIG1hcmsJKi8KLSNkZWZpbmUgUlBBVVNFCQkweGVlCQkvKiBQYXVzZSByZWNlaXZlCQkqLwotI2RlZmluZSBSUkVTVU1FCQkweGVmCQkvKiBSZXN1bWUgcmVjZWl2ZQkJKi8gIAotI2RlZmluZSBDSFJFU0VUCQkweGYwCQkvKiBSZXNldCBDaGFubmVsCQkqLwotI2RlZmluZSBCVUZTRVRBTEwJMHhmMgkJLyogU2V0IFR4ICYgUnggYnVmZmVyIHNpemUgYXZhaWwqLwotI2RlZmluZSBTT0ZMQUcJCTB4ZjMJCS8qIFNldCBVTklYIG9mbGFncwkJKi8KLSNkZWZpbmUgU0hGTE9XCQkweGY0CQkvKiBTZXQgaGFyZHdhcmUgaGFuZHNoYWtlCSovCi0jZGVmaW5lIFNDRkxBRwkJMHhmNQkJLyogU2V0IFVOSVggY2ZsYWdzCQkqLwotI2RlZmluZSBTVk5FWFQJCTB4ZjYJCS8qIFNldCBWTkVYVCBjaGFyYWN0ZXIJCSovCi0jZGVmaW5lIFNQSU5URkMJCTB4ZmMJCS8qIFJlc2VydmVkCQkJKi8KLSNkZWZpbmUgU0NPTU1PREUJMHhmZAkJLyogU2V0IFJTMjMyLzQyMiBtb2RlCQkqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKglNb2RlcyBmb3IgU0NPTU1PREUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIE1PREVfMjMyCTB4MDAKLSNkZWZpbmUgTU9ERV80MjIJMHgwMQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAgICAgIEV2ZW50IGZsYWdzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgSUZCUkVBSyAgICAgICAgIDB4MDEgICAgICAgICAgICAvKiBCcmVhayByZWNlaXZlZCAgICAgICAgICAgICAgICovICAKLSNkZWZpbmUgSUZUTFcgICAgICAgICAgIDB4MDIgICAgICAgICAgICAvKiBUcmFuc21pdCBsb3cgd2F0ZXIgICAgICAgICAgICovCi0jZGVmaW5lIElGVEVNICAgICAgICAgICAweDA0ICAgICAgICAgICAgLyogVHJhbnNtaXR0ZXIgZW1wdHkgICAgICAgICAgICAqLwotI2RlZmluZSBJRkRBVEEgICAgICAgICAgMHgwOCAgICAgICAgICAgIC8qIFJlY2VpdmUgZGF0YSBwcmVzZW50ICAgICAgICAgKi8KLSNkZWZpbmUgSUZNT0RFTSAgICAgICAgIDB4MjAgICAgICAgICAgICAvKiBNb2RlbSBzdGF0dXMgY2hhbmdlICAgICAgICAgICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAKLSAqICAgICAgTW9kZW0gZmxhZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jICAgICAgIGRlZmluZSAgRE1fUlRTICAgICAgICAgIDB4MDIgICAgLyogUmVxdWVzdCB0byBzZW5kICAgICAgICAgICAgICAqLwotIyAgICAgICBkZWZpbmUgIERNX0NEICAgICAgICAgICAweDgwICAgIC8qIENhcnJpZXIgZGV0ZWN0ICAgICAgICAgICAgICAgKi8KLSMgICAgICAgZGVmaW5lICBETV9EU1IgICAgICAgICAgMHgyMCAgICAvKiBEYXRhIHNldCByZWFkeSAgICAgICAgICAgICAgICovCi0jICAgICAgIGRlZmluZSAgRE1fQ1RTICAgICAgICAgIDB4MTAgICAgLyogQ2xlYXIgdG8gc2VuZCAgICAgICAgICAgICAgICAqLwotIyAgICAgICBkZWZpbmUgIERNX1JJICAgICAgICAgICAweDQwICAgIC8qIFJpbmcgaW5kaWNhdG9yICAgICAgICAgICAgICAgKi8KLSMgICAgICAgZGVmaW5lICBETV9EVFIgICAgICAgICAgMHgwMSAgICAvKiBEYXRhIHRlcm1pbmFsIHJlYWR5ICAgICAgICAgICovCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2tjb21wYXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfa2NvbXBhdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGMyNDA0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfa2NvbXBhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0IERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICogICAgICBTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKglOT1RFOiBUSElTIElTIEEgU0hBUkVEIEhFQURFUi4gRE8gTk9UIENIQU5HRSBDT0RJTkcgU1RZTEUhISEKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBjb250YWluIGFsbCB0aGUga2VybmVsICJkaWZmZXJlbmNlcyIgYmV0d2VlbiB0aGUKLSAqIHZhcmlvdXMga2VybmVscyB0aGF0IHdlIHN1cHBvcnQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19ER0FQX0tDT01QQVRfSAotI2RlZmluZSBfX0RHQVBfS0NPTVBBVF9ICi0KLSNpZiAhZGVmaW5lZChUVFlfRkxJUEJVRl9TSVpFKQotIyBkZWZpbmUgVFRZX0ZMSVBCVUZfU0laRSA1MTIKLSNlbmRpZgotCi0KLS8qIFNwYXJzZSBzdHVmZiAqLwotIyBpZm5kZWYgX191c2VyCi0jICBkZWZpbmUgX191c2VyCi0jICBkZWZpbmUgX19rZXJuZWwKLSMgIGRlZmluZSBfX3NhZmUKLSMgIGRlZmluZSBfX2ZvcmNlCi0jICBkZWZpbmUgX19jaGtfdXNlcl9wdHIoeCkgKHZvaWQpMAotIyBlbmRpZgotCi0KLSMgIGRlZmluZSBQQVJNX1NUUihWQVIsIElOSVQsIFBFUk0sIERFU0MpIFwKLQkJc3RhdGljIGNoYXIgKlZBUiA9IElOSVQ7IFwKLQkJY2hhciAqZGdhcF8jI1ZBUjsgXAotCQltb2R1bGVfcGFyYW0oVkFSLCBjaGFycCwgUEVSTSk7IFwKLQkJTU9EVUxFX1BBUk1fREVTQyhWQVIsIERFU0MpOwotCi0jICBkZWZpbmUgUEFSTV9JTlQoVkFSLCBJTklULCBQRVJNLCBERVNDKSBcCi0JCXN0YXRpYyBpbnQgVkFSID0gSU5JVDsgXAotCQlpbnQgZGdhcF8jI1ZBUjsgXAotCQltb2R1bGVfcGFyYW0oVkFSLCBpbnQsIFBFUk0pOyBcCi0JCU1PRFVMRV9QQVJNX0RFU0MoVkFSLCBERVNDKTsKLQotIyAgZGVmaW5lIFBBUk1fVUxPTkcoVkFSLCBJTklULCBQRVJNLCBERVNDKSBcCi0JCXN0YXRpYyB1bG9uZyBWQVIgPSBJTklUOyBcCi0JCXVsb25nIGRnYXBfIyNWQVI7IFwKLQkJbW9kdWxlX3BhcmFtKFZBUiwgbG9uZywgUEVSTSk7IFwKLQkJTU9EVUxFX1BBUk1fREVTQyhWQVIsIERFU0MpOwotCi0jZW5kaWYgLyogISBfX0RHQVBfS0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3BhcnNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3BhcnNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZmQ5M2QuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9wYXJzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKgotICoJTk9URSBUTyBMSU5VWCBLRVJORUwgSEFDS0VSUzogIERPIE5PVCBSRUZPUk1BVCBUSElTIENPREUhIAotICoKLSAqCVRoaXMgaXMgc2hhcmVkIGNvZGUgYmV0d2VlbiBEaWdpJ3MgQ1ZTIGFyY2hpdmUgYW5kIHRoZQotICoJTGludXggS2VybmVsIHNvdXJjZXMuCi0gKglDaGFuZ2luZyB0aGUgc291cmNlIGp1c3QgZm9yIHJlZm9ybWF0dGluZyBuZWVkbGVzc2x5IGJyZWFrcwotICoJb3VyIENWUyBkaWZmIGhpc3RvcnkuCi0gKgotICoJU2VuZCBhbnkgYnVnIGZpeGVzL2NoYW5nZXMgdG86ICBFbmcuTGludXggYXQgZGlnaSBkb3QgY29tLiAKLSAqCVRoYW5rIHlvdS4KLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogZGdhcF9wYXJzZS5jIC0gUGFyc2VzIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIGlucHV0IGZpbGUuCi0gKgotICogJElkOiBkZ2FwX3BhcnNlLmMsdiAxLjEgMjAwOS8xMC8yMyAxNDowMTo1NyBtYXJraCBFeHAgJAotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0jaW5jbHVkZSAiZGdhcF90eXBlcy5oIgotI2luY2x1ZGUgImRnYXBfZmVwNS5oIgotI2luY2x1ZGUgImRnYXBfZHJpdmVyLmgiCi0jaW5jbHVkZSAiZGdhcF9wYXJzZS5oIgotI2luY2x1ZGUgImRnYXBfY29uZi5oIgotCi0KLS8qCi0gKiBGdW5jdGlvbiBwcm90b3R5cGVzLgotICovCi1zdGF0aWMgaW50IGRnYXBfZ2V0dG9rKGNoYXIgKippbiwgc3RydWN0IGNub2RlICpwKTsKLXN0YXRpYyBjaGFyICpkZ2FwX2dldHdvcmQoY2hhciAqKmluKTsKLXN0YXRpYyBjaGFyICpkZ2FwX3NhdmVzdHJpbmcoY2hhciAqcyk7Ci1zdGF0aWMgc3RydWN0IGNub2RlICpkZ2FwX25ld25vZGUoaW50IHQpOwotc3RhdGljIGludCBkZ2FwX2NoZWNrbm9kZShzdHJ1Y3QgY25vZGUgKnApOwotc3RhdGljIHZvaWQgZGdhcF9lcnIoY2hhciAqcyk7Ci0KLS8qCi0gKiBPdXIgbmVlZGVkIGludGVybmFsIHN0YXRpYyB2YXJpYWJsZXMuLi4KLSAqLwotc3RhdGljIHN0cnVjdCBjbm9kZSBkZ2FwX2hlYWQ7Ci0jZGVmaW5lIE1BWENXT1JEIDIwMAotc3RhdGljIGNoYXIgZGdhcF9jd29yZFtNQVhDV09SRF07Ci0KLXN0cnVjdCB0b2tsaXN0IHsKLQlpbnQJdG9rZW47Ci0JY2hhcgkqc3RyaW5nOwotfTsKLQotc3RhdGljIHN0cnVjdCB0b2tsaXN0IGRnYXBfdGxpc3RbXSA9IHsKLQl7CUJFR0lOLAkJImNvbmZpZ19iZWdpbiIJCQl9LAotCXsJRU5ELAkJImNvbmZpZ19lbmQiCQkJfSwKLQl7CUJPQVJELAkJImJvYXJkIgkJCQl9LAotCXsJUENYLAkJIkRpZ2lfQWNjZWxlUG9ydF9DL1hfUENJIgl9LAkvKiBDL1hfUENJICovCi0JewlQRVBDLAkJIkRpZ2lfQWNjZWxlUG9ydF9FUEMvWF9QQ0kiCX0sCS8qIEVQQy9YX1BDSSAqLwotCXsJUFBDTSwJCSJEaWdpX0FjY2VsZVBvcnRfWGVtX1BDSSIJfSwJLyogUENJL1hlbSAqLwotCXsJQVBPUlQyXzkyMFAsCSJEaWdpX0FjY2VsZVBvcnRfMnJfOTIwX1BDSSIJfSwKLQl7CUFQT1JUNF85MjBQLAkiRGlnaV9BY2NlbGVQb3J0XzRyXzkyMF9QQ0kiCX0sCi0JewlBUE9SVDhfOTIwUCwJIkRpZ2lfQWNjZWxlUG9ydF84cl85MjBfUENJIgl9LAotCXsJUEFQT1JUNCwJIkRpZ2lfQWNjZWxlUG9ydF80cl9QQ0koRUlBLTIzMi9SUy00MjIpIiB9LAotCXsJUEFQT1JUOCwJIkRpZ2lfQWNjZWxlUG9ydF84cl9QQ0koRUlBLTIzMi9SUy00MjIpIiB9LAotCXsJSU8sCQkiaW8iCQkJCX0sCi0JewlQQ0lJTkZPLAkicGNpaW5mbyIJCQl9LAotCXsJTElORSwJCSJsaW5lIgkJCQl9LAotCXsJQ09OQywJCSJjb25jIgkJCQl9LAotCXsJQ09OQywJCSJjb25jZW50cmF0b3IiCQkJfSwKLQl7CUNYLAkJImN4IgkJCQl9LAotCXsJQ1gsCQkiY2NvbiIJCQkJfSwKLQl7CUVQQywJCSJlcGNjb24iCQkJfSwKLQl7CUVQQywJCSJlcGMiCQkJCX0sCi0JewlNT0QsCQkibW9kdWxlIgkJCX0sCi0JewlJRCwJCSJpZCIJCQkJfSwKLQl7CVNUQVJUTywJCSJzdGFydCIJCQkJfSwKLQl7CVNQRUVELAkJInNwZWVkIgkJCQl9LAotCXsJQ0FCTEUsCQkiY2FibGUiCQkJCX0sCi0JewlDT05ORUNULAkiY29ubmVjdCIJCQl9LAotCXsJTUVUSE9ELAkJIm1ldGhvZCIJCQl9LAotCXsJU1RBVFVTLAkJInN0YXR1cyIJCQl9LAotCXsJQ1VTVE9NLAkJIkN1c3RvbSIJCQl9LAotCXsJQkFTSUMsCQkiQmFzaWMiCQkJCX0sCi0JewlNRU0sCQkibWVtIgkJCQl9LAotCXsJTUVNLAkJIm1lbW9yeSIJCQl9LAotCXsJUE9SVFMsCQkicG9ydHMiCQkJCX0sCi0JewlNT0RFTSwJCSJtb2RlbSIJCQkJfSwKLQl7CU5QT1JUUywJCSJucG9ydHMiCQkJfSwKLQl7CVRUWU4sCQkidHR5bmFtZSIJCQl9LAotCXsJQ1UsCQkiY3VuYW1lIgkJCX0sCi0JewlQUklOVCwJCSJwcm5hbWUiCQkJfSwKLQl7CUNNQUpPUiwJCSJtYWpvciIJCQkJfSwKLQl7CUFMVFBJTiwJCSJhbHRwaW4iCQkJfSwKLQl7CVVTRUlOVFIsCSJ1c2VpbnRyIgkJCX0sCi0JewlUVFNJWiwJCSJ0dHlzaXplIgkJCX0sCi0JewlDSFNJWiwJCSJjaHNpemUiCQkJfSwKLQl7CUJTU0laLAkJImJvYXJkc2l6ZSIJCQl9LAotCXsJVU5UU0laLAkJInNjaGVkc2l6ZSIJCQl9LAotCXsJRjJTSVosCQkiZjIyMDBzaXplIgkJCX0sCi0JewlWUFNJWiwJCSJ2cGl4c2l6ZSIJCQl9LAotCXsJMCwJCU5VTEwJCQkJfQotfTsKLQotCi0vKgotICogUGFyc2UgYSBjb25maWd1cmF0aW9uIGZpbGUgcmVhZCBpbnRvIG1lbW9yeSBhcyBhIHN0cmluZy4KLSAqLwotaW50CWRnYXBfcGFyc2VmaWxlKGNoYXIgKippbiwgaW50IFJlbW92ZSkKLXsKLQlzdHJ1Y3QgY25vZGUgKnAsICpicmQsICpsaW5lLCAqY29uYzsKLQlpbnQJcmM7Ci0JY2hhcgkqcyA9IE5VTEwsICpzMiA9IE5VTEw7Ci0JaW50CWxpbmVjbnQgPSAwOwotCi0JcCA9ICZkZ2FwX2hlYWQ7Ci0JYnJkID0gbGluZSA9IGNvbmMgPSBOVUxMOwotCi0JLyogcGVyaGFwcyB3ZSBhcmUgYWRkaW5nIHRvIGFuIGV4aXN0aW5nIGxpc3Q/ICovCi0Jd2hpbGUgKHAtPm5leHQgIT0gTlVMTCkgewotCQlwID0gcC0+bmV4dDsKLQl9Ci0KLQkvKiBmaWxlIG11c3Qgc3RhcnQgd2l0aCBhIEJFR0lOICovCi0Jd2hpbGUgKCAocmMgPSBkZ2FwX2dldHRvayhpbixwKSkgIT0gQkVHSU4gKSB7Ci0JCWlmIChyYyA9PSAwKSB7Ci0JCQlkZ2FwX2VycigidW5leHBlY3RlZCBFT0YiKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQl9Ci0KLQlmb3IgKDsgOyApIHsKLQkJcmMgPSBkZ2FwX2dldHRvayhpbixwKTsKLQkJaWYgKHJjID09IDApIHsKLQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIEVPRiIpOwotCQkJcmV0dXJuKC0xKTsKLQkJfQotCi0JCXN3aXRjaCAocmMpIHsKLQkJY2FzZSAwOgotCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCXJldHVybigtMSk7Ci0KLQkJY2FzZSBCRUdJTjoJLyogc2hvdWxkIG9ubHkgYmUgMSBiZWdpbiAqLwotCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgY29uZmlnX2JlZ2luXG4iKTsKLQkJCXJldHVybigtMSk7Ci0KLQkJY2FzZSBFTkQ6Ci0JCQlyZXR1cm4oMCk7Ci0KLQkJY2FzZSBCT0FSRDoJLyogYm9hcmQgaW5mbyAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAoIChwLT5uZXh0ID0gZGdhcF9uZXdub2RlKEJOT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQotCQkJcC0+dS5ib2FyZC5zdGF0dXMgPSBkZ2FwX3NhdmVzdHJpbmcoIk5vIik7Ci0JCQlsaW5lID0gY29uYyA9IE5VTEw7Ci0JCQlicmQgPSBwOwotCQkJbGluZWNudCA9IC0xOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBUE9SVDJfOTIwUDoJLyogQWNjZWxlUG9ydF80ICovCi0JCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIERpZ2lfMnJfOTIwIHN0cmluZyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJvYXJkLnR5cGUgPSBBUE9SVDJfOTIwUDsKLQkJCXAtPnUuYm9hcmQudl90eXBlID0gMTsKLQkJCURQUl9JTklUKCgiQWRkaW5nIERpZ2lfMnJfOTIwIFBDSSB0byBjb25maWcuLi5cbiIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQVBPUlQ0XzkyMFA6CS8qIEFjY2VsZVBvcnRfNCAqLwotCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBEaWdpXzRyXzkyMCBzdHJpbmciKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ib2FyZC50eXBlID0gQVBPUlQ0XzkyMFA7Ci0JCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBEaWdpXzRyXzkyMCBQQ0kgdG8gY29uZmlnLi4uXG4iKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFQT1JUOF85MjBQOgkvKiBBY2NlbGVQb3J0XzggKi8KLQkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRGlnaV84cl85MjAgc3RyaW5nIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYm9hcmQudHlwZSA9IEFQT1JUOF85MjBQOwotCQkJcC0+dS5ib2FyZC52X3R5cGUgPSAxOwotCQkJRFBSX0lOSVQoKCJBZGRpbmcgRGlnaV84cl85MjAgUENJIHRvIGNvbmZpZy4uLlxuIikpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQQVBPUlQ0OgkvKiBBY2NlbGVQb3J0XzQgUENJICovCi0JCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIERpZ2lfNHIoUENJKSBzdHJpbmciKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ib2FyZC50eXBlID0gUEFQT1JUNDsKLQkJCXAtPnUuYm9hcmQudl90eXBlID0gMTsKLQkJCURQUl9JTklUKCgiQWRkaW5nIERpZ2lfNHIgUENJIHRvIGNvbmZpZy4uLlxuIikpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQQVBPUlQ4OgkvKiBBY2NlbGVQb3J0XzggUENJICovCi0JCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIERpZ2lfOHIgc3RyaW5nIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYm9hcmQudHlwZSA9IFBBUE9SVDg7Ci0JCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBEaWdpXzhyIFBDSSB0byBjb25maWcuLi5cbiIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUENYOgkvKiBQQ0kgQy9YICovCi0JCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIERpZ2lfQy9YXyhQQ0kpIHN0cmluZyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJvYXJkLnR5cGUgPSBQQ1g7Ci0JCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7Ci0JCQlwLT51LmJvYXJkLmNvbmMxID0gMDsKLQkJCXAtPnUuYm9hcmQuY29uYzIgPSAwOwotCQkJcC0+dS5ib2FyZC5tb2R1bGUxID0gMDsKLQkJCXAtPnUuYm9hcmQubW9kdWxlMiA9IDA7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBQQ0kgQy9YIHRvIGNvbmZpZy4uLlxuIikpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQRVBDOgkvKiBQQ0kgRVBDL1ggKi8KLQkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgXCJEaWdpX0VQQy9YXyhQQ0kpXCIgc3RyaW5nIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYm9hcmQudHlwZSA9IFBFUEM7Ci0JCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7Ci0JCQlwLT51LmJvYXJkLmNvbmMxID0gMDsKLQkJCXAtPnUuYm9hcmQuY29uYzIgPSAwOwotCQkJcC0+dS5ib2FyZC5tb2R1bGUxID0gMDsKLQkJCXAtPnUuYm9hcmQubW9kdWxlMiA9IDA7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBQQ0kgRVBDL1ggdG8gY29uZmlnLi4uXG4iKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBQQ006CS8qIFBDSS9YZW0gKi8KLQkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgUENJL1hlbSBzdHJpbmciKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ib2FyZC50eXBlID0gUFBDTTsKLQkJCXAtPnUuYm9hcmQudl90eXBlID0gMTsKLQkJCXAtPnUuYm9hcmQuY29uYzEgPSAwOwotCQkJcC0+dS5ib2FyZC5jb25jMiA9IDA7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBQQ0kgWEVNIHRvIGNvbmZpZy4uLlxuIikpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJTzoJLyogaS9vIHBvcnQgKi8KLQkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7Ci0JCQkJZGdhcF9lcnIoIklPIHBvcnQgb25seSB2YWlsZCBmb3IgYm9hcmRzIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYm9hcmQucG9ydHN0ciA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKLQkJCXAtPnUuYm9hcmQucG9ydCA9IChzaG9ydClzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQlpZiAoKHNob3J0KXN0cmxlbihzKSA+IChzaG9ydCkoczIgLSBzKSkgewotCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBJTyBwb3J0Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYm9hcmQudl9wb3J0ID0gMTsKLQkJCURQUl9JTklUKCgiQWRkaW5nIElPICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIE1FTToJLyogbWVtb3J5IGFkZHJlc3MgKi8KLQkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7Ci0JCQkJZGdhcF9lcnIoIm1lbW9yeSBhZGRyZXNzIG9ubHkgdmFpbGQgZm9yIGJvYXJkcyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJvYXJkLmFkZHJzdHIgPSBkZ2FwX3NhdmVzdHJpbmcocyk7Ci0JCQlwLT51LmJvYXJkLmFkZHIgPSBzaW1wbGVfc3RydG91bChzLCAmczIsIDApOwotCQkJaWYgKChpbnQpc3RybGVuKHMpID4gKGludCkoczIgLSBzKSkgewotCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBtZW1vcnkgYWRkcmVzcyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJvYXJkLnZfYWRkciA9IDE7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBNRU0gKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUENJSU5GTzoJLyogcGNpIGluZm9ybWF0aW9uICovCi0JCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgewotCQkJCWRnYXBfZXJyKCJtZW1vcnkgYWRkcmVzcyBvbmx5IHZhaWxkIGZvciBib2FyZHMiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ib2FyZC5wY2lidXNzdHIgPSBkZ2FwX3NhdmVzdHJpbmcocyk7Ci0JCQlwLT51LmJvYXJkLnBjaWJ1cyA9IHNpbXBsZV9zdHJ0b3VsKHMsICZzMiwgMCk7Ci0JCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIHBjaSBidXMiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ib2FyZC52X3BjaWJ1cyA9IDE7Ci0JCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJvYXJkLnBjaXNsb3RzdHIgPSBkZ2FwX3NhdmVzdHJpbmcocyk7Ci0JCQlwLT51LmJvYXJkLnBjaXNsb3QgPSBzaW1wbGVfc3RydG91bChzLCAmczIsIDApOwotCQkJaWYgKChpbnQpc3RybGVuKHMpID4gKGludCkoczIgLSBzKSkgewotCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBwY2kgc2xvdCIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJvYXJkLnZfcGNpc2xvdCA9IDE7Ci0KLQkJCURQUl9JTklUKCgiQWRkaW5nIFBDSUlORk8gKCVzICVzKSB0byBjb25maWcuLi5cbiIsIHAtPnUuYm9hcmQucGNpYnVzc3RyLCAKLQkJCQlwLT51LmJvYXJkLnBjaXNsb3RzdHIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTUVUSE9EOgotCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKLQkJCQlkZ2FwX2VycigiaW5zdGFsbCBtZXRob2Qgb25seSB2YWlsZCBmb3IgYm9hcmRzIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYm9hcmQubWV0aG9kID0gZGdhcF9zYXZlc3RyaW5nKHMpOwotCQkJcC0+dS5ib2FyZC52X21ldGhvZCA9IDE7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBNRVRIT0QgKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU1RBVFVTOgotCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKLQkJCQlkZ2FwX2VycigiY29uZmlnIHN0YXR1cyBvbmx5IHZhaWxkIGZvciBib2FyZHMiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ib2FyZC5zdGF0dXMgPSBkZ2FwX3NhdmVzdHJpbmcocyk7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBTVEFUVVMgKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTlBPUlRTOgkvKiBudW1iZXIgb2YgcG9ydHMgKi8KLQkJCWlmIChwLT50eXBlID09IEJOT0RFKSB7Ci0JCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCQlyZXR1cm4oLTEpOwotCQkJCX0KLQkJCQlwLT51LmJvYXJkLm5wb3J0ID0gKGNoYXIpc2ltcGxlX3N0cnRvbChzLCAmczIsIDApOwotCQkJCWlmICgoaW50KXN0cmxlbihzKSA+IChpbnQpKHMyIC0gcykpIHsKLQkJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIG51bWJlciBvZiBwb3J0cyIpOwotCQkJCQlyZXR1cm4oLTEpOwotCQkJCX0KLQkJCQlwLT51LmJvYXJkLnZfbnBvcnQgPSAxOwotCQkJfSBlbHNlIGlmIChwLT50eXBlID09IENOT0RFKSB7Ci0JCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCQlyZXR1cm4oLTEpOwotCQkJCX0KLQkJCQlwLT51LmNvbmMubnBvcnQgPSAoY2hhcilzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQkJaWYgKChpbnQpc3RybGVuKHMpID4gKGludCkoczIgLSBzKSkgewotCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgbnVtYmVyIG9mIHBvcnRzIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUuY29uYy52X25wb3J0ID0gMTsKLQkJCX0gZWxzZSBpZiAocC0+dHlwZSA9PSBNTk9ERSkgewotCQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQkJcmV0dXJuKC0xKTsKLQkJCQl9Ci0JCQkJcC0+dS5tb2R1bGUubnBvcnQgPSAoY2hhcilzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQkJaWYgKChpbnQpc3RybGVuKHMpID4gKGludCkoczIgLSBzKSkgewotCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgbnVtYmVyIG9mIHBvcnRzIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUubW9kdWxlLnZfbnBvcnQgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQlkZ2FwX2VycigibnBvcnRzIG9ubHkgdmFsaWQgZm9yIGNvbmNlbnRyYXRvcnMgb3IgbW9kdWxlcyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBOUE9SVFMgKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSUQ6CS8qIGxldHRlciBJRCB1c2VkIGluIHR0eSBuYW1lICovCi0JCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0KLQkJCXAtPnUuYm9hcmQuc3RhdHVzID0gZGdhcF9zYXZlc3RyaW5nKHMpOwotCi0JCQlpZiAocC0+dHlwZSA9PSBDTk9ERSkgewotCQkJCXAtPnUuY29uYy5pZCA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKLQkJCQlwLT51LmNvbmMudl9pZCA9IDE7Ci0JCQl9IGVsc2UgaWYgKHAtPnR5cGUgPT0gTU5PREUpIHsKLQkJCQlwLT51Lm1vZHVsZS5pZCA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKLQkJCQlwLT51Lm1vZHVsZS52X2lkID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGdhcF9lcnIoImlkIG9ubHkgdmFsaWQgZm9yIGNvbmNlbnRyYXRvcnMgb3IgbW9kdWxlcyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBJRCAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTVEFSVE86CS8qIHN0YXJ0IG9mZnNldCBvZiBJRCAqLwotCQkJaWYgKHAtPnR5cGUgPT0gQk5PREUpIHsKLQkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUuYm9hcmQuc3RhcnQgPSBzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQkJaWYgKChpbnQpc3RybGVuKHMpID4gKGludCkoczIgLSBzKSkgewotCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3Igc3RhcnQgb2YgdHR5IGNvdW50Iik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUuYm9hcmQudl9zdGFydCA9IDE7Ci0JCQl9IGVsc2UgaWYgKHAtPnR5cGUgPT0gQ05PREUpIHsKLQkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUuY29uYy5zdGFydCA9IHNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBzdGFydCBvZiB0dHkgY291bnQiKTsKLQkJCQkJcmV0dXJuKC0xKTsKLQkJCQl9Ci0JCQkJcC0+dS5jb25jLnZfc3RhcnQgPSAxOwotCQkJfSBlbHNlIGlmIChwLT50eXBlID09IE1OT0RFKSB7Ci0JCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCQlyZXR1cm4oLTEpOwotCQkJCX0KLQkJCQlwLT51Lm1vZHVsZS5zdGFydCA9IHNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBzdGFydCBvZiB0dHkgY291bnQiKTsKLQkJCQkJcmV0dXJuKC0xKTsKLQkJCQl9Ci0JCQkJcC0+dS5tb2R1bGUudl9zdGFydCA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCWRnYXBfZXJyKCJzdGFydCBvbmx5IHZhbGlkIGZvciBjb25jZW50cmF0b3JzIG9yIG1vZHVsZXMiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgU1RBUlQgKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVFRZTjoJLyogdHR5IG5hbWUgcHJlZml4ICovCi0JCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCi0JCQkJcmV0dXJuKC0xKTsKLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoVE5PREUpKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAgPSBwLT5uZXh0OwotCQkJaWYgKCAocyA9IGRnYXBfZ2V0d29yZChpbikpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWNlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlpZiAoIChwLT51LnR0eW5hbWUgPSBkZ2FwX3NhdmVzdHJpbmcocykpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgVFRZICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENVOgkvKiBjdSBuYW1lIHByZWZpeCAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAoIChwLT5uZXh0ID0gZGdhcF9uZXdub2RlKENVTk9ERSkpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcCA9IHAtPm5leHQ7Ci0JCQlpZiAoIChzID0gZGdhcF9nZXR3b3JkKGluKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY2VkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCWlmICggKHAtPnUuY3VuYW1lID0gZGdhcF9zYXZlc3RyaW5nKHMpKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCURQUl9JTklUKCgiQWRkaW5nIENVICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIExJTkU6CS8qIGxpbmUgaW5mb3JtYXRpb24gKi8KLQkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKLQkJCQlyZXR1cm4oLTEpOwotCQkJaWYgKGJyZCA9PSBOVUxMKSB7Ci0JCQkJZGdhcF9lcnIoIm11c3Qgc3BlY2lmeSBib2FyZCBiZWZvcmUgbGluZSBpbmZvIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXN3aXRjaCAoYnJkLT51LmJvYXJkLnR5cGUpIHsKLQkJCWNhc2UgUFBDTToKLQkJCQlkZ2FwX2VycigibGluZSBub3QgdmFpbGQgZm9yIFBDL2VtIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoTE5PREUpKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAgPSBwLT5uZXh0OwotCQkJY29uYyA9IE5VTEw7Ci0JCQlsaW5lID0gcDsKLQkJCWxpbmVjbnQrKzsKLQkJCURQUl9JTklUKCgiQWRkaW5nIExJTkUgdG8gY29uZmlnLi4uXG4iKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENPTkM6CS8qIGNvbmNlbnRyYXRvciBpbmZvcm1hdGlvbiAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAobGluZSA9PSBOVUxMKSB7Ci0JCQkJZGdhcF9lcnIoIm11c3Qgc3BlY2lmeSBsaW5lIGluZm8gYmVmb3JlIGNvbmNlbnRyYXRvciIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlpZiAoIChwLT5uZXh0ID0gZGdhcF9uZXdub2RlKENOT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQkJCWNvbmMgPSBwOwotCQkJaWYgKGxpbmVjbnQpCi0JCQkJYnJkLT51LmJvYXJkLmNvbmMyKys7Ci0JCQllbHNlCi0JCQkJYnJkLT51LmJvYXJkLmNvbmMxKys7Ci0KLQkJCURQUl9JTklUKCgiQWRkaW5nIENPTkMgdG8gY29uZmlnLi4uXG4iKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENYOgkvKiBjL3ggdHlwZSBjb25jZW50cmF0b3IgKi8KLQkJCWlmIChwLT50eXBlICE9IENOT0RFKSB7Ci0JCQkJZGdhcF9lcnIoImN4IG9ubHkgdmFsaWQgZm9yIGNvbmNlbnRyYXRvcnMiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5jb25jLnR5cGUgPSBDWDsKLQkJCXAtPnUuY29uYy52X3R5cGUgPSAxOwotCQkJRFBSX0lOSVQoKCJBZGRpbmcgQ1ggdG8gY29uZmlnLi4uXG4iKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEVQQzoJLyogZXBjIHR5cGUgY29uY2VudHJhdG9yICovCi0JCQlpZiAocC0+dHlwZSAhPSBDTk9ERSkgewotCQkJCWRnYXBfZXJyKCJjeCBvbmx5IHZhbGlkIGZvciBjb25jZW50cmF0b3JzIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuY29uYy50eXBlID0gRVBDOwotCQkJcC0+dS5jb25jLnZfdHlwZSA9IDE7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBFUEMgdG8gY29uZmlnLi4uXG4iKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIE1PRDoJLyogRUJJIG1vZHVsZSAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAoYnJkID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigibXVzdCBzcGVjaWZ5IGJvYXJkIGluZm8gYmVmb3JlIEVCSSBtb2R1bGVzIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXN3aXRjaCAoYnJkLT51LmJvYXJkLnR5cGUpIHsKLQkJCWNhc2UgUFBDTToKLQkJCQlsaW5lY250ID0gMDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKGNvbmMgPT0gTlVMTCkgewotCQkJCQlkZ2FwX2VycigibXVzdCBzcGVjaWZ5IGNvbmNlbnRyYXRvciBpbmZvIGJlZm9yZSBFQkkgbW9kdWxlIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCAocC0+bmV4dCA9IGRnYXBfbmV3bm9kZShNTk9ERSkpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcCA9IHAtPm5leHQ7Ci0JCQlpZiAobGluZWNudCkKLQkJCQlicmQtPnUuYm9hcmQubW9kdWxlMisrOwotCQkJZWxzZQotCQkJCWJyZC0+dS5ib2FyZC5tb2R1bGUxKys7Ci0KLQkJCURQUl9JTklUKCgiQWRkaW5nIE1PRCB0byBjb25maWcuLi5cbiIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUE9SVFM6CS8qIHBvcnRzIHR5cGUgRUJJIG1vZHVsZSAqLwotCQkJaWYgKHAtPnR5cGUgIT0gTU5PREUpIHsKLQkJCQlkZ2FwX2VycigicG9ydHMgb25seSB2YWxpZCBmb3IgRUJJIG1vZHVsZXMiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5tb2R1bGUudHlwZSA9IFBPUlRTOwotCQkJcC0+dS5tb2R1bGUudl90eXBlID0gMTsKLQkJCURQUl9JTklUKCgiQWRkaW5nIFBPUlRTIHRvIGNvbmZpZy4uLlxuIikpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNT0RFTToJLyogcG9ydHMgdHlwZSBFQkkgbW9kdWxlICovCi0JCQlpZiAocC0+dHlwZSAhPSBNTk9ERSkgewotCQkJCWRnYXBfZXJyKCJtb2RlbSBvbmx5IHZhbGlkIGZvciBtb2RlbSBtb2R1bGVzIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUubW9kdWxlLnR5cGUgPSBNT0RFTTsKLQkJCXAtPnUubW9kdWxlLnZfdHlwZSA9IDE7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBNT0RFTSB0byBjb25maWcuLi5cbiIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0FCTEU6Ci0JCQlpZiAocC0+dHlwZSA9PSBMTk9ERSkgewotCQkJCWlmICgocyA9IGRnYXBfZ2V0d29yZChpbikpID09IE5VTEwpIHsKLQkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQkJcmV0dXJuKC0xKTsKLQkJCQl9Ci0JCQkJcC0+dS5saW5lLmNhYmxlID0gZGdhcF9zYXZlc3RyaW5nKHMpOwotCQkJCXAtPnUubGluZS52X2NhYmxlID0gMTsKLQkJCX0KLQkJCURQUl9JTklUKCgiQWRkaW5nIENBQkxFICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFNQRUVEOgkvKiBzeW5jIGxpbmUgc3BlZWQgaW5kaWNhdGlvbiAqLwotCQkJaWYgKHAtPnR5cGUgPT0gTE5PREUpIHsKLQkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUubGluZS5zcGVlZCA9IChjaGFyKXNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCQlpZiAoKHNob3J0KXN0cmxlbihzKSA+IChzaG9ydCkoczIgLSBzKSkgewotCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgbGluZSBzcGVlZCIpOwotCQkJCQlyZXR1cm4oLTEpOwotCQkJCX0KLQkJCQlwLT51LmxpbmUudl9zcGVlZCA9IDE7Ci0JCQl9IGVsc2UgaWYgKHAtPnR5cGUgPT0gQ05PREUpIHsKLQkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUuY29uYy5zcGVlZCA9IChjaGFyKXNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCQlpZiAoKHNob3J0KXN0cmxlbihzKSA+IChzaG9ydCkoczIgLSBzKSkgewotCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgbGluZSBzcGVlZCIpOwotCQkJCQlyZXR1cm4oLTEpOwotCQkJCX0KLQkJCQlwLT51LmNvbmMudl9zcGVlZCA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCWRnYXBfZXJyKCJzcGVlZCB2YWxpZCBvbmx5IGZvciBsaW5lcyBvciBjb25jZW50cmF0b3JzLiIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBTUEVFRCAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDT05ORUNUOgotCQkJaWYgKHAtPnR5cGUgPT0gQ05PREUpIHsKLQkJCQlpZiAoKHMgPSBkZ2FwX2dldHdvcmQoaW4pKSA9PSBOVUxMKSB7Ci0JCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUuY29uYy5jb25uZWN0ID0gZGdhcF9zYXZlc3RyaW5nKHMpOwotCQkJCXAtPnUuY29uYy52X2Nvbm5lY3QgPSAxOwotCQkJfQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgQ09OTkVDVCAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUFJJTlQ6CS8qIHRyYW5zcGFyZW50IHByaW50IG5hbWUgcHJlZml4ICovCi0JCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCi0JCQkJcmV0dXJuKC0xKTsKLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoUE5PREUpKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAgPSBwLT5uZXh0OwotCQkJaWYgKCAocyA9IGRnYXBfZ2V0d29yZChpbikpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWNlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlpZiAoIChwLT51LnByaW50bmFtZSA9IGRnYXBfc2F2ZXN0cmluZyhzKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBQUklOVCAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTUFKT1I6CS8qIG1ham9yIG51bWJlciAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAoIChwLT5uZXh0ID0gZGdhcF9uZXdub2RlKEpOT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUubWFqb3JudW1iZXIgPSBzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIG1ham9yIG51bWJlciIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBDTUFKT1IgKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUxUUElOOgkvKiBhbHRwaW4gc2V0dGluZyAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAoIChwLT5uZXh0ID0gZGdhcF9uZXdub2RlKEFOT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYWx0cGluID0gc2ltcGxlX3N0cnRvbChzLCAmczIsIDApOwotCQkJaWYgKChpbnQpc3RybGVuKHMpID4gKGludCkoczIgLSBzKSkgewotCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBhbHRwaW4iKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgQUxUUElOICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFVTRUlOVFI6CQkvKiBlbmFibGUgaW50ZXJydXB0IHNldHRpbmcgKi8KLQkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKLQkJCQlyZXR1cm4oLTEpOwotCQkJaWYgKCAocC0+bmV4dCA9IGRnYXBfbmV3bm9kZShJTlRSTk9ERSkpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcCA9IHAtPm5leHQ7Ci0JCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LnVzZWludHIgPSBzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIHVzZWludHIiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgVVNFSU5UUiAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBUVFNJWjoJLyogc2l6ZSBvZiB0dHkgc3RydWN0dXJlICovCi0JCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCi0JCQkJcmV0dXJuKC0xKTsKLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoVFNOT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUudHR5c2l6ZSA9IHNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCWlmICgoaW50KXN0cmxlbihzKSA+IChpbnQpKHMyIC0gcykpIHsKLQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgdHR5c2l6ZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBUVFNJWiAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDSFNJWjoJLyogY2hhbm5lbCBzdHJ1Y3R1cmUgc2l6ZSAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAoIChwLT5uZXh0ID0gZGdhcF9uZXdub2RlKENTTk9ERSkpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcCA9IHAtPm5leHQ7Ci0JCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmNoc2l6ZSA9IHNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCWlmICgoaW50KXN0cmxlbihzKSA+IChpbnQpKHMyIC0gcykpIHsKLQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgY2hzaXplIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCURQUl9JTklUKCgiQWRkaW5nIENIU0laRSAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBCU1NJWjoJLyogYm9hcmQgc3RydWN0dXJlIHNpemUgKi8KLQkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKLQkJCQlyZXR1cm4oLTEpOwotCQkJaWYgKCAocC0+bmV4dCA9IGRnYXBfbmV3bm9kZShCU05PREUpKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAgPSBwLT5uZXh0OwotCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ic3NpemUgPSBzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIGJzc2l6ZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBCU1NJWiAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBVTlRTSVo6CS8qIHNjaGVkIHN0cnVjdHVyZSBzaXplICovCi0JCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCi0JCQkJcmV0dXJuKC0xKTsKLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoVVNOT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUudW5zaXplID0gc2ltcGxlX3N0cnRvbChzLCAmczIsIDApOwotCQkJaWYgKChpbnQpc3RybGVuKHMpID4gKGludCkoczIgLSBzKSkgewotCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBzY2hlZHNpemUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgVU5UU0laICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEYyU0laOgkvKiBmMjIwMCBzdHJ1Y3R1cmUgc2l6ZSAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAoIChwLT5uZXh0ID0gZGdhcF9uZXdub2RlKEZTTk9ERSkpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcCA9IHAtPm5leHQ7Ci0JCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmYyc2l6ZSA9IHNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCWlmICgoaW50KXN0cmxlbihzKSA+IChpbnQpKHMyIC0gcykpIHsKLQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgZjIyMDBzaXplIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCURQUl9JTklUKCgiQWRkaW5nIEYyU0laICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFZQU0laOgkvKiB2cGl4IHN0cnVjdHVyZSBzaXplICovCi0JCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCi0JCQkJcmV0dXJuKC0xKTsKLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoVlNOT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUudnBpeHNpemUgPSBzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIHZwaXhzaXplIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCURQUl9JTklUKCgiQWRkaW5nIFZQU0laICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotCi0vKgotICogZGdhcF9zaW5kZXg6IG11Y2ggbGlrZSBpbmRleCgpLCBidXQgaXQgbG9va3MgZm9yIGEgbWF0Y2ggb2YgYW55IGNoYXJhY3RlciBpbgotICogdGhlIGdyb3VwLCBhbmQgcmV0dXJucyB0aGF0IHBvc2l0aW9uLiAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhIF4sIHRoZW4KLSAqIHRoaXMgd2lsbCBtYXRjaCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBub3QgaW4gdGhhdCBncm91cC4KLSAqLwotc3RhdGljIGNoYXIgKmRnYXBfc2luZGV4IChjaGFyICpzdHJpbmcsIGNoYXIgKmdyb3VwKQotewotCWNoYXIgICAgKnB0cjsKLQotCWlmICghc3RyaW5nIHx8ICFncm91cCkKLQkJcmV0dXJuIChjaGFyICopIE5VTEw7Ci0KLQlpZiAoKmdyb3VwID09ICdeJykgeyAgIAotCQlncm91cCsrOwotCQlmb3IgKDsgKnN0cmluZzsgc3RyaW5nKyspIHsKLQkJCWZvciAocHRyID0gZ3JvdXA7ICpwdHI7IHB0cisrKSB7Ci0JCQkJaWYgKCpwdHIgPT0gKnN0cmluZykKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoKnB0ciA9PSAnXDAnKQotCQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQl9ICAgCi0JZWxzZSB7Ci0JCWZvciAoOyAqc3RyaW5nOyBzdHJpbmcrKykgewotCQkJZm9yIChwdHIgPSBncm91cDsgKnB0cjsgcHRyKyspIHsKLQkJCQlpZiAoKnB0ciA9PSAqc3RyaW5nKQotCQkJCQlyZXR1cm4gc3RyaW5nOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIChjaGFyICopIE5VTEw7Ci19Ci0KLQotLyoKLSAqIEdldCBhIHRva2VuIGZyb20gdGhlIGlucHV0IGZpbGU7IHJldHVybiAwIGlmIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAqLwotc3RhdGljIGludCBkZ2FwX2dldHRvayhjaGFyICoqaW4sIHN0cnVjdCBjbm9kZSAqcCkKLXsKLQljaGFyCSp3OwotCXN0cnVjdCB0b2tsaXN0ICp0OwotCQotCWlmIChzdHJzdHIoZGdhcF9jd29yZCwgImJvYXIiKSkgewotCQl3ID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJc25wcmludGYoZGdhcF9jd29yZCwgTUFYQ1dPUkQsICIlcyIsIHcpOwotCQlmb3IgKHQgPSBkZ2FwX3RsaXN0OyB0LT50b2tlbiAhPSAwOyB0KyspIHsKLQkJCWlmICggIXN0cmNtcCh3LCB0LT5zdHJpbmcpKSB7Ci0JCQkJcmV0dXJuKHQtPnRva2VuKTsKLQkJCX0gCi0JCX0KLQkJZGdhcF9lcnIoImJvYXJkICEhdHlwZSBub3Qgc3BlY2lmaWVkIik7Ci0JCXJldHVybigxKTsKLQl9Ci0JZWxzZSB7Ci0JCXdoaWxlICggKHcgPSBkZ2FwX2dldHdvcmQoaW4pKSAhPSBOVUxMICkgewotCQkJc25wcmludGYoZGdhcF9jd29yZCwgTUFYQ1dPUkQsICIlcyIsIHcpOwotCQkJZm9yICh0ID0gZGdhcF90bGlzdDsgdC0+dG9rZW4gIT0gMDsgdCsrKSB7Ci0JCQkJaWYgKCAhc3RyY21wKHcsIHQtPnN0cmluZykgKQotCQkJCQlyZXR1cm4odC0+dG9rZW4pOwotCQkJfQotCQl9Ci0JCXJldHVybigwKTsKLQl9Ci19Ci0KLQotLyoKLSAqIGdldCBhIHdvcmQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBhbHNvIGtlZXAgdHJhY2sgb2YgY3VycmVudCBsaW5lIG51bWJlci4KLSAqIHdvcmRzIGFyZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4KLSAqLwotc3RhdGljIGNoYXIgKmRnYXBfZ2V0d29yZChjaGFyICoqaW4pCi17Ci0JY2hhciAqcmV0X3B0ciA9ICppbjsKLQotICAgICAgICBjaGFyICpwdHIgPSBkZ2FwX3NpbmRleCgqaW4sICIgXHRcbiIpOwotCi0JLyogSWYgbm8gd29yZCBmb3VuZCwgcmV0dXJuIG51bGwgKi8KLQlpZiAoIXB0cikKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBNYXJrIG5ldyBsb2NhdGlvbiBmb3Igb3VyIGJ1ZmZlciAqLwotCSpwdHIgPSAnXDAnOwotCSppbiA9IHB0ciArIDE7Ci0KLQkvKiBFYXQgYW55IGV4dHJhIHNwYWNlcy90YWJzL25ld2xpbmVzIHRoYXQgbWlnaHQgYmUgcHJlc2VudCAqLwotCXdoaWxlICgqaW4gJiYgKippbiAmJiAoKCoqaW4gPT0gJyAnKSB8fCAoKippbiA9PSAnXHQnKSB8fCAoKippbiA9PSAnXG4nKSkpIHsKLQkJKippbiA9ICdcMCc7Ci0JCSppbiA9ICppbiArIDE7Ci0JfQotCi0JcmV0dXJuIHJldF9wdHI7Ci19Ci0KLQotLyoKLSAqIHByaW50IGFuIGVycm9yIG1lc3NhZ2UsIGdpdmluZyB0aGUgbGluZSBudW1iZXIgaW4gdGhlIGZpbGUgd2hlcmUKLSAqIHRoZSBlcnJvciBvY2N1cnJlZC4KLSAqLwotc3RhdGljIHZvaWQgZGdhcF9lcnIoY2hhciAqcykKLXsKLQlwcmludGsoIkRHQVA6IHBhcnNlOiAlc1xuIiwgcyk7Ci19Ci0KLQotLyoKLSAqIGFsbG9jYXRlIGEgbmV3IGNvbmZpZ3VyYXRpb24gbm9kZSBvZiB0eXBlIHQKLSAqLwotc3RhdGljIHN0cnVjdCBjbm9kZSAqZGdhcF9uZXdub2RlKGludCB0KQotewotCXN0cnVjdCBjbm9kZSAqbjsKLQotCW4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY25vZGUpLCBHRlBfQVRPTUlDKTsKLQlpZiAobiAhPSBOVUxMKSB7Ci0JCW1lbXNldCgoY2hhciAqKW4sIDAsIHNpemVvZihzdHJ1Y3QgY25vZGUpKTsKLQkJbi0+dHlwZSA9IHQ7Ci0JfQotCXJldHVybihuKTsKLX0KLQotCi0vKgotICogZGdhcF9jaGVja25vZGU6IHNlZSBpZiBhbGwgdGhlIG5lY2Vzc2FyeSBpbmZvIGhhcyBiZWVuIHN1cHBsaWVkIGZvciBhIG5vZGUKLSAqIGJlZm9yZSBjcmVhdGluZyB0aGUgbmV4dCBub2RlLgotICovCi1zdGF0aWMgaW50IGRnYXBfY2hlY2tub2RlKHN0cnVjdCBjbm9kZSAqcCkKLXsKLQlzd2l0Y2ggKHAtPnR5cGUpIHsKLQljYXNlIEJOT0RFOgotCQlpZiAocC0+dS5ib2FyZC52X3R5cGUgPT0gMCkgewotCQkJZGdhcF9lcnIoImJvYXJkIHR5cGUgIW5vdCBzcGVjaWZpZWQiKTsKLQkJCXJldHVybigxKTsKLQkJfQotCi0JCXJldHVybigwKTsKLQotCWNhc2UgTE5PREU6Ci0JCWlmIChwLT51LmxpbmUudl9zcGVlZCA9PSAwKSB7Ci0JCQlkZ2FwX2VycigibGluZSBzcGVlZCBub3Qgc3BlY2lmaWVkIik7Ci0JCQlyZXR1cm4oMSk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCi0JY2FzZSBDTk9ERToKLQkJaWYgKHAtPnUuY29uYy52X3R5cGUgPT0gMCkgewotCQkJZGdhcF9lcnIoImNvbmNlbnRyYXRvciB0eXBlIG5vdCBzcGVjaWZpZWQiKTsKLQkJCXJldHVybigxKTsKLQkJfQotCQlpZiAocC0+dS5jb25jLnZfc3BlZWQgPT0gMCkgewotCQkJZGdhcF9lcnIoImNvbmNlbnRyYXRvciBsaW5lIHNwZWVkIG5vdCBzcGVjaWZpZWQiKTsKLQkJCXJldHVybigxKTsKLQkJfQotCQlpZiAocC0+dS5jb25jLnZfbnBvcnQgPT0gMCkgewotCQkJZGdhcF9lcnIoIm51bWJlciBvZiBwb3J0cyBvbiBjb25jZW50cmF0b3Igbm90IHNwZWNpZmllZCIpOwotCQkJcmV0dXJuKDEpOwotCQl9Ci0JCWlmIChwLT51LmNvbmMudl9pZCA9PSAwKSB7Ci0JCQlkZ2FwX2VycigiY29uY2VudHJhdG9yIGlkIGxldHRlciBub3Qgc3BlY2lmaWVkIik7Ci0JCQlyZXR1cm4oMSk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCi0JY2FzZSBNTk9ERToKLQkJaWYgKHAtPnUubW9kdWxlLnZfdHlwZSA9PSAwKSB7Ci0JCQlkZ2FwX2VycigiRUJJIG1vZHVsZSB0eXBlIG5vdCBzcGVjaWZpZWQiKTsKLQkJCXJldHVybigxKTsKLQkJfQotCQlpZiAocC0+dS5tb2R1bGUudl9ucG9ydCA9PSAwKSB7Ci0JCQlkZ2FwX2VycigibnVtYmVyIG9mIHBvcnRzIG9uIEVCSSBtb2R1bGUgbm90IHNwZWNpZmllZCIpOwotCQkJcmV0dXJuKDEpOwotCQl9Ci0JCWlmIChwLT51Lm1vZHVsZS52X2lkID09IDApIHsKLQkJCWRnYXBfZXJyKCJFQkkgbW9kdWxlIGlkIGxldHRlciBub3Qgc3BlY2lmaWVkIik7Ci0JCQlyZXR1cm4oMSk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLS8qCi0gKiBzYXZlIGEgc3RyaW5nIHNvbWV3aGVyZQotICovCi1zdGF0aWMgY2hhcgkqZGdhcF9zYXZlc3RyaW5nKGNoYXIgKnMpCi17Ci0JY2hhcgkqcDsKLQlpZiAoIChwID0ga21hbGxvYyhzdHJsZW4ocykgKyAxLCBHRlBfQVRPTUlDKSApICE9IE5VTEwpIHsKLQkJc3RyY3B5KHAsIHMpOwotCX0KLQlyZXR1cm4ocCk7Ci19Ci0KLQotLyoKLSAqIEdpdmVuIGEgYm9hcmQgcG9pbnRlciwgcmV0dXJucyB3aGV0aGVyIHdlIHNob3VsZCB1c2UgaW50ZXJydXB0cyBvciBub3QuCi0gKi8KLXVpbnQgZGdhcF9jb25maWdfZ2V0X3VzZWludHIoc3RydWN0IGJvYXJkX3QgKmJkKQotewotCXN0cnVjdCBjbm9kZSAqcCA9IE5VTEw7Ci0KLQlpZiAoIWJkKQotCQlyZXR1cm4oMCk7Ci0KLQlmb3IgKHAgPSBiZC0+YmRfY29uZmlnOyBwOyBwID0gcC0+bmV4dCkgewotCQlzd2l0Y2ggKHAtPnR5cGUpIHsKLQkJY2FzZSBJTlRSTk9ERToKLQkJCS8qCi0JCQkgKiBjaGVjayBmb3IgcGN4ciB0eXBlcy4KLQkJCSAqLwotCQkJcmV0dXJuIHAtPnUudXNlaW50cjsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogSWYgbm90IGZvdW5kLCB0aGVuIGRvbid0IHR1cm4gb24gaW50ZXJydXB0cy4gKi8KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogR2l2ZW4gYSBib2FyZCBwb2ludGVyLCByZXR1cm5zIHdoZXRoZXIgd2UgdHVybiBvbiBhbHRwaW4gb3Igbm90LgotICovCi11aW50IGRnYXBfY29uZmlnX2dldF9hbHRwaW4oc3RydWN0IGJvYXJkX3QgKmJkKQotewotCXN0cnVjdCBjbm9kZSAqcCA9IE5VTEw7Ci0KLQlpZiAoIWJkKQotCQlyZXR1cm4oMCk7Ci0KLQlmb3IgKHAgPSBiZC0+YmRfY29uZmlnOyBwOyBwID0gcC0+bmV4dCkgewotCQlzd2l0Y2ggKHAtPnR5cGUpIHsKLQkJY2FzZSBBTk9ERToKLQkJCS8qCi0JCQkgKiBjaGVjayBmb3IgcGN4ciB0eXBlcy4KLQkJCSAqLwotCQkJcmV0dXJuIHAtPnUuYWx0cGluOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiBJZiBub3QgZm91bmQsIHRoZW4gZG9uJ3QgdHVybiBvbiBpbnRlcnJ1cHRzLiAqLwotCXJldHVybiAwOwotfQotCi0KLQotLyoKLSAqIEdpdmVuIGEgc3BlY2lmaWMgdHlwZSBvZiBib2FyZCwgaWYgZm91bmQsIGRldGFjaGVkIGxpbmsgYW5kIAotICogcmV0dXJucyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBpbiB0aGUgbGlzdC4KLSAqLwotc3RydWN0IGNub2RlICpkZ2FwX2ZpbmRfY29uZmlnKGludCB0eXBlLCBpbnQgYnVzLCBpbnQgc2xvdCkKLXsKLQlzdHJ1Y3QgY25vZGUgKnAsICpwcmV2ID0gTlVMTCwgKnByZXYyID0gTlVMTCwgKmZvdW5kID0gTlVMTDsKLQotCXAgPSAmZGdhcF9oZWFkOwotCi0Jd2hpbGUgKHAtPm5leHQgIT0gTlVMTCkgewotCQlwcmV2ID0gcDsKLQkJcCA9IHAtPm5leHQ7Ci0KLQkJaWYgKHAtPnR5cGUgPT0gQk5PREUpIHsKLQotCQkJaWYgKHAtPnUuYm9hcmQudHlwZSA9PSB0eXBlKSB7Ci0KLQkJCQlpZiAocC0+dS5ib2FyZC52X3BjaWJ1cyAmJiBwLT51LmJvYXJkLnBjaWJ1cyAhPSBidXMpIHsKLQkJCQkJRFBSKCgiRm91bmQgbWF0Y2hpbmcgYm9hcmQsIGJ1dCB3cm9uZyBidXMgcG9zaXRpb24uIFN5c3RlbSBzYXlzIGJ1cyAlZCwgd2Ugd2FudCBidXMgJWxkXG4iLAotCQkJCQkJYnVzLCBwLT51LmJvYXJkLnBjaWJ1cykpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHAtPnUuYm9hcmQudl9wY2lzbG90ICYmIHAtPnUuYm9hcmQucGNpc2xvdCAhPSBzbG90KSB7Ci0JCQkJCURQUl9JTklUKCgiRm91bmQgbWF0Y2hpbmcgYm9hcmQsIGJ1dCB3cm9uZyBzbG90IHBvc2l0aW9uLiBTeXN0ZW0gc2F5cyBzbG90ICVkLCB3ZSB3YW50IHNsb3QgJWxkXG4iLAotCQkJCQkJc2xvdCwgcC0+dS5ib2FyZC5wY2lzbG90KSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCURQUl9JTklUKCgiTWF0Y2hlZCB0eXBlIGluIGNvbmZpZyBmaWxlXG4iKSk7Ci0KLQkJCQlmb3VuZCA9IHA7Ci0JCQkJLyoKLQkJCQkgKiBLZWVwIHdhbGtpbmcgdGhydSB0aGUgbGlzdCB0aWxsIHdlIGZpbmQgdGhlIG5leHQgYm9hcmQuCi0JCQkJICovCi0JCQkJd2hpbGUgKHAtPm5leHQgIT0gTlVMTCkgewotCQkJCQlwcmV2MiA9IHA7Ci0JCQkJCXAgPSBwLT5uZXh0OwotCQkJCQlpZiAocC0+dHlwZSA9PSBCTk9ERSkgewotCi0JCQkJCQkvKgotCQkJCQkJICogTWFyayB0aGUgZW5kIG9mIG91ciAxIGJvYXJkIGNoYWluIG9mIGNvbmZpZ3MuCi0JCQkJCQkgKi8KLQkJCQkJCXByZXYyLT5uZXh0ID0gTlVMTDsKLQotCQkJCQkJLyoKLQkJCQkJCSAqIExpbmsgdGhlICJuZXh0IiBib2FyZCB0byB0aGUgcHJldmlvdXMgYm9hcmQsCi0JCQkJCQkgKiBlZmZlY3RpdmVseSAidW5saW5raW5nIiBvdXIgYm9hcmQgZnJvbSB0aGUgbWFpbiBjb25maWcuCi0JCQkJCQkgKi8KLQkJCQkJCXByZXYtPm5leHQgPSBwOwotCi0JCQkJCQlyZXR1cm4gZm91bmQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLyoKLQkJCQkgKiBJdCBtdXN0IGJlIHRoZSBsYXN0IGJvYXJkIGluIHRoZSBsaXN0LgotCQkJCSAqLwotCQkJCXByZXYtPm5leHQgPSBOVUxMOwotCQkJCXJldHVybiBmb3VuZDsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIEdpdmVuIGEgYm9hcmQgcG9pbnRlciwgd2Fsa3MgdGhlIGNvbmZpZyBsaW5rLCBjb3VudGluZyB1cAotICogYWxsIHBvcnRzIHVzZXIgc3BlY2lmaWVkIHNob3VsZCBiZSBvbiB0aGUgYm9hcmQuCi0gKiAoVGhpcyBkb2VzIE5PVCBtZWFuIHRoZXkgYXJlIGFsbCBhY3R1YWxseSBwcmVzZW50IHJpZ2h0IG5vdyB0aG8pCi0gKi8KLXVpbnQgZGdhcF9jb25maWdfZ2V0X251bWJlcl9vZl9wb3J0cyhzdHJ1Y3QgYm9hcmRfdCAqYmQpCi17Ci0JaW50IGNvdW50ID0gMDsKLQlzdHJ1Y3QgY25vZGUgKnAgPSBOVUxMOwotCi0JaWYgKCFiZCkKLQkJcmV0dXJuKDApOwotCi0JZm9yIChwID0gYmQtPmJkX2NvbmZpZzsgcDsgcCA9IHAtPm5leHQpIHsKLQotCQlzd2l0Y2ggKHAtPnR5cGUpIHsKLQkJY2FzZSBCTk9ERToKLQkJCS8qCi0JCQkgKiBjaGVjayBmb3IgcGN4ciB0eXBlcy4KLQkJCSAqLwotCQkJaWYgKHAtPnUuYm9hcmQudHlwZSA+IEVQQ0ZFKQotCQkJCWNvdW50ICs9IHAtPnUuYm9hcmQubnBvcnQ7Ci0JCQlicmVhazsKLQkJY2FzZSBDTk9ERToKLQkJCWNvdW50ICs9IHAtPnUuY29uYy5ucG9ydDsKLQkJCWJyZWFrOwotCQljYXNlIE1OT0RFOgotCQkJY291bnQgKz0gcC0+dS5tb2R1bGUubnBvcnQ7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gKGNvdW50KTsKLX0KLQotY2hhciAqZGdhcF9jcmVhdGVfY29uZmlnX3N0cmluZyhzdHJ1Y3QgYm9hcmRfdCAqYmQsIGNoYXIgKnN0cmluZykKLXsKLQljaGFyICpwdHIgPSBzdHJpbmc7Ci0Jc3RydWN0IGNub2RlICpwID0gTlVMTDsKLQlzdHJ1Y3QgY25vZGUgKnEgPSBOVUxMOwotCWludCBzcGVlZDsKLQotCWlmICghYmQpIHsKLQkJKnB0ciA9IDB4ZmY7Ci0JCXJldHVybiBzdHJpbmc7Ci0JfQotCi0JZm9yIChwID0gYmQtPmJkX2NvbmZpZzsgcDsgcCA9IHAtPm5leHQpIHsKLQotCQlzd2l0Y2ggKHAtPnR5cGUpIHsKLQkJY2FzZSBMTk9ERToKLQkJCSpwdHIgPSAnXDAnOwotCQkJcHRyKys7Ci0JCQkqcHRyID0gcC0+dS5saW5lLnNwZWVkOwotCQkJcHRyKys7Ci0JCQlicmVhazsKLQkJY2FzZSBDTk9ERToKLQkJCS8qCi0JCQkgKiBCZWNhdXNlIHRoZSBFUEMvY29uIGNvbmNlbnRyYXRvcnMgY2FuIGhhdmUgRU0gbW9kdWxlcwotCQkJICogaGFuZ2luZyBvZmYgb2YgdGhlbSwgd2UgaGF2ZSB0byB3YWxrIGFoZWFkIGluIHRoZSBsaXN0Ci0JCQkgKiBhbmQga2VlcCBhZGRpbmcgdGhlIG51bWJlciBvZiBwb3J0cyBvbiBlYWNoIEVNIHRvIHRoZSBjb25maWcuCi0JCQkgKiBVR0ghCi0JCQkgKi8KLQkJCXNwZWVkID0gcC0+dS5jb25jLnNwZWVkOwotCQkJcSA9IHAtPm5leHQ7Ci0JCQlpZiAoKHEgIT0gTlVMTCkgJiYgKHEtPnR5cGUgPT0gTU5PREUpICkgewotCQkJCSpwdHIgPSAocC0+dS5jb25jLm5wb3J0ICsgMHg4MCk7Ci0JCQkJcHRyKys7Ci0JCQkJcCA9IHE7Ci0JCQkJd2hpbGUgKChxLT5uZXh0ICE9IE5VTEwpICYmIChxLT5uZXh0LT50eXBlKSA9PSBNTk9ERSkgewotCQkJCQkqcHRyID0gKHEtPnUubW9kdWxlLm5wb3J0ICsgMHg4MCk7Ci0JCQkJCXB0cisrOwotCQkJCQlwID0gcTsKLQkJCQkJcSA9IHEtPm5leHQ7Ci0JCQkJfQotCQkJCSpwdHIgPSBxLT51Lm1vZHVsZS5ucG9ydDsKLQkJCQlwdHIrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJKnB0ciA9IHAtPnUuY29uYy5ucG9ydDsKLQkJCQlwdHIrKzsKLQkJCX0KLQotCQkJKnB0ciA9IHNwZWVkOwotCQkJcHRyKys7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCSpwdHIgPSAweGZmOwotCXJldHVybiBzdHJpbmc7Ci19Ci0KLQotCi1jaGFyICpkZ2FwX2dldF9jb25maWdfbGV0dGVycyhzdHJ1Y3QgYm9hcmRfdCAqYmQsIGNoYXIgKnN0cmluZykKLXsKLQlpbnQgZm91bmQgPSBGQUxTRTsKLQljaGFyICpwdHIgPSBzdHJpbmc7Ci0Jc3RydWN0IGNub2RlICpjcHRyID0gTlVMTDsKLQlpbnQgbGVuID0gMDsKLQlpbnQgbGVmdCA9IE1BWFRUWU5BTUVMRU47Ci0KLQlpZiAoIWJkKSB7Ci0JCXJldHVybiAiPE5VTEw+IjsKLQl9Ci0KLQlmb3IgKGNwdHIgPSBiZC0+YmRfY29uZmlnOyBjcHRyOyBjcHRyID0gY3B0ci0+bmV4dCkgewotCi0JCWlmICgoY3B0ci0+dHlwZSA9PSBCTk9ERSkgJiYKLQkJICAgICAoKGNwdHItPnUuYm9hcmQudHlwZSA9PSBBUE9SVDJfOTIwUCkgfHwgKGNwdHItPnUuYm9hcmQudHlwZSA9PSBBUE9SVDRfOTIwUCkgfHwKLQkJICAgICAoY3B0ci0+dS5ib2FyZC50eXBlID09IEFQT1JUOF85MjBQKSB8fCAoY3B0ci0+dS5ib2FyZC50eXBlID09IFBBUE9SVDQpIHx8Ci0JCSAgICAgKGNwdHItPnUuYm9hcmQudHlwZSA9PSBQQVBPUlQ4KSkpIHsKLQotCQkJZm91bmQgPSBUUlVFOwotCQl9Ci0KLQkJaWYgKGNwdHItPnR5cGUgPT0gVE5PREUgJiYgZm91bmQgPT0gVFJVRSkgewotCQkJY2hhciAqcHRyMTsKLQkJCWlmIChzdHJzdHIoY3B0ci0+dS50dHluYW1lLCAidHR5IikpIHsKLQkJCQlwdHIxID0gY3B0ci0+dS50dHluYW1lOwotCQkJCXB0cjEgKz0gMzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXB0cjEgPSBjcHRyLT51LnR0eW5hbWU7Ci0JCQl9Ci0JCQlpZiAocHRyMSkgewotCQkJCWxlbiA9IHNucHJpbnRmKHB0ciwgbGVmdCwgIiVzIiwgcHRyMSk7Ci0JCQkJbGVmdCAtPSBsZW47Ci0JCQkJcHRyICArPSBsZW47Ci0JCQkJaWYgKGxlZnQgPD0gMCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY3B0ci0+dHlwZSA9PSBDTk9ERSkgewotCQkJaWYgKGNwdHItPnUuY29uYy5pZCkgewotCQkJCWxlbiA9IHNucHJpbnRmKHB0ciwgbGVmdCwgIiVzIiwgY3B0ci0+dS5jb25jLmlkKTsKLQkJCQlsZWZ0IC09IGxlbjsKLQkJCQlwdHIgICs9IGxlbjsKLQkJCQlpZiAobGVmdCA8PSAwKQotCQkJCQlicmVhazsKLQkJCX0KLSAgICAgICAgICAgICAgICB9Ci0KLQkJaWYgKGNwdHItPnR5cGUgPT0gTU5PREUpIHsKLQkJCWlmIChjcHRyLT51Lm1vZHVsZS5pZCkgewotCQkJCWxlbiA9IHNucHJpbnRmKHB0ciwgbGVmdCwgIiVzIiwgY3B0ci0+dS5tb2R1bGUuaWQpOwotCQkJCWxlZnQgLT0gbGVuOwotCQkJCXB0ciAgKz0gbGVuOwotCQkJCWlmIChsZWZ0IDw9IDApCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIHN0cmluZzsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfcGFyc2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfcGFyc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyOGM0Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3BhcnNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKglOT1RFOiBUSElTIElTIEEgU0hBUkVEIEhFQURFUi4gRE8gTk9UIENIQU5HRSBDT0RJTkcgU1RZTEUhISEKLSAqLwotCi0jaWZuZGVmIF9ER0FQX1BBUlNFX0gKLSNkZWZpbmUgX0RHQVBfUEFSU0VfSAotCi0jaW5jbHVkZSAiZGdhcF9kcml2ZXIuaCIKLQotZXh0ZXJuIGludCBkZ2FwX3BhcnNlZmlsZShjaGFyICoqaW4sIGludCBSZW1vdmUpOwotZXh0ZXJuIHN0cnVjdCBjbm9kZSAqZGdhcF9maW5kX2NvbmZpZyhpbnQgdHlwZSwgaW50IGJ1cywgaW50IHNsb3QpOwotZXh0ZXJuIHVpbnQgZGdhcF9jb25maWdfZ2V0X251bWJlcl9vZl9wb3J0cyhzdHJ1Y3QgYm9hcmRfdCAqYmQpOwotZXh0ZXJuIGNoYXIgKmRnYXBfY3JlYXRlX2NvbmZpZ19zdHJpbmcoc3RydWN0IGJvYXJkX3QgKmJkLCBjaGFyICpzdHJpbmcpOwotZXh0ZXJuIGNoYXIgKmRnYXBfZ2V0X2NvbmZpZ19sZXR0ZXJzKHN0cnVjdCBib2FyZF90ICpiZCwgY2hhciAqc3RyaW5nKTsKLWV4dGVybiB1aW50IGRnYXBfY29uZmlnX2dldF91c2VpbnRyKHN0cnVjdCBib2FyZF90ICpiZCk7Ci1leHRlcm4gdWludCBkZ2FwX2NvbmZpZ19nZXRfYWx0cGluKHN0cnVjdCBib2FyZF90ICpiZCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9wY2kuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfcGNpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZWQzNzQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9wY2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKLSAqCVNjb3R0IEggS2lsYXUgPFNjb3R0X0tpbGF1IGF0IGRpZ2kgZG90IGNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKLSAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCU5PVEU6IFRISVMgSVMgQSBTSEFSRUQgSEVBREVSLiBETyBOT1QgQ0hBTkdFIENPRElORyBTVFlMRSEhIQotICovCi0KLS8qICRJZDogZGdhcF9wY2kuaCx2IDEuMSAyMDA5LzEwLzIzIDE0OjAxOjU3IG1hcmtoIEV4cCAkICovCi0KLSNpZm5kZWYgX19ER0FQX1BDSV9ICi0jZGVmaW5lIF9fREdBUF9QQ0lfSAotCi0jZGVmaW5lIFBDSU1BWCAzMgkJCS8qIG1heGltdW0gbnVtYmVyIG9mIFBDSSBib2FyZHMgKi8KLQotI2RlZmluZSBESUdJX1ZJRAkJMHgxMTRGCi0KLSNkZWZpbmUgUENJX0RFVklDRV9FUENfRElECTB4MDAwMgotI2RlZmluZSBQQ0lfREVWSUNFX1hFTV9ESUQJMHgwMDA0Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfWFJfRElECTB4MDAwNQotI2RlZmluZSBQQ0lfREVWSUNFX0NYX0RJRAkweDAwMDYKLSNkZWZpbmUgUENJX0RFVklDRV9YUkpfRElECTB4MDAwOQkvKiBQTFgtYmFzZWQgWHIgYWRhcHRlciAqLwotI2RlZmluZSBQQ0lfREVWSUNFX1hSX0lCTV9ESUQJMHgwMDExCS8qIElCTSA4LXBvcnQgQXN5bmMgQWRhcHRlciAqLwotI2RlZmluZSBQQ0lfREVWSUNFX1hSX0JVTExfRElECTB4MDAxMwkvKiBCVUxMIDgtcG9ydCBBc3luYyBBZGFwdGVyICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfWFJfU0FJUF9ESUQJMHgwMDFjCS8qIFNBSVAgY2FyZCAtIFhyIGFkYXB0ZXIgKi8KLSNkZWZpbmUgUENJX0RFVklDRV9YUl80MjJfRElECTB4MDAxMgkvKiBYci00MjIgKi8KLSNkZWZpbmUgUENJX0RFVklDRV85MjBfMl9ESUQJMHgwMDM0CS8qIFhSLVBsdXMgOTIwIEssIDIgcG9ydCAqLwotI2RlZmluZSBQQ0lfREVWSUNFXzkyMF80X0RJRAkweDAwMjYJLyogWFItUGx1cyA5MjAgSywgNCBwb3J0ICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfOTIwXzhfRElECTB4MDAyNwkvKiBYUi1QbHVzIDkyMCBLLCA4IHBvcnQgKi8KLSNkZWZpbmUgUENJX0RFVklDRV9FUENKX0RJRAkweDAwMGEJLyogUExYIDkwNjAgY2hpcCBmb3IgUENJICAqLwotI2RlZmluZSBQQ0lfREVWSUNFX0NYX0lCTV9ESUQJMHgwMDFiCS8qIElCTSAxMjgtcG9ydCBBc3luYyBBZGFwdGVyICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfOTIwXzhfSFBfRElECTB4MDA1OAkvKiBIUCBYUi1QbHVzIDkyMCBLLCA4IHBvcnQgKi8KLSNkZWZpbmUgUENJX0RFVklDRV9YRU1fSFBfRElECTB4MDA1OSAgLyogSFAgWGVtIFBDSSAqLwotCi0jZGVmaW5lIFBDSV9ERVZJQ0VfWEVNX05BTUUJIkFjY2VsZVBvcnQgWEVNIgotI2RlZmluZSBQQ0lfREVWSUNFX0NYX05BTUUJIkFjY2VsZVBvcnQgQ1giCi0jZGVmaW5lIFBDSV9ERVZJQ0VfWFJfTkFNRQkiQWNjZWxlUG9ydCBYciIKLSNkZWZpbmUgUENJX0RFVklDRV9YUkpfTkFNRQkiQWNjZWxlUG9ydCBYciAoUExYKSIKLSNkZWZpbmUgUENJX0RFVklDRV9YUl9TQUlQX05BTUUJIkFjY2VsZVBvcnQgWHIgKFNBSVApIgotI2RlZmluZSBQQ0lfREVWSUNFXzkyMF8yX05BTUUJIkFjY2VsZVBvcnQgWHI5MjAgMiBwb3J0IgotI2RlZmluZSBQQ0lfREVWSUNFXzkyMF80X05BTUUJIkFjY2VsZVBvcnQgWHI5MjAgNCBwb3J0IgotI2RlZmluZSBQQ0lfREVWSUNFXzkyMF84X05BTUUJIkFjY2VsZVBvcnQgWHI5MjAgOCBwb3J0IgotI2RlZmluZSBQQ0lfREVWSUNFX1hSXzQyMl9OQU1FCSJBY2NlbGVQb3J0IFhyIDQyMiIKLSNkZWZpbmUgUENJX0RFVklDRV9FUENKX05BTUUJIkFjY2VsZVBvcnQgRVBDIChQTFgpIgotI2RlZmluZSBQQ0lfREVWSUNFX1hSX0JVTExfTkFNRQkiQWNjZWxlUG9ydCBYciAoQlVMTCkiCi0jZGVmaW5lIFBDSV9ERVZJQ0VfWFJfSUJNX05BTUUJIkFjY2VsZVBvcnQgWHIgKElCTSkiCi0jZGVmaW5lIFBDSV9ERVZJQ0VfQ1hfSUJNX05BTUUJIkFjY2VsZVBvcnQgQ1ggKElCTSkiCi0jZGVmaW5lIFBDSV9ERVZJQ0VfOTIwXzhfSFBfTkFNRSAiQWNjZWxlUG9ydCBYcjkyMCA4IHBvcnQgKEhQKSIKLSNkZWZpbmUgUENJX0RFVklDRV9YRU1fSFBfTkFNRQkiQWNjZWxlUG9ydCBYRU0gKEhQKSIKLQotCi0vKgotICogT24gdGhlIFBDSSBib2FyZHMsIHRoZXJlIGlzIG5vIElPIHNwYWNlIGFsbG9jYXRlZAotICogVGhlIEkvTyByZWdpc3RlcnMgd2lsbCBiZSBpbiB0aGUgZmlyc3QgMyBieXRlcyBvZiB0aGUKLSAqIHVwcGVyIDJNQiBvZiB0aGUgNE1CIG1lbW9yeSBzcGFjZS4gIFRoZSBib2FyZCBtZW1vcnkKLSAqIHdpbGwgYmUgbWFwcGVkIGludG8gdGhlIGxvdyAyTUIgb2YgdGhlIDRNQiBtZW1vcnkgc3BhY2UKLSAqLwotCi0vKiBQb3RlbnRpYWwgbG9jYXRpb24gb2YgUENJIEJpb3MgZnJvbSBFMDAwMCB0byBGRkZGRiovCi0jZGVmaW5lIFBDSV9CSU9TX1NJWkUJCTB4MDAwMjAwMDAKLQotLyogU2l6ZSBvZiBNZW1vcnkgYW5kIEkvTyBmb3IgUENJICg0TUIpICovCi0jZGVmaW5lIFBDSV9SQU1fU0laRQkJMHgwMDQwMDAwMAotCi0vKiBTaXplIG9mIE1lbW9yeSAoMk1CKSAqLwotI2RlZmluZSBQQ0lfTUVNX1NJWkUJCTB4MDAyMDAwMDAKLQotLyogTWF4IFBDSSBXaW5kb3cgU2l6ZSAoMk1CKSAqLwotI2RlZmluZSBQQ0lfV0lOX1NJWkUJCTB4MDAyMDAwMDAKLQotI2RlZmluZSBQQ0lfV0lOX1NISUZUCQkyMSAvKiAyMSBiaXRzIG1heCAqLwotCi0vKiBPZmZzZXQgb2YgSS8wIGluIE1lbW9yeSAoMk1CKSAqLwotI2RlZmluZSBQQ0lfSU9fT0ZGU0VUCQkweDAwMjAwMDAwCi0KLS8qIFNpemUgb2YgSU8gKDJNQikgKi8KLSNkZWZpbmUgUENJX0lPX1NJWkUJCTB4MDAyMDAwMDAKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3N5c2ZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3N5c2ZzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNGVjOWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9zeXNmcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNCBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKLSAqICAgICAgU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICogCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKLSAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiAKLSAqICAgICAgTk9URSBUTyBMSU5VWCBLRVJORUwgSEFDS0VSUzogIERPIE5PVCBSRUZPUk1BVCBUSElTIENPREUhCi0gKgotICogICAgICBUaGlzIGlzIHNoYXJlZCBjb2RlIGJldHdlZW4gRGlnaSdzIENWUyBhcmNoaXZlIGFuZCB0aGUKLSAqICAgICAgTGludXggS2VybmVsIHNvdXJjZXMuCi0gKiAgICAgIENoYW5naW5nIHRoZSBzb3VyY2UganVzdCBmb3IgcmVmb3JtYXR0aW5nIG5lZWRsZXNzbHkgYnJlYWtzCi0gKiAgICAgIG91ciBDVlMgZGlmZiBoaXN0b3J5LgotICoKLSAqICAgICAgU2VuZCBhbnkgYnVnIGZpeGVzL2NoYW5nZXMgdG86ICBFbmcuTGludXggYXQgZGlnaSBkb3QgY29tLgotICogICAgICBUaGFuayB5b3UuCi0gKgotICoKLSAqIAotICogJElkOiBkZ2FwX3N5c2ZzLmMsdiAxLjEgMjAwOS8xMC8yMyAxNDowMTo1NyBtYXJraCBFeHAgJCAgIAotICovCi0KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgotICAKLSNpbmNsdWRlICJkZ2FwX2RyaXZlci5oIgotI2luY2x1ZGUgImRnYXBfY29uZi5oIgotI2luY2x1ZGUgImRnYXBfcGFyc2UuaCIKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX2RyaXZlcl92ZXJzaW9uX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQotewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBER19QQVJUKTsKLX0KLXN0YXRpYyBEUklWRVJfQVRUUih2ZXJzaW9uLCBTX0lSVVNSLCBkZ2FwX2RyaXZlcl92ZXJzaW9uX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfZHJpdmVyX2JvYXJkc19zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgZGdhcF9OdW1Cb2FyZHMpOwotfQotc3RhdGljIERSSVZFUl9BVFRSKGJvYXJkcywgU19JUlVTUiwgZGdhcF9kcml2ZXJfYm9hcmRzX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfZHJpdmVyX21heGJvYXJkc19zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgTUFYQk9BUkRTKTsKLX0KLXN0YXRpYyBEUklWRVJfQVRUUihtYXhib2FyZHMsIFNfSVJVU1IsIGRnYXBfZHJpdmVyX21heGJvYXJkc19zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX2RyaXZlcl9wb2xsY291bnRlcl9zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGRcbiIsIGRnYXBfcG9sbF9jb3VudGVyKTsKLX0KLXN0YXRpYyBEUklWRVJfQVRUUihwb2xsY291bnRlciwgU19JUlVTUiwgZGdhcF9kcml2ZXJfcG9sbGNvdW50ZXJfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGRnYXBfZHJpdmVyX3N0YXRlX3RleHRbZGdhcF9kcml2ZXJfc3RhdGVdKTsKLX0KLXN0YXRpYyBEUklWRVJfQVRUUihzdGF0ZSwgU19JUlVTUiwgZGdhcF9kcml2ZXJfc3RhdGVfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfZGVidWdfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHgleFxuIiwgZGdhcF9kZWJ1Zyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfZHJpdmVyX2RlYnVnX3N0b3JlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXNzY2FuZihidWYsICIweCV4XG4iLCAmZGdhcF9kZWJ1Zyk7Ci0JcmV0dXJuIGNvdW50OwotfQotc3RhdGljIERSSVZFUl9BVFRSKGRlYnVnLCAoU19JUlVTUiB8IFNfSVdVU1IpLCBkZ2FwX2RyaXZlcl9kZWJ1Z19zaG93LCBkZ2FwX2RyaXZlcl9kZWJ1Z19zdG9yZSk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfcmF3cmVhZG9rX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQotewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JXhcbiIsIGRnYXBfcmF3cmVhZG9rKTsKLX0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfcmF3cmVhZG9rX3N0b3JlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXNzY2FuZihidWYsICIweCV4XG4iLCAmZGdhcF9yYXdyZWFkb2spOwotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBEUklWRVJfQVRUUihyYXdyZWFkb2ssIChTX0lSVVNSIHwgU19JV1VTUiksIGRnYXBfZHJpdmVyX3Jhd3JlYWRva19zaG93LCBkZ2FwX2RyaXZlcl9yYXdyZWFkb2tfc3RvcmUpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfZHJpdmVyX3BvbGxyYXRlX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQotewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkbXNcbiIsIGRnYXBfcG9sbF90aWNrKTsKLX0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfcG9sbHJhdGVfc3RvcmUoc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3NjYW5mKGJ1ZiwgIiVkXG4iLCAmZGdhcF9wb2xsX3RpY2spOwotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBEUklWRVJfQVRUUihwb2xscmF0ZSwgKFNfSVJVU1IgfCBTX0lXVVNSKSwgZGdhcF9kcml2ZXJfcG9sbHJhdGVfc2hvdywgZGdhcF9kcml2ZXJfcG9sbHJhdGVfc3RvcmUpOwotCi0KLXZvaWQgZGdhcF9jcmVhdGVfZHJpdmVyX3N5c2ZpbGVzKHN0cnVjdCBwY2lfZHJpdmVyICpkZ2FwX2RyaXZlcikKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXJmcyA9ICZkZ2FwX2RyaXZlci0+ZHJpdmVyOwotCi0JcmMgfD0gZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7Ci0JcmMgfD0gZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfYm9hcmRzKTsKLQlyYyB8PSBkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9tYXhib2FyZHMpOwotCXJjIHw9IGRyaXZlcl9jcmVhdGVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX2RlYnVnKTsKLQlyYyB8PSBkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9yYXdyZWFkb2spOyAKLQlyYyB8PSBkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9wb2xscmF0ZSk7Ci0JcmMgfD0gZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfcG9sbGNvdW50ZXIpOwotCXJjIHw9IGRyaXZlcl9jcmVhdGVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3N0YXRlKTsKLQlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJER0FQOiBzeXNmcyBkcml2ZXJfY3JlYXRlX2ZpbGUgZmFpbGVkIVxuIik7Ci0JfQotfQotCi0KLXZvaWQgZGdhcF9yZW1vdmVfZHJpdmVyX3N5c2ZpbGVzKHN0cnVjdCBwY2lfZHJpdmVyICpkZ2FwX2RyaXZlcikKLXsKLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyZnMgPSAmZGdhcF9kcml2ZXItPmRyaXZlcjsKLQlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl92ZXJzaW9uKTsKLQlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9ib2FyZHMpOwotCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX21heGJvYXJkcyk7Ci0JZHJpdmVyX3JlbW92ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfZGVidWcpOwotCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3Jhd3JlYWRvayk7Ci0JZHJpdmVyX3JlbW92ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfcG9sbHJhdGUpOwotCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3BvbGxjb3VudGVyKTsKLQlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9zdGF0ZSk7Ci19Ci0KLQotI2RlZmluZSBER0FQX1ZFUklGWV9CT0FSRChwLCBiZCkJCQlcCi0JaWYgKCFwKQkJCQkJCVwKLQkJcmV0dXJuICgwKTsJCQkJXAotCQkJCQkJCVwKLQliZCA9IGRldl9nZXRfZHJ2ZGF0YShwKTsJCQlcCi0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykJXAotCQlyZXR1cm4gKDApOwkJCQlcCi0JaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkJCQlcCi0JCXJldHVybiAoMCk7CQkJCVwKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3BvcnRzX3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqcCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0JaW50IGNvdW50ID0gMDsKLQlpbnQgaSA9IDA7Ci0KLQlER0FQX1ZFUklGWV9CT0FSRChwLCBiZCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYmQtPm5hc3luYzsgaSsrKSB7Ci0JCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwKLQkJCSIlZCAlc1xuIiwgYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLAotCQkJYmQtPmNoYW5uZWxzW2ldLT5jaF9vcGVuX2NvdW50ID8gIk9wZW4iIDogIkNsb3NlZCIpOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfc3RhdGUsIFNfSVJVU1IsIGRnYXBfcG9ydHNfc3RhdGVfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9wb3J0c19iYXVkX3Nob3coc3RydWN0IGRldmljZSAqcCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0JaW50IGNvdW50ID0gMDsKLQlpbnQgaSA9IDA7Ci0KLQlER0FQX1ZFUklGWV9CT0FSRChwLCBiZCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYmQtPm5hc3luYzsgaSsrKSB7Ci0JCWNvdW50ICs9ICBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsCi0JCQkiJWQgJWRcbiIsIGJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSwgYmQtPmNoYW5uZWxzW2ldLT5jaF9iYXVkX2luZm8pOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfYmF1ZCwgU19JUlVTUiwgZGdhcF9wb3J0c19iYXVkX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfbXNpZ25hbHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlpbnQgY291bnQgPSAwOwotCWludCBpID0gMDsKLQotCURHQVBfVkVSSUZZX0JPQVJEKHAsIGJkKTsKLQotCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspIHsKLQkJaWYgKGJkLT5jaGFubmVsc1tpXS0+Y2hfb3Blbl9jb3VudCkgewotCQkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LAotCQkJCSIlZCAlcyAlcyAlcyAlcyAlcyAlc1xuIiwgYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLAotCQkJCShiZC0+Y2hhbm5lbHNbaV0tPmNoX21vc3RhdCAmIFVBUlRfTUNSX1JUUykgPyAiUlRTIiA6ICIiLAotCQkJCShiZC0+Y2hhbm5lbHNbaV0tPmNoX21pc3RhdCAmIFVBUlRfTVNSX0NUUykgPyAiQ1RTIiA6ICIiLAotCQkJCShiZC0+Y2hhbm5lbHNbaV0tPmNoX21vc3RhdCAmIFVBUlRfTUNSX0RUUikgPyAiRFRSIiA6ICIiLAotCQkJCShiZC0+Y2hhbm5lbHNbaV0tPmNoX21pc3RhdCAmIFVBUlRfTVNSX0RTUikgPyAiRFNSIiA6ICIiLAotCQkJCShiZC0+Y2hhbm5lbHNbaV0tPmNoX21pc3RhdCAmIFVBUlRfTVNSX0RDRCkgPyAiRENEIiA6ICIiLAotCQkJCShiZC0+Y2hhbm5lbHNbaV0tPmNoX21pc3RhdCAmIFVBUlRfTVNSX1JJKSAgPyAiUkkiICA6ICIiKTsKLQkJfSBlbHNlIHsKLQkJCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwKLQkJCQkiJWRcbiIsIGJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGNvdW50OwotfQotc3RhdGljIERFVklDRV9BVFRSKHBvcnRzX21zaWduYWxzLCBTX0lSVVNSLCBkZ2FwX3BvcnRzX21zaWduYWxzX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfaWZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlpbnQgY291bnQgPSAwOwotCWludCBpID0gMDsKLQotCURHQVBfVkVSSUZZX0JPQVJEKHAsIGJkKTsKLQotCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspIHsKLQkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LCAiJWQgJXhcbiIsCi0JCQliZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sIGJkLT5jaGFubmVsc1tpXS0+Y2hfY19pZmxhZyk7Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19pZmxhZywgU19JUlVTUiwgZGdhcF9wb3J0c19pZmxhZ19zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3BvcnRzX2NmbGFnX3Nob3coc3RydWN0IGRldmljZSAqcCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0JaW50IGNvdW50ID0gMDsKLQlpbnQgaSA9IDA7Ci0KLQlER0FQX1ZFUklGWV9CT0FSRChwLCBiZCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYmQtPm5hc3luYzsgaSsrKSB7Ci0JCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwgIiVkICV4XG4iLAotCQkJYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLCBiZC0+Y2hhbm5lbHNbaV0tPmNoX2NfY2ZsYWcpOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfY2ZsYWcsIFNfSVJVU1IsIGRnYXBfcG9ydHNfY2ZsYWdfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9wb3J0c19vZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKnAsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCWludCBjb3VudCA9IDA7Ci0JaW50IGkgPSAwOwotCi0JREdBUF9WRVJJRllfQk9BUkQocCwgYmQpOwotCi0JZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykgewotCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICIlZCAleFxuIiwKLQkJCWJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSwgYmQtPmNoYW5uZWxzW2ldLT5jaF9jX29mbGFnKTsKLQl9Ci0JcmV0dXJuIGNvdW50OwotfQotc3RhdGljIERFVklDRV9BVFRSKHBvcnRzX29mbGFnLCBTX0lSVVNSLCBkZ2FwX3BvcnRzX29mbGFnX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfbGZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlpbnQgY291bnQgPSAwOwotCWludCBpID0gMDsKLQotCURHQVBfVkVSSUZZX0JPQVJEKHAsIGJkKTsKLQotCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspIHsKLQkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LCAiJWQgJXhcbiIsCi0JCQliZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sIGJkLT5jaGFubmVsc1tpXS0+Y2hfY19sZmxhZyk7Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19sZmxhZywgU19JUlVTUiwgZGdhcF9wb3J0c19sZmxhZ19zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3BvcnRzX2RpZ2lfZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKnAsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCWludCBjb3VudCA9IDA7Ci0JaW50IGkgPSAwOwotCi0JREdBUF9WRVJJRllfQk9BUkQocCwgYmQpOwotCi0JZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykgewotCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICIlZCAleFxuIiwKLQkJCWJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSwgYmQtPmNoYW5uZWxzW2ldLT5jaF9kaWdpLmRpZ2lfZmxhZ3MpOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfZGlnaV9mbGFnLCBTX0lSVVNSLCBkZ2FwX3BvcnRzX2RpZ2lfZmxhZ19zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3BvcnRzX3J4Y291bnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlpbnQgY291bnQgPSAwOwotCWludCBpID0gMDsKLQotCURHQVBfVkVSSUZZX0JPQVJEKHAsIGJkKTsKLQotCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspIHsKLQkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LCAiJWQgJWxkXG4iLAotCQkJYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLCBiZC0+Y2hhbm5lbHNbaV0tPmNoX3J4Y291bnQpOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfcnhjb3VudCwgU19JUlVTUiwgZGdhcF9wb3J0c19yeGNvdW50X3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfdHhjb3VudF9zaG93KHN0cnVjdCBkZXZpY2UgKnAsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCWludCBjb3VudCA9IDA7Ci0JaW50IGkgPSAwOwotCi0JREdBUF9WRVJJRllfQk9BUkQocCwgYmQpOwotCi0JZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykgewotCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICIlZCAlbGRcbiIsCi0JCQliZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sIGJkLT5jaGFubmVsc1tpXS0+Y2hfdHhjb3VudCk7Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c190eGNvdW50LCBTX0lSVVNSLCBkZ2FwX3BvcnRzX3R4Y291bnRfc2hvdywgTlVMTCk7Ci0KLQotLyogdGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRoZSBzeXMgZmlsZXMgdGhhdCB3aWxsIGV4cG9ydCBlYWNoIHNpZ25hbCBzdGF0dXMKLSAqIHRvIHN5c2ZzIGVhY2ggdmFsdWUgd2lsbCBiZSBwdXQgaW4gYSBzZXBhcmF0ZSBmaWxlbmFtZQotICovCi12b2lkIGRnYXBfY3JlYXRlX3BvcnRzX3N5c2ZpbGVzKHN0cnVjdCBib2FyZF90ICpiZCkKLXsKLQlpbnQgcmMgPSAwOwotCi0JZGV2X3NldF9kcnZkYXRhKCZiZC0+cGRldi0+ZGV2LCBiZCk7Ci0JcmMgfD0gZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19zdGF0ZSk7Ci0JcmMgfD0gZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19iYXVkKTsKLQlyYyB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX21zaWduYWxzKTsKLQlyYyB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2lmbGFnKTsKLQlyYyB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2NmbGFnKTsKLQlyYyB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX29mbGFnKTsKLQlyYyB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2xmbGFnKTsKLQlyYyB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2RpZ2lfZmxhZyk7Ci0JcmMgfD0gZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19yeGNvdW50KTsKLQlyYyB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX3R4Y291bnQpOwotCWlmIChyYykgewotCQlwcmludGsoS0VSTl9FUlIgIkRHQVA6IHN5c2ZzIGRldmljZV9jcmVhdGVfZmlsZSBmYWlsZWQhXG4iKTsKLQl9Ci19Ci0KLQotLyogcmVtb3ZlcyBhbGwgdGhlIHN5cyBmaWxlcyBjcmVhdGVkIGZvciB0aGF0IHBvcnQgKi8KLXZvaWQgZGdhcF9yZW1vdmVfcG9ydHNfc3lzZmlsZXMoc3RydWN0IGJvYXJkX3QgKmJkKQotewotCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfc3RhdGUpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfYmF1ZCk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19tc2lnbmFscyk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19pZmxhZyk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19jZmxhZyk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19vZmxhZyk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19sZmxhZyk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19kaWdpX2ZsYWcpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfcnhjb3VudCk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c190eGNvdW50KTsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQotCWlmICghZCkKLQkJcmV0dXJuICgwKTsKLQl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKLQkJcmV0dXJuICgwKTsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzIiwgdW4tPnVuX29wZW5fY291bnQgPyAiT3BlbiIgOiAiQ2xvc2VkIik7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIoc3RhdGUsIFNfSVJVU1IsIGRnYXBfdHR5X3N0YXRlX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X2JhdWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0KLQlpZiAoIWQpCi0JCXJldHVybiAoMCk7Ci0JdW4gPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWlmIChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpCi0JCXJldHVybiAoMCk7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgY2gtPmNoX2JhdWRfaW5mbyk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIoYmF1ZCwgU19JUlVTUiwgZGdhcF90dHlfYmF1ZF9zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9tc2lnbmFsc19zaG93KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQotCWlmICghZCkKLQkJcmV0dXJuICgwKTsKLQl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKLQkJcmV0dXJuICgwKTsKLQotCWlmIChjaC0+Y2hfb3Blbl9jb3VudCkgewotCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyAlcyAlcyAlcyAlcyAlc1xuIiwKLQkJCShjaC0+Y2hfbW9zdGF0ICYgVUFSVF9NQ1JfUlRTKSA/ICJSVFMiIDogIiIsCi0JCQkoY2gtPmNoX21pc3RhdCAmIFVBUlRfTVNSX0NUUykgPyAiQ1RTIiA6ICIiLAotCQkJKGNoLT5jaF9tb3N0YXQgJiBVQVJUX01DUl9EVFIpID8gIkRUUiIgOiAiIiwKLQkJCShjaC0+Y2hfbWlzdGF0ICYgVUFSVF9NU1JfRFNSKSA/ICJEU1IiIDogIiIsCi0JCQkoY2gtPmNoX21pc3RhdCAmIFVBUlRfTVNSX0RDRCkgPyAiRENEIiA6ICIiLAotCQkJKGNoLT5jaF9taXN0YXQgJiBVQVJUX01TUl9SSSkgID8gIlJJIiAgOiAiIik7Ci0JfQotCXJldHVybiAwOwotfQotc3RhdGljIERFVklDRV9BVFRSKG1zaWduYWxzLCBTX0lSVVNSLCBkZ2FwX3R0eV9tc2lnbmFsc19zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9pZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQotCWlmICghZCkKLQkJcmV0dXJuICgwKTsKLQl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKLQkJcmV0dXJuICgwKTsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV4XG4iLCBjaC0+Y2hfY19pZmxhZyk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIoaWZsYWcsIFNfSVJVU1IsIGRnYXBfdHR5X2lmbGFnX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X2NmbGFnX3Nob3coc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCi0JaWYgKCFkKQotCQlyZXR1cm4gKDApOwotCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQotCQlyZXR1cm4gKDApOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXhcbiIsIGNoLT5jaF9jX2NmbGFnKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihjZmxhZywgU19JUlVTUiwgZGdhcF90dHlfY2ZsYWdfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF90dHlfb2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0KLQlpZiAoIWQpCi0JCXJldHVybiAoMCk7Ci0JdW4gPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWlmIChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpCi0JCXJldHVybiAoMCk7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIleFxuIiwgY2gtPmNoX2Nfb2ZsYWcpOwotfQotc3RhdGljIERFVklDRV9BVFRSKG9mbGFnLCBTX0lSVVNSLCBkZ2FwX3R0eV9vZmxhZ19zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9sZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQotCWlmICghZCkKLQkJcmV0dXJuICgwKTsKLQl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKLQkJcmV0dXJuICgwKTsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV4XG4iLCBjaC0+Y2hfY19sZmxhZyk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIobGZsYWcsIFNfSVJVU1IsIGRnYXBfdHR5X2xmbGFnX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X2RpZ2lfZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQotCWlmICghZCkKLQkJcmV0dXJuICgwKTsKLQl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKLQkJcmV0dXJuICgwKTsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV4XG4iLCBjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihkaWdpX2ZsYWcsIFNfSVJVU1IsIGRnYXBfdHR5X2RpZ2lfZmxhZ19zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9yeGNvdW50X3Nob3coc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCi0JaWYgKCFkKQotCQlyZXR1cm4gKDApOwotCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQotCQlyZXR1cm4gKDApOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxkXG4iLCBjaC0+Y2hfcnhjb3VudCk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIocnhjb3VudCwgU19JUlVTUiwgZGdhcF90dHlfcnhjb3VudF9zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV90eGNvdW50X3Nob3coc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCi0JaWYgKCFkKQotCQlyZXR1cm4gKDApOwotCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQotCQlyZXR1cm4gKDApOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxkXG4iLCBjaC0+Y2hfdHhjb3VudCk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIodHhjb3VudCwgU19JUlVTUiwgZGdhcF90dHlfdHhjb3VudF9zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9uYW1lX3Nob3coc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCWludAljbjsKLQlpbnQJYm47Ci0Jc3RydWN0IGNub2RlICpjcHRyID0gTlVMTDsKLQlpbnQgZm91bmQgPSBGQUxTRTsKLQlpbnQgbmNvdW50ID0gMDsKLQlpbnQgc3RhcnRvID0gMDsKLQlpbnQgaSA9IDA7Ci0KLQlpZiAoIWQpCi0JCXJldHVybiAoMCk7Ci0JdW4gPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWlmIChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpCi0JCXJldHVybiAoMCk7Ci0KLSAgICAgICAgYm4gPSBiZC0+Ym9hcmRudW07Ci0JY24gPSBjaC0+Y2hfcG9ydG51bTsKLQotCWZvciAoY3B0ciA9IGJkLT5iZF9jb25maWc7IGNwdHI7IGNwdHIgPSBjcHRyLT5uZXh0KSB7Ci0KLQkJaWYgKChjcHRyLT50eXBlID09IEJOT0RFKSAmJgotCQkgICAgKChjcHRyLT51LmJvYXJkLnR5cGUgPT0gQVBPUlQyXzkyMFApIHx8IChjcHRyLT51LmJvYXJkLnR5cGUgPT0gQVBPUlQ0XzkyMFApIHx8Ci0JCSAgICAgKGNwdHItPnUuYm9hcmQudHlwZSA9PSBBUE9SVDhfOTIwUCkgfHwgKGNwdHItPnUuYm9hcmQudHlwZSA9PSBQQVBPUlQ0KSB8fAotCQkgICAgIChjcHRyLT51LmJvYXJkLnR5cGUgPT0gUEFQT1JUOCkpKSB7Ci0KLQkJCQlmb3VuZCA9IFRSVUU7Ci0JCQkJaWYgKGNwdHItPnUuYm9hcmQudl9zdGFydCkKLQkJCQkJc3RhcnRvID0gY3B0ci0+dS5ib2FyZC5zdGFydDsKLQkJCQllbHNlCi0JCQkJCXN0YXJ0byA9IDE7Ci0JCX0KLQotCQlpZiAoY3B0ci0+dHlwZSA9PSBUTk9ERSAmJiBmb3VuZCA9PSBUUlVFKSB7Ci0JCQljaGFyICpwdHIxOwotCQkJaWYgKHN0cnN0cihjcHRyLT51LnR0eW5hbWUsICJ0dHkiKSkgewotCQkJCXB0cjEgPSBjcHRyLT51LnR0eW5hbWU7Ci0JCQkJcHRyMSArPSAzOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcHRyMSA9IGNwdHItPnUudHR5bmFtZTsKLQkJCX0KLQotCQkJZm9yIChpID0gMDsgaSA8IGRnYXBfY29uZmlnX2dldF9udW1iZXJfb2ZfcG9ydHMoYmQpOyBpKyspIHsKLQkJCQlpZiAoY24gPT0gaSkgewotCQkJCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyVzJTAyZFxuIiwKLQkJCQkJCSh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSA/ICJwciIgOiAidHR5IiwKLQkJCQkJCXB0cjEsIGkgKyBzdGFydG8pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChjcHRyLT50eXBlID09IENOT0RFKSB7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBjcHRyLT51LmNvbmMubnBvcnQ7IGkrKykgewotCQkJCWlmIChjbiA9PSAoaSArIG5jb3VudCkpIHsKLQotCQkJCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyVzJTAyZFxuIiwKLQkJCQkJCSh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSA/ICJwciIgOiAidHR5IiwKLQkJCQkJCWNwdHItPnUuY29uYy5pZCwKLQkJCQkJCWkgKyAoY3B0ci0+dS5jb25jLnZfc3RhcnQgPyBjcHRyLT51LmNvbmMuc3RhcnQgOiAxKSk7Ci0JCQkJfQotCQkJfQotCi0JCQluY291bnQgKz0gY3B0ci0+dS5jb25jLm5wb3J0OwotCQl9Ci0KLQkJaWYgKGNwdHItPnR5cGUgPT0gTU5PREUpIHsKLQotCQkJZm9yIChpID0gMDsgaSA8IGNwdHItPnUubW9kdWxlLm5wb3J0OyBpKyspIHsKLQkJCQlpZiAoY24gPT0gKGkgKyBuY291bnQpKSB7Ci0JCQkJCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzJXMlMDJkXG4iLAotCQkJCQkJKHVuLT51bl90eXBlID09IERHQVBfUFJJTlQpID8gInByIiA6ICJ0dHkiLAotCQkJCQkJY3B0ci0+dS5tb2R1bGUuaWQsCi0JCQkJCQlpICsgKGNwdHItPnUubW9kdWxlLnZfc3RhcnQgPyBjcHRyLT51Lm1vZHVsZS5zdGFydCA6IDEpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCW5jb3VudCArPSBjcHRyLT51Lm1vZHVsZS5ucG9ydDsKLQotCQl9Ci0JfQotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNfZGdhcF8lZF8lZFxuIiwKLQkJKHVuLT51bl90eXBlID09IERHQVBfUFJJTlQpID8gInByIiA6ICJ0dHkiLCBibiwgY24pOwotCi19Ci1zdGF0aWMgREVWSUNFX0FUVFIoY3VzdG9tX25hbWUsIFNfSVJVU1IsIGRnYXBfdHR5X25hbWVfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmRnYXBfc3lzZnNfdHR5X2VudHJpZXNbXSA9IHsKLQkmZGV2X2F0dHJfc3RhdGUuYXR0ciwKLQkmZGV2X2F0dHJfYmF1ZC5hdHRyLAotCSZkZXZfYXR0cl9tc2lnbmFscy5hdHRyLAotCSZkZXZfYXR0cl9pZmxhZy5hdHRyLAotCSZkZXZfYXR0cl9jZmxhZy5hdHRyLAotCSZkZXZfYXR0cl9vZmxhZy5hdHRyLAotCSZkZXZfYXR0cl9sZmxhZy5hdHRyLAotCSZkZXZfYXR0cl9kaWdpX2ZsYWcuYXR0ciwKLQkmZGV2X2F0dHJfcnhjb3VudC5hdHRyLAotCSZkZXZfYXR0cl90eGNvdW50LmF0dHIsCi0JJmRldl9hdHRyX2N1c3RvbV9uYW1lLmF0dHIsCi0JTlVMTAotfTsKLQotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBkZ2FwX3R0eV9hdHRyaWJ1dGVfZ3JvdXAgPSB7Ci0JLm5hbWUgPSBOVUxMLAotCS5hdHRycyA9IGRnYXBfc3lzZnNfdHR5X2VudHJpZXMsCi19OwotCi0KLQotCi12b2lkIGRnYXBfY3JlYXRlX3R0eV9zeXNmcyhzdHJ1Y3QgdW5fdCAqdW4sIHN0cnVjdCBkZXZpY2UgKmMpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmYy0+a29iaiwgJmRnYXBfdHR5X2F0dHJpYnV0ZV9ncm91cCk7Ci0JaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgImRnYXA6IGZhaWxlZCB0byBjcmVhdGUgc3lzZnMgdHR5IGRldmljZSBhdHRyaWJ1dGVzLlxuIik7Ci0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmYy0+a29iaiwgJmRnYXBfdHR5X2F0dHJpYnV0ZV9ncm91cCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlkZXZfc2V0X2RydmRhdGEoYywgdW4pOwotCi19Ci0KLQotdm9pZCBkZ2FwX3JlbW92ZV90dHlfc3lzZnMoc3RydWN0IGRldmljZSAqYykKLXsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmMtPmtvYmosICZkZ2FwX3R0eV9hdHRyaWJ1dGVfZ3JvdXApOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9zeXNmcy5oIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9zeXNmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGU2OTBlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfc3lzZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKLSAqCVNjb3R0IEggS2lsYXUgPFNjb3R0X0tpbGF1IGF0IGRpZ2kgZG90IGNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKLSAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCU5PVEU6IFRISVMgSVMgQSBTSEFSRUQgSEVBREVSLiBETyBOT1QgQ0hBTkdFIENPRElORyBTVFlMRSEhIQotICovCi0KLSNpZm5kZWYgX19ER0FQX1NZU0ZTX0gKLSNkZWZpbmUgX19ER0FQX1NZU0ZTX0gKLQotI2luY2x1ZGUgImRnYXBfZHJpdmVyLmgiCi0KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLQotc3RydWN0IGJvYXJkX3Q7Ci1zdHJ1Y3QgY2hhbm5lbF90Owotc3RydWN0IHVuX3Q7Ci1zdHJ1Y3QgcGNpX2RyaXZlcjsKLXN0cnVjdCBjbGFzc19kZXZpY2U7Ci0KLWV4dGVybiB2b2lkIGRnYXBfY3JlYXRlX3BvcnRzX3N5c2ZpbGVzKHN0cnVjdCBib2FyZF90ICpiZCk7IAotZXh0ZXJuIHZvaWQgZGdhcF9yZW1vdmVfcG9ydHNfc3lzZmlsZXMoc3RydWN0IGJvYXJkX3QgKmJkKTsKLQotZXh0ZXJuIHZvaWQgZGdhcF9jcmVhdGVfZHJpdmVyX3N5c2ZpbGVzKHN0cnVjdCBwY2lfZHJpdmVyICopOwotZXh0ZXJuIHZvaWQgZGdhcF9yZW1vdmVfZHJpdmVyX3N5c2ZpbGVzKHN0cnVjdCBwY2lfZHJpdmVyICopOwotCi1leHRlcm4gaW50IGRnYXBfdHR5X2NsYXNzX2luaXQodm9pZCk7Ci1leHRlcm4gaW50IGRnYXBfdHR5X2NsYXNzX2Rlc3Ryb3kodm9pZCk7Ci0KLWV4dGVybiB2b2lkIGRnYXBfY3JlYXRlX3R0eV9zeXNmcyhzdHJ1Y3QgdW5fdCAqdW4sIHN0cnVjdCBkZXZpY2UgKmMpOwotZXh0ZXJuIHZvaWQgZGdhcF9yZW1vdmVfdHR5X3N5c2ZzKHN0cnVjdCBkZXZpY2UgKmMpOwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF90cmFjZS5jIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF90cmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTNkYjllLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfdHJhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKgotICoJTk9URSBUTyBMSU5VWCBLRVJORUwgSEFDS0VSUzogIERPIE5PVCBSRUZPUk1BVCBUSElTIENPREUhCi0gKgotICoJVGhpcyBpcyBzaGFyZWQgY29kZSBiZXR3ZWVuIERpZ2kncyBDVlMgYXJjaGl2ZSBhbmQgdGhlCi0gKglMaW51eCBLZXJuZWwgc291cmNlcy4KLSAqCUNoYW5naW5nIHRoZSBzb3VyY2UganVzdCBmb3IgcmVmb3JtYXR0aW5nIG5lZWRsZXNzbHkgYnJlYWtzCi0gKglvdXIgQ1ZTIGRpZmYgaGlzdG9yeS4KLSAqCi0gKglTZW5kIGFueSBidWcgZml4ZXMvY2hhbmdlcyB0bzogIEVuZy5MaW51eCBhdCBkaWdpIGRvdCBjb20uCi0gKglUaGFuayB5b3UuCi0gKgotICovCi0KLS8qICRJZDogZGdhcF90cmFjZS5jLHYgMS4xIDIwMDkvMTAvMjMgMTQ6MDE6NTcgbWFya2ggRXhwICQgKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIEZvciBqaWZmaWVzLCB0YXNrIHN0YXRlcyAqLwotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgkvKiBGb3IgdGFza2xldCBhbmQgaW50ZXJydXB0IHN0cnVjdHMvZGVmaW5lcyAqLwotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLQotI2luY2x1ZGUgImRnYXBfZHJpdmVyLmgiCi0jaW5jbHVkZSAiZGdhcF90cmFjZS5oIgotCi0jZGVmaW5lIFRSQ19UT19DT05TT0xFIDEKLQotLyogZmlsZSBsZXZlbCBnbG9iYWxzICovCi1zdGF0aWMgY2hhciAqZGdhcF90cmNidWY7CQkvKiB0aGUgcmluZ2J1ZmZlciAqLwotCi0jaWYgZGVmaW5lZChUUkNfVE9fS01FTSkKLXN0YXRpYyBpbnQgZGdhcF90cmNidWZpID0gMDsJCS8qIGluZGV4IG9mIHRoZSB0aWxkZSBhdCB0aGUgZW5kIG9mICovCi0jZW5kaWYKLQotZXh0ZXJuIGludCBkZ2FwX3RyY2J1Zl9zaXplOwkJLyogc2l6ZSBvZiB0aGUgcmluZ2J1ZmZlciAqLwotCi0jaWYgZGVmaW5lZChUUkNfVE9fS01FTSkKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZGdhcF90cmFjZWZfbG9jayk7Ci0jZW5kaWYKLQotI2lmIDAKLQotI2lmICFkZWZpbmVkKFRSQ19UT19LTUVNKSAmJiAhZGVmaW5lZChUUkNfVE9fQ09OU09MRSkKLXZvaWQgZGdhcF90cmFjZWYoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JcmV0dXJuOwotfQotCi0jZWxzZSAvKiAhZGVmaW5lZChUUkNfVE9fS01FTSkgJiYgIWRlZmluZWQoVFJDX1RPX0NPTlNPTEUpICovCi0KLXZvaWQgZGdhcF90cmFjZWYoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdAkgICAgICAgICBhcDsKLQljaGFyICAJICAgICAgICAgYnVmW1RSQ19NQVhNU0crMV07Ci0Jc2l6ZV90CQkgbGVuYnVmOwotCWludAkJIGk7Ci0Jc3RhdGljIGludAkgZmFpbGVkID0gRkFMU0U7Ci0jIGlmIGRlZmluZWQoVFJDX1RPX0tNRU0pCi0JdW5zaWduZWQgbG9uZwkgZmxhZ3M7Ci0jZW5kaWYKLQotCWlmKGZhaWxlZCkKLQkJcmV0dXJuOwotIyBpZiBkZWZpbmVkKFRSQ19UT19LTUVNKQotCURHQVBfTE9DSyhkZ2FwX3RyYWNlZl9sb2NrLCBmbGFncyk7Ci0jZW5kaWYKLQotCS8qIEZvcm1hdCBidWYgdXNpbmcgZm10IGFuZCBhcmd1bWVudHMgY29udGFpbmVkIGluIGFwLiAqLwotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCWkgPSB2c3ByaW50ZihidWYsIGZtdCwgIGFwKTsKLQl2YV9lbmQoYXApOwotCWxlbmJ1ZiA9IHN0cmxlbihidWYpOwotCi0jIGlmIGRlZmluZWQoVFJDX1RPX0tNRU0pCi0JewotCQlzdGF0aWMgaW50CSBpbml0ZD0wOwotCi0JCS8qCi0JCSAqIE5vdywgaW4gYWRkaXRpb24gdG8gKG9yIGluc3RlYWQgb2YpIHByaW50aW5nIHRoaXMgc3R1ZmYgb3V0Ci0JCSAqICh3aGljaCBpcyBhIGJ1ZmZlcmVkIG9wZXJhdGlvbiksIGFsc28gdHVjayBpdCBhd2F5IGludG8gYQotCQkgKiBjb3JuZXIgb2YgbWVtb3J5IHdoaWNoIGNhbiBiZSBleGFtaW5lZCBwb3N0LWNyYXNoIGluIGtkYi4KLQkJICovCi0JCWlmICghaW5pdGQpIHsKLQkJCWRnYXBfdHJjYnVmID0gKGNoYXIgKikgdm1hbGxvYyhkZ2FwX3RyY2J1Zl9zaXplKTsKLQkJCWlmKCFkZ2FwX3RyY2J1ZikgewotCQkJCWZhaWxlZCA9IFRSVUU7Ci0JCQkJcHJpbnRrKCJkZ2FwOiB0cmFjaW5nIGluaXQgZmFpbGVkIVxuIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQltZW1zZXQoZGdhcF90cmNidWYsICdcMCcsICBkZ2FwX3RyY2J1Zl9zaXplKTsKLQkJCWRnYXBfdHJjYnVmaSA9IDA7Ci0JCQlpbml0ZCsrOwotCi0JCQlwcmludGsoImRnYXA6IHRyYWNpbmcgZW5hYmxlZCAtICIgVFJDX0RUUkMKLQkJCQkiIDB4JWx4IDB4JXhcbiIsCi0JCQkJKHVuc2lnbmVkIGxvbmcpZGdhcF90cmNidWYsCi0JCQkJZGdhcF90cmNidWZfc2l6ZSk7Ci0JCX0KLQotIyAgaWYgZGVmaW5lZChUUkNfT05fT1ZFUkZMT1dfV1JBUF9BUk9VTkQpCi0JCS8qCi0JCSAqIFRoaXMgaXMgdGhlIGxlc3MgQ1BVLWludGVuc2l2ZSB3YXkgdG8gZG8gdGhpbmdzLiAgV2Ugc2ltcGx5Ci0JCSAqIHdyYXAgYXJvdW5kIGJlZm9yZSB3ZSBmYWxsIG9mZiB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICBBCi0JCSAqIHRpbGRlICh+KSBkZW1hcmNhdGVzIHRoZSBjdXJyZW50IGVuZCBvZiB0aGUgdHJhY2UuCi0JCSAqCi0JCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGlmIHlvdSBhcmUgY29uY2VybmVkIGFib3V0IHJhY2UKLQkJICogY29uZGl0aW9ucyBhcyBpdCBpcyBsZXNzIGxpa2VseSB0byBhZmZlY3QgdGhlIHRpbWluZyBvZgotCQkgKiB0aGluZ3MuCi0JCSAqLwotCi0JCWlmIChkZ2FwX3RyY2J1ZmkgKyBsZW5idWYgPj0gZGdhcF90cmNidWZfc2l6ZSkgewotCQkJLyogV2UgYXJlIHdyYXBwaW5nLCBzbyB3aXBlIG91dCB0aGUgbGFzdCB0aWxkZS4gKi8KLQkJCWRnYXBfdHJjYnVmW2RnYXBfdHJjYnVmaV0gPSAnXDAnOwotCQkJLyogcHV0IHRoZSBuZXcgc3RyaW5nIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciAqLwotCQkJZGdhcF90cmNidWZpID0gMDsKLQkJfQotCi0JCXN0cmNweSgmZGdhcF90cmNidWZbZGdhcF90cmNidWZpXSwgYnVmKTsKLQkJZGdhcF90cmNidWZpICs9IGxlbmJ1ZjsKLQkJZGdhcF90cmNidWZbZGdhcF90cmNidWZpXSA9ICd+JzsKLQotIyAgZWxpZiBkZWZpbmVkKFRSQ19PTl9PVkVSRkxPV19TSElGVF9CVUZGRVIpCi0JCS8qCi0JCSAqIFRoaXMgaXMgdGhlIG1vcmUgQ1BVLWludGVuc2l2ZSB3YXkgdG8gZG8gdGhpbmdzLiAgSWYgd2UKLQkJICogdmVudHVyZSBpbnRvIHRoZSBsYXN0IDEvOCBvZiB0aGUgYnVmZmVyLCB3ZSBzaGlmdCB0aGUKLQkJICogbGFzdCA3Lzggb2YgdGhlIGJ1ZmZlciBmb3J3YXJkLCB3aXBpbmcgb3V0IHRoZSBmaXJzdCAxLzguCi0JCSAqIEFkdmFudGFnZTogTm8gd3JhcC1hcm91bmQsIG9ubHkgdHJ1bmNhdGlvbiBmcm9tIHRoZQotCQkgKiBiZWdpbm5pbmcuCi0JCSAqCi0JCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZCBpZiB5b3UgYXJlIGNvbmNlcm5lZCBhYm91dAotCQkgKiB0aW1pbmcgY2hhbmdlcyBhZmZlY3RpbmcgdGhlIGJlaGF2aW91ciBvZiB0aGUgZHJpdmVyIChpZSwKLQkJICogcmFjZSBjb25kaXRpb25zKS4KLQkJICovCi0JCXN0cmNweSgmZGdhcF90cmNidWZbZGdhcF90cmNidWZpXSwgYnVmKTsKLQkJZGdhcF90cmNidWZpICs9IGxlbmJ1ZjsKLQkJZGdhcF90cmNidWZbZGdhcF90cmNidWZpXSA9ICd+JzsKLQkJZGdhcF90cmNidWZbZGdhcF90cmNidWZpKzFdID0gJ1wwJzsKLQotCQkvKiBJZiB3ZSdyZSBuZWFyIHRoZSBlbmQgb2YgdGhlIHRyYWNlIGJ1ZmZlci4uLiAqLwotCQlpZiAoZGdhcF90cmNidWZpID4gKGRnYXBfdHJjYnVmX3NpemUvOCkqNykgewotCQkJLyogV2lwZSBvdXQgdGhlIGZpcnN0IGVpZ2h0aCB0byBtYWtlIHNvbWUgbW9yZSByb29tLiAqLwotCQkJc3RyY3B5KGRnYXBfdHJjYnVmLCAmZGdhcF90cmNidWZbZGdhcF90cmNidWZfc2l6ZS84XSk7Ci0JCQlkZ2FwX3RyY2J1ZmkgPSBzdHJsZW4oZGdhcF90cmNidWYpLTE7Ci0JCQkvKiBQbG9wIG92ZXJmbG93IG1lc3NhZ2UgYXQgdGhlIHRvcCBvZiB0aGUgYnVmZmVyLiAqLwotCQkJYmNvcHkoVFJDX09WRVJGTE9XLCBkZ2FwX3RyY2J1Ziwgc3RybGVuKFRSQ19PVkVSRkxPVykpOwotCQl9Ci0jICBlbHNlCi0jICAgZXJyb3IgIlRSQ19PTl9PVkVSRkxPV19XUkFQX0FST1VORCBvciBUUkNfT05fT1ZFUkZMT1dfU0hJRlRfQlVGRkVSPyIKLSMgIGVuZGlmCi0JfQotCURHQVBfVU5MT0NLKGRnYXBfdHJhY2VmX2xvY2ssIGZsYWdzKTsKLQotIyBlbmRpZiAvKiBkZWZpbmVkKFRSQ19UT19LTUVNKSAqLwotfQotCi0jZW5kaWYgLyogIWRlZmluZWQoVFJDX1RPX0tNRU0pICYmICFkZWZpbmVkKFRSQ19UT19DT05TT0xFKSAqLwotCi0jZW5kaWYKLQotLyoKLSAqIGRnYXBfdHJhY2VyX2ZyZWUoKQotICoKLSAqCi0gKi8KLXZvaWQgZGdhcF90cmFjZXJfZnJlZSh2b2lkKQotewotCWlmKGRnYXBfdHJjYnVmKQotCQl2ZnJlZShkZ2FwX3RyY2J1Zik7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3RyYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3RyYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMWY0NjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF90cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBIZWFkZXIgZmlsZSBmb3IgZGdhcF90cmFjZS5jCi0gKgotICogJElkOiBkZ2FwX3RyYWNlLmgsdiAxLjEgMjAwOS8xMC8yMyAxNDowMTo1NyBtYXJraCBFeHAgJAotICovCi0KLSNpZm5kZWYgX19ER0FQX1RSQUNFX0gKLSNkZWZpbmUgX19ER0FQX1RSQUNFX0gKLQotI2luY2x1ZGUgImRnYXBfZHJpdmVyLmgiCi0KLXZvaWQgZGdhcF90cmFjZWYoY29uc3QgY2hhciAqZm10LCAuLi4pOwotdm9pZCBkZ2FwX3RyYWNlcl9mcmVlKHZvaWQpOwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF90dHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfdHR5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZmI0ZGYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF90dHkuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoKLSAqCU5PVEUgVE8gTElOVVggS0VSTkVMIEhBQ0tFUlM6ICBETyBOT1QgUkVGT1JNQVQgVEhJUyBDT0RFIQotICoKLSAqCVRoaXMgaXMgc2hhcmVkIGNvZGUgYmV0d2VlbiBEaWdpJ3MgQ1ZTIGFyY2hpdmUgYW5kIHRoZQotICoJTGludXggS2VybmVsIHNvdXJjZXMuCi0gKglDaGFuZ2luZyB0aGUgc291cmNlIGp1c3QgZm9yIHJlZm9ybWF0dGluZyBuZWVkbGVzc2x5IGJyZWFrcwotICoJb3VyIENWUyBkaWZmIGhpc3RvcnkuCi0gKgotICoJU2VuZCBhbnkgYnVnIGZpeGVzL2NoYW5nZXMgdG86ICBFbmcuTGludXggYXQgZGlnaSBkb3QgY29tLgotICoJVGhhbmsgeW91LgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgdHR5IGRyaXZlciBmdW5jdGlvbmFsaXR5IGZvciB0aGUKLSAqIEZFUDUgYmFzZWQgcHJvZHVjdCBsaW5lcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogJElkOiBkZ2FwX3R0eS5jLHYgMS4zIDIwMTEvMDYvMjMgMTI6MTE6MzEgbWFya2ggRXhwICQKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIEZvciBqaWZmaWVzLCB0YXNrIHN0YXRlcyAqLwotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgkvKiBGb3IgdGFza2xldCBhbmQgaW50ZXJydXB0IHN0cnVjdHMvZGVmaW5lcyAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIEZvciB1ZGVsYXkgKi8KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgkvKiBGb3IgY29weV9mcm9tX3VzZXIvY29weV90b191c2VyICovCi0jaW5jbHVkZSA8YXNtL2lvLmg+CQkvKiBGb3IgcmVhZFtid2xdL3dyaXRlW2J3bF0gKi8KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLQotI2luY2x1ZGUgImRnYXBfZHJpdmVyLmgiCi0jaW5jbHVkZSAiZGdhcF90dHkuaCIKLSNpbmNsdWRlICJkZ2FwX3R5cGVzLmgiCi0jaW5jbHVkZSAiZGdhcF9mZXA1LmgiCi0jaW5jbHVkZSAiZGdhcF9wYXJzZS5oIgotI2luY2x1ZGUgImRnYXBfY29uZi5oIgotI2luY2x1ZGUgImRnYXBfc3lzZnMuaCIKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzcpCi0jZGVmaW5lIGluaXRfTVVURVgoc2VtKSAgICAgICAgIHNlbWFfaW5pdChzZW0sIDEpCi0jZGVmaW5lIERFQ0xBUkVfTVVURVgobmFtZSkgICAgIFwKLSAgICAgICAgc3RydWN0IHNlbWFwaG9yZSBuYW1lID0gX19TRU1BUEhPUkVfSU5JVElBTElaRVIobmFtZSwgMSkKLSNlbmRpZgotCi0vKgotICogaW50ZXJuYWwgdmFyaWFibGVzCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgYm9hcmRfdAkqZGdhcF9Cb2FyZHNCeU1ham9yWzI1Nl07Ci1zdGF0aWMgdWNoYXIJCSpkZ2FwX1RtcFdyaXRlQnVmID0gTlVMTDsKLXN0YXRpYyBERUNMQVJFX01VVEVYKGRnYXBfVG1wV3JpdGVTZW0pOwotCi0vKgotICogRGVmYXVsdCB0cmFuc3BhcmVudCBwcmludCBpbmZvcm1hdGlvbi4KLSAqLwotc3RhdGljIHN0cnVjdCBkaWdpX3QgZGdhcF9kaWdpX2luaXQgPSB7Ci0JLmRpZ2lfZmxhZ3MgPQlESUdJX0NPT0ssCS8qIEZsYWdzCQkJKi8KLQkuZGlnaV9tYXhjcHMgPQkxMDAsCQkvKiBNYXggQ1BTCQkJKi8KLQkuZGlnaV9tYXhjaGFyID0JNTAsCQkvKiBNYXggY2hhcnMgaW4gcHJpbnQgcXVldWUJKi8KLQkuZGlnaV9idWZzaXplID0JMTAwLAkJLyogUHJpbnRlciBidWZmZXIgc2l6ZQkJKi8KLQkuZGlnaV9vbmxlbiA9CTQsCQkvKiBzaXplIG9mIHByaW50ZXIgb24gc3RyaW5nCSovCi0JLmRpZ2lfb2ZmbGVuID0JNCwJCS8qIHNpemUgb2YgcHJpbnRlciBvZmYgc3RyaW5nCSovCi0JLmRpZ2lfb25zdHIgPQkiXDAzM1s1aSIsCS8qIEFOU0kgcHJpbnRlciBvbiBzdHJpbmcgXQkqLwotCS5kaWdpX29mZnN0ciA9CSJcMDMzWzRpIiwJLyogQU5TSSBwcmludGVyIG9mZiBzdHJpbmcgXQkqLwotCS5kaWdpX3Rlcm0gPQkiYW5zaSIJCS8qIGRlZmF1bHQgdGVybWluYWwgdHlwZQkqLwotfTsKLQotCi0vKgotICogRGVmaW5lIGEgbG9jYWwgZGVmYXVsdCB0ZXJtaW9zIHN0cnVjdC4gQWxsIHBvcnRzIHdpbGwgYmUgY3JlYXRlZAotICogd2l0aCB0aGlzIHRlcm1pb3MgaW5pdGlhbGx5LgotICoKLSAqIFRoaXMgZGVmaW5lcyBhIHJhdyBwb3J0IGF0IDk2MDAgYmF1ZCwgOCBkYXRhIGJpdHMsIG5vIHBhcml0eSwKLSAqIDEgc3RvcCBiaXQuCi0gKi8KLQotc3RhdGljIHN0cnVjdCBrdGVybWlvcyBEZ2FwRGVmYXVsdFRlcm1pb3MgPQotewotCS5jX2lmbGFnID0JKERFRkFVTFRfSUZMQUdTKSwJLyogaWZsYWdzICovCi0JLmNfb2ZsYWcgPQkoREVGQVVMVF9PRkxBR1MpLAkvKiBvZmxhZ3MgKi8KLQkuY19jZmxhZyA9CShERUZBVUxUX0NGTEFHUyksCS8qIGNmbGFncyAqLwotCS5jX2xmbGFnID0JKERFRkFVTFRfTEZMQUdTKSwJLyogbGZsYWdzICovCi0JLmNfY2MgPQkJSU5JVF9DX0NDLAotCS5jX2xpbmUgPSAJMCwKLX07Ci0KLS8qIE91ciBmdW5jdGlvbiBwcm90b3R5cGVzICovCi1zdGF0aWMgaW50IGRnYXBfdHR5X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIHZvaWQgZGdhcF90dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIGludCBkZ2FwX2Jsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGNoYW5uZWxfdCAqY2gpOwotc3RhdGljIGludCBkZ2FwX3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1zdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lnZXRhKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBkaWdpX3QgX191c2VyICpyZXRpbmZvKTsKLXN0YXRpYyBpbnQgZGdhcF90dHlfZGlnaXNldGEoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGRpZ2lfdCBfX3VzZXIgKm5ld19pbmZvKTsKLXN0YXRpYyBpbnQgZGdhcF90dHlfZGlnaWdldGVkZWxheShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpyZXRpbmZvKTsKLXN0YXRpYyBpbnQgZGdhcF90dHlfZGlnaXNldGVkZWxheShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpuZXdfaW5mbyk7Ci1zdGF0aWMgaW50IGRnYXBfdHR5X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QqIHR0eSk7Ci1zdGF0aWMgaW50IGRnYXBfdHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCogdHR5KTsKLXN0YXRpYyB2b2lkIGRnYXBfdHR5X3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgZGdhcF90dHlfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyB2b2lkIGRnYXBfdHR5X3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgZGdhcF90dHlfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyB2b2lkIGRnYXBfdHR5X2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgZGdhcF90dHlfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgZGdhcF90dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIGludCBkZ2FwX3dhaXRfZm9yX2RyYWluKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIGludCBkZ2FwX3NldF9tb2RlbV9pbmZvKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBjb21tYW5kLCB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSk7Ci1zdGF0aWMgaW50IGRnYXBfZ2V0X21vZGVtX2luZm8oc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVuc2lnbmVkIGludCBfX3VzZXIgKnZhbHVlKTsKLXN0YXRpYyBpbnQgZGdhcF90dHlfZGlnaXNldGN1c3RvbWJhdWQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IF9fdXNlciAqbmV3X2luZm8pOwotc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpZ2V0Y3VzdG9tYmF1ZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpyZXRpbmZvKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDM5KQotc3RhdGljIGludCBkZ2FwX3R0eV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyBpbnQgZGdhcF90dHlfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKLSNlbHNlCi1zdGF0aWMgaW50IGRnYXBfdHR5X3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBpbnQgZGdhcF90dHlfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcik7Ci0jZW5kaWYKLXN0YXRpYyBpbnQgZGdhcF90dHlfc2VuZF9icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgbXNlYyk7Ci1zdGF0aWMgdm9pZCBkZ2FwX3R0eV93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpOwotc3RhdGljIGludCBkZ2FwX3R0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7Ci1zdGF0aWMgdm9pZCBkZ2FwX3R0eV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKTsKLXN0YXRpYyBpbnQgZGdhcF90dHlfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjKTsKLXN0YXRpYyB2b2lkIGRnYXBfdHR5X3NlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgZGdhcF90dHlfb3BzID0gewotCS5vcGVuID0gZGdhcF90dHlfb3BlbiwKLQkuY2xvc2UgPSBkZ2FwX3R0eV9jbG9zZSwKLQkud3JpdGUgPSBkZ2FwX3R0eV93cml0ZSwKLQkud3JpdGVfcm9vbSA9IGRnYXBfdHR5X3dyaXRlX3Jvb20sCi0JLmZsdXNoX2J1ZmZlciA9IGRnYXBfdHR5X2ZsdXNoX2J1ZmZlciwKLQkuY2hhcnNfaW5fYnVmZmVyID0gZGdhcF90dHlfY2hhcnNfaW5fYnVmZmVyLAotCS5mbHVzaF9jaGFycyA9IGRnYXBfdHR5X2ZsdXNoX2NoYXJzLAotCS5pb2N0bCA9IGRnYXBfdHR5X2lvY3RsLAotCS5zZXRfdGVybWlvcyA9IGRnYXBfdHR5X3NldF90ZXJtaW9zLAotCS5zdG9wID0gZGdhcF90dHlfc3RvcCwKLQkuc3RhcnQgPSBkZ2FwX3R0eV9zdGFydCwKLQkudGhyb3R0bGUgPSBkZ2FwX3R0eV90aHJvdHRsZSwKLQkudW50aHJvdHRsZSA9IGRnYXBfdHR5X3VudGhyb3R0bGUsCi0JLmhhbmd1cCA9IGRnYXBfdHR5X2hhbmd1cCwKLQkucHV0X2NoYXIgPSBkZ2FwX3R0eV9wdXRfY2hhciwKLQkudGlvY21nZXQgPSBkZ2FwX3R0eV90aW9jbWdldCwKLQkudGlvY21zZXQgPSBkZ2FwX3R0eV90aW9jbXNldCwKLQkuYnJlYWtfY3RsID0gZGdhcF90dHlfc2VuZF9icmVhaywKLQkud2FpdF91bnRpbF9zZW50ID0gZGdhcF90dHlfd2FpdF91bnRpbF9zZW50LAotCS5zZW5kX3hjaGFyID0gZGdhcF90dHlfc2VuZF94Y2hhcgotfTsKLQotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVFRZIEluaXRpYWxpemF0aW9uL0NsZWFudXAgRnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIGRnYXBfdHR5X3ByZWluaXQoKQotICoKLSAqIEluaXRpYWxpemUgYW55IGdsb2JhbCB0dHkgcmVsYXRlZCBkYXRhIGJlZm9yZSB3ZSBkb3dubG9hZCBhbnkgYm9hcmRzLgotICovCi1pbnQgZGdhcF90dHlfcHJlaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlER0FQX0xPQ0soZGdhcF9nbG9iYWxfbG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgZG9pbmcgdGhlIGNvcHkgZnJvbSB1c2VyIHNwYWNlIHRvCi0JICoga2VybmVsIHNwYWNlIGluIGRnYXBfaW5wdXQoKS4gIFdlIG9ubHkgdXNlIG9uZSBidWZmZXIgYW5kCi0JICogY29udHJvbCBhY2Nlc3MgdG8gaXQgd2l0aCBhIHNlbWFwaG9yZS4gIElmIHdlIGFyZSBwYWdpbmcsIHdlCi0JICogYXJlIGFscmVhZHkgaW4gdHJvdWJsZSBzbyBvbmUgYnVmZmVyIHdvbid0IGh1cnQgbXVjaCBhbnl3YXkuCi0JICovCi0JZGdhcF9UbXBXcml0ZUJ1ZiA9IGttYWxsb2MoV1JJVEVCVUZMRU4sIEdGUF9BVE9NSUMpOwotCi0JaWYgKCFkZ2FwX1RtcFdyaXRlQnVmKSB7Ci0JCURHQVBfVU5MT0NLKGRnYXBfZ2xvYmFsX2xvY2ssIGZsYWdzKTsKLQkJRFBSX0lOSVQoKCJ1bmFibGUgdG8gYWxsb2NhdGUgdG1wIHdyaXRlIGJ1ZiIpKTsKLQkJcmV0dXJuICgtRU5PTUVNKTsKLQl9Ci0KLSAgICAgICAgREdBUF9VTkxPQ0soZGdhcF9nbG9iYWxfbG9jaywgZmxhZ3MpOwotICAgICAgICByZXR1cm4oMCk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X3JlZ2lzdGVyKCkKLSAqCi0gKiBJbml0IHRoZSB0dHkgc3Vic3lzdGVtIGZvciB0aGlzIGJvYXJkLgotICovCi1pbnQgZGdhcF90dHlfcmVnaXN0ZXIoc3RydWN0IGJvYXJkX3QgKmJyZCkKLXsKLQlpbnQgcmMgPSAwOwotCi0JRFBSX0lOSVQoKCJ0dHlfcmVnaXN0ZXIgc3RhcnQiKSk7Ci0KLQlicmQtPlNlcmlhbERyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTUFYUE9SVFMpOwotCi0Jc25wcmludGYoYnJkLT5TZXJpYWxOYW1lLCBNQVhUVFlOQU1FTEVOLCAidHR5X2RnYXBfJWRfIiwgYnJkLT5ib2FyZG51bSk7Ci0JYnJkLT5TZXJpYWxEcml2ZXItPm5hbWUgPSBicmQtPlNlcmlhbE5hbWU7Ci0JYnJkLT5TZXJpYWxEcml2ZXItPm5hbWVfYmFzZSA9IDA7Ci0JYnJkLT5TZXJpYWxEcml2ZXItPm1ham9yID0gMDsKLQlicmQtPlNlcmlhbERyaXZlci0+bWlub3Jfc3RhcnQgPSAwOwotCWJyZC0+U2VyaWFsRHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKLQlicmQtPlNlcmlhbERyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKLQlicmQtPlNlcmlhbERyaXZlci0+aW5pdF90ZXJtaW9zID0gRGdhcERlZmF1bHRUZXJtaW9zOwotCWJyZC0+U2VyaWFsRHJpdmVyLT5kcml2ZXJfbmFtZSA9IERSVlNUUjsKLQlicmQtPlNlcmlhbERyaXZlci0+ZmxhZ3MgPSAoVFRZX0RSSVZFUl9SRUFMX1JBVyB8IFRUWV9EUklWRVJfRFlOQU1JQ19ERVYgfCBUVFlfRFJJVkVSX0hBUkRXQVJFX0JSRUFLKTsKLQotCS8qIFRoZSBrZXJuZWwgd2FudHMgc3BhY2UgdG8gc3RvcmUgcG9pbnRlcnMgdG8gdHR5X3N0cnVjdHMgKi8KLQlicmQtPlNlcmlhbERyaXZlci0+dHR5cyA9IGt6YWxsb2MoTUFYUE9SVFMgKiBzaXplb2Yoc3RydWN0IHR0eV9zdHJ1Y3QgKiksIEdGUF9LRVJORUwpOwotCWlmICghYnJkLT5TZXJpYWxEcml2ZXItPnR0eXMpCi0JCXJldHVybigtRU5PTUVNKTsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyOCkKLQlicmQtPlNlcmlhbERyaXZlci0+cmVmY291bnQgPSBicmQtPlR0eVJlZkNudDsKLSNlbmRpZgotCi0JLyoKLQkgKiBFbnRyeSBwb2ludHMgZm9yIGRyaXZlci4gIENhbGxlZCBieSB0aGUga2VybmVsIGZyb20KLQkgKiB0dHlfaW8uYyBhbmQgbl90dHkuYy4KLQkgKi8KLQl0dHlfc2V0X29wZXJhdGlvbnMoYnJkLT5TZXJpYWxEcml2ZXIsICZkZ2FwX3R0eV9vcHMpOwotCi0JLyoKLQkgKiBJZiB3ZSdyZSBkb2luZyB0cmFuc3BhcmVudCBwcmludCwgd2UgaGF2ZSB0byBkbyBhbGwgb2YgdGhlIGFib3ZlCi0JICogYWdhaW4sIHNlcGFyYXRlbHkgc28gd2UgZG9uJ3QgZ2V0IHRoZSBMRCBjb25mdXNlZCBhYm91dCB3aGF0IG1ham9yCi0JICogd2UgYXJlIHdoZW4gd2UgZ2V0IGludG8gdGhlIGRnYXBfdHR5X29wZW4oKSByb3V0aW5lLgotCSAqLwotCWJyZC0+UHJpbnREcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKE1BWFBPUlRTKTsKLQotCXNucHJpbnRmKGJyZC0+UHJpbnROYW1lLCBNQVhUVFlOQU1FTEVOLCAicHJfZGdhcF8lZF8iLCBicmQtPmJvYXJkbnVtKTsKLQlicmQtPlByaW50RHJpdmVyLT5uYW1lID0gYnJkLT5QcmludE5hbWU7Ci0JYnJkLT5QcmludERyaXZlci0+bmFtZV9iYXNlID0gMDsKLQlicmQtPlByaW50RHJpdmVyLT5tYWpvciA9IDA7Ci0JYnJkLT5QcmludERyaXZlci0+bWlub3Jfc3RhcnQgPSAwOwotCWJyZC0+UHJpbnREcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOwotCWJyZC0+UHJpbnREcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7Ci0JYnJkLT5QcmludERyaXZlci0+aW5pdF90ZXJtaW9zID0gRGdhcERlZmF1bHRUZXJtaW9zOwotCWJyZC0+UHJpbnREcml2ZXItPmRyaXZlcl9uYW1lID0gRFJWU1RSOwotCWJyZC0+UHJpbnREcml2ZXItPmZsYWdzID0gKFRUWV9EUklWRVJfUkVBTF9SQVcgfCBUVFlfRFJJVkVSX0RZTkFNSUNfREVWIHwgVFRZX0RSSVZFUl9IQVJEV0FSRV9CUkVBSyk7Ci0KLQkvKiBUaGUga2VybmVsIHdhbnRzIHNwYWNlIHRvIHN0b3JlIHBvaW50ZXJzIHRvIHR0eV9zdHJ1Y3RzICovCi0JYnJkLT5QcmludERyaXZlci0+dHR5cyA9IGt6YWxsb2MoTUFYUE9SVFMgKiBzaXplb2Yoc3RydWN0IHR0eV9zdHJ1Y3QgKiksIEdGUF9LRVJORUwpOwotCWlmICghYnJkLT5QcmludERyaXZlci0+dHR5cykKLQkJcmV0dXJuKC1FTk9NRU0pOwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI4KQotCWJyZC0+UHJpbnREcml2ZXItPnJlZmNvdW50ID0gYnJkLT5UdHlSZWZDbnQ7Ci0jZW5kaWYKLQotCS8qCi0JICogRW50cnkgcG9pbnRzIGZvciBkcml2ZXIuICBDYWxsZWQgYnkgdGhlIGtlcm5lbCBmcm9tCi0JICogdHR5X2lvLmMgYW5kIG5fdHR5LmMuCi0JICovCi0JdHR5X3NldF9vcGVyYXRpb25zKGJyZC0+UHJpbnREcml2ZXIsICZkZ2FwX3R0eV9vcHMpOwotCi0JaWYgKCFicmQtPmRnYXBfTWFqb3JfU2VyaWFsX1JlZ2lzdGVyZWQpIHsKLQkJLyogUmVnaXN0ZXIgdHR5IGRldmljZXMgKi8KLQkJcmMgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKGJyZC0+U2VyaWFsRHJpdmVyKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJQVBSKCgiQ2FuJ3QgcmVnaXN0ZXIgdHR5IGRldmljZSAoJWQpXG4iLCByYykpOwotCQkJcmV0dXJuKHJjKTsKLQkJfQotCQlicmQtPmRnYXBfTWFqb3JfU2VyaWFsX1JlZ2lzdGVyZWQgPSBUUlVFOwotCQlkZ2FwX0JvYXJkc0J5TWFqb3JbYnJkLT5TZXJpYWxEcml2ZXItPm1ham9yXSA9IGJyZDsKLQkJYnJkLT5kZ2FwX1NlcmlhbF9NYWpvciA9IGJyZC0+U2VyaWFsRHJpdmVyLT5tYWpvcjsKLQl9Ci0KLQlpZiAoIWJyZC0+ZGdhcF9NYWpvcl9UcmFuc3BhcmVudFByaW50X1JlZ2lzdGVyZWQpIHsKLQkJLyogUmVnaXN0ZXIgVHJhbnNwYXJlbnQgUHJpbnQgZGV2aWNlcyAqLwotIAkJcmMgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKGJyZC0+UHJpbnREcml2ZXIpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlBUFIoKCJDYW4ndCByZWdpc3RlciBUcmFuc3BhcmVudCBQcmludCBkZXZpY2UgKCVkKVxuIiwgcmMpKTsKLQkJCXJldHVybihyYyk7Ci0JCX0KLQkJYnJkLT5kZ2FwX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZCA9IFRSVUU7Ci0JCWRnYXBfQm9hcmRzQnlNYWpvclticmQtPlByaW50RHJpdmVyLT5tYWpvcl0gPSBicmQ7Ci0JCWJyZC0+ZGdhcF9UcmFuc3BhcmVudFByaW50X01ham9yID0gYnJkLT5QcmludERyaXZlci0+bWFqb3I7Ci0JfQotCi0JRFBSX0lOSVQoKCJER0FQIFJFR0lTVEVSIFRUWTogTUFKT1JTOiAlZCAlZFxuIiwgYnJkLT5TZXJpYWxEcml2ZXItPm1ham9yLAotCQlicmQtPlByaW50RHJpdmVyLT5tYWpvcikpOwotCi0JcmV0dXJuIChyYyk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X2luaXQoKQotICoKLSAqIEluaXQgdGhlIHR0eSBzdWJzeXN0ZW0uICBDYWxsZWQgb25jZSBwZXIgYm9hcmQgYWZ0ZXIgYm9hcmQgaGFzIGJlZW4KLSAqIGRvd25sb2FkZWQgYW5kIGluaXQnZWQuCi0gKi8KLWludCBkZ2FwX3R0eV9pbml0KHN0cnVjdCBib2FyZF90ICpicmQpCi17Ci0JaW50IGk7Ci0JaW50IHRsdzsKLQl1aW50IHRydWVfY291bnQgPSAwOwotCXVjaGFyICp2YWRkcjsKLQl1Y2hhciBtb2RlbSA9IDA7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IGJzX3QgKmJzOwotCXN0cnVjdCBjbV90ICpjbTsKLQotCWlmICghYnJkKQotCQlyZXR1cm4gKC1FTlhJTyk7Ci0KLQlEUFJfSU5JVCgoImRnYXBfdHR5X2luaXQgc3RhcnRcbiIpKTsKLQotCS8qCi0JICogSW5pdGlhbGl6ZSBib2FyZCBzdHJ1Y3R1cmUgZWxlbWVudHMuCi0JICovCi0KLQl2YWRkciA9IGJyZC0+cmVfbWFwX21lbWJhc2U7Ci0JdHJ1ZV9jb3VudCA9IHJlYWR3KCh2YWRkciArIE5DSEFOKSk7Ci0KLQlicmQtPm5hc3luYyA9IGRnYXBfY29uZmlnX2dldF9udW1iZXJfb2ZfcG9ydHMoYnJkKTsKLQotCWlmICghYnJkLT5uYXN5bmMpIHsKLQkJYnJkLT5uYXN5bmMgPSBicmQtPm1heHBvcnRzOwotCX0KLQotCWlmIChicmQtPm5hc3luYyA+IGJyZC0+bWF4cG9ydHMpIHsKLQkJYnJkLT5uYXN5bmMgPSBicmQtPm1heHBvcnRzOwotCX0KLQotCWlmICh0cnVlX2NvdW50ICE9IGJyZC0+bmFzeW5jKSB7Ci0JCWlmICgoYnJkLT50eXBlID09IFBQQ00pICYmICh0cnVlX2NvdW50ID09IDY0KSkgewotCQkJQVBSKCgiKioqV0FSTklORyoqKiogJXMgY29uZmlndXJlZCBmb3IgJWQgcG9ydHMsIGhhcyAlZCBwb3J0cy5cblBsZWFzZSBtYWtlIFNVUkUgdGhlIEVCSSBjYWJsZSBydW5uaW5nIGZyb20gdGhlIGNhcmRcbnRvIGVhY2ggRU0gbW9kdWxlIGlzIHBsdWdnZWQgaW50byBFQkkgSU4hXG4iLAotCQkJCWJyZC0+bmFtZSwgYnJkLT5uYXN5bmMsIHRydWVfY291bnQpKTsKLQkJfQotCQllbHNlIGlmICgoYnJkLT50eXBlID09IFBQQ00pICYmICh0cnVlX2NvdW50ID09IDApKSB7Ci0JCQlBUFIoKCIqKipXQVJOSU5HKioqKiAlcyBjb25maWd1cmVkIGZvciAlZCBwb3J0cywgaGFzICVkIHBvcnRzLlxuUGxlYXNlIG1ha2UgU1VSRSB0aGUgRUJJIGNhYmxlIHJ1bm5pbmcgZnJvbSB0aGUgY2FyZFxudG8gZWFjaCBFTSBtb2R1bGUgaXMgcGx1Z2dlZCBpbnRvIEVCSSBJTiFcbiIsCi0JCQkJYnJkLT5uYW1lLCBicmQtPm5hc3luYywgdHJ1ZV9jb3VudCkpOwotCQl9Ci0JCWVsc2UgewotCQkJQVBSKCgiKioqV0FSTklORyoqKiogJXMgY29uZmlndXJlZCBmb3IgJWQgcG9ydHMsIGhhcyAlZCBwb3J0cy5cbiIsCi0JCQkJYnJkLT5uYW1lLCBicmQtPm5hc3luYywgdHJ1ZV9jb3VudCkpOwotCQl9Ci0KLQkJYnJkLT5uYXN5bmMgPSB0cnVlX2NvdW50OwotCi0JCS8qIElmIG5vIHBvcnRzLCBkb24ndCBib3RoZXIgZ29pbmcgYW55IGZ1cnRoZXIgKi8KLQkJaWYgKCFicmQtPm5hc3luYykgewotCQkJYnJkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKLQkJCWJyZC0+ZHBhc3RhdHVzID0gQkRfTk9GRVA7Ci0JCQlyZXR1cm4oLUVOWElPKTsKLQkJfQotCX0KLQotCS8qCi0JICogQWxsb2NhdGUgY2hhbm5lbCBtZW1vcnkgdGhhdCBtaWdodCBub3QgaGF2ZSBiZWVuIGFsbG9jYXRlZAotCSAqIHdoZW4gdGhlIGRyaXZlciB3YXMgZmlyc3QgbG9hZGVkLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBicmQtPm5hc3luYzsgaSsrKSB7Ci0JCWlmICghYnJkLT5jaGFubmVsc1tpXSkgewotCQkJYnJkLT5jaGFubmVsc1tpXSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaGFubmVsX3QpLCBHRlBfQVRPTUlDKTsKLQkJCWlmICghYnJkLT5jaGFubmVsc1tpXSkgewotCQkJCURQUl9DT1JFKCgiJXM6JWQgVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY2hhbm5lbCBzdHJ1Y3RcbiIsCi0JCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXykpOwotCQkJfQotCQl9Ci0JfQotCi0JY2ggPSBicmQtPmNoYW5uZWxzWzBdOwotCXZhZGRyID0gYnJkLT5yZV9tYXBfbWVtYmFzZTsKLQotCWJzID0gKHN0cnVjdCBic190ICopICgodWxvbmcpIHZhZGRyICsgQ0hBTkJVRik7Ci0JY20gPSAoc3RydWN0IGNtX3QgKikgKCh1bG9uZykgdmFkZHIgKyBDTURCVUYpOwotCi0JYnJkLT5iZF9icyA9IGJzOwotCi0JLyogU2V0IHVwIGNoYW5uZWwgdmFyaWFibGVzICovCi0JZm9yIChpID0gMDsgaSA8IGJyZC0+bmFzeW5jOyBpKyssIGNoID0gYnJkLT5jaGFubmVsc1tpXSwgYnMrKykgewotCi0JCWlmICghYnJkLT5jaGFubmVsc1tpXSkKLQkJCWNvbnRpbnVlOwotCi0JCURHQVBfU1BJTkxPQ0tfSU5JVChjaC0+Y2hfbG9jayk7Ci0KLQkJLyogU3RvcmUgYWxsIG91ciBtYWdpYyBudW1iZXJzICovCi0JCWNoLT5tYWdpYyA9IERHQVBfQ0hBTk5FTF9NQUdJQzsKLQkJY2gtPmNoX3R1bi5tYWdpYyA9IERHQVBfVU5JVF9NQUdJQzsKLQkJY2gtPmNoX3R1bi51bl90eXBlID0gREdBUF9TRVJJQUw7Ci0JCWNoLT5jaF90dW4udW5fY2ggPSBjaDsKLQkJY2gtPmNoX3R1bi51bl9kZXYgPSBpOwotCi0JCWNoLT5jaF9wdW4ubWFnaWMgPSBER0FQX1VOSVRfTUFHSUM7Ci0JCWNoLT5jaF9wdW4udW5fdHlwZSA9IERHQVBfUFJJTlQ7Ci0JCWNoLT5jaF9wdW4udW5fY2ggPSBjaDsKLQkJY2gtPmNoX3B1bi51bl9kZXYgPSBpOwotCi0JCWNoLT5jaF92YWRkciA9IHZhZGRyOwotCQljaC0+Y2hfYnMgPSBiczsKLQkJY2gtPmNoX2NtID0gY207Ci0JCWNoLT5jaF9iZCA9IGJyZDsKLQkJY2gtPmNoX3BvcnRudW0gPSBpOwotCQljaC0+Y2hfZGlnaSA9IGRnYXBfZGlnaV9pbml0OwotCi0JCS8qCi0JCSAqIFNldCB1cCBkaWdpIGRzciBhbmQgZGNkIGJpdHMgYmFzZWQgb24gYWx0cGluIGZsYWcuCi0JCSAqLwotCQlpZiAoZGdhcF9jb25maWdfZ2V0X2FsdHBpbihicmQpKSB7Ci0JCQljaC0+Y2hfZHNyCT0gRE1fQ0Q7Ci0JCQljaC0+Y2hfY2QJPSBETV9EU1I7Ci0JCQljaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzIHw9IERJR0lfQUxUUElOOwotCQl9Ci0JCWVsc2UgewotCQkJY2gtPmNoX2NkCT0gRE1fQ0Q7Ci0JCQljaC0+Y2hfZHNyCT0gRE1fRFNSOwotCQl9Ci0KLQkJY2gtPmNoX3RhZGRyID0gdmFkZHIgKyAoKGNoLT5jaF9icy0+dHhfc2VnKSA8PCA0KTsKLQkJY2gtPmNoX3JhZGRyID0gdmFkZHIgKyAoKGNoLT5jaF9icy0+cnhfc2VnKSA8PCA0KTsKLQkJY2gtPmNoX3R4X3dpbiA9IDA7Ci0JCWNoLT5jaF9yeF93aW4gPSAwOwotCQljaC0+Y2hfdHNpemUgPSByZWFkdygmKGNoLT5jaF9icy0+dHhfbWF4KSkgKyAxOwotCQljaC0+Y2hfcnNpemUgPSByZWFkdygmKGNoLT5jaF9icy0+cnhfbWF4KSkgKyAxOwotCQljaC0+Y2hfdHN0YXJ0ID0gMDsKLQkJY2gtPmNoX3JzdGFydCA9IDA7Ci0KLQkJLyogLjI1IHNlY29uZCBkZWxheSAqLwotCQljaC0+Y2hfY2xvc2VfZGVsYXkgPSAyNTA7Ci0KLQkJLyoKLQkJICogU2V0IHF1ZXVlIHdhdGVyIG1hcmtzLCBpbnRlcnJ1cHQgbWFzaywKLQkJICogYW5kIGdlbmVyYWwgdHR5IHBhcmFtZXRlcnMuCi0JCSAqLwotCQljaC0+Y2hfdGx3ID0gdGx3ID0gY2gtPmNoX3RzaXplID49IDIwMDAgPyAoKGNoLT5jaF90c2l6ZSAqIDUpIC8gOCkgOiBjaC0+Y2hfdHNpemUgLyAyOwotCi0JCWRnYXBfY21kdyhjaCwgU1RMT1csIHRsdywgMCk7Ci0KLQkJZGdhcF9jbWR3KGNoLCBTUkxPVywgY2gtPmNoX3JzaXplIC8gMiwgMCk7Ci0KLQkJZGdhcF9jbWR3KGNoLCBTUkhJR0gsIDcgKiBjaC0+Y2hfcnNpemUgLyA4LCAwKTsKLQotCQljaC0+Y2hfbWlzdGF0ID0gcmVhZGIoJihjaC0+Y2hfYnMtPm1fc3RhdCkpOwotCi0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoLT5jaF9mbGFnc193YWl0KTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPmNoX3R1bi51bl9mbGFnc193YWl0KTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPmNoX3B1bi51bl9mbGFnc193YWl0KTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPmNoX3NuaWZmX3dhaXQpOwotCi0JCS8qIFR1cm4gb24gYWxsIG1vZGVtIGludGVycnVwdHMgZm9yIG5vdyAqLwotCQltb2RlbSA9IChETV9DRCB8IERNX0RTUiB8IERNX0NUUyB8IERNX1JJKTsKLQkJd3JpdGViKG1vZGVtLCAmKGNoLT5jaF9icy0+bV9pbnQpKTsKLQotCQkvKgotCQkgKiBTZXQgZWRlbGF5IHRvIDAgaWYgaW50ZXJydXB0cyBhcmUgdHVybmVkIG9uLAotCQkgKiBvdGhlcndpc2Ugc2V0IGVkZWxheSB0byB0aGUgdXN1YWwgMTAwLgotCQkgKi8KLQkJaWYgKGJyZC0+aW50cl91c2VkKQotCQkJd3JpdGV3KDAsICYoY2gtPmNoX2JzLT5lZGVsYXkpKTsKLQkJZWxzZQotCQkJd3JpdGV3KDEwMCwgJihjaC0+Y2hfYnMtPmVkZWxheSkpOwotCi0JCXdyaXRlYigxLCAmKGNoLT5jaF9icy0+aWRhdGEpKTsKLQl9Ci0KLQotCURQUl9JTklUKCgiZGdhcF90dHlfaW5pdCBmaW5pc2hcbiIpKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X3Bvc3RfdW5pbml0KCkKLSAqCi0gKiBVbkluaXRpYWxpemUgYW55IGdsb2JhbCB0dHkgcmVsYXRlZCBkYXRhLgotICovCi12b2lkIGRnYXBfdHR5X3Bvc3RfdW5pbml0KHZvaWQpCi17Ci0Ja2ZyZWUoZGdhcF9UbXBXcml0ZUJ1Zik7Ci0JZGdhcF9UbXBXcml0ZUJ1ZiA9IE5VTEw7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X3VuaW5pdCgpCi0gKgotICogVW5pbml0aWFsaXplIHRoZSBUVFkgcG9ydGlvbiBvZiB0aGlzIGRyaXZlci4gIEZyZWUgYWxsIG1lbW9yeSBhbmQKLSAqIHJlc291cmNlcy4KLSAqLwotdm9pZCBkZ2FwX3R0eV91bmluaXQoc3RydWN0IGJvYXJkX3QgKmJyZCkKLXsKLQlpbnQgaSA9IDA7Ci0KLQlpZiAoYnJkLT5kZ2FwX01ham9yX1NlcmlhbF9SZWdpc3RlcmVkKSB7Ci0JCWRnYXBfQm9hcmRzQnlNYWpvclticmQtPlNlcmlhbERyaXZlci0+bWFqb3JdID0gTlVMTDsKLQkJYnJkLT5kZ2FwX1NlcmlhbF9NYWpvciA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBicmQtPm5hc3luYzsgaSsrKSB7Ci0JCQlkZ2FwX3JlbW92ZV90dHlfc3lzZnMoYnJkLT5jaGFubmVsc1tpXS0+Y2hfdHVuLnVuX3N5c2ZzKTsKLQkJCXR0eV91bnJlZ2lzdGVyX2RldmljZShicmQtPlNlcmlhbERyaXZlciwgaSk7Ci0JCX0KLQkJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGJyZC0+U2VyaWFsRHJpdmVyKTsKLQkJa2ZyZWUoYnJkLT5TZXJpYWxEcml2ZXItPnR0eXMpOwotCQlicmQtPlNlcmlhbERyaXZlci0+dHR5cyA9IE5VTEw7Ci0JCXB1dF90dHlfZHJpdmVyKGJyZC0+U2VyaWFsRHJpdmVyKTsKLQkJYnJkLT5kZ2FwX01ham9yX1NlcmlhbF9SZWdpc3RlcmVkID0gRkFMU0U7Ci0JfQotCi0JaWYgKGJyZC0+ZGdhcF9NYWpvcl9UcmFuc3BhcmVudFByaW50X1JlZ2lzdGVyZWQpIHsKLQkJZGdhcF9Cb2FyZHNCeU1ham9yW2JyZC0+UHJpbnREcml2ZXItPm1ham9yXSA9IE5VTEw7Ci0JCWJyZC0+ZGdhcF9UcmFuc3BhcmVudFByaW50X01ham9yID0gMDsKLQkJZm9yIChpID0gMDsgaSA8IGJyZC0+bmFzeW5jOyBpKyspIHsKLQkJCWRnYXBfcmVtb3ZlX3R0eV9zeXNmcyhicmQtPmNoYW5uZWxzW2ldLT5jaF9wdW4udW5fc3lzZnMpOwotCQkJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKGJyZC0+UHJpbnREcml2ZXIsIGkpOwotCQl9Ci0JCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihicmQtPlByaW50RHJpdmVyKTsKLQkJa2ZyZWUoYnJkLT5QcmludERyaXZlci0+dHR5cyk7Ci0JCWJyZC0+UHJpbnREcml2ZXItPnR0eXMgPSBOVUxMOwotCQlwdXRfdHR5X2RyaXZlcihicmQtPlByaW50RHJpdmVyKTsKLQkJYnJkLT5kZ2FwX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZCA9IEZBTFNFOwotCX0KLX0KLQotCi0jZGVmaW5lIFRNUEJVRkxFTiAoMTAyNCkKLQotLyoKLSAqIGRnYXBfc25pZmYgLSBEdW1wIGRhdGEgb3V0IHRvIHRoZSAic25pZmYiIGJ1ZmZlciBpZiB0aGUKLSAqIHByb2Mgc25pZmYgZmlsZSBpcyBvcGVuZWQuLi4KLSAqLwotc3RhdGljIHZvaWQgZGdhcF9zbmlmZl9ub3dhaXRfbm9sb2NrKHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1Y2hhciAqdGV4dCwgdWNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKLQlpbnQgbjsKLQlpbnQgcjsKLQlpbnQgbmJ1ZjsKLQlpbnQgaTsKLQlpbnQgdG1wYnVmbGVuOwotCWNoYXIgdG1wYnVmW1RNUEJVRkxFTl07Ci0JY2hhciAqcCA9IHRtcGJ1ZjsKLQlpbnQgdG9vX211Y2hfZGF0YTsKLQotCS8qIExlYXZlIGlmIHNuaWZmIG5vdCBvcGVuICovCi0JaWYgKCEoY2gtPmNoX3NuaWZmX2ZsYWdzICYgU05JRkZfT1BFTikpCi0JCXJldHVybjsKLQotCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCi0JLyogQ3JlYXRlIG91ciBoZWFkZXIgZm9yIGRhdGEgZHVtcCAqLwotCXAgKz0gc3ByaW50ZihwLCAiPCVsZCAlbGQ+PCVzPjwiLCB0di50dl9zZWMsIHR2LnR2X3VzZWMsIHRleHQpOwotCXRtcGJ1ZmxlbiA9IHAgLSB0bXBidWY7Ci0KLQlkbyB7Ci0JCXRvb19tdWNoX2RhdGEgPSAwOwotCi0JCWZvciAoaSA9IDA7IGkgPCBsZW4gJiYgdG1wYnVmbGVuIDwgKFRNUEJVRkxFTiAtIDQpOyBpKyspIHsKLQkJCXAgKz0gc3ByaW50ZihwLCAiJTAyeCAiLCAqYnVmKTsKLQkJCWJ1ZisrOwotCQkJdG1wYnVmbGVuID0gcCAtIHRtcGJ1ZjsKLQkJfQotCi0JCWlmICh0bXBidWZsZW4gPCAoVE1QQlVGTEVOIC0gNCkpIHsKLQkJCWlmIChpID4gMCkKLQkJCQlwICs9IHNwcmludGYocCAtIDEsICIlc1xuIiwgIj4iKTsKLQkJCWVsc2UKLQkJCQlwICs9IHNwcmludGYocCwgIiVzXG4iLCAiPiIpOwotCQl9IGVsc2UgewotCQkJdG9vX211Y2hfZGF0YSA9IDE7Ci0JCQlsZW4gLT0gaTsKLQkJfQotCi0JCW5idWYgPSBzdHJsZW4odG1wYnVmKTsKLQkJcCA9IHRtcGJ1ZjsKLQotCQkvKgotCQkgKiAgTG9vcCB3aGlsZSBkYXRhIHJlbWFpbnMuCi0JCSAqLwotCQl3aGlsZSAobmJ1ZiA+IDAgJiYgY2gtPmNoX3NuaWZmX2J1ZikgewotCQkJLyoKLQkJCSAqICBEZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgc3BhY2UgbGVmdCBpbiB0aGUKLQkJCSAqICBidWZmZXIuICBJZiB0aGVyZSdzIG5vbmUsIHdhaXQgdW50aWwgc29tZSBhcHBlYXJzLgotCQkJICovCi0JCQluID0gKGNoLT5jaF9zbmlmZl9vdXQgLSBjaC0+Y2hfc25pZmZfaW4gLSAxKSAmIFNOSUZGX01BU0s7Ci0KLQkJCS8qCi0JCQkgKiBJZiB0aGVyZSBpcyBubyBzcGFjZSBsZWZ0IHRvIHdyaXRlIHRvIGluIG91ciBzbmlmZiBidWZmZXIsCi0JCQkgKiB3ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8gZHJvcCB0aGUgZGF0YS4KLQkJCSAqIFdlICpjYW5ub3QqIHNsZWVwIGhlcmUgd2FpdGluZyBmb3Igc3BhY2UsIGJlY2F1c2UgdGhpcwotCQkJICogZnVuY3Rpb24gd2FzIHByb2JhYmx5IGNhbGxlZCBieSB0aGUgaW50ZXJydXB0L3RpbWVyIHJvdXRpbmVzIQotCQkJICovCi0JCQlpZiAobiA9PSAwKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvKgotCQkJICogQ29weSBhcyBtdWNoIGRhdGEgYXMgd2lsbCBmaXQuCi0JCQkgKi8KLQotCQkJaWYgKG4gPiBuYnVmKQotCQkJCW4gPSBuYnVmOwotCi0JCQlyID0gU05JRkZfTUFYIC0gY2gtPmNoX3NuaWZmX2luOwotCi0JCQlpZiAociA8PSBuKSB7Ci0JCQkJbWVtY3B5KGNoLT5jaF9zbmlmZl9idWYgKyBjaC0+Y2hfc25pZmZfaW4sIHAsIHIpOwotCi0JCQkJbiAtPSByOwotCQkJCWNoLT5jaF9zbmlmZl9pbiA9IDA7Ci0JCQkJcCArPSByOwotCQkJCW5idWYgLT0gcjsKLQkJCX0KLQotCQkJbWVtY3B5KGNoLT5jaF9zbmlmZl9idWYgKyBjaC0+Y2hfc25pZmZfaW4sIHAsIG4pOwotCi0JCQljaC0+Y2hfc25pZmZfaW4gKz0gbjsKLQkJCXAgKz0gbjsKLQkJCW5idWYgLT0gbjsKLQotCQkJLyoKLQkJCSAqICBXYWtldXAgYW55IHRocmVhZCB3YWl0aW5nIGZvciBkYXRhCi0JCQkgKi8KLQkJCWlmIChjaC0+Y2hfc25pZmZfZmxhZ3MgJiBTTklGRl9XQUlUX0RBVEEpIHsKLQkJCQljaC0+Y2hfc25pZmZfZmxhZ3MgJj0gflNOSUZGX1dBSVRfREFUQTsKLQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9zbmlmZl93YWl0KTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIElmIHRoZSB1c2VyIHNlbnQgdXMgdG9vIG11Y2ggZGF0YSB0byBwdXNoIGludG8gb3VyIHRtcGJ1ZiwKLQkJICogd2UgbmVlZCB0byBrZWVwIGxvb3BpbmcgYXJvdW5kIG9uIGFsbCB0aGUgZGF0YS4KLQkJICovCi0JCWlmICh0b29fbXVjaF9kYXRhKSB7Ci0JCQlwID0gdG1wYnVmOwotCQkJdG1wYnVmbGVuID0gMDsKLQkJfQotCi0JfSB3aGlsZSAodG9vX211Y2hfZGF0YSk7Ci19Ci0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqICAgICAgZGdhcF9pbnB1dCAtIFByb2Nlc3MgcmVjZWl2ZWQgZGF0YS4KLSAqCi0gKiAgICAgICAgICAgICAgY2ggICAgICAtIFBvaW50ZXIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUuCi0gKgotICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLXZvaWQgZGdhcF9pbnB1dChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGJzX3QJKmJzOwotCXN0cnVjdCB0dHlfc3RydWN0ICp0cDsKLQlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKLQl1aW50CXJtYXNrOwotCXVpbnQJaGVhZDsKLQl1aW50CXRhaWw7Ci0JaW50CWRhdGFfbGVuOwotCXVsb25nCWxvY2tfZmxhZ3M7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzMjsKLQlpbnQgZmxpcF9sZW47Ci0JaW50IGxlbiA9IDA7Ci0JaW50IG4gPSAwOwotCXVjaGFyICpidWY7Ci0JdWNoYXIgdG1wY2hhcjsKLQlpbnQgcyA9IDA7Ci0KLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybjsKLQotCXRwID0gY2gtPmNoX3R1bi51bl90dHk7Ci0KLQlicyAgPSBjaC0+Y2hfYnM7Ci0JaWYgKCFicykgewotCQlyZXR1cm47Ci0JfQotCi0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlEUFJfUkVBRCgoImRnYXBfaW5wdXQgc3RhcnRcbiIpKTsKLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQkvKgotCSAqICAgICAgRmlndXJlIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgYnVmZmVyLgotCSAqICAgICAgRXhpdCBpbW1lZGlhdGVseSBpZiBub25lLgotCSAqLwotCi0Jcm1hc2sgPSBjaC0+Y2hfcnNpemUgLSAxOwotCi0JaGVhZCA9IHJlYWR3KCYoYnMtPnJ4X2hlYWQpKTsKLQloZWFkICY9IHJtYXNrOwotCXRhaWwgPSByZWFkdygmKGJzLT5yeF90YWlsKSk7Ci0JdGFpbCAmPSBybWFzazsKLQotCWRhdGFfbGVuID0gKGhlYWQgLSB0YWlsKSAmIHJtYXNrOwotCi0JaWYgKGRhdGFfbGVuID09IDApIHsKLQkJd3JpdGViKDEsICYoYnMtPmlkYXRhKSk7Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJRFBSX1JFQUQoKCJObyBkYXRhIG9uIHBvcnQgJWRcbiIsIGNoLT5jaF9wb3J0bnVtKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIElmIHRoZSBkZXZpY2UgaXMgbm90IG9wZW4sIG9yIENSRUFEIGlzIG9mZiwgZmx1c2gKLQkgKiBpbnB1dCBkYXRhIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JaWYgKChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpIHx8ICF0cCAgfHwgKHRwLT5tYWdpYyAhPSBUVFlfTUFHSUMpIHx8Ci0gICAgICAgICAgICAhKGNoLT5jaF90dW4udW5fZmxhZ3MgJiBVTl9JU09QRU4pIHx8ICEodHAtPnRlcm1pb3MuY19jZmxhZyAmIENSRUFEKSB8fAotCSAgICAoY2gtPmNoX3R1bi51bl9mbGFncyAmIFVOX0NMT1NJTkcpKSB7Ci0KLQkJRFBSX1JFQUQoKCJpbnB1dC4gZHJvcHBpbmcgJWQgYnl0ZXMgb24gcG9ydCAlZC4uLlxuIiwgZGF0YV9sZW4sIGNoLT5jaF9wb3J0bnVtKSk7Ci0JCURQUl9SRUFEKCgiaW5wdXQuIHRwOiAlcCB0cC0+bWFnaWM6ICV4IE1BR0lDOiV4IGNoIGZsYWdzOiAleFxuIiwKLQkJCXRwLCB0cCA/IHRwLT5tYWdpYyA6IDAsIFRUWV9NQUdJQywgY2gtPmNoX3R1bi51bl9mbGFncykpOwotCQl3cml0ZXcoaGVhZCwgJihicy0+cnhfdGFpbCkpOwotCQl3cml0ZWIoMSwgJihicy0+aWRhdGEpKTsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBJZiB3ZSBhcmUgdGhyb3R0bGVkLCBzaW1wbHkgZG9uJ3QgcmVhZCBhbnkgZGF0YS4KLQkgKi8KLQlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfUlhCTE9DSykgewotCQl3cml0ZWIoMSwgJihicy0+aWRhdGEpKTsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlEUFJfUkVBRCgoIlBvcnQgJWQgdGhyb3R0bGVkLCBub3QgcmVhZGluZyBhbnkgZGF0YS4gaGVhZDogJXggdGFpbDogJXhcbiIsCi0JCQljaC0+Y2hfcG9ydG51bSwgaGVhZCwgdGFpbCkpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiAgICAgIElnbm9yZSBvcnVucy4KLQkgKi8KLQl0bXBjaGFyID0gcmVhZGIoJihicy0+b3J1bikpOwotCWlmICh0bXBjaGFyKSB7Ci0JCWNoLT5jaF9lcnJfb3ZlcnJ1bisrOwotCQl3cml0ZWIoMCwgJihicy0+b3J1bikpOwotCX0KLQotCURQUl9SRUFEKCgiZGdhcF9pbnB1dCBzdGFydCAyXG4iKSk7Ci0KLQkvKiBEZWNpZGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gc2VuZCBpbnRvIHRoZSB0dHkgbGF5ZXIgKi8KLQlmbGlwX2xlbiA9IFRUWV9GTElQQlVGX1NJWkU7Ci0KLQkvKiBDaG9wIGRvd24gdGhlIGxlbmd0aCwgaWYgbmVlZGVkICovCi0JbGVuID0gbWluKGRhdGFfbGVuLCBmbGlwX2xlbik7Ci0JbGVuID0gbWluKGxlbiwgKE5fVFRZX0JVRl9TSVpFIC0gMSkpOwotCi0JbGQgPSB0dHlfbGRpc2NfcmVmKHRwKTsKLQotI2lmZGVmIFRUWV9ET05UX0ZMSVAKLQkvKgotCSAqIElmIHRoZSBET05UX0ZMSVAgZmxhZyBpcyBvbiwgZG9uJ3QgZmx1c2ggb3VyIGJ1ZmZlciwgYW5kIGFjdAotCSAqIGxpa2UgdGhlIGxkIGRvZXNuJ3QgaGF2ZSBhbnkgc3BhY2UgdG8gcHV0IHRoZSBkYXRhIHJpZ2h0IG5vdy4KLQkgKi8KLQlpZiAodGVzdF9iaXQoVFRZX0RPTlRfRkxJUCwgJnRwLT5mbGFncykpCi0JCWxlbiA9IDA7Ci0jZW5kaWYKLQotCS8qCi0JICogSWYgd2Ugd2VyZSB1bmFibGUgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBsZCwKLQkgKiBkb24ndCBmbHVzaCBvdXIgYnVmZmVyLCBhbmQgYWN0IGxpa2UgdGhlIGxkIGRvZXNuJ3QKLQkgKiBoYXZlIGFueSBzcGFjZSB0byBwdXQgdGhlIGRhdGEgcmlnaHQgbm93LgotCSAqLwotCWlmICghbGQpIHsKLQkJbGVuID0gMDsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBJZiBsZCBkb2Vzbid0IGhhdmUgYSBwb2ludGVyIHRvIGEgcmVjZWl2ZV9idWYgZnVuY3Rpb24sCi0JCSAqIGZsdXNoIHRoZSBkYXRhLCB0aGVuIGFjdCBsaWtlIHRoZSBsZCBkb2Vzbid0IGhhdmUgYW55Ci0JCSAqIHNwYWNlIHRvIHB1dCB0aGUgZGF0YSByaWdodCBub3cuCi0JCSAqLwotCQlpZiAoIWxkLT5vcHMtPnJlY2VpdmVfYnVmKSB7Ci0JCQl3cml0ZXcoaGVhZCwgJihicy0+cnhfdGFpbCkpOwotCQkJbGVuID0gMDsKLQkJfQotCX0KLQotCWlmIChsZW4gPD0gMCkgewotCQl3cml0ZWIoMSwgJihicy0+aWRhdGEpKTsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlEUFJfUkVBRCgoImRnYXBfaW5wdXQgMSAtIGZpbmlzaFxuIikpOwotCQlpZiAobGQpCi0JCQl0dHlfbGRpc2NfZGVyZWYobGQpOwotCQlyZXR1cm47Ci0JfQotCi0JYnVmID0gY2gtPmNoX2JkLT5mbGlwYnVmOwotCW4gPSBsZW47Ci0KLQkvKgotCSAqIG4gbm93IGNvbnRhaW5zIHRoZSBtb3N0IGFtb3VudCBvZiBkYXRhIHdlIGNhbiBjb3B5LAotCSAqIGJvdW5kZWQgZWl0aGVyIGJ5IG91ciBidWZmZXIgc2l6ZSBvciB0aGUgYW1vdW50Ci0JICogb2YgZGF0YSB0aGUgY2FyZCBhY3R1YWxseSBoYXMgcGVuZGluZy4uLgotCSAqLwotCXdoaWxlIChuKSB7Ci0KLQkJcyA9ICgoaGVhZCA+PSB0YWlsKSA/IGhlYWQgOiBjaC0+Y2hfcnNpemUpIC0gdGFpbDsKLQkJcyA9IG1pbihzLCBuKTsKLQotCQlpZiAocyA8PSAwKQotCQkJYnJlYWs7Ci0KLQkJbWVtY3B5X2Zyb21pbyhidWYsIChjaGFyICopIGNoLT5jaF9yYWRkciArIHRhaWwsIHMpOwotCQlkZ2FwX3NuaWZmX25vd2FpdF9ub2xvY2soY2gsICJVU0VSIFJFQUQiLCBidWYsIHMpOwotCi0JCXRhaWwgKz0gczsKLQkJYnVmICs9IHM7Ci0KLQkJbiAtPSBzOwotCQkvKiBGbGlwIHF1ZXVlIGlmIG5lZWRlZCAqLwotCQl0YWlsICY9IHJtYXNrOwotCX0KLQotCXdyaXRldyh0YWlsLCAmKGJzLT5yeF90YWlsKSk7Ci0Jd3JpdGViKDEsICYoYnMtPmlkYXRhKSk7Ci0JY2gtPmNoX3J4Y291bnQgKz0gbGVuOwotCi0JLyoKLQkgKiBJZiB3ZSBhcmUgY29tcGxldGVseSByYXcsIHdlIGRvbid0IG5lZWQgdG8gZ28gdGhyb3VnaCBhIGxvdAotCSAqIG9mIHRoZSB0dHkgbGF5ZXJzIHRoYXQgZXhpc3QuCi0JICogSW4gdGhpcyBjYXNlLCB3ZSB0YWtlIHRoZSBzaG9ydGVzdCBhbmQgZmFzdGVzdCByb3V0ZSB3ZQotCSAqIGNhbiB0byByZWxheSB0aGUgZGF0YSB0byB0aGUgdXNlci4KLQkgKgotCSAqIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB3ZSBhcmUgbm90IHJhdywgd2UgbmVlZCB0byBnbyB0aHJvdWdoCi0JICogdGhlIHR0eSBsYXllciwgd2hpY2ggaGFzIGl0cyBBUEkgbW9yZSB3ZWxsIGRlZmluZWQuCi0JICovCi0JaWYgKElfUEFSTVJLKHRwKSB8fCBJX0JSS0lOVCh0cCkgfHwgSV9JTlBDSyh0cCkpIHsKLQkJZGdhcF9wYXJpdHlfc2NhbihjaCwgY2gtPmNoX2JkLT5mbGlwYnVmLCBjaC0+Y2hfYmQtPmZsaXBmbGFnYnVmLCAmbGVuKTsKLQotCQlsZW4gPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0cC0+cG9ydCwgbGVuKTsKLQkJdHR5X2luc2VydF9mbGlwX3N0cmluZ19mbGFncyh0cC0+cG9ydCwgY2gtPmNoX2JkLT5mbGlwYnVmLAotCQkJY2gtPmNoX2JkLT5mbGlwZmxhZ2J1ZiwgbGVuKTsKLQl9Ci0JZWxzZSB7Ci0JCWxlbiA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHRwLT5wb3J0LCBsZW4pOwotCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHRwLT5wb3J0LCBjaC0+Y2hfYmQtPmZsaXBidWYsIGxlbik7Ci0JfQotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkvKiBUZWxsIHRoZSB0dHkgbGF5ZXIgaXRzIG9rYXkgdG8gImVhdCIgdGhlIGRhdGEgbm93ICovCi0JdHR5X2ZsaXBfYnVmZmVyX3B1c2godHAtPnBvcnQpOwotCi0JaWYgKGxkKQotCQl0dHlfbGRpc2NfZGVyZWYobGQpOwotCi0JRFBSX1JFQUQoKCJkZ2FwX2lucHV0IC0gZmluaXNoXG4iKSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRGV0ZXJtaW5lcyB3aGVuIENBUlJJRVIgY2hhbmdlcyBzdGF0ZSBhbmQgdGFrZXMgYXBwcm9wcmlhdGUKLSAqIGFjdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGRnYXBfY2FycmllcihzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0KLSAgICAgICAgaW50IHZpcnRfY2FycmllciA9IDA7Ci0gICAgICAgIGludCBwaHlzX2NhcnJpZXIgPSAwOwotCi0JRFBSX0NBUlIoKCJkZ2FwX2NhcnJpZXIgY2FsbGVkLi4uXG4iKSk7Ci0KLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybjsKLQotCWJkID0gY2gtPmNoX2JkOwotCi0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuOwotCi0JLyogTWFrZSBzdXJlIGFsdHBpbiBpcyBhbHdheXMgc2V0IGNvcnJlY3RseSAqLwotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9BTFRQSU4pIHsKLQkJY2gtPmNoX2RzciAgICAgID0gRE1fQ0Q7Ci0JCWNoLT5jaF9jZCAgICAgICA9IERNX0RTUjsKLQl9Ci0JZWxzZSB7Ci0JCWNoLT5jaF9kc3IgICAgICA9IERNX0RTUjsKLQkJY2gtPmNoX2NkICAgICAgID0gRE1fQ0Q7Ci0JfQotCi0JaWYgKGNoLT5jaF9taXN0YXQgJiBEX0NEKGNoKSkgewotCQlEUFJfQ0FSUigoIm1pc3RhdDogJXggIERfQ0Q6ICV4XG4iLCBjaC0+Y2hfbWlzdGF0LCBEX0NEKGNoKSkpOwotCQlwaHlzX2NhcnJpZXIgPSAxOwotCX0KLQotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9GT1JDRURDRCkgewotCQl2aXJ0X2NhcnJpZXIgPSAxOwotCX0KLQotCWlmIChjaC0+Y2hfY19jZmxhZyAmIENMT0NBTCkgewotCQl2aXJ0X2NhcnJpZXIgPSAxOwotCX0KLQotCi0JRFBSX0NBUlIoKCJEQ0Q6IHBoeXNpY2FsOiAlZCB2aXJ0OiAlZFxuIiwgcGh5c19jYXJyaWVyLCB2aXJ0X2NhcnJpZXIpKTsKLQotCS8qCi0JICogVGVzdCBmb3IgYSBWSVJUVUFMIGNhcnJpZXIgdHJhbnNpdGlvbiB0byBISUdILgotCSAqLwotCWlmICgoKGNoLT5jaF9mbGFncyAmIENIX0ZDQVIpID09IDApICYmICh2aXJ0X2NhcnJpZXIgPT0gMSkpIHsKLQotCQkvKgotCQkgKiBXaGVuIGNhcnJpZXIgcmlzZXMsIHdha2UgYW55IHRocmVhZHMgd2FpdGluZwotCQkgKiBmb3IgY2FycmllciBpbiB0aGUgb3BlbiByb3V0aW5lLgotCQkgKi8KLQotCQlEUFJfQ0FSUigoImNhcnJpZXI6IHZpcnQgRENEIHJvc2VcbiIpKTsKLQotCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmKGNoLT5jaF9mbGFnc193YWl0KSkpCi0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9mbGFnc193YWl0KTsKLQl9Ci0KLQkvKgotCSAqIFRlc3QgZm9yIGEgUEhZU0lDQUwgY2FycmllciB0cmFuc2l0aW9uIHRvIEhJR0guCi0JICovCi0JaWYgKCgoY2gtPmNoX2ZsYWdzICYgQ0hfQ0QpID09IDApICYmIChwaHlzX2NhcnJpZXIgPT0gMSkpIHsKLQotCQkvKgotCQkgKiBXaGVuIGNhcnJpZXIgcmlzZXMsIHdha2UgYW55IHRocmVhZHMgd2FpdGluZwotCQkgKiBmb3IgY2FycmllciBpbiB0aGUgb3BlbiByb3V0aW5lLgotCQkgKi8KLQotCQlEUFJfQ0FSUigoImNhcnJpZXI6IHBoeXNpY2FsIERDRCByb3NlXG4iKSk7Ci0KLQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJihjaC0+Y2hfZmxhZ3Nfd2FpdCkpKQotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfZmxhZ3Nfd2FpdCk7Ci0JfQotCi0JLyoKLQkgKiAgVGVzdCBmb3IgYSBQSFlTSUNBTCB0cmFuc2l0aW9uIHRvIGxvdywgc28gbG9uZyBhcyB3ZSBhcmVuJ3QKLQkgKiAgY3VycmVudGx5IGlnbm9yaW5nIHBoeXNpY2FsIHRyYW5zaXRpb25zICh3aGljaCBpcyB3aGF0ICJ2aXJ0dWFsCi0JICogIGNhcnJpZXIiIGluZGljYXRlcykuCi0JICoKLQkgKiAgVGhlIHRyYW5zaXRpb24gb2YgdGhlIHZpcnR1YWwgY2FycmllciB0byBsb3cgcmVhbGx5IGRvZXNuJ3QKLQkgKiAgbWF0dGVyLi4uIGl0IHJlYWxseSBvbmx5IG1lYW5zICJpZ25vcmUgY2FycmllciBzdGF0ZSIsIG5vdAotCSAqICAibWFrZSBwcmV0ZW5kIHRoYXQgY2FycmllciBpcyB0aGVyZSIuCi0JICovCi0JaWYgKCh2aXJ0X2NhcnJpZXIgPT0gMCkgJiYgKChjaC0+Y2hfZmxhZ3MgJiBDSF9DRCkgIT0gMCkgJiYKLQkgICAgKHBoeXNfY2FycmllciA9PSAwKSkKLQl7Ci0KLQkJLyoKLQkJICogICBXaGVuIGNhcnJpZXIgZHJvcHM6Ci0JCSAqCi0JCSAqICAgRHJvcCBjYXJyaWVyIG9uIGFsbCBvcGVuIHVuaXRzLgotCQkgKgotCQkgKiAgIEZsdXNoIHF1ZXVlcywgd2FraW5nIHVwIGFueSB0YXNrIHdhaXRpbmcgaW4gdGhlCi0JCSAqICAgbGluZSBkaXNjaXBsaW5lLgotCQkgKgotCQkgKiAgIFNlbmQgYSBoYW5ndXAgdG8gdGhlIGNvbnRyb2wgdGVybWluYWwuCi0JCSAqCi0JCSAqICAgRW5hYmxlIGFsbCBzZWxlY3QgY2FsbHMuCi0JCSAqLwotCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmKGNoLT5jaF9mbGFnc193YWl0KSkpCi0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9mbGFnc193YWl0KTsKLQotCQlpZiAoY2gtPmNoX3R1bi51bl9vcGVuX2NvdW50ID4gMCkgewotCQkJRFBSX0NBUlIoKCJTZW5kaW5nIHR0eSBoYW5ndXBcbiIpKTsKLQkJCXR0eV9oYW5ndXAoY2gtPmNoX3R1bi51bl90dHkpOwotCQl9Ci0KLQkJaWYgKGNoLT5jaF9wdW4udW5fb3Blbl9jb3VudCA+IDApIHsKLQkJCURQUl9DQVJSKCgiU2VuZGluZyBwciBoYW5ndXBcbiIpKTsKLQkJCXR0eV9oYW5ndXAoY2gtPmNoX3B1bi51bl90dHkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAgTWFrZSBzdXJlIHRoYXQgb3VyIGNhY2hlZCB2YWx1ZXMgcmVmbGVjdCB0aGUgY3VycmVudCByZWFsaXR5LgotCSAqLwotCWlmICh2aXJ0X2NhcnJpZXIgPT0gMSkKLQkJY2gtPmNoX2ZsYWdzIHw9IENIX0ZDQVI7Ci0JZWxzZQotCQljaC0+Y2hfZmxhZ3MgJj0gfkNIX0ZDQVI7Ci0KLQlpZiAocGh5c19jYXJyaWVyID09IDEpCi0JCWNoLT5jaF9mbGFncyB8PSBDSF9DRDsKLQllbHNlCi0JCWNoLT5jaF9mbGFncyAmPSB+Q0hfQ0Q7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRUWSBFbnRyeSBwb2ludHMgYW5kIGhlbHBlciBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogZGdhcF90dHlfb3BlbigpCi0gKgotICovCi1zdGF0aWMgaW50IGRnYXBfdHR5X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGJvYXJkX3QJKmJyZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdAkqdW47Ci0Jc3RydWN0IGJzX3QJKmJzOwotCXVpbnQJCW1ham9yID0gMDsKLQl1aW50CQltaW5vciA9IDA7Ci0JaW50CQlyYyA9IDA7Ci0JdWxvbmcJCWxvY2tfZmxhZ3M7Ci0JdWxvbmcJCWxvY2tfZmxhZ3MyOwotCXUxNgkJaGVhZDsKLQotCXJjID0gMDsKLQotCW1ham9yID0gTUFKT1IodHR5X2Rldm51bSh0dHkpKTsKLQltaW5vciA9IE1JTk9SKHR0eV9kZXZudW0odHR5KSk7Ci0KLQlpZiAobWFqb3IgPiAyNTUpIHsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQkvKiBHZXQgYm9hcmQgcG9pbnRlciBmcm9tIG91ciBhcnJheSBvZiBtYWpvcnMgd2UgaGF2ZSBhbGxvY2F0ZWQgKi8KLQlicmQgPSBkZ2FwX0JvYXJkc0J5TWFqb3JbbWFqb3JdOwotCWlmICghYnJkKSB7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JLyoKLQkgKiBJZiBib2FyZCBpcyBub3QgeWV0IHVwIHRvIGEgc3RhdGUgb2YgUkVBRFksIGdvIHRvCi0JICogc2xlZXAgd2FpdGluZyBmb3IgaXQgdG8gaGFwcGVuIG9yIHRoZXkgY2FuY2VsIHRoZSBvcGVuLgotCSAqLwotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGJyZC0+c3RhdGVfd2FpdCwKLQkJKGJyZC0+c3RhdGUgJiBCT0FSRF9SRUFEWSkpOwotCi0JaWYgKHJjKSB7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlER0FQX0xPQ0soYnJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCS8qIFRoZSB3YWl0IGFib3ZlIHNob3VsZCBndWFyYW50ZWUgdGhpcyBjYW5ub3QgaGFwcGVuICovCi0JaWYgKGJyZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpIHsKLQkJREdBUF9VTkxPQ0soYnJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQkvKiBJZiBvcGVuZWQgZGV2aWNlIGlzIGdyZWF0ZXIgdGhhbiBvdXIgbnVtYmVyIG9mIHBvcnRzLCBiYWlsLiAqLwotCWlmIChNSU5PUih0dHlfZGV2bnVtKHR0eSkpID4gYnJkLT5uYXN5bmMpIHsKLQkJREdBUF9VTkxPQ0soYnJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQljaCA9IGJyZC0+Y2hhbm5lbHNbbWlub3JdOwotCWlmICghY2gpIHsKLQkJREdBUF9VTkxPQ0soYnJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQkvKiBHcmFiIGNoYW5uZWwgbG9jayAqLwotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JLyogRmlndXJlIG91dCBvdXIgdHlwZSAqLwotCWlmIChtYWpvciA9PSBicmQtPmRnYXBfU2VyaWFsX01ham9yKSB7Ci0JCXVuID0gJmJyZC0+Y2hhbm5lbHNbbWlub3JdLT5jaF90dW47Ci0JCXVuLT51bl90eXBlID0gREdBUF9TRVJJQUw7Ci0JfQotCWVsc2UgaWYgKG1ham9yID09IGJyZC0+ZGdhcF9UcmFuc3BhcmVudFByaW50X01ham9yKSB7Ci0JCXVuID0gJmJyZC0+Y2hhbm5lbHNbbWlub3JdLT5jaF9wdW47Ci0JCXVuLT51bl90eXBlID0gREdBUF9QUklOVDsKLQl9Ci0JZWxzZSB7Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJyZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCURQUl9PUEVOKCgiJWQgVW5rbm93biBUWVBFIVxuIiwgX19MSU5FX18pKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQkvKiBTdG9yZSBvdXIgdW5pdCBpbnRvIGRyaXZlcl9kYXRhLCBzbyB3ZSBhbHdheXMgaGF2ZSBpdCBhdmFpbGFibGUuICovCi0JdHR5LT5kcml2ZXJfZGF0YSA9IHVuOwotCi0JRFBSX09QRU4oKCJPcGVuIGNhbGxlZC4gTUFKT1I6ICVkIE1JTk9SOiVkIHVuaXQ6ICVwIE5BTUU6ICVzXG4iLAotCQlNQUpPUih0dHlfZGV2bnVtKHR0eSkpLCBNSU5PUih0dHlfZGV2bnVtKHR0eSkpLCB1biwgYnJkLT5uYW1lKSk7Ci0KLQkvKgotCSAqIEVycm9yIGlmIGNoYW5uZWwgaW5mbyBwb2ludGVyIGlzIE5VTEwuCi0JICovCi0JYnMgPSBjaC0+Y2hfYnM7Ci0JaWYgKCFicykgewotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlEUFJfT1BFTigoIiVkIEJTIGlzIDAhXG4iLCBfX0xJTkVfXykpOwotCQlyZXR1cm4gLUVOWElPOwotICAgICAgICB9Ci0KLQlEUFJfT1BFTigoIiVkOiB0ZmxhZz0leCAgcGZsYWc9JXhcbiIsIF9fTElORV9fLCBjaC0+Y2hfdHVuLnVuX2ZsYWdzLCBjaC0+Y2hfcHVuLnVuX2ZsYWdzKSk7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgdHR5J3MKLQkgKi8KLQlpZiAoISh1bi0+dW5fZmxhZ3MgJiBVTl9JU09QRU4pKSB7Ci0JCS8qIFN0b3JlIGltcG9ydGFudCB2YXJpYWJsZXMuICovCi0JCXVuLT51bl90dHkgICAgID0gdHR5OwotCi0JCS8qIE1heWJlIGRvIHNvbWV0aGluZyBoZXJlIHRvIHRoZSBUVFkgc3RydWN0IGFzIHdlbGw/ICovCi0JfQotCi0JLyoKLQkgKiBJbml0aWFsaXplIGlmIG5laXRoZXIgdGVybWluYWwgb3IgcHJpbnRlciBpcyBvcGVuLgotCSAqLwotCWlmICghKChjaC0+Y2hfdHVuLnVuX2ZsYWdzIHwgY2gtPmNoX3B1bi51bl9mbGFncykgJiBVTl9JU09QRU4pKSB7Ci0KLQkJRFBSX09QRU4oKCJkZ2FwX29wZW46IGluaXRpYWxpemluZyBjaGFubmVsIGluIG9wZW4uLi5cbiIpKTsKLQotCQljaC0+Y2hfbWZvcmNlID0gMDsKLQkJY2gtPmNoX212YWwgPSAwOwotCi0JCS8qCi0JCSAqIEZsdXNoIGlucHV0IHF1ZXVlLgotCQkgKi8KLQkJaGVhZCA9IHJlYWR3KCYoYnMtPnJ4X2hlYWQpKTsKLQkJd3JpdGV3KGhlYWQsICYoYnMtPnJ4X3RhaWwpKTsKLQotCQljaC0+Y2hfZmxhZ3MgPSAwOwotCQljaC0+cHNjYW5fc3RhdGUgPSAwOwotCQljaC0+cHNjYW5fc2F2ZWNoYXIgPSAwOwotCi0JCWNoLT5jaF9jX2NmbGFnICAgPSB0dHktPnRlcm1pb3MuY19jZmxhZzsKLQkJY2gtPmNoX2NfaWZsYWcgICA9IHR0eS0+dGVybWlvcy5jX2lmbGFnOwotCQljaC0+Y2hfY19vZmxhZyAgID0gdHR5LT50ZXJtaW9zLmNfb2ZsYWc7Ci0JCWNoLT5jaF9jX2xmbGFnICAgPSB0dHktPnRlcm1pb3MuY19sZmxhZzsKLQkJY2gtPmNoX3N0YXJ0YyA9IHR0eS0+dGVybWlvcy5jX2NjW1ZTVEFSVF07Ci0JCWNoLT5jaF9zdG9wYyAgPSB0dHktPnRlcm1pb3MuY19jY1tWU1RPUF07Ci0KLQkJLyogVE9ETzogZmx1c2ggb3VyIFRUWSBzdHJ1Y3QgaGVyZT8gKi8KLQl9Ci0KLQlkZ2FwX2NhcnJpZXIoY2gpOwotCS8qCi0JICogUnVuIHBhcmFtIGluIGNhc2Ugd2UgY2hhbmdlZCBhbnl0aGluZwotCSAqLwotCWRnYXBfcGFyYW0odHR5KTsKLQotCS8qCi0JICogZm9sbG93IHByb3RvY29sIGZvciBvcGVuaW5nIHBvcnQKLQkgKi8KLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYnJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCXJjID0gZGdhcF9ibG9ja190aWxfcmVhZHkodHR5LCBmaWxlLCBjaCk7Ci0KLQlpZiAoIXVuLT51bl90dHkpIHsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKHJjKSB7Ci0JCURQUl9PUEVOKCgiZGdhcF90dHlfb3BlbiByZXR1cm5pbmcgYWZ0ZXIgZGdhcF9ibG9ja190aWxfcmVhZHkgIgotCQkJIndpdGggJWRcbiIsIHJjKSk7Ci0JfQotCi0JLyogTm8gZ29pbmcgYmFjayBub3csIGluY3JlbWVudCBvdXIgdW5pdCBhbmQgY2hhbm5lbCBjb3VudGVycyAqLwotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0JY2gtPmNoX29wZW5fY291bnQrKzsKLQl1bi0+dW5fb3Blbl9jb3VudCsrOwotCXVuLT51bl9mbGFncyB8PSAoVU5fSVNPUEVOKTsKLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlEUFJfT1BFTigoImRnYXBfdHR5X29wZW4gZmluaXNoZWRcbiIpKTsKLQlyZXR1cm4gKHJjKTsKLX0KLQotCi0vKgotICogZGdhcF9ibG9ja190aWxfcmVhZHkoKQotICoKLSAqIFdhaXQgZm9yIERDRCwgaWYgbmVlZGVkLgotICovCi1zdGF0aWMgaW50IGRnYXBfYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKLXsKLQlpbnQgcmV0dmFsID0gMDsKLQlzdHJ1Y3QgdW5fdCAqdW4gPSBOVUxMOwotCXVsb25nICAgbG9ja19mbGFnczsKLQl1aW50CW9sZF9mbGFncyA9IDA7Ci0JaW50IHNsZWVwX29uX3VuX2ZsYWdzID0gMDsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDIHx8ICFmaWxlIHx8ICFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKSB7Ci0JCXJldHVybiAoLUVOWElPKTsKLQl9Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKSB7Ci0JCXJldHVybiAoLUVOWElPKTsKLQl9Ci0KLQlEUFJfT1BFTigoImRnYXBfYmxvY2tfdGlsX3JlYWR5IC0gYmVmb3JlIGJsb2NrLlxuIikpOwotCi0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCWNoLT5jaF93b3BlbisrOwotCi0JLyogTG9vcCBmb3JldmVyICovCi0Jd2hpbGUgKDEpIHsKLQotCQlzbGVlcF9vbl91bl9mbGFncyA9IDA7Ci0KLQkJLyoKLQkJICogSWYgYm9hcmQgaGFzIGZhaWxlZCBzb21laG93IGR1cmluZyBvdXIgc2xlZXAsIGJhaWwgd2l0aCBlcnJvci4KLQkJICovCi0JCWlmIChjaC0+Y2hfYmQtPnN0YXRlID09IEJPQVJEX0ZBSUxFRCkgewotCQkJcmV0dmFsID0gLUVOWElPOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBJZiB0dHkgd2FzIGh1bmcgdXAsIGJyZWFrIG91dCBvZiBsb29wIGFuZCBzZXQgZXJyb3IuICovCi0JCWlmICh0dHlfaHVuZ191cF9wKGZpbGUpKSB7Ci0JCQlyZXR2YWwgPSAtRUFHQUlOOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKgotCQkgKiBJZiBlaXRoZXIgdW5pdCBpcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBmcmFnaWxlIHBhcnQgb2YgY2xvc2UsCi0JCSAqIHdlIGp1c3QgY2Fubm90IHRvdWNoIHRoZSBjaGFubmVsIHNhZmVseS4KLQkJICogR28gYmFjayB0byBzbGVlcCwga25vd2luZyB0aGF0IHdoZW4gdGhlIGNoYW5uZWwgY2FuIGJlCi0JCSAqIHRvdWNoZWQgc2FmZWx5LCB0aGUgY2xvc2Ugcm91dGluZSB3aWxsIHNpZ25hbCB0aGUKLQkJICogY2hfd2FpdF9mbGFncyB0byB3YWtlIHVzIGJhY2sgdXAuCi0JCSAqLwotCQlpZiAoISgoY2gtPmNoX3R1bi51bl9mbGFncyB8IGNoLT5jaF9wdW4udW5fZmxhZ3MpICYgVU5fQ0xPU0lORykpIHsKLQotCQkJLyoKLQkJCSAqIE91ciBjb25kaXRpb25zIHRvIGxlYXZlIGNsZWFubHkgYW5kIGhhcHBpbHk6Ci0JCQkgKiAxKSBOT05CTE9DS0lORyBvbiB0aGUgdHR5IGlzIHNldC4KLQkJCSAqIDIpIENMT0NBTCBpcyBzZXQuCi0JCQkgKiAzKSBEQ0QgKGZha2Ugb3IgcmVhbCkgaXMgYWN0aXZlLgotCQkJICovCi0KLQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpIHsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX0NEKSB7Ci0JCQkJRFBSX09QRU4oKCIlZDogY2hfZmxhZ3M6ICV4XG4iLCBfX0xJTkVfXywgY2gtPmNoX2ZsYWdzKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9GQ0FSKSB7Ci0JCQkJRFBSX09QRU4oKCIlZDogY2hfZmxhZ3M6ICV4XG4iLCBfX0xJTkVfXywgY2gtPmNoX2ZsYWdzKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzbGVlcF9vbl91bl9mbGFncyA9IDE7Ci0JCX0KLQotCQkvKgotCQkgKiBJZiB0aGVyZSBpcyBhIHNpZ25hbCBwZW5kaW5nLCB0aGUgdXNlciBwcm9iYWJseQotCQkgKiBpbnRlcnJ1cHRlZCAoY3RybC1jKSB1cy4KLQkJICogTGVhdmUgbG9vcCB3aXRoIGVycm9yIHNldC4KLQkJICovCi0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJRFBSX09QRU4oKCIlZDogc2lnbmFsIHBlbmRpbmcuLi5cbiIsIF9fTElORV9fKSk7Ci0JCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7Ci0JCQlicmVhazsKLQkJfQotCi0JCURQUl9PUEVOKCgiZGdhcF9ibG9ja190aWxfcmVhZHkgLSBibG9ja2luZy5cbiIpKTsKLQotCQkvKgotCQkgKiBTdG9yZSB0aGUgZmxhZ3MgYmVmb3JlIHdlIGxldCBnbyBvZiBjaGFubmVsIGxvY2sKLQkJICovCi0JCWlmIChzbGVlcF9vbl91bl9mbGFncykKLQkJCW9sZF9mbGFncyA9IGNoLT5jaF90dW4udW5fZmxhZ3MgfCBjaC0+Y2hfcHVuLnVuX2ZsYWdzOwotCQllbHNlCi0JCQlvbGRfZmxhZ3MgPSBjaC0+Y2hfZmxhZ3M7Ci0KLQkJLyoKLQkJICogTGV0IGdvIG9mIGNoYW5uZWwgbG9jayBiZWZvcmUgY2FsbGluZyBzY2hlZHVsZS4KLQkJICogT3VyIHBvbGxlciB3aWxsIGdldCBhbnkgRkVQIGV2ZW50cyBhbmQgd2FrZSB1cyB1cCB3aGVuIERDRAotCQkgKiBldmVudHVhbGx5IGdvZXMgYWN0aXZlLgotCQkgKi8KLQotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkJRFBSX09QRU4oKCJHb2luZyB0byBzbGVlcCBvbiAlcyBmbGFncy4uLlxuIiwKLQkJCShzbGVlcF9vbl91bl9mbGFncyA/ICJ1biIgOiAiY2giKSkpOwotCi0JCS8qCi0JCSAqIFdhaXQgZm9yIHNvbWV0aGluZyBpbiB0aGUgZmxhZ3MgdG8gY2hhbmdlIGZyb20gdGhlIGN1cnJlbnQgdmFsdWUuCi0JCSAqLwotCQlpZiAoc2xlZXBfb25fdW5fZmxhZ3MpIHsKLQkJCXJldHZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh1bi0+dW5fZmxhZ3Nfd2FpdCwKLQkJCQkob2xkX2ZsYWdzICE9IChjaC0+Y2hfdHVuLnVuX2ZsYWdzIHwgY2gtPmNoX3B1bi51bl9mbGFncykpKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShjaC0+Y2hfZmxhZ3Nfd2FpdCwKLQkJCQkob2xkX2ZsYWdzICE9IGNoLT5jaF9mbGFncykpOwotCQl9Ci0KLQkJRFBSX09QRU4oKCJBZnRlciBzbGVlcC4uLiByZXR2YWw6ICV4XG4iLCByZXR2YWwpKTsKLQotCQkvKgotCQkgKiBXZSBnb3Qgd29rZW4gdXAgZm9yIHNvbWUgcmVhc29uLgotCQkgKiBCZWZvcmUgbG9vcGluZyBhcm91bmQsIGdyYWIgb3VyIGNoYW5uZWwgbG9jay4KLQkJICovCi0JCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0JfQotCi0JY2gtPmNoX3dvcGVuLS07Ci0KLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlEUFJfT1BFTigoImRnYXBfYmxvY2tfdGlsX3JlYWR5IC0gYWZ0ZXIgYmxvY2tpbmcuXG4iKSk7Ci0KLQlpZiAocmV0dmFsKSB7Ci0JCURQUl9PUEVOKCgiZGdhcF9ibG9ja190aWxfcmVhZHkgLSBkb25lLiBlcnJvci4gcmV0dmFsOiAleFxuIiwgcmV0dmFsKSk7Ci0JCXJldHVybihyZXR2YWwpOwotCX0KLQotCURQUl9PUEVOKCgiZGdhcF9ibG9ja190aWxfcmVhZHkgLSBkb25lIG5vIGVycm9yLiBqaWZmaWVzOiAlbHVcbiIsIGppZmZpZXMpKTsKLQotCXJldHVybigwKTsKLX0KLQotCi0vKgotICogZGdhcF90dHlfaGFuZ3VwKCkKLSAqCi0gKiBIYW5ndXAgdGhlIHBvcnQuICBMaWtlIGEgY2xvc2UsIGJ1dCBkb24ndCB3YWl0IGZvciBvdXRwdXQgdG8gZHJhaW4uCi0gKi8KLXN0YXRpYyB2b2lkIGRnYXBfdHR5X2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBib2FyZF90CSpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdAkqdW47Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuOwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlEUFJfQ0xPU0UoKCJkZ2FwX2hhbmd1cCBjYWxsZWQuIGNoLT5jaF9vcGVuX2NvdW50OiAlZCB1bi0+dW5fb3Blbl9jb3VudDogJWRcbiIsCi0JCWNoLT5jaF9vcGVuX2NvdW50LCB1bi0+dW5fb3Blbl9jb3VudCkpOwotCi0JLyogZmx1c2ggdGhlIHRyYW5zbWl0IHF1ZXVlcyAqLwotCWRnYXBfdHR5X2ZsdXNoX2J1ZmZlcih0dHkpOwotCi0JRFBSX0NMT1NFKCgiZGdhcF9oYW5ndXAgZmluaXNoZWQuIGNoLT5jaF9vcGVuX2NvdW50OiAlZCB1bi0+dW5fb3Blbl9jb3VudDogJWRcbiIsCi0JCWNoLT5jaF9vcGVuX2NvdW50LCB1bi0+dW5fb3Blbl9jb3VudCkpOwotfQotCi0KLQotLyoKLSAqIGRnYXBfdHR5X2Nsb3NlKCkKLSAqCi0gKi8KLXN0YXRpYyB2b2lkIGRnYXBfdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBrdGVybWlvcyAqdHM7Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQl1bG9uZyBsb2NrX2ZsYWdzOwotCWludCByYyA9IDA7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuOwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQl0cyA9ICZ0dHktPnRlcm1pb3M7Ci0KLQlEUFJfQ0xPU0UoKCJDbG9zZSBjYWxsZWRcbiIpKTsKLQotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkvKgotCSAqIERldGVybWluZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGNsb3NlIG9yIG5vdCAtIGFuZCBpZiB3ZSBhZ3JlZSBhYm91dAotCSAqIHdoaWNoIHR5cGUgb2YgY2xvc2UgaXQgaXMgd2l0aCB0aGUgTGluZSBEaXNjaXBsaW5lCi0JICovCi0JaWYgKCh0dHktPmNvdW50ID09IDEpICYmICh1bi0+dW5fb3Blbl9jb3VudCAhPSAxKSkgewotCQkvKgotCQkgKiBVaCwgb2guICB0dHktPmNvdW50IGlzIDEsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHR0eQotCQkgKiBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZC4gIHVuX29wZW5fY291bnQgc2hvdWxkIGFsd2F5cwotCQkgKiBiZSBvbmUgaW4gdGhlc2UgY29uZGl0aW9ucy4gIElmIGl0J3MgZ3JlYXRlciB0aGFuCi0JCSAqIG9uZSwgd2UndmUgZ290IHJlYWwgcHJvYmxlbXMsIHNpbmNlIGl0IG1lYW5zIHRoZQotCQkgKiBzZXJpYWwgcG9ydCB3b24ndCBiZSBzaHV0ZG93bi4KLQkJICovCi0JCUFQUigoInR0eS0+Y291bnQgaXMgMSwgdW4gb3BlbiBjb3VudCBpcyAlZFxuIiwgdW4tPnVuX29wZW5fY291bnQpKTsKLQkJdW4tPnVuX29wZW5fY291bnQgPSAxOwotCX0KLQotCWlmICgtLXVuLT51bl9vcGVuX2NvdW50IDwgMCkgewotCQlBUFIoKCJiYWQgc2VyaWFsIHBvcnQgb3BlbiBjb3VudCBvZiAlZFxuIiwgdW4tPnVuX29wZW5fY291bnQpKTsKLQkJdW4tPnVuX29wZW5fY291bnQgPSAwOwotCX0KLQotCWNoLT5jaF9vcGVuX2NvdW50LS07Ci0KLQlpZiAoY2gtPmNoX29wZW5fY291bnQgJiYgdW4tPnVuX29wZW5fY291bnQpIHsKLQkJRFBSX0NMT1NFKCgiZGdhcF90dHlfY2xvc2U6IG5vdCBsYXN0IGNsb3NlIGNoOiAlZCB1bjolZFxuIiwKLQkJCWNoLT5jaF9vcGVuX2NvdW50LCB1bi0+dW5fb3Blbl9jb3VudCkpOwotCi0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotCS8qIE9LLCBpdHMgdGhlIGxhc3QgY2xvc2Ugb24gdGhlIHVuaXQgKi8KLQlEUFJfQ0xPU0UoKCJkZ2FwX3R0eV9jbG9zZSAtIGxhc3QgY2xvc2Ugb24gdW5pdCBwcm9jZWR1cmVzXG4iKSk7Ci0KLQl1bi0+dW5fZmxhZ3MgfD0gVU5fQ0xPU0lORzsKLQotCXR0eS0+Y2xvc2luZyA9IDE7Ci0KLQkvKgotCSAqIE9ubHkgb2ZmaWNpYWxseSBjbG9zZSBjaGFubmVsIGlmIGNvdW50IGlzIDAgYW5kCi0gICAgICAgICAqIERJR0lfUFJJTlRFUiBiaXQgaXMgbm90IHNldC4KLQkgKi8KLQlpZiAoKGNoLT5jaF9vcGVuX2NvdW50ID09IDApICYmICEoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfUFJJTlRFUikpIHsKLQotCQljaC0+Y2hfZmxhZ3MgJj0gfihDSF9SWEJMT0NLKTsKLQotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkJLyogd2FpdCBmb3Igb3V0cHV0IHRvIGRyYWluICovCi0JCS8qIFRoaXMgd2lsbCBhbHNvIHJldHVybiBpZiB3ZSB0YWtlIGFuIGludGVycnVwdCAqLwotCi0JCURQUl9DTE9TRSgoIkNhbGxpbmcgd2FpdF9mb3JfZHJhaW5cbiIpKTsKLQkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7Ci0JCURQUl9DTE9TRSgoIkFmdGVyIGNhbGxpbmcgd2FpdF9mb3JfZHJhaW5cbiIpKTsKLQotCQlpZiAocmMpIHsKLQkJCURQUl9CQVNJQygoImRnYXBfdHR5X2Nsb3NlIC0gYmFkIHJldHVybjogJWQgIiwgcmMpKTsKLQkJfQotCi0JCWRnYXBfdHR5X2ZsdXNoX2J1ZmZlcih0dHkpOwotCQl0dHlfbGRpc2NfZmx1c2godHR5KTsKLQotCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JCXR0eS0+Y2xvc2luZyA9IDA7Ci0KLQkJLyoKLQkJICogSWYgd2UgaGF2ZSBIVVBDTCBzZXQsIGxvd2VyIERUUiBhbmQgUlRTCi0JCSAqLwotCQlpZiAoY2gtPmNoX2NfY2ZsYWcgJiBIVVBDTCApIHsKLQkJCURQUl9DTE9TRSgoIkNsb3NlLiBIVVBDTCBzZXQsIGRyb3BwaW5nIERUUi9SVFNcbiIpKTsKLQkJCWNoLT5jaF9tb3N0YXQgJj0gfihEX1JUUyhjaCl8RF9EVFIoY2gpKTsKLQkJCWRnYXBfY21kYiggY2gsIFNNT0RFTSwgMCwgRF9EVFIoY2gpfERfUlRTKGNoKSwgMCApOwotCi0JCQkvKgotCQkJICogR28gdG8gc2xlZXAgdG8gZW5zdXJlIFJUUy9EVFIKLQkJCSAqIGhhdmUgYmVlbiBkcm9wcGVkIGZvciBtb2RlbXMgdG8gc2VlIGl0LgotCQkJICovCi0JCQlpZiAoY2gtPmNoX2Nsb3NlX2RlbGF5KSB7Ci0JCQkJRFBSX0NMT1NFKCgiQ2xvc2UuIFNsZWVwaW5nIGZvciBSVFMvRFRSIGRyb3BcbiIpKTsKLQotCQkJCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCQlkZ2FwX21zX3NsZWVwKGNoLT5jaF9jbG9zZV9kZWxheSk7Ci0JCQkJREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCQkJCURQUl9DTE9TRSgoIkNsb3NlLiBBZnRlciBzbGVlcGluZyBmb3IgUlRTL0RUUiBkcm9wXG4iKSk7Ci0JCQl9Ci0JCX0KLQotCQljaC0+cHNjYW5fc3RhdGUgPSAwOwotCQljaC0+cHNjYW5fc2F2ZWNoYXIgPSAwOwotCQljaC0+Y2hfYmF1ZF9pbmZvID0gMDsKLQotCX0KLQotCS8qCi0JICogdHVybiBvZmYgcHJpbnQgZGV2aWNlIHdoZW4gY2xvc2luZyBwcmludCBkZXZpY2UuCi0JICovCi0JaWYgKCh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSAgJiYgKGNoLT5jaF9mbGFncyAmIENIX1BST04pICkgewotCQlkZ2FwX3dtb3ZlKGNoLCBjaC0+Y2hfZGlnaS5kaWdpX29mZnN0ciwKLQkJCShpbnQpIGNoLT5jaF9kaWdpLmRpZ2lfb2ZmbGVuKTsKLQkJY2gtPmNoX2ZsYWdzICY9IH5DSF9QUk9OOwotCX0KLQotCXVuLT51bl90dHkgPSBOVUxMOwotCXVuLT51bl9mbGFncyAmPSB+KFVOX0lTT1BFTiB8IFVOX0NMT1NJTkcpOwotCXR0eS0+ZHJpdmVyX2RhdGEgPSBOVUxMOwotCi0JRFBSX0NMT1NFKCgiQ2xvc2UuIERvaW5nIHdha2V1cHNcbiIpKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9mbGFnc193YWl0KTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnVuLT51bl9mbGFnc193YWl0KTsKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotICAgICAgICBEUFJfQkFTSUMoKCJkZ2FwX3R0eV9jbG9zZSAtIGNvbXBsZXRlXG4iKSk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X2NoYXJzX2luX2J1ZmZlcigpCi0gKgotICogUmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBub3QgYmVlbiB0cmFuc21pdHRlZCB5ZXQuCi0gKgotICogVGhpcyByb3V0aW5lIGlzIHVzZWQgYnkgdGhlIGxpbmUgZGlzY2lwbGluZSB0byBkZXRlcm1pbmUgaWYgdGhlcmUKLSAqIGlzIGRhdGEgd2FpdGluZyB0byBiZSB0cmFuc21pdHRlZC9kcmFpbmVkL2ZsdXNoZWQgb3Igbm90LgotICovCi1zdGF0aWMgaW50IGRnYXBfdHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBib2FyZF90ICpiZCA9IE5VTEw7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2ggPSBOVUxMOwotCXN0cnVjdCB1bl90ICp1biA9IE5VTEw7Ci0Jc3RydWN0IGJzX3QgKmJzID0gTlVMTDsKLQl1Y2hhciB0YnVzeTsKLQl1aW50IGNoYXJzID0gMDsKLQl1MTYgdGhlYWQsIHR0YWlsLCB0bWFzaywgY2hlYWQsIGN0YWlsOwotCXVsb25nICAgbG9ja19mbGFncyA9IDA7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzMiA9IDA7Ci0KLQlpZiAodHR5ID09IE5VTEwpCi0JCXJldHVybigwKTsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gKDApOwotCi0gICAgICAgIGJzID0gY2gtPmNoX2JzOwotCWlmICghYnMpCi0JCXJldHVybiAoMCk7Ci0KLQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JdG1hc2sgPSAoY2gtPmNoX3RzaXplIC0gMSk7Ci0KLQkvKiBHZXQgVHJhbnNtaXQgcXVldWUgcG9pbnRlcnMgKi8KLQl0aGVhZCA9IHJlYWR3KCYoYnMtPnR4X2hlYWQpKSAmIHRtYXNrOwotCXR0YWlsID0gcmVhZHcoJihicy0+dHhfdGFpbCkpICYgdG1hc2s7Ci0KLQkvKiBHZXQgdGJ1c3kgZmxhZyAqLwotCXRidXN5ID0gcmVhZGIoJihicy0+dGJ1c3kpKTsKLQotCS8qIEdldCBDb21tYW5kIHF1ZXVlIHBvaW50ZXJzICovCi0JY2hlYWQgPSByZWFkdygmKGNoLT5jaF9jbS0+Y21faGVhZCkpOwotCWN0YWlsID0gcmVhZHcoJihjaC0+Y2hfY20tPmNtX3RhaWwpKTsKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JLyoKLQkgKiBUaGUgb25seSB3YXkgd2Uga25vdyBmb3Igc3VyZSBpZiB0aGVyZSBpcyBubyBwZW5kaW5nCi0JICogZGF0YSBsZWZ0IHRvIGJlIHRyYW5zZmVycmVkLCBpcyBpZjoKLQkgKiAxKSBUcmFuc21pdCBoZWFkIGFuZCB0YWlsIGFyZSBlcXVhbCAoZW1wdHkpLgotCSAqIDIpIENvbW1hbmQgcXVldWUgaGVhZCBhbmQgdGFpbCBhcmUgZXF1YWwgKGVtcHR5KS4KLQkgKiAzKSBUaGUgIlRCVVNZIiBmbGFnIGlzIDAuIChUcmFuc21pdHRlciBub3QgYnVzeSkuCi0gCSAqLwotCi0JaWYgKCh0dGFpbCA9PSB0aGVhZCkgJiYgKHRidXN5ID09IDApICYmIChjaGVhZCA9PSBjdGFpbCkpIHsKLQkJY2hhcnMgPSAwOwotCX0KLQllbHNlIHsKLQkJaWYgKHRoZWFkID49IHR0YWlsKQotCQkJY2hhcnMgPSB0aGVhZCAtIHR0YWlsOwotCQllbHNlCi0JCQljaGFycyA9IHRoZWFkIC0gdHRhaWwgKyBjaC0+Y2hfdHNpemU7Ci0JCS8qCi0JCSAqIEZ1ZGdlIGZhY3RvciBoZXJlLgotCQkgKiBJZiBjaGFycyBpcyB6ZXJvLCB3ZSBrbm93IHRoYXQgdGhlIGNvbW1hbmQgcXVldWUgaGFkCi0JCSAqIHNvbWV0aGluZyBpbiBpdCBvciB0YnVzeSB3YXMgc2V0LiAgQmVjYXVzZSB3ZSBjYW5ub3QKLQkJICogYmUgc3VyZSBpZiB0aGVyZSBpcyBzdGlsbCBzb21lIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQsCi0JCSAqIGxldHMgbGllLCBhbmQgdGVsbCBsZCB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LgotCQkgKi8KLQkJaWYgKGNoYXJzID09IDApIHsKLQkJCS8qCi0JCQkgKiBJZiBUQlVTWSBpcyBzdGlsbCBzZXQsIGFuZCBvdXIgdHggYnVmZmVycyBhcmUgZW1wdHksCi0JCQkgKiBmb3JjZSB0aGUgZmlybXdhcmUgdG8gc2VuZCBtZSBhbm90aGVyIHdha2V1cCBhZnRlcgotCQkJICogVEJVU1kgaGFzIGJlZW4gY2xlYXJlZC4KLQkJCSAqLwotCQkJaWYgKHRidXN5ICE9IDApIHsKLQkJCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJCXVuLT51bl9mbGFncyB8PSBVTl9FTVBUWTsKLQkJCQl3cml0ZWIoMSwgJihicy0+aWVtcHR5KSk7Ci0JCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJfQotCQkJY2hhcnMgPSAxOwotCQl9Ci0JfQotCi0gCURQUl9XUklURSgoImRnYXBfdHR5X2NoYXJzX2luX2J1ZmZlci4gUG9ydDogJXggLSAlZCAoaGVhZDogJWQgdGFpbDogJWQgdHNpemU6ICVkKVxuIiwKLQkJY2gtPmNoX3BvcnRudW0sIGNoYXJzLCB0aGVhZCwgdHRhaWwsIGNoLT5jaF90c2l6ZSkpOwotICAgICAgICByZXR1cm4oY2hhcnMpOwotfQotCi0KLXN0YXRpYyBpbnQgZGdhcF93YWl0X2Zvcl9kcmFpbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQlzdHJ1Y3QgYnNfdCAqYnM7Ci0JaW50IHJldCA9IC1FSU87Ci0JdWludCBjb3VudCA9IDE7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzID0gMDsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQotICAgICAgICBicyA9IGNoLT5jaF9iczsKLQlpZiAoIWJzKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gMDsKLQotCURQUl9EUkFJTigoImRnYXBfd2FpdF9mb3JfZHJhaW4gc3RhcnRcbiIpKTsKLQotCS8qIExvb3AgdW50aWwgZGF0YSBpcyBkcmFpbmVkICovCi0Jd2hpbGUgKGNvdW50ICE9IDApIHsKLQotCQljb3VudCA9IGRnYXBfdHR5X2NoYXJzX2luX2J1ZmZlcih0dHkpOwotCi0JCWlmIChjb3VudCA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJLyogU2V0IGZsYWcgd2FpdGluZyBmb3IgZHJhaW4gKi8KLQkJREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJdW4tPnVuX2ZsYWdzIHw9IFVOX0VNUFRZOwotCQl3cml0ZWIoMSwgJihicy0+aWVtcHR5KSk7Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCQkvKiBHbyB0byBzbGVlcCB0aWxsIHdlIGdldCB3b2tlbiB1cCAqLwotCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodW4tPnVuX2ZsYWdzX3dhaXQsICgodW4tPnVuX2ZsYWdzICYgVU5fRU1QVFkpID09IDApKTsKLQkJLyogSWYgcmV0IGlzIG5vbi16ZXJvLCB1c2VyIGN0cmwtYydlZCB1cyAqLwotCQlpZiAocmV0KSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0JdW4tPnVuX2ZsYWdzICY9IH4oVU5fRU1QVFkpOwotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCURQUl9EUkFJTigoImRnYXBfd2FpdF9mb3JfZHJhaW4gZmluaXNoXG4iKSk7Ci0JcmV0dXJuIChyZXQpOwotfQotCi0KLS8qCi0gKiBkZ2FwX21heGNwc19yb29tCi0gKgotICogUmVkdWNlcyBieXRlc19hdmFpbGFibGUgdG8gdGhlIG1heCBudW1iZXIgb2YgY2hhcmFjdGVycwotICogdGhhdCBjYW4gYmUgc2VudCBjdXJyZW50bHkgZ2l2ZW4gdGhlIG1heGNwcyB2YWx1ZSwgYW5kCi0gKiByZXR1cm5zIHRoZSBuZXcgYnl0ZXNfYXZhaWxhYmxlLiAgVGhpcyBvbmx5IGFmZmVjdHMgcHJpbnRlcgotICogb3V0cHV0LgotICovCi1zdGF0aWMgaW50IGRnYXBfbWF4Y3BzX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJ5dGVzX2F2YWlsYWJsZSkKLXsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaCA9IE5VTEw7Ci0Jc3RydWN0IHVuX3QgKnVuID0gTlVMTDsKLQotCWlmICh0dHkgPT0gTlVMTCkKLQkJcmV0dXJuIChieXRlc19hdmFpbGFibGUpOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuIChieXRlc19hdmFpbGFibGUpOwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gKGJ5dGVzX2F2YWlsYWJsZSk7Ci0KLQkvKgotCSAqIElmIGl0cyBub3QgdGhlIFRyYW5zcGFyZW50IHByaW50IGRldmljZSwgcmV0dXJuCi0JICogdGhlIGZ1bGwgZGF0YSBhbW91bnQuCi0JICovCi0JaWYgKHVuLT51bl90eXBlICE9IERHQVBfUFJJTlQpCi0JCXJldHVybiAoYnl0ZXNfYXZhaWxhYmxlKTsKLQotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX21heGNwcyA+IDAgJiYgY2gtPmNoX2RpZ2kuZGlnaV9idWZzaXplID4gMCApIHsKLQkJaW50IGNwc19saW1pdCA9IDA7Ci0JCXVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lID0gamlmZmllczsKLQkJdW5zaWduZWQgbG9uZyBidWZmZXJfdGltZSA9IGN1cnJlbnRfdGltZSArCi0JCQkoSFogKiBjaC0+Y2hfZGlnaS5kaWdpX2J1ZnNpemUpIC8gY2gtPmNoX2RpZ2kuZGlnaV9tYXhjcHM7Ci0KLQkJaWYgKGNoLT5jaF9jcHN0aW1lIDwgY3VycmVudF90aW1lKSB7Ci0JCQkvKiBidWZmZXIgaXMgZW1wdHkgKi8KLQkJCWNoLT5jaF9jcHN0aW1lID0gY3VycmVudF90aW1lOyAgICAgICAgICAgIC8qIHJlc2V0IGNoX2Nwc3RpbWUgKi8KLQkJCWNwc19saW1pdCA9IGNoLT5jaF9kaWdpLmRpZ2lfYnVmc2l6ZTsKLQkJfQotCQllbHNlIGlmIChjaC0+Y2hfY3BzdGltZSA8IGJ1ZmZlcl90aW1lKSB7Ci0JCQkvKiBzdGlsbCByb29tIGluIHRoZSBidWZmZXIgKi8KLQkJCWNwc19saW1pdCA9ICgoYnVmZmVyX3RpbWUgLSBjaC0+Y2hfY3BzdGltZSkgKiBjaC0+Y2hfZGlnaS5kaWdpX21heGNwcykgLyBIWjsKLQkJfQotCQllbHNlIHsKLQkJCS8qIG5vIHJvb20gaW4gdGhlIGJ1ZmZlciAqLwotCQkJY3BzX2xpbWl0ID0gMDsKLQkJfQotCi0JCWJ5dGVzX2F2YWlsYWJsZSA9IG1pbihjcHNfbGltaXQsIGJ5dGVzX2F2YWlsYWJsZSk7Ci0JfQotCi0JcmV0dXJuIChieXRlc19hdmFpbGFibGUpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkZ2FwX3NldF9maXJtd2FyZV9ldmVudChzdHJ1Y3QgdW5fdCAqdW4sIHVuc2lnbmVkIGludCBldmVudCkKLXsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaCA9IE5VTEw7Ci0Jc3RydWN0IGJzX3QgKmJzID0gTlVMTDsKLQotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuOwotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuOwotICAgICAgICBicyA9IGNoLT5jaF9iczsKLQlpZiAoIWJzKQotCQlyZXR1cm47Ci0KLQlpZiAoKGV2ZW50ICYgVU5fTE9XKSAhPSAwKSB7Ci0JCWlmICgodW4tPnVuX2ZsYWdzICYgVU5fTE9XKSA9PSAwKSB7Ci0JCQl1bi0+dW5fZmxhZ3MgfD0gVU5fTE9XOwotCQkJd3JpdGViKDEsICYoYnMtPmlsb3cpKTsKLQkJfQotCX0KLQlpZiAoKGV2ZW50ICYgVU5fTE9XKSAhPSAwKSB7Ci0JCWlmICgodW4tPnVuX2ZsYWdzICYgVU5fRU1QVFkpID09IDApIHsKLQkJCXVuLT51bl9mbGFncyB8PSBVTl9FTVBUWTsKLQkJCXdyaXRlYigxLCAmKGJzLT5pZW1wdHkpKTsKLQkJfQotCX0KLX0KLQotCi0vKgotICogZGdhcF90dHlfd3JpdGVfcm9vbSgpCi0gKgotICogUmV0dXJuIHNwYWNlIGF2YWlsYWJsZSBpbiBUeCBidWZmZXIKLSAqLwotc3RhdGljIGludCBkZ2FwX3R0eV93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2ggPSBOVUxMOwotCXN0cnVjdCB1bl90ICp1biA9IE5VTEw7Ci0Jc3RydWN0IGJzX3QgKmJzID0gTlVMTDsKLQl1MTYgaGVhZCwgdGFpbCwgdG1hc2s7Ci0JaW50IHJldCA9IDA7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzID0gMDsKLQotCWlmICh0dHkgPT0gTlVMTCB8fCBkZ2FwX1RtcFdyaXRlQnVmID09IE5VTEwpCi0JCXJldHVybigwKTsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0KLSAgICAgICAgYnMgPSBjaC0+Y2hfYnM7Ci0JaWYgKCFicykKLQkJcmV0dXJuICgwKTsKLQotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQl0bWFzayA9IGNoLT5jaF90c2l6ZSAtIDE7Ci0JaGVhZCA9IHJlYWR3KCYoYnMtPnR4X2hlYWQpKSAmIHRtYXNrOwotCXRhaWwgPSByZWFkdygmKGJzLT50eF90YWlsKSkgJiB0bWFzazsKLQotICAgICAgICBpZiAoKHJldCA9IHRhaWwgLSBoZWFkIC0gMSkgPCAwKQotICAgICAgICAgICAgICAgIHJldCArPSBjaC0+Y2hfdHNpemU7Ci0KLQkvKiBMaW1pdCBwcmludGVyIHRvIG1heGNwcyAqLwotCXJldCA9IGRnYXBfbWF4Y3BzX3Jvb20odHR5LCByZXQpOwotCi0JLyoKLQkgKiBJZiB3ZSBhcmUgcHJpbnRlciBkZXZpY2UsIGxlYXZlIHNwYWNlIGZvcgotCSAqIHBvc3NpYmx5IGJvdGggdGhlIG9uIGFuZCBvZmYgc3RyaW5ncy4KLQkgKi8KLQlpZiAodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkgewotCQlpZiAoIShjaC0+Y2hfZmxhZ3MgJiBDSF9QUk9OKSkKLQkJCXJldCAtPSBjaC0+Y2hfZGlnaS5kaWdpX29ubGVuOwotCQlyZXQgLT0gY2gtPmNoX2RpZ2kuZGlnaV9vZmZsZW47Ci0JfQotCWVsc2UgewotCQlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfUFJPTikKLQkJCXJldCAtPSBjaC0+Y2hfZGlnaS5kaWdpX29mZmxlbjsKLQl9Ci0KLQlpZiAocmV0IDwgMCkKLQkJcmV0ID0gMDsKLQotCS8qCi0JICogU2NoZWR1bGUgRkVQIHRvIHdha2UgdXMgdXAgaWYgbmVlZGVkLgotCSAqCi0JICogVE9ETzogIFRoaXMgbWlnaHQgYmUgb3ZlcmtpbGwuLi4KLQkgKiBEbyB3ZSByZWFsbHkgbmVlZCB0byBzY2hlZHVsZSBjYWxsYmFja3MgZnJvbSB0aGUgRkVQCi0JICogaW4gZXZlcnkgY2FzZT8gIENhbiB3ZSBnZXQgc21hcnRlciBiYXNlZCBvbiByZXQ/Ci0JICovCi0JZGdhcF9zZXRfZmlybXdhcmVfZXZlbnQodW4sIFVOX0xPVyB8IFVOX0VNUFRZKTsKLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlEUFJfV1JJVEUoKCJkZ2FwX3R0eV93cml0ZV9yb29tIC0gJWQgdGFpbDogJWQgaGVhZDogJWRcbiIsIHJldCwgdGFpbCwgaGVhZCkpOwotCi0gICAgICAgIHJldHVybihyZXQpOwotfQotCi0KLS8qCi0gKiBkZ2FwX3R0eV9wdXRfY2hhcigpCi0gKgotICogUHV0IGEgY2hhcmFjdGVyIGludG8gY2gtPmNoX2J1ZgotICoKLSAqICAgICAgLSB1c2VkIGJ5IHRoZSBsaW5lIGRpc2NpcGxpbmUgZm9yIE9QT1NUIHByb2Nlc3NpbmcKLSAqLwotc3RhdGljIGludCBkZ2FwX3R0eV9wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGMpCi17Ci0JLyoKLQkgKiBTaW1wbHkgY2FsbCB0dHlfd3JpdGUuCi0JICovCi0JRFBSX1dSSVRFKCgiZGdhcF90dHlfcHV0X2NoYXIgY2FsbGVkXG4iKSk7Ci0JZGdhcF90dHlfd3JpdGUodHR5LCAmYywgMSk7Ci0JcmV0dXJuIDE7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X3dyaXRlKCkKLSAqCi0gKiBUYWtlIGRhdGEgZnJvbSB0aGUgdXNlciBvciBrZXJuZWwgYW5kIHNlbmQgaXQgb3V0IHRvIHRoZSBGRVAuCi0gKiBJbiBoZXJlIGV4aXN0cyBhbGwgdGhlIFRyYW5zcGFyZW50IFByaW50IG1hZ2ljIGFzIHdlbGwuCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF90dHlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCi17Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2ggPSBOVUxMOwotCXN0cnVjdCB1bl90ICp1biA9IE5VTEw7Ci0Jc3RydWN0IGJzX3QgKmJzID0gTlVMTDsKLQljaGFyICp2YWRkciA9IE5VTEw7Ci0JdTE2IGhlYWQsIHRhaWwsIHRtYXNrLCByZW1haW47Ci0JaW50IGJ1ZmNvdW50ID0gMCwgbiA9IDA7Ci0JaW50IG9yaWdfY291bnQgPSAwOwotCXVsb25nIGxvY2tfZmxhZ3M7Ci0JaW50IGZyb21fdXNlciA9IDA7Ci0KLQlpZiAodHR5ID09IE5VTEwgfHwgZGdhcF9UbXBXcml0ZUJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4oMCk7Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gKDApOwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4oMCk7Ci0KLSAgICAgICAgYnMgPSBjaC0+Y2hfYnM7Ci0JaWYgKCFicykKLQkJcmV0dXJuKDApOwotCi0JaWYgKCFjb3VudCkKLQkJcmV0dXJuKDApOwotCi0JRFBSX1dSSVRFKCgiZGdhcF90dHlfd3JpdGU6IFBvcnQ6ICV4IHR0eT0lcCB1c2VyPSVkIGxlbj0lZFxuIiwKLQkJY2gtPmNoX3BvcnRudW0sIHR0eSwgZnJvbV91c2VyLCBjb3VudCkpOwotCi0JLyoKLQkgKiBTdG9yZSBvcmlnaW5hbCBhbW91bnQgb2YgY2hhcmFjdGVycyBwYXNzZWQgaW4uCi0JICogVGhpcyBoZWxwcyB0byBmaWd1cmUgb3V0IGlmIHdlIHNob3VsZCBhc2sgdGhlIEZFUAotCSAqIHRvIHNlbmQgdXMgYW4gZXZlbnQgd2hlbiBpdCBoYXMgbW9yZSBzcGFjZSBhdmFpbGFibGUuCi0JICovCi0Jb3JpZ19jb3VudCA9IGNvdW50OwotCi0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCS8qIEdldCBvdXIgc3BhY2UgYXZhaWxhYmxlIGZvciB0aGUgY2hhbm5lbCBmcm9tIHRoZSBib2FyZCAqLwotCXRtYXNrID0gY2gtPmNoX3RzaXplIC0gMTsKLQloZWFkID0gcmVhZHcoJihicy0+dHhfaGVhZCkpICYgdG1hc2s7Ci0JdGFpbCA9IHJlYWR3KCYoYnMtPnR4X3RhaWwpKSAmIHRtYXNrOwotCi0JaWYgKChidWZjb3VudCA9IHRhaWwgLSBoZWFkIC0gMSkgPCAwKQotCQlidWZjb3VudCArPSBjaC0+Y2hfdHNpemU7Ci0KLQlEUFJfV1JJVEUoKCIlZDogYnVmY291bnQ6ICV4IGNvdW50OiAleCB0YWlsOiAleCBoZWFkOiAleCB0bWFzazogJXhcbiIsCi0JCV9fTElORV9fLCBidWZjb3VudCwgY291bnQsIHRhaWwsIGhlYWQsIHRtYXNrKSk7Ci0KLQkvKgotCSAqIExpbWl0IHByaW50ZXIgb3V0cHV0IHRvIG1heGNwcyBvdmVyYWxsLCB3aXRoIGJ1cnN0cyBhbGxvd2VkCi0JICogdXAgdG8gYnVmc2l6ZSBjaGFyYWN0ZXJzLgotCSAqLwotCWJ1ZmNvdW50ID0gZGdhcF9tYXhjcHNfcm9vbSh0dHksIGJ1ZmNvdW50KTsKLQotCS8qCi0JICogVGFrZSBtaW5pbXVtIG9mIHdoYXQgdGhlIHVzZXIgd2FudHMgdG8gc2VuZCwgYW5kIHRoZQotCSAqIHNwYWNlIGF2YWlsYWJsZSBpbiB0aGUgRkVQIGJ1ZmZlci4KLQkgKi8KLQljb3VudCA9IG1pbihjb3VudCwgYnVmY291bnQpOwotCi0JLyoKLQkgKiBCYWlsIGlmIG5vIHNwYWNlIGxlZnQuCi0JICovCi0JaWYgKGNvdW50IDw9IDApIHsKLQkJZGdhcF9zZXRfZmlybXdhcmVfZXZlbnQodW4sIFVOX0xPVyB8IFVOX0VNUFRZKTsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4oMCk7Ci0JfQotCi0JLyoKLQkgKiBPdXRwdXQgdGhlIHByaW50ZXIgT04gc3RyaW5nLCBpZiB3ZSBhcmUgaW4gdGVybWluYWwgbW9kZSwgYnV0Ci0JICogbmVlZCB0byBiZSBpbiBwcmludGVyIG1vZGUuCi0JICovCi0JaWYgKCh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSAmJiAhKGNoLT5jaF9mbGFncyAmIENIX1BST04pKSB7Ci0JCWRnYXBfd21vdmUoY2gsIGNoLT5jaF9kaWdpLmRpZ2lfb25zdHIsCi0JCSAgICAoaW50KSBjaC0+Y2hfZGlnaS5kaWdpX29ubGVuKTsKLQkJaGVhZCA9IHJlYWR3KCYoYnMtPnR4X2hlYWQpKSAmIHRtYXNrOwotCQljaC0+Y2hfZmxhZ3MgfD0gQ0hfUFJPTjsKLQl9Ci0KLQkvKgotCSAqIE9uIHRoZSBvdGhlciBoYW5kLCBvdXRwdXQgdGhlIHByaW50ZXIgT0ZGIHN0cmluZywgaWYgd2UgYXJlCi0JICogY3VycmVudGx5IGluIHByaW50ZXIgbW9kZSwgYnV0IG5lZWQgdG8gb3V0cHV0IHRvIHRoZSB0ZXJtaW5hbC4KLQkgKi8KLQlpZiAoKHVuLT51bl90eXBlICE9IERHQVBfUFJJTlQpICYmIChjaC0+Y2hfZmxhZ3MgJiBDSF9QUk9OKSkgewotCQlkZ2FwX3dtb3ZlKGNoLCBjaC0+Y2hfZGlnaS5kaWdpX29mZnN0ciwKLQkJCShpbnQpIGNoLT5jaF9kaWdpLmRpZ2lfb2ZmbGVuKTsKLQkJaGVhZCA9IHJlYWR3KCYoYnMtPnR4X2hlYWQpKSAmIHRtYXNrOwotCQljaC0+Y2hfZmxhZ3MgJj0gfkNIX1BST047Ci0JfQotCi0JLyoKLQkgKiBJZiB0aGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gY29weSwgb3IgSSBjYW4ndCBoYW5kbGUgYW55IG1vcmUgZGF0YSwgbGVhdmUuCi0JICovCi0JaWYgKGNvdW50IDw9IDApIHsKLQkJZGdhcF9zZXRfZmlybXdhcmVfZXZlbnQodW4sIFVOX0xPVyB8IFVOX0VNUFRZKTsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4oMCk7Ci0JfQotCi0JaWYgKGZyb21fdXNlcikgewotCi0JCWNvdW50ID0gbWluKGNvdW50LCBXUklURUJVRkxFTik7Ci0KLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JCS8qCi0JCSAqIElmIGRhdGEgaXMgY29taW5nIGZyb20gdXNlciBzcGFjZSwgY29weSBpdCBpbnRvIGEgdGVtcG9yYXJ5Ci0JCSAqIGJ1ZmZlciBzbyB3ZSBkb24ndCBnZXQgc3dhcHBlZCBvdXQgd2hpbGUgZG9pbmcgdGhlIGNvcHkgdG8KLQkJICogdGhlIGJvYXJkLgotCQkgKi8KLQkJLyogd2UncmUgYWxsb3dlZCB0byBibG9jayBpZiBpdCdzIGZyb21fdXNlciAqLwotCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkZ2FwX1RtcFdyaXRlU2VtKSkgewotCQkJcmV0dXJuICgtRUlOVFIpOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGRnYXBfVG1wV3JpdGVCdWYsIChjb25zdCB1Y2hhciBfX3VzZXIgKikgYnVmLCBjb3VudCkpIHsKLQkJCXVwKCZkZ2FwX1RtcFdyaXRlU2VtKTsKLQkJCXByaW50aygiV3JpdGU6IENvcHkgZnJvbSB1c2VyIGZhaWxlZCFcbiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JCWJ1ZiA9IGRnYXBfVG1wV3JpdGVCdWY7Ci0JfQotCi0JbiA9IGNvdW50OwotCi0JLyoKLQkgKiBJZiB0aGUgd3JpdGUgd3JhcHMgb3ZlciB0aGUgdG9wIG9mIHRoZSBjaXJjdWxhciBidWZmZXIsCi0JICogbW92ZSB0aGUgcG9ydGlvbiB1cCB0byB0aGUgd3JhcCBwb2ludCwgYW5kIHJlc2V0IHRoZQotCSAqIHBvaW50ZXJzIHRvIHRoZSBib3R0b20uCi0JICovCi0JcmVtYWluID0gY2gtPmNoX3RzdGFydCArIGNoLT5jaF90c2l6ZSAtIGhlYWQ7Ci0KLQlpZiAobiA+PSByZW1haW4pIHsKLQkJbiAtPSByZW1haW47Ci0JCXZhZGRyID0gY2gtPmNoX3RhZGRyICsgaGVhZDsKLQotCQltZW1jcHlfdG9pbyh2YWRkciwgKHVjaGFyICopIGJ1ZiwgcmVtYWluKTsKLQkJZGdhcF9zbmlmZl9ub3dhaXRfbm9sb2NrKGNoLCAiVVNFUiBXUklURSIsICh1Y2hhciAqKSBidWYsIHJlbWFpbik7Ci0KLQkJaGVhZCA9IGNoLT5jaF90c3RhcnQ7Ci0JCWJ1ZiArPSByZW1haW47Ci0JfQotCi0JaWYgKG4gPiAwKSB7Ci0KLQkJLyoKLQkJICogTW92ZSByZXN0IG9mIGRhdGEuCi0JCSAqLwotCQl2YWRkciA9IGNoLT5jaF90YWRkciArIGhlYWQ7Ci0JCXJlbWFpbiA9IG47Ci0KLQkJbWVtY3B5X3RvaW8odmFkZHIsICh1Y2hhciAqKSBidWYsIHJlbWFpbik7Ci0JCWRnYXBfc25pZmZfbm93YWl0X25vbG9jayhjaCwgIlVTRVIgV1JJVEUiLCAodWNoYXIgKikgYnVmLCByZW1haW4pOwotCi0JCWhlYWQgKz0gcmVtYWluOwotCi0JfQotCi0JaWYgKGNvdW50KSB7Ci0JCWNoLT5jaF90eGNvdW50ICs9IGNvdW50OwotCQloZWFkICY9IHRtYXNrOwotCQl3cml0ZXcoaGVhZCwgJihicy0+dHhfaGVhZCkpOwotCX0KLQotCi0JZGdhcF9zZXRfZmlybXdhcmVfZXZlbnQodW4sIFVOX0xPVyB8IFVOX0VNUFRZKTsKLQotCS8qCi0JICogSWYgdGhpcyBpcyB0aGUgcHJpbnQgZGV2aWNlLCBhbmQgdGhlCi0JICogcHJpbnRlciBpcyBzdGlsbCBvbiwgd2UgbmVlZCB0byB0dXJuIGl0Ci0JICogb2ZmIGJlZm9yZSBnb2luZyBpZGxlLiAgSWYgdGhlIGJ1ZmZlciBpcwotCSAqIG5vbi1lbXB0eSwgd2FpdCB1bnRpbCBpdCBnb2VzIGVtcHR5LgotCSAqIE90aGVyd2lzZSB0dXJuIGl0IG9mZiByaWdodCBub3cuCi0JICovCi0JaWYgKCh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSAmJiAoY2gtPmNoX2ZsYWdzICYgQ0hfUFJPTikpIHsKLQkJdGFpbCA9IHJlYWR3KCYoYnMtPnR4X3RhaWwpKSAmIHRtYXNrOwotCi0JCWlmICh0YWlsICE9IGhlYWQpIHsKLQkJCXVuLT51bl9mbGFncyB8PSBVTl9FTVBUWTsKLQkJCXdyaXRlYigxLCAmKGJzLT5pZW1wdHkpKTsKLQkJfQotCQllbHNlIHsKLQkJCWRnYXBfd21vdmUoY2gsIGNoLT5jaF9kaWdpLmRpZ2lfb2Zmc3RyLAotCQkJCShpbnQpIGNoLT5jaF9kaWdpLmRpZ2lfb2ZmbGVuKTsKLQkJCWhlYWQgPSByZWFkdygmKGJzLT50eF9oZWFkKSkgJiB0bWFzazsKLQkJCWNoLT5jaF9mbGFncyAmPSB+Q0hfUFJPTjsKLQkJfQotCX0KLQotCS8qIFVwZGF0ZSBwcmludGVyIGJ1ZmZlciBlbXB0eSB0aW1lLiAqLwotCWlmICgodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkgJiYgKGNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzID4gMCkKLQkgICAgJiYgKGNoLT5jaF9kaWdpLmRpZ2lfYnVmc2l6ZSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgY2gtPmNoX2Nwc3RpbWUgKz0gKEhaICogY291bnQpIC8gY2gtPmNoX2RpZ2kuZGlnaV9tYXhjcHM7Ci0JfQotCi0JaWYgKGZyb21fdXNlcikgewotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0JCXVwKCZkZ2FwX1RtcFdyaXRlU2VtKTsKLQl9Ci0JZWxzZSB7Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQl9Ci0KLQlEUFJfV1JJVEUoKCJXcml0ZSBmaW5pc2hlZCAtIFdyaXRlICVkIGJ5dGVzIG9mICVkLlxuIiwgY291bnQsIG9yaWdfY291bnQpKTsKLQotCXJldHVybiAoY291bnQpOwotfQotCi0KLQotLyoKLSAqIFJldHVybiBtb2RlbSBzaWduYWxzIHRvIGxkLgotICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzOSkKLXN0YXRpYyBpbnQgZGdhcF90dHlfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLSNlbHNlCi1zdGF0aWMgaW50IGRnYXBfdHR5X3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQotI2VuZGlmCi17Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCWludCByZXN1bHQgPSAtRUlPOwotCXVjaGFyIG1zdGF0ID0gMDsKLQl1bG9uZyBsb2NrX2ZsYWdzOwotCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gcmVzdWx0OwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gcmVzdWx0OwotCi0JRFBSX0lPQ1RMKCgiZGdhcF90dHlfdGlvY21nZXQgc3RhcnRcbiIpKTsKLQotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQltc3RhdCA9IHJlYWRiKCYoY2gtPmNoX2JzLT5tX3N0YXQpKTsKLSAgICAgICAgLyogQXBwZW5kIGFueSBvdXRib3VuZCBzaWduYWxzIHRoYXQgbWlnaHQgYmUgcGVuZGluZy4uLiAqLwotICAgICAgICBtc3RhdCB8PSBjaC0+Y2hfbW9zdGF0OwotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JcmVzdWx0ID0gMDsKLQotCWlmIChtc3RhdCAmIERfRFRSKGNoKSkKLQkJcmVzdWx0IHw9IFRJT0NNX0RUUjsKLQlpZiAobXN0YXQgJiBEX1JUUyhjaCkpCi0JCXJlc3VsdCB8PSBUSU9DTV9SVFM7Ci0JaWYgKG1zdGF0ICYgRF9DVFMoY2gpKQotCQlyZXN1bHQgfD0gVElPQ01fQ1RTOwotCWlmIChtc3RhdCAmIERfRFNSKGNoKSkKLQkJcmVzdWx0IHw9IFRJT0NNX0RTUjsKLQlpZiAobXN0YXQgJiBEX1JJKGNoKSkKLQkJcmVzdWx0IHw9IFRJT0NNX1JJOwotCWlmIChtc3RhdCAmIERfQ0QoY2gpKQotCQlyZXN1bHQgfD0gVElPQ01fQ0Q7Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV90aW9jbWdldCBmaW5pc2hcbiIpKTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X3Rpb2Ntc2V0KCkKLSAqCi0gKiBTZXQgbW9kZW0gc2lnbmFscywgY2FsbGVkIGJ5IGxkLgotICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzOSkKLXN0YXRpYyBpbnQgZGdhcF90dHlfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCi0jZWxzZQotc3RhdGljIGludCBkZ2FwX3R0eV90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQotI2VuZGlmCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQlpbnQgcmV0ID0gLUVJTzsKLQl1bG9uZyBsb2NrX2ZsYWdzOwotCXVsb25nIGxvY2tfZmxhZ3MyOwotCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCi0JCXJldHVybiByZXQ7Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X3Rpb2Ntc2V0IHN0YXJ0XG4iKSk7Ci0KLQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JaWYgKHNldCAmIFRJT0NNX1JUUykgewotCQljaC0+Y2hfbWZvcmNlIHw9IERfUlRTKGNoKTsKLQkJY2gtPmNoX212YWwgICB8PSBEX1JUUyhjaCk7Ci0gICAgICAgIH0KLQotCWlmIChzZXQgJiBUSU9DTV9EVFIpIHsKLQkJY2gtPmNoX21mb3JjZSB8PSBEX0RUUihjaCk7Ci0JCWNoLT5jaF9tdmFsICAgfD0gRF9EVFIoY2gpOwotICAgICAgICB9Ci0KLQlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpIHsKLQkJY2gtPmNoX21mb3JjZSB8PSBEX1JUUyhjaCk7Ci0JCWNoLT5jaF9tdmFsICAgJj0gfihEX1JUUyhjaCkpOwotICAgICAgICB9Ci0KLQlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpIHsKLQkJY2gtPmNoX21mb3JjZSB8PSBEX0RUUihjaCk7Ci0JCWNoLT5jaF9tdmFsICAgJj0gfihEX0RUUihjaCkpOwotICAgICAgICB9Ci0KLQlkZ2FwX3BhcmFtKHR0eSk7Ci0KLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X3Rpb2Ntc2V0IGZpbmlzaFxuIikpOwotCi0JcmV0dXJuICgwKTsKLX0KLQotCi0KLS8qCi0gKiBkZ2FwX3R0eV9zZW5kX2JyZWFrKCkKLSAqCi0gKiBTZW5kIGEgQnJlYWssIGNhbGxlZCBieSBsZC4KLSAqLwotc3RhdGljIGludCBkZ2FwX3R0eV9zZW5kX2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBtc2VjKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0JaW50IHJldCA9IC1FSU87Ci0JdWxvbmcgbG9ja19mbGFnczsKLQl1bG9uZyBsb2NrX2ZsYWdzMjsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiByZXQ7Ci0KLQlzd2l0Y2ggKG1zZWMpIHsKLQljYXNlIC0xOgotCQltc2VjID0gMHhGRkZGOwotCQlicmVhazsKLQljYXNlIDA6Ci0JCW1zZWMgPSAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQltc2VjIC89IDEwOwotCQlicmVhazsKLQl9Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9zZW5kX2JyZWFrIHN0YXJ0IDEuICAlbHhcbiIsIGppZmZpZXMpKTsKLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0jaWYgMAotCWRnYXBfY21kdyhjaCwgU0JSRUFLLCAodTE2KSBTQlJFQUtfVElNRSwgMCk7Ci0jZW5kaWYKLQlkZ2FwX2NtZHcoY2gsIFNCUkVBSywgKHUxNikgbXNlYywgMCk7Ci0KLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X3NlbmRfYnJlYWsgZmluaXNoXG4iKSk7Ci0KLQlyZXR1cm4gKDApOwotfQotCi0KLQotCi0vKgotICogZGdhcF90dHlfd2FpdF91bnRpbF9zZW50KCkKLSAqCi0gKiB3YWl0IHVudGlsIGRhdGEgaGFzIGJlZW4gdHJhbnNtaXR0ZWQsIGNhbGxlZCBieSBsZC4KLSAqLwotc3RhdGljIHZvaWQgZGdhcF90dHlfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQotewotCWludCByYzsKLQlyYyA9IGRnYXBfd2FpdF9mb3JfZHJhaW4odHR5KTsKLQlpZiAocmMpIHsKLQkJRFBSX0lPQ1RMKCgiZGdhcF90dHlfaW9jdGwgLSBiYWQgcmV0dXJuOiAlZCAiLCByYykpOwotCQlyZXR1cm47Ci0JfQotCXJldHVybjsKLX0KLQotCi0KLS8qCi0gKiBkZ2FwX3NlbmRfeGNoYXIoKQotICoKLSAqIHNlbmQgYSBoaWdoIHByaW9yaXR5IGNoYXJhY3RlciwgY2FsbGVkIGJ5IGxkLgotICovCi1zdGF0aWMgdm9pZCBkZ2FwX3R0eV9zZW5kX3hjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgYykKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCXVsb25nIGxvY2tfZmxhZ3M7Ci0JdWxvbmcgbG9ja19mbGFnczI7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuOwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9zZW5kX3hjaGFyIHN0YXJ0IDEuICAlbHhcbiIsIGppZmZpZXMpKTsKLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQkvKgotCSAqIFRoaXMgaXMgdGVjaG5pY2FsbHkgd2hhdCB3ZSBzaG91bGQgZG8uCi0JICogSG93ZXZlciwgdGhlIE5JU1QgdGVzdHMgc3BlY2lmaWNhbGx5IHdhbnQKLQkgKiB0byBzZWUgZWFjaCBYT04gb3IgWE9GRiBjaGFyYWN0ZXIgdGhhdCBpdAotCSAqIHNlbmRzLCBzbyBsZXRzIGp1c3Qgc2VuZCBlYWNoIGNoYXJhY3RlcgotCSAqIGJ5IGhhbmQuLi4KLQkgKi8KLSNpZiAwCi0JaWYgKGMgPT0gU1RPUF9DSEFSKHR0eSkpIHsKLQkJZGdhcF9jbWR3KGNoLCBSUEFVU0UsIDAsIDApOwotCX0KLQllbHNlIGlmIChjID09IFNUQVJUX0NIQVIodHR5KSkgewotCQlkZ2FwX2NtZHcoY2gsIFJSRVNVTUUsIDAsIDApOwotCX0KLQllbHNlIHsKLQkJZGdhcF93bW92ZShjaCwgJmMsIDEpOwotCX0KLSNlbHNlCi0JZGdhcF93bW92ZShjaCwgJmMsIDEpOwotI2VuZGlmCi0KLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X3NlbmRfeGNoYXIgZmluaXNoXG4iKSk7Ci0KLQlyZXR1cm47Ci19Ci0KLQotCi0KLS8qCi0gKiBSZXR1cm4gbW9kZW0gc2lnbmFscyB0byBsZC4KLSAqLwotc3RhdGljIGludCBkZ2FwX2dldF9tb2RlbV9pbmZvKHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQl1Y2hhciBtc3RhdCA9IDA7Ci0JdWxvbmcgbG9ja19mbGFnczsKLQlpbnQgcmMgPSAwOwotCi0JRFBSX0lPQ1RMKCgiZGdhcF9nZXRfbW9kZW1faW5mbyBzdGFydFxuIikpOwotCi0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4oLUVOWElPKTsKLQotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQltc3RhdCA9IHJlYWRiKCYoY2gtPmNoX2JzLT5tX3N0YXQpKTsKLQkvKiBBcHBlbmQgYW55IG91dGJvdW5kIHNpZ25hbHMgdGhhdCBtaWdodCBiZSBwZW5kaW5nLi4uICovCi0JbXN0YXQgfD0gY2gtPmNoX21vc3RhdDsKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCXJlc3VsdCA9IDA7Ci0KLQlpZiAobXN0YXQgJiBEX0RUUihjaCkpCi0JCXJlc3VsdCB8PSBUSU9DTV9EVFI7Ci0JaWYgKG1zdGF0ICYgRF9SVFMoY2gpKQotCQlyZXN1bHQgfD0gVElPQ01fUlRTOwotCWlmIChtc3RhdCAmIERfQ1RTKGNoKSkKLQkJcmVzdWx0IHw9IFRJT0NNX0NUUzsKLQlpZiAobXN0YXQgJiBEX0RTUihjaCkpCi0JCXJlc3VsdCB8PSBUSU9DTV9EU1I7Ci0JaWYgKG1zdGF0ICYgRF9SSShjaCkpCi0JCXJlc3VsdCB8PSBUSU9DTV9SSTsKLQlpZiAobXN0YXQgJiBEX0NEKGNoKSkKLQkJcmVzdWx0IHw9IFRJT0NNX0NEOwotCi0JcmMgPSBwdXRfdXNlcihyZXN1bHQsIHZhbHVlKTsKLQotCURQUl9JT0NUTCgoImRnYXBfZ2V0X21vZGVtX2luZm8gZmluaXNoXG4iKSk7Ci0JcmV0dXJuKHJjKTsKLX0KLQotCi0vKgotICogZGdhcF9zZXRfbW9kZW1faW5mbygpCi0gKgotICogU2V0IG1vZGVtIHNpZ25hbHMsIGNhbGxlZCBieSBsZC4KLSAqLwotc3RhdGljIGludCBkZ2FwX3NldF9tb2RlbV9pbmZvKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBjb21tYW5kLCB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCWludCByZXQgPSAtRU5YSU87Ci0JdW5zaWduZWQgaW50IGFyZyA9IDA7Ci0JdWxvbmcgbG9ja19mbGFnczsKLQl1bG9uZyBsb2NrX2ZsYWdzMjsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiByZXQ7Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3NldF9tb2RlbV9pbmZvKCkgc3RhcnRcbiIpKTsKLQotCXJldCA9IGdldF91c2VyKGFyZywgdmFsdWUpOwotCWlmIChyZXQpIHsKLQkJRFBSX0lPQ1RMKCgiZGdhcF9zZXRfbW9kZW1faW5mbyAlZCByZXQ6ICV4LiBmaW5pc2hlZC5cbiIsIF9fTElORV9fLCByZXQpKTsKLQkJcmV0dXJuKHJldCk7Ci0JfQotCi0JRFBSX0lPQ1RMKCgiZGdhcF9zZXRfbW9kZW1faW5mbzogY29tbWFuZDogJXggYXJnOiAleFxuIiwgY29tbWFuZCwgYXJnKSk7Ci0KLQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQljYXNlIFRJT0NNQklTOgotCQlpZiAoYXJnICYgVElPQ01fUlRTKSB7Ci0JCQljaC0+Y2hfbWZvcmNlIHw9IERfUlRTKGNoKTsKLQkJCWNoLT5jaF9tdmFsICAgfD0gRF9SVFMoY2gpOwotICAgICAgICAJfQotCi0JCWlmIChhcmcgJiBUSU9DTV9EVFIpIHsKLQkJCWNoLT5jaF9tZm9yY2UgfD0gRF9EVFIoY2gpOwotCQkJY2gtPmNoX212YWwgICB8PSBEX0RUUihjaCk7Ci0gICAgICAgIAl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFRJT0NNQklDOgotCQlpZiAoYXJnICYgVElPQ01fUlRTKSB7Ci0JCQljaC0+Y2hfbWZvcmNlIHw9IERfUlRTKGNoKTsKLQkJCWNoLT5jaF9tdmFsICAgJj0gfihEX1JUUyhjaCkpOwotICAgICAgICAJfQotCi0JCWlmIChhcmcgJiBUSU9DTV9EVFIpIHsKLQkJCWNoLT5jaF9tZm9yY2UgfD0gRF9EVFIoY2gpOwotCQkJY2gtPmNoX212YWwgICAmPSB+KERfRFRSKGNoKSk7Ci0gICAgICAgIAl9Ci0KLQkJYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUSU9DTVNFVDoKLQkJY2gtPmNoX21mb3JjZSA9IERfRFRSKGNoKXxEX1JUUyhjaCk7Ci0KLQkJaWYgKGFyZyAmIFRJT0NNX1JUUykgewotCQkJY2gtPmNoX212YWwgfD0gRF9SVFMoY2gpOwotICAgICAgICAJfQotCQllbHNlIHsKLQkJCWNoLT5jaF9tdmFsICY9IH4oRF9SVFMoY2gpKTsKLQkJfQotCi0JCWlmIChhcmcgJiBUSU9DTV9EVFIpIHsKLQkJCWNoLT5jaF9tdmFsIHw9IChEX0RUUihjaCkpOwotICAgICAgICAJfQotCQllbHNlIHsKLQkJCWNoLT5jaF9tdmFsICY9IH4oRF9EVFIoY2gpKTsKLQkJfQotCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuKC1FSU5WQUwpOwotCX0KLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQlkZ2FwX3BhcmFtKHR0eSk7Ci0KLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCURQUl9JT0NUTCgoImRnYXBfc2V0X21vZGVtX2luZm8gZmluaXNoXG4iKSk7Ci0KLQlyZXR1cm4gKDApOwotfQotCi0KLS8qCi0gKiBkZ2FwX3R0eV9kaWdpZ2V0YSgpCi0gKgotICogSW9jdGwgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiBmb3IgZGl0dHkuCi0gKgotICoKLSAqCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF90dHlfZGlnaWdldGEoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGRpZ2lfdCBfX3VzZXIgKnJldGluZm8pCi17Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCXN0cnVjdCBkaWdpX3QgdG1wOwotCXVsb25nIGxvY2tfZmxhZ3M7Ci0KLQlpZiAoIXJldGluZm8pCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOwotCi0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQltZW1jcHkoJnRtcCwgJmNoLT5jaF9kaWdpLCBzaXplb2YodG1wKSk7Ci0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X2RpZ2lzZXRhKCkKLSAqCi0gKiBJb2N0bCB0byBzZXQgdGhlIGluZm9ybWF0aW9uIGZvciBkaXR0eS4KLSAqCi0gKgotICoKLSAqLwotc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpc2V0YShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZGlnaV90IF9fdXNlciAqbmV3X2luZm8pCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQlzdHJ1Y3QgZGlnaV90IG5ld19kaWdpOwotCXVsb25nICAgbG9ja19mbGFncyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzMjsKLQotCURQUl9JT0NUTCgoIkRJR0lfU0VUQSBzdGFydFxuIikpOwotCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJm5ld19kaWdpLCBuZXdfaW5mbywgc2l6ZW9mKHN0cnVjdCBkaWdpX3QpKSkgewotCQlEUFJfSU9DVEwoKCJESUdJX1NFVEEgZmFpbGVkIGNvcHlfZnJvbV91c2VyXG4iKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKC1FRkFVTFQpOwotCX0KLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQltZW1jcHkoJmNoLT5jaF9kaWdpLCAmbmV3X2RpZ2ksIHNpemVvZihzdHJ1Y3QgZGlnaV90KSk7Ci0KLQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9tYXhjcHMgPCAxKQotCQljaC0+Y2hfZGlnaS5kaWdpX21heGNwcyA9IDE7Ci0KLQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9tYXhjcHMgPiAxMDAwMCkKLQkJY2gtPmNoX2RpZ2kuZGlnaV9tYXhjcHMgPSAxMDAwMDsKLQotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2J1ZnNpemUgPCAxMCkKLQkJY2gtPmNoX2RpZ2kuZGlnaV9idWZzaXplID0gMTA7Ci0KLQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9tYXhjaGFyIDwgMSkKLQkJY2gtPmNoX2RpZ2kuZGlnaV9tYXhjaGFyID0gMTsKLQotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX21heGNoYXIgPiBjaC0+Y2hfZGlnaS5kaWdpX2J1ZnNpemUpCi0JCWNoLT5jaF9kaWdpLmRpZ2lfbWF4Y2hhciA9IGNoLT5jaF9kaWdpLmRpZ2lfYnVmc2l6ZTsKLQotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX29ubGVuID4gRElHSV9QTEVOKQotCQljaC0+Y2hfZGlnaS5kaWdpX29ubGVuID0gRElHSV9QTEVOOwotCi0JaWYgKGNoLT5jaF9kaWdpLmRpZ2lfb2ZmbGVuID4gRElHSV9QTEVOKQotCQljaC0+Y2hfZGlnaS5kaWdpX29mZmxlbiA9IERJR0lfUExFTjsKLQotCWRnYXBfcGFyYW0odHR5KTsKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JRFBSX0lPQ1RMKCgiRElHSV9TRVRBIGZpbmlzaFxuIikpOwotCi0JcmV0dXJuKDApOwotfQotCi0KLS8qCi0gKiBkZ2FwX3R0eV9kaWdpZ2V0ZWRlbGF5KCkKLSAqCi0gKiBJb2N0bCB0byBnZXQgdGhlIGN1cnJlbnQgZWRlbGF5IHNldHRpbmcuCi0gKgotICoKLSAqCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF90dHlfZGlnaWdldGVkZWxheShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpyZXRpbmZvKQotewotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQlpbnQgdG1wOwotCXVsb25nIGxvY2tfZmxhZ3M7Ci0KLQlpZiAoIXJldGluZm8pCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOwotCi0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQl0bXAgPSByZWFkdygmKGNoLT5jaF9icy0+ZWRlbGF5KSk7Ci0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X2RpZ2lzZXRlZGVsYXkoKQotICoKLSAqIElvY3RsIHRvIHNldCB0aGUgRURFTEFZIHNldHRpbmcKLSAqCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF90dHlfZGlnaXNldGVkZWxheShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpuZXdfaW5mbykKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCWludCBuZXdfZGlnaTsKLQl1bG9uZyBsb2NrX2ZsYWdzOwotCXVsb25nIGxvY2tfZmxhZ3MyOwotCi0JRFBSX0lPQ1RMKCgiRElHSV9TRVRBIHN0YXJ0XG4iKSk7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0gICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmbmV3X2RpZ2ksIG5ld19pbmZvLCBzaXplb2YoaW50KSkpIHsKLQkJRFBSX0lPQ1RMKCgiRElHSV9TRVRFREVMQVkgZmFpbGVkIGNvcHlfZnJvbV91c2VyXG4iKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKC1FRkFVTFQpOwotCX0KLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQl3cml0ZXcoKHUxNikgbmV3X2RpZ2ksICYoY2gtPmNoX2JzLT5lZGVsYXkpKTsKLQotCWRnYXBfcGFyYW0odHR5KTsKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JRFBSX0lPQ1RMKCgiRElHSV9TRVRBIGZpbmlzaFxuIikpOwotCi0JcmV0dXJuKDApOwotfQotCi0KLS8qCi0gKiBkZ2FwX3R0eV9kaWdpZ2V0Y3VzdG9tYmF1ZCgpCi0gKgotICogSW9jdGwgdG8gZ2V0IHRoZSBjdXJyZW50IGN1c3RvbSBiYXVkIHJhdGUgc2V0dGluZy4KLSAqLwotc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpZ2V0Y3VzdG9tYmF1ZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpyZXRpbmZvKQotewotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQlpbnQgdG1wOwotCXVsb25nIGxvY2tfZmxhZ3M7Ci0KLQlpZiAoIXJldGluZm8pCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOwotCi0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQl0bXAgPSBkZ2FwX2dldF9jdXN0b21fYmF1ZChjaCk7Ci0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JRFBSX0lPQ1RMKCgiRElHSV9HRVRDVVNUT01CQVVELiBSZXR1cm5pbmcgJWRcbiIsIHRtcCkpOwotCi0JaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X2RpZ2lzZXRjdXN0b21iYXVkKCkKLSAqCi0gKiBJb2N0bCB0byBzZXQgdGhlIGN1c3RvbSBiYXVkIHJhdGUgc2V0dGluZwotICovCi1zdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lzZXRjdXN0b21iYXVkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBfX3VzZXIgKm5ld19pbmZvKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0JdWludCBuZXdfcmF0ZTsKLQl1bG9uZyBsb2NrX2ZsYWdzOwotCXVsb25nIGxvY2tfZmxhZ3MyOwotCi0JRFBSX0lPQ1RMKCgiRElHSV9TRVRDVVNUT01CQVVEIHN0YXJ0XG4iKSk7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0KLQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19yYXRlLCBuZXdfaW5mbywgc2l6ZW9mKHVuc2lnbmVkIGludCkpKSB7Ci0JCURQUl9JT0NUTCgoIkRJR0lfU0VUQ1VTVE9NQkFVRCBmYWlsZWQgY29weV9mcm9tX3VzZXJcbiIpKTsKLQkJcmV0dXJuKC1FRkFVTFQpOwotCX0KLQotCWlmIChiZC0+YmRfZmxhZ3MgJiBCRF9GRVA1UExVUykgewotCi0JCURQUl9JT0NUTCgoIkRJR0lfU0VUQ1VTVE9NQkFVRC4gU2V0dGluZyAlZFxuIiwgbmV3X3JhdGUpKTsKLQotCQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCQljaC0+Y2hfY3VzdG9tX3NwZWVkID0gbmV3X3JhdGU7Ci0KLQkJZGdhcF9wYXJhbSh0dHkpOwotCi0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQl9Ci0KLQlEUFJfSU9DVEwoKCJESUdJX1NFVENVU1RPTUJBVUQgZmluaXNoXG4iKSk7Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfc2V0X3Rlcm1pb3MoKQotICovCi1zdGF0aWMgdm9pZCBkZ2FwX3R0eV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0JdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOwotCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczI7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuOwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JY2gtPmNoX2NfY2ZsYWcgICA9IHR0eS0+dGVybWlvcy5jX2NmbGFnOwotCWNoLT5jaF9jX2lmbGFnICAgPSB0dHktPnRlcm1pb3MuY19pZmxhZzsKLQljaC0+Y2hfY19vZmxhZyAgID0gdHR5LT50ZXJtaW9zLmNfb2ZsYWc7Ci0JY2gtPmNoX2NfbGZsYWcgICA9IHR0eS0+dGVybWlvcy5jX2xmbGFnOwotCWNoLT5jaF9zdGFydGMgICAgPSB0dHktPnRlcm1pb3MuY19jY1tWU1RBUlRdOwotCWNoLT5jaF9zdG9wYyAgICAgPSB0dHktPnRlcm1pb3MuY19jY1tWU1RPUF07Ci0KLQlkZ2FwX2NhcnJpZXIoY2gpOwotCWRnYXBfcGFyYW0odHR5KTsKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotfQotCi0KLXN0YXRpYyB2b2lkIGRnYXBfdHR5X3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQl1bG9uZyAgIGxvY2tfZmxhZ3M7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzMjsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm47Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm47Ci0KLSAgICAgICAgY2ggPSB1bi0+dW5fY2g7Ci0gICAgICAgIGlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV90aHJvdHRsZSBzdGFydFxuIikpOwotCi0JREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCWNoLT5jaF9mbGFncyB8PSAoQ0hfUlhCTE9DSyk7Ci0jaWYgMQotCWRnYXBfY21kdyhjaCwgUlBBVVNFLCAwLCAwKTsKLSNlbmRpZgotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV90aHJvdHRsZSBmaW5pc2hcbiIpKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBkZ2FwX3R0eV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQl1bG9uZyAgIGxvY2tfZmxhZ3M7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzMjsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm47Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm47Ci0KLSAgICAgICAgY2ggPSB1bi0+dW5fY2g7Ci0gICAgICAgIGlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV91bnRocm90dGxlIHN0YXJ0XG4iKSk7Ci0KLQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JY2gtPmNoX2ZsYWdzICY9IH4oQ0hfUlhCTE9DSyk7Ci0KLSNpZiAxCi0JZGdhcF9jbWR3KGNoLCBSUkVTVU1FLCAwLCAwKTsKLSNlbmRpZgotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV91bnRocm90dGxlIGZpbmlzaFxuIikpOwotfQotCi0KLXN0YXRpYyB2b2lkIGRnYXBfdHR5X3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQl1bG9uZyAgIGxvY2tfZmxhZ3M7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzMjsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm47Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm47Ci0KLSAgICAgICAgY2ggPSB1bi0+dW5fY2g7Ci0gICAgICAgIGlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9zdGFydCBzdGFydFxuIikpOwotCi0JREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCWRnYXBfY21kdyhjaCwgUkVTVU1FVFgsIDAsIDApOwotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9zdGFydCBmaW5pc2hcbiIpKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBkZ2FwX3R0eV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQl1bG9uZyAgIGxvY2tfZmxhZ3M7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzMjsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm47Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm47Ci0KLSAgICAgICAgY2ggPSB1bi0+dW5fY2g7Ci0gICAgICAgIGlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9zdG9wIHN0YXJ0XG4iKSk7Ci0KLQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JZGdhcF9jbWR3KGNoLCBQQVVTRVRYLCAwLCAwKTsKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JRFBSX0lPQ1RMKCgiZGdhcF90dHlfc3RvcCBmaW5pc2hcbiIpKTsKLX0KLQotCi0vKgotICogZGdhcF90dHlfZmx1c2hfY2hhcnMoKQotICoKLSAqIEZsdXNoIHRoZSBjb29rIGJ1ZmZlcgotICoKLSAqIE5vdGUgdG8gc2VsZiwgYW5kIGFueSBvdGhlciBwb29yIHNvdWxzIHdobyB2ZW50dXJlIGhlcmU6Ci0gKgotICogZmx1c2ggaW4gdGhpcyBjYXNlIERPRVMgTk9UIG1lYW4gZGlzcG9zZSBvZiB0aGUgZGF0YS4KLSAqIGluc3RlYWQsIGl0IG1lYW5zICJzdG9wIGJ1ZmZlcmluZyBhbmQgc2VuZCBpdCBpZiB5b3UKLSAqIGhhdmVuJ3QgYWxyZWFkeS4iICBKdXN0IGd1ZXNzIGhvdyBJIGZpZ3VyZWQgdGhhdCBvdXQuLi4gICBTUlcgMi1KdW4tOTgKLSAqCi0gKiBJdCBpcyBhbHNvIGFsd2F5cyBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQgLSBKQVIgOC1TZXB0LTk5Ci0gKi8KLXN0YXRpYyB2b2lkIGRnYXBfdHR5X2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQl1bG9uZyAgIGxvY2tfZmxhZ3M7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzMjsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm47Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm47Ci0KLSAgICAgICAgY2ggPSB1bi0+dW5fY2g7Ci0gICAgICAgIGlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9mbHVzaF9jaGFycyBzdGFydFxuIikpOwotCi0JREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCS8qIFRPRE86IERvIHNvbWV0aGluZyBoZXJlICovCi0KLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X2ZsdXNoX2NoYXJzIGZpbmlzaFxuIikpOwotfQotCi0KLQotLyoKLSAqIGRnYXBfdHR5X2ZsdXNoX2J1ZmZlcigpCi0gKgotICogRmx1c2ggVHggYnVmZmVyIChtYWtlIGluID09IG91dCkKLSAqLwotc3RhdGljIHZvaWQgZGdhcF90dHlfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQl1bG9uZyAgIGxvY2tfZmxhZ3M7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzMjsKLQl1MTYJaGVhZCA9IDA7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuOwotCi0gICAgICAgIGNoID0gdW4tPnVuX2NoOwotICAgICAgICBpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuOwotCi0JRFBSX0lPQ1RMKCgiZGdhcF90dHlfZmx1c2hfYnVmZmVyIG9uIHBvcnQ6ICVkIHN0YXJ0XG4iLCBjaC0+Y2hfcG9ydG51bSkpOwotCi0JREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCWNoLT5jaF9mbGFncyAmPSB+Q0hfU1RPUDsKLQloZWFkID0gcmVhZHcoJihjaC0+Y2hfYnMtPnR4X2hlYWQpKTsKLQlkZ2FwX2NtZHcoY2gsIEZMVVNIVFgsICh1MTYpIGhlYWQsIDApOwotCWRnYXBfY21kdyhjaCwgUkVTVU1FVFgsIDAsIDApOwotCWlmIChjaC0+Y2hfdHVuLnVuX2ZsYWdzICYgKFVOX0xPV3xVTl9FTVBUWSkpIHsKLQkJY2gtPmNoX3R1bi51bl9mbGFncyAmPSB+KFVOX0xPV3xVTl9FTVBUWSk7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3R1bi51bl9mbGFnc193YWl0KTsKLQl9Ci0JaWYgKGNoLT5jaF9wdW4udW5fZmxhZ3MgJiAoVU5fTE9XfFVOX0VNUFRZKSkgewotCQljaC0+Y2hfcHVuLnVuX2ZsYWdzICY9IH4oVU5fTE9XfFVOX0VNUFRZKTsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfcHVuLnVuX2ZsYWdzX3dhaXQpOwotCX0KLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ0dHktPndyaXRlX3dhaXQpKQotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7Ci0JdHR5X3dha2V1cCh0dHkpOwotCi0JRFBSX0lPQ1RMKCgiZGdhcF90dHlfZmx1c2hfYnVmZmVyIGZpbmlzaFxuIikpOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhlIElPQ1RMIGZ1bmN0aW9uIGFuZCBhbGwgb2YgaXRzIGhlbHBlcnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBkZ2FwX3R0eV9pb2N0bCgpCi0gKgotICogVGhlIHVzdWFsIGFzc29ydG1lbnQgb2YgaW9jdGwncwotICovCi1zdGF0aWMgaW50IGRnYXBfdHR5X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBjbWQsCi0JCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0JaW50IHJjOwotCXUxNgloZWFkID0gMDsKLQl1bG9uZyAgIGxvY2tfZmxhZ3MgPSAwOwotCXVsb25nICAgbG9ja19mbGFnczIgPSAwOwotCXZvaWQgX191c2VyICp1YXJnID0gKHZvaWQgX191c2VyICopIGFyZzsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm4gKC1FTk9ERVYpOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgtRU5PREVWKTsKLQotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuICgtRU5PREVWKTsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAoLUVOT0RFVik7Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCBzdGFydCBvbiBwb3J0ICVkIC0gY21kICVzICgleCksIGFyZyAlbHhcbiIsCi0JCWNoLT5jaF9wb3J0bnVtLCBkZ2FwX2lvY3RsX25hbWUoY21kKSwgY21kLCBhcmcpKTsKLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQlpZiAodW4tPnVuX29wZW5fY291bnQgPD0gMCkgewotCQlEUFJfQkFTSUMoKCJkZ2FwX3R0eV9pb2N0bCAtIHVuaXQgbm90IG9wZW4uXG4iKSk7Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmV0dXJuKC1FSU8pOwotCX0KLQotCXN3aXRjaCAoY21kKSB7Ci0KLQkvKiBIZXJlIGFyZSBhbGwgdGhlIHN0YW5kYXJkIGlvY3RsJ3MgdGhhdCB3ZSBNVVNUIGltcGxlbWVudCAqLwotCi0JY2FzZSBUQ1NCUks6Ci0JCS8qCi0JCSAqIFRDU0JSSyBpcyBTVklEIHZlcnNpb246IG5vbi16ZXJvIGFyZyAtLT4gbm8gYnJlYWsKLQkJICogdGhpcyBiZWhhdmlvdXIgaXMgZXhwbG9pdGVkIGJ5IHRjZHJhaW4oKS4KLQkJICoKLQkJICogQWNjb3JkaW5nIHRvIFBPU0lYLjEgc3BlYyAoNy4yLjIuMS4yKSBicmVha3Mgc2hvdWxkIGJlCi0JCSAqIGJldHdlZW4gMC4yNSBhbmQgMC41IHNlY29uZHMgc28gd2UnbGwgYXNrIGZvciBzb21ldGhpbmcKLQkJICogaW4gdGhlIG1pZGRsZTogMC4zNzUgc2Vjb25kcy4KLQkJICovCi0JCXJjID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOwotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCWlmIChyYykgewotCQkJcmV0dXJuKHJjKTsKLQkJfQotCi0JCXJjID0gZGdhcF93YWl0X2Zvcl9kcmFpbih0dHkpOwotCi0JCWlmIChyYykgewotCQkJRFBSX0lPQ1RMKCgiZGdhcF90dHlfaW9jdGwgLSBiYWQgcmV0dXJuOiAlZCAiLCByYykpOwotCQkJcmV0dXJuKC1FSU5UUik7Ci0JCX0KLQotCQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCQlpZigoKGNtZCA9PSBUQ1NCUkspICYmICghYXJnKSkgfHwgKGNtZCA9PSBUQ1NCUktQKSkgewotCQkJZGdhcF9jbWR3KGNoLCBTQlJFQUssICh1MTYpIFNCUkVBS19USU1FLCAwKTsKLQkJfQotCi0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCBmaW5pc2ggb24gcG9ydCAlZCAtIGNtZCAlcyAoJXgpLCBhcmcgJWx4XG4iLAotCQkJY2gtPmNoX3BvcnRudW0sIGRnYXBfaW9jdGxfbmFtZShjbWQpLCBjbWQsIGFyZykpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuKDApOwotCi0KLQljYXNlIFRDU0JSS1A6Ci0gCQkvKiBzdXBwb3J0IGZvciBQT1NJWCB0Y3NlbmRicmVhaygpCi0KLQkJICogQWNjb3JkaW5nIHRvIFBPU0lYLjEgc3BlYyAoNy4yLjIuMS4yKSBicmVha3Mgc2hvdWxkIGJlCi0JCSAqIGJldHdlZW4gMC4yNSBhbmQgMC41IHNlY29uZHMgc28gd2UnbGwgYXNrIGZvciBzb21ldGhpbmcKLQkJICogaW4gdGhlIG1pZGRsZTogMC4zNzUgc2Vjb25kcy4KLQkJICovCi0JCXJjID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOwotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCWlmIChyYykgewotCQkJcmV0dXJuKHJjKTsKLQkJfQotCi0JCXJjID0gZGdhcF93YWl0X2Zvcl9kcmFpbih0dHkpOwotCQlpZiAocmMpIHsKLQkJCURQUl9JT0NUTCgoImRnYXBfdHR5X2lvY3RsIC0gYmFkIHJldHVybjogJWQgIiwgcmMpKTsKLQkJCXJldHVybigtRUlOVFIpOwotCQl9Ci0KLQkJREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQkJZGdhcF9jbWR3KGNoLCBTQlJFQUssICh1MTYpIFNCUkVBS19USU1FLCAwKTsKLQotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkJRFBSX0lPQ1RMKCgiZGdhcF90dHlfaW9jdGwgZmluaXNoIG9uIHBvcnQgJWQgLSBjbWQgJXMgKCV4KSwgYXJnICVseFxuIiwKLQkJCWNoLT5jaF9wb3J0bnVtLCBkZ2FwX2lvY3RsX25hbWUoY21kKSwgY21kLCBhcmcpKTsKLQotCQlyZXR1cm4oMCk7Ci0KLSAgICAgICAgY2FzZSBUSU9DU0JSSzoKLQkJLyoKLQkJICogRkVQNSBkb2Vzbid0IHN1cHBvcnQgdHVybmluZyBvbiBhIGJyZWFrIHVuY29uZGl0aW9uYWxseS4KLQkJICogVGhlIEZFUDUgZGV2aWNlIHdpbGwgc3RvcCBzZW5kaW5nIGEgYnJlYWsgYXV0b21hdGljYWxseQotCQkgKiBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWUgdmFsdWUgdGhhdCB3YXMgc2VudCB3aGVuIHR1cm5pbmcgb24KLQkJICogdGhlIGJyZWFrLgotCQkgKi8KLQkJcmMgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJaWYgKHJjKSB7Ci0JCQlyZXR1cm4ocmMpOwotCQl9Ci0KLQkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7Ci0JCWlmIChyYykgewotCQkJRFBSX0lPQ1RMKCgiZGdhcF90dHlfaW9jdGwgLSBiYWQgcmV0dXJuOiAlZCAiLCByYykpOwotCQkJcmV0dXJuKC1FSU5UUik7Ci0JCX0KLQotCQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCQlkZ2FwX2NtZHcoY2gsIFNCUkVBSywgKHUxNikgU0JSRUFLX1RJTUUsIDApOwotCi0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCBmaW5pc2ggb24gcG9ydCAlZCAtIGNtZCAlcyAoJXgpLCBhcmcgJWx4XG4iLAotCQkJY2gtPmNoX3BvcnRudW0sIGRnYXBfaW9jdGxfbmFtZShjbWQpLCBjbWQsIGFyZykpOwotCi0JCXJldHVybiAwOwotCi0gICAgICAgIGNhc2UgVElPQ0NCUks6Ci0JCS8qCi0JCSAqIEZFUDUgZG9lc24ndCBzdXBwb3J0IHR1cm5pbmcgb2ZmIGEgYnJlYWsgdW5jb25kaXRpb25hbGx5LgotCQkgKiBUaGUgRkVQNSBkZXZpY2Ugd2lsbCBzdG9wIHNlbmRpbmcgYSBicmVhayBhdXRvbWF0aWNhbGx5Ci0JCSAqIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZSB2YWx1ZSB0aGF0IHdhcyBzZW50IHdoZW4gdHVybmluZyBvbgotCQkgKiB0aGUgYnJlYWsuCi0JCSAqLwotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBUSU9DR1NPRlRDQVI6Ci0KLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JCXJjID0gcHV0X3VzZXIoQ19DTE9DQUwodHR5KSA/IDEgOiAwLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJnKTsKLQkJcmV0dXJuKHJjKTsKLQotCWNhc2UgVElPQ1NTT0ZUQ0FSOgotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkJcmMgPSBnZXRfdXNlcihhcmcsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmcpOwotCQlpZiAocmMpCi0JCQlyZXR1cm4ocmMpOwotCi0JCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQl0dHktPnRlcm1pb3MuY19jZmxhZyA9ICgodHR5LT50ZXJtaW9zLmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8IChhcmcgPyBDTE9DQUwgOiAwKSk7Ci0JCWRnYXBfcGFyYW0odHR5KTsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JCXJldHVybigwKTsKLQotCWNhc2UgVElPQ01HRVQ6Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4oZGdhcF9nZXRfbW9kZW1faW5mbyhjaCwgdWFyZykpOwotCi0JY2FzZSBUSU9DTUJJUzoKLQljYXNlIFRJT0NNQklDOgotCWNhc2UgVElPQ01TRVQ6Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmV0dXJuKGRnYXBfc2V0X21vZGVtX2luZm8odHR5LCBjbWQsIHVhcmcpKTsKLQotCQkvKgotCQkgKiBIZXJlIGFyZSBhbnkgYWRkaXRpb25hbCBpb2N0bCdzIHRoYXQgd2Ugd2FudCB0byBpbXBsZW1lbnQKLQkJICovCi0KLQljYXNlIFRDRkxTSDoKLQkJLyoKLQkJICogVGhlIGxpbnV4IHR0eSBkcml2ZXIgZG9lc24ndCBoYXZlIGEgZmx1c2gKLQkJICogaW5wdXQgcm91dGluZSBmb3IgdGhlIGRyaXZlciwgYXNzdW1pbmcgYWxsIGJhY2tlZAotCQkgKiB1cCBkYXRhIGlzIGluIHRoZSBsaW5lIGRpc2MuIGJ1ZmZlcnMuICBIb3dldmVyLAotCQkgKiB3ZSBhbGwga25vdyB0aGF0J3Mgbm90IHRoZSBjYXNlLiAgSGVyZSwgd2UKLQkJICogYWN0IG9uIHRoZSBpb2N0bCwgYnV0IHRoZW4gbGllIGFuZCBzYXkgd2UgZGlkbid0Ci0JCSAqIHNvIHRoZSBsaW5lIGRpc2NpcGxpbmUgd2lsbCBwcm9jZXNzIHRoZSBmbHVzaAotCQkgKiBhbHNvLgotCQkgKi8KLQkJcmMgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7Ci0JCWlmIChyYykgewotCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCXJldHVybihyYyk7Ci0JCX0KLQotCQlpZiAoKGFyZyA9PSBUQ0lGTFVTSCkgfHwgKGFyZyA9PSBUQ0lPRkxVU0gpKSB7Ci0JCQlpZiAoISh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSkgewotCQkJCWhlYWQgPSByZWFkdygmKGNoLT5jaF9icy0+cnhfaGVhZCkpOwotCQkJCXdyaXRldyhoZWFkLCAmKGNoLT5jaF9icy0+cnhfdGFpbCkpOwotCQkJCXdyaXRlYigwLCAmKGNoLT5jaF9icy0+b3J1bikpOwotCQkJfQotCQl9Ci0KLQkJaWYgKChhcmcgPT0gVENPRkxVU0gpIHx8IChhcmcgPT0gVENJT0ZMVVNIKSkgewotCQkJY2gtPmNoX2ZsYWdzICY9IH5DSF9TVE9QOwotCQkJaGVhZCA9IHJlYWR3KCYoY2gtPmNoX2JzLT50eF9oZWFkKSk7Ci0JCQlkZ2FwX2NtZHcoY2gsIEZMVVNIVFgsICh1MTYpIGhlYWQsIDAgKTsKLQkJCWRnYXBfY21kdyhjaCwgUkVTVU1FVFgsIDAsIDApOwotCQkJaWYgKGNoLT5jaF90dW4udW5fZmxhZ3MgJiAoVU5fTE9XfFVOX0VNUFRZKSkgewotCQkJCWNoLT5jaF90dW4udW5fZmxhZ3MgJj0gfihVTl9MT1d8VU5fRU1QVFkpOwotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3R1bi51bl9mbGFnc193YWl0KTsKLQkJCX0KLQkJCWlmIChjaC0+Y2hfcHVuLnVuX2ZsYWdzICYgKFVOX0xPV3xVTl9FTVBUWSkpIHsKLQkJCQljaC0+Y2hfcHVuLnVuX2ZsYWdzICY9IH4oVU5fTE9XfFVOX0VNUFRZKTsKLQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9wdW4udW5fZmxhZ3Nfd2FpdCk7Ci0JCQl9Ci0JCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmdHR5LT53cml0ZV93YWl0KSkKLQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7Ci0KLQkJCS8qIENhbid0IGhvbGQgYW55IGxvY2tzIHdoZW4gY2FsbGluZyB0dHlfd2FrZXVwISAqLwotCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCXR0eV93YWtldXAodHR5KTsKLQkJCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJfQotCi0JCS8qIHByZXRlbmQgd2UgZGlkbid0IHJlY29nbml6ZSB0aGlzIElPQ1RMICovCi0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCAoTElORTolZCkgZmluaXNoIG9uIHBvcnQgJWQgLSBjbWQgJXMgKCV4KSwgYXJnICVseFxuIiwKLQkJCV9fTElORV9fLCBjaC0+Y2hfcG9ydG51bSwgZGdhcF9pb2N0bF9uYW1lKGNtZCksIGNtZCwgYXJnKSk7Ci0KLQkJcmV0dXJuKC1FTk9JT0NUTENNRCk7Ci0KLQljYXNlIFRDU0VUU0Y6Ci0JY2FzZSBUQ1NFVFNXOgotCQkvKgotCQkgKiBUaGUgbGludXggdHR5IGRyaXZlciBkb2Vzbid0IGhhdmUgYSBmbHVzaAotCQkgKiBpbnB1dCByb3V0aW5lIGZvciB0aGUgZHJpdmVyLCBhc3N1bWluZyBhbGwgYmFja2VkCi0JCSAqIHVwIGRhdGEgaXMgaW4gdGhlIGxpbmUgZGlzYy4gYnVmZmVycy4gIEhvd2V2ZXIsCi0JCSAqIHdlIGFsbCBrbm93IHRoYXQncyBub3QgdGhlIGNhc2UuICBIZXJlLCB3ZQotCQkgKiBhY3Qgb24gdGhlIGlvY3RsLCBidXQgdGhlbiBsaWUgYW5kIHNheSB3ZSBkaWRuJ3QKLQkJICogc28gdGhlIGxpbmUgZGlzY2lwbGluZSB3aWxsIHByb2Nlc3MgdGhlIGZsdXNoCi0JCSAqIGFsc28uCi0JCSAqLwotCQlpZiAoY21kID09IFRDU0VUU0YpIHsKLQkJCS8qIGZsdXNoIHJ4ICovCi0JCQljaC0+Y2hfZmxhZ3MgJj0gfkNIX1NUT1A7Ci0JCQloZWFkID0gcmVhZHcoJihjaC0+Y2hfYnMtPnJ4X2hlYWQpKTsKLQkJCXdyaXRldyhoZWFkLCAmKGNoLT5jaF9icy0+cnhfdGFpbCkpOwotCQl9Ci0KLQkJLyogbm93IHdhaXQgZm9yIGFsbCB0aGUgb3V0cHV0IHRvIGRyYWluICovCi0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7Ci0JCWlmIChyYykgewotCQkJRFBSX0lPQ1RMKCgiZGdhcF90dHlfaW9jdGwgLSBiYWQgcmV0dXJuOiAlZCAiLCByYykpOwotCQkJcmV0dXJuKC1FSU5UUik7Ci0JCX0KLQotCQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCBmaW5pc2ggb24gcG9ydCAlZCAtIGNtZCAlcyAoJXgpLCBhcmcgJWx4XG4iLAotCQkJY2gtPmNoX3BvcnRudW0sIGRnYXBfaW9jdGxfbmFtZShjbWQpLCBjbWQsIGFyZykpOwotCi0JCS8qIHByZXRlbmQgd2UgZGlkbid0IHJlY29nbml6ZSB0aGlzICovCi0JCXJldHVybigtRU5PSU9DVExDTUQpOwotCi0JY2FzZSBUQ1NFVEFXOgotCi0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7Ci0JCWlmIChyYykgewotCQkJRFBSX0lPQ1RMKCgiZGdhcF90dHlfaW9jdGwgLSBiYWQgcmV0dXJuOiAlZCAiLCByYykpOwotCQkJcmV0dXJuKC1FSU5UUik7Ci0JCX0KLQotCQkvKiBwcmV0ZW5kIHdlIGRpZG4ndCByZWNvZ25pemUgdGhpcyAqLwotCQlyZXR1cm4oLUVOT0lPQ1RMQ01EKTsKLQotCWNhc2UgVENYT05DOgotCQkvKgotCQkgKiBUaGUgTGludXggTGluZSBEaXNjaXBsaW5lIChMRCkgd291bGQgZG8gdGhpcyBmb3IgdXMgaWYgd2UKLQkJICogbGV0IGl0LCBidXQgd2UgaGF2ZSB0aGUgc3BlY2lhbCBmaXJtd2FyZSBvcHRpb25zIHRvIGRvIHRoaXMKLQkJICogdGhlICJyaWdodCB3YXkiIHJlZ2FyZGxlc3Mgb2YgaGFyZHdhcmUgb3Igc29mdHdhcmUgZmxvdwotCQkgKiBjb250cm9sIHNvIHdlJ2xsIGRvIGl0IG91dHNlbHZlcyBpbnN0ZWFkIG9mIGxldHRpbmcgdGhlIExECi0JCSAqIGRvIGl0LgotCQkgKi8KLQkJcmMgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7Ci0JCWlmIChyYykgewotCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCXJldHVybihyYyk7Ci0JCX0KLQotCQlEUFJfSU9DVEwoKCJkZ2FwX2lvY3RsIC0gaW4gVENYT05DIC0gJWRcbiIsIGNtZCkpOwotCQlzd2l0Y2ggKGFyZykgewotCi0JCWNhc2UgVENPT046Ci0JCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJZGdhcF90dHlfc3RhcnQodHR5KTsKLQkJCXJldHVybigwKTsKLQkJY2FzZSBUQ09PRkY6Ci0JCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJZGdhcF90dHlfc3RvcCh0dHkpOwotCQkJcmV0dXJuKDApOwotCQljYXNlIFRDSU9OOgotCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCS8qIE1ha2UgdGhlIGxkIGRvIGl0ICovCi0JCQlyZXR1cm4oLUVOT0lPQ1RMQ01EKTsKLQkJY2FzZSBUQ0lPRkY6Ci0JCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJLyogTWFrZSB0aGUgbGQgZG8gaXQgKi8KLQkJCXJldHVybigtRU5PSU9DVExDTUQpOwotCQlkZWZhdWx0OgotCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCXJldHVybigtRUlOVkFMKTsKLQkJfQotCi0JY2FzZSBESUdJX0dFVEE6Ci0JCS8qIGdldCBpbmZvcm1hdGlvbiBmb3IgZGl0dHkgKi8KLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4oZGdhcF90dHlfZGlnaWdldGEodHR5LCB1YXJnKSk7Ci0KLQljYXNlIERJR0lfU0VUQVc6Ci0JY2FzZSBESUdJX1NFVEFGOgotCi0JCS8qIHNldCBpbmZvcm1hdGlvbiBmb3IgZGl0dHkgKi8KLQkJaWYgKGNtZCA9PSAoRElHSV9TRVRBVykpIHsKLQotCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCXJjID0gZGdhcF93YWl0X2Zvcl9kcmFpbih0dHkpOwotCQkJaWYgKHJjKSB7Ci0JCQkJRFBSX0lPQ1RMKCgiZGdhcF90dHlfaW9jdGwgLSBiYWQgcmV0dXJuOiAlZCAiLCByYykpOwotCQkJCXJldHVybigtRUlOVFIpOwotCQkJfQotCQkJREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQl9Ci0JCWVsc2UgewotCQkJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7Ci0JCX0KLQkJLyogZmFsbCB0aHJ1ICovCi0KLQljYXNlIERJR0lfU0VUQToKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4oZGdhcF90dHlfZGlnaXNldGEodHR5LCB1YXJnKSk7Ci0KLQljYXNlIERJR0lfR0VERUxBWToKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4oZGdhcF90dHlfZGlnaWdldGVkZWxheSh0dHksIHVhcmcpKTsKLQotCWNhc2UgRElHSV9TRURFTEFZOgotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCXJldHVybihkZ2FwX3R0eV9kaWdpc2V0ZWRlbGF5KHR0eSwgdWFyZykpOwotCi0JY2FzZSBESUdJX0dFVENVU1RPTUJBVUQ6Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmV0dXJuKGRnYXBfdHR5X2RpZ2lnZXRjdXN0b21iYXVkKHR0eSwgdWFyZykpOwotCi0JY2FzZSBESUdJX1NFVENVU1RPTUJBVUQ6Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmV0dXJuKGRnYXBfdHR5X2RpZ2lzZXRjdXN0b21iYXVkKHR0eSwgdWFyZykpOwotCi0JY2FzZSBESUdJX1JFU0VUX1BPUlQ6Ci0JCWRnYXBfZmlybXdhcmVfcmVzZXRfcG9ydChjaCk7Ci0JCWRnYXBfcGFyYW0odHR5KTsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQotCWRlZmF1bHQ6Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCAtIGluIGRlZmF1bHRcbiIpKTsKLQkJRFBSX0lPQ1RMKCgiZGdhcF90dHlfaW9jdGwgZW5kIC0gY21kICVzICgleCksIGFyZyAlbHhcbiIsCi0JCQlkZ2FwX2lvY3RsX25hbWUoY21kKSwgY21kLCBhcmcpKTsKLQotCQlyZXR1cm4oLUVOT0lPQ1RMQ01EKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3R0eS5oIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF90dHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0YTQ2MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3R0eS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKi8KLQotI2lmbmRlZiBfX0RHQVBfVFRZX0gKLSNkZWZpbmUgX19ER0FQX1RUWV9ICi0KLSNpbmNsdWRlICJkZ2FwX2RyaXZlci5oIgotCi1pbnQJZGdhcF90dHlfcmVnaXN0ZXIoc3RydWN0IGJvYXJkX3QgKmJyZCk7Ci0KLWludAlkZ2FwX3R0eV9wcmVpbml0KHZvaWQpOwotaW50ICAgICBkZ2FwX3R0eV9pbml0KHN0cnVjdCBib2FyZF90ICopOwotCi12b2lkCWRnYXBfdHR5X3Bvc3RfdW5pbml0KHZvaWQpOwotdm9pZAlkZ2FwX3R0eV91bmluaXQoc3RydWN0IGJvYXJkX3QgKik7Ci0KLXZvaWQJZGdhcF9jYXJyaWVyKHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKLXZvaWQJZGdhcF9pbnB1dChzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYTM4YzcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKi8KLQotI2lmbmRlZiBfX0RHQVBfVFlQRVNfSAotI2RlZmluZSBfX0RHQVBfVFlQRVNfSAotCi0jaWZuZGVmIFRSVUUKLSMgZGVmaW5lIFRSVUUgMQotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSMgZGVmaW5lIEZBTFNFIDAKLSNlbmRpZgotCi0vKiBSZXF1aXJlZCBmb3Igb3VyIHNoYXJlZCBoZWFkZXJzISAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyCQl1Y2hhcjsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kaWdpLmggYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kaWdpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZWE0ZjcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGlnaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKLSAqCVNjb3R0IEggS2lsYXUgPFNjb3R0X0tpbGF1IGF0IGRpZ2kgZG90IGNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKLSAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqICRJZDogZGlnaS5oLHYgMS4xIDIwMDkvMTAvMjMgMTQ6MDE6NTcgbWFya2ggRXhwICQKLSAqCi0gKglOT1RFOiBUSElTIElTIEEgU0hBUkVEIEhFQURFUi4gRE8gTk9UIENIQU5HRSBDT0RJTkcgU1RZTEUhISEKLSAqLwotCi0jaWZuZGVmIF9fRElHSV9ICi0jZGVmaW5lIF9fRElHSV9ICi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioJRGVmaW5pdGlvbnMgZm9yIERpZ2kgZGl0dHkoMSkgY29tbWFuZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OC05NiBEaWdpIEludGVybmF0aW9uYWwgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhcHBsaWNhdGlvbiBhY2Nlc3MgdG8gc3BlY2lhbCBEaWdpCi0gKiBzZXJpYWwgbGluZSBlbmhhbmNlbWVudHMgd2hpY2ggYXJlIG5vdCBzdGFuZGFyZCBVTklYKHRtKSBmZWF0dXJlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiAhZGVmaW5lZChUSU9DTU9ERykKLQotI2RlZmluZQlUSU9DTU9ERwkoJ2QnPDw4KSB8IDI1MAkJLyogZ2V0IG1vZGVtIGN0cmwgc3RhdGUJKi8KLSNkZWZpbmUJVElPQ01PRFMJKCdkJzw8OCkgfCAyNTEJCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlCSovCi0KLSNpZm5kZWYgVElPQ01fTEUgCi0jZGVmaW5lCQlUSU9DTV9MRQkweDAxCQkvKiBsaW5lIGVuYWJsZQkJKi8KLSNkZWZpbmUJCVRJT0NNX0RUUgkweDAyCQkvKiBkYXRhIHRlcm1pbmFsIHJlYWR5CSovCi0jZGVmaW5lCQlUSU9DTV9SVFMJMHgwNAkJLyogcmVxdWVzdCB0byBzZW5kCSovCi0jZGVmaW5lCQlUSU9DTV9TVAkweDA4CQkvKiBzZWNvbmRhcnkgdHJhbnNtaXQJKi8KLSNkZWZpbmUJCVRJT0NNX1NSCTB4MTAJCS8qIHNlY29uZGFyeSByZWNlaXZlCSovCi0jZGVmaW5lCQlUSU9DTV9DVFMJMHgyMAkJLyogY2xlYXIgdG8gc2VuZAkqLwotI2RlZmluZQkJVElPQ01fQ0FSCTB4NDAJCS8qIGNhcnJpZXIgZGV0ZWN0CSovCi0jZGVmaW5lCQlUSU9DTV9STkcJMHg4MAkJLyogcmluZwlpbmRpY2F0b3IJKi8KLSNkZWZpbmUJCVRJT0NNX0RTUgkweDEwMAkJLyogZGF0YSBzZXQgcmVhZHkJKi8KLSNkZWZpbmUJCVRJT0NNX1JJCVRJT0NNX1JORwkvKiByaW5nIChhbHRlcm5hdGUpCSovCi0jZGVmaW5lCQlUSU9DTV9DRAlUSU9DTV9DQVIJLyogY2FycmllciBkZXRlY3QgKGFsdCkJKi8KLSNlbmRpZgotCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFRJT0NNU0VUKQotI2RlZmluZQlUSU9DTVNFVAkoJ2QnPDw4KSB8IDI1MgkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUJKi8KLSNkZWZpbmUJVElPQ01HRVQJKCdkJzw8OCkgfCAyNTMJCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlCSovCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFRJT0NNQklDKQotI2RlZmluZQlUSU9DTUJJQwkoJ2QnPDw4KSB8IDI1NAkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUgKi8KLSNkZWZpbmUJVElPQ01CSVMJKCdkJzw8OCkgfCAyNTUJCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlICovCi0jZW5kaWYKLQotCi0jaWYgIWRlZmluZWQoVElPQ1NEVFIpCi0jZGVmaW5lCVRJT0NTRFRSCSgnZSc8PDgpIHwgMAkJLyogc2V0IERUUgkJKi8KLSNkZWZpbmUJVElPQ0NEVFIJKCdlJzw8OCkgfCAxCQkvKiBjbGVhciBEVFIJCSovCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSW9jdGwgY29tbWFuZCBhcmd1bWVudHMgZm9yIERJR0kgcGFyYW1ldGVycy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIERJR0lfR0VUQQkoJ2UnPDw4KSB8IDk0CQkvKiBSZWFkIHBhcmFtcwkJKi8KLQotI2RlZmluZSBESUdJX1NFVEEJKCdlJzw8OCkgfCA5NQkJLyogU2V0IHBhcmFtcwkJKi8KLSNkZWZpbmUgRElHSV9TRVRBVwkoJ2UnPDw4KSB8IDk2CQkvKiBEcmFpbiAmIHNldCBwYXJhbXMJKi8KLSNkZWZpbmUgRElHSV9TRVRBRgkoJ2UnPDw4KSB8IDk3CQkvKiBEcmFpbiwgZmx1c2ggJiBzZXQgcGFyYW1zICovCi0KLSNkZWZpbmUgRElHSV9LTUUJKCdlJzw8OCkgfCA5OAkJLyogUmVhZC9Xcml0ZSBIb3N0CSovCi0JCQkJCQkvKiBBZGFwdGVyIE1lbW9yeQkqLwotCi0jZGVmaW5lCURJR0lfR0VURkxPVwkoJ2UnPDw4KSB8IDk5CQkvKiBHZXQgc3RhcnRjL3N0b3BjIGZsb3cgKi8KLQkJCQkJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAJICovCi0jZGVmaW5lCURJR0lfU0VURkxPVwkoJ2UnPDw4KSB8IDEwMAkJLyogU2V0IHN0YXJ0Yy9zdG9wYyBmbG93ICovCi0JCQkJCQkvKiBjb250cm9sIGNoYXJhY3RlcnMJICovCi0jZGVmaW5lCURJR0lfR0VUQUZMT1cJKCdlJzw8OCkgfCAxMDEJCS8qIEdldCBBdXguIHN0YXJ0Yy9zdG9wYyAqLwotCQkJCQkJLyogZmxvdyBjb250cm9sIGNoYXJzIAkgKi8KLSNkZWZpbmUJRElHSV9TRVRBRkxPVwkoJ2UnPDw4KSB8IDEwMgkJLyogU2V0IEF1eC4gc3RhcnRjL3N0b3BjICovCi0JCQkJCQkvKiBmbG93IGNvbnRyb2wgY2hhcnMJICovCi0KLSNkZWZpbmUgRElHSV9HRURFTEFZCSgnZCc8PDgpIHwgMjQ2CQkvKiBHZXQgZWRlbGF5ICovCi0jZGVmaW5lIERJR0lfU0VERUxBWQkoJ2QnPDw4KSB8IDI0NwkJLyogU2V0IGVkZWxheSAqLwotCi1zdHJ1Y3QJZGlnaWZsb3dfdCB7Ci0JdW5zaWduZWQgY2hhcglzdGFydGM7CQkJCS8qIGZsb3cgY250bCBzdGFydCBjaGFyCSovCi0JdW5zaWduZWQgY2hhcglzdG9wYzsJCQkJLyogZmxvdyBjbnRsIHN0b3AgY2hhcgkqLwotfTsKLQotCi0jaWZkZWYJRkxPV18yMjAwCi0jZGVmaW5lCUYyMjAwX0dFVEEJKCdlJzw8OCkgfCAxMDQJCS8qIEdldCAyeDM2IGZsb3cgY250bCBmbGFncyAqLwotI2RlZmluZQlGMjIwMF9TRVRBVwkoJ2UnPDw4KSB8IDEwNQkJLyogU2V0IDJ4MzYgZmxvdyBjbnRsIGZsYWdzICovCi0jZGVmaW5lCQlGMjIwMF9NQVNLCTB4MDMJCS8qIDIyMDAgZmxvdyBjbnRsIGJpdCBtYXNrICAqLwotI2RlZmluZQkJRkNOVExfMjIwMAkweDAxCQkvKiAyeDM2IHRlcm1pbmFsIGZsb3cgY250bCAgKi8KLSNkZWZpbmUJCVBDTlRMXzIyMDAJMHgwMgkJLyogMngzNiBwcmludGVyIGZsb3cgY250bCAgICovCi0jZGVmaW5lCUYyMjAwX1hPTgkweGY4Ci0jZGVmaW5lCVAyMjAwX1hPTgkweGY5Ci0jZGVmaW5lCUYyMjAwX1hPRkYJMHhmYQotI2RlZmluZQlQMjIwMF9YT0ZGCTB4ZmIKLQotI2RlZmluZQlGWE9GRl9NQVNLCTB4MDMJCQkvKiAyMjAwIGZsb3cgc3RhdHVzIG1hc2sgICAgKi8KLSNkZWZpbmUJUkNWRF9GWE9GRgkweDAxCQkJLyogMngzNiBUZXJtaW5hbCBYT0ZGIHJjdmQgICovCi0jZGVmaW5lCVJDVkRfUFhPRkYJMHgwMgkJCS8qIDJ4MzYgUHJpbnRlciBYT0ZGIHJjdmQgICAqLwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZhbHVlcyBmb3IgZGlnaV9mbGFncyAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIERJR0lfSVhPTgkweDAwMDEJCS8qIEhhbmRsZSBJWE9OIGluIHRoZSBGRVAJKi8KLSNkZWZpbmUgRElHSV9GQVNUCTB4MDAwMgkJLyogRmFzdCBiYXVkIHJhdGVzCQkqLwotI2RlZmluZSBSVFNQQUNFCQkweDAwMDQJCS8qIFJUUyBpbnB1dCBmbG93IGNvbnRyb2wJKi8KLSNkZWZpbmUgQ1RTUEFDRQkJMHgwMDA4CQkvKiBDVFMgb3V0cHV0IGZsb3cgY29udHJvbAkqLwotI2RlZmluZSBEU1JQQUNFCQkweDAwMTAJCS8qIERTUiBvdXRwdXQgZmxvdyBjb250cm9sCSovCi0jZGVmaW5lIERDRFBBQ0UJCTB4MDAyMAkJLyogRENEIG91dHB1dCBmbG93IGNvbnRyb2wJKi8KLSNkZWZpbmUgRFRSUEFDRQkJMHgwMDQwCQkvKiBEVFIgaW5wdXQgZmxvdyBjb250cm9sCSovCi0jZGVmaW5lIERJR0lfQ09PSwkweDAwODAJCS8qIENvb2tlZCBwcm9jZXNzaW5nIGRvbmUgaW4gRkVQICovCi0jZGVmaW5lIERJR0lfRk9SQ0VEQ0QJMHgwMTAwCQkvKiBGb3JjZSBjYXJyaWVyCQkqLwotI2RlZmluZQlESUdJX0FMVFBJTgkweDAyMDAJCS8qIEFsdGVybmF0ZSBSSi00NSBwaW4gY29uZmlnCSovCi0jZGVmaW5lCURJR0lfQUlYT04JMHgwNDAwCQkvKiBBdXggZmxvdyBjb250cm9sIGluIGZlcAkqLwotI2RlZmluZQlESUdJX1BSSU5URVIJMHgwODAwCQkvKiBIb2xkIHBvcnQgb3BlbiBmb3IgZmxvdyBjbnRybCovCi0jZGVmaW5lIERJR0lfUFBfSU5QVVQJMHgxMDAwCQkvKiBDaGFuZ2UgcGFyYWxsZWwgcG9ydCB0byBpbnB1dCovCi0jZGVmaW5lIERJR0lfRFRSX1RPR0dMRSAweDIwMDAJCS8qIFN1cHBvcnQgRFRSIFRvZ2dsZQkJKi8KLSNkZWZpbmUJRElHSV80MjIJMHg0MDAwCQkvKiBmb3IgNDIyLzIzMiBzZWxlY3RhYmxlIHBhbmVsICovCi0jZGVmaW5lIERJR0lfUlRTX1RPR0dMRQkweDgwMDAJCS8qIFN1cHBvcnQgUlRTIFRvZ2dsZQkJKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGhlc2Ugb3B0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBvbiB0aGUgY29teGkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZQlESUdJX0NPTVhJCShESUdJX0ZBU1R8RElHSV9DT09LfERTUlBBQ0V8RENEUEFDRXxEVFJQQUNFKQotCi0jZGVmaW5lIERJR0lfUExFTgkyOAkJLyogU3RyaW5nIGxlbmd0aAkJKi8KLSNkZWZpbmUJRElHSV9UU0laCTEwCQkvKiBUZXJtaW5hbCBzdHJpbmcgbGVuCQkqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTdHJ1Y3R1cmUgdXNlZCB3aXRoIGlvY3RsIGNvbW1hbmRzIGZvciBESUdJIHBhcmFtZXRlcnMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IGRpZ2lfdCB7Ci0JdW5zaWduZWQgc2hvcnQJZGlnaV9mbGFnczsJCS8qIEZsYWdzIChzZWUgYWJvdmUpCSovCi0JdW5zaWduZWQgc2hvcnQJZGlnaV9tYXhjcHM7CQkvKiBNYXggcHJpbnRlciBDUFMJKi8KLQl1bnNpZ25lZCBzaG9ydAlkaWdpX21heGNoYXI7CQkvKiBNYXggY2hhcnMgaW4gcHJpbnQgcXVldWUgKi8KLQl1bnNpZ25lZCBzaG9ydAlkaWdpX2J1ZnNpemU7CQkvKiBCdWZmZXIgc2l6ZQkJKi8KLQl1bnNpZ25lZCBjaGFyCWRpZ2lfb25sZW47CQkvKiBMZW5ndGggb2YgT04gc3RyaW5nCSovCi0JdW5zaWduZWQgY2hhcglkaWdpX29mZmxlbjsJCS8qIExlbmd0aCBvZiBPRkYgc3RyaW5nCSovCi0JY2hhcgkJZGlnaV9vbnN0cltESUdJX1BMRU5dOwkvKiBQcmludGVyIG9uIHN0cmluZwkqLwotCWNoYXIJCWRpZ2lfb2Zmc3RyW0RJR0lfUExFTl07CS8qIFByaW50ZXIgb2ZmIHN0cmluZwkqLwotCWNoYXIJCWRpZ2lfdGVybVtESUdJX1RTSVpdOwkvKiB0ZXJtaW5hbCBzdHJpbmcJKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEtNRSBkZWZpbml0aW9ucyBhbmQgc3RydWN0dXJlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lCVJXX0lETEUJCTAJLyogT3BlcmF0aW9uIGNvbXBsZXRlCQkJKi8KLSNkZWZpbmUJUldfUkVBRAkJMQkvKiBSZWFkIENvbmNlbnRyYXRvciBNZW1vcnkJCSovCi0jZGVmaW5lCVJXX1dSSVRFCTIJLyogV3JpdGUgQ29uY2VudHJhdG9yIE1lbW9yeQkJKi8KLQotc3RydWN0IHJ3X3QgewotCXVuc2lnbmVkIGNoYXIJcndfcmVxOwkJLyogUmVxdWVzdCB0eXBlCQkJKi8KLQl1bnNpZ25lZCBjaGFyCXJ3X2JvYXJkOwkvKiBIb3N0IEFkYXB0ZXIgYm9hcmQgbnVtYmVyCSovCi0JdW5zaWduZWQgY2hhcglyd19jb25jOwkvKiBDb25jZW50cmF0b3IgbnVtYmVyCQkqLwotCXVuc2lnbmVkIGNoYXIJcndfcmVzZXJ2ZWQ7CS8qIFJlc2VydmVkIGZvciBleHBhbnNpb24JKi8KLQl1bnNpZ25lZCBsb25nCXJ3X2FkZHI7CS8qIEFkZHJlc3MgaW4gY29uY2VudHJhdG9yCSovCi0JdW5zaWduZWQgc2hvcnQJcndfc2l6ZTsJLyogUmVhZC93cml0ZSByZXF1ZXN0IGxlbmd0aAkqLwotCXVuc2lnbmVkIGNoYXIJcndfZGF0YVsxMjhdOwkvKiBEYXRhIHRvIHJlYWQvd3JpdGUJCSovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNocmluayBCdWZmZXIgYW5kIEJvYXJkIEluZm9ybWF0aW9uIGRlZmluaXRpb25zIGFuZCBzdHJ1Y3R1cmVzLgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQkJLyogQm9hcmQgdHlwZSByZXR1cm4gY29kZXMgKi8KLSNkZWZpbmUJUENYSV9UWVBFIDEgICAgIC8qIEJvYXJkIHR5cGUgYXQgdGhlIGRlc2lnbmF0ZWQgcG9ydCBpcyBhIFBDL1hpICovCi0jZGVmaW5lIFBDWE1fVFlQRSAyICAgICAvKiBCb2FyZCB0eXBlIGF0IHRoZSBkZXNpZ25hdGVkIHBvcnQgaXMgYSBQQy9YbSAqLwotI2RlZmluZQlQQ1hFX1RZUEUgMyAgICAgLyogQm9hcmQgdHlwZSBhdCB0aGUgZGVzaWduYXRlZCBwb3J0IGlzIGEgUEMvWGUgKi8KLSNkZWZpbmUJTUNYSV9UWVBFIDQgICAgIC8qIEJvYXJkIHR5cGUgYXQgdGhlIGRlc2lnbmF0ZWQgcG9ydCBpcyBhIE1DL1hpICovCi0jZGVmaW5lIENPTVhJX1RZUEUgNSAgICAgLyogQm9hcmQgdHlwZSBhdCB0aGUgZGVzaWduYXRlZCBwb3J0IGlzIGEgQ09NL1hpICovCi0KLQkJCSAvKiBOb24tWmVybyBSZXN1bHQgY29kZXMuICovCi0jZGVmaW5lIFJFU1VMVF9OT0JERk5EIDEgLyogQSBEaWdpIHByb2R1Y3QgYXQgdGhhdCBwb3J0IGlzIG5vdCBjb25maWcgaW5zdGFsbGVkICovIAotI2RlZmluZSBSRVNVTFRfTk9ERVNDVCAyIC8qIEEgbWVtb3J5IGRlc2NyaXB0b3Igd2FzIG5vdCBvYnRhaW5hYmxlICovIAotI2RlZmluZSBSRVNVTFRfTk9PU1NJRyAzIC8qIEZFUC9PUyBzaWduYXR1cmUgd2FzIG5vdCBkZXRlY3RlZCBvbiB0aGUgYm9hcmQgKi8KLSNkZWZpbmUgUkVTVUxUX1RPT1NNTCAgNCAvKiBUb28gc21hbGwgYW4gYXJlYSB0byBzaHJpbmsuICAqLwotI2RlZmluZSBSRVNVTFRfTk9DSEFOICA1IC8qIENoYW5uZWwgc3RydWN0dXJlIGZvciB0aGUgYm9hcmQgd2FzIG5vdCBmb3VuZCAqLwotCi1zdHJ1Y3Qgc2hyaW5rX2J1Zl9zdHJ1Y3QgewotCXVuc2lnbmVkIGxvbmcJc2hyaW5rX2J1Zl92YWRkcjsJLyogVmlydHVhbCBhZGRyZXNzIG9mIGJvYXJkICovCi0JdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX3BoeXM7CS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgYm9hcmQgKi8KLQl1bnNpZ25lZCBsb25nCXNocmlua19idWZfYnNlZzsJLyogQW1vdW50IG9mIGJvYXJkIG1lbW9yeSAqLwotCXVuc2lnbmVkIGxvbmcJc2hyaW5rX2J1Zl9oc2VnOwkvKiAnMTg2IEJlZ2lubmluZyBvZiBEdWFsLVBvcnQgKi8KLQotCXVuc2lnbmVkIGxvbmcJc2hyaW5rX2J1Zl9sc2VnOwkvKiAnMTg2IEJlZ2lubmluZyBvZiBmcmVlZCBtZW1vcnkJCQkJCQkqLyAKLQl1bnNpZ25lZCBsb25nCXNocmlua19idWZfbXNlZzsJLyogTGluZWFyIGFkZHJlc3MgZnJvbSBzdGFydCBvZgotCQkJCQkJICAgZHVhbC1wb3J0IHdlcmUgZnJlZWQgbWVtb3J5Ci0JCQkJCQkgICBiZWdpbnMsIGhvc3Qgdmlld3BvaW50LiAqLwotCi0JdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX2JkcGFyYW07CS8qIFBhcmFtZXRlciBmb3IgeHhtZW1vbiBhbmQKLQkJCQkJCSAgIHh4bWVtb2ZmICovCi0KLQl1bnNpZ25lZCBsb25nCXNocmlua19idWZfcmVzZXJ2YTsJLyogUmVzZXJ2ZWQgKi8KLQl1bnNpZ25lZCBsb25nCXNocmlua19idWZfcmVzZXJ2YjsJLyogUmVzZXJ2ZWQgKi8KLQl1bnNpZ25lZCBsb25nCXNocmlua19idWZfcmVzZXJ2YzsJLyogUmVzZXJ2ZWQgKi8KLQl1bnNpZ25lZCBsb25nCXNocmlua19idWZfcmVzZXJ2ZDsJLyogUmVzZXJ2ZWQgKi8KLQotCXVuc2lnbmVkIGNoYXIJc2hyaW5rX2J1Zl9yZXN1bHQ7CS8qIFJlYXNvbiBmb3IgY2FsbCBmYWlsaW5nCi0JCQkJCQkgICBaZXJvIGlzIEdvb2QgcmV0dXJuICovCi0JdW5zaWduZWQgY2hhcglzaHJpbmtfYnVmX2luaXQ7CS8qIE5vbi1aZXJvIGlmIGl0IGNhdXNlZCBhbiAgICAgCi0JCQkJCQkgICB4eGluaXQgY2FsbC4gKi8KLQotCXVuc2lnbmVkIGNoYXIJc2hyaW5rX2J1Zl9hbnBvcnRzOwkvKiBOdW1iZXIgb2YgYXN5bmMgcG9ydHMgICovCi0JdW5zaWduZWQgY2hhcglzaHJpbmtfYnVmX3NucG9ydHM7IAkvKiBOdW1iZXIgb2Ygc3luYyAgcG9ydHMgKi8KLQl1bnNpZ25lZCBjaGFyCXNocmlua19idWZfdHlwZTsJLyogQm9hcmQgdHlwZSAxID0gUEMvWGksCi0JCQkJCQkJICAgICAgMiA9IFBDL1htLAotCQkJCQkJCSAgICAgIDMgPSBQQy9YZSAgCi0JCQkJCQkJICAgICAgNCA9IE1DL1hpICAKLQkJCQkJCQkgICAgICA1ID0gQ09NWC9pICovCi0JdW5zaWduZWQgY2hhcglzaHJpbmtfYnVmX2NhcmQ7CS8qIENhcmQgbnVtYmVyICovCi0JCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTdHJ1Y3R1cmUgdG8gZ2V0IGRyaXZlciBzdGF0dXMgaW5mb3JtYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgZGlnaV9kaW5mbyB7Ci0JdW5zaWduZWQgbG9uZwlkaW5mb19uYm9hcmRzOwkJLyogIyBib2FyZHMgY29uZmlndXJlZAkqLwotCWNoYXIJCWRpbmZvX3Jlc2VydmVkWzEyXTsJLyogZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KLQljaGFyCQlkaW5mb192ZXJzaW9uWzE2XTsJLyogZHJpdmVyIHZlcnNpb24gICAgICAgKi8KLX07Ci0KLSNkZWZpbmUJRElHSV9HRVRERAkoJ2QnPDw4KSB8IDI0OAkJLyogZ2V0IGRyaXZlciBpbmZvICAgICAgKi8KLSAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFN0cnVjdHVyZSB1c2VkIHdpdGggaW9jdGwgY29tbWFuZHMgZm9yIHBlci1ib2FyZCBpbmZvcm1hdGlvbgotICoKLSAqIHBoeXNzaXplIGFuZCBtZW1zaXplIGRpZmZlciB3aGVuIGJvYXJkIGhhcyAid2luZG93ZWQiIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBkaWdpX2luZm8gewotCXVuc2lnbmVkIGxvbmcJaW5mb19iZG51bTsJCS8qIEJvYXJkIG51bWJlciAoMCBiYXNlZCkgICovCi0JdW5zaWduZWQgbG9uZwlpbmZvX2lvcG9ydDsJCS8qIGlvIHBvcnQgYWRkcmVzcyAgICAgICAgICovCi0JdW5zaWduZWQgbG9uZwlpbmZvX3BoeXNhZGRyOwkJLyogbWVtb3J5IGFkZHJlc3MgICAgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9fcGh5c3NpemU7CQkvKiBTaXplIG9mIGhvc3QgbWVtIHdpbmRvdyAqLwotCXVuc2lnbmVkIGxvbmcJaW5mb19tZW1zaXplOwkJLyogQW1vdW50IG9mIGR1YWwtcG9ydCBtZW0gKi8KLQkJCQkJCS8qIG9uIGJvYXJkICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgc2hvcnQJaW5mb19iZHR5cGU7CQkvKiBCb2FyZCB0eXBlICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIHNob3J0CWluZm9fbnBvcnRzOwkJLyogbnVtYmVyIG9mIHBvcnRzICAgICAgICAgKi8KLQljaGFyCQlpbmZvX2Jkc3RhdGU7CQkvKiBib2FyZCBzdGF0ZSAgICAgICAgICAgICAqLwotCWNoYXIJCWluZm9fcmVzZXJ2ZWRbN107CS8qIGZvciBmdXR1cmUgZXhwYW5zaW9uICAgICovCi19OwotCi0jZGVmaW5lCURJR0lfR0VUQkQJKCdkJzw8OCkgfCAyNDkJCS8qIGdldCBib2FyZCBpbmZvICAgICAgICAgICovCi0gCi1zdHJ1Y3QgZGlnaV9zdGF0IHsKLQl1bnNpZ25lZCBpbnQJaW5mb19jaGFuOwkJLyogQ2hhbm5lbCBudW1iZXIgKDAgYmFzZWQpICAqLwotCXVuc2lnbmVkIGludAlpbmZvX2JyZDsJCS8qIEJvYXJkIG51bWJlciAoMCBiYXNlZCkgICovCi0JdW5zaWduZWQgbG9uZwlpbmZvX2NmbGFnOwkJLyogY2ZsYWcgZm9yIGNoYW5uZWwgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9faWZsYWc7CQkvKiBpZmxhZyBmb3IgY2hhbm5lbCAgICAgICAqLwotCXVuc2lnbmVkIGxvbmcJaW5mb19vZmxhZzsJCS8qIG9mbGFnIGZvciBjaGFubmVsICAgICAgICovCi0JdW5zaWduZWQgbG9uZwlpbmZvX21zdGF0OwkJLyogbXN0YXQgZm9yIGNoYW5uZWwgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9fdHhfZGF0YTsJCS8qIHR4X2RhdGEgZm9yIGNoYW5uZWwgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9fcnhfZGF0YTsJCS8qIHJ4X2RhdGEgZm9yIGNoYW5uZWwgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9faGZsb3c7CQkvKiBoZmxvdyBmb3IgY2hhbm5lbCAgICAgICAqLwotCXVuc2lnbmVkIGxvbmcJaW5mb19yZXNlcnZlZFs4XTsJLyogZm9yIGZ1dHVyZSBleHBhbnNpb24gICAgKi8KLX07Ci0KLSNkZWZpbmUJRElHSV9HRVRTVEFUCSgnZCc8PDgpIHwgMjQ0CQkvKiBnZXQgYm9hcmQgaW5mbyAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFN0cnVjdHVyZSB1c2VkIHdpdGggaW9jdGwgY29tbWFuZHMgZm9yIHBlci1jaGFubmVsIGluZm9ybWF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBkaWdpX2NoIHsKLQl1bnNpZ25lZCBsb25nCWluZm9fYmRudW07CQkvKiBCb2FyZCBudW1iZXIgKDAgYmFzZWQpICAqLwotCXVuc2lnbmVkIGxvbmcJaW5mb19jaGFubmVsOwkJLyogQ2hhbm5lbCBpbmRleCBudW1iZXIgICAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9fY2hfY2ZsYWc7CQkvKiBDaGFubmVsIGNmbGFnICAgCSAgICovCi0JdW5zaWduZWQgbG9uZwlpbmZvX2NoX2lmbGFnOwkJLyogQ2hhbm5lbCBpZmxhZyAgIAkgICAqLwotCXVuc2lnbmVkIGxvbmcJaW5mb19jaF9vZmxhZzsJCS8qIENoYW5uZWwgb2ZsYWcgICAJICAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9fY2hzaXplOwkJLyogQ2hhbm5lbCBzdHJ1Y3R1cmUgc2l6ZSAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9fc2xlZXBfc3RhdDsJLyogc2xlZXAgc3RhdHVzCQkgICAqLwotCWRldl90CQlpbmZvX2RldjsJCS8qIGRldmljZSBudW1iZXIJICAgKi8KLQl1bnNpZ25lZCBjaGFyCWluZm9faW5pdHN0YXRlOwkJLyogQ2hhbm5lbCBpbml0IHN0YXRlCSAgICovCi0JdW5zaWduZWQgY2hhcglpbmZvX3J1bm5pbmc7CQkvKiBDaGFubmVsIHJ1bm5pbmcgc3RhdGUgICAqLwotCWxvbmcJCXJlc2VydmVkWzhdOwkJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLX07Ci0KLS8qCi0qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgd2l0aCB0aGUgRElHSV9GRVBDTUQgaW9jdGwgdG8gCi0qIHRlbGwgdGhlIGRyaXZlciB3aGljaCBwb3J0IHRvIHNlbmQgdGhlIGNvbW1hbmQgZm9yLgotKi8KLXN0cnVjdCBkaWdpX2NtZCB7Ci0JaW50CWNtZDsKLQlpbnQJd29yZDsKLQlpbnQJbmNtZHM7Ci0JaW50CWNoYW47IC8qIGNoYW5uZWwgaW5kZXggKHplcm8gYmFzZWQpICovCi0JaW50CWJkaWQ7IC8qIGJvYXJkIGluZGV4ICh6ZXJvIGJhc2VkKSAqLwotfTsKLQotLyoKLSogIGluZm9fc2xlZXBfc3RhdCBkZWZpbmVzCi0qLwotI2RlZmluZSBJTkZPX1JVTldBSVQJMHgwMDAxCi0jZGVmaW5lIElORk9fV09QRU4JMHgwMDAyCi0jZGVmaW5lIElORk9fVFRJT1cJMHgwMDA0Ci0jZGVmaW5lIElORk9fQ0hfUldBSVQJMHgwMDA4Ci0jZGVmaW5lIElORk9fQ0hfV0VNUFRZCTB4MDAxMAotI2RlZmluZSBJTkZPX0NIX1dMT1cJMHgwMDIwCi0jZGVmaW5lIElORk9fWFhCVUZfQlVTWSAweDAwNDAKLQotI2RlZmluZQlESUdJX0dFVENICSgnZCc8PDgpIHwgMjQ1CQkvKiBnZXQgYm9hcmQgaW5mbyAgICAgICAgICAqLwotCi0vKiBCb2FyZCB0eXBlIGRlZmluaXRpb25zICovCi0KLSNkZWZpbmUJU1VCVFlQRQkJMDAwNwotI2RlZmluZQlUX1BDWEkJCTAwMDAKLSNkZWZpbmUgVF9QQ1hNCQkwMDAxCi0jZGVmaW5lIFRfUENYRQkJMDAwMgotI2RlZmluZSBUX1BDWFIJCTAwMDMKLSNkZWZpbmUgVF9TUAkJMDAwNAotI2RlZmluZSBUX1NQX1BMVVMJMDAwNQotIwlkZWZpbmUgVF9IRVJDCTAwMDAKLSMJZGVmaW5lIFRfSE9VCTAwMDEKLSMJZGVmaW5lIFRfTE9OCTAwMDIKLSMJZGVmaW5lIFRfQ0hBCTAwMDMKLSNkZWZpbmUgRkFNSUxZCQkwMDcwCi0jZGVmaW5lIFRfQ09NWEkJCTAwMDAKLSNkZWZpbmUgVF9QQ1hYCQkwMDEwCi0jZGVmaW5lIFRfQ1gJCTAwMjAKLSNkZWZpbmUgVF9FUEMJCTAwMzAKLSNkZWZpbmUJVF9QQ0xJVEUJMDA0MAotI2RlZmluZQlUX1NQWFgJCTAwNTAKLSNkZWZpbmUJVF9BVlhYCQkwMDYwCi0jZGVmaW5lIFRfRFhCCQkwMDcwCi0jZGVmaW5lIFRfQTJLXzRfOAkwMDcwCi0jZGVmaW5lIEJVU1RZUEUJCTA3MDAKLSNkZWZpbmUgVF9JU0FCVVMJMDAwMAotI2RlZmluZSBUX01DQlVTCQkwMTAwCi0jZGVmaW5lCVRfRUlTQUJVUwkwMjAwCi0jZGVmaW5lCVRfUENJQlVTCTA0MDAKLQotLyogQm9hcmQgU3RhdGUgRGVmaW5pdGlvbnMgKi8KLQotI2RlZmluZQlCRF9SVU5OSU5HCTB4MAotI2RlZmluZQlCRF9SRUFTT04JMHg3ZgotI2RlZmluZQlCRF9OT1RGT1VORAkweDEKLSNkZWZpbmUJQkRfTk9JT1BPUlQJMHgyCi0jZGVmaW5lCUJEX05PTUVNCTB4MwotI2RlZmluZQlCRF9OT0JJT1MJMHg0Ci0jZGVmaW5lCUJEX05PRkVQCTB4NQotI2RlZmluZQlCRF9GQUlMRUQJMHg2Ci0jZGVmaW5lIEJEX0FMTE9DQVRFRAkweDcKLSNkZWZpbmUgQkRfVFJJQk9PVAkweDgKLSNkZWZpbmUJQkRfQkFES01FCTB4ODAKLQotI2RlZmluZSBESUdJX0xPT1BCQUNLCSAgICAgICgnZCc8PDgpIHwgMjUyCQkvKiBFbmFibGUvZGlzYWJsZSBVQVJUIGludGVybmFsIGxvb3BiYWNrICovCi0jZGVmaW5lIERJR0lfU1BPTEwgICAgICAgICAgICAoJ2QnPDw4KSB8IDI1NAkJLyogY2hhbmdlIHBvbGxlciByYXRlICAgKi8KLQotI2RlZmluZSBESUdJX1NFVENVU1RPTUJBVUQJX0lPVygnZScsIDEwNiwgaW50KQkvKiBTZXQgaW50ZWdlciBiYXVkIHJhdGUgKi8KLSNkZWZpbmUgRElHSV9HRVRDVVNUT01CQVVECV9JT1IoJ2UnLCAxMDcsIGludCkJLyogR2V0IGludGVnZXIgYmF1ZCByYXRlICovCi0jZGVmaW5lIERJR0lfUkVTRVRfUE9SVAkJKCdlJzw8OCkgfCA5MwkJLyogUmVzZXQgcG9ydAkJKi8KLQotI2VuZGlmIC8qIERJR0lfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZG93bmxkLmMgYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kb3dubGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY0YWEyZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kb3dubGQuYworKysgL2Rldi9udWxsCkBAIC0xLDc5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiAkSWQ6IGRvd25sZC5jLHYgMS42IDIwMDkvMDEvMTQgMTQ6MTA6NTQgbWFya2ggRXhwICQKLSAqLwotCi0vKgotKiogZG93bmxkLmMKLSoqCi0qKiAgVGhpcyBpcyB0aGUgZGFlbW9uIHRoYXQgc2VuZHMgdGhlIGZlcCwgYmlvcywgYW5kIGNvbmNlbnRyYXRvciBpbWFnZXMKLSoqICBmcm9tIHVzZXIgc3BhY2UgdG8gdGhlIGRyaXZlci4KLSoqIEJVR1M6Ci0qKiAgSWYgdGhlIGZpbGUgY2hhbmdlcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBkb3dubG9hZCwgeW91IHByb2JhYmx5Ci0qKiAgICAgd2lsbCBnZXQgd2hhdCB5b3UgZGVzZXJ2ZS4KLSoqCi0qLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL2Vycm5vLmg+Ci0KLSNpbmNsdWRlICJkZ2FwX3R5cGVzLmgiCi0jaW5jbHVkZSAiZGlnaS5oIgotI2luY2x1ZGUgImRnYXBfZmVwNS5oIgotCi0jaW5jbHVkZSAiZGdhcF9kb3dubGQuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG1hbGxvYy5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi1jaGFyCQkqcGdtOwotdm9pZAkJbXlwZXJyb3IoKTsKLQotLyoKLSoqICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGRpZmZlcmVudCBpbWFnZXMgYXZhaWxhYmxlCi0qKiAgdG8gZ2l2ZSB0byB0aGUgZHJpdmVyLiAgSXQgaXMgYXJyYW5nZWQgc28gdGhhdCB0aGUgdGhpbmdzIHRoYXQgYXJlCi0qKiAgY29uc3RhbnRzIG9yIHRoYXQgaGF2ZSBkZWZhdWx0cyBhcmUgZmlyc3QgaW50aGUgc3RydWN1dHJlIHRvIHNpbXBsaWZ5Ci0qKiAgdGhlIHRhYmxlIG9mIGluaXRpYWxpemVycy4KLSovCi1zdHJ1Y3QgaW1hZ2VfaW5mbyB7Ci0Jc2hvcnQJdHlwZTsJCS8qIGJpb3MsIGZlcCwgY29uYyAqLwotCXNob3J0CWZhbWlseTsJCS8qIGJvYXJkcyB0aGlzIGFwcGxpZXMgdG8gKi8KLQlzaG9ydAlzdWJ0eXBlOwkvKiBzdWJ0eXBlICovCi0JaW50CWxlbjsJCS8qIHNpemUgb2YgaW1hZ2UgKi8KLQljaGFyCSppbWFnZTsJCS8qIGlvY3RsIHN0cnVjdCArIGltYWdlICovCi0JY2hhcgkqbmFtZTsKLQljaGFyCSpmbmFtZTsJCS8qIGZpbGVuYW1lIG9mIGJpbmFyeSAoaS5lLiAiYXNmZXAuYmluIikgKi8KLQljaGFyCSpwYXRobmFtZTsJLyogcGF0aG5hbWUgdG8gdGhpcyBiaW5hcnkgKCIvZXRjL2RnYXAveHJmZXAuYmluIik7ICovCi0JdGltZV90CW10aW1lOwkJLyogTGFzdCBtb2RpZmljYXRpb24gdGltZSAqLwotfTsKLQotI2RlZmluZSBJQklPUwkwCi0jZGVmaW5lCUlGRVAJMQotI2RlZmluZQlJQ09OQwkyCi0jZGVmaW5lIElDT05GSUcJMwotI2RlZmluZQlJQkFECTQKLQotI2RlZmluZSBERUZBVUxUX0xPQyAiL2xpYi9maXJtd2FyZS9kZ2FwLyIKLQotc3RydWN0IGltYWdlX2luZm8JKmltYWdlX2xpc3Q7Ci1pbnQJCQluaW1hZ2VzLCBjb3VudDsKLQotc3RydWN0IGltYWdlX2luZm8gaW1hZ2VzW10gPSB7Ci17SUJJT1MsIFRfRVBDLCAgICAgIFNVQlRZUEUsIDAsIE5VTEwsICJFUEMvWCIsCSJmeGJpb3MuYmluIiwgREVGQVVMVF9MT0MgImZ4Ymlvcy5iaW4iLCAwIH0sCi17SUZFUCwgIFRfRVBDLCAgICAgIFNVQlRZUEUsIDAsIE5VTEwsICJFUEMvWCIsCSJmeGZlcC5iaW4iLCBERUZBVUxUX0xPQyAiZnhmZXAuYmluIiwgMCB9LAote0lDT05DLCBUX0VQQywgICAgICBTVUJUWVBFLCAwLCBOVUxMLCAiRVBDL1giLAkiZnhjb24uYmluIiwgREVGQVVMVF9MT0MgImZ4Y29uLmJpbiIsIDAgfSwKLQote0lCSU9TLCBUX0NYLCAgICAgICBTVUJUWVBFLCAwLCBOVUxMLCAiQy9YIiwJImN4Ymlvcy5iaW4iLCBERUZBVUxUX0xPQyAiY3hiaW9zLmJpbiIsIDAgfSwKLXtJRkVQLCAgVF9DWCwgICAgICAgU1VCVFlQRSwgMCwgTlVMTCwgIkMvWCIsCSJjeGhvc3QuYmluIiwgREVGQVVMVF9MT0MgImN4aG9zdC5iaW4iLCAwIH0sCi0KLXtJQklPUywgVF9DWCwgICAgICAgVF9QQ0lCVVMsIDAsIE5VTEwsICJDL1ggUENJIiwgImN4cGJpb3MuYmluIiwgREVGQVVMVF9MT0MgImN4cGJpb3MuYmluIiwgMCB9LAote0lGRVAsICBUX0NYLCAgICAgICBUX1BDSUJVUywgMCwgTlVMTCwgIkMvWCBQQ0kiLCAiY3hwZmVwLmJpbiIsIERFRkFVTFRfTE9DICJjeHBmZXAuYmluIiwgMCB9LAotCi17SUNPTkMsIFRfQ1gsICAgICAgIFNVQlRZUEUsIDAsIE5VTEwsICJDL1giLAkiY3hjb24uYmluIiwgREVGQVVMVF9MT0MgImN4Y29uLmJpbiIsIDAgfSwKLXtJQ09OQywgVF9DWCwgICAgICAgU1VCVFlQRSwgMCwgTlVMTCwgIkMvWCIsCSJpYm1jeGNvbi5iaW4iLCBERUZBVUxUX0xPQyAiaWJtY3hjb24uYmluIiwgMCB9LAote0lDT05DLCBUX0NYLCAgICAgICBTVUJUWVBFLCAwLCBOVUxMLCAiQy9YIiwJImlibWVuY29uLmJpbiIsIERFRkFVTFRfTE9DICJpYm1lbmNvbi5iaW4iLCAwIH0sCi0KLXtJQklPUywgRkFNSUxZLCAgIFRfUENYUiwgMCwgTlVMTCwgIlBDWFIiLAkieHJiaW9zLmJpbiIsIERFRkFVTFRfTE9DICJ4cmJpb3MuYmluIiwgMCB9LAote0lGRVAsICBGQU1JTFksICAgVF9QQ1hSLCAwLCAgTlVMTCwgICJQQ1hSIiwJInhyZmVwLmJpbiIsIERFRkFVTFRfTE9DICJ4cmZlcC5iaW4iLCAwICB9LAotCi17SUJJT1MsIFRfUENMSVRFLCAgIFNVQlRZUEUsIDAsIE5VTEwsICJYL2VtIiwJInN4Ymlvcy5iaW4iLCBERUZBVUxUX0xPQyAic3hiaW9zLmJpbiIsIDAgfSwKLXtJRkVQLCAgVF9QQ0xJVEUsICAgU1VCVFlQRSwgMCwgIE5VTEwsICAiWC9lbSIsCSJzeGZlcC5iaW4iLCBERUZBVUxUX0xPQyAic3hmZXAuYmluIiwgMCAgfSwKLQote0lCSU9TLCBUX0VQQywgICAgICBUX1BDSUJVUywgMCwgTlVMTCwgIlBDSSIsCSJwY2liaW9zLmJpbiIsIERFRkFVTFRfTE9DICJwY2liaW9zLmJpbiIsIDAgfSwKLXtJRkVQLCAgVF9FUEMsICAgICAgVF9QQ0lCVVMsIDAsIE5VTEwsICJQQ0kiLAkicGNpZmVwLmJpbiIsIERFRkFVTFRfTE9DICJwY2lmZXAuYmluIiwgMCB9LAote0lDT05GSUcsIDAsCSAgICAwLCAwLCBOVUxMLCAgICAgICAgIE5VTEwsCSJkZ2FwLmNvbmYiLAkiL2V0Yy9kZ2FwLmNvbmYiLCAwIH0sCi0KLS8qIElCQUQvTlVMTCBlbnRyeSBpbmRpY2F0aW5nIGVuZC1vZi10YWJsZSAqLwotCi17SUJBRCwgIDAsICAgICAwLCAwLCAgTlVMTCwgIE5VTEwsIE5VTEwsIE5VTEwsIDAgfQotCi19IDsKLQotaW50IAllcnJvcnByaW50ID0gMTsKLWludCAJbm9kbGRwcmludCA9IDE7Ci1pbnQJZGVidWdmbGFnOwotaW50IAlmZDsKLQotc3RydWN0IGRvd25sZF90ICppcDsJLyogSW1hZ2UgcG9pbnRlciBpbiBjdXJyZW50IGltYWdlICAqLwotc3RydWN0IGRvd25sZF90ICpkcDsgCS8qIGNvbmMuIGRvd25sb2FkICovCi0KLQotLyoKLSAqIFRoZSBzYW1lIGZvciBlaXRoZXIgdGhlIEZFUCBvciB0aGUgQklPUy4KLSAqICBBcHBlbmQgdGhlIGRvd25sZGlvIGhlYWRlciwgaXNzdWUgdGhlIGlvY3RsLCB0aGVuIGZyZWUKLSAqICB0aGUgYnVmZmVyLiAgTm90IGhvcnJpYmx5IENQVSBlZmZpY2llbnQsIGJ1dCBxdWl0ZSBSQU0gZWZmaWNpZW50LgotICovCi0KLXZvaWQgc3F1aXJ0KGludCByZXFfdHlwZSwgaW50IGJkaWQsIHN0cnVjdCBpbWFnZV9pbmZvICppaSkKLXsKLQlzdHJ1Y3QgZG93bmxkaW8JKmRsaW9wOwotCWludCBzaXplX2J1ZjsKLQlpbnQgc2ZkOwotCXN0cnVjdCBzdGF0IHNiOwotCi0JLyoKLQkgKiBJZiB0aGlzIGJpbmFyeSBjb21lcyBmcm9tIGEgZmlsZSwgc3RhdCBpdCB0byBzZWUgaG93Ci0JICogbGFyZ2UgaXQgaXMuIFllcywgd2UgaW50ZW50aW9uYWxseSBkbyB0aGlzIGVhY2gKLQkgKiB0aW1lIGZvciB0aGUgYmluYXJ5IG1heSBjaGFuZ2UgYmV0d2VlbiBsb2Fkcy4KLQkgKi8KLQotCWlmIChpaS0+cGF0aG5hbWUpIHsKLQkJc2ZkID0gb3BlbihpaS0+cGF0aG5hbWUsIE9fUkRPTkxZKTsKLQotCQlpZiAoc2ZkIDwgMCApIHsKLQkJCW15cGVycm9yKGlpLT5wYXRobmFtZSk7Ci0JCQlnb3RvIHNxdWlydF9lbmQ7Ci0JCX0KLQotCQlpZiAoZnN0YXQoc2ZkLCAmc2IpID09IC0xICkgewotCQkJbXlwZXJyb3IoaWktPnBhdGhuYW1lKTsKLQkJCWdvdG8gc3F1aXJ0X2VuZDsKLQkJfQotCi0JCWlpLT5sZW4gPSBzYi5zdF9zaXplOwotCX0KLQotCXNpemVfYnVmID0gaWktPmxlbiArIHNpemVvZihzdHJ1Y3QgZG93bmxkaW8pOwotCi0JLyoKLQkgKiBUaGlzIGJ1ZmZlciB3aWxsIGJlIGZyZWVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmdW5jdGlvbi4gIEl0IGlzCi0JICogbm90IHJlc2lsaWVudCBhbmQgc2hvdWxkIGJlIGFyb3VuZCBvbmx5IGxvbmcgZW5vdWdoIGZvciB0aGUgZC9sCi0JICogdG8gaGFwcGVuLgotCSAqLwotCWRsaW9wID0gKHN0cnVjdCBkb3dubGRpbyAqKSBtYWxsb2Moc2l6ZV9idWYpOwotCi0JaWYgKGRsaW9wID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsIiVzOiBjYW4ndCBnZXQgJWQgYnl0ZXMgb2YgbWVtb3J5OyBhYm9ydGluZ1xuIiwKLQkJCXBnbSwgc2l6ZV9idWYpOwotCQlleGl0ICgxKTsKLQl9Ci0KLQkvKiBOb3csIHN0aWNrIHRoZSBpbWFnZSBpbiBmZXBpbWFnZS4gIFRoaXMgY2FuIGNvbWUgZnJvbSBlaXRoZXIKLQkgKiAgdGhlIGNvbXBpbGVkLWluIGltYWdlIG9yIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0JICovCi0JaWYgKGlpLT5wYXRobmFtZSkKLQkJcmVhZChzZmQsIGRsaW9wLT5pbWFnZS5maS5mZXBpbWFnZSwgaWktPmxlbik7Ci0JZWxzZQotCQltZW1jcHkoZGxpb3AgLT5pbWFnZS5maS5mZXBpbWFnZSwgaWktPmltYWdlLCBpaS0+bGVuKTsKLQotCWRsaW9wLT5yZXFfdHlwZSA9IHJlcV90eXBlOwotCWRsaW9wLT5iZGlkID0gYmRpZDsKLQotCWRsaW9wLT5pbWFnZS5maS5sZW4gPSBpaS0+bGVuOwotCi0JaWYgKGRlYnVnZmxhZykKLQkJcHJpbnRmKCJzZW5kaW5nICVkIGJ5dGVzIG9mICVzICVzIGZyb20gJXNcbiIsCi0JCQlpaS0+bGVuLAotCQkJKGlpLT50eXBlID09IElGRVApID8gIkZFUCIgOiAoaWktPnR5cGUgPT0gSUJJT1MpID8gIkJJT1MiIDogIkNPTkZJRyIsCi0JCQlpaS0+bmFtZSA/IGlpLT5uYW1lIDogIiIsCi0JCQkoaWktPnBhdGhuYW1lKSA/IGlpLT5wYXRobmFtZSA6ICJpbnRlcm5hbCBpbWFnZSIgKTsKLQotCWlmIChpb2N0bChmZCwgRElHSV9ETFJFUV9TRVQsIChjaGFyICopIGRsaW9wKSA9PSAtMSkgewotCQlpZihlcnJvcnByaW50KSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwKLQkJCQkiJXM6IHdhcm5pbmcgLSBkb3dubG9hZCBpb2N0bCBmYWlsZWRcbiIscGdtKTsKLQkJCWVycm9ycHJpbnQgPSAwOwotCQl9Ci0JCXNsZWVwKDIpOwotCX0KLQotc3F1aXJ0X2VuZDoKLQotCWlmIChpaS0+cGF0aG5hbWUpIHsKLQkJY2xvc2Uoc2ZkKTsKLQl9Ci0JZnJlZShkbGlvcCk7Ci19Ci0KLQotLyoKLSAqICBTZWUgaWYgd2UgbmVlZCB0byByZWxvYWQgdGhlIGRvd25sb2FkIGltYWdlIGluIGNvcmUKLSAqCi0gKi8KLXZvaWQgY29uc2lkZXJfZmlsZV9yZXNjYW4oc3RydWN0IGltYWdlX2luZm8gKmlpKQotewotCWludCBzZmQ7Ci0JaW50IGxlbjsKLQlzdHJ1Y3Qgc3RhdCAJc2I7Ci0KLQkvKiBUaGlzIG9wZXJhdGlvbiBvbmx5IG1ha2VzIHNlbnNlIHdoZW4gd2UncmUgd29ya2luZyBmcm9tIGEgZmlsZSAqLwotCi0JaWYgKGlpLT5wYXRobmFtZSkgewotCi0JCXNmZCA9IG9wZW4gKGlpLT5wYXRobmFtZSwgT19SRE9OTFkpIDsKLQkJaWYgKHNmZCA8IDAgKSB7Ci0JCQlteXBlcnJvcihpaS0+cGF0aG5hbWUpOwotCQkJZXhpdCgxKSA7Ci0JCX0KLQotCQlpZiggZnN0YXQoc2ZkLCZzYikgPT0gLTEgKSB7Ci0JCQlteXBlcnJvcihpaS0+cGF0aG5hbWUpOwotCQkJZXhpdCgxKTsKLQkJfQotCi0JCS8qIElmIHRoZSBmaWxlIGhhc24ndCBjaGFuZ2VkIHNpbmNlIHdlIGxhc3QgZGlkIHRoaXMsCi0JCSAqIGFuZCB3ZSBoYXZlIG5vdCBkb25lIGEgZnJlZSgpIG9uIHRoZSBpbWFnZSwgYmFpbAotCQkgKi8KLQkJaWYgKGlpLT5pbWFnZSAmJiAoc2Iuc3RfbXRpbWUgPT0gaWktPm10aW1lKSkKLQkJCWdvdG8gZW5kX3Jlc2NhbjsKLQotCQlpaS0+bGVuID0gbGVuID0gc2Iuc3Rfc2l6ZTsKLQotCQkvKiBSZWNvcmQgdGhlIHRpbWVzdGFtcCBvZiB0aGUgZmlsZSAqLwotCQlpaS0+bXRpbWUgPSBzYi5zdF9tdGltZTsKLQotCQkvKiBpbWFnZSBzaG91bGQgYmUgTlVMTCB1bmxlc3MgdGhlcmUgaXMgYW4gaW1hZ2UgbWFsbG9jZWQKLQkJICogaW4gYWxyZWFkeS4gIEJlZm9yZSB3ZSBtYWxsb2MgYWdhaW4sIG1ha2Ugc3VyZSB3ZSBkb24ndAotCQkgKiBoYXZlIGEgbWVtb3J5IGxlYWsuCi0JCSAqLwotCQlpZiAoIGlpLT5pbWFnZSApIHsKLQkJCWZyZWUoIGlpLT5pbWFnZSApOwotCQkJLyogaWktPmltYWdlID0gTlVMTDsgKi8gLyogbm90IG5lY2Vzc2FyeSAqLwotCQl9Ci0KLQkJLyogVGhpcyBpbWFnZSB3aWxsIGJlIGtlcHQgb25seSBsb25nIGVub3VnaCBmb3IgdGhlCi0JCSAqIGRvd25sb2FkIHRvIGhhcHBlbi4gIEFmdGVyIHNlbmRpbmcgdGhlIGxhc3QgYmxvY2ssCi0JCSAqIGl0IHdpbGwgYmUgZnJlZWQKLQkJICovCi0JCWlpLT5pbWFnZSA9IG1hbGxvYyhsZW4pIDsKLQotCQlpZiAoaWktPmltYWdlID09IE5VTEwpIHsKLQkJCWZwcmludGYoc3RkZXJyLAotCQkJCSIlczogY2FuJ3QgZ2V0ICVkIGJ5dGVzIG9mIG1lbW9yeTsgYWJvcnRpbmdcbiIsCi0JCQkJIHBnbSwgbGVuKTsKLQkJCWV4aXQgKDEpOwotCQl9Ci0KLQkJaWYgKHJlYWQoc2ZkLCBpaS0+aW1hZ2UsIGxlbikgPCBsZW4pIHsKLQkJCWZwcmludGYoc3RkZXJyLCIlczogcmVhZCBlcnJvciBvbiAlczsgYWJvcnRpbmdcbiIsCi0JCQkJcGdtLCBpaS0+cGF0aG5hbWUpOwotCQkJZXhpdCAoMSk7Ci0JCX0KLQotZW5kX3Jlc2NhbjoKLQkJY2xvc2Uoc2ZkKTsKLQotCX0KLX0KLQotLyoKLSAqIFNjYW4gZm9yIGltYWdlcyB0byBtYXRjaCB0aGUgZHJpdmVyIHJlcXVlc3RzCi0gKi8KLQotc3RydWN0IGltYWdlX2luZm8gKiBmaW5kX2NvbmNfaW1hZ2UoKQotewotCWludCB4OwotCXN0cnVjdCBpbWFnZV9pbmZvICppID0gTlVMTDsKLQotCWZvciAoIHggPSAwOyB4IDwgbmltYWdlczsgeCsrICkgewotCQlpPSZpbWFnZV9saXN0W3hdOwotCi0JCWlmKGktPnR5cGUgIT0gSUNPTkMpCi0JCQljb250aW51ZTsKLQotCQljb25zaWRlcl9maWxlX3Jlc2NhbihpKSA7Ci0KLQkJaXAgPSAoc3RydWN0IGRvd25sZF90ICopIGltYWdlX2xpc3RbeF0uaW1hZ2U7Ci0JCWlmIChpcCA9PSBOVUxMKSBjb250aW51ZTsKLQotCQkvKgotCQkgKiBXaGVuIEkgcmVtb3ZlZCBDbHVzdGVycG9ydCwgSSBrZXB0IG9ubHkgdGhlIGNvZGUgdGhhdCBJCi0JCSAqIHdhcyBTVVJFIHdhc24ndCBDbHVzdGVyUG9ydC4gIFdlIG1heSBub3QgbmVlZCB0aGUgbmV4dCB0d28KLQkJICogbGluZXMgb2YgY29kZS4KLQkJICovCi0JCWlmICgoZHAtPmRsX3R5cGUgIT0gJ1AnICkgJiYgKCBpcC0+ZGxfc3JldiA9PSBkcC0+ZGxfc3JldiApKQotCQkJcmV0dXJuIGk7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLQlzdHJ1Y3QgZG93bmxkaW8JZGxpbzsKLQlpbnQgCQlvZmZzZXQsIGJzaXplOwotCWludCAJCXg7Ci0JY2hhciAJCSpkb3duLCAqaW1hZ2UsICpmbmFtZTsKLQlzdHJ1Y3QgaW1hZ2VfaW5mbyAqaWk7Ci0KLQlwZ20gPSBhcmd2WzBdOwotCWRwID0gJmRsaW8uaW1hZ2UuZGw7CQkvKiBjb25jLiBkb3dubG9hZCAqLwotCi0Jd2hpbGUoKGFyZ2MgPiAyKSAmJiAhc3RyY21wKGFyZ3ZbMV0sIi1kIikpIHsKLQkJZGVidWdmbGFnKysgOwotCQlhcmdjLS0gOwotCQlhcmd2KysgOwotCX0KLQotCWlmKGFyZ2MgPCAyKSB7Ci0JCWZwcmludGYoc3RkZXJyLAotCQkJInVzYWdlOiAlcyBkb3dubG9hZC1kZXZpY2UgW2ltYWdlLWZpbGVdIC4uLlxuIiwKLQkJCXBnbSk7Ci0JCWV4aXQoMSk7Ci0JfQotCi0KLQotCS8qCi0JICogRGFlbW9uaXplLCB1bmxlc3MgZGVidWdnaW5nIGlzIHR1cm5lZCBvbi4KLQkgKi8KLQlpZiAoZGVidWdmbGFnID09IDApIHsKLQkJc3dpdGNoIChmb3JrKCkpCi0JCXsKLQkJY2FzZSAwOgotCQkJYnJlYWs7Ci0KLQkJY2FzZSAtMToKLQkJCXJldHVybiAxOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXNldHNpZCgpOwotCi0JCS8qCi0JCSAqIFRoZSBjaGlsZCBubyBsb25nZXIgbmVlZHMgInN0ZGluIiwgInN0ZG91dCIsIG9yICJzdGRlcnIiLAotCQkgKiBhbmQgc2hvdWxkIG5vdCBibG9jayBwcm9jZXNzZXMgd2FpdGluZyBmb3IgdGhlbSB0byBjbG9zZS4KLQkJICovCi0JCWZjbG9zZShzdGRpbik7Ci0JCWZjbG9zZShzdGRvdXQpOwotCQlmY2xvc2Uoc3RkZXJyKTsKLQotCX0KLQotCXdoaWxlICgxKSB7Ci0JCWlmKCAoZmQgPSBvcGVuKGFyZ3ZbMV0sIE9fUkRXUikpID09IC0xICkgewotCQkJc2xlZXAoMSk7Ci0JCX0KLQkJZWxzZQotCQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkqKiBjcmVhdGUgYSBsaXN0IG9mIGltYWdlcyB0byBzZWFyY2ggdGhyb3VnaCB3aGVuIHRyeWluZyB0byBtYXRjaAotCSoqIHJlcXVlc3RzIGZyb20gdGhlIGRyaXZlci4gIFB1dCBpbWFnZXMgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGluCi0JKiogdGhlIGxpc3QgYmVmb3JlIGJ1aWx0IGluIGltYWdlcyBzbyB0aGF0IHRoZSBjb21tYW5kIGxpbmUgaW1hZ2VzCi0JKiogY2FuIG92ZXJyaWRlIHRoZSBidWlsdCBpbiBvbmVzLgotCSovCi0KLQkvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGxpc3QgKi8KLQotCW5pbWFnZXMgPSBhcmdjIC0gMjsKLQotCS8qIGNvdW50IHRoZSBudW1iZXIgb2YgZGVmYXVsdCBsaXN0IGVudHJpZXMgKi8KLQotCWZvciAoY291bnQgPSAwOyBpbWFnZXNbY291bnRdLnR5cGUgIT0gSUJBRDsgKytjb3VudCkgOwotCi0JbmltYWdlcyArPSBjb3VudDsKLQotCS8qIFJlYWxseSBzaG91bGQganVzdCByZW1vdmUgdGhlIHZhcmlhYmxlICJpbWFnZV9saXN0Ii4uLi4gcm9iZXJ0bCAqLwotCWltYWdlX2xpc3QgPSBpbWFnZXM7Ci0KLQkvKiBnZXQgdGhlIGltYWdlcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKi8KLQlmb3IoeCA9IDI7IHggPCBhcmdjOyB4KyspIHsKLQkJaW50IHh4OwotCi0JCS8qCi0JCSAqIHN0cmlwIG9mZiBhbnkgbGVhZGluZyBwYXRoIGluZm9ybWF0aW9uIGZvcgotCQkgKiBkZXRlcm1pbmluZyBmaWxlIHR5cGUKLQkJICovCi0JCWlmKCAoZm5hbWUgPSBzdHJyY2hyKGFyZ3ZbeF0sJy8nKSkgPT0gTlVMTCkKLQkJCWZuYW1lID0gYXJndlt4XTsKLQkJZWxzZQotCQkJZm5hbWUrKzsJLyogc2tpcCB0aGUgc2xhc2ggKi8KLQotCQlmb3IgKHh4ID0gMDsgeHggPCBjb3VudDsgeHgrKykgewotCQkJaWYgKHN0cmNtcChmbmFtZSwgaW1hZ2VzW3h4XS5mbmFtZSkgPT0gMCApIHsKLQkJCQlpbWFnZXNbeHhdLnBhdGhuYW1lID0gYXJndlt4XTsKLQotCQkJCS8qIGltYWdlIHNob3VsZCBiZSBOVUxMIHVudGlsICovCi0JCQkJLyogc3BhY2UgaXMgbWFsbG9jZWQgKi8KLQkJCQlpbWFnZXNbeHhdLmltYWdlID0gTlVMTDsKLQkJCX0KLQkJfQotCX0KLQotICAgICAgICBzbGVlcCgzKTsKLQotCS8qCi0JKiogRW5kbGVzcyBsb29wOiBnZXQgYSByZXF1ZXN0IGZyb20gdGhlIGZlcCwgYW5kIHNlcnZpY2UgdGhhdCByZXF1ZXN0LgotCSovCi0JZm9yKDs7KSB7Ci0JCS8qIGdldCB0aGUgcmVxdWVzdCAqLwotCQlpZiAoZGVidWdmbGFnKQotCQkJcHJpbnRmKCJiNCBnZXQgaW9jdGwuLi4iKTsKLQotCQlpZiAoaW9jdGwoZmQsRElHSV9ETFJFUV9HRVQsICZkbGlvKSA9PSAtMSApIHsKLQkJCWlmIChlcnJvcnByaW50KSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJCSIlczogd2FybmluZyAtIGRvd25sb2FkIGlvY3RsIGZhaWxlZFxuIiwKLQkJCQkJcGdtKTsKLQkJCQllcnJvcnByaW50ID0gMDsKLQkJCX0KLQkJCXNsZWVwKDIpOwotCQl9IGVsc2UgewotCQkJaWYgKGRlYnVnZmxhZykKLQkJCQlwcmludGYoImRsaW8ucmVxX3R5cGUgaXMgJWQgYmQgJWRcbiIsCi0JCQkJCWRsaW8ucmVxX3R5cGUsZGxpby5iZGlkKTsKLQotCQkJc3dpdGNoKGRsaW8ucmVxX3R5cGUpIHsKLQkJCWNhc2UgRExSRVFfQklPUzoKLQkJCQkvKgotCQkJCSoqIGZpbmQgdGhlIGJpb3MgaW1hZ2UgZm9yIHRoaXMgdHlwZQotCQkJCSovCi0JCQkJZm9yICggeCA9IDA7IHggPCBuaW1hZ2VzOyB4KysgKSB7Ci0JCQkJCWlmKGltYWdlX2xpc3RbeF0udHlwZSAhPSBJQklPUykKLQkJCQkJCWNvbnRpbnVlOwotCi0JCQkJCWlmICgoZGxpby5pbWFnZS5maS50eXBlICYgRkFNSUxZKSA9PQotCQkJCQkJaW1hZ2VfbGlzdFt4XS5mYW1pbHkpIHsKLQotCQkJCQkJaWYgKCBpbWFnZV9saXN0W3hdLmZhbWlseSA9PSBUX0NYICAgKSB7Ci0JCQkJCQkJaWYgKChkbGlvLmltYWdlLmZpLnR5cGUgJiBCVVNUWVBFKQotCQkJCQkJCQk9PSBUX1BDSUJVUyApIHsKLQkJCQkJCQkJaWYgKCBpbWFnZV9saXN0W3hdLnN1YnR5cGUKLQkJCQkJCQkJCT09IFRfUENJQlVTICkKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoIGltYWdlX2xpc3RbeF0uZmFtaWx5ID09IFRfRVBDICkgewotCQkJCQkJLyogSWYgc3VidHlwZSBvZiBpbWFnZSBpcyBUX1BDSUJVUywgaXQgaXMgKi8KLQkJCQkJCS8qIGEgUENJIEVQQyBpbWFnZSwgc28gdGhlIGJvYXJkIG11c3QgKi8KLQkJCQkJCS8qIGhhdmUgYnVzIHR5cGUgVF9QQ0lCVVMgdG8gbWF0Y2ggKi8KLQkJCQkJCQlpZiAoKGRsaW8uaW1hZ2UuZmkudHlwZSAmIEJVU1RZUEUpCi0JCQkJCQkJCT09IFRfUENJQlVTICkgewotCQkJCQkJCQlpZiAoIGltYWdlX2xpc3RbeF0uc3VidHlwZQotCQkJCQkJCQkJPT0gVF9QQ0lCVVMgKQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCS8qIE5PTiBQQ0kgRVBDIGRvZXNuJ3QgdXNlIFBDSSBpbWFnZSAqLwotCQkJCQkJCQlpZiAoIGltYWdlX2xpc3RbeF0uc3VidHlwZQotCQkJCQkJCQkJIT0gVF9QQ0lCVVMgKQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKChkbGlvLmltYWdlLmZpLnR5cGUgJiBTVUJUWVBFKSA9PSBpbWFnZV9saXN0W3hdLnN1YnR5cGUpIHsKLQkJCQkJCS8qIFBDWFIgYm9hcmQgd2lsbCBicmVhayBvdXQgb2YgdGhlIGxvb3AgaGVyZSAqLwotCQkJCQkJaWYgKCBpbWFnZV9saXN0W3hdLnN1YnR5cGUgPT0gVF9QQ1hSICAgKSB7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICggeCA+PSBuaW1hZ2VzKSB7Ci0JCQkJCS8qCi0JCQkJCSoqIG5vIHZhbGlkIGltYWdlcyBleGlzdAotCQkJCQkqLwotCQkJCQlpZihub2RsZHByaW50KSB7Ci0JCQkJCQlmcHJpbnRmKHN0ZGVyciwKLQkJCQkJCSIlczogY2Fubm90IGZpbmQgY29ycmVjdCBCSU9TIGltYWdlXG4iLAotCQkJCQkJCXBnbSk7Ci0JCQkJCQlub2RsZHByaW50ID0gMDsKLQkJCQkJfQotCQkJCQlkbGlvLmltYWdlLmZpLnR5cGUgPSAtMTsKLQkJCQkJaWYgKGlvY3RsKGZkLCBESUdJX0RMUkVRX1NFVCwgJmRsaW8pID09IC0xKSB7Ci0JCQkJCQlpZiAoZXJyb3JwcmludCkgewotCQkJCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkJCSIlczogd2FybmluZyAtIGRvd25sb2FkIGlvY3RsIGZhaWxlZFxuIiwKLQkJCQkJCQlwZ20pOwotCQkJCQkJCWVycm9ycHJpbnQgPSAwOwotCQkJCQkJfQotCQkJCQkJc2xlZXAoMik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXNxdWlydChkbGlvLnJlcV90eXBlLCBkbGlvLmJkaWQsICZpbWFnZV9saXN0W3hdKTsKLQkJCQlicmVhayA7Ci0KLQkJCWNhc2UgRExSRVFfRkVQOgotCQkJCS8qCi0JCQkJKiogZmluZCB0aGUgZmVwIGltYWdlIGZvciB0aGlzIHR5cGUKLQkJCQkqLwotCQkJCWZvciAoIHggPSAwOyB4IDwgbmltYWdlczsgeCsrICkgewotCQkJCQlpZihpbWFnZV9saXN0W3hdLnR5cGUgIT0gSUZFUCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpZiggKGRsaW8uaW1hZ2UuZmkudHlwZSAmIEZBTUlMWSkgPT0KLQkJCQkJCWltYWdlX2xpc3RbeF0uZmFtaWx5ICkgewotCQkJCQkJaWYgKCBpbWFnZV9saXN0W3hdLmZhbWlseSA9PSBUX0NYICAgKSB7Ci0JCQkJCQkJLyogQy9YIFBDSSBib2FyZCAqLwotCQkJCQkJCWlmICgoZGxpby5pbWFnZS5maS50eXBlICYgQlVTVFlQRSkKLQkJCQkJCQkJPT0gVF9QQ0lCVVMgKSB7Ci0JCQkJCQkJCWlmICggaW1hZ2VfbGlzdFt4XS5zdWJ0eXBlCi0JCQkJCQkJCQk9PSBUX1BDSUJVUyApCi0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLyogUmVndWxhciBDWCAqLwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmICggaW1hZ2VfbGlzdFt4XS5mYW1pbHkgPT0gVF9FUEMgICApICB7Ci0JCQkJCQkvKiBJZiBzdWJ0eXBlIG9mIGltYWdlIGlzIFRfUENJQlVTLCBpdCBpcyAqLwotCQkJCQkJLyogYSBQQ0kgRVBDIGltYWdlLCBzbyB0aGUgYm9hcmQgbXVzdCAqLwotCQkJCQkJLyogaGF2ZSBidXMgdHlwZSBUX1BDSUJVUyB0byBtYXRjaCAqLwotCQkJCQkJCWlmICgoZGxpby5pbWFnZS5maS50eXBlICYgQlVTVFlQRSkKLQkJCQkJCQkJPT0gVF9QQ0lCVVMgKSB7Ci0JCQkJCQkJCWlmICggaW1hZ2VfbGlzdFt4XS5zdWJ0eXBlCi0JCQkJCQkJCQk9PSBUX1BDSUJVUyApCi0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLyogTk9OIFBDSSBFUEMgZG9lc24ndCB1c2UgUENJIGltYWdlICovCi0JCQkJCQkJCWlmICggaW1hZ2VfbGlzdFt4XS5zdWJ0eXBlCi0JCQkJCQkJCQkhPSBUX1BDSUJVUyApCi0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoKGRsaW8uaW1hZ2UuZmkudHlwZSAmIFNVQlRZUEUpID09IGltYWdlX2xpc3RbeF0uc3VidHlwZSkgewotCQkJCQkJLyogUENYUiBib2FyZCB3aWxsIGJyZWFrIG91dCBvZiB0aGUgbG9vcCBoZXJlICovCi0JCQkJCQlpZiAoIGltYWdlX2xpc3RbeF0uc3VidHlwZSA9PSBUX1BDWFIgICApIHsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCB4ID49IG5pbWFnZXMpIHsKLQkJCQkJLyoKLQkJCQkJKiogbm8gdmFsaWQgaW1hZ2VzIGV4aXN0Ci0JCQkJCSovCi0JCQkJCWlmKG5vZGxkcHJpbnQpIHsKLQkJCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkJIiVzOiBjYW5ub3QgZmluZCBjb3JyZWN0IEZFUCBpbWFnZVxuIiwKLQkJCQkJCQlwZ20pOwotCQkJCQkJbm9kbGRwcmludCA9IDA7Ci0JCQkJCX0KLQkJCQkJZGxpby5pbWFnZS5maS50eXBlPS0xOwotCQkJCQlpZiggaW9jdGwoZmQsRElHSV9ETFJFUV9TRVQsJmRsaW8pID09IC0xICkgewotCQkJCQkJaWYoZXJyb3JwcmludCkgewotCQkJCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkJIiVzOiB3YXJuaW5nIC0gZG93bmxvYWQgaW9jdGwgZmFpbGVkXG4iLAotCQkJCQkJCQlwZ20pOwotCQkJCQkJCWVycm9ycHJpbnQ9MDsKLQkJCQkJCX0KLQkJCQkJCXNsZWVwKDIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlzcXVpcnQoZGxpby5yZXFfdHlwZSwgZGxpby5iZGlkLCAmaW1hZ2VfbGlzdFt4XSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgRExSRVFfREVWQ1JFQVRFOgotCQkJCXsKLQkJCQkJY2hhciBzdHJpbmdbMTAyNF07Ci0jaWYgMAotCQkJCQlzcHJpbnRmKHN0cmluZywgIiVzIC9wcm9jL2RnYXAvJWQvbWtub2QiLCBERUZTSEVMTCwgZGxpby5iZGlkKTsKLSNlbmRpZgotCQkJCQlzcHJpbnRmKHN0cmluZywgIiVzIC91c3Ivc2Jpbi9kZ2FwX3VwZGF0ZWRldnMgJWQiLCBERUZTSEVMTCwgZGxpby5iZGlkKTsKLQkJCQkJc3lzdGVtKHN0cmluZyk7Ci0KLQkJCQkJaWYgKGRlYnVnZmxhZykKLQkJCQkJCXByaW50ZigiQ3JlYXRlZCBEZXZpY2VzLlxuIik7Ci0JCQkJCWlmIChpb2N0bChmZCwgRElHSV9ETFJFUV9TRVQsICZkbGlvKSA9PSAtMSApIHsKLQkJCQkJCWlmKGVycm9ycHJpbnQpIHsKLQkJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB3YXJuaW5nIC0gREVWQ1JFQVRFIGlvY3RsIGZhaWxlZFxuIixwZ20pOwotCQkJCQkJCWVycm9ycHJpbnQgPSAwOwotCQkJCQkJfQotCQkJCQkJc2xlZXAoMik7Ci0JCQkJCX0KLQkJCQkJaWYgKGRlYnVnZmxhZykKLQkJCQkJCXByaW50ZigiQWZ0ZXIgaW9jdGwgc2V0IC0gQ3JlYXRlZCBEZXZpY2UuXG4iKTsKLQkJCQl9Ci0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBETFJFUV9DT05GSUc6Ci0JCQkJZm9yICggeCA9IDA7IHggPCBuaW1hZ2VzOyB4KysgKSB7Ci0JCQkJCWlmKGltYWdlX2xpc3RbeF0udHlwZSAhPSBJQ09ORklHKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWVsc2UKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWlmICggeCA+PSBuaW1hZ2VzKSB7Ci0JCQkJCS8qCi0JCQkJCSoqIG5vIHZhbGlkIGltYWdlcyBleGlzdAotCQkJCQkqLwotCQkJCQlpZihub2RsZHByaW50KSB7Ci0JCQkJCQlmcHJpbnRmKHN0ZGVyciwKLQkJCQkJCSIlczogY2Fubm90IGZpbmQgY29ycmVjdCBDT05GSUcgaW1hZ2VcbiIsCi0JCQkJCQkJcGdtKTsKLQkJCQkJCW5vZGxkcHJpbnQgPSAwOwotCQkJCQl9Ci0JCQkJCWRsaW8uaW1hZ2UuZmkudHlwZT0tMTsKLQkJCQkJaWYgKGlvY3RsKGZkLCBESUdJX0RMUkVRX1NFVCwgJmRsaW8pID09IC0xICkgewotCQkJCQkJaWYoZXJyb3JwcmludCkgewotCQkJCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkJIiVzOiB3YXJuaW5nIC0gZG93bmxvYWQgaW9jdGwgZmFpbGVkXG4iLAotCQkJCQkJCQlwZ20pOwotCQkJCQkJCWVycm9ycHJpbnQ9MDsKLQkJCQkJCX0KLQkJCQkJCXNsZWVwKDIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCXNxdWlydChkbGlvLnJlcV90eXBlLCBkbGlvLmJkaWQsICZpbWFnZV9saXN0W3hdKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBETFJFUV9DT05DOgotCQkJCS8qCi0JCQkJKiogZmluZCB0aGUgaW1hZ2UgbmVlZGVkIGZvciB0aGlzIGRvd25sb2FkCi0JCQkJKi8KLQkJCQlpZiAoIGRwLT5kbF9zZXEgPT0gMCApIHsKLQkJCQkJLyoKLQkJCQkJKiogZmluZCBpbWFnZSBmb3IgaGFyZHdhcmUgcmV2IHJhbmdlCi0JCQkJCSovCi0JCQkJCWZvciAoIHggPSAwOyB4IDwgbmltYWdlczsgeCsrICkgewotCQkJCQkJaWk9JmltYWdlX2xpc3RbeF07Ci0KLQkJCQkJCWlmKGltYWdlX2xpc3RbeF0udHlwZSAhPSBJQ09OQykKLQkJCQkJCQljb250aW51ZTsKLQotCQkJCQkJY29uc2lkZXJfZmlsZV9yZXNjYW4oaWkpIDsKLQotCQkJCQkJaXAgPSAoc3RydWN0IGRvd25sZF90ICopIGltYWdlX2xpc3RbeF0uaW1hZ2U7Ci0JCQkJCQlpZiAoaXAgPT0gTlVMTCkgY29udGludWU7Ci0KLQkJCQkJCS8qCi0JCQkJCQkgKiBXaGVuIEkgcmVtb3ZlZCBDbHVzdGVycG9ydCwgSSBrZXB0IG9ubHkgdGhlCi0JCQkJCQkgKiBjb2RlIHRoYXQgSSB3YXMgU1VSRSB3YXNuJ3QgQ2x1c3RlclBvcnQuCi0JCQkJCQkgKiBXZSBtYXkgbm90IG5lZWQgdGhlIG5leHQgZm91ciBsaW5lcyBvZiBjb2RlLgotCQkJCQkJICovCi0KLQkJCQkJCWlmICgoZHAtPmRsX3R5cGUgIT0gJ1AnICkgJiYKLQkJCQkJCSAoaXAtPmRsX2xyZXYgPD0gZHAtPmRsX2xyZXYgKSAmJgotCQkJCQkJICggZHAtPmRsX2xyZXYgPD0gaXAtPmRsX2hyZXYpKQotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJaWYgKCB4ID49IG5pbWFnZXMgKSB7Ci0JCQkJCQkvKgotCQkJCQkJKiogTm8gdmFsaWQgaW1hZ2VzIGV4aXN0Ci0JCQkJCQkqLwotCQkJCQkJaWYobm9kbGRwcmludCkgewotCQkJCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkJIiVzOiBjYW5ub3QgZmluZCBjb3JyZWN0IGRvd25sb2FkIGltYWdlICVkXG4iLAotCQkJCQkJCQlwZ20sIGRwLT5kbF9scmV2KTsKLQkJCQkJCQlub2RsZHByaW50PTA7Ci0JCQkJCQl9Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJfSBlbHNlIHsKLQkJCQkJLyoKLQkJCQkJKiogZmluZCBpbWFnZSB2ZXJzaW9uIHJlcXVpcmVkCi0JCQkJCSovCi0JCQkJCWlmICgoaWkgPSBmaW5kX2NvbmNfaW1hZ2UoKSkgPT0gTlVMTCApIHsKLQkJCQkJCS8qCi0JCQkJCQkqKiBObyB2YWxpZCBpbWFnZXMgZXhpc3QKLQkJCQkJCSovCi0JCQkJCQlmcHJpbnRmKHN0ZGVyciwKLQkJCQkJCSIlczogY2FuJ3QgZmluZCByZXN0IG9mIGRvd25sb2FkIGltYWdlPz9cbiIsCi0JCQkJCQkJcGdtKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLyoKLQkJCQkqKiBkb3dubG9hZCBibG9jayBvZiBpbWFnZQotCQkJCSovCi0KLQkJCQlvZmZzZXQgPSAxMDI0ICogZHAtPmRsX3NlcTsKLQotCQkJCS8qCi0JCQkJKiogdGVzdCBpZiBibG9jayByZXF1ZXN0ZWQgd2l0aGluIGltYWdlCi0JCQkJKi8KLQkJCQlpZiAoIG9mZnNldCA8IGlpLT5sZW4gKSB7Ci0KLQkJCQkJLyoKLQkJCQkJKiogaWYgaXQgaXMsIGRldGVybWluZSBibG9jayBzaXplLCBzZXQgc2VnbWVudCwKLQkJCQkJKiogc2V0IHNpemUsIHNldCBwb2ludGVycywgYW5kIGNvcHkgYmxvY2sKLQkJCQkJKi8KLQkJCQkJaWYgKCggYnNpemUgPSBpaS0+bGVuIC0gb2Zmc2V0ICkgPiAxMDI0ICkKLQkJCQkJCWJzaXplID0gMTAyNDsKLQotCQkJCQkvKgotCQkJCQkqKiBjb3B5IGltYWdlIHZlcnNpb24gaW5mbyB0byBkb3dubG9hZCBhcmVhCi0JCQkJCSovCi0JCQkJCWRwLT5kbF9zcmV2ID0gaXAtPmRsX3NyZXY7Ci0JCQkJCWRwLT5kbF9scmV2ID0gaXAtPmRsX2xyZXY7Ci0JCQkJCWRwLT5kbF9ocmV2ID0gaXAtPmRsX2hyZXY7Ci0KLQkJCQkJZHAtPmRsX3NlZyA9ICg2NCAqIGRwLT5kbF9zZXEpICsgaXAtPmRsX3NlZzsKLQkJCQkJZHAtPmRsX3NpemUgPSBic2l6ZTsKLQotCQkJCQlkb3duID0gKGNoYXIgKikmZHAtPmRsX2RhdGFbMF07Ci0JCQkJCWltYWdlID0gKGNoYXIgKikoKGNoYXIgKilpcCArIG9mZnNldCk7Ci0KLQkJCQkJbWVtY3B5KGRvd24sIGltYWdlLCBic2l6ZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvKgotCQkJCQkqKiBJbWFnZSBoYXMgYmVlbiBkb3dubG9hZGVkLCBzZXQgc2VnbWVudCBhbmQKLQkJCQkJKiogc2l6ZSB0byBpbmRpY2F0ZSBubyBtb3JlIGJsb2NrcwotCQkJCQkqLwotCQkJCQlkcC0+ZGxfc2VnID0gaXAtPmRsX3NlZzsKLQkJCQkJZHAtPmRsX3NpemUgPSAwOwotCi0JCQkJCS8qIE5vdywgd2UgY2FuIHJlbGVhc2UgdGhlIGNvbmNlbnRyYXRvciAqLwotCQkJCQkvKiBpbWFnZSBmcm9tIG1lbW9yeSBpZiB3ZSdyZSBydW5uaW5nICAqLwotCQkJCQkvKiBmcm9tIGZpbGVzeXN0ZW0gaW1hZ2VzICovCi0KLQkJCQkJaWYgKGlpLT5wYXRobmFtZSkKLQkJCQkJCWlmIChpaS0+aW1hZ2UpIHsKLQkJCQkJCQlmcmVlKGlpLT5pbWFnZSk7Ci0JCQkJCQkJaWktPmltYWdlID0gTlVMTDsKLQkJCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoZGVidWdmbGFnKQotCQkJCQkJcHJpbnRmKAotCQkJCQkJInNlbmRpbmcgY29uYyBkbCBzZWN0aW9uICVkIHRvICVzIGZyb20gJXNcbiIsCi0JCQkJCQkJZHAtPmRsX3NlcSwgaWktPm5hbWUsCi0JCQkJCQlpaS0+cGF0aG5hbWUgPyBpaS0+cGF0aG5hbWUgOiAiSW50ZXJuYWwgSW1hZ2UiKTsKLQotCQkJCWlmIChpb2N0bChmZCwgRElHSV9ETFJFUV9TRVQsICZkbGlvKSA9PSAtMSApIHsKLQkJCQkJaWYgKGVycm9ycHJpbnQpIHsKLQkJCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkJIiVzOiB3YXJuaW5nIC0gZG93bmxvYWQgaW9jdGwgZmFpbGVkXG4iLAotCQkJCQkJCXBnbSk7Ci0JCQkJCQllcnJvcnByaW50PTA7Ci0JCQkJCX0KLQkJCQkJc2xlZXAoMik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfSAvKiBzd2l0Y2ggKi8KLQkJfQotCQlpZiAoZGVidWdmbGFnID4gMSkgewotCQkJcHJpbnRmKCJwYXVzaW5nOiAiKTsgZmZsdXNoKHN0ZG91dCk7Ci0JCQlmZmx1c2goc3RkaW4pOwotCQkJd2hpbGUoZ2V0Y2hhcigpICE9ICdcbicpOwotCQkJCXByaW50ZigiY29udGludWluZ1xuIik7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0qKiBteXBlcnJvcigpCi0qKgotKiogIFNhbWUgYXMgbm9ybWFsIHBlcnJvcigpLCBidXQgcGxhY2VzIHRoZSBwcm9ncmFtIG5hbWUgYXQgdGhlIGJlZ2lubmluZwotKiogIG9mIHRoZSBtZXNzYWdlLgotKi8KLXZvaWQgbXlwZXJyb3IoY2hhciAqcykKLXsKLQlmcHJpbnRmKHN0ZGVyciwiJXM6ICVzOiAlcy5cbiIscGdtLCBzLCBzdHJlcnJvcihlcnJubykpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19jbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfY2xzLmMKaW5kZXggNzA4YWRiYi4uNjBkOWI2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19jbHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2Nscy5jCkBAIC04MjcsOSArODI3LDggQEAKIAkgKiBDaGVjayB0byBtYWtlIHN1cmUgaXRzIGZvciB1cy4KIAkgKi8KIAlpZiAoYnJkLT5tYWdpYyAhPSBER05DX0JPQVJEX01BR0lDKSB7Ci0JCUFQUigoCi0JCSAgICAiUmVjZWl2ZWQgaW50ZXJydXB0ICglZCkgd2l0aCBhIGJvYXJkIHBvaW50ZXIgIgotCQkJCQkJInRoYXQgd2Fzbid0IG91cnMhXG4iLCBpcnEpKTsKKwkJQVBSKCgiUmVjZWl2ZWQgaW50ZXJydXB0ICglZCkgd2l0aCBhIGJvYXJkIHBvaW50ZXIgdGhhdCB3YXNuJ3Qgb3VycyFcbiIsCisJCQkgIGlycSkpOwogCQlyZXR1cm4gSVJRX05PTkU7CiAJfQogCkBAIC04NDYsOCArODQ1LDcgQEAKIAkvKiBJZiAwLCBubyBpbnRlcnJ1cHRzIHBlbmRpbmcgKi8KIAlpZiAoIXBvbGxfcmVnKSB7CiAJCURQUl9JTlRSKCgKLQkJCSAiS2VybmVsIGludGVycnVwdGVkIHRvIG1lLCBidXQgbm8gcGVuZGluZyAiCi0JCQkJCQkJImludGVycnVwdHMuLi5cbiIpKTsKKwkJCSAiS2VybmVsIGludGVycnVwdGVkIHRvIG1lLCBidXQgbm8gcGVuZGluZyBpbnRlcnJ1cHRzLi4uXG4iKSk7CiAJCURHTkNfVU5MT0NLKGJyZC0+YmRfaW50cl9sb2NrLCBsb2NrX2ZsYWdzKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KQEAgLTEzODgsOCArMTM4Niw3IEBACiAJCXdyaXRlYigodGVtcCB8IFVBUlRfTENSX1NCQyksICZjaC0+Y2hfY2xzX3VhcnQtPmxjcik7CiAJCWNoLT5jaF9mbGFncyB8PSAoQ0hfQlJFQUtfU0VORElORyk7CiAJCURQUl9JT0NUTCgoCi0JCQkiUG9ydCAlZC4gU3RhcnRpbmcgVUFSVF9MQ1JfU0JDISBzdGFydDogJWx4ICIKLQkJCSJzaG91bGQgZW5kOiAlbHhcbiIsCisJCQkiUG9ydCAlZC4gU3RhcnRpbmcgVUFSVF9MQ1JfU0JDISBzdGFydDogJWx4IHNob3VsZCBlbmQ6ICVseFxuIiwKIAkJCWNoLT5jaF9wb3J0bnVtLCBqaWZmaWVzLCBjaC0+Y2hfc3RvcF9zZW5kaW5nX2JyZWFrKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfZHJpdmVyLmMKaW5kZXggYzIwNDI2Ni4uYjFhMzliMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2RyaXZlci5jCkBAIC04OCw3ICs4OCw3IEBACiAvKgogICogRmlsZSBvcGVyYXRpb25zIHBlcm1pdHRlZCBvbiBDb250cm9sL01hbmFnZW1lbnQgbWFqb3IuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRnbmNfQm9hcmRGb3BzID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRnbmNfQm9hcmRGb3BzID0KIHsKIAkub3duZXIJCT0JVEhJU19NT0RVTEUsCiAJLnVubG9ja2VkX2lvY3RsID0gIAlkZ25jX21nbXRfaW9jdGwsCkBAIC0yMzYsNyArMjM2LDcgQEAKIAkJaWYgKGRnbmNfTnVtQm9hcmRzKQogCQkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkZ25jX2RyaXZlcik7CiAJCWVsc2UKLQkJCXByaW50aygiV0FSTklORzogZGduYyBkcml2ZXIgbG9hZCBmYWlsZWQuICBObyBEaWdpIE5lbyBvciBDbGFzc2ljIGJvYXJkcyBmb3VuZC5cbiIpOworCQkJcHJfd2FybigiV0FSTklORzogZGduYyBkcml2ZXIgbG9hZCBmYWlsZWQuICBObyBEaWdpIE5lbyBvciBDbGFzc2ljIGJvYXJkcyBmb3VuZC5cbiIpOwogCiAJCWRnbmNfY2xlYW51cF9tb2R1bGUoKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX21nbXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbWdtdC5jCmluZGV4IDFjNWFiM2QuLmM1YjQyNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbWdtdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbWdtdC5jCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qIEZvciB0YXNrbGV0IGFuZCBpbnRlcnJ1cHQgc3RydWN0cy9kZWZpbmVzICovCiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgogI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgkvKiBGb3IgY29weV9mcm9tX3VzZXIvY29weV90b191c2VyICovCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgkvKiBGb3IgY29weV9mcm9tX3VzZXIvY29weV90b191c2VyICovCiAKICNpbmNsdWRlICJkZ25jX2RyaXZlci5oIgogI2luY2x1ZGUgImRnbmNfcGNpLmgiCkBAIC03Nyw4ICs3Nyw3IEBACiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CiAJCWRnbmNfbWdtdF9pbl91c2VbbWlub3JdKys7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCURHTkNfVU5MT0NLKGRnbmNfZ2xvYmFsX2xvY2ssIGxvY2tfZmxhZ3MpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTEwNyw5ICsxMDYsOCBAQAogCiAJLyogbWdtdCBkZXZpY2UgKi8KIAlpZiAobWlub3IgPCBNQVhNR01UREVWSUNFUykgewotCQlpZiAoZGduY19tZ210X2luX3VzZVttaW5vcl0pIHsKKwkJaWYgKGRnbmNfbWdtdF9pbl91c2VbbWlub3JdKQogCQkJZGduY19tZ210X2luX3VzZVttaW5vcl0gPSAwOwotCQl9CiAJfQogCURHTkNfVU5MT0NLKGRnbmNfZ2xvYmFsX2xvY2ssIGxvY2tfZmxhZ3MpOwogCkBAIC0xNTMsNyArMTUxLDcgQEAKIAkJRFBSX01HTVQoKCJESUdJX0dFVEREIHJldHVybmluZyBudW1ib2FyZHM6ICVkIHZlcnNpb246ICVzXG4iLAogCQkJZGRpLmRpbmZvX25ib2FyZHMsIGRkaS5kaW5mb192ZXJzaW9uKSk7CiAKLQkJaWYgKGNvcHlfdG9fdXNlcih1YXJnLCAmZGRpLCBzaXplb2YgKGRkaSkpKQorCQlpZiAoY29weV90b191c2VyKHVhcmcsICZkZGksIHNpemVvZihkZGkpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCWJyZWFrOwpAQCAtMTY1LDEzICsxNjMsMTMgQEAKIAogCQlzdHJ1Y3QgZGlnaV9pbmZvIGRpOwogCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmYnJkLCB1YXJnLCBzaXplb2YoaW50KSkpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZicmQsIHVhcmcsIHNpemVvZihpbnQpKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQl9CiAKIAkJRFBSX01HTVQoKCJESUdJX0dFVEJEIGFza2luZyBhYm91dCBib2FyZDogJWRcbiIsIGJyZCkpOwogCi0JCWlmICgoYnJkIDwgMCkgfHwgKGJyZCA+IGRnbmNfTnVtQm9hcmRzKSB8fCAoZGduY19OdW1Cb2FyZHMgPT0gMCkpCisJCWlmICgoYnJkIDwgMCkgfHwgKGJyZCA+IGRnbmNfTnVtQm9hcmRzKSB8fAorCQkgICAgKGRnbmNfTnVtQm9hcmRzID09IDApKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKIAkJbWVtc2V0KCZkaSwgMCwgc2l6ZW9mKGRpKSk7CkBAIC0xOTUsNyArMTkzLDcgQEAKIAkJRFBSX01HTVQoKCJESUdJX0dFVEJEIHJldHVybmluZyB0eXBlOiAleCBzdGF0ZTogJXggcG9ydHM6ICV4IHNpemU6ICV4XG4iLAogCQkJZGkuaW5mb19iZHR5cGUsIGRpLmluZm9fYmRzdGF0ZSwgZGkuaW5mb19ucG9ydHMsIGRpLmluZm9fcGh5c3NpemUpKTsKIAotCQlpZiAoY29weV90b191c2VyKHVhcmcsICZkaSwgc2l6ZW9mIChkaSkpKQorCQlpZiAoY29weV90b191c2VyKHVhcmcsICZkaSwgc2l6ZW9mKGRpKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQlicmVhazsKQEAgLTIwOSw5ICsyMDcsOCBAQAogCQl1aW50IGJvYXJkID0gMDsKIAkJdWludCBjaGFubmVsID0gMDsKIAotCQlpZiAoY29weV9mcm9tX3VzZXIoJm5pLCB1YXJnLCBzaXplb2YobmkpKSkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJm5pLCB1YXJnLCBzaXplb2YobmkpKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQl9CiAKIAkJRFBSX01HTVQoKCJESUdJX0dFVEJEIGFza2luZyBhYm91dCBib2FyZDogJWQgY2hhbm5lbDogJWRcbiIsCiAJCQluaS5ib2FyZCwgbmkuY2hhbm5lbCkpOwpAQCAtMjY4LDEyICsyNjUsMTQgQEAKIAkJbmkuY2ZsYWcgPSBjaC0+Y2hfY19jZmxhZzsKIAkJbmkubGZsYWcgPSBjaC0+Y2hfY19sZmxhZzsKIAotCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIENUU1BBQ0UgfHwgY2gtPmNoX2NfY2ZsYWcgJiBDUlRTQ1RTKQorCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIENUU1BBQ0UgfHwKKwkJICAgIGNoLT5jaF9jX2NmbGFnICYgQ1JUU0NUUykKIAkJCW5pLmhmbG93ID0gMTsKIAkJZWxzZQogCQkJbmkuaGZsb3cgPSAwOwogCi0JCWlmICgoY2gtPmNoX2ZsYWdzICYgQ0hfU1RPUEkpIHx8IChjaC0+Y2hfZmxhZ3MgJiBDSF9GT1JDRURfU1RPUEkpKQorCQlpZiAoKGNoLT5jaF9mbGFncyAmIENIX1NUT1BJKSB8fAorCQkgICAgKGNoLT5jaF9mbGFncyAmIENIX0ZPUkNFRF9TVE9QSSkpCiAJCQluaS5yZWN2X3N0b3BwZWQgPSAxOwogCQllbHNlCiAJCQluaS5yZWN2X3N0b3BwZWQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19uZW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbmVvLmMKaW5kZXggZGM1YTEzOC4uY2YyMmM3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19uZW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX25lby5jCkBAIC0xMjAxLDcgKzEyMDEsOCBAQAogCWNoLT5jaF9jYWNoZWRfbHNyID0gMDsKIAogCS8qIFN0b3JlIGhvdyBtdWNoIHNwYWNlIHdlIGhhdmUgbGVmdCBpbiB0aGUgcXVldWUgKi8KLQlpZiAoKHFsZWZ0ID0gdGFpbCAtIGhlYWQgLSAxKSA8IDApCisJcWxlZnQgPSB0YWlsIC0gaGVhZCAtIDE7CisJaWYgKHFsZWZ0IDwgMCkKIAkJcWxlZnQgKz0gUlFVRVVFTUFTSyArIDE7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY190dHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdHR5LmMKaW5kZXggYTZjNmFiYS4uZjBiMTdjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY190dHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3R0eS5jCkBAIC05NjQsOCArOTY0LDEwIEBACiAJaW50IGRlbHRhaGlnaDsKIAlpbnQgZGVsdGFsb3c7CiAKLQlpZiAobmV3cmF0ZSA8IDApCi0JCW5ld3JhdGUgPSAwOworCWlmIChuZXdyYXRlIDw9IDApIHsKKwkJY2gtPmNoX2N1c3RvbV9zcGVlZCA9IDA7CisJCXJldHVybjsKKwl9CiAKIAkvKgogCSAqICBTaW5jZSB0aGUgZGl2aXNvciBpcyBzdG9yZWQgaW4gYSAxNi1iaXQgaW50ZWdlciwgd2UgbWFrZSBzdXJlCkBAIC05NzgsNyArOTgwLDcgQEAKIAlpZiAobmV3cmF0ZSAmJiBuZXdyYXRlID4gY2gtPmNoX2JkLT5iZF9kaXZpZGVuZCkKIAkJbmV3cmF0ZSA9IGNoLT5jaF9iZC0+YmRfZGl2aWRlbmQ7CiAKLQl3aGlsZSAobmV3cmF0ZSA+IDApIHsKKwlpZiAobmV3cmF0ZSA+IDApIHsKIAkJdGVzdGRpdiA9IGNoLT5jaF9iZC0+YmRfZGl2aWRlbmQgLyBuZXdyYXRlOwogCiAJCS8qCkBAIC05OTUsMjggKzk5NywyMyBAQAogCQkgKiAgSWYgdGhlIHJhdGUgZm9yIHRoZSByZXF1ZXN0ZWQgZGl2aXNvciBpcyBjb3JyZWN0LCBqdXN0CiAJCSAqICB1c2UgaXQgYW5kIGJlIGRvbmUuCiAJCSAqLwotCQlpZiAodGVzdHJhdGVfaGlnaCA9PSBuZXdyYXRlICkKLQkJCWJyZWFrOworCQlpZiAodGVzdHJhdGVfaGlnaCAhPSBuZXdyYXRlKSB7CisJCQkvKgorCQkJICogIE90aGVyd2lzZSwgcGljayB0aGUgcmF0ZSB0aGF0IGlzIGNsb3NlciAoaS5lLiB3aGljaGV2ZXIgcmF0ZQorCQkJICogIGhhcyBhIHNtYWxsZXIgZGVsdGEpLgorCQkJICovCisJCQlkZWx0YWhpZ2ggPSB0ZXN0cmF0ZV9oaWdoIC0gbmV3cmF0ZTsKKwkJCWRlbHRhbG93ID0gbmV3cmF0ZSAtIHRlc3RyYXRlX2xvdzsKIAotCQkvKgotCQkgKiAgT3RoZXJ3aXNlLCBwaWNrIHRoZSByYXRlIHRoYXQgaXMgY2xvc2VyIChpLmUuIHdoaWNoZXZlciByYXRlCi0JCSAqICBoYXMgYSBzbWFsbGVyIGRlbHRhKS4KLQkJICovCi0JCWRlbHRhaGlnaCA9IHRlc3RyYXRlX2hpZ2ggLSBuZXdyYXRlOwotCQlkZWx0YWxvdyA9IG5ld3JhdGUgLSB0ZXN0cmF0ZV9sb3c7Ci0KLQkJaWYgKGRlbHRhaGlnaCA8IGRlbHRhbG93KSB7Ci0JCQluZXdyYXRlID0gdGVzdHJhdGVfaGlnaDsKLQkJfSBlbHNlIHsKLQkJCW5ld3JhdGUgPSB0ZXN0cmF0ZV9sb3c7CisJCQlpZiAoZGVsdGFoaWdoIDwgZGVsdGFsb3cpIHsKKwkJCQluZXdyYXRlID0gdGVzdHJhdGVfaGlnaDsKKwkJCX0gZWxzZSB7CisJCQkJbmV3cmF0ZSA9IHRlc3RyYXRlX2xvdzsKKwkJCX0KIAkJfQotCi0JCWJyZWFrOwogCX0KIAogCWNoLT5jaF9jdXN0b21fc3BlZWQgPSBuZXdyYXRlOwotCi0JcmV0dXJuOwogfQogCiAKQEAgLTEwMjUsNyArMTAyMiw4IEBACiAJaW50IHFsZWZ0ID0gMDsKIAogCS8qIFN0b3JlIGhvdyBtdWNoIHNwYWNlIHdlIGhhdmUgbGVmdCBpbiB0aGUgcXVldWUgKi8KLQlpZiAoKHFsZWZ0ID0gY2gtPmNoX3JfdGFpbCAtIGNoLT5jaF9yX2hlYWQgLSAxKSA8IDApCisJcWxlZnQgPSBjaC0+Y2hfcl90YWlsIC0gY2gtPmNoX3JfaGVhZCAtIDE7CisJaWYgKHFsZWZ0IDwgMCkKIAkJcWxlZnQgKz0gUlFVRVVFTUFTSyArIDE7CiAKIAkvKgpAQCAtMTExOSw3ICsxMTE3LDggQEAKIAkvKgogCSAqIElmIGNoYW5uZWwgbm93IGhhcyBzcGFjZSwgd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBvbiB0aGUgY29uZGl0aW9uLgogCSAqLwotCWlmICgocWxlbiA9IGNoLT5jaF93X2hlYWQgLSBjaC0+Y2hfd190YWlsKSA8IDApCisJcWxlbiA9IGNoLT5jaF93X2hlYWQgLSBjaC0+Y2hfd190YWlsOworCWlmIChxbGVuIDwgMCkKIAkJcWxlbiArPSBXUVVFVUVTSVpFOwogCiAJaWYgKHFsZW4gPj0gKFdRVUVVRVNJWkUgLSAyNTYpKSB7CkBAIC0xOTE3LDcgKzE5MTYsOCBAQAogCWhlYWQgPSAoY2gtPmNoX3dfaGVhZCkgJiB0bWFzazsKIAl0YWlsID0gKGNoLT5jaF93X3RhaWwpICYgdG1hc2s7CiAKLQlpZiAoKHJldCA9IHRhaWwgLSBoZWFkIC0gMSkgPCAwKQorCXJldCA9IHRhaWwgLSBoZWFkIC0gMTsKKwlpZiAocmV0IDwgMCkKIAkJcmV0ICs9IFdRVUVVRVNJWkU7CiAKIAkvKiBMaW1pdCBwcmludGVyIHRvIG1heGNwcyAqLwpAQCAtMjAxNyw3ICsyMDE3LDggQEAKIAloZWFkID0gKGNoLT5jaF93X2hlYWQpICYgdG1hc2s7CiAJdGFpbCA9IChjaC0+Y2hfd190YWlsKSAmIHRtYXNrOwogCi0JaWYgKChidWZjb3VudCA9IHRhaWwgLSBoZWFkIC0gMSkgPCAwKQorCWJ1ZmNvdW50ID0gdGFpbCAtIGhlYWQgLSAxOworCWlmIChidWZjb3VudCA8IDApCiAJCWJ1ZmNvdW50ICs9IFdRVUVVRVNJWkU7CiAKIAlEUFJfV1JJVEUoKCIlZDogYnVmY291bnQ6ICV4IGNvdW50OiAleCB0YWlsOiAleCBoZWFkOiAleCB0bWFzazogJXhcbiIsCkBAIC0zMzE2LDEwICszMzE3LDEwIEBACiAKIAljYXNlIERJR0lfU0VUQ1VTVE9NQkFVRDoKIAl7Ci0JCXVpbnQgbmV3X3JhdGU7CisJCWludCBuZXdfcmF0ZTsKIAkJLyogTGV0IGdvIG9mIGxvY2tzIHdoZW4gYWNjZXNzaW5nIHVzZXIgc3BhY2UsIGNvdWxkIHNsZWVwICovCiAJCURHTkNfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmMgPSBnZXRfdXNlcihuZXdfcmF0ZSwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgYXJnKTsKKwkJcmMgPSBnZXRfdXNlcihuZXdfcmF0ZSwgKGludCBfX3VzZXIgKikgYXJnKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwogCQlER05DX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RncnAvZGdycF9zeXNmcy5jIGIvZHJpdmVycy9zdGFnaW5nL2RncnAvZGdycF9zeXNmcy5jCmluZGV4IDlhMThhMmMuLjJmOTM0NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ3JwL2RncnBfc3lzZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGdycC9kZ3JwX3N5c2ZzLmMKQEAgLTY1LDcgKzY1LDkgQEAKIAkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3NjYW5mKGJ1ZiwgIjB4JXhcbiIsICZkZ3JwX3BvbGxfdGljayk7CisJaWYgKHNzY2FuZihidWYsICIweCV4XG4iLCAmZGdycF9wb2xsX3RpY2spICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCiAJcmV0dXJuIGNvdW50OwogfQogc3RhdGljIERFVklDRV9BVFRSKHBvbGxyYXRlLCAwNjAwLCBkZ3JwX2NsYXNzX3BvbGxyYXRlX3Nob3csCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdycC9kZ3JwX3R0eS5jIGIvZHJpdmVycy9zdGFnaW5nL2RncnAvZGdycF90dHkuYwppbmRleCA3YTk2OTRjLi4zMGQyNjAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdycC9kZ3JwX3R0eS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ3JwL2RncnBfdHR5LmMKQEAgLTEzMTksNyArMTMxOSw4IEBACiAKIAlpZiAoY2gtPmNoX3R1bi51bl9vcGVuX2NvdW50ICE9IDAgJiYKIAkgICAgY2gtPmNoX3R1bi51bl90dHktPm9wcy0+Y2hhcnNfaW5fYnVmZmVyICYmCi0JICAgICgoY2gtPmNoX3R1bi51bl90dHktPm9wcy0+Y2hhcnNfaW5fYnVmZmVyKShjaC0+Y2hfdHVuLnVuX3R0eSkgIT0gMCkpIHsKKwkgICAgKChjaC0+Y2hfdHVuLnVuX3R0eS0+b3BzLT5jaGFyc19pbl9idWZmZXIpCisJICAgICAoY2gtPmNoX3R1bi51bl90dHkpICE9IDApKSB7CiAJCSp1bl9mbGFnID0gVU5fUFdBSVQ7CiAJCXJldHVybiAwOwogCX0KQEAgLTE1MDEsNyArMTUwMiw4IEBACiAJCSAqLwogCiAJCWlmIChjaC0+Y2hfdHVuLnVuX29wZW5fY291bnQgIT0gMCAmJgotCQkgICAgKChjaC0+Y2hfdHVuLnVuX3R0eS0+b3BzLT5jaGFyc19pbl9idWZmZXIpKGNoLT5jaF90dW4udW5fdHR5KSAhPSAwKSkgeworCQkgICAgKChjaC0+Y2hfdHVuLnVuX3R0eS0+b3BzLT5jaGFyc19pbl9idWZmZXIpCisJCSAgICAgKGNoLT5jaF90dW4udW5fdHR5KSAhPSAwKSkgewogCQkJdW4tPnVuX2ZsYWcgfD0gVU5fUFdBSVQ7CiAJCQljb3VudCA9IDA7CiAJCQlnb3RvIG91dDsKQEAgLTE2NjYsNyArMTY2OCw4IEBACiAKIAkJaWYgKG4gPj0gdCkgewogCQkJbWVtY3B5KGNoLT5jaF90YnVmICsgY2gtPmNoX3RpbiwgYnVmLCB0KTsKLQkJCWlmIChuZC0+bmRfZHBhX2RlYnVnICYmIG5kLT5uZF9kcGFfcG9ydCA9PSBQT1JUX05VTShNSU5PUih0dHlfZGV2bnVtKHVuLT51bl90dHkpKSkpCisJCQlpZiAobmQtPm5kX2RwYV9kZWJ1ZyAmJiBuZC0+bmRfZHBhX3BvcnQgPT0KKwkJCQlQT1JUX05VTShNSU5PUih0dHlfZGV2bnVtKHVuLT51bl90dHkpKSkpCiAJCQkJZGdycF9kcGFfZGF0YShuZCwgMCwgKGNoYXIgKikgYnVmLCB0KTsKIAkJCWJ1ZiArPSB0OwogCQkJbiAtPSB0OwpAQCAtMTY3NSw3ICsxNjc4LDggQEAKIAkJfQogCiAJCW1lbWNweShjaC0+Y2hfdGJ1ZiArIGNoLT5jaF90aW4sIGJ1Ziwgbik7Ci0JCWlmIChuZC0+bmRfZHBhX2RlYnVnICYmIG5kLT5uZF9kcGFfcG9ydCA9PSBQT1JUX05VTShNSU5PUih0dHlfZGV2bnVtKHVuLT51bl90dHkpKSkpCisJCWlmIChuZC0+bmRfZHBhX2RlYnVnICYmIG5kLT5uZF9kcGFfcG9ydCA9PQorCQkJUE9SVF9OVU0oTUlOT1IodHR5X2Rldm51bSh1bi0+dW5fdHR5KSkpKQogCQkJZGdycF9kcGFfZGF0YShuZCwgMCwgKGNoYXIgKikgYnVmLCBuKTsKIAkJYnVmICs9IG47CiAJCWNoLT5jaF90aW4gKz0gbjsKQEAgLTI2NTYsNyArMjY2MCw4IEBACiAJCQkJY2gtPmNoX3NlbmQgfD0gUlJfUlhfRkxVU0g7CiAJCQkJKGNoLT5jaF9uZCktPm5kX3R4X3dvcmsgPSAxOwogCQkJCShjaC0+Y2hfbmQpLT5uZF90eF9yZWFkeSA9IDE7Ci0JCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCYoY2gtPmNoX25kKS0+bmRfdHhfd2FpdHEpOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgKKwkJCQkJJihjaC0+Y2hfbmQpLT5uZF90eF93YWl0cSk7CiAJCQl9CiAJCQlpZiAoYXJnID09IFRDSUZMVVNIKQogCQkJCWJyZWFrOwpAQCAtMjY4Miw3ICsyNjg3LDggQEAKIAlMaW51eAkJSFBVWAkJRnVuY3Rpb24KIAlUQ1NFVEEJCVRDU0VUQQkJLSBzZXQgdGhlIHRlcm1pb3MKIAlUQ1NFVEFGCQlUQ1NFVEFGCQktIHdhaXQgZm9yIGRyYWluIGZpcnN0LCB0aGVuIHNldCB0ZXJtaW9zCi0JVENTRVRBVwkJVENTRVRBVwkJLSB3YWl0IGZvciBkcmFpbiwgZmx1c2ggdGhlIGlucHV0IHF1ZXVlLCB0aGVuIHNldCB0ZXJtaW9zCisJVENTRVRBVwkJVENTRVRBVwkJLSB3YWl0IGZvciBkcmFpbiwKKwkJCQkJZmx1c2ggdGhlIGlucHV0IHF1ZXVlLCB0aGVuIHNldCB0ZXJtaW9zCiAJLSBsb29raW5nIGF0IHRoZSB0dHlfaW9jdGwgY29kZSwgdGhlc2UgY29tbWFuZCBhbGwgY2FsbCBvdXIKIAl0dHlfc2V0X3Rlcm1pb3MgYXQgdGhlIGRyaXZlcidzIGVuZCwgd2hlbiBhIFRDU0VUQSogaXMgc2VudCwKIAlpdCBpcyBleHBlY3RpbmcgdGhlIHR0eSB0byBoYXZlIGEgdGVybWlvIHN0cnVjdHVyZSwKQEAgLTI3OTgsNiArMjgwNCw3IEBACiAJCX0KIAogCQkvKiBwcmV0ZW5kIHdlIGRpZG4ndCByZWNvZ25pemUgdGhpcyAqLworCQkvKiBmYWxsLXRocm91Z2ggKi8KIAogCWNhc2UgRElHSV9TRVRBOgogCQlyZXR1cm4gZGdycF90dHlfZGlnaXNldGEodHR5LCAoc3RydWN0IGRpZ2lfc3RydWN0ICopIGFyZyk7CkBAIC0zMjA3LDcgKzMyMTQsOCBAQAogCQkJCWludCBtYXhfbWFqb3JzID0gMVUgPDwgKDMyIC0gTUlOT1JCSVRTKTsKIAkJCQlmb3IgKGkgPSAyNTY7IGkgPCBtYXhfbWFqb3JzOyBpKyspIHsKIAkJCQkJbmQtPm5kX3NlcmlhbF90dGRyaXZlci0+bWFqb3IgPSBpOwotCQkJCQlyYyA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIobmQtPm5kX3NlcmlhbF90dGRyaXZlcik7CisJCQkJCXJjID0gdHR5X3JlZ2lzdGVyX2RyaXZlcgorCQkJCQkJKG5kLT5uZF9zZXJpYWxfdHRkcml2ZXIpOwogCQkJCQlpZiAocmMgPj0gMCkKIAkJCQkJCWJyZWFrOwogCQkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvZWNoby9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmEzMTFhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVRPRE86Ci0JLSBzZW5kIHRvIGxrbWwgZm9yIHJldmlldwotCi1QbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZCBDYzogU3RldmUKLVVuZGVyd29vZCA8c3RldmV1QGNvcHBpY2Uub3JnPiBhbmQgRGF2aWQgUm93ZSA8ZGF2aWRAcm93ZXRlbC5jb20+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeC5jIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXguYwppbmRleCBlNTE2YmI2Li5kMzI5Y2YzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4LmMKQEAgLTQ4NSw4ICs0ODUsNiBAQAogCXU4IGVlcHJvbV9kYXRhWzJdOwogCiAJLyogU3BpbmxvY2tzICovCi0Jc3BpbmxvY2tfdCBsb2NrOwotCiAJc3BpbmxvY2tfdCB0Y2Jfc2VuZF9xbG9jazsKIAlzcGlubG9ja190IHRjYl9yZWFkeV9xbG9jazsKIAlzcGlubG9ja190IHNlbmRfaHdfbG9jazsKQEAgLTEzODgsNiArMTM4Niw3IEBACiAJCQkgICAgbWlpX2luZGljYXRvcik7CiAKIAkJc3RhdHVzID0gLUVJTzsKKwkJZ290byBvdXQ7CiAJfQogCiAJLyogSWYgd2UgaGl0IGhlcmUgd2Ugd2VyZSBhYmxlIHRvIHJlYWQgdGhlIHJlZ2lzdGVyIGFuZCB3ZSBuZWVkIHRvCkBAIC0xMzk1LDYgKzEzOTQsNyBAQAogCSAqLwogCSp2YWx1ZSA9IHJlYWRsKCZtYWMtPm1paV9tZ210X3N0YXQpICYgRVRfTUFDX01JSU1HTVRfU1RBVF9QSFlDUlRMX01BU0s7CiAKK291dDoKIAkvKiBTdG9wIHRoZSByZWFkIG9wZXJhdGlvbiAqLwogCXdyaXRlbCgwLCAmbWFjLT5taWlfbWdtdF9jbWQpOwogCkBAIC0yMTI0LDcgKzIxMjQsMTEgQEAKIAogCS8qIEFsbG9jIG1lbW9yeSBmb3IgdGhlIGxvb2t1cCB0YWJsZSAqLwogCXJ4X3JpbmctPmZiclswXSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmYnJfbG9va3VwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJ4X3JpbmctPmZiclswXSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKIAlyeF9yaW5nLT5mYnJbMV0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZmJyX2xvb2t1cCksIEdGUF9LRVJORUwpOworCWlmIChyeF9yaW5nLT5mYnJbMV0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBUaGUgZmlyc3QgdGhpbmcgd2Ugd2lsbCBkbyBpcyBjb25maWd1cmUgdGhlIHNpemVzIG9mIHRoZSBidWZmZXIKIAkgKiByaW5ncy4gVGhlc2Ugd2lsbCBjaGFuZ2UgYmFzZWQgb24ganVtYm8gcGFja2V0IHN1cHBvcnQuICBMYXJnZXIKQEAgLTIyODksNyArMjI5Myw3IEBACiAJZm9yIChpZCA9IDA7IGlkIDwgTlVNX0ZCUlM7IGlkKyspIHsKIAkJZmJyID0gcnhfcmluZy0+ZmJyW2lkXTsKIAotCQlpZiAoIWZici0+cmluZ192aXJ0YWRkcikKKwkJaWYgKCFmYnIgfHwgIWZici0+cmluZ192aXJ0YWRkcikKIAkJCWNvbnRpbnVlOwogCiAJCS8qIEZpcnN0IHRoZSBwYWNrZXQgbWVtb3J5ICovCkBAIC0zNTIzLDcgKzM1MjcsNyBAQAogCQkJZ290byBlcnJfb3V0OwogCQl9CiAJfQotCW1lbWNweShhZGFwdGVyLT5hZGRyLCBhZGFwdGVyLT5yb21fYWRkciwgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShhZGFwdGVyLT5hZGRyLCBhZGFwdGVyLT5yb21fYWRkcik7CiBvdXQ6CiAJcmV0dXJuIHJjOwogZXJyX291dDoKQEAgLTM1OTEsNiArMzU5NSw3IEBACiAJaWYgKHN0YXR1cykgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkgICJldDEzMXhfdHhfZG1hX21lbW9yeV9hbGxvYyBGQUlMRURcbiIpOworCQlldDEzMXhfdHhfZG1hX21lbW9yeV9mcmVlKGFkYXB0ZXIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAkvKiBSZWNlaXZlIGJ1ZmZlciBtZW1vcnkgYWxsb2NhdGlvbiAqLwpAQCAtMzU5OCw3ICszNjAzLDcgQEAKIAlpZiAoc3RhdHVzKSB7CiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCSAgImV0MTMxeF9yeF9kbWFfbWVtb3J5X2FsbG9jIEZBSUxFRFxuIik7Ci0JCWV0MTMxeF90eF9kbWFfbWVtb3J5X2ZyZWUoYWRhcHRlcik7CisJCWV0MTMxeF9hZGFwdGVyX21lbW9yeV9mcmVlKGFkYXB0ZXIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIApAQCAtMzc2MCw3ICszNzY1LDYgQEAKIAlhZGFwdGVyLT5uZXRkZXYgPSBuZXRkZXY7CiAKIAkvKiBJbml0aWFsaXplIHNwaW5sb2NrcyBoZXJlICovCi0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT50Y2Jfc2VuZF9xbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnRjYl9yZWFkeV9xbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnNlbmRfaHdfbG9jayk7CkBAIC0zNzcwLDcgKzM3NzQsNyBAQAogCWFkYXB0ZXItPnJlZ2lzdHJ5X2p1bWJvX3BhY2tldCA9IDE1MTQ7CS8qIDE1MTQtOTIxNiAqLwogCiAJLyogU2V0IHRoZSBNQUMgYWRkcmVzcyB0byBhIGRlZmF1bHQgKi8KLQltZW1jcHkoYWRhcHRlci0+YWRkciwgZGVmYXVsdF9tYWMsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkoYWRhcHRlci0+YWRkciwgZGVmYXVsdF9tYWMpOwogCiAJcmV0dXJuIGFkYXB0ZXI7CiB9CkBAIC00MjkyLDEyICs0Mjk2LDkgQEAKIHsKIAlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWludCBwYWNrZXRfZmlsdGVyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKIAlpbnQgaTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7Ci0KIAkvKiBCZWZvcmUgd2UgbW9kaWZ5IHRoZSBwbGF0Zm9ybS1pbmRlcGVuZGVudCBmaWx0ZXIgZmxhZ3MsIHN0b3JlIHRoZW0KIAkgKiBsb2NhbGx5LiBUaGlzIGFsbG93cyB1cyB0byBkZXRlcm1pbmUgaWYgYW55dGhpbmcncyBjaGFuZ2VkIGFuZCBpZgogCSAqIHdlIGV2ZW4gbmVlZCB0byBib3RoZXIgdGhlIGhhcmR3YXJlCkBAIC00MzQ5LDggKzQzNTAsNiBAQAogCSAqLwogCWlmIChwYWNrZXRfZmlsdGVyICE9IGFkYXB0ZXItPnBhY2tldF9maWx0ZXIpCiAJCWV0MTMxeF9zZXRfcGFja2V0X2ZpbHRlcihhZGFwdGVyKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKIH0KIAogLyogZXQxMzF4X3R4IC0gVGhlIGhhbmRsZXIgdG8gdHggYSBwYWNrZXQgb24gdGhlIGRldmljZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9hbHBoYXRyYWNrLmMKaW5kZXggZWRkNWNlZi4uMjI2YjIzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvYWxwaGF0cmFjay5jCkBAIC0yMDgsNyArMjA4LDkgQEAKIAlrZnJlZShkZXYtPnJpbmdfYnVmZmVyKTsKIAlrZnJlZShkZXYtPmludGVycnVwdF9pbl9idWZmZXIpOwogCWtmcmVlKGRldi0+aW50ZXJydXB0X291dF9idWZmZXIpOwotCWtmcmVlKGRldik7CQkvKiBmaXhtZSBvbGRpX2J1ZmZlciAqLworCWtmcmVlKGRldi0+b2xkaV9idWZmZXIpOworCWtmcmVlKGRldi0+d3JpdGVfYnVmZmVyKTsKKwlrZnJlZShkZXYpOwogfQogCiAvKiogdXNiX2FscGhhdHJhY2tfaW50ZXJydXB0X2luX2NhbGxiYWNrICovCkBAIC0yMzMsOCArMjM1LDggQEAKIAogCWlmICh1cmItPmFjdHVhbF9sZW5ndGggIT0gSU5QVVRfQ01EX1NJWkUpIHsKIAkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LAotCQkJICJVcmIgbGVuZ3RoIHdhcyAlZCBieXRlcyEhIgotCQkJICJEbyBzb21ldGhpbmcgaW50ZWxsaWdlbnRcbiIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQkgIlVyYiBsZW5ndGggd2FzICVkIGJ5dGVzISEgRG8gc29tZXRoaW5nIGludGVsbGlnZW50XG4iLAorCQkJIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJfSBlbHNlIHsKIAkJYWxwaGF0cmFja19vY21kX2luZm8oJmRldi0+aW50Zi0+ZGV2LAogCQkJCSAgICAgJigqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZCwKQEAgLTY4OCw4ICs2OTAsNyBAQAogCX0KIAlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID09IE5VTEwpCiAJCWRldl93YXJuKCZpbnRmLT5kZXYsCi0JCQkgIkludGVycnVwdCBvdXQgZW5kcG9pbnQgbm90IGZvdW5kIgotCQkJICIodXNpbmcgY29udHJvbCBlbmRwb2ludCBpbnN0ZWFkKVxuIik7CisJCQkgIkludGVycnVwdCBvdXQgZW5kcG9pbnQgbm90IGZvdW5kICh1c2luZyBjb250cm9sIGVuZHBvaW50IGluc3RlYWQpXG4iKTsKIAogCWRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUgPQogCSAgICBsZTE2X3RvX2NwdShkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+d01heFBhY2tldFNpemUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL3RyYW56cG9ydC5jIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL3RyYW56cG9ydC5jCmluZGV4IDBlNDk5Y2UuLjA1NzE5ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci90cmFuenBvcnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvdHJhbnpwb3J0LmMKQEAgLTI1Nyw4ICsyNTcsNyBAQAogCiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSA4KSB7CiAJCWRldl93YXJuKCZkZXYtPmludGYtPmRldiwKLQkJCSJVcmIgbGVuZ3RoIHdhcyAlZCBieXRlcyEhIgotCQkJIkRvIHNvbWV0aGluZyBpbnRlbGxpZ2VudFxuIiwKKwkJCSJVcmIgbGVuZ3RoIHdhcyAlZCBieXRlcyEhIERvIHNvbWV0aGluZyBpbnRlbGxpZ2VudFxuIiwKIAkJCSB1cmItPmFjdHVhbF9sZW5ndGgpOwogCX0gZWxzZSB7CiAJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwKQEAgLTU0Miw4ICs1NDEsNyBAQAogCX0KIAogCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwKLQkJIiVzOiBjb3B5aW5nIHRvIHVzZXJzcGFjZTogIgotCQkiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCSIlczogY29weWluZyB0byB1c2Vyc3BhY2U6ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAogCQkgX19mdW5jX18sCiAJCSAoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMF0sCiAJCSAoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMV0sCkBAIC01NzAsOCArNTY4LDcgQEAKIAkJCSAqIGFuZCB3ZSBhcmUgdGhlIHNhbWUgc2lnbiwgd2UgY2FuIGNvbXByZXNzICstIDdGCiAJCQkgKi8KIAkJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwKLQkJCQkiJXM6IHRyeWluZyB0byBjb21wcmVzczogIgotCQkJCSIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJCQkiJXM6IHRyeWluZyB0byBjb21wcmVzczogJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCiAJCQkJX19mdW5jX18sCiAJCQkJKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzBdLAogCQkJCSgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFsxXSwKQEAgLTgzMCw4ICs4MjcsNyBAQAogCX0KIAlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID09IE5VTEwpCiAJCWRldl93YXJuKCZpbnRmLT5kZXYsCi0JCQkiSW50ZXJydXB0IG91dCBlbmRwb2ludCBub3QgZm91bmQiCi0JCQkiKHVzaW5nIGNvbnRyb2wgZW5kcG9pbnQgaW5zdGVhZClcbiIpOworCQkJIkludGVycnVwdCBvdXQgZW5kcG9pbnQgbm90IGZvdW5kICh1c2luZyBjb250cm9sIGVuZHBvaW50IGluc3RlYWQpXG4iKTsKIAogCWRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUgPQogCSAgICBsZTE2X3RvX2NwdShkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+d01heFBhY2tldFNpemUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9ody5jIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9ody5jCmluZGV4IGE0MzNlMzMuLmI2YTc3MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaHcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmMKQEAgLTExNDUsNyArMTE0NSw3IEBACiAKIAljaGFyICpjbWRidWZmZXIgPSBrbWFsbG9jKDE2MDAsIEdGUF9LRVJORUwpOwogCWlmICghY21kYnVmZmVyKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRU5PTUVNOwogCiAJc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0zMihkZXYsIDB4MjAwLCBjbWRidWZmZXIsIHNpemUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2lvY3RsLmggYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2lvY3RsLmgKaW5kZXggMjRiOGQ3Ny4uNDE5ZTUzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9pb2N0bC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaW9jdGwuaApAQCAtMzAsNyArMzAsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBfSU9DVExfR0VUX1ZFUiB7CiAgICAgdW5zaWduZWQgbG9uZyBkcnZfdmVyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgSU9DVExfR0VUX1ZFUiwgKlBJT0NUTF9HRVRfVkVSOworfSBfX3BhY2tlZCBJT0NUTF9HRVRfVkVSLCAqUElPQ1RMX0dFVF9WRVI7CiAKIC8qIERhdGEgc3RydWN0dXJlIGZvciBEc3Agc3RhdGlzdGljcyAqLwogdHlwZWRlZiBzdHJ1Y3QgX0lPQ1RMX0dFVF9EU1BfU1RBVCB7CkBAIC02NywxOSArNjcsMTkgQEAKICAgICB1bnNpZ25lZCBsb25nIENvblRtOyAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgc2Vzc2lvbiBjb25uZWN0aW9uIHRpbWUgaW4gc2Vjb25kcyAqLwogICAgIHVuc2lnbmVkIGNoYXIgQ2FsVmVyW0NBTFZFUlNaXTsgICAgICAgLyogUHJvcHJpZXRhcnkgQ2FsaWJyYXRpb24gVmVyc2lvbiAqLwogICAgIHVuc2lnbmVkIGNoYXIgQ2FsRGF0ZVtDQUxEQVRFU1pdOyAgICAgLyogUHJvcHJpZXRhcnkgQ2FsaWJyYXRpb24gRGF0ZSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgSU9DVExfR0VUX0RTUF9TVEFULCAqUElPQ1RMX0dFVF9EU1BfU1RBVDsKK30gX19wYWNrZWQgSU9DVExfR0VUX0RTUF9TVEFULCAqUElPQ1RMX0dFVF9EU1BfU1RBVDsKIAogLyogRGF0YSBzdHJ1Y3R1cmUgZm9yIER1YWwgUG9ydGVkIFJBTSBtZXNzYWdpbmcgYmV0d2VlbiBIb3N0IGFuZCBEc3AgKi8KIHR5cGVkZWYgc3RydWN0IF9JT0NUTF9EUFJBTV9CTEsgewogICAgIHVuc2lnbmVkIHNob3J0IHRvdGFsX2xlbjsKIAlzdHJ1Y3QgcHNldWRvX2hkciBwc2V1ZG9oZHI7CiAgICAgdW5zaWduZWQgY2hhciBidWZmZXJbMTc4MF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBJT0NUTF9EUFJBTV9CTEssICpQSU9DVExfRFBSQU1fQkxLOworfSBfX3BhY2tlZCBJT0NUTF9EUFJBTV9CTEssICpQSU9DVExfRFBSQU1fQkxLOwogCiB0eXBlZGVmIHN0cnVjdCBfSU9DVExfRFBSQU1fQ09NTUFORCB7CiAgICAgdW5zaWduZWQgc2hvcnQgZXh0cmE7CiAgICAgSU9DVExfRFBSQU1fQkxLIGRwcmFtX2JsazsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIElPQ1RMX0RQUkFNX0NPTU1BTkQsICpQSU9DVExfRFBSQU1fQ09NTUFORDsKK30gX19wYWNrZWQgSU9DVExfRFBSQU1fQ09NTUFORCwgKlBJT0NUTF9EUFJBTV9DT01NQU5EOwogCiAvKgogKiBDdXN0b20gSU9DVEwgY29tbWFuZCBjb2RlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAuaCBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLmgKaW5kZXggMTc1YWJmYS4uY2NiODIxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC5oCkBAIC0yMSwzNCArMjEsNjQgQEAKICNkZWZpbmUJRlQxMDAwX1JFR19TVVBfQ1RSTAkweDAwMjAJLyogSENUUiAtIEhvc3QgQ29udHJvbCBSZWdpc3RlciAqLwogI2RlZmluZQlGVDEwMDBfUkVHX1NVUF9TVEFUCTB4MDAyMgkvKiBIU1RBVCAtIEhvc3QgU3RhdHVzIFJlZ2lzdGVyICovCiAjZGVmaW5lCUZUMTAwMF9SRUdfUkVTRVQJMHgwMDI0CS8qIEhDVFIgLSBIb3N0IENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRlQxMDAwX1JFR19TVVBfSVNSCTB4MDAyNgkvKiBISVNSIC0gSG9zdCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCUZUMTAwMF9SRUdfU1VQX0lTUgkweDAwMjYJLyogSElTUiAtIEhvc3QgSW50ZXJydXB0IFN0YXR1cworCQkJCQkgKiBSZWdpc3RlcgorCQkJCQkgKi8KICNkZWZpbmUJRlQxMDAwX1JFR19TVVBfSU1BU0sJMHgwMDI4CS8qIEhJTUFTSyAtIEhvc3QgSW50ZXJydXB0IE1hc2sgKi8KICNkZWZpbmUJRlQxMDAwX1JFR19ET09SQkVMTAkweDAwMmEJLyogREJFTEwgLSBEb29yIEJlbGwgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRlQxMDAwX1JFR19BU0lDX0lECTB4MDAyZQkvKiBBU0lDSUQgLSBBU0lDIElkZW50aWZpY2F0aW9uIE51bWJlciAqLworI2RlZmluZSBGVDEwMDBfUkVHX0FTSUNfSUQJMHgwMDJlCS8qIEFTSUNJRCAtIEFTSUMgSWRlbnRpZmljYXRpb24KKwkJCQkJICogTnVtYmVyCisJCQkJCSAqLwogCiAvKiBNRU1PUlkgTUFQIEZPUiBFTEVDVFJBQlVaWiBBU0lDICovCiAjZGVmaW5lIEZUMTAwMF9SRUdfVUZJRk9fU1RBVAkweDAwMDAJLyogVUZTUiAtIFVwbGluayBGSUZPIHN0YXR1cyByZWdpc3RlciAqLwotI2RlZmluZSBGVDEwMDBfUkVHX1VGSUZPX0JFRwkweDAwMDIJLyogVUZCUgktIFVwbGluayBGSUZPIGJlZ2lubmluZyByZWdpc3RlciAqLworI2RlZmluZSBGVDEwMDBfUkVHX1VGSUZPX0JFRwkweDAwMDIJLyogVUZCUgktIFVwbGluayBGSUZPIGJlZ2lubmluZworCQkJCQkgKiByZWdpc3RlcgorCQkJCQkgKi8KICNkZWZpbmUJRlQxMDAwX1JFR19VRklGT19NSUQJMHgwMDA0CS8qIFVGTVIJLSBVcGxpbmsgRklGTyBtaWRkbGUgcmVnaXN0ZXIgKi8KICNkZWZpbmUJRlQxMDAwX1JFR19VRklGT19FTkQJMHgwMDA2CS8qIFVGRVIJLSBVcGxpbmsgRklGTyBlbmQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUJRlQxMDAwX1JFR19ERklGT19TVEFUCTB4MDAwOAkvKiBERlNSIC0gRG93bmxpbmsgRklGTyBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJRlQxMDAwX1JFR19ERklGT19TVEFUCTB4MDAwOAkvKiBERlNSIC0gRG93bmxpbmsgRklGTyBzdGF0dXMKKwkJCQkJICogcmVnaXN0ZXIKKwkJCQkJICovCiAjZGVmaW5lCUZUMTAwMF9SRUdfREZJRk8JMHgwMDBBCS8qIERGUiAtIERvd25saW5rIEZJRk8gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRlQxMDAwX1JFR19EUFJBTV9EQVRBCTB4MDAwQwkvKiBEUFJBTSAtIER1YWwgUG9ydCBJbmRpcmVjdCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lCUZUMTAwMF9SRUdfRFBSQU1fREFUQQkweDAwMEMJLyogRFBSQU0gLSBEdWFsIFBvcnQgSW5kaXJlY3QKKwkJCQkJICogRGF0YSBSZWdpc3RlcgorCQkJCQkgKi8KICNkZWZpbmUJRlQxMDAwX1JFR19XQVRFUk1BUksJMHgwMDEwCS8qIFdNQVJLIC0gV2F0ZXJtYXJrIFJlZ2lzdGVyICovCiAKIC8qIE1FTU9SWSBNQVAgRk9SIE1BR05FTUlURSAqLwotI2RlZmluZSBGVDEwMDBfUkVHX01BR19VRkRSCTB4MDAwMAkvKiBVRkRSIC0gVXBsaW5rIEZJRk8gRGF0YSBSZWdpc3RlciAoMzItYml0cykgKi8KLSNkZWZpbmUgRlQxMDAwX1JFR19NQUdfVUZEUkwJMHgwMDAwCS8qIFVGRFJMIC0gVXBsaW5rIEZJRk8gRGF0YSBSZWdpc3RlciBsb3ctd29yZCAoMTYtYml0cykgKi8KLSNkZWZpbmUgRlQxMDAwX1JFR19NQUdfVUZEUkgJMHgwMDAyCS8qIFVGRFJIIC0gVXBsaW5rIEZJRk8gRGF0YSBSZWdpc3RlciBoaWdoLXdvcmQgKDE2LWJpdHMpICovCisjZGVmaW5lIEZUMTAwMF9SRUdfTUFHX1VGRFIJMHgwMDAwCS8qIFVGRFIgLSBVcGxpbmsgRklGTyBEYXRhCisJCQkJCSAqIFJlZ2lzdGVyICgzMi1iaXRzKQorCQkJCQkgKi8KKyNkZWZpbmUgRlQxMDAwX1JFR19NQUdfVUZEUkwJMHgwMDAwCS8qIFVGRFJMIC0gVXBsaW5rIEZJRk8gRGF0YQorCQkJCQkgKiBSZWdpc3RlciBsb3ctd29yZCAoMTYtYml0cykKKwkJCQkJICovCisjZGVmaW5lIEZUMTAwMF9SRUdfTUFHX1VGRFJICTB4MDAwMgkvKiBVRkRSSCAtIFVwbGluayBGSUZPIERhdGEgUmVnaXN0ZXIKKwkJCQkJICogaGlnaC13b3JkICgxNi1iaXRzKQorCQkJCQkgKi8KICNkZWZpbmUgRlQxMDAwX1JFR19NQUdfVUZFUgkweDAwMDQJLyogVUZFUiAtIFVwbGluayBGSUZPIEVuZCBSZWdpc3RlciAqLwogI2RlZmluZSBGVDEwMDBfUkVHX01BR19VRlNSCTB4MDAwNgkvKiBVRlNSIC0gVXBsaW5rIEZJRk8gU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZUMTAwMF9SRUdfTUFHX0RGUgkweDAwMDgJLyogREZSIC0gRG93bmxpbmsgRklGTyBSZWdpc3RlciAoMzItYml0cykgKi8KLSNkZWZpbmUgRlQxMDAwX1JFR19NQUdfREZSTAkweDAwMDgJLyogREZSTCAtIERvd25saW5rIEZJRk8gUmVnaXN0ZXIgbG93LXdvcmQgKDE2LWJpdHMpICovCi0jZGVmaW5lIEZUMTAwMF9SRUdfTUFHX0RGUkgJMHgwMDBhCS8qIERGUkggLSBEb3dubGluayBGSUZPIFJlZ2lzdGVyIGhpZ2gtd29yZCAoMTYtYml0cykgKi8KLSNkZWZpbmUgRlQxMDAwX1JFR19NQUdfREZTUgkweDAwMGMJLyogREZTUiAtIERvd25saW5rIEZJRk8gU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZUMTAwMF9SRUdfTUFHX0RQREFUQQkweDAwMTAJLyogRFBEQVRBIC0gRHVhbCBQb3J0IFJBTSBJbmRpcmVjdCBEYXRhIFJlZ2lzdGVyICgzMi1iaXRzKSAqLwotI2RlZmluZSBGVDEwMDBfUkVHX01BR19EUERBVEFMCTB4MDAxMAkvKiBEUERBVEFMIC0gRHVhbCBQb3J0IFJBTSBJbmRpcmVjdCBEYXRhIFJlZ2lzdGVyIGxvdy13b3JkICgxNi1iaXRzKSAqLwotI2RlZmluZSBGVDEwMDBfUkVHX01BR19EUERBVEFICTB4MDAxMgkvKiBEUERBVEFIIC0gRHVhbCBQb3J0IFJBTSBJbmRpcmVjdCBEYXRhIFJlZ2lzdGVyIGhpZ2gtd29yZCAoMTYtYml0cykgKi8KKyNkZWZpbmUgRlQxMDAwX1JFR19NQUdfREZSCTB4MDAwOAkvKiBERlIgLSBEb3dubGluayBGSUZPIFJlZ2lzdGVyCisJCQkJCSAqICgzMi1iaXRzKQorCQkJCQkgKi8KKyNkZWZpbmUgRlQxMDAwX1JFR19NQUdfREZSTAkweDAwMDgJLyogREZSTCAtIERvd25saW5rIEZJRk8gUmVnaXN0ZXIKKwkJCQkJICogbG93LXdvcmQgKDE2LWJpdHMpCisJCQkJCSAqLworI2RlZmluZSBGVDEwMDBfUkVHX01BR19ERlJICTB4MDAwYQkvKiBERlJIIC0gRG93bmxpbmsgRklGTyBSZWdpc3RlcgorCQkJCQkgKiBoaWdoLXdvcmQgKDE2LWJpdHMpCisJCQkJCSAqLworI2RlZmluZSBGVDEwMDBfUkVHX01BR19ERlNSCTB4MDAwYwkvKiBERlNSIC0gRG93bmxpbmsgRklGTyBTdGF0dXMKKwkJCQkJICogUmVnaXN0ZXIKKwkJCQkJICovCisjZGVmaW5lIEZUMTAwMF9SRUdfTUFHX0RQREFUQQkweDAwMTAJLyogRFBEQVRBIC0gRHVhbCBQb3J0IFJBTSBJbmRpcmVjdAorCQkJCQkgKiBEYXRhIFJlZ2lzdGVyICgzMi1iaXRzKQorCQkJCQkgKi8KKyNkZWZpbmUgRlQxMDAwX1JFR19NQUdfRFBEQVRBTAkweDAwMTAJLyogRFBEQVRBTCAtIER1YWwgUG9ydCBSQU0gSW5kaXJlY3QKKwkJCQkJICogRGF0YSBSZWdpc3RlciBsb3ctd29yZCAoMTYtYml0cykKKwkJCQkJICovCisjZGVmaW5lIEZUMTAwMF9SRUdfTUFHX0RQREFUQUgJMHgwMDEyCS8qIERQREFUQUggLSBEdWFsIFBvcnQgUkFNIEluZGlyZWN0IERhdGEKKwkJCQkJICogUmVnaXN0ZXIgaGlnaC13b3JkICgxNi1iaXRzKQorCQkJCQkgKi8KICNkZWZpbmUJRlQxMDAwX1JFR19NQUdfV0FURVJNQVJLIDB4MDAyYwkvKiBXTUFSSyAtIFdhdGVybWFyayBSZWdpc3RlciAqLwogI2RlZmluZSBGVDEwMDBfUkVHX01BR19WRVJTSU9OCTB4MDAzMAkvKiBMTEMgVmVyc2lvbiAqLwogCkBAIC01Nyw3ICs4Nyw5IEBACiAjZGVmaW5lIEZUMTAwMF9EUFJBTV9SWF9CQVNFCTB4MDgwMAkvKiBQQyBDYXJkIHRvIEhvc3QgTWVzc2FnaW5nIEFyZWEgKi8KICNkZWZpbmUgRlQxMDAwX0ZJRk9fTEVOCQkweDA3RkMJLyogdG90YWwgbGVuZ3RoIGZvciBEU1AgRklGTyB0cmFja2luZyAqLwogI2RlZmluZSBGVDEwMDBfSElfSE8JCTB4MDdGRQkvKiBoZWFydGJlYXQgd2l0aCBISS9ITyAqLwotI2RlZmluZSBGVDEwMDBfRFNQX1NUQVRVUwkweDBGRkUJLyogZHNwIHN0YXR1cyAtIG5vbi16ZXJvIGlzIGEgcmVxdWVzdCB0byByZXNldCBkc3AgKi8KKyNkZWZpbmUgRlQxMDAwX0RTUF9TVEFUVVMJMHgwRkZFCS8qIGRzcCBzdGF0dXMgLSBub24temVybyBpcyBhIHJlcXVlc3QKKwkJCQkJICogdG8gcmVzZXQgZHNwCisJCQkJCSAqLwogI2RlZmluZSBGVDEwMDBfRFNQX0xFRAkJMHgwRkZBCS8qIGRzcCBsZWQgc3RhdHVzIGZvciBQQUQgZGV2aWNlICovCiAjZGVmaW5lIEZUMTAwMF9EU1BfQ09OX1NUQVRFCTB4MEZGOAkvKiBEU1AgQ29ubmVjdGlvbiBTdGF0dXMgSW5mbyAqLwogI2RlZmluZSBGVDEwMDBfRFBSQU1fRkVGRQkweDAwMDIJLyogbG9jYXRpb24gZm9yIGRzcCByZWFkeSBpbmRpY2F0b3IgKi8KQEAgLTY3LDI2ICs5OSw0OCBAQAogI2RlZmluZSBGVDEwMDBfRFNQX1RJTUVSMwkweDFGRjYJLyogVGltZXIgRmllbGQgZnJvbSBCYXNlc3RhdGlvbiAqLwogCiAvKiBSZXNlcnZlZCBEdWFsIFBvcnQgUkFNIG9mZnNldHMgZm9yIE1hZ25lbWl0ZSAqLwotI2RlZmluZSBGVDEwMDBfRFBSQU1fTUFHX1RYX0JBU0UJMHgwMDAwCS8qIEhvc3QgdG8gUEMgQ2FyZCBNZXNzYWdpbmcgQXJlYSAqLwotI2RlZmluZSBGVDEwMDBfRFBSQU1fTUFHX1JYX0JBU0UJMHgwMjAwCS8qIFBDIENhcmQgdG8gSG9zdCBNZXNzYWdpbmcgQXJlYSAqLworI2RlZmluZSBGVDEwMDBfRFBSQU1fTUFHX1RYX0JBU0UJMHgwMDAwCS8qIEhvc3QgdG8gUEMgQ2FyZAorCQkJCQkJICogTWVzc2FnaW5nIEFyZWEKKwkJCQkJCSAqLworI2RlZmluZSBGVDEwMDBfRFBSQU1fTUFHX1JYX0JBU0UJMHgwMjAwCS8qIFBDIENhcmQgdG8gSG9zdAorCQkJCQkJICogTWVzc2FnaW5nIEFyZWEKKwkJCQkJCSAqLwogCi0jZGVmaW5lIEZUMTAwMF9NQUdfRklGT19MRU4JCTB4MUZGCS8qIHRvdGFsIGxlbmd0aCBmb3IgRFNQIEZJRk8gdHJhY2tpbmcgKi8KKyNkZWZpbmUgRlQxMDAwX01BR19GSUZPX0xFTgkJMHgxRkYJLyogdG90YWwgbGVuZ3RoIGZvciBEU1AKKwkJCQkJCSAqIEZJRk8gdHJhY2tpbmcKKwkJCQkJCSAqLwogI2RlZmluZSBGVDEwMDBfTUFHX0ZJRk9fTEVOX0lORFgJMHgxCS8qIGxvdy13b3JkIGluZGV4ICovCiAjZGVmaW5lIEZUMTAwMF9NQUdfSElfSE8JCTB4MUZGCS8qIGhlYXJ0YmVhdCB3aXRoIEhJL0hPICovCiAjZGVmaW5lIEZUMTAwMF9NQUdfSElfSE9fSU5EWAkJMHgwCS8qIGhpZ2gtd29yZCBpbmRleCAqLwotI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9MRUQJCTB4M0ZFCS8qIGRzcCBsZWQgc3RhdHVzIGZvciBQQUQgZGV2aWNlICovCi0jZGVmaW5lIEZUMTAwMF9NQUdfRFNQX0xFRF9JTkRYCQkweDAJLyogZHNwIGxlZCBzdGF0dXMgZm9yIFBBRCBkZXZpY2UgKi8KKyNkZWZpbmUgRlQxMDAwX01BR19EU1BfTEVECQkweDNGRQkvKiBkc3AgbGVkIHN0YXR1cyBmb3IKKwkJCQkJCSAqIFBBRCBkZXZpY2UKKwkJCQkJCSAqLworI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9MRURfSU5EWAkJMHgwCS8qIGRzcCBsZWQgc3RhdHVzIGZvcgorCQkJCQkJICogUEFEIGRldmljZQorCQkJCQkJICovCiAjZGVmaW5lIEZUMTAwMF9NQUdfRFNQX0NPTl9TVEFURQkweDNGRQkvKiBEU1AgQ29ubmVjdGlvbiBTdGF0dXMgSW5mbyAqLwogI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9DT05fU1RBVEVfSU5EWAkweDEJLyogRFNQIENvbm5lY3Rpb24gU3RhdHVzIEluZm8gKi8KLSNkZWZpbmUgRlQxMDAwX01BR19EUFJBTV9GRUZFCQkweDAwMAkvKiBsb2NhdGlvbiBmb3IgZHNwIHJlYWR5IGluZGljYXRvciAqLwotI2RlZmluZSBGVDEwMDBfTUFHX0RQUkFNX0ZFRkVfSU5EWAkweDAJLyogbG9jYXRpb24gZm9yIGRzcCByZWFkeSBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgRlQxMDAwX01BR19EU1BfVElNRVIwCQkweDNGQwkvKiBUaW1lciBGaWVsZCBmcm9tIEJhc2VzdGF0aW9uICovCisjZGVmaW5lIEZUMTAwMF9NQUdfRFBSQU1fRkVGRQkJMHgwMDAJLyogbG9jYXRpb24gZm9yIGRzcCByZWFkeQorCQkJCQkJICogaW5kaWNhdG9yCisJCQkJCQkgKi8KKyNkZWZpbmUgRlQxMDAwX01BR19EUFJBTV9GRUZFX0lORFgJMHgwCS8qIGxvY2F0aW9uIGZvciBkc3AgcmVhZHkKKwkJCQkJCSAqIGluZGljYXRvcgorCQkJCQkJICovCisjZGVmaW5lIEZUMTAwMF9NQUdfRFNQX1RJTUVSMAkJMHgzRkMJLyogVGltZXIgRmllbGQgZnJvbQorCQkJCQkJICogQmFzZXN0YXRpb24KKwkJCQkJCSAqLwogI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9USU1FUjBfSU5EWAkweDEKLSNkZWZpbmUgRlQxMDAwX01BR19EU1BfVElNRVIxCQkweDNGQwkvKiBUaW1lciBGaWVsZCBmcm9tIEJhc2VzdGF0aW9uICovCisjZGVmaW5lIEZUMTAwMF9NQUdfRFNQX1RJTUVSMQkJMHgzRkMJLyogVGltZXIgRmllbGQgZnJvbQorCQkJCQkJICogQmFzZXN0YXRpb24KKwkJCQkJCSAqLwogI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9USU1FUjFfSU5EWAkweDAKLSNkZWZpbmUgRlQxMDAwX01BR19EU1BfVElNRVIyCQkweDNGRAkvKiBUaW1lciBGaWVsZCBmcm9tIEJhc2VzdGF0aW9uICovCisjZGVmaW5lIEZUMTAwMF9NQUdfRFNQX1RJTUVSMgkJMHgzRkQJLyogVGltZXIgRmllbGQgZnJvbQorCQkJCQkJICogQmFzZXN0YXRpb24KKwkJCQkJCSAqLwogI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9USU1FUjJfSU5EWAkweDEKLSNkZWZpbmUgRlQxMDAwX01BR19EU1BfVElNRVIzCQkweDNGRAkvKiBUaW1lciBGaWVsZCBmcm9tIEJhc2VzdGF0aW9uICovCisjZGVmaW5lIEZUMTAwMF9NQUdfRFNQX1RJTUVSMwkJMHgzRkQJLyogVGltZXIgRmllbGQgZnJvbQorCQkJCQkJICogQmFzZXN0YXRpb24KKwkJCQkJCSAqLwogI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9USU1FUjNfSU5EWAkweDAKICNkZWZpbmUgRlQxMDAwX01BR19UT1RBTF9MRU4JCTB4MjAwCiAjZGVmaW5lIEZUMTAwMF9NQUdfVE9UQUxfTEVOX0lORFgJMHgxCkBAIC05OSwyNCArMTUzLDM4IEBACiAjZGVmaW5lIEhPU1RfSU5URl9CRQkweDEJLyogSG9zdCBpbnRlcmZhY2UgYmlnIGVuZGlhbiBtb2RlICovCiAKIC8qIEZUMTAwMCB0byBIb3N0IERvb3JiZWxsIGFzc2lnbm1lbnRzICovCi0jZGVmaW5lIEZUMTAwMF9EQl9EUFJBTV9SWAkweDAwMDEJLyogdGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBEU1AgaGFzIGRhdGEgZm9yIGhvc3QgaW4gRFBSQU0gKi8KKyNkZWZpbmUgRlQxMDAwX0RCX0RQUkFNX1JYCTB4MDAwMQkvKiB0aGlzIHZhbHVlIGluZGljYXRlcyB0aGF0IERTUAorCQkJCQkgKiBoYXMgZGF0YSBmb3IgaG9zdCBpbiBEUFJBTQorCQkJCQkgKi8KICNkZWZpbmUgRlQxMDAwX0RCX0ROTERfUlgJMHgwMDAyCS8qIERvd25sb2FkZXIgaGFuZHNoYWtlIGRvb3JiZWxsICovCi0jZGVmaW5lIEZUMTAwMF9BU0lDX1JFU0VUX1JFUQkweDAwMDQJLyogRFNQIHJlcXVlc3RpbmcgaG9zdCB0byByZXNldCB0aGUgQVNJQyAqLwotI2RlZmluZSBGVDEwMDBfRFNQX0FTSUNfUkVTRVQJMHgwMDA4CS8qIERTUCBpbmRpY2F0aW5nIGhvc3QgdGhhdCBpdCB3aWxsIHJlc2V0IHRoZSBBU0lDICovCisjZGVmaW5lIEZUMTAwMF9BU0lDX1JFU0VUX1JFUQkweDAwMDQJLyogRFNQIHJlcXVlc3RpbmcgaG9zdCB0bworCQkJCQkgKiByZXNldCB0aGUgQVNJQworCQkJCQkgKi8KKyNkZWZpbmUgRlQxMDAwX0RTUF9BU0lDX1JFU0VUCTB4MDAwOAkvKiBEU1AgaW5kaWNhdGluZyBob3N0IHRoYXQKKwkJCQkJICogaXQgd2lsbCByZXNldCB0aGUgQVNJQworCQkJCQkgKi8KICNkZWZpbmUgRlQxMDAwX0RCX0NPTkRfUkVTRVQJMHgwMDEwCS8qIERTUCByZXF1ZXN0IGZvciBhIGNhcmQgcmVzZXQuICovCiAKIC8qIEhvc3QgdG8gRlQxMDAwIERvb3JiZWxsIGFzc2lnbm1lbnRzICovCi0jZGVmaW5lIEZUMTAwMF9EQl9EUFJBTV9UWAkweDAxMDAJLyogdGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBob3N0IGhhcyBkYXRhIGZvciBEU1AgaW4gRFBSQU0uICovCisjZGVmaW5lIEZUMTAwMF9EQl9EUFJBTV9UWAkweDAxMDAJLyogdGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBob3N0CisJCQkJCSAqIGhhcyBkYXRhIGZvciBEU1AgaW4gRFBSQU0uCisJCQkJCSAqLwogI2RlZmluZSBGVDEwMDBfREJfRE5MRF9UWAkweDAyMDAJLyogRG93bmxvYWRlciBoYW5kc2hha2UgZG9vcmJlbGwgKi8KICNkZWZpbmUgRlQxMDAwX0FTSUNfUkVTRVRfRFNQCTB4MDQwMAkvKiBSZXNwb25kcyB0byBGVDEwMDBfQVNJQ19SRVNFVF9SRVEgKi8KLSNkZWZpbmUgRlQxMDAwX0RCX0hCCQkweDEwMDAJLyogSW5kaWNhdGVzIHRoYXQgc3VwZXJ2aXNvciBoYXMgYSBoZWFydGJlYXQgbWVzc2FnZSBmb3IgRFNQLiAqLworI2RlZmluZSBGVDEwMDBfREJfSEIJCTB4MTAwMAkvKiBJbmRpY2F0ZXMgdGhhdCBzdXBlcnZpc29yIGhhcyBhCisJCQkJCSAqIGhlYXJ0YmVhdCBtZXNzYWdlIGZvciBEU1AuCisJCQkJCSAqLwogCiAjZGVmaW5lIGhpCQkJMHg2ODY5CS8qIFBDIENhcmQgaGVhcnRiZWF0IHZhbHVlcyAqLwogI2RlZmluZSBobwkJCTB4Njg2ZgkvKiBQQyBDYXJkIGhlYXJ0YmVhdCB2YWx1ZXMgKi8KIAogLyogTWFnbmVtaXRlIHNwZWNpZmljIGRlZmluZXMgKi8KLSNkZWZpbmUgaGlfbWFnCQkJMHg2OTY4CS8qIEJ5dGUgc3dhcCBoaSB0byBhdm9pZCBhZGRpdGlvbmFsIHN5c3RlbSBjYWxsICovCi0jZGVmaW5lIGhvX21hZwkJCTB4NmY2OAkvKiBCeXRlIHN3YXAgaG8gdG8gYXZvaWQgYWRkaXRpb25hbCBzeXN0ZW0gY2FsbCAqLworI2RlZmluZSBoaV9tYWcJCQkweDY5NjgJLyogQnl0ZSBzd2FwIGhpIHRvIGF2b2lkCisJCQkJCSAqIGFkZGl0aW9uYWwgc3lzdGVtIGNhbGwKKwkJCQkJICovCisjZGVmaW5lIGhvX21hZwkJCTB4NmY2OAkvKiBCeXRlIHN3YXAgaG8gdG8gYXZvaWQKKwkJCQkJICogYWRkaXRpb25hbCBzeXN0ZW0gY2FsbAorCQkJCQkgKi8KIAogLyogQml0IGZpZWxkIGRlZmluaXRpb25zIGZvciBIb3N0IEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KIC8qIEluZGljYXRlIHRoZSBjYXVzZSBvZiBhbiBpbnRlcnJ1cHQuICovCkBAIC0xMzMsMTMgKzIwMSwxOSBAQAogI2RlZmluZSBJU1JfTUFTS19SQ1YJCTB4MDAwNAkvKiBEb3dubGluayBQYWNrZXQgYXZhaWxhYmxlIG1hc2sgKi8KICNkZWZpbmUgSVNSX01BU0tfV0FURVJNQVJLCTB4MDAwOAkvKiBXYXRlcm1hcmsgaW50ZXJydXB0IG1hc2sgKi8KICNkZWZpbmUgSVNSX01BU0tfQUxMCQkweGZmZmYJLyogTWFzayBhbGwgaW50ZXJydXB0cyAqLwotLyogRGVmYXVsdCBpbnRlcnJ1cHQgbWFzayAoRW5hYmxlIERvb3JiZWxsIHBlbmRpbmcgYW5kIFBhY2tldCBhdmFpbGFibGUgaW50ZXJydXB0cykgKi8KKy8qIERlZmF1bHQgaW50ZXJydXB0IG1hc2sKKyAqIChFbmFibGUgRG9vcmJlbGwgcGVuZGluZyBhbmQgUGFja2V0IGF2YWlsYWJsZSBpbnRlcnJ1cHRzKQorICovCiAjZGVmaW5lIElTUl9ERUZBVUxUX01BU0sJMHg3ZmY5CiAKIC8qIEJpdCBmaWVsZCBkZWZpbml0aW9uIGZvciBIb3N0IENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRFNQX1JFU0VUX0JJVAkJMHgwMDAxCS8qIEJpdCBmaWVsZCB0byBjb250cm9sIGRzcCByZXNldCBzdGF0ZSAqLworI2RlZmluZSBEU1BfUkVTRVRfQklUCQkweDAwMDEJLyogQml0IGZpZWxkIHRvIGNvbnRyb2wKKwkJCQkJICogZHNwIHJlc2V0IHN0YXRlCisJCQkJCSAqLwogCQkJCQkvKiAoMCA9IG91dCBvZiByZXNldCAxID0gcmVzZXQpICovCi0jZGVmaW5lIEFTSUNfUkVTRVRfQklUCQkweDAwMDIJLyogQml0IGZpZWxkIHRvIGNvbnRyb2wgQVNJQyByZXNldCBzdGF0ZSAqLworI2RlZmluZSBBU0lDX1JFU0VUX0JJVAkJMHgwMDAyCS8qIEJpdCBmaWVsZCB0byBjb250cm9sCisJCQkJCSAqIEFTSUMgcmVzZXQgc3RhdGUKKwkJCQkJICovCiAJCQkJCS8qICgwID0gb3V0IG9mIHJlc2V0IDEgPSByZXNldCkgKi8KICNkZWZpbmUgRFNQX1VORU5DUllQVEVECQkweDAwMDQKICNkZWZpbmUgRFNQX0VOQ1JZUFRFRAkJMHgwMDA4CkBAIC0xOTUsNyArMjY5LDkgQEAKIAl1bnNpZ25lZCBjaGFyCXNvdXJjZTsJCS8qIGhhcmR3YXJlIHNvdXJjZSBpZCAqLwogCQkJCQkvKiAgICBIb3N0ID0gMHgxMCAqLwogCQkJCQkvKiAgICBEc3AgID0gMHgyMCAqLwotCXVuc2lnbmVkIGNoYXIJZGVzdGluYXRpb247CS8qIGhhcmR3YXJlIGRlc3RpbmF0aW9uIGlkIChyZWZlciB0byBzb3VyY2UpICovCisJdW5zaWduZWQgY2hhcglkZXN0aW5hdGlvbjsJLyogaGFyZHdhcmUgZGVzdGluYXRpb24gaWQKKwkJCQkJICogKHJlZmVyIHRvIHNvdXJjZSkKKwkJCQkJICovCiAJdW5zaWduZWQgY2hhcglwb3J0ZGVzdDsJLyogc29mdHdhcmUgZGVzdGluYXRpb24gcG9ydCBpZCAqLwogCQkJCQkvKiAgICBIb3N0ID0gMHgwMCAqLwogCQkJCQkvKiAgICBBcHBsaWNhdG9uIEJyb2FkY2FzdCA9IDB4MTAgKi8KQEAgLTIwNCw3ICsyODAsOSBAQAogCQkJCQkvKiAgICBEc3AgQWlybGluayA9IDB4OTAgKi8KIAkJCQkJLyogICAgRHNwIExvYWRlciA9IDB4YTAgKi8KIAkJCQkJLyogICAgRHNwIE1JUCA9IDB4YjAgKi8KLQl1bnNpZ25lZCBjaGFyCXBvcnRzcmM7CS8qIHNvZnR3YXJlIHNvdXJjZSBwb3J0IGlkIChyZWZlciB0byBwb3J0ZGVzdCkgKi8KKwl1bnNpZ25lZCBjaGFyCXBvcnRzcmM7CS8qIHNvZnR3YXJlIHNvdXJjZSBwb3J0IGlkCisJCQkJCSAqIChyZWZlciB0byBwb3J0ZGVzdCkKKwkJCQkJICovCiAJdW5zaWduZWQgc2hvcnQJc2hfc3RyX2lkOwkvKiBub3QgdXNlZCAqLwogCXVuc2lnbmVkIGNoYXIJY29udHJvbDsJLyogbm90IHVzZWQgKi8KIAl1bnNpZ25lZCBjaGFyCXJzdmQxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX2x0ZS5jIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX2x0ZS5jCmluZGV4IDc0YTAzNjAuLjY0YzU1YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9sdGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbHRlLmMKQEAgLTEzMSw3ICsxMzEsOCBAQAogCiAJLyogR2V0IHRoZSBwb2ludGVyIG9mIHRoZSBvcmlnaW5hbCByZXF1ZXN0ICovCiAJYXJwX2luID0gKHN0cnVjdCBhcnBoZHIgKikoc2tiX2luLT5kYXRhICsgbWFjX2hlYWRlcl9sZW4pOwotCWFycF9kYXRhX2luID0gKHN0cnVjdCBhcnBkYXRhICopKHNrYl9pbi0+ZGF0YSArIG1hY19oZWFkZXJfbGVuICsgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpKTsKKwlhcnBfZGF0YV9pbiA9IChzdHJ1Y3QgYXJwZGF0YSAqKShza2JfaW4tPmRhdGEgKyBtYWNfaGVhZGVyX2xlbiArCisJCQkJCXNpemVvZihzdHJ1Y3QgYXJwaGRyKSk7CiAKIAkvKiBHZXQgdGhlIHBvaW50ZXIgb2YgdGhlIG91dGdvaW5nIHJlc3BvbnNlICovCiAJYXJwX291dCA9IChzdHJ1Y3QgYXJwaGRyICopYXJwX3RlbXA7CkBAIC0xNjAsOSArMTYxLDEyIEBACiAJCXJldHVybiAtRU5PTUVNOwogCXNrYl9yZXNlcnZlKHNrYl9vdXQsIE5FVF9JUF9BTElHTik7CiAKLQltZW1jcHkoc2tiX3B1dChza2Jfb3V0LCBtYWNfaGVhZGVyX2xlbiksIG1hY19oZWFkZXJfZGF0YSwgbWFjX2hlYWRlcl9sZW4pOwotCW1lbWNweShza2JfcHV0KHNrYl9vdXQsIHNpemVvZihzdHJ1Y3QgYXJwaGRyKSksIGFycF9vdXQsIHNpemVvZihzdHJ1Y3QgYXJwaGRyKSk7Ci0JbWVtY3B5KHNrYl9wdXQoc2tiX291dCwgc2l6ZW9mKHN0cnVjdCBhcnBkYXRhKSksIGFycF9kYXRhX291dCwgc2l6ZW9mKHN0cnVjdCBhcnBkYXRhKSk7CisJbWVtY3B5KHNrYl9wdXQoc2tiX291dCwgbWFjX2hlYWRlcl9sZW4pLCBtYWNfaGVhZGVyX2RhdGEsCisJCW1hY19oZWFkZXJfbGVuKTsKKwltZW1jcHkoc2tiX3B1dChza2Jfb3V0LCBzaXplb2Yoc3RydWN0IGFycGhkcikpLCBhcnBfb3V0LAorCQlzaXplb2Yoc3RydWN0IGFycGhkcikpOworCW1lbWNweShza2JfcHV0KHNrYl9vdXQsIHNpemVvZihzdHJ1Y3QgYXJwZGF0YSkpLCBhcnBfZGF0YV9vdXQsCisJCXNpemVvZihzdHJ1Y3QgYXJwZGF0YSkpOwogCiAJc2tiX291dC0+cHJvdG9jb2wgPSAoKHN0cnVjdCBldGhoZHIgKiltYWNfaGVhZGVyX2RhdGEpLT5oX3Byb3RvOwogCXNrYl9vdXQtPmRldiA9IHNrYl9pbi0+ZGV2OwpAQCAtMTk4LDcgKzIwMiw3IEBACiAJcHNldWRvX2hlYWRlci5waC5waF9ueHQgPSBpcHY2LT5uZXh0aGRyOwogCiAJdyA9ICh1MTYgKikmcHNldWRvX2hlYWRlcjsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHBzZXVkb19oZWFkZXIucGEpIC8gc2l6ZW9mKHBzZXVkb19oZWFkZXIucGFbMF0pOyBpKyspCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHNldWRvX2hlYWRlci5wYSk7IGkrKykKIAkJc3VtICs9IHBzZXVkb19oZWFkZXIucGFbaV07CiAKIAl3ID0gcHRyOwpAQCAtMjYwLDExICsyNjQsMTQgQEAKIAkJcmV0dXJuIC0xOwogCiAJLyogQ2hlY2sgaWYgdGhpcyBpcyBORFAgcGFja2V0ICovCi0JaWNtcDZfaW4gPSAoc3RydWN0IGljbXA2aGRyICopKHNrYl9pbi0+ZGF0YSArIG1hY19oZWFkZXJfbGVuICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJaWNtcDZfaW4gPSAoc3RydWN0IGljbXA2aGRyICopKHNrYl9pbi0+ZGF0YSArIG1hY19oZWFkZXJfbGVuICsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CiAJaWYgKGljbXA2X2luLT5pY21wNl90eXBlID09IE5ESVNDX1JPVVRFUl9TT0xJQ0lUQVRJT04pIHsgLyogQ2hlY2sgUlMgKi8KIAkJcmV0dXJuIC0xOwotCX0gZWxzZSBpZiAoaWNtcDZfaW4tPmljbXA2X3R5cGUgPT0gTkRJU0NfTkVJR0hCT1VSX1NPTElDSVRBVElPTikgeyAvKiBDaGVjayBOUyAqLwotCQl1OCBpY21wX25hW3NpemVvZihzdHJ1Y3QgaWNtcDZoZHIpICsgc2l6ZW9mKHN0cnVjdCBuZWlnaGJvdXJfYWR2ZXJ0aXNlbWVudCldOworCX0gZWxzZSBpZiAoaWNtcDZfaW4tPmljbXA2X3R5cGUgPT0gTkRJU0NfTkVJR0hCT1VSX1NPTElDSVRBVElPTikgeworCQkvKiBDaGVjayBOUyAqLworCQl1OCBpY21wX25hW3NpemVvZihzdHJ1Y3QgaWNtcDZoZHIpICsKKwkJCXNpemVvZihzdHJ1Y3QgbmVpZ2hib3VyX2FkdmVydGlzZW1lbnQpXTsKIAkJdTggemVyb19hZGRyOFsxNl0gPSB7MCx9OwogCiAJCWlmIChtZW1jbXAoaXB2Nl9pbi0+c2FkZHIuaW42X3UudTZfYWRkcjgsIHplcm9fYWRkcjgsIDE2KSA9PSAwKQpAQCAtMjc2LDcgKzI4Myw5IEBACiAJCWljbXA2X291dC5pY21wNl9ja3N1bSA9IDA7CiAJCWljbXA2X291dC5pY21wNl9kYXRhdW4udW5fZGF0YTMyWzBdID0gaHRvbmwoMHg2MDAwMDAwMCk7IC8qIFI9MCwgUz0xLCBPPTEgKi8KIAotCQlucyA9IChzdHJ1Y3QgbmVpZ2hib3VyX3NvbGljaXRhdGlvbiAqKShza2JfaW4tPmRhdGEgKyBtYWNfaGVhZGVyX2xlbiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSk7CisJCW5zID0gKHN0cnVjdCBuZWlnaGJvdXJfc29saWNpdGF0aW9uICopCisJCQkoc2tiX2luLT5kYXRhICsgbWFjX2hlYWRlcl9sZW4gKworCQkJIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSk7CiAJCW1lbWNweSgmbmEudGFyZ2V0X2FkZHJlc3MsIG5zLT50YXJnZXRfYWRkcmVzcywgMTYpOwogCQluYS50eXBlID0gMHgwMjsKIAkJbmEubGVuZ3RoID0gMTsKQEAgLTI4OSwxMyArMjk4LDE3IEBACiAKIAkJbWVtY3B5KCZpcHY2X291dCwgaXB2Nl9pbiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CiAJCW1lbWNweShpcHY2X291dC5zYWRkci5pbjZfdS51Nl9hZGRyOCwgJm5hLnRhcmdldF9hZGRyZXNzLCAxNik7Ci0JCW1lbWNweShpcHY2X291dC5kYWRkci5pbjZfdS51Nl9hZGRyOCwgaXB2Nl9pbi0+c2FkZHIuaW42X3UudTZfYWRkcjgsIDE2KTsKLQkJaXB2Nl9vdXQucGF5bG9hZF9sZW4gPSBodG9ucyhzaXplb2Yoc3RydWN0IGljbXA2aGRyKSArIHNpemVvZihzdHJ1Y3QgbmVpZ2hib3VyX2FkdmVydGlzZW1lbnQpKTsKKwkJbWVtY3B5KGlwdjZfb3V0LmRhZGRyLmluNl91LnU2X2FkZHI4LAorCQkJaXB2Nl9pbi0+c2FkZHIuaW42X3UudTZfYWRkcjgsIDE2KTsKKwkJaXB2Nl9vdXQucGF5bG9hZF9sZW4gPSBodG9ucyhzaXplb2Yoc3RydWN0IGljbXA2aGRyKSArCisJCQkJc2l6ZW9mKHN0cnVjdCBuZWlnaGJvdXJfYWR2ZXJ0aXNlbWVudCkpOwogCiAJCW1lbWNweShpY21wX25hLCAmaWNtcDZfb3V0LCBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSk7Ci0JCW1lbWNweShpY21wX25hICsgc2l6ZW9mKHN0cnVjdCBpY21wNmhkciksICZuYSwgc2l6ZW9mKHN0cnVjdCBuZWlnaGJvdXJfYWR2ZXJ0aXNlbWVudCkpOworCQltZW1jcHkoaWNtcF9uYSArIHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpLCAmbmEsCisJCQlzaXplb2Yoc3RydWN0IG5laWdoYm91cl9hZHZlcnRpc2VtZW50KSk7CiAKLQkJaWNtcDZfb3V0LmljbXA2X2Nrc3VtID0gaWNtcDZfY2hlY2tzdW0oJmlwdjZfb3V0LCAodTE2ICopaWNtcF9uYSwgc2l6ZW9mKGljbXBfbmEpKTsKKwkJaWNtcDZfb3V0LmljbXA2X2Nrc3VtID0gaWNtcDZfY2hlY2tzdW0oJmlwdjZfb3V0LAorCQkJCQkodTE2ICopaWNtcF9uYSwgc2l6ZW9mKGljbXBfbmEpKTsKIAl9IGVsc2UgewogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMzExLDEwICszMjQsMTQgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJc2tiX3Jlc2VydmUoc2tiX291dCwgTkVUX0lQX0FMSUdOKTsKIAotCW1lbWNweShza2JfcHV0KHNrYl9vdXQsIG1hY19oZWFkZXJfbGVuKSwgbWFjX2hlYWRlcl9kYXRhLCBtYWNfaGVhZGVyX2xlbik7Ci0JbWVtY3B5KHNrYl9wdXQoc2tiX291dCwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSksICZpcHY2X291dCwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7Ci0JbWVtY3B5KHNrYl9wdXQoc2tiX291dCwgc2l6ZW9mKHN0cnVjdCBpY21wNmhkcikpLCAmaWNtcDZfb3V0LCBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSk7Ci0JbWVtY3B5KHNrYl9wdXQoc2tiX291dCwgc2l6ZW9mKHN0cnVjdCBuZWlnaGJvdXJfYWR2ZXJ0aXNlbWVudCkpLCAmbmEsIHNpemVvZihzdHJ1Y3QgbmVpZ2hib3VyX2FkdmVydGlzZW1lbnQpKTsKKwltZW1jcHkoc2tiX3B1dChza2Jfb3V0LCBtYWNfaGVhZGVyX2xlbiksIG1hY19oZWFkZXJfZGF0YSwKKwkJbWFjX2hlYWRlcl9sZW4pOworCW1lbWNweShza2JfcHV0KHNrYl9vdXQsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpLCAmaXB2Nl9vdXQsCisJCXNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCW1lbWNweShza2JfcHV0KHNrYl9vdXQsIHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpKSwgJmljbXA2X291dCwKKwkJc2l6ZW9mKHN0cnVjdCBpY21wNmhkcikpOworCW1lbWNweShza2JfcHV0KHNrYl9vdXQsIHNpemVvZihzdHJ1Y3QgbmVpZ2hib3VyX2FkdmVydGlzZW1lbnQpKSwgJm5hLAorCQlzaXplb2Yoc3RydWN0IG5laWdoYm91cl9hZHZlcnRpc2VtZW50KSk7CiAKIAlza2Jfb3V0LT5wcm90b2NvbCA9ICgoc3RydWN0IGV0aGhkciAqKW1hY19oZWFkZXJfZGF0YSktPmhfcHJvdG87CiAJc2tiX291dC0+ZGV2ID0gc2tiX2luLT5kZXY7CkBAIC0zNjMsNyArMzgwLDggQEAKIAogCQkvKiBDaGVjayBESENQdjQgKi8KIAkJaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgewotCQkJc3RydWN0IHVkcGhkciAqdWRwID0gKHN0cnVjdCB1ZHBoZHIgKikobmV0d29ya19kYXRhICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCQkJc3RydWN0IHVkcGhkciAqdWRwID0gKHN0cnVjdCB1ZHBoZHIgKikKKwkJCQkJKG5ldHdvcmtfZGF0YSArIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKIAkJCWlmIChudG9ocyh1ZHAtPmRlc3QpID09IDY3IHx8IG50b2hzKHVkcC0+ZGVzdCkgPT0gNjgpCiAJCQkJbmljX3R5cGUgfD0gTklDX1RZUEVfRl9ESENQOwogCQl9CkBAIC0zNzMsMTIgKzM5MSwxMyBAQAogCQlpcHY2ID0gKHN0cnVjdCBpcHY2aGRyICopbmV0d29ya19kYXRhOwogCiAJCWlmIChpcHY2LT5uZXh0aGRyID09IElQUFJPVE9fSUNNUFY2KSAvKiBDaGVjayBORFAgcmVxdWVzdCAqLyB7Ci0JCQlzdHJ1Y3QgaWNtcDZoZHIgKmljbXA2ID0gKHN0cnVjdCBpY21wNmhkciAqKShuZXR3b3JrX2RhdGEgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKLQkJCWlmICgvKmljbXA2LT5pY21wNl90eXBlID09IE5ESVNDX1JPVVRFUl9TT0xJQ0lUQVRJT04gfHwgKi8KLQkJCQlpY21wNi0+aWNtcDZfdHlwZSA9PSBORElTQ19ORUlHSEJPVVJfU09MSUNJVEFUSU9OKQorCQkJc3RydWN0IGljbXA2aGRyICppY21wNiA9IChzdHJ1Y3QgaWNtcDZoZHIgKikKKwkJCQkJKG5ldHdvcmtfZGF0YSArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCQkJaWYgKGljbXA2LT5pY21wNl90eXBlID09IE5ESVNDX05FSUdIQk9VUl9TT0xJQ0lUQVRJT04pCiAJCQkJbmljX3R5cGUgfD0gTklDX1RZUEVfSUNNUFY2OwogCQl9IGVsc2UgaWYgKGlwdjYtPm5leHRoZHIgPT0gSVBQUk9UT19VRFApIC8qIENoZWNrIERIQ1B2NiAqLyB7Ci0JCQlzdHJ1Y3QgdWRwaGRyICp1ZHAgPSAoc3RydWN0IHVkcGhkciAqKShuZXR3b3JrX2RhdGEgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKKwkJCXN0cnVjdCB1ZHBoZHIgKnVkcCA9IChzdHJ1Y3QgdWRwaGRyICopCisJCQkJCShuZXR3b3JrX2RhdGEgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKIAkJCWlmIChudG9ocyh1ZHAtPmRlc3QpID09IDU0NiB8fCBudG9ocyh1ZHAtPmRlc3QpID09IDU0NykKIAkJCQluaWNfdHlwZSB8PSBOSUNfVFlQRV9GX0RIQ1A7CiAJCX0KQEAgLTQyMCwxMSArNDM5LDEyIEBACiAJfQogCiAJLyoKLQlOZWVkIGJ5dGUgc2hpZnQgKHRoYXQgaXMsIHJlbW92ZSBWTEFOIHRhZykgaWYgdGhlcmUgaXMgb25lCi0JRm9yIHRoZSBjYXNlIG9mIEFSUCwgdGhpcyBicmVha3MgdGhlIG9mZnNldCBhcyB2bGFuX2V0aGhkcis0IGlzIHRyZWF0ZWQgYXMgZXRoaGRyCi0JSG93ZXZlciwgaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbSBhcyB0aGUgcmVzcG9uc2Ugc3RhcnRzIGZyb20gYXJwX2hkciBhbmQgZXRoaGRyCi0JaXMgY3JlYXRlZCBieSB0aGlzIGRyaXZlciBiYXNlZCBvbiB0aGUgTklDIG1hYwotCSovCisJICogTmVlZCBieXRlIHNoaWZ0ICh0aGF0IGlzLCByZW1vdmUgVkxBTiB0YWcpIGlmIHRoZXJlIGlzIG9uZQorCSAqIEZvciB0aGUgY2FzZSBvZiBBUlAsIHRoaXMgYnJlYWtzIHRoZSBvZmZzZXQgYXMgdmxhbl9ldGhoZHIrNAorCSAqIGlzIHRyZWF0ZWQgYXMgZXRoaGRyCUhvd2V2ZXIsIGl0IHNob3VsZG4ndCBiZSBhIHByb2JsZW0gYXMKKwkgKiB0aGUgcmVzcG9uc2Ugc3RhcnRzIGZyb20gYXJwX2hkciBhbmQgZXRoaGRyIGlzIGNyZWF0ZWQgYnkgdGhpcworCSAqIGRyaXZlciBiYXNlZCBvbiB0aGUgTklDIG1hYworCSAqLwogCWlmIChuaWNfdHlwZSAmIE5JQ19UWVBFX0ZfVkxBTikgewogCQlzdHJ1Y3Qgdmxhbl9ldGhoZHIgKnZsYW5fZXRoID0gKHN0cnVjdCB2bGFuX2V0aGhkciAqKXNrYi0+ZGF0YTsKIAkJbmljLT52bGFuX2lkID0gbnRvaHModmxhbl9ldGgtPmhfdmxhbl9UQ0kpICYgVkxBTl9WSURfTUFTSzsKQEAgLTQzNiwxNSArNDU2LDIzIEBACiAJCWRhdGFfbGVuID0gc2tiLT5sZW47CiAJfQogCi0JLyogSWYgaXQgaXMgYSBJQ01QVjYgcGFja2V0LCBjbGVhciBhbGwgdGhlIG90aGVyIGJpdHMgOiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBmaXJtd2FyZSAqLworCS8qIElmIGl0IGlzIGEgSUNNUFY2IHBhY2tldCwgY2xlYXIgYWxsIHRoZSBvdGhlciBiaXRzIDoKKwkgKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBmaXJtd2FyZQorCSAqLwogCWlmIChuaWNfdHlwZSAmIE5JQ19UWVBFX0lDTVBWNikKIAkJbmljX3R5cGUgPSBOSUNfVFlQRV9JQ01QVjY7CiAKLQkvKiBJZiBpdCBpcyBub3QgYSBkaGNwIHBhY2tldCwgY2xlYXIgYWxsIHRoZSBmbGFnIGJpdHMgOiBvcmlnaW5hbCBOSUMsIG90aGVyd2lzZSB0aGUgc3BlY2lhbCBmbGFnIChJUFZYIHwgREhDUCkgKi8KKwkvKiBJZiBpdCBpcyBub3QgYSBkaGNwIHBhY2tldCwgY2xlYXIgYWxsIHRoZSBmbGFnIGJpdHMgOgorCSAqIG9yaWdpbmFsIE5JQywgb3RoZXJ3aXNlIHRoZSBzcGVjaWFsIGZsYWcgKElQVlggfCBESENQKQorCSAqLwogCWlmICghKG5pY190eXBlICYgTklDX1RZUEVfRl9ESENQKSkKIAkJbmljX3R5cGUgJj0gTklDX1RZUEVfTUFTSzsKIAotCXNzY2FuZihkZXYtPm5hbWUsICJsdGUlZCIsICZpZHgpOworCXJldCA9IHNzY2FuZihkZXYtPm5hbWUsICJsdGUlZCIsICZpZHgpOworCWlmIChyZXQgIT0gMSkgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXJldCA9IG5pYy0+cGh5X2Rldi0+c2VuZF9zZHVfZnVuYyhuaWMtPnBoeV9kZXYtPnByaXZfZGV2LAogCQkJCQkgIGRhdGFfYnVmLCBkYXRhX2xlbiwKQEAgLTQ4NSw4ICs1MTMsMTEgQEAKIAlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBoY2lfcGFja2V0ICpoY2kgPSAoc3RydWN0IGhjaV9wYWNrZXQgKilidWY7CiAJaW50IGlkeDsKKwlpbnQgcmV0OwogCi0Jc3NjYW5mKGRldi0+bmFtZSwgImx0ZSVkIiwgJmlkeCk7CisJcmV0ID0gc3NjYW5mKGRldi0+bmFtZSwgImx0ZSVkIiwgJmlkeCk7CisJaWYgKHJldCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiBuZXRsaW5rX3NlbmQobHRlX2V2ZW50LnNvY2ssIGlkeCwgMCwgYnVmLAogCQkJICAgIGdkbV9kZXYxNl90b19jcHUoCkBAIC00OTUsNyArNTI2LDggQEAKIAkJCSAgICArIEhDSV9IRUFERVJfU0laRSk7CiB9CiAKLXN0YXRpYyB2b2lkIGdkbV9sdGVfZXZlbnRfcmN2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiB0eXBlLCB2b2lkICptc2csIGludCBsZW4pCitzdGF0aWMgdm9pZCBnZG1fbHRlX2V2ZW50X3JjdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgdHlwZSwKKwkJCQl2b2lkICptc2csIGludCBsZW4pCiB7CiAJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtNTM2LDcgKzU2OCw4IEBACiAJcmV0dXJuIGluZGV4OwogfQogCi1zdGF0aWMgdm9pZCBnZG1fbHRlX25ldGlmX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50IGZsYWdnZWRfbmljX3R5cGUpCitzdGF0aWMgdm9pZCBnZG1fbHRlX25ldGlmX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwKKwkJCWludCBsZW4sIGludCBmbGFnZ2VkX25pY190eXBlKQogewogCXUzMiBuaWNfdHlwZTsKIAlzdHJ1Y3QgbmljICpuaWM7CkBAIC01NTEsMjggKzU4NCw0NiBAQAogCW5pYyA9IG5ldGRldl9wcml2KGRldik7CiAKIAlpZiAoZmxhZ2dlZF9uaWNfdHlwZSAmIE5JQ19UWVBFX0ZfREhDUCkgewotCQkvKiBDaGFuZ2UgdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIHdpdGggdGhlIG9uZSByZXF1ZXN0ZWQgdGhlIElQICovCisJCS8qIENoYW5nZSB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3MKKwkJICogd2l0aCB0aGUgb25lIHJlcXVlc3RlZCB0aGUgSVAKKwkJICovCiAJCWlmIChmbGFnZ2VkX25pY190eXBlICYgTklDX1RZUEVfRl9JUFY0KSB7CiAJCQlzdHJ1Y3QgZGhjcF9wYWNrZXQgewogCQkJCXU4IG9wOyAgICAgIC8qIEJPT1RSRVFVRVNUIG9yIEJPT1RSRVBMWSAqLwotCQkJCXU4IGh0eXBlOyAgIC8qIGhhcmR3YXJlIGFkZHJlc3MgdHlwZS4gMSA9IDEwbWIgZXRoZXJuZXQgKi8KKwkJCQl1OCBodHlwZTsgICAvKiBoYXJkd2FyZSBhZGRyZXNzIHR5cGUuCisJCQkJCSAgICAgKiAxID0gMTBtYiBldGhlcm5ldAorCQkJCQkgICAgICovCiAJCQkJdTggaGxlbjsgICAgLyogaGFyZHdhcmUgYWRkcmVzcyBsZW5ndGggKi8KIAkJCQl1OCBob3BzOyAgICAvKiB1c2VkIGJ5IHJlbGF5IGFnZW50cyBvbmx5ICovCiAJCQkJdTMyIHhpZDsgICAgLyogdW5pcXVlIGlkICovCi0JCQkJdTE2IHNlY3M7ICAgLyogZWxhcHNlZCBzaW5jZSBjbGllbnQgYmVnYW4gYWNxdWlzaXRpb24vcmVuZXdhbCAqLworCQkJCXUxNiBzZWNzOyAgIC8qIGVsYXBzZWQgc2luY2UgY2xpZW50IGJlZ2FuCisJCQkJCSAgICAgKiBhY3F1aXNpdGlvbi9yZW5ld2FsCisJCQkJCSAgICAgKi8KIAkJCQl1MTYgZmxhZ3M7ICAvKiBvbmx5IG9uZSBmbGFnIHNvIGZhcjogKi8KLQkJCQkjZGVmaW5lIEJST0FEQ0FTVF9GTEFHIDB4ODAwMCAvKiAiSSBuZWVkIGJyb2FkY2FzdCByZXBsaWVzIiAqLwotCQkJCXUzMiBjaWFkZHI7IC8qIGNsaWVudCBJUCAoaWYgY2xpZW50IGlzIGluIEJPVU5ELCBSRU5FVyBvciBSRUJJTkRJTkcgc3RhdGUpICovCisJCQkJI2RlZmluZSBCUk9BRENBU1RfRkxBRyAweDgwMDAKKwkJCQkvKiAiSSBuZWVkIGJyb2FkY2FzdCByZXBsaWVzIiAqLworCQkJCXUzMiBjaWFkZHI7IC8qIGNsaWVudCBJUCAoaWYgY2xpZW50IGlzIGluCisJCQkJCSAgICAgKiBCT1VORCwgUkVORVcgb3IgUkVCSU5ESU5HIHN0YXRlKQorCQkJCQkgICAgICovCiAJCQkJdTMyIHlpYWRkcjsgLyogJ3lvdXInIChjbGllbnQpIElQIGFkZHJlc3MgKi8KLQkJCQkvKiBJUCBhZGRyZXNzIG9mIG5leHQgc2VydmVyIHRvIHVzZSBpbiBib290c3RyYXAsIHJldHVybmVkIGluIERIQ1BPRkZFUiwgREhDUEFDSyBieSBzZXJ2ZXIgKi8KKwkJCQkvKiBJUCBhZGRyZXNzIG9mIG5leHQgc2VydmVyIHRvIHVzZSBpbgorCQkJCSAqIGJvb3RzdHJhcCwgcmV0dXJuZWQgaW4gREhDUE9GRkVSLAorCQkJCSAqIERIQ1BBQ0sgYnkgc2VydmVyCisJCQkJICovCiAJCQkJdTMyIHNpYWRkcl9uaXA7CiAJCQkJdTMyIGdhdGV3YXlfbmlwOyAvKiByZWxheSBhZ2VudCBJUCBhZGRyZXNzICovCi0JCQkJdTggY2hhZGRyWzE2XTsgICAvKiBsaW5rLWxheWVyIGNsaWVudCBoYXJkd2FyZSBhZGRyZXNzIChNQUMpICovCisJCQkJdTggY2hhZGRyWzE2XTsgICAvKiBsaW5rLWxheWVyIGNsaWVudCBoYXJkd2FyZQorCQkJCQkJICAqIGFkZHJlc3MgKE1BQykKKwkJCQkJCSAgKi8KIAkJCQl1OCBzbmFtZVs2NF07ICAgIC8qIHNlcnZlciBob3N0IG5hbWUgKEFTQ0laKSAqLwogCQkJCXU4IGZpbGVbMTI4XTsgICAgLyogYm9vdCBmaWxlIG5hbWUgKEFTQ0laKSAqLwotCQkJCXUzMiBjb29raWU7ICAgICAgLyogZml4ZWQgZmlyc3QgZm91ciBvcHRpb24gYnl0ZXMgKDk5LDEzMCw4Myw5OSBkZWMpICovCisJCQkJdTMyIGNvb2tpZTsgICAgICAvKiBmaXhlZCBmaXJzdCBmb3VyIG9wdGlvbgorCQkJCQkJICAqIGJ5dGVzICg5OSwxMzAsODMsOTkgZGVjKQorCQkJCQkJICAqLwogCQkJfSBfX3BhY2tlZDsKLQkJCXZvaWQgKmFkZHIgPSBidWYgKyBzaXplb2Yoc3RydWN0IGlwaGRyKSArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSArIG9mZnNldG9mKHN0cnVjdCBkaGNwX3BhY2tldCwgY2hhZGRyKTsKKwkJCXZvaWQgKmFkZHIgPSBidWYgKyBzaXplb2Yoc3RydWN0IGlwaGRyKSArCisJCQkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICsKKwkJCQlvZmZzZXRvZihzdHJ1Y3QgZGhjcF9wYWNrZXQsIGNoYWRkcik7CiAJCQltZW1jcHkobmljLT5kZXN0X21hY19hZGRyLCBhZGRyLCBFVEhfQUxFTik7CiAJCX0KIAl9CkBAIC01OTMsNyArNjQ0LDkgQEAKIAl2bGFuX2V0aC5oX3ZsYW5fcHJvdG8gPSBodG9ucyhFVEhfUF84MDIxUSk7CiAKIAlpZiAobmljX3R5cGUgPT0gTklDX1RZUEVfQVJQKSB7Ci0JCS8qIFNob3VsZCBiZSByZXNwb25zZTogT25seSBoYXBwZW5zIGJlY2F1c2UgdGhlcmUgd2FzIGEgcmVxdWVzdCBmcm9tIHRoZSBob3N0ICovCisJCS8qIFNob3VsZCBiZSByZXNwb25zZTogT25seSBoYXBwZW5zIGJlY2F1c2UKKwkJICogdGhlcmUgd2FzIGEgcmVxdWVzdCBmcm9tIHRoZSBob3N0CisJCSAqLwogCQlldGguaF9wcm90byA9IGh0b25zKEVUSF9QX0FSUCk7CiAJCXZsYW5fZXRoLmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8gPSBodG9ucyhFVEhfUF9BUlApOwogCX0gZWxzZSB7CkBAIC02NDAsMTUgKzY5MywyMCBAQAogCXUzMiBuaWNfdHlwZTsKIAl1OCBpbmRleDsKIAotCWhjaV9sZW4gPSBnZG1fZGV2MTZfdG9fY3B1KHBoeV9kZXYtPmdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLCBtdWx0aV9zZHUtPmxlbik7Ci0JbnVtX3BhY2tldCA9IGdkbV9kZXYxNl90b19jcHUocGh5X2Rldi0+Z2V0X2VuZGlhbihwaHlfZGV2LT5wcml2X2RldiksIG11bHRpX3NkdS0+bnVtX3BhY2tldCk7CisJaGNpX2xlbiA9IGdkbV9kZXYxNl90b19jcHUocGh5X2Rldi0+Z2V0X2VuZGlhbihwaHlfZGV2LT5wcml2X2RldiksCisJCQkJbXVsdGlfc2R1LT5sZW4pOworCW51bV9wYWNrZXQgPSBnZG1fZGV2MTZfdG9fY3B1KHBoeV9kZXYtPmdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLAorCQkJCW11bHRpX3NkdS0+bnVtX3BhY2tldCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhY2tldDsgaSsrKSB7CiAJCXNkdSA9IChzdHJ1Y3Qgc2R1ICopZGF0YTsKIAotCQljbWRfZXZ0ID0gZ2RtX2RldjE2X3RvX2NwdShwaHlfZGV2LT5nZXRfZW5kaWFuKHBoeV9kZXYtPnByaXZfZGV2KSwgc2R1LT5jbWRfZXZ0KTsKLQkJaGNpX2xlbiA9IGdkbV9kZXYxNl90b19jcHUocGh5X2Rldi0+Z2V0X2VuZGlhbihwaHlfZGV2LT5wcml2X2RldiksIHNkdS0+bGVuKTsKLQkJbmljX3R5cGUgPSBnZG1fZGV2MzJfdG9fY3B1KHBoeV9kZXYtPmdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLCBzZHUtPm5pY190eXBlKTsKKwkJY21kX2V2dCA9IGdkbV9kZXYxNl90b19jcHUocGh5X2Rldi0+CisJCQkJZ2V0X2VuZGlhbihwaHlfZGV2LT5wcml2X2RldiksIHNkdS0+Y21kX2V2dCk7CisJCWhjaV9sZW4gPSBnZG1fZGV2MTZfdG9fY3B1KHBoeV9kZXYtPgorCQkJCWdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLCBzZHUtPmxlbik7CisJCW5pY190eXBlID0gZ2RtX2RldjMyX3RvX2NwdShwaHlfZGV2LT4KKwkJCQlnZXRfZW5kaWFuKHBoeV9kZXYtPnByaXZfZGV2KSwgc2R1LT5uaWNfdHlwZSk7CiAKIAkJaWYgKGNtZF9ldnQgIT0gTFRFX1JYX1NEVSkgewogCQkJcHJfZXJyKCJyeCBzZHUgd3JvbmcgaGNpICUwNHhcbiIsIGNtZF9ldnQpOwpAQCAtNjYyLDcgKzcyMCw4IEBACiAJCWluZGV4ID0gZmluZF9kZXZfaW5kZXgobmljX3R5cGUpOwogCQlpZiAoaW5kZXggPCBNQVhfTklDX1RZUEUpIHsKIAkJCWRldiA9IHBoeV9kZXYtPmRldltpbmRleF07Ci0JCQlnZG1fbHRlX25ldGlmX3J4KGRldiwgKGNoYXIgKilzZHUtPmRhdGEsIChpbnQpKGhjaV9sZW4tMTIpLCBuaWNfdHlwZSk7CisJCQlnZG1fbHRlX25ldGlmX3J4KGRldiwgKGNoYXIgKilzZHUtPmRhdGEsCisJCQkJCShpbnQpKGhjaV9sZW4tMTIpLCBuaWNfdHlwZSk7CiAJCX0gZWxzZSB7CiAJCQlwcl9lcnIoInJ4IHNkdSBpbnZhbGlkIG5pY190eXBlIDoleFxuIiwgbmljX3R5cGUpOwogCQl9CkBAIC03MDksNyArNzY4LDggQEAKIAlpZiAoIWxlbikKIAkJcmV0dXJuIHJldDsKIAotCWNtZF9ldnQgPSBnZG1fZGV2MTZfdG9fY3B1KHBoeV9kZXYtPmdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLCBoY2ktPmNtZF9ldnQpOworCWNtZF9ldnQgPSBnZG1fZGV2MTZfdG9fY3B1KHBoeV9kZXYtPmdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLAorCQkJCWhjaS0+Y21kX2V2dCk7CiAKIAlkZXYgPSBwaHlfZGV2LT5kZXZbMF07CiAJaWYgKGRldiA9PSBOVUxMKQpAQCAtNzE4LDcgKzc3OCw4IEBACiAJc3dpdGNoIChjbWRfZXZ0KSB7CiAJY2FzZSBMVEVfUlhfU0RVOgogCQlzZHUgPSAoc3RydWN0IHNkdSAqKWhjaS0+ZGF0YTsKLQkJbmljX3R5cGUgPSBnZG1fZGV2MzJfdG9fY3B1KHBoeV9kZXYtPmdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLCBzZHUtPm5pY190eXBlKTsKKwkJbmljX3R5cGUgPSBnZG1fZGV2MzJfdG9fY3B1KHBoeV9kZXYtPgorCQkJCWdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLCBzZHUtPm5pY190eXBlKTsKIAkJaW5kZXggPSBmaW5kX2Rldl9pbmRleChuaWNfdHlwZSk7CiAJCWRldiA9IHBoeV9kZXYtPmRldltpbmRleF07CiAJCWdkbV9sdGVfbmV0aWZfcngoZGV2LCBoY2ktPmRhdGEsIGxlbiwgbmljX3R5cGUpOwpAQCAtNzMzLDcgKzc5NCw5IEBACiAJCWJyZWFrOwogCWNhc2UgTFRFX1BETl9UQUJMRV9JTkQ6CiAJCXBkbl90YWJsZSA9IChzdHJ1Y3QgaGNpX3Bkbl90YWJsZV9pbmQgKilidWY7Ci0JCW5pY190eXBlID0gZ2RtX2RldjMyX3RvX2NwdShwaHlfZGV2LT5nZXRfZW5kaWFuKHBoeV9kZXYtPnByaXZfZGV2KSwgcGRuX3RhYmxlLT5uaWNfdHlwZSk7CisJCW5pY190eXBlID0gZ2RtX2RldjMyX3RvX2NwdShwaHlfZGV2LT4KKwkJCQlnZXRfZW5kaWFuKHBoeV9kZXYtPnByaXZfZGV2KSwKKwkJCQlwZG5fdGFibGUtPm5pY190eXBlKTsKIAkJaW5kZXggPSBmaW5kX2Rldl9pbmRleChuaWNfdHlwZSk7CiAJCWRldiA9IHBoeV9kZXYtPmRldltpbmRleF07CiAJCWdkbV9sdGVfcGRuX3RhYmxlKGRldiwgYnVmLCBsZW4pOwpAQCAtNzU4LDcgKzgyMSw4IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX1JYX1NVQk1JVF9DT1VOVDsgaSsrKQotCQlwaHlfZGV2LT5yY3ZfZnVuYyhwaHlfZGV2LT5wcml2X2RldiwgcnhfY29tcGxldGUsIHBoeV9kZXYsIFVTQl9DT01QTEVURSk7CisJCXBoeV9kZXYtPnJjdl9mdW5jKHBoeV9kZXYtPnByaXZfZGV2LAorCQkJCXJ4X2NvbXBsZXRlLCBwaHlfZGV2LCBVU0JfQ09NUExFVEUpOwogfQogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGdkbV9uZXRkZXZfb3BzID0gewpAQCAtNzcxLDcgKzgzNSw4IEBACiAKIHN0YXRpYyB1OCBnZG1fbHRlX21hY2FkZHJbRVRIX0FMRU5dID0gezB4MDAsIDB4MGEsIDB4M2IsIDB4MDAsIDB4MDAsIDB4MDB9OwogCi1zdGF0aWMgdm9pZCBmb3JtX21hY19hZGRyZXNzKHU4ICpkZXZfYWRkciwgdTggKm5pY19zcmMsIHU4ICpuaWNfZGVzdCwgdTggKm1hY19hZGRyZXNzLCB1OCBpbmRleCkKK3N0YXRpYyB2b2lkIGZvcm1fbWFjX2FkZHJlc3ModTggKmRldl9hZGRyLCB1OCAqbmljX3NyYywgdTggKm5pY19kZXN0LAorCQkJdTggKm1hY19hZGRyZXNzLCB1OCBpbmRleCkKIHsKIAkvKiBGb3JtIHRoZSBkZXZfYWRkciAqLwogCWlmICghbWFjX2FkZHJlc3MpCkBAIC03NzksMTAgKzg0NCwxNCBAQAogCWVsc2UKIAkJbWVtY3B5KGRldl9hZGRyLCBtYWNfYWRkcmVzcywgRVRIX0FMRU4pOwogCi0JLyogVGhlIGxhc3QgYnl0ZSBvZiB0aGUgbWFjIGFkZHJlc3Mgc2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAweEZDICovCisJLyogVGhlIGxhc3QgYnl0ZSBvZiB0aGUgbWFjIGFkZHJlc3MKKwkgKiBzaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDB4RkMKKwkgKi8KIAlkZXZfYWRkcltFVEhfQUxFTi0xXSArPSBpbmRleDsKIAotCS8qIENyZWF0ZSByYW5kb20gbmljIHNyYyBhbmQgY29weSB0aGUgZmlyc3QgMyBieXRlcyB0byBiZSB0aGUgc2FtZSBhcyBkZXZfYWRkciAqLworCS8qIENyZWF0ZSByYW5kb20gbmljIHNyYyBhbmQgY29weSB0aGUgZmlyc3QKKwkgKiAzIGJ5dGVzIHRvIGJlIHRoZSBzYW1lIGFzIGRldl9hZGRyCisJICovCiAJcmFuZG9tX2V0aGVyX2FkZHIobmljX3NyYyk7CiAJbWVtY3B5KG5pY19zcmMsIGRldl9hZGRyLCAzKTsKIApAQCAtNzk5LDcgKzg2OCw4IEBACiAJfQogfQogCi1pbnQgcmVnaXN0ZXJfbHRlX2RldmljZShzdHJ1Y3QgcGh5X2RldiAqcGh5X2Rldiwgc3RydWN0IGRldmljZSAqZGV2LCB1OCAqbWFjX2FkZHJlc3MpCitpbnQgcmVnaXN0ZXJfbHRlX2RldmljZShzdHJ1Y3QgcGh5X2RldiAqcGh5X2RldiwKKwkJCXN0cnVjdCBkZXZpY2UgKmRldiwgdTggKm1hY19hZGRyZXNzKQogewogCXN0cnVjdCBuaWMgKm5pYzsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0OwpAQCAtODE0LDcgKzg4NCw4IEBACiAJCXNwcmludGYocGRuX2Rldl9uYW1lLCAibHRlJSVkcGRuJWQiLCBpbmRleCk7CiAKIAkJLyogQWxsb2NhdGUgbmV0ZGV2ICovCi0JCW5ldCA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IG5pYyksIHBkbl9kZXZfbmFtZSwgZXRoZXJfc2V0dXApOworCQluZXQgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBuaWMpLCBwZG5fZGV2X25hbWUsCisJCQkJZXRoZXJfc2V0dXApOwogCQlpZiAobmV0ID09IE5VTEwpIHsKIAkJCXByX2VycigiYWxsb2NfbmV0ZGV2IGZhaWxlZFxuIik7CiAJCQlyZXQgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX2x0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX2x0ZS5oCmluZGV4IDkyODdkMzEuLjg4NDE0ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9sdGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbHRlLmgKQEAgLTU2LDcgKzU2LDcgQEAKIAkJCWludCAoKmNiKSh2b2lkICpjYl9kYXRhLCB2b2lkICpkYXRhLCBpbnQgbGVuLAogCQkJCSAgaW50IGNvbnRleHQpLAogCQkJdm9pZCAqY2JfZGF0YSwgaW50IGNvbnRleHQpOwotCXN0cnVjdCBnZG1fZW5kaWFuICooKmdldF9lbmRpYW4pKHZvaWQgKnByaXZfZGV2KTsKKwlzdHJ1Y3QgZ2RtX2VuZGlhbiAqICgqZ2V0X2VuZGlhbikodm9pZCAqcHJpdl9kZXYpOwogfTsKIAogc3RydWN0IG5pYyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbXV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbXV4LmMKaW5kZXggMmZhM2E1YS4uMTBjZTJjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX211eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9tdXguYwpAQCAtMTY1LDcgKzE2NSw4IEBACiAJaW50IGxlbiA9IHItPmxlbjsKIAogCXdoaWxlICgxKSB7Ci0JCW11eF9oZWFkZXIgPSAoc3RydWN0IG11eF9wa3RfaGVhZGVyICopKHItPmJ1ZiArIHBhY2tldF9zaXplX3N1bSk7CisJCW11eF9oZWFkZXIgPSAoc3RydWN0IG11eF9wa3RfaGVhZGVyICopKHItPmJ1ZiArCisJCQkJCQkgICAgICAgcGFja2V0X3NpemVfc3VtKTsKIAkJc3RhcnRfZmxhZyA9IF9fbGUzMl90b19jcHUobXV4X2hlYWRlci0+c3RhcnRfZmxhZyk7CiAJCXBheWxvYWRfc2l6ZSA9IF9fbGUzMl90b19jcHUobXV4X2hlYWRlci0+cGF5bG9hZF9zaXplKTsKIAkJcGFja2V0X3R5cGUgPSBfX2xlMTZfdG9fY3B1KG11eF9oZWFkZXItPnBhY2tldF90eXBlKTsKQEAgLTIzMSw3ICsyMzIsOCBAQAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcngtPnRvX2hvc3RfbG9jaywgZmxhZ3MpOwogCQkJYnJlYWs7CiAJCX0KLQkJciA9IGxpc3RfZW50cnkocngtPnRvX2hvc3RfbGlzdC5uZXh0LCBzdHJ1Y3QgbXV4X3J4LCB0b19ob3N0X2xpc3QpOworCQlyID0gbGlzdF9lbnRyeShyeC0+dG9faG9zdF9saXN0Lm5leHQsIHN0cnVjdCBtdXhfcngsCisJCQkgICAgICAgdG9faG9zdF9saXN0KTsKIAkJbGlzdF9kZWwoJnItPnRvX2hvc3RfbGlzdCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4LT50b19ob3N0X2xvY2ssIGZsYWdzKTsKIApAQCAtMjQ5LDcgKzI1MSw4IEBACiAJc3RydWN0IG11eF9yeAkqcl9yZW1vdmUsICpyX3JlbW92ZV9uZXh0OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4LT5zdWJtaXRfbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJfcmVtb3ZlLCByX3JlbW92ZV9uZXh0LCAmcngtPnJ4X3N1Ym1pdF9saXN0LCByeF9zdWJtaXRfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyX3JlbW92ZSwgcl9yZW1vdmVfbmV4dCwgJnJ4LT5yeF9zdWJtaXRfbGlzdCwKKwkJCQkgcnhfc3VibWl0X2xpc3QpIHsKIAkJaWYgKHIgPT0gcl9yZW1vdmUpCiAJCQlsaXN0X2RlbCgmci0+cnhfc3VibWl0X2xpc3QpOwogCX0KQEAgLTI3OSw5ICsyODIsOCBAQAogCX0KIH0KIAotc3RhdGljIGludCBnZG1fbXV4X3JlY3Yodm9pZCAqcHJpdl9kZXYsCi0JCQlpbnQgKCpjYikodm9pZCAqZGF0YSwgaW50IGxlbiwgaW50IHR0eV9pbmRleCwgc3RydWN0IHR0eV9kZXYgKnR0eV9kZXYsIGludCBjb21wbGV0ZSkKLQkJCSkKK3N0YXRpYyBpbnQgZ2RtX211eF9yZWN2KHZvaWQgKnByaXZfZGV2LCBpbnQgKCpjYikodm9pZCAqZGF0YSwgaW50IGxlbiwKKwkJCWludCB0dHlfaW5kZXgsIHN0cnVjdCB0dHlfZGV2ICp0dHlfZGV2LCBpbnQgY29tcGxldGUpKQogewogCXN0cnVjdCBtdXhfZGV2ICptdXhfZGV2ID0gcHJpdl9kZXY7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldiA9IG11eF9kZXYtPnVzYmRldjsKQEAgLTQxNiw3ICs0MTgsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgZ2RtX211eF9zZW5kX2NvbnRyb2wodm9pZCAqcHJpdl9kZXYsIGludCByZXF1ZXN0LCBpbnQgdmFsdWUsIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3N0YXRpYyBpbnQgZ2RtX211eF9zZW5kX2NvbnRyb2wodm9pZCAqcHJpdl9kZXYsIGludCByZXF1ZXN0LCBpbnQgdmFsdWUsCisJCQkJdm9pZCAqYnVmLCBpbnQgbGVuKQogewogCXN0cnVjdCBtdXhfZGV2ICptdXhfZGV2ID0gcHJpdl9kZXY7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldiA9IG11eF9kZXYtPnVzYmRldjsKQEAgLTQ0OCw3ICs0NTEsOCBAQAogCWNhbmNlbF9kZWxheWVkX3dvcmsoJm11eF9kZXYtPndvcmtfcngpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4LT5zdWJtaXRfbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHIsIHJfbmV4dCwgJnJ4LT5yeF9zdWJtaXRfbGlzdCwgcnhfc3VibWl0X2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUociwgcl9uZXh0LCAmcngtPnJ4X3N1Ym1pdF9saXN0LAorCQkJCSByeF9zdWJtaXRfbGlzdCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeC0+c3VibWl0X2xpc3RfbG9jaywgZmxhZ3MpOwogCQl1c2Jfa2lsbF91cmIoci0+dXJiKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4LT5zdWJtaXRfbGlzdF9sb2NrLCBmbGFncyk7CkBAIC01MDMsNyArNTA3LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGdkbV9tdXhfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3N0YXRpYyBpbnQgZ2RtX211eF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCSBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IG11eF9kZXYgKm11eF9kZXY7CiAJc3RydWN0IHR0eV9kZXYgKnR0eV9kZXY7CkBAIC02MTAsNyArNjE1LDggQEAKIAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4LT5zdWJtaXRfbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHIsIHJfbmV4dCwgJnJ4LT5yeF9zdWJtaXRfbGlzdCwgcnhfc3VibWl0X2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUociwgcl9uZXh0LCAmcngtPnJ4X3N1Ym1pdF9saXN0LAorCQkJCSByeF9zdWJtaXRfbGlzdCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeC0+c3VibWl0X2xpc3RfbG9jaywgZmxhZ3MpOwogCQl1c2Jfa2lsbF91cmIoci0+dXJiKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4LT5zdWJtaXRfbGlzdF9sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fdXNiLmMKaW5kZXggMzM0NThhNS4uZWU2ZTQwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV91c2IuYwpAQCAtMzAsMTQgKzMwLDE3IEBACiAjaW5jbHVkZSAiZ2RtX2VuZGlhbi5oIgogCiAjZGVmaW5lIFVTQl9ERVZJQ0VfQ0RDX0RBVEEodmlkLCBwaWQpIFwKLQkubWF0Y2hfZmxhZ3MgPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0NMQVNTIHwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfU1VCQ0xBU1MsXAorCS5tYXRjaF9mbGFncyA9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFIHwgXAorCQlVU0JfREVWSUNFX0lEX01BVENIX0lOVF9DTEFTUyB8IFwKKwkJVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfU1VCQ0xBU1MsXAogCS5pZFZlbmRvciA9IHZpZCxcCiAJLmlkUHJvZHVjdCA9IHBpZCxcCiAJLmJJbnRlcmZhY2VDbGFzcyA9IFVTQl9DTEFTU19DT01NLFwKIAkuYkludGVyZmFjZVN1YkNsYXNzID0gVVNCX0NEQ19TVUJDTEFTU19FVEhFUk5FVAogCiAjZGVmaW5lIFVTQl9ERVZJQ0VfTUFTU19EQVRBKHZpZCwgcGlkKSBcCi0JLm1hdGNoX2ZsYWdzID0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UgfCBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPLFwKKwkubWF0Y2hfZmxhZ3MgPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSB8IFwKKwkJVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTyxcCiAJLmlkVmVuZG9yID0gdmlkLFwKIAkuaWRQcm9kdWN0ID0gcGlkLFwKIAkuYkludGVyZmFjZVN1YkNsYXNzID0gVVNCX1NDX1NDU0ksIFwKQEAgLTU5LDcgKzYyLDggQEAKIHN0YXRpYyB2b2lkIGRvX3J4KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIHN0YXRpYyBpbnQgZ2RtX3VzYl9yZWN2KHZvaWQgKnByaXZfZGV2LAotCQkJaW50ICgqY2IpKHZvaWQgKmNiX2RhdGEsIHZvaWQgKmRhdGEsIGludCBsZW4sIGludCBjb250ZXh0KSwKKwkJCWludCAoKmNiKSh2b2lkICpjYl9kYXRhLAorCQkJCXZvaWQgKmRhdGEsIGludCBsZW4sIGludCBjb250ZXh0KSwKIAkJCXZvaWQgKmNiX2RhdGEsCiAJCQlpbnQgY29udGV4dCk7CiAKQEAgLTExOSwyOCArMTIzLDE1IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX3R4X3NkdSAqYWxsb2NfdHhfc2R1X3N0cnVjdCh2b2lkKQogewotCXN0cnVjdCB1c2JfdHhfc2R1ICp0X3NkdSA9IE5VTEw7Ci0JaW50IHJldCA9IDA7Ci0KKwlzdHJ1Y3QgdXNiX3R4X3NkdSAqdF9zZHU7CiAKIAl0X3NkdSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JfdHhfc2R1KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF0X3NkdSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKCF0X3NkdSkKKwkJcmV0dXJuIE5VTEw7CiAKIAl0X3NkdS0+YnVmID0ga21hbGxvYyhTRFVfQlVGX1NJWkUsIEdGUF9BVE9NSUMpOwogCWlmICghdF9zZHUtPmJ1ZikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci1vdXQ6Ci0KLQlpZiAocmV0IDwgMCkgewotCQlpZiAodF9zZHUpIHsKLQkJCWtmcmVlKHRfc2R1LT5idWYpOwotCQkJa2ZyZWUodF9zZHUpOwotCQl9CisJCWtmcmVlKHRfc2R1KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0zODgsNyArMzc5LDggQEAKIAlpZiAodGx2LT50eXBlID09IE1BQ19BRERSRVNTICYmIHVkZXYtPnJlcXVlc3RfbWFjX2FkZHIpIHsKIAkJbWVtY3B5KG1hY19hZGRyZXNzLCB0bHYtPmRhdGEsIHRsdi0+bGVuKTsKIAotCQlpZiAocmVnaXN0ZXJfbHRlX2RldmljZShwaHlfZGV2LCAmdWRldi0+aW50Zi0+ZGV2LCBtYWNfYWRkcmVzcykgPCAwKQorCQlpZiAocmVnaXN0ZXJfbHRlX2RldmljZShwaHlfZGV2LAorCQkJCSZ1ZGV2LT5pbnRmLT5kZXYsIG1hY19hZGRyZXNzKSA8IDApCiAJCQlwcl9lcnIoInJlZ2lzdGVyIGx0ZSBkZXZpY2UgZmFpbGVkXG4iKTsKIAogCQl1ZGV2LT5yZXF1ZXN0X21hY19hZGRyID0gMDsKQEAgLTQwMSw3ICszOTMsOCBAQAogCiBzdGF0aWMgdm9pZCBkb19yeChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGx0ZV91ZGV2ICp1ZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBsdGVfdWRldiwgd29ya19yeC53b3JrKTsKKwlzdHJ1Y3QgbHRlX3VkZXYgKnVkZXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGx0ZV91ZGV2LCB3b3JrX3J4LndvcmspOwogCXN0cnVjdCByeF9jeHQgKnJ4ID0gJnVkZXYtPnJ4OwogCXN0cnVjdCB1c2JfcnggKnI7CiAJc3RydWN0IGhjaV9wYWNrZXQgKmhjaTsKQEAgLTQxNiw3ICs0MDksOCBAQAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcngtPnRvX2hvc3RfbG9jaywgZmxhZ3MpOwogCQkJYnJlYWs7CiAJCX0KLQkJciA9IGxpc3RfZW50cnkocngtPnRvX2hvc3RfbGlzdC5uZXh0LCBzdHJ1Y3QgdXNiX3J4LCB0b19ob3N0X2xpc3QpOworCQlyID0gbGlzdF9lbnRyeShyeC0+dG9faG9zdF9saXN0Lm5leHQsCisJCQlzdHJ1Y3QgdXNiX3J4LCB0b19ob3N0X2xpc3QpOwogCQlsaXN0X2RlbCgmci0+dG9faG9zdF9saXN0KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcngtPnRvX2hvc3RfbG9jaywgZmxhZ3MpOwogCkBAIC00NjMsNyArNDU3LDggQEAKIAlzdHJ1Y3QgdXNiX3J4CSpyX3JlbW92ZSwgKnJfcmVtb3ZlX25leHQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcngtPnN1Ym1pdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJfcmVtb3ZlLCByX3JlbW92ZV9uZXh0LCAmcngtPnJ4X3N1Ym1pdF9saXN0LCByeF9zdWJtaXRfbGlzdCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocl9yZW1vdmUsCisJCQlyX3JlbW92ZV9uZXh0LCAmcngtPnJ4X3N1Ym1pdF9saXN0LCByeF9zdWJtaXRfbGlzdCkKIAl7CiAJCWlmIChyID09IHJfcmVtb3ZlKSB7CiAJCQlsaXN0X2RlbCgmci0+cnhfc3VibWl0X2xpc3QpOwpAQCAtNTAwLDcgKzQ5NSw4IEBACiB9CiAKIHN0YXRpYyBpbnQgZ2RtX3VzYl9yZWN2KHZvaWQgKnByaXZfZGV2LAotCQkJaW50ICgqY2IpKHZvaWQgKmNiX2RhdGEsIHZvaWQgKmRhdGEsIGludCBsZW4sIGludCBjb250ZXh0KSwKKwkJCWludCAoKmNiKSh2b2lkICpjYl9kYXRhLAorCQkJCXZvaWQgKmRhdGEsIGludCBsZW4sIGludCBjb250ZXh0KSwKIAkJCXZvaWQgKmNiX2RhdGEsCiAJCQlpbnQgY29udGV4dCkKIHsKQEAgLTY1NCw3ICs2NTAsOCBAQAogCiBzdGF0aWMgdm9pZCBkb190eChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGx0ZV91ZGV2ICp1ZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBsdGVfdWRldiwgd29ya190eC53b3JrKTsKKwlzdHJ1Y3QgbHRlX3VkZXYgKnVkZXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGx0ZV91ZGV2LCB3b3JrX3R4LndvcmspOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXYgPSB1ZGV2LT51c2JkZXY7CiAJc3RydWN0IHR4X2N4dCAqdHggPSAmdWRldi0+dHg7CiAJc3RydWN0IHVzYl90eCAqdCA9IE5VTEw7CkBAIC04MTMsNyArODEwLDggQEAKIAlyZXR1cm4gJnVkZXYtPmdkbV9lZDsKIH0KIAotc3RhdGljIGludCBnZG1fdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCitzdGF0aWMgaW50IGdkbV91c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBwaHlfZGV2ICpwaHlfZGV2ID0gTlVMTDsKQEAgLTg2MSw3ICs4NTksOSBAQAogCXVzYl9lbmFibGVfYXV0b3N1c3BlbmQodXNiZGV2KTsKIAlwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheSgmdXNiZGV2LT5kZXYsIEFVVE9fU1VTUEVORF9USU1FUik7CiAKLQkvKiBMaXN0IHVwIGhvc3RzIHdpdGggYmlnIGVuZGlhbnMsIG90aGVyd2lzZSwgZGVmYXVsdHMgdG8gbGl0dGxlIGVuZGlhbiAqLworCS8qIExpc3QgdXAgaG9zdHMgd2l0aCBiaWcgZW5kaWFucywgb3RoZXJ3aXNlLAorCSAqIGRlZmF1bHRzIHRvIGxpdHRsZSBlbmRpYW4KKwkgKi8KIAlpZiAoaWRQcm9kdWN0ID09IFBJRF9HRE03MjQzKQogCQlnZG1fc2V0X2VuZGlhbigmdWRldi0+Z2RtX2VkLCBFTkRJQU5ORVNTX0JJRyk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvbmV0bGlua19rLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9uZXRsaW5rX2suYwppbmRleCA3N2ZjNjRlLi41ZGRkMzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9uZXRsaW5rX2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9uZXRsaW5rX2suYwpAQCAtMzIsNyArMzIsOCBAQAogI2RlZmluZSBORF9NQVhfR1JPVVAJCTMwCiAjZGVmaW5lIE5EX0lGSU5ERVhfTEVOCQlzaXplb2YoaW50KQogI2RlZmluZSBORF9OTE1TR19TUEFDRShsZW4pCShOTE1TR19TUEFDRShsZW4pICsgTkRfSUZJTkRFWF9MRU4pCi0jZGVmaW5lIE5EX05MTVNHX0RBVEEobmxoKQkoKHZvaWQgKikoKGNoYXIgKilOTE1TR19EQVRBKG5saCkgKyBORF9JRklOREVYX0xFTikpCisjZGVmaW5lIE5EX05MTVNHX0RBVEEobmxoKQkoKHZvaWQgKikoKGNoYXIgKilOTE1TR19EQVRBKG5saCkgKyBcCisJCQkJCQkgIE5EX0lGSU5ERVhfTEVOKSkKICNkZWZpbmUgTkRfTkxNU0dfU19MRU4obGVuKQkobGVuK05EX0lGSU5ERVhfTEVOKQogI2RlZmluZSBORF9OTE1TR19SX0xFTihubGgpCShubGgtPm5sbXNnX2xlbi1ORF9JRklOREVYX0xFTikKICNkZWZpbmUgTkRfTkxNU0dfSUZJRFgobmxoKQlOTE1TR19EQVRBKG5saCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9UT0RPCmluZGV4IDMwYWMwMWEuLjVhYjI3ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvVE9ETwpAQCAtMSw1ICsxLDMgQEAKIFRPRE86CiAtIFJlcGxhY2Uga2VybmVsX3RocmVhZCB3aXRoIGt0aHJlYWQgaW4gZ2RtX3VzYi5jCi0tIFJlcGxhY2UgaGFyZC1jb2RlZCBmaXJtd2FyZSBwYXRocyB3aXRoIHJlcXVlc3RfZmlybXdhcmUgaW4KLSAgc2Rpb19ib290LmMgYW5kIHVzYl9ib290LmMKIC0gQ2xlYW4gdXAgY29kaW5nIHN0eWxlIHRvIG1lZXQga2VybmVsIHN0YW5kYXJkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3NkaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV9zZGlvLmMKaW5kZXggMDQ3YTRkNy4uYzI0NjUzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3NkaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fc2Rpby5jCkBAIC0zOCwyNiArMzgsOSBAQAogI2RlZmluZSBUWF9IWgkyMDAwCiAjZGVmaW5lIFRYX0lOVEVSVkFMCSgxMDAwMDAwL1RYX0haKQogCi0vKiNkZWZpbmUgREVCVUcqLwotCiBzdGF0aWMgaW50IGluaXRfc2RpbyhzdHJ1Y3Qgc2Rpb3dtX2RldiAqc2Rldik7CiBzdGF0aWMgdm9pZCByZWxlYXNlX3NkaW8oc3RydWN0IHNkaW93bV9kZXYgKnNkZXYpOwogCi0jaWZkZWYgREVCVUcKLXN0YXRpYyB2b2lkIGhleGR1bXAoY2hhciAqdGl0bGUsIHU4ICpkYXRhLCBpbnQgbGVuKQotewotCWludCBpOwotCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBsZW5ndGggPSAlZFxuIiwgdGl0bGUsIGxlbik7Ci0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlMDJ4ICIsIGRhdGFbaV0pOwotCQlpZiAoKGkgJiAweGYpID09IDB4ZikKLQkJCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOwotCX0KLQlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKLX0KLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHNkaW9fdHggKmFsbG9jX3R4X3N0cnVjdChzdHJ1Y3QgdHhfY3h0ICp0eCkKIHsKIAlzdHJ1Y3Qgc2Rpb190eCAqdCA9IGt6YWxsb2Moc2l6ZW9mKCp0KSwgR0ZQX0FUT01JQyk7CkBAIC0yOTcsMTAgKzI4MCw5IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0eC0+bG9jaywgZmxhZ3MpOwogCi0jaWZkZWYgREVCVUcKLQloZXhkdW1wKCJzZGlvX3NlbmQiLCB0eC0+c2R1X2J1ZiArIFRZUEVfQV9IRUFERVJfU0laRSwKLQkJYWdncl9sZW4gLSBUWVBFX0FfSEVBREVSX1NJWkUpOwotI2VuZGlmCisJcHJpbnRfaGV4X2R1bXBfZGVidWcoInNkaW9fc2VuZDogIiwgRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsCisJCQkgICAgIHR4LT5zZHVfYnVmICsgVFlQRV9BX0hFQURFUl9TSVpFLAorCQkJICAgICBhZ2dyX2xlbiAtIFRZUEVfQV9IRUFERVJfU0laRSwgZmFsc2UpOwogCiAJZm9yIChwb3MgPSBUWVBFX0FfSEVBREVSX1NJWkU7IHBvcyA8IGFnZ3JfbGVuOyBwb3MgKz0gVFhfQ0hVTktfU0laRSkgewogCQlsZW4gPSBhZ2dyX2xlbiAtIHBvczsKQEAgLTMzNSwxMCArMzE3LDkgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0jaWZkZWYgREVCVUcKLQloZXhkdW1wKCJzZGlvX3NlbmQiLCB0LT5idWYgKyBUWVBFX0FfSEVBREVSX1NJWkUsCi0JCXQtPmxlbiAtIFRZUEVfQV9IRUFERVJfU0laRSk7Ci0jZW5kaWYKKwlwcmludF9oZXhfZHVtcF9kZWJ1Zygic2Rpb19zZW5kOiAiLCBEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwKKwkJCSAgICAgdC0+YnVmICsgVFlQRV9BX0hFQURFUl9TSVpFLAorCQkJICAgICB0LT5sZW4gLSBUWVBFX0FfSEVBREVSX1NJWkUsIGZhbHNlKTsKIAlzZW5kX3NkaW9fcGt0KGZ1bmMsIHQtPmJ1ZiwgdC0+bGVuKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0eC0+bG9jaywgZmxhZ3MpOwpAQCAtNDc0LDE0ICs0NTUsMTAgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAoaGNpX2RhdGFbNF0gPT0gMCkgewotI2lmZGVmIERFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICJXSU1BWCA9PT4gU1RPUCBTRFUgVFhcbiIpOwotI2VuZGlmCisJCWRldl9kYmcoJnNkZXYtPmZ1bmMtPmRldiwgIldJTUFYID09PiBTVE9QIFNEVSBUWFxuIik7CiAJCXR4LT5zdG9wX3NkdV90eCA9IDE7CiAJfSBlbHNlIGlmIChoY2lfZGF0YVs0XSA9PSAxKSB7Ci0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIldJTUFYID09PiBTVEFSVCBTRFUgVFhcbiIpOwotI2VuZGlmCisJCWRldl9kYmcoJnNkZXYtPmZ1bmMtPmRldiwgIldJTUFYID09PiBTVEFSVCBTRFUgVFhcbiIpOwogCQl0eC0+c3RvcF9zZHVfdHggPSAwOwogCQlpZiAodHgtPmNhbl9zZW5kKQogCQkJc2NoZWR1bGVfd29yaygmc2Rldi0+d3MpOwpAQCAtNTMyLDE4ICs1MDksMTQgQEAKIAl9CiAKIAlpZiAoaGRyWzNdID09IDEpIHsJLyogQWNrICovCi0jaWZkZWYgREVCVUcKIAkJdTMyICphY2tfc2VxID0gKHUzMiAqKSZoZHJbNF07Ci0jZW5kaWYKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnR4LT5sb2NrLCBmbGFncyk7CiAJCXR4LT5jYW5fc2VuZCA9IDE7CiAKIAkJaWYgKCFsaXN0X2VtcHR5KCZ0eC0+c2R1X2xpc3QpIHx8ICFsaXN0X2VtcHR5KCZ0eC0+aGNpX2xpc3QpKQogCQkJc2NoZWR1bGVfd29yaygmc2Rldi0+d3MpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0eC0+bG9jaywgZmxhZ3MpOwotI2lmZGVmIERFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICJBY2suLi4gJTB4XG4iLCBudG9obCgqYWNrX3NlcSkpOwotI2VuZGlmCisJCWRldl9kYmcoJmZ1bmMtPmRldiwgIkFjay4uLiAlMHhcbiIsIG50b2hsKCphY2tfc2VxKSk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKQEAgLTU3OSw5ICs1NTIsOCBAQAogCX0KIAogZW5kX2lvOgotI2lmZGVmIERFQlVHCi0JaGV4ZHVtcCgic2Rpb19yZWNlaXZlIiwgcngtPnJ4X2J1ZiwgbGVuKTsKLSNlbmRpZgorCXByaW50X2hleF9kdW1wX2RlYnVnKCJzZGlvX3JlY2VpdmU6ICIsIERVTVBfUFJFRklYX05PTkUsIDE2LCAxLAorCQkJICAgICByeC0+cnhfYnVmLCBsZW4sIGZhbHNlKTsKIAlsZW4gPSBjb250cm9sX3NkdV90eF9mbG93KHNkZXYsIHJ4LT5yeF9idWYsIGxlbik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcngtPmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV91c2IuYwppbmRleCBjZGVmZmU3Li4yMDUzOWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3VzYi5jCkBAIC01NSwyMiArNTUsNiBAQAogc3RhdGljIGludCBpbml0X3VzYihzdHJ1Y3QgdXNid21fZGV2ICp1ZGV2KTsKIHN0YXRpYyB2b2lkIHJlbGVhc2VfdXNiKHN0cnVjdCB1c2J3bV9kZXYgKnVkZXYpOwogCi0vKiNkZWZpbmUgREVCVUcgKi8KLSNpZmRlZiBERUJVRwotc3RhdGljIHZvaWQgaGV4ZHVtcChjaGFyICp0aXRsZSwgdTggKmRhdGEsIGludCBsZW4pCi17Ci0JaW50IGk7Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGxlbmd0aCA9ICVkXG4iLCB0aXRsZSwgbGVuKTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiUwMnggIiwgZGF0YVtpXSk7Ci0JCWlmICgoaSAmIDB4ZikgPT0gMHhmKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7Ci0JfQotCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOwotfQotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3QgdXNiX3R4ICphbGxvY190eF9zdHJ1Y3Qoc3RydWN0IHR4X2N4dCAqdHgpCiB7CiAJc3RydWN0IHVzYl90eCAqdCA9IGt6YWxsb2Moc2l6ZW9mKCp0KSwgR0ZQX0FUT01JQyk7CkBAIC0zNjgsOSArMzUyLDggQEAKIAkJCWdkbV91c2Jfc2VuZF9jb21wbGV0ZSwKIAkJCXQpOwogCi0jaWZkZWYgREVCVUcKLQloZXhkdW1wKCJ1c2Jfc2VuZCIsIHQtPmJ1ZiwgbGVuICsgcGFkZGluZyk7Ci0jZW5kaWYKKwlwcmludF9oZXhfZHVtcF9kZWJ1ZygidXNiX3NlbmQ6ICIsIERVTVBfUFJFRklYX05PTkUsIDE2LCAxLAorCQkJICAgICB0LT5idWYsIGxlbiArIHBhZGRpbmcsIGZhbHNlKTsKICNpZmRlZiBDT05GSUdfV0lNQVhfR0RNNzJYWF9VU0JfUE0KIAlpZiAodXNiZGV2LT5zdGF0ZSAmIFVTQl9TVEFURV9TVVNQRU5ERUQpIHsKIAkJbGlzdF9hZGRfdGFpbCgmdC0+cF9saXN0LCAmdHgtPnBlbmRpbmdfbGlzdCk7CkBAIC00MzgsMTAgKzQyMSw3IEBACiAJc3RydWN0IHVzYl90eCAqdDsKIAl1MTYgY21kX2V2dDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBmbGFnczI7Ci0KLSNpZmRlZiBDT05GSUdfV0lNQVhfR0RNNzJYWF9VU0JfUE0KIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gdXJiLT5kZXY7Ci0jZW5kaWYKIAogCS8qIENvbXBsZXRpb24gYnkgdXNiX3VubGlua191cmIgKi8KIAlpZiAodXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQpCkBAIC00NTEsMjAgKzQzMSwxNSBAQAogCiAJaWYgKCF1cmItPnN0YXR1cykgewogCQljbWRfZXZ0ID0gKHItPmJ1ZlswXSA8PCA4KSB8IChyLT5idWZbMV0pOwotI2lmZGVmIERFQlVHCi0JCWhleGR1bXAoInVzYl9yZWNlaXZlIiwgci0+YnVmLCB1cmItPmFjdHVhbF9sZW5ndGgpOwotI2VuZGlmCisJCXByaW50X2hleF9kdW1wX2RlYnVnKCJ1c2JfcmVjZWl2ZTogIiwgRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsCisJCQkJICAgICByLT5idWYsIHVyYi0+YWN0dWFsX2xlbmd0aCwgZmFsc2UpOwogCQlpZiAoY21kX2V2dCA9PSBXSU1BWF9TRFVfVFhfRkxPVykgewogCQkJaWYgKHItPmJ1Zls0XSA9PSAwKSB7Ci0jaWZkZWYgREVCVUcKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiV0lNQVggPT0+IFNUT1AgU0RVIFRYXG4iKTsKLSNlbmRpZgorCQkJCWRldl9kYmcoJmRldi0+ZGV2LCAiV0lNQVggPT0+IFNUT1AgU0RVIFRYXG4iKTsKIAkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZ0eC0+c2R1X2xpc3QsIGxpc3QpCiAJCQkJCXVzYl91bmxpbmtfdXJiKHQtPnVyYik7CiAJCQl9IGVsc2UgaWYgKHItPmJ1Zls0XSA9PSAxKSB7Ci0jaWZkZWYgREVCVUcKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiV0lNQVggPT0+IFNUQVJUIFNEVSBUWFxuIik7Ci0jZW5kaWYKKwkJCQlkZXZfZGJnKCZkZXYtPmRldiwgIldJTUFYID09PiBTVEFSVCBTRFUgVFhcbiIpOwogCQkJCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJnR4LT5zZHVfbGlzdCwgbGlzdCkgewogCQkJCQl1c2Jfc3VibWl0X3VyYih0LT51cmIsIEdGUF9BVE9NSUMpOwogCQkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV93aW1heC5jIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3dpbWF4LmMKaW5kZXggZGQ4NTQ5Ny4uMDVjZTJhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3dpbWF4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3dpbWF4LmMKQEAgLTYyLDIxICs2Miw2IEBACiBzdGF0aWMgdm9pZCBnZG1fd2ltYXhfaW5kX2ZzbV91cGRhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGZzbV9zICpmc20pOwogc3RhdGljIHZvaWQgZ2RtX3dpbWF4X2luZF9pZl91cGRvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlmX3VwKTsKIAotI2lmIGRlZmluZWQoREVCVUdfU0RVKQotc3RhdGljIHZvaWQgcHJpbnRrX2hleCh1OCAqYnVmLCB1MzIgc2l6ZSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJaWYgKGkgJiYgaSAlIDE2ID09IDApCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiXG4lMDJ4ICIsICpidWYrKyk7Ci0JCWVsc2UKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlMDJ4ICIsICpidWYrKyk7Ci0JfQotCi0JcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7Ci19Ci0KIHN0YXRpYyBjb25zdCBjaGFyICpnZXRfcHJvdG9jb2xfbmFtZSh1MTYgcHJvdG9jb2wpCiB7CiAJc3RhdGljIGNoYXIgYnVmWzMyXTsKQEAgLTE0MCw3ICsxMjUsOCBAQAogCXJldHVybiBidWY7CiB9CiAKLXN0YXRpYyB2b2lkIGR1bXBfZXRoX3BhY2tldChjb25zdCBjaGFyICp0aXRsZSwgdTggKmRhdGEsIGludCBsZW4pCitzdGF0aWMgdm9pZCBkdW1wX2V0aF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqdGl0bGUsCisJCQkgICAgdTggKmRhdGEsIGludCBsZW4pCiB7CiAJc3RydWN0IGlwaGRyICppaCA9IE5VTEw7CiAJc3RydWN0IHVkcGhkciAqdWggPSBOVUxMOwpAQCAtMTYyLDQ4ICsxNDgsMjEgQEAKIAkJcG9ydCA9IG50b2hzKHVoLT5kZXN0KTsKIAl9CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiWyVzXSBsZW49JWQsICVzLCAlcywgJXNcbiIsCisJbmV0ZGV2X2RiZyhkZXYsICJbJXNdIGxlbj0lZCwgJXMsICVzLCAlc1xuIiwKIAkJdGl0bGUsIGxlbiwKIAkJZ2V0X3Byb3RvY29sX25hbWUocHJvdG9jb2wpLAogCQlnZXRfaXBfcHJvdG9jb2xfbmFtZShpcF9wcm90b2NvbCksCiAJCWdldF9wb3J0X25hbWUocG9ydCkpOwogCiAJaWYgKCEoZGF0YVswXSA9PSAweGZmICYmIGRhdGFbMV0gPT0gMHhmZikpIHsKLQkJaWYgKHByb3RvY29sID09IEVUSF9QX0lQKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiICAgICBzcmM9JXBJNFxuIiwgJmloLT5zYWRkcik7Ci0JCX0gZWxzZSBpZiAocHJvdG9jb2wgPT0gRVRIX1BfSVBWNikgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgICAgc3JjPSVwSTZcbiIsICZpaC0+c2FkZHIpOwotCQl9CisJCWlmIChwcm90b2NvbCA9PSBFVEhfUF9JUCkKKwkJCW5ldGRldl9kYmcoZGV2LCAiICAgICBzcmM9JXBJNFxuIiwgJmloLT5zYWRkcik7CisJCWVsc2UgaWYgKHByb3RvY29sID09IEVUSF9QX0lQVjYpCisJCQluZXRkZXZfZGJnKGRldiwgIiAgICAgc3JjPSVwSTZcbiIsICZpaC0+c2FkZHIpOwogCX0KIAotCSNpZiAoRFVNUF9QQUNLRVQgJiBEVU1QX1NEVV9BTEwpCi0JcHJpbnRrX2hleChkYXRhLCBsZW4pOwotCSNlbHNlCi0JCSNpZiAoRFVNUF9QQUNLRVQgJiBEVU1QX1NEVV9BUlApCi0JCWlmIChwcm90b2NvbCA9PSBFVEhfUF9BUlApCi0JCQlwcmludGtfaGV4KGRhdGEsIGxlbik7Ci0JCSNlbmRpZgotCQkjaWYgKERVTVBfUEFDS0VUICYgRFVNUF9TRFVfSVApCi0JCWlmIChwcm90b2NvbCA9PSBFVEhfUF9JUCB8fCBwcm90b2NvbCA9PSBFVEhfUF9JUFY2KQotCQkJcHJpbnRrX2hleChkYXRhLCBsZW4pOwotCQkjZWxzZQotCQkJI2lmIChEVU1QX1BBQ0tFVCAmIERVTVBfU0RVX0lQX1RDUCkKLQkJCWlmIChpcF9wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKLQkJCQlwcmludGtfaGV4KGRhdGEsIGxlbik7Ci0JCQkjZW5kaWYKLQkJCSNpZiAoRFVNUF9QQUNLRVQgJiBEVU1QX1NEVV9JUF9VRFApCi0JCQlpZiAoaXBfcHJvdG9jb2wgPT0gSVBQUk9UT19VRFApCi0JCQkJcHJpbnRrX2hleChkYXRhLCBsZW4pOwotCQkJI2VuZGlmCi0JCQkjaWYgKERVTVBfUEFDS0VUICYgRFVNUF9TRFVfSVBfSUNNUCkKLQkJCWlmIChpcF9wcm90b2NvbCA9PSBJUFBST1RPX0lDTVApCi0JCQkJcHJpbnRrX2hleChkYXRhLCBsZW4pOwotCQkJI2VuZGlmCi0JCSNlbmRpZgotCSNlbmRpZgorCXByaW50X2hleF9kdW1wX2RlYnVnKCIiLCBEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZGF0YSwgbGVuLCBmYWxzZSk7CiB9Ci0jZW5kaWYKLQogCiBzdGF0aWMgaW5saW5lIGludCBnZG1fd2ltYXhfaGVhZGVyKHN0cnVjdCBza19idWZmICoqcHNrYikKIHsKQEAgLTIzNywxMiArMTk2LDEwIEBACiB7CiAJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCSNpZiBkZWZpbmVkKERFQlVHX0hDSSkKIAl1OCAqYnVmID0gKHU4ICopIG1zZzsKIAl1MTYgaGNpX2NtZCA9ICAoYnVmWzBdPDw4KSB8IGJ1ZlsxXTsKIAl1MTYgaGNpX2xlbiA9IChidWZbMl08PDgpIHwgYnVmWzNdOwotCXByaW50ayhLRVJOX0RFQlVHICJIPT5EOiAweCUwNHgoJWQpXG4iLCBoY2lfY21kLCBoY2lfbGVuKTsKLQkjZW5kaWYKKwluZXRkZXZfZGJnKGRldiwgIkg9PkQ6IDB4JTA0eCglZClcbiIsIGhjaV9jbWQsIGhjaV9sZW4pOwogCiAJZ2RtX3dpbWF4X3NlbmQobmljLCBtc2csIGxlbik7CiB9CkBAIC0zNTEsMTEgKzMwOCw5IEBACiAJc3RydWN0IGV2dF9lbnRyeSAqZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JI2lmIGRlZmluZWQoREVCVUdfSENJKQogCXUxNiBoY2lfY21kID0gICgodTgpYnVmWzBdPDw4KSB8ICh1OClidWZbMV07CiAJdTE2IGhjaV9sZW4gPSAoKHU4KWJ1ZlsyXTw8OCkgfCAodTgpYnVmWzNdOwotCXByaW50ayhLRVJOX0RFQlVHICJEPT5IOiAweCUwNHgoJWQpXG4iLCBoY2lfY21kLCBoY2lfbGVuKTsKLQkjZW5kaWYKKwluZXRkZXZfZGJnKGRldiwgIkQ9Pkg6IDB4JTA0eCglZClcbiIsIGhjaV9jbWQsIGhjaV9sZW4pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJndtX2V2ZW50LmV2dF9sb2NrLCBmbGFncyk7CiAKQEAgLTQxNSw5ICszNzAsNyBAQAogCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGZzbV9zICpmc20gPSAoc3RydWN0IGZzbV9zICopIG5pYy0+c2RrX2RhdGFbU0lPQ19EQVRBX0ZTTV0uYnVmOwogCi0JI2lmIGRlZmluZWQoREVCVUdfU0RVKQotCWR1bXBfZXRoX3BhY2tldCgiVFgiLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQkjZW5kaWYKKwlkdW1wX2V0aF9wYWNrZXQoZGV2LCAiVFgiLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAogCXJldCA9IGdkbV93aW1heF9oZWFkZXIoJnNrYik7CiAJaWYgKHJldCA8IDApIHsKQEAgLTU0MCw3ICs0OTMsNyBAQAogCWlmIChzcmMtPnNpemUpIHsKIAkJaWYgKCFkc3QtPmJ1ZikKIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoY29weV90b191c2VyKGRzdC0+YnVmLCBzcmMtPmJ1Ziwgc2l6ZSkpCisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopZHN0LT5idWYsIHNyYy0+YnVmLCBzaXplKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KIAlyZXR1cm4gMDsKQEAgLTU2Myw3ICs1MTYsNyBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JaWYgKGNvcHlfZnJvbV91c2VyKGRzdC0+YnVmLCBzcmMtPmJ1Ziwgc3JjLT5zaXplKSkgeworCWlmIChjb3B5X2Zyb21fdXNlcihkc3QtPmJ1ZiwgKHZvaWQgX191c2VyICopc3JjLT5idWYsIHNyYy0+c2l6ZSkpIHsKIAkJa2RlbGV0ZSgmZHN0LT5idWYpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC03NTYsOSArNzA5LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCByZXQ7CiAKLQkjaWYgZGVmaW5lZChERUJVR19TRFUpCi0JZHVtcF9ldGhfcGFja2V0KCJSWCIsIGJ1ZiwgbGVuKTsKLQkjZW5kaWYKKwlkdW1wX2V0aF9wYWNrZXQoZGV2LCAiUlgiLCBidWYsIGxlbik7CiAKIAlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOwogCWlmICghc2tiKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fd2ltYXguaCBiL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV93aW1heC5oCmluZGV4IDZlYzBhYjQuLjFmY2ZjODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV93aW1heC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV93aW1heC5oCkBAIC02MiwyNiArNjIsNiBAQAogCiB9OwogCi0KLSNpZiAwCi0jZGVmaW5lIGRwcmludGsoZm10LCBhcmdzIC4uLikJcHJpbnRrKEtFUk5fREVCVUcgIiBbR0RNXSAiIGZtdCwgIyMgYXJncykKLSNlbHNlCi0jZGVmaW5lIGRwcmludGsoLi4uKQotI2VuZGlmCi0KLS8qI2RlZmluZSBERUJVR19TRFUgKi8KLSNpZiBkZWZpbmVkKERFQlVHX1NEVSkKLSNkZWZpbmUgRFVNUF9TRFVfQUxMCQkoMTw8MCkKLSNkZWZpbmUgRFVNUF9TRFVfQVJQCQkoMTw8MSkKLSNkZWZpbmUgRFVNUF9TRFVfSVAJCQkoMTw8MikKLSNkZWZpbmUgRFVNUF9TRFVfSVBfVENQCQkoMTw8OCkKLSNkZWZpbmUgRFVNUF9TRFVfSVBfVURQCQkoMTw8OSkKLSNkZWZpbmUgRFVNUF9TRFVfSVBfSUNNUAkoMTw8MTApCi0jZGVmaW5lIERVTVBfUEFDS0VUCQkJKERVTVBfU0RVX0FMTCkKLSNlbmRpZgotCi0vKiNkZWZpbmUgREVCVUdfSENJICovCi0KIC8qI2RlZmluZSBMT09QQkFDS19URVNUICovCiAKIGV4dGVybiBpbnQgcmVnaXN0ZXJfd2ltYXhfZGV2aWNlKHN0cnVjdCBwaHlfZGV2ICpwaHlfZGV2LCBzdHJ1Y3QgZGV2aWNlICpwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwNjQ1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9LY29uZmlnCkBAIC0wLDAgKzEsOCBAQAorIworIyAieGlsaW54IEZQR0EgZmlybXdhcmUgZG93bmxvYWQsIGZwZ2Fib290IgorIworY29uZmlnIEdTX0ZQR0FCT09UCisJdHJpc3RhdGUgIlhpbGlueCBGUEdBIGZpcm13YXJlIGRvd25sb2FkIG1vZHVsZSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBYaWxpbnggRlBHQSBmaXJtd2FyZSBkb3dubG9hZCBtb2R1bGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGNiNjA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorZ3NfZnBnYS15CSs9IGdzX2ZwZ2Fib290Lm8gaW8ubworb2JqLSQoQ09ORklHX0dTX0ZQR0FCT09UKQkrPSBnc19mcGdhLm8KKworY2NmbGFncy0kKENPTkZJR19HU19GUEdBX0RFQlVHKQk6PSAtRERFQlVHCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmE4NjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L1JFQURNRQpAQCAtMCwwICsxLDcxIEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0xpbnV4IERyaXZlciBTb3VyY2UgZm9yIFhpbGlueCBGUEdBIGZpcm13YXJlIGRvd25sb2FkCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitUQUJMRSBPRiBDT05URU5UUy4KKworMS4gIFNVTU1BUlkKKzIuICBCQUNLR1JPVU5ECiszLiAgREVTSUdOCis0LiAgSE9XIFRPIFVTRQorNS4gIFJFRkVSRU5DRQorCisxLiBTVU1NQVJZCisKKwktIERvd25sb2FkIFhpbGlueCBGUEdBIGZpcm13YXJlCisJLSBUaGlzIG1vZHVsZSBkb3dubG9hZHMgWGlsaW54IEZQR0EgZmlybXdhcmUgdXNpbmcgZ3BpbyBwaW5zLgorCisyLiBCQUNLR1JPVU5ECisKKwlBbiBGUEdBIChGaWVsZCBQcm9ncmFtbWFibGUgR2F0ZSBBcnJheSkgaXMgYSBwcm9ncmFtbWFibGUgaGFyZHdhcmUgdGhhdCBpcworCXVzZWQgaW4gdmFyaW91cyBhcHBsaWNhdGlvbnMuIEhhcmR3YXJlIGRlc2lnbiBuZWVkcyB0byBwcm9ncmFtbWVkIHRocm91Z2gKKwlhIGRlZGljYXRlZCBkZXZpY2Ugb3IgQ1BVIGFzc2lzdGVkIHdheSAoc2VyaWFsIG9yIHBhcmFsbGVsKS4KKwlUaGlzIGRyaXZlciBwcm92aWRlcyBhIHdheSB0byBkb3dubG9hZCBGUEdBIGZpcm13YXJlLgorCiszLiBERVNJR04KKworCS0gbG9hZCBYaWxpbnggRlBHQSBiaXRzdHJlYW0gZm9ybWF0WzFdIGZpcm13YXJlIGltYWdlIGZpbGUgdXNpbmcgCisJICBrZXJuZWwgZmlybXdhcmUgZnJhbWV3b3JrLCByZXF1ZXN0X2Zpcm13YXJlKCkKKwktIHByb2dyYW0gdGhlIFhpbGlueCBGUEdBIHVzaW5nIFNlbGVjdE1BUCAocGFyYWxsZWwpIG1vZGUgWzJdCisJLSBGUEdBIHByZ3JhbSBpcyBkb25lIGJ5IGdwaW8gYmFzZWQgYml0LWJhbmdpbmcsIGFzIGFuIGV4YW1wbGUKKwktIHBsYXRmb3JtIGluZGVwZW5kZW50IGZpbGU6IGdzX2ZwZ2Fib290LmMKKwktIHBsYXRmb3JtIGRlcGVuZGVudCBmaWxlOiBpby5jCisJCisKKzQuIEhPVyBUTyBVU0UKKworCSQgaW5zbW9kIGdzX2ZwZ2Eua28gZmlsZT0ieGxpbnhfZnBnYV90b3BfYml0c3RyZWFtLmJpdCIKKwkkIHJtbW9kIGdzX2ZwZ2EKKworNS4gVVNFIENBU0UgKGZyb20gYSBtYWlsaW5nIGxpc3QgZGlzY3Vzc2lvbiB3aXRoIEdyZWcpCisKKwlhLiBBcyBhIEZQR0EgZGV2ZWxvcG1lbnQgc3VwcG9ydCB0b29sLAorCUR1cmluZyBGUEdBIGZpcm13YXJlIGRldmVsb3BtZW50LCB5b3UgbmVlZCB0byBkb3dubG9hZCBhIG5ldyBGUEdBCisJaW1hZ2UgZnJlcXVlbnRseS4KKwlZb3Ugd291bGQgZG8gdGhhdCB3aXRoIGEgZGVkaWNhdGVkIEpUQUcsIHdoaWNoIHVzdWFsbHkgYSBsaW1pdGVkCisJcmVzb3VyY2UgaW4gdGhlIGxhYi4KKwlIb3dldmVyLCBpZiB5b3UgdXNlIG15IGRyaXZlciwgeW91IGRvbid0IGhhdmUgdG8gaGF2ZSBhIGRlZGljYXRlZCBKVEFHLgorCVRoaXMgaXMgYSByZWFsIGdhaW4gOikKKworCWIuIEZvciB0aGUgRlBHQSB0aGF0IHJ1bnMgd2l0aG91dCBjb25maWcgYWZ0ZXIgdGhlIGRvd25sb2FkLCB3aGljaAorCWRvZXNuJ3QgdGFsayB0byBhbnkgb2YgTGludXggaW50ZXJmYWNlcyAoc3VjaCBhcyBQQ0lFKS4KKworCVdlIGRvd25sb2FkIEZQR0EgZmlybXdhcmUgZnJvbSB1c2VyIHRyaWdnZXJlZCBvciBzb21lIG90aGVyIHdheSwgYW5kIHRoYXQncyBpdC4KKwlTaW5jZSB0aGF0IEZQR0EgcnVucyBvbiBpdHMgb3duLCBpdCBkb2Vzbid0IHJlcXVpcmUgYSBsaW51eCBkcml2ZXIKKwlhZnRlciB0aGUgZG93bmxvYWQuCisKKwljLiBGb3IgdGhlIEZQR0EgdGhhdCByZXF1aXJlcyBjb25maWcgYWZ0ZXIgdGhlIGRvd25sb2FkLCB3aGljaCB0YWxrIHRvCisJYW55IG9mIGxpbnV4IGludGVyZmFjZXMgKHN1Y2ggYXMgUENJRSkKKworCVRoZW4sIHRoaXMgdHlwZSBvZiBGUEdBIGNvbmZpZyBjYW4gYmUgcHV0IGludG8gZGV2aWNlIHRyZWUgYW5kIGhhdmUgYQorCXNlcGFyYXRlIGRyaXZlciAocGNpZSBvciBvdGhlcnMpLCB0aGVuIFRIQVQgZHJpdmVyIGNhbGxzIG15IGRyaXZlciB0bworCWRvd25sb2FkIEZQR0EgZmlybXdhcmUgZHVyaW5nIHRoZSBMaW51eCBib290LCB0aGUgdGFrZSBvdmVyIHRoZSBkZXZpY2UKKwl0aHJvdWdoIHRoZSBpbnRlcmZhY2UuCisKKzYuIFJFRkVSRU5DRQorCisJMS4gWGlsaW54IEFQUCBOT1RFIFhBUFA1ODM6CisJICBodHRwOi8vd3d3LnhpbGlueC5jb20vc3VwcG9ydC9kb2N1bWVudGF0aW9uL2FwcGxpY2F0aW9uX25vdGVzL3hhcHA1ODMtZnBnYS1jb25maWd1cmF0aW9uLnBkZgorCTIuIGJpdHN0cmVhbSBmaWxlIGluZm86CisJICBodHRwOi8vaG9tZS5lYXJ0aGxpbmsubmV0L35kYXZlc3VsbGlucy9zb2Z0d2FyZS9iaXRpbmZvLmh0bWwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ5ZmIxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9UT0RPCkBAIC0wLDAgKzEsNyBAQAorVE9ETzoKKwktIGdldCBidXMgd2lkdGggaW5wdXQgaW5zdGVhZCBvZiBoYXJkY29kZWQgYnVzIHdpZHRoCisJLSBnZXQgaXQgcmV2aWV3ZWQKKworUGxlYXNlIHNlbmQgYW55IHBhdGNoZXMgZm9yIHRoaXMgZHJpdmVyIHRvIEluc29wIFNvbmc8aW5zb3Auc29uZ0BnYWluc3BlZWQuY29tPgorYW5kIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQGxpbnV4Zm91bmRhdGlvbi5vcmc+LgorQW5kIHBsZWFzZSBDQyB0byAiU3RhZ2luZyBzdWJzeXN0ZW0iIG1haWwgbGlzdCA8ZGV2ZWxAZHJpdmVyZGV2Lm9zdW9zbC5vcmc+IHRvby4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9nc19mcGdhYm9vdC5jIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2dzX2ZwZ2Fib290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliYzg0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9nc19mcGdhYm9vdC5jCkBAIC0wLDAgKzEsNDIyIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKworI2luY2x1ZGUgImdzX2ZwZ2Fib290LmgiCisjaW5jbHVkZSAiaW8uaCIKKworI2RlZmluZSBERVZJQ0VfTkFNRSAiZGV2aWNlIgorI2RlZmluZSBDTEFTU19OQU1FICAiZnBnYWJvb3QiCisKK3N0YXRpYyB1aW50OF90IGJpdHNfbWFnaWNbXSA9IHsKKwkweDAsIDB4OSwgMHhmLCAweGYwLCAweGYsIDB4ZjAsCisJMHhmLCAweGYwLCAweGYsIDB4ZjAsIDB4MCwgMHgwLCAweDF9OworCisvKiBmYWtlIGRldmljZSBmb3IgcmVxdWVzdF9maXJtd2FyZSAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKmZpcm13YXJlX3BkZXY7CisKK3N0YXRpYyBjaGFyCSpmaWxlID0gInhsaW54X2ZwZ2FfZmlybXdhcmUuYml0IjsKK21vZHVsZV9wYXJhbShmaWxlLCBjaGFycCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGZpbGUsICJYaWxpbnggRlBHQSBmaXJtd2FyZSBmaWxlLiIpOworCisjaWZkZWYgREVCVUdfRlBHQQorc3RhdGljIHZvaWQgZGF0YWR1bXAoY2hhciAqbXNnLCB2b2lkICptLCBpbnQgbikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICpjOworCisJcHJfaW5mbygiPT09ICVzID09PVxuIiwgbXNnKTsKKworCWMgPSBtOworCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQlpZiAoKGkmMHhmKSA9PSAwKQorCQkJcHJfaW5mbyhLRVJOX0lORk8gIlxuICAweCU0eDogIiwgaSk7CisKKwkJcHJfaW5mbygiJTAyWCAiLCBjW2ldKTsKKwl9CisKKwlwcl9pbmZvKCJcbiIpOworfQorI2VuZGlmIC8qIERFQlVHX0ZQR0EgKi8KKworc3RhdGljIHZvaWQgcmVhZF9iaXRzdHJlYW0oY2hhciAqYml0ZGF0YSwgY2hhciAqYnVmLCBpbnQgKm9mZnNldCwgaW50IHJkc2l6ZSkKK3sKKwltZW1jcHkoYnVmLCBiaXRkYXRhICsgKm9mZnNldCwgcmRzaXplKTsKKwkqb2Zmc2V0ICs9IHJkc2l6ZTsKK30KKworc3RhdGljIHZvaWQgcmVhZGluZm9fYml0c3RyZWFtKGNoYXIgKmJpdGRhdGEsIGNoYXIgKmJ1ZiwgaW50ICpvZmZzZXQpCit7CisJY2hhciB0YnVmWzY0XTsKKwlpbnQzMl90IGxlbjsKKworCS8qIHJlYWQgc2VjdGlvbiBjaGFyICovCisJcmVhZF9iaXRzdHJlYW0oYml0ZGF0YSwgdGJ1Ziwgb2Zmc2V0LCAxKTsKKworCS8qIHJlYWQgbGVuZ3RoICovCisJcmVhZF9iaXRzdHJlYW0oYml0ZGF0YSwgdGJ1Ziwgb2Zmc2V0LCAyKTsKKworCWxlbiA9IHRidWZbMF0gPDwgOCB8IHRidWZbMV07CisKKwlyZWFkX2JpdHN0cmVhbShiaXRkYXRhLCBidWYsIG9mZnNldCwgbGVuKTsKKwlidWZbbGVuXSA9ICdcMCc7Cit9CisKKy8qCisgKiByZWFkIGJpdGRhdGEgbGVuZ3RoCisgKi8KK3N0YXRpYyBpbnQgcmVhZGxlbmd0aF9iaXRzdHJlYW0oY2hhciAqYml0ZGF0YSwgaW50ICpsZW5kYXRhLCBpbnQgKm9mZnNldCkKK3sKKwljaGFyIHRidWZbNjRdOworCisJLyogcmVhZCBzZWN0aW9uIGNoYXIgKi8KKwlyZWFkX2JpdHN0cmVhbShiaXRkYXRhLCB0YnVmLCBvZmZzZXQsIDEpOworCisJLyogbWFrZSBzdXJlIGl0IGlzIHNlY3Rpb24gJ2UnICovCisJaWYgKHRidWZbMF0gIT0gJ2UnKSB7CisJCXByX2VycigiZXJyb3I6IGxlbmd0aCBzZWN0aW9uIGlzIG5vdCAnZScsIGJ1dCAlY1xuIiwgdGJ1ZlswXSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiByZWFkIDRieXRlcyBsZW5ndGggKi8KKwlyZWFkX2JpdHN0cmVhbShiaXRkYXRhLCB0YnVmLCBvZmZzZXQsIDQpOworCisJKmxlbmRhdGEgPSB0YnVmWzBdIDw8IDI0IHwgdGJ1ZlsxXSA8PCAxNiB8CisJCXRidWZbMl0gPDwgOCB8IHRidWZbM107CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogcmVhZCBmaXJzdCAxMyBieXRlcyB0byBjaGVjayBiaXRzdHJlYW0gbWFnaWMgbnVtYmVyCisgKi8KK3N0YXRpYyBpbnQgcmVhZG1hZ2ljX2JpdHN0cmVhbShjaGFyICpiaXRkYXRhLCBpbnQgKm9mZnNldCkKK3sKKwljaGFyIGJ1ZlsxM107CisJaW50IHI7CisKKwlyZWFkX2JpdHN0cmVhbShiaXRkYXRhLCBidWYsIG9mZnNldCwgMTMpOworCXIgPSBtZW1jbXAoYnVmLCBiaXRzX21hZ2ljLCAxMyk7CisJaWYgKHIpIHsKKwkJcHJfZXJyKCJlcnJvcjogY29ycnVwdGVkIGhlYWRlciIpOworCQlyZXR1cm4gLTE7CisJfQorCXByX2luZm8oImJpdHN0cmVhbSBmaWxlIG1hZ2ljIG51bWJlciBPa1xuIik7CisKKwkqb2Zmc2V0ID0gMTM7CS8qIG1hZ2ljIGxlbmd0aCAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBOT1RFOiBzdXBwb3J0cyBvbmx5IGJpdHN0cmVhbSBmb3JtYXQKKyAqLworc3RhdGljIGVudW0gZm10X2ltYWdlIGdldF9pbWFnZWZvcm1hdChzdHJ1Y3QgZnBnYWltYWdlICpmaW1hZ2UpCit7CisJcmV0dXJuIGZfYml0OworfQorCitzdGF0aWMgdm9pZCBnc19wcmludF9oZWFkZXIoc3RydWN0IGZwZ2FpbWFnZSAqZmltYWdlKQoreworCXByX2luZm8oImZpbGU6ICVzXG4iLCBmaW1hZ2UtPmZpbGVuYW1lKTsKKwlwcl9pbmZvKCJwYXJ0OiAlc1xuIiwgZmltYWdlLT5wYXJ0KTsKKwlwcl9pbmZvKCJkYXRlOiAlc1xuIiwgZmltYWdlLT5kYXRlKTsKKwlwcl9pbmZvKCJ0aW1lOiAlc1xuIiwgZmltYWdlLT50aW1lKTsKKwlwcl9pbmZvKCJsZW5kYXRhOiAlZFxuIiwgZmltYWdlLT5sZW5kYXRhKTsKK30KKworc3RhdGljIHZvaWQgZ3NfcmVhZF9iaXRzdHJlYW0oc3RydWN0IGZwZ2FpbWFnZSAqZmltYWdlKQoreworCWNoYXIgKmJpdGRhdGE7CisJaW50IHNpemU7CisJaW50IG9mZnNldDsKKworCW9mZnNldCA9IDA7CisJYml0ZGF0YSA9IChjaGFyICopZmltYWdlLT5md19lbnRyeS0+ZGF0YTsKKwlzaXplID0gZmltYWdlLT5md19lbnRyeS0+c2l6ZTsKKworCXJlYWRtYWdpY19iaXRzdHJlYW0oYml0ZGF0YSwgJm9mZnNldCk7CisJcmVhZGluZm9fYml0c3RyZWFtKGJpdGRhdGEsIGZpbWFnZS0+ZmlsZW5hbWUsICZvZmZzZXQpOworCXJlYWRpbmZvX2JpdHN0cmVhbShiaXRkYXRhLCBmaW1hZ2UtPnBhcnQsICZvZmZzZXQpOworCXJlYWRpbmZvX2JpdHN0cmVhbShiaXRkYXRhLCBmaW1hZ2UtPmRhdGUsICZvZmZzZXQpOworCXJlYWRpbmZvX2JpdHN0cmVhbShiaXRkYXRhLCBmaW1hZ2UtPnRpbWUsICZvZmZzZXQpOworCXJlYWRsZW5ndGhfYml0c3RyZWFtKGJpdGRhdGEsICZmaW1hZ2UtPmxlbmRhdGEsICZvZmZzZXQpOworCisJZmltYWdlLT5mcGdhZGF0YSA9IGJpdGRhdGEgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ3NfcmVhZF9pbWFnZShzdHJ1Y3QgZnBnYWltYWdlICpmaW1hZ2UpCit7CisJaW50IGltZ19mbXQ7CisKKwlpbWdfZm10ID0gZ2V0X2ltYWdlZm9ybWF0KGZpbWFnZSk7CisKKwlzd2l0Y2ggKGltZ19mbXQpIHsKKwljYXNlIGZfYml0OgorCQlwcl9pbmZvKCJpbWFnZSBpcyBiaXRzdHJlYW0gZm9ybWF0XG4iKTsKKwkJZ3NfcmVhZF9iaXRzdHJlYW0oZmltYWdlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCJ1bnN1cHBvcnRlZCBmcGdhIGltYWdlIGZvcm1hdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlnc19wcmludF9oZWFkZXIoZmltYWdlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzX2xvYWRfaW1hZ2Uoc3RydWN0IGZwZ2FpbWFnZSAqZmltYWdlLCBjaGFyICpmaWxlKQoreworCWludCBlcnI7CisKKwlwcl9pbmZvKCJsb2FkIGZwZ2FpbWFnZSAlc1xuIiwgZmlsZSk7CisKKwllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZmaW1hZ2UtPmZ3X2VudHJ5LCBmaWxlLCAmZmlybXdhcmVfcGRldi0+ZGV2KTsKKwlpZiAoZXJyICE9IDApIHsKKwkJcHJfZXJyKCJmaXJtd2FyZSAlcyBpcyBtaXNzaW5nLCBjYW5ub3QgY29udGludWUuXG4iLCBmaWxlKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc19kb3dubG9hZF9pbWFnZShzdHJ1Y3QgZnBnYWltYWdlICpmaW1hZ2UsIGVudW0gd2J1cyBidXNfYnl0ZXMpCit7CisJY2hhciAqYml0ZGF0YTsKKwlpbnQgc2l6ZSwgaSwgY250OworCWNudCA9IDA7CisKKwliaXRkYXRhID0gKGNoYXIgKilmaW1hZ2UtPmZwZ2FkYXRhOworCXNpemUgPSBmaW1hZ2UtPmxlbmRhdGE7CisKKyNpZmRlZiBERUJVR19GUEdBCisJZGF0YWR1bXAoImJpdGZpbGUgc2FtcGxlIiwgYml0ZGF0YSwgMHgxMDApOworI2VuZGlmIC8qIERFQlVHX0ZQR0EgKi8KKworCWlmICgheGxfc3VwcG9ydGVkX3Byb2dfYnVzX3dpZHRoKGJ1c19ieXRlcykpIHsKKwkJcHJfZXJyKCJ1bnN1cHBvcnRlZCBwcm9ncmFtIGJ1cyB3aWR0aCAlZFxuIiwKKwkJCQlidXNfYnl0ZXMpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogQnJpbmcgY3NpX2IsIHJkd3JfYiBMb3cgYW5kIHByb2dyYW1fYiBIaWdoICovCisJeGxfcHJvZ3JhbV9iKDEpOworCXhsX3Jkd3JfYigwKTsKKwl4bF9jc2lfYigwKTsKKworCS8qIENvbmZpZ3VyYXRpb24gcmVzZXQgKi8KKwl4bF9wcm9ncmFtX2IoMCk7CisJbXNsZWVwKDIwKTsKKwl4bF9wcm9ncmFtX2IoMSk7CisKKwkvKiBXYWl0IGZvciBEZXZpY2UgSW5pdGlhbGl6YXRpb24gKi8KKwl3aGlsZSAoeGxfZ2V0X2luaXRfYigpID09IDApCisJCTsKKworCXByX2luZm8oImRldmljZSBpbml0IGRvbmVcbiIpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gYnVzX2J5dGVzKQorCQl4bF9zaGlmdF9ieXRlc19vdXQoYnVzX2J5dGVzLCBiaXRkYXRhK2kpOworCisJcHJfaW5mbygicHJvZ3JhbSBkb25lXG4iKTsKKworCS8qIENoZWNrIElOSVRfQiAqLworCWlmICh4bF9nZXRfaW5pdF9iKCkgPT0gMCkgeworCQlwcl9lcnIoImluaXRfYiAwXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXdoaWxlICh4bF9nZXRfZG9uZV9iKCkgPT0gMCkgeworCQlpZiAoY250KysgPiBNQVhfV0FJVF9ET05FKSB7CisJCQlwcl9lcnIoImluaXRfQiAlZFxuIiwgeGxfZ2V0X2luaXRfYigpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGNudCA+IE1BWF9XQUlUX0RPTkUpIHsKKwkJcHJfZXJyKCJmcGdhIGRvd25sb2FkIGZhaWxcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcHJfaW5mbygiZG93bmxvYWQgZnBnYWltYWdlXG4iKTsKKworCS8qIENvbXBlbnNhdGUgZm9yIFNwZWNpYWwgU3RhcnR1cCBDb25kaXRpb25zICovCisJeGxfc2hpZnRfY2Nsayg4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzX3JlbGVhc2VfaW1hZ2Uoc3RydWN0IGZwZ2FpbWFnZSAqZmltYWdlKQoreworCXJlbGVhc2VfZmlybXdhcmUoZmltYWdlLT5md19lbnRyeSk7CisJcHJfaW5mbygicmVsZWFzZSBmcGdhaW1hZ2VcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBOT1RFOiBzdXBwb3J0cyBzeXN0ZW1tYXAgcGFyYWxsZWwgcHJvZ3JhbW1pbmcKKyAqLworc3RhdGljIGludCBnc19zZXRfZG93bmxvYWRfbWV0aG9kKHN0cnVjdCBmcGdhaW1hZ2UgKmZpbWFnZSkKK3sKKwlwcl9pbmZvKCJzZXQgcHJvZ3JhbSBtZXRob2RcbiIpOworCisJZmltYWdlLT5kbWV0aG9kID0gbV9zeXN0ZW1tYXA7CisKKwlwcl9pbmZvKCJzeXN0ZW1tYXAgcHJvZ3JhbSBtZXRob2RcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9kcml2ZXIodm9pZCkKK3sKKwlmaXJtd2FyZV9wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiZnBnYWJvb3QiLCAtMSwKKwkJCQkJCQkgTlVMTCwgMCk7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhmaXJtd2FyZV9wZGV2KTsKK30KKworc3RhdGljIHZvaWQgZmluaXNoX2RyaXZlcih2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGZpcm13YXJlX3BkZXYpOworfQorCitzdGF0aWMgaW50IGdzX2ZwZ2Fib290KHZvaWQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZnBnYWltYWdlCSpmaW1hZ2U7CisKKwlmaW1hZ2UgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZnBnYWltYWdlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGZpbWFnZSA9PSBOVUxMKSB7CisJCXByX2VycigiTm8gbWVtb3J5IGlzIGF2YWlsYWJsZVxuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwllcnIgPSBnc19sb2FkX2ltYWdlKGZpbWFnZSwgZmlsZSk7CisJaWYgKGVycikgeworCQlwcl9lcnIoImdzX2xvYWRfaW1hZ2UgZXJyb3JcbiIpOworCQlnb3RvIGVycl9vdXQxOworCX0KKworCWVyciA9IGdzX3JlYWRfaW1hZ2UoZmltYWdlKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiZ3NfcmVhZF9pbWFnZSBlcnJvclxuIik7CisJCWdvdG8gZXJyX291dDI7CisJfQorCisJZXJyID0gZ3Nfc2V0X2Rvd25sb2FkX21ldGhvZChmaW1hZ2UpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJnc19zZXRfZG93bmxvYWRfbWV0aG9kIGVycm9yXG4iKTsKKwkJZ290byBlcnJfb3V0MjsKKwl9CisKKwllcnIgPSBnc19kb3dubG9hZF9pbWFnZShmaW1hZ2UsIGJ1c18yYnl0ZSk7CisJaWYgKGVycikgeworCQlwcl9lcnIoImdzX2Rvd25sb2FkX2ltYWdlIGVycm9yXG4iKTsKKwkJZ290byBlcnJfb3V0MjsKKwl9CisKKwllcnIgPSBnc19yZWxlYXNlX2ltYWdlKGZpbWFnZSk7CisJaWYgKGVycikgeworCQlwcl9lcnIoImdzX3JlbGVhc2VfaW1hZ2UgZXJyb3JcbiIpOworCQlnb3RvIGVycl9vdXQxOworCX0KKworCWtmcmVlKGZpbWFnZSk7CisJcmV0dXJuIDA7CisKK2Vycl9vdXQyOgorCWVyciA9IGdzX3JlbGVhc2VfaW1hZ2UoZmltYWdlKTsKKwlpZiAoZXJyKQorCQlwcl9lcnIoImdzX3JlbGVhc2VfaW1hZ2UgZXJyb3JcbiIpOworZXJyX291dDE6CisJa2ZyZWUoZmltYWdlKTsKKworZXJyX291dDoKKwlyZXR1cm4gLTE7CisKK30KKworc3RhdGljIGludCBfX2luaXQgZ3NfZnBnYWJvb3RfaW5pdCh2b2lkKQoreworCWludCBlcnIsIHI7CisKKwlyID0gLTE7CisKKwlwcl9pbmZvKCJGUEdBIERPV05MT0FEIC0tLT5cbiIpOworCXByX2luZm8oImJ1aWx0IGF0ICVzIFVUQ1xuIiwgX19USU1FU1RBTVBfXyk7CisKKwlwcl9pbmZvKCJGUEdBIGltYWdlIGZpbGUgbmFtZTogJXNcbiIsIGZpbGUpOworCisJZXJyID0gaW5pdF9kcml2ZXIoKTsKKwlpZiAoZXJyICE9IDApIHsKKwkJcHJfZXJyKCJGUEdBIERSSVZFUiBJTklUIEZBSUwhIVxuIik7CisJCXJldHVybiByOworCX0KKworCWVyciA9IHhsX2luaXRfaW8oKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiR1BJTyBJTklUIEZBSUwhIVxuIik7CisJCXIgPSAtMTsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJZXJyID0gZ3NfZnBnYWJvb3QoKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiRlBHQSBET1dOTE9BRCBGQUlMISFcbiIpOworCQlyID0gLTE7CisJCWdvdG8gZXJyb3V0OworCX0KKworCXByX2luZm8oIkZQR0EgRE9XTkxPQUQgRE9ORSA8LS0tXG4iKTsKKworCXIgPSAwOworCXJldHVybiByOworCitlcnJvdXQ6CisJZmluaXNoX2RyaXZlcigpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBnc19mcGdhYm9vdF9leGl0KHZvaWQpCit7CisJZmluaXNoX2RyaXZlcigpOworCXByX2luZm8oIkZQR0EgaW1hZ2UgZG93bmxvYWQgbW9kdWxlIHJlbW92ZWRcbiIpOworfQorCittb2R1bGVfaW5pdChnc19mcGdhYm9vdF9pbml0KTsKK21vZHVsZV9leGl0KGdzX2ZwZ2Fib290X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJJbnNvcCBTb25nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlhsaW5peCBGUEdBIGZpcm13YXJlIGRvd25sb2FkIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvZ3NfZnBnYWJvb3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9nc19mcGdhYm9vdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MWY0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvZ3NfZnBnYWJvb3QuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorCisjZGVmaW5lCU1BWF9TVFIJMjU2CisKK2VudW0gZm10X2ltYWdlIHsKKwlmX2JpdCwJLyogb25seSBiaXRzdHJlYW0gaXMgc3VwcG9ydGVkICovCisJZl9yYnQsCisJZl9iaW4sCisJZl9tY3MsCisJZl9oZXgsCit9OworCitlbnVtIG1kb3dubG9hZCB7CisJbV9zeXN0ZW1tYXAsCS8qIG9ubHkgc3lzdGVtIG1hcCBpcyBzdXBwb3J0ZWQgKi8KKwltX3NlcmlhbCwKKwltX2p0YWcsCit9OworCisvKgorICogeGlsaW54IGZwZ2FpbWFnZSBpbmZvcm1hdGlvbgorICogTk9URTogdXNlIE1BWF9TVFIgaW5zdGVhZCBvZiBkeW5hbWljIGFsbG9jIGZvciBzaW1wbGljaXR5CisgKi8KK3N0cnVjdCBmcGdhaW1hZ2UgeworCWVudW0gZm10X2ltYWdlCWZtdF9pbWc7CisJZW51bSBtZG93bmxvYWQJZG1ldGhvZDsKKworCWNvbnN0IHN0cnVjdAlmaXJtd2FyZQkqZndfZW50cnk7CisKKwkvKgorCSAqIHRoZSBmb2xsb3dpbmdzIGNhbiBiZSByZWFkIGZyb20gYml0c3RyZWFtLAorCSAqIGJ1dCBvdGhlciBpbWFnZSBmb3JtYXQgc2hvdWxkIGhhdmUgYXMgd2VsbAorCSAqLworCWNoYXIJZmlsZW5hbWVbTUFYX1NUUl07CisJY2hhcglwYXJ0W01BWF9TVFJdOworCWNoYXIJZGF0ZVtNQVhfU1RSXTsKKwljaGFyCXRpbWVbTUFYX1NUUl07CisJaW50MzJfdAlsZW5kYXRhOworCWNoYXIJKmZwZ2FkYXRhOworfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9pby5jIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdiZThlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9pby5jCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlICJpby5oIgorCisjaWZkZWYgQ09ORklHX0I0ODYwRzEwMAorc3RhdGljIHN0cnVjdCBncGlvYnVzIGdidXM7CisjZW5kaWYgLyogQ09ORklHX0I0ODYwRzEwMCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYnl0ZTBfb3V0KHVuc2lnbmVkIGNoYXIgZGF0YSk7CitzdGF0aWMgaW5saW5lIHZvaWQgYnl0ZTFfb3V0KHVuc2lnbmVkIGNoYXIgZGF0YSk7CitzdGF0aWMgaW5saW5lIHZvaWQgeGxfY2Nsa19iKGludDMyX3QgaSk7CisKKworLyogQXNzZXJ0IGFuZCBEZWFzc2VydCBDQ0xLICovCit2b2lkIHhsX3NoaWZ0X2NjbGsoaW50IGNvdW50KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXhsX2NjbGtfYigxKTsKKwkJeGxfY2Nsa19iKDApOworCX0KK30KKworaW50IHhsX3N1cHBvcnRlZF9wcm9nX2J1c193aWR0aChlbnVtIHdidXMgYnVzX2J5dGVzKQoreworCXN3aXRjaCAoYnVzX2J5dGVzKSB7CisJY2FzZSBidXNfMWJ5dGU6CisJCWJyZWFrOworCWNhc2UgYnVzXzJieXRlOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoInVuc3VwcG9ydGVkIHByb2dyYW0gYnVzIHdpZHRoICVkXG4iLAorCQkJCWJ1c19ieXRlcyk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKiBTZXJpYWxpemUgYnl0ZSBhbmQgY2xvY2sgZWFjaCBiaXQgb24gdGFyZ2V0J3MgRElOIGFuZCBDQ0xLIHBpbnMgKi8KK3ZvaWQgeGxfc2hpZnRfYnl0ZXNfb3V0KGVudW0gd2J1cyBidXNfYnl0ZSwgdW5zaWduZWQgY2hhciAqcGRhdGEpCit7CisJLyoKKwkgKiBzdXBwb3J0cyAxIGFuZCAyIGJ5dGVzIHByb2dyYW1taW5nIG1vZGUKKwkgKi8KKwlpZiAobGlrZWx5KGJ1c19ieXRlID09IGJ1c18yYnl0ZSkpCisJCWJ5dGUwX291dChwZGF0YVswXSk7CisKKwlieXRlMV9vdXQocGRhdGFbMV0pOworCXhsX3NoaWZ0X2NjbGsoMSk7Cit9CisKKy8qCisgKiBnZW5lcmljIGJpdCBzd2FwIGZvciB4aWxpbnggU1lTVEVNTUFQIEZQR0EgcHJvZ3JhbW1pbmcKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGJpdHN3YXAodW5zaWduZWQgY2hhciBzKQoreworCXVuc2lnbmVkIGNoYXIgZDsKKwlkID0gKCgocyYweDgwKT4+NykgfCAoKHMmMHg0MCk+PjUpIHwgKChzJjB4MjApPj4zKSB8ICgocyYweDEwKT4+MSkgfAorCQkoKHMmMHgwOCk8PDEpIHwgKChzJjB4MDQpPDwzKSB8ICgocyYweDAyKTw8NSkgfCAoKHMmMHgwMSk8PDcpKTsKKwlyZXR1cm4gZDsKK30KKworI2lmZGVmIENPTkZJR19CNDg2MEcxMDAKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBib2FyZCBzcGVjaWZpYyBjb25maWd1cmF0aW9uCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIG1wYzg1eHhfZ3Bpb19zZXRfZGlyKAorCQkJaW50MzJfdCBwb3J0LAorCQkJdWludDMyX3QgbWFzaywKKwkJCXVpbnQzMl90IGRpcikKK3sKKwlkaXIgfD0gKGluX2JlMzIoZ2J1cy5yW3BvcnRdK0dQRElSKSAmIH5tYXNrKTsKKwlvdXRfYmUzMihnYnVzLnJbcG9ydF0rR1BESVIsIGRpcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcGM4NXh4X2dwaW9fc2V0KGludDMyX3QgcG9ydCwgdWludDMyX3QgbWFzaywgdWludDMyX3QgdmFsKQoreworCS8qIEZpcnN0IG1hc2sgb2ZmIHRoZSB1bndhbnRlZCBwYXJ0cyBvZiAiZGlyIiBhbmQgInZhbCIgKi8KKwl2YWwgJj0gbWFzazsKKworCS8qIE5vdyByZWFkIGluIHRoZSB2YWx1ZXMgd2UncmUgc3VwcG9zZWQgdG8gcHJlc2VydmUgKi8KKwl2YWwgfD0gKGluX2JlMzIoZ2J1cy5yW3BvcnRdK0dQREFUKSAmIH5tYXNrKTsKKworCW91dF9iZTMyKGdidXMucltwb3J0XStHUERBVCwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBtcGM4NXh4X2dwaW9fZ2V0KGludDMyX3QgcG9ydCwgdWludDMyX3QgbWFzaykKK3sKKwkvKiBSZWFkIHRoZSByZXF1ZXN0ZWQgdmFsdWVzICovCisJcmV0dXJuIGluX2JlMzIoZ2J1cy5yW3BvcnRdK0dQREFUKSAmIG1hc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcGM4NXh4X2dwaW9fc2V0X2xvdyhpbnQzMl90IHBvcnQsIHVpbnQzMl90IGdwaW9zKQoreworCW1wYzg1eHhfZ3Bpb19zZXQocG9ydCwgZ3Bpb3MsIDB4MDAwMDAwMDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXBjODV4eF9ncGlvX3NldF9oaWdoKGludDMyX3QgcG9ydCwgdWludDMyX3QgZ3Bpb3MpCit7CisJbXBjODV4eF9ncGlvX3NldChwb3J0LCBncGlvcywgMHhGRkZGRkZGRik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBncGlvX3NldF92YWx1ZShpbnQzMl90IHBvcnQsIHVpbnQzMl90IGdwaW8sIHVpbnQzMl90IHZhbHVlKQoreworCWludDMyX3QgZzsKKwlnID0gMzEgLSBncGlvOworCWlmICh2YWx1ZSkKKwkJbXBjODV4eF9ncGlvX3NldF9oaWdoKHBvcnQsIDFVIDw8IGcpOworCWVsc2UKKwkJbXBjODV4eF9ncGlvX3NldF9sb3cocG9ydCwgMVUgPDwgZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fZ2V0X3ZhbHVlKGludDMyX3QgcG9ydCwgdWludDMyX3QgZ3BpbykKK3sKKwlpbnQzMl90IGc7CisJZyA9IDMxIC0gZ3BpbzsKKwlyZXR1cm4gISFtcGM4NXh4X2dwaW9fZ2V0KHBvcnQsIDFVIDw8IGcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgeGxfY2Nsa19iKGludDMyX3QgaSkKK3sKKwlncGlvX3NldF92YWx1ZShYTF9DQ0xLX1BPUlQsIFhMX0NDTEtfUElOLCBpKTsKK30KKwordm9pZCB4bF9wcm9ncmFtX2IoaW50MzJfdCBpKQoreworCWdwaW9fc2V0X3ZhbHVlKFhMX1BST0dOX1BPUlQsIFhMX1BST0dOX1BJTiwgaSk7Cit9CisKK3ZvaWQgeGxfcmR3cl9iKGludDMyX3QgaSkKK3sKKwlncGlvX3NldF92YWx1ZShYTF9SRFdSTl9QT1JULCBYTF9SRFdSTl9QSU4sIGkpOworfQorCit2b2lkIHhsX2NzaV9iKGludDMyX3QgaSkKK3sKKwlncGlvX3NldF92YWx1ZShYTF9DU0lOX1BPUlQsIFhMX0NTSU5fUElOLCBpKTsKK30KKworaW50IHhsX2dldF9pbml0X2Iodm9pZCkKK3sKKwlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoWExfSU5JVE5fUE9SVCwgWExfSU5JVE5fUElOKTsKK30KKworaW50IHhsX2dldF9kb25lX2Iodm9pZCkKK3sKKwlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoWExfRE9ORV9QT1JULCBYTF9ET05FX1BJTik7Cit9CisKKworLyogRzEwMCBzcGVjaWZpYyBiaXQgc3dhcCBhbmQgcmVtbWFwICh0byBncGlvIHBpbnMpIGZvciBieXRlIDAgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgYml0X3JlbWFwX2J5dGUwKHVpbnQzMl90IHMpCit7CisJdWludDMyX3QgZDsKKwlkID0gKCgocyYweDgwKT4+NykgfCAoKHMmMHg0MCk+PjUpIHwgKChzJjB4MjApPj4zKSB8ICgocyYweDEwKT4+MSkgfAorCQkoKHMmMHgwOCk8PDEpIHwgKChzJjB4MDQpPDwzKSB8ICgocyYweDAyKTw8NikgfCAoKHMmMHgwMSk8PDkpKTsKKwlyZXR1cm4gZDsKK30KKworLyoKKyAqIEcxMDAgc3BlY2lmaWMgTVNCLCBpbiB0aGlzIG9yZGVyIFtieXRlMCB8IGJ5dGUxXSwgb3V0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBieXRlMF9vdXQodW5zaWduZWQgY2hhciBkYXRhKQoreworCXVpbnQzMl90IHN3YXAzMjsKKwlzd2FwMzIgPSAgYml0X3JlbWFwX2J5dGUwKCh1aW50MzJfdCkgZGF0YSkgPDwgODsKKworCW1wYzg1eHhfZ3Bpb19zZXQoMCwgMHgwMDAyQkYwMCwgKHVpbnQzMl90KSBzd2FwMzIpOworfQorCisvKgorICogRzEwMCBzcGVjaWZpYyBMU0IsIGluIHRoaXMgb3JkZXIgW2J5dGUwIHwgYnl0ZTFdLCBvdXQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJ5dGUxX291dCh1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJbXBjODV4eF9ncGlvX3NldCgwLCAweDAwMDAwMEZGLCAodWludDMyX3QpIGJpdHN3YXAoZGF0YSkpOworfQorCisvKgorICogY29uZmlndXJhYmxlIHBlciBkZXZpY2UgdHlwZSBmb3IgZGlmZmVyZW50IEkvTyBjb25maWcKKyAqLworaW50IHhsX2luaXRfaW8odm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCWNvbnN0IHUzMiAqcF9yZWc7CisJaW50IHJlZywgY250OworCisJY250ID0gMDsKKwltZW1zZXQoJmdidXMsIDAsIHNpemVvZihzdHJ1Y3QgZ3Bpb2J1cykpOworCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgTlVMTCwgImZzbCxxb3JpcS1ncGlvIikgeworCQlwX3JlZyA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOworCQlpZiAocF9yZWcgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlyZWcgPSAoaW50KSAqcF9yZWc7CisJCWdidXMucltjbnRdID0gb2ZfaW9tYXAobnAsIDApOworCisJCWlmICghZ2J1cy5yW2NudF0pIHsKKwkJCXByX2Vycigibm90IGZpbmRkaW5nIGdwaW8gY2VsbC1pbmRleCAlZFxuIiwgY250KTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWNudCsrOworCX0KKwltcGM4NXh4X2dwaW9fc2V0X2RpcigwLCAweDAwMDJCRkZGLCAweDAwMDJCRkZGKTsKKwltcGM4NXh4X2dwaW9fc2V0X2RpcigxLCAweDAwMjQwMDYwLCAweDAwMjQwMDYwKTsKKworCWdidXMubmdwaW8gPSBjbnQ7CisKKwlyZXR1cm4gMDsKK30KKworCisjZWxzZQkvKiBwbGFjZWhvbGRlciBmb3IgYm9hcmRzIHdpdGggZGlmZmVyZW50IGNvbmZpZyAqLworCit2b2lkIHhsX3Byb2dyYW1fYihpbnQzMl90IGkpCit7CisJcmV0dXJuOworfQorCit2b2lkIHhsX3Jkd3JfYihpbnQzMl90IGkpCit7CisJcmV0dXJuOworfQorCit2b2lkIHhsX2NzaV9iKGludDMyX3QgaSkKK3sKKwlyZXR1cm47Cit9CisKK2ludCB4bF9nZXRfaW5pdF9iKHZvaWQpCit7CisJcmV0dXJuIC0xOworfQorCitpbnQgeGxfZ2V0X2RvbmVfYih2b2lkKQoreworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ5dGUwX291dCh1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnl0ZTFfb3V0KHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4bF9jY2xrX2IoaW50MzJfdCBpKQoreworCXJldHVybjsKK30KKworLyoKKyAqIGNvbmZpZ3VyYWJsZSBwZXIgZGV2aWNlIHR5cGUgZm9yIGRpZmZlcmVudCBJL08gY29uZmlnCisgKi8KK2ludCB4bF9pbml0X2lvKHZvaWQpCit7CisJcmV0dXJuIC0xOworfQorCisjZW5kaWYgLyogQ09ORklHX0I0ODYwRzEwMCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2lvLmggYi9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjQ2YWMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2lvLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjZGVmaW5lIEdQRElSCTAKKyNkZWZpbmUgR1BDRkcJNAkvKiBvcGVuIGRyYWluIG9yIG5vdCAqLworI2RlZmluZSBHUERBVAk4CisKKy8qCisgKiBncGlvIHBvcnQgYW5kIHBpbiBkZWZpbml0aW9ucworICogTk9URTogcG9ydCBudW1iZXIgc3RhcnRzIGZyb20gMAorICovCisjZGVmaW5lCVhMX0lOSVROX1BPUlQJMQorI2RlZmluZQlYTF9JTklUTl9QSU4JMTQKKyNkZWZpbmUJWExfUkRXUk5fUE9SVAkxCisjZGVmaW5lCVhMX1JEV1JOX1BJTgkxMworI2RlZmluZQlYTF9DQ0xLX1BPUlQJMQorI2RlZmluZQlYTF9DQ0xLX1BJTgkxMAorI2RlZmluZQlYTF9QUk9HTl9QT1JUCTEKKyNkZWZpbmUJWExfUFJPR05fUElOCTI1CisjZGVmaW5lCVhMX0NTSU5fUE9SVAkxCisjZGVmaW5lCVhMX0NTSU5fUElOCTI2CisjZGVmaW5lCVhMX0RPTkVfUE9SVAkxCisjZGVmaW5lCVhMX0RPTkVfUElOCTI3CisKKy8qCisgKiBncGlvIG1hcHBpbmcKKyAqCisJWExfY29uZmlnX0QwIOKAkyBncGlvMV8zMQorCVhsX2NvbmZpZ19kMSDigJMgZ3BpbzFfMzAKKwlYbF9jb25maWdfZDIg4oCTIGdwaW8xXzI5CisJWGxfY29uZmlnX2QzIOKAkyBncGlvMV8yOAorCVhsX2NvbmZpZ19kNCDigJMgZ3BpbzFfMjcKKwlYbF9jb25maWdfZDUg4oCTIGdwaW8xXzI2CisJWGxfY29uZmlnX2Q2IOKAkyBncGlvMV8yNQorCVhsX2NvbmZpZ19kNyDigJMgZ3BpbzFfMjQKKwlYbF9jb25maWdfZDgg4oCTIGdwaW8xXzIzCisJWGxfY29uZmlnX2Q5IOKAkyBncGlvMV8yMgorCVhsX2NvbmZpZ19kMTAg4oCTIGdwaW8xXzIxCisJWGxfY29uZmlnX2QxMSDigJMgZ3BpbzFfMjAKKwlYbF9jb25maWdfZDEyIOKAkyBncGlvMV8xOQorCVhsX2NvbmZpZ19kMTMg4oCTIGdwaW8xXzE4CisJWGxfY29uZmlnX2QxNCDigJMgZ3BpbzFfMTYKKwlYbF9jb25maWdfZDE1IOKAkyBncGlvMV8xNAorKgorKi8KKworLyoKKyAqIHByb2dyYW0gYnVzIHdpZHRoIGluIGJ5dGVzCisgKi8KK2VudW0gd2J1cyB7CisJYnVzXzFieXRlCT0gMSwKKwlidXNfMmJ5dGUJPSAyLAorfTsKKworCisjZGVmaW5lIE1BWF9XQUlUX0RPTkUJMTAwMDAKKworCitzdHJ1Y3QgZ3Bpb2J1cyB7CisJaW50CW5ncGlvOworCXZvaWQgX19pb21lbSAqcls0XTsKK307CisKK2ludCB4bF9zdXBwb3J0ZWRfcHJvZ19idXNfd2lkdGgoZW51bSB3YnVzIGJ1c19ieXRlcyk7CisKK3ZvaWQgeGxfcHJvZ3JhbV9iKGludDMyX3QgaSk7Cit2b2lkIHhsX3Jkd3JfYihpbnQzMl90IGkpOwordm9pZCB4bF9jc2lfYihpbnQzMl90IGkpOworCitpbnQgeGxfZ2V0X2luaXRfYih2b2lkKTsKK2ludCB4bF9nZXRfZG9uZV9iKHZvaWQpOworCit2b2lkIHhsX3NoaWZ0X2NjbGsoaW50IGNvdW50KTsKK3ZvaWQgeGxfc2hpZnRfYnl0ZXNfb3V0KGVudW0gd2J1cyBidXNfYnl0ZSwgdW5zaWduZWQgY2hhciAqcGRhdGEpOworCitpbnQgeGxfaW5pdF9pbyh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9paW9fdXRpbHMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9paW9fdXRpbHMuaAppbmRleCBjOWZlZGI3Li4yMDY0ODM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vaWlvX3V0aWxzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2lpb191dGlscy5oCkBAIC02NTIsMyArNjUyLDI1IEBACiAJZnJlZSh0ZW1wKTsKIAlyZXR1cm4gcmV0OwogfQorCityZWFkX3N5c2ZzX3N0cmluZyhjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqYmFzZWRpciwgY2hhciAqc3RyKQoreworCWZsb2F0IHJldCA9IDA7CisJRklMRSAgKnN5c2ZzZnA7CisJY2hhciAqdGVtcCA9IG1hbGxvYyhzdHJsZW4oYmFzZWRpcikgKyBzdHJsZW4oZmlsZW5hbWUpICsgMik7CisJaWYgKHRlbXAgPT0gTlVMTCkgeworCQlwcmludGYoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3ByaW50Zih0ZW1wLCAiJXMvJXMiLCBiYXNlZGlyLCBmaWxlbmFtZSk7CisJc3lzZnNmcCA9IGZvcGVuKHRlbXAsICJyIik7CisJaWYgKHN5c2ZzZnAgPT0gTlVMTCkgeworCQlyZXQgPSAtZXJybm87CisJCWdvdG8gZXJyb3JfZnJlZTsKKwl9CisJZnNjYW5mKHN5c2ZzZnAsICIlc1xuIiwgc3RyKTsKKwlmY2xvc2Uoc3lzZnNmcCk7CitlcnJvcl9mcmVlOgorCWZyZWUodGVtcCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9sc2lpby5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2xzaWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhZTk2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9sc2lpby5jCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogSW5kdXN0cmlhbCBJL08gdXRpbGl0aWVzIC0gbHNpaW8uYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBNYW51ZWwgU3RhaGwgPG1hbnVlbC5zdGFobEBpaXMuZnJhdW5ob2Zlci5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVkZSAiaWlvX3V0aWxzLmgiCisKKworc3RhdGljIGVudW0gdmVyYm9zaXR5IHsKKwlWRVJCTEVWRUxfREVGQVVMVCwJLyogMCBnaXZlcyBsc3BjaSBiZWhhdmlvdXIgKi8KKwlWRVJCTEVWRUxfU0VOU09SUywJLyogMSBsaXN0cyBzZW5zb3JzICovCit9IHZlcmJsZXZlbCA9IFZFUkJMRVZFTF9ERUZBVUxUOworCitjb25zdCBjaGFyICp0eXBlX2RldmljZSA9ICJpaW86ZGV2aWNlIjsKK2NvbnN0IGNoYXIgKnR5cGVfdHJpZ2dlciA9ICJ0cmlnZ2VyIjsKKworCitzdGF0aWMgaW5saW5lIGludCBjaGVja19wcmVmaXgoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJcmV0dXJuIHN0cmxlbihzdHIpID4gc3RybGVuKHByZWZpeCkgJiYKKwkJc3RybmNtcChzdHIsIHByZWZpeCwgc3RybGVuKHByZWZpeCkpID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3Bvc3RmaXgoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpwb3N0Zml4KQoreworCXJldHVybiBzdHJsZW4oc3RyKSA+IHN0cmxlbihwb3N0Zml4KSAmJgorCQlzdHJjbXAoc3RyICsgc3RybGVuKHN0cikgLSBzdHJsZW4ocG9zdGZpeCksIHBvc3RmaXgpID09IDA7Cit9CisKK3N0YXRpYyBpbnQgZHVtcF9jaGFubmVscyhjb25zdCBjaGFyICpkZXZfZGlyX25hbWUpCit7CisJRElSICpkcDsKKwljb25zdCBzdHJ1Y3QgZGlyZW50ICplbnQ7CisJZHAgPSBvcGVuZGlyKGRldl9kaXJfbmFtZSk7CisJaWYgKGRwID09IE5VTEwpCisJCXJldHVybiAtZXJybm87CisJd2hpbGUgKGVudCA9IHJlYWRkaXIoZHApLCBlbnQgIT0gTlVMTCkKKwkJaWYgKGNoZWNrX3ByZWZpeChlbnQtPmRfbmFtZSwgImluXyIpICYmCisJCSAgICBjaGVja19wb3N0Zml4KGVudC0+ZF9uYW1lLCAiX3JhdyIpKSB7CisJCQlwcmludGYoIiAgICUtMTBzXG4iLCBlbnQtPmRfbmFtZSk7CisJCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR1bXBfb25lX2RldmljZShjb25zdCBjaGFyICpkZXZfZGlyX25hbWUpCit7CisJY2hhciBuYW1lW0lJT19NQVhfTkFNRV9MRU5HVEhdOworCWludCBkZXZfaWR4OworCisJc3NjYW5mKGRldl9kaXJfbmFtZSArIHN0cmxlbihpaW9fZGlyKSArIHN0cmxlbih0eXBlX2RldmljZSksCisJCQkiJWkiLCAmZGV2X2lkeCk7CisJcmVhZF9zeXNmc19zdHJpbmcoIm5hbWUiLCBkZXZfZGlyX25hbWUsIG5hbWUpOworCXByaW50ZigiRGV2aWNlICUwM2Q6ICVzXG4iLCBkZXZfaWR4LCBuYW1lKTsKKworCWlmICh2ZXJibGV2ZWwgPj0gVkVSQkxFVkVMX1NFTlNPUlMpIHsKKwkJaW50IHJldCA9IGR1bXBfY2hhbm5lbHMoZGV2X2Rpcl9uYW1lKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR1bXBfb25lX3RyaWdnZXIoY29uc3QgY2hhciAqZGV2X2Rpcl9uYW1lKQoreworCWNoYXIgbmFtZVtJSU9fTUFYX05BTUVfTEVOR1RIXTsKKwlpbnQgZGV2X2lkeDsKKworCXNzY2FuZihkZXZfZGlyX25hbWUgKyBzdHJsZW4oaWlvX2RpcikgKyBzdHJsZW4odHlwZV90cmlnZ2VyKSwKKwkJCSIlaSIsICZkZXZfaWR4KTsKKwlyZWFkX3N5c2ZzX3N0cmluZygibmFtZSIsIGRldl9kaXJfbmFtZSwgbmFtZSk7CisJcHJpbnRmKCJUcmlnZ2VyICUwM2Q6ICVzXG4iLCBkZXZfaWR4LCBuYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHVtcF9kZXZpY2VzKHZvaWQpCit7CisJY29uc3Qgc3RydWN0IGRpcmVudCAqZW50OworCWludCBudW1iZXIsIG51bXN0cmxlbjsKKworCUZJTEUgKm5hbWVGaWxlOworCURJUiAqZHA7CisJY2hhciB0aGlzbmFtZVtJSU9fTUFYX05BTUVfTEVOR1RIXTsKKwljaGFyICpmaWxlbmFtZTsKKworCWRwID0gb3BlbmRpcihpaW9fZGlyKTsKKwlpZiAoZHAgPT0gTlVMTCkgeworCQlwcmludGYoIk5vIGluZHVzdHJpYWwgSS9PIGRldmljZXMgYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChlbnQgPSByZWFkZGlyKGRwKSwgZW50ICE9IE5VTEwpIHsKKwkJaWYgKGNoZWNrX3ByZWZpeChlbnQtPmRfbmFtZSwgdHlwZV9kZXZpY2UpKSB7CisJCQljaGFyICpkZXZfZGlyX25hbWU7CisJCQlhc3ByaW50ZigmZGV2X2Rpcl9uYW1lLCAiJXMlcyIsIGlpb19kaXIsIGVudC0+ZF9uYW1lKTsKKwkJCWR1bXBfb25lX2RldmljZShkZXZfZGlyX25hbWUpOworCQkJZnJlZShkZXZfZGlyX25hbWUpOworCQkJaWYgKHZlcmJsZXZlbCA+PSBWRVJCTEVWRUxfU0VOU09SUykKKwkJCQlwcmludGYoIlxuIik7CisJCX0KKwl9CisJcmV3aW5kZGlyKGRwKTsKKwl3aGlsZSAoZW50ID0gcmVhZGRpcihkcCksIGVudCAhPSBOVUxMKSB7CisJCWlmIChjaGVja19wcmVmaXgoZW50LT5kX25hbWUsIHR5cGVfdHJpZ2dlcikpIHsKKwkJCWNoYXIgKmRldl9kaXJfbmFtZTsKKwkJCWFzcHJpbnRmKCZkZXZfZGlyX25hbWUsICIlcyVzIiwgaWlvX2RpciwgZW50LT5kX25hbWUpOworCQkJZHVtcF9vbmVfdHJpZ2dlcihkZXZfZGlyX25hbWUpOworCQkJZnJlZShkZXZfZGlyX25hbWUpOworCQl9CisJfQorCWNsb3NlZGlyKGRwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBjLCBlcnIgPSAwOworCisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJkOkQ6diIpKSAhPSBFT0YpIHsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ3YnOgorCQkJdmVyYmxldmVsKys7CisJCQlicmVhazsKKworCQljYXNlICc/JzoKKwkJZGVmYXVsdDoKKwkJCWVycisrOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGVyciB8fCBhcmdjID4gb3B0aW5kKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGxzaWlvIFtvcHRpb25zXS4uLlxuIgorCQkJIkxpc3QgaW5kdXN0cmlhbCBJL08gZGV2aWNlc1xuIgorCQkJIiAgLXYsIC0tdmVyYm9zZVxuIgorCQkJIiAgICAgIEluY3JlYXNlIHZlcmJvc2l0eSAobWF5IGJlIGdpdmVuIG11bHRpcGxlIHRpbWVzKVxuIgorCQkJKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlkdW1wX2RldmljZXMoKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDAuaAppbmRleCBjMTAxNmM1Li5iMjg0ZTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDAuaApAQCAtNjUsNyArNjUsOCBAQAogCiAjZGVmaW5lIFNDQTMwMDBfUklOR19CVUZfRU5BQkxFCQkJMHg4MAogI2RlZmluZSBTQ0EzMDAwX1JJTkdfQlVGXzhCSVQJCQkweDQwCi0vKiBGcmVlIGZhbGwgZGV0ZWN0aW9uIHRyaWdnZXJzIGFuIGludGVycnVwdCBpZiB0aGUgYWNjZWxlcmF0aW9uCisvKgorICogRnJlZSBmYWxsIGRldGVjdGlvbiB0cmlnZ2VycyBhbiBpbnRlcnJ1cHQgaWYgdGhlIGFjY2VsZXJhdGlvbgogICogaXMgYmVsb3cgYSB0aHJlc2hvbGQgZm9yIGVxdWl2YWxlbnQgb2YgMjVjbSBkcm9wCiAgKi8KICNkZWZpbmUgU0NBMzAwMF9GUkVFX0ZBTExfREVURUNUCQkweDEwCkBAIC03Myw4ICs3NCw5IEBACiAjZGVmaW5lIFNDQTMwMDBfTUVBU19NT0RFX09QXzEJCQkweDAxCiAjZGVmaW5lIFNDQTMwMDBfTUVBU19NT0RFX09QXzIJCQkweDAyCiAKLS8qIEluIG1vdGlvbiBkZXRlY3Rpb24gbW9kZSB0aGUgYWNjZWxlcmF0aW9ucyBhcmUgYmFuZCBwYXNzIGZpbHRlcmVkCi0gKiAoYXByb3ggMSAtIDI1SHopIGFuZCB0aGVuIGEgcHJvZ3JhbW1hYmxlIHRocmVzaG9sZCB1c2VkIHRvIHRyaWdnZXIKKy8qCisgKiBJbiBtb3Rpb24gZGV0ZWN0aW9uIG1vZGUgdGhlIGFjY2VsZXJhdGlvbnMgYXJlIGJhbmQgcGFzcyBmaWx0ZXJlZAorICogKGFwcHJveCAxIC0gMjVIeikgYW5kIHRoZW4gYSBwcm9ncmFtbWFibGUgdGhyZXNob2xkIHVzZWQgdG8gdHJpZ2dlcgogICogYW5kIGludGVycnVwdC4KICAqLwogI2RlZmluZSBTQ0EzMDAwX01FQVNfTU9ERV9NT1RfREVUCQkweDAzCkBAIC05OSw4ICsxMDEsMTAgQEAKICNkZWZpbmUgU0NBMzAwMF9SRUdfQ1RSTF9TRUxfTURfWV9USAkJMHgwMwogI2RlZmluZSBTQ0EzMDAwX1JFR19DVFJMX1NFTF9NRF9YX1RICQkweDA0CiAjZGVmaW5lIFNDQTMwMDBfUkVHX0NUUkxfU0VMX01EX1pfVEgJCTB4MDUKLS8qIEJFIFZFUlkgQ0FSRUZVTCBXSVRIIFRISVMsIElGIDMgQklUUyBBUkUgTk9UIFNFVCB0aGUgZGV2aWNlCi0gICB3aWxsIG5vdCBmdW5jdGlvbiAqLworLyoKKyAqIEJFIFZFUlkgQ0FSRUZVTCBXSVRIIFRISVMsIElGIDMgQklUUyBBUkUgTk9UIFNFVCB0aGUgZGV2aWNlCisgKiB3aWxsIG5vdCBmdW5jdGlvbgorICovCiAjZGVmaW5lIFNDQTMwMDBfUkVHX0NUUkxfU0VMX09VVF9DVFJMCQkweDBCCiAjZGVmaW5lIFNDQTMwMDBfT1VUX0NUUkxfUFJPVF9NQVNLCQkweEUwCiAjZGVmaW5lIFNDQTMwMDBfT1VUX0NUUkxfQlVGX1hfRU4JCTB4MTAKQEAgLTEwOSw4ICsxMTMsOSBAQAogI2RlZmluZSBTQ0EzMDAwX09VVF9DVFJMX0JVRl9ESVZfNAkJMHgwMgogI2RlZmluZSBTQ0EzMDAwX09VVF9DVFJMX0JVRl9ESVZfMgkJMHgwMQogCi0vKiBDb250cm9sIHdoaWNoIG1vdGlvbiBkZXRlY3RvciBpbnRlcnJ1cHRzIGFyZSBvbi4KLSAqIEZvciBub3cgb25seSBPUiBjb21iaW5hdGlvbnMgYXJlIHN1cHBvcnRlZC54CisvKgorICogQ29udHJvbCB3aGljaCBtb3Rpb24gZGV0ZWN0b3IgaW50ZXJydXB0cyBhcmUgb24uCisgKiBGb3Igbm93IG9ubHkgT1IgY29tYmluYXRpb25zIGFyZSBzdXBwb3J0ZWQuCiAgKi8KICNkZWZpbmUgU0NBMzAwMF9NRF9DVFJMX1BST1RfTUFTSwkJMHhDMAogI2RlZmluZSBTQ0EzMDAwX01EX0NUUkxfT1JfWQkJCTB4MDEKQEAgLTEyMSw3ICsxMjYsOCBAQAogI2RlZmluZSBTQ0EzMDAwX01EX0NUUkxfQU5EX1gJCQkweDEwCiAjZGVmaW5lIFNBQzMwMDBfTURfQ1RSTF9BTkRfWgkJCTB4MjAKIAotLyogU29tZSBjb250cm9sIHJlZ2lzdGVycyBvZiBjb21wbGV4IGFjY2VzcyBtZXRob2RzIHJlcXVpcmluZyB0aGlzIHJlZ2lzdGVyIHRvCisvKgorICogU29tZSBjb250cm9sIHJlZ2lzdGVycyBvZiBjb21wbGV4IGFjY2VzcyBtZXRob2RzIHJlcXVpcmluZyB0aGlzIHJlZ2lzdGVyIHRvCiAgKiBiZSB1c2VkIHRvIHJlbW92ZSBhIGxvY2suCiAgKi8KICNkZWZpbmUgU0NBMzAwMF9SRUdfQUREUl9VTkxPQ0sJCQkweDFlCkBAIC0xMzksNyArMTQ1LDggQEAKIC8qIFZhbHVlcyBvZiBtdWx0aXBsZXhlZCByZWdpc3RlcnMgKHdyaXRlIHRvIGN0cmxfZGF0YSBhZnRlciBzZWxlY3QpICovCiAjZGVmaW5lIFNDQTMwMDBfUkVHX0FERFJfQ1RSTF9EQVRBCQkweDIyCiAKLS8qIE1lYXN1cmVtZW50IG1vZGVzIGF2YWlsYWJsZSBvbiBzb21lIHNjYTMwMDAgc2VyaWVzIGNoaXBzLiBDb2RlIGFzc3VtZXMgb3RoZXJzCisvKgorICogTWVhc3VyZW1lbnQgbW9kZXMgYXZhaWxhYmxlIG9uIHNvbWUgc2NhMzAwMCBzZXJpZXMgY2hpcHMuIENvZGUgYXNzdW1lcyBvdGhlcnMKICAqIG1heSBiZWNvbWUgYXZhaWxhYmxlIGluIHRoZSBmdXR1cmUuCiAgKgogICogQnlwYXNzIC0gQnlwYXNzIHRoZSBsb3ctcGFzcyBmaWx0ZXIgaW4gdGhlIHNpZ25hbCBjaGFubmVsIHNvIGFzIHRvIGluY3JlYXNlCkBAIC0xNjAsNyArMTY3LDYgQEAKICAqIHN0cnVjdCBzY2EzMDAwX3N0YXRlIC0gZGV2aWNlIGluc3RhbmNlIHN0YXRlIGluZm9ybWF0aW9uCiAgKiBAdXM6CQkJdGhlIGFzc29jaWF0ZWQgc3BpIGRldmljZQogICogQGluZm86CQkJY2hpcCB2YXJpYW50IGluZm9ybWF0aW9uCi0gKiBAaW5kaW9fZGV2OgkJCWRldmljZSBpbmZvcm1hdGlvbiB1c2VkIGJ5IHRoZSBJSU8gY29yZQogICogQGludGVycnVwdF9oYW5kbGVyX3dzOglldmVudCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgYWxsIGV2ZW50cwogICogQGxhc3RfdGltZXN0YW1wOgkJdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBldmVudAogICogQG1vX2RldF91c2VfY291bnQ6CQlyZWZlcmVuY2UgY291bnRlciBmb3IgdGhlIG1vdGlvbiBkZXRlY3Rpb24gdW5pdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9jb3JlLmMKaW5kZXggN2Y2Y2NkZi4uZWQzMGUzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jCkBAIC0zMiw3ICszMiw4IEBACiAJZTA1LAogfTsKIAotLyogTm90ZSB3aGVyZSBvcHRpb24gbW9kZXMgYXJlIG5vdCBkZWZpbmVkLCB0aGUgY2hpcCBzaW1wbHkgZG9lcyBub3QKKy8qCisgKiBOb3RlIHdoZXJlIG9wdGlvbiBtb2RlcyBhcmUgbm90IGRlZmluZWQsIHRoZSBjaGlwIHNpbXBseSBkb2VzIG5vdAogICogc3VwcG9ydCBhbnkuCiAgKiBPdGhlciBjaGlwcyBpbiB0aGUgc2NhMzAwMCBzZXJpZXMgdXNlIGkyYyBhbmQgYXJlIG5vdCBpbmNsdWRlZCBoZXJlLgogICoKQEAgLTE5MSw3ICsxOTIsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIENydWNpYWwgdGhhdCBsb2NrIGlzIGNhbGxlZCBiZWZvcmUgY2FsbGluZyB0aGlzICovCiAvKioKICAqIHNjYTMwMDBfcmVhZF9jdHJsX3JlZygpIHJlYWQgZnJvbSBsb2NrIHByb3RlY3RlZCBjb250cm9sIHJlZ2lzdGVyLgogICoKQEAgLTI1MCw5ICsyNTAsOCBAQAogfQogI2VuZGlmIC8qIFNDQTMwMDBfREVCVUcgKi8KIAotCiAvKioKLSAqIHNjYTMwMDBfc2hvd19yZWcoKSAtIHN5c2ZzIGludGVyZmFjZSB0byByZWFkIHRoZSBjaGlwIHJldmlzaW9uIG51bWJlcgorICogc2NhMzAwMF9zaG93X3JldigpIC0gc3lzZnMgaW50ZXJmYWNlIHRvIHJlYWQgdGhlIGNoaXAgcmV2aXNpb24gbnVtYmVyCiAgKiovCiBzdGF0aWMgc3NpemVfdCBzY2EzMDAwX3Nob3dfcmV2KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKQEAgLTMxMiw3ICszMTEsNyBAQAogfQogCiAvKioKLSAqIHNjYTMwMDBfc2hvd19tZWFzdXJtZW5ldF9tb2RlKCkgc3lzZnMgcmVhZCBvZiBjdXJyZW50IG1vZGUKKyAqIHNjYTMwMDBfc2hvd19tZWFzdXJlbWVudF9tb2RlKCkgc3lzZnMgcmVhZCBvZiBjdXJyZW50IG1vZGUKICAqKi8KIHN0YXRpYyBzc2l6ZV90CiBzY2EzMDAwX3Nob3dfbWVhc3VyZW1lbnRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC00MDMsNyArNDAyLDggQEAKIH0KIAogCi0vKiBOb3QgZXZlbiB2YWd1ZWx5IHN0YW5kYXJkIGF0dHJpYnV0ZXMgc28gZGVmaW5lZCBoZXJlIHJhdGhlciB0aGFuCisvKgorICogTm90IGV2ZW4gdmFndWVseSBzdGFuZGFyZCBhdHRyaWJ1dGVzIHNvIGRlZmluZWQgaGVyZSByYXRoZXIgdGhhbgogICogaW4gdGhlIHJlbGV2YW50IElJTyBjb3JlIGhlYWRlcnMKICAqLwogc3RhdGljIElJT19ERVZJQ0VfQVRUUihtZWFzdXJlbWVudF9tb2RlX2F2YWlsYWJsZSwgU19JUlVHTywKQEAgLTQ1MCw2ICs0NTAsMTggQEAKIAlTQ0EzMDAwX0NIQU4oMiwgSUlPX01PRF9aKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzY2EzMDAwX2NoYW5uZWxzX3dpdGhfdGVtcFtdID0geworCVNDQTMwMDBfQ0hBTigwLCBJSU9fTU9EX1gpLAorCVNDQTMwMDBfQ0hBTigxLCBJSU9fTU9EX1kpLAorCVNDQTMwMDBfQ0hBTigyLCBJSU9fTU9EX1opLAorCXsKKwkJLnR5cGUgPSBJSU9fVEVNUCwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCisJCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSkgfAorCQkJQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSwKKwl9LAorfTsKKwogc3RhdGljIHU4IHNjYTMwMDBfYWRkcmVzc2VzWzNdWzNdID0gewogCVswXSA9IHtTQ0EzMDAwX1JFR19BRERSX1hfTVNCLCBTQ0EzMDAwX1JFR19DVFJMX1NFTF9NRF9YX1RILAogCSAgICAgICBTQ0EzMDAwX01EX0NUUkxfT1JfWH0sCkBAIC00NzIsMTkgKzQ4NCwzMCBAQAogCXN3aXRjaCAobWFzaykgewogCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6CiAJCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKLQkJaWYgKHN0LT5tb19kZXRfdXNlX2NvdW50KSB7Ci0JCQltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKLQkJCXJldHVybiAtRUJVU1k7CisJCWlmIChjaGFuLT50eXBlID09IElJT19BQ0NFTCkgeworCQkJaWYgKHN0LT5tb19kZXRfdXNlX2NvdW50KSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJCWFkZHJlc3MgPSBzY2EzMDAwX2FkZHJlc3Nlc1tjaGFuLT5hZGRyZXNzXVswXTsKKwkJCXJldCA9IHNjYTMwMDBfcmVhZF9kYXRhX3Nob3J0KHN0LCBhZGRyZXNzLCAyKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCSp2YWwgPSAoYmUxNl90b19jcHVwKChfX2JlMTYgKilzdC0+cngpID4+IDMpICYgMHgxRkZGOworCQkJKnZhbCA9ICgoKnZhbCkgPDwgKHNpemVvZigqdmFsKSo4IC0gMTMpKSA+PgorCQkJCShzaXplb2YoKnZhbCkqOCAtIDEzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGdldCB0aGUgdGVtcGVyYXR1cmUgd2hlbiBhdmFpbGFibGUgKi8KKwkJCXJldCA9IHNjYTMwMDBfcmVhZF9kYXRhX3Nob3J0KHN0LAorCQkJCVNDQTMwMDBfUkVHX0FERFJfVEVNUF9NU0IsIDIpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJKnZhbCA9ICgoc3QtPnJ4WzBdICYgMHgzRikgPDwgMykgfCAoKHN0LT5yeFsxXSAmIDB4RTApID4+IDUpOwogCQl9Ci0JCWFkZHJlc3MgPSBzY2EzMDAwX2FkZHJlc3Nlc1tjaGFuLT5hZGRyZXNzXVswXTsKLQkJcmV0ID0gc2NhMzAwMF9yZWFkX2RhdGFfc2hvcnQoc3QsIGFkZHJlc3MsIDIpOwotCQlpZiAocmV0IDwgMCkgewotCQkJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCSp2YWwgPSAoYmUxNl90b19jcHVwKChfX2JlMTYgKilzdC0+cngpID4+IDMpICYgMHgxRkZGOwotCQkqdmFsID0gKCgqdmFsKSA8PCAoc2l6ZW9mKCp2YWwpKjggLSAxMykpID4+Ci0JCQkoc2l6ZW9mKCp2YWwpKjggLSAxMyk7CiAJCW11dGV4X3VubG9jaygmc3QtPmxvY2spOwogCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgpAQCAtNDk0LDYgKzUxNywxMCBAQAogCQllbHNlIC8qIHRlbXBlcmF0dXJlICovCiAJCQkqdmFsMiA9IDU1NTU1NjsKIAkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJY2FzZSBJSU9fQ0hBTl9JTkZPX09GRlNFVDoKKwkJKnZhbCA9IC0yMTQ7CisJCSp2YWwyID0gNjAwMDAwOworCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC01NDcsNyArNTc0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogLyoqCi0gKiBfX3NjYTMwMDBfZ2V0X2Jhc2VfZnJlcXVlbmN5KCkgb2J0YWluIG1vZGUgc3BlY2lmaWMgYmFzZSBmcmVxdWVuY3kKKyAqIF9fc2NhMzAwMF9nZXRfYmFzZV9mcmVxKCkgb2J0YWluIG1vZGUgc3BlY2lmaWMgYmFzZSBmcmVxdWVuY3kKICAqCiAgKiBsb2NrIG11c3QgYmUgaGVsZAogICoqLwpAQCAtNjYzLDcgKzY5MCw4IEBACiAJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKIH0KIAotLyogU2hvdWxkIG9ubHkgcmVhbGx5IGJlIHJlZ2lzdGVyZWQgaWYgcmluZyBidWZmZXIgc3VwcG9ydCBpcyBjb21waWxlZCBpbi4KKy8qCisgKiBTaG91bGQgb25seSByZWFsbHkgYmUgcmVnaXN0ZXJlZCBpZiByaW5nIGJ1ZmZlciBzdXBwb3J0IGlzIGNvbXBpbGVkIGluLgogICogRG9lcyBubyBoYXJtIGhvd2V2ZXIgYW5kIGRvaW5nIGl0IHJpZ2h0IHdvdWxkIGFkZCBhIGZhaXIgYml0IG9mIGNvbXBsZXhpdHkKICAqLwogc3RhdGljIElJT19ERVZfQVRUUl9TQU1QX0ZSRVFfQVZBSUwoc2NhMzAwMF9yZWFkX2F2X2ZyZXEpOwpAQCAtNjcyLDM3ICs3MDAsNiBAQAogCQkJICAgICAgc2NhMzAwMF9yZWFkX2ZyZXF1ZW5jeSwKIAkJCSAgICAgIHNjYTMwMDBfc2V0X2ZyZXF1ZW5jeSk7CiAKLQotLyoqCi0gKiBzY2EzMDAwX3JlYWRfdGVtcCgpIHN5c2ZzIGludGVyZmFjZSB0byBnZXQgdGhlIHRlbXBlcmF0dXJlIHdoZW4gYXZhaWxhYmxlCi0gKgotKiBUaGUgYWxpZ25tZW50IG9mIGRhdGEgaW4gaGVyZSBpcyBkb3ducmlnaHQgb2RkLiBTZWUgZGF0YSBzaGVldC4KLSogQ29udmVydGluZyB0aGlzIGludG8gYSBtZWFuaW5nZnVsIHZhbHVlIGlzIGxlZnQgdG8gaW5saW5lIGZ1bmN0aW9ucyBpbgotKiB1c2Vyc3BhY2UgcGFydCBvZiBoZWFkZXIuCi0qKi8KLXN0YXRpYyBzc2l6ZV90IHNjYTMwMDBfcmVhZF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKLQlzdHJ1Y3Qgc2NhMzAwMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCWludCByZXQ7Ci0JaW50IHZhbDsKLQlyZXQgPSBzY2EzMDAwX3JlYWRfZGF0YV9zaG9ydChzdCwgU0NBMzAwMF9SRUdfQUREUl9URU1QX01TQiwgMik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3JfcmV0OwotCXZhbCA9ICgoc3QtPnJ4WzBdICYgMHgzRikgPDwgMykgfCAoKHN0LT5yeFsxXSAmIDB4RTApID4+IDUpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7Ci0KLWVycm9yX3JldDoKLQlyZXR1cm4gcmV0OwotfQotc3RhdGljIElJT19ERVZfQVRUUl9URU1QX1JBVyhzY2EzMDAwX3JlYWRfdGVtcCk7Ci0KLXN0YXRpYyBJSU9fQ09OU1RfQVRUUl9URU1QX1NDQUxFKCIwLjU1NTU1NiIpOwotc3RhdGljIElJT19DT05TVF9BVFRSX1RFTVBfT0ZGU0VUKCItMjE0LjYiKTsKLQogLyoqCiAgKiBzY2EzMDAwX3JlYWRfdGhyZXNoKCkgLSBxdWVyeSBvZiBhIHRocmVzaG9sZAogICoqLwpAQCAtNzgyLDMzICs3NzksMTYgQEAKIAlOVUxMLAogfTsKIAotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnNjYTMwMDBfYXR0cmlidXRlc193aXRoX3RlbXBbXSA9IHsKLQkmaWlvX2Rldl9hdHRyX3JldmlzaW9uLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9tZWFzdXJlbWVudF9tb2RlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfbWVhc3VyZW1lbnRfbW9kZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5LmRldl9hdHRyLmF0dHIsCi0JLyogT25seSBwcmVzZW50IGlmIHRlbXAgc2Vuc29yIGlzICovCi0JJmlpb19kZXZfYXR0cl9pbl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl9pbl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl9pbl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCi0JTlVMTCwKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNjYTMwMDBfYXR0cmlidXRlX2dyb3VwID0gewogCS5hdHRycyA9IHNjYTMwMDBfYXR0cmlidXRlcywKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNjYTMwMDBfYXR0cmlidXRlX2dyb3VwX3dpdGhfdGVtcCA9IHsKLQkuYXR0cnMgPSBzY2EzMDAwX2F0dHJpYnV0ZXNfd2l0aF90ZW1wLAotfTsKLQotLyogUklORyBSRUxBVEVEIGludGVycnVwdCBoYW5kbGVyICovCi0vKiBkZXBlbmRpbmcgb24gZXZlbnQsIHB1c2ggdG8gdGhlIHJpbmcgYnVmZmVyIGV2ZW50IGNocmRldiBvciB0aGUgZXZlbnQgb25lICovCi0KIC8qKgogICogc2NhMzAwMF9ldmVudF9oYW5kbGVyKCkgLSBoYW5kbGluZyByaW5nIGFuZCBub24gcmluZyBldmVudHMKICAqCisgKiBSaW5nIHJlbGF0ZWQgaW50ZXJydXB0IGhhbmRsZXIuIERlcGVuZGluZyBvbiBldmVudCwgcHVzaCB0bworICogdGhlIHJpbmcgYnVmZmVyIGV2ZW50IGNocmRldiBvciB0aGUgZXZlbnQgb25lLgorICoKICAqIFRoaXMgZnVuY3Rpb24gaXMgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgZGV2aWNlcyBjYW4gc2lnbmlmeSByaW5nCiAgKiBhbmQgbm9uIHJpbmcgZXZlbnRzIHZpYSB0aGUgc2FtZSBpbnRlcnJ1cHQgbGluZSBhbmQgdGhleSBjYW4gb25seQogICogYmUgZGlzdGluZ3Vpc2hlZCB2aWEgYSByZWFkIG9mIHRoZSByZWxldmFudCBzdGF0dXMgcmVnaXN0ZXIuCkBAIC04MjAsNyArODAwLDggQEAKIAlpbnQgcmV0LCB2YWw7CiAJczY0IGxhc3RfdGltZXN0YW1wID0gaWlvX2dldF90aW1lX25zKCk7CiAKLQkvKiBDb3VsZCBsZWFkIGlmIGJhZGx5IHRpbWVkIHRvIGFuIGV4dHJhIHJlYWQgb2Ygc3RhdHVzIHJlZywKKwkvKgorCSAqIENvdWxkIGxlYWQgaWYgYmFkbHkgdGltZWQgdG8gYW4gZXh0cmEgcmVhZCBvZiBzdGF0dXMgcmVnLAogCSAqIGJ1dCBlbnN1cmVzIG5vIGludGVycnVwdCBpcyBtaXNzZWQuCiAJICovCiAJbXV0ZXhfbG9jaygmc3QtPmxvY2spOwpAQCAtOTM1LDcgKzkxNiw2IEBACiAgKiB0aGUgZGV2aWNlIGZhbGxzIG1vcmUgdGhhbiAyNWNtLiAgVGhpcyBoYXMgbm90IGJlZW4gdGVzdGVkIGR1ZQogICogdG8gZnJhZ2lsZSB3aXJpbmcuCiAgKiovCi0KIHN0YXRpYyBzc2l6ZV90IHNjYTMwMDBfc2V0X2ZyZWVfZmFsbF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJICBjb25zdCBjaGFyICpidWYsCkBAIC05NTcsNyArOTM3LDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3JldDsKIAotCS8qaWYgb2ZmIGFuZCBzaG91bGQgYmUgb24qLworCS8qIGlmIG9mZiBhbmQgc2hvdWxkIGJlIG9uICovCiAJaWYgKHZhbCAmJiAhKHN0LT5yeFswXSAmIHByb3RlY3RfbWFzaykpCiAJCXJldCA9IHNjYTMwMDBfd3JpdGVfcmVnKHN0LCBTQ0EzMDAwX1JFR19BRERSX01PREUsCiAJCQkJCShzdC0+cnhbMF0gfCBTQ0EzMDAwX0ZSRUVfRkFMTF9ERVRFQ1QpKTsKQEAgLTk3Miw3ICs5NTIsNyBAQAogfQogCiAvKioKLSAqIHNjYTMwMDBfc2V0X21vX2RldCgpIHNpbXBsZSBvbiBvZmYgY29udHJvbCBmb3IgbW90aW9uIGRldGVjdG9yCisgKiBzY2EzMDAwX3dyaXRlX2V2ZW50X2NvbmZpZygpIHNpbXBsZSBvbiBvZmYgY29udHJvbCBmb3IgbW90aW9uIGRldGVjdG9yCiAgKgogICogVGhpcyBpcyBhIHBlciBheGlzIGNvbnRyb2wsIGJ1dCBlbmFibGluZyBhbnkgd2lsbCByZXN1bHQgaW4gdGhlCiAgKiBtb3Rpb24gZGV0ZWN0b3IgdW5pdCBiZWluZyBlbmFibGVkLgpAQCAtOTkyLDEzICs5NzIsMTUgQEAKIAlpbnQgbnVtID0gY2hhbi0+Y2hhbm5lbDI7CiAKIAltdXRleF9sb2NrKCZzdC0+bG9jayk7Ci0JLyogRmlyc3QgcmVhZCB0aGUgbW90aW9uIGRldGVjdG9yIGNvbmZpZyB0byBmaW5kIG91dCBpZgotCSAqIHRoaXMgYXhpcyBpcyBvbiovCisJLyoKKwkgKiBGaXJzdCByZWFkIHRoZSBtb3Rpb24gZGV0ZWN0b3IgY29uZmlnIHRvIGZpbmQgb3V0IGlmCisJICogdGhpcyBheGlzIGlzIG9uCisJICovCiAJcmV0ID0gc2NhMzAwMF9yZWFkX2N0cmxfcmVnKHN0LCBTQ0EzMDAwX1JFR19DVFJMX1NFTF9NRF9DVFJMKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBleGl0X3BvaW50OwogCWN0cmx2YWwgPSByZXQ7Ci0JLyogT2ZmIGFuZCBzaG91bGQgYmUgb24gKi8KKwkvKiBpZiBvZmYgYW5kIHNob3VsZCBiZSBvbiAqLwogCWlmIChzdGF0ZSAmJiAhKGN0cmx2YWwgJiBzY2EzMDAwX2FkZHJlc3Nlc1tudW1dWzJdKSkgewogCQlyZXQgPSBzY2EzMDAwX3dyaXRlX2N0cmxfcmVnKHN0LAogCQkJCQkgICAgIFNDQTMwMDBfUkVHX0NUUkxfU0VMX01EX0NUUkwsCkBAIC0xMDIxLDcgKzEwMDMsNyBAQAogCXJldCA9IHNjYTMwMDBfcmVhZF9kYXRhX3Nob3J0KHN0LCBTQ0EzMDAwX1JFR19BRERSX01PREUsIDEpOwogCWlmIChyZXQpCiAJCWdvdG8gZXhpdF9wb2ludDsKLQkvKmlmIG9mZiBhbmQgc2hvdWxkIGJlIG9uKi8KKwkvKiBpZiBvZmYgYW5kIHNob3VsZCBiZSBvbiAqLwogCWlmICgoc3QtPm1vX2RldF91c2VfY291bnQpCiAJICAgICYmICgoc3QtPnJ4WzBdICYgcHJvdGVjdF9tYXNrKSAhPSBTQ0EzMDAwX01FQVNfTU9ERV9NT1RfREVUKSkKIAkJcmV0ID0gc2NhMzAwMF93cml0ZV9yZWcoc3QsIFNDQTMwMDBfUkVHX0FERFJfTU9ERSwKQEAgLTEwNjcsNyArMTA0OSw3IEBACiAgKiBEZXZpY2VzIHVzZSBmbGFzaCBtZW1vcnkgdG8gc3RvcmUgbWFueSBvZiB0aGUgcmVnaXN0ZXIgdmFsdWVzCiAgKiBhbmQgaGVuY2UgY2FuIGNvbWUgdXAgaW4gc29tZXdoYXQgdW5wcmVkaWN0YWJsZSBzdGF0ZXMuCiAgKiBIZW5jZSByZXNldCBldmVyeXRoaW5nIG9uIGRyaXZlciBsb2FkLgotICAqKi8KKyAqKi8KIHN0YXRpYyBpbnQgc2NhMzAwMF9jbGVhbl9zZXR1cChzdHJ1Y3Qgc2NhMzAwMF9zdGF0ZSAqc3QpCiB7CiAJaW50IHJldDsKQEAgLTExMDcsOSArMTA4OSwxMSBAQAogCQkJCXwgU0NBMzAwMF9JTlRfTUFTS19BQ1RJVkVfTE9XKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3JldDsKLQkvKiBTZWxlY3Qgbm9ybWFsIG1lYXN1cmVtZW50IG1vZGUsIGZyZWUgZmFsbCBvZmYsIHJpbmcgb2ZmICovCi0JLyogUmluZyBpbiAxMiBiaXQgbW9kZSAtIGl0IGlzIGZpbmUgdG8gb3ZlcndyaXRlIHJlc2VydmVkIGJpdHMgMyw1Ci0JICogYXMgdGhhdCBvY2N1cnMgaW4gb25lIG9mIHRoZSBleGFtcGxlIG9uIHRoZSBkYXRhc2hlZXQgKi8KKwkvKgorCSAqIFNlbGVjdCBub3JtYWwgbWVhc3VyZW1lbnQgbW9kZSwgZnJlZSBmYWxsIG9mZiwgcmluZyBvZmYKKwkgKiBSaW5nIGluIDEyIGJpdCBtb2RlIC0gaXQgaXMgZmluZSB0byBvdmVyd3JpdGUgcmVzZXJ2ZWQgYml0cyAzLDUKKwkgKiBhcyB0aGF0IG9jY3VycyBpbiBvbmUgb2YgdGhlIGV4YW1wbGUgb24gdGhlIGRhdGFzaGVldAorCSAqLwogCXJldCA9IHNjYTMwMDBfcmVhZF9kYXRhX3Nob3J0KHN0LCBTQ0EzMDAwX1JFR19BRERSX01PREUsIDEpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfcmV0OwpAQCAtMTEzMywxNiArMTExNyw2IEBACiAJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gc2NhMzAwMF9pbmZvX3dpdGhfdGVtcCA9IHsKLQkuYXR0cnMgPSAmc2NhMzAwMF9hdHRyaWJ1dGVfZ3JvdXBfd2l0aF90ZW1wLAotCS5yZWFkX3JhdyA9ICZzY2EzMDAwX3JlYWRfcmF3LAotCS5yZWFkX2V2ZW50X3ZhbHVlID0gJnNjYTMwMDBfcmVhZF90aHJlc2gsCi0JLndyaXRlX2V2ZW50X3ZhbHVlID0gJnNjYTMwMDBfd3JpdGVfdGhyZXNoLAotCS5yZWFkX2V2ZW50X2NvbmZpZyA9ICZzY2EzMDAwX3JlYWRfZXZlbnRfY29uZmlnLAotCS53cml0ZV9ldmVudF9jb25maWcgPSAmc2NhMzAwMF93cml0ZV9ldmVudF9jb25maWcsCi0JLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKLX07Ci0KIHN0YXRpYyBpbnQgc2NhMzAwMF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCWludCByZXQ7CkBAIC0xMTYyLDEwICsxMTM2LDEyIEBACiAKIAlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CiAJaW5kaW9fZGV2LT5uYW1lID0gc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+bmFtZTsKLQlpZiAoc3QtPmluZm8tPnRlbXBfb3V0cHV0KQotCQlpbmRpb19kZXYtPmluZm8gPSAmc2NhMzAwMF9pbmZvX3dpdGhfdGVtcDsKLQllbHNlIHsKLQkJaW5kaW9fZGV2LT5pbmZvID0gJnNjYTMwMDBfaW5mbzsKKwlpbmRpb19kZXYtPmluZm8gPSAmc2NhMzAwMF9pbmZvOworCWlmIChzdC0+aW5mby0+dGVtcF9vdXRwdXQpIHsKKwkJaW5kaW9fZGV2LT5jaGFubmVscyA9IHNjYTMwMDBfY2hhbm5lbHNfd2l0aF90ZW1wOworCQlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9CisJCQlBUlJBWV9TSVpFKHNjYTMwMDBfY2hhbm5lbHNfd2l0aF90ZW1wKTsKKwl9IGVsc2UgewogCQlpbmRpb19kZXYtPmNoYW5uZWxzID0gc2NhMzAwMF9jaGFubmVsczsKIAkJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHNjYTMwMDBfY2hhbm5lbHMpOwogCX0KQEAgLTEyMzYsNyArMTIxMiw3IEBACiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOwogCXN0cnVjdCBzY2EzMDAwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKLQkvKiBNdXN0IGVuc3VyZSBubyBpbnRlcnJ1cHRzIGNhbiBiZSBnZW5lcmF0ZWQgYWZ0ZXIgdGhpcyEqLworCS8qIE11c3QgZW5zdXJlIG5vIGludGVycnVwdHMgY2FuIGJlIGdlbmVyYXRlZCBhZnRlciB0aGlzISAqLwogCXNjYTMwMDBfc3RvcF9hbGxfaW50ZXJydXB0cyhzdCk7CiAJaWYgKHNwaS0+aXJxKQogCQlmcmVlX2lycShzcGktPmlycSwgaW5kaW9fZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfcmluZy5jCmluZGV4IGVhMGFmNmQuLjE5ODcxMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX3JpbmcuYwpAQCAtMzA5LDcgKzMwOSw3IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9yZXQ7CiAJaWYgKHN0YXRlKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInN1cHBvc2VkbHkgZW5hYmxpbmcgcmluZyBidWZmZXJcbiIpOworCQlkZXZfaW5mbygmaW5kaW9fZGV2LT5kZXYsICJzdXBwb3NlZGx5IGVuYWJsaW5nIHJpbmcgYnVmZmVyXG4iKTsKIAkJcmV0ID0gc2NhMzAwMF93cml0ZV9yZWcoc3QsCiAJCQkJCVNDQTMwMDBfUkVHX0FERFJfTU9ERSwKIAkJCQkJKHN0LT5yeFswXSB8IFNDQTMwMDBfUklOR19CVUZfRU5BQkxFKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc5OXguaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzk5eC5oCmluZGV4IGE1OTFhYTYuLmZjOGM4NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzk5eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzk5eC5oCkBAIC05NSw3ICs5NSw3IEBACiAJc3RydWN0IGkyY19jbGllbnQJCSpjbGllbnQ7CiAJY29uc3Qgc3RydWN0IGFkNzk5eF9jaGlwX2luZm8JKmNoaXBfaW5mbzsKIAlzdHJ1Y3QgcmVndWxhdG9yCQkqcmVnOwotCXUxNgkJCQlpbnRfdnJlZl9tdjsKKwlzdHJ1Y3QgcmVndWxhdG9yCQkqdnJlZjsKIAl1bnNpZ25lZAkJCWlkOwogCXUxNgkJCQljb25maWc7CiAKQEAgLTEwMywxNCArMTAzLDYgQEAKIAl1bnNpZ25lZCBpbnQJCQl0cmFuc2Zlcl9zaXplOwogfTsKIAotLyoKLSAqIFRPRE86IHN0cnVjdCBhZDc5OXhfcGxhdGZvcm1fZGF0YSBuZWVkcyB0byBnbyBpbnRvIGluY2x1ZGUvbGludXgvaWlvCi0gKi8KLQotc3RydWN0IGFkNzk5eF9wbGF0Zm9ybV9kYXRhIHsKLQl1MTYJCQkJdnJlZl9tdjsKLX07Ci0KICNpZmRlZiBDT05GSUdfQUQ3OTlYX1JJTkdfQlVGRkVSCiBpbnQgYWQ3OTl4X3JlZ2lzdGVyX3JpbmdfZnVuY3NfYW5kX2luaXQoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiB2b2lkIGFkNzk5eF9yaW5nX2NsZWFudXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc5OXhfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3OTl4X2NvcmUuYwppbmRleCA1NzA4ZmZjLi45NzllYzc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc5OXhfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzk5eF9jb3JlLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogaWlvL2FkYy9hZDc5OXguYwotICogQ29weXJpZ2h0IChDKSAyMDEwLTEwMTEgTWljaGFlbCBIZW5uZXJpY2gsIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIE1pY2hhZWwgSGVubmVyaWNoLCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogYmFzZWQgb24gaWlvL2FkYy9tYXgxMzYzCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBKb25hdGhhbiBDYW1lcm9uCkBAIC0xNzksNyArMTc5LDEwIEBACiAJCQlSRVNfTUFTSyhjaGFuLT5zY2FuX3R5cGUucmVhbGJpdHMpOwogCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgotCQkqdmFsID0gc3QtPmludF92cmVmX212OworCQlyZXQgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Uoc3QtPnZyZWYpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCSp2YWwgPSByZXQgLyAxMDAwOwogCQkqdmFsMiA9IGNoYW4tPnNjYW5fdHlwZS5yZWFsYml0czsKIAkJcmV0dXJuIElJT19WQUxfRlJBQ1RJT05BTF9MT0cyOwogCX0KQEAgLTUzMyw3ICs1MzYsNiBAQAogCQkJCSAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBhZDc5OXhfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBhZDc5OXhfc3RhdGUgKnN0OwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAKQEAgLTU1MSwxNyArNTUzLDIxIEBACiAKIAkvKiBUT0RPOiBBZGQgcGRhdGEgb3B0aW9ucyBmb3IgZmlsdGVyaW5nIGFuZCBiaXQgZGVsYXkgKi8KIAotCWlmICghcGRhdGEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3QtPmludF92cmVmX212ID0gcGRhdGEtPnZyZWZfbXY7Ci0KIAlzdC0+cmVnID0gZGV2bV9yZWd1bGF0b3JfZ2V0KCZjbGllbnQtPmRldiwgInZjYyIpOwotCWlmICghSVNfRVJSKHN0LT5yZWcpKSB7Ci0JCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoc3QtPnJlZyk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCWlmIChJU19FUlIoc3QtPnJlZykpCisJCXJldHVybiBQVFJfRVJSKHN0LT5yZWcpOworCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoc3QtPnJlZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlzdC0+dnJlZiA9IGRldm1fcmVndWxhdG9yX2dldCgmY2xpZW50LT5kZXYsICJ2cmVmIik7CisJaWYgKElTX0VSUihzdC0+dnJlZikpIHsKKwkJcmV0ID0gUFRSX0VSUihzdC0+dnJlZik7CisJCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7CiAJfQorCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoc3QtPnZyZWYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7CisKIAlzdC0+Y2xpZW50ID0gY2xpZW50OwogCiAJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OwpAQCAtNTc3LDI4ICs1ODMsMjggQEAKIAkJZ290byBlcnJvcl9kaXNhYmxlX3JlZzsKIAogCWlmIChjbGllbnQtPmlycSA+IDApIHsKLQkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoY2xpZW50LT5pcnEsCi0JCQkJCSAgIE5VTEwsCi0JCQkJCSAgIGFkNzk5eF9ldmVudF9oYW5kbGVyLAotCQkJCQkgICBJUlFGX1RSSUdHRVJfRkFMTElORyB8Ci0JCQkJCSAgIElSUUZfT05FU0hPVCwKLQkJCQkJICAgY2xpZW50LT5uYW1lLAotCQkJCQkgICBpbmRpb19kZXYpOworCQlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKCZjbGllbnQtPmRldiwKKwkJCQkJCWNsaWVudC0+aXJxLAorCQkJCQkJTlVMTCwKKwkJCQkJCWFkNzk5eF9ldmVudF9oYW5kbGVyLAorCQkJCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcgfAorCQkJCQkJSVJRRl9PTkVTSE9ULAorCQkJCQkJY2xpZW50LT5uYW1lLAorCQkJCQkJaW5kaW9fZGV2KTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3JfY2xlYW51cF9yaW5nOwogCX0KIAlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CiAJaWYgKHJldCkKLQkJZ290byBlcnJvcl9mcmVlX2lycTsKKwkJZ290byBlcnJvcl9jbGVhbnVwX3Jpbmc7CiAKIAlyZXR1cm4gMDsKIAotZXJyb3JfZnJlZV9pcnE6Ci0JaWYgKGNsaWVudC0+aXJxID4gMCkKLQkJZnJlZV9pcnEoY2xpZW50LT5pcnEsIGluZGlvX2Rldik7CiBlcnJvcl9jbGVhbnVwX3Jpbmc6CiAJYWQ3OTl4X3JpbmdfY2xlYW51cChpbmRpb19kZXYpOwogZXJyb3JfZGlzYWJsZV9yZWc6CisJaWYgKCFJU19FUlIoc3QtPnZyZWYpKQorCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+dnJlZik7CiAJaWYgKCFJU19FUlIoc3QtPnJlZykpCiAJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOwogCkBAIC02MTEsMTAgKzYxNywxMCBAQAogCXN0cnVjdCBhZDc5OXhfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAogCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwotCWlmIChjbGllbnQtPmlycSA+IDApCi0JCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBpbmRpb19kZXYpOwogCiAJYWQ3OTl4X3JpbmdfY2xlYW51cChpbmRpb19kZXYpOworCWlmICghSVNfRVJSKHN0LT52cmVmKSkKKwkJcmVndWxhdG9yX2Rpc2FibGUoc3QtPnZyZWYpOwogCWlmICghSVNfRVJSKHN0LT5yZWcpKQogCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKIAlrZnJlZShzdC0+cnhfYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL214cy1scmFkYy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvbXhzLWxyYWRjLmMKaW5kZXggNTE0ODQ0ZS4uMTFmYjk1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvbXhzLWxyYWRjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvbXhzLWxyYWRjLmMKQEAgLTg0Nyw3ICs4NDcsOCBAQAogCW14c19scmFkY19yZWdfY2xlYXIobHJhZGMsIDB4ZmYsIExSQURDX0NUUkwwKTsKIAogCS8qIENsZWFuIHRoZSBzbG90J3MgcHJldmlvdXMgY29udGVudCwgdGhlbiBzZXQgbmV3IG9uZS4gKi8KLQlteHNfbHJhZGNfcmVnX2NsZWFyKGxyYWRjLCBMUkFEQ19DVFJMNF9MUkFEQ1NFTEVDVF9NQVNLKDApLCBMUkFEQ19DVFJMNCk7CisJbXhzX2xyYWRjX3JlZ19jbGVhcihscmFkYywgTFJBRENfQ1RSTDRfTFJBRENTRUxFQ1RfTUFTSygwKSwKKwkJCUxSQURDX0NUUkw0KTsKIAlteHNfbHJhZGNfcmVnX3NldChscmFkYywgY2hhbiwgTFJBRENfQ1RSTDQpOwogCiAJbXhzX2xyYWRjX3JlZ193cnQobHJhZGMsIDAsIExSQURDX0NIKDApKTsKQEAgLTg5OCwxMCArODk5LDYgQEAKIHsKIAlzdHJ1Y3QgbXhzX2xyYWRjICpscmFkYyA9IGlpb19wcml2KGlpb19kZXYpOwogCi0JLyogQ2hlY2sgZm9yIGludmFsaWQgY2hhbm5lbCAqLwotCWlmIChjaGFuLT5jaGFubmVsID4gTFJBRENfTUFYX1RPVEFMX0NIQU5TKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXN3aXRjaCAobSkgewogCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6CiAJCWlmIChjaGFuLT50eXBlID09IElJT19URU1QKQpAQCAtMTE3Myw3ICsxMTcwLDggQEAKIAllbHNlIGlmIChyZWcgJiBMUkFEQ19DVFJMMV9MUkFEQ19JUlEoMCkpCiAJCWNvbXBsZXRlKCZscmFkYy0+Y29tcGxldGlvbik7CiAKLQlteHNfbHJhZGNfcmVnX2NsZWFyKGxyYWRjLCByZWcgJiBteHNfbHJhZGNfaXJxX21hc2sobHJhZGMpLCBMUkFEQ19DVFJMMSk7CisJbXhzX2xyYWRjX3JlZ19jbGVhcihscmFkYywgcmVnICYgbXhzX2xyYWRjX2lycV9tYXNrKGxyYWRjKSwKKwkJCUxSQURDX0NUUkwxKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTEyNjQsNyArMTI2Miw4IEBACiAJdWludDMyX3QgY3RybDFfaXJxID0gMDsKIAljb25zdCB1aW50MzJfdCBjaGFuX3ZhbHVlID0gTFJBRENfQ0hfQUNDVU1VTEFURSB8CiAJCSgoTFJBRENfREVMQVlfVElNRVJfTE9PUCAtIDEpIDw8IExSQURDX0NIX05VTV9TQU1QTEVTX09GRlNFVCk7Ci0JY29uc3QgaW50IGxlbiA9IGJpdG1hcF93ZWlnaHQoaWlvLT5hY3RpdmVfc2Nhbl9tYXNrLCBMUkFEQ19NQVhfVE9UQUxfQ0hBTlMpOworCWNvbnN0IGludCBsZW4gPSBiaXRtYXBfd2VpZ2h0KGlpby0+YWN0aXZlX3NjYW5fbWFzaywKKwkJCUxSQURDX01BWF9UT1RBTF9DSEFOUyk7CiAKIAlpZiAoIWxlbikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNTYzLDcgKzE1NjIsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBvZl9jZmctPmlycV9jb3VudDsgaSsrKSB7CiAJCWxyYWRjLT5pcnFbaV0gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIGkpOwogCQlpZiAobHJhZGMtPmlycVtpXSA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiBscmFkYy0+aXJxW2ldOwogCiAJCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBscmFkYy0+aXJxW2ldLAogCQkJCQlteHNfbHJhZGNfaGFuZGxlX2lycSwgMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LmMKaW5kZXggMTZhODIwMS4uOWYwZWJiMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5jCkBAIC04NTksMTEgKzg1OSwxNCBAQAogCWVsc2UgewogCQlzd2l0Y2ggKGNoaXAtPmRhY19jb25maWcgJiBBRFQ3MzE2X0RBX0VOX01PREVfTUFTSykgewogCQljYXNlIEFEVDczMTZfREFfRU5fTU9ERV9TSU5HTEU6Ci0JCQlyZXR1cm4gc3ByaW50ZihidWYsICIwIC0gYXV0byBhdCBhbnkgTVNCIERBQyB3cml0aW5nXG4iKTsKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwKKwkJCQkiMCAtIGF1dG8gYXQgYW55IE1TQiBEQUMgd3JpdGluZ1xuIik7CiAJCWNhc2UgQURUNzMxNl9EQV9FTl9NT0RFX0FCX0NEOgotCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiMSAtIGF1dG8gYXQgTVNCIERBQyBBQiBhbmQgQ0Qgd3JpdGluZ1xuIik7CisJCQlyZXR1cm4gc3ByaW50ZihidWYsCisJCQkJIjEgLSBhdXRvIGF0IE1TQiBEQUMgQUIgYW5kIENEIHdyaXRpbmdcbiIpOwogCQljYXNlIEFEVDczMTZfREFfRU5fTU9ERV9BQkNEOgotCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiMiAtIGF1dG8gYXQgTVNCIERBQyBBQkNEIHdyaXRpbmdcbiIpOworCQkJcmV0dXJuIHNwcmludGYoYnVmLAorCQkJCSIyIC0gYXV0byBhdCBNU0IgREFDIEFCQ0Qgd3JpdGluZ1xuIik7CiAJCWRlZmF1bHQ6IC8qIEFEVDczMTZfREFfRU5fTU9ERV9MREFDICovCiAJCQlyZXR1cm4gc3ByaW50ZihidWYsICIzIC0gbWFudWFsXG4iKTsKIAkJfQpAQCAtMTEwMiw3ICsxMTA1LDggQEAKIAkJCWxkYWNfY29uZmlnID0gY2hpcC0+bGRhY19jb25maWcgfCBBRFQ3MzE2X0RBQ19JTl9WUkVGOwogCX0KIAotCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0xEQUNfQ09ORklHLCBsZGFjX2NvbmZpZyk7CisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfTERBQ19DT05GSUcsCisJCQlsZGFjX2NvbmZpZyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIC1FSU87CiAKQEAgLTEyMjQsNyArMTIyOCw4IEBACiAJcmV0dXJuIGFkdDczMTZfc2hvd19hZChjaGlwLCBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9FWCwgYnVmKTsKIH0KIAotc3RhdGljIElJT19ERVZJQ0VfQVRUUihleF90ZW1wX0FJTjEsIFNfSVJVR08sIGFkdDczMTZfc2hvd19leF90ZW1wX0FJTjEsIE5VTEwsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihleF90ZW1wX0FJTjEsIFNfSVJVR08sIGFkdDczMTZfc2hvd19leF90ZW1wX0FJTjEsCisJCU5VTEwsIDApOwogc3RhdGljIElJT19ERVZJQ0VfQVRUUihleF90ZW1wLCBTX0lSVUdPLCBhZHQ3MzE2X3Nob3dfZXhfdGVtcF9BSU4xLCBOVUxMLCAwKTsKIAogc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0FJTjIoc3RydWN0IGRldmljZSAqZGV2LApAQCAtMTMxOSw3ICsxMzI0LDggQEAKIAlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfdG9faWlvX2RldihkZXYpOwogCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKIAotCXJldHVybiBhZHQ3MzE2X3N0b3JlX3RlbXBfb2Zmc2V0KGNoaXAsIEFEVDczMTZfSU5fVEVNUF9PRkZTRVQsIGJ1ZiwgbGVuKTsKKwlyZXR1cm4gYWR0NzMxNl9zdG9yZV90ZW1wX29mZnNldChjaGlwLCBBRFQ3MzE2X0lOX1RFTVBfT0ZGU0VULCBidWYsCisJCQlsZW4pOwogfQogCiBzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluX3RlbXBfb2Zmc2V0LCBTX0lSVUdPIHwgU19JV1VTUiwKQEAgLTEzNDQsNyArMTM1MCw4IEBACiAJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKIAlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7CiAKLQlyZXR1cm4gYWR0NzMxNl9zdG9yZV90ZW1wX29mZnNldChjaGlwLCBBRFQ3MzE2X0VYX1RFTVBfT0ZGU0VULCBidWYsIGxlbik7CisJcmV0dXJuIGFkdDczMTZfc3RvcmVfdGVtcF9vZmZzZXQoY2hpcCwgQURUNzMxNl9FWF9URU1QX09GRlNFVCwgYnVmLAorCQkJbGVuKTsKIH0KIAogc3RhdGljIElJT19ERVZJQ0VfQVRUUihleF90ZW1wX29mZnNldCwgU19JUlVHTyB8IFNfSVdVU1IsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL2FkdDczMTYuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5oCmluZGV4IDJkYmZiNDkuLmVjNTBiZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5oCkBAIC0xOCwxMCArMTgsMTAgQEAKIAl2b2lkICpjbGllbnQ7CiAJaW50IGlycTsKIAlpbnQgaXJxX2ZsYWdzOwotCWludCAoKnJlYWQpICh2b2lkICpjbGllbnQsIHU4IHJlZywgdTggKmRhdGEpOwotCWludCAoKndyaXRlKSAodm9pZCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbCk7Ci0JaW50ICgqbXVsdGlfcmVhZCkgKHZvaWQgKmNsaWVudCwgdTggZmlyc3RfcmVnLCB1OCBjb3VudCwgdTggKmRhdGEpOwotCWludCAoKm11bHRpX3dyaXRlKSAodm9pZCAqY2xpZW50LCB1OCBmaXJzdF9yZWcsIHU4IGNvdW50LCB1OCAqZGF0YSk7CisJaW50ICgqcmVhZCkodm9pZCAqY2xpZW50LCB1OCByZWcsIHU4ICpkYXRhKTsKKwlpbnQgKCp3cml0ZSkodm9pZCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbCk7CisJaW50ICgqbXVsdGlfcmVhZCkodm9pZCAqY2xpZW50LCB1OCBmaXJzdF9yZWcsIHU4IGNvdW50LCB1OCAqZGF0YSk7CisJaW50ICgqbXVsdGlfd3JpdGUpKHZvaWQgKmNsaWVudCwgdTggZmlyc3RfcmVnLCB1OCBjb3VudCwgdTggKmRhdGEpOwogfTsKIAogI2lmZGVmIENPTkZJR19QTV9TTEVFUApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTgzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1ODMuYwppbmRleCBmOGM2NTk1Li4wYTYwZGVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1ODMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1ODMuYwpAQCAtNDMzLDcgKzQzMyw3IEBACiAJCQkJCVRTTDI1OFhfQ01EX1JFRyB8IFRTTDI1OFhfQ05UUkwsIHV0bXApOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LCAidGFvc19jaGlwX29uIGZhaWxlZCBvbiBDTlRSTCByZWcuXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIFVzZSB0aGUgZm9sbG93aW5nIHNoYWRvdyBjb3B5IGZvciBvdXIgZGVsYXkgYmVmb3JlIGVuYWJsaW5nIEFEQy4KQEAgLTQ0NSw3ICs0NDUsNyBAQAogCQlpZiAocmV0IDwgMCkgewogCQkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsCiAJCQkJInRhb3NfY2hpcF9vbiBmYWlsZWQgb24gcmVnICVkLlxuIiwgaSk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCkBAIC00NTgsNyArNDU4LDcgQEAKIAkJCQkJdXRtcCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJ0YW9zX2NoaXBfb24gZmFpbGVkIG9uIDJuZCBDVFJMIHJlZy5cbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiByZXQ7CiAJfQogCWNoaXAtPnRhb3NfY2hpcF9zdGF0dXMgPSBUU0wyNThYX0NISVBfV09SS0lORzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyeDd4X2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMng3eF9jb3JlLmMKaW5kZXggMWU1MzgwOC4uOWUwZjJhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyeDd4X2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDJ4N3hfY29yZS5jCkBAIC0zNTIsNyArMzUyLDcgQEAKIAkJLyogZGV2aWNlIGlzIG5vdCBlbmFibGVkICovCiAJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LCAiJXM6IGRldmljZSBpcyBub3QgZW5hYmxlZFxuIiwKIAkJCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FQlVTWSA7CisJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIApAQCAtMTUwNywxNiArMTUwNywxNiBAQAogCWNhc2UgdHNsMjU3MToKIAljYXNlIHRzbDI2NzE6CiAJY2FzZSB0c2wyNzcxOgotCQlyZXR1cm4gKCgqaWQgJiAweGYwKSA9PSBUUklUT05fSUQpOworCQlyZXR1cm4gKCppZCAmIDB4ZjApID09IFRSSVRPTl9JRDsKIAljYXNlIHRtZDI2NzE6CiAJY2FzZSB0bWQyNzcxOgotCQlyZXR1cm4gKCgqaWQgJiAweGYwKSA9PSBIQUxJQlVUX0lEKTsKKwkJcmV0dXJuICgqaWQgJiAweGYwKSA9PSBIQUxJQlVUX0lEOwogCWNhc2UgdHNsMjU3MjoKIAljYXNlIHRzbDI2NzI6CiAJY2FzZSB0bWQyNjcyOgogCWNhc2UgdHNsMjc3MjoKIAljYXNlIHRtZDI3NzI6Ci0JCXJldHVybiAoKCppZCAmIDB4ZjApID09IFNXT1JERklTSF9JRCk7CisJCXJldHVybiAoKmlkICYgMHhmMCkgPT0gU1dPUkRGSVNIX0lEOwogCX0KIAogCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIxMC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIxMC5jCmluZGV4IDY5NjZkNWYuLjdmYmFiYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczEyMTAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjEwLmMKQEAgLTMxMiw3ICszMTIsNyBAQAogCWlmIChzdC0+cGRhdGEtPmdwaW9pbikgewogCQlkYXRhID0gYWQyczEyMTBfcmVhZF9yZXNvbHV0aW9uX3BpbihzdCk7CiAJCWlmIChkYXRhICE9IHN0LT5yZXNvbHV0aW9uKQotCQkJcHJfd2FybmluZygiYWQyczEyMTA6IHJlc29sdXRpb24gc2V0dGluZ3Mgbm90IG1hdGNoXG4iKTsKKwkJCXByX3dhcm4oImFkMnMxMjEwOiByZXNvbHV0aW9uIHNldHRpbmdzIG5vdCBtYXRjaFxuIik7CiAJfSBlbHNlCiAJCWFkMnMxMjEwX3NldF9yZXNvbHV0aW9uX3BpbihzdCk7CiAKQEAgLTM3Miw3ICszNzIsNyBAQAogCWlmIChzdC0+cGRhdGEtPmdwaW9pbikgewogCQlkYXRhID0gYWQyczEyMTBfcmVhZF9yZXNvbHV0aW9uX3BpbihzdCk7CiAJCWlmIChkYXRhICE9IHN0LT5yZXNvbHV0aW9uKQotCQkJcHJfd2FybmluZygiYWQyczEyMTA6IHJlc29sdXRpb24gc2V0dGluZ3Mgbm90IG1hdGNoXG4iKTsKKwkJCXByX3dhcm4oImFkMnMxMjEwOiByZXNvbHV0aW9uIHNldHRpbmdzIG5vdCBtYXRjaFxuIik7CiAJfSBlbHNlCiAJCWFkMnMxMjEwX3NldF9yZXNvbHV0aW9uX3BpbihzdCk7CiAJcmV0ID0gbGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL0tjb25maWcKaW5kZXggNzgzMTlhZC4uYzZlOGJhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9LY29uZmlnCkBAIC0yMCw2ICsyMCw3IEBACiAKIGNvbmZpZyBEUk1fSU1YX1BBUkFMTEVMX0RJU1BMQVkKIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgcGFyYWxsZWwgZGlzcGxheXMiCisJc2VsZWN0IERSTV9QQU5FTAogCWRlcGVuZHMgb24gRFJNX0lNWAogCXNlbGVjdCBWSURFT01PREVfSEVMUEVSUwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL01ha2VmaWxlCmluZGV4IDQ2Nzc1ODUuLjEyOWUzYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL01ha2VmaWxlCkBAIC0xLDEyICsxLDExIEBACiAKLWlteGRybS1vYmpzIDo9IGlteC1kcm0tY29yZS5vIGlteC1mYi5vCitpbXhkcm0tb2JqcyA6PSBpbXgtZHJtLWNvcmUubwogCiBvYmotJChDT05GSUdfRFJNX0lNWCkgKz0gaW14ZHJtLm8KIAogb2JqLSQoQ09ORklHX0RSTV9JTVhfUEFSQUxMRUxfRElTUExBWSkgKz0gcGFyYWxsZWwtZGlzcGxheS5vCiBvYmotJChDT05GSUdfRFJNX0lNWF9UVkUpICs9IGlteC10dmUubwogb2JqLSQoQ09ORklHX0RSTV9JTVhfTERCKSArPSBpbXgtbGRiLm8KLW9iai0kKENPTkZJR19EUk1fSU1YX0ZCX0hFTFBFUikgKz0gaW14LWZiZGV2Lm8KIG9iai0kKENPTkZJR19EUk1fSU1YX0lQVVYzX0NPUkUpICs9IGlwdS12My8KIAogaW14LWlwdXYzLWNydGMtb2JqcyAgOj0gaXB1djMtY3J0Yy5vIGlwdXYzLXBsYW5lLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9UT0RPCmluZGV4IDZhOWRhOTQuLjI5NjM2ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vVE9ETwpAQCAtMSwxNSArMSwxMCBAQAogVE9ETzoKIC0gZ2V0IERSTSBNYWludGFpbmVyIHJldmlldyBmb3IgdGhpcyBjb2RlCi0tIFdhaXQgZm9yIGNvbW1vbiBkaXNwbGF5IGZyYW1ld29yayB0byBoaXQgbWFpbmxpbmUgYW5kIHVwZGF0ZSB0aGUgSVBVCi0gIGRyaXZlciB0byB1c2UgaXQuIFRoaXMgd2lsbCBtb3N0IHByb2JhYmx5IG1ha2UgY2hhbmdlcyB0byB0aGUgZGV2aWNldHJlZQotICBiaW5kaW5ncyBuZWNlc3NhcnkuCi0tIEZhY3RvciBvdXQgbW9yZSBjb2RlIHRvIGNvbW1vbiBoZWxwZXIgZnVuY3Rpb25zCiAtIGRlY2lkZSB3aGVyZSB0byBwdXQgdGhlIGJhc2UgZHJpdmVyLiBJdCBpcyBub3Qgc3BlY2lmaWMgdG8gYSBzdWJzeXN0ZW0KICAgYW5kIHdvdWxkIGJlIHVzZWQgYnkgRFJNL0tNUyBhbmQgbWVkaWEvVjRMMgogCiBNaXNzaW5nIGZlYXR1cmVzIChub3QgbmVjZXNzYXJpbHkgZm9yIG1vdmluZyBvdXQgb2Ygc3RhZ2luZyk6CiAKLS0gQWRkIGkuTVg2IEhETUkgc3VwcG9ydAogLSBBZGQgc3VwcG9ydCBmb3IgSUMgKEltYWdlIGNvbnZlcnRlcikKIC0gQWRkIHN1cHBvcnQgZm9yIENTSSAoQ01PUyBTZW5zb3IgaW50ZXJmYWNlKQogLSBBZGQgc3VwcG9ydCBmb3IgVkRJQyAoVmlkZW8gRGVpbnRlcmxhY2VyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWRybS1jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtZHJtLWNvcmUuYwppbmRleCAyMzZlZDY2Li40MTQ0YTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtZHJtLWNvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtZHJtLWNvcmUuYwpAQCAtMTMsMTQgKzEzLDE1IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqLwotCisjaW5jbHVkZSA8bGludXgvY29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncmFwaC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGRybS9kcm1QLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9mYl9oZWxwZXIuaD4KICNpbmNsdWRlIDxkcm0vZHJtX2NydGNfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvZmIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxkcm0vZHJtX2dlbV9jbWFfaGVscGVyLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9mYl9jbWFfaGVscGVyLmg+CiAKQEAgLTI4LDQ1ICsyOSwyOSBAQAogCiAjZGVmaW5lIE1BWF9DUlRDCTQKIAotc3RydWN0IGNydGNfY29va2llIHsKLQl2b2lkICpjb29raWU7Ci0JaW50IGlkOworc3RydWN0IGlteF9kcm1fY3J0YzsKKworc3RydWN0IGlteF9kcm1fY29tcG9uZW50IHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogfTsKIAogc3RydWN0IGlteF9kcm1fZGV2aWNlIHsKIAlzdHJ1Y3QgZHJtX2RldmljZQkJCSpkcm07Ci0Jc3RydWN0IGRldmljZQkJCQkqZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQJCQljcnRjX2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJCWVuY29kZXJfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQkJY29ubmVjdG9yX2xpc3Q7Ci0Jc3RydWN0IG11dGV4CQkJCW11dGV4OworCXN0cnVjdCBpbXhfZHJtX2NydGMJCQkqY3J0Y1tNQVhfQ1JUQ107CiAJaW50CQkJCQlwaXBlczsKIAlzdHJ1Y3QgZHJtX2ZiZGV2X2NtYQkJCSpmYmhlbHBlcjsKIH07CiAKIHN0cnVjdCBpbXhfZHJtX2NydGMgewogCXN0cnVjdCBkcm1fY3J0YwkJCQkqY3J0YzsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQkJbGlzdDsKLQlzdHJ1Y3QgaW14X2RybV9kZXZpY2UJCQkqaW14ZHJtOwogCWludAkJCQkJcGlwZTsKIAlzdHJ1Y3QgaW14X2RybV9jcnRjX2hlbHBlcl9mdW5jcwlpbXhfZHJtX2hlbHBlcl9mdW5jczsKLQlzdHJ1Y3QgbW9kdWxlCQkJCSpvd25lcjsKLQlzdHJ1Y3QgY3J0Y19jb29raWUJCQljb29raWU7CisJc3RydWN0IGRldmljZV9ub2RlCQkJKnBvcnQ7CiB9OwogCi1zdHJ1Y3QgaW14X2RybV9lbmNvZGVyIHsKLQlzdHJ1Y3QgZHJtX2VuY29kZXIJCQkqZW5jb2RlcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQkJbGlzdDsKLQlzdHJ1Y3QgbW9kdWxlCQkJCSpvd25lcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQkJcG9zc2libGVfY3J0Y3M7Ci19OwotCi1zdHJ1Y3QgaW14X2RybV9jb25uZWN0b3IgewotCXN0cnVjdCBkcm1fY29ubmVjdG9yCQkJKmNvbm5lY3RvcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQkJbGlzdDsKLQlzdHJ1Y3QgbW9kdWxlCQkJCSpvd25lcjsKLX07CitzdGF0aWMgaW50IGxlZ2FjeWZiX2RlcHRoID0gMTY7Cittb2R1bGVfcGFyYW0obGVnYWN5ZmJfZGVwdGgsIGludCwgMDQ0NCk7CiAKIGludCBpbXhfZHJtX2NydGNfaWQoc3RydWN0IGlteF9kcm1fY3J0YyAqY3J0YykKIHsKQEAgLTc2LDY5ICs2MSw3MSBAQAogCiBzdGF0aWMgdm9pZCBpbXhfZHJtX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRybSkKIHsKKyNpZiBJU19FTkFCTEVEKENPTkZJR19EUk1fSU1YX0ZCX0hFTFBFUikKIAlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IGRybS0+ZGV2X3ByaXZhdGU7CiAKIAlpZiAoaW14ZHJtLT5mYmhlbHBlcikKIAkJZHJtX2ZiZGV2X2NtYV9yZXN0b3JlX21vZGUoaW14ZHJtLT5mYmhlbHBlcik7CisjZW5kaWYKIH0KIAogc3RhdGljIGludCBpbXhfZHJtX2RyaXZlcl91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRybSkKIHsKKyNpZiBJU19FTkFCTEVEKENPTkZJR19EUk1fSU1YX0ZCX0hFTFBFUikKIAlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IGRybS0+ZGV2X3ByaXZhdGU7CisjZW5kaWYKIAotCWlteF9kcm1fZGV2aWNlX3B1dCgpOworCWRybV9rbXNfaGVscGVyX3BvbGxfZmluaShkcm0pOworCisjaWYgSVNfRU5BQkxFRChDT05GSUdfRFJNX0lNWF9GQl9IRUxQRVIpCisJaWYgKGlteGRybS0+ZmJoZWxwZXIpCisJCWRybV9mYmRldl9jbWFfZmluaShpbXhkcm0tPmZiaGVscGVyKTsKKyNlbmRpZgorCisJY29tcG9uZW50X3VuYmluZF9hbGwoZHJtLT5kZXYsIGRybSk7CiAKIAlkcm1fdmJsYW5rX2NsZWFudXAoZHJtKTsKLQlkcm1fa21zX2hlbHBlcl9wb2xsX2ZpbmkoZHJtKTsKIAlkcm1fbW9kZV9jb25maWdfY2xlYW51cChkcm0pOwogCiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBXZSBkb24ndCBjYXJlIGF0IGFsbCBmb3IgY3J0YyBudW1iZXJzLCBidXQgdGhlIGNvcmUgZXhwZWN0cyB0aGUKLSAqIGNydGNzIHRvIGJlIG51bWJlcmVkCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgaW14X2RybV9jcnRjICppbXhfZHJtX2NydGNfYnlfbnVtKHN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtLAotCQlpbnQgbnVtKQorc3RhdGljIHN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9kcm1fZmluZF9jcnRjKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKLQlzdHJ1Y3QgaW14X2RybV9jcnRjICppbXhfZHJtX2NydGM7CisJc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBjcnRjLT5kZXYtPmRldl9wcml2YXRlOworCXVuc2lnbmVkIGk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlteF9kcm1fY3J0YywgJmlteGRybS0+Y3J0Y19saXN0LCBsaXN0KQotCQlpZiAoaW14X2RybV9jcnRjLT5waXBlID09IG51bSkKLQkJCXJldHVybiBpbXhfZHJtX2NydGM7CisJZm9yIChpID0gMDsgaSA8IE1BWF9DUlRDOyBpKyspCisJCWlmIChpbXhkcm0tPmNydGNbaV0gJiYgaW14ZHJtLT5jcnRjW2ldLT5jcnRjID09IGNydGMpCisJCQlyZXR1cm4gaW14ZHJtLT5jcnRjW2ldOworCiAJcmV0dXJuIE5VTEw7CiB9CiAKLWludCBpbXhfZHJtX2NydGNfcGFuZWxfZm9ybWF0X3BpbnMoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MzIgZW5jb2Rlcl90eXBlLAoraW50IGlteF9kcm1fcGFuZWxfZm9ybWF0X3BpbnMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAogCQl1MzIgaW50ZXJmYWNlX3BpeF9mbXQsIGludCBoc3luY19waW4sIGludCB2c3luY19waW4pCiB7Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBjcnRjLT5kZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9jcnRjOwogCXN0cnVjdCBpbXhfZHJtX2NydGNfaGVscGVyX2Z1bmNzICpoZWxwZXI7CisJc3RydWN0IGlteF9kcm1fY3J0YyAqaW14X2NydGM7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlteF9jcnRjLCAmaW14ZHJtLT5jcnRjX2xpc3QsIGxpc3QpCi0JCWlmIChpbXhfY3J0Yy0+Y3J0YyA9PSBjcnRjKQotCQkJZ290byBmb3VuZDsKKwlpbXhfY3J0YyA9IGlteF9kcm1fZmluZF9jcnRjKGVuY29kZXItPmNydGMpOworCWlmICghaW14X2NydGMpCisJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIC1FSU5WQUw7Ci1mb3VuZDoKIAloZWxwZXIgPSAmaW14X2NydGMtPmlteF9kcm1faGVscGVyX2Z1bmNzOwogCWlmIChoZWxwZXItPnNldF9pbnRlcmZhY2VfcGl4X2ZtdCkKLQkJcmV0dXJuIGhlbHBlci0+c2V0X2ludGVyZmFjZV9waXhfZm10KGNydGMsCi0JCQkJZW5jb2Rlcl90eXBlLCBpbnRlcmZhY2VfcGl4X2ZtdCwKKwkJcmV0dXJuIGhlbHBlci0+c2V0X2ludGVyZmFjZV9waXhfZm10KGVuY29kZXItPmNydGMsCisJCQkJZW5jb2Rlci0+ZW5jb2Rlcl90eXBlLCBpbnRlcmZhY2VfcGl4X2ZtdCwKIAkJCQloc3luY19waW4sIHZzeW5jX3Bpbik7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX2NydGNfcGFuZWxfZm9ybWF0X3BpbnMpOworRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9wYW5lbF9mb3JtYXRfcGlucyk7CiAKLWludCBpbXhfZHJtX2NydGNfcGFuZWxfZm9ybWF0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdTMyIGVuY29kZXJfdHlwZSwKLQkJdTMyIGludGVyZmFjZV9waXhfZm10KQoraW50IGlteF9kcm1fcGFuZWxfZm9ybWF0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgdTMyIGludGVyZmFjZV9waXhfZm10KQogewotCXJldHVybiBpbXhfZHJtX2NydGNfcGFuZWxfZm9ybWF0X3BpbnMoY3J0YywgZW5jb2Rlcl90eXBlLAotCQkJCQkgICAgICBpbnRlcmZhY2VfcGl4X2ZtdCwgMiwgMyk7CisJcmV0dXJuIGlteF9kcm1fcGFuZWxfZm9ybWF0X3BpbnMoZW5jb2RlciwgaW50ZXJmYWNlX3BpeF9mbXQsIDIsIDMpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9jcnRjX3BhbmVsX2Zvcm1hdCk7CitFWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX3BhbmVsX2Zvcm1hdCk7CiAKIGludCBpbXhfZHJtX2NydGNfdmJsYW5rX2dldChzdHJ1Y3QgaW14X2RybV9jcnRjICppbXhfZHJtX2NydGMpCiB7CkBAIC0xNjEsMTAgKzE0OCw5IEBACiBzdGF0aWMgaW50IGlteF9kcm1fZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLCBpbnQgY3J0YykKIHsKIAlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IGRybS0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGlteF9kcm1fY3J0YyAqaW14X2RybV9jcnRjOworCXN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9kcm1fY3J0YyA9IGlteGRybS0+Y3J0Y1tjcnRjXTsKIAlpbnQgcmV0OwogCi0JaW14X2RybV9jcnRjID0gaW14X2RybV9jcnRjX2J5X251bShpbXhkcm0sIGNydGMpOwogCWlmICghaW14X2RybV9jcnRjKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTgwLDkgKzE2Niw4IEBACiBzdGF0aWMgdm9pZCBpbXhfZHJtX2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sIGludCBjcnRjKQogewogCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gZHJtLT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW14X2RybV9jcnRjICppbXhfZHJtX2NydGM7CisJc3RydWN0IGlteF9kcm1fY3J0YyAqaW14X2RybV9jcnRjID0gaW14ZHJtLT5jcnRjW2NydGNdOwogCi0JaW14X2RybV9jcnRjID0gaW14X2RybV9jcnRjX2J5X251bShpbXhkcm0sIGNydGMpOwogCWlmICghaW14X2RybV9jcnRjKQogCQlyZXR1cm47CiAKQEAgLTIxNSwxNzIgKzIwMCw1NCBAQAogCS5sbHNlZWsgPSBub29wX2xsc2VlaywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteF9kcm1fZGV2aWNlOwotCi1zdGF0aWMgc3RydWN0IGlteF9kcm1fZGV2aWNlICpfX2lteF9kcm1fZGV2aWNlKHZvaWQpCitpbnQgaW14X2RybV9jb25uZWN0b3JfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQogewotCXJldHVybiBpbXhfZHJtX2RldmljZTsKKwlyZXR1cm4gTU9ERV9PSzsKK30KK0VYUE9SVF9TWU1CT0woaW14X2RybV9jb25uZWN0b3JfbW9kZV92YWxpZCk7CisKK3ZvaWQgaW14X2RybV9jb25uZWN0b3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCWRybV9zeXNmc19jb25uZWN0b3JfcmVtb3ZlKGNvbm5lY3Rvcik7CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGNvbm5lY3Rvcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX2Nvbm5lY3Rvcl9kZXN0cm95KTsKKwordm9pZCBpbXhfZHJtX2VuY29kZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlteF9kcm1fZW5jb2Rlcl9kZXN0cm95KTsKKworc3RhdGljIHZvaWQgaW14X2RybV9vdXRwdXRfcG9sbF9jaGFuZ2VkKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0pCit7CisjaWYgSVNfRU5BQkxFRChDT05GSUdfRFJNX0lNWF9GQl9IRUxQRVIpCisJc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBkcm0tPmRldl9wcml2YXRlOworCisJZHJtX2ZiZGV2X2NtYV9ob3RwbHVnX2V2ZW50KGlteGRybS0+ZmJoZWxwZXIpOworI2VuZGlmCiB9CiAKLXN0cnVjdCBkcm1fZGV2aWNlICppbXhfZHJtX2RldmljZV9nZXQodm9pZCkKLXsKLQlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IF9faW14X2RybV9kZXZpY2UoKTsKLQlzdHJ1Y3QgaW14X2RybV9lbmNvZGVyICplbmM7Ci0Jc3RydWN0IGlteF9kcm1fY29ubmVjdG9yICpjb247Ci0Jc3RydWN0IGlteF9kcm1fY3J0YyAqY3J0YzsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jLCAmaW14ZHJtLT5lbmNvZGVyX2xpc3QsIGxpc3QpIHsKLQkJaWYgKCF0cnlfbW9kdWxlX2dldChlbmMtPm93bmVyKSkgewotCQkJZGV2X2VycihpbXhkcm0tPmRldiwgImNvdWxkIG5vdCBnZXQgbW9kdWxlICVzXG4iLAotCQkJCQltb2R1bGVfbmFtZShlbmMtPm93bmVyKSk7Ci0JCQlnb3RvIHVud2luZF9lbmM7Ci0JCX0KLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbiwgJmlteGRybS0+Y29ubmVjdG9yX2xpc3QsIGxpc3QpIHsKLQkJaWYgKCF0cnlfbW9kdWxlX2dldChjb24tPm93bmVyKSkgewotCQkJZGV2X2VycihpbXhkcm0tPmRldiwgImNvdWxkIG5vdCBnZXQgbW9kdWxlICVzXG4iLAotCQkJCQltb2R1bGVfbmFtZShjb24tPm93bmVyKSk7Ci0JCQlnb3RvIHVud2luZF9jb247Ci0JCX0KLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZpbXhkcm0tPmNydGNfbGlzdCwgbGlzdCkgewotCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGNydGMtPm93bmVyKSkgewotCQkJZGV2X2VycihpbXhkcm0tPmRldiwgImNvdWxkIG5vdCBnZXQgbW9kdWxlICVzXG4iLAotCQkJCQltb2R1bGVfbmFtZShjcnRjLT5vd25lcikpOwotCQkJZ290byB1bndpbmRfY3J0YzsKLQkJfQotCX0KLQotCXJldHVybiBpbXhkcm0tPmRybTsKLQotdW53aW5kX2NydGM6Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZV9yZXZlcnNlKGNydGMsICZpbXhkcm0tPmNydGNfbGlzdCwgbGlzdCkKLQkJbW9kdWxlX3B1dChjcnRjLT5vd25lcik7Ci11bndpbmRfY29uOgotCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmV2ZXJzZShjb24sICZpbXhkcm0tPmNvbm5lY3Rvcl9saXN0LCBsaXN0KQotCQltb2R1bGVfcHV0KGNvbi0+b3duZXIpOwotdW53aW5kX2VuYzoKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JldmVyc2UoZW5jLCAmaW14ZHJtLT5lbmNvZGVyX2xpc3QsIGxpc3QpCi0JCW1vZHVsZV9wdXQoZW5jLT5vd25lcik7Ci0KLQltdXRleF91bmxvY2soJmlteGRybS0+bXV0ZXgpOwotCi0JcmV0dXJuIE5VTEw7Ci0KLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlteF9kcm1fZGV2aWNlX2dldCk7Ci0KLXZvaWQgaW14X2RybV9kZXZpY2VfcHV0KHZvaWQpCi17Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7Ci0Jc3RydWN0IGlteF9kcm1fZW5jb2RlciAqZW5jOwotCXN0cnVjdCBpbXhfZHJtX2Nvbm5lY3RvciAqY29uOwotCXN0cnVjdCBpbXhfZHJtX2NydGMgKmNydGM7Ci0KLQltdXRleF9sb2NrKCZpbXhkcm0tPm11dGV4KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmlteGRybS0+Y3J0Y19saXN0LCBsaXN0KQotCQltb2R1bGVfcHV0KGNydGMtPm93bmVyKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY29uLCAmaW14ZHJtLT5jb25uZWN0b3JfbGlzdCwgbGlzdCkKLQkJbW9kdWxlX3B1dChjb24tPm93bmVyKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jLCAmaW14ZHJtLT5lbmNvZGVyX2xpc3QsIGxpc3QpCi0JCW1vZHVsZV9wdXQoZW5jLT5vd25lcik7Ci0KLQltdXRleF91bmxvY2soJmlteGRybS0+bXV0ZXgpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9kZXZpY2VfcHV0KTsKLQotc3RhdGljIGludCBkcm1fbW9kZV9ncm91cF9yZWluaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZHJtX21vZGVfZ3JvdXAgKmdyb3VwID0gJmRldi0+cHJpbWFyeS0+bW9kZV9ncm91cDsKLQl1aW50MzJfdCAqaWRfbGlzdCA9IGdyb3VwLT5pZF9saXN0OwotCWludCByZXQ7Ci0KLQlyZXQgPSBkcm1fbW9kZV9ncm91cF9pbml0X2xlZ2FjeV9ncm91cChkZXYsIGdyb3VwKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWtmcmVlKGlkX2xpc3QpOwotCXJldHVybiAwOwotfQorc3RhdGljIHN0cnVjdCBkcm1fbW9kZV9jb25maWdfZnVuY3MgaW14X2RybV9tb2RlX2NvbmZpZ19mdW5jcyA9IHsKKwkuZmJfY3JlYXRlID0gZHJtX2ZiX2NtYV9jcmVhdGUsCisJLm91dHB1dF9wb2xsX2NoYW5nZWQgPSBpbXhfZHJtX291dHB1dF9wb2xsX2NoYW5nZWQsCit9OwogCiAvKgotICogcmVnaXN0ZXIgYW4gZW5jb2RlciB0byB0aGUgZHJtIGNvcmUKLSAqLwotc3RhdGljIGludCBpbXhfZHJtX2VuY29kZXJfcmVnaXN0ZXIoc3RydWN0IGlteF9kcm1fZW5jb2RlciAqaW14X2RybV9lbmNvZGVyKQotewotCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gX19pbXhfZHJtX2RldmljZSgpOwotCi0JSU5JVF9MSVNUX0hFQUQoJmlteF9kcm1fZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MpOwotCi0JZHJtX2VuY29kZXJfaW5pdChpbXhkcm0tPmRybSwgaW14X2RybV9lbmNvZGVyLT5lbmNvZGVyLAotCQkJaW14X2RybV9lbmNvZGVyLT5lbmNvZGVyLT5mdW5jcywKLQkJCWlteF9kcm1fZW5jb2Rlci0+ZW5jb2Rlci0+ZW5jb2Rlcl90eXBlKTsKLQotCWRybV9tb2RlX2dyb3VwX3JlaW5pdChpbXhkcm0tPmRybSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHVucmVnaXN0ZXIgYW4gZW5jb2RlciBmcm9tIHRoZSBkcm0gY29yZQotICovCi1zdGF0aWMgdm9pZCBpbXhfZHJtX2VuY29kZXJfdW5yZWdpc3RlcihzdHJ1Y3QgaW14X2RybV9lbmNvZGVyCi0JCSppbXhfZHJtX2VuY29kZXIpCi17Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7Ci0KLQlkcm1fZW5jb2Rlcl9jbGVhbnVwKGlteF9kcm1fZW5jb2Rlci0+ZW5jb2Rlcik7Ci0KLQlkcm1fbW9kZV9ncm91cF9yZWluaXQoaW14ZHJtLT5kcm0pOwotfQotCi0vKgotICogcmVnaXN0ZXIgYSBjb25uZWN0b3IgdG8gdGhlIGRybSBjb3JlCi0gKi8KLXN0YXRpYyBpbnQgaW14X2RybV9jb25uZWN0b3JfcmVnaXN0ZXIoCi0JCXN0cnVjdCBpbXhfZHJtX2Nvbm5lY3RvciAqaW14X2RybV9jb25uZWN0b3IpCi17Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7Ci0KLQlkcm1fY29ubmVjdG9yX2luaXQoaW14ZHJtLT5kcm0sIGlteF9kcm1fY29ubmVjdG9yLT5jb25uZWN0b3IsCi0JCQlpbXhfZHJtX2Nvbm5lY3Rvci0+Y29ubmVjdG9yLT5mdW5jcywKLQkJCWlteF9kcm1fY29ubmVjdG9yLT5jb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlKTsKLQlkcm1fbW9kZV9ncm91cF9yZWluaXQoaW14ZHJtLT5kcm0pOwotCi0JcmV0dXJuIGRybV9zeXNmc19jb25uZWN0b3JfYWRkKGlteF9kcm1fY29ubmVjdG9yLT5jb25uZWN0b3IpOwotfQotCi0vKgotICogdW5yZWdpc3RlciBhIGNvbm5lY3RvciBmcm9tIHRoZSBkcm0gY29yZQotICovCi1zdGF0aWMgdm9pZCBpbXhfZHJtX2Nvbm5lY3Rvcl91bnJlZ2lzdGVyKAotCQlzdHJ1Y3QgaW14X2RybV9jb25uZWN0b3IgKmlteF9kcm1fY29ubmVjdG9yKQotewotCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gX19pbXhfZHJtX2RldmljZSgpOwotCi0JZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9yZW1vdmUoaW14X2RybV9jb25uZWN0b3ItPmNvbm5lY3Rvcik7Ci0JZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGlteF9kcm1fY29ubmVjdG9yLT5jb25uZWN0b3IpOwotCi0JZHJtX21vZGVfZ3JvdXBfcmVpbml0KGlteGRybS0+ZHJtKTsKLX0KLQotLyoKLSAqIENhbGxlZCBieSB0aGUgQ1JUQyBkcml2ZXIgd2hlbiBhbGwgQ1JUQ3MgYXJlIHJlZ2lzdGVyZWQuIFRoaXMKLSAqIHB1dHMgYWxsIHRoZSBwaWVjZXMgdG9nZXRoZXIgYW5kIGluaXRpYWxpemVzIHRoZSBkcml2ZXIuCi0gKiBPbmNlIHRoaXMgaXMgY2FsbGVkIG5vIG1vcmUgQ1JUQ3MgY2FuIGJlIHJlZ2lzdGVyZWQgc2luY2UKLSAqIHRoZSBkcm0gY29yZSBoYXMgaGFyZGNvZGVkIHRoZSBudW1iZXIgb2YgY3J0Y3MgaW4gc2V2ZXJhbAotICogcGxhY2VzLgorICogTWFpbiBEUk0gaW5pdGlhbGlzYXRpb24uIFRoaXMgYmluZHMsIGluaXRpYWxpc2VzIGFuZCByZWdpc3RlcnMKKyAqIHdpdGggRFJNIHRoZSBzdWJjb21wb25lbnRzIG9mIHRoZSBkcml2ZXIuCiAgKi8KIHN0YXRpYyBpbnQgaW14X2RybV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewotCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gX19pbXhfZHJtX2RldmljZSgpOworCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CiAJaW50IHJldDsKIAorCWlteGRybSA9IGRldm1fa3phbGxvYyhkcm0tPmRldiwgc2l6ZW9mKCppbXhkcm0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlteGRybSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlpbXhkcm0tPmRybSA9IGRybTsKIAogCWRybS0+ZGV2X3ByaXZhdGUgPSBpbXhkcm07CkBAIC0zOTYsMTIwICsyNjMsMTE4IEBACiAJICovCiAJZHJtLT5pcnFfZW5hYmxlZCA9IHRydWU7CiAKKwkvKgorCSAqIHNldCBtYXggd2lkdGggYW5kIGhlaWdodCBhcyBkZWZhdWx0IHZhbHVlKDQwOTZ4NDA5NikuCisJICogdGhpcyB2YWx1ZSB3b3VsZCBiZSB1c2VkIHRvIGNoZWNrIGZyYW1lYnVmZmVyIHNpemUgbGltaXRhdGlvbgorCSAqIGF0IGRybV9tb2RlX2FkZGZiKCkuCisJICovCisJZHJtLT5tb2RlX2NvbmZpZy5taW5fd2lkdGggPSA2NDsKKwlkcm0tPm1vZGVfY29uZmlnLm1pbl9oZWlnaHQgPSA2NDsKKwlkcm0tPm1vZGVfY29uZmlnLm1heF93aWR0aCA9IDQwOTY7CisJZHJtLT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0ID0gNDA5NjsKKwlkcm0tPm1vZGVfY29uZmlnLmZ1bmNzID0gJmlteF9kcm1fbW9kZV9jb25maWdfZnVuY3M7CisKIAlkcm1fbW9kZV9jb25maWdfaW5pdChkcm0pOwotCWlteF9kcm1fbW9kZV9jb25maWdfaW5pdChkcm0pOwotCi0JbXV0ZXhfbG9jaygmaW14ZHJtLT5tdXRleCk7Ci0KLQlkcm1fa21zX2hlbHBlcl9wb2xsX2luaXQoZHJtKTsKLQotCS8qIHNldHVwIHRoZSBncm91cGluZyBmb3IgdGhlIGxlZ2FjeSBvdXRwdXQgKi8KLQlyZXQgPSBkcm1fbW9kZV9ncm91cF9pbml0X2xlZ2FjeV9ncm91cChkcm0sCi0JCQkmZHJtLT5wcmltYXJ5LT5tb2RlX2dyb3VwKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9rbXM7CiAKIAlyZXQgPSBkcm1fdmJsYW5rX2luaXQoZHJtLCBNQVhfQ1JUQyk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfa21zOwogCiAJLyoKLQkgKiB3aXRoIHZibGFua19kaXNhYmxlX2FsbG93ZWQgPSB0cnVlLCB2YmxhbmsgaW50ZXJydXB0IHdpbGwgYmUgZGlzYWJsZWQKLQkgKiBieSBkcm0gdGltZXIgb25jZSBhIGN1cnJlbnQgcHJvY2VzcyBnaXZlcyB1cCBvd25lcnNoaXAgb2YKLQkgKiB2YmxhbmsgZXZlbnQuKGFmdGVyIGRybV92YmxhbmtfcHV0IGZ1bmN0aW9uIGlzIGNhbGxlZCkKKwkgKiB3aXRoIHZibGFua19kaXNhYmxlX2FsbG93ZWQgPSB0cnVlLCB2YmxhbmsgaW50ZXJydXB0IHdpbGwgYmUKKwkgKiBkaXNhYmxlZCBieSBkcm0gdGltZXIgb25jZSBhIGN1cnJlbnQgcHJvY2VzcyBnaXZlcyB1cCBvd25lcnNoaXAKKwkgKiBvZiB2YmxhbmsgZXZlbnQuIChhZnRlciBkcm1fdmJsYW5rX3B1dCBmdW5jdGlvbiBpcyBjYWxsZWQpCiAJICovCiAJZHJtLT52YmxhbmtfZGlzYWJsZV9hbGxvd2VkID0gdHJ1ZTsKIAotCWlmICghaW14X2RybV9kZXZpY2VfZ2V0KCkpIHsKLQkJcmV0ID0gLUVJTlZBTDsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkcm0tPnBsYXRmb3JtZGV2LCBkcm0pOworCisJLyogTm93IHRyeSBhbmQgYmluZCBhbGwgb3VyIHN1Yi1jb21wb25lbnRzICovCisJcmV0ID0gY29tcG9uZW50X2JpbmRfYWxsKGRybS0+ZGV2LCBkcm0pOworCWlmIChyZXQpCiAJCWdvdG8gZXJyX3ZibGFuazsKKworCS8qCisJICogQWxsIGNvbXBvbmVudHMgYXJlIG5vdyBhZGRlZCwgd2UgY2FuIHB1Ymxpc2ggdGhlIGNvbm5lY3RvciBzeXNmcworCSAqIGVudHJpZXMgdG8gdXNlcnNwYWNlLiAgVGhpcyB3aWxsIGdlbmVyYXRlIGhvdHBsdWcgZXZlbnRzIGFuZCBzbworCSAqIHVzZXJzcGFjZSB3aWxsIGV4cGVjdCB0byBiZSBhYmxlIHRvIGFjY2VzcyBEUk0gYXQgdGhpcyBwb2ludC4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRybS0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJcmV0ID0gZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9hZGQoY29ubmVjdG9yKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihkcm0tPmRldiwKKwkJCQkiW0NPTk5FQ1RPUjolZDolc10gZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9hZGQgZmFpbGVkOiAlZFxuIiwKKwkJCQljb25uZWN0b3ItPmJhc2UuaWQsCisJCQkJZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpLCByZXQpOworCQkJZ290byBlcnJfdW5iaW5kOworCQl9CiAJfQogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZHJtLT5wbGF0Zm9ybWRldiwgZHJtKTsKLQltdXRleF91bmxvY2soJmlteGRybS0+bXV0ZXgpOworCS8qCisJICogQWxsIGNvbXBvbmVudHMgYXJlIG5vdyBpbml0aWFsaXNlZCwgc28gc2V0dXAgdGhlIGZiIGhlbHBlci4KKwkgKiBUaGUgZmIgaGVscGVyIHRha2VzIGNvcGllcyBvZiBrZXkgaGFyZHdhcmUgaW5mb3JtYXRpb24sIHNvIHRoZQorCSAqIGNydGNzL2Nvbm5lY3RvcnMvZW5jb2RlcnMgbXVzdCBub3QgY2hhbmdlIGFmdGVyIHRoaXMgcG9pbnQuCisJICovCisjaWYgSVNfRU5BQkxFRChDT05GSUdfRFJNX0lNWF9GQl9IRUxQRVIpCisJaWYgKGxlZ2FjeWZiX2RlcHRoICE9IDE2ICYmIGxlZ2FjeWZiX2RlcHRoICE9IDMyKSB7CisJCWRldl93YXJuKGRybS0+ZGV2LCAiSW52YWxpZCBsZWdhY3lmYl9kZXB0aC4gIERlZmF1bHRpbmcgdG8gMTZicHBcbiIpOworCQlsZWdhY3lmYl9kZXB0aCA9IDE2OworCX0KKwlpbXhkcm0tPmZiaGVscGVyID0gZHJtX2ZiZGV2X2NtYV9pbml0KGRybSwgbGVnYWN5ZmJfZGVwdGgsCisJCQkJZHJtLT5tb2RlX2NvbmZpZy5udW1fY3J0YywgTUFYX0NSVEMpOworCWlmIChJU19FUlIoaW14ZHJtLT5mYmhlbHBlcikpIHsKKwkJcmV0ID0gUFRSX0VSUihpbXhkcm0tPmZiaGVscGVyKTsKKwkJaW14ZHJtLT5mYmhlbHBlciA9IE5VTEw7CisJCWdvdG8gZXJyX3VuYmluZDsKKwl9CisjZW5kaWYKKworCWRybV9rbXNfaGVscGVyX3BvbGxfaW5pdChkcm0pOworCiAJcmV0dXJuIDA7CiAKK2Vycl91bmJpbmQ6CisJY29tcG9uZW50X3VuYmluZF9hbGwoZHJtLT5kZXYsIGRybSk7CiBlcnJfdmJsYW5rOgogCWRybV92YmxhbmtfY2xlYW51cChkcm0pOwogZXJyX2ttczoKLQlkcm1fa21zX2hlbHBlcl9wb2xsX2ZpbmkoZHJtKTsKIAlkcm1fbW9kZV9jb25maWdfY2xlYW51cChkcm0pOwotCW11dGV4X3VubG9jaygmaW14ZHJtLT5tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBpbXhfZHJtX3VwZGF0ZV9wb3NzaWJsZV9jcnRjcyh2b2lkKQotewotCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gX19pbXhfZHJtX2RldmljZSgpOwotCXN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9kcm1fY3J0YzsKLQlzdHJ1Y3QgaW14X2RybV9lbmNvZGVyICplbmM7Ci0Jc3RydWN0IGNydGNfY29va2llICpjb29raWU7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuYywgJmlteGRybS0+ZW5jb2Rlcl9saXN0LCBsaXN0KSB7Ci0JCXUzMiBwb3NzaWJsZV9jcnRjcyA9IDA7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjb29raWUsICZlbmMtPnBvc3NpYmxlX2NydGNzLCBsaXN0KSB7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlteF9kcm1fY3J0YywgJmlteGRybS0+Y3J0Y19saXN0LCBsaXN0KSB7Ci0JCQkJaWYgKGlteF9kcm1fY3J0Yy0+Y29va2llLmNvb2tpZSA9PSBjb29raWUtPmNvb2tpZSAmJgotCQkJCQkJaW14X2RybV9jcnRjLT5jb29raWUuaWQgPT0gY29va2llLT5pZCkgewotCQkJCQlwb3NzaWJsZV9jcnRjcyB8PSAxIDw8IGlteF9kcm1fY3J0Yy0+cGlwZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZW5jLT5lbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IHBvc3NpYmxlX2NydGNzOwotCQllbmMtPmVuY29kZXItPnBvc3NpYmxlX2Nsb25lcyA9IHBvc3NpYmxlX2NydGNzOwotCX0KLX0KLQogLyoKICAqIGlteF9kcm1fYWRkX2NydGMgLSBhZGQgYSBuZXcgY3J0YwotICoKLSAqIFRoZSByZXR1cm4gdmFsdWUgaWYgIU5VTEwgaXMgYSBjb29raWUgZm9yIHRoZSBjYWxsZXIgdG8gcGFzcyB0bwotICogaW14X2RybV9yZW1vdmVfY3J0YyBsYXRlci4KICAqLwotaW50IGlteF9kcm1fYWRkX2NydGMoc3RydWN0IGRybV9jcnRjICpjcnRjLAoraW50IGlteF9kcm1fYWRkX2NydGMoc3RydWN0IGRybV9kZXZpY2UgKmRybSwgc3RydWN0IGRybV9jcnRjICpjcnRjLAogCQlzdHJ1Y3QgaW14X2RybV9jcnRjICoqbmV3X2NydGMsCiAJCWNvbnN0IHN0cnVjdCBpbXhfZHJtX2NydGNfaGVscGVyX2Z1bmNzICppbXhfZHJtX2hlbHBlcl9mdW5jcywKLQkJc3RydWN0IG1vZHVsZSAqb3duZXIsIHZvaWQgKmNvb2tpZSwgaW50IGlkKQorCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBvcnQpCiB7Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7CisJc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBkcm0tPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9kcm1fY3J0YzsKIAlpbnQgcmV0OwogCi0JbXV0ZXhfbG9jaygmaW14ZHJtLT5tdXRleCk7Ci0KIAkvKgogCSAqIFRoZSB2YmxhbmsgYXJyYXlzIGFyZSBkaW1lbnNpb25lZCBieSBNQVhfQ1JUQyAtIHdlIGNhbid0CiAJICogcGFzcyBJRHMgZ3JlYXRlciB0aGFuIHRoaXMgdG8gdGhvc2UgZnVuY3Rpb25zLgogCSAqLwotCWlmIChpbXhkcm0tPnBpcGVzID49IE1BWF9DUlRDKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX2J1c3k7Ci0JfQorCWlmIChpbXhkcm0tPnBpcGVzID49IE1BWF9DUlRDKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChpbXhkcm0tPmRybS0+b3Blbl9jb3VudCkgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyX2J1c3k7Ci0JfQorCWlmIChpbXhkcm0tPmRybS0+b3Blbl9jb3VudCkKKwkJcmV0dXJuIC1FQlVTWTsKIAogCWlteF9kcm1fY3J0YyA9IGt6YWxsb2Moc2l6ZW9mKCppbXhfZHJtX2NydGMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlteF9kcm1fY3J0YykgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9hbGxvYzsKLQl9CisJaWYgKCFpbXhfZHJtX2NydGMpCisJCXJldHVybiAtRU5PTUVNOwogCiAJaW14X2RybV9jcnRjLT5pbXhfZHJtX2hlbHBlcl9mdW5jcyA9ICppbXhfZHJtX2hlbHBlcl9mdW5jczsKIAlpbXhfZHJtX2NydGMtPnBpcGUgPSBpbXhkcm0tPnBpcGVzKys7Ci0JaW14X2RybV9jcnRjLT5jb29raWUuY29va2llID0gY29va2llOwotCWlteF9kcm1fY3J0Yy0+Y29va2llLmlkID0gaWQ7Ci0KKwlpbXhfZHJtX2NydGMtPnBvcnQgPSBwb3J0OwogCWlteF9kcm1fY3J0Yy0+Y3J0YyA9IGNydGM7Ci0JaW14X2RybV9jcnRjLT5pbXhkcm0gPSBpbXhkcm07CiAKLQlpbXhfZHJtX2NydGMtPm93bmVyID0gb3duZXI7Ci0KLQlsaXN0X2FkZF90YWlsKCZpbXhfZHJtX2NydGMtPmxpc3QsICZpbXhkcm0tPmNydGNfbGlzdCk7CisJaW14ZHJtLT5jcnRjW2lteF9kcm1fY3J0Yy0+cGlwZV0gPSBpbXhfZHJtX2NydGM7CiAKIAkqbmV3X2NydGMgPSBpbXhfZHJtX2NydGM7CiAKQEAgLTUyMCwyMyArMzg1LDE0IEBACiAJZHJtX2NydGNfaGVscGVyX2FkZChjcnRjLAogCQkJaW14X2RybV9jcnRjLT5pbXhfZHJtX2hlbHBlcl9mdW5jcy5jcnRjX2hlbHBlcl9mdW5jcyk7CiAKLQlkcm1fY3J0Y19pbml0KGlteGRybS0+ZHJtLCBjcnRjLAorCWRybV9jcnRjX2luaXQoZHJtLCBjcnRjLAogCQkJaW14X2RybV9jcnRjLT5pbXhfZHJtX2hlbHBlcl9mdW5jcy5jcnRjX2Z1bmNzKTsKIAotCWRybV9tb2RlX2dyb3VwX3JlaW5pdChpbXhkcm0tPmRybSk7Ci0KLQlpbXhfZHJtX3VwZGF0ZV9wb3NzaWJsZV9jcnRjcygpOwotCi0JbXV0ZXhfdW5sb2NrKCZpbXhkcm0tPm11dGV4KTsKLQogCXJldHVybiAwOwogCiBlcnJfcmVnaXN0ZXI6Ci0JbGlzdF9kZWwoJmlteF9kcm1fY3J0Yy0+bGlzdCk7CisJaW14ZHJtLT5jcnRjW2lteF9kcm1fY3J0Yy0+cGlwZV0gPSBOVUxMOwogCWtmcmVlKGlteF9kcm1fY3J0Yyk7Ci1lcnJfYWxsb2M6Ci1lcnJfYnVzeToKLQltdXRleF91bmxvY2soJmlteGRybS0+bXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX2FkZF9jcnRjKTsKQEAgLTU0NiwxNyArNDAyLDExIEBACiAgKi8KIGludCBpbXhfZHJtX3JlbW92ZV9jcnRjKHN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9kcm1fY3J0YykKIHsKLQlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IGlteF9kcm1fY3J0Yy0+aW14ZHJtOwotCi0JbXV0ZXhfbG9jaygmaW14ZHJtLT5tdXRleCk7CisJc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBpbXhfZHJtX2NydGMtPmNydGMtPmRldi0+ZGV2X3ByaXZhdGU7CiAKIAlkcm1fY3J0Y19jbGVhbnVwKGlteF9kcm1fY3J0Yy0+Y3J0Yyk7CiAKLQlsaXN0X2RlbCgmaW14X2RybV9jcnRjLT5saXN0KTsKLQotCWRybV9tb2RlX2dyb3VwX3JlaW5pdChpbXhkcm0tPmRybSk7Ci0KLQltdXRleF91bmxvY2soJmlteGRybS0+bXV0ZXgpOworCWlteGRybS0+Y3J0Y1tpbXhfZHJtX2NydGMtPnBpcGVdID0gTlVMTDsKIAogCWtmcmVlKGlteF9kcm1fY3J0Yyk7CiAKQEAgLTU2NSwyMjAgKzQxNSwxMTUgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGlteF9kcm1fcmVtb3ZlX2NydGMpOwogCiAvKgotICogaW14X2RybV9hZGRfZW5jb2RlciAtIGFkZCBhIG5ldyBlbmNvZGVyCisgKiBGaW5kIHRoZSBEUk0gQ1JUQyBwb3NzaWJsZSBtYXNrIGZvciB0aGUgY29ubmVjdGVkIGVuZHBvaW50LgorICoKKyAqIFRoZSBlbmNvZGVyIHBvc3NpYmxlIG1hc2tzIGFyZSBkZWZpbmVkIGJ5IHRoZWlyIHBvc2l0aW9uIGluIHRoZQorICogbW9kZV9jb25maWcgY3J0Y19saXN0LiAgVGhpcyBtZWFucyB0aGF0IENSVENzIG11c3Qgbm90IGJlIGFkZGVkCisgKiBvciByZW1vdmVkIG9uY2UgdGhlIERSTSBkZXZpY2UgaGFzIGJlZW4gZnVsbHkgaW5pdGlhbGlzZWQuCiAgKi8KLWludCBpbXhfZHJtX2FkZF9lbmNvZGVyKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKLQkJc3RydWN0IGlteF9kcm1fZW5jb2RlciAqKm5ld2VuYywgc3RydWN0IG1vZHVsZSAqb3duZXIpCitzdGF0aWMgdWludDMyX3QgaW14X2RybV9maW5kX2NydGNfbWFzayhzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSwKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmVuZHBvaW50KQogewotCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gX19pbXhfZHJtX2RldmljZSgpOwotCXN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKmlteF9kcm1fZW5jb2RlcjsKLQlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcG9ydDsKKwl1bnNpZ25lZCBpOwogCi0JbXV0ZXhfbG9jaygmaW14ZHJtLT5tdXRleCk7CisJcG9ydCA9IG9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydChlbmRwb2ludCk7CisJaWYgKCFwb3J0KQorCQlyZXR1cm4gMDsKKwlvZl9ub2RlX3B1dChwb3J0KTsKIAotCWlmIChpbXhkcm0tPmRybS0+b3Blbl9jb3VudCkgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyX2J1c3k7CisJZm9yIChpID0gMDsgaSA8IE1BWF9DUlRDOyBpKyspIHsKKwkJc3RydWN0IGlteF9kcm1fY3J0YyAqaW14X2RybV9jcnRjID0gaW14ZHJtLT5jcnRjW2ldOworCQlpZiAoaW14X2RybV9jcnRjICYmIGlteF9kcm1fY3J0Yy0+cG9ydCA9PSBwb3J0KQorCQkJcmV0dXJuIGRybV9jcnRjX21hc2soaW14X2RybV9jcnRjLT5jcnRjKTsKIAl9CiAKLQlpbXhfZHJtX2VuY29kZXIgPSBremFsbG9jKHNpemVvZigqaW14X2RybV9lbmNvZGVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbXhfZHJtX2VuY29kZXIpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfYWxsb2M7Ci0JfQotCi0JaW14X2RybV9lbmNvZGVyLT5lbmNvZGVyID0gZW5jb2RlcjsKLQlpbXhfZHJtX2VuY29kZXItPm93bmVyID0gb3duZXI7Ci0KLQlyZXQgPSBpbXhfZHJtX2VuY29kZXJfcmVnaXN0ZXIoaW14X2RybV9lbmNvZGVyKTsKLQlpZiAocmV0KSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3JlZ2lzdGVyOwotCX0KLQotCWxpc3RfYWRkX3RhaWwoJmlteF9kcm1fZW5jb2Rlci0+bGlzdCwgJmlteGRybS0+ZW5jb2Rlcl9saXN0KTsKLQotCSpuZXdlbmMgPSBpbXhfZHJtX2VuY29kZXI7Ci0KLQltdXRleF91bmxvY2soJmlteGRybS0+bXV0ZXgpOwotCiAJcmV0dXJuIDA7Ci0KLWVycl9yZWdpc3RlcjoKLQlrZnJlZShpbXhfZHJtX2VuY29kZXIpOwotZXJyX2FsbG9jOgotZXJyX2J1c3k6Ci0JbXV0ZXhfdW5sb2NrKCZpbXhkcm0tPm11dGV4KTsKLQotCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX2FkZF9lbmNvZGVyKTsKIAotaW50IGlteF9kcm1fZW5jb2Rlcl9hZGRfcG9zc2libGVfY3J0Y3MoCi0JCXN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKmlteF9kcm1fZW5jb2RlciwKLQkJc3RydWN0IGRldmljZV9ub2RlICpucCkKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKmlteF9kcm1fb2ZfZ2V0X25leHRfZW5kcG9pbnQoCisJCWNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKnByZXYpCiB7Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7Ci0Jc3RydWN0IG9mX3BoYW5kbGVfYXJncyBhcmdzOwotCXN0cnVjdCBjcnRjX2Nvb2tpZSAqYzsKLQlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBvZl9ncmFwaF9nZXRfbmV4dF9lbmRwb2ludChwYXJlbnQsIHByZXYpOworCW9mX25vZGVfcHV0KHByZXYpOworCXJldHVybiBub2RlOworfQorCitpbnQgaW14X2RybV9lbmNvZGVyX3BhcnNlX29mKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sCisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gZHJtLT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmVwID0gTlVMTDsKKwl1aW50MzJfdCBjcnRjX21hc2sgPSAwOwogCWludCBpOwogCi0JaWYgKCFsaXN0X2VtcHR5KCZpbXhfZHJtX2VuY29kZXItPnBvc3NpYmxlX2NydGNzKSkKLQkJcmV0dXJuIC1FQlVTWTsKKwlmb3IgKGkgPSAwOyA7IGkrKykgeworCQl1MzIgbWFzazsKIAotCWZvciAoaSA9IDA7ICFyZXQ7IGkrKykgewotCQlyZXQgPSBvZl9wYXJzZV9waGFuZGxlX3dpdGhfYXJncyhucCwgImNydGNzIiwKLQkJCQkiI2NydGMtY2VsbHMiLCBpLCAmYXJncyk7Ci0JCWlmIChyZXQgPCAwKQorCQllcCA9IGlteF9kcm1fb2ZfZ2V0X25leHRfZW5kcG9pbnQobnAsIGVwKTsKKwkJaWYgKCFlcCkKIAkJCWJyZWFrOwogCi0JCWMgPSBremFsbG9jKHNpemVvZigqYyksIEdGUF9LRVJORUwpOwotCQlpZiAoIWMpIHsKLQkJCW9mX25vZGVfcHV0KGFyZ3MubnApOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KKwkJbWFzayA9IGlteF9kcm1fZmluZF9jcnRjX21hc2soaW14ZHJtLCBlcCk7CiAKLQkJYy0+Y29va2llID0gYXJncy5ucDsKLQkJYy0+aWQgPSBhcmdzLmFyZ3NfY291bnQgPiAwID8gYXJncy5hcmdzWzBdIDogMDsKKwkJLyoKKwkJICogSWYgd2UgZmFpbGVkIHRvIGZpbmQgdGhlIENSVEMocykgd2hpY2ggdGhpcyBlbmNvZGVyIGlzCisJCSAqIHN1cHBvc2VkIHRvIGJlIGNvbm5lY3RlZCB0bywgaXQncyBiZWNhdXNlIHRoZSBDUlRDIGhhcworCQkgKiBub3QgYmVlbiByZWdpc3RlcmVkIHlldC4gIERlZmVyIHByb2JpbmcsIGFuZCBob3BlIHRoYXQKKwkJICogdGhlIHJlcXVpcmVkIENSVEMgaXMgYWRkZWQgbGF0ZXIuCisJCSAqLworCQlpZiAobWFzayA9PSAwKQorCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CiAKLQkJb2Zfbm9kZV9wdXQoYXJncy5ucCk7Ci0KLQkJbXV0ZXhfbG9jaygmaW14ZHJtLT5tdXRleCk7Ci0KLQkJbGlzdF9hZGRfdGFpbCgmYy0+bGlzdCwgJmlteF9kcm1fZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MpOwotCi0JCW11dGV4X3VubG9jaygmaW14ZHJtLT5tdXRleCk7CisJCWNydGNfbWFzayB8PSBtYXNrOwogCX0KIAotCWlteF9kcm1fdXBkYXRlX3Bvc3NpYmxlX2NydGNzKCk7CisJaWYgKGVwKQorCQlvZl9ub2RlX3B1dChlcCk7CisJaWYgKGkgPT0gMCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IGNydGNfbWFzazsKKworCS8qIEZJWE1FOiB0aGlzIGlzIHRoZSBtYXNrIG9mIG91dHB1dHMgd2hpY2ggY2FuIGNsb25lIHRoaXMgb3V0cHV0LiAqLworCWVuY29kZXItPnBvc3NpYmxlX2Nsb25lcyA9IH4wOwogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX2VuY29kZXJfYWRkX3Bvc3NpYmxlX2NydGNzKTsKLQotaW50IGlteF9kcm1fZW5jb2Rlcl9nZXRfbXV4X2lkKHN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKmlteF9kcm1fZW5jb2RlciwKLQkJc3RydWN0IGRybV9jcnRjICpjcnRjKQotewotCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gX19pbXhfZHJtX2RldmljZSgpOwotCXN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9jcnRjOwotCWludCBpID0gMDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW14X2NydGMsICZpbXhkcm0tPmNydGNfbGlzdCwgbGlzdCkgewotCQlpZiAoaW14X2NydGMtPmNydGMgPT0gY3J0YykKLQkJCWdvdG8gZm91bmQ7Ci0JCWkrKzsKLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLWZvdW5kOgotCXJldHVybiBpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9lbmNvZGVyX2dldF9tdXhfaWQpOworRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9lbmNvZGVyX3BhcnNlX29mKTsKIAogLyoKLSAqIGlteF9kcm1fcmVtb3ZlX2VuY29kZXIgLSByZW1vdmUgYW4gZW5jb2RlcgorICogQG5vZGU6IGRldmljZSB0cmVlIG5vZGUgY29udGFpbmluZyBlbmNvZGVyIGlucHV0IHBvcnRzCisgKiBAZW5jb2RlcjogZHJtX2VuY29kZXIKICAqLwotaW50IGlteF9kcm1fcmVtb3ZlX2VuY29kZXIoc3RydWN0IGlteF9kcm1fZW5jb2RlciAqaW14X2RybV9lbmNvZGVyKQoraW50IGlteF9kcm1fZW5jb2Rlcl9nZXRfbXV4X2lkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7Ci0Jc3RydWN0IGNydGNfY29va2llICpjLCAqdG1wOwotCi0JbXV0ZXhfbG9jaygmaW14ZHJtLT5tdXRleCk7Ci0KLQlpbXhfZHJtX2VuY29kZXJfdW5yZWdpc3RlcihpbXhfZHJtX2VuY29kZXIpOwotCi0JbGlzdF9kZWwoJmlteF9kcm1fZW5jb2Rlci0+bGlzdCk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYywgdG1wLCAmaW14X2RybV9lbmNvZGVyLT5wb3NzaWJsZV9jcnRjcywKLQkJCWxpc3QpCi0JCWtmcmVlKGMpOwotCi0JbXV0ZXhfdW5sb2NrKCZpbXhkcm0tPm11dGV4KTsKLQotCWtmcmVlKGlteF9kcm1fZW5jb2Rlcik7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlteF9kcm1fcmVtb3ZlX2VuY29kZXIpOwotCi0vKgotICogaW14X2RybV9hZGRfY29ubmVjdG9yIC0gYWRkIGEgY29ubmVjdG9yCi0gKi8KLWludCBpbXhfZHJtX2FkZF9jb25uZWN0b3Ioc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKLQkJc3RydWN0IGlteF9kcm1fY29ubmVjdG9yICoqbmV3X2NvbiwKLQkJc3RydWN0IG1vZHVsZSAqb3duZXIpCi17Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7Ci0Jc3RydWN0IGlteF9kcm1fY29ubmVjdG9yICppbXhfZHJtX2Nvbm5lY3RvcjsKKwlzdHJ1Y3QgaW14X2RybV9jcnRjICppbXhfY3J0YyA9IGlteF9kcm1fZmluZF9jcnRjKGVuY29kZXItPmNydGMpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZXAgPSBOVUxMOworCXN0cnVjdCBvZl9lbmRwb2ludCBlbmRwb2ludDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBvcnQ7CiAJaW50IHJldDsKIAotCW11dGV4X2xvY2soJmlteGRybS0+bXV0ZXgpOworCWlmICghbm9kZSB8fCAhaW14X2NydGMpCisJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGlteGRybS0+ZHJtLT5vcGVuX2NvdW50KSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBlcnJfYnVzeTsKLQl9CisJZG8geworCQllcCA9IGlteF9kcm1fb2ZfZ2V0X25leHRfZW5kcG9pbnQobm9kZSwgZXApOworCQlpZiAoIWVwKQorCQkJYnJlYWs7CiAKLQlpbXhfZHJtX2Nvbm5lY3RvciA9IGt6YWxsb2Moc2l6ZW9mKCppbXhfZHJtX2Nvbm5lY3RvciksIEdGUF9LRVJORUwpOwotCWlmICghaW14X2RybV9jb25uZWN0b3IpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfYWxsb2M7Ci0JfQorCQlwb3J0ID0gb2ZfZ3JhcGhfZ2V0X3JlbW90ZV9wb3J0KGVwKTsKKwkJb2Zfbm9kZV9wdXQocG9ydCk7CisJCWlmIChwb3J0ID09IGlteF9jcnRjLT5wb3J0KSB7CisJCQlyZXQgPSBvZl9ncmFwaF9wYXJzZV9lbmRwb2ludChlcCwgJmVuZHBvaW50KTsKKwkJCXJldHVybiByZXQgPyByZXQgOiBlbmRwb2ludC5pZDsKKwkJfQorCX0gd2hpbGUgKGVwKTsKIAotCWlteF9kcm1fY29ubmVjdG9yLT5jb25uZWN0b3IgPSBjb25uZWN0b3I7Ci0JaW14X2RybV9jb25uZWN0b3ItPm93bmVyID0gb3duZXI7Ci0KLQlyZXQgPSBpbXhfZHJtX2Nvbm5lY3Rvcl9yZWdpc3RlcihpbXhfZHJtX2Nvbm5lY3Rvcik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfcmVnaXN0ZXI7Ci0KLQlsaXN0X2FkZF90YWlsKCZpbXhfZHJtX2Nvbm5lY3Rvci0+bGlzdCwgJmlteGRybS0+Y29ubmVjdG9yX2xpc3QpOwotCi0JKm5ld19jb24gPSBpbXhfZHJtX2Nvbm5lY3RvcjsKLQotCW11dGV4X3VubG9jaygmaW14ZHJtLT5tdXRleCk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX3JlZ2lzdGVyOgotCWtmcmVlKGlteF9kcm1fY29ubmVjdG9yKTsKLWVycl9hbGxvYzoKLWVycl9idXN5OgotCW11dGV4X3VubG9jaygmaW14ZHJtLT5tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiAtRUlOVkFMOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9hZGRfY29ubmVjdG9yKTsKLQotdm9pZCBpbXhfZHJtX2ZiX2hlbHBlcl9zZXQoc3RydWN0IGRybV9mYmRldl9jbWEgKmZiZGV2X2hlbHBlcikKLXsKLQlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IF9faW14X2RybV9kZXZpY2UoKTsKLQotCWlteGRybS0+ZmJoZWxwZXIgPSBmYmRldl9oZWxwZXI7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX2ZiX2hlbHBlcl9zZXQpOwotCi0vKgotICogaW14X2RybV9yZW1vdmVfY29ubmVjdG9yIC0gcmVtb3ZlIGEgY29ubmVjdG9yCi0gKi8KLWludCBpbXhfZHJtX3JlbW92ZV9jb25uZWN0b3Ioc3RydWN0IGlteF9kcm1fY29ubmVjdG9yICppbXhfZHJtX2Nvbm5lY3RvcikKLXsKLQlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IF9faW14X2RybV9kZXZpY2UoKTsKLQotCW11dGV4X2xvY2soJmlteGRybS0+bXV0ZXgpOwotCi0JaW14X2RybV9jb25uZWN0b3JfdW5yZWdpc3RlcihpbXhfZHJtX2Nvbm5lY3Rvcik7Ci0KLQlsaXN0X2RlbCgmaW14X2RybV9jb25uZWN0b3ItPmxpc3QpOwotCi0JbXV0ZXhfdW5sb2NrKCZpbXhkcm0tPm11dGV4KTsKLQotCWtmcmVlKGlteF9kcm1fY29ubmVjdG9yKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9yZW1vdmVfY29ubmVjdG9yKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlteF9kcm1fZW5jb2Rlcl9nZXRfbXV4X2lkKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1faW9jdGxfZGVzYyBpbXhfZHJtX2lvY3Rsc1tdID0gewogCS8qIG5vbmUgc28gZmFyICovCkBAIC04MTksODAgKzU2NCwxNTYgQEAKIAkucGF0Y2hsZXZlbAkJPSAwLAogfTsKIAorc3RhdGljIGludCBjb21wYXJlX29mKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGF0YTsKKworCS8qIFNwZWNpYWwgY2FzZSBmb3IgTERCLCBvbmUgZGV2aWNlIGZvciB0d28gY2hhbm5lbHMgKi8KKwlpZiAob2Zfbm9kZV9jbXAobnAtPm5hbWUsICJsdmRzLWNoYW5uZWwiKSA9PSAwKSB7CisJCW5wID0gb2ZfZ2V0X3BhcmVudChucCk7CisJCW9mX25vZGVfcHV0KG5wKTsKKwl9CisKKwlyZXR1cm4gZGV2LT5vZl9ub2RlID09IG5wOworfQorCitzdGF0aWMgTElTVF9IRUFEKGlteF9kcm1fY29tcG9uZW50cyk7CisKK3N0YXRpYyBpbnQgaW14X2RybV9hZGRfY29tcG9uZW50cyhzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsIHN0cnVjdCBtYXN0ZXIgKm0pCit7CisJc3RydWN0IGlteF9kcm1fY29tcG9uZW50ICpjb21wb25lbnQ7CisJaW50IHJldDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29tcG9uZW50LCAmaW14X2RybV9jb21wb25lbnRzLCBsaXN0KSB7CisJCXJldCA9IGNvbXBvbmVudF9tYXN0ZXJfYWRkX2NoaWxkKG0sIGNvbXBhcmVfb2YsCisJCQkJCQkgY29tcG9uZW50LT5vZl9ub2RlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlteF9kcm1fYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRybV9wbGF0Zm9ybV9pbml0KCZpbXhfZHJtX2RyaXZlciwgdG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOworfQorCitzdGF0aWMgdm9pZCBpbXhfZHJtX3VuYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZHJtX3B1dF9kZXYoZGV2X2dldF9kcnZkYXRhKGRldikpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBvbmVudF9tYXN0ZXJfb3BzIGlteF9kcm1fb3BzID0geworCS5hZGRfY29tcG9uZW50cyA9IGlteF9kcm1fYWRkX2NvbXBvbmVudHMsCisJLmJpbmQgPSBpbXhfZHJtX2JpbmQsCisJLnVuYmluZCA9IGlteF9kcm1fdW5iaW5kLAorfTsKKworc3RhdGljIHN0cnVjdCBpbXhfZHJtX2NvbXBvbmVudCAqaW14X2RybV9maW5kX2NvbXBvbmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgaW14X2RybV9jb21wb25lbnQgKmNvbXBvbmVudDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29tcG9uZW50LCAmaW14X2RybV9jb21wb25lbnRzLCBsaXN0KQorCQlpZiAoY29tcG9uZW50LT5vZl9ub2RlID09IG5vZGUpCisJCQlyZXR1cm4gY29tcG9uZW50OworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaW14X2RybV9hZGRfY29tcG9uZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXN0cnVjdCBpbXhfZHJtX2NvbXBvbmVudCAqY29tcG9uZW50OworCisJaWYgKGlteF9kcm1fZmluZF9jb21wb25lbnQoZGV2LCBub2RlKSkKKwkJcmV0dXJuIDA7CisKKwljb21wb25lbnQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmNvbXBvbmVudCksIEdGUF9LRVJORUwpOworCWlmICghY29tcG9uZW50KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbXBvbmVudC0+b2Zfbm9kZSA9IG5vZGU7CisJbGlzdF9hZGRfdGFpbCgmY29tcG9uZW50LT5saXN0LCAmaW14X2RybV9jb21wb25lbnRzKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGlteF9kcm1fcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmVwLCAqcG9ydCwgKnJlbW90ZTsKIAlpbnQgcmV0OworCWludCBpOworCisJLyoKKwkgKiBCaW5kIHRoZSBJUFUgZGlzcGxheSBpbnRlcmZhY2UgcG9ydHMgZmlyc3QsIHNvIHRoYXQKKwkgKiBpbXhfZHJtX2VuY29kZXJfcGFyc2Vfb2YgY2FsbGVkIGZyb20gZW5jb2RlciAuYmluZCBjYWxsYmFja3MKKwkgKiB3b3JrcyBhcyBleHBlY3RlZC4KKwkgKi8KKwlmb3IgKGkgPSAwOyA7IGkrKykgeworCQlwb3J0ID0gb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwgInBvcnRzIiwgaSk7CisJCWlmICghcG9ydCkKKwkJCWJyZWFrOworCisJCXJldCA9IGlteF9kcm1fYWRkX2NvbXBvbmVudCgmcGRldi0+ZGV2LCBwb3J0KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChpID09IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibWlzc2luZyAncG9ydHMnIHByb3BlcnR5XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogVGhlbiBiaW5kIGFsbCBlbmNvZGVycyAqLworCWZvciAoaSA9IDA7IDsgaSsrKSB7CisJCXBvcnQgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLCAicG9ydHMiLCBpKTsKKwkJaWYgKCFwb3J0KQorCQkJYnJlYWs7CisKKwkJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShwb3J0LCBlcCkgeworCQkJcmVtb3RlID0gb2ZfZ3JhcGhfZ2V0X3JlbW90ZV9wb3J0X3BhcmVudChlcCk7CisJCQlpZiAoIXJlbW90ZSB8fCAhb2ZfZGV2aWNlX2lzX2F2YWlsYWJsZShyZW1vdGUpKSB7CisJCQkJb2Zfbm9kZV9wdXQocmVtb3RlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJcmV0ID0gaW14X2RybV9hZGRfY29tcG9uZW50KCZwZGV2LT5kZXYsIHJlbW90ZSk7CisJCQlvZl9ub2RlX3B1dChyZW1vdGUpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlvZl9ub2RlX3B1dChwb3J0KTsKKwl9CiAKIAlyZXQgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlteF9kcm1fZGV2aWNlLT5kZXYgPSAmcGRldi0+ZGV2OwotCi0JcmV0dXJuIGRybV9wbGF0Zm9ybV9pbml0KCZpbXhfZHJtX2RyaXZlciwgcGRldik7CisJcmV0dXJuIGNvbXBvbmVudF9tYXN0ZXJfYWRkKCZwZGV2LT5kZXYsICZpbXhfZHJtX29wcyk7CiB9CiAKIHN0YXRpYyBpbnQgaW14X2RybV9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlkcm1fcHV0X2RldihwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSk7Ci0KKwljb21wb25lbnRfbWFzdGVyX2RlbCgmcGRldi0+ZGV2LCAmaW14X2RybV9vcHMpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBpbXhfZHJtX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteC1kaXNwbGF5LXN1YnN5c3RlbSIsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGlteF9kcm1fZHRfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaW14X2RybV9wZHJ2ID0gewogCS5wcm9iZQkJPSBpbXhfZHJtX3BsYXRmb3JtX3Byb2JlLAogCS5yZW1vdmUJCT0gaW14X2RybV9wbGF0Zm9ybV9yZW1vdmUsCiAJLmRyaXZlcgkJPSB7CiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCQkubmFtZQk9ICJpbXgtZHJtIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gaW14X2RybV9kdF9pZHMsCiAJfSwKIH07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppbXhfZHJtX3BkZXY7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlteF9kcm1faW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlpbXhfZHJtX2RldmljZSA9IGt6YWxsb2Moc2l6ZW9mKCppbXhfZHJtX2RldmljZSksIEdGUF9LRVJORUwpOwotCWlmICghaW14X2RybV9kZXZpY2UpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbXV0ZXhfaW5pdCgmaW14X2RybV9kZXZpY2UtPm11dGV4KTsKLQlJTklUX0xJU1RfSEVBRCgmaW14X2RybV9kZXZpY2UtPmNydGNfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmlteF9kcm1fZGV2aWNlLT5jb25uZWN0b3JfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmlteF9kcm1fZGV2aWNlLT5lbmNvZGVyX2xpc3QpOwotCi0JaW14X2RybV9wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiaW14LWRybSIsIC0xLCBOVUxMLCAwKTsKLQlpZiAoSVNfRVJSKGlteF9kcm1fcGRldikpIHsKLQkJcmV0ID0gUFRSX0VSUihpbXhfZHJtX3BkZXYpOwotCQlnb3RvIGVycl9wZGV2OwotCX0KLQotCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaW14X2RybV9wZHJ2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9wZHJ2OwotCi0JcmV0dXJuIDA7Ci0KLWVycl9wZHJ2OgotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGlteF9kcm1fcGRldik7Ci1lcnJfcGRldjoKLQlrZnJlZShpbXhfZHJtX2RldmljZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaW14X2RybV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoaW14X2RybV9wZGV2KTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaW14X2RybV9wZHJ2KTsKLQotCWtmcmVlKGlteF9kcm1fZGV2aWNlKTsKLX0KLQotbW9kdWxlX2luaXQoaW14X2RybV9pbml0KTsKLW1vZHVsZV9leGl0KGlteF9kcm1fZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGlteF9kcm1fcGRydik7CiAKIE1PRFVMRV9BVVRIT1IoIlNhc2NoYSBIYXVlciA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiaS5NWCBkcm0gZHJpdmVyIGNvcmUiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1kcm0uaCBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1kcm0uaAppbmRleCBhZTkwYzljLi5hMzIyYmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtZHJtLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWRybS5oCkBAIC0xLDE3ICsxLDE1IEBACiAjaWZuZGVmIF9JTVhfRFJNX0hfCiAjZGVmaW5lIF9JTVhfRFJNX0hfCiAKLSNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLQotI2RlZmluZSBJUFVfUElYX0ZNVF9HQlIyNAl2NGwyX2ZvdXJjYygnRycsICdCJywgJ1InLCAnMycpCi0KK3N0cnVjdCBkZXZpY2Vfbm9kZTsKIHN0cnVjdCBkcm1fY3J0YzsKIHN0cnVjdCBkcm1fY29ubmVjdG9yOwogc3RydWN0IGRybV9kZXZpY2U7CitzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZTsKIHN0cnVjdCBkcm1fZW5jb2RlcjsKLXN0cnVjdCBpbXhfZHJtX2NydGM7CiBzdHJ1Y3QgZHJtX2ZiZGV2X2NtYTsKIHN0cnVjdCBkcm1fZnJhbWVidWZmZXI7CitzdHJ1Y3QgaW14X2RybV9jcnRjOwogc3RydWN0IHBsYXRmb3JtX2RldmljZTsKIAogaW50IGlteF9kcm1fY3J0Y19pZChzdHJ1Y3QgaW14X2RybV9jcnRjICpjcnRjKTsKQEAgLTI1LDEwICsyMywxMCBAQAogCWNvbnN0IHN0cnVjdCBkcm1fY3J0Y19mdW5jcyAqY3J0Y19mdW5jczsKIH07CiAKLWludCBpbXhfZHJtX2FkZF9jcnRjKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKK2ludCBpbXhfZHJtX2FkZF9jcnRjKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sIHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKIAkJc3RydWN0IGlteF9kcm1fY3J0YyAqKm5ld19jcnRjLAogCQljb25zdCBzdHJ1Y3QgaW14X2RybV9jcnRjX2hlbHBlcl9mdW5jcyAqaW14X2hlbHBlcl9mdW5jcywKLQkJc3RydWN0IG1vZHVsZSAqb3duZXIsIHZvaWQgKmNvb2tpZSwgaW50IGlkKTsKKwkJc3RydWN0IGRldmljZV9ub2RlICpwb3J0KTsKIGludCBpbXhfZHJtX3JlbW92ZV9jcnRjKHN0cnVjdCBpbXhfZHJtX2NydGMgKik7CiBpbnQgaW14X2RybV9pbml0X2RybShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAogCQlpbnQgcHJlZmVycmVkX2JwcCk7CkBAIC0zOCwzNSArMzYsMjMgQEAKIHZvaWQgaW14X2RybV9jcnRjX3ZibGFua19wdXQoc3RydWN0IGlteF9kcm1fY3J0YyAqaW14X2RybV9jcnRjKTsKIHZvaWQgaW14X2RybV9oYW5kbGVfdmJsYW5rKHN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9kcm1fY3J0Yyk7CiAKLXN0cnVjdCBpbXhfZHJtX2VuY29kZXI7Ci1pbnQgaW14X2RybV9hZGRfZW5jb2RlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCi0JCXN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKipuZXdfZW5jLAotCQlzdHJ1Y3QgbW9kdWxlICpvd25lcik7Ci1pbnQgaW14X2RybV9yZW1vdmVfZW5jb2RlcihzdHJ1Y3QgaW14X2RybV9lbmNvZGVyICopOwotCi1zdHJ1Y3QgaW14X2RybV9jb25uZWN0b3I7Ci1pbnQgaW14X2RybV9hZGRfY29ubmVjdG9yKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCi0JCXN0cnVjdCBpbXhfZHJtX2Nvbm5lY3RvciAqKm5ld19jb24sCi0JCXN0cnVjdCBtb2R1bGUgKm93bmVyKTsKLWludCBpbXhfZHJtX3JlbW92ZV9jb25uZWN0b3Ioc3RydWN0IGlteF9kcm1fY29ubmVjdG9yICopOwotCiB2b2lkIGlteF9kcm1fbW9kZV9jb25maWdfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZHJtKTsKIAogc3RydWN0IGRybV9nZW1fY21hX29iamVjdCAqaW14X2RybV9mYl9nZXRfb2JqKHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiKTsKIAotc3RydWN0IGRybV9kZXZpY2UgKmlteF9kcm1fZGV2aWNlX2dldCh2b2lkKTsKLXZvaWQgaW14X2RybV9kZXZpY2VfcHV0KHZvaWQpOwotaW50IGlteF9kcm1fY3J0Y19wYW5lbF9mb3JtYXRfcGlucyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHUzMiBlbmNvZGVyX3R5cGUsCitpbnQgaW14X2RybV9wYW5lbF9mb3JtYXRfcGlucyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCiAJCXUzMiBpbnRlcmZhY2VfcGl4X2ZtdCwgaW50IGhzeW5jX3BpbiwgaW50IHZzeW5jX3Bpbik7Ci1pbnQgaW14X2RybV9jcnRjX3BhbmVsX2Zvcm1hdChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHUzMiBlbmNvZGVyX3R5cGUsCitpbnQgaW14X2RybV9wYW5lbF9mb3JtYXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAogCQl1MzIgaW50ZXJmYWNlX3BpeF9mbXQpOwotdm9pZCBpbXhfZHJtX2ZiX2hlbHBlcl9zZXQoc3RydWN0IGRybV9mYmRldl9jbWEgKmZiZGV2X2hlbHBlcik7CiAKLXN0cnVjdCBkZXZpY2Vfbm9kZTsKK2ludCBpbXhfZHJtX2VuY29kZXJfZ2V0X211eF9pZChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CitpbnQgaW14X2RybV9lbmNvZGVyX3BhcnNlX29mKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sCisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKIAotaW50IGlteF9kcm1fZW5jb2Rlcl9nZXRfbXV4X2lkKHN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKmlteF9kcm1fZW5jb2RlciwKLQkJc3RydWN0IGRybV9jcnRjICpjcnRjKTsKLWludCBpbXhfZHJtX2VuY29kZXJfYWRkX3Bvc3NpYmxlX2NydGNzKHN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKmlteF9kcm1fZW5jb2RlciwKLQkJc3RydWN0IGRldmljZV9ub2RlICpucCk7CitpbnQgaW14X2RybV9jb25uZWN0b3JfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsKK3ZvaWQgaW14X2RybV9jb25uZWN0b3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKK3ZvaWQgaW14X2RybV9lbmNvZGVyX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKIAogI2VuZGlmIC8qIF9JTVhfRFJNX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtZmIuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1mYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2E3YjRlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1mYi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIGkuTVggZHJtIGRyaXZlcgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBTYXNjaGEgSGF1ZXIsIFBlbmd1dHJvbml4Ci0gKgotICogQmFzZWQgb24gU2Ftc3VuZyBFeHlub3MgY29kZQotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGRybS9kcm1QLmg+Ci0jaW5jbHVkZSA8ZHJtL2RybV9jcnRjLmg+Ci0jaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgotI2luY2x1ZGUgPGRybS9kcm1fZ2VtX2NtYV9oZWxwZXIuaD4KLSNpbmNsdWRlIDxkcm0vZHJtX2ZiX2NtYV9oZWxwZXIuaD4KLQotI2luY2x1ZGUgImlteC1kcm0uaCIKLQotc3RhdGljIHN0cnVjdCBkcm1fbW9kZV9jb25maWdfZnVuY3MgaW14X2RybV9tb2RlX2NvbmZpZ19mdW5jcyA9IHsKLQkuZmJfY3JlYXRlID0gZHJtX2ZiX2NtYV9jcmVhdGUsCi19OwotCi12b2lkIGlteF9kcm1fbW9kZV9jb25maWdfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCWRldi0+bW9kZV9jb25maWcubWluX3dpZHRoID0gNjQ7Ci0JZGV2LT5tb2RlX2NvbmZpZy5taW5faGVpZ2h0ID0gNjQ7Ci0KLQkvKgotCSAqIHNldCBtYXggd2lkdGggYW5kIGhlaWdodCBhcyBkZWZhdWx0IHZhbHVlKDQwOTZ4NDA5NikuCi0JICogdGhpcyB2YWx1ZSB3b3VsZCBiZSB1c2VkIHRvIGNoZWNrIGZyYW1lYnVmZmVyIHNpemUgbGltaXRhdGlvbgotCSAqIGF0IGRybV9tb2RlX2FkZGZiKCkuCi0JICovCi0JZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSA0MDk2OwotCWRldi0+bW9kZV9jb25maWcubWF4X2hlaWdodCA9IDQwOTY7Ci0KLQlkZXYtPm1vZGVfY29uZmlnLmZ1bmNzID0gJmlteF9kcm1fbW9kZV9jb25maWdfZnVuY3M7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtZmJkZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1mYmRldi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzMxNzM5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1mYmRldi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIGkuTVggZHJtIGRyaXZlcgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBTYXNjaGEgSGF1ZXIsIFBlbmd1dHJvbml4Ci0gKgotICogQmFzZWQgb24gU2Ftc3VuZyBFeHlub3MgY29kZQotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGRybS9kcm1QLmg+Ci0jaW5jbHVkZSA8ZHJtL2RybV9jcnRjLmg+Ci0jaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgotI2luY2x1ZGUgPGRybS9kcm1fZmJfY21hX2hlbHBlci5oPgotCi0jaW5jbHVkZSAiaW14LWRybS5oIgotCi0jZGVmaW5lIE1BWF9DT05ORUNUT1IJCTQKLSNkZWZpbmUgUFJFRkVSUkVEX0JQUAkJMTYKLQotc3RhdGljIHN0cnVjdCBkcm1fZmJkZXZfY21hICpmYmRldl9jbWE7Ci0KLXN0YXRpYyBpbnQgbGVnYWN5ZmJfZGVwdGggPSAxNjsKLQotbW9kdWxlX3BhcmFtKGxlZ2FjeWZiX2RlcHRoLCBpbnQsIDA0NDQpOwotCi1zdGF0aWMgaW50IF9faW5pdCBpbXhfZmJfaGVscGVyX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtID0gaW14X2RybV9kZXZpY2VfZ2V0KCk7Ci0KLQlpZiAoIWRybSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAobGVnYWN5ZmJfZGVwdGggIT0gMTYgJiYgbGVnYWN5ZmJfZGVwdGggIT0gMzIpIHsKLQkJcHJfd2FybigiaS5NWCBsZWdhY3lmYjogaW52YWxpZCBsZWdhY3lmYl9kZXB0aCBzZXR0aW5nLiBkZWZhdWx0aW5nIHRvIDE2YnBwXG4iKTsKLQkJbGVnYWN5ZmJfZGVwdGggPSAxNjsKLQl9Ci0KLQlmYmRldl9jbWEgPSBkcm1fZmJkZXZfY21hX2luaXQoZHJtLCBsZWdhY3lmYl9kZXB0aCwKLQkJCWRybS0+bW9kZV9jb25maWcubnVtX2NydGMsIE1BWF9DT05ORUNUT1IpOwotCi0JaWYgKElTX0VSUihmYmRldl9jbWEpKSB7Ci0JCWlteF9kcm1fZGV2aWNlX3B1dCgpOwotCQlyZXR1cm4gUFRSX0VSUihmYmRldl9jbWEpOwotCX0KLQotCWlteF9kcm1fZmJfaGVscGVyX3NldChmYmRldl9jbWEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpbXhfZmJfaGVscGVyX2V4aXQodm9pZCkKLXsKLQlpbXhfZHJtX2ZiX2hlbHBlcl9zZXQoTlVMTCk7Ci0JZHJtX2ZiZGV2X2NtYV9maW5pKGZiZGV2X2NtYSk7Ci0JaW14X2RybV9kZXZpY2VfcHV0KCk7Ci19Ci0KLWxhdGVfaW5pdGNhbGwoaW14X2ZiX2hlbHBlcl9pbml0KTsKLW1vZHVsZV9leGl0KGlteF9mYl9oZWxwZXJfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiRnJlZXNjYWxlIGkuTVggbGVnYWN5IGZiIGRyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiU2FzY2hhIEhhdWVyLCBQZW5ndXRyb25peCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWhkbWkuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1oZG1pLmMKaW5kZXggNjJjZTBlOC4uZDQ3ZGVkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWhkbWkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtaGRtaS5jCkBAIC0xMiw2ICsxMiw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEd1ZW5uYWRpIExpYWtob3ZldHNraSA8Zy5saWFraG92ZXRza2lAZ214LmRlPgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jb21wb25lbnQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgpAQCAtMTEyLDE1ICsxMTMsMTUgQEAKIAogc3RydWN0IGlteF9oZG1pIHsKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBjb25uZWN0b3I7Ci0Jc3RydWN0IGlteF9kcm1fY29ubmVjdG9yICppbXhfZHJtX2Nvbm5lY3RvcjsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgZW5jb2RlcjsKLQlzdHJ1Y3QgaW14X2RybV9lbmNvZGVyICppbXhfZHJtX2VuY29kZXI7CiAKIAllbnVtIGlteF9oZG1pX2RldnR5cGUgZGV2X3R5cGU7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBjbGsgKmlzZnJfY2xrOwogCXN0cnVjdCBjbGsgKmlhaGJfY2xrOwogCisJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBjb25uZWN0b3Jfc3RhdHVzOworCiAJc3RydWN0IGhkbWlfZGF0YV9pbmZvIGhkbWlfZGF0YTsKIAlpbnQgdmljOwogCkBAIC0xMzQsNyArMTM1LDYgQEAKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmRkYzsKIAl2b2lkIF9faW9tZW0gKnJlZ3M7CiAKLQl1bnNpZ25lZCBsb25nIHBpeGVsX2Nsa19yYXRlOwogCXVuc2lnbmVkIGludCBzYW1wbGVfcmF0ZTsKIAlpbnQgcmF0aW87CiB9OwpAQCAtMTU2LDM3ICsxNTYsMzQgQEAKIAlyZXR1cm4gcmVhZGIoaGRtaS0+cmVncyArIG9mZnNldCk7CiB9CiAKK3N0YXRpYyB2b2lkIGhkbWlfbW9kYihzdHJ1Y3QgaW14X2hkbWkgKmhkbWksIHU4IGRhdGEsIHU4IG1hc2ssIHVuc2lnbmVkIHJlZykKK3sKKwl1OCB2YWwgPSBoZG1pX3JlYWRiKGhkbWksIHJlZykgJiB+bWFzazsKKwl2YWwgfD0gZGF0YSAmIG1hc2s7CisJaGRtaV93cml0ZWIoaGRtaSwgdmFsLCByZWcpOworfQorCiBzdGF0aWMgdm9pZCBoZG1pX21hc2tfd3JpdGViKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSwgdTggZGF0YSwgdW5zaWduZWQgaW50IHJlZywKIAkJICAgICAgdTggc2hpZnQsIHU4IG1hc2spCiB7Ci0JdTggdmFsdWUgPSBoZG1pX3JlYWRiKGhkbWksIHJlZykgJiB+bWFzazsKLQl2YWx1ZSB8PSAoZGF0YSA8PCBzaGlmdCkgJiBtYXNrOwotCWhkbWlfd3JpdGViKGhkbWksIHZhbHVlLCByZWcpOworCWhkbWlfbW9kYihoZG1pLCBkYXRhIDw8IHNoaWZ0LCBtYXNrLCByZWcpOwogfQogCiBzdGF0aWMgdm9pZCBoZG1pX3NldF9jbG9ja19yZWdlbmVyYXRvcl9uKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSwKIAkJCQkJIHVuc2lnbmVkIGludCB2YWx1ZSkKIHsKLQl1OCB2YWw7Ci0KIAloZG1pX3dyaXRlYihoZG1pLCB2YWx1ZSAmIDB4ZmYsIEhETUlfQVVEX04xKTsKIAloZG1pX3dyaXRlYihoZG1pLCAodmFsdWUgPj4gOCkgJiAweGZmLCBIRE1JX0FVRF9OMik7CiAJaGRtaV93cml0ZWIoaGRtaSwgKHZhbHVlID4+IDE2KSAmIDB4MGYsIEhETUlfQVVEX04zKTsKIAogCS8qIG5zaGlmdCBmYWN0b3IgPSAwICovCi0JdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX0FVRF9DVFMzKTsKLQl2YWwgJj0gfkhETUlfQVVEX0NUUzNfTl9TSElGVF9NQVNLOwotCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9BVURfQ1RTMyk7CisJaGRtaV9tb2RiKGhkbWksIDAsIEhETUlfQVVEX0NUUzNfTl9TSElGVF9NQVNLLCBIRE1JX0FVRF9DVFMzKTsKIH0KIAogc3RhdGljIHZvaWQgaGRtaV9yZWdlbmVyYXRlX2N0cyhzdHJ1Y3QgaW14X2hkbWkgKmhkbWksIHVuc2lnbmVkIGludCBjdHMpCiB7Ci0JdTggdmFsOwotCiAJLyogTXVzdCBiZSBzZXQvY2xlYXJlZCBmaXJzdCAqLwotCXZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9BVURfQ1RTMyk7Ci0JdmFsICY9IH5IRE1JX0FVRF9DVFMzX0NUU19NQU5VQUw7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX0FVRF9DVFMzKTsKKwloZG1pX21vZGIoaGRtaSwgMCwgSERNSV9BVURfQ1RTM19DVFNfTUFOVUFMLCBIRE1JX0FVRF9DVFMzKTsKIAogCWhkbWlfd3JpdGViKGhkbWksIGN0cyAmIDB4ZmYsIEhETUlfQVVEX0NUUzEpOwogCWhkbWlfd3JpdGViKGhkbWksIChjdHMgPj4gOCkgJiAweGZmLCBIRE1JX0FVRF9DVFMyKTsKQEAgLTMzMSwzNCArMzI4LDI1IEBACiAJCXJldHVybiAoY3RzICogcmF0aW8pIC8gMTAwOwogfQogCi1zdGF0aWMgdm9pZCBoZG1pX2dldF9waXhlbF9jbGsoc3RydWN0IGlteF9oZG1pICpoZG1pKQotewotCXVuc2lnbmVkIGxvbmcgcmF0ZTsKLQotCXJhdGUgPSA2NTAwMDAwMDsgLyogRklYTUUgKi8KLQotCWlmIChyYXRlKQotCQloZG1pLT5waXhlbF9jbGtfcmF0ZSA9IHJhdGU7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfc2V0X2Nsa19yZWdlbmVyYXRvcihzdHJ1Y3QgaW14X2hkbWkgKmhkbWkpCitzdGF0aWMgdm9pZCBoZG1pX3NldF9jbGtfcmVnZW5lcmF0b3Ioc3RydWN0IGlteF9oZG1pICpoZG1pLAorCXVuc2lnbmVkIGxvbmcgcGl4ZWxfY2xrKQogewogCXVuc2lnbmVkIGludCBjbGtfbiwgY2xrX2N0czsKIAotCWNsa19uID0gaGRtaV9jb21wdXRlX24oaGRtaS0+c2FtcGxlX3JhdGUsIGhkbWktPnBpeGVsX2Nsa19yYXRlLAorCWNsa19uID0gaGRtaV9jb21wdXRlX24oaGRtaS0+c2FtcGxlX3JhdGUsIHBpeGVsX2NsaywKIAkJCSAgICAgICBoZG1pLT5yYXRpbyk7Ci0JY2xrX2N0cyA9IGhkbWlfY29tcHV0ZV9jdHMoaGRtaS0+c2FtcGxlX3JhdGUsIGhkbWktPnBpeGVsX2Nsa19yYXRlLAorCWNsa19jdHMgPSBoZG1pX2NvbXB1dGVfY3RzKGhkbWktPnNhbXBsZV9yYXRlLCBwaXhlbF9jbGssCiAJCQkJICAgaGRtaS0+cmF0aW8pOwogCiAJaWYgKCFjbGtfY3RzKSB7CiAJCWRldl9kYmcoaGRtaS0+ZGV2LCAiJXM6IHBpeGVsIGNsb2NrIG5vdCBzdXBwb3J0ZWQ6ICVsdVxuIiwKLQkJCSBfX2Z1bmNfXywgaGRtaS0+cGl4ZWxfY2xrX3JhdGUpOworCQkJIF9fZnVuY19fLCBwaXhlbF9jbGspOwogCQlyZXR1cm47CiAJfQogCiAJZGV2X2RiZyhoZG1pLT5kZXYsICIlczogc2FtcGxlcmF0ZT0lZCAgcmF0aW89JWQgIHBpeGVsY2xrPSVsdSAgTj0lZCBjdHM9JWRcbiIsCiAJCV9fZnVuY19fLCBoZG1pLT5zYW1wbGVfcmF0ZSwgaGRtaS0+cmF0aW8sCi0JCWhkbWktPnBpeGVsX2Nsa19yYXRlLCBjbGtfbiwgY2xrX2N0cyk7CisJCXBpeGVsX2NsaywgY2xrX24sIGNsa19jdHMpOwogCiAJaGRtaV9zZXRfY2xvY2tfcmVnZW5lcmF0b3JfbihoZG1pLCBjbGtfbik7CiAJaGRtaV9yZWdlbmVyYXRlX2N0cyhoZG1pLCBjbGtfY3RzKTsKQEAgLTM2NiwzMiArMzU0LDEyIEBACiAKIHN0YXRpYyB2b2lkIGhkbWlfaW5pdF9jbGtfcmVnZW5lcmF0b3Ioc3RydWN0IGlteF9oZG1pICpoZG1pKQogewotCXVuc2lnbmVkIGludCBjbGtfbiwgY2xrX2N0czsKLQotCWNsa19uID0gaGRtaV9jb21wdXRlX24oaGRtaS0+c2FtcGxlX3JhdGUsIGhkbWktPnBpeGVsX2Nsa19yYXRlLAotCQkJICAgICAgIGhkbWktPnJhdGlvKTsKLQljbGtfY3RzID0gaGRtaV9jb21wdXRlX2N0cyhoZG1pLT5zYW1wbGVfcmF0ZSwgaGRtaS0+cGl4ZWxfY2xrX3JhdGUsCi0JCQkJICAgaGRtaS0+cmF0aW8pOwotCi0JaWYgKCFjbGtfY3RzKSB7Ci0JCWRldl9kYmcoaGRtaS0+ZGV2LCAiJXM6IHBpeGVsIGNsb2NrIG5vdCBzdXBwb3J0ZWQ6ICVsdVxuIiwKLQkJCSBfX2Z1bmNfXywgaGRtaS0+cGl4ZWxfY2xrX3JhdGUpOwotCQlyZXR1cm47Ci0JfQotCi0JZGV2X2RiZyhoZG1pLT5kZXYsICIlczogc2FtcGxlcmF0ZT0lZCAgcmF0aW89JWQgIHBpeGVsY2xrPSVsdSAgTj0lZCBjdHM9JWRcbiIsCi0JCV9fZnVuY19fLCBoZG1pLT5zYW1wbGVfcmF0ZSwgaGRtaS0+cmF0aW8sCi0JCWhkbWktPnBpeGVsX2Nsa19yYXRlLCBjbGtfbiwgY2xrX2N0cyk7Ci0KLQloZG1pX3NldF9jbG9ja19yZWdlbmVyYXRvcl9uKGhkbWksIGNsa19uKTsKLQloZG1pX3JlZ2VuZXJhdGVfY3RzKGhkbWksIGNsa19jdHMpOworCWhkbWlfc2V0X2Nsa19yZWdlbmVyYXRvcihoZG1pLCA3NDI1MDAwMCk7CiB9CiAKIHN0YXRpYyB2b2lkIGhkbWlfY2xrX3JlZ2VuZXJhdG9yX3VwZGF0ZV9waXhlbF9jbG9jayhzdHJ1Y3QgaW14X2hkbWkgKmhkbWkpCiB7Ci0JLyogR2V0IHBpeGVsIGNsb2NrIGZyb20gaXB1ICovCi0JaGRtaV9nZXRfcGl4ZWxfY2xrKGhkbWkpOwotCWhkbWlfc2V0X2Nsa19yZWdlbmVyYXRvcihoZG1pKTsKKwloZG1pX3NldF9jbGtfcmVnZW5lcmF0b3IoaGRtaSwgaGRtaS0+aGRtaV9kYXRhLnZpZGVvX21vZGUubXBpeGVsY2xvY2spOwogfQogCiAvKgpAQCAtNDU5LDM4ICs0MjcsNDUgQEAKIAogc3RhdGljIGludCBpc19jb2xvcl9zcGFjZV9jb252ZXJzaW9uKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSkKIHsKLQlyZXR1cm4gKGhkbWktPmhkbWlfZGF0YS5lbmNfaW5fZm9ybWF0ICE9Ci0JCWhkbWktPmhkbWlfZGF0YS5lbmNfb3V0X2Zvcm1hdCk7CisJcmV0dXJuIGhkbWktPmhkbWlfZGF0YS5lbmNfaW5fZm9ybWF0ICE9IGhkbWktPmhkbWlfZGF0YS5lbmNfb3V0X2Zvcm1hdDsKIH0KIAogc3RhdGljIGludCBpc19jb2xvcl9zcGFjZV9kZWNpbWF0aW9uKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSkKIHsKLQlyZXR1cm4gKChoZG1pLT5oZG1pX2RhdGEuZW5jX291dF9mb3JtYXQgPT0gWUNCQ1I0MjJfOEJJVFMpICYmCi0JCShoZG1pLT5oZG1pX2RhdGEuZW5jX2luX2Zvcm1hdCA9PSBSR0IgfHwKLQkJaGRtaS0+aGRtaV9kYXRhLmVuY19pbl9mb3JtYXQgPT0gWUNCQ1I0NDQpKTsKKwlpZiAoaGRtaS0+aGRtaV9kYXRhLmVuY19vdXRfZm9ybWF0ICE9IFlDQkNSNDIyXzhCSVRTKQorCQlyZXR1cm4gMDsKKwlpZiAoaGRtaS0+aGRtaV9kYXRhLmVuY19pbl9mb3JtYXQgPT0gUkdCIHx8CisJICAgIGhkbWktPmhkbWlfZGF0YS5lbmNfaW5fZm9ybWF0ID09IFlDQkNSNDQ0KQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBpc19jb2xvcl9zcGFjZV9pbnRlcnBvbGF0aW9uKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSkKIHsKLQlyZXR1cm4gKChoZG1pLT5oZG1pX2RhdGEuZW5jX2luX2Zvcm1hdCA9PSBZQ0JDUjQyMl84QklUUykgJiYKLQkJKGhkbWktPmhkbWlfZGF0YS5lbmNfb3V0X2Zvcm1hdCA9PSBSR0IgfHwKLQkJaGRtaS0+aGRtaV9kYXRhLmVuY19vdXRfZm9ybWF0ID09IFlDQkNSNDQ0KSk7CisJaWYgKGhkbWktPmhkbWlfZGF0YS5lbmNfaW5fZm9ybWF0ICE9IFlDQkNSNDIyXzhCSVRTKQorCQlyZXR1cm4gMDsKKwlpZiAoaGRtaS0+aGRtaV9kYXRhLmVuY19vdXRfZm9ybWF0ID09IFJHQiB8fAorCSAgICBoZG1pLT5oZG1pX2RhdGEuZW5jX291dF9mb3JtYXQgPT0gWUNCQ1I0NDQpCisJCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBpbXhfaGRtaV91cGRhdGVfY3NjX2NvZWZmcyhzdHJ1Y3QgaW14X2hkbWkgKmhkbWkpCiB7CiAJY29uc3QgdTE2ICgqY3NjX2NvZWZmKVszXVs0XSA9ICZjc2NfY29lZmZfZGVmYXVsdDsKKwl1bnNpZ25lZCBpOwogCXUzMiBjc2Nfc2NhbGUgPSAxOwotCXU4IHZhbDsKIAogCWlmIChpc19jb2xvcl9zcGFjZV9jb252ZXJzaW9uKGhkbWkpKSB7CiAJCWlmIChoZG1pLT5oZG1pX2RhdGEuZW5jX291dF9mb3JtYXQgPT0gUkdCKSB7Ci0JCQlpZiAoaGRtaS0+aGRtaV9kYXRhLmNvbG9yaW1ldHJ5ID09IEhETUlfQ09MT1JJTUVUUllfSVRVXzYwMSkKKwkJCWlmIChoZG1pLT5oZG1pX2RhdGEuY29sb3JpbWV0cnkgPT0KKwkJCQkJSERNSV9DT0xPUklNRVRSWV9JVFVfNjAxKQogCQkJCWNzY19jb2VmZiA9ICZjc2NfY29lZmZfcmdiX291dF9laXR1NjAxOwogCQkJZWxzZQogCQkJCWNzY19jb2VmZiA9ICZjc2NfY29lZmZfcmdiX291dF9laXR1NzA5OwogCQl9IGVsc2UgaWYgKGhkbWktPmhkbWlfZGF0YS5lbmNfaW5fZm9ybWF0ID09IFJHQikgewotCQkJaWYgKGhkbWktPmhkbWlfZGF0YS5jb2xvcmltZXRyeSA9PSBIRE1JX0NPTE9SSU1FVFJZX0lUVV82MDEpCisJCQlpZiAoaGRtaS0+aGRtaV9kYXRhLmNvbG9yaW1ldHJ5ID09CisJCQkJCUhETUlfQ09MT1JJTUVUUllfSVRVXzYwMSkKIAkJCQljc2NfY29lZmYgPSAmY3NjX2NvZWZmX3JnYl9pbl9laXR1NjAxOwogCQkJZWxzZQogCQkJCWNzY19jb2VmZiA9ICZjc2NfY29lZmZfcmdiX2luX2VpdHU3MDk7CkBAIC00OTgsMzcgKzQ3MywyNCBAQAogCQl9CiAJfQogCi0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVswXVswXSAmIDB4ZmYpLCBIRE1JX0NTQ19DT0VGX0ExX0xTQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVswXVswXSA+PiA4KSwgSERNSV9DU0NfQ09FRl9BMV9NU0IpOwotCWhkbWlfd3JpdGViKGhkbWksICgoKmNzY19jb2VmZilbMF1bMV0gJiAweGZmKSwgSERNSV9DU0NfQ09FRl9BMl9MU0IpOwotCWhkbWlfd3JpdGViKGhkbWksICgoKmNzY19jb2VmZilbMF1bMV0gPj4gOCksIEhETUlfQ1NDX0NPRUZfQTJfTVNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzBdWzJdICYgMHhmZiksIEhETUlfQ1NDX0NPRUZfQTNfTFNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzBdWzJdID4+IDgpLCBIRE1JX0NTQ19DT0VGX0EzX01TQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVswXVszXSAmIDB4ZmYpLCBIRE1JX0NTQ19DT0VGX0E0X0xTQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVswXVszXSA+PiA4KSwgSERNSV9DU0NfQ09FRl9BNF9NU0IpOworCS8qIFRoZSBDU0MgcmVnaXN0ZXJzIGFyZSBzZXF1ZW50aWFsLCBhbHRlcm5hdGluZyBNU0IgdGhlbiBMU0IgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjc2NfY29lZmZfZGVmYXVsdFswXSk7IGkrKykgeworCQl1MTYgY29lZmZfYSA9ICgqY3NjX2NvZWZmKVswXVtpXTsKKwkJdTE2IGNvZWZmX2IgPSAoKmNzY19jb2VmZilbMV1baV07CisJCXUxNiBjb2VmZl9jID0gKCpjc2NfY29lZmYpWzJdW2ldOwogCi0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsxXVswXSAmIDB4ZmYpLCBIRE1JX0NTQ19DT0VGX0IxX0xTQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsxXVswXSA+PiA4KSwgSERNSV9DU0NfQ09FRl9CMV9NU0IpOwotCWhkbWlfd3JpdGViKGhkbWksICgoKmNzY19jb2VmZilbMV1bMV0gJiAweGZmKSwgSERNSV9DU0NfQ09FRl9CMl9MU0IpOwotCWhkbWlfd3JpdGViKGhkbWksICgoKmNzY19jb2VmZilbMV1bMV0gPj4gOCksIEhETUlfQ1NDX0NPRUZfQjJfTVNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzFdWzJdICYgMHhmZiksIEhETUlfQ1NDX0NPRUZfQjNfTFNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzFdWzJdID4+IDgpLCBIRE1JX0NTQ19DT0VGX0IzX01TQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsxXVszXSAmIDB4ZmYpLCBIRE1JX0NTQ19DT0VGX0I0X0xTQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsxXVszXSA+PiA4KSwgSERNSV9DU0NfQ09FRl9CNF9NU0IpOworCQloZG1pX3dyaXRlYihoZG1pLCBjb2VmZl9hICYgMHhmZiwKKwkJCUhETUlfQ1NDX0NPRUZfQTFfTFNCICsgaSAqIDIpOworCQloZG1pX3dyaXRlYihoZG1pLCBjb2VmZl9hID4+IDgsIEhETUlfQ1NDX0NPRUZfQTFfTVNCICsgaSAqIDIpOworCQloZG1pX3dyaXRlYihoZG1pLCBjb2VmZl9iICYgMHhmZiwgSERNSV9DU0NfQ09FRl9CMV9MU0IgKyBpICogMik7CisJCWhkbWlfd3JpdGViKGhkbWksIGNvZWZmX2IgPj4gOCwgSERNSV9DU0NfQ09FRl9CMV9NU0IgKyBpICogMik7CisJCWhkbWlfd3JpdGViKGhkbWksIGNvZWZmX2MgJiAweGZmLAorCQkJSERNSV9DU0NfQ09FRl9DMV9MU0IgKyBpICogMik7CisJCWhkbWlfd3JpdGViKGhkbWksIGNvZWZmX2MgPj4gOCwgSERNSV9DU0NfQ09FRl9DMV9NU0IgKyBpICogMik7CisJfQogCi0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsyXVswXSAmIDB4ZmYpLCBIRE1JX0NTQ19DT0VGX0MxX0xTQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsyXVswXSA+PiA4KSwgSERNSV9DU0NfQ09FRl9DMV9NU0IpOwotCWhkbWlfd3JpdGViKGhkbWksICgoKmNzY19jb2VmZilbMl1bMV0gJiAweGZmKSwgSERNSV9DU0NfQ09FRl9DMl9MU0IpOwotCWhkbWlfd3JpdGViKGhkbWksICgoKmNzY19jb2VmZilbMl1bMV0gPj4gOCksIEhETUlfQ1NDX0NPRUZfQzJfTVNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzJdWzJdICYgMHhmZiksIEhETUlfQ1NDX0NPRUZfQzNfTFNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzJdWzJdID4+IDgpLCBIRE1JX0NTQ19DT0VGX0MzX01TQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsyXVszXSAmIDB4ZmYpLCBIRE1JX0NTQ19DT0VGX0M0X0xTQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsyXVszXSA+PiA4KSwgSERNSV9DU0NfQ09FRl9DNF9NU0IpOwotCi0JdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX0NTQ19TQ0FMRSk7Ci0JdmFsICY9IH5IRE1JX0NTQ19TQ0FMRV9DU0NTQ0FMRV9NQVNLOwotCXZhbCB8PSBjc2Nfc2NhbGUgJiBIRE1JX0NTQ19TQ0FMRV9DU0NTQ0FMRV9NQVNLOwotCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9DU0NfU0NBTEUpOworCWhkbWlfbW9kYihoZG1pLCBjc2Nfc2NhbGUsIEhETUlfQ1NDX1NDQUxFX0NTQ1NDQUxFX01BU0ssCisJCSAgSERNSV9DU0NfU0NBTEUpOwogfQogCiBzdGF0aWMgdm9pZCBoZG1pX3ZpZGVvX2NzYyhzdHJ1Y3QgaW14X2hkbWkgKmhkbWkpCkBAIC01MzYsNyArNDk4LDYgQEAKIAlpbnQgY29sb3JfZGVwdGggPSAwOwogCWludCBpbnRlcnBvbGF0aW9uID0gSERNSV9DU0NfQ0ZHX0lOVE1PREVfRElTQUJMRTsKIAlpbnQgZGVjaW1hdGlvbiA9IDA7Ci0JdTggdmFsOwogCiAJLyogWUNDNDIyIGludGVycG9sYXRpb24gdG8gNDQ0IG1vZGUgKi8KIAlpZiAoaXNfY29sb3Jfc3BhY2VfaW50ZXJwb2xhdGlvbihoZG1pKSkKQEAgLTU1NywxMCArNTE4LDggQEAKIAogCS8qIENvbmZpZ3VyZSB0aGUgQ1NDIHJlZ2lzdGVycyAqLwogCWhkbWlfd3JpdGViKGhkbWksIGludGVycG9sYXRpb24gfCBkZWNpbWF0aW9uLCBIRE1JX0NTQ19DRkcpOwotCXZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9DU0NfU0NBTEUpOwotCXZhbCAmPSB+SERNSV9DU0NfU0NBTEVfQ1NDX0NPTE9SREVfUFRIX01BU0s7Ci0JdmFsIHw9IGNvbG9yX2RlcHRoOwotCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9DU0NfU0NBTEUpOworCWhkbWlfbW9kYihoZG1pLCBjb2xvcl9kZXB0aCwgSERNSV9DU0NfU0NBTEVfQ1NDX0NPTE9SREVfUFRIX01BU0ssCisJCSAgSERNSV9DU0NfU0NBTEUpOwogCiAJaW14X2hkbWlfdXBkYXRlX2NzY19jb2VmZnMoaGRtaSk7CiB9CkBAIC01NzYsNyArNTM1LDcgQEAKIAl1bnNpZ25lZCBpbnQgcmVtYXBfc2l6ZSA9IEhETUlfVlBfUkVNQVBfWUNDNDIyXzE2Yml0OwogCXVuc2lnbmVkIGludCBvdXRwdXRfc2VsZWN0ID0gSERNSV9WUF9DT05GX09VVFBVVF9TRUxFQ1RPUl9QUDsKIAlzdHJ1Y3QgaGRtaV9kYXRhX2luZm8gKmhkbWlfZGF0YSA9ICZoZG1pLT5oZG1pX2RhdGE7Ci0JdTggdmFsOworCXU4IHZhbCwgdnBfY29uZjsKIAogCWlmIChoZG1pX2RhdGEtPmVuY19vdXRfZm9ybWF0ID09IFJHQgogCQl8fCBoZG1pX2RhdGEtPmVuY19vdXRfZm9ybWF0ID09IFlDQkNSNDQ0KSB7CkBAIC02MTUsMTA3ICs1NzQsNzUgQEAKIAkJSERNSV9WUF9QUl9DRF9ERVNJUkVEX1BSX0ZBQ1RPUl9NQVNLKTsKIAloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfVlBfUFJfQ0QpOwogCi0JdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX1ZQX1NUVUZGKTsKLQl2YWwgJj0gfkhETUlfVlBfU1RVRkZfUFJfU1RVRkZJTkdfTUFTSzsKLQl2YWwgfD0gSERNSV9WUF9TVFVGRl9QUl9TVFVGRklOR19TVFVGRklOR19NT0RFOwotCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9WUF9TVFVGRik7CisJaGRtaV9tb2RiKGhkbWksIEhETUlfVlBfU1RVRkZfUFJfU1RVRkZJTkdfU1RVRkZJTkdfTU9ERSwKKwkJICBIRE1JX1ZQX1NUVUZGX1BSX1NUVUZGSU5HX01BU0ssIEhETUlfVlBfU1RVRkYpOwogCiAJLyogRGF0YSBmcm9tIHBpeGVsIHJlcGVhdGVyIGJsb2NrICovCiAJaWYgKGhkbWlfZGF0YS0+cGl4X3JlcGV0X2ZhY3RvciA+IDEpIHsKLQkJdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX1ZQX0NPTkYpOwotCQl2YWwgJj0gfihIRE1JX1ZQX0NPTkZfUFJfRU5fTUFTSyB8Ci0JCQlIRE1JX1ZQX0NPTkZfQllQQVNTX1NFTEVDVF9NQVNLKTsKLQkJdmFsIHw9IEhETUlfVlBfQ09ORl9QUl9FTl9FTkFCTEUgfAotCQkJSERNSV9WUF9DT05GX0JZUEFTU19TRUxFQ1RfUElYX1JFUEVBVEVSOwotCQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfVlBfQ09ORik7CisJCXZwX2NvbmYgPSBIRE1JX1ZQX0NPTkZfUFJfRU5fRU5BQkxFIHwKKwkJCSAgSERNSV9WUF9DT05GX0JZUEFTU19TRUxFQ1RfUElYX1JFUEVBVEVSOwogCX0gZWxzZSB7IC8qIGRhdGEgZnJvbSBwYWNrZXRpemVyIGJsb2NrICovCi0JCXZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9WUF9DT05GKTsKLQkJdmFsICY9IH4oSERNSV9WUF9DT05GX1BSX0VOX01BU0sgfAotCQkJSERNSV9WUF9DT05GX0JZUEFTU19TRUxFQ1RfTUFTSyk7Ci0JCXZhbCB8PSBIRE1JX1ZQX0NPTkZfUFJfRU5fRElTQUJMRSB8Ci0JCQlIRE1JX1ZQX0NPTkZfQllQQVNTX1NFTEVDVF9WSURfUEFDS0VUSVpFUjsKLQkJaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX1ZQX0NPTkYpOworCQl2cF9jb25mID0gSERNSV9WUF9DT05GX1BSX0VOX0RJU0FCTEUgfAorCQkJICBIRE1JX1ZQX0NPTkZfQllQQVNTX1NFTEVDVF9WSURfUEFDS0VUSVpFUjsKIAl9CiAKLQl2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfVlBfU1RVRkYpOwotCXZhbCAmPSB+SERNSV9WUF9TVFVGRl9JREVGQVVMVF9QSEFTRV9NQVNLOwotCXZhbCB8PSAxIDw8IEhETUlfVlBfU1RVRkZfSURFRkFVTFRfUEhBU0VfT0ZGU0VUOwotCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9WUF9TVFVGRik7CisJaGRtaV9tb2RiKGhkbWksIHZwX2NvbmYsCisJCSAgSERNSV9WUF9DT05GX1BSX0VOX01BU0sgfAorCQkgIEhETUlfVlBfQ09ORl9CWVBBU1NfU0VMRUNUX01BU0ssIEhETUlfVlBfQ09ORik7CisKKwloZG1pX21vZGIoaGRtaSwgMSA8PCBIRE1JX1ZQX1NUVUZGX0lERUZBVUxUX1BIQVNFX09GRlNFVCwKKwkJICBIRE1JX1ZQX1NUVUZGX0lERUZBVUxUX1BIQVNFX01BU0ssIEhETUlfVlBfU1RVRkYpOwogCiAJaGRtaV93cml0ZWIoaGRtaSwgcmVtYXBfc2l6ZSwgSERNSV9WUF9SRU1BUCk7CiAKIAlpZiAob3V0cHV0X3NlbGVjdCA9PSBIRE1JX1ZQX0NPTkZfT1VUUFVUX1NFTEVDVE9SX1BQKSB7Ci0JCXZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9WUF9DT05GKTsKLQkJdmFsICY9IH4oSERNSV9WUF9DT05GX0JZUEFTU19FTl9NQVNLIHwKLQkJCUhETUlfVlBfQ09ORl9QUF9FTl9FTk1BU0sgfAotCQkJSERNSV9WUF9DT05GX1lDQzQyMl9FTl9NQVNLKTsKLQkJdmFsIHw9IEhETUlfVlBfQ09ORl9CWVBBU1NfRU5fRElTQUJMRSB8Ci0JCQlIRE1JX1ZQX0NPTkZfUFBfRU5fRU5BQkxFIHwKLQkJCUhETUlfVlBfQ09ORl9ZQ0M0MjJfRU5fRElTQUJMRTsKLQkJaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX1ZQX0NPTkYpOworCQl2cF9jb25mID0gSERNSV9WUF9DT05GX0JZUEFTU19FTl9ESVNBQkxFIHwKKwkJCSAgSERNSV9WUF9DT05GX1BQX0VOX0VOQUJMRSB8CisJCQkgIEhETUlfVlBfQ09ORl9ZQ0M0MjJfRU5fRElTQUJMRTsKIAl9IGVsc2UgaWYgKG91dHB1dF9zZWxlY3QgPT0gSERNSV9WUF9DT05GX09VVFBVVF9TRUxFQ1RPUl9ZQ0M0MjIpIHsKLQkJdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX1ZQX0NPTkYpOwotCQl2YWwgJj0gfihIRE1JX1ZQX0NPTkZfQllQQVNTX0VOX01BU0sgfAotCQkJSERNSV9WUF9DT05GX1BQX0VOX0VOTUFTSyB8Ci0JCQlIRE1JX1ZQX0NPTkZfWUNDNDIyX0VOX01BU0spOwotCQl2YWwgfD0gSERNSV9WUF9DT05GX0JZUEFTU19FTl9ESVNBQkxFIHwKLQkJCUhETUlfVlBfQ09ORl9QUF9FTl9ESVNBQkxFIHwKLQkJCUhETUlfVlBfQ09ORl9ZQ0M0MjJfRU5fRU5BQkxFOwotCQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfVlBfQ09ORik7CisJCXZwX2NvbmYgPSBIRE1JX1ZQX0NPTkZfQllQQVNTX0VOX0RJU0FCTEUgfAorCQkJICBIRE1JX1ZQX0NPTkZfUFBfRU5fRElTQUJMRSB8CisJCQkgIEhETUlfVlBfQ09ORl9ZQ0M0MjJfRU5fRU5BQkxFOwogCX0gZWxzZSBpZiAob3V0cHV0X3NlbGVjdCA9PSBIRE1JX1ZQX0NPTkZfT1VUUFVUX1NFTEVDVE9SX0JZUEFTUykgewotCQl2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfVlBfQ09ORik7Ci0JCXZhbCAmPSB+KEhETUlfVlBfQ09ORl9CWVBBU1NfRU5fTUFTSyB8Ci0JCQlIRE1JX1ZQX0NPTkZfUFBfRU5fRU5NQVNLIHwKLQkJCUhETUlfVlBfQ09ORl9ZQ0M0MjJfRU5fTUFTSyk7Ci0JCXZhbCB8PSBIRE1JX1ZQX0NPTkZfQllQQVNTX0VOX0VOQUJMRSB8Ci0JCQlIRE1JX1ZQX0NPTkZfUFBfRU5fRElTQUJMRSB8Ci0JCQlIRE1JX1ZQX0NPTkZfWUNDNDIyX0VOX0RJU0FCTEU7Ci0JCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9WUF9DT05GKTsKKwkJdnBfY29uZiA9IEhETUlfVlBfQ09ORl9CWVBBU1NfRU5fRU5BQkxFIHwKKwkJCSAgSERNSV9WUF9DT05GX1BQX0VOX0RJU0FCTEUgfAorCQkJICBIRE1JX1ZQX0NPTkZfWUNDNDIyX0VOX0RJU0FCTEU7CiAJfSBlbHNlIHsKIAkJcmV0dXJuOwogCX0KIAotCXZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9WUF9TVFVGRik7Ci0JdmFsICY9IH4oSERNSV9WUF9TVFVGRl9QUF9TVFVGRklOR19NQVNLIHwKLQkJSERNSV9WUF9TVFVGRl9ZQ0M0MjJfU1RVRkZJTkdfTUFTSyk7Ci0JdmFsIHw9IEhETUlfVlBfU1RVRkZfUFBfU1RVRkZJTkdfU1RVRkZJTkdfTU9ERSB8Ci0JCUhETUlfVlBfU1RVRkZfWUNDNDIyX1NUVUZGSU5HX1NUVUZGSU5HX01PREU7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX1ZQX1NUVUZGKTsKKwloZG1pX21vZGIoaGRtaSwgdnBfY29uZiwKKwkJICBIRE1JX1ZQX0NPTkZfQllQQVNTX0VOX01BU0sgfCBIRE1JX1ZQX0NPTkZfUFBfRU5fRU5NQVNLIHwKKwkJICBIRE1JX1ZQX0NPTkZfWUNDNDIyX0VOX01BU0ssIEhETUlfVlBfQ09ORik7CiAKLQl2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfVlBfQ09ORik7Ci0JdmFsICY9IH5IRE1JX1ZQX0NPTkZfT1VUUFVUX1NFTEVDVE9SX01BU0s7Ci0JdmFsIHw9IG91dHB1dF9zZWxlY3Q7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX1ZQX0NPTkYpOworCWhkbWlfbW9kYihoZG1pLCBIRE1JX1ZQX1NUVUZGX1BQX1NUVUZGSU5HX1NUVUZGSU5HX01PREUgfAorCQkJSERNSV9WUF9TVFVGRl9ZQ0M0MjJfU1RVRkZJTkdfU1RVRkZJTkdfTU9ERSwKKwkJICBIRE1JX1ZQX1NUVUZGX1BQX1NUVUZGSU5HX01BU0sgfAorCQkgIEhETUlfVlBfU1RVRkZfWUNDNDIyX1NUVUZGSU5HX01BU0ssIEhETUlfVlBfU1RVRkYpOworCisJaGRtaV9tb2RiKGhkbWksIG91dHB1dF9zZWxlY3QsIEhETUlfVlBfQ09ORl9PVVRQVVRfU0VMRUNUT1JfTUFTSywKKwkJICBIRE1JX1ZQX0NPTkYpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGRtaV9waHlfdGVzdF9jbGVhcihzdHJ1Y3QgaW14X2hkbWkgKmhkbWksCiAJCQkJCQl1bnNpZ25lZCBjaGFyIGJpdCkKIHsKLQl1OCB2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfUEhZX1RTVDApOwotCXZhbCAmPSB+SERNSV9QSFlfVFNUMF9UU1RDTFJfTUFTSzsKLQl2YWwgfD0gKGJpdCA8PCBIRE1JX1BIWV9UU1QwX1RTVENMUl9PRkZTRVQpICYKLQkJSERNSV9QSFlfVFNUMF9UU1RDTFJfTUFTSzsKLQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfUEhZX1RTVDApOworCWhkbWlfbW9kYihoZG1pLCBiaXQgPDwgSERNSV9QSFlfVFNUMF9UU1RDTFJfT0ZGU0VULAorCQkgIEhETUlfUEhZX1RTVDBfVFNUQ0xSX01BU0ssIEhETUlfUEhZX1RTVDApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGRtaV9waHlfdGVzdF9lbmFibGUoc3RydWN0IGlteF9oZG1pICpoZG1pLAogCQkJCQkJdW5zaWduZWQgY2hhciBiaXQpCiB7Ci0JdTggdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX1BIWV9UU1QwKTsKLQl2YWwgJj0gfkhETUlfUEhZX1RTVDBfVFNURU5fTUFTSzsKLQl2YWwgfD0gKGJpdCA8PCBIRE1JX1BIWV9UU1QwX1RTVEVOX09GRlNFVCkgJgotCQlIRE1JX1BIWV9UU1QwX1RTVEVOX01BU0s7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX1BIWV9UU1QwKTsKKwloZG1pX21vZGIoaGRtaSwgYml0IDw8IEhETUlfUEhZX1RTVDBfVFNURU5fT0ZGU0VULAorCQkgIEhETUlfUEhZX1RTVDBfVFNURU5fTUFTSywgSERNSV9QSFlfVFNUMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoZG1pX3BoeV90ZXN0X2Nsb2NrKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSwKIAkJCQkJCXVuc2lnbmVkIGNoYXIgYml0KQogewotCXU4IHZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9QSFlfVFNUMCk7Ci0JdmFsICY9IH5IRE1JX1BIWV9UU1QwX1RTVENMS19NQVNLOwotCXZhbCB8PSAoYml0IDw8IEhETUlfUEhZX1RTVDBfVFNUQ0xLX09GRlNFVCkgJgotCQlIRE1JX1BIWV9UU1QwX1RTVENMS19NQVNLOwotCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9QSFlfVFNUMCk7CisJaGRtaV9tb2RiKGhkbWksIGJpdCA8PCBIRE1JX1BIWV9UU1QwX1RTVENMS19PRkZTRVQsCisJCSAgSERNSV9QSFlfVFNUMF9UU1RDTEtfTUFTSywgSERNSV9QSFlfVFNUMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoZG1pX3BoeV90ZXN0X2RpbihzdHJ1Y3QgaW14X2hkbWkgKmhkbWksCkBAIC04MDYsMTkgKzczMyw5NCBAQAogCQkJIEhETUlfUEhZX0NPTkYwX1NFTERJUElGX01BU0spOwogfQogCitlbnVtIHsKKwlSRVNfOCwKKwlSRVNfMTAsCisJUkVTXzEyLAorCVJFU19NQVgsCit9OworCitzdHJ1Y3QgbXBsbF9jb25maWcgeworCXVuc2lnbmVkIGxvbmcgbXBpeGVsY2xvY2s7CisJc3RydWN0IHsKKwkJdTE2IGNwY2U7CisJCXUxNiBnbXA7CisJfSByZXNbUkVTX01BWF07Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1wbGxfY29uZmlnIG1wbGxfY29uZmlnW10gPSB7CisJeworCQk0NTI1MDAwMCwgeworCQkJeyAweDAxZTAsIDB4MDAwMCB9LAorCQkJeyAweDIxZTEsIDB4MDAwMCB9LAorCQkJeyAweDQxZTIsIDB4MDAwMCB9CisJCX0sCisJfSwgeworCQk5MjUwMDAwMCwgeworCQkJeyAweDAxNDAsIDB4MDAwNSB9LAorCQkJeyAweDIxNDEsIDB4MDAwNSB9LAorCQkJeyAweDQxNDIsIDB4MDAwNSB9LAorCQl9LAorCX0sIHsKKwkJMTQ4NTAwMDAwLCB7CisJCQl7IDB4MDBhMCwgMHgwMDBhIH0sCisJCQl7IDB4MjBhMSwgMHgwMDBhIH0sCisJCQl7IDB4NDBhMiwgMHgwMDBhIH0sCisJCX0sCisJfSwgeworCQl+MFVMLCB7CisJCQl7IDB4MDBhMCwgMHgwMDBhIH0sCisJCQl7IDB4MjAwMSwgMHgwMDBmIH0sCisJCQl7IDB4NDAwMiwgMHgwMDBmIH0sCisJCX0sCisJfQorfTsKKworc3RydWN0IGN1cnJfY3RybCB7CisJdW5zaWduZWQgbG9uZyBtcGl4ZWxjbG9jazsKKwl1MTYgY3VycltSRVNfTUFYXTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3Vycl9jdHJsIGN1cnJfY3RybFtdID0geworCS8qCXBpeGVsY2xrICAgICBicHA4ICAgIGJwcDEwICAgYnBwMTIgKi8KKwl7CisJCSA1NDAwMDAwMCwgeyAweDA5MWMsIDB4MDkxYywgMHgwNmRjIH0sCisJfSwgeworCQkgNTg0MDAwMDAsIHsgMHgwOTFjLCAweDA2ZGMsIDB4MDZkYyB9LAorCX0sIHsKKwkJIDcyMDAwMDAwLCB7IDB4MDZkYywgMHgwNmRjLCAweDA5MWMgfSwKKwl9LCB7CisJCSA3NDI1MDAwMCwgeyAweDA2ZGMsIDB4MGI1YywgMHgwOTFjIH0sCisJfSwgeworCQkxMTg4MDAwMDAsIHsgMHgwOTFjLCAweDA5MWMsIDB4MDZkYyB9LAorCX0sIHsKKwkJMjE2MDAwMDAwLCB7IDB4MDZkYywgMHgwYjVjLCAweDA5MWMgfSwKKwl9Cit9OworCiBzdGF0aWMgaW50IGhkbWlfcGh5X2NvbmZpZ3VyZShzdHJ1Y3QgaW14X2hkbWkgKmhkbWksIHVuc2lnbmVkIGNoYXIgcHJlcCwKIAkJCSAgICAgIHVuc2lnbmVkIGNoYXIgcmVzLCBpbnQgY3Njb24pCiB7CisJdW5zaWduZWQgcmVzX2lkeCwgaTsKIAl1OCB2YWwsIG1zZWM7CiAKLQkvKiBjb2xvciByZXNvbHV0aW9uIDAgaXMgOCBiaXQgY29sb3VyIGRlcHRoICovCi0JaWYgKCFyZXMpCi0JCXJlcyA9IDg7Ci0KIAlpZiAocHJlcCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JZWxzZSBpZiAocmVzICE9IDggJiYgcmVzICE9IDEyKQorCisJc3dpdGNoIChyZXMpIHsKKwljYXNlIDA6CS8qIGNvbG9yIHJlc29sdXRpb24gMCBpcyA4IGJpdCBjb2xvdXIgZGVwdGggKi8KKwljYXNlIDg6CisJCXJlc19pZHggPSBSRVNfODsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJcmVzX2lkeCA9IFJFU18xMDsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJcmVzX2lkeCA9IFJFU18xMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJLyogRW5hYmxlIGNzYyBwYXRoICovCiAJaWYgKGNzY29uKQpAQCAtODQ1LDE2NSArODQ3LDMwIEBACiAJCQlIRE1JX1BIWV9JMkNNX1NMQVZFX0FERFIpOwogCWhkbWlfcGh5X3Rlc3RfY2xlYXIoaGRtaSwgMCk7CiAKLQlpZiAoaGRtaS0+aGRtaV9kYXRhLnZpZGVvX21vZGUubXBpeGVsY2xvY2sgPD0gNDUyNTAwMDApIHsKLQkJc3dpdGNoIChyZXMpIHsKLQkJY2FzZSA4OgotCQkJLyogUExML01QTEwgQ2ZnICovCi0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwMWUwLCAweDA2KTsKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDAwMDAsIDB4MTUpOyAgLyogR01QQ1RSTCAqLworCS8qIFBMTC9NUExMIENmZyAtIGFsd2F5cyBtYXRjaCBvbiBmaW5hbCBlbnRyeSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1wbGxfY29uZmlnKSAtIDE7IGkrKykKKwkJaWYgKGhkbWktPmhkbWlfZGF0YS52aWRlb19tb2RlLm1waXhlbGNsb2NrIDw9CisJCSAgICBtcGxsX2NvbmZpZ1tpXS5tcGl4ZWxjbG9jaykKIAkJCWJyZWFrOwotCQljYXNlIDEwOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MjFlMSwgMHgwNik7Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwMDAwLCAweDE1KTsKLQkJCWJyZWFrOwotCQljYXNlIDEyOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4NDFlMiwgMHgwNik7Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwMDAwLCAweDE1KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgaWYgKGhkbWktPmhkbWlfZGF0YS52aWRlb19tb2RlLm1waXhlbGNsb2NrIDw9IDkyNTAwMDAwKSB7Ci0JCXN3aXRjaCAocmVzKSB7Ci0JCWNhc2UgODoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDAxNDAsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwNSwgMHgxNSk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMDoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDIxNDEsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwNSwgMHgxNSk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDQxNDIsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwNSwgMHgxNSk7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSBpZiAoaGRtaS0+aGRtaV9kYXRhLnZpZGVvX21vZGUubXBpeGVsY2xvY2sgPD0gMTQ4NTAwMDAwKSB7Ci0JCXN3aXRjaCAocmVzKSB7Ci0JCWNhc2UgODoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDAwYTAsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwYSwgMHgxNSk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMDoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDIwYTEsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwYSwgMHgxNSk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDQwYTIsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwYSwgMHgxNSk7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSB7Ci0JCXN3aXRjaCAocmVzKSB7Ci0JCWNhc2UgODoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDAwYTAsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwYSwgMHgxNSk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMDoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDIwMDEsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwZiwgMHgxNSk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDQwMDIsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwZiwgMHgxNSk7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KIAotCWlmIChoZG1pLT5oZG1pX2RhdGEudmlkZW9fbW9kZS5tcGl4ZWxjbG9jayA8PSA1NDAwMDAwMCkgewotCQlzd2l0Y2ggKHJlcykgewotCQljYXNlIDg6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwOTFjLCAweDEwKTsgIC8qIENVUlJDVFJMICovCisJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIG1wbGxfY29uZmlnW2ldLnJlc1tyZXNfaWR4XS5jcGNlLCAweDA2KTsKKwloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgbXBsbF9jb25maWdbaV0ucmVzW3Jlc19pZHhdLmdtcCwgMHgxNSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdXJyX2N0cmwpOyBpKyspCisJCWlmIChoZG1pLT5oZG1pX2RhdGEudmlkZW9fbW9kZS5tcGl4ZWxjbG9jayA8PQorCQkgICAgY3Vycl9jdHJsW2ldLm1waXhlbGNsb2NrKQogCQkJYnJlYWs7Ci0JCWNhc2UgMTA6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwOTFjLCAweDEwKTsKLQkJCWJyZWFrOwotCQljYXNlIDEyOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDZkYywgMHgxMCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIGlmIChoZG1pLT5oZG1pX2RhdGEudmlkZW9fbW9kZS5tcGl4ZWxjbG9jayA8PSA1ODQwMDAwMCkgewotCQlzd2l0Y2ggKHJlcykgewotCQljYXNlIDg6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwOTFjLCAweDEwKTsKLQkJCWJyZWFrOwotCQljYXNlIDEwOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDZkYywgMHgxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDA2ZGMsIDB4MTApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSBpZiAoaGRtaS0+aGRtaV9kYXRhLnZpZGVvX21vZGUubXBpeGVsY2xvY2sgPD0gNzIwMDAwMDApIHsKLQkJc3dpdGNoIChyZXMpIHsKLQkJY2FzZSA4OgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDZkYywgMHgxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMDoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDA2ZGMsIDB4MTApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTI6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwOTFjLCAweDEwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgaWYgKGhkbWktPmhkbWlfZGF0YS52aWRlb19tb2RlLm1waXhlbGNsb2NrIDw9IDc0MjUwMDAwKSB7Ci0JCXN3aXRjaCAocmVzKSB7Ci0JCWNhc2UgODoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDA2ZGMsIDB4MTApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTA6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwYjVjLCAweDEwKTsKLQkJCWJyZWFrOwotCQljYXNlIDEyOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDkxYywgMHgxMCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIGlmIChoZG1pLT5oZG1pX2RhdGEudmlkZW9fbW9kZS5tcGl4ZWxjbG9jayA8PSAxMTg4MDAwMDApIHsKLQkJc3dpdGNoIChyZXMpIHsKLQkJY2FzZSA4OgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDkxYywgMHgxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMDoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDA5MWMsIDB4MTApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTI6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwNmRjLCAweDEwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgaWYgKGhkbWktPmhkbWlfZGF0YS52aWRlb19tb2RlLm1waXhlbGNsb2NrIDw9IDIxNjAwMDAwMCkgewotCQlzd2l0Y2ggKHJlcykgewotCQljYXNlIDg6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwNmRjLCAweDEwKTsKLQkJCWJyZWFrOwotCQljYXNlIDEwOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MGI1YywgMHgxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDA5MWMsIDB4MTApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSB7CisKKwlpZiAoaSA+PSBBUlJBWV9TSVpFKGN1cnJfY3RybCkpIHsKIAkJZGV2X2VycihoZG1pLT5kZXYsCiAJCQkJIlBpeGVsIGNsb2NrICVkIC0gdW5zdXBwb3J0ZWQgYnkgSERNSVxuIiwKIAkJCQloZG1pLT5oZG1pX2RhdGEudmlkZW9fbW9kZS5tcGl4ZWxjbG9jayk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCS8qIENVUlJDVFJMICovCisJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIGN1cnJfY3RybFtpXS5jdXJyW3Jlc19pZHhdLCAweDEwKTsKKwogCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDAwMDAsIDB4MTMpOyAgLyogUExMUEhCWUNUUkwgKi8KIAloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwMDA2LCAweDE3KTsKIAkvKiBSRVNJU1RBTkNFIFRFUk0gMTMzT2htIENmZyAqLwpAQCAtMTA3Miw3ICs5MzksNyBAQAogCiBzdGF0aWMgdm9pZCBoZG1pX3R4X2hkY3BfY29uZmlnKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSkKIHsKLQl1OCBkZSwgdmFsOworCXU4IGRlOwogCiAJaWYgKGhkbWktPmhkbWlfZGF0YS52aWRlb19tb2RlLm1kYXRhZW5hYmxlcG9sYXJpdHkpCiAJCWRlID0gSERNSV9BX1ZJRFBPTENGR19EQVRBRU5QT0xfQUNUSVZFX0hJR0g7CkBAIC0xMDgwLDIwICs5NDcsMTMgQEAKIAkJZGUgPSBIRE1JX0FfVklEUE9MQ0ZHX0RBVEFFTlBPTF9BQ1RJVkVfTE9XOwogCiAJLyogZGlzYWJsZSByeCBkZXRlY3QgKi8KLQl2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfQV9IRENQQ0ZHMCk7Ci0JdmFsICY9IEhETUlfQV9IRENQQ0ZHMF9SWERFVEVDVF9NQVNLOwotCXZhbCB8PSBIRE1JX0FfSERDUENGRzBfUlhERVRFQ1RfRElTQUJMRTsKLQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfQV9IRENQQ0ZHMCk7CisJaGRtaV9tb2RiKGhkbWksIEhETUlfQV9IRENQQ0ZHMF9SWERFVEVDVF9ESVNBQkxFLAorCQkgIEhETUlfQV9IRENQQ0ZHMF9SWERFVEVDVF9NQVNLLCBIRE1JX0FfSERDUENGRzApOwogCi0JdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX0FfVklEUE9MQ0ZHKTsKLQl2YWwgJj0gSERNSV9BX1ZJRFBPTENGR19EQVRBRU5QT0xfTUFTSzsKLQl2YWwgfD0gZGU7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX0FfVklEUE9MQ0ZHKTsKKwloZG1pX21vZGIoaGRtaSwgZGUsIEhETUlfQV9WSURQT0xDRkdfREFUQUVOUE9MX01BU0ssIEhETUlfQV9WSURQT0xDRkcpOwogCi0JdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX0FfSERDUENGRzEpOwotCXZhbCAmPSBIRE1JX0FfSERDUENGRzFfRU5DUllQVElPTkRJU0FCTEVfTUFTSzsKLQl2YWwgfD0gSERNSV9BX0hEQ1BDRkcxX0VOQ1JZUFRJT05ESVNBQkxFX0RJU0FCTEU7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX0FfSERDUENGRzEpOworCWhkbWlfbW9kYihoZG1pLCBIRE1JX0FfSERDUENGRzFfRU5DUllQVElPTkRJU0FCTEVfRElTQUJMRSwKKwkJICBIRE1JX0FfSERDUENGRzFfRU5DUllQVElPTkRJU0FCTEVfTUFTSywgSERNSV9BX0hEQ1BDRkcxKTsKIH0KIAogc3RhdGljIHZvaWQgaGRtaV9jb25maWdfQVZJKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSkKQEAgLTEzMTcsMTEgKzExNzcsNyBAQAogCiBzdGF0aWMgdm9pZCBoZG1pX2VuYWJsZV9hdWRpb19jbGsoc3RydWN0IGlteF9oZG1pICpoZG1pKQogewotCXU4IGNsa2RpczsKLQotCWNsa2RpcyA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9NQ19DTEtESVMpOwotCWNsa2RpcyAmPSB+SERNSV9NQ19DTEtESVNfQVVEQ0xLX0RJU0FCTEU7Ci0JaGRtaV93cml0ZWIoaGRtaSwgY2xrZGlzLCBIRE1JX01DX0NMS0RJUyk7CisJaGRtaV9tb2RiKGhkbWksIDAsIEhETUlfTUNfQ0xLRElTX0FVRENMS19ESVNBQkxFLCBIRE1JX01DX0NMS0RJUyk7CiB9CiAKIC8qIFdvcmthcm91bmQgdG8gY2xlYXIgdGhlIG92ZXJmbG93IGNvbmRpdGlvbiAqLwpAQCAtMTQ1Niw5ICsxMzEyLDYgQEAKIAkvKiBDbGVhciBIb3RwbHVnIGludGVycnVwdHMgKi8KIAloZG1pX3dyaXRlYihoZG1pLCBIRE1JX0lIX1BIWV9TVEFUMF9IUEQsIEhETUlfSUhfUEhZX1NUQVQwKTsKIAotCS8qIFVubXV0ZSBpbnRlcnJ1cHRzICovCi0JaGRtaV93cml0ZWIoaGRtaSwgfkhETUlfSUhfUEhZX1NUQVQwX0hQRCwgSERNSV9JSF9NVVRFX1BIWV9TVEFUMCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTUyNywxMiArMTM4MCw5IEBACiBzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBpbXhfaGRtaV9jb25uZWN0b3JfZGV0ZWN0KHN0cnVjdCBkcm1fY29ubmVjdG9yCiAJCQkJCQkJKmNvbm5lY3RvciwgYm9vbCBmb3JjZSkKIHsKLQkvKiBGSVhNRSAqLwotCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKLX0KLQotc3RhdGljIHZvaWQgaW14X2hkbWlfY29ubmVjdG9yX2Rlc3Ryb3koc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKLXsKKwlzdHJ1Y3QgaW14X2hkbWkgKmhkbWkgPSBjb250YWluZXJfb2YoY29ubmVjdG9yLCBzdHJ1Y3QgaW14X2hkbWksCisJCQkJCSAgICAgY29ubmVjdG9yKTsKKwlyZXR1cm4gaGRtaS0+Y29ubmVjdG9yX3N0YXR1czsKIH0KIAogc3RhdGljIGludCBpbXhfaGRtaV9jb25uZWN0b3JfZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCkBAIC0xNTYwLDEzICsxNDEwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpbXhfaGRtaV9jb25uZWN0b3JfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAotCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKLXsKLQotCXJldHVybiBNT0RFX09LOwotfQotCiBzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyICppbXhfaGRtaV9jb25uZWN0b3JfYmVzdF9lbmNvZGVyKHN0cnVjdCBkcm1fY29ubmVjdG9yCiAJCQkJCQkJICAgKmNvbm5lY3RvcikKIHsKQEAgLTE2MTQsMjggKzE0NTcsMjEgQEAKIAlzdHJ1Y3QgaW14X2hkbWkgKmhkbWkgPSBjb250YWluZXJfb2YoZW5jb2Rlciwgc3RydWN0IGlteF9oZG1pLCBlbmNvZGVyKTsKIAogCWlteF9oZG1pX3Bvd2Vyb2ZmKGhkbWkpOwotCWlteF9kcm1fY3J0Y19wYW5lbF9mb3JtYXQoZW5jb2Rlci0+Y3J0YywgRFJNX01PREVfRU5DT0RFUl9OT05FLAotCQkJCSAgVjRMMl9QSVhfRk1UX1JHQjI0KTsKKwlpbXhfZHJtX3BhbmVsX2Zvcm1hdChlbmNvZGVyLCBWNEwyX1BJWF9GTVRfUkdCMjQpOwogfQogCiBzdGF0aWMgdm9pZCBpbXhfaGRtaV9lbmNvZGVyX2NvbW1pdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7CiAJc3RydWN0IGlteF9oZG1pICpoZG1pID0gY29udGFpbmVyX29mKGVuY29kZXIsIHN0cnVjdCBpbXhfaGRtaSwgZW5jb2Rlcik7Ci0JaW50IG11eCA9IGlteF9kcm1fZW5jb2Rlcl9nZXRfbXV4X2lkKGhkbWktPmlteF9kcm1fZW5jb2RlciwKLQkJCQkJICAgICBlbmNvZGVyLT5jcnRjKTsKKwlpbnQgbXV4ID0gaW14X2RybV9lbmNvZGVyX2dldF9tdXhfaWQoaGRtaS0+ZGV2LT5vZl9ub2RlLCBlbmNvZGVyKTsKIAogCWlteF9oZG1pX3NldF9pcHVfZGlfbXV4KGhkbWksIG11eCk7CiAKIAlpbXhfaGRtaV9wb3dlcm9uKGhkbWkpOwogfQogCi1zdGF0aWMgdm9pZCBpbXhfaGRtaV9lbmNvZGVyX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQotewotCXJldHVybjsKLX0KLQogc3RhdGljIHN0cnVjdCBkcm1fZW5jb2Rlcl9mdW5jcyBpbXhfaGRtaV9lbmNvZGVyX2Z1bmNzID0gewotCS5kZXN0cm95ID0gaW14X2hkbWlfZW5jb2Rlcl9kZXN0cm95LAorCS5kZXN0cm95ID0gaW14X2RybV9lbmNvZGVyX2Rlc3Ryb3ksCiB9OwogCiBzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyBpbXhfaGRtaV9lbmNvZGVyX2hlbHBlcl9mdW5jcyA9IHsKQEAgLTE2NTEsMjEgKzE0ODcsMzIgQEAKIAkuZHBtcyA9IGRybV9oZWxwZXJfY29ubmVjdG9yX2RwbXMsCiAJLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMsCiAJLmRldGVjdCA9IGlteF9oZG1pX2Nvbm5lY3Rvcl9kZXRlY3QsCi0JLmRlc3Ryb3kgPSBpbXhfaGRtaV9jb25uZWN0b3JfZGVzdHJveSwKKwkuZGVzdHJveSA9IGlteF9kcm1fY29ubmVjdG9yX2Rlc3Ryb3ksCiB9OwogCiBzdGF0aWMgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGlteF9oZG1pX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CiAJLmdldF9tb2RlcyA9IGlteF9oZG1pX2Nvbm5lY3Rvcl9nZXRfbW9kZXMsCi0JLm1vZGVfdmFsaWQgPSBpbXhfaGRtaV9jb25uZWN0b3JfbW9kZV92YWxpZCwKKwkubW9kZV92YWxpZCA9IGlteF9kcm1fY29ubmVjdG9yX21vZGVfdmFsaWQsCiAJLmJlc3RfZW5jb2RlciA9IGlteF9oZG1pX2Nvbm5lY3Rvcl9iZXN0X2VuY29kZXIsCiB9OwogCitzdGF0aWMgaXJxcmV0dXJuX3QgaW14X2hkbWlfaGFyZGlycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGlteF9oZG1pICpoZG1pID0gZGV2X2lkOworCXU4IGludHJfc3RhdDsKKworCWludHJfc3RhdCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9JSF9QSFlfU1RBVDApOworCWlmIChpbnRyX3N0YXQpCisJCWhkbWlfd3JpdGViKGhkbWksIH4wLCBIRE1JX0lIX01VVEVfUEhZX1NUQVQwKTsKKworCXJldHVybiBpbnRyX3N0YXQgPyBJUlFfV0FLRV9USFJFQUQgOiBJUlFfTk9ORTsKK30KKwogc3RhdGljIGlycXJldHVybl90IGlteF9oZG1pX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IGlteF9oZG1pICpoZG1pID0gZGV2X2lkOwogCXU4IGludHJfc3RhdDsKIAl1OCBwaHlfaW50X3BvbDsKLQl1OCB2YWw7CiAKIAlpbnRyX3N0YXQgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfSUhfUEhZX1NUQVQwKTsKIApAQCAtMTY3NSw1NSArMTUyMiw0NyBAQAogCQlpZiAocGh5X2ludF9wb2wgJiBIRE1JX1BIWV9IUEQpIHsKIAkJCWRldl9kYmcoaGRtaS0+ZGV2LCAiRVZFTlQ9cGx1Z2luXG4iKTsKIAotCQkJdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX1BIWV9QT0wwKTsKLQkJCXZhbCAmPSB+SERNSV9QSFlfSFBEOwotCQkJaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX1BIWV9QT0wwKTsKKwkJCWhkbWlfbW9kYihoZG1pLCAwLCBIRE1JX1BIWV9IUEQsIEhETUlfUEhZX1BPTDApOwogCisJCQloZG1pLT5jb25uZWN0b3Jfc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CiAJCQlpbXhfaGRtaV9wb3dlcm9uKGhkbWkpOwogCQl9IGVsc2UgewogCQkJZGV2X2RiZyhoZG1pLT5kZXYsICJFVkVOVD1wbHVnb3V0XG4iKTsKIAotCQkJdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX1BIWV9QT0wwKTsKLQkJCXZhbCB8PSBIRE1JX1BIWV9IUEQ7Ci0JCQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfUEhZX1BPTDApOworCQkJaGRtaV9tb2RiKGhkbWksIEhETUlfUEhZX0hQRCwgSERNSV9QSFlfSFBELAorCQkJCUhETUlfUEhZX1BPTDApOwogCisJCQloZG1pLT5jb25uZWN0b3Jfc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CiAJCQlpbXhfaGRtaV9wb3dlcm9mZihoZG1pKTsKIAkJfQorCQlkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQoaGRtaS0+Y29ubmVjdG9yLmRldik7CiAJfQogCiAJaGRtaV93cml0ZWIoaGRtaSwgaW50cl9zdGF0LCBIRE1JX0lIX1BIWV9TVEFUMCk7CisJaGRtaV93cml0ZWIoaGRtaSwgfkhETUlfSUhfUEhZX1NUQVQwX0hQRCwgSERNSV9JSF9NVVRFX1BIWV9TVEFUMCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgaW14X2hkbWlfcmVnaXN0ZXIoc3RydWN0IGlteF9oZG1pICpoZG1pKQorc3RhdGljIGludCBpbXhfaGRtaV9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLCBzdHJ1Y3QgaW14X2hkbWkgKmhkbWkpCiB7CiAJaW50IHJldDsKIAotCWhkbWktPmNvbm5lY3Rvci5mdW5jcyA9ICZpbXhfaGRtaV9jb25uZWN0b3JfZnVuY3M7Ci0JaGRtaS0+ZW5jb2Rlci5mdW5jcyA9ICZpbXhfaGRtaV9lbmNvZGVyX2Z1bmNzOworCXJldCA9IGlteF9kcm1fZW5jb2Rlcl9wYXJzZV9vZihkcm0sICZoZG1pLT5lbmNvZGVyLAorCQkJCSAgICAgICBoZG1pLT5kZXYtPm9mX25vZGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQloZG1pLT5lbmNvZGVyLmVuY29kZXJfdHlwZSA9IERSTV9NT0RFX0VOQ09ERVJfVE1EUzsKLQloZG1pLT5jb25uZWN0b3IuY29ubmVjdG9yX3R5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUE7CisJaGRtaS0+Y29ubmVjdG9yLnBvbGxlZCA9IERSTV9DT05ORUNUT1JfUE9MTF9IUEQ7CiAKIAlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKCZoZG1pLT5lbmNvZGVyLCAmaW14X2hkbWlfZW5jb2Rlcl9oZWxwZXJfZnVuY3MpOwotCXJldCA9IGlteF9kcm1fYWRkX2VuY29kZXIoJmhkbWktPmVuY29kZXIsICZoZG1pLT5pbXhfZHJtX2VuY29kZXIsCi0JCQlUSElTX01PRFVMRSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGhkbWktPmRldiwgImFkZGluZyBlbmNvZGVyIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQorCWRybV9lbmNvZGVyX2luaXQoZHJtLCAmaGRtaS0+ZW5jb2RlciwgJmlteF9oZG1pX2VuY29kZXJfZnVuY3MsCisJCQkgRFJNX01PREVfRU5DT0RFUl9UTURTKTsKIAogCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmaGRtaS0+Y29ubmVjdG9yLAogCQkJJmlteF9oZG1pX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOwotCi0JcmV0ID0gaW14X2RybV9hZGRfY29ubmVjdG9yKCZoZG1pLT5jb25uZWN0b3IsCi0JCQkmaGRtaS0+aW14X2RybV9jb25uZWN0b3IsIFRISVNfTU9EVUxFKTsKLQlpZiAocmV0KSB7Ci0JCWlteF9kcm1fcmVtb3ZlX2VuY29kZXIoaGRtaS0+aW14X2RybV9lbmNvZGVyKTsKLQkJZGV2X2VycihoZG1pLT5kZXYsICJhZGRpbmcgY29ubmVjdG9yIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQorCWRybV9jb25uZWN0b3JfaW5pdChkcm0sICZoZG1pLT5jb25uZWN0b3IsICZpbXhfaGRtaV9jb25uZWN0b3JfZnVuY3MsCisJCQkgICBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUEpOwogCiAJaGRtaS0+Y29ubmVjdG9yLmVuY29kZXIgPSAmaGRtaS0+ZW5jb2RlcjsKIApAQCAtMTc1MCwyOCArMTU4OSwzMyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGlteF9oZG1pX2R0X2lkcyk7CiAKLXN0YXRpYyBpbnQgaW14X2hkbWlfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgaW14X2hkbWlfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSkKIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQgPQotCQkJCW9mX21hdGNoX2RldmljZShpbXhfaGRtaV9kdF9pZHMsICZwZGV2LT5kZXYpOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwkJCQlvZl9tYXRjaF9kZXZpY2UoaW14X2hkbWlfZHRfaWRzLCBkZXYpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBkYXRhOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CiAJc3RydWN0IGRldmljZV9ub2RlICpkZGNfbm9kZTsKIAlzdHJ1Y3QgaW14X2hkbWkgKmhkbWk7CiAJc3RydWN0IHJlc291cmNlICppb3JlczsKIAlpbnQgcmV0LCBpcnE7CiAKLQloZG1pID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqaGRtaSksIEdGUF9LRVJORUwpOworCWhkbWkgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmhkbWkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhkbWkpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaGRtaS0+ZGV2ID0gJnBkZXYtPmRldjsKKwloZG1pLT5kZXYgPSBkZXY7CisJaGRtaS0+Y29ubmVjdG9yX3N0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworCWhkbWktPnNhbXBsZV9yYXRlID0gNDgwMDA7CisJaGRtaS0+cmF0aW8gPSAxMDA7CiAKIAlpZiAob2ZfaWQpIHsKIAkJY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCAqZGV2aWNlX2lkID0gb2ZfaWQtPmRhdGE7CiAJCWhkbWktPmRldl90eXBlID0gZGV2aWNlX2lkLT5kcml2ZXJfZGF0YTsKIAl9CiAKLQlkZGNfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobnAsICJkZGMiLCAwKTsKKwlkZGNfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobnAsICJkZGMtaTJjLWJ1cyIsIDApOwogCWlmIChkZGNfbm9kZSkgewogCQloZG1pLT5kZGMgPSBvZl9maW5kX2kyY19hZGFwdGVyX2J5X25vZGUoZGRjX25vZGUpOwogCQlpZiAoIWhkbWktPmRkYykKQEAgLTE3ODYsMTMgKzE2MzAsMTQgQEAKIAlpZiAoaXJxIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgaW14X2hkbWlfaXJxLCAwLAotCQkJICAgICAgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBoZG1pKTsKKwlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKGRldiwgaXJxLCBpbXhfaGRtaV9oYXJkaXJxLAorCQkJCQlpbXhfaGRtaV9pcnEsIElSUUZfU0hBUkVELAorCQkJCQlkZXZfbmFtZShkZXYpLCBoZG1pKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJaW9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWhkbWktPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgaW9yZXMpOworCWhkbWktPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCBpb3Jlcyk7CiAJaWYgKElTX0VSUihoZG1pLT5yZWdzKSkKIAkJcmV0dXJuIFBUUl9FUlIoaGRtaS0+cmVncyk7CiAKQEAgLTE4MzEsNyArMTY3Niw3IEBACiAJfQogCiAJLyogUHJvZHVjdCBhbmQgcmV2aXNpb24gSURzICovCi0JZGV2X2luZm8oJnBkZXYtPmRldiwKKwlkZXZfaW5mbyhkZXYsCiAJCSJEZXRlY3RlZCBIRE1JIGNvbnRyb2xsZXIgMHgleDoweCV4OjB4JXg6MHgleFxuIiwKIAkJaGRtaV9yZWFkYihoZG1pLCBIRE1JX0RFU0lHTl9JRCksCiAJCWhkbWlfcmVhZGIoaGRtaSwgSERNSV9SRVZJU0lPTl9JRCksCkBAIC0xODU5LDEzICsxNzA0LDE0IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfaWFoYjsKIAotCXJldCA9IGlteF9oZG1pX3JlZ2lzdGVyKGhkbWkpOworCXJldCA9IGlteF9oZG1pX3JlZ2lzdGVyKGRybSwgaGRtaSk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfaWFoYjsKIAotCWlteF9kcm1fZW5jb2Rlcl9hZGRfcG9zc2libGVfY3J0Y3MoaGRtaS0+aW14X2RybV9lbmNvZGVyLCBucCk7CisJLyogVW5tdXRlIGludGVycnVwdHMgKi8KKwloZG1pX3dyaXRlYihoZG1pLCB+SERNSV9JSF9QSFlfU1RBVDBfSFBELCBIRE1JX0lIX01VVEVfUEhZX1NUQVQwKTsKIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGhkbWkpOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGhkbWkpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTE4NzcsMjAgKzE3MjMsMzUgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGlteF9oZG1pX3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIHZvaWQgaW14X2hkbWlfdW5iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLAorCXZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGlteF9oZG1pICpoZG1pID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9ICZoZG1pLT5jb25uZWN0b3I7Ci0Jc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyID0gJmhkbWktPmVuY29kZXI7CisJc3RydWN0IGlteF9oZG1pICpoZG1pID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKLQlkcm1fbW9kZV9jb25uZWN0b3JfZGV0YWNoX2VuY29kZXIoY29ubmVjdG9yLCBlbmNvZGVyKTsKLQlpbXhfZHJtX3JlbW92ZV9jb25uZWN0b3IoaGRtaS0+aW14X2RybV9jb25uZWN0b3IpOwotCWlteF9kcm1fcmVtb3ZlX2VuY29kZXIoaGRtaS0+aW14X2RybV9lbmNvZGVyKTsKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJaGRtaV93cml0ZWIoaGRtaSwgfjAsIEhETUlfSUhfTVVURV9QSFlfU1RBVDApOworCisJaGRtaS0+Y29ubmVjdG9yLmZ1bmNzLT5kZXN0cm95KCZoZG1pLT5jb25uZWN0b3IpOworCWhkbWktPmVuY29kZXIuZnVuY3MtPmRlc3Ryb3koJmhkbWktPmVuY29kZXIpOwogCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhkbWktPmlhaGJfY2xrKTsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoaGRtaS0+aXNmcl9jbGspOwogCWkyY19wdXRfYWRhcHRlcihoZG1pLT5kZGMpOworfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBvbmVudF9vcHMgaGRtaV9vcHMgPSB7CisJLmJpbmQJPSBpbXhfaGRtaV9iaW5kLAorCS51bmJpbmQJPSBpbXhfaGRtaV91bmJpbmQsCit9OworCitzdGF0aWMgaW50IGlteF9oZG1pX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIGNvbXBvbmVudF9hZGQoJnBkZXYtPmRldiwgJmhkbWlfb3BzKTsKK30KKworc3RhdGljIGludCBpbXhfaGRtaV9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb21wb25lbnRfZGVsKCZwZGV2LT5kZXYsICZoZG1pX29wcyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1sZGIuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1sZGIuYwppbmRleCA3ZTU5MzI5Li5mZTRjMWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtbGRiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWxkYi5jCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wb25lbnQuaD4KICNpbmNsdWRlIDxkcm0vZHJtUC5oPgogI2luY2x1ZGUgPGRybS9kcm1fZmJfaGVscGVyLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgpAQCAtNTgsOSArNTksOCBAQAogc3RydWN0IGlteF9sZGJfY2hhbm5lbCB7CiAJc3RydWN0IGlteF9sZGIgKmxkYjsKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBjb25uZWN0b3I7Ci0Jc3RydWN0IGlteF9kcm1fY29ubmVjdG9yICppbXhfZHJtX2Nvbm5lY3RvcjsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgZW5jb2RlcjsKLQlzdHJ1Y3QgaW14X2RybV9lbmNvZGVyICppbXhfZHJtX2VuY29kZXI7CisJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZDsKIAlpbnQgY2hubzsKIAl2b2lkICplZGlkOwogCWludCBlZGlkX2xlbjsKQEAgLTkxLDExICs5MSw2IEBACiAJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwogfQogCi1zdGF0aWMgdm9pZCBpbXhfbGRiX2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCi17Ci0JLyogZG8gbm90IGZyZWUgaGVyZSAqLwotfQotCiBzdGF0aWMgaW50IGlteF9sZGJfY29ubmVjdG9yX2dldF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewogCXN0cnVjdCBpbXhfbGRiX2NoYW5uZWwgKmlteF9sZGJfY2ggPSBjb25fdG9faW14X2xkYl9jaChjb25uZWN0b3IpOwpAQCAtMTExLDYgKzEwNiw4IEBACiAJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOwogCiAJCW1vZGUgPSBkcm1fbW9kZV9jcmVhdGUoY29ubmVjdG9yLT5kZXYpOworCQlpZiAoIW1vZGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJZHJtX21vZGVfY29weShtb2RlLCAmaW14X2xkYl9jaC0+bW9kZSk7CiAJCW1vZGUtPnR5cGUgfD0gRFJNX01PREVfVFlQRV9EUklWRVIgfCBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRDsKIAkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG1vZGUpOwpAQCAtMTIwLDEyICsxMTcsNiBAQAogCXJldHVybiBudW1fbW9kZXM7CiB9CiAKLXN0YXRpYyBpbnQgaW14X2xkYl9jb25uZWN0b3JfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAotCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBkcm1fZW5jb2RlciAqaW14X2xkYl9jb25uZWN0b3JfYmVzdF9lbmNvZGVyKAogCQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewpAQCAtMTY4LDcgKzE1OSw5IEBACiAJLyogc2V0IGRpc3BsYXkgY2xvY2sgbXV4IHRvIExEQiBpbnB1dCBjbG9jayAqLwogCXJldCA9IGNsa19zZXRfcGFyZW50KGxkYi0+Y2xrX3NlbFttdXhdLCBsZGItPmNsa1tjaG5vXSk7CiAJaWYgKHJldCkKLQkJZGV2X2VycihsZGItPmRldiwgInVuYWJsZSB0byBzZXQgZGklZCBwYXJlbnQgY2xvY2sgdG8gbGRiX2RpJWRcbiIsIG11eCwgY2hubyk7CisJCWRldl9lcnIobGRiLT5kZXYsCisJCQkidW5hYmxlIHRvIHNldCBkaSVkIHBhcmVudCBjbG9jayB0byBsZGJfZGklZFxuIiwgbXV4LAorCQkJY2hubyk7CiB9CiAKIHN0YXRpYyB2b2lkIGlteF9sZGJfZW5jb2Rlcl9wcmVwYXJlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKQEAgLTE3OSw4ICsxNzIsNyBAQAogCXUzMiBwaXhlbF9mbXQ7CiAJdW5zaWduZWQgbG9uZyBzZXJpYWxfY2xrOwogCXVuc2lnbmVkIGxvbmcgZGlfY2xrID0gbW9kZS0+Y2xvY2sgKiAxMDAwOwotCWludCBtdXggPSBpbXhfZHJtX2VuY29kZXJfZ2V0X211eF9pZChpbXhfbGRiX2NoLT5pbXhfZHJtX2VuY29kZXIsCi0JCQkJCSAgICAgZW5jb2Rlci0+Y3J0Yyk7CisJaW50IG11eCA9IGlteF9kcm1fZW5jb2Rlcl9nZXRfbXV4X2lkKGlteF9sZGJfY2gtPmNoaWxkLCBlbmNvZGVyKTsKIAogCWlmIChsZGItPmxkYl9jdHJsICYgTERCX1NQTElUX01PREVfRU4pIHsKIAkJLyogZHVhbCBjaGFubmVsIExWRFMgbW9kZSAqLwpAQCAtMTg5LDcgKzE4MSw4IEBACiAJCWlteF9sZGJfc2V0X2Nsb2NrKGxkYiwgbXV4LCAxLCBzZXJpYWxfY2xrLCBkaV9jbGspOwogCX0gZWxzZSB7CiAJCXNlcmlhbF9jbGsgPSA3MDAwVUwgKiBtb2RlLT5jbG9jazsKLQkJaW14X2xkYl9zZXRfY2xvY2sobGRiLCBtdXgsIGlteF9sZGJfY2gtPmNobm8sIHNlcmlhbF9jbGssIGRpX2Nsayk7CisJCWlteF9sZGJfc2V0X2Nsb2NrKGxkYiwgbXV4LCBpbXhfbGRiX2NoLT5jaG5vLCBzZXJpYWxfY2xrLAorCQkJCWRpX2Nsayk7CiAJfQogCiAJc3dpdGNoIChpbXhfbGRiX2NoLT5jaG5vKSB7CkBAIC0yMDcsOCArMjAwLDcgQEAKIAkJcGl4ZWxfZm10ID0gVjRMMl9QSVhfRk1UX1JHQjI0OwogCX0KIAotCWlteF9kcm1fY3J0Y19wYW5lbF9mb3JtYXQoZW5jb2Rlci0+Y3J0YywgRFJNX01PREVfRU5DT0RFUl9MVkRTLAotCQkJcGl4ZWxfZm10KTsKKwlpbXhfZHJtX3BhbmVsX2Zvcm1hdChlbmNvZGVyLCBwaXhlbF9mbXQpOwogfQogCiBzdGF0aWMgdm9pZCBpbXhfbGRiX2VuY29kZXJfY29tbWl0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKQEAgLTIxNiw4ICsyMDgsNyBAQAogCXN0cnVjdCBpbXhfbGRiX2NoYW5uZWwgKmlteF9sZGJfY2ggPSBlbmNfdG9faW14X2xkYl9jaChlbmNvZGVyKTsKIAlzdHJ1Y3QgaW14X2xkYiAqbGRiID0gaW14X2xkYl9jaC0+bGRiOwogCWludCBkdWFsID0gbGRiLT5sZGJfY3RybCAmIExEQl9TUExJVF9NT0RFX0VOOwotCWludCBtdXggPSBpbXhfZHJtX2VuY29kZXJfZ2V0X211eF9pZChpbXhfbGRiX2NoLT5pbXhfZHJtX2VuY29kZXIsCi0JCQkJCSAgICAgZW5jb2Rlci0+Y3J0Yyk7CisJaW50IG11eCA9IGlteF9kcm1fZW5jb2Rlcl9nZXRfbXV4X2lkKGlteF9sZGJfY2gtPmNoaWxkLCBlbmNvZGVyKTsKIAogCWlmIChkdWFsKSB7CiAJCWNsa19wcmVwYXJlX2VuYWJsZShsZGItPmNsa1swXSk7CkBAIC0zMTYsMjYgKzMwNywyMSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaW14X2xkYl9lbmNvZGVyX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQotewotCS8qIGRvIG5vdCBmcmVlIGhlcmUgKi8KLX0KLQogc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzIGlteF9sZGJfY29ubmVjdG9yX2Z1bmNzID0gewogCS5kcG1zID0gZHJtX2hlbHBlcl9jb25uZWN0b3JfZHBtcywKIAkuZmlsbF9tb2RlcyA9IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcywKIAkuZGV0ZWN0ID0gaW14X2xkYl9jb25uZWN0b3JfZGV0ZWN0LAotCS5kZXN0cm95ID0gaW14X2xkYl9jb25uZWN0b3JfZGVzdHJveSwKKwkuZGVzdHJveSA9IGlteF9kcm1fY29ubmVjdG9yX2Rlc3Ryb3ksCiB9OwogCiBzdGF0aWMgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGlteF9sZGJfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsKIAkuZ2V0X21vZGVzID0gaW14X2xkYl9jb25uZWN0b3JfZ2V0X21vZGVzLAogCS5iZXN0X2VuY29kZXIgPSBpbXhfbGRiX2Nvbm5lY3Rvcl9iZXN0X2VuY29kZXIsCi0JLm1vZGVfdmFsaWQgPSBpbXhfbGRiX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkLAorCS5tb2RlX3ZhbGlkID0gaW14X2RybV9jb25uZWN0b3JfbW9kZV92YWxpZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgaW14X2xkYl9lbmNvZGVyX2Z1bmNzID0gewotCS5kZXN0cm95ID0gaW14X2xkYl9lbmNvZGVyX2Rlc3Ryb3ksCisJLmRlc3Ryb3kgPSBpbXhfZHJtX2VuY29kZXJfZGVzdHJveSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIGlteF9sZGJfZW5jb2Rlcl9oZWxwZXJfZnVuY3MgPSB7CkBAIC0zNTEsNTYgKzMzNyw0NyBAQAogewogCWNoYXIgY2xrbmFtZVsxNl07CiAKLQlzcHJpbnRmKGNsa25hbWUsICJkaSVkIiwgY2hubyk7CisJc25wcmludGYoY2xrbmFtZSwgc2l6ZW9mKGNsa25hbWUpLCAiZGklZCIsIGNobm8pOwogCWxkYi0+Y2xrW2Nobm9dID0gZGV2bV9jbGtfZ2V0KGxkYi0+ZGV2LCBjbGtuYW1lKTsKIAlpZiAoSVNfRVJSKGxkYi0+Y2xrW2Nobm9dKSkKIAkJcmV0dXJuIFBUUl9FUlIobGRiLT5jbGtbY2hub10pOwogCi0Jc3ByaW50ZihjbGtuYW1lLCAiZGklZF9wbGwiLCBjaG5vKTsKKwlzbnByaW50ZihjbGtuYW1lLCBzaXplb2YoY2xrbmFtZSksICJkaSVkX3BsbCIsIGNobm8pOwogCWxkYi0+Y2xrX3BsbFtjaG5vXSA9IGRldm1fY2xrX2dldChsZGItPmRldiwgY2xrbmFtZSk7CiAKIAlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGxkYi0+Y2xrX3BsbFtjaG5vXSk7CiB9CiAKLXN0YXRpYyBpbnQgaW14X2xkYl9yZWdpc3RlcihzdHJ1Y3QgaW14X2xkYl9jaGFubmVsICppbXhfbGRiX2NoKQorc3RhdGljIGludCBpbXhfbGRiX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sCisJc3RydWN0IGlteF9sZGJfY2hhbm5lbCAqaW14X2xkYl9jaCkKIHsKLQlpbnQgcmV0OwogCXN0cnVjdCBpbXhfbGRiICpsZGIgPSBpbXhfbGRiX2NoLT5sZGI7CisJaW50IHJldDsKKworCXJldCA9IGlteF9kcm1fZW5jb2Rlcl9wYXJzZV9vZihkcm0sICZpbXhfbGRiX2NoLT5lbmNvZGVyLAorCQkJCSAgICAgICBpbXhfbGRiX2NoLT5jaGlsZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCXJldCA9IGlteF9sZGJfZ2V0X2NsayhsZGIsIGlteF9sZGJfY2gtPmNobm8pOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CisKIAlpZiAobGRiLT5sZGJfY3RybCAmIExEQl9TUExJVF9NT0RFX0VOKSB7Ci0JCXJldCB8PSBpbXhfbGRiX2dldF9jbGsobGRiLCAxKTsKKwkJcmV0ID0gaW14X2xkYl9nZXRfY2xrKGxkYiwgMSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KIAotCWlteF9sZGJfY2gtPmNvbm5lY3Rvci5mdW5jcyA9ICZpbXhfbGRiX2Nvbm5lY3Rvcl9mdW5jczsKLQlpbXhfbGRiX2NoLT5lbmNvZGVyLmZ1bmNzID0gJmlteF9sZGJfZW5jb2Rlcl9mdW5jczsKLQotCWlteF9sZGJfY2gtPmVuY29kZXIuZW5jb2Rlcl90eXBlID0gRFJNX01PREVfRU5DT0RFUl9MVkRTOwotCWlteF9sZGJfY2gtPmNvbm5lY3Rvci5jb25uZWN0b3JfdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTOwotCiAJZHJtX2VuY29kZXJfaGVscGVyX2FkZCgmaW14X2xkYl9jaC0+ZW5jb2RlciwKIAkJCSZpbXhfbGRiX2VuY29kZXJfaGVscGVyX2Z1bmNzKTsKLQlyZXQgPSBpbXhfZHJtX2FkZF9lbmNvZGVyKCZpbXhfbGRiX2NoLT5lbmNvZGVyLAotCQkJJmlteF9sZGJfY2gtPmlteF9kcm1fZW5jb2RlciwgVEhJU19NT0RVTEUpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihsZGItPmRldiwgImFkZGluZyBlbmNvZGVyIGZhaWxlZCB3aXRoICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KKwlkcm1fZW5jb2Rlcl9pbml0KGRybSwgJmlteF9sZGJfY2gtPmVuY29kZXIsICZpbXhfbGRiX2VuY29kZXJfZnVuY3MsCisJCQkgRFJNX01PREVfRU5DT0RFUl9MVkRTKTsKIAogCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmaW14X2xkYl9jaC0+Y29ubmVjdG9yLAogCQkJJmlteF9sZGJfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7Ci0KLQlyZXQgPSBpbXhfZHJtX2FkZF9jb25uZWN0b3IoJmlteF9sZGJfY2gtPmNvbm5lY3RvciwKLQkJCSZpbXhfbGRiX2NoLT5pbXhfZHJtX2Nvbm5lY3RvciwgVEhJU19NT0RVTEUpOwotCWlmIChyZXQpIHsKLQkJaW14X2RybV9yZW1vdmVfZW5jb2RlcihpbXhfbGRiX2NoLT5pbXhfZHJtX2VuY29kZXIpOwotCQlkZXZfZXJyKGxkYi0+ZGV2LCAiYWRkaW5nIGNvbm5lY3RvciBmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CisJZHJtX2Nvbm5lY3Rvcl9pbml0KGRybSwgJmlteF9sZGJfY2gtPmNvbm5lY3RvciwKKwkJCSAgICZpbXhfbGRiX2Nvbm5lY3Rvcl9mdW5jcywgRFJNX01PREVfQ09OTkVDVE9SX0xWRFMpOwogCiAJZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKCZpbXhfbGRiX2NoLT5jb25uZWN0b3IsCiAJCQkmaW14X2xkYl9jaC0+ZW5jb2Rlcik7CkBAIC00NTksMTEgKzQzNiwxMiBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGlteF9sZGJfZHRfaWRzKTsKIAotc3RhdGljIGludCBpbXhfbGRiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IGlteF9sZGJfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGRhdGE7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZCA9Ci0JCQlvZl9tYXRjaF9kZXZpY2UoaW14X2xkYl9kdF9pZHMsICZwZGV2LT5kZXYpOworCQkJb2ZfbWF0Y2hfZGV2aWNlKGlteF9sZGJfZHRfaWRzLCBkZXYpOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQ7CiAJY29uc3QgdTggKmVkaWRwOwogCXN0cnVjdCBpbXhfbGRiICppbXhfbGRiOwpAQCAtNDczLDE3ICs0NTEsMTcgQEAKIAlpbnQgcmV0OwogCWludCBpOwogCi0JaW14X2xkYiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmlteF9sZGIpLCBHRlBfS0VSTkVMKTsKKwlpbXhfbGRiID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCppbXhfbGRiKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbXhfbGRiKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlteF9sZGItPnJlZ21hcCA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X3BoYW5kbGUobnAsICJncHIiKTsKIAlpZiAoSVNfRVJSKGlteF9sZGItPnJlZ21hcCkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBwYXJlbnQgcmVnbWFwXG4iKTsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHBhcmVudCByZWdtYXBcbiIpOwogCQlyZXR1cm4gUFRSX0VSUihpbXhfbGRiLT5yZWdtYXApOwogCX0KIAotCWlteF9sZGItPmRldiA9ICZwZGV2LT5kZXY7CisJaW14X2xkYi0+ZGV2ID0gZGV2OwogCiAJaWYgKG9mX2lkKQogCQlpbXhfbGRiLT5sdmRzX211eCA9IG9mX2lkLT5kYXRhOwpAQCAtNTIxLDcgKzQ5OSw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQlpZiAoZHVhbCAmJiBpID4gMCkgewotCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImR1YWwtY2hhbm5lbCBtb2RlLCBpZ25vcmluZyBzZWNvbmQgb3V0cHV0XG4iKTsKKwkJCWRldl93YXJuKGRldiwgImR1YWwtY2hhbm5lbCBtb2RlLCBpZ25vcmluZyBzZWNvbmQgb3V0cHV0XG4iKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTUzMSw2ICs1MDksNyBAQAogCQljaGFubmVsID0gJmlteF9sZGItPmNoYW5uZWxbaV07CiAJCWNoYW5uZWwtPmxkYiA9IGlteF9sZGI7CiAJCWNoYW5uZWwtPmNobm8gPSBpOworCQljaGFubmVsLT5jaGlsZCA9IGNoaWxkOwogCiAJCWVkaWRwID0gb2ZfZ2V0X3Byb3BlcnR5KGNoaWxkLCAiZWRpZCIsICZjaGFubmVsLT5lZGlkX2xlbik7CiAJCWlmIChlZGlkcCkgewpAQCAtNTUzLDU0ICs1MzIsNjcgQEAKIAkJY2FzZSBMVkRTX0JJVF9NQVBfU1BXRzoKIAkJCWlmIChkYXRhd2lkdGggPT0gMjQpIHsKIAkJCQlpZiAoaSA9PSAwIHx8IGR1YWwpCi0JCQkJCWlteF9sZGItPmxkYl9jdHJsIHw9IExEQl9EQVRBX1dJRFRIX0NIMF8yNDsKKwkJCQkJaW14X2xkYi0+bGRiX2N0cmwgfD0KKwkJCQkJCUxEQl9EQVRBX1dJRFRIX0NIMF8yNDsKIAkJCQlpZiAoaSA9PSAxIHx8IGR1YWwpCi0JCQkJCWlteF9sZGItPmxkYl9jdHJsIHw9IExEQl9EQVRBX1dJRFRIX0NIMV8yNDsKKwkJCQkJaW14X2xkYi0+bGRiX2N0cmwgfD0KKwkJCQkJCUxEQl9EQVRBX1dJRFRIX0NIMV8yNDsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIExWRFNfQklUX01BUF9KRUlEQToKIAkJCWlmIChkYXRhd2lkdGggPT0gMTgpIHsKLQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJKRUlEQSBzdGFuZGFyZCBvbmx5IHN1cHBvcnRlZCBpbiAyNCBiaXRcbiIpOworCQkJCWRldl9lcnIoZGV2LCAiSkVJREEgc3RhbmRhcmQgb25seSBzdXBwb3J0ZWQgaW4gMjQgYml0XG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCWlmIChpID09IDAgfHwgZHVhbCkKLQkJCQlpbXhfbGRiLT5sZGJfY3RybCB8PSBMREJfREFUQV9XSURUSF9DSDBfMjQgfCBMREJfQklUX01BUF9DSDBfSkVJREE7CisJCQkJaW14X2xkYi0+bGRiX2N0cmwgfD0gTERCX0RBVEFfV0lEVEhfQ0gwXzI0IHwKKwkJCQkJTERCX0JJVF9NQVBfQ0gwX0pFSURBOwogCQkJaWYgKGkgPT0gMSB8fCBkdWFsKQotCQkJCWlteF9sZGItPmxkYl9jdHJsIHw9IExEQl9EQVRBX1dJRFRIX0NIMV8yNCB8IExEQl9CSVRfTUFQX0NIMV9KRUlEQTsKKwkJCQlpbXhfbGRiLT5sZGJfY3RybCB8PSBMREJfREFUQV9XSURUSF9DSDFfMjQgfAorCQkJCQlMREJfQklUX01BUF9DSDFfSkVJREE7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgImRhdGEgbWFwcGluZyBub3Qgc3BlY2lmaWVkIG9yIGludmFsaWRcbiIpOworCQkJZGV2X2VycihkZXYsICJkYXRhIG1hcHBpbmcgbm90IHNwZWNpZmllZCBvciBpbnZhbGlkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJcmV0ID0gaW14X2xkYl9yZWdpc3RlcihjaGFubmVsKTsKKwkJcmV0ID0gaW14X2xkYl9yZWdpc3Rlcihkcm0sIGNoYW5uZWwpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKLQotCQlpbXhfZHJtX2VuY29kZXJfYWRkX3Bvc3NpYmxlX2NydGNzKGNoYW5uZWwtPmlteF9kcm1fZW5jb2RlciwgY2hpbGQpOwogCX0KIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGlteF9sZGIpOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGlteF9sZGIpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaW14X2xkYl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyB2b2lkIGlteF9sZGJfdW5iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLAorCXZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGlteF9sZGIgKmlteF9sZGIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaW14X2xkYiAqaW14X2xkYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQlzdHJ1Y3QgaW14X2xkYl9jaGFubmVsICpjaGFubmVsID0gJmlteF9sZGItPmNoYW5uZWxbaV07Ci0JCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSAmY2hhbm5lbC0+Y29ubmVjdG9yOwotCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSAmY2hhbm5lbC0+ZW5jb2RlcjsKIAotCQlkcm1fbW9kZV9jb25uZWN0b3JfZGV0YWNoX2VuY29kZXIoY29ubmVjdG9yLCBlbmNvZGVyKTsKLQotCQlpbXhfZHJtX3JlbW92ZV9jb25uZWN0b3IoY2hhbm5lbC0+aW14X2RybV9jb25uZWN0b3IpOwotCQlpbXhfZHJtX3JlbW92ZV9lbmNvZGVyKGNoYW5uZWwtPmlteF9kcm1fZW5jb2Rlcik7CisJCWNoYW5uZWwtPmNvbm5lY3Rvci5mdW5jcy0+ZGVzdHJveSgmY2hhbm5lbC0+Y29ubmVjdG9yKTsKKwkJY2hhbm5lbC0+ZW5jb2Rlci5mdW5jcy0+ZGVzdHJveSgmY2hhbm5lbC0+ZW5jb2Rlcik7CiAJfQorfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBvbmVudF9vcHMgaW14X2xkYl9vcHMgPSB7CisJLmJpbmQJPSBpbXhfbGRiX2JpbmQsCisJLnVuYmluZAk9IGlteF9sZGJfdW5iaW5kLAorfTsKKworc3RhdGljIGludCBpbXhfbGRiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIGNvbXBvbmVudF9hZGQoJnBkZXYtPmRldiwgJmlteF9sZGJfb3BzKTsKK30KKworc3RhdGljIGludCBpbXhfbGRiX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNvbXBvbmVudF9kZWwoJnBkZXYtPmRldiwgJmlteF9sZGJfb3BzKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LXR2ZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LXR2ZS5jCmluZGV4IDlhYmM3Y2EuLjU3NTUzM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC10dmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtdHZlLmMKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBvbmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgpAQCAtMzAsNiArMzEsNyBAQAogI2luY2x1ZGUgPGRybS9kcm1fZmJfaGVscGVyLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgogCisjaW5jbHVkZSAiaXB1LXYzL2lteC1pcHUtdjMuaCIKICNpbmNsdWRlICJpbXgtZHJtLmgiCiAKICNkZWZpbmUgVFZFX0NPTV9DT05GX1JFRwkweDAwCkBAIC0xMTAsOSArMTEyLDcgQEAKIAogc3RydWN0IGlteF90dmUgewogCXN0cnVjdCBkcm1fY29ubmVjdG9yIGNvbm5lY3RvcjsKLQlzdHJ1Y3QgaW14X2RybV9jb25uZWN0b3IgKmlteF9kcm1fY29ubmVjdG9yOwogCXN0cnVjdCBkcm1fZW5jb2RlciBlbmNvZGVyOwotCXN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKmlteF9kcm1fZW5jb2RlcjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3BpbmxvY2tfdCBsb2NrOwkvKiByZWdpc3RlciBsb2NrICovCiAJYm9vbCBlbmFibGVkOwpAQCAtMjI1LDExICsyMjUsNiBAQAogCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKIH0KIAotc3RhdGljIHZvaWQgaW14X3R2ZV9jb25uZWN0b3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQotewotCS8qIGRvIG5vdCBmcmVlIGhlcmUgKi8KLX0KLQogc3RhdGljIGludCBpbXhfdHZlX2Nvbm5lY3Rvcl9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKIAlzdHJ1Y3QgaW14X3R2ZSAqdHZlID0gY29uX3RvX3R2ZShjb25uZWN0b3IpOwpAQCAtMjU0LDYgKzI0OSwxMSBAQAogewogCXN0cnVjdCBpbXhfdHZlICp0dmUgPSBjb25fdG9fdHZlKGNvbm5lY3Rvcik7CiAJdW5zaWduZWQgbG9uZyByYXRlOworCWludCByZXQ7CisKKwlyZXQgPSBpbXhfZHJtX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkKGNvbm5lY3RvciwgbW9kZSk7CisJaWYgKHJldCAhPSBNT0RFX09LKQorCQlyZXR1cm4gcmV0OwogCiAJLyogcGl4ZWwgY2xvY2sgd2l0aCAyeCBvdmVyc2FtcGxpbmcgKi8KIAlyYXRlID0gY2xrX3JvdW5kX3JhdGUodHZlLT5jbGssIDIwMDBVTCAqIG1vZGUtPmNsb2NrKSAvIDIwMDA7CkBAIC0zMDUsMTMgKzMwNSwxMSBAQAogCiAJc3dpdGNoICh0dmUtPm1vZGUpIHsKIAljYXNlIFRWRV9NT0RFX1ZHQToKLQkJaW14X2RybV9jcnRjX3BhbmVsX2Zvcm1hdF9waW5zKGVuY29kZXItPmNydGMsCi0JCQkJRFJNX01PREVfRU5DT0RFUl9EQUMsIElQVV9QSVhfRk1UX0dCUjI0LAorCQlpbXhfZHJtX3BhbmVsX2Zvcm1hdF9waW5zKGVuY29kZXIsIElQVV9QSVhfRk1UX0dCUjI0LAogCQkJCXR2ZS0+aHN5bmNfcGluLCB0dmUtPnZzeW5jX3Bpbik7CiAJCWJyZWFrOwogCWNhc2UgVFZFX01PREVfVFZPVVQ6Ci0JCWlteF9kcm1fY3J0Y19wYW5lbF9mb3JtYXQoZW5jb2Rlci0+Y3J0YywgRFJNX01PREVfRU5DT0RFUl9UVkRBQywKLQkJCQkJICBWNEwyX1BJWF9GTVRfWVVWNDQ0KTsKKwkJaW14X2RybV9wYW5lbF9mb3JtYXQoZW5jb2RlciwgVjRMMl9QSVhfRk1UX1lVVjQ0NCk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTM2NCwxNiArMzYyLDExIEBACiAJdHZlX2Rpc2FibGUodHZlKTsKIH0KIAotc3RhdGljIHZvaWQgaW14X3R2ZV9lbmNvZGVyX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQotewotCS8qIGRvIG5vdCBmcmVlIGhlcmUgKi8KLX0KLQogc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzIGlteF90dmVfY29ubmVjdG9yX2Z1bmNzID0gewogCS5kcG1zID0gZHJtX2hlbHBlcl9jb25uZWN0b3JfZHBtcywKIAkuZmlsbF9tb2RlcyA9IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcywKIAkuZGV0ZWN0ID0gaW14X3R2ZV9jb25uZWN0b3JfZGV0ZWN0LAotCS5kZXN0cm95ID0gaW14X3R2ZV9jb25uZWN0b3JfZGVzdHJveSwKKwkuZGVzdHJveSA9IGlteF9kcm1fY29ubmVjdG9yX2Rlc3Ryb3ksCiB9OwogCiBzdGF0aWMgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGlteF90dmVfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsKQEAgLTM4Myw3ICszNzYsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBkcm1fZW5jb2Rlcl9mdW5jcyBpbXhfdHZlX2VuY29kZXJfZnVuY3MgPSB7Ci0JLmRlc3Ryb3kgPSBpbXhfdHZlX2VuY29kZXJfZGVzdHJveSwKKwkuZGVzdHJveSA9IGlteF9kcm1fZW5jb2Rlcl9kZXN0cm95LAogfTsKIAogc3RhdGljIHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgaW14X3R2ZV9lbmNvZGVyX2hlbHBlcl9mdW5jcyA9IHsKQEAgLTUwMywzNCArNDk2LDI3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaW14X3R2ZV9yZWdpc3RlcihzdHJ1Y3QgaW14X3R2ZSAqdHZlKQorc3RhdGljIGludCBpbXhfdHZlX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sIHN0cnVjdCBpbXhfdHZlICp0dmUpCiB7CisJaW50IGVuY29kZXJfdHlwZTsKIAlpbnQgcmV0OwogCi0JdHZlLT5jb25uZWN0b3IuZnVuY3MgPSAmaW14X3R2ZV9jb25uZWN0b3JfZnVuY3M7Ci0JdHZlLT5lbmNvZGVyLmZ1bmNzID0gJmlteF90dmVfZW5jb2Rlcl9mdW5jczsKKwllbmNvZGVyX3R5cGUgPSB0dmUtPm1vZGUgPT0gVFZFX01PREVfVkdBID8KKwkJCQlEUk1fTU9ERV9FTkNPREVSX0RBQyA6IERSTV9NT0RFX0VOQ09ERVJfVFZEQUM7CiAKLQl0dmUtPmVuY29kZXIuZW5jb2Rlcl90eXBlID0gRFJNX01PREVfRU5DT0RFUl9OT05FOwotCXR2ZS0+Y29ubmVjdG9yLmNvbm5lY3Rvcl90eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX1ZHQTsKKwlyZXQgPSBpbXhfZHJtX2VuY29kZXJfcGFyc2Vfb2YoZHJtLCAmdHZlLT5lbmNvZGVyLAorCQkJCSAgICAgICB0dmUtPmRldi0+b2Zfbm9kZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoJnR2ZS0+ZW5jb2RlciwgJmlteF90dmVfZW5jb2Rlcl9oZWxwZXJfZnVuY3MpOwotCXJldCA9IGlteF9kcm1fYWRkX2VuY29kZXIoJnR2ZS0+ZW5jb2RlciwgJnR2ZS0+aW14X2RybV9lbmNvZGVyLAotCQkJVEhJU19NT0RVTEUpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycih0dmUtPmRldiwgImFkZGluZyBlbmNvZGVyIGZhaWxlZCB3aXRoICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KKwlkcm1fZW5jb2Rlcl9pbml0KGRybSwgJnR2ZS0+ZW5jb2RlciwgJmlteF90dmVfZW5jb2Rlcl9mdW5jcywKKwkJCSBlbmNvZGVyX3R5cGUpOwogCiAJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZ0dmUtPmNvbm5lY3RvciwKIAkJCSZpbXhfdHZlX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOwotCi0JcmV0ID0gaW14X2RybV9hZGRfY29ubmVjdG9yKCZ0dmUtPmNvbm5lY3RvciwKLQkJCSZ0dmUtPmlteF9kcm1fY29ubmVjdG9yLCBUSElTX01PRFVMRSk7Ci0JaWYgKHJldCkgewotCQlpbXhfZHJtX3JlbW92ZV9lbmNvZGVyKHR2ZS0+aW14X2RybV9lbmNvZGVyKTsKLQkJZGV2X2Vycih0dmUtPmRldiwgImFkZGluZyBjb25uZWN0b3IgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQorCWRybV9jb25uZWN0b3JfaW5pdChkcm0sICZ0dmUtPmNvbm5lY3RvciwgJmlteF90dmVfY29ubmVjdG9yX2Z1bmNzLAorCQkJICAgRFJNX01PREVfQ09OTkVDVE9SX1ZHQSk7CiAKIAlkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIoJnR2ZS0+Y29ubmVjdG9yLCAmdHZlLT5lbmNvZGVyKTsKIApAQCAtNTc2LDkgKzU2MiwxMSBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW50IGlteF90dmVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgaW14X3R2ZV9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGRhdGE7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRkY19ub2RlOwogCXN0cnVjdCBpbXhfdHZlICp0dmU7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CkBAIC01ODcsMTQgKzU3NSwxNCBAQAogCWludCBpcnE7CiAJaW50IHJldDsKIAotCXR2ZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnR2ZSksIEdGUF9LRVJORUwpOworCXR2ZSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqdHZlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0dmUpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JdHZlLT5kZXYgPSAmcGRldi0+ZGV2OworCXR2ZS0+ZGV2ID0gZGV2OwogCXNwaW5fbG9ja19pbml0KCZ0dmUtPmxvY2spOwogCi0JZGRjX25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKG5wLCAiZGRjIiwgMCk7CisJZGRjX25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKG5wLCAiaTJjLWRkYy1idXMiLCAwKTsKIAlpZiAoZGRjX25vZGUpIHsKIAkJdHZlLT5kZGMgPSBvZl9maW5kX2kyY19hZGFwdGVyX2J5X25vZGUoZGRjX25vZGUpOwogCQlvZl9ub2RlX3B1dChkZGNfbm9kZSk7CkBAIC02MDIsNyArNTkwLDcgQEAKIAogCXR2ZS0+bW9kZSA9IG9mX2dldF90dmVfbW9kZShucCk7CiAJaWYgKHR2ZS0+bW9kZSAhPSBUVkVfTU9ERV9WR0EpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAib25seSBWR0EgbW9kZSBzdXBwb3J0ZWQsIGN1cnJlbnRseVxuIik7CisJCWRldl9lcnIoZGV2LCAib25seSBWR0EgbW9kZSBzdXBwb3J0ZWQsIGN1cnJlbnRseVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNjExLDcgKzU5OSw3IEBACiAJCQkJCSAgICZ0dmUtPmhzeW5jX3Bpbik7CiAKIAkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgdnN5bmMgcGluXG4iKTsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCB2c3luYyBwaW5cbiIpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCkBAIC02MTksNDAgKzYwNyw0MCBAQAogCQkJCQkgICAgJnR2ZS0+dnN5bmNfcGluKTsKIAogCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCB2c3luYyBwaW5cbiIpOworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHZzeW5jIHBpblxuIik7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQliYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CiAJaWYgKElTX0VSUihiYXNlKSkKIAkJcmV0dXJuIFBUUl9FUlIoYmFzZSk7CiAKIAl0dmVfcmVnbWFwX2NvbmZpZy5sb2NrX2FyZyA9IHR2ZTsKLQl0dmUtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfbW1pb19jbGsoJnBkZXYtPmRldiwgInR2ZSIsIGJhc2UsCisJdHZlLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X21taW9fY2xrKGRldiwgInR2ZSIsIGJhc2UsCiAJCQkJCQkmdHZlX3JlZ21hcF9jb25maWcpOwogCWlmIChJU19FUlIodHZlLT5yZWdtYXApKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBpbml0IHJlZ21hcDogJWxkXG4iLAorCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBpbml0IHJlZ21hcDogJWxkXG4iLAogCQkJUFRSX0VSUih0dmUtPnJlZ21hcCkpOwogCQlyZXR1cm4gUFRSX0VSUih0dmUtPnJlZ21hcCk7CiAJfQogCiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAoaXJxIDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGlycVxuIik7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBpcnFcbiIpOwogCQlyZXR1cm4gaXJxOwogCX0KIAotCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJnBkZXYtPmRldiwgaXJxLCBOVUxMLAorCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoZGV2LCBpcnEsIE5VTEwsCiAJCQkJCWlteF90dmVfaXJxX2hhbmRsZXIsIElSUUZfT05FU0hPVCwKIAkJCQkJImlteC10dmUiLCB0dmUpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGlycTogJWRcbiIsIHJldCk7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgaXJxOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQl0dmUtPmRhY19yZWcgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJnBkZXYtPmRldiwgImRhYyIpOworCXR2ZS0+ZGFjX3JlZyA9IGRldm1fcmVndWxhdG9yX2dldChkZXYsICJkYWMiKTsKIAlpZiAoIUlTX0VSUih0dmUtPmRhY19yZWcpKSB7CiAJCXJlZ3VsYXRvcl9zZXRfdm9sdGFnZSh0dmUtPmRhY19yZWcsIDI3NTAwMDAsIDI3NTAwMDApOwogCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHR2ZS0+ZGFjX3JlZyk7CkBAIC02NjAsMTcgKzY0OCwxNyBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQl0dmUtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAidHZlIik7CisJdHZlLT5jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAidHZlIik7CiAJaWYgKElTX0VSUih0dmUtPmNsaykpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBoaWdoIHNwZWVkIHR2ZSBjbG9jazogJWxkXG4iLAorCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgaGlnaCBzcGVlZCB0dmUgY2xvY2s6ICVsZFxuIiwKIAkJCVBUUl9FUlIodHZlLT5jbGspKTsKIAkJcmV0dXJuIFBUUl9FUlIodHZlLT5jbGspOwogCX0KIAogCS8qIHRoaXMgaXMgdGhlIElQVSBESSBjbG9jayBpbnB1dCBzZWxlY3RvciwgY2FuIGJlIHBhcmVudGVkIHRvIHR2ZV9kaSAqLwotCXR2ZS0+ZGlfc2VsX2NsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiZGlfc2VsIik7CisJdHZlLT5kaV9zZWxfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImRpX3NlbCIpOwogCWlmIChJU19FUlIodHZlLT5kaV9zZWxfY2xrKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGlwdSBkaSBtdXggY2xvY2s6ICVsZFxuIiwKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGlwdSBkaSBtdXggY2xvY2s6ICVsZFxuIiwKIAkJCVBUUl9FUlIodHZlLT5kaV9zZWxfY2xrKSk7CiAJCXJldHVybiBQVFJfRVJSKHR2ZS0+ZGlfc2VsX2Nsayk7CiAJfQpAQCAtNjgxLDQyICs2NjksNTEgQEAKIAogCXJldCA9IHJlZ21hcF9yZWFkKHR2ZS0+cmVnbWFwLCBUVkVfQ09NX0NPTkZfUkVHLCAmdmFsKTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVhZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyOiAlZFxuIiwgcmV0KTsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVhZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJaWYgKHZhbCAhPSAweDAwMTAwMDAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgZGVmYXVsdCB2YWx1ZSBpbmRpY2F0ZXMgdGhpcyBpcyBub3QgYSBUVkV2MlxuIik7CisJCWRldl9lcnIoZGV2LCAiY29uZmlndXJhdGlvbiByZWdpc3RlciBkZWZhdWx0IHZhbHVlIGluZGljYXRlcyB0aGlzIGlzIG5vdCBhIFRWRXYyXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJLyogZGlzYWJsZSBjYWJsZSBkZXRlY3Rpb24gZm9yIFZHQSBtb2RlICovCiAJcmV0ID0gcmVnbWFwX3dyaXRlKHR2ZS0+cmVnbWFwLCBUVkVfQ0RfQ09OVF9SRUcsIDApOwogCi0JcmV0ID0gaW14X3R2ZV9yZWdpc3Rlcih0dmUpOworCXJldCA9IGlteF90dmVfcmVnaXN0ZXIoZHJtLCB0dmUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBpbXhfZHJtX2VuY29kZXJfYWRkX3Bvc3NpYmxlX2NydGNzKHR2ZS0+aW14X2RybV9lbmNvZGVyLCBucCk7Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB0dmUpOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHR2ZSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpbXhfdHZlX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIHZvaWQgaW14X3R2ZV91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsCisJdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgaW14X3R2ZSAqdHZlID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9ICZ0dmUtPmNvbm5lY3RvcjsKLQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSAmdHZlLT5lbmNvZGVyOworCXN0cnVjdCBpbXhfdHZlICp0dmUgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWRybV9tb2RlX2Nvbm5lY3Rvcl9kZXRhY2hfZW5jb2Rlcihjb25uZWN0b3IsIGVuY29kZXIpOwotCi0JaW14X2RybV9yZW1vdmVfY29ubmVjdG9yKHR2ZS0+aW14X2RybV9jb25uZWN0b3IpOwotCWlteF9kcm1fcmVtb3ZlX2VuY29kZXIodHZlLT5pbXhfZHJtX2VuY29kZXIpOworCXR2ZS0+Y29ubmVjdG9yLmZ1bmNzLT5kZXN0cm95KCZ0dmUtPmNvbm5lY3Rvcik7CisJdHZlLT5lbmNvZGVyLmZ1bmNzLT5kZXN0cm95KCZ0dmUtPmVuY29kZXIpOwogCiAJaWYgKCFJU19FUlIodHZlLT5kYWNfcmVnKSkKIAkJcmVndWxhdG9yX2Rpc2FibGUodHZlLT5kYWNfcmVnKTsKK30KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBjb21wb25lbnRfb3BzIGlteF90dmVfb3BzID0geworCS5iaW5kCT0gaW14X3R2ZV9iaW5kLAorCS51bmJpbmQJPSBpbXhfdHZlX3VuYmluZCwKK307CisKK3N0YXRpYyBpbnQgaW14X3R2ZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBjb21wb25lbnRfYWRkKCZwZGV2LT5kZXYsICZpbXhfdHZlX29wcyk7Cit9CisKK3N0YXRpYyBpbnQgaW14X3R2ZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb21wb25lbnRfZGVsKCZwZGV2LT5kZXYsICZpbXhfdHZlX29wcyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pbXgtaXB1LXYzLmggYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaW14LWlwdS12My5oCmluZGV4IDQ4MjZiNWMuLmM0ZDE0ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pbXgtaXB1LXYzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lteC1pcHUtdjMuaApAQCAtMjUsNiArMjUsOCBAQAogCUlQVVYzSCwKIH07CiAKKyNkZWZpbmUgSVBVX1BJWF9GTVRfR0JSMjQJdjRsMl9mb3VyY2MoJ0cnLCAnQicsICdSJywgJzMnKQorCiAvKgogICogQml0ZmllbGQgb2YgRGlzcGxheSBJbnRlcmZhY2Ugc2lnbmFsIHBvbGFyaXRpZXMuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pcHUtZGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pcHUtZGMuYwppbmRleCBkMGUzYmMzLi5kNWRlOGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaXB1LWRjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kYy5jCkBAIC0yNjIsNyArMjYyLDcgQEAKIAogCS8qIFdhaXQgZm9yIERDIHRyaXBsZSBidWZmZXIgdG8gZW1wdHkgKi8KIAl3aGlsZSAoKHJlYWRsKHByaXYtPmRjX3JlZyArIERDX1NUQVQpICYgdmFsKSAhPSB2YWwpIHsKLQkJbXNsZWVwKDIpOworCQl1c2xlZXBfcmFuZ2UoMjAwMCwgMjAwMDApOwogCQl0aW1lb3V0IC09IDI7CiAJCWlmICh0aW1lb3V0IDw9IDApCiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pcHUtZGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pcHUtZGkuYwppbmRleCA5NDhhNDliLi44MmE5ZWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaXB1LWRpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kaS5jCkBAIC0xOSw5ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KIAogI2luY2x1ZGUgImlteC1pcHUtdjMuaCIKICNpbmNsdWRlICJpcHUtcHJ2LmgiCkBAIC0zMywxMCArMzAsNyBAQAogCXN0cnVjdCBjbGsgKmNsa19kaTsJLyogZGlzcGxheSBpbnB1dCBjbG9jayAqLwogCXN0cnVjdCBjbGsgKmNsa19pcHU7CS8qIElQVSBidXMgY2xvY2sgKi8KIAlzdHJ1Y3QgY2xrICpjbGtfZGlfcGl4ZWw7IC8qIHJlc3VsdGluZyBwaXhlbCBjbG9jayAqLwotCXN0cnVjdCBjbGtfaHcgY2xrX2h3X291dDsKLQljaGFyICpjbGtfbmFtZTsKIAlib29sIGludXNlOwotCXVuc2lnbmVkIGxvbmcgY2xrZmxhZ3M7CiAJc3RydWN0IGlwdV9zb2MgKmlwdTsKIH07CiAKQEAgLTE0MSwxMzAgKzEzNSw2IEBACiAJd3JpdGVsKHZhbHVlLCBkaS0+YmFzZSArIG9mZnNldCk7CiB9CiAKLXN0YXRpYyBpbnQgaXB1X2RpX2Nsa19jYWxjX2Rpdih1bnNpZ25lZCBsb25nIGlucmF0ZSwgdW5zaWduZWQgbG9uZyBvdXRyYXRlKQotewotCXU2NCB0bXAgPSBpbnJhdGU7Ci0JaW50IGRpdjsKLQotCXRtcCAqPSAxNjsKLQotCWRvX2Rpdih0bXAsIG91dHJhdGUpOwotCi0JZGl2ID0gdG1wOwotCi0JaWYgKGRpdiA8IDB4MTApCi0JCWRpdiA9IDB4MTA7Ci0KLSNpZmRlZiBXVEZfSVNfVEhJUwotCS8qCi0JICogRnJlZXNjYWxlIGhhcyB0aGlzIGluIHRoZWlyIEtlcm5lbC4gSXQgaXMgbmVpdGhlciBjbGVhciB3aGF0Ci0JICogaXQgZG9lcyBub3Igd2h5IGl0IGRvZXMgaXQKLQkgKi8KLQlpZiAoZGl2ICYgMHgxMCkKLQkJZGl2ICY9IH4weDc7Ci0JZWxzZSB7Ci0JCS8qIFJvdW5kIHVwIGRpdmlkZXIgaWYgaXQgZ2V0cyB1cyBjbG9zZXIgdG8gZGVzaXJlZCBwaXggY2xrICovCi0JCWlmICgoZGl2ICYgMHhDKSA9PSAweEMpIHsKLQkJCWRpdiArPSAweDEwOwotCQkJZGl2ICY9IH4weEY7Ci0JCX0KLQl9Ci0jZW5kaWYKLQlyZXR1cm4gZGl2OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjbGtfZGlfcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCi0JCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCi17Ci0Jc3RydWN0IGlwdV9kaSAqZGkgPSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBpcHVfZGksIGNsa19od19vdXQpOwotCXVuc2lnbmVkIGxvbmcgb3V0cmF0ZTsKLQl1MzIgZGl2ID0gaXB1X2RpX3JlYWQoZGksIERJX0JTX0NMS0dFTjApOwotCi0JaWYgKGRpdiA8IDB4MTApCi0JCWRpdiA9IDB4MTA7Ci0KLQlvdXRyYXRlID0gKHBhcmVudF9yYXRlIC8gZGl2KSAqIDE2OwotCi0JcmV0dXJuIG91dHJhdGU7Ci19Ci0KLXN0YXRpYyBsb25nIGNsa19kaV9yb3VuZF9yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LCB1bnNpZ25lZCBsb25nIHJhdGUsCi0JCQkJdW5zaWduZWQgbG9uZyAqcHJhdGUpCi17Ci0Jc3RydWN0IGlwdV9kaSAqZGkgPSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBpcHVfZGksIGNsa19od19vdXQpOwotCXVuc2lnbmVkIGxvbmcgb3V0cmF0ZTsKLQlpbnQgZGl2OwotCXUzMiB2YWw7Ci0KLQlkaXYgPSBpcHVfZGlfY2xrX2NhbGNfZGl2KCpwcmF0ZSwgcmF0ZSk7Ci0KLQlvdXRyYXRlID0gKCpwcmF0ZSAvIGRpdikgKiAxNjsKLQotCXZhbCA9IGlwdV9kaV9yZWFkKGRpLCBESV9HRU5FUkFMKTsKLQotCWlmICghKHZhbCAmIERJX0dFTl9ESV9DTEtfRVhUKSAmJiBvdXRyYXRlID4gKnByYXRlIC8gMikKLQkJb3V0cmF0ZSA9ICpwcmF0ZSAvIDI7Ci0KLQlkZXZfZGJnKGRpLT5pcHUtPmRldiwKLQkJIiVzOiBpbnJhdGU6ICVsZCBkaXY6IDB4JTA4eCBvdXRyYXRlOiAlbGQgd2FudGVkOiAlbGRcbiIsCi0JCQlfX2Z1bmNfXywgKnByYXRlLCBkaXYsIG91dHJhdGUsIHJhdGUpOwotCi0JcmV0dXJuIG91dHJhdGU7Ci19Ci0KLXN0YXRpYyBpbnQgY2xrX2RpX3NldF9yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LCB1bnNpZ25lZCBsb25nIHJhdGUsCi0JCQkJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKLXsKLQlzdHJ1Y3QgaXB1X2RpICpkaSA9IGNvbnRhaW5lcl9vZihodywgc3RydWN0IGlwdV9kaSwgY2xrX2h3X291dCk7Ci0JaW50IGRpdjsKLQl1MzIgY2xrZ2VuMDsKLQotCWNsa2dlbjAgPSBpcHVfZGlfcmVhZChkaSwgRElfQlNfQ0xLR0VOMCkgJiB+MHhmZmY7Ci0KLQlkaXYgPSBpcHVfZGlfY2xrX2NhbGNfZGl2KHBhcmVudF9yYXRlLCByYXRlKTsKLQotCWlwdV9kaV93cml0ZShkaSwgY2xrZ2VuMCB8IGRpdiwgRElfQlNfQ0xLR0VOMCk7Ci0KLQlkZXZfZGJnKGRpLT5pcHUtPmRldiwgIiVzOiBpbnJhdGU6ICVsZCBkZXNpcmVkOiAlbGQgZGl2OiAweCUwOHhcbiIsCi0JCQlfX2Z1bmNfXywgcGFyZW50X3JhdGUsIHJhdGUsIGRpdik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1OCBjbGtfZGlfZ2V0X3BhcmVudChzdHJ1Y3QgY2xrX2h3ICpodykKLXsKLQlzdHJ1Y3QgaXB1X2RpICpkaSA9IGNvbnRhaW5lcl9vZihodywgc3RydWN0IGlwdV9kaSwgY2xrX2h3X291dCk7Ci0JdTMyIHZhbDsKLQotCXZhbCA9IGlwdV9kaV9yZWFkKGRpLCBESV9HRU5FUkFMKTsKLQotCXJldHVybiB2YWwgJiBESV9HRU5fRElfQ0xLX0VYVCA/IDEgOiAwOwotfQotCi1zdGF0aWMgaW50IGNsa19kaV9zZXRfcGFyZW50KHN0cnVjdCBjbGtfaHcgKmh3LCB1OCBpbmRleCkKLXsKLQlzdHJ1Y3QgaXB1X2RpICpkaSA9IGNvbnRhaW5lcl9vZihodywgc3RydWN0IGlwdV9kaSwgY2xrX2h3X291dCk7Ci0JdTMyIHZhbDsKLQotCXZhbCA9IGlwdV9kaV9yZWFkKGRpLCBESV9HRU5FUkFMKTsKLQotCWlmIChpbmRleCkKLQkJdmFsIHw9IERJX0dFTl9ESV9DTEtfRVhUOwotCWVsc2UKLQkJdmFsICY9IH5ESV9HRU5fRElfQ0xLX0VYVDsKLQotCWlwdV9kaV93cml0ZShkaSwgdmFsLCBESV9HRU5FUkFMKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGNsa19vcHMgY2xrX2RpX29wcyA9IHsKLQkucm91bmRfcmF0ZSA9IGNsa19kaV9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZSA9IGNsa19kaV9zZXRfcmF0ZSwKLQkucmVjYWxjX3JhdGUgPSBjbGtfZGlfcmVjYWxjX3JhdGUsCi0JLnNldF9wYXJlbnQgPSBjbGtfZGlfc2V0X3BhcmVudCwKLQkuZ2V0X3BhcmVudCA9IGNsa19kaV9nZXRfcGFyZW50LAotfTsKLQogc3RhdGljIHZvaWQgaXB1X2RpX2RhdGFfd2F2ZV9jb25maWcoc3RydWN0IGlwdV9kaSAqZGksCiAJCQkJICAgICBpbnQgd2F2ZV9nZW4sCiAJCQkJICAgICBpbnQgYWNjZXNzX3NpemUsIGludCBjb21wb25lbnRfc2l6ZSkKQEAgLTUyOCwxNSArMzk4LDEyNSBAQAogCQlpcHVfZGlfc3luY19jb25maWcoZGksIGNmZ192Z2EsIDAsIEFSUkFZX1NJWkUoY2ZnX3ZnYSkpOwogfQogCitzdGF0aWMgdm9pZCBpcHVfZGlfY29uZmlnX2Nsb2NrKHN0cnVjdCBpcHVfZGkgKmRpLAorCWNvbnN0IHN0cnVjdCBpcHVfZGlfc2lnbmFsX2NmZyAqc2lnKQoreworCXN0cnVjdCBjbGsgKmNsazsKKwl1bnNpZ25lZCBjbGtnZW4wOworCXVpbnQzMl90IHZhbDsKKworCWlmIChzaWctPmNsa2ZsYWdzICYgSVBVX0RJX0NMS01PREVfRVhUKSB7CisJCS8qCisJCSAqIENMS01PREVfRVhUIG1lYW5zIHdlIG11c3QgdXNlIHRoZSBESSBjbG9jazogdGhpcyBpcworCQkgKiBuZWVkZWQgZm9yIHRoaW5ncyBsaWtlIExWRFMgd2hpY2ggbmVlZHMgdG8gZmVlZCB0aGUKKwkJICogREkgYW5kIExEQiB3aXRoIHRoZSBzYW1lIHBpeGVsIGNsb2NrLgorCQkgKi8KKwkJY2xrID0gZGktPmNsa19kaTsKKworCQlpZiAoc2lnLT5jbGtmbGFncyAmIElQVV9ESV9DTEtNT0RFX1NZTkMpIHsKKwkJCS8qCisJCQkgKiBDTEtNT0RFX1NZTkMgbWVhbnMgdGhhdCB3ZSB3YW50IHRoZSBESSB0byBiZQorCQkJICogY2xvY2tlZCBhdCB0aGUgc2FtZSByYXRlIGFzIHRoZSBwYXJlbnQgY2xvY2suCisJCQkgKiBUaGlzIGlzIG5lZWRlZCAoZWcpIGZvciBMREIgd2hpY2ggbmVlZHMgdG8gYmUKKwkJCSAqIGZlZCB3aXRoIHRoZSBzYW1lIHBpeGVsIGNsb2NrLiAgV2UgYXNzdW1lIHRoYXQKKwkJCSAqIHRoZSBMREIgY2xvY2sgaGFzIGFscmVhZHkgYmVlbiBzZXQgY29ycmVjdGx5LgorCQkJICovCisJCQljbGtnZW4wID0gMSA8PCA0OworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFdlIGNhbiB1c2UgdGhlIGRpdmlkZXIuICBXZSBzaG91bGQgcmVhbGx5IGhhdmUKKwkJCSAqIGEgZmxhZyBoZXJlIGluZGljYXRpbmcgd2hldGhlciB0aGUgYnJpZGdlIGNhbgorCQkJICogY29wZSB3aXRoIGEgZnJhY3Rpb25hbCBkaXZpZGVyIG9yIG5vdC4gIEZvciB0aGUKKwkJCSAqIHRpbWUgYmVpbmcsIGxldCdzIGdvIGZvciBzaW1wbGljaXRseSBhbmQKKwkJCSAqIHJlbGlhYmlsaXR5LgorCQkJICovCisJCQl1bnNpZ25lZCBsb25nIGluX3JhdGU7CisJCQl1bnNpZ25lZCBkaXY7CisKKwkJCWNsa19zZXRfcmF0ZShjbGssIHNpZy0+cGl4ZWxjbG9jayk7CisKKwkJCWluX3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKKwkJCWRpdiA9IChpbl9yYXRlICsgc2lnLT5waXhlbGNsb2NrIC8gMikgLyBzaWctPnBpeGVsY2xvY2s7CisJCQlpZiAoZGl2ID09IDApCisJCQkJZGl2ID0gMTsKKworCQkJY2xrZ2VuMCA9IGRpdiA8PCA0OworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRm9yIG90aGVyIGludGVyZmFjZXMsIHdlIGNhbiBhcmJpdGFyaWx5IHNlbGVjdCBiZXR3ZWVuCisJCSAqIHRoZSBESSBzcGVjaWZpYyBjbG9jayBhbmQgdGhlIGludGVybmFsIElQVSBjbG9jay4gIFNlZQorCQkgKiBESV9HRU5FUkFMIGJpdCAyMC4gIFdlIHNlbGVjdCB0aGUgSVBVIGNsb2NrIGlmIGl0IGNhbgorCQkgKiBnaXZlIHVzIGEgY2xvY2sgcmF0ZSB3aXRoaW4gMSUgb2YgdGhlIHJlcXVlc3RlZCBmcmVxdWVuY3ksCisJCSAqIG90aGVyd2lzZSB3ZSB1c2UgdGhlIERJIGNsb2NrLgorCQkgKi8KKwkJdW5zaWduZWQgbG9uZyByYXRlLCBjbGtyYXRlOworCQl1bnNpZ25lZCBkaXYsIGVycm9yOworCisJCWNsa3JhdGUgPSBjbGtfZ2V0X3JhdGUoZGktPmNsa19pcHUpOworCQlkaXYgPSAoY2xrcmF0ZSArIHNpZy0+cGl4ZWxjbG9jayAvIDIpIC8gc2lnLT5waXhlbGNsb2NrOworCQlyYXRlID0gY2xrcmF0ZSAvIGRpdjsKKworCQllcnJvciA9IHJhdGUgLyAoc2lnLT5waXhlbGNsb2NrIC8gMTAwMCk7CisKKwkJZGV2X2RiZyhkaS0+aXB1LT5kZXYsICIgIElQVSBjbG9jayBjYW4gZ2l2ZSAlbHUgd2l0aCBkaXZpZGVyICV1LCBlcnJvciAlZC4ldSUlXG4iLAorCQkJcmF0ZSwgZGl2LCAoc2lnbmVkKShlcnJvciAtIDEwMDApIC8gMTAsIGVycm9yICUgMTApOworCisJCS8qIEFsbG93IGEgMSUgZXJyb3IgKi8KKwkJaWYgKGVycm9yIDwgMTAxMCAmJiBlcnJvciA+PSA5OTApIHsKKwkJCWNsayA9IGRpLT5jbGtfaXB1OworCisJCQljbGtnZW4wID0gZGl2IDw8IDQ7CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBsb25nIGluX3JhdGU7CisJCQl1bnNpZ25lZCBkaXY7CisKKwkJCWNsayA9IGRpLT5jbGtfZGk7CisKKwkJCWNsa19zZXRfcmF0ZShjbGssIHNpZy0+cGl4ZWxjbG9jayk7CisKKwkJCWluX3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKKwkJCWRpdiA9IChpbl9yYXRlICsgc2lnLT5waXhlbGNsb2NrIC8gMikgLyBzaWctPnBpeGVsY2xvY2s7CisJCQlpZiAoZGl2ID09IDApCisJCQkJZGl2ID0gMTsKKworCQkJY2xrZ2VuMCA9IGRpdiA8PCA0OworCQl9CisJfQorCisJZGktPmNsa19kaV9waXhlbCA9IGNsazsKKworCS8qIFNldCB0aGUgZGl2aWRlciAqLworCWlwdV9kaV93cml0ZShkaSwgY2xrZ2VuMCwgRElfQlNfQ0xLR0VOMCk7CisKKwkvKgorCSAqIFNldCB0aGUgaGlnaC9sb3cgcGVyaW9kcy4gIEJpdHMgMjQ6MTYgZ2l2ZSB1cyB0aGUgZmFsbGluZyBlZGdlLAorCSAqIGFuZCBiaXRzIDg6MCBnaXZlIHRoZSByaXNpbmcgZWRnZS4gIExTQiBpcyBmcmFjdGlvbiwgYW5kIGlzCisJICogYmFzZWQgb24gdGhlIGRpdmlkZXIgYWJvdmUuICBXZSB3YW50IGEgNTAlIGR1dHkgY3ljbGUsIHNvIHNldAorCSAqIHRoZSBmYWxsaW5nIGVkZ2UgdG8gYmUgaGFsZiB0aGUgZGl2aWRlci4KKwkgKi8KKwlpcHVfZGlfd3JpdGUoZGksIChjbGtnZW4wID4+IDQpIDw8IDE2LCBESV9CU19DTEtHRU4xKTsKKworCS8qIEZpbmFsbHkgc2VsZWN0IHRoZSBpbnB1dCBjbG9jayAqLworCXZhbCA9IGlwdV9kaV9yZWFkKGRpLCBESV9HRU5FUkFMKSAmIH5ESV9HRU5fRElfQ0xLX0VYVDsKKwlpZiAoY2xrID09IGRpLT5jbGtfZGkpCisJCXZhbCB8PSBESV9HRU5fRElfQ0xLX0VYVDsKKwlpcHVfZGlfd3JpdGUoZGksIHZhbCwgRElfR0VORVJBTCk7CisKKwlkZXZfZGJnKGRpLT5pcHUtPmRldiwgIldhbnQgJWx1SHogSVBVICVsdUh6IERJICVsdUh6IHVzaW5nICVzLCAlbHVIelxuIiwKKwkJc2lnLT5waXhlbGNsb2NrLAorCQljbGtfZ2V0X3JhdGUoZGktPmNsa19pcHUpLAorCQljbGtfZ2V0X3JhdGUoZGktPmNsa19kaSksCisJCWNsayA9PSBkaS0+Y2xrX2RpID8gIkRJIiA6ICJJUFUiLAorCQljbGtfZ2V0X3JhdGUoZGktPmNsa19kaV9waXhlbCkgLyAoY2xrZ2VuMCA+PiA0KSk7Cit9CisKIGludCBpcHVfZGlfaW5pdF9zeW5jX3BhbmVsKHN0cnVjdCBpcHVfZGkgKmRpLCBzdHJ1Y3QgaXB1X2RpX3NpZ25hbF9jZmcgKnNpZykKIHsKIAl1MzIgcmVnOwogCXUzMiBkaV9nZW4sIHZzeW5jX2NudDsKIAl1MzIgZGl2OwogCXUzMiBoX3RvdGFsLCB2X3RvdGFsOwotCWludCByZXQ7Ci0JdW5zaWduZWQgbG9uZyByb3VuZDsKLQlzdHJ1Y3QgY2xrICpwYXJlbnQ7CiAKIAlkZXZfZGJnKGRpLT5pcHUtPmRldiwgImRpc3AgJWQ6IHBhbmVsIHNpemUgPSAlZCB4ICVkXG4iLAogCQlkaS0+aWQsIHNpZy0+d2lkdGgsIHNpZy0+aGVpZ2h0KTsKQEAgLTU0NCwzMyArNTI0LDIwIEBACiAJaWYgKChzaWctPnZfc3luY193aWR0aCA9PSAwKSB8fCAoc2lnLT5oX3N5bmNfd2lkdGggPT0gMCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHNpZy0+Y2xrZmxhZ3MgJiBJUFVfRElfQ0xLTU9ERV9FWFQpCi0JCXBhcmVudCA9IGRpLT5jbGtfZGk7Ci0JZWxzZQotCQlwYXJlbnQgPSBkaS0+Y2xrX2lwdTsKLQotCXJldCA9IGNsa19zZXRfcGFyZW50KGRpLT5jbGtfZGlfcGl4ZWwsIHBhcmVudCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRpLT5pcHUtPmRldiwKLQkJCSJzZXR0aW5nIHBpeGVsIGNsb2NrIHRvIHBhcmVudCAlcyBmYWlsZWQgd2l0aCAlZFxuIiwKLQkJCQlfX2Nsa19nZXRfbmFtZShwYXJlbnQpLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChzaWctPmNsa2ZsYWdzICYgSVBVX0RJX0NMS01PREVfU1lOQykKLQkJcm91bmQgPSBjbGtfZ2V0X3JhdGUocGFyZW50KTsKLQllbHNlCi0JCXJvdW5kID0gY2xrX3JvdW5kX3JhdGUoZGktPmNsa19kaV9waXhlbCwgc2lnLT5waXhlbGNsb2NrKTsKLQotCXJldCA9IGNsa19zZXRfcmF0ZShkaS0+Y2xrX2RpX3BpeGVsLCByb3VuZCk7Ci0KIAloX3RvdGFsID0gc2lnLT53aWR0aCArIHNpZy0+aF9zeW5jX3dpZHRoICsgc2lnLT5oX3N0YXJ0X3dpZHRoICsKIAkJc2lnLT5oX2VuZF93aWR0aDsKIAl2X3RvdGFsID0gc2lnLT5oZWlnaHQgKyBzaWctPnZfc3luY193aWR0aCArIHNpZy0+dl9zdGFydF93aWR0aCArCiAJCXNpZy0+dl9lbmRfd2lkdGg7CiAKKwlkZXZfZGJnKGRpLT5pcHUtPmRldiwgIkNsb2NrczogSVBVICVsdUh6IERJICVsdUh6IE5lZWRlZCAlbHVIelxuIiwKKwkJY2xrX2dldF9yYXRlKGRpLT5jbGtfaXB1KSwKKwkJY2xrX2dldF9yYXRlKGRpLT5jbGtfZGkpLAorCQlzaWctPnBpeGVsY2xvY2spOworCiAJbXV0ZXhfbG9jaygmZGlfbXV0ZXgpOwogCisJaXB1X2RpX2NvbmZpZ19jbG9jayhkaSwgc2lnKTsKKwogCWRpdiA9IGlwdV9kaV9yZWFkKGRpLCBESV9CU19DTEtHRU4wKSAmIDB4ZmZmOwogCWRpdiA9IGRpdiAvIDE2OwkJLyogTm93IGRpdmlkZXIgaXMgaW50ZWdlciBwb3J0aW9uICovCiAKQEAgLTY1NCw3ICs2MjEsMTEgQEAKIAogaW50IGlwdV9kaV9lbmFibGUoc3RydWN0IGlwdV9kaSAqZGkpCiB7Ci0JaW50IHJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkaS0+Y2xrX2RpX3BpeGVsKTsKKwlpbnQgcmV0OworCisJV0FSTl9PTihJU19FUlIoZGktPmNsa19kaV9waXhlbCkpOworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRpLT5jbGtfZGlfcGl4ZWwpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTY2Niw2ICs2MzcsOCBAQAogCiBpbnQgaXB1X2RpX2Rpc2FibGUoc3RydWN0IGlwdV9kaSAqZGkpCiB7CisJV0FSTl9PTihJU19FUlIoZGktPmNsa19kaV9waXhlbCkpOworCiAJaXB1X21vZHVsZV9kaXNhYmxlKGRpLT5pcHUsIGRpLT5tb2R1bGUpOwogCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRpLT5jbGtfZGlfcGl4ZWwpOwpAQCAtNzIxLDEzICs2OTQsNiBAQAogCQl1MzIgbW9kdWxlLCBzdHJ1Y3QgY2xrICpjbGtfaXB1KQogewogCXN0cnVjdCBpcHVfZGkgKmRpOwotCWludCByZXQ7Ci0JY29uc3QgY2hhciAqZGlfcGFyZW50WzJdOwotCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQgPSB7Ci0JCS5vcHMgPSAmY2xrX2RpX29wcywKLQkJLm51bV9wYXJlbnRzID0gMiwKLQkJLmZsYWdzID0gMCwKLQl9OwogCiAJaWYgKGlkID4gMSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC03NDksNDUgKzcxNSwxNiBAQAogCWlmICghZGktPmJhc2UpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZGlfcGFyZW50WzBdID0gX19jbGtfZ2V0X25hbWUoZGktPmNsa19pcHUpOwotCWRpX3BhcmVudFsxXSA9IF9fY2xrX2dldF9uYW1lKGRpLT5jbGtfZGkpOwotCiAJaXB1X2RpX3dyaXRlKGRpLCAweDEwLCBESV9CU19DTEtHRU4wKTsKIAotCWluaXQucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKiopJmRpX3BhcmVudDsKLQlkaS0+Y2xrX25hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzX2RpJWRfcGl4ZWwiLAotCQkJZGV2X25hbWUoZGV2KSwgaWQpOwotCWlmICghZGktPmNsa19uYW1lKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWluaXQubmFtZSA9IGRpLT5jbGtfbmFtZTsKLQotCWRpLT5jbGtfaHdfb3V0LmluaXQgPSAmaW5pdDsKLQlkaS0+Y2xrX2RpX3BpeGVsID0gY2xrX3JlZ2lzdGVyKGRldiwgJmRpLT5jbGtfaHdfb3V0KTsKLQotCWlmIChJU19FUlIoZGktPmNsa19kaV9waXhlbCkpIHsKLQkJcmV0ID0gUFRSX0VSUihkaS0+Y2xrX2RpX3BpeGVsKTsKLQkJZ290byBmYWlsZWRfY2xrX3JlZ2lzdGVyOwotCX0KLQogCWRldl9kYmcoZGV2LCAiREklZCBiYXNlOiAweCUwOGx4IHJlbWFwcGVkIHRvICVwXG4iLAogCQkJaWQsIGJhc2UsIGRpLT5iYXNlKTsKIAlkaS0+aW51c2UgPSBmYWxzZTsKIAlkaS0+aXB1ID0gaXB1OwogCiAJcmV0dXJuIDA7Ci0KLWZhaWxlZF9jbGtfcmVnaXN0ZXI6Ci0KLQlrZnJlZShkaS0+Y2xrX25hbWUpOwotCi0JcmV0dXJuIHJldDsKIH0KIAogdm9pZCBpcHVfZGlfZXhpdChzdHJ1Y3QgaXB1X3NvYyAqaXB1LCBpbnQgaWQpCiB7Ci0Jc3RydWN0IGlwdV9kaSAqZGkgPSBpcHUtPmRpX3ByaXZbaWRdOwotCi0JY2xrX3VucmVnaXN0ZXIoZGktPmNsa19kaV9waXhlbCk7Ci0Ja2ZyZWUoZGktPmNsa19uYW1lKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pcHUtZG1mYy5jIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kbWZjLmMKaW5kZXggOTgwNzBkZC4uNDUyMTMwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kbWZjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kbWZjLmMKQEAgLTE2MSw5ICsxNjEsNiBAQAogCQkJImRtZmM6IHVzaW5nICVkIHNsb3RzIHN0YXJ0aW5nIGZyb20gc2VnbWVudCAlZCBmb3IgSVBVIGNoYW5uZWwgJWRcbiIsCiAJCQlzbG90cywgc2VnbWVudCwgZG1mYy0+ZGF0YS0+aXB1X2NoYW5uZWwpOwogCi0JaWYgKCFkbWZjKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXN3aXRjaCAoc2xvdHMpIHsKIAljYXNlIDE6CiAJCWZpZWxkID0gRE1GQ19GSUZPX1NJWkVfNjQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHV2My1jcnRjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHV2My1jcnRjLmMKaW5kZXggMjJiZTEwNC4uYThkMDE3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1djMtY3J0Yy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdXYzLWNydGMuYwpAQCAtMTcsNiArMTcsNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAogICogTUEgMDIxMTAtMTMwMSwgVVNBLgogICovCisjaW5jbHVkZSA8bGludXgvY29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC0yODQsNiArMjg1LDcgQEAKIAkJaXB1X2NydGMtPmRpX2Nsa2ZsYWdzID0gSVBVX0RJX0NMS01PREVfU1lOQyB8CiAJCQlJUFVfRElfQ0xLTU9ERV9FWFQ7CiAJCWJyZWFrOworCWNhc2UgRFJNX01PREVfRU5DT0RFUl9UTURTOgogCWNhc2UgRFJNX01PREVfRU5DT0RFUl9OT05FOgogCQlpcHVfY3J0Yy0+ZGlfY2xrZmxhZ3MgPSAwOwogCQlicmVhazsKQEAgLTMzNCw3ICszMzYsNyBAQAogfQogCiBzdGF0aWMgaW50IGlwdV9jcnRjX2luaXQoc3RydWN0IGlwdV9jcnRjICppcHVfY3J0YywKLQkJc3RydWN0IGlwdV9jbGllbnRfcGxhdGZvcm1kYXRhICpwZGF0YSkKKwlzdHJ1Y3QgaXB1X2NsaWVudF9wbGF0Zm9ybWRhdGEgKnBkYXRhLCBzdHJ1Y3QgZHJtX2RldmljZSAqZHJtKQogewogCXN0cnVjdCBpcHVfc29jICppcHUgPSBkZXZfZ2V0X2RydmRhdGEoaXB1X2NydGMtPmRldi0+cGFyZW50KTsKIAlpbnQgZHAgPSAtRUlOVkFMOwpAQCAtMzQ4LDEwICszNTAsOCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IGlteF9kcm1fYWRkX2NydGMoJmlwdV9jcnRjLT5iYXNlLAotCQkJJmlwdV9jcnRjLT5pbXhfY3J0YywKLQkJCSZpcHVfY3J0Y19oZWxwZXJfZnVuY3MsIFRISVNfTU9EVUxFLAotCQkJaXB1X2NydGMtPmRldi0+cGFyZW50LT5vZl9ub2RlLCBwZGF0YS0+ZGkpOworCXJldCA9IGlteF9kcm1fYWRkX2NydGMoZHJtLCAmaXB1X2NydGMtPmJhc2UsICZpcHVfY3J0Yy0+aW14X2NydGMsCisJCQkmaXB1X2NydGNfaGVscGVyX2Z1bmNzLCBpcHVfY3J0Yy0+ZGV2LT5vZl9ub2RlKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoaXB1X2NydGMtPmRldiwgImFkZGluZyBjcnRjIGZhaWxlZCB3aXRoICVkLlxuIiwgcmV0KTsKIAkJZ290byBlcnJfcHV0X3Jlc291cmNlczsKQEAgLTM5OSw0MyArMzk5LDk2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBpcHVfZHJtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICppcHVfZHJtX2dldF9wb3J0X2J5X2lkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LAorCQkJCQkJICBpbnQgcG9ydF9pZCkKIHsKLQlzdHJ1Y3QgaXB1X2NsaWVudF9wbGF0Zm9ybWRhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGRldmljZV9ub2RlICpwb3J0OworCWludCBpZCwgcmV0OworCisJcG9ydCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKHBhcmVudCwgInBvcnQiKTsKKwl3aGlsZSAocG9ydCkgeworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwb3J0LCAicmVnIiwgJmlkKTsKKwkJaWYgKCFyZXQgJiYgaWQgPT0gcG9ydF9pZCkKKwkJCXJldHVybiBwb3J0OworCisJCWRvIHsKKwkJCXBvcnQgPSBvZl9nZXRfbmV4dF9jaGlsZChwYXJlbnQsIHBvcnQpOworCQkJaWYgKCFwb3J0KQorCQkJCXJldHVybiBOVUxMOworCQl9IHdoaWxlIChvZl9ub2RlX2NtcChwb3J0LT5uYW1lLCAicG9ydCIpKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBpcHVfZHJtX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlwdV9jbGllbnRfcGxhdGZvcm1kYXRhICpwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtID0gZGF0YTsKIAlzdHJ1Y3QgaXB1X2NydGMgKmlwdV9jcnRjOwogCWludCByZXQ7CiAKLQlpZiAoIXBkYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IGRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JaXB1X2NydGMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCppcHVfY3J0YyksIEdGUF9LRVJORUwpOworCWlwdV9jcnRjID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCppcHVfY3J0YyksIEdGUF9LRVJORUwpOwogCWlmICghaXB1X2NydGMpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaXB1X2NydGMtPmRldiA9ICZwZGV2LT5kZXY7CisJaXB1X2NydGMtPmRldiA9IGRldjsKIAotCXJldCA9IGlwdV9jcnRjX2luaXQoaXB1X2NydGMsIHBkYXRhKTsKKwlyZXQgPSBpcHVfY3J0Y19pbml0KGlwdV9jcnRjLCBwZGF0YSwgZHJtKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaXB1X2NydGMpOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGlwdV9jcnRjKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGlwdV9kcm1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgdm9pZCBpcHVfZHJtX3VuYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3RlciwKKwl2b2lkICpkYXRhKQogewotCXN0cnVjdCBpcHVfY3J0YyAqaXB1X2NydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaXB1X2NydGMgKmlwdV9jcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlpbXhfZHJtX3JlbW92ZV9jcnRjKGlwdV9jcnRjLT5pbXhfY3J0Yyk7CiAKIAlpcHVfcGxhbmVfcHV0X3Jlc291cmNlcyhpcHVfY3J0Yy0+cGxhbmVbMF0pOwogCWlwdV9wdXRfcmVzb3VyY2VzKGlwdV9jcnRjKTsKK30KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBjb21wb25lbnRfb3BzIGlwdV9jcnRjX29wcyA9IHsKKwkuYmluZCA9IGlwdV9kcm1fYmluZCwKKwkudW5iaW5kID0gaXB1X2RybV91bmJpbmQsCit9OworCitzdGF0aWMgaW50IGlwdV9kcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBpcHVfY2xpZW50X3BsYXRmb3JtZGF0YSAqcGRhdGEgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJaW50IHJldDsKKworCWlmICghZGV2LT5wbGF0Zm9ybV9kYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZGV2LT5vZl9ub2RlKSB7CisJCS8qIEFzc29jaWF0ZSBjcnRjIGRldmljZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIERJIHBvcnQgbm9kZSAqLworCQlkZXYtPm9mX25vZGUgPSBpcHVfZHJtX2dldF9wb3J0X2J5X2lkKGRldi0+cGFyZW50LT5vZl9ub2RlLAorCQkJCQkJICAgICAgcGRhdGEtPmRpICsgMik7CisJCWlmICghZGV2LT5vZl9ub2RlKSB7CisJCQlkZXZfZXJyKGRldiwgIm1pc3NpbmcgcG9ydEAlZCBub2RlIGluICVzXG4iLAorCQkJCXBkYXRhLT5kaSArIDIsIGRldi0+cGFyZW50LT5vZl9ub2RlLT5mdWxsX25hbWUpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlyZXQgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGNvbXBvbmVudF9hZGQoZGV2LCAmaXB1X2NydGNfb3BzKTsKK30KKworc3RhdGljIGludCBpcHVfZHJtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNvbXBvbmVudF9kZWwoJnBkZXYtPmRldiwgJmlwdV9jcnRjX29wcyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdXYzLXBsYW5lLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHV2My1wbGFuZS5jCmluZGV4IDM0YjY0MmEuLmIwYzliNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdXYzLXBsYW5lLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1djMtcGxhbmUuYwpAQCAtNzIsOCArNzIsOCBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlkZXZfZGJnKGlwdV9wbGFuZS0+YmFzZS5kZXYtPmRldiwgInBoeXMgPSAweCV4LCB4ID0gJWQsIHkgPSAlZCIsCi0JCWNtYV9vYmotPnBhZGRyLCB4LCB5KTsKKwlkZXZfZGJnKGlwdV9wbGFuZS0+YmFzZS5kZXYtPmRldiwgInBoeXMgPSAlcGFkLCB4ID0gJWQsIHkgPSAlZCIsCisJCSZjbWFfb2JqLT5wYWRkciwgeCwgeSk7CiAKIAljcG1lbSA9IGlwdV9nZXRfY3BtZW0oaXB1X3BsYW5lLT5pcHVfY2gpOwogCWlwdV9jcG1lbV9zZXRfc3RyaWRlKGNwbWVtLCBmYi0+cGl0Y2hlc1swXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9wYXJhbGxlbC1kaXNwbGF5LmMgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9wYXJhbGxlbC1kaXNwbGF5LmMKaW5kZXggMzUxZDYxZC4uYzYwYjZjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vcGFyYWxsZWwtZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL3BhcmFsbGVsLWRpc3BsYXkuYwpAQCAtMTgsMTAgKzE4LDEyIEBACiAgKiBNQSAwMjExMC0xMzAxLCBVU0EuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NvbXBvbmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGRybS9kcm1QLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9mYl9oZWxwZXIuaD4KICNpbmNsdWRlIDxkcm0vZHJtX2NydGNfaGVscGVyLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9wYW5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPHZpZGVvL29mX2Rpc3BsYXlfdGltaW5nLmg+CiAKQEAgLTMyLDE1ICszNCwxNCBAQAogCiBzdHJ1Y3QgaW14X3BhcmFsbGVsX2Rpc3BsYXkgewogCXN0cnVjdCBkcm1fY29ubmVjdG9yIGNvbm5lY3RvcjsKLQlzdHJ1Y3QgaW14X2RybV9jb25uZWN0b3IgKmlteF9kcm1fY29ubmVjdG9yOwogCXN0cnVjdCBkcm1fZW5jb2RlciBlbmNvZGVyOwotCXN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKmlteF9kcm1fZW5jb2RlcjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJdm9pZCAqZWRpZDsKIAlpbnQgZWRpZF9sZW47CiAJdTMyIGludGVyZmFjZV9waXhfZm10OwogCWludCBtb2RlX3ZhbGlkOwogCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIG1vZGU7CisJc3RydWN0IGRybV9wYW5lbCAqcGFuZWw7CiB9OwogCiBzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBpbXhfcGRfY29ubmVjdG9yX2RldGVjdCgKQEAgLTQ5LDE3ICs1MCwxOSBAQAogCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKIH0KIAotc3RhdGljIHZvaWQgaW14X3BkX2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCi17Ci0JLyogZG8gbm90IGZyZWUgaGVyZSAqLwotfQotCiBzdGF0aWMgaW50IGlteF9wZF9jb25uZWN0b3JfZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJc3RydWN0IGlteF9wYXJhbGxlbF9kaXNwbGF5ICppbXhwZCA9IGNvbl90b19pbXhwZChjb25uZWN0b3IpOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBpbXhwZC0+ZGV2LT5vZl9ub2RlOwogCWludCBudW1fbW9kZXMgPSAwOwogCisJaWYgKGlteHBkLT5wYW5lbCAmJiBpbXhwZC0+cGFuZWwtPmZ1bmNzICYmCisJICAgIGlteHBkLT5wYW5lbC0+ZnVuY3MtPmdldF9tb2RlcykgeworCQludW1fbW9kZXMgPSBpbXhwZC0+cGFuZWwtPmZ1bmNzLT5nZXRfbW9kZXMoaW14cGQtPnBhbmVsKTsKKwkJaWYgKG51bV9tb2RlcyA+IDApCisJCQlyZXR1cm4gbnVtX21vZGVzOworCX0KKwogCWlmIChpbXhwZC0+ZWRpZCkgewogCQlkcm1fbW9kZV9jb25uZWN0b3JfdXBkYXRlX2VkaWRfcHJvcGVydHkoY29ubmVjdG9yLCBpbXhwZC0+ZWRpZCk7CiAJCW51bV9tb2RlcyA9IGRybV9hZGRfZWRpZF9tb2Rlcyhjb25uZWN0b3IsIGlteHBkLT5lZGlkKTsKQEAgLTY3LDYgKzcwLDggQEAKIAogCWlmIChpbXhwZC0+bW9kZV92YWxpZCkgewogCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9IGRybV9tb2RlX2NyZWF0ZShjb25uZWN0b3ItPmRldik7CisJCWlmICghbW9kZSkKKwkJCXJldHVybiAtRUlOVkFMOwogCQlkcm1fbW9kZV9jb3B5KG1vZGUsICZpbXhwZC0+bW9kZSk7CiAJCW1vZGUtPnR5cGUgfD0gRFJNX01PREVfVFlQRV9EUklWRVIgfCBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRCwKIAkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG1vZGUpOwpAQCAtNzUsNiArODAsOCBAQAogCiAJaWYgKG5wKSB7CiAJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gZHJtX21vZGVfY3JlYXRlKGNvbm5lY3Rvci0+ZGV2KTsKKwkJaWYgKCFtb2RlKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCW9mX2dldF9kcm1fZGlzcGxheV9tb2RlKG5wLCAmaW14cGQtPm1vZGUsIE9GX1VTRV9OQVRJVkVfTU9ERSk7CiAJCWRybV9tb2RlX2NvcHkobW9kZSwgJmlteHBkLT5tb2RlKTsKIAkJbW9kZS0+dHlwZSB8PSBEUk1fTU9ERV9UWVBFX0RSSVZFUiB8IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVELApAQCAtODUsMTIgKzkyLDYgQEAKIAlyZXR1cm4gbnVtX21vZGVzOwogfQogCi1zdGF0aWMgaW50IGlteF9wZF9jb25uZWN0b3JfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAotCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBkcm1fZW5jb2RlciAqaW14X3BkX2Nvbm5lY3Rvcl9iZXN0X2VuY29kZXIoCiAJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CkBAIC0xMDEsNiArMTAyLDEyIEBACiAKIHN0YXRpYyB2b2lkIGlteF9wZF9lbmNvZGVyX2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKIHsKKwlzdHJ1Y3QgaW14X3BhcmFsbGVsX2Rpc3BsYXkgKmlteHBkID0gZW5jX3RvX2lteHBkKGVuY29kZXIpOworCisJaWYgKG1vZGUgIT0gRFJNX01PREVfRFBNU19PTikKKwkJZHJtX3BhbmVsX2Rpc2FibGUoaW14cGQtPnBhbmVsKTsKKwllbHNlCisJCWRybV9wYW5lbF9lbmFibGUoaW14cGQtPnBhbmVsKTsKIH0KIAogc3RhdGljIGJvb2wgaW14X3BkX2VuY29kZXJfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCkBAIC0xMTQsOCArMTIxLDcgQEAKIHsKIAlzdHJ1Y3QgaW14X3BhcmFsbGVsX2Rpc3BsYXkgKmlteHBkID0gZW5jX3RvX2lteHBkKGVuY29kZXIpOwogCi0JaW14X2RybV9jcnRjX3BhbmVsX2Zvcm1hdChlbmNvZGVyLT5jcnRjLCBEUk1fTU9ERV9FTkNPREVSX05PTkUsCi0JCQlpbXhwZC0+aW50ZXJmYWNlX3BpeF9mbXQpOworCWlteF9kcm1fcGFuZWxfZm9ybWF0KGVuY29kZXIsIGlteHBkLT5pbnRlcmZhY2VfcGl4X2ZtdCk7CiB9CiAKIHN0YXRpYyB2b2lkIGlteF9wZF9lbmNvZGVyX2NvbW1pdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCkBAIC0xMzIsMjYgKzEzOCwyMSBAQAogewogfQogCi1zdGF0aWMgdm9pZCBpbXhfcGRfZW5jb2Rlcl9kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKLXsKLQkvKiBkbyBub3QgZnJlZSBoZXJlICovCi19Ci0KIHN0YXRpYyBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyBpbXhfcGRfY29ubmVjdG9yX2Z1bmNzID0gewogCS5kcG1zID0gZHJtX2hlbHBlcl9jb25uZWN0b3JfZHBtcywKIAkuZmlsbF9tb2RlcyA9IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcywKIAkuZGV0ZWN0ID0gaW14X3BkX2Nvbm5lY3Rvcl9kZXRlY3QsCi0JLmRlc3Ryb3kgPSBpbXhfcGRfY29ubmVjdG9yX2Rlc3Ryb3ksCisJLmRlc3Ryb3kgPSBpbXhfZHJtX2Nvbm5lY3Rvcl9kZXN0cm95LAogfTsKIAogc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyBpbXhfcGRfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsKIAkuZ2V0X21vZGVzID0gaW14X3BkX2Nvbm5lY3Rvcl9nZXRfbW9kZXMsCiAJLmJlc3RfZW5jb2RlciA9IGlteF9wZF9jb25uZWN0b3JfYmVzdF9lbmNvZGVyLAotCS5tb2RlX3ZhbGlkID0gaW14X3BkX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkLAorCS5tb2RlX3ZhbGlkID0gaW14X2RybV9jb25uZWN0b3JfbW9kZV92YWxpZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgaW14X3BkX2VuY29kZXJfZnVuY3MgPSB7Ci0JLmRlc3Ryb3kgPSBpbXhfcGRfZW5jb2Rlcl9kZXN0cm95LAorCS5kZXN0cm95ID0gaW14X2RybV9lbmNvZGVyX2Rlc3Ryb3ksCiB9OwogCiBzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyBpbXhfcGRfZW5jb2Rlcl9oZWxwZXJfZnVuY3MgPSB7CkBAIC0xNjMsNTEgKzE2NCw0NiBAQAogCS5kaXNhYmxlID0gaW14X3BkX2VuY29kZXJfZGlzYWJsZSwKIH07CiAKLXN0YXRpYyBpbnQgaW14X3BkX3JlZ2lzdGVyKHN0cnVjdCBpbXhfcGFyYWxsZWxfZGlzcGxheSAqaW14cGQpCitzdGF0aWMgaW50IGlteF9wZF9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLAorCXN0cnVjdCBpbXhfcGFyYWxsZWxfZGlzcGxheSAqaW14cGQpCiB7CiAJaW50IHJldDsKIAotCWRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2RlcigmaW14cGQtPmNvbm5lY3RvciwgJmlteHBkLT5lbmNvZGVyKTsKLQotCWlteHBkLT5jb25uZWN0b3IuZnVuY3MgPSAmaW14X3BkX2Nvbm5lY3Rvcl9mdW5jczsKLQlpbXhwZC0+ZW5jb2Rlci5mdW5jcyA9ICZpbXhfcGRfZW5jb2Rlcl9mdW5jczsKLQotCWlteHBkLT5lbmNvZGVyLmVuY29kZXJfdHlwZSA9IERSTV9NT0RFX0VOQ09ERVJfTk9ORTsKLQlpbXhwZC0+Y29ubmVjdG9yLmNvbm5lY3Rvcl90eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX1ZHQTsKKwlyZXQgPSBpbXhfZHJtX2VuY29kZXJfcGFyc2Vfb2YoZHJtLCAmaW14cGQtPmVuY29kZXIsCisJCQkJICAgICAgIGlteHBkLT5kZXYtPm9mX25vZGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKCZpbXhwZC0+ZW5jb2RlciwgJmlteF9wZF9lbmNvZGVyX2hlbHBlcl9mdW5jcyk7Ci0JcmV0ID0gaW14X2RybV9hZGRfZW5jb2RlcigmaW14cGQtPmVuY29kZXIsICZpbXhwZC0+aW14X2RybV9lbmNvZGVyLAotCQkJVEhJU19NT0RVTEUpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihpbXhwZC0+ZGV2LCAiYWRkaW5nIGVuY29kZXIgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQorCWRybV9lbmNvZGVyX2luaXQoZHJtLCAmaW14cGQtPmVuY29kZXIsICZpbXhfcGRfZW5jb2Rlcl9mdW5jcywKKwkJCSBEUk1fTU9ERV9FTkNPREVSX05PTkUpOwogCiAJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZpbXhwZC0+Y29ubmVjdG9yLAogCQkJJmlteF9wZF9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKKwlkcm1fY29ubmVjdG9yX2luaXQoZHJtLCAmaW14cGQtPmNvbm5lY3RvciwgJmlteF9wZF9jb25uZWN0b3JfZnVuY3MsCisJCQkgICBEUk1fTU9ERV9DT05ORUNUT1JfVkdBKTsKIAotCXJldCA9IGlteF9kcm1fYWRkX2Nvbm5lY3RvcigmaW14cGQtPmNvbm5lY3RvciwKLQkJCSZpbXhwZC0+aW14X2RybV9jb25uZWN0b3IsIFRISVNfTU9EVUxFKTsKLQlpZiAocmV0KSB7Ci0JCWlteF9kcm1fcmVtb3ZlX2VuY29kZXIoaW14cGQtPmlteF9kcm1fZW5jb2Rlcik7Ci0JCWRldl9lcnIoaW14cGQtPmRldiwgImFkZGluZyBjb25uZWN0b3IgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQorCWlmIChpbXhwZC0+cGFuZWwpCisJCWRybV9wYW5lbF9hdHRhY2goaW14cGQtPnBhbmVsLCAmaW14cGQtPmNvbm5lY3Rvcik7CisKKwlkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIoJmlteHBkLT5jb25uZWN0b3IsICZpbXhwZC0+ZW5jb2Rlcik7CiAKIAlpbXhwZC0+Y29ubmVjdG9yLmVuY29kZXIgPSAmaW14cGQtPmVuY29kZXI7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpbXhfcGRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgaW14X3BkX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBkYXRhOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpwYW5lbF9ub2RlOwogCWNvbnN0IHU4ICplZGlkcDsKIAlzdHJ1Y3QgaW14X3BhcmFsbGVsX2Rpc3BsYXkgKmlteHBkOwogCWludCByZXQ7CiAJY29uc3QgY2hhciAqZm10OwogCi0JaW14cGQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCppbXhwZCksIEdGUF9LRVJORUwpOworCWlteHBkID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCppbXhwZCksIEdGUF9LRVJORUwpOwogCWlmICghaW14cGQpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yMjUsMzAgKzIyMSw0MyBAQAogCQkJaW14cGQtPmludGVyZmFjZV9waXhfZm10ID0gVjRMMl9QSVhfRk1UX0JHUjY2NjsKIAl9CiAKLQlpbXhwZC0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwYW5lbF9ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgImZzbCxwYW5lbCIsIDApOworCWlmIChwYW5lbF9ub2RlKQorCQlpbXhwZC0+cGFuZWwgPSBvZl9kcm1fZmluZF9wYW5lbChwYW5lbF9ub2RlKTsKIAotCXJldCA9IGlteF9wZF9yZWdpc3RlcihpbXhwZCk7CisJaW14cGQtPmRldiA9IGRldjsKKworCXJldCA9IGlteF9wZF9yZWdpc3Rlcihkcm0sIGlteHBkKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gaW14X2RybV9lbmNvZGVyX2FkZF9wb3NzaWJsZV9jcnRjcyhpbXhwZC0+aW14X2RybV9lbmNvZGVyLCBucCk7Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbXhwZCk7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgaW14cGQpOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGlteF9wZF91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsCisJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaW14X3BhcmFsbGVsX2Rpc3BsYXkgKmlteHBkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpbXhwZC0+ZW5jb2Rlci5mdW5jcy0+ZGVzdHJveSgmaW14cGQtPmVuY29kZXIpOworCWlteHBkLT5jb25uZWN0b3IuZnVuY3MtPmRlc3Ryb3koJmlteHBkLT5jb25uZWN0b3IpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBvbmVudF9vcHMgaW14X3BkX29wcyA9IHsKKwkuYmluZAk9IGlteF9wZF9iaW5kLAorCS51bmJpbmQJPSBpbXhfcGRfdW5iaW5kLAorfTsKKworc3RhdGljIGludCBpbXhfcGRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gY29tcG9uZW50X2FkZCgmcGRldi0+ZGV2LCAmaW14X3BkX29wcyk7Cit9CisKIHN0YXRpYyBpbnQgaW14X3BkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBpbXhfcGFyYWxsZWxfZGlzcGxheSAqaW14cGQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gJmlteHBkLT5jb25uZWN0b3I7Ci0Jc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyID0gJmlteHBkLT5lbmNvZGVyOwotCi0JZHJtX21vZGVfY29ubmVjdG9yX2RldGFjaF9lbmNvZGVyKGNvbm5lY3RvciwgZW5jb2Rlcik7Ci0KLQlpbXhfZHJtX3JlbW92ZV9jb25uZWN0b3IoaW14cGQtPmlteF9kcm1fY29ubmVjdG9yKTsKLQlpbXhfZHJtX3JlbW92ZV9lbmNvZGVyKGlteHBkLT5pbXhfZHJtX2VuY29kZXIpOwotCisJY29tcG9uZW50X2RlbCgmcGRldi0+ZGV2LCAmaW14X3BkX29wcyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9jb21tb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9jb21tb24uaAppbmRleCBjZjM0N2NjLi5mMGI5Nzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvY29tbW9uLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL2NvbW1vbi5oCkBAIC0xLDE0ICsxLDYgQEAKICNpZm5kZWYgQ09NTU9OX0lOQ0QKICNkZWZpbmUgQ09NTU9OX0lOQ0QKIAotdHlwZWRlZiB1OCBCT09MRUFOOwotdHlwZWRlZiB1OCBCWVRFOwotdHlwZWRlZiB1OCAqUEJZVEU7Ci10eXBlZGVmIHUxNiBXT1JEOwotdHlwZWRlZiB1MTYgKlBXT1JEOwotdHlwZWRlZiB1MzIgRFdPUkQ7Ci10eXBlZGVmIHUzMiAqUERXT1JEOwotCiAjZGVmaW5lIEJZVEVfTUFTSwkweGZmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9pbml0LmMKaW5kZXggZjVkNDFlMC4uZTYxMTgzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL2luaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvaW5pdC5jCkBAIC0xNyw3ICsxNyw3IEBACiBpbnQgRU5FX0luaXRNZWRpYShzdHJ1Y3QgdXNfZGF0YSAqdXMpCiB7CiAJaW50CXJlc3VsdDsKLQlCWVRFCU1pc2NSZWcwMyA9IDA7CisJdTgJTWlzY1JlZzAzID0gMDsKIAogCWRldl9pbmZvKCZ1cy0+cHVzYl9kZXYtPmRldiwgIi0tLSBJbml0IE1lZGlhIC0tLVxuIik7CiAJcmVzdWx0ID0gZW5lX3JlYWRfYnl0ZSh1cywgUkVHX0NBUkRfU1RBVFVTLCAmTWlzY1JlZzAzKTsKQEAgLTQxLDcgKzQxLDcgQEAKIC8qCiAgKiBlbmVfcmVhZF9ieXRlKCkgOgogICovCi1pbnQgZW5lX3JlYWRfYnl0ZShzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgaW5kZXgsIHZvaWQgKmJ1ZikKK2ludCBlbmVfcmVhZF9ieXRlKHN0cnVjdCB1c19kYXRhICp1cywgdTE2IGluZGV4LCB2b2lkICpidWYpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCWludCByZXN1bHQ7CkBAIC01MSw4ICs1MSw4IEBACiAJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGgJPSAweDAxOwogCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CiAJYmNiLT5DREJbMF0JCQk9IDB4RUQ7Ci0JYmNiLT5DREJbMl0JCQk9IChCWVRFKShpbmRleD4+OCk7Ci0JYmNiLT5DREJbM10JCQk9IChCWVRFKWluZGV4OworCWJjYi0+Q0RCWzJdCQkJPSAodTgpKGluZGV4Pj44KTsKKwliY2ItPkNEQlszXQkJCT0gKHU4KWluZGV4OwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIGJ1ZiwgMCk7CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTY1LDcgKzY1LDcgQEAKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50CXJlc3VsdDsKLQlCWVRFCWJ1ZlsweDIwMF07CisJdTgJYnVmWzB4MjAwXTsKIAogCWRldl9kYmcoJnVzLT5wdXNiX2Rldi0+ZGV2LCAidHJhbnNwb3J0IC0tLSBFTkVfU01Jbml0XG4iKTsKIApAQCAtMTIyLDEyICsxMjIsMTIgQEAKIC8qCiAgKiBFTkVfTG9hZEJpbkNvZGUoKQogICovCi1pbnQgRU5FX0xvYWRCaW5Db2RlKHN0cnVjdCB1c19kYXRhICp1cywgQllURSBmbGFnKQoraW50IEVORV9Mb2FkQmluQ29kZShzdHJ1Y3QgdXNfZGF0YSAqdXMsIHU4IGZsYWcpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCWludCByZXN1bHQ7CiAJLyogdm9pZCAqYnVmOyAqLwotCVBCWVRFIGJ1ZjsKKwl1OCAqYnVmOwogCiAJLyogZGV2X2luZm8oJnVzLT5wdXNiX2Rldi0+ZGV2LCAidHJhbnNwb3J0IC0tLSBFTkVfTG9hZEJpbkNvZGVcbiIpOyAqLwogCWlmICh1cy0+QklOX0ZMQUcgPT0gZmxhZykKQEAgLTE2NCw3ICsxNjQsNyBAQAogLyoKICAqIEVORV9TZW5kU2NzaUNtZCgpOgogICovCi1pbnQgRU5FX1NlbmRTY3NpQ21kKHN0cnVjdCB1c19kYXRhICp1cywgQllURSBmRGlyLCB2b2lkICpidWYsIGludCB1c2Vfc2cpCitpbnQgRU5FX1NlbmRTY3NpQ21kKHN0cnVjdCB1c19kYXRhICp1cywgdTggZkRpciwgdm9pZCAqYnVmLCBpbnQgdXNlX3NnKQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlzdHJ1Y3QgYnVsa19jc193cmFwICpiY3MgPSAoc3RydWN0IGJ1bGtfY3Nfd3JhcCAqKSB1cy0+aW9idWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvaW5pdC5oIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL2luaXQuaAppbmRleCBjOGIyY2Q2Li45OGQyZTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvaW5pdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9pbml0LmgKQEAgLTEsMTEgKzEsMTEgQEAKICNpbmNsdWRlICJjb21tb24uaCIKIAotZXh0ZXJuIERXT1JEIE1lZGlhQ2hhbmdlOworZXh0ZXJuIHUzMiBNZWRpYUNoYW5nZTsKIGV4dGVybiBpbnQgQ2hlY2tfRF9NZWRpYUZtdChzdHJ1Y3QgdXNfZGF0YSAqKTsKIAogCiAKLXN0YXRpYyBCWVRFIFNNX0luaXRbXSA9IHsKK3N0YXRpYyB1OCBTTV9Jbml0W10gPSB7CiAweDdCLCAweDA5LCAweDdDLCAweEYwLCAweDdELCAweDEwLCAweDdFLCAweEU5LAogMHg3RiwgMHhDQywgMHgxMiwgMHgyRiwgMHg3MSwgMHg5MCwgMHhFOSwgMHhDQywKIDB4RTAsIDB4QjQsIDB4MDcsIDB4MTIsIDB4OTAsIDB4RkYsIDB4MDksIDB4RTAsCkBAIC0yNjMsNyArMjYzLDcgQEAKIDB4NTgsIDB4NDQsIDB4MkQsIDB4NDksIDB4NkUsIDB4NjksIDB4NzQsIDB4MjAsCiAweDIwLCAweDIwLCAweDIwLCAweDMxLCAweDMwLCAweDMwLCAweDMwLCAweDMxIH07CiAKLXN0YXRpYyBCWVRFIFNNX1Jkd3JbXSA9IHsKK3N0YXRpYyB1OCBTTV9SZHdyW10gPSB7CiAweDdCLCAweDBDLCAweDdDLCAweEYwLCAweDdELCAweDEwLCAweDdFLCAweEU5LAogMHg3RiwgMHhDQywgMHgxMiwgMHgyRiwgMHg3MSwgMHg5MCwgMHhFOSwgMHhDMywKIDB4RTAsIDB4QjQsIDB4NzMsIDB4MDQsIDB4NzQsIDB4NDAsIDB4ODAsIDB4MDksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbC5oIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWwuaAppbmRleCA5MTM2ZTk0Li4zOTk1MTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsLmgKQEAgLTE2OSwyOSArMTY5LDI5IEBACiBTdHJ1Y3QgRGVmaW5pdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RydWN0IGtldWNyX21lZGlhX2luZm8gewotCUJZVEUgTW9kZWw7Ci0JQllURSBBdHRyaWJ1dGU7Ci0JQllURSBNYXhab25lczsKLQlCWVRFIE1heFNlY3RvcnM7Ci0JV09SRCBNYXhCbG9ja3M7Ci0JV09SRCBNYXhMb2dCbG9ja3M7CisJdTggTW9kZWw7CisJdTggQXR0cmlidXRlOworCXU4IE1heFpvbmVzOworCXU4IE1heFNlY3RvcnM7CisJdTE2IE1heEJsb2NrczsKKwl1MTYgTWF4TG9nQmxvY2tzOwogfTsKIAogc3RydWN0IGtldWNyX21lZGlhX2FkZHJlc3MgewotCUJZVEUgWm9uZTsJLyogWm9uZSBOdW1iZXIgKi8KLQlCWVRFIFNlY3RvcjsJLyogU2VjdG9yKDUxMmJ5dGUpIE51bWJlciBvbiBCbG9jayAqLwotCVdPUkQgUGh5QmxvY2s7CS8qIFBoeXNpY2FsIEJsb2NrIE51bWJlciBvbiBab25lICovCi0JV09SRCBMb2dCbG9jazsJLyogTG9naWNhbCBCbG9jayBOdW1iZXIgb2YgWm9uZSAqLworCXU4IFpvbmU7CS8qIFpvbmUgTnVtYmVyICovCisJdTggU2VjdG9yOwkvKiBTZWN0b3IoNTEyYnl0ZSkgTnVtYmVyIG9uIEJsb2NrICovCisJdTE2IFBoeUJsb2NrOwkvKiBQaHlzaWNhbCBCbG9jayBOdW1iZXIgb24gWm9uZSAqLworCXUxNiBMb2dCbG9jazsJLyogTG9naWNhbCBCbG9jayBOdW1iZXIgb2YgWm9uZSAqLwogfTsKIAogc3RydWN0IGtldWNyX21lZGlhX2FyZWEgewotCUJZVEUgU2VjdG9yOwkvKiBTZWN0b3IoNTEyYnl0ZSkgTnVtYmVyIG9uIEJsb2NrICovCi0JV09SRCBQaHlCbG9jazsJLyogUGh5c2ljYWwgQmxvY2sgTnVtYmVyIG9uIFpvbmUgMCAqLworCXU4IFNlY3RvcjsJLyogU2VjdG9yKDUxMmJ5dGUpIE51bWJlciBvbiBCbG9jayAqLworCXUxNiBQaHlCbG9jazsJLyogUGh5c2ljYWwgQmxvY2sgTnVtYmVyIG9uIFpvbmUgMCAqLwogfTsKIAotZXh0ZXJuIFdPUkQJUmVhZEJsb2NrOwotZXh0ZXJuIFdPUkQJV3JpdGVCbG9jazsKLWV4dGVybiBEV09SRAlNZWRpYUNoYW5nZTsKK2V4dGVybiB1MTYJUmVhZEJsb2NrOworZXh0ZXJuIHUxNglXcml0ZUJsb2NrOworZXh0ZXJuIHUzMglNZWRpYUNoYW5nZTsKIAogZXh0ZXJuIHN0cnVjdCBrZXVjcl9tZWRpYV9pbmZvICAgIFNzZmRjOwogZXh0ZXJuIHN0cnVjdCBrZXVjcl9tZWRpYV9hZGRyZXNzIE1lZGlhOwpAQCAtMjA0LDI0ICsyMDQsMjQgQEAKIGludCAgICAgICAgIEluaXRfRF9TbWFydE1lZGlhKHZvaWQpOwogaW50ICAgICAgICAgUHdvZmZfRF9TbWFydE1lZGlhKHZvaWQpOwogaW50ICAgICAgICAgQ2hlY2tfRF9TbWFydE1lZGlhKHZvaWQpOwotaW50ICAgICAgICAgQ2hlY2tfRF9QYXJhbWV0ZXIoc3RydWN0IHVzX2RhdGEgKiwgV09SRCAqLCBCWVRFICosIEJZVEUgKik7Ci1pbnQgICAgICAgICBNZWRpYV9EX1JlYWRTZWN0b3Ioc3RydWN0IHVzX2RhdGEgKiwgRFdPUkQsIFdPUkQsIEJZVEUgKik7Ci1pbnQgICAgICAgICBNZWRpYV9EX1dyaXRlU2VjdG9yKHN0cnVjdCB1c19kYXRhICosIERXT1JELCBXT1JELCBCWVRFICopOwotaW50ICAgICAgICAgTWVkaWFfRF9Db3B5U2VjdG9yKHN0cnVjdCB1c19kYXRhICosIERXT1JELCBXT1JELCBCWVRFICopOwotaW50ICAgICAgICAgTWVkaWFfRF9FcmFzZUJsb2NrKHN0cnVjdCB1c19kYXRhICosIERXT1JELCBXT1JEKTsKK2ludCAgICAgICAgIENoZWNrX0RfUGFyYW1ldGVyKHN0cnVjdCB1c19kYXRhICosIHUxNiAqLCB1OCAqLCB1OCAqKTsKK2ludCAgICAgICAgIE1lZGlhX0RfUmVhZFNlY3RvcihzdHJ1Y3QgdXNfZGF0YSAqLCB1MzIsIHUxNiwgdTggKik7CitpbnQgICAgICAgICBNZWRpYV9EX1dyaXRlU2VjdG9yKHN0cnVjdCB1c19kYXRhICosIHUzMiwgdTE2LCB1OCAqKTsKK2ludCAgICAgICAgIE1lZGlhX0RfQ29weVNlY3RvcihzdHJ1Y3QgdXNfZGF0YSAqLCB1MzIsIHUxNiwgdTggKik7CitpbnQgICAgICAgICBNZWRpYV9EX0VyYXNlQmxvY2soc3RydWN0IHVzX2RhdGEgKiwgdTMyLCB1MTYpOwogaW50ICAgICAgICAgTWVkaWFfRF9FcmFzZUFsbChzdHJ1Y3QgdXNfZGF0YSAqKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgICAgICAgICBNZWRpYV9EX09uZVNlY3RXcml0ZVN0YXJ0KHN0cnVjdCB1c19kYXRhICosIERXT1JELCBCWVRFICopOwotaW50ICAgICAgICAgTWVkaWFfRF9PbmVTZWN0V3JpdGVOZXh0KHN0cnVjdCB1c19kYXRhICosIEJZVEUgKik7CitpbnQgICAgICAgICBNZWRpYV9EX09uZVNlY3RXcml0ZVN0YXJ0KHN0cnVjdCB1c19kYXRhICosIHUzMiwgdTggKik7CitpbnQgICAgICAgICBNZWRpYV9EX09uZVNlY3RXcml0ZU5leHQoc3RydWN0IHVzX2RhdGEgKiwgdTggKik7CiBpbnQgICAgICAgICBNZWRpYV9EX09uZVNlY3RXcml0ZUZsdXNoKHN0cnVjdCB1c19kYXRhICopOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIGludAlTTV9GcmVlTWVtKHZvaWQpOwkvKiBFTkUgU00gZnVuY3Rpb24gKi8KLXZvaWQgICAgICAgIFNNX0VuYWJsZUxFRChzdHJ1Y3QgdXNfZGF0YSAqLCBCT09MRUFOKTsKK3ZvaWQgICAgICAgIFNNX0VuYWJsZUxFRChzdHJ1Y3QgdXNfZGF0YSAqLCBib29sKTsKIHZvaWQgICAgICAgIExlZF9EX1Rlcm5Pbih2b2lkKTsKIHZvaWQgICAgICAgIExlZF9EX1Rlcm5PZmYodm9pZCk7CiAKLWludCAgICAgICAgIE1lZGlhX0RfRXJhc2VBbGxSZWR0RGF0YShEV09SRCBJbmRleCwgQk9PTEVBTiBDaGVja0Jsb2NrKTsKK2ludCAgICAgICAgIE1lZGlhX0RfRXJhc2VBbGxSZWR0RGF0YSh1MzIgSW5kZXgsIGJvb2wgQ2hlY2tCbG9jayk7CiAvKkRXT1JEIE1lZGlhX0RfR2V0TWVkaWFJbmZvKHN0cnVjdCB1c19kYXRhICogZmRvRXh0LAogCVBJT0NUTF9NRURJQV9JTkZPX0lOIHBQYXJhbUluLCBQSU9DVExfTUVESUFfSU5GT19PVVQgcFBhcmFtT3V0KTsgKi8KIApAQCAtMjI5LDMxICsyMjksMzEgQEAKICAqIFNNSUxTdWIuYwogICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50ICBDaGVja19EX0RhdGFCbGFuayhCWVRFICopOwotaW50ICBDaGVja19EX0ZhaWxCbG9jayhCWVRFICopOwotaW50ICBDaGVja19EX0RhdGFTdGF0dXMoQllURSAqKTsKLWludCAgTG9hZF9EX0xvZ0Jsb2NrQWRkcihCWVRFICopOwotdm9pZCBDbHJfRF9SZWR1bmRhbnREYXRhKEJZVEUgKik7Ci12b2lkIFNldF9EX0xvZ0Jsb2NrQWRkcihCWVRFICopOwotdm9pZCBTZXRfRF9GYWlsQmxvY2soQllURSAqKTsKLXZvaWQgU2V0X0RfRGF0YVN0YXVzKEJZVEUgKik7CitpbnQgIENoZWNrX0RfRGF0YUJsYW5rKHU4ICopOworaW50ICBDaGVja19EX0ZhaWxCbG9jayh1OCAqKTsKK2ludCAgQ2hlY2tfRF9EYXRhU3RhdHVzKHU4ICopOworaW50ICBMb2FkX0RfTG9nQmxvY2tBZGRyKHU4ICopOwordm9pZCBDbHJfRF9SZWR1bmRhbnREYXRhKHU4ICopOwordm9pZCBTZXRfRF9Mb2dCbG9ja0FkZHIodTggKik7Cit2b2lkIFNldF9EX0ZhaWxCbG9jayh1OCAqKTsKK3ZvaWQgU2V0X0RfRGF0YVN0YXVzKHU4ICopOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBTc2ZkY19EX1Jlc2V0KHN0cnVjdCB1c19kYXRhICopOwotaW50ICBTc2ZkY19EX1JlYWRDaXNTZWN0KHN0cnVjdCB1c19kYXRhICosIEJZVEUgKiwgQllURSAqKTsKK2ludCAgU3NmZGNfRF9SZWFkQ2lzU2VjdChzdHJ1Y3QgdXNfZGF0YSAqLCB1OCAqLCB1OCAqKTsKIHZvaWQgU3NmZGNfRF9Xcml0ZVJlZHRNb2RlKHZvaWQpOwotdm9pZCBTc2ZkY19EX1JlYWRJRChCWVRFICosIEJZVEUpOwotaW50ICBTc2ZkY19EX1JlYWRTZWN0KHN0cnVjdCB1c19kYXRhICosIEJZVEUgKiwgQllURSAqKTsKLWludCAgU3NmZGNfRF9SZWFkQmxvY2soc3RydWN0IHVzX2RhdGEgKiwgV09SRCwgQllURSAqLCBCWVRFICopOwotaW50ICBTc2ZkY19EX1dyaXRlU2VjdChzdHJ1Y3QgdXNfZGF0YSAqLCBCWVRFICosIEJZVEUgKik7Ci1pbnQgIFNzZmRjX0RfV3JpdGVCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqLCBXT1JELCBCWVRFICosIEJZVEUgKik7Ci1pbnQgIFNzZmRjX0RfQ29weUJsb2NrKHN0cnVjdCB1c19kYXRhICosIFdPUkQsIEJZVEUgKiwgQllURSAqKTsKLWludCAgU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5KHN0cnVjdCB1c19kYXRhICosIEJZVEUgKiwgQllURSAqKTsKK3ZvaWQgU3NmZGNfRF9SZWFkSUQodTggKiwgdTgpOworaW50ICBTc2ZkY19EX1JlYWRTZWN0KHN0cnVjdCB1c19kYXRhICosIHU4ICosIHU4ICopOworaW50ICBTc2ZkY19EX1JlYWRCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqLCB1MTYsIHU4ICosIHU4ICopOworaW50ICBTc2ZkY19EX1dyaXRlU2VjdChzdHJ1Y3QgdXNfZGF0YSAqLCB1OCAqLCB1OCAqKTsKK2ludCAgU3NmZGNfRF9Xcml0ZUJsb2NrKHN0cnVjdCB1c19kYXRhICosIHUxNiwgdTggKiwgdTggKik7CitpbnQgIFNzZmRjX0RfQ29weUJsb2NrKHN0cnVjdCB1c19kYXRhICosIHUxNiwgdTggKiwgdTggKik7CitpbnQgIFNzZmRjX0RfV3JpdGVTZWN0Rm9yQ29weShzdHJ1Y3QgdXNfZGF0YSAqLCB1OCAqLCB1OCAqKTsKIGludCAgU3NmZGNfRF9FcmFzZUJsb2NrKHN0cnVjdCB1c19kYXRhICopOwotaW50ICBTc2ZkY19EX1JlYWRSZWR0RGF0YShzdHJ1Y3QgdXNfZGF0YSAqLCBCWVRFICopOwotaW50ICBTc2ZkY19EX1dyaXRlUmVkdERhdGEoc3RydWN0IHVzX2RhdGEgKiwgQllURSAqKTsKK2ludCAgU3NmZGNfRF9SZWFkUmVkdERhdGEoc3RydWN0IHVzX2RhdGEgKiwgdTggKik7CitpbnQgIFNzZmRjX0RfV3JpdGVSZWR0RGF0YShzdHJ1Y3QgdXNfZGF0YSAqLCB1OCAqKTsKIGludCAgU3NmZGNfRF9DaGVja1N0YXR1cyh2b2lkKTsKLWludCAgU2V0X0RfU3NmZGNNb2RlbChCWVRFKTsKK2ludCAgU2V0X0RfU3NmZGNNb2RlbCh1OCk7CiB2b2lkIENudF9EX1Jlc2V0KHZvaWQpOwogaW50ICBDbnRfRF9Qb3dlck9uKHZvaWQpOwogdm9pZCBDbnRfRF9Qb3dlck9mZih2b2lkKTsKQEAgLTI2MywyNiArMjYzLDI2IEBACiBpbnQgIENoZWNrX0RfQ2FyZEV4aXN0KHZvaWQpOwogaW50ICBDaGVja19EX0NhcmRTdHNDaGcodm9pZCk7CiBpbnQgIENoZWNrX0RfU3NmZGNXUCh2b2lkKTsKLWludCAgU01fUmVhZEJsb2NrKHN0cnVjdCB1c19kYXRhICosIEJZVEUgKiwgQllURSAqKTsKK2ludCAgU01fUmVhZEJsb2NrKHN0cnVjdCB1c19kYXRhICosIHU4ICosIHU4ICopOwogCi1pbnQgIFNzZmRjX0RfUmVhZFNlY3RfRE1BKHN0cnVjdCB1c19kYXRhICosIEJZVEUgKiwgQllURSAqKTsKLWludCAgU3NmZGNfRF9SZWFkU2VjdF9QSU8oc3RydWN0IHVzX2RhdGEgKiwgQllURSAqLCBCWVRFICopOwotaW50ICBTc2ZkY19EX1dyaXRlU2VjdF9ETUEoc3RydWN0IHVzX2RhdGEgKiwgQllURSAqLCBCWVRFICopOwotaW50ICBTc2ZkY19EX1dyaXRlU2VjdF9QSU8oc3RydWN0IHVzX2RhdGEgKiwgQllURSAqLCBCWVRFICopOworaW50ICBTc2ZkY19EX1JlYWRTZWN0X0RNQShzdHJ1Y3QgdXNfZGF0YSAqLCB1OCAqLCB1OCAqKTsKK2ludCAgU3NmZGNfRF9SZWFkU2VjdF9QSU8oc3RydWN0IHVzX2RhdGEgKiwgdTggKiwgdTggKik7CitpbnQgIFNzZmRjX0RfV3JpdGVTZWN0X0RNQShzdHJ1Y3QgdXNfZGF0YSAqLCB1OCAqLCB1OCAqKTsKK2ludCAgU3NmZGNfRF9Xcml0ZVNlY3RfUElPKHN0cnVjdCB1c19kYXRhICosIHU4ICosIHU4ICopOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50ICBDaGVja19EX1JlYWRFcnJvcihCWVRFICopOwotaW50ICBDaGVja19EX0NvcnJlY3QoQllURSAqLCBCWVRFICopOwotaW50ICBDaGVja19EX0NJU2RhdGEoQllURSAqLCBCWVRFICopOwotdm9pZCBTZXRfRF9SaWdodEVDQyhCWVRFICopOworaW50ICBDaGVja19EX1JlYWRFcnJvcih1OCAqKTsKK2ludCAgQ2hlY2tfRF9Db3JyZWN0KHU4ICosIHU4ICopOworaW50ICBDaGVja19EX0NJU2RhdGEodTggKiwgdTggKik7Cit2b2lkIFNldF9EX1JpZ2h0RUNDKHU4ICopOwogCiAvKgogICogU01JTEVDQy5jCiAgKi8KLXZvaWQgY2FsY3VsYXRlX2VjYyhCWVRFICosIEJZVEUgKiwgQllURSAqLCBCWVRFICosIEJZVEUgKik7Ci1CWVRFIGNvcnJlY3RfZGF0YShCWVRFICosIEJZVEUgKiwgQllURSwgICBCWVRFLCAgIEJZVEUpOwotaW50ICBfQ29ycmVjdF9EX1N3RUNDKEJZVEUgKiwgQllURSAqLCBCWVRFICopOwotdm9pZCBfQ2FsY3VsYXRlX0RfU3dFQ0MoQllURSAqLCBCWVRFICopOwordm9pZCBjYWxjdWxhdGVfZWNjKHU4ICosIHU4ICosIHU4ICosIHU4ICosIHU4ICopOwordTggY29ycmVjdF9kYXRhKHU4ICosIHU4ICosIHU4LCAgIHU4LCAgIHU4KTsKK2ludCAgX0NvcnJlY3RfRF9Td0VDQyh1OCAqLCB1OCAqLCB1OCAqKTsKK3ZvaWQgX0NhbGN1bGF0ZV9EX1N3RUNDKHU4ICosIHU4ICopOwogCiB2b2lkIFNNX0luaXQodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsZWNjLmMgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbGVjYy5jCmluZGV4IDZiOGY3ZDcuLmZmZTYwMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsZWNjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxlY2MuYwpAQCAtMTMsNyArMTMsNyBAQAogLyogI2luY2x1ZGUgIkVNQ1JJT1MuaCIgKi8KIAogLyogQ1AwLUNQNSBjb2RlIHRhYmxlICovCi1zdGF0aWMgQllURSBlY2N0YWJsZVsyNTZdID0geworc3RhdGljIHU4IGVjY3RhYmxlWzI1Nl0gPSB7CiAweDAwLCAweDU1LCAweDU2LCAweDAzLCAweDU5LCAweDBDLCAweDBGLCAweDVBLCAweDVBLCAweDBGLCAweDBDLCAweDU5LCAweDAzLAogMHg1NiwgMHg1NSwgMHgwMCwgMHg2NSwgMHgzMCwgMHgzMywgMHg2NiwgMHgzQywgMHg2OSwgMHg2QSwgMHgzRiwgMHgzRiwgMHg2QSwKIDB4NjksIDB4M0MsIDB4NjYsIDB4MzMsIDB4MzAsIDB4NjUsIDB4NjYsIDB4MzMsIDB4MzAsIDB4NjUsIDB4M0YsIDB4NkEsIDB4NjksCkBAIC0zNiw3ICszNiw3IEBACiAweDVBLCAweDVBLCAweDBGLCAweDBDLCAweDU5LCAweDAzLCAweDU2LCAweDU1LCAweDAwCiB9OwogCi1zdGF0aWMgdm9pZCAgIHRyYW5zX3Jlc3VsdChCWVRFLCAgIEJZVEUsICAgQllURSAqLCBCWVRFICopOworc3RhdGljIHZvaWQgICB0cmFuc19yZXN1bHQodTgsICAgdTgsICAgdTggKiwgdTggKik7CiAKICNkZWZpbmUgQklUNyAgICAgICAgMHg4MAogI2RlZmluZSBCSVQ2ICAgICAgICAweDQwCkBAIC01NywxMSArNTcsMTEgQEAKICAqICplY2MxOyAqIExQMTUsTFAxNCxMUDEzLC4uLgogICogKmVjYzI7ICogTFAwNyxMUDA2LExQMDUsLi4uCiAgKi8KLXN0YXRpYyB2b2lkIHRyYW5zX3Jlc3VsdChCWVRFIHJlZzIsIEJZVEUgcmVnMywgQllURSAqZWNjMSwgQllURSAqZWNjMikKK3N0YXRpYyB2b2lkIHRyYW5zX3Jlc3VsdCh1OCByZWcyLCB1OCByZWczLCB1OCAqZWNjMSwgdTggKmVjYzIpCiB7Ci0JQllURSBhOyAvKiBXb3JraW5nIGZvciByZWcyLHJlZzMgKi8KLQlCWVRFIGI7IC8qIFdvcmtpbmcgZm9yIGVjYzEsZWNjMiAqLwotCUJZVEUgaTsgLyogRm9yIGNvdW50aW5nICovCisJdTggYTsgLyogV29ya2luZyBmb3IgcmVnMixyZWczICovCisJdTggYjsgLyogV29ya2luZyBmb3IgZWNjMSxlY2MyICovCisJdTggaTsgLyogRm9yIGNvdW50aW5nICovCiAKIAlhID0gQklUNzsgYiA9IEJJVDc7IC8qIDgwaD0xMDAwMDAwMGIgKi8KIAkqZWNjMSA9ICplY2MyID0gMDsgLyogQ2xlYXIgZWNjMSxlY2MyICovCkBAIC05NSwyMSArOTUsMjEgQEAKICAqICplY2MyOyAqIExQMDcsTFAwNixMUDA1LC4uLgogICogKmVjYzM7ICogQ1A1LENQNCxDUDMsLi4uLCIxIiwiMSIKICAqLwotdm9pZCBjYWxjdWxhdGVfZWNjKEJZVEUgKnRhYmxlLCBCWVRFICpkYXRhLCBCWVRFICplY2MxLCBCWVRFICplY2MyLCBCWVRFICplY2MzKQordm9pZCBjYWxjdWxhdGVfZWNjKHU4ICp0YWJsZSwgdTggKmRhdGEsIHU4ICplY2MxLCB1OCAqZWNjMiwgdTggKmVjYzMpCiB7Ci0JRFdPUkQgIGk7ICAgIC8qIEZvciBjb3VudGluZyAqLwotCUJZVEUgYTsgICAgLyogV29ya2luZyBmb3IgdGFibGUgKi8KLQlCWVRFIHJlZzE7IC8qIEQtYWxsLENQNSxDUDQsQ1AzLC4uLiAqLwotCUJZVEUgcmVnMjsgLyogTFAxNCxMUDEyLEwxMCwuLi4gKi8KLQlCWVRFIHJlZzM7IC8qIExQMTUsTFAxMyxMMTEsLi4uICovCisJdTMyICBpOyAgICAvKiBGb3IgY291bnRpbmcgKi8KKwl1OCBhOyAgICAvKiBXb3JraW5nIGZvciB0YWJsZSAqLworCXU4IHJlZzE7IC8qIEQtYWxsLENQNSxDUDQsQ1AzLC4uLiAqLworCXU4IHJlZzI7IC8qIExQMTQsTFAxMixMMTAsLi4uICovCisJdTggcmVnMzsgLyogTFAxNSxMUDEzLEwxMSwuLi4gKi8KIAogCXJlZzEgPSByZWcyID0gcmVnMyA9IDA7ICAgLyogQ2xlYXIgcGFyYW1ldGVyICovCiAJZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7CiAJCWEgPSB0YWJsZVtkYXRhW2ldXTsgLyogR2V0IENQMC1DUDUgY29kZSBmcm9tIHRhYmxlICovCiAJCXJlZzEgXj0gKGEmTUFTS19DUFMpOyAvKiBYT1Igd2l0aCBhICovCiAJCWlmICgoYSZCSVQ2KSAhPSAwKSB7IC8qIElmIERfYWxsKGFsbCBiaXQgWE9SKSA9IDEgKi8KLQkJCXJlZzMgXj0gKEJZVEUpaTsgLyogWE9SIHdpdGggY291bnRlciAqLwotCQkJcmVnMiBePSB+KChCWVRFKWkpOyAvKiBYT1Igd2l0aCBpbnYuIG9mIGNvdW50ZXIgKi8KKwkJCXJlZzMgXj0gKHU4KWk7IC8qIFhPUiB3aXRoIGNvdW50ZXIgKi8KKwkJCXJlZzIgXj0gfigodTgpaSk7IC8qIFhPUiB3aXRoIGludi4gb2YgY291bnRlciAqLwogCQl9CiAJfQogCkBAIC0xMjcsMjIgKzEyNywyMiBAQAogICogZWNjMjsgKiBMUDA3LExQMDYsTFAwNSwuLi4KICAqIGVjYzM7ICogQ1A1LENQNCxDUDMsLi4uLCIxIiwiMSIKICAqLwotQllURSBjb3JyZWN0X2RhdGEoQllURSAqZGF0YSwgQllURSAqZWNjZGF0YSwgQllURSBlY2MxLCBCWVRFIGVjYzIsIEJZVEUgZWNjMykKK3U4IGNvcnJlY3RfZGF0YSh1OCAqZGF0YSwgdTggKmVjY2RhdGEsIHU4IGVjYzEsIHU4IGVjYzIsIHU4IGVjYzMpCiB7Ci0JRFdPUkQgbDsgLyogV29ya2luZyB0byBjaGVjayBkICovCi0JRFdPUkQgZDsgLyogUmVzdWx0IG9mIGNvbXBhcmlzb24gKi8KLQlEV09SRCBpOyAvKiBGb3IgY291bnRpbmcgKi8KLQlCWVRFIGQxLCBkMiwgZDM7IC8qIFJlc3VsdCBvZiBjb21wYXJpc29uICovCi0JQllURSBhOyAvKiBXb3JraW5nIGZvciBhZGQgKi8KLQlCWVRFIGFkZDsgLyogQnl0ZSBhZGRyZXNzIG9mIGNvci4gREFUQSAqLwotCUJZVEUgYjsgLyogV29ya2luZyBmb3IgYml0ICovCi0JQllURSBiaXQ7IC8qIEJpdCBhZGRyZXNzIG9mIGNvci4gREFUQSAqLworCXUzMiBsOyAvKiBXb3JraW5nIHRvIGNoZWNrIGQgKi8KKwl1MzIgZDsgLyogUmVzdWx0IG9mIGNvbXBhcmlzb24gKi8KKwl1MzIgaTsgLyogRm9yIGNvdW50aW5nICovCisJdTggZDEsIGQyLCBkMzsgLyogUmVzdWx0IG9mIGNvbXBhcmlzb24gKi8KKwl1OCBhOyAvKiBXb3JraW5nIGZvciBhZGQgKi8KKwl1OCBhZGQ7IC8qIEJ5dGUgYWRkcmVzcyBvZiBjb3IuIERBVEEgKi8KKwl1OCBiOyAvKiBXb3JraW5nIGZvciBiaXQgKi8KKwl1OCBiaXQ7IC8qIEJpdCBhZGRyZXNzIG9mIGNvci4gREFUQSAqLwogCiAJZDEgPSBlY2MxXmVjY2RhdGFbMV07IGQyID0gZWNjMl5lY2NkYXRhWzBdOyAvKiBDb21wYXJlIExQJ3MgKi8KIAlkMyA9IGVjYzNeZWNjZGF0YVsyXTsgLyogQ29tcGFyZSBDUCdzICovCi0JZCA9ICgoRFdPUkQpZDE8PDE2KSAvKiBSZXN1bHQgb2YgY29tcGFyaXNvbiAqLwotCSsoKERXT1JEKWQyPDw4KQotCSsoRFdPUkQpZDM7CisJZCA9ICgodTMyKWQxPDwxNikgLyogUmVzdWx0IG9mIGNvbXBhcmlzb24gKi8KKwkrKCh1MzIpZDI8PDgpCisJKyh1MzIpZDM7CiAKIAlpZiAoZCA9PSAwKQogCQlyZXR1cm4gMDsgLyogSWYgTm8gZXJyb3IsIHJldHVybiAqLwpAQCAtMTg4LDkgKzE4OCw5IEBACiAJcmV0dXJuIDM7IC8qIFVuY29ycmVjdGFibGUgZXJyb3IgKi8KIH0KIAotaW50IF9Db3JyZWN0X0RfU3dFQ0MoQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnRfZWNjLCBCWVRFICpjYWxjdWxhdGVfZWNjKQoraW50IF9Db3JyZWN0X0RfU3dFQ0ModTggKmJ1ZiwgdTggKnJlZHVuZGFudF9lY2MsIHU4ICpjYWxjdWxhdGVfZWNjKQogewotCURXT1JEIGVycjsKKwl1MzIgZXJyOwogCiAJZXJyID0gY29ycmVjdF9kYXRhKGJ1ZiwgcmVkdW5kYW50X2VjYywgKihjYWxjdWxhdGVfZWNjICsgMSksCiAJCQkgICAqKGNhbGN1bGF0ZV9lY2MpLCAqKGNhbGN1bGF0ZV9lY2MgKyAyKSk7CkBAIC0yMDMsNyArMjAzLDcgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXZvaWQgX0NhbGN1bGF0ZV9EX1N3RUNDKEJZVEUgKmJ1ZiwgQllURSAqZWNjKQordm9pZCBfQ2FsY3VsYXRlX0RfU3dFQ0ModTggKmJ1ZiwgdTggKmVjYykKIHsKIAljYWxjdWxhdGVfZWNjKGVjY3RhYmxlLCBidWYsIGVjYysxLCBlY2MrMCwgZWNjKzIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxtYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbG1haW4uYwppbmRleCAwOWQwN2UwLi5mYzdjYmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbG1haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbG1haW4uYwpAQCAtNCwxMSArNCwxMSBAQAogI2luY2x1ZGUgInNtY29tbW9uLmgiCiAjaW5jbHVkZSAic21pbC5oIgogCi1zdGF0aWMgaW50ICAgICAgICAgQ29udl9EX01lZGlhQWRkcihzdHJ1Y3QgdXNfZGF0YSAqLCBEV09SRCk7CitzdGF0aWMgaW50ICAgICAgICAgQ29udl9EX01lZGlhQWRkcihzdHJ1Y3QgdXNfZGF0YSAqLCB1MzIpOwogc3RhdGljIGludCAgICAgICAgIEluY19EX01lZGlhQWRkcihzdHJ1Y3QgdXNfZGF0YSAqKTsKLXN0YXRpYyBpbnQgICAgICAgICBNZWRpYV9EX1JlYWRPbmVTZWN0KHN0cnVjdCB1c19kYXRhICosIFdPUkQsIEJZVEUgKik7CitzdGF0aWMgaW50ICAgICAgICAgTWVkaWFfRF9SZWFkT25lU2VjdChzdHJ1Y3QgdXNfZGF0YSAqLCB1MTYsIHU4ICopOwogCi1zdGF0aWMgaW50ICBDb3B5X0RfQmxvY2tBbGwoc3RydWN0IHVzX2RhdGEgKiwgRFdPUkQpOworc3RhdGljIGludCAgQ29weV9EX0Jsb2NrQWxsKHN0cnVjdCB1c19kYXRhICosIHUzMik7CiAKIHN0YXRpYyBpbnQgIEFzc2lnbl9EX1dyaXRlQmxvY2sodm9pZCk7CiBzdGF0aWMgaW50ICBSZWxlYXNlX0RfUmVhZEJsb2NrKHN0cnVjdCB1c19kYXRhICopOwpAQCAtMTYsNyArMTYsNyBAQAogc3RhdGljIGludCAgUmVsZWFzZV9EX0NvcHlTZWN0b3Ioc3RydWN0IHVzX2RhdGEgKik7CiAKIHN0YXRpYyBpbnQgIENvcHlfRF9QaHlPbmVTZWN0KHN0cnVjdCB1c19kYXRhICopOwotc3RhdGljIGludCAgUmVhZF9EX1BoeU9uZVNlY3Qoc3RydWN0IHVzX2RhdGEgKiwgV09SRCwgQllURSAqKTsKK3N0YXRpYyBpbnQgIFJlYWRfRF9QaHlPbmVTZWN0KHN0cnVjdCB1c19kYXRhICosIHUxNiwgdTggKik7CiBzdGF0aWMgaW50ICBFcmFzZV9EX1BoeU9uZUJsb2NrKHN0cnVjdCB1c19kYXRhICopOwogCiBzdGF0aWMgaW50ICBTZXRfRF9QaHlGbXRWYWx1ZShzdHJ1Y3QgdXNfZGF0YSAqKTsKQEAgLTI1LDI0ICsyNSwyNCBAQAogCiBzdGF0aWMgaW50ICBNYXJrRmFpbF9EX1BoeU9uZUJsb2NrKHN0cnVjdCB1c19kYXRhICopOwogCi1zdGF0aWMgRFdPUkQgRXJyQ29kZTsKLXN0YXRpYyBCWVRFICBXb3JrQnVmW1NFQ1RTSVpFXTsKLXN0YXRpYyBCWVRFICBSZWR1bmRhbnRbUkVEVFNJWkVdOwotc3RhdGljIEJZVEUgIFdvcmtSZWR1bmRbUkVEVFNJWkVdOworc3RhdGljIHUzMiBFcnJDb2RlOworc3RhdGljIHU4ICBXb3JrQnVmW1NFQ1RTSVpFXTsKK3N0YXRpYyB1OCAgUmVkdW5kYW50W1JFRFRTSVpFXTsKK3N0YXRpYyB1OCAgV29ya1JlZHVuZFtSRURUU0laRV07CiAvKiAxMjggeCAxMDAwLCBMb2cyUGh5W01BWF9aT05FTlVNXVtNQVhfTE9HQkxPQ0tdOyAqLwotc3RhdGljIFdPUkQgICpMb2cyUGh5W01BWF9aT05FTlVNXTsKLXN0YXRpYyBCWVRFICBBc3NpZ25bTUFYX1pPTkVOVU1dW01BWF9CTE9DS05VTSAvIDhdOwotc3RhdGljIFdPUkQgIEFzc2lnblN0YXJ0W01BWF9aT05FTlVNXTsKLVdPUkQgIFJlYWRCbG9jazsKLVdPUkQgIFdyaXRlQmxvY2s7Ci1EV09SRCBNZWRpYUNoYW5nZTsKLXN0YXRpYyBEV09SRCBTZWN0Q29weU1vZGU7CitzdGF0aWMgdTE2ICAqTG9nMlBoeVtNQVhfWk9ORU5VTV07CitzdGF0aWMgdTggIEFzc2lnbltNQVhfWk9ORU5VTV1bTUFYX0JMT0NLTlVNIC8gOF07CitzdGF0aWMgdTE2ICBBc3NpZ25TdGFydFtNQVhfWk9ORU5VTV07Cit1MTYgIFJlYWRCbG9jazsKK3UxNiAgV3JpdGVCbG9jazsKK3UzMiBNZWRpYUNoYW5nZTsKK3N0YXRpYyB1MzIgU2VjdENvcHlNb2RlOwogCiAvKiBCSVQgQ29udHJvbCBNYWNybyAqLwotc3RhdGljIEJZVEUgQml0RGF0YVtdID0geyAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwIH07Ci0jZGVmaW5lIFNldF9EX0JpdChhLCBiKSAgICAoYVsoQllURSkoKGIpIC8gOCldIHw9IEJpdERhdGFbKGIpICUgOF0pCi0jZGVmaW5lIENscl9EX0JpdChhLCBiKSAgICAoYVsoQllURSkoKGIpIC8gOCldICY9IH5CaXREYXRhWyhiKSAlIDhdKQotI2RlZmluZSBDaGtfRF9CaXQoYSwgYikgICAgKGFbKEJZVEUpKChiKSAvIDgpXSAmIEJpdERhdGFbKGIpICUgOF0pCitzdGF0aWMgdTggQml0RGF0YVtdID0geyAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwIH07CisjZGVmaW5lIFNldF9EX0JpdChhLCBiKSAgICAoYVsodTgpKChiKSAvIDgpXSB8PSBCaXREYXRhWyhiKSAlIDhdKQorI2RlZmluZSBDbHJfRF9CaXQoYSwgYikgICAgKGFbKHU4KSgoYikgLyA4KV0gJj0gfkJpdERhdGFbKGIpICUgOF0pCisjZGVmaW5lIENoa19EX0JpdChhLCBiKSAgICAoYVsodTgpKChiKSAvIDgpXSAmIEJpdERhdGFbKGIpICUgOF0pCiAKIC8qIC0tLS0tIFNNX0ZyZWVNZW0oKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBpbnQgU01fRnJlZU1lbSh2b2lkKQpAQCAtNjIsOSArNjIsOSBAQAogCiAvKiBTbWFydE1lZGlhIFJlYWQvV3JpdGUvRXJhc2UgRnVuY3Rpb24gKi8KIC8qIC0tLS0tIE1lZGlhX0RfUmVhZFNlY3RvcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBNZWRpYV9EX1JlYWRTZWN0b3Ioc3RydWN0IHVzX2RhdGEgKnVzLCBEV09SRCBzdGFydCwgV09SRCBjb3VudCwgQllURSAqYnVmKQoraW50IE1lZGlhX0RfUmVhZFNlY3RvcihzdHJ1Y3QgdXNfZGF0YSAqdXMsIHUzMiBzdGFydCwgdTE2IGNvdW50LCB1OCAqYnVmKQogewotCVdPUkQgbGVuLCBibjsKKwl1MTYgbGVuLCBibjsKIAogCWlmIChDb252X0RfTWVkaWFBZGRyKHVzLCBzdGFydCkpCiAJCXJldHVybiBFcnJDb2RlOwpAQCAtOTcsOSArOTcsOSBAQAogfQogLyogaGVyZSAqLwogLyogLS0tLS0gTWVkaWFfRF9Db3B5U2VjdG9yKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgTWVkaWFfRF9Db3B5U2VjdG9yKHN0cnVjdCB1c19kYXRhICp1cywgRFdPUkQgc3RhcnQsIFdPUkQgY291bnQsIEJZVEUgKmJ1ZikKK2ludCBNZWRpYV9EX0NvcHlTZWN0b3Ioc3RydWN0IHVzX2RhdGEgKnVzLCB1MzIgc3RhcnQsIHUxNiBjb3VudCwgdTggKmJ1ZikKIHsKLQlXT1JEIGxlbiwgYm47CisJdTE2IGxlbiwgYm47CiAKIAkvKiBwcl9pbmZvKCJNZWRpYV9EX0NvcHlTZWN0b3IgISEhXG4iKTsgKi8KIAlpZiAoQ29udl9EX01lZGlhQWRkcih1cywgc3RhcnQpKQpAQCAtMTg2LDEyICsxODYsMTIgQEAKIAogLyogU21hcnRNZWRpYSBQaHlzaWNhbCBBZGRyZXNzIENvbnRyb2wgU3Vicm91dGluZSAqLwogLyogLS0tLS0gQ29udl9EX01lZGlhQWRkcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIGludCBDb252X0RfTWVkaWFBZGRyKHN0cnVjdCB1c19kYXRhICp1cywgRFdPUkQgYWRkcikKK3N0YXRpYyBpbnQgQ29udl9EX01lZGlhQWRkcihzdHJ1Y3QgdXNfZGF0YSAqdXMsIHUzMiBhZGRyKQogewotCURXT1JEIHRlbXA7CisJdTMyIHRlbXA7CiAKIAl0ZW1wICAgICAgICAgICA9IGFkZHIgLyBTc2ZkYy5NYXhTZWN0b3JzOwotCU1lZGlhLlpvbmUgICAgID0gKEJZVEUpICh0ZW1wIC8gU3NmZGMuTWF4TG9nQmxvY2tzKTsKKwlNZWRpYS5ab25lICAgICA9ICh1OCkgKHRlbXAgLyBTc2ZkYy5NYXhMb2dCbG9ja3MpOwogCiAJaWYgKExvZzJQaHlbTWVkaWEuWm9uZV0gPT0gTlVMTCkgewogCQlpZiAoTWFrZV9EX0xvZ1RhYmxlKHVzKSkgewpAQCAtMjAwLDggKzIwMCw4IEBACiAJCX0KIAl9CiAKLQlNZWRpYS5TZWN0b3IgICA9IChCWVRFKSAoYWRkciAlIFNzZmRjLk1heFNlY3RvcnMpOwotCU1lZGlhLkxvZ0Jsb2NrID0gKFdPUkQpICh0ZW1wICUgU3NmZGMuTWF4TG9nQmxvY2tzKTsKKwlNZWRpYS5TZWN0b3IgICA9ICh1OCkgKGFkZHIgJSBTc2ZkYy5NYXhTZWN0b3JzKTsKKwlNZWRpYS5Mb2dCbG9jayA9ICh1MTYpICh0ZW1wICUgU3NmZGMuTWF4TG9nQmxvY2tzKTsKIAogCWlmIChNZWRpYS5ab25lIDwgU3NmZGMuTWF4Wm9uZXMpIHsKIAkJQ2xyX0RfUmVkdW5kYW50RGF0YShSZWR1bmRhbnQpOwpAQCAtMjE3LDcgKzIxNyw3IEBACiAvKiAtLS0tLSBJbmNfRF9NZWRpYUFkZHIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgaW50IEluY19EX01lZGlhQWRkcihzdHJ1Y3QgdXNfZGF0YSAqdXMpCiB7Ci0JV09SRCAgICAgICAgTG9nQmxvY2sgPSBNZWRpYS5Mb2dCbG9jazsKKwl1MTYgICAgICAgIExvZ0Jsb2NrID0gTWVkaWEuTG9nQmxvY2s7CiAKIAlpZiAoKytNZWRpYS5TZWN0b3IgPCBTc2ZkYy5NYXhTZWN0b3JzKQogCQlyZXR1cm4gU01TVUNDRVNTOwpAQCAtMjY1LDkgKzI2NSw5IEBACiAKIC8qIFNtYXJ0TWVkaWEgUmVhZC9Xcml0ZSBTdWJyb3V0aW5lIHdpdGggUmV0cnkgKi8KIC8qIC0tLS0tIE1lZGlhX0RfUmVhZE9uZVNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBpbnQgTWVkaWFfRF9SZWFkT25lU2VjdChzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgY291bnQsIEJZVEUgKmJ1ZikKK3N0YXRpYyBpbnQgTWVkaWFfRF9SZWFkT25lU2VjdChzdHJ1Y3QgdXNfZGF0YSAqdXMsIHUxNiBjb3VudCwgdTggKmJ1ZikKIHsKLQlEV09SRCBlcnIsIHJldHJ5OworCXUzMiBlcnIsIHJldHJ5OwogCiAJaWYgKCFSZWFkX0RfUGh5T25lU2VjdCh1cywgY291bnQsIGJ1ZikpCiAJCXJldHVybiBTTVNVQ0NFU1M7CkBAIC0zMDksOSArMzA5LDkgQEAKIAogLyogU21hcnRNZWRpYSBQaHlzaWNhbCBTZWN0b3IgRGF0YSBDb3B5IFN1YnJvdXRpbmUgKi8KIC8qIC0tLS0tIENvcHlfRF9CbG9ja0FsbCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBpbnQgQ29weV9EX0Jsb2NrQWxsKHN0cnVjdCB1c19kYXRhICp1cywgRFdPUkQgbW9kZSkKK3N0YXRpYyBpbnQgQ29weV9EX0Jsb2NrQWxsKHN0cnVjdCB1c19kYXRhICp1cywgdTMyIG1vZGUpCiB7Ci0JQllURSBzZWN0OworCXU4IHNlY3Q7CiAKIAlzZWN0ID0gTWVkaWEuU2VjdG9yOwogCkBAIC0zODEsNyArMzgxLDcgQEAKIC8qIC0tLS0tIFJlbGVhc2VfRF9SZWFkQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBpbnQgUmVsZWFzZV9EX1JlYWRCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMpCiB7Ci0JRFdPUkQgbW9kZTsKKwl1MzIgbW9kZTsKIAogCW1vZGUgPSBTZWN0Q29weU1vZGU7CiAJU2VjdENvcHlNb2RlID0gQ09NUExFVEVEOwpAQCAtNDMwLDcgKzQzMCw3IEBACiBzdGF0aWMgaW50IENvcHlfRF9QaHlPbmVTZWN0KHN0cnVjdCB1c19kYXRhICp1cykKIHsKIAlpbnQgICAgICAgICAgIGk7Ci0JRFdPUkQgIGVyciwgcmV0cnk7CisJdTMyICBlcnIsIHJldHJ5OwogCiAJLyogcHJfaW5mbygiQ29weV9EX1BoeU9uZVNlY3QgLS0tIFNlY3RvciA9ICV4XG4iLCBNZWRpYS5TZWN0b3IpOyAqLwogCWlmIChSZWFkQmxvY2sgIT0gTk9fQVNTSUdOKSB7CkBAIC01MDQsMTAgKzUwNCwxMCBAQAogCiAvKiBTbWFydE1lZGlhIFBoeXNpY2FsIFNlY3RvciBSZWFkL1dyaXRlL0VyYXNlIFN1YnJvdXRpbmUgKi8KIC8qIC0tLS0tIFJlYWRfRF9QaHlPbmVTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBpbnQgUmVhZF9EX1BoeU9uZVNlY3Qoc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIGNvdW50LCBCWVRFICpidWYpCitzdGF0aWMgaW50IFJlYWRfRF9QaHlPbmVTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgdTE2IGNvdW50LCB1OCAqYnVmKQogewogCWludCAgICAgICAgICAgaTsKLQlEV09SRCAgcmV0cnk7CisJdTMyICByZXRyeTsKIAogCWlmIChNZWRpYS5QaHlCbG9jayA9PSBOT19BU1NJR04pIHsKIAkJZm9yIChpID0gMDsgaSA8IFNFQ1RTSVpFOyBpKyspCkBAIC02MzcsMTAgKzYzNywxMCBAQAogLyogLS0tLS0gTWFrZV9EX0xvZ1RhYmxlKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RhdGljIGludCBNYWtlX0RfTG9nVGFibGUoc3RydWN0IHVzX2RhdGEgKnVzKQogewotCVdPUkQgIHBoeWJsb2NrLCBsb2dibG9jazsKKwl1MTYgIHBoeWJsb2NrLCBsb2dibG9jazsKIAogCWlmIChMb2cyUGh5W01lZGlhLlpvbmVdID09IE5VTEwpIHsKLQkJTG9nMlBoeVtNZWRpYS5ab25lXSA9IGttYWxsb2MoTUFYX0xPR0JMT0NLICogc2l6ZW9mKFdPUkQpLAorCQlMb2cyUGh5W01lZGlhLlpvbmVdID0ga21hbGxvYyhNQVhfTE9HQkxPQ0sgKiBzaXplb2YodTE2KSwKIAkJCQkJCQkJR0ZQX0tFUk5FTCk7CiAJCS8qIHByX2luZm8oIkV4QWxsb2NhdGVQb29sIFpvbmUgPSAleCwgQWRkciA9ICV4XG4iLAogCQkJCU1lZGlhLlpvbmUsIExvZzJQaHlbTWVkaWEuWm9uZV0pOyAqLwpAQCAtNjkzLDcgKzY5Myw3IEBACiAKIAkJcGh5YmxvY2sgICAgID0gTWVkaWEuUGh5QmxvY2s7CiAJCWxvZ2Jsb2NrICAgICA9IE1lZGlhLkxvZ0Jsb2NrOwotCQlNZWRpYS5TZWN0b3IgPSAoQllURSkoU3NmZGMuTWF4U2VjdG9ycyAtIDEpOworCQlNZWRpYS5TZWN0b3IgPSAodTgpKFNzZmRjLk1heFNlY3RvcnMgLSAxKTsKIAogCQlpZiAoU3NmZGNfRF9SZWFkUmVkdERhdGEodXMsIFJlZHVuZGFudCkpIHsKIAkJCVNzZmRjX0RfUmVzZXQodXMpOwpAQCAtNzM4LDcgKzczOCw3IEBACiAvKiAtLS0tLSBNYXJrRmFpbF9EX1BoeU9uZUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgaW50IE1hcmtGYWlsX0RfUGh5T25lQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzKQogewotCUJZVEUgc2VjdDsKKwl1OCBzZWN0OwogCiAJc2VjdCA9IE1lZGlhLlNlY3RvcjsKIAlTZXRfRF9GYWlsQmxvY2soV29ya1JlZHVuZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbHN1Yi5jIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxzdWIuYwppbmRleCAxNmRhOWE5Li40NGNlZDgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbHN1Yi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsc3ViLmMKQEAgLTYsMTYgKzYsMTYgQEAKICNpbmNsdWRlICJzbWNvbW1vbi5oIgogI2luY2x1ZGUgInNtaWwuaCIKIAotc3RhdGljIEJZVEUgICBfQ2hlY2tfRF9EZXZDb2RlKEJZVEUpOwotc3RhdGljIERXT1JECUVyclhEQ29kZTsKLXN0YXRpYyBCWVRFCUlzU1NGRENDb21wbGlhbmNlOwotc3RhdGljIEJZVEUJSXNYRENvbXBsaWFuY2U7CitzdGF0aWMgdTggICBfQ2hlY2tfRF9EZXZDb2RlKHU4KTsKK3N0YXRpYyB1MzIJRXJyWERDb2RlOworc3RhdGljIHU4CUlzU1NGRENDb21wbGlhbmNlOworc3RhdGljIHU4CUlzWERDb21wbGlhbmNlOwogCiBzdHJ1Y3Qga2V1Y3JfbWVkaWFfaW5mbyAgICAgICAgIFNzZmRjOwogc3RydWN0IGtldWNyX21lZGlhX2FkZHJlc3MgICAgICBNZWRpYTsKIHN0cnVjdCBrZXVjcl9tZWRpYV9hcmVhICAgICAgICAgQ2lzQXJlYTsKIAotc3RhdGljIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNjQnVmWzZdOworc3RhdGljIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjY0J1Zls2XTsKIAogI2RlZmluZSBFVkVOICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgIC8qIEV2ZW4gUGFnZSBmb3IgMjU2Ynl0ZS9wYWdlICovCiAjZGVmaW5lIE9ERCAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgLyogT2RkIFBhZ2UgZm9yIDI1NmJ5dGUvcGFnZSAqLwpAQCAtMjQsNyArMjQsNyBAQAogLyogU21hcnRNZWRpYSBSZWR1bmRhbnQgYnVmZmVyIGRhdGEgQ29udHJvbCBTdWJyb3V0aW5lCiAgKi0tLS0tIENoZWNrX0RfRGF0YUJsYW5rKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotaW50IENoZWNrX0RfRGF0YUJsYW5rKEJZVEUgKnJlZHVuZGFudCkKK2ludCBDaGVja19EX0RhdGFCbGFuayh1OCAqcmVkdW5kYW50KQogewogCWNoYXIgaTsKIApAQCAtMzYsNyArMzYsNyBAQAogfQogCiAvKiAtLS0tLSBDaGVja19EX0ZhaWxCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgQ2hlY2tfRF9GYWlsQmxvY2soQllURSAqcmVkdW5kYW50KQoraW50IENoZWNrX0RfRmFpbEJsb2NrKHU4ICpyZWR1bmRhbnQpCiB7CiAJcmVkdW5kYW50ICs9IFJFRFRfQkxPQ0s7CiAKQEAgLTUxLDcgKzUxLDcgQEAKIH0KIAogLyogLS0tLS0gQ2hlY2tfRF9EYXRhU3RhdHVzKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotaW50IENoZWNrX0RfRGF0YVN0YXR1cyhCWVRFICpyZWR1bmRhbnQpCitpbnQgQ2hlY2tfRF9EYXRhU3RhdHVzKHU4ICpyZWR1bmRhbnQpCiB7CiAJcmVkdW5kYW50ICs9IFJFRFRfREFUQTsKIApAQCAtNzAsMTQgKzcwLDE0IEBACiB9CiAKIC8qIC0tLS0tIExvYWRfRF9Mb2dCbG9ja0FkZHIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBMb2FkX0RfTG9nQmxvY2tBZGRyKEJZVEUgKnJlZHVuZGFudCkKK2ludCBMb2FkX0RfTG9nQmxvY2tBZGRyKHU4ICpyZWR1bmRhbnQpCiB7Ci0JV09SRCBhZGRyMSwgYWRkcjI7CisJdTE2IGFkZHIxLCBhZGRyMjsKIAotCWFkZHIxID0gKFdPUkQpKihyZWR1bmRhbnQgKyBSRURUX0FERFIxSCkqMHgwMTAwICsKLQkJCQkJKFdPUkQpKihyZWR1bmRhbnQgKyBSRURUX0FERFIxTCk7Ci0JYWRkcjIgPSAoV09SRCkqKHJlZHVuZGFudCArIFJFRFRfQUREUjJIKSoweDAxMDAgKwotCQkJCQkoV09SRCkqKHJlZHVuZGFudCArIFJFRFRfQUREUjJMKTsKKwlhZGRyMSA9ICh1MTYpKihyZWR1bmRhbnQgKyBSRURUX0FERFIxSCkqMHgwMTAwICsKKwkJCQkJKHUxNikqKHJlZHVuZGFudCArIFJFRFRfQUREUjFMKTsKKwlhZGRyMiA9ICh1MTYpKihyZWR1bmRhbnQgKyBSRURUX0FERFIySCkqMHgwMTAwICsKKwkJCQkJKHUxNikqKHJlZHVuZGFudCArIFJFRFRfQUREUjJMKTsKIAogCWlmIChhZGRyMSA9PSBhZGRyMikKIAkJaWYgKChhZGRyMSAmIDB4RjAwMCkgPT0gMHgxMDAwKSB7CkBAIC04NSw3ICs4NSw3IEBACiAJCQlyZXR1cm4gU01TVUNDRVNTOwogCQl9CiAKLQlpZiAoaHdlaWdodDE2KChXT1JEKShhZGRyMV5hZGRyMikpICE9IDB4MDEpCisJaWYgKGh3ZWlnaHQxNigodTE2KShhZGRyMV5hZGRyMikpICE9IDB4MDEpCiAJCXJldHVybiBFUlJPUjsKIAogCWlmICgoYWRkcjEgJiAweEYwMDApID09IDB4MTAwMCkKQEAgLTEwNCw3ICsxMDQsNyBAQAogfQogCiAvKiAtLS0tLSBDbHJfRF9SZWR1bmRhbnREYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIENscl9EX1JlZHVuZGFudERhdGEoQllURSAqcmVkdW5kYW50KQordm9pZCBDbHJfRF9SZWR1bmRhbnREYXRhKHU4ICpyZWR1bmRhbnQpCiB7CiAJY2hhciBpOwogCkBAIC0xMTMsOSArMTEzLDkgQEAKIH0KIAogLyogLS0tLS0gU2V0X0RfTG9nQmxvY2tBZGRyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBTZXRfRF9Mb2dCbG9ja0FkZHIoQllURSAqcmVkdW5kYW50KQordm9pZCBTZXRfRF9Mb2dCbG9ja0FkZHIodTggKnJlZHVuZGFudCkKIHsKLQlXT1JEIGFkZHI7CisJdTE2IGFkZHI7CiAKIAkqKHJlZHVuZGFudCArIFJFRFRfQkxPQ0spID0gMHhGRjsKIAkqKHJlZHVuZGFudCArIFJFRFRfREFUQSkgPSAweEZGOwpAQCAtMTI1LDIwICsxMjUsMjAgQEAKIAkJYWRkcisrOwogCiAJKihyZWR1bmRhbnQgKyBSRURUX0FERFIxSCkgPSAqKHJlZHVuZGFudCArIFJFRFRfQUREUjJIKSA9Ci0JCQkJCQkJKEJZVEUpKGFkZHIgLyAweDAxMDApOwotCSoocmVkdW5kYW50ICsgUkVEVF9BRERSMUwpID0gKihyZWR1bmRhbnQgKyBSRURUX0FERFIyTCkgPSAoQllURSlhZGRyOworCQkJCQkJCSh1OCkoYWRkciAvIDB4MDEwMCk7CisJKihyZWR1bmRhbnQgKyBSRURUX0FERFIxTCkgPSAqKHJlZHVuZGFudCArIFJFRFRfQUREUjJMKSA9ICh1OClhZGRyOwogfQogCiAvKi0tLS0tIFNldF9EX0ZhaWxCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgU2V0X0RfRmFpbEJsb2NrKEJZVEUgKnJlZHVuZGFudCkKK3ZvaWQgU2V0X0RfRmFpbEJsb2NrKHU4ICpyZWR1bmRhbnQpCiB7CiAJY2hhciBpOwogCWZvciAoaSA9IDA7IGkgPCBSRURUU0laRTsgaSsrKQotCQkqcmVkdW5kYW50KysgPSAoQllURSkoKGkgPT0gUkVEVF9CTE9DSykgPyAweEYwIDogMHhGRik7CisJCSpyZWR1bmRhbnQrKyA9ICh1OCkoKGkgPT0gUkVEVF9CTE9DSykgPyAweEYwIDogMHhGRik7CiB9CiAKIC8qIC0tLS0tIFNldF9EX0RhdGFTdGF1cygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgU2V0X0RfRGF0YVN0YXVzKEJZVEUgKnJlZHVuZGFudCkKK3ZvaWQgU2V0X0RfRGF0YVN0YXVzKHU4ICpyZWR1bmRhbnQpCiB7CiAJcmVkdW5kYW50ICs9IFJFRFRfREFUQTsKIAkqcmVkdW5kYW50ID0gMHgwMDsKQEAgLTE1NCwxMCArMTU0LDEwIEBACiB9CiAKIC8qIC0tLS0tIFNzZmRjX0RfUmVhZENpc1NlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBTc2ZkY19EX1JlYWRDaXNTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnQpCitpbnQgU3NmZGNfRF9SZWFkQ2lzU2VjdChzdHJ1Y3QgdXNfZGF0YSAqdXMsIHU4ICpidWYsIHU4ICpyZWR1bmRhbnQpCiB7Ci0JQllURSB6b25lLCBzZWN0b3I7Ci0JV09SRCBibG9jazsKKwl1OCB6b25lLCBzZWN0b3I7CisJdTE2IGJsb2NrOwogCiAJem9uZSA9IE1lZGlhLlpvbmU7IGJsb2NrID0gTWVkaWEuUGh5QmxvY2s7IHNlY3RvciA9IE1lZGlhLlNlY3RvcjsKIAlNZWRpYS5ab25lID0gMDsKQEAgLTE3NywxMSArMTc3LDExIEBACiAKIC8qIDYyNTAgQ01EIDEgKi8KIC8qIC0tLS0tIFNzZmRjX0RfUmVhZFNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBTc2ZkY19EX1JlYWRTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnQpCitpbnQgU3NmZGNfRF9SZWFkU2VjdChzdHJ1Y3QgdXNfZGF0YSAqdXMsIHU4ICpidWYsIHU4ICpyZWR1bmRhbnQpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCWludAlyZXN1bHQ7Ci0JV09SRAlhZGRyOworCXUxNglhZGRyOwogCiAJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKIAlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewpAQCAtMTkwLDggKzE5MCw4IEBACiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCi0JYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgTWVkaWEuUGh5QmxvY2s7Ci0JYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKKwlhZGRyID0gKHUxNilNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIE1lZGlhLlBoeUJsb2NrOworCWFkZHIgPSBhZGRyKih1MTYpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKIAogCS8qIFJlYWQgc2VjdCBkYXRhICovCiAJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKQEAgLTIwMCw4ICsyMDAsOCBAQAogCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CiAJYmNiLT5DREJbMF0JCQk9IDB4RjE7CiAJYmNiLT5DREJbMV0JCQk9IDB4MDI7Ci0JYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7Ci0JYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQls0XQkJCT0gKHU4KWFkZHI7CisJYmNiLT5DREJbM10JCQk9ICh1OCkoYWRkciAvIDB4MDEwMCk7CiAJYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUgLyAyOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIGJ1ZiwgMCk7CkBAIC0yMTUsOCArMjE1LDggQEAKIAliY2ItPkZsYWdzCQkJPSAweDgwOwogCWJjYi0+Q0RCWzBdCQkJPSAweEYxOwogCWJjYi0+Q0RCWzFdCQkJPSAweDAzOwotCWJjYi0+Q0RCWzRdCQkJPSAoQllURSlhZGRyOwotCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYWRkciAvIDB4MDEwMCk7CisJYmNiLT5DREJbNF0JCQk9ICh1OClhZGRyOworCWJjYi0+Q0RCWzNdCQkJPSAodTgpKGFkZHIgLyAweDAxMDApOwogCWJjYi0+Q0RCWzJdCQkJPSBNZWRpYS5ab25lIC8gMjsKIAliY2ItPkNEQls4XQkJCT0gMDsKIAliY2ItPkNEQls5XQkJCT0gMTsKQEAgLTIyOSwxMiArMjI5LDEyIEBACiB9CiAKIC8qIC0tLS0tIFNzZmRjX0RfUmVhZEJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgU3NmZGNfRF9SZWFkQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIGNvdW50LCBCWVRFICpidWYsCi0JCQkJCQkJQllURSAqcmVkdW5kYW50KQoraW50IFNzZmRjX0RfUmVhZEJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgdTE2IGNvdW50LCB1OCAqYnVmLAorCQkJCQkJCXU4ICpyZWR1bmRhbnQpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCWludAlyZXN1bHQ7Ci0JV09SRAlhZGRyOworCXUxNglhZGRyOwogCiAJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKIAlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewpAQCAtMjQzLDggKzI0Myw4IEBACiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCi0JYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgTWVkaWEuUGh5QmxvY2s7Ci0JYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKKwlhZGRyID0gKHUxNilNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIE1lZGlhLlBoeUJsb2NrOworCWFkZHIgPSBhZGRyKih1MTYpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKIAogCS8qIFJlYWQgc2VjdCBkYXRhICovCiAJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKQEAgLTI1Myw4ICsyNTMsOCBAQAogCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CiAJYmNiLT5DREJbMF0JCQk9IDB4RjE7CiAJYmNiLT5DREJbMV0JCQk9IDB4MDI7Ci0JYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7Ci0JYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQls0XQkJCT0gKHU4KWFkZHI7CisJYmNiLT5DREJbM10JCQk9ICh1OCkoYWRkciAvIDB4MDEwMCk7CiAJYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUgLyAyOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIGJ1ZiwgMCk7CkBAIC0yNjgsOCArMjY4LDggQEAKIAliY2ItPkZsYWdzCQkJPSAweDgwOwogCWJjYi0+Q0RCWzBdCQkJPSAweEYxOwogCWJjYi0+Q0RCWzFdCQkJPSAweDAzOwotCWJjYi0+Q0RCWzRdCQkJPSAoQllURSlhZGRyOwotCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYWRkciAvIDB4MDEwMCk7CisJYmNiLT5DREJbNF0JCQk9ICh1OClhZGRyOworCWJjYi0+Q0RCWzNdCQkJPSAodTgpKGFkZHIgLyAweDAxMDApOwogCWJjYi0+Q0RCWzJdCQkJPSBNZWRpYS5ab25lIC8gMjsKIAliY2ItPkNEQls4XQkJCT0gMDsKIAliY2ItPkNEQls5XQkJCT0gMTsKQEAgLTI4MywxMiArMjgzLDEyIEBACiAKIAogLyogLS0tLS0gU3NmZGNfRF9Db3B5QmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotaW50IFNzZmRjX0RfQ29weUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBjb3VudCwgQllURSAqYnVmLAotCQkJCQkJCUJZVEUgKnJlZHVuZGFudCkKK2ludCBTc2ZkY19EX0NvcHlCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIHUxNiBjb3VudCwgdTggKmJ1ZiwKKwkJCQkJCQl1OCAqcmVkdW5kYW50KQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwotCVdPUkQJUmVhZEFkZHIsIFdyaXRlQWRkcjsKKwl1MTYJUmVhZEFkZHIsIFdyaXRlQWRkcjsKIAogCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU01fUldfUEFUVEVSTik7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKQEAgLTI5NywxMCArMjk3LDEwIEBACiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCi0JUmVhZEFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIFJlYWRCbG9jazsKLQlSZWFkQWRkciA9IFJlYWRBZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnM7Ci0JV3JpdGVBZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MgKyBXcml0ZUJsb2NrOwotCVdyaXRlQWRkciA9IFdyaXRlQWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzOworCVJlYWRBZGRyID0gKHUxNilNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIFJlYWRCbG9jazsKKwlSZWFkQWRkciA9IFJlYWRBZGRyKih1MTYpU3NmZGMuTWF4U2VjdG9yczsKKwlXcml0ZUFkZHIgPSAodTE2KU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgV3JpdGVCbG9jazsKKwlXcml0ZUFkZHIgPSBXcml0ZUFkZHIqKHUxNilTc2ZkYy5NYXhTZWN0b3JzOwogCiAJLyogV3JpdGUgc2VjdCBkYXRhICovCiAJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKQEAgLTMwOSwxNiArMzA5LDE2IEBACiAJYmNiLT5GbGFncwkJCT0gMHgwMDsKIAliY2ItPkNEQlswXQkJCT0gMHhGMDsKIAliY2ItPkNEQlsxXQkJCT0gMHgwODsKLQliY2ItPkNEQls3XQkJCT0gKEJZVEUpV3JpdGVBZGRyOwotCWJjYi0+Q0RCWzZdCQkJPSAoQllURSkoV3JpdGVBZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQls3XQkJCT0gKHU4KVdyaXRlQWRkcjsKKwliY2ItPkNEQls2XQkJCT0gKHU4KShXcml0ZUFkZHIgLyAweDAxMDApOwogCWJjYi0+Q0RCWzVdCQkJPSBNZWRpYS5ab25lIC8gMjsKIAliY2ItPkNEQls4XQkJCT0gKihyZWR1bmRhbnQgKyBSRURUX0FERFIxSCk7CiAJYmNiLT5DREJbOV0JCQk9ICoocmVkdW5kYW50ICsgUkVEVF9BRERSMUwpOwogCWJjYi0+Q0RCWzEwXQkJPSBNZWRpYS5TZWN0b3I7CiAKIAlpZiAoUmVhZEJsb2NrICE9IE5PX0FTU0lHTikgewotCQliY2ItPkNEQls0XQkJPSAoQllURSlSZWFkQWRkcjsKLQkJYmNiLT5DREJbM10JCT0gKEJZVEUpKFJlYWRBZGRyIC8gMHgwMTAwKTsKKwkJYmNiLT5DREJbNF0JCT0gKHU4KVJlYWRBZGRyOworCQliY2ItPkNEQlszXQkJPSAodTgpKFJlYWRBZGRyIC8gMHgwMTAwKTsKIAkJYmNiLT5DREJbMl0JCT0gTWVkaWEuWm9uZSAvIDI7CiAJfSBlbHNlCiAJCWJjYi0+Q0RCWzExXQk9IDE7CkBAIC0zMzEsMTEgKzMzMSwxMSBAQAogfQogCiAvKiAtLS0tLSBTc2ZkY19EX1dyaXRlU2VjdEZvckNvcHkoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5KHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnQpCitpbnQgU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5KHN0cnVjdCB1c19kYXRhICp1cywgdTggKmJ1ZiwgdTggKnJlZHVuZGFudCkKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50CXJlc3VsdDsKLQlXT1JECWFkZHI7CisJdTE2CWFkZHI7CiAKIAlyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwogCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CkBAIC0zNDUsOCArMzQ1LDggQEAKIAl9CiAKIAotCWFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIE1lZGlhLlBoeUJsb2NrOwotCWFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMgKyBNZWRpYS5TZWN0b3I7CisJYWRkciA9ICh1MTYpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MgKyBNZWRpYS5QaHlCbG9jazsKKwlhZGRyID0gYWRkcioodTE2KVNzZmRjLk1heFNlY3RvcnMgKyBNZWRpYS5TZWN0b3I7CiAKIAkvKiBXcml0ZSBzZWN0IGRhdGEgKi8KIAltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwpAQCAtMzU1LDggKzM1NSw4IEBACiAJYmNiLT5GbGFncwkJCT0gMHgwMDsKIAliY2ItPkNEQlswXQkJCT0gMHhGMDsKIAliY2ItPkNEQlsxXQkJCT0gMHgwNDsKLQliY2ItPkNEQls3XQkJCT0gKEJZVEUpYWRkcjsKLQliY2ItPkNEQls2XQkJCT0gKEJZVEUpKGFkZHIgLyAweDAxMDApOworCWJjYi0+Q0RCWzddCQkJPSAodTgpYWRkcjsKKwliY2ItPkNEQls2XQkJCT0gKHU4KShhZGRyIC8gMHgwMTAwKTsKIAliY2ItPkNEQls1XQkJCT0gTWVkaWEuWm9uZSAvIDI7CiAJYmNiLT5DREJbOF0JCQk9ICoocmVkdW5kYW50ICsgUkVEVF9BRERSMUgpOwogCWJjYi0+Q0RCWzldCQkJPSAqKHJlZHVuZGFudCArIFJFRFRfQUREUjFMKTsKQEAgLTM3NCw3ICszNzQsNyBAQAogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwotCVdPUkQJYWRkcjsKKwl1MTYJYWRkcjsKIAogCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU01fUldfUEFUVEVSTik7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKQEAgLTM4Myw4ICszODMsOCBAQAogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIAotCWFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIE1lZGlhLlBoeUJsb2NrOwotCWFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnM7CisJYWRkciA9ICh1MTYpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MgKyBNZWRpYS5QaHlCbG9jazsKKwlhZGRyID0gYWRkcioodTE2KVNzZmRjLk1heFNlY3RvcnM7CiAKIAltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwogCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKQEAgLTM5Miw4ICszOTIsOCBAQAogCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CiAJYmNiLT5DREJbMF0JCQk9IDB4RjI7CiAJYmNiLT5DREJbMV0JCQk9IDB4MDY7Ci0JYmNiLT5DREJbN10JCQk9IChCWVRFKWFkZHI7Ci0JYmNiLT5DREJbNl0JCQk9IChCWVRFKShhZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQls3XQkJCT0gKHU4KWFkZHI7CisJYmNiLT5DREJbNl0JCQk9ICh1OCkoYWRkciAvIDB4MDEwMCk7CiAJYmNiLT5DREJbNV0JCQk9IE1lZGlhLlpvbmUgLyAyOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIE5VTEwsIDApOwpAQCAtNDA1LDEyICs0MDUsMTIgQEAKIAogLyogNjI1MCBDTUQgMiAqLwogLyotLS0tLSBTc2ZkY19EX1JlYWRSZWR0RGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgU3NmZGNfRF9SZWFkUmVkdERhdGEoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFICpyZWR1bmRhbnQpCitpbnQgU3NmZGNfRF9SZWFkUmVkdERhdGEoc3RydWN0IHVzX2RhdGEgKnVzLCB1OCAqcmVkdW5kYW50KQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwotCVdPUkQJYWRkcjsKLQlCWVRFCSpidWY7CisJdTE2CWFkZHI7CisJdTgJKmJ1ZjsKIAogCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU01fUldfUEFUVEVSTik7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKQEAgLTQxOSw4ICs0MTksOCBAQAogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIAotCWFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIE1lZGlhLlBoeUJsb2NrOwotCWFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMgKyBNZWRpYS5TZWN0b3I7CisJYWRkciA9ICh1MTYpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MgKyBNZWRpYS5QaHlCbG9jazsKKwlhZGRyID0gYWRkcioodTE2KVNzZmRjLk1heFNlY3RvcnMgKyBNZWRpYS5TZWN0b3I7CiAKIAltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwogCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKQEAgLTQyOCw4ICs0MjgsOCBAQAogCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CiAJYmNiLT5DREJbMF0JCQk9IDB4RjE7CiAJYmNiLT5DREJbMV0JCQk9IDB4MDM7Ci0JYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7Ci0JYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQls0XQkJCT0gKHU4KWFkZHI7CisJYmNiLT5DREJbM10JCQk9ICh1OCkoYWRkciAvIDB4MDEwMCk7CiAJYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUgLyAyOwogCWJjYi0+Q0RCWzhdCQkJPSAwOwogCWJjYi0+Q0RCWzldCQkJPSAxOwpAQCAtNDQ2LDExICs0NDYsMTEgQEAKIAogLyogNjI1MCBDTUQgNCAqLwogLyogLS0tLS0gU3NmZGNfRF9Xcml0ZVJlZHREYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotaW50IFNzZmRjX0RfV3JpdGVSZWR0RGF0YShzdHJ1Y3QgdXNfZGF0YSAqdXMsIEJZVEUgKnJlZHVuZGFudCkKK2ludCBTc2ZkY19EX1dyaXRlUmVkdERhdGEoc3RydWN0IHVzX2RhdGEgKnVzLCB1OCAqcmVkdW5kYW50KQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwotCVdPUkQgICAgICAgICAgICAgICAgICAgIGFkZHI7CisJdTE2ICAgICAgICAgICAgICAgICAgICBhZGRyOwogCiAJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKIAlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewpAQCAtNDU5LDggKzQ1OSw4IEBACiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCi0JYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgTWVkaWEuUGh5QmxvY2s7Ci0JYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKKwlhZGRyID0gKHUxNilNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIE1lZGlhLlBoeUJsb2NrOworCWFkZHIgPSBhZGRyKih1MTYpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKIAogCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CiAJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwpAQCAtNDY4LDggKzQ2OCw4IEBACiAJYmNiLT5GbGFncwkJCT0gMHg4MDsKIAliY2ItPkNEQlswXQkJCT0gMHhGMjsKIAliY2ItPkNEQlsxXQkJCT0gMHgwNTsKLQliY2ItPkNEQls3XQkJCT0gKEJZVEUpYWRkcjsKLQliY2ItPkNEQls2XQkJCT0gKEJZVEUpKGFkZHIgLyAweDAxMDApOworCWJjYi0+Q0RCWzddCQkJPSAodTgpYWRkcjsKKwliY2ItPkNEQls2XQkJCT0gKHU4KShhZGRyIC8gMHgwMTAwKTsKIAliY2ItPkNEQls1XQkJCT0gTWVkaWEuWm9uZSAvIDI7CiAJYmNiLT5DREJbOF0JCQk9ICoocmVkdW5kYW50ICsgUkVEVF9BRERSMUgpOwogCWJjYi0+Q0RCWzldCQkJPSAqKHJlZHVuZGFudCArIFJFRFRfQUREUjFMKTsKQEAgLTQ5Miw3ICs0OTIsNyBAQAogLyogU21hcnRNZWRpYSBJRCBDb2RlIENoZWNrICYgTW9kZSBTZXQgU3Vicm91dGluZQogICogLS0tLS0gU2V0X0RfU3NmZGNNb2RlbCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi1pbnQgU2V0X0RfU3NmZGNNb2RlbChCWVRFIGRjb2RlKQoraW50IFNldF9EX1NzZmRjTW9kZWwodTggZGNvZGUpCiB7CiAJc3dpdGNoIChfQ2hlY2tfRF9EZXZDb2RlKGRjb2RlKSkgewogCWNhc2UgU1NGREMxTUI6CkBAIC02MDAsNyArNjAwLDcgQEAKIH0KIAogLyogLS0tLS0gX0NoZWNrX0RfRGV2Q29kZSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotQllURSBfQ2hlY2tfRF9EZXZDb2RlKEJZVEUgZGNvZGUpCitzdGF0aWMgdTggX0NoZWNrX0RfRGV2Q29kZSh1OCBkY29kZSkKIHsKIAlzd2l0Y2ggKGRjb2RlKSB7CiAJY2FzZSAweDZFOgpAQCAtNjMwLDIxICs2MzAsMjEgQEAKIC8qIFNtYXJ0TWVkaWEgRUNDIENvbnRyb2wgU3Vicm91dGluZQogICogLS0tLS0gQ2hlY2tfRF9SZWFkRXJyb3IoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLWludCBDaGVja19EX1JlYWRFcnJvcihCWVRFICpyZWR1bmRhbnQpCitpbnQgQ2hlY2tfRF9SZWFkRXJyb3IodTggKnJlZHVuZGFudCkKIHsKIAlyZXR1cm4gU01TVUNDRVNTOwogfQogCiAvKiAtLS0tLSBDaGVja19EX0NvcnJlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgQ2hlY2tfRF9Db3JyZWN0KEJZVEUgKmJ1ZiwgQllURSAqcmVkdW5kYW50KQoraW50IENoZWNrX0RfQ29ycmVjdCh1OCAqYnVmLCB1OCAqcmVkdW5kYW50KQogewogCXJldHVybiBTTVNVQ0NFU1M7CiB9CiAKIC8qIC0tLS0tIENoZWNrX0RfQ0lTZGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBDaGVja19EX0NJU2RhdGEoQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnQpCitpbnQgQ2hlY2tfRF9DSVNkYXRhKHU4ICpidWYsIHU4ICpyZWR1bmRhbnQpCiB7Ci0JQllURSBjaXNbXSA9IHsweDAxLCAweDAzLCAweEQ5LCAweDAxLCAweEZGLCAweDE4LCAweDAyLAorCXU4IGNpc1tdID0gezB4MDEsIDB4MDMsIDB4RDksIDB4MDEsIDB4RkYsIDB4MTgsIDB4MDIsCiAJCSAgICAgIDB4REYsIDB4MDEsIDB4MjB9OwogCiAJaW50IGNpc19sZW4gPSBzaXplb2YoY2lzKTsKQEAgLTY2OSw3ICs2NjksNyBAQAogfQogCiAvKiAtLS0tLSBTZXRfRF9SaWdodEVDQygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgU2V0X0RfUmlnaHRFQ0MoQllURSAqcmVkdW5kYW50KQordm9pZCBTZXRfRF9SaWdodEVDQyh1OCAqcmVkdW5kYW50KQogewogCS8qIERyaXZlciBFQ0MgQ2hlY2sgKi8KIAlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21zY3NpLmMgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21zY3NpLmMKaW5kZXggNWMwM2VjYS4uMjA4NThmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3Ntc2NzaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbXNjc2kuYwpAQCAtNjgsNyArNjgsNyBAQAogLyogLS0tLS0gU01fU0NTSV9JbnF1aXJ5KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgaW50IFNNX1NDU0lfSW5xdWlyeShzdHJ1Y3QgdXNfZGF0YSAqdXMsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKIHsKLQlCWVRFIGRhdGFfcHRyWzM2XSA9IHsweDAwLCAweDgwLCAweDAyLCAweDAwLCAweDFGLCAweDAwLCAweDAwLCAweDAwLAorCXU4IGRhdGFfcHRyWzM2XSA9IHsweDAwLCAweDgwLCAweDAyLCAweDAwLCAweDFGLCAweDAwLCAweDAwLCAweDAwLAogCQkJCSAweDU1LCAweDUzLCAweDQyLCAweDMyLCAweDJFLCAweDMwLCAweDIwLAogCQkJCSAweDIwLCAweDQzLCAweDYxLCAweDcyLCAweDY0LCAweDUyLCAweDY1LAogCQkJCSAweDYxLCAweDY0LCAweDY1LCAweDcyLCAweDIwLCAweDIwLCAweDIwLApAQCAtODIsOSArODIsOSBAQAogLyogLS0tLS0gU01fU0NTSV9Nb2RlX1NlbnNlKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgaW50IFNNX1NDU0lfTW9kZV9TZW5zZShzdHJ1Y3QgdXNfZGF0YSAqdXMsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKIHsKLQlCWVRFCW1lZGlhTm9XUFsxMl0gPSB7MHgwYiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwKKwl1OAltZWRpYU5vV1BbMTJdID0gezB4MGIsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsCiAJCQkJMHg3MSwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMH07Ci0JQllURQltZWRpYVdQWzEyXSAgID0gezB4MGIsIDB4MDAsIDB4ODAsIDB4MDgsIDB4MDAsIDB4MDAsCisJdTgJbWVkaWFXUFsxMl0gICA9IHsweDBiLCAweDAwLCAweDgwLCAweDA4LCAweDAwLCAweDAwLAogCQkJCTB4NzEsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDB9OwogCiAJaWYgKHVzLT5TTV9TdGF0dXMuV3RQKQpAQCAtMTAxLDkgKzEwMSw5IEBACiB7CiAJdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IE5VTEw7Ci0JRFdPUkQgICBibF9udW07Ci0JV09SRCAgICBibF9sZW47Ci0JQllURSAgICBidWZbOF07CisJdTMyICAgYmxfbnVtOworCXUxNiAgICBibF9sZW47CisJdTggICAgYnVmWzhdOwogCiAJZGV2X2RiZygmdXMtPnB1c2JfZGV2LT5kZXYsICJTTV9TQ1NJX1JlYWRfQ2FwYWNpdHlcbiIpOwogCkBAIC0xMzIsMTMgKzEzMiwxMyBAQAogc3RhdGljIGludCBTTV9TQ1NJX1JlYWQoc3RydWN0IHVzX2RhdGEgKnVzLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JUEJZVEUJQ2RiID0gc3JiLT5jbW5kOwotCURXT1JEIGJuICA9ICAoKENkYlsyXSA8PCAyNCkgJiAweGZmMDAwMDAwKSB8CisJdTggKkNkYiA9IHNyYi0+Y21uZDsKKwl1MzIgYm4gID0gICgoQ2RiWzJdIDw8IDI0KSAmIDB4ZmYwMDAwMDApIHwKIAkJCSgoQ2RiWzNdIDw8IDE2KSAmIDB4MDBmZjAwMDApIHwKIAkJCSgoQ2RiWzRdIDw8IDgpICYgMHgwMDAwZmYwMCkgfAogCQkJKChDZGJbNV0gPDwgMCkgJiAweDAwMDAwMGZmKTsKLQlXT1JEICBibGVuID0gKChDZGJbN10gPDwgOCkgJiAweGZmMDApICAgICB8ICgoQ2RiWzhdIDw8IDApICYgMHgwMGZmKTsKLQlEV09SRAlibGVuQnl0ZSA9IGJsZW4gKiAweDIwMDsKKwl1MTYgIGJsZW4gPSAoKENkYls3XSA8PCA4KSAmIDB4ZmYwMCkgICAgIHwgKChDZGJbOF0gPDwgMCkgJiAweDAwZmYpOworCXUzMglibGVuQnl0ZSA9IGJsZW4gKiAweDIwMDsKIAl2b2lkCSpidWY7CiAKIApAQCAtMTY0LDEzICsxNjQsMTMgQEAKIHN0YXRpYyBpbnQgU01fU0NTSV9Xcml0ZShzdHJ1Y3QgdXNfZGF0YSAqdXMsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKLQlQQllURQlDZGIgPSBzcmItPmNtbmQ7Ci0JRFdPUkQgYm4gID0gICgoQ2RiWzJdIDw8IDI0KSAmIDB4ZmYwMDAwMDApIHwKKwl1OCAqQ2RiID0gc3JiLT5jbW5kOworCXUzMiBibiAgPSAgKChDZGJbMl0gPDwgMjQpICYgMHhmZjAwMDAwMCkgfAogCQkJKChDZGJbM10gPDwgMTYpICYgMHgwMGZmMDAwMCkgfAogCQkJKChDZGJbNF0gPDwgOCkgJiAweDAwMDBmZjAwKSB8CiAJCQkoKENkYls1XSA8PCAwKSAmIDB4MDAwMDAwZmYpOwotCVdPUkQgIGJsZW4gPSAoKENkYls3XSA8PCA4KSAmIDB4ZmYwMCkgICAgIHwgKChDZGJbOF0gPDwgMCkgJiAweDAwZmYpOwotCURXT1JECWJsZW5CeXRlID0gYmxlbiAqIDB4MjAwOworCXUxNiAgYmxlbiA9ICgoQ2RiWzddIDw8IDgpICYgMHhmZjAwKSAgICAgfCAoKENkYls4XSA8PCAwKSAmIDB4MDBmZik7CisJdTMyCWJsZW5CeXRlID0gYmxlbiAqIDB4MjAwOwogCXZvaWQJKmJ1ZjsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvdHJhbnNwb3J0LmMKaW5kZXggYWViMjE4Ni4uYWU5NDE0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci90cmFuc3BvcnQuYwpAQCAtODMsOCArODMsOCBAQAogICovCiBzdGF0aWMgdm9pZCB1c2Jfc3Rvcl9wcmludF9jbWQoc3RydWN0IHVzX2RhdGEgKnVzLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpCiB7Ci0JUEJZVEUgICBDZGIgPSBzcmItPmNtbmQ7Ci0JRFdPUkQgICBjbWQgPSBDZGJbMF07CisJdTggKkNkYiA9IHNyYi0+Y21uZDsKKwl1MzIgICBjbWQgPSBDZGJbMF07CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgVEVTVF9VTklUX1JFQURZOgpAQCAtNTQ1LDggKzU0NSw4IEBACiAgKi8KIHZvaWQgQnVpbGRTZW5zZUJ1ZmZlcihzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIGludCBTcmJTdGF0dXMpCiB7Ci0JQllURSAgICAqYnVmID0gc3JiLT5zZW5zZV9idWZmZXI7Ci0JQllURSAgICBhc2M7CisJdTggICAgKmJ1ZiA9IHNyYi0+c2Vuc2VfYnVmZmVyOworCXU4ICAgIGFzYzsKIAogCXByX2luZm8oInRyYW5zcG9ydCAtLS0gQnVpbGRTZW5zZUJ1ZmZlclxuIik7CiAJc3dpdGNoIChTcmJTdGF0dXMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci90cmFuc3BvcnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci90cmFuc3BvcnQuaAppbmRleCBkZjM0NDc0Li5hYmQ4ZTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvdHJhbnNwb3J0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3RyYW5zcG9ydC5oCkBAIC01OCw5ICs1OCw5IEBACiBleHRlcm4gdm9pZCBFTkVfc3Rvcl9pbnZva2VfdHJhbnNwb3J0KHN0cnVjdCBzY3NpX2NtbmQgKiwgc3RydWN0IHVzX2RhdGEgKik7CiBleHRlcm4gaW50IEVORV9Jbml0TWVkaWEoc3RydWN0IHVzX2RhdGEgKik7CiBleHRlcm4gaW50IEVORV9TTUluaXQoc3RydWN0IHVzX2RhdGEgKik7Ci1leHRlcm4gaW50IEVORV9TZW5kU2NzaUNtZChzdHJ1Y3QgdXNfZGF0YSosIEJZVEUsIHZvaWQqLCBpbnQpOwotZXh0ZXJuIGludCBFTkVfTG9hZEJpbkNvZGUoc3RydWN0IHVzX2RhdGEqLCBCWVRFKTsKLWV4dGVybiBpbnQgZW5lX3JlYWRfYnl0ZShzdHJ1Y3QgdXNfZGF0YSosIFdPUkQgaW5kZXgsIHZvaWQgKmJ1Zik7CitleHRlcm4gaW50IEVORV9TZW5kU2NzaUNtZChzdHJ1Y3QgdXNfZGF0YSosIHU4LCB2b2lkKiwgaW50KTsKK2V4dGVybiBpbnQgRU5FX0xvYWRCaW5Db2RlKHN0cnVjdCB1c19kYXRhKiwgdTgpOworZXh0ZXJuIGludCBlbmVfcmVhZF9ieXRlKHN0cnVjdCB1c19kYXRhKiwgdTE2IGluZGV4LCB2b2lkICpidWYpOwogZXh0ZXJuIGludCBFTkVfUmVhZF9EYXRhKHN0cnVjdCB1c19kYXRhKiwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKTsKIGV4dGVybiBpbnQgRU5FX1dyaXRlX0RhdGEoc3RydWN0IHVzX2RhdGEqLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW5ndGgpOwogZXh0ZXJuIHZvaWQgQnVpbGRTZW5zZUJ1ZmZlcihzdHJ1Y3Qgc2NzaV9jbW5kICosIGludCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvdXNiLmMKaW5kZXggM2UzY2E2My4uMTJlYmRlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci91c2IuYwpAQCAtNTAsNyArNTAsNyBAQAogCiBzdGF0aWMgaW50IGV1Y3JfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSkKIHsKLQlCWVRFICAgIHRtcCA9IDA7CisJdTggICAgdG1wID0gMDsKIAogCXN0cnVjdCB1c19kYXRhICp1cyA9IHVzYl9nZXRfaW50ZmRhdGEoaWZhY2UpOwogCXByX2luZm8oIi0tLSBldWNyX3Jlc3VtZS0tLVxuIik7CkBAIC03MSw3ICs3MSw3IEBACiAKIHN0YXRpYyBpbnQgZXVjcl9yZXNldF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKQogewotCUJZVEUgICAgdG1wID0gMDsKKwl1OCAgICB0bXAgPSAwOwogCXN0cnVjdCB1c19kYXRhICp1cyA9IHVzYl9nZXRfaW50ZmRhdGEoaWZhY2UpOwogCiAJcHJfaW5mbygiLS0tIGV1Y3JfcmVzZXRfcmVzdW1lLS0tXG4iKTsKQEAgLTUyOCw3ICs1MjgsNyBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CiAJc3RydWN0IHVzX2RhdGEgKnVzOwogCWludCByZXN1bHQ7Ci0JQllURQlNaXNjUmVnMDMgPSAwOworCXU4CU1pc2NSZWcwMyA9IDA7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0aDsKIAogCXByX2luZm8oInVzYiAtLS0gZXVjcl9wcm9iZVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvdXNiLmggYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvdXNiLmgKaW5kZXggZDY2NWFmMS4uZTg5NGY4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3VzYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci91c2IuaApAQCAtNTIsMzQgKzUyLDM0IEBACiAjZGVmaW5lIEZESVJfUkVBRCAgICAgICAgIDEKIAogc3RydWN0IGtldWNyX3NkX3N0YXR1cyB7Ci0JQllURSAgICBJbnNlcnQ6MTsKLQlCWVRFICAgIFJlYWR5OjE7Ci0JQllURSAgICBNZWRpYUNoYW5nZToxOwotCUJZVEUgICAgSXNNTUM6MTsKLQlCWVRFICAgIEhpQ2FwYWNpdHk6MTsKLQlCWVRFICAgIEhpU3BlZWQ6MTsKLQlCWVRFICAgIFd0UDoxOwotCUJZVEUgICAgUmVzZXJ2ZWQ6MTsKKwl1OCAgICBJbnNlcnQ6MTsKKwl1OCAgICBSZWFkeToxOworCXU4ICAgIE1lZGlhQ2hhbmdlOjE7CisJdTggICAgSXNNTUM6MTsKKwl1OCAgICBIaUNhcGFjaXR5OjE7CisJdTggICAgSGlTcGVlZDoxOworCXU4ICAgIFd0UDoxOworCXU4ICAgIFJlc2VydmVkOjE7CiB9OwogCiBzdHJ1Y3Qga2V1Y3JfbXNfc3RhdHVzIHsKLQlCWVRFICAgIEluc2VydDoxOwotCUJZVEUgICAgUmVhZHk6MTsKLQlCWVRFICAgIE1lZGlhQ2hhbmdlOjE7Ci0JQllURSAgICBJc01TUHJvOjE7Ci0JQllURSAgICBJc01TUEhHOjE7Ci0JQllURSAgICBSZXNlcnZlZDE6MTsKLQlCWVRFICAgIFd0UDoxOwotCUJZVEUgICAgUmVzZXJ2ZWQyOjE7CisJdTggICAgSW5zZXJ0OjE7CisJdTggICAgUmVhZHk6MTsKKwl1OCAgICBNZWRpYUNoYW5nZToxOworCXU4ICAgIElzTVNQcm86MTsKKwl1OCAgICBJc01TUEhHOjE7CisJdTggICAgUmVzZXJ2ZWQxOjE7CisJdTggICAgV3RQOjE7CisJdTggICAgUmVzZXJ2ZWQyOjE7CiB9OwogCiBzdHJ1Y3Qga2V1Y3Jfc21fc3RhdHVzIHsKLQlCWVRFICAgIEluc2VydDoxOwotCUJZVEUgICAgUmVhZHk6MTsKLQlCWVRFICAgIE1lZGlhQ2hhbmdlOjE7Ci0JQllURSAgICBSZXNlcnZlZDozOwotCUJZVEUgICAgV3RQOjE7Ci0JQllURSAgICBJc01TOjE7CisJdTggICAgSW5zZXJ0OjE7CisJdTggICAgUmVhZHk6MTsKKwl1OCAgICBNZWRpYUNoYW5nZToxOworCXU4ICAgIFJlc2VydmVkOjM7CisJdTggICAgV3RQOjE7CisJdTggICAgSXNNUzoxOwogfTsKIAogLyogU0QgQmxvY2sgTGVuZ3RoICovCkBAIC0xODQsMzggKzE4NCwzOCBAQAogCiAJLyogLS0tLS0gU0QgQ29udHJvbCBEYXRhIC0tLS0tLS0tLS0tLS0tLS0gKi8KIAkvKiBTRF9SRUdJU1RFUiBTRF9SZWdzOyAqLwotCVdPUkQgICAgICAgIFNEX0Jsb2NrX011bHQ7Ci0JQllURSAgICAgICAgU0RfUkVBRF9CTF9MRU47Ci0JV09SRCAgICAgICAgU0RfQ19TSVpFOwotCUJZVEUgICAgICAgIFNEX0NfU0laRV9NVUxUOworCXUxNiAgICAgICAgU0RfQmxvY2tfTXVsdDsKKwl1OCAgICAgICAgU0RfUkVBRF9CTF9MRU47CisJdTE2ICAgICAgICBTRF9DX1NJWkU7CisJdTggICAgICAgIFNEX0NfU0laRV9NVUxUOwogCiAJLyogU0QvTU1DIE5ldyBzcGVjLiAqLwotCUJZVEUgICAgICAgIFNEX1NQRUNfVkVSOwotCUJZVEUgICAgICAgIFNEX0NTRF9WRVI7Ci0JQllURSAgICAgICAgU0QyMF9ISUdIX0NBUEFDSVRZOwotCURXT1JEICAgICAgIEhDX0NfU0laRTsKLQlCWVRFICAgICAgICBNTUNfU1BFQ19WRVI7Ci0JQllURSAgICAgICAgTU1DX0J1c1dpZHRoOwotCUJZVEUgICAgICAgIE1NQ19ISUdIX0NBUEFDSVRZOworCXU4ICAgICAgICBTRF9TUEVDX1ZFUjsKKwl1OCAgICAgICAgU0RfQ1NEX1ZFUjsKKwl1OCAgICAgICAgU0QyMF9ISUdIX0NBUEFDSVRZOworCXUzMiAgICAgICBIQ19DX1NJWkU7CisJdTggICAgICAgIE1NQ19TUEVDX1ZFUjsKKwl1OCAgICAgICAgTU1DX0J1c1dpZHRoOworCXU4ICAgICAgICBNTUNfSElHSF9DQVBBQ0lUWTsKIAogCS8qIC0tLS0tIE1TIENvbnRyb2wgRGF0YSAtLS0tLS0tLS0tLS0tLS0tICovCi0JQk9PTEVBTiAgICAgICAgICAgICBNU19TV1dQOwotCURXT1JEICAgICAgICAgICAgICAgTVNQX1RvdGFsQmxvY2s7CisJYm9vbCAgICAgICAgICAgICBNU19TV1dQOworCXUzMiAgICAgICAgICAgICAgIE1TUF9Ub3RhbEJsb2NrOwogCS8qIE1TX0xpYkNvbnRyb2wgICAgICAgTVNfTGliOyAqLwotCUJPT0xFQU4gICAgICAgICAgICAgTVNfSXNSV1BhZ2U7Ci0JV09SRCAgICAgICAgICAgICAgICBNU19Nb2RlbDsKKwlib29sICAgICAgICAgICAgIE1TX0lzUldQYWdlOworCXUxNiAgICAgICAgICAgICAgICBNU19Nb2RlbDsKIAogCS8qIC0tLS0tIFNNIENvbnRyb2wgRGF0YSAtLS0tLS0tLS0tLS0tLS0tICovCi0JQllURQkJU01fRGV2aWNlSUQ7Ci0JQllURQkJU01fQ2FyZElEOworCXU4CQlTTV9EZXZpY2VJRDsKKwl1OAkJU01fQ2FyZElEOwogCi0JUEJZVEUJCXRlc3RidWY7Ci0JQllURQkJQklOX0ZMQUc7Ci0JRFdPUkQJCWJsX251bTsKKwl1OCAqdGVzdGJ1ZjsKKwl1OAkJQklOX0ZMQUc7CisJdTMyCQlibF9udW07CiAJaW50CQlTcmJTdGF0dXM7CiAKIAkvKiAtLS0tLS1Qb3dlciBNYW5hZ2VybWVudCAtLS0tLS0tLS0tLS0tLS0gKi8KLQlCT09MRUFOICAgICAgICAgUG93ZXJfSXNSZXN1bTsKKwlib29sICAgICAgICAgUG93ZXJfSXNSZXN1bTsKIH07CiAKIC8qIENvbnZlcnQgYmV0d2VlbiB1c19kYXRhIGFuZCB0aGUgY29ycmVzcG9uZGluZyBTY3NpX0hvc3QgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9hdWRpby5jIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2F1ZGlvLmMKaW5kZXggYTkyZTIxZi4uMTcxZDgwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2F1ZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2F1ZGlvLmMKQEAgLTI0LDggKzI0LDkgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKLQkJCSAgICAgIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KGxpbmU2LT5pZmNkZXYsCisJCQkgICBTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKKwkJCSAgIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9jYXB0dXJlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvY2FwdHVyZS5jCmluZGV4IGY4MzE2YjcuLjBlZGE1MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9jYXB0dXJlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2NhcHR1cmUuYwpAQCAtMTU3LDYgKzE1Nyw3IEBACiAJCSAgIGNvcHkgdHdvIHNlcGFyYXRlIGNodW5rcy4KIAkJICovCiAJCWludCBsZW47CisKIAkJbGVuID0gcnVudGltZS0+YnVmZmVyX3NpemUgLSBsaW5lNnBjbS0+cG9zX2luX2RvbmU7CiAKIAkJaWYgKGxlbiA+IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9kcml2ZXIuYwppbmRleCA3YTZkODVlLi43N2YxYjQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvZHJpdmVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2RyaXZlci5jCkBAIC01NywyOCArNTcsMzIgQEAKIAogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGxpbmU2X2lkX3RhYmxlKTsKIAorI2RlZmluZSBMNlBST1AoZGV2X2JpdCwgZGV2X2lkLCBkZXZfbmFtZSwgZGV2X2NhcClcCisJey5kZXZpY2VfYml0ID0gTElORTZfQklUXyMjZGV2X2JpdCwgLmlkID0gZGV2X2lkLFwKKwkgLm5hbWUgPSBkZXZfbmFtZSwgLmNhcGFiaWxpdGllcyA9IExJTkU2X0JJVF8jI2Rldl9jYXB9CisKIC8qICpJTkRFTlQtT0ZGKiAqLwotc3RhdGljIHN0cnVjdCBsaW5lNl9wcm9wZXJ0aWVzIGxpbmU2X3Byb3BlcnRpZXNfdGFibGVbXSA9IHsKLQl7IExJTkU2X0JJVF9CQVNTUE9EWFQsICAgICAiQmFzc1BPRHh0IiwgICAgICJCYXNzUE9EeHQiLCAgICAgICAgTElORTZfQklUX0NPTlRST0xfUENNX0hXTU9OIH0sCi0JeyBMSU5FNl9CSVRfQkFTU1BPRFhUTElWRSwgIkJhc3NQT0R4dExpdmUiLCAiQmFzc1BPRHh0IExpdmUiLCAgIExJTkU2X0JJVF9DT05UUk9MX1BDTV9IV01PTiB9LAotCXsgTElORTZfQklUX0JBU1NQT0RYVFBSTywgICJCYXNzUE9EeHRQcm8iLCAgIkJhc3NQT0R4dCBQcm8iLCAgICBMSU5FNl9CSVRfQ09OVFJPTF9QQ01fSFdNT04gfSwKLQl7IExJTkU2X0JJVF9HVUlUQVJQT1JULCAgICAiR3VpdGFyUG9ydCIsICAgICJHdWl0YXJQb3J0IiwgICAgICAgTElORTZfQklUX1BDTSAgICAgICAgICAgICAgIH0sCi0JeyBMSU5FNl9CSVRfUE9DS0VUUE9ELCAgICAgIlBvY2tldFBPRCIsICAgICAiUG9ja2V0IFBPRCIsICAgICAgIExJTkU2X0JJVF9DT05UUk9MICAgICAgICAgICB9LAotCXsgTElORTZfQklUX1BPREhEMzAwLCAgICAgICJQT0RIRDMwMCIsICAgICAgIlBPRCBIRDMwMCIsICAgICAgICBMSU5FNl9CSVRfQ09OVFJPTF9QQ01fSFdNT04gfSwKLQl7IExJTkU2X0JJVF9QT0RIRDQwMCwgICAgICAiUE9ESEQ0MDAiLCAgICAgICJQT0QgSEQ0MDAiLCAgICAgICAgTElORTZfQklUX0NPTlRST0xfUENNX0hXTU9OIH0sCi0JeyBMSU5FNl9CSVRfUE9ESEQ1MDAsICAgICAgIlBPREhENTAwIiwgICAgICAiUE9EIEhENTAwIiwgICAgICAgIExJTkU2X0JJVF9DT05UUk9MX1BDTV9IV01PTiB9LAotCXsgTElORTZfQklUX1BPRFNUVURJT19HWCwgICJQT0RTdHVkaW9HWCIsICAgIlBPRCBTdHVkaW8gR1giLCAgICBMSU5FNl9CSVRfUENNICAgICAgICAgICAgICAgfSwKLQl7IExJTkU2X0JJVF9QT0RTVFVESU9fVVgxLCAiUE9EU3R1ZGlvVVgxIiwgICJQT0QgU3R1ZGlvIFVYMSIsICAgTElORTZfQklUX1BDTSAgICAgICAgICAgICAgIH0sCi0JeyBMSU5FNl9CSVRfUE9EU1RVRElPX1VYMiwgIlBPRFN0dWRpb1VYMiIsICAiUE9EIFN0dWRpbyBVWDIiLCAgIExJTkU2X0JJVF9QQ00gICAgICAgICAgICAgICB9LAotCXsgTElORTZfQklUX1BPRFgzLCAgICAgICAgICJQT0RYMyIsICAgICAgICAgIlBPRCBYMyIsICAgICAgICAgICBMSU5FNl9CSVRfUENNICAgICAgICAgICAgICAgfSwKLQl7IExJTkU2X0JJVF9QT0RYM0xJVkUsICAgICAiUE9EWDNMaXZlIiwgICAgICJQT0QgWDMgTGl2ZSIsICAgICAgTElORTZfQklUX1BDTSAgICAgICAgICAgICAgIH0sCi0JeyBMSU5FNl9CSVRfUE9EWFQsICAgICAgICAgIlBPRHh0IiwgICAgICAgICAiUE9EeHQiLCAgICAgICAgICAgIExJTkU2X0JJVF9DT05UUk9MX1BDTV9IV01PTiB9LAotCXsgTElORTZfQklUX1BPRFhUTElWRSwgICAgICJQT0R4dExpdmUiLCAgICAgIlBPRHh0IExpdmUiLCAgICAgICBMSU5FNl9CSVRfQ09OVFJPTF9QQ01fSFdNT04gfSwKLQl7IExJTkU2X0JJVF9QT0RYVFBSTywgICAgICAiUE9EeHRQcm8iLCAgICAgICJQT0R4dCBQcm8iLCAgICAgICAgTElORTZfQklUX0NPTlRST0xfUENNX0hXTU9OIH0sCi0JeyBMSU5FNl9CSVRfVE9ORVBPUlRfR1gsICAgIlRvbmVQb3J0R1giLCAgICAiVG9uZVBvcnQgR1giLCAgICAgIExJTkU2X0JJVF9QQ00gICAgICAgICAgICAgICB9LAotCXsgTElORTZfQklUX1RPTkVQT1JUX1VYMSwgICJUb25lUG9ydFVYMSIsICAgIlRvbmVQb3J0IFVYMSIsICAgICBMSU5FNl9CSVRfUENNICAgICAgICAgICAgICAgfSwKLQl7IExJTkU2X0JJVF9UT05FUE9SVF9VWDIsICAiVG9uZVBvcnRVWDIiLCAgICJUb25lUG9ydCBVWDIiLCAgICAgTElORTZfQklUX1BDTSAgICAgICAgICAgICAgIH0sCi0JeyBMSU5FNl9CSVRfVkFSSUFYLCAgICAgICAgIlZhcmlheCIsICAgICAgICAiVmFyaWF4IFdvcmtiZW5jaCIsIExJTkU2X0JJVF9DT05UUk9MICAgICAgICAgICB9LAorc3RhdGljIGNvbnN0IHN0cnVjdCBsaW5lNl9wcm9wZXJ0aWVzIGxpbmU2X3Byb3BlcnRpZXNfdGFibGVbXSA9IHsKKwlMNlBST1AoQkFTU1BPRFhULCAgICAgIkJhc3NQT0R4dCIsICAgICAiQmFzc1BPRHh0IiwgICAgICAgIENUUkxfUENNX0hXKSwKKwlMNlBST1AoQkFTU1BPRFhUTElWRSwgIkJhc3NQT0R4dExpdmUiLCAiQmFzc1BPRHh0IExpdmUiLCAgIENUUkxfUENNX0hXKSwKKwlMNlBST1AoQkFTU1BPRFhUUFJPLCAgIkJhc3NQT0R4dFBybyIsICAiQmFzc1BPRHh0IFBybyIsICAgIENUUkxfUENNX0hXKSwKKwlMNlBST1AoR1VJVEFSUE9SVCwgICAgIkd1aXRhclBvcnQiLCAgICAiR3VpdGFyUG9ydCIsICAgICAgIFBDTSksCisJTDZQUk9QKFBPQ0tFVFBPRCwgICAgICJQb2NrZXRQT0QiLCAgICAgIlBvY2tldCBQT0QiLCAgICAgICBDT05UUk9MKSwKKwlMNlBST1AoUE9ESEQzMDAsICAgICAgIlBPREhEMzAwIiwgICAgICAiUE9EIEhEMzAwIiwgICAgICAgIENUUkxfUENNX0hXKSwKKwlMNlBST1AoUE9ESEQ0MDAsICAgICAgIlBPREhENDAwIiwgICAgICAiUE9EIEhENDAwIiwgICAgICAgIENUUkxfUENNX0hXKSwKKwlMNlBST1AoUE9ESEQ1MDAsICAgICAgIlBPREhENTAwIiwgICAgICAiUE9EIEhENTAwIiwgICAgICAgIENUUkxfUENNX0hXKSwKKwlMNlBST1AoUE9EU1RVRElPX0dYLCAgIlBPRFN0dWRpb0dYIiwgICAiUE9EIFN0dWRpbyBHWCIsICAgIFBDTSksCisJTDZQUk9QKFBPRFNUVURJT19VWDEsICJQT0RTdHVkaW9VWDEiLCAgIlBPRCBTdHVkaW8gVVgxIiwgICBQQ00pLAorCUw2UFJPUChQT0RTVFVESU9fVVgyLCAiUE9EU3R1ZGlvVVgyIiwgICJQT0QgU3R1ZGlvIFVYMiIsICAgUENNKSwKKwlMNlBST1AoUE9EWDMsICAgICAgICAgIlBPRFgzIiwgICAgICAgICAiUE9EIFgzIiwgICAgICAgICAgIFBDTSksCisJTDZQUk9QKFBPRFgzTElWRSwgICAgICJQT0RYM0xpdmUiLCAgICAgIlBPRCBYMyBMaXZlIiwgICAgICBQQ00pLAorCUw2UFJPUChQT0RYVCwgICAgICAgICAiUE9EeHQiLCAgICAgICAgICJQT0R4dCIsICAgICAgICAgICAgQ1RSTF9QQ01fSFcpLAorCUw2UFJPUChQT0RYVExJVkUsICAgICAiUE9EeHRMaXZlIiwgICAgICJQT0R4dCBMaXZlIiwgICAgICAgQ1RSTF9QQ01fSFcpLAorCUw2UFJPUChQT0RYVFBSTywgICAgICAiUE9EeHRQcm8iLCAgICAgICJQT0R4dCBQcm8iLCAgICAgICAgQ1RSTF9QQ01fSFcpLAorCUw2UFJPUChUT05FUE9SVF9HWCwgICAiVG9uZVBvcnRHWCIsICAgICJUb25lUG9ydCBHWCIsICAgICAgUENNKSwKKwlMNlBST1AoVE9ORVBPUlRfVVgxLCAgIlRvbmVQb3J0VVgxIiwgICAiVG9uZVBvcnQgVVgxIiwgICAgIFBDTSksCisJTDZQUk9QKFRPTkVQT1JUX1VYMiwgICJUb25lUG9ydFVYMiIsICAgIlRvbmVQb3J0IFVYMiIsICAgICBQQ00pLAorCUw2UFJPUChWQVJJQVgsICAgICAgICAiVmFyaWF4IiwgICAgICAgICJWYXJpYXggV29ya2JlbmNoIiwgQ09OVFJPTCksCiB9OwogLyogKklOREVOVC1PTiogKi8KIApAQCAtMTUyLDEwICsxNTYsMTAgQEAKIAkJaW50IHJldHZhbDsKIAogCQlyZXR2YWwgPSB1c2JfaW50ZXJydXB0X21zZyhsaW5lNi0+dXNiZGV2LAotCQkJCQkgICB1c2Jfc25kaW50cGlwZShsaW5lNi0+dXNiZGV2LAotCQkJCQkJCSAgbGluZTYtPmVwX2NvbnRyb2xfd3JpdGUpLAotCQkJCQkgICAoY2hhciAqKWZyYWdfYnVmLCBmcmFnX3NpemUsCi0JCQkJCSAgICZwYXJ0aWFsLCBMSU5FNl9USU1FT1VUICogSFopOworCQkJCQl1c2Jfc25kaW50cGlwZShsaW5lNi0+dXNiZGV2LAorCQkJCQkJbGluZTYtPmVwX2NvbnRyb2xfd3JpdGUpLAorCQkJCQkoY2hhciAqKWZyYWdfYnVmLCBmcmFnX3NpemUsCisJCQkJCSZwYXJ0aWFsLCBMSU5FNl9USU1FT1VUICogSFopOwogCiAJCWlmIChyZXR2YWwpIHsKIAkJCWRldl9lcnIobGluZTYtPmlmY2RldiwKQEAgLTIxNyw3ICsyMjEsNyBAQAogCVNldHVwIGFuZCBzdGFydCB0aW1lci4KICovCiB2b2lkIGxpbmU2X3N0YXJ0X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgdW5zaWduZWQgaW50IG1zZWNzLAotCQkgICAgICAgdm9pZCAoKmZ1bmN0aW9uKSAodW5zaWduZWQgbG9uZyksIHVuc2lnbmVkIGxvbmcgZGF0YSkKKwkJICAgICAgIHZvaWQgKCpmdW5jdGlvbikodW5zaWduZWQgbG9uZyksIHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzZXR1cF90aW1lcih0aW1lciwgZnVuY3Rpb24sIGRhdGEpOwogCXRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIG1zZWNzICogSFogLyAxMDAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2RyaXZlci5oIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2RyaXZlci5oCmluZGV4IDM0YWU5NWUuLjE2ZTNmYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9kcml2ZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvZHJpdmVyLmgKQEAgLTIwNCw3ICsyMDQsNyBAQAogZXh0ZXJuIHNzaXplX3QgbGluZTZfc2V0X3JhdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CiBleHRlcm4gdm9pZCBsaW5lNl9zdGFydF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIsIHVuc2lnbmVkIGludCBtc2VjcywKLQkJCSAgICAgIHZvaWQgKCpmdW5jdGlvbikgKHVuc2lnbmVkIGxvbmcpLAorCQkJICAgICAgdm9pZCAoKmZ1bmN0aW9uKSh1bnNpZ25lZCBsb25nKSwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZGF0YSk7CiBleHRlcm4gaW50IGxpbmU2X3RyYW5zbWl0X3BhcmFtZXRlcihzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiwgaW50IHBhcmFtLAogCQkJCSAgICB1OCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvbWlkaS5jIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L21pZGkuYwppbmRleCAzZjZkNzhjLi4wMjM0NWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvbWlkaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9taWRpLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAlzdHJ1Y3Qgc25kX2xpbmU2X21pZGkgKmxpbmU2bWlkaSA9IGxpbmU2LT5saW5lNm1pZGk7CiAJc3RydWN0IG1pZGlfYnVmZmVyICptYiA9ICZsaW5lNm1pZGktPm1pZGlidWZfb3V0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgY2hhciBjaHVua1tsaW5lNi0+bWF4X3BhY2tldF9zaXplXTsKKwl1bnNpZ25lZCBjaGFyIGNodW5rW0xJTkU2X0ZBTExCQUNLX01BWFBBQ0tFVFNJWkVdOwogCWludCByZXEsIGRvbmU7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbGluZTYtPmxpbmU2bWlkaS0+bWlkaV90cmFuc21pdF9sb2NrLCBmbGFncyk7CkBAIC02NCw3ICs2NCw4IEBACiAJfQogCiAJZm9yICg7OykgewotCQlkb25lID0gbGluZTZfbWlkaWJ1Zl9yZWFkKG1iLCBjaHVuaywgbGluZTYtPm1heF9wYWNrZXRfc2l6ZSk7CisJCWRvbmUgPSBsaW5lNl9taWRpYnVmX3JlYWQobWIsIGNodW5rLAorCQkJCQkgIExJTkU2X0ZBTExCQUNLX01BWFBBQ0tFVFNJWkUpOwogCiAJCWlmIChkb25lID09IDApCiAJCQlicmVhazsKQEAgLTMwNyw4ICszMDgsNiBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0Jc25kX2NhcmRfc2V0X2RldihsaW5lNi0+Y2FyZCwgbGluZTYtPmlmY2Rldik7Ci0KIAllcnIgPSBzbmRfbGluZTZfbmV3X21pZGkobGluZTZtaWRpKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wY20uYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wY20uYwppbmRleCBkZjgzMzFiLi42NjEwODBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcGNtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3BjbS5jCkBAIC01MDEsOCArNTAxLDYgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXNuZF9jYXJkX3NldF9kZXYobGluZTYtPmNhcmQsIGxpbmU2LT5pZmNkZXYpOwotCiAJZXJyID0gc25kX2xpbmU2X25ld19wY20obGluZTZwY20pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3VzYmRlZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi91c2JkZWZzLmgKaW5kZXggOTBjYWRkZC4uMmQxY2M0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3VzYmRlZnMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvdXNiZGVmcy5oCkBAIC05MSw5ICs5MSw5IEBACiAJTElORTZfQklUU19QT0RYVEFMTCA9IExJTkU2X0JJVF9QT0RYVCB8IExJTkU2X0JJVF9QT0RYVExJVkUgfAogCQkJICAgICAgTElORTZfQklUX1BPRFhUUFJPLAogCUxJTkU2X0JJVFNfUE9EWDNBTEwgPSBMSU5FNl9CSVRfUE9EWDMgfCBMSU5FNl9CSVRfUE9EWDNMSVZFLAotCUxJTkU2X0JJVFNfUE9ESERBTEwgPSAJTElORTZfQklUX1BPREhEMzAwIHwKLQkJCQlMSU5FNl9CSVRfUE9ESEQ0MDAgfAotCQkJCUxJTkU2X0JJVF9QT0RIRDUwMCwKKwlMSU5FNl9CSVRTX1BPREhEQUxMID0gTElORTZfQklUX1BPREhEMzAwIHwKKwkJCSAgICAgIExJTkU2X0JJVF9QT0RIRDQwMCB8CisJCQkgICAgICBMSU5FNl9CSVRfUE9ESEQ1MDAsCiAJTElORTZfQklUU19CQVNTUE9EWFRBTEwJPSBMSU5FNl9CSVRfQkFTU1BPRFhUIHwKIAkJCQkgIExJTkU2X0JJVF9CQVNTUE9EWFRMSVZFIHwKIAkJCQkgIExJTkU2X0JJVF9CQVNTUE9EWFRQUk8KQEAgLTEwNiw3ICsxMDYsNyBAQAogLyogZGV2aWNlIHN1cHBvcnQgaGFyZHdhcmUgbW9uaXRvcmluZyAqLwogI2RlZmluZSBMSU5FNl9CSVRfSFdNT04gKDEgPDwgMikKIAotI2RlZmluZSBMSU5FNl9CSVRfQ09OVFJPTF9QQ01fSFdNT04JKExJTkU2X0JJVF9DT05UUk9MIHwJXAorI2RlZmluZSBMSU5FNl9CSVRfQ1RSTF9QQ01fSFcJKExJTkU2X0JJVF9DT05UUk9MIHwJXAogCQkJCQkgTElORTZfQklUX1BDTSB8CVwKIAkJCQkJIExJTkU2X0JJVF9IV01PTikKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9jdXJwcm9jLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2N1cnByb2MuaAppbmRleCA1MDdkMTZiLi44ZmQ0N2M5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2N1cnByb2MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2N1cnByb2MuaApAQCAtNDQsMTMgKzQ0LDYgQEAKICNkZWZpbmUgX19MSUJDRlNfQ1VSUFJPQ19IX18KIAogLyoKLSAqIFBvcnRhYmxlIEFQSSB0byBhY2Nlc3MgY29tbW9uIGNoYXJhY3RlcmlzdGljcyBvZiAiY3VycmVudCIgVU5JWCBwcm9jZXNzLgotICoKLSAqIEltcGxlbWVudGVkIGluIHBvcnRhbHMvaW5jbHVkZS9saWJjZnMvPG9zPi8KLSAqLwotaW50ICAgIGNmc19jdXJwcm9jX2dyb3Vwc19ucih2b2lkKTsKLQotLyoKICAqIFBsdXMsIHBsYXRmb3JtLXNwZWNpZmljIGNvbnN0YW50CiAgKgogICogQ0ZTX0NVUlBST0NfQ09NTV9NQVgsCkBAIC05MSw4ICs4NCw2IEBACiB2b2lkIGNmc19jYXBfbG93ZXIoY2ZzX2NhcF90IGNhcCk7CiBpbnQgY2ZzX2NhcF9yYWlzZWQoY2ZzX2NhcF90IGNhcCk7CiBjZnNfY2FwX3QgY2ZzX2N1cnByb2NfY2FwX3BhY2sodm9pZCk7Ci12b2lkIGNmc19jdXJwcm9jX2NhcF91bnBhY2soY2ZzX2NhcF90IGNhcCk7Ci1pbnQgY2ZzX2NhcGFibGUoY2ZzX2NhcF90IGNhcCk7CiAKIC8qIF9fTElCQ0ZTX0NVUlBST0NfSF9fICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2hhc2guaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2hhc2guaAppbmRleCA5ZDVlZTFhLi5lNWQ1ZGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19oYXNoLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfaGFzaC5oCkBAIC02NSw4ICs2NSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CiAKLSNkZWZpbmUgY2ZzX2hhc2hfbG9uZyh2YWwsIGJpdHMpICAgIGhhc2hfbG9uZyh2YWwsIGJpdHMpCi0KIC8qKiBkaXNhYmxlIGRlYnVnICovCiAjZGVmaW5lIENGU19IQVNIX0RFQlVHX05PTkUJIDAKIC8qKiByZWNvcmQgaGFzaCBkZXB0aCBhbmQgb3V0cHV0IHRvIGNvbnNvbGUgd2hlbiBpdCdzIHRvbyBkZWVwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfaW9jdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2lvY3RsLmgKaW5kZXggNzRkZGE1Ny4uNDliYTYyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfaW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19pb2N0bC5oCkBAIC0yMTEsMTAgKzIxMSwxMCBAQAogfQogCiAKLWV4dGVybiBpbnQgbGliY2ZzX3JlZ2lzdGVyX2lvY3RsKHN0cnVjdCBsaWJjZnNfaW9jdGxfaGFuZGxlciAqaGFuZCk7Ci1leHRlcm4gaW50IGxpYmNmc19kZXJlZ2lzdGVyX2lvY3RsKHN0cnVjdCBsaWJjZnNfaW9jdGxfaGFuZGxlciAqaGFuZCk7Ci1leHRlcm4gaW50IGxpYmNmc19pb2N0bF9nZXRkYXRhKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCB2b2lkICphcmcpOwotZXh0ZXJuIGludCBsaWJjZnNfaW9jdGxfcG9wZGF0YSh2b2lkICphcmcsIHZvaWQgKmJ1ZiwgaW50IHNpemUpOworaW50IGxpYmNmc19yZWdpc3Rlcl9pb2N0bChzdHJ1Y3QgbGliY2ZzX2lvY3RsX2hhbmRsZXIgKmhhbmQpOworaW50IGxpYmNmc19kZXJlZ2lzdGVyX2lvY3RsKHN0cnVjdCBsaWJjZnNfaW9jdGxfaGFuZGxlciAqaGFuZCk7CitpbnQgbGliY2ZzX2lvY3RsX2dldGRhdGEoY2hhciAqYnVmLCBjaGFyICplbmQsIHZvaWQgKmFyZyk7CitpbnQgbGliY2ZzX2lvY3RsX3BvcGRhdGEodm9pZCAqYXJnLCB2b2lkICpidWYsIGludCBzaXplKTsKIAogCiAjZW5kaWYgLyogX19MSUJDRlNfSU9DVExfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19wcmltLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19wcmltLmgKaW5kZXggZTZlNDE3YS4uN2NmMzRhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfcHJpbS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX3ByaW0uaApAQCAtNDEsMTkgKzQxLDEwIEBACiAjZGVmaW5lIF9fTElCQ0ZTX1BSSU1fSF9fCiAKIC8qCi0gKiBTY2hlZHVsZQotICovCi12b2lkIGNmc19wYXVzZShjZnNfZHVyYXRpb25fdCB0aWNrcyk7Ci0KLS8qCiAgKiBUaW1lcgogICovCiB0eXBlZGVmICB2b2lkIChjZnNfdGltZXJfZnVuY190KSh1bG9uZ19wdHJfdCk7Ci12b2lkIHNjaGVkdWxlX3RpbWVvdXRfYW5kX3NldF9zdGF0ZShsb25nLCBpbnQ2NF90KTsKIAotdm9pZCBpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KHdhaXRfcXVldWVfdCAqbGluayk7Ci1pbnQ2NF90IHdhaXRxX3RpbWVkd2FpdCh3YWl0X3F1ZXVlX3QgKiwgbG9uZywgaW50NjRfdCk7Ci12b2lkIHdhaXRxX3dhaXQod2FpdF9xdWV1ZV90ICosIGxvbmcpOwogdm9pZCBhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmVfaGVhZCh3YWl0X3F1ZXVlX2hlYWRfdCAqLCB3YWl0X3F1ZXVlX3QgKik7CiAKIHZvaWQgY2ZzX2luaXRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfc3RyaW5nLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19zdHJpbmcuaAppbmRleCBhNmJhYzljLi41MDlkYzFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19zdHJpbmcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19zdHJpbmcuaApAQCAtNDksMTggKzQ5LDYgQEAKIC8qIENvbnZlcnQgYSB0ZXh0IHN0cmluZyB0byBhIGJpdG1hc2sgKi8KIGludCBjZnNfc3RyMm1hc2soY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICooKmJpdDJzdHIpKGludCBiaXQpLAogCQkgaW50ICpvbGRtYXNrLCBpbnQgbWlubWFzaywgaW50IGFsbG1hc2spOwotCi0vKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYW5kIGNvcHkgYW4gZXhpc3Rpbmcgc3RyaW5nLgotICogTXVzdCBmcmVlIHdpdGgga2ZyZWUoKS4KLSAqLwotY2hhciAqY2ZzX3N0cmR1cChjb25zdCBjaGFyICpzdHIsIHVfaW50MzJfdCBmbGFncyk7Ci0KLS8qIHNhZmUgdnNucHJpbnRmICovCi1pbnQgY2ZzX3ZzbnByaW50ZihjaGFyICpidWYsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncyk7Ci0KLS8qIHNhZmUgc25wcmludGYgKi8KLWludCBjZnNfc25wcmludGYoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCAuLi4pOwotCiAvKiB0cmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlIGNoYXJhY3RlcnMgKi8KIGNoYXIgKmNmc19maXJzdHN0cihjaGFyICpzdHIsIHNpemVfdCBzaXplKTsKIApAQCAtOTAsMjcgKzc4LDEwIEBACiAJc3RydWN0IGxpc3RfaGVhZAllbF9leHByczsKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1jZnNfaXN3aGl0ZShjaGFyIGMpCi17Ci0Jc3dpdGNoIChjKSB7Ci0JY2FzZSAnICc6Ci0JY2FzZSAnXHQnOgotCWNhc2UgJ1xuJzoKLQljYXNlICdccic6Ci0JCXJldHVybiAxOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQogY2hhciAqY2ZzX3RyaW13aGl0ZShjaGFyICpzdHIpOwogaW50IGNmc19nZXR0b2soc3RydWN0IGNmc19sc3RyICpuZXh0LCBjaGFyIGRlbGltLCBzdHJ1Y3QgY2ZzX2xzdHIgKnJlcyk7CiBpbnQgY2ZzX3N0cjJudW1fY2hlY2soY2hhciAqc3RyLCBpbnQgbm9iLCB1bnNpZ25lZCAqbnVtLAogCQkgICAgICB1bnNpZ25lZCBtaW4sIHVuc2lnbmVkIG1heCk7Ci1pbnQgY2ZzX3JhbmdlX2V4cHJfcGFyc2Uoc3RydWN0IGNmc19sc3RyICpzcmMsIHVuc2lnbmVkIG1pbiwgdW5zaWduZWQgbWF4LAotCQkJIGludCBzaW5nbGVfdG9rLCBzdHJ1Y3QgY2ZzX3JhbmdlX2V4cHIgKipleHByKTsKIGludCBjZnNfZXhwcl9saXN0X21hdGNoKF9fdTMyIHZhbHVlLCBzdHJ1Y3QgY2ZzX2V4cHJfbGlzdCAqZXhwcl9saXN0KTsKIGludCBjZnNfZXhwcl9saXN0X3ZhbHVlcyhzdHJ1Y3QgY2ZzX2V4cHJfbGlzdCAqZXhwcl9saXN0LAogCQkJIGludCBtYXgsIF9fdTMyICoqdmFsdWVzKTsKQEAgLTEyNCw3ICs5NSw2IEBACiB9CiAKIHZvaWQgY2ZzX2V4cHJfbGlzdF9mcmVlKHN0cnVjdCBjZnNfZXhwcl9saXN0ICpleHByX2xpc3QpOwotdm9pZCBjZnNfZXhwcl9saXN0X3ByaW50KHN0cnVjdCBjZnNfZXhwcl9saXN0ICpleHByX2xpc3QpOwogaW50IGNmc19leHByX2xpc3RfcGFyc2UoY2hhciAqc3RyLCBpbnQgbGVuLCB1bnNpZ25lZCBtaW4sIHVuc2lnbmVkIG1heCwKIAkJCXN0cnVjdCBjZnNfZXhwcl9saXN0ICoqZWxwcCk7CiB2b2lkIGNmc19leHByX2xpc3RfZnJlZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLWxuZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9sbmV0L2xpYi1sbmV0LmgKaW5kZXggM2FjMmJiNS4uODU2ZmNmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLWxuZXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbG5ldC9saWItbG5ldC5oCkBAIC02MjgsNyArNjI4LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBsbmV0X25pZDJwZWVyaGFzaChsbmV0X25pZF90IG5pZCkKIHsKLQlyZXR1cm4gY2ZzX2hhc2hfbG9uZyhuaWQsIExORVRfUEVFUl9IQVNIX0JJVFMpOworCXJldHVybiBoYXNoX2xvbmcobmlkLCBMTkVUX1BFRVJfSEFTSF9CSVRTKTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbGlzdF9oZWFkICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9sbmV0L2xpYi10eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLXR5cGVzLmgKaW5kZXggZGQ4ZWRjZi4uMWMxM2VmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLXR5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLXR5cGVzLmgKQEAgLTI4MiwxNiArMjgyLDE0IEBACiAjZGVmaW5lIExORVRfTURfRkxBR19BVVRPX1VOTElOSyAgICAgICgxIDw8IDEpCiAKICNpZmRlZiBMTkVUX1VTRV9MSUJfRlJFRUxJU1QKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAJdm9pZAkJICAqZmxfb2JqczsJICAvKiBzaW5nbGUgY29udGlndW91cyBhcnJheSBvZiBvYmplY3RzICovCiAJaW50CQkgICAgZmxfbm9ianM7CSAvKiB0aGUgbnVtYmVyIG9mIHRoZW0gKi8KIAlpbnQJCSAgICBmbF9vYmpzaXplOyAgICAgICAvKiB0aGUgc2l6ZSAoaW5jbHVkaW5nIG92ZXJoZWFkKSBvZiBlYWNoIG9mIHRoZW0gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgZmxfbGlzdDsJICAvKiB3aGVyZSB0aGV5IGFyZSBlbnF1ZXVlZCAqLwogfSBsbmV0X2ZyZWVsaXN0X3Q7CiAKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAJc3RydWN0IGxpc3RfaGVhZAkgICAgIGZvX2xpc3Q7CSAgICAgLyogZW5xdWV1ZSBvbiBmbF9saXN0ICovCiAJdm9pZAkJICAqZm9fY29udGVudHM7CSAvKiBhbGlnbmVkIGNvbnRlbnRzICovCiB9IGxuZXRfZnJlZW9ial90OwpAQCAtMzEyLDggKzMxMCw3IEBACiAKIHN0cnVjdCBsbmV0X25pOwkJCQkgIC8qIGZvcndhcmQgcmVmICovCiAKLXR5cGVkZWYgc3RydWN0IGxuZXRfbG5kCi17Cit0eXBlZGVmIHN0cnVjdCBsbmV0X2xuZCB7CiAJLyogZmllbGRzIG1hbmFnZWQgYnkgcG9ydGFscyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJICAgIGxuZF9saXN0OwkgICAgIC8qIHN0YXNoIGluIHRoZSBMTkQgdGFibGUgKi8KIAlpbnQJCSAgIGxuZF9yZWZjb3VudDsJIC8qICMgYWN0aXZlIGluc3RhbmNlcyAqLwpAQCAtMzIxLDggKzMxOCw4IEBACiAJLyogZmllbGRzIGluaXRpYWxpc2VkIGJ5IHRoZSBMTkQgKi8KIAl1bnNpZ25lZCBpbnQJICBsbmRfdHlwZTsKIAotCWludCAgKCpsbmRfc3RhcnR1cCkgKHN0cnVjdCBsbmV0X25pICpuaSk7Ci0Jdm9pZCAoKmxuZF9zaHV0ZG93bikgKHN0cnVjdCBsbmV0X25pICpuaSk7CisJaW50ICAoKmxuZF9zdGFydHVwKShzdHJ1Y3QgbG5ldF9uaSAqbmkpOworCXZvaWQgKCpsbmRfc2h1dGRvd24pKHN0cnVjdCBsbmV0X25pICpuaSk7CiAJaW50ICAoKmxuZF9jdGwpKHN0cnVjdCBsbmV0X25pICpuaSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKIAogCS8qIEluIGRhdGEgbW92ZW1lbnQgQVBJcyBiZWxvdywgcGF5bG9hZCBidWZmZXJzIGFyZSBkZXNjcmliZWQgYXMgYSBzZXQKQEAgLTY2OCw4ICs2NjUsNyBAQAogI2RlZmluZSBMTkVUX1JDX1NUQVRFX1JVTk5JTkcJCTEJLyogc3RhcnRlZCB1cCBPSyAqLwogI2RlZmluZSBMTkVUX1JDX1NUQVRFX1NUT1BQSU5HCQkyCS8qIHRlbGxpbmcgdGhyZWFkIHRvIHN0b3AgKi8KIAotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKIAkvKiBDUFUgcGFydGl0aW9uIHRhYmxlIG9mIExOZXQgKi8KIAlzdHJ1Y3QgY2ZzX2NwdF90YWJsZQkJKmxuX2NwdF90YWJsZTsKIAkvKiBudW1iZXIgb2YgQ1BUcyBpbiBsbl9jcHRfdGFibGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmQuYwppbmRleCA2NDRhMDAwLi4wMDYxYzhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZC5jCkBAIC00MSw3ICs0MSw3IEBACiAjaW5jbHVkZSAibzJpYmxuZC5oIgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogCi1sbmRfdCB0aGVfbzJpYmxuZCA9IHsKK3N0YXRpYyBsbmRfdCB0aGVfbzJpYmxuZCA9IHsKIAkubG5kX3R5cGUgICAgICAgPSBPMklCTE5ELAogCS5sbmRfc3RhcnR1cCAgICA9IGtpYmxuZF9zdGFydHVwLAogCS5sbmRfc2h1dGRvd24gICA9IGtpYmxuZF9zaHV0ZG93biwKQEAgLTUzLDggKzUzLDggQEAKIAoga2liX2RhdGFfdAkgICAgICBraWJsbmRfZGF0YTsKIAotX191MzIKLWtpYmxuZF9ja3N1bSAodm9pZCAqcHRyLCBpbnQgbm9iKQorc3RhdGljIF9fdTMyCitraWJsbmRfY2tzdW0odm9pZCAqcHRyLCBpbnQgbm9iKQogewogCWNoYXIgICpjICA9IHB0cjsKIAlfX3UzMiAgc3VtID0gMDsKQEAgLTQyOSw4ICs0MjksOCBAQAogCWtpYmxuZF9wZWVyX2RlY3JlZihwZWVyKTsKIH0KIAotaW50Ci1raWJsbmRfZ2V0X3BlZXJfaW5mbyAobG5ldF9uaV90ICpuaSwgaW50IGluZGV4LAorc3RhdGljIGludAora2libG5kX2dldF9wZWVyX2luZm8obG5ldF9uaV90ICpuaSwgaW50IGluZGV4LAogCQkgICAgICBsbmV0X25pZF90ICpuaWRwLCBpbnQgKmNvdW50KQogewogCWtpYl9wZWVyX3QJICAgICpwZWVyOwpAQCAtNDY4LDggKzQ2OCw4IEBACiAJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKLXZvaWQKLWtpYmxuZF9kZWxfcGVlcl9sb2NrZWQgKGtpYl9wZWVyX3QgKnBlZXIpCitzdGF0aWMgdm9pZAora2libG5kX2RlbF9wZWVyX2xvY2tlZChraWJfcGVlcl90ICpwZWVyKQogewogCXN0cnVjdCBsaXN0X2hlYWQJICAgKmN0bXA7CiAJc3RydWN0IGxpc3RfaGVhZAkgICAqY254dDsKQEAgLTQ4OSw4ICs0ODksOCBAQAogCSAqIGxhc3QgcmVmIG9uIGl0LiAqLwogfQogCi1pbnQKLWtpYmxuZF9kZWxfcGVlciAobG5ldF9uaV90ICpuaSwgbG5ldF9uaWRfdCBuaWQpCitzdGF0aWMgaW50CitraWJsbmRfZGVsX3BlZXIobG5ldF9uaV90ICpuaSwgbG5ldF9uaWRfdCBuaWQpCiB7CiAJTElTVF9IRUFECSAoem9tYmllcyk7CiAJc3RydWN0IGxpc3RfaGVhZAkgICAgKnB0bXA7CkBAIC01NDMsOCArNTQzLDggQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWtpYl9jb25uX3QgKgota2libG5kX2dldF9jb25uX2J5X2lkeCAobG5ldF9uaV90ICpuaSwgaW50IGluZGV4KQorc3RhdGljIGtpYl9jb25uX3QgKgora2libG5kX2dldF9jb25uX2J5X2lkeChsbmV0X25pX3QgKm5pLCBpbnQgaW5kZXgpCiB7CiAJa2liX3BlZXJfdAkgICAgKnBlZXI7CiAJc3RydWN0IGxpc3RfaGVhZAkgICAgKnB0bXA7CkBAIC01ODQsNzQgKzU4NCw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQKLWtpYmxuZF9kZWJ1Z19yeCAoa2liX3J4X3QgKnJ4KQotewotCUNERUJVRyhEX0NPTlNPTEUsICIgICAgICAlcCBzdGF0dXMgJWQgbXNnX3R5cGUgJXggY3JlZCAlZFxuIiwKLQkgICAgICAgcngsIHJ4LT5yeF9zdGF0dXMsIHJ4LT5yeF9tc2ctPmlibV90eXBlLAotCSAgICAgICByeC0+cnhfbXNnLT5pYm1fY3JlZGl0cyk7Ci19Ci0KLXZvaWQKLWtpYmxuZF9kZWJ1Z190eCAoa2liX3R4X3QgKnR4KQotewotCUNERUJVRyhEX0NPTlNPTEUsICIgICAgICAlcCBzbmQgJWQgcSAlZCB3ICVkIHJjICVkIGRsICVseCAiCi0JICAgICAgICJjb29raWUgIkxQWDY0IiBtc2cgJXMlcyB0eXBlICV4IGNyZWQgJWRcbiIsCi0JICAgICAgIHR4LCB0eC0+dHhfc2VuZGluZywgdHgtPnR4X3F1ZXVlZCwgdHgtPnR4X3dhaXRpbmcsCi0JICAgICAgIHR4LT50eF9zdGF0dXMsIHR4LT50eF9kZWFkbGluZSwgdHgtPnR4X2Nvb2tpZSwKLQkgICAgICAgdHgtPnR4X2xudG1zZ1swXSA9PSBOVUxMID8gIi0iIDogIiEiLAotCSAgICAgICB0eC0+dHhfbG50bXNnWzFdID09IE5VTEwgPyAiLSIgOiAiISIsCi0JICAgICAgIHR4LT50eF9tc2ctPmlibV90eXBlLCB0eC0+dHhfbXNnLT5pYm1fY3JlZGl0cyk7Ci19Ci0KLXZvaWQKLWtpYmxuZF9kZWJ1Z19jb25uIChraWJfY29ubl90ICpjb25uKQotewotCXN0cnVjdCBsaXN0X2hlYWQJKnRtcDsKLQlpbnQJCWk7Ci0KLQlzcGluX2xvY2soJmNvbm4tPmliY19sb2NrKTsKLQotCUNERUJVRyhEX0NPTlNPTEUsICJjb25uWyVkXSAlcCBbdmVyc2lvbiAleF0gLT4gJXM6IFxuIiwKLQkgICAgICAgYXRvbWljX3JlYWQoJmNvbm4tPmliY19yZWZjb3VudCksIGNvbm4sCi0JICAgICAgIGNvbm4tPmliY192ZXJzaW9uLCBsaWJjZnNfbmlkMnN0cihjb25uLT5pYmNfcGVlci0+aWJwX25pZCkpOwotCUNERUJVRyhEX0NPTlNPTEUsICIgICBzdGF0ZSAlZCBucG9zdGVkICVkLyVkIGNyZWQgJWQgb19jcmVkICVkIHJfY3JlZCAlZFxuIiwKLQkgICAgICAgY29ubi0+aWJjX3N0YXRlLCBjb25uLT5pYmNfbm9vcHNfcG9zdGVkLAotCSAgICAgICBjb25uLT5pYmNfbnNlbmRzX3Bvc3RlZCwgY29ubi0+aWJjX2NyZWRpdHMsCi0JICAgICAgIGNvbm4tPmliY19vdXRzdGFuZGluZ19jcmVkaXRzLCBjb25uLT5pYmNfcmVzZXJ2ZWRfY3JlZGl0cyk7Ci0JQ0RFQlVHKERfQ09OU09MRSwgIiAgIGNvbW1zX2VyciAlZFxuIiwgY29ubi0+aWJjX2NvbW1zX2Vycm9yKTsKLQotCUNERUJVRyhEX0NPTlNPTEUsICIgICBlYXJseV9yeHM6XG4iKTsKLQlsaXN0X2Zvcl9lYWNoKHRtcCwgJmNvbm4tPmliY19lYXJseV9yeHMpCi0JCWtpYmxuZF9kZWJ1Z19yeChsaXN0X2VudHJ5KHRtcCwga2liX3J4X3QsIHJ4X2xpc3QpKTsKLQotCUNERUJVRyhEX0NPTlNPTEUsICIgICB0eF9ub29wczpcbiIpOwotCWxpc3RfZm9yX2VhY2godG1wLCAmY29ubi0+aWJjX3R4X25vb3BzKQotCQlraWJsbmRfZGVidWdfdHgobGlzdF9lbnRyeSh0bXAsIGtpYl90eF90LCB0eF9saXN0KSk7Ci0KLQlDREVCVUcoRF9DT05TT0xFLCAiICAgdHhfcXVldWVfbm9jcmVkOlxuIik7Ci0JbGlzdF9mb3JfZWFjaCh0bXAsICZjb25uLT5pYmNfdHhfcXVldWVfbm9jcmVkKQotCQlraWJsbmRfZGVidWdfdHgobGlzdF9lbnRyeSh0bXAsIGtpYl90eF90LCB0eF9saXN0KSk7Ci0KLQlDREVCVUcoRF9DT05TT0xFLCAiICAgdHhfcXVldWVfcnNydmQ6XG4iKTsKLQlsaXN0X2Zvcl9lYWNoKHRtcCwgJmNvbm4tPmliY190eF9xdWV1ZV9yc3J2ZCkKLQkJa2libG5kX2RlYnVnX3R4KGxpc3RfZW50cnkodG1wLCBraWJfdHhfdCwgdHhfbGlzdCkpOwotCi0JQ0RFQlVHKERfQ09OU09MRSwgIiAgIHR4X3F1ZXVlOlxuIik7Ci0JbGlzdF9mb3JfZWFjaCh0bXAsICZjb25uLT5pYmNfdHhfcXVldWUpCi0JCWtpYmxuZF9kZWJ1Z190eChsaXN0X2VudHJ5KHRtcCwga2liX3R4X3QsIHR4X2xpc3QpKTsKLQotCUNERUJVRyhEX0NPTlNPTEUsICIgICBhY3RpdmVfdHhzOlxuIik7Ci0JbGlzdF9mb3JfZWFjaCh0bXAsICZjb25uLT5pYmNfYWN0aXZlX3R4cykKLQkJa2libG5kX2RlYnVnX3R4KGxpc3RfZW50cnkodG1wLCBraWJfdHhfdCwgdHhfbGlzdCkpOwotCi0JQ0RFQlVHKERfQ09OU09MRSwgIiAgIHJ4czpcbiIpOwotCWZvciAoaSA9IDA7IGkgPCBJQkxORF9SWF9NU0dTKGNvbm4tPmliY192ZXJzaW9uKTsgaSsrKQotCQlraWJsbmRfZGVidWdfcngoJmNvbm4tPmliY19yeHNbaV0pOwotCi0Jc3Bpbl91bmxvY2soJmNvbm4tPmliY19sb2NrKTsKLX0KLQogaW50CiBraWJsbmRfdHJhbnNsYXRlX210dShpbnQgdmFsdWUpCiB7CkBAIC0xMDM5LDggKzk3MSw4IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1pbnQKLWtpYmxuZF9jbG9zZV9tYXRjaGluZ19jb25ucyAobG5ldF9uaV90ICpuaSwgbG5ldF9uaWRfdCBuaWQpCitzdGF0aWMgaW50CitraWJsbmRfY2xvc2VfbWF0Y2hpbmdfY29ubnMobG5ldF9uaV90ICpuaSwgbG5ldF9uaWRfdCBuaWQpCiB7CiAJa2liX3BlZXJfdAkgICAgICpwZWVyOwogCXN0cnVjdCBsaXN0X2hlYWQJICAgICAqcHRtcDsKQEAgLTE0NDAsNyArMTM3Miw3IEBACiAJcmV0dXJuIG1yOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAoga2libG5kX2Rlc3Ryb3lfZm1yX3Bvb2woa2liX2Ztcl9wb29sX3QgKnBvb2wpCiB7CiAJTEFTU0VSVCAocG9vbC0+ZnBvX21hcF9jb3VudCA9PSAwKTsKQEAgLTE0NTQsNyArMTM4Niw3IEBACiAJTElCQ0ZTX0ZSRUUocG9vbCwgc2l6ZW9mKGtpYl9mbXJfcG9vbF90KSk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBraWJsbmRfZGVzdHJveV9mbXJfcG9vbF9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7CiAJa2liX2Ztcl9wb29sX3QgKnBvb2w7CkBAIC0xNDgwLDcgKzE0MTIsNyBAQAogCXJldHVybiBtYXgoSUJMTkRfRk1SX1BPT0xfRkxVU0gsIHNpemUpOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGtpYmxuZF9jcmVhdGVfZm1yX3Bvb2woa2liX2Ztcl9wb29sc2V0X3QgKmZwcywga2liX2Ztcl9wb29sX3QgKipwcF9mcG8pCiB7CiAJLyogRk1SIHBvb2wgZm9yIFJETUEgKi8KQEAgLTE3MTksNyArMTY1MSw3IEBACiAJcG9vbC0+cG9fc2l6ZSAgICAgPSBzaXplOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAoga2libG5kX2Rlc3Ryb3lfcG9vbF9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7CiAJa2liX3Bvb2xfdCAqcG9vbDsKQEAgLTIxOTIsNyArMjEyNCw3IEBACiAJdHgtPnR4X2Nvb2tpZSA9IHRwcy0+dHBzX25leHRfdHhfY29va2llICsrOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAoga2libG5kX25ldF9maW5pX3Bvb2xzKGtpYl9uZXRfdCAqbmV0KQogewogCWludAlpOwpAQCAtMjIzNCw3ICsyMTY2LDcgQEAKIAl9CiB9CiAKLWludAorc3RhdGljIGludAoga2libG5kX25ldF9pbml0X3Bvb2xzKGtpYl9uZXRfdCAqbmV0LCBfX3UzMiAqY3B0cywgaW50IG5jcHRzKQogewogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CkBAIC0yNDA4LDcgKzIzNDAsNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAoga2libG5kX2hkZXZfY2xlYW51cF9tcnMoa2liX2hjYV9kZXZfdCAqaGRldikKIHsKIAlpbnQgICAgIGk7CkBAIC0yNDQyLDcgKzIzNzQsNyBAQAogCUxJQkNGU19GUkVFKGhkZXYsIHNpemVvZigqaGRldikpOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGtpYmxuZF9oZGV2X3NldHVwX21ycyhraWJfaGNhX2Rldl90ICpoZGV2KQogewogCXN0cnVjdCBpYl9tciAqbXI7CkBAIC0yNzQ2LDcgKzI2NzgsNyBAQAogCUxJQkNGU19GUkVFKGRldiwgc2l6ZW9mKCpkZXYpKTsKIH0KIAota2liX2Rldl90ICoKK3N0YXRpYyBraWJfZGV2X3QgKgoga2libG5kX2NyZWF0ZV9kZXYoY2hhciAqaWZuYW1lKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CkBAIC0yODAwLDcgKzI3MzIsNyBAQAogCXJldHVybiBkZXY7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBraWJsbmRfYmFzZV9zaHV0ZG93bih2b2lkKQogewogCXN0cnVjdCBraWJfc2NoZWRfaW5mbwkqc2NoZWQ7CkBAIC0yODQyLDcgKzI3NzQsOCBAQAogCQkJQ0RFQlVHKCgoaSAmICgtaSkpID09IGkpID8gRF9XQVJOSU5HIDogRF9ORVQsIC8qIHBvd2VyIG9mIDI/ICovCiAJCQkgICAgICAgIldhaXRpbmcgZm9yICVkIHRocmVhZHMgdG8gdGVybWluYXRlXG4iLAogCQkJICAgICAgIGF0b21pY19yZWFkKCZraWJsbmRfZGF0YS5raWJfbnRocmVhZHMpKTsKLQkJCWNmc19wYXVzZShjZnNfdGltZV9zZWNvbmRzKDEpKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CiAJCX0KIAogCQkvKiBmYWxsIHRocm91Z2ggKi8KQEAgLTI5MDMsNyArMjgzNiw4IEBACiAJCQkgICAgICAgIiVzOiB3YWl0aW5nIGZvciAlZCBwZWVycyB0byBkaXNjb25uZWN0XG4iLAogCQkJICAgICAgIGxpYmNmc19uaWQyc3RyKG5pLT5uaV9uaWQpLAogCQkJICAgICAgIGF0b21pY19yZWFkKCZuZXQtPmlibl9ucGVlcnMpKTsKLQkJCWNmc19wYXVzZShjZnNfdGltZV9zZWNvbmRzKDEpKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CiAJCX0KIAogCQlraWJsbmRfbmV0X2ZpbmlfcG9vbHMobmV0KTsKQEAgLTI5NDAsNyArMjg3NCw3IEBACiAJcmV0dXJuOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGtpYmxuZF9iYXNlX3N0YXJ0dXAodm9pZCkKIHsKIAlzdHJ1Y3Qga2liX3NjaGVkX2luZm8JKnNjaGVkOwpAQCAtMzAzMCw3ICsyOTY0LDcgQEAKIAlyZXR1cm4gLUVORVRET1dOOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGtpYmxuZF9zdGFydF9zY2hlZHVsZXJzKHN0cnVjdCBraWJfc2NoZWRfaW5mbyAqc2NoZWQpCiB7CiAJaW50CXJjID0gMDsKQEAgLTMwNzEsNyArMzAwNSw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGtpYmxuZF9kZXZfc3RhcnRfdGhyZWFkcyhraWJfZGV2X3QgKmRldiwgaW50IG5ld2RldiwgX191MzIgKmNwdHMsIGludCBuY3B0cykKIHsKIAlpbnQJY3B0OwpAQCAtMzA5Nyw3ICszMDMxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAota2liX2Rldl90ICoKK3N0YXRpYyBraWJfZGV2X3QgKgoga2libG5kX2Rldl9zZWFyY2goY2hhciAqaWZuYW1lKQogewogCWtpYl9kZXZfdAkqYWxpYXMgPSBOVUxMOwpAQCAtMzIyNiwxMyArMzE2MCwxMyBAQAogCXJldHVybiAtRU5FVERPV047CiB9CiAKLXZvaWQgX19leGl0CitzdGF0aWMgdm9pZCBfX2V4aXQKIGtpYmxuZF9tb2R1bGVfZmluaSAodm9pZCkKIHsKIAlsbmV0X3VucmVnaXN0ZXJfbG5kKCZ0aGVfbzJpYmxuZCk7CiB9CiAKLWludCBfX2luaXQKK3N0YXRpYyBpbnQgX19pbml0CiBraWJsbmRfbW9kdWxlX2luaXQgKHZvaWQpCiB7CiAJaW50ICAgIHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZF9jYi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZF9jYi5jCmluZGV4IDZmNThlYWQuLjYxNzNlNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmRfY2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kX2NiLmMKQEAgLTMxMjcsNyArMzEyNyw3IEBACiAKIAljZnNfYmxvY2tfYWxsc2lncyAoKTsKIAotCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQgKCZ3YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAJa2libG5kX2RhdGEua2liX2Nvbm5kID0gY3VycmVudDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZraWJsbmRfZGF0YS5raWJfY29ubmRfbG9jaywgZmxhZ3MpOwpAQCAtMzIwOCw3ICszMjA4LDcgQEAKIAkJYWRkX3dhaXRfcXVldWUoJmtpYmxuZF9kYXRhLmtpYl9jb25uZF93YWl0cSwgJndhaXQpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZraWJsbmRfZGF0YS5raWJfY29ubmRfbG9jaywgZmxhZ3MpOwogCi0JCXdhaXRxX3RpbWVkd2FpdCgmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFLCB0aW1lb3V0KTsKKwkJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKIAogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCQlyZW1vdmVfd2FpdF9xdWV1ZSgma2libG5kX2RhdGEua2liX2Nvbm5kX3dhaXRxLCAmd2FpdCk7CkBAIC0zMzI0LDcgKzMzMjQsNyBAQAogCiAJY2ZzX2Jsb2NrX2FsbHNpZ3MoKTsKIAotCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQoJndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKIAogCXNjaGVkID0ga2libG5kX2RhdGEua2liX3NjaGVkc1tLSUJfVEhSRUFEX0NQVChpZCldOwogCkBAIC0zNDIzLDcgKzM0MjMsNyBAQAogCQlhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmUoJnNjaGVkLT5pYnNfd2FpdHEsICZ3YWl0KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NoZWQtPmlic19sb2NrLCBmbGFncyk7CiAKLQkJd2FpdHFfd2FpdCgmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGUoKTsKIAkJYnVzeV9sb29wcyA9IDA7CiAKIAkJcmVtb3ZlX3dhaXRfcXVldWUoJnNjaGVkLT5pYnNfd2FpdHEsICZ3YWl0KTsKQEAgLTM0NTAsNyArMzQ1MCw3IEBACiAKIAljZnNfYmxvY2tfYWxsc2lncyAoKTsKIAotCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQoJndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKIAl3cml0ZV9sb2NrX2lycXNhdmUoZ2xvY2ssIGZsYWdzKTsKIAogCXdoaWxlICgha2libG5kX2RhdGEua2liX3NodXRkb3duKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kLmMKaW5kZXggOGY3NGQwYi4uMjFkMzZlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmQuYwpAQCAtMjMzNiw3ICsyMzM2LDggQEAKIAkJCSAgICAgICAid2FpdGluZyBmb3IgJWQgdGhyZWFkcyB0byB0ZXJtaW5hdGVcbiIsCiAJCQkJa3NvY2tuYWxfZGF0YS5rc25kX250aHJlYWRzKTsKIAkJCXJlYWRfdW5sb2NrKCZrc29ja25hbF9kYXRhLmtzbmRfZ2xvYmFsX2xvY2spOwotCQkJY2ZzX3BhdXNlKGNmc190aW1lX3NlY29uZHMoMSkpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKDEpKTsKIAkJCXJlYWRfbG9jaygma3NvY2tuYWxfZGF0YS5rc25kX2dsb2JhbF9sb2NrKTsKIAkJfQogCQlyZWFkX3VubG9jaygma3NvY2tuYWxfZGF0YS5rc25kX2dsb2JhbF9sb2NrKTsKQEAgLTI1ODQsNyArMjU4NSw4IEBACiAJCUNERUJVRygoKGkgJiAoLWkpKSA9PSBpKSA/IERfV0FSTklORyA6IERfTkVULCAvKiBwb3dlciBvZiAyPyAqLwogCQkgICAgICAgIndhaXRpbmcgZm9yICVkIHBlZXJzIHRvIGRpc2Nvbm5lY3RcbiIsCiAJCSAgICAgICBuZXQtPmtzbm5fbnBlZXJzKTsKLQkJY2ZzX3BhdXNlKGNmc190aW1lX3NlY29uZHMoMSkpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CiAKIAkJa3NvY2tuYWxfZGVidWdfcGVlcmhhc2gobmkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2NiLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2NiLmMKaW5kZXggYjdiNTNiNS4uYmRmOTVlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9jYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfY2IuYwpAQCAtMTg5LDcgKzE4OSw4IEBACiAJaW50ICAgICAgYnVmbm9iOwogCiAJaWYgKGtzb2NrbmFsX2RhdGEua3NuZF9zdGFsbF90eCAhPSAwKSB7Ci0JCWNmc19wYXVzZShjZnNfdGltZV9zZWNvbmRzKGtzb2NrbmFsX2RhdGEua3NuZF9zdGFsbF90eCkpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcyhrc29ja25hbF9kYXRhLmtzbmRfc3RhbGxfdHgpKTsKIAl9CiAKIAlMQVNTRVJUICh0eC0+dHhfcmVzaWQgIT0gMCk7CkBAIC0zNDUsNyArMzQ2LDggQEAKIAlpbnQgICAgIHJjOwogCiAJaWYgKGtzb2NrbmFsX2RhdGEua3NuZF9zdGFsbF9yeCAhPSAwKSB7Ci0JCWNmc19wYXVzZShjZnNfdGltZV9zZWNvbmRzIChrc29ja25hbF9kYXRhLmtzbmRfc3RhbGxfcngpKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoa3NvY2tuYWxfZGF0YS5rc25kX3N0YWxsX3J4KSk7CiAJfQogCiAJcmMgPSBrc29ja25hbF9jb25uc29ja19hZGRyZWYoY29ubik7CkBAIC0yMTQwLDcgKzIxNDIsNyBAQAogCiAJY2ZzX2Jsb2NrX2FsbHNpZ3MgKCk7CiAKLQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50ICgmd2FpdCk7CisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCiAJc3Bpbl9sb2NrX2JoKGNvbm5kX2xvY2spOwogCkBAIC0yMjI5LDcgKzIyMzEsNyBAQAogCQlzcGluX3VubG9ja19iaChjb25uZF9sb2NrKTsKIAogCQlubG9vcHMgPSAwOwotCQl3YWl0cV90aW1lZHdhaXQoJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSwgdGltZW91dCk7CisJCXNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CiAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAkJcmVtb3ZlX3dhaXRfcXVldWUoJmtzb2NrbmFsX2RhdGEua3NuZF9jb25uZF93YWl0cSwgJndhaXQpOwpAQCAtMjUzMiw3ICsyNTM0LDcgQEAKIAljZnNfYmxvY2tfYWxsc2lncyAoKTsKIAogCUlOSVRfTElTVF9IRUFEKCZlbm9tZW1fY29ubnMpOwotCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQgKCZ3YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAKIAlzcGluX2xvY2tfYmgoJmtzb2NrbmFsX2RhdGEua3NuZF9yZWFwZXJfbG9jayk7CiAKQEAgLTI2MzksOCArMjY0MSw3IEBACiAJCWlmICgha3NvY2tuYWxfZGF0YS5rc25kX3NodXR0aW5nZG93biAmJgogCQkgICAgbGlzdF9lbXB0eSAoJmtzb2NrbmFsX2RhdGEua3NuZF9kZWF0aHJvd19jb25ucykgJiYKIAkJICAgIGxpc3RfZW1wdHkgKCZrc29ja25hbF9kYXRhLmtzbmRfem9tYmllX2Nvbm5zKSkKLQkJCXdhaXRxX3RpbWVkd2FpdCAoJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSwKLQkJCQkJICAgICB0aW1lb3V0KTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CiAKIAkJc2V0X2N1cnJlbnRfc3RhdGUgKFRBU0tfUlVOTklORyk7CiAJCXJlbW92ZV93YWl0X3F1ZXVlICgma3NvY2tuYWxfZGF0YS5rc25kX3JlYXBlcl93YWl0cSwgJndhaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9saWItbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfbGliLWxpbnV4LmMKaW5kZXggODAxNDFhYS4uYTU0YjUwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9saWItbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2xpYi1saW51eC5jCkBAIC0zNzMsNyArMzczLDggQEAKIAogCS8qIE5CIHdlIGNhbid0IHRydXN0IHNvY2tldCBvcHMgdG8gZWl0aGVyIGNvbnN1bWUgb3VyIGlvdnMKIAkgKiBvciBsZWF2ZSB0aGVtIGFsb25lLiAqLwotCWlmICgoYWRkciA9IGtzb2NrbmFsX2xpYl9raW92X3ZtYXAoa2lvdiwgbmlvdiwgc2NyYXRjaGlvdiwgcGFnZXMpKSAhPSBOVUxMKSB7CisJYWRkciA9IGtzb2NrbmFsX2xpYl9raW92X3ZtYXAoa2lvdiwgbmlvdiwgc2NyYXRjaGlvdiwgcGFnZXMpOworCWlmIChhZGRyICE9IE5VTEwpIHsKIAkJbm9iID0gc2NyYXRjaGlvdlswXS5pb3ZfbGVuOwogCQltc2cubXNnX2lvdmxlbiA9IDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfcHJvdG8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfcHJvdG8uYwppbmRleCA3MTIwNWUyLi4yZDkxNTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX3Byb3RvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9wcm90by5jCkBAIC0xNjUsNyArMTY1LDggQEAKIAlMQVNTRVJUICh0eF9hY2sgPT0gTlVMTCB8fAogCQkgdHhfYWNrLT50eF9tc2cua3NtX3R5cGUgPT0gS1NPQ0tfTVNHX05PT1ApOwogCi0JaWYgKCh0eCA9IGNvbm4tPmtzbmNfdHhfY2FycmllcikgPT0gTlVMTCkgeworCXR4ID0gY29ubi0+a3NuY190eF9jYXJyaWVyOworCWlmICh0eCA9PSBOVUxMKSB7CiAJCWlmICh0eF9hY2sgIT0gTlVMTCkgewogCQkJbGlzdF9hZGRfdGFpbCgmdHhfYWNrLT50eF9saXN0LAogCQkJCQkgICZjb25uLT5rc25jX3R4X3F1ZXVlKTsKQEAgLTM5Miw3ICszOTMsOCBAQAogCWlmICh0eCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmICgocmMgPSBrc29ja25hbF9sYXVuY2hfcGFja2V0KHBlZXItPmtzbnBfbmksIHR4LCBwZWVyLT5rc25wX2lkKSkgPT0gMCkKKwlyYyA9IGtzb2NrbmFsX2xhdW5jaF9wYWNrZXQocGVlci0+a3NucF9uaSwgdHgsIHBlZXItPmtzbnBfaWQpOworCWlmIChyYyA9PSAwKQogCQlyZXR1cm4gMDsKIAogCWtzb2NrbmFsX2ZyZWVfdHgodHgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvYWNjZXB0b3IuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2FjY2VwdG9yLmMKaW5kZXggY2IyZWNkNy4uMDllYTZjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvYWNjZXB0b3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9hY2NlcHRvci5jCkBAIC0zNzEsNyArMzcxLDggQEAKIAkJaWYgKHJjICE9IDApIHsKIAkJCWlmIChyYyAhPSAtRUFHQUlOKSB7CiAJCQkJQ1dBUk4oIkFjY2VwdCBlcnJvciAlZDogcGF1c2luZy4uLlxuIiwgcmMpOwotCQkJCWNmc19wYXVzZShjZnNfdGltZV9zZWNvbmRzKDEpKTsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKDEpKTsKIAkJCX0KIAkJCWNvbnRpbnVlOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9hcGktbmkuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2FwaS1uaS5jCmluZGV4IGM1NjJmZjMuLjQ1YzIzMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2FwaS1uaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2FwaS1uaS5jCkBAIC03NzAsNyArNzcwLDcgQEAKIAlpZiAobnVtYmVyID09IDEpCiAJCXJldHVybiAwOwogCi0JdmFsID0gY2ZzX2hhc2hfbG9uZyhrZXksIExORVRfQ1BUX0JJVFMpOworCXZhbCA9IGhhc2hfbG9uZyhrZXksIExORVRfQ1BUX0JJVFMpOwogCS8qIE5COiBMTkVUX0NQX05VTUJFUiBkb2Vzbid0IGhhdmUgdG8gYmUgUE8yICovCiAJaWYgKHZhbCA8IG51bWJlcikKIAkJcmV0dXJuIHZhbDsKQEAgLTk5NCw3ICs5OTQsOCBAQAogCQkJCSAgICAgICAiV2FpdGluZyBmb3Igem9tYmllIExOSSAlc1xuIiwKIAkJCQkgICAgICAgbGliY2ZzX25pZDJzdHIobmktPm5pX25pZCkpOwogCQkJfQotCQkJY2ZzX3BhdXNlKGNmc190aW1lX3NlY29uZHMoMSkpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKDEpKTsKIAkJCWxuZXRfbmV0X2xvY2soTE5FVF9MT0NLX0VYKTsKIAkJCWNvbnRpbnVlOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9jb25maWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2NvbmZpZy5jCmluZGV4IDZhMDdiMGEuLmQ5NzQ2NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2NvbmZpZy5jCkBAIC00NDMsNyArNDQzLDcgQEAKIAkvKiBTcGxpdCAnc3RyJyBpbnRvIHNlcGFyYXRlIGNvbW1hbmRzICovCiAJZm9yICg7OykgewogCQkvKiBza2lwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotCQl3aGlsZSAoY2ZzX2lzd2hpdGUoKnN0cikpCisJCXdoaWxlIChpc3NwYWNlKCpzdHIpKQogCQkJc3RyKys7CiAKIAkJLyogc2NhbiBmb3Igc2VwYXJhdG9yIG9yIGNvbW1lbnQgKi8KQEAgLTQ2MCw3ICs0NjAsNyBAQAogCQkJfQogCiAJCQlmb3IgKGkgPSAwOyBpIDwgbm9iOyBpKyspCi0JCQkJaWYgKGNmc19pc3doaXRlKHN0cltpXSkpCisJCQkJaWYgKGlzc3BhY2Uoc3RyW2ldKSkKIAkJCQkJbHRiLT5sdGJfdGV4dFtpXSA9ICcgJzsKIAkJCQllbHNlCiAJCQkJCWx0Yi0+bHRiX3RleHRbaV0gPSBzdHJbaV07CkBAIC02NjcsNyArNjY3LDcgQEAKIAlzZXAgPSBzdHI7CiAJZm9yICg7OykgewogCQkvKiBzY2FuIGZvciB0b2tlbiBzdGFydCAqLwotCQl3aGlsZSAoY2ZzX2lzd2hpdGUoKnNlcCkpCisJCXdoaWxlIChpc3NwYWNlKCpzZXApKQogCQkJc2VwKys7CiAJCWlmICgqc2VwID09IDApIHsKIAkJCWlmIChudG9rZW5zIDwgKGdvdF9ob3BzID8gMyA6IDIpKQpAQCAtNjc5LDcgKzY3OSw3IEBACiAJCXRva2VuID0gc2VwKys7CiAKIAkJLyogc2NhbiBmb3IgdG9rZW4gZW5kICovCi0JCXdoaWxlICgqc2VwICE9IDAgJiYgIWNmc19pc3doaXRlKCpzZXApKQorCQl3aGlsZSAoKnNlcCAhPSAwICYmICFpc3NwYWNlKCpzZXApKQogCQkJc2VwKys7CiAJCWlmICgqc2VwICE9IDApCiAJCQkqc2VwKysgPSAwOwpAQCAtODU4LDcgKzg1OCw3IEBACiAJc2VwID0gdG9rZW5zOwogCWZvciAoOzspIHsKIAkJLyogc2NhbiBmb3IgdG9rZW4gc3RhcnQgKi8KLQkJd2hpbGUgKGNmc19pc3doaXRlKCpzZXApKQorCQl3aGlsZSAoaXNzcGFjZSgqc2VwKSkKIAkJCXNlcCsrOwogCQlpZiAoKnNlcCA9PSAwKQogCQkJYnJlYWs7CkBAIC04NjYsNyArODY2LDcgQEAKIAkJdG9rZW4gPSBzZXArKzsKIAogCQkvKiBzY2FuIGZvciB0b2tlbiBlbmQgKi8KLQkJd2hpbGUgKCpzZXAgIT0gMCAmJiAhY2ZzX2lzd2hpdGUoKnNlcCkpCisJCXdoaWxlICgqc2VwICE9IDAgJiYgIWlzc3BhY2UoKnNlcCkpCiAJCQlzZXArKzsKIAkJaWYgKCpzZXAgIT0gMCkKIAkJCSpzZXArKyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItZXEuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1lcS5jCmluZGV4IDRjZTY4ZDMuLjdjZTA3ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1lcS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1lcS5jCkBAIC0zMzQsMjEgKzMzNCwyMCBAQAogCWlmICh0bXMgPT0gMCkKIAkJcmV0dXJuIC0xOyAvKiBkb24ndCB3YW50IHRvIHdhaXQgYW5kIG5vIG5ldyBldmVudCAqLwogCi0JaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCgmd2wpOworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3bCwgY3VycmVudCk7CiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAlhZGRfd2FpdF9xdWV1ZSgmdGhlX2xuZXQubG5fZXFfd2FpdHEsICZ3bCk7CiAKIAlsbmV0X2VxX3dhaXRfdW5sb2NrKCk7CiAKIAlpZiAodG1zIDwgMCkgewotCQl3YWl0cV93YWl0KCZ3bCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGUoKTsKIAogCX0gZWxzZSB7CiAJCXN0cnVjdCB0aW1ldmFsIHR2OwogCiAJCW5vdyA9IGNmc190aW1lX2N1cnJlbnQoKTsKLQkJd2FpdHFfdGltZWR3YWl0KCZ3bCwgVEFTS19JTlRFUlJVUFRJQkxFLAotCQkJCSAgICBjZnNfdGltZV9zZWNvbmRzKHRtcykgLyAxMDAwKTsKKwkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKHRtcykgLyAxMDAwKTsKIAkJY2ZzX2R1cmF0aW9uX3VzZWMoY2ZzX3RpbWVfc3ViKGNmc190aW1lX2N1cnJlbnQoKSwgbm93KSwgJnR2KTsKIAkJdG1zIC09IChpbnQpKHR2LnR2X3NlYyAqIDEwMDAgKyB0di50dl91c2VjIC8gMTAwMCk7CiAJCWlmICh0bXMgPCAwKSAvKiBubyBtb3JlIHdhaXQgYnV0IG1heSBoYXZlIG5ldyBldmVudCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLXB0bC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLXB0bC5jCmluZGV4IDZmZmZkNWUuLjkyMGRmNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1wdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItcHRsLmMKQEAgLTM2Niw3ICszNjYsNyBAQAogCQl1bnNpZ25lZCBsb25nIGhhc2ggPSBtYml0cyArIGlkLm5pZCArIGlkLnBpZDsKIAogCQlMQVNTRVJUKGxuZXRfcHRsX2lzX3VuaXF1ZShwdGwpKTsKLQkJaGFzaCA9IGNmc19oYXNoX2xvbmcoaGFzaCwgTE5FVF9NVF9IQVNIX0JJVFMpOworCQloYXNoID0gaGFzaF9sb25nKGhhc2gsIExORVRfTVRfSEFTSF9CSVRTKTsKIAkJcmV0dXJuICZtdGFibGUtPm10X21oYXNoW2hhc2hdOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3BlZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3BlZXIuYwppbmRleCAyODY5Nzc2Li43MjgwMmIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9wZWVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcGVlci5jCkBAIC0xNDUsNyArMTQ1LDggQEAKIAkJCQkgICAgICAgIldhaXRpbmcgZm9yICVkIHBlZXJzIG9uIHBlZXIgdGFibGVcbiIsCiAJCQkJICAgICAgIHB0YWJsZS0+cHRfbnVtYmVyKTsKIAkJCX0KLQkJCWNmc19wYXVzZShjZnNfdGltZV9zZWNvbmRzKDEpIC8gMik7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoMSkgLyAyKTsKIAkJCWxuZXRfbmV0X2xvY2soaSk7CiAJCX0KIAkJbGlzdF9zcGxpY2VfaW5pdCgmcHRhYmxlLT5wdF9kZWF0aHJvdywgJmRlYXRocm93KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3JvdXRlci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcm91dGVyLmMKaW5kZXggZDFlZTQ0Mi4uOTk1ZjUwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcm91dGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcm91dGVyLmMKQEAgLTc3OSw3ICs3NzksOCBAQAogCQlpZiAoYWxsX2tub3duKQogCQkJcmV0dXJuOwogCi0JCWNmc19wYXVzZShjZnNfdGltZV9zZWNvbmRzKDEpKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoMSkpOwogCX0KIH0KIApAQCAtMTE0Nyw3ICsxMTQ4LDggQEAKIAkJaSsrOwogCQlDREVCVUcoKChpICYgKC1pKSkgPT0gaSkgPyBEX1dBUk5JTkcgOiBEX05FVCwKIAkJICAgICAgICJXYWl0aW5nIGZvciByYyBidWZmZXJzIHRvIHVubGlua1xuIik7Ci0JCWNmc19wYXVzZShjZnNfdGltZV9zZWNvbmRzKDEpIC8gNCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKDEpIC8gNCk7CiAKIAkJbG5ldF9uZXRfbG9jayhMTkVUX0xPQ0tfRVgpOwogCX0KQEAgLTEyMDYsMTEgKzEyMDgsMTEgQEAKIAogCQlsbmV0X3BydW5lX3JjX2RhdGEoMCk7IC8qIGRvbid0IHdhaXQgZm9yIFVOTElOSyAqLwogCi0JCS8qIENhbGwgY2ZzX3BhdXNlKCkgaGVyZSBhbHdheXMgYWRkcyAxIHRvIGxvYWQgYXZlcmFnZQorCQkvKiBDYWxsIHNjaGVkdWxlX3RpbWVvdXQoKSBoZXJlIGFsd2F5cyBhZGRzIDEgdG8gbG9hZCBhdmVyYWdlCiAJCSAqIGJlY2F1c2Uga2VybmVsIGNvdW50cyAjIGFjdGl2ZSB0YXNrcyBhcyBucl9ydW5uaW5nCiAJCSAqICsgbnJfdW5pbnRlcnJ1cHRpYmxlLiAqLwotCQlzY2hlZHVsZV90aW1lb3V0X2FuZF9zZXRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFLAotCQkJCQkJICAgY2ZzX3RpbWVfc2Vjb25kcygxKSk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CiAJfQogCiAJTEFTU0VSVCh0aGVfbG5ldC5sbl9yY19zdGF0ZSA9PSBMTkVUX1JDX1NUQVRFX1NUT1BQSU5HKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3JvdXRlcl9wcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9yb3V0ZXJfcHJvYy5jCmluZGV4IDIwZDUzZTAuLjBjYmQ5ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3JvdXRlcl9wcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcm91dGVyX3Byb2MuYwpAQCAtODM3LDggKzgzNyw4IEBACiAJcmMgPSAtRUlOVkFMOwogCWxuZXRfcmVzX2xvY2soMCk7CiAJZm9yIChpID0gMDsgcG9ydGFsX3JvdG9yc1tpXS5wcl9uYW1lICE9IE5VTEw7IGkrKykgewotCQlpZiAoY2ZzX3N0cm5jYXNlY21wKHBvcnRhbF9yb3RvcnNbaV0ucHJfbmFtZSwgdG1wLAotCQkJCSAgICBzdHJsZW4ocG9ydGFsX3JvdG9yc1tpXS5wcl9uYW1lKSkgPT0gMCkgeworCQlpZiAoc3RybmNhc2VjbXAocG9ydGFsX3JvdG9yc1tpXS5wcl9uYW1lLCB0bXAsCisJCQkJc3RybGVuKHBvcnRhbF9yb3RvcnNbaV0ucHJfbmFtZSkpID09IDApIHsKIAkJCXBvcnRhbF9yb3RvciA9IHBvcnRhbF9yb3RvcnNbaV0ucHJfdmFsdWU7CiAJCQlyYyA9IDA7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25ycGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25ycGMuYwppbmRleCA1M2Q1ODkyLi44ZDFlZWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29ucnBjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnJwYy5jCkBAIC0xMzQ2LDcgKzEzNDYsOCBAQAogCQltdXRleF91bmxvY2soJmNvbnNvbGVfc2Vzc2lvbi5zZXNfbXV0ZXgpOwogCiAJCUNXQVJOKCJTZXNzaW9uIGlzIHNodXR0aW5nIGRvd24sIHdhaXRpbmcgZm9yIHRlcm1pbmF0aW9uIG9mIHRyYW5zYWN0aW9uc1xuIik7Ci0JCWNmc19wYXVzZShjZnNfdGltZV9zZWNvbmRzKDEpKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoMSkpOwogCiAJCW11dGV4X2xvY2soJmNvbnNvbGVfc2Vzc2lvbi5zZXNfbXV0ZXgpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25zb2xlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29uc29sZS5jCmluZGV4IDJhOGVkZGMuLjM1MmZjOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25zb2xlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnNvbGUuYwpAQCAtNjEsNyArNjEsNyBAQAogCiBsc3Rjb25fc2Vzc2lvbl90CWNvbnNvbGVfc2Vzc2lvbjsKIAotdm9pZAorc3RhdGljIHZvaWQKIGxzdGNvbl9ub2RlX2dldChsc3Rjb25fbm9kZV90ICpuZCkKIHsKIAlMQVNTRVJUIChuZC0+bmRfcmVmID49IDEpOwpAQCAtMTE0LDcgKzExNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBsc3Rjb25fbm9kZV9wdXQobHN0Y29uX25vZGVfdCAqbmQpCiB7CiAJbHN0Y29uX25kbGlua190ICAqbmRsOwpAQCAtMzQ0LDcgKzM0NCw3IEBACiAJfQogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxzdGNvbl9zZXNycGNfY29uZGl0aW9uKGludCB0cmFuc29wLCBsc3Rjb25fbm9kZV90ICpuZCwgdm9pZCAqYXJnKQogewogCWxzdGNvbl9ncm91cF90ICpncnAgPSAobHN0Y29uX2dyb3VwX3QgKilhcmc7CkBAIC0zNzMsNyArMzczLDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBsc3Rjb25fc2VzcnBjX3JlYWRlbnQoaW50IHRyYW5zb3AsIHNycGNfbXNnX3QgKm1zZywKIAkJICAgICAgbHN0Y29uX3JwY19lbnRfdCAqZW50X3VwKQogewpAQCAtODMwLDcgKzgzMCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludAorc3RhdGljIGludAogbHN0Y29uX2JhdGNoX2ZpbmQoY29uc3QgY2hhciAqbmFtZSwgbHN0Y29uX2JhdGNoX3QgKipiYXRwcCkKIHsKIAlsc3Rjb25fYmF0Y2hfdCAgICpiYXQ7CkBAIC05OTgsNyArOTk4LDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludAorc3RhdGljIGludAogbHN0Y29uX2JhdHJwY19jb25kaXRpb24oaW50IHRyYW5zb3AsIGxzdGNvbl9ub2RlX3QgKm5kLCB2b2lkICphcmcpCiB7CiAJc3dpdGNoICh0cmFuc29wKSB7CkBAIC0xMTQxLDcgKzExNDEsNyBAQAogCUxJQkNGU19GUkVFKGJhdCwgc2l6ZW9mKGxzdGNvbl9iYXRjaF90KSk7CiB9CiAKLWludAorc3RhdGljIGludAogbHN0Y29uX3Rlc3RycGNfY29uZGl0aW9uKGludCB0cmFuc29wLCBsc3Rjb25fbm9kZV90ICpuZCwgdm9pZCAqYXJnKQogewogCWxzdGNvbl90ZXN0X3QgICAgKnRlc3Q7CkBAIC0xMzcwLDcgKzEzNzAsNyBAQAogCXJldHVybiByYzsKIH0KIAotaW50CitzdGF0aWMgaW50CiBsc3Rjb25fdGVzdF9maW5kKGxzdGNvbl9iYXRjaF90ICpiYXRjaCwgaW50IGlkeCwgbHN0Y29uX3Rlc3RfdCAqKnRlc3RwcCkKIHsKIAlsc3Rjb25fdGVzdF90ICp0ZXN0OwpAQCAtMTM4NSw3ICsxMzg1LDcgQEAKIAlyZXR1cm4gLUVOT0VOVDsKIH0KIAotaW50CitzdGF0aWMgaW50CiBsc3Rjb25fdHNicnBjX3JlYWRlbnQoaW50IHRyYW5zb3AsIHNycGNfbXNnX3QgKm1zZywKIAkJICAgICAgbHN0Y29uX3JwY19lbnRfdCAqZW50X3VwKQogewpAQCAtMTQ2NCw3ICsxNDY0LDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludAorc3RhdGljIGludAogbHN0Y29uX3N0YXRycGNfcmVhZGVudChpbnQgdHJhbnNvcCwgc3JwY19tc2dfdCAqbXNnLAogCQkgICAgICAgbHN0Y29uX3JwY19lbnRfdCAqZW50X3VwKQogewpAQCAtMTQ4OCw3ICsxNDg4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50CitzdGF0aWMgaW50CiBsc3Rjb25fbmRsaXN0X3N0YXQoc3RydWN0IGxpc3RfaGVhZCAqbmRsaXN0LAogCQkgICBpbnQgdGltZW91dCwgc3RydWN0IGxpc3RfaGVhZCAqcmVzdWx0X3VwKQogewpAQCAtMTU3Nyw3ICsxNTc3LDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludAorc3RhdGljIGludAogbHN0Y29uX2RlYnVnX25kbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpuZGxpc3QsCiAJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICp0cmFuc2xpc3QsCiAJCSAgICBpbnQgdGltZW91dCwgc3RydWN0IGxpc3RfaGVhZCAqcmVzdWx0X3VwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L3JwYy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L3JwYy5jCmluZGV4IGQ4Mzg5ODUuLjlmYzA0MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9ycGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvcnBjLmMKQEAgLTE1ODUsNyArMTU4NSw4IEBACiAJc3Bpbl9sb2NrX2luaXQoJnNycGNfZGF0YS5ycGNfZ2xvY2spOwogCiAJLyogMSBzZWNvbmQgcGF1c2UgdG8gYXZvaWQgdGltZXN0YW1wIHJldXNlICovCi0JY2ZzX3BhdXNlKGNmc190aW1lX3NlY29uZHMoMSkpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoMSkpOwogCXNycGNfZGF0YS5ycGNfbWF0Y2hiaXRzID0gKChfX3U2NCkgY2ZzX3RpbWVfY3VycmVudF9zZWMoKSkgPDwgNDg7CiAKIAlzcnBjX2RhdGEucnBjX3N0YXRlID0gU1JQQ19TVEFURV9OT05FOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L3NlbGZ0ZXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3Qvc2VsZnRlc3QuaAppbmRleCAyMjg5MjdlLi5mNDgwNmE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3Qvc2VsZnRlc3QuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3Qvc2VsZnRlc3QuaApAQCAtNTcyLDcgKzU3MiwxMSBAQAogI3VuZGVmIFNUQVRFMlNUUgogfQogCi0jZGVmaW5lIHNlbGZ0ZXN0X3dhaXRfZXZlbnRzKCkJY2ZzX3BhdXNlKGNmc190aW1lX3NlY29uZHMoMSkgLyAxMCkKKyNkZWZpbmUgc2VsZnRlc3Rfd2FpdF9ldmVudHMoKQkJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CVwKKwkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKDEpIC8gMTApOwlcCisJfSB3aGlsZSAoMCkKIAogCiAjZGVmaW5lIGxzdF93YWl0X3VudGlsKGNvbmQsIGxvY2ssIGZtdCwgLi4uKQkJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9maWQvZmlkX3JlcXVlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZpZC9maWRfcmVxdWVzdC5jCmluZGV4IDc5ZmMyZmUuLjM0MDFjOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZpZC9maWRfcmVxdWVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZpZC9maWRfcmVxdWVzdC5jCkBAIC0xOTYsOCArMTk2LDggQEAKIAlpZiAocmFuZ2VfaXNfZXhoYXVzdGVkKCZzZXEtPmxjc19zcGFjZSkpIHsKIAkJcmMgPSBzZXFfY2xpZW50X2FsbG9jX21ldGEoZW52LCBzZXEpOwogCQlpZiAocmMpIHsKLQkJCUNFUlJPUigiJXM6IENhbid0IGFsbG9jYXRlIG5ldyBtZXRhLXNlcXVlbmNlLCIKLQkJCSAgICAgICAicmMgJWRcbiIsIHNlcS0+bGNzX25hbWUsIHJjKTsKKwkJCUNFUlJPUigiJXM6IENhbid0IGFsbG9jYXRlIG5ldyBtZXRhLXNlcXVlbmNlLCByYyAlZFxuIiwKKwkJCQlzZXEtPmxjc19uYW1lLCByYyk7CiAJCQlyZXR1cm4gcmM7CiAJCX0gZWxzZSB7CiAJCQlDREVCVUcoRF9JTkZPLCAiJXM6IE5ldyByYW5nZSAtICJEUkFOR0UiXG4iLApAQCAtMjI1LDcgKzIyNSw3IEBACiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAkJbXV0ZXhfdW5sb2NrKCZzZXEtPmxjc19tdXRleCk7CiAKLQkJd2FpdHFfd2FpdChsaW5rLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlKCk7CiAKIAkJbXV0ZXhfbG9jaygmc2VxLT5sY3NfbXV0ZXgpOwogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmc2VxLT5sY3Nfd2FpdHEsIGxpbmspOwpAQCAtMjU2LDcgKzI1Niw3IEBACiAKIAlMQVNTRVJUKHNlcW5yICE9IE5VTEwpOwogCW11dGV4X2xvY2soJnNlcS0+bGNzX211dGV4KTsKLQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KCZsaW5rKTsKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmbGluaywgY3VycmVudCk7CiAKIAl3aGlsZSAoMSkgewogCQlyYyA9IHNlcV9maWRfYWxsb2NfcHJlcChzZXEsICZsaW5rKTsKQEAgLTI2NiwxNSArMjY2LDE1IEBACiAKIAlyYyA9IHNlcV9jbGllbnRfYWxsb2Nfc2VxKGVudiwgc2VxLCBzZXFucik7CiAJaWYgKHJjKSB7Ci0JCUNFUlJPUigiJXM6IENhbid0IGFsbG9jYXRlIG5ldyBzZXF1ZW5jZSwgIgotCQkgICAgICAgInJjICVkXG4iLCBzZXEtPmxjc19uYW1lLCByYyk7CisJCUNFUlJPUigiJXM6IENhbid0IGFsbG9jYXRlIG5ldyBzZXF1ZW5jZSwgcmMgJWRcbiIsCisJCQlzZXEtPmxjc19uYW1lLCByYyk7CiAJCXNlcV9maWRfYWxsb2NfZmluaShzZXEpOwogCQltdXRleF91bmxvY2soJnNlcS0+bGNzX211dGV4KTsKIAkJcmV0dXJuIHJjOwogCX0KIAotCUNERUJVRyhEX0lORk8sICIlczogYWxsb2NhdGUgc2VxdWVuY2UgIgotCSAgICAgICAiWzB4JTE2LjE2IkxQRjY0InhdXG4iLCBzZXEtPmxjc19uYW1lLCAqc2VxbnIpOworCUNERUJVRyhEX0lORk8sICIlczogYWxsb2NhdGUgc2VxdWVuY2UgWzB4JTE2LjE2IkxQRjY0InhdXG4iLAorCQkJc2VxLT5sY3NfbmFtZSwgKnNlcW5yKTsKIAogCS8qIFNpbmNlIHRoZSBjYWxsZXIgcmVxdWlyZSB0aGUgd2hvbGUgc2VxLAogCSAqIHNvIG1hcmtlZCB0aGlzIHNlcSB0byBiZSB1c2VkICovCkBAIC0zMDYsNyArMzA2LDcgQEAKIAlMQVNTRVJUKHNlcSAhPSBOVUxMKTsKIAlMQVNTRVJUKGZpZCAhPSBOVUxMKTsKIAotCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQoJmxpbmspOworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZsaW5rLCBjdXJyZW50KTsKIAltdXRleF9sb2NrKCZzZXEtPmxjc19tdXRleCk7CiAKIAlpZiAoT0JEX0ZBSUxfQ0hFQ0soT0JEX0ZBSUxfU0VRX0VYSEFVU1QpKQpAQCAtMzI5LDE1ICszMjksMTUgQEAKIAogCQlyYyA9IHNlcV9jbGllbnRfYWxsb2Nfc2VxKGVudiwgc2VxLCAmc2VxbnIpOwogCQlpZiAocmMpIHsKLQkJCUNFUlJPUigiJXM6IENhbid0IGFsbG9jYXRlIG5ldyBzZXF1ZW5jZSwgIgotCQkJICAgICAgICJyYyAlZFxuIiwgc2VxLT5sY3NfbmFtZSwgcmMpOworCQkJQ0VSUk9SKCIlczogQ2FuJ3QgYWxsb2NhdGUgbmV3IHNlcXVlbmNlLCByYyAlZFxuIiwKKwkJCQlzZXEtPmxjc19uYW1lLCByYyk7CiAJCQlzZXFfZmlkX2FsbG9jX2Zpbmkoc2VxKTsKIAkJCW11dGV4X3VubG9jaygmc2VxLT5sY3NfbXV0ZXgpOwogCQkJcmV0dXJuIHJjOwogCQl9CiAKLQkJQ0RFQlVHKERfSU5GTywgIiVzOiBTd2l0Y2ggdG8gc2VxdWVuY2UgIgotCQkgICAgICAgIlsweCUxNi4xNiJMUEY2NCJ4XVxuIiwgc2VxLT5sY3NfbmFtZSwgc2VxbnIpOworCQlDREVCVUcoRF9JTkZPLCAiJXM6IFN3aXRjaCB0byBzZXF1ZW5jZSBbMHglMTYuMTYiTFBGNjQieF1cbiIsCisJCQkJc2VxLT5sY3NfbmFtZSwgc2VxbnIpOwogCiAJCXNlcS0+bGNzX2ZpZC5mX29pZCA9IExVU1RSRV9GSURfSU5JVF9PSUQ7CiAJCXNlcS0+bGNzX2ZpZC5mX3NlcSA9IHNlcW5yOwpAQCAtMzcwLDcgKzM3MCw3IEBACiAJd2FpdF9xdWV1ZV90IGxpbms7CiAKIAlMQVNTRVJUKHNlcSAhPSBOVUxMKTsKLQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KCZsaW5rKTsKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmbGluaywgY3VycmVudCk7CiAJbXV0ZXhfbG9jaygmc2VxLT5sY3NfbXV0ZXgpOwogCiAJd2hpbGUgKHNlcS0+bGNzX3VwZGF0ZSkgewpAQCAtMzc4LDcgKzM3OCw3IEBACiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAkJbXV0ZXhfdW5sb2NrKCZzZXEtPmxjc19tdXRleCk7CiAKLQkJd2FpdHFfd2FpdCgmbGluaywgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZSgpOwogCiAJCW11dGV4X2xvY2soJnNlcS0+bGNzX211dGV4KTsKIAkJcmVtb3ZlX3dhaXRfcXVldWUoJnNlcS0+bGNzX3dhaXRxLCAmbGluayk7CkBAIC00MjgsOCArNDI4LDggQEAKIAlyYyA9IGxwcm9jZnNfYWRkX3ZhcnMoc2VxLT5sY3NfcHJvY19kaXIsCiAJCQkgICAgICBzZXFfY2xpZW50X3Byb2NfbGlzdCwgc2VxKTsKIAlpZiAocmMpIHsKLQkJQ0VSUk9SKCIlczogQ2FuJ3QgaW5pdCBzZXF1ZW5jZSBtYW5hZ2VyICIKLQkJICAgICAgICJwcm9jLCByYyAlZFxuIiwgc2VxLT5sY3NfbmFtZSwgcmMpOworCQlDRVJST1IoIiVzOiBDYW4ndCBpbml0IHNlcXVlbmNlIG1hbmFnZXIgcHJvYywgcmMgJWRcbiIsCisJCQlzZXEtPmxjc19uYW1lLCByYyk7CiAJCUdPVE8ob3V0X2NsZWFudXAsIHJjKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfY2FjaGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfY2FjaGUuYwppbmRleCA2YzM3OTMwLi5hMDZhNjQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvZmxkX2NhY2hlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9jYWNoZS5jCkBAIC0yMzYsOCArMjM2LDggQEAKIAkJbnVtKys7CiAJfQogCi0JQ0RFQlVHKERfSU5GTywgIiVzOiBGTEQgY2FjaGUgLSBTaHJ1bmsgYnkgIgotCSAgICAgICAiJWQgZW50cmllc1xuIiwgY2FjaGUtPmZjaV9uYW1lLCBudW0pOworCUNERUJVRyhEX0lORk8sICIlczogRkxEIGNhY2hlIC0gU2hydW5rIGJ5ICVkIGVudHJpZXNcbiIsCisJCQljYWNoZS0+ZmNpX25hbWUsIG51bSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM1NSw3ICszNTUsNyBAQAogCQlmbGRfY2FjaGVfZW50cnlfYWRkKGNhY2hlLCBmX25ldywgJmZfY3Vyci0+ZmNlX2xpc3QpOwogCX0gZWxzZQogCQlDRVJST1IoIk5FVyByYW5nZSA9IkRSQU5HRSIgY3VyciA9ICJEUkFOR0UiXG4iLAotCQkgICAgICAgUFJBTkdFKHJhbmdlKSxQUkFOR0UoJmZfY3Vyci0+ZmNlX3JhbmdlKSk7CisJCSAgICAgICBQUkFOR0UocmFuZ2UpLCBQUkFOR0UoJmZfY3Vyci0+ZmNlX3JhbmdlKSk7CiB9CiAKIHN0cnVjdCBmbGRfY2FjaGVfZW50cnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfaW50ZXJuYWwuaAppbmRleCA1ZjM5MzVjLi44NjYxYTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvZmxkX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9pbnRlcm5hbC5oCkBAIC05MCw3ICs5MCw3IEBACiAJaW50CQkgICAgICBmY2lfdGhyZXNob2xkOwogCiAJLyoqCi0JICogUHJlZmVyZWQgbnVtYmVyIG9mIGNhY2hlZCBlbnRyaWVzICovCisJICogUHJlZmVycmVkIG51bWJlciBvZiBjYWNoZWQgZW50cmllcyAqLwogCWludAkJICAgICAgZmNpX2NhY2hlX3NpemU7CiAKIAkvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfcmVxdWVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9yZXF1ZXN0LmMKaW5kZXggODk2ZjlmZS4uMWY4YWJiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9yZXF1ZXN0LmMKQEAgLTEzOCw5ICsxMzgsOCBAQAogCQkJcmV0dXJuIHRhcmdldDsKIAl9CiAKLQlDRVJST1IoIiVzOiBDYW4ndCBmaW5kIHRhcmdldCBieSBoYXNoICVkIChzZXEgIkxQWDY0IikuICIKLQkgICAgICAgIlRhcmdldHMgKCVkKTpcbiIsIGZsZC0+bGNmX25hbWUsIGhhc2gsIHNlcSwKLQkgICAgICAgZmxkLT5sY2ZfY291bnQpOworCUNFUlJPUigiJXM6IENhbid0IGZpbmQgdGFyZ2V0IGJ5IGhhc2ggJWQgKHNlcSAiTFBYNjQiKS4gVGFyZ2V0cyAoJWQpOlxuIiwKKwkJZmxkLT5sY2ZfbmFtZSwgaGFzaCwgc2VxLCBmbGQtPmxjZl9jb3VudCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJmZsZC0+bGNmX3RhcmdldHMsIGZ0X2NoYWluKSB7CiAJCWNvbnN0IGNoYXIgKnNydl9uYW1lID0gdGFyZ2V0LT5mdF9zcnYgIT0gTlVMTCAgPwpAQCAtMjA5LDkgKzIwOCw4IEBACiAJTEFTU0VSVCh0YXItPmZ0X3NydiAhPSBOVUxMIHx8IHRhci0+ZnRfZXhwICE9IE5VTEwpOwogCiAJaWYgKGZsZC0+bGNmX2ZsYWdzICE9IExVU1RSRV9GTERfSU5JVCkgewotCQlDRVJST1IoIiVzOiBBdHRlbXB0IHRvIGFkZCB0YXJnZXQgJXMgKGlkeCAiTFBVNjQiKSAiCi0JCSAgICAgICAib24gZmx5IC0gc2tpcCBpdFxuIiwgZmxkLT5sY2ZfbmFtZSwgbmFtZSwKLQkJICAgICAgIHRhci0+ZnRfaWR4KTsKKwkJQ0VSUk9SKCIlczogQXR0ZW1wdCB0byBhZGQgdGFyZ2V0ICVzIChpZHggIkxQVTY0Iikgb24gZmx5IC0gc2tpcCBpdFxuIiwKKwkJCWZsZC0+bGNmX25hbWUsIG5hbWUsIHRhci0+ZnRfaWR4KTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIHsKIAkJQ0RFQlVHKERfSU5GTywgIiVzOiBBZGRpbmcgdGFyZ2V0ICVzIChpZHggIgpAQCAtNDc2LDkgKzQ3NCw4IEBACiAJdGFyZ2V0ID0gZmxkX2NsaWVudF9nZXRfdGFyZ2V0KGZsZCwgc2VxKTsKIAlMQVNTRVJUKHRhcmdldCAhPSBOVUxMKTsKIAotCUNERUJVRyhEX0lORk8sICIlczogTG9va3VwIGZsZCBlbnRyeSAoc2VxOiAiTFBYNjQiKSBvbiAiCi0JICAgICAgICJ0YXJnZXQgJXMgKGlkeCAiTFBVNjQiKVxuIiwgZmxkLT5sY2ZfbmFtZSwgc2VxLAotCSAgICAgICBmbGRfdGFyZ2V0X25hbWUodGFyZ2V0KSwgdGFyZ2V0LT5mdF9pZHgpOworCUNERUJVRyhEX0lORk8sICIlczogTG9va3VwIGZsZCBlbnRyeSAoc2VxOiAiTFBYNjQiKSBvbiB0YXJnZXQgJXMgKGlkeCAiTFBVNjQiKVxuIiwKKwkJCWZsZC0+bGNmX25hbWUsIHNlcSwgZmxkX3RhcmdldF9uYW1lKHRhcmdldCksIHRhcmdldC0+ZnRfaWR4KTsKIAogCXJlcy5sc3Jfc3RhcnQgPSBzZXE7CiAJZmxkX3JhbmdlX3NldF90eXBlKCZyZXMsIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvY2xfb2JqZWN0LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2NsX29iamVjdC5oCmluZGV4IDRkNjkyZGMuLmM4MDkyMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvY2xfb2JqZWN0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9jbF9vYmplY3QuaApAQCAtMTMxNCw3ICsxMzE0LDcgQEAKICAqIGNhbGxzLiBUbyBhY2hpZXZlIHRoaXMsIGV2ZXJ5IGxheWVyIGNhbiBpbXBsZW1lbnQgLT5jbG9fZml0c19pbnRvKCkgbWV0aG9kLAogICogdGhhdCBpcyBjYWxsZWQgYnkgbG9jayBtYXRjaGluZyBjb2RlIChjbF9sb2NrX2xvb2t1cCgpKSwgYW5kIHRoYXQgY2FuIGJlCiAgKiB1c2VkIHRvIHNlbGVjdGl2ZWx5IGRpc2FibGUgbWF0Y2hpbmcgb2YgY2VydGFpbiBsb2NrcyBmb3IgY2VydGFpbiBJT3MuIEZvcgotICogZXhtYXBsZSwgbG92IGxheWVyIGltcGxlbWVudHMgbG92X2xvY2tfZml0c19pbnRvKCkgdGhhdCBhbGxvdyBtdWx0aS1zdHJpcGUKKyAqIGV4YW1wbGUsIGxvdiBsYXllciBpbXBsZW1lbnRzIGxvdl9sb2NrX2ZpdHNfaW50bygpIHRoYXQgYWxsb3cgbXVsdGktc3RyaXBlCiAgKiBsb2NrcyB0byBiZSBtYXRjaGVkIG9ubHkgZm9yIHRydW5jYXRlcyBhbmQgT19BUFBFTkQgd3JpdGVzLgogICoKICAqIEludGVyYWN0aW9uIHdpdGggRExNCkBAIC0yMzg1LDE0ICsyMzg1LDE4IEBACiAJICogQ2hlY2sgaWYgbGF5b3V0IGNoYW5nZWQgYWZ0ZXIgdGhlIElPIGZpbmlzaGVzLiBNYWlubHkgZm9yIEhTTQogCSAqIHJlcXVpcmVtZW50LiBJZiBJTyBvY2N1cnMgdG8gb3Blbm5pbmcgZmlsZXMsIGl0IGRvZXNuJ3QgbmVlZCB0bwogCSAqIHZlcmlmeSBsYXlvdXQgYmVjYXVzZSBIU00gd29uJ3QgcmVsZWFzZSBvcGVubmluZyBmaWxlcy4KLQkgKiBSaWdodCBub3csIG9ubHkgdHdvIG9wZXJ0YWlvbnMgbmVlZCB0byB2ZXJpZnkgbGF5b3V0OiBnbGltcHNlCisJICogUmlnaHQgbm93LCBvbmx5IHR3byBvcGVyYXRpb25zIG5lZWQgdG8gdmVyaWZ5IGxheW91dDogZ2xpbXBzZQogCSAqIGFuZCBzZXRhdHRyLgogCSAqLwogCQkJICAgICBjaV92ZXJpZnlfbGF5b3V0OjEsCiAJLyoqCiAJICogZmlsZSBpcyByZWxlYXNlZCwgcmVzdG9yZSBoYXMgdG8gdG8gYmUgdHJpZ2dlcmVkIGJ5IHZ2cCBsYXllcgogCSAqLwotCQkJICAgICBjaV9yZXN0b3JlX25lZWRlZDoxOworCQkJICAgICBjaV9yZXN0b3JlX25lZWRlZDoxLAorCS8qKgorCSAqIE9fTk9BVElNRQorCSAqLworCQkJICAgICBjaV9ub2F0aW1lOjE7CiAJLyoqCiAJICogTnVtYmVyIG9mIHBhZ2VzIG93bmVkIGJ5IHRoaXMgSU8uIEZvciBpbnZhcmlhbnQgY2hlY2tpbmcuCiAJICovCkBAIC0yNTUyLDcgKzI1NTYsNyBAQAogICovCiBzdHJ1Y3QgY2xfcmVxIHsKIAllbnVtIGNsX3JlcV90eXBlICAgICAgY3JxX3R5cGU7Ci0JLyoqIEEgbGlzdCBvZiBwYWdlcyBiZWluZyB0cmFuc2ZlcmVkICovCisJLyoqIEEgbGlzdCBvZiBwYWdlcyBiZWluZyB0cmFuc2ZlcnJlZCAqLwogCXN0cnVjdCBsaXN0X2hlYWQJICAgIGNycV9wYWdlczsKIAkvKiogTnVtYmVyIG9mIHBhZ2VzIGluIGNsX3JlcTo6Y3JxX3BhZ2VzICovCiAJdW5zaWduZWQJICAgICAgY3JxX25ycGFnZXM7CkBAIC0zMjI0LDcgKzMyMjgsNyBAQAogICoKICAqICAgICAtIGNhbGwgY2hhaW5zIGhhdmUgbm8gbm9uLWx1c3RyZSBwb3J0aW9ucyBpbnNlcnRlZCBiZXR3ZWVuIGx1c3RyZSBjb2RlLgogICoKLSAqIE9uIGEgY2xpZW50IGJvdGggdGhlc2UgYXNzdW10cGlvbiBmYWlscywgYmVjYXVzZSBldmVyeSB1c2VyIHRocmVhZCBjYW4KKyAqIE9uIGEgY2xpZW50IGJvdGggdGhlc2UgYXNzdW1wdGlvbiBmYWlscywgYmVjYXVzZSBldmVyeSB1c2VyIHRocmVhZCBjYW4KICAqIHBvdGVudGlhbGx5IGV4ZWN1dGUgbHVzdHJlIGNvZGUgYXMgcGFydCBvZiBhIHN5c3RlbSBjYWxsLCBhbmQgbHVzdHJlIGNhbGxzCiAgKiBpbnRvIFZGUyBvciBNTSB0aGF0IGNhbGwgYmFjayBpbnRvIGx1c3RyZS4KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2lvY3RsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2lvY3RsLmgKaW5kZXggMjI3YzI2MS4uYjk4NjkyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9pb2N0bC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvaW9jdGwuaApAQCAtMzgsNyArMzgsNyBAQAogICogYW5kIG9uIG5ld2VyIGtlcm5lbHMgdGhpcyBoZWFkZXIgaXMgc2hhcmVkIGFzIF9BU01fR0VORVJJQ19JT0NUTF9ILgogICoKICAqIFdlIGNhbiBhdm9pZCBhbnkgcHJvYmxlbXMgd2l0aCB0aGUga2VybmVsIGhlYWRlciBiZWluZyBpbmNsdWRlZCBhZ2FpbiBieQotICogZGVmaW5pbmcgX0FTTV9JMzg2X0lPQ1RMX0ggaGVyZSBzbyB0aGF0IGEgbGF0ZXIgb2NjdXJlbmNlIG9mIDxhc20vaW9jdGwuaD4KKyAqIGRlZmluaW5nIF9BU01fSTM4Nl9JT0NUTF9IIGhlcmUgc28gdGhhdCBhIGxhdGVyIG9jY3VycmVuY2Ugb2YgPGFzbS9pb2N0bC5oPgogICogZG9lcyBub3QgaW5jbHVkZSB0aGUga2VybmVsJ3MgaW9jdGwuaCBhZnRlciB0aGlzIG9uZS4gYj0xNDc0NiAqLwogI2RlZmluZSBfQVNNX0kzODZfSU9DVExfSAogI2RlZmluZSBfQVNNX0dFTkVSSUNfSU9DVExfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sY2xpZW50LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xjbGllbnQuaAppbmRleCAyNzMxNmY3Li44MjcyMDllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xjbGllbnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xjbGllbnQuaApAQCAtMTE4LDggKzExOCw4IEBACiB9OwogCiAvKioKLSAqIFRydWUsIGlmIFxhIGlvIGlzIGEgbm9ybWFsIGlvLCBGYWxzZSBmb3Igb3RoZXIgKHNlbmRmaWxlLCBzcGxpY2UqKS4KLSAqIG11c3QgYmUgaW1wZW1lbnRhdGVkIGluIGFyY2ggc3BlY2lmaWMgY29kZS4KKyAqIFRydWUsIGlmIFxhIGlvIGlzIGEgbm9ybWFsIGlvLCBGYWxzZSBmb3Igc3BsaWNlX3tyZWFkLHdyaXRlfS4KKyAqIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gYXJjaCBzcGVjaWZpYyBjb2RlLgogICovCiBpbnQgY2xfaXNfbm9ybWFsaW8oY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBjb25zdCBzdHJ1Y3QgY2xfaW8gKmlvKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9saW51eC9sdXN0cmVfYWNsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2x1c3RyZV9hY2wuaAppbmRleCA3NzhiMTIzLi5hOTFjNTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2x1c3RyZV9hY2wuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2x1c3RyZV9hY2wuaApAQCAtNDQsNyArNDQsNyBAQAogI2RlZmluZSBfTFVTVFJFX0xJTlVYX0FDTF9ICiAKICNpZm5kZWYJX0xVU1RSRV9BQ0xfSAotI2Vycm9yCVNob3VkIG5vdCBpbmNsdWRlIGRpcmVlY3RseS4gdXNlICNpbmNsdWRlIDxsdXN0cmVfYWNsLmg+IGluc3RlYWQKKyNlcnJvcglTaG91bGQgbm90IGluY2x1ZGUgZGlyZWN0bHkuIHVzZSAjaW5jbHVkZSA8bHVzdHJlX2FjbC5oPiBpbnN0ZWFkCiAjZW5kaWYKIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xpbnV4L29iZC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9saW51eC9vYmQuaAppbmRleCAwMWE1MDI2Li5kYzM2Zjc1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9saW51eC9vYmQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xpbnV4L29iZC5oCkBAIC05Niw3ICs5Niw4IEBACiAJCQlMQ09OU09MRV9XQVJOKCI9PT09PT0gZm9yIGN1cnJlbnQgcHJvY2VzcyA9PT09PVxuIik7CiAJCQlkdW1wX3N0YWNrKCk7CiAJCQlMQ09OU09MRV9XQVJOKCI9PT09PT0gZW5kID09PT09PT1cbiIpOwotCQkJY2ZzX3BhdXNlKDEwMDAgKiBIWik7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KDEwMDAgKiBIWik7CiAJCX0KIAkJY3B1X3JlbGF4KCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lkbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lkbC5oCmluZGV4IDVkYTMxYzUuLjg3OTA1YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pZGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaWRsLmgKQEAgLTkxLDggKzkxLDggQEAKICNpZm5kZWYgX0xVU1RSRV9JRExfSF8KICNkZWZpbmUgX0xVU1RSRV9JRExfSF8KIAotI2lmICFkZWZpbmVkKExBU1NFUlQpICYmICFkZWZpbmVkKExQVTY0KQotI2luY2x1ZGUgPGxpbnV4L2xpYmNmcy9saWJjZnMuaD4gLyogZm9yIExBU1NFUlQsIExQVVg2NCwgZXRjICovCisjaWYgIWRlZmluZWQoTFBVNjQpCisjaW5jbHVkZSA8bGludXgvbGliY2ZzL2xpYmNmcy5oPiAvKiBmb3IgTFBVWDY0LCBldGMgKi8KICNlbmRpZgogCiAvKiBEZWZuJ3Mgc2hhcmVkIHdpdGggdXNlci1zcGFjZS4gKi8KQEAgLTIzMiw3ICsyMzIsNiBAQAogc3RhdGljIGlubGluZSB2b2lkIGZsZF9yYW5nZV9zZXRfdHlwZShzdHJ1Y3QgbHVfc2VxX3JhbmdlICpyYW5nZSwKIAkJCQkgICAgICB1bnNpZ25lZCBmbGFncykKIHsKLQlMQVNTRVJUKCEoZmxhZ3MgJiB+TFVfU0VRX1JBTkdFX01BU0spKTsKIAlyYW5nZS0+bHNyX2ZsYWdzIHw9IGZsYWdzOwogfQogCkBAIC0zNTEsNyArMzUwLDcgQEAKIAkvKiogQml0ZmllbGQgZm9yIHN1cHBvcnRlZCBkYXRhIGluIHRoaXMgc3RydWN0dXJlLiBGb3IgZnV0dXJlIHVzZS4gKi8KIAlfX3UzMglzb21fY29tcGF0OwogCi0JLyoqIEluY29tcGF0IGZlYXR1cmUgbGlzdC4gVGhlIHN1cHBvcnRlZCBmZWF0dXJlIG1hc2sgaXMgYXZhaWxhYmUgaW4KKwkvKiogSW5jb21wYXQgZmVhdHVyZSBsaXN0LiBUaGUgc3VwcG9ydGVkIGZlYXR1cmUgbWFzayBpcyBhdmFpbGFibGUgaW4KIAkgKiBTT01fSU5DT01QQVRfU1VQUCAqLwogCV9fdTMyCXNvbV9pbmNvbXBhdDsKIApAQCAtNjE1LDcgKzYxNCw2IEBACiAvKiBleHRyYWN0IG9zdCBpbmRleCBmcm9tIElESUYgRklEICovCiBzdGF0aWMgaW5saW5lIF9fdTMyIGZpZF9pZGlmX29zdF9pZHgoY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKQogewotCUxBU1NFUlQoZmlkX2lzX2lkaWYoZmlkKSk7CiAJcmV0dXJuIChmaWRfc2VxKGZpZCkgPj4gMTYpICYgMHhmZmZmOwogfQogCkBAIC04MzMsMTEgKzgzMSw2IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmaWRfY3B1X3RvX2xlKHN0cnVjdCBsdV9maWQgKmRzdCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqc3JjKQogewotCS8qIGNoZWNrIHRoYXQgYWxsIGZpZWxkcyBhcmUgY29udmVydGVkICovCi0JQ0xBU1NFUlQoc2l6ZW9mKCpzcmMpID09Ci0JCSBzaXplb2YoZmlkX3NlcShzcmMpKSArCi0JCSBzaXplb2YoZmlkX29pZChzcmMpKSArCi0JCSBzaXplb2YoZmlkX3ZlcihzcmMpKSk7CiAJZHN0LT5mX3NlcSA9IGNwdV90b19sZTY0KGZpZF9zZXEoc3JjKSk7CiAJZHN0LT5mX29pZCA9IGNwdV90b19sZTMyKGZpZF9vaWQoc3JjKSk7CiAJZHN0LT5mX3ZlciA9IGNwdV90b19sZTMyKGZpZF92ZXIoc3JjKSk7CkBAIC04NDUsMTEgKzgzOCw2IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmaWRfbGVfdG9fY3B1KHN0cnVjdCBsdV9maWQgKmRzdCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqc3JjKQogewotCS8qIGNoZWNrIHRoYXQgYWxsIGZpZWxkcyBhcmUgY29udmVydGVkICovCi0JQ0xBU1NFUlQoc2l6ZW9mKCpzcmMpID09Ci0JCSBzaXplb2YoZmlkX3NlcShzcmMpKSArCi0JCSBzaXplb2YoZmlkX29pZChzcmMpKSArCi0JCSBzaXplb2YoZmlkX3ZlcihzcmMpKSk7CiAJZHN0LT5mX3NlcSA9IGxlNjRfdG9fY3B1KGZpZF9zZXEoc3JjKSk7CiAJZHN0LT5mX29pZCA9IGxlMzJfdG9fY3B1KGZpZF9vaWQoc3JjKSk7CiAJZHN0LT5mX3ZlciA9IGxlMzJfdG9fY3B1KGZpZF92ZXIoc3JjKSk7CkBAIC04NTcsMTEgKzg0NSw2IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmaWRfY3B1X3RvX2JlKHN0cnVjdCBsdV9maWQgKmRzdCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqc3JjKQogewotCS8qIGNoZWNrIHRoYXQgYWxsIGZpZWxkcyBhcmUgY29udmVydGVkICovCi0JQ0xBU1NFUlQoc2l6ZW9mKCpzcmMpID09Ci0JCSBzaXplb2YoZmlkX3NlcShzcmMpKSArCi0JCSBzaXplb2YoZmlkX29pZChzcmMpKSArCi0JCSBzaXplb2YoZmlkX3ZlcihzcmMpKSk7CiAJZHN0LT5mX3NlcSA9IGNwdV90b19iZTY0KGZpZF9zZXEoc3JjKSk7CiAJZHN0LT5mX29pZCA9IGNwdV90b19iZTMyKGZpZF9vaWQoc3JjKSk7CiAJZHN0LT5mX3ZlciA9IGNwdV90b19iZTMyKGZpZF92ZXIoc3JjKSk7CkBAIC04NjksMTEgKzg1Miw2IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmaWRfYmVfdG9fY3B1KHN0cnVjdCBsdV9maWQgKmRzdCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqc3JjKQogewotCS8qIGNoZWNrIHRoYXQgYWxsIGZpZWxkcyBhcmUgY29udmVydGVkICovCi0JQ0xBU1NFUlQoc2l6ZW9mKCpzcmMpID09Ci0JCSBzaXplb2YoZmlkX3NlcShzcmMpKSArCi0JCSBzaXplb2YoZmlkX29pZChzcmMpKSArCi0JCSBzaXplb2YoZmlkX3ZlcihzcmMpKSk7CiAJZHN0LT5mX3NlcSA9IGJlNjRfdG9fY3B1KGZpZF9zZXEoc3JjKSk7CiAJZHN0LT5mX29pZCA9IGJlMzJfdG9fY3B1KGZpZF9vaWQoc3JjKSk7CiAJZHN0LT5mX3ZlciA9IGJlMzJfdG9fY3B1KGZpZF92ZXIoc3JjKSk7CkBAIC04OTcsMTEgKzg3NSw2IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGx1X2ZpZF9lcShjb25zdCBzdHJ1Y3QgbHVfZmlkICpmMCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZjEpCiB7Ci0JLyogQ2hlY2sgdGhhdCB0aGVyZSBpcyBubyBhbGlnbm1lbnQgcGFkZGluZy4gKi8KLQlDTEFTU0VSVChzaXplb2YoKmYwKSA9PQotCQkgc2l6ZW9mKGYwLT5mX3NlcSkgKwotCQkgc2l6ZW9mKGYwLT5mX29pZCkgKwotCQkgc2l6ZW9mKGYwLT5mX3ZlcikpOwogCXJldHVybiBtZW1jbXAoZjAsIGYxLCBzaXplb2YoKmYwKSkgPT0gMDsKIH0KIApAQCAtOTYwLDcgKzkzMyw3IEBACiAJTFVEQV9UWVBFCQk9IDB4MDAwMiwKIAlMVURBXzY0QklUSEFTSAkJPSAweDAwMDQsCiAKLQkvKiBUaGUgZm9sbG93aW5nIGF0dHJzIGFyZSB1c2VkIGZvciBNRFQgaW50ZXJhbmwgb25seSwKKwkvKiBUaGUgZm9sbG93aW5nIGF0dHJzIGFyZSB1c2VkIGZvciBNRFQgaW50ZXJuYWwgb25seSwKIAkgKiBub3QgdmlzaWJsZSB0byBjbGllbnQgKi8KIAogCS8qIFZlcmlmeSB0aGUgZGlyZW50IGNvbnNpc3RlbmN5ICovCkBAIC0xMzMxLDYgKzEzMDQsOSBAQAogI2RlZmluZSBPQkRfQ09OTkVDVF9MSUdIVFdFSUdIVCAweDEwMDAwMDAwMDAwMDBVTEwvKiBsaWdodHdlaWdodCBjb25uZWN0aW9uICovCiAjZGVmaW5lIE9CRF9DT05ORUNUX1NIT1JUSU8gICAgIDB4MjAwMDAwMDAwMDAwMFVMTC8qIHNob3J0IGlvICovCiAjZGVmaW5lIE9CRF9DT05ORUNUX1BJTkdMRVNTCTB4NDAwMDAwMDAwMDAwMFVMTC8qIHBpbmdzIG5vdCByZXF1aXJlZCAqLworI2RlZmluZSBPQkRfQ09OTkVDVF9GTE9DS19ERUFECTB4ODAwMDAwMDAwMDAwMFVMTC8qIGZsb2NrIGRlYWRsb2NrIGRldGVjdGlvbiAqLworI2RlZmluZSBPQkRfQ09OTkVDVF9ESVNQX1NUUklQRSAweDEwMDAwMDAwMDAwMDAwVUxMLypjcmVhdGUgc3RyaXBlIGRpc3Bvc2l0aW9uKi8KKwogLyogWFhYIFJFQURNRSBYWFg6CiAgKiBQbGVhc2UgRE8gTk9UIGFkZCBmbGFnIHZhbHVlcyBoZXJlIGJlZm9yZSBmaXJzdCBlbnN1cmluZyB0aGF0IHRoaXMgc2FtZQogICogZmxhZyB2YWx1ZSBpcyBub3QgaW4gdXNlIG9uIHNvbWUgb3RoZXIgYnJhbmNoLiAgUGxlYXNlIGNsZWFyIGFueSBzdWNoCkBAIC0xMzY4LDcgKzEzNDQsMTAgQEAKIAkJCQlPQkRfQ09OTkVDVF9FSU5QUk9HUkVTUyB8IFwKIAkJCQlPQkRfQ09OTkVDVF9MSUdIVFdFSUdIVCB8IE9CRF9DT05ORUNUX1VNQVNLIHwgXAogCQkJCU9CRF9DT05ORUNUX0xWQl9UWVBFIHwgT0JEX0NPTk5FQ1RfTEFZT1VUTE9DSyB8XAotCQkJCU9CRF9DT05ORUNUX1BJTkdMRVNTIHwgT0JEX0NPTk5FQ1RfTUFYX0VBU0laRSkKKwkJCQlPQkRfQ09OTkVDVF9QSU5HTEVTUyB8IE9CRF9DT05ORUNUX01BWF9FQVNJWkUgfFwKKwkJCQlPQkRfQ09OTkVDVF9GTE9DS19ERUFEIHwgXAorCQkJCU9CRF9DT05ORUNUX0RJU1BfU1RSSVBFKQorCiAjZGVmaW5lIE9TVF9DT05ORUNUX1NVUFBPUlRFRCAgKE9CRF9DT05ORUNUX1NSVkxPQ0sgfCBPQkRfQ09OTkVDVF9HUkFOVCB8IFwKIAkJCQlPQkRfQ09OTkVDVF9SRVFQT1JUQUwgfCBPQkRfQ09OTkVDVF9WRVJTSU9OIHwgXAogCQkJCU9CRF9DT05ORUNUX1RSVU5DTE9DSyB8IE9CRF9DT05ORUNUX0lOREVYIHwgXApAQCAtMTc3MSw3ICsxNzUwLDYgQEAKIAkJCSAgT0JEX01EX0ZMR0lEICAgfCBPQkRfTURfRkxGTEFHUyB8IE9CRF9NRF9GTE5MSU5LIHwgXAogCQkJICBPQkRfTURfRkxHRU5FUiB8IE9CRF9NRF9GTFJERVYgIHwgT0JEX01EX0ZMR1JPVVApCiAKLSNkZWZpbmUgT0JEX01EX0ZMWEFUVFJMT0NLRUQgT0JEX01EX0ZMR0VUQVRUUkxPQ0sKICNkZWZpbmUgT0JEX01EX0ZMWEFUVFJBTEwgKE9CRF9NRF9GTFhBVFRSIHwgT0JEX01EX0ZMWEFUVFJMUykKIAogLyogZG9uJ3QgZm9yZ2V0IG9iZG9fZmlkIHdoaWNoIGlzIHdheSBkb3duIGF0IHRoZSBib3R0b20gc28gaXQgY2FuCkBAIC0yMTM0LDE5ICsyMTEyLDMyIEBACiAjZGVmaW5lIERJU1BfTE9PS1VQX1BPUyAgICAgIDB4MDAwMDAwMDgKICNkZWZpbmUgRElTUF9PUEVOX0NSRUFURSAgICAgMHgwMDAwMDAxMAogI2RlZmluZSBESVNQX09QRU5fT1BFTiAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIERJU1BfRU5RX0NPTVBMRVRFICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgRElTUF9FTlFfQ09NUExFVEUgICAgMHgwMDQwMDAwMAkJLyogb2Jzb2xldGUgYW5kIHVudXNlZCAqLwogI2RlZmluZSBESVNQX0VOUV9PUEVOX1JFRiAgICAweDAwODAwMDAwCiAjZGVmaW5lIERJU1BfRU5RX0NSRUFURV9SRUYgIDB4MDEwMDAwMDAKICNkZWZpbmUgRElTUF9PUEVOX0xPQ0sgICAgICAgMHgwMjAwMDAwMAogI2RlZmluZSBESVNQX09QRU5fTEVBU0UgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIERJU1BfT1BFTl9TVFJJUEUgICAgIDB4MDgwMDAwMDAKIAogLyogSU5PREUgTE9DSyBQQVJUUyAqLwotI2RlZmluZSBNRFNfSU5PREVMT0NLX0xPT0tVUCAweDAwMDAwMSAgICAgICAvKiBkZW50cnksIG1vZGUsIG93bmVyLCBncm91cCAqLwotI2RlZmluZSBNRFNfSU5PREVMT0NLX1VQREFURSAweDAwMDAwMiAgICAgICAvKiBzaXplLCBsaW5rcywgdGltZXN0YW1wcyAqLwotI2RlZmluZSBNRFNfSU5PREVMT0NLX09QRU4gICAweDAwMDAwNCAgICAgICAvKiBGb3Igb3BlbmVkIGZpbGVzICovCi0jZGVmaW5lIE1EU19JTk9ERUxPQ0tfTEFZT1VUIDB4MDAwMDA4ICAgICAgIC8qIGZvciBsYXlvdXQgKi8KLSNkZWZpbmUgTURTX0lOT0RFTE9DS19QRVJNICAgMHgwMDAwMTAgICAgICAgLyogZm9yIHBlcm1pc3Npb24gKi8KLSNkZWZpbmUgTURTX0lOT0RFTE9DS19YQVRUUiAgMHgwMDAwMjAgICAgICAgLyogZXh0ZW5kZWQgYXR0cmlidXRlcyAqLworI2RlZmluZSBNRFNfSU5PREVMT0NLX0xPT0tVUCAweDAwMDAwMQkvKiBGb3IgbmFtZXNwYWNlLCBkZW50cnkgZXRjLCBhbmQgYWxzbworCQkJCQkgKiB3YXMgdXNlZCB0byBwcm90ZWN0IHBlcm1pc3Npb24gKG1vZGUsCisJCQkJCSAqIG93bmVyLCBncm91cCBldGMpIGJlZm9yZSAyLjQuICovCisjZGVmaW5lIE1EU19JTk9ERUxPQ0tfVVBEQVRFIDB4MDAwMDAyCS8qIHNpemUsIGxpbmtzLCB0aW1lc3RhbXBzICovCisjZGVmaW5lIE1EU19JTk9ERUxPQ0tfT1BFTiAgIDB4MDAwMDA0CS8qIEZvciBvcGVuZWQgZmlsZXMgKi8KKyNkZWZpbmUgTURTX0lOT0RFTE9DS19MQVlPVVQgMHgwMDAwMDgJLyogZm9yIGxheW91dCAqLworCisvKiBUaGUgUEVSTSBiaXQgaXMgYWRkZWQgaW50IDIuNCwgYW5kIGl0IGlzIHVzZWQgdG8gcHJvdGVjdCBwZXJtaXNzaW9uKG1vZGUsCisgKiBvd25lciwgZ3JvdXAsIGFjbCBldGMpLCBzbyB0byBzZXBhcmF0ZSB0aGUgcGVybWlzc2lvbiBmcm9tIExPT0tVUCBsb2NrLgorICogQmVjYXVzZSBmb3IgcmVtb3RlIGRpcmVjdG9yaWVzKGluIERORSksIHRoZXNlIGxvY2tzIHdpbGwgYmUgZ3JhbnRlZCBieQorICogZGlmZmVyZW50IE1EVHMoZGlmZmVyZW50IGxkbG0gbmFtZXNwYWNlKS4KKyAqCisgKiBGb3IgbG9jYWwgZGlyZWN0b3J5LCBNRFQgd2lsbCBhbHdheXMgZ3JhbnQgVVBEQVRFX0xPQ0t8UEVSTV9MT0NLIHRvZ2V0aGVyLgorICogRm9yIFJlbW90ZSBkaXJlY3RvcnksIHRoZSBtYXN0ZXIgTURULCB3aGVyZSB0aGUgcmVtb3RlIGRpcmVjdG9yeSBpcywgd2lsbAorICogZ3JhbnQgVVBEQVRFX0xPQ0t8UEVSTV9MT0NLLCBhbmQgdGhlIHJlbW90ZSBNRFQsIHdoZXJlIHRoZSBuYW1lIGVudHJ5IGlzLAorICogd2lsbCBncmFudCBMT09LVVBfTE9DSy4gKi8KKyNkZWZpbmUgTURTX0lOT0RFTE9DS19QRVJNICAgMHgwMDAwMTAKKyNkZWZpbmUgTURTX0lOT0RFTE9DS19YQVRUUiAgMHgwMDAwMjAJLyogZXh0ZW5kZWQgYXR0cmlidXRlcyAqLwogCiAjZGVmaW5lIE1EU19JTk9ERUxPQ0tfTUFYU0hJRlQgNQogLyogVGhpcyBGVUxMIGxvY2sgaXMgdXNlZnVsIHRvIHRha2Ugb24gdW5saW5rIHNvcnQgb2Ygb3BlcmF0aW9ucyAqLwpAQCAtMjU5NSw3ICsyNTg2LDcgQEAKICAqIERvIE5PVCBjaGFuZ2UgdGhlIHNpemUgb2YgdmFyaW91cyBtZW1iZXJzLCBvdGhlcndpc2UgdGhlIHZhbHVlCiAgKiB3aWxsIGJlIGJyb2tlbiBpbiBsdXN0cmVfc3dhYl9tZHRfcmVjX3JlaW50KCkuCiAgKgotICogSWYgeW91IGFkZCBuZXcgbWVtYmVycyBpbiBvdGhlciBtZHRfcmVpbnRfeHh4IHN0cnVjdHJlcyBhbmQgbmVlZCB0byB1c2UgdGhlCisgKiBJZiB5b3UgYWRkIG5ldyBtZW1iZXJzIGluIG90aGVyIG1kdF9yZWludF94eHggc3RydWN0dXJlcyBhbmQgbmVlZCB0byB1c2UgdGhlCiAgKiBycl9wYWRkaW5nX3ggZmllbGRzLCB0aGVuIHVwZGF0ZSBsdXN0cmVfc3dhYl9tZHRfcmVjX3JlaW50KCkgYWxzby4KICAqLwogc3RydWN0IG1kdF9yZWNfcmVpbnQgewpAQCAtMzMyOCw5ICszMzE5LDEwIEBACiAjZGVmaW5lIG9fZ3JhbnRfdXNlZCBvX2RhdGFfdmVyc2lvbgogCiBzdGF0aWMgaW5saW5lIHZvaWQgbHVzdHJlX3NldF93aXJlX29iZG8oc3RydWN0IG9iZF9jb25uZWN0X2RhdGEgKm9jZCwKLQkJCQkJc3RydWN0IG9iZG8gKndvYmRvLCBzdHJ1Y3Qgb2JkbyAqbG9iZG8pCisJCQkJCXN0cnVjdCBvYmRvICp3b2JkbywKKwkJCQkJY29uc3Qgc3RydWN0IG9iZG8gKmxvYmRvKQogewotCW1lbWNweSh3b2JkbywgbG9iZG8sIHNpemVvZigqbG9iZG8pKTsKKwkqd29iZG8gPSAqbG9iZG87CiAJd29iZG8tPm9fZmxhZ3MgJj0gfk9CRF9GTF9MT0NBTF9NQVNLOwogCWlmIChvY2QgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMzM0NSwxNiArMzMzNywxNSBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbHVzdHJlX2dldF93aXJlX29iZG8oc3RydWN0IG9iZF9jb25uZWN0X2RhdGEgKm9jZCwKLQkJCQkJc3RydWN0IG9iZG8gKmxvYmRvLCBzdHJ1Y3Qgb2JkbyAqd29iZG8pCisJCQkJCXN0cnVjdCBvYmRvICpsb2JkbywKKwkJCQkJY29uc3Qgc3RydWN0IG9iZG8gKndvYmRvKQogewogCW9iZF9mbGFnIGxvY2FsX2ZsYWdzID0gMDsKIAogCWlmIChsb2Jkby0+b192YWxpZCAmIE9CRF9NRF9GTEZMQUdTKQogCQkgbG9jYWxfZmxhZ3MgPSBsb2Jkby0+b19mbGFncyAmIE9CRF9GTF9MT0NBTF9NQVNLOwogCi0JTEFTU0VSVCghKHdvYmRvLT5vX2ZsYWdzICYgT0JEX0ZMX0xPQ0FMX01BU0spKTsKLQotCW1lbWNweShsb2Jkbywgd29iZG8sIHNpemVvZigqbG9iZG8pKTsKKwkqbG9iZG8gPSAqd29iZG87CiAJaWYgKGxvY2FsX2ZsYWdzICE9IDApIHsKIAkJbG9iZG8tPm9fdmFsaWQgfD0gT0JEX01EX0ZMRkxBR1M7CiAJCWxvYmRvLT5vX2ZsYWdzICY9IH5PQkRfRkxfTE9DQUxfTUFTSzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV91c2VyLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfdXNlci5oCmluZGV4IDc4OTNkODMuLmY1ZjM2OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV91c2VyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmUvbHVzdHJlX3VzZXIuaApAQCAtMjY1LDEzICsyNjUsMTEgQEAKIAogI2RlZmluZSBNQVhfT0JEX05BTUUgMTI4IC8qIElmIHRoaXMgY2hhbmdlcywgYSBORVcgaW9jdGwgbXVzdCBiZSBhZGRlZCAqLwogCi0vKiBIb3BlZnVsbHkgT19MT1ZfREVMQVlfQ1JFQVRFIGRvZXMgbm90IGNvbmZsaWN0IHdpdGggc3RhbmRhcmQgT194eHggZmxhZ3MuCi0gKiBQcmV2aW91c2x5IGl0IHdhcyBkZWZpbmVkIGFzIDAxMDAwMDAwMDAgYW5kIGNvbmZsaWN0cyB3aXRoIEZNT0RFX05PTk9USUZZCi0gKiB3aGljaCB3YXMgYWRkZWQgc2luY2Uga2VybmVsIDIuNi4zNiwgc28gd2UgcmVkZWZpbmUgaXQgYXMgMDIwMDAwMDAwLgotICogVG8gYmUgY29tcGF0aWJsZSB3aXRoIG9sZCB2ZXJzaW9uJ3Mgc3RhdGljYWxseSBsaW5rZWQgYmluYXJ5LCBmaW5hbGx5IHdlCi0gKiBkZWZpbmUgaXQgYXMgKDAyMDAwMDAwMCB8IDAxMDAwMDAwMDApLgotICogKi8KLSNkZWZpbmUgT19MT1ZfREVMQVlfQ1JFQVRFICAgICAgMDEyMDAwMDAwMAorLyogRGVmaW5lIE9fTE9WX0RFTEFZX0NSRUFURSB0byBiZSBhIG1hc2sgdGhhdCBpcyBub3QgdXNlZnVsIGZvciByZWd1bGFyCisgKiBmaWxlcywgYnV0IGFyZSB1bmxpa2VseSB0byBiZSB1c2VkIGluIHByYWN0aWNlIGFuZCBhcmUgbm90IGhhcm1mdWwgaWYKKyAqIHVzZWQgaW5jb3JyZWN0bHkuICBPX05PQ1RUWSBhbmQgRkFTWU5DIGFyZSBvbmx5IG1lYW5pbmdmdWwgZm9yIGNoYXJhY3RlcgorICogZGV2aWNlcyBhbmQgYXJlIHNhZmUgZm9yIHVzZSBvbiBuZXcgZmlsZXMgKFNlZSBMVS04MTIsIExVLTQyMDkpLiAqLworI2RlZmluZSBPX0xPVl9ERUxBWV9DUkVBVEUJKE9fTk9DVFRZIHwgRkFTWU5DKQogCiAjZGVmaW5lIExMX0ZJTEVfSUdOT1JFX0xPQ0sgICAgIDB4MDAwMDAwMDEKICNkZWZpbmUgTExfRklMRV9HUk9VUF9MT0NLRUQgICAgMHgwMDAwMDAwMgpAQCAtMzAwLDcgKzI5OCw3IEBACiAjZGVmaW5lIExPVl9NQVhfU1RSSVBFX0NPVU5UX09MRCAxNjAKIC8qIFRoaXMgY2FsY3VsYXRpb24gaXMgY3JhZnRlZCBzbyB0aGF0IGlucHV0IG9mIDQwOTYgd2lsbCByZXN1bHQgaW4gMTYwCiAgKiB3aGljaCBpbiB0dXJuIGlzIGVxdWFsIHRvIG9sZCBtYXhpbWFsIHN0cmlwZSBjb3VudC4KLSAqIFhYWDogSW4gZmFjdCB0aGlzIGlzIHRvbyBzaW1waWZpZWQgZm9yIG5vdywgd2hhdCBpdCBhbHNvIG5lZWQgaXMgdG8gZ2V0CisgKiBYWFg6IEluIGZhY3QgdGhpcyBpcyB0b28gc2ltcGxpZmllZCBmb3Igbm93LCB3aGF0IGl0IGFsc28gbmVlZCBpcyB0byBnZXQKICAqIGVhX3R5cGUgYXJndW1lbnQgdG8gY2xlYXJseSBrbm93IGhvdyBtdWNoIHNwYWNlIGVhY2ggc3RyaXBlIGNvbnN1bWVzLgogICoKICAqIFRoZSBsaW1pdCBvZiAxMiBwYWdlcyBpcyBzb21ld2hhdCBhcmJpdHJhcnksIGJ1dCBpcyBhIHJlYXNvbmFibHkgbGFyZ2UKQEAgLTkzMCw3ICs5MjgsNyBAQAogCiAvKgogICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBjdXJyZW50IGluLXByb2dyZXNzIGFjdGlvbiBmb3IgYSBmaWxlLgotICogaXQgaXMgcmV0dW5lZCB0byB1c2VyIHNwYWNlIGFuZCBzZW5kIG92ZXIgdGhlIHdpcmUKKyAqIGl0IGlzIHJldHVybmVkIHRvIHVzZXIgc3BhY2UgYW5kIHNlbmQgb3ZlciB0aGUgd2lyZQogICovCiBzdHJ1Y3QgaHNtX2N1cnJlbnRfYWN0aW9uIHsKIAkvKiogIFRoZSBjdXJyZW50IHVuZGVyZ29pbmcgYWN0aW9uLCBpZiB0aGVyZSBpcyBvbmUgKi8KQEAgLTExNTksMTIgKzExNTcsNiBAQAogCV9fdTMyCQkJcGFkZGluZzsKIH07CiAKLS8qKgotICogVXNlIGJ5IGNvcHl0b29sIGR1cmluZyBhbnkgaHNtIHJlcXVlc3QgdGhleSBoYW5kbGVkLgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQgYnkgbGxhcGlfaHNtX2NvcHlfc3RhcnQoKQotICogd2hpY2ggaXMgYW4gaGVscGVyIG92ZXIgdGhlIGlvY3RsKCkgaW50ZXJmYWNlCi0gKiBTdG9yZSBMdXN0cmUsIGludGVybmFsIHVzZSBvbmx5LCBkYXRhLgotICovCiBzdHJ1Y3QgaHNtX2NvcHkgewogCV9fdTY0CQkJaGNfZGF0YV92ZXJzaW9uOwogCV9fdTE2CQkJaGNfZmxhZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9jZmcuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2NmZy5oCmluZGV4IGUxNGE1ZjYuLjM2ODA2NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2NmZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2NmZy5oCkBAIC04OCw2ICs4OCw4IEBACiAJTENGR19TRVRfTERMTV9USU1FT1VUICAgPSAweDAwY2UwMzAsIC8qKjwgc2V0IGxkbG1fdGltZW91dCAqLwogCUxDRkdfUFJFX0NMRUFOVVAJPSAweDAwY2YwMzEsIC8qKjwgY2FsbCB0eXBlLXNwZWNpZmljIHByZQogCQkJCQkgICAgICAqIGNsZWFudXAgY2xlYW51cCAqLworCUxDRkdfU0VUX1BBUkFNCQk9IDB4MDBjZTAzMiwgLyoqPCB1c2Ugc2V0X3BhcmFtIHN5bnRheCB0byBzZXQKKwkJCQkJICAgICAgKmEgcHJvYyBwYXJhbWV0ZXJzICovCiB9OwogCiBzdHJ1Y3QgbHVzdHJlX2NmZ19idWZzIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2Rpc2suaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2Rpc2suaAppbmRleCAxZGU5YThiLi5hYzA4MTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9kaXNrLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGlzay5oCkBAIC05OSw2ICs5OSw4IEBACiAjZGVmaW5lIExERF9GX0lSX0NBUEFCTEUgICAgMHgyMDAwCiAvKiogdGhlIE1HUyByZWZ1c2VkIHRvIHJlZ2lzdGVyIHRoZSB0YXJnZXQuICovCiAjZGVmaW5lIExERF9GX0VSUk9SCSAweDQwMDAKKy8qKiBwcm9jZXNzIGF0IGxjdGwgY29uZl9wYXJhbSAqLworI2RlZmluZSBMRERfRl9QQVJBTTIJCTB4ODAwMAogCiAvKiBvcGMgZm9yIHRhcmdldCByZWdpc3RlciAqLwogI2RlZmluZSBMRERfRl9PUENfUkVHICAgMHgxMDAwMDAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGxtLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9kbG0uaAppbmRleCBlYzRiYjVlLi4zZTI1ZjAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9kbG0uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9kbG0uaApAQCAtMzMwLDcgKzMzMCw3IEBACiB9OwogCiB0eXBlZGVmIGVudW0gewotCS8qKiBpbnZhbGlkZSB0eXBlICovCisJLyoqIGludmFsaWQgdHlwZSAqLwogCUxETE1fTlNfVFlQRV9VTktOT1dOICAgID0gMCwKIAkvKiogbWRjIG5hbWVzcGFjZSAqLwogCUxETE1fTlNfVFlQRV9NREMsCkBAIC0xMTg1LDcgKzExODUsNyBAQAogCiAvKioKICAqIFVwZGF0ZSBMb2NrIFZhbHVlIEJsb2NrIE9wZXJhdGlvbnMgKExWQk8pIG9uIGEgcmVzb3VyY2UgdGFraW5nIGludG8gYWNjb3VudAotICogZGF0YSBmcm9tIHJlcWVzdCBcYSByCisgKiBkYXRhIGZyb20gcmVxdWVzdCBcYSByCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGxkbG1fcmVzX2x2Ym9fdXBkYXRlKHN0cnVjdCBsZGxtX3Jlc291cmNlICpyZXMsCiAJCQkJICAgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqciwgaW50IGluY3JlYXNlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGxtX2ZsYWdzLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9kbG1fZmxhZ3MuaAppbmRleCA3NTcxNmYxLi4xNmRjZGJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9kbG1fZmxhZ3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9kbG1fZmxhZ3MuaApAQCAtMzUsMTAgKzM1LDEwIEBACiAjaWZuZGVmIExETE1fQUxMX0ZMQUdTX01BU0sKIAogLyoqIGxfZmxhZ3MgYml0cyBtYXJrZWQgYXMgImFsbF9mbGFncyIgYml0cyAqLwotI2RlZmluZSBMRExNX0ZMX0FMTF9GTEFHU19NQVNLICAgICAgICAgIDB4MDBGRkZGRkZDMDhGMTMyRlVMTAorI2RlZmluZSBMRExNX0ZMX0FMTF9GTEFHU19NQVNLICAgICAgICAgIDB4MDBGRkZGRkZDMDhGOTMyRlVMTAogCiAvKiogbF9mbGFncyBiaXRzIG1hcmtlZCBhcyAiYXN0IiBiaXRzICovCi0jZGVmaW5lIExETE1fRkxfQVNUX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDgwMDAwMDAwVUxMCisjZGVmaW5lIExETE1fRkxfQVNUX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDgwMDA4MDAwVUxMCiAKIC8qKiBsX2ZsYWdzIGJpdHMgbWFya2VkIGFzICJibG9ja2VkIiBiaXRzICovCiAjZGVmaW5lIExETE1fRkxfQkxPQ0tFRF9NQVNLICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDBFVUxMCkBAIC01Niw3ICs1Niw3IEBACiAjZGVmaW5lIExETE1fRkxfTE9DQUxfT05MWV9NQVNLICAgICAgICAgMHgwMEZGRkZGRjAwMDAwMDAwVUxMCiAKIC8qKiBsX2ZsYWdzIGJpdHMgbWFya2VkIGFzICJvbl93aXJlIiBiaXRzICovCi0jZGVmaW5lIExETE1fRkxfT05fV0lSRV9NQVNLICAgICAgICAgICAgMHgwMDAwMDAwMEMwOEYxMzJGVUxMCisjZGVmaW5lIExETE1fRkxfT05fV0lSRV9NQVNLICAgICAgICAgICAgMHgwMDAwMDAwMEMwOEY5MzJGVUxMCiAKIC8qKiBleHRlbnQsIG1vZGUsIG9yIHJlc291cmNlIGNoYW5nZWQgKi8KICNkZWZpbmUgTERMTV9GTF9MT0NLX0NIQU5HRUQgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDFVTEwgLy8gYml0ICAgMApAQCAtMTE0LDYgKzExNCwxMiBAQAogI2RlZmluZSBsZGxtX3NldF9oYXNfaW50ZW50KF9sKSAgICAgICAgIExETE1fU0VUX0ZMQUcoKCAgX2wpLCAxVUxMIDw8IDEyKQogI2RlZmluZSBsZGxtX2NsZWFyX2hhc19pbnRlbnQoX2wpICAgICAgIExETE1fQ0xFQVJfRkxBRygoX2wpLCAxVUxMIDw8IDEyKQogCisvKiogZmxvY2sgZGVhZGxvY2sgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgTERMTV9GTF9GTE9DS19ERUFETE9DSyAgICAgICAgICAweDAwMDAwMDAwMDAwMDgwMDBVTEwgLyogYml0ICAxNSAqLworI2RlZmluZSBsZGxtX2lzX2Zsb2NrX2RlYWRsb2NrKF9sKSAgICAgIExETE1fVEVTVF9GTEFHKChfbCksIDFVTEwgPDwgMTUpCisjZGVmaW5lIGxkbG1fc2V0X2Zsb2NrX2RlYWRsb2NrKF9sKSAgICAgTERMTV9TRVRfRkxBRygoX2wpLCAxVUxMIDw8IDE1KQorI2RlZmluZSBsZGxtX2NsZWFyX2Zsb2NrX2RlYWRsb2NrKF9sKSAgIExETE1fQ0xFQVJfRkxBRygoX2wpLCAxVUxMIDw8IDE1KQorCiAvKiogZGlzY2FyZCAobm8gd3JpdGViYWNrKSBvbiBjYW5jZWwgKi8KICNkZWZpbmUgTERMTV9GTF9ESVNDQVJEX0RBVEEgICAgICAgICAgICAweDAwMDAwMDAwMDAwMTAwMDBVTEwgLy8gYml0ICAxNgogI2RlZmluZSBsZGxtX2lzX2Rpc2NhcmRfZGF0YShfbCkgICAgICAgIExETE1fVEVTVF9GTEFHKCggX2wpLCAxVUxMIDw8IDE2KQpAQCAtMTQxLDcgKzE0Nyw3IEBACiAjZGVmaW5lIGxkbG1fY2xlYXJfdGVzdF9sb2NrKF9sKSAgICAgICAgTERMTV9DTEVBUl9GTEFHKChfbCksIDFVTEwgPDwgMTkpCiAKIC8qKgotICogSW1tZWRpYXRlbGx5IGNhbmNlbCBzdWNoIGxvY2tzIHdoZW4gdGhleSBibG9jayBzb21lIG90aGVyIGxvY2tzLiBTZW5kCisgKiBJbW1lZGlhdGVseSBjYW5jZWwgc3VjaCBsb2NrcyB3aGVuIHRoZXkgYmxvY2sgc29tZSBvdGhlciBsb2Nrcy4gU2VuZAogICogY2FuY2VsIG5vdGlmaWNhdGlvbiB0byBvcmlnaW5hbCBsb2NrIGhvbGRlciwgYnV0IGV4cGVjdCBubyByZXBseS4gVGhpcwogICogaXMgZm9yIGNsaWVudHMgKGxpa2UgbGlibHVzdHJlKSB0aGF0IGNhbm5vdCBiZSBleHBlY3RlZCB0byByZWxpYWJseQogICogcmVzcG9uc2UgdG8gYmxvY2tpbmcgQVNULiAqLwpAQCAtMjQyLDcgKzI0OCw3IEBACiAKIC8qKgogICogQSBsb2NrIGNvbnRyaWJ1dGVzIHRvIHRoZSBrbm93biBtaW5pbXVtIHNpemUgKEtNUykgY2FsY3VsYXRpb24gdW50aWwgaXQKLSAqIGhhcyBmaW5pc2hlZCB0aGUgcGFydCBvZiBpdHMgY2FuY2VsYXRpb24gdGhhdCBwZXJmb3JtcyB3cml0ZSBiYWNrIG9uIGl0cworICogaGFzIGZpbmlzaGVkIHRoZSBwYXJ0IG9mIGl0cyBjYW5jZWxsYXRpb24gdGhhdCBwZXJmb3JtcyB3cml0ZSBiYWNrIG9uIGl0cwogICogZGlydHkgcGFnZXMuICBJdCBjYW4gcmVtYWluIG9uIHRoZSBncmFudGVkIGxpc3QgZHVyaW5nIHRoaXMgd2hvbGUgdGltZS4KICAqIFRocmVhZHMgcmFjaW5nIHRvIHVwZGF0ZSB0aGUgS01TIGFmdGVyIHBlcmZvcm1pbmcgdGhlaXIgd3JpdGViYWNrIG5lZWQKICAqIHRvIGtub3cgdG8gZXhjbHVkZSBlYWNoIG90aGVyJ3MgbG9ja3MgZnJvbSB0aGUgY2FsY3VsYXRpb24gYXMgdGhleSB3YWxrCkBAIC0zOTAsNiArMzk2LDcgQEAKIHN0YXRpYyBpbnQgaGZfbHVzdHJlX2xkbG1fZmxfcmVwbGF5ICAgICAgICAgICAgICA9IC0xOwogc3RhdGljIGludCBoZl9sdXN0cmVfbGRsbV9mbF9pbnRlbnRfb25seSAgICAgICAgID0gLTE7CiBzdGF0aWMgaW50IGhmX2x1c3RyZV9sZGxtX2ZsX2hhc19pbnRlbnQgICAgICAgICAgPSAtMTsKK3N0YXRpYyBpbnQgaGZfbHVzdHJlX2xkbG1fZmxfZmxvY2tfZGVhZGxvY2sgICAgICA9IC0xOwogc3RhdGljIGludCBoZl9sdXN0cmVfbGRsbV9mbF9kaXNjYXJkX2RhdGEgICAgICAgID0gLTE7CiBzdGF0aWMgaW50IGhmX2x1c3RyZV9sZGxtX2ZsX25vX3RpbWVvdXQgICAgICAgICAgPSAtMTsKIHN0YXRpYyBpbnQgaGZfbHVzdHJlX2xkbG1fZmxfYmxvY2tfbm93YWl0ICAgICAgICA9IC0xOwpAQCAtNDMxLDYgKzQzOCw3IEBACiAJe0xETE1fRkxfUkVQTEFZLCAgICAgICAgICAgICAgIkxETE1fRkxfUkVQTEFZIn0sCiAJe0xETE1fRkxfSU5URU5UX09OTFksICAgICAgICAgIkxETE1fRkxfSU5URU5UX09OTFkifSwKIAl7TERMTV9GTF9IQVNfSU5URU5ULCAgICAgICAgICAiTERMTV9GTF9IQVNfSU5URU5UIn0sCisJe0xETE1fRkxfRkxPQ0tfREVBRExPQ0ssICAgICAgIkxETE1fRkxfRkxPQ0tfREVBRExPQ0sifSwKIAl7TERMTV9GTF9ESVNDQVJEX0RBVEEsICAgICAgICAiTERMTV9GTF9ESVNDQVJEX0RBVEEifSwKIAl7TERMTV9GTF9OT19USU1FT1VULCAgICAgICAgICAiTERMTV9GTF9OT19USU1FT1VUIn0sCiAJe0xETE1fRkxfQkxPQ0tfTk9XQUlULCAgICAgICAgIkxETE1fRkxfQkxPQ0tfTk9XQUlUIn0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9leHBvcnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2V4cG9ydC5oCmluZGV4IDJmZWIzOGIuLjEwM2Y3YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2V4cG9ydC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2V4cG9ydC5oCkBAIC0xOTIsOSArMTkyLDkgQEAKIAlzdHJ1Y3Qgb2JkX2ltcG9ydAkqZXhwX2ltcF9yZXZlcnNlOwogCXN0cnVjdCBuaWRfc3RhdAkgICpleHBfbmlkX3N0YXRzOwogCXN0cnVjdCBscHJvY2ZzX3N0YXRzICAgICAqZXhwX21kX3N0YXRzOwotCS8qKiBBY3RpdmUgY29ubmV0aW9uICovCisJLyoqIEFjdGl2ZSBjb25uZWN0aW9uICovCiAJc3RydWN0IHB0bHJwY19jb25uZWN0aW9uICpleHBfY29ubmVjdGlvbjsKLQkvKiogQ29ubmVjdGlvbiBjb3VudCB2YWx1ZSBmcm9tIGxhc3Qgc3VjY2VzZnVsIHJlY29ubmVjdCBycGMgKi8KKwkvKiogQ29ubmVjdGlvbiBjb3VudCB2YWx1ZSBmcm9tIGxhc3Qgc3VjY2Vzc2Z1bCByZWNvbm5lY3QgcnBjICovCiAJX191MzIJCSAgICAgZXhwX2Nvbm5fY250OwogCS8qKiBIYXNoIGxpc3Qgb2YgYWxsIGxkbG0gbG9ja3MgZ3JhbnRlZCBvbiB0aGlzIGV4cG9ydCAqLwogCXN0cnVjdCBjZnNfaGFzaAkgICAgICAgKmV4cF9sb2NrX2hhc2g7CkBAIC0zODAsNiArMzgwLDIzIEBACiAJCXJldHVybiBmYWxzZTsKIH0KIAorc3RhdGljIGlubGluZSBfX3U2NCBleHBfY29ubmVjdF9pYml0cyhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwKQoreworCXN0cnVjdCBvYmRfY29ubmVjdF9kYXRhICpvY2Q7CisKKwlvY2QgPSAmZXhwLT5leHBfY29ubmVjdF9kYXRhOworCXJldHVybiBvY2QtPm9jZF9pYml0c19rbm93bjsKK30KKworc3RhdGljIGlubGluZSBib29sIGltcF9jb25uZWN0X2Rpc3Bfc3RyaXBlKHN0cnVjdCBvYmRfaW1wb3J0ICppbXApCit7CisJc3RydWN0IG9iZF9jb25uZWN0X2RhdGEgKm9jZDsKKworCUxBU1NFUlQoaW1wICE9IE5VTEwpOworCW9jZCA9ICZpbXAtPmltcF9jb25uZWN0X2RhdGE7CisJcmV0dXJuIG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9ESVNQX1NUUklQRTsKK30KKwogZXh0ZXJuIHN0cnVjdCBvYmRfZXhwb3J0ICpjbGFzc19jb25uMmV4cG9ydChzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqY29ubik7CiBleHRlcm4gc3RydWN0IG9iZF9kZXZpY2UgKmNsYXNzX2Nvbm4yb2JkKHN0cnVjdCBsdXN0cmVfaGFuZGxlICpjb25uKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZmlkLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9maWQuaAppbmRleCA4NGE4OTdlLi41ZTdiMzE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9maWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9maWQuaApAQCAtMzM5LDcgKzMzOSw3IEBACiAJc3RydWN0IG11dGV4CQlsY3NfbXV0ZXg7CiAKIAkvKgotCSAqIFJhbmdlIG9mIGFsbG93ZWQgZm9yIGFsbG9jYXRpb24gc2VxdWVjZXMuIFdoZW4gdXNpbmcgbHVfY2xpZW50X3NlcSBvbgorCSAqIFJhbmdlIG9mIGFsbG93ZWQgZm9yIGFsbG9jYXRpb24gc2VxdWVuY2VzLiBXaGVuIHVzaW5nIGx1X2NsaWVudF9zZXEgb24KIAkgKiBjbGllbnRzLCB0aGlzIGNvbnRhaW5zIG1ldGEtc2VxdWVuY2UgcmFuZ2UuIEFuZCBmb3Igc2VydmVycyB0aGlzCiAJICogY29udGFpbnMgc3VwZXItc2VxdWVuY2UgcmFuZ2UuCiAJICovCkBAIC0zOTgsNyArMzk4LDcgQEAKIAkvKiBMVVNUUkVfU0VRX1NFUlZFUiBvciBMVVNUUkVfU0VRX0NPTlRST0xMRVIgKi8KIAllbnVtIGx1X21ncl90eXBlICAgICAgIGxzc190eXBlOwogCi0JLyogQ2xpZW50IGludGVyYWZjZSB0byByZXF1ZXN0IGNvbnRyb2xsZXIgKi8KKwkvKiBDbGllbnQgaW50ZXJmYWNlIHRvIHJlcXVlc3QgY29udHJvbGxlciAqLwogCXN0cnVjdCBsdV9jbGllbnRfc2VxICAgKmxzc19jbGk7CiAKIAkvKiBNdXRleCBmb3IgcHJvdGVjdGluZyBhbGxvY2F0aW9uICovCkBAIC01NjgsMTQgKzU2OCwxNCBAQAogICogZmluYWxseSwgd2hlbiB3ZSByZXBsYWNlIG9zdF9pZCB3aXRoIEZJRCBpbiBkYXRhIHN0YWNrLgogICoKICAqIEN1cnJlbnRseSwgcmVzaWQgZnJvbSB0aGUgb2xkIGNsaWVudCwgd2hvc2UgcmVzWzBdID0gb2JqZWN0X2lkLAotICogcmVzWzFdID0gb2JqZWN0X3NlcSwgaXMganVzdCBvcG9zaXRlIHdpdGggTWV0YXRkYXRhCisgKiByZXNbMV0gPSBvYmplY3Rfc2VxLCBpcyBqdXN0IG9wcG9zaXRlIHdpdGggTWV0YXRkYXRhCiAgKiByZXNpZCwgd2hlcmUsIHJlc1swXSA9IGZpZC0+Zl9zZXEsIHJlc1sxXSA9IGZpZC0+Zl9vaWQuCi0gKiBUbyB1bmlmaXkgdGhlIHJlc2lkIGlkZW50aWZpY2F0aW9uLCB3ZSB3aWxsIHJldmVyc2UgdGhlIGRhdGEKKyAqIFRvIHVuaWZ5IHRoZSByZXNpZCBpZGVudGlmaWNhdGlvbiwgd2Ugd2lsbCByZXZlcnNlIHRoZSBkYXRhCiAgKiByZXNpZCB0byBrZWVwIGl0IHNhbWUgd2l0aCBNZXRhZGF0YSByZXNpZCwgaS5lLgogICoKICAqIEZvciByZXNpZCBmcm9tIHRoZSBvbGQgY2xpZW50LAogICogICAgcmVzWzBdID0gb2JqaWQsICByZXNbMV0gPSAwLCBzdGlsbCBrZWVwIHRoZSBvcmlnaW5hbCBvcmRlciwKLSAqICAgIGZvciBjb21wYXRpYmxpdHkuCisgKiAgICBmb3IgY29tcGF0aWJpbGl0eS4KICAqCiAgKiBGb3IgbmV3IHJlc2lkCiAgKiAgICByZXMgd2lsbCBiZSBidWlsdCBmcm9tIG5vcm1hbCBGSUQgZGlyZWN0bHksIGkuZS4gcmVzWzBdID0gZl9zZXEsCkBAIC02ODUsNyArNjg1LDcgQEAKIHsKIAkvKiBhbGwgb2JqZWN0cyB3aXRoIHNhbWUgaWQgYW5kIGRpZmZlcmVudCB2ZXJzaW9ucyB3aWxsIGJlbG9uZyB0byBzYW1lCiAJICogY29sbGlzaW9ucyBsaXN0LiAqLwotCXJldHVybiBjZnNfaGFzaF9sb25nKGZpZF9mbGF0dGVuKGYpLCBiaXRzKTsKKwlyZXR1cm4gaGFzaF9sb25nKGZpZF9mbGF0dGVuKGYpLCBiaXRzKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9pbXBvcnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ltcG9ydC5oCmluZGV4IDY3MjU5ZWIuLjAxZWQ3ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ltcG9ydC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ltcG9ydC5oCkBAIC0xNTIsNyArMTUyLDcgQEAKIH07CiAKIC8qKgotICogRGVmaW50aW9uIG9mIFBvcnRhbFJQQyBpbXBvcnQgc3RydWN0dXJlLgorICogRGVmaW5pdGlvbiBvZiBQb3J0YWxSUEMgaW1wb3J0IHN0cnVjdHVyZS4KICAqIEltcG9ydHMgYXJlIHJlcHJlc2VudGluZyBjbGllbnQtc2lkZSB2aWV3IHRvIHJlbW90ZSB0YXJnZXQuCiAgKi8KIHN0cnVjdCBvYmRfaW1wb3J0IHsKQEAgLTE4MCw2ICsxODAsMTcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCQlpbXBfZGVsYXllZF9saXN0OwogCS8qKiBAfSAqLwogCisJLyoqCisJICogTGlzdCBvZiByZXF1ZXN0cyB0aGF0IGFyZSByZXRhaW5lZCBmb3IgY29tbWl0dGVkIG9wZW4gcmVwbGF5LiBPbmNlCisJICogb3BlbiBpcyBjb21taXR0ZWQsIG9wZW4gcmVwbGF5IHJlcXVlc3Qgd2lsbCBiZSBtb3ZlZCBmcm9tIHRoZQorCSAqIGltcF9yZXBsYXlfbGlzdCBpbnRvIHRoZSBpbXBfY29tbWl0dGVkX2xpc3QuCisJICogVGhlIGltcF9yZXBsYXlfY3Vyc29yIGlzIGZvciBhY2NlbGVyYXRpbmcgc2VhcmNoaW5nIGR1cmluZyByZXBsYXkuCisJICogQHsKKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCQlpbXBfY29tbWl0dGVkX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAkgICAgICAgKmltcF9yZXBsYXlfY3Vyc29yOworCS8qKiBAfSAqLworCiAJLyoqIG9iZCBkZXZpY2UgZm9yIHRoaXMgaW1wb3J0ICovCiAJc3RydWN0IG9iZF9kZXZpY2UJKmltcF9vYmQ7CiAKQEAgLTIxOSw3ICsyMzAsNyBAQAogCSogYWZ0ZXIgYSBjaGVjayB0byBzYXZlIG9uIHVubmVjZXNzYXJ5IHJlcGxheSBsaXN0IGl0ZXJhdGlvbnMKIAkqLwogCWludAkJICAgICAgIGltcF9sYXN0X2dlbmVyYXRpb25fY2hlY2tlZDsKLQkvKiogTGFzdCB0cmFubm8gd2UgcmVwbGF5ZWQgKi8KKwkvKiogTGFzdCB0cmFuc25vIHdlIHJlcGxheWVkICovCiAJX191NjQJCSAgICAgaW1wX2xhc3RfcmVwbGF5X3RyYW5zbm87CiAJLyoqIExhc3QgdHJhbnNubyBjb21taXR0ZWQgb24gcmVtb3RlIHNpZGUgKi8KIAlfX3U2NAkJICAgICBpbXBfcGVlcl9jb21taXR0ZWRfdHJhbnNubzsKQEAgLTIzNyw3ICsyNDgsNyBAQAogCXN0cnVjdCBsdXN0cmVfaGFuZGxlICAgICAgaW1wX3JlbW90ZV9oYW5kbGU7CiAJLyoqIFdoZW4gdG8gcGVyZm9ybSBuZXh0IHBpbmcuIHRpbWUgaW4gamlmZmllcy4gKi8KIAljZnNfdGltZV90CQlpbXBfbmV4dF9waW5nOwotCS8qKiBXaGVuIHdlIGxhc3Qgc3VjY2VzZnVsbHkgY29ubmVjdGVkLiB0aW1lIGluIDY0Yml0IGppZmZpZXMgKi8KKwkvKiogV2hlbiB3ZSBsYXN0IHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQuIHRpbWUgaW4gNjRiaXQgamlmZmllcyAqLwogCV9fdTY0CQkgICAgIGltcF9sYXN0X3N1Y2Nlc3NfY29ubjsKIAogCS8qKiBMaXN0IG9mIGFsbCBwb3NzaWJsZSBjb25uZWN0aW9uIGZvciBpbXBvcnQuICovCkBAIC0yNjgsNyArMjc5LDcgQEAKIAkJCQkgIGltcF9ub19sb2NrX3JlcGxheToxLAogCQkJCSAgLyogcmVjb3ZlcnkgYnkgdmVyc2lvbnMgd2FzIGZhaWxlZCAqLwogCQkJCSAgaW1wX3Zicl9mYWlsZWQ6MSwKLQkJCQkgIC8qIGZvcmNlIGFuIGltbWlkaWF0ZSBwaW5nICovCisJCQkJICAvKiBmb3JjZSBhbiBpbW1lZGlhdGUgcGluZyAqLwogCQkJCSAgaW1wX2ZvcmNlX3ZlcmlmeToxLAogCQkJCSAgLyogZm9yY2UgYSBzY2hlZHVsZWQgcGluZyAqLwogCQkJCSAgaW1wX2ZvcmNlX25leHRfdmVyaWZ5OjEsCkBAIC0yODEsNyArMjkyLDcgQEAKIAkJCQkgIC8qIG5lZWQgSVIgTU5FIHN3YWIgKi8KIAkJCQkgIGltcF9uZWVkX21uZV9zd2FiOjEsCiAJCQkJICAvKiBpbXBvcnQgbXVzdCBiZSByZWNvbm5lY3RlZCBpbnN0ZWFkIG9mCi0JCQkJICAgKiBjaG91c2UgbmV3IGNvbm5lY3Rpb24gKi8KKwkJCQkgICAqIGNob3NlIG5ldyBjb25uZWN0aW9uICovCiAJCQkJICBpbXBfZm9yY2VfcmVjb25uZWN0OjEsCiAJCQkJICAvKiBpbXBvcnQgaGFzIHRyaWVkIHRvIGNvbm5lY3Qgd2l0aCBzZXJ2ZXIgKi8KIAkJCQkgIGltcF9jb25uZWN0X3RyaWVkOjE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9saWIuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xpYi5oCmluZGV4IDYwOWEwOTAuLjAzNjhjYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xpYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xpYi5oCkBAIC01MzYsNyArNTM2LDcgQEAKIAlpZiAoY29uZGl0aW9uKQkJCQkJCQkgXAogCQlicmVhazsJCQkJCQkJIFwKIAkJCQkJCQkJCSAgICAgICBcCi0JaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCgmX193YWl0KTsJCQkJCSAgICBcCisJaW5pdF93YWl0cXVldWVfZW50cnkoJl9fd2FpdCwgY3VycmVudCk7CQkJCQkgICAgXAogCWxfYWRkX3dhaXQoJndxLCAmX193YWl0KTsJCQkJCSAgICAgIFwKIAkJCQkJCQkJCSAgICAgICBcCiAJLyogQmxvY2sgYWxsIHNpZ25hbHMgKGp1c3QgdGhlIG5vbi1mYXRhbCBvbmVzIGlmIG5vIHRpbWVvdXQpLiAqLyAgICAgICBcCkBAIC01NTgsMTUgKzU1OCwxMyBAQAogCQkJYnJlYWs7CQkJCQkJIFwKIAkJCQkJCQkJCSAgICAgICBcCiAJCWlmIChfX3RpbWVvdXQgPT0gMCkgewkJCQkJICBcCi0JCQl3YWl0cV93YWl0KCZfX3dhaXQsIF9fd3N0YXRlKTsJCSAgICAgXAorCQkJc2NoZWR1bGUoKTsJCQkJCQlcCiAJCX0gZWxzZSB7CQkJCQkJICAgICAgIFwKIAkJCWNmc19kdXJhdGlvbl90IGludGVydmFsID0gaW5mby0+bHdpX2ludGVydmFsPwkgIFwKIAkJCQkJICAgICBtaW5fdChjZnNfZHVyYXRpb25fdCwJICAgICBcCiAJCQkJCQkgaW5mby0+bHdpX2ludGVydmFsLF9fdGltZW91dCk6XAogCQkJCQkgICAgIF9fdGltZW91dDsJCQlcCi0JCQljZnNfZHVyYXRpb25fdCByZW1haW5pbmcgPSB3YWl0cV90aW1lZHdhaXQoJl9fd2FpdCxcCi0JCQkJCQkgICBfX3dzdGF0ZSwJCSAgIFwKLQkJCQkJCSAgIGludGVydmFsKTsJCSAgXAorCQkJY2ZzX2R1cmF0aW9uX3QgcmVtYWluaW5nID0gc2NoZWR1bGVfdGltZW91dChpbnRlcnZhbCk7XAogCQkJX190aW1lb3V0ID0gY2ZzX3RpbWVfc3ViKF9fdGltZW91dCwJCSAgICBcCiAJCQkJCSAgICBjZnNfdGltZV9zdWIoaW50ZXJ2YWwsIHJlbWFpbmluZykpO1wKIAkJCWlmIChfX3RpbWVvdXQgPT0gMCkgewkJCQkgIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xpbmtlYS5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbGlua2VhLmgKaW5kZXggNTc5MGJlOS4uNTAwYWNlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbGlua2VhLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbGlua2VhLmgKQEAgLTMzLDcgKzMzLDcgQEAKIAkgKi8KIAlzdHJ1Y3QgbHVfYnVmCQkqbGRfYnVmOwogCS8qKgotCSAqIFRoZSBtYXRjaGVkIGhlYWRlciwgZW50cnkgYW5kIGl0cyBsZW5naHQgaW4gdGhlIEVBCisJICogVGhlIG1hdGNoZWQgaGVhZGVyLCBlbnRyeSBhbmQgaXRzIGxlbmd0aCBpbiB0aGUgRUEKIAkgKi8KIAlzdHJ1Y3QgbGlua19lYV9oZWFkZXIJKmxkX2xlaDsKIAlzdHJ1Y3QgbGlua19lYV9lbnRyeQkqbGRfbGVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbWRjLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9tZGMuaAppbmRleCBjMWUwMjcwLi40NjhmMzYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9tZGMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9tZGMuaApAQCAtMTY2LDYgKzE2NiwxNyBAQAogdm9pZCBpdF9zZXRfZGlzcG9zaXRpb24oc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LCBpbnQgZmxhZyk7CiBpbnQgaXRfb3Blbl9lcnJvcihpbnQgcGhhc2UsIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCk7CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBjbF9pc19sb3ZfZGVsYXlfY3JlYXRlKHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlyZXR1cm4gKGZsYWdzICYgT19MT1ZfREVMQVlfQ1JFQVRFKSA9PSBPX0xPVl9ERUxBWV9DUkVBVEU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbF9sb3ZfZGVsYXlfY3JlYXRlX2NsZWFyKHVuc2lnbmVkIGludCAqZmxhZ3MpCit7CisJaWYgKCgqZmxhZ3MgJiBPX0xPVl9ERUxBWV9DUkVBVEUpID09IE9fTE9WX0RFTEFZX0NSRUFURSkKKwkJKmZsYWdzICY9IH5PX0xPVl9ERUxBWV9DUkVBVEU7Cit9CisKIC8qKiBAfSBtZGMgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9uZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX25ldC5oCmluZGV4IGQ4ZDA4ODAuLjc0NWFkYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX25ldC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX25ldC5oCkBAIC00NDUsNyArNDQ1LDcgQEAKIAlsbmV0X2hhbmRsZV9tZF90ICAgICAgIHJzX21kX2g7CiAJYXRvbWljX3QJICAgcnNfcmVmY291bnQ7CiAKLQkvKiogQ29udGV4dCBmb3IgdGhlIHNldmljZSB0aHJlYWQgKi8KKwkvKiogQ29udGV4dCBmb3IgdGhlIHNlcnZpY2UgdGhyZWFkICovCiAJc3RydWN0IHB0bHJwY19zdmNfY3R4ICpyc19zdmNfY3R4OwogCS8qKiBSZXBseSBidWZmZXIgKGFjdHVhbGx5IHNlbnQgdG8gdGhlIGNsaWVudCksIGVuY29kZWQgaWYgbmVlZGVkICovCiAJc3RydWN0IGx1c3RyZV9tc2cgICAgICpyc19yZXBidWY7ICAgICAgIC8qIHdyYXBwZXIgKi8KQEAgLTQ1NCw5ICs0NTQsOSBAQAogCS8qKiBTaXplIG9mIHRoZSByZXBseSBtZXNzYWdlICovCiAJaW50CQkgICAgcnNfcmVwZGF0YV9sZW47ICAvKiB3cmFwcGVyIG1zZyBsZW5ndGggKi8KIAkvKioKLQkgKiBBY3R1YWwgcmVwbHkgbWVzc2FnZS4gSXRzIGNvbnRlbnQgaXMgZW5jcnVwdGVkIChpZiBuZWVkZWQpIHRvCisJICogQWN0dWFsIHJlcGx5IG1lc3NhZ2UuIEl0cyBjb250ZW50IGlzIGVuY3J5cHRlZCAoaWYgbmVlZGVkKSB0bwogCSAqIHByb2R1Y2UgcmVwbHkgYnVmZmVyIGZvciBhY3R1YWwgc2VuZGluZy4gSW4gc2ltcGxlIGNhc2UKLQkgKiBvZiBubyBuZXR3b3JrIGVuY3J5cHRpb24gd2UganVzIHNldCBcYSByc19yZXBidWYgdG8gXGEgcnNfbXNnCisJICogb2Ygbm8gbmV0d29yayBlbmNyeXB0aW9uIHdlIGp1c3Qgc2V0IFxhIHJzX3JlcGJ1ZiB0byBcYSByc19tc2cKIAkgKi8KIAlzdHJ1Y3QgbHVzdHJlX21zZyAgICAgKnJzX21zZzsJICAvKiByZXBseSBtZXNzYWdlICovCiAKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogCXNwaW5sb2NrX3QgcHJwX2xvY2s7CiAJLyoqIGxpc3Qgb2YgcHRscnBjX3JlcXVlc3Qgc3RydWN0cyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgcHJwX3JlcV9saXN0OwotCS8qKiBNYXhpbXVtIG1lc3NhZ2Ugc2l6ZSB0aGF0IHdvdWxkIGZpdCBpbnRvIGEgcnF1ZXN0IGZyb20gdGhpcyBwb29sICovCisJLyoqIE1heGltdW0gbWVzc2FnZSBzaXplIHRoYXQgd291bGQgZml0IGludG8gYSByZXF1ZXN0IGZyb20gdGhpcyBwb29sICovCiAJaW50IHBycF9ycV9zaXplOwogCS8qKiBGdW5jdGlvbiB0byBhbGxvY2F0ZSBtb3JlIHJlcXVlc3RzIGZvciB0aGlzIHBvb2wgKi8KIAl2b2lkICgqcHJwX3BvcHVsYXRlKShzdHJ1Y3QgcHRscnBjX3JlcXVlc3RfcG9vbCAqLCBpbnQpOwpAQCAtOTA0LDcgKzkwNCw3IEBACiAJICovCiAJc3RydWN0IG1vZHVsZQkJCSAgKm5jX293bmVyOwogCS8qKgotCSAqIFBvbGljeSByZWdpc3RyYXRpb24gZmxhZ3M7IGEgYml0bWFzdCBvZiBcZSBucnNfcG9saWN5X2ZsYWdzCisJICogUG9saWN5IHJlZ2lzdHJhdGlvbiBmbGFnczsgYSBiaXRtYXNrIG9mIFxlIG5yc19wb2xpY3lfZmxhZ3MKIAkgKi8KIAl1bnNpZ25lZAkJCSAgIG5jX2ZsYWdzOwogfTsKQEAgLTEzNTEsNyArMTM1MSw3IEBACiAJICovCiAJZW51bSBucnNfb3JyX3N1cHAJCW9kX3N1cHA7CiAJLyoqCi0JICogUm91bmQgUm9iaW4gcXVhbnR1bTsgdGhlIG1heGl1bSBudW1iZXIgb2YgUlBDcyB0aGF0IGVhY2ggcmVxdWVzdAorCSAqIFJvdW5kIFJvYmluIHF1YW50dW07IHRoZSBtYXhpbXVtIG51bWJlciBvZiBSUENzIHRoYXQgZWFjaCByZXF1ZXN0CiAJICogYmF0Y2ggZm9yIGVhY2ggb2JqZWN0IG9yIE9TVCBjYW4gaGF2ZSBpbiBhIHNjaGVkdWxpbmcgcm91bmQuCiAJICovCiAJX191MTYJCQkJb2RfcXVhbnR1bTsKQEAgLTE0ODYsNyArMTQ4Niw3IEBACiAJCSAqLwogCQlzdHJ1Y3QgbnJzX2ZpZm9fcmVxCWZpZm87CiAJCS8qKgotCQkgKiBDUlItTiByZXF1ZXN0IGRlZmludGlvbgorCQkgKiBDUlItTiByZXF1ZXN0IGRlZmluaXRpb24KIAkJICovCiAJCXN0cnVjdCBucnNfY3Jybl9yZXEJY3JyOwogCQkvKiogT1JSIGFuZCBUUlIgc2hhcmUgdGhlIHNhbWUgcmVxdWVzdCBkZWZpbml0aW9uICovCkBAIC0xNTUwLDcgKzE1NTAsNyBAQAogCSAqIHJlcXVlc3RzIGluIHRpbWUKIAkgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHJxX3RpbWVkX2xpc3Q7Ci0JLyoqIHNlcnZlci1zaWRlIGhpc3RvcnksIHVzZWQgZm9yIGRlYnVnaW5nIHB1cnBvc2VzLiAqLworCS8qKiBzZXJ2ZXItc2lkZSBoaXN0b3J5LCB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuICovCiAJc3RydWN0IGxpc3RfaGVhZCBycV9oaXN0b3J5X2xpc3Q7CiAJLyoqIHNlcnZlci1zaWRlIHBlci1leHBvcnQgbGlzdCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgcnFfZXhwX2xpc3Q7CkBAIC0xNjExLDcgKzE2MTEsNyBAQAogCWVudW0gcnFfcGhhc2UgcnFfcGhhc2U7IC8qIG9uZSBvZiBSUV9QSEFTRV8qICovCiAJZW51bSBycV9waGFzZSBycV9uZXh0X3BoYXNlOyAvKiBvbmUgb2YgUlFfUEhBU0VfKiB0byBiZSB1c2VkIG5leHQgKi8KIAlhdG9taWNfdCBycV9yZWZjb3VudDsvKiBjbGllbnQtc2lkZSByZWZjb3VudCBmb3IgU0VOVCByYWNlLAotCQkJCSAgICBzZXJ2ZXItc2lkZSByZWZjb3VuZiBmb3IgbXVsdGlwbGUgcmVwbGllcyAqLworCQkJCSAgICBzZXJ2ZXItc2lkZSByZWZjb3VudCBmb3IgbXVsdGlwbGUgcmVwbGllcyAqLwogCiAJLyoqIFBvcnRhbCB0byB3aGljaCB0aGlzIHJlcXVlc3Qgd291bGQgYmUgc2VudCAqLwogCXNob3J0IHJxX3JlcXVlc3RfcG9ydGFsOyAgLyogWFhYIEZJWE1FIGJ1ZyAyNDkgKi8KQEAgLTE2MzcsNyArMTYzNyw3IEBACiAJLyoqIHhpZCAqLwogCV9fdTY0IHJxX3hpZDsKIAkvKioKLQkgKiBMaXN0IGl0ZW0gdG8gZm9yIHJlcGxheSBsaXN0LiBOb3QgeWV0IGNvbW1pdGVkIHJlcXVlc3RzIGdldCBsaW5rZWQKKwkgKiBMaXN0IGl0ZW0gdG8gZm9yIHJlcGxheSBsaXN0LiBOb3QgeWV0IGNvbW1pdHRlZCByZXF1ZXN0cyBnZXQgbGlua2VkCiAJICogdGhlcmUuCiAJICogQWxzbyBzZWUgXGEgcnFfcmVwbGF5IGNvbW1lbnQgYWJvdmUuCiAJICovCkBAIC0xOTUyLDcgKzE5NTIsNyBAQAogCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKIAogLyoqCi0gKiBIZWxwZXIgdGhhdCBkZWNpZGVzIGlmIHdlIG5lZWQgdG8gcHJpbnQgcmVxdWVzdCBhY2NvcmRpZyB0byBjdXJyZW50IGRlYnVnCisgKiBIZWxwZXIgdGhhdCBkZWNpZGVzIGlmIHdlIG5lZWQgdG8gcHJpbnQgcmVxdWVzdCBhY2NvcmRpbmcgdG8gY3VycmVudCBkZWJ1ZwogICogbGV2ZWwgc2V0dGluZ3MKICAqLwogI2RlZmluZSBkZWJ1Z19yZXEobXNnZGF0YSwgbWFzaywgY2RscywgcmVxLCBmbXQsIGEuLi4pCQkJXApAQCAtMTk2Niw3ICsxOTY2LDcgQEAKIH0gd2hpbGUoMCkKIAogLyoqCi0gKiBUaGlzIGlzIHRoZSBkZWJ1ZyBwcmludCBmdW5jdGlvbiB5b3UgbmVlZCB0byB1c2UgdG8gcHJpbnQgcmVxdWVzdCBzdHVydWN0dXJlCisgKiBUaGlzIGlzIHRoZSBkZWJ1ZyBwcmludCBmdW5jdGlvbiB5b3UgbmVlZCB0byB1c2UgdG8gcHJpbnQgcmVxdWVzdCBzdHJ1Y3R1cmUKICAqIGNvbnRlbnQgaW50byBsdXN0cmUgZGVidWcgbG9nLgogICogZm9yIG1vc3QgY2FsbGVycyAobGV2ZWwgaXMgYSBjb25zdGFudCkgdGhpcyBpcyByZXNvbHZlZCBhdCBjb21waWxlIHRpbWUgKi8KICNkZWZpbmUgREVCVUdfUkVRKGxldmVsLCByZXEsIGZtdCwgYXJncy4uLikJCQkJICAgXApAQCAtMjYyMSw2ICsyNjIxLDggQEAKICAqIHJlcXVlc3QgcXVldWVzLCByZXF1ZXN0IG1hbmFnZW1lbnQsIGV0Yy4KICAqIEB7CiAgKi8KK3ZvaWQgcHRscnBjX3JlcXVlc3RfY29tbWl0dGVkKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBpbnQgZm9yY2UpOworCiB2b2lkIHB0bHJwY19pbml0X2NsaWVudChpbnQgcmVxX3BvcnRhbCwgaW50IHJlcF9wb3J0YWwsIGNoYXIgKm5hbWUsCiAJCQlzdHJ1Y3QgcHRscnBjX2NsaWVudCAqKTsKIHZvaWQgcHRscnBjX2NsZWFudXBfY2xpZW50KHN0cnVjdCBvYmRfaW1wb3J0ICppbXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfcXVvdGEuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3F1b3RhLmgKaW5kZXggNzFiNWQ5Ny4uMDdjYjdjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfcXVvdGEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9xdW90YS5oCkBAIC0xNDAsNyArMTQwLDcgQEAKICAqCQkoaS5lLiB3aGVuIC0+bGRvX3JlY292ZXJ5X2NvbXBsZXRlIGlzIGNhbGxlZCkuIFRoaXMgaXMgdXNlZAogICoJCXRvIG5vdGlmeSB0aGUgcXNkIGxheWVyIHRoYXQgcXVvdGEgc2hvdWxkIG5vdyBiZSBlbmZvcmNlZAogICoJCWFnYWluIHZpYSB0aGUgcXNkX29wX2JlZ2luL2VuZCBmdW5jdGlvbnMuIFRoZSBsYXN0IHN0ZXAgb2YgdGhlCi0gKgkJcmVpbnRlZ3JhdGlvbiBwcm9kZWN1cmUgKG5hbWVseSB1c2FnZSByZWNvbmNpbGlhdGlvbikgd2lsbCBiZQorICoJCXJlaW50ZWdyYXRpb24gcHJvY2VkdXJlIChuYW1lbHkgdXNhZ2UgcmVjb25jaWxpYXRpb24pIHdpbGwgYmUKICAqCQljb21wbGV0ZWQgZHVyaW5nIHN0YXJ0LgogICoKICAqIC0gcXNkX2ZpbmkoKTogaXMgdXNlZCB0byByZWxlYXNlIGEgcXNkX2luc3RhbmNlIHN0cnVjdHVyZSBhbGxvY2F0ZWQgd2l0aApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfc2VjLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9zZWMuaAppbmRleCA4ODUyNDdkLi5iZjNlZTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9zZWMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9zZWMuaApAQCAtNTcyLDcgKzU3Miw3IEBACiAJLyoqCiAJICogQ2FsbGVkIHRoZW4gdGhlIHJlZmVyZW5jZSBvZiBcYSBjdHggZHJvcHBlZCB0byAwLiBUaGUgcG9saWN5IG1vZHVsZQogCSAqIGlzIHN1cHBvc2VkIHRvIGRlc3Ryb3kgdGhpcyBjb250ZXh0IG9yIHdoYXRldmVyIGVsc2UgYWNjb3JkaW5nIHRvCi0JICogaXRzIGNhY2hlIG1haW50YWluYW5jZSBtZWNoYW1pc20uCisJICogaXRzIGNhY2hlIG1haW50ZW5hbmNlIG1lY2hhbmlzbS4KIAkgKgogCSAqIFxwYXJhbSBzeW5jIGlmIHplcm8sIHdlIHNob3VsZG4ndCB3YWl0IGZvciB0aGUgY29udGV4dCBiZWluZwogCSAqIGRlc3Ryb3llZCBjb21wbGV0ZWx5LgpAQCAtMTAwMiw3ICsxMDAyLDcgQEAKIHZvaWQgc3B0bHJwY19zZWNfcHV0KHN0cnVjdCBwdGxycGNfc2VjICpzZWMpOwogCiAvKgotICogaW50ZXJuYWwgYXBpcyB3aGljaCBvbmx5IHVzZWQgYnkgcG9saWN5IGltcGVsZW50YXRpb24KKyAqIGludGVybmFsIGFwaXMgd2hpY2ggb25seSB1c2VkIGJ5IHBvbGljeSBpbXBsZW1lbnRhdGlvbgogICovCiBpbnQgIHNwdGxycGNfZ2V0X25leHRfc2VjaWQodm9pZCk7CiB2b2lkIHNwdGxycGNfc2VjX2Rlc3Ryb3koc3RydWN0IHB0bHJwY19zZWMgKnNlYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL21kX29iamVjdC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9tZF9vYmplY3QuaAppbmRleCA3YjQ1YjQ3Li5lZjQ2YjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL21kX29iamVjdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbWRfb2JqZWN0LmgKQEAgLTM1LDcgKzM1LDcgQEAKICAqCiAgKiBsdXN0cmUvaW5jbHVkZS9tZF9vYmplY3QuaAogICoKLSAqIEV4dGVudGlvbiBvZiBsdV9vYmplY3QuaCBmb3IgbWV0YWRhdGEgb2JqZWN0cworICogRXh0ZW5zaW9uIG9mIGx1X29iamVjdC5oIGZvciBtZXRhZGF0YSBvYmplY3RzCiAgKi8KIAogI2lmbmRlZiBfTFVTVFJFX01EX09CSkVDVF9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmQuaAppbmRleCBjMzQ3MGNlLi43MmNmM2ZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkLmgKQEAgLTE1OCw3ICsxNTgsNyBAQAogCS8qIHN0YXRmcyBkYXRhIHNwZWNpZmljIGZvciBldmVyeSBPU0MsIGlmIG5lZWRlZCBhdCBhbGwuICovCiAJc3RydWN0IG9iZF9zdGF0ZnMgICAgICAqb2lfb3NmczsKIAkvKiBBbiB1cGRhdGUgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIHRvIHVwZGF0ZSBzb21lIGRhdGEgb24gdXBwZXIKLQkgKiBsZXZlbC4gRS5nLiBpdCBpcyB1c2VkIGZvciB1cGRhdGUgbHNtLT5sc21fb2luZm8gYXQgZXZlcnkgcmVjaWV2ZWQKKwkgKiBsZXZlbC4gRS5nLiBpdCBpcyB1c2VkIGZvciB1cGRhdGUgbHNtLT5sc21fb2luZm8gYXQgZXZlcnkgcmVjZWl2ZWQKIAkgKiByZXF1ZXN0IGluIG9zYyBsZXZlbCBmb3IgZW5xdWV1ZSByZXF1ZXN0cy4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0bwogCSAqIHVwZGF0ZSBzb21lIGNhbGxlciBkYXRhIGZyb20gTE9WIGxheWVyIGlmIG5lZWRlZC4gKi8KIAlvYmRfZW5xdWV1ZV91cGRhdGVfZiAgICBvaV9jYl91cDsKQEAgLTEwNDIsOCArMTA0Miw4IEBACiB9CiAKIHN0cnVjdCBtZF9vcF9kYXRhIHsKLQlzdHJ1Y3QgbHVfZmlkCSAgIG9wX2ZpZDE7IC8qIG9wZXJhdGlvbiBmaWQxICh1c3VhbHkgcGFyZW50KSAqLwotCXN0cnVjdCBsdV9maWQJICAgb3BfZmlkMjsgLyogb3BlcmF0aW9uIGZpZDIgKHVzdWFseSBjaGlsZCkgKi8KKwlzdHJ1Y3QgbHVfZmlkCSAgIG9wX2ZpZDE7IC8qIG9wZXJhdGlvbiBmaWQxICh1c3VhbGx5IHBhcmVudCkgKi8KKwlzdHJ1Y3QgbHVfZmlkCSAgIG9wX2ZpZDI7IC8qIG9wZXJhdGlvbiBmaWQyICh1c3VhbGx5IGNoaWxkKSAqLwogCXN0cnVjdCBsdV9maWQJICAgb3BfZmlkMzsgLyogMiBleHRyYSBmaWRzIHRvIGZpbmQgY29uZmxpY3RpbmcgKi8KIAlzdHJ1Y3QgbHVfZmlkCSAgIG9wX2ZpZDQ7IC8qIHRvIHRoZSBvcGVyYXRpb24gbG9ja3MuICovCiAJbWRzbm9fdAkJIG9wX21kczsgIC8qIHdoYXQgbWRzIHNlcnZlciBvcGVuIHdpbGwgZ28gdG8gKi8KQEAgLTEzMjMsNyArMTMyMyw4IEBACiAJc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlICptb2Rfb2NoOwogCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAgICAqbW9kX29wZW5fcmVxOwogCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAgICAqbW9kX2Nsb3NlX3JlcTsKLQlhdG9taWNfdAkgICAgICBtb2RfcmVmY291bnQ7CisJYXRvbWljX3QJCSAgbW9kX3JlZmNvdW50OworCWJvb2wJCQkgIG1vZF9pc19jcmVhdGU7CiB9OwogCiBzdHJ1Y3QgbG9va3VwX2ludGVudDsKQEAgLTEzOTIsNyArMTM5Myw3IEBACiAKIAlpbnQgKCptX3NldF9vcGVuX3JlcGxheV9kYXRhKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLAogCQkJCSAgICAgIHN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSAqLAotCQkJCSAgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKTsKKwkJCQkgICAgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqKTsKIAlpbnQgKCptX2NsZWFyX29wZW5fcmVwbGF5X2RhdGEpKHN0cnVjdCBvYmRfZXhwb3J0ICosCiAJCQkJCXN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSAqKTsKIAlpbnQgKCptX3NldF9sb2NrX2RhdGEpKHN0cnVjdCBvYmRfZXhwb3J0ICosIF9fdTY0ICosIHZvaWQgKiwgX191NjQgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZF9jbGFzcy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmRfY2xhc3MuaAppbmRleCA5ODM3MThmLi45ZDFmMjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZF9jbGFzcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkX2NsYXNzLmgKQEAgLTE3NSw5ICsxNzUsMTMgQEAKIAlDT05GSUdfVF9DT05GSUcgID0gMCwKIAlDT05GSUdfVF9TUFRMUlBDID0gMSwKIAlDT05GSUdfVF9SRUNPVkVSID0gMiwKLQlDT05GSUdfVF9NQVggICAgID0gMworCUNPTkZJR19UX1BBUkFNUyAgPSAzLAorCUNPTkZJR19UX01BWCAgICAgPSA0CiB9OwogCisjZGVmaW5lIFBBUkFNU19GSUxFTkFNRQkicGFyYW1zIgorI2RlZmluZSBMQ1RMX1VQQ0FMTAkibGN0bCIKKwogLyogbGlzdCBvZiBhY3RpdmUgY29uZmlndXJhdGlvbiBsb2dzICAqLwogc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgewogCXN0cnVjdCBsZGxtX3Jlc19pZAkgIGNsZF9yZXNpZDsKQEAgLTE4NSw3ICsxODksOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQJCSAgY2xkX2xpc3RfY2hhaW47CiAJYXRvbWljX3QJCWNsZF9yZWZjb3VudDsKIAlzdHJ1Y3QgY29uZmlnX2xsb2dfZGF0YSAgICAqY2xkX3NwdGxycGM7LyogZGVwZW5kZWQgc3B0bHJwYyBsb2cgKi8KLQlzdHJ1Y3QgY29uZmlnX2xsb2dfZGF0YSAgICAqY2xkX3JlY292ZXI7ICAgIC8qIGltcGVyYXRpdmUgcmVjb3ZlciBsb2cgKi8KKwlzdHJ1Y3QgY29uZmlnX2xsb2dfZGF0YQkgICAqY2xkX3BhcmFtczsJLyogY29tbW9uIHBhcmFtZXRlcnMgbG9nICovCisJc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgICAgKmNsZF9yZWNvdmVyOy8qIGltcGVyYXRpdmUgcmVjb3ZlciBsb2cgKi8KIAlzdHJ1Y3Qgb2JkX2V4cG9ydAkgICpjbGRfbWdjZXhwOwogCXN0cnVjdCBtdXRleAkJICAgIGNsZF9sb2NrOwogCWludAkJCSBjbGRfdHlwZTsKQEAgLTE2MjYsNyArMTYzMSw3IEBACiB7CiAJLyogcmV0dXJuczogMCBvbiBoZWFsdGh5CiAJICoJID4wIG9uIHVuaGVhbHRoeSArIHJlYXNvbiBjb2RlL2ZsYWcKLQkgKgkgICAgaG93ZXZlciB0aGUgb25seSBzdXBwb3JlZCByZWFzb24gPT0gMSByaWdodCBub3cKKwkgKgkgICAgaG93ZXZlciB0aGUgb25seSBzdXBwb3J0ZWQgcmVhc29uID09IDEgcmlnaHQgbm93CiAJICoJICAgIFdlJ2xsIG5lZWQgdG8gZGVmaW5lIHNvbWUgYmV0dGVyIHJlYXNvbnMKIAkgKgkgICAgb3IgZmxhZ3MgaW4gdGhlIGZ1dHVyZS4KIAkgKgkgPDAgb24gZXJyb3IKQEAgLTE5OTYsMTEgKzIwMDEsMTEgQEAKIAogc3RhdGljIGlubGluZSBpbnQgbWRfc2V0X29wZW5fcmVwbGF5X2RhdGEoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKIAkJCQkJICBzdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGUgKm9jaCwKLQkJCQkJICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKm9wZW5fcmVxKQorCQkJCQkgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCkKIHsKIAlFWFBfQ0hFQ0tfTURfT1AoZXhwLCBzZXRfb3Blbl9yZXBsYXlfZGF0YSk7CiAJRVhQX01EX0NPVU5URVJfSU5DUkVNRU5UKGV4cCwgc2V0X29wZW5fcmVwbGF5X2RhdGEpOwotCXJldHVybiBNRFAoZXhwLT5leHBfb2JkLCBzZXRfb3Blbl9yZXBsYXlfZGF0YSkoZXhwLCBvY2gsIG9wZW5fcmVxKTsKKwlyZXR1cm4gTURQKGV4cC0+ZXhwX29iZCwgc2V0X29wZW5fcmVwbGF5X2RhdGEpKGV4cCwgb2NoLCBpdCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG1kX2NsZWFyX29wZW5fcmVwbGF5X2RhdGEoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkX3N1cHBvcnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkX3N1cHBvcnQuaAppbmRleCA5NzdiYzIzLi41ZWMzMzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZF9zdXBwb3J0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmRfc3VwcG9ydC5oCkBAIC02ODEsNyArNjgxLDcgQEAKICAqCiAgKiBCZSB2ZXJ5IGNhcmVmdWwgd2hlbiBjaGFuZ2luZyB0aGlzIHZhbHVlLCBlc3BlY2lhbGx5IHdoZW4gZGVjcmVhc2luZyBpdCwKICAqIHNpbmNlIHZtYWxsb2MgaW4gTGludXggZG9lc24ndCBwZXJmb3JtIHdlbGwgb24gbXVsdGktY29yZXMgc3lzdGVtLCBjYWxsaW5nCi0gKiB2bWFsbG9jIGluIGNyaXRpY2FsIHBhdGggd291bGQgaHVydCBwZWZvcm1hbmNlIGJhZGx5LiBTZWUgTFUtNjYuCisgKiB2bWFsbG9jIGluIGNyaXRpY2FsIHBhdGggd291bGQgaHVydCBwZXJmb3JtYW5jZSBiYWRseS4gU2VlIExVLTY2LgogICovCiAjZGVmaW5lIE9CRF9BTExPQ19CSUcgKDQgKiBQQUdFX0NBQ0hFX1NJWkUpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xjbGllbnQvbGNvbW1vbl9jbC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGNsaWVudC9sY29tbW9uX2NsLmMKaW5kZXggOTRiMTY0MS4uNjkwN2ExNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGNsaWVudC9sY29tbW9uX2NsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGNsaWVudC9sY29tbW9uX2NsLmMKQEAgLTExOTYsMTQgKzExOTYsMTQgQEAKIAogCQlia3QgPSBsdV9zaXRlX2JrdF9mcm9tX2ZpZChzaXRlLCAmaGVhZGVyLT5sb2hfZmlkKTsKIAotCQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KCZ3YWl0ZXIpOworCQlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdGVyLCBjdXJyZW50KTsKIAkJYWRkX3dhaXRfcXVldWUoJmJrdC0+bHNiX21hcmNoZV9mdW5lYnJlLCAmd2FpdGVyKTsKIAogCQl3aGlsZSAoMSkgewogCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQkJaWYgKGF0b21pY19yZWFkKCZoZWFkZXItPmxvaF9yZWYpID09IDEpCiAJCQkJYnJlYWs7Ci0JCQl3YWl0cV93YWl0KCZ3YWl0ZXIsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlKCk7CiAJCX0KIAogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2Zsb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fZmxvY2suYwppbmRleCBjOWFhZTEzLi45ODZiZjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fZmxvY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fZmxvY2suYwpAQCAtMjA1LDYgKzIwNSwyNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBsZGxtX2Zsb2NrX2NhbmNlbF9vbl9kZWFkbG9jayhzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrLAorCQkJCQkgIHN0cnVjdCBsaXN0X2hlYWQgKndvcmtfbGlzdCkKK3sKKwlDREVCVUcoRF9JTkZPLCAicmVwcm9jZXNzIGRlYWRsb2NrIHJlcT0lcFxuIiwgbG9jayk7CisKKwlpZiAoKGV4cF9jb25uZWN0X2ZsYWdzKGxvY2stPmxfZXhwb3J0KSAmCisJCQkJT0JEX0NPTk5FQ1RfRkxPQ0tfREVBRCkgPT0gMCkgeworCQlDRVJST1IoCisJCSAgICAgICJkZWFkbG9jayBmb3VuZCwgYnV0IGNsaWVudCBkb2Vzbid0IHN1cHBvcnQgZmxvY2sgY2FuY2VsaWF0aW9uXG4iKTsKKwl9IGVsc2UgeworCQlMQVNTRVJUKGxvY2stPmxfY29tcGxldGlvbl9hc3QpOworCQlMQVNTRVJUKChsb2NrLT5sX2ZsYWdzICYgTERMTV9GTF9BU1RfU0VOVCkgPT0gMCk7CisJCWxvY2stPmxfZmxhZ3MgfD0gTERMTV9GTF9BU1RfU0VOVCB8IExETE1fRkxfQ0FOQ0VMX09OX0JMT0NLIHwKKwkJCUxETE1fRkxfRkxPQ0tfREVBRExPQ0s7CisJCWxkbG1fZmxvY2tfYmxvY2tpbmdfdW5saW5rKGxvY2spOworCQlsZGxtX3Jlc291cmNlX3VubGlua19sb2NrKGxvY2spOworCQlsZGxtX2FkZF9hc3Rfd29ya19pdGVtKGxvY2ssIE5VTEwsIHdvcmtfbGlzdCk7CisJfQorfQorCiAvKioKICAqIFByb2Nlc3MgYSBncmFudGluZyBhdHRlbXB0IGZvciBmbG9jayBsb2NrLgogICogTXVzdCBiZSBjYWxsZWQgdW5kZXIgbnMgbG9jayBoZWxkLgpAQCAtMjcyLDYgKzI5Miw3IEBACiAJCQl9CiAJCX0KIAl9IGVsc2UgeworCQlpbnQgcmVwcm9jZXNzX2ZhaWxlZCA9IDA7CiAJCWxvY2ttb2RlX3ZlcmlmeShtb2RlKTsKIAogCQkvKiBUaGlzIGxvb3AgZGV0ZXJtaW5lcyBpZiB0aGVyZSBhcmUgZXhpc3RpbmcgbG9ja3MKQEAgLTI5Myw4ICszMTQsMTUgQEAKIAkJCWlmICghbGRsbV9mbG9ja3Nfb3ZlcmxhcChsb2NrLCByZXEpKQogCQkJCWNvbnRpbnVlOwogCi0JCQlpZiAoIWZpcnN0X2VucSkKLQkJCQlyZXR1cm4gTERMTV9JVEVSX0NPTlRJTlVFOworCQkJaWYgKCFmaXJzdF9lbnEpIHsKKwkJCQlyZXByb2Nlc3NfZmFpbGVkID0gMTsKKwkJCQlpZiAobGRsbV9mbG9ja19kZWFkbG9jayhyZXEsIGxvY2spKSB7CisJCQkJCWxkbG1fZmxvY2tfY2FuY2VsX29uX2RlYWRsb2NrKHJlcSwKKwkJCQkJCQl3b3JrX2xpc3QpOworCQkJCQlyZXR1cm4gTERMTV9JVEVSX0NPTlRJTlVFOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KIAogCQkJaWYgKCpmbGFncyAmIExETE1fRkxfQkxPQ0tfTk9XQUlUKSB7CiAJCQkJbGRsbV9mbG9ja19kZXN0cm95KHJlcSwgbW9kZSwgKmZsYWdzKTsKQEAgLTMzMCw2ICszNTgsOCBAQAogCQkJKmZsYWdzIHw9IExETE1fRkxfQkxPQ0tfR1JBTlRFRDsKIAkJCXJldHVybiBMRExNX0lURVJfU1RPUDsKIAkJfQorCQlpZiAocmVwcm9jZXNzX2ZhaWxlZCkKKwkJCXJldHVybiBMRExNX0lURVJfQ09OVElOVUU7CiAJfQogCiAJaWYgKCpmbGFncyAmIExETE1fRkxfVEVTVF9MT0NLKSB7CkBAIC02NDYsNyArNjc2LDEwIEBACiAJLyogbGRsbV9sb2NrX2VucXVldWUoKSBoYXMgYWxyZWFkeSBwbGFjZWQgbG9jayBvbiB0aGUgZ3JhbnRlZCBsaXN0LiAqLwogCWxpc3RfZGVsX2luaXQoJmxvY2stPmxfcmVzX2xpbmspOwogCi0JaWYgKGZsYWdzICYgTERMTV9GTF9URVNUX0xPQ0spIHsKKwlpZiAobG9jay0+bF9mbGFncyAmIExETE1fRkxfRkxPQ0tfREVBRExPQ0spIHsKKwkJTERMTV9ERUJVRyhsb2NrLCAiY2xpZW50LXNpZGUgZW5xdWV1ZSBkZWFkbG9jayByZWNlaXZlZCIpOworCQlyYyA9IC1FREVBRExLOworCX0gZWxzZSBpZiAoZmxhZ3MgJiBMRExNX0ZMX1RFU1RfTE9DSykgewogCQkvKiBmY250bChGX0dFVExLKSByZXF1ZXN0ICovCiAJCS8qIFRoZSBvbGQgbW9kZSB3YXMgc2F2ZWQgaW4gZ2V0bGstPmZsX3R5cGUgc28gdGhhdCBpZiB0aGUgbW9kZQogCQkgKiBpbiB0aGUgbG9jayBjaGFuZ2VzIHdlIGNhbiBkZWNyZWYgdGhlIGFwcHJvcHJpYXRlIHJlZmNvdW50LiovCkBAIC02NzIsNyArNzA1LDcgQEAKIAkJbGRsbV9wcm9jZXNzX2Zsb2NrX2xvY2sobG9jaywgJm5vcmVwcm9jLCAxLCAmZXJyLCBOVUxMKTsKIAl9CiAJdW5sb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmM7CiB9CiBFWFBPUlRfU1lNQk9MKGxkbG1fZmxvY2tfY29tcGxldGlvbl9hc3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xvY2suYwppbmRleCA2OTI2MjNiLi4wNTQ4YWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9jay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9sb2NrLmMKQEAgLTE0NSw4ICsxNDUsNiBAQAogCQlyZXR1cm4gImdldHhhdHRyIjsKIAljYXNlIElUX0xBWU9VVDoKIAkJcmV0dXJuICJsYXlvdXQiOwotCWNhc2UgSVRfU0VUWEFUVFI6Ci0JCXJldHVybiAic2V0eGF0dHIiOwogCWRlZmF1bHQ6CiAJCUNFUlJPUigiVW5rbm93biBpbnRlbnQgJWRcbiIsIGl0KTsKIAkJcmV0dXJuICJVTktOT1dOIjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9sb2NrZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xvY2tkLmMKaW5kZXggM2VkMDIwZS4uN2U2M2NmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xvY2tkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xvY2tkLmMKQEAgLTE5Miw4ICsxOTIsOCBAQAogCWlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9MRExNX0NBTkNFTF9CTF9DQl9SQUNFKSkgewogCQlpbnQgdG8gPSBjZnNfdGltZV9zZWNvbmRzKDEpOwogCQl3aGlsZSAodG8gPiAwKSB7Ci0JCQlzY2hlZHVsZV90aW1lb3V0X2FuZF9zZXRfc3RhdGUoCi0JCQkJVEFTS19JTlRFUlJVUFRJQkxFLCB0byk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCh0byk7CiAJCQlpZiAobG9jay0+bF9ncmFudGVkX21vZGUgPT0gbG9jay0+bF9yZXFfbW9kZSB8fAogCQkJICAgIGxvY2stPmxfZmxhZ3MgJiBMRExNX0ZMX0RFU1RST1lFRCkKIAkJCQlicmVhazsKQEAgLTIyOCw2ICsyMjgsNyBAQAogCiAJCQlsb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKIAkJCUxBU1NFUlQobG9jay0+bF9sdmJfZGF0YSA9PSBOVUxMKTsKKwkJCWxvY2stPmxfbHZiX3R5cGUgPSBMVkJfVF9MQVlPVVQ7CiAJCQlsb2NrLT5sX2x2Yl9kYXRhID0gbHZiX2RhdGE7CiAJCQlsb2NrLT5sX2x2Yl9sZW4gPSBsdmJfbGVuOwogCQkJdW5sb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9yZXF1ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVxdWVzdC5jCmluZGV4IGMwZTU0YWUuLmZjYzdhOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3JlcXVlc3QuYwpAQCAtMjk5LDcgKzI5OSw3IEBACiAgKiBBIGhlbHBlciB0byBidWlsZCBhIGJsb2NraW5nIEFTVCBmdW5jdGlvbgogICoKICAqIFBlcmZvcm0gYSBjb21tb24gb3BlcmF0aW9uIGZvciBibG9ja2luZyBBU1RzOgotICogZGVmZmVycmVkIGxvY2sgY2FuY2VsbGF0aW9uLgorICogZGVmZXJyZWQgbG9jayBjYW5jZWxsYXRpb24uCiAgKgogICogXHBhcmFtIGxvY2sgdGhlIGxvY2sgYmxvY2tpbmcgb3IgY2FuY2VsaW5nIEFTVCB3YXMgY2FsbGVkIG9uCiAgKiBccmV0dmFsIDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9yZXNvdXJjZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3Jlc291cmNlLmMKaW5kZXggNWY4OTg2NC4uMjgyNGQ0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3Jlc291cmNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3Jlc291cmNlLmMKQEAgLTQyMSw5ICs0MjEsOSBAQAogCX0gZWxzZSB7CiAJCXZhbCA9IGZpZF9vaWQoJmZpZCk7CiAJfQotCWhhc2ggPSBjZnNfaGFzaF9sb25nKGhhc2gsIGhzLT5oc19ia3RfYml0cyk7CisJaGFzaCA9IGhhc2hfbG9uZyhoYXNoLCBocy0+aHNfYmt0X2JpdHMpOwogCS8qIGdpdmUgbWUgYW5vdGhlciByYW5kb20gZmFjdG9yICovCi0JaGFzaCAtPSBjZnNfaGFzaF9sb25nKCh1bnNpZ25lZCBsb25nKWhzLCB2YWwgJSAxMSArIDMpOworCWhhc2ggLT0gaGFzaF9sb25nKCh1bnNpZ25lZCBsb25nKWhzLCB2YWwgJSAxMSArIDMpOwogCiAJaGFzaCA8PD0gaHMtPmhzX2N1cl9iaXRzIC0gaHMtPmhzX2JrdF9iaXRzOwogCWhhc2ggfD0gbGRsbV9yZXNfaG9wX2hhc2goaHMsIGtleSwgQ0ZTX0hBU0hfTkJLVChocykgLSAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9kZWJ1Zy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2RlYnVnLmMKaW5kZXggZjMwYzg0Zi4uMWU0YzVhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2RlYnVnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2RlYnVnLmMKQEAgLTM2OCw3ICszNjgsNyBAQAogCS8qIHdlJ3JlIGJlaW5nIGNhcmVmdWwgdG8gZW5zdXJlIHRoYXQgdGhlIGtlcm5lbCB0aHJlYWQgaXMKIAkgKiBhYmxlIHRvIHNldCBvdXIgc3RhdGUgdG8gcnVubmluZyBhcyBpdCBleGl0cyBiZWZvcmUgd2UKIAkgKiBnZXQgdG8gc2NoZWR1bGUoKSAqLwotCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQoJndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCWFkZF93YWl0X3F1ZXVlKCZkZWJ1Z19jdGx3cSwgJndhaXQpOwogCkBAIC0zNzksNyArMzc5LDcgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJMdXN0cmVFcnJvcjogY2Fubm90IHN0YXJ0IGxvZyBkdW1wIHRocmVhZDoiCiAJCSAgICAgICAiICVsZFxuIiwgUFRSX0VSUihkdW1wZXIpKTsKIAllbHNlCi0JCXdhaXRxX3dhaXQoJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlKCk7CiAKIAkvKiBiZSBzdXJlIHRvIHRlYXJkb3duIGlmIGNmc19jcmVhdGVfdGhyZWFkKCkgZmFpbGVkICovCiAJcmVtb3ZlX3dhaXRfcXVldWUoJmRlYnVnX2N0bHdxLCAmd2FpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvZmFpbC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2ZhaWwuYwppbmRleCBjNTQ0NDhkLi5iYTQzZmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvZmFpbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9mYWlsLmMKQEAgLTEyNyw4ICsxMjcsOCBAQAogCWlmIChyZXQpIHsKIAkJQ0VSUk9SKCJjZnNfZmFpbF90aW1lb3V0IGlkICV4IHNsZWVwaW5nIGZvciAlZG1zXG4iLAogCQkgICAgICAgaWQsIG1zKTsKLQkJc2NoZWR1bGVfdGltZW91dF9hbmRfc2V0X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFLAotCQkJCQkJICAgY2ZzX3RpbWVfc2Vjb25kcyhtcykgLyAxMDAwKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMobXMpIC8gMTAwMCk7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJCUNFUlJPUigiY2ZzX2ZhaWxfdGltZW91dCBpZCAleCBhd2FrZVxuIiwgaWQpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9rZXJuZWxfdXNlcl9jb21tLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMva2VybmVsX3VzZXJfY29tbS5jCmluZGV4IDdiMmMzMTUuLmI2ZGRjOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9rZXJuZWxfdXNlcl9jb21tLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2tlcm5lbF91c2VyX2NvbW0uYwpAQCAtNDQsMTA2ICs0NCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9saWJjZnMvbGliY2ZzLmg+CiAKLSNpZmRlZiBMVVNUUkVfVVRJTFMKLS8qIFRoaXMgaXMgdGhlIHVzZXJzcGFjZSBzaWRlLiAqLwotCi0vKiogU3RhcnQgdGhlIHVzZXJzcGFjZSBzaWRlIG9mIGEgS1VDIHBpcGUuCi0gKiBAcGFyYW0gbGluayBQcml2YXRlIGRlc2NyaXB0b3IgZm9yIHBpcGUvc29ja2V0LgotICogQHBhcmFtIGdyb3VwcyBLVUMgYnJvYWRjYXN0IGdyb3VwIHRvIGxpc3RlbiB0bwotICoJICAoY2FuIGJlIG51bGwgZm9yIHVuaWNhc3QgdG8gdGhpcyBwaWQpCi0gKi8KLWludCBsaWJjZnNfdWt1Y19zdGFydChsdXN0cmVfa2VybmVsY29tbSAqbGluaywgaW50IGdyb3VwKQotewotCWludCBwZmRbMl07Ci0KLQlpZiAocGlwZShwZmQpIDwgMCkKLQkJcmV0dXJuIC1lcnJubzsKLQotCW1lbXNldChsaW5rLCAwLCBzaXplb2YoKmxpbmspKTsKLQlsaW5rLT5sa19yZmQgPSBwZmRbMF07Ci0JbGluay0+bGtfd2ZkID0gcGZkWzFdOwotCWxpbmstPmxrX2dyb3VwID0gZ3JvdXA7Ci0JbGluay0+bGtfdWlkID0gZ2V0cGlkKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBsaWJjZnNfdWt1Y19zdG9wKGx1c3RyZV9rZXJuZWxjb21tICpsaW5rKQotewotCWlmIChsaW5rLT5sa193ZmQgPiAwKQotCQljbG9zZShsaW5rLT5sa193ZmQpOwotCXJldHVybiBjbG9zZShsaW5rLT5sa19yZmQpOwotfQotCi0jZGVmaW5lIGxoc3ogc2l6ZW9mKCprdWNoKQotCi0vKiogUmVhZCBhIG1lc3NhZ2UgZnJvbSB0aGUgbGluay4KLSAqIEFsbG9jYXRlcyBtZW1vcnksIHJldHVybnMgaGFuZGxlCi0gKgotICogQHBhcmFtIGxpbmsgUHJpdmF0ZSBkZXNjcmlwdG9yIGZvciBwaXBlL3NvY2tldC4KLSAqIEBwYXJhbSBidWYgQnVmZmVyIHRvIHJlYWQgaW50bywgbXVzdCBpbmNsdWRlIHNpemUgZm9yIGt1Y19oZHIKLSAqIEBwYXJhbSBtYXhzaXplIE1heGltdW0gbWVzc2FnZSBzaXplIGFsbG93ZWQKLSAqIEBwYXJhbSB0cmFuc3BvcnQgT25seSBsaXN0ZW4gdG8gbWVzc2FnZXMgb24gdGhpcyB0cmFuc3BvcnQKLSAqICAgICAgKGFuZCB0aGUgZ2VuZXJpYyB0cmFuc3BvcnQpCi0gKi8KLWludCBsaWJjZnNfdWt1Y19tc2dfZ2V0KGx1c3RyZV9rZXJuZWxjb21tICpsaW5rLCBjaGFyICpidWYsIGludCBtYXhzaXplLAotCQkJaW50IHRyYW5zcG9ydCkKLXsKLQlzdHJ1Y3Qga3VjX2hkciAqa3VjaDsKLQlpbnQgcmMgPSAwOwotCi0JbWVtc2V0KGJ1ZiwgMCwgbWF4c2l6ZSk7Ci0KLQlDREVCVUcoRF9LVUMsICJXYWl0aW5nIGZvciBtZXNzYWdlIGZyb20ga2VybmVsIG9uIGZkICVkXG4iLAotCSAgICAgICBsaW5rLT5sa19yZmQpOwotCi0Jd2hpbGUgKDEpIHsKLQkJLyogUmVhZCBoZWFkZXIgZmlyc3QgdG8gZ2V0IG1lc3NhZ2Ugc2l6ZSAqLwotCQlyYyA9IHJlYWQobGluay0+bGtfcmZkLCBidWYsIGxoc3opOwotCQlpZiAocmMgPD0gMCkgewotCQkJcmMgPSAtZXJybm87Ci0JCQlicmVhazsKLQkJfQotCQlrdWNoID0gKHN0cnVjdCBrdWNfaGRyICopYnVmOwotCi0JCUNERUJVRyhEX0tVQywgIlJlY2VpdmVkIG1lc3NhZ2UgbWc9JXggdD0lZCBtPSVkIGw9JWRcbiIsCi0JCSAgICAgICBrdWNoLT5rdWNfbWFnaWMsIGt1Y2gtPmt1Y190cmFuc3BvcnQsIGt1Y2gtPmt1Y19tc2d0eXBlLAotCQkgICAgICAga3VjaC0+a3VjX21zZ2xlbik7Ci0KLQkJaWYgKGt1Y2gtPmt1Y19tYWdpYyAhPSBLVUNfTUFHSUMpIHsKLQkJCUNFUlJPUigiYmFkIG1lc3NhZ2UgbWFnaWMgJXggIT0gJXhcbiIsCi0JCQkgICAgICAga3VjaC0+a3VjX21hZ2ljLCBLVUNfTUFHSUMpOwotCQkJcmMgPSAtRVBST1RPOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoa3VjaC0+a3VjX21zZ2xlbiA+IG1heHNpemUpIHsKLQkJCXJjID0gLUVNU0dTSVpFOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBSZWFkIHBheWxvYWQgKi8KLQkJcmMgPSByZWFkKGxpbmstPmxrX3JmZCwgYnVmICsgbGhzeiwga3VjaC0+a3VjX21zZ2xlbiAtIGxoc3opOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlyYyA9IC1lcnJubzsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChyYyA8IChrdWNoLT5rdWNfbXNnbGVuIC0gbGhzeikpIHsKLQkJCUNFUlJPUigic2hvcnQgcmVhZDogZ290ICVkIG9mICVkIGJ5dGVzXG4iLAotCQkJICAgICAgIHJjLCBrdWNoLT5rdWNfbXNnbGVuKTsKLQkJCXJjID0gLUVQUk9UTzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGt1Y2gtPmt1Y190cmFuc3BvcnQgPT0gdHJhbnNwb3J0IHx8Ci0JCSAgICBrdWNoLT5rdWNfdHJhbnNwb3J0ID09IEtVQ19UUkFOU1BPUlRfR0VORVJJQykgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJLyogRHJvcCBtZXNzYWdlcyBmb3Igb3RoZXIgdHJhbnNwb3J0cyAqLwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLSNlbHNlIC8qIExVU1RSRV9VVElMUyAqLwogLyogVGhpcyBpcyB0aGUga2VybmVsIHNpZGUgKGxpYmx1c3RyZSBhcyB3ZWxsKS4gKi8KIAogLyoqCkBAIC0zMzgsNSArMjM4LDMgQEAKIAlyZXR1cm4gcmM7CiB9CiBFWFBPUlRfU1lNQk9MKGxpYmNmc19ra3VjX2dyb3VwX2ZvcmVhY2gpOwotCi0jZW5kaWYgLyogTFVTVFJFX1VUSUxTICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGliY2ZzX3N0cmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpYmNmc19zdHJpbmcuYwppbmRleCA5MjJkZWJkLi5lZDBhNmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGliY2ZzX3N0cmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saWJjZnNfc3RyaW5nLmMKQEAgLTQyLDI2ICs0Miw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9saWJjZnMvbGliY2ZzLmg+CiAKLS8qIG5vbi0wID0gZG9uJ3QgbWF0Y2ggKi8KLWludCBjZnNfc3RybmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3QgbikKLXsKLQlpZiAoczEgPT0gTlVMTCB8fCBzMiA9PSBOVUxMKQotCQlyZXR1cm4gMTsKLQotCWlmIChuID09IDApCi0JCXJldHVybiAwOwotCi0Jd2hpbGUgKG4tLSAhPSAwICYmIHRvbG93ZXIoKnMxKSA9PSB0b2xvd2VyKCpzMikpIHsKLQkJaWYgKG4gPT0gMCB8fCAqczEgPT0gJ1wwJyB8fCAqczIgPT0gJ1wwJykKLQkJCWJyZWFrOwotCQlzMSsrOwotCQlzMisrOwotCX0KLQotCXJldHVybiB0b2xvd2VyKCoodW5zaWduZWQgY2hhciAqKXMxKSAtIHRvbG93ZXIoKih1bnNpZ25lZCBjaGFyICopczIpOwotfQotRVhQT1JUX1NZTUJPTChjZnNfc3RybmNhc2VjbXApOwotCiAvKiBDb252ZXJ0IGEgdGV4dCBzdHJpbmcgdG8gYSBiaXRtYXNrICovCiBpbnQgY2ZzX3N0cjJtYXNrKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqKCpiaXQyc3RyKShpbnQgYml0KSwKIAkJIGludCAqb2xkbWFzaywgaW50IG1pbm1hc2ssIGludCBhbGxtYXNrKQpAQCAtMTAxLDcgKzgxLDcgQEAKIAkJCWRlYnVnc3RyID0gYml0MnN0cihpKTsKIAkJCWlmIChkZWJ1Z3N0ciAhPSBOVUxMICYmCiAJCQkgICAgc3RybGVuKGRlYnVnc3RyKSA9PSBsZW4gJiYKLQkJCSAgICBjZnNfc3RybmNhc2VjbXAoc3RyLCBkZWJ1Z3N0ciwgbGVuKSA9PSAwKSB7CisJCQkgICAgc3RybmNhc2VjbXAoc3RyLCBkZWJ1Z3N0ciwgbGVuKSA9PSAwKSB7CiAJCQkJaWYgKG9wID09ICctJykKIAkJCQkJbmV3bWFzayAmPSB+KDEgPDwgaSk7CiAJCQkJZWxzZQpAQCAtMTExLDcgKzkxLDcgQEAKIAkJCX0KIAkJfQogCQlpZiAoIWZvdW5kICYmIGxlbiA9PSAzICYmCi0JCSAgICAoY2ZzX3N0cm5jYXNlY21wKHN0ciwgIkFMTCIsIGxlbikgPT0gMCkpIHsKKwkJICAgIChzdHJuY2FzZWNtcChzdHIsICJBTEwiLCBsZW4pID09IDApKSB7CiAJCQlpZiAob3AgPT0gJy0nKQogCQkJCW5ld21hc2sgPSBtaW5tYXNrOwogCQkJZWxzZQpAQCAtMTI5LDcgKzEwOSw2IEBACiAJKm9sZG1hc2sgPSBuZXdtYXNrOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChjZnNfc3RyMm1hc2spOwogCiAvKiBnZXQgdGhlIGZpcnN0IHN0cmluZyBvdXQgb2YgQHN0ciAqLwogY2hhciAqY2ZzX2ZpcnN0c3RyKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUpCkBAIC0xNjQsMTIgKzE0MywxMiBAQAogewogCWNoYXIgKmVuZDsKIAotCXdoaWxlIChjZnNfaXN3aGl0ZSgqc3RyKSkKKwl3aGlsZSAoaXNzcGFjZSgqc3RyKSkKIAkJc3RyKys7CiAKIAllbmQgPSBzdHIgKyBzdHJsZW4oc3RyKTsKIAl3aGlsZSAoZW5kID4gc3RyKSB7Ci0JCWlmICghY2ZzX2lzd2hpdGUoZW5kWy0xXSkpCisJCWlmICghaXNzcGFjZShlbmRbLTFdKSkKIAkJCWJyZWFrOwogCQllbmQtLTsKIAl9CkBAIC0xOTksNyArMTc4LDcgQEAKIAogCS8qIHNraXAgbGVhZGluZyB3aGl0ZSBzcGFjZXMgKi8KIAl3aGlsZSAobmV4dC0+bHNfbGVuKSB7Ci0JCWlmICghY2ZzX2lzd2hpdGUoKm5leHQtPmxzX3N0cikpCisJCWlmICghaXNzcGFjZSgqbmV4dC0+bHNfc3RyKSkKIAkJCWJyZWFrOwogCQluZXh0LT5sc19zdHIrKzsKIAkJbmV4dC0+bHNfbGVuLS07CkBAIC0yMjYsMTQgKzIwNSwxMyBAQAogCiAJLyogc2tpcCBlbmRpbmcgd2hpdGVzcGFjZXMgKi8KIAl3aGlsZSAoLS1lbmQgIT0gcmVzLT5sc19zdHIpIHsKLQkJaWYgKCFjZnNfaXN3aGl0ZSgqZW5kKSkKKwkJaWYgKCFpc3NwYWNlKCplbmQpKQogCQkJYnJlYWs7CiAJfQogCiAJcmVzLT5sc19sZW4gPSBlbmQgLSByZXMtPmxzX3N0ciArIDE7CiAJcmV0dXJuIDE7CiB9Ci1FWFBPUlRfU1lNQk9MKGNmc19nZXR0b2spOwogCiAvKioKICAqIENvbnZlcnRzIHN0cmluZyB0byBpbnRlZ2VyLgpAQCAtMjU2LDEzICsyMzQsMTIgQEAKIAkJcmV0dXJuIDA7CiAKIAlmb3IgKDsgZW5kcCA8IHN0ciArIG5vYjsgZW5kcCsrKSB7Ci0JCWlmICghY2ZzX2lzd2hpdGUoKmVuZHApKQorCQlpZiAoIWlzc3BhY2UoKmVuZHApKQogCQkJcmV0dXJuIDA7CiAJfQogCiAJcmV0dXJuICgqbnVtID49IG1pbiAmJiAqbnVtIDw9IG1heCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGNmc19zdHIybnVtX2NoZWNrKTsKIAogLyoqCiAgKiBQYXJzZXMgXDxyYW5nZV9leHByXD4gdG9rZW4gb2YgdGhlIHN5bnRheC4gSWYgXGEgYnJhY2tldGVkIGlzIGZhbHNlLApAQCAtMjc3LDcgKzI1NCw3IEBACiAgKiBccmV0dmFsIDAgd2lsbCBiZSByZXR1cm5lZCBpZiBpdCBjYW4gYmUgcGFyc2VkLCBvdGhlcndpc2UgLUVJTlZBTCBvcgogICogLUVOT01FTSB3aWxsIGJlIHJldHVybmVkLgogICovCi1pbnQKK3N0YXRpYyBpbnQKIGNmc19yYW5nZV9leHByX3BhcnNlKHN0cnVjdCBjZnNfbHN0ciAqc3JjLCB1bnNpZ25lZCBtaW4sIHVuc2lnbmVkIG1heCwKIAkJICAgICBpbnQgYnJhY2tldGVkLCBzdHJ1Y3QgY2ZzX3JhbmdlX2V4cHIgKipleHByKQogewpAQCAtMzQwLDcgKzMxNyw2IEBACiAJTElCQ0ZTX0ZSRUUocmUsIHNpemVvZigqcmUpKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KLUVYUE9SVF9TWU1CT0woY2ZzX3JhbmdlX2V4cHJfcGFyc2UpOwogCiAvKioKICAqIE1hdGNoZXMgdmFsdWUgKFxhIHZhbHVlKSBhZ2FpbnN0IHJhbmdlcyBleHByZXNzaW9uIGxpc3QgXGEgZXhwcl9saXN0LgpAQCAtMzYxLDcgKzMzNyw2IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woY2ZzX2V4cHJfbGlzdF9tYXRjaCk7CiAKIC8qKgogICogQ29udmVydCBleHByZXNzIGxpc3QgKFxhIGV4cHJfbGlzdCkgdG8gYW4gYXJyYXkgb2YgYWxsIG1hdGNoZWQgdmFsdWVzCkBAIC00MzIsMTggKzQwNyw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNmc19leHByX2xpc3RfZnJlZSk7CiAKLXZvaWQKLWNmc19leHByX2xpc3RfcHJpbnQoc3RydWN0IGNmc19leHByX2xpc3QgKmV4cHJfbGlzdCkKLXsKLQlzdHJ1Y3QgY2ZzX3JhbmdlX2V4cHIgKmV4cHI7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGV4cHIsICZleHByX2xpc3QtPmVsX2V4cHJzLCByZV9saW5rKSB7Ci0JCUNERUJVRyhEX1dBUk5JTkcsICIlZC0lZC8lZFxuIiwKLQkJICAgICAgIGV4cHItPnJlX2xvLCBleHByLT5yZV9oaSwgZXhwci0+cmVfc3RyaWRlKTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGNmc19leHByX2xpc3RfcHJpbnQpOwotCiAvKioKICAqIFBhcnNlcyBcPGNmc19leHByX2xpc3RcPiB0b2tlbiBvZiB0aGUgc3ludGF4LgogICoKQEAgLTUyNiw3ICs0ODksNiBAQAogCQljZnNfZXhwcl9saXN0X2ZyZWUoZWwpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0woY2ZzX2V4cHJfbGlzdF9mcmVlX2xpc3QpOwogCiBpbnQKIGNmc19pcF9hZGRyX3BhcnNlKGNoYXIgKnN0ciwgaW50IGxlbiwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1jcHUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1jcHUuYwppbmRleCA1OGJiMjU2Li43N2IxZWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtY3B1LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LWNwdS5jCkBAIC05NTIsNiArOTUyLDcgQEAKIGNmc19jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCiB7CiAJdW5zaWduZWQgaW50ICBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OworCWJvb2wJICAgICB3YXJuOwogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIENQVV9ERUFEOgpAQCAtOTYyLDkgKzk2MywyMSBAQAogCQljcHRfZGF0YS5jcHRfdmVyc2lvbisrOwogCQlzcGluX3VubG9jaygmY3B0X2RhdGEuY3B0X2xvY2spOwogCWRlZmF1bHQ6Ci0JCUNXQVJOKCJMdXN0cmU6IGNhbid0IHN1cHBvcnQgQ1BVIGhvdHBsdWcgd2VsbCBub3csICIKLQkJICAgICAgInBlcmZvcm1hbmNlIGFuZCBzdGFiaWxpdHkgY291bGQgYmUgaW1wYWN0ZWQiCi0JCSAgICAgICJbQ1BVICV1IG5vdGlmeTogJWx4XVxuIiwgY3B1LCBhY3Rpb24pOworCQlpZiAoYWN0aW9uICE9IENQVV9ERUFEICYmIGFjdGlvbiAhPSBDUFVfREVBRF9GUk9aRU4pIHsKKwkJCUNERUJVRyhEX0lORk8sICJDUFUgY2hhbmdlZCBbY3B1ICV1IGFjdGlvbiAlbHhdXG4iLAorCQkJICAgICAgIGNwdSwgYWN0aW9uKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZG93bigmY3B0X2RhdGEuY3B0X211dGV4KTsKKwkJLyogaWYgYWxsIEhUcyBpbiBhIGNvcmUgYXJlIG9mZmxpbmUsIGl0IG1heSBicmVhayBhZmZpbml0eSAqLworCQljZnNfY3B1X2h0X3NpYmxpbmdzKGNwdSwgY3B0X2RhdGEuY3B0X2NwdW1hc2spOworCQl3YXJuID0gYW55X29ubGluZV9jcHUoKmNwdF9kYXRhLmNwdF9jcHVtYXNrKSA+PSBucl9jcHVfaWRzOworCQl1cCgmY3B0X2RhdGEuY3B0X211dGV4KTsKKwkJQ0RFQlVHKHdhcm4gPyBEX1dBUk5JTkcgOiBEX0lORk8sCisJCSAgICAgICAiTHVzdHJlOiBjYW4ndCBzdXBwb3J0IENQVSBwbHVnLW91dCB3ZWxsIG5vdywgIgorCQkgICAgICAgInBlcmZvcm1hbmNlIGFuZCBzdGFiaWxpdHkgY291bGQgYmUgaW1wYWN0ZWQgIgorCQkgICAgICAgIltDUFUgJXUgYWN0aW9uOiAlbHhdXG4iLCBjcHUsIGFjdGlvbik7CiAJfQogCiAJcmV0dXJuIE5PVElGWV9PSzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1jdXJwcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtY3VycHJvYy5jCmluZGV4IGEyZWY2NGMuLmU3NGMzZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1jdXJwcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LWN1cnByb2MuYwpAQCAtNTUsMjUgKzU1LDEzIEBACiAgKiBmb3IgTGludXgga2VybmVsLgogICovCiAKLWludCAgICBjZnNfY3VycHJvY19ncm91cHNfbnIodm9pZCkKLXsKLQlpbnQgbnI7Ci0KLQl0YXNrX2xvY2soY3VycmVudCk7Ci0JbnIgPSBjdXJyZW50X2NyZWQoKS0+Z3JvdXBfaW5mby0+bmdyb3VwczsKLQl0YXNrX3VubG9jayhjdXJyZW50KTsKLQlyZXR1cm4gbnI7Ci19Ci0KLS8qIEN1cnJlbnRseSBhbGwgdGhlIENGU19DQVBfKiBkZWZpbmVzIG1hdGNoIENBUF8qIG9uZXMuICovCi0jZGVmaW5lIGNmc19jYXBfcGFjayhjYXApIChjYXApCi0jZGVmaW5lIGNmc19jYXBfdW5wYWNrKGNhcCkgKGNhcCkKLQogdm9pZCBjZnNfY2FwX3JhaXNlKGNmc19jYXBfdCBjYXApCiB7CiAJc3RydWN0IGNyZWQgKmNyZWQ7Ci0JaWYgKChjcmVkID0gcHJlcGFyZV9jcmVkcygpKSkgewotCQljYXBfcmFpc2UoY3JlZC0+Y2FwX2VmZmVjdGl2ZSwgY2ZzX2NhcF91bnBhY2soY2FwKSk7CisKKwljcmVkID0gcHJlcGFyZV9jcmVkcygpOworCWlmIChjcmVkKSB7CisJCWNhcF9yYWlzZShjcmVkLT5jYXBfZWZmZWN0aXZlLCBjYXApOwogCQljb21taXRfY3JlZHMoY3JlZCk7CiAJfQogfQpAQCAtODEsNDIgKzY5LDI4IEBACiB2b2lkIGNmc19jYXBfbG93ZXIoY2ZzX2NhcF90IGNhcCkKIHsKIAlzdHJ1Y3QgY3JlZCAqY3JlZDsKLQlpZiAoKGNyZWQgPSBwcmVwYXJlX2NyZWRzKCkpKSB7Ci0JCWNhcF9sb3dlcihjcmVkLT5jYXBfZWZmZWN0aXZlLCBjZnNfY2FwX3VucGFjayhjYXApKTsKKworCWNyZWQgPSBwcmVwYXJlX2NyZWRzKCk7CisJaWYgKGNyZWQpIHsKKwkJY2FwX2xvd2VyKGNyZWQtPmNhcF9lZmZlY3RpdmUsIGNhcCk7CiAJCWNvbW1pdF9jcmVkcyhjcmVkKTsKIAl9CiB9CiAKIGludCBjZnNfY2FwX3JhaXNlZChjZnNfY2FwX3QgY2FwKQogewotCXJldHVybiBjYXBfcmFpc2VkKGN1cnJlbnRfY2FwKCksIGNmc19jYXBfdW5wYWNrKGNhcCkpOworCXJldHVybiBjYXBfcmFpc2VkKGN1cnJlbnRfY2FwKCksIGNhcCk7CiB9CiAKIHZvaWQgY2ZzX2tlcm5lbF9jYXBfcGFjayhrZXJuZWxfY2FwX3Qga2NhcCwgY2ZzX2NhcF90ICpjYXApCiB7Ci0jaWYgZGVmaW5lZCAoX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTikgJiYgX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTiA9PSAweDE5OTgwMzMwCi0JKmNhcCA9IGNmc19jYXBfcGFjayhrY2FwKTsKLSNlbGlmIGRlZmluZWQgKF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT04pICYmIF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT04gPT0gMHgyMDA3MTAyNgotCSpjYXAgPSBjZnNfY2FwX3BhY2soa2NhcFswXSk7Ci0jZWxpZiBkZWZpbmVkKF9LRVJORUxfQ0FQQUJJTElUWV9WRVJTSU9OKSAmJiBfS0VSTkVMX0NBUEFCSUxJVFlfVkVSU0lPTiA9PSAweDIwMDgwNTIyCiAJLyogWFhYIGxvc3QgaGlnaCBieXRlICovCi0JKmNhcCA9IGNmc19jYXBfcGFjayhrY2FwLmNhcFswXSk7Ci0jZWxzZQotCSNlcnJvciAibmVlZCBjb3JyZWN0IF9LRVJORUxfQ0FQQUJJTElUWV9WRVJTSU9OICIKLSNlbmRpZgorCSpjYXAgPSBrY2FwLmNhcFswXTsKIH0KIAogdm9pZCBjZnNfa2VybmVsX2NhcF91bnBhY2soa2VybmVsX2NhcF90ICprY2FwLCBjZnNfY2FwX3QgY2FwKQogewotI2lmIGRlZmluZWQgKF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT04pICYmIF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT04gPT0gMHgxOTk4MDMzMAotCSprY2FwID0gY2ZzX2NhcF91bnBhY2soY2FwKTsKLSNlbGlmIGRlZmluZWQgKF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT04pICYmIF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT04gPT0gMHgyMDA3MTAyNgotCSgqa2NhcClbMF0gPSBjZnNfY2FwX3VucGFjayhjYXApOwotI2VsaWYgZGVmaW5lZChfS0VSTkVMX0NBUEFCSUxJVFlfVkVSU0lPTikgJiYgX0tFUk5FTF9DQVBBQklMSVRZX1ZFUlNJT04gPT0gMHgyMDA4MDUyMgotCWtjYXAtPmNhcFswXSA9IGNmc19jYXBfdW5wYWNrKGNhcCk7Ci0jZWxzZQotCSNlcnJvciAibmVlZCBjb3JyZWN0IF9LRVJORUxfQ0FQQUJJTElUWV9WRVJTSU9OICIKLSNlbmRpZgorCWtjYXAtPmNhcFswXSA9IGNhcDsKIH0KIAogY2ZzX2NhcF90IGNmc19jdXJwcm9jX2NhcF9wYWNrKHZvaWQpCkBAIC0xMjYsMjAgKzEwMCw2IEBACiAJcmV0dXJuIGNhcDsKIH0KIAotdm9pZCBjZnNfY3VycHJvY19jYXBfdW5wYWNrKGNmc19jYXBfdCBjYXApCi17Ci0Jc3RydWN0IGNyZWQgKmNyZWQ7Ci0JaWYgKChjcmVkID0gcHJlcGFyZV9jcmVkcygpKSkgewotCQljZnNfa2VybmVsX2NhcF91bnBhY2soJmNyZWQtPmNhcF9lZmZlY3RpdmUsIGNhcCk7Ci0JCWNvbW1pdF9jcmVkcyhjcmVkKTsKLQl9Ci19Ci0KLWludCBjZnNfY2FwYWJsZShjZnNfY2FwX3QgY2FwKQotewotCXJldHVybiBjYXBhYmxlKGNmc19jYXBfdW5wYWNrKGNhcCkpOwotfQotCiBzdGF0aWMgaW50IGNmc19hY2Nlc3NfcHJvY2Vzc192bShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCSB2b2lkICpidWYsIGludCBsZW4sIGludCB3cml0ZSkKIHsKQEAgLTI5MiwxMyArMjUyLDEwIEBACiB9CiBFWFBPUlRfU1lNQk9MKGNmc19nZXRfZW52aXJvbik7CiAKLUVYUE9SVF9TWU1CT0woY2ZzX2N1cnByb2NfZ3JvdXBzX25yKTsKIEVYUE9SVF9TWU1CT0woY2ZzX2NhcF9yYWlzZSk7CiBFWFBPUlRfU1lNQk9MKGNmc19jYXBfbG93ZXIpOwogRVhQT1JUX1NZTUJPTChjZnNfY2FwX3JhaXNlZCk7CiBFWFBPUlRfU1lNQk9MKGNmc19jdXJwcm9jX2NhcF9wYWNrKTsKLUVYUE9SVF9TWU1CT0woY2ZzX2N1cnByb2NfY2FwX3VucGFjayk7Ci1FWFBPUlRfU1lNQk9MKGNmc19jYXBhYmxlKTsKIAogLyoKICAqIExvY2FsIHZhcmlhYmxlczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1tb2R1bGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1tb2R1bGUuYwppbmRleCA1NTI5NmEzLi5lNmVhZTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LW1vZHVsZS5jCkBAIC0xNTAsMTIgKzE1MCwxMiBAQAogCS8qIEhhbmRsZSBwbGF0Zm9ybS1kZXBlbmRlbnQgSU9DIHJlcXVlc3RzICovCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIElPQ19MSUJDRlNfUEFOSUM6Ci0JCWlmICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQk9PVCkpCisJCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19CT09UKSkKIAkJCXJldHVybiAoLUVQRVJNKTsKIAkJcGFuaWMoImRlYnVnY3RsLWludm9rZWQgcGFuaWMiKTsKIAkJcmV0dXJuICgwKTsKIAljYXNlIElPQ19MSUJDRlNfTUVNSE9HOgotCQlpZiAoIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKKwkJaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKIAkJCXJldHVybiAtRVBFUk07CiAJCS8qIGdvIHRob3VnaHQgKi8KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtcHJpbS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LXByaW0uYwppbmRleCBjN2JjN2ZjLi45YTQwZDE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtcHJpbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1wcmltLmMKQEAgLTQ2LDEzICs0Niw2IEBACiAjaW5jbHVkZSA8YXNtL2tnZGIuaD4KICNlbmRpZgogCi12b2lkCi1pbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KHdhaXRfcXVldWVfdCAqbGluaykKLXsKLQlpbml0X3dhaXRxdWV1ZV9lbnRyeShsaW5rLCBjdXJyZW50KTsKLX0KLUVYUE9SVF9TWU1CT0woaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCk7Ci0KIC8qKgogICogd2FpdF9xdWV1ZV90IG9mIExpbnV4ICh2ZXJzaW9uIDwgMi42LjM0KSBpcyBhIEZJRk8gbGlzdCBmb3IgZXhjbHVzaXZlbHkKICAqIHdhaXRpbmcgdGhyZWFkcywgd2hpY2ggaXMgbm90IGFsd2F5cyBkZXNpcmFibGUgYmVjYXVzZSBhbGwgdGhyZWFkcyB3aWxsCkBAIC03NywzNyArNzAsNiBAQAogfQogRVhQT1JUX1NZTUJPTChhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmVfaGVhZCk7CiAKLXZvaWQKLXdhaXRxX3dhaXQod2FpdF9xdWV1ZV90ICpsaW5rLCBsb25nIHN0YXRlKQotewotCXNjaGVkdWxlKCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHdhaXRxX3dhaXQpOwotCi1pbnQ2NF90Ci13YWl0cV90aW1lZHdhaXQod2FpdF9xdWV1ZV90ICpsaW5rLCBsb25nIHN0YXRlLCBpbnQ2NF90IHRpbWVvdXQpCi17Ci0JcmV0dXJuIHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHdhaXRxX3RpbWVkd2FpdCk7Ci0KLXZvaWQKLXNjaGVkdWxlX3RpbWVvdXRfYW5kX3NldF9zdGF0ZShsb25nIHN0YXRlLCBpbnQ2NF90IHRpbWVvdXQpCi17Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoc3RhdGUpOwotCXNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHNjaGVkdWxlX3RpbWVvdXRfYW5kX3NldF9zdGF0ZSk7Ci0KLS8qIGRlc2NoZWR1bGUgZm9yIGEgYml0Li4uICovCi12b2lkCi1jZnNfcGF1c2UoY2ZzX2R1cmF0aW9uX3QgdGlja3MpCi17Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCXNjaGVkdWxlX3RpbWVvdXQodGlja3MpOwotfQotRVhQT1JUX1NZTUJPTChjZnNfcGF1c2UpOwotCiB2b2lkIGNmc19pbml0X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0KQogewogCWluaXRfdGltZXIodCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbmlkc3RyaW5ncy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL25pZHN0cmluZ3MuYwppbmRleCA3MzJhZTU1Li5jZmIyNzRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbmlkc3RyaW5ncy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9uaWRzdHJpbmdzLmMKQEAgLTY1LDIzICs2NSwyMCBAQAogCXNwaW5fbG9ja19pbml0KCZsaWJjZnNfbmlkc3RyaW5nX2xvY2spOwogfQogCi0jIGRlZmluZSBOSURTVFJfTE9DSyhmKSAgIHNwaW5fbG9ja19pcnFzYXZlKCZsaWJjZnNfbmlkc3RyaW5nX2xvY2ssIGYpCi0jIGRlZmluZSBOSURTVFJfVU5MT0NLKGYpIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpYmNmc19uaWRzdHJpbmdfbG9jaywgZikKLQogc3RhdGljIGNoYXIgKgogbGliY2ZzX25leHRfbmlkc3RyaW5nKHZvaWQpCiB7CiAJY2hhcgkgICpzdHI7CiAJdW5zaWduZWQgbG9uZyAgZmxhZ3M7CiAKLQlOSURTVFJfTE9DSyhmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxpYmNmc19uaWRzdHJpbmdfbG9jaywgZmxhZ3MpOwogCiAJc3RyID0gbGliY2ZzX25pZHN0cmluZ3NbbGliY2ZzX25pZHN0cmluZ19pZHgrK107CiAJaWYgKGxpYmNmc19uaWRzdHJpbmdfaWR4ID09CiAJICAgIHNpemVvZihsaWJjZnNfbmlkc3RyaW5ncykvc2l6ZW9mKGxpYmNmc19uaWRzdHJpbmdzWzBdKSkKIAkJbGliY2ZzX25pZHN0cmluZ19pZHggPSAwOwogCi0JTklEU1RSX1VOTE9DSyhmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGliY2ZzX25pZHN0cmluZ19sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHN0cjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL3RyYWNlZmlsZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL3RyYWNlZmlsZS5jCmluZGV4IDU0MjkwY2UuLmM4NTk5ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy90cmFjZWZpbGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvdHJhY2VmaWxlLmMKQEAgLTEwNzYsMTEgKzEwNzYsMTAgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJfQotCQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KCZfX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmX193YWl0LCBjdXJyZW50KTsKIAkJYWRkX3dhaXRfcXVldWUoJnRjdGwtPnRjdGxfd2FpdHEsICZfX3dhaXQpOwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQl3YWl0cV90aW1lZHdhaXQoJl9fd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFLAotCQkJCSAgICBjZnNfdGltZV9zZWNvbmRzKDEpKTsKKwkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKDEpKTsKIAkJcmVtb3ZlX3dhaXRfcXVldWUoJnRjdGwtPnRjdGxfd2FpdHEsICZfX3dhaXQpOwogCX0KIAljb21wbGV0ZSgmdGN0bC0+dGN0bF9zdG9wKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy91cGNhbGxfY2FjaGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy91cGNhbGxfY2FjaGUuYwppbmRleCAyNDViNDZmLi44MDg1ZTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvdXBjYWxsX2NhY2hlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL3VwY2FsbF9jYWNoZS5jCkBAIC0yMTgsMTMgKzIxOCwxMiBAQAogCQkJICAgICAgTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CiAJCWxvbmcgbGVmdDsKIAotCQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KCZ3YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCQlhZGRfd2FpdF9xdWV1ZSgmZW50cnktPnVlX3dhaXRxLCAmd2FpdCk7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCXNwaW5fdW5sb2NrKCZjYWNoZS0+dWNfbG9jayk7CiAKLQkJbGVmdCA9IHdhaXRxX3RpbWVkd2FpdCgmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFLAotCQkJCQkgICBleHBpcnkpOworCQlsZWZ0ID0gc2NoZWR1bGVfdGltZW91dChleHBpcnkpOwogCiAJCXNwaW5fbG9jaygmY2FjaGUtPnVjX2xvY2spOwogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmZW50cnktPnVlX3dhaXRxLCAmd2FpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvd29ya2l0ZW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy93b3JraXRlbS5jCmluZGV4IDFhNTVjODEuLmJhMTZmZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy93b3JraXRlbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy93b3JraXRlbS5jCkBAIC0zMzQsNyArMzM0LDggQEAKIAkJICAgICAgIHNjaGVkLT53c19udGhyZWFkcywgc2NoZWQtPndzX25hbWUpOwogCiAJCXNwaW5fdW5sb2NrKCZjZnNfd2lfZGF0YS53aV9nbG9jayk7Ci0JCWNmc19wYXVzZShjZnNfdGltZV9zZWNvbmRzKDEpIC8gMjApOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcygxKSAvIDIwKTsKIAkJc3Bpbl9sb2NrKCZjZnNfd2lfZGF0YS53aV9nbG9jayk7CiAJfQogCkBAIC0zODksMTEgKzM5MCwxMSBAQAogCQlzcGluX3VubG9jaygmY2ZzX3dpX2RhdGEud2lfZ2xvY2spOwogCiAJCWlmIChzY2hlZC0+d3NfY3B0YWIgIT0gTlVMTCAmJiBzY2hlZC0+d3NfY3B0ID49IDApIHsKLQkJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzXyUwMmRfJTAyZCIsCisJCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlc18lMDJkXyUwMnUiLAogCQkJCSBzY2hlZC0+d3NfbmFtZSwgc2NoZWQtPndzX2NwdCwKIAkJCQkgc2NoZWQtPndzX250aHJlYWRzKTsKIAkJfSBlbHNlIHsKLQkJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzXyUwMmQiLAorCQkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXNfJTAydSIsCiAJCQkJIHNjaGVkLT53c19uYW1lLCBzY2hlZC0+d3NfbnRocmVhZHMpOwogCQl9CiAKQEAgLTQ1OSw3ICs0NjAsOCBAQAogCiAJCXdoaWxlIChzY2hlZC0+d3NfbnRocmVhZHMgIT0gMCkgewogCQkJc3Bpbl91bmxvY2soJmNmc193aV9kYXRhLndpX2dsb2NrKTsKLQkJCWNmc19wYXVzZShjZnNfdGltZV9zZWNvbmRzKDEpIC8gMjApOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKDEpIC8gMjApOwogCQkJc3Bpbl9sb2NrKCZjZnNfd2lfZGF0YS53aV9nbG9jayk7CiAJCX0KIAkJc3Bpbl91bmxvY2soJmNmc193aV9kYXRhLndpX2dsb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2RjYWNoZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGNhY2hlLmMKaW5kZXggY2JkNjYzZS4uOGI1NTA4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGNhY2hlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGNhY2hlLmMKQEAgLTE2MCw3ICsxNjAsNyBAQAogCS8qIGtlcm5lbCA+PSAyLjYuMzggbGFzdCByZWZjb3VudCBpcyBkZWNyZWFzZWQgYWZ0ZXIgdGhpcyBmdW5jdGlvbi4gKi8KIAlMQVNTRVJUKGRfY291bnQoZGUpID09IDEpOwogCi0JLyogRGlzYWJsZSB0aGlzIHBpZWNlIG9mIGNvZGUgdGVtcHJvYXJpbHkgYmVjYXVzZSB0aGlzIGlzIGNhbGxlZAorCS8qIERpc2FibGUgdGhpcyBwaWVjZSBvZiBjb2RlIHRlbXBvcmFyaWx5IGJlY2F1c2UgdGhpcyBpcyBjYWxsZWQKIAkgKiBpbnNpZGUgZGNhY2hlX2xvY2sgc28gaXQncyBub3QgYXBwcm9wcmlhdGUgdG8gZG8gbG90cyBvZiB3b3JrCiAJICogaGVyZS4gQVRURU5USU9OOiBCZWZvcmUgdGhpcyBwaWVjZSBvZiBjb2RlIGVuYWJsaW5nLCBMVS0yNDg3IG11c3QgYmUKIAkgKiByZXNvbHZlZC4gKi8KQEAgLTE3Niw3ICsxNzYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGxsX3NldF9kZChzdHJ1Y3QgZGVudHJ5ICpkZSkKK2ludCBsbF9kX2luaXQoc3RydWN0IGRlbnRyeSAqZGUpCiB7CiAJTEFTU0VSVChkZSAhPSBOVUxMKTsKIApAQCAtMTkwLDQwICsxOTAsMjIgQEAKIAkJT0JEX0FMTE9DX1BUUihsbGQpOwogCQlpZiAobGlrZWx5KGxsZCAhPSBOVUxMKSkgewogCQkJc3Bpbl9sb2NrKCZkZS0+ZF9sb2NrKTsKLQkJCWlmIChsaWtlbHkoZGUtPmRfZnNkYXRhID09IE5VTEwpKQorCQkJaWYgKGxpa2VseShkZS0+ZF9mc2RhdGEgPT0gTlVMTCkpIHsKIAkJCQlkZS0+ZF9mc2RhdGEgPSBsbGQ7Ci0JCQllbHNlCisJCQkJX19kX2x1c3RyZV9pbnZhbGlkYXRlKGRlKTsKKwkJCX0gZWxzZSB7CiAJCQkJT0JEX0ZSRUVfUFRSKGxsZCk7CisJCQl9CiAJCQlzcGluX3VubG9jaygmZGUtPmRfbG9jayk7CiAJCX0gZWxzZSB7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KKwlMQVNTRVJUKGRlLT5kX29wID09ICZsbF9kX29wcyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGxsX2RvcHNfaW5pdChzdHJ1Y3QgZGVudHJ5ICpkZSwgaW50IGJsb2NrLCBpbnQgaW5pdF9zYSkKLXsKLQlzdHJ1Y3QgbGxfZGVudHJ5X2RhdGEgKmxsZCA9IGxsX2QyZChkZSk7Ci0JaW50IHJjID0gMDsKLQotCWlmIChsbGQgPT0gTlVMTCAmJiBibG9jayAhPSAwKSB7Ci0JCXJjID0gbGxfc2V0X2RkKGRlKTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOwotCi0JCWxsZCA9IGxsX2QyZChkZSk7Ci0JfQotCi0JaWYgKGxsZCAhPSBOVUxMICYmIGluaXRfc2EgIT0gMCkKLQkJbGxkLT5sbGRfc2FfZ2VuZXJhdGlvbiA9IDA7Ci0KLQkvKiBrZXJuZWwgPj0gMi42LjM4IGRfb3AgaXMgc2V0IGluIGRfYWxsb2MoKSAqLwotCUxBU1NFUlQoZGUtPmRfb3AgPT0gJmxsX2Rfb3BzKTsKLQlyZXR1cm4gcmM7Ci19Ci0KIHZvaWQgbGxfaW50ZW50X2Ryb3BfbG9jayhzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQpCiB7CiAJaWYgKGl0LT5pdF9vcCAmJiBpdC0+ZC5sdXN0cmUuaXRfbG9ja19tb2RlKSB7CkBAIC0yNTksOSArMjQxLDYgQEAKIAkJIHB0bHJwY19yZXFfZmluaXNoZWQoaXQtPmQubHVzdHJlLml0X2RhdGEpOyAvKiBsbF9maWxlX29wZW4gKi8KIAlpZiAoaXRfZGlzcG9zaXRpb24oaXQsIERJU1BfRU5RX0NSRUFURV9SRUYpKSAvKiBjcmVhdGUgcmVjICovCiAJCXB0bHJwY19yZXFfZmluaXNoZWQoaXQtPmQubHVzdHJlLml0X2RhdGEpOwotCWlmIChpdF9kaXNwb3NpdGlvbihpdCwgRElTUF9FTlFfQ09NUExFVEUpKSAvKiBzYXZlZCByZXEgZnJvbSByZXZhbGlkYXRlCi0JCQkJCQkgICAgKiB0byBsb29rdXAgKi8KLQkJcHRscnBjX3JlcV9maW5pc2hlZChpdC0+ZC5sdXN0cmUuaXRfZGF0YSk7CiAKIAlpdC0+ZC5sdXN0cmUuaXRfZGlzcG9zaXRpb24gPSAwOwogCWl0LT5kLmx1c3RyZS5pdF9kYXRhID0gTlVMTDsKQEAgLTM0NiwyNjggKzMyNSwzMiBAQAogCiB9CiAKLWludCBsbF9yZXZhbGlkYXRlX2l0KHN0cnVjdCBkZW50cnkgKmRlLCBpbnQgbG9va3VwX2ZsYWdzLAotCQkgICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCkKK3N0YXRpYyBpbnQgbGxfcmV2YWxpZGF0ZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCXVuc2lnbmVkIGludCBsb29rdXBfZmxhZ3MpCiB7Ci0Jc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGE7Ci0Jc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEgPSBOVUxMOwotCXN0cnVjdCBsb29rdXBfaW50ZW50IGxvb2t1cF9pdCA9IHsgLml0X29wID0gSVRfTE9PS1VQIH07Ci0Jc3RydWN0IG9iZF9leHBvcnQgKmV4cDsKLQlzdHJ1Y3QgaW5vZGUgKnBhcmVudCA9IGRlLT5kX3BhcmVudC0+ZF9pbm9kZTsKLQlpbnQgcmM7CisJc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOwogCi0JQ0RFQlVHKERfVkZTVFJBQ0UsICJWRlMgT3A6bmFtZT0lcyxpbnRlbnQ9JXNcbiIsIGRlLT5kX25hbWUubmFtZSwKLQkgICAgICAgTExfSVQyU1RSKGl0KSk7CisJLyoKKwkgKiBpZiBvcGVuJmNyZWF0ZSBpcyBzZXQsIHRhbGsgdG8gTURTIHRvIG1ha2Ugc3VyZSBmaWxlIGlzIGNyZWF0ZWQgaWYKKwkgKiBuZWNlc3NhcnksIGJlY2F1c2Ugd2UgY2FuJ3QgZG8gdGhpcyBpbiAtPm9wZW4oKSBsYXRlciBzaW5jZSB0aGF0J3MKKwkgKiBjYWxsZWQgb24gYW4gaW5vZGUuIHJldHVybiAwIGhlcmUgdG8gbGV0IGxvb2t1cCB0byBoYW5kbGUgdGhpcy4KKwkgKi8KKwlpZiAoKGxvb2t1cF9mbGFncyAmIChMT09LVVBfT1BFTiB8IExPT0tVUF9DUkVBVEUpKSA9PQorCSAgICAoTE9PS1VQX09QRU4gfCBMT09LVVBfQ1JFQVRFKSkKKwkJcmV0dXJuIDA7CiAKLQlpZiAoZGUtPmRfaW5vZGUgPT0gTlVMTCkgewotCQlfX3U2NCBpYml0czsKLQotCQkvKiBXZSBjYW4gb25seSB1c2UgbmVnYXRpdmUgZGVudHJpZXMgaWYgdGhpcyBpcyBzdGF0IG9yIGxvb2t1cCwKLQkJICAgZm9yIG9wZW5zIGFuZCBzdHVmZiB3ZSBkbyBuZWVkIHRvIHF1ZXJ5IHNlcnZlci4gKi8KLQkJLyogSWYgdGhlcmUgaXMgSVRfQ1JFQVQgaW4gaW50ZW50IG9wIHNldCwgdGhlbiB3ZSBtdXN0IHRocm93Ci0JCSAgIGF3YXkgdGhpcyBuZWdhdGl2ZSBkZW50cnkgYW5kIGFjdHVhbGx5IGRvIHRoZSByZXF1ZXN0IHRvCi0JCSAgIGtlcm5lbCB0byBjcmVhdGUgd2hhdGV2ZXIgbmVlZHMgdG8gYmUgY3JlYXRlZCAoaWYgcG9zc2libGUpKi8KLQkJaWYgKGl0ICYmIChpdC0+aXRfb3AgJiBJVF9DUkVBVCkpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAoZF9sdXN0cmVfaW52YWxpZChkZSkpCi0JCQlyZXR1cm4gMDsKLQotCQlpYml0cyA9IE1EU19JTk9ERUxPQ0tfVVBEQVRFOwotCQlyYyA9IGxsX2hhdmVfbWRfbG9jayhwYXJlbnQsICZpYml0cywgTENLX01JTk1PREUpOwotCQlHT1RPKG91dF9zYSwgcmMpOwotCX0KLQotCS8qIE5ldmVyIGV4ZWN1dGUgaW50ZW50cyBmb3IgbW91bnQgcG9pbnRzLgotCSAqIEF0dHJpYnV0ZXMgd2lsbCBiZSBmaXhlZCB1cCBpbiBsbF9pbm9kZV9yZXZhbGlkYXRlX2l0ICovCi0JaWYgKGRfbW91bnRwb2ludChkZSkpCi0JCUdPVE8ob3V0X3NhLCByYyA9IDEpOwotCi0JLyogbmVlZCB0byBnZXQgYXR0cmlidXRlcyBpbiBjYXNlIHJvb3QgZ290IGNoYW5nZWQgZnJvbSBvdGhlciBjbGllbnQgKi8KLQlpZiAoZGUgPT0gZGUtPmRfc2ItPnNfcm9vdCkgewotCQlyYyA9IF9fbGxfaW5vZGVfcmV2YWxpZGF0ZV9pdChkZSwgaXQsIE1EU19JTk9ERUxPQ0tfTE9PS1VQKTsKLQkJaWYgKHJjID09IDApCi0JCQlyYyA9IDE7Ci0JCUdPVE8ob3V0X3NhLCByYyk7Ci0JfQotCi0JZXhwID0gbGxfaTJtZGV4cChkZS0+ZF9pbm9kZSk7Ci0KLQlPQkRfRkFJTF9USU1FT1VUKE9CRF9GQUlMX01EQ19SRVZBTElEQVRFX1BBVVNFLCA1KTsKLQlsbF9mcm9iX2ludGVudCgmaXQsICZsb29rdXBfaXQpOwotCUxBU1NFUlQoaXQpOwotCi0JaWYgKGl0LT5pdF9vcCA9PSBJVF9MT09LVVAgJiYgIWRfbHVzdHJlX2ludmFsaWQoZGUpKQorCWlmIChsb29rdXBfZmxhZ3MgJiAoTE9PS1VQX1BBUkVOVCB8IExPT0tVUF9PUEVOIHwgTE9PS1VQX0NSRUFURSkpCiAJCXJldHVybiAxOwogCi0JaWYgKGl0LT5pdF9vcCA9PSBJVF9PUEVOKSB7Ci0JCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZS0+ZF9pbm9kZTsKLQkJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7Ci0JCXN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSAqKm9jaF9wOwotCQlfX3U2NCBpYml0czsKKwlpZiAoZF9uZWVkX3N0YXRhaGVhZChkaXIsIGRlbnRyeSkgPD0gMCkKKwkJcmV0dXJuIDE7CiAKLQkJLyoKLQkJICogV2UgdXNlZCB0byBjaGVjayBmb3IgTURTX0lOT0RFTE9DS19PUEVOIGhlcmUsIGJ1dCBpbiBmYWN0Ci0JCSAqIGp1c3QgaGF2aW5nIExPT0tVUCBsb2NrIGlzIGVub3VnaCB0byBqdXN0aWZ5IGlub2RlIGlzIHRoZQotCQkgKiBzYW1lLiBBbmQgaWYgaW5vZGUgaXMgdGhlIHNhbWUgYW5kIHdlIGhhdmUgc3VpdGFibGUKLQkJICogb3BlbmhhbmRsZSwgdGhlbiB0aGVyZSBpcyBubyBwb2ludCBpbiBkb2luZyBhbm90aGVyIE9QRU4gUlBDCi0JCSAqIGp1c3QgdG8gdGhyb3cgYXdheSBuZXdseSByZWNlaXZlZCBvcGVuaGFuZGxlLiAgVGhlcmUgYXJlIG5vCi0JCSAqIHNlY3VyaXR5IGltcGxpY2F0aW9ucyB0b28sIGlmIGZpbGUgb3duZXIgb3IgYWNjZXNzIG1vZGUgaXMKLQkJICogY2hhbmdlLCBMT09LVVAgbG9jayBpcyByZXZva2VkLgotCQkgKi8KKwlpZiAobG9va3VwX2ZsYWdzICYgTE9PS1VQX1JDVSkKKwkJcmV0dXJuIC1FQ0hJTEQ7CiAKLQotCQlpZiAoaXQtPml0X2ZsYWdzICYgRk1PREVfV1JJVEUpCi0JCQlvY2hfcCA9ICZsbGktPmxsaV9tZHNfd3JpdGVfb2NoOwotCQllbHNlIGlmIChpdC0+aXRfZmxhZ3MgJiBGTU9ERV9FWEVDKQotCQkJb2NoX3AgPSAmbGxpLT5sbGlfbWRzX2V4ZWNfb2NoOwotCQllbHNlCi0JCQlvY2hfcCA9ICZsbGktPmxsaV9tZHNfcmVhZF9vY2g7Ci0KLQkJLyogQ2hlY2sgZm9yIHRoZSBwcm9wZXIgbG9jay4gKi8KLQkJaWJpdHMgPSBNRFNfSU5PREVMT0NLX0xPT0tVUDsKLQkJaWYgKCFsbF9oYXZlX21kX2xvY2soaW5vZGUsICZpYml0cywgTENLX01JTk1PREUpKQotCQkJZ290byBkb19sb2NrOwotCQltdXRleF9sb2NrKCZsbGktPmxsaV9vY2hfbXV0ZXgpOwotCQlpZiAoKm9jaF9wKSB7IC8qIEV2ZXJ5dGhpbmcgaXMgb3BlbiBhbHJlYWR5LCBkbyBub3RoaW5nICovCi0JCQkvKiBPcmlnaW5hbGx5IGl0IHdhcyBpZGVhIHRvIGRvIG5vdCBsZXQgdGhlbSBzdGVhbCBvdXIKLQkJCSAqIG9wZW4gaGFuZGxlIGZyb20gdW5kZXIgdXMgYnkgKCpvY2hfdXNlY291bnQpKysgaGVyZS4KLQkJCSAqIEJ1dCBpbiBjYXNlIHdlIGhhdmUgdGhlIGhhbmRsZSwgYnV0IHdlIGNhbm5vdCB1c2UgaXQKLQkJCSAqIGR1ZSB0byBsYXRlciBjaGVja3MgKGUuZy4gT19DUkVBVHxPX0VYQ0wgZmxhZ3Mgc2V0KSwKLQkJCSAqIG5vYm9keSB3b3VsZCBkZWNyZW1lbnQgY291bnRlciBpbmNyZWFzZWQgaGVyZS4gU28gd2UKLQkJCSAqIGp1c3QgaG9wZSB0aGUgbG9jayB3b24ndCBiZSBpbnZhbGlkYXRlZCBpbiBiZXR3ZWVuLgotCQkJICogQnV0IGlmIGl0IHdvdWxkIGJlLCB3ZSdsbCByZW9wZW4gdGhlIG9wZW4gcmVxdWVzdCB0bwotCQkJICogTURTIGxhdGVyIGR1cmluZyBmaWxlIG9wZW4gcGF0aC4KLQkJCSAqLwotCQkJbXV0ZXhfdW5sb2NrKCZsbGktPmxsaV9vY2hfbXV0ZXgpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZsbGktPmxsaV9vY2hfbXV0ZXgpOwotCX0KLQotCWlmIChpdC0+aXRfb3AgPT0gSVRfR0VUQVRUUikgewotCQlyYyA9IGxsX3N0YXRhaGVhZF9lbnRlcihwYXJlbnQsICZkZSwgMCk7Ci0JCWlmIChyYyA9PSAxKQotCQkJZ290byBtYXJrOwotCQllbHNlIGlmIChyYyAhPSAtRUFHQUlOICYmIHJjICE9IDApCi0JCQlHT1RPKG91dCwgcmMgPSAwKTsKLQl9Ci0KLWRvX2xvY2s6Ci0Jb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBwYXJlbnQsIGRlLT5kX2lub2RlLAotCQkJCSAgICAgZGUtPmRfbmFtZS5uYW1lLCBkZS0+ZF9uYW1lLmxlbiwKLQkJCQkgICAgIDAsIExVU1RSRV9PUENfQU5ZLCBOVUxMKTsKLQlpZiAoSVNfRVJSKG9wX2RhdGEpKQotCQlyZXR1cm4gUFRSX0VSUihvcF9kYXRhKTsKLQotCWlmICghSVNfUE9TSVhBQ0wocGFyZW50KSB8fCAhZXhwX2Nvbm5lY3RfdW1hc2soZXhwKSkKLQkJaXQtPml0X2NyZWF0ZV9tb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7Ci0JaXQtPml0X2NyZWF0ZV9tb2RlIHw9IE1fQ0hFQ0tfU1RBTEU7Ci0JcmMgPSBtZF9pbnRlbnRfbG9jayhleHAsIG9wX2RhdGEsIE5VTEwsIDAsIGl0LAotCQkJICAgIGxvb2t1cF9mbGFncywKLQkJCSAgICAmcmVxLCBsbF9tZF9ibG9ja2luZ19hc3QsIDApOwotCWl0LT5pdF9jcmVhdGVfbW9kZSAmPSB+TV9DSEVDS19TVEFMRTsKLQlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKLQotCS8qIElmIHJlcSBpcyBOVUxMLCB0aGVuIG1kX2ludGVudF9sb2NrIG9ubHkgdHJpZWQgdG8gZG8gYSBsb2NrIG1hdGNoOwotCSAqIGlmIGFsbCB3YXMgd2VsbCwgaXQgd2lsbCByZXR1cm4gMSBpZiBpdCBmb3VuZCBsb2NrcywgMCBvdGhlcndpc2UuICovCi0JaWYgKHJlcSA9PSBOVUxMICYmIHJjID49IDApIHsKLQkJaWYgKCFyYykKLQkJCWdvdG8gZG9fbG9va3VwOwotCQlHT1RPKG91dCwgcmMpOwotCX0KLQotCWlmIChyYyA8IDApIHsKLQkJaWYgKHJjICE9IC1FU1RBTEUpIHsKLQkJCUNERUJVRyhEX0lORk8sICJsbF9pbnRlbnRfbG9jazogcmMgJWQgOiBpdC0+aXRfc3RhdHVzICIKLQkJCSAgICAgICAiJWRcbiIsIHJjLCBpdC0+ZC5sdXN0cmUuaXRfc3RhdHVzKTsKLQkJfQotCQlHT1RPKG91dCwgcmMgPSAwKTsKLQl9Ci0KLXJldmFsaWRhdGVfZmluaXNoOgotCXJjID0gbGxfcmV2YWxpZGF0ZV9pdF9maW5pc2gocmVxLCBpdCwgZGUpOwotCWlmIChyYyAhPSAwKSB7Ci0JCWlmIChyYyAhPSAtRVNUQUxFICYmIHJjICE9IC1FTk9FTlQpCi0JCQlsbF9pbnRlbnRfcmVsZWFzZShpdCk7Ci0JCUdPVE8ob3V0LCByYyA9IDApOwotCX0KLQotCWlmICgoaXQtPml0X29wICYgSVRfT1BFTikgJiYgZGUtPmRfaW5vZGUgJiYKLQkgICAgIVNfSVNSRUcoZGUtPmRfaW5vZGUtPmlfbW9kZSkgJiYKLQkgICAgIVNfSVNESVIoZGUtPmRfaW5vZGUtPmlfbW9kZSkpIHsKLQkJbGxfcmVsZWFzZV9vcGVuaGFuZGxlKGRlLCBpdCk7Ci0JfQotCXJjID0gMTsKLQotb3V0OgotCS8qIFdlIGRvIG5vdCBmcmVlIHJlcXVlc3QgYXMgaXQgbWF5IGJlIHJldXNlZCBkdXJpbmcgZm9sbG93aW5nIGxvb2t1cAotCSAqIChzZWUgY29tbWVudCBpbiBtZGMvbWRjX2xvY2tzLmM6Om1kY19pbnRlbnRfbG9jaygpKSwgcmVxdWVzdCB3aWxsCi0JICogYmUgZnJlZWQgaW4gbGxfbG9va3VwX2l0IG9yIGluIGxsX2ludGVudF9yZWxlYXNlLiBCdXQgaWYKLQkgKiByZXF1ZXN0IHdhcyBub3QgY29tcGxldGVkLCB3ZSBuZWVkIHRvIGZyZWUgaXQuIChidWcgNTE1NCwgOTkwMykgKi8KLQlpZiAocmVxICE9IE5VTEwgJiYgIWl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX0VOUV9DT01QTEVURSkpCi0JCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKLQlpZiAocmMgPT0gMCkgewotCQkvKiBtZHQgbWF5IGdyYW50IGxheW91dCBsb2NrIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBmaWxlLCBzbwotCQkgKiByZWxlYXNlIHRoZSBsb2NrIHRvIGF2b2lkIGxlYWtpbmcgKi8KLQkJbGxfaW50ZW50X2Ryb3BfbG9jayhpdCk7Ci0JCWxsX2ludmFsaWRhdGVfYWxpYXNlcyhkZS0+ZF9pbm9kZSk7Ci0JfSBlbHNlIHsKLQkJX191NjQgYml0cyA9IDA7Ci0JCV9fdTY0IG1hdGNoZWRfYml0cyA9IDA7Ci0KLQkJQ0RFQlVHKERfREVOVFJZLCAicmV2YWxpZGF0ZWQgZGVudHJ5ICUuKnMgKCVwKSBwYXJlbnQgJXAgIgotCQkgICAgICAgImlub2RlICVwIHJlZmMgJWRcbiIsIGRlLT5kX25hbWUubGVuLAotCQkgICAgICAgZGUtPmRfbmFtZS5uYW1lLCBkZSwgZGUtPmRfcGFyZW50LCBkZS0+ZF9pbm9kZSwKLQkJICAgICAgIGRfY291bnQoZGUpKTsKLQotCQlsbF9zZXRfbG9ja19kYXRhKGV4cCwgZGUtPmRfaW5vZGUsIGl0LCAmYml0cyk7Ci0KLQkJLyogTm90ZTogV2UgaGF2ZSB0byBtYXRjaCBib3RoIExPT0tVUCBhbmQgUEVSTSBsb2NrCi0JCSAqIGhlcmUgdG8gbWFrZSBzdXJlIHRoZSBkZW50cnkgaXMgdmFsaWQgYW5kIG5vIG9uZQotCQkgKiBjaGFuZ2luZyB0aGUgcGVybWlzc2lvbi4KLQkJICogQnV0IGlmIHRoZSBjbGllbnQgY29ubmVjdHMgPCAyLjQgc2VydmVyLCB3aGljaCB3aWxsCi0JCSAqIG9ubHkgZ3JhbnQgTE9PS1VQIGxvY2ssIHNvIHdlIGNhbiBvbmx5IE1hdGNoIExPT0tVUAotCQkgKiBsb2NrIGZvciBvbGQgc2VydmVyICovCi0JCWlmIChleHBfY29ubmVjdF9mbGFncyhsbF9pMm1kZXhwKGRlLT5kX2lub2RlKSkgJiYKLQkJCQkJCQlPQkRfQ09OTkVDVF9MVkJfVFlQRSkKLQkJCW1hdGNoZWRfYml0cyA9Ci0JCQkJTURTX0lOT0RFTE9DS19MT09LVVAgfCBNRFNfSU5PREVMT0NLX1BFUk07Ci0JCWVsc2UKLQkJCW1hdGNoZWRfYml0cyA9IE1EU19JTk9ERUxPQ0tfTE9PS1VQOwotCi0JCWlmICgoKGJpdHMgJiBtYXRjaGVkX2JpdHMpID09IG1hdGNoZWRfYml0cykgJiYKLQkJICAgIGRfbHVzdHJlX2ludmFsaWQoZGUpKQotCQkJZF9sdXN0cmVfcmV2YWxpZGF0ZShkZSk7Ci0JCWxsX2xvb2t1cF9maW5pc2hfbG9ja3MoaXQsIGRlKTsKLQl9Ci0KLW1hcms6Ci0JaWYgKGl0ICE9IE5VTEwgJiYgaXQtPml0X29wID09IElUX0dFVEFUVFIgJiYgcmMgPiAwKQotCQlsbF9zdGF0YWhlYWRfbWFyayhwYXJlbnQsIGRlKTsKLQlyZXR1cm4gcmM7Ci0KLQkvKgotCSAqIFRoaXMgcGFydCBpcyBoZXJlIHRvIGNvbWJhdCBldmlsLWV2aWwgcmFjZSBpbiByZWFsX2xvb2t1cCBvbiAyLjYKLQkgKiBrZXJuZWxzLiAgVGhlIHJhY2UgZGV0YWlscyBhcmU6IFdlIGVudGVyIGRvX2xvb2t1cCgpIGxvb2tpbmcgZm9yIHNvbWUKLQkgKiBuYW1lLCB0aGVyZSBpcyBub3RoaW5nIGluIGRjYWNoZSBmb3IgdGhpcyBuYW1lIHlldCBhbmQgZF9sb29rdXAoKQotCSAqIHJldHVybnMgTlVMTC4gIFdlIHByb2NlZWQgdG8gcmVhbF9sb29rdXAoKSwgYW5kIHdoaWxlIHdlIGRvIHRoaXMsCi0JICogYW5vdGhlciBwcm9jZXNzIGRvZXMgb3BlbiBvbiB0aGUgc2FtZSBmaWxlIHdlIGxvb2tpbmcgdXAgKG1vc3Qgc2ltcGxlCi0JICogcmVwcm9kdWNlciksIG9wZW4gc3VjY2VlZHMgYW5kIHRoZSBkZW50cnkgaXMgYWRkZWQuIE5vdyBiYWNrIHRvCi0JICogdXMuIEluIHJlYWxfbG9va3VwKCkgd2UgZG8gZF9sb29rdXAoKSBhZ2FpbiBhbmQgc3VkZGVubHkgZmluZCB0aGUKLQkgKiBkZW50cnksIHNvIHdlIGNhbGwgZF9yZXZhbGlkYXRlIG9uIGl0LCBidXQgdGhlcmUgaXMgbm8gbG9jaywgc28KLQkgKiB3aXRob3V0IHRoaXMgY29kZSB3ZSB3b3VsZCByZXR1cm4gMCwgYnV0IHVucGF0Y2hlZCByZWFsX2xvb2t1cCBqdXN0Ci0JICogcmV0dXJucyAtRU5PRU5UIGluIHN1Y2ggYSBjYXNlIGluc3RlYWQgb2YgcmV0cnlpbmcgdGhlIGxvb2t1cC4gT25jZQotCSAqIHRoaXMgaXMgZGVhbHQgd2l0aCBpbiByZWFsX2xvb2t1cCgpLCBhbGwgb2YgdGhpcyB1Z2x5IG1lc3MgY2FuIGdvIGFuZAotCSAqIHdlIGNhbiBqdXN0IGNoZWNrIGxvY2tzIGluIC0+ZF9yZXZhbGlkYXRlIHdpdGhvdXQgZG9pbmcgYW55IFJQQ3MKLQkgKiBldmVyLgotCSAqLwotZG9fbG9va3VwOgotCWlmIChpdCAhPSAmbG9va3VwX2l0KSB7Ci0JCS8qIE1EU19JTk9ERUxPQ0tfVVBEQVRFIG5lZWRlZCBmb3IgSVRfR0VUQVRUUiBjYXNlLiAqLwotCQlpZiAoaXQtPml0X29wID09IElUX0dFVEFUVFIpCi0JCQlsb29rdXBfaXQuaXRfb3AgPSBJVF9HRVRBVFRSOwotCQlsbF9sb29rdXBfZmluaXNoX2xvY2tzKGl0LCBkZSk7Ci0JCWl0ID0gJmxvb2t1cF9pdDsKLQl9Ci0KLQkvKiBEbyByZWFsIGxvb2t1cCBoZXJlLiAqLwotCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgcGFyZW50LCBOVUxMLCBkZS0+ZF9uYW1lLm5hbWUsCi0JCQkJICAgICBkZS0+ZF9uYW1lLmxlbiwgMCwgKGl0LT5pdF9vcCAmIElUX0NSRUFUID8KLQkJCQkJCQkgTFVTVFJFX09QQ19DUkVBVEUgOgotCQkJCQkJCSBMVVNUUkVfT1BDX0FOWSksIE5VTEwpOwotCWlmIChJU19FUlIob3BfZGF0YSkpCi0JCXJldHVybiBQVFJfRVJSKG9wX2RhdGEpOwotCi0JcmMgPSBtZF9pbnRlbnRfbG9jayhleHAsIG9wX2RhdGEsIE5VTEwsIDAsICBpdCwgMCwgJnJlcSwKLQkJCSAgICBsbF9tZF9ibG9ja2luZ19hc3QsIDApOwotCWlmIChyYyA+PSAwKSB7Ci0JCXN0cnVjdCBtZHRfYm9keSAqbWR0X2JvZHk7Ci0JCXN0cnVjdCBsdV9maWQgZmlkID0gey5mX3NlcSA9IDAsIC5mX29pZCA9IDAsIC5mX3ZlciA9IDB9OwotCQltZHRfYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7Ci0KLQkJaWYgKGRlLT5kX2lub2RlKQotCQkJZmlkID0gKmxsX2lub2RlMmZpZChkZS0+ZF9pbm9kZSk7Ci0KLQkJLyogc2VlIGlmIHdlIGdvdCBzYW1lIGlub2RlLCBpZiBub3QgLSByZXR1cm4gZXJyb3IgKi8KLQkJaWYgKGx1X2ZpZF9lcSgmZmlkLCAmbWR0X2JvZHktPmZpZDEpKSB7Ci0JCQlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKLQkJCW9wX2RhdGEgPSBOVUxMOwotCQkJZ290byByZXZhbGlkYXRlX2ZpbmlzaDsKLQkJfQotCQlsbF9pbnRlbnRfcmVsZWFzZShpdCk7Ci0JfQotCWxsX2ZpbmlzaF9tZF9vcF9kYXRhKG9wX2RhdGEpOwotCUdPVE8ob3V0LCByYyA9IDApOwotCi1vdXRfc2E6Ci0JLyoKLQkgKiBGb3IgcmMgPT0gMSBjYXNlLCBzaG91bGQgbm90IHJldHVybiBkaXJlY3RseSB0byBwcmV2ZW50IGxvc2luZwotCSAqIHN0YXRhaGVhZCB3aW5kb3dzOyBmb3IgcmMgPT0gMCBjYXNlLCB0aGUgImxvb2t1cCIgd2lsbCBiZSBkb25lIGxhdGVyLgotCSAqLwotCWlmIChpdCAhPSBOVUxMICYmIGl0LT5pdF9vcCA9PSBJVF9HRVRBVFRSICYmIHJjID09IDEpCi0JCWxsX3N0YXRhaGVhZF9lbnRlcihwYXJlbnQsICZkZSwgMSk7Ci0JZ290byBtYXJrOworCWRvX3N0YXRhaGVhZF9lbnRlcihkaXIsICZkZW50cnksIGRlbnRyeS0+ZF9pbm9kZSA9PSBOVUxMKTsKKwlsbF9zdGF0YWhlYWRfbWFyayhkaXIsIGRlbnRyeSk7CisJcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC02MTUsMjQgKzM1OCwxMyBAQAogICovCiBpbnQgbGxfcmV2YWxpZGF0ZV9uZChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHVuc2lnbmVkIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgaW5vZGUgKnBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7Ci0JaW50IHVucGx1ZyA9IDA7CisJaW50IHJjOwogCi0JQ0RFQlVHKERfVkZTVFJBQ0UsICJWRlMgT3A6bmFtZT0lcyxmbGFncz0ldVxuIiwKKwlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDpuYW1lPSVzLCBmbGFncz0ldVxuIiwKIAkgICAgICAgZGVudHJ5LT5kX25hbWUubmFtZSwgZmxhZ3MpOwogCi0JaWYgKCEoZmxhZ3MgJiAoTE9PS1VQX1BBUkVOVHxMT09LVVBfT1BFTnxMT09LVVBfQ1JFQVRFKSkgJiYKLQkgICAgbGxfbmVlZF9zdGF0YWhlYWQocGFyZW50LCBkZW50cnkpID4gMCkgewotCQlpZiAoZmxhZ3MgJiBMT09LVVBfUkNVKQotCQkJcmV0dXJuIC1FQ0hJTEQ7Ci0KLQkJaWYgKGRlbnRyeS0+ZF9pbm9kZSA9PSBOVUxMKQotCQkJdW5wbHVnID0gMTsKLQkJZG9fc3RhdGFoZWFkX2VudGVyKHBhcmVudCwgJmRlbnRyeSwgdW5wbHVnKTsKLQkJbGxfc3RhdGFoZWFkX21hcmsocGFyZW50LCBkZW50cnkpOwotCX0KLQotCXJldHVybiAxOworCXJjID0gbGxfcmV2YWxpZGF0ZV9kZW50cnkoZGVudHJ5LCBmbGFncyk7CisJcmV0dXJuIHJjOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2Rpci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGlyLmMKaW5kZXggNTJiNzczMS4uN2ZiYzE4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGlyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGlyLmMKQEAgLTM2Miw3ICszNjIsNyBAQAogCQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3Q7CiAJCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhOwogCi0JCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgZGlyLCBOVUxMLCBOVUxMLCAwLCAwLAorCQlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIGRpciwgZGlyLCBOVUxMLCAwLCAwLAogCQlMVVNUUkVfT1BDX0FOWSwgTlVMTCk7CiAJCWlmIChJU19FUlIob3BfZGF0YSkpCiAJCQlyZXR1cm4gKHZvaWQgKilvcF9kYXRhOwpAQCAtMTA0OCwyMCArMTA0OCwyNSBAQAogfQogCiAKLXN0YXRpYyBpbnQgY29weV9hbmRfaW9jdGwoaW50IGNtZCwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgdm9pZCAqZGF0YSwgaW50IGxlbikKK3N0YXRpYyBpbnQgY29weV9hbmRfaW9jdGwoaW50IGNtZCwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJCSAgY29uc3Qgdm9pZCBfX3VzZXIgKmRhdGEsIHNpemVfdCBzaXplKQogewotCXZvaWQgKnB0cjsKKwl2b2lkICpjb3B5OwogCWludCByYzsKIAotCU9CRF9BTExPQyhwdHIsIGxlbik7Ci0JaWYgKHB0ciA9PSBOVUxMKQorCU9CRF9BTExPQyhjb3B5LCBzaXplKTsKKwlpZiAoY29weSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAoY29weV9mcm9tX3VzZXIocHRyLCBkYXRhLCBsZW4pKSB7Ci0JCU9CRF9GUkVFKHB0ciwgbGVuKTsKLQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoY29weSwgZGF0YSwgc2l6ZSkpIHsKKwkJcmMgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKIAl9Ci0JcmMgPSBvYmRfaW9jb250cm9sKGNtZCwgZXhwLCBsZW4sIGRhdGEsIE5VTEwpOwotCU9CRF9GUkVFKHB0ciwgbGVuKTsKKworCXJjID0gb2JkX2lvY29udHJvbChjbWQsIGV4cCwgc2l6ZSwgY29weSwgTlVMTCk7CitvdXQ6CisJT0JEX0ZSRUUoY29weSwgc2l6ZSk7CisKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTEwODAsNyArMTA4NSw3IEBACiAJY2FzZSBRX1FVT1RBT0ZGOgogCWNhc2UgUV9TRVRRVU9UQToKIAljYXNlIFFfU0VUSU5GTzoKLQkJaWYgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikgfHwKKwkJaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSB8fAogCQkgICAgc2JpLT5sbF9mbGFncyAmIExMX1NCSV9STVRfQ0xJRU5UKQogCQkJcmV0dXJuIC1FUEVSTTsKIAkJYnJlYWs7CkBAIC0xMDg5LDcgKzEwOTQsNyBAQAogCQkgICAgICAhdWlkX2VxKGN1cnJlbnRfZXVpZCgpLCBtYWtlX2t1aWQoJmluaXRfdXNlcl9ucywgaWQpKSkgfHwKIAkJICAgICAodHlwZSA9PSBHUlBRVU9UQSAmJgogCQkgICAgICAhaW5fZWdyb3VwX3AobWFrZV9rZ2lkKCZpbml0X3VzZXJfbnMsIGlkKSkpKSAmJgotCQkgICAgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikgfHwKKwkJICAgICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikgfHwKIAkJICAgICBzYmktPmxsX2ZsYWdzICYgTExfU0JJX1JNVF9DTElFTlQpKQogCQkJcmV0dXJuIC1FUEVSTTsKIAkJYnJlYWs7CkBAIC0xMzk1LDcgKzE0MDAsNyBAQAogCQlpZiAodG1wID09IE5VTEwpCiAJCQlHT1RPKGZyZWVfbG12LCByYyA9IC1FTk9NRU0pOwogCi0JCW1lbWNweSh0bXAsICZsdW0sIHNpemVvZihsdW0pKTsKKwkJKnRtcCA9IGx1bTsKIAkJdG1wLT5sdW1fdHlwZSA9IExNVl9TVFJJUEVfVFlQRTsKIAkJdG1wLT5sdW1fc3RyaXBlX2NvdW50ID0gMTsKIAkJbWR0aW5kZXggPSBsbF9nZXRfbWR0X2lkeChpbm9kZSk7CkBAIC0xNTk3LDcgKzE2MDIsNyBAQAogCQlzdHJ1Y3Qgb2JkX3F1b3RhY3RsICpvcWN0bDsKIAkJaW50IGVycm9yID0gMDsKIAotCQlpZiAoIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSB8fAorCQlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pIHx8CiAJCSAgICBzYmktPmxsX2ZsYWdzICYgTExfU0JJX1JNVF9DTElFTlQpCiAJCQlyZXR1cm4gLUVQRVJNOwogCkBAIC0xNjIxLDcgKzE2MjYsNyBAQAogCWNhc2UgT0JEX0lPQ19QT0xMX1FVT1RBQ0hFQ0s6IHsKIAkJc3RydWN0IGlmX3F1b3RhY2hlY2sgKmNoZWNrOwogCi0JCWlmICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pIHx8CisJCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikgfHwKIAkJICAgIHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfUk1UX0NMSUVOVCkKIAkJCXJldHVybiAtRVBFUk07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2ZpbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2ZpbGUuYwppbmRleCBjMTI4MjFhLi44ZTg0NGE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9maWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZmlsZS5jCkBAIC0yMDUsNyArMjA1LDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBsbF9tZF9yZWFsX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmbGFncykKK2ludCBsbF9tZF9yZWFsX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGZtb2RlX3QgZm1vZGUpCiB7CiAJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CiAJc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlICoqb2NoX3A7CkBAIC0yMTMsMzAgKzIxMywzMyBAQAogCV9fdTY0ICpvY2hfdXNlY291bnQ7CiAJaW50IHJjID0gMDsKIAotCWlmIChmbGFncyAmIEZNT0RFX1dSSVRFKSB7CisJaWYgKGZtb2RlICYgRk1PREVfV1JJVEUpIHsKIAkJb2NoX3AgPSAmbGxpLT5sbGlfbWRzX3dyaXRlX29jaDsKIAkJb2NoX3VzZWNvdW50ID0gJmxsaS0+bGxpX29wZW5fZmRfd3JpdGVfY291bnQ7Ci0JfSBlbHNlIGlmIChmbGFncyAmIEZNT0RFX0VYRUMpIHsKKwl9IGVsc2UgaWYgKGZtb2RlICYgRk1PREVfRVhFQykgewogCQlvY2hfcCA9ICZsbGktPmxsaV9tZHNfZXhlY19vY2g7CiAJCW9jaF91c2Vjb3VudCA9ICZsbGktPmxsaV9vcGVuX2ZkX2V4ZWNfY291bnQ7CiAJfSBlbHNlIHsKLQkJTEFTU0VSVChmbGFncyAmIEZNT0RFX1JFQUQpOworCQlMQVNTRVJUKGZtb2RlICYgRk1PREVfUkVBRCk7CiAJCW9jaF9wID0gJmxsaS0+bGxpX21kc19yZWFkX29jaDsKIAkJb2NoX3VzZWNvdW50ID0gJmxsaS0+bGxpX29wZW5fZmRfcmVhZF9jb3VudDsKIAl9CiAKIAltdXRleF9sb2NrKCZsbGktPmxsaV9vY2hfbXV0ZXgpOwotCWlmICgqb2NoX3VzZWNvdW50KSB7IC8qIFRoZXJlIGFyZSBzdGlsbCB1c2VycyBvZiB0aGlzIGhhbmRsZSwgc28KLQkJCQlza2lwIGZyZWVpbmcgaXQuICovCisJaWYgKCpvY2hfdXNlY291bnQgPiAwKSB7CisJCS8qIFRoZXJlIGFyZSBzdGlsbCB1c2VycyBvZiB0aGlzIGhhbmRsZSwgc28gc2tpcAorCQkgKiBmcmVlaW5nIGl0LiAqLwogCQltdXRleF91bmxvY2soJmxsaS0+bGxpX29jaF9tdXRleCk7CiAJCXJldHVybiAwOwogCX0KKwogCW9jaD0qb2NoX3A7CiAJKm9jaF9wID0gTlVMTDsKIAltdXRleF91bmxvY2soJmxsaS0+bGxpX29jaF9tdXRleCk7CiAKLQlpZiAob2NoKSB7IC8qIFRoZXJlIG1pZ2h0IGJlIGEgcmFjZSBhbmQgc29tZWJvZHkgaGF2ZSBmcmVlZCB0aGlzIG9jaAotCQkgICAgICBhbHJlYWR5ICovCisJaWYgKG9jaCAhPSBOVUxMKSB7CisJCS8qIFRoZXJlIG1pZ2h0IGJlIGEgcmFjZSBhbmQgdGhpcyBoYW5kbGUgbWF5IGFscmVhZHkKKwkJICAgYmUgY2xvc2VkLiAqLwogCQlyYyA9IGxsX2Nsb3NlX2lub2RlX29wZW5oYW5kbGUobGxfaTJzYmkoaW5vZGUpLT5sbF9tZF9leHAsCiAJCQkJCSAgICAgICBpbm9kZSwgb2NoLCBOVUxMKTsKIAl9CkBAIC00NDMsOCArNDQ2LDcgQEAKIAkJCQkgaXRwLCBOVUxMKTsKIAogb3V0OgotCXB0bHJwY19yZXFfZmluaXNoZWQoaXRwLT5kLmx1c3RyZS5pdF9kYXRhKTsKLQlpdF9jbGVhcl9kaXNwb3NpdGlvbihpdHAsIERJU1BfRU5RX0NPTVBMRVRFKTsKKwlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CiAJbGxfaW50ZW50X2Ryb3BfbG9jayhpdHApOwogCiAJcmV0dXJuIHJjOwpAQCAtNDc3LDcgKzQ3OSw3IEBACiAJb2NoLT5vY2hfbWFnaWMgPSBPQkRfQ0xJRU5UX0hBTkRMRV9NQUdJQzsKIAlvY2gtPm9jaF9mbGFncyA9IGl0LT5pdF9mbGFnczsKIAotCXJldHVybiBtZF9zZXRfb3Blbl9yZXBsYXlfZGF0YShtZF9leHAsIG9jaCwgcmVxKTsKKwlyZXR1cm4gbWRfc2V0X29wZW5fcmVwbGF5X2RhdGEobWRfZXhwLCBvY2gsIGl0KTsKIH0KIAogaW50IGxsX2xvY2FsX29wZW4oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwKQEAgLTY3MSwxNCArNjczLDEzIEBACiAKIAlsbF9jYXBhX29wZW4oaW5vZGUpOwogCi0JaWYgKCFsbGktPmxsaV9oYXNfc21kKSB7Ci0JCWlmIChmaWxlLT5mX2ZsYWdzICYgT19MT1ZfREVMQVlfQ1JFQVRFIHx8Ci0JCSAgICAhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkgewotCQkJQ0RFQlVHKERfSU5PREUsICJvYmplY3QgY3JlYXRpb24gd2FzIGRlbGF5ZWRcbiIpOwotCQkJR09UTyhvdXRfb2NoX2ZyZWUsIHJjKTsKLQkJfQorCWlmICghbGxpLT5sbGlfaGFzX3NtZCAmJgorCSAgICAoY2xfaXNfbG92X2RlbGF5X2NyZWF0ZShmaWxlLT5mX2ZsYWdzKSB8fAorCSAgICAgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSA9PSAwKSkgeworCQlDREVCVUcoRF9JTk9ERSwgIm9iamVjdCBjcmVhdGlvbiB3YXMgZGVsYXllZFxuIik7CisJCUdPVE8ob3V0X29jaF9mcmVlLCByYyk7CiAJfQotCWZpbGUtPmZfZmxhZ3MgJj0gfk9fTE9WX0RFTEFZX0NSRUFURTsKKwljbF9sb3ZfZGVsYXlfY3JlYXRlX2NsZWFyKCZmaWxlLT5mX2ZsYWdzKTsKIAlHT1RPKG91dF9vY2hfZnJlZSwgcmMpOwogCiBvdXRfb2NoX2ZyZWU6CkBAIC04MTMsMTAgKzgxNCw3IEBACiAJICogZG9lc24ndCBkZWFsIHdpdGggb3BlbmhhbmRsZSwgc28gbm9ybWFsIG9wZW5oYW5kbGUgd2lsbCBiZSBsZWFrZWQuICovCiAJCQkJTERMTV9GTF9OT19MUlUgfCBMRExNX0ZMX0VYQ0wpOwogCWxsX2ZpbmlzaF9tZF9vcF9kYXRhKG9wX2RhdGEpOwotCWlmIChyZXEgIT0gTlVMTCkgewotCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7Ci0JCWl0X2NsZWFyX2Rpc3Bvc2l0aW9uKCZpdCwgRElTUF9FTlFfQ09NUExFVEUpOwotCX0KKwlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CiAJaWYgKHJjIDwgMCkKIAkJR09UTyhvdXRfcmVsZWFzZV9pdCwgcmMpOwogCkBAIC0xMDMzLDYgKzEwMzEsMzMgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBib29sIGZpbGVfaXNfbm9hdGltZShjb25zdCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwljb25zdCBzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IGZpbGUtPmZfcGF0aC5tbnQ7CisJY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisKKwkvKiBBZGFwdGVkIGZyb20gZmlsZV9hY2Nlc3NlZCgpIGFuZCB0b3VjaF9hdGltZSgpLiovCisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PQVRJTUUpCisJCXJldHVybiB0cnVlOworCisJaWYgKGlub2RlLT5pX2ZsYWdzICYgU19OT0FUSU1FKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmIChJU19OT0FUSU1FKGlub2RlKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAobW50LT5tbnRfZmxhZ3MgJiAoTU5UX05PQVRJTUUgfCBNTlRfUkVBRE9OTFkpKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmICgobW50LT5tbnRfZmxhZ3MgJiBNTlRfTk9ESVJBVElNRSkgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfTk9ESVJBVElNRSkgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIHZvaWQgbGxfaW9faW5pdChzdHJ1Y3QgY2xfaW8gKmlvLCBjb25zdCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IHdyaXRlKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKQEAgLTEwNTIsNiArMTA3Nyw4IEBACiAJfSBlbHNlIGlmIChmaWxlLT5mX2ZsYWdzICYgT19BUFBFTkQpIHsKIAkJaW8tPmNpX2xvY2tyZXEgPSBDSUxSX01BTkRBVE9SWTsKIAl9CisKKwlpby0+Y2lfbm9hdGltZSA9IGZpbGVfaXNfbm9hdGltZShmaWxlKTsKIH0KIAogc3RhdGljIHNzaXplX3QKQEAgLTEwOTIsMTYgKzExMTksMTIgQEAKIAkJCQlkb3duX3JlYWQoJmxsaS0+bGxpX3RydW5jX3NlbSk7CiAJCQl9CiAJCQlicmVhazsKLQkJY2FzZSBJT19TRU5ERklMRToKLQkJCXZpby0+dS5zZW5kZmlsZS5jdWlfYWN0b3IgPSBhcmdzLT51LnNlbmRmaWxlLnZpYV9hY3RvcjsKLQkJCXZpby0+dS5zZW5kZmlsZS5jdWlfdGFyZ2V0ID0gYXJncy0+dS5zZW5kZmlsZS52aWFfdGFyZ2V0OwotCQkJYnJlYWs7CiAJCWNhc2UgSU9fU1BMSUNFOgogCQkJdmlvLT51LnNwbGljZS5jdWlfcGlwZSA9IGFyZ3MtPnUuc3BsaWNlLnZpYV9waXBlOwogCQkJdmlvLT51LnNwbGljZS5jdWlfZmxhZ3MgPSBhcmdzLT51LnNwbGljZS52aWFfZmxhZ3M7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCUNFUlJPUigiVW5rbm93IElPIHR5cGUgLSAldVxuIiwgdmlvLT5jdWlfaW9fc3VidHlwZSk7CisJCQlDRVJST1IoIlVua25vd24gSU8gdHlwZSAtICV1XG4iLCB2aW8tPmN1aV9pb19zdWJ0eXBlKTsKIAkJCUxCVUcoKTsKIAkJfQogCQlyZXN1bHQgPSBjbF9pb19sb29wKGVudiwgaW8pOwpAQCAtMTM0MCw3ICsxMzYzLDcgQEAKIAlzdHJ1Y3QgbGxfcmVjcmVhdGVfb2JqIHVjcmVhdDsKIAlzdHJ1Y3Qgb3N0X2lkCQlvaTsKIAotCWlmICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQorCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnVjcmVhdCwgKHN0cnVjdCBsbF9yZWNyZWF0ZV9vYmogKilhcmcsCkBAIC0xMzU4LDcgKzEzODEsNyBAQAogCXN0cnVjdCBvc3RfaWQJb2k7CiAJb2JkX2NvdW50CW9zdF9pZHg7CiAKLQlpZiAoIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKKwlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZmaWQsIChzdHJ1Y3QgbHVfZmlkICopYXJnLCBzaXplb2YoZmlkKSkpCkBAIC0xMzgxLDIzICsxNDA0LDI1IEBACiAJCWNjY19pbm9kZV9sc21fcHV0KGlub2RlLCBsc20pOwogCQlDREVCVUcoRF9JT0NUTCwgInN0cmlwZSBhbHJlYWR5IGV4aXN0cyBmb3IgaW5vICVsdVxuIiwKIAkJICAgICAgIGlub2RlLT5pX2lubyk7Ci0JCXJldHVybiAtRUVYSVNUOworCQlHT1RPKG91dCwgcmMgPSAtRUVYSVNUKTsKIAl9CiAKIAlsbF9pbm9kZV9zaXplX2xvY2soaW5vZGUpOwogCXJjID0gbGxfaW50ZW50X2ZpbGVfb3BlbihmaWxlLCBsdW0sIGx1bV9zaXplLCAmb2l0KTsKIAlpZiAocmMpCi0JCUdPVE8ob3V0LCByYyk7CisJCUdPVE8ob3V0X3VubG9jaywgcmMpOwogCXJjID0gb2l0LmQubHVzdHJlLml0X3N0YXR1czsKIAlpZiAocmMgPCAwKQogCQlHT1RPKG91dF9yZXFfZnJlZSwgcmMpOwogCiAJbGxfcmVsZWFzZV9vcGVuaGFuZGxlKGZpbGUtPmZfZGVudHJ5LCAmb2l0KTsKIAotIG91dDoKK291dF91bmxvY2s6CiAJbGxfaW5vZGVfc2l6ZV91bmxvY2soaW5vZGUpOwogCWxsX2ludGVudF9yZWxlYXNlKCZvaXQpOwogCWNjY19pbm9kZV9sc21fcHV0KGlub2RlLCBsc20pOworb3V0OgorCWNsX2xvdl9kZWxheV9jcmVhdGVfY2xlYXIoJmZpbGUtPmZfZmxhZ3MpOwogCXJldHVybiByYzsKIG91dF9yZXFfZnJlZToKIAlwdGxycGNfcmVxX2ZpbmlzaGVkKChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKikgb2l0LmQubHVzdHJlLml0X2RhdGEpOwpAQCAtMTQ5Nyw3ICsxNTIyLDcgQEAKIAkJCQkJICAgIHNpemVvZihzdHJ1Y3QgbG92X3VzZXJfb3N0X2RhdGEpOwogCWludAkJCSByYzsKIAotCWlmICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQorCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKIAlPQkRfQUxMT0NfTEFSR0UobHVtcCwgbHVtX3NpemUpOwpAQCAtMTc0Nyw3ICsxNzcyLDcgQEAKIAlzdHJ1Y3QgZ2V0aW5mb19maWQycGF0aAkqZ2ZvdXQsICpnZmluOwogCWludAkJCSBvdXRzaXplLCByYzsKIAotCWlmICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9EQUNfUkVBRF9TRUFSQ0gpICYmCisJaWYgKCFjYXBhYmxlKENGU19DQVBfREFDX1JFQURfU0VBUkNIKSAmJgogCSAgICAhKGxsX2kyc2JpKGlub2RlKS0+bGxfZmxhZ3MgJiBMTF9TQklfVVNFUl9GSUQyUEFUSCkpCiAJCXJldHVybiAtRVBFUk07CiAKQEAgLTIwMDUsNyArMjAzMCw3IEBACiAJCWxsc3MtPmlhMi5pYV92YWxpZCA9IEFUVFJfTVRJTUUgfCBBVFRSX0FUSU1FOwogCX0KIAotCS8qIHVsdGltYXRlIGNoZWNrLCBiZWZvcmUgc3dhcGluZyB0aGUgbGF5b3V0cyB3ZSBjaGVjayBpZgorCS8qIHVsdGltYXRlIGNoZWNrLCBiZWZvcmUgc3dhcHBpbmcgdGhlIGxheW91dHMgd2UgY2hlY2sgaWYKIAkgKiBkYXRhdmVyc2lvbiBoYXMgY2hhbmdlZCAoaWYgcmVxdWVzdGVkKSAqLwogCWlmIChsbHNzLT5jaGVja19kdjEpIHsKIAkJcmMgPSBsbF9kYXRhX3ZlcnNpb24obGxzcy0+aW5vZGUxLCAmZHYsIDApOwpAQCAtMjA5Myw3ICsyMTE4LDcgQEAKIAkvKiBOb24tcm9vdCB1c2VycyBhcmUgZm9yYmlkZGVuIHRvIHNldCBvciBjbGVhciBmbGFncyB3aGljaCBhcmUKIAkgKiBOT1QgZGVmaW5lZCBpbiBIU01fVVNFUl9NQVNLLiAqLwogCWlmICgoKGhzcy0+aHNzX3NldG1hc2sgfCBoc3MtPmhzc19jbGVhcm1hc2spICYgfkhTTV9VU0VSX01BU0spICYmCi0JICAgICFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCisJICAgICFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAogCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgaW5vZGUsIE5VTEwsIE5VTEwsIDAsIDAsCkBAIC0yNjcwLDcgKzI2OTUsNyBAQAogCQlMQVNTRVJUKChjbWQgPT0gRl9TRVRMS1cpIHx8IChjbWQgPT0gRl9TRVRMSykpOwogCQkvKiBmbG9ja3MgYXJlIHdob2xlLWZpbGUgbG9ja3MgKi8KIAkJZmxvY2subF9mbG9jay5lbmQgPSBPRkZTRVRfTUFYOwotCQkvKiBGb3IgZmxvY2tzIG93bmVyIGlzIGRldGVybWluZWQgYnkgdGhlIGxvY2FsIGZpbGUgZGVzY3RpcHRvciovCisJCS8qIEZvciBmbG9ja3Mgb3duZXIgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbG9jYWwgZmlsZSBkZXNjcmlwdG9yKi8KIAkJZmxvY2subF9mbG9jay5vd25lciA9ICh1bnNpZ25lZCBsb25nKWZpbGVfbG9jay0+ZmxfZmlsZTsKIAl9IGVsc2UgaWYgKGZpbGVfbG9jay0+ZmxfZmxhZ3MgJiBGTF9QT1NJWCkgewogCQlmbG9jay5sX2Zsb2NrLm93bmVyID0gKHVuc2lnbmVkIGxvbmcpZmlsZV9sb2NrLT5mbF9vd25lcjsKQEAgLTI4OTEsNyArMjkxNiw3IEBACiAJCQlvaXQuaXRfb3AgPSBJVF9MT09LVVA7CiAKIAkJLyogQ2FsbCBnZXRhdHRyIGJ5IGZpZCwgc28gZG8gbm90IHByb3ZpZGUgbmFtZSBhdCBhbGwuICovCi0JCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSwKKwkJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBkZW50cnktPmRfaW5vZGUsCiAJCQkJCSAgICAgZGVudHJ5LT5kX2lub2RlLCBOVUxMLCAwLCAwLAogCQkJCQkgICAgIExVU1RSRV9PUENfQU5ZLCBOVUxMKTsKIAkJaWYgKElTX0VSUihvcF9kYXRhKSkKQEAgLTMxNzUsNyArMzIwMCw3IEBACiAJLmdldF9hY2wJPSBsbF9nZXRfYWNsLAogfTsKIAotLyogZHluYW1pYyBpb2N0bCBudW1iZXIgc3VwcG9ydCByb3V0aW5zICovCisvKiBkeW5hbWljIGlvY3RsIG51bWJlciBzdXBwb3J0IHJvdXRpbmVzICovCiBzdGF0aWMgc3RydWN0IGxsaW9jX2N0bF9kYXRhIHsKIAlzdHJ1Y3Qgcndfc2VtYXBob3JlCWlvY19zZW07CiAJc3RydWN0IGxpc3RfaGVhZAkgICAgICBpb2NfaGVhZDsKQEAgLTMyOTksNyArMzMyNCw3IEBACiAJCWlmIChyZXN1bHQgPT0gMCkgewogCQkJLyogaXQgY2FuIG9ubHkgYmUgYWxsb3dlZCB0byBtYXRjaCBhZnRlciBsYXlvdXQgaXMKIAkJCSAqIGFwcGxpZWQgdG8gaW5vZGUgb3RoZXJ3aXNlIGZhbHNlIGxheW91dCB3b3VsZCBiZQotCQkJICogc2Vlbi4gQXBwbHlpbmcgbGF5b3V0IHNob3VkIGhhcHBlbiBiZWZvcmUgZHJvcHBpbmcKKwkJCSAqIHNlZW4uIEFwcGx5aW5nIGxheW91dCBzaG91bGQgaGFwcGVuIGJlZm9yZSBkcm9wcGluZwogCQkJICogdGhlIGludGVudCBsb2NrLiAqLwogCQkJbGRsbV9sb2NrX2FsbG93X21hdGNoKGxvY2spOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9jbG9zZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfY2xvc2UuYwppbmRleCBlMjk5NmM0Li4zOGMyZDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9jbG9zZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2Nsb3NlLmMKQEAgLTM0OCw3ICszNDgsNyBAQAogCQkJYnJlYWs7CiAKIAkJaW5vZGUgPSBsbF9pbmZvMmkobGxpKTsKLQkJQ0RFQlVHKERfSU5GTywgImRvbmVfd3JpdHRpbmcgZm9yIGlub2RlICVsdS8ldVxuIiwKKwkJQ0RFQlVHKERfSU5GTywgImRvbmVfd3JpdGluZyBmb3IgaW5vZGUgJWx1LyV1XG4iLAogCQkgICAgICAgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9nZW5lcmF0aW9uKTsKIAkJbGxfZG9uZV93cml0aW5nKGlub2RlKTsKIAkJaXB1dChpbm9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfaW50ZXJuYWwuaAppbmRleCA3ZWU1YzAyLi42OWFiYTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2ludGVybmFsLmgKQEAgLTI5NiwxMyArMjk2LDYgQEAKIAkJCXNpemVfdCBzaXplLAogCQkJX191NjQgdmFsaWQpOwogCi1pbnQgbGxfeGF0dHJfY2FjaGVfdXBkYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQljb25zdCBjaGFyICpuYW1lLAotCQkJY29uc3QgY2hhciAqbmV3dmFsLAotCQkJc2l6ZV90IHNpemUsCi0JCQlfX3U2NCB2YWxpZCwKLQkJCWludCBmbGFncyk7Ci0KIC8qCiAgKiBMb2NraW5nIHRvIGd1YXJhbnRlZSBjb25zaXN0ZW5jeSBvZiBub24tYXRvbWljIHVwZGF0ZXMgdG8gbG9uZyBsb25nIGlfc2l6ZSwKICAqIGNvbnNpc3RlbmN5IGJldHdlZW4gZmlsZSBzaXplIGFuZCBLTVMuCkBAIC01MzIsNyArNTI1LDcgQEAKIAlhdG9taWNfdAkJICBsbF9hZ2xfdG90YWw7ICAvKiBBR0wgdGhyZWFkIHN0YXJ0ZWQgY291bnQgKi8KIAogCWRldl90CQkgICAgIGxsX3NkZXZfb3JpZzsgLyogc2F2ZSBzX2RldiBiZWZvcmUgYXNzaWduIGZvcgotCQkJCQkJICogY2x1c3RyZWQgbmZzICovCisJCQkJCQkgKiBjbHVzdGVyZWQgbmZzICovCiAJc3RydWN0IHJtdGFjbF9jdGxfdGFibGUgICBsbF9yY3Q7CiAJc3RydWN0IGVhY2xfdGFibGUJIGxsX2V0OwogCV9fa2VybmVsX2ZzaWRfdAkJICBsbF9mc2lkOwpAQCAtNzgyLDcgKzc3NSw3IEBACiBpbnQgbGxfcmVsZWFzZV9vcGVuaGFuZGxlKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGxvb2t1cF9pbnRlbnQgKik7CiBpbnQgbGxfbWRfY2xvc2Uoc3RydWN0IG9iZF9leHBvcnQgKm1kX2V4cCwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJc3RydWN0IGZpbGUgKmZpbGUpOwotaW50IGxsX21kX3JlYWxfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZsYWdzKTsKK2ludCBsbF9tZF9yZWFsX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGZtb2RlX3QgZm1vZGUpOwogdm9pZCBsbF9pb2Vwb2NoX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAogCQkgICAgICBzdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGUgKipvY2gsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogdm9pZCBsbF9kb25lX3dyaXRpbmdfYXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSk7CkBAIC04MjgsNyArODIxLDcgQEAKIAogLyogbGxpdGUvZGNhY2hlLmMgKi8KIAotaW50IGxsX2RvcHNfaW5pdChzdHJ1Y3QgZGVudHJ5ICpkZSwgaW50IGJsb2NrLCBpbnQgaW5pdF9zYSk7CitpbnQgbGxfZF9pbml0KHN0cnVjdCBkZW50cnkgKmRlKTsKIGV4dGVybiBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgbGxfZF9vcHM7CiB2b2lkIGxsX2ludGVudF9kcm9wX2xvY2soc3RydWN0IGxvb2t1cF9pbnRlbnQgKik7CiB2b2lkIGxsX2ludGVudF9yZWxlYXNlKHN0cnVjdCBsb29rdXBfaW50ZW50ICopOwpAQCAtOTE1LDEyICs5MDgsMTAgQEAKIHZvaWQgdnZwX3dyaXRlX3BlbmRpbmcgKHN0cnVjdCBjY2Nfb2JqZWN0ICpjbHViLCBzdHJ1Y3QgY2NjX3BhZ2UgKnBhZ2UpOwogdm9pZCB2dnBfd3JpdGVfY29tcGxldGUoc3RydWN0IGNjY19vYmplY3QgKmNsdWIsIHN0cnVjdCBjY2NfcGFnZSAqcGFnZSk7CiAKLS8qIHNwZWNpZmljIGFjaGl0ZWN0dXJlIGNhbiBpbXBsZW1lbnQgb25seSBwYXJ0IG9mIHRoaXMgbGlzdCAqLworLyogc3BlY2lmaWMgYXJjaGl0ZWN0dXJlIGNhbiBpbXBsZW1lbnQgb25seSBwYXJ0IG9mIHRoaXMgbGlzdCAqLwogZW51bSB2dnBfaW9fc3VidHlwZSB7CiAJLyoqIG5vcm1hbCBJTyAqLwogCUlPX05PUk1BTCwKLQkvKiogaW8gY2FsbGVkIGZyb20gLnNlbmRmaWxlICovCi0JSU9fU0VOREZJTEUsCiAJLyoqIGlvIHN0YXJ0ZWQgZnJvbSBzcGxpY2Vfe3JlYWR8d3JpdGV9ICovCiAJSU9fU1BMSUNFCiB9OwpAQCAtOTMyLDEwICs5MjMsNiBAQAogCiAJdW5pb24gewogCQlzdHJ1Y3QgewotCQkJcmVhZF9hY3Rvcl90ICAgICAgY3VpX2FjdG9yOwotCQkJdm9pZAkgICAgICpjdWlfdGFyZ2V0OwotCQl9IHNlbmRmaWxlOwotCQlzdHJ1Y3QgewogCQkJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqY3VpX3BpcGU7CiAJCQl1bnNpZ25lZCBpbnQJICAgIGN1aV9mbGFnczsKIAkJfSBzcGxpY2U7CkBAIC05ODEsNyArOTY4LDcgQEAKICAqIElPIGFyZ3VtZW50cyBmb3IgdmFyaW91cyBWRlMgSS9PIGludGVyZmFjZXMuCiAgKi8KIHN0cnVjdCB2dnBfaW9fYXJncyB7Ci0JLyoqIG5vcm1hbC9zZW5kZmlsZS9zcGxpY2UgKi8KKwkvKiogbm9ybWFsL3NwbGljZSAqLwogCWVudW0gdnZwX2lvX3N1YnR5cGUgdmlhX2lvX3N1YnR5cGU7CiAKIAl1bmlvbiB7CkBAIC05OTEsMTAgKzk3OCw2IEBACiAJCQl1bnNpZ25lZCBsb25nICAgICAgdmlhX25yc2VnczsKIAkJfSBub3JtYWw7CiAJCXN0cnVjdCB7Ci0JCQlyZWFkX2FjdG9yX3QgICAgICAgdmlhX2FjdG9yOwotCQkJdm9pZAkgICAgICAqdmlhX3RhcmdldDsKLQkJfSBzZW5kZmlsZTsKLQkJc3RydWN0IHsKIAkJCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gICp2aWFfcGlwZTsKIAkJCXVuc2lnbmVkIGludCAgICAgICB2aWFfZmxhZ3M7CiAJCX0gc3BsaWNlOwpAQCAtMTMyMCwxMiArMTMwMywxMyBAQAogCWlmIChsbGktPmxsaV9vcGVuZGlyX3BpZCAhPSBjdXJyZW50X3BpZCgpKQogCQlyZXR1cm47CiAKLQlpZiAoc2FpICE9IE5VTEwgJiYgbGRkICE9IE5VTEwpCisJTEFTU0VSVChsZGQgIT0gTlVMTCk7CisJaWYgKHNhaSAhPSBOVUxMKQogCQlsZGQtPmxsZF9zYV9nZW5lcmF0aW9uID0gc2FpLT5zYWlfZ2VuZXJhdGlvbjsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWxsX25lZWRfc3RhdGFoZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnlwKQorZF9uZWVkX3N0YXRhaGVhZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5cCkKIHsKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAgKmxsaTsKIAlzdHJ1Y3QgbGxfZGVudHJ5X2RhdGEgKmxkZDsKQEAgLTEzNzAsMTQgKzEzNTQsMTQgQEAKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gbGxfbmVlZF9zdGF0YWhlYWQoZGlyLCAqZGVudHJ5cCk7CisJcmV0ID0gZF9uZWVkX3N0YXRhaGVhZChkaXIsICpkZW50cnlwKTsKIAlpZiAocmV0IDw9IDApCiAJCXJldHVybiByZXQ7CiAKIAlyZXR1cm4gZG9fc3RhdGFoZWFkX2VudGVyKGRpciwgZGVudHJ5cCwgb25seV91bnBsdWcpOwogfQogCi0vKiBsbGl0ZSBpb2N0bCByZWdpc3RlciBzdXBwb3J0IHJvdW50aW5lICovCisvKiBsbGl0ZSBpb2N0bCByZWdpc3RlciBzdXBwb3J0IHJvdXRpbmUgKi8KIGVudW0gbGxpb2NfaXRlciB7CiAJTExJT0NfQ09OVCA9IDAsCiAJTExJT0NfU1RPUApAQCAtMTM4OSw3ICsxMzczLDcgQEAKICAqIFJ1bGVzIHRvIHdyaXRlIGEgY2FsbGJhY2sgZnVuY3Rpb246CiAgKgogICogUGFyYW1ldGVyczoKLSAqICBAbWFnaWM6IER5bmFtaWMgaW9jdGwgY2FsbCByb3V0aW5lIHdpbGwgZmVlZCB0aGlzIHZhdWxlIHdpdGggdGhlIHBvaW50ZXIKKyAqICBAbWFnaWM6IER5bmFtaWMgaW9jdGwgY2FsbCByb3V0aW5lIHdpbGwgZmVlZCB0aGlzIHZhbHVlIHdpdGggdGhlIHBvaW50ZXIKICAqICAgICAgcmV0dXJuZWQgdG8gbGxfaW9jb250cm9sX3JlZ2lzdGVyLiAgQ2FsbGJhY2sgZnVuY3Rpb25zIHNob3VsZCB1c2UgdGhpcwogICogICAgICBkYXRhIHRvIGNoZWNrIHRoZSBwb3RlbnRpYWwgY29sbGFzaW9uIG9mIGlvY3RsIGNtZC4gSWYgY29sbGFzaW9uIGlzCiAgKiAgICAgIGZvdW5kLCBjYWxsYmFjayBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIExMSU9DX0NPTlQuCkBAIC0xNDE0LDcgKzEzOTgsNyBAQAogICogQGNiOiBjYWxsYmFjayBmdW5jdGlvbiwgaXQgd2lsbCBiZSBjYWxsZWQgaWYgYW4gaW9jdGwgY29tbWFuZCBpcyBmb3VuZCB0bwogICogICAgICBiZWxvbmcgdG8gdGhlIGNvbW1hbmQgbGlzdCBAY21kLgogICoKLSAqIFJldHVybiB2YXVsZToKKyAqIFJldHVybiB2YWx1ZToKICAqICAgICAgQSBtYWdpYyBwb2ludGVyIHdpbGwgYmUgcmV0dXJuZWQgaWYgc3VjY2VzczsKICAqICAgICAgb3RoZXJ3aXNlLCBOVUxMIHdpbGwgYmUgcmV0dXJuZWQuCiAgKiAqLwpAQCAtMTUyNCw3ICsxNTA4LDcgQEAKIAkJICogc2VwYXJhdGUgbG9ja3MgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXMsIE1hc3RlciBNRFQsCiAJCSAqIHdoZXJlIHRoZSBuYW1lIGVudHJ5IGlzLCB3aWxsIGdyYW50IExPT0tVUCBsb2NrLAogCQkgKiByZW1vdGUgTURULCB3aGVyZSB0aGUgb2JqZWN0IGlzLCB3aWxsIGdyYW50Ci0JCSAqIFVQREFURXxQRVJNIGxvY2suIFRoZSBpbm9kZSB3aWxsIGJlIGF0dGNoZWQgdG8gYm90aAorCQkgKiBVUERBVEV8UEVSTSBsb2NrLiBUaGUgaW5vZGUgd2lsbCBiZSBhdHRhY2hlZCB0byBib3RoCiAJCSAqIExPT0tVUCBhbmQgUEVSTSBsb2Nrcywgc28gcmV2b2tpbmcgZWl0aGVyIGxvY2tzIHdpbGwKIAkJICogY2FzZSB0aGUgZGNhY2hlIGJlaW5nIGNsZWFyZWQgKi8KIAkJaWYgKGl0LT5kLmx1c3RyZS5pdF9yZW1vdGVfbG9ja19tb2RlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9saWIuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2xpYi5jCmluZGV4IDZjZmRiOWUuLjI2MDAzZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2xpYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2xpYi5jCkBAIC0xNTUsMTEgKzE1NSw2IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGxsX2Rfcm9vdF9vcHMgPSB7Ci0JLmRfY29tcGFyZSA9IGxsX2Rjb21wYXJlLAotCS5kX3JldmFsaWRhdGUgPSBsbF9yZXZhbGlkYXRlX25kLAotfTsKLQogc3RhdGljIGludCBjbGllbnRfY29tbW9uX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqbWQsIGNoYXIgKmR0LAogCQkJCSAgICBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKQEAgLTIxMSw3ICsyMDYsMTAgQEAKIAkJCQkgIE9CRF9DT05ORUNUX0VJTlBST0dSRVNTIHwKIAkJCQkgIE9CRF9DT05ORUNUX0pPQlNUQVRTIHwgT0JEX0NPTk5FQ1RfTFZCX1RZUEUgfAogCQkJCSAgT0JEX0NPTk5FQ1RfTEFZT1VUTE9DSyB8Ci0JCQkJICBPQkRfQ09OTkVDVF9QSU5HTEVTUyB8IE9CRF9DT05ORUNUX01BWF9FQVNJWkU7CisJCQkJICBPQkRfQ09OTkVDVF9QSU5HTEVTUyB8CisJCQkJICBPQkRfQ09OTkVDVF9NQVhfRUFTSVpFIHwKKwkJCQkgIE9CRF9DT05ORUNUX0ZMT0NLX0RFQUQgfAorCQkJCSAgT0JEX0NPTk5FQ1RfRElTUF9TVFJJUEU7CiAKIAlpZiAoc2JpLT5sbF9mbGFncyAmIExMX1NCSV9TT01fUFJFVklFVykKIAkJZGF0YS0+b2NkX2Nvbm5lY3RfZmxhZ3MgfD0gT0JEX0NPTk5FQ1RfU09NOwpAQCAtMjgxLDcgKzI3OSw3IEBACiAKIAkvKiBGb3IgbW91bnQsIHdlIG9ubHkgbmVlZCBmcyBpbmZvIGZyb20gTURUMCwgYW5kIGFsc28gaW4gRE5FLCBpdAogCSAqIGNhbiBtYWtlIHN1cmUgdGhlIGNsaWVudCBjYW4gYmUgbW91bnRlZCBhcyBsb25nIGFzIE1EVDAgaXMKLQkgKiBhdmFpYmxlICovCisJICogYXZhaWxhYmxlICovCiAJZXJyID0gb2JkX3N0YXRmcyhOVUxMLCBzYmktPmxsX21kX2V4cCwgb3NmcywKIAkJCWNmc190aW1lX3NoaWZ0XzY0KC1PQkRfU1RBVEZTX0NBQ0hFX1NFQ09ORFMpLAogCQkJT0JEX1NUQVRGU19GT1JfTURUMCk7CkBAIC01NzksMTAgKzU3Nyw2IEBACiAJCUdPVE8ob3V0X3Jvb3QsIGVyciA9IC1FTk9NRU0pOwogCX0KIAotCS8qIGtlcm5lbCA+PSAyLjYuMzggc3RvcmUgZGVudHJ5IG9wZXJhdGlvbnMgaW4gc2ItPnNfZF9vcC4gKi8KLQlkX3NldF9kX29wKHNiLT5zX3Jvb3QsICZsbF9kX3Jvb3Rfb3BzKTsKLQlzYi0+c19kX29wID0gJmxsX2Rfb3BzOwotCiAJc2JpLT5sbF9zZGV2X29yaWcgPSBzYi0+c19kZXY7CiAKIAkvKiBXZSBzZXQgc2ItPnNfZGV2IGVxdWFsIG9uIGFsbCBsdXN0cmUgY2xpZW50cyBpbiBvcmRlciB0byBzdXBwb3J0CkBAIC03MjMsNyArNzE3LDcgQEAKIAkJcmV0dXJuOwogCiAJc2JpID0gbGxfczJzYmkoc2IpOwotCS8qIHdlIG5lZWQgcmVzdG9yZSBzX2RldiBmcm9tIGNoYW5nZWQgZm9yIGNsdXN0cmVkIE5GUyBiZWZvcmUgcHV0X3N1cGVyCisJLyogd2UgbmVlZCB0byByZXN0b3JlIHNfZGV2IGZyb20gY2hhbmdlZCBmb3IgY2x1c3RlcmVkIE5GUyBiZWZvcmUgcHV0X3N1cGVyCiAJICogYmVjYXVzZSBuZXcga2VybmVscyBoYXZlIGNhY2hlZCBzX2RldiBhbmQgY2hhbmdlIHNiLT5zX2RldiBpbgogCSAqIHB1dF9zdXBlciBub3QgYWZmZWN0ZWQgcmVhbCByZW1vdmluZyBkZXZpY2VzICovCiAJaWYgKHNiaSkgewpAQCAtNzQwLDcgKzczNCw4IEBACiAJQ0RFQlVHKERfU1VQRVIsICJvcHRpb246ICVzLCBkYXRhICVzXG4iLCBvcHQsIGRhdGEpOwogCWlmIChzdHJuY21wKG9wdCwgZGF0YSwgc3RybGVuKG9wdCkpKQogCQlyZXR1cm4gTlVMTDsKLQlpZiAoKHZhbHVlID0gc3RyY2hyKGRhdGEsICc9JykpID09IE5VTEwpCisJdmFsdWUgPSBzdHJjaHIoZGF0YSwgJz0nKTsKKwlpZiAodmFsdWUgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKIAl2YWx1ZSsrOwpAQCAtMTAxMyw2ICsxMDA4LDggQEAKIAkJR09UTyhvdXRfZnJlZSwgZXJyKTsKIAogCXNiLT5zX2JkaSA9ICZsc2ktPmxzaV9iZGk7CisJLyoga2VybmVsID49IDIuNi4zOCBzdG9yZSBkZW50cnkgb3BlcmF0aW9ucyBpbiBzYi0+c19kX29wLiAqLworCXNiLT5zX2Rfb3AgPSAmbGxfZF9vcHM7CiAKIAkvKiBHZW5lcmF0ZSBhIHN0cmluZyB1bmlxdWUgdG8gdGhpcyBzdXBlciwgaW4gY2FzZSBzb21lIGpva2VyIHRyaWVzCiAJICAgdG8gbW91bnQgdGhlIHNhbWUgZnMgYXQgdHdvIG1vdW50IHBvaW50cy4KQEAgLTEwNjcsNyArMTA2NCw3IEBACiAKIHZvaWQgbGxfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0Jc3RydWN0IGNvbmZpZ19sbG9nX2luc3RhbmNlIGNmZzsKKwlzdHJ1Y3QgY29uZmlnX2xsb2dfaW5zdGFuY2UgY2ZnLCBwYXJhbXNfY2ZnOwogCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQ7CiAJc3RydWN0IGx1c3RyZV9zYl9pbmZvICpsc2kgPSBzMmxzaShzYik7CiAJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX3Myc2JpKHNiKTsKQEAgLTEwODEsNiArMTA3OCw5IEBACiAJY2ZnLmNmZ19pbnN0YW5jZSA9IHNiOwogCWx1c3RyZV9lbmRfbG9nKHNiLCBwcm9maWxlbm0sICZjZmcpOwogCisJcGFyYW1zX2NmZy5jZmdfaW5zdGFuY2UgPSBzYjsKKwlsdXN0cmVfZW5kX2xvZyhzYiwgUEFSQU1TX0ZJTEVOQU1FLCAmcGFyYW1zX2NmZyk7CisKIAlpZiAoc2JpLT5sbF9tZF9leHApIHsKIAkJb2JkID0gY2xhc3NfZXhwMm9iZChzYmktPmxsX21kX2V4cCk7CiAJCWlmIChvYmQpCkBAIC0xNDA1LDcgKzE0MDUsNyBAQAogCS8qIFBPU0lYOiBjaGVjayBiZWZvcmUgQVRUUl8qVElNRV9TRVQgc2V0IChmcm9tIGlub2RlX2NoYW5nZV9vaykgKi8KIAlpZiAoYXR0ci0+aWFfdmFsaWQgJiBUSU1FU19TRVRfRkxBR1MpIHsKIAkJaWYgKCghdWlkX2VxKGN1cnJlbnRfZnN1aWQoKSwgaW5vZGUtPmlfdWlkKSkgJiYKLQkJICAgICFjZnNfY2FwYWJsZShDRlNfQ0FQX0ZPV05FUikpCisJCSAgICAhY2FwYWJsZShDRlNfQ0FQX0ZPV05FUikpCiAJCQlyZXR1cm4gLUVQRVJNOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbW1hcC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbW1hcC5jCmluZGV4IGNhZWQ2NDIuLjkwYjJjMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX21tYXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9tbWFwLmMKQEAgLTI4NSw3ICsyODUsNyBAQAogICogTHVzdHJlIGltcGxlbWVudGF0aW9uIG9mIGEgdm1fb3BlcmF0aW9uc19zdHJ1Y3Q6OmZhdWx0KCkgbWV0aG9kLCBjYWxsZWQgYnkKICAqIFZNIHRvIHNlcnZlciBwYWdlIGZhdWx0IChib3RoIGluIGtlcm5lbCBhbmQgdXNlciBzcGFjZSkuCiAgKgotICogXHBhcmFtIHZtYSAtIGlzIHZpcnRpdWFsIGFyZWEgc3RydWN0IHJlbGF0ZWQgdG8gcGFnZSBmYXVsdAorICogXHBhcmFtIHZtYSAtIGlzIHZpcnR1YWwgYXJlYSBzdHJ1Y3QgcmVsYXRlZCB0byBwYWdlIGZhdWx0CiAgKiBccGFyYW0gdm1mIC0gc3RydWN0dXJlIHdoaWNoIGRlc2NyaWJlIHR5cGUgYW5kIGFkZHJlc3Mgd2hlcmUgaGl0IGZhdWx0CiAgKgogICogXHJldHVybiBhbGxvY2F0ZWQgYW5kIGZpbGxlZCBfbG9ja2VkXyBwYWdlIGZvciBhZGRyZXNzCkBAIC0zNzAsNyArMzcwLDcgQEAKIAkJCWdvdG8gcmVzdGFydDsKIAkJfQogCi0JCXJlc3VsdCB8PSBWTV9GQVVMVF9MT0NLRUQ7CisJCXJlc3VsdCA9IFZNX0ZBVUxUX0xPQ0tFRDsKIAl9CiAJY2ZzX3Jlc3RvcmVfc2lncyhzZXQpOwogCXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9uZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX25mcy5jCmluZGV4IDE3NjdjNzQuLjM1ODAwNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX25mcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX25mcy5jCkBAIC0xNjcsMTAgKzE2NywxMCBAQAogCX0KIAogCXJlc3VsdCA9IGRfb2J0YWluX2FsaWFzKGlub2RlKTsKLQlpZiAoSVNfRVJSKHJlc3VsdCkpCisJaWYgKElTX0VSUihyZXN1bHQpKSB7CisJCWlwdXQoaW5vZGUpOwogCQlyZXR1cm4gcmVzdWx0OwotCi0JbGxfZG9wc19pbml0KHJlc3VsdCwgMSwgMCk7CisJfQogCiAJcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsb29wLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbG9vcC5jCmluZGV4IDA3MTg5MDUuLmY3OGVkYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsb29wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxvb3AuYwpAQCAtMjU1LDcgKzI1NSw3IEBACiAJICogICAgdG8gc3RvcmUgcGFyaXR5OwogCSAqIDIuIFJlc2VydmUgdGhlICMgb2YgKHBhZ2VfY291bnQgKiBkZXB0aCkgY2xfcGFnZXMgZnJvbSB0aGUgcmVzZXJ2ZWQKIAkgKiAgICBwb29sLiBBZnRlcndhcmRzLCB0aGUgY2xpbyB3b3VsZCBhbGxvY2F0ZSB0aGUgcGFnZXMgZnJvbSByZXNlcnZlZAotCSAqICAgIHBvb2wsIHRoaXMgZ3VhcmFudGVlcyB3ZSBuZWVlZG4ndCBhbGxvY2F0ZSB0aGUgY2xfcGFnZXMgZnJvbQorCSAqICAgIHBvb2wsIHRoaXMgZ3VhcmFudGVlcyB3ZSBuZWVkbid0IGFsbG9jYXRlIHRoZSBjbF9wYWdlcyBmcm9tCiAJICogICAgZ2VuZXJpYyBjbF9wYWdlIHNsYWIgY2FjaGUuCiAJICogICAgT2YgY291cnNlLCBpZiB0aGVyZSBpcyBOT1QgZW5vdWdoIHBhZ2VzIGluIHRoZSBwb29sLCB3ZSBtaWdodAogCSAqICAgIGJlIGFza2VkIHRvIHdyaXRlIGxlc3MgcGFnZXMgb25jZSwgdGhpcyBwdXJlbHkgZGVwZW5kcyBvbgpAQCAtMzI1LDcgKzMyNSw3IEBACiAJCWJpbyA9ICYoKmJpbyktPmJpX25leHQ7CiAJfQogCWlmICgqYmlvKSB7Ci0JCS8qIFNvbWUgb2YgYmlvcyBjYW4ndCBiZSBtZXJnYWJsZS4gKi8KKwkJLyogU29tZSBvZiBiaW9zIGNhbid0IGJlIG1lcmdlYWJsZS4gKi8KIAkJbG8tPmxvX2JpbyA9ICpiaW87CiAJCSpiaW8gPSBOVUxMOwogCX0gZWxzZSB7CkBAIC02NTgsNyArNjU4LDcgQEAKICAqIGxsX2lvY29udHJvbF9jYWxsLgogICoKICAqIFRoaXMgaXMgYSBsbGl0ZSByZWd1bGFyIGZpbGUgaW9jdGwgZnVuY3Rpb24uIEl0IHRha2VzIHRoZSByZXNwb25zaWJpbGl0eQotICogb2YgYXR0YWNoaW5nIG9yIGRldGFjaGluZyBhIGZpbGUgYnkgYSBsbG9vcCdzIGRldmljZSBudW1uZXIuCisgKiBvZiBhdHRhY2hpbmcgb3IgZGV0YWNoaW5nIGEgZmlsZSBieSBhIGxsb29wJ3MgZGV2aWNlIG51bWJlci4KICAqLwogc3RhdGljIGVudW0gbGxpb2NfaXRlciBsbG9vcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKnVudXNlZCwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9uYW1laS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbmFtZWkuYwppbmRleCBmYzhkMjY0Li4yNWE2ZWE1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbmFtZWkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9uYW1laS5jCkBAIC0xOTUsMTAxICsxOTUsMTA3IEBACiBpbnQgbGxfbWRfYmxvY2tpbmdfYXN0KHN0cnVjdCBsZGxtX2xvY2sgKmxvY2ssIHN0cnVjdCBsZGxtX2xvY2tfZGVzYyAqZGVzYywKIAkJICAgICAgIHZvaWQgKmRhdGEsIGludCBmbGFnKQogewotCWludCByYzsKIAlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSBsb2NraDsKKwlpbnQgcmM7CiAKIAlzd2l0Y2ggKGZsYWcpIHsKIAljYXNlIExETE1fQ0JfQkxPQ0tJTkc6CiAJCWxkbG1fbG9jazJoYW5kbGUobG9jaywgJmxvY2toKTsKIAkJcmMgPSBsZGxtX2NsaV9jYW5jZWwoJmxvY2toLCBMQ0ZfQVNZTkMpOwogCQlpZiAocmMgPCAwKSB7Ci0JCQlDREVCVUcoRF9JTk9ERSwgImxkbG1fY2xpX2NhbmNlbDogJWRcbiIsIHJjKTsKKwkJCUNERUJVRyhEX0lOT0RFLCAibGRsbV9jbGlfY2FuY2VsOiByYyA9ICVkXG4iLCByYyk7CiAJCQlyZXR1cm4gcmM7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRExNX0NCX0NBTkNFTElORzogewogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbGxfaW5vZGVfZnJvbV9yZXNvdXJjZV9sb2NrKGxvY2spOwotCQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpOwogCQlfX3U2NCBiaXRzID0gbG9jay0+bF9wb2xpY3lfZGF0YS5sX2lub2RlYml0cy5iaXRzOwotCQlzdHJ1Y3QgbHVfZmlkICpmaWQ7Ci0JCWxkbG1fbW9kZV90IG1vZGUgPSBsb2NrLT5sX3JlcV9tb2RlOwogCiAJCS8qIElub2RlIGlzIHNldCB0byBsb2NrLT5sX3Jlc291cmNlLT5scl9sdmJfaW5vZGUKIAkJICogZm9yIG1kYyAtIGJ1ZyAyNDU1NSAqLwogCQlMQVNTRVJUKGxvY2stPmxfYXN0X2RhdGEgPT0gTlVMTCk7CiAKLQkJLyogSW52YWxpZGF0ZSBhbGwgZGVudHJpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5vZGUgKi8KIAkJaWYgKGlub2RlID09IE5VTEwpCiAJCQlicmVhazsKIAorCQkvKiBJbnZhbGlkYXRlIGFsbCBkZW50cmllcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbm9kZSAqLwogCQlMQVNTRVJUKGxvY2stPmxfZmxhZ3MgJiBMRExNX0ZMX0NBTkNFTElORyk7CiAKLQkJaWYgKGJpdHMgJiBNRFNfSU5PREVMT0NLX1hBVFRSKQorCQlpZiAoIWZpZF9yZXNfbmFtZV9lcShsbF9pbm9kZTJmaWQoaW5vZGUpLAorCQkJCSAgICAgJmxvY2stPmxfcmVzb3VyY2UtPmxyX25hbWUpKSB7CisJCQlMRExNX0VSUk9SKGxvY2ssICJkYXRhIG1pc21hdGNoIHdpdGggb2JqZWN0ICJERklEIiglcCkiLAorCQkJCSAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIGlub2RlKTsKKwkJCUxCVUcoKTsKKwkJfQorCisJCWlmIChiaXRzICYgTURTX0lOT0RFTE9DS19YQVRUUikgewogCQkJbGxfeGF0dHJfY2FjaGVfZGVzdHJveShpbm9kZSk7CisJCQliaXRzICY9IH5NRFNfSU5PREVMT0NLX1hBVFRSOworCQl9CiAKIAkJLyogRm9yIE9QRU4gbG9ja3Mgd2UgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGxvY2sgbW9kZXMKIAkJICogTENLX0NSLCBMQ0tfQ1csIExDS19QUiAtIGJ1ZyAyMjg5MSAqLworCQlpZiAoYml0cyAmIE1EU19JTk9ERUxPQ0tfT1BFTikKKwkJCWxsX2hhdmVfbWRfbG9jayhpbm9kZSwgJmJpdHMsIGxvY2stPmxfcmVxX21vZGUpOworCisJCWlmIChiaXRzICYgTURTX0lOT0RFTE9DS19PUEVOKSB7CisJCQlmbW9kZV90IGZtb2RlOworCisJCQlzd2l0Y2ggKGxvY2stPmxfcmVxX21vZGUpIHsKKwkJCWNhc2UgTENLX0NXOgorCQkJCWZtb2RlID0gRk1PREVfV1JJVEU7CisJCQkJYnJlYWs7CisJCQljYXNlIExDS19QUjoKKwkJCQlmbW9kZSA9IEZNT0RFX0VYRUM7CisJCQkJYnJlYWs7CisJCQljYXNlIExDS19DUjoKKwkJCQlmbW9kZSA9IEZNT0RFX1JFQUQ7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUxETE1fRVJST1IobG9jaywgImJhZCBsb2NrIG1vZGUgZm9yIE9QRU4gbG9jayIpOworCQkJCUxCVUcoKTsKKwkJCX0KKworCQkJbGxfbWRfcmVhbF9jbG9zZShpbm9kZSwgZm1vZGUpOworCQl9CisKIAkJaWYgKGJpdHMgJiAoTURTX0lOT0RFTE9DS19MT09LVVAgfCBNRFNfSU5PREVMT0NLX1VQREFURSB8CiAJCQkgICAgTURTX0lOT0RFTE9DS19MQVlPVVQgfCBNRFNfSU5PREVMT0NLX1BFUk0pKQogCQkJbGxfaGF2ZV9tZF9sb2NrKGlub2RlLCAmYml0cywgTENLX01JTk1PREUpOwogCi0JCWlmIChiaXRzICYgTURTX0lOT0RFTE9DS19PUEVOKQotCQkJbGxfaGF2ZV9tZF9sb2NrKGlub2RlLCAmYml0cywgbW9kZSk7Ci0KLQkJZmlkID0gbGxfaW5vZGUyZmlkKGlub2RlKTsKLQkJaWYgKCFmaWRfcmVzX25hbWVfZXEoZmlkLCAmbG9jay0+bF9yZXNvdXJjZS0+bHJfbmFtZSkpCi0JCQlMRExNX0VSUk9SKGxvY2ssICJkYXRhIG1pc21hdGNoIHdpdGggb2JqZWN0ICIKLQkJCQkgICBERklEIiAoJXApIiwgUEZJRChmaWQpLCBpbm9kZSk7Ci0KLQkJaWYgKGJpdHMgJiBNRFNfSU5PREVMT0NLX09QRU4pIHsKLQkJCWludCBmbGFncyA9IDA7Ci0JCQlzd2l0Y2ggKGxvY2stPmxfcmVxX21vZGUpIHsKLQkJCWNhc2UgTENLX0NXOgotCQkJCWZsYWdzID0gRk1PREVfV1JJVEU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIExDS19QUjoKLQkJCQlmbGFncyA9IEZNT0RFX0VYRUM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIExDS19DUjoKLQkJCQlmbGFncyA9IEZNT0RFX1JFQUQ7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCUNFUlJPUigiVW5leHBlY3RlZCBsb2NrIG1vZGUgZm9yIE9QRU4gbG9jayAiCi0JCQkJICAgICAgICIlZCwgaW5vZGUgJWxkXG4iLCBsb2NrLT5sX3JlcV9tb2RlLAotCQkJCSAgICAgICBpbm9kZS0+aV9pbm8pOwotCQkJfQotCQkJbGxfbWRfcmVhbF9jbG9zZShpbm9kZSwgZmxhZ3MpOwotCQl9Ci0KLQkJbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKIAkJaWYgKGJpdHMgJiBNRFNfSU5PREVMT0NLX0xBWU9VVCkgewotCQkJc3RydWN0IGNsX29iamVjdF9jb25mIGNvbmYgPSB7IHsgMCB9IH07CisJCQlzdHJ1Y3QgY2xfb2JqZWN0X2NvbmYgY29uZiA9IHsKKwkJCQkuY29jX29wYyA9IE9CSkVDVF9DT05GX0lOVkFMSURBVEUsCisJCQkJLmNvY19pbm9kZSA9IGlub2RlLAorCQkJfTsKIAotCQkJY29uZi5jb2Nfb3BjID0gT0JKRUNUX0NPTkZfSU5WQUxJREFURTsKLQkJCWNvbmYuY29jX2lub2RlID0gaW5vZGU7CiAJCQlyYyA9IGxsX2xheW91dF9jb25mKGlub2RlLCAmY29uZik7Ci0JCQlpZiAocmMpCi0JCQkJQ0RFQlVHKERfSU5PREUsICJpbnZhbGlkaW5nIGxheW91dCAlZC5cbiIsIHJjKTsKKwkJCWlmIChyYyA8IDApCisJCQkJQ0RFQlVHKERfSU5PREUsICJjYW5ub3QgaW52YWxpZGF0ZSBsYXlvdXQgb2YgIgorCQkJCSAgICAgICBERklEIjogcmMgPSAlZFxuIiwKKwkJCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgcmMpOwogCQl9CiAKIAkJaWYgKGJpdHMgJiBNRFNfSU5PREVMT0NLX1VQREFURSkgeworCQkJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CisKIAkJCXNwaW5fbG9jaygmbGxpLT5sbGlfbG9jayk7CiAJCQlsbGktPmxsaV9mbGFncyAmPSB+TExJRl9NRFNfU0laRV9MT0NLOwogCQkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX2xvY2spOwogCQl9CiAKLQkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYKLQkJICAgICAoYml0cyAmIE1EU19JTk9ERUxPQ0tfVVBEQVRFKSkgeworCQlpZiAoKGJpdHMgJiBNRFNfSU5PREVMT0NLX1VQREFURSkgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewogCQkJQ0RFQlVHKERfSU5PREUsICJpbnZhbGlkYXRpbmcgaW5vZGUgJWx1XG4iLAogCQkJICAgICAgIGlub2RlLT5pX2lubyk7CiAJCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpbm9kZS0+aV9tYXBwaW5nLCAwKTsKIAkJCWxsX2ludmFsaWRhdGVfbmVnYXRpdmVfY2hpbGRyZW4oaW5vZGUpOwogCQl9CiAKLQkJaWYgKGlub2RlLT5pX3NiLT5zX3Jvb3QgJiYKLQkJICAgIGlub2RlICE9IGlub2RlLT5pX3NiLT5zX3Jvb3QtPmRfaW5vZGUgJiYKLQkJICAgIChiaXRzICYgKE1EU19JTk9ERUxPQ0tfTE9PS1VQIHwgTURTX0lOT0RFTE9DS19QRVJNKSkpCisJCWlmICgoYml0cyAmIChNRFNfSU5PREVMT0NLX0xPT0tVUCB8IE1EU19JTk9ERUxPQ0tfUEVSTSkpICYmCisJCSAgICBpbm9kZS0+aV9zYi0+c19yb290ICE9IE5VTEwgJiYKKwkJICAgIGlub2RlICE9IGlub2RlLT5pX3NiLT5zX3Jvb3QtPmRfaW5vZGUpCiAJCQlsbF9pbnZhbGlkYXRlX2FsaWFzZXMoaW5vZGUpOworCiAJCWlwdXQoaW5vZGUpOwogCQlicmVhazsKIAl9CkBAIC00MDAsMTEgKzQwNiwxNiBAQAogc3RydWN0IGRlbnRyeSAqbGxfc3BsaWNlX2FsaWFzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlKQogewogCXN0cnVjdCBkZW50cnkgKm5ldzsKKwlpbnQgcmM7CiAKIAlpZiAoaW5vZGUpIHsKIAkJbmV3ID0gbGxfZmluZF9hbGlhcyhpbm9kZSwgZGUpOwogCQlpZiAobmV3KSB7Ci0JCQlsbF9kb3BzX2luaXQobmV3LCAxLCAxKTsKKwkJCXJjID0gbGxfZF9pbml0KG5ldyk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJZHB1dChuZXcpOworCQkJCXJldHVybiBFUlJfUFRSKHJjKTsKKwkJCX0KIAkJCWRfbW92ZShuZXcsIGRlKTsKIAkJCWlwdXQoaW5vZGUpOwogCQkJQ0RFQlVHKERfREVOVFJZLApAQCAtNDEzLDggKzQyNCw5IEBACiAJCQlyZXR1cm4gbmV3OwogCQl9CiAJfQotCWxsX2RvcHNfaW5pdChkZSwgMSwgMSk7Ci0JX19kX2x1c3RyZV9pbnZhbGlkYXRlKGRlKTsKKwlyYyA9IGxsX2RfaW5pdChkZSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIocmMpOwogCWRfYWRkKGRlLCBpbm9kZSk7CiAJQ0RFQlVHKERfREVOVFJZLCAiQWRkIGRlbnRyeSAlcCBpbm9kZSAlcCByZWZjICVkIGZsYWdzICUjeFxuIiwKIAkgICAgICAgZGUsIGRlLT5kX2lub2RlLCBkX2NvdW50KGRlKSwgZGUtPmRfZmxhZ3MpOwpAQCAtNDUzLDEwICs0NjUsMjIgQEAKIAl9CiAKIAkvKiBPbmx5IGhhc2ggKmRlIGlmIGl0IGlzIHVuaGFzaGVkIChuZXcgZGVudHJ5KS4KLQkgKiBBdG9pbWNfb3BlbiBtYXkgcGFzc2luIGhhc2hlZCBkZW50cmllcyBmb3Igb3Blbi4KKwkgKiBBdG9pbWNfb3BlbiBtYXkgcGFzc2luZyBoYXNoZWQgZGVudHJpZXMgZm9yIG9wZW4uCiAJICovCi0JaWYgKGRfdW5oYXNoZWQoKmRlKSkKLQkJKmRlID0gbGxfc3BsaWNlX2FsaWFzKGlub2RlLCAqZGUpOworCWlmIChkX3VuaGFzaGVkKCpkZSkpIHsKKwkJc3RydWN0IGRlbnRyeSAqYWxpYXM7CisKKwkJYWxpYXMgPSBsbF9zcGxpY2VfYWxpYXMoaW5vZGUsICpkZSk7CisJCWlmIChJU19FUlIoYWxpYXMpKQorCQkJcmV0dXJuIFBUUl9FUlIoYWxpYXMpOworCQkqZGUgPSBhbGlhczsKKwl9IGVsc2UgaWYgKCFpdF9kaXNwb3NpdGlvbihpdCwgRElTUF9MT09LVVBfTkVHKSAgJiYKKwkJICAgIWl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX09QRU5fQ1JFQVRFKSkgeworCQkvKiBXaXRoIERJU1BfT1BFTl9DUkVBVEUgZGVudHJ5IHdpbGwKKwkJICAgaW5zdGFudGlhdGVkIGluIGxsX2NyZWF0ZV9pdC4gKi8KKwkJTEFTU0VSVCgoKmRlKS0+ZF9pbm9kZSA9PSBOVUxMKTsKKwkJZF9pbnN0YW50aWF0ZSgqZGUsIGlub2RlKTsKKwl9CiAKIAlpZiAoIWl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX0xPT0tVUF9ORUcpKSB7CiAJCS8qIHdlIGhhdmUgbG9va3VwIGxvb2sgLSB1bmhpZGUgZGVudHJ5ICovCkBAIC01MDUsMTYgKzUyOSw2IEBACiAKIAlsbF9mcm9iX2ludGVudCgmaXQsICZsb29rdXBfaXQpOwogCi0JLyogQXMgZG9fbG9va3VwIGlzIGNhbGxlZCBiZWZvcmUgZm9sbG93X21vdW50LCByb290IGRlbnRyeSBtYXkgYmUgbGVmdAotCSAqIG5vdCB2YWxpZCwgcmV2YWxpZGF0ZSBpdCBoZXJlLiAqLwotCWlmIChwYXJlbnQtPmlfc2ItPnNfcm9vdCAmJiAocGFyZW50LT5pX3NiLT5zX3Jvb3QtPmRfaW5vZGUgPT0gcGFyZW50KSAmJgotCSAgICAoaXQtPml0X29wICYgKElUX09QRU4gfCBJVF9DUkVBVCkpKSB7Ci0JCXJjID0gbGxfaW5vZGVfcmV2YWxpZGF0ZV9pdChwYXJlbnQtPmlfc2ItPnNfcm9vdCwgaXQsCi0JCQkJCSAgICBNRFNfSU5PREVMT0NLX0xPT0tVUCk7Ci0JCWlmIChyYykKLQkJCXJldHVybiBFUlJfUFRSKHJjKTsKLQl9Ci0KIAlpZiAoaXQtPml0X29wID09IElUX0dFVEFUVFIpIHsKIAkJcmMgPSBsbF9zdGF0YWhlYWRfZW50ZXIocGFyZW50LCAmZGVudHJ5LCAwKTsKIAkJaWYgKHJjID09IDEpIHsKQEAgLTU4NCwxMiArNTk4LDggQEAKIAkgICAgICAgcGFyZW50LT5pX2dlbmVyYXRpb24sIHBhcmVudCwgZmxhZ3MpOwogCiAJLyogT3B0aW1pemUgYXdheSAoQ1JFQVRFICYmICFPUEVOKS4gTGV0IC5jcmVhdGUgaGFuZGxlIHRoZSByYWNlLiAqLwotCWlmICgoZmxhZ3MgJiBMT09LVVBfQ1JFQVRFICkgJiYgIShmbGFncyAmIExPT0tVUF9PUEVOKSkgewotCQlsbF9kb3BzX2luaXQoZGVudHJ5LCAxLCAxKTsKLQkJX19kX2x1c3RyZV9pbnZhbGlkYXRlKGRlbnRyeSk7Ci0JCWRfYWRkKGRlbnRyeSwgTlVMTCk7CisJaWYgKChmbGFncyAmIExPT0tVUF9DUkVBVEUpICYmICEoZmxhZ3MgJiBMT09LVVBfT1BFTikpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCWlmIChmbGFncyAmIChMT09LVVBfUEFSRU5UfExPT0tVUF9PUEVOfExPT0tVUF9DUkVBVEUpKQogCQlpdHAgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3LmMKaW5kZXggZTliYTM4YS4uNDE2ZjdhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydy5jCkBAIC0xMzUsNyArMTM1LDcgQEAKIAkJfQogCiAJCS8qCi0JCSAqIExvb3AtYmFjayBkcml2ZXIgY2FsbHMgLT5wcmVwYXJlX3dyaXRlKCkgYW5kIC0+c2VuZGZpbGUoKQorCQkgKiBMb29wLWJhY2sgZHJpdmVyIGNhbGxzIC0+cHJlcGFyZV93cml0ZSgpLgogCQkgKiBtZXRob2RzIGRpcmVjdGx5LCBieXBhc3NpbmcgZmlsZSBzeXN0ZW0gLT53cml0ZSgpIG9wZXJhdGlvbiwKIAkJICogc28gY2xfaW8gaGFzIHRvIGJlIGNyZWF0ZWQgaGVyZS4KIAkJICovCkBAIC01NTgsMTAgKzU1OCwxMCBAQAogICogc3RyaXBlZCBvdmVyLCByYXRoZXIgdGhhbiBoYXZpbmcgYSBjb25zdGFudCB2YWx1ZSBmb3IgYWxsIGZpbGVzIGhlcmUuICovCiAKIC8qIFJBU19JTkNSRUFTRV9TVEVQIHNob3VsZCBiZSAoMVVMIDw8IChpbm9kZS0+aV9ibGtiaXRzIC0gUEFHRV9DQUNIRV9TSElGVCkpLgotICogVGVtcHJhcmlseSBzZXQgUkFTX0lOQ1JFQVNFX1NURVAgdG8gMU1CLiBBZnRlciA0TUIgUlBDIGlzIGVuYWJsZWQKKyAqIFRlbXBvcmFyaWx5IHNldCBSQVNfSU5DUkVBU0VfU1RFUCB0byAxTUIuIEFmdGVyIDRNQiBSUEMgaXMgZW5hYmxlZAogICogYnkgZGVmYXVsdCwgdGhpcyBzaG91bGQgYmUgYWRqdXN0ZWQgY29ycmVzcG9uZGluZyB3aXRoIG1heF9yZWFkX2FoZWFkX21iCiAgKiBhbmQgbWF4X3JlYWRfYWhlYWRfcGVyX2ZpbGVfbWIgb3RoZXJ3aXNlIHRoZSByZWFkYWhlYWQgYnVkZ2V0IGNhbiBiZSB1c2VkCi0gKiB1cCBxdWlja2x5IHdoaWNoIHdpbGwgYWZmZWN0IHJlYWQgcGVyZm9ybWFuY2Ugc2lnaW5pZmljYW50bHkuIFNlZSBMVS0yODE2ICovCisgKiB1cCBxdWlja2x5IHdoaWNoIHdpbGwgYWZmZWN0IHJlYWQgcGVyZm9ybWFuY2Ugc2lnbmlmaWNhbnRseS4gU2VlIExVLTI4MTYgKi8KICNkZWZpbmUgUkFTX0lOQ1JFQVNFX1NURVAoaW5vZGUpIChPTkVfTUJfQlJXX1NJWkUgPj4gUEFHRV9DQUNIRV9TSElGVCkKIAogc3RhdGljIGlubGluZSBpbnQgc3RyaWRlX2lvX21vZGUoc3RydWN0IGxsX3JlYWRhaGVhZF9zdGF0ZSAqcmFzKQpAQCAtNTcwLDcgKzU3MCw3IEBACiB9CiAvKiBUaGUgZnVuY3Rpb24gY2FsY3VsYXRlcyBob3cgbXVjaCBwYWdlcyB3aWxsIGJlIHJlYWQgaW4KICAqIFtvZmYsIG9mZiArIGxlbmd0aF0sIGluIHN1Y2ggc3RyaWRlIElPIGFyZWEsCi0gKiBzdHJpZGVfb2Zmc2V0ID0gc3Rfb2ZmLCBzdHJpZGVfbGVuZ2ggPSBzdF9sZW4sCisgKiBzdHJpZGVfb2Zmc2V0ID0gc3Rfb2ZmLCBzdHJpZGVfbGVuZ3RoID0gc3RfbGVuLAogICogc3RyaWRlX3BhZ2VzID0gc3RfcGdzCiAgKgogICogICB8LS0tLS0tLS0tLS0tLS0tLS0tfCoqKioqfC0tLS0tLS0tLS0tLS0tLS0tLXwqKioqKnwtLS0tLS0tLS0tLS18KioqKip8Li4uLgpAQCAtMTA5MCw3ICsxMDkwLDcgQEAKIAlyYXNfc2V0X3N0YXJ0KGlub2RlLCByYXMsIGluZGV4KTsKIAogCWlmIChzdHJpZGVfaW9fbW9kZShyYXMpKQotCQkvKiBTaW5jZSBzdHJpZGUgcmVhZGFoZWFkIGlzIHNlbnRpdml0ZSB0byB0aGUgb2Zmc2V0CisJCS8qIFNpbmNlIHN0cmlkZSByZWFkYWhlYWQgaXMgc2Vuc2l0aXZlIHRvIHRoZSBvZmZzZXQKIAkJICogb2YgcmVhZC1haGVhZCwgc28gd2UgdXNlIG9yaWdpbmFsIG9mZnNldCBoZXJlLAogCQkgKiBpbnN0ZWFkIG9mIHJhc193aW5kb3dfc3RhcnQsIHdoaWNoIGlzIFJQQyBhbGlnbmVkICovCiAJCXJhcy0+cmFzX25leHRfcmVhZGFoZWFkID0gbWF4KGluZGV4LCByYXMtPnJhc19uZXh0X3JlYWRhaGVhZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zdGF0YWhlYWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N0YXRhaGVhZC5jCmluZGV4IGY2YjVmNGI5Li5jODYyNGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zdGF0YWhlYWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zdGF0YWhlYWQuYwpAQCAtNTc3LDcgKzU3Nyw3IEBACiAJICogU29tZW9uZSB0cmlnZ2VyZWQgZ2xpbXBzZSB3aXRoaW4gMSBzZWMgYmVmb3JlLgogCSAqIDEpIFRoZSBmb3JtZXIgZ2xpbXBzZSBzdWNjZWVkZWQgd2l0aCBnbGltcHNlIGxvY2sgZ3JhbnRlZCBieSBPU1QsIGFuZAogCSAqICAgIGlmIHRoZSBsb2NrIGlzIHN0aWxsIGNhY2hlZCBvbiBjbGllbnQsIEFHTCBuZWVkcyB0byBkbyBub3RoaW5nLiBJZgotCSAqICAgIGl0IGlzIGNhbmNlbGxlZCBieSBvdGhlciBjbGllbnQsIEFHTCBtYXliZSBjYW5ub3Qgb2J0YWlvbiBuZXcgbG9jaworCSAqICAgIGl0IGlzIGNhbmNlbGxlZCBieSBvdGhlciBjbGllbnQsIEFHTCBtYXliZSBjYW5ub3Qgb2J0YWluIG5ldyBsb2NrCiAJICogICAgZm9yIG5vIGdsaW1wc2UgY2FsbGJhY2sgdHJpZ2dlcmVkIGJ5IEFHTC4KIAkgKiAyKSBUaGUgZm9ybWVyIGdsaW1wc2Ugc3VjY2VlZGVkLCBidXQgT1NUIGRpZCBub3QgZ3JhbnQgZ2xpbXBzZSBsb2NrLgogCSAqICAgIFVuZGVyIHN1Y2ggY2FzZSwgaXQgaXMgcXVpdGUgcG9zc2libGUgdGhhdCB0aGUgT1NUIHdpbGwgbm90IGdyYW50CkBAIC04NzcsOSArODc3LDYgQEAKIAlpZiAoZF9tb3VudHBvaW50KGRlbnRyeSkpCiAJCXJldHVybiAxOwogCi0JaWYgKHVubGlrZWx5KGRlbnRyeSA9PSBkZW50cnktPmRfc2ItPnNfcm9vdCkpCi0JCXJldHVybiAxOwotCiAJZW50cnktPnNlX2lub2RlID0gaWdyYWIoaW5vZGUpOwogCXJjID0gbWRfcmV2YWxpZGF0ZV9sb2NrKGxsX2kybWRleHAoZGlyKSwgJml0LCBsbF9pbm9kZTJmaWQoaW5vZGUpLE5VTEwpOwogCWlmIChyYyA9PSAxKSB7CkBAIC0xNTg4LDggKzE1ODUsMTUgQEAKIAkJCQkJCWxsX2lub2RlMmZpZChpbm9kZSksICZiaXRzKTsKIAkJCWlmIChyYyA9PSAxKSB7CiAJCQkJaWYgKCgqZGVudHJ5cCktPmRfaW5vZGUgPT0gTlVMTCkgewotCQkJCQkqZGVudHJ5cCA9IGxsX3NwbGljZV9hbGlhcyhpbm9kZSwKKwkJCQkJc3RydWN0IGRlbnRyeSAqYWxpYXM7CisKKwkJCQkJYWxpYXMgPSBsbF9zcGxpY2VfYWxpYXMoaW5vZGUsCiAJCQkJCQkJCSAgICpkZW50cnlwKTsKKwkJCQkJaWYgKElTX0VSUihhbGlhcykpIHsKKwkJCQkJCWxsX3NhaV91bnBsdWcoc2FpLCBlbnRyeSk7CisJCQkJCQlyZXR1cm4gUFRSX0VSUihhbGlhcyk7CisJCQkJCX0KKwkJCQkJKmRlbnRyeXAgPSBhbGlhczsKIAkJCQl9IGVsc2UgaWYgKCgqZGVudHJ5cCktPmRfaW5vZGUgIT0gaW5vZGUpIHsKIAkJCQkJLyogcmV2YWxpZGF0ZSwgYnV0IGlub2RlIGlzIHJlY3JlYXRlZCAqLwogCQkJCQlDREVCVUcoRF9SRUFEQSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9pby5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2lvLmMKaW5kZXggOTNjYmZiYi4uYzdkNzAwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2lvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2lvLmMKQEAgLTUxLDcgKzUxLDcgQEAKIAkJCQljb25zdCBzdHJ1Y3QgY2xfaW9fc2xpY2UgKnNsaWNlKTsKIAogLyoqCi0gKiBUcnVlLCBpZiBcYSBpbyBpcyBhIG5vcm1hbCBpbywgRmFsc2UgZm9yIHNlbmRmaWxlKCkgLyBzcGxpY2Vfe3JlYWR8d3JpdGV9CisgKiBUcnVlLCBpZiBcYSBpbyBpcyBhIG5vcm1hbCBpbywgRmFsc2UgZm9yIHNwbGljZV97cmVhZCx3cml0ZX0KICAqLwogaW50IGNsX2lzX25vcm1hbGlvKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgY29uc3Qgc3RydWN0IGNsX2lvICppbykKIHsKQEAgLTQ3NCwyMCArNDc0LDYgQEAKIAl2dnBfaW9fZmluaShlbnYsIGlvcyk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGx1c3RyZV9nZW5lcmljX2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJc3RydWN0IGNjY19pbyAqdmlvLCBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIGdlbmVyaWNfZmlsZV9haW9fcmVhZCh2aW8tPmN1aV9pb2NiLCB2aW8tPmN1aV9pb3YsCi0JCQkJICAgICB2aW8tPmN1aV9ucnNlZ3MsICpwcG9zKTsKLX0KLQotc3RhdGljIHNzaXplX3QgbHVzdHJlX2dlbmVyaWNfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJc3RydWN0IGNjY19pbyAqdmlvLCBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIGdlbmVyaWNfZmlsZV9haW9fd3JpdGUodmlvLT5jdWlfaW9jYiwgdmlvLT5jdWlfaW92LAotCQkJCSAgICAgIHZpby0+Y3VpX25yc2VncywgKnBwb3MpOwotfQotCiBzdGF0aWMgaW50IHZ2cF9pb19yZWFkX3N0YXJ0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKIAkJCSAgICAgY29uc3Qgc3RydWN0IGNsX2lvX3NsaWNlICppb3MpCiB7CkBAIC01NDAsOCArNTI2LDExIEBACiAJZmlsZV9hY2Nlc3NlZChmaWxlKTsKIAlzd2l0Y2ggKHZpby0+Y3VpX2lvX3N1YnR5cGUpIHsKIAljYXNlIElPX05PUk1BTDoKLQkJIHJlc3VsdCA9IGx1c3RyZV9nZW5lcmljX2ZpbGVfcmVhZChmaWxlLCBjaW8sICZwb3MpOwotCQkgYnJlYWs7CisJCUxBU1NFUlQoY2lvLT5jdWlfaW9jYi0+a2lfcG9zID09IHBvcyk7CisJCXJlc3VsdCA9IGdlbmVyaWNfZmlsZV9haW9fcmVhZChjaW8tPmN1aV9pb2NiLAorCQkJCQkgICAgICAgY2lvLT5jdWlfaW92LCBjaW8tPmN1aV9ucnNlZ3MsCisJCQkJCSAgICAgICBjaW8tPmN1aV9pb2NiLT5raV9wb3MpOworCQlicmVhazsKIAljYXNlIElPX1NQTElDRToKIAkJcmVzdWx0ID0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkKGZpbGUsICZwb3MsCiAJCQkJdmlvLT51LnNwbGljZS5jdWlfcGlwZSwgY250LApAQCAtNTg2LDcgKzU3NSw2IEBACiAJc3RydWN0IGNsX2lvICAgICAgICppbyAgICA9IGlvcy0+Y2lzX2lvOwogCXN0cnVjdCBjbF9vYmplY3QgICAqb2JqICAgPSBpby0+Y2lfb2JqOwogCXN0cnVjdCBpbm9kZSAgICAgICAqaW5vZGUgPSBjY2Nfb2JqZWN0X2lub2RlKG9iaik7Ci0Jc3RydWN0IGZpbGUJKmZpbGUgID0gY2lvLT5jdWlfZmQtPmZkX2ZpbGU7CiAJc3NpemVfdCByZXN1bHQgPSAwOwogCWxvZmZfdCBwb3MgPSBpby0+dS5jaV93ci53ci5jcndfcG9zOwogCXNpemVfdCBjbnQgPSBpby0+dS5jaV93ci53ci5jcndfY291bnQ7CkBAIC02MDEsNiArNTg5LDggQEAKIAkJICovCiAJCXBvcyA9IGlvLT51LmNpX3dyLndyLmNyd19wb3MgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJCWNpby0+Y3VpX2lvY2ItPmtpX3BvcyA9IHBvczsKKwl9IGVsc2UgeworCQlMQVNTRVJUKGNpby0+Y3VpX2lvY2ItPmtpX3BvcyA9PSBwb3MpOwogCX0KIAogCUNERUJVRyhEX1ZGU1RSQUNFLCAid3JpdGU6IFslbGxpLCAlbGxpKVxuIiwgcG9zLCBwb3MgKyAobG9uZyBsb25nKWNudCk7CkBAIC02MDgsOCArNTk4LDkgQEAKIAlpZiAoY2lvLT5jdWlfaW92ID09IE5VTEwpIC8qIGZyb20gYSB0ZW1wIGlvIGluIGxsX2NsX2luaXQoKS4gKi8KIAkJcmVzdWx0ID0gMDsKIAllbHNlCi0JCXJlc3VsdCA9IGx1c3RyZV9nZW5lcmljX2ZpbGVfd3JpdGUoZmlsZSwgY2lvLCAmcG9zKTsKLQorCQlyZXN1bHQgPSBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlKGNpby0+Y3VpX2lvY2IsCisJCQkJCQljaW8tPmN1aV9pb3YsIGNpby0+Y3VpX25yc2VncywKKwkJCQkJCWNpby0+Y3VpX2lvY2ItPmtpX3Bvcyk7CiAJaWYgKHJlc3VsdCA+IDApIHsKIAkJaWYgKHJlc3VsdCA8IGNudCkKIAkJCWlvLT5jaV9jb250aW51ZSA9IDA7CkBAIC02NTUsNyArNjQ2LDcgQEAKIAlpZiAoY2Zpby0+ZmF1bHQuZnRfZmxhZ3MgJiBWTV9GQVVMVF9SRVRSWSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKLQlDRVJST1IoInVua25vdyBlcnJvciBpbiBwYWdlIGZhdWx0ICVkIVxuIiwgY2Zpby0+ZmF1bHQuZnRfZmxhZ3MpOworCUNFUlJPUigiVW5rbm93biBlcnJvciBpbiBwYWdlIGZhdWx0ICVkIVxuIiwgY2Zpby0+ZmF1bHQuZnRfZmxhZ3MpOwogCXJldHVybiAtRUlOVkFMOwogfQogCkBAIC0xMjAxLDcgKzExOTIsNyBAQAogCQlpZiAocmVzdWx0ID09IC1FTk9FTlQpCiAJCQkvKiBJZiB0aGUgaW5vZGUgb24gTURTIGhhcyBiZWVuIHJlbW92ZWQsIGJ1dCB0aGUgb2JqZWN0cwogCQkJICogb24gT1NUcyBoYXZlbid0IGJlZW4gZGVzdHJveWVkIChhc3luYyB1bmxpbmspLCBsYXlvdXQKLQkJCSAqIGZldGNoIHdpbGwgcmV0dXJuIC1FTk9FTlQsIHdlJ2QgaW5nb3JlIHRoaXMgZXJyb3IKKwkJCSAqIGZldGNoIHdpbGwgcmV0dXJuIC1FTk9FTlQsIHdlJ2QgaWdub3JlIHRoaXMgZXJyb3IKIAkJCSAqIGFuZCBjb250aW51ZSB3aXRoIGRpcnR5IGZsdXNoLiBMVS0zMjMwLiAqLwogCQkJcmVzdWx0ID0gMDsKIAkJaWYgKHJlc3VsdCA8IDApCkBAIC0xMjE2LDcgKzEyMDcsNyBAQAogc3RhdGljIHN0cnVjdCB2dnBfaW8gKmNsMnZ2cF9pbyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCiAJCQkJY29uc3Qgc3RydWN0IGNsX2lvX3NsaWNlICpzbGljZSkKIHsKLQkvKiBDYWxpbmcganVzdCBmb3IgYXNzZXJ0aW9uICovCisJLyogQ2FsbGluZyBqdXN0IGZvciBhc3NlcnRpb24gKi8KIAljbDJjY2NfaW8oZW52LCBzbGljZSk7CiAJcmV0dXJuIHZ2cF9lbnZfaW8oZW52KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0ci5jCmluZGV4IDNhN2QwM2MuLmIxZWQ0ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUveGF0dHIuYwpAQCAtOTUsNyArOTUsNyBAQAogCiAJaWYgKHhhdHRyX3R5cGUgPT0gWEFUVFJfVVNFUl9UICYmICEoc2JpLT5sbF9mbGFncyAmIExMX1NCSV9VU0VSX1hBVFRSKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCWlmICh4YXR0cl90eXBlID09IFhBVFRSX1RSVVNURURfVCAmJiAhY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQorCWlmICh4YXR0cl90eXBlID09IFhBVFRSX1RSVVNURURfVCAmJiAhY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAJaWYgKHhhdHRyX3R5cGUgPT0gWEFUVFJfT1RIRVJfVCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtMTgzLDE3ICsxODMsMTEgQEAKIAkJdmFsaWQgfD0gcmNlX29wczJ2YWxpZChyY2UtPnJjZV9vcHMpOwogCX0KICNlbmRpZgotCWlmIChzYmktPmxsX3hhdHRyX2NhY2hlX2VuYWJsZWQgJiYKLQkgICAgKHJjZSA9PSBOVUxMIHx8IHJjZS0+cmNlX29wcyA9PSBSTVRfTFNFVEZBQ0wpKSB7Ci0JCXJjID0gbGxfeGF0dHJfY2FjaGVfdXBkYXRlKGlub2RlLCBuYW1lLCBwdiwgc2l6ZSwgdmFsaWQsIGZsYWdzKTsKLQl9IGVsc2UgewogCQlvYyA9IGxsX21kc2NhcGFfZ2V0KGlub2RlKTsKIAkJcmMgPSBtZF9zZXR4YXR0cihzYmktPmxsX21kX2V4cCwgbGxfaW5vZGUyZmlkKGlub2RlKSwgb2MsCiAJCQkJdmFsaWQsIG5hbWUsIHB2LCBzaXplLCAwLCBmbGFncywKIAkJCQlsbF9pMnN1cHBnaWQoaW5vZGUpLCAmcmVxKTsKIAkJY2FwYV9wdXQob2MpOwotCX0KLQogI2lmZGVmIENPTkZJR19GU19QT1NJWF9BQ0wKIAlpZiAobmV3X3ZhbHVlICE9IE5VTEwpCiAJCWx1c3RyZV9wb3NpeF9hY2xfeGF0dHJfZnJlZShuZXdfdmFsdWUsIHNpemUpOwpAQCAtMjkyLDYgKzI4Niw3IEBACiAJdm9pZCAqeGRhdGE7CiAJc3RydWN0IG9iZF9jYXBhICpvYzsKIAlzdHJ1Y3Qgcm10YWNsX2N0bF9lbnRyeSAqcmNlID0gTlVMTDsKKwlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKIAogCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOmlub2RlPSVsdS8ldSglcClcbiIsCiAJICAgICAgIGlub2RlLT5pX2lubywgaW5vZGUtPmlfZ2VuZXJhdGlvbiwgaW5vZGUpOwpAQCAtMzM5LDcgKzMzNCw3IEBACiAJICovCiAJaWYgKHhhdHRyX3R5cGUgPT0gWEFUVFJfQUNMX0FDQ0VTU19UICYmCiAJICAgICEoc2JpLT5sbF9mbGFncyAmIExMX1NCSV9STVRfQ0xJRU5UKSkgewotCQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKKwogCQlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CiAKIAkJc3Bpbl9sb2NrKCZsbGktPmxsaV9sb2NrKTsKQEAgLTM1OCwxMyArMzUzLDI3IEBACiAjZW5kaWYKIAogZG9fZ2V0eGF0dHI6Ci0JaWYgKHNiaS0+bGxfeGF0dHJfY2FjaGVfZW5hYmxlZCAmJiAocmNlID09IE5VTEwgfHwKLQkJCQkJICAgIHJjZS0+cmNlX29wcyA9PSBSTVRfTEdFVEZBQ0wgfHwKLQkJCQkJICAgIHJjZS0+cmNlX29wcyA9PSBSTVRfTFNFVEZBQ0wpKSB7CisJaWYgKHNiaS0+bGxfeGF0dHJfY2FjaGVfZW5hYmxlZCAmJiB4YXR0cl90eXBlICE9IFhBVFRSX0FDTF9BQ0NFU1NfVCkgewogCQlyYyA9IGxsX3hhdHRyX2NhY2hlX2dldChpbm9kZSwgbmFtZSwgYnVmZmVyLCBzaXplLCB2YWxpZCk7CisJCWlmIChyYyA9PSAtRUFHQUlOKQorCQkJZ290byBnZXR4YXR0cl9ub2NhY2hlOwogCQlpZiAocmMgPCAwKQogCQkJR09UTyhvdXRfeGF0dHIsIHJjKTsKKworCQkvKiBBZGQgInN5c3RlbS5wb3NpeF9hY2xfYWNjZXNzIiB0byB0aGUgbGlzdCAqLworCQlpZiAobGxpLT5sbGlfcG9zaXhfYWNsICE9IE5VTEwgJiYgdmFsaWQgJiBPQkRfTURfRkxYQVRUUkxTKSB7CisJCQlpZiAoc2l6ZSA9PSAwKSB7CisJCQkJcmMgKz0gc2l6ZW9mKFhBVFRSX05BTUVfQUNMX0FDQ0VTUyk7CisJCQl9IGVsc2UgaWYgKHNpemUgLSByYyA+PSBzaXplb2YoWEFUVFJfTkFNRV9BQ0xfQUNDRVNTKSkgeworCQkJCW1lbWNweShidWZmZXIgKyByYywgWEFUVFJfTkFNRV9BQ0xfQUNDRVNTLAorCQkJCSAgICAgICBzaXplb2YoWEFUVFJfTkFNRV9BQ0xfQUNDRVNTKSk7CisJCQkJcmMgKz0gc2l6ZW9mKFhBVFRSX05BTUVfQUNMX0FDQ0VTUyk7CisJCQl9IGVsc2UgeworCQkJCUdPVE8ob3V0X3hhdHRyLCByYyA9IC1FUkFOR0UpOworCQkJfQorCQl9CiAJfSBlbHNlIHsKK2dldHhhdHRyX25vY2FjaGU6CiAJCW9jID0gbGxfbWRzY2FwYV9nZXQoaW5vZGUpOwogCQlyYyA9IG1kX2dldHhhdHRyKHNiaS0+bGxfbWRfZXhwLCBsbF9pbm9kZTJmaWQoaW5vZGUpLCBvYywKIAkJCQl2YWxpZCB8IChyY2UgPyByY2Vfb3BzMnZhbGlkKHJjZS0+cmNlX29wcykgOiAwKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyX2NhY2hlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0cl9jYWNoZS5jCmluZGV4IDNlM2JlMWYuLjRkZWZhMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyX2NhY2hlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUveGF0dHJfY2FjaGUuYwpAQCAtOTgsMTMgKzk4LDEzIEBACiB9CiAKIC8qKgotICogVGhpcyBhZGRzIG9yIHVwZGF0ZXMgYW4geGF0dHIuCisgKiBUaGlzIGFkZHMgYW4geGF0dHIuCiAgKgogICogQWRkIEB4YXR0cl9uYW1lIGF0dHIgd2l0aCBAeGF0dHJfdmFsIHZhbHVlIGFuZCBAeGF0dHJfdmFsX2xlbiBsZW5ndGgsCi0gKiBpZiB0aGUgYXR0cmlidXRlIGFscmVhZHkgZXhpc3RzLCB0aGVuIHVwZGF0ZSBpdHMgdmFsdWUuCiAgKgogICogXHJldHZhbCAwICAgICAgIHN1Y2Nlc3MKICAqIFxyZXR2YWwgLUVOT01FTSBpZiBubyBtZW1vcnkgY291bGQgYmUgYWxsb2NhdGVkIGZvciB0aGUgY2FjaGVkIGF0dHIKKyAqIFxyZXR2YWwgLUVQUk9UTyBpZiBkdXBsaWNhdGUgeGF0dHIgaXMgYmVpbmcgYWRkZWQKICAqLwogc3RhdGljIGludCBsbF94YXR0cl9jYWNoZV9hZGQoc3RydWN0IGxpc3RfaGVhZCAqY2FjaGUsCiAJCQkgICAgICBjb25zdCBjaGFyICp4YXR0cl9uYW1lLApAQCAtMTE2LDI3ICsxMTYsOCBAQAogCiAKIAlpZiAobGxfeGF0dHJfY2FjaGVfZmluZChjYWNoZSwgeGF0dHJfbmFtZSwgJnhhdHRyKSA9PSAwKSB7Ci0JCS8qIEZvdW5kIGEgY2FjaGVkIEVBLCB1cGRhdGUgaXQgKi8KLQotCQlpZiAoeGF0dHJfdmFsX2xlbiAhPSB4YXR0ci0+eGVfdmFsbGVuKSB7Ci0JCQljaGFyICp2YWw7Ci0JCQlPQkRfQUxMT0ModmFsLCB4YXR0cl92YWxfbGVuKTsKLQkJCWlmICh2YWwgPT0gTlVMTCkgewotCQkJCUNERUJVRyhEX0NBQ0hFLAotCQkJCSAgICAgICAiZmFpbGVkIHRvIGFsbG9jYXRlICV1IGJ5dGVzIGZvciB4YXR0ciAlcyB1cGRhdGVcbiIsCi0JCQkJICAgICAgIHhhdHRyX3ZhbF9sZW4sIHhhdHRyX25hbWUpOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQotCQkJT0JEX0ZSRUUoeGF0dHItPnhlX3ZhbHVlLCB4YXR0ci0+eGVfdmFsbGVuKTsKLQkJCXhhdHRyLT54ZV92YWx1ZSA9IHZhbDsKLQkJCXhhdHRyLT54ZV92YWxsZW4gPSB4YXR0cl92YWxfbGVuOwotCQl9Ci0JCW1lbWNweSh4YXR0ci0+eGVfdmFsdWUsIHhhdHRyX3ZhbCwgeGF0dHJfdmFsX2xlbik7Ci0KLQkJQ0RFQlVHKERfQ0FDSEUsICJ1cGRhdGU6IFslc109JS4qc1xuIiwgeGF0dHJfbmFtZSwKLQkJCXhhdHRyX3ZhbF9sZW4sIHhhdHRyX3ZhbCk7Ci0KLQkJcmV0dXJuIDA7CisJCUNERUJVRyhEX0NBQ0hFLCAiZHVwbGljYXRlIHhhdHRyOiBbJXNdXG4iLCB4YXR0cl9uYW1lKTsKKwkJcmV0dXJuIC1FUFJPVE87CiAJfQogCiAJT0JEX1NMQUJfQUxMT0NfUFRSX0dGUCh4YXR0ciwgeGF0dHJfa21lbSwgX19HRlBfSU8pOwpAQCAtMjYxLDcgKzI0Miw3IEBACiAgKgogICogRnJlZSBhbGwgeGF0dHIgbWVtb3J5LiBAbGxpIGlzIHRoZSBpbm9kZSBpbmZvIHBvaW50ZXIuCiAgKgotICogXHJldHZhbCAwIG5vIGVycm9yIG9jY3VyZWQKKyAqIFxyZXR2YWwgMCBubyBlcnJvciBvY2N1cnJlZAogICovCiBzdGF0aWMgaW50IGxsX3hhdHRyX2NhY2hlX2Rlc3Ryb3lfbG9ja2VkKHN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkpCiB7CkBAIC0yOTIsMTQgKzI3MywxNCBAQAogfQogCiAvKioKLSAqIE1hdGNoIG9yIGVucXVldWUgYSBQUiBvciBQVyBMRExNIGxvY2suCisgKiBNYXRjaCBvciBlbnF1ZXVlIGEgUFIgbG9jay4KICAqCiAgKiBGaW5kIG9yIHJlcXVlc3QgYW4gTERMTSBsb2NrIHdpdGggeGF0dHIgZGF0YS4KICAqIFNpbmNlIExETE0gZG9lcyBub3QgcHJvdmlkZSBBUEkgZm9yIGF0b21pYyBtYXRjaF9vcl9lbnF1ZXVlLAogICogdGhlIGZ1bmN0aW9uIGhhbmRsZXMgaXQgd2l0aCBhIHNlcGFyYXRlIGVucSBsb2NrLgogICogSWYgc3VjY2Vzc2Z1bCwgdGhlIGZ1bmN0aW9uIGV4aXRzIHdpdGggdGhlIGxpc3QgbG9jayBoZWxkLgogICoKLSAqIFxyZXR2YWwgMCAgICAgICBubyBlcnJvciBvY2N1cmVkCisgKiBccmV0dmFsIDAgICAgICAgbm8gZXJyb3Igb2NjdXJyZWQKICAqIFxyZXR2YWwgLUVOT01FTSBub3QgZW5vdWdoIG1lbW9yeQogICovCiBzdGF0aWMgaW50IGxsX3hhdHRyX2ZpbmRfZ2V0X2xvY2soc3RydWN0IGlub2RlICppbm9kZSwKQEAgLTMyMiw5ICszMDMsNyBAQAogCiAJbXV0ZXhfbG9jaygmbGxpLT5sbGlfeGF0dHJzX2VucV9sb2NrKTsKIAkvKiBUcnkgbWF0Y2hpbmcgZmlyc3QuICovCi0JbW9kZSA9IGxsX3Rha2VfbWRfbG9jayhpbm9kZSwgTURTX0lOT0RFTE9DS19YQVRUUiwgJmxvY2toLCAwLAotCQkJICAgICAgIG9pdC0+aXRfb3AgPT0gSVRfU0VUWEFUVFIgPyBMQ0tfUFcgOgotCQkJCQkJCSAgIChMQ0tfUFIgfCBMQ0tfUFcpKTsKKwltb2RlID0gbGxfdGFrZV9tZF9sb2NrKGlub2RlLCBNRFNfSU5PREVMT0NLX1hBVFRSLCAmbG9ja2gsIDAsIExDS19QUik7CiAJaWYgKG1vZGUgIT0gMCkgewogCQkvKiBmYWtlIG9pdCBpbiBtZGNfcmV2YWxpZGF0ZV9sb2NrKCkgbWFubmVyICovCiAJCW9pdC0+ZC5sdXN0cmUuaXRfbG9ja19oYW5kbGUgPSBsb2NraC5jb29raWU7CkBAIC0zNDAsMTMgKzMxOSw3IEBACiAJCXJldHVybiBQVFJfRVJSKG9wX2RhdGEpOwogCX0KIAotCW9wX2RhdGEtPm9wX3ZhbGlkID0gT0JEX01EX0ZMWEFUVFIgfCBPQkRfTURfRkxYQVRUUkxTIHwKLQkJCSAgICBPQkRfTURfRkxYQVRUUkxPQ0tFRDsKLSNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCi0JLyogSWYgd29ya2luZyB3aXRoIEFDTHMsIHdlIHdvdWxkIGxpa2UgdG8gY2FjaGUgbG9jYWwgQUNMcyAqLwotCWlmIChzYmktPmxsX2ZsYWdzICYgTExfU0JJX1JNVF9DTElFTlQpCi0JCW9wX2RhdGEtPm9wX3ZhbGlkIHw9IE9CRF9NRF9GTFJNVExHRVRGQUNMOwotI2VuZGlmCisJb3BfZGF0YS0+b3BfdmFsaWQgPSBPQkRfTURfRkxYQVRUUiB8IE9CRF9NRF9GTFhBVFRSTFM7CiAKIAlyYyA9IG1kX2VucXVldWUoZXhwLCAmZWluZm8sIG9pdCwgb3BfZGF0YSwgJmxvY2toLCBOVUxMLCAwLCBOVUxMLCAwKTsKIAlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKQEAgLTM3NCw3ICszNDcsNyBAQAogICogYSByZWFkIG9yIGEgd3JpdGUgeGF0dHIgbG9jayBkZXBlbmRpbmcgb24gb3BlcmF0aW9uIGluIEBvaXQuCiAgKiBJbnRlbnQgaXMgZHJvcHBlZCBvbiBleGl0IHVubGVzcyB0aGUgb3BlcmF0aW9uIGlzIHNldHhhdHRyLgogICoKLSAqIFxyZXR2YWwgMCAgICAgICBubyBlcnJvciBvY2N1cmVkCisgKiBccmV0dmFsIDAgICAgICAgbm8gZXJyb3Igb2NjdXJyZWQKICAqIFxyZXR2YWwgLUVQUk9UTyBuZXR3b3JrIHByb3RvY29sIGVycm9yCiAgKiBccmV0dmFsIC1FTk9NRU0gbm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBjYWNoZQogICovCkBAIC00MDksNyArMzgyLDExIEBACiAJaWYgKG9pdC0+ZC5sdXN0cmUuaXRfc3RhdHVzIDwgMCkgewogCQlDREVCVUcoRF9DQUNIRSwgImdldHhhdHRyIGludGVudCByZXR1cm5lZCAlZCBmb3IgZmlkICJERklEIlxuIiwKIAkJICAgICAgIG9pdC0+ZC5sdXN0cmUuaXRfc3RhdHVzLCBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpKTsKLQkJR09UTyhvdXRfZGVzdHJveSwgcmMgPSBvaXQtPmQubHVzdHJlLml0X3N0YXR1cyk7CisJCXJjID0gb2l0LT5kLmx1c3RyZS5pdF9zdGF0dXM7CisJCS8qIHhhdHRyIGRhdGEgaXMgc28gbGFyZ2UgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGNhY2hlIGl0ICovCisJCWlmIChyYyA9PSAtRVJBTkdFKQorCQkJcmMgPSAtRUFHQUlOOworCQlHT1RPKG91dF9kZXN0cm95LCByYyk7CiAJfQogCiAJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CkBAIC00NDcsNiArNDI0LDExIEBACiAJCQlyYyA9IC1FUFJPVE87CiAJCX0gZWxzZSBpZiAoT0JEX0ZBSUxfQ0hFQ0soT0JEX0ZBSUxfTExJVEVfWEFUVFJfRU5PTUVNKSkgewogCQkJcmMgPSAtRU5PTUVNOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoeGRhdGEsIFhBVFRSX05BTUVfQUNMX0FDQ0VTUykpIHsKKwkJCS8qIEZpbHRlciBvdXQgQUNMIEFDQ0VTUyBzaW5jZSBpdCdzIGNhY2hlZCBzZXBhcmF0ZWx5ICovCisJCQlDREVCVUcoRF9DQUNIRSwgIm5vdCBjYWNoaW5nICVzXG4iLAorCQkJICAgICAgIFhBVFRSX05BTUVfQUNMX0FDQ0VTUyk7CisJCQlyYyA9IDA7CiAJCX0gZWxzZSB7CiAJCQlyYyA9IGxsX3hhdHRyX2NhY2hlX2FkZCgmbGxpLT5sbGlfeGF0dHJzLCB4ZGF0YSwgeHZhbCwKIAkJCQkJCSp4c2l6ZXMpOwpAQCAtNDY3LDggKzQ0OSw3IEBACiAKIAlHT1RPKG91dF9tYXliZV9kcm9wLCByYyk7CiBvdXRfbWF5YmVfZHJvcDoKLQkvKiBkcm9wIGxvY2sgb24gZXJyb3Igb3IgZ2V0eGF0dHIgKi8KLQlpZiAocmMgIT0gMCB8fCBvaXQtPml0X29wICE9IElUX1NFVFhBVFRSKQorCiAJCWxsX2ludGVudF9kcm9wX2xvY2sob2l0KTsKIAogCWlmIChyYyAhPSAwKQpAQCAtNDk2LDcgKzQ3Nyw3IEBACiAgKiBUaGUgcmVzdWx0aW5nIHZhbHVlL2xpc3QgaXMgc3RvcmVkIGluIEBidWZmZXIgaWYgdGhlIGZvcm1lcgogICogaXMgbm90IGxhcmdlciB0aGFuIEBzaXplLgogICoKLSAqIFxyZXR2YWwgMCAgICAgICAgbm8gZXJyb3Igb2NjdXJlZAorICogXHJldHZhbCAwICAgICAgICBubyBlcnJvciBvY2N1cnJlZAogICogXHJldHZhbCAtRVBST1RPICBuZXR3b3JrIHByb3RvY29sIGVycm9yCiAgKiBccmV0dmFsIC1FTk9NRU0gIG5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgY2FjaGUKICAqIFxyZXR2YWwgLUVSQU5HRSAgdGhlIGJ1ZmZlciBpcyBub3QgbGFyZ2UgZW5vdWdoCkBAIC01NTMsNjUgKzUzNCwzIEBACiAKIAlyZXR1cm4gcmM7CiB9Ci0KLQotLyoqCi0gKiBTZXQvdXBkYXRlIGFuIHhhdHRyIHZhbHVlIG9yIHJlbW92ZSB4YXR0ciB1c2luZyB0aGUgd3JpdGUtdGhyb3VnaCBjYWNoZS4KLSAqCi0gKiBTZXQvdXBkYXRlIHRoZSB4YXR0ciB2YWx1ZSAoaWYgQHZhbGlkIGhhcyBPQkRfTURfRkxYQVRUUikgb2YgQG5hbWUgdG8gQG5ld3ZhbAotICogb3IKLSAqIHJlbW92ZSB0aGUgeGF0dHIgQG5hbWUgKEB2YWxpZCBoYXMgT0JEX01EX0ZMWEFUVFJSTSBzZXQpIGZyb20gQGlub2RlLgotICogQGZsYWdzIGlzIGVpdGhlciBYQVRUUl9DUkVBVEUgb3IgWEFUVFJfUkVQTEFDRSBhcyBkZWZpbmVkIGJ5IHNldHhhdHRyKDIpCi0gKgotICogXHJldHZhbCAwICAgICAgICBubyBlcnJvciBvY2N1cmVkCi0gKiBccmV0dmFsIC1FUFJPVE8gIG5ldHdvcmsgcHJvdG9jb2wgZXJyb3IKLSAqIFxyZXR2YWwgLUVOT01FTSAgbm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBjYWNoZQotICogXHJldHZhbCAtRVJBTkdFICB0aGUgYnVmZmVyIGlzIG5vdCBsYXJnZSBlbm91Z2gKLSAqIFxyZXR2YWwgLUVOT0RBVEEgbm8gc3VjaCBhdHRyIChpbiB0aGUgcmVtb3ZhbCBjYXNlKQotICovCi1pbnQgbGxfeGF0dHJfY2FjaGVfdXBkYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQljb25zdCBjaGFyICpuYW1lLAotCQkJY29uc3QgY2hhciAqbmV3dmFsLAotCQkJc2l6ZV90IHNpemUsCi0JCQlfX3U2NCB2YWxpZCwKLQkJCWludCBmbGFncykKLXsKLQlzdHJ1Y3QgbG9va3VwX2ludGVudCBvaXQgPSB7IC5pdF9vcCA9IElUX1NFVFhBVFRSIH07Ci0Jc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX2kyc2JpKGlub2RlKTsKLQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSA9IE5VTEw7Ci0Jc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7Ci0Jc3RydWN0IG9iZF9jYXBhICpvYzsKLQlpbnQgcmM7Ci0KLQotCi0JTEFTU0VSVCghISh2YWxpZCAmIE9CRF9NRF9GTFhBVFRSKSBeICEhKHZhbGlkICYgT0JEX01EX0ZMWEFUVFJSTSkpOwotCi0JcmMgPSBsbF94YXR0cl9jYWNoZV9yZWZpbGwoaW5vZGUsICZvaXQpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0Jb2MgPSBsbF9tZHNjYXBhX2dldChpbm9kZSk7Ci0JcmMgPSBtZF9zZXR4YXR0cihzYmktPmxsX21kX2V4cCwgbGxfaW5vZGUyZmlkKGlub2RlKSwgb2MsCi0JCQl2YWxpZCB8IE9CRF9NRF9GTFhBVFRSTE9DS0VELCBuYW1lLCBuZXd2YWwsCi0JCQlzaXplLCAwLCBmbGFncywgbGxfaTJzdXBwZ2lkKGlub2RlKSwgJnJlcSk7Ci0JY2FwYV9wdXQob2MpOwotCi0JaWYgKHJjKSB7Ci0JCWxsX2ludGVudF9kcm9wX2xvY2soJm9pdCk7Ci0JCUdPVE8ob3V0LCByYyk7Ci0JfQotCi0JaWYgKHZhbGlkICYgT0JEX01EX0ZMWEFUVFIpCi0JCXJjID0gbGxfeGF0dHJfY2FjaGVfYWRkKCZsbGktPmxsaV94YXR0cnMsIG5hbWUsIG5ld3ZhbCwgc2l6ZSk7Ci0JZWxzZSBpZiAodmFsaWQgJiBPQkRfTURfRkxYQVRUUlJNKQotCQlyYyA9IGxsX3hhdHRyX2NhY2hlX2RlbCgmbGxpLT5sbGlfeGF0dHJzLCBuYW1lKTsKLQotCWxsX2ludGVudF9kcm9wX2xvY2soJm9pdCk7Ci0JR09UTyhvdXQsIHJjKTsKLW91dDoKLQl1cF93cml0ZSgmbGxpLT5sbGlfeGF0dHJzX2xpc3RfcndzZW0pOwotCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKLQotCXJldHVybiByYzsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfaW50ZW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ludGVudC5jCmluZGV4IDU2ZGVkY2UuLjliYTVhMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfaW50ZW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9pbnRlbnQuYwpAQCAtMTE5LDcgKzExOSw2IEBACiAJQ0RFQlVHKERfSU5PREUsICJSRU1PVEVfSU5URU5UIHdpdGggZmlkPSJERklEIiAtPiBtZHMgIyVkXG4iLAogCSAgICAgICBQRklEKCZib2R5LT5maWQxKSwgdGd0LT5sdGRfaWR4KTsKIAotCWl0LT5kLmx1c3RyZS5pdF9kaXNwb3NpdGlvbiAmPSB+RElTUF9FTlFfQ09NUExFVEU7CiAJcmMgPSBtZF9pbnRlbnRfbG9jayh0Z3QtPmx0ZF9leHAsIG9wX2RhdGEsIGxtbSwgbG1tc2l6ZSwgaXQsCiAJCQkgICAgZmxhZ3MsICZyZXEsIGNiX2Jsb2NraW5nLCBleHRyYV9sb2NrX2ZsYWdzKTsKIAlpZiAocmMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X29iZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9vYmQuYwppbmRleCAxYmRkZDhmLi4zYmEwYTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X29iZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfb2JkLmMKQEAgLTE3NDQsNyArMTc0NCw2IEBACiAJaXQtPmQubHVzdHJlLml0X2RhdGEgPSBOVUxMOwogCWZpZDEgPSBib2R5LT5maWQxOwogCi0JaXQtPmQubHVzdHJlLml0X2Rpc3Bvc2l0aW9uICY9IH5ESVNQX0VOUV9DT01QTEVURTsKIAlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CiAKIAl0Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCAmZmlkMSk7CkBAIC0yNTkzLDcgKzI1OTIsNyBAQAogCiBpbnQgbG12X3NldF9vcGVuX3JlcGxheV9kYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCQkgICAgIHN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSAqb2NoLAotCQkJICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKm9wZW5fcmVxKQorCQkJICAgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQpCiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgICAgICAgKm9iZCA9IGV4cC0+ZXhwX29iZDsKIAlzdHJ1Y3QgbG12X29iZAkgICpsbXYgPSAmb2JkLT51LmxtdjsKQEAgLTI2MDMsNyArMjYwMiw3IEBACiAJaWYgKElTX0VSUih0Z3QpKQogCQlyZXR1cm4gUFRSX0VSUih0Z3QpOwogCi0JcmV0dXJuIG1kX3NldF9vcGVuX3JlcGxheV9kYXRhKHRndC0+bHRkX2V4cCwgb2NoLCBvcGVuX3JlcSk7CisJcmV0dXJuIG1kX3NldF9vcGVuX3JlcGxheV9kYXRhKHRndC0+bHRkX2V4cCwgb2NoLCBpdCk7CiB9CiAKIGludCBsbXZfY2xlYXJfb3Blbl9yZXBsYXlfZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xwcm9jX2xtdi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xwcm9jX2xtdi5jCmluZGV4IGIzNTVkMDEuLjVkNWMzMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9scHJvY19sbXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbHByb2NfbG12LmMKQEAgLTg3LDggKzg3LDkgQEAKIAogI2RlZmluZSBNQVhfUE9MSUNZX1NUUklOR19TSVpFIDY0CiAKLXN0YXRpYyBzc2l6ZV90IGxtdl9wbGFjZW1lbnRfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCi0JCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZikKK3N0YXRpYyBzc2l6ZV90IGxtdl9wbGFjZW1lbnRfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQljb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmKQogewogCXN0cnVjdCBvYmRfZGV2aWNlICpkZXYgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YSktPnByaXZhdGU7CiAJY2hhcgkJICAgICBkdW1teVtNQVhfUE9MSUNZX1NUUklOR19TSVpFICsgMV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2VhLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2VhLmMKaW5kZXggZTZjNjAxNS4uNmYzNTZlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9lYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZWEuYwpAQCAtOTgsNyArOTgsNyBAQAogCiAJT0JEX0FMTE9DX0xBUkdFKGxzbSwgKnNpemUpOwogCWlmICghbHNtKQotCQlyZXR1cm4gTlVMTDs7CisJCXJldHVybiBOVUxMOwogCiAJZm9yIChpID0gMDsgaSA8IHN0cmlwZV9jb3VudDsgaSsrKSB7CiAJCU9CRF9TTEFCX0FMTE9DX1BUUl9HRlAobG9pLCBsb3Zfb2luZm9fc2xhYiwgX19HRlBfSU8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9pby5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9pby5jCmluZGV4IDVhNmFiNzAuLjY1MTMzZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2lvLmMKQEAgLTE5NCw2ICsxOTQsNyBAQAogCQlzdWJfaW8tPmNpX2xvY2tyZXEgPSBpby0+Y2lfbG9ja3JlcTsKIAkJc3ViX2lvLT5jaV90eXBlICAgID0gaW8tPmNpX3R5cGU7CiAJCXN1Yl9pby0+Y2lfbm9fc3J2bG9jayA9IGlvLT5jaV9ub19zcnZsb2NrOworCQlzdWJfaW8tPmNpX25vYXRpbWUgPSBpby0+Y2lfbm9hdGltZTsKIAogCQlsb3Zfc3ViX2VudGVyKHN1Yik7CiAJCXJlc3VsdCA9IGNsX2lvX3N1Yl9pbml0KHN1Yi0+c3ViX2Vudiwgc3ViX2lvLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JkLmMKaW5kZXggNTBhNzdjNS4uMDI1MDlkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iZC5jCkBAIC0zMzksNyArMzM5LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbG92LT5kZXNjLmxkX3RndF9jb3VudDsgaSsrKSB7CiAJCWlmIChsb3YtPmxvdl90Z3RzW2ldICYmIGxvdi0+bG92X3RndHNbaV0tPmx0ZF9leHApIHsKIAkJCS8qIERpc2Nvbm5lY3Rpb24gaXMgdGhlIGxhc3Qgd2Uga25vdyBhYm91dCBhbiBvYmQgKi8KLQkJCWxvdl9kZWxfdGFyZ2V0KG9iZCwgaSwgMCwgbG92LT5sb3ZfdGd0c1tpXS0+bHRkX2dlbik7CisJCQlsb3ZfZGVsX3RhcmdldChvYmQsIGksIE5VTEwsIGxvdi0+bG92X3RndHNbaV0tPmx0ZF9nZW4pOwogCQl9CiAJfQogCW9iZF9wdXRyZWYob2JkKTsKQEAgLTY0NCw3ICs2NDQsNyBAQAogCWlmIChyYykgewogCQlDRVJST1IoImFkZCBmYWlsZWQgKCVkKSwgZGVsZXRpbmcgJXNcbiIsIHJjLAogCQkgICAgICAgb2JkX3V1aWQyc3RyKCZ0Z3QtPmx0ZF91dWlkKSk7Ci0JCWxvdl9kZWxfdGFyZ2V0KG9iZCwgaW5kZXgsIDAsIDApOworCQlsb3ZfZGVsX3RhcmdldChvYmQsIGluZGV4LCBOVUxMLCAwKTsKIAl9CiAJb2JkX3B1dHJlZihvYmQpOwogCXJldHVybiByYzsKQEAgLTc2OCw3ICs3NjgsNyBAQAogCiBpbnQgbG92X3NldHVwKHN0cnVjdCBvYmRfZGV2aWNlICpvYmQsIHN0cnVjdCBsdXN0cmVfY2ZnICpsY2ZnKQogewotCXN0cnVjdCBscHJvY2ZzX3N0YXRpY192YXJzIGx2YXJzID0geyAwIH07CisJc3RydWN0IGxwcm9jZnNfc3RhdGljX3ZhcnMgbHZhcnMgPSB7IE5VTEwgfTsKIAlzdHJ1Y3QgbG92X2Rlc2MgKmRlc2M7CiAJc3RydWN0IGxvdl9vYmQgKmxvdiA9ICZvYmQtPnUubG92OwogCWludCByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JqZWN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iamVjdC5jCmluZGV4IGRmOGI1YjUuLmQ2YjJjYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JqZWN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmplY3QuYwpAQCAtMTIyLDggKzEyMiw4IEBACiB9CiAKIHN0YXRpYyBpbnQgbG92X2luaXRfc3ViKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGxvdl9vYmplY3QgKmxvdiwKLQkJCXN0cnVjdCBjbF9vYmplY3QgKnN0cmlwZSwKLQkJCXN0cnVjdCBsb3ZfbGF5b3V0X3JhaWQwICpyMCwgaW50IGlkeCkKKwkJCXN0cnVjdCBjbF9vYmplY3QgKnN0cmlwZSwgc3RydWN0IGxvdl9sYXlvdXRfcmFpZDAgKnIwLAorCQkJaW50IGlkeCkKIHsKIAlzdHJ1Y3QgY2xfb2JqZWN0X2hlYWRlciAqaGRyOwogCXN0cnVjdCBjbF9vYmplY3RfaGVhZGVyICpzdWJoZHI7CkBAIC0xNDQsNyArMTQ0LDYgQEAKIAogCWhkciAgICA9IGNsX29iamVjdF9oZWFkZXIobG92MmNsKGxvdikpOwogCXN1YmhkciA9IGNsX29iamVjdF9oZWFkZXIoc3RyaXBlKTsKLQlwYXJlbnQgPSBzdWJoZHItPmNvaF9wYXJlbnQ7CiAKIAlvaW5mbyA9IGxvdi0+bG9fbHNtLT5sc21fb2luZm9baWR4XTsKIAlDREVCVUcoRF9JTk9ERSwgREZJRCJAJXBbJWRdIC0+ICJERklEIkAlcDogb3N0aWQ6ICJET1NUSUQKQEAgLTE1Myw4ICsxNTIsMTIgQEAKIAkgICAgICAgUEZJRCgmaGRyLT5jb2hfbHUubG9oX2ZpZCksIGhkciwgUE9TVElEKCZvaW5mby0+bG9pX29pKSwKIAkgICAgICAgb2luZm8tPmxvaV9vc3RfaWR4LCBvaW5mby0+bG9pX29zdF9nZW4pOwogCisJLyogcmV1c2UgLT5jb2hfYXR0cl9ndWFyZCB0byBwcm90ZWN0IGNvaF9wYXJlbnQgY2hhbmdlICovCisJc3Bpbl9sb2NrKCZzdWJoZHItPmNvaF9hdHRyX2d1YXJkKTsKKwlwYXJlbnQgPSBzdWJoZHItPmNvaF9wYXJlbnQ7CiAJaWYgKHBhcmVudCA9PSBOVUxMKSB7CiAJCXN1Ymhkci0+Y29oX3BhcmVudCA9IGhkcjsKKwkJc3Bpbl91bmxvY2soJnN1Ymhkci0+Y29oX2F0dHJfZ3VhcmQpOwogCQlzdWJoZHItPmNvaF9uZXN0aW5nID0gaGRyLT5jb2hfbmVzdGluZyArIDE7CiAJCWx1X29iamVjdF9yZWZfYWRkKCZzdHJpcGUtPmNvX2x1LCAibG92LXBhcmVudCIsIGxvdik7CiAJCXIwLT5sb19zdWJbaWR4XSA9IGNsMmxvdnN1YihzdHJpcGUpOwpAQCAtMTY2LDYgKzE2OSw3IEBACiAJCXN0cnVjdCBsb3Zfb2JqZWN0ICpvbGRfbG92OwogCQl1bnNpZ25lZCBpbnQgbWFzayA9IERfSU5PREU7CiAKKwkJc3Bpbl91bmxvY2soJnN1Ymhkci0+Y29oX2F0dHJfZ3VhcmQpOwogCQlvbGRfb2JqID0gbHVfb2JqZWN0X2xvY2F0ZSgmcGFyZW50LT5jb2hfbHUsICZsb3ZfZGV2aWNlX3R5cGUpOwogCQlMQVNTRVJUKG9sZF9vYmogIT0gTlVMTCk7CiAJCW9sZF9sb3YgPSBjbDJsb3YobHUyY2wob2xkX29iaikpOwpAQCAtMzA2LDcgKzMxMCw3IEBACiAJICogLT5sb19zdWJbXSBzbG90IGluIGxvdnN1Yl9vYmplY3RfZmluaSgpICovCiAJaWYgKHIwLT5sb19zdWJbaWR4XSA9PSBsb3MpIHsKIAkJd2FpdGVyID0gJmxvdl9lbnZfaW5mbyhlbnYpLT5sdGlfd2FpdGVyOwotCQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KHdhaXRlcik7CisJCWluaXRfd2FpdHF1ZXVlX2VudHJ5KHdhaXRlciwgY3VycmVudCk7CiAJCWFkZF93YWl0X3F1ZXVlKCZia3QtPmxzYl9tYXJjaGVfZnVuZWJyZSwgd2FpdGVyKTsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQl3aGlsZSAoMSkgewpAQCAtMzE2LDcgKzMyMCw3IEBACiAJCQlzcGluX2xvY2soJnIwLT5sb19zdWJfbG9jayk7CiAJCQlpZiAocjAtPmxvX3N1YltpZHhdID09IGxvcykgewogCQkJCXNwaW5fdW5sb2NrKCZyMC0+bG9fc3ViX2xvY2spOwotCQkJCXdhaXRxX3dhaXQod2FpdGVyLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQkJc2NoZWR1bGUoKTsKIAkJCX0gZWxzZSB7CiAJCQkJc3Bpbl91bmxvY2soJnIwLT5sb19zdWJfbG9jayk7CiAJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKQEAgLTUwOCw3ICs1MTIsNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLWNvbnN0IHN0YXRpYyBzdHJ1Y3QgbG92X2xheW91dF9vcGVyYXRpb25zIGxvdl9kaXNwYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBsb3ZfbGF5b3V0X29wZXJhdGlvbnMgbG92X2Rpc3BhdGNoW10gPSB7CiAJW0xMVF9FTVBUWV0gPSB7CiAJCS5sbG9faW5pdCAgICAgID0gbG92X2luaXRfZW1wdHksCiAJCS5sbG9fZGVsZXRlICAgID0gbG92X2RlbGV0ZV9lbXB0eSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcGFjay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wYWNrLmMKaW5kZXggMjdlZDI3ZS4uNzQyMDBjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wYWNrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wYWNrLmMKQEAgLTMzOSw3ICszMzksOCBAQAogCiAJKmxzbXAgPSBOVUxMOwogCUxBU1NFUlQoYXRvbWljX3JlYWQoJmxzbS0+bHNtX3JlZmMpID4gMCk7Ci0JaWYgKChyZWZjID0gYXRvbWljX2RlY19yZXR1cm4oJmxzbS0+bHNtX3JlZmMpKSA9PSAwKSB7CisJcmVmYyA9IGF0b21pY19kZWNfcmV0dXJuKCZsc20tPmxzbV9yZWZjKTsKKwlpZiAocmVmYyA9PSAwKSB7CiAJCUxBU1NFUlQobHNtX29wX2ZpbmQobHNtLT5sc21fbWFnaWMpICE9IE5VTEwpOwogCQlsc21fb3BfZmluZChsc20tPmxzbV9tYWdpYyktPmxzbV9mcmVlKGxzbSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9yZXF1ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3JlcXVlc3QuYwppbmRleCBjYTgxY2FjLi5hNTQ4MWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3JlcXVlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3JlcXVlc3QuYwpAQCAtNTAsNyArNTAsNyBAQAogCWF0b21pY19zZXQoJnNldC0+c2V0X2NvbXBsZXRlcywgMCk7CiAJYXRvbWljX3NldCgmc2V0LT5zZXRfc3VjY2VzcywgMCk7CiAJYXRvbWljX3NldCgmc2V0LT5zZXRfZmluaXNoX2NoZWNrZWQsIDApOwotCXNldC0+c2V0X2Nvb2tpZXMgPSAwOworCXNldC0+c2V0X2Nvb2tpZXMgPSBOVUxMOwogCUlOSVRfTElTVF9IRUFEKCZzZXQtPnNldF9saXN0KTsKIAlhdG9taWNfc2V0KCZzZXQtPnNldF9yZWZjb3VudCwgMSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmc2V0LT5zZXRfd2FpdHEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdnN1Yl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZzdWJfZGV2LmMKaW5kZXggOTk4ZWExYy4uOTI2YzM1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdnN1Yl9kZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92c3ViX2Rldi5jCkBAIC0xMzEsNiArMTMxLDEwIEBACiAJc3RydWN0IGxvdnN1Yl9kZXZpY2UgKmxzZCAgPSBsdTJsb3ZzdWJfZGV2KGQpOwogCXN0cnVjdCBsdV9kZXZpY2UgICAgICpuZXh0ID0gY2wybHVfZGV2KGxzZC0+YWNpZF9uZXh0KTsKIAorCWlmIChhdG9taWNfcmVhZCgmZC0+bGRfcmVmKSAmJiBkLT5sZF9zaXRlKSB7CisJCUxJQkNGU19ERUJVR19NU0dfREFUQV9ERUNMKG1zZ2RhdGEsIERfRVJST1IsIE5VTEwpOworCQlsdV9zaXRlX3ByaW50KGVudiwgZC0+bGRfc2l0ZSwgJm1zZ2RhdGEsIGx1X2NkZWJ1Z19wcmludGVyKTsKKwl9CiAJY2xfZGV2aWNlX2ZpbmkobHUyY2xfZGV2KGQpKTsKIAlPQkRfRlJFRV9QVFIobHNkKTsKIAlyZXR1cm4gbmV4dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2x2ZnMvbHZmc19saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbHZmcy9sdmZzX2xpbnV4LmMKaW5kZXggNDI4ZmZkOC4uZTQ0YjdhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbHZmcy9sdmZzX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbHZmcy9sdmZzX2xpbnV4LmMKQEAgLTU1LDcgKzU1LDcgQEAKIAogc3RydWN0IGxwcm9jZnNfc3RhdHMgKm9iZF9tZW1vcnkgPSBOVUxMOwogRVhQT1JUX1NZTUJPTChvYmRfbWVtb3J5KTsKLS8qIHJlZmluZSBsYXRlciBhbmQgY2hhbmdlIHRvIHNlcWxvY2sgb3Igc2ltbGFyIGZyb20gbGliY2ZzICovCisvKiByZWZpbmUgbGF0ZXIgYW5kIGNoYW5nZSB0byBzZXFsb2NrIG9yIHNpbWlsYXIgZnJvbSBsaWJjZnMgKi8KIAogLyogRGVidWdnaW5nIGNoZWNrIG9ubHkgbmVlZGVkIGR1cmluZyBkZXZlbG9wbWVudCAqLwogI2lmZGVmIE9CRF9DVFhUX0RFQlVHCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2ludGVybmFsLmgKaW5kZXggNTA2OTgyOS4uYzc4YmYwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfaW50ZXJuYWwuaApAQCAtMTAxLDcgKzEwMSw3IEBACiAJCXN0cnVjdCBsdXN0cmVfaGFuZGxlICpsb2NraCwgdm9pZCAqbG1tLCBpbnQgbG1tc2l6ZSwKIAkJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxLCBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKTsKIAotaW50IG1kY19yZXNvdXJjZV9nZXRfdW51c2VkKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsdV9maWQgKmZpZCwKK2ludCBtZGNfcmVzb3VyY2VfZ2V0X3VudXNlZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCiAJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqY2FuY2VscywgbGRsbV9tb2RlX3QgbW9kZSwKIAkJCSAgICBfX3U2NCBiaXRzKTsKIC8qIG1kYy9tZGNfcmVxdWVzdC5jICovCkBAIC0xMjIsNyArMTIyLDcgQEAKIAogaW50IG1kY19zZXRfb3Blbl9yZXBsYXlfZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAogCQkJICAgICBzdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGUgKm9jaCwKLQkJCSAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpvcGVuX3JlcSk7CisJCQkgICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCk7CiAKIGludCBtZGNfY2xlYXJfb3Blbl9yZXBsYXlfZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAogCQkJICAgICAgIHN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSAqb2NoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfbGliLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2xpYi5jCmluZGV4IDkxZjY4NzYuLjViOWYzNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfbGliLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19saWIuYwpAQCAtMTk3LDcgKzE5Nyw3IEBACiAJaWYgKGZsYWdzICYgRk1PREVfRVhFQykKIAkJY3JfZmxhZ3MgfD0gTURTX0ZNT0RFX0VYRUM7CiAjZW5kaWYKLQlpZiAoZmxhZ3MgJiBPX0xPVl9ERUxBWV9DUkVBVEUpCisJaWYgKGNsX2lzX2xvdl9kZWxheV9jcmVhdGUoZmxhZ3MpKQogCQljcl9mbGFncyB8PSBNRFNfT1BFTl9ERUxBWV9DUkVBVEU7CiAKIAlpZiAoZmxhZ3MgJiBPX05PTkJMT0NLKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19sb2Nrcy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19sb2Nrcy5jCmluZGV4IDhhYTdjODAuLjUzMDIyZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfbG9ja3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2xvY2tzLmMKQEAgLTM3LDE1ICszNywxNSBAQAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19NREMKIAogIyBpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSMgaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotIyBpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxsdXN0cmVfYWNsLmg+CisjaW5jbHVkZSA8bGludXgvbHVzdHJlX2ludGVudC5oPgorI2luY2x1ZGUgPG9iZC5oPgogI2luY2x1ZGUgPG9iZF9jbGFzcy5oPgogI2luY2x1ZGUgPGx1c3RyZV9kbG0uaD4KLS8qIGZpZF9yZXNfbmFtZV9lcSgpICovCi0jaW5jbHVkZSA8bHVzdHJlX2ZpZC5oPgotI2luY2x1ZGUgPGxwcm9jZnNfc3RhdHVzLmg+CisjaW5jbHVkZSA8bHVzdHJlX2ZpZC5oPiAvKiBmaWRfcmVzX25hbWVfZXEoKSAqLworI2luY2x1ZGUgPGx1c3RyZV9tZGMuaD4KKyNpbmNsdWRlIDxsdXN0cmVfbmV0Lmg+CisjaW5jbHVkZSA8bHVzdHJlX3JlcV9sYXlvdXQuaD4KICNpbmNsdWRlICJtZGNfaW50ZXJuYWwuaCIKIAogc3RydWN0IG1kY19nZXRhdHRyX2FyZ3MgewpAQCAtMTIxLDcgKzEyMSw3IEBACiAJc3RydWN0IGxkbG1fbG9jayAqbG9jazsKIAlzdHJ1Y3QgaW5vZGUgKm5ld19pbm9kZSA9IGRhdGE7CiAKLQlpZihiaXRzKQorCWlmIChiaXRzKQogCQkqYml0cyA9IDA7CiAKIAlpZiAoISpsb2NraCkKQEAgLTE2MCw2ICsxNjAsOCBAQAogCWxkbG1fbW9kZV90IHJjOwogCiAJZmlkX2J1aWxkX3JlZ19yZXNfbmFtZShmaWQsICZyZXNfaWQpOworCS8qIExVLTQ0MDU6IENsZWFyIGJpdHMgbm90IHN1cHBvcnRlZCBieSBzZXJ2ZXIgKi8KKwlwb2xpY3ktPmxfaW5vZGViaXRzLmJpdHMgJj0gZXhwX2Nvbm5lY3RfaWJpdHMoZXhwKTsKIAlyYyA9IGxkbG1fbG9ja19tYXRjaChjbGFzc19leHAyb2JkKGV4cCktPm9iZF9uYW1lc3BhY2UsIGZsYWdzLAogCQkJICAgICAmcmVzX2lkLCB0eXBlLCBwb2xpY3ksIG1vZGUsIGxvY2toLCAwKTsKIAlyZXR1cm4gcmM7CkBAIC0xOTQsNyArMTk2LDcgQEAKIAlmaWRfYnVpbGRfcmVnX3Jlc19uYW1lKGZpZCwgJnJlc19pZCk7CiAKIAlyZXMgPSBsZGxtX3Jlc291cmNlX2dldChucywgTlVMTCwgJnJlc19pZCwgMCwgMCk7Ci0JaWYocmVzID09IE5VTEwpCisJaWYgKHJlcyA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAogCWxvY2tfcmVzKHJlcyk7CkBAIC0zMzQsOSArMzM2LDkgQEAKIAkJCSAgICAgbWF4KGxtbXNpemUsIG9iZGRldi0+dS5jbGkuY2xfZGVmYXVsdF9tZHNfZWFzaXplKSk7CiAKIAlyYyA9IGxkbG1fcHJlcF9lbnF1ZXVlX3JlcShleHAsIHJlcSwgJmNhbmNlbHMsIGNvdW50KTsKLQlpZiAocmMpIHsKKwlpZiAocmMgPCAwKSB7CiAJCXB0bHJwY19yZXF1ZXN0X2ZyZWUocmVxKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKHJjKTsKIAl9CiAKIAlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7CkBAIC0zNzgsMTMgKzM4MCw2IEBACiAKIAltZGNfc2V0X2NhcGFfc2l6ZShyZXEsICZSTUZfQ0FQQTEsIG9wX2RhdGEtPm9wX2NhcGExKTsKIAotCWlmIChpdC0+aXRfb3AgPT0gSVRfU0VUWEFUVFIpCi0JCS8qIElmIHdlIHdhbnQgdG8gdXBncmFkZSB0byBMQ0tfUFcsIGxldCdzIGNhbmNlbCBMQ0tfUFIKLQkJICogbG9ja3Mgbm93LiBUaGlzIGF2b2lkcyB1bm5lY2Vzc2FyeSBBU1RzLiAqLwotCQljb3VudCA9IG1kY19yZXNvdXJjZV9nZXRfdW51c2VkKGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDEsCi0JCQkJCQkmY2FuY2VscywgTENLX1BXLAotCQkJCQkJTURTX0lOT0RFTE9DS19YQVRUUik7Ci0KIAlyYyA9IGxkbG1fcHJlcF9lbnF1ZXVlX3JlcShleHAsIHJlcSwgJmNhbmNlbHMsIGNvdW50KTsKIAlpZiAocmMpIHsKIAkJcHRscnBjX3JlcXVlc3RfZnJlZShyZXEpOwpAQCAtNjQ2LDcgKzY0MSw3IEBACiAJCQkgKiBoYXBwZW5zIGltbWVkaWF0ZWx5IGFmdGVyIHN3YWJiaW5nIGJlbG93LCBuZXcgcmVwbHkKIAkJCSAqIGlzIHN3YWJiZWQgYnkgdGhhdCBoYW5kbGVyIGNvcnJlY3RseS4KIAkJCSAqLwotCQkJbWRjX3NldF9vcGVuX3JlcGxheV9kYXRhKE5VTEwsIE5VTEwsIHJlcSk7CisJCQltZGNfc2V0X29wZW5fcmVwbGF5X2RhdGEoTlVMTCwgTlVMTCwgaXQpOwogCQl9CiAKIAkJaWYgKChib2R5LT52YWxpZCAmIChPQkRfTURfRkxESVJFQSB8IE9CRF9NRF9GTEVBU0laRSkpICE9IDApIHsKQEAgLTc1OCw2ICs3NTMsNyBAQAogCQkvKiBpbnN0YWxsIGx2Yl9kYXRhICovCiAJCWxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOwogCQlpZiAobG9jay0+bF9sdmJfZGF0YSA9PSBOVUxMKSB7CisJCQlsb2NrLT5sX2x2Yl90eXBlID0gTFZCX1RfTEFZT1VUOwogCQkJbG9jay0+bF9sdmJfZGF0YSA9IGxtbTsKIAkJCWxvY2stPmxfbHZiX2xlbiA9IGx2Yl9sZW47CiAJCQlsbW0gPSBOVUxMOwpAQCAtODQyLDcgKzgzOCw3IEBACiAJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJCXJlcSA9IG1kY19pbnRlbnRfbGF5b3V0X3BhY2soZXhwLCBpdCwgb3BfZGF0YSk7CiAJCWx2Yl90eXBlID0gTFZCX1RfTEFZT1VUOwotCX0gZWxzZSBpZiAoaXQtPml0X29wICYgKElUX0dFVFhBVFRSIHwgSVRfU0VUWEFUVFIpKSB7CisJfSBlbHNlIGlmIChpdC0+aXRfb3AgJiBJVF9HRVRYQVRUUikgewogCQlyZXEgPSBtZGNfaW50ZW50X2dldHhhdHRyX3BhY2soZXhwLCBpdCwgb3BfZGF0YSk7CiAJfSBlbHNlIHsKIAkJTEJVRygpOwpAQCAtODgwLDcgKzg3Niw3IEBACiAJcmMgPSBsZGxtX2NsaV9lbnF1ZXVlKGV4cCwgJnJlcSwgZWluZm8sICZyZXNfaWQsIHBvbGljeSwgJmZsYWdzLCBOVUxMLAogCQkJICAgICAgMCwgbHZiX3R5cGUsIGxvY2toLCAwKTsKIAlpZiAoIWl0KSB7Ci0JCS8qIEZvciBmbG9jayByZXF1ZXN0cyB3ZSBpbW1lZGlhdGVsbHkgcmV0dXJuIHdpdGhvdXQgZnVydGhlcgorCQkvKiBGb3IgZmxvY2sgcmVxdWVzdHMgd2UgaW1tZWRpYXRlbHkgcmV0dXJuIHdpdGhvdXQgZnVydGhlcgogCQkgICBkZWxheSBhbmQgbGV0IGNhbGxlciBkZWFsIHdpdGggdGhlIHJlc3QsIHNpbmNlIHJlc3Qgb2YKIAkJICAgdGhpcyBmdW5jdGlvbiBtZXRhZGF0YSBwcm9jZXNzaW5nIG1ha2VzIG5vIHNlbnNlIGZvciBmbG9jawogCQkgICByZXF1ZXN0cyBhbnl3YXkuIEJ1dCBpbiBjYXNlIG9mIHByb2JsZW0gZHVyaW5nIGNvbW1zIHdpdGgKQEAgLTk3Myw3ICs5NjksNiBAQAogCWlmIChmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMikgJiYKIAkgICAgaXQtPml0X2NyZWF0ZV9tb2RlICYgTV9DSEVDS19TVEFMRSAmJgogCSAgICBpdC0+aXRfb3AgIT0gSVRfR0VUQVRUUikgewotCQlpdF9zZXRfZGlzcG9zaXRpb24oaXQsIERJU1BfRU5RX0NPTVBMRVRFKTsKIAogCQkvKiBBbHNvOiBkaWQgd2UgZmluZCB0aGUgc2FtZSBpbm9kZT8gKi8KIAkJLyogc2V2ZXIgY2FuIHJldHVybiBvbmUgb2YgdHdvIGZpZHM6CkBAIC0xMDY4LDcgKzEwNjMsMjMgQEAKIAkJZmlkX2J1aWxkX3JlZ19yZXNfbmFtZShmaWQsICZyZXNfaWQpOwogCQlzd2l0Y2ggKGl0LT5pdF9vcCkgewogCQljYXNlIElUX0dFVEFUVFI6Ci0JCQlwb2xpY3kubF9pbm9kZWJpdHMuYml0cyA9IE1EU19JTk9ERUxPQ0tfVVBEQVRFOworCQkJLyogRmlsZSBhdHRyaWJ1dGVzIGFyZSBoZWxkIHVuZGVyIG11bHRpcGxlIGJpdHM6CisJCQkgKiBubGluayBpcyB1bmRlciBsb29rdXAgbG9jaywgc2l6ZSBhbmQgdGltZXMgYXJlCisJCQkgKiB1bmRlciBVUERBVEUgbG9jayBhbmQgcmVjZW50bHkgd2UndmUgYWxzbyBnb3QKKwkJCSAqIGEgc2VwYXJhdGUgcGVybWlzc2lvbnMgbG9jayBmb3Igb3duZXIvZ3JvdXAvYWNsIHRoYXQKKwkJCSAqIHdlcmUgcHJvdGVjdGVkIGJ5IGxvb2t1cCBsb2NrIGJlZm9yZS4KKwkJCSAqIEdldGF0dHIgbXVzdCBwcm92aWRlIGFsbCBvZiB0aGF0IGluZm9ybWF0aW9uLAorCQkJICogc28gd2UgbmVlZCB0byBlbnN1cmUgd2UgaGF2ZSBhbGwgb2YgdGhvc2UgbG9ja3MuCisJCQkgKiBVbmZvcnR1bmF0ZWx5LCBpZiB0aGUgYml0cyBhcmUgc3BsaXQgYWNyb3NzIG11bHRpcGxlCisJCQkgKiBsb2NrcywgdGhlcmUncyBubyBlYXN5IHdheSB0byBtYXRjaCBhbGwgb2YgdGhlbSBoZXJlLAorCQkJICogc28gYW4gZXh0cmEgUlBDIHdvdWxkIGJlIHBlcmZvcm1lZCB0byBmZXRjaCBhbGwKKwkJCSAqIG9mIHRob3NlIGJpdHMgYXQgb25jZSBmb3Igbm93LiAqLworCQkJLyogRm9yIG5ldyBNRFRzKD4gMi40KSwgVVBEQVRFfFBFUk0gc2hvdWxkIGJlIGVub3VnaCwKKwkJCSAqIGJ1dCBmb3Igb2xkIE1EVHMgKDwgMi40KSwgcGVybWlzc2lvbiBpcyBjb3ZlcmVkCisJCQkgKiBieSBMT09LVVAgbG9jaywgc28gaXQgbmVlZHMgdG8gbWF0Y2ggYWxsIGJpdHMgaGVyZS4qLworCQkJcG9saWN5LmxfaW5vZGViaXRzLmJpdHMgPSBNRFNfSU5PREVMT0NLX1VQREFURSB8CisJCQkJCQkgIE1EU19JTk9ERUxPQ0tfTE9PS1VQIHwKKwkJCQkJCSAgTURTX0lOT0RFTE9DS19QRVJNOwogCQkJYnJlYWs7CiAJCWNhc2UgSVRfTEFZT1VUOgogCQkJcG9saWN5LmxfaW5vZGViaXRzLmJpdHMgPSBNRFNfSU5PREVMT0NLX0xBWU9VVDsKQEAgLTEwNzcsMTAgKzEwODgsMTEgQEAKIAkJCXBvbGljeS5sX2lub2RlYml0cy5iaXRzID0gTURTX0lOT0RFTE9DS19MT09LVVA7CiAJCQlicmVhazsKIAkJfQotCQltb2RlID0gbGRsbV9sb2NrX21hdGNoKGV4cC0+ZXhwX29iZC0+b2JkX25hbWVzcGFjZSwKLQkJCQkgICAgICAgTERMTV9GTF9CTE9DS19HUkFOVEVELCAmcmVzX2lkLAorCisJCW1vZGUgPSBtZGNfbG9ja19tYXRjaChleHAsIExETE1fRkxfQkxPQ0tfR1JBTlRFRCwgZmlkLAogCQkJCSAgICAgICBMRExNX0lCSVRTLCAmcG9saWN5LAotCQkJCSAgICAgICBMQ0tfQ1J8TENLX0NXfExDS19QUnxMQ0tfUFcsICZsb2NraCwgMCk7CisJCQkJICAgICAgTENLX0NSIHwgTENLX0NXIHwgTENLX1BSIHwgTENLX1BXLAorCQkJCSAgICAgICZsb2NraCk7CiAJfQogCiAJaWYgKG1vZGUpIHsKQEAgLTExMjcsNiArMTEzOSwxMiBAQAogCQkgICAgbGRsbV9ibG9ja2luZ19jYWxsYmFjayBjYl9ibG9ja2luZywKIAkJICAgIF9fdTY0IGV4dHJhX2xvY2tfZmxhZ3MpCiB7CisJc3RydWN0IGxkbG1fZW5xdWV1ZV9pbmZvIGVpbmZvID0geworCQkuZWlfdHlwZQk9IExETE1fSUJJVFMsCisJCS5laV9tb2RlCT0gaXRfdG9fbG9ja19tb2RlKGl0KSwKKwkJLmVpX2NiX2JsCT0gY2JfYmxvY2tpbmcsCisJCS5laV9jYl9jcAk9IGxkbG1fY29tcGxldGlvbl9hc3QsCisJfTsKIAlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSBsb2NraDsKIAlpbnQgcmMgPSAwOwogCkBAIC0xMTUyLDQyICsxMTcwLDE5IEBACiAJCQlyZXR1cm4gcmM7CiAJfQogCi0JLyogbG9va3VwX2l0IG1heSBiZSBjYWxsZWQgb25seSBhZnRlciByZXZhbGlkYXRlX2l0IGhhcyBydW4sIGJlY2F1c2UKLQkgKiByZXZhbGlkYXRlX2l0IGNhbm5vdCByZXR1cm4gZXJyb3JzLCBvbmx5IHplcm8uICBSZXR1cm5pbmcgemVybyBjYXVzZXMKLQkgKiB0aGlzIGNhbGwgdG8gbG9va3VwLCB3aGljaCAqY2FuKiByZXR1cm4gYW4gZXJyb3IuCi0JICoKLQkgKiBXZSBvbmx5IHdhbnQgdG8gZXhlY3V0ZSB0aGUgcmVxdWVzdCBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVudCBvbmUKLQkgKiB0aW1lLCBob3dldmVyLCBzbyBkb24ndCBzZW5kIHRoZSByZXF1ZXN0IGFnYWluLiAgSW5zdGVhZCwgc2tpcCBwYXN0Ci0JICogdGhpcyBhbmQgdXNlIHRoZSByZXF1ZXN0IGZyb20gcmV2YWxpZGF0ZS4gIEluIHRoaXMgY2FzZSwgcmV2YWxpZGF0ZQotCSAqIG5ldmVyIGRyb3BwZWQgaXRzIHJlZmVyZW5jZSwgc28gdGhlIHJlZmNvdW50cyBhcmUgYWxsIE9LICovCi0JaWYgKCFpdF9kaXNwb3NpdGlvbihpdCwgRElTUF9FTlFfQ09NUExFVEUpKSB7Ci0JCXN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyBlaW5mbyA9IHsKLQkJCS5laV90eXBlCT0gTERMTV9JQklUUywKLQkJCS5laV9tb2RlCT0gaXRfdG9fbG9ja19tb2RlKGl0KSwKLQkJCS5laV9jYl9ibAk9IGNiX2Jsb2NraW5nLAotCQkJLmVpX2NiX2NwCT0gbGRsbV9jb21wbGV0aW9uX2FzdCwKLQkJfTsKLQotCQkvKiBGb3IgY2FzZSBpZiB1cHBlciBsYXllciBkaWQgbm90IGFsbG9jIGZpZCwgZG8gaXQgbm93LiAqLwotCQlpZiAoIWZpZF9pc19zYW5lKCZvcF9kYXRhLT5vcF9maWQyKSAmJiBpdC0+aXRfb3AgJiBJVF9DUkVBVCkgewotCQkJcmMgPSBtZGNfZmlkX2FsbG9jKGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDIsIG9wX2RhdGEpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCUNFUlJPUigiQ2FuJ3QgYWxsb2MgbmV3IGZpZCwgcmMgJWRcbiIsIHJjKTsKLQkJCQlyZXR1cm4gcmM7Ci0JCQl9Ci0JCX0KLQkJcmMgPSBtZGNfZW5xdWV1ZShleHAsICZlaW5mbywgaXQsIG9wX2RhdGEsICZsb2NraCwKLQkJCQkgbG1tLCBsbW1zaXplLCBOVUxMLCBleHRyYV9sb2NrX2ZsYWdzKTsKLQkJaWYgKHJjIDwgMCkKKwkvKiBGb3IgY2FzZSBpZiB1cHBlciBsYXllciBkaWQgbm90IGFsbG9jIGZpZCwgZG8gaXQgbm93LiAqLworCWlmICghZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDIpICYmIGl0LT5pdF9vcCAmIElUX0NSRUFUKSB7CisJCXJjID0gbWRjX2ZpZF9hbGxvYyhleHAsICZvcF9kYXRhLT5vcF9maWQyLCBvcF9kYXRhKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJQ0VSUk9SKCJDYW4ndCBhbGxvYyBuZXcgZmlkLCByYyAlZFxuIiwgcmMpOwogCQkJcmV0dXJuIHJjOwotCX0gZWxzZSBpZiAoIWZpZF9pc19zYW5lKCZvcF9kYXRhLT5vcF9maWQyKSB8fAotCQkgICAhKGl0LT5pdF9jcmVhdGVfbW9kZSAmIE1fQ0hFQ0tfU1RBTEUpKSB7Ci0JCS8qIERJU1BfRU5RX0NPTVBMRVRFIHNldCBtZWFucyB0aGVyZSBpcyBleHRyYSByZWZlcmVuY2Ugb24KLQkJICogcmVxdWVzdCByZWZlcmVuY2VkIGZyb20gdGhpcyBpbnRlbnQsIHNhdmVkIGZvciBzdWJzZXF1ZW50Ci0JCSAqIGxvb2t1cC4gIFRoaXMgcGF0aCBpcyBleGVjdXRlZCB3aGVuIHdlIHByb2NlZWQgdG8gdGhpcwotCQkgKiBsb29rdXAsIHNvIHdlIGNsZWFyIERJU1BfRU5RX0NPTVBMRVRFICovCi0JCWl0X2NsZWFyX2Rpc3Bvc2l0aW9uKGl0LCBESVNQX0VOUV9DT01QTEVURSk7CisJCX0KIAl9CisJcmMgPSBtZGNfZW5xdWV1ZShleHAsICZlaW5mbywgaXQsIG9wX2RhdGEsICZsb2NraCwgbG1tLCBsbW1zaXplLCBOVUxMLAorCQkJIGV4dHJhX2xvY2tfZmxhZ3MpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKwogCSpyZXFwID0gaXQtPmQubHVzdHJlLml0X2RhdGE7CiAJcmMgPSBtZGNfZmluaXNoX2ludGVudF9sb2NrKGV4cCwgKnJlcXAsIG9wX2RhdGEsIGl0LCAmbG9ja2gpOwogCXJldHVybiByYzsKQEAgLTEyNjksOCArMTI2NCw4IEBACiAKIAlmaWRfYnVpbGRfcmVnX3Jlc19uYW1lKCZvcF9kYXRhLT5vcF9maWQxLCAmcmVzX2lkKTsKIAlyZXEgPSBtZGNfaW50ZW50X2dldGF0dHJfcGFjayhleHAsIGl0LCBvcF9kYXRhKTsKLQlpZiAoIXJlcSkKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKElTX0VSUihyZXEpKQorCQlyZXR1cm4gUFRSX0VSUihyZXEpOwogCiAJcmMgPSBtZGNfZW50ZXJfcmVxdWVzdCgmb2JkZGV2LT51LmNsaSk7CiAJaWYgKHJjICE9IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVpbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVpbnQuYwppbmRleCA5ZjNhMzQ1Li5kNzlhYTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX3JlaW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZWludC5jCkBAIC02Niw3ICs2Niw3IEBACiAvKiBGaW5kIGFuZCBjYW5jZWwgbG9jYWxseSBsb2NrcyBtYXRjaGVkIGJ5IGlub2RlIEBiaXRzICYgQG1vZGUgaW4gdGhlIHJlc291cmNlCiAgKiBmb3VuZCBieSBAZmlkLiBGb3VuZCBsb2NrcyBhcmUgYWRkZWQgaW50byBAY2FuY2VsIGxpc3QuIFJldHVybnMgdGhlIGFtb3VudCBvZgogICogbG9ja3MgYWRkZWQgdG8gQGNhbmNlbHMgbGlzdC4gKi8KLWludCBtZGNfcmVzb3VyY2VfZ2V0X3VudXNlZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbHVfZmlkICpmaWQsCitpbnQgbWRjX3Jlc291cmNlX2dldF91bnVzZWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLAogCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKmNhbmNlbHMsIGxkbG1fbW9kZV90IG1vZGUsCiAJCQkgICAgX191NjQgYml0cykKIHsKQEAgLTE2NSw2ICsxNjUsNyBAQAogCQkJcmVxLT5ycV9jYl9kYXRhID0gKm1vZDsKIAkJCSgqbW9kKS0+bW9kX29wZW5fcmVxID0gcmVxOwogCQkJcmVxLT5ycV9jb21taXRfY2IgPSBtZGNfY29tbWl0X29wZW47CisJCQkoKm1vZCktPm1vZF9pc19jcmVhdGUgPSB0cnVlOwogCQkJLyoqCiAJCQkgKiBUYWtlIGFuIGV4dHJhIHJlZmVyZW5jZSBvbiBcdmFyIG1vZCwgaXQgcHJvdGVjdHMgXHZhcgogCQkJICogbW9kIGZyb20gYmVpbmcgZnJlZWQgb24gZXZpY3Rpb24gKGNvbW1pdCBjYWxsYmFjayBpcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZXF1ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX3JlcXVlc3QuYwppbmRleCA4MzAxMzkyLi5iZGU5ZjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX3JlcXVlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX3JlcXVlc3QuYwpAQCAtMzU1LDEwICszNTUsMzIgQEAKIAkJCQkgICAgIGlucHV0X3NpemUpOwogCX0KIAotCXJjID0gcHRscnBjX3JlcXVlc3RfcGFjayhyZXEsIExVU1RSRV9NRFNfVkVSU0lPTiwgb3Bjb2RlKTsKLQlpZiAocmMpIHsKLQkJcHRscnBjX3JlcXVlc3RfZnJlZShyZXEpOwotCQlyZXR1cm4gcmM7CisJLyogRmx1c2ggbG9jYWwgWEFUVFIgbG9ja3MgdG8gZ2V0IHJpZCBvZiBhIHBvc3NpYmxlIGNhbmNlbCBSUEMgKi8KKwlpZiAob3Bjb2RlID09IE1EU19SRUlOVCAmJiBmaWRfaXNfc2FuZShmaWQpICYmCisJICAgIGV4cC0+ZXhwX2Nvbm5lY3RfZGF0YS5vY2RfaWJpdHNfa25vd24gJiBNRFNfSU5PREVMT0NLX1hBVFRSKSB7CisJCUxJU1RfSEVBRChjYW5jZWxzKTsKKwkJaW50IGNvdW50OworCisJCS8qIFdpdGhvdXQgdGhhdCBwYWNraW5nIHdvdWxkIGZhaWwgKi8KKwkJaWYgKGlucHV0X3NpemUgPT0gMCkKKwkJCXJlcV9jYXBzdWxlX3NldF9zaXplKCZyZXEtPnJxX3BpbGwsICZSTUZfRUFEQVRBLAorCQkJCQkgICAgIFJDTF9DTElFTlQsIDApOworCisJCWNvdW50ID0gbWRjX3Jlc291cmNlX2dldF91bnVzZWQoZXhwLCBmaWQsCisJCQkJCQkmY2FuY2VscywgTENLX0VYLAorCQkJCQkJTURTX0lOT0RFTE9DS19YQVRUUik7CisKKwkJcmMgPSBtZGNfcHJlcF9lbGNfcmVxKGV4cCwgcmVxLCBNRFNfUkVJTlQsICZjYW5jZWxzLCBjb3VudCk7CisJCWlmIChyYykgeworCQkJcHRscnBjX3JlcXVlc3RfZnJlZShyZXEpOworCQkJcmV0dXJuIHJjOworCQl9CisJfSBlbHNlIHsKKwkJcmMgPSBwdGxycGNfcmVxdWVzdF9wYWNrKHJlcSwgTFVTVFJFX01EU19WRVJTSU9OLCBvcGNvZGUpOworCQlpZiAocmMpIHsKKwkJCXB0bHJwY19yZXF1ZXN0X2ZyZWUocmVxKTsKKwkJCXJldHVybiByYzsKKwkJfQogCX0KIAogCWlmIChvcGNvZGUgPT0gTURTX1JFSU5UKSB7CkBAIC03MDAsMTEgKzcyMiwxMiBAQAogCiBpbnQgbWRjX3NldF9vcGVuX3JlcGxheV9kYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCQkgICAgIHN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSAqb2NoLAotCQkJICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKm9wZW5fcmVxKQorCQkJICAgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQpCiB7CiAJc3RydWN0IG1kX29wZW5fZGF0YSAgICptb2Q7CiAJc3RydWN0IG1kdF9yZWNfY3JlYXRlICpyZWM7CiAJc3RydWN0IG1kdF9ib2R5ICAgICAgICpib2R5OworCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqb3Blbl9yZXEgPSBpdC0+ZC5sdXN0cmUuaXRfZGF0YTsKIAlzdHJ1Y3Qgb2JkX2ltcG9ydCAgICAgKmltcCA9IG9wZW5fcmVxLT5ycV9pbXBvcnQ7CiAKIAlpZiAoIW9wZW5fcmVxLT5ycV9yZXBsYXkpCkBAIC03MzgsNiArNzYxLDggQEAKIAkJc3Bpbl9sb2NrKCZvcGVuX3JlcS0+cnFfbG9jayk7CiAJCW9jaC0+b2NoX21vZCA9IG1vZDsKIAkJbW9kLT5tb2Rfb2NoID0gb2NoOworCQltb2QtPm1vZF9pc19jcmVhdGUgPSBpdF9kaXNwb3NpdGlvbihpdCwgRElTUF9PUEVOX0NSRUFURSkgfHwKKwkJCQkgICAgIGl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX09QRU5fU1RSSVBFKTsKIAkJbW9kLT5tb2Rfb3Blbl9yZXEgPSBvcGVuX3JlcTsKIAkJb3Blbl9yZXEtPnJxX2NiX2RhdGEgPSBtb2Q7CiAJCW9wZW5fcmVxLT5ycV9jb21taXRfY2IgPSBtZGNfY29tbWl0X29wZW47CkBAIC03NTgsNiArNzgzLDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIG1kY19mcmVlX29wZW4oc3RydWN0IG1kX29wZW5fZGF0YSAqbW9kKQoreworCWludCBjb21taXR0ZWQgPSAwOworCisJaWYgKG1vZC0+bW9kX2lzX2NyZWF0ZSA9PSAwICYmCisJICAgIGltcF9jb25uZWN0X2Rpc3Bfc3RyaXBlKG1vZC0+bW9kX29wZW5fcmVxLT5ycV9pbXBvcnQpKQorCQljb21taXR0ZWQgPSAxOworCisJTEFTU0VSVChtb2QtPm1vZF9vcGVuX3JlcS0+cnFfcmVwbGF5ID09IDApOworCisJREVCVUdfUkVRKERfUlBDVFJBQ0UsIG1vZC0+bW9kX29wZW5fcmVxLCAiZnJlZSBvcGVuIHJlcXVlc3RcbiIpOworCisJcHRscnBjX3JlcXVlc3RfY29tbWl0dGVkKG1vZC0+bW9kX29wZW5fcmVxLCBjb21taXR0ZWQpOworCWlmIChtb2QtPm1vZF9jbG9zZV9yZXEpCisJCXB0bHJwY19yZXF1ZXN0X2NvbW1pdHRlZChtb2QtPm1vZF9jbG9zZV9yZXEsIGNvbW1pdHRlZCk7Cit9CisKIGludCBtZGNfY2xlYXJfb3Blbl9yZXBsYXlfZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAogCQkJICAgICAgIHN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSAqb2NoKQogewpAQCAtNzcxLDYgKzgxMyw4IEBACiAJCXJldHVybiAwOwogCiAJTEFTU0VSVChtb2QgIT0gTFBfUE9JU09OKTsKKwlMQVNTRVJUKG1vZC0+bW9kX29wZW5fcmVxICE9IE5VTEwpOworCW1kY19mcmVlX29wZW4obW9kKTsKIAogCW1vZC0+bW9kX29jaCA9IE5VTEw7CiAJb2NoLT5vY2hfbW9kID0gTlVMTDsKQEAgLTk2OSw2ICsxMDEzLDkgQEAKIAlpZiAobW9kKSB7CiAJCWlmIChyYyAhPSAwKQogCQkJbW9kLT5tb2RfY2xvc2VfcmVxID0gTlVMTDsKKwkJTEFTU0VSVChtb2QtPm1vZF9vcGVuX3JlcSAhPSBOVUxMKTsKKwkJbWRjX2ZyZWVfb3Blbihtb2QpOworCiAJCS8qIFNpbmNlIG5vdywgbW9kIGlzIGFjY2Vzc2VkIHRocm91Z2ggc2V0YXR0ciByZXEgb25seSwKIAkJICogdGh1cyBEVyByZXEgZG9lcyBub3Qga2VlcCBhIHJlZmVyZW5jZSBvbiBtb2QgYW55bW9yZS4gKi8KIAkJb2JkX21vZF9wdXQobW9kKTsKQEAgLTE1MjcsOCArMTU3NCw4IEBACiAJcmMgPSBsbG9nX2NhdF9wcm9jZXNzKE5VTEwsIGxsaCwgY2hhbmdlbG9nX2trdWNfY2IsIGNzLCAwLCAwKTsKIAogCS8qIFNlbmQgRU9GIG5vIG1hdHRlciB3aGF0IG91ciByZXN1bHQgKi8KLQlpZiAoKGt1Y2ggPSBjaGFuZ2Vsb2dfa3VjX2hkcihjcy0+Y3NfYnVmLCBzaXplb2YoKmt1Y2gpLAotCQkJCSAgICAgIGNzLT5jc19mbGFncykpKSB7CisJa3VjaCA9IGNoYW5nZWxvZ19rdWNfaGRyKGNzLT5jc19idWYsIHNpemVvZigqa3VjaCksIGNzLT5jc19mbGFncyk7CisJaWYgKGt1Y2gpIHsKIAkJa3VjaC0+a3VjX21zZ3R5cGUgPSBDTF9FT0Y7CiAJCWxpYmNmc19ra3VjX21zZ19wdXQoY3MtPmNzX2ZwLCBrdWNoKTsKIAl9CkBAIC0xNjUwLDExICsxNjk3LDE2IEBACiAJaWYgKHJjKQogCQlDRVJST1IoInB0bHJwY19xdWV1ZV93YWl0IGZhaWxlZCwgcmM6ICVkXG4iLCByYyk7CiAKLQlpZiAocmVxLT5ycV9yZXBtc2cgJiYKLQkgICAgKG9xYyA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9PQkRfUVVPVEFDVEwpKSkgewotCQkqb3FjdGwgPSAqb3FjOworCWlmIChyZXEtPnJxX3JlcG1zZykgeworCQlvcWMgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfT0JEX1FVT1RBQ1RMKTsKKwkJaWYgKG9xYykgeworCQkJKm9xY3RsID0gKm9xYzsKKwkJfSBlbHNlIGlmICghcmMpIHsKKwkJCUNFUlJPUiAoIkNhbid0IHVucGFjayBvYmRfcXVvdGFjdGxcbiIpOworCQkJcmMgPSAtRVBST1RPOworCQl9CiAJfSBlbHNlIGlmICghcmMpIHsKLQkJQ0VSUk9SICgiQ2FuJ3QgdW5wYWNrIG9iZF9xdW90YWN0bFxuIik7CisJCUNFUlJPUigiQ2FuJ3QgdW5wYWNrIG9iZF9xdW90YWN0bFxuIik7CiAJCXJjID0gLUVQUk9UTzsKIAl9CiAJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWdjL21nY19yZXF1ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZ2MvbWdjX3JlcXVlc3QuYwppbmRleCAzYmRiYjk0Li5kZTlmYjE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZ2MvbWdjX3JlcXVlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZ2MvbWdjX3JlcXVlc3QuYwpAQCAtNTYsNyArNTYsNyBAQAogewogCV9fdTY0IHJlc25hbWUgPSAwOwogCi0JaWYgKGxlbiA+IDgpIHsKKwlpZiAobGVuID4gc2l6ZW9mKHJlc25hbWUpKSB7CiAJCUNFUlJPUigibmFtZSB0b28gbG9uZzogJXNcbiIsIG5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC03Niw2ICs3Niw3IEBACiAJCXJlc25hbWUgPSAwOwogCQlicmVhazsKIAljYXNlIENPTkZJR19UX1JFQ09WRVI6CisJY2FzZSBDT05GSUdfVF9QQVJBTVM6CiAJCXJlc25hbWUgPSB0eXBlOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMTAxLDEwICsxMDIsMTMgQEAKIAlpbnQgbGVuOwogCiAJLyogbG9nbmFtZSBjb25zaXN0cyBvZiAiZnNuYW1lLW5vZGV0eXBlIi4KLQkgKiBlLmcuICJsdXN0cmUtTURUMDAwMSIsICJTVU4tMDAwLWNsaWVudCIgKi8KKwkgKiBlLmcuICJsdXN0cmUtTURUMDAwMSIsICJTVU4tMDAwLWNsaWVudCIKKwkgKiB0aGVyZSBpcyBhbiBleGNlcHRpb246IGxsb2cgInBhcmFtcyIgKi8KIAluYW1lX2VuZCA9IHN0cnJjaHIobG9nbmFtZSwgJy0nKTsKLQlMQVNTRVJUKG5hbWVfZW5kKTsKLQlsZW4gPSBuYW1lX2VuZCAtIGxvZ25hbWU7CisJaWYgKCFuYW1lX2VuZCkKKwkJbGVuID0gc3RybGVuKGxvZ25hbWUpOworCWVsc2UKKwkJbGVuID0gbmFtZV9lbmQgLSBsb2duYW1lOwogCXJldHVybiBtZ2NfbmFtZTJyZXNpZChsb2duYW1lLCBsZW4sIHJlc19pZCwgdHlwZSk7CiB9CiAKQEAgLTE0MCw2ICsxNDQsOCBAQAogCQkJY29uZmlnX2xvZ19wdXQoY2xkLT5jbGRfcmVjb3Zlcik7CiAJCWlmIChjbGQtPmNsZF9zcHRscnBjKQogCQkJY29uZmlnX2xvZ19wdXQoY2xkLT5jbGRfc3B0bHJwYyk7CisJCWlmIChjbGQtPmNsZF9wYXJhbXMpCisJCQljb25maWdfbG9nX3B1dChjbGQtPmNsZF9wYXJhbXMpOwogCQlpZiAoY2xkX2lzX3NwdGxycGMoY2xkKSkKIAkJCXNwdGxycGNfY29uZl9sb2dfc3RvcChjbGQtPmNsZF9sb2duYW1lKTsKIApAQCAtMjcxLDYgKzI3NywxOSBAQAogCXJldHVybiBjbGQ7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgY29uZmlnX2xsb2dfZGF0YSAqY29uZmlnX3BhcmFtc19sb2dfYWRkKHN0cnVjdCBvYmRfZGV2aWNlICpvYmQsCisJc3RydWN0IGNvbmZpZ19sbG9nX2luc3RhbmNlICpjZmcsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGNvbmZpZ19sbG9nX2luc3RhbmNlCWxjZmcgPSAqY2ZnOworCXN0cnVjdCBjb25maWdfbGxvZ19kYXRhCQkqY2xkOworCisJbGNmZy5jZmdfaW5zdGFuY2UgPSBzYjsKKworCWNsZCA9IGRvX2NvbmZpZ19sb2dfYWRkKG9iZCwgUEFSQU1TX0ZJTEVOQU1FLCBDT05GSUdfVF9QQVJBTVMsCisJCQkJJmxjZmcsIHNiKTsKKworCXJldHVybiBjbGQ7Cit9CiAKIC8qKiBBZGQgdGhpcyBsb2cgdG8gdGhlIGxpc3Qgb2YgYWN0aXZlIGxvZ3Mgd2F0Y2hlZCBieSBhbiBNR0MuCiAgKiBBY3RpdmUgbWVhbnMgd2UncmUgd2F0Y2hpbmcgZm9yIHVwZGF0ZXMuCkBAIC0yODQsOCArMzAzLDEwIEBACiAJc3RydWN0IGx1c3RyZV9zYl9pbmZvICpsc2kgPSBzMmxzaShzYik7CiAJc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgKmNsZDsKIAlzdHJ1Y3QgY29uZmlnX2xsb2dfZGF0YSAqc3B0bHJwY19jbGQ7Ci0JY2hhcgkJICAgICBzZWNsb2duYW1lWzMyXTsKLQljaGFyCQkgICAgKnB0cjsKKwlzdHJ1Y3QgY29uZmlnX2xsb2dfZGF0YSAqcGFyYW1zX2NsZDsKKwljaGFyCQkJc2VjbG9nbmFtZVszMl07CisJY2hhcgkJCSpwdHI7CisJaW50CQkJcmM7CiAKIAlDREVCVUcoRF9NR0MsICJhZGRpbmcgY29uZmlnIGxvZyAlczolcFxuIiwgbG9nbmFtZSwgY2ZnLT5jZmdfaW5zdGFuY2UpOwogCkBAIC0zMDgsMzIgKzMyOSw0OSBAQAogCQkJCQkJQ09ORklHX1RfU1BUTFJQQywgTlVMTCwgTlVMTCk7CiAJCWlmIChJU19FUlIoc3B0bHJwY19jbGQpKSB7CiAJCQlDRVJST1IoImNhbid0IGNyZWF0ZSBzcHRscnBjIGxvZzogJXNcbiIsIHNlY2xvZ25hbWUpOwotCQkJcmV0dXJuIFBUUl9FUlIoc3B0bHJwY19jbGQpOworCQkJR09UTyhvdXRfZXJyLCByYyA9IFBUUl9FUlIoc3B0bHJwY19jbGQpKTsKIAkJfQogCX0KKwlwYXJhbXNfY2xkID0gY29uZmlnX3BhcmFtc19sb2dfYWRkKG9iZCwgY2ZnLCBzYik7CisJaWYgKElTX0VSUihwYXJhbXNfY2xkKSkgeworCQlyYyA9IFBUUl9FUlIocGFyYW1zX2NsZCk7CisJCUNFUlJPUigiJXM6IGNhbid0IGNyZWF0ZSBwYXJhbXMgbG9nOiByYyA9ICVkXG4iLAorCQkgICAgICAgb2JkLT5vYmRfbmFtZSwgcmMpOworCQlHT1RPKG91dF9lcnIxLCByYyk7CisJfQogCiAJY2xkID0gZG9fY29uZmlnX2xvZ19hZGQob2JkLCBsb2duYW1lLCBDT05GSUdfVF9DT05GSUcsIGNmZywgc2IpOwogCWlmIChJU19FUlIoY2xkKSkgewogCQlDRVJST1IoImNhbid0IGNyZWF0ZSBsb2c6ICVzXG4iLCBsb2duYW1lKTsKLQkJY29uZmlnX2xvZ19wdXQoc3B0bHJwY19jbGQpOwotCQlyZXR1cm4gUFRSX0VSUihjbGQpOworCQlHT1RPKG91dF9lcnIyLCByYyA9IFBUUl9FUlIoY2xkKSk7CiAJfQogCiAJY2xkLT5jbGRfc3B0bHJwYyA9IHNwdGxycGNfY2xkOworCWNsZC0+Y2xkX3BhcmFtcyA9IHBhcmFtc19jbGQ7CiAKIAlMQVNTRVJUKGxzaS0+bHNpX2xtZCk7CiAJaWYgKCEobHNpLT5sc2lfbG1kLT5sbWRfZmxhZ3MgJiBMTURfRkxHX05PSVIpKSB7CiAJCXN0cnVjdCBjb25maWdfbGxvZ19kYXRhICpyZWNvdmVyX2NsZDsKIAkJKnN0cnJjaHIoc2VjbG9nbmFtZSwgJy0nKSA9IDA7CiAJCXJlY292ZXJfY2xkID0gY29uZmlnX3JlY292ZXJfbG9nX2FkZChvYmQsIHNlY2xvZ25hbWUsIGNmZywgc2IpOwotCQlpZiAoSVNfRVJSKHJlY292ZXJfY2xkKSkgewotCQkJY29uZmlnX2xvZ19wdXQoY2xkKTsKLQkJCXJldHVybiBQVFJfRVJSKHJlY292ZXJfY2xkKTsKLQkJfQorCQlpZiAoSVNfRVJSKHJlY292ZXJfY2xkKSkKKwkJCUdPVE8ob3V0X2VycjMsIHJjID0gUFRSX0VSUihyZWNvdmVyX2NsZCkpOwogCQljbGQtPmNsZF9yZWNvdmVyID0gcmVjb3Zlcl9jbGQ7CiAJfQogCiAJcmV0dXJuIDA7CisKK291dF9lcnIzOgorCWNvbmZpZ19sb2dfcHV0KGNsZCk7CisKK291dF9lcnIyOgorCWNvbmZpZ19sb2dfcHV0KHBhcmFtc19jbGQpOworCitvdXRfZXJyMToKKwljb25maWdfbG9nX3B1dChzcHRscnBjX2NsZCk7CisKK291dF9lcnI6CisJcmV0dXJuIHJjOwogfQogCiBERUZJTkVfTVVURVgobGxvZ19wcm9jZXNzX2xvY2spOwpAQCAtMzQ0LDYgKzM4Miw3IEBACiB7CiAJc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgKmNsZDsKIAlzdHJ1Y3QgY29uZmlnX2xsb2dfZGF0YSAqY2xkX3NwdGxycGMgPSBOVUxMOworCXN0cnVjdCBjb25maWdfbGxvZ19kYXRhICpjbGRfcGFyYW1zID0gTlVMTDsKIAlzdHJ1Y3QgY29uZmlnX2xsb2dfZGF0YSAqY2xkX3JlY292ZXIgPSBOVUxMOwogCWludCByYyA9IDA7CiAKQEAgLTM4MiwxMSArNDIxLDIwIEBACiAJc3Bpbl9sb2NrKCZjb25maWdfbGlzdF9sb2NrKTsKIAljbGRfc3B0bHJwYyA9IGNsZC0+Y2xkX3NwdGxycGM7CiAJY2xkLT5jbGRfc3B0bHJwYyA9IE5VTEw7CisJY2xkX3BhcmFtcyA9IGNsZC0+Y2xkX3BhcmFtczsKKwljbGQtPmNsZF9wYXJhbXMgPSBOVUxMOwogCXNwaW5fdW5sb2NrKCZjb25maWdfbGlzdF9sb2NrKTsKIAogCWlmIChjbGRfc3B0bHJwYykKIAkJY29uZmlnX2xvZ19wdXQoY2xkX3NwdGxycGMpOwogCisJaWYgKGNsZF9wYXJhbXMpIHsKKwkJbXV0ZXhfbG9jaygmY2xkX3BhcmFtcy0+Y2xkX2xvY2spOworCQljbGRfcGFyYW1zLT5jbGRfc3RvcHBpbmcgPSAxOworCQltdXRleF91bmxvY2soJmNsZF9wYXJhbXMtPmNsZF9sb2NrKTsKKwkJY29uZmlnX2xvZ19wdXQoY2xkX3BhcmFtcyk7CisJfQorCiAJLyogZHJvcCB0aGUgcmVmIGZyb20gdGhlIGZpbmQgKi8KIAljb25maWdfbG9nX3B1dChjbGQpOwogCS8qIGRyb3AgdGhlIHN0YXJ0IHJlZiAqLwpAQCAtMTU4NCw3ICsxNjMyLDcgQEAKIAkvKgogCSAqIC0gY29weSBpdCB0byBiYWNrdXAgdXNpbmcgbGxvZ19iYWNrdXAoKQogCSAqIC0gY29weSByZW1vdGUgbGxvZyB0byBsb2duYW1lIHVzaW5nIGxsb2dfYmFja3VwKCkKLQkgKiAtIGlmIGZhaWxlZCB0aGVuIG1vdmUgYmFrdXAgdG8gbG9nbmFtZSBhZ2FpbgorCSAqIC0gaWYgZmFpbGVkIHRoZW4gbW92ZSBiYWNrdXAgdG8gbG9nbmFtZSBhZ2FpbgogCSAqLwogCiAJT0JEX0FMTE9DKHRlbXBfbG9nLCBzdHJsZW4obG9nbmFtZSkgKyAxKTsKQEAgLTE2NjQsNyArMTcxMiw3IEBACiAJCQkJTENPTlNPTEVfRVJST1JfTVNHKDB4MTNhLAogCQkJCQkJICAgIkZhaWxlZCB0byBnZXQgTUdTIGxvZyAlcyBhbmQgbm8gbG9jYWwgY29weS5cbiIsCiAJCQkJCQkgICBjbGQtPmNsZF9sb2duYW1lKTsKLQkJCQlHT1RPKG91dF9wb3AsIHJjID0gLUVOT1RDT05OKTsKKwkJCQlHT1RPKG91dF9wb3AsIHJjID0gLUVOT0VOVCk7CiAJCQl9CiAJCQlDREVCVUcoRF9NR0MsCiAJCQkgICAgICAgIkZhaWxlZCB0byBnZXQgTUdTIGxvZyAlcywgdXNpbmcgbG9jYWwgY29weSBmb3Igbm93LCB3aWxsIHRyeSB0byB1cGRhdGUgbGF0ZXIuXG4iLApAQCAtMTg2Myw2ICsxOTExLDIwIEBACiAJCQlpZiAocmMpCiAJCQkJQ0VSUk9SKCJDYW5ub3QgcHJvY2VzcyByZWNvdmVyIGxsb2cgJWRcbiIsIHJjKTsKIAkJfQorCisJCWlmIChyYyA9PSAwICYmIGNsZC0+Y2xkX3BhcmFtcyAhPSBOVUxMKSB7CisJCQlyYyA9IG1nY19wcm9jZXNzX2xvZyhvYmQsIGNsZC0+Y2xkX3BhcmFtcyk7CisJCQlpZiAocmMgPT0gLUVOT0VOVCkgeworCQkJCUNERUJVRyhEX01HQywKKwkJCQkgICAgICAgIlRoZXJlIGlzIG5vIHBhcmFtcyBjb25maWcgZmlsZSB5ZXRcbiIpOworCQkJCXJjID0gMDsKKwkJCX0KKwkJCS8qIHBhcmFtcyBsb2cgaXMgb3B0aW9uYWwgKi8KKwkJCWlmIChyYykKKwkJCQlDRVJST1IoCisJCQkJICAgICAgICIlczogY2FuJ3QgcHJvY2VzcyBwYXJhbXMgbGxvZzogcmMgPSAlZFxuIiwKKwkJCQkgICAgICAgb2JkLT5vYmRfbmFtZSwgcmMpOworCQl9CiAJCWNvbmZpZ19sb2dfcHV0KGNsZCk7CiAKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9pby5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfaW8uYwppbmRleCBlMDQ4NTAwLi4zYmViYzc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX2lvLmMKQEAgLTk0Miw3ICs5NDIsNyBAQAogCXN0cnVjdCBjbF9wYWdlICpwYWdlOwogCWludCByZXN1bHQgPSAwOwogCi0JQ0VSUk9SKCJDYW5jZWxpbmcgb25nb2luZyBwYWdlIHRyYXNtaXNzaW9uXG4iKTsKKwlDRVJST1IoIkNhbmNlbGluZyBvbmdvaW5nIHBhZ2UgdHJhbnNtaXNzaW9uXG4iKTsKIAljbF9wYWdlX2xpc3RfZm9yX2VhY2gocGFnZSwgcXVldWUpIHsKIAkJaW50IHJjOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9sb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9sb2NrLmMKaW5kZXggNzQ5ZWIwOC4uZDc5NWNlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfbG9jay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX2xvY2suYwpAQCAtOTMyLDcgKzkzMiw3IEBACiAJCSAqIExVLTMwNSAqLwogCQlibG9ja2VkID0gY2ZzX2Jsb2NrX3NpZ3NpbnYoTFVTVFJFX0ZBVEFMX1NJR1MpOwogCi0JCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQoJndhaXRlcik7CisJCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0ZXIsIGN1cnJlbnQpOwogCQlhZGRfd2FpdF9xdWV1ZSgmbG9jay0+Y2xsX3dxLCAmd2FpdGVyKTsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJY2xfbG9ja19tdXRleF9wdXQoZW52LCBsb2NrKTsKQEAgLTk0Myw3ICs5NDMsNyBAQAogCQkgKiBjYW4gYmUgcmVzdGFydGVkIGlmIHNpZ25hbHMgYXJlIHBlbmRpbmcgaGVyZSAqLwogCQlyZXN1bHQgPSAtRVJFU1RBUlRTWVM7CiAJCWlmIChsaWtlbHkoIU9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX0xPQ0tfU1RBVEVfV0FJVF9JTlRSKSkpIHsKLQkJCXdhaXRxX3dhaXQoJndhaXRlciwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlKCk7CiAJCQlpZiAoIWNmc19zaWduYWxfcGVuZGluZygpKQogCQkJCXJlc3VsdCA9IDA7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX29iamVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfb2JqZWN0LmMKaW5kZXggMWE5MjYwMy4uMGZjMjU2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfb2JqZWN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfb2JqZWN0LmMKQEAgLTUwOCw3ICs1MDgsNyBAQAogICogYWJvdXQgam91cm5hbF9pbmZvLiBDdXJyZW50bHkgZm9sbG93aW5nIGZpZWxkcyBpbiB0YXNrX3N0cnVjdCBhcmUgaWRlbnRpZmllZAogICogY2FuIGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZToKICAqICAtIGNsX2VudjogZm9yIGxpYmx1c3RyZS4KLSAqICAtIHR1eF9pbmZvOiBvbnkgb24gUmVkSGF0IGtlcm5lbC4KKyAqICAtIHR1eF9pbmZvOiBvbmx5IG9uIFJlZEhhdCBrZXJuZWwuCiAgKiAgLSAuLi4KICAqIFxub3RlIEFzIGxvbmcgYXMgd2UgdXNlIHRhc2tfc3RydWN0IHRvIHN0b3JlIGNsX2Vudiwgd2UgYXNzdW1lIHRoYXQgb25jZQogICogY2FsbGVkIGludG8gTHVzdHJlLCB3ZSdsbCBuZXZlciBjYWxsIGludG8gdGhlIG90aGVyIHBhcnQgb2YgdGhlIGtlcm5lbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvZ2Vub3BzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9nZW5vcHMuYwppbmRleCBkOWY3NTBkLi5mMmJkZWEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9nZW5vcHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9nZW5vcHMuYwpAQCAtMTAxMCw2ICsxMDEwLDggQEAKIAlJTklUX0xJU1RfSEVBRCgmaW1wLT5pbXBfcmVwbGF5X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZpbXAtPmltcF9zZW5kaW5nX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZpbXAtPmltcF9kZWxheWVkX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZpbXAtPmltcF9jb21taXR0ZWRfbGlzdCk7CisJaW1wLT5pbXBfcmVwbGF5X2N1cnNvciA9ICZpbXAtPmltcF9jb21taXR0ZWRfbGlzdDsKIAlzcGluX2xvY2tfaW5pdCgmaW1wLT5pbXBfbG9jayk7CiAJaW1wLT5pbXBfbGFzdF9zdWNjZXNzX2Nvbm4gPSAwOwogCWltcC0+aW1wX3N0YXRlID0gTFVTVFJFX0lNUF9ORVc7CkBAIC0xNTMyLDggKzE1MzQsOCBAQAogCXNwaW5fbG9jaygmb2JkLT5vYmRfZGV2X2xvY2spOwogCXdoaWxlICghbGlzdF9lbXB0eSgmb2JkLT5vYmRfdW5saW5rZWRfZXhwb3J0cykpIHsKIAkJc3Bpbl91bmxvY2soJm9iZC0+b2JkX2Rldl9sb2NrKTsKLQkJc2NoZWR1bGVfdGltZW91dF9hbmRfc2V0X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFLAotCQkJCQkJICAgY2ZzX3RpbWVfc2Vjb25kcyh3YWl0ZWQpKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMod2FpdGVkKSk7CiAJCWlmICh3YWl0ZWQgPiA1ICYmIElTX1BPMih3YWl0ZWQpKSB7CiAJCQlMQ09OU09MRV9XQVJOKCIlcyBpcyB3YWl0aW5nIGZvciBvYmRfdW5saW5rZWRfZXhwb3J0cyAiCiAJCQkJICAgICAgIm1vcmUgdGhhbiAlZCBzZWNvbmRzLiAiCkBAIC0xNjI1LDcgKzE2MjcsNyBAQAogfQogCiAvKioKLSAqIEFkZCBleHBvcnQgdG8gdGhlIG9iZF96b21iZSB0aHJlYWQgYW5kIG5vdGlmeSBpdC4KKyAqIEFkZCBleHBvcnQgdG8gdGhlIG9iZF96b21iaWUgdGhyZWFkIGFuZCBub3RpZnkgaXQuCiAgKi8KIHN0YXRpYyB2b2lkIG9iZF96b21iaWVfZXhwb3J0X2FkZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwKSB7CiAJc3Bpbl9sb2NrKCZleHAtPmV4cF9vYmQtPm9iZF9kZXZfbG9jayk7CkBAIC0xNjQxLDcgKzE2NDMsNyBAQAogfQogCiAvKioKLSAqIEFkZCBpbXBvcnQgdG8gdGhlIG9iZF96b21iZSB0aHJlYWQgYW5kIG5vdGlmeSBpdC4KKyAqIEFkZCBpbXBvcnQgdG8gdGhlIG9iZF96b21iaWUgdGhyZWFkIGFuZCBub3RpZnkgaXQuCiAgKi8KIHN0YXRpYyB2b2lkIG9iZF96b21iaWVfaW1wb3J0X2FkZChzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wKSB7CiAJTEFTU0VSVChpbXAtPmltcF9zZWMgPT0gTlVMTCk7CkBAIC0xNjYxLDcgKzE2NjMsNyBAQAogc3RhdGljIHZvaWQgb2JkX3pvbWJpZV9pbXBleHBfbm90aWZ5KHZvaWQpCiB7CiAJLyoKLQkgKiBNYWtlIHN1cmUgb2JkX3pvbWViaWVfaW1wZXhwX3RocmVhZCBnZXQgdGhpcyBub3RpZmljYXRpb24uCisJICogTWFrZSBzdXJlIG9iZF96b21iaWVfaW1wZXhwX3RocmVhZCBnZXQgdGhpcyBub3RpZmljYXRpb24uCiAJICogSXQgaXMgcG9zc2libGUgdGhpcyBzaWduYWwgb25seSBnZXQgYnkgb2JkX3pvbWJpZV9iYXJyaWVyLCBhbmQKIAkgKiBiYXJyaWVyIGd1bHBzIHRoaXMgbm90aWZpY2F0aW9uIGFuZCBzbGVlcHMgYXdheSBhbmQgaGFuZ3MgZW5zdWVzCiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1tb2R1bGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LW1vZHVsZS5jCmluZGV4IDEyMWE4NTYuLmJhMjA3NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LW1vZHVsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LW1vZHVsZS5jCkBAIC0xODQsNyArMTg0LDcgQEAKIAlpbnQgZXJyID0gMDsKIAogCS8qIEFsbG93IG5vbi1yb290IGFjY2VzcyBmb3IgT0JEX0lPQ19QSU5HX1RBUkdFVCAtIHVzZWQgYnkgbGZzIGNoZWNrICovCi0JaWYgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikgJiYgKGNtZCAhPSBPQkRfSU9DX1BJTkdfVEFSR0VUKSkKKwlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pICYmIChjbWQgIT0gT0JEX0lPQ19QSU5HX1RBUkdFVCkpCiAJCXJldHVybiBlcnIgPSAtRUFDQ0VTOwogCWlmICgoY21kICYgMHhmZmZmZmYwMCkgPT0gKChpbnQpJ1QnKSA8PCA4KSAvKiBpZ25vcmUgYWxsIHR0eSBpb2N0bHMgKi8KIAkJcmV0dXJuIGVyciA9IC1FTk9UVFk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX2NhdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19jYXQuYwppbmRleCBjMGYzYWY3Li4xZDk5OTMxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19jYXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX2NhdC5jCkBAIC01NTEsOSArNTUxLDggQEAKIAogCWlmIChyZWMtPmxyaF9pbmRleCA8IGQtPmxwZF9zdGFydGNhdCkKIAkJLyogU2tpcCBwcm9jZXNzaW5nIG9mIHRoZSBsb2dzIHVudGlsIHN0YXJ0Y2F0ICovCi0JCXJldHVybiAwOwotCi0JaWYgKGQtPmxwZF9zdGFydGlkeCA+IDApIHsKKwkJcmMgPSAwOworCWVsc2UgaWYgKGQtPmxwZF9zdGFydGlkeCA+IDApIHsKIAkJc3RydWN0IGxsb2dfcHJvY2Vzc19jYXRfZGF0YSBjZDsKIAogCQljZC5scGNkX2ZpcnN0X2lkeCA9IGQtPmxwZF9zdGFydGlkeDsKQEAgLTU2Niw2ICs1NjUsNyBAQAogCQlyYyA9IGxsb2dfcHJvY2Vzc19vcl9mb3JrKGVudiwgbGxoLCBkLT5scGRfY2IsIGQtPmxwZF9kYXRhLAogCQkJCQkgIE5VTEwsIGZhbHNlKTsKIAl9CisKIAlsbG9nX2hhbmRsZV9wdXQobGxoKTsKIAogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfbHZmcy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19sdmZzLmMKaW5kZXggNTM4NWQ4ZS4uZDg2YmI4YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfbHZmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfbHZmcy5jCkBAIC0zNzYsNyArMzc2LDcgQEAKIAogLyogc2V0czoKICAqICAtIGN1cl9vZmZzZXQgdG8gdGhlIGZ1cnRoZXN0IHBvaW50IHJlYWQgaW4gdGhlIGxvZyBmaWxlCi0gKiAgLSBjdXJfaWR4IHRvIHRoZSBsb2cgaW5kZXggcHJlY2VlZGluZyBjdXJfb2Zmc2V0CisgKiAgLSBjdXJfaWR4IHRvIHRoZSBsb2cgaW5kZXggcHJlY2VkaW5nIGN1cl9vZmZzZXQKICAqIHJldHVybnMgLUVJTy8tRUlOVkFMIG9uIGVycm9yCiAgKi8KIHN0YXRpYyBpbnQgbGxvZ19sdmZzX25leHRfYmxvY2soY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19vc2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfb3NkLmMKaW5kZXggNjU0YzhlMS4uNjgyMjc5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19vc2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX29zZC5jCkBAIC01MTQsNyArNTE0LDcgQEAKIAogLyogc2V0czoKICAqICAtIGN1cl9vZmZzZXQgdG8gdGhlIGZ1cnRoZXN0IHBvaW50IHJlYWQgaW4gdGhlIGxvZyBmaWxlCi0gKiAgLSBjdXJfaWR4IHRvIHRoZSBsb2cgaW5kZXggcHJlY2VlZGluZyBjdXJfb2Zmc2V0CisgKiAgLSBjdXJfaWR4IHRvIHRoZSBsb2cgaW5kZXggcHJlY2VkaW5nIGN1cl9vZmZzZXQKICAqIHJldHVybnMgLUVJTy8tRUlOVkFMIG9uIGVycm9yCiAgKi8KIHN0YXRpYyBpbnQgbGxvZ19vc2RfbmV4dF9ibG9jayhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCkBAIC0xMDczLDcgKzEwNzMsNyBAQAogCUxBU1NFUlQoY3R4dCk7CiAKIAkvKiBpbml0aWFsaXplIGRhdGEgYWxsb3dpbmcgdG8gZ2VuZXJhdGUgbmV3IGZpZHMsCi0JICogbGl0ZXJhbGx5IHdlIG5lZWQgYSBzZXF1ZWNlICovCisJICogbGl0ZXJhbGx5IHdlIG5lZWQgYSBzZXF1ZW5jZSAqLwogCWxnaS0+bGdpX2ZpZC5mX3NlcSA9IEZJRF9TRVFfTExPRzsKIAlsZ2ktPmxnaV9maWQuZl9vaWQgPSAxOwogCWxnaS0+bGdpX2ZpZC5mX3ZlciA9IDA7CkBAIC0xMjgwLDcgKzEyODAsNyBAQAogCWxnaS0+bGdpX2J1Zi5sYl9sZW4gPSBzaXplOwogCXJjID0gZHRfcmVjb3JkX3dyaXRlKGVudiwgbywgJmxnaS0+bGdpX2J1ZiwgJmxnaS0+bGdpX29mZiwgdGgpOwogCWlmIChyYykKLQkJQ0RFQlVHKERfSU5PREUsICJlcnJvciB3cml0ZWluZyBDQVRBTE9HUzogcmMgPSAlZFxuIiwgcmMpOworCQlDREVCVUcoRF9JTk9ERSwgImVycm9yIHdyaXRpbmcgQ0FUQUxPR1M6IHJjID0gJWRcbiIsIHJjKTsKIG91dF90cmFuczoKIAlkdF90cmFuc19zdG9wKGVudiwgZCwgdGgpOwogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbG9jYWxfc3RvcmFnZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbG9jYWxfc3RvcmFnZS5jCmluZGV4IGU3OWU0YmUuLmU3NmY3ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xvY2FsX3N0b3JhZ2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sb2NhbF9zdG9yYWdlLmMKQEAgLTczNyw3ICs3MzcsNyBAQAogICogQWxsIGR5bmFtaWMgZmlkcyB3aWxsIGJlIGdlbmVyYXRlZCB3aXRoIHRoZSBzYW1lIHNlcXVlbmNlIGFuZCBpbmNyZW1lbnRlZAogICogT0lEcwogICoKLSAqIFJldHVybmVkIGxvY2FsX29pZF9zdG9yYWdlIGlzIGluLW1lbW9yeSByZXByZXNlbnRhaW9uIG9mIE9JRCBzdG9yYWdlCisgKiBSZXR1cm5lZCBsb2NhbF9vaWRfc3RvcmFnZSBpcyBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgT0lEIHN0b3JhZ2UKICAqLwogaW50IGxvY2FsX29pZF9zdG9yYWdlX2luaXQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgZHRfZGV2aWNlICpkZXYsCiAJCQkgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaXJzdF9maWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9scHJvY2ZzX3N0YXR1cy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHByb2Nmc19zdGF0dXMuYwppbmRleCBlYzNiNjA1Li4xNDMyZGQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9scHJvY2ZzX3N0YXR1cy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xwcm9jZnNfc3RhdHVzLmMKQEAgLTk4LDYgKzk4LDggQEAKIAkibGlnaHR3ZWlnaHRfY29ubiIsCiAJInNob3J0X2lvIiwKIAkicGluZ2xlc3MiLAorCSJmbG9ja19kZWFkbG9jayIsCisJImRpc3Bfc3RyaXBlIiwKIAkidW5rbm93biIsCiAJTlVMTAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1X29iamVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVfb2JqZWN0LmMKaW5kZXggOTg4N2Q4Zi4uOTJlOGExNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVfb2JqZWN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVfb2JqZWN0LmMKQEAgLTU3MSw3ICs1NzEsNyBAQAogCSAqIGRyYWluZWQpLCBhbmQgbW9yZW92ZXIsIGxvb2t1cCBoYXMgdG8gd2FpdCB1bnRpbCBvYmplY3QgaXMgZnJlZWQuCiAJICovCiAKLQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KHdhaXRlcik7CisJaW5pdF93YWl0cXVldWVfZW50cnkod2FpdGVyLCBjdXJyZW50KTsKIAlhZGRfd2FpdF9xdWV1ZSgmYmt0LT5sc2JfbWFyY2hlX2Z1bmVicmUsIHdhaXRlcik7CiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCWxwcm9jZnNfY291bnRlcl9pbmNyKHMtPmxzX3N0YXRzLCBMVV9TU19DQUNIRV9ERUFUSF9SQUNFKTsKQEAgLTcxMiw3ICs3MTIsNyBAQAogCQkgKiBsdV9vYmplY3RfZmluZF90cnkoKSBhbHJlYWR5IGFkZGVkIHdhaXRlciBpbnRvIHRoZQogCQkgKiB3YWl0IHF1ZXVlLgogCQkgKi8KLQkJd2FpdHFfd2FpdCgmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZSgpOwogCQlia3QgPSBsdV9zaXRlX2JrdF9mcm9tX2ZpZChkZXYtPmxkX3NpdGUsICh2b2lkICopZik7CiAJCXJlbW92ZV93YWl0X3F1ZXVlKCZia3QtPmxzYl9tYXJjaGVfZnVuZWJyZSwgJndhaXQpOwogCX0KQEAgLTg5MCwxMCArODkwLDEwIEBACiAKIAloYXNoID0gZmlkX2ZsYXR0ZW4zMihmaWQpOwogCWhhc2ggKz0gKGhhc2ggPj4gNCkgKyAoaGFzaCA8PCAxMik7IC8qIG1peGluZyBvaWQgYW5kIHNlcSAqLwotCWhhc2ggPSBjZnNfaGFzaF9sb25nKGhhc2gsIGhzLT5oc19ia3RfYml0cyk7CisJaGFzaCA9IGhhc2hfbG9uZyhoYXNoLCBocy0+aHNfYmt0X2JpdHMpOwogCiAJLyogZ2l2ZSBtZSBhbm90aGVyIHJhbmRvbSBmYWN0b3IgKi8KLQloYXNoIC09IGNmc19oYXNoX2xvbmcoKHVuc2lnbmVkIGxvbmcpaHMsIGZpZF9vaWQoZmlkKSAlIDExICsgMyk7CisJaGFzaCAtPSBoYXNoX2xvbmcoKHVuc2lnbmVkIGxvbmcpaHMsIGZpZF9vaWQoZmlkKSAlIDExICsgMyk7CiAKIAloYXNoIDw8PSBocy0+aHNfY3VyX2JpdHMgLSBocy0+aHNfYmt0X2JpdHM7CiAJaGFzaCB8PSAoZmlkX3NlcShmaWQpICsgZmlkX29pZChmaWQpKSAmIChDRlNfSEFTSF9OQktUKGhzKSAtIDEpOwpAQCAtMjEwMCw3ICsyMTAwLDcgQEAKIEVYUE9SVF9TWU1CT0wobHVfb2JqZWN0X2Fzc2lnbl9maWQpOwogCiAvKioKLSAqIGFsbG9jYXRlcyBvYmplY3Qgd2l0aCAwIChub24tYXNzaWdlZCkgZmlkCisgKiBhbGxvY2F0ZXMgb2JqZWN0IHdpdGggMCAobm9uLWFzc2lnbmVkKSBmaWQKICAqIFhYWDogdGVtcG9yYXJ5IHNvbHV0aW9uIHRvIGJlIGFibGUgdG8gYXNzaWduIGZpZCBpbiAtPmRvX2NyZWF0ZSgpCiAgKiAgICAgIHRpbGwgd2UgaGF2ZSBmdWxseS1mdW5jdGlvbmFsIE9TVCBmaWRzCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL21kX2F0dHJzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9tZF9hdHRycy5jCmluZGV4IGY3MTg3ODIuLmYwODBjY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL21kX2F0dHJzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbWRfYXR0cnMuYwpAQCAtNjAsNyArNjAsNyBAQAogICovCiB2b2lkIGx1c3RyZV9sbWFfc3dhYihzdHJ1Y3QgbHVzdHJlX21kdF9hdHRycyAqbG1hKQogewotCS8qIFVzZSBMVVNUUkVfTVNHX01BR0lDIHRvIGRldGVjdCBsb2NhbCBlbmRpYW5lc3MuICovCisJLyogVXNlIExVU1RSRV9NU0dfTUFHSUMgdG8gZGV0ZWN0IGxvY2FsIGVuZGlhbm5lc3MuICovCiAJaWYgKExVU1RSRV9NU0dfTUFHSUMgIT0gY3B1X3RvX2xlMzIoTFVTVFJFX01TR19NQUdJQykpIHsKIAkJX19zd2FiMzJzKCZsbWEtPmxtYV9jb21wYXQpOwogCQlfX3N3YWIzMnMoJmxtYS0+bG1hX2luY29tcGF0KTsKQEAgLTc3LDcgKzc3LDcgQEAKICAqLwogdm9pZCBsdXN0cmVfc29tX3N3YWIoc3RydWN0IHNvbV9hdHRycyAqYXR0cnMpCiB7Ci0JLyogVXNlIExVU1RSRV9NU0dfTUFHSUMgdG8gZGV0ZWN0IGxvY2FsIGVuZGlhbmVzcy4gKi8KKwkvKiBVc2UgTFVTVFJFX01TR19NQUdJQyB0byBkZXRlY3QgbG9jYWwgZW5kaWFubmVzcy4gKi8KIAlpZiAoTFVTVFJFX01TR19NQUdJQyAhPSBjcHVfdG9fbGUzMihMVVNUUkVfTVNHX01BR0lDKSkgewogCQlfX3N3YWIzMnMoJmF0dHJzLT5zb21fY29tcGF0KTsKIAkJX19zd2FiMzJzKCZhdHRycy0+c29tX2luY29tcGF0KTsKQEAgLTEzNSw3ICsxMzUsNyBAQAogICovCiB2b2lkIGx1c3RyZV9oc21fc3dhYihzdHJ1Y3QgaHNtX2F0dHJzICphdHRycykKIHsKLQkvKiBVc2UgTFVTVFJFX01TR19NQUdJQyB0byBkZXRlY3QgbG9jYWwgZW5kaWFuZXNzLiAqLworCS8qIFVzZSBMVVNUUkVfTVNHX01BR0lDIHRvIGRldGVjdCBsb2NhbCBlbmRpYW5uZXNzLiAqLwogCWlmIChMVVNUUkVfTVNHX01BR0lDICE9IGNwdV90b19sZTMyKExVU1RSRV9NU0dfTUFHSUMpKSB7CiAJCV9fc3dhYjMycygmYXR0cnMtPmhzbV9jb21wYXQpOwogCQlfX3N3YWIzMnMoJmF0dHJzLT5oc21fZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2JkX2NvbmZpZy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2JkX2NvbmZpZy5jCmluZGV4IDM2MmFlNTQuLjJkNTc3NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9jb25maWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRfY29uZmlnLmMKQEAgLTYxLDcgKzYxLDggQEAKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIDE7CiAKLQlpZiAoKHB0ciA9IHN0cnN0cihidWYsIGtleSkpID09IE5VTEwpCisJcHRyID0gc3Ryc3RyKGJ1Ziwga2V5KTsKKwlpZiAocHRyID09IE5VTEwpCiAJCXJldHVybiAxOwogCiAJaWYgKHZhbHApCkBAIC01OTIsNyArNTkzLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woY2xhc3NfZGV0YWNoKTsKIAotLyoqIFN0YXJ0IHNodXR0aW5nIGRvd24gdGhlIG9iZC4gIFRoZXJlIG1heSBiZSBpbi1wcm9nZXNzIG9wcyB3aGVuCisvKiogU3RhcnQgc2h1dHRpbmcgZG93biB0aGUgb2JkLiAgVGhlcmUgbWF5IGJlIGluLXByb2dyZXNzIG9wcyB3aGVuCiAgKiB0aGlzIGlzIGNhbGxlZC4gIFdlIHRlbGwgdGhlbSB0byBzdGFydCBzaHV0dGluZyBkb3duIHdpdGggYSBjYWxsCiAgKiB0byBjbGFzc19kaXNjb25uZWN0X2V4cG9ydHMoKS4KICAqLwpAQCAtNjU1LDcgKzY1Niw3IEBACiAJLyogVGhlIHRocmVlIHJlZmVyZW5jZXMgdGhhdCBzaG91bGQgYmUgcmVtYWluaW5nIGFyZSB0aGUKIAkgKiBvYmRfc2VsZl9leHBvcnQgYW5kIHRoZSBhdHRhY2ggYW5kIHNldHVwIHJlZmVyZW5jZXMuICovCiAJaWYgKGF0b21pY19yZWFkKCZvYmQtPm9iZF9yZWZjb3VudCkgPiAzKSB7Ci0JCS8qIHJlZmNvdW5mIC0gMyBtaWdodCBiZSB0aGUgbnVtYmVyIG9mIHJlYWwgZXhwb3J0cworCQkvKiByZWZjb3VudCAtIDMgbWlnaHQgYmUgdGhlIG51bWJlciBvZiByZWFsIGV4cG9ydHMKIAkJICAgKGV4Y2x1ZGluZyBzZWxmIGV4cG9ydCkuIEJ1dCBjbGFzc19pbmNyZWYgaXMgY2FsbGVkCiAJCSAgIGJ5IG90aGVyIHRoaW5ncyBhcyB3ZWxsLCBzbyBkb24ndCBjb3VudCBvbiBpdC4gKi8KIAkJQ0RFQlVHKERfSU9DVEwsICIlczogZm9yY2luZyBleHBvcnRzIHRvIGRpc2Nvbm5lY3Q6ICVkXG4iLApAQCAtMTAyNyw2ICsxMDI4LDQ2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGx1c3RyZV9jZmdfcmVuYW1lKTsKIAorc3RhdGljIGludCBwcm9jZXNzX3BhcmFtMl9jb25maWcoc3RydWN0IGx1c3RyZV9jZmcgKmxjZmcpCit7CisJY2hhciAqcGFyYW0gPSBsdXN0cmVfY2ZnX3N0cmluZyhsY2ZnLCAxKTsKKwljaGFyICp1cGNhbGwgPSBsdXN0cmVfY2ZnX3N0cmluZyhsY2ZnLCAyKTsKKwljaGFyICphcmd2W10gPSB7CisJCVswXSA9ICIvdXNyL3NiaW4vbGN0bCIsCisJCVsxXSA9ICJzZXRfcGFyYW0iLAorCQlbMl0gPSBwYXJhbSwKKwkJWzNdID0gTlVMTAorCX07CisJc3RydWN0IHRpbWV2YWwJc3RhcnQ7CisJc3RydWN0IHRpbWV2YWwJZW5kOworCWludAkJcmM7CisKKworCS8qIEFkZCB1cGNhbGwgcHJvY2Vzc2luZyBoZXJlLiBOb3cgb25seSBsY3RsIGlzIHN1cHBvcnRlZCAqLworCWlmIChzdHJjbXAodXBjYWxsLCBMQ1RMX1VQQ0FMTCkgIT0gMCkgeworCQlDRVJST1IoIlVuc3VwcG9ydGVkIHVwY2FsbCAlc1xuIiwgdXBjYWxsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZG9fZ2V0dGltZW9mZGF5KCZzdGFydCk7CisJcmMgPSBVU0VSTU9ERUhFTFBFUihhcmd2WzBdLCBhcmd2LCBOVUxMKTsKKwlkb19nZXR0aW1lb2ZkYXkoJmVuZCk7CisKKwlpZiAocmMgPCAwKSB7CisJCUNFUlJPUigKKwkJICAgICAgICJsY3RsOiBlcnJvciBpbnZva2luZyB1cGNhbGwgJXMgJXMgJXM6IHJjID0gJWQ7IHRpbWUgJWxkdXNcbiIsCisJCSAgICAgICBhcmd2WzBdLCBhcmd2WzFdLCBhcmd2WzJdLCByYywKKwkJICAgICAgIGNmc190aW1ldmFsX3N1YigmZW5kLCAmc3RhcnQsIE5VTEwpKTsKKwl9IGVsc2UgeworCQlDREVCVUcoRF9IQSwgImxjdGw6IGludm9rZWQgdXBjYWxsICVzICVzICVzLCB0aW1lICVsZHVzXG4iLAorCQkgICAgICAgYXJndlswXSwgYXJndlsxXSwgYXJndlsyXSwKKwkJICAgICAgIGNmc190aW1ldmFsX3N1YigmZW5kLCAmc3RhcnQsIE5VTEwpKTsKKwkJICAgICAgIHJjID0gMDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKIHZvaWQgbHVzdHJlX3JlZ2lzdGVyX3F1b3RhX3Byb2Nlc3NfY29uZmlnKGludCAoKnFwYykoc3RydWN0IGx1c3RyZV9jZmcgKmxjZmcpKQogewogCXF1b3RhX3Byb2Nlc3NfY29uZmlnID0gcXBjOwpAQCAtMTE0MiwxMSArMTE4MywxNCBAQAogCQkJZXJyID0gKCpxdW90YV9wcm9jZXNzX2NvbmZpZykobGNmZyk7CiAJCQlHT1RPKG91dCwgZXJyKTsKIAkJfQotCQkvKiBGYWxsIHRocm91Z2ggKi8KKwogCQlicmVhazsKIAl9CisJY2FzZSBMQ0ZHX1NFVF9QQVJBTTogeworCQllcnIgPSBwcm9jZXNzX3BhcmFtMl9jb25maWcobGNmZyk7CisJCUdPVE8ob3V0LCAwKTsKIAl9Ci0KKwl9CiAJLyogQ29tbWFuZHMgdGhhdCByZXF1aXJlIGEgZGV2aWNlICovCiAJb2JkID0gY2xhc3NfbmFtZTJvYmQobHVzdHJlX2NmZ19zdHJpbmcobGNmZywgMCkpOwogCWlmIChvYmQgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2JkX21vdW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRfbW91bnQuYwppbmRleCBhNjlhNjMwLi42ZjhiYTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRfbW91bnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRfbW91bnQuYwpAQCAtNTAxLDcgKzUwMSw3IEBACiAJfQogCiAJLyogVGhlIE1HQyBoYXMgbm8gcmVjb3ZlcmFibGUgZGF0YSBpbiBhbnkgY2FzZS4KLQkgKiBmb3JjZSBzaG90ZG93biBzZXQgaW4gdW1vdW50X2JlZ2luICovCisJICogZm9yY2Ugc2h1dGRvd24gc2V0IGluIHVtb3VudF9iZWdpbiAqLwogCW9iZC0+b2JkX25vX3JlY292ID0gMTsKIAogCWlmIChvYmQtPnUuY2xpLmNsX21nY19tZ3NleHApIHsKQEAgLTc1NCw3ICs3NTQsNyBAQAogfQogRVhQT1JUX1NZTUJPTChzZXJ2ZXJfbmFtZTJpbmRleCk7CiAKLS8qKioqKioqKioqKioqKiogbW91bnQgY29tbW9uIGJldHdlZWVuIHNlcnZlciBhbmQgY2xpZW50ICoqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKiogbW91bnQgY29tbW9uIGJldHdlZW4gc2VydmVyIGFuZCBjbGllbnQgKioqKioqKioqKioqKioqLwogCiAvKiBDb21tb24gdW1vdW50ICovCiBpbnQgbHVzdHJlX2NvbW1vbl9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZG8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZG8uYwppbmRleCA3MDk5NzY0Li4zYjFiMjhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2Jkby5jCkBAIC0xOTEsNyArMTkxLDcgQEAKIAl9CiAJaWYgKCBjb21wYXJlICYgT0JEX01EX0ZMR0VORVIgKQogCQlyZXMgPSAocmVzIHx8IChkc3QtPm9fcGFyZW50X29pZCAhPSBzcmMtPm9fcGFyZW50X29pZCkpOwotCS8qIFhYWCBEb24ndCBrbm93IGlmIHRoc2VzIHNob3VsZCBiZSBpbmNsdWRlZCBoZXJlIC0gd2Fzbid0IHByZXZpb3VzbHkKKwkvKiBYWFggRG9uJ3Qga25vdyBpZiB0aGVzZSBzaG91bGQgYmUgaW5jbHVkZWQgaGVyZSAtIHdhc24ndCBwcmV2aW91c2x5CiAJaWYgKCBjb21wYXJlICYgT0JEX01EX0ZMSU5MSU5FICkKIAkJcmVzID0gKHJlcyB8fCBtZW1jbXAoZHN0LT5vX2lubGluZSwgc3JjLT5vX2lubGluZSkpOwogCSovCkBAIC0yMzMsNyArMjMzLDcgQEAKIAkJb2EtPm9fbW9kZSA9IGF0dHItPmlhX21vZGU7CiAJCW9hLT5vX3ZhbGlkIHw9IE9CRF9NRF9GTFRZUEUgfCBPQkRfTURfRkxNT0RFOwogCQlpZiAoIWluX2dyb3VwX3AobWFrZV9rZ2lkKCZpbml0X3VzZXJfbnMsIG9hLT5vX2dpZCkpICYmCi0JCSAgICAhY2ZzX2NhcGFibGUoQ0ZTX0NBUF9GU0VUSUQpKQorCQkgICAgIWNhcGFibGUoQ0ZTX0NBUF9GU0VUSUQpKQogCQkJb2EtPm9fbW9kZSAmPSB+U19JU0dJRDsKIAl9CiAJaWYgKGlhX3ZhbGlkICYgQVRUUl9VSUQpIHsKQEAgLTI4Miw3ICsyODIsNyBAQAogCQlhdHRyLT5pYV9tb2RlID0gKGF0dHItPmlhX21vZGUgJiBTX0lGTVQpfChvYS0+b19tb2RlICYgflNfSUZNVCk7CiAJCWF0dHItPmlhX3ZhbGlkIHw9IEFUVFJfTU9ERTsKIAkJaWYgKCFpbl9ncm91cF9wKG1ha2Vfa2dpZCgmaW5pdF91c2VyX25zLCBvYS0+b19naWQpKSAmJgotCQkgICAgIWNmc19jYXBhYmxlKENGU19DQVBfRlNFVElEKSkKKwkJICAgICFjYXBhYmxlKENGU19DQVBfRlNFVElEKSkKIAkJCWF0dHItPmlhX21vZGUgJj0gflNfSVNHSUQ7CiAJfQogCWlmICh2YWxpZCAmIE9CRF9NRF9GTFVJRCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG8uYwppbmRleCBkZWJiOWNlLi45NmE4MDdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG8uYwpAQCAtNjA2LDcgKzYwNiw4IEBACiAKIAkvKiBYWFggQnVnIDM0MTM7IHdhaXQgZm9yIGEgYml0IHRvIGVuc3VyZSB0aGUgQkwgY2FsbGJhY2sgaGFzCiAJICogaGFwcGVuZWQgYmVmb3JlIGNhbGxpbmcgbGRsbV9uYW1lc3BhY2VfZnJlZSgpICovCi0Jc2NoZWR1bGVfdGltZW91dF9hbmRfc2V0X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFLCBjZnNfdGltZV9zZWNvbmRzKDEpKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKDEpKTsKIAogCWxkbG1fbmFtZXNwYWNlX2ZyZWUob2JkLT5vYmRfbmFtZXNwYWNlLCBOVUxMLCBvYmQtPm9iZF9mb3JjZSk7CiAJb2JkLT5vYmRfbmFtZXNwYWNlID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vZWNob19jbGllbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vZWNob19jbGllbnQuYwppbmRleCA5YjJkZWEyLi43NTRhYThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG9fY2xpZW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvX2NsaWVudC5jCkBAIC05OTcsOCArOTk3LDggQEAKIAkJc3Bpbl91bmxvY2soJmVjLT5lY19sb2NrKTsKIAkJQ0VSUk9SKCJlY2hvX2NsaWVudCBzdGlsbCBoYXMgb2JqZWN0cyBhdCBjbGVhbnVwIHRpbWUsICIKIAkJICAgICAgICJ3YWl0IGZvciAxIHNlY29uZFxuIik7Ci0JCXNjaGVkdWxlX3RpbWVvdXRfYW5kX3NldF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSwKLQkJCQkJCSAgIGNmc190aW1lX3NlY29uZHMoMSkpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CiAJCWx1X3NpdGVfcHVyZ2UoZW52LCAmZWQtPmVkX3NpdGUtPmNzX2x1LCAtMSk7CiAJCXNwaW5fbG9jaygmZWMtPmVjX2xvY2spOwogCX0KQEAgLTI3NjQsNyArMjc2NCw3IEBACiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgT0JEX0lPQ19DUkVBVEU6CQkgICAgLyogbWF5IGNyZWF0ZSBlY2hvIG9iamVjdCAqLwotCQlpZiAoIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKKwkJaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKIAkJCUdPVE8gKG91dCwgcmMgPSAtRVBFUk0pOwogCiAJCXJjID0gZWNob19jcmVhdGVfb2JqZWN0KGVudiwgZWQsIDEsIG9hLCBkYXRhLT5pb2NfcGJ1ZjEsCkBAIC0yNzc4LDcgKzI3NzgsNyBAQAogCQlpbnQgZGlybGVuOwogCQlfX3U2NCBpZDsKIAotCQlpZiAoIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKKwkJaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKIAkJCUdPVE8ob3V0LCByYyA9IC1FUEVSTSk7CiAKIAkJY291bnQgPSBkYXRhLT5pb2NfY291bnQ7CkBAIC0yODA2LDcgKzI4MDYsNyBAQAogCQlfX3U2NAkgICAgc2VxOwogCQlpbnQJICAgICAgbWF4X2NvdW50OwogCi0JCWlmICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQorCQlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQogCQkJR09UTyhvdXQsIHJjID0gLUVQRVJNKTsKIAogCQljbF9lbnYgPSBjbF9lbnZfZ2V0KCZyZWZjaGVjayk7CkBAIC0yODM4LDcgKzI4MzgsNyBAQAogCQlHT1RPKG91dCwgcmMpOwogCX0KIAljYXNlIE9CRF9JT0NfREVTVFJPWToKLQkJaWYgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCisJCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCiAJCQlHT1RPIChvdXQsIHJjID0gLUVQRVJNKTsKIAogCQlyYyA9IGVjaG9fZ2V0X29iamVjdCgmZWNvLCBlZCwgb2EpOwpAQCAtMjg2Myw3ICsyODYzLDcgQEAKIAkJR09UTyhvdXQsIHJjKTsKIAogCWNhc2UgT0JEX0lPQ19TRVRBVFRSOgotCQlpZiAoIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKKwkJaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKIAkJCUdPVE8gKG91dCwgcmMgPSAtRVBFUk0pOwogCiAJCXJjID0gZWNob19nZXRfb2JqZWN0KCZlY28sIGVkLCBvYSk7CkBAIC0yODc4LDcgKzI4NzgsNyBAQAogCQlHT1RPKG91dCwgcmMpOwogCiAJY2FzZSBPQkRfSU9DX0JSV19XUklURToKLQkJaWYgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCisJCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCiAJCQlHT1RPIChvdXQsIHJjID0gLUVQRVJNKTsKIAogCQlydyA9IE9CRF9CUldfV1JJVEU7CkBAIC0yODk3LDcgKzI4OTcsNyBAQAogCQlHT1RPKG91dCwgcmMpOwogCiAJY2FzZSBFQ0hPX0lPQ19TRVRfU1RSSVBFOgotCQlpZiAoIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKKwkJaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKIAkJCUdPVE8gKG91dCwgcmMgPSAtRVBFUk0pOwogCiAJCWlmIChkYXRhLT5pb2NfcGJ1ZjEgPT0gTlVMTCkgeyAgLyogdW5zZXQgKi8KQEAgLTI5MTQsNyArMjkxNCw3IEBACiAJCUdPVE8gKG91dCwgcmMpOwogCiAJY2FzZSBFQ0hPX0lPQ19FTlFVRVVFOgotCQlpZiAoIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKKwkJaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKIAkJCUdPVE8gKG91dCwgcmMgPSAtRVBFUk0pOwogCiAJCXJjID0gZWNob19jbGllbnRfZW5xdWV1ZShleHAsIG9hLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19jYWNoZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19jYWNoZS5jCmluZGV4IGJlNDUxMWUuLmZlOTk4OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfY2FjaGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2NhY2hlLmMKQEAgLTEwMjAsNyArMTAyMCw3IEBACiAKIC8qKgogICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG1ha2UgdGhlIGV4dGVudCBwcmVwYXJlZCBmb3IgdHJhbnNmZXIuCi0gKiBBIHJhY2Ugd2l0aCBmbHVzaW5nIHBhZ2UgLSBsbF93cml0ZXBhZ2UoKSBoYXMgdG8gYmUgaGFuZGxlZCBjYXV0aW91c2x5LgorICogQSByYWNlIHdpdGggZmx1c2hpbmcgcGFnZSAtIGxsX3dyaXRlcGFnZSgpIGhhcyB0byBiZSBoYW5kbGVkIGNhdXRpb3VzbHkuCiAgKi8KIHN0YXRpYyBpbnQgb3NjX2V4dGVudF9tYWtlX3JlYWR5KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKIAkJCQkgc3RydWN0IG9zY19leHRlbnQgKmV4dCkKQEAgLTIxNDYsNyArMjE0Niw3IEBACiAJb2FwLT5vYXBfb2JqX29mZiA9IG9mZnNldDsKIAlMQVNTRVJUKCEob2Zmc2V0ICYgfkNGU19QQUdFX01BU0spKTsKIAotCWlmICghY2xpZW50X2lzX3JlbW90ZShleHApICYmIGNmc19jYXBhYmxlKENGU19DQVBfU1lTX1JFU09VUkNFKSkKKwlpZiAoIWNsaWVudF9pc19yZW1vdGUoZXhwKSAmJiBjYXBhYmxlKENGU19DQVBfU1lTX1JFU09VUkNFKSkKIAkJb2FwLT5vYXBfYnJ3X2ZsYWdzID0gT0JEX0JSV19OT1FVT1RBOwogCiAJSU5JVF9MSVNUX0hFQUQoJm9hcC0+b2FwX3BlbmRpbmdfaXRlbSk7CkBAIC0yMTg2LDcgKzIxODYsNyBAQAogCS8qIFNldCB0aGUgT0JEX0JSV19TUlZMT0NLIGJlZm9yZSB0aGUgcGFnZSBpcyBxdWV1ZWQuICovCiAJYnJ3X2ZsYWdzIHw9IG9wcy0+b3BzX3NydmxvY2sgPyBPQkRfQlJXX1NSVkxPQ0sgOiAwOwogCWlmICghY2xpZW50X2lzX3JlbW90ZShvc2NfZXhwb3J0KG9zYykpICYmCi0JICAgIGNmc19jYXBhYmxlKENGU19DQVBfU1lTX1JFU09VUkNFKSkgeworCSAgICBjYXBhYmxlKENGU19DQVBfU1lTX1JFU09VUkNFKSkgewogCQlicndfZmxhZ3MgfD0gT0JEX0JSV19OT1FVT1RBOwogCQljbWQgfD0gT0JEX0JSV19OT1FVT1RBOwogCX0KQEAgLTIzOTQsNiArMjM5NCwxMiBAQAogCQkgKiByZWFsbHkgc2VuZGluZyB0aGUgUlBDLiAqLwogCWNhc2UgT0VTX1RSVU5DOgogCQkvKiByYWNlIHdpdGggdHJ1bmNhdGUsIHBhZ2Ugd2lsbCBiZSByZWRpcnRpZWQgKi8KKwljYXNlIE9FU19BQ1RJVkU6CisJCS8qIFRoZSBleHRlbnQgaXMgYWN0aXZlIHNvIHdlIG5lZWQgdG8gYWJvcnQgYW5kIGxldCB0aGUgY2FsbGVyCisJCSAqIHJlLWRpcnR5IHRoZSBwYWdlLiBJZiB3ZSBjb250aW51ZWQgb24gaGVyZSwgYW5kIHdlIHdlcmUgdGhlCisJCSAqIG9uZSBtYWtpbmcgdGhlIGV4dGVudCBhY3RpdmUsIHdlIGNvdWxkIGRlYWRsb2NrIHdhaXRpbmcgZm9yCisJCSAqIHRoZSBwYWdlIHdyaXRlYmFjayB0byBjbGVhciBidXQgaXQgd29uJ3QgYmVjYXVzZSB0aGUgZXh0ZW50CisJCSAqIGlzIGFjdGl2ZSBhbmQgd29uJ3QgYmUgd3JpdHRlbiBvdXQuICovCiAJCUdPVE8ob3V0LCByYyA9IC1FQUdBSU4pOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19pby5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19pby5jCmluZGV4IDY4MWQ2MGEuLjVmM2M1NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2lvLmMKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCSAqLwogCW9zY19wYWdlX3RvdWNoKGVudiwgY2wyb3NjX3BhZ2Uoc2xpY2UpLCB0byk7CiAJaWYgKCFjbGllbnRfaXNfcmVtb3RlKG9zY19leHBvcnQob2JqKSkgJiYKLQkgICAgY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfUkVTT1VSQ0UpKQorCSAgICBjYXBhYmxlKENGU19DQVBfU1lTX1JFU09VUkNFKSkKIAkJb2FwLT5vYXBfYnJ3X2ZsYWdzIHw9IE9CRF9CUldfTk9RVU9UQTsKIAogCWlmIChvaW8tPm9pX2xvY2tsZXNzKQpAQCAtNTEyLDE5ICs1MTIsMTUgQEAKIAlzdHJ1Y3Qgb3NjX2lvICAgICpvaW8gICA9IGNsMm9zY19pbyhlbnYsIHNsaWNlKTsKIAlzdHJ1Y3QgY2xfb2JqZWN0ICpvYmogICA9IHNsaWNlLT5jaXNfb2JqOwogCXN0cnVjdCBjbF9hdHRyICAgKmF0dHIgID0gJm9zY19lbnZfaW5mbyhlbnYpLT5vdGlfYXR0cjsKLQlpbnQJICAgICAgcmVzdWx0ID0gMDsKKwlpbnQgcmMgPSAwOwogCi0JaWYgKG9pby0+b2lfbG9ja2xlc3MgPT0gMCkgeworCWlmIChvaW8tPm9pX2xvY2tsZXNzID09IDAgJiYgIXNsaWNlLT5jaXNfaW8tPmNpX25vYXRpbWUpIHsKIAkJY2xfb2JqZWN0X2F0dHJfbG9jayhvYmopOwotCQlyZXN1bHQgPSBjbF9vYmplY3RfYXR0cl9nZXQoZW52LCBvYmosIGF0dHIpOwotCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCWF0dHItPmNhdF9hdGltZSA9IExUSU1FX1MoQ1VSUkVOVF9USU1FKTsKLQkJCXJlc3VsdCA9IGNsX29iamVjdF9hdHRyX3NldChlbnYsIG9iaiwgYXR0ciwKLQkJCQkJCSAgICBDQVRfQVRJTUUpOwotCQl9CisJCWF0dHItPmNhdF9hdGltZSA9IExUSU1FX1MoQ1VSUkVOVF9USU1FKTsKKwkJcmMgPSBjbF9vYmplY3RfYXR0cl9zZXQoZW52LCBvYmosIGF0dHIsIENBVF9BVElNRSk7CiAJCWNsX29iamVjdF9hdHRyX3VubG9jayhvYmopOwogCX0KLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBvc2NfaW9fd3JpdGVfc3RhcnQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19wYWdlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3BhZ2UuYwppbmRleCA0OTA5ZTQ4Ni4uOTZjYjZlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19wYWdlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19wYWdlLmMKQEAgLTU2MSw3ICs1NjEsNyBAQAogCW9hcC0+b2FwX2Jyd19mbGFncyA9IE9CRF9CUldfU1lOQyB8IGJyd19mbGFnczsKIAogCWlmICghY2xpZW50X2lzX3JlbW90ZShvc2NfZXhwb3J0KG9iaikpICYmCi0JCQljZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19SRVNPVVJDRSkpIHsKKwkJCWNhcGFibGUoQ0ZTX0NBUF9TWVNfUkVTT1VSQ0UpKSB7CiAJCW9hcC0+b2FwX2Jyd19mbGFncyB8PSBPQkRfQlJXX05PUVVPVEE7CiAJCW9hcC0+b2FwX2NtZCB8PSBPQkRfQlJXX05PUVVPVEE7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19xdW90YS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19xdW90YS5jCmluZGV4IDYwNDVhNzguLjAyMzVmYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcXVvdGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3F1b3RhLmMKQEAgLTUxLDExICs1MSw4IEBACiAKIAkJb3FpID0gY2ZzX2hhc2hfbG9va3VwKGNsaS0+Y2xfcXVvdGFfaGFzaFt0eXBlXSwgJnFpZFt0eXBlXSk7CiAJCWlmIChvcWkpIHsKLQkJCW9iZF91aWQgaWQgPSBvcWktPm9xaV9pZDsKLQotCQkJTEFTU0VSVEYoaWQgPT0gcWlkW3R5cGVdLAotCQkJCSAiVGhlIGlkcyBkb24ndCBtYXRjaCAldSAhPSAldVxuIiwKLQkJCQkgaWQsIHFpZFt0eXBlXSk7CisJCQkvKiBkbyBub3QgdHJ5IHRvIGFjY2VzcyBvcWkgaGVyZSwgaXQgY291bGQgaGF2ZSBiZWVuCisJCQkgKiBmcmVlZCBieSBvc2NfcXVvdGFfc2V0ZHEoKSAqLwogCiAJCQkvKiB0aGUgc2xvdCBpcyBidXN5LCB0aGUgdXNlciBpcyBhYm91dCB0byBydW4gb3V0IG9mCiAJCQkgKiBxdW90YSBzcGFjZSBvbiB0aGlzIE9TVCAqLwpAQCAtMjY4LDExICsyNjUsMTYgQEAKIAlpZiAocmMpCiAJCUNFUlJPUigicHRscnBjX3F1ZXVlX3dhaXQgZmFpbGVkLCByYzogJWRcbiIsIHJjKTsKIAotCWlmIChyZXEtPnJxX3JlcG1zZyAmJgotCSAgICAob3FjID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX09CRF9RVU9UQUNUTCkpKSB7Ci0JCSpvcWN0bCA9ICpvcWM7CisJaWYgKHJlcS0+cnFfcmVwbXNnKSB7CisJCW9xYyA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9PQkRfUVVPVEFDVEwpOworCQlpZiAob3FjKSB7CisJCQkqb3FjdGwgPSAqb3FjOworCQl9IGVsc2UgaWYgKCFyYykgeworCQkJQ0VSUk9SKCJDYW4ndCB1bnBhY2sgb2JkX3F1b3RhY3RsXG4iKTsKKwkJCXJjID0gLUVQUk9UTzsKKwkJfQogCX0gZWxzZSBpZiAoIXJjKSB7Ci0JCUNFUlJPUiAoIkNhbid0IHVucGFjayBvYmRfcXVvdGFjdGxcbiIpOworCQlDRVJST1IoIkNhbid0IHVucGFjayBvYmRfcXVvdGFjdGxcbiIpOwogCQlyYyA9IC1FUFJPVE87CiAJfQogCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9jbGllbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9jbGllbnQuYwppbmRleCBkOTBlZmU0Li40YzllMDA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvY2xpZW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2NsaWVudC5jCkBAIC00OCw2ICs0OCw3IEBACiAjaW5jbHVkZSAicHRscnBjX2ludGVybmFsLmgiCiAKIHN0YXRpYyBpbnQgcHRscnBjX3NlbmRfbmV3X3JlcShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSk7CitzdGF0aWMgaW50IHB0bHJwY2RfY2hlY2tfd29yayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSk7CiAKIC8qKgogICogSW5pdGlhbGl6ZSBwYXNzZWQgaW4gY2xpZW50IHN0cnVjdHVyZSBcYSBjbC4KQEAgLTYyLDcgKzYzLDcgQEAKIEVYUE9SVF9TWU1CT0wocHRscnBjX2luaXRfY2xpZW50KTsKIAogLyoqCi0gKiBSZXR1cm4gUG9ydGFsUlBDIGNvbm5lY3Rpb24gZm9yIHJlbW9yZSB1dWQgXGEgdXVpZAorICogUmV0dXJuIFBvcnRhbFJQQyBjb25uZWN0aW9uIGZvciByZW1vdGUgdXVkIFxhIHV1aWQKICAqLwogc3RydWN0IHB0bHJwY19jb25uZWN0aW9uICpwdGxycGNfdXVpZF90b19jb25uZWN0aW9uKHN0cnVjdCBvYmRfdXVpZCAqdXVpZCkKIHsKQEAgLTEyNyw3ICsxMjgsNyBAQAogICogUHJlcGFyZSBidWxrIGRlc2NyaXB0b3IgZm9yIHNwZWNpZmllZCBvdXRnb2luZyByZXF1ZXN0IFxhIHJlcSB0aGF0CiAgKiBjYW4gZml0IFxhIG5wYWdlcyAqIHBhZ2VzLiBcYSB0eXBlIGlzIGJ1bGsgdHlwZS4gXGEgcG9ydGFsIGlzIHdoZXJlCiAgKiB0aGUgYnVsayB0byBiZSBzZW50LiBVc2VkIG9uIGNsaWVudC1zaWRlLgotICogUmV0dXJucyBwb2ludGVyIHRvIG5ld2x5IGFsbG9jYXRyZCBpbml0aWFsaXplZCBidWxrIGRlc2NyaXB0b3Igb3IgTlVMTCBvbgorICogUmV0dXJucyBwb2ludGVyIHRvIG5ld2x5IGFsbG9jYXRlZCBpbml0aWFsaXplZCBidWxrIGRlc2NyaXB0b3Igb3IgTlVMTCBvbgogICogZXJyb3IuCiAgKi8KIHN0cnVjdCBwdGxycGNfYnVsa19kZXNjICpwdGxycGNfcHJlcF9idWxrX2ltcChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwKQEAgLTYzMSw3ICs2MzIsNyBAQAogCiAJLyogRm9yIHNvbWUgb2xkIDEuOCBjbGllbnRzICg8IDEuOC43KSwgdGhleSB3aWxsIExBU1NFUlQgdGhlIHNpemUgb2YKIAkgKiBwdGxycGNfYm9keSBzZW50IGZyb20gc2VydmVyIGVxdWFsIHRvIGxvY2FsIHB0bHJwY19ib2R5IHNpemUsIHNvIHdlCi0JICogaGF2ZSB0byBzZW5kIG9sZCBwdGxycGNfYm9keSB0byBrZWVwIGludGVyb3ByYWJpbGl0eSB3aXRoIHRoZXNlCisJICogaGF2ZSB0byBzZW5kIG9sZCBwdGxycGNfYm9keSB0byBrZWVwIGludGVyb3BlcmFiaWxpdHkgd2l0aCB0aGVzZQogCSAqIGNsaWVudHMuCiAJICoKIAkgKiBPbmx5IHRocmVlIGtpbmRzIG9mIHNlcnZlci0+Y2xpZW50IFJQQ3Mgc28gZmFyOgpAQCAtNjM5LDcgKzY0MCw3IEBACiAJICogIC0gTERMTV9DUF9DQUxMQkFDSwogCSAqICAtIExETE1fR0xfQ0FMTEJBQ0sKIAkgKgotCSAqIFhYWCBUaGlzIHNob3VsZCBiZSByZW1vdmVkIHdoZW5ldmVyIHdlIGRyb3AgdGhlIGludGVyb3ByYWJpbGl0eSB3aXRoCisJICogWFhYIFRoaXMgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbmV2ZXIgd2UgZHJvcCB0aGUgaW50ZXJvcGVyYWJpbGl0eSB3aXRoCiAJICogICAgIHRoZSB0aGVzZSBvbGQgY2xpZW50cy4KIAkgKi8KIAlpZiAob3Bjb2RlID09IExETE1fQkxfQ0FMTEJBQ0sgfHwgb3Bjb2RlID09IExETE1fQ1BfQ0FMTEJBQ0sgfHwKQEAgLTY4Niw3ICs2ODcsNyBAQAogCiAvKioKICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSByZXF1ZXN0LgotICogQ2FsbHMgX19wdGxycGNfcmVxdWVzdF9hbGxvYyB0byBhbGxvY2F0ZSBuZXcgcmVxdWVzdCBzdHVyY3R1cmUgYW5kIGluaXRzCisgKiBDYWxscyBfX3B0bHJwY19yZXF1ZXN0X2FsbG9jIHRvIGFsbG9jYXRlIG5ldyByZXF1ZXN0IHN0cnVjdHVyZSBhbmQgaW5pdHMKICAqIGJ1ZmZlciBzdHJ1Y3R1cmVzIGFjY29yZGluZyB0byBjYXBzdWxlIHRlbXBsYXRlIFxhIGZvcm1hdC4KICAqIFJldHVybnMgYWxsb2NhdGVkIHJlcXVlc3Qgc3RydWN0dXJlIHBvaW50ZXIgb3IgTlVMTCBvbiBlcnJvci4KICAqLwpAQCAtNzQzLDcgKzc0NCw3IEBACiBFWFBPUlRfU1lNQk9MKHB0bHJwY19yZXF1ZXN0X2ZyZWUpOwogCiAvKioKLSAqIEFsbG9jYXRlIG5ldyByZXF1ZXN0IGZvciBvcGVyYXRpb25lIFxhIG9wY29kZSBhbmQgaW1tZWRpYXRlbGx5IHBhY2sgaXQgZm9yCisgKiBBbGxvY2F0ZSBuZXcgcmVxdWVzdCBmb3Igb3BlcmF0aW9uIFxhIG9wY29kZSBhbmQgaW1tZWRpYXRlbHkgcGFjayBpdCBmb3IKICAqIG5ldHdvcmsgdHJhbnNmZXIuCiAgKiBPbmx5IHVzZWQgZm9yIHNpbXBsZSByZXF1ZXN0cyBsaWtlIE9CRF9QSU5HIHdoZXJlIHRoZSBvbmx5IGltcG9ydGFudAogICogcGFydCBvZiB0aGUgcmVxdWVzdCBpcyBvcGVyYXRpb24gaXRzZWxmLgpAQCAtNzY4LDcgKzc2OSw3IEBACiBFWFBPUlRfU1lNQk9MKHB0bHJwY19yZXF1ZXN0X2FsbG9jX3BhY2spOwogCiAvKioKLSAqIFByZXBhcmUgcmVxdWVzdCAoZmV0Y2hlZCBmcm9tIHBvb2wgXGEgcG9vbGlmIG5vdCBOVUxMKSBvbiBpbXBvcnQgXGEgaW1wCisgKiBQcmVwYXJlIHJlcXVlc3QgKGZldGNoZWQgZnJvbSBwb29sIFxhIHBvb2wgaWYgbm90IE5VTEwpIG9uIGltcG9ydCBcYSBpbXAKICAqIGZvciBvcGVyYXRpb24gXGEgb3Bjb2RlLiBSZXF1ZXN0IHdvdWxkIGNvbnRhaW4gXGEgY291bnQgYnVmZmVycy4KICAqIFNpemVzIG9mIGJ1ZmZlcnMgYXJlIGRlc2NyaWJlZCBpbiBhcnJheSBcYSBsZW5ndGhzIGFuZCBidWZmZXJzIHRoZW1zZWx2ZXMKICAqIGFyZSBwcm92aWRlZCBieSBhIHBvaW50ZXIgXGEgYnVmcy4KQEAgLTEwNzMsNyArMTA3NCw3IEBACiB9CiAKIC8qKgotICogRGVjaWRlIGlmIHRoZSBlcm9yIG1lc3NhZ2UgcmVnYXJkaW5nIHByb3ZpZGVkIHJlcXVlc3QgXGEgcmVxCisgKiBEZWNpZGUgaWYgdGhlIGVycm9yIG1lc3NhZ2UgcmVnYXJkaW5nIHByb3ZpZGVkIHJlcXVlc3QgXGEgcmVxCiAgKiBzaG91bGQgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSBvciBub3QuCiAgKiBNYWtlcyBpdCdzIGRlY2lzaW9uIG9uIHJlcXVlc3Qgc3RhdHVzIGFuZCBvdGhlciBwcm9wZXJ0aWVzLgogICogUmV0dXJucyAxIHRvIHByaW50IGVycm9yIG9uIHRoZSBzeXN0ZW0gY29uc29sZSBvciAwIGlmIG5vdC4KQEAgLTExNTksNyArMTE2MCw3IEBACiAvKioKICAqIENhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGNsaWVudCByZWNlaXZlcyBSUEMgcmVwbHkgZm9yIFxhIHJlcS4KICAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGVycm9yIGNvZGUuCi0gKiBUaGUgcmV0dXJuIGFsdWUgd291bGQgYmUgYXNzaWduZWQgdG8gcmVxLT5ycV9zdGF0dXMgYnkgdGhlIGNhbGxlcgorICogVGhlIHJldHVybiB2YWx1ZSB3b3VsZCBiZSBhc3NpZ25lZCB0byByZXEtPnJxX3N0YXR1cyBieSB0aGUgY2FsbGVyCiAgKiBhcyByZXF1ZXN0IHByb2Nlc3Npbmcgc3RhdHVzLgogICogVGhpcyBmdW5jdGlvbiBhbHNvIGRlY2lkZXMgaWYgdGhlIHJlcXVlc3QgbmVlZHMgdG8gYmUgc2F2ZWQgZm9yIGxhdGVyIHJlcGxheS4KICAqLwpAQCAtMTE5MCw3ICsxMTkxLDkgQEAKIAkJICogd2lsbCByb3VuZHVwIGl0ICovCiAJCXJlcS0+cnFfcmVwbGVuICAgICAgID0gcmVxLT5ycV9ub2JfcmVjZWl2ZWQ7CiAJCXJlcS0+cnFfbm9iX3JlY2VpdmVkID0gMDsKKwkJc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOwogCQlyZXEtPnJxX3Jlc2VuZCAgICAgICA9IDE7CisJCXNwaW5fdW5sb2NrKCZyZXEtPnJxX2xvY2spOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTEzMTMsNyArMTMxNiwxMSBAQAogCQkJLyoqIHZlcnNpb24gcmVjb3ZlcnkgKi8KIAkJCXB0bHJwY19zYXZlX3ZlcnNpb25zKHJlcSk7CiAJCQlwdGxycGNfcmV0YWluX3JlcGxheWFibGVfcmVxdWVzdChyZXEsIGltcCk7Ci0JCX0gZWxzZSBpZiAocmVxLT5ycV9jb21taXRfY2IgIT0gTlVMTCkgeworCQl9IGVsc2UgaWYgKHJlcS0+cnFfY29tbWl0X2NiICE9IE5VTEwgJiYKKwkJCSAgIGxpc3RfZW1wdHkoJnJlcS0+cnFfcmVwbGF5X2xpc3QpKSB7CisJCQkvKiBOQjogZG9uJ3QgY2FsbCBycV9jb21taXRfY2IgaWYgaXQncyBhbHJlYWR5IG9uCisJCQkgKiBycV9yZXBsYXlfbGlzdCwgcHRscnBjX2ZyZWVfY29tbWl0dGVkKCkgd2lsbCBjYWxsCisJCQkgKiBpdCBsYXRlciwgc2VlIExVLTM2MTggZm9yIGRldGFpbHMgKi8KIAkJCXNwaW5fdW5sb2NrKCZpbXAtPmltcF9sb2NrKTsKIAkJCXJlcS0+cnFfY29tbWl0X2NiKHJlcSk7CiAJCQlzcGluX2xvY2soJmltcC0+aW1wX2xvY2spOwpAQCAtMTQwOCw3ICsxNDE1LDkgQEAKIAkJCXJlcS0+cnFfc3RhdHVzID0gcmM7CiAJCQlyZXR1cm4gMTsKIAkJfSBlbHNlIHsKKwkJCXNwaW5fbG9jaygmcmVxLT5ycV9sb2NrKTsKIAkJCXJlcS0+cnFfd2FpdF9jdHggPSAxOworCQkJc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTE0MjMsNyArMTQzMiw5IEBACiAJcmMgPSBwdGxfc2VuZF9ycGMocmVxLCAwKTsKIAlpZiAocmMpIHsKIAkJREVCVUdfUkVRKERfSEEsIHJlcSwgInNlbmQgZmFpbGVkICglZCk7IGV4cGVjdCB0aW1lb3V0IiwgcmMpOworCQlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7CiAJCXJlcS0+cnFfbmV0X2VyciA9IDE7CisJCXNwaW5fdW5sb2NrKCZyZXEtPnJxX2xvY2spOwogCQlyZXR1cm4gcmM7CiAJfQogCXJldHVybiAwOwpAQCAtMTY4OCw2ICsxNjk5LDcgQEAKIAkJCQkJc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOwogCQkJCQlyZXEtPnJxX25ldF9lcnIgPSAxOwogCQkJCQlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKKwkJCQkJY29udGludWU7CiAJCQkJfQogCQkJCS8qIG5lZWQgdG8gcmVzZXQgdGhlIHRpbWVvdXQgKi8KIAkJCQlmb3JjZV90aW1lcl9yZWNhbGMgPSAxOwpAQCAtMTc3Myw2ICsxNzg1LDEwIEBACiAKIAkJcHRscnBjX3JlcV9pbnRlcnByZXQoZW52LCByZXEsIHJlcS0+cnFfc3RhdHVzKTsKIAorCQlpZiAocHRscnBjZF9jaGVja193b3JrKHJlcSkpIHsKKwkJCWF0b21pY19kZWMoJnNldC0+c2V0X3JlbWFpbmluZyk7CisJCQljb250aW51ZTsKKwkJfQogCQlwdGxycGNfcnFwaGFzZV9tb3ZlKHJlcSwgUlFfUEhBU0VfQ09NUExFVEUpOwogCiAJCUNERUJVRyhyZXEtPnJxX3JlcW1zZyAhPSBOVUxMID8gRF9SUENUUkFDRSA6IDAsCkBAIC0yMDMxLDcgKzIwNDcsNyBAQAogRVhQT1JUX1NZTUJPTChwdGxycGNfc2V0X25leHRfdGltZW91dCk7CiAKIC8qKgotICogU2VuZCBhbGwgdW5zZXQgcmVxdWVzdCBmcm9tIHRoZSBzZXQgYW5kIHRoZW4gd2FpdCB1bnRpbGwgYWxsCisgKiBTZW5kIGFsbCB1bnNldCByZXF1ZXN0IGZyb20gdGhlIHNldCBhbmQgdGhlbiB3YWl0IHVudGlsIGFsbAogICogcmVxdWVzdHMgaW4gdGhlIHNldCBjb21wbGV0ZSAoZWl0aGVyIGdldCBhIHJlcGx5LCB0aW1lb3V0LCBnZXQgYW4KICAqIGVycm9yIG9yIG90aGVyd2lzZSBiZSBpbnRlcnJ1cHRlZCkuCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBlcnJvciBjb2RlIG90aGVyd2lzZS4KQEAgLTIxNTYsNyArMjE3Miw3IEBACiBFWFBPUlRfU1lNQk9MKHB0bHJwY19zZXRfd2FpdCk7CiAKIC8qKgotICogSGVscGVyIGZ1Y3Rpb24gZm9yIHJlcXVlc3QgZnJlZWluZy4KKyAqIEhlbHBlciBmdW5jdGlvbiBmb3IgcmVxdWVzdCBmcmVlaW5nLgogICogQ2FsbGVkIHdoZW4gcmVxdWVzdCBjb3VudCByZWFjaGVkIHplcm8gYW5kIHJlcXVlc3QgbmVlZHMgdG8gYmUgZnJlZWQuCiAgKiBSZW1vdmVzIHJlcXVlc3QgZnJvbSBhbGwgc29ydHMgb2Ygc2VuZGluZy9yZXBsYXkgbGlzdHMgaXQgbWlnaHQgYmUgb24sCiAgKiBmcmVlcyBuZXR3b3JrIGJ1ZmZlcnMgaWYgYW55IGFyZSBwcmVzZW50LgpAQCAtMjIyMyw3ICsyMjM5LDcgQEAKIHN0YXRpYyBpbnQgX19wdGxycGNfcmVxX2ZpbmlzaGVkKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdCwgaW50IGxvY2tlZCk7CiAvKioKICAqIERyb3Agb25lIHJlcXVlc3QgcmVmZXJlbmNlLiBNdXN0IGJlIGNhbGxlZCB3aXRoIGltcG9ydCBpbXBfbG9jayBoZWxkLgotICogV2hlbiByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gemVybywgcmV1cWVzdCBpcyBmcmVlZC4KKyAqIFdoZW4gcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIHplcm8sIHJlcXVlc3QgaXMgZnJlZWQuCiAgKi8KIHZvaWQgcHRscnBjX3JlcV9maW5pc2hlZF93aXRoX2ltcF9sb2NrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdCkKIHsKQEAgLTIyMzYsNyArMjI1Miw3IEBACiAgKiBIZWxwZXIgZnVuY3Rpb24KICAqIERyb3BzIG9uZSByZWZlcmVuY2UgY291bnQgZm9yIHJlcXVlc3QgXGEgcmVxdWVzdC4KICAqIFxhIGxvY2tlZCBzZXQgaW5kaWNhdGVzIHRoYXQgY2FsbGVyIGhvbGRzIGltcG9ydCBpbXBfbG9jay4KLSAqIEZyZWVzIHRoZSByZXF1ZXN0IHdoZSByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLgorICogRnJlZXMgdGhlIHJlcXVlc3Qgd2hlbiByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLgogICovCiBzdGF0aWMgaW50IF9fcHRscnBjX3JlcV9maW5pc2hlZChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3QsIGludCBsb2NrZWQpCiB7CkBAIC0yMzYwLDE5ICsyMzc2LDUyIEBACiB9CiBFWFBPUlRfU1lNQk9MKHB0bHJwY191bnJlZ2lzdGVyX3JlcGx5KTsKIAorc3RhdGljIHZvaWQgcHRscnBjX2ZyZWVfcmVxdWVzdChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSkKK3sKKwlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7CisJcmVxLT5ycV9yZXBsYXkgPSAwOworCXNwaW5fdW5sb2NrKCZyZXEtPnJxX2xvY2spOworCisJaWYgKHJlcS0+cnFfY29tbWl0X2NiICE9IE5VTEwpCisJCXJlcS0+cnFfY29tbWl0X2NiKHJlcSk7CisJbGlzdF9kZWxfaW5pdCgmcmVxLT5ycV9yZXBsYXlfbGlzdCk7CisKKwlfX3B0bHJwY19yZXFfZmluaXNoZWQocmVxLCAxKTsKK30KKworLyoqCisgKiB0aGUgcmVxdWVzdCBpcyBjb21taXR0ZWQgYW5kIGRyb3BwZWQgZnJvbSB0aGUgcmVwbGF5IGxpc3Qgb2YgaXRzIGltcG9ydAorICovCit2b2lkIHB0bHJwY19yZXF1ZXN0X2NvbW1pdHRlZChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgaW50IGZvcmNlKQoreworCXN0cnVjdCBvYmRfaW1wb3J0CSppbXAgPSByZXEtPnJxX2ltcG9ydDsKKworCXNwaW5fbG9jaygmaW1wLT5pbXBfbG9jayk7CisJaWYgKGxpc3RfZW1wdHkoJnJlcS0+cnFfcmVwbGF5X2xpc3QpKSB7CisJCXNwaW5fdW5sb2NrKCZpbXAtPmltcF9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChmb3JjZSB8fCByZXEtPnJxX3RyYW5zbm8gPD0gaW1wLT5pbXBfcGVlcl9jb21taXR0ZWRfdHJhbnNubykKKwkJcHRscnBjX2ZyZWVfcmVxdWVzdChyZXEpOworCisJc3Bpbl91bmxvY2soJmltcC0+aW1wX2xvY2spOworfQorRVhQT1JUX1NZTUJPTChwdGxycGNfcmVxdWVzdF9jb21taXR0ZWQpOworCiAvKioKICAqIEl0ZXJhdGVzIHRocm91Z2ggcmVwbGF5X2xpc3Qgb24gaW1wb3J0IGFuZCBwcnVuZXMKICAqIGFsbCByZXF1ZXN0cyBoYXZlIHRyYW5zbm8gc21hbGxlciB0aGFuIGxhc3RfY29tbWl0dGVkIGZvciB0aGUKICAqIGltcG9ydCBhbmQgZG9uJ3QgaGF2ZSBycV9yZXBsYXkgc2V0LgotICogU2luY2UgcmVxdWVzdHMgYXJlIHNvcnRlZCBpbiB0cmFuc25vIG9yZGVyLCBzdG9wcyB3aGVuIG1lZXRpZ24gZmlyc3QKKyAqIFNpbmNlIHJlcXVlc3RzIGFyZSBzb3J0ZWQgaW4gdHJhbnNubyBvcmRlciwgc3RvcHMgd2hlbiBtZWV0aW5nIGZpcnN0CiAgKiB0cmFuc25vIGJpZ2dlciB0aGFuIGxhc3RfY29tbWl0dGVkLgogICogY2FsbGVyIG11c3QgaG9sZCBpbXAtPmltcF9sb2NrCiAgKi8KIHZvaWQgcHRscnBjX2ZyZWVfY29tbWl0dGVkKHN0cnVjdCBvYmRfaW1wb3J0ICppbXApCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wLCAqc2F2ZWQ7Ci0Jc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXE7CisJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsICpzYXZlZDsKIAlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKmxhc3RfcmVxID0gTlVMTDsgLyogdGVtcG9yYXJ5IGZpcmUgZXNjYXBlICovCisJYm9vbAkJICAgICAgIHNraXBfY29tbWl0dGVkX2xpc3QgPSB0cnVlOwogCiAJTEFTU0VSVChpbXAgIT0gTlVMTCk7CiAKQEAgLTIzODgsMTMgKzI0MzcsMTUgQEAKIAlDREVCVUcoRF9SUENUUkFDRSwgIiVzOiBjb21taXR0aW5nIGZvciBsYXN0X2NvbW1pdHRlZCAiTFBVNjQiIGdlbiAlZFxuIiwKIAkgICAgICAgaW1wLT5pbXBfb2JkLT5vYmRfbmFtZSwgaW1wLT5pbXBfcGVlcl9jb21taXR0ZWRfdHJhbnNubywKIAkgICAgICAgaW1wLT5pbXBfZ2VuZXJhdGlvbik7CisKKwlpZiAoaW1wLT5pbXBfZ2VuZXJhdGlvbiAhPSBpbXAtPmltcF9sYXN0X2dlbmVyYXRpb25fY2hlY2tlZCkKKwkJc2tpcF9jb21taXR0ZWRfbGlzdCA9IGZhbHNlOworCiAJaW1wLT5pbXBfbGFzdF90cmFuc25vX2NoZWNrZWQgPSBpbXAtPmltcF9wZWVyX2NvbW1pdHRlZF90cmFuc25vOwogCWltcC0+aW1wX2xhc3RfZ2VuZXJhdGlvbl9jaGVja2VkID0gaW1wLT5pbXBfZ2VuZXJhdGlvbjsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZSh0bXAsIHNhdmVkLCAmaW1wLT5pbXBfcmVwbGF5X2xpc3QpIHsKLQkJcmVxID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCwKLQkJCQkgICAgIHJxX3JlcGxheV9saXN0KTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHNhdmVkLCAmaW1wLT5pbXBfcmVwbGF5X2xpc3QsCisJCQkJIHJxX3JlcGxheV9saXN0KSB7CiAJCS8qIFhYWCBvayB0byByZW1vdmUgd2hlbiAxMzU3IHJlc29sdmVkIC0gcnJlYWQgMDUvMjkvMDMgICovCiAJCUxBU1NFUlQocmVxICE9IGxhc3RfcmVxKTsKIAkJbGFzdF9yZXEgPSByZXE7CkBAIC0yNDA4LDI3ICsyNDU5LDM0IEBACiAJCQlHT1RPKGZyZWVfcmVxLCAwKTsKIAkJfQogCi0JCWlmIChyZXEtPnJxX3JlcGxheSkgewotCQkJREVCVUdfUkVRKERfUlBDVFJBQ0UsIHJlcSwgImtlZXBpbmcgKEZMX1JFUExBWSkiKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KIAkJLyogbm90IHlldCBjb21taXR0ZWQgKi8KIAkJaWYgKHJlcS0+cnFfdHJhbnNubyA+IGltcC0+aW1wX3BlZXJfY29tbWl0dGVkX3RyYW5zbm8pIHsKIAkJCURFQlVHX1JFUShEX1JQQ1RSQUNFLCByZXEsICJzdG9wcGluZyBzZWFyY2giKTsKIAkJCWJyZWFrOwogCQl9CiAKKwkJaWYgKHJlcS0+cnFfcmVwbGF5KSB7CisJCQlERUJVR19SRVEoRF9SUENUUkFDRSwgcmVxLCAia2VlcGluZyAoRkxfUkVQTEFZKSIpOworCQkJbGlzdF9tb3ZlX3RhaWwoJnJlcS0+cnFfcmVwbGF5X2xpc3QsCisJCQkJICAgICAgICZpbXAtPmltcF9jb21taXR0ZWRfbGlzdCk7CisJCQljb250aW51ZTsKKwkJfQorCiAJCURFQlVHX1JFUShEX0lORk8sIHJlcSwgImNvbW1pdCAobGFzdF9jb21taXR0ZWQgIkxQVTY0IikiLAogCQkJICBpbXAtPmltcF9wZWVyX2NvbW1pdHRlZF90cmFuc25vKTsKIGZyZWVfcmVxOgotCQlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7Ci0JCXJlcS0+cnFfcmVwbGF5ID0gMDsKLQkJc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7Ci0JCWlmIChyZXEtPnJxX2NvbW1pdF9jYiAhPSBOVUxMKQotCQkJcmVxLT5ycV9jb21taXRfY2IocmVxKTsKLQkJbGlzdF9kZWxfaW5pdCgmcmVxLT5ycV9yZXBsYXlfbGlzdCk7Ci0JCV9fcHRscnBjX3JlcV9maW5pc2hlZChyZXEsIDEpOworCQlwdGxycGNfZnJlZV9yZXF1ZXN0KHJlcSk7CisJfQorCWlmIChza2lwX2NvbW1pdHRlZF9saXN0KQorCQlyZXR1cm47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCBzYXZlZCwgJmltcC0+aW1wX2NvbW1pdHRlZF9saXN0LAorCQkJCSBycV9yZXBsYXlfbGlzdCkgeworCQlMQVNTRVJUKHJlcS0+cnFfdHJhbnNubyAhPSAwKTsKKwkJaWYgKHJlcS0+cnFfaW1wb3J0X2dlbmVyYXRpb24gPCBpbXAtPmltcF9nZW5lcmF0aW9uKSB7CisJCQlERUJVR19SRVEoRF9SUENUUkFDRSwgcmVxLCAiZnJlZSBzdGFsZSBvcGVuIHJlcXVlc3QiKTsKKwkJCXB0bHJwY19mcmVlX3JlcXVlc3QocmVxKTsKKwkJfQogCX0KIH0KIApAQCAtMjU4NSw3ICsyNjQzLDcgQEAKIAogLyoqCiAgKiBDYWxsYmFjayB1c2VkIGZvciByZXBsYXllZCByZXF1ZXN0cyByZXBseSBwcm9jZXNzaW5nLgotICogSW4gY2FzZSBvZiBzdWNjZXNmdWwgcmVwbHkgY2FsbHMgcmVnaXN0ZXJlc2QgcmVxdWVzdCByZXBsYXkgY2FsbGJhY2suCisgKiBJbiBjYXNlIG9mIHN1Y2Nlc3NmdWwgcmVwbHkgY2FsbHMgcmVnaXN0ZXJlZCByZXF1ZXN0IHJlcGxheSBjYWxsYmFjay4KICAqIEluIGNhc2Ugb2YgZXJyb3IgcmVzdGFydCByZXBsYXkgcHJvY2Vzcy4KICAqLwogc3RhdGljIGludCBwdGxycGNfcmVwbGF5X2ludGVycHJldChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCkBAIC0yODM0LDcgKzI4OTIsNyBAQAogCQlwdGxycGNfbGFzdF94aWQgPSAoX191NjQpbm93IDw8IDIwOwogCX0KIAotCS8qIE5lZWQgdG8gYWx3YXlzIGJlIGFsaWduZWQgdG8gYSBwb3dlci1vZi10d28gZm9yIG11dGxpLWJ1bGsgQlJXICovCisJLyogQWx3YXlzIG5lZWQgdG8gYmUgYWxpZ25lZCB0byBhIHBvd2VyLW9mLXR3byBmb3IgbXVsdGktYnVsayBCUlcgKi8KIAlDTEFTU0VSVCgoUFRMUlBDX0JVTEtfT1BTX0NPVU5UICYgKFBUTFJQQ19CVUxLX09QU19DT1VOVCAtIDEpKSA9PSAwKTsKIAlwdGxycGNfbGFzdF94aWQgJj0gUFRMUlBDX0JVTEtfT1BTX01BU0s7CiB9CkBAIC0yOTA0LDIyICsyOTYyLDUwIEBACiAgKiAgICBoYXZlIGRlbGF5IGJlZm9yZSBpdCByZWFsbHkgcnVucyBieSBwdGxycGNkIHRocmVhZC4KICAqLwogc3RydWN0IHB0bHJwY193b3JrX2FzeW5jX2FyZ3MgewotCV9fdTY0ICAgbWFnaWM7CiAJaW50ICAgKCpjYikoY29uc3Qgc3RydWN0IGx1X2VudiAqLCB2b2lkICopOwogCXZvaWQgICAqY2JkYXRhOwogfTsKIAotI2RlZmluZSBQVExSUENfV09SS19NQUdJQyAweDY2NTU0MzZiNjc2ZjRmNDRVTEwgLyogbWFnaWMgY29kZSAqLworc3RhdGljIHZvaWQgcHRscnBjZF9hZGRfd29ya19yZXEoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpCit7CisJLyogcmUtaW5pdGlhbGl6ZSB0aGUgcmVxICovCisJcmVxLT5ycV90aW1lb3V0CQk9IG9iZF90aW1lb3V0OworCXJlcS0+cnFfc2VudAkJPSBjZnNfdGltZV9jdXJyZW50X3NlYygpOworCXJlcS0+cnFfZGVhZGxpbmUJPSByZXEtPnJxX3NlbnQgKyByZXEtPnJxX3RpbWVvdXQ7CisJcmVxLT5ycV9yZXBseV9kZWFkbGluZQk9IHJlcS0+cnFfZGVhZGxpbmU7CisJcmVxLT5ycV9waGFzZQkJPSBSUV9QSEFTRV9JTlRFUlBSRVQ7CisJcmVxLT5ycV9uZXh0X3BoYXNlCT0gUlFfUEhBU0VfQ09NUExFVEU7CisJcmVxLT5ycV94aWQJCT0gcHRscnBjX25leHRfeGlkKCk7CisJcmVxLT5ycV9pbXBvcnRfZ2VuZXJhdGlvbiA9IHJlcS0+cnFfaW1wb3J0LT5pbXBfZ2VuZXJhdGlvbjsKKworCXB0bHJwY2RfYWRkX3JlcShyZXEsIFBETF9QT0xJQ1lfUk9VTkQsIC0xKTsKK30KIAogc3RhdGljIGludCB3b3JrX2ludGVycHJldGVyKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKIAkJCSAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgdm9pZCAqZGF0YSwgaW50IHJjKQogewogCXN0cnVjdCBwdGxycGNfd29ya19hc3luY19hcmdzICphcmcgPSBkYXRhOwogCi0JTEFTU0VSVChhcmctPm1hZ2ljID09IFBUTFJQQ19XT1JLX01BR0lDKTsKKwlMQVNTRVJUKHB0bHJwY2RfY2hlY2tfd29yayhyZXEpKTsKIAlMQVNTRVJUKGFyZy0+Y2IgIT0gTlVMTCk7CiAKLQlyZXR1cm4gYXJnLT5jYihlbnYsIGFyZy0+Y2JkYXRhKTsKKwlyYyA9IGFyZy0+Y2IoZW52LCBhcmctPmNiZGF0YSk7CisKKwlsaXN0X2RlbF9pbml0KCZyZXEtPnJxX3NldF9jaGFpbik7CisJcmVxLT5ycV9zZXQgPSBOVUxMOworCisJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZyZXEtPnJxX3JlZmNvdW50KSA+IDEpIHsKKwkJYXRvbWljX3NldCgmcmVxLT5ycV9yZWZjb3VudCwgMik7CisJCXB0bHJwY2RfYWRkX3dvcmtfcmVxKHJlcSk7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3b3JrZXJfZm9ybWF0OworCitzdGF0aWMgaW50IHB0bHJwY2RfY2hlY2tfd29yayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSkKK3sKKwlyZXR1cm4gcmVxLT5ycV9waWxsLnJjX2ZtdCA9PSAodm9pZCAqKSZ3b3JrZXJfZm9ybWF0OwogfQogCiAvKioKQEAgLTI5NTIsNiArMzAzOCw3IEBACiAJcmVxLT5ycV9yZWNlaXZpbmdfcmVwbHkgPSAwOwogCXJlcS0+cnFfbXVzdF91bmxpbmsgPSAwOwogCXJlcS0+cnFfbm9fZGVsYXkgPSByZXEtPnJxX25vX3Jlc2VuZCA9IDE7CisJcmVxLT5ycV9waWxsLnJjX2ZtdCA9ICh2b2lkICopJndvcmtlcl9mb3JtYXQ7CiAKIAlzcGluX2xvY2tfaW5pdCgmcmVxLT5ycV9sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmcmVxLT5ycV9saXN0KTsKQEAgLTI5NjUsNyArMzA1Miw2IEBACiAKIAlDTEFTU0VSVChzaXplb2YoKmFyZ3MpIDw9IHNpemVvZihyZXEtPnJxX2FzeW5jX2FyZ3MpKTsKIAlhcmdzID0gcHRscnBjX3JlcV9hc3luY19hcmdzKHJlcSk7Ci0JYXJncy0+bWFnaWMgID0gUFRMUlBDX1dPUktfTUFHSUM7CiAJYXJncy0+Y2IgICAgID0gY2I7CiAJYXJncy0+Y2JkYXRhID0gY2JkYXRhOwogCkBAIC0yOTk1LDI1ICszMDgxLDggQEAKIAkgKiByZXEgYXMgb3BhcXVlIGRhdGEuIC0gSmluc2hhbgogCSAqLwogCUxBU1NFUlQoYXRvbWljX3JlYWQoJnJlcS0+cnFfcmVmY291bnQpID4gMCk7Ci0JaWYgKGF0b21pY19yZWFkKCZyZXEtPnJxX3JlZmNvdW50KSA+IDEpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlpZiAoYXRvbWljX2luY19yZXR1cm4oJnJlcS0+cnFfcmVmY291bnQpID4gMikgeyAvKiByYWNlICovCi0JCWF0b21pY19kZWMoJnJlcS0+cnFfcmVmY291bnQpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCS8qIHJlLWluaXRpYWxpemUgdGhlIHJlcSAqLwotCXJlcS0+cnFfdGltZW91dAk9IG9iZF90aW1lb3V0OwotCXJlcS0+cnFfc2VudAkgICA9IGNmc190aW1lX2N1cnJlbnRfc2VjKCk7Ci0JcmVxLT5ycV9kZWFkbGluZSAgICAgICA9IHJlcS0+cnFfc2VudCArIHJlcS0+cnFfdGltZW91dDsKLQlyZXEtPnJxX3JlcGx5X2RlYWRsaW5lID0gcmVxLT5ycV9kZWFkbGluZTsKLQlyZXEtPnJxX3BoYXNlCSAgPSBSUV9QSEFTRV9JTlRFUlBSRVQ7Ci0JcmVxLT5ycV9uZXh0X3BoYXNlICAgICA9IFJRX1BIQVNFX0NPTVBMRVRFOwotCXJlcS0+cnFfeGlkCSAgICA9IHB0bHJwY19uZXh0X3hpZCgpOwotCXJlcS0+cnFfaW1wb3J0X2dlbmVyYXRpb24gPSByZXEtPnJxX2ltcG9ydC0+aW1wX2dlbmVyYXRpb247Ci0KLQlwdGxycGNkX2FkZF9yZXEocmVxLCBQRExfUE9MSUNZX1JPVU5ELCAtMSk7CisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZyZXEtPnJxX3JlZmNvdW50KSA9PSAyKQorCQlwdGxycGNkX2FkZF93b3JrX3JlcShyZXEpOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChwdGxycGNkX3F1ZXVlX3dvcmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2V2ZW50cy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2V2ZW50cy5jCmluZGV4IGY2NmNmZWEuLjZlYTBhNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9ldmVudHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZXZlbnRzLmMKQEAgLTU0NSw3ICs1NDUsNyBAQAogCSAqIGRpZmZlcmVudCBkZXBlbmRpbmcgb24uLi4gKi8KIAkvKiBrZXJuZWwgTE5ldCBjYWxscyBvdXIgbWFzdGVyIGNhbGxiYWNrIHdoZW4gdGhlcmUgYXJlIG5ldyBldmVudCwKIAkgKiBiZWNhdXNlIHdlIGFyZSBndWFyYW50ZWVkIHRvIGdldCBldmVyeSBldmVudCB2aWEgY2FsbGJhY2ssCi0JICogc28gd2UganVzdCBzZXQgRVEgc2l6ZSB0byAwIHRvIGF2b2lkIG92ZXJocmVhZCBvZiBzZXJpYWxpemluZworCSAqIHNvIHdlIGp1c3Qgc2V0IEVRIHNpemUgdG8gMCB0byBhdm9pZCBvdmVyaGVhZCBvZiBzZXJpYWxpemluZwogCSAqIGVucXVldWUvZGVxdWV1ZSBvcGVyYXRpb25zIGluIExOZXQuICovCiAJcmMgPSBMTmV0RVFBbGxvYygwLCBwdGxycGNfbWFzdGVyX2NhbGxiYWNrLCAmcHRscnBjX2VxX2gpOwogCWlmIChyYyA9PSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3NfY2xpX3VwY2FsbC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3NfY2xpX3VwY2FsbC5jCmluZGV4IDU1MjQ3YWYuLmMyNzllZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX2NsaV91cGNhbGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19jbGlfdXBjYWxsLmMKQEAgLTMzNiw3ICszMzYsNyBAQAogCWlmIChyYykgewogCQkvKiBJZiBhbnkgX3JlYWxfIGRlbmlhbCBiZSBtYWRlLCB3ZSBleHBlY3Qgc2VydmVyIHJldHVybgogCQkgKiAtRUFDQ0VTIHJlcGx5IG9yIHJldHVybiBzdWNjZXNzIGJ1dCBpbmRpY2F0ZSBnc3MgZXJyb3IKLQkJICogaW5zaWRlIHJlcGx5IG1lc3NzYWdlLiBBbGwgb3RoZXIgZXJyb3JzIGFyZSB0cmVhdGVkIGFzCisJCSAqIGluc2lkZSByZXBseSBtZXNzYWdlLiBBbGwgb3RoZXIgZXJyb3JzIGFyZSB0cmVhdGVkIGFzCiAJCSAqIHRpbWVvdXQsIGNhbGxlciBtaWdodCB0cnkgdGhlIG5lZ290aWF0aW9uIHJlcGVhdGVkbHksCiAJCSAqIGxlYXZlIHJlY292ZXJ5IGRlY2lzaW9ucyB0byBnZW5lcmFsIHB0bHJwYyBsYXllci4KIAkJICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX2dlbmVyaWNfdG9rZW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX2dlbmVyaWNfdG9rZW4uYwppbmRleCA1NmMyODI4Li44ZGM1YzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19nZW5lcmljX3Rva2VuLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3NfZ2VuZXJpY190b2tlbi5jCkBAIC0xNDQsNyArMTQ0LDggQEAKIAlzZiA9ICooKmJ1ZikrKzsKIAkoKmJ1ZnNpemUpLS07CiAJaWYgKHNmICYgMHg4MCkgewotCQlpZiAoKHNmICY9IDB4N2YpID4gKCgqYnVmc2l6ZSkgLSAxKSkKKwkJc2YgJj0gMHg3ZjsKKwkJaWYgKCgoKmJ1ZnNpemUpIC0gMSkgPCBzZikKIAkJCXJldHVybiAtMTsKIAkJaWYgKHNmID4gU0laRU9GX0lOVCkKIAkJCXJldHVybiAtMTsKQEAgLTE5OSwyNyArMjAwLDMyIEBACiAJcmF3b2JqX3QgdG9pZDsKIAlpbnQgcmV0ID0gMDsKIAotCWlmICgodG9rc2l6ZSAtPSAxKSA8IDApCisJdG9rc2l6ZSAtPSAxOworCWlmICgwID4gdG9rc2l6ZSkKIAkJcmV0dXJuIChHX0JBRF9UT0tfSEVBREVSKTsKIAlpZiAoKmJ1ZisrICE9IDB4NjApCiAJCXJldHVybiAoR19CQURfVE9LX0hFQURFUik7CiAKLQlpZiAoKHNlcXNpemUgPSBkZXJfcmVhZF9sZW5ndGgoJmJ1ZiwgJnRva3NpemUpKSA8IDApCisJc2Vxc2l6ZSA9IGRlcl9yZWFkX2xlbmd0aCgmYnVmLCAmdG9rc2l6ZSk7CisJaWYgKHNlcXNpemUgPCAwKQogCQlyZXR1cm4oR19CQURfVE9LX0hFQURFUik7CiAKIAlpZiAoc2Vxc2l6ZSAhPSB0b2tzaXplKQogCQlyZXR1cm4gKEdfQkFEX1RPS19IRUFERVIpOwogCi0JaWYgKCh0b2tzaXplIC09IDEpIDwgMCkKKwl0b2tzaXplIC09IDE7CisJaWYgKDAgPiB0b2tzaXplKQogCQlyZXR1cm4gKEdfQkFEX1RPS19IRUFERVIpOwogCWlmICgqYnVmKysgIT0gMHgwNikKIAkJcmV0dXJuIChHX0JBRF9UT0tfSEVBREVSKTsKIAotCWlmICgodG9rc2l6ZSAtPSAxKSA8IDApCisJdG9rc2l6ZSAtPSAxOworCWlmICgwID4gdG9rc2l6ZSkKIAkJcmV0dXJuIChHX0JBRF9UT0tfSEVBREVSKTsKIAl0b2lkLmxlbiA9ICpidWYrKzsKIAotCWlmICgodG9rc2l6ZSAtPSB0b2lkLmxlbikgPCAwKQorCXRva3NpemUgLT0gdG9pZC5sZW47CisJaWYgKDAgPiB0b2tzaXplKQogCQlyZXR1cm4gKEdfQkFEX1RPS19IRUFERVIpOwogCXRvaWQuZGF0YSA9IGJ1ZjsKIAlidWYgKz0gdG9pZC5sZW47CkBAIC0yMzEsNyArMjM3LDggQEAKIAkgKiBpbXBvcnRhbnQgdG8gcmV0dXJuIEdfQkFEX1RPS19IRUFERVIgaWYgdGhlIHRva2VuIGhlYWRlciBpcwogCSAqIGluIGZhY3QgYmFkCiAJICovCi0JaWYgKCh0b2tzaXplIC09IDIpIDwgMCkKKwl0b2tzaXplIC09IDI7CisJaWYgKDAgPiB0b2tzaXplKQogCQlyZXR1cm4gKEdfQkFEX1RPS19IRUFERVIpOwogCiAJaWYgKHJldCkKQEAgLTI1NiwyNCArMjYzLDI5IEBACiAJaW50IHJldCA9IDA7CiAJaW50IHNlcXNpemU7CiAKLQlpZiAoKGxlbiAtPSAxKSA8IDApCisJbGVuIC09IDE7CisJaWYgKDAgPiBsZW4pCiAJCXJldHVybiAoR19CQURfVE9LX0hFQURFUik7CiAJaWYgKCpidWYrKyAhPSAweDYwKQogCQlyZXR1cm4gKEdfQkFEX1RPS19IRUFERVIpOwogCi0JaWYgKChzZXFzaXplID0gZGVyX3JlYWRfbGVuZ3RoKCZidWYsICZsZW4pKSA8IDApCisJc2Vxc2l6ZSA9IGRlcl9yZWFkX2xlbmd0aCgmYnVmLCAmbGVuKTsKKwlpZiAoc2Vxc2l6ZSA8IDApCiAJCXJldHVybiAoR19CQURfVE9LX0hFQURFUik7CiAKLQlpZiAoKGxlbiAtPSAxKSA8IDApCisJbGVuIC09IDE7CisJaWYgKDAgPiBsZW4pCiAJCXJldHVybiAoR19CQURfVE9LX0hFQURFUik7CiAJaWYgKCpidWYrKyAhPSAweDA2KQogCQlyZXR1cm4gKEdfQkFEX1RPS19IRUFERVIpOwogCi0JaWYgKChsZW4gLT0gMSkgPCAwKQorCWxlbiAtPSAxOworCWlmICgwID4gbGVuKQogCQlyZXR1cm4gKEdfQkFEX1RPS19IRUFERVIpOwogCW1lY2gtPmxlbiA9ICpidWYrKzsKIAotCWlmICgobGVuIC09IG1lY2gtPmxlbikgPCAwKQorCWxlbiAtPSBtZWNoLT5sZW47CisJaWYgKDAgPiBsZW4pCiAJCXJldHVybiAoR19CQURfVE9LX0hFQURFUik7CiAJT0JEX0FMTE9DX0xBUkdFKG1lY2gtPmRhdGEsIG1lY2gtPmxlbik7CiAJaWYgKCFtZWNoLT5kYXRhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3Nfa2V5cmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3Nfa2V5cmluZy5jCmluZGV4IGQ0M2ExM2MuLjQ2NDJiYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX2tleXJpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19rZXlyaW5nLmMKQEAgLTExNzYsNyArMTE3Niw3IEBACiAKIC8qCiAgKiBjYWxsZWQgd2l0aCBrZXkgc2VtYXBob3JlIHdyaXRlIGxvY2tlZC4gaXQgbWVhbnMgd2UgY2FuIG9wZXJhdGUKLSAqIG9uIHRoZSBjb250ZXh0IHdpdGhvdXQgZmVhciBvZiBsb29zaW5nIHJlZmNvdW50LgorICogb24gdGhlIGNvbnRleHQgd2l0aG91dCBmZWFyIG9mIGxvc2luZyByZWZjb3VudC4KICAqLwogc3RhdGljCiBpbnQgZ3NzX2t0X3VwZGF0ZShzdHJ1Y3Qga2V5ICprZXksIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3Nfa3JiNV9tZWNoLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19rcmI1X21lY2guYwppbmRleCBiOWZhM2I0Li5kMDNmNmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19rcmI1X21lY2guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19rcmI1X21lY2guYwpAQCAtNTQsNyArNTQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogCiAjaW5jbHVkZSA8b2JkLmg+CiAjaW5jbHVkZSA8b2JkX2NsYXNzLmg+CkBAIC02NzksNyArNjc4LDggQEAKIAlfX3UzMgkJICBjb2RlID0gR1NTX1NfRkFJTFVSRTsKIAlpbnQJCSAgICByYzsKIAotCWlmICghKHRmbSA9IGxsX2NyeXB0b19hbGxvY19oYXNoKGtlLT5rZV9oYXNoX25hbWUsIDAsIDApKSkgeworCXRmbSA9IGxsX2NyeXB0b19hbGxvY19oYXNoKGtlLT5rZV9oYXNoX25hbWUsIDAsIDApOworCWlmICghdGZtKSB7CiAJCUNFUlJPUigiZmFpbGVkIHRvIGFsbG9jIFRGTTogJXNcbiIsIGtlLT5rZV9oYXNoX25hbWUpOwogCQlyZXR1cm4gR1NTX1NfRkFJTFVSRTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19waXBlZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX3BpcGVmcy5jCmluZGV4IGM2MjQ1MTguLjdhMWZmNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX3BpcGVmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX3BpcGVmcy5jCkBAIC04NSw3ICs4NSw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBpbnRlcm5lbCBjb250ZXh0IGhlbHBlcnMJICAgICAqCisgKiBpbnRlcm5hbCBjb250ZXh0IGhlbHBlcnMJICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljCkBAIC02NTIsNyArNjUyLDcgQEAKIAogLyogcGlwZWZzIGRlbnRyaWVzIGZvciBlYWNoIG1lY2hhbmlzbXMgKi8KIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZV9waXBlc1tNRUNIX01BWF0gPSB7IE5VTEwsIH07Ci0vKiBhbGwgdXBjYWxsIG1lc3NnYWVzIGxpbmtlZCBoZXJlICovCisvKiBhbGwgdXBjYWxsIG1lc3NhZ2VzIGxpbmtlZCBoZXJlICovCiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCB1cGNhbGxfbGlzdHNbTUVDSF9NQVhdOwogLyogYW5kIHByb3RlY3RlZCBieSB0aGlzICovCiBzdGF0aWMgc3BpbmxvY2tfdCB1cGNhbGxfbG9ja3NbTUVDSF9NQVhdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3Nfc3ZjX3VwY2FsbC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3Nfc3ZjX3VwY2FsbC5jCmluZGV4IDViNTM2NWIuLjM1OWM0OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX3N2Y191cGNhbGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19zdmNfdXBjYWxsLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCQlsZW4rKzsKIAogCQlpZiAoKGxlbiAmIChCSVRTX1BFUl9MT05HLzgtMSkpID09IDApCi0JCQloYXNoID0gY2ZzX2hhc2hfbG9uZyhoYXNoXmwsIEJJVFNfUEVSX0xPTkcpOworCQkJaGFzaCA9IGhhc2hfbG9uZyhoYXNoXmwsIEJJVFNfUEVSX0xPTkcpOwogCX0gd2hpbGUgKGxlbik7CiAKIAlyZXR1cm4gaGFzaCA+PiAoQklUU19QRVJfTE9ORyAtIGJpdHMpOwpAQCAtNTg2LDcgKzU4Niw3IEBACiAJCQlnb3RvIG91dDsKIAogCQkvKiBjdXJyZW50bHkgdGhlIGV4cGlyeSB0aW1lIHBhc3NlZCBkb3duIGZyb20gdXNlci1zcGFjZQotCQkgKiBpcyBpbnZhbGlkLCBoZXJlIHdlIHJldHJpdmUgaXQgZnJvbSBtZWNoLiAqLworCQkgKiBpcyBpbnZhbGlkLCBoZXJlIHdlIHJldHJpZXZlIGl0IGZyb20gbWVjaC4gKi8KIAkJaWYgKGxnc3NfaW5xdWlyZV9jb250ZXh0KHJzY2kuY3R4LmdzY19tZWNoY3R4LCAmY3R4X2V4cGlyeSkpIHsKIAkJCUNFUlJPUigidW5hYmxlIHRvIGdldCBleHBpcmUgdGltZSwgZHJvcCBpdFxuIik7CiAJCQlnb3RvIG91dDsKQEAgLTg4MCw3ICs4ODAsNyBAQAogCiAJY2FjaGVfZ2V0KCZyc2lwLT5oKTsgLyogdGFrZSBhbiBleHRyYSByZWYgKi8KIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyc2lwLT53YWl0cSk7Ci0JaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCgmd2FpdCk7CisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCWFkZF93YWl0X3F1ZXVlKCZyc2lwLT53YWl0cSwgJndhaXQpOwogCiBjYWNoZV9jaGVjazoKQEAgLTEwNjcsNyArMTA2Nyw3IEBACiAJICogdGhlIGluaXQgdXBjYWxsIGNoYW5uZWwsIG90aGVyd2lzZSB0aGVyZSdzIGJpZyBjaGFuY2UgdGhhdCB0aGUgZmlyc3QKIAkgKiB1cGNhbGwgaXNzdWVkIGJlZm9yZSB0aGUgY2hhbm5lbCBiZSBvcGVuZWQgdGh1cyBuZnN2NCBjYWNoZSBjb2RlIHdpbGwKIAkgKiBkcm9wIHRoZSByZXF1ZXN0IGRpcmVjbHR5LCB0aHVzIGxlYWQgdG8gdW5uZWNlc3NhcnkgcmVjb3ZlcnkgdGltZS4KLQkgKiBoZXJlIHdlIHdhaXQgYXQgbWl4aW11bSAxLjUgc2Vjb25kcy4gKi8KKwkgKiBoZXJlIHdlIHdhaXQgYXQgbWF4aW11bSAxLjUgc2Vjb25kcy4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CiAJCWlmIChhdG9taWNfcmVhZCgmcnNpX2NhY2hlLnJlYWRlcnMpID4gMCkKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9zZWNfZ3NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL3NlY19nc3MuYwppbmRleCA4Y2U2MjcxLi4zODM2MDFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL3NlY19nc3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL3NlY19nc3MuYwpAQCAtMzgyLDcgKzM4Miw3IEBACiAJLyogQXQgdGhpcyBwb2ludCB0aGlzIGN0eCBtaWdodCBoYXZlIGJlZW4gbWFya2VkIGFzIGRlYWQgYnkKIAkgKiBzb21lb25lIGVsc2UsIGluIHdoaWNoIGNhc2Ugbm9ib2R5IHdpbGwgbWFrZSBmdXJ0aGVyIHVzZQogCSAqIG9mIGl0LiB3ZSBkb24ndCBjYXJlLCBhbmQgbWFyayBpdCBVUFRPREFURSB3aWxsIGhlbHAKLQkgKiBkZXN0cm95aW5nIHNlcnZlciBzaWRlIGNvbnRleHQgd2hlbiBpdCBiZSBkZXN0cm9pZWQuICovCisJICogZGVzdHJveWluZyBzZXJ2ZXIgc2lkZSBjb250ZXh0IHdoZW4gaXQgYmUgZGVzdHJveWVkLiAqLwogCXNldF9iaXQoUFRMUlBDX0NUWF9VUFRPREFURV9CSVQsICZjdHgtPmNjX2ZsYWdzKTsKIAogCWlmIChzZWNfaXNfcmV2ZXJzZShjdHgtPmNjX3NlYykpIHsKQEAgLTY3Niw3ICs2NzYsNyBAQAogCSAqIGxlYWQgdG8gdGhlIHNlcXVlbmNlIG51bWJlciBmYWxsIGJlaGluZCB0aGUgd2luZG93IG9uIHNlcnZlciBhbmQKIAkgKiBiZSBkcm9wcGVkLiBhbHNvIGFwcGxpZXMgdG8gZ3NzX2NsaV9jdHhfc2VhbCgpLgogCSAqCi0JICogTm90ZTogbnVsbCBtb2RlIGRvc2VuJ3QgY2hlY2sgc2VxdWVuY2UgbnVtYmVyLiAqLworCSAqIE5vdGU6IG51bGwgbW9kZSBkb2Vzbid0IGNoZWNrIHNlcXVlbmNlIG51bWJlci4gKi8KIAlpZiAoc3ZjICE9IFNQVExSUENfU1ZDX05VTEwgJiYKIAkgICAgYXRvbWljX3JlYWQoJmdjdHgtPmdjX3NlcSkgLSBzZXEgPiBHU1NfU0VRX1JFUEFDS19USFJFU0hPTEQpIHsKIAkJaW50IGJlaGluZCA9IGF0b21pY19yZWFkKCZnY3R4LT5nY19zZXEpIC0gc2VxOwpAQCAtMTIxNSw3ICsxMjE1LDcgQEAKIAkvKgogCSAqIHJlbW92ZSBVUFRPREFURSBmbGFnIG9mIHJldmVyc2UgY3R4IHRodXMgd2Ugd29uJ3Qgc2VuZCBmaW5pIHJwYywKIAkgKiB0aGlzIGlzIHRvIGF2b2lkIHBvdGVudGlhbCBwcm9ibGVtcyBvZiBjbGllbnQgc2lkZSByZXZlcnNlIHN2YyBjdHgKLQkgKiBiZSBtaXMtZGVzdHJveWVkIGluIHZhcmlvdXMgcmVjb3Zlcnkgc2VuYXJpb3MuIGFueXdheSBjbGllbnQgY2FuCisJICogYmUgbWlzLWRlc3Ryb3llZCBpbiB2YXJpb3VzIHJlY292ZXJ5IHNjZW5hcmlvcy4gYW55d2F5IGNsaWVudCBjYW4KIAkgKiBtYW5hZ2UgaXRzIHJldmVyc2UgY3R4IHdlbGwgYnkgYXNzb2NpYXRpbmcgaXQgd2l0aCBpdHMgYnVkZHkgY3R4LgogCSAqLwogCWlmIChzZWNfaXNfcmV2ZXJzZShzZWMpKQpAQCAtMTg4Miw3ICsxODgyLDcgQEAKIAogCUxBU1NFUlQocnMtPnJzX21zZyA9PSBsdXN0cmVfbXNnX2J1Zihycy0+cnNfcmVwYnVmLCAxLCAwKSk7CiAKLQkvKiBlbWJlZGRlZCBsdXN0cmVfbXNnIG1pZ2h0IGhhdmUgYmVlbiBzaHJpbmtlZCAqLworCS8qIGVtYmVkZGVkIGx1c3RyZV9tc2cgbWlnaHQgaGF2ZSBiZWVuIHNocnVuayAqLwogCWlmIChyZXEtPnJxX3JlcGxlbiAhPSBycy0+cnNfcmVwYnVmLT5sbV9idWZsZW5zWzFdKQogCQlsdXN0cmVfc2hyaW5rX21zZyhycy0+cnNfcmVwYnVmLCAxLCByZXEtPnJxX3JlcGxlbiwgMSk7CiAKQEAgLTI1OTYsNyArMjU5Niw3IEBACiAJaW50CQkgICAgICBtc2dsZW4sIHJjOwogCiAJLyogZ2V0IGNsZWFyIGRhdGEgbGVuZ3RoLiBub3RlIGVtYmVkZGVkIGx1c3RyZV9tc2cgbWlnaHQKLQkgKiBoYXZlIGJlZW4gc2hyaW5rZWQgKi8KKwkgKiBoYXZlIGJlZW4gc2hydW5rICovCiAJaWYgKHJlcS0+cnFfcmVwbGVuICE9IGx1c3RyZV9tc2dfYnVmbGVuKHJzLT5yc19yZXBidWYsIDApKQogCQltc2dsZW4gPSBsdXN0cmVfc2hyaW5rX21zZyhycy0+cnNfcmVwYnVmLCAwLCByZXEtPnJxX3JlcGxlbiwgMSk7CiAJZWxzZQpAQCAtMjc2NSw3ICsyNzY1LDcgQEAKIAkgKiByZXBsYXkuCiAJICoKIAkgKiBlYWNoIHJldmVyc2Ugcm9vdCBjdHggd2lsbCByZWNvcmQgaXRzIGxhdGVzdCBzZXF1ZW5jZSBudW1iZXIgb24gaXRzCi0JICogYnVkZHkgc3ZjY3R4IGJlZm9yZSBiZSBkZXN0cm9pZWQsIHNvIGhlcmUgd2UgY29udGludWUgdXNlIGl0LgorCSAqIGJ1ZGR5IHN2Y2N0eCBiZWZvcmUgYmUgZGVzdHJveWVkLCBzbyBoZXJlIHdlIGNvbnRpbnVlIHVzZSBpdC4KIAkgKi8KIAlhdG9taWNfc2V0KCZjbGlfZ2N0eC0+Z2Nfc2VxLCBzdmNfZ2N0eC0+Z3NjX3J2c19zZXEpOwogCkBAIC0yODM2LDcgKzI4MzYsNyBAQAogCWlmIChyYykKIAkJZ290byBvdXRfc3ZjX3VwY2FsbDsKIAotCS8qIHJlZ2lzdGVyIHBvbGljeSBhZnRlciBhbGwgb3RoZXIgc3R1ZmYgYmUgaW50aWFsaXplZCwgYmVjYXVzZSBpdAorCS8qIHJlZ2lzdGVyIHBvbGljeSBhZnRlciBhbGwgb3RoZXIgc3R1ZmYgYmUgaW5pdGlhbGl6ZWQsIGJlY2F1c2UgaXQKIAkgKiBtaWdodCBiZSBpbiB1c2VkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSByZWdpc3RyYXRpb24uICovCiAKIAlyYyA9IGdzc19pbml0X2tleXJpbmcoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9pbXBvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9pbXBvcnQuYwppbmRleCBmNDY1NTQ3Li41MzdhYTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvaW1wb3J0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2ltcG9ydC5jCkBAIC01NjAsMTcgKzU2MCwzMCBAQAogCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxOwogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAotCWlmIChsaXN0X2VtcHR5KCZpbXAtPmltcF9yZXBsYXlfbGlzdCkpCi0JCXJldHVybiAwOwotCXRtcCA9IGltcC0+aW1wX3JlcGxheV9saXN0Lm5leHQ7Ci0JcmVxID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCwgcnFfcmVwbGF5X2xpc3QpOwotCSp0cmFuc25vID0gcmVxLT5ycV90cmFuc25vOwotCWlmIChyZXEtPnJxX3RyYW5zbm8gPT0gMCkgewotCQlERUJVR19SRVEoRF9FUlJPUiwgcmVxLCAiemVybyB0cmFuc25vIGluIHJlcGxheSIpOwotCQlMQlVHKCk7CisJLyogVGhlIHJlcXVlc3RzIGluIGNvbW1pdHRlZF9saXN0IGFsd2F5cyBoYXZlIHNtYWxsZXIgdHJhbnNub3MgdGhhbgorCSAqIHRoZSByZXF1ZXN0cyBpbiByZXBsYXlfbGlzdCAqLworCWlmICghbGlzdF9lbXB0eSgmaW1wLT5pbXBfY29tbWl0dGVkX2xpc3QpKSB7CisJCXRtcCA9IGltcC0+aW1wX2NvbW1pdHRlZF9saXN0Lm5leHQ7CisJCXJlcSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QsIHJxX3JlcGxheV9saXN0KTsKKwkJKnRyYW5zbm8gPSByZXEtPnJxX3RyYW5zbm87CisJCWlmIChyZXEtPnJxX3RyYW5zbm8gPT0gMCkgeworCQkJREVCVUdfUkVRKERfRVJST1IsIHJlcSwKKwkJCQkgICJ6ZXJvIHRyYW5zbm8gaW4gY29tbWl0dGVkX2xpc3QiKTsKKwkJCUxCVUcoKTsKKwkJfQorCQlyZXR1cm4gMTsKIAl9Ci0KLQlyZXR1cm4gMTsKKwlpZiAoIWxpc3RfZW1wdHkoJmltcC0+aW1wX3JlcGxheV9saXN0KSkgeworCQl0bXAgPSBpbXAtPmltcF9yZXBsYXlfbGlzdC5uZXh0OworCQlyZXEgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IHB0bHJwY19yZXF1ZXN0LCBycV9yZXBsYXlfbGlzdCk7CisJCSp0cmFuc25vID0gcmVxLT5ycV90cmFuc25vOworCQlpZiAocmVxLT5ycV90cmFuc25vID09IDApIHsKKwkJCURFQlVHX1JFUShEX0VSUk9SLCByZXEsICJ6ZXJvIHRyYW5zbm8gaW4gcmVwbGF5X2xpc3QiKTsKKwkJCUxCVUcoKTsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMTA0Miw3ICsxMDU1LDcgQEAKIAkJCWlmICgob2NkLT5vY2RfY2tzdW1fdHlwZXMgJgogCQkJICAgICBja3N1bV90eXBlc19zdXBwb3J0ZWRfY2xpZW50KCkpID09IDApIHsKIAkJCQlMQ09OU09MRV9XQVJOKCJUaGUgbmVnb3RpYXRpb24gb2YgdGhlIGNoZWNrc3VtICIKLQkJCQkJICAgICAgImFsb2dyaXRobSB0byB1c2Ugd2l0aCBzZXJ2ZXIgJXMgIgorCQkJCQkgICAgICAiYWxnb3JpdGhtIHRvIHVzZSB3aXRoIHNlcnZlciAlcyAiCiAJCQkJCSAgICAgICJmYWlsZWQgKCV4LyV4KSwgZGlzYWJsaW5nICIKIAkJCQkJICAgICAgImNoZWNrc3Vtc1xuIiwKIAkJCQkJICAgICAgb2JkMmNsaV90Z3QoaW1wLT5pbXBfb2JkKSwKQEAgLTEyNjAsNyArMTI3Myw3IEBACiAvKioKICAqIFRoaXMgaXMgdGhlIHN0YXRlIG1hY2hpbmUgZm9yIGNsaWVudC1zaWRlIHJlY292ZXJ5IG9uIGltcG9ydC4KICAqCi0gKiBUeXBpY2FseSB3ZSBoYXZlIHR3byBwb3NzaWJseSBwYXRocy4gSWYgd2UgY2FtZSB0byBzZXJ2ZXIgYW5kIGl0IGlzIG5vdAorICogVHlwaWNhbGx5IHdlIGhhdmUgdHdvIHBvc3NpYmx5IHBhdGhzLiBJZiB3ZSBjYW1lIHRvIHNlcnZlciBhbmQgaXQgaXMgbm90CiAgKiBpbiByZWNvdmVyeSwgd2UganVzdCBlbnRlciBJTVBfRVZJQ1RFRCBzdGF0ZSwgaW52YWxpZGF0ZSBvdXIgaW1wb3J0CiAgKiBzdGF0ZSBhbmQgcmVjb25uZWN0IGZyb20gc2NyYXRjaC4KICAqIElmIHdlIGNhbWUgdG8gc2VydmVyIHRoYXQgaXMgaW4gcmVjb3ZlcnksIHdlIGVudGVyIElNUF9SRVBMQVkgaW1wb3J0IHN0YXRlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xheW91dC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xheW91dC5jCmluZGV4IGRmY2I0MTAuLjQxYzEyZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9sYXlvdXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbGF5b3V0LmMKQEAgLTI5NSw3ICsyOTUsOCBAQAogCSZSTUZfUkVDX1JFSU5ULAogCSZSTUZfQ0FQQTEsCiAJJlJNRl9OQU1FLAotCSZSTUZfRUFEQVRBCisJJlJNRl9FQURBVEEsCisJJlJNRl9ETE1fUkVRCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKm1kdF9zd2FwX2xheW91dHNbXSA9IHsKQEAgLTIxNTQsNyArMjE1NSw3IEBACiAgKiByZXF1ZXN0IChpZiB0aGUgY2FsbGVyIGlzIGV4ZWN1dGluZyBvbiB0aGUgc2VydmVyLXNpZGUpIG9yIHJlcGx5IChpZiB0aGUKICAqIGNhbGxlciBpcyBleGVjdXRpbmcgb24gdGhlIGNsaWVudC1zaWRlKS4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGNvbnZpZW5pZW50IGZvciB1c2UgaXMgY29kZSB0aGF0IGNvdWxkIGJlIGV4ZWN1dGVkIG9uIHRoZQorICogVGhpcyBmdW5jdGlvbiBjb252ZW5pZW50IGZvciB1c2UgaXMgY29kZSB0aGF0IGNvdWxkIGJlIGV4ZWN1dGVkIG9uIHRoZQogICogY2xpZW50IGFuZCBzZXJ2ZXIgYWxpa2UuCiAgKi8KIGNvbnN0IHZvaWQgKnJlcV9jYXBzdWxlX290aGVyX2dldChzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbHByb2NfcHRscnBjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbHByb2NfcHRscnBjLmMKaW5kZXggMWJlOTc4Ni4uNThmMWM4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xwcm9jX3B0bHJwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9scHJvY19wdGxycGMuYwpAQCAtNjE2LDcgKzYxNiw3IEBACiB9CiAKIC8qKgotICogVGhlIGxvbmdlc3QgdmFsaWQgY29tbWFuZCBzdHJpbmcgaXMgdGhlIG1heGl1bSBwb2xpY3kgbmFtZSBzaXplLCBwbHVzIHRoZQorICogVGhlIGxvbmdlc3QgdmFsaWQgY29tbWFuZCBzdHJpbmcgaXMgdGhlIG1heGltdW0gcG9saWN5IG5hbWUgc2l6ZSwgcGx1cyB0aGUKICAqIGxlbmd0aCBvZiB0aGUgIiByZWciIHN1YnN0cmluZwogICovCiAjZGVmaW5lIExQUk9DRlNfTlJTX1dSX01BWF9DTUQJKE5SU19QT0xfTkFNRV9NQVggKyBzaXplb2YoIiByZWciKSAtIDEpCkBAIC0xMTg0LDcgKzExODQsNyBAQAogCX0KIAl0bXBidWYgPSBjZnNfZmlyc3RzdHIoa2J1ZiwgbWluX3QodW5zaWduZWQgbG9uZywgQlVGTEVOIC0gMSwgY291bnQpKTsKIAkvKiBLbHVkZ2UgY29kZShkZWFkbG9jayBzaXR1YXRpb24pOiB0aGUgbHByb2NmcyBsb2NrIGhhcyBiZWVuIGhlbGQKLQkgKiBzaW5jZSB0aGUgY2xpZW50IGlzIGV2aWN0ZWQgYnkgd3JpdHRpbmcgY2xpZW50J3MKKwkgKiBzaW5jZSB0aGUgY2xpZW50IGlzIGV2aWN0ZWQgYnkgd3JpdGluZyBjbGllbnQncwogCSAqIHV1aWQvbmlkIHRvIHByb2NmcyAiZXZpY3RfY2xpZW50IiBlbnRyeS4gSG93ZXZlciwKIAkgKiBvYmRfZXhwb3J0X2V2aWN0X2J5X3V1aWQoKSB3aWxsIGNhbGwgbHByb2Nmc19yZW1vdmUoKSB0byBkZXN0cm95CiAJICogdGhlIHByb2MgZW50cmllcyB1bmRlciB0aGUgYmVpbmcgZGVzdHJveWVkIGV4cG9ydHt9LCBzbyBJIGhhdmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9uaW9idWYuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9uaW9idWYuYwppbmRleCAzYzZiZjIzLi5hNDdhOGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbmlvYnVmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL25pb2J1Zi5jCkBAIC0zNDksNyArMzQ5LDcgQEAKIC8qKgogICogU2VuZCByZXF1ZXN0IHJlcGx5IGZyb20gcmVxdWVzdCBcYSByZXEgcmVwbHkgYnVmZmVyLgogICogXGEgZmxhZ3MgZGVmaW5lcyByZXBseSB0eXBlcwotICogUmV0dXJucyAwIG9uIHN1Y2VzcyBvciBlcnJvciBjb2RlCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBlcnJvciBjb2RlCiAgKi8KIGludCBwdGxycGNfc2VuZF9yZXBseShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgaW50IGZsYWdzKQogewpAQCAtMzg5LDcgKzM4OSw3IEBACiAJICogcHRscnBjX2JvZHkgaW4gcmVwbHkgYnVmZmVyIHRvIHB0bHJwY19ib2R5X3YyLCBvdGhlcndpc2UsIHRoZQogCSAqIHJlcGx5IGJ1ZmZlciBvbiBjbGllbnQgd2lsbCBiZSBvdmVyZmxvdy4KIAkgKgotCSAqIFhYWCBSZW1vdmUgdGhpcyB3aGVudmVyIHdlIGRyb3AgdGhlIGludGVyb3ByYWJpbGl0eSB3aXRoIHN1Y2ggY2xpZW50LgorCSAqIFhYWCBSZW1vdmUgdGhpcyB3aGVuZXZlciB3ZSBkcm9wIHRoZSBpbnRlcm9wcmFiaWxpdHkgd2l0aCBzdWNoIGNsaWVudC4KIAkgKi8KIAlyZXEtPnJxX3JlcGxlbiA9IGx1c3RyZV9zaHJpbmtfbXNnKHJlcS0+cnFfcmVwbXNnLCAwLAogCQkJCQkgICBzaXplb2Yoc3RydWN0IHB0bHJwY19ib2R5X3YyKSwgMSk7CkBAIC01MTEsNyArNTExLDkgQEAKIAkJQ0RFQlVHKERfSEEsICJtdXRpbmcgcnBjIGZvciBmYWlsZWQgaW1wIG9iZCAlc1xuIiwKIAkJICAgICAgIHJlcXVlc3QtPnJxX2ltcG9ydC0+aW1wX29iZC0+b2JkX25hbWUpOwogCQkvKiB0aGlzIHByZXZlbnRzIHVzIGZyb20gd2FpdGluZyBpbiBwdGxycGNfcXVldWVfd2FpdCAqLworCQlzcGluX2xvY2soJnJlcXVlc3QtPnJxX2xvY2spOwogCQlyZXF1ZXN0LT5ycV9lcnIgPSAxOworCQlzcGluX3VubG9jaygmcmVxdWVzdC0+cnFfbG9jayk7CiAJCXJlcXVlc3QtPnJxX3N0YXR1cyA9IC1FTk9ERVY7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTU1Myw3ICs1NTUsOSBAQAogCQkJaWYgKHJjKSB7CiAJCQkJLyogdGhpcyBwcmV2ZW50cyB1cyBmcm9tIGxvb3BpbmcgaW4KIAkJCQkgKiBwdGxycGNfcXVldWVfd2FpdCAqLworCQkJCXNwaW5fbG9jaygmcmVxdWVzdC0+cnFfbG9jayk7CiAJCQkJcmVxdWVzdC0+cnFfZXJyID0gMTsKKwkJCQlzcGluX3VubG9jaygmcmVxdWVzdC0+cnFfbG9jayk7CiAJCQkJcmVxdWVzdC0+cnFfc3RhdHVzID0gcmM7CiAJCQkJR09UTyhjbGVhbnVwX2J1bGssIHJjKTsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9ucnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9ucnMuYwppbmRleCAwYWJjZDZkLi5iY2JhMWM4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL25ycy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9ucnMuYwpAQCAtMTMyMiw3ICsxMzIyLDcgQEAKICAqIFNldHVwIE5SUyBoZWFkcyBvbiBhbGwgc2VydmljZSBwYXJ0aXRpb25zIG9mIHNlcnZpY2UgXGEgc3ZjLCBhbmQgcmVnaXN0ZXIKICAqIGFsbCBjb21wYXRpYmxlIHBvbGljaWVzIG9uIHRob3NlIE5SUyBoZWFkcy4KICAqCi0gKiBUbyBiZSBjYWxsZWQgZnJvbSB3aXRoaW5nIHB0bAorICogVG8gYmUgY2FsbGVkIGZyb20gd2l0aGluIHB0bAogICogXHBhcmFtW2luXSBzdmMgdGhlIHNlcnZpY2UgdG8gc2V0dXAKICAqCiAgKiBccmV0dmFsIC12ZSBlcnJvciwgdGhlIGNhbGxpbmcgbG9naWMgc2hvdWxkIGV2ZW50dWFsbHkgY2FsbApAQCAtMTczNiw3ICsxNzM2LDcgQEAKIH0KIAogLyoqCi0gKiBSZW1vdmVzIGFsbCBwb2xpY3kgZGVzY2lwdG9ycyBmcm9tIG5yc19jb3JlOjpucnNfcG9saWNpZXMsIGFuZCBmcmVlcyB0aGUKKyAqIFJlbW92ZXMgYWxsIHBvbGljeSBkZXNjcmlwdG9ycyBmcm9tIG5yc19jb3JlOjpucnNfcG9saWNpZXMsIGFuZCBmcmVlcyB0aGUKICAqIHBvbGljeSBkZXNjcmlwdG9ycy4KICAqCiAgKiBTaW5jZSBhbGwgUFRMUlBDIHNlcnZpY2VzIGFyZSBzdG9wcGVkIGF0IHRoaXMgcG9pbnQsIHRoZXJlIGFyZSBubyBtb3JlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcGFja19nZW5lcmljLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcGFja19nZW5lcmljLmMKaW5kZXggNDY0NDc5Yy4uNDVjMGI4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3BhY2tfZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wYWNrX2dlbmVyaWMuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiAJCSAqIHdpdGggdGhlIG9sZCBjbGllbnQgKDwgMi4zKSB3aGljaCBkb2Vzbid0IGhhdmUgcGJfam9iaWQKIAkJICogaW4gdGhlIHB0bHJwY19ib2R5LgogCQkgKgotCQkgKiBYWFggUmVtb3ZlIHRoaXMgd2hlbmV2ZXIgd2UgZG9ycCBpbnRlcm9wcmFiaWxpdHkgd2l0aCBzdWNoCisJCSAqIFhYWCBSZW1vdmUgdGhpcyB3aGVuZXZlciB3ZSBkcm9wIGludGVyb3ByYWJpbGl0eSB3aXRoIHN1Y2gKIAkJICogICAgIGNsaWVudC4KIAkJICovCiAJCV9fdTMyIHBibGVuID0gc2l6ZW9mKHN0cnVjdCBwdGxycGNfYm9keV92Mik7CkBAIC0yNDQsMTUgKzI0NCw3IEBACiAJTEFTU0VSVChsZW5zW01TR19QVExSUENfQk9EWV9PRkZdID09IHNpemVvZihzdHJ1Y3QgcHRscnBjX2JvZHkpKTsKIAogCS8qIG9ubHkgdXNlIG5ldyBmb3JtYXQsIHdlIGRvbid0IG5lZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIDEuNCAqLwotCW1hZ2ljID0gTFVTVFJFX01TR19NQUdJQ19WMjsKLQotCXN3aXRjaCAobWFnaWMpIHsKLQljYXNlIExVU1RSRV9NU0dfTUFHSUNfVjI6Ci0JCXJldHVybiBsdXN0cmVfcGFja19yZXF1ZXN0X3YyKHJlcSwgY291bnQsIGxlbnMsIGJ1ZnMpOwotCWRlZmF1bHQ6Ci0JCUxBU1NFUlRGKDAsICJpbmNvcnJlY3QgbWVzc2FnZSBtYWdpYzogJTA4eFxuIiwgbWFnaWMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJcmV0dXJuIGx1c3RyZV9wYWNrX3JlcXVlc3RfdjIocmVxLCBjb3VudCwgbGVucywgYnVmcyk7CiB9CiBFWFBPUlRfU1lNQk9MKGx1c3RyZV9wYWNrX3JlcXVlc3QpOwogCkBAIC0xNTQ1LDcgKzE1MzcsNyBAQAogCQlfX3UzMiBvcGMgPSBsdXN0cmVfbXNnX2dldF9vcGMobXNnKTsKIAkJc3RydWN0IHB0bHJwY19ib2R5ICpwYjsKIAotCQkvKiBEb24ndCBzZXQgam9iaWQgZm9yIGxkbG0gYXN0IFJQQ3MsIHRoZXkndmUgYmVlbiBzaHJpbmtlZC4KKwkJLyogRG9uJ3Qgc2V0IGpvYmlkIGZvciBsZGxtIGFzdCBSUENzLCB0aGV5J3ZlIGJlZW4gc2hydW5rLgogCQkgKiBTZWUgdGhlIGNvbW1lbnQgaW4gcHRscnBjX3JlcXVlc3RfcGFjaygpLiAqLwogCQlpZiAoIW9wYyB8fCBvcGMgPT0gTERMTV9CTF9DQUxMQkFDSyB8fAogCQkgICAgb3BjID09IExETE1fQ1BfQ0FMTEJBQ0sgfHwgb3BjID09IExETE1fR0xfQ0FMTEJBQ0spCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3B0bHJwY2QuYwppbmRleCAyZDI2ZmQ1Li5jYTczNGNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wdGxycGNkLmMKQEAgLTIyOSw3ICsyMjksNyBAQAogCQlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKIAkJbF93YWl0X2V2ZW50KHJlcS0+cnFfc2V0X3dhaXRxLCAocmVxLT5ycV9zZXQgPT0gTlVMTCksICZsd2kpOwogCX0gZWxzZSBpZiAocmVxLT5ycV9zZXQpIHsKLQkJLyogSWYgd2UgaGF2ZSBhIHZhaWQgInJxX3NldCIsIGp1c3QgcmV1c2UgaXQgdG8gYXZvaWQgZG91YmxlCisJCS8qIElmIHdlIGhhdmUgYSB2YWxpZCAicnFfc2V0IiwganVzdCByZXVzZSBpdCB0byBhdm9pZCBkb3VibGUKIAkJICogbGlua2VkLiAqLwogCQlMQVNTRVJUKHJlcS0+cnFfcGhhc2UgPT0gUlFfUEhBU0VfTkVXKTsKIAkJTEFTU0VSVChyZXEtPnJxX3NlbmRfc3RhdGUgPT0gTFVTVFJFX0lNUF9SRVBMQVkpOwpAQCAtNDcxLDcgKzQ3MSw3IEBACiAgKiAgICAgIGJlIGJldHRlci4gQnV0IGl0IGJyZWFrcyBmb3JtZXIgZGF0YSB0cmFuc2ZlciBwb2xpY3kuCiAgKgogICogICAgICBTbyB3ZSBzaG91bGRuJ3QgYmUgYmxpbmQgZm9yIGF2b2lkaW5nIHRoZSBkYXRhIHRyYW5zZmVyLiBXZSBtYWtlIHNvbWUKLSAqICAgICAgY29tcHJvbWlzZTogZGl2aWRlIHRoZSBwdGxycGNkIHRocmVkcyBwb29sIGludG8gdHdvIHBhcnRzLiBPbmUgcGFydCBpcworICogICAgICBjb21wcm9taXNlOiBkaXZpZGUgdGhlIHB0bHJwY2QgdGhyZWFkcyBwb29sIGludG8gdHdvIHBhcnRzLiBPbmUgcGFydCBpcwogICogICAgICBmb3IgYm91bmQgbW9kZSwgZWFjaCBwdGxycGNkIHRocmVhZCBpbiB0aGlzIHBhcnQgaXMgYm91bmQgdG8gc29tZSBDUFUKICAqICAgICAgY29yZS4gVGhlIG90aGVyIHBhcnQgaXMgZm9yIGZyZWUgbW9kZSwgYWxsIHRoZSBwdGxycGNkIHRocmVhZHMgaW4gdGhlCiAgKiAgICAgIHBhcnQgY2FuIGJlIHNjaGVkdWxlZCBvbiBhbnkgQ1BVIGNvcmUuIFdlIHNwZWNpZnkgc29tZSBwYXJ0bmVyc2hpcApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3JlY292ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9yZWNvdmVyLmMKaW5kZXggODRjMzllMC4uNDhhZTMyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3JlY292ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcmVjb3Zlci5jCkBAIC0xMDUsMjQgKzEwNSw1OSBAQAogCSAqIGltcF9sb2NrIGlzIGJlaW5nIGhlbGQgYnkgcHRscnBjX3JlcGxheSwgYnV0IGl0J3Mgbm90LiBpdCdzCiAJICoganVzdCBhIGxpdHRsZSByYWNlLi4uCiAJICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHRtcCwgcG9zLCAmaW1wLT5pbXBfcmVwbGF5X2xpc3QpIHsKKworCS8qIFJlcGxheSBhbGwgdGhlIGNvbW1pdHRlZCBvcGVuIHJlcXVlc3RzIG9uIGNvbW1pdHRlZF9saXN0IGZpcnN0ICovCisJaWYgKCFsaXN0X2VtcHR5KCZpbXAtPmltcF9jb21taXR0ZWRfbGlzdCkpIHsKKwkJdG1wID0gaW1wLT5pbXBfY29tbWl0dGVkX2xpc3QucHJldjsKIAkJcmVxID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCwKIAkJCQkgICAgIHJxX3JlcGxheV9saXN0KTsKIAotCQkvKiBJZiBuZWVkIHRvIHJlc2VuZCB0aGUgbGFzdCBzZW50IHRyYW5zbm8gKGJlY2F1c2UgYQotCQkgICByZWNvbm5lY3QgaGFzIG9jY3VycmVkKSwgdGhlbiBzdG9wIG9uIHRoZSBtYXRjaGluZwotCQkgICByZXEgYW5kIHNlbmQgaXQgYWdhaW4uIElmLCBob3dldmVyLCB0aGUgbGFzdCBzZW50Ci0JCSAgIHRyYW5zbm8gaGFzIGJlZW4gY29tbWl0dGVkIHRoZW4gd2UgY29udGludWUgcmVwbGF5Ci0JCSAgIGZyb20gdGhlIG5leHQgcmVxdWVzdC4gKi8KKwkJLyogVGhlIGxhc3QgcmVxdWVzdCBvbiBjb21taXR0ZWRfbGlzdCBoYXNuJ3QgYmVlbiByZXBsYXllZCAqLwogCQlpZiAocmVxLT5ycV90cmFuc25vID4gbGFzdF90cmFuc25vKSB7Ci0JCQlpZiAoaW1wLT5pbXBfcmVzZW5kX3JlcGxheSkKLQkJCQlsdXN0cmVfbXNnX2FkZF9mbGFncyhyZXEtPnJxX3JlcW1zZywKLQkJCQkJCSAgICAgTVNHX1JFU0VOVCk7Ci0JCQlicmVhazsKKwkJCS8qIFNpbmNlIHRoZSBpbXBfY29tbWl0dGVkX2xpc3QgaXMgaW1tdXRhYmxlIGJlZm9yZQorCQkJICogYWxsIG9mIGl0J3MgcmVxdWVzdHMgYmVpbmcgcmVwbGF5ZWQsIGl0J3Mgc2FmZSB0bworCQkJICogdXNlIGEgY3Vyc29yIHRvIGFjY2VsZXJhdGUgdGhlIHNlYXJjaCAqLworCQkJaW1wLT5pbXBfcmVwbGF5X2N1cnNvciA9IGltcC0+aW1wX3JlcGxheV9jdXJzb3ItPm5leHQ7CisKKwkJCXdoaWxlIChpbXAtPmltcF9yZXBsYXlfY3Vyc29yICE9CisJCQkgICAgICAgJmltcC0+aW1wX2NvbW1pdHRlZF9saXN0KSB7CisJCQkJcmVxID0gbGlzdF9lbnRyeShpbXAtPmltcF9yZXBsYXlfY3Vyc29yLAorCQkJCQkJIHN0cnVjdCBwdGxycGNfcmVxdWVzdCwKKwkJCQkJCSBycV9yZXBsYXlfbGlzdCk7CisJCQkJaWYgKHJlcS0+cnFfdHJhbnNubyA+IGxhc3RfdHJhbnNubykKKwkJCQkJYnJlYWs7CisKKwkJCQlyZXEgPSBOVUxMOworCQkJCWltcC0+aW1wX3JlcGxheV9jdXJzb3IgPQorCQkJCQlpbXAtPmltcF9yZXBsYXlfY3Vyc29yLT5uZXh0OworCQkJfQorCQl9IGVsc2UgeworCQkJLyogQWxsIHJlcXVlc3RzIG9uIGNvbW1pdHRlZF9saXN0IGhhdmUgYmVlbiByZXBsYXllZCAqLworCQkJaW1wLT5pbXBfcmVwbGF5X2N1cnNvciA9ICZpbXAtPmltcF9jb21taXR0ZWRfbGlzdDsKKwkJCXJlcSA9IE5VTEw7CiAJCX0KLQkJcmVxID0gTlVMTDsKIAl9CiAKKwkvKiBBbGwgdGhlIHJlcXVlc3RzIGluIGNvbW1pdHRlZCBsaXN0IGhhdmUgYmVlbiByZXBsYXllZCwgbGV0J3MgcmVwbGF5CisJICogdGhlIGltcF9yZXBsYXlfbGlzdCAqLworCWlmIChyZXEgPT0gTlVMTCkgeworCQlsaXN0X2Zvcl9lYWNoX3NhZmUodG1wLCBwb3MsICZpbXAtPmltcF9yZXBsYXlfbGlzdCkgeworCQkJcmVxID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCwKKwkJCQkJIHJxX3JlcGxheV9saXN0KTsKKworCQkJaWYgKHJlcS0+cnFfdHJhbnNubyA+IGxhc3RfdHJhbnNubykKKwkJCQlicmVhazsKKwkJCXJlcSA9IE5VTEw7CisJCX0KKwl9CisKKwkvKiBJZiBuZWVkIHRvIHJlc2VuZCB0aGUgbGFzdCBzZW50IHRyYW5zbm8gKGJlY2F1c2UgYSByZWNvbm5lY3QKKwkgKiBoYXMgb2NjdXJyZWQpLCB0aGVuIHN0b3Agb24gdGhlIG1hdGNoaW5nIHJlcSBhbmQgc2VuZCBpdCBhZ2Fpbi4KKwkgKiBJZiwgaG93ZXZlciwgdGhlIGxhc3Qgc2VudCB0cmFuc25vIGhhcyBiZWVuIGNvbW1pdHRlZCB0aGVuIHdlCisJICogY29udGludWUgcmVwbGF5IGZyb20gdGhlIG5leHQgcmVxdWVzdC4gKi8KKwlpZiAocmVxICE9IE5VTEwgJiYgaW1wLT5pbXBfcmVzZW5kX3JlcGxheSkKKwkJbHVzdHJlX21zZ19hZGRfZmxhZ3MocmVxLT5ycV9yZXFtc2csIE1TR19SRVNFTlQpOworCiAJc3Bpbl9sb2NrKCZpbXAtPmltcF9sb2NrKTsKIAlpbXAtPmltcF9yZXNlbmRfcmVwbGF5ID0gMDsKIAlzcGluX3VubG9jaygmaW1wLT5pbXBfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjLmMKaW5kZXggOTYyYjMxZC4uZDgwNDE4MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjLmMKQEAgLTU0Myw4ICs1NDMsOCBAQAogCQkgICAgICAgImN0eCAoJXAsIGZsICVseCkgZG9lc24ndCBzd2l0Y2gsIHJlbGF4IGEgbGl0dGxlIGJpdFxuIiwKIAkJICAgICAgIG5ld2N0eCwgbmV3Y3R4LT5jY19mbGFncyk7CiAKLQkJc2NoZWR1bGVfdGltZW91dF9hbmRfc2V0X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSwKLQkJCQkJCSAgIEhaKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChIWik7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogaXQncyBwb3NzaWJsZSBuZXdjdHggPT0gb2xkY3R4IGlmIHdlJ3JlIHN3aXRjaGluZwpAQCAtNzc5LDcgKzc3OSw3IEBACiAJICogICBlLmcuIHB0bHJwY19hYm9ydF9pbmZsaWdodCgpOwogCSAqLwogCWlmICghY2xpX2N0eF9pc19yZWZyZXNoZWQoY3R4KSkgewotCQkvKiB0aW1lZCBvdXQgb3IgaW50ZXJydXB0dGVkICovCisJCS8qIHRpbWVkIG91dCBvciBpbnRlcnJ1cHRlZCAqLwogCQlyZXFfb2ZmX2N0eF9saXN0KHJlcSwgY3R4KTsKIAogCQlMQVNTRVJUKHJjICE9IDApOwpAQCAtODA1LDcgKzgwNSw3IEBACiAJTEFTU0VSVChyZXEtPnJxX2NsaV9jdHgtPmNjX3NlYyk7CiAJTEFTU0VSVChyZXEtPnJxX2J1bGtfcmVhZCA9PSAwIHx8IHJlcS0+cnFfYnVsa193cml0ZSA9PSAwKTsKIAotCS8qIHNwZWNpYWwgc2VjdXJpdHkgZmxhZ3MgYWNjb2RpbmcgdG8gb3Bjb2RlICovCisJLyogc3BlY2lhbCBzZWN1cml0eSBmbGFncyBhY2NvcmRpbmcgdG8gb3Bjb2RlICovCiAJc3dpdGNoIChvcGNvZGUpIHsKIAljYXNlIE9TVF9SRUFEOgogCWNhc2UgTURTX1JFQURQQUdFOgpAQCAtMTIxOCw3ICsxMjE4LDcgQEAKIAlMQVNTRVJUX0FUT01JQ19aRVJPKCZzZWMtPnBzX25jdHgpOwogCUxBU1NFUlQocG9saWN5LT5zcF9jb3BzLT5kZXN0cm95X3NlYyk7CiAKLQlDREVCVUcoRF9TRUMsICIlc0AlcDogYmVpbmcgZGVzdHJvaWVkXG4iLCBzZWMtPnBzX3BvbGljeS0+c3BfbmFtZSwgc2VjKTsKKwlDREVCVUcoRF9TRUMsICIlc0AlcDogYmVpbmcgZGVzdHJveWVkXG4iLCBzZWMtPnBzX3BvbGljeS0+c3BfbmFtZSwgc2VjKTsKIAogCXBvbGljeS0+c3BfY29wcy0+ZGVzdHJveV9zZWMoc2VjKTsKIAlzcHRscnBjX3BvbGljeV9wdXQocG9saWN5KTsKQEAgLTEyNjQsNyArMTI2NCw3IEBACiBFWFBPUlRfU1lNQk9MKHNwdGxycGNfc2VjX3B1dCk7CiAKIC8qCi0gKiBwb2xpY3kgbW9kdWxlIGlzIHJlc3BvbnNpYmxlIGZvciB0YWtpbmcgcmVmcmVuY2Ugb2YgaW1wb3J0CisgKiBwb2xpY3kgbW9kdWxlIGlzIHJlc3BvbnNpYmxlIGZvciB0YWtpbmcgcmVmZXJlbmNlIG9mIGltcG9ydAogICovCiBzdGF0aWMKIHN0cnVjdCBwdGxycGNfc2VjICogc3B0bHJwY19zZWNfY3JlYXRlKHN0cnVjdCBvYmRfaW1wb3J0ICppbXAsCkBAIC0xNDE5LDcgKzE0MTksNyBAQAogCiAJCXNwID0gaW1wLT5pbXBfb2JkLT51LmNsaS5jbF9zcF9tZTsKIAl9IGVsc2UgewotCQkvKiByZXZlcnNlIGltcG9ydCwgZGV0ZXJtaW5lIGZsYXZvciBmcm9tIGluY29taW5nIHJlcWV1c3QgKi8KKwkJLyogcmV2ZXJzZSBpbXBvcnQsIGRldGVybWluZSBmbGF2b3IgZnJvbSBpbmNvbWluZyByZXF1ZXN0ICovCiAJCXNmID0gKmZsdnI7CiAKIAkJaWYgKHNmLnNmX3JwYyAhPSBTUFRMUlBDX0ZMVlJfTlVMTCkKQEAgLTIwNTcsNyArMjA1Nyw3IEBACiAKIAkvKgogCSAqIGlmIGl0J3Mgbm90IG51bGwgZmxhdm9yICh3aGljaCBtZWFucyBlbWJlZGRlZCBwYWNraW5nIG1zZyksCi0JICogcmVzZXQgdGhlIHN3YWIgbWFzayBmb3IgdGhlIGNvbW1pbmcgaW5uZXIgbXNnIHVucGFja2luZy4KKwkgKiByZXNldCB0aGUgc3dhYiBtYXNrIGZvciB0aGUgY29taW5nIGlubmVyIG1zZyB1bnBhY2tpbmcuCiAJICovCiAJaWYgKFNQVExSUENfRkxWUl9QT0xJQ1kocmVxLT5ycV9mbHZyLnNmX3JwYykgIT0gU1BUTFJQQ19QT0xJQ1lfTlVMTCkKIAkJcmVxLT5ycV9yZXFfc3dhYl9tYXNrID0gMDsKQEAgLTIxMDgsNyArMjEwOCw3IEBACiAvKioKICAqIFVzZWQgYnkgcHRscnBjIHNlcnZlciwgdG8gcGVyZm9ybSB0cmFuc2Zvcm1hdGlvbiB1cG9uIHJlcGx5IG1lc3NhZ2UuCiAgKgotICogXHBvc3QgcmVxLT5ycV9yZXBseV9vZmYgaXMgc2V0IHRvIGFwcHJvcmlhdGUgc2VydmVyLWNvbnRyb2xsZWQgcmVwbHkgb2Zmc2V0LgorICogXHBvc3QgcmVxLT5ycV9yZXBseV9vZmYgaXMgc2V0IHRvIGFwcHJvcHJpYXRlIHNlcnZlci1jb250cm9sbGVkIHJlcGx5IG9mZnNldC4KICAqIFxwb3N0IHJlcS0+cnFfcmVwbXNnIGFuZCByZXEtPnJxX3JlcGx5X3N0YXRlLT5yc19tc2cgYmVjb21lcyBpbmFjY2Vzc2libGUuCiAgKi8KIGludCBzcHRscnBjX3N2Y193cmFwX3JlcGx5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19idWxrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2J1bGsuYwppbmRleCAzMTYxMDNhLi45NjU2NjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2J1bGsuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2J1bGsuYwpAQCAtMTEzLDcgKzExMyw3IEBACiAJdW5zaWduZWQgbG9uZyAgICBlcHBfc3RfbWlzc2luZ3M7ICAgICAgIC8qICMgb2YgY2FjaGUgbWlzc2luZyAqLwogCXVuc2lnbmVkIGxvbmcgICAgZXBwX3N0X2xvd2ZyZWU7CS8qIGxvd2VzdCBmcmVlIHBhZ2VzIHJlYWNoZWQgKi8KIAl1bnNpZ25lZCBpbnQgICAgIGVwcF9zdF9tYXhfd3FsZW47ICAgICAgLyogaGlnaGVzdCB3YWl0cXVldWUgbGVuZ3RoICovCi0JY2ZzX3RpbWVfdCAgICAgICBlcHBfc3RfbWF4X3dhaXQ7ICAgICAgIC8qIGluIGplZmZpZXMgKi8KKwljZnNfdGltZV90ICAgICAgIGVwcF9zdF9tYXhfd2FpdDsgICAgICAgLyogaW4gamlmZmllcyAqLwogCS8qCiAJICogcG9pbnRlcnMgdG8gcG9vbHMKIAkgKi8KQEAgLTU0NSwxMSArNTQ1LDExIEBACiAJCQkJCQlwYWdlX3Bvb2xzLmVwcF93YWl0cWxlbjsKIAogCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQkJaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCgmd2FpdGxpbmspOworCQkJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXRsaW5rLCBjdXJyZW50KTsKIAkJCWFkZF93YWl0X3F1ZXVlKCZwYWdlX3Bvb2xzLmVwcF93YWl0cSwgJndhaXRsaW5rKTsKIAogCQkJc3Bpbl91bmxvY2soJnBhZ2VfcG9vbHMuZXBwX2xvY2spOwotCQkJd2FpdHFfd2FpdCgmd2FpdGxpbmssIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlKCk7CiAJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGFnZV9wb29scy5lcHBfd2FpdHEsICZ3YWl0bGluayk7CiAJCQlMQVNTRVJUKHBhZ2VfcG9vbHMuZXBwX3dhaXRxbGVuID4gMCk7CiAJCQlzcGluX2xvY2soJnBhZ2VfcG9vbHMuZXBwX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19jb25maWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfY29uZmlnLmMKaW5kZXggNmNjM2YyMy4uYmY1NjEyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19jb25maWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2NvbmZpZy5jCkBAIC0yNTUsNyArMjU1LDcgQEAKIEVYUE9SVF9TWU1CT0woc3B0bHJwY19ydWxlX3NldF9mcmVlKTsKIAogLyoKLSAqIHJldHVybiAwIGlmIHRoZSBydWxlIHNldCBjb3VsZCBhY2NvbW9kYXRlIG9uZSBtb3JlIHJ1bGUuCisgKiByZXR1cm4gMCBpZiB0aGUgcnVsZSBzZXQgY291bGQgYWNjb21tb2RhdGUgb25lIG1vcmUgcnVsZS4KICAqLwogaW50IHNwdGxycGNfcnVsZV9zZXRfZXhwYW5kKHN0cnVjdCBzcHRscnBjX3J1bGVfc2V0ICpyc2V0KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlcnZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZXJ2aWNlLmMKaW5kZXggNTkwZmE4ZC4uMTkyYWRlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlcnZpY2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VydmljZS5jCkBAIC0xNzcsNyArMTc3LDcgQEAKIAogLyoqCiAgKiBQYXJ0IG9mIFJlcC1BY2sgbG9naWMuCi0gKiBQdXRzIGEgbG9jayBhbmQgaXRzIG1vZGUgaW50byByZXBseSBzdGF0ZSBhc3NvdGlhdGVkIHRvIHJlcXVlc3QgcmVwbHkuCisgKiBQdXRzIGEgbG9jayBhbmQgaXRzIG1vZGUgaW50byByZXBseSBzdGF0ZSBhc3NvY2lhdGVkIHRvIHJlcXVlc3QgcmVwbHkuCiAgKi8KIHZvaWQKIHB0bHJwY19zYXZlX2xvY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsCkBAIC0yNTIsNyArMjUyLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcHRscnBjX2hyX3NlcnZpY2UJCXB0bHJwY19ocjsKIAogLyoqCi0gKiBtYXhpbXVtIG11bWJlciBvZiByZXBsaWVzIHNjaGVkdWxlZCBpbiBvbmUgYmF0Y2gKKyAqIG1heGltdW0gbnVtYmVyIG9mIHJlcGxpZXMgc2NoZWR1bGVkIGluIG9uZSBiYXRjaAogICovCiAjZGVmaW5lIE1BWF9TQ0hFRFVMRUQgMjU2CiAKQEAgLTYxMiw3ICs2MTIsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZzdmNwdC0+c2NwX2hpc3RfcmVxcyk7CiAJSU5JVF9MSVNUX0hFQUQoJnN2Y3B0LT5zY3BfaGlzdF9ycWJkcyk7CiAKLQkvKiBhY2l0dmUgcmVxdWVzdHMgYW5kIGhwIHJlcXVlc3RzICovCisJLyogYWN0aXZlIHJlcXVlc3RzIGFuZCBocCByZXF1ZXN0cyAqLwogCXNwaW5fbG9ja19pbml0KCZzdmNwdC0+c2NwX3JlcV9sb2NrKTsKIAogCS8qIHJlcGx5IHN0YXRlcyAqLwpAQCAtNzUyLDcgKzc1Miw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJnNlcnZpY2UtPnNydl9sb2NrKTsKIAlzZXJ2aWNlLT5zcnZfbmFtZQkJPSBjb25mLT5wc2NfbmFtZTsKIAlzZXJ2aWNlLT5zcnZfd2F0Y2hkb2dfZmFjdG9yCT0gY29uZi0+cHNjX3dhdGNoZG9nX2ZhY3RvcjsKLQlJTklUX0xJU1RfSEVBRCgmc2VydmljZS0+c3J2X2xpc3QpOyAvKiBmb3Igc2FmdHkgb2YgY2xlYW51cCAqLworCUlOSVRfTElTVF9IRUFEKCZzZXJ2aWNlLT5zcnZfbGlzdCk7IC8qIGZvciBzYWZldHkgb2YgY2xlYW51cCAqLwogCiAJLyogYnVmZmVyIGNvbmZpZ3VyYXRpb24gKi8KIAlzZXJ2aWNlLT5zcnZfbmJ1Zl9wZXJfZ3JvdXAJPSB0ZXN0X3JlcV9idWZmZXJfcHJlc3N1cmUgPwpAQCAtMTk4Miw3ICsxOTgyLDcgQEAKIAlkb19nZXR0aW1lb2ZkYXkoJndvcmtfZW5kKTsKIAl0aW1lZGlmZiA9IGNmc190aW1ldmFsX3N1Yigmd29ya19lbmQsICZ3b3JrX3N0YXJ0LCBOVUxMKTsKIAlDREVCVUcoRF9SUENUUkFDRSwgIkhhbmRsZWQgUlBDIHBuYW1lOmNsdXVpZCtyZWY6cGlkOnhpZDpuaWQ6b3BjICIKLQkgICAgICAgIiVzOiVzKyVkOiVkOngiTFBVNjQiOiVzOiVkIFJlcXVlc3QgcHJvY2VzZWQgaW4gIgorCSAgICAgICAiJXM6JXMrJWQ6JWQ6eCJMUFU2NCI6JXM6JWQgUmVxdWVzdCBwcm9jZXNzZWQgaW4gIgogCSAgICAgICAiJWxkdXMgKCVsZHVzIHRvdGFsKSB0cmFucyAiTFBVNjQiIHJjICVkLyVkXG4iLAogCQljdXJyZW50X2NvbW0oKSwKIAkJKHJlcXVlc3QtPnJxX2V4cG9ydCA/CkBAIC0yNzM2LDcgKzI3MzYsNyBAQAogCQlzcGluX2xvY2soJnN2Y3B0LT5zY3BfbG9jayk7CiAJCS0tc3ZjcHQtPnNjcF9udGhyc19zdGFydGluZzsKIAkJaWYgKHRocmVhZF9pc19zdG9wcGluZyh0aHJlYWQpKSB7Ci0JCQkvKiB0aGlzIHB0bHJwY190aHJlYWQgaXMgYmVpbmcgaGFubGVkCisJCQkvKiB0aGlzIHB0bHJwY190aHJlYWQgaXMgYmVpbmcgaGFuZGxlZAogCQkJICogYnkgcHRscnBjX3N2Y3B0X3N0b3BfdGhyZWFkcyBub3cKIAkJCSAqLwogCQkJdGhyZWFkX2FkZF9mbGFncyh0aHJlYWQsIFNWQ19TVE9QUEVEKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy93aXJldGVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3dpcmV0ZXN0LmMKaW5kZXggM2FhNDQ1OS4uM2M4ODQ2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3dpcmV0ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3dpcmV0ZXN0LmMKQEAgLTExNTIsNiArMTE1Miw4IEBACiAJCSBPQkRfQ09OTkVDVF9TSE9SVElPKTsKIAlMQVNTRVJURihPQkRfQ09OTkVDVF9QSU5HTEVTUyA9PSAweDQwMDAwMDAwMDAwMDBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCiAJCSBPQkRfQ09OTkVDVF9QSU5HTEVTUyk7CisJTEFTU0VSVEYoT0JEX0NPTk5FQ1RfRkxPQ0tfREVBRCA9PSAweDgwMDAwMDAwMDAwMDBVTEwsCisJCSAiZm91bmQgMHglLjE2bGx4VUxMXG4iLCBPQkRfQ09OTkVDVF9GTE9DS19ERUFEKTsKIAlMQVNTRVJURihPQkRfQ0tTVU1fQ1JDMzIgPT0gMHgwMDAwMDAwMVVMLCAiZm91bmQgMHglLjh4VUxcbiIsCiAJCSh1bnNpZ25lZClPQkRfQ0tTVU1fQ1JDMzIpOwogCUxBU1NFUlRGKE9CRF9DS1NVTV9BRExFUiA9PSAweDAwMDAwMDAyVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9oYW5kbGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9oYW5kbGUuaAppbmRleCA2MmI5Nzk1Li41NjM4YjE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMHhfaGFuZGxlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTB4X2hhbmRsZS5oCkBAIC0yOCwyNiArMjgsMjYgQEAKICNkZWZpbmUgUkVHTU9ERTMyCTMyCiAKIHN0cnVjdCBhczEwMl9wcml2X29wc190IHsKLQlpbnQgKCp1cGxvYWRfZndfcGt0KSAoc3RydWN0IGFzMTB4X2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwLAorCWludCAoKnVwbG9hZF9md19wa3QpKHN0cnVjdCBhczEweF9idXNfYWRhcHRlcl90ICpidXNfYWRhcCwKIAkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgaW50IHN3YXAzMik7CiAKLQlpbnQgKCpzZW5kX2NtZCkgKHN0cnVjdCBhczEweF9idXNfYWRhcHRlcl90ICpidXNfYWRhcCwKKwlpbnQgKCpzZW5kX2NtZCkoc3RydWN0IGFzMTB4X2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwLAogCQkJIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGJ1Zmxlbik7CiAKLQlpbnQgKCp4ZmVyX2NtZCkgKHN0cnVjdCBhczEweF9idXNfYWRhcHRlcl90ICpidXNfYWRhcCwKKwlpbnQgKCp4ZmVyX2NtZCkoc3RydWN0IGFzMTB4X2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwLAogCQkJIHVuc2lnbmVkIGNoYXIgKnNlbmRfYnVmLCBpbnQgc2VuZF9idWZfbGVuLAogCQkJIHVuc2lnbmVkIGNoYXIgKnJlY3ZfYnVmLCBpbnQgcmVjdl9idWZfbGVuKTsKIAotCWludCAoKnN0YXJ0X3N0cmVhbSkgKHN0cnVjdCBhczEwMl9kZXZfdCAqZGV2KTsKLQl2b2lkICgqc3RvcF9zdHJlYW0pIChzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldik7CisJaW50ICgqc3RhcnRfc3RyZWFtKShzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldik7CisJdm9pZCAoKnN0b3Bfc3RyZWFtKShzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldik7CiAKLQlpbnQgKCpyZXNldF90YXJnZXQpIChzdHJ1Y3QgYXMxMHhfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXApOworCWludCAoKnJlc2V0X3RhcmdldCkoc3RydWN0IGFzMTB4X2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwKTsKIAogCWludCAoKnJlYWRfd3JpdGUpKHN0cnVjdCBhczEweF9idXNfYWRhcHRlcl90ICpidXNfYWRhcCwgdWludDhfdCBtb2RlLAogCQkJICB1aW50MzJfdCByZF9hZGRyLCB1aW50MTZfdCByZF9sZW4sCiAJCQkgIHVpbnQzMl90IHdyX2FkZHIsIHVpbnQxNl90IHdyX2xlbik7CiAKLQlpbnQgKCphczEwMl9yZWFkX2VwMikgKHN0cnVjdCBhczEweF9idXNfYWRhcHRlcl90ICpidXNfYWRhcCwKKwlpbnQgKCphczEwMl9yZWFkX2VwMikoc3RydWN0IGFzMTB4X2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwLAogCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnJlY3ZfYnVmLAogCQkJICAgICAgIGludCByZWN2X2J1Zl9sZW4pOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L2N4ZDIwOTkuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L2N4ZDIwOTkuYwppbmRleCA2Y2I3NGRhLi5hMmE1MTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9jeGQyMDk5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2N4ZDIwOTkvY3hkMjA5OS5jCkBAIC0zMjksMTEgKzMyOSwxNCBAQAogCQkJYnJlYWs7CiAKICNpZiAwCi0JCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgwOSwgMHg0RCk7IC8qIElucHV0IE1vZGUgQywgQllQYXNzIFNlcmlhbCwgVElWQUwgPSBsb3csIE1TQiAqLworCQkvKiBJbnB1dCBNb2RlIEMsIEJZUGFzcyBTZXJpYWwsIFRJVkFMID0gbG93LCBNU0IgKi8KKwkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDA5LCAweDREKTsKIAkJaWYgKHN0YXR1cyA8IDApCiAJCQlicmVhazsKICNlbmRpZgotCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MEEsIDB4QTcpOyAvKiBUT1NUUlQgPSA4LCBNb2RlIEIgKGdhdGVkIGNsb2NrKSwgZmFsbGluZyBFZGdlLCBTZXJpYWwsIFBPTD1ISUdILCBNU0IgKi8KKwkJLyogVE9TVFJUID0gOCwgTW9kZSBCIChnYXRlZCBjbG9jayksIGZhbGxpbmcgRWRnZSwKKwkJICogU2VyaWFsLCBQT0w9SElHSCwgTVNCICovCisJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgwQSwgMHhBNyk7CiAJCWlmIChzdGF0dXMgPCAwKQogCQkJYnJlYWs7CiAKQEAgLTU4OSw3ICs1OTIsNyBAQAogCQlyZWFkX3JlZyhjaSwgMHgwMSwgJnNsb3RzdGF0KTsKIAkJaWYgKCEoMiZzbG90c3RhdCkpIHsKIAkJCWlmICghY2ktPnNsb3Rfc3RhdCkgewotCQkJCWNpLT5zbG90X3N0YXQgfD0gRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUFJFU0VOVDsKKwkJCQljaS0+c2xvdF9zdGF0ID0gRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUFJFU0VOVDsKIAkJCQl3cml0ZV9yZWdtKGNpLCAweDAzLCAweDA4LCAweDA4KTsKIAkJCX0KIApAQCAtNjAxLDcgKzYwNCw4IEBACiAJCQkJY2ktPnJlYWR5ID0gMDsKIAkJCX0KIAkJfQotCQlpZiAoaXN0YXQmOCAmJiBjaS0+c2xvdF9zdGF0ID09IERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1BSRVNFTlQpIHsKKwkJaWYgKGlzdGF0JjggJiYKKwkJICAgIGNpLT5zbG90X3N0YXQgPT0gRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUFJFU0VOVCkgewogCQkJY2ktPnJlYWR5ID0gMTsKIAkJCWNpLT5zbG90X3N0YXQgfD0gRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUkVBRFk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvdnBmZV92aWRlby5oIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS92cGZlX3ZpZGVvLmgKaW5kZXggZGYwYWVlYy4uY2E5YTcwMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvdnBmZV92aWRlby5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvdnBmZV92aWRlby5oCkBAIC0zMiw3ICszMiw3IEBACiAgKgkJaWYgdGhlcmUgd2FzIG5vIGJ1ZmZlciBwcmV2aW91c2x5IHF1ZXVlZC4KICAqLwogc3RydWN0IHZwZmVfdmlkZW9fb3BlcmF0aW9ucyB7Ci0JaW50KCpxdWV1ZSkgKHN0cnVjdCB2cGZlX2RldmljZSAqdnBmZV9kZXYsIHVuc2lnbmVkIGxvbmcgYWRkcik7CisJaW50ICgqcXVldWUpKHN0cnVjdCB2cGZlX2RldmljZSAqdnBmZV9kZXYsIHVuc2lnbmVkIGxvbmcgYWRkcik7CiB9OwogCiBlbnVtIHZwZmVfcGlwZWxpbmVfc3RyZWFtX3N0YXRlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kdDMxNTV2NGwvZHQzMTU1djRsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZHQzMTU1djRsL2R0MzE1NXY0bC5jCmluZGV4IGU3MjllNTIuLjk3ZTdhOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kdDMxNTV2NGwvZHQzMTU1djRsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2R0MzE1NXY0bC9kdDMxNTV2NGwuYwpAQCAtMjk5LDcgKzI5OSw3IEBACiAgKgllbmQgZHJpdmVyLXNwZWNpZmljIGNhbGxiYWNrcwogICovCiAKLWNvbnN0IHN0cnVjdCB2YjJfb3BzIHFfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2YjJfb3BzIHFfb3BzID0gewogCS5xdWV1ZV9zZXR1cCA9IGR0MzE1NV9xdWV1ZV9zZXR1cCwKIAkud2FpdF9wcmVwYXJlID0gZHQzMTU1X3dhaXRfcHJlcGFyZSwKIAkud2FpdF9maW5pc2ggPSBkdDMxNTVfd2FpdF9maW5pc2gsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy1sb2FkZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LWxvYWRlci5jCmluZGV4IGVlY2IxZjIuLjQ5MWQwZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LWxvYWRlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LWxvYWRlci5jCkBAIC0yOCw3ICsyOCw3IEBACiAJY29uc3QgY2hhciAqIGNvbnN0IGZ3X25hbWUyOwogfTsKIAotc3RydWN0IGZ3X2NvbmZpZyBmd19jb25maWdzW10gPSB7CitzdGF0aWMgc3RydWN0IGZ3X2NvbmZpZyBmd19jb25maWdzW10gPSB7CiAJeyAweDE5NDMsIDB4YTI1MCwgImdvNzAwNy9zMjI1MC0xLmZ3IiwgImdvNzAwNy9zMjI1MC0yLmZ3IiB9LAogCXsgMHgwOTNiLCAweGEwMDIsICJnbzcwMDcvcHgtbTQwMnUuZnciLCBOVUxMIH0sCiAJeyAweDA5M2IsIDB4YTAwNCwgImdvNzAwNy9weC10djQwMnUuZnciLCBOVUxMIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy12NGwyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy12NGwyLmMKaW5kZXggZWRjNTJlMi4uYmRmNDE0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9nbzcwMDctdjRsMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LXY0bDIuYwpAQCAtNDMzLDcgKzQzMyw4IEBACiAJcmV0dXJuIHNldF9jYXB0dXJlX3NpemUoZ28sIGZtdCwgMCk7CiB9CiAKLXN0YXRpYyBpbnQgZ283MDA3X3F1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnEsIGNvbnN0IHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10LAorc3RhdGljIGludCBnbzcwMDdfcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqcSwKKwkJY29uc3Qgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQsCiAJCXVuc2lnbmVkIGludCAqbnVtX2J1ZmZlcnMsIHVuc2lnbmVkIGludCAqbnVtX3BsYW5lcywKIAkJdW5zaWduZWQgaW50IHNpemVzW10sIHZvaWQgKmFsbG9jX2N0eHNbXSkKIHsKQEAgLTczNyw3ICs3MzgsOCBAQAogCiAJaWYgKGEtPmluZGV4ID49IGdvLT5ib2FyZF9pbmZvLT5udW1fYXVkX2lucHV0cykKIAkJcmV0dXJuIC1FSU5WQUw7Ci0Jc3RybGNweShhLT5uYW1lLCBnby0+Ym9hcmRfaW5mby0+YXVkX2lucHV0c1thLT5pbmRleF0ubmFtZSwgc2l6ZW9mKGEtPm5hbWUpKTsKKwlzdHJsY3B5KGEtPm5hbWUsIGdvLT5ib2FyZF9pbmZvLT5hdWRfaW5wdXRzW2EtPmluZGV4XS5uYW1lLAorCQlzaXplb2YoYS0+bmFtZSkpOwogCWEtPmNhcGFiaWxpdHkgPSBWNEwyX0FVRENBUF9TVEVSRU87CiAJcmV0dXJuIDA7CiB9CkBAIC03NDcsMTIgKzc0OSwxNCBAQAogCXN0cnVjdCBnbzcwMDcgKmdvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWEtPmluZGV4ID0gZ28tPmF1ZF9pbnB1dDsKLQlzdHJsY3B5KGEtPm5hbWUsIGdvLT5ib2FyZF9pbmZvLT5hdWRfaW5wdXRzW2dvLT5hdWRfaW5wdXRdLm5hbWUsIHNpemVvZihhLT5uYW1lKSk7CisJc3RybGNweShhLT5uYW1lLCBnby0+Ym9hcmRfaW5mby0+YXVkX2lucHV0c1tnby0+YXVkX2lucHV0XS5uYW1lLAorCQlzaXplb2YoYS0+bmFtZSkpOwogCWEtPmNhcGFiaWxpdHkgPSBWNEwyX0FVRENBUF9TVEVSRU87CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdmlkaW9jX3NfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBjb25zdCBzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKK3N0YXRpYyBpbnQgdmlkaW9jX3NfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCWNvbnN0IHN0cnVjdCB2NGwyX2F1ZGlvICphKQogewogCXN0cnVjdCBnbzcwMDcgKmdvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIApAQCAtNzYwLDcgKzc2NCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCWdvLT5hdWRfaW5wdXQgPSBhLT5pbmRleDsKIAl2NGwyX3N1YmRldl9jYWxsKGdvLT5zZF9hdWRpbywgYXVkaW8sIHNfcm91dGluZywKLQkJCWdvLT5ib2FyZF9pbmZvLT5hdWRfaW5wdXRzW2dvLT5hdWRfaW5wdXRdLmF1ZGlvX2lucHV0LCAwLCAwKTsKKwkJZ28tPmJvYXJkX2luZm8tPmF1ZF9pbnB1dHNbZ28tPmF1ZF9pbnB1dF0uYXVkaW9faW5wdXQsIDAsIDApOwogCXJldHVybiAwOwogfQogCkBAIC05NjAsOCArOTY0LDEwIEBACiAJCQlWNEwyX01QRUdfVklERU9fQVNQRUNUXzF4MSk7CiAJY3RybCA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgTlVMTCwKIAkJCVY0TDJfQ0lEX0pQRUdfQUNUSVZFX01BUktFUiwgMCwKLQkJCVY0TDJfSlBFR19BQ1RJVkVfTUFSS0VSX0RRVCB8IFY0TDJfSlBFR19BQ1RJVkVfTUFSS0VSX0RIVCwgMCwKLQkJCVY0TDJfSlBFR19BQ1RJVkVfTUFSS0VSX0RRVCB8IFY0TDJfSlBFR19BQ1RJVkVfTUFSS0VSX0RIVCk7CisJCQlWNEwyX0pQRUdfQUNUSVZFX01BUktFUl9EUVQgfAorCQkJVjRMMl9KUEVHX0FDVElWRV9NQVJLRVJfREhULCAwLAorCQkJVjRMMl9KUEVHX0FDVElWRV9NQVJLRVJfRFFUIHwKKwkJCVY0TDJfSlBFR19BQ1RJVkVfTUFSS0VSX0RIVCk7CiAJaWYgKGN0cmwpCiAJCWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1JFQURfT05MWTsKIAlpZiAoaGRsLT5lcnJvcikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9zbmQtZ283MDA3LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3NuZC1nbzcwMDcuYwppbmRleCAxNmRkNjQ5Li45ZWIyYTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3NuZC1nbzcwMDcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3NuZC1nbzcwMDcuYwpAQCAtMjQ1LDggKzI0NSw4IEBACiAJc3Bpbl9sb2NrX2luaXQoJmdvc25kLT5sb2NrKTsKIAlnb3NuZC0+aHdfcHRyID0gZ29zbmQtPndfaWR4ID0gZ29zbmQtPmF2YWlsID0gMDsKIAlnb3NuZC0+Y2FwdHVyaW5nID0gMDsKLQlyZXQgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsCi0JCQkgICAgICAmZ29zbmQtPmNhcmQpOworCXJldCA9IHNuZF9jYXJkX25ldyhnby0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwKKwkJCSAgICZnb3NuZC0+Y2FyZCk7CiAJaWYgKHJldCA8IDApIHsKIAkJa2ZyZWUoZ29zbmQpOwogCQlyZXR1cm4gcmV0OwpAQCAtMjU3LDcgKzI1Nyw2IEBACiAJCWtmcmVlKGdvc25kKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0Jc25kX2NhcmRfc2V0X2Rldihnb3NuZC0+Y2FyZCwgZ28tPmRldik7CiAJcmV0ID0gc25kX3BjbV9uZXcoZ29zbmQtPmNhcmQsICJnbzcwMDciLCAwLCAwLCAxLCAmZ29zbmQtPnBjbSk7CiAJaWYgKHJldCA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShnb3NuZC0+Y2FyZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2lnb3JwbHVndXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2lnb3JwbHVndXNiLmMKaW5kZXggZjJkY2M0YS4uZjUwOGExMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19pZ29ycGx1Z3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaWdvcnBsdWd1c2IuYwpAQCAtNjIsNyArNjIsNyBAQAogCiAvKiBkZWJ1Z2dpbmcgc3VwcG9ydCAqLwogI2lmZGVmIENPTkZJR19VU0JfREVCVUcKLXN0YXRpYyBib29sIGRlYnVnID0gMTsKK3N0YXRpYyBib29sIGRlYnVnID0gdHJ1ZTsKICNlbHNlCiBzdGF0aWMgYm9vbCBkZWJ1ZzsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19pbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2ltb24uYwppbmRleCBmMmQzOTZjLi5hNWI2MmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2ltb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2ltb24uYwpAQCAtOTQzLDEzICs5NDMsMTcgQEAKIAkJdXNiX2ZyZWVfdXJiKHR4X3VyYik7CiAJY2FzZSA2OgogCQl1c2JfZnJlZV91cmIocnhfdXJiKTsKKwkJLyogZmFsbC10aHJvdWdoICovCiAJY2FzZSA1OgogCQlpZiAocmJ1ZikKIAkJCWxpcmNfYnVmZmVyX2ZyZWUocmJ1Zik7CisJCS8qIGZhbGwtdGhyb3VnaCAqLwogCWNhc2UgNDoKIAkJa2ZyZWUocmJ1Zik7CisJCS8qIGZhbGwtdGhyb3VnaCAqLwogCWNhc2UgMzoKIAkJa2ZyZWUoZHJpdmVyKTsKKwkJLyogZmFsbC10aHJvdWdoICovCiAJY2FzZSAyOgogCQlrZnJlZShjb250ZXh0KTsKIAkJY29udGV4dCA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3BhcmFsbGVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3BhcmFsbGVsLmMKaW5kZXggMGI1ODk4OS4uNjJmNTEzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19wYXJhbGxlbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfcGFyYWxsZWwuYwpAQCAtNjgsMjkgKzY4LDI5IEBACiBzdGF0aWMgYm9vbCBkZWJ1ZzsKIHN0YXRpYyBib29sIGNoZWNrX3BzZWxlY2Q7CiAKLXVuc2lnbmVkIGludCBpcnEgPSBMSVJDX0lSUTsKLXVuc2lnbmVkIGludCBpbyA9IExJUkNfUE9SVDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXJxID0gTElSQ19JUlE7CitzdGF0aWMgdW5zaWduZWQgaW50IGlvID0gTElSQ19QT1JUOwogI2lmZGVmIExJUkNfVElNRVIKLXVuc2lnbmVkIGludCB0aW1lcjsKLXVuc2lnbmVkIGludCBkZWZhdWx0X3RpbWVyID0gTElSQ19USU1FUjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGltZXI7CitzdGF0aWMgdW5zaWduZWQgaW50IGRlZmF1bHRfdGltZXIgPSBMSVJDX1RJTUVSOwogI2VuZGlmCiAKICNkZWZpbmUgUkJVRl9TSVpFICgyNTYpIC8qIHRoaXMgbXVzdCBiZSBhIHBvd2VyIG9mIDIgbGFyZ2VyIHRoYW4gMSAqLwogCiBzdGF0aWMgaW50IHJidWZbUkJVRl9TSVpFXTsKIAotREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobGlyY193YWl0KTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChsaXJjX3dhaXQpOwogCi11bnNpZ25lZCBpbnQgcnB0cjsKLXVuc2lnbmVkIGludCB3cHRyOwotdW5zaWduZWQgaW50IGxvc3RfaXJxczsKLWludCBpc19vcGVuOworc3RhdGljIHVuc2lnbmVkIGludCBycHRyOworc3RhdGljIHVuc2lnbmVkIGludCB3cHRyOworc3RhdGljIHVuc2lnbmVkIGludCBsb3N0X2lycXM7CitzdGF0aWMgaW50IGlzX29wZW47CiAKLXN0cnVjdCBwYXJwb3J0ICpwcG9ydDsKLXN0cnVjdCBwYXJkZXZpY2UgKnBwZGV2aWNlOwotaW50IGlzX2NsYWltZWQ7CitzdGF0aWMgc3RydWN0IHBhcnBvcnQgKnBwb3J0Oworc3RhdGljIHN0cnVjdCBwYXJkZXZpY2UgKnBwZGV2aWNlOworc3RhdGljIGludCBpc19jbGFpbWVkOwogCi11bnNpZ25lZCBpbnQgdHhfbWFzayA9IDE7CitzdGF0aWMgdW5zaWduZWQgaW50IHR4X21hc2sgPSAxOwogCiAvKioqIEludGVybmFsIEZ1bmN0aW9ucyAqKiovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2FzZW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2FzZW0uYwppbmRleCBkMjQ0NWZkLi44MWY5MGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3Nhc2VtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zYXNlbS5jCkBAIC03NCw3ICs3NCw3IEBACiBzdGF0aWMgaW50IHZmZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKIHN0YXRpYyBsb25nIHZmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBzdGF0aWMgaW50IHZmZF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgc3NpemVfdCB2ZmRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKK3N0YXRpYyBzc2l6ZV90IHZmZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCQlzaXplX3Qgbl9ieXRlcywgbG9mZl90ICpwb3MpOwogCiAvKiBMSVJDIGRyaXZlciBmdW5jdGlvbiBwcm90b3R5cGVzICovCkBAIC0xMjAsNyArMTIwLDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZmZF9mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbgkJPSAmdmZkX29wZW4sCi0JLndyaXRlCQk9ICZ2ZmRfd3JpdGUsCisJLndyaXRlCQk9IHZmZF93cml0ZSwKIAkudW5sb2NrZWRfaW9jdGwJPSAmdmZkX2lvY3RsLAogCS5yZWxlYXNlCT0gJnZmZF9jbG9zZSwKIAkubGxzZWVrCQk9IG5vb3BfbGxzZWVrLApAQCAtMzYwLDcgKzM2MCw3IEBACiAgKiBhbmQgcmVxdWlyZXMgZGF0YSBpbiA5IGNvbnNlY3V0aXZlIFVTQiBpbnRlcnJ1cHQgcGFja2V0cywKICAqIGVhY2ggcGFja2V0IGNhcnJ5aW5nIDggYnl0ZXMuCiAgKi8KLXN0YXRpYyBzc2l6ZV90IHZmZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLAorc3RhdGljIHNzaXplX3QgdmZkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQkJCXNpemVfdCBuX2J5dGVzLCBsb2ZmX3QgKnBvcykKIHsKIAlpbnQgaTsKQEAgLTM4OSw3ICszODksNyBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JZGF0YV9idWYgPSBtZW1kdXBfdXNlcihidWYsIG5fYnl0ZXMpOworCWRhdGFfYnVmID0gbWVtZHVwX3VzZXIoKHZvaWQgY29uc3QgX191c2VyICopYnVmLCBuX2J5dGVzKTsKIAlpZiAoSVNfRVJSKGRhdGFfYnVmKSkgewogCQlyZXR2YWwgPSBQVFJfRVJSKGRhdGFfYnVmKTsKIAkJZ290byBleGl0OwpAQCAtODY1LDE1ICs4NjUsMjAgQEAKIAkJCXVzYl9mcmVlX3VyYih0eF91cmIpOwogCWNhc2UgNjoKIAkJdXNiX2ZyZWVfdXJiKHJ4X3VyYik7CisJCS8qIGZhbGwtdGhyb3VnaCAqLwogCWNhc2UgNToKIAkJbGlyY19idWZmZXJfZnJlZShyYnVmKTsKKwkJLyogZmFsbC10aHJvdWdoICovCiAJY2FzZSA0OgogCQlrZnJlZShyYnVmKTsKKwkJLyogZmFsbC10aHJvdWdoICovCiAJY2FzZSAzOgogCQlrZnJlZShkcml2ZXIpOworCQkvKiBmYWxsLXRocm91Z2ggKi8KIAljYXNlIDI6CiAJCWtmcmVlKGNvbnRleHQpOwogCQljb250ZXh0ID0gTlVMTDsKKwkJLyogZmFsbC10aHJvdWdoICovCiAJY2FzZSAxOgogCQlpZiAocmV0dmFsID09IDApCiAJCQlyZXR2YWwgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL21zaTMxMDEvc2RyLW1zaTMxMDEuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9tc2kzMTAxL3Nkci1tc2kzMTAxLmMKaW5kZXggNGMzYmY3Ny4uNWEwNDAwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL21zaTMxMDEvc2RyLW1zaTMxMDEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbXNpMzEwMS9zZHItbXNpMzEwMS5jCkBAIC00MTEsNyArNDExLDcgQEAKIAl1bnNpZ25lZCBpbnQgdmJfZnVsbDsgLyogdmIgaXMgZnVsbCBhbmQgcGFja2V0cyBkcm9wcGVkICovCiAKIAlzdHJ1Y3QgdXJiICp1cmJzW01BWF9JU09fQlVGU107Ci0JaW50ICgqY29udmVydF9zdHJlYW0pIChzdHJ1Y3QgbXNpMzEwMV9zdGF0ZSAqcywgdTMyICpkc3QsIHU4ICpzcmMsCisJaW50ICgqY29udmVydF9zdHJlYW0pKHN0cnVjdCBtc2kzMTAxX3N0YXRlICpzLCB1MzIgKmRzdCwgdTggKnNyYywKIAkJCXVuc2lnbmVkIGludCBzcmNfbGVuKTsKIAogCS8qIENvbnRyb2xzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDI0eHgvdGNtODI1eC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXAyNHh4L3RjbTgyNXguYwppbmRleCBiMWFlOGU5Li5mNGRkMzJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDI0eHgvdGNtODI1eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwMjR4eC90Y204MjV4LmMKQEAgLTI0OSwxMSArMjQ5LDExIEBACiB9OwogCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGNtODI1eF9yZWcgKnRjbTgyNXhfc2l6X3JlZ1tOVU1fSU1BR0VfU0laRVNdID0KLXsgJnN1YnFjaWYsICZxcXZnYSwgJnFjaWYsICZxdmdhLCAmY2lmLCAmdmdhIH07CitzdGF0aWMgY29uc3Qgc3RydWN0IHRjbTgyNXhfcmVnICp0Y204MjV4X3Npel9yZWdbTlVNX0lNQUdFX1NJWkVTXSA9IHsKKwkmc3VicWNpZiwgJnFxdmdhLCAmcWNpZiwgJnF2Z2EsICZjaWYsICZ2Z2EgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB0Y204MjV4X3JlZyAqdGNtODI1eF9mbXRfcmVnW05VTV9QSVhFTF9GT1JNQVRTXSA9Ci17ICZ5dXY0MjIsICZyZ2I1NjUgfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGNtODI1eF9yZWcgKnRjbTgyNXhfZm10X3JlZ1tOVU1fUElYRUxfRk9STUFUU10gPSB7CisJJnl1djQyMiwgJnJnYjU2NSB9OwogCiAvKgogICogUmVhZCBhIHZhbHVlIGZyb20gYSByZWdpc3RlciBpbiBhbiBUQ004MjVYIHNlbnNvciBkZXZpY2UuICBUaGUgdmFsdWUgaXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwMjR4eC90Y204MjV4LmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDI0eHgvdGNtODI1eC5oCmluZGV4IGUyZDFiY2QuLjk5NzBmYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwMjR4eC90Y204MjV4LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXAyNHh4L3RjbTgyNXguaApAQCAtMTc4LDcgKzE3OCw3IEBACiAJLyogU2V0IHBvd2VyIHN0YXRlLCB6ZXJvIGlzIG9mZiwgbm9uLXplcm8gaXMgb24uICovCiAJaW50ICgqcG93ZXJfc2V0KShpbnQgcG93ZXIpOwogCS8qIERlZmF1bHQgcmVnaXN0ZXJzIHdyaXR0ZW4gYWZ0ZXIgcG93ZXItb24gb3IgcmVzZXQuICovCi0JY29uc3Qgc3RydWN0IHRjbTgyNXhfcmVnICooKmRlZmF1bHRfcmVncykodm9pZCk7CisJY29uc3Qgc3RydWN0IHRjbTgyNXhfcmVnICogKCpkZWZhdWx0X3JlZ3MpKHZvaWQpOwogCWludCAoKm5lZWRzX3Jlc2V0KShzdHJ1Y3QgdjRsMl9pbnRfZGV2aWNlICpzLCB2b2lkICpidWYsCiAJCQkgICBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpmbXQpOwogCWludCAoKmlmcGFybSkoc3RydWN0IHY0bDJfaWZwYXJtICpwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9jb3JlLmMKaW5kZXggMmNiNDRkZS4uNzFmNTk0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9jb3JlLmMKQEAgLTE1OCw4ICsxNTgsOCBAQAogCiAJY2FtLT5uYnVmZmVycyA9IGNvdW50OwogCXdoaWxlIChjYW0tPm5idWZmZXJzID4gMCkgewotCQlpZiAoKGJ1ZmYgPSB2bWFsbG9jXzMyX3VzZXIoY2FtLT5uYnVmZmVycyAqCi0JCQkJCSAgICBQQUdFX0FMSUdOKGltYWdlc2l6ZSkpKSkKKwkJYnVmZiA9IHZtYWxsb2NfMzJfdXNlcihjYW0tPm5idWZmZXJzICogUEFHRV9BTElHTihpbWFnZXNpemUpKTsKKwkJaWYgKGJ1ZmYpCiAJCQlicmVhazsKIAkJY2FtLT5uYnVmZmVycy0tOwogCX0KQEAgLTExMjEsNyArMTEyMSw4IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlmICgodmFsID0gc245YzEwMl9yZWFkX3JlZyhjYW0sIGNhbS0+c3lzZnMucmVnKSkgPCAwKSB7CisJdmFsID0gc245YzEwMl9yZWFkX3JlZyhjYW0sIGNhbS0+c3lzZnMucmVnKTsKKwlpZiAodmFsIDwgMCkgewogCQltdXRleF91bmxvY2soJnNuOWMxMDJfc3lzZnNfbG9jayk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTEyNTYsNyArMTI1Nyw4IEBACiAJCXJldHVybiAtRU5PU1lTOwogCX0KIAotCWlmICgodmFsID0gc245YzEwMl9pMmNfcmVhZChjYW0sIGNhbS0+c3lzZnMuaTJjX3JlZykpIDwgMCkgeworCXZhbCA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCBjYW0tPnN5c2ZzLmkyY19yZWcpOworCWlmICh2YWwgPCAwKSB7CiAJCW11dGV4X3VubG9jaygmc245YzEwMl9zeXNmc19sb2NrKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTQ0MCwyNyArMTQ0MiwzNSBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICYoY2FtLT52NGxkZXYtPmRldik7CiAJaW50IGVyciA9IDA7CiAKLQlpZiAoKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9yZWcpKSkKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVnKTsKKwlpZiAoZXJyKQogCQlnb3RvIGVycl9vdXQ7Ci0JaWYgKChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdmFsKSkpCisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3ZhbCk7CisJaWYgKGVycikKIAkJZ290byBlcnJfcmVnOwotCWlmICgoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2ZyYW1lX2hlYWRlcikpKQorCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9mcmFtZV9oZWFkZXIpOworCWlmIChlcnIpCiAJCWdvdG8gZXJyX3ZhbDsKIAogCWlmIChjYW0tPnNlbnNvci5zeXNmc19vcHMpIHsKLQkJaWYgKChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfaTJjX3JlZykpKQorCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfaTJjX3JlZyk7CisJCWlmIChlcnIpCiAJCQlnb3RvIGVycl9mcmFtZV9oZWFkZXI7Ci0JCWlmICgoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2kyY192YWwpKSkKKwkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2kyY192YWwpOworCQlpZiAoZXJyKQogCQkJZ290byBlcnJfaTJjX3JlZzsKIAl9CiAKIAlpZiAoY2FtLT5icmlkZ2UgPT0gQlJJREdFX1NOOUMxMDEgfHwgY2FtLT5icmlkZ2UgPT0gQlJJREdFX1NOOUMxMDIpIHsKLQkJaWYgKChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZ3JlZW4pKSkKKwkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2dyZWVuKTsKKwkJaWYgKGVycikKIAkJCWdvdG8gZXJyX2kyY192YWw7CiAJfSBlbHNlIHsKLQkJaWYgKChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmx1ZSkpKQorCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmx1ZSk7CisJCWlmIChlcnIpCiAJCQlnb3RvIGVycl9pMmNfdmFsOwotCQlpZiAoKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9yZWQpKSkKKwkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3JlZCk7CisJCWlmIChlcnIpCiAJCQlnb3RvIGVycl9ibHVlOwogCX0KIApAQCAtMTY4NCwxMSArMTY5NCwxMyBAQAogCWVsc2UKIAkJREJHKDMsICJVbmNvbXByZXNzZWQgdmlkZW8gZm9ybWF0IGlzIGFjdGl2ZSIpOwogCi0JaWYgKHMtPnNldF9jcm9wKQotCQlpZiAoKGVyciA9IHMtPnNldF9jcm9wKGNhbSwgcmVjdCkpKSB7CisJaWYgKHMtPnNldF9jcm9wKSB7CisJCWVyciA9IHMtPnNldF9jcm9wKGNhbSwgcmVjdCk7CisJCWlmIChlcnIpIHsKIAkJCURCRygzLCAic2V0X2Nyb3AoKSBmYWlsZWQiKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KKwl9CiAKIAlpZiAocy0+c2V0X2N0cmwpIHsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocy0+cWN0cmwpOyBpKyspCkBAIC0xODM1LDcgKzE4NDcsOCBAQAogCQljYW0tPnN0YXRlICY9IH5ERVZfTUlTQ09ORklHVVJFRDsKIAl9CiAKLQlpZiAoKGVyciA9IHNuOWMxMDJfc3RhcnRfdHJhbnNmZXIoY2FtKSkpCisJZXJyID0gc245YzEwMl9zdGFydF90cmFuc2ZlcihjYW0pOworCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCiAJZmlscC0+cHJpdmF0ZV9kYXRhID0gY2FtOwpAQCAtMjMwOCw3ICsyMzIxLDggQEAKIAl9CiAJaWYgKGkgPT0gQVJSQVlfU0laRShzLT5xY3RybCkpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICgoZXJyID0gcy0+c2V0X2N0cmwoY2FtLCAmY3RybCkpKQorCWVyciA9IHMtPnNldF9jdHJsKGNhbSwgJmN0cmwpOworCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKIAlzLT5fcWN0cmxbaV0uZGVmYXVsdF92YWx1ZSA9IGN0cmwudmFsdWU7CkBAIC0yNDE2LDkgKzI0MzAsMTEgQEAKIAl9IGVsc2UKIAkJc2NhbGUgPSAxOwogCi0JaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PTikKLQkJaWYgKChlcnIgPSBzbjljMTAyX3N0cmVhbV9pbnRlcnJ1cHQoY2FtKSkpCisJaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PTikgeworCQllcnIgPSBzbjljMTAyX3N0cmVhbV9pbnRlcnJ1cHQoY2FtKTsKKwkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CisJfQogCiAJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZjcm9wLCBzaXplb2YoY3JvcCkpKSB7CiAJCWNhbS0+c3RyZWFtID0gc3RyZWFtOwpAQCAtMjY3Miw5ICsyNjg4LDExIEBACiAJCQkJcmV0dXJuIC1FQlVTWTsKIAkJCX0KIAotCWlmIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fT04pCi0JCWlmICgoZXJyID0gc245YzEwMl9zdHJlYW1faW50ZXJydXB0KGNhbSkpKQorCWlmIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fT04pIHsKKwkJZXJyID0gc245YzEwMl9zdHJlYW1faW50ZXJydXB0KGNhbSk7CisJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOworCX0KIAogCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZm9ybWF0LCBzaXplb2YoZm9ybWF0KSkpIHsKIAkJY2FtLT5zdHJlYW0gPSBzdHJlYW07CkBAIC0yNzQ2LDkgKzI3NjQsMTEgQEAKIAlpZiAoamMucXVhbGl0eSAhPSAwICYmIGpjLnF1YWxpdHkgIT0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX09OKQotCQlpZiAoKGVyciA9IHNuOWMxMDJfc3RyZWFtX2ludGVycnVwdChjYW0pKSkKKwlpZiAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX09OKSB7CisJCWVyciA9IHNuOWMxMDJfc3RyZWFtX2ludGVycnVwdChjYW0pOworCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKKwl9CiAKIAllcnIgKz0gc245YzEwMl9zZXRfY29tcHJlc3Npb24oY2FtLCAmamMpOwogCWlmIChlcnIpIHsgLyogYXRvbWljLCBubyByb2xsYmFjayBpbiBpb2N0bCgpICovCkBAIC0yNzk0LDkgKzI4MTQsMTEgQEAKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAotCWlmIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fT04pCi0JCWlmICgoZXJyID0gc245YzEwMl9zdHJlYW1faW50ZXJydXB0KGNhbSkpKQorCWlmIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fT04pIHsKKwkJZXJyID0gc245YzEwMl9zdHJlYW1faW50ZXJydXB0KGNhbSk7CisJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOworCX0KIAogCXNuOWMxMDJfZW1wdHlfZnJhbWVxdWV1ZXMoY2FtKTsKIApAQCAtMjk3NCw5ICsyOTk2LDExIEBACiAJaWYgKHR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8IGNhbS0+aW8gIT0gSU9fTU1BUCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX09OKQotCQlpZiAoKGVyciA9IHNuOWMxMDJfc3RyZWFtX2ludGVycnVwdChjYW0pKSkKKwlpZiAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX09OKSB7CisJCWVyciA9IHNuOWMxMDJfc3RyZWFtX2ludGVycnVwdChjYW0pOworCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKKwl9CiAKIAlzbjljMTAyX2VtcHR5X2ZyYW1lcXVldWVzKGNhbSk7CiAKQEAgLTMyNTAsNyArMzI3NCw4IEBACiAJdW5zaWduZWQgaW50IGk7CiAJaW50IGVyciA9IDAsIHI7CiAKLQlpZiAoIShjYW0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UpLCBHRlBfS0VSTkVMKSkpCisJY2FtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuOWMxMDJfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjYW0pCiAJCXJldHVybiAtRU5PTUVNOwogCiAJY2FtLT51c2JkZXYgPSB1ZGV2OwpAQCAtMzI2MiwxMyArMzI4NywxNSBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JaWYgKCEoY2FtLT5jb250cm9sX2J1ZmZlciA9IGt6YWxsb2MoOCwgR0ZQX0tFUk5FTCkpKSB7CisJY2FtLT5jb250cm9sX2J1ZmZlciA9IGt6YWxsb2MoOCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjYW0tPmNvbnRyb2xfYnVmZmVyKSB7CiAJCURCRygxLCAia3phbGxvYygpIGZhaWxlZCIpOwogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JaWYgKCEoY2FtLT52NGxkZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKSkpIHsKKwljYW0tPnY0bGRldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOworCWlmICghY2FtLT52NGxkZXYpIHsKIAkJREJHKDEsICJ2aWRlb19kZXZpY2VfYWxsb2MoKSBmYWlsZWQiKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9odjcxMzFkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX2h2NzEzMWQuYwppbmRleCAyZGNlNWM5Li40NjgwNzIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX2h2NzEzMWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX2h2NzEzMWQuYwpAQCAtNTMsMjcgKzUzLDMyIEBACiAJCX0KIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMxKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMxKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSA9IDB4M2YgLSAoY3RybC0+dmFsdWUgJiAweDNmKTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMykpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMyk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgPSAweDNmIC0gKGN0cmwtPnZhbHVlICYgMHgzZik7CiAJCXJldHVybiAwOwogCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzIpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzIpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlID0gMHgzZiAtIChjdHJsLT52YWx1ZSAmIDB4M2YpOwogCQlyZXR1cm4gMDsKIAljYXNlIFNOOUMxMDJfVjRMMl9DSURfUkVTRVRfTEVWRUw6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMCkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMCk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHgzZjsKIAkJcmV0dXJuIDA7CiAJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX1BJWEVMX0JJQVNfVk9MVEFHRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDM0KSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDM0KTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDA3OwogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfaHY3MTMxci5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9odjcxMzFyLmMKaW5kZXggNDI5NTg4Ny4uMjZhOTExMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9odjcxMzFyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9odjcxMzFyLmMKQEAgLTE0MiwyNiArMTQyLDMxIEBACiB7CiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMwKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMwKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzEpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzEpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlID0gY3RybC0+dmFsdWUgJiAweDNmOwogCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMzKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMzKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSA9IGN0cmwtPnZhbHVlICYgMHgzZjsKIAkJcmV0dXJuIDA7CiAJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0U6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMikpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMik7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgPSBjdHJsLT52YWx1ZSAmIDB4M2Y7CiAJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfQkxBQ0tfTEVWRUw6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwMSkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwMSk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgPSAoY3RybC0+dmFsdWUgJiAweDA4KSA/IDEgOiAwOwogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfb3Y3NjMwLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX292NzYzMC5jCmluZGV4IDgwMzcxMmMuLmQzYTFiZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfb3Y3NjMwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9vdjc2MzAuYwpAQCAtMjYwLDcgKzI2MCw4IEBACiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDEwKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDEwKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgpAQCAtMjgwLDM3ICsyODEsNDQgQEAKIAkJYnJlYWs7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDAwKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDAwKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDNmOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0RPX1dISVRFX0JBTEFOQ0U6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwYykpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwYyk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHgzZjsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9XSElURU5FU1M6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwZCkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwZCk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHgzZjsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9BVVRPR0FJTjoKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDEzKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDEzKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDAxOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1ZGTElQOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4NzUpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4NzUpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlID0gKGN0cmwtPnZhbHVlICYgMHg4MCkgPyAxIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dBTU1BOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MTQpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MTQpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlID0gKGN0cmwtPnZhbHVlICYgMHgwMikgPyAxIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0JBTkRfRklMVEVSOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MmQpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MmQpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlID0gKGN0cmwtPnZhbHVlICYgMHgwMikgPyAxIDogMDsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX292NzY2MC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9vdjc2NjAuYwppbmRleCA3OTc3Nzk1Li41MzAxNTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX292NzY2MC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfb3Y3NjYwLmMKQEAgLTI3OCw0MSArMjc4LDQ5IEBACiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDEwKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDEwKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0RPX1dISVRFX0JBTEFOQ0U6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX3JlYWRfcmVnKGNhbSwgMHgwMikpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX3JlYWRfcmVnKGNhbSwgMHgwMik7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgPSAoY3RybC0+dmFsdWUgJiAweDA0KSA/IDEgOiAwOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9yZWFkX3JlZyhjYW0sIDB4MDUpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9yZWFkX3JlZyhjYW0sIDB4MDUpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4N2Y7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9yZWFkX3JlZyhjYW0sIDB4MDYpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9yZWFkX3JlZyhjYW0sIDB4MDYpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4N2Y7CiAJCWJyZWFrOwogCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9yZWFkX3JlZyhjYW0sIDB4MDcpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9yZWFkX3JlZyhjYW0sIDB4MDcpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4N2Y7CiAJCWJyZWFrOwogCWNhc2UgU045QzEwMl9WNEwyX0NJRF9CQU5EX0ZJTFRFUjoKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDNiKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDNiKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDA4OwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwMCkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwMCk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHgxZjsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9BVVRPR0FJTjoKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDEzKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDEzKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDAxOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfcGFzMTA2Yi5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9wYXMxMDZiLmMKaW5kZXggODFjZDk2OS4uNDdiZDgyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9wYXMxMDZiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9wYXMxMDZiLmMKQEAgLTYyLDMyICs2MiwzOCBAQAogCQl9CiAJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwYykpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwYyk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHgxZjsKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwOSkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwOSk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHgxZjsKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MGUpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MGUpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4MWY7CiAJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwZikpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwZik7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHgwNzsKIAkJcmV0dXJuIDA7CiAJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0U6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwYSkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwYSk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgPSAoY3RybC0+dmFsdWUgJiAweDFmKSA8PCAxOwogCQlyZXR1cm4gMDsKIAljYXNlIFNOOUMxMDJfVjRMMl9DSURfREFDX01BR05JVFVERToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDA4KSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDA4KTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweGY4OwogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfcGFzMjAyYmNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX3BhczIwMmJjYi5jCmluZGV4IDJlODZmZGMuLmNiZmFjYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfcGFzMjAyYmNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9wYXMyMDJiY2IuYwpAQCAtOTIsMjcgKzkyLDMyIEBACiAJCX0KIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDA5KSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDA5KTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDBmOwogCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDA3KSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDA3KTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDBmOwogCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgxMCkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgxMCk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHgxZjsKIAkJcmV0dXJuIDA7CiAJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0U6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwOCkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwOCk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHgwZjsKIAkJcmV0dXJuIDA7CiAJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0RBQ19NQUdOSVRVREU6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwYykpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwYyk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9zb2xvNngxMC1jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAtY29yZS5jCmluZGV4IDQ4MGI3YzQuLmY2NzA0NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9zb2xvNngxMC1jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLWNvcmUuYwpAQCAtNDAsNyArNDAsNyBAQAogTU9EVUxFX1ZFUlNJT04oU09MTzZYMTBfVkVSU0lPTik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXVuc2lnbmVkIHZpZGVvX25yID0gLTE7CitzdGF0aWMgdW5zaWduZWQgdmlkZW9fbnIgPSAtMTsKIG1vZHVsZV9wYXJhbSh2aWRlb19uciwgdWludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX25yLCAidmlkZW9YIHN0YXJ0IG51bWJlciwgLTEgaXMgYXV0b2RldGVjdCAoZGVmYXVsdCkiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLWc3MjMuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9zb2xvNngxMC1nNzIzLmMKaW5kZXggMWRiMThjNy4uNzRmMDM3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLWc3MjMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAtZzcyMy5jCkBAIC0zNjYsOCArMzY2LDkgQEAKIAkvKiBBbGxvd3MgZm9yIGVhc2llciBtYXBwaW5nIGJldHdlZW4gdmlkZW8gYW5kIGF1ZGlvICovCiAJc3ByaW50ZihuYW1lLCAiU29mdGxvZ2ljJWQiLCBzb2xvX2Rldi0+dmZkLT5udW0pOwogCi0JcmV0ID0gc25kX2NhcmRfY3JlYXRlKFNORFJWX0RFRkFVTFRfSURYMSwgbmFtZSwgVEhJU19NT0RVTEUsIDAsCi0JCQkgICAgICAmc29sb19kZXYtPnNuZF9jYXJkKTsKKwlyZXQgPSBzbmRfY2FyZF9uZXcoJnNvbG9fZGV2LT5wZGV2LT5kZXYsCisJCQkgICBTTkRSVl9ERUZBVUxUX0lEWDEsIG5hbWUsIFRISVNfTU9EVUxFLCAwLAorCQkJICAgJnNvbG9fZGV2LT5zbmRfY2FyZCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTM3Nyw3ICszNzgsNiBAQAogCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJTT0xPLTZ4MTAgQXVkaW8iKTsKIAlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgb24gJXMgSVJRICVkIiwgY2FyZC0+c2hvcnRuYW1lLAogCQlwY2lfbmFtZShzb2xvX2Rldi0+cGRldiksIHNvbG9fZGV2LT5wZGV2LT5pcnEpOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnNvbG9fZGV2LT5wZGV2LT5kZXYpOwogCiAJcmV0ID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBzb2xvX2RldiwgJm9wcyk7CiAJaWYgKHJldCA8IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAtdHcyOC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLXR3MjguYwppbmRleCBhZjY1ZWE2Li4zNmRhYTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAtdHcyOC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9zb2xvNngxMC10dzI4LmMKQEAgLTUxNiw3ICs1MTYsNyBAQAogc3RhdGljIHZvaWQgc2FhNzEyeF93cml0ZV9yZWdzKHN0cnVjdCBzb2xvX2RldiAqZGV2LCBjb25zdCB1aW50OF90ICp2YWxzLAogCQlpbnQgc3RhcnQsIGludCBuKQogewotCWZvciAoO3N0YXJ0IDwgbjsgc3RhcnQrKywgdmFscysrKSB7CisJZm9yICg7IHN0YXJ0IDwgbjsgc3RhcnQrKywgdmFscysrKSB7CiAJCS8qIFNraXAgcmVhZC1vbmx5IHJlZ2lzdGVycyAqLwogCQlzd2l0Y2ggKHN0YXJ0KSB7CiAJCS8qIGNhc2UgMHgwMCAuLi4gMHgyNTogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9zb2xvNngxMC12NGwyLWVuYy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLXY0bDItZW5jLmMKaW5kZXggY2U5ZTVhYS4uNWFlYjljMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLXY0bDItZW5jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLXY0bDItZW5jLmMKQEAgLTM5OSw4ICszOTksOCBAQAogCWlmIChzb2xvX2VuYy0+ZGVzY19jb3VudCA8PSAxKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiBzb2xvX3AybV9kbWFfZGVzYyhzb2xvX2Rldiwgc29sb19lbmMtPmRlc2NfaXRlbXMsIHNvbG9fZW5jLT5kZXNjX2RtYSwKLQkJCQkgc29sb19lbmMtPmRlc2NfY291bnQgLSAxKTsKKwlyZXR1cm4gc29sb19wMm1fZG1hX2Rlc2Moc29sb19kZXYsIHNvbG9fZW5jLT5kZXNjX2l0ZW1zLAorCQkJc29sb19lbmMtPmRlc2NfZG1hLCBzb2xvX2VuYy0+ZGVzY19jb3VudCAtIDEpOwogfQogCiAvKiBFeHRyYWN0IHZhbHVlcyBmcm9tIFZPUCBoZWFkZXIgLSBWRV9TVEFUVVN4eCAqLwpAQCAtNDcyLDggKzQ3Miw3IEBACiAJaWYgKHZiMl9wbGFuZV9zaXplKHZiLCAwKSA8IHZvcF9qcGVnX3NpemUodmgpICsgc29sb19lbmMtPmpwZWdfbGVuKQogCQlyZXR1cm4gLUVJTzsKIAotCWZyYW1lX3NpemUgPSAodm9wX2pwZWdfc2l6ZSh2aCkgKyBzb2xvX2VuYy0+anBlZ19sZW4gKyAoRE1BX0FMSUdOIC0gMSkpCi0JCSYgfihETUFfQUxJR04gLSAxKTsKKwlmcmFtZV9zaXplID0gQUxJR04odm9wX2pwZWdfc2l6ZSh2aCkgKyBzb2xvX2VuYy0+anBlZ19sZW4sIERNQV9BTElHTik7CiAJdmIyX3NldF9wbGFuZV9wYXlsb2FkKHZiLCAwLCB2b3BfanBlZ19zaXplKHZoKSArIHNvbG9fZW5jLT5qcGVnX2xlbik7CiAKIAkvKiBtYXkgZGlzY2FyZCBhbGwgcHJldmlvdXMgZGF0YSBpbiB2YnVmLT5zZ2wgKi8KQEAgLTUwNiwyMSArNTA1LDIyIEBACiAJCXJldHVybiAtRUlPOwogCiAJLyogSWYgdGhpcyBpcyBhIGtleSBmcmFtZSwgYWRkIGV4dHJhIGhlYWRlciAqLwotCXZiLT52NGwyX2J1Zi5mbGFncyAmPSB+KFY0TDJfQlVGX0ZMQUdfS0VZRlJBTUUgfCBWNEwyX0JVRl9GTEFHX1BGUkFNRSB8IFY0TDJfQlVGX0ZMQUdfQkZSQU1FKTsKKwl2Yi0+djRsMl9idWYuZmxhZ3MgJj0gfihWNEwyX0JVRl9GTEFHX0tFWUZSQU1FIHwgVjRMMl9CVUZfRkxBR19QRlJBTUUgfAorCQlWNEwyX0JVRl9GTEFHX0JGUkFNRSk7CiAJaWYgKCF2b3BfdHlwZSh2aCkpIHsKIAkJc2tpcCA9IHNvbG9fZW5jLT52b3BfbGVuOwogCQl2Yi0+djRsMl9idWYuZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19LRVlGUkFNRTsKLQkJdmIyX3NldF9wbGFuZV9wYXlsb2FkKHZiLCAwLCB2b3BfbXBlZ19zaXplKHZoKSArIHNvbG9fZW5jLT52b3BfbGVuKTsKKwkJdmIyX3NldF9wbGFuZV9wYXlsb2FkKHZiLCAwLCB2b3BfbXBlZ19zaXplKHZoKSArCisJCQlzb2xvX2VuYy0+dm9wX2xlbik7CiAJfSBlbHNlIHsKIAkJdmItPnY0bDJfYnVmLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfUEZSQU1FOwogCQl2YjJfc2V0X3BsYW5lX3BheWxvYWQodmIsIDAsIHZvcF9tcGVnX3NpemUodmgpKTsKIAl9CiAKIAkvKiBOb3cgZ2V0IHRoZSBhY3R1YWwgbXBlZyBwYXlsb2FkICovCi0JZnJhbWVfb2ZmID0gKHZvcF9tcGVnX29mZnNldCh2aCkgLSBTT0xPX01QNEVfRVhUX0FERFIoc29sb19kZXYpICsgc2l6ZW9mKCp2aCkpCi0JCSUgU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KTsKLQlmcmFtZV9zaXplID0gKHZvcF9tcGVnX3NpemUodmgpICsgc2tpcCArIChETUFfQUxJR04gLSAxKSkKLQkJJiB+KERNQV9BTElHTiAtIDEpOworCWZyYW1lX29mZiA9ICh2b3BfbXBlZ19vZmZzZXQodmgpIC0gU09MT19NUDRFX0VYVF9BRERSKHNvbG9fZGV2KSArCisJCXNpemVvZigqdmgpKSAlIFNPTE9fTVA0RV9FWFRfU0laRShzb2xvX2Rldik7CisJZnJhbWVfc2l6ZSA9IEFMSUdOKHZvcF9tcGVnX3NpemUodmgpICsgc2tpcCwgRE1BX0FMSUdOKTsKIAogCS8qIG1heSBkaXNjYXJkIGFsbCBwcmV2aW91cyBkYXRhIGluIHZidWYtPnNnbCAqLwogCWRtYV9tYXBfc2coJnNvbG9fZGV2LT5wZGV2LT5kZXYsIHZidWYtPnNnbCwgdmJ1Zi0+bmVudHMsCkBAIC01ODksNyArNTg5LDggQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc29sb19lbmMtPmF2X2xvY2ssIGZsYWdzKTsKIAkJZ290byB1bmxvY2s7CiAJfQotCXZiID0gbGlzdF9maXJzdF9lbnRyeSgmc29sb19lbmMtPnZpZHFfYWN0aXZlLCBzdHJ1Y3Qgc29sb192YjJfYnVmLCBsaXN0KTsKKwl2YiA9IGxpc3RfZmlyc3RfZW50cnkoJnNvbG9fZW5jLT52aWRxX2FjdGl2ZSwgc3RydWN0IHNvbG9fdmIyX2J1ZiwKKwkJbGlzdCk7CiAJbGlzdF9kZWwoJnZiLT5saXN0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb2xvX2VuYy0+YXZfbG9jaywgZmxhZ3MpOwogCkBAIC02NDUsNyArNjQ2LDggQEAKIAkJZW5jX2J1Zi52aCA9IHNvbG9fZGV2LT52aF9idWY7CiAKIAkJLyogU2FuaXR5IGNoZWNrICovCi0JCWlmICh2b3BfbXBlZ19vZmZzZXQoZW5jX2J1Zi52aCkgIT0gU09MT19NUDRFX0VYVF9BRERSKHNvbG9fZGV2KSArIG9mZikKKwkJaWYgKHZvcF9tcGVnX29mZnNldChlbmNfYnVmLnZoKSAhPQorCQkJU09MT19NUDRFX0VYVF9BRERSKHNvbG9fZGV2KSArIG9mZikKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChzb2xvX21vdGlvbl9kZXRlY3RlZChzb2xvX2VuYykpCkBAIC02ODAsOSArNjgyLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc29sb19lbmNfcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqcSwgY29uc3Qgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQsCi0JCQkgICB1bnNpZ25lZCBpbnQgKm51bV9idWZmZXJzLCB1bnNpZ25lZCBpbnQgKm51bV9wbGFuZXMsCi0JCQkgICB1bnNpZ25lZCBpbnQgc2l6ZXNbXSwgdm9pZCAqYWxsb2NfY3R4c1tdKQorc3RhdGljIGludCBzb2xvX2VuY19xdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICpxLAorCQkJCWNvbnN0IHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10LAorCQkJCXVuc2lnbmVkIGludCAqbnVtX2J1ZmZlcnMsCisJCQkJdW5zaWduZWQgaW50ICpudW1fcGxhbmVzLCB1bnNpZ25lZCBpbnQgc2l6ZXNbXSwKKwkJCQl2b2lkICphbGxvY19jdHhzW10pCiB7CiAJc2l6ZXNbMF0gPSBGUkFNRV9CVUZfU0laRTsKIAkqbnVtX3BsYW5lcyA9IDE7CkBAIC0xMTEyLDE0ICsxMTE2LDE1IEBACiAJCXNvbG9fZW5jLT5tb3Rpb25fdGhyZXNoID0gY3RybC0+dmFsOwogCQlpZiAoIXNvbG9fZW5jLT5tb3Rpb25fZ2xvYmFsIHx8ICFzb2xvX2VuYy0+bW90aW9uX2VuYWJsZWQpCiAJCQlyZXR1cm4gMDsKLQkJcmV0dXJuIHNvbG9fc2V0X21vdGlvbl90aHJlc2hvbGQoc29sb19kZXYsIHNvbG9fZW5jLT5jaCwgY3RybC0+dmFsKTsKKwkJcmV0dXJuIHNvbG9fc2V0X21vdGlvbl90aHJlc2hvbGQoc29sb19kZXYsIHNvbG9fZW5jLT5jaCwKKwkJCWN0cmwtPnZhbCk7CiAJY2FzZSBWNEwyX0NJRF9NT1RJT05fTU9ERToKIAkJc29sb19lbmMtPm1vdGlvbl9nbG9iYWwgPSBjdHJsLT52YWwgPT0gMTsKIAkJc29sb19lbmMtPm1vdGlvbl9lbmFibGVkID0gY3RybC0+dmFsID4gMDsKIAkJaWYgKGN0cmwtPnZhbCkgewogCQkJaWYgKHNvbG9fZW5jLT5tb3Rpb25fZ2xvYmFsKQotCQkJCXNvbG9fc2V0X21vdGlvbl90aHJlc2hvbGQoc29sb19kZXYsIHNvbG9fZW5jLT5jaCwKLQkJCQkJCXNvbG9fZW5jLT5tb3Rpb25fdGhyZXNoKTsKKwkJCQlzb2xvX3NldF9tb3Rpb25fdGhyZXNob2xkKHNvbG9fZGV2LAorCQkJCQlzb2xvX2VuYy0+Y2gsIHNvbG9fZW5jLT5tb3Rpb25fdGhyZXNoKTsKIAkJCWVsc2UKIAkJCQlzb2xvX3NldF9tb3Rpb25fYmxvY2soc29sb19kZXYsIHNvbG9fZW5jLT5jaCwKIAkJCQkJCSZzb2xvX2VuYy0+bW90aW9uX3RocmVzaG9sZHMpOwpAQCAtMTMwNyw3ICsxMzEyLDggQEAKIAlzb2xvX2VuYy0+ZGVzY19uZWx0cyA9IDMyOwogCXNvbG9fZW5jLT5kZXNjX2l0ZW1zID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoc29sb19kZXYtPnBkZXYsCiAJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzb2xvX3AybV9kZXNjKSAqCi0JCQkJICAgICAgc29sb19lbmMtPmRlc2NfbmVsdHMsICZzb2xvX2VuYy0+ZGVzY19kbWEpOworCQkJCSAgICAgIHNvbG9fZW5jLT5kZXNjX25lbHRzLAorCQkJCSAgICAgICZzb2xvX2VuYy0+ZGVzY19kbWEpOwogCXJldCA9IC1FTk9NRU07CiAJaWYgKHNvbG9fZW5jLT5kZXNjX2l0ZW1zID09IE5VTEwpCiAJCWdvdG8gaGRsX2ZyZWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbmV0bG9naWMveGxyX25ldC5jIGIvZHJpdmVycy9zdGFnaW5nL25ldGxvZ2ljL3hscl9uZXQuYwppbmRleCAzMWIyNjlhLi5jODNlMzM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbmV0bG9naWMveGxyX25ldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9uZXRsb2dpYy94bHJfbmV0LmMKQEAgLTMwNyw3ICszMDcsOCBAQAogfQogCiBzdGF0aWMgdTE2IHhscl9uZXRfc2VsZWN0X3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCXZvaWQgKmFjY2VsX3ByaXYsIHNlbGVjdF9xdWV1ZV9mYWxsYmFja190IGZhbGxiYWNrKQorCQkJCXZvaWQgKmFjY2VsX3ByaXYsCisJCQkJc2VsZWN0X3F1ZXVlX2ZhbGxiYWNrX3QgZmFsbGJhY2spCiB7CiAJcmV0dXJuICh1MTYpc21wX3Byb2Nlc3Nvcl9pZCgpOwogfQpAQCAtNjE0LDggKzYxNSw2IEBACiAJCWsgPSAoayArIDEpICUgajsKIAkJYjIgPSBia3RzW2tdOwogCQlrID0gKGsgKyAxKSAlIGo7Ci0JCXZhbCA9ICgoYzEgPDwgMjMpIHwgKGIxIDw8IDE3KSB8ICh1c2VfYmt0IDw8IDE2KSB8Ci0JCQkJKGMyIDw8IDcpIHwgKGIyIDw8IDEpIHwgKHVzZV9ia3QgPDwgMCkpOwogCiAJCXZhbCA9ICgoYzEgPDwgMjMpIHwgKGIxIDw8IDE3KSB8ICh1c2VfYmt0IDw8IDE2KSB8CiAJCQkJKGMyIDw8IDcpIHwgKGIyIDw8IDEpIHwgKHVzZV9ia3QgPDwgMCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMzZjMGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL0tjb25maWcKQEAgLTAsMCArMSw5IEBACitjb25maWcgQlRfTk9LSUFfSDRQCisJdHJpc3RhdGUgIkhDSSBkcml2ZXIgd2l0aCBINCBOb2tpYSBleHRlbnNpb25zIgorCWRlcGVuZHMgb24gQlQgJiYgQVJDSF9PTUFQCisJaGVscAorCSAgQmx1ZXRvb3RoIEhDSSBkcml2ZXIgd2l0aCBINCBleHRlbnNpb25zLiAgVGhpcyBkcml2ZXIgcHJvdmlkZXMKKwkgIHN1cHBvcnQgZm9yIEg0KyBCbHVldG9vdGggY2hpcCB3aXRoIHZlbmRvci1zcGVjaWZpYyBINCBleHRlbnNpb25zLgorCisJICBTYXkgWSBoZXJlIHRvIGNvbXBpbGUgc3VwcG9ydCBmb3IgaDQgZXh0ZW5kZWQgZGV2aWNlcyBpbnRvIHRoZSBrZXJuZWwKKwkgIG9yIHNheSBNIHRvIGNvbXBpbGUgaXQgYXMgbW9kdWxlIChidG5va2lhX2g0cCkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjI1ZGI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKKworb2JqLSQoQ09ORklHX0JUX05PS0lBX0g0UCkJCSs9IGJ0bm9raWFfaDRwLm8KK2J0bm9raWFfaDRwLW9ianMgOj0gbm9raWFfY29yZS5vIG5va2lhX2Z3Lm8gbm9raWFfdWFydC5vIG5va2lhX2Z3LWNzci5vIFwKKwkJbm9raWFfZnctYmNtLm8gbm9raWFfZnctdGkxMjczLm8KKworY2NmbGFncy15ICs9IC1EX19DSEVDS19FTkRJQU5fXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYzU4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL1RPRE8KQEAgLTAsMCArMSwxMzIgQEAKK0ZldyBhdHRlbXB0cyB0byBzdWJtaXNzaW9uIGhhdmUgYmVlbiBtYWRlLCBsYXN0IHJldmlldyBjb21tZW50cyB3ZXJlIHJlY2VpdmVkIGluCisKK0RhdGU6IFdlZCwgMTUgSmFuIDIwMTQgMTk6MDE6NTEgLTA4MDAKK0Zyb206IE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KK1N1YmplY3Q6IFJlOiBbUEFUQ0ggdjZdIEJsdWV0b290aDogQWRkIGhjaV9oNHAgZHJpdmVyCisKK1NvbWUgY29kZSByZWZhY3RvcmluZyBpcyBzdGlsbCBuZWVkZWQuCisKK1RPRE86CisKKz4gKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2g0cC5oCisKK2NhbiB3ZSBwbGVhc2UgZ2V0IHRoZSBuYW1pbmcgc3RyYWlnaHQuIEZpbGUgbmFtZXMgZG8gbm90IHN0YXJ0IHdpdGgKK2hjaV8gYW55bW9yZS4gV2UgbW92ZWQgYXdheSBmcm9tIGl0IHNpbmNlIHRoYXQgdGVybSBpcyB0b28gZ2VuZXJpYy4KKworPiArc3RydWN0IGhjaV9oNHBfaW5mbyB7CisKK0NhbiB3ZSBwbGVhc2UgZ2V0IHJpZCBvZiB0aGUgaGNpXyBwcmVmaXggZm9yIGV2ZXJ5dGhpbmcuIENvcHlpbmcgZnJvbQorZHJpdmVycyB0aGF0IGFyZSBvdmVyIDEwIHllYXJzIG9sZCBpcyBub3QgYSBnb29kIGlkZWEuIFBsZWFzZSBsb29rIGF0CityZWNlbnQgb25lcy4KKworPiArICAgICBzdHJ1Y3QgdGltZXJfbGlzdCBsYXp5X3JlbGVhc2U7CisKK1RpbWVyPyBOb3QgZGVsYXllZCB3b3JrPworCis+ICt2b2lkIGhjaV9oNHBfb3V0YihzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1OCB2YWwpOworPiArdTggaGNpX2g0cF9pbmIoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IG9mZnNldCk7Cis+ICt2b2lkIGhjaV9oNHBfc2V0X3J0cyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBpbnQgYWN0aXZlKTsKKz4gK2ludCBoY2lfaDRwX3dhaXRfZm9yX2N0cyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBpbnQgYWN0aXZlLCBpbnQgdGltZW91dF9tcyk7Cis+ICt2b2lkIF9faGNpX2g0cF9zZXRfYXV0b19jdHNydHMoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgaW50IG9uLCB1OCB3aGljaCk7Cis+ICt2b2lkIGhjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIGludCBvbiwgdTggd2hpY2gpOworPiArdm9pZCBoY2lfaDRwX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCB1bnNpZ25lZCBsb25nIHNwZWVkKTsKKz4gK2ludCBoY2lfaDRwX3Jlc2V0X3VhcnQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyk7Cis+ICt2b2lkIGhjaV9oNHBfaW5pdF91YXJ0KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pOworPiArdm9pZCBoY2lfaDRwX2VuYWJsZV90eChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKTsKKz4gK3ZvaWQgaGNpX2g0cF9zdG9yZV9yZWdzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pOworPiArdm9pZCBoY2lfaDRwX3Jlc3RvcmVfcmVncyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKTsKKz4gK3ZvaWQgaGNpX2g0cF9zbWFydF9pZGxlKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIGJvb2wgZW5hYmxlKTsKKworVGhlc2UgYXJlIGEgbG90IG9mIHB1YmxpYyBmdW5jdGlvbnMuIEFyZSB0aGV5IGFsbCByZWFsbHkgbmVlZGVkIG9yIGNhbgordGhlIGNvZGUgYmUgZG9uZSBzbWFydC4KKworPiArc3RhdGljIHNzaXplX3QgaGNpX2g0cF9zdG9yZV9iZGFkZHIoc3RydWN0IGRldmljZSAqZGV2LAorPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCis+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKKz4gK3sKKz4gKyAgICAgc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCitTaW5jZSBub25lIG9mIHRoZXNlIGRldmljZXMgY2FuIGZ1bmN0aW9uIHdpdGhvdXQgaGF2aW5nIGEgdmFsaWQKK2FkZHJlc3MsIHRoZSB3YXkgdGhpcyBzaG91bGQgd29yayBpcyB0aGF0IHdlIHNob3VsZCBub3QgcmVnaXN0ZXIgdGhlCitIQ0kgZGV2aWNlIHdoZW4gcHJvYmluZyB0aGUgcGxhdGZvcm0gZGV2aWNlLgorICAgIAorVGhlIEhDSSBkZXZpY2Ugc2hvdWxkIGJlIHJlZ2lzdGVyZWQgb25jZSBhIHZhbGlkIGFkZHJlc3MgaGFzIGJlZW4KK3dyaXR0ZW4gaW50byB0aGUgc3lzZnMgZmlsZS4gSSBkbyBub3Qgd2FudCB0byBwbGF5IHRoZSB0cmlja3Mgd2l0aAorYnJpbmdpbmcgdXAgdGhlIGRldmljZSB3aXRob3V0IGEgdmFsaWQgYWRkcmVzcy4KKworPiArICAgICBoZGV2LT5jbG9zZSA9IGhjaV9oNHBfaGNpX2Nsb3NlOworPiArICAgICBoZGV2LT5mbHVzaCA9IGhjaV9oNHBfaGNpX2ZsdXNoOworPiArICAgICBoZGV2LT5zZW5kID0gaGNpX2g0cF9oY2lfc2VuZF9mcmFtZTsKKyAgICAKK0l0IG5lZWRzIHRvIHVzZSBoZGV2LT5zZXR1cCB0byBsb2FkIHRoZSBmaXJtd2FyZS4gSSBhc3N1bWUgdGhlCitmaXJtd2FyZSBvbmx5IG5lZWRzIHRvIGJlIGxvYWRlZCBvbmNlLiBUaGF0IGlzIGV4YWN0bHkgd2hhdAoraGRldi0+c2V0dXAgZG9lcy4gSXQgZ2V0cyBleGVjdXRlZCBvbmNlLgorICAgIAorPiArICAgICBzZXRfYml0KEhDSV9RVUlSS19SRVNFVF9PTl9DTE9TRSwgJmhkZXYtPnF1aXJrcyk7CisKK0lzIHRoaXMgcXVpcmsgcmVhbGx5IG5lZWRlZD8gTm9ybWFsbHkgb25seSBCbHVldG9vdGggMS4xIGFuZCBlYXJseQorZGV2aWNlcyBxdWFsaWZ5IGZvciBpdC4KKworPiArc3RhdGljIGludCBoY2lfaDRwX2JjbV9zZXRfYmRhZGRyKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHN0cnVjdCBza19idWZmICpza2IpCis+ICt7Cis+ICsgICAgIGludCBpOworPiArICAgICBzdGF0aWMgY29uc3QgdTggbm9raWFfb3VpWzNdID0gezB4MDAsIDB4MWYsIDB4ZGZ9OworPiArICAgICBpbnQgbm90X3ZhbGlkOworCitIYXMgdGhpcyBhY3R1YWxseSBiZWVuIGNvbmZpcm1lZCB0aGF0IHdlIGNhbiBqdXN0IHJhbmRvbWx5IHNldCBhbgorYWRkcmVzcyBvdXQgb2YgdGhlIE5va2lhIHJhbmdlLiBJIGRvIG5vdCB0aGluayBzby4gVGhpcyBpcyBhIHByZXR0eQorYmFkIGlkZWEuCisKK0kgaGF2ZSBubyBpbnRlcmVzdCBpbiBtZXJnaW5nIGEgZHJpdmVyIHdpdGggc3VjaCBhIGhhY2suCisKKz4gKyAgICAgbm90X3ZhbGlkID0gMTsKKz4gKyAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworPiArICAgICAgICAgICAgIGlmIChpbmZvLT5iZF9hZGRyW2ldICE9IDB4MDApIHsKKz4gKyAgICAgICAgICAgICAgICAgICAgIG5vdF92YWxpZCA9IDA7Cis+ICsgICAgICAgICAgICAgICAgICAgICBicmVhazsKKz4gKyAgICAgICAgICAgICB9ICAgCis+ICsgICAgIH0KKworQW55Ym9keSBldmVyeSBoZWFyZCBvZiBtZW1jbXAgb3IgYmFjbXAgYW5kIEJEQUREUl9BTlk/CisKKz4gKyAgICAgICAgICAgICBpZiAobm90X3ZhbGlkKSB7Cis+ICsgICAgICAgICAgICAgICAgICAgICBkZXZfaW5mbyhpbmZvLT5kZXYsICJWYWxpZCBibHVldG9vdGggYWRkcmVzcyBub3QgZm91bmQsIgorPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgc2V0dGluZyBzb21lIHJhbmRvbVxuIik7Cis+ICsgICAgICAgICAgICAgICAgICAgICAvKiBXaGVuIGFkZHJlc3MgaXMgbm90IHZhbGlkLCB1c2Ugc29tZSByYW5kb20gKi8KKz4gKyAgICAgICAgICAgICAgICAgICAgIG1lbWNweShpbmZvLT5iZF9hZGRyLCBub2tpYV9vdWksIDMpOworPiArICAgICAgICAgICAgICAgICAgICAgZ2V0X3JhbmRvbV9ieXRlcyhpbmZvLT5iZF9hZGRyICsgMywgMyk7Cis+ICsgICAgICAgICAgICAgfQorCisKK0FuZCB3aHkgZG9lcyBldmVyeSBzaW5nbGUgY2hpcCBmaXJtd2FyZSBkb2VzIHRoaXMgZGlmZmVyZW50bHkuIFNlcmlvdXNseSwgdGhpcyBpcyBhIG1lc3MuCisKKz4gK3ZvaWQgaGNpX2g0cF9wYXJzZV9md19ldmVudChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorPiAreworPiArICAgICBzd2l0Y2ggKGluZm8tPm1hbl9pZCkgeworPiArICAgICBjYXNlIEg0UF9JRF9DU1I6Cis+ICsgICAgICAgICAgICAgaGNpX2g0cF9iYzRfcGFyc2VfZndfZXZlbnQoaW5mbywgc2tiKTsKKz4gKyAgICAgICAgICAgICBicmVhazsKKy4uLgorPiArfQorCitXZSBoYXZlIHByb3BlciBIQ0kgc3luYyBjb21tYW5kIGhhbmRsaW5nIGluIHJlY2VudCBrZXJuZWxzLiBJIHJlYWxseQorZG8gbm90IGtub3cgd2h5IHRoaXMgaXMgaGFuZCBjb2RlZCB0aGVzZSBkYXlzLiBDaGVjayBob3cgdGhlIEludGVsCitmaXJtd2FyZSBsb2FkaW5nIGluc2lkZSBidHVzYi5jIGRvZXMgaXQuCisKKz4gK2lubGluZSB1OCBoY2lfaDRwX2luYihzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQorPiAreyAKKz4gKyAgICAgcmV0dXJuIF9fcmF3X3JlYWRiKGluZm8tPnVhcnRfYmFzZSArIChvZmZzZXQgPDwgMikpOworPiArfQorCitJbmxpbmUgaW4gYSAqLmMgZmlsZSBmb3IgYSBub24tc3RhdGljIGZ1bmN0aW9uLiBNYWtlcyBubyBzZW5zZSB0byBtZS4KKworPiArLyoqCis+ICsgKiBzdHJ1Y3QgaGNpX2g0cF9wbGF0Zm9ybSBkYXRhIC0gaGNpX2g0cCBQbGF0Zm9ybSBkYXRhIHN0cnVjdHVyZQorPiArICovCis+ICtzdHJ1Y3QgaGNpX2g0cF9wbGF0Zm9ybV9kYXRhIHsKKworcGxlYXNlIGhhdmUgYSBwcm9wZXIgbmFtZSBoZXJlLiBGb3IgZXhhbXBsZQorYnRub2tpYV9oNHBfcGxhdGZvcm1fZGF0YS4KKworUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQgQ2M6CitQYXZlbCBNYWNoZWsgPHBhdmVsQHVjdy5jej4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvaGNpX2g0cC5oIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9oY2lfaDRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTljNGRhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvaGNpX2g0cC5oCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTm9raWEgSDRQIGJsdWV0b290aCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19EUklWRVJTX0JMVUVUT09USF9IQ0lfSDRQX0gKKyNkZWZpbmUgX19EUklWRVJTX0JMVUVUT09USF9IQ0lfSDRQX0gKKworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpLmg+CisKKyNkZWZpbmUgVUFSVF9TWVNDX09NQVBfUkVTRVQJMHgwMworI2RlZmluZSBVQVJUX1NZU1NfUkVTRVRET05FCTB4MDEKKyNkZWZpbmUgVUFSVF9PTUFQX1NDUl9FTVBUWV9USFIJMHgwOAorI2RlZmluZSBVQVJUX09NQVBfU0NSX1dBS0VVUAkweDEwCisjZGVmaW5lIFVBUlRfT01BUF9TU1JfV0FLRVVQCTB4MDIKKyNkZWZpbmUgVUFSVF9PTUFQX1NTUl9UWEZVTEwJMHgwMQorCisjZGVmaW5lIFVBUlRfT01BUF9TWVNDX0lETEVNT0RFCQkweDAzCisjZGVmaW5lIFVBUlRfT01BUF9TWVNDX0lETEVNQVNLCQkoMyA8PCBVQVJUX09NQVBfU1lTQ19JRExFTU9ERSkKKworI2RlZmluZSBVQVJUX09NQVBfU1lTQ19GT1JDRV9JRExFCSgwIDw8IFVBUlRfT01BUF9TWVNDX0lETEVNT0RFKQorI2RlZmluZSBVQVJUX09NQVBfU1lTQ19OT19JRExFCQkoMSA8PCBVQVJUX09NQVBfU1lTQ19JRExFTU9ERSkKKyNkZWZpbmUgVUFSVF9PTUFQX1NZU0NfU01BUlRfSURMRQkoMiA8PCBVQVJUX09NQVBfU1lTQ19JRExFTU9ERSkKKworI2RlZmluZSBINFBfVFJBTlNGRVJfTU9ERQkJMQorI2RlZmluZSBINFBfU0NIRURfVFJBTlNGRVJfTU9ERQkJMgorI2RlZmluZSBINFBfQUNUSVZFX01PREUJCQkzCisKK3N0cnVjdCBoY2lfaDRwX2luZm8geworCXN0cnVjdCB0aW1lcl9saXN0IGxhenlfcmVsZWFzZTsKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKKwlzcGlubG9ja190IGxvY2s7CisKKwl2b2lkIF9faW9tZW0gKnVhcnRfYmFzZTsKKwl1bnNpZ25lZCBsb25nIHVhcnRfcGh5c19iYXNlOworCWludCBpcnE7CisJc3RydWN0IGRldmljZSAqZGV2OworCXU4IGNoaXBfdHlwZTsKKwl1OCBidF93YWtldXBfZ3BpbzsKKwl1OCBob3N0X3dha2V1cF9ncGlvOworCXU4IHJlc2V0X2dwaW87CisJdTggcmVzZXRfZ3Bpb19zaGFyZWQ7CisJdTggYnRfc3lzY2xrOworCXU4IG1hbl9pZDsKKwl1OCB2ZXJfaWQ7CisKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGZ3X3F1ZXVlOworCXN0cnVjdCBza19idWZmICphbGl2ZV9jbWRfc2tiOworCXN0cnVjdCBjb21wbGV0aW9uIGluaXRfY29tcGxldGlvbjsKKwlzdHJ1Y3QgY29tcGxldGlvbiBmd19jb21wbGV0aW9uOworCXN0cnVjdCBjb21wbGV0aW9uIHRlc3RfY29tcGxldGlvbjsKKwlpbnQgZndfZXJyb3I7CisJaW50IGluaXRfZXJyb3I7CisKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4cTsKKworCXN0cnVjdCBza19idWZmICpyeF9za2I7CisJbG9uZyByeF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIHJ4X3N0YXRlOworCXVuc2lnbmVkIGxvbmcgZ2FyYmFnZV9ieXRlczsKKworCXU4IGJkX2FkZHJbNl07CisJc3RydWN0IHNrX2J1ZmZfaGVhZCAqZndfcTsKKworCWludCBwbV9lbmFibGVkOworCWludCB0eF9lbmFibGVkOworCWludCBhdXRvcnRzOworCWludCByeF9lbmFibGVkOworCXVuc2lnbmVkIGxvbmcgcG1fZmxhZ3M7CisKKwlpbnQgdHhfY2xvY2tzX2VuOworCWludCByeF9jbG9ja3NfZW47CisJc3BpbmxvY2tfdCBjbG9ja3NfbG9jazsKKwlzdHJ1Y3QgY2xrICp1YXJ0X2ljbGs7CisJc3RydWN0IGNsayAqdWFydF9mY2xrOworCWF0b21pY190IGNsa191c2VyczsKKwl1MTYgZGxsOworCXUxNiBkbGg7CisJdTE2IGllcjsKKwl1MTYgbWRyMTsKKwl1MTYgZWZyOworfTsKKworc3RydWN0IGhjaV9oNHBfcmFkaW9faGRyIHsKKwlfX3U4IGV2dDsKKwlfX3U4IGRsZW47Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaGNpX2g0cF9uZWdfaGRyIHsKKwlfX3U4IGRsZW47Cit9IF9fcGFja2VkOworI2RlZmluZSBINFBfTkVHX0hEUl9TSVpFIDEKKworI2RlZmluZSBINFBfTkVHX1JFUQkweDAwCisjZGVmaW5lIEg0UF9ORUdfQUNLCTB4MjAKKyNkZWZpbmUgSDRQX05FR19OQUsJMHg0MAorCisjZGVmaW5lIEg0UF9QUk9UT19QS1QJMHg0NAorI2RlZmluZSBINFBfUFJPVE9fQllURQkweDRjCisKKyNkZWZpbmUgSDRQX0lEX0NTUgkweDAyCisjZGVmaW5lIEg0UF9JRF9CQ00yMDQ4CTB4MDQKKyNkZWZpbmUgSDRQX0lEX1RJMTI3MQkweDMxCisKK3N0cnVjdCBoY2lfaDRwX25lZ19jbWQgeworCV9fdTgJYWNrOworCV9fdTE2CWJhdWQ7CisJX191MTYJdW51c2VkMTsKKwlfX3U4CXByb3RvOworCV9fdTE2CXN5c19jbGs7CisJX191MTYJdW51c2VkMjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBoY2lfaDRwX25lZ19ldnQgeworCV9fdTgJYWNrOworCV9fdTE2CWJhdWQ7CisJX191MTYJdW51c2VkMTsKKwlfX3U4CXByb3RvOworCV9fdTE2CXN5c19jbGs7CisJX191MTYJdW51c2VkMjsKKwlfX3U4CW1hbl9pZDsKKwlfX3U4CXZlcl9pZDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgSDRQX0FMSVZFX1JFUQkweDU1CisjZGVmaW5lIEg0UF9BTElWRV9SRVNQCTB4Y2MKKworc3RydWN0IGhjaV9oNHBfYWxpdmVfaGRyIHsKKwlfX3U4CWRsZW47Cit9IF9fcGFja2VkOworI2RlZmluZSBINFBfQUxJVkVfSERSX1NJWkUgMQorCitzdHJ1Y3QgaGNpX2g0cF9hbGl2ZV9wa3QgeworCV9fdTgJbWlkOworCV9fdTgJdW51c2VkOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBNQVhfQkFVRF9SQVRFCQk5MjE2MDAKKyNkZWZpbmUgQkM0X01BWF9CQVVEX1JBVEUJMzY5MjMwMAorI2RlZmluZSBVQVJUX0NMT0NLCQk0ODAwMDAwMAorI2RlZmluZSBCVF9JTklUX0RJVklERVIJCTMyMAorI2RlZmluZSBCVF9CQVVEUkFURV9ESVZJREVSCTM4NDAwMDAwMAorI2RlZmluZSBCVF9TWVNDTEtfRElWCQkxMDAwCisjZGVmaW5lIElOSVRfU1BFRUQJCTEyMDAwMAorCisjZGVmaW5lIEg0X1RZUEVfU0laRQkJMQorI2RlZmluZSBINF9SQURJT19IRFJfU0laRQkyCisKKy8qIEg0KyBwYWNrZXQgdHlwZXMgKi8KKyNkZWZpbmUgSDRfQ01EX1BLVAkJMHgwMQorI2RlZmluZSBINF9BQ0xfUEtUCQkweDAyCisjZGVmaW5lIEg0X1NDT19QS1QJCTB4MDMKKyNkZWZpbmUgSDRfRVZUX1BLVAkJMHgwNAorI2RlZmluZSBINF9ORUdfUEtUCQkweDA2CisjZGVmaW5lIEg0X0FMSVZFX1BLVAkJMHgwNworI2RlZmluZSBINF9SQURJT19QS1QJCTB4MDgKKworLyogVFggc3RhdGVzICovCisjZGVmaW5lIFdBSVRfRk9SX1BLVF9UWVBFCTEKKyNkZWZpbmUgV0FJVF9GT1JfSEVBREVSCQkyCisjZGVmaW5lIFdBSVRfRk9SX0RBVEEJCTMKKworc3RydWN0IGhjaV9md19ldmVudCB7CisJc3RydWN0IGhjaV9ldmVudF9oZHIgaGV2OworCXN0cnVjdCBoY2lfZXZfY21kX2NvbXBsZXRlIGNtZDsKKwl1OCBzdGF0dXM7Cit9IF9fcGFja2VkOworCitpbnQgaGNpX2g0cF9zZW5kX2FsaXZlX3BhY2tldChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKTsKKwordm9pZCBoY2lfaDRwX2JjbV9wYXJzZV9md19ldmVudChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLAorCQkJCXN0cnVjdCBza19idWZmICpza2IpOworaW50IGhjaV9oNHBfYmNtX3NlbmRfZncoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBza19idWZmX2hlYWQgKmZ3X3F1ZXVlKTsKKwordm9pZCBoY2lfaDRwX2JjNF9wYXJzZV9md19ldmVudChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLAorCQkJCXN0cnVjdCBza19idWZmICpza2IpOworaW50IGhjaV9oNHBfYmM0X3NlbmRfZncoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBza19idWZmX2hlYWQgKmZ3X3F1ZXVlKTsKKwordm9pZCBoY2lfaDRwX3RpMTI3M19wYXJzZV9md19ldmVudChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCBoY2lfaDRwX3RpMTI3M19zZW5kX2Z3KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sCisJCQkgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqZndfcXVldWUpOworCitpbnQgaGNpX2g0cF9yZWFkX2Z3KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHN0cnVjdCBza19idWZmX2hlYWQgKmZ3X3F1ZXVlKTsKK2ludCBoY2lfaDRwX3NlbmRfZncoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgc3RydWN0IHNrX2J1ZmZfaGVhZCAqZndfcXVldWUpOwordm9pZCBoY2lfaDRwX3BhcnNlX2Z3X2V2ZW50KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHN0cnVjdCBza19idWZmICpza2IpOworCit2b2lkIGhjaV9oNHBfb3V0YihzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1OCB2YWwpOwordTggaGNpX2g0cF9pbmIoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IG9mZnNldCk7Cit2b2lkIGhjaV9oNHBfc2V0X3J0cyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBpbnQgYWN0aXZlKTsKK2ludCBoY2lfaDRwX3dhaXRfZm9yX2N0cyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBpbnQgYWN0aXZlLCBpbnQgdGltZW91dF9tcyk7Cit2b2lkIF9faGNpX2g0cF9zZXRfYXV0b19jdHNydHMoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgaW50IG9uLCB1OCB3aGljaCk7Cit2b2lkIGhjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIGludCBvbiwgdTggd2hpY2gpOwordm9pZCBoY2lfaDRwX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCB1bnNpZ25lZCBsb25nIHNwZWVkKTsKK2ludCBoY2lfaDRwX3Jlc2V0X3VhcnQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyk7Cit2b2lkIGhjaV9oNHBfaW5pdF91YXJ0KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pOwordm9pZCBoY2lfaDRwX2VuYWJsZV90eChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKTsKK3ZvaWQgaGNpX2g0cF9zdG9yZV9yZWdzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pOwordm9pZCBoY2lfaDRwX3Jlc3RvcmVfcmVncyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKTsKK3ZvaWQgaGNpX2g0cF9zbWFydF9pZGxlKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIGJvb2wgZW5hYmxlKTsKKworI2VuZGlmIC8qIF9fRFJJVkVSU19CTFVFVE9PVEhfSENJX0g0UF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL25va2lhX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvbm9raWFfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMTljZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL25va2lhX2NvcmUuYwpAQCAtMCwwICsxLDEyMDYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBOb2tpYSBINFAgYmx1ZXRvb3RoIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IE5va2lhIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqCisgKiBUaGFua3MgdG8gYWxsIHRoZSBOb2tpYSBwZW9wbGUgdGhhdCBoZWxwZWQgd2l0aCB0aGlzIGRyaXZlciwKKyAqIGluY2x1ZGluZyBWaWxsZSBUZXJ2byBhbmQgUm9nZXIgUXVhZHJvcy4KKyAqCisgKiBQb3dlciBzYXZpbmcgZnVuY3Rpb25hbGl0eSB3YXMgcmVtb3ZlZCBmcm9tIHRoaXMgZHJpdmVyIHRvIG1ha2UKKyAqIG1lcmdpbmcgZWFzaWVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zaXplcy5oPgorCisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2kuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvYnQtbm9raWEtaDRwLmg+CisKKyNpbmNsdWRlICJoY2lfaDRwLmgiCisKKy8qIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gZnVuY3Rpb24gdGhhdCBjYW5ub3QgcmVsZWFzZSBjbG9ja3MgKi8KK3N0YXRpYyB2b2lkIGhjaV9oNHBfc2V0X2NsayhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBpbnQgKmNsb2NrLCBpbnQgZW5hYmxlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+Y2xvY2tzX2xvY2ssIGZsYWdzKTsKKwlpZiAoZW5hYmxlICYmICEqY2xvY2spIHsKKwkJQlRfREJHKCJFbmFibGluZyAlcCIsIGNsb2NrKTsKKwkJY2xrX3ByZXBhcmVfZW5hYmxlKGluZm8tPnVhcnRfZmNsayk7CisJCWNsa19wcmVwYXJlX2VuYWJsZShpbmZvLT51YXJ0X2ljbGspOworCQlpZiAoYXRvbWljX3JlYWQoJmluZm8tPmNsa191c2VycykgPT0gMCkKKwkJCWhjaV9oNHBfcmVzdG9yZV9yZWdzKGluZm8pOworCQlhdG9taWNfaW5jKCZpbmZvLT5jbGtfdXNlcnMpOworCX0KKworCWlmICghZW5hYmxlICYmICpjbG9jaykgeworCQlCVF9EQkcoIkRpc2FibGluZyAlcCIsIGNsb2NrKTsKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmluZm8tPmNsa191c2VycykpCisJCQloY2lfaDRwX3N0b3JlX3JlZ3MoaW5mbyk7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShpbmZvLT51YXJ0X2ZjbGspOworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoaW5mby0+dWFydF9pY2xrKTsKKwl9CisKKwkqY2xvY2sgPSBlbmFibGU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+Y2xvY2tzX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgaGNpX2g0cF9sYXp5X2Nsb2NrX3JlbGVhc2UodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8gPSAoc3RydWN0IGhjaV9oNHBfaW5mbyAqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaWYgKCFpbmZvLT50eF9lbmFibGVkKQorCQloY2lfaDRwX3NldF9jbGsoaW5mbywgJmluZm8tPnR4X2Nsb2Nrc19lbiwgMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworfQorCisvKiBQb3dlciBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLwordm9pZCBoY2lfaDRwX3NtYXJ0X2lkbGUoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgYm9vbCBlbmFibGUpCit7CisJdTggdjsKKworCXYgPSBoY2lfaDRwX2luYihpbmZvLCBVQVJUX09NQVBfU1lTQyk7CisJdiAmPSB+KFVBUlRfT01BUF9TWVNDX0lETEVNQVNLKTsKKworCWlmIChlbmFibGUpCisJCXYgfD0gVUFSVF9PTUFQX1NZU0NfU01BUlRfSURMRTsKKwllbHNlCisJCXYgfD0gVUFSVF9PTUFQX1NZU0NfTk9fSURMRTsKKworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX09NQVBfU1lTQywgdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoNHBfc2NoZWR1bGVfcG0oc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbykKK3sKK30KKworc3RhdGljIHZvaWQgaGNpX2g0cF9kaXNhYmxlX3R4KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pCit7CisJaWYgKCFpbmZvLT5wbV9lbmFibGVkKQorCQlyZXR1cm47CisKKwkvKiBSZS1lbmFibGUgc21hcnQtaWRsZSAqLworCWhjaV9oNHBfc21hcnRfaWRsZShpbmZvLCAxKTsKKworCWdwaW9fc2V0X3ZhbHVlKGluZm8tPmJ0X3dha2V1cF9ncGlvLCAwKTsKKwltb2RfdGltZXIoJmluZm8tPmxhenlfcmVsZWFzZSwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7CisJaW5mby0+dHhfZW5hYmxlZCA9IDA7Cit9CisKK3ZvaWQgaGNpX2g0cF9lbmFibGVfdHgoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFpbmZvLT5wbV9lbmFibGVkKQorCQlyZXR1cm47CisKKwloNHBfc2NoZWR1bGVfcG0oaW5mbyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWRlbF90aW1lcigmaW5mby0+bGF6eV9yZWxlYXNlKTsKKwloY2lfaDRwX3NldF9jbGsoaW5mbywgJmluZm8tPnR4X2Nsb2Nrc19lbiwgMSk7CisJaW5mby0+dHhfZW5hYmxlZCA9IDE7CisJZ3Bpb19zZXRfdmFsdWUoaW5mby0+YnRfd2FrZXVwX2dwaW8sIDEpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0lFUiwgaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9JRVIpIHwKKwkJICAgICBVQVJUX0lFUl9USFJJKTsKKwkvKgorCSAqIERpc2FibGUgc21hcnQtaWRsZSBhcyBVQVJUIFRYIGludGVycnVwdHMKKwkgKiBhcmUgbm90IHdha2UtdXAgY2FwYWJsZQorCSAqLworCWhjaV9oNHBfc21hcnRfaWRsZShpbmZvLCAwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgaGNpX2g0cF9kaXNhYmxlX3J4KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pCit7CisJaWYgKCFpbmZvLT5wbV9lbmFibGVkKQorCQlyZXR1cm47CisKKwlpbmZvLT5yeF9lbmFibGVkID0gMDsKKworCWlmIChoY2lfaDRwX2luYihpbmZvLCBVQVJUX0xTUikgJiBVQVJUX0xTUl9EUikKKwkJcmV0dXJuOworCisJaWYgKCEoaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9MU1IpICYgVUFSVF9MU1JfVEVNVCkpCisJCXJldHVybjsKKworCV9faGNpX2g0cF9zZXRfYXV0b19jdHNydHMoaW5mbywgMCwgVUFSVF9FRlJfUlRTKTsKKwlpbmZvLT5hdXRvcnRzID0gMDsKKwloY2lfaDRwX3NldF9jbGsoaW5mbywgJmluZm8tPnJ4X2Nsb2Nrc19lbiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9oNHBfZW5hYmxlX3J4KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pCit7CisJaWYgKCFpbmZvLT5wbV9lbmFibGVkKQorCQlyZXR1cm47CisKKwloNHBfc2NoZWR1bGVfcG0oaW5mbyk7CisKKwloY2lfaDRwX3NldF9jbGsoaW5mbywgJmluZm8tPnJ4X2Nsb2Nrc19lbiwgMSk7CisJaW5mby0+cnhfZW5hYmxlZCA9IDE7CisKKwlpZiAoIShoY2lfaDRwX2luYihpbmZvLCBVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UKSkKKwkJcmV0dXJuOworCisJX19oY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhpbmZvLCAxLCBVQVJUX0VGUl9SVFMpOworCWluZm8tPmF1dG9ydHMgPSAxOworfQorCisvKiBOZWdvdGlhdGlvbiBmdW5jdGlvbnMgKi8KK2ludCBoY2lfaDRwX3NlbmRfYWxpdmVfcGFja2V0KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pCit7CisJc3RydWN0IGhjaV9oNHBfYWxpdmVfaGRyICpoZHI7CisJc3RydWN0IGhjaV9oNHBfYWxpdmVfcGt0ICpwa3Q7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBsZW47CisKKwlCVF9EQkcoIlNlbmRpbmcgYWxpdmUgcGFja2V0Iik7CisKKwlsZW4gPSBINF9UWVBFX1NJWkUgKyBzaXplb2YoKmhkcikgKyBzaXplb2YoKnBrdCk7CisJc2tiID0gYnRfc2tiX2FsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KHNrYi0+ZGF0YSwgMHgwMCwgbGVuKTsKKwkqc2tiX3B1dChza2IsIDEpID0gSDRfQUxJVkVfUEtUOworCWhkciA9IChzdHJ1Y3QgaGNpX2g0cF9hbGl2ZV9oZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKCpoZHIpKTsKKwloZHItPmRsZW4gPSBzaXplb2YoKnBrdCk7CisJcGt0ID0gKHN0cnVjdCBoY2lfaDRwX2FsaXZlX3BrdCAqKXNrYl9wdXQoc2tiLCBzaXplb2YoKnBrdCkpOworCXBrdC0+bWlkID0gSDRQX0FMSVZFX1JFUTsKKworCXNrYl9xdWV1ZV90YWlsKCZpbmZvLT50eHEsIHNrYik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9JRVIsIGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfSUVSKSB8CisJCSAgICAgVUFSVF9JRVJfVEhSSSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJQlRfREJHKCJBbGl2ZSBwYWNrZXQgc2VudCIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9oNHBfYWxpdmVfcGFja2V0KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sCisJCQkJIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9oNHBfYWxpdmVfaGRyICpoZHI7CisJc3RydWN0IGhjaV9oNHBfYWxpdmVfcGt0ICpwa3Q7CisKKwlCVF9EQkcoIlJlY2VpdmVkIGFsaXZlIHBhY2tldCIpOworCWhkciA9IChzdHJ1Y3QgaGNpX2g0cF9hbGl2ZV9oZHIgKilza2ItPmRhdGE7CisJaWYgKGhkci0+ZGxlbiAhPSBzaXplb2YoKnBrdCkpIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJDb3JydXB0ZWQgYWxpdmUgbWVzc2FnZVxuIik7CisJCWluZm8tPmluaXRfZXJyb3IgPSAtRUlPOworCQlnb3RvIGZpbmlzaF9hbGl2ZTsKKwl9CisKKwlwa3QgPSAoc3RydWN0IGhjaV9oNHBfYWxpdmVfcGt0ICopc2tiX3B1bGwoc2tiLCBzaXplb2YoKmhkcikpOworCWlmIChwa3QtPm1pZCAhPSBINFBfQUxJVkVfUkVTUCkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIkNvdWxkIG5vdCBuZWdvdGlhdGUgaGNpX2g0cCBzZXR0aW5nc1xuIik7CisJCWluZm8tPmluaXRfZXJyb3IgPSAtRUlOVkFMOworCX0KKworZmluaXNoX2FsaXZlOgorCWNvbXBsZXRlKCZpbmZvLT5pbml0X2NvbXBsZXRpb24pOworCWtmcmVlX3NrYihza2IpOworfQorCitzdGF0aWMgaW50IGhjaV9oNHBfc2VuZF9uZWdvdGlhdGlvbihzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKQoreworCXN0cnVjdCBoY2lfaDRwX25lZ19jbWQgKm5lZ19jbWQ7CisJc3RydWN0IGhjaV9oNHBfbmVnX2hkciAqbmVnX2hkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVyciwgbGVuOworCXUxNiBzeXNjbGs7CisKKwlCVF9EQkcoIlNlbmRpbmcgbmVnb3RpYXRpb24uLiIpOworCisJc3dpdGNoIChpbmZvLT5idF9zeXNjbGspIHsKKwljYXNlIDE6CisJCXN5c2NsayA9IDEyMDAwOworCQlicmVhazsKKwljYXNlIDI6CisJCXN5c2NsayA9IDM4NDAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsZW4gPSBzaXplb2YoKm5lZ19jbWQpICsgc2l6ZW9mKCpuZWdfaGRyKSArIEg0X1RZUEVfU0laRTsKKwlza2IgPSBidF9za2JfYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoc2tiLT5kYXRhLCAweDAwLCBsZW4pOworCSpza2JfcHV0KHNrYiwgMSkgPSBINF9ORUdfUEtUOworCW5lZ19oZHIgPSAoc3RydWN0IGhjaV9oNHBfbmVnX2hkciAqKXNrYl9wdXQoc2tiLCBzaXplb2YoKm5lZ19oZHIpKTsKKwluZWdfY21kID0gKHN0cnVjdCBoY2lfaDRwX25lZ19jbWQgKilza2JfcHV0KHNrYiwgc2l6ZW9mKCpuZWdfY21kKSk7CisKKwluZWdfaGRyLT5kbGVuID0gc2l6ZW9mKCpuZWdfY21kKTsKKwluZWdfY21kLT5hY2sgPSBINFBfTkVHX1JFUTsKKwluZWdfY21kLT5iYXVkID0gY3B1X3RvX2xlMTYoQlRfQkFVRFJBVEVfRElWSURFUi9NQVhfQkFVRF9SQVRFKTsKKwluZWdfY21kLT5wcm90byA9IEg0UF9QUk9UT19CWVRFOworCW5lZ19jbWQtPnN5c19jbGsgPSBjcHVfdG9fbGUxNihzeXNjbGspOworCisJaGNpX2g0cF9jaGFuZ2Vfc3BlZWQoaW5mbywgSU5JVF9TUEVFRCk7CisKKwloY2lfaDRwX3NldF9ydHMoaW5mbywgMSk7CisJaW5mby0+aW5pdF9lcnJvciA9IDA7CisJaW5pdF9jb21wbGV0aW9uKCZpbmZvLT5pbml0X2NvbXBsZXRpb24pOworCXNrYl9xdWV1ZV90YWlsKCZpbmZvLT50eHEsIHNrYik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9JRVIsIGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfSUVSKSB8CisJCSAgICAgVUFSVF9JRVJfVEhSSSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmaW5mby0+aW5pdF9jb21wbGV0aW9uLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCWlmIChpbmZvLT5pbml0X2Vycm9yIDwgMCkKKwkJcmV0dXJuIGluZm8tPmluaXRfZXJyb3I7CisKKwkvKiBDaGFuZ2UgdG8gb3BlcmF0aW9uYWwgc2V0dGluZ3MgKi8KKwloY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhpbmZvLCAwLCBVQVJUX0VGUl9SVFMpOworCWhjaV9oNHBfc2V0X3J0cyhpbmZvLCAwKTsKKwloY2lfaDRwX2NoYW5nZV9zcGVlZChpbmZvLCBNQVhfQkFVRF9SQVRFKTsKKworCWVyciA9IGhjaV9oNHBfd2FpdF9mb3JfY3RzKGluZm8sIDEsIDEwMCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwloY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhpbmZvLCAxLCBVQVJUX0VGUl9SVFMpOworCWluaXRfY29tcGxldGlvbigmaW5mby0+aW5pdF9jb21wbGV0aW9uKTsKKwllcnIgPSBoY2lfaDRwX3NlbmRfYWxpdmVfcGFja2V0KGluZm8pOworCisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZpbmZvLT5pbml0X2NvbXBsZXRpb24sCisJCQkJbXNlY3NfdG9famlmZmllcygxMDAwKSkpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJaWYgKGluZm8tPmluaXRfZXJyb3IgPCAwKQorCQlyZXR1cm4gaW5mby0+aW5pdF9lcnJvcjsKKworCUJUX0RCRygiTmVnb3RpYXRpb24gc3VjY2Vzc2Z1bCIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoY2lfaDRwX25lZ290aWF0aW9uX3BhY2tldChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfaDRwX25lZ19oZHIgKmhkcjsKKwlzdHJ1Y3QgaGNpX2g0cF9uZWdfZXZ0ICpldnQ7CisKKwloZHIgPSAoc3RydWN0IGhjaV9oNHBfbmVnX2hkciAqKXNrYi0+ZGF0YTsKKwlpZiAoaGRyLT5kbGVuICE9IHNpemVvZigqZXZ0KSkgeworCQlpbmZvLT5pbml0X2Vycm9yID0gLUVJTzsKKwkJZ290byBmaW5pc2hfbmVnOworCX0KKworCWV2dCA9IChzdHJ1Y3QgaGNpX2g0cF9uZWdfZXZ0ICopc2tiX3B1bGwoc2tiLCBzaXplb2YoKmhkcikpOworCisJaWYgKGV2dC0+YWNrICE9IEg0UF9ORUdfQUNLKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiQ291bGQgbm90IG5lZ290aWF0ZSBoY2lfaDRwIHNldHRpbmdzXG4iKTsKKwkJaW5mby0+aW5pdF9lcnJvciA9IC1FSU5WQUw7CisJfQorCisJaW5mby0+bWFuX2lkID0gZXZ0LT5tYW5faWQ7CisJaW5mby0+dmVyX2lkID0gZXZ0LT52ZXJfaWQ7CisKK2ZpbmlzaF9uZWc6CisKKwljb21wbGV0ZSgmaW5mby0+aW5pdF9jb21wbGV0aW9uKTsKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworLyogSDQgcGFja2V0IGhhbmRsaW5nIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBoY2lfaDRwX2dldF9oZHJfbGVuKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHU4IHBrdF90eXBlKQoreworCWxvbmcgcmV0dmFsOworCisJc3dpdGNoIChwa3RfdHlwZSkgeworCWNhc2UgSDRfRVZUX1BLVDoKKwkJcmV0dmFsID0gSENJX0VWRU5UX0hEUl9TSVpFOworCQlicmVhazsKKwljYXNlIEg0X0FDTF9QS1Q6CisJCXJldHZhbCA9IEhDSV9BQ0xfSERSX1NJWkU7CisJCWJyZWFrOworCWNhc2UgSDRfU0NPX1BLVDoKKwkJcmV0dmFsID0gSENJX1NDT19IRFJfU0laRTsKKwkJYnJlYWs7CisJY2FzZSBINF9ORUdfUEtUOgorCQlyZXR2YWwgPSBINFBfTkVHX0hEUl9TSVpFOworCQlicmVhazsKKwljYXNlIEg0X0FMSVZFX1BLVDoKKwkJcmV0dmFsID0gSDRQX0FMSVZFX0hEUl9TSVpFOworCQlicmVhazsKKwljYXNlIEg0X1JBRElPX1BLVDoKKwkJcmV0dmFsID0gSDRfUkFESU9fSERSX1NJWkU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiVW5rbm93biBINCBwYWNrZXQgdHlwZSAweCUuMnhcbiIsIHBrdF90eXBlKTsKKwkJcmV0dmFsID0gLTE7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGNpX2g0cF9nZXRfZGF0YV9sZW4oc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywKKwkJCQkJIHN0cnVjdCBza19idWZmICpza2IpCit7CisJbG9uZyByZXR2YWwgPSAtMTsKKwlzdHJ1Y3QgaGNpX2FjbF9oZHIgKmFjbF9oZHI7CisJc3RydWN0IGhjaV9zY29faGRyICpzY29faGRyOworCXN0cnVjdCBoY2lfZXZlbnRfaGRyICpldnRfaGRyOworCXN0cnVjdCBoY2lfaDRwX25lZ19oZHIgKm5lZ19oZHI7CisJc3RydWN0IGhjaV9oNHBfYWxpdmVfaGRyICphbGl2ZV9oZHI7CisJc3RydWN0IGhjaV9oNHBfcmFkaW9faGRyICpyYWRpb19oZHI7CisKKwlzd2l0Y2ggKGJ0X2NiKHNrYiktPnBrdF90eXBlKSB7CisJY2FzZSBINF9FVlRfUEtUOgorCQlldnRfaGRyID0gKHN0cnVjdCBoY2lfZXZlbnRfaGRyICopc2tiLT5kYXRhOworCQlyZXR2YWwgPSBldnRfaGRyLT5wbGVuOworCQlicmVhazsKKwljYXNlIEg0X0FDTF9QS1Q6CisJCWFjbF9oZHIgPSAoc3RydWN0IGhjaV9hY2xfaGRyICopc2tiLT5kYXRhOworCQlyZXR2YWwgPSBsZTE2X3RvX2NwdShhY2xfaGRyLT5kbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBINF9TQ09fUEtUOgorCQlzY29faGRyID0gKHN0cnVjdCBoY2lfc2NvX2hkciAqKXNrYi0+ZGF0YTsKKwkJcmV0dmFsID0gc2NvX2hkci0+ZGxlbjsKKwkJYnJlYWs7CisJY2FzZSBINF9SQURJT19QS1Q6CisJCXJhZGlvX2hkciA9IChzdHJ1Y3QgaGNpX2g0cF9yYWRpb19oZHIgKilza2ItPmRhdGE7CisJCXJldHZhbCA9IHJhZGlvX2hkci0+ZGxlbjsKKwkJYnJlYWs7CisJY2FzZSBINF9ORUdfUEtUOgorCQluZWdfaGRyID0gKHN0cnVjdCBoY2lfaDRwX25lZ19oZHIgKilza2ItPmRhdGE7CisJCXJldHZhbCA9IG5lZ19oZHItPmRsZW47CisJCWJyZWFrOworCWNhc2UgSDRfQUxJVkVfUEtUOgorCQlhbGl2ZV9oZHIgPSAoc3RydWN0IGhjaV9oNHBfYWxpdmVfaGRyICopc2tiLT5kYXRhOworCQlyZXR2YWwgPSBhbGl2ZV9oZHItPmRsZW47CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfaDRwX3JlY3ZfZnJhbWUoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmICh1bmxpa2VseSghdGVzdF9iaXQoSENJX1JVTk5JTkcsICZpbmZvLT5oZGV2LT5mbGFncykpKSB7CisJCXN3aXRjaCAoYnRfY2Ioc2tiKS0+cGt0X3R5cGUpIHsKKwkJY2FzZSBINF9ORUdfUEtUOgorCQkJaGNpX2g0cF9uZWdvdGlhdGlvbl9wYWNrZXQoaW5mbywgc2tiKTsKKwkJCWluZm8tPnJ4X3N0YXRlID0gV0FJVF9GT1JfUEtUX1RZUEU7CisJCQlyZXR1cm47CisJCWNhc2UgSDRfQUxJVkVfUEtUOgorCQkJaGNpX2g0cF9hbGl2ZV9wYWNrZXQoaW5mbywgc2tiKTsKKwkJCWluZm8tPnJ4X3N0YXRlID0gV0FJVF9GT1JfUEtUX1RZUEU7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoIXRlc3RfYml0KEhDSV9VUCwgJmluZm8tPmhkZXYtPmZsYWdzKSkgeworCQkJQlRfREJHKCJmd19ldmVudCIpOworCQkJaGNpX2g0cF9wYXJzZV9md19ldmVudChpbmZvLCBza2IpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaGNpX3JlY3ZfZnJhbWUoaW5mby0+aGRldiwgc2tiKTsKKwlCVF9EQkcoIkZyYW1lIHNlbnQgdG8gdXBwZXIgbGF5ZXIiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhjaV9oNHBfaGFuZGxlX2J5dGUoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgdTggYnl0ZSkKK3sKKwlzd2l0Y2ggKGluZm8tPnJ4X3N0YXRlKSB7CisJY2FzZSBXQUlUX0ZPUl9QS1RfVFlQRToKKwkJYnRfY2IoaW5mby0+cnhfc2tiKS0+cGt0X3R5cGUgPSBieXRlOworCQlpbmZvLT5yeF9jb3VudCA9IGhjaV9oNHBfZ2V0X2hkcl9sZW4oaW5mbywgYnl0ZSk7CisJCWlmIChpbmZvLT5yeF9jb3VudCA8IDApIHsKKwkJCWluZm8tPmhkZXYtPnN0YXQuZXJyX3J4Kys7CisJCQlrZnJlZV9za2IoaW5mby0+cnhfc2tiKTsKKwkJCWluZm8tPnJ4X3NrYiA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlpbmZvLT5yeF9zdGF0ZSA9IFdBSVRfRk9SX0hFQURFUjsKKwkJfQorCQlicmVhazsKKwljYXNlIFdBSVRfRk9SX0hFQURFUjoKKwkJaW5mby0+cnhfY291bnQtLTsKKwkJKnNrYl9wdXQoaW5mby0+cnhfc2tiLCAxKSA9IGJ5dGU7CisJCWlmIChpbmZvLT5yeF9jb3VudCAhPSAwKQorCQkJYnJlYWs7CisJCWluZm8tPnJ4X2NvdW50ID0gaGNpX2g0cF9nZXRfZGF0YV9sZW4oaW5mbywgaW5mby0+cnhfc2tiKTsKKwkJaWYgKGluZm8tPnJ4X2NvdW50ID4gc2tiX3RhaWxyb29tKGluZm8tPnJ4X3NrYikpIHsKKwkJCWRldl9lcnIoaW5mby0+ZGV2LCAiZnJhbWUgdG9vIGxvbmdcbiIpOworCQkJaW5mby0+Z2FyYmFnZV9ieXRlcyA9IGluZm8tPnJ4X2NvdW50CisJCQkJLSBza2JfdGFpbHJvb20oaW5mby0+cnhfc2tiKTsKKwkJCWtmcmVlX3NrYihpbmZvLT5yeF9za2IpOworCQkJaW5mby0+cnhfc2tiID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWluZm8tPnJ4X3N0YXRlID0gV0FJVF9GT1JfREFUQTsKKwkJYnJlYWs7CisJY2FzZSBXQUlUX0ZPUl9EQVRBOgorCQlpbmZvLT5yeF9jb3VudC0tOworCQkqc2tiX3B1dChpbmZvLT5yeF9za2IsIDEpID0gYnl0ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGluZm8tPnJ4X2NvdW50ID09IDApIHsKKwkJLyogSDQrIGRldmljZXMgc2hvdWxkIGFsd2F5cyBzZW5kIHdvcmQgYWxpZ25lZCBwYWNrZXRzICovCisJCWlmICghKGluZm8tPnJ4X3NrYi0+bGVuICUgMikpCisJCQlpbmZvLT5nYXJiYWdlX2J5dGVzKys7CisJCWhjaV9oNHBfcmVjdl9mcmFtZShpbmZvLCBpbmZvLT5yeF9za2IpOworCQlpbmZvLT5yeF9za2IgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgaGNpX2g0cF9yeF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1OCBieXRlOworCXN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8gPSAoc3RydWN0IGhjaV9oNHBfaW5mbyAqKWRhdGE7CisKKwlCVF9EQkcoInRhc2tsZXQgd29rZSB1cCIpOworCUJUX0RCRygicnhfdGFza2xldCB3b2tlIHVwIik7CisKKwl3aGlsZSAoaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9MU1IpICYgVUFSVF9MU1JfRFIpIHsKKwkJYnl0ZSA9IGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfUlgpOworCQlpZiAoaW5mby0+Z2FyYmFnZV9ieXRlcykgeworCQkJaW5mby0+Z2FyYmFnZV9ieXRlcy0tOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGluZm8tPnJ4X3NrYiA9PSBOVUxMKSB7CisJCQlpbmZvLT5yeF9za2IgPSBidF9za2JfYWxsb2MoSENJX01BWF9GUkFNRV9TSVpFLAorCQkJCQkJICAgIEdGUF9BVE9NSUMgfCBHRlBfRE1BKTsKKwkJCWlmICghaW5mby0+cnhfc2tiKSB7CisJCQkJZGV2X2VycihpbmZvLT5kZXYsCisJCQkJCSJObyBtZW1vcnkgZm9yIG5ldyBwYWNrZXRcbiIpOworCQkJCWdvdG8gZmluaXNoX3J4OworCQkJfQorCQkJaW5mby0+cnhfc3RhdGUgPSBXQUlUX0ZPUl9QS1RfVFlQRTsKKwkJCWluZm8tPnJ4X3NrYi0+ZGV2ID0gKHZvaWQgKilpbmZvLT5oZGV2OworCQl9CisJCWluZm8tPmhkZXYtPnN0YXQuYnl0ZV9yeCsrOworCQloY2lfaDRwX2hhbmRsZV9ieXRlKGluZm8sIGJ5dGUpOworCX0KKworCWlmICghaW5mby0+cnhfZW5hYmxlZCkgeworCQlpZiAoaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9MU1IpICYgVUFSVF9MU1JfVEVNVCAmJgorCQkJCQkJICBpbmZvLT5hdXRvcnRzKSB7CisJCQlfX2hjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKGluZm8sIDAgLCBVQVJUX0VGUl9SVFMpOworCQkJaW5mby0+YXV0b3J0cyA9IDA7CisJCX0KKwkJLyogRmx1c2ggcG9zdGVkIHdyaXRlIHRvIGF2b2lkIHNwdXJpb3VzIGludGVycnVwdHMgKi8KKwkJaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9PTUFQX1NDUik7CisJCWhjaV9oNHBfc2V0X2NsayhpbmZvLCAmaW5mby0+cnhfY2xvY2tzX2VuLCAwKTsKKwl9CisKK2ZpbmlzaF9yeDoKKwlCVF9EQkcoInJ4X2VuZGVkIik7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9oNHBfdHhfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgaW50IHNlbnQgPSAwOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgaGNpX2g0cF9pbmZvICopZGF0YTsKKworCUJUX0RCRygidGFza2xldCB3b2tlIHVwIik7CisJQlRfREJHKCJ0eF90YXNrbGV0IHdva2UgdXAiKTsKKworCWlmIChpbmZvLT5hdXRvcnRzICE9IGluZm8tPnJ4X2VuYWJsZWQpIHsKKwkJaWYgKGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQpIHsKKwkJCWlmIChpbmZvLT5hdXRvcnRzICYmICFpbmZvLT5yeF9lbmFibGVkKSB7CisJCQkJX19oY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhpbmZvLCAwLAorCQkJCQkJCSAgVUFSVF9FRlJfUlRTKTsKKwkJCQlpbmZvLT5hdXRvcnRzID0gMDsKKwkJCX0KKwkJCWlmICghaW5mby0+YXV0b3J0cyAmJiBpbmZvLT5yeF9lbmFibGVkKSB7CisJCQkJX19oY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhpbmZvLCAxLAorCQkJCQkJCSAgVUFSVF9FRlJfUlRTKTsKKwkJCQlpbmZvLT5hdXRvcnRzID0gMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX09NQVBfU0NSLAorCQkJCSAgICAgaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9PTUFQX1NDUikgfAorCQkJCSAgICAgVUFSVF9PTUFQX1NDUl9FTVBUWV9USFIpOworCQkJZ290byBmaW5pc2hfdHg7CisJCX0KKwl9CisKKwlza2IgPSBza2JfZGVxdWV1ZSgmaW5mby0+dHhxKTsKKwlpZiAoIXNrYikgeworCQkvKiBObyBkYXRhIGluIGJ1ZmZlciAqLworCQlCVF9EQkcoInNrYiByZWFkeSIpOworCQlpZiAoaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9MU1IpICYgVUFSVF9MU1JfVEVNVCkgeworCQkJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfSUVSLAorCQkJCSAgICAgaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9JRVIpICYKKwkJCQkgICAgIH5VQVJUX0lFUl9USFJJKTsKKwkJCWhjaV9oNHBfaW5iKGluZm8sIFVBUlRfT01BUF9TQ1IpOworCQkJaGNpX2g0cF9kaXNhYmxlX3R4KGluZm8pOworCQkJcmV0dXJuOworCQl9CisJCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX09NQVBfU0NSLAorCQkJICAgICBoY2lfaDRwX2luYihpbmZvLCBVQVJUX09NQVBfU0NSKSB8CisJCQkgICAgIFVBUlRfT01BUF9TQ1JfRU1QVFlfVEhSKTsKKwkJZ290byBmaW5pc2hfdHg7CisJfQorCisJLyogQ29weSBkYXRhIHRvIHR4IGZpZm8gKi8KKwl3aGlsZSAoIShoY2lfaDRwX2luYihpbmZvLCBVQVJUX09NQVBfU1NSKSAmIFVBUlRfT01BUF9TU1JfVFhGVUxMKSAmJgorCSAgICAgICAoc2VudCA8IHNrYi0+bGVuKSkgeworCQloY2lfaDRwX291dGIoaW5mbywgVUFSVF9UWCwgc2tiLT5kYXRhW3NlbnRdKTsKKwkJc2VudCsrOworCX0KKworCWluZm8tPmhkZXYtPnN0YXQuYnl0ZV90eCArPSBzZW50OworCWlmIChza2ItPmxlbiA9PSBzZW50KSB7CisJCWtmcmVlX3NrYihza2IpOworCX0gZWxzZSB7CisJCXNrYl9wdWxsKHNrYiwgc2VudCk7CisJCXNrYl9xdWV1ZV9oZWFkKCZpbmZvLT50eHEsIHNrYik7CisJfQorCisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfT01BUF9TQ1IsIGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfT01BUF9TQ1IpICYKKwkJCQkJCSAgICAgflVBUlRfT01BUF9TQ1JfRU1QVFlfVEhSKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9JRVIsIGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfSUVSKSB8CisJCQkJCQkgVUFSVF9JRVJfVEhSSSk7CisKK2ZpbmlzaF90eDoKKwkvKiBGbHVzaCBwb3N0ZWQgd3JpdGUgdG8gYXZvaWQgc3B1cmlvdXMgaW50ZXJydXB0cyAqLworCWhjaV9oNHBfaW5iKGluZm8sIFVBUlRfT01BUF9TQ1IpOworCit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBoY2lfaDRwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8gPSAoc3RydWN0IGhjaV9oNHBfaW5mbyAqKWRhdGE7CisJdTggaWlyLCBtc3I7CisJaW50IHJldDsKKworCXJldCA9IElSUV9OT05FOworCisJaWlyID0gaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9JSVIpOworCWlmIChpaXIgJiBVQVJUX0lJUl9OT19JTlQpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCUJUX0RCRygiSW4gaW50ZXJydXB0IGhhbmRsZXIgaWlyIDB4JS4yeCIsIGlpcik7CisKKwlpaXIgJj0gVUFSVF9JSVJfSUQ7CisKKwlpZiAoaWlyID09IFVBUlRfSUlSX01TSSkgeworCQltc3IgPSBoY2lfaDRwX2luYihpbmZvLCBVQVJUX01TUik7CisJCXJldCA9IElSUV9IQU5ETEVEOworCX0KKwlpZiAoaWlyID09IFVBUlRfSUlSX1JMU0kpIHsKKwkJaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9SWCk7CisJCWhjaV9oNHBfaW5iKGluZm8sIFVBUlRfTFNSKTsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGlpciA9PSBVQVJUX0lJUl9SREkpIHsKKwkJaGNpX2g0cF9yeF90YXNrbGV0KCh1bnNpZ25lZCBsb25nKWRhdGEpOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoaWlyID09IFVBUlRfSUlSX1RIUkkpIHsKKwkJaGNpX2g0cF90eF90YXNrbGV0KCh1bnNpZ25lZCBsb25nKWRhdGEpOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaGNpX2g0cF93YWtldXBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0KQoreworCXN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8gPSBkZXZfaW5zdDsKKwlpbnQgc2hvdWxkX3dha2V1cDsKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKKworCWlmICghaW5mby0+aGRldikKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJc2hvdWxkX3dha2V1cCA9IGdwaW9fZ2V0X3ZhbHVlKGluZm8tPmhvc3Rfd2FrZXVwX2dwaW8pOworCWhkZXYgPSBpbmZvLT5oZGV2OworCisJaWYgKCF0ZXN0X2JpdChIQ0lfUlVOTklORywgJmhkZXYtPmZsYWdzKSkgeworCQlpZiAoc2hvdWxkX3dha2V1cCA9PSAxKQorCQkJY29tcGxldGVfYWxsKCZpbmZvLT50ZXN0X2NvbXBsZXRpb24pOworCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlCVF9EQkcoImdwaW8gaW50ZXJydXB0ICVkIiwgc2hvdWxkX3dha2V1cCk7CisKKwkvKiBDaGVjayBpZiB3ZWUgaGF2ZSBtaXNzZWQgc29tZSBpbnRlcnJ1cHRzICovCisJaWYgKGluZm8tPnJ4X2VuYWJsZWQgPT0gc2hvdWxkX3dha2V1cCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJaWYgKHNob3VsZF93YWtldXApCisJCWhjaV9oNHBfZW5hYmxlX3J4KGluZm8pOworCWVsc2UKKwkJaGNpX2g0cF9kaXNhYmxlX3J4KGluZm8pOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2g0cF9zZXRfcG1fbGltaXRzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIGJvb2wgc2V0KQoreworCXN0cnVjdCBoY2lfaDRwX3BsYXRmb3JtX2RhdGEgKmJ0X3BsYXRfZGF0YSA9IGluZm8tPmRldi0+cGxhdGZvcm1fZGF0YTsKKwljb25zdCBjaGFyICpzc2V0ID0gc2V0ID8gInNldCIgOiAiY2xlYXIiOworCisJaWYgKHVubGlrZWx5KCFidF9wbGF0X2RhdGEgfHwgIWJ0X3BsYXRfZGF0YS0+c2V0X3BtX2xpbWl0cykpCisJCXJldHVybjsKKworCWlmIChzZXQgIT0gISF0ZXN0X2JpdChINFBfQUNUSVZFX01PREUsICZpbmZvLT5wbV9mbGFncykpIHsKKwkJYnRfcGxhdF9kYXRhLT5zZXRfcG1fbGltaXRzKGluZm8tPmRldiwgc2V0KTsKKwkJaWYgKHNldCkKKwkJCXNldF9iaXQoSDRQX0FDVElWRV9NT0RFLCAmaW5mby0+cG1fZmxhZ3MpOworCQllbHNlCisJCQljbGVhcl9iaXQoSDRQX0FDVElWRV9NT0RFLCAmaW5mby0+cG1fZmxhZ3MpOworCQlCVF9EQkcoIkNoYW5nZSBwbSBjb25zdHJhaW50cyB0bzogJXMiLCBzc2V0KTsKKwkJcmV0dXJuOworCX0KKworCUJUX0RCRygicG0gY29uc3RyYWludHMgcmVtYWluczogJXMiLCBzc2V0KTsKK30KKworc3RhdGljIGludCBoY2lfaDRwX3Jlc2V0KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pCit7CisJaW50IGVycjsKKworCWVyciA9IGhjaV9oNHBfcmVzZXRfdWFydChpbmZvKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIlVhcnQgcmVzZXQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaGNpX2g0cF9pbml0X3VhcnQoaW5mbyk7CisJaGNpX2g0cF9zZXRfcnRzKGluZm8sIDApOworCisJZ3Bpb19zZXRfdmFsdWUoaW5mby0+cmVzZXRfZ3BpbywgMCk7CisJZ3Bpb19zZXRfdmFsdWUoaW5mby0+YnRfd2FrZXVwX2dwaW8sIDEpOworCW1zbGVlcCgxMCk7CisKKwlpZiAoZ3Bpb19nZXRfdmFsdWUoaW5mby0+aG9zdF93YWtldXBfZ3BpbykgPT0gMSkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgImhvc3Rfd2FrZXVwX2dwaW8gbm90IGxvd1xuIik7CisJCXJldHVybiAtRVBST1RPOworCX0KKworCWluaXRfY29tcGxldGlvbigmaW5mby0+dGVzdF9jb21wbGV0aW9uKTsKKwlncGlvX3NldF92YWx1ZShpbmZvLT5yZXNldF9ncGlvLCAxKTsKKworCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJmluZm8tPnRlc3RfY29tcGxldGlvbiwKKwkJCQkJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKDEwMCkpKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAid2FrZXVwIHRlc3QgdGltZWQgb3V0XG4iKTsKKwkJY29tcGxldGVfYWxsKCZpbmZvLT50ZXN0X2NvbXBsZXRpb24pOworCQlyZXR1cm4gLUVQUk9UTzsKKwl9CisKKwllcnIgPSBoY2lfaDRwX3dhaXRfZm9yX2N0cyhpbmZvLCAxLCAxMDApOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiTm8gY3RzIGZyb20gYnQgY2hpcFxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaGNpX2g0cF9zZXRfcnRzKGluZm8sIDEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGhjaSBjYWxsYmFjayBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgaGNpX2g0cF9oY2lfZmx1c2goc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyA9IGhjaV9nZXRfZHJ2ZGF0YShoZGV2KTsKKwlza2JfcXVldWVfcHVyZ2UoJmluZm8tPnR4cSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoY2lfaDRwX2J0X3dha2V1cF90ZXN0KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pCit7CisJLyoKKwkgKiBUZXN0IFNlcXVlbmNlOgorCSAqIEhvc3QgZGUtYXNzZXJ0cyB0aGUgQlRfV0FLRV9VUCBsaW5lLgorCSAqIEhvc3QgcG9sbHMgdGhlIFVBUlRfQ1RTIGxpbmUsIHdhaXRpbmcgZm9yIGl0IHRvIGJlIGRlLWFzc2VydGVkLgorCSAqIEhvc3QgYXNzZXJ0cyB0aGUgQlRfV0FLRV9VUCBsaW5lLgorCSAqIEhvc3QgcG9sbHMgdGhlIFVBUlRfQ1RTIGxpbmUsIHdhaXRpbmcgZm9yIGl0IHRvIGJlIGFzc2VydGVkLgorCSAqIEhvc3QgZGUtYXNzZXJ0cyB0aGUgQlRfV0FLRV9VUCBsaW5lIChhbGxvdyB0aGUgQmx1ZXRvb3RoIGRldmljZSB0bworCSAqIHNsZWVwKS4KKwkgKiBIb3N0IHBvbGxzIHRoZSBVQVJUX0NUUyBsaW5lLCB3YWl0aW5nIGZvciBpdCB0byBiZSBkZS1hc3NlcnRlZC4KKwkgKi8KKwlpbnQgZXJyOworCWludCByZXQgPSAtRUNPTU07CisKKwlpZiAoIWluZm8pCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRGlzYWJsZSB3YWtldXAgaW50ZXJydXB0cyAqLworCWRpc2FibGVfaXJxKGdwaW9fdG9faXJxKGluZm8tPmhvc3Rfd2FrZXVwX2dwaW8pKTsKKworCWdwaW9fc2V0X3ZhbHVlKGluZm8tPmJ0X3dha2V1cF9ncGlvLCAwKTsKKwllcnIgPSBoY2lfaDRwX3dhaXRfZm9yX2N0cyhpbmZvLCAwLCAxMDApOworCWlmIChlcnIpIHsKKwkJZGV2X3dhcm4oaW5mby0+ZGV2LAorCQkJCSJidF93YWtldXBfdGVzdDogZmFpbDogQ1RTIGxvdyB0aW1lZCBvdXQ6ICVkXG4iLAorCQkJCWVycik7CisJCWdvdG8gb3V0OworCX0KKworCWdwaW9fc2V0X3ZhbHVlKGluZm8tPmJ0X3dha2V1cF9ncGlvLCAxKTsKKwllcnIgPSBoY2lfaDRwX3dhaXRfZm9yX2N0cyhpbmZvLCAxLCAxMDApOworCWlmIChlcnIpIHsKKwkJZGV2X3dhcm4oaW5mby0+ZGV2LAorCQkJCSJidF93YWtldXBfdGVzdDogZmFpbDogQ1RTIGhpZ2ggdGltZWQgb3V0OiAlZFxuIiwKKwkJCQllcnIpOworCQlnb3RvIG91dDsKKwl9CisKKwlncGlvX3NldF92YWx1ZShpbmZvLT5idF93YWtldXBfZ3BpbywgMCk7CisJZXJyID0gaGNpX2g0cF93YWl0X2Zvcl9jdHMoaW5mbywgMCwgMTAwKTsKKwlpZiAoZXJyKSB7CisJCWRldl93YXJuKGluZm8tPmRldiwKKwkJCQkiYnRfd2FrZXVwX3Rlc3Q6IGZhaWw6IENUUyByZS1sb3cgdGltZWQgb3V0OiAlZFxuIiwKKwkJCQllcnIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSAwOworCitvdXQ6CisKKwkvKiBSZS1lbmFibGUgd2FrZXVwIGludGVycnVwdHMgKi8KKwllbmFibGVfaXJxKGdwaW9fdG9faXJxKGluZm8tPmhvc3Rfd2FrZXVwX2dwaW8pKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaGNpX2g0cF9oY2lfb3BlbihzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvOworCWludCBlcnIsIHJldHJpZXMgPSAwOworCXN0cnVjdCBza19idWZmX2hlYWQgZndfcXVldWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWluZm8gPSBoY2lfZ2V0X2RydmRhdGEoaGRldik7CisKKwlpZiAodGVzdF9iaXQoSENJX1JVTk5JTkcsICZoZGV2LT5mbGFncykpCisJCXJldHVybiAwOworCisJLyogVEkxMjcxIGhhcyBIVyBidWcgYW5kIGJvb3QgdXAgbWlnaHQgZmFpbC4gUmV0cnkgdXAgdG8gdGhyZWUgdGltZXMgKi8KK2FnYWluOgorCisJaW5mby0+cnhfZW5hYmxlZCA9IDE7CisJaW5mby0+cnhfc3RhdGUgPSBXQUlUX0ZPUl9QS1RfVFlQRTsKKwlpbmZvLT5yeF9jb3VudCA9IDA7CisJaW5mby0+Z2FyYmFnZV9ieXRlcyA9IDA7CisJaW5mby0+cnhfc2tiID0gTlVMTDsKKwlpbmZvLT5wbV9lbmFibGVkID0gMDsKKwlpbml0X2NvbXBsZXRpb24oJmluZm8tPmZ3X2NvbXBsZXRpb24pOworCWhjaV9oNHBfc2V0X2NsayhpbmZvLCAmaW5mby0+dHhfY2xvY2tzX2VuLCAxKTsKKwloY2lfaDRwX3NldF9jbGsoaW5mbywgJmluZm8tPnJ4X2Nsb2Nrc19lbiwgMSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmZndfcXVldWUpOworCisJZXJyID0gaGNpX2g0cF9yZXNldChpbmZvKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJfY2xlYW47CisKKwloY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhpbmZvLCAxLCBVQVJUX0VGUl9DVFMgfCBVQVJUX0VGUl9SVFMpOworCWluZm8tPmF1dG9ydHMgPSAxOworCisJZXJyID0gaGNpX2g0cF9zZW5kX25lZ290aWF0aW9uKGluZm8pOworCisJZXJyID0gaGNpX2g0cF9yZWFkX2Z3KGluZm8sICZmd19xdWV1ZSk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJDYW5ub3QgcmVhZCBmaXJtd2FyZVxuIik7CisJCWdvdG8gZXJyX2NsZWFuOworCX0KKworCWVyciA9IGhjaV9oNHBfc2VuZF9mdyhpbmZvLCAmZndfcXVldWUpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiU2VuZGluZyBmaXJtd2FyZSBmYWlsZWQuXG4iKTsKKwkJZ290byBlcnJfY2xlYW47CisJfQorCisJaW5mby0+cG1fZW5hYmxlZCA9IDE7CisKKwllcnIgPSBoY2lfaDRwX2J0X3dha2V1cF90ZXN0KGluZm8pOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiQlQgd2FrZXVwIHRlc3QgZmFpbGVkLlxuIik7CisJCWdvdG8gZXJyX2NsZWFuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaW5mby0+cnhfZW5hYmxlZCA9IGdwaW9fZ2V0X3ZhbHVlKGluZm8tPmhvc3Rfd2FrZXVwX2dwaW8pOworCWhjaV9oNHBfc2V0X2NsayhpbmZvLCAmaW5mby0+cnhfY2xvY2tzX2VuLCBpbmZvLT5yeF9lbmFibGVkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwloY2lfaDRwX3NldF9jbGsoaW5mbywgJmluZm8tPnR4X2Nsb2Nrc19lbiwgMCk7CisKKwlrZnJlZV9za2IoaW5mby0+YWxpdmVfY21kX3NrYik7CisJaW5mby0+YWxpdmVfY21kX3NrYiA9IE5VTEw7CisJc2V0X2JpdChIQ0lfUlVOTklORywgJmhkZXYtPmZsYWdzKTsKKworCUJUX0RCRygiaGNpIHVwIGFuZCBydW5uaW5nIik7CisJcmV0dXJuIDA7CisKK2Vycl9jbGVhbjoKKwloY2lfaDRwX2hjaV9mbHVzaChoZGV2KTsKKwloY2lfaDRwX3Jlc2V0X3VhcnQoaW5mbyk7CisJZGVsX3RpbWVyX3N5bmMoJmluZm8tPmxhenlfcmVsZWFzZSk7CisJaGNpX2g0cF9zZXRfY2xrKGluZm8sICZpbmZvLT50eF9jbG9ja3NfZW4sIDApOworCWhjaV9oNHBfc2V0X2NsayhpbmZvLCAmaW5mby0+cnhfY2xvY2tzX2VuLCAwKTsKKwlncGlvX3NldF92YWx1ZShpbmZvLT5yZXNldF9ncGlvLCAwKTsKKwlncGlvX3NldF92YWx1ZShpbmZvLT5idF93YWtldXBfZ3BpbywgMCk7CisJc2tiX3F1ZXVlX3B1cmdlKCZmd19xdWV1ZSk7CisJa2ZyZWVfc2tiKGluZm8tPmFsaXZlX2NtZF9za2IpOworCWluZm8tPmFsaXZlX2NtZF9za2IgPSBOVUxMOworCWtmcmVlX3NrYihpbmZvLT5yeF9za2IpOworCWluZm8tPnJ4X3NrYiA9IE5VTEw7CisKKwlpZiAocmV0cmllcysrIDwgMykgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIkZXIGxvYWRpbmcgdHJ5ICVkIGZhaWwuIFJldHJ5LlxuIiwgcmV0cmllcyk7CisJCWdvdG8gYWdhaW47CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBoY2lfaDRwX2hjaV9jbG9zZShzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvID0gaGNpX2dldF9kcnZkYXRhKGhkZXYpOworCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX1JVTk5JTkcsICZoZGV2LT5mbGFncykpCisJCXJldHVybiAwOworCisJaGNpX2g0cF9oY2lfZmx1c2goaGRldik7CisJaGNpX2g0cF9zZXRfY2xrKGluZm8sICZpbmZvLT50eF9jbG9ja3NfZW4sIDEpOworCWhjaV9oNHBfc2V0X2NsayhpbmZvLCAmaW5mby0+cnhfY2xvY2tzX2VuLCAxKTsKKwloY2lfaDRwX3Jlc2V0X3VhcnQoaW5mbyk7CisJZGVsX3RpbWVyX3N5bmMoJmluZm8tPmxhenlfcmVsZWFzZSk7CisJaGNpX2g0cF9zZXRfY2xrKGluZm8sICZpbmZvLT50eF9jbG9ja3NfZW4sIDApOworCWhjaV9oNHBfc2V0X2NsayhpbmZvLCAmaW5mby0+cnhfY2xvY2tzX2VuLCAwKTsKKwlncGlvX3NldF92YWx1ZShpbmZvLT5yZXNldF9ncGlvLCAwKTsKKwlncGlvX3NldF92YWx1ZShpbmZvLT5idF93YWtldXBfZ3BpbywgMCk7CisJa2ZyZWVfc2tiKGluZm8tPnJ4X3NrYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoY2lfaDRwX2hjaV9zZW5kX2ZyYW1lKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm87CisJaW50IGVyciA9IDA7CisKKwlCVF9EQkcoImRldiAlcCwgc2tiICVwIiwgaGRldiwgc2tiKTsKKworCWluZm8gPSBoY2lfZ2V0X2RydmRhdGEoaGRldik7CisKKwlpZiAoIXRlc3RfYml0KEhDSV9SVU5OSU5HLCAmaGRldi0+ZmxhZ3MpKSB7CisJCWRldl93YXJuKGluZm8tPmRldiwgIkZyYW1lIGZvciBub24tcnVubmluZyBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzd2l0Y2ggKGJ0X2NiKHNrYiktPnBrdF90eXBlKSB7CisJY2FzZSBIQ0lfQ09NTUFORF9QS1Q6CisJCWhkZXYtPnN0YXQuY21kX3R4Kys7CisJCWJyZWFrOworCWNhc2UgSENJX0FDTERBVEFfUEtUOgorCQloZGV2LT5zdGF0LmFjbF90eCsrOworCQlicmVhazsKKwljYXNlIEhDSV9TQ09EQVRBX1BLVDoKKwkJaGRldi0+c3RhdC5zY29fdHgrKzsKKwkJYnJlYWs7CisJfQorCisJLyogUHVzaCBmcmFtZSB0eXBlIHRvIHNrYiAqLworCSpza2JfcHVzaChza2IsIDEpID0gKGJ0X2NiKHNrYiktPnBrdF90eXBlKTsKKwkvKiBXZSBzaG91bGQgYWxsd2F5cyBzZW5kIHdvcmQgYWxpZ25lZCBkYXRhIHRvIGg0KyBkZXZpY2VzICovCisJaWYgKHNrYi0+bGVuICUgMikgeworCQllcnIgPSBza2JfcGFkKHNrYiwgMSk7CisJCWlmICghZXJyKQorCQkJKnNrYl9wdXQoc2tiLCAxKSA9IDB4MDA7CisJfQorCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlza2JfcXVldWVfdGFpbCgmaW5mby0+dHhxLCBza2IpOworCWhjaV9oNHBfZW5hYmxlX3R4KGluZm8pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGhjaV9oNHBfc3RvcmVfYmRhZGRyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgYmRhZGRyWzZdOworCWludCByZXQsIGk7CisKKwlyZXQgPSBzc2NhbmYoYnVmLCAiJTJ4OiUyeDolMng6JTJ4OiUyeDolMnhcbiIsCisJCQkmYmRhZGRyWzBdLCAmYmRhZGRyWzFdLCAmYmRhZGRyWzJdLAorCQkJJmJkYWRkclszXSwgJmJkYWRkcls0XSwgJmJkYWRkcls1XSk7CisKKwlpZiAocmV0ICE9IDYpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlpZiAoYmRhZGRyW2ldID4gMHhmZikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpbmZvLT5iZF9hZGRyW2ldID0gYmRhZGRyW2ldICYgMHhmZjsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGhjaV9oNHBfc2hvd19iZGFkZHIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXBNUlxuIiwgaW5mby0+YmRfYWRkcik7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihiZGFkZHIsIFNfSVJVR08gfCBTX0lXVVNSLCBoY2lfaDRwX3Nob3dfYmRhZGRyLAorCQkgICBoY2lfaDRwX3N0b3JlX2JkYWRkcik7CisKK3N0YXRpYyBpbnQgaGNpX2g0cF9zeXNmc19jcmVhdGVfZmlsZXMoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmRhZGRyKTsKK30KKworc3RhdGljIHZvaWQgaGNpX2g0cF9zeXNmc19yZW1vdmVfZmlsZXMoc3RydWN0IGRldmljZSAqZGV2KQoreworCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9iZGFkZHIpOworfQorCitzdGF0aWMgaW50IGhjaV9oNHBfcmVnaXN0ZXJfaGRldihzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCisJLyogSW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIgSENJIGRldmljZSAqLworCisJaGRldiA9IGhjaV9hbGxvY19kZXYoKTsKKwlpZiAoIWhkZXYpIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRldmljZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpbmZvLT5oZGV2ID0gaGRldjsKKworCWhkZXYtPmJ1cyA9IEhDSV9VQVJUOworCWhjaV9zZXRfZHJ2ZGF0YShoZGV2LCBpbmZvKTsKKworCWhkZXYtPm9wZW4gPSBoY2lfaDRwX2hjaV9vcGVuOworCWhkZXYtPmNsb3NlID0gaGNpX2g0cF9oY2lfY2xvc2U7CisJaGRldi0+Zmx1c2ggPSBoY2lfaDRwX2hjaV9mbHVzaDsKKwloZGV2LT5zZW5kID0gaGNpX2g0cF9oY2lfc2VuZF9mcmFtZTsKKwlzZXRfYml0KEhDSV9RVUlSS19SRVNFVF9PTl9DTE9TRSwgJmhkZXYtPnF1aXJrcyk7CisKKwlTRVRfSENJREVWX0RFVihoZGV2LCBpbmZvLT5kZXYpOworCisJaWYgKGhjaV9oNHBfc3lzZnNfY3JlYXRlX2ZpbGVzKGluZm8tPmRldikgPCAwKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBmaWxlc1xuIik7CisJCWdvdG8gZnJlZTsKKwl9CisKKwlpZiAoaGNpX3JlZ2lzdGVyX2RldihoZGV2KSA+PSAwKQorCQlyZXR1cm4gMDsKKworCWRldl9lcnIoaW5mby0+ZGV2LCAiaGNpX3JlZ2lzdGVyIGZhaWxlZCAlcy5cbiIsIGhkZXYtPm5hbWUpOworCWhjaV9oNHBfc3lzZnNfcmVtb3ZlX2ZpbGVzKGluZm8tPmRldik7CitmcmVlOgorCWhjaV9mcmVlX2RldihpbmZvLT5oZGV2KTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBoY2lfaDRwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGhjaV9oNHBfcGxhdGZvcm1fZGF0YSAqYnRfcGxhdF9kYXRhOworCXN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm87CisJaW50IGVycjsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJSZWdpc3RlcmluZyBIQ0kgSDRQIGRldmljZVxuIik7CisJaW5mbyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGhjaV9oNHBfaW5mbyksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pCisJCXJldHVybiAtRU5PTUVNOworCisJaW5mby0+ZGV2ID0gJnBkZXYtPmRldjsKKwlpbmZvLT50eF9lbmFibGVkID0gMTsKKwlpbmZvLT5yeF9lbmFibGVkID0gMTsKKwlzcGluX2xvY2tfaW5pdCgmaW5mby0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmluZm8tPmNsb2Nrc19sb2NrKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZpbmZvLT50eHEpOworCisJaWYgKHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGQgbm90IGdldCBCbHVldG9vdGggY29uZmlnIGRhdGFcbiIpOworCQlyZXR1cm4gLUVOT0RBVEE7CisJfQorCisJYnRfcGxhdF9kYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW5mby0+Y2hpcF90eXBlID0gYnRfcGxhdF9kYXRhLT5jaGlwX3R5cGU7CisJaW5mby0+YnRfd2FrZXVwX2dwaW8gPSBidF9wbGF0X2RhdGEtPmJ0X3dha2V1cF9ncGlvOworCWluZm8tPmhvc3Rfd2FrZXVwX2dwaW8gPSBidF9wbGF0X2RhdGEtPmhvc3Rfd2FrZXVwX2dwaW87CisJaW5mby0+cmVzZXRfZ3BpbyA9IGJ0X3BsYXRfZGF0YS0+cmVzZXRfZ3BpbzsKKwlpbmZvLT5yZXNldF9ncGlvX3NoYXJlZCA9IGJ0X3BsYXRfZGF0YS0+cmVzZXRfZ3Bpb19zaGFyZWQ7CisJaW5mby0+YnRfc3lzY2xrID0gYnRfcGxhdF9kYXRhLT5idF9zeXNjbGs7CisKKwlCVF9EQkcoIlJFU0VUIGdwaW86ICVkIiwgaW5mby0+cmVzZXRfZ3Bpbyk7CisJQlRfREJHKCJCVFdVIGdwaW86ICVkIiwgaW5mby0+YnRfd2FrZXVwX2dwaW8pOworCUJUX0RCRygiSE9TVFdVIGdwaW86ICVkIiwgaW5mby0+aG9zdF93YWtldXBfZ3Bpbyk7CisJQlRfREJHKCJzeXNjbGs6ICVkIiwgaW5mby0+YnRfc3lzY2xrKTsKKworCWluaXRfY29tcGxldGlvbigmaW5mby0+dGVzdF9jb21wbGV0aW9uKTsKKwljb21wbGV0ZV9hbGwoJmluZm8tPnRlc3RfY29tcGxldGlvbik7CisKKwlpZiAoIWluZm8tPnJlc2V0X2dwaW9fc2hhcmVkKSB7CisJCWVyciA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmcGRldi0+ZGV2LCBpbmZvLT5yZXNldF9ncGlvLAorCQkJCQkgICAgR1BJT0ZfT1VUX0lOSVRfTE9XLCAiYnRfcmVzZXQiKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBnZXQgR1BJTyBsaW5lICVkXG4iLAorCQkJCWluZm8tPnJlc2V0X2dwaW8pOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCWVyciA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmcGRldi0+ZGV2LCBpbmZvLT5idF93YWtldXBfZ3BpbywKKwkJCQkgICAgR1BJT0ZfT1VUX0lOSVRfTE9XLCAiYnRfd2FrZXVwIik7CisKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIkNhbm5vdCBnZXQgR1BJTyBsaW5lIDB4JWQiLAorCQkJaW5mby0+YnRfd2FrZXVwX2dwaW8pOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmcGRldi0+ZGV2LCBpbmZvLT5ob3N0X3dha2V1cF9ncGlvLAorCQkJCSAgICBHUElPRl9ESVJfSU4sICJob3N0X3dha2V1cCIpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiQ2Fubm90IGdldCBHUElPIGxpbmUgJWQiLAorCQkgICAgICAgaW5mby0+aG9zdF93YWtldXBfZ3Bpbyk7CisJCXJldHVybiBlcnI7CisJfQorCisJaW5mby0+aXJxID0gYnRfcGxhdF9kYXRhLT51YXJ0X2lycTsKKwlpbmZvLT51YXJ0X2Jhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgYnRfcGxhdF9kYXRhLT51YXJ0X2Jhc2UsCisJCQkJCVNaXzJLKTsKKwlpbmZvLT51YXJ0X2ljbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgYnRfcGxhdF9kYXRhLT51YXJ0X2ljbGspOworCWluZm8tPnVhcnRfZmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBidF9wbGF0X2RhdGEtPnVhcnRfZmNsayk7CisKKwllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGluZm8tPmlycSwgaGNpX2g0cF9pbnRlcnJ1cHQsCisJCQkJSVJRRl9ESVNBQkxFRCwgImhjaV9oNHAiLCBpbmZvKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgImhjaV9oNHA6IHVuYWJsZSB0byBnZXQgSVJRICVkXG4iLAorCQkJaW5mby0+aXJxKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGdwaW9fdG9faXJxKGluZm8tPmhvc3Rfd2FrZXVwX2dwaW8pLAorCQkJICBoY2lfaDRwX3dha2V1cF9pbnRlcnJ1cHQsICBJUlFGX1RSSUdHRVJfRkFMTElORyB8CisJCQkgIElSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX0RJU0FCTEVELAorCQkJICAiaGNpX2g0cF93a3VwIiwgaW5mbyk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJoY2lfaDRwOiB1bmFibGUgdG8gZ2V0IHdha2V1cCBJUlEgJWRcbiIsCisJCQkgIGdwaW9fdG9faXJxKGluZm8tPmhvc3Rfd2FrZXVwX2dwaW8pKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBpcnFfc2V0X2lycV93YWtlKGdwaW9fdG9faXJxKGluZm8tPmhvc3Rfd2FrZXVwX2dwaW8pLCAxKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgImhjaV9oNHA6IHVuYWJsZSB0byBzZXQgd2FrZXVwIGZvciBJUlEgJWRcbiIsCisJCQkJZ3Bpb190b19pcnEoaW5mby0+aG9zdF93YWtldXBfZ3BpbykpOworCQlyZXR1cm4gZXJyOworCX0KKworCWluaXRfdGltZXJfZGVmZXJyYWJsZSgmaW5mby0+bGF6eV9yZWxlYXNlKTsKKwlpbmZvLT5sYXp5X3JlbGVhc2UuZnVuY3Rpb24gPSBoY2lfaDRwX2xhenlfY2xvY2tfcmVsZWFzZTsKKwlpbmZvLT5sYXp5X3JlbGVhc2UuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWluZm87CisJaGNpX2g0cF9zZXRfY2xrKGluZm8sICZpbmZvLT50eF9jbG9ja3NfZW4sIDEpOworCWVyciA9IGhjaV9oNHBfcmVzZXRfdWFydChpbmZvKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlncGlvX3NldF92YWx1ZShpbmZvLT5yZXNldF9ncGlvLCAwKTsKKwloY2lfaDRwX3NldF9jbGsoaW5mbywgJmluZm8tPnR4X2Nsb2Nrc19lbiwgMCk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmZvKTsKKworCWlmIChoY2lfaDRwX3JlZ2lzdGVyX2hkZXYoaW5mbykgPCAwKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGhjaV9oNHAgaGNpIGRldmljZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhjaV9oNHBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbzsKKworCWluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWhjaV9oNHBfc3lzZnNfcmVtb3ZlX2ZpbGVzKGluZm8tPmRldik7CisJaGNpX2g0cF9oY2lfY2xvc2UoaW5mby0+aGRldik7CisJaGNpX3VucmVnaXN0ZXJfZGV2KGluZm8tPmhkZXYpOworCWhjaV9mcmVlX2RldihpbmZvLT5oZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBoY2lfaDRwX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gaGNpX2g0cF9wcm9iZSwKKwkucmVtb3ZlCQk9IGhjaV9oNHBfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJoY2lfaDRwIiwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihoY2lfaDRwX2RyaXZlcik7CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06aGNpX2g0cCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCbHVldG9vdGggaDQgZHJpdmVyIHdpdGggbm9raWEgZXh0ZW5zaW9ucyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiVmlsbGUgVGVydm8iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvbm9raWFfZnctYmNtLmMgYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL25va2lhX2Z3LWJjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMWFlOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL25va2lhX2Z3LWJjbS5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTm9raWEgSDRQIGJsdWV0b290aCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKworI2luY2x1ZGUgImhjaV9oNHAuaCIKKworc3RhdGljIGludCBoY2lfaDRwX2JjbV9zZXRfYmRhZGRyKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgaTsKKwlzdGF0aWMgY29uc3QgdTggbm9raWFfb3VpWzNdID0gezB4MDAsIDB4MWYsIDB4ZGZ9OworCWludCBub3RfdmFsaWQ7CisKKwlub3RfdmFsaWQgPSAxOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJaWYgKGluZm8tPmJkX2FkZHJbaV0gIT0gMHgwMCkgeworCQkJbm90X3ZhbGlkID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKG5vdF92YWxpZCkgeworCQlkZXZfaW5mbyhpbmZvLT5kZXYsICJWYWxpZCBibHVldG9vdGggYWRkcmVzcyBub3QgZm91bmQsIHNldHRpbmcgc29tZSByYW5kb21cbiIpOworCQkvKiBXaGVuIGFkZHJlc3MgaXMgbm90IHZhbGlkLCB1c2Ugc29tZSByYW5kb20gYnV0IE5va2lhIE1BQyAqLworCQltZW1jcHkoaW5mby0+YmRfYWRkciwgbm9raWFfb3VpLCAzKTsKKwkJZ2V0X3JhbmRvbV9ieXRlcyhpbmZvLT5iZF9hZGRyICsgMywgMyk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJc2tiLT5kYXRhWzkgLSBpXSA9IGluZm8tPmJkX2FkZHJbaV07CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBoY2lfaDRwX2JjbV9wYXJzZV9md19ldmVudChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICpmd19za2I7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNrYi0+ZGF0YVs1XSAhPSAweDAwKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiRmlybXdhcmUgc2VuZGluZyBjb21tYW5kIGZhaWxlZCAweCUuMnhcbiIsCisJCQlza2ItPmRhdGFbNV0pOworCQlpbmZvLT5md19lcnJvciA9IC1FUFJPVE87CisJfQorCisJa2ZyZWVfc2tiKHNrYik7CisKKwlmd19za2IgPSBza2JfZGVxdWV1ZShpbmZvLT5md19xKTsKKwlpZiAoZndfc2tiID09IE5VTEwgfHwgaW5mby0+ZndfZXJyb3IpIHsKKwkJY29tcGxldGUoJmluZm8tPmZ3X2NvbXBsZXRpb24pOworCQlyZXR1cm47CisJfQorCisJaWYgKGZ3X3NrYi0+ZGF0YVsxXSA9PSAweDAxICYmIGZ3X3NrYi0+ZGF0YVsyXSA9PSAweGZjICYmIGZ3X3NrYi0+bGVuID49IDEwKSB7CisJCUJUX0RCRygiU2V0dGluZyBibHVldG9vdGggYWRkcmVzcyIpOworCQllcnIgPSBoY2lfaDRwX2JjbV9zZXRfYmRhZGRyKGluZm8sIGZ3X3NrYik7CisJCWlmIChlcnIgPCAwKSB7CisJCQlrZnJlZV9za2IoZndfc2tiKTsKKwkJCWluZm8tPmZ3X2Vycm9yID0gZXJyOworCQkJY29tcGxldGUoJmluZm8tPmZ3X2NvbXBsZXRpb24pOworCQkJcmV0dXJuOworCQl9CisJfQorCisJc2tiX3F1ZXVlX3RhaWwoJmluZm8tPnR4cSwgZndfc2tiKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0lFUiwgaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9JRVIpIHwKKwkJCVVBUlRfSUVSX1RIUkkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworCitpbnQgaGNpX2g0cF9iY21fc2VuZF9mdyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLAorCQkJc3RydWN0IHNrX2J1ZmZfaGVhZCAqZndfcXVldWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCB0aW1lOworCisJaW5mby0+ZndfZXJyb3IgPSAwOworCisJQlRfREJHKCJTZW5kaW5nIGZpcm13YXJlIik7CisKKwl0aW1lID0gamlmZmllczsKKworCWluZm8tPmZ3X3EgPSBmd19xdWV1ZTsKKwlza2IgPSBza2JfZGVxdWV1ZShmd19xdWV1ZSk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PREFUQTsKKworCUJUX0RCRygiU2VuZGluZyBjb21tYW5kcyIpOworCisJLyoKKwkgKiBEaXNhYmxlIHNtYXJ0LWlkbGUgYXMgVUFSVCBUWCBpbnRlcnJ1cHRzCisJICogYXJlIG5vdCB3YWtlLXVwIGNhcGFibGUKKwkgKi8KKwloY2lfaDRwX3NtYXJ0X2lkbGUoaW5mbywgMCk7CisKKwkvKiBDaGVjayBpZiB0aGlzIGlzIGJkX2FkZHJlc3MgcGFja2V0ICovCisJaW5pdF9jb21wbGV0aW9uKCZpbmZvLT5md19jb21wbGV0aW9uKTsKKwlza2JfcXVldWVfdGFpbCgmaW5mby0+dHhxLCBza2IpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfSUVSLCBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0lFUikgfAorCQkJVUFSVF9JRVJfVEhSSSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmluZm8tPmZ3X2NvbXBsZXRpb24sCisJCQkJbXNlY3NfdG9famlmZmllcygyMDAwKSkpIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJObyByZXBseSB0byBmdyBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJaWYgKGluZm8tPmZ3X2Vycm9yKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiRlcgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVQUk9UTzsKKwl9CisKKwlCVF9EQkcoIkZpcm13YXJlIHNlbnQgaW4gJWQgbXNlY3MiLAorCQkgICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMtdGltZSkpOworCisJaGNpX2g0cF9zZXRfYXV0b19jdHNydHMoaW5mbywgMCwgVUFSVF9FRlJfUlRTKTsKKwloY2lfaDRwX3NldF9ydHMoaW5mbywgMCk7CisJaGNpX2g0cF9jaGFuZ2Vfc3BlZWQoaW5mbywgQkM0X01BWF9CQVVEX1JBVEUpOworCWhjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKGluZm8sIDEsIFVBUlRfRUZSX1JUUyk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvbm9raWFfZnctY3NyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL25va2lhX2Z3LWNzci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNmI3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL25va2lhX2Z3LWNzci5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTm9raWEgSDRQIGJsdWV0b290aCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKworI2luY2x1ZGUgImhjaV9oNHAuaCIKKwordm9pZCBoY2lfaDRwX2JjNF9wYXJzZV9md19ldmVudChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIENoZWNrIGlmIHRoaXMgaXMgZncgcGFja2V0ICovCisJaWYgKHNrYi0+ZGF0YVswXSAhPSAweGZmKSB7CisJCWhjaV9yZWN2X2ZyYW1lKGluZm8tPmhkZXYsIHNrYik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc2tiLT5kYXRhWzExXSB8fCBza2ItPmRhdGFbMTJdKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiRmlybXdhcmUgc2VuZGluZyBjb21tYW5kIGZhaWxlZFxuIik7CisJCWluZm8tPmZ3X2Vycm9yID0gLUVQUk9UTzsKKwl9CisKKwlrZnJlZV9za2Ioc2tiKTsKKwljb21wbGV0ZSgmaW5mby0+ZndfY29tcGxldGlvbik7Cit9CisKK2ludCBoY2lfaDRwX2JjNF9zZW5kX2Z3KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sCisJCQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpmd19xdWV1ZSkKK3sKKwlzdGF0aWMgY29uc3QgdTggbm9raWFfb3VpWzNdID0gezB4MDAsIDB4MTksIDB4NEZ9OworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwlpbnQgcmV0cmllcywgY291bnQsIGksIG5vdF92YWxpZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaW5mby0+ZndfZXJyb3IgPSAwOworCisJQlRfREJHKCJTZW5kaW5nIGZpcm13YXJlIik7CisJc2tiID0gc2tiX2RlcXVldWUoZndfcXVldWUpOworCisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTVNHOworCisJLyogQ2hlY2sgaWYgdGhpcyBpcyBiZF9hZGRyZXNzIHBhY2tldCAqLworCWlmIChza2ItPmRhdGFbMTVdID09IDB4MDEgJiYgc2tiLT5kYXRhWzE2XSA9PSAweDAwKSB7CisJCW9mZnNldCA9IDIxOworCQlza2ItPmRhdGFbb2Zmc2V0ICsgMV0gPSAweDAwOworCQlza2ItPmRhdGFbb2Zmc2V0ICsgNV0gPSAweDAwOworCisJCW5vdF92YWxpZCA9IDE7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCWlmIChpbmZvLT5iZF9hZGRyW2ldICE9IDB4MDApIHsKKwkJCQlub3RfdmFsaWQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKG5vdF92YWxpZCkgeworCQkJZGV2X2luZm8oaW5mby0+ZGV2LCAiVmFsaWQgYmx1ZXRvb3RoIGFkZHJlc3Mgbm90IGZvdW5kLCBzZXR0aW5nIHNvbWUgcmFuZG9tXG4iKTsKKwkJCS8qIFdoZW4gYWRkcmVzcyBpcyBub3QgdmFsaWQsIHVzZSBzb21lIHJhbmRvbSAqLworCQkJbWVtY3B5KGluZm8tPmJkX2FkZHIsIG5va2lhX291aSwgMyk7CisJCQlnZXRfcmFuZG9tX2J5dGVzKGluZm8tPmJkX2FkZHIgKyAzLCAzKTsKKwkJfQorCisJCXNrYi0+ZGF0YVtvZmZzZXQgKyA3XSA9IGluZm8tPmJkX2FkZHJbMF07CisJCXNrYi0+ZGF0YVtvZmZzZXQgKyA2XSA9IGluZm8tPmJkX2FkZHJbMV07CisJCXNrYi0+ZGF0YVtvZmZzZXQgKyA0XSA9IGluZm8tPmJkX2FkZHJbMl07CisJCXNrYi0+ZGF0YVtvZmZzZXQgKyAwXSA9IGluZm8tPmJkX2FkZHJbM107CisJCXNrYi0+ZGF0YVtvZmZzZXQgKyAzXSA9IGluZm8tPmJkX2FkZHJbNF07CisJCXNrYi0+ZGF0YVtvZmZzZXQgKyAyXSA9IGluZm8tPmJkX2FkZHJbNV07CisJfQorCisJZm9yIChjb3VudCA9IDE7IDsgY291bnQrKykgeworCQlCVF9EQkcoIlNlbmRpbmcgZmlybXdhcmUgY29tbWFuZCAlZCIsIGNvdW50KTsKKwkJaW5pdF9jb21wbGV0aW9uKCZpbmZvLT5md19jb21wbGV0aW9uKTsKKwkJc2tiX3F1ZXVlX3RhaWwoJmluZm8tPnR4cSwgc2tiKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfSUVSLCBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0lFUikgfAorCQkJCQkJCSBVQVJUX0lFUl9USFJJKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJCXNrYiA9IHNrYl9kZXF1ZXVlKGZ3X3F1ZXVlKTsKKwkJaWYgKCFza2IpCisJCQlicmVhazsKKworCQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW5mby0+ZndfY29tcGxldGlvbiwKKwkJCQkJCSBtc2Vjc190b19qaWZmaWVzKDEwMDApKSkgeworCQkJZGV2X2VycihpbmZvLT5kZXYsICJObyByZXBseSB0byBmdyBjb21tYW5kXG4iKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisKKwkJaWYgKGluZm8tPmZ3X2Vycm9yKSB7CisJCQlkZXZfZXJyKGluZm8tPmRldiwgIkZXIGVycm9yXG4iKTsKKwkJCXJldHVybiAtRVBST1RPOworCQl9CisJfTsKKworCS8qIFdhaXQgZm9yIGNoaXAgd2FybSByZXNldCAqLworCXJldHJpZXMgPSAxMDA7CisJd2hpbGUgKCghc2tiX3F1ZXVlX2VtcHR5KCZpbmZvLT50eHEpIHx8CisJICAgICAgICEoaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9MU1IpICYgVUFSVF9MU1JfVEVNVCkpICYmCisJICAgICAgIHJldHJpZXMtLSkgeworCQltc2xlZXAoMTApOworCX0KKwlpZiAoIXJldHJpZXMpIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJUcmFuc21pdHRlciBub3QgZW1wdHlcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwloY2lfaDRwX2NoYW5nZV9zcGVlZChpbmZvLCBCQzRfTUFYX0JBVURfUkFURSk7CisKKwlpZiAoaGNpX2g0cF93YWl0X2Zvcl9jdHMoaW5mbywgMSwgMTAwKSkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgImN0cyBkaWRuJ3QgZGVhc3NlcnQgYWZ0ZXIgZmluYWwgc3BlZWRcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXRyaWVzID0gMTAwOworCWRvIHsKKwkJaW5pdF9jb21wbGV0aW9uKCZpbmZvLT5pbml0X2NvbXBsZXRpb24pOworCQloY2lfaDRwX3NlbmRfYWxpdmVfcGFja2V0KGluZm8pOworCQlyZXRyaWVzLS07CisJfSB3aGlsZSAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW5mby0+aW5pdF9jb21wbGV0aW9uLCAxMDApICYmCisJCSByZXRyaWVzID4gMCk7CisKKwlpZiAoIXJldHJpZXMpIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJObyBhbGl2ZSByZXBseSBhZnRlciBzcGVlZCBjaGFuZ2VcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvbm9raWFfZnctdGkxMjczLmMgYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL25va2lhX2Z3LXRpMTI3My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NTAwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL25va2lhX2Z3LXRpMTI3My5jCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTm9raWEgSDRQIGJsdWV0b290aCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisKKyNpbmNsdWRlICJoY2lfaDRwLmgiCisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpmd19xOworCit2b2lkIGhjaV9oNHBfdGkxMjczX3BhcnNlX2Z3X2V2ZW50KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICpmd19za2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChza2ItPmRhdGFbNV0gIT0gMHgwMCkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIkZpcm13YXJlIHNlbmRpbmcgY29tbWFuZCBmYWlsZWQgMHglLjJ4XG4iLAorCQkJc2tiLT5kYXRhWzVdKTsKKwkJaW5mby0+ZndfZXJyb3IgPSAtRVBST1RPOworCX0KKworCWtmcmVlX3NrYihza2IpOworCisJZndfc2tiID0gc2tiX2RlcXVldWUoZndfcSk7CisJaWYgKGZ3X3NrYiA9PSBOVUxMIHx8IGluZm8tPmZ3X2Vycm9yKSB7CisJCWNvbXBsZXRlKCZpbmZvLT5md19jb21wbGV0aW9uKTsKKwkJcmV0dXJuOworCX0KKworCXNrYl9xdWV1ZV90YWlsKCZpbmZvLT50eHEsIGZ3X3NrYik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9JRVIsIGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfSUVSKSB8CisJCQlVQVJUX0lFUl9USFJJKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Cit9CisKKworaW50IGhjaV9oNHBfdGkxMjczX3NlbmRfZncoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBza19idWZmX2hlYWQgKmZ3X3F1ZXVlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbG9uZyBmbGFncywgdGltZTsKKworCWluZm8tPmZ3X2Vycm9yID0gMDsKKworCUJUX0RCRygiU2VuZGluZyBmaXJtd2FyZSIpOworCisJdGltZSA9IGppZmZpZXM7CisKKwlmd19xID0gZndfcXVldWU7CisJc2tiID0gc2tiX2RlcXVldWUoZndfcXVldWUpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwlCVF9EQkcoIlNlbmRpbmcgY29tbWFuZHMiKTsKKwkvKiBDaGVjayBpZiB0aGlzIGlzIGJkX2FkZHJlc3MgcGFja2V0ICovCisJaW5pdF9jb21wbGV0aW9uKCZpbmZvLT5md19jb21wbGV0aW9uKTsKKwloY2lfaDRwX3NtYXJ0X2lkbGUoaW5mbywgMCk7CisJc2tiX3F1ZXVlX3RhaWwoJmluZm8tPnR4cSwgc2tiKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0lFUiwgaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9JRVIpIHwKKwkJCVVBUlRfSUVSX1RIUkkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpbmZvLT5md19jb21wbGV0aW9uLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiTm8gcmVwbHkgdG8gZncgY29tbWFuZFxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCWlmIChpbmZvLT5md19lcnJvcikgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIkZXIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FUFJPVE87CisJfQorCisJQlRfREJHKCJGaXJtd2FyZSBzZW50IGluICVkIG1zZWNzIiwKKwkJICAgamlmZmllc190b19tc2VjcyhqaWZmaWVzLXRpbWUpKTsKKworCWhjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKGluZm8sIDAsIFVBUlRfRUZSX1JUUyk7CisJaGNpX2g0cF9zZXRfcnRzKGluZm8sIDApOworCWhjaV9oNHBfY2hhbmdlX3NwZWVkKGluZm8sIEJDNF9NQVhfQkFVRF9SQVRFKTsKKwlpZiAoaGNpX2g0cF93YWl0X2Zvcl9jdHMoaW5mbywgMSwgMTAwKSkgeworCQlkZXZfZXJyKGluZm8tPmRldiwKKwkJCSJjdHMgZGlkbid0IGdvIGRvd24gYWZ0ZXIgZmluYWwgc3BlZWQgY2hhbmdlXG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCWhjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKGluZm8sIDEsIFVBUlRfRUZSX1JUUyk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvbm9raWFfZncuYyBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvbm9raWFfZncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGJhMjE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9ub2tpYV9mdy5jCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgaGNpX2g0cCBibHVldG9vdGggZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IE5va2lhIENvcnBvcmF0aW9uLgorICoKKyAqIENvbnRhY3Q6IFZpbGxlIFRlcnZvIDx2aWxsZS50ZXJ2b0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisKKyNpbmNsdWRlICJoY2lfaDRwLmgiCisKKyNkZWZpbmUgRldfTkFNRV9USTEyNzFfUFJFTEUJInRpMTI3M19wcmVsZS5iaW4iCisjZGVmaW5lIEZXX05BTUVfVEkxMjcxX0xFCSJ0aTEyNzNfbGUuYmluIgorI2RlZmluZSBGV19OQU1FX1RJMTI3MQkJInRpMTI3My5iaW4iCisjZGVmaW5lIEZXX05BTUVfQkNNMjA0OAkJImJjbWZ3LmJpbiIKKyNkZWZpbmUgRldfTkFNRV9DU1IJCSJiYzRmdy5iaW4iCisKK3N0YXRpYyBpbnQgZndfcG9zOworCisvKiBGaXJtd2FyZSBoYW5kbGluZyAqLworc3RhdGljIGludCBoY2lfaDRwX29wZW5fZmlybXdhcmUoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywKKwkJCQkgY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZndfZW50cnkpCit7CisJaW50IGVycjsKKworCWZ3X3BvcyA9IDA7CisJQlRfREJHKCJPcGVuaW5nIGZpcm13YXJlIG1hbl9pZCAweCUuMnggdmVyX2lkIDB4JS4yeCIsCisJCQlpbmZvLT5tYW5faWQsIGluZm8tPnZlcl9pZCk7CisJc3dpdGNoIChpbmZvLT5tYW5faWQpIHsKKwljYXNlIEg0UF9JRF9USTEyNzE6CisJCXN3aXRjaCAoaW5mby0+dmVyX2lkKSB7CisJCWNhc2UgMHhlMToKKwkJCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoZndfZW50cnksIEZXX05BTUVfVEkxMjcxX1BSRUxFLAorCQkJCQkJaW5mby0+ZGV2KTsKKwkJCWJyZWFrOworCQljYXNlIDB4ZDE6CisJCWNhc2UgMHhmMToKKwkJCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoZndfZW50cnksIEZXX05BTUVfVEkxMjcxX0xFLAorCQkJCQkJaW5mby0+ZGV2KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyID0gcmVxdWVzdF9maXJtd2FyZShmd19lbnRyeSwgRldfTkFNRV9USTEyNzEsCisJCQkJCQlpbmZvLT5kZXYpOworCQl9CisJCWJyZWFrOworCWNhc2UgSDRQX0lEX0NTUjoKKwkJZXJyID0gcmVxdWVzdF9maXJtd2FyZShmd19lbnRyeSwgRldfTkFNRV9DU1IsIGluZm8tPmRldik7CisJCWJyZWFrOworCWNhc2UgSDRQX0lEX0JDTTIwNDg6CisJCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoZndfZW50cnksIEZXX05BTUVfQkNNMjA0OCwgaW5mby0+ZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihpbmZvLT5kZXYsICJJbnZhbGlkIGNoaXAgdHlwZVxuIik7CisJCSpmd19lbnRyeSA9IE5VTEw7CisJCWVyciA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgaGNpX2g0cF9jbG9zZV9maXJtd2FyZShjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5KQoreworCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworfQorCisvKiBSZWFkIGZ3LiBSZXR1cm4gbGVuZ3RoIG9mIHRoZSBjb21tYW5kLiBJZiBubyBtb3JlIGNvbW1hbmRzIGluCisgKiBmdyAwIGlzIHJldHVybmVkLiBJbiBlcnJvciBjYXNlIHJldHVybiB2YWx1ZSBpcyBuZWdhdGl2ZS4KKyAqLworc3RhdGljIGludCBoY2lfaDRwX3JlYWRfZndfY21kKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHN0cnVjdCBza19idWZmICoqc2tiLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnksIGdmcF90IGhvdykKK3sKKwl1bnNpZ25lZCBpbnQgY21kX2xlbjsKKworCWlmIChmd19wb3MgPj0gZndfZW50cnktPnNpemUpCisJCXJldHVybiAwOworCisJaWYgKGZ3X3BvcyArIDIgPiBmd19lbnRyeS0+c2l6ZSkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIkNvcnJ1cHRlZCBmaXJtd2FyZSBpbWFnZSAxXG4iKTsKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwl9CisKKwljbWRfbGVuID0gZndfZW50cnktPmRhdGFbZndfcG9zKytdOworCWNtZF9sZW4gKz0gZndfZW50cnktPmRhdGFbZndfcG9zKytdIDw8IDg7CisJaWYgKGNtZF9sZW4gPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZndfcG9zICsgY21kX2xlbiA+IGZ3X2VudHJ5LT5zaXplKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiQ29ycnVwdGVkIGZpcm13YXJlIGltYWdlIDJcbiIpOworCQlyZXR1cm4gLUVNU0dTSVpFOworCX0KKworCSpza2IgPSBidF9za2JfYWxsb2MoY21kX2xlbiwgaG93KTsKKwlpZiAoISpza2IpIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJDYW5ub3QgcmVzZXJ2ZSBtZW1vcnkgZm9yIGJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1jcHkoc2tiX3B1dCgqc2tiLCBjbWRfbGVuKSwgJmZ3X2VudHJ5LT5kYXRhW2Z3X3Bvc10sIGNtZF9sZW4pOworCisJZndfcG9zICs9IGNtZF9sZW47CisKKwlyZXR1cm4gKCpza2IpLT5sZW47Cit9CisKK2ludCBoY2lfaDRwX3JlYWRfZncoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgc3RydWN0IHNrX2J1ZmZfaGVhZCAqZndfcXVldWUpCit7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeSA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJaW50IGVycjsKKworCWVyciA9IGhjaV9oNHBfb3Blbl9maXJtd2FyZShpbmZvLCAmZndfZW50cnkpOworCWlmIChlcnIgPCAwIHx8ICFmd19lbnRyeSkKKwkJZ290byBlcnJfY2xlYW47CisKKwl3aGlsZSAoKGVyciA9IGhjaV9oNHBfcmVhZF9md19jbWQoaW5mbywgJnNrYiwgZndfZW50cnksIEdGUF9LRVJORUwpKSkgeworCQlpZiAoZXJyIDwgMCB8fCAhc2tiKQorCQkJZ290byBlcnJfY2xlYW47CisKKwkJc2tiX3F1ZXVlX3RhaWwoZndfcXVldWUsIHNrYik7CisJfQorCisJLyogQ2hpcCBkZXRlY3Rpb24gY29kZSBkb2VzIG5lZyBhbmQgYWxpdmUgc3R1ZmYKKwkgKiBkaXNjYXJkIHR3byBmaXJzdCBza2JzICovCisJc2tiID0gc2tiX2RlcXVldWUoZndfcXVldWUpOworCWlmICghc2tiKSB7CisJCWVyciA9IC1FTVNHU0laRTsKKwkJZ290byBlcnJfY2xlYW47CisJfQorCWtmcmVlX3NrYihza2IpOworCXNrYiA9IHNrYl9kZXF1ZXVlKGZ3X3F1ZXVlKTsKKwlpZiAoIXNrYikgeworCQllcnIgPSAtRU1TR1NJWkU7CisJCWdvdG8gZXJyX2NsZWFuOworCX0KKwlrZnJlZV9za2Ioc2tiKTsKKworZXJyX2NsZWFuOgorCWhjaV9oNHBfY2xvc2VfZmlybXdhcmUoZndfZW50cnkpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBoY2lfaDRwX3NlbmRfZncoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgc3RydWN0IHNrX2J1ZmZfaGVhZCAqZndfcXVldWUpCit7CisJaW50IGVycjsKKworCXN3aXRjaCAoaW5mby0+bWFuX2lkKSB7CisJY2FzZSBINFBfSURfQ1NSOgorCQllcnIgPSBoY2lfaDRwX2JjNF9zZW5kX2Z3KGluZm8sIGZ3X3F1ZXVlKTsKKwkJYnJlYWs7CisJY2FzZSBINFBfSURfVEkxMjcxOgorCQllcnIgPSBoY2lfaDRwX3RpMTI3M19zZW5kX2Z3KGluZm8sIGZ3X3F1ZXVlKTsKKwkJYnJlYWs7CisJY2FzZSBINFBfSURfQkNNMjA0ODoKKwkJZXJyID0gaGNpX2g0cF9iY21fc2VuZF9mdyhpbmZvLCBmd19xdWV1ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiRG9uJ3Qga25vdyBob3cgdG8gc2VuZCBmaXJtd2FyZVxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKwordm9pZCBoY2lfaDRwX3BhcnNlX2Z3X2V2ZW50KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3dpdGNoIChpbmZvLT5tYW5faWQpIHsKKwljYXNlIEg0UF9JRF9DU1I6CisJCWhjaV9oNHBfYmM0X3BhcnNlX2Z3X2V2ZW50KGluZm8sIHNrYik7CisJCWJyZWFrOworCWNhc2UgSDRQX0lEX1RJMTI3MToKKwkJaGNpX2g0cF90aTEyNzNfcGFyc2VfZndfZXZlbnQoaW5mbywgc2tiKTsKKwkJYnJlYWs7CisJY2FzZSBINFBfSURfQkNNMjA0ODoKKwkJaGNpX2g0cF9iY21fcGFyc2VfZndfZXZlbnQoaW5mbywgc2tiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihpbmZvLT5kZXYsICJEb24ndCBrbm93IGhvdyB0byBwYXJzZSBmdyBldmVudFxuIik7CisJCWluZm8tPmZ3X2Vycm9yID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm47Cit9CisKK01PRFVMRV9GSVJNV0FSRShGV19OQU1FX1RJMTI3MV9QUkVMRSk7CitNT0RVTEVfRklSTVdBUkUoRldfTkFNRV9USTEyNzFfTEUpOworTU9EVUxFX0ZJUk1XQVJFKEZXX05BTUVfVEkxMjcxKTsKK01PRFVMRV9GSVJNV0FSRShGV19OQU1FX0JDTTIwNDgpOworTU9EVUxFX0ZJUk1XQVJFKEZXX05BTUVfQ1NSKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvbm9raWFfdWFydC5jIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9ub2tpYV91YXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiNTdkZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvbm9raWFfdWFydC5jCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTm9raWEgSDRQIGJsdWV0b290aCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgTm9raWEgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSAiaGNpX2g0cC5oIgorCitpbmxpbmUgdm9pZCBoY2lfaDRwX291dGIoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IG9mZnNldCwgdTggdmFsKQoreworCV9fcmF3X3dyaXRlYih2YWwsIGluZm8tPnVhcnRfYmFzZSArIChvZmZzZXQgPDwgMikpOworfQorCitpbmxpbmUgdTggaGNpX2g0cF9pbmIoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGIoaW5mby0+dWFydF9iYXNlICsgKG9mZnNldCA8PCAyKSk7Cit9CisKK3ZvaWQgaGNpX2g0cF9zZXRfcnRzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIGludCBhY3RpdmUpCit7CisJdTggYjsKKworCWIgPSBoY2lfaDRwX2luYihpbmZvLCBVQVJUX01DUik7CisJaWYgKGFjdGl2ZSkKKwkJYiB8PSBVQVJUX01DUl9SVFM7CisJZWxzZQorCQliICY9IH5VQVJUX01DUl9SVFM7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfTUNSLCBiKTsKK30KKworaW50IGhjaV9oNHBfd2FpdF9mb3JfY3RzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIGludCBhY3RpdmUsCisJCQkgaW50IHRpbWVvdXRfbXMpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCBzdGF0ZTsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0X21zKTsKKwlmb3IgKDs7KSB7CisJCXN0YXRlID0gaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9NU1IpICYgVUFSVF9NU1JfQ1RTOworCQlpZiAoYWN0aXZlKSB7CisJCQlpZiAoc3RhdGUpCisJCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlpZiAoIXN0YXRlKQorCQkJCXJldHVybiAwOworCQl9CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCW1zbGVlcCgxKTsKKwl9Cit9CisKK3ZvaWQgX19oY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBpbnQgb24sIHU4IHdoaWNoKQoreworCXU4IGxjciwgYjsKKworCWxjciA9IGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfTENSKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9MQ1IsIDB4YmYpOworCWIgPSBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0VGUik7CisJaWYgKG9uKQorCQliIHw9IHdoaWNoOworCWVsc2UKKwkJYiAmPSB+d2hpY2g7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfRUZSLCBiKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9MQ1IsIGxjcik7Cit9CisKK3ZvaWQgaGNpX2g0cF9zZXRfYXV0b19jdHNydHMoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgaW50IG9uLCB1OCB3aGljaCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlfX2hjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKGluZm8sIG9uLCB3aGljaCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworfQorCit2b2lkIGhjaV9oNHBfY2hhbmdlX3NwZWVkKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHVuc2lnbmVkIGxvbmcgc3BlZWQpCit7CisJdW5zaWduZWQgaW50IGRpdmlzb3I7CisJdTggbGNyLCBtZHIxOworCisJQlRfREJHKCJTZXR0aW5nIHNwZWVkICVsdSIsIHNwZWVkKTsKKworCWlmIChzcGVlZCA+PSA0NjA4MDApIHsKKwkJZGl2aXNvciA9IFVBUlRfQ0xPQ0sgLyAxMyAvIHNwZWVkOworCQltZHIxID0gMzsKKwl9IGVsc2UgeworCQlkaXZpc29yID0gVUFSVF9DTE9DSyAvIDE2IC8gc3BlZWQ7CisJCW1kcjEgPSAwOworCX0KKworCS8qIE1ha2Ugc3VyZSBVQVJUIG1vZGUgaXMgZGlzYWJsZWQgKi8KKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9PTUFQX01EUjEsIDcpOworCisJbGNyID0gaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9MQ1IpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0xDUiwgVUFSVF9MQ1JfRExBQik7ICAgICAvKiBTZXQgRExBQiAqLworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0RMTCwgZGl2aXNvciAmIDB4ZmYpOyAgICAvKiBTZXQgc3BlZWQgKi8KKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9ETE0sIGRpdmlzb3IgPj4gOCk7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfTENSLCBsY3IpOworCisJLyogTWFrZSBzdXJlIFVBUlQgbW9kZSBpcyBlbmFibGVkICovCisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfT01BUF9NRFIxLCBtZHIxKTsKK30KKworaW50IGhjaV9oNHBfcmVzZXRfdWFydChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKQoreworCWludCBjb3VudCA9IDA7CisKKwkvKiBSZXNldCB0aGUgVUFSVCAqLworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX09NQVBfU1lTQywgVUFSVF9TWVNDX09NQVBfUkVTRVQpOworCXdoaWxlICghKGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfT01BUF9TWVNTKSAmIFVBUlRfU1lTU19SRVNFVERPTkUpKSB7CisJCWlmIChjb3VudCsrID4gMTAwKSB7CisJCQlkZXZfZXJyKGluZm8tPmRldiwgImhjaV9oNHA6IFVBUlQgcmVzZXQgdGltZW91dFxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQl1ZGVsYXkoMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaGNpX2g0cF9zdG9yZV9yZWdzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pCit7CisJdTE2IGxjciA9IDA7CisKKwlsY3IgPSBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0xDUik7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfTENSLCAweEJGKTsKKwlpbmZvLT5kbGwgPSBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0RMTCk7CisJaW5mby0+ZGxoID0gaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9ETE0pOworCWluZm8tPmVmciA9IGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfRUZSKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9MQ1IsIGxjcik7CisJaW5mby0+bWRyMSA9IGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfT01BUF9NRFIxKTsKKwlpbmZvLT5pZXIgPSBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0lFUik7Cit9CisKK3ZvaWQgaGNpX2g0cF9yZXN0b3JlX3JlZ3Moc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbykKK3sKKwl1MTYgbGNyID0gMDsKKworCWhjaV9oNHBfaW5pdF91YXJ0KGluZm8pOworCisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfT01BUF9NRFIxLCA3KTsKKwlsY3IgPSBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0xDUik7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfTENSLCAweEJGKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9ETEwsIGluZm8tPmRsbCk7ICAgIC8qIFNldCBzcGVlZCAqLworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0RMTSwgaW5mby0+ZGxoKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9FRlIsIGluZm8tPmVmcik7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfTENSLCBsY3IpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX09NQVBfTURSMSwgaW5mby0+bWRyMSk7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfSUVSLCBpbmZvLT5pZXIpOworfQorCit2b2lkIGhjaV9oNHBfaW5pdF91YXJ0KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pCit7CisJdTggbWNyLCBlZnI7CisKKwkvKiBFbmFibGUgYW5kIHNldHVwIEZJRk8gKi8KKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9PTUFQX01EUjEsIDB4MDApOworCisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfTENSLCAweGJmKTsKKwllZnIgPSBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0VGUik7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfRUZSLCBVQVJUX0VGUl9FQ0IpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0xDUiwgVUFSVF9MQ1JfRExBQik7CisJbWNyID0gaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9NQ1IpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX01DUiwgVUFSVF9NQ1JfVENSVExSKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9GQ1IsIFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwKKwkJCVVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUIHwKKwkJCSgzIDw8IDYpIHwgKDAgPDwgNCkpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0xDUiwgMHhiZik7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfVEk3NTJfVExSLCAweGVkKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9USTc1Ml9UQ1IsIDB4ZWYpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0VGUiwgZWZyKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9MQ1IsIFVBUlRfTENSX0RMQUIpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX01DUiwgMHgwMCk7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfTENSLCBVQVJUX0xDUl9XTEVOOCk7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfSUVSLCBVQVJUX0lFUl9SREkpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX09NQVBfU1lTQywgKDEgPDwgMCkgfCAoMSA8PCAyKSB8ICgyIDw8IDMpKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWMuYwppbmRleCAzZWUwYjE4Li45MGYxYzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlYy5jCkBAIC02NzgsOCArNjc4LDcgQEAKIAkJCW52ZWMtPnJ4LT5kYXRhW252ZWMtPnJ4LT5wb3MrK10gPSByZWNlaXZlZDsKIAkJZWxzZQogCQkJZGV2X2VycihudmVjLT5kZXYsCi0JCQkJIlJYIGJ1ZmZlciBvdmVyZmxvdyBvbiAlcDogIgotCQkJCSJUcnlpbmcgdG8gd3JpdGUgYnl0ZSAldSBvZiAldVxuIiwKKwkJCQkiUlggYnVmZmVyIG92ZXJmbG93IG9uICVwOiBUcnlpbmcgdG8gd3JpdGUgYnl0ZSAldSBvZiAldVxuIiwKIAkJCQludmVjLT5yeCwgbnZlYy0+cnggPyBudmVjLT5yeC0+cG9zIDogMCwKIAkJCQlOVkVDX01TR19TSVpFKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjX3BzMi5jIGIvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlY19wczIuYwppbmRleCAwNmRiYjAyLi40NWIyZjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjX3BzMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWNfcHMyLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCXN0cnVjdCBzZXJpbyAqc2VyX2RldjsKIAljaGFyIG1vdXNlX3Jlc2V0W10gPSB7IE5WRUNfUFMyLCBTRU5EX0NPTU1BTkQsIFBTTU9VU0VfUlNULCAzIH07CiAKLQlzZXJfZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNlcmlvKSwgR0ZQX0tFUk5FTCk7CisJc2VyX2RldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHNlcmlvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNlcl9kZXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24tdXNiL29jdGVvbi1oY2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24tdXNiL29jdGVvbi1oY2QuYwppbmRleCA1YTAwMWQ5Li44YjhjZTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9vY3Rlb24taGNkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi11c2Ivb2N0ZW9uLWhjZC5jCkBAIC00NjUsNiArNDY1LDExMiBAQAogI2RlZmluZSBVU0JfRklGT19BRERSRVNTKGNoYW5uZWwsIHVzYl9pbmRleCkgKENWTVhfVVNCQ1hfR09UR0NUTCh1c2JfaW5kZXgpICsgKChjaGFubmVsKSsxKSoweDEwMDApCiAKIC8qKgorICogc3RydWN0IG9jdGVvbl90ZW1wX2J1ZmZlciAtIGEgYm91bmNlIGJ1ZmZlciBmb3IgVVNCIHRyYW5zZmVycworICogQHRlbXBfYnVmZmVyOiB0aGUgbmV3bHkgYWxsb2NhdGVkIHRlbXBvcmFyeSBidWZmZXIgKGluY2x1ZGluZyBtZXRhLWRhdGEpCisgKiBAb3JpZ19idWZmZXI6IHRoZSBvcmlnaW5hbCBidWZmZXIgcGFzc2VkIGJ5IHRoZSBVU0Igc3RhY2sKKyAqIEBkYXRhOgkgdGhlIG5ld2x5IGFsbG9jYXRlZCB0ZW1wb3JhcnkgYnVmZmVyIChleGNsdWRpbmcgbWV0YS1kYXRhKQorICoKKyAqIEJvdGggdGhlIERNQSBlbmdpbmUgYW5kIEZJRk8gbW9kZSB3aWxsIGFsd2F5cyB0cmFuc2ZlciBmdWxsIDMyLWJpdCB3b3Jkcy4gSWYKKyAqIHRoZSBidWZmZXIgaXMgdG9vIHNob3J0LCB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEgdGVtcG9yYXJ5IG9uZSwgYW5kIHRoaXMgc3RydWN0CisgKiByZXByZXNlbnRzIGl0LgorICovCitzdHJ1Y3Qgb2N0ZW9uX3RlbXBfYnVmZmVyIHsKKwl2b2lkICp0ZW1wX2J1ZmZlcjsKKwl2b2lkICpvcmlnX2J1ZmZlcjsKKwl1OCBkYXRhWzBdOworfTsKKworLyoqCisgKiBvY3Rlb25fYWxsb2NfdGVtcF9idWZmZXIgLSBhbGxvY2F0ZSBhIHRlbXBvcmFyeSBidWZmZXIgZm9yIFVTQiB0cmFuc2ZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIG5lZWRlZCkKKyAqIEB1cmI6CVVSQi4KKyAqIEBtZW1fZmxhZ3M6CU1lbW9yeSBhbGxvY2F0aW9uIGZsYWdzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgdGVtcG9yYXJ5IGJvdW5jZSBidWZmZXIgd2hlbmV2ZXIgaXQncyBuZWVkZWQKKyAqIGR1ZSB0byBIVyBsaW1pdGF0aW9ucy4KKyAqLworc3RhdGljIGludCBvY3Rlb25fYWxsb2NfdGVtcF9idWZmZXIoc3RydWN0IHVyYiAqdXJiLCBnZnBfdCBtZW1fZmxhZ3MpCit7CisJc3RydWN0IG9jdGVvbl90ZW1wX2J1ZmZlciAqdGVtcDsKKworCWlmICh1cmItPm51bV9zZ3MgfHwgdXJiLT5zZyB8fAorCSAgICAodXJiLT50cmFuc2Zlcl9mbGFncyAmIFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQKSB8fAorCSAgICAhKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAlIHNpemVvZih1MzIpKSkKKwkJcmV0dXJuIDA7CisKKwl0ZW1wID0ga21hbGxvYyhBTElHTih1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsIHNpemVvZih1MzIpKSArCisJCSAgICAgICBzaXplb2YoKnRlbXApLCBtZW1fZmxhZ3MpOworCWlmICghdGVtcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0ZW1wLT50ZW1wX2J1ZmZlciA9IHRlbXA7CisJdGVtcC0+b3JpZ19idWZmZXIgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlpZiAodXNiX3VyYl9kaXJfb3V0KHVyYikpCisJCW1lbWNweSh0ZW1wLT5kYXRhLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJICAgICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CisJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSB0ZW1wLT5kYXRhOworCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0FMSUdORURfVEVNUF9CVUZGRVI7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBvY3Rlb25fZnJlZV90ZW1wX2J1ZmZlciAtIGZyZWUgYSB0ZW1wb3JhcnkgYnVmZmVyIHVzZWQgYnkgVVNCIHRyYW5zZmVycy4KKyAqIEB1cmI6IFVSQi4KKyAqCisgKiBGcmVlcyBhIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgb2N0ZW9uX2FsbG9jX3RlbXBfYnVmZmVyKCkuCisgKi8KK3N0YXRpYyB2b2lkIG9jdGVvbl9mcmVlX3RlbXBfYnVmZmVyKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3Qgb2N0ZW9uX3RlbXBfYnVmZmVyICp0ZW1wOworCisJaWYgKCEodXJiLT50cmFuc2Zlcl9mbGFncyAmIFVSQl9BTElHTkVEX1RFTVBfQlVGRkVSKSkKKwkJcmV0dXJuOworCisJdGVtcCA9IGNvbnRhaW5lcl9vZih1cmItPnRyYW5zZmVyX2J1ZmZlciwgc3RydWN0IG9jdGVvbl90ZW1wX2J1ZmZlciwKKwkJCSAgICBkYXRhKTsKKwlpZiAodXNiX3VyYl9kaXJfaW4odXJiKSkKKwkJbWVtY3B5KHRlbXAtPm9yaWdfYnVmZmVyLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJICAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSB0ZW1wLT5vcmlnX2J1ZmZlcjsKKwl1cmItPnRyYW5zZmVyX2ZsYWdzICY9IH5VUkJfQUxJR05FRF9URU1QX0JVRkZFUjsKKwlrZnJlZSh0ZW1wLT50ZW1wX2J1ZmZlcik7Cit9CisKKy8qKgorICogb2N0ZW9uX21hcF91cmJfZm9yX2RtYSAtIE9jdGVvbi1zcGVjaWZpYyBtYXBfdXJiX2Zvcl9kbWEoKS4KKyAqIEBoY2Q6CVVTQiBIQ0Qgc3RydWN0dXJlLgorICogQHVyYjoJVVJCLgorICogQG1lbV9mbGFnczoJTWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MuCisgKi8KK3N0YXRpYyBpbnQgb2N0ZW9uX21hcF91cmJfZm9yX2RtYShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIsCisJCQkJICBnZnBfdCBtZW1fZmxhZ3MpCit7CisJaW50IHJldDsKKworCXJldCA9IG9jdGVvbl9hbGxvY190ZW1wX2J1ZmZlcih1cmIsIG1lbV9mbGFncyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHVzYl9oY2RfbWFwX3VyYl9mb3JfZG1hKGhjZCwgdXJiLCBtZW1fZmxhZ3MpOworCWlmIChyZXQpCisJCW9jdGVvbl9mcmVlX3RlbXBfYnVmZmVyKHVyYik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG9jdGVvbl91bm1hcF91cmJfZm9yX2RtYSAtIE9jdGVvbi1zcGVjaWZpYyB1bm1hcF91cmJfZm9yX2RtYSgpCisgKiBAaGNkOglVU0IgSENEIHN0cnVjdHVyZS4KKyAqIEB1cmI6CVVSQi4KKyAqLworc3RhdGljIHZvaWQgb2N0ZW9uX3VubWFwX3VyYl9mb3JfZG1hKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1cmIgKnVyYikKK3sKKwl1c2JfaGNkX3VubWFwX3VyYl9mb3JfZG1hKGhjZCwgdXJiKTsKKwlvY3Rlb25fZnJlZV90ZW1wX2J1ZmZlcih1cmIpOworfQorCisvKioKICAqIFJlYWQgYSBVU0IgMzJiaXQgQ1NSLiBJdCBwZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGFkZHJlc3Mgc3dpenpsZQogICogZm9yIDMyYml0IENTUnMgYW5kIGxvZ3MgdGhlIHZhbHVlIGluIGEgcmVhZGFibGUgZm9ybWF0IGlmCiAgKiBkZWJ1Z2dpbmcgaXMgb24uCkBAIC02MDUsNyArNzExLDggQEAKIAkgKiAyYS4gV3JpdGUgVVNCTjAvMV9DTEtfQ1RMW1BPUl0gPSAxIGFuZAogCSAqICAgICBVU0JOMC8xX0NMS19DVExbSFJTVCxQUlNULEhDTEtfUlNUXSA9IDAKIAkgKi8KLQl1c2JuX2Nsa19jdGwudTY0ID0gX19jdm14X3VzYl9yZWFkX2NzcjY0KHVzYiwgQ1ZNWF9VU0JOWF9DTEtfQ1RMKHVzYi0+aW5kZXgpKTsKKwl1c2JuX2Nsa19jdGwudTY0ID0KKwkJX19jdm14X3VzYl9yZWFkX2NzcjY0KHVzYiwgQ1ZNWF9VU0JOWF9DTEtfQ1RMKHVzYi0+aW5kZXgpKTsKIAl1c2JuX2Nsa19jdGwucy5wb3IgPSAxOwogCXVzYm5fY2xrX2N0bC5zLmhyc3QgPSAwOwogCXVzYm5fY2xrX2N0bC5zLnByc3QgPSAwOwpAQCAtNjkxLDcgKzc5OCw4IEBACiAJICogICAgVVNCUCBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXI6CiAJICogICAgVVNCTl9VU0JQX0NUTF9TVEFUVVNbQVRFX1JFU0VUXSA9IDEKIAkgKi8KLQl1c2JuX3VzYnBfY3RsX3N0YXR1cy51NjQgPSBfX2N2bXhfdXNiX3JlYWRfY3NyNjQodXNiLCBDVk1YX1VTQk5YX1VTQlBfQ1RMX1NUQVRVUyh1c2ItPmluZGV4KSk7CisJdXNibl91c2JwX2N0bF9zdGF0dXMudTY0ID0gX19jdm14X3VzYl9yZWFkX2NzcjY0KHVzYiwKKwkJCUNWTVhfVVNCTlhfVVNCUF9DVExfU1RBVFVTKHVzYi0+aW5kZXgpKTsKIAl1c2JuX3VzYnBfY3RsX3N0YXR1cy5zLmF0ZV9yZXNldCA9IDE7CiAJX19jdm14X3VzYl93cml0ZV9jc3I2NCh1c2IsIENWTVhfVVNCTlhfVVNCUF9DVExfU1RBVFVTKHVzYi0+aW5kZXgpLAogCQkJICAgICAgIHVzYm5fdXNicF9jdGxfc3RhdHVzLnU2NCk7CkBAIC03NTgsNyArODY2LDggQEAKIAkJaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ04zMVhYKSkKIAkJCXVzYi0+aW5pdF9mbGFncyB8PSBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX05PX0RNQTsKIAkJdXNiY3hfZ2FoYmNmZy51MzIgPSAwOwotCQl1c2JjeF9nYWhiY2ZnLnMuZG1hZW4gPSAhKHVzYi0+aW5pdF9mbGFncyAmIENWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfTk9fRE1BKTsKKwkJdXNiY3hfZ2FoYmNmZy5zLmRtYWVuID0gISh1c2ItPmluaXRfZmxhZ3MgJgorCQkJCQkgIENWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfTk9fRE1BKTsKIAkJaWYgKHVzYi0+aW5pdF9mbGFncyAmIENWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfTk9fRE1BKQogCQkJLyogT25seSB1c2Ugb25lIGNoYW5uZWwgd2l0aCBub24gRE1BICovCiAJCQl1c2ItPmlkbGVfaGFyZHdhcmVfY2hhbm5lbHMgPSAweDE7CkBAIC03ODMsNyArODkyLDggQEAKIAkgKi8KIAl7CiAJCXVuaW9uIGN2bXhfdXNiY3hfZ3VzYmNmZyB1c2JjeF9ndXNiY2ZnOwotCQl1c2JjeF9ndXNiY2ZnLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfR1VTQkNGRyh1c2ItPmluZGV4KSk7CisJCXVzYmN4X2d1c2JjZmcudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQlDVk1YX1VTQkNYX0dVU0JDRkcodXNiLT5pbmRleCkpOwogCQl1c2JjeF9ndXNiY2ZnLnMudG91dGNhbCA9IDA7CiAJCXVzYmN4X2d1c2JjZmcucy5kZHJzZWwgPSAwOwogCQl1c2JjeF9ndXNiY2ZnLnMudXNidHJkdGltID0gMHg1OwpAQCAtODAxLDcgKzkxMSw4IEBACiAJCXVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zayB1c2JjeF9naW50bXNrOwogCQlpbnQgY2hhbm5lbDsKIAotCQl1c2JjeF9naW50bXNrLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSk7CisJCXVzYmN4X2dpbnRtc2sudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQlDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCkpOwogCQl1c2JjeF9naW50bXNrLnMub3RnaW50bXNrID0gMTsKIAkJdXNiY3hfZ2ludG1zay5zLm1vZGVtaXNtc2sgPSAxOwogCQl1c2JjeF9naW50bXNrLnMuaGNoaW50bXNrID0gMTsKQEAgLTgxNyw3ICs5MjgsOCBAQAogCQkgKiBsYXRlci4KIAkJICovCiAJCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCA4OyBjaGFubmVsKyspCi0JCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ0lOVE1TS1goY2hhbm5lbCwgdXNiLT5pbmRleCksIDApOworCQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCisJCQkJQ1ZNWF9VU0JDWF9IQ0lOVE1TS1goY2hhbm5lbCwgdXNiLT5pbmRleCksIDApOwogCX0KIAogCXsKQEAgLTgyNywyNiArOTM5LDMwIEBACiAJCSAqIDEuIFByb2dyYW0gdGhlIGhvc3QtcG9ydCBpbnRlcnJ1cHQtbWFzayBmaWVsZCB0byB1bm1hc2ssCiAJCSAqICAgIFVTQkNfR0lOVE1TS1tQUlRJTlRdID0gMQogCQkgKi8KLQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9naW50bXNrLAotCQkJCXBydGludG1zaywgMSk7Ci0JCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zaywKLQkJCQlkaXNjb25uaW50bXNrLCAxKTsKKwkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwKKwkJCQl1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssIHBydGludG1zaywgMSk7CisJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksCisJCQkJdW5pb24gY3ZteF91c2JjeF9naW50bXNrLCBkaXNjb25uaW50bXNrLCAxKTsKIAkJLyoKIAkJICogMi4gUHJvZ3JhbSB0aGUgVVNCQ19IQ0ZHIHJlZ2lzdGVyIHRvIHNlbGVjdCBmdWxsLXNwZWVkIGhvc3QKIAkJICogICAgb3IgaGlnaC1zcGVlZCBob3N0LgogCQkgKi8KIAkJewogCQkJdW5pb24gY3ZteF91c2JjeF9oY2ZnIHVzYmN4X2hjZmc7Ci0JCQl1c2JjeF9oY2ZnLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENGRyh1c2ItPmluZGV4KSk7CisJCQl1c2JjeF9oY2ZnLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJCUNWTVhfVVNCQ1hfSENGRyh1c2ItPmluZGV4KSk7CiAJCQl1c2JjeF9oY2ZnLnMuZnNsc3N1cHAgPSAwOwogCQkJdXNiY3hfaGNmZy5zLmZzbHNwY2xrc2VsID0gMDsKLQkJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDRkcodXNiLT5pbmRleCksIHVzYmN4X2hjZmcudTMyKTsKKwkJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAorCQkJCQlDVk1YX1VTQkNYX0hDRkcodXNiLT5pbmRleCksCisJCQkJCXVzYmN4X2hjZmcudTMyKTsKIAkJfQogCQkvKgogCQkgKiAzLiBQcm9ncmFtIHRoZSBwb3J0IHBvd2VyIGJpdCB0byBkcml2ZSBWQlVTIG9uIHRoZSBVU0IsCiAJCSAqICAgIFVTQkNfSFBSVFtQUlRQV1JdID0gMQogCQkgKi8KLQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9ocHJ0LCBwcnRwd3IsIDEpOworCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLAorCQkJCXVuaW9uIGN2bXhfdXNiY3hfaHBydCwgcHJ0cHdyLCAxKTsKIAogCQkvKgogCQkgKiBTdGVwcyA0LTE1IGZyb20gdGhlIG1hbnVhbCBhcmUgZG9uZSBsYXRlciBpbiB0aGUgcG9ydCBlbmFibGUKQEAgLTg3OSw3ICs5OTUsOCBAQAogCQlyZXR1cm4gLUVCVVNZOwogCiAJLyogRGlzYWJsZSB0aGUgY2xvY2tzIGFuZCBwdXQgdGhlbSBpbiBwb3dlciBvbiByZXNldCAqLwotCXVzYm5fY2xrX2N0bC51NjQgPSBfX2N2bXhfdXNiX3JlYWRfY3NyNjQodXNiLCBDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCkpOworCXVzYm5fY2xrX2N0bC51NjQgPSBfX2N2bXhfdXNiX3JlYWRfY3NyNjQodXNiLAorCQkJQ1ZNWF9VU0JOWF9DTEtfQ1RMKHVzYi0+aW5kZXgpKTsKIAl1c2JuX2Nsa19jdGwucy5lbmFibGUgPSAxOwogCXVzYm5fY2xrX2N0bC5zLnBvciA9IDE7CiAJdXNibl9jbGtfY3RsLnMuaGNsa19yc3QgPSAxOwpAQCAtOTAzLDcgKzEwMjAsOCBAQAogewogCXVuaW9uIGN2bXhfdXNiY3hfZ2h3Y2ZnMyB1c2JjeF9naHdjZmczOwogCi0JdXNiLT51c2JjeF9ocHJ0LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSk7CisJdXNiLT51c2JjeF9ocHJ0LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQlDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCkpOwogCiAJLyoKIAkgKiBJZiB0aGUgcG9ydCBpcyBhbHJlYWR5IGVuYWJsZWQgdGhlIGp1c3QgcmV0dXJuLiBXZSBkb24ndCBuZWVkIHRvIGRvCkBAIC05MTMsMTIgKzEwMzEsMTIgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBJZiB0aGVyZSBpcyBub3RoaW5nIHBsdWdnZWQgaW50byB0aGUgcG9ydCB0aGVuIGZhaWwgaW1tZWRpYXRlbHkgKi8KLQlpZiAoIXVzYi0+dXNiY3hfaHBydC5zLnBydGNvbm5zdHMpIHsKKwlpZiAoIXVzYi0+dXNiY3hfaHBydC5zLnBydGNvbm5zdHMpCiAJCXJldHVybiAtRVRJTUVET1VUOwotCX0KIAogCS8qIFByb2dyYW0gdGhlIHBvcnQgcmVzZXQgYml0IHRvIHN0YXJ0IHRoZSByZXNldCBwcm9jZXNzICovCi0JVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9ocHJ0LCBwcnRyc3QsIDEpOworCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfaHBydCwKKwkJCXBydHJzdCwgMSk7CiAKIAkvKgogCSAqIFdhaXQgYXQgbGVhc3QgNTBtcyAoaGlnaCBzcGVlZCksIG9yIDEwbXMgKGZ1bGwgc3BlZWQpIGZvciB0aGUgcmVzZXQKQEAgLTkyNywyNiArMTA0NSwzMCBAQAogCW1kZWxheSg1MCk7CiAKIAkvKiBQcm9ncmFtIHRoZSBwb3J0IHJlc2V0IGJpdCB0byAwLCBVU0JDX0hQUlRbUFJUUlNUXSA9IDAgKi8KLQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2hwcnQsIHBydHJzdCwgMCk7CisJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9ocHJ0LAorCQkJcHJ0cnN0LCAwKTsKIAogCS8qIFdhaXQgZm9yIHRoZSBVU0JDX0hQUlRbUFJURU5BXS4gKi8KLQlpZiAoQ1ZNWF9XQUlUX0ZPUl9GSUVMRDMyKENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9ocHJ0LAotCQkJCSAgcHJ0ZW5hLCA9PSwgMSwgMTAwMDAwKSkKKwlpZiAoQ1ZNWF9XQUlUX0ZPUl9GSUVMRDMyKENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwKKwkJCQl1bmlvbiBjdm14X3VzYmN4X2hwcnQsIHBydGVuYSwgPT0sIDEsIDEwMDAwMCkpCiAJCXJldHVybiAtRVRJTUVET1VUOwogCiAJLyoKIAkgKiBSZWFkIHRoZSBwb3J0IHNwZWVkIGZpZWxkIHRvIGdldCB0aGUgZW51bWVyYXRlZCBzcGVlZCwKIAkgKiBVU0JDX0hQUlRbUFJUU1BEXS4KIAkgKi8KLQl1c2ItPnVzYmN4X2hwcnQudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpKTsKLQl1c2JjeF9naHdjZmczLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfR0hXQ0ZHMyh1c2ItPmluZGV4KSk7CisJdXNiLT51c2JjeF9ocHJ0LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQlDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCkpOworCXVzYmN4X2dod2NmZzMudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCUNWTVhfVVNCQ1hfR0hXQ0ZHMyh1c2ItPmluZGV4KSk7CiAKIAkvKgogCSAqIDEzLiBQcm9ncmFtIHRoZSBVU0JDX0dSWEZTSVogcmVnaXN0ZXIgdG8gc2VsZWN0IHRoZSBzaXplIG9mIHRoZQogCSAqICAgICByZWNlaXZlIEZJRk8gKDI1JSkuCiAJICovCi0JVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR1JYRlNJWih1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9ncnhmc2l6LAotCQkJcnhmZGVwLCB1c2JjeF9naHdjZmczLnMuZGZpZm9kZXB0aCAvIDQpOworCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dSWEZTSVoodXNiLT5pbmRleCksCisJCQl1bmlvbiBjdm14X3VzYmN4X2dyeGZzaXosIHJ4ZmRlcCwKKwkJCXVzYmN4X2dod2NmZzMucy5kZmlmb2RlcHRoIC8gNCk7CiAJLyoKIAkgKiAxNC4gUHJvZ3JhbSB0aGUgVVNCQ19HTlBUWEZTSVogcmVnaXN0ZXIgdG8gc2VsZWN0IHRoZSBzaXplIGFuZCB0aGUKIAkgKiAgICAgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbm9uLSBwZXJpb2RpYyB0cmFuc21pdCBGSUZPIGZvciBub25wZXJpb2RpYwpAQCAtOTU0LDEwICsxMDc2LDEyIEBACiAJICovCiAJewogCQl1bmlvbiBjdm14X3VzYmN4X2ducHR4ZnNpeiBzaXo7Ci0JCXNpei51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0dOUFRYRlNJWih1c2ItPmluZGV4KSk7CisJCXNpei51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCUNWTVhfVVNCQ1hfR05QVFhGU0laKHVzYi0+aW5kZXgpKTsKIAkJc2l6LnMubnB0eGZkZXAgPSB1c2JjeF9naHdjZmczLnMuZGZpZm9kZXB0aCAvIDI7CiAJCXNpei5zLm5wdHhmc3RhZGRyID0gdXNiY3hfZ2h3Y2ZnMy5zLmRmaWZvZGVwdGggLyA0OwotCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9HTlBUWEZTSVoodXNiLT5pbmRleCksIHNpei51MzIpOworCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9HTlBUWEZTSVoodXNiLT5pbmRleCksCisJCQkJICAgICAgIHNpei51MzIpOwogCX0KIAkvKgogCSAqIDE1LiBQcm9ncmFtIHRoZSBVU0JDX0hQVFhGU0laIHJlZ2lzdGVyIHRvIHNlbGVjdCB0aGUgc2l6ZSBhbmQgc3RhcnQKQEAgLTk2NiwxOCArMTA5MCwyNSBAQAogCSAqLwogCXsKIAkJdW5pb24gY3ZteF91c2JjeF9ocHR4ZnNpeiBzaXo7Ci0JCXNpei51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hQVFhGU0laKHVzYi0+aW5kZXgpKTsKKwkJc2l6LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJQ1ZNWF9VU0JDWF9IUFRYRlNJWih1c2ItPmluZGV4KSk7CiAJCXNpei5zLnB0eGZzaXplID0gdXNiY3hfZ2h3Y2ZnMy5zLmRmaWZvZGVwdGggLyA0OwogCQlzaXoucy5wdHhmc3RhZGRyID0gMyAqIHVzYmN4X2dod2NmZzMucy5kZmlmb2RlcHRoIC8gNDsKLQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSFBUWEZTSVoodXNiLT5pbmRleCksIHNpei51MzIpOworCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IUFRYRlNJWih1c2ItPmluZGV4KSwKKwkJCQkgICAgICAgc2l6LnUzMik7CiAJfQogCS8qIEZsdXNoIGFsbCBGSUZPcyAqLwotCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dSU1RDVEwodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfZ3JzdGN0bCwgdHhmbnVtLCAweDEwKTsKLQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HUlNUQ1RMKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2dyc3RjdGwsIHR4ZmZsc2gsIDEpOwotCUNWTVhfV0FJVF9GT1JfRklFTEQzMihDVk1YX1VTQkNYX0dSU1RDVEwodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfZ3JzdGN0bCwKKwlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HUlNUQ1RMKHVzYi0+aW5kZXgpLAorCQkJdW5pb24gY3ZteF91c2JjeF9ncnN0Y3RsLCB0eGZudW0sIDB4MTApOworCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dSU1RDVEwodXNiLT5pbmRleCksCisJCQl1bmlvbiBjdm14X3VzYmN4X2dyc3RjdGwsIHR4ZmZsc2gsIDEpOworCUNWTVhfV0FJVF9GT1JfRklFTEQzMihDVk1YX1VTQkNYX0dSU1RDVEwodXNiLT5pbmRleCksCisJCQkgICAgICB1bmlvbiBjdm14X3VzYmN4X2dyc3RjdGwsCiAJCQkgICAgICB0eGZmbHNoLCA9PSwgMCwgMTAwKTsKLQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HUlNUQ1RMKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2dyc3RjdGwsIHJ4ZmZsc2gsIDEpOwotCUNWTVhfV0FJVF9GT1JfRklFTEQzMihDVk1YX1VTQkNYX0dSU1RDVEwodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfZ3JzdGN0bCwKKwlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HUlNUQ1RMKHVzYi0+aW5kZXgpLAorCQkJdW5pb24gY3ZteF91c2JjeF9ncnN0Y3RsLCByeGZmbHNoLCAxKTsKKwlDVk1YX1dBSVRfRk9SX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HUlNUQ1RMKHVzYi0+aW5kZXgpLAorCQkJICAgICAgdW5pb24gY3ZteF91c2JjeF9ncnN0Y3RsLAogCQkJICAgICAgcnhmZmxzaCwgPT0sIDAsIDEwMCk7CiAKIAlyZXR1cm4gMDsKQEAgLTk5Nyw3ICsxMTI4LDggQEAKIHN0YXRpYyBpbnQgY3ZteF91c2JfZGlzYWJsZShzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYikKIHsKIAkvKiBEaXNhYmxlIHRoZSBwb3J0ICovCi0JVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9ocHJ0LCBwcnRlbmEsIDEpOworCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfaHBydCwKKwkJCXBydGVuYSwgMSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMTMsMjAgKzExNDUsMjMgQEAKICAqCiAgKiBSZXR1cm5zOiBQb3J0IHN0YXR1cyBpbmZvcm1hdGlvbgogICovCi1zdGF0aWMgc3RydWN0IGN2bXhfdXNiX3BvcnRfc3RhdHVzIGN2bXhfdXNiX2dldF9zdGF0dXMoc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IpCitzdGF0aWMgc3RydWN0IGN2bXhfdXNiX3BvcnRfc3RhdHVzIGN2bXhfdXNiX2dldF9zdGF0dXMoCisJCXN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiKQogewogCXVuaW9uIGN2bXhfdXNiY3hfaHBydCB1c2JjX2hwcnQ7CiAJc3RydWN0IGN2bXhfdXNiX3BvcnRfc3RhdHVzIHJlc3VsdDsKIAogCW1lbXNldCgmcmVzdWx0LCAwLCBzaXplb2YocmVzdWx0KSk7CiAKLQl1c2JjX2hwcnQudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpKTsKKwl1c2JjX2hwcnQudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCUNWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSk7CiAJcmVzdWx0LnBvcnRfZW5hYmxlZCA9IHVzYmNfaHBydC5zLnBydGVuYTsKIAlyZXN1bHQucG9ydF9vdmVyX2N1cnJlbnQgPSB1c2JjX2hwcnQucy5wcnRvdnJjdXJyYWN0OwogCXJlc3VsdC5wb3J0X3Bvd2VyZWQgPSB1c2JjX2hwcnQucy5wcnRwd3I7CiAJcmVzdWx0LnBvcnRfc3BlZWQgPSB1c2JjX2hwcnQucy5wcnRzcGQ7CiAJcmVzdWx0LmNvbm5lY3RlZCA9IHVzYmNfaHBydC5zLnBydGNvbm5zdHM7Ci0JcmVzdWx0LmNvbm5lY3RfY2hhbmdlID0gKHJlc3VsdC5jb25uZWN0ZWQgIT0gdXNiLT5wb3J0X3N0YXR1cy5jb25uZWN0ZWQpOworCXJlc3VsdC5jb25uZWN0X2NoYW5nZSA9CisJCShyZXN1bHQuY29ubmVjdGVkICE9IHVzYi0+cG9ydF9zdGF0dXMuY29ubmVjdGVkKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0xMTIxLDcgKzEyNTYsOCBAQAogCWlmICh1bmxpa2VseSgoZGV2aWNlX3NwZWVkICE9IENWTVhfVVNCX1NQRUVEX0hJR0gpICYmCiAJCShtdWx0aV9jb3VudCAhPSAwKSkpCiAJCXJldHVybiBOVUxMOwotCWlmICh1bmxpa2VseSgoaHViX2RldmljZV9hZGRyIDwgMCkgfHwgKGh1Yl9kZXZpY2VfYWRkciA+IE1BWF9VU0JfQUREUkVTUykpKQorCWlmICh1bmxpa2VseSgoaHViX2RldmljZV9hZGRyIDwgMCkgfHwKKwkJKGh1Yl9kZXZpY2VfYWRkciA+IE1BWF9VU0JfQUREUkVTUykpKQogCQlyZXR1cm4gTlVMTDsKIAlpZiAodW5saWtlbHkoKGh1Yl9wb3J0IDwgMCkgfHwgKGh1Yl9wb3J0ID4gTUFYX1VTQl9IVUJfUE9SVCkpKQogCQlyZXR1cm4gTlVMTDsKQEAgLTExODYsNyArMTMyMiw4IEBACiAJdWludDY0X3QgYWRkcmVzczsKIAl1aW50MzJfdCAqcHRyOwogCi0Jcnhfc3RhdHVzLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfR1JYU1RTUEgodXNiLT5pbmRleCkpOworCXJ4X3N0YXR1cy51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJQ1ZNWF9VU0JDWF9HUlhTVFNQSCh1c2ItPmluZGV4KSk7CiAJLyogT25seSByZWFkIGRhdGEgaWYgSU4gZGF0YSBpcyB0aGVyZSAqLwogCWlmIChyeF9zdGF0dXMucy5wa3RzdHMgIT0gMikKIAkJcmV0dXJuOwpAQCAtMTIzNiw3ICsxMzczLDggQEAKIAl3aGlsZSAoYXZhaWxhYmxlICYmIChmaWZvLT5oZWFkICE9IGZpZm8tPnRhaWwpKSB7CiAJCWludCBpID0gZmlmby0+dGFpbDsKIAkJY29uc3QgdWludDMyX3QgKnB0ciA9IGN2bXhfcGh5c190b19wdHIoZmlmby0+ZW50cnlbaV0uYWRkcmVzcyk7Ci0JCXVpbnQ2NF90IGNzcl9hZGRyZXNzID0gVVNCX0ZJRk9fQUREUkVTUyhmaWZvLT5lbnRyeVtpXS5jaGFubmVsLCB1c2ItPmluZGV4KSBeIDQ7CisJCXVpbnQ2NF90IGNzcl9hZGRyZXNzID0gVVNCX0ZJRk9fQUREUkVTUyhmaWZvLT5lbnRyeVtpXS5jaGFubmVsLAorCQkJCQkJCXVzYi0+aW5kZXgpIF4gNDsKIAkJaW50IHdvcmRzID0gYXZhaWxhYmxlOwogCiAJCS8qIExpbWl0IHRoZSBhbW91bnQgb2YgZGF0YSB0byB3YWh0IHRoZSBTVyBmaWZvIGhhcyAqLwpAQCAtMTI2MCw3ICsxMzk4LDggQEAKIAkJCWN2bXhfd3JpdGU2NF91aW50MzIoY3NyX2FkZHJlc3MsICpwdHIrKyk7CiAJCQljdm14X3dyaXRlNjRfdWludDMyKGNzcl9hZGRyZXNzLCAqcHRyKyspOwogCQkJY3ZteF93cml0ZTY0X3VpbnQzMihjc3JfYWRkcmVzcywgKnB0cisrKTsKLQkJCWN2bXhfcmVhZDY0X3VpbnQ2NChDVk1YX1VTQk5YX0RNQTBfSU5CX0NITjAodXNiLT5pbmRleCkpOworCQkJY3ZteF9yZWFkNjRfdWludDY0KAorCQkJCQlDVk1YX1VTQk5YX0RNQTBfSU5CX0NITjAodXNiLT5pbmRleCkpOwogCQkJd29yZHMgLT0gMzsKIAkJfQogCQljdm14X3dyaXRlNjRfdWludDMyKGNzcl9hZGRyZXNzLCAqcHRyKyspOwpAQCAtMTI4NCwyMCArMTQyMywzMiBAQAogewogCWlmICh1c2ItPnBlcmlvZGljLmhlYWQgIT0gdXNiLT5wZXJpb2RpYy50YWlsKSB7CiAJCXVuaW9uIGN2bXhfdXNiY3hfaHB0eHN0cyB0eF9zdGF0dXM7Ci0JCXR4X3N0YXR1cy51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hQVFhTVFModXNiLT5pbmRleCkpOwotCQlpZiAoX19jdm14X3VzYl9maWxsX3R4X2h3KHVzYiwgJnVzYi0+cGVyaW9kaWMsIHR4X3N0YXR1cy5zLnB0eGZzcGNhdmFpbCkpCi0JCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssIHB0eGZlbXBtc2ssIDEpOworCQl0eF9zdGF0dXMudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQlDVk1YX1VTQkNYX0hQVFhTVFModXNiLT5pbmRleCkpOworCQlpZiAoX19jdm14X3VzYl9maWxsX3R4X2h3KHVzYiwgJnVzYi0+cGVyaW9kaWMsCisJCQkJCSAgdHhfc3RhdHVzLnMucHR4ZnNwY2F2YWlsKSkKKwkJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksCisJCQkJCXVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zaywKKwkJCQkJcHR4ZmVtcG1zaywgMSk7CiAJCWVsc2UKLQkJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zaywgcHR4ZmVtcG1zaywgMCk7CisJCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLAorCQkJCQl1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssCisJCQkJCXB0eGZlbXBtc2ssIDApOwogCX0KIAogCWlmICh1c2ItPm5vbnBlcmlvZGljLmhlYWQgIT0gdXNiLT5ub25wZXJpb2RpYy50YWlsKSB7CiAJCXVuaW9uIGN2bXhfdXNiY3hfZ25wdHhzdHMgdHhfc3RhdHVzOwotCQl0eF9zdGF0dXMudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9HTlBUWFNUUyh1c2ItPmluZGV4KSk7Ci0JCWlmIChfX2N2bXhfdXNiX2ZpbGxfdHhfaHcodXNiLCAmdXNiLT5ub25wZXJpb2RpYywgdHhfc3RhdHVzLnMubnB0eGZzcGNhdmFpbCkpCi0JCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssIG5wdHhmZW1wbXNrLCAxKTsKKwkJdHhfc3RhdHVzLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJQ1ZNWF9VU0JDWF9HTlBUWFNUUyh1c2ItPmluZGV4KSk7CisJCWlmIChfX2N2bXhfdXNiX2ZpbGxfdHhfaHcodXNiLCAmdXNiLT5ub25wZXJpb2RpYywKKwkJCQkJICB0eF9zdGF0dXMucy5ucHR4ZnNwY2F2YWlsKSkKKwkJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksCisJCQkJCXVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zaywKKwkJCQkJbnB0eGZlbXBtc2ssIDEpOwogCQllbHNlCi0JCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssIG5wdHhmZW1wbXNrLCAwKTsKKwkJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksCisJCQkJCXVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zaywKKwkJCQkJbnB0eGZlbXBtc2ssIDApOwogCX0KIAogCXJldHVybjsKQEAgLTEzMTgsMTIgKzE0NjksMTQgQEAKIAlzdHJ1Y3QgY3ZteF91c2JfdHhfZmlmbyAqZmlmbzsKIAogCS8qIFdlIG9ubHkgbmVlZCB0byBmaWxsIGRhdGEgb24gb3V0Ym91bmQgY2hhbm5lbHMgKi8KLQloY2NoYXIudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKKwloY2NoYXIudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCUNWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CiAJaWYgKGhjY2hhci5zLmVwZGlyICE9IENWTVhfVVNCX0RJUkVDVElPTl9PVVQpCiAJCXJldHVybjsKIAogCS8qIE9VVCBTcGxpdHMgb25seSBoYXZlIGRhdGEgb24gdGhlIHN0YXJ0IGFuZCBub3QgdGhlIGNvbXBsZXRlICovCi0JdXNiY19oY3NwbHQudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ1NQTFRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKKwl1c2JjX2hjc3BsdC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJQ1ZNWF9VU0JDWF9IQ1NQTFRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKIAlpZiAodXNiY19oY3NwbHQucy5zcGx0ZW5hICYmIHVzYmNfaGNzcGx0LnMuY29tcHNwbHQpCiAJCXJldHVybjsKIApAQCAtMTMzMSw3ICsxNDg0LDggQEAKIAkgKiBGaW5kIG91dCBob3cgbWFueSBieXRlcyB3ZSBuZWVkIHRvIGZpbGwgYW5kIGNvbnZlcnQgaXQgaW50byAzMmJpdAogCSAqIHdvcmRzLgogCSAqLwotCXVzYmNfaGN0c2l6LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CisJdXNiY19oY3RzaXoudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCUNWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CiAJaWYgKCF1c2JjX2hjdHNpei5zLnhmZXJzaXplKQogCQlyZXR1cm47CiAKQEAgLTEzNzEsMTEgKzE1MjUsMTMgQEAKIAkJCQkgbm9kZSk7CiAJdW5pb24gY3ZteF91c2JfY29udHJvbF9oZWFkZXIgKmhlYWRlciA9CiAJCWN2bXhfcGh5c190b19wdHIodHJhbnNhY3Rpb24tPmNvbnRyb2xfaGVhZGVyKTsKLQlpbnQgYnl0ZXNfdG9fdHJhbnNmZXIgPSB0cmFuc2FjdGlvbi0+YnVmZmVyX2xlbmd0aCAtIHRyYW5zYWN0aW9uLT5hY3R1YWxfYnl0ZXM7CisJaW50IGJ5dGVzX3RvX3RyYW5zZmVyID0gdHJhbnNhY3Rpb24tPmJ1ZmZlcl9sZW5ndGggLQorCQl0cmFuc2FjdGlvbi0+YWN0dWFsX2J5dGVzOwogCWludCBwYWNrZXRzX3RvX3RyYW5zZmVyOwogCXVuaW9uIGN2bXhfdXNiY3hfaGN0c2l6eCB1c2JjX2hjdHNpejsKIAotCXVzYmNfaGN0c2l6LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CisJdXNiY19oY3RzaXoudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCUNWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CiAKIAlzd2l0Y2ggKHRyYW5zYWN0aW9uLT5zdGFnZSkgewogCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfTk9OX0NPTlRST0w6CkBAIC0xNDIzLDEyICsxNTc5LDE0IEBACiAJCQkJKChoZWFkZXItPnMucmVxdWVzdF90eXBlICYgMHg4MCkgPwogCQkJCQlDVk1YX1VTQl9ESVJFQ1RJT05fSU4gOgogCQkJCQlDVk1YX1VTQl9ESVJFQ1RJT05fT1VUKSk7Ci0JCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDU1BMVFgoY2hhbm5lbCwgdXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfaGNzcGx0eCwgY29tcHNwbHQsIDEpOworCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IQ1NQTFRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAorCQkJCXVuaW9uIGN2bXhfdXNiY3hfaGNzcGx0eCwgY29tcHNwbHQsIDEpOwogCQlicmVhazsKIAljYXNlIENWTVhfVVNCX1NUQUdFX1NUQVRVUzoKIAkJdXNiY19oY3RzaXoucy5waWQgPSBfX2N2bXhfdXNiX2dldF9kYXRhX3BpZChwaXBlKTsKIAkJYnl0ZXNfdG9fdHJhbnNmZXIgPSAwOwotCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2hjY2hhcngsIGVwZGlyLAorCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAorCQkJCXVuaW9uIGN2bXhfdXNiY3hfaGNjaGFyeCwgZXBkaXIsCiAJCQkJKChoZWFkZXItPnMucmVxdWVzdF90eXBlICYgMHg4MCkgPwogCQkJCQlDVk1YX1VTQl9ESVJFQ1RJT05fT1VUIDoKIAkJCQkJQ1ZNWF9VU0JfRElSRUNUSU9OX0lOKSk7CkBAIC0xNDM2LDExICsxNTk0LDEzIEBACiAJY2FzZSBDVk1YX1VTQl9TVEFHRV9TVEFUVVNfU1BMSVRfQ09NUExFVEU6CiAJCXVzYmNfaGN0c2l6LnMucGlkID0gX19jdm14X3VzYl9nZXRfZGF0YV9waWQocGlwZSk7CiAJCWJ5dGVzX3RvX3RyYW5zZmVyID0gMDsKLQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9oY2NoYXJ4LCBlcGRpciwKKwkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSwKKwkJCQl1bmlvbiBjdm14X3VzYmN4X2hjY2hhcngsIGVwZGlyLAogCQkJCSgoaGVhZGVyLT5zLnJlcXVlc3RfdHlwZSAmIDB4ODApID8KIAkJCQkJQ1ZNWF9VU0JfRElSRUNUSU9OX09VVCA6CiAJCQkJCUNWTVhfVVNCX0RJUkVDVElPTl9JTikpOwotCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IQ1NQTFRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2hjc3BsdHgsIGNvbXBzcGx0LCAxKTsKKwkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSENTUExUWChjaGFubmVsLCB1c2ItPmluZGV4KSwKKwkJCQl1bmlvbiBjdm14X3VzYmN4X2hjc3BsdHgsIGNvbXBzcGx0LCAxKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xNDU4LDEwICsxNjE4LDEyIEBACiAJICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcGFja2V0cyB0byB0cmFuc2Zlci4gSWYgdGhlIGxlbmd0aCBpcyB6ZXJvCiAJICogd2Ugc3RpbGwgbmVlZCB0byB0cmFuc2ZlciBvbmUgcGFja2V0CiAJICovCi0JcGFja2V0c190b190cmFuc2ZlciA9IChieXRlc190b190cmFuc2ZlciArIHBpcGUtPm1heF9wYWNrZXQgLSAxKSAvIHBpcGUtPm1heF9wYWNrZXQ7CisJcGFja2V0c190b190cmFuc2ZlciA9IChieXRlc190b190cmFuc2ZlciArIHBpcGUtPm1heF9wYWNrZXQgLSAxKSAvCisJCXBpcGUtPm1heF9wYWNrZXQ7CiAJaWYgKHBhY2tldHNfdG9fdHJhbnNmZXIgPT0gMCkKIAkJcGFja2V0c190b190cmFuc2ZlciA9IDE7Ci0JZWxzZSBpZiAoKHBhY2tldHNfdG9fdHJhbnNmZXIgPiAxKSAmJiAodXNiLT5pbml0X2ZsYWdzICYgQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUEpKSB7CisJZWxzZSBpZiAoKHBhY2tldHNfdG9fdHJhbnNmZXIgPiAxKSAmJgorCQkJKHVzYi0+aW5pdF9mbGFncyAmIENWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfTk9fRE1BKSkgewogCQkvKgogCQkgKiBMaW1pdCB0byBvbmUgcGFja2V0IHdoZW4gbm90IHVzaW5nIERNQS4gQ2hhbm5lbHMgbXVzdCBiZQogCQkgKiByZXN0YXJ0ZWQgYmV0d2VlbiBldmVyeSBwYWNrZXQgZm9yIElOIHRyYW5zYWN0aW9ucywgc28gdGhlcmUKQEAgLTE0ODEsNyArMTY0Myw4IEBACiAJdXNiY19oY3RzaXoucy54ZmVyc2l6ZSA9IGJ5dGVzX3RvX3RyYW5zZmVyOwogCXVzYmNfaGN0c2l6LnMucGt0Y250ID0gcGFja2V0c190b190cmFuc2ZlcjsKIAotCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwgdXNiLT5pbmRleCksIHVzYmNfaGN0c2l6LnUzMik7CisJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLCB1c2ItPmluZGV4KSwKKwkJCSAgICAgICB1c2JjX2hjdHNpei51MzIpOwogCXJldHVybjsKIH0KIApAQCAtMTUxOSw4ICsxNjgyLDExIEBACiAJCXVuaW9uIGN2bXhfdXNiY3hfaGFpbnRtc2sgdXNiY19oYWludG1zazsKIAogCQkvKiBDbGVhciBhbGwgY2hhbm5lbCBzdGF0dXMgYml0cyAqLwotCQl1c2JjX2hjaW50LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENJTlRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKLQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENJTlRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLCB1c2JjX2hjaW50LnUzMik7CisJCXVzYmNfaGNpbnQudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQlDVk1YX1VTQkNYX0hDSU5UWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CisJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAorCQkJCSAgICAgICBDVk1YX1VTQkNYX0hDSU5UWChjaGFubmVsLCB1c2ItPmluZGV4KSwKKwkJCQkgICAgICAgdXNiY19oY2ludC51MzIpOwogCiAJCXVzYmNfaGNpbnRtc2sudTMyID0gMDsKIAkJdXNiY19oY2ludG1zay5zLmNoaGx0ZG1zayA9IDE7CkBAIC0xNTY3LDE0ICsxNzMzLDE3IEBACiAJCXVuaW9uIGN2bXhfdXNiY3hfaGNzcGx0eCB1c2JjX2hjc3BsdCA9IHsudTMyID0gMH07CiAJCXVuaW9uIGN2bXhfdXNiY3hfaGN0c2l6eCB1c2JjX2hjdHNpeiA9IHsudTMyID0gMH07CiAJCWludCBwYWNrZXRzX3RvX3RyYW5zZmVyOwotCQlpbnQgYnl0ZXNfdG9fdHJhbnNmZXIgPSB0cmFuc2FjdGlvbi0+YnVmZmVyX2xlbmd0aCAtIHRyYW5zYWN0aW9uLT5hY3R1YWxfYnl0ZXM7CisJCWludCBieXRlc190b190cmFuc2ZlciA9IHRyYW5zYWN0aW9uLT5idWZmZXJfbGVuZ3RoIC0KKwkJCXRyYW5zYWN0aW9uLT5hY3R1YWxfYnl0ZXM7CiAKIAkJLyoKIAkJICogSVNPQ0hST05PVVMgdHJhbnNhY3Rpb25zIHN0b3JlIGVhY2ggaW5kaXZpZHVhbCB0cmFuc2ZlciBzaXplCiAJCSAqIGluIHRoZSBwYWNrZXQgc3RydWN0dXJlLCBub3QgdGhlIGdsb2JhbCBidWZmZXJfbGVuZ3RoCiAJCSAqLwogCQlpZiAodHJhbnNhY3Rpb24tPnR5cGUgPT0gQ1ZNWF9VU0JfVFJBTlNGRVJfSVNPQ0hST05PVVMpCi0JCQlieXRlc190b190cmFuc2ZlciA9IHRyYW5zYWN0aW9uLT5pc29fcGFja2V0c1swXS5sZW5ndGggLSB0cmFuc2FjdGlvbi0+YWN0dWFsX2J5dGVzOworCQkJYnl0ZXNfdG9fdHJhbnNmZXIgPQorCQkJCXRyYW5zYWN0aW9uLT5pc29fcGFja2V0c1swXS5sZW5ndGggLQorCQkJCXRyYW5zYWN0aW9uLT5hY3R1YWxfYnl0ZXM7CiAKIAkJLyoKIAkJICogV2UgbmVlZCB0byBkbyBzcGxpdCB0cmFuc2FjdGlvbnMgd2hlbiB3ZSBhcmUgdGFsa2luZyB0byBub24KQEAgLTE1ODksMTYgKzE3NTgsMTkgQEAKIAkJCSAqLwogCQkJaWYgKCh0cmFuc2FjdGlvbi0+c3RhZ2UmMSkgPT0gMCkgewogCQkJCWlmICh0cmFuc2FjdGlvbi0+dHlwZSA9PSBDVk1YX1VTQl9UUkFOU0ZFUl9CVUxLKQotCQkJCQlwaXBlLT5zcGxpdF9zY19mcmFtZSA9ICh1c2ItPmZyYW1lX251bWJlciArIDEpICYgMHg3ZjsKKwkJCQkJcGlwZS0+c3BsaXRfc2NfZnJhbWUgPQorCQkJCQkJKHVzYi0+ZnJhbWVfbnVtYmVyICsgMSkgJiAweDdmOwogCQkJCWVsc2UKLQkJCQkJcGlwZS0+c3BsaXRfc2NfZnJhbWUgPSAodXNiLT5mcmFtZV9udW1iZXIgKyAyKSAmIDB4N2Y7CisJCQkJCXBpcGUtPnNwbGl0X3NjX2ZyYW1lID0KKwkJCQkJCSh1c2ItPmZyYW1lX251bWJlciArIDIpICYgMHg3ZjsKIAkJCX0gZWxzZQogCQkJCXBpcGUtPnNwbGl0X3NjX2ZyYW1lID0gLTE7CiAKIAkJCXVzYmNfaGNzcGx0LnMuc3BsdGVuYSA9IDE7CiAJCQl1c2JjX2hjc3BsdC5zLmh1YmFkZHIgPSBwaXBlLT5odWJfZGV2aWNlX2FkZHI7CiAJCQl1c2JjX2hjc3BsdC5zLnBydGFkZHIgPSBwaXBlLT5odWJfcG9ydDsKLQkJCXVzYmNfaGNzcGx0LnMuY29tcHNwbHQgPSAodHJhbnNhY3Rpb24tPnN0YWdlID09IENWTVhfVVNCX1NUQUdFX05PTl9DT05UUk9MX1NQTElUX0NPTVBMRVRFKTsKKwkJCXVzYmNfaGNzcGx0LnMuY29tcHNwbHQgPSAodHJhbnNhY3Rpb24tPnN0YWdlID09CisJCQkJQ1ZNWF9VU0JfU1RBR0VfTk9OX0NPTlRST0xfU1BMSVRfQ09NUExFVEUpOwogCiAJCQkvKgogCQkJICogU1BMSVQgdHJhbnNhY3Rpb25zIGNhbiBvbmx5IGV2ZXIgdHJhbnNtaXQgb25lIGRhdGEKQEAgLTE2MTQsOCArMTc4NiwxMCBAQAogCQkJICogYmVnaW4vbWlkZGxlL2VuZCBvZiB0aGUgZGF0YSBvciBhbGwKIAkJCSAqLwogCQkJaWYgKCF1c2JjX2hjc3BsdC5zLmNvbXBzcGx0ICYmCi0JCQkJKHBpcGUtPnRyYW5zZmVyX2RpciA9PSBDVk1YX1VTQl9ESVJFQ1RJT05fT1VUKSAmJgotCQkJCShwaXBlLT50cmFuc2Zlcl90eXBlID09IENWTVhfVVNCX1RSQU5TRkVSX0lTT0NIUk9OT1VTKSkgeworCQkJCShwaXBlLT50cmFuc2Zlcl9kaXIgPT0KKwkJCQkgQ1ZNWF9VU0JfRElSRUNUSU9OX09VVCkgJiYKKwkJCQkocGlwZS0+dHJhbnNmZXJfdHlwZSA9PQorCQkJCSBDVk1YX1VTQl9UUkFOU0ZFUl9JU09DSFJPTk9VUykpIHsKIAkJCQkvKgogCQkJCSAqIENsZWFyIHRoZSBzcGxpdCBjb21wbGV0ZSBmcmFtZSBudW1iZXIgYXMKIAkJCQkgKiB0aGVyZSBpc24ndCBnb2luZyB0byBiZSBhIHNwbGl0IGNvbXBsZXRlCkBAIC0xNjY3LDcgKzE4NDEsOCBAQAogCQkJICogUm91bmQgTUFYX1RSQU5TRkVSX0JZVEVTIHRvIGEgbXVsdGlwbGUgb2Ygb3V0IHBhY2tldAogCQkJICogc2l6ZQogCQkJICovCi0JCQlieXRlc190b190cmFuc2ZlciA9IE1BWF9UUkFOU0ZFUl9CWVRFUyAvIHBpcGUtPm1heF9wYWNrZXQ7CisJCQlieXRlc190b190cmFuc2ZlciA9IE1BWF9UUkFOU0ZFUl9CWVRFUyAvCisJCQkJcGlwZS0+bWF4X3BhY2tldDsKIAkJCWJ5dGVzX3RvX3RyYW5zZmVyICo9IHBpcGUtPm1heF9wYWNrZXQ7CiAJCX0KIApAQCAtMTY3NSwxMCArMTg1MCwxNCBAQAogCQkgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBwYWNrZXRzIHRvIHRyYW5zZmVyLiBJZiB0aGUgbGVuZ3RoIGlzCiAJCSAqIHplcm8gd2Ugc3RpbGwgbmVlZCB0byB0cmFuc2ZlciBvbmUgcGFja2V0CiAJCSAqLwotCQlwYWNrZXRzX3RvX3RyYW5zZmVyID0gKGJ5dGVzX3RvX3RyYW5zZmVyICsgcGlwZS0+bWF4X3BhY2tldCAtIDEpIC8gcGlwZS0+bWF4X3BhY2tldDsKKwkJcGFja2V0c190b190cmFuc2ZlciA9CisJCQkoYnl0ZXNfdG9fdHJhbnNmZXIgKyBwaXBlLT5tYXhfcGFja2V0IC0gMSkgLworCQkJcGlwZS0+bWF4X3BhY2tldDsKIAkJaWYgKHBhY2tldHNfdG9fdHJhbnNmZXIgPT0gMCkKIAkJCXBhY2tldHNfdG9fdHJhbnNmZXIgPSAxOwotCQllbHNlIGlmICgocGFja2V0c190b190cmFuc2ZlciA+IDEpICYmICh1c2ItPmluaXRfZmxhZ3MgJiBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX05PX0RNQSkpIHsKKwkJZWxzZSBpZiAoKHBhY2tldHNfdG9fdHJhbnNmZXIgPiAxKSAmJgorCQkJCSh1c2ItPmluaXRfZmxhZ3MgJgorCQkJCSBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX05PX0RNQSkpIHsKIAkJCS8qCiAJCQkgKiBMaW1pdCB0byBvbmUgcGFja2V0IHdoZW4gbm90IHVzaW5nIERNQS4gQ2hhbm5lbHMgbXVzdAogCQkJICogYmUgcmVzdGFydGVkIGJldHdlZW4gZXZlcnkgcGFja2V0IGZvciBJTgpAQCAtMTY4NiwxNCArMTg2NSwxNiBAQAogCQkJICogcGFja2V0cyBpbiBhIHJvdwogCQkJICovCiAJCQlwYWNrZXRzX3RvX3RyYW5zZmVyID0gMTsKLQkJCWJ5dGVzX3RvX3RyYW5zZmVyID0gcGFja2V0c190b190cmFuc2ZlciAqIHBpcGUtPm1heF9wYWNrZXQ7CisJCQlieXRlc190b190cmFuc2ZlciA9IHBhY2tldHNfdG9fdHJhbnNmZXIgKgorCQkJCXBpcGUtPm1heF9wYWNrZXQ7CiAJCX0gZWxzZSBpZiAocGFja2V0c190b190cmFuc2ZlciA+IE1BWF9UUkFOU0ZFUl9QQUNLRVRTKSB7CiAJCQkvKgogCQkJICogTGltaXQgdGhlIG51bWJlciBvZiBwYWNrZXQgYW5kIGRhdGEgdHJhbnNmZXJyZWQgdG8KIAkJCSAqIHdoYXQgdGhlIGhhcmR3YXJlIGNhbiBoYW5kbGUKIAkJCSAqLwogCQkJcGFja2V0c190b190cmFuc2ZlciA9IE1BWF9UUkFOU0ZFUl9QQUNLRVRTOwotCQkJYnl0ZXNfdG9fdHJhbnNmZXIgPSBwYWNrZXRzX3RvX3RyYW5zZmVyICogcGlwZS0+bWF4X3BhY2tldDsKKwkJCWJ5dGVzX3RvX3RyYW5zZmVyID0gcGFja2V0c190b190cmFuc2ZlciAqCisJCQkJcGlwZS0+bWF4X3BhY2tldDsKIAkJfQogCiAJCXVzYmNfaGN0c2l6LnMueGZlcnNpemUgPSBieXRlc190b190cmFuc2ZlcjsKQEAgLTE3MDcsOCArMTg4OCwxMSBAQAogCQlpZiAocGlwZS0+ZmxhZ3MgJiBfX0NWTVhfVVNCX1BJUEVfRkxBR1NfTkVFRF9QSU5HKQogCQkJdXNiY19oY3RzaXoucy5kb3BuZyA9IDE7CiAKLQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENTUExUWChjaGFubmVsLCB1c2ItPmluZGV4KSwgdXNiY19oY3NwbHQudTMyKTsKLQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLCB1c2ItPmluZGV4KSwgdXNiY19oY3RzaXoudTMyKTsKKwkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCisJCQkJICAgICAgIENWTVhfVVNCQ1hfSENTUExUWChjaGFubmVsLCB1c2ItPmluZGV4KSwKKwkJCQkgICAgICAgdXNiY19oY3NwbHQudTMyKTsKKwkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLAorCQkJCQl1c2ItPmluZGV4KSwgdXNiY19oY3RzaXoudTMyKTsKIAl9CiAKIAkvKiBTZXR1cCB0aGUgSG9zdCBDaGFubmVsIENoYXJhY3RlcmlzdGljcyBSZWdpc3RlciAqLwpAQCAtMTczOSwxMSArMTkyMywxNCBAQAogCQkvKiBTZXQgdGhlIHJlc3Qgb2YgdGhlIGVuZHBvaW50IHNwZWNpZmljIHNldHRpbmdzICovCiAJCXVzYmNfaGNjaGFyLnMuZGV2YWRkciA9IHBpcGUtPmRldmljZV9hZGRyOwogCQl1c2JjX2hjY2hhci5zLmVwdHlwZSA9IHRyYW5zYWN0aW9uLT50eXBlOwotCQl1c2JjX2hjY2hhci5zLmxzcGRkZXYgPSAocGlwZS0+ZGV2aWNlX3NwZWVkID09IENWTVhfVVNCX1NQRUVEX0xPVyk7CisJCXVzYmNfaGNjaGFyLnMubHNwZGRldiA9CisJCQkocGlwZS0+ZGV2aWNlX3NwZWVkID09IENWTVhfVVNCX1NQRUVEX0xPVyk7CiAJCXVzYmNfaGNjaGFyLnMuZXBkaXIgPSBwaXBlLT50cmFuc2Zlcl9kaXI7CiAJCXVzYmNfaGNjaGFyLnMuZXBudW0gPSBwaXBlLT5lbmRwb2ludF9udW07CiAJCXVzYmNfaGNjaGFyLnMubXBzID0gcGlwZS0+bWF4X3BhY2tldDsKLQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSwgdXNiY19oY2NoYXIudTMyKTsKKwkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCisJCQkJICAgICAgIENWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSwKKwkJCQkgICAgICAgdXNiY19oY2NoYXIudTMyKTsKIAl9CiAKIAkvKiBEbyB0cmFuc2FjdGlvbiB0eXBlIHNwZWNpZmljIGZpeHVwcyBhcyBuZWVkZWQgKi8KQEAgLTE3NjIsMjIgKzE5NDksMzMgQEAKIAkJCSAqLwogCQkJaWYgKHBpcGUtPnRyYW5zZmVyX2RpciA9PSBDVk1YX1VTQl9ESVJFQ1RJT05fT1VUKSB7CiAJCQkJaWYgKHBpcGUtPm11bHRpX2NvdW50IDwgMikgLyogTmVlZCBEQVRBMCAqLwotCQkJCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2hjdHNpengsIHBpZCwgMCk7CisJCQkJCVVTQl9TRVRfRklFTEQzMigKKwkJCQkJCUNWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLAorCQkJCQkJCQkgICB1c2ItPmluZGV4KSwKKwkJCQkJCXVuaW9uIGN2bXhfdXNiY3hfaGN0c2l6eCwKKwkJCQkJCXBpZCwgMCk7CiAJCQkJZWxzZSAvKiBOZWVkIE1EQVRBICovCi0JCQkJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwgdXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfaGN0c2l6eCwgcGlkLCAzKTsKKwkJCQkJVVNCX1NFVF9GSUVMRDMyKAorCQkJCQkJQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsCisJCQkJCQkJCSAgIHVzYi0+aW5kZXgpLAorCQkJCQkJdW5pb24gY3ZteF91c2JjeF9oY3RzaXp4LAorCQkJCQkJcGlkLCAzKTsKIAkJCX0KIAkJfQogCQlicmVhazsKIAl9CiAJewotCQl1bmlvbiBjdm14X3VzYmN4X2hjdHNpenggdXNiY19oY3RzaXogPSB7LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLCB1c2ItPmluZGV4KSl9OworCQl1bmlvbiBjdm14X3VzYmN4X2hjdHNpenggdXNiY19oY3RzaXogPSB7LnUzMiA9CisJCQlfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCUNWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLCB1c2ItPmluZGV4KSl9OwogCQl0cmFuc2FjdGlvbi0+eGZlcnNpemUgPSB1c2JjX2hjdHNpei5zLnhmZXJzaXplOwogCQl0cmFuc2FjdGlvbi0+cGt0Y250ID0gdXNiY19oY3RzaXoucy5wa3RjbnQ7CiAJfQogCS8qIFJlbWViZXIgd2hlbiB3ZSBzdGFydCBhIHNwbGl0IHRyYW5zYWN0aW9uICovCiAJaWYgKF9fY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKQogCQl1c2ItPmFjdGl2ZV9zcGxpdCA9IHRyYW5zYWN0aW9uOwotCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfaGNjaGFyeCwgY2hlbmEsIDEpOworCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCksCisJCQl1bmlvbiBjdm14X3VzYmN4X2hjY2hhcngsIGNoZW5hLCAxKTsKIAlpZiAodXNiLT5pbml0X2ZsYWdzICYgQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUEpCiAJCV9fY3ZteF91c2JfZmlsbF90eF9maWZvKHVzYiwgY2hhbm5lbCk7CiAJcmV0dXJuOwpAQCAtMTc5MywxNiArMTk5MSwyMiBAQAogICoKICAqIFJldHVybnM6IFBpcGUgb3IgTlVMTCBpZiBub25lIGFyZSByZWFkeQogICovCi1zdGF0aWMgc3RydWN0IGN2bXhfdXNiX3BpcGUgKl9fY3ZteF91c2JfZmluZF9yZWFkeV9waXBlKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCB1aW50NjRfdCBjdXJyZW50X2ZyYW1lKQorc3RhdGljIHN0cnVjdCBjdm14X3VzYl9waXBlICpfX2N2bXhfdXNiX2ZpbmRfcmVhZHlfcGlwZSgKKwkJc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCisJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJCXVpbnQ2NF90IGN1cnJlbnRfZnJhbWUpCiB7CiAJc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGU7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBpcGUsIGxpc3QsIG5vZGUpIHsKIAkJc3RydWN0IGN2bXhfdXNiX3RyYW5zYWN0aW9uICp0ID0KLQkJCWxpc3RfZmlyc3RfZW50cnkoJnBpcGUtPnRyYW5zYWN0aW9ucywgdHlwZW9mKCp0KSwgbm9kZSk7CisJCQlsaXN0X2ZpcnN0X2VudHJ5KCZwaXBlLT50cmFuc2FjdGlvbnMsIHR5cGVvZigqdCksCisJCQkJCSBub2RlKTsKIAkJaWYgKCEocGlwZS0+ZmxhZ3MgJiBfX0NWTVhfVVNCX1BJUEVfRkxBR1NfU0NIRURVTEVEKSAmJiB0ICYmCiAJCQkocGlwZS0+bmV4dF90eF9mcmFtZSA8PSBjdXJyZW50X2ZyYW1lKSAmJgotCQkJKChwaXBlLT5zcGxpdF9zY19mcmFtZSA9PSAtMSkgfHwgKCgoKGludCljdXJyZW50X2ZyYW1lIC0gKGludClwaXBlLT5zcGxpdF9zY19mcmFtZSkgJiAweDdmKSA8IDB4NDApKSAmJgorCQkJKChwaXBlLT5zcGxpdF9zY19mcmFtZSA9PSAtMSkgfHwKKwkJCSAoKCgoaW50KWN1cnJlbnRfZnJhbWUgLSAoaW50KXBpcGUtPnNwbGl0X3NjX2ZyYW1lKQorCQkJICAgJiAweDdmKSA8IDB4NDApKSAmJgogCQkJKCF1c2ItPmFjdGl2ZV9zcGxpdCB8fCAodXNiLT5hY3RpdmVfc3BsaXQgPT0gdCkpKSB7CiAJCQlDVk1YX1BSRUZFVENIKHBpcGUsIDEyOCk7CiAJCQlDVk1YX1BSRUZFVENIKHQsIDApOwpAQCAtMTg1MiwxNCArMjA1NiwyNiBAQAogCQkJICogd2F5IHdlIGFyZSBzdXJlIHRoYXQgdGhlIHBlcmlvZGljIGRhdGEgaXMgc2VudCBpbiB0aGUKIAkJCSAqIGJlZ2lubmluZyBvZiB0aGUgZnJhbWUKIAkJCSAqLwotCQkJcGlwZSA9IF9fY3ZteF91c2JfZmluZF9yZWFkeV9waXBlKHVzYiwgdXNiLT5hY3RpdmVfcGlwZXMgKyBDVk1YX1VTQl9UUkFOU0ZFUl9JU09DSFJPTk9VUywgdXNiLT5mcmFtZV9udW1iZXIpOworCQkJcGlwZSA9IF9fY3ZteF91c2JfZmluZF9yZWFkeV9waXBlKHVzYiwKKwkJCQkJdXNiLT5hY3RpdmVfcGlwZXMgKworCQkJCQlDVk1YX1VTQl9UUkFOU0ZFUl9JU09DSFJPTk9VUywKKwkJCQkJdXNiLT5mcmFtZV9udW1iZXIpOwogCQkJaWYgKGxpa2VseSghcGlwZSkpCi0JCQkJcGlwZSA9IF9fY3ZteF91c2JfZmluZF9yZWFkeV9waXBlKHVzYiwgdXNiLT5hY3RpdmVfcGlwZXMgKyBDVk1YX1VTQl9UUkFOU0ZFUl9JTlRFUlJVUFQsIHVzYi0+ZnJhbWVfbnVtYmVyKTsKKwkJCQlwaXBlID0gX19jdm14X3VzYl9maW5kX3JlYWR5X3BpcGUodXNiLAorCQkJCQkJdXNiLT5hY3RpdmVfcGlwZXMgKworCQkJCQkJQ1ZNWF9VU0JfVFJBTlNGRVJfSU5URVJSVVBULAorCQkJCQkJdXNiLT5mcmFtZV9udW1iZXIpOwogCQl9CiAJCWlmIChsaWtlbHkoIXBpcGUpKSB7Ci0JCQlwaXBlID0gX19jdm14X3VzYl9maW5kX3JlYWR5X3BpcGUodXNiLCB1c2ItPmFjdGl2ZV9waXBlcyArIENWTVhfVVNCX1RSQU5TRkVSX0NPTlRST0wsIHVzYi0+ZnJhbWVfbnVtYmVyKTsKKwkJCXBpcGUgPSBfX2N2bXhfdXNiX2ZpbmRfcmVhZHlfcGlwZSh1c2IsCisJCQkJCXVzYi0+YWN0aXZlX3BpcGVzICsKKwkJCQkJQ1ZNWF9VU0JfVFJBTlNGRVJfQ09OVFJPTCwKKwkJCQkJdXNiLT5mcmFtZV9udW1iZXIpOwogCQkJaWYgKGxpa2VseSghcGlwZSkpCi0JCQkJcGlwZSA9IF9fY3ZteF91c2JfZmluZF9yZWFkeV9waXBlKHVzYiwgdXNiLT5hY3RpdmVfcGlwZXMgKyBDVk1YX1VTQl9UUkFOU0ZFUl9CVUxLLCB1c2ItPmZyYW1lX251bWJlcik7CisJCQkJcGlwZSA9IF9fY3ZteF91c2JfZmluZF9yZWFkeV9waXBlKHVzYiwKKwkJCQkJCXVzYi0+YWN0aXZlX3BpcGVzICsKKwkJCQkJCUNWTVhfVVNCX1RSQU5TRkVSX0JVTEssCisJCQkJCQl1c2ItPmZyYW1lX251bWJlcik7CiAJCX0KIAkJaWYgKCFwaXBlKQogCQkJYnJlYWs7CkBAIC0xODczLDcgKzIwODksOCBAQAogCSAqIGZ1dHVyZSB0aGF0IG1pZ2h0IG5lZWQgdG8gYmUgc2NoZWR1bGVkCiAJICovCiAJbmVlZF9zb2YgPSAwOwotCWZvciAodHR5cGUgPSBDVk1YX1VTQl9UUkFOU0ZFUl9DT05UUk9MOyB0dHlwZSA8PSBDVk1YX1VTQl9UUkFOU0ZFUl9JTlRFUlJVUFQ7IHR0eXBlKyspIHsKKwlmb3IgKHR0eXBlID0gQ1ZNWF9VU0JfVFJBTlNGRVJfQ09OVFJPTDsKKwkJCXR0eXBlIDw9IENWTVhfVVNCX1RSQU5TRkVSX0lOVEVSUlVQVDsgdHR5cGUrKykgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBpcGUsICZ1c2ItPmFjdGl2ZV9waXBlc1t0dHlwZV0sIG5vZGUpIHsKIAkJCWlmIChwaXBlLT5uZXh0X3R4X2ZyYW1lID4gdXNiLT5mcmFtZV9udW1iZXIpIHsKIAkJCQluZWVkX3NvZiA9IDE7CkBAIC0xODgxLDcgKzIwOTgsOCBAQAogCQkJfQogCQl9CiAJfQotCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zaywgc29mbXNrLCBuZWVkX3NvZik7CisJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwKKwkJCXVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zaywgc29mbXNrLCBuZWVkX3NvZik7CiAJcmV0dXJuOwogfQogCkBAIC0xOTMyLDEwICsyMTUwLDEzIEBACiAJCS8qIFJlY2FsY3VsYXRlIHRoZSB0cmFuc2ZlciBzaXplIGJ5IGFkZGluZyB1cCBlYWNoIHBhY2tldCAqLwogCQl1cmItPmFjdHVhbF9sZW5ndGggPSAwOwogCQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7Ci0JCQlpZiAoaXNvX3BhY2tldFtpXS5zdGF0dXMgPT0gQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUykgeworCQkJaWYgKGlzb19wYWNrZXRbaV0uc3RhdHVzID09CisJCQkJCUNWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpIHsKIAkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyA9IDA7Ci0JCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoID0gaXNvX3BhY2tldFtpXS5sZW5ndGg7Ci0JCQkJdXJiLT5hY3R1YWxfbGVuZ3RoICs9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKKwkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGggPQorCQkJCQlpc29fcGFja2V0W2ldLmxlbmd0aDsKKwkJCQl1cmItPmFjdHVhbF9sZW5ndGggKz0KKwkJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoOwogCQkJfSBlbHNlIHsKIAkJCQlkZXZfZGJnKGRldiwgIklTT0NIUk9OT1VTIHBhY2tldD0lZCBvZiAlZCBzdGF0dXM9JWQgcGlwZT0lcCB0cmFuc2FjdGlvbj0lcCBzaXplPSVkXG4iLAogCQkJCQlpLCB1cmItPm51bWJlcl9vZl9wYWNrZXRzLApAQCAtMTk5NywxMCArMjIxOCwxMSBAQAogICogQGNvbXBsZXRlX2NvZGU6CiAgKgkJIENvbXBsZXRpb24gY29kZQogICovCi1zdGF0aWMgdm9pZCBfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUoc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCi0JCQkJCXN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlLAotCQkJCQlzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAotCQkJCQllbnVtIGN2bXhfdXNiX2NvbXBsZXRlIGNvbXBsZXRlX2NvZGUpCitzdGF0aWMgdm9pZCBfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUoCisJCQkJc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCisJCQkJc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUsCisJCQkJc3RydWN0IGN2bXhfdXNiX3RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKwkJCQllbnVtIGN2bXhfdXNiX2NvbXBsZXRlIGNvbXBsZXRlX2NvZGUpCiB7CiAJLyogSWYgdGhpcyB3YXMgYSBzcGxpdCB0aGVuIGNsZWFyIG91ciBzcGxpdCBpbiBwcm9ncmVzcyBtYXJrZXIgKi8KIAlpZiAodXNiLT5hY3RpdmVfc3BsaXQgPT0gdHJhbnNhY3Rpb24pCkBAIC0yMDE5LDcgKzIyNDEsOCBAQAogCQkgKiBJZiB0aGVyZSBhcmUgbW9yZSBJU09zIHBlbmRpbmcgYW5kIHdlIHN1Y2NlZWRlZCwgc2NoZWR1bGUgdGhlCiAJCSAqIG5leHQgb25lCiAJCSAqLwotCQlpZiAoKHRyYW5zYWN0aW9uLT5pc29fbnVtYmVyX3BhY2tldHMgPiAxKSAmJiAoY29tcGxldGVfY29kZSA9PSBDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKSkgeworCQlpZiAoKHRyYW5zYWN0aW9uLT5pc29fbnVtYmVyX3BhY2tldHMgPiAxKSAmJgorCQkJKGNvbXBsZXRlX2NvZGUgPT0gQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUykpIHsKIAkJCS8qIE5vIGJ5dGVzIHRyYW5zZmVycmVkIGZvciB0aGlzIHBhY2tldCBhcyBvZiB5ZXQgKi8KIAkJCXRyYW5zYWN0aW9uLT5hY3R1YWxfYnl0ZXMgPSAwOwogCQkJLyogT25lIGxlc3MgSVNPIHdhaXRpbmcgdG8gdHJhbnNmZXIgKi8KQEAgLTIwNjcsMTYgKzIyOTAsMTcgQEAKICAqCiAgKiBSZXR1cm5zOiBUcmFuc2FjdGlvbiBvciBOVUxMIG9uIGZhaWx1cmUuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKl9fY3ZteF91c2Jfc3VibWl0X3RyYW5zYWN0aW9uKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAotCQkJCQkJCQkgIHN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlLAotCQkJCQkJCQkgIGVudW0gY3ZteF91c2JfdHJhbnNmZXIgdHlwZSwKLQkJCQkJCQkJICB1aW50NjRfdCBidWZmZXIsCi0JCQkJCQkJCSAgaW50IGJ1ZmZlcl9sZW5ndGgsCi0JCQkJCQkJCSAgdWludDY0X3QgY29udHJvbF9oZWFkZXIsCi0JCQkJCQkJCSAgaW50IGlzb19zdGFydF9mcmFtZSwKLQkJCQkJCQkJICBpbnQgaXNvX251bWJlcl9wYWNrZXRzLAotCQkJCQkJCQkgIHN0cnVjdCBjdm14X3VzYl9pc29fcGFja2V0ICppc29fcGFja2V0cywKLQkJCQkJCQkJICBzdHJ1Y3QgdXJiICp1cmIpCitzdGF0aWMgc3RydWN0IGN2bXhfdXNiX3RyYW5zYWN0aW9uICpfX2N2bXhfdXNiX3N1Ym1pdF90cmFuc2FjdGlvbigKKwkJCQlzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKKwkJCQlzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSwKKwkJCQllbnVtIGN2bXhfdXNiX3RyYW5zZmVyIHR5cGUsCisJCQkJdWludDY0X3QgYnVmZmVyLAorCQkJCWludCBidWZmZXJfbGVuZ3RoLAorCQkJCXVpbnQ2NF90IGNvbnRyb2xfaGVhZGVyLAorCQkJCWludCBpc29fc3RhcnRfZnJhbWUsCisJCQkJaW50IGlzb19udW1iZXJfcGFja2V0cywKKwkJCQlzdHJ1Y3QgY3ZteF91c2JfaXNvX3BhY2tldCAqaXNvX3BhY2tldHMsCisJCQkJc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCBjdm14X3VzYl90cmFuc2FjdGlvbiAqdHJhbnNhY3Rpb247CiAKQEAgLTIxMjgsOSArMjM1MiwxMCBAQAogICoKICAqIFJldHVybnM6IEEgc3VibWl0dGVkIHRyYW5zYWN0aW9uIG9yIE5VTEwgb24gZmFpbHVyZS4KICAqLwotc3RhdGljIHN0cnVjdCBjdm14X3VzYl90cmFuc2FjdGlvbiAqY3ZteF91c2Jfc3VibWl0X2J1bGsoc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCi0JCQkJCQkJIHN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlLAotCQkJCQkJCSBzdHJ1Y3QgdXJiICp1cmIpCitzdGF0aWMgc3RydWN0IGN2bXhfdXNiX3RyYW5zYWN0aW9uICpjdm14X3VzYl9zdWJtaXRfYnVsaygKKwkJCQkJCXN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAorCQkJCQkJc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUsCisJCQkJCQlzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJcmV0dXJuIF9fY3ZteF91c2Jfc3VibWl0X3RyYW5zYWN0aW9uKHVzYiwgcGlwZSwgQ1ZNWF9VU0JfVFJBTlNGRVJfQlVMSywKIAkJCQkJICAgICB1cmItPnRyYW5zZmVyX2RtYSwKQEAgLTIxNTIsOSArMjM3NywxMCBAQAogICoKICAqIFJldHVybnM6IEEgc3VibWl0dGVkIHRyYW5zYWN0aW9uIG9yIE5VTEwgb24gZmFpbHVyZS4KICAqLwotc3RhdGljIHN0cnVjdCBjdm14X3VzYl90cmFuc2FjdGlvbiAqY3ZteF91c2Jfc3VibWl0X2ludGVycnVwdChzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKLQkJCQkJCQkgICAgICBzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSwKLQkJCQkJCQkgICAgICBzdHJ1Y3QgdXJiICp1cmIpCitzdGF0aWMgc3RydWN0IGN2bXhfdXNiX3RyYW5zYWN0aW9uICpjdm14X3VzYl9zdWJtaXRfaW50ZXJydXB0KAorCQkJCQkJc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCisJCQkJCQlzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSwKKwkJCQkJCXN0cnVjdCB1cmIgKnVyYikKIHsKIAlyZXR1cm4gX19jdm14X3VzYl9zdWJtaXRfdHJhbnNhY3Rpb24odXNiLCBwaXBlLAogCQkJCQkgICAgIENWTVhfVVNCX1RSQU5TRkVSX0lOVEVSUlVQVCwKQEAgLTIxNzcsOSArMjQwMywxMCBAQAogICoKICAqIFJldHVybnM6IEEgc3VibWl0dGVkIHRyYW5zYWN0aW9uIG9yIE5VTEwgb24gZmFpbHVyZS4KICAqLwotc3RhdGljIHN0cnVjdCBjdm14X3VzYl90cmFuc2FjdGlvbiAqY3ZteF91c2Jfc3VibWl0X2NvbnRyb2woc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCi0JCQkJCQkJICAgIHN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlLAotCQkJCQkJCSAgICBzdHJ1Y3QgdXJiICp1cmIpCitzdGF0aWMgc3RydWN0IGN2bXhfdXNiX3RyYW5zYWN0aW9uICpjdm14X3VzYl9zdWJtaXRfY29udHJvbCgKKwkJCQkJCXN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAorCQkJCQkJc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUsCisJCQkJCQlzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJaW50IGJ1ZmZlcl9sZW5ndGggPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGg7CiAJdWludDY0X3QgY29udHJvbF9oZWFkZXIgPSB1cmItPnNldHVwX2RtYTsKQEAgLTIyMDksOSArMjQzNiwxMCBAQAogICoKICAqIFJldHVybnM6IEEgc3VibWl0dGVkIHRyYW5zYWN0aW9uIG9yIE5VTEwgb24gZmFpbHVyZS4KICAqLwotc3RhdGljIHN0cnVjdCBjdm14X3VzYl90cmFuc2FjdGlvbiAqY3ZteF91c2Jfc3VibWl0X2lzb2Nocm9ub3VzKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAotCQkJCQkJCQlzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSwKLQkJCQkJCQkJc3RydWN0IHVyYiAqdXJiKQorc3RhdGljIHN0cnVjdCBjdm14X3VzYl90cmFuc2FjdGlvbiAqY3ZteF91c2Jfc3VibWl0X2lzb2Nocm9ub3VzKAorCQkJCQkJc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCisJCQkJCQlzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSwKKwkJCQkJCXN0cnVjdCB1cmIgKnVyYikKIHsKIAlzdHJ1Y3QgY3ZteF91c2JfaXNvX3BhY2tldCAqcGFja2V0czsKIApAQCAtMjI1NywxNyArMjQ4NSwyMiBAQAogCiAJCUNWTVhfU1lOQ1c7CiAKLQkJdXNiY19oY2NoYXIudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ0NIQVJYKHBpcGUtPmNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKKwkJdXNiY19oY2NoYXIudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQlDVk1YX1VTQkNYX0hDQ0hBUlgocGlwZS0+Y2hhbm5lbCwgdXNiLT5pbmRleCkpOwogCQkvKgogCQkgKiBJZiB0aGUgY2hhbm5lbCBpc24ndCBlbmFibGVkIHRoZW4gdGhlIHRyYW5zYWN0aW9uIGFscmVhZHkKIAkJICogY29tcGxldGVkLgogCQkgKi8KIAkJaWYgKHVzYmNfaGNjaGFyLnMuY2hlbmEpIHsKIAkJCXVzYmNfaGNjaGFyLnMuY2hkaXMgPSAxOwotCQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENDSEFSWChwaXBlLT5jaGFubmVsLCB1c2ItPmluZGV4KSwgdXNiY19oY2NoYXIudTMyKTsKKwkJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAorCQkJCQlDVk1YX1VTQkNYX0hDQ0hBUlgocGlwZS0+Y2hhbm5lbCwKKwkJCQkJCXVzYi0+aW5kZXgpLAorCQkJCQl1c2JjX2hjY2hhci51MzIpOwogCQl9CiAJfQotCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLCBDVk1YX1VTQl9DT01QTEVURV9DQU5DRUwpOworCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLAorCQkJCSAgICBDVk1YX1VTQl9DT01QTEVURV9DQU5DRUwpOwogCXJldHVybiAwOwogfQogCkBAIC0yMzMxLDcgKzI1NjQsOCBAQAogCWludCBmcmFtZV9udW1iZXI7CiAJdW5pb24gY3ZteF91c2JjeF9oZm51bSB1c2JjX2hmbnVtOwogCi0JdXNiY19oZm51bS51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hGTlVNKHVzYi0+aW5kZXgpKTsKKwl1c2JjX2hmbnVtLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQlDVk1YX1VTQkNYX0hGTlVNKHVzYi0+aW5kZXgpKTsKIAlmcmFtZV9udW1iZXIgPSB1c2JjX2hmbnVtLnMuZnJudW07CiAKIAlyZXR1cm4gZnJhbWVfbnVtYmVyOwpAQCAtMjM1OSwxMCArMjU5MywxMiBAQAogCWludCBidWZmZXJfc3BhY2VfbGVmdDsKIAogCS8qIFJlYWQgdGhlIGludGVycnVwdCBzdGF0dXMgYml0cyBmb3IgdGhlIGNoYW5uZWwgKi8KLQl1c2JjX2hjaW50LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENJTlRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKKwl1c2JjX2hjaW50LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQlDVk1YX1VTQkNYX0hDSU5UWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CiAKIAlpZiAodXNiLT5pbml0X2ZsYWdzICYgQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUEpIHsKLQkJdXNiY19oY2NoYXIudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKKwkJdXNiY19oY2NoYXIudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQlDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOwogCiAJCWlmICh1c2JjX2hjY2hhci5zLmNoZW5hICYmIHVzYmNfaGNjaGFyLnMuY2hkaXMpIHsKIAkJCS8qCkBAIC0yMzcwLDcgKzI2MDYsMTAgQEAKIAkJCSAqIGludGVycnVwdCBJTiB0cmFuc2ZlcnMgdG8gZ2V0IHN0dWNrIHVudGlsIHdlIGRvIGEKIAkJCSAqIHdyaXRlIG9mIEhDQ0hBUlggd2l0aG91dCBjaGFuZ2luZyB0aGluZ3MKIAkJCSAqLwotCQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSwgdXNiY19oY2NoYXIudTMyKTsKKwkJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAorCQkJCQlDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwKKwkJCQkJCQkgICB1c2ItPmluZGV4KSwKKwkJCQkJdXNiY19oY2NoYXIudTMyKTsKIAkJCXJldHVybiAwOwogCQl9CiAKQEAgLTIzODQsOSArMjYyMywxNSBAQAogCQkJCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgZXhjZXB0IENISExURCAqLwogCQkJCWhjaW50bXNrLnUzMiA9IDA7CiAJCQkJaGNpbnRtc2sucy5jaGhsdGRtc2sgPSAxOwotCQkJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDSU5UTVNLWChjaGFubmVsLCB1c2ItPmluZGV4KSwgaGNpbnRtc2sudTMyKTsKKwkJCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKKwkJCQkJCUNWTVhfVVNCQ1hfSENJTlRNU0tYKGNoYW5uZWwsCisJCQkJCQkJdXNiLT5pbmRleCksCisJCQkJCQloY2ludG1zay51MzIpOwogCQkJCXVzYmNfaGNjaGFyLnMuY2hkaXMgPSAxOwotCQkJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCksIHVzYmNfaGNjaGFyLnUzMik7CisJCQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCisJCQkJCQlDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwKKwkJCQkJCQl1c2ItPmluZGV4KSwKKwkJCQkJCXVzYmNfaGNjaGFyLnUzMik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9IGVsc2UgaWYgKHVzYmNfaGNpbnQucy54ZmVyY29tcGwpIHsKIAkJCQkvKgpAQCAtMjM5NCw3ICsyNjM5LDggQEAKIAkJCQkgKiBDaGFubmVsIGhhbHQgaXNuJ3QgbmVlZGVkLgogCQkJCSAqLwogCQkJfSBlbHNlIHsKLQkJCQljdm14X2RwcmludGYoIlVTQiVkOiBDaGFubmVsICVkIGludGVycnVwdCB3aXRob3V0IGhhbHRcbiIsIHVzYi0+aW5kZXgsIGNoYW5uZWwpOworCQkJCWN2bXhfZHByaW50ZigiVVNCJWQ6IENoYW5uZWwgJWQgaW50ZXJydXB0IHdpdGhvdXQgaGFsdFxuIiwKKwkJCQkJCXVzYi0+aW5kZXgsIGNoYW5uZWwpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQl9CkBAIC0yNDE3LDcgKzI2NjMsOCBAQAogCUNWTVhfUFJFRkVUQ0gocGlwZSwgMTI4KTsKIAlpZiAoIXBpcGUpCiAJCXJldHVybiAwOwotCXRyYW5zYWN0aW9uID0gbGlzdF9maXJzdF9lbnRyeSgmcGlwZS0+dHJhbnNhY3Rpb25zLCB0eXBlb2YoKnRyYW5zYWN0aW9uKSwKKwl0cmFuc2FjdGlvbiA9IGxpc3RfZmlyc3RfZW50cnkoJnBpcGUtPnRyYW5zYWN0aW9ucywKKwkJCQkgICAgICAgdHlwZW9mKCp0cmFuc2FjdGlvbiksCiAJCQkJICAgICAgIG5vZGUpOwogCUNWTVhfUFJFRkVUQ0godHJhbnNhY3Rpb24sIDApOwogCkBAIC0yNDMyLDggKzI2NzksMTAgQEAKIAkgKiBSZWFkIHRoZSBjaGFubmVsIGNvbmZpZyBpbmZvIHNvIHdlIGNhbiBmaWd1cmUgb3V0IGhvdyBtdWNoIGRhdGEKIAkgKiB0cmFuc2ZlcmVkCiAJICovCi0JdXNiY19oY2NoYXIudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKLQl1c2JjX2hjdHNpei51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOworCXVzYmNfaGNjaGFyLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQlDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOworCXVzYmNfaGN0c2l6LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQlDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOwogCiAJLyoKIAkgKiBDYWxjdWxhdGluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHN1Y2Nlc3NmdWxseSB0cmFuc2ZlcnJlZCBpcyBkZXBlbmRlbnQKQEAgLTI0NDcsNyArMjY5Niw4IEBACiAJCSAqIHRoZSBjdXJyZW50IHZhbHVlIG9mIHhmZXJzaXplIGZyb20gaXRzIHN0YXJ0aW5nIHZhbHVlIGFuZCB3ZQogCQkgKiBrbm93IGhvdyBtYW55IGJ5dGVzIHdlcmUgd3JpdHRlbiB0byB0aGUgYnVmZmVyCiAJCSAqLwotCQlieXRlc190aGlzX3RyYW5zZmVyID0gdHJhbnNhY3Rpb24tPnhmZXJzaXplIC0gdXNiY19oY3RzaXoucy54ZmVyc2l6ZTsKKwkJYnl0ZXNfdGhpc190cmFuc2ZlciA9IHRyYW5zYWN0aW9uLT54ZmVyc2l6ZSAtCisJCQl1c2JjX2hjdHNpei5zLnhmZXJzaXplOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIE9VVCB0cmFuc2FjdGlvbiBkb24ndCBkZWNyZW1lbnQgeGZlcnNpemUuIEluc3RlYWQgcGt0Y250IGlzCkBAIC0yNDY1LDcgKzI3MTUsOCBAQAogCX0KIAkvKiBGaWd1cmUgb3V0IGhvdyBtYW55IGJ5dGVzIHdlcmUgaW4gdGhlIGxhc3QgcGFja2V0IG9mIHRoZSB0cmFuc2ZlciAqLwogCWlmIChwYWNrZXRzX3Byb2Nlc3NlZCkKLQkJYnl0ZXNfaW5fbGFzdF9wYWNrZXQgPSBieXRlc190aGlzX3RyYW5zZmVyIC0gKHBhY2tldHNfcHJvY2Vzc2VkLTEpICogdXNiY19oY2NoYXIucy5tcHM7CisJCWJ5dGVzX2luX2xhc3RfcGFja2V0ID0gYnl0ZXNfdGhpc190cmFuc2ZlciAtCisJCQkocGFja2V0c19wcm9jZXNzZWQgLSAxKSAqIHVzYmNfaGNjaGFyLnMubXBzOwogCWVsc2UKIAkJYnl0ZXNfaW5fbGFzdF9wYWNrZXQgPSBieXRlc190aGlzX3RyYW5zZmVyOwogCkBAIC0yNDg1LDkgKzI3MzYsMTEgQEAKIAkgKi8KIAl0cmFuc2FjdGlvbi0+YWN0dWFsX2J5dGVzICs9IGJ5dGVzX3RoaXNfdHJhbnNmZXI7CiAJaWYgKHRyYW5zYWN0aW9uLT50eXBlID09IENWTVhfVVNCX1RSQU5TRkVSX0lTT0NIUk9OT1VTKQotCQlidWZmZXJfc3BhY2VfbGVmdCA9IHRyYW5zYWN0aW9uLT5pc29fcGFja2V0c1swXS5sZW5ndGggLSB0cmFuc2FjdGlvbi0+YWN0dWFsX2J5dGVzOworCQlidWZmZXJfc3BhY2VfbGVmdCA9IHRyYW5zYWN0aW9uLT5pc29fcGFja2V0c1swXS5sZW5ndGggLQorCQkJdHJhbnNhY3Rpb24tPmFjdHVhbF9ieXRlczsKIAllbHNlCi0JCWJ1ZmZlcl9zcGFjZV9sZWZ0ID0gdHJhbnNhY3Rpb24tPmJ1ZmZlcl9sZW5ndGggLSB0cmFuc2FjdGlvbi0+YWN0dWFsX2J5dGVzOworCQlidWZmZXJfc3BhY2VfbGVmdCA9IHRyYW5zYWN0aW9uLT5idWZmZXJfbGVuZ3RoIC0KKwkJCXRyYW5zYWN0aW9uLT5hY3R1YWxfYnl0ZXM7CiAKIAkvKgogCSAqIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIFBJRCB0b2dnbGUgc3RhdGUgZm9yIHRoZSBuZXh0IHRyYW5zYWN0aW9uLgpAQCAtMjUxMyw3ICsyNzY2LDggQEAKIAkJICogdGhlIGFjdHVhbCBieXRlcyB0cmFuc2ZlcnJlZAogCQkgKi8KIAkJcGlwZS0+cGlkX3RvZ2dsZSA9IDA7Ci0JCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLCBDVk1YX1VTQl9DT01QTEVURV9TVEFMTCk7CisJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLAorCQkJCQkgICAgQ1ZNWF9VU0JfQ09NUExFVEVfU1RBTEwpOwogCX0gZWxzZSBpZiAodXNiY19oY2ludC5zLnhhY3RlcnIpIHsKIAkJLyoKIAkJICogV2Uga25vdyBhdCBsZWFzdCBvbmUgcGFja2V0IHdvcmtlZCBpZiB3ZSBnZXQgYSBBQ0sgb3IgTkFLLgpAQCAtMjUyOCw3ICsyNzgyLDggQEAKIAkJCSAqIHNvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSB0cmFuc2Zlci4gRm9yIGV4YW1wbGUsIFBJRAogCQkJICogdG9nZ2xlIGVycm9ycyBjYXVzZSB0aGVzZQogCQkJICovCi0JCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwgQ1ZNWF9VU0JfQ09NUExFVEVfWEFDVEVSUik7CisJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwKKwkJCQkJCSAgICBDVk1YX1VTQl9DT01QTEVURV9YQUNURVJSKTsKIAkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBJZiB0aGlzIHdhcyBhIHNwbGl0IHRoZW4gY2xlYXIgb3VyIHNwbGl0IGluIHByb2dyZXNzCkBAIC0yNTQ0LDEyICsyNzk5LDE1IEBACiAJCQlwaXBlLT5zcGxpdF9zY19mcmFtZSA9IC0xOwogCQkJcGlwZS0+bmV4dF90eF9mcmFtZSArPSBwaXBlLT5pbnRlcnZhbDsKIAkJCWlmIChwaXBlLT5uZXh0X3R4X2ZyYW1lIDwgdXNiLT5mcmFtZV9udW1iZXIpCi0JCQkJcGlwZS0+bmV4dF90eF9mcmFtZSA9IHVzYi0+ZnJhbWVfbnVtYmVyICsgcGlwZS0+aW50ZXJ2YWwgLQotCQkJCQkJICAgICAgKHVzYi0+ZnJhbWVfbnVtYmVyIC0gcGlwZS0+bmV4dF90eF9mcmFtZSkgJSBwaXBlLT5pbnRlcnZhbDsKKwkJCQlwaXBlLT5uZXh0X3R4X2ZyYW1lID0KKwkJCQkJdXNiLT5mcmFtZV9udW1iZXIgKyBwaXBlLT5pbnRlcnZhbCAtCisJCQkJCSh1c2ItPmZyYW1lX251bWJlciAtCisJCQkJCSBwaXBlLT5uZXh0X3R4X2ZyYW1lKSAlIHBpcGUtPmludGVydmFsOwogCQl9CiAJfSBlbHNlIGlmICh1c2JjX2hjaW50LnMuYmJsZXJyKSB7CiAJCS8qIEJhYmJsZSBFcnJvciAoQmJsRXJyKSAqLwotCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwgQ1ZNWF9VU0JfQ09NUExFVEVfQkFCQkxFRVJSKTsKKwkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sCisJCQkJCSAgICBDVk1YX1VTQl9DT01QTEVURV9CQUJCTEVFUlIpOwogCX0gZWxzZSBpZiAodXNiY19oY2ludC5zLmRhdGF0Z2xlcnIpIHsKIAkJLyogV2UnbGwgcmV0cnkgdGhlIGV4YWN0IHNhbWUgdHJhbnNhY3Rpb24gYWdhaW4gKi8KIAkJdHJhbnNhY3Rpb24tPnJldHJpZXMrKzsKQEAgLTI1NjYsOCArMjgyNCwxMSBAQAogCQkJICogSWYgdGhlcmUgaXMgbW9yZSBkYXRhIHRvIGdvIHRoZW4gd2UgbmVlZCB0byB0cnkKIAkJCSAqIGFnYWluLiBPdGhlcndpc2UgdGhpcyB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZQogCQkJICovCi0JCQlpZiAoKGJ1ZmZlcl9zcGFjZV9sZWZ0ID09IDApIHx8IChieXRlc19pbl9sYXN0X3BhY2tldCA8IHBpcGUtPm1heF9wYWNrZXQpKQotCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLCBDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKKwkJCWlmICgoYnVmZmVyX3NwYWNlX2xlZnQgPT0gMCkgfHwKKwkJCQkoYnl0ZXNfaW5fbGFzdF9wYWNrZXQgPCBwaXBlLT5tYXhfcGFja2V0KSkKKwkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLAorCQkJCQkJdHJhbnNhY3Rpb24sCisJCQkJCQlDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKIAkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBTcGxpdCB0cmFuc2FjdGlvbnMgcmV0cnkgdGhlIHNwbGl0IGNvbXBsZXRlIDQgdGltZXMKQEAgLTI2MDUsMTIgKzI4NjYsMTQgQEAKIAkJCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfTk9OX0NPTlRST0w6CiAJCQljYXNlIENWTVhfVVNCX1NUQUdFX05PTl9DT05UUk9MX1NQTElUX0NPTVBMRVRFOgogCQkJCS8qIFRoaXMgc2hvdWxkIGJlIGltcG9zc2libGUgKi8KLQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwgQ1ZNWF9VU0JfQ09NUExFVEVfRVJST1IpOworCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsCisJCQkJCXRyYW5zYWN0aW9uLCBDVk1YX1VTQl9DT01QTEVURV9FUlJPUik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIENWTVhfVVNCX1NUQUdFX1NFVFVQOgogCQkJCXBpcGUtPnBpZF90b2dnbGUgPSAxOwogCQkJCWlmIChfX2N2bXhfdXNiX3BpcGVfbmVlZHNfc3BsaXQodXNiLCBwaXBlKSkKLQkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0gQ1ZNWF9VU0JfU1RBR0VfU0VUVVBfU1BMSVRfQ09NUExFVEU7CisJCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9CisJCQkJCQlDVk1YX1VTQl9TVEFHRV9TRVRVUF9TUExJVF9DT01QTEVURTsKIAkJCQllbHNlIHsKIAkJCQkJdW5pb24gY3ZteF91c2JfY29udHJvbF9oZWFkZXIgKmhlYWRlciA9CiAJCQkJCQljdm14X3BoeXNfdG9fcHRyKHRyYW5zYWN0aW9uLT5jb250cm9sX2hlYWRlcik7CkBAIC0yNjMyLDcgKzI4OTUsOCBAQAogCQkJCWJyZWFrOwogCQkJY2FzZSBDVk1YX1VTQl9TVEFHRV9EQVRBOgogCQkJCWlmIChfX2N2bXhfdXNiX3BpcGVfbmVlZHNfc3BsaXQodXNiLCBwaXBlKSkgewotCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPSBDVk1YX1VTQl9TVEFHRV9EQVRBX1NQTElUX0NPTVBMRVRFOworCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPQorCQkJCQkJQ1ZNWF9VU0JfU1RBR0VfREFUQV9TUExJVF9DT01QTEVURTsKIAkJCQkJLyoKIAkJCQkJICogRm9yIHNldHVwIE9VVCBkYXRhIHRoYXQgYXJlIHNwbGl0cywKIAkJCQkJICogdGhlIGhhcmR3YXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGNvdW50CkBAIC0yNjQxLDMxICsyOTA1LDQ1IEBACiAJCQkJCSAqLwogCQkJCQlpZiAoIXVzYmNfaGNjaGFyLnMuZXBkaXIpIHsKIAkJCQkJCWlmIChidWZmZXJfc3BhY2VfbGVmdCA8IHBpcGUtPm1heF9wYWNrZXQpCi0JCQkJCQkJdHJhbnNhY3Rpb24tPmFjdHVhbF9ieXRlcyArPSBidWZmZXJfc3BhY2VfbGVmdDsKKwkJCQkJCQl0cmFuc2FjdGlvbi0+YWN0dWFsX2J5dGVzICs9CisJCQkJCQkJCWJ1ZmZlcl9zcGFjZV9sZWZ0OwogCQkJCQkJZWxzZQotCQkJCQkJCXRyYW5zYWN0aW9uLT5hY3R1YWxfYnl0ZXMgKz0gcGlwZS0+bWF4X3BhY2tldDsKKwkJCQkJCQl0cmFuc2FjdGlvbi0+YWN0dWFsX2J5dGVzICs9CisJCQkJCQkJCXBpcGUtPm1heF9wYWNrZXQ7CiAJCQkJCX0KLQkJCQl9IGVsc2UgaWYgKChidWZmZXJfc3BhY2VfbGVmdCA9PSAwKSB8fCAoYnl0ZXNfaW5fbGFzdF9wYWNrZXQgPCBwaXBlLT5tYXhfcGFja2V0KSkgeworCQkJCX0gZWxzZSBpZiAoKGJ1ZmZlcl9zcGFjZV9sZWZ0ID09IDApIHx8CisJCQkJCQkoYnl0ZXNfaW5fbGFzdF9wYWNrZXQgPAorCQkJCQkJIHBpcGUtPm1heF9wYWNrZXQpKSB7CiAJCQkJCXBpcGUtPnBpZF90b2dnbGUgPSAxOwotCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPSBDVk1YX1VTQl9TVEFHRV9TVEFUVVM7CisJCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9CisJCQkJCQlDVk1YX1VTQl9TVEFHRV9TVEFUVVM7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBDVk1YX1VTQl9TVEFHRV9EQVRBX1NQTElUX0NPTVBMRVRFOgotCQkJCWlmICgoYnVmZmVyX3NwYWNlX2xlZnQgPT0gMCkgfHwgKGJ5dGVzX2luX2xhc3RfcGFja2V0IDwgcGlwZS0+bWF4X3BhY2tldCkpIHsKKwkJCQlpZiAoKGJ1ZmZlcl9zcGFjZV9sZWZ0ID09IDApIHx8CisJCQkJCQkoYnl0ZXNfaW5fbGFzdF9wYWNrZXQgPAorCQkJCQkJIHBpcGUtPm1heF9wYWNrZXQpKSB7CiAJCQkJCXBpcGUtPnBpZF90b2dnbGUgPSAxOwotCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPSBDVk1YX1VTQl9TVEFHRV9TVEFUVVM7CisJCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9CisJCQkJCQlDVk1YX1VTQl9TVEFHRV9TVEFUVVM7CiAJCQkJfSBlbHNlIHsKLQkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0gQ1ZNWF9VU0JfU1RBR0VfREFUQTsKKwkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0KKwkJCQkJCUNWTVhfVVNCX1NUQUdFX0RBVEE7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBDVk1YX1VTQl9TVEFHRV9TVEFUVVM6CiAJCQkJaWYgKF9fY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKQotCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPSBDVk1YX1VTQl9TVEFHRV9TVEFUVVNfU1BMSVRfQ09NUExFVEU7CisJCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9CisJCQkJCQlDVk1YX1VTQl9TVEFHRV9TVEFUVVNfU1BMSVRfQ09NUExFVEU7CiAJCQkJZWxzZQotCQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwgQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CisJCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsCisJCQkJCQl0cmFuc2FjdGlvbiwKKwkJCQkJCUNWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBDVk1YX1VTQl9TVEFHRV9TVEFUVVNfU1BMSVRfQ09NUExFVEU6Ci0JCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sIENWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOworCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsCisJCQkJCQl0cmFuc2FjdGlvbiwKKwkJCQkJCUNWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJYnJlYWs7CkBAIC0yNjc4LDI3ICsyOTU2LDQ5IEBACiAJCQkgKiBkYXRhIGlzIG5lZWRlZAogCQkJICovCiAJCQlpZiAoX19jdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpIHsKLQkJCQlpZiAodHJhbnNhY3Rpb24tPnN0YWdlID09IENWTVhfVVNCX1NUQUdFX05PTl9DT05UUk9MKQotCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPSBDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTF9TUExJVF9DT01QTEVURTsKKwkJCQlpZiAodHJhbnNhY3Rpb24tPnN0YWdlID09CisJCQkJCQlDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTCkKKwkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0KKwkJCQkJCUNWTVhfVVNCX1NUQUdFX05PTl9DT05UUk9MX1NQTElUX0NPTVBMRVRFOwogCQkJCWVsc2UgewotCQkJCQlpZiAoYnVmZmVyX3NwYWNlX2xlZnQgJiYgKGJ5dGVzX2luX2xhc3RfcGFja2V0ID09IHBpcGUtPm1heF9wYWNrZXQpKQotCQkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0gQ1ZNWF9VU0JfU1RBR0VfTk9OX0NPTlRST0w7CisJCQkJCWlmIChidWZmZXJfc3BhY2VfbGVmdCAmJgorCQkJCQkJKGJ5dGVzX2luX2xhc3RfcGFja2V0ID09CisJCQkJCQkgcGlwZS0+bWF4X3BhY2tldCkpCisJCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPQorCQkJCQkJCUNWTVhfVVNCX1NUQUdFX05PTl9DT05UUk9MOwogCQkJCQllbHNlIHsKLQkJCQkJCWlmICh0cmFuc2FjdGlvbi0+dHlwZSA9PSBDVk1YX1VTQl9UUkFOU0ZFUl9JTlRFUlJVUFQpCi0JCQkJCQkJcGlwZS0+bmV4dF90eF9mcmFtZSArPSBwaXBlLT5pbnRlcnZhbDsKLQkJCQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwgQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CisJCQkJCQlpZiAodHJhbnNhY3Rpb24tPnR5cGUgPT0KKwkJCQkJCQlDVk1YX1VTQl9UUkFOU0ZFUl9JTlRFUlJVUFQpCisJCQkJCQkJcGlwZS0+bmV4dF90eF9mcmFtZSArPQorCQkJCQkJCQlwaXBlLT5pbnRlcnZhbDsKKwkJCQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUoCisJCQkJCQkJCXVzYiwKKwkJCQkJCQkJcGlwZSwKKwkJCQkJCQkJdHJhbnNhY3Rpb24sCisJCQkJCQkJCUNWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOwogCQkJCQl9CiAJCQkJfQogCQkJfSBlbHNlIHsKLQkJCQlpZiAoKHBpcGUtPmRldmljZV9zcGVlZCA9PSBDVk1YX1VTQl9TUEVFRF9ISUdIKSAmJgotCQkJCSAgICAocGlwZS0+dHJhbnNmZXJfdHlwZSA9PSBDVk1YX1VTQl9UUkFOU0ZFUl9CVUxLKSAmJgotCQkJCSAgICAocGlwZS0+dHJhbnNmZXJfZGlyID09IENWTVhfVVNCX0RJUkVDVElPTl9PVVQpICYmCisJCQkJaWYgKChwaXBlLT5kZXZpY2Vfc3BlZWQgPT0KKwkJCQkJQ1ZNWF9VU0JfU1BFRURfSElHSCkgJiYKKwkJCQkgICAgKHBpcGUtPnRyYW5zZmVyX3R5cGUgPT0KKwkJCQkgICAgIENWTVhfVVNCX1RSQU5TRkVSX0JVTEspICYmCisJCQkJICAgIChwaXBlLT50cmFuc2Zlcl9kaXIgPT0KKwkJCQkgICAgIENWTVhfVVNCX0RJUkVDVElPTl9PVVQpICYmCiAJCQkJICAgICh1c2JjX2hjaW50LnMubmFrKSkKLQkJCQkJcGlwZS0+ZmxhZ3MgfD0gX19DVk1YX1VTQl9QSVBFX0ZMQUdTX05FRURfUElORzsKLQkJCQlpZiAoIWJ1ZmZlcl9zcGFjZV9sZWZ0IHx8IChieXRlc19pbl9sYXN0X3BhY2tldCA8IHBpcGUtPm1heF9wYWNrZXQpKSB7Ci0JCQkJCWlmICh0cmFuc2FjdGlvbi0+dHlwZSA9PSBDVk1YX1VTQl9UUkFOU0ZFUl9JTlRFUlJVUFQpCi0JCQkJCQlwaXBlLT5uZXh0X3R4X2ZyYW1lICs9IHBpcGUtPmludGVydmFsOwotCQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwgQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CisJCQkJCXBpcGUtPmZsYWdzIHw9CisJCQkJCQlfX0NWTVhfVVNCX1BJUEVfRkxBR1NfTkVFRF9QSU5HOworCQkJCWlmICghYnVmZmVyX3NwYWNlX2xlZnQgfHwKKwkJCQkJKGJ5dGVzX2luX2xhc3RfcGFja2V0IDwKKwkJCQkJIHBpcGUtPm1heF9wYWNrZXQpKSB7CisJCQkJCWlmICh0cmFuc2FjdGlvbi0+dHlwZSA9PQorCQkJCQkJQ1ZNWF9VU0JfVFJBTlNGRVJfSU5URVJSVVBUKQorCQkJCQkJcGlwZS0+bmV4dF90eF9mcmFtZSArPQorCQkJCQkJCXBpcGUtPmludGVydmFsOworCQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLAorCQkJCQkJcGlwZSwKKwkJCQkJCXRyYW5zYWN0aW9uLAorCQkJCQkJQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CiAJCQkJfQogCQkJfQogCQkJYnJlYWs7CkBAIC0yNzE5LDI4ICszMDE5LDQ1IEBACiAJCQkJCSAqIGNvbXBsZXRlLiBPdGhlcndpc2Ugc3RhcnQgaXQgYWdhaW4gdG8KIAkJCQkJICogc2VuZCB0aGUgbmV4dCAxODggYnl0ZXMKIAkJCQkJICovCi0JCQkJCWlmICghYnVmZmVyX3NwYWNlX2xlZnQgfHwgKGJ5dGVzX3RoaXNfdHJhbnNmZXIgPCAxODgpKSB7CisJCQkJCWlmICghYnVmZmVyX3NwYWNlX2xlZnQgfHwKKwkJCQkJCShieXRlc190aGlzX3RyYW5zZmVyIDwgMTg4KSkgewogCQkJCQkJcGlwZS0+bmV4dF90eF9mcmFtZSArPSBwaXBlLT5pbnRlcnZhbDsKLQkJCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLCBDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKKwkJCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSgKKwkJCQkJCQl1c2IsCisJCQkJCQkJcGlwZSwKKwkJCQkJCQl0cmFuc2FjdGlvbiwKKwkJCQkJCQlDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKIAkJCQkJfQogCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICh0cmFuc2FjdGlvbi0+c3RhZ2UgPT0gQ1ZNWF9VU0JfU1RBR0VfTk9OX0NPTlRST0xfU1BMSVRfQ09NUExFVEUpIHsKKwkJCQkJaWYgKHRyYW5zYWN0aW9uLT5zdGFnZSA9PQorCQkJCQkJQ1ZNWF9VU0JfU1RBR0VfTk9OX0NPTlRST0xfU1BMSVRfQ09NUExFVEUpIHsKIAkJCQkJCS8qCiAJCQkJCQkgKiBXZSBhcmUgaW4gdGhlIGluY29taW5nIGRhdGEKIAkJCQkJCSAqIHBoYXNlLiBLZWVwIGdldHRpbmcgZGF0YQogCQkJCQkJICogdW50aWwgd2UgcnVuIG91dCBvZiBzcGFjZSBvcgogCQkJCQkJICogZ2V0IGEgc21hbGwgcGFja2V0CiAJCQkJCQkgKi8KLQkJCQkJCWlmICgoYnVmZmVyX3NwYWNlX2xlZnQgPT0gMCkgfHwgKGJ5dGVzX2luX2xhc3RfcGFja2V0IDwgcGlwZS0+bWF4X3BhY2tldCkpIHsKLQkJCQkJCQlwaXBlLT5uZXh0X3R4X2ZyYW1lICs9IHBpcGUtPmludGVydmFsOwotCQkJCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLCBDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKKwkJCQkJCWlmICgoYnVmZmVyX3NwYWNlX2xlZnQgPT0gMCkgfHwKKwkJCQkJCQkoYnl0ZXNfaW5fbGFzdF9wYWNrZXQgPAorCQkJCQkJCSBwaXBlLT5tYXhfcGFja2V0KSkgeworCQkJCQkJCXBpcGUtPm5leHRfdHhfZnJhbWUgKz0KKwkJCQkJCQkJcGlwZS0+aW50ZXJ2YWw7CisJCQkJCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKAorCQkJCQkJCQl1c2IsCisJCQkJCQkJCXBpcGUsCisJCQkJCQkJCXRyYW5zYWN0aW9uLAorCQkJCQkJCQlDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKIAkJCQkJCX0KIAkJCQkJfSBlbHNlCi0JCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPSBDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTF9TUExJVF9DT01QTEVURTsKKwkJCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9CisJCQkJCQkJQ1ZNWF9VU0JfU1RBR0VfTk9OX0NPTlRST0xfU1BMSVRfQ09NUExFVEU7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlwaXBlLT5uZXh0X3R4X2ZyYW1lICs9IHBpcGUtPmludGVydmFsOwotCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLCBDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKKwkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLAorCQkJCQkJcGlwZSwKKwkJCQkJCXRyYW5zYWN0aW9uLAorCQkJCQkJQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CiAJCQl9CiAJCQlicmVhazsKIAkJfQpAQCAtMjc2MCw4ICszMDc3LDEwIEBACiAJCXRyYW5zYWN0aW9uLT5zdGFnZSAmPSB+MTsKIAkJcGlwZS0+bmV4dF90eF9mcmFtZSArPSBwaXBlLT5pbnRlcnZhbDsKIAkJaWYgKHBpcGUtPm5leHRfdHhfZnJhbWUgPCB1c2ItPmZyYW1lX251bWJlcikKLQkJCXBpcGUtPm5leHRfdHhfZnJhbWUgPSB1c2ItPmZyYW1lX251bWJlciArIHBpcGUtPmludGVydmFsIC0KLQkJCQkodXNiLT5mcmFtZV9udW1iZXIgLSBwaXBlLT5uZXh0X3R4X2ZyYW1lKSAlIHBpcGUtPmludGVydmFsOworCQkJcGlwZS0+bmV4dF90eF9mcmFtZSA9IHVzYi0+ZnJhbWVfbnVtYmVyICsKKwkJCQlwaXBlLT5pbnRlcnZhbCAtCisJCQkJKHVzYi0+ZnJhbWVfbnVtYmVyIC0gcGlwZS0+bmV4dF90eF9mcmFtZSkgJQorCQkJCXBpcGUtPmludGVydmFsOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBjdm14X3VzYl9wb3J0X3N0YXR1cyBwb3J0OwogCQlwb3J0ID0gY3ZteF91c2JfZ2V0X3N0YXR1cyh1c2IpOwpAQCAtMjc3Myw3ICszMDkyLDggQEAKIAkJCSAqIFdlIGdldCBjaGFubmVsIGhhbHRlZCBpbnRlcnJ1cHRzIHdpdGggbm8gcmVzdWx0IGJpdHMKIAkJCSAqIHNldHMgd2hlbiB0aGUgY2FibGUgaXMgdW5wbHVnZ2VkCiAJCQkgKi8KLQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLCBDVk1YX1VTQl9DT01QTEVURV9FUlJPUik7CisJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwKKwkJCQkJQ1ZNWF9VU0JfQ09NUExFVEVfRVJST1IpOwogCQl9CiAJfQogCXJldHVybiAwOwpAQCAtMjg1Niw5ICszMTc2LDExIEBACiAJCSAqLwogCQlvY3Rlb25fdXNiX3BvcnRfY2FsbGJhY2sodXNiKTsKIAkJLyogQ2xlYXIgdGhlIHBvcnQgY2hhbmdlIGJpdHMgKi8KLQkJdXNiY19ocHJ0LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSk7CisJCXVzYmNfaHBydC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCUNWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSk7CiAJCXVzYmNfaHBydC5zLnBydGVuYSA9IDA7Ci0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksIHVzYmNfaHBydC51MzIpOworCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLAorCQkJCSAgICAgICB1c2JjX2hwcnQudTMyKTsKIAl9CiAJaWYgKHVzYmNfZ2ludHN0cy5zLmhjaGludCkgewogCQkvKgpAQCAtMzAwMiwxMyArMzMyNCwxNSBAQAogCQl9CiAJCXBpcGUgPSBjdm14X3VzYl9vcGVuX3BpcGUoJnByaXYtPnVzYiwgdXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKSwKIAkJCQkJICB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSksIHNwZWVkLAotCQkJCQkgIGxlMTZfdG9fY3B1KGVwLT5kZXNjLndNYXhQYWNrZXRTaXplKSAmIDB4N2ZmLAorCQkJCQkgIGxlMTZfdG9fY3B1KGVwLT5kZXNjLndNYXhQYWNrZXRTaXplKQorCQkJCQkgICYgMHg3ZmYsCiAJCQkJCSAgdHJhbnNmZXJfdHlwZSwKIAkJCQkJICB1c2JfcGlwZWluKHVyYi0+cGlwZSkgPwogCQkJCQkJQ1ZNWF9VU0JfRElSRUNUSU9OX0lOIDoKIAkJCQkJCUNWTVhfVVNCX0RJUkVDVElPTl9PVVQsCiAJCQkJCSAgdXJiLT5pbnRlcnZhbCwKLQkJCQkJICAobGUxNl90b19jcHUoZXAtPmRlc2Mud01heFBhY2tldFNpemUpID4+IDExKSAmIDB4MywKKwkJCQkJICAobGUxNl90b19jcHUoZXAtPmRlc2Mud01heFBhY2tldFNpemUpCisJCQkJCSAgID4+IDExKSAmIDB4MywKIAkJCQkJICBzcGxpdF9kZXZpY2UsIHNwbGl0X3BvcnQpOwogCQlpZiAoIXBpcGUpIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKQEAgLTMwMjMsNyArMzM0Nyw4IEBACiAJc3dpdGNoICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSkgewogCWNhc2UgUElQRV9JU09DSFJPTk9VUzoKIAkJZGV2X2RiZyhkZXYsICJTdWJtaXQgaXNvY2hyb25vdXMgdG8gJWQuJWRcbiIsCi0JCQl1c2JfcGlwZWRldmljZSh1cmItPnBpcGUpLCB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSkpOworCQkJdXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKSwKKwkJCXVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKSk7CiAJCS8qCiAJCSAqIEFsbG9jYXRlIGEgc3RydWN0dXJlIHRvIHVzZSBmb3Igb3VyIHByaXZhdGUgbGlzdCBvZgogCQkgKiBpc29jaHJvbm91cyBwYWNrZXRzLgpAQCAtMzAzNSw5ICszMzYwLDEyIEBACiAJCQlpbnQgaTsKIAkJCS8qIEZpbGwgdGhlIGxpc3Qgd2l0aCB0aGUgZGF0YSBmcm9tIHRoZSBVUkIgKi8KIAkJCWZvciAoaSA9IDA7IGkgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKLQkJCQlpc29fcGFja2V0W2ldLm9mZnNldCA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0OwotCQkJCWlzb19wYWNrZXRbaV0ubGVuZ3RoID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5sZW5ndGg7Ci0JCQkJaXNvX3BhY2tldFtpXS5zdGF0dXMgPSBDVk1YX1VTQl9DT01QTEVURV9FUlJPUjsKKwkJCQlpc29fcGFja2V0W2ldLm9mZnNldCA9CisJCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0OworCQkJCWlzb19wYWNrZXRbaV0ubGVuZ3RoID0KKwkJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5sZW5ndGg7CisJCQkJaXNvX3BhY2tldFtpXS5zdGF0dXMgPQorCQkJCQlDVk1YX1VTQl9DT01QTEVURV9FUlJPUjsKIAkJCX0KIAkJCS8qCiAJCQkgKiBTdG9yZSBhIHBvaW50ZXIgdG8gdGhlIGxpc3QgaW4gdGhlIFVSQiBzZXR1cF9wYWNrZXQKQEAgLTMwNTksMTcgKzMzODcsMjAgQEAKIAkJYnJlYWs7CiAJY2FzZSBQSVBFX0lOVEVSUlVQVDoKIAkJZGV2X2RiZyhkZXYsICJTdWJtaXQgaW50ZXJydXB0IHRvICVkLiVkXG4iLAotCQkJdXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKSwgdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpKTsKKwkJCXVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSksCisJCQl1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSkpOwogCQl0cmFuc2FjdGlvbiA9IGN2bXhfdXNiX3N1Ym1pdF9pbnRlcnJ1cHQoJnByaXYtPnVzYiwgcGlwZSwgdXJiKTsKIAkJYnJlYWs7CiAJY2FzZSBQSVBFX0NPTlRST0w6CiAJCWRldl9kYmcoZGV2LCAiU3VibWl0IGNvbnRyb2wgdG8gJWQuJWRcbiIsCi0JCQl1c2JfcGlwZWRldmljZSh1cmItPnBpcGUpLCB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSkpOworCQkJdXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKSwKKwkJCXVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKSk7CiAJCXRyYW5zYWN0aW9uID0gY3ZteF91c2Jfc3VibWl0X2NvbnRyb2woJnByaXYtPnVzYiwgcGlwZSwgdXJiKTsKIAkJYnJlYWs7CiAJY2FzZSBQSVBFX0JVTEs6CiAJCWRldl9kYmcoZGV2LCAiU3VibWl0IGJ1bGsgdG8gJWQuJWRcbiIsCi0JCQl1c2JfcGlwZWRldmljZSh1cmItPnBpcGUpLCB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSkpOworCQkJdXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKSwKKwkJCXVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKSk7CiAJCXRyYW5zYWN0aW9uID0gY3ZteF91c2Jfc3VibWl0X2J1bGsoJnByaXYtPnVzYiwgcGlwZSwgdXJiKTsKIAkJYnJlYWs7CiAJfQpAQCAtMzEwMCw3ICszNDMxLDkgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgb2N0ZW9uX3VzYl91cmJfZGVxdWV1ZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIsIGludCBzdGF0dXMpCitzdGF0aWMgaW50IG9jdGVvbl91c2JfdXJiX2RlcXVldWUoc3RydWN0IHVzYl9oY2QgKmhjZCwKKwkJCQkgIHN0cnVjdCB1cmIgKnVyYiwKKwkJCQkgIGludCBzdGF0dXMpCiB7CiAJc3RydWN0IG9jdGVvbl9oY2QgKnByaXYgPSBoY2RfdG9fb2N0ZW9uKGhjZCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTMxMjAsNyArMzQ1Myw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG9jdGVvbl91c2JfZW5kcG9pbnRfZGlzYWJsZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwKQorc3RhdGljIHZvaWQgb2N0ZW9uX3VzYl9lbmRwb2ludF9kaXNhYmxlKHN0cnVjdCB1c2JfaGNkICpoY2QsCisJCQkJCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXApCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gaGNkLT5zZWxmLmNvbnRyb2xsZXI7CiAKQEAgLTMyMDMsNyArMzUzNyw4IEBACiAJCQlkZXZfZGJnKGRldiwgIiBDX0NPTk5FQ1RJT05cbiIpOwogCQkJLyogQ2xlYXJzIGRyaXZlcnMgaW50ZXJuYWwgY29ubmVjdCBzdGF0dXMgY2hhbmdlIGZsYWcgKi8KIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCQlwcml2LT51c2IucG9ydF9zdGF0dXMgPSBjdm14X3VzYl9nZXRfc3RhdHVzKCZwcml2LT51c2IpOworCQkJcHJpdi0+dXNiLnBvcnRfc3RhdHVzID0KKwkJCQljdm14X3VzYl9nZXRfc3RhdHVzKCZwcml2LT51c2IpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQkJYnJlYWs7CiAJCWNhc2UgVVNCX1BPUlRfRkVBVF9DX1JFU0VUOgpAQCAtMzIxMiw3ICszNTQ3LDggQEAKIAkJCSAqIENsZWFycyB0aGUgZHJpdmVyJ3MgaW50ZXJuYWwgUG9ydCBSZXNldCBDaGFuZ2UgZmxhZy4KIAkJCSAqLwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJCXByaXYtPnVzYi5wb3J0X3N0YXR1cyA9IGN2bXhfdXNiX2dldF9zdGF0dXMoJnByaXYtPnVzYik7CisJCQlwcml2LT51c2IucG9ydF9zdGF0dXMgPQorCQkJCWN2bXhfdXNiX2dldF9zdGF0dXMoJnByaXYtPnVzYik7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJCQlicmVhazsKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfRU5BQkxFOgpAQCAtMzIyMiw3ICszNTU4LDggQEAKIAkJCSAqIENoYW5nZSBmbGFnLgogCQkJICovCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQkJcHJpdi0+dXNiLnBvcnRfc3RhdHVzID0gY3ZteF91c2JfZ2V0X3N0YXR1cygmcHJpdi0+dXNiKTsKKwkJCXByaXYtPnVzYi5wb3J0X3N0YXR1cyA9CisJCQkJY3ZteF91c2JfZ2V0X3N0YXR1cygmcHJpdi0+dXNiKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkJCWJyZWFrOwogCQljYXNlIFVTQl9QT1JUX0ZFQVRfQ19TVVNQRU5EOgpAQCAtMzIzNyw3ICszNTc0LDggQEAKIAkJCWRldl9kYmcoZGV2LCAiIENfT1ZFUl9DVVJSRU5UXG4iKTsKIAkJCS8qIENsZWFycyB0aGUgZHJpdmVyJ3Mgb3ZlcmN1cnJlbnQgQ2hhbmdlIGZsYWcgKi8KIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCQlwcml2LT51c2IucG9ydF9zdGF0dXMgPSBjdm14X3VzYl9nZXRfc3RhdHVzKCZwcml2LT51c2IpOworCQkJcHJpdi0+dXNiLnBvcnRfc3RhdHVzID0KKwkJCQljdm14X3VzYl9nZXRfc3RhdHVzKCZwcml2LT51c2IpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CkBAIC0zMzY5LDYgKzM3MDcsOCBAQAogCS5nZXRfZnJhbWVfbnVtYmVyCT0gb2N0ZW9uX3VzYl9nZXRfZnJhbWVfbnVtYmVyLAogCS5odWJfc3RhdHVzX2RhdGEJPSBvY3Rlb25fdXNiX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wJCT0gb2N0ZW9uX3VzYl9odWJfY29udHJvbCwKKwkubWFwX3VyYl9mb3JfZG1hCT0gb2N0ZW9uX21hcF91cmJfZm9yX2RtYSwKKwkudW5tYXBfdXJiX2Zvcl9kbWEJPSBvY3Rlb25fdW5tYXBfdXJiX2Zvcl9kbWEsCiB9OwogCiBzdGF0aWMgaW50IG9jdGVvbl91c2JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTM0MTEsNyArMzc1MSw4IEBACiAJCWluaXRpYWxpemVfZmxhZ3MgPSBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX0NMT0NLXzQ4TUhaOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKGRldiwgIklsbGViYWwgVVNCTiBcInJlZmNsay1mcmVxdWVuY3lcIiAldVxuIiwgY2xvY2tfcmF0ZSk7CisJCWRldl9lcnIoZGV2LCAiSWxsZWJhbCBVU0JOIFwicmVmY2xrLWZyZXF1ZW5jeVwiICV1XG4iLAorCQkJCWNsb2NrX3JhdGUpOwogCQlyZXR1cm4gLUVOWElPOwogCiAJfQpAQCAtMzQ3Nyw3ICszODE4LDggQEAKIAogCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKIAotCXRhc2tsZXRfaW5pdCgmcHJpdi0+ZGVxdWV1ZV90YXNrbGV0LCBvY3Rlb25fdXNiX3VyYl9kZXF1ZXVlX3dvcmssICh1bnNpZ25lZCBsb25nKXByaXYpOworCXRhc2tsZXRfaW5pdCgmcHJpdi0+ZGVxdWV1ZV90YXNrbGV0LCBvY3Rlb25fdXNiX3VyYl9kZXF1ZXVlX3dvcmssCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpcHJpdik7CiAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmRlcXVldWVfbGlzdCk7CiAKIAlzdGF0dXMgPSBjdm14X3VzYl9pbml0aWFsaXplKCZwcml2LT51c2IsIHVzYl9udW0sIGluaXRpYWxpemVfZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1kZWZpbmVzLmggYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LWRlZmluZXMuaAppbmRleCBiZGFlYzhkLi4yYTk4YTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LWRlZmluZXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LWRlZmluZXMuaApAQCAtMzMsMTAgKzMzLDYgQEAKICAqICAgICAgZHJpdmVyIHdpbGwgdXNlIHRoaXMgbWVtb3J5IGluc3RlYWQgb2Yga2VybmVsIG1lbW9yeSBmb3IgcG9vbHMuIFRoaXMKICAqICAgICAgYWxsb3dzIDMyYml0IHVzZXJzcGFjZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgdGhlIGJ1ZmZlcnMsIGJ1dCBhbHNvCiAgKiAgICAgIHJlcXVpcmVzIGFsbCByZWNlaXZlZCBwYWNrZXRzIHRvIGJlIGNvcGllZC4KLSAqICBDT05GSUdfQ0FWSVVNX09DVEVPTl9OVU1fUEFDS0VUX0JVRkZFUlMKLSAqICAgICAgVGhpcyBrZXJuZWwgY29uZmlnIG9wdGlvbiBhbGxvd3MgdGhlIHVzZXIgdG8gY29udHJvbCB0aGUgbnVtYmVyIG9mCi0gKiAgICAgIHBhY2tldCBhbmQgd29yayBxdWV1ZSBidWZmZXJzIGFsbG9jYXRlZCBieSB0aGUgZHJpdmVyLiBJZiB0aGlzIGlzIHplcm8sCi0gKiAgICAgIHRoZSBkcml2ZXIgdXNlcyB0aGUgZGVmYXVsdCBmcm9tIGJlbG93LgogICogIFVTRV9TS0JVRkZTX0lOX0hXCiAgKiAgICAgIFRlbGxzIHRoZSBkcml2ZXIgdG8gcG9wdWxhdGUgdGhlIHBhY2tldCBidWZmZXJzIHdpdGgga2VybmVsIHNrYnVmZnMuCiAgKiAgICAgIFRoaXMgYWxsb3dzIHRoZSBkcml2ZXIgdG8gcmVjZWl2ZSBwYWNrZXRzIHdpdGhvdXQgY29weWluZyB0aGVtLiBJdCBhbHNvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1kaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtbWRpby5jCmluZGV4IDgzYjEwMzAuLjNmMDY3ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtbWRpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtbWRpby5jCkBAIC0xMjcsMjMgKzEyNywyMSBAQAogCQlsaW5rX2luZm8ucy5saW5rX3VwID0gcHJpdi0+bGFzdF9saW5rID8gMSA6IDA7CiAJCWxpbmtfaW5mby5zLmZ1bGxfZHVwbGV4ID0gcHJpdi0+cGh5ZGV2LT5kdXBsZXggPyAxIDogMDsKIAkJbGlua19pbmZvLnMuc3BlZWQgPSBwcml2LT5waHlkZXYtPnNwZWVkOwotCQljdm14X2hlbHBlcl9saW5rX3NldCggcHJpdi0+cG9ydCwgbGlua19pbmZvKTsKKwkJY3ZteF9oZWxwZXJfbGlua19zZXQocHJpdi0+cG9ydCwgbGlua19pbmZvKTsKIAkJaWYgKHByaXYtPmxhc3RfbGluaykgewogCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOwogCQkJaWYgKHByaXYtPnF1ZXVlICE9IC0xKQogCQkJCXByaW50a19yYXRlbGltaXRlZCgiJXM6ICV1IE1icHMgJXMgZHVwbGV4LCAiCi0JCQkJCQkgICAicG9ydCAlMmQsIHF1ZXVlICUyZFxuIiwKLQkJCQkJCSAgIGRldi0+bmFtZSwgcHJpdi0+cGh5ZGV2LT5zcGVlZCwKLQkJCQkJCSAgIHByaXYtPnBoeWRldi0+ZHVwbGV4ID8KLQkJCQkJCSAgICJGdWxsIiA6ICJIYWxmIiwKLQkJCQkJCSAgIHByaXYtPnBvcnQsIHByaXYtPnF1ZXVlKTsKKwkJCQkJInBvcnQgJTJkLCBxdWV1ZSAlMmRcbiIsIGRldi0+bmFtZSwKKwkJCQkJcHJpdi0+cGh5ZGV2LT5zcGVlZCwKKwkJCQkJcHJpdi0+cGh5ZGV2LT5kdXBsZXggPyAiRnVsbCIgOiAiSGFsZiIsCisJCQkJCXByaXYtPnBvcnQsIHByaXYtPnF1ZXVlKTsKIAkJCWVsc2UKIAkJCQlwcmludGtfcmF0ZWxpbWl0ZWQoIiVzOiAldSBNYnBzICVzIGR1cGxleCwgIgotCQkJCQkJICAgInBvcnQgJTJkLCBQT1dcbiIsCi0JCQkJCQkgICBkZXYtPm5hbWUsIHByaXYtPnBoeWRldi0+c3BlZWQsCi0JCQkJCQkgICBwcml2LT5waHlkZXYtPmR1cGxleCA/Ci0JCQkJCQkgICAiRnVsbCIgOiAiSGFsZiIsCi0JCQkJCQkgICBwcml2LT5wb3J0KTsKKwkJCQkJInBvcnQgJTJkLCBQT1dcbiIsIGRldi0+bmFtZSwKKwkJCQkJcHJpdi0+cGh5ZGV2LT5zcGVlZCwKKwkJCQkJcHJpdi0+cGh5ZGV2LT5kdXBsZXggPyAiRnVsbCIgOiAiSGFsZiIsCisJCQkJCXByaXYtPnBvcnQpOwogCQl9IGVsc2UgewogCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAkJCXByaW50a19yYXRlbGltaXRlZCgiJXM6IExpbmsgZG93blxuIiwgZGV2LT5uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtbWVtLmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1lbS5jCmluZGV4IDE5OTA1OWQuLmJmNjY2YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtbWVtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZW0uYwpAQCAtMzAsNiArMzAsNyBAQAogCiAjaW5jbHVkZSA8YXNtL29jdGVvbi9vY3Rlb24uaD4KIAorI2luY2x1ZGUgImV0aGVybmV0LW1lbS5oIgogI2luY2x1ZGUgImV0aGVybmV0LWRlZmluZXMuaCIKIAogI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC1mcGEuaD4KQEAgLTc5LDEwICs4MCwxMCBAQAogCX0gd2hpbGUgKG1lbW9yeSk7CiAKIAlpZiAoZWxlbWVudHMgPCAwKQotCQlwcl93YXJuaW5nKCJGcmVlaW5nIG9mIHBvb2wgJXUgaGFkIHRvbyBtYW55IHNrYnVmZnMgKCVkKVxuIiwKKwkJcHJfd2FybigiRnJlZWluZyBvZiBwb29sICV1IGhhZCB0b28gbWFueSBza2J1ZmZzICglZClcbiIsCiAJCSAgICAgcG9vbCwgZWxlbWVudHMpOwogCWVsc2UgaWYgKGVsZW1lbnRzID4gMCkKLQkJcHJfd2FybmluZygiRnJlZWluZyBvZiBwb29sICV1IGlzIG1pc3NpbmcgJWQgc2tidWZmc1xuIiwKKwkJcHJfd2FybigiRnJlZWluZyBvZiBwb29sICV1IGlzIG1pc3NpbmcgJWQgc2tidWZmc1xuIiwKIAkJICAgICAgIHBvb2wsIGVsZW1lbnRzKTsKIH0KIApAQCAtMTEzLDcgKzExNCw3IEBACiAJCSAqLwogCQltZW1vcnkgPSBrbWFsbG9jKHNpemUgKyAyNTYsIEdGUF9BVE9NSUMpOwogCQlpZiAodW5saWtlbHkobWVtb3J5ID09IE5VTEwpKSB7Ci0JCQlwcl93YXJuaW5nKCJVbmFibGUgdG8gYWxsb2NhdGUgJXUgYnl0ZXMgZm9yIEZQQSBwb29sICVkXG4iLAorCQkJcHJfd2FybigiVW5hYmxlIHRvIGFsbG9jYXRlICV1IGJ5dGVzIGZvciBGUEEgcG9vbCAlZFxuIiwKIAkJCQkgICBlbGVtZW50cyAqIHNpemUsIHBvb2wpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTE0NiwxMCArMTQ3LDEwIEBACiAJfSB3aGlsZSAoZnBhKTsKIAogCWlmIChlbGVtZW50cyA8IDApCi0JCXByX3dhcm5pbmcoIkZyZWVpbmcgb2YgcG9vbCAldSBoYWQgdG9vIG1hbnkgYnVmZmVycyAoJWQpXG4iLAorCQlwcl93YXJuKCJGcmVlaW5nIG9mIHBvb2wgJXUgaGFkIHRvbyBtYW55IGJ1ZmZlcnMgKCVkKVxuIiwKIAkJCXBvb2wsIGVsZW1lbnRzKTsKIAllbHNlIGlmIChlbGVtZW50cyA+IDApCi0JCXByX3dhcm5pbmcoIldhcm5pbmc6IEZyZWVpbmcgb2YgcG9vbCAldSBpcyBtaXNzaW5nICVkIGJ1ZmZlcnNcbiIsCisJCXByX3dhcm4oIldhcm5pbmc6IEZyZWVpbmcgb2YgcG9vbCAldSBpcyBtaXNzaW5nICVkIGJ1ZmZlcnNcbiIsCiAJCQlwb29sLCBlbGVtZW50cyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtcmdtaWkuYyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtcmdtaWkuYwppbmRleCBlYTUzYWYzLi4wZWMwZGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXJnbWlpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1yZ21paS5jCkBAIC00Myw3ICs0Myw3IEBACiAjaW5jbHVkZSA8YXNtL29jdGVvbi9jdm14LW5waS1kZWZzLmg+CiAjaW5jbHVkZSA8YXNtL29jdGVvbi9jdm14LWdteHgtZGVmcy5oPgogCi1ERUZJTkVfU1BJTkxPQ0soZ2xvYmFsX3JlZ2lzdGVyX2xvY2spOworc3RhdGljIERFRklORV9TUElOTE9DSyhnbG9iYWxfcmVnaXN0ZXJfbG9jayk7CiAKIHN0YXRpYyBpbnQgbnVtYmVyX3JnbWlpX3BvcnRzOwogCkBAIC03Miw3ICs3Miw4IEBACiAJCSAqIElmIHRoZSAxME1icHMgcHJlYW1ibGUgd29ya2Fyb3VuZCBpcyBzdXBwb3J0ZWQgYW5kIHdlJ3JlCiAJCSAqIGF0IDEwTWJwcyB3ZSBtYXkgbmVlZCB0byBkbyBzb21lIHNwZWNpYWwgY2hlY2tpbmcuCiAJCSAqLwotCQlpZiAoVVNFXzEwTUJQU19QUkVBTUJMRV9XT1JLQVJPVU5EICYmIChsaW5rX2luZm8ucy5zcGVlZCA9PSAxMCkpIHsKKwkJaWYgKFVTRV8xME1CUFNfUFJFQU1CTEVfV09SS0FST1VORCAmJgorCQkJCShsaW5rX2luZm8ucy5zcGVlZCA9PSAxMCkpIHsKIAogCQkJLyoKIAkJCSAqIFJlYWQgdGhlIEdNWFhfUlhYX0lOVF9SRUdbUENURVJSXSBiaXQgYW5kCkBAIC0xNjYsOSArMTY3LDggQEAKIAogCWlmICh1c2VfZ2xvYmFsX3JlZ2lzdGVyX2xvY2spCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdsb2JhbF9yZWdpc3Rlcl9sb2NrLCBmbGFncyk7Ci0JZWxzZSB7CisJZWxzZQogCQltdXRleF91bmxvY2soJnByaXYtPnBoeWRldi0+YnVzLT5tZGlvX2xvY2spOwotCX0KIAogCWlmIChwcml2LT5waHlkZXYgPT0gTlVMTCkgewogCQkvKiBUZWxsIGNvcmUuICovCkBAIC0yMzIsOCArMjMyLDEwIEBACiAJCQkJCQkgICAoaW50ZXJmYWNlLCBpbmRleCldOwogCQkJCXN0cnVjdCBvY3Rlb25fZXRoZXJuZXQgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JCQkJaWYgKGRldiAmJiAhYXRvbWljX3JlYWQoJmN2bV9vY3RfcG9sbF9xdWV1ZV9zdG9wcGluZykpCi0JCQkJCXF1ZXVlX3dvcmsoY3ZtX29jdF9wb2xsX3F1ZXVlLCAmcHJpdi0+cG9ydF93b3JrKTsKKwkJCQlpZiAoZGV2ICYmCisJCQkJIWF0b21pY19yZWFkKCZjdm1fb2N0X3BvbGxfcXVldWVfc3RvcHBpbmcpKQorCQkJCQlxdWV1ZV93b3JrKGN2bV9vY3RfcG9sbF9xdWV1ZSwKKwkJCQkJCSZwcml2LT5wb3J0X3dvcmspOwogCiAJCQkJZ214X3J4X2ludF9yZWcudTY0ID0gMDsKIAkJCQlnbXhfcnhfaW50X3JlZy5zLnBoeV9kdXB4ID0gMTsKQEAgLTI3NCw4ICsyNzYsMTAgQEAKIAkJCQkJCSAgIChpbnRlcmZhY2UsIGluZGV4KV07CiAJCQkJc3RydWN0IG9jdGVvbl9ldGhlcm5ldCAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAKLQkJCQlpZiAoZGV2ICYmICFhdG9taWNfcmVhZCgmY3ZtX29jdF9wb2xsX3F1ZXVlX3N0b3BwaW5nKSkKLQkJCQkJcXVldWVfd29yayhjdm1fb2N0X3BvbGxfcXVldWUsICZwcml2LT5wb3J0X3dvcmspOworCQkJCWlmIChkZXYgJiYKKwkJCQkhYXRvbWljX3JlYWQoJmN2bV9vY3RfcG9sbF9xdWV1ZV9zdG9wcGluZykpCisJCQkJCXF1ZXVlX3dvcmsoY3ZtX29jdF9wb2xsX3F1ZXVlLAorCQkJCQkJJnByaXYtPnBvcnRfd29yayk7CiAKIAkJCQlnbXhfcnhfaW50X3JlZy51NjQgPSAwOwogCQkJCWdteF9yeF9pbnRfcmVnLnMucGh5X2R1cHggPSAxOwpAQCAtMzI3LDcgKzMzMSw4IEBACiAKIHN0YXRpYyB2b2lkIGN2bV9vY3RfcmdtaWlfaW1tZWRpYXRlX3BvbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBvY3Rlb25fZXRoZXJuZXQgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG9jdGVvbl9ldGhlcm5ldCwgcG9ydF93b3JrKTsKKwlzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0ICpwcml2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBvY3Rlb25fZXRoZXJuZXQsIHBvcnRfd29yayk7CiAJY3ZtX29jdF9yZ21paV9wb2xsKGN2bV9vY3RfZGV2aWNlW3ByaXYtPnBvcnRdKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC10eC5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC10eC5jCmluZGV4IDQ3NTQxZTEuLjhjYTU1YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtdHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXR4LmMKQEAgLTk1LDcgKzk1LDcgQEAKIAljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9USU1YKDEpLCBjaXVfdGlteC51NjQpOwogfQogCi12b2lkIGN2bV9vY3RfZnJlZV90eF9za2JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBjdm1fb2N0X2ZyZWVfdHhfc2ticyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWludDMyX3Qgc2tiX3RvX2ZyZWU7CiAJaW50IHFvcywgcXVldWVzX3Blcl9wb3J0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC5jCmluZGV4IDA4OWRjNGIuLmZmNzIxNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LmMKQEAgLTU1LDE3ICs1NSwxMSBAQAogI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC1nbXh4LWRlZnMuaD4KICNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtc21peC1kZWZzLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19DQVZJVU1fT0NURU9OX05VTV9QQUNLRVRfQlVGRkVSUykgXAotCSYmIENPTkZJR19DQVZJVU1fT0NURU9OX05VTV9QQUNLRVRfQlVGRkVSUwotaW50IG51bV9wYWNrZXRfYnVmZmVycyA9IENPTkZJR19DQVZJVU1fT0NURU9OX05VTV9QQUNLRVRfQlVGRkVSUzsKLSNlbHNlCi1pbnQgbnVtX3BhY2tldF9idWZmZXJzID0gMTAyNDsKLSNlbmRpZgorc3RhdGljIGludCBudW1fcGFja2V0X2J1ZmZlcnMgPSAxMDI0OwogbW9kdWxlX3BhcmFtKG51bV9wYWNrZXRfYnVmZmVycywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MobnVtX3BhY2tldF9idWZmZXJzLCAiXG4iCiAJIlx0TnVtYmVyIG9mIHBhY2tldCBidWZmZXJzIHRvIGFsbG9jYXRlIGFuZCBzdG9yZSBpbiB0aGVcbiIKLQkiXHRGUEEuIEJ5IGRlZmF1bHQsIDEwMjQgcGFja2V0IGJ1ZmZlcnMgYXJlIHVzZWQgdW5sZXNzXG4iCi0JIlx0Q09ORklHX0NBVklVTV9PQ1RFT05fTlVNX1BBQ0tFVF9CVUZGRVJTIGlzIGRlZmluZWQuIik7CisJIlx0RlBBLiBCeSBkZWZhdWx0LCAxMDI0IHBhY2tldCBidWZmZXJzIGFyZSB1c2VkLlxuIik7CiAKIGludCBwb3dfcmVjZWl2ZV9ncm91cCA9IDE1OwogbW9kdWxlX3BhcmFtKHBvd19yZWNlaXZlX2dyb3VwLCBpbnQsIDA0NDQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9vY3Rlb24tZXRoZXJuZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vb2N0ZW9uLWV0aGVybmV0LmgKaW5kZXggOTM2MGUyMi4uNGNmMzg4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9vY3Rlb24tZXRoZXJuZXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL29jdGVvbi1ldGhlcm5ldC5oCkBAIC01OCw3ICs1OCw3IEBACiAJLyogTGFzdCBuZWdvdGlhdGVkIGxpbmsgc3RhdGUgKi8KIAl1aW50NjRfdCBsaW5rX2luZm87CiAJLyogQ2FsbGVkIHBlcmlvZGljYWxseSB0byBjaGVjayBsaW5rIHN0YXR1cyAqLwotCXZvaWQgKCpwb2xsKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnBvbGwpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCXN0cnVjdCBkZWxheWVkX3dvcmsJcG9ydF9wZXJpb2RpY193b3JrOwogCXN0cnVjdCB3b3JrX3N0cnVjdAlwb3J0X3dvcms7CS8qIG1heSBiZSB1bnVzZWQuICovCiAJc3RydWN0IGRldmljZV9ub2RlCSpvZl9ub2RlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9vbHBjX2Rjb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vb2xwY19kY29uLmgKaW5kZXggZTI2NjNiMS4uYWVjOTg5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9vbHBjX2Rjb24uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbi5oCkBAIC0zNyw3ICszNyw3IEBACiAvKiBMb2FkIERlbGF5IExvY2tlZCBMb29wIChETEwpIHNldHRpbmdzIGZvciBjbG9jayBkZWxheSAqLwogI2RlZmluZSBNRU1fRExMX0NMT0NLX0RFTEFZCSgxPDwwKQogLyogTWVtb3J5IGNvbnRyb2xsZXIgcG93ZXIgZG93biBmdW5jdGlvbiAqLwotI2RlZmluZSBNRU1fUE9XRVJfRE9XTiAgCSgxPDw4KQorI2RlZmluZSBNRU1fUE9XRVJfRE9XTgkJKDE8PDgpCiAvKiBNZW1vcnkgY29udHJvbGxlciBzb2Z0d2FyZSByZXNldCAqLwogI2RlZmluZSBNRU1fU09GVF9SRVNFVAkJKDE8PDApCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pjZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296Y2Rldi5jCmluZGV4IDVkZTU5ODEuLjEwYzBhOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pjZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9vemNkZXYuYwpAQCAtMjE3LDcgKzIxNyw3IEBACiAJcGQgPSBvel9wZF9maW5kKGFkZHIpOwogCWlmIChwZCkgewogCQlzcGluX2xvY2tfYmgoJmdfY2Rldi5sb2NrKTsKLQkJbWVtY3B5KGdfY2Rldi5hY3RpdmVfYWRkciwgYWRkciwgRVRIX0FMRU4pOworCQlldGhlcl9hZGRyX2NvcHkoZ19jZGV2LmFjdGl2ZV9hZGRyLCBhZGRyKTsKIAkJb2xkX3BkID0gZ19jZGV2LmFjdGl2ZV9wZDsKIAkJZ19jZGV2LmFjdGl2ZV9wZCA9IHBkOwogCQlzcGluX3VubG9ja19iaCgmZ19jZGV2LmxvY2spOwpAQCAtMjgzLDcgKzI4Myw3IEBACiAJCQl1OCBhZGRyW0VUSF9BTEVOXTsKIAkJCW96X2RiZyhPTiwgIk9aX0lPQ1RMX0dFVF9BQ1RJVkVfUERcbiIpOwogCQkJc3Bpbl9sb2NrX2JoKCZnX2NkZXYubG9jayk7Ci0JCQltZW1jcHkoYWRkciwgZ19jZGV2LmFjdGl2ZV9hZGRyLCBFVEhfQUxFTik7CisJCQlldGhlcl9hZGRyX2NvcHkoYWRkciwgZ19jZGV2LmFjdGl2ZV9hZGRyKTsKIAkJCXNwaW5fdW5sb2NrX2JoKCZnX2NkZXYubG9jayk7CiAJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgYWRkciwgRVRIX0FMRU4pKQogCQkJCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9vemhjZC5jIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9vemhjZC5jCmluZGV4IGVmYWYyNmYuLmIzZDQwMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3poY2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296aGNkLmMKQEAgLTM1NCw3ICszNTQsOCBAQAogICogZGlzYWJsZWQuCiAgKiBDb250ZXh0OiBzb2Z0aXJxIG9yIHByb2Nlc3MKICAqLwotc3RhdGljIHN0cnVjdCBvel91cmJfbGluayAqb3pfdW5jYW5jZWxfdXJiKHN0cnVjdCBvel9oY2QgKm96aGNkLCBzdHJ1Y3QgdXJiICp1cmIpCitzdGF0aWMgc3RydWN0IG96X3VyYl9saW5rICpvel91bmNhbmNlbF91cmIoc3RydWN0IG96X2hjZCAqb3poY2QsCisJCXN0cnVjdCB1cmIgKnVyYikKIHsKIAlzdHJ1Y3Qgb3pfdXJiX2xpbmsgKnVyYmw7CiAJc3RydWN0IGxpc3RfaGVhZCAqZTsKQEAgLTE5ODYsOCArMTk4Nyw3IEBACiAJbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykpOwogCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IDB4Mjk7CiAJZGVzYy0+YkRlc2NMZW5ndGggPSA5OwotCWRlc2MtPndIdWJDaGFyYWN0ZXJpc3RpY3MgPSAoX19mb3JjZSBfX3UxNikKLQkJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDAxKTsKKwlkZXNjLT53SHViQ2hhcmFjdGVyaXN0aWNzID0gKF9fZm9yY2UgX191MTYpY3B1X3RvX2xlMTYoMHgwMDAxKTsKIAlkZXNjLT5iTmJyUG9ydHMgPSBPWl9OQl9QT1JUUzsKIH0KIApAQCAtMjE4MSw3ICsyMTgxLDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBHZXRIdWJTdGF0dXM6CiAJCW96X2RiZyhIVUIsICJHZXRIdWJTdGF0dXM6IHJlcV90eXBlID0gMHgleFxuIiwgcmVxX3R5cGUpOwotCQlwdXRfdW5hbGlnbmVkKF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMCksIChfX2xlMzIgKilidWYpOworCQlwdXRfdW5hbGlnbmVkKGNwdV90b19sZTMyKDApLCAoX19sZTMyICopYnVmKTsKIAkJYnJlYWs7CiAJY2FzZSBHZXRQb3J0U3RhdHVzOgogCQllcnIgPSBvel9nZXRfcG9ydF9zdGF0dXMoaGNkLCB3aW5kZXgsIGJ1Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cGQuYyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwZC5jCmluZGV4IDc0MzY5NTAuLjEwZjFiM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwZC5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSAib3pkYmcuaCIKICNpbmNsdWRlICJvenByb3RvY29sLmgiCkBAIC0xNzMsNyArMTc0LDcgQEAKIAkJcGQtPmxhc3RfcnhfcGt0X251bSA9IDB4ZmZmZmZmZmY7CiAJCW96X3BkX3NldF9zdGF0ZShwZCwgT1pfUERfU19JRExFKTsKIAkJcGQtPm1heF90eF9zaXplID0gT1pfTUFYX1RYX1NJWkU7Ci0JCW1lbWNweShwZC0+bWFjX2FkZHIsIG1hY19hZGRyLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weShwZC0+bWFjX2FkZHIsIG1hY19hZGRyKTsKIAkJaWYgKDAgIT0gb3pfZWx0X2J1Zl9pbml0KCZwZC0+ZWx0X2J1ZmYpKSB7CiAJCQlrZnJlZShwZCk7CiAJCQlwZCA9IE5VTEw7CkBAIC0yODQsMTEgKzI4NSwxMSBAQAogCQkJCQkgIGFpLT5hcHBfaWQpOwogCQkJCWJyZWFrOwogCQkJfQotCQkJb3pfcG9sbGluZ19sb2NrX2JoKCk7CisJCQlzcGluX2xvY2tfYmgoJmdfcG9sbGluZ19sb2NrKTsKIAkJCXBkLT50b3RhbF9hcHBzIHw9ICgxPDxhaS0+YXBwX2lkKTsKIAkJCWlmIChyZXN1bWUpCiAJCQkJcGQtPnBhdXNlZF9hcHBzICY9IH4oMTw8YWktPmFwcF9pZCk7Ci0JCQlvel9wb2xsaW5nX3VubG9ja19iaCgpOworCQkJc3Bpbl91bmxvY2tfYmgoJmdfcG9sbGluZ19sb2NrKTsKIAkJfQogCX0KIAlyZXR1cm4gcmM7CkBAIC0zMDQsMTQgKzMwNSwxNCBAQAogCW96X3BkX2RiZyhwZCwgT04sICIlczogKDB4JXgpIHBhdXNlKCVkKVxuIiwgX19mdW5jX18sIGFwcHMsIHBhdXNlKTsKIAlmb3IgKGFpID0gZ19hcHBfaWY7IGFpIDwgJmdfYXBwX2lmW09aX0FQUElEX01BWF07IGFpKyspIHsKIAkJaWYgKGFwcHMgJiAoMTw8YWktPmFwcF9pZCkpIHsKLQkJCW96X3BvbGxpbmdfbG9ja19iaCgpOworCQkJc3Bpbl9sb2NrX2JoKCZnX3BvbGxpbmdfbG9jayk7CiAJCQlpZiAocGF1c2UpIHsKIAkJCQlwZC0+cGF1c2VkX2FwcHMgfD0gKDE8PGFpLT5hcHBfaWQpOwogCQkJfSBlbHNlIHsKIAkJCQlwZC0+dG90YWxfYXBwcyAmPSB+KDE8PGFpLT5hcHBfaWQpOwogCQkJCXBkLT5wYXVzZWRfYXBwcyAmPSB+KDE8PGFpLT5hcHBfaWQpOwogCQkJfQotCQkJb3pfcG9sbGluZ191bmxvY2tfYmgoKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZnX3BvbGxpbmdfbG9jayk7CiAJCQlhaS0+c3RvcChwZCwgcGF1c2UpOwogCQl9CiAJfQpAQCAtMzQ5LDE3ICszNTAsMTcgQEAKIAogCW96X2RiZyhPTiwgIm96X3BkX3N0b3AoKSBTdGF0ZSA9IDB4JXhcbiIsIHBkLT5zdGF0ZSk7CiAJb3pfcGRfaW5kaWNhdGVfZmFyZXdlbGxzKHBkKTsKLQlvel9wb2xsaW5nX2xvY2tfYmgoKTsKKwlzcGluX2xvY2tfYmgoJmdfcG9sbGluZ19sb2NrKTsKIAlzdG9wX2FwcHMgPSBwZC0+dG90YWxfYXBwczsKIAlwZC0+dG90YWxfYXBwcyA9IDA7CiAJcGQtPnBhdXNlZF9hcHBzID0gMDsKLQlvel9wb2xsaW5nX3VubG9ja19iaCgpOworCXNwaW5fdW5sb2NrX2JoKCZnX3BvbGxpbmdfbG9jayk7CiAJb3pfc2VydmljZXNfc3RvcChwZCwgc3RvcF9hcHBzLCAwKTsKLQlvel9wb2xsaW5nX2xvY2tfYmgoKTsKKwlzcGluX2xvY2tfYmgoJmdfcG9sbGluZ19sb2NrKTsKIAlvel9wZF9zZXRfc3RhdGUocGQsIE9aX1BEX1NfU1RPUFBFRCk7CiAJLyogUmVtb3ZlIGZyb20gUEQgbGlzdC4qLwogCWxpc3RfZGVsKCZwZC0+bGluayk7Ci0Jb3pfcG9sbGluZ191bmxvY2tfYmgoKTsKKwlzcGluX3VubG9ja19iaCgmZ19wb2xsaW5nX2xvY2spOwogCW96X2RiZyhPTiwgInBkIHJlZiBjb3VudCA9ICVkXG4iLCBhdG9taWNfcmVhZCgmcGQtPnJlZl9jb3VudCkpOwogCW96X3BkX3B1dChwZCk7CiB9CkBAIC0zNzIsOSArMzczLDkgQEAKIAlpbnQgZG9fc3RvcCA9IDA7CiAJdTE2IHN0b3BfYXBwczsKIAotCW96X3BvbGxpbmdfbG9ja19iaCgpOworCXNwaW5fbG9ja19iaCgmZ19wb2xsaW5nX2xvY2spOwogCWlmIChwZC0+c3RhdGUgJiAoT1pfUERfU19TTEVFUCB8IE9aX1BEX1NfU1RPUFBFRCkpIHsKLQkJb3pfcG9sbGluZ191bmxvY2tfYmgoKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmdfcG9sbGluZ19sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmIChwZC0+a2VlcF9hbGl2ZSAmJiBwZC0+c2Vzc2lvbl9pZCkKQEAgLTM4Myw3ICszODQsNyBAQAogCQlkb19zdG9wID0gMTsKIAogCXN0b3BfYXBwcyA9IHBkLT50b3RhbF9hcHBzOwotCW96X3BvbGxpbmdfdW5sb2NrX2JoKCk7CisJc3Bpbl91bmxvY2tfYmgoJmdfcG9sbGluZ19sb2NrKTsKIAlpZiAoZG9fc3RvcCkgewogCQlvel9wZF9zdG9wKHBkKTsKIAl9IGVsc2UgewpAQCAtOTk5LDE1ICsxMDAwLDE1IEBACiAJY29uc3Qgc3RydWN0IG96X2FwcF9pZiAqYWkgPSAmZ19hcHBfaWZbT1pfQVBQSURfVVNCLTFdOwogCiAJd2hpbGUgKDEpIHsKLQkJb3pfcG9sbGluZ19sb2NrX2JoKCk7CisJCXNwaW5fbG9ja19iaCgmZ19wb2xsaW5nX2xvY2spOwogCQlpZiAobGlzdF9lbXB0eSgmcGQtPmZhcmV3ZWxsX2xpc3QpKSB7Ci0JCQlvel9wb2xsaW5nX3VubG9ja19iaCgpOworCQkJc3Bpbl91bmxvY2tfYmgoJmdfcG9sbGluZ19sb2NrKTsKIAkJCWJyZWFrOwogCQl9CiAJCWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwZC0+ZmFyZXdlbGxfbGlzdCwKIAkJCQlzdHJ1Y3Qgb3pfZmFyZXdlbGwsIGxpbmspOwogCQlsaXN0X2RlbCgmZi0+bGluayk7Ci0JCW96X3BvbGxpbmdfdW5sb2NrX2JoKCk7CisJCXNwaW5fdW5sb2NrX2JoKCZnX3BvbGxpbmdfbG9jayk7CiAJCWlmIChhaS0+ZmFyZXdlbGwpCiAJCQlhaS0+ZmFyZXdlbGwocGQsIGYtPmVwX251bSwgZi0+cmVwb3J0LCBmLT5sZW4pOwogCQlrZnJlZShmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwZC5oIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venBkLmgKaW5kZXggMTJjNzEyOS4uYWQ1ZmU3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venBkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venBkLmgKQEAgLTIyLDYgKzIyLDExIEBACiAjZGVmaW5lIE9aX1RJTUVSX0hFQVJUQkVBVAkyCiAjZGVmaW5lIE9aX1RJTUVSX1NUT1AJCTMKIAorLyoKKyAqRXh0ZXJuYWwgc3BpbmxvY2sgdmFyaWFibGUKKyAqLworZXh0ZXJuIHNwaW5sb2NrX3QgZ19wb2xsaW5nX2xvY2s7CisKIC8qIERhdGEgc3RydWN0dXJlIHRoYXQgaG9sZCBpbmZvcm1hdGlvbiBvbiBhIGZyYW1lIGZvciB0cmFuc21pc3Nvbi4gVGhpcyBpcwogICogYnVpbHQgd2hlbiB0aGUgZnJhbWUgaXMgZmlyc3QgdHJhbnNtaXR0ZWQgYW5kIGlzIHVzZWQgdG8gcmVidWlsZCB0aGUgZnJhbWUKICAqIGlmIGEgcmUtdHJhbnNtaXNzaW9uIGlzIHJlcXVpcmVkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venByb3RvLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cHJvdG8uYwppbmRleCA1ZDk2NWNmLi5mMDlhY2QwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cHJvdG8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cHJvdG8uYwpAQCAtMzgsOSArMzgsMTMgQEAKIH07CiAKIC8qCisgKiBFeHRlcm5hbCB2YXJpYWJsZQorICovCisKK0RFRklORV9TUElOTE9DSyhnX3BvbGxpbmdfbG9jayk7CisvKgogICogU3RhdGljIGV4dGVybmFsIHZhcmlhYmxlcy4KICAqLwotc3RhdGljIERFRklORV9TUElOTE9DSyhnX3BvbGxpbmdfbG9jayk7CiBzdGF0aWMgTElTVF9IRUFEKGdfcGRfbGlzdCk7CiBzdGF0aWMgTElTVF9IRUFEKGdfYmluZGluZyk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGdfYmluZGluZ19sb2NrKTsKQEAgLTY2NCwzMiArNjY4LDI2IEBACiB7CiAJc3RydWN0IG96X2JpbmRpbmcgKmJpbmRpbmc7CiAKLQliaW5kaW5nID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG96X2JpbmRpbmcpLCBHRlBfS0VSTkVMKTsKLQlpZiAoYmluZGluZykgewotCQliaW5kaW5nLT5wdHlwZS50eXBlID0gX19jb25zdGFudF9odG9ucyhPWl9FVEhFUlRZUEUpOwotCQliaW5kaW5nLT5wdHlwZS5mdW5jID0gb3pfcGt0X3JlY3Y7Ci0JCWlmIChuZXRfZGV2ICYmICpuZXRfZGV2KSB7Ci0JCQltZW1jcHkoYmluZGluZy0+bmFtZSwgbmV0X2RldiwgT1pfTUFYX0JJTkRJTkdfTEVOKTsKLQkJCW96X2RiZyhPTiwgIkFkZGluZyBiaW5kaW5nOiAlc1xuIiwgbmV0X2Rldik7Ci0JCQliaW5kaW5nLT5wdHlwZS5kZXYgPQotCQkJCWRldl9nZXRfYnlfbmFtZSgmaW5pdF9uZXQsIG5ldF9kZXYpOwotCQkJaWYgKGJpbmRpbmctPnB0eXBlLmRldiA9PSBOVUxMKSB7Ci0JCQkJb3pfZGJnKE9OLCAiTmV0ZGV2ICVzIG5vdCBmb3VuZFxuIiwgbmV0X2Rldik7Ci0JCQkJa2ZyZWUoYmluZGluZyk7Ci0JCQkJYmluZGluZyA9IE5VTEw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlvel9kYmcoT04sICJCaW5kaW5nIHRvIGFsbCBuZXRjYXJkc1xuIik7Ci0JCQltZW1zZXQoYmluZGluZy0+bmFtZSwgMCwgT1pfTUFYX0JJTkRJTkdfTEVOKTsKLQkJCWJpbmRpbmctPnB0eXBlLmRldiA9IE5VTEw7Ci0JCX0KLQkJaWYgKGJpbmRpbmcpIHsKLQkJCWRldl9hZGRfcGFjaygmYmluZGluZy0+cHR5cGUpOwotCQkJc3Bpbl9sb2NrX2JoKCZnX2JpbmRpbmdfbG9jayk7Ci0JCQlsaXN0X2FkZF90YWlsKCZiaW5kaW5nLT5saW5rLCAmZ19iaW5kaW5nKTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZnX2JpbmRpbmdfbG9jayk7CisJYmluZGluZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvel9iaW5kaW5nKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFiaW5kaW5nKQorCQlyZXR1cm47CisKKwliaW5kaW5nLT5wdHlwZS50eXBlID0gaHRvbnMoT1pfRVRIRVJUWVBFKTsKKwliaW5kaW5nLT5wdHlwZS5mdW5jID0gb3pfcGt0X3JlY3Y7CisJaWYgKG5ldF9kZXYgJiYgKm5ldF9kZXYpIHsKKwkJbWVtY3B5KGJpbmRpbmctPm5hbWUsIG5ldF9kZXYsIE9aX01BWF9CSU5ESU5HX0xFTik7CisJCW96X2RiZyhPTiwgIkFkZGluZyBiaW5kaW5nOiAlc1xuIiwgbmV0X2Rldik7CisJCWJpbmRpbmctPnB0eXBlLmRldiA9IGRldl9nZXRfYnlfbmFtZSgmaW5pdF9uZXQsIG5ldF9kZXYpOworCQlpZiAoYmluZGluZy0+cHR5cGUuZGV2ID09IE5VTEwpIHsKKwkJCW96X2RiZyhPTiwgIk5ldGRldiAlcyBub3QgZm91bmRcbiIsIG5ldF9kZXYpOworCQkJa2ZyZWUoYmluZGluZyk7CisJCQlyZXR1cm47CiAJCX0KIAl9CisJZGV2X2FkZF9wYWNrKCZiaW5kaW5nLT5wdHlwZSk7CisJc3Bpbl9sb2NrX2JoKCZnX2JpbmRpbmdfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmYmluZGluZy0+bGluaywgJmdfYmluZGluZyk7CisJc3Bpbl91bmxvY2tfYmgoJmdfYmluZGluZ19sb2NrKTsKIH0KIAogLyoKQEAgLTgwMCwxMiArNzk4LDMgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXZvaWQgb3pfcG9sbGluZ19sb2NrX2JoKHZvaWQpCi17Ci0Jc3Bpbl9sb2NrX2JoKCZnX3BvbGxpbmdfbG9jayk7Ci19Ci0KLXZvaWQgb3pfcG9sbGluZ191bmxvY2tfYmgodm9pZCkKLXsKLQlzcGluX3VubG9ja19iaCgmZ19wb2xsaW5nX2xvY2spOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venByb3RvLmggYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cHJvdG8uaAppbmRleCAwYzQ5YzhhLi5jYjM4ZTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cHJvdG8uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cHJvdG8uaApAQCAtNTksOCArNTksNiBAQAogdm9pZCBvel90aW1lcl9hZGQoc3RydWN0IG96X3BkICpwZCwgaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgZHVlX3RpbWUpOwogdm9pZCBvel90aW1lcl9kZWxldGUoc3RydWN0IG96X3BkICpwZCwgaW50IHR5cGUpOwogdm9pZCBvel9wZF9yZXF1ZXN0X2hlYXJ0YmVhdChzdHJ1Y3Qgb3pfcGQgKnBkKTsKLXZvaWQgb3pfcG9sbGluZ19sb2NrX2JoKHZvaWQpOwotdm9pZCBvel9wb2xsaW5nX3VubG9ja19iaCh2b2lkKTsKIHZvaWQgb3pfcGRfaGVhcnRiZWF0X2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKIHZvaWQgb3pfcGRfdGltZW91dF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiBlbnVtIGhydGltZXJfcmVzdGFydCBvel9wZF9oZWFydGJlYXRfZXZlbnQoc3RydWN0IGhydGltZXIgKnRpbWVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwcm90b2NvbC5oIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venByb3RvY29sLmgKaW5kZXggMTdiMDliOS4uOWJiYjE4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venByb3RvY29sLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venByb3RvY29sLmgKQEAgLTE5Miw3ICsxOTIsNyBAQAogCXUxNglzaXplOwogCXU4CXJlcV90eXBlOwogCXU4CWRlc2NfdHlwZTsKLQl1MTYJd19pbmRleDsKKwlfX2xlMTYJd19pbmRleDsKIAl1OAlpbmRleDsKIH0gUEFDS0VEOwogCkBAIC0yMTksOCArMjE5LDggQEAKIAl1OAllbHRfc2VxX251bTsKIAl1OAl0eXBlOwogCXU4CXJlcV9pZDsKLQl1MTYJb2Zmc2V0OwotCXUxNgl0b3RhbF9zaXplOworCV9fbGUxNglvZmZzZXQ7CisJX19sZTE2CXRvdGFsX3NpemU7CiAJdTgJcmNvZGU7CiAJdTgJZGF0YVsxXTsKIH0gUEFDS0VEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venVzYmlmLmggYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296dXNiaWYuaAppbmRleCA4NTMxNDM4Li40MjQ5ZmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296dXNiaWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296dXNiaWYuaApAQCAtMjMsNyArMjMsNyBAQAogaW50IG96X3VzYl9jb250cm9sX3JlcSh2b2lkICpocGQsIHU4IHJlcV9pZCwgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqc2V0dXAsCiAJCWNvbnN0IHU4ICpkYXRhLCBpbnQgZGF0YV9sZW4pOwogaW50IG96X3VzYl9nZXRfZGVzY19yZXEodm9pZCAqaHBkLCB1OCByZXFfaWQsIHU4IHJlcV90eXBlLCB1OCBkZXNjX3R5cGUsCi0JdTggaW5kZXgsIHUxNiB3aW5kZXgsIGludCBvZmZzZXQsIGludCBsZW4pOworCXU4IGluZGV4LCBfX2xlMTYgd2luZGV4LCBpbnQgb2Zmc2V0LCBpbnQgbGVuKTsKIGludCBvel91c2Jfc2VuZF9pc29jKHZvaWQgKmhwZCwgdTggZXBfbnVtLCBzdHJ1Y3QgdXJiICp1cmIpOwogdm9pZCBvel91c2JfcmVxdWVzdF9oZWFydGJlYXQodm9pZCAqaHBkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venVzYnN2YzEuYyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3p1c2JzdmMxLmMKaW5kZXggNjE3ZjUxYy4uZjMyZDAxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venVzYnN2YzEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296dXNic3ZjMS5jCkBAIC01NCw3ICs1NCw3IEBACiAgKiBDb250ZXh0OiBzb2Z0aXJxCiAgKi8KIGludCBvel91c2JfZ2V0X2Rlc2NfcmVxKHZvaWQgKmhwZCwgdTggcmVxX2lkLCB1OCByZXFfdHlwZSwgdTggZGVzY190eXBlLAotCXU4IGluZGV4LCB1MTYgd2luZGV4LCBpbnQgb2Zmc2V0LCBpbnQgbGVuKQorCXU4IGluZGV4LCBfX2xlMTYgd2luZGV4LCBpbnQgb2Zmc2V0LCBpbnQgbGVuKQogewogCXN0cnVjdCBvel91c2JfY3R4ICp1c2JfY3R4ID0gKHN0cnVjdCBvel91c2JfY3R4ICopaHBkOwogCXN0cnVjdCBvel9wZCAqcGQgPSB1c2JfY3R4LT5wZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9wYW5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL3BhbmVsLmMKaW5kZXggZWM0YjFmZC4uMDhmOWE0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3BhbmVsL3BhbmVsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL3BhbmVsLmMKQEAgLTE3MSw4ICsxNzEsOCBAQAogCiAJdW5pb24gewogCQlzdHJ1Y3QgewkvKiB2YWxpZCB3aGVuIHR5cGUgPT0gSU5QVVRfVFlQRV9TVEQgKi8KLQkJCXZvaWQgKCpwcmVzc19mY3QpIChpbnQpOwotCQkJdm9pZCAoKnJlbGVhc2VfZmN0KSAoaW50KTsKKwkJCXZvaWQgKCpwcmVzc19mY3QpKGludCk7CisJCQl2b2lkICgqcmVsZWFzZV9mY3QpKGludCk7CiAJCQlpbnQgcHJlc3NfZGF0YTsKIAkJCWludCByZWxlYXNlX2RhdGE7CiAJCX0gc3RkOwpAQCAtNDE3LDkgKzQxNyw5IEBACiBzdGF0aWMgY2hhciBsY2RfbGVmdF9zaGlmdDsKIHN0YXRpYyBjaGFyIGluaXRfaW5fcHJvZ3Jlc3M7CiAKLXN0YXRpYyB2b2lkICgqbGNkX3dyaXRlX2NtZCkgKGludCk7Ci1zdGF0aWMgdm9pZCAoKmxjZF93cml0ZV9kYXRhKSAoaW50KTsKLXN0YXRpYyB2b2lkICgqbGNkX2NsZWFyX2Zhc3QpICh2b2lkKTsKK3N0YXRpYyB2b2lkICgqbGNkX3dyaXRlX2NtZCkoaW50KTsKK3N0YXRpYyB2b2lkICgqbGNkX3dyaXRlX2RhdGEpKGludCk7CitzdGF0aWMgdm9pZCAoKmxjZF9jbGVhcl9mYXN0KSh2b2lkKTsKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhwcHJ0X2xvY2spOwogc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHNjYW5fdGltZXI7CkBAIC00NTcsMTQgKzQ1NywxMiBAQAogc3RhdGljIGludCBsY2RfdHlwZSA9IC0xOwogbW9kdWxlX3BhcmFtKGxjZF90eXBlLCBpbnQsIDAwMDApOwogTU9EVUxFX1BBUk1fREVTQyhsY2RfdHlwZSwKLQkJICJMQ0QgdHlwZTogMD1ub25lLCAxPW9sZCAvLywgMj1zZXJpYWwga3MwMDc0LCAiCi0JCSAiMz1oYW50cm9uaXggLy8sIDQ9bmV4Y29tIC8vLCA1PWNvbXBpbGVkLWluIik7CisJCSAiTENEIHR5cGU6IDA9bm9uZSwgMT1vbGQgLy8sIDI9c2VyaWFsIGtzMDA3NCwgMz1oYW50cm9uaXggLy8sIDQ9bmV4Y29tIC8vLCA1PWNvbXBpbGVkLWluIik7CiAKIHN0YXRpYyBpbnQgbGNkX3Byb3RvID0gLTE7CiBtb2R1bGVfcGFyYW0obGNkX3Byb3RvLCBpbnQsIDAwMDApOwogTU9EVUxFX1BBUk1fREVTQyhsY2RfcHJvdG8sCi0JCSJMQ0QgY29tbXVuaWNhdGlvbjogMD1wYXJhbGxlbCAoLy8pLCAxPXNlcmlhbCwiCi0JCSIyPVRJIExDRCBJbnRlcmZhY2UiKTsKKwkJIkxDRCBjb21tdW5pY2F0aW9uOiAwPXBhcmFsbGVsICgvLyksIDE9c2VyaWFsLCAyPVRJIExDRCBJbnRlcmZhY2UiKTsKIAogc3RhdGljIGludCBsY2RfY2hhcnNldCA9IC0xOwogbW9kdWxlX3BhcmFtKGxjZF9jaGFyc2V0LCBpbnQsIDAwMDApOwpAQCAtNDczLDggKzQ3MSw3IEBACiBzdGF0aWMgaW50IGtleXBhZF90eXBlID0gLTE7CiBtb2R1bGVfcGFyYW0oa2V5cGFkX3R5cGUsIGludCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGtleXBhZF90eXBlLAotCQkgIktleXBhZCB0eXBlOiAwPW5vbmUsIDE9b2xkIDYga2V5cywgMj1uZXcgNisxIGtleXMsICIKLQkJICIzPW5leGNvbSA0IGtleXMiKTsKKwkJICJLZXlwYWQgdHlwZTogMD1ub25lLCAxPW9sZCA2IGtleXMsIDI9bmV3IDYrMSBrZXlzLCAzPW5leGNvbSA0IGtleXMiKTsKIAogc3RhdGljIGludCBwcm9maWxlID0gREVGQVVMVF9QUk9GSUxFOwogbW9kdWxlX3BhcmFtKHByb2ZpbGUsIGludCwgMDAwMCk7CkBAIC00OTQsMzggKzQ5MSwzMiBAQAogc3RhdGljIGludCBsY2RfZV9waW4gID0gUElOX05PVF9TRVQ7CiBtb2R1bGVfcGFyYW0obGNkX2VfcGluLCBpbnQsIDAwMDApOwogTU9EVUxFX1BBUk1fREVTQyhsY2RfZV9waW4sCi0JCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIExDRCAnRScgc2lnbmFsLCAiCi0JCSAid2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKKwkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gTENEICdFJyBzaWduYWwsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CiAKIHN0YXRpYyBpbnQgbGNkX3JzX3BpbiA9IFBJTl9OT1RfU0VUOwogbW9kdWxlX3BhcmFtKGxjZF9yc19waW4sIGludCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxjZF9yc19waW4sCi0JCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIExDRCAnUlMnIHNpZ25hbCwgIgotCQkgIndpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CisJCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIExDRCAnUlMnIHNpZ25hbCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKIAogc3RhdGljIGludCBsY2RfcndfcGluID0gUElOX05PVF9TRVQ7CiBtb2R1bGVfcGFyYW0obGNkX3J3X3BpbiwgaW50LCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobGNkX3J3X3BpbiwKLQkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gTENEICdSVycgc2lnbmFsLCAiCi0JCSAid2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKKwkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gTENEICdSVycgc2lnbmFsLCB3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOwogCiBzdGF0aWMgaW50IGxjZF9ibF9waW4gPSBQSU5fTk9UX1NFVDsKIG1vZHVsZV9wYXJhbShsY2RfYmxfcGluLCBpbnQsIDAwMDApOwogTU9EVUxFX1BBUk1fREVTQyhsY2RfYmxfcGluLAotCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBMQ0QgYmFja2xpZ2h0LCAiCi0JCSAid2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKKwkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gTENEIGJhY2tsaWdodCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKIAogc3RhdGljIGludCBsY2RfZGFfcGluID0gUElOX05PVF9TRVQ7CiBtb2R1bGVfcGFyYW0obGNkX2RhX3BpbiwgaW50LCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobGNkX2RhX3BpbiwKLQkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gc2VyaWFsIExDRCAnU0RBJyAiCi0JCSAic2lnbmFsLCB3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOworCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBzZXJpYWwgTENEICdTREEnIHNpZ25hbCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKIAogc3RhdGljIGludCBsY2RfY2xfcGluID0gUElOX05PVF9TRVQ7CiBtb2R1bGVfcGFyYW0obGNkX2NsX3BpbiwgaW50LCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobGNkX2NsX3BpbiwKLQkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gc2VyaWFsIExDRCAnU0NMJyAiCi0JCSAic2lnbmFsLCB3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOworCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBzZXJpYWwgTENEICdTQ0wnIHNpZ25hbCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxjZF9jaGFyX2NvbnY7CiAKQEAgLTIwMTcsOSArMjAwOCw5IEBACiAgKiBiZSBib3VuZC4KICAqLwogc3RhdGljIHN0cnVjdCBsb2dpY2FsX2lucHV0ICpwYW5lbF9iaW5kX2NhbGxiYWNrKGNoYXIgKm5hbWUsCi0JCQkJCQkgdm9pZCAoKnByZXNzX2ZjdCkgKGludCksCisJCQkJCQkgdm9pZCAoKnByZXNzX2ZjdCkoaW50KSwKIAkJCQkJCSBpbnQgcHJlc3NfZGF0YSwKLQkJCQkJCSB2b2lkICgqcmVsZWFzZV9mY3QpIChpbnQpLAorCQkJCQkJIHZvaWQgKCpyZWxlYXNlX2ZjdCkoaW50KSwKIAkJCQkJCSBpbnQgcmVsZWFzZV9kYXRhKQogewogCXN0cnVjdCBsb2dpY2FsX2lucHV0ICpjYWxsYmFjazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvTW9kdWxlLnN5bXZlcnMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL01vZHVsZS5zeW12ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL01vZHVsZS5zeW12ZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9kb3QxMWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2RvdDExZC5oCmluZGV4IDYzZjRmM2MuLmY5OTY2OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2RvdDExZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2RvdDExZC5oCkBAIC0xMSwxMyArMTEsMTMgQEAKIAl1OCBGaXJzdENobmw7CiAJdTggIE51bUNobmxzOwogCXU4ICBNYXhUeFBvd2VySW5EYm07Ci19Q0hOTF9UWFBPV0VSX1RSSVBMRSwgKlBDSE5MX1RYUE9XRVJfVFJJUExFOworfSBDSE5MX1RYUE9XRVJfVFJJUExFLCAqUENITkxfVFhQT1dFUl9UUklQTEU7CiAKIHR5cGVkZWYgZW51bSBfRE9UMTFEX1NUQVRFIHsKIAlET1QxMURfU1RBVEVfTk9ORSA9IDAsCiAJRE9UMTFEX1NUQVRFX0xFQVJORUQsCiAJRE9UMTFEX1NUQVRFX0RPTkUsCi19RE9UMTFEX1NUQVRFOworfSBET1QxMURfU1RBVEU7CiAKIHR5cGVkZWYgc3RydWN0IF9SVF9ET1QxMURfSU5GTyB7CiAJLyogREVDTEFSRV9SVF9PQkpFQ1QoUlRfRE9UMTJEX0lORk8pOyAqLwpAQCAtMzUsOSArMzUsMTAgQEAKIAl1OCAgTWF4VHhQd3JEYm1MaXN0W01BWF9DSEFOTkVMX05VTUJFUisxXTsKIAogCURPVDExRF9TVEFURSBTdGF0ZTsKLX1SVF9ET1QxMURfSU5GTywgKlBSVF9ET1QxMURfSU5GTzsKLSNkZWZpbmUgZXFNYWNBZGRyKGEsYikJCSggKChhKVswXT09KGIpWzBdICYmIChhKVsxXT09KGIpWzFdICYmIChhKVsyXT09KGIpWzJdICYmIChhKVszXT09KGIpWzNdICYmIChhKVs0XT09KGIpWzRdICYmIChhKVs1XT09KGIpWzVdKSA/IDE6MCApCi0jZGVmaW5lIGNwTWFjQWRkcihkZXMsc3JjKQkgICAgICAoKGRlcylbMF09KHNyYylbMF0sKGRlcylbMV09KHNyYylbMV0sKGRlcylbMl09KHNyYylbMl0sKGRlcylbM109KHNyYylbM10sKGRlcylbNF09KHNyYylbNF0sKGRlcylbNV09KHNyYylbNV0pCit9IFJUX0RPVDExRF9JTkZPLCAqUFJUX0RPVDExRF9JTkZPOworCisjZGVmaW5lIGVxTWFjQWRkcihhLCBiKSAoKChhKVswXSA9PSAoYilbMF0gJiYgKGEpWzFdID09IChiKVsxXSAmJiAoYSlbMl0gPT0gKGIpWzJdICYmIChhKVszXSA9PSAoYilbM10gJiYgKGEpWzRdID09IChiKVs0XSAmJiAoYSlbNV0gPT0gKGIpWzVdKSA/IDE6MCkKKyNkZWZpbmUgY3BNYWNBZGRyKGRlcywgc3JjKSAoKGRlcylbMF0gPSAoc3JjKVswXSwgKGRlcylbMV0gPSAoc3JjKVsxXSwgKGRlcylbMl0gPSAoc3JjKVsyXSwgKGRlcylbM10gPSAoc3JjKVszXSwgKGRlcylbNF0gPSAoc3JjKVs0XSwgKGRlcylbNV0gPSAoc3JjKVs1XSkKICNkZWZpbmUgR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpICgoUFJUX0RPVDExRF9JTkZPKSgoX19wSWVlZURldiktPnBEb3QxMWRJbmZvKSkKIAogI2RlZmluZSBJU19ET1QxMURfRU5BQkxFKF9fcEllZWVEZXYpIEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+YkVuYWJsZWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExLmgKaW5kZXggMDlmZmQ5Yi4uZDE3NjNiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExLmgKQEAgLTQ3Myw3ICs0NzMsNyBAQAogfTsKIAogc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSB7Ci0JdTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZnJhbWVfY3RsOwogCXUxNiBkdXJhdGlvbl9pZDsKIAl1OCBhZGRyMVs2XTsKIAl1OCBhZGRyMls2XTsKQEAgLTQ4Miw3ICs0ODIsNyBAQAogfTsKIAogc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgewotCXUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGZyYW1lX2N0bDsKIAl1MTYgZHVyYXRpb25faWQ7CiAJdTggYWRkcjFbRVRIX0FMRU5dOwogCXU4IGFkZHIyW0VUSF9BTEVOXTsKQEAgLTcwOSwxMCArNzA5LDEwIEBACiAKICNkZWZpbmUgTUFYX0lFX0xFTgkJCQkJCTB4RkYgLy8rWUosMDgwNjI1CiAKLXR5cGVkZWYgc3RydWN0IF9DSEFOTkVMX0xJU1R7Ci0JdTgJQ2hhbm5lbFtNQVhfQ0hBTk5FTF9OVU1CRVIgKyAxXTsKLQl1OAlMZW47Ci19Q0hBTk5FTF9MSVNULCAqUENIQU5ORUxfTElTVDsKK3N0cnVjdCBydGw4MTg3c2VfY2hhbm5lbF9saXN0IHsKKwl1OAljaGFubmVsW01BWF9DSEFOTkVMX05VTUJFUiArIDFdOworCXU4CWxlbjsKK307CiAKIC8vYnkgYW15IGZvciBwcwogI2RlZmluZSBJRUVFODAyMTFfV0FUQ0hfRE9HX1RJTUUgICAgMjAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMKaW5kZXggYzgwMTNkMy4uNGZlMjUzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jCkBAIC01OCw3ICs1OCw3IEBACiAJdTggcnhfYjBbQUVTX0JMT0NLX0xFTl0sIHJ4X2JbQUVTX0JMT0NLX0xFTl0sIHJ4X2FbQUVTX0JMT0NLX0xFTl07CiB9OwogCi12b2lkIGllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAogCQkJCWNvbnN0IHU4IHB0WzE2XSwgdTggY3RbMTZdKQogewogCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUoKHZvaWQgKil0Zm0sIGN0LCBwdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYwppbmRleCBjNTkwNzk2Li42YzFhY2M1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMKQEAgLTE4Nyw4ICsxODcsNyBAQAogfQogCiAKLXN0YXRpYyBjb25zdCB1MTYgU2JveFsyNTZdID0KLXsKK3N0YXRpYyBjb25zdCB1MTYgU2JveFsyNTZdID0gewogCTB4QzZBNSwgMHhGODg0LCAweEVFOTksIDB4RjY4RCwgMHhGRjBELCAweEQ2QkQsIDB4REVCMSwgMHg5MTU0LAogCTB4NjA1MCwgMHgwMjAzLCAweENFQTksIDB4NTY3RCwgMHhFNzE5LCAweEI1NjIsIDB4NERFNiwgMHhFQzlBLAogCTB4OEY0NSwgMHgxRjlELCAweDg5NDAsIDB4RkE4NywgMHhFRjE1LCAweEIyRUIsIDB4OEVDOSwgMHhGQjBCLApAQCAtMzA3LDcgKzMwNiw3IEBACiAJaW50IGxlbjsKIAl1OCAgKnBvczsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyOwotCXU4IHJjNGtleVsxNl0sKmljdjsKKwl1OCByYzRrZXlbMTZdLCAqaWN2OwogCXUzMiBjcmM7CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwogCWludCByZXQ7CkBAIC0zNDgsNyArMzQ3LDcgQEAKIAlpY3ZbM10gPSBjcmMgPj4gMjQ7CiAJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkodGtleS0+dHhfdGZtX2FyYzQsIHJjNGtleSwgMTYpOwogCXNnX2luaXRfb25lKCZzZywgcG9zLCBsZW4gKyA0KTsKLQlyZXQ9IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgJnNnLCAmc2csIGxlbiArIDQpOworCXJldCA9IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgJnNnLCAmc2csIGxlbiArIDQpOwogCiAJdGtleS0+dHhfaXYxNisrOwogCWlmICh0a2V5LT50eF9pdjE2ID09IDApIHsKQEAgLTUzNyw5ICs1MzYsOSBAQAogCiAJbWljaGFlbF9taWNfaGRyKHNrYiwgdGtleS0+dHhfaGRyKTsKIAotCWlmKElFRUU4MDIxMV9RT1NfSEFTX1NFUShsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpKSB7CisJaWYgKElFRUU4MDIxMV9RT1NfSEFTX1NFUShsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpKQogCQl0a2V5LT50eF9oZHJbMTJdID0gKihza2ItPmRhdGEgKyBoZHJfbGVuIC0gMikgJiAweDA3OwotCX0KKwogCXBvcyA9IHNrYl9wdXQoc2tiLCA4KTsKIAogCWlmIChtaWNoYWVsX21pYyh0a2V5LT50eF90Zm1fbWljaGFlbCwgJnRrZXktPmtleVsxNl0sIHRrZXktPnR4X2hkciwKQEAgLTU4Myw5ICs1ODIsOCBAQAogCQlyZXR1cm4gLTE7CiAKIAltaWNoYWVsX21pY19oZHIoc2tiLCB0a2V5LT5yeF9oZHIpOwotCWlmKElFRUU4MDIxMV9RT1NfSEFTX1NFUShsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpKSB7CisJaWYgKElFRUU4MDIxMV9RT1NfSEFTX1NFUShsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpKQogCQl0a2V5LT5yeF9oZHJbMTJdID0gKihza2ItPmRhdGEgKyBoZHJfbGVuIC0gMikgJiAweDA3OwotCX0KIAogCWlmIChtaWNoYWVsX21pYyh0a2V5LT5yeF90Zm1fbWljaGFlbCwgJnRrZXktPmtleVsyNF0sIHRrZXktPnJ4X2hkciwKIAkJCXNrYi0+ZGF0YSArIGhkcl9sZW4sIHNrYi0+bGVuIC0gOCAtIGhkcl9sZW4sIG1pYykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMKaW5kZXggZjExNGY5YS4uZjI1MzY3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwpAQCAtMTEsNyArMTEsNiBAQAogCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKLS8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KQEAgLTI4LDggKzI3LDYgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiSG9zdCBBUCBjcnlwdDogV0VQIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLQotCiBzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhIHsKIAl1MzIgaXY7CiAjZGVmaW5lIFdFUF9LRVlfTEVOIDEzCkBAIC00MCw3ICszNyw2IEBACiAJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnJ4X3RmbTsKIH07CiAKLQogc3RhdGljIHZvaWQgKnByaXNtMl93ZXBfaW5pdChpbnQga2V5aWR4KQogewogCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKnByaXY7CkBAIC03OSw3ICs3NSw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLQogc3RhdGljIHZvaWQgcHJpc20yX3dlcF9kZWluaXQodm9pZCAqcHJpdikKIHsKIAlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICpfcHJpdiA9IHByaXY7CkBAIC05NCw3ICs4OSw2IEBACiAJa2ZyZWUocHJpdik7CiB9CiAKLQogLyogUGVyZm9ybSBXRVAgZW5jcnlwdGlvbiBvbiBnaXZlbiBza2IgdGhhdCBoYXMgYXQgbGVhc3QgNCBieXRlcyBvZiBoZWFkcm9vbQogICogZm9yIElWIGFuZCA0IGJ5dGVzIG9mIHRhaWxyb29tIGZvciBJQ1YuIEJvdGggSVYgYW5kIElDViB3aWxsIGJlIHRyYW5zbWl0dGVkLAogICogc28gdGhlIHBheWxvYWQgbGVuZ3RoIGluY3JlYXNlcyB3aXRoIDggYnl0ZXMuCkBAIC0xNTcsNyArMTUxLDYgQEAKIAlyZXR1cm4gY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0KCZkZXNjLCAmc2csICZzZywgbGVuICsgNCk7CiB9CiAKLQogLyogUGVyZm9ybSBXRVAgZGVjcnlwdGlvbiBvbiBnaXZlbiBidWZmZXIuIEJ1ZmZlciBpbmNsdWRlcyB3aG9sZSBXRVAgcGFydCBvZgogICogdGhlIGZyYW1lOiBJViAoNCBieXRlcyksIGVuY3J5cHRlZCBwYXlsb2FkIChpbmNsdWRpbmcgU05BUCBoZWFkZXIpLAogICogSUNWICg0IGJ5dGVzKS4gbGVuIGluY2x1ZGVzIGJvdGggSVYgYW5kIElDVi4KQEAgLTIxOSw3ICsyMTIsNiBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgcHJpc20yX3dlcF9zZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKIHsKIAlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OwpAQCAtMjMzLDcgKzIyNSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGludCBwcmlzbTJfd2VwX2dldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQogewogCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7CkBAIC0yNDYsNyArMjM3LDYgQEAKIAlyZXR1cm4gd2VwLT5rZXlfbGVuOwogfQogCi0KIHN0YXRpYyBjaGFyICpwcmlzbTJfd2VwX3ByaW50X3N0YXRzKGNoYXIgKnAsIHZvaWQgKnByaXYpCiB7CiAJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKQEAgLTI1NSw3ICsyNDUsNiBAQAogCXJldHVybiBwOwogfQogCi0KIHN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X3dlcCA9IHsKIAkubmFtZQkJCT0gIldFUCIsCiAJLmluaXQJCQk9IHByaXNtMl93ZXBfaW5pdCwKQEAgLTI3MiwyMSArMjYxLDE3IEBACiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIH07CiAKLQogaW50IGllZWU4MDIxMV9jcnlwdG9fd2VwX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF93ZXApOwogfQogCi0KIHZvaWQgaWVlZTgwMjExX2NyeXB0b193ZXBfZXhpdCh2b2lkKQogewogCWllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF93ZXApOwogfQogCi0KIHZvaWQgaWVlZTgwMjExX3dlcF9udWxsKHZvaWQpCiB7Ci0vLwlwcmludGsoIj09PT09PT09PT09PT4lcygpXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKaW5kZXggYzI3MzkyZC4uMDNlYjE2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCkBAIC0xMyw3ICsxMyw2IEBACiAgKiByZWxlYXNlZCB1bmRlciB0aGUgR1BMCiAgKi8KIAotCiAjaW5jbHVkZSAiaWVlZTgwMjExLmgiCiAKICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KQEAgLTI0LDE0ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KIAogI2luY2x1ZGUgImRvdDExZC5oIgotdTggcnNuX2F1dGhlbl9jaXBoZXJfc3VpdGVbMTZdWzRdID0gewotCXsweDAwLCAweDBGLCAweEFDLCAweDAwfSwgLy9Vc2UgZ3JvdXAga2V5LCAvL1Jlc2VydmVkCi0JezB4MDAsIDB4MEYsIDB4QUMsIDB4MDF9LCAvL1dFUC00MCAgICAgICAgIC8vUlNOQSBkZWZhdWx0Ci0JezB4MDAsIDB4MEYsIDB4QUMsIDB4MDJ9LCAvL1RLSVAgICAgICAgICAgIC8vTk9ORQkJLy97dXNlZCBqdXN0IGFzIGRlZmF1bHR9Ci0JezB4MDAsIDB4MEYsIDB4QUMsIDB4MDN9LCAvL1dSQVAtaGlzdG9yaWNhbAotCXsweDAwLCAweDBGLCAweEFDLCAweDA0fSwgLy9DQ01QCi0JezB4MDAsIDB4MEYsIDB4QUMsIDB4MDV9LCAvL1dFUC0xMDQKLX07CiAKIHNob3J0IGllZWU4MDIxMV9pc181NGcoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQpCiB7CkBAIC02MiwxNCArNTMsMTMgQEAKIH0KIAogLyogcGxhY2UgdGhlIE1GSUUgcmF0ZSwgdGFnIHRvIHRoZSBtZW1vcnkgKGRvdWJsZSkgcG9pc2VkLgotICogVGhlbiBpdCB1cGRhdGVzIHRoZSBwb2ludGVyIHNvIHRoYXQKLSAqIGl0IHBvaW50cyBhZnRlciB0aGUgbmV3IE1GSUUgdGFnIGFkZGVkLgorICogVGhlbiBpdCB1cGRhdGVzIHRoZSBwb2ludGVyIHNvIHRoYXQgaXQgcG9pbnRzIGFmdGVyIHRoZSBuZXcgTUZJRSB0YWcgYWRkZWQuCiAgKi8KIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9NRklFX0JyYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqKnRhZ19wKQogewogCXU4ICp0YWcgPSAqdGFnX3A7CiAKLQlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTil7CisJaWYgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04pIHsKIAkJKnRhZysrID0gTUZJRV9UWVBFX1JBVEVTOwogCQkqdGFnKysgPSA0OwogCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzFNQjsKQEAgLTg2LDggKzc2LDcgQEAKIHsKIAl1OCAqdGFnID0gKnRhZ19wOwogCi0JCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTil7Ci0KKwkJaWYgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKSB7CiAJCSp0YWcrKyA9IE1GSUVfVFlQRV9SQVRFU19FWDsKIAkJKnRhZysrID0gODsKIAkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COwpAQCAtMTAwLDIyICs4OSwyMCBAQAogCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV81NE1COwogCiAJfQotCiAJLyogV2UgbWF5IGFkZCBhbiBvcHRpb24gZm9yIGN1c3RvbSByYXRlcyB0aGF0IHNwZWNpZmljIEhXIG1pZ2h0IHN1cHBvcnQgKi8KIAkqdGFnX3AgPSB0YWc7CiB9CiAKLQogc3RhdGljIHZvaWQgaWVlZTgwMjExX1dNTV9JbmZvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqKnRhZ19wKQogewogCXU4ICp0YWcgPSAqdGFnX3A7CiAKLQkqdGFnKysgPSBNRklFX1RZUEVfR0VORVJJQzsgLy8wCisJKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7IC8qIDAgKi8KIAkqdGFnKysgPSA3OwogCSp0YWcrKyA9IDB4MDA7CiAJKnRhZysrID0gMHg1MDsKIAkqdGFnKysgPSAweGYyOwotCSp0YWcrKyA9IDB4MDI7Ly81CisJKnRhZysrID0gMHgwMjsgLyogNSAqLwogCSp0YWcrKyA9IDB4MDA7CiAJKnRhZysrID0gMHgwMTsKICNpZmRlZiBTVVBQT1JUX1VTUEQKQEAgLTE0OCwzMiArMTM1LDIzIEBACiBzdGF0aWMgdm9pZCBlbnF1ZXVlX21nbXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaW50IG5oOwotCW5oID0gKGllZWUtPm1nbXRfcXVldWVfaGVhZCArMSkgJSBNR01UX1FVRVVFX05VTTsKKwluaCA9IChpZWVlLT5tZ210X3F1ZXVlX2hlYWQgKyAxKSAlIE1HTVRfUVVFVUVfTlVNOwogCi0vKgotICogaWYgdGhlIHF1ZXVlIGlzIGZ1bGwgYnV0IHdlIGhhdmUgbmV3ZXIgZnJhbWVzIHRoZW4KLSAqIGp1c3Qgb3ZlcndyaXRlcyB0aGUgb2xkZXN0LgotICoKLSAqIGlmIChuaCA9PSBpZWVlLT5tZ210X3F1ZXVlX3RhaWwpCi0gKgkJcmV0dXJuIC0xOwotICovCiAJaWVlZS0+bWdtdF9xdWV1ZV9oZWFkID0gbmg7CiAJaWVlZS0+bWdtdF9xdWV1ZV9yaW5nW25oXSA9IHNrYjsKLQotCS8vcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqZGVxdWV1ZV9tZ210KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCXN0cnVjdCBza19idWZmICpyZXQ7CiAKLQlpZihpZWVlLT5tZ210X3F1ZXVlX3RhaWwgPT0gaWVlZS0+bWdtdF9xdWV1ZV9oZWFkKQorCWlmIChpZWVlLT5tZ210X3F1ZXVlX3RhaWwgPT0gaWVlZS0+bWdtdF9xdWV1ZV9oZWFkKQogCQlyZXR1cm4gTlVMTDsKIAogCXJldCA9IGllZWUtPm1nbXRfcXVldWVfcmluZ1tpZWVlLT5tZ210X3F1ZXVlX3RhaWxdOwogCiAJaWVlZS0+bWdtdF9xdWV1ZV90YWlsID0KLQkJKGllZWUtPm1nbXRfcXVldWVfdGFpbCsxKSAlIE1HTVRfUVVFVUVfTlVNOworCQkoaWVlZS0+bWdtdF9xdWV1ZV90YWlsICsgMSkgJSBNR01UX1FVRVVFX05VTTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xODMsNyArMTYxLDYgQEAKIAlpZWVlLT5tZ210X3F1ZXVlX3RhaWwgPSBpZWVlLT5tZ210X3F1ZXVlX2hlYWQgPSAwOwogfQogCi0KIHZvaWQgaWVlZTgwMjExX3N0YV93YWtldXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IG5sKTsKIAogaW5saW5lIHZvaWQgc29mdG1hY19tZ210X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTE5MSwyMCArMTY4LDE4IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzaG9ydCBzaW5nbGUgPSBpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKmhlYWRlcj0KKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKmhlYWRlciA9CiAJCShzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKikgc2tiLT5kYXRhOwogCi0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCiAJLyogY2FsbGVkIHdpdGggMm5kIHBhcmFtIDAsIG5vIG1nbXQgbG9jayByZXF1aXJlZCAqLwotCWllZWU4MDIxMV9zdGFfd2FrZXVwKGllZWUsMCk7CisJaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwgMCk7CiAKLQlpZihzaW5nbGUpewotCQlpZihpZWVlLT5xdWV1ZV9zdG9wKXsKLQotCQkJZW5xdWV1ZV9tZ210KGllZWUsc2tiKTsKLQkJfWVsc2V7CisJaWYgKHNpbmdsZSkgeworCQlpZiAoaWVlZS0+cXVldWVfc3RvcCkgeworCQkJZW5xdWV1ZV9tZ210KGllZWUsIHNrYik7CisJCX0gZWxzZSB7CiAJCQloZWFkZXItPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF08PDQpOwogCiAJCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCkBAIC0yMTQsMTEgKzE4OSwxMSBAQAogCiAJCQkvKiBhdm9pZCB3YXRjaGRvZyB0cmlnZ2VycyAqLwogCQkJaWVlZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0JCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KHNrYixpZWVlLT5kZXYsaWVlZS0+YmFzaWNfcmF0ZSk7CisJCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KHNrYiwgaWVlZS0+ZGV2LCBpZWVlLT5iYXNpY19yYXRlKTsKIAkJfQogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLQl9ZWxzZXsKKwl9IGVsc2UgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzKTsKIApAQCAtMjMxLDI0ICsyMDYsMjAgQEAKIAogCQkvKiBhdm9pZCB3YXRjaGRvZyB0cmlnZ2VycyAqLwogCQlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLQkJaWVlZS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLGllZWUtPmRldik7CisJCWllZWUtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYiwgaWVlZS0+ZGV2KTsKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzKTsKIAl9CiB9CiAKLQogaW5saW5lIHZvaWQgc29mdG1hY19wc19tZ210X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0KIAlzaG9ydCBzaW5nbGUgPSBpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKmhlYWRlciA9CiAJCShzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKikgc2tiLT5kYXRhOwogCi0KLQlpZihzaW5nbGUpewotCisJaWYgKHNpbmdsZSkgewogCQloZWFkZXItPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CiAKIAkJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQpAQCAtMjU4LDEwICsyMjksOCBAQAogCiAJCS8qIGF2b2lkIHdhdGNoZG9nIHRyaWdnZXJzICovCiAJCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KHNrYixpZWVlLT5kZXYsaWVlZS0+YmFzaWNfcmF0ZSk7Ci0KLQl9ZWxzZXsKLQorCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KHNrYiwgaWVlZS0+ZGV2LCBpZWVlLT5iYXNpY19yYXRlKTsKKwl9IGVsc2UgewogCQloZWFkZXItPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CiAKIAkJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQpAQCAtMjcxLDEyICsyNDAsMTAgQEAKIAogCQkvKiBhdm9pZCB3YXRjaGRvZyB0cmlnZ2VycyAqLwogCQlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLQkJaWVlZS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLGllZWUtPmRldik7Ci0KKwkJaWVlZS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLCBpZWVlLT5kZXYpOwogCX0KLS8vCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcwogfQotLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKKwogaW5saW5lIHN0cnVjdCBza19idWZmICoKIGllZWU4MDIxMV9kaXNhc3NvY2lhdGVfc2tiKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uLAogCQkJICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4IGFzUnNuKQpAQCAtMjg4LDcgKzI1NSw3IEBACiAJaWYgKCFza2IpCiAJCXJldHVybiBOVUxMOwogCi0JZGlzYXNzID0gKHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2NfZnJhbWUgKikgc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2NfZnJhbWUpKTsKKwlkaXNhc3MgPSAoc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvY19mcmFtZSAqKSBza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2NfZnJhbWUpKTsKIAlkaXNhc3MtPmhlYWRlci5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DKTsKIAlkaXNhc3MtPmhlYWRlci5kdXJhdGlvbl9pZCA9IDA7CiAKQEAgLTI5OSwyMSArMjY2LDE5IEBACiAJZGlzYXNzLT5yZWFzb25jb2RlID0gYXNSc247CiAJcmV0dXJuIHNrYjsKIH0KKwogdm9pZCBTZW5kRGlzYXNzb2NpYXRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICphc1N0YSwgdTggYXNSc24pCiB7Ci0gICAgICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKLSAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKLSAgICAgICAgc2tiID0gaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9za2IoYmVhY29uLGllZWUsYXNSc24pOwotICAgICAgICBpZiAoc2tiKXsKLSAgICAgICAgICAgICAgICBzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwotICAgICAgICAgICAgICAgIC8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCi0gICAgICAgIH0KKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlza2IgPSBpZWVlODAyMTFfZGlzYXNzb2NpYXRlX3NrYihiZWFjb24sIGllZWUsIGFzUnNuKTsKKwlpZiAoc2tiKQorCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwogfQogCi0vL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQogaW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfcHJvYmVfcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotCXVuc2lnbmVkIGludCBsZW4scmF0ZV9sZW47CisJdW5zaWduZWQgaW50IGxlbiwgcmF0ZV9sZW47CiAJdTggKnRhZzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCAqcmVxOwpAQCAtMzI3LDc1ICsyOTIsNDUgQEAKIAlpZiAoIXNrYikKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZXEgPSAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0ICopIHNrYl9wdXQoc2tiLHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QpKTsKKwlyZXEgPSAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0ICopIHNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0KSk7CiAJcmVxLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSk7Ci0JcmVxLT5oZWFkZXIuZHVyYXRpb25faWQgPSAwOyAvL0ZJWE1FOiBpcyB0aGlzIE9LID8KKwlyZXEtPmhlYWRlci5kdXJhdGlvbl9pZCA9IDA7IC8qIEZJWE1FOiBpcyB0aGlzIE9LID8gKi8KIAogCW1lbXNldChyZXEtPmhlYWRlci5hZGRyMSwgMHhmZiwgRVRIX0FMRU4pOwogCW1lbWNweShyZXEtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCW1lbXNldChyZXEtPmhlYWRlci5hZGRyMywgMHhmZiwgRVRIX0FMRU4pOwogCi0JdGFnID0gKHU4ICopIHNrYl9wdXQoc2tiLGxlbisyK3JhdGVfbGVuKTsKKwl0YWcgPSAodTggKikgc2tiX3B1dChza2IsIGxlbiArIDIgKyByYXRlX2xlbik7CiAKIAkqdGFnKysgPSBNRklFX1RZUEVfU1NJRDsKIAkqdGFnKysgPSBsZW47CiAJbWVtY3B5KHRhZywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIGxlbik7CiAJdGFnICs9IGxlbjsKLQlpZWVlODAyMTFfTUZJRV9CcmF0ZShpZWVlLCZ0YWcpOwotCWllZWU4MDIxMV9NRklFX0dyYXRlKGllZWUsJnRhZyk7CisJaWVlZTgwMjExX01GSUVfQnJhdGUoaWVlZSwgJnRhZyk7CisJaWVlZTgwMjExX01GSUVfR3JhdGUoaWVlZSwgJnRhZyk7CiAKIAlyZXR1cm4gc2tiOwogfQogCiBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb25fKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKIAotdm9pZCBleHRfaWVlZTgwMjExX3NlbmRfYmVhY29uX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlza2IgPSBpZWVlODAyMTFfZ2V0X2JlYWNvbl8oaWVlZSk7Ci0KLQlpZiAoc2tiKXsKLQkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKLQkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9iZWFjb25zKys7Ci0JCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcwotCX0KLQotCi0JLy9wcmludGsoS0VSTl9XQVJOSU5HICJbMV0gYmVhY29uIHNlbmRpbmchXG4iKTsKLQlpZWVlLT5iZWFjb25fdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKwotCQkoTVNFQ1MoIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgLTUpKTsKLQotCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKLQlpZihpZWVlLT5iZWFjb25fdHhpbmcpCi0JCWFkZF90aW1lcigmaWVlZS0+YmVhY29uX3RpbWVyKTsKLQkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKLX0KLQogc3RhdGljIHZvaWQgaWVlZTgwMjExX3NlbmRfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKLQkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KIAlza2IgPSBpZWVlODAyMTFfZ2V0X2JlYWNvbl8oaWVlZSk7CiAKLQlpZiAoc2tiKXsKKwlpZiAoc2tiKSB7CiAJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CiAJCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfYmVhY29ucysrOwotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAl9CiAKLQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIlsxXSBiZWFjb24gc2VuZGluZyFcbiIpOwogCWllZWUtPmJlYWNvbl90aW1lci5leHBpcmVzID0gamlmZmllcyArCi0JCShNU0VDUyggaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCAtNSkpOworCQkoTVNFQ1MoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCAtIDUpKTsKIAotCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKLQlpZihpZWVlLT5iZWFjb25fdHhpbmcpCisJaWYgKGllZWUtPmJlYWNvbl90eGluZykKIAkJYWRkX3RpbWVyKCZpZWVlLT5iZWFjb25fdGltZXIpOwotCS8vc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOwogfQogCiAKQEAgLTQxNSwxNiArMzUwLDE1IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCXNrYiA9IGllZWU4MDIxMV9wcm9iZV9yZXEoaWVlZSk7Ci0JaWYgKHNrYil7CisJaWYgKHNrYikgewogCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwogCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X3Byb2JlX3JxKys7Ci0JCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCiAJfQogfQogCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQlpZiAoaWVlZS0+YWN0aXZlX3NjYW4gJiYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfUFJPQkVSUSkpeworCWlmIChpZWVlLT5hY3RpdmVfc2NhbiAmJiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19QUk9CRVJRKSkgewogCQlpZWVlODAyMTFfc2VuZF9wcm9iZShpZWVlKTsKIAkJaWVlZTgwMjExX3NlbmRfcHJvYmUoaWVlZSk7CiAJfQpAQCAtNDM5LDE3ICszNzMsMTQgQEAKIAl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CiAJbWVtY3B5KGNoYW5uZWxfbWFwLCBHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CiAJZG93bigmaWVlZS0+c2Nhbl9zZW0pOwotLy8JcHJpbnRrKCI9PT09PT09PT09PT09PT09PT0+IFN5bmMgc2NhblxuIik7CiAKLQl3aGlsZSgxKQotCXsKLQotCQlkb3sKKwl3aGlsZSAoMSkgeworCQlkbyB7CiAJCQljaCsrOwogCQkJaWYgKGNoID4gTUFYX0NIQU5ORUxfTlVNQkVSKQogCQkJCWdvdG8gb3V0OyAvKiBzY2FuIGNvbXBsZXRlZCAqLwogCi0JCX13aGlsZSghY2hhbm5lbF9tYXBbY2hdKTsKKwkJfSB3aGlsZSAoIWNoYW5uZWxfbWFwW2NoXSk7CiAJCS8qIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBpbiB0d28gc2l0dWF0aW9ucwogCQkgKiAxLSBXZSBoYXZlIHN3aXRjaGVkIHRvIGFkLWhvYyBtb2RlIGFuZCB3ZSBhcmUKIAkJICogICAgcGVyZm9ybWluZyBhIGNvbXBsZXRlIHN5bmNybyBzY2FuIGJlZm9yZSBjb25jbHVkZQpAQCAtNDczLDEwMSArNDA0LDc0IEBACiAJCQlnb3RvIG91dDsKIAogCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGNoKTsKLS8vCQlwcmludGsoIj09PT09PmNoYW5uZWw9JWQgICAiLGNoKTsKLQkJaWYoY2hhbm5lbF9tYXBbY2hdID09IDEpCi0JCXsKLS8vCQkJcHJpbnRrKCI9PT09c2VuZCBwcm9iZSByZXF1ZXN0XG4iKTsKKwkJaWYgKGNoYW5uZWxfbWFwW2NoXSA9PSAxKQogCQkJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoaWVlZSk7Ci0JCX0KKwogCQkvKiB0aGlzIHByZXZlbnQgZXhjZXNzaXZlIHRpbWUgd2FpdCB3aGVuIHdlCiAJCSAqIG5lZWQgdG8gd2FpdCBmb3IgYSBzeW5jcm8gc2NhbiB0byBlbmQuLgogCQkgKi8KIAkJaWYgKGllZWUtPnN5bmNfc2Nhbl9odXJyeXVwKQogCQkJZ290byBvdXQ7CiAKLQogCQltc2xlZXBfaW50ZXJydXB0aWJsZV9ydGwoSUVFRTgwMjExX1NPRlRNQUNfU0NBTl9USU1FKTsKLQogCX0KIG91dDoKIAlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7CiAJdXAoJmllZWUtPnNjYW5fc2VtKTsKLQlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQorCWlmIChJU19ET1QxMURfRU5BQkxFKGllZWUpKQogCQlET1QxMURfU2NhbkNvbXBsZXRlKGllZWUpOwogfQogCiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2lwc19zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlpbnQgY2g7Ci0gICAgICAgIHVuc2lnbmVkIGludCB3YXRjaF9kb2cgPSAwOworCXVuc2lnbmVkIGludCB3YXRjaF9kb2cgPSAwOwogCXU4IGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsKIAltZW1jcHkoY2hhbm5lbF9tYXAsIEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKLSAgICAgICAgZG93bigmaWVlZS0+c2Nhbl9zZW0pOworCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKIAljaCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsOwotLy8gICAgICAJaWYoaWVlZS0+c3luY19zY2FuX2h1cnJ5dXApCi0vLwl7CiAKLS8vCQlwcmludGsoInN0b3Agc2NhbiBzeW5jXG4iKTsKLS8vICAgCQlnb3RvIG91dDsKLS8vICAJfQotLy8JcHJpbnRrKCI9PT09PT09aGg9PT09PT09PT09PT09PT0+aXBzIHNjYW5cbiIpOwotICAgICAJd2hpbGUoMSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBpbiB0d28gc2l0dWF0aW9ucwotICAgICAgICAgICAgICAgICAqIDEtIFdlIGhhdmUgc3dpdGNoZWQgdG8gYWQtaG9jIG1vZGUgYW5kIHdlIGFyZQotICAgICAgICAgICAgICAgICAqICAgIHBlcmZvcm1pbmcgYSBjb21wbGV0ZSBzeW5jcm8gc2NhbiBiZWZvcmUgY29uY2x1ZGUKLSAgICAgICAgICAgICAgICAgKiAgICB0aGVyZSBhcmUgbm8gaW50ZXJlc3RpbmcgY2VsbCBhbmQgdG8gY3JlYXRlIGEKLSAgICAgICAgICAgICAgICAgKiAgICBuZXcgb25lLiBJbiB0aGlzIGNhc2UgdGhlIGxpbmsgc3RhdGUgaXMKLSAgICAgICAgICAgICAgICAgKiAgICBJRUVFODAyMTFfTk9MSU5LIHVudGlsIHdlIGZvdW5kIGFuIGludGVyZXN0aW5nIGNlbGwuCi0gICAgICAgICAgICAgICAgICogICAgSWYgc28gdGhlIGllZWU4MDIxX25ld19uZXQsIGNhbGxlZCBieSB0aGUgUlggcGF0aAotICAgICAgICAgICAgICAgICAqICAgIHdpbGwgc2V0IHRoZSBzdGF0ZSB0byBJRUVFODAyMTFfTElOS0VELCBzbyB3ZSBzdG9wCi0gICAgICAgICAgICAgICAgICogICAgc2Nhbm5pbmcKLSAgICAgICAgICAgICAgICAgKiAyLSBXZSBhcmUgbGlua2VkIGFuZCB0aGUgcm9vdCB1c2VzIHJ1biBpd2xpc3Qgc2Nhbi4KLSAgICAgICAgICAgICAgICAgKiAgICBTbyB3ZSBzd2l0Y2ggdG8gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORyB0byByZW1lbWJlcgotICAgICAgICAgICAgICAgICAqICAgIHRoYXQgd2UgYXJlIHN0aWxsIGxvZ2ljYWxseSBsaW5rZWQgKG5vdCBpbnRlcmVzdGVkIGluCi0gICAgICAgICAgICAgICAgICogICAgbmV3IG5ldHdvcmsgZXZlbnRzLCBkZXNwaXRlIGZvciB1cGRhdGluZyB0aGUgbmV0IGxpc3QsCi0gICAgICAgICAgICAgICAgICogICAgYnV0IHdlIGFyZSB0ZW1wb3JhcmlseSAndW5saW5rZWQnIGFzIHRoZSBkcml2ZXIgc2hhbGwKLSAgICAgICAgICAgICAgICAgKiAgICBub3QgZmlsdGVyIFJYIGZyYW1lcyBhbmQgdGhlIGNoYW5uZWwgaXMgY2hhbmdpbmcuCi0gICAgICAgICAgICAgICAgICogU28gdGhlIG9ubHkgc2l0dWF0aW9uIGluIHdpdGNoIGFyZSBpbnRlcmVzdGVkIGlzIHRvIGNoZWNrCi0gICAgICAgICAgICAgICAgICogaWYgdGhlIHN0YXRlIGJlY29tZSBMSU5LRUQgYmVjYXVzZSBvZiB0aGUgIzEgc2l0dWF0aW9uCi0gICAgICAgICAgICAgICAgICovCisJd2hpbGUgKDEpIHsKKwkJLyogdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGluIHR3byBzaXR1YXRpb25zCisJCSAqIDEtIFdlIGhhdmUgc3dpdGNoZWQgdG8gYWQtaG9jIG1vZGUgYW5kIHdlIGFyZQorCQkgKiAgICBwZXJmb3JtaW5nIGEgY29tcGxldGUgc3luY3JvIHNjYW4gYmVmb3JlIGNvbmNsdWRlCisJCSAqICAgIHRoZXJlIGFyZSBubyBpbnRlcmVzdGluZyBjZWxsIGFuZCB0byBjcmVhdGUgYQorCQkgKiAgICBuZXcgb25lLiBJbiB0aGlzIGNhc2UgdGhlIGxpbmsgc3RhdGUgaXMKKwkJICogICAgSUVFRTgwMjExX05PTElOSyB1bnRpbCB3ZSBmb3VuZCBhbiBpbnRlcmVzdGluZyBjZWxsLgorCQkgKiAgICBJZiBzbyB0aGUgaWVlZTgwMjFfbmV3X25ldCwgY2FsbGVkIGJ5IHRoZSBSWCBwYXRoCisJCSAqICAgIHdpbGwgc2V0IHRoZSBzdGF0ZSB0byBJRUVFODAyMTFfTElOS0VELCBzbyB3ZSBzdG9wCisJCSAqICAgIHNjYW5uaW5nCisJCSAqIDItIFdlIGFyZSBsaW5rZWQgYW5kIHRoZSByb290IHVzZXMgcnVuIGl3bGlzdCBzY2FuLgorCQkgKiAgICBTbyB3ZSBzd2l0Y2ggdG8gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORyB0byByZW1lbWJlcgorCQkgKiAgICB0aGF0IHdlIGFyZSBzdGlsbCBsb2dpY2FsbHkgbGlua2VkIChub3QgaW50ZXJlc3RlZCBpbgorCQkgKiAgICBuZXcgbmV0d29yayBldmVudHMsIGRlc3BpdGUgZm9yIHVwZGF0aW5nIHRoZSBuZXQgbGlzdCwKKwkJICogICAgYnV0IHdlIGFyZSB0ZW1wb3JhcmlseSAndW5saW5rZWQnIGFzIHRoZSBkcml2ZXIgc2hhbGwKKwkJICogICAgbm90IGZpbHRlciBSWCBmcmFtZXMgYW5kIHRoZSBjaGFubmVsIGlzIGNoYW5naW5nLgorCQkgKiBTbyB0aGUgb25seSBzaXR1YXRpb24gaW4gd2l0Y2ggYXJlIGludGVyZXN0ZWQgaXMgdG8gY2hlY2sKKwkJICogaWYgdGhlIHN0YXRlIGJlY29tZSBMSU5LRUQgYmVjYXVzZSBvZiB0aGUgIzEgc2l0dWF0aW9uCisJCSAqLwogCQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKLQkJewogCQkJZ290byBvdXQ7Ci0JCX0KLQkJaWYoY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdID4gMCkKLQkJeworCisJCWlmIChjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0gPiAwKQogCQkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7Ci0vLwkJCXByaW50aygiPT09PT09PmNoYW5uZWw9JWQgICIsaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOwotCQl9Ci0JCWlmKGNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSA9PSAxKQotCQl7Ci0vLwkJCXByaW50aygiPT09PXNlbmQgcHJvYmUgcmVxdWVzdFxuIik7CisKKwkJaWYgKGNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSA9PSAxKQogCQkJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoaWVlZSk7Ci0gICAgICAgICAgICAgICAgfQotCQkvKiB0aGlzIHByZXZlbnQgZXhjZXNzaXZlIHRpbWUgd2FpdCB3aGVuIHdlCi0gICAgICAgICAgICAgICAgICogbmVlZCB0byB3YWl0IGZvciBhIHN5bmNybyBzY2FuIHRvIGVuZC4uCi0gICAgICAgICAgICAgICAgICovCi0vLyAgICAgICAgICAgICAgICBpZiAoaWVlZS0+c3luY19zY2FuX2h1cnJ5dXApCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OwogCiAJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlX3J0bChJRUVFODAyMTFfU09GVE1BQ19TQ0FOX1RJTUUpOwogCi0JCWRveworCQlkbyB7CiAJCQlpZiAod2F0Y2hfZG9nKysgPj0gTUFYX0NIQU5ORUxfTlVNQkVSKQotCQkvLwlpZiAoKyt3YXRjaF9kb2cgPj0gMTUpOy8vTUFYX0NIQU5ORUxfTlVNQkVSKSAgLy9ZSixtb2RpZmllZCwwODA2MzAKIAkJCQlnb3RvIG91dDsgLyogc2NhbiBjb21wbGV0ZWQgKi8KIAogCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgKyAxKSVNQVhfQ0hBTk5FTF9OVU1CRVI7Ci0JCX13aGlsZSghY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKLSAgICAgICAgfQorCQl9IHdoaWxlICghY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKKwl9CiBvdXQ6Ci0JLy9pZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7Ci0gICAJLy9pZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGNoKTsKLSAgIAkvL2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gY2g7CiAJaWVlZS0+YWN0c2Nhbm5pbmcgPSBmYWxzZTsKIAl1cCgmaWVlZS0+c2Nhbl9zZW0pOwotCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCisJaWYgKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCiAJCURPVDExRF9TY2FuQ29tcGxldGUoaWVlZSk7CiB9CiAKQEAgLTU3NSwyOSArNDc5LDI0IEBACiB7CiAJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBzb2Z0bWFjX3NjYW5fd3EpOwotCXN0YXRpYyBzaG9ydCB3YXRjaGRvZyA9IDA7CisJc3RhdGljIHNob3J0IHdhdGNoZG9nOwogCXU4IGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsKIAltZW1jcHkoY2hhbm5lbF9tYXAsIEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKLS8vCXByaW50aygiaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl93cSBFTkFCTEVfSVBTXG4iKTsKLS8vCXByaW50aygiaW4gJXNcbiIsX19mdW5jX18pOwogCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKIAotCWRveworCWRvIHsKIAkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPQogCQkJKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsICsgMSkgJSBNQVhfQ0hBTk5FTF9OVU1CRVI7CiAJCWlmICh3YXRjaGRvZysrID4gTUFYX0NIQU5ORUxfTlVNQkVSKQogCQkJCWdvdG8gb3V0OyAvKiBubyBnb29kIGNoYW5zICovCisJfSB3aGlsZSAoIWNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7CiAKLSAJfXdoaWxlKCFjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOwotCi0JLy9wcmludGsoImN1cnJlbnRfbmV0d29yay5jaGFubmVsOiVkXG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7Ci0JaWYgKGllZWUtPnNjYW5uaW5nID09IDAgKQotCXsKKwlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMCkgewogCQlwcmludGsoImVycm9yIG91dCwgc2Nhbm5pbmcgPSAwXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOwotCWlmKGNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSA9PSAxKQorCWlmIChjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0gPT0gMSkKIAkJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoaWVlZSk7CiAKIAlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsIElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRSk7CkBAIC02MDksNyArNTA4LDcgQEAKIAlpZWVlLT5zY2FubmluZyA9IDA7CiAJdXAoJmllZWUtPnNjYW5fc2VtKTsKIAotCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCisJaWYgKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCiAJCURPVDExRF9TY2FuQ29tcGxldGUoaWVlZSk7CiAJcmV0dXJuOwogfQpAQCAtNjE4LDYyICs1MTcsNTEgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+YmVhY29uX2xvY2ssIGZsYWdzKTsKIAogCWllZWUtPmJlYWNvbl90eGluZyA9IDE7CiAJaWVlZTgwMjExX3NlbmRfYmVhY29uKGllZWUpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9iZWFjb25zX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLCBmbGFncyk7CiAKIAlpZWVlLT5iZWFjb25fdHhpbmcgPSAwOwotIAlkZWxfdGltZXJfc3luYygmaWVlZS0+YmVhY29uX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmaWVlZS0+YmVhY29uX3RpbWVyKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKLQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLCBmbGFncyk7CiB9CiAKLQogdm9pZCBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0JaWYoaWVlZS0+c3RvcF9zZW5kX2JlYWNvbnMpCisJaWYgKGllZWUtPnN0b3Bfc2VuZF9iZWFjb25zKQogCQlpZWVlLT5zdG9wX3NlbmRfYmVhY29ucyhpZWVlLT5kZXYpOwogCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0JFQUNPTlMpCiAJCWllZWU4MDIxMV9iZWFjb25zX3N0b3AoaWVlZSk7CiB9CiAKLQogdm9pZCBpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotCWlmKGllZWUtPnN0YXJ0X3NlbmRfYmVhY29ucykKKwlpZiAoaWVlZS0+c3RhcnRfc2VuZF9iZWFjb25zKQogCQlpZWVlLT5zdGFydF9zZW5kX2JlYWNvbnMoaWVlZS0+ZGV2KTsKLQlpZihpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0JFQUNPTlMpCisJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQkVBQ09OUykKIAkJaWVlZTgwMjExX2JlYWNvbnNfc3RhcnQoaWVlZSk7CiB9CiAKLQogc3RhdGljIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotLy8JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8vaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOwotCiAJZG93bigmaWVlZS0+c2Nhbl9zZW0pOwotLy8Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAotCWlmIChpZWVlLT5zY2FubmluZyA9PSAxKXsKKwlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMSkgewogCQlpZWVlLT5zY2FubmluZyA9IDA7Ci0JCS8vZGVsX3RpbWVyX3N5bmMoJmllZWUtPnNjYW5fdGltZXIpOwogCQljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EpOwogCX0KIAotLy8Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCXVwKCZpZWVlLT5zY2FuX3NlbSk7CiB9CiAKQEAgLTY4OCwzOCArNTc2LDI4IEBACiAvKiBjYWxsZWQgd2l0aCBpZWVlLT5sb2NrIGhlbGQgKi8KIHZvaWQgaWVlZTgwMjExX3J0bF9zdGFydF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgKQotCXsKLQkJaWYoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKLQkJeworCWlmIChJU19ET1QxMURfRU5BQkxFKGllZWUpKSB7CisJCWlmIChJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQogCQkJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOwotCQl9CiAJfQotCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pewotCQlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMCkKLQkJeworCisJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTikgeworCQlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMCkgewogCQkJaWVlZS0+c2Nhbm5pbmcgPSAxOwotCQkJLy9pZWVlODAyMTFfc29mdG1hY19zY2FuKGllZWUpOwotCQkvLwlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+c29mdG1hY19zY2FuX3dxKTsKLQkJLy9jYXJlIHRoaXMsMTIwMywyMDA3LGJ5IGxhd3JlbmNlCiAjaWYgMQotCQkJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+c29mdG1hY19zY2FuX3dxLDApOworCQkJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+c29mdG1hY19zY2FuX3dxLCAwKTsKICNlbmRpZgogCQl9CiAJfWVsc2UKIAkJaWVlZS0+c3RhcnRfc2NhbihpZWVlLT5kZXYpOwotCiB9CiAKIC8qIGNhbGxlZCB3aXRoIHd4X3NlbSBoZWxkICovCiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpICkKLQl7Ci0JCWlmKElTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCi0JCXsKKwlpZiAoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkgeworCQlpZiAoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKIAkJCVJFU0VUX0NJRV9XQVRDSERPRyhpZWVlKTsKLQkJfQogCX0KIAlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7CiAKQEAgLTcyNyw3ICs2MDUsNiBAQAogCQlpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyhpZWVlKTsKIAllbHNlCiAJCWllZWUtPnNjYW5fc3luY3JvKGllZWUtPmRldik7Ci0KIH0KIAogaW5saW5lIHN0cnVjdCBza19idWZmICoKQEAgLTczOSwxNSArNjE2LDE3IEBACiAKIAlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSArIGNoYWxsZW5nZWxlbik7CiAKLQlpZiAoIXNrYikgcmV0dXJuIE5VTEw7CisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOwogCiAJYXV0aCA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICopCiAJCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbikpOwogCiAJYXV0aC0+aGVhZGVyLmZyYW1lX2N0bCA9IElFRUU4MDIxMV9TVFlQRV9BVVRIOwotCWlmIChjaGFsbGVuZ2VsZW4pIGF1dGgtPmhlYWRlci5mcmFtZV9jdGwgfD0gSUVFRTgwMjExX0ZDVExfV0VQOworCWlmIChjaGFsbGVuZ2VsZW4pCisJCWF1dGgtPmhlYWRlci5mcmFtZV9jdGwgfD0gSUVFRTgwMjExX0ZDVExfV0VQOwogCi0JYXV0aC0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMHgwMTNhOyAvL0ZJWE1FCisJYXV0aC0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMHgwMTNhOyAvKiBGSVhNRSAqLwogCiAJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMSwgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOwogCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKQEAgLTc2MSw3ICs2NDAsNiBAQAogCWF1dGgtPnN0YXR1cyA9IGNwdV90b19sZTE2KFdMQU5fU1RBVFVTX1NVQ0NFU1MpOwogCiAJcmV0dXJuIHNrYjsKLQogfQogCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9wcm9iZV9yZXNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLApAQCAtNzcyLDI5ICs2NTAsMzAgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiZWFjb25fYnVmOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGVuY3J5cHQ7Ci0JaW50IGF0aW1fbGVuLGVycF9sZW47Ci0Jc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdDsKKwlpbnQgYXRpbV9sZW4sIGVycF9sZW47CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdDsKIAogCWNoYXIgKnNzaWQgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZDsKIAlpbnQgc3NpZF9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW47CiAJaW50IHJhdGVfbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2xlbisyOwogCWludCByYXRlX2V4X2xlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leF9sZW47CiAJaW50IHdwYV9pZV9sZW4gPSBpZWVlLT53cGFfaWVfbGVuOwotCWlmKHJhdGVfZXhfbGVuID4gMCkgcmF0ZV9leF9sZW4rPTI7CisJaWYgKHJhdGVfZXhfbGVuID4gMCkKKwkJcmF0ZV9leF9sZW4gKz0gMjsKIAotCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpCiAJCWF0aW1fbGVuID0gNDsKIAllbHNlCiAJCWF0aW1fbGVuID0gMDsKIAotCWlmKGllZWU4MDIxMV9pc181NGcoJmllZWUtPmN1cnJlbnRfbmV0d29yaykpCisJaWYgKGllZWU4MDIxMV9pc181NGcoJmllZWUtPmN1cnJlbnRfbmV0d29yaykpCiAJCWVycF9sZW4gPSAzOwogCWVsc2UKIAkJZXJwX2xlbiA9IDA7CiAKIAliZWFjb25fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlKSsKIAkJc3NpZF9sZW4KLQkJKzMgLy9jaGFubmVsCisJCSszIC8qIGNoYW5uZWwgKi8KIAkJK3JhdGVfbGVuCiAJCStyYXRlX2V4X2xlbgogCQkrYXRpbV9sZW4KQEAgLTgwNiwxOSArNjg1LDE5IEBACiAJaWYgKCFza2IpCiAJCXJldHVybiBOVUxMOwogCi0JYmVhY29uX2J1ZiA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlKikgc2tiX3B1dChza2IsIGJlYWNvbl9zaXplKTsKKwliZWFjb25fYnVmID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKikgc2tiX3B1dChza2IsIGJlYWNvbl9zaXplKTsKIAotCW1lbWNweSAoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIxLCBkZXN0LEVUSF9BTEVOKTsKLQltZW1jcHkgKGJlYWNvbl9idWYtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweSAoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIzLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKwltZW1jcHkoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIxLCBkZXN0LCBFVEhfQUxFTik7CisJbWVtY3B5KGJlYWNvbl9idWYtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjMsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOwogCi0JYmVhY29uX2J1Zi0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsgLy9GSVhNRQorCWJlYWNvbl9idWYtPmhlYWRlci5kdXJhdGlvbl9pZCA9IDA7IC8qIEZJWE1FICovCiAJYmVhY29uX2J1Zi0+YmVhY29uX2ludGVydmFsID0KIAkJY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCk7CiAJYmVhY29uX2J1Zi0+Y2FwYWJpbGl0eSA9CiAJCWNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpOwogCi0JaWYoaWVlZS0+c2hvcnRfc2xvdCAmJiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCkpCisJaWYgKGllZWUtPnNob3J0X3Nsb3QgJiYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpKQogCQliZWFjb25fYnVmLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKTsKIAogCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKQEAgLTgzNSw1MSArNzE0LDUyIEBACiAJYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50LmlkID0gTUZJRV9UWVBFX1NTSUQ7CiAJYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50LmxlbiA9IHNzaWRfbGVuOwogCi0JdGFnID0gKHU4KikgYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50LmRhdGE7CisJdGFnID0gKHU4ICopIGJlYWNvbl9idWYtPmluZm9fZWxlbWVudC5kYXRhOwogCiAJbWVtY3B5KHRhZywgc3NpZCwgc3NpZF9sZW4pOwogCiAJdGFnICs9IHNzaWRfbGVuOwogCiAJKih0YWcrKykgPSBNRklFX1RZUEVfUkFURVM7Ci0JKih0YWcrKykgPSByYXRlX2xlbi0yOwotCW1lbWNweSh0YWcsaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzLHJhdGVfbGVuLTIpOwotCXRhZys9cmF0ZV9sZW4tMjsKKwkqKHRhZysrKSA9IHJhdGVfbGVuIC0gMjsKKwltZW1jcHkodGFnLCBpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXMsIHJhdGVfbGVuLTIpOworCXRhZyArPSByYXRlX2xlbiAtIDI7CiAKIAkqKHRhZysrKSA9IE1GSUVfVFlQRV9EU19TRVQ7CiAJKih0YWcrKykgPSAxOwogCSoodGFnKyspID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7CiAKLQlpZihhdGltX2xlbil7CisJaWYgKGF0aW1fbGVuKSB7CiAJCSoodGFnKyspID0gTUZJRV9UWVBFX0lCU1NfU0VUOwogCQkqKHRhZysrKSA9IDI7Ci0JCSooKHUxNiopKHRhZykpID0gY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmF0aW1fd2luZG93KTsKLQkJdGFnKz0yOworCQkqKCh1MTYgKikodGFnKSkgPSBjcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuYXRpbV93aW5kb3cpOworCQl0YWcgKz0gMjsKIAl9CiAKLQlpZihlcnBfbGVuKXsKKwlpZiAoZXJwX2xlbikgewogCQkqKHRhZysrKSA9IE1GSUVfVFlQRV9FUlA7CiAJCSoodGFnKyspID0gMTsKIAkJKih0YWcrKykgPSAwOwogCX0KIAotCWlmKHJhdGVfZXhfbGVuKXsKKwlpZiAocmF0ZV9leF9sZW4pIHsKIAkJKih0YWcrKykgPSBNRklFX1RZUEVfUkFURVNfRVg7CiAJCSoodGFnKyspID0gcmF0ZV9leF9sZW4tMjsKLQkJbWVtY3B5KHRhZyxpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXgscmF0ZV9leF9sZW4tMik7Ci0JCXRhZys9cmF0ZV9leF9sZW4tMjsKKwkJbWVtY3B5KHRhZywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4LCByYXRlX2V4X2xlbi0yKTsKKwkJdGFnICs9IHJhdGVfZXhfbGVuIC0gMjsKIAl9CiAKLQlpZiAod3BhX2llX2xlbikKLQl7Ci0JCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCi0JCXsvL2FzIFdpbmRvd3Mgd2lsbCBzZXQgcGFpcndpc2Uga2V5IHNhbWUgYXMgdGhlIGdyb3VwIGtleSB3aGljaCBpcyBub3QgYWxsb3dlZCBpbiBMaW51eCwgc28gc2V0IHRoaXMgZm9yIElPVCBpc3N1ZS4gV0IgMjAwOC4wNy4wNworCWlmICh3cGFfaWVfbGVuKQl7CisJCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKKwkJCS8qIGFzIFdpbmRvd3Mgd2lsbCBzZXQgcGFpcndpc2Uga2V5IHNhbWUgYXMgdGhlIGdyb3VwCisJCQkgKiBrZXkgd2hpY2ggaXMgbm90IGFsbG93ZWQgaW4gTGludXgsIHNvIHNldCB0aGlzIGZvcgorCQkJICogSU9UIGlzc3VlLgorCQkJICovCiAJCQltZW1jcHkoJmllZWUtPndwYV9pZVsxNF0sICZpZWVlLT53cGFfaWVbOF0sIDQpOwogCQl9CiAKIAkJbWVtY3B5KHRhZywgaWVlZS0+d3BhX2llLCBpZWVlLT53cGFfaWVfbGVuKTsKIAl9Ci0KIAlza2ItPmRldiA9IGllZWUtPmRldjsKIAlyZXR1cm4gc2tiOwogfQpAQCAtODg4LDkgKzc2OCw5IEBACiAJCQkJCSAgICB1OCAqZGVzdCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXU4KiB0YWc7CisJdTggKnRhZzsKIAotCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQ7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICphc3NvYzsKIAlzaG9ydCBlbmNyeXB0OwogCkBAIC05MDMsMzQgKzc4MywzNiBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWFzc29jID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKikKLQkJc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUpKTsKKwkJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSk7CiAKIAlhc3NvYy0+aGVhZGVyLmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVTUCk7Ci0JbWVtY3B5KGFzc29jLT5oZWFkZXIuYWRkcjEsIGRlc3QsRVRIX0FMRU4pOworCW1lbWNweShhc3NvYy0+aGVhZGVyLmFkZHIxLCBkZXN0LCBFVEhfQUxFTik7CiAJbWVtY3B5KGFzc29jLT5oZWFkZXIuYWRkcjMsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIAltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCWFzc29jLT5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiA/CiAJCVdMQU5fQ0FQQUJJTElUWV9CU1MgOiBXTEFOX0NBUEFCSUxJVFlfSUJTUyk7CiAKLQotCWlmKGllZWUtPnNob3J0X3Nsb3QpCisJaWYgKGllZWUtPnNob3J0X3Nsb3QpCiAJCWFzc29jLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKTsKIAogCWlmIChpZWVlLT5ob3N0X2VuY3J5cHQpCiAJCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKLQllbHNlIGNyeXB0ID0gTlVMTDsKKwllbHNlCisJCWNyeXB0ID0gTlVMTDsKIAotCWVuY3J5cHQgPSAoIGNyeXB0ICYmIGNyeXB0LT5vcHMpOworCWVuY3J5cHQgPSAoY3J5cHQgJiYgY3J5cHQtPm9wcyk7CiAKIAlpZiAoZW5jcnlwdCkKIAkJYXNzb2MtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOwogCiAJYXNzb2MtPnN0YXR1cyA9IDA7CiAJYXNzb2MtPmFpZCA9IGNwdV90b19sZTE2KGllZWUtPmFzc29jX2lkKTsKLQlpZiAoaWVlZS0+YXNzb2NfaWQgPT0gMHgyMDA3KSBpZWVlLT5hc3NvY19pZD0wOwotCWVsc2UgaWVlZS0+YXNzb2NfaWQrKzsKKwlpZiAoaWVlZS0+YXNzb2NfaWQgPT0gMHgyMDA3KQorCQlpZWVlLT5hc3NvY19pZCA9IDA7CisJZWxzZQorCQlpZWVlLT5hc3NvY19pZCsrOwogCi0JdGFnID0gKHU4Kikgc2tiX3B1dChza2IsIHJhdGVfbGVuKTsKKwl0YWcgPSAodTggKikgc2tiX3B1dChza2IsIHJhdGVfbGVuKTsKIAogCWllZWU4MDIxMV9NRklFX0JyYXRlKGllZWUsICZ0YWcpOwogCWllZWU4MDIxMV9NRklFX0dyYXRlKGllZWUsICZ0YWcpOwpAQCAtOTYyLDIxICs4NDQsMTkgQEAKIAltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIxLCBkZXN0LCBFVEhfQUxFTik7CiAJYXV0aC0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BVVRIKTsKIAlyZXR1cm4gc2tiOwotCi0KIH0KIAogc3RhdGljIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfbnVsbF9mdW5jKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBwd3IpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciogaGRyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoZHI7CiAKIAlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpOwogCiAJaWYgKCFza2IpCiAJCXJldHVybiBOVUxMOwogCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKilza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CiAKIAltZW1jcHkoaGRyLT5hZGRyMSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CiAJbWVtY3B5KGhkci0+YWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKQEAgLTk4Nyw4MyArODY3LDY0IEBACiAJCShwd3IgPyBJRUVFODAyMTFfRkNUTF9QTTowKSk7CiAKIAlyZXR1cm4gc2tiOwotCi0KIH0KIAotCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfcmVzcF90b19hc3NvY19ycShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGllZWU4MDIxMV9hc3NvY19yZXNwKGllZWUsIGRlc3QpOwogCi0JaWYgKGJ1Zil7CisJaWYgKGJ1ZikgewogCQlzb2Z0bWFjX21nbXRfeG1pdChidWYsIGllZWUpOwotCQlkZXZfa2ZyZWVfc2tiX2FueShidWYpOy8vZWRpdCBieSB0aG9tYXMKKwkJZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKIAl9CiB9CiAKLQogc3RhdGljIHZvaWQgaWVlZTgwMjExX3Jlc3BfdG9fYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IHMsIHU4ICpkZXN0KQogewogCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfYXV0aF9yZXNwKGllZWUsIHMsIGRlc3QpOwogCi0JaWYgKGJ1Zil7CisJaWYgKGJ1ZikgewogCQlzb2Z0bWFjX21nbXRfeG1pdChidWYsIGllZWUpOwotCQlkZXZfa2ZyZWVfc2tiX2FueShidWYpOy8vZWRpdCBieSB0aG9tYXMKKwkJZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKIAl9CiB9CiAKLQogc3RhdGljIHZvaWQgaWVlZTgwMjExX3Jlc3BfdG9fcHJvYmUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0KQogewotCiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGllZWU4MDIxMV9wcm9iZV9yZXNwKGllZWUsIGRlc3QpOwogCiAJaWYgKGJ1ZikgewogCQlzb2Z0bWFjX21nbXRfeG1pdChidWYsIGllZWUpOwotCQlkZXZfa2ZyZWVfc2tiX2FueShidWYpOy8vZWRpdCBieSB0aG9tYXMKKwkJZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKIAl9CiB9CiAKLQogaW5saW5lIHN0cnVjdCBza19idWZmICoKIGllZWU4MDIxMV9hc3NvY2lhdGlvbl9yZXEoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24sCiAJCQkgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCXN0cnVjdCBza19idWZmICpza2I7Ci0JLy91bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lICpoZHI7CiAJdTggKnRhZzsKLQkvL3Nob3J0IGluZm9fYWRkciA9IDA7Ci0JLy9pbnQgaTsKLQkvL3UxNiBzdWl0ZV9jb3VudCA9IDA7Ci0JLy91OCBzdWl0X3NlbGVjdCA9IDA7CiAJdW5zaWduZWQgaW50IHdwYV9sZW4gPSBiZWFjb24tPndwYV9pZV9sZW47Ci0JLy9zdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OwotCS8vdW5pb24gaXdyZXFfZGF0YSB3cnF1OwotCS8vdTggKmJ1ZmY7Ci0JLy91OCAqcDsKICNpZiAxCi0JLy8gZm9yIHRlc3RpbmcgcHVycG9zZQorCS8qIGZvciB0ZXN0aW5nIHB1cnBvc2UgKi8KIAl1bnNpZ25lZCBpbnQgcnNuX2xlbiA9IGJlYWNvbi0+cnNuX2llX2xlbjsKLSNlbHNlCi0JdW5zaWduZWQgaW50IHJzbl9sZW4gPSBiZWFjb24tPnJzbl9pZV9sZW4gLSA0OwogI2VuZGlmCiAJdW5zaWduZWQgaW50IHJhdGVfbGVuID0gaWVlZTgwMjExX01GSUVfcmF0ZV9sZW4oaWVlZSk7CiAJdW5zaWduZWQgaW50IHdtbV9pbmZvX2xlbiA9IGJlYWNvbi0+UW9TX0VuYWJsZT85OjA7CiAJdW5zaWduZWQgaW50IHR1cmJvX2luZm9fbGVuID0gYmVhY29uLT5UdXJib19FbmFibGU/OTowOwogCiAJdTggIGVuY3J5X3Byb3RvID0gaWVlZS0+d3BheF90eXBlX25vdGlmeSAmIDB4ZmY7Ci0JLy91OCAgcGFpcndpc2VfdHlwZSA9IChpZWVlLT53cGF4X3R5cGVfbm90aWZ5ID4+IDgpICYgMHhmZjsKLQkvL3U4ICBhdXRoZW5fdHlwZSA9IChpZWVlLT53cGF4X3R5cGVfbm90aWZ5ID4+IDE2KSAmIDB4ZmY7CiAKIAlpbnQgbGVuID0gMDsKIAotCS8vWzBdIE5vdGlmeSB0eXBlIG9mIGVuY3J5cHRpb246IFdQQS9XUEEyCi0JLy9bMV0gcGFpciB3aXNlIHR5cGUKLQkvL1syXSBhdXRoZW4gdHlwZQotCWlmKGllZWUtPndwYXhfdHlwZV9zZXQpIHsKKwkvKiBbMF0gTm90aWZ5IHR5cGUgb2YgZW5jcnlwdGlvbjogV1BBL1dQQTIKKwkgKiBbMV0gcGFpciB3aXNlIHR5cGUKKwkgKiBbMl0gYXV0aGVuIHR5cGUKKwkgKi8KKwlpZiAoaWVlZS0+d3BheF90eXBlX3NldCkgewogCQlpZiAoSUVFRV9QUk9UT19XUEEgPT0gZW5jcnlfcHJvdG8pIHsKIAkJCXJzbl9sZW4gPSAwOwogCQl9IGVsc2UgaWYgKElFRUVfUFJPVE9fUlNOID09IGVuY3J5X3Byb3RvKSB7CkBAIC0xMDcxLDggKzkzMiw4IEBACiAJCX0KIAl9CiAJbGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSkrCi0JCSsgYmVhY29uLT5zc2lkX2xlbi8vZXNzaWQgdGFnZ2VkIHZhbAotCQkrIHJhdGVfbGVuLy9yYXRlcyB0YWdnZWQgdmFsCisJCSsgYmVhY29uLT5zc2lkX2xlbiAvKiBlc3NpZCB0YWdnZWQgdmFsICovCisJCSsgcmF0ZV9sZW4gLyogcmF0ZXMgdGFnZ2VkIHZhbCAqLwogCQkrIHdwYV9sZW4KIAkJKyByc25fbGVuCiAJCSsgd21tX2luZm9fbGVuCkBAIC0xMDg2LDI0ICs5NDcsMjMgQEAKIAloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lICopCiAJCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lKSk7CiAKLQogCWhkci0+aGVhZGVyLmZyYW1lX2NvbnRyb2wgPSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVROwotCWhkci0+aGVhZGVyLmR1cmF0aW9uX2lkPSAzNzsgLy9GSVhNRQorCWhkci0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMzc7IC8qIEZJWE1FICovCiAJbWVtY3B5KGhkci0+aGVhZGVyLmFkZHIxLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CiAJbWVtY3B5KGhkci0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAJbWVtY3B5KGhkci0+aGVhZGVyLmFkZHIzLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7Ci0JbWVtY3B5KGllZWUtPmFwX21hY19hZGRyLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7Ly9mb3IgSFcgc2VjdXJpdHksIEpvaG4KKwltZW1jcHkoaWVlZS0+YXBfbWFjX2FkZHIsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsgLyogZm9yIEhXIHNlY3VyaXR5ICovCiAKIAloZHItPmNhcGFiaWxpdHkgPSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfQlNTKTsKLQlpZiAoYmVhY29uLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kgKQorCWlmIChiZWFjb24tPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkKIAkJaGRyLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKTsKIAlpZiAoYmVhY29uLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKQogCQloZHItPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKTsKIAotCWlmKGllZWUtPnNob3J0X3Nsb3QpCisJaWYgKGllZWUtPnNob3J0X3Nsb3QpCiAJCWhkci0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCk7CiAKLQloZHItPmxpc3Rlbl9pbnRlcnZhbCA9IDB4YTsgLy9GSVhNRQorCWhkci0+bGlzdGVuX2ludGVydmFsID0gMHhhOyAvKiBGSVhNRSAqLwogCiAJaGRyLT5pbmZvX2VsZW1lbnQuaWQgPSBNRklFX1RZUEVfU1NJRDsKIApAQCAtMTExNiwyNyArOTc2LDI2IEBACiAJaWVlZTgwMjExX01GSUVfQnJhdGUoaWVlZSwgJnRhZyk7CiAJaWVlZTgwMjExX01GSUVfR3JhdGUoaWVlZSwgJnRhZyk7CiAKLQkvL2FkZCByc249PTAgY29uZGl0aW9uIGZvciBhcCdzIG1peCBzZWN1cml0eSBtb2RlKHdwYSt3cGEyKSwgam9objIwMDcuOC45Ci0JLy9jaG9vc2UgQUVTIGVuY3J5cHRpb24gYXMgZGVmYXVsdCBhbGdvcml0aG0gd2hpbGUgdXNpbmcgbWl4ZWQgbW9kZQorCS8qIGFkZCByc249PTAgY29uZGl0aW9uIGZvciBhcCdzIG1peCBzZWN1cml0eSBtb2RlKHdwYSt3cGEyKQorCSAqIGNob29zZSBBRVMgZW5jcnlwdGlvbiBhcyBkZWZhdWx0IGFsZ29yaXRobSB3aGlsZSB1c2luZyBtaXhlZCBtb2RlLgorCSAqLwogCi0JdGFnID0gc2tiX3B1dChza2IsaWVlZS0+d3BhX2llX2xlbik7Ci0JbWVtY3B5KHRhZyxpZWVlLT53cGFfaWUsaWVlZS0+d3BhX2llX2xlbik7CisJdGFnID0gc2tiX3B1dChza2IsIGllZWUtPndwYV9pZV9sZW4pOworCW1lbWNweSh0YWcsIGllZWUtPndwYV9pZSwgaWVlZS0+d3BhX2llX2xlbik7CiAKLQl0YWcgPSBza2JfcHV0KHNrYix3bW1faW5mb19sZW4pOwotCWlmKHdtbV9pbmZvX2xlbikgeworCXRhZyA9IHNrYl9wdXQoc2tiLCB3bW1faW5mb19sZW4pOworCWlmICh3bW1faW5mb19sZW4pCiAJICBpZWVlODAyMTFfV01NX0luZm8oaWVlZSwgJnRhZyk7Ci0JfQotCXRhZyA9IHNrYl9wdXQoc2tiLHR1cmJvX2luZm9fbGVuKTsKLSAgICAgICAgaWYodHVyYm9faW5mb19sZW4pIHsKLSAgICAgICAgICAgICAgICBpZWVlODAyMTFfVFVSQk9fSW5mbyhpZWVlLCAmdGFnKTsKLSAgICAgICAgfQorCisJdGFnID0gc2tiX3B1dChza2IsIHR1cmJvX2luZm9fbGVuKTsKKwlpZiAodHVyYm9faW5mb19sZW4pCisJCWllZWU4MDIxMV9UVVJCT19JbmZvKGllZWUsICZ0YWcpOwogCiAJcmV0dXJuIHNrYjsKIH0KIAogdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCkBAIC0xMTQ4LDE3ICsxMDA3LDE3IEBACiAJICogSGVyZSB3ZSB3aWxsIGNoZWNrIGlmIHRoZXJlIGFyZSBnb29kIG5ldHMgdG8gYXNzb2NpYXRlCiAJICogd2l0aCwgc28gd2UgcmV0cnkgb3IganVzdCBnZXQgYmFjayB0byBOT19MSU5LIGFuZCBzY2FubmluZwogCSAqLwotCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcpeworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcpIHsKIAkJSUVFRTgwMjExX0RFQlVHX01HTVQoIkF1dGhlbnRpY2F0aW9uIGZhaWxlZFxuIik7CiAJCWllZWUtPnNvZnRtYWNfc3RhdHMubm9fYXV0aF9ycysrOwotCX1lbHNleworCX0gZWxzZSB7CiAJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJBc3NvY2lhdGlvbiBmYWlsZWRcbiIpOwogCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLm5vX2Fzc19ycysrOwogCX0KIAogCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HX1JFVFJZOwogCi0JcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxLElFRUU4MDIxMV9TT0ZUTUFDX0FTU09DX1JFVFJZX1RJTUUpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSwgSUVFRTgwMjExX1NPRlRNQUNfQVNTT0NfUkVUUllfVElNRSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiB9CkBAIC0xMTY4LDcgKzEwMjcsNiBAQAogCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopIGRldik7CiB9CiAKLQogc3RhdGljIHZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CkBAIC0xMTc2LDI2ICsxMDM0LDI0IEBACiAKIAlJRUVFODAyMTFfREVCVUdfTUdNVCgiU3RvcHBpbmcgc2NhblxuIik7CiAJaWVlZS0+c29mdG1hY19zdGF0cy50eF9hdXRoX3JxKys7Ci0Jc2tiPWllZWU4MDIxMV9hdXRoZW50aWNhdGlvbl9yZXEoYmVhY29uLCBpZWVlLCAwKTsKLQlpZiAoIXNrYil7Ci0KKwlza2IgPSBpZWVlODAyMTFfYXV0aGVudGljYXRpb25fcmVxKGJlYWNvbiwgaWVlZSwgMCk7CisJaWYgKCFza2IpIHsKIAkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKLQl9Ci0JZWxzZXsKLQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcgOworCX0gZWxzZSB7CisJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HOwogCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiU2VuZGluZyBhdXRoZW50aWNhdGlvbiByZXF1ZXN0XG4iKTsKLQkJLy9wcmludGsoIi0tLVNlbmRpbmcgYXV0aGVudGljYXRpb24gcmVxdWVzdFxuIik7CiAJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7Ci0JCS8vQlVHT04gd2hlbiB5b3UgdHJ5IHRvIGFkZF90aW1lciB0d2ljZSwgdXNpbmcgbW9kX3RpbWVyIG1heSBiZSBiZXR0ZXIsIGpvaG4wNzA5Ci0JCWlmKCF0aW1lcl9wZW5kaW5nKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpKXsKKwkJLyogQlVHT04gd2hlbiB5b3UgdHJ5IHRvIGFkZF90aW1lciB0d2ljZSwgdXNpbmcgbW9kX3RpbWVyIG1heQorCQkgKiBiZSBiZXR0ZXIuCisJCSAqLworCQlpZiAoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmFzc29jaWF0ZV90aW1lcikpIHsKIAkJCWllZWUtPmFzc29jaWF0ZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIChIWiAvIDIpOwogCQkJYWRkX3RpbWVyKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwogCQl9Ci0JCS8vSWYgY2FsbCBkZXZfa2ZyZWVfc2tiX2FueSxhIHdhcm5pbmcgd2lsbCBvY3VyLi4uLgotCQkvL0tFUk5FTDogYXNzZXJ0aW9uICghYXRvbWljX3JlYWQoJnNrYi0+dXNlcnMpKSBmYWlsZWQgYXQgbmV0L2NvcmUvZGV2LmMgKDE3MDgpCi0JCS8vU28gLi4uIDEyMDQgYnkgbGF3cmVuY2UuCi0JCS8vcHJpbnRrKCJcbkluICVzLGxpbmUgJWQgY2FsbCBrZnJlZSBza2IuIixfX2Z1bmNfXyxfX0xJTkVfXyk7Ci0JCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJCS8qIElmIGNhbGwgZGV2X2tmcmVlX3NrYl9hbnksYSB3YXJuaW5nIHdpbGwgb2N1ci4uLi4KKwkJICogS0VSTkVMOiBhc3NlcnRpb24gKCFhdG9taWNfcmVhZCgmc2tiLT51c2VycykpIGZhaWxlZCBhdAorCQkgKiBuZXQvY29yZS9kZXYuYyAoMTcwOCkKKwkJICovCiAJfQogfQogCkBAIC0xMjA1LDcgKzEwNjEsNiBAQAogCXU4ICpjOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24gPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOwotLy8JaW50IGhsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbik7CiAJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CiAJaWVlZS0+YXNzb2NpYXRlX3NlcSsrOwogCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfYXV0aF9ycSsrOwpAQCAtMTIxMyw3ICsxMDY4LDcgQEAKIAlza2IgPSBpZWVlODAyMTFfYXV0aGVudGljYXRpb25fcmVxKGJlYWNvbiwgaWVlZSwgY2hsZW4rMik7CiAJaWYgKCFza2IpCiAJCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoaWVlZSk7Ci0JZWxzZXsKKwllbHNlIHsKIAkJYyA9IHNrYl9wdXQoc2tiLCBjaGxlbisyKTsKIAkJKihjKyspID0gTUZJRV9UWVBFX0NIQUxMRU5HRTsKIAkJKihjKyspID0gY2hsZW47CkBAIC0xMjIxLDM4ICsxMDc2LDM2IEBACiAKIAkJSUVFRTgwMjExX0RFQlVHX01HTVQoIlNlbmRpbmcgYXV0aGVudGljYXRpb24gY2hhbGxlbmdlIHJlc3BvbnNlXG4iKTsKIAotCQlpZWVlODAyMTFfZW5jcnlwdF9mcmFnbWVudChpZWVlLCBza2IsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKSk7CisJCWllZWU4MDIxMV9lbmNyeXB0X2ZyYWdtZW50KGllZWUsIHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CiAKIAkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKLQkJaWYgKCF0aW1lcl9wZW5kaW5nKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpKXsKLQkJLy9wcmludGsoIj09PT09PT09PT5hZGQgdGltZXIgYWdhaW4sIHRvIGNyYXNoXG4iKTsKKwkJaWYgKCF0aW1lcl9wZW5kaW5nKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpKSB7CiAJCWllZWUtPmFzc29jaWF0ZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIChIWiAvIDIpOwogCQlhZGRfdGltZXIoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CiAJCX0KLQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJfQogCWtmcmVlKGNoYWxsZW5nZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDIoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYqIHNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKIAogCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwogCiAJSUVFRTgwMjExX0RFQlVHX01HTVQoIlNlbmRpbmcgYXNzb2NpYXRpb24gcmVxdWVzdFxuIik7CiAJaWVlZS0+c29mdG1hY19zdGF0cy50eF9hc3NfcnErKzsKLQlza2I9aWVlZTgwMjExX2Fzc29jaWF0aW9uX3JlcShiZWFjb24sIGllZWUpOworCXNrYiA9IGllZWU4MDIxMV9hc3NvY2lhdGlvbl9yZXEoYmVhY29uLCBpZWVlKTsKIAlpZiAoIXNrYikKIAkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKLQllbHNleworCWVsc2UgewogCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwotCQlpZiAoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmFzc29jaWF0ZV90aW1lcikpeworCQlpZiAoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmFzc29jaWF0ZV90aW1lcikpIHsKIAkJaWVlZS0+YXNzb2NpYXRlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaIC8gMik7CiAJCWFkZF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKIAkJfQotCQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcwogCX0KIH0KIApAQCAtMTI2MSwxMiArMTExNCwxMSBAQAogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBhc3NvY2lhdGVfY29tcGxldGVfd3EpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiQXNzb2NpYXRlZCBzdWNjZXNzZnVsbHlcbiIpOwotCWlmKGllZWU4MDIxMV9pc181NGcoJmllZWUtPmN1cnJlbnRfbmV0d29yaykgJiYKLQkJKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKSl7Ci0KKwlpZiAoaWVlZTgwMjExX2lzXzU0ZygmaWVlZS0+Y3VycmVudF9uZXR3b3JrKSAmJgorCQkoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pKSB7CiAJCWllZWUtPnJhdGUgPSA1NDA7CiAJCXByaW50ayhLRVJOX0lORk8iVXNpbmcgRyByYXRlc1xuIik7Ci0JfWVsc2V7CisJfSBlbHNlIHsKIAkJaWVlZS0+cmF0ZSA9IDExMDsKIAkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBCIHJhdGVzXG4iKTsKIAl9CkBAIC0xMjc5LDEyICsxMTMxLDggQEAKIAogc3RhdGljIHZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQlpbnQgaTsKIAlkZWxfdGltZXJfc3luYygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKIAotCWZvcihpID0gMDsgaSA8IDY7IGkrKykgewotCSAgLy9pZWVlLT5zZXFfY3RybFtpXSA9IDA7Ci0JfQogCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRDsKIAlJRUVFODAyMTFfREVCVUdfTUdNVCgiU3VjY2Vzc2Z1bGx5IGFzc29jaWF0ZWRcbiIpOwogCkBAIC0xMzE2LDcgKzExNjQsNyBAQAogCXU4IHRtcF9zc2lkW0lXX0VTU0lEX01BWF9TSVpFKzFdOwogCWludCB0bXBfc3NpZF9sZW4gPSAwOwogCi0Jc2hvcnQgYXBzZXQsc3NpZHNldCxzc2lkYnJvYWQsYXBtYXRjaCxzc2lkbWF0Y2g7CisJc2hvcnQgYXBzZXQsIHNzaWRzZXQsIHNzaWRicm9hZCwgYXBtYXRjaCwgc3NpZG1hdGNoOwogCiAJLyogd2UgYXJlIGludGVyZXN0ZWQgaW4gbmV3IG5ldyBvbmx5IGlmIHdlIGFyZSBub3QgYXNzb2NpYXRlZAogCSAqIGFuZCB3ZSBhcmUgbm90IGFzc29jaWF0aW5nIC8gYXV0aGVudGljYXRpbmcKQEAgLTEzMzAsNzQgKzExNzgsNzAgQEAKIAlpZiAoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgJiYgIShuZXQtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykpCiAJCXJldHVybjsKIAotCi0JaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSB8fCBpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpeworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEgfHwgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CiAJCS8qIGlmIHRoZSB1c2VyIHNwZWNpZmllZCB0aGUgQVAgTUFDLCB3ZSBuZWVkIGFsc28gdGhlIGVzc2lkCiAJCSAqIFRoaXMgY291bGQgYmUgb2J0YWluZWQgYnkgYmVhY29ucyBvciwgaWYgdGhlIG5ldHdvcmsgZG9lcyBub3QKIAkJICogYnJvYWRjYXN0IGl0LCBpdCBjYW4gYmUgcHV0IG1hbnVhbGx5LgogCQkgKi8KLQkJYXBzZXQgPSBpZWVlLT53YXBfc2V0Oy8vKG1lbWNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIHplcm8sRVRIX0FMRU4pIT0wICk7Ci0JCXNzaWRzZXQgPSBpZWVlLT5zc2lkX3NldDsvL2llZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkWzBdICE9ICdcMCc7Ci0JCXNzaWRicm9hZCA9ICAhKG5ldC0+c3NpZF9sZW4gPT0gMCB8fCBuZXQtPnNzaWRbMF09PSAnXDAnKTsKLQkJYXBtYXRjaCA9IChtZW1jbXAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBuZXQtPmJzc2lkLCBFVEhfQUxFTik9PTApOworCQlhcHNldCA9IGllZWUtPndhcF9zZXQ7CisJCXNzaWRzZXQgPSBpZWVlLT5zc2lkX3NldDsKKwkJc3NpZGJyb2FkID0gICEobmV0LT5zc2lkX2xlbiA9PSAwIHx8IG5ldC0+c3NpZFswXSA9PSAnXDAnKTsKKwkJYXBtYXRjaCA9IChtZW1jbXAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBuZXQtPmJzc2lkLCBFVEhfQUxFTikgPT0gMCk7CiAKLQkJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuICE9IG5ldC0+c3NpZF9sZW4pCisJCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gIT0gbmV0LT5zc2lkX2xlbikKIAkJCXNzaWRtYXRjaCA9IDA7CiAJCWVsc2UKLQkJCXNzaWRtYXRjaCA9ICgwPT1zdHJuY21wKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBuZXQtPnNzaWQsIG5ldC0+c3NpZF9sZW4pKTsKKwkJCXNzaWRtYXRjaCA9ICgwID09IHN0cm5jbXAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIG5ldC0+c3NpZCwgbmV0LT5zc2lkX2xlbikpOwogCi0JCS8vcHJpbnRrKCJjdXI6ICVzLCAlZCwgbmV0OiVzLCAlZFxuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiwgbmV0LT5zc2lkLCBuZXQtPnNzaWRfbGVuKTsKLQkJLy9wcmludGsoImFwc2V0PSVkIGFwbWF0Y2g9JWQgc3NpZHNldD0lZCBzc2lkYnJvYWQ9JWQgc3NpZG1hdGNoPSVkXG4iLGFwc2V0LGFwbWF0Y2gsc3NpZHNldCxzc2lkYnJvYWQsc3NpZG1hdGNoKTsKLQotCQlpZiAoCS8qIGlmIHRoZSB1c2VyIHNldCB0aGUgQVAgY2hlY2sgaWYgbWF0Y2guCi0JCQkgKiBpZiB0aGUgbmV0d29yayBkb2VzIG5vdCBicm9hZGNhc3QgZXNzaWQgd2UgY2hlY2sgdGhlIHVzZXIgc3VwcGxpZWQgQU5ZIGVzc2lkCi0JCQkgKiBpZiB0aGUgbmV0d29yayBkb2VzIGJyb2FkY2FzdCBhbmQgdGhlIHVzZXIgZG9lcyBub3Qgc2V0IGVzc2lkIGl0IGlzIE9LCi0JCQkgKiBpZiB0aGUgbmV0d29yayBkb2VzIGJyb2FkY2FzdCBhbmQgdGhlIHVzZXIgZGlkIHNldCBlc3NpZCBjaGVjaCBpZiBlc3NpZCBtYXRjaAotCQkJICovCi0JCQkJKCBhcHNldCAmJiBhcG1hdGNoICYmCi0JCQkJICAoKHNzaWRzZXQgJiYgc3NpZGJyb2FkICYmIHNzaWRtYXRjaCkgfHwgKHNzaWRicm9hZCAmJiAhc3NpZHNldCkgfHwgKCFzc2lkYnJvYWQgJiYgc3NpZHNldCkpICkgfHwKLQkJCQkvKiBpZiB0aGUgYXAgaXMgbm90IHNldCwgY2hlY2sgdGhhdCB0aGUgdXNlciBzZXQgdGhlIGJzc2lkCi0JCQkJICogYW5kIHRoZSBuZXR3b3JrIGRvZXMgYnJvYWRjYXN0IGFuZCB0aGF0IHRob3NlIHR3byBic3NpZCBtYXRjaGVzCi0JCQkJICovCi0JCQkJKCFhcHNldCAmJiBzc2lkc2V0ICYmIHNzaWRicm9hZCAmJiBzc2lkbWF0Y2gpCi0JCSAgICl7Ci0KLQorCQkvKiBpZiB0aGUgdXNlciBzZXQgdGhlIEFQIGNoZWNrIGlmIG1hdGNoLgorCQkgKiBpZiB0aGUgbmV0d29yayBkb2VzIG5vdCBicm9hZGNhc3QgZXNzaWQgd2UgY2hlY2sgdGhlIHVzZXIKKwkJICogc3VwcGxpZWQgQU5ZIGVzc2lkCisJCSAqIGlmIHRoZSBuZXR3b3JrIGRvZXMgYnJvYWRjYXN0IGFuZCB0aGUgdXNlciBkb2VzIG5vdCBzZXQgZXNzaWQKKwkJICogaXQgaXMgT0sKKwkJICogaWYgdGhlIG5ldHdvcmsgZG9lcyBicm9hZGNhc3QgYW5kIHRoZSB1c2VyIGRpZCBzZXQgZXNzaWQKKwkJICogY2hlY2ggaWYgZXNzaWQgbWF0Y2gKKwkJICogKGFwc2V0ICYmIGFwbWF0Y2ggJiYgKChzc2lkc2V0ICYmIHNzaWRicm9hZCAmJiBzc2lkbWF0Y2gpIHx8CisJCSAqICAoc3NpZGJyb2FkICYmICFzc2lkc2V0KSB8fCAoIXNzaWRicm9hZCAmJiBzc2lkc2V0KSkpIHx8CisJCSAqIGlmIHRoZSBhcCBpcyBub3Qgc2V0LCBjaGVjayB0aGF0IHRoZSB1c2VyIHNldCB0aGUgYnNzaWQgYW5kCisJCSAqIHRoZSBuZXR3b3JrIGRvZXMgYnJvYWRjYXN0IGFuZCB0aGF0IHRob3NlIHR3byBic3NpZCBtYXRjaGVzCisJCSAqICghYXBzZXQgJiYgc3NpZHNldCAmJiBzc2lkYnJvYWQgJiYgc3NpZG1hdGNoKQorCQkgKi8KKwkJaWYgKChhcHNldCAmJiBhcG1hdGNoICYmICgoc3NpZHNldCAmJiBzc2lkYnJvYWQgJiYgc3NpZG1hdGNoKSB8fAorCQkgICAgIChzc2lkYnJvYWQgJiYgIXNzaWRzZXQpIHx8ICghc3NpZGJyb2FkICYmIHNzaWRzZXQpKSkgfHwKKwkJICAgICghYXBzZXQgJiYgc3NpZHNldCAmJiBzc2lkYnJvYWQgJiYgc3NpZG1hdGNoKSkgewogCQkJLyogaWYgdGhlIGVzc2lkIGlzIGhpZGRlbiByZXBsYWNlIGl0IHdpdGggdGhlCiAJCQkgKiBlc3NpZCBwcm92aWRlZCBieSB0aGUgdXNlci4KIAkJCSAqLwotCQkJaWYgKCFzc2lkYnJvYWQpeworCQkJaWYgKCFzc2lkYnJvYWQpIHsKIAkJCQlzdHJuY3B5KHRtcF9zc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgSVdfRVNTSURfTUFYX1NJWkUpOwogCQkJCXRtcF9zc2lkX2xlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbjsKIAkJCX0KIAkJCW1lbWNweSgmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCBuZXQsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspKTsKIAotCQkJaWYgKCFzc2lkYnJvYWQpeworCQkJaWYgKCFzc2lkYnJvYWQpIHsKIAkJCQlzdHJuY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCB0bXBfc3NpZCwgSVdfRVNTSURfTUFYX1NJWkUpOwogCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IHRtcF9zc2lkX2xlbjsKIAkJCX0KLQkJCXByaW50ayhLRVJOX0lORk8iTGlua2luZyB3aXRoICVzOiBjaGFubmVsIGlzICVkXG4iLGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwkJCXByaW50ayhLRVJOX0lORk8iTGlua2luZyB3aXRoICVzOiBjaGFubmVsIGlzICVkXG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOwogCi0JCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKKwkJCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKIAkJCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElORzsKIAkJCQlpZWVlLT5iZWlucmV0cnkgPSBmYWxzZTsKIAkJCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7Ci0JCQl9ZWxzZXsKLQkJCQlpZihpZWVlODAyMTFfaXNfNTRnKCZpZWVlLT5jdXJyZW50X25ldHdvcmspICYmCi0JCQkJCQkoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pKXsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGllZWU4MDIxMV9pc181NGcoJmllZWUtPmN1cnJlbnRfbmV0d29yaykgJiYKKwkJCQkJCShpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikpIHsKIAkJCQkJaWVlZS0+cmF0ZSA9IDU0MDsKIAkJCQkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBHIHJhdGVzXG4iKTsKLQkJCQl9ZWxzZXsKKwkJCQl9IGVsc2UgewogCQkJCQlpZWVlLT5yYXRlID0gMTEwOwogCQkJCQlwcmludGsoS0VSTl9JTkZPIlVzaW5nIEIgcmF0ZXNcbiIpOwogCQkJCX0KIAkJCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7CiAJCQkJaWVlZS0+YmVpbnJldHJ5ID0gZmFsc2U7CiAJCQl9Ci0KIAkJfQogCX0KLQogfQogCiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQpAQCAtMTQwNyw2MCArMTI1MSw1MiBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgewotCiAJCS8qIGlmIHRoZSBzdGF0ZSBiZWNvbWUgZGlmZmVyZW50IHRoYXQgTk9MSU5LIG1lYW5zCiAJCSAqIHdlIGhhZCBmb3VuZCB3aGF0IHdlIGFyZSBzZWFyY2hpbmcgZm9yCiAJCSAqLwotCiAJCWlmIChpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTk9MSU5LKQogCQkJYnJlYWs7CiAKIAkJaWYgKGllZWUtPnNjYW5fYWdlID09IDAgfHwgdGltZV9hZnRlcih0YXJnZXQtPmxhc3Rfc2Nhbm5lZCArIGllZWUtPnNjYW5fYWdlLCBqaWZmaWVzKSkKIAkJCWllZWU4MDIxMV9zb2Z0bWFjX25ld19uZXQoaWVlZSwgdGFyZ2V0KTsKIAl9Ci0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Ci0KIH0KIAotCiBzdGF0aWMgaW5saW5lIHUxNiBhdXRoX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIHU4ICoqY2hhbGxlbmdlLCBpbnQgKmNobGVuKQogewogCXN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKmE7CiAJdTggKnQ7Ci0JaWYgKHNrYi0+bGVuIDwgIChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiktc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50KSkpewotCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXNwOiAlZFxuIixza2ItPmxlbik7CisJaWYgKHNrYi0+bGVuIDwgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSAtIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCkpKSB7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlc3A6ICVkXG4iLCBza2ItPmxlbik7CiAJCXJldHVybiAweGNhZmU7CiAJfQogCSpjaGFsbGVuZ2UgPSBOVUxMOwotCWEgPSAoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiopIHNrYi0+ZGF0YTsKLQlpZihza2ItPmxlbiA+IChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbikgKzMpKXsKKwlhID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKikgc2tiLT5kYXRhOworCWlmIChza2ItPmxlbiA+IChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbikgKyAzKSkgewogCQl0ID0gc2tiLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pOwogCi0JCWlmKCoodCsrKSA9PSBNRklFX1RZUEVfQ0hBTExFTkdFKXsKKwkJaWYgKCoodCsrKSA9PSBNRklFX1RZUEVfQ0hBTExFTkdFKSB7CiAJCQkqY2hsZW4gPSAqKHQrKyk7CiAJCQkqY2hhbGxlbmdlID0ga21lbWR1cCh0LCAqY2hsZW4sIEdGUF9BVE9NSUMpOwogCQkJaWYgKCEqY2hhbGxlbmdlKQogCQkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJfQotCiAJcmV0dXJuIGNwdV90b19sZTE2KGEtPnN0YXR1cyk7Ci0KIH0KIAotCiBzdGF0aWMgaW50IGF1dGhfcnFfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKmRlc3QpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYTsKIAotCWlmIChza2ItPmxlbiA8ICAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pLXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCkpKXsKLQkJSUVFRTgwMjExX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVxdWVzdDogJWRcbiIsc2tiLT5sZW4pOworCWlmIChza2ItPmxlbiA8IChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbikgLSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpKSkgeworCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXF1ZXN0OiAlZFxuIiwgc2tiLT5sZW4pOwogCQlyZXR1cm4gLTE7CiAJfQotCWEgPSAoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiopIHNrYi0+ZGF0YTsKKwlhID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKikgc2tiLT5kYXRhOwogCi0JbWVtY3B5KGRlc3QsYS0+aGVhZGVyLmFkZHIyLCBFVEhfQUxFTik7CisJbWVtY3B5KGRlc3QsIGEtPmhlYWRlci5hZGRyMiwgRVRIX0FMRU4pOwogCiAJaWYgKGxlMTZfdG9fY3B1KGEtPmFsZ29yaXRobSkgIT0gV0xBTl9BVVRIX09QRU4pCiAJCXJldHVybiAgV0xBTl9TVEFUVVNfTk9UX1NVUFBPUlRFRF9BVVRIX0FMRzsKQEAgLTE0NzMsMjMgKzEzMDksMjMgQEAKIHsKIAl1OCAqdGFnOwogCXU4ICpza2JlbmQ7Ci0JdTggKnNzaWQ9TlVMTDsKKwl1OCAqc3NpZCA9IE5VTEw7CiAJdTggc3NpZGxlbiA9IDA7CiAKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgICpoZWFkZXIgPQogCQkoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICAqKSBza2ItPmRhdGE7CiAKLQlpZiAoc2tiLT5sZW4gPCBzaXplb2YgKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICApKQorCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpCiAJCXJldHVybiAtMTsgLyogY29ycnVwdGVkICovCiAKLQltZW1jcHkoc3JjLGhlYWRlci0+YWRkcjIsIEVUSF9BTEVOKTsKKwltZW1jcHkoc3JjLCBoZWFkZXItPmFkZHIyLCBFVEhfQUxFTik7CiAKLQlza2JlbmQgPSAodTgqKXNrYi0+ZGF0YSArIHNrYi0+bGVuOworCXNrYmVuZCA9ICh1OCAqKXNrYi0+ZGF0YSArIHNrYi0+bGVuOwogCi0JdGFnID0gc2tiLT5kYXRhICsgc2l6ZW9mIChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKTsKKwl0YWcgPSBza2ItPmRhdGEgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCi0Jd2hpbGUgKHRhZysxIDwgc2tiZW5kKXsKLQkJaWYgKCp0YWcgPT0gMCl7CisJd2hpbGUgKHRhZysxIDwgc2tiZW5kKSB7CisJCWlmICgqdGFnID09IDApIHsKIAkJCXNzaWQgPSB0YWcrMjsKIAkJCXNzaWRsZW4gPSAqKHRhZysxKTsKIAkJCWJyZWFrOwpAQCAtMTQ5OSwxMCArMTMzNSwxMiBAQAogCQl0YWcrKzsgLyogcG9pbnQgdG8gdGhlIG5leHQgdGFnICovCiAJfQogCi0JLy9JRUVFODAyMTFETUVTRygiQ2FyZCBNQUMgYWRkcmVzcyBpcyAiTUFDU1RSLCBNQUMyU1RSKHNyYykpOwotCWlmIChzc2lkbGVuID09IDApIHJldHVybiAxOworCWlmIChzc2lkbGVuID09IDApCisJCXJldHVybiAxOwogCi0JaWYgKCFzc2lkKSByZXR1cm4gMTsgLyogc3NpZCBub3QgZm91bmQgaW4gdGFnZ2VkIHBhcmFtICovCisJaWYgKCFzc2lkKQorCQkgcmV0dXJuIDE7IC8qIHNzaWQgbm90IGZvdW5kIGluIHRhZ2dlZCBwYXJhbSAqLworCiAJcmV0dXJuICghc3RybmNtcChzc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgc3NpZGxlbikpOwogCiB9CkBAIC0xNTE0LDEzICsxMzUyLDEzIEBACiAJaWYgKHNrYi0+bGVuIDwgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUpIC0KIAkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50KSkpIHsKIAotCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXF1ZXN0OiVkIFxuIiwgc2tiLT5sZW4pOworCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXF1ZXN0OiVkXG4iLCBza2ItPmxlbik7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlhID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSopIHNrYi0+ZGF0YTsKKwlhID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSAqKSBza2ItPmRhdGE7CiAKLQltZW1jcHkoZGVzdCxhLT5oZWFkZXIuYWRkcjIsRVRIX0FMRU4pOworCW1lbWNweShkZXN0LCBhLT5oZWFkZXIuYWRkcjIsIEVUSF9BTEVOKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTUyOCwxMiArMTM2NiwxMiBAQAogc3RhdGljIGlubGluZSB1MTYgYXNzb2NfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICphaWQpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqYTsKLQlpZiAoc2tiLT5sZW4gPCAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUpKXsKKwlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSkpIHsKIAkJSUVFRTgwMjExX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVzcDogJWRcbiIsIHNrYi0+bGVuKTsKIAkJcmV0dXJuIDB4Y2FmZTsKIAl9CiAKLQlhID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUqKSBza2ItPmRhdGE7CisJYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICopIHNrYi0+ZGF0YTsKIAkqYWlkID0gbGUxNl90b19jcHUoYS0+YWlkKSAmIDB4M2ZmZjsKIAlyZXR1cm4gbGUxNl90b19jcHUoYS0+c3RhdHVzKTsKIH0KQEAgLTE1NDMsMTEgKzEzODEsOCBAQAogewogCXU4IGRlc3RbRVRIX0FMRU5dOwogCi0JLy9JRUVFODAyMTFETUVTRygiUnggcHJvYmUiKTsKIAlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X3Byb2JlX3JxKys7Ci0JLy9ETUVTRygiRGVzdCBpcyAiTUFDU1RSLCBNQUMyU1RSKGRlc3QpKTsKLQlpZiAocHJvYmVfcnFfcGFyc2UoaWVlZSwgc2tiLCBkZXN0KSl7Ci0JCS8vSUVFRTgwMjExRE1FU0coIldhcyBmb3IgbWUhIik7CisJaWYgKHByb2JlX3JxX3BhcnNlKGllZWUsIHNrYiwgZGVzdCkpIHsKIAkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9wcm9iZV9ycysrOwogCQlpZWVlODAyMTFfcmVzcF90b19wcm9iZShpZWVlLCBkZXN0KTsKIAl9CkBAIC0xNTU4LDExNSArMTM5Myw5MiBAQAogewogCXU4IGRlc3RbRVRIX0FMRU5dOwogCWludCBzdGF0dXM7Ci0JLy9JRUVFODAyMTFETUVTRygiUnggcHJvYmUiKTsKIAlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnErKzsKIAogCXN0YXR1cyA9IGF1dGhfcnFfcGFyc2Uoc2tiLCBkZXN0KTsKLQlpZiAoc3RhdHVzICE9IC0xKSB7CisJaWYgKHN0YXR1cyAhPSAtMSkKIAkJaWVlZTgwMjExX3Jlc3BfdG9fYXV0aChpZWVlLCBzdGF0dXMsIGRlc3QpOwotCX0KLQkvL0RNRVNHKCJEZXN0IGlzICJNQUNTVFIsIE1BQzJTVFIoZGVzdCkpOwotCiB9CiAKLSBpbmxpbmUgdm9pZAoraW5saW5lIHZvaWQKIGllZWU4MDIxMV9yeF9hc3NvY19ycShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAogCXU4IGRlc3RbRVRIX0FMRU5dOwotCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXNzX3JxKys7Ci0JaWYgKGFzc29jX3JxX3BhcnNlKHNrYixkZXN0KSAhPSAtMSl7CisJaWYgKGFzc29jX3JxX3BhcnNlKHNrYiwgZGVzdCkgIT0gLTEpCiAJCWllZWU4MDIxMV9yZXNwX3RvX2Fzc29jX3JxKGllZWUsIGRlc3QpOwotCX0KKwogCiAJcHJpbnRrKEtFUk5fSU5GTyJOZXcgY2xpZW50IGFzc29jaWF0ZWQ6ICVwTVxuIiwgZGVzdCk7CiB9CiAKLQotCiB2b2lkIGllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBwd3IpCiB7Ci0KIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX251bGxfZnVuYyhpZWVlLCBwd3IpOwogCiAJaWYgKGJ1ZikKIAkJc29mdG1hY19wc19tZ210X3htaXQoYnVmLCBpZWVlKTsKLQogfQogCi0KIHN0YXRpYyBzaG9ydCBpZWVlODAyMTFfc3RhX3BzX3NsZWVwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1MzIgKnRpbWVfaCwKIAkJCSAgICAgdTMyICp0aW1lX2wpCiB7Ci0gICAgICAgIGludCB0aW1lb3V0ID0gMDsKKwlpbnQgdGltZW91dCA9IDA7CiAKIAl1OCBkdGltOwotCS8qaWYoaWVlZS0+cHMgPT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEIHx8Ci0JCWllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSB8fAotCQlpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKQotCi0JCXJldHVybiAwOwotCSovCiAJZHRpbSA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX2RhdGE7Ci0JLy9wcmludGsoIkRUSU1cbiIpOwogCi0JaWYoIShkdGltICYgSUVFRTgwMjExX0RUSU1fVkFMSUQpKQorCWlmICghKGR0aW0gJiBJRUVFODAyMTFfRFRJTV9WQUxJRCkpCiAJCXJldHVybiAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdGltZW91dCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWw7CisJZWxzZQorCQl0aW1lb3V0ID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbDsKIAotCS8vcHJpbnRrKCJWQUxJRFxuIik7CiAJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fZGF0YSA9IElFRUU4MDIxMV9EVElNX0lOVkFMSUQ7CiAKLQlpZihkdGltICYgKChJRUVFODAyMTFfRFRJTV9VQ0FTVCB8IElFRUU4MDIxMV9EVElNX01CQ0FTVCkmIGllZWUtPnBzKSkKKwlpZiAoZHRpbSAmICgoSUVFRTgwMjExX0RUSU1fVUNBU1QgfCBJRUVFODAyMTFfRFRJTV9NQkNBU1QpICYgaWVlZS0+cHMpKQogCQlyZXR1cm4gMjsKIAotCWlmKCF0aW1lX2FmdGVyKGppZmZpZXMsIGllZWUtPmRldi0+dHJhbnNfc3RhcnQgKyBNU0VDUyh0aW1lb3V0KSkpCisJaWYgKCF0aW1lX2FmdGVyKGppZmZpZXMsIGllZWUtPmRldi0+dHJhbnNfc3RhcnQgKyBNU0VDUyh0aW1lb3V0KSkpCiAJCXJldHVybiAwOwogCi0JaWYoIXRpbWVfYWZ0ZXIoamlmZmllcywgaWVlZS0+bGFzdF9yeF9wc190aW1lICsgTVNFQ1ModGltZW91dCkpKQorCWlmICghdGltZV9hZnRlcihqaWZmaWVzLCBpZWVlLT5sYXN0X3J4X3BzX3RpbWUgKyBNU0VDUyh0aW1lb3V0KSkpCiAJCXJldHVybiAwOwogCi0JaWYoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFICkgJiYKKwlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFKSAmJgogCQkoaWVlZS0+bWdtdF9xdWV1ZV90YWlsICE9IGllZWUtPm1nbXRfcXVldWVfaGVhZCkpCiAJCXJldHVybiAwOwogCi0JaWYodGltZV9sKXsKKwlpZiAodGltZV9sKSB7CiAJCSp0aW1lX2wgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsubGFzdF9kdGltX3N0YV90aW1lWzBdCiAJCQkrIE1TRUNTKChpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsKSk7Ci0JCQkvLyogaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fcGVyaW9kKSk7Ci0JCQkvL3ByaW50aygiYmVhY29uX2ludGVydmFsOiV4LCBkdGltX3BlcmlvZDoleCwgdG90b2wgdG8gTXNlY3M6JXgsIEhaOiV4XG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9wZXJpb2QsIE1TRUNTKCgoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCAqIGllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX3BlcmlvZCkpKSwgSFopOwogCX0KIAotCWlmKHRpbWVfaCl7CisJaWYgKHRpbWVfaCkgewogCQkqdGltZV9oID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmxhc3RfZHRpbV9zdGFfdGltZVsxXTsKLQkJaWYodGltZV9sICYmICp0aW1lX2wgPCBpZWVlLT5jdXJyZW50X25ldHdvcmsubGFzdF9kdGltX3N0YV90aW1lWzBdKQorCQlpZiAodGltZV9sICYmICp0aW1lX2wgPCBpZWVlLT5jdXJyZW50X25ldHdvcmsubGFzdF9kdGltX3N0YV90aW1lWzBdKQogCQkJKnRpbWVfaCArPSAxOwogCX0KIAogCXJldHVybiAxOwotCi0KIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9zdGFfcHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAKLQl1MzIgdGgsdGw7CisJdTMyIHRoLCB0bDsKIAlzaG9ydCBzbGVlcDsKIAotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsZmxhZ3MyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGZsYWdzMjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAKLQlpZigoaWVlZS0+cHMgPT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEIHx8Ci0KKwlpZiAoKGllZWUtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCB8fAogCQlpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgfHwKLQkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkpeworCQlpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKSkgewogCi0JCS8vI3dhcm5pbmcgQ0hFQ0tfTE9DS19IRVJFCisJCS8qICN3YXJuaW5nIENIRUNLX0xPQ0tfSEVSRSAqLwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOwogCiAJCWllZWU4MDIxMV9zdGFfd2FrZXVwKGllZWUsIDEpOwpAQCAtMTY3NCw3MSArMTQ4Niw1NyBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CiAJfQogCi0Jc2xlZXAgPSBpZWVlODAyMTFfc3RhX3BzX3NsZWVwKGllZWUsJnRoLCAmdGwpOwotLy8JcHJpbnRrKCI9PT0+JXMsJWRbMiB3YWtlLCAxIHNsZWVwLCAwIGRvIG5vdGhpbmddLCBpZWVlLT5zdGFfc2xlZXAgPSAlZFxuIixfX2Z1bmNfXywgc2xlZXAsaWVlZS0+c3RhX3NsZWVwKTsKKwlzbGVlcCA9IGllZWU4MDIxMV9zdGFfcHNfc2xlZXAoaWVlZSwgJnRoLCAmdGwpOwogCS8qIDIgd2FrZSwgMSBzbGVlcCwgMCBkbyBub3RoaW5nICovCi0JaWYoc2xlZXAgPT0gMCkKKwlpZiAoc2xlZXAgPT0gMCkKIAkJZ290byBvdXQ7CiAKLQlpZihzbGVlcCA9PSAxKXsKKwlpZiAoc2xlZXAgPT0gMSkgeworCQlpZiAoaWVlZS0+c3RhX3NsZWVwID09IDEpCisJCQlpZWVlLT5lbnRlcl9zbGVlcF9zdGF0ZShpZWVlLT5kZXYsIHRoLCB0bCk7CiAKLQkJaWYoaWVlZS0+c3RhX3NsZWVwID09IDEpCi0JCQlpZWVlLT5lbnRlcl9zbGVlcF9zdGF0ZShpZWVlLT5kZXYsdGgsdGwpOwotCi0JCWVsc2UgaWYoaWVlZS0+c3RhX3NsZWVwID09IDApewotCS8vCQlwcmludGsoInNlbmQgbnVsbCAxXG4iKTsKKwkJZWxzZSBpZiAoaWVlZS0+c3RhX3NsZWVwID09IDApIHsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7Ci0KLQkJCWlmKGllZWUtPnBzX2lzX3F1ZXVlX2VtcHR5KGllZWUtPmRldikpewotCi0KKwkJCWlmIChpZWVlLT5wc19pc19xdWV1ZV9lbXB0eShpZWVlLT5kZXYpKSB7CiAJCQkJaWVlZS0+c3RhX3NsZWVwID0gMjsKIAogCQkJCWllZWUtPnBzX3JlcXVlc3RfdHhfYWNrKGllZWUtPmRldik7CiAKLQkJCQlpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLDEpOworCQkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDEpOwogCiAJCQkJaWVlZS0+cHNfdGggPSB0aDsKIAkJCQlpZWVlLT5wc190bCA9IHRsOwogCQkJfQogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOwotCiAJCX0KLQotCi0JfWVsc2UgaWYoc2xlZXAgPT0gMil7Ci0vLyN3YXJuaW5nIENIRUNLX0xPQ0tfSEVSRQorCX0gZWxzZSBpZiAoc2xlZXAgPT0gMikgeworCQkvKiAjd2FybmluZyBDSEVDS19MT0NLX0hFUkUgKi8KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKIAotCS8vCXByaW50aygic2VuZCB3YWtldXAgcGFja2V0XG4iKTsKLQkJaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwxKTsKKwkJaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwgMSk7CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOwogCX0KLQogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLQogfQogCiB2b2lkIGllZWU4MDIxMV9zdGFfd2FrZXVwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBubCkKIHsKLQlpZihpZWVlLT5zdGFfc2xlZXAgPT0gMCl7Ci0JCWlmKG5sKXsKLQkJLy8JcHJpbnRrKCJXYXJuaW5nOiBkcml2ZXIgaXMgcHJvYmFibHkgZmFpbGluZyB0byByZXBvcnQgVFggcHMgZXJyb3JcbiIpOworCWlmIChpZWVlLT5zdGFfc2xlZXAgPT0gMCkgeworCQlpZiAobmwpIHsKIAkJCWllZWUtPnBzX3JlcXVlc3RfdHhfYWNrKGllZWUtPmRldik7CiAJCQlpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCAwKTsKIAkJfQogCQlyZXR1cm47Ci0KIAl9CiAKLQlpZihpZWVlLT5zdGFfc2xlZXAgPT0gMSkKKwlpZiAoaWVlZS0+c3RhX3NsZWVwID09IDEpCiAJCWllZWUtPnN0YV93YWtlX3VwKGllZWUtPmRldik7CiAKIAlpZWVlLT5zdGFfc2xlZXAgPSAwOwogCi0JaWYobmwpeworCWlmIChubCkgewogCQlpZWVlLT5wc19yZXF1ZXN0X3R4X2FjayhpZWVlLT5kZXYpOwogCQlpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCAwKTsKIAl9CkBAIC0xNzQ2LDI1ICsxNTQ0LDIwIEBACiAKIHZvaWQgaWVlZTgwMjExX3BzX3R4X2FjayhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgc3VjY2VzcykKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLGZsYWdzMjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBmbGFnczI7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwotCWlmKGllZWUtPnN0YV9zbGVlcCA9PSAyKXsKKwlpZiAoaWVlZS0+c3RhX3NsZWVwID09IDIpIHsKIAkJLyogTnVsbCBmcmFtZSB3aXRoIFBTIGJpdCBzZXQgKi8KLQkJaWYoc3VjY2Vzcyl7Ci0KLQkJLy8JcHJpbnRrKCI9PT09PT09PT09PT09PT09PT0+ICVzOjplbnRlciBzbGVlcCBzdGF0ZVxuIixfX2Z1bmNfXyk7CisJCWlmIChzdWNjZXNzKSB7CiAJCQlpZWVlLT5zdGFfc2xlZXAgPSAxOwotCQkJaWVlZS0+ZW50ZXJfc2xlZXBfc3RhdGUoaWVlZS0+ZGV2LGllZWUtPnBzX3RoLGllZWUtPnBzX3RsKTsKKwkJCWllZWUtPmVudGVyX3NsZWVwX3N0YXRlKGllZWUtPmRldiwgaWVlZS0+cHNfdGgsIGllZWUtPnBzX3RsKTsKIAkJfQogCQkvKiBpZiB0aGUgY2FyZCByZXBvcnQgbm90IHN1Y2Nlc3Mgd2UgY2FuJ3QgYmUgc3VyZSB0aGUgQVAKIAkJICogaGFzIG5vdCBSWGVkIHNvIHdlIGNhbid0IGFzc3VtZSB0aGUgQVAgYmVsaWV2ZSB1cyBhd2FrZQogCQkgKi8KLQl9Ci0JLyogMjExMTIwMDUgLSB0eCBhZ2FpbiBudWxsIHdpdGhvdXQgUFMgYml0IGlmIGxvc3QgKi8KLQllbHNlIHsKLQotCQlpZigoaWVlZS0+c3RhX3NsZWVwID09IDApICYmICFzdWNjZXNzKXsKKwl9IGVsc2UgeworCQlpZiAoKGllZWUtPnN0YV9zbGVlcCA9PSAwKSAmJiAhc3VjY2VzcykgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKIAkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDApOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOwpAQCAtMTc4MCwxNiArMTU3MywxNiBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKikgc2tiLT5kYXRhOwogCXUxNiBlcnJjb2RlOwotCXU4KiBjaGFsbGVuZ2U9TlVMTDsKLQlpbnQgY2hsZW49MDsKLQlpbnQgYWlkPTA7CisJdTggKmNoYWxsZW5nZSA9IE5VTEw7CisJaW50IGNobGVuID0gMDsKKwlpbnQgYWlkID0gMDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICphc3NvY19yZXNwOwogCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQ7CiAKLQlpZighaWVlZS0+cHJvdG9fc3RhcnRlZCkKKwlpZiAoIWllZWUtPnByb3RvX3N0YXJ0ZWQpCiAJCXJldHVybiAwOwogCi0JaWYoaWVlZS0+c3RhX3NsZWVwIHx8IChpZWVlLT5wcyAhPSBJRUVFODAyMTFfUFNfRElTQUJMRUQgJiYKKwlpZiAoaWVlZS0+c3RhX3NsZWVwIHx8IChpZWVlLT5wcyAhPSBJRUVFODAyMTFfUFNfRElTQUJMRUQgJiYKIAkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBICYmCiAJCWllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpKQogCkBAIC0xODAwLDMwICsxNTkzLDI3IEBACiAJCWllZWUtPmxhc3RfcnhfcHNfdGltZSA9IGppZmZpZXM7CiAKIAlzd2l0Y2ggKFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY29udHJvbCkpIHsKLQogCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQOgogCQljYXNlIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFU1A6Ci0KIAkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJyZWNlaXZlZCBbUkVdQVNTT0NJQVRJT04gUkVTUE9OU0UgKCVkKVxuIiwKIAkJCQkJV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKTsKIAkJCWlmICgoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpICYmCiAJCQkJaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQgJiYKLQkJCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpewotCQkJCWlmICgwID09IChlcnJjb2RlPWFzc29jX3BhcnNlKHNrYiwgJmFpZCkpKXsKKwkJCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKKwkJCQllcnJjb2RlID0gYXNzb2NfcGFyc2Uoc2tiLCAmYWlkKTsKKwkJCQlpZiAoMCA9PSBlcnJjb2RlKSB7CiAJCQkJCXUxNiBsZWZ0OwogCi0JCQkJCWllZWUtPnN0YXRlPUlFRUU4MDIxMV9MSU5LRUQ7CisJCQkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRDsKIAkJCQkJaWVlZS0+YXNzb2NfaWQgPSBhaWQ7CiAJCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXNzX29rKys7Ci0KLQkJCQkJLy9wcmludGsoS0VSTl9XQVJOSU5HICJuaWNfdHlwZSA9ICVzIiwgKHJ4X3N0YXRzLT5uaWNfdHlwZSA9PSAxKT8icnRsODE4NyI6InJ0bDgxODdCIik7Ci0JCQkJCWlmKDEgPT0gcnhfc3RhdHMtPm5pY190eXBlKSAvL2NhcmQgdHlwZSBpcyA4MTg3Ci0JCQkJCXsKKwkJCQkJLyogY2FyZCB0eXBlIGlzIDgxODcgKi8KKwkJCQkJaWYgKDEgPT0gcnhfc3RhdHMtPm5pY190eXBlKQogCQkJCQkJZ290byBhc3NvY2lhdGVfY29tcGxldGU7Ci0JCQkJCX0KLQkJCQkJYXNzb2NfcmVzcCA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKilza2ItPmRhdGE7Ci0JCQkJCWluZm9fZWxlbWVudCA9IAkmYXNzb2NfcmVzcC0+aW5mb19lbGVtZW50OwotCQkJCQlsZWZ0ID0gc2tiLT5sZW4gLSAoKHZvaWQqKWluZm9fZWxlbWVudCAtICh2b2lkKilhc3NvY19yZXNwKTsKKworCQkJCQlhc3NvY19yZXNwID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKilza2ItPmRhdGE7CisJCQkJCWluZm9fZWxlbWVudCA9ICZhc3NvY19yZXNwLT5pbmZvX2VsZW1lbnQ7CisJCQkJCWxlZnQgPSBza2ItPmxlbiAtICgodm9pZCAqKWluZm9fZWxlbWVudCAtICh2b2lkICopYXNzb2NfcmVzcCk7CiAKIAkJCQkJd2hpbGUgKGxlZnQgPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkcikpIHsKIAkJCQkJCWlmIChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyKSArIGluZm9fZWxlbWVudC0+bGVuID4gbGVmdCkgewpAQCAtMTgzMiwzMiArMTYyMiwzMyBAQAogCQkJCQkJfQogCQkJCQkJc3dpdGNoIChpbmZvX2VsZW1lbnQtPmlkKSB7CiAJCQkJCQkgIGNhc2UgTUZJRV9UWVBFX0dFTkVSSUM6Ci0JCQkJCQkgICAgICAgICBJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0dFTkVSSUM6ICVkIGJ5dGVzXG4iLCBpbmZvX2VsZW1lbnQtPmxlbik7CisJCQkJCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9HRU5FUklDOiAlZCBieXRlc1xuIiwgaW5mb19lbGVtZW50LT5sZW4pOwogCQkJCQkJCWlmIChpbmZvX2VsZW1lbnQtPmxlbiA+PSA4ICAmJgogCQkJCQkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgogCQkJCQkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg1MCAmJgogCQkJCQkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHhmMiAmJgogCQkJCQkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMiAmJgogCQkJCQkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbNF0gPT0gMHgwMSkgewotCQkJCQkJCSAgICAvLyBOb3QgY2FyZSBhYm91dCB2ZXJzaW9uIGF0IHByZXNlbnQuCi0JCQkJCQkJICAgIC8vV01NIFBhcmFtZXRlciBFbGVtZW50Ci0JCQkJCQkJICAgIG1lbWNweShpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX3BhcmFtLCh1OCopKGluZm9fZWxlbWVudC0+ZGF0YVwKLQkJCQkJCQkJCQkgICAgKyA4KSwoaW5mb19lbGVtZW50LT5sZW4gLSA4KSk7CisJCQkJCQkJCS8qIE5vdCBjYXJlIGFib3V0IHZlcnNpb24gYXQgcHJlc2VudC4KKwkJCQkJCQkJICogV01NIFBhcmFtZXRlciBFbGVtZW50LgorCQkJCQkJCQkgKi8KKwkJCQkJCQkJbWVtY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay53bW1fcGFyYW0sICh1OCAqKShpbmZvX2VsZW1lbnQtPmRhdGFcCisJCQkJCQkJCQkrIDgpLCAoaW5mb19lbGVtZW50LT5sZW4gLSA4KSk7CiAKLQkJCQkJIAkgICAgICAgICAgICBpZiAoKChpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX2luZm9eaW5mb19lbGVtZW50LT5kYXRhWzZdKSYgXAotCQkJCQkJCQkJCSAgICAweDBmKXx8KCFpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcpKSB7Ci0JCQkJCQkgICAJICAgICAgLy8gcmVmcmVzaCBwYXJhbWV0ZXIgZWxlbWVudCBmb3IgY3VycmVudCBuZXR3b3JrCi0JCQkJCQkJICAgICAgLy8gdXBkYXRlIHRoZSByZWdpc3RlciBwYXJhbWV0ZXIgZm9yIGhhcmR3YXJlCi0JCQkJCQkJICAgICAgaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnID0gMTsKLQkJCQkJCQkgICAgICBxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+d21tX3BhcmFtX3VwZGF0ZV93cSk7Ci0KLQkJCQkJCSAgICAgICAgICAgIH0KLQkJCQkJCSAgICAgICAgICAgIC8vdXBkYXRlIGluZm9fZWxlbWVudCBmb3IgY3VycmVudCBuZXR3b3JrCi0JCQkJCQkgICAgICAgICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX2luZm8gID0gaW5mb19lbGVtZW50LT5kYXRhWzZdOworCQkJCQkJCQlpZiAoKChpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX2luZm9eaW5mb19lbGVtZW50LT5kYXRhWzZdKSYgXAorCQkJCQkJCQkJCSAgICAweDBmKSB8fCAoIWllZWUtPmluaXRfd21tcGFyYW1fZmxhZykpIHsKKwkJCQkJCQkJCS8qIHJlZnJlc2ggcGFyYW1ldGVyIGVsZW1lbnQgZm9yIGN1cnJlbnQgbmV0d29yaworCQkJCQkJCQkJICogdXBkYXRlIHRoZSByZWdpc3RlciBwYXJhbWV0ZXIgZm9yIGhhcmR3YXJlLgorCQkJCQkJCQkJICovCisJCQkJCQkJCQlpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcgPSAxOworCQkJCQkJCQkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPndtbV9wYXJhbV91cGRhdGVfd3EpOworCQkJCQkJCQl9CisJCQkJCQkJCS8qIHVwZGF0ZSBpbmZvX2VsZW1lbnQgZm9yIGN1cnJlbnQgbmV0d29yayAqLworCQkJCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX2luZm8gID0gaW5mb19lbGVtZW50LT5kYXRhWzZdOwogCQkJCQkJCX0KIAkJCQkJCQlicmVhazsKIAkJCQkJCSAgZGVmYXVsdDoKLQkJCQkJCQkvL25vdGhpbmcgdG8gZG8gYXQgcHJlc2VudCEhIQorCQkJCQkJCS8qIG5vdGhpbmcgdG8gZG8gYXQgcHJlc2VudCEhISAqLwogCQkJCQkJCWJyZWFrOwogCQkJCQkJfQogCkBAIC0xODY2LDE0ICsxNjU3LDE0IEBACiAJCQkJCQlpbmZvX2VsZW1lbnQgPSAoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKikKIAkJCQkJCQkmaW5mb19lbGVtZW50LT5kYXRhW2luZm9fZWxlbWVudC0+bGVuXTsKIAkJCQkJfQotCQkJCQlpZighaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnKSAvL2xlZ2FjeSBBUCwgcmVzZXQgdGhlIEFDX3h4X3BhcmFtIHJlZ2lzdGVyCi0JCQkJCXsKLQkJCQkJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsJmllZWUtPndtbV9wYXJhbV91cGRhdGVfd3EpOwotCQkJCQkJaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnID0gMTsvL2luZGljYXRlIEFDX3h4X3BhcmFtIHVwYXRlZCBzaW5jZSBsYXN0IGFzc29jaWF0ZQorCQkJCQkvKiBsZWdhY3kgQVAsIHJlc2V0IHRoZSBBQ194eF9wYXJhbSByZWdpc3RlciAqLworCQkJCQlpZiAoIWllZWUtPmluaXRfd21tcGFyYW1fZmxhZykgeworCQkJCQkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPndtbV9wYXJhbV91cGRhdGVfd3EpOworCQkJCQkJaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnID0gMTsgLyogaW5kaWNhdGUgQUNfeHhfcGFyYW0gdXBhdGVkIHNpbmNlIGxhc3QgYXNzb2NpYXRlICovCiAJCQkJCX0KIGFzc29jaWF0ZV9jb21wbGV0ZToKIAkJCQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZShpZWVlKTsKLQkJCQl9ZWxzZXsKKwkJCQl9IGVsc2UgewogCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2Fzc19lcnIrKzsKIAkJCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoCiAJCQkJCQkiQXNzb2NpYXRpb24gcmVzcG9uc2Ugc3RhdHVzIGNvZGUgMHgleFxuIiwKQEAgLTE4ODIsNDcgKzE2NzMsNDEgQEAKIAkJCQl9CiAJCQl9CiAJCQlicmVhazsKLQogCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVE6CiAJCWNhc2UgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVROgotCiAJCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSAmJgogCQkJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpCiAKIAkJCQlpZWVlODAyMTFfcnhfYXNzb2NfcnEoaWVlZSwgc2tiKTsKIAkJCWJyZWFrOwotCiAJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FVVEg6Ci0KLQkJCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSl7CisJCQlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpIHsKIAkJCQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HICYmCiAJCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKLQogCQkJCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIlJlY2VpdmVkIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIik7CiAKLQkJCQkJCWlmICgwID09IChlcnJjb2RlPWF1dGhfcGFyc2Uoc2tiLCAmY2hhbGxlbmdlLCAmY2hsZW4pKSl7Ci0JCQkJCQkJaWYoaWVlZS0+b3Blbl93ZXAgfHwgIWNoYWxsZW5nZSl7CisJCQkJCQllcnJjb2RlID0gYXV0aF9wYXJzZShza2IsICZjaGFsbGVuZ2UsICZjaGxlbik7CisJCQkJCQlpZiAoMCA9PSBlcnJjb2RlKSB7CisJCQkJCQkJaWYgKGllZWUtPm9wZW5fd2VwIHx8ICFjaGFsbGVuZ2UpIHsKIAkJCQkJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRFRDsKIAkJCQkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JzX29rKys7CiAKIAkJCQkJCQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMihpZWVlKTsKLQkJCQkJCQl9ZWxzZXsKKwkJCQkJCQl9IGVsc2UgewogCQkJCQkJCQlpZWVlODAyMTFfcnRsX2F1dGhfY2hhbGxlbmdlKGllZWUsIGNoYWxsZW5nZSwgY2hsZW4pOwogCQkJCQkJCX0KLQkJCQkJCX1lbHNleworCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnNfZXJyKys7Ci0JCQkJCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIkF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIHN0YXR1cyBjb2RlIDB4JXgiLGVycmNvZGUpOworCQkJCQkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJBdXRoZW50aWNhdGlvbiByZXNwb25zZSBzdGF0dXMgY29kZSAweCV4IiwgZXJyY29kZSk7CiAJCQkJCQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKIAkJCQkJCX0KIAotCQkJCQl9ZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUil7CisJCQkJCX0gZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgewogCQkJCQkJaWVlZTgwMjExX3J4X2F1dGhfcnEoaWVlZSwgc2tiKTsKIAkJCQkJfQogCQkJCX0KIAkJCWJyZWFrOwotCiAJCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUToKLQogCQkJaWYgKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1BST0JFUlMpICYmCiAJCQkJKChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MgfHwKIAkJCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSAmJgpAQCAtMTkzMCwzNiArMTcxNSwyOCBAQAogCiAJCQkJaWVlZTgwMjExX3J4X3Byb2JlX3JxKGllZWUsIHNrYik7CiAJCQlicmVhazsKLQogCQljYXNlIElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQzoKIAkJY2FzZSBJRUVFODAyMTFfU1RZUEVfREVBVVRIOgogCQkJLyogRklYTUUgZm9yIG5vdyByZXBlYXQgYWxsIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUKLQkJCSogYm90aCBmb3IgZGlzYXNzb2NpYXRpb24gYW5kIGRlYXV0aGVudGljYXRpb24KLQkJCSovCisJCQkgKiBib3RoIGZvciBkaXNhc3NvY2lhdGlvbiBhbmQgZGVhdXRoZW50aWNhdGlvbgorCQkJICovCiAJCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSAmJgogCQkJCShpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSAmJgogCQkJCShpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpICYmCi0JCQkJKCFtZW1jbXAoaGVhZGVyLT5hZGRyMixpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsRVRIX0FMRU4pKSl7CisJCQkJKCFtZW1jbXAoaGVhZGVyLT5hZGRyMiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTikpKSB7CiAJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkc7CiAJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yZWFzc29jKys7CiAKLQkJCQkvL25vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsgIC8vWUosZGVsLDA4MDgyOCwgZG8gbm90IG5vdGlmeSBvcyBoZXJlCiAJCQkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOwogCQkJfQotCiAJCQlicmVhazsKLQogCQlkZWZhdWx0OgogCQkJcmV0dXJuIC0xOwogCQkJYnJlYWs7CiAJfQotCi0JLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCXJldHVybiAwOwogfQogCi0KLQogLyogZm9sbG93aW5nIGFyZSBmb3IgYSBzaW1wbGVyIFRYIHF1ZXVlIG1hbmFnZW1lbnQuCiAgKiBJbnN0ZWFkIG9mIHVzaW5nIG5ldGlmX1tzdG9wL3dha2VdX3F1ZXVlIHRoZSBkcml2ZXIKICAqIHdpbGwgdXNlcyB0aGVzZSB0d28gZnVuY3Rpb24gKHBsdXMgYSByZXNldCBvbmUpLCB0aGF0CkBAIC0xOTgyLDI3ICsxNzU5LDIzIEBACiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3htaXQoc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiwKIAkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQotCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgIGk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jayxmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAogCS8qIGNhbGxlZCB3aXRoIDJuZCBwYXJtIDAsIG5vIHR4IG1nbXQgbG9jayByZXF1aXJlZCAqLwotCWllZWU4MDIxMV9zdGFfd2FrZXVwKGllZWUsMCk7CisJaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwgMCk7CiAKLQlmb3IoaSA9IDA7IGkgPCB0eGItPm5yX2ZyYWdzOyBpKyspIHsKLQotCQlpZiAoaWVlZS0+cXVldWVfc3RvcCl7CisJZm9yIChpID0gMDsgaSA8IHR4Yi0+bnJfZnJhZ3M7IGkrKykgeworCQlpZiAoaWVlZS0+cXVldWVfc3RvcCkgewogCQkJaWVlZS0+dHhfcGVuZGluZy50eGIgPSB0eGI7CiAJCQlpZWVlLT50eF9wZW5kaW5nLmZyYWcgPSBpOwogCQkJZ290byBleGl0OwotCQl9ZWxzZXsKKwkJfSBlbHNlIHsKIAkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoCiAJCQkJdHhiLT5mcmFnbWVudHNbaV0sCi0JCQkJaWVlZS0+ZGV2LGllZWUtPnJhdGUpOwotCQkJCS8vKGkrMSk8dHhiLT5ucl9mcmFncyk7CisJCQkJaWVlZS0+ZGV2LCBpZWVlLT5yYXRlKTsKIAkJCWllZWUtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAkJCWllZWUtPnN0YXRzLnR4X2J5dGVzICs9IHR4Yi0+ZnJhZ21lbnRzW2ldLT5sZW47CiAJCQlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKQEAgLTIwMTIsNjYgKzE3ODUsNTkgQEAKIAlpZWVlODAyMTFfdHhiX2ZyZWUodHhiKTsKIAogCWV4aXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7Ci0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiB9CiAKIC8qIGNhbGxlZCB3aXRoIGllZWUtPmxvY2sgYWNxdWlyZWQgKi8KIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9yZXN1bWVfdHgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJaW50IGk7Ci0JZm9yKGkgPSBpZWVlLT50eF9wZW5kaW5nLmZyYWc7IGkgPCBpZWVlLT50eF9wZW5kaW5nLnR4Yi0+bnJfZnJhZ3M7IGkrKykgeworCWZvciAoaSA9IGllZWUtPnR4X3BlbmRpbmcuZnJhZzsgaSA8IGllZWUtPnR4X3BlbmRpbmcudHhiLT5ucl9mcmFnczsgaSsrKSB7CiAKLQkJaWYgKGllZWUtPnF1ZXVlX3N0b3ApeworCQlpZiAoaWVlZS0+cXVldWVfc3RvcCkgewogCQkJaWVlZS0+dHhfcGVuZGluZy5mcmFnID0gaTsKIAkJCXJldHVybjsKLQkJfWVsc2V7Ci0KKwkJfSBlbHNlIHsKIAkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoCiAJCQkJaWVlZS0+dHhfcGVuZGluZy50eGItPmZyYWdtZW50c1tpXSwKLQkJCQlpZWVlLT5kZXYsaWVlZS0+cmF0ZSk7Ci0JCQkJLy8oaSsxKTxpZWVlLT50eF9wZW5kaW5nLnR4Yi0+bnJfZnJhZ3MpOworCQkJCWllZWUtPmRldiwgaWVlZS0+cmF0ZSk7CiAJCQlpZWVlLT5zdGF0cy50eF9wYWNrZXRzKys7CiAJCQlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIAkJfQogCX0KIAotCiAJaWVlZTgwMjExX3R4Yl9mcmVlKGllZWUtPnR4X3BlbmRpbmcudHhiKTsKIAlpZWVlLT50eF9wZW5kaW5nLnR4YiA9IE5VTEw7CiB9CiAKLQogdm9pZCBpZWVlODAyMTFfcmVzZXRfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCWluaXRfbWdtdF9xdWV1ZShpZWVlKTsKLQlpZiAoaWVlZS0+dHhfcGVuZGluZy50eGIpeworCWlmIChpZWVlLT50eF9wZW5kaW5nLnR4YikgewogCQlpZWVlODAyMTFfdHhiX2ZyZWUoaWVlZS0+dHhfcGVuZGluZy50eGIpOwogCQlpZWVlLT50eF9wZW5kaW5nLnR4YiA9IE5VTEw7CiAJfQogCWllZWUtPnF1ZXVlX3N0b3AgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssZmxhZ3MpOwotCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogfQogCiB2b2lkIGllZWU4MDIxMV9ydGxfd2FrZV9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKmhlYWRlcjsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLGZsYWdzKTsKLQlpZiAoISBpZWVlLT5xdWV1ZV9zdG9wKSBnb3RvIGV4aXQ7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIWllZWUtPnF1ZXVlX3N0b3ApCisJCWdvdG8gZXhpdDsKIAogCWllZWUtPnF1ZXVlX3N0b3AgPSAwOwogCi0JaWYoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUpewotCQl3aGlsZSAoIWllZWUtPnF1ZXVlX3N0b3AgJiYgKHNrYiA9IGRlcXVldWVfbWdtdChpZWVlKSkpewotCisJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFKSB7CisJCXdoaWxlICghaWVlZS0+cXVldWVfc3RvcCAmJiAoc2tiID0gZGVxdWV1ZV9tZ210KGllZWUpKSkgewogCQkJaGVhZGVyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqKSBza2ItPmRhdGE7CiAKIAkJCWhlYWRlci0+c2VxX2N0cmwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXSA8PCA0KTsKQEAgLTIwODEsNDIgKzE4NDcsMzIgQEAKIAkJCWVsc2UKIAkJCQlpZWVlLT5zZXFfY3RybFswXSsrOwogCi0JCQkvL3ByaW50ayhLRVJOX0FMRVJUICJpZWVlODAyMTFfd2FrZV9xdWV1ZSBcbiIpOwotCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2LGllZWUtPmJhc2ljX3JhdGUpOwotCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KHNrYiwgaWVlZS0+ZGV2LCBpZWVlLT5iYXNpY19yYXRlKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCX0KIAl9CiAJaWYgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIGllZWUtPnR4X3BlbmRpbmcudHhiKQogCQlpZWVlODAyMTFfcmVzdW1lX3R4KGllZWUpOwogCi0JaWYgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQoaWVlZS0+ZGV2KSl7CisJaWYgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQoaWVlZS0+ZGV2KSkgewogCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnN3dHhhd2FrZSsrOwogCQluZXRpZl93YWtlX3F1ZXVlKGllZWUtPmRldik7CiAJfQotCi1leGl0IDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLGZsYWdzKTsKK2V4aXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogfQogCi0KIHZvaWQgaWVlZTgwMjExX3J0bF9zdG9wX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKLQkvL3NwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLGZsYWdzKTsKLQotCWlmICghIG5ldGlmX3F1ZXVlX3N0b3BwZWQoaWVlZS0+ZGV2KSl7CisJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGllZWUtPmRldikpIHsKIAkJbmV0aWZfc3RvcF9xdWV1ZShpZWVlLT5kZXYpOwogCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnN3dHhzdG9wKys7CiAJfQogCWllZWUtPnF1ZXVlX3N0b3AgPSAxOwotCS8vc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7Ci0KIH0KIAotCiBpbmxpbmUgdm9pZCBpZWVlODAyMTFfcmFuZG9taXplX2NlbGwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0KIAlyYW5kb21fZXRoZXJfYWRkcihpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQpOwogfQogCkBAIC0yMTI1LDcgKzE4ODEsNyBAQAogewogCWllZWUtPmFzc29jX2lkID0gMTsKIAotCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gMCl7CisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSAwKSB7CiAJCXN0cm5jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsCiAJCQlJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCwKIAkJCUlXX0VTU0lEX01BWF9TSVpFKTsKQEAgLTIxNDksNyArMTkwNSw3IEBACiAKIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9zdGFydF9tb25pdG9yX21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0JaWYoaWVlZS0+cmF3X3R4KXsKKwlpZiAoaWVlZS0+cmF3X3R4KSB7CiAKIAkJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCiAJCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CkBAIC0yMTczLDkgKzE5MjksOCBAQAogCiAJZG93bigmaWVlZS0+d3hfc2VtKTsKIAotCi0JaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSAwKXsKLQkJc3RyY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEKTsKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApIHsKKwkJc3RyY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCk7CiAJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IHN0cmxlbihJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCk7CiAJCWllZWUtPnNzaWRfc2V0ID0gMTsKIAl9CkBAIC0yMTgzLDcgKzE5MzgsNyBAQAogCS8qIGNoZWNrIGlmIHdlIGhhdmUgdGhpcyBjZWxsIGluIG91ciBuZXR3b3JrIGxpc3QgKi8KIAlpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyhpZWVlKTsKIAotCWlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspCisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspCiAJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gMTA7CiAJLyogaWYgbm90IHRoZW4gdGhlIHN0YXRlIGlzIG5vdCBsaW5rZWQuIE1heWJlIHRoZSB1c2VyIHN3aXRjaGVkIHRvCiAJICogYWQtaG9jIG1vZGUganVzdCBhZnRlciBiZWluZyBpbiBtb25pdG9yIG1vZGUsIG9yIGp1c3QgYWZ0ZXIKQEAgLTIyMDMsMTMgKzE5NTgsMTIgQEAKIAkJaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKGllZWUpOwogCiAJLyogdGhlIG5ldHdvcmsgZGVmaW5pdGl2ZWx5IGlzIG5vdCBoZXJlLi4gY3JlYXRlIGEgbmV3IGNlbGwgKi8KLQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSyl7CisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspIHsKIAkJcHJpbnRrKCJjcmVhdGluZyBuZXcgSUJTUyBjZWxsXG4iKTsKLQkJaWYoIWllZWUtPndhcF9zZXQpCisJCWlmICghaWVlZS0+d2FwX3NldCkKIAkJCWllZWU4MDIxMV9yYW5kb21pemVfY2VsbChpZWVlKTsKIAotCQlpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKXsKLQorCQlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikgewogCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2xlbiA9IDQ7CiAKIAkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1swXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COwpAQCAtMjIxNywxMCArMTk3MSwxMCBAQAogCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzJdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV81TUI7CiAJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbM10gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzExTUI7CiAKLQkJfWVsc2UKKwkJfSBlbHNlCiAJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuID0gMDsKIAotCQlpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTil7CisJCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikgewogCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbiA9IDg7CiAKIAkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFswXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjsKQEAgLTIyMzMsMTkgKzE5ODcsMTggQEAKIAkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs3XSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI7CiAKIAkJCWllZWUtPnJhdGUgPSA1NDA7Ci0JCX1lbHNleworCQl9IGVsc2UgewogCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbiA9IDA7CiAJCQlpZWVlLT5yYXRlID0gMTEwOwogCQl9CiAKLQkJLy8gQnkgZGVmYXVsdCwgV01NIGZ1bmN0aW9uIHdpbGwgYmUgZGlzYWJsZWQgaW4gSUJTUyBtb2RlCisJCS8qIEJ5IGRlZmF1bHQsIFdNTSBmdW5jdGlvbiB3aWxsIGJlIGRpc2FibGVkIGluIElCU1MgbW9kZSAqLwogCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSA9IDA7CiAKIAkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmF0aW1fd2luZG93ID0gMDsKIAkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgPSBXTEFOX0NBUEFCSUxJVFlfSUJTUzsKLQkJaWYoaWVlZS0+c2hvcnRfc2xvdCkKKwkJaWYgKGllZWUtPnNob3J0X3Nsb3QpCiAJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSB8PSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVDsKLQogCX0KIAogCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRDsKQEAgLTIyNjQsNiArMjAxNyw3IEBACiAKIAl1cCgmaWVlZS0+d3hfc2VtKTsKIH0KKwogaW5saW5lIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+c3RhcnRfaWJzc193cSwgMTAwKTsKQEAgLTIyNzMsMTkgKzIwMjcsMTUgQEAKIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2JzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCS8vCi0JLy8gUmVmOiA4MDIuMTFkIDExLjEuMy4zCi0JLy8gU1RBIHNoYWxsIG5vdCBzdGFydCBhIEJTUyB1bmxlc3MgcHJvcGVybHkgZm9ybWVkIEJlYWNvbiBmcmFtZSBpbmNsdWRpbmcgYSBDb3VudHJ5IElFLgotCS8vCi0JaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSAmJiAhSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKLQl7Ci0JCWlmKCEgaWVlZS0+Ykdsb2JhbERvbWFpbikKLQkJeworCS8qIFJlZjogODAyLjExZCAxMS4xLjMuMworCSAqIFNUQSBzaGFsbCBub3Qgc3RhcnQgYSBCU1MgdW5sZXNzIHByb3Blcmx5IGZvcm1lZCBCZWFjb24gZnJhbWUKKwkgKiBpbmNsdWRpbmcgYSBDb3VudHJ5IElFLgorCSAqLworCWlmIChJU19ET1QxMURfRU5BQkxFKGllZWUpICYmICFJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKSB7CisJCWlmICghaWVlZS0+Ykdsb2JhbERvbWFpbikKIAkJCXJldHVybjsKLQkJfQogCX0KLQkvKiBjaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgZm91bmQgdGhlIG5ldCB3ZQotCSAqIGFyZSBpbnRlcmVzdGVkIGluIChpZiBhbnkpLgorCS8qIGNoZWNrIGlmIHdlIGhhdmUgYWxyZWFkeSBmb3VuZCB0aGUgbmV0IHdlIGFyZSBpbnRlcmVzdGVkIGluIChpZiBhbnkpLgogCSAqIGlmIG5vdCAod2UgYXJlIGRpc2Fzc29jaWF0ZWQgYW5kIHdlIGFyZSBub3QKIAkgKiBpbiBhc3NvY2lhdGluZyAvIGF1dGhlbnRpY2F0aW5nIHBoYXNlKSBzdGFydCB0aGUgYmFja2dyb3VuZCBzY2FubmluZy4KIAkgKi8KQEAgLTIzMDAsMTQgKzIwNTAsMTAgQEAKIAkgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCi0vLyNpZmRlZiBFTkFCTEVfSVBTCi0vLwlwcmludGsoInN0YXJ0IGJzcyBFTkFCTEVfSVBTXG4iKTsKLS8vI2Vsc2UKLQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSyl7CisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspIHsKIAkJaWVlZS0+YWN0c2Nhbm5pbmcgPSB0cnVlOwogCQlpZWVlODAyMTFfcnRsX3N0YXJ0X3NjYW4oaWVlZSk7CiAJfQotLy8jZW5kaWYKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTIzMjIsNyArMjA2OCw3IEBACiAJaWYgKGllZWUtPmRhdGFfaGFyZF9zdG9wKQogCQkJaWVlZS0+ZGF0YV9oYXJkX3N0b3AoaWVlZS0+ZGV2KTsKIAotCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCisJaWYgKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCiAJCURvdDExZF9SZXNldChpZWVlKTsKIAogCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CkBAIC0yMzM3LDkgKzIwODMsOSBAQAogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgYXNzb2NpYXRlX3JldHJ5X3dxKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWRvd24oJmllZWUtPnd4X3NlbSk7Ci0JaWYoIWllZWUtPnByb3RvX3N0YXJ0ZWQpCisJaWYgKCFpZWVlLT5wcm90b19zdGFydGVkKQogCQlnb3RvIGV4aXQ7Ci0JaWYoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX1JFVFJZKQorCWlmIChpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlkpCiAJCWdvdG8gZXhpdDsKIAkvKiB1bnRpbCB3ZSBkbyBub3Qgc2V0IHRoZSBzdGF0ZSB0byBJRUVFODAyMTFfTk9MSU5LCiAJKiB0aGVyZSBhcmUgbm8gcG9zc2liaWxpdHkgdG8gaGF2ZSBzb21lb25lIGVsc2UgdHJ5aW5nCkBAIC0yMzYwLDE3ICsyMTA2LDEzIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCi0JaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSyl7CisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspIHsKIAkJaWVlZS0+YmVpbnJldHJ5ID0gZmFsc2U7CiAJCWllZWUtPmFjdHNjYW5uaW5nID0gdHJ1ZTsKIAkJaWVlZTgwMjExX3J0bF9zdGFydF9zY2FuKGllZWUpOwogCX0KLQkvL1lKLGFkZCwwODA4MjgsIG5vdGlmeSBvcyBoZXJlCi0JaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykKLQl7CisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspCiAJCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKLQl9Ci0JLy9ZSixhZGQsMDgwODI4LGVuZAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAogZXhpdDoKQEAgLTIzNzksNyArMjEyMSw3IEBACiAKIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfZ2V0X2JlYWNvbl8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0JdTggYnJvYWRjYXN0X2FkZHJbXSA9IHsweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZn07CisJdTggYnJvYWRjYXN0X2FkZHJbXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKIAogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKmI7CkBAIC0yMzkyLDcgKzIxMzQsNiBAQAogCWItPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQkVBQ09OKTsKIAogCXJldHVybiBza2I7Ci0KIH0KIAogc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9nZXRfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQpAQCAtMjQwMSw3ICsyMTQyLDcgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiOwogCiAJc2tiID0gaWVlZTgwMjExX2dldF9iZWFjb25fKGllZWUpOwotCWlmKCFza2IpCisJaWYgKCFza2IpCiAJCXJldHVybiBOVUxMOwogCiAJYiA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICopIHNrYi0+ZGF0YTsKQEAgLTI0MjMsNyArMjE2NCw2IEBACiAJdXAoJmllZWUtPnd4X3NlbSk7CiB9CiAKLQogdm9pZCBpZWVlODAyMTFfc3RvcF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlpZiAoIWllZWUtPnByb3RvX3N0YXJ0ZWQpCkBAIC0yNDMyLDkgKzIxNzIsOSBAQAogCWllZWUtPnByb3RvX3N0YXJ0ZWQgPSAwOwogCiAJaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKGllZWUpOwotCWlmKChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpJiYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkpIHsKLQkJU2VuZERpc2Fzc29jaWF0aW9uKGllZWUsTlVMTCxXTEFOX1JFQVNPTl9ESVNBU1NPQ19TVEFfSEFTX0xFRlQpOwotCX0KKwlpZiAoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgJiYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpKQorCQlTZW5kRGlzYXNzb2NpYXRpb24oaWVlZSwgTlVMTCwgV0xBTl9SRUFTT05fRElTQVNTT0NfU1RBX0hBU19MRUZUKTsKKwogCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSk7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+c3RhcnRfaWJzc193cSk7CkBAIC0yNDU0LDM2ICsyMTk0LDM1IEBACiB2b2lkIGllZWU4MDIxMV9zdGFydF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlzaG9ydCBjaCA9IDA7Ci0gCWludCBpID0gMDsKKwlpbnQgaSA9IDA7CiAKIAlpZiAoaWVlZS0+cHJvdG9fc3RhcnRlZCkKIAkJcmV0dXJuOwogCiAJaWVlZS0+cHJvdG9fc3RhcnRlZCA9IDE7CiAKLQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPT0gMCl7Ci0JCWRveworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAwKSB7CisJCWRvIHsKIAkJCWNoKys7CiAJCQlpZiAoY2ggPiBNQVhfQ0hBTk5FTF9OVU1CRVIpCiAJCQkJcmV0dXJuOyAvKiBubyBjaGFubmVsIGZvdW5kICovCiAKLQkJfXdoaWxlKCFHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwW2NoXSk7CisJCX0gd2hpbGUgKCFHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwW2NoXSk7CiAKIAkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSBjaDsKIAl9CiAKIAlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCA9PSAwKQogCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsID0gMTAwOwotCWllZWUtPnNldF9jaGFuKGllZWUtPmRldixpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CiAKLSAgICAgICAJZm9yKGkgPSAwOyBpIDwgMTc7IGkrKykgewotCSAgaWVlZS0+bGFzdF9yeHNlcV9udW1baV0gPSAtMTsKLQkgIGllZWUtPmxhc3RfcnhmcmFnX251bVtpXSA9IC0xOwotCSAgaWVlZS0+bGFzdF9wYWNrZXRfdGltZVtpXSA9IDA7CisJZm9yIChpID0gMDsgaSA8IDE3OyBpKyspIHsKKwkJaWVlZS0+bGFzdF9yeHNlcV9udW1baV0gPSAtMTsKKwkJaWVlZS0+bGFzdF9yeGZyYWdfbnVtW2ldID0gLTE7CisJCWllZWUtPmxhc3RfcGFja2V0X3RpbWVbaV0gPSAwOwogCX0KIAotCWllZWUtPmluaXRfd21tcGFyYW1fZmxhZyA9IDA7Ly9yZWluaXRpYWxpemUgQUNfeHhfUEFSQU0gcmVnaXN0ZXJzLgotCisJaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnID0gMDsgLyogcmVpbml0aWFsaXplIEFDX3h4X1BBUkFNIHJlZ2lzdGVycy4gKi8KIAogCS8qIGlmIHRoZSB1c2VyIHNldCB0aGUgTUFDIG9mIHRoZSBhZC1ob2MgY2VsbCBhbmQgdGhlbgogCSAqIHN3aXRjaCB0byBtYW5hZ2VkIG1vZGUsIHNoYWxsIHdlICBtYWtlIHN1cmUgdGhhdCBhc3NvY2lhdGlvbgpAQCAtMjQ5Myw3ICsyMjMyLDcgQEAKIAlzd2l0Y2ggKGllZWUtPml3X21vZGUpIHsKIAkJY2FzZSBJV19NT0RFX0FVVE86CiAJCQlpZWVlLT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKLQkJCS8vbm90IHNldCBicmVhayBoZXJlIGludGVudGlvbmx5CisJCQkvKiBub3Qgc2V0IGJyZWFrIGhlcmUgaW50ZW50aW9ubHkgKi8KIAkJY2FzZSBJV19NT0RFX0lORlJBOgogCQkJaWVlZTgwMjExX3N0YXJ0X2JzcyhpZWVlKTsKIAkJCWJyZWFrOwpAQCAtMjUxNyw3ICsyMjU2LDYgQEAKIAl9CiB9CiAKLQogI2RlZmluZSBEUlZfTkFNRSAgIkllZWU4MDIxMSIKIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKQEAgLTI1MjYsMzYgKzIyNjQsMjkgQEAKIAogCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKIAlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7Ci0JZm9yKGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JICBpZWVlLT5zZXFfY3RybFtpXSA9IDA7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCWllZWUtPnNlcV9jdHJsW2ldID0gMDsKIAogCWllZWUtPmFzc29jX2lkID0gMDsKIAlpZWVlLT5xdWV1ZV9zdG9wID0gMDsKIAlpZWVlLT5zY2FubmluZyA9IDA7Ci0JaWVlZS0+c29mdG1hY19mZWF0dXJlcyA9IDA7IC8vc28gSUVFRTIxMDAtbGlrZSBkcml2ZXIgYXJlIGhhcHB5CisJaWVlZS0+c29mdG1hY19mZWF0dXJlcyA9IDA7IC8qIHNvIElFRUUyMTAwLWxpa2UgZHJpdmVyIGFyZSBoYXBweSAqLwogCWllZWUtPndhcF9zZXQgPSAwOwogCWllZWUtPnNzaWRfc2V0ID0gMDsKIAlpZWVlLT5wcm90b19zdGFydGVkID0gMDsKIAlpZWVlLT5iYXNpY19yYXRlID0gSUVFRTgwMjExX0RFRkFVTFRfQkFTSUNfUkFURTsKIAlpZWVlLT5yYXRlID0gMzsKLS8vI2lmZGVmIEVOQUJMRV9MUFMKIAlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19NQkNBU1R8SUVFRTgwMjExX1BTX1VOSUNBU1Q7Ci0vLyNlbHNlCi0vLwlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19ESVNBQkxFRDsKLS8vI2VuZGlmCiAJaWVlZS0+c3RhX3NsZWVwID0gMDsKLS8vYnkgYW15CiAJaWVlZS0+YkluYWN0aXZlUHMgPSBmYWxzZTsKIAlpZWVlLT5hY3RzY2FubmluZyA9IGZhbHNlOwogCWllZWUtPkxpc3RlbkludGVydmFsID0gMjsKLQlpZWVlLT5OdW1SeERhdGFJblBlcmlvZCA9IDA7IC8vWUosYWRkLDA4MDgyOAotCWllZWUtPk51bVJ4QmNuSW5QZXJpb2QgPSAwOyAvL1lKLGFkZCwwODA4MjgKLQlpZWVlLT5OdW1SeE9rVG90YWwgPSAwOy8vK2J5IGFteSAwODAzMTIKLQlpZWVlLT5OdW1SeFVuaWNhc3QgPSAwOy8vWUosYWRkLDA4MDgyOCxmb3Iga2VlcCBhbGl2ZQorCWllZWUtPk51bVJ4RGF0YUluUGVyaW9kID0gMDsKKwlpZWVlLT5OdW1SeEJjbkluUGVyaW9kID0gMDsKKwlpZWVlLT5OdW1SeE9rVG90YWwgPSAwOworCWllZWUtPk51bVJ4VW5pY2FzdCA9IDA7IC8qIGZvciBrZWVwIGFsaXZlICovCiAJaWVlZS0+YmVpbnJldHJ5ID0gZmFsc2U7CiAJaWVlZS0+Ykh3UmFkaW9PZmYgPSBmYWxzZTsKLS8vYnkgYW15CiAKIAlpbml0X21nbXRfcXVldWUoaWVlZSk7CiAKQEAgLTI1NzEsMTMgKzIzMDIsMTIgQEAKIAogCWllZWUtPndxID0gY3JlYXRlX3dvcmtxdWV1ZShEUlZfTkFNRSk7CiAKLQlJTklUX0RFTEFZRURfV09SSygmaWVlZS0+c3RhcnRfaWJzc193cSwodm9pZCopIGllZWU4MDIxMV9zdGFydF9pYnNzX3dxKTsKLQlJTklUX1dPUksoJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSwodm9pZCopIGllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGVfd3EpOwotCUlOSVRfV09SSygmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSwodm9pZCopIGllZWU4MDIxMV9hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKLQlJTklUX0RFTEFZRURfV09SSygmaWVlZS0+c29mdG1hY19zY2FuX3dxLCh2b2lkKikgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl93cSk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSwodm9pZCopIGllZWU4MDIxMV9hc3NvY2lhdGVfcmV0cnlfd3EpOwotCUlOSVRfV09SSygmaWVlZS0+d3hfc3luY19zY2FuX3dxLCh2b2lkKikgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cSk7Ci0vLwlJTklUX1dPUksoJmllZWUtPndhdGNoX2RvZ193cSwodm9pZCopIGllZWU4MDIxMV93YXRjaF9kb2dfd3EpOworCUlOSVRfREVMQVlFRF9XT1JLKCZpZWVlLT5zdGFydF9pYnNzX3dxLCAodm9pZCAqKSBpZWVlODAyMTFfc3RhcnRfaWJzc193cSk7CisJSU5JVF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfY29tcGxldGVfd3EsICh2b2lkICopIGllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGVfd3EpOworCUlOSVRfV09SSygmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSwgKHZvaWQgKikgaWVlZTgwMjExX2Fzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOworCUlOSVRfREVMQVlFRF9XT1JLKCZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsICh2b2lkICopIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3EpOworCUlOSVRfREVMQVlFRF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EsICh2b2lkICopIGllZWU4MDIxMV9hc3NvY2lhdGVfcmV0cnlfd3EpOworCUlOSVRfV09SSygmaWVlZS0+d3hfc3luY19zY2FuX3dxLCAodm9pZCAqKSBpZWVlODAyMTFfd3hfc3luY19zY2FuX3dxKTsKIAogCXNlbWFfaW5pdCgmaWVlZS0+d3hfc2VtLCAxKTsKIAlzZW1hX2luaXQoJmllZWUtPnNjYW5fc2VtLCAxKTsKQEAgLTI1OTgsOCArMjMyOCw3IEBACiAJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxKTsKIAotCi0JLy9hZGQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mIGJ5IGxpemhhb21pbmcgMDgwNTEyCisJLyogYWRkIGZvciBSRiBwb3dlciBvbiBwb3dlciBvZiAqLwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPkdQSU9DaGFuZ2VSRldvcmtJdGVtKTsKIAogCWRlc3Ryb3lfd29ya3F1ZXVlKGllZWUtPndxKTsKQEAgLTI2MDcsMjIgKzIzMzYsMTYgQEAKIAl1cCgmaWVlZS0+d3hfc2VtKTsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTdGFydCBvZiBXUEEgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIHRoaXMgaXMgc3RvbGVuIGZyb20gdGhlIGlwdzIyMDAgZHJpdmVyICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KKy8qIFN0YXJ0IG9mIFdQQSBjb2RlLiBUaGlzIGlzIHN0b2xlbiBmcm9tIHRoZSBpcHcyMjAwIGRyaXZlciAgKi8KIHN0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9lbmFibGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCB2YWx1ZSkKIHsKIAkvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdwYV9zdXBwbGljYW50IGxvYWRzIGFuZCBjbG9zZXMgdGhlIGRyaXZlcgogCSAqIGludGVyZmFjZS4gKi8KLQlwcmludGsoIiVzIFdQQVxuIix2YWx1ZSA/ICJlbmFibGluZyIgOiAiZGlzYWJsaW5nIik7CisJcHJpbnRrKCIlcyBXUEFcbiIsIHZhbHVlID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKIAlpZWVlLT53cGFfZW5hYmxlZCA9IHZhbHVlOwogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyB2b2lkIGllZWU4MDIxMV93cGFfYXNzb2NfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGNoYXIgKndwYV9pZSwKIAkJCSAgICAgICBpbnQgd3BhX2llX2xlbikKIHsKQEAgLTI2MzIsMTYgKzIzNTUsMTQgQEAKIAlpZWVlODAyMTFfZGlzYXNzb2NpYXRlKGllZWUpOwogfQogCi0KIHN0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9tbG1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgY29tbWFuZCwKIAkJCSAgICAgIGludCByZWFzb24pCiB7Ci0KIAlpbnQgcmV0ID0gMDsKIAogCXN3aXRjaCAoY29tbWFuZCkgewogCWNhc2UgSUVFRV9NTE1FX1NUQV9ERUFVVEg6Ci0JCS8vIHNpbGVudGx5IGlnbm9yZQorCQkvKiBzaWxlbnRseSBpZ25vcmUgKi8KIAkJYnJlYWs7CiAKIAljYXNlIElFRUVfTUxNRV9TVEFfRElTQVNTT0M6CkBAIC0yNjU2LDcgKzIzNzcsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLQogc3RhdGljIGludCBpZWVlODAyMTFfd3BhX3NldF93cGFfaWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCiAJCQkJICAgIHN0cnVjdCBpZWVlX3BhcmFtICpwYXJhbSwgaW50IHBsZW4pCiB7CkBAIC0yNjkwLDcgKzI0MTAsNiBAQAogCiBzdGF0aWMgaW50IGllZWU4MDIxMV93cGFfc2V0X2F1dGhfYWxncyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IHZhbHVlKQogewotCiAJc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSBzZWMgPSB7CiAJCS5mbGFncyA9IFNFQ19BVVRIX01PREUsCiAJfTsKQEAgLTI3MTUsNyArMjQzNCw3IEBACiBzdGF0aWMgaW50IGllZWU4MDIxMV93cGFfc2V0X3BhcmFtKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCBuYW1lLAogCQkJCSAgIHUzMiB2YWx1ZSkKIHsKLQlpbnQgcmV0PTA7CisJaW50IHJldCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXN3aXRjaCAobmFtZSkgewpAQCAtMjcyNCw3ICsyNDQzLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIElFRUVfUEFSQU1fVEtJUF9DT1VOVEVSTUVBU1VSRVM6Ci0JCWllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzPXZhbHVlOworCQlpZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcyA9IHZhbHVlOwogCQlicmVhazsKIAogCWNhc2UgSUVFRV9QQVJBTV9EUk9QX1VORU5DUllQVEVEOiB7CkBAIC0yNzQzLDE1ICsyNDYyLDE0IEBACiAJCQkuZmxhZ3MgPSBTRUNfRU5BQkxFRCwKIAkJCS5lbmFibGVkID0gdmFsdWUsCiAJCX07Ci0gCQlpZWVlLT5kcm9wX3VuZW5jcnlwdGVkID0gdmFsdWU7CisJCWllZWUtPmRyb3BfdW5lbmNyeXB0ZWQgPSB2YWx1ZTsKIAkJLyogV2Ugb25seSBjaGFuZ2UgU0VDX0xFVkVMIGZvciBvcGVuIG1vZGUuIE90aGVycwogCQkgKiBhcmUgc2V0IGJ5IGlwd193cGFfc2V0X2VuY3J5cHRpb24uCiAJCSAqLwogCQlpZiAoIXZhbHVlKSB7CiAJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwogCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzA7Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwogCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzE7CiAJCX0KQEAgLTI3NjEsMjcgKzI0NzksMjIgQEAKIAl9CiAKIAljYXNlIElFRUVfUEFSQU1fUFJJVkFDWV9JTlZPS0VEOgotCQlpZWVlLT5wcml2YWN5X2ludm9rZWQ9dmFsdWU7CisJCWllZWUtPnByaXZhY3lfaW52b2tlZCA9IHZhbHVlOwogCQlicmVhazsKLQogCWNhc2UgSUVFRV9QQVJBTV9BVVRIX0FMR1M6CiAJCXJldCA9IGllZWU4MDIxMV93cGFfc2V0X2F1dGhfYWxncyhpZWVlLCB2YWx1ZSk7CiAJCWJyZWFrOwotCiAJY2FzZSBJRUVFX1BBUkFNX0lFRUVfODAyXzFYOgotCQlpZWVlLT5pZWVlODAyXzF4PXZhbHVlOworCQlpZWVlLT5pZWVlODAyXzF4ID0gdmFsdWU7CiAJCWJyZWFrOwogCWNhc2UgSUVFRV9QQVJBTV9XUEFYX1NFTEVDVDoKLQkJLy8gYWRkZWQgZm9yIFdQQTIgbWl4ZWQgbW9kZQotCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT53cGF4IHZhbHVlID0gJXhcbiIsIHZhbHVlKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPndwYXhfc3VpdGxpc3RfbG9jayxmbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2ssIGZsYWdzKTsKIAkJaWVlZS0+d3BheF90eXBlX3NldCA9IDE7CiAJCWllZWUtPndwYXhfdHlwZV9ub3RpZnkgPSB2YWx1ZTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+d3BheF9zdWl0bGlzdF9sb2NrLGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+d3BheF9zdWl0bGlzdF9sb2NrLCBmbGFncyk7CiAJCWJyZWFrOwotCiAJZGVmYXVsdDoKLQkJcHJpbnRrKCJVbmtub3duIFdQQSBwYXJhbTogJWRcbiIsbmFtZSk7CisJCXByaW50aygiVW5rbm93biBXUEEgcGFyYW06ICVkXG4iLCBuYW1lKTsKIAkJcmV0ID0gLUVPUE5PVFNVUFA7CiAJfQogCkBAIC0yODIzLDggKzI1MzYsNyBAQAogCWlmIChzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAibm9uZSIpID09IDApIHsKIAkJaWYgKGNyeXB0KSB7CiAJCQlzZWMuZW5hYmxlZCA9IDA7Ci0JCQkvLyBGSVhNRSBGSVhNRQotCQkJLy9zZWMuZW5jcnlwdCA9IDA7CisJCQkvKiBGSVhNRSBGSVhNRSAqLwogCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzA7CiAJCQlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQgfCBTRUNfTEVWRUw7CiAJCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOwpAQCAtMjgzMiw4ICsyNTQ0LDcgQEAKIAkJZ290byBkb25lOwogCX0KIAlzZWMuZW5hYmxlZCA9IDE7Ci0vLyBGSVhNRSBGSVhNRQotLy8Jc2VjLmVuY3J5cHQgPSAxOworCS8qIEZJWE1FIEZJWE1FICovCiAJc2VjLmZsYWdzIHw9IFNFQ19FTkFCTEVEOwogCiAJLyogSVBXIEhXIGNhbm5vdCBidWlsZCBUS0lQIE1JQywgaG9zdCBkZWNyeXB0aW9uIHN0aWxsIG5lZWRlZC4gKi8KQEAgLTI5NDIsMTIgKzI2NTMsMTEgQEAKIAkJCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKnApCiB7CiAJc3RydWN0IGllZWVfcGFyYW0gKnBhcmFtOwotCWludCByZXQ9MDsKKwlpbnQgcmV0ID0gMDsKIAogCWRvd24oJmllZWUtPnd4X3NlbSk7Ci0JLy9JRUVFX0RFQlVHX0lORk8oIndwYV9zdXBwbGljYW50OiBsZW49JWRcbiIsIHAtPmxlbmd0aCk7CiAKLQlpZiAocC0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBpZWVlX3BhcmFtKSB8fCAhcC0+cG9pbnRlcil7CisJaWYgKHAtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaWVlZV9wYXJhbSkgfHwgIXAtPnBvaW50ZXIpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMjk1OSwyNyArMjY2OSwyMiBAQAogCX0KIAogCXN3aXRjaCAocGFyYW0tPmNtZCkgewotCiAJY2FzZSBJRUVFX0NNRF9TRVRfV1BBX1BBUkFNOgogCQlyZXQgPSBpZWVlODAyMTFfd3BhX3NldF9wYXJhbShpZWVlLCBwYXJhbS0+dS53cGFfcGFyYW0ubmFtZSwKIAkJCQkJcGFyYW0tPnUud3BhX3BhcmFtLnZhbHVlKTsKIAkJYnJlYWs7Ci0KIAljYXNlIElFRUVfQ01EX1NFVF9XUEFfSUU6CiAJCXJldCA9IGllZWU4MDIxMV93cGFfc2V0X3dwYV9pZShpZWVlLCBwYXJhbSwgcC0+bGVuZ3RoKTsKIAkJYnJlYWs7Ci0KIAljYXNlIElFRUVfQ01EX1NFVF9FTkNSWVBUSU9OOgogCQlyZXQgPSBpZWVlODAyMTFfd3BhX3NldF9lbmNyeXB0aW9uKGllZWUsIHBhcmFtLCBwLT5sZW5ndGgpOwogCQlicmVhazsKLQogCWNhc2UgSUVFRV9DTURfTUxNRToKIAkJcmV0ID0gaWVlZTgwMjExX3dwYV9tbG1lKGllZWUsIHBhcmFtLT51Lm1sbWUuY29tbWFuZCwKIAkJCQkgICBwYXJhbS0+dS5tbG1lLnJlYXNvbl9jb2RlKTsKIAkJYnJlYWs7Ci0KIAlkZWZhdWx0OgotCQlwcmludGsoIlVua25vd24gV1BBIHN1cHBsaWNhbnQgcmVxdWVzdDogJWRcbiIscGFyYW0tPmNtZCk7CisJCXByaW50aygiVW5rbm93biBXUEEgc3VwcGxpY2FudCByZXF1ZXN0OiAlZFxuIiwgcGFyYW0tPmNtZCk7CiAJCXJldCA9IC1FT1BOT1RTVVBQOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCmluZGV4IDNiNzk1NWYuLjA3YzNmNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCkBAIC0xLDM4ICsxLDM4IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKgorICogIENvcHlyaWdodChjKSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgYmFzZWQgb24gdGhlIFdFUCBlbmFibGVtZW50IGNvZGUgcHJvdmlkZWQgYnkgdGhlCisgKiBIb3N0IEFQIHByb2plY3QgaG9zdGFwLWRyaXZlcnMgdjAuMS4zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAqIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogSmFtZXMgUC4gS2V0cmVub3MgPGlwdzIxMDAtYWRtaW5AbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICovCiAKLSAgQ29weXJpZ2h0KGMpIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBiYXNlZCBvbiB0aGUgV0VQIGVuYWJsZW1lbnQgY29kZSBwcm92aWRlZCBieSB0aGUKLSAgSG9zdCBBUCBwcm9qZWN0IGhvc3RhcC1kcml2ZXJzIHYwLjEuMwotICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KLSAgPGprbWFsaW5lQGNjLmh1dC5maT4KLSAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KLQotICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAgbW9yZSBkZXRhaWxzLgotCi0gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotCi0gIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICBmaWxlIGNhbGxlZCBMSUNFTlNFLgotCi0gIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KLSAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAKICNpbmNsdWRlICJpZWVlODAyMTEuaCIKIHN0YXRpYyBjb25zdCBjaGFyICppZWVlODAyMTFfbW9kZXNbXSA9IHsKQEAgLTU0LDcgKzU0LDcgQEAKIAkvKiBGaXJzdCBlbnRyeSAqTVVTVCogYmUgdGhlIEFQIE1BQyBhZGRyZXNzICovCiAJaXdlLmNtZCA9IFNJT0NHSVdBUDsKIAlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCBuZXR3b3JrLT5ic3NpZCwgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShpd2UudS5hcF9hZGRyLnNhX2RhdGEsIG5ldHdvcmstPmJzc2lkKTsKIAlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CiAKIAkvKiBSZW1haW5pbmcgZW50cmllcyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgb3JkZXIgd2UgcHJvdmlkZSB0aGVtICovCkBAIC02MiwxNyArNjIsMTMgQEAKIAkvKiBBZGQgdGhlIEVTU0lEICovCiAJaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKIAlpd2UudS5kYXRhLmZsYWdzID0gMTsKLQkvL1lKLG1vZGlmaWVkLDA4MDkwMyxmb3IgaGlkZGVuIGFwCi0JLy9pZiAobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0VNUFRZX0VTU0lEKSB7CiAJaWYgKG5ldHdvcmstPnNzaWRfbGVuID09IDApIHsKLQkvL1lKLG1vZGlmaWVkLDA4MDkwMyxlbmQKIAkJaXdlLnUuZGF0YS5sZW5ndGggPSBzaXplb2YoIjxoaWRkZW4+Iik7CiAJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsICI8aGlkZGVuPiIpOwogCX0gZWxzZSB7Ci0JCWl3ZS51LmRhdGEubGVuZ3RoID0gbWluKG5ldHdvcmstPnNzaWRfbGVuLCAodTgpMzIpOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IG1pbl90KHU4LCBuZXR3b3JrLT5zc2lkX2xlbiwgMzIpOwogCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBuZXR3b3JrLT5zc2lkKTsKIAl9Ci0JLy9wcmludGsoIkVTU0lEOiAlc1xuIixuZXR3b3JrLT5zc2lkKTsKIAkvKiBBZGQgdGhlIHByb3RvY29sIG5hbWUgKi8KIAlpd2UuY21kID0gU0lPQ0dJV05BTUU7CiAJc25wcmludGYoaXdlLnUubmFtZSwgSUZOQU1TSVosICJJRUVFIDgwMi4xMSVzIiwgaWVlZTgwMjExX21vZGVzW25ldHdvcmstPm1vZGVdKTsKQEAgLTkyLDggKzg4LDYgQEAKIAogCS8qIEFkZCBmcmVxdWVuY3kvY2hhbm5lbCAqLwogCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKLS8qCWl3ZS51LmZyZXEubSA9IGllZWU4MDIxMV9mcmVxdWVuY3kobmV0d29yay0+Y2hhbm5lbCwgbmV0d29yay0+bW9kZSk7Ci0JaXdlLnUuZnJlcS5lID0gMzsgKi8KIAlpd2UudS5mcmVxLm0gPSBuZXR3b3JrLT5jaGFubmVsOwogCWl3ZS51LmZyZXEuZSA9IDA7CiAJaXdlLnUuZnJlcS5pID0gMDsKQEAgLTE0NSwxMCArMTM5LDkgQEAKIAkvKiBBZGQgcXVhbGl0eSBzdGF0aXN0aWNzICovCiAJLyogVE9ETzogRml4IHRoZXNlIHZhbHVlcy4uLiAqLwogCWlmIChuZXR3b3JrLT5zdGF0cy5zaWduYWwgPT0gMCB8fCBuZXR3b3JrLT5zdGF0cy5yc3NpID09IDApCi0JCXByaW50aygiPT09PT09PT0+c2lnbmFsOiVkLCByc3NpOiVkXG4iLCBuZXR3b3JrLT5zdGF0cy5zaWduYWwsCi0JCSAgICAgICBuZXR3b3JrLT5zdGF0cy5yc3NpKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiPT09PT09PT0+c2lnbmFsOiVkLCByc3NpOiVkXG4iLAorCQkJICAgIG5ldHdvcmstPnN0YXRzLnNpZ25hbCwgbmV0d29yay0+c3RhdHMucnNzaSk7CiAJaXdlLmNtZCA9IElXRVZRVUFMOwotLy8JcHJpbnRrKCJTSUdOQUw6ICVkLFJTU0k6ICVkLE5PSVNFOiAlZFxuIixuZXR3b3JrLT5zdGF0cy5zaWduYWwsbmV0d29yay0+c3RhdHMucnNzaSxuZXR3b3JrLT5zdGF0cy5ub2lzZSk7CiAJaXdlLnUucXVhbC5xdWFsID0gbmV0d29yay0+c3RhdHMuc2lnbmFsc3RyZW5ndGg7CiAJaXdlLnUucXVhbC5sZXZlbCA9IG5ldHdvcmstPnN0YXRzLnNpZ25hbDsKIAlpd2UudS5xdWFsLm5vaXNlID0gbmV0d29yay0+c3RhdHMubm9pc2U7CkBAIC0xNzEsNyArMTY0LDYgQEAKIAogCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJaWYgKG5ldHdvcmstPndwYV9pZV9sZW4pIHsKLQkvLwlwcmludGsoIndwYV9pZV9sZW46JWRcbiIsIG5ldHdvcmstPndwYV9pZV9sZW4pOwogCQljaGFyIGJ1ZltNQVhfV1BBX0lFX0xFTl07CiAJCW1lbWNweShidWYsIG5ldHdvcmstPndwYV9pZSwgbmV0d29yay0+d3BhX2llX2xlbik7CiAJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CkBAIC0xODEsNyArMTczLDYgQEAKIAogCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJaWYgKG5ldHdvcmstPnJzbl9pZV9sZW4pIHsKLQkvLwlwcmludGsoIj09PT09PnJzbl9pZV9sZW46XG4iLCBuZXR3b3JrLT5yc25faWVfbGVuKTsKIAkJY2hhciBidWZbTUFYX1dQQV9JRV9MRU5dOwogCQltZW1jcHkoYnVmLCBuZXR3b3JrLT5yc25faWUsIG5ldHdvcmstPnJzbl9pZV9sZW4pOwogCQlpd2UuY21kID0gSVdFVkdFTklFOwpAQCAtMTkwLDcgKzE4MSw4IEBACiAJfQogCiAJLyogQWRkIEVYVFJBOiBBZ2UgdG8gZGlzcGxheSBzZWNvbmRzIHNpbmNlIGxhc3QgYmVhY29uL3Byb2JlIHJlc3BvbnNlCi0JICogZm9yIGdpdmVuIG5ldHdvcmsuICovCisJICogZm9yIGdpdmVuIG5ldHdvcmsuCisJICovCiAJaXdlLmNtZCA9IElXRVZDVVNUT007CiAJcCA9IGN1c3RvbTsKIAlwICs9IHNucHJpbnRmKHAsIE1BWF9DVVNUT01fTEVOIC0gKHAgLSBjdXN0b20pLApAQCAtMjEwLDggKzIwMiw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZXJyID0gMDsKIAljaGFyICpldiA9IGV4dHJhOwotCWNoYXIgKnN0b3AgPSBldiArIHdycXUtPmRhdGEubGVuZ3RoOy8vSVdfU0NBTl9NQVhfREFUQTsKLQkvL2NoYXIgKnN0b3AgPSBldiArIElXX1NDQU5fTUFYX0RBVEE7CisJY2hhciAqc3RvcCA9IGV2ICsgd3JxdS0+ZGF0YS5sZW5ndGg7CiAJaW50IGkgPSAwOwogCiAJSUVFRTgwMjExX0RFQlVHX1dYKCJHZXR0aW5nIHNjYW5cbiIpOwpAQCAtMjg3LDcgKzI3OCw4IEBACiAJCQlJRUVFODAyMTFfREVCVUdfV1goIkRpc2FibGluZyBlbmNyeXB0aW9uLlxuIik7CiAKIAkJLyogQ2hlY2sgYWxsIHRoZSBrZXlzIHRvIHNlZSBpZiBhbnkgYXJlIHN0aWxsIGNvbmZpZ3VyZWQsCi0JCSAqIGFuZCBpZiBubyBrZXkgaW5kZXggd2FzIHByb3ZpZGVkLCBkZS1pbml0IHRoZW0gYWxsICovCisJCSAqIGFuZCBpZiBubyBrZXkgaW5kZXggd2FzIHByb3ZpZGVkLCBkZS1pbml0IHRoZW0gYWxsLgorCQkgKi8KIAkJZm9yIChpID0gMDsgaSA8IFdFUF9LRVlTOyBpKyspIHsKIAkJCWlmIChpZWVlLT5jcnlwdFtpXSAhPSBOVUxMKSB7CiAJCQkJaWYgKGtleV9wcm92aWRlZCkKQEAgLTMwNiwxNSArMjk4LDE0IEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKLQotCiAJc2VjLmVuYWJsZWQgPSAxOwogCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRDsKIAogCWlmICgqY3J5cHQgIT0gTlVMTCAmJiAoKmNyeXB0KS0+b3BzICE9IE5VTEwgJiYKIAkgICAgc3RyY21wKCgqY3J5cHQpLT5vcHMtPm5hbWUsICJXRVAiKSAhPSAwKSB7CiAJCS8qIGNoYW5naW5nIHRvIHVzZSBXRVA7IGRlaW5pdCBwcmV2aW91c2x5IHVzZWQgYWxnb3JpdGhtCi0JCSAqIG9uIHRoaXMga2V5ICovCisJCSAqIG9uIHRoaXMga2V5LgorCQkgKi8KIAkJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKIAl9CiAKQEAgLTM1OSwxMCArMzUwLDExIEBACiAJCQkJICAgICAgICgqY3J5cHQpLT5wcml2KTsKIAkJc2VjLmZsYWdzIHw9ICgxIDw8IGtleSk7CiAJCS8qIFRoaXMgZW5zdXJlcyBhIGtleSB3aWxsIGJlIGFjdGl2YXRlZCBpZiBubyBrZXkgaXMKLQkJICogZXhwbGljaXRseSBzZXQgKi8KKwkJICogZXhwbGljaXRseSBzZXQuCisJCSAqLwogCQlpZiAoa2V5ID09IHNlYy5hY3RpdmVfa2V5KQogCQkJc2VjLmZsYWdzIHw9IFNFQ19BQ1RJVkVfS0VZOwotCQlpZWVlLT50eF9rZXlpZHggPSBrZXk7Ly9ieSB3YiAwODAzMTIKKwkJaWVlZS0+dHhfa2V5aWR4ID0ga2V5OwogCX0gZWxzZSB7CiAJCWxlbiA9ICgqY3J5cHQpLT5vcHMtPmdldF9rZXkoc2VjLmtleXNba2V5XSwgV0VQX0tFWV9MRU4sCiAJCQkJCSAgICAgTlVMTCwgKCpjcnlwdCktPnByaXYpOwpAQCAtMzk1LDcgKzM4Nyw4IEBACiAJCQkgICAiT1BFTiIgOiAiU0hBUkVEIEtFWSIpOwogCiAJLyogRm9yIG5vdyB3ZSBqdXN0IHN1cHBvcnQgV0VQLCBzbyBvbmx5IHNldCB0aGF0IHNlY3VyaXR5IGxldmVsLi4uCi0JICogVE9ETzogV2hlbiBXUEEgaXMgYWRkZWQgdGhpcyBpcyBvbmUgcGxhY2UgdGhhdCBuZWVkcyB0byBjaGFuZ2UgKi8KKwkgKiBUT0RPOiBXaGVuIFdQQSBpcyBhZGRlZCB0aGlzIGlzIG9uZSBwbGFjZSB0aGF0IG5lZWRzIHRvIGNoYW5nZQorCSAqLwogCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CiAJc2VjLmxldmVsID0gU0VDX0xFVkVMXzE7IC8qIDQwIGFuZCAxMDQgYml0IFdFUCAqLwogCkBAIC00MDYsNyArMzk5LDggQEAKIAkgKiBnZW5lcmF0ZSBuZXcgSUVFRSA4MDIuMTEgYXV0aGVudGljYXRpb24gd2hpY2ggbWF5IGVuZCB1cCBpbiBsb29waW5nCiAJICogd2l0aCBJRUVFIDgwMi4xWC4gIElmIHlvdXIgaGFyZHdhcmUgcmVxdWlyZXMgYSByZXNldCBhZnRlciBXRVAKIAkgKiBjb25maWd1cmF0aW9uIChmb3IgZXhhbXBsZS4uLiBQcmlzbTIpLCBpbXBsZW1lbnQgdGhlIHJlc2V0X3BvcnQgaW4KLQkgKiB0aGUgY2FsbGJhY2tzIHN0cnVjdHVyZXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSA4MDIuMTEgc3RhY2suICovCisJICogdGhlIGNhbGxiYWNrcyBzdHJ1Y3R1cmVzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgODAyLjExIHN0YWNrLgorCSAqLwogCWlmIChpZWVlLT5yZXNldF9vbl9rZXljaGFuZ2UgJiYKIAkgICAgaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBICYmCiAJICAgIGllZWUtPnJlc2V0X3BvcnQgJiYgaWVlZS0+cmVzZXRfcG9ydChkZXYpKSB7CkBAIC00NDgsNyArNDQyLDggQEAKIAogCWlmIChzdHJjbXAoY3J5cHQtPm9wcy0+bmFtZSwgIldFUCIpICE9IDApIHsKIAkJLyogb25seSBXRVAgaXMgc3VwcG9ydGVkIHdpdGggd2lyZWxlc3MgZXh0ZW5zaW9ucywgc28ganVzdAotCQkgKiByZXBvcnQgdGhhdCBlbmNyeXB0aW9uIGlzIHVzZWQgKi8KKwkJICogcmVwb3J0IHRoYXQgZW5jcnlwdGlvbiBpcyB1c2VkLgorCQkgKi8KIAkJZXJxLT5sZW5ndGggPSAwOwogCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwogCQlyZXR1cm4gMDsKQEAgLTQ4Myw3ICs0NzgsNiBAQAogCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0gewogCQkuZmxhZ3MgPSAwLAogCX07Ci0JLy9wcmludGsoIj09PT09PT5lbmNvZGluZyBmbGFnOiV4LGV4dCBmbGFnOiV4LCBleHQgYWxnOiVkXG4iLCBlbmNvZGluZy0+ZmxhZ3MsZXh0LT5leHRfZmxhZ3MsIGV4dC0+YWxnKTsKIAlpZHggPSBlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CiAJaWYgKGlkeCkgewogCQlpZiAoaWR4IDwgMSB8fCBpZHggPiBXRVBfS0VZUykKQEAgLTQ5Nyw3ICs0OTEsNiBAQAogCQlncm91cF9rZXkgPSAxOwogCX0gZWxzZSB7CiAJCS8qIHNvbWUgQ2lzY28gQVBzIHVzZSBpZHg+MCBmb3IgdW5pY2FzdCBpbiBkeW5hbWljIFdFUCAqLwotCQkvL3ByaW50aygibm90IGdyb3VwIGtleSwgZmxhZ3M6JXgsIGV4dC0+YWxnOiVkXG4iLCBleHQtPmV4dF9mbGFncywgZXh0LT5hbGcpOwogCQlpZiAoaWR4ICE9IDAgJiYgZXh0LT5hbGcgIT0gSVdfRU5DT0RFX0FMR19XRVApCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkKQEAgLTUwNiw3ICs0OTksNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0Jc2VjLmZsYWdzIHw9IFNFQ19FTkFCTEVEOy8vIHwgU0VDX0VOQ1JZUFQ7CisJc2VjLmZsYWdzIHw9IFNFQ19FTkFCTEVEOwogCWlmICgoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB8fAogCSAgICBleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX05PTkUpIHsKIAkJaWYgKCpjcnlwdCkKQEAgLTUxOCwxNiArNTExLDEzIEBACiAKIAkJaWYgKGkgPT0gV0VQX0tFWVMpIHsKIAkJCXNlYy5lbmFibGVkID0gMDsKLQkJCS8vIHNlYy5lbmNyeXB0ID0gMDsKIAkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8wOwogCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKIAkJfQotCQkvL3ByaW50aygiZGlzYWJsZWQ6IGZsYWc6JXhcbiIsIGVuY29kaW5nLT5mbGFncyk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKIAlzZWMuZW5hYmxlZCA9IDE7Ci0gICAgLy8gICAgc2VjLmVuY3J5cHQgPSAxOwogCiAJc3dpdGNoIChleHQtPmFsZykgewogCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CkBAIC01NDUsNyArNTM1LDYgQEAKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBkb25lOwogCX0KLS8vCXByaW50aygiOC0wOS0wOC05PT09PT0+JXMsIGFsZyBuYW1lOiVzXG4iLF9fZnVuY19fLCBhbGcpOwogCiAJb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGFsZyk7CiAJaWYgKG9wcyA9PSBOVUxMKQpAQCAtNTUzLDcgKzU0Miw4IEBACiAJaWYgKG9wcyA9PSBOVUxMKSB7CiAJCUlFRUU4MDIxMV9ERUJVR19XWCgiJXM6IHVua25vd24gY3J5cHRvIGFsZyAlZFxuIiwKIAkJCQkgICBkZXYtPm5hbWUsIGV4dC0+YWxnKTsKLQkJcHJpbnRrKCI9PT09PT09PT51bmtub3duIGNyeXB0byBhbGcgJWRcbiIsIGV4dC0+YWxnKTsKKwkJbmV0ZGV2X2VycihpZWVlLT5kZXYsICI9PT09PT09PT51bmtub3duIGNyeXB0byBhbGcgJWRcbiIsCisJCQkgICBleHQtPmFsZyk7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZG9uZTsKIAl9CkBAIC01ODQsMTMgKzU3NCwxMSBAQAogCSAgICAoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KGV4dC0+a2V5LCBleHQtPmtleV9sZW4sIGV4dC0+cnhfc2VxLAogCQkJCSAgICgqY3J5cHQpLT5wcml2KSA8IDApIHsKIAkJSUVFRTgwMjExX0RFQlVHX1dYKCIlczoga2V5IHNldHRpbmcgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOwotCQlwcmludGsoImtleSBzZXR0aW5nIGZhaWxlZFxuIik7CisJCW5ldGRldl9lcnIoaWVlZS0+ZGV2LCAia2V5IHNldHRpbmcgZmFpbGVkXG4iKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBkb25lOwogCX0KICNpZiAxCi0gLy9za2lwX2hvc3RfY3J5cHQ6Ci0JLy9wcmludGsoInNraXBfaG9zdF9jcnlwdDpleHRfZmxhZ3M6JXhcbiIsIGV4dC0+ZXh0X2ZsYWdzKTsKIAlpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpIHsKIAkJaWVlZS0+dHhfa2V5aWR4ID0gaWR4OwogCQlzZWMuYWN0aXZlX2tleSA9IGlkeDsKQEAgLTYwMiwxNSArNTkwLDEyIEBACiAJCXNlYy5rZXlfc2l6ZXNbaWR4XSA9IGV4dC0+a2V5X2xlbjsKIAkJc2VjLmZsYWdzIHw9ICgxIDw8IGlkeCk7CiAJCWlmIChleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX1dFUCkgewotCQkgICAgICAvLyAgc2VjLmVuY29kZV9hbGdbaWR4XSA9IFNFQ19BTEdfV0VQOwogCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKIAkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8xOwogCQl9IGVsc2UgaWYgKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfVEtJUCkgewotCQkgICAgICAvLyAgc2VjLmVuY29kZV9hbGdbaWR4XSA9IFNFQ19BTEdfVEtJUDsKIAkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CiAJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMjsKIAkJfSBlbHNlIGlmIChleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX0NDTVApIHsKLQkJICAgICAgIC8vIHNlYy5lbmNvZGVfYWxnW2lkeF0gPSBTRUNfQUxHX0NDTVA7CiAJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwogCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzM7CiAJCX0KQEAgLTYzMiwyMCArNjE3LDE5IEBACiAKIAlyZXR1cm4gcmV0OwogfQorCiBpbnQgaWVlZTgwMjExX3d4X3NldF9tbG1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAogCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3QgaXdfbWxtZSAqbWxtZSA9IChzdHJ1Y3QgaXdfbWxtZSAqKSBleHRyYTsKLS8vCXByaW50aygiXG5ka2dhZGZzbGtkamdhbHNrZGY9PT09PT09PT09PT09PT0+JXMoKSwgY21kOiV4XG4iLCBfX2Z1bmNfXywgbWxtZS0+Y21kKTsKICNpZiAxCiAJc3dpdGNoIChtbG1lLT5jbWQpIHsKIAljYXNlIElXX01MTUVfREVBVVRIOgogCWNhc2UgSVdfTUxNRV9ESVNBU1NPQzoKLQkvLwlwcmludGsoImRpc2Fzc29jIG5vd1xuIik7CiAJCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUoaWVlZSk7CiAJCWJyZWFrOwotCSBkZWZhdWx0OgorCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAjZW5kaWYKQEAgLTY1NiwyNCArNjQwLDE2IEBACiAJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgIHN0cnVjdCBpd19wYXJhbSAqZGF0YSwgY2hhciAqZXh0cmEpCiB7Ci0vKgotCSBzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKLQkJLmZsYWdzID0gU0VDX0FVVEhfTU9ERSwKLQl9Ci0qLwotCS8vcHJpbnRrKCJzZXQgYXV0aDpmbGFnOiV4LCBkYXRhIHZhbHVlOiV4XG4iLCBkYXRhLT5mbGFncywgZGF0YS0+dmFsdWUpOwogCXN3aXRjaCAoZGF0YS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CiAJY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgotCSAgICAgLypuZWVkIHRvIHN1cHBvcnQgd3BhMiBoZXJlKi8KLQkJLy9wcmludGsoIndwYSB2ZXJzaW9uOiV4XG4iLCBkYXRhLT52YWx1ZSk7CisJCS8qIG5lZWQgdG8gc3VwcG9ydCB3cGEyIGhlcmUgKi8KIAkJYnJlYWs7CiAJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKIAljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgogCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKLQkJLyoKLSAqICAgICAgICAgICAgICAgICAgKiBIb3N0IEFQIGRyaXZlciBkb2VzIG5vdCB1c2UgdGhlc2UgcGFyYW1ldGVycyBhbmQgYWxsb3dzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3cGFfc3VwcGxpY2FudCB0byBjb250cm9sIHRoZW0gaW50ZXJuYWxseS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCS8qIEhvc3QgQVAgZHJpdmVyIGRvZXMgbm90IHVzZSB0aGVzZSBwYXJhbWV0ZXJzIGFuZCBhbGxvd3MKKwkJICogd3BhX3N1cHBsaWNhbnQgdG8gY29udHJvbCB0aGVtIGludGVybmFsbHkuCisJCSAqLwogCQlicmVhazsKIAljYXNlIElXX0FVVEhfVEtJUF9DT1VOVEVSTUVBU1VSRVM6CiAJCWllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzID0gZGF0YS0+dmFsdWU7CkBAIC02ODQsMTMgKzY2MCwxMSBAQAogCiAJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgogCQlpZWVlLT5vcGVuX3dlcCA9IChkYXRhLT52YWx1ZSZJV19BVVRIX0FMR19PUEVOX1NZU1RFTSkgPyAxIDogMDsKLQkJLy9wcmludGsoIm9wZW5fd2VwOiVkXG4iLCBpZWVlLT5vcGVuX3dlcCk7CiAJCWJyZWFrOwogCiAjaWYgMQogCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKIAkJaWVlZS0+d3BhX2VuYWJsZWQgPSAoZGF0YS0+dmFsdWUpID8gMSA6IDA7Ci0JCS8vcHJpbnRrKCJlbmFibGUgd3BhOiVkXG4iLCBpZWVlLT53cGFfZW5hYmxlZCk7CiAJCWJyZWFrOwogCiAjZW5kaWYKQEAgLTcxMiwxMyArNjg2LDEzIEBACiAJdTggKmJ1ZiA9IE5VTEw7CiAKIAlpZiAobGVuID4gTUFYX1dQQV9JRV9MRU4gfHwgKGxlbiAmJiBpZSA9PSBOVUxMKSkgewotCQlwcmludGsoInJldHVybiBlcnJvciBvdXQsIGxlbjolenVcbiIsIGxlbik7CisJCW5ldGRldl9lcnIoaWVlZS0+ZGV2LCAicmV0dXJuIGVycm9yIG91dCwgbGVuOiV6dVxuIiwgbGVuKTsKIAlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAobGVuKSB7CiAJCWlmIChsZW4gIT0gaWVbMV0rMikgewotCQkJcHJpbnRrKCJsZW46JXp1LCBpZTolZFxuIiwgbGVuLCBpZVsxXSk7CisJCQluZXRkZXZfZXJyKGllZWUtPmRldiwgImxlbjolenUsIGllOiVkXG4iLCBsZW4sIGllWzFdKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWJ1ZiA9IGttZW1kdXAoaWUsIGxlbiwgR0ZQX0tFUk5FTCk7CkBAIC03MzIsNyArNzA2LDYgQEAKIAkJaWVlZS0+d3BhX2llID0gTlVMTDsKIAkJaWVlZS0+d3BhX2llX2xlbiA9IDA7CiAJfQotLy8JcHJpbnRrKCI8PT09PT1vdXQgJXMoKVxuIiwgX19mdW5jX18pOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODAuaAppbmRleCA4OTk5ZWM2Li45ZjkzMWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MC5oCkBAIC0xLDE5ICsxLDE4IEBACiAvKgotICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIuCi0gICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYS5tZXJlbGxvQGdtYWlsLmNvbT4KLSAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCi0KLSAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlCi0gICBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgotCi0gICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uCi0gICBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KLQotICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyCi0KLSAgIFdlIHdhbnQgdG8gdGhhbmtzIHRoZSBBdXRob3JzIG9mIHRob3NlIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIKLSAgIHByb2plY3QgQXV0aG9ycy4KLSovCisgKiBUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlci4KKyAqIENvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNC0yMDA1ICA8YW5kcmVhLm1lcmVsbG9AZ21haWwuY29tPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKyAqCisgKiBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorICoKKyAqIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24gZnJvbSBQYXRyaWMKKyAqIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgorICoKKyAqIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlcgorICoKKyAqIFdlIHdhbnQgdG8gdGhhbmtzIHRoZSBBdXRob3JzIG9mIHRob3NlIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIgcHJvamVjdAorICogQXV0aG9ycy4KKyAqLwogCiAjaWZuZGVmIFI4MTgwSAogI2RlZmluZSBSODE4MEgKQEAgLTIxLDEzICsyMCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCiAjZGVmaW5lIFJUTDgxODBfTU9EVUxFX05BTUUgInI4MTgwIgotI2RlZmluZSBETUVTRyh4LGEuLi4pIHByaW50ayhLRVJOX0lORk8gUlRMODE4MF9NT0RVTEVfTkFNRSAiOiAiIHggIlxuIiwgIyMgYSkKLSNkZWZpbmUgRE1FU0dXKHgsYS4uLikgcHJpbnRrKEtFUk5fV0FSTklORyBSVEw4MTgwX01PRFVMRV9OQU1FICI6IFdXOiIgeCAiXG4iLCAjIyBhKQotI2RlZmluZSBETUVTR0UoeCxhLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIFJUTDgxODBfTU9EVUxFX05BTUUgIjogRUU6IiB4ICJcbiIsICMjIGEpCisjZGVmaW5lIERNRVNHKHgsIGEuLi4pIHByaW50ayhLRVJOX0lORk8gUlRMODE4MF9NT0RVTEVfTkFNRSAiOiAiIHggIlxuIiwgIyMgYSkKKyNkZWZpbmUgRE1FU0dXKHgsIGEuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgUlRMODE4MF9NT0RVTEVfTkFNRSAiOiBXVzoiIHggIlxuIiwgIyMgYSkKKyNkZWZpbmUgRE1FU0dFKHgsIGEuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgUlRMODE4MF9NT0RVTEVfTkFNRSAiOiBFRToiIHggIlxuIiwgIyMgYSkKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMzYsMjIgKzM0LDIxIEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgkvL2ZvciBydG5sX2xvY2soKQorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPiAvKiBmb3IgcnRubF9sb2NrKCkgKi8KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgkvLyBOZWNlc3NhcnkgYmVjYXVzZSB3ZSB1c2UgdGhlIHByb2MgZnMKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+IC8qIE5lY2Vzc2FyeSBiZWNhdXNlIHdlIHVzZSB0aGUgcHJvYyBmcy4gKi8KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlICJpZWVlODAyMTEvaWVlZTgwMjExLmgiCiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0vLyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKICNkZWZpbmUgRVBST01fOTNjNDYgMAogI2RlZmluZSBFUFJPTV85M2M1NiAxCiAKLSNkZWZpbmUgUlRMX0lPQ1RMX1dQQV9TVVBQTElDQU5UCQlTSU9DSVdGSVJTVFBSSVYrMzAKKyNkZWZpbmUgUlRMX0lPQ1RMX1dQQV9TVVBQTElDQU5UIChTSU9DSVdGSVJTVFBSSVYgKyAzMCkKIAogI2RlZmluZSBERUZBVUxUX0ZSQUdfVEhSRVNIT0xEIDIzNDJVCi0jZGVmaW5lIE1JTl9GUkFHX1RIUkVTSE9MRCAgICAgMjU2VQorI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQgMjU2VQogI2RlZmluZSBERUZBVUxUX1JUU19USFJFU0hPTEQgMjM0MlUKICNkZWZpbmUgTUlOX1JUU19USFJFU0hPTEQgMFUKICNkZWZpbmUgTUFYX1JUU19USFJFU0hPTEQgMjM0MlUKQEAgLTYwLDEzMiArNTcsOTkgQEAKICNkZWZpbmUgREVGQVVMVF9SRVRSWV9SVFMgNwogI2RlZmluZSBERUZBVUxUX1JFVFJZX0RBVEEgNwogCi0jZGVmaW5lIEJFQUNPTl9RVUVVRQkJCQkJNgorI2RlZmluZSBCRUFDT05fUVVFVUUgNgogCi0jZGVmaW5lIGFTaWZzVGltZSAJMTAKKyNkZWZpbmUgYVNpZnNUaW1lIDEwCiAKLSNkZWZpbmUgc0NyY0xuZyAgICAgICAgIDQKLSNkZWZpbmUgc0Fja0N0c0xuZwkxMTIJCS8vIGJpdHMgaW4gQUNLIGFuZCBDVFMgZnJhbWVzCi0vLytieSBhbXkgMDgwMzEyCi0jZGVmaW5lIFJBVEVfQURBUFRJVkVfVElNRVJfUEVSSU9ECTMwMAorI2RlZmluZSBzQ3JjTG5nIDQKKyNkZWZpbmUgc0Fja0N0c0xuZyAxMTIgLyogYml0cyBpbiBBQ0sgYW5kIENUUyBmcmFtZXMuICovCisvKiArYnkgYW15IDA4MDMxMi4gKi8KKyNkZWZpbmUgUkFURV9BREFQVElWRV9USU1FUl9QRVJJT0QgMzAwCiAKLXR5cGVkZWYgZW51bSBfV0lSRUxFU1NfTU9ERSB7CitlbnVtIHdpcmVsZXNzX21vZGUgewogCVdJUkVMRVNTX01PREVfVU5LTk9XTiA9IDB4MDAsCiAJV0lSRUxFU1NfTU9ERV9BID0gMHgwMSwKIAlXSVJFTEVTU19NT0RFX0IgPSAweDAyLAogCVdJUkVMRVNTX01PREVfRyA9IDB4MDQsCiAJV0lSRUxFU1NfTU9ERV9BVVRPID0gMHgwOCwKLX0gV0lSRUxFU1NfTU9ERTsKK307CiAKLXR5cGVkZWYgc3RydWN0IAlDaG5sQWNjZXNzU2V0dGluZyB7Ci0JdTE2IFNJRlNfVGltZXI7Ci0JdTE2IERJRlNfVGltZXI7Ci0JdTE2IFNsb3RUaW1lVGltZXI7Ci0JdTE2IEVJRlNfVGltZXI7Ci0JdTE2IENXbWluSW5kZXg7Ci0JdTE2IENXbWF4SW5kZXg7Ci19KlBDSEFOTkVMX0FDQ0VTU19TRVRUSU5HLENIQU5ORUxfQUNDRVNTX1NFVFRJTkc7CitzdHJ1Y3QgY2hubF9hY2Nlc3Nfc2V0dGluZyB7CisJdTE2IHNpZnNfdGltZXI7CisJdTE2IGRpZnNfdGltZXI7CisJdTE2IHNsb3RfdGltZV90aW1lcjsKKwl1MTYgZWlmc190aW1lcjsKKwl1MTYgY3dtaW5faW5kZXg7CisJdTE2IGN3bWF4X2luZGV4OworfTsKIAotdHlwZWRlZiBlbnVtewotICAgICAgICBOSUNfODE4NSA9IDEsCi0gICAgICAgIE5JQ184MTg1QgotICAgICAgICB9IG5pY190OworZW51bSBuaWNfdCB7CisJTklDXzgxODUgPSAxLAorCU5JQ184MTg1QgorfTsKIAogdHlwZWRlZiB1MzIgQUNfQ09ESU5HOwotI2RlZmluZSBBQzBfQkUJMAkJLy8gQUNJOiAweDAwCS8vIEJlc3QgRWZmb3J0Ci0jZGVmaW5lIEFDMV9CSwkxCQkvLyBBQ0k6IDB4MDEJLy8gQmFja2dyb3VuZAotI2RlZmluZSBBQzJfVkkJMgkJLy8gQUNJOiAweDEwCS8vIFZpZGVvCi0jZGVmaW5lIEFDM19WTwkzCQkvLyBBQ0k6IDB4MTEJLy8gVm9pY2UKLSNkZWZpbmUgQUNfTUFYCTQJCS8vIE1heDogZGVmaW5lIHRvdGFsIG51bWJlcjsgU2hvdWxkIG5vdCB0byBiZSB1c2VkIGFzIGEgcmVhbCBlbnVtLgorI2RlZmluZSBBQzBfQkUJMCAvKiBBQ0k6IDB4MDAgKi8gLyogQmVzdCBFZmZvcnQuICovCisjZGVmaW5lIEFDMV9CSwkxIC8qIEFDSTogMHgwMSAqLyAvKiBCYWNrZ3JvdW5kLiAqLworI2RlZmluZSBBQzJfVkkJMiAvKiBBQ0k6IDB4MTAgKi8gLyogVmlkZW8uICovCisjZGVmaW5lIEFDM19WTwkzIC8qIEFDSTogMHgxMSAqLyAvKiBWb2ljZS4gKi8KKyNkZWZpbmUgQUNfTUFYCTQgLyogTWF4OiBkZWZpbmUgdG90YWwgbnVtYmVyOyBTaG91bGQgbm90IHRvIGJlIHVzZWQgYXMgYSByZWFsCisJCSAgICogZW51bS4KKwkJICAgKi8KIAotLy8KLS8vIEVDV21pbi9FQ1dtYXggZmllbGQuCi0vLyBSZWY6IFdNTSBzcGVjIDIuMi4yOiBXTUUgUGFyYW1ldGVyIEVsZW1lbnQsIHAuMTMuCi0vLwotdHlwZWRlZgl1bmlvbiBfRUNXewotCXU4CWNoYXJEYXRhOwotCXN0cnVjdAotCXsKLQkJdTgJRUNXbWluOjQ7Ci0JCXU4CUVDV21heDo0OwotCX1mOwkvLyBGaWVsZAotfUVDVywgKlBFQ1c7Ci0KLS8vCi0vLyBBQ0kvQUlGU04gRmllbGQuCi0vLyBSZWY6IFdNTSBzcGVjIDIuMi4yOiBXTUUgUGFyYW1ldGVyIEVsZW1lbnQsIHAuMTIuCi0vLwotdHlwZWRlZgl1bmlvbiBfQUNJX0FJRlNOewotCXU4CWNoYXJEYXRhOwotCi0Jc3RydWN0Ci0JewotCQl1OAlBSUZTTjo0OwotCQl1OAlBQ006MTsKLQkJdTgJQUNJOjI7Ci0JCXU4CVJlc2VydmVkOjE7Ci0JfWY7CS8vIEZpZWxkCi19QUNJX0FJRlNOLCAqUEFDSV9BSUZTTjsKLQotLy8KLS8vIEFDIFBhcmFtZXRlcnMgUmVjb3JkIEZvcm1hdC4KLS8vIFJlZjogV01NIHNwZWMgMi4yLjI6IFdNRSBQYXJhbWV0ZXIgRWxlbWVudCwgcC4xMi4KLS8vCi10eXBlZGVmCXVuaW9uIF9BQ19QQVJBTXsKLQl1MzIJbG9uZ0RhdGE7Ci0JdTgJY2hhckRhdGFbNF07Ci0KLQlzdHJ1Y3QKLQl7Ci0JCUFDSV9BSUZTTglBY2lBaWZzbjsKLQkJRUNXCQlFY3c7Ci0JCXUxNgkJVFhPUExpbWl0OwotCX1mOwkvLyBGaWVsZAotfUFDX1BBUkFNLCAqUEFDX1BBUkFNOwotCi0vKiBpdCBpcyBhIHdyb25nIGRlZmluaXRpb24uIC14aW9uZy0yMDA2LTExLTE3Ci10eXBlZGVmIHN0cnVjdCBUaHJlZVdpcmVSZWcgewotCXUxNglsb25nRGF0YTsKKy8qCisgKiBFQ1dtaW4vRUNXbWF4IGZpZWxkLgorICogUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEzLgorICovCit0eXBlZGVmIHVuaW9uIF9FQ1cgeworCXU4IGNoYXJEYXRhOwogCXN0cnVjdCB7Ci0JCXU4CWVuYWJsZUI7Ci0JCXU4CWRhdGE7Ci0JCXU4CWNsazsKLQkJdTgJcmVhZF93cml0ZTsKLQl9IHN0cnVjOwotfSBUaHJlZVdpcmVSZWc7Ci0qLworCQl1OCBFQ1dtaW46NDsKKwkJdTggRUNXbWF4OjQ7CisJfSBmOwkvKiBGaWVsZCAqLworfSBFQ1csICpQRUNXOwogCi10eXBlZGVmCXVuaW9uIF9UaHJlZVdpcmV7Ci0Jc3RydWN0IF9UaHJlZVdpcmVTdHJ1Y3sKLQkJdTE2CQlkYXRhOjE7Ci0JCXUxNgkJY2xrOjE7Ci0JCXUxNgkJZW5hYmxlQjoxOwotCQl1MTYJCXJlYWRfd3JpdGU6MTsKLQkJdTE2CQlyZXN2MToxMjsKLS8vCQl1MkJ5dGUJcmVzdjI6MTQ7Ci0vLwkJdTJCeXRlCVRocmVlV2lyZUVuYWJsZToxOwotLy8JCXUyQnl0ZQlyZXN2MzoxOwotCX1zdHJ1YzsKLQl1MTYJCQlsb25nRGF0YTsKLX1UaHJlZVdpcmVSZWc7CisvKgorICogQUNJL0FJRlNOIEZpZWxkLiBSZWY6IFdNTSBzcGVjIDIuMi4yOiBXTUUgUGFyYW1ldGVyIEVsZW1lbnQsIHAuMTIuCisgKi8KK3R5cGVkZWYgdW5pb24gX0FDSV9BSUZTTiB7CisJdTggY2hhckRhdGE7CiAKKwlzdHJ1Y3QgeworCQl1OCBBSUZTTjo0OworCQl1OCBBQ006MTsKKwkJdTggQUNJOjI7CisJCXU4IFJlc2VydmVkOjE7CisJfSBmOwkvKiBGaWVsZCAqLworfSBBQ0lfQUlGU04sICpQQUNJX0FJRlNOOwogCi10eXBlZGVmIHN0cnVjdCBidWZmZXIKLXsKKy8qCisgKiBBQyBQYXJhbWV0ZXJzIFJlY29yZCBGb3JtYXQuCisgKiBSZWY6IFdNTSBzcGVjIDIuMi4yOiBXTUUgUGFyYW1ldGVyIEVsZW1lbnQsIHAuMTIuCisgKi8KK3R5cGVkZWYgdW5pb24gX0FDX1BBUkFNIHsKKwl1MzIgbG9uZ0RhdGE7CisJdTggY2hhckRhdGFbNF07CisKKwlzdHJ1Y3QgeworCQlBQ0lfQUlGU04gQWNpQWlmc247CisJCUVDVyBFY3c7CisJCXUxNiBUWE9QTGltaXQ7CisJfSBmOwkvKiBGaWVsZCAqLworfSBBQ19QQVJBTSwgKlBBQ19QQVJBTTsKKworc3RydWN0IGJ1ZmZlciB7CiAJc3RydWN0IGJ1ZmZlciAqbmV4dDsKIAl1MzIgKmJ1ZjsKIAlkbWFfYWRkcl90IGRtYTsKLX0gYnVmZmVyOworfTsKIAotLy9ZSixtb2RpZmllZCwwODA4MjgKLXR5cGVkZWYgc3RydWN0IFN0YXRzCi17CisvKiBZSixtb2RpZmllZCwwODA4MjguICovCitzdHJ1Y3Qgc3RhdHMgewogCXVuc2lnbmVkIGxvbmcgdHhyZHU7CiAJdW5zaWduZWQgbG9uZyByeHJkdTsKIAl1bnNpZ25lZCBsb25nIHJ4bm9sYXN0OwogCXVuc2lnbmVkIGxvbmcgcnhub2RhdGE7Ci0vLwl1bnNpZ25lZCBsb25nIHJ4cmVzZXQ7Ci0vLwl1bnNpZ25lZCBsb25nIHJ4d3JrYXJvdW5kOwogCXVuc2lnbmVkIGxvbmcgcnhub3BvaW50ZXI7CiAJdW5zaWduZWQgbG9uZyB0eG5wZXJyOwogCXVuc2lnbmVkIGxvbmcgdHhyZXN1bWVkOwpAQCAtMjA3LDEyNiArMTcxLDEyMyBAQAogCXVuc2lnbmVkIGxvbmcgdHhiZWFjb25lcnI7CiAJdW5zaWduZWQgbG9uZyB0eGxwb2tpbnQ7CiAJdW5zaWduZWQgbG9uZyB0eGxwZXJyOwotCXVuc2lnbmVkIGxvbmcgdHhyZXRyeTsvL3JldHJ5IG51bWJlciAgdG9ueSAyMDA2MDYwMQotCXVuc2lnbmVkIGxvbmcgcnhjcmNlcnJtaW47Ly9jcmMgZXJyb3IgKDAtNTAwKQotCXVuc2lnbmVkIGxvbmcgcnhjcmNlcnJtaWQ7Ly9jcmMgZXJyb3IgKDUwMC0xMDAwKQotCXVuc2lnbmVkIGxvbmcgcnhjcmNlcnJtYXg7Ly9jcmMgZXJyb3IgKD4xMDAwKQotCXVuc2lnbmVkIGxvbmcgcnhpY3ZlcnI7Ly9JQ1YgZXJyb3IKLX0gU3RhdHM7CisJdW5zaWduZWQgbG9uZyB0eHJldHJ5OyAvKiByZXRyeSBudW1iZXIgdG9ueSAyMDA2MDYwMSAqLworCXVuc2lnbmVkIGxvbmcgcnhjcmNlcnJtaW47IC8qIGNyYyBlcnJvciAoMC01MDApICovCisJdW5zaWduZWQgbG9uZyByeGNyY2Vycm1pZDsgLyogY3JjIGVycm9yICg1MDAtMTAwMCkgKi8KKwl1bnNpZ25lZCBsb25nIHJ4Y3JjZXJybWF4OyAvKiBjcmMgZXJyb3IgKD4xMDAwKSAqLworCXVuc2lnbmVkIGxvbmcgcnhpY3ZlcnI7IC8qIElDViBlcnJvciAqLworfTsKIAogI2RlZmluZSBNQVhfTERfU0xPVF9OVU0gMTAKLSNkZWZpbmUgS0VFUF9BTElWRV9JTlRFUlZBTCAJCQkJMjAgLy8gaW4gc2Vjb25kcy4KLSNkZWZpbmUgQ0hFQ0tfRk9SX0hBTkdfUEVSSU9ECQkJMiAvL2JlIGVxdWFsIHRvIHdhdGNoZG9nIGNoZWNrIHRpbWUKLSNkZWZpbmUgREVGQVVMVF9LRUVQX0FMSVZFX0xFVkVMCQkJMQotI2RlZmluZSBERUZBVUxUX1NMT1RfTlVNCQkJCQkyCi0jZGVmaW5lIFBPV0VSX1BST0ZJTEVfQUMJCQkJCTAKLSNkZWZpbmUgUE9XRVJfUFJPRklMRV9CQVRURVJZCQkJMQorI2RlZmluZSBLRUVQX0FMSVZFX0lOVEVSVkFMIDIwIC8qIGluIHNlY29uZHMuICovCisjZGVmaW5lIENIRUNLX0ZPUl9IQU5HX1BFUklPRCAyIC8qIGJlIGVxdWFsIHRvIHdhdGNoZG9nIGNoZWNrIHRpbWUuICovCisjZGVmaW5lIERFRkFVTFRfS0VFUF9BTElWRV9MRVZFTCAxCisjZGVmaW5lIERFRkFVTFRfU0xPVF9OVU0gMgorI2RlZmluZSBQT1dFUl9QUk9GSUxFX0FDIDAKKyNkZWZpbmUgUE9XRVJfUFJPRklMRV9CQVRURVJZIDEKIAotdHlwZWRlZiBzdHJ1Y3QgX2xpbmtfZGV0ZWN0X3QKLXsKLQl1MzIJCQkJUnhGcmFtZU51bVtNQVhfTERfU0xPVF9OVU1dOwkvLyBudW1iZXIgb2YgUnggRnJhbWUgLyBDaGVja0ZvckhhbmdfcGVyaW9kICB0byBkZXRlcm1pbmUgbGluayBzdGF0dXMKLQl1MTYJCQkJU2xvdE51bTsJLy8gbnVtYmVyIG9mIENoZWNrRm9ySGFuZyBwZXJpb2QgdG8gZGV0ZXJtaW5lIGxpbmsgc3RhdHVzLCBkZWZhdWx0IGlzIDIKLQl1MTYJCQkJU2xvdEluZGV4Oworc3RydWN0IGxpbmtfZGV0ZWN0X3QgeworCXUzMiByeF9mcmFtZV9udW1bTUFYX0xEX1NMT1RfTlVNXTsgLyogbnVtYmVyIG9mIFJ4IEZyYW1lLgorCQkJCQkgICAgKiBDaGVja0ZvckhhbmdfcGVyaW9kICB0byBkZXRlcm1pbmUKKwkJCQkJICAgICogbGluayBzdGF0dXMuCisJCQkJCSAgICAqLworCXUxNiBzbG90X251bTsgLyogbnVtYmVyIG9mIENoZWNrRm9ySGFuZyBwZXJpb2QgdG8gZGV0ZXJtaW5lIGxpbmsgc3RhdHVzLAorCQkgICAgICAgKiBkZWZhdWx0IGlzIDIuCisJCSAgICAgICAqLworCXUxNiBzbG90X2luZGV4OworCXUzMiBudW1fdHhfb2tfaW5fcGVyaW9kOyAvKiBudW1iZXIgb2YgcGFja2V0IHRyYW5zbWl0dGVkIGR1cmluZworCQkJCSAgKiBDaGVja0ZvckhhbmcuCisJCQkJICAqLworCXUzMiBudW1fcnhfb2tfaW5fcGVyaW9kOyAvKiBudW1iZXIgb2YgcGFja2V0IHJlY2VpdmVkIGR1cmluZworCQkJCSAgKiBDaGVja0ZvckhhbmcuCisJCQkJICAqLworCXU4IGlkbGVfY291bnQ7IC8qIChLRUVQX0FMSVZFX0lOVEVSVkFMIC8gQ0hFQ0tfRk9SX0hBTkdfUEVSSU9EKSAqLworCXUzMiBsYXN0X251bV90eF91bmljYXN0OworCXUzMiBsYXN0X251bV9yeF91bmljYXN0OwogCi0JdTMyCQkJCU51bVR4T2tJblBlcmlvZDsgIC8vbnVtYmVyIG9mIHBhY2tldCB0cmFuc21pdHRlZCBkdXJpbmcgQ2hlY2tGb3JIYW5nCi0JdTMyCQkJCU51bVJ4T2tJblBlcmlvZDsgIC8vbnVtYmVyIG9mIHBhY2tldCByZWNlaXZlZCBkdXJpbmcgQ2hlY2tGb3JIYW5nCisJYm9vbCBiX2J1c3lfdHJhZmZpYzsgLyogd2hlbiBpdCBpcyBzZXQgdG8gMSwgVUkgY2Fubid0IHNjYW4gYXQgd2lsbC4gKi8KK307CiAKLQl1OAkJCQlJZGxlQ291bnQ7ICAgICAvLyAoS0VFUF9BTElWRV9JTlRFUlZBTCAvIENIRUNLX0ZPUl9IQU5HX1BFUklPRCkKLQl1MzIJCQkJTGFzdE51bVR4VW5pY2FzdDsKLQl1MzIJCQkJTGFzdE51bVJ4VW5pY2FzdDsKKy8qIFlKLG1vZGlmaWVkLDA4MDgyOCxlbmQgKi8KIAotCWJvb2wJCQkJYkJ1c3lUcmFmZmljOyAgICAvL3doZW4gaXQgaXMgc2V0IHRvIDEsIFVJIGNhbm4ndCBzY2FuIGF0IHdpbGwuCi19bGlua19kZXRlY3RfdCwgKnBsaW5rX2RldGVjdF90OworLyogYnkgYW15IGZvciBsZWQKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMRUQgY3VzdG9taXphdGlvbi4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK2VudW0gbGVkX3N0cmF0ZWd5XzgxODUgeworCVNXX0xFRF9NT0RFMCwKKwlTV19MRURfTU9ERTEsCisJSFdfTEVELCAvKiBIVyBjb250cm9sIDIgTEVEcywgTEVEMCBhbmQgTEVEMSAodGhlcmUgYXJlIDQgZGlmZmVyZW50CisJCSAqIGNvbnRyb2wgbW9kZXMpLiAqLworfTsKIAotLy9ZSixtb2RpZmllZCwwODA4MjgsZW5kCitlbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIHsKKwlSRl9PTiwKKwlSRl9TTEVFUCwKKwlSRl9PRkYKK307CiAKLS8vYnkgYW15IGZvciBsZWQKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIExFRCBjdXN0b21pemF0aW9uLgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZW51bSBfUmVhc29uQ29kZSB7CisJdW5zcGVjX3JlYXNvbiA9IDB4MSwKKwlhdXRoX25vdF92YWxpZCA9IDB4MiwKKwlkZWF1dGhfbHZfc3MgPSAweDMsCisJaW5hY3Rpdml0eSA9IDB4NCwKKwlhcF9vdmVybG9hZCA9IDB4NSwKKwljbGFzczJfZXJyID0gMHg2LAorCWNsYXNzM19lcnIgPSAweDcsCisJZGlzYXNfbHZfc3MgPSAweDgsCisJYXNvY19ub3RfYXV0aCA9IDB4OSwKIAotdHlwZWRlZgllbnVtIF9MRURfU1RSQVRFR1lfODE4NXsKLQlTV19MRURfTU9ERTAsIC8vCi0JU1dfTEVEX01PREUxLCAvLwotCUhXX0xFRCwgLy8gSFcgY29udHJvbCAyIExFRHMsIExFRDAgYW5kIExFRDEgKHRoZXJlIGFyZSA0IGRpZmZlcmVudCBjb250cm9sIG1vZGVzKQotfUxFRF9TVFJBVEVHWV84MTg1LCAqUExFRF9TVFJBVEVHWV84MTg1OwotLy9ieSBhbXkgZm9yIGxlZAotLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKLXR5cGVkZWYJZW51bSBfTEVEX0NUTF9NT0RFewotCUxFRF9DVExfUE9XRVJfT04gPSAxLAotCUxFRF9DVExfTElOSyA9IDIsCi0JTEVEX0NUTF9OT19MSU5LID0gMywKLQlMRURfQ1RMX1RYID0gNCwKLQlMRURfQ1RMX1JYID0gNSwKLQlMRURfQ1RMX1NJVEVfU1VSVkVZID0gNiwKLQlMRURfQ1RMX1BPV0VSX09GRiA9IDcKLX1MRURfQ1RMX01PREU7CisJLyogLS0tLU1JQ19DSEVDSyAqLworCW1pY19mYWlsdXJlID0gMHhlLAorCS8qIC0tLS1FTkQgTUlDX0NIRUNLICovCiAKLXR5cGVkZWYJZW51bSBfUlRfUkZfUE9XRVJfU1RBVEUKLXsKLQllUmZPbiwKLQllUmZTbGVlcCwKLQllUmZPZmYKLX1SVF9SRl9QT1dFUl9TVEFURTsKLQotZW51bQlfUmVhc29uQ29kZXsKLQl1bnNwZWNfcmVhc29uCT0gMHgxLAotCWF1dGhfbm90X3ZhbGlkCT0gMHgyLAotCWRlYXV0aF9sdl9zcwk9IDB4MywKLQlpbmFjdGl2aXR5CQk9IDB4NCwKLQlhcF9vdmVybG9hZAkJPSAweDUsCi0JY2xhc3MyX2VycgkJPSAweDYsCi0JY2xhc3MzX2VycgkJPSAweDcsCi0JZGlzYXNfbHZfc3MJCT0gMHg4LAotCWFzb2Nfbm90X2F1dGgJPSAweDksCi0KLQkvLy0tLS1NSUNfQ0hFQ0sKLQltaWNfZmFpbHVyZQkJPSAweGUsCi0JLy8tLS0tRU5EIE1JQ19DSEVDSwotCi0JLy8gUmVhc29uIGNvZGUgZGVmaW5lZCBpbiA4MDIuMTFpIEQxMC4wIHAuMjguCi0JaW52YWxpZF9JRQkJPSAweDBkLAotCWZvdXJfd2F5X3Rtb3V0CT0gMHgwZiwKLQl0d29fd2F5X3Rtb3V0CT0gMHgxMCwKLQlJRV9kaXNtYXRjaAkJPSAweDExLAorCS8qIFJlYXNvbiBjb2RlIGRlZmluZWQgaW4gODAyLjExaSBEMTAuMCBwLjI4LiAqLworCWludmFsaWRfSUUgPSAweDBkLAorCWZvdXJfd2F5X3Rtb3V0ID0gMHgwZiwKKwl0d29fd2F5X3Rtb3V0ID0gMHgxMCwKKwlJRV9kaXNtYXRjaCA9IDB4MTEsCiAJaW52YWxpZF9HY2lwaGVyCT0gMHgxMiwKIAlpbnZhbGlkX1BjaXBoZXIJPSAweDEzLAotCWludmFsaWRfQUtNUAk9IDB4MTQsCisJaW52YWxpZF9BS01QID0gMHgxNCwKIAl1bnN1cF9SU05JRXZlciA9IDB4MTUsCi0JaW52YWxpZF9SU05JRQk9IDB4MTYsCi0JYXV0aF84MDJfMXhfZmFpbD0gMHgxNywKLQljaXBlcl9yZWplY3QJCT0gMHgxOCwKKwlpbnZhbGlkX1JTTklFID0gMHgxNiwKKwlhdXRoXzgwMl8xeF9mYWlsID0gMHgxNywKKwljaXBlcl9yZWplY3QgPSAweDE4LAogCi0JLy8gUmVhc29uIGNvZGUgZGVmaW5lZCBpbiA3LjMuMS43LCA4MDIuMWUgRDEzLjAsIHAuNDIuIEFkZGVkIGJ5IEFubmllLCAyMDA1LTExLTE1LgotCVFvU191bnNwZWMJCT0gMHgyMCwJLy8gMzIKLQlRQVBfYmFuZHdpZHRoCT0gMHgyMSwJLy8gMzMKLQlwb29yX2NvbmRpdGlvbgk9IDB4MjIsCS8vIDM0Ci0Jbm9fZmFjaWxpdHkJCT0gMHgyMywJLy8gMzUKLQkJCQkJCQkvLyBXaGVyZSBpcyAzNj8/PwotCXJlcV9kZWNsaW5lZAk9IDB4MjUsCS8vIDM3Ci0JaW52YWxpZF9wYXJhbQk9IDB4MjYsCS8vIDM4Ci0JcmVxX25vdF9ob25vcmVkPSAweDI3LAkvLyAzOQotCVRTX25vdF9jcmVhdGVkCT0gMHgyRiwJLy8gNDcKLQlETF9ub3RfYWxsb3dlZAk9IDB4MzAsCS8vIDQ4Ci0JZGVzdF9ub3RfZXhpc3QJPSAweDMxLAkvLyA0OQotCWRlc3Rfbm90X1FTVEEJPSAweDMyLAkvLyA1MAorCS8qIFJlYXNvbiBjb2RlIGRlZmluZWQgaW4gNy4zLjEuNywgODAyLjFlIEQxMy4wLCBwLjQyLiBBZGRlZCBieSBBbm5pZSwKKwkgKiAyMDA1LTExLTE1LgorCSAqLworCVFvU191bnNwZWMgPSAweDIwLCAvKiAzMiAqLworCVFBUF9iYW5kd2lkdGggPSAweDIxLCAvKiAzMyAqLworCXBvb3JfY29uZGl0aW9uID0gMHgyMiwgLyogMzQgKi8KKwlub19mYWNpbGl0eSA9IDB4MjMsIC8qIDM1ICovCisJLyogV2hlcmUgaXMgMzY/Pz8gKi8KKwlyZXFfZGVjbGluZWQgPSAweDI1LCAvKiAzNyAqLworCWludmFsaWRfcGFyYW0gPSAweDI2LCAvKiAzOCAqLworCXJlcV9ub3RfaG9ub3JlZCA9IDB4MjcsIC8qIDM5ICovCisJVFNfbm90X2NyZWF0ZWQgPSAweDJGLCAvKiA0NyAqLworCURMX25vdF9hbGxvd2VkID0gMHgzMCwgLyogNDggKi8KKwlkZXN0X25vdF9leGlzdCA9IDB4MzEsIC8qIDQ5ICovCisJZGVzdF9ub3RfUVNUQSA9IDB4MzIsIC8qIDUwICovCiB9OwotdHlwZWRlZgllbnVtIF9SVF9QU19NT0RFCi17Ci0JZUFjdGl2ZSwJLy8gQWN0aXZlL0NvbnRpbnVvdXMgYWNjZXNzLgotCWVNYXhQcywJCS8vIE1heCBwb3dlciBzYXZlIG1vZGUuCi0JZUZhc3RQcwkJLy8gRmFzdCBwb3dlciBzYXZlIG1vZGUuCi19UlRfUFNfTU9ERTsKLS8vYnkgYW15IGZvciBwb3dlciBzYXZlCi10eXBlZGVmIHN0cnVjdCByODE4MF9wcml2Ci17CisKK2VudW0gcnRfcHNfbW9kZSB7CisJQUNUSVZFLCAvKiBBY3RpdmUvQ29udGludW91cyBhY2Nlc3MuICovCisJTUFYX1BTLAkvKiBNYXggcG93ZXIgc2F2ZSBtb2RlLiAqLworCUZBU1RfUFMgLyogRmFzdCBwb3dlciBzYXZlIG1vZGUuICovCit9OworCisvKiBieSBhbXkgZm9yIHBvd2VyIHNhdmUuICovCitzdHJ1Y3QgcjgxODBfcHJpdiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CiAKIAlzaG9ydCBlcHJvbXR5cGU7CiAJaW50IGlycTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTgwMjExOwogCi0Jc2hvcnQgcGxjcF9wcmVhbWJsZV9tb2RlOyAvLyAwOmF1dG8gMTpzaG9ydCAyOmxvbmcKKwlzaG9ydCBwbGNwX3ByZWFtYmxlX21vZGU7IC8qIDA6YXV0byAxOnNob3J0IDI6bG9uZyAqLwogCiAJc3BpbmxvY2tfdCBpcnFfdGhfbG9jazsKIAlzcGlubG9ja190IHR4X2xvY2s7CkBAIC0zMzksMTkgKzMwMCwxNSBAQAogCXNob3J0IGNoYW47CiAJc2hvcnQgc2VuczsKIAlzaG9ydCBtYXhfc2VuczsKLQl1OCBjaHR4cHdyWzE1XTsgLy9jaGFubmVscyBmcm9tIDEgdG8gMTQsIDAgbm90IHVzZWQKLQl1OCBjaHR4cHdyX29mZG1bMTVdOyAvL2NoYW5uZWxzIGZyb20gMSB0byAxNCwgMCBub3QgdXNlZAotCS8vdTggY2hhbGxvd1sxNV07IC8vY2hhbm5lbHMgZnJvbSAxIHRvIDE0LCAwIG5vdCB1c2VkCi0JdTggY2hhbm5lbF9wbGFuOyAgLy8gaXQncyB0aGUgY2hhbm5lbCBwbGFuIGluZGV4CisJdTggY2h0eHB3clsxNV07IC8qIGNoYW5uZWxzIGZyb20gMSB0byAxNCwgMCBub3QgdXNlZC4gKi8KKwl1OCBjaHR4cHdyX29mZG1bMTVdOyAvKiBjaGFubmVscyBmcm9tIDEgdG8gMTQsIDAgbm90IHVzZWQuICovCisJdTggY2hhbm5lbF9wbGFuOyAgLyogaXQncyB0aGUgY2hhbm5lbCBwbGFuIGluZGV4LiAqLwogCXNob3J0IHVwOwotCXNob3J0IGNyY21vbjsgLy9pZiAxIGFsbG93IGJhZCBjcmMgZnJhbWUgcmVjZXB0aW9uIGluIG1vbml0b3IgbW9kZQorCXNob3J0IGNyY21vbjsgLyogaWYgMSBhbGxvdyBiYWQgY3JjIGZyYW1lIHJlY2VwdGlvbiBpbiBtb25pdG9yIG1vZGUuICovCiAKIAlzdHJ1Y3QgdGltZXJfbGlzdCBzY2FuX3RpbWVyOwotCS8qc2hvcnQgc2NhbnBlbmRpbmc7Ci0Jc2hvcnQgc3RvcHNjYW47Ki8KIAlzcGlubG9ja190IHNjYW5fbG9jazsKIAl1OCBhY3RpdmVfcHJvYmU7Ci0JLy91OCBhY3RpdmVfc2Nhbl9udW07CiAJc3RydWN0IHNlbWFwaG9yZSB3eF9zZW07CiAJc2hvcnQgaHdfd2VwOwogCkBAIC0zNTksMjAgKzMxNiwyMCBAQAogCXNob3J0IGFudGI7CiAJc2hvcnQgZGl2ZXJzaXR5OwogCXUzMiBrZXkwWzRdOwotCXNob3J0ICgqcmZfc2V0X3NlbnMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgc2Vucyk7Ci0Jdm9pZCAoKnJmX3NldF9jaGFuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKTsKKwlzaG9ydCAoKnJmX3NldF9zZW5zKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBzZW5zKTsKKwl2b2lkICgqcmZfc2V0X2NoYW4pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGNoKTsKIAl2b2lkICgqcmZfY2xvc2UpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCXZvaWQgKCpyZl9pbml0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAl2b2lkICgqcmZfc2xlZXApKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCXZvaWQgKCpyZl93YWtldXApKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCS8vc2hvcnQgcmF0ZTsKKwkvKiBzaG9ydCByYXRlOyAqLwogCXNob3J0IHByb21pc2M7Ci0JLypzdGF0cyovCi0Jc3RydWN0IFN0YXRzIHN0YXRzOwotCXN0cnVjdCBfbGlua19kZXRlY3RfdCBsaW5rX2RldGVjdDsgIC8vWUosYWRkLDA4MDgyOAorCS8qIHN0YXRzICovCisJc3RydWN0IHN0YXRzIHN0YXRzOworCXN0cnVjdCBsaW5rX2RldGVjdF90IGxpbmtfZGV0ZWN0OyAvKiBZSixhZGQsMDgwODI4ICovCiAJc3RydWN0IGl3X3N0YXRpc3RpY3Mgd3N0YXRzOwogCi0JLypSWCBzdHVmZiovCisJLyogUlggc3R1ZmYuICovCiAJdTMyICpyeHJpbmc7CiAJdTMyICpyeHJpbmd0YWlsOwogCWRtYV9hZGRyX3QgcnhyaW5nZG1hOwpAQCAtMzg3LDI3ICszNDQsNiBAQAogCiAJdTMyIHJ4X3ByZXZsZW47CiAKLQkvKlRYIHN0dWZmKi8KLS8qCi0JdTMyICp0eGxwcmluZzsKLQl1MzIgKnR4aHByaW5nOwotCXUzMiAqdHhucHJpbmc7Ci0JZG1hX2FkZHJfdCB0eGxwcmluZ2RtYTsKLQlkbWFfYWRkcl90IHR4aHByaW5nZG1hOwotCWRtYV9hZGRyX3QgdHhucHJpbmdkbWE7Ci0JdTMyICp0eGxwcmluZ3RhaWw7Ci0JdTMyICp0eGhwcmluZ3RhaWw7Ci0JdTMyICp0eG5wcmluZ3RhaWw7Ci0JdTMyICp0eGxwcmluZ2hlYWQ7Ci0JdTMyICp0eGhwcmluZ2hlYWQ7Ci0JdTMyICp0eG5wcmluZ2hlYWQ7Ci0Jc3RydWN0IGJ1ZmZlciAqdHhscGJ1ZnM7Ci0Jc3RydWN0IGJ1ZmZlciAqdHhocGJ1ZnM7Ci0Jc3RydWN0IGJ1ZmZlciAqdHhucGJ1ZnM7Ci0Jc3RydWN0IGJ1ZmZlciAqdHhscGJ1ZnN0YWlsOwotCXN0cnVjdCBidWZmZXIgKnR4aHBidWZzdGFpbDsKLQlzdHJ1Y3QgYnVmZmVyICp0eG5wYnVmc3RhaWw7Ci0qLwogCXUzMiAqdHhtYXByaW5nOwogCXUzMiAqdHhia3ByaW5nOwogCXUzMiAqdHhiZXByaW5nOwpAQCAtNDQ3LDU0ICszODMsNDcgQEAKIAogCWludCB0eHJpbmdjb3VudDsKIAlpbnQgdHhidWZmc2l6ZTsKLQkvL3N0cnVjdCB0eF9wZW5kaW5nYnVmIHR4bnBfcGVuZGluZzsKLQkvL3N0cnVjdCB0YXNrbGV0X3N0cnVjdCBpcnFfdHhfdGFza2xldDsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaXJxX3J4X3Rhc2tsZXQ7CiAJdTggZG1hX3BvbGxfbWFzazsKLQkvL3Nob3J0IHR4X3N1c3BlbmQ7CiAKLQkvKiBhZGhvYy9tYXN0ZXIgbW9kZSBzdHVmZiAqLworCS8qIGFkaG9jL21hc3RlciBtb2RlIHN0dWZmLiAqLwogCXUzMiAqdHhiZWFjb25yaW5ndGFpbDsKIAlkbWFfYWRkcl90IHR4YmVhY29ucmluZ2RtYTsKIAl1MzIgKnR4YmVhY29ucmluZzsKIAlpbnQgdHhiZWFjb25jb3VudDsKIAlzdHJ1Y3QgYnVmZmVyICp0eGJlYWNvbmJ1ZnM7CiAJc3RydWN0IGJ1ZmZlciAqdHhiZWFjb25idWZzdGFpbDsKLQkvL2NoYXIgKm1hc3Rlcl9lc3NpZDsKLQkvL3UxNiBtYXN0ZXJfYmVhY29uaW50ZXJ2YWw7Ci0JLy91MzIgbWFzdGVyX2JlYWNvbnNpemU7Ci0JLy91MTYgYmVhY29uX2ludGVydmFsOwogCiAJdTggcmV0cnlfZGF0YTsKIAl1OCByZXRyeV9ydHM7CiAJdTE2IHJ0czsKIAotLy9ieSBhbXkgZm9yIGxlZAotCUxFRF9TVFJBVEVHWV84MTg1IExlZFN0cmF0ZWd5OwotLy9ieSBhbXkgZm9yIGxlZAorCS8qIGJ5IGFteSBmb3IgbGVkLiAqLworCWVudW0gbGVkX3N0cmF0ZWd5XzgxODUgbGVkX3N0cmF0ZWd5OworCS8qIGJ5IGFteSBmb3IgbGVkLiAqLwogCi0vL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQorCS8qIGJ5IGFteSBmb3IgcG93ZXIgc2F2ZS4gKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaF9kb2dfdGltZXI7CiAJYm9vbCBiSW5hY3RpdmVQczsKIAlib29sIGJTd1JmUHJvY2Vzc2luZzsKLQlSVF9SRl9QT1dFUl9TVEFURQllSW5hY3RpdmVQb3dlclN0YXRlOwotCVJUX1JGX1BPV0VSX1NUQVRFIGVSRlBvd2VyU3RhdGU7CisJZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBlSW5hY3RpdmVQb3dlclN0YXRlOworCWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgZVJGUG93ZXJTdGF0ZTsKIAl1MzIgUmZPZmZSZWFzb247CiAJYm9vbCBSRkNoYW5nZUluUHJvZ3Jlc3M7CiAJYm9vbCBTZXRSRlBvd2VyU3RhdGVJblByb2dyZXNzOwotCXU4ICAgUkZQcm9nVHlwZTsKKwl1OCBSRlByb2dUeXBlOwogCWJvb2wgYkxlaXN1cmVQczsKLQlSVF9QU19NT0RFIGRvdDExUG93ZXJTYXZlTW9kZTsKLQkvL3UzMiBOdW1SeE9rSW5QZXJpb2Q7ICAgLy9ZSixkZWwsMDgwODI4Ci0JLy91MzIgTnVtVHhPa0luUGVyaW9kOyAgIC8vWUosZGVsLDA4MDgyOAotCXU4ICAgVHhQb2xsaW5nVGltZXM7CisJZW51bSBydF9wc19tb2RlIGRvdDExUG93ZXJTYXZlTW9kZTsKKwl1OCBUeFBvbGxpbmdUaW1lczsKIAotCWJvb2wJYkFwQnVmT3VyRnJhbWU7Ly8gVFJVRSBpZiBBUCBidWZmZXIgb3VyIHVuaWNhc3QgZGF0YSAsIHdlIHdpbGwga2VlcCBlQXdha2UgdW50aWwgcmVjZWl2ZSBkYXRhIG9yIHRpbWVvdXQuCi0JdTgJV2FpdEJ1ZkRhdGFCY25Db3VudDsKLQl1OAlXYWl0QnVmRGF0YVRpbWVPdXQ7CisJYm9vbCBiQXBCdWZPdXJGcmFtZTsgLyogVFJVRSBpZiBBUCBidWZmZXIgb3VyIHVuaWNhc3QgZGF0YSAsIHdlIHdpbGwKKwkJCSAgICAgICoga2VlcCBlQXdha2UgdW50aWwgcmVjZWl2ZSBkYXRhIG9yIHRpbWVvdXQuCisJCQkgICAgICAqLworCXU4IFdhaXRCdWZEYXRhQmNuQ291bnQ7CisJdTggV2FpdEJ1ZkRhdGFUaW1lT3V0OwogCi0vL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQotLy9ieSBhbXkgZm9yIGFudGVubmEKKwkvKiBieSBhbXkgZm9yIHBvd2VyIHNhdmUuICovCisJLyogYnkgYW15IGZvciBhbnRlbm5hLiAqLwogCXU4IEVFUFJPTVN3QW50ZW5uYURpdmVyc2l0eTsKIAlib29sIEVFUFJPTURlZmF1bHRBbnRlbm5hMTsKIAl1OCBSZWdTd0FudGVubmFEaXZlcnNpdHlNZWNoYW5pc207CkBAIC01MDMsMTE1ICs0MzIsMTI4IEBACiAJYm9vbCBiRGVmYXVsdEFudGVubmExOwogCXU4IFNpZ25hbFN0cmVuZ3RoOwogCWxvbmcgU3RhdHNfU2lnbmFsU3RyZW5ndGg7Ci0JbG9uZyBMYXN0U2lnbmFsU3RyZW5ndGhJblBlcmNlbnQ7IC8vIEluIHBlcmNlbnRhZ2UsIHVzZWQgZm9yIHNtb290aGluZywgZS5nLiBNb3ZpbmcgQXZlcmFnZS4KLQl1OAkgU2lnbmFsUXVhbGl0eTsgLy8gaW4gMC0xMDAgaW5kZXguCisJbG9uZyBMYXN0U2lnbmFsU3RyZW5ndGhJblBlcmNlbnQ7IC8qIEluIHBlcmNlbnRhZ2UsIHVzZWQgZm9yIHNtb290aGluZywKKwkJCQkJICAgKiBlLmcuIE1vdmluZyBBdmVyYWdlLgorCQkJCQkgICAqLworCXU4IFNpZ25hbFF1YWxpdHk7IC8qIGluIDAtMTAwIGluZGV4LiAqLwogCWxvbmcgU3RhdHNfU2lnbmFsUXVhbGl0eTsKLQlsb25nIFJlY3ZTaWduYWxQb3dlcjsgLy8gaW4gZEJtLgorCWxvbmcgUmVjdlNpZ25hbFBvd2VyOyAvKiBpbiBkQm0uICovCiAJbG9uZyBTdGF0c19SZWN2U2lnbmFsUG93ZXI7Ci0JdTgJIExhc3RSeFBrdEFudGVubmE7CS8vICtieSBhbXkgMDgwMzEyIEFudGVubmEgd2hpY2ggcmVjZWl2ZWQgdGhlIGxhc3RlZCBwYWNrZXQuIDA6IEF1eCwgMTpNYWluLiBBZGRlZCBieSBSb2dlciwgMjAwOC4wMS4yNS4KKwl1OCBMYXN0UnhQa3RBbnRlbm5hOyAvKiArYnkgYW15IDA4MDMxMiBBbnRlbm5hIHdoaWNoIHJlY2VpdmVkIHRoZSBsYXN0ZWQKKwkJCSAgICAgICogcGFja2V0LiAwOiBBdXgsIDE6TWFpbi4gQWRkZWQgYnkgUm9nZXIsCisJCQkgICAgICAqIDIwMDguMDEuMjUuCisJCQkgICAgICAqLwogCXUzMiBBZFJ4T2tDbnQ7CiAJbG9uZyBBZFJ4U2lnbmFsU3RyZW5ndGg7Ci0JdTggQ3VyckFudGVubmFJbmRleDsJCQkvLyBJbmRleCB0byBjdXJyZW50IEFudGVubmEgKGJvdGggVHggYW5kIFJ4KS4KLQl1OCBBZFRpY2tDb3VudDsJCQkJLy8gVGltZXMgb2YgU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIgaGFwcGVuZWQuCi0JdTggQWRDaGVja1BlcmlvZDsJCQkJLy8gIyBvZiBwZXJpb2QgU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIgdG8gY2hlY2sgUnggc2lnbmFsIHN0cmVuZ3RoIGZvciBTVyBBbnRlbm5hIERpdmVyc2l0eS4KLQl1OCBBZE1pbkNoZWNrUGVyaW9kOwkJCS8vIE1pbiB2YWx1ZSBvZiBBZENoZWNrUGVyaW9kLgotCXU4IEFkTWF4Q2hlY2tQZXJpb2Q7CQkJLy8gTWF4IHZhbHVlIG9mIEFkQ2hlY2tQZXJpb2QuCi0JbG9uZyBBZFJ4U3NUaHJlc2hvbGQ7CQkJLy8gU2lnbmFsIHN0cmVuZ3RoIHRocmVzaG9sZCB0byBzd2l0Y2ggYW50ZW5uYS4KLQlsb25nIEFkTWF4UnhTc1RocmVzaG9sZDsJCQkvLyBNYXggdmFsdWUgb2YgQWRSeFNzVGhyZXNob2xkLgotCWJvb2wgYkFkU3dpdGNoZWRDaGVja2luZzsJCS8vIFRSVUUgaWYgd2Ugc2hhbGwgc2hhbGwgY2hlY2sgUnggc2lnbmFsIHN0cmVuZ3RoIGZvciBsYXN0IHRpbWUgc3dpdGNoaW5nIGFudGVubmEuCi0JbG9uZyBBZFJ4U3NCZWZvcmVTd2l0Y2hlZDsJCS8vIFJ4IHNpZ25hbCBzdHJlbmd0aCBiZWZvcmUgd2Ugc3dpdGNoZWQgYW50ZW5uYS4KKwl1OCBDdXJyQW50ZW5uYUluZGV4OyAvKiBJbmRleCB0byBjdXJyZW50IEFudGVubmEgKGJvdGggVHggYW5kIFJ4KS4gKi8KKwl1OCBBZFRpY2tDb3VudDsgLyogVGltZXMgb2YgU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIgaGFwcGVuZWQuICovCisJdTggQWRDaGVja1BlcmlvZDsgLyogIyBvZiBwZXJpb2QgU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIgdG8gY2hlY2sgUngKKwkJCSAgICogc2lnbmFsIHN0cmVuZ3RoIGZvciBTVyBBbnRlbm5hIERpdmVyc2l0eS4KKwkJCSAgICovCisJdTggQWRNaW5DaGVja1BlcmlvZDsgLyogTWluIHZhbHVlIG9mIEFkQ2hlY2tQZXJpb2QuICovCisJdTggQWRNYXhDaGVja1BlcmlvZDsgLyogTWF4IHZhbHVlIG9mIEFkQ2hlY2tQZXJpb2QuICovCisJbG9uZyBBZFJ4U3NUaHJlc2hvbGQ7IC8qIFNpZ25hbCBzdHJlbmd0aCB0aHJlc2hvbGQgdG8gc3dpdGNoIGFudGVubmEuICovCisJbG9uZyBBZE1heFJ4U3NUaHJlc2hvbGQ7IC8qIE1heCB2YWx1ZSBvZiBBZFJ4U3NUaHJlc2hvbGQuICovCisJYm9vbCBiQWRTd2l0Y2hlZENoZWNraW5nOyAvKiBUUlVFIGlmIHdlIHNoYWxsIHNoYWxsIGNoZWNrIFJ4IHNpZ25hbAorCQkJCSAgICogc3RyZW5ndGggZm9yIGxhc3QgdGltZSBzd2l0Y2hpbmcgYW50ZW5uYS4KKwkJCQkgICAqLworCWxvbmcgQWRSeFNzQmVmb3JlU3dpdGNoZWQ7IC8qIFJ4IHNpZ25hbCBzdHJlbmd0aCBiZWZvcmUgd2Ugc3dpdGNoZWQKKwkJCQkgICAgKiBhbnRlbm5hLgorCQkJCSAgICAqLwogCXN0cnVjdCB0aW1lcl9saXN0IFN3QW50ZW5uYURpdmVyc2l0eVRpbWVyOwotLy9ieSBhbXkgZm9yIGFudGVubmEKLS8ve2J5IGFteSAwODAzMTIKLS8vCi0JLy8gQ3J5c3RhbCBjYWxpYnJhdGlvbi4KLQkvLyBBZGRlZCBieSBSb2dlciwgMjAwNy4xMi4xMS4KLQkvLwotCWJvb2wJCWJYdGFsQ2FsaWJyYXRpb247IC8vIENyeXN0YWwgY2FsaWJyYXRpb24uCi0JdTgJCQlYdGFsQ2FsX1hpbjsgLy8gQ3J5c3RhbCBjYWxpYnJhdGlvbiBmb3IgWGluLiAwfjcuNXBGCi0JdTgJCQlYdGFsQ2FsX1hvdXQ7IC8vIENyeXN0YWwgY2FsaWJyYXRpb24gZm9yIFhvdXQuIDB+Ny41cEYKLQkvLwotCS8vIFR4IHBvd2VyIHRyYWNraW5nIHdpdGggdGhlcm1hbCBtZXRlciBpbmRpY2F0aW9uLgotCS8vIEFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjEyLjExLgotCS8vCi0JYm9vbAkJYlR4UG93ZXJUcmFjazsgLy8gVHggUG93ZXIgdHJhY2tpbmcuCi0JdTgJCQlUaGVybWFsTWV0ZXI7IC8vIFRoZXJtYWwgbWV0ZXIgcmVmZXJlbmNlIGluZGljYXRpb24uCi0JLy8KLQkvLyBEeW5hbWljIEluaXRpYWwgR2FpbiBBZGp1c3RtZW50IE1lY2hhbmlzbS4gQWRkZWQgYnkgQnJ1Y2UsIDIwMDctMDItMTQuCi0JLy8KLQlib29sCQkJCWJEaWdNZWNoYW5pc207IC8vIFRSVUUgaWYgRElHIGlzIGVuYWJsZWQsIEZBTFNFIG93LgotCWJvb2wJCQkJYlJlZ0hpZ2hQb3dlck1lY2hhbmlzbTsgLy8gRm9yIEhpZ2ggUG93ZXIgTWVjaGFuaXNtLiAwNjEwMTAsIGJ5IHJjbmprby4KLQl1MzIJCQkJCUZhbHNlQWxhcm1SZWdWYWx1ZTsKLQl1OAkJCQkJUmVnRGlnT2ZkbUZhVXBUaDsgLy8gVXBwZXIgdGhyZXNob2xkIG9mIE9GRE0gZmFsc2UgYWxhcm0sIHdoaWNoIGlzIHVzZWQgaW4gRElHLgotCXU4CQkJCQlESUdfTnVtYmVyRmFsbGJhY2tWb3RlOwotCXU4CQkJCQlESUdfTnVtYmVyVXBncmFkZVZvdGU7Ci0JLy8gRm9yIEhXIGFudGVubmEgZGl2ZXJzaXR5LCBhZGRlZCBieSBSb2dlciwgMjAwOC4wMS4zMC4KLQl1MzIJCQlBZE1haW5BbnRlbm5hUnhPa0NudDsJCS8vIE1haW4gYW50ZW5uYSBSeCBPSyBjb3VudC4KLQl1MzIJCQlBZEF1eEFudGVubmFSeE9rQ250OwkJLy8gQXV4IGFudGVubmEgUnggT0sgY291bnQuCi0JYm9vbAkJYkhXQWRTd2l0Y2hlZDsJCQkJLy8gVFJVRSBpZiB3ZSBoYXMgc3dpdGNoZWQgZGVmYXVsdCBhbnRlbm5hIGJ5IEhXIGV2YWx1YXRpb24uCi0JLy8gUkYgSGlnaCBQb3dlciB1cHBlci9sb3dlciB0aHJlc2hvbGQuCi0JdTgJCQkJCVJlZ0hpUHdyVXBwZXJUaDsKLQl1OAkJCQkJUmVnSGlQd3JMb3dlclRoOwotCS8vIFJGIFJTU0kgSGlnaCBQb3dlciB1cHBlci9sb3dlciBUaHJlc2hvbGQuCi0JdTgJCQkJCVJlZ1JTU0lIaVB3clVwcGVyVGg7Ci0JdTgJCQkJCVJlZ1JTU0lIaVB3ckxvd2VyVGg7Ci0JLy8gQ3VycmVudCBDQ0sgUlNTSSB2YWx1ZSB0byBkZXRlcm1pbmUgQ0NLIGhpZ2ggcG93ZXIsIGFza2VkIGJ5IFNEMyBEWiwgYnkgQnJ1Y2UsIDIwMDctMDQtMTIuCi0JdTgJCQlDdXJDQ0tSU1NJOwotCWJvb2wgICAgICAgIGJDdXJDQ0tQa3Q7Ci0JLy8KLQkvLyBIaWdoIFBvd2VyIE1lY2hhbmlzbS4gQWRkZWQgYnkgYW15LCAwODAzMTIuCi0JLy8KLQlib29sCQkJCQliVG9VcGRhdGVUeFB3cjsKLQlsb25nCQkJCQlVbmRlY29yYXRlZFNtb290aGVkU1M7Ci0JbG9uZwkJCQkJVW5kZXJjb3JhdGVTbW9vdGhlZFJ4UG93ZXI7Ci0JdTgJCQkJCQlSU1NJOwotCWNoYXIJCQkJCVJ4UG93ZXI7Ci0JIHU4IEluaXRpYWxHYWluOwotCSAvL0ZvciBhZGp1c3QgRGlnIFRocmVzaG9sZCBkdXJpbmcgTGVnYWN5L0xlaXN1cmUgUG93ZXIgU2F2ZSBNb2RlCi0JdTMyCQkJCURvemVQZXJpb2RJblBhc3QyU2VjOwotCSAvLyBEb24ndCBhY2Nlc3MgQkIvUkYgdW5kZXIgZGlzYWJsZSBQTEwgc2l0dWF0aW9uLgotCXU4CQkJCQlJbml0aWFsR2FpbkJhY2tVcDsKLQkgdTggUmVnQk1vZGVHYWluU3RhZ2U7Ci0vL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZQotICAgIHN0cnVjdCB0aW1lcl9saXN0IHJhdGVhZGFwdGVyX3RpbWVyOwotCXUzMiAgICBSYXRlQWRhcHRpdmVQZXJpb2Q7Ci0JYm9vbCAgIGJFbmhhbmNlVHhQd3I7Ci0JYm9vbCAgIGJVcGRhdGVBUkZSOwotCWludAkgICBGb3JjZWREYXRhUmF0ZTsgLy8gRm9yY2UgRGF0YSBSYXRlLiAwOiBBdXRvLCAweDAyOiAxTSB+IDB4NkM6IDU0TS4pCi0JdTMyICAgICBOdW1UeFVuaWNhc3Q7IC8vWUosYWRkLDA4MDgyOCxmb3Iga2VlcCBhbGl2ZQotCXU4ICAgICAga2VlcEFsaXZlTGV2ZWw7IC8vWUosYWRkLDA4MDgyOCxmb3IgS2VlcEFsaXZlCi0JdW5zaWduZWQgbG9uZyAJTnVtVHhPa1RvdGFsOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RSZXRyeUNudDsKLSAgICAgICAgdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RSZXRyeVJhdGU7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgTGFzdFR4b2tDbnQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIExhc3RSeG9rQ250OwotICAgICAgICB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyclJldHJ5Q250OwotICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBMYXN0VHhPS0J5dGVzOwotCXVuc2lnbmVkIGxvbmcgCQkgICAgTnVtVHhPa0J5dGVzVG90YWw7Ci0gICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0RmFpbFR4UmF0ZTsKLSAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgIExhc3RGYWlsVHhSYXRlU1M7Ci0gICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICBGYWlsVHhSYXRlQ291bnQ7Ci0gICAgICAgIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0VHhUaHJvdWdocHV0OwotICAgICAgICAvL2ZvciB1cCByYXRlCi0gICAgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgIGJUcnl1cGluZzsKLSAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJUeFJhdGU7ICAgICAvL3RoZSByYXRlIGJlZm9yZSB1cAotICAgICAgICB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyclJldHJ5UmF0ZTsKLSAgICAgICAgdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyeXVwaW5nQ291bnQ7Ci0gICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnlEb3duQ291bnRMb3dEYXRhOwotICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ5dXBpbmdDb3VudE5vRGF0YTsKKwkvKiBieSBhbXkgZm9yIGFudGVubmEge2J5IGFteSAwODAzMTIgKi8KIAotICAgICAgICB1OCAgICAgICAgICAgICAgICAgIEN1cnJlbnRPcGVyYVJhdGU7Ci0vL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZQotLy9ieSBhbXkgMDgwMzEyfQotLy8Jc2hvcnQgd3FfaHVycnl1cDsKLS8vCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrcXVldWU7CisJLyogQ3J5c3RhbCBjYWxpYnJhdGlvbi4gQWRkZWQgYnkgUm9nZXIsIDIwMDcuMTIuMTEuICovCisKKwlib29sIGJYdGFsQ2FsaWJyYXRpb247IC8qIENyeXN0YWwgY2FsaWJyYXRpb24uKi8KKwl1OCBYdGFsQ2FsX1hpbjsgLyogQ3J5c3RhbCBjYWxpYnJhdGlvbiBmb3IgWGluLiAwfjcuNXBGICovCisJdTggWHRhbENhbF9Yb3V0OyAvKiBDcnlzdGFsIGNhbGlicmF0aW9uIGZvciBYb3V0LiAwfjcuNXBGICovCisKKwkvKiBUeCBwb3dlciB0cmFja2luZyB3aXRoIHRoZXJtYWwgbWV0ZXIgaW5kaWNhdGlvbi4KKwkgKiBBZGRlZCBieSBSb2dlciwgMjAwNy4xMi4xMS4KKwkgKi8KKworCWJvb2wgYlR4UG93ZXJUcmFjazsgLyogVHggUG93ZXIgdHJhY2tpbmcuICovCisJdTggVGhlcm1hbE1ldGVyOyAvKiBUaGVybWFsIG1ldGVyIHJlZmVyZW5jZSBpbmRpY2F0aW9uLiAqLworCisJLyogRHluYW1pYyBJbml0aWFsIEdhaW4gQWRqdXN0bWVudCBNZWNoYW5pc20uIEFkZGVkIGJ5IEJydWNlLAorCSAqIDIwMDctMDItMTQuCisJICovCisJYm9vbCBiRGlnTWVjaGFuaXNtOyAvKiBUUlVFIGlmIERJRyBpcyBlbmFibGVkLCBGQUxTRSBvdy4gKi8KKwlib29sIGJSZWdIaWdoUG93ZXJNZWNoYW5pc207IC8qIEZvciBIaWdoIFBvd2VyIE1lY2hhbmlzbS4gMDYxMDEwLAorCQkJCSAgICAgICogYnkgcmNuamtvLgorCQkJCSAgICAgICovCisJdTMyIEZhbHNlQWxhcm1SZWdWYWx1ZTsKKwl1OCBSZWdEaWdPZmRtRmFVcFRoOyAvKiBVcHBlciB0aHJlc2hvbGQgb2YgT0ZETSBmYWxzZSBhbGFybSwgd2hpY2ggaXMKKwkJCSAgICAgICogdXNlZCBpbiBESUcuCisJCQkgICAgICAqLworCXU4IERJR19OdW1iZXJGYWxsYmFja1ZvdGU7CisJdTggRElHX051bWJlclVwZ3JhZGVWb3RlOworCS8qIEZvciBIVyBhbnRlbm5hIGRpdmVyc2l0eSwgYWRkZWQgYnkgUm9nZXIsIDIwMDguMDEuMzAuICovCisJdTMyIEFkTWFpbkFudGVubmFSeE9rQ250OyAvKiBNYWluIGFudGVubmEgUnggT0sgY291bnQuICovCisJdTMyIEFkQXV4QW50ZW5uYVJ4T2tDbnQ7IC8qIEF1eCBhbnRlbm5hIFJ4IE9LIGNvdW50LiAqLworCWJvb2wgYkhXQWRTd2l0Y2hlZDsgLyogVFJVRSBpZiB3ZSBoYXMgc3dpdGNoZWQgZGVmYXVsdCBhbnRlbm5hIGJ5IEhXCisJCQkgICAgICogZXZhbHVhdGlvbi4KKwkJCSAgICAgKi8KKwkvKiBSRiBIaWdoIFBvd2VyIHVwcGVyL2xvd2VyIHRocmVzaG9sZC4gKi8KKwl1OCBSZWdIaVB3clVwcGVyVGg7CisJdTggUmVnSGlQd3JMb3dlclRoOworCS8qIFJGIFJTU0kgSGlnaCBQb3dlciB1cHBlci9sb3dlciBUaHJlc2hvbGQuICovCisJdTggUmVnUlNTSUhpUHdyVXBwZXJUaDsKKwl1OCBSZWdSU1NJSGlQd3JMb3dlclRoOworCS8qIEN1cnJlbnQgQ0NLIFJTU0kgdmFsdWUgdG8gZGV0ZXJtaW5lIENDSyBoaWdoIHBvd2VyLCBhc2tlZCBieSBTRDMgRFosCisJICogYnkgQnJ1Y2UsIDIwMDctMDQtMTIuCisJICovCisJdTggQ3VyQ0NLUlNTSTsKKwlib29sIGJDdXJDQ0tQa3Q7CisJLyogSGlnaCBQb3dlciBNZWNoYW5pc20uIEFkZGVkIGJ5IGFteSwgMDgwMzEyLiAqLworCWJvb2wgYlRvVXBkYXRlVHhQd3I7CisJbG9uZyBVbmRlY29yYXRlZFNtb290aGVkU1M7CisJbG9uZyBVbmRlY29yYXRlZFNtb290aGVkUnhQb3dlcjsKKwl1OCBSU1NJOworCWNoYXIgUnhQb3dlcjsKKwl1OCBJbml0aWFsR2FpbjsKKwkvKiBGb3IgYWRqdXN0IERpZyBUaHJlc2hvbGQgZHVyaW5nIExlZ2FjeS9MZWlzdXJlIFBvd2VyIFNhdmUgTW9kZS4gKi8KKwl1MzIgRG96ZVBlcmlvZEluUGFzdDJTZWM7CisJLyogRG9uJ3QgYWNjZXNzIEJCL1JGIHVuZGVyIGRpc2FibGUgUExMIHNpdHVhdGlvbi4gKi8KKwl1OCBJbml0aWFsR2FpbkJhY2tVcDsKKwl1OCBSZWdCTW9kZUdhaW5TdGFnZTsKKwkvKiBieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCByYXRlYWRhcHRlcl90aW1lcjsKKwl1MzIgUmF0ZUFkYXB0aXZlUGVyaW9kOworCWJvb2wgYkVuaGFuY2VUeFB3cjsKKwlib29sIGJVcGRhdGVBUkZSOworCWludCBGb3JjZWREYXRhUmF0ZTsgLyogRm9yY2UgRGF0YSBSYXRlLiAwOiBBdXRvLCAweDAyOiAxTSB+IDB4NkM6IDU0TS4pCisJCQkgICAgICovCisJdTMyIE51bVR4VW5pY2FzdDsgLyogWUosYWRkLDA4MDgyOCxmb3Iga2VlcCBhbGl2ZS4gKi8KKwl1OCBrZWVwQWxpdmVMZXZlbDsgLypZSixhZGQsMDgwODI4LGZvciBLZWVwQWxpdmUuICovCisJdW5zaWduZWQgbG9uZyBOdW1UeE9rVG90YWw7CisJdTE2IExhc3RSZXRyeUNudDsKKwl1MTYgTGFzdFJldHJ5UmF0ZTsKKwl1bnNpZ25lZCBsb25nIExhc3RUeG9rQ250OworCXVuc2lnbmVkIGxvbmcgTGFzdFJ4b2tDbnQ7CisJdTE2IEN1cnJSZXRyeUNudDsKKwl1bnNpZ25lZCBsb25nIExhc3RUeE9LQnl0ZXM7CisJdW5zaWduZWQgbG9uZyBOdW1UeE9rQnl0ZXNUb3RhbDsKKwl1OCBMYXN0RmFpbFR4UmF0ZTsKKwlsb25nIExhc3RGYWlsVHhSYXRlU1M7CisJdTggRmFpbFR4UmF0ZUNvdW50OworCXUzMiBMYXN0VHhUaHJvdWdocHV0OworCS8qIGZvciB1cCByYXRlLiAqLworCXVuc2lnbmVkIHNob3J0IGJUcnl1cGluZzsKKwl1OCBDdXJyVHhSYXRlOyAvKiB0aGUgcmF0ZSBiZWZvcmUgdXAuICovCisJdTE2IEN1cnJSZXRyeVJhdGU7CisJdTE2IFRyeXVwaW5nQ291bnQ7CisJdTggVHJ5RG93bkNvdW50TG93RGF0YTsKKwl1OCBUcnl1cGluZ0NvdW50Tm9EYXRhOworCisJdTggQ3VycmVudE9wZXJhUmF0ZTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfd3E7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdhdGNoX2RvZ193cTsKIAlzaG9ydCBhY2tfdHhfdG9faWVlZTsKIAogCXU4IGRtYV9wb2xsX3N0b3BfbWFzazsKIAotCS8vdTggUmVnVGhyZWVXaXJlTW9kZTsKIAl1MTYgU2hvcnRSZXRyeUxpbWl0OwogCXUxNiBMb25nUmV0cnlMaW1pdDsKIAl1MTYgRWFybHlSeFRocmVzaG9sZDsKQEAgLTYxOSw4ICs1NjEsOCBAQAogCXUzMiBSZWNlaXZlQ29uZmlnOwogCXUzMiBJbnRyTWFzazsKIAotCXN0cnVjdCAJQ2hubEFjY2Vzc1NldHRpbmcgIENoYW5uZWxBY2Nlc3NTZXR0aW5nOwotfXI4MTgwX3ByaXY7CisJc3RydWN0IGNobmxfYWNjZXNzX3NldHRpbmcgQ2hhbm5lbEFjY2Vzc1NldHRpbmc7Cit9OwogCiAjZGVmaW5lIE1BTkFHRV9QUklPUklUWSAwCiAjZGVmaW5lIEJLX1BSSU9SSVRZIDEKQEAgLTYzMiwxNCArNTc0LDE0IEBACiAKICNkZWZpbmUgTE9XX1BSSU9SSVRZIFZJX1BSSU9SSVRZCiAjZGVmaW5lIE5PUk1fUFJJT1JJVFkgVk9fUFJJT1JJVFkKLS8vQUMyUXVldWUgbWFwcGluZworLyogQUMyUXVldWUgbWFwcGluZy4gKi8KICNkZWZpbmUgQUMyUShfYWMpICgoKF9hYykgPT0gV01FX0FDX1ZPKSA/IFZPX1BSSU9SSVRZIDogXAogCQkoKF9hYykgPT0gV01FX0FDX1ZJKSA/IFZJX1BSSU9SSVRZIDogXAogCQkoKF9hYykgPT0gV01FX0FDX0JLKSA/IEJLX1BSSU9SSVRZIDogXAogCQlCRV9QUklPUklUWSkKIAogc2hvcnQgcnRsODE4MF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqc2tidWYsIGludCBsZW4sIGludCBwcmlvcml0eSwKLQkJIHNob3J0IG1vcmVmcmFnLCBzaG9ydCBmcmFnZGVzYywgaW50IHJhdGUpOworCQkgYm9vbCBtb3JlZnJhZywgc2hvcnQgZnJhZ2Rlc2MsIGludCByYXRlKTsKIAogdTggcmVhZF9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCk7CiB1MzIgcmVhZF9uaWNfZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpOwpAQCAtNjczLDcgKzYxNSw2IEBACiBib29sIFNldEFudGVubmFDb25maWc4N1NFKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IERlZmF1bHRBbnQsCiAJCQkgIGJvb2wgYkFudERpdmVyc2l0eSk7CiAKLS8vI2lmZGVmIENPTkZJR19SVEw4MTg1Qgogdm9pZCBydGw4MTg1Yl9hZGFwdGVyX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogdm9pZCBydGw4MTg1Yl9yeF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiB2b2lkIHJ0bDgxODViX3R4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTY4Miw5ICs2MjMsOCBAQAogdm9pZCBmaXhfcnhfZmlmbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgZml4X3R4X2ZpZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiB2b2lkIHJ0bDgyMjV6Ml9TZXRUWFBvd2VyTGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgY2gpOwotdm9pZCBydGw4MTgwX3JhdGVfYWRhcHRlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKiB3b3JrKTsKLS8vI2VuZGlmCi1ib29sIE1nbnRBY3RTZXRfUkZfU3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgUlRfUkZfUE9XRVJfU1RBVEUgU3RhdGVUb1NldCwKK3ZvaWQgcnRsODE4MF9yYXRlX2FkYXB0ZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK2Jvb2wgTWdudEFjdFNldF9SRl9TdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBlbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIFN0YXRlVG9TZXQsCiAJCQkgdTMyIENoYW5nZVNvdXJjZSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2NvcmUuYwppbmRleCA2Y2FmZWUyLi5hNjAyMmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2NvcmUuYwpAQCAtMSwzMSArMSwzMSBAQAogLyoKLSAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTh4IHBjaSBPcGVuU291cmNlIGRyaXZlciAtIHYgMC4xCi0gICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYS5tZXJlbGxvQGdtYWlsLmNvbT4KLSAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2Vuc2UpCi0KLSAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlIG9mZmljaWFsCi0gICBSZWFsdGVrIGRyaXZlci4KLQotICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbgotICAgZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uLgotCi0gICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIuCi0KLSAgIFBhcnRzIG9mIEJCL1JGIGNvZGUgYXJlIGRlcml2ZWQgZnJvbSBEYXZpZCBZb3VuZyBydGw4MTgwIG5ldGJzZCBkcml2ZXIuCi0KLSAgIFJTU0kgY2FsYyBmdW5jdGlvbiBmcm9tICdUaGUgRGV1Y2UnCi0KLSAgIFNvbWUgaWRlYXMgYm9ycm93ZWQgZnJvbSB0aGUgODEzOXRvby5jIGRyaXZlciBpbmNsdWRlZCBpbiBsaW51eCBrZXJuZWwuCi0KLSAgIFdlIChJPykgd2FudCB0byB0aGFua3MgdGhlIEF1dGhvcnMgb2YgdGhvc2UgcHJvamVjcyBhbmQgYWxzbyB0aGUKLSAgIE5kaXN3cmFwcGVyJ3MgcHJvamVjdCBBdXRob3JzLgotCi0gICBBIGJpZyBiaWcgdGhhbmtzIGdvZXMgYWxzbyB0byBSZWFsdGVrIGNvcnAuIGZvciB0aGVpciBoZWxwIGluIG15IGF0dGVtcHQgdG8KLSAgIGFkZCBSVEw4MTg1IGFuZCBSVEw4MjI1IHN1cHBvcnQsIGFuZCB0byBEYXZpZCBZb3VuZyBhbHNvLgotCi0gICBQb3dlciBtYW5hZ2VtZW50IGludGVyZmFjZSByb3V0aW5lcy4KLSAgIFdyaXR0ZW4gYnkgTWFyaXVzeiBNYXR1c3play4KLSovCisgKiBUaGlzIGlzIHBhcnQgb2YgcnRsODE4eCBwY2kgT3BlblNvdXJjZSBkcml2ZXIgLSB2IDAuMQorICogQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWEubWVyZWxsb0BnbWFpbC5jb20+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKQorICoKKyAqIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlIG9mZmljaWFsCisgKiBSZWFsdGVrIGRyaXZlci4KKyAqCisgKiBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uCisgKiBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24uCisgKgorICogUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyLgorICoKKyAqIFBhcnRzIG9mIEJCL1JGIGNvZGUgYXJlIGRlcml2ZWQgZnJvbSBEYXZpZCBZb3VuZyBydGw4MTgwIG5ldGJzZCBkcml2ZXIuCisgKgorICogUlNTSSBjYWxjIGZ1bmN0aW9uIGZyb20gJ1RoZSBEZXVjZScKKyAqCisgKiBTb21lIGlkZWFzIGJvcnJvd2VkIGZyb20gdGhlIDgxMzl0b28uYyBkcml2ZXIgaW5jbHVkZWQgaW4gbGludXgga2VybmVsLgorICoKKyAqIFdlIChJPykgd2FudCB0byB0aGFua3MgdGhlIEF1dGhvcnMgb2YgdGhvc2UgcHJvamVjcyBhbmQgYWxzbyB0aGUKKyAqIE5kaXN3cmFwcGVyJ3MgcHJvamVjdCBBdXRob3JzLgorICoKKyAqIEEgYmlnIGJpZyB0aGFua3MgZ29lcyBhbHNvIHRvIFJlYWx0ZWsgY29ycC4gZm9yIHRoZWlyIGhlbHAgaW4gbXkgYXR0ZW1wdCB0bworICogYWRkIFJUTDgxODUgYW5kIFJUTDgyMjUgc3VwcG9ydCwgYW5kIHRvIERhdmlkIFlvdW5nIGFsc28uCisgKgorICogUG93ZXIgbWFuYWdlbWVudCBpbnRlcmZhY2Ugcm91dGluZXMuCisgKiBXcml0dGVuIGJ5IE1hcml1c3ogTWF0dXN6ZWsuCisgKi8KIAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCkBAIC0yNTgsNyArMjU4LDkgQEAKIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyB0b3RhbE9LOwogCi0JdG90YWxPSyA9IHByaXYtPnN0YXRzLnR4bnBva2ludCtwcml2LT5zdGF0cy50eGhwb2tpbnQrcHJpdi0+c3RhdHMudHhscG9raW50OworCXRvdGFsT0sgPSBwcml2LT5zdGF0cy50eG5wb2tpbnQgKyBwcml2LT5zdGF0cy50eGhwb2tpbnQgKworCQlwcml2LT5zdGF0cy50eGxwb2tpbnQ7CisKIAlzZXFfcHJpbnRmKG0sCiAJCSJUWCBPSzogJWx1XG4iCiAJCSJUWCBFcnJvcjogJWx1XG4iCkBAIC0zNDcsOSArMzQ5LDkgQEAKIH0KIAogLyoKLSAgRklYTUU6IGNoZWNrIGlmIHdlIGNhbiB1c2Ugc29tZSBzdGFuZGFyZCBhbHJlYWR5LWV4aXN0ZW50Ci0gIGRhdGEgdHlwZStmdW5jdGlvbnMgaW4ga2VybmVsCi0qLworICogRklYTUU6IGNoZWNrIGlmIHdlIGNhbiB1c2Ugc29tZSBzdGFuZGFyZCBhbHJlYWR5LWV4aXN0ZW50CisgKiBkYXRhIHR5cGUrZnVuY3Rpb25zIGluIGtlcm5lbC4KKyAqLwogCiBzdGF0aWMgc2hvcnQgYnVmZmVyX2FkZChzdHJ1Y3QgYnVmZmVyICoqYnVmZmVyLCB1MzIgKmJ1ZiwgZG1hX2FkZHJfdCBkbWEsCiAJCQlzdHJ1Y3QgYnVmZmVyICoqYnVmZmVyaGVhZCkKQEAgLTQ2OCw5ICs0NzAsMTEgQEAKIHsKIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCByZXF1aXJlZGJ5dGUsIHJlcXVpcmVkOworCWludCByZXF1aXJlZGJ5dGU7CisJaW50IHJlcXVpcmVkOwogCi0JcmVxdWlyZWRieXRlID0gcHJpdi0+aWVlZTgwMjExLT5mdHMgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSk7CisJcmVxdWlyZWRieXRlID0gcHJpdi0+aWVlZTgwMjExLT5mdHMgKworCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSk7CiAKIAlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUpCiAJCXJlcXVpcmVkYnl0ZSArPSAyOwpAQCAtNDg0LDcgKzQ4OCw3IEBACiAJICogYmV0d2VlbiB0aGUgdGFpbCBhbmQgdGhlIGhlYWQKIAkgKi8KIAotCXJldHVybiAocmVxdWlyZWQrMiA8IGdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYsIHByaW9yaXR5KSk7CisJcmV0dXJuIHJlcXVpcmVkICsgMiA8IGdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYsIHByaW9yaXR5KTsKIH0KIAogdm9pZCBmaXhfdHhfZmlmbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNjQ5LDcgKzY1Myw3IEBACiAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOwogCiAJaWYgKChjaCA+IDE0KSB8fCAoY2ggPCAxKSkgewotCQlwcmludGsoIkluICVzOiBJbnZhbGlkIGNobmFuZWwgJWRcbiIsIF9fZnVuY19fLCBjaCk7CisJCW5ldGRldl9lcnIoZGV2LCAiSW4gJXM6IEludmFsaWQgY2hhbm5lbCAlZFxuIiwgX19mdW5jX18sIGNoKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNzQyLDQzICs3NDYsNTAgQEAKIAogCQlzd2l0Y2ggKGFkZHIpIHsKIAkJY2FzZSBUWF9NQU5BR0VQUklPUklUWV9SSU5HX0FERFI6Ci0JCQlpZiAoLTEgPT0gYnVmZmVyX2FkZCgmKHByaXYtPnR4bWFwYnVmcyksIGJ1ZiwgZG1hX3RtcCwgTlVMTCkpIHsKKwkJCWlmICgtMSA9PSBidWZmZXJfYWRkKCZwcml2LT50eG1hcGJ1ZnMsCisJCQkJYnVmLCBkbWFfdG1wLCBOVUxMKSkgewogCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIE5QIik7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBUWF9CS1BSSU9SSVRZX1JJTkdfQUREUjoKLQkJCWlmICgtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHhia3BidWZzKSwgYnVmLCBkbWFfdG1wLCBOVUxMKSkgeworCQkJaWYgKC0xID09IGJ1ZmZlcl9hZGQoJnByaXYtPnR4YmtwYnVmcywKKwkJCQlidWYsIGRtYV90bXAsIE5VTEwpKSB7CiAJCQkJRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIGZvciBidWZmZXIgTFAiKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFRYX0JFUFJJT1JJVFlfUklOR19BRERSOgotCQkJaWYgKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eGJlcGJ1ZnMpLCBidWYsIGRtYV90bXAsIE5VTEwpKSB7CisJCQlpZiAoLTEgPT0gYnVmZmVyX2FkZCgmcHJpdi0+dHhiZXBidWZzLAorCQkJCWJ1ZiwgZG1hX3RtcCwgTlVMTCkpIHsKIAkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBOUCIpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVFhfVklQUklPUklUWV9SSU5HX0FERFI6Ci0JCQlpZiAoLTEgPT0gYnVmZmVyX2FkZCgmKHByaXYtPnR4dmlwYnVmcyksIGJ1ZiwgZG1hX3RtcCwgTlVMTCkpIHsKKwkJCWlmICgtMSA9PSBidWZmZXJfYWRkKCZwcml2LT50eHZpcGJ1ZnMsCisJCQkJYnVmLCBkbWFfdG1wLCBOVUxMKSkgewogCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIExQIik7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBUWF9WT1BSSU9SSVRZX1JJTkdfQUREUjoKLQkJCWlmICgtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHh2b3BidWZzKSwgYnVmLCBkbWFfdG1wLCBOVUxMKSkgeworCQkJaWYgKC0xID09IGJ1ZmZlcl9hZGQoJnByaXYtPnR4dm9wYnVmcywKKwkJCQlidWYsIGRtYV90bXAsIE5VTEwpKSB7CiAJCQkJRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIGZvciBidWZmZXIgTlAiKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFRYX0hJR0hQUklPUklUWV9SSU5HX0FERFI6Ci0JCQlpZiAoLTEgPT0gYnVmZmVyX2FkZCgmKHByaXYtPnR4aHBidWZzKSwgYnVmLCBkbWFfdG1wLCBOVUxMKSkgeworCQkJaWYgKC0xID09IGJ1ZmZlcl9hZGQoJnByaXYtPnR4aHBidWZzLAorCQkJCWJ1ZiwgZG1hX3RtcCwgTlVMTCkpIHsKIAkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBIUCIpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVFhfQkVBQ09OX1JJTkdfQUREUjoKLQkJCWlmICgtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHhiZWFjb25idWZzKSwgYnVmLCBkbWFfdG1wLCBOVUxMKSkgeworCQkJaWYgKC0xID09IGJ1ZmZlcl9hZGQoJnByaXYtPnR4YmVhY29uYnVmcywKKwkJCQlidWYsIGRtYV90bXAsIE5VTEwpKSB7CiAJCQkJRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIGZvciBidWZmZXIgQlAiKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KQEAgLTg5Nyw4ICs5MDgsOCBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JZGVzYyA9ICh1MzIgKilwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplb2YodTMyKSpyeF9kZXNjX3NpemUqY291bnQrMjU2LAotCQkJCQkgICZkbWFfZGVzYyk7CisJZGVzYyA9ICh1MzIgKilwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LAorCQlzaXplb2YodTMyKSAqIHJ4X2Rlc2Nfc2l6ZSAqIGNvdW50ICsgMjU2LCAmZG1hX2Rlc2MpOwogCiAJaWYgKGRtYV9kZXNjICYgMHhmZikKIAkJLyoKQEAgLTkzNSw3ICs5NDYsOCBAQAogCQl0bXAgPSB0bXArcnhfZGVzY19zaXplOwogCX0KIAotCSoodG1wLXJ4X2Rlc2Nfc2l6ZSkgPSAqKHRtcC1yeF9kZXNjX3NpemUpIHwgKDE8PDMwKTsgLyogdGhpcyBpcyB0aGUgbGFzdCBkZXNjcmlwdG9yICovCisJLyogdGhpcyBpcyB0aGUgbGFzdCBkZXNjcmlwdG9yICovCisJKih0bXAgLSByeF9kZXNjX3NpemUpID0gKih0bXAgLSByeF9kZXNjX3NpemUpIHwgKDEgPDwgMzApOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMDA5LDcgKzEwMjEsOCBAQAogCX0KIH0KIAotc3RhdGljIHUxNiBydGxfcmF0ZVtdID0gezEwLCAyMCwgNTUsIDExMCwgNjAsIDkwLCAxMjAsIDE4MCwgMjQwLCAzNjAsIDQ4MCwgNTQwLCA3MjB9Oworc3RhdGljIHUxNiBydGxfcmF0ZVtdID0gezEwLCAyMCwgNTUsIDExMCwgNjAsCisJOTAsIDEyMCwgMTgwLCAyNDAsIDM2MCwgNDgwLCA1NDAsIDcyMH07CiAKIGlubGluZSB1MTYgcnRsODE4MF9yYXRlMnJhdGUoc2hvcnQgcmF0ZSkKIHsKQEAgLTExNDMsMjMgKzExNTYsMzAgQEAKIC8qCiAgKiBQZXJmb3JtIHNpZ25hbCBzbW9vdGhpbmcgZm9yIGR5bmFtaWMgbWVjaGFuaXNtLgogICogVGhpcyBpcyBkaWZmZXJlbnQgd2l0aCBQZXJmb3JtU2lnbmFsU21vb3RoaW5nODE4NSBpbiBzbW9vdGhpbmcgZm9ybXVsYS4KLSAqIE5vIGRyYW1hdGljIGFkanVzdGlvbiBpcyBhcHBseSBiZWNhdXNlIGR5bmFtaWMgbWVjaGFuaXNtIG5lZWQgc29tZSBkZWdyZWUKLSAqIG9mIGNvcnJlY3RuZXNzLiBQb3J0ZWQgZnJvbSA4MTg3Qi4KKyAqIE5vIGRyYW1hdGljIGFkanVzdG1lbnQgaXMgYXBwbGllZCBiZWNhdXNlIGR5bmFtaWMgbWVjaGFuaXNtIG5lZWQgc29tZQorICogZGVncmVlIG9mIGNvcnJlY3RuZXNzLiBQb3J0ZWQgZnJvbSA4MTg3Qi4KICAqLwogc3RhdGljIHZvaWQgUGVyZm9ybVVuZGVjb3JhdGVkU2lnbmFsU21vb3RoaW5nODE4NShzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiwKIAkJCQkJCSAgYm9vbCBiQ2NrUmF0ZSkKIHsKLQkvKiBEZXRlcm1pbiB0aGUgY3VycmVudCBwYWNrZXQgaXMgQ0NLIHJhdGUuICovCisJbG9uZyBzbW9vdGhlZFNTOworCWxvbmcgc21vb3RoZWRSeDsKKworCS8qIERldGVybWluZSB0aGUgY3VycmVudCBwYWNrZXQgaXMgQ0NLIHJhdGUuICovCiAJcHJpdi0+YkN1ckNDS1BrdCA9IGJDY2tSYXRlOwogCi0JaWYgKHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyA+PSAwKQotCQlwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MgPSAoKHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyAqIDUpICsKLQkJCQkJICAgICAgIChwcml2LT5TaWduYWxTdHJlbmd0aCAqIDEwKSkgLyA2OwotCWVsc2UKLQkJcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTID0gcHJpdi0+U2lnbmFsU3RyZW5ndGggKiAxMDsKKwlzbW9vdGhlZFNTID0gcHJpdi0+U2lnbmFsU3RyZW5ndGggKiAxMDsKIAotCXByaXYtPlVuZGVyY29yYXRlU21vb3RoZWRSeFBvd2VyID0gKChwcml2LT5VbmRlcmNvcmF0ZVNtb290aGVkUnhQb3dlciAqIDUwKSArCi0JCQkJCSAgICAocHJpdi0+UnhQb3dlciAqIDExKSkgLyA2MDsKKwlpZiAocHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTID49IDApCisJCXNtb290aGVkU1MgPSAoKHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyAqIDUpICsKKwkJCQlzbW9vdGhlZFNTKSAvIDY7CisKKwlwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MgPSBzbW9vdGhlZFNTOworCisJc21vb3RoZWRSeCA9ICgocHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFJ4UG93ZXIgKiA1MCkgKworCQkJKHByaXYtPlJ4UG93ZXIgKiAxMSkpIC8gNjA7CisKKwlwcml2LT5VbmRlY29yYXRlZFNtb290aGVkUnhQb3dlciA9IHNtb290aGVkUng7CiAKIAlpZiAoYkNja1JhdGUpCiAJCXByaXYtPkN1ckNDS1JTU0kgPSBwcml2LT5SU1NJOwpAQCAtMTIwNiw4ICsxMjI2LDkgQEAKIAlyeF9kZXNjX3NpemUgPSA4OwogCiAJaWYgKCgqKHByaXYtPnJ4cmluZ3RhaWwpKSAmICgxPDwzMSkpIHsKLQkJLyogd2UgaGF2ZSBnb3QgYW4gUlggaW50LCBidXQgdGhlIGRlc2NyaXB0b3IKLQkJICogd2UgYXJlIHBvaW50aW5nIGlzIGVtcHR5ICovCisJCS8qIHdlIGhhdmUgZ290IGFuIFJYIGludCwgYnV0IHRoZSBkZXNjcmlwdG9yLiB3ZSBhcmUgcG9pbnRpbmcKKwkJICogaXMgZW1wdHkuCisJCSAqLwogCiAJCXByaXYtPnN0YXRzLnJ4bm9kYXRhKys7CiAJCXByaXYtPmllZWU4MDIxMS0+c3RhdHMucnhfZXJyb3JzKys7CkBAIC0xMjE2LDcgKzEyMzcsOCBAQAogCQl0bXAgPSBwcml2LT5yeHJpbmd0YWlsOwogCQlkbyB7CiAJCQlpZiAodG1wID09IHByaXYtPnJ4cmluZykKLQkJCQl0bXAgID0gcHJpdi0+cnhyaW5nICsgKHByaXYtPnJ4cmluZ2NvdW50IC0gMSkqcnhfZGVzY19zaXplOworCQkJCXRtcCAgPSBwcml2LT5yeHJpbmcgKyAocHJpdi0+cnhyaW5nY291bnQgLSAxKSAqCisJCQkJCXJ4X2Rlc2Nfc2l6ZTsKIAkJCWVsc2UKIAkJCQl0bXAgLT0gcnhfZGVzY19zaXplOwogCkBAIC0xMjM3LDcgKzEyNTksNiBAQAogCiAJCWlmICgqKHByaXYtPnJ4cmluZ3RhaWwpICYgKDE8PDI3KSkgewogCQkJcHJpdi0+c3RhdHMucnhkbWFmYWlsKys7Ci0JCQkvKiBETUVTRygiRUU6IFJYIERNQSBGQUlMRUQgYXQgYnVmZmVyIHBvaW50ZWQgYnkgZGVzY3JpcHRvciAleCIsKHUzMilwcml2LT5yeHJpbmd0YWlsKTsgKi8KIAkJCWdvdG8gZHJvcDsKIAkJfQogCkBAIC0xMjU0LDEwICsxMjc1LDkgQEAKIAkJaWYgKGxhc3QpIHsKIAkJCWxhc3RsZW4gPSAoKCpwcml2LT5yeHJpbmd0YWlsKSAmIDB4ZmZmKTsKIAotCQkJLyogaWYgdGhlIGxhc3QgZGVzY3JpcHRvciAodGhhdCBzaG91bGQKLQkJCSAqIHRlbGwgdXMgdGhlIHRvdGFsIHBhY2tldCBsZW4pIHRlbGwKLQkJCSAqIHVzIHNvbWV0aGluZyBsZXNzIHRoYW4gdGhlIGRlc2NyaXB0b3JzCi0JCQkgKiBsZW4gd2UgaGFkIHVudGlsIG5vdywgdGhlbiB0aGVyZSBpcyBzb21lCisJCQkvKiBpZiB0aGUgbGFzdCBkZXNjcmlwdG9yICh0aGF0IHNob3VsZCB0ZWxsIHVzIHRoZSB0b3RhbAorCQkJICogcGFja2V0IGxlbikgdGVsbCB1cyBzb21ldGhpbmcgbGVzcyB0aGFuIHRoZQorCQkJICogZGVzY3JpcHRvcnMgbGVuIHdlIGhhZCB1bnRpbCBub3csIHRoZW4gdGhlcmUgaXMgc29tZQogCQkJICogcHJvYmxlbS4uCiAJCQkgKiB3b3JrYXJvdW5kIHRvIHByZXZlbnQga2VybmVsIHBhbmljCiAJCQkgKi8KQEAgLTEyOTMsMzEgKzEzMTMsMzYgQEAKIAkJcHJpdi0+cnhfcHJldmxlbiArPSBsZW47CiAKIAkJaWYgKHByaXYtPnJ4X3ByZXZsZW4gPiBNQVhfRlJBR19USFJFU0hPTEQgKyAxMDApIHsKLQkJCS8qIEhXIGlzIHByb2JhYmx5IHBhc3Npbmcgc2V2ZXJhbCBidWdneSBmcmFtZXMKLQkJCSogd2l0aG91dCBGRCBvciBMRCBmbGFnIHNldC4KLQkJCSogVGhyb3cgdGhpcyBnYXJiYWdlIGF3YXkgdG8gcHJldmVudCBza2IKLQkJCSogbWVtb3J5IGV4aGF1c3RpbmcKLQkJCSovCisJCQkvKiBIVyBpcyBwcm9iYWJseSBwYXNzaW5nIHNldmVyYWwgYnVnZ3kgZnJhbWVzIHdpdGhvdXQKKwkJCSAqIEZEIG9yIExEIGZsYWcgc2V0LgorCQkJICogVGhyb3cgdGhpcyBnYXJiYWdlIGF3YXkgdG8gcHJldmVudCBza2IgbWVtb3J5CisJCQkgKiBleGhhdXN0aW5nCisJCQkgKi8KIAkJCWlmICghcHJpdi0+cnhfc2tiX2NvbXBsZXRlKQogCQkJCWRldl9rZnJlZV9za2JfYW55KHByaXYtPnJ4X3NrYik7CiAJCQlwcml2LT5yeF9za2JfY29tcGxldGUgPSAxOwogCQl9CiAKLQkJc2lnbmFsID0gKHVuc2lnbmVkIGNoYXIpKCgoKihwcml2LT5yeHJpbmd0YWlsKzMpKSAmICgweDAwZmYwMDAwKSk+PjE2KTsKKwkJc2lnbmFsID0gKHVuc2lnbmVkIGNoYXIpKCgqKHByaXYtPnJ4cmluZ3RhaWwgKyAzKSAmCisJCQkweDAwZmYwMDAwKSA+PiAxNik7CiAJCXNpZ25hbCA9IChzaWduYWwgJiAweGZlKSA+PiAxOwogCiAJCXF1YWxpdHkgPSAodW5zaWduZWQgY2hhcikoKCoocHJpdi0+cnhyaW5ndGFpbCszKSkgJiAoMHhmZikpOwogCiAJCXN0YXRzLm1hY190aW1lWzBdID0gKihwcml2LT5yeHJpbmd0YWlsKzEpOwogCQlzdGF0cy5tYWNfdGltZVsxXSA9ICoocHJpdi0+cnhyaW5ndGFpbCsyKTsKLQkJcnhwb3dlciA9ICgoY2hhcikoKCgqKHByaXYtPnJ4cmluZ3RhaWwrNCkpICYgKDB4MDBmZjAwMDApKT4+MTYpKS8yIC0gNDI7Ci0JCVJTU0kgPSAoKHU4KSgoKCoocHJpdi0+cnhyaW5ndGFpbCszKSkgJiAoMHgwMDAwZmYwMCkpPj44KSkgJiAoMHg3Zik7CisKKwkJcnhwb3dlciA9ICgoY2hhcikoKCoocHJpdi0+cnhyaW5ndGFpbCArIDQpICYKKwkJCTB4MDBmZjAwMDApID4+IDE2KSkgLyAyIC0gNDI7CisKKwkJUlNTSSA9ICgodTgpKCgqKHByaXYtPnJ4cmluZ3RhaWwgKyAzKSAmCisJCQkweDAwMDBmZjAwKSA+PiA4KSkgJiAweDdmOwogCiAJCXJhdGUgPSAoKCoocHJpdi0+cnhyaW5ndGFpbCkpICYKIAkJCSgoMTw8MjMpfCgxPDwyMil8KDE8PDIxKXwoMTw8MjApKSk+PjIwOwogCiAJCXN0YXRzLnJhdGUgPSBydGw4MTgwX3JhdGUycmF0ZShyYXRlKTsKLQkJQW50ZW5uYSA9ICgoKCoocHJpdi0+cnhyaW5ndGFpbCszKSkgJiAoMHgwMDAwODAwMCkpID09IDApID8gMCA6IDE7CisJCUFudGVubmEgPSAoKihwcml2LT5yeHJpbmd0YWlsICsgMykgJiAweDAwMDA4MDAwKSA9PSAwID8gMCA6IDE7CiAJCWlmICghcnRsODE4MF9Jc1dpcmVsZXNzQk1vZGUoc3RhdHMucmF0ZSkpIHsgLyogT0ZETSByYXRlLiAqLwogCQkJUnhBR0NfZEJtID0gcnhwb3dlcisxOwkvKiBiaWFzICovCiAJCX0gZWxzZSB7IC8qIENDSyByYXRlLiAqLwpAQCAtMTMyNiw3ICsxMzUxLDggQEAKIAkJCUxOQSA9ICh1OCkgKFJ4QUdDX2RCbSAmIDB4NjApID4+IDU7IC8qIGJpdCA2fiBiaXQgNSAqLwogCQkJQkIgID0gKHU4KSAoUnhBR0NfZEJtICYgMHgxRik7IC8qIGJpdCA0IH4gYml0IDAgKi8KIAotCQkJUnhBR0NfZEJtID0gLShMTkFfZ2FpbltMTkFdICsgKEJCKjIpKTsgLyogUGluXzExYj0tKExOQV9nYWluK0JCX2dhaW4pIChkQm0pICovCisJCQkvKiBQaW5fMTFiPS0oTE5BX2dhaW4rQkJfZ2FpbikgKGRCbSkgKi8KKwkJCVJ4QUdDX2RCbSA9IC0oTE5BX2dhaW5bTE5BXSArIChCQiAqIDIpKTsKIAogCQkJUnhBR0NfZEJtICs9IDQ7IC8qIGJpYXMgKi8KIAkJfQpAQCAtMTM1NCwyMSArMTM4MCwyMyBAQAogCQlwcml2LT5SU1NJID0gUlNTSTsKIAkJLyogU1EgdHJhbnNsYXRpb24gZm9ybXVsYSBpcyBwcm92aWRlZCBieSBTRDMgRFouIDIwMDYuMDYuMjcgKi8KIAkJaWYgKHF1YWxpdHkgPj0gMTI3KQotCQkJcXVhbGl0eSA9IDE7IC8qMDsgKi8gLyogMCB3aWxsIGNhdXNlIGVwYyB0byBzaG93IHNpZ25hbCB6ZXJvICwgd2FsayBhcm91bmQgbm93OyAqLworCQkJLyogMCBjYXVzZXMgZXBjIHRvIHNob3cgc2lnbmFsIHplcm8sIHdhbGsgYXJvdW5kIG5vdyAqLworCQkJcXVhbGl0eSA9IDE7CiAJCWVsc2UgaWYgKHF1YWxpdHkgPCAyNykKIAkJCXF1YWxpdHkgPSAxMDA7CiAJCWVsc2UKIAkJCXF1YWxpdHkgPSAxMjcgLSBxdWFsaXR5OwogCQlwcml2LT5TaWduYWxRdWFsaXR5ID0gcXVhbGl0eTsKIAotCQlzdGF0cy5zaWduYWwgPSAodTgpcXVhbGl0eTsgLypwcml2LT53c3RhdHMucXVhbC5sZXZlbCA9IHByaXYtPlNpZ25hbFN0cmVuZ3RoOyAqLworCQlzdGF0cy5zaWduYWwgPSAodTgpIHF1YWxpdHk7CisKIAkJc3RhdHMuc2lnbmFsc3RyZW5ndGggPSBSWEFHQzsKIAkJaWYgKHN0YXRzLnNpZ25hbHN0cmVuZ3RoID4gMTAwKQogCQkJc3RhdHMuc2lnbmFsc3RyZW5ndGggPSAxMDA7Ci0JCXN0YXRzLnNpZ25hbHN0cmVuZ3RoID0gKHN0YXRzLnNpZ25hbHN0cmVuZ3RoICogNzApLzEwMCArIDMwOwotCQkvKiBwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT09PnJ4IDogUlhBR0MgaXMgJWQsc2lnbmFsc3RyZW5ndGggaXMgJWRcbiIsUlhBR0Msc3RhdHMuc2lnbmFsc3RyZW5ndGgpOyAqLworCQlzdGF0cy5zaWduYWxzdHJlbmd0aCA9IChzdGF0cy5zaWduYWxzdHJlbmd0aCAqIDcwKSAvIDEwMCArIDMwOwogCQlzdGF0cy5yc3NpID0gcHJpdi0+d3N0YXRzLnF1YWwucXVhbCA9IHByaXYtPlNpZ25hbFF1YWxpdHk7Ci0JCXN0YXRzLm5vaXNlID0gcHJpdi0+d3N0YXRzLnF1YWwubm9pc2UgPSAxMDAgLSBwcml2LT53c3RhdHMucXVhbC5xdWFsOworCQlzdGF0cy5ub2lzZSA9IHByaXYtPndzdGF0cy5xdWFsLm5vaXNlID0KKwkJCTEwMCAtIHByaXYtPndzdGF0cy5xdWFsLnF1YWw7CiAJCWJId0Vycm9yID0gKCgoKihwcml2LT5yeHJpbmd0YWlsKSkgJiAoMHgwMDAwMGZmZikpID09IDQwODApIHwKIAkJCSAgICgoKCoocHJpdi0+cnhyaW5ndGFpbCkpICYgKDB4MDQwMDAwMDApKSAhPSAwKSB8CiAJCQkgICAoKCgqKHByaXYtPnJ4cmluZ3RhaWwpKSAmICgweDA4MDAwMDAwKSkgIT0gMCkgfApAQCAtMTM5NywyNyArMTQyNSw0MCBAQAogCiAJCQkvKiBGb3IgZ29vZC1sb29raW5nIHNpbmdhbCBzdHJlbmd0aC4gKi8KIAkJCVNpZ25hbFN0cmVuZ3RoSW5kZXggPSBOZXRnZWFyU2lnbmFsU3RyZW5ndGhUcmFuc2xhdGUoCi0JCQkJCQkJcHJpdi0+TGFzdFNpZ25hbFN0cmVuZ3RoSW5QZXJjZW50LAotCQkJCQkJCXByaXYtPlNpZ25hbFN0cmVuZ3RoKTsKKwkJCQlwcml2LT5MYXN0U2lnbmFsU3RyZW5ndGhJblBlcmNlbnQsCisJCQkJcHJpdi0+U2lnbmFsU3RyZW5ndGgpOwogCiAJCQlwcml2LT5MYXN0U2lnbmFsU3RyZW5ndGhJblBlcmNlbnQgPSBTaWduYWxTdHJlbmd0aEluZGV4OwotCQkJcHJpdi0+U3RhdHNfU2lnbmFsU3RyZW5ndGggPSBUcmFuc2xhdGVUb0RibTgxODUoKHU4KVNpZ25hbFN0cmVuZ3RoSW5kZXgpOwotCQkvKgotCQkgKiBXZSBuZWVkIG1vcmUgY29ycmVjdCBwb3dlciBvZiByZWNlaXZlZCBwYWNrZXRzIGFuZCB0aGUgICJTaWduYWxTdHJlbmd0aCIgb2YgUnhTdGF0cyBpcyBiZWF1dGlmaWVkLAotCQkgKiBzbyB3ZSByZWNvcmQgdGhlIGNvcnJlY3QgcG93ZXIgaGVyZS4KLQkJICovCi0JCQlwcml2LT5TdGF0c19TaWduYWxRdWFsaXR5ID0gKGxvbmcpKHByaXYtPlN0YXRzX1NpZ25hbFF1YWxpdHkgKiA1ICsgKGxvbmcpcHJpdi0+U2lnbmFsUXVhbGl0eSArIDUpIC8gNjsKLQkJCXByaXYtPlN0YXRzX1JlY3ZTaWduYWxQb3dlciA9IChsb25nKShwcml2LT5TdGF0c19SZWN2U2lnbmFsUG93ZXIgKiA1ICsgcHJpdi0+UmVjdlNpZ25hbFBvd2VyIC0gMSkgLyA2OworCQkJcHJpdi0+U3RhdHNfU2lnbmFsU3RyZW5ndGggPQorCQkJCVRyYW5zbGF0ZVRvRGJtODE4NSgodTgpU2lnbmFsU3RyZW5ndGhJbmRleCk7CiAKLQkJLyogRmlndXJlIG91dCB3aGljaCBhbnRlbm5hIHRoYXQgcmVjZWl2ZWQgdGhlIGxhc3QgcGFja2V0LiAqLwotCQkJcHJpdi0+TGFzdFJ4UGt0QW50ZW5uYSA9IEFudGVubmEgPyAxIDogMDsgLyogMDogYXV4LCAxOiBtYWluLiAqLworCQkJLyoKKwkJCSAqIFdlIG5lZWQgbW9yZSBjb3JyZWN0IHBvd2VyIG9mIHJlY2VpdmVkIHBhY2tldHMgYW5kCisJCQkgKiB0aGUgIlNpZ25hbFN0cmVuZ3RoIiBvZiBSeFN0YXRzIGlzIGJlYXV0aWZpZWQsIHNvIHdlCisJCQkgKiByZWNvcmQgdGhlIGNvcnJlY3QgcG93ZXIgaGVyZS4KKwkJCSAqLworCisJCQlwcml2LT5TdGF0c19TaWduYWxRdWFsaXR5ID0gKGxvbmcpKAorCQkJCXByaXYtPlN0YXRzX1NpZ25hbFF1YWxpdHkgKiA1ICsKKwkJCQkobG9uZylwcml2LT5TaWduYWxRdWFsaXR5ICsgNSkgLyA2OworCisJCQlwcml2LT5TdGF0c19SZWN2U2lnbmFsUG93ZXIgPSAobG9uZykoCisJCQkJcHJpdi0+U3RhdHNfUmVjdlNpZ25hbFBvd2VyICogNSArCisJCQkJcHJpdi0+UmVjdlNpZ25hbFBvd2VyIC0gMSkgLyA2OworCisJCQkvKgorCQkJICogRmlndXJlIG91dCB3aGljaCBhbnRlbm5hIHJlY2VpdmVkIHRoZSBsYXN0IHBhY2tldC4KKwkJCSAqIDA6IGF1eCwgMTogbWFpbgorCQkJICovCisJCQlwcml2LT5MYXN0UnhQa3RBbnRlbm5hID0gQW50ZW5uYSA/IDEgOiAwOwogCQkJU3dBbnRlbm5hRGl2ZXJzaXR5UnhPazgxODUoZGV2LCBwcml2LT5TaWduYWxTdHJlbmd0aCk7CiAJCX0KIAogCQlpZiAoZmlyc3QpIHsKIAkJCWlmICghcHJpdi0+cnhfc2tiX2NvbXBsZXRlKSB7CiAJCQkJLyogc2VlbXMgdGhhdCBIVyBzb21ldGltZXMgZmFpbHMgdG8gcmVjZWl2ZSBhbmQKLQkJCQkgICBkb2Vzbid0IHByb3ZpZGUgdGhlIGxhc3QgZGVzY3JpcHRvciAqLworCQkJCSAqIGRvZXNuJ3QgcHJvdmlkZSB0aGUgbGFzdCBkZXNjcmlwdG9yLgorCQkJCSAqLwogCQkJCWRldl9rZnJlZV9za2JfYW55KHByaXYtPnJ4X3NrYik7CiAJCQkJcHJpdi0+c3RhdHMucnhub2xhc3QrKzsKIAkJCX0KQEAgLTE0MjgsMTUgKzE0NjksMTYgQEAKIAkJCXByaXYtPnJ4X3NrYl9jb21wbGV0ZSA9IDA7CiAJCQlwcml2LT5yeF9za2ItPmRldiA9IGRldjsKIAkJfSBlbHNlIHsKLQkJCS8qIGlmIHdlIGFyZSBoZXJlIHdlIHNob3VsZCBoYXZlIGFscmVhZHkgUlhlZAotCQkJKiB0aGUgZmlyc3QgZnJhbWUuCi0JCQkqIElmIHdlIGdldCBoZXJlIGFuZCB0aGUgc2tiIGlzIG5vdCBhbGxvY2F0ZWQgdGhlbgotCQkJKiB3ZSBoYXZlIGp1c3QgdGhyb3cgb3V0IGdhcmJhZ2UgKHNrYiBub3QgYWxsb2NhdGVkKQotCQkJKiBhbmQgd2UgYXJlIHN0aWxsIHJ4aW5nIGdhcmJhZ2UuLi4uCi0JCQkqLworCQkJLyogaWYgd2UgYXJlIGhlcmUgd2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBSWGVkIHRoZSBmaXJzdAorCQkJICogZnJhbWUuCisJCQkgKiBJZiB3ZSBnZXQgaGVyZSBhbmQgdGhlIHNrYiBpcyBub3QgYWxsb2NhdGVkIHRoZW4KKwkJCSAqIHdlIGhhdmUganVzdCB0aHJvdyBvdXQgZ2FyYmFnZSAoc2tiIG5vdCBhbGxvY2F0ZWQpCisJCQkgKiBhbmQgd2UgYXJlIHN0aWxsIHJ4aW5nIGdhcmJhZ2UuLi4uCisJCQkgKi8KIAkJCWlmICghcHJpdi0+cnhfc2tiX2NvbXBsZXRlKSB7CiAKLQkJCQl0bXBfc2tiID0gZGV2X2FsbG9jX3NrYihwcml2LT5yeF9za2ItPmxlbitsZW4rMik7CisJCQkJdG1wX3NrYiA9IGRldl9hbGxvY19za2IoCisJCQkJCXByaXYtPnJ4X3NrYi0+bGVuICsgbGVuICsgMik7CiAKIAkJCQlpZiAoIXRtcF9za2IpCiAJCQkJCWdvdG8gZHJvcDsKQEAgLTE0NTQsMTMgKzE0OTYsOCBAQAogCQl9CiAKIAkJaWYgKCFwcml2LT5yeF9za2JfY29tcGxldGUpIHsKLQkJCWlmIChwYWRkaW5nKSB7Ci0JCQkJbWVtY3B5KHNrYl9wdXQocHJpdi0+cnhfc2tiLCBsZW4pLAotCQkJCQkoKCh1bnNpZ25lZCBjaGFyICopcHJpdi0+cnhidWZmZXItPmJ1ZikgKyAyKSwgbGVuKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVtY3B5KHNrYl9wdXQocHJpdi0+cnhfc2tiLCBsZW4pLAotCQkJCQlwcml2LT5yeGJ1ZmZlci0+YnVmLCBsZW4pOwotCQkJfQorCQkJbWVtY3B5KHNrYl9wdXQocHJpdi0+cnhfc2tiLCBsZW4pLCAoKHVuc2lnbmVkIGNoYXIgKikKKwkJCQlwcml2LT5yeGJ1ZmZlci0+YnVmKSArIChwYWRkaW5nID8gMiA6IDApLCBsZW4pOwogCQl9CiAKIAkJaWYgKGxhc3QgJiYgIXByaXYtPnJ4X3NrYl9jb21wbGV0ZSkgewpAQCAtMTUzOCw4ICsxNTc1LDggQEAKIHsKIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CiAJaW50IG1vZGU7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmggPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKikgc2tiLT5kYXRhOwotCXNob3J0IG1vcmVmcmFnID0gKGgtPmZyYW1lX2NvbnRyb2wpICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopc2tiLT5kYXRhOworCWJvb2wgbW9yZWZyYWcgPSBsZTE2X3RvX2NwdShoLT5mcmFtZV9jb250cm9sKSAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBwcmlvcml0eTsKIApAQCAtMTU0NywxMSArMTU4NCwxMCBAQAogCiAJcmF0ZSA9IGllZWVyYXRlMnJ0bHJhdGUocmF0ZSk7CiAJLyoKLQkgKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmVxdWlyZSBsb2NrIGJlY2F1c2Ugd2UgbWFrZQotCSAqIHN1cmUgaXQncyBjYWxsZWQgd2l0aCB0aGUgdHhfbG9jayBhbHJlYWR5IGFjcXVpcmVkLgotCSAqIHRoaXMgY29tZSBmcm9tIHRoZSBrZXJuZWwncyBoYXJkX3htaXQgY2FsbGJhY2sgKHRocm91Z2gKLQkgKiB0aGUgaWVlZSBzdGFjaywgb3IgZnJvbSB0aGUgdHJ5X3dha2VfcXVldWUgKGFnYWluIHRocm91Z2gKLQkgKiB0aGUgaWVlZSBzdGFjay4KKwkgKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmVxdWlyZSBsb2NrIGJlY2F1c2Ugd2UgbWFrZSBzdXJlIGl0J3MgY2FsbGVkCisJICogd2l0aCB0aGUgdHhfbG9jayBhbHJlYWR5IGFjcXVpcmVkLgorCSAqIFRoaXMgY29tZSBmcm9tIHRoZSBrZXJuZWwncyBoYXJkX3htaXQgY2FsbGJhY2sgKHRocm91Z2ggdGhlIGllZWUKKwkgKiBzdGFjaywgb3IgZnJvbSB0aGUgdHJ5X3dha2VfcXVldWUgKGFnYWluIHRocm91Z2ggdGhlIGllZWUgc3RhY2suCiAJICovCiAJcHJpb3JpdHkgPSBBQzJRKHNrYi0+cHJpb3JpdHkpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CkBAIC0xNjEzLDU1ICsxNjQ5LDYgQEAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCi0vKiBsb25ncHJlIDE0NCs0OCBzaG9ydHByZSA3MisyNCAqLwotdTE2IHJ0bDgxODBfbGVuMmR1cmF0aW9uKHUzMiBsZW4sIHNob3J0IHJhdGUsIHNob3J0ICpleHQpCi17Ci0JdTE2IGR1cmF0aW9uOwotCXUxNiBkcmlmdDsKLQkqZXh0ID0gMDsKLQotCXN3aXRjaCAocmF0ZSkgewotCWNhc2UgMDogLyogMW1icHMgKi8KLQkJKmV4dCA9IDA7Ci0JCWR1cmF0aW9uID0gKChsZW4rNCk8PDQpIC8gMHgyOwotCQlkcmlmdCA9ICgobGVuKzQpPDw0KSAlIDB4MjsKLQkJaWYgKGRyaWZ0ID09IDApCi0JCQlicmVhazsKLQkJZHVyYXRpb24rKzsKLQkJYnJlYWs7Ci0JY2FzZSAxOiAvKiAybWJwcyAqLwotCQkqZXh0ID0gMDsKLQkJZHVyYXRpb24gPSAoKGxlbis0KTw8NCkgLyAweDQ7Ci0JCWRyaWZ0ID0gKChsZW4rNCk8PDQpICUgMHg0OwotCQlpZiAoZHJpZnQgPT0gMCkKLQkJCWJyZWFrOwotCQlkdXJhdGlvbisrOwotCQlicmVhazsKLQljYXNlIDI6IC8qIDUuNW1icHMgKi8KLQkJKmV4dCA9IDA7Ci0JCWR1cmF0aW9uID0gKChsZW4rNCk8PDQpIC8gMHhiOwotCQlkcmlmdCA9ICgobGVuKzQpPDw0KSAlIDB4YjsKLQkJaWYgKGRyaWZ0ID09IDApCi0JCQlicmVhazsKLQkJZHVyYXRpb24rKzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIDM6IC8qIDExbWJwcyAqLwotCQkqZXh0ID0gMDsKLQkJZHVyYXRpb24gPSAoKGxlbis0KTw8NCkgLyAweDE2OwotCQlkcmlmdCA9ICgobGVuKzQpPDw0KSAlIDB4MTY7Ci0JCWlmIChkcmlmdCA9PSAwKQotCQkJYnJlYWs7Ci0JCWR1cmF0aW9uKys7Ci0JCWlmIChkcmlmdCA+IDYpCi0JCQlicmVhazsKLQkJKmV4dCA9IDE7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBkdXJhdGlvbjsKLX0KLQogc3RhdGljIHZvaWQgcnRsODE4MF9wcmVwYXJlX2JlYWNvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKQEAgLTE2NjksNyArMTY1NiwxMCBAQAogCiAJdTE2IHdvcmQgID0gcmVhZF9uaWNfd29yZChkZXYsIEJjbkl0dik7CiAJd29yZCAmPSB+QmNuSXR2X0Jjbkl0djsgLyogY2xlYXIgQmNuX0l0diAqLwotCXdvcmQgfD0gY3B1X3RvX2xlMTYocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsKTsgLyogMHg2NDsgKi8KKworCS8qIHdvcmQgfD0gMHg2NDsgKi8KKwl3b3JkIHw9IGNwdV90b19sZTE2KHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCk7CisKIAl3cml0ZV9uaWNfd29yZChkZXYsIEJjbkl0diwgd29yZCk7CiAKIAlza2IgPSBpZWVlODAyMTFfZ2V0X2JlYWNvbihwcml2LT5pZWVlODAyMTEpOwpAQCAtMTY4MSwxMiArMTY3MSwxMiBAQAogfQogCiAvKgotICogVGhpcyBmdW5jdGlvbiBkbyB0aGUgcmVhbCBkaXJ0eSB3b3JrOiBpdCBlbnF1ZXVlcyBhIFRYIGNvbW1hbmQKLSAqIGRlc2NyaXB0b3IgaW4gdGhlIHJpbmcgYnVmZmVyLCBjb3B5ZXMgdGhlIGZyYW1lIGluIGEgVFggYnVmZmVyCi0gKiBhbmQga2lja3MgdGhlIE5JQyB0byBlbnN1cmUgaXQgZG9lcyB0aGUgRE1BIHRyYW5zZmVyLgorICogVGhpcyBmdW5jdGlvbiBkbyB0aGUgcmVhbCBkaXJ0eSB3b3JrOiBpdCBlbnF1ZXVlcyBhIFRYIGNvbW1hbmQgZGVzY3JpcHRvciBpbgorICogdGhlIHJpbmcgYnVmZmVyLCBjb3B5ZXMgdGhlIGZyYW1lIGluIGEgVFggYnVmZmVyIGFuZCBraWNrcyB0aGUgTklDIHRvIGVuc3VyZQorICogaXQgZG9lcyB0aGUgRE1BIHRyYW5zZmVyLgogICovCiBzaG9ydCBydGw4MTgwX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICp0eGJ1ZiwgaW50IGxlbiwgaW50IHByaW9yaXR5LAotCQkgc2hvcnQgbW9yZWZyYWcsIHNob3J0IGRlc2NmcmFnLCBpbnQgcmF0ZSkKKwkJIGJvb2wgbW9yZWZyYWcsIHNob3J0IGRlc2NmcmFnLCBpbnQgcmF0ZSkKIHsKIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTMyICp0YWlsLCAqdGVtcF90YWlsOwpAQCAtMTY5NywxNiArMTY4NywxNyBAQAogCWludCBidWZsZW47CiAJaW50IGNvdW50OwogCXN0cnVjdCBidWZmZXIgKmJ1Zmxpc3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmZyYWdfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopdHhidWY7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmZyYWdfaGRyID0KKwkJKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopdHhidWY7CiAJdTggZGVzdFtFVEhfQUxFTl07Ci0JdTgJCQliVXNlU2hvcnRQcmVhbWJsZSA9IDA7Ci0JdTgJCQliQ1RTRW5hYmxlID0gMDsKLQl1OAkJCWJSVFNFbmFibGUgPSAwOwotCXUxNgkJCUR1cmF0aW9uID0gMDsKLQl1MTYJCQlSdHNEdXIgPSAwOwotCXUxNgkJCVRoaXNGcmFtZVRpbWUgPSAwOwotCXUxNgkJCVR4RGVzY0R1cmF0aW9uID0gMDsKLQlib29sCQkJb3duYml0X2ZsYWcgPSBmYWxzZTsKKwl1OCBiVXNlU2hvcnRQcmVhbWJsZSA9IDA7CisJdTggYkNUU0VuYWJsZSA9IDA7CisJdTggYlJUU0VuYWJsZSA9IDA7CisJdTE2IER1cmF0aW9uID0gMDsKKwl1MTYgUnRzRHVyID0gMDsKKwl1MTYgVGhpc0ZyYW1lVGltZSA9IDA7CisJdTE2IFR4RGVzY0R1cmF0aW9uID0gMDsKKwlib29sIG93bmJpdF9mbGFnID0gZmFsc2U7CiAKIAlzd2l0Y2ggKHByaW9yaXR5KSB7CiAJY2FzZSBNQU5BR0VfUFJJT1JJVFk6CkBAIC0xNzU2LDc0ICsxNzQ3LDc5IEBACiAJCWJyZWFrOwogCX0KIAotCQltZW1jcHkoJmRlc3QsIGZyYWdfaGRyLT5hZGRyMSwgRVRIX0FMRU4pOwotCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGVzdCkpIHsKLQkJCUR1cmF0aW9uID0gMDsKLQkJCVJ0c0R1ciA9IDA7Ci0JCQliUlRTRW5hYmxlID0gMDsKKwltZW1jcHkoJmRlc3QsIGZyYWdfaGRyLT5hZGRyMSwgRVRIX0FMRU4pOworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSkgeworCQlEdXJhdGlvbiA9IDA7CisJCVJ0c0R1ciA9IDA7CisJCWJSVFNFbmFibGUgPSAwOworCQliQ1RTRW5hYmxlID0gMDsKKworCQlUaGlzRnJhbWVUaW1lID0gQ29tcHV0ZVR4VGltZShsZW4gKyBzQ3JjTG5nLAorCQkJcnRsODE4MF9yYXRlMnJhdGUocmF0ZSksIDAsIGJVc2VTaG9ydFByZWFtYmxlKTsKKwkJVHhEZXNjRHVyYXRpb24gPSBUaGlzRnJhbWVUaW1lOworCX0gZWxzZSB7IC8qIFVuaWNhc3QgcGFja2V0ICovCisJCXUxNiBBY2tUaW1lOworCisJCS8qIGZvciBLZWVwIGFsaXZlICovCisJCXByaXYtPk51bVR4VW5pY2FzdCsrOworCisJCS8qIEZpZ3VyZSBvdXQgQUNLIHJhdGUgYWNjb3JkaW5nIHRvIEJTUyBiYXNpYyByYXRlCisJCSAqIGFuZCBUeCByYXRlLgorCQkgKiBBY2tDVFNMbmcgPSAxNCB1c2UgMU0gYnBzIHNlbmQKKwkJICovCisJCUFja1RpbWUgPSBDb21wdXRlVHhUaW1lKDE0LCAxMCwgMCwgMCk7CisKKwkJaWYgKCgobGVuICsgc0NyY0xuZykgPiBwcml2LT5ydHMpICYmIHByaXYtPnJ0cykgeyAvKiBSVFMvQ1RTLiAqLworCQkJdTE2IFJ0c1RpbWUsIEN0c1RpbWU7CisJCQliUlRTRW5hYmxlID0gMTsKIAkJCWJDVFNFbmFibGUgPSAwOwogCi0JCQlUaGlzRnJhbWVUaW1lID0gQ29tcHV0ZVR4VGltZShsZW4gKyBzQ3JjTG5nLCBydGw4MTgwX3JhdGUycmF0ZShyYXRlKSwKLQkJCQkJCSAgICAgIDAsIGJVc2VTaG9ydFByZWFtYmxlKTsKLQkJCVR4RGVzY0R1cmF0aW9uID0gVGhpc0ZyYW1lVGltZTsKLQkJfSBlbHNlIHsgLyogVW5pY2FzdCBwYWNrZXQgKi8KLQkJCXUxNiBBY2tUaW1lOworCQkJLyogUmF0ZSBhbmQgdGltZSByZXF1aXJlZCBmb3IgUlRTLiAqLworCQkJUnRzVGltZSA9IENvbXB1dGVUeFRpbWUoc0Fja0N0c0xuZyAvIDgsCisJCQkJcHJpdi0+aWVlZTgwMjExLT5iYXNpY19yYXRlLCAwLCAwKTsKIAotCQkJLyogWUosYWRkLDA4MDgyOCxmb3IgS2VlcCBhbGl2ZSAqLwotCQkJcHJpdi0+TnVtVHhVbmljYXN0Kys7CisJCQkvKiBSYXRlIGFuZCB0aW1lIHJlcXVpcmVkIGZvciBDVFMuCisJCQkgKiBBY2tDVFNMbmcgPSAxNCB1c2UgMU0gYnBzIHNlbmQKKwkJCSAqLworCQkJQ3RzVGltZSA9IENvbXB1dGVUeFRpbWUoMTQsIDEwLCAwLCAwKTsKIAotCQkJLyogRmlndXJlIG91dCBBQ0sgcmF0ZSBhY2NvcmRpbmcgdG8gQlNTIGJhc2ljIHJhdGUKLQkJCSAqIGFuZCBUeCByYXRlLiAqLwotCQkJQWNrVGltZSA9IENvbXB1dGVUeFRpbWUoMTQsIDEwLCAwLCAwKTsJLyogQWNrQ1RTTG5nID0gMTQgdXNlIDFNIGJwcyBzZW5kICovCisJCQkvKiBGaWd1cmUgb3V0IHRpbWUgcmVxdWlyZWQgdG8gdHJhbnNtaXQgdGhpcyBmcmFtZS4gKi8KKwkJCVRoaXNGcmFtZVRpbWUgPSBDb21wdXRlVHhUaW1lKGxlbiArIHNDcmNMbmcsCisJCQkJcnRsODE4MF9yYXRlMnJhdGUocmF0ZSksIDAsCisJCQkJYlVzZVNob3J0UHJlYW1ibGUpOwogCi0JCQlpZiAoKChsZW4gKyBzQ3JjTG5nKSA+IHByaXYtPnJ0cykgJiYgcHJpdi0+cnRzKSB7IC8qIFJUUy9DVFMuICovCi0JCQkJdTE2IFJ0c1RpbWUsIEN0c1RpbWU7Ci0JCQkJLyogdTE2IEN0c1JhdGU7ICovCi0JCQkJYlJUU0VuYWJsZSA9IDE7Ci0JCQkJYkNUU0VuYWJsZSA9IDA7CisJCQkvKiBSVFMtQ1RTLVRoaXNGcmFtZS1BQ0suICovCisJCQlSdHNEdXIgPSBDdHNUaW1lICsgVGhpc0ZyYW1lVGltZSArCisJCQkJQWNrVGltZSArIDMgKiBhU2lmc1RpbWU7CiAKLQkJCQkvKiBSYXRlIGFuZCB0aW1lIHJlcXVpcmVkIGZvciBSVFMuICovCi0JCQkJUnRzVGltZSA9IENvbXB1dGVUeFRpbWUoc0Fja0N0c0xuZy84LCBwcml2LT5pZWVlODAyMTEtPmJhc2ljX3JhdGUsIDAsIDApOwotCQkJCS8qIFJhdGUgYW5kIHRpbWUgcmVxdWlyZWQgZm9yIENUUy4gKi8KLQkJCQlDdHNUaW1lID0gQ29tcHV0ZVR4VGltZSgxNCwgMTAsIDAsIDApOwkvKiBBY2tDVFNMbmcgPSAxNCB1c2UgMU0gYnBzIHNlbmQgKi8KKwkJCVR4RGVzY0R1cmF0aW9uID0gUnRzVGltZSArIFJ0c0R1cjsKKwkJfSBlbHNlIHsgLyogTm9ybWFsIGNhc2UuICovCisJCQliQ1RTRW5hYmxlID0gMDsKKwkJCWJSVFNFbmFibGUgPSAwOworCQkJUnRzRHVyID0gMDsKIAotCQkJCS8qIEZpZ3VyZSBvdXQgdGltZSByZXF1aXJlZCB0byB0cmFuc21pdCB0aGlzIGZyYW1lLiAqLwotCQkJCVRoaXNGcmFtZVRpbWUgPSBDb21wdXRlVHhUaW1lKGxlbiArIHNDcmNMbmcsCi0JCQkJCQlydGw4MTgwX3JhdGUycmF0ZShyYXRlKSwKLQkJCQkJCTAsCi0JCQkJCQliVXNlU2hvcnRQcmVhbWJsZSk7CisJCQlUaGlzRnJhbWVUaW1lID0gQ29tcHV0ZVR4VGltZShsZW4gKyBzQ3JjTG5nLAorCQkJCXJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpLCAwLCBiVXNlU2hvcnRQcmVhbWJsZSk7CisJCQlUeERlc2NEdXJhdGlvbiA9IFRoaXNGcmFtZVRpbWUgKyBhU2lmc1RpbWUgKyBBY2tUaW1lOworCQl9CiAKLQkJCQkvKiBSVFMtQ1RTLVRoaXNGcmFtZS1BQ0suICovCi0JCQkJUnRzRHVyID0gQ3RzVGltZSArIFRoaXNGcmFtZVRpbWUgKyBBY2tUaW1lICsgMyphU2lmc1RpbWU7CisJCWlmICghKGxlMTZfdG9fY3B1KGZyYWdfaGRyLT5mcmFtZV9jb250cm9sKSAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUykpIHsKKwkJCS8qIFRoaXNGcmFtZS1BQ0suICovCisJCQlEdXJhdGlvbiA9IGFTaWZzVGltZSArIEFja1RpbWU7CisJCX0gZWxzZSB7IC8qIE9uZSBvciBtb3JlIGZyYWdtZW50cyByZW1haW5lZC4gKi8KKwkJCXUxNiBOZXh0RnJhZ1RpbWU7CiAKLQkJCQlUeERlc2NEdXJhdGlvbiA9IFJ0c1RpbWUgKyBSdHNEdXI7Ci0JCQl9IGVsc2UgeyAvKiBOb3JtYWwgY2FzZS4gKi8KLQkJCQliQ1RTRW5hYmxlID0gMDsKLQkJCQliUlRTRW5hYmxlID0gMDsKLQkJCQlSdHNEdXIgPSAwOworCQkJLyogcHJldGVuZCBmb2xsb3dpbmcgcGFja2V0IGxlbmd0aCA9IGN1cnJlbnQgcGFja2V0ICovCisJCQlOZXh0RnJhZ1RpbWUgPSBDb21wdXRlVHhUaW1lKGxlbiArIHNDcmNMbmcsCisJCQkJcnRsODE4MF9yYXRlMnJhdGUocmF0ZSksIDAsIGJVc2VTaG9ydFByZWFtYmxlKTsKIAotCQkJCVRoaXNGcmFtZVRpbWUgPSBDb21wdXRlVHhUaW1lKGxlbiArIHNDcmNMbmcsIHJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpLAotCQkJCQkJCSAgICAgIDAsIGJVc2VTaG9ydFByZWFtYmxlKTsKLQkJCQlUeERlc2NEdXJhdGlvbiA9IFRoaXNGcmFtZVRpbWUgKyBhU2lmc1RpbWUgKyBBY2tUaW1lOwotCQkJfQorCQkJLyogVGhpc0ZyYWctQUNrLU5leHRGcmFnLUFDSy4gKi8KKwkJCUR1cmF0aW9uID0gTmV4dEZyYWdUaW1lICsgMyAqIGFTaWZzVGltZSArIDIgKiBBY2tUaW1lOworCQl9CiAKLQkJCWlmICghKGZyYWdfaGRyLT5mcmFtZV9jb250cm9sICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSkgewotCQkJCS8qIFRoaXNGcmFtZS1BQ0suICovCi0JCQkJRHVyYXRpb24gPSBhU2lmc1RpbWUgKyBBY2tUaW1lOwotCQkJfSBlbHNlIHsgLyogT25lIG9yIG1vcmUgZnJhZ21lbnRzIHJlbWFpbmVkLiAqLwotCQkJCXUxNiBOZXh0RnJhZ1RpbWU7Ci0JCQkJTmV4dEZyYWdUaW1lID0gQ29tcHV0ZVR4VGltZShsZW4gKyBzQ3JjTG5nLCAvKiBwcmV0ZW5kIGZvbGxvd2luZyBwYWNrZXQgbGVuZ3RoIGVxdWFsIGN1cnJlbnQgcGFja2V0ICovCi0JCQkJCQlydGw4MTgwX3JhdGUycmF0ZShyYXRlKSwKLQkJCQkJCTAsCi0JCQkJCQliVXNlU2hvcnRQcmVhbWJsZSk7CisJfSAvKiBFbmQgb2YgVW5pY2FzdCBwYWNrZXQgKi8KIAotCQkJCS8qIFRoaXNGcmFnLUFDay1OZXh0RnJhZy1BQ0suICovCi0JCQkJRHVyYXRpb24gPSBOZXh0RnJhZ1RpbWUgKyAzKmFTaWZzVGltZSArIDIqQWNrVGltZTsKLQkJCX0KLQotCQl9IC8qIEVuZCBvZiBVbmljYXN0IHBhY2tldCAqLwotCi0JCWZyYWdfaGRyLT5kdXJhdGlvbl9pZCA9IER1cmF0aW9uOworCWZyYWdfaGRyLT5kdXJhdGlvbl9pZCA9IER1cmF0aW9uOwogCiAJYnVmbGVuID0gcHJpdi0+dHhidWZmc2l6ZTsKIAlyZW1haW4gPSBsZW47CkBAIC0xODMyLDcgKzE4MjgsOCBAQAogCXdoaWxlIChyZW1haW4gIT0gMCkgewogCQltYigpOwogCQlpZiAoIWJ1Zmxpc3QpIHsKLQkJCURNRVNHRSgiVFggYnVmZmVyIGVycm9yLCBjYW5ub3QgVFggZnJhbWVzLiBwcmkgJWQuIiwgcHJpb3JpdHkpOworCQkJRE1FU0dFKCJUWCBidWZmZXIgZXJyb3IsIGNhbm5vdCBUWCBmcmFtZXMuIHByaSAlZC4iLAorCQkJCXByaW9yaXR5KTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQlidWYgPSBidWZsaXN0LT5idWY7CkBAIC0xODUxLDQzICsxODQ4LDQzIEBACiAJCSoodGFpbCs2KSA9IDA7CiAJCSoodGFpbCs3KSA9IDA7CiAKLQkJLyogRklYTUU6IHRoaXMgc2hvdWxkIGJlIHRyaWdnZXJlZCBieSBIVyBlbmNyeXB0aW9uIHBhcmFtZXRlcnMuKi8KKwkJLyogRklYTUU6IHNob3VsZCBiZSB0cmlnZ2VyZWQgYnkgSFcgZW5jcnlwdGlvbiBwYXJhbWV0ZXJzLiovCiAJCSp0YWlsIHw9ICgxPDwxNSk7IC8qIG5vIGVuY3J5cHQgKi8KIAogCQlpZiAocmVtYWluID09IGxlbiAmJiAhZGVzY2ZyYWcpIHsKIAkJCW93bmJpdF9mbGFnID0gZmFsc2U7Ci0JCQkqdGFpbCA9ICp0YWlsIHwgKDE8PDI5KTsgLyogZmlzdCBzZWdtZW50IG9mIHRoZSBwYWNrZXQgKi8KKwkJCSp0YWlsID0gKnRhaWwgfCAoMSA8PCAyOSk7IC8qIGZpcnN0IHNlZ21lbnQgb2YgcGFja2V0ICovCiAJCQkqdGFpbCA9ICp0YWlsIHwgKGxlbik7CiAJCX0gZWxzZSB7CiAJCQlvd25iaXRfZmxhZyA9IHRydWU7CiAJCX0KIAogCQlmb3IgKGkgPSAwOyBpIDwgYnVmbGVuICYmIHJlbWFpbiA+IDA7IGkrKywgcmVtYWluLS0pIHsKLQkJCSgodTggKilidWYpW2ldID0gdHhidWZbaV07IC8qIGNvcHkgZGF0YSBpbnRvIGRlc2NyaXB0b3IgcG9pbnRlZCBETUFibGUgYnVmZmVyICovCisJCQkvKiBjb3B5IGRhdGEgaW50byBkZXNjcmlwdG9yIHBvaW50ZWQgRE1BYmxlIGJ1ZmZlciAqLworCQkJKCh1OCAqKWJ1ZilbaV0gPSB0eGJ1ZltpXTsKKwogCQkJaWYgKHJlbWFpbiA9PSA0ICYmIGkrNCA+PSBidWZsZW4pCiAJCQkJYnJlYWs7CiAJCQkvKiBlbnN1cmUgdGhlIGxhc3QgZGVzYyBoYXMgYXQgbGVhc3QgNCBieXRlcyBwYXlsb2FkICovCi0KIAkJfQogCQl0eGJ1ZiA9IHR4YnVmICsgaTsKIAkJKih0YWlsKzMpID0gKih0YWlsKzMpICYgfjB4ZmZmOwogCQkqKHRhaWwrMykgPSAqKHRhaWwrMykgfCBpOyAvKiBidWZmZXIgbGVuZ3RoICovCi0JCS8qIFVzZSBzaG9ydCBwcmVhbWJsZSBvciBub3QgKi8KLQkJaWYgKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkmV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKQotCQkJaWYgKHByaXYtPnBsY3BfcHJlYW1ibGVfbW9kZSA9PSAxICYmIHJhdGUgIT0gMCkJLyogIHNob3J0IG1vZGUgbm93LCBub3QgbG9uZyEgKi8KLQkJCTsgLyogKnRhaWwgfD0gKDE8PDE2KTsgKi8JCQkJLyogZW5hYmxlIHNob3J0IHByZWFtYmxlIG1vZGUuICovCiAKIAkJaWYgKGJDVFNFbmFibGUpCiAJCQkqdGFpbCB8PSAoMTw8MTgpOwogCiAJCWlmIChiUlRTRW5hYmxlKSB7IC8qIHJ0cyBlbmFibGUgKi8KLQkJCSp0YWlsIHw9ICgoaWVlZXJhdGUycnRscmF0ZShwcml2LT5pZWVlODAyMTEtPmJhc2ljX3JhdGUpKTw8MTkpOyAvKiBSVFMgUkFURSAqLworCQkJLyogUlRTIFJBVEUgKi8KKwkJCSp0YWlsIHw9IChpZWVlcmF0ZTJydGxyYXRlKAorCQkJCXByaXYtPmllZWU4MDIxMS0+YmFzaWNfcmF0ZSkgPDwgMTkpOworCiAJCQkqdGFpbCB8PSAoMTw8MjMpOyAvKiBydHMgZW5hYmxlICovCiAJCQkqKHRhaWwrMSkgfD0gKFJ0c0R1ciYweGZmZmYpOyAvKiBSVFMgRHVyYXRpb24gKi8KIAkJfQogCQkqKHRhaWwrMykgfD0gKChUeERlc2NEdXJhdGlvbiYweGZmZmYpPDwxNik7IC8qIERVUkFUSU9OICovCi0JCS8qICoodGFpbCszKSB8PSAoMHhlNjw8MTYpOyAqLwotCQkqKHRhaWwrNSkgfD0gKDExPDw4KTsgLyogKHByaXYtPnJldHJ5X2RhdGE8PDgpOyAqLyAvKiByZXRyeSBsaW07ICovCisKKwkJKih0YWlsICsgNSkgfD0gKDExIDw8IDgpOyAvKiByZXRyeSBsaW07ICovCiAKIAkJKnRhaWwgPSAqdGFpbCB8ICgocmF0ZSYweGYpIDw8IDI0KTsKIApAQCAtMTkwMSw3ICsxODk4LDggQEAKIAogCQl3bWIoKTsKIAkJaWYgKG93bmJpdF9mbGFnKQotCQkJKnRhaWwgPSAqdGFpbCB8ICgxPDwzMSk7IC8qIGRlc2NyaXB0b3IgcmVhZHkgdG8gYmUgdHhlZCAqLworCQkJLyogZGVzY3JpcHRvciByZWFkeSB0byBiZSB0eGVkICovCisJCQkqdGFpbCB8PSAoMSA8PCAzMSk7CiAKIAkJaWYgKCh0YWlsIC0gYmVnaW4pLzggPT0gY291bnQtMSkKIAkJCXRhaWwgPSBiZWdpbjsKQEAgLTE5ODMsNyArMTk4MSw4IEBACiAKIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAKLQl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzQsIHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUc0KSB8IENPTkZJRzRfUFdSTUdUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzQsCisJCXJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUc0KSB8IENPTkZJRzRfUFdSTUdUKTsKIAlwcml2LT5hY2tfdHhfdG9faWVlZSA9IDE7CiB9CiAKQEAgLTIwMzEsNyArMjAzMCw4IEBACiAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnBzX2xvY2ssIGZsYWdzKTsKLQl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzQsIHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUc0KSAmIH5DT05GSUc0X1BXUk1HVCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUc0LAorCQlyZWFkX25pY19ieXRlKGRldiwgQ09ORklHNCkgJiB+Q09ORklHNF9QV1JNR1QpOwogCWlmIChwcml2LT5yZl93YWtldXApCiAJCXByaXYtPnJmX3dha2V1cChkZXYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnBzX2xvY2ssIGZsYWdzKTsKQEAgLTIwNjMsMTMgKzIwNjMsMTMgQEAKIAl0bCAtPSBNU0VDUyg0KzE2KzcpOwogCiAJLyoKLQkgKiBJZiB0aGUgaW50ZXJ2YWwgaW4gd2l0Y2ggd2UgYXJlIHJlcXVlc3RlZCB0byBzbGVlcCBpcyB0b28KKwkgKiBJZiB0aGUgaW50ZXJ2YWwgaW4gd2hpY2ggd2UgYXJlIHJlcXVlc3RlZCB0byBzbGVlcCBpcyB0b28KIAkgKiBzaG9ydCB0aGVuIGdpdmUgdXAgYW5kIHJlbWFpbiBhd2FrZQogCSAqLwogCWlmICgoKHRsID49IHJiKSAmJiAodGwtcmIpIDw9IE1TRUNTKE1JTl9TTEVFUF9USU1FKSkKIAkJfHwgKChyYiA+IHRsKSAmJiAocmItdGwpIDwgTVNFQ1MoTUlOX1NMRUVQX1RJTUUpKSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5wc19sb2NrLCBmbGFncyk7Ci0JCXByaW50aygidG9vIHNob3J0IHRvIHNsZWVwXG4iKTsKKwkJbmV0ZGV2X3dhcm4oZGV2LCAidG9vIHNob3J0IHRvIHNsZWVwXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjA3OCw3ICsyMDc4LDggQEAKIAogCQlwcml2LT5Eb3plUGVyaW9kSW5QYXN0MlNlYyArPSBqaWZmaWVzX3RvX21zZWNzKHRtcCk7CiAJCS8qIGFzIHRsIG1heSBiZSBsZXNzIHRoYW4gcmIgKi8KLQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsICZwcml2LT5pZWVlODAyMTEtPmh3X3dha2V1cF93cSwgdG1wKTsKKwkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsCisJCQkmcHJpdi0+aWVlZTgwMjExLT5od193YWtldXBfd3EsIHRtcCk7CiAJfQogCS8qCiAJICogSWYgd2Ugc3VzcGVjdCB0aGUgVGltZXJJbnQgaXMgZ29uZSBiZXlvbmQgdGwKQEAgLTIwOTUsMTYgKzIwOTYsNDkgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5wc19sb2NrLCBmbGFncyk7CiB9CiAKK3N0YXRpYyB2b2lkIHJ0bDgxODBfd21tX3NpbmdsZV9wYXJhbV91cGRhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1OCBtb2RlLCBBQ19DT0RJTkcgZUFDSSwgUEFDX1BBUkFNIHBhcmFtKQoreworCXU4IHUxYkFJRlM7CisJdTMyIHU0YkFjUGFyYW07CisKKwkvKiBSZXRyaWV2ZSBwYXJhbWV0ZXJzIHRvIHVwZGF0ZS4gKi8KKwkvKiBNb2RlIEcvQTogc2xvdFRpbWVUaW1lciA9IDk7IE1vZGUgQjogMjAgKi8KKwl1MWJBSUZTID0gcGFyYW0tPmYuQWNpQWlmc24uZi5BSUZTTiAqICgobW9kZSAmIElFRUVfRykgPT0gSUVFRV9HID8KKwkJOSA6IDIwKSArIGFTaWZzVGltZTsKKwl1NGJBY1BhcmFtID0gKCgodTMyKXBhcmFtLT5mLlRYT1BMaW1pdCA8PCBBQ19QQVJBTV9UWE9QX0xJTUlUX09GRlNFVCkgfAorCQkoKHUzMilwYXJhbS0+Zi5FY3cuZi5FQ1dtYXggPDwgQUNfUEFSQU1fRUNXX01BWF9PRkZTRVQpIHwKKwkJKCh1MzIpcGFyYW0tPmYuRWN3LmYuRUNXbWluIDw8IEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUKSB8CisJCSgodTMyKXUxYkFJRlMgPDwgQUNfUEFSQU1fQUlGU19PRkZTRVQpKTsKKworCXN3aXRjaCAoZUFDSSkgeworCWNhc2UgQUMxX0JLOgorCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19CS19QQVJBTSwgdTRiQWNQYXJhbSk7CisJCXJldHVybjsKKwljYXNlIEFDMF9CRToKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfQkVfUEFSQU0sIHU0YkFjUGFyYW0pOworCQlyZXR1cm47CisJY2FzZSBBQzJfVkk6CisJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX1ZJX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJcmV0dXJuOworCWNhc2UgQUMzX1ZPOgorCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19WT19QQVJBTSwgdTRiQWNQYXJhbSk7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlwcl93YXJuKCJTZXRId1JlZzgxODUoKTogaW52YWxpZCBBQ0k6ICVkIVxuIiwgZUFDSSk7CisJCXJldHVybjsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHJ0bDgxODBfd21tX3BhcmFtX3VwZGF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHdtbV9wYXJhbV91cGRhdGVfd3EpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssCisJCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCB3bW1fcGFyYW1fdXBkYXRlX3dxKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OwogCXU4ICphY19wYXJhbSA9ICh1OCAqKShpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX3BhcmFtKTsKIAl1OCBtb2RlID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGU7Ci0JQUNfQ09ESU5HCWVBQ0k7Ci0JQUNfUEFSQU0JQWNQYXJhbTsKLQlQQUNfUEFSQU0JcEFjUGFyYW07Ci0JdTggaTsKKwlBQ19DT0RJTkcgZUFDSTsKKwlBQ19QQVJBTSBBY1BhcmFtOwogCiAJaWYgKCFpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSkgewogCQkvKiBsZWdhY3kgYWNfeHhfcGFyYW0gdXBkYXRlICovCkBAIC0yMTE0LDgzICsyMTQ4LDI2IEBACiAJCUFjUGFyYW0uZi5FY3cuZi5FQ1dtaW4gPSAzOyAvKiBGb2xsb3cgODAyLjExIENXbWluLiAqLwogCQlBY1BhcmFtLmYuRWN3LmYuRUNXbWF4ID0gNzsgLyogRm9sbG93IDgwMi4xMSBDV21heC4gKi8KIAkJQWNQYXJhbS5mLlRYT1BMaW1pdCA9IDA7CisKIAkJZm9yIChlQUNJID0gMDsgZUFDSSA8IEFDX01BWDsgZUFDSSsrKSB7CiAJCQlBY1BhcmFtLmYuQWNpQWlmc24uZi5BQ0kgPSAodTgpZUFDSTsKLQkJCXsKLQkJCQl1OAkJdTFiQUlGUzsKLQkJCQl1MzIJCXU0YkFjUGFyYW07Ci0JCQkJcEFjUGFyYW0gPSAoUEFDX1BBUkFNKSgmQWNQYXJhbSk7Ci0JCQkJLyogUmV0cmlldmUgcGFyYW1ldGVycyB0byB1cGRhdGUuICovCi0JCQkJdTFiQUlGUyA9IHBBY1BhcmFtLT5mLkFjaUFpZnNuLmYuQUlGU04gKiAoKChtb2RlJklFRUVfRykgPT0gSUVFRV9HKSA/IDkgOiAyMCkgKyBhU2lmc1RpbWU7Ci0JCQkJdTRiQWNQYXJhbSA9ICgoKCh1MzIpKHBBY1BhcmFtLT5mLlRYT1BMaW1pdCkpPDxBQ19QQVJBTV9UWE9QX0xJTUlUX09GRlNFVCl8Ci0JCQkJCSAgICAgICgoKHUzMikocEFjUGFyYW0tPmYuRWN3LmYuRUNXbWF4KSk8PEFDX1BBUkFNX0VDV19NQVhfT0ZGU0VUKXwKLQkJCQkJICAgICAgKCgodTMyKShwQWNQYXJhbS0+Zi5FY3cuZi5FQ1dtaW4pKTw8QUNfUEFSQU1fRUNXX01JTl9PRkZTRVQpfAotCQkJCQkgICAgICAgKCgodTMyKXUxYkFJRlMpIDw8IEFDX1BBUkFNX0FJRlNfT0ZGU0VUKSk7Ci0JCQkJc3dpdGNoIChlQUNJKSB7Ci0JCQkJY2FzZSBBQzFfQks6Ci0JCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX0JLX1BBUkFNLCB1NGJBY1BhcmFtKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBQzBfQkU6Ci0JCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX0JFX1BBUkFNLCB1NGJBY1BhcmFtKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBQzJfVkk6Ci0JCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX1ZJX1BBUkFNLCB1NGJBY1BhcmFtKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBQzNfVk86Ci0JCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX1ZPX1BBUkFNLCB1NGJBY1BhcmFtKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcHJfd2FybigiU2V0SHdSZWc4MTg1KCk6aW52YWxpZCBBQ0k6ICVkIVxuIiwKLQkJCQkJCWVBQ0kpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9CisKKwkJCXJ0bDgxODBfd21tX3NpbmdsZV9wYXJhbV91cGRhdGUoZGV2LCBtb2RlLCBlQUNJLAorCQkJCShQQUNfUEFSQU0pJkFjUGFyYW0pOwogCQl9CiAJCXJldHVybjsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgQUNfTUFYOyBpKyspIHsKLQkJLyogQWNQYXJhbS5sb25nRGF0YSA9IDA7ICovCi0JCXBBY1BhcmFtID0gKEFDX1BBUkFNICopYWNfcGFyYW07Ci0JCXsKLQkJCUFDX0NPRElORwllQUNJOwotCQkJdTgJCXUxYkFJRlM7Ci0JCQl1MzIJCXU0YkFjUGFyYW07CisJZm9yIChlQUNJID0gMDsgZUFDSSA8IEFDX01BWDsgZUFDSSsrKSB7CisJCXJ0bDgxODBfd21tX3NpbmdsZV9wYXJhbV91cGRhdGUoZGV2LCBtb2RlLAorCQkJKChQQUNfUEFSQU0pYWNfcGFyYW0pLT5mLkFjaUFpZnNuLmYuQUNJLAorCQkJKFBBQ19QQVJBTSlhY19wYXJhbSk7CiAKLQkJCS8qIFJldHJpZXZlIHBhcmFtZXRlcnMgdG8gdXBkYXRlLiAqLwotCQkJZUFDSSA9IHBBY1BhcmFtLT5mLkFjaUFpZnNuLmYuQUNJOwotCQkJLyogTW9kZSBHL0E6IHNsb3RUaW1lVGltZXIgPSA5OyBNb2RlIEI6IDIwICovCi0JCQl1MWJBSUZTID0gcEFjUGFyYW0tPmYuQWNpQWlmc24uZi5BSUZTTiAqICgoKG1vZGUmSUVFRV9HKSA9PSBJRUVFX0cpID8gOSA6IDIwKSArIGFTaWZzVGltZTsKLQkJCXU0YkFjUGFyYW0gPSAoKCgodTMyKShwQWNQYXJhbS0+Zi5UWE9QTGltaXQpKSA8PCBBQ19QQVJBTV9UWE9QX0xJTUlUX09GRlNFVCkJfAotCQkJCQkoKCh1MzIpKHBBY1BhcmFtLT5mLkVjdy5mLkVDV21heCkpIDw8IEFDX1BBUkFNX0VDV19NQVhfT0ZGU0VUKQl8Ci0JCQkJCSgoKHUzMikocEFjUGFyYW0tPmYuRWN3LmYuRUNXbWluKSkgPDwgQUNfUEFSQU1fRUNXX01JTl9PRkZTRVQpCXwKLQkJCQkJKCgodTMyKXUxYkFJRlMpIDw8IEFDX1BBUkFNX0FJRlNfT0ZGU0VUKSk7Ci0KLQkJCXN3aXRjaCAoZUFDSSkgewotCQkJY2FzZSBBQzFfQks6Ci0JCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfQktfUEFSQU0sIHU0YkFjUGFyYW0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBQzBfQkU6Ci0JCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfQkVfUEFSQU0sIHU0YkFjUGFyYW0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBQzJfVkk6Ci0JCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfVklfUEFSQU0sIHU0YkFjUGFyYW0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBQzNfVk86Ci0JCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfVk9fUEFSQU0sIHU0YkFjUGFyYW0pOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwcl93YXJuKCJTZXRId1JlZzgxODUoKTogaW52YWxpZCBBQ0k6ICVkICFcbiIsCi0JCQkJCWVBQ0kpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFjX3BhcmFtICs9IChzaXplb2YoQUNfUEFSQU0pKTsKKwkJYWNfcGFyYW0gKz0gc2l6ZW9mKEFDX1BBUkFNKTsKIAl9CiB9CiAKIHZvaWQgcnRsODE4MF9yZXN0YXJ0X3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci0vKiB2b2lkIHJ0bDgxODBfcnFfdHhfYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7ICovCiB2b2lkIHJ0bDgxODBfd2F0Y2hfZG9nX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiB2b2lkIHJ0bDgxODBfaHdfd2FrZXVwX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiB2b2lkIHJ0bDgxODBfaHdfc2xlZXBfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKQEAgLTIyMDgsNyArMjE4NSw4IEBACiAKIAkvKiBUeCBIaWdoIFBvd2VyIE1lY2hhbmlzbS4gKi8KIAlpZiAoQ2hlY2tIaWdoUG93ZXIoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSkpCi0JCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwgKHZvaWQgKikmcHJpdi0+aWVlZTgwMjExLT50eF9wd193cSk7CisJCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwKKwkJCSh2b2lkICopJnByaXYtPmllZWU4MDIxMS0+dHhfcHdfd3EpOwogCiAJLyogVHggUG93ZXIgVHJhY2tpbmcgb24gODdTRS4gKi8KIAlpZiAoQ2hlY2tUeFB3clRyYWNraW5nKChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpKQpAQCAtMjIxNiwyNyArMjE5NCw1OSBAQAogCiAJLyogUGVyZm9ybSBESUcgaW1tZWRpYXRlbHkuICovCiAJaWYgKENoZWNrRGlnKChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpKQotCQlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsICh2b2lkICopJnByaXYtPmllZWU4MDIxMS0+aHdfZGlnX3dxKTsKKwkJcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLAorCQkJKHZvaWQgKikmcHJpdi0+aWVlZTgwMjExLT5od19kaWdfd3EpOworCiAJcnRsODE4MF93YXRjaF9kb2coKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSk7CiAKLQlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsICh2b2lkICopJnByaXYtPmllZWU4MDIxMS0+R1BJT0NoYW5nZVJGV29ya0l0ZW0pOworCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwKKwkJKHZvaWQgKikmcHJpdi0+aWVlZTgwMjExLT5HUElPQ2hhbmdlUkZXb3JrSXRlbSk7CiAKLQlwcml2LT53YXRjaF9kb2dfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBNU0VDUyhJRUVFODAyMTFfV0FUQ0hfRE9HX1RJTUUpOworCXByaXYtPndhdGNoX2RvZ190aW1lci5leHBpcmVzID0gamlmZmllcyArCisJCU1TRUNTKElFRUU4MDIxMV9XQVRDSF9ET0dfVElNRSk7CisKIAlhZGRfdGltZXIoJnByaXYtPndhdGNoX2RvZ190aW1lcik7CiB9CiAKLXN0YXRpYyBDSEFOTkVMX0xJU1QgQ2hhbm5lbFBsYW5bXSA9IHsKLQl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwxOX0sCQkvKiBGQ0MgKi8KLQl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExfSwxMX0sCQkJCQkvKiBJQyAqLwotCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIxfSwJLyogRVRTSSAqLwotCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIxfSwJLyogU3BhaW4uIENoYW5nZSB0byBFVFNJLiAqLwotCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIxfSwJLyogRnJhbmNlLiBDaGFuZ2UgdG8gRVRTSS4gKi8KLQl7ezE0LDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSw5fSwJCQkJLyogTUtLICovCi0Je3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwgMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIyfSwvKiBNS0sxICovCi0Je3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjF9LAkvKiBJc3JhZWwuICovCi0Je3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywzNCwzOCw0Miw0Nn0sMTd9LAkJLyogRm9yIDExYSAsIFRFTEVDICovCi0Je3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNH0sMTR9LCAgLyogRm9yIEdsb2JhbCBEb21haW4uIDEtMTE6YWN0aXZlIHNjYW4sIDEyLTE0IHBhc3NpdmUgc2Nhbi4gLy8rWUosIDA4MDYyNiAqLwotCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTN9LDEzfSAvKiB3b3JsZCB3aWRlIDEzOiBjaDF+Y2gxMSBhY3RpdmUgc2NhbiwgY2gxMn4xMyBwYXNzaXZlIC8vbHptIGFkZCAwODA4MjYgKi8KK3N0YXRpYyBzdHJ1Y3QgcnRsODE4N3NlX2NoYW5uZWxfbGlzdCBjaGFubmVsX3BsYW5fbGlzdFtdID0geworCS8qIEZDQyAqLworCXt7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAzNiwgNDAsCisJCTQ0LCA0OCwgNTIsIDU2LCA2MCwgNjR9LCAxOX0sCisKKwkvKiBJQyAqLworCXt7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExfSwgMTF9LAorCisJLyogRVRTSSAqLworCXt7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDM2LCA0MCwKKwkJNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NH0sIDIxfSwKKworCS8qIFNwYWluLiBDaGFuZ2UgdG8gRVRTSS4gKi8KKwl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAzNiwgNDAsCisJCTQ0LCA0OCwgNTIsIDU2LCA2MCwgNjR9LCAyMX0sCisKKwkvKiBGcmFuY2UuIENoYW5nZSB0byBFVFNJLiAqLworCXt7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDM2LCA0MCwKKwkJNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NH0sIDIxfSwKKworCS8qIE1LSyAqLworCXt7MTQsIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NH0sIDl9LAorCisJLyogTUtLMSAqLworCXt7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAzNiwKKwkJNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjR9LCAyMn0sCisKKwkvKiBJc3JhZWwuICovCisJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMzYsIDQwLAorCQk0NCwgNDgsIDUyLCA1NiwgNjAsIDY0fSwgMjF9LAorCisJLyogRm9yIDExYSAsIFRFTEVDICovCisJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMzQsIDM4LCA0MiwgNDZ9LCAxN30sCisKKwkvKiBGb3IgR2xvYmFsIERvbWFpbi4gMS0xMSBhY3RpdmUsIDEyLTE0IHBhc3NpdmUuICovCisJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTR9LCAxNH0sCisKKwkvKiB3b3JsZCB3aWRlIDEzOiBjaDF+Y2gxMSBhY3RpdmUsIGNoMTJ+MTMgcGFzc2l2ZSAqLworCXt7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTN9LCAxM30KIH07CiAKIHN0YXRpYyB2b2lkIHJ0bDgxODBfc2V0X2NoYW5uZWxfbWFwKHU4IGNoYW5uZWxfcGxhbiwKQEAgLTIyNDQsNyArMjI1NCw2IEBACiB7CiAJaW50IGk7CiAKLQkvKiBsem0gYWRkIDA4MDgyNiAqLwogCWllZWUtPk1pblBhc3NpdmVDaG5sTnVtID0gTUFYX0NIQU5ORUxfTlVNQkVSKzE7CiAJaWVlZS0+SWJzc1N0YXJ0Q2hubCA9IDA7CiAKQEAgLTIyNjEsMTMgKzIyNzAsMTMgQEAKIAkJewogCQkJRG90MTFkX0luaXQoaWVlZSk7CiAJCQlpZWVlLT5iR2xvYmFsRG9tYWluID0gZmFsc2U7Ci0JCQlpZiAoQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5MZW4gIT0gMCkgeworCQkJaWYgKGNoYW5uZWxfcGxhbl9saXN0W2NoYW5uZWxfcGxhbl0ubGVuICE9IDApIHsKIAkJCQkvKiBDbGVhciBvbGQgY2hhbm5lbCBtYXAgKi8KIAkJCQltZW1zZXQoR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCwgMCwgc2l6ZW9mKEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXApKTsKIAkJCQkvKiBTZXQgbmV3IGNoYW5uZWwgbWFwICovCi0JCQkJZm9yIChpID0gMDsgaSA8IENoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uTGVuOyBpKyspIHsKLQkJCQkJaWYgKENoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uQ2hhbm5lbFtpXSA8PSAxNCkKLQkJCQkJCUdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXBbQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5DaGFubmVsW2ldXSA9IDE7CisJCQkJZm9yIChpID0gMDsgaSA8IGNoYW5uZWxfcGxhbl9saXN0W2NoYW5uZWxfcGxhbl0ubGVuOyBpKyspIHsKKwkJCQkJaWYgKGNoYW5uZWxfcGxhbl9saXN0W2NoYW5uZWxfcGxhbl0uY2hhbm5lbFtpXSA8PSAxNCkKKwkJCQkJCUdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXBbY2hhbm5lbF9wbGFuX2xpc3RbY2hhbm5lbF9wbGFuXS5jaGFubmVsW2ldXSA9IDE7CiAJCQkJfQogCQkJfQogCQkJYnJlYWs7CkBAIC0yMjc5LDcgKzIyODgsNyBAQAogCQkJaWVlZS0+Ykdsb2JhbERvbWFpbiA9IHRydWU7CiAJCQlicmVhazsKIAkJfQotCWNhc2UgQ09VTlRSWV9DT0RFX1dPUkxEX1dJREVfMTNfSU5ERVg6LyogbHptIGFkZCAwODA4MjYgKi8KKwljYXNlIENPVU5UUllfQ09ERV9XT1JMRF9XSURFXzEzX0lOREVYOgogCQl7CiAJCQlpZWVlLT5NaW5QYXNzaXZlQ2hubE51bSA9IDEyOwogCQkJaWVlZS0+SWJzc1N0YXJ0Q2hubCA9IDEwOwpAQCAtMjI5OSwxOSArMjMwOCwxNyBAQAogCiB2b2lkIEdQSU9DaGFuZ2VSRldvcmtJdGVtQ2FsbEJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAotLyogWUosYWRkLDA4MDgyOCAqLwotc3RhdGljIHZvaWQgcnRsODE4MF9zdGF0aXN0aWNzX2luaXQoc3RydWN0IFN0YXRzICpwc3RhdHMpCitzdGF0aWMgdm9pZCBydGw4MTgwX3N0YXRpc3RpY3NfaW5pdChzdHJ1Y3Qgc3RhdHMgKnBzdGF0cykKIHsKLQltZW1zZXQocHN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IFN0YXRzKSk7CisJbWVtc2V0KHBzdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBzdGF0cykpOwogfQogCi1zdGF0aWMgdm9pZCBydGw4MTgwX2xpbmtfZGV0ZWN0X2luaXQocGxpbmtfZGV0ZWN0X3QgcGxpbmtfZGV0ZWN0KQorc3RhdGljIHZvaWQgcnRsODE4MF9saW5rX2RldGVjdF9pbml0KHN0cnVjdCBsaW5rX2RldGVjdF90ICpwbGlua19kZXRlY3QpCiB7Ci0JbWVtc2V0KHBsaW5rX2RldGVjdCwgMCwgc2l6ZW9mKGxpbmtfZGV0ZWN0X3QpKTsKLQlwbGlua19kZXRlY3QtPlNsb3ROdW0gPSBERUZBVUxUX1NMT1RfTlVNOworCW1lbXNldChwbGlua19kZXRlY3QsIDAsIHNpemVvZihzdHJ1Y3QgbGlua19kZXRlY3RfdCkpOworCXBsaW5rX2RldGVjdC0+c2xvdF9udW0gPSBERUZBVUxUX1NMT1RfTlVNOwogfQogCi0vKiBZSixhZGQsMDgwODI4LGVuZCAqLwogc3RhdGljIHZvaWQgcnRsODE4N3NlX2VlcHJvbV9yZWdpc3Rlcl9yZWFkKHN0cnVjdCBlZXByb21fOTNjeDYgKmVlcHJvbSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZWVwcm9tLT5kYXRhOwpAQCAtMjM2MCw3ICsyMzY3LDcgQEAKIAllZXByb21fOTNjeDZfcmVhZCgmZWVwcm9tLCBFRVBST01fQ09VTlRSWV9DT0RFPj4xLCAmZWVwcm9tX3ZhbCk7CiAJcHJpdi0+Y2hhbm5lbF9wbGFuID0gZWVwcm9tX3ZhbCAmIDB4RkY7CiAJaWYgKHByaXYtPmNoYW5uZWxfcGxhbiA+IENPVU5UUllfQ09ERV9HTE9CQUxfRE9NQUlOKSB7Ci0JCXByaW50aygicnRsODE4MF9pbml0OkVycm9yIGNoYW5uZWwgcGxhbiEgU2V0IHRvIGRlZmF1bHQuXG4iKTsKKwkJbmV0ZGV2X2VycihkZXYsICJydGw4MTgwX2luaXQ6IEludmFsaWQgY2hhbm5lbCBwbGFuISBTZXQgdG8gZGVmYXVsdC5cbiIpOwogCQlwcml2LT5jaGFubmVsX3BsYW4gPSAwOwogCX0KIApAQCAtMjM4NSw3ICsyMzkyLDggQEAKIAlydGw4MTgwX2xpbmtfZGV0ZWN0X2luaXQoJnByaXYtPmxpbmtfZGV0ZWN0KTsKIAogCXByaXYtPmFja190eF90b19pZWVlID0gMDsKLQlwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgPSBERUZBVUxUX0JFQUNPTklOVEVSVkFMOworCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCA9CisJCURFRkFVTFRfQkVBQ09OSU5URVJWQUw7CiAJcHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKIAlwcml2LT5pZWVlODAyMTEtPnNvZnRtYWNfZmVhdHVyZXMgID0gSUVFRV9TT0ZUTUFDX1NDQU4gfAogCQlJRUVFX1NPRlRNQUNfQVNTT0NJQVRFIHwgSUVFRV9TT0ZUTUFDX1BST0JFUlEgfApAQCAtMjQxMCwxMiArMjQxOCwxMiBAQAogCXByaXYtPmJJbmFjdGl2ZVBzID0gdHJ1ZTsgLyogZmFsc2U7ICovCiAJcHJpdi0+aWVlZTgwMjExLT5iSW5hY3RpdmVQcyA9IHByaXYtPmJJbmFjdGl2ZVBzOwogCXByaXYtPmJTd1JmUHJvY2Vzc2luZyA9IGZhbHNlOwotCXByaXYtPmVSRlBvd2VyU3RhdGUgPSBlUmZPZmY7CisJcHJpdi0+ZVJGUG93ZXJTdGF0ZSA9IFJGX09GRjsKIAlwcml2LT5SZk9mZlJlYXNvbiA9IDA7Ci0JcHJpdi0+TGVkU3RyYXRlZ3kgPSBTV19MRURfTU9ERTA7Ci0JcHJpdi0+VHhQb2xsaW5nVGltZXMgPSAwOyAvKiBsem0gYWRkIDA4MDgyNiAqLworCXByaXYtPmxlZF9zdHJhdGVneSA9IFNXX0xFRF9NT0RFMDsKKwlwcml2LT5UeFBvbGxpbmdUaW1lcyA9IDA7CiAJcHJpdi0+YkxlaXN1cmVQcyA9IHRydWU7Ci0JcHJpdi0+ZG90MTFQb3dlclNhdmVNb2RlID0gZUFjdGl2ZTsKKwlwcml2LT5kb3QxMVBvd2VyU2F2ZU1vZGUgPSBBQ1RJVkU7CiAJcHJpdi0+QWRNaW5DaGVja1BlcmlvZCA9IDU7CiAJcHJpdi0+QWRNYXhDaGVja1BlcmlvZCA9IDEwOwogCXByaXYtPkFkTWF4UnhTc1RocmVzaG9sZCA9IDMwOwkvKiA2MC0+MzAgKi8KQEAgLTI0MzEsNyArMjQzOSw4IEBACiAJcHJpdi0+QWRSeFNzQmVmb3JlU3dpdGNoZWQgPSAwOwogCWluaXRfdGltZXIoJnByaXYtPlN3QW50ZW5uYURpdmVyc2l0eVRpbWVyKTsKIAlwcml2LT5Td0FudGVubmFEaXZlcnNpdHlUaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OwotCXByaXYtPlN3QW50ZW5uYURpdmVyc2l0eVRpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKilTd0FudGVubmFEaXZlcnNpdHlUaW1lckNhbGxiYWNrOworCXByaXYtPlN3QW50ZW5uYURpdmVyc2l0eVRpbWVyLmZ1bmN0aW9uID0KKwkJKHZvaWQgKilTd0FudGVubmFEaXZlcnNpdHlUaW1lckNhbGxiYWNrOwogCXByaXYtPmJEaWdNZWNoYW5pc20gPSB0cnVlOwogCXByaXYtPkluaXRpYWxHYWluID0gNjsKIAlwcml2LT5iWHRhbENhbGlicmF0aW9uID0gZmFsc2U7CkBAIC0yNDQwLDcgKzI0NDksOCBAQAogCXByaXYtPmJUeFBvd2VyVHJhY2sgPSBmYWxzZTsKIAlwcml2LT5UaGVybWFsTWV0ZXIgPSAwOwogCXByaXYtPkZhbHNlQWxhcm1SZWdWYWx1ZSA9IDA7Ci0JcHJpdi0+UmVnRGlnT2ZkbUZhVXBUaCA9IDB4YzsgLyogVXBwZXIgdGhyZXNob2xkIG9mIE9GRE0gZmFsc2UgYWxhcm0sIHdoaWNoIGlzIHVzZWQgaW4gRElHLiAqLworCXByaXYtPlJlZ0RpZ09mZG1GYVVwVGggPSAweGM7IC8qIFVwcGVyIHRocmVzaG9sZCBvZiBPRkRNIGZhbHNlIGFsYXJtLAorCQkJCQl3aGljaCBpcyB1c2VkIGluIERJRy4gKi8KIAlwcml2LT5ESUdfTnVtYmVyRmFsbGJhY2tWb3RlID0gMDsKIAlwcml2LT5ESUdfTnVtYmVyVXBncmFkZVZvdGUgPSAwOwogCXByaXYtPkxhc3RTaWduYWxTdHJlbmd0aEluUGVyY2VudCA9IDA7CkBAIC0yNTg1LDcgKzI1OTUsOCBAQAogCQlwcml2LT5iU3dBbnRlbm5hRGl2ZXJpdHkgPSBwcml2LT5FRVBST01Td0FudGVubmFEaXZlcnNpdHk7CiAJZWxzZQogCQkvKiAxOmRpc2FibGUgYW50ZW5uYSBkaXZlcnNpdHksIDI6IGVuYWJsZSBhbnRlbm5hIGRpdmVyc2l0eS4gKi8KLQkJcHJpdi0+YlN3QW50ZW5uYURpdmVyaXR5ID0gcHJpdi0+UmVnU3dBbnRlbm5hRGl2ZXJzaXR5TWVjaGFuaXNtID09IDI7CisJCXByaXYtPmJTd0FudGVubmFEaXZlcml0eSA9CisJCQlwcml2LT5SZWdTd0FudGVubmFEaXZlcnNpdHlNZWNoYW5pc20gPT0gMjsKIAogCWlmIChwcml2LT5SZWdEZWZhdWx0QW50ZW5uYSA9PSAwKQogCQkvKiAwOiBkZWZhdWx0IGZyb20gRUVQUk9NLiAqLwpAQCAtMjY2OSw3ICsyNjgwLDggQEAKIAkJCQkgIFRYX0JFQUNPTl9SSU5HX0FERFIpKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgcnRsODE4MF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBkZXYtPm5hbWUsIGRldikpIHsKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIHJ0bDgxODBfaW50ZXJydXB0LAorCQlJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBkZXYpKSB7CiAJCURNRVNHRSgiRXJyb3IgYWxsb2NhdGluZyBJUlEgJWQiLCBkZXYtPmlycSk7CiAJCXJldHVybiAtMTsKIAl9IGVsc2UgewpAQCAtMjcxOCw4ICsyNzMwLDYgQEAKIAogdm9pZCBydGw4MTg1X3JmX3BpbnNfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JLyogdTE2IHRtcDsgKi8KLQkvKiB0bXAgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlKTsgKi8KIAl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSwgMHgxZmZmKTsgLyogfCB0bXApOyAqLwogfQogCkBAIC0yNzY4LDE2ICsyNzc4LDExIEBACiAKIAlwaHl3ID0gKChkYXRhPDw4KSB8IGFkcik7CiAKLQkvKiBOb3RlIHRoYXQsIHdlIG11c3Qgd3JpdGUgMHhmZjdjIGFmdGVyIDB4N2QtMHg3ZiB0byB3cml0ZSBCQiByZWdpc3Rlci4gKi8KKwkvKiBOb3RlOiB3ZSBtdXN0IHdyaXRlIDB4ZmY3YyBhZnRlciAweDdkLTB4N2YgdG8gd3JpdGUgQkIgcmVnaXN0ZXIuICovCiAJd3JpdGVfbmljX2J5dGUoZGV2LCAweDdmLCAoKHBoeXcgJiAweGZmMDAwMDAwKSA+PiAyNCkpOwogCXdyaXRlX25pY19ieXRlKGRldiwgMHg3ZSwgKChwaHl3ICYgMHgwMGZmMDAwMCkgPj4gMTYpKTsKIAl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4N2QsICgocGh5dyAmIDB4MDAwMGZmMDApID4+IDgpKTsKIAl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4N2MsICgocGh5dyAmIDB4MDAwMDAwZmYpKSk7Ci0KLQkvKiB0aGlzIGlzIG9rIHRvIGZhaWwgd2hlbiB3ZSB3cml0ZSBBR0MgdGFibGUuIGNoZWNrIGZvciBBR0MgdGFibGUgbWlnaHQgYmUKLQkgKiBkb25lIGJ5IG1hc2tpbmcgd2l0aCAweDdmIGluc3RlYWQgb2YgMHhmZgotCSAqLwotCS8qIGlmIChwaHlyICE9IChkYXRhJjB4ZmYpKSBETUVTR1coIlBoeSB3cml0ZSB0aW1lb3V0ICV4ICV4ICV4IiwgcGh5ciwgZGF0YSwgYWRyKTsgKi8KIH0KIAogaW5saW5lIHZvaWQgd3JpdGVfcGh5X29mZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MzIgZGF0YSkKQEAgLTI4MTIsOSArMjgxNyw5IEBACiAJd29yZCAgPSByZWFkX25pY193b3JkKGRldiwgQmludHJJdHYpOwogCXdvcmQgJj0gfkJpbnRySXR2X0JpbnRySXR2OwogCXdvcmQgfD0gMTAwMDsgLyogcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsICoKLQkJKChwcml2LT50eGJlYWNvbmNvdW50ID4gMSk/KHByaXYtPnR4YmVhY29uY291bnQtMSk6MSk7Ci0JLy8gRklYTUU6IGNoZWNrIGlmIGNvcnJlY3QgXl4gd29ya2VkIHdpdGggMHgzZTg7Ci0JKi8KKwkJICAgICAgICogKChwcml2LT50eGJlYWNvbmNvdW50ID4gMSk/KHByaXYtPnR4YmVhY29uY291bnQtMSk6MSk7CisJCSAgICAgICAqIEZJWE1FOiBjaGVjayBpZiBjb3JyZWN0IF5eIHdvcmtlZCB3aXRoIDB4M2U4OworCQkgICAgICAgKi8KIAl3cml0ZV9uaWNfd29yZChkZXYsIEJpbnRySXR2LCB3b3JkKTsKIAogCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfTk9STUFMKTsKQEAgLTI4MzMsNyArMjgzOCw3IEBACiAgKiBDaGFuZ2UgY3VycmVudCBhbmQgZGVmYXVsdCBwcmVhbWJsZSBtb2RlLgogICovCiBzdGF0aWMgYm9vbCBNZ250QWN0U2V0XzgwMl8xMV9Qb3dlclNhdmVNb2RlKHN0cnVjdCByODE4MF9wcml2ICpwcml2LAotCQkJCSAgICAgUlRfUFNfTU9ERSBydFBzTW9kZSkKKwkJCQkgICAgIGVudW0gcnRfcHNfbW9kZSBydFBzTW9kZSkKIHsKIAkvKiBDdXJyZW50bHksIHdlIGRvIG5vdCBjaGFuZ2UgcG93ZXIgc2F2ZSBtb2RlIG9uIElCU1MgbW9kZS4gKi8KIAlpZiAocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCkBAIC0yODQ2LDI1ICsyODUxLDI2IEBACiAKIHN0YXRpYyB2b2lkIExlaXN1cmVQU0VudGVyKHN0cnVjdCByODE4MF9wcml2ICpwcml2KQogewotCWlmIChwcml2LT5iTGVpc3VyZVBzKSB7CisJaWYgKHByaXYtPmJMZWlzdXJlUHMpCiAJCWlmIChwcml2LT5pZWVlODAyMTEtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCkKIAkJCS8qIElFRUU4MDIxMV9QU19FTkFCTEUgKi8KLQkJCU1nbnRBY3RTZXRfODAyXzExX1Bvd2VyU2F2ZU1vZGUocHJpdiwgSUVFRTgwMjExX1BTX01CQ0FTVHxJRUVFODAyMTFfUFNfVU5JQ0FTVCk7Ci0JfQorCQkJTWdudEFjdFNldF84MDJfMTFfUG93ZXJTYXZlTW9kZShwcml2LAorCQkJCUlFRUU4MDIxMV9QU19NQkNBU1QgfCBJRUVFODAyMTFfUFNfVU5JQ0FTVCk7CiB9CiAKIHN0YXRpYyB2b2lkIExlaXN1cmVQU0xlYXZlKHN0cnVjdCByODE4MF9wcml2ICpwcml2KQogewotCWlmIChwcml2LT5iTGVpc3VyZVBzKSB7CisJaWYgKHByaXYtPmJMZWlzdXJlUHMpCiAJCWlmIChwcml2LT5pZWVlODAyMTEtPnBzICE9IElFRUU4MDIxMV9QU19ESVNBQkxFRCkKLQkJCU1nbnRBY3RTZXRfODAyXzExX1Bvd2VyU2F2ZU1vZGUocHJpdiwgSUVFRTgwMjExX1BTX0RJU0FCTEVEKTsKLQl9CisJCQlNZ250QWN0U2V0XzgwMl8xMV9Qb3dlclNhdmVNb2RlKAorCQkJCXByaXYsIElFRUU4MDIxMV9QU19ESVNBQkxFRCk7CiB9CiAKIHZvaWQgcnRsODE4MF9od193YWtldXBfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOwotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgaHdfd2FrZXVwX3dxKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZigKKwkJZHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBod193YWtldXBfd3EpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CiAKIAlydGw4MTgwX2h3X3dha2V1cChkZXYpOwpAQCAtMjg3Myw3ICsyODc5LDggQEAKIHZvaWQgcnRsODE4MF9od19zbGVlcF93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7Ci0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBod19zbGVlcF93cSk7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoCisJCWR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgaHdfc2xlZXBfd3EpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CiAKIAlydGw4MTgwX2h3X3NsZWVwX2Rvd24oZGV2KTsKQEAgLTI4OTAsMjMgKzI4OTcsMzAgQEAKIAkJICovCiAKIAkJaWYgKChwcml2LT5rZWVwQWxpdmVMZXZlbCA9PSAyKSB8fAotCQkJKHByaXYtPmxpbmtfZGV0ZWN0Lkxhc3ROdW1UeFVuaWNhc3QgPT0gcHJpdi0+TnVtVHhVbmljYXN0ICYmCi0JCQlwcml2LT5saW5rX2RldGVjdC5MYXN0TnVtUnhVbmljYXN0ID09IHByaXYtPmllZWU4MDIxMS0+TnVtUnhVbmljYXN0KQorCQkJKHByaXYtPmxpbmtfZGV0ZWN0Lmxhc3RfbnVtX3R4X3VuaWNhc3QgPT0KKwkJCQlwcml2LT5OdW1UeFVuaWNhc3QgJiYKKwkJCXByaXYtPmxpbmtfZGV0ZWN0Lmxhc3RfbnVtX3J4X3VuaWNhc3QgPT0KKwkJCQlwcml2LT5pZWVlODAyMTEtPk51bVJ4VW5pY2FzdCkKIAkJCSkgewotCQkJcHJpdi0+bGlua19kZXRlY3QuSWRsZUNvdW50Kys7CisJCQlwcml2LT5saW5rX2RldGVjdC5pZGxlX2NvdW50Kys7CiAKIAkJCS8qCi0JCQkgKiBTZW5kIGEgS2VlcC1BbGl2ZSBwYWNrZXQgcGFja2V0IHRvIEFQIGlmIHdlIGhhZCBiZWVuIGlkbGUgZm9yIGEgd2hpbGUuCisJCQkgKiBTZW5kIGEgS2VlcC1BbGl2ZSBwYWNrZXQgcGFja2V0IHRvIEFQIGlmIHdlIGhhZAorCQkJICogYmVlbiBpZGxlIGZvciBhIHdoaWxlLgogCQkJICovCi0JCQlpZiAocHJpdi0+bGlua19kZXRlY3QuSWRsZUNvdW50ID49ICgoS0VFUF9BTElWRV9JTlRFUlZBTCAvIENIRUNLX0ZPUl9IQU5HX1BFUklPRCktMSkpIHsKLQkJCQlwcml2LT5saW5rX2RldGVjdC5JZGxlQ291bnQgPSAwOwotCQkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKHByaXYtPmllZWU4MDIxMSwgZmFsc2UpOworCQkJaWYgKHByaXYtPmxpbmtfZGV0ZWN0LmlkbGVfY291bnQgPj0KKwkJCQlLRUVQX0FMSVZFX0lOVEVSVkFMIC8KKwkJCQlDSEVDS19GT1JfSEFOR19QRVJJT0QgLSAxKSB7CisJCQkJcHJpdi0+bGlua19kZXRlY3QuaWRsZV9jb3VudCA9IDA7CisJCQkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoCisJCQkJCXByaXYtPmllZWU4MDIxMSwgZmFsc2UpOwogCQkJfQogCQl9IGVsc2UgewotCQkJcHJpdi0+bGlua19kZXRlY3QuSWRsZUNvdW50ID0gMDsKKwkJCXByaXYtPmxpbmtfZGV0ZWN0LmlkbGVfY291bnQgPSAwOwogCQl9Ci0JCXByaXYtPmxpbmtfZGV0ZWN0Lkxhc3ROdW1UeFVuaWNhc3QgPSBwcml2LT5OdW1UeFVuaWNhc3Q7Ci0JCXByaXYtPmxpbmtfZGV0ZWN0Lkxhc3ROdW1SeFVuaWNhc3QgPSBwcml2LT5pZWVlODAyMTEtPk51bVJ4VW5pY2FzdDsKKwkJcHJpdi0+bGlua19kZXRlY3QubGFzdF9udW1fdHhfdW5pY2FzdCA9IHByaXYtPk51bVR4VW5pY2FzdDsKKwkJcHJpdi0+bGlua19kZXRlY3QubGFzdF9udW1fcnhfdW5pY2FzdCA9CisJCQlwcml2LT5pZWVlODAyMTEtPk51bVJ4VW5pY2FzdDsKIAl9CiB9CiAKQEAgLTI5MjIsMzYgKzI5MzYsNDIgQEAKIAkJaWYgKChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgIT0gSVdfTU9ERV9BREhPQykgJiYKIAkJICAgIChwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspICYmCiAJCSAgICAocHJpdi0+aWVlZTgwMjExLT5iZWlucmV0cnkgPT0gZmFsc2UpICYmCi0JCSAgICAocHJpdi0+ZVJGUG93ZXJTdGF0ZSA9PSBlUmZPbikpCisJCSAgICAocHJpdi0+ZVJGUG93ZXJTdGF0ZSA9PSBSRl9PTikpCiAJCQlJUFNFbnRlcihkZXYpOwogCX0KLQkvKiBZSixhZGQsMDgwODI4LGZvciBsaW5rIHN0YXRlIGNoZWNrICovCi0JaWYgKChwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpICYmIChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkpIHsKLQkJU2xvdEluZGV4ID0gKHByaXYtPmxpbmtfZGV0ZWN0LlNsb3RJbmRleCsrKSAlIHByaXYtPmxpbmtfZGV0ZWN0LlNsb3ROdW07Ci0JCXByaXYtPmxpbmtfZGV0ZWN0LlJ4RnJhbWVOdW1bU2xvdEluZGV4XSA9IHByaXYtPmllZWU4MDIxMS0+TnVtUnhEYXRhSW5QZXJpb2QgKyBwcml2LT5pZWVlODAyMTEtPk51bVJ4QmNuSW5QZXJpb2Q7Ci0JCWZvciAoaSA9IDA7IGkgPCBwcml2LT5saW5rX2RldGVjdC5TbG90TnVtOyBpKyspCi0JCQlUb3RhbFJ4TnVtICs9IHByaXYtPmxpbmtfZGV0ZWN0LlJ4RnJhbWVOdW1baV07CisJaWYgKChwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpICYmCisJCShwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkpIHsKKwkJU2xvdEluZGV4ID0gKHByaXYtPmxpbmtfZGV0ZWN0LnNsb3RfaW5kZXgrKykgJQorCQkJcHJpdi0+bGlua19kZXRlY3Quc2xvdF9udW07CisKKwkJcHJpdi0+bGlua19kZXRlY3QucnhfZnJhbWVfbnVtW1Nsb3RJbmRleF0gPQorCQkJcHJpdi0+aWVlZTgwMjExLT5OdW1SeERhdGFJblBlcmlvZCArCisJCQlwcml2LT5pZWVlODAyMTEtPk51bVJ4QmNuSW5QZXJpb2Q7CisKKwkJZm9yIChpID0gMDsgaSA8IHByaXYtPmxpbmtfZGV0ZWN0LnNsb3RfbnVtOyBpKyspCisJCQlUb3RhbFJ4TnVtICs9IHByaXYtPmxpbmtfZGV0ZWN0LnJ4X2ZyYW1lX251bVtpXTsKIAogCQlpZiAoVG90YWxSeE51bSA9PSAwKSB7CiAJCQlwcml2LT5pZWVlODAyMTEtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HOwotCQkJcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCAmcHJpdi0+aWVlZTgwMjExLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKKwkJCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwKKwkJCQkmcHJpdi0+aWVlZTgwMjExLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKIAkJfQogCX0KIAotCS8qIFlKLGFkZCwwODA4MjgsZm9yIEtlZXBBbGl2ZSAqLwogCU1nbnRMaW5rS2VlcEFsaXZlKHByaXYpOwogCi0JLyogWUosYWRkLDA4MDgyOCxmb3IgTFBTICovCiAJTGVpc3VyZVBTTGVhdmUocHJpdik7CiAKIAlpZiAocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSB7Ci0JCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVJ4T2tJblBlcmlvZCA9IHByaXYtPmllZWU4MDIxMS0+TnVtUnhEYXRhSW5QZXJpb2Q7Ci0JCWlmIChwcml2LT5saW5rX2RldGVjdC5OdW1SeE9rSW5QZXJpb2QgPiA2NjYgfHwKLQkJCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCA+IDY2NikgeworCQlwcml2LT5saW5rX2RldGVjdC5udW1fcnhfb2tfaW5fcGVyaW9kID0KKwkJCXByaXYtPmllZWU4MDIxMS0+TnVtUnhEYXRhSW5QZXJpb2Q7CisJCWlmIChwcml2LT5saW5rX2RldGVjdC5udW1fcnhfb2tfaW5fcGVyaW9kID4gNjY2IHx8CisJCQlwcml2LT5saW5rX2RldGVjdC5udW1fdHhfb2tfaW5fcGVyaW9kID4gNjY2KSB7CiAJCQliQnVzeVRyYWZmaWMgPSB0cnVlOwogCQl9Ci0JCWlmICgoKHByaXYtPmxpbmtfZGV0ZWN0Lk51bVJ4T2tJblBlcmlvZCArIHByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCkgPiA4KQotCQkJfHwgKHByaXYtPmxpbmtfZGV0ZWN0Lk51bVJ4T2tJblBlcmlvZCA+IDIpKSB7CisJCWlmICgocHJpdi0+bGlua19kZXRlY3QubnVtX3J4X29rX2luX3BlcmlvZCArCisJCQlwcml2LT5saW5rX2RldGVjdC5udW1fdHhfb2tfaW5fcGVyaW9kID4gOCkKKwkJCXx8IChwcml2LT5saW5rX2RldGVjdC5udW1fcnhfb2tfaW5fcGVyaW9kID4gMikpIHsKIAkJCWJFbnRlclBTID0gZmFsc2U7CiAJCX0gZWxzZQogCQkJYkVudGVyUFMgPSB0cnVlOwpAQCAtMjk2Miw5ICsyOTgyLDkgQEAKIAkJCUxlaXN1cmVQU0xlYXZlKHByaXYpOwogCX0gZWxzZQogCQlMZWlzdXJlUFNMZWF2ZShwcml2KTsKLQlwcml2LT5saW5rX2RldGVjdC5iQnVzeVRyYWZmaWMgPSBiQnVzeVRyYWZmaWM7Ci0JcHJpdi0+bGlua19kZXRlY3QuTnVtUnhPa0luUGVyaW9kID0gMDsKLQlwcml2LT5saW5rX2RldGVjdC5OdW1UeE9rSW5QZXJpb2QgPSAwOworCXByaXYtPmxpbmtfZGV0ZWN0LmJfYnVzeV90cmFmZmljID0gYkJ1c3lUcmFmZmljOworCXByaXYtPmxpbmtfZGV0ZWN0Lm51bV9yeF9va19pbl9wZXJpb2QgPSAwOworCXByaXYtPmxpbmtfZGV0ZWN0Lm51bV90eF9va19pbl9wZXJpb2QgPSAwOwogCXByaXYtPmllZWU4MDIxMS0+TnVtUnhEYXRhSW5QZXJpb2QgPSAwOwogCXByaXYtPmllZWU4MDIxMS0+TnVtUnhCY25JblBlcmlvZCA9IDA7CiB9CkBAIC0zMDQ3LDE1ICszMDY3LDE3IEBACiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT5od19kaWdfd3EpOwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+dHhfcHdfd3EpOwogCWRlbF90aW1lcl9zeW5jKCZwcml2LT5Td0FudGVubmFEaXZlcnNpdHlUaW1lcik7Ci0JU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1KGRldiwgZVJmT2ZmKTsKLQltZW1zZXQoJihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yayksIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspKTsKKwlTZXRaZWJyYVJGUG93ZXJTdGF0ZTgxODUoZGV2LCBSRl9PRkYpOworCW1lbXNldCgmcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmssCisJCTAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspKTsKIAlwcml2LT5pZWVlODAyMTEtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKIAlyZXR1cm4gMDsKIH0KIAogdm9pZCBydGw4MTgwX3Jlc3RhcnRfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByODE4MF9wcml2LCByZXNldF93cSk7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoCisJCXdvcmssIHN0cnVjdCByODE4MF9wcml2LCByZXNldF93cSk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPmRldjsKIAogCWRvd24oJnByaXYtPnd4X3NlbSk7CkBAIC0zMTE2LDcgKzMxMzgsOCBAQAogCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7CiAKIAlpZiAocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKQotCQltZW1jcHkocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLAorCQkJZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCiAJaWYgKHByaXYtPnVwKSB7CiAJCXJ0bDgxODBfZG93bihkZXYpOwpAQCAtMzEzNyw3ICszMTYwLDggQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBSVExfSU9DVExfV1BBX1NVUFBMSUNBTlQ6Ci0JCXJldCA9IGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bChwcml2LT5pZWVlODAyMTEsICZ3cnEtPnUuZGF0YSk7CisJCXJldCA9IGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bCgKKwkJCXByaXYtPmllZWU4MDIxMSwgJndycS0+dS5kYXRhKTsKIAkJcmV0dXJuIHJldDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC0zMzg3LDcgKzM0MTEsNyBAQAogCWludCBqLCBpOwogCWludCBoZDsKIAlpZiAoZXJyb3IpCi0JCXByaXYtPnN0YXRzLnR4cmV0cnkrKzsgLyogdG9ueSAyMDA2MDYwMSAqLworCQlwcml2LT5zdGF0cy50eHJldHJ5Kys7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssIGZsYWcpOwogCXN3aXRjaCAocHJpKSB7CiAJY2FzZSBNQU5BR0VfUFJJT1JJVFk6CkBAIC0zNTQwLDcgKzM1NjQsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5pcnFfdGhfbG9jaywgZmxhZ3MpOwogCiAJLyogSVNSOiA0Ynl0ZXMgKi8KLQlpbnRhID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBJU1IpOyAvKiAmIHByaXYtPkludHJNYXNrOyAqLworCWludGEgPSByZWFkX25pY19kd29yZChkZXYsIElTUik7CiAJd3JpdGVfbmljX2R3b3JkKGRldiwgSVNSLCBpbnRhKTsgLyogcmVzZXQgaW50IHNpdHVhdGlvbiAqLwogCiAJcHJpdi0+c3RhdHMuc2hpbnRzKys7CkBAIC0zNTg2LDcgKzM2MTAsNyBAQAogCX0KIAogCWlmIChpbnRhICYgSVNSX1RIUERPSykgeyAvKiBIaWdoIHByaW9yaXR5IHR4IG9rICovCi0JCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCsrOyAvKiBZSixhZGQsMDgwODI4ICovCisJCXByaXYtPmxpbmtfZGV0ZWN0Lm51bV90eF9va19pbl9wZXJpb2QrKzsKIAkJcHJpdi0+c3RhdHMudHhocG9raW50Kys7CiAJCXJ0bDgxODBfdHhfaXNyKGRldiwgSElfUFJJT1JJVFksIDApOwogCX0KQEAgLTM2NDksMTQgKzM2NzMsMTQgQEAKIAkJcHJpdi0+c3RhdHMudHhvdmVyZmxvdysrOwogCiAJaWYgKGludGEgJiBJU1JfVE5QRE9LKSB7IC8qIE5vcm1hbCBwcmlvcml0eSB0eCBvayAqLwotCQlwcml2LT5saW5rX2RldGVjdC5OdW1UeE9rSW5QZXJpb2QrKzsgLyogWUosYWRkLDA4MDgyOCAqLworCQlwcml2LT5saW5rX2RldGVjdC5udW1fdHhfb2tfaW5fcGVyaW9kKys7CiAJCXByaXYtPnN0YXRzLnR4bnBva2ludCsrOwogCQlydGw4MTgwX3R4X2lzcihkZXYsIE5PUk1fUFJJT1JJVFksIDApOwogCQlydGw4MTgwX3RyeV93YWtlX3F1ZXVlKGRldiwgTk9STV9QUklPUklUWSk7CiAJfQogCiAJaWYgKGludGEgJiBJU1JfVExQRE9LKSB7IC8qIExvdyBwcmlvcml0eSB0eCBvayAqLwotCQlwcml2LT5saW5rX2RldGVjdC5OdW1UeE9rSW5QZXJpb2QrKzsgLyogWUosYWRkLDA4MDgyOCAqLworCQlwcml2LT5saW5rX2RldGVjdC5udW1fdHhfb2tfaW5fcGVyaW9kKys7CiAJCXByaXYtPnN0YXRzLnR4bHBva2ludCsrOwogCQlydGw4MTgwX3R4X2lzcihkZXYsIExPV19QUklPUklUWSwgMCk7CiAJCXJ0bDgxODBfdHJ5X3dha2VfcXVldWUoZGV2LCBMT1dfUFJJT1JJVFkpOwpAQCAtMzY2NCwxNCArMzY4OCwxNCBAQAogCiAJaWYgKGludGEgJiBJU1JfVEJLRE9LKSB7IC8qIGNvcnJlc3BvbmRpbmcgdG8gQktfUFJJT1JJVFkgKi8KIAkJcHJpdi0+c3RhdHMudHhia3Bva2ludCsrOwotCQlwcml2LT5saW5rX2RldGVjdC5OdW1UeE9rSW5QZXJpb2QrKzsgLyogWUosYWRkLDA4MDgyOCAqLworCQlwcml2LT5saW5rX2RldGVjdC5udW1fdHhfb2tfaW5fcGVyaW9kKys7CiAJCXJ0bDgxODBfdHhfaXNyKGRldiwgQktfUFJJT1JJVFksIDApOwogCQlydGw4MTgwX3RyeV93YWtlX3F1ZXVlKGRldiwgQkVfUFJJT1JJVFkpOwogCX0KIAogCWlmIChpbnRhICYgSVNSX1RCRURPSykgeyAvKiBjb3JyZXNwb25kaW5nIHRvIEJFX1BSSU9SSVRZICovCiAJCXByaXYtPnN0YXRzLnR4YmVwZXJyKys7Ci0JCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCsrOyAvKiBZSixhZGQsMDgwODI4ICovCisJCXByaXYtPmxpbmtfZGV0ZWN0Lm51bV90eF9va19pbl9wZXJpb2QrKzsKIAkJcnRsODE4MF90eF9pc3IoZGV2LCBCRV9QUklPUklUWSwgMCk7CiAJCXJ0bDgxODBfdHJ5X3dha2VfcXVldWUoZGV2LCBCRV9QUklPUklUWSk7CiAJfQpAQCAtMzY4OCwxNyArMzcxMiwxOSBAQAogCiB2b2lkIEdQSU9DaGFuZ2VSRldvcmtJdGVtQ2FsbEJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBHUElPQ2hhbmdlUkZXb3JrSXRlbS53b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZigKKwkJd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIEdQSU9DaGFuZ2VSRldvcmtJdGVtLndvcmspOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CiAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXU4IGJ0UFNSOwogCXU4IGJ0Q29uZmlnMDsKLQlSVF9SRl9QT1dFUl9TVEFURQllUmZQb3dlclN0YXRlVG9TZXQ7CisJZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBlUmZQb3dlclN0YXRlVG9TZXQ7CiAJYm9vbCBiQWN0dWFsbHlTZXQgPSBmYWxzZTsKIAogCWNoYXIgKmFyZ3ZbM107CiAJc3RhdGljIGNoYXIgKlJhZGlvUG93ZXJQYXRoID0gIi9ldGMvYWNwaS9ldmVudHMvUmFkaW9Qb3dlci5zaCI7Ci0Jc3RhdGljIGNoYXIgKmVudnBbXSA9IHsiSE9NRT0vIiwgIlRFUk09bGludXgiLCAiUEFUSD0vdXNyL2JpbjovYmluIiwgTlVMTH07CisJc3RhdGljIGNoYXIgKmVudnBbXSA9IHsiSE9NRT0vIiwgIlRFUk09bGludXgiLAorCQkiUEFUSD0vdXNyL2JpbjovYmluIiwgTlVMTH07CiAJc3RhdGljIGludCByZWFkZl9jb3VudDsKIAogCXJlYWRmX2NvdW50ID0gKHJlYWRmX2NvdW50KzEpJTB4ZmZmZjsKQEAgLTM3MDgsMjQgKzM3MzQsMjQgQEAKIAlidFBTUiA9IHJlYWRfbmljX2J5dGUoZGV2LCBQU1IpOwogCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAoYnRQU1IgJiB+QklUMykpOwogCi0JLyogSXQgbmVlZCB0byBkZWxheSA0dXMgc3VnZ2VzdGVkIGJ5IEpvbmcsIDIwMDgtMDEtMTYgKi8KKwkvKiBJdCBuZWVkIHRvIGRlbGF5IDR1cyBzdWdnZXN0ZWQgKi8KIAl1ZGVsYXkoNCk7CiAKIAkvKiBIVyByYWRpbyBPbi9PZmYgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiBGRjUxWzRdKGNvbmZpZzApICovCiAJYnRDb25maWcwID0gYnRQU1IgPSByZWFkX25pY19ieXRlKGRldiwgQ09ORklHMCk7CiAKLQllUmZQb3dlclN0YXRlVG9TZXQgPSAoYnRDb25maWcwICYgQklUNCkgPyAgZVJmT24gOiBlUmZPZmY7CisJZVJmUG93ZXJTdGF0ZVRvU2V0ID0gKGJ0Q29uZmlnMCAmIEJJVDQpID8gIFJGX09OIDogUkZfT0ZGOwogCiAJLyogVHVybiBMRUQgYmFjayBvbiB3aGVuIHJhZGlvIGVuYWJsZWQgKi8KLQlpZiAoZVJmUG93ZXJTdGF0ZVRvU2V0ID09IGVSZk9uKQorCWlmIChlUmZQb3dlclN0YXRlVG9TZXQgPT0gUkZfT04pCiAJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCBidFBTUiB8IEJJVDMpOwogCiAJaWYgKChwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmID09IHRydWUpICYmCi0JICAgKGVSZlBvd2VyU3RhdGVUb1NldCA9PSBlUmZPbikpIHsKKwkgICAoZVJmUG93ZXJTdGF0ZVRvU2V0ID09IFJGX09OKSkgewogCQlwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmID0gZmFsc2U7CiAJCWJBY3R1YWxseVNldCA9IHRydWU7CiAJfSBlbHNlIGlmICgocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZiA9PSBmYWxzZSkgJiYKLQkJICAoZVJmUG93ZXJTdGF0ZVRvU2V0ID09IGVSZk9mZikpIHsKKwkJICAoZVJmUG93ZXJTdGF0ZVRvU2V0ID09IFJGX09GRikpIHsKIAkJcHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZiA9IHRydWU7CiAJCWJBY3R1YWxseVNldCA9IHRydWU7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9kbS5jCmluZGV4IDJjY2QyY2IuLjhjMDIwZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2RtLmMKQEAgLTExMTYsMTQgKzExMTYsMTQgQEAKIHZvaWQgU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXJDYWxsYmFjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlSVF9SRl9QT1dFUl9TVEFURSBydFN0YXRlOworCWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgcnRTdGF0ZTsKIAogCSAvKiBXZSBkbyBOT1QgbmVlZCB0byBzd2l0Y2ggYW50ZW5uYSB3aGlsZSBSRiBpcyBvZmYuICovCiAJcnRTdGF0ZSA9IHByaXYtPmVSRlBvd2VyU3RhdGU7CiAJZG8gewotCQlpZiAocnRTdGF0ZSA9PSBlUmZPZmYpIHsKKwkJaWYgKHJ0U3RhdGUgPT0gUkZfT0ZGKSB7CiAJCQlicmVhazsKLQkJfSBlbHNlIGlmIChydFN0YXRlID09IGVSZlNsZWVwKSB7CisJCX0gZWxzZSBpZiAocnRTdGF0ZSA9PSBSRl9TTEVFUCkgewogCQkJLyogRG9uJ3QgYWNjZXNzIEJCL1JGIHVuZGVyIERpc2FibGUgUExMIHNpdHVhdGlvbi4gKi8KIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNS5oCmluZGV4IGRlMDg0ZjAuLjdkZjczOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNS5oCkBAIC0xLDE0ICsxLDEzIEBACiAvKgotCVRoaXMgaXMgcGFydCBvZiB0aGUgcnRsODE4MC1zYTI0MDAgZHJpdmVyCi0JcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCAoU2VlIGZpbGUgQ09QWUlORyBmb3IgZGV0YWlscykuCi0JQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWEubWVyZWxsb0BnbWFpbC5jb20+Ci0KLQlUaGlzIGZpbGVzIGNvbnRhaW5zIHByb2dyYW1taW5nIGNvZGUgZm9yIHRoZSBydGw4MjI1Ci0JcmFkaW8gZnJvbnRlbmQuCi0KLQkqTWFueSogdGhhbmtzIHRvIFJlYWx0ZWsgQ29ycC4gZm9yIHRoZWlyIGdyZWF0IHN1cHBvcnQhCi0KLSovCisgKiBUaGlzIGlzIHBhcnQgb2YgdGhlIHJ0bDgxODAtc2EyNDAwIGRyaXZlciByZWxlYXNlZCB1bmRlciB0aGUgR1BMIChTZWUgZmlsZQorICogQ09QWUlORyBmb3IgZGV0YWlscykuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWEubWVyZWxsb0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlcyBjb250YWlucyBwcm9ncmFtbWluZyBjb2RlIGZvciB0aGUgcnRsODIyNSByYWRpbyBmcm9udGVuZC4KKyAqCisgKiAqTWFueSogdGhhbmtzIHRvIFJlYWx0ZWsgQ29ycC4gZm9yIHRoZWlyIGdyZWF0IHN1cHBvcnQhCisgKi8KIAogI2luY2x1ZGUgInI4MTgwLmgiCiAKQEAgLTI5LDcgKzI4LDcgQEAKIHZvaWQgcnRsODE4MF9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbW9kZSk7CiB2b2lkIHJ0bDgxODBfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1vZGUpOwogYm9vbCBTZXRaZWJyYVJGUG93ZXJTdGF0ZTgxODUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgIFJUX1JGX1BPV0VSX1NUQVRFIGVSRlBvd2VyU3RhdGUpOworCQkJICAgICAgZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBlUkZQb3dlclN0YXRlKTsKIHZvaWQgcnRsODIyNXo0X3JmX3NsZWVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogdm9pZCBydGw4MjI1ejRfcmZfd2FrZXVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjV6Mi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1ejIuYwppbmRleCA3YzlhOGJmLi40NzEwNGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjV6Mi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNXoyLmMKQEAgLTI3OSw4ICsyNzksOCBAQAogICogTWFwIGRCbSBpbnRvIFR4IHBvd2VyIGluZGV4IGFjY29yZGluZyB0byBjdXJyZW50IEhXIG1vZGVsLCBmb3IgZXhhbXBsZSwKICAqIFJGIGFuZCBQQSwgYW5kIGN1cnJlbnQgd2lyZWxlc3MgbW9kZS4KICAqLwotc3RhdGljIHM4IERibVRvVHhQd3JJZHgoc3RydWN0IHI4MTgwX3ByaXYgKnByaXYsIFdJUkVMRVNTX01PREUgV2lyZWxlc3NNb2RlLAotCQkJczMyIFBvd2VySW5EYm0pCitzdGF0aWMgczggRGJtVG9UeFB3cklkeChzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiwKKwkJCWVudW0gd2lyZWxlc3NfbW9kZSBtb2RlLCBzMzIgUG93ZXJJbkRibSkKIHsKIAlib29sIGJVc2VEZWZhdWx0ID0gdHJ1ZTsKIAlzOCBUeFB3cklkeCA9IDA7CkBAIC0yOTEsNyArMjkxLDcgQEAKIAkgKi8KIAlzMzIgdG1wID0gMDsKIAotCWlmIChXaXJlbGVzc01vZGUgPT0gV0lSRUxFU1NfTU9ERV9HKSB7CisJaWYgKG1vZGUgPT0gV0lSRUxFU1NfTU9ERV9HKSB7CiAJCWJVc2VEZWZhdWx0ID0gZmFsc2U7CiAJCXRtcCA9ICgyICogUG93ZXJJbkRibSk7CiAKQEAgLTMwMSw3ICszMDEsNyBAQAogCQkJVHhQd3JJZHggPSA0MDsKIAkJZWxzZQogCQkJVHhQd3JJZHggPSAoczgpdG1wOwotCX0gZWxzZSBpZiAoV2lyZWxlc3NNb2RlID09IFdJUkVMRVNTX01PREVfQikgeworCX0gZWxzZSBpZiAobW9kZSA9PSBXSVJFTEVTU19NT0RFX0IpIHsKIAkJYlVzZURlZmF1bHQgPSBmYWxzZTsKIAkJdG1wID0gKDQgKiBQb3dlckluRGJtKSAtIDUyOwogCkBAIC02MDYsNTEgKzYwNiwxMiBAQAogCXJ0bDgyMjV6Ml9yZl9zZXRfY2hhbihkZXYsIHByaXYtPmNoYW4pOwogfQogCi12b2lkIHJ0bDgyMjV6Ml9yZl9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQotCWlmIChwcml2LT5pZWVlODAyMTEtPm1vZGUgPT0gSUVFRV9BKSB7Ci0JCXdyaXRlX3J0bDgyMjUoZGV2LCAweDUsIDB4MTg2NSk7Ci0JCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1BBUkEsIDB4MTAwODQpOwotCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9USU1JTkcsIDB4YTgwMDgpOwotCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MCwgMHgwKTsKLQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGEsIDB4Nik7Ci0JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhiLCAweDk5KTsKLQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGYsIDB4MjApOwotCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTEsIDB4Nyk7Ci0KLQkJcnRsODIyNXoyX3NldF9nYWluKGRldiwgNCk7Ci0KLQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE1LCAweDQwKTsKLQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDQwKTsKLQotCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LCAweDEwMDAwMDAwKTsKLQl9IGVsc2UgewotCQl3cml0ZV9ydGw4MjI1KGRldiwgMHg1LCAweDE4NjQpOwotCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9QQVJBLCAweDEwMDQ0KTsKLQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfVElNSU5HLCAweGE4MDA4KTsKLQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDAsIDB4MSk7Ci0JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhhLCAweDYpOwotCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YiwgMHg5OSk7Ci0JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhmLCAweDIwKTsKLQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDExLCAweDcpOwotCi0JCXJ0bDgyMjV6Ml9zZXRfZ2FpbihkZXYsIDQpOwotCi0JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNSwgMHg0MCk7Ci0JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHg0MCk7Ci0KLQkJd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwgMHgwNDAwMDAwMik7Ci0JfQotfQotCiAjZGVmaW5lIE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfODVCCQkyMAogI2RlZmluZSBNQVhfUE9MTElOR18yNEZfVElNRVNfODdTRQkJMTAKICNkZWZpbmUgTFBTX01BWF9TTEVFUF9XQUlUSU5HX1RJTUVTXzg3U0UJNQogCiBib29sIFNldFplYnJhUkZQb3dlclN0YXRlODE4NShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgUlRfUkZfUE9XRVJfU1RBVEUgZVJGUG93ZXJTdGF0ZSkKKwkJCSAgICAgIGVudW0gcnRfcmZfcG93ZXJfc3RhdGUgZVJGUG93ZXJTdGF0ZSkKIHsKIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTgJCQlidENSOTM0NiwgYnRDb25maWczOwpAQCAtNjcyLDcgKzYzMyw3IEBACiAJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCAoYnRDb25maWczIHwgQ09ORklHM19QQVJNX0VuKSk7CiAKIAlzd2l0Y2ggKGVSRlBvd2VyU3RhdGUpIHsKLQljYXNlIGVSZk9uOgorCWNhc2UgUkZfT046CiAJCXdyaXRlX25pY193b3JkKGRldiwgMHgzN0MsIDB4MDBFQyk7CiAKIAkJLyogdHVybiBvbiBBRkUgKi8KQEAgLTY5Nyw3ICs2NTgsNyBAQAogCQl1MWJUbXAgPSByZWFkX25pY19ieXRlKGRldiwgMHgyNEUpOwogCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MjRFLCAodTFiVG1wICYgKH4oQklUNSB8IEJJVDYpKSkpOwogCQlicmVhazsKLQljYXNlIGVSZlNsZWVwOgorCWNhc2UgUkZfU0xFRVA6CiAJCWZvciAoUXVldWVJRCA9IDAsIGkgPSAwOyBRdWV1ZUlEIDwgNjspIHsKIAkJCWlmIChnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LCBRdWV1ZUlEKSA9PQogCQkJCQkJCXByaXYtPnR4cmluZ2NvdW50KSB7CkBAIC03NjQsNyArNzI1LDcgQEAKIAkJCX0KIAkJfQogCQlicmVhazsKLQljYXNlIGVSZk9mZjoKKwljYXNlIFJGX09GRjoKIAkJZm9yIChRdWV1ZUlEID0gMCwgaSA9IDA7IFF1ZXVlSUQgPCA2OykgewogCQkJaWYgKGdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYsIFF1ZXVlSUQpID09CiAJCQkJCXByaXYtPnR4cmluZ2NvdW50KSB7CkBAIC04NDEsMTAgKzgwMiwxMCBAQAogCiB2b2lkIHJ0bDgyMjV6NF9yZl9zbGVlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBlUmZTbGVlcCwgUkZfQ0hBTkdFX0JZX1BTKTsKKwlNZ250QWN0U2V0X1JGX1N0YXRlKGRldiwgUkZfU0xFRVAsIFJGX0NIQU5HRV9CWV9QUyk7CiB9CiAKIHZvaWQgcnRsODIyNXo0X3JmX3dha2V1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBlUmZPbiwgUkZfQ0hBTkdFX0JZX1BTKTsKKwlNZ250QWN0U2V0X1JGX1N0YXRlKGRldiwgUkZfT04sIFJGX0NIQU5HRV9CWV9QUyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3d4LmMKaW5kZXggOWI2NzZlMC4uYjU1MjQ5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guYwpAQCAtMjksNyArMjksNyBAQAogCiAjZGVmaW5lIFJBVEVfQ09VTlQgQVJSQVlfU0laRShydGw4MTgwX3JhdGVzKQogCi1zdGF0aWMgQ0hBTk5FTF9MSVNUIERlZmF1bHRDaGFubmVsUGxhbltdID0geworc3RhdGljIHN0cnVjdCBydGw4MTg3c2VfY2hhbm5lbF9saXN0IGRlZmF1bHRfY2hhbm5lbF9wbGFuW10gPSB7CiAJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NH0sIDE5fSwJCS8qIEZDQyAqLwogCXt7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExfSwgMTF9LAkJCQkJCS8qIElDICovCiAJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0fSwgMjF9LAkvKiBFVFNJCSovCkBAIC0zMzcsNyArMzM3LDcgQEAKIAkJfQllbHNlCXsKIAkJCS8qIHByZXZlbnQgc2NhbiBpbiBCdXN5VHJhZmZpYyAqLwogCQkJLyogRklYTUU6IE5lZWQgdG8gY29uc2lkZXIgbGFzdCBzY2FuIHRpbWUgKi8KLQkJCWlmICgocHJpdi0+bGlua19kZXRlY3QuYkJ1c3lUcmFmZmljKSAmJiAodHJ1ZSkpCXsKKwkJCWlmICgocHJpdi0+bGlua19kZXRlY3QuYl9idXN5X3RyYWZmaWMpICYmICh0cnVlKSkgewogCQkJCXJldCA9IDA7CiAJCQkJcHJpbnRrKCJOb3cgdHJhZmZpYyBpcyBidXN5LCBwbGVhc2UgdHJ5IGxhdGVyIVxuIik7CiAJCQl9CWVsc2UKQEAgLTEwMzAsMTUgKzEwMzAsMTUgQEAKIAogCS8qIHVuc2lnbmVkIGxvbmcgZmxhZ3M7ICovCiAJZG93bigmcHJpdi0+d3hfc2VtKTsKLQlpZiAoRGVmYXVsdENoYW5uZWxQbGFuWyp2YWxdLkxlbiAhPSAwKQl7CisJaWYgKGRlZmF1bHRfY2hhbm5lbF9wbGFuWyp2YWxdLmxlbiAhPSAwKSB7CiAJCXByaXYtPmNoYW5uZWxfcGxhbiA9ICp2YWw7CiAJCS8qIENsZWFyIG9sZCBjaGFubmVsIG1hcCA4ICovCiAJCWZvciAoaSA9IDE7IGkgPD0gTUFYX0NIQU5ORUxfTlVNQkVSOyBpKyspCiAJCQlHRVRfRE9UMTFEX0lORk8ocHJpdi0+aWVlZTgwMjExKS0+Y2hhbm5lbF9tYXBbaV0gPSAwOwogCiAJCS8qIFNldCBuZXcgY2hhbm5lbCBtYXAgKi8KLQkJZm9yIChpID0gMTsgaSA8PSBEZWZhdWx0Q2hhbm5lbFBsYW5bKnZhbF0uTGVuOyBpKyspCi0JCQlHRVRfRE9UMTFEX0lORk8ocHJpdi0+aWVlZTgwMjExKS0+Y2hhbm5lbF9tYXBbRGVmYXVsdENoYW5uZWxQbGFuWyp2YWxdLkNoYW5uZWxbaS0xXV0gPSAxOworCQlmb3IgKGkgPSAxOyBpIDw9IGRlZmF1bHRfY2hhbm5lbF9wbGFuWyp2YWxdLmxlbjsgaSsrKQorCQkJR0VUX0RPVDExRF9JTkZPKHByaXYtPmllZWU4MDIxMSktPmNoYW5uZWxfbWFwW2RlZmF1bHRfY2hhbm5lbF9wbGFuWyp2YWxdLmNoYW5uZWxbaS0xXV0gPSAxOwogCiAJfQogCXVwKCZwcml2LT53eF9zZW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4NWJfaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4NWJfaW5pdC5jCmluZGV4IGM4YjliYWYuLmNjNmYxMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODViX2luaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTg1Yl9pbml0LmMKQEAgLTYxOSwxMCArNjE5LDEwIEBACiAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOwogCiAJLyogbHptIGFkZCAwODA4MjYgKi8KLQlpZiAocHJpdi0+ZVJGUG93ZXJTdGF0ZSAhPSBlUmZPbikgeworCWlmIChwcml2LT5lUkZQb3dlclN0YXRlICE9IFJGX09OKSB7CiAJCS8qCURvbid0IGFjY2VzcyBCQi9SRiB1bmRlciBkaXNhYmxlIFBMTCBzaXR1YXRpb24uCiAJCSAqCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwgKCJVcGRhdGVJbml0aWFsR2FpbiAtCi0JCSAqCXBIYWxEYXRhLT5lUkZQb3dlclN0YXRlIT1lUmZPblxuIikpOworCQkgKglwSGFsRGF0YS0+ZVJGUG93ZXJTdGF0ZSE9UkZfT05cbiIpKTsKIAkJICoJQmFjayB0byB0aGUgb3JpZ2luYWwgc3RhdGUKIAkJICovCiAJCXByaXYtPkluaXRpYWxHYWluID0gcHJpdi0+SW5pdGlhbEdhaW5CYWNrVXA7CkBAIC04NzIsOCArODcyLDggQEAKIAogc3RhdGljIHZvaWQKIEFjdFVwZGF0ZUNoYW5uZWxBY2Nlc3NTZXR0aW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICBXSVJFTEVTU19NT0RFIFdpcmVsZXNzTW9kZSwKLQkJCSAgICAgIFBDSEFOTkVMX0FDQ0VTU19TRVRUSU5HIENobmxBY2Nlc3NTZXR0aW5nKQorCQkJICAgICAgZW51bSB3aXJlbGVzc19tb2RlIG1vZGUsCisJCQkgICAgICBzdHJ1Y3QgY2hubF9hY2Nlc3Nfc2V0dGluZyAqY2hubF9hY2Nlc3Nfc2V0dGluZykKIHsKIAlBQ19DT0RJTkcJZUFDSTsKIApAQCAtODkwLDI1ICs4OTAsMjUgQEAKIAkgKi8KIAogCS8qIFN1Z2dlc3RlZCBieSBKb25nLCAyMDA1LjEyLjA4LiAqLwotCUNobmxBY2Nlc3NTZXR0aW5nLT5TSUZTX1RpbWVyID0gMHgyMjsKLQlDaG5sQWNjZXNzU2V0dGluZy0+RElGU19UaW1lciA9IDB4MUM7IC8qIDIwMDYuMDYuMDIsIGJ5IHJjbmprby4gKi8KLQlDaG5sQWNjZXNzU2V0dGluZy0+U2xvdFRpbWVUaW1lciA9IDk7IC8qIDIwMDYuMDYuMDIsIGJ5IHJjbmprby4gKi8KKwljaG5sX2FjY2Vzc19zZXR0aW5nLT5zaWZzX3RpbWVyID0gMHgyMjsKKwljaG5sX2FjY2Vzc19zZXR0aW5nLT5kaWZzX3RpbWVyID0gMHgxQzsgLyogMjAwNi4wNi4wMiwgYnkgcmNuamtvLiAqLworCWNobmxfYWNjZXNzX3NldHRpbmctPnNsb3RfdGltZV90aW1lciA9IDk7IC8qIDIwMDYuMDYuMDIsIGJ5IHJjbmprby4gKi8KIAkvKgogCSAqIFN1Z2dlc3RlZCBieSB3Y2NodSwgaXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgRUlGUyByZWdpc3RlciwKIAkgKiAyMDA1LjEyLjA4LgogCSAqLwotCUNobmxBY2Nlc3NTZXR0aW5nLT5FSUZTX1RpbWVyID0gMHg1QjsKLQlDaG5sQWNjZXNzU2V0dGluZy0+Q1dtaW5JbmRleCA9IDM7IC8qIDIwMDYuMDYuMDIsIGJ5IHJjbmprby4gKi8KLQlDaG5sQWNjZXNzU2V0dGluZy0+Q1dtYXhJbmRleCA9IDc7IC8qIDIwMDYuMDYuMDIsIGJ5IHJjbmprby4gKi8KKwljaG5sX2FjY2Vzc19zZXR0aW5nLT5laWZzX3RpbWVyID0gMHg1QjsKKwljaG5sX2FjY2Vzc19zZXR0aW5nLT5jd21pbl9pbmRleCA9IDM7IC8qIDIwMDYuMDYuMDIsIGJ5IHJjbmprby4gKi8KKwljaG5sX2FjY2Vzc19zZXR0aW5nLT5jd21heF9pbmRleCA9IDc7IC8qIDIwMDYuMDYuMDIsIGJ5IHJjbmprby4gKi8KIAotCXdyaXRlX25pY19ieXRlKGRldiwgU0lGUywgQ2hubEFjY2Vzc1NldHRpbmctPlNJRlNfVGltZXIpOworCXdyaXRlX25pY19ieXRlKGRldiwgU0lGUywgY2hubF9hY2Nlc3Nfc2V0dGluZy0+c2lmc190aW1lcik7CiAJLyoKIAkgKiBSZXdyaXRlZCBmcm9tIGRpcmVjdGx5IHVzZSBQbGF0Zm9ybUVGSU9Xcml0ZTFCeXRlKCksCiAJICogYnkgQW5uaWUsIDIwMDYtMDMtMjkuCiAJICovCi0Jd3JpdGVfbmljX2J5dGUoZGV2LCBTTE9ULCBDaG5sQWNjZXNzU2V0dGluZy0+U2xvdFRpbWVUaW1lcik7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBTTE9ULCBjaG5sX2FjY2Vzc19zZXR0aW5nLT5zbG90X3RpbWVfdGltZXIpOwogCi0Jd3JpdGVfbmljX2J5dGUoZGV2LCBFSUZTLCBDaG5sQWNjZXNzU2V0dGluZy0+RUlGU19UaW1lcik7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBFSUZTLCBjaG5sX2FjY2Vzc19zZXR0aW5nLT5laWZzX3RpbWVyKTsKIAogCS8qCiAJICogPFJKX0VYUFJfUU9TPiBTdWdnZXN0ZWQgYnkgd2NjaHUsIGl0IGlzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIEVJRlMKQEAgLTk1OSw3ICs5NTksNyBAQAogCSAqIHdpcmVsZXNzIG1vZGUgaWYgd2Ugc3dpdGNoIHRvIHNwZWNpZmllZCBiYW5kIHN1Y2Nlc3NmdWxseS4KIAkgKi8KIAotCWllZWUtPm1vZGUgPSAoV0lSRUxFU1NfTU9ERSlidFdpcmVsZXNzTW9kZTsKKwlpZWVlLT5tb2RlID0gKGVudW0gd2lyZWxlc3NfbW9kZSlidFdpcmVsZXNzTW9kZTsKIAogCS8qIDMuIENoYW5nZSByZWxhdGVkIHNldHRpbmcuICovCiAJaWYgKGllZWUtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9BKQpAQCAtMTA4NSw3ICsxMDg1LDcgQEAKICAqCQlQQVNTSVZFIExFVkVMLgogICovCiBzdGF0aWMgYm9vbCBTZXRSRlBvd2VyU3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICBSVF9SRl9QT1dFUl9TVEFURSBlUkZQb3dlclN0YXRlKQorCQkJICAgIGVudW0gcnRfcmZfcG93ZXJfc3RhdGUgZVJGUG93ZXJTdGF0ZSkKIHsKIAlzdHJ1Y3QJcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CiAJYm9vbAliUmVzdWx0ID0gZmFsc2U7CkBAIC0xMDk4LDEzICsxMDk4LDEzIEBACiAJcmV0dXJuIGJSZXN1bHQ7CiB9CiAKLWJvb2wgTWdudEFjdFNldF9SRl9TdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBSVF9SRl9QT1dFUl9TVEFURSBTdGF0ZVRvU2V0LAorYm9vbCBNZ250QWN0U2V0X1JGX1N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGVudW0gcnRfcmZfcG93ZXJfc3RhdGUgU3RhdGVUb1NldCwKIAkJCSB1MzIgQ2hhbmdlU291cmNlKQogewogCXN0cnVjdAlyODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlib29sCWJBY3Rpb25BbGxvd2VkID0gZmFsc2U7CiAJYm9vbAliQ29ubmVjdEJ5U1NJRCA9IGZhbHNlOwotCVJUX1JGX1BPV0VSX1NUQVRFIHJ0U3RhdGU7CisJZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBydFN0YXRlOwogCXUxNglSRldhaXRDb3VudGVyID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWc7CiAJLyoKQEAgLTExNDAsNyArMTE0MCw3IEBACiAJcnRTdGF0ZSA9IHByaXYtPmVSRlBvd2VyU3RhdGU7CiAKIAlzd2l0Y2ggKFN0YXRlVG9TZXQpIHsKLQljYXNlIGVSZk9uOgorCWNhc2UgUkZfT046CiAJCS8qCiAJCSAqCVR1cm4gT24gUkYgbm8gbWF0dGVyIHRoZSBJUFMgc2V0dGluZyBiZWNhdXNlIHdlIG5lZWQgdG8KIAkJICoJdXBkYXRlIHRoZSBSRiBzdGF0ZSB0byBOZGlzIHVuZGVyIFZpc3RhLCBvciB0aGUgV2luZG93cwpAQCAtMTE1MywxMyArMTE1MywxMyBAQAogCQkJcHJpdi0+UmZPZmZSZWFzb24gPSAwOwogCQkJYkFjdGlvbkFsbG93ZWQgPSB0cnVlOwogCi0JCQlpZiAocnRTdGF0ZSA9PSBlUmZPZmYgJiYKKwkJCWlmIChydFN0YXRlID09IFJGX09GRiAmJgogCQkJICAgIENoYW5nZVNvdXJjZSA+PSBSRl9DSEFOR0VfQllfSFcpCiAJCQkJYkNvbm5lY3RCeVNTSUQgPSB0cnVlOwogCQl9CiAJCWJyZWFrOwogCi0JY2FzZSBlUmZPZmY6CisJY2FzZSBSRl9PRkY6CiAJCSAvKiAwNzAxMjUsIHJjbmprbzogd2UgYWx3YXlzIGtlZXAgY29ubmVjdGVkIGluIEFQIG1vZGUuICovCiAKIAkJaWYgKHByaXYtPlJmT2ZmUmVhc29uID4gUkZfQ0hBTkdFX0JZX0lQUykgewpAQCAtMTE4Miw3ICsxMTgyLDcgQEAKIAkJcHJpdi0+UmZPZmZSZWFzb24gfD0gQ2hhbmdlU291cmNlOwogCQliQWN0aW9uQWxsb3dlZCA9IHRydWU7CiAJCWJyZWFrOwotCWNhc2UgZVJmU2xlZXA6CisJY2FzZSBSRl9TTEVFUDoKIAkJcHJpdi0+UmZPZmZSZWFzb24gfD0gQ2hhbmdlU291cmNlOwogCQliQWN0aW9uQWxsb3dlZCA9IHRydWU7CiAJCWJyZWFrOwpAQCAtMTIzMyw3ICsxMjMzLDcgQEAKIHZvaWQgSVBTRW50ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7Ci0JUlRfUkZfUE9XRVJfU1RBVEUgcnRTdGF0ZTsKKwllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIHJ0U3RhdGU7CiAJaWYgKHByaXYtPmJJbmFjdGl2ZVBzKSB7CiAJCXJ0U3RhdGUgPSBwcml2LT5lUkZQb3dlclN0YXRlOwogCkBAIC0xMjQ1LDkgKzEyNDUsOSBAQAogCQkgKgl0cmlnZ2VyIElQUykoNCkgSUJTUyAoc2VuZCBCZWFjb24pCiAJCSAqCSg1KSBBUCBtb2RlIChzZW5kIEJlYWNvbikKIAkJICovCi0JCWlmIChydFN0YXRlID09IGVSZk9uICYmICFwcml2LT5iU3dSZlByb2Nlc3NpbmcKKwkJaWYgKHJ0U3RhdGUgPT0gUkZfT04gJiYgIXByaXYtPmJTd1JmUHJvY2Vzc2luZwogCQkJJiYgKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkpIHsKLQkJCXByaXYtPmVJbmFjdGl2ZVBvd2VyU3RhdGUgPSBlUmZPZmY7CisJCQlwcml2LT5lSW5hY3RpdmVQb3dlclN0YXRlID0gUkZfT0ZGOwogCQkJSW5hY3RpdmVQb3dlclNhdmUoZGV2KTsKIAkJfQogCX0KQEAgLTEyNTUsMTMgKzEyNTUsMTMgQEAKIHZvaWQgSVBTTGVhdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7Ci0JUlRfUkZfUE9XRVJfU1RBVEUgcnRTdGF0ZTsKKwllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIHJ0U3RhdGU7CiAJaWYgKHByaXYtPmJJbmFjdGl2ZVBzKSB7CiAJCXJ0U3RhdGUgPSBwcml2LT5lUkZQb3dlclN0YXRlOwotCQlpZiAoKHJ0U3RhdGUgPT0gZVJmT2ZmIHx8IHJ0U3RhdGUgPT0gZVJmU2xlZXApICYmCisJCWlmICgocnRTdGF0ZSA9PSBSRl9PRkYgfHwgcnRTdGF0ZSA9PSBSRl9TTEVFUCkgJiYKIAkJICAgICFwcml2LT5iU3dSZlByb2Nlc3NpbmcKIAkJICAgICYmIHByaXYtPlJmT2ZmUmVhc29uIDw9IFJGX0NIQU5HRV9CWV9JUFMpIHsKLQkJCXByaXYtPmVJbmFjdGl2ZVBvd2VyU3RhdGUgPSBlUmZPbjsKKwkJCXByaXYtPmVJbmFjdGl2ZVBvd2VyU3RhdGUgPSBSRl9PTjsKIAkJCUluYWN0aXZlUG93ZXJTYXZlKGRldik7CiAJCX0KIAl9CkBAIC0xMzg1LDIzICsxMzg1LDIzIEBACiAKIAkJLyogSW5pdGlhbGl6ZSBSZWdXaXJlbGVzc01vZGUgaWYgaXQgaXMgbm90IGEgdmFsaWQgb25lLgkqLwogCQlpZiAoYkludmFsaWRXaXJlbGVzc01vZGUpCi0JCQlpZWVlLT5tb2RlID0gKFdJUkVMRVNTX01PREUpSW5pdFdpcmVsZXNzTW9kZTsKKwkJCWllZWUtPm1vZGUgPSAoZW51bSB3aXJlbGVzc19tb2RlKUluaXRXaXJlbGVzc01vZGU7CiAKIAl9IGVsc2UgewogCS8qIE9uZSBvZiBCLCBHLCBBLiAqLwogCQlJbml0V2lyZWxlc3NNb2RlID0gaWVlZS0+bW9kZTsKIAl9Ci0JcHJpdi0+ZVJGUG93ZXJTdGF0ZSA9IGVSZk9mZjsKKwlwcml2LT5lUkZQb3dlclN0YXRlID0gUkZfT0ZGOwogCXByaXYtPlJmT2ZmUmVhc29uID0gMDsKIAl7Ci0JCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBlUmZPbiwgMCk7CisJCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBSRl9PTiwgMCk7CiAJfQogCQkvKgogCQkgKiBJZiBpbmFjdGl2ZSBwb3dlciBtb2RlIGlzIGVuYWJsZWQsIGRpc2FibGUgcmYgd2hpbGUgaW4KIAkJICogZGlzY29ubmVjdGVkIHN0YXRlLgogCQkgKi8KIAlpZiAocHJpdi0+YkluYWN0aXZlUHMpCi0JCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2ICwgZVJmT2ZmLCBSRl9DSEFOR0VfQllfSVBTKTsKKwkJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYgLCBSRl9PRkYsIFJGX0NIQU5HRV9CWV9JUFMpOwogCiAJQWN0U2V0V2lyZWxlc3NNb2RlODE4NShkZXYsICh1OCkoSW5pdFdpcmVsZXNzTW9kZSkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L0tjb25maWcKaW5kZXggYzljNTQ4Zi4uOWE1N2QzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvS2NvbmZpZwpAQCAtMTIsNyArMTIsNyBAQAogCiBjb25maWcgODhFVV9BUF9NT0RFCiAJYm9vbCAiUmVhbHRlayBSVEw4MTg4RVUgQVAgbW9kZSIKLQlkZWZhdWx0IFkKKwlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJVGhpcyBvcHRpb24gZW5hYmxlcyBBY2Nlc3MgUG9pbnQgbW9kZS4gVW5sZXNzIHlvdSBrbm93IHRoYXQgeW91ciBzeXN0ZW0KIAl3aWxsIG5ldmVyIGJlIHVzZWQgYXMgYW4gQVAsIG9yIHRoZSB0YXJnZXQgc3lzdGVtIGhhcyBsaW1pdGVkIG1lbW9yeSwKQEAgLTIwLDcgKzIwLDcgQEAKIAogY29uZmlnIDg4RVVfUDJQCiAJYm9vbCAiUmVhbHRlayBSVEw4MTg4RVUgUGVlci10by1wZWVyIG1vZGUiCi0JZGVmYXVsdCBZCisJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCVRoaXMgb3B0aW9uIGVuYWJsZXMgcGVlci10by1wZWVyIG1vZGUgZm9yIHRoZSByODE4OGV1IGRyaXZlci4gVW5sZXNzIHlvdQogCWtub3cgdGhhdCBwZWVyLXRvLXBlZXIgKFAyUCkgbW9kZSB3aWxsIG5ldmVyIGJlIHVzZWQsIG9yIHRoZSB0YXJnZXQgc3lzdGVtIGhhcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvTWFrZWZpbGUKaW5kZXggMGE2MTdiNC4uNmExMzhmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L01ha2VmaWxlCkBAIC0zNCw3ICszNCw2IEBACiAJCWhhbC9oYWxfY29tLm8JCVwKIAkJaGFsL29kbS5vCQlcCiAJCWhhbC9vZG1fZGVidWcubwkJXAotCQloYWwvb2RtX2ludGVyZmFjZS5vCVwKIAkJaGFsL29kbV9IV0NvbmZpZy5vCVwKIAkJaGFsL29kbV9SZWdDb25maWc4MTg4RS5vXAogCQloYWwvb2RtX1JUTDgxODhFLm8JXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9UT0RPCmluZGV4IGY3ZjM4OWMuLmI1NzRiMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L1RPRE8KQEAgLTksNiArOSwxMSBAQAogLSBtZXJnZSBSZWFsdGVrJ3MgYnVnZml4ZXMgYW5kIG5ldyBmZWF0dXJlcyBpbnRvIHRoZSBkcml2ZXIKIC0gc3dpdGNoIHRvIHVzZSBMSUI4MDIxMQogLSBzd2l0Y2ggdG8gdXNlIE1BQzgwMjExCistIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIHRoaXMgY29kZSBpbiBydHdfcmVjdl9pbmRpY2F0ZXBrdCgpOgorCXJjdV9yZWFkX2xvY2soKTsKKwlyY3VfZGVyZWZlcmVuY2UocGFkYXB0ZXItPnBuZXRkZXYtPnJ4X2hhbmRsZXJfZGF0YSk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisgIFBlcmhhcHMgZGVsZXRlIGl0LCBwZXJoYXBzIGFzc2lnbiB0byBzb21lIGxvY2FsIHZhcmlhYmxlLgogCiBQbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBsaW51eC5jb20+LAogYW5kIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2FwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2FwLmMKaW5kZXggOGViZTZiYy4uZmY3NGQwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19hcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfYXAuYwpAQCAtOTQsNyArOTQsNyBAQAogCQl9IGVsc2UgewogCQkJdGltX2llbGVuID0gMDsKIAotCQkJLyogY2FsdWNhdGUgaGVhZF9sZW4gKi8KKwkJCS8qIGNhbGN1bGF0ZSBoZWFkX2xlbiAqLwogCQkJb2Zmc2V0ID0gX0ZJWEVEX0lFX0xFTkdUSF87CiAJCQlvZmZzZXQgKz0gcG5ldHdvcmtfbWxtZWV4dC0+U3NpZC5Tc2lkTGVuZ3RoICsgMjsKIApAQCAtMTI5LDcgKzEyOSw3IEBACiAJCSpkc3RfaWUrKyA9IHRpbV9pZWxlbjsKIAogCQkqZHN0X2llKysgPSAwOy8qIERUSU0gY291bnQgKi8KLQkJKmRzdF9pZSsrID0gMTsvKiBEVElNIHBlcm9pZCAqLworCQkqZHN0X2llKysgPSAxOy8qIERUSU0gcGVyaW9kICovCiAKIAkJaWYgKHBzdGFwcml2LT50aW1fYml0bWFwJkJJVCgwKSkvKiBmb3IgYmMvbWMgZnJhbWVzICovCiAJCQkqZHN0X2llKysgPSBCSVQoMCk7LyogYml0bWFwIGN0cmwgKi8KQEAgLTI4NSwxMiArMjg1LDEyIEBACiAJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXV0aF9saXN0X2xvY2spOwogCiAJcGhlYWQgPSAmcHN0YXByaXYtPmF1dGhfbGlzdDsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJLyogY2hlY2sgYXV0aF9xdWV1ZSAqLwogCXdoaWxlICgocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkgPT0gZmFsc2UpIHsKLQkJcHN0YSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGF1dGhfbGlzdCk7Ci0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwc3RhID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGF1dGhfbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKIAkJaWYgKHBzdGEtPmV4cGlyZV90byA+IDApIHsKIAkJCXBzdGEtPmV4cGlyZV90by0tOwpAQCAtMzE5LDEyICszMTksMTIgQEAKIAlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7CiAKIAlwaGVhZCA9ICZwc3RhcHJpdi0+YXNvY19saXN0OwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAkvKiBjaGVjayBhc29jX3F1ZXVlICovCiAJd2hpbGUgKChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSA9PSBmYWxzZSkgewotCQlwc3RhID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgYXNvY19saXN0KTsKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBzdGEgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgYXNvY19saXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAogCQlpZiAoY2hrX3N0YV9pc19hbGl2ZShwc3RhKSB8fCAhcHN0YS0+ZXhwaXJlX3RvKSB7CiAJCQlwc3RhLT5leHBpcmVfdG8gPSBwc3RhcHJpdi0+ZXhwaXJlX3RvOwpAQCAtODIxLDcgKzgyMSw3IEBACiAJLyogdXBkYXRlIGN1cl93aXJlbGVzc19tb2RlICovCiAJdXBkYXRlX3dpcmVsZXNzX21vZGUocGFkYXB0ZXIpOwogCi0JLyogdWRwYXRlIGNhcGFiaWxpdHkgYWZ0ZXIgY3VyX3dpcmVsZXNzX21vZGUgdXBkYXRlZCAqLworCS8qIHVwZGF0ZSBjYXBhYmlsaXR5IGFmdGVyIGN1cl93aXJlbGVzc19tb2RlIHVwZGF0ZWQgKi8KIAl1cGRhdGVfY2FwaW5mbyhwYWRhcHRlciwgcnR3X2dldF9jYXBhYmlsaXR5KChzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqKXBuZXR3b3JrKSk7CiAKIAkvKiBsZXQgcG5ldHdvcmtfbWxtZWV4dCA9PSBwbmV0d29ya19tbG1lLiAqLwpAQCAtOTgwLDcgKzk4MCw3IEBACiAJZm9yIChwID0gaWUgKyBfQkVBQ09OX0lFX09GRlNFVF87OyBwICs9IChpZV9sZW4gKyAyKSkgewogCQlwID0gcnR3X2dldF9pZShwLCBfU1NOX0lFXzFfLCAmaWVfbGVuLAogCQkJICAgICAgIChwYnNzX25ldHdvcmstPklFTGVuZ3RoIC0gX0JFQUNPTl9JRV9PRkZTRVRfIC0gKGllX2xlbiArIDIpKSk7Ci0JCWlmICgocCkgJiYgKF9ydHdfbWVtY21wKHArMiwgT1VJMSwgNCkpKSB7CisJCWlmICgocCkgJiYgKCFtZW1jbXAocCsyLCBPVUkxLCA0KSkpIHsKIAkJCWlmIChydHdfcGFyc2Vfd3BhX2llKHAsIGllX2xlbisyLCAmZ3JvdXBfY2lwaGVyLAogCQkJCQkgICAgICZwYWlyd2lzZV9jaXBoZXIsIE5VTEwpID09IF9TVUNDRVNTKSB7CiAJCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9IGRvdDExQXV0aEFsZ3J0aG1fODAyMVg7CkBAIC0xMDA1LDcgKzEwMDUsNyBAQAogCQlmb3IgKHAgPSBpZSArIF9CRUFDT05fSUVfT0ZGU0VUXzs7IHAgKz0gKGllX2xlbiArIDIpKSB7CiAJCQlwID0gcnR3X2dldF9pZShwLCBfVkVORE9SX1NQRUNJRklDX0lFXywgJmllX2xlbiwKIAkJCQkgICAgICAgKHBic3NfbmV0d29yay0+SUVMZW5ndGggLSBfQkVBQ09OX0lFX09GRlNFVF8gLSAoaWVfbGVuICsgMikpKTsKLQkJCWlmICgocCkgJiYgX3J0d19tZW1jbXAocCsyLCBXTU1fUEFSQV9JRSwgNikpIHsKKwkJCWlmICgocCkgJiYgIW1lbWNtcChwKzIsIFdNTV9QQVJBX0lFLCA2KSkgewogCQkJCXBtbG1lcHJpdi0+cW9zcHJpdi5xb3Nfb3B0aW9uID0gMTsKIAogCQkJCSoocCs4KSB8PSBCSVQoNyk7LyogUW9TIEluZm8sIHN1cHBvcnQgVS1BUFNEICovCkBAIC0xMTQ0LDEzICsxMTQ0LDEzIEBACiAJc3Bpbl9sb2NrX2JoKCYocGFjbF9ub2RlX3EtPmxvY2spKTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwYWNsX25vZGVfcSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICghcnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkgewotCQlwYWNsbm9kZSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3QgcnR3X3dsYW5fYWNsX25vZGUsIGxpc3QpOwotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGFjbG5vZGUgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBydHdfd2xhbl9hY2xfbm9kZSwgbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKLQkJaWYgKF9ydHdfbWVtY21wKHBhY2xub2RlLT5hZGRyLCBhZGRyLCBFVEhfQUxFTikpIHsKKwkJaWYgKCFtZW1jbXAocGFjbG5vZGUtPmFkZHIsIGFkZHIsIEVUSF9BTEVOKSkgewogCQkJaWYgKHBhY2xub2RlLT52YWxpZCkgewogCQkJCWFkZGVkID0gdHJ1ZTsKIAkJCQlEQkdfODhFKCIlcywgc3RhIGhhcyBiZWVuIGFkZGVkXG4iLCBfX2Z1bmNfXyk7CkBAIC0xMjA1LDEzICsxMjA1LDEzIEBACiAJc3Bpbl9sb2NrX2JoKCYocGFjbF9ub2RlX3EtPmxvY2spKTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwYWNsX25vZGVfcSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICghcnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkgewotCQlwYWNsbm9kZSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3QgcnR3X3dsYW5fYWNsX25vZGUsIGxpc3QpOwotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGFjbG5vZGUgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBydHdfd2xhbl9hY2xfbm9kZSwgbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKLQkJaWYgKF9ydHdfbWVtY21wKHBhY2xub2RlLT5hZGRyLCBhZGRyLCBFVEhfQUxFTikpIHsKKwkJaWYgKCFtZW1jbXAocGFjbG5vZGUtPmFkZHIsIGFkZHIsIEVUSF9BTEVOKSkgewogCQkJaWYgKHBhY2xub2RlLT52YWxpZCkgewogCQkJCXBhY2xub2RlLT52YWxpZCA9IGZhbHNlOwogCkBAIC0xMzM5LDggKzEzMzksNyBAQAogCQlwbmV0d29yay0+SUVMZW5ndGggPSB3cHNfb2Zmc2V0ICsgKHdwc19pZWxlbisyKSArIHJlbWFpbmRlcl9pZWxlbjsKIAl9CiAKLQlpZiAocGJhY2t1cF9yZW1haW5kZXJfaWUpCi0JCWtmcmVlKHBiYWNrdXBfcmVtYWluZGVyX2llKTsKKwlrZnJlZShwYmFja3VwX3JlbWFpbmRlcl9pZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHVwZGF0ZV9iY25fcDJwX2llKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKQEAgLTEzNTEsMTMgKzEzNTAsMTMgQEAKIHsKIAlEQkdfODhFKCIlc1xuIiwgX19mdW5jX18pOwogCi0JaWYgKF9ydHdfbWVtY21wKFJUV19XUEFfT1VJLCBvdWksIDQpKQorCWlmICghbWVtY21wKFJUV19XUEFfT1VJLCBvdWksIDQpKQogCQl1cGRhdGVfYmNuX3dwYV9pZShwYWRhcHRlcik7Ci0JZWxzZSBpZiAoX3J0d19tZW1jbXAoV01NX09VSSwgb3VpLCA0KSkKKwllbHNlIGlmICghbWVtY21wKFdNTV9PVUksIG91aSwgNCkpCiAJCXVwZGF0ZV9iY25fd21tX2llKHBhZGFwdGVyKTsKLQllbHNlIGlmIChfcnR3X21lbWNtcChXUFNfT1VJLCBvdWksIDQpKQorCWVsc2UgaWYgKCFtZW1jbXAoV1BTX09VSSwgb3VpLCA0KSkKIAkJdXBkYXRlX2Jjbl93cHNfaWUocGFkYXB0ZXIpOwotCWVsc2UgaWYgKF9ydHdfbWVtY21wKFAyUF9PVUksIG91aSwgNCkpCisJZWxzZSBpZiAoIW1lbWNtcChQMlBfT1VJLCBvdWksIDQpKQogCQl1cGRhdGVfYmNuX3AycF9pZShwYWRhcHRlcik7CiAJZWxzZQogCQlEQkdfODhFKCJ1bmtub3duIE9VSSB0eXBlIVxuIik7CkBAIC0xNDE1LDcgKzE0MTQsNyBAQAogCiAvKgogb3BfbW9kZQotU2V0IHRvIDAgKEhUIHB1cmUpIHVuZGVyIHRoZSBmb2xsb3dpZ24gY29uZGl0aW9ucworU2V0IHRvIDAgKEhUIHB1cmUpIHVuZGVyIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogCS0gYWxsIFNUQXMgaW4gdGhlIEJTUyBhcmUgMjAvNDAgTUh6IEhUIGluIDIwLzQwIE1IeiBCU1Mgb3IKIAktIGFsbCBTVEFzIGluIHRoZSBCU1MgYXJlIDIwIE1IeiBIVCBpbiAyMCBNSHogQlNTCiBTZXQgdG8gMSAoSFQgbm9uLW1lbWJlciBwcm90ZWN0aW9uKSBpZiB0aGVyZSBtYXkgYmUgbm9uLUhUIFNUQXMKQEAgLTE0OTQsNyArMTQ5Myw3IEBACiAKIHZvaWQgYXNzb2NpYXRlZF9jbGllbnRzX3VwZGF0ZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHVwZGF0ZWQpCiB7Ci0JLyogdXBkYXRlIGFzc29jaWNhdGVkIHN0YXRpb25zIGNhcC4gKi8KKwkvKiB1cGRhdGUgYXNzb2NpYXRlZCBzdGF0aW9ucyBjYXAuICovCiAJaWYgKHVwZGF0ZWQpIHsKIAkJc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQsICpwbGlzdDsKIAkJc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKQEAgLTE1MDMsMTMgKzE1MDIsMTMgQEAKIAkJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwogCiAJCXBoZWFkID0gJnBzdGFwcml2LT5hc29jX2xpc3Q7Ci0JCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCQlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJCS8qIGNoZWNrIGFzb2NfcXVldWUgKi8KIAkJd2hpbGUgKChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSA9PSBmYWxzZSkgewotCQkJcHN0YSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGFzb2NfbGlzdCk7CisJCQlwc3RhID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGFzb2NfbGlzdCk7CiAKLQkJCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAogCQkJVkNTX3VwZGF0ZShwYWRhcHRlciwgcHN0YSk7CiAJCX0KQEAgLTE2NDcsNyArMTY0Niw3IEBACiAJCXVwZGF0ZV9iZWFjb24ocGFkYXB0ZXIsIF9IVF9BRERfSU5GT19JRV8sIE5VTEwsIHRydWUpOwogCX0KIAotCS8qIHVwZGF0ZSBhc3NvY2ljYXRlZCBzdGF0aW9ucyBjYXAuICovCisJLyogdXBkYXRlIGFzc29jaWF0ZWQgc3RhdGlvbnMgY2FwLiAqLwogCWFzc29jaWF0ZWRfY2xpZW50c191cGRhdGUocGFkYXB0ZXIsICBiZWFjb25fdXBkYXRlZCk7CiAKIAlEQkdfODhFKCIlcywgdXBkYXRlZCA9JWRcbiIsIF9fZnVuY19fLCBiZWFjb25fdXBkYXRlZCk7CkBAIC0xNzExLDcgKzE3MTAsNyBAQAogCQl1cGRhdGVfYmVhY29uKHBhZGFwdGVyLCBfSFRfQUREX0lORk9fSUVfLCBOVUxMLCB0cnVlKTsKIAl9CiAKLQkvKiB1cGRhdGUgYXNzb2NpY2F0ZWQgc3RhdGlvbnMgY2FwLiAqLworCS8qIHVwZGF0ZSBhc3NvY2lhdGVkIHN0YXRpb25zIGNhcC4gKi8KIAogCURCR184OEUoIiVzLCB1cGRhdGVkID0lZFxuIiwgX19mdW5jX18sIGJlYWNvbl91cGRhdGVkKTsKIApAQCAtMTc3NywxMiArMTc3NiwxMiBAQAogCiAJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwogCXBoZWFkID0gJnBzdGFwcml2LT5hc29jX2xpc3Q7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCS8qIGZvciBlYWNoIHN0YSBpbiBhc29jX3F1ZXVlICovCiAJd2hpbGUgKCFydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSB7Ci0JCXBzdGEgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBhc29jX2xpc3QpOwotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcHN0YSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBhc29jX2xpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCiAJCWlzc3VlX2FjdGlvbl9zcGN0X2NoX3N3aXRjaChwYWRhcHRlciwgcHN0YS0+aHdhZGRyLCBuZXdfY2gsIGNoX29mZnNldCk7CiAJCXBzdGEtPmV4cGlyZV90byA9ICgocHN0YXByaXYtPmV4cGlyZV90byAqIDIpID4gNSkgPyA1IDogKHBzdGFwcml2LT5leHBpcmVfdG8gKiAyKTsKQEAgLTE4MTEsMTMgKzE4MTAsMTMgQEAKIAogCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKIAlwaGVhZCA9ICZwc3RhcHJpdi0+YXNvY19saXN0OwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAkvKiBmcmVlIHN0YSBhc29jX3F1ZXVlICovCiAJd2hpbGUgKChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSA9PSBmYWxzZSkgewotCQlwc3RhID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgYXNvY19saXN0KTsKKwkJcHN0YSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBhc29jX2xpc3QpOwogCi0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCiAJCXJ0d19saXN0X2RlbGV0ZSgmcHN0YS0+YXNvY19saXN0KTsKIAkJcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQtLTsKQEAgLTE5NDIsMTAgKzE5NDEsMTAgQEAKIAkvKiBmb3IgQUNMICovCiAJc3Bpbl9sb2NrX2JoKCYocGFjbF9ub2RlX3EtPmxvY2spKTsKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocGFjbF9ub2RlX3EpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAJd2hpbGUgKChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSA9PSBmYWxzZSkgewotCQlwYWNsbm9kZSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3QgcnR3X3dsYW5fYWNsX25vZGUsIGxpc3QpOwotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGFjbG5vZGUgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBydHdfd2xhbl9hY2xfbm9kZSwgbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKIAkJaWYgKHBhY2xub2RlLT52YWxpZCkgewogCQkJcGFjbG5vZGUtPnZhbGlkID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2JyX2V4dC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19icl9leHQuYwppbmRleCA3NWUzOGQ0Li5lODQzYzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2JyX2V4dC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfYnJfZXh0LmMKQEAgLTQwOSw3ICs0MDksNyBAQAogCWRiID0gcHJpdi0+bmV0aGFzaFtoYXNoXTsKIAl3aGlsZSAoZGIgIT0gTlVMTCkgewogCQlpZiAoIW1lbWNtcChkYi0+bmV0d29ya0FkZHIsIG5ldHdvcmtBZGRyLCBNQVhfTkVUV09SS19BRERSX0xFTikpIHsKLQkJCW1lbWNweShkYi0+bWFjQWRkciwgbWFjQWRkciwgRVRIX0FMRU4pOworCQkJZXRoZXJfYWRkcl9jb3B5KGRiLT5tYWNBZGRyLCBtYWNBZGRyKTsKIAkJCWRiLT5hZ2VpbmdfdGltZXIgPSBqaWZmaWVzOwogCQkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmJyX2V4dF9sb2NrKTsKIAkJCXJldHVybjsKQEAgLTQyMiw3ICs0MjIsNyBAQAogCQlyZXR1cm47CiAJfQogCW1lbWNweShkYi0+bmV0d29ya0FkZHIsIG5ldHdvcmtBZGRyLCBNQVhfTkVUV09SS19BRERSX0xFTik7Ci0JbWVtY3B5KGRiLT5tYWNBZGRyLCBtYWNBZGRyLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KGRiLT5tYWNBZGRyLCBtYWNBZGRyKTsKIAlhdG9taWNfc2V0KCZkYi0+dXNlX2NvdW50LCAxKTsKIAlkYi0+YWdlaW5nX3RpbWVyID0gamlmZmllczsKIApAQCAtNTQzLDEzICs1NDMsMTQgQEAKIAkJCWlmICghX19uYXQyNV9kYl9uZXR3b3JrX2xvb2t1cF9hbmRfcmVwbGFjZShwcml2LCBza2IsIG5ldHdvcmtBZGRyKSkgewogCQkJCWlmICgqKCh1bnNpZ25lZCBjaGFyICopJmlwaC0+ZGFkZHIgKyAzKSA9PSAweGZmKSB7CiAJCQkJCS8qICBMMiBpcyB1bmljYXN0IGJ1dCBMMyBpcyBicm9hZGNhc3QsIG1ha2UgTDIgYmFjb21lIGJyb2FkY2FzdCAqLwotCQkJCQlERUJVR19JTkZPKCJOQVQyNTogU2V0IERBIGFzIGJvYXJkY2FzdFxuIik7CisJCQkJCURFQlVHX0lORk8oIk5BVDI1OiBTZXQgREEgYXMgYnJvYWRjYXN0XG4iKTsKIAkJCQkJbWVtc2V0KHNrYi0+ZGF0YSwgMHhmZiwgRVRIX0FMRU4pOwogCQkJCX0gZWxzZSB7Ci0JCQkJCS8qICBmb3J3YXJkIHVua25vdyBJUCBwYWNrZXQgdG8gdXBwZXIgVENQL0lQICovCisJCQkJCS8qICBmb3J3YXJkIHVua25vd24gSVAgcGFja2V0IHRvIHVwcGVyIFRDUC9JUCAqLwogCQkJCQlERUJVR19JTkZPKCJOQVQyNTogUmVwbGFjZSBEQSB3aXRoIEJSJ3MgTUFDXG4iKTsKIAkJCQkJaWYgKCgqKHUzMiAqKXByaXYtPmJyX21hYykgPT0gMCAmJiAoKih1MTYgKikocHJpdi0+YnJfbWFjKzQpKSA9PSAwKSB7Ci0JCQkJCQlwcmludGsoIlJlLWluaXQgbmV0ZGV2X2JyX2luaXQoKSBkdWUgdG8gYnJfbWFjID09IDAhXG4iKTsKKwkJCQkJCW5ldGRldl9pbmZvKHNrYi0+ZGV2LAorCQkJCQkJCQkiUmUtaW5pdCBuZXRkZXZfYnJfaW5pdCgpIGR1ZSB0byBicl9tYWMgPT0gMCFcbiIpOwogCQkJCQkJbmV0ZGV2X2JyX2luaXQocHJpdi0+cG5ldGRldik7CiAJCQkJCX0KIAkJCQkJbWVtY3B5KHNrYi0+ZGF0YSwgcHJpdi0+YnJfbWFjLCBFVEhfQUxFTik7CkBAIC05MzIsNyArOTMzLDcgQEAKIAkJCQkJCShwaC0+Y29kZSA9PSBQQURPX0NPREUgPyAiUEFETyIgOiAiUEFEUyIpLAlza2ItPmRldi0+bmFtZSk7CiAJCQkJfSBlbHNlIHsgLyogIG5vdCBhZGQgcmVsYXkgdGFnICovCiAJCQkJCWlmICghcHJpdi0+cHBwb2VfY29ubmVjdGlvbl9pbl9wcm9ncmVzcykgewotCQkJCQkJREVCVUdfRVJSKCJEaXNjYXJkIFBQUG9FIHBhY2tldCBkdWUgdG8gbm8gY29ubmVjdGlvbiBpbiBwcm9ncmVzc3MhXG4iKTsKKwkJCQkJCURFQlVHX0VSUigiRGlzY2FyZCBQUFBvRSBwYWNrZXQgZHVlIHRvIG5vIGNvbm5lY3Rpb24gaW4gcHJvZ3Jlc3MhXG4iKTsKIAkJCQkJCXJldHVybiAtMTsKIAkJCQkJfQogCQkJCQltZW1jcHkoc2tiLT5kYXRhLCBwcml2LT5wcHBvZV9hZGRyLCBFVEhfQUxFTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2NtZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19jbWQuYwppbmRleCA4MmZlOGM0Li5jMmZiMDUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2NtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfY21kLmMKQEAgLTMyLDExICszMiwxMCBAQAogTm8gaXJxc2F2ZSBpcyBuZWNlc3NhcnkuCiAqLwogCi1pbnQJX3J0d19pbml0X2NtZF9wcml2IChzdHJ1Y3QJY21kX3ByaXYgKnBjbWRwcml2KQoraW50IF9ydHdfaW5pdF9jbWRfcHJpdihzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2KQogewogCWludCByZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJc2VtYV9pbml0KCYocGNtZHByaXYtPmNtZF9xdWV1ZV9zZW1hKSwgMCk7CiAJLyogc2VtYV9pbml0KCYocGNtZHByaXYtPmNtZF9kb25lX3NlbWEpLCAwKTsgKi8KQEAgLTcxLDcgKzcwLDYgQEAKIAlwY21kcHJpdi0+Y21kX2RvbmVfY250ID0gMDsKIAlwY21kcHJpdi0+cnNwX2NudCA9IDA7CiBleGl0OgotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtODEsMjQgKzc5LDIxIEBACiB7CiAJaW50IHJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAkvKiBhbGxvY2F0ZSBETUEtYWJsZS9Ob24tUGFnZSBtZW1vcnkgZm9yIGNtZF9idWYgYW5kIHJzcF9idWYgKi8KIAlhdG9taWNfc2V0KCZwZXZ0cHJpdi0+ZXZlbnRfc2VxLCAwKTsKIAlwZXZ0cHJpdi0+ZXZ0X2RvbmVfY250ID0gMDsKIAotCV9pbml0X3dvcmtpdGVtKCZwZXZ0cHJpdi0+YzJoX3drLCBjMmhfd2tfY2FsbGJhY2ssIE5VTEwpOworCUlOSVRfV09SSygmcGV2dHByaXYtPmMyaF93aywgYzJoX3drX2NhbGxiYWNrKTsKIAlwZXZ0cHJpdi0+YzJoX3drX2FsaXZlID0gZmFsc2U7CiAJcGV2dHByaXYtPmMyaF9xdWV1ZSA9IHJ0d19jYnVmX2FsbG9jKEMySF9RVUVVRV9NQVhfTEVOKzEpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CiAKLXZvaWQgcnR3X2ZyZWVfZXZ0X3ByaXYoc3RydWN0CWV2dF9wcml2ICpwZXZ0cHJpdikKK3ZvaWQgcnR3X2ZyZWVfZXZ0X3ByaXYoc3RydWN0IGV2dF9wcml2ICpwZXZ0cHJpdikKIHsKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfaW5mb18sICgiK3J0d19mcmVlX2V2dF9wcml2XG4iKSk7CiAKQEAgLTExMywyMSArMTA4LDE1IEBACiAJfQogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfaW5mb18sICgiLXJ0d19mcmVlX2V2dF9wcml2XG4iKSk7CiAKLV9mdW5jX2V4aXRfOwogfQogCi12b2lkIF9ydHdfZnJlZV9jbWRfcHJpdiAoc3RydWN0CWNtZF9wcml2ICpwY21kcHJpdikKK3ZvaWQgX3J0d19mcmVlX2NtZF9wcml2KHN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYpCiB7Ci1fZnVuY19lbnRlcl87CiAKIAlpZiAocGNtZHByaXYpIHsKLQkJaWYgKHBjbWRwcml2LT5jbWRfYWxsb2NhdGVkX2J1ZikKLQkJCWtmcmVlKHBjbWRwcml2LT5jbWRfYWxsb2NhdGVkX2J1Zik7Ci0KLQkJaWYgKHBjbWRwcml2LT5yc3BfYWxsb2NhdGVkX2J1ZikKLQkJCWtmcmVlKHBjbWRwcml2LT5yc3BfYWxsb2NhdGVkX2J1Zik7CisJCWtmcmVlKHBjbWRwcml2LT5jbWRfYWxsb2NhdGVkX2J1Zik7CisJCWtmcmVlKHBjbWRwcml2LT5yc3BfYWxsb2NhdGVkX2J1Zik7CiAJfQotX2Z1bmNfZXhpdF87CiB9CiAKIC8qCkBAIC0xNDAsMTEgKzEyOSwxMCBAQAogCiAqLwogCi1pbnQJX3J0d19lbnF1ZXVlX2NtZChzdHJ1Y3QgX19xdWV1ZSAqcXVldWUsIHN0cnVjdCBjbWRfb2JqICpvYmopCitpbnQgX3J0d19lbnF1ZXVlX2NtZChzdHJ1Y3QgX19xdWV1ZSAqcXVldWUsIHN0cnVjdCBjbWRfb2JqICpvYmopCiB7CiAJdW5zaWduZWQgbG9uZyBpcnFMOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAob2JqID09IE5VTEwpCiAJCWdvdG8gZXhpdDsKQEAgLTE1Nyw3ICsxNDUsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBfU1VDQ0VTUzsKIH0KQEAgLTE2Nyw0NyArMTU0LDM5IEBACiAJdW5zaWduZWQgbG9uZyBpcnFMOwogCXN0cnVjdCBjbWRfb2JqICpvYmo7CiAKLV9mdW5jX2VudGVyXzsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+bG9jaywgaXJxTCk7CiAJaWYgKHJ0d19pc19saXN0X2VtcHR5KCYocXVldWUtPnF1ZXVlKSkpIHsKIAkJb2JqID0gTlVMTDsKIAl9IGVsc2UgewotCQlvYmogPSBMSVNUX0NPTlRBSU5PUihnZXRfbmV4dCgmKHF1ZXVlLT5xdWV1ZSkpLCBzdHJ1Y3QgY21kX29iaiwgbGlzdCk7CisJCW9iaiA9IGNvbnRhaW5lcl9vZigoJnF1ZXVlLT5xdWV1ZSktPm5leHQsIHN0cnVjdCBjbWRfb2JqLCBsaXN0KTsKIAkJcnR3X2xpc3RfZGVsZXRlKCZvYmotPmxpc3QpOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlLT5sb2NrLCBpcnFMKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gb2JqOwogfQogCi11MzIJcnR3X2luaXRfY21kX3ByaXYoc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdikKK3UzMiBydHdfaW5pdF9jbWRfcHJpdihzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2KQogewogCXUzMglyZXM7Ci1fZnVuY19lbnRlcl87Ci0JcmVzID0gX3J0d19pbml0X2NtZF9wcml2IChwY21kcHJpdik7Ci1fZnVuY19leGl0XzsKKwlyZXMgPSBfcnR3X2luaXRfY21kX3ByaXYocGNtZHByaXYpOwogCXJldHVybiByZXM7CiB9CiAKLXUzMglydHdfaW5pdF9ldnRfcHJpdiAoc3RydWN0CWV2dF9wcml2ICpwZXZ0cHJpdikKK3UzMiBydHdfaW5pdF9ldnRfcHJpdihzdHJ1Y3QgZXZ0X3ByaXYgKnBldnRwcml2KQogewotCWludAlyZXM7Ci1fZnVuY19lbnRlcl87CisJaW50IHJlczsKIAlyZXMgPSBfcnR3X2luaXRfZXZ0X3ByaXYocGV2dHByaXYpOwotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJlczsKIH0KIAotdm9pZCBydHdfZnJlZV9jbWRfcHJpdihzdHJ1Y3QJY21kX3ByaXYgKnBjbWRwcml2KQordm9pZCBydHdfZnJlZV9jbWRfcHJpdihzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2KQogewotX2Z1bmNfZW50ZXJfOwogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfaW5mb18sICgicnR3X2ZyZWVfY21kX3ByaXZcbiIpKTsKIAlfcnR3X2ZyZWVfY21kX3ByaXYocGNtZHByaXYpOwotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyBpbnQgcnR3X2NtZF9maWx0ZXIoc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiwgc3RydWN0IGNtZF9vYmogKmNtZF9vYmopCkBAIC0yMzgsNyArMjE3LDYgQEAKIAlpbnQgcmVzID0gX0ZBSUw7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gcGNtZHByaXYtPnBhZGFwdGVyOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAoY21kX29iaiA9PSBOVUxMKQogCQlnb3RvIGV4aXQ7CkBAIC0yNTgsMzQgKzIzNiwyOCBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CiAKLXN0cnVjdAljbWRfb2JqCSpydHdfZGVxdWV1ZV9jbWQoc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdikKK3N0cnVjdCBjbWRfb2JqCSpydHdfZGVxdWV1ZV9jbWQoc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdikKIHsKIAlzdHJ1Y3QgY21kX29iaiAqY21kX29iajsKIAotX2Z1bmNfZW50ZXJfOwogCiAJY21kX29iaiA9IF9ydHdfZGVxdWV1ZV9jbWQoJnBjbWRwcml2LT5jbWRfcXVldWUpOwogCi1fZnVuY19leGl0XzsKIAlyZXR1cm4gY21kX29iajsKIH0KIAotdm9pZCBydHdfY21kX2Nscl9pc3Ioc3RydWN0CWNtZF9wcml2ICpwY21kcHJpdikKK3ZvaWQgcnR3X2NtZF9jbHJfaXNyKHN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYpCiB7Ci1fZnVuY19lbnRlcl87CiAJcGNtZHByaXYtPmNtZF9kb25lX2NudCsrOwogCS8qIHVwKCYocGNtZHByaXYtPmNtZF9kb25lX3NlbWEpKTsgKi8KLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19mcmVlX2NtZF9vYmooc3RydWN0IGNtZF9vYmogKnBjbWQpCiB7Ci1fZnVuY19lbnRlcl87CiAKIAlpZiAoKHBjbWQtPmNtZGNvZGUgIT0gX0pvaW5Cc3NfQ01EXykgJiYgKHBjbWQtPmNtZGNvZGUgIT0gX0NyZWF0ZUJzc19DTURfKSkgewogCQkvKiBmcmVlIHBhcm1idWYgaW4gY21kX29iaiAqLwpAQCAtMzAyLDcgKzI3NCw2IEBACiAJLyogZnJlZSBjbWRfb2JqICovCiAJa2ZyZWUocGNtZCk7CiAKLV9mdW5jX2V4aXRfOwogfQogCiBpbnQgcnR3X2NtZF90aHJlYWQodm9pZCAqY29udGV4dCkKQEAgLTMxNSw3ICsyODYsNiBAQAogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKWNvbnRleHQ7CiAJc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiA9ICYocGFkYXB0ZXItPmNtZHByaXYpOwogCi1fZnVuY19lbnRlcl87CiAKIAl0aHJlYWRfZW50ZXIoIlJUV19DTURfVEhSRUFEIik7CiAKQEAgLTQxMCw3ICszODAsNiBAQAogCiAJdXAoJnBjbWRwcml2LT50ZXJtaW5hdGVfY21kdGhyZWFkX3NlbWEpOwogCi1fZnVuY19leGl0XzsKIAogCWNvbXBsZXRlX2FuZF9leGl0KE5VTEwsIDApOwogfQpAQCAtNDIzLDE1ICszOTIsMTQgQEAKIAogCXU4IHJldCA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKLQlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CisJcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHBoMmMgPT0gTlVMTCkgewogCQlyZXQgPSBfRkFJTDsKIAkJZ290byBleGl0OwogCX0KIAotCXBzZXR1c2JzdXNwZW5kID0gKHN0cnVjdCB1c2Jfc3VzcGVuZF9wYXJtICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2Jfc3VzcGVuZF9wYXJtKSk7CisJcHNldHVzYnN1c3BlbmQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiX3N1c3BlbmRfcGFybSksIEdGUF9LRVJORUwpOwogCWlmIChwc2V0dXNic3VzcGVuZCA9PSBOVUxMKSB7CiAJCWtmcmVlKHBoMmMpOwogCQlyZXQgPSBfRkFJTDsKQEAgLTQ0Niw3ICs0MTQsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiB9CkBAIC00NjUsMTQgKzQzMiwxMSBAQAogCXN0cnVjdCBjbWRfcHJpdgkJKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwogCXN0cnVjdCBtbG1lX3ByaXYJKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKLV9mdW5jX2VudGVyXzsKLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpID09IHRydWUpIHsKKwlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpID09IHRydWUpCiAJCXJ0d19scHNfY3RybF93a19jbWQocGFkYXB0ZXIsIExQU19DVFJMX1NDQU4sIDEpOwotCX0KIAotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkgPT0gdHJ1ZSkgeworCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkgPT0gdHJ1ZSkKIAkJcDJwX3BzX3drX2NtZChwYWRhcHRlciwgUDJQX1BTX1NDQU4sIDEpOwotCX0KIAogCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGgyYyA9PSBOVUxMKQpAQCAtNTAwLDkgKzQ2NCw2IEBACiAJCQlpZiAoc3NpZFtpXS5Tc2lkTGVuZ3RoKSB7CiAJCQkJbWVtY3B5KCZwc3VydmV5UGFyYS0+c3NpZFtpXSwgJnNzaWRbaV0sIHNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfc3NpZCkpOwogCQkJCXBzdXJ2ZXlQYXJhLT5zc2lkX251bSsrOwotCQkJCWlmICgwKQotCQkJCURCR184OEUoRlVOQ19BRFBUX0ZNVCIgc3NpZDooJXMsICVkKVxuIiwgRlVOQ19BRFBUX0FSRyhwYWRhcHRlciksCi0JCQkJCXBzdXJ2ZXlQYXJhLT5zc2lkW2ldLlNzaWQsIHBzdXJ2ZXlQYXJhLT5zc2lkW2ldLlNzaWRMZW5ndGgpOwogCQkJfQogCQl9CiAJfQpAQCAtNTE0LDkgKzQ3NSw2IEBACiAJCQlpZiAoY2hbaV0uaHdfdmFsdWUgJiYgIShjaFtpXS5mbGFncyAmIFJUV19JRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCkpIHsKIAkJCQltZW1jcHkoJnBzdXJ2ZXlQYXJhLT5jaFtpXSwgJmNoW2ldLCBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCkpOwogCQkJCXBzdXJ2ZXlQYXJhLT5jaF9udW0rKzsKLQkJCQlpZiAoMCkKLQkJCQlEQkdfODhFKEZVTkNfQURQVF9GTVQiIGNoOiV1XG4iLCBGVU5DX0FEUFRfQVJHKHBhZGFwdGVyKSwKLQkJCQkJcHN1cnZleVBhcmEtPmNoW2ldLmh3X3ZhbHVlKTsKIAkJCX0KIAkJfQogCX0KQEAgLTUzNyw3ICs0OTUsNiBAQAogCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSk7CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC01NDksNyArNTA2LDYgQEAKIAlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBoMmMgPT0gTlVMTCkgewpAQCAtNTcwLDcgKzUyNiw2IEBACiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTU4Miw3ICs1MzcsNiBAQAogCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7CiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGgyYyA9PSBOVUxMKSB7CkBAIC02MDQsNyArNTU4LDYgQEAKIAlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOwogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtNjI0LDcgKzU3Nyw2IEBACiAJc3RydWN0IGNtZF9wcml2CSpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwaDJjID09IE5VTEwpIHsKQEAgLTY0OCw3ICs2MDAsNiBAQAogCiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIGV4aXQ6Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC02NTksNyArNjEwLDYgQEAKIAlzdHJ1Y3QgY21kX3ByaXYJKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwaDJjID09IE5VTEwpIHsKIAkJcmVzID0gX0ZBSUw7CkBAIC02ODAsNyArNjMwLDYgQEAKIAogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiBleGl0OgotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtNjkxLDcgKzY0MCw2IEBACiAJc3RydWN0IGNtZF9wcml2CSpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGgyYyA9PSBOVUxMKSB7CiAJCXJlcyA9IF9GQUlMOwpAQCAtNzE1LDcgKzY2Myw2IEBACiAKIAlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOwogZXhpdDoKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTcyNSw3ICs2NzIsNiBAQAogCXN0cnVjdCB3cml0ZVJGX3Bhcm0gKnB3cml0ZXJmcGFybTsKIAlzdHJ1Y3QgY21kX3ByaXYJKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwogCXU4CXJlcyA9IF9TVUNDRVNTOwotX2Z1bmNfZW50ZXJfOwogCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGgyYyA9PSBOVUxMKSB7CiAJCXJlcyA9IF9GQUlMOwpAQCAtNzQ2LDcgKzY5Miw2IEBACiAKIAlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOwogZXhpdDoKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTc1Nyw3ICs3MDIsNiBAQAogCXN0cnVjdCBjbWRfcHJpdgkqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7CiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGgyYyA9PSBOVUxMKSB7CkBAIC03ODUsMzMgKzcyOSwyOCBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CiAKIHZvaWQgcnR3X2dldGJicmZyZWdfY21kcnNwX2NhbGxiYWNrKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgIHN0cnVjdCBjbWRfb2JqICpwY21kKQogewotIF9mdW5jX2VudGVyXzsKIAogCWtmcmVlKHBjbWQtPnBhcm1idWYpOwogCWtmcmVlKHBjbWQpOwogCiAJaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYubXBfbW9kZSA9PSAxKQogCQlwYWRhcHRlci0+bXBwcml2LndvcmtwYXJhbS5iY29tcGxldGVkID0gdHJ1ZTsKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19yZWFkdHNzaV9jbWRyc3BfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCAgc3RydWN0IGNtZF9vYmogKnBjbWQpCiB7Ci0gX2Z1bmNfZW50ZXJfOwogCiAJa2ZyZWUocGNtZC0+cGFybWJ1Zik7CiAJa2ZyZWUocGNtZCk7CiAKIAlpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5tcF9tb2RlID09IDEpCiAJCXBhZGFwdGVyLT5tcHByaXYud29ya3BhcmFtLmJjb21wbGV0ZWQgPSB0cnVlOwotX2Z1bmNfZXhpdF87CiB9CiAKIHU4IHJ0d19jcmVhdGVic3NfY21kKHN0cnVjdCBhZGFwdGVyICAqcGFkYXB0ZXIpCkBAIC04MjIsNyArNzYxLDYgQEAKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGRldl9uZXR3b3JrID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXYuZGV2X25ldHdvcms7CiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCXJ0d19sZWRfY29udHJvbChwYWRhcHRlciwgTEVEX0NUTF9TVEFSVF9UT19MSU5LKTsKIApAQCAtODQ3LDcgKzc4NSw2IEBACiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwY21kKTsKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTg1OCw3ICs3OTUsNiBAQAogCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7CiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCXBjbWQgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGNtZCA9PSBOVUxMKSB7CkBAIC04NzcsNyArODEzLDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtODk4LDE1ICs4MzMsMTMgQEAKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAKLV9mdW5jX2VudGVyXzsKIAogCXJ0d19sZWRfY29udHJvbChwYWRhcHRlciwgTEVEX0NUTF9TVEFSVF9UT19MSU5LKTsKIAotCWlmIChwbWxtZXByaXYtPmFzc29jX3NzaWQuU3NpZExlbmd0aCA9PSAwKSB7CisJaWYgKHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5Tc2lkTGVuZ3RoID09IDApCiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfaW5mb18sICgiK0pvaW4gY21kOiBBbnkgU1NpZFxuIikpOwotCX0gZWxzZSB7CisJZWxzZQogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X25vdGljZV8sICgiK0pvaW4gY21kOiBTU2lkID1bJXNdXG4iLCBwbWxtZXByaXYtPmFzc29jX3NzaWQuU3NpZCkpOwotCX0KIAogCXBjbWQgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGNtZCA9PSBOVUxMKSB7CkBAIC05NTIsMTEgKzg4NSwxMCBAQAogCiAJcHNlY3VyaXR5cHJpdi0+YXV0aGVudGljYXRvcl9pZVswXSA9ICh1bnNpZ25lZCBjaGFyKXBzZWNuZXR3b3JrLT5JRUxlbmd0aDsKIAotCWlmICgocHNlY25ldHdvcmstPklFTGVuZ3RoLTEyKSA8ICgyNTYtMSkpIHsKKwlpZiAoKHBzZWNuZXR3b3JrLT5JRUxlbmd0aC0xMikgPCAoMjU2LTEpKQogCQltZW1jcHkoJnBzZWN1cml0eXByaXYtPmF1dGhlbnRpY2F0b3JfaWVbMV0sICZwc2VjbmV0d29yay0+SUVzWzEyXSwgcHNlY25ldHdvcmstPklFTGVuZ3RoLTEyKTsKLQl9IGVsc2UgeworCWVsc2UKIAkJbWVtY3B5KCZwc2VjdXJpdHlwcml2LT5hdXRoZW50aWNhdG9yX2llWzFdLCAmcHNlY25ldHdvcmstPklFc1sxMl0sICgyNTYtMSkpOwotCX0KIAogCXBzZWNuZXR3b3JrLT5JRUxlbmd0aCA9IDA7CiAJLyogIEFkZGVkIGJ5IEFsYmVydCAyMDA5LzAyLzE4ICovCkBAIC05ODcsOSArOTE5LDEyIEBACiAKIAlwaHRwcml2LT5odF9vcHRpb24gPSBmYWxzZTsKIAlpZiAocHJlZ2lzdHJ5cHJpdi0+aHRfZW5hYmxlKSB7Ci0JCS8qIAlBZGRlZCBieSBBbGJlcnQgMjAxMC8wNi8yMyAqLwotCQkvKiAJRm9yIHRoZSBXRVAgbW9kZSwgd2Ugd2lsbCB1c2UgdGhlIGJnIG1vZGUgdG8gZG8gdGhlIGNvbm5lY3Rpb24gdG8gYXZvaWQgc29tZSBJT1QgaXNzdWUuICovCi0JCS8qIAlFc3BlY2lhbGx5IGZvciBSZWFsdGVrIDgxOTJ1IFNvZnRBUC4gKi8KKwkJLyoKKwkJICogQWRkZWQgYnkgQWxiZXJ0IDIwMTAvMDYvMjMKKwkJICogRm9yIHRoZSBXRVAgbW9kZSwgd2Ugd2lsbCB1c2UgdGhlIGJnIG1vZGUgdG8gZG8KKwkJICogdGhlIGNvbm5lY3Rpb24gdG8gYXZvaWQgc29tZSBJT1QgaXNzdWUuCisJCSAqIEVzcGVjaWFsbHkgZm9yIFJlYWx0ZWsgODE5MnUgU29mdEFQLgorCQkgKi8KIAkJaWYgKChwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gIT0gX1dFUDQwXykgJiYKIAkJICAgIChwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gIT0gX1dFUDEwNF8pICYmCiAJCSAgICAocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtICE9IF9US0lQXykpIHsKQEAgLTEwMjAsNyArOTU1LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTAzMiw3ICs5NjYsNiBAQAogCXN0cnVjdCBjbWRfcHJpdiAqY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKIAl1OCByZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9ub3RpY2VfLCAoIitydHdfZGlzYXNzb2NfY21kXG4iKSk7CiAKQEAgLTEwNjMsNyArOTk2LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTA3Niw3ICsxMDA4LDYgQEAKIAlzdHJ1Y3QJY21kX3ByaXYgICAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7CiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGgyYyA9PSBOVUxMKSB7CkBAIC0xMDk4LDcgKzEwMjksNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xMTE1LDcgKzEwNDUsNiBAQAogCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gKHN0cnVjdCBzdGFfaW5mbyAqKXBzdGE7CiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGgyYyA9PSBOVUxMKSB7CkBAIC0xMTQyLDcgKzEwNzEsNyBAQAogCXBoMmMtPnJzcCA9ICh1OCAqKXBzZXRzdGFrZXlfcnNwOwogCXBoMmMtPnJzcHN6ID0gc2l6ZW9mKHN0cnVjdCBzZXRfc3Rha2V5X3JzcCk7CiAKLQltZW1jcHkocHNldHN0YWtleV9wYXJhLT5hZGRyLCBzdGEtPmh3YWRkciwgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShwc2V0c3Rha2V5X3BhcmEtPmFkZHIsIHN0YS0+aHdhZGRyKTsKIAogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkKIAkJcHNldHN0YWtleV9wYXJhLT5hbGdvcml0aG0gPSAodW5zaWduZWQgY2hhcikgcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobTsKQEAgLTExNjEsNyArMTA5MCw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTExNzUsNyArMTEwMyw2IEBACiAJc3RydWN0IHN0YV9pbmZvICpzdGEgPSAoc3RydWN0IHN0YV9pbmZvICopcHN0YTsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKCFlbnF1ZXVlKSB7CiAJCWNsZWFyX2NhbV9lbnRyeShwYWRhcHRlciwgZW50cnkpOwpAQCAtMTIwNSw3ICsxMTMyLDcgQEAKIAkJcGgyYy0+cnNwID0gKHU4ICopcHNldHN0YWtleV9yc3A7CiAJCXBoMmMtPnJzcHN6ID0gc2l6ZW9mKHN0cnVjdCBzZXRfc3Rha2V5X3JzcCk7CiAKLQkJbWVtY3B5KHBzZXRzdGFrZXlfcGFyYS0+YWRkciwgc3RhLT5od2FkZHIsIEVUSF9BTEVOKTsKKwkJZXRoZXJfYWRkcl9jb3B5KHBzZXRzdGFrZXlfcGFyYS0+YWRkciwgc3RhLT5od2FkZHIpOwogCiAJCXBzZXRzdGFrZXlfcGFyYS0+YWxnb3JpdGhtID0gX05PX1BSSVZBQ1lfOwogCkBAIC0xMjE1LDcgKzExNDIsNiBAQAogCX0KIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTEyMjYsNyArMTE1Miw2IEBACiAJc3RydWN0IHNldHJhdGFibGVfcGFybSAqcHNldHJ0dGJscGFybTsKIAlzdHJ1Y3QgY21kX3ByaXYJKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwogCXU4CXJlcyA9IF9TVUNDRVNTOwotX2Z1bmNfZW50ZXJfOwogCiAJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwaDJjID09IE5VTEwpIHsKQEAgLTEyNDcsNyArMTE3Miw2IEBACiAKIAlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOwogZXhpdDoKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTEyNTcsNyArMTE4MSw2IEBACiAJc3RydWN0IGdldHJhdGFibGVfcGFybSAqcGdldHJ0dGJscGFybTsKIAlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwogCXU4CXJlcyA9IF9TVUNDRVNTOwotX2Z1bmNfZW50ZXJfOwogCiAJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwaDJjID09IE5VTEwpIHsKQEAgLTEyNzIsOCArMTE5NSw2IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLS8qIAlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwc2V0cnR0YmxwYXJtLCBHRU5fQ01EX0NPREUoX1NldFJhVGFibGUpKTsgKi8KLQogCV9ydHdfaW5pdF9saXN0aGVhZCgmcGgyYy0+bGlzdCk7CiAJcGgyYy0+Y21kY29kZSA9IEdFTl9DTURfQ09ERShfR2V0UmFUYWJsZSk7CiAJcGgyYy0+cGFybWJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopcGdldHJ0dGJscGFybTsKQEAgLTEyODUsNyArMTIwNiw2IEBACiAKIAlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOwogZXhpdDoKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTEyOTgsNyArMTIxOCw2IEBACiAKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwaDJjID09IE5VTEwpIHsKQEAgLTEzMjQsMTYgKzEyNDMsMTUgQEAKIAlwaDJjLT5yc3AgPSAodTggKilwc2V0YXNzb2NzdGFfcnNwOwogCXBoMmMtPnJzcHN6ID0gc2l6ZW9mKHN0cnVjdCBzZXRfYXNzb2NzdGFfcnNwKTsKIAotCW1lbWNweShwc2V0YXNzb2NzdGFfcGFyYS0+YWRkciwgbWFjX2FkZHIsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkocHNldGFzc29jc3RhX3BhcmEtPmFkZHIsIG1hY19hZGRyKTsKIAogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKLSB9Cit9CiAKIHU4IHJ0d19hZGRiYXJlcV9jbWQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCB0aWQsIHU4ICphZGRyKQogewpAQCAtMTM0Miw3ICsxMjYwLDYgQEAKIAlzdHJ1Y3QgYWRkQmFSZXFfcGFybSAqcGFkZGJhcmVxX3Bhcm07CiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGgyYyA9PSBOVUxMKSB7CkBAIC0xMzY5LDcgKzEyODYsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xMzgxLDcgKzEyOTcsNiBAQAogCXN0cnVjdCBjbWRfcHJpdgkqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7CiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGgyYyA9PSBOVUxMKSB7CkBAIC0xNDA2LDcgKzEzMjEsNiBAQAogCS8qIHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7ICovCiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIGV4aXQ6Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC0xNDE4LDcgKzEzMzIsNiBAQAogCiAJdTggcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCURCR184OEUoRlVOQ19OREVWX0ZNVCIgY2g6JXUsIGJ3OiV1LCBjaF9vZmZzZXQ6JXVcbiIsCiAJCUZVTkNfTkRFVl9BUkcocGFkYXB0ZXItPnBuZXRkZXYpLCBjaCwgYncsIGNoX29mZnNldCk7CkBAIC0xNDYwLDcgKzEzNzMsNiBAQAogCiAJREJHXzg4RShGVU5DX05ERVZfRk1UIiByZXM6JXVcbiIsIEZVTkNfTkRFVl9BUkcocGFkYXB0ZXItPnBuZXRkZXYpLCByZXMpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xNDczLDcgKzEzODUsNiBAQAogCiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfbm90aWNlXywgKCIrcnR3X3NldF9jaHBsYW5fY21kXG4iKSk7CiAKQEAgLTE1MTYsNyArMTQyNyw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTE1MjksNyArMTQzOSw2IEBACiAKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9ub3RpY2VfLCAoIitydHdfbGVkX2JsaW5rX2NtZFxuIikpOwogCkBAIC0xNTUzLDcgKzE0NjIsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xNTY2LDcgKzE0NzQsNiBAQAogCiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfbm90aWNlXywgKCIrcnR3X3NldF9jc2FfY21kXG4iKSk7CiAKQEAgLTE1OTAsNyArMTQ5Nyw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTE2ODUsNyArMTU5MSw2IEBACiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJihwYWRhcHRlci0+bWxtZXByaXYpOwogCXU4CW1zdGF0dXM7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmICgoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSA9PSB0cnVlKSB8fAogCSAgICAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpID09IHRydWUpKQpAQCAtMTcyNCw3ICsxNjI5LDYgQEAKIAkJYnJlYWs7CiAJfQogCi1fZnVuY19leGl0XzsKIH0KIAogdTggcnR3X2xwc19jdHJsX3drX2NtZChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGxwc19jdHJsX3R5cGUsIHU4IGVucXVldWUpCkBAIC0xNzM1LDExICsxNjM5LDYgQEAKIAkvKiBzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJscHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7ICovCiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKLQotCS8qIGlmICghcHdyY3RybHByaXYtPmJMZWlzdXJlUHMpICovCi0JLyogCXJldHVybiByZXM7ICovCi0KIAlpZiAoZW5xdWV1ZSkgewogCQlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJCWlmIChwaDJjID09IE5VTEwpIHsKQEAgLTE3NjcsNyArMTY2Niw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTE3ODUsNyArMTY4Myw2IEBACiAKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGgyYyA9PSBOVUxMKSB7CiAJCXJlcyA9IF9GQUlMOwpAQCAtMTgwNiw3ICsxNzAzLDYgQEAKIAlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOwogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTgyNCw3ICsxNzIwLDYgQEAKIAl1OAlzdXBwb3J0X2FudF9kaXY7CiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAlydHdfaGFsX2dldF9kZWZfdmFyKHBhZGFwdGVyLCBIQUxfREVGX0lTX1NVUFBPUlRfQU5UX0RJViwgJnN1cHBvcnRfYW50X2Rpdik7CiAJaWYgKCFzdXBwb3J0X2FudF9kaXYpCiAJCXJldHVybiByZXM7CkBAIC0xODU0LDcgKzE3NDksNiBAQAogCX0KIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTE4NzMsNyArMTc2Nyw2IEBACiAJc3RydWN0IGNtZF9wcml2CSpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHJ0d19wMnBfY2hrX3N0YXRlKHB3ZGluZm8sIFAyUF9TVEFURV9OT05FKSkKIAkJcmV0dXJuIHJlczsKQEAgLTE4OTIsOCArMTc4NSw4IEBACiAJfQogCiAJcGRydmV4dHJhX2NtZF9wYXJtLT5lY19pZCA9IFAyUF9QUk9UT19XS19DSUQ7Ci0JcGRydmV4dHJhX2NtZF9wYXJtLT50eXBlX3NpemUgPSBpbnRDbWRUeXBlOwkvKiAJQXMgdGhlIGNvbW1hbmQgdHBwZS4gKi8KLQlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnBidWYgPSBOVUxMOwkJLyogCU11c3QgYmUgTlVMTCBoZXJlICovCisJcGRydmV4dHJhX2NtZF9wYXJtLT50eXBlX3NpemUgPSBpbnRDbWRUeXBlOyAvKiBBcyB0aGUgY29tbWFuZCB0cHBlLiAqLworCXBkcnZleHRyYV9jbWRfcGFybS0+cGJ1ZiA9IE5VTEw7CSAgICAvKiBNdXN0IGJlIE5VTEwgaGVyZSAqLwogCiAJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcGRydmV4dHJhX2NtZF9wYXJtLCBHRU5fQ01EX0NPREUoX1NldF9EcnZfRXh0cmEpKTsKIApAQCAtMTkwMSw3ICsxNzk0LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTkxNCw3ICsxODA2LDYgQEAKIAlzdHJ1Y3QgY21kX3ByaXYJKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwogCiAJdTgJcmVzID0gX1NVQ0NFU1M7Ci1fZnVuY19lbnRlcl87CiAKIAlwcHNjbWQgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocHBzY21kID09IE5VTEwpIHsKQEAgLTE5MzcsNyArMTgyOCw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTIwODQsMTIgKzE5NzQsMTYgQEAKIAlldnRwcml2LT5jMmhfd2tfYWxpdmUgPSB0cnVlOwogCiAJd2hpbGUgKCFydHdfY2J1Zl9lbXB0eShldnRwcml2LT5jMmhfcXVldWUpKSB7Ci0JCWlmICgoYzJoX2V2dCA9IChzdHJ1Y3QgYzJoX2V2dF9oZHIgKilydHdfY2J1Zl9wb3AoZXZ0cHJpdi0+YzJoX3F1ZXVlKSkgIT0gTlVMTCkgeworCQljMmhfZXZ0ID0gKHN0cnVjdCBjMmhfZXZ0X2hkciAqKQorCQkJcnR3X2NidWZfcG9wKGV2dHByaXYtPmMyaF9xdWV1ZSk7CisJCWlmIChjMmhfZXZ0ICE9IE5VTEwpCiAJCQkvKiBUaGlzIEMySCBldmVudCBpcyByZWFkLCBjbGVhciBpdCAqLwogCQkJYzJoX2V2dF9jbGVhcihhZGFwdGVyKTsKLQkJfSBlbHNlIGlmICgoYzJoX2V2dCA9IChzdHJ1Y3QgYzJoX2V2dF9oZHIgKilydHdfbWFsbG9jKDE2KSkgIT0gTlVMTCkgeworCQllbHNlIHsKKwkJCWMyaF9ldnQgPSAoc3RydWN0IGMyaF9ldnRfaGRyICopcnR3X21hbGxvYygxNik7CiAJCQkvKiBUaGlzIEMySCBldmVudCBpcyBub3QgcmVhZCwgcmVhZCAmIGNsZWFyIG5vdyAqLwotCQkJaWYgKGMyaF9ldnRfcmVhZChhZGFwdGVyLCAodTggKiljMmhfZXZ0KSAhPSBfU1VDQ0VTUykKKwkJCWlmIChjMmhfZXZ0ICE9IE5VTEwgJiYKKwkJCSAgICBjMmhfZXZ0X3JlYWQoYWRhcHRlciwgKHU4ICopYzJoX2V2dCkgIT0gX1NVQ0NFU1MpCiAJCQkJY29udGludWU7CiAJCX0KIApAQCAtMjE0Nyw4ICsyMDQxLDEwIEBACiAJCXAycF9wc193a19oZGwocGFkYXB0ZXIsIHBkcnZleHRyYV9jbWQtPnR5cGVfc2l6ZSk7CiAJCWJyZWFrOwogCWNhc2UgUDJQX1BST1RPX1dLX0NJRDoKLQkJLyogCUNvbW1lbnRlZCBieSBBbGJlcnQgMjAxMS8wNy8wMSAqLwotCQkvKiAJSSB1c2VkIHRoZSB0eXBlX3NpemUgYXMgdGhlIHR5cGUgY29tbWFuZCAqLworCQkvKgorCQkgKiBDb21tZW50ZWQgYnkgQWxiZXJ0IDIwMTEvMDcvMDEKKwkJICogSSB1c2VkIHRoZSB0eXBlX3NpemUgYXMgdGhlIHR5cGUgY29tbWFuZAorCQkgKi8KIAkJcDJwX3Byb3RvY29sX3drX2hkbChwYWRhcHRlciwgcGRydmV4dHJhX2NtZC0+dHlwZV9zaXplKTsKIAkJYnJlYWs7CiAjZW5kaWYKQEAgLTIxNzQsMTMgKzIwNzAsMTIgQEAKIHsKIAlzdHJ1Y3QJbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocGNtZC0+cmVzID09IEgyQ19EUk9QUEVEKSB7CiAJCS8qIFRPRE86IGNhbmNlbCB0aW1lciBhbmQgZG8gdGltZW91dCBoYW5kbGVyIGRpcmVjdGx5Li4uICovCiAJCS8qIG5lZWQgdG8gbWFrZSB0aW1lb3V0IGhhbmRsZXJPUyBpbmRlcGVuZGVudCAqLwogCQlfc2V0X3RpbWVyKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIsIDEpOwotCQl9IGVsc2UgaWYgKHBjbWQtPnJlcyAhPSBIMkNfU1VDQ0VTUykgeworCX0gZWxzZSBpZiAocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKSB7CiAJCV9zZXRfdGltZXIoJnBtbG1lcHJpdi0+c2Nhbl90b190aW1lciwgMSk7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywgKCJcbiAqKioqKioqKkVycm9yOiBNZ250QWN0cnR3X3NldF84MDJfMTFfYnNzaWRfTElTVF9TQ0FOIEZhaWwgKioqKioqKioqKioqXG5cbi4iKSk7CiAJfQpAQCAtMjE4OCwxMyArMjA4MywxMSBAQAogCS8qICBmcmVlIGNtZCAqLwogCXJ0d19mcmVlX2NtZF9vYmoocGNtZCk7CiAKLV9mdW5jX2V4aXRfOwogfQogdm9pZCBydHdfZGlzYXNzb2NfY21kX2NhbGxiYWNrKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IGNtZF9vYmogKnBjbWQpCiB7CiAJc3RydWN0CW1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBjbWQtPnJlcyAhPSBIMkNfU1VDQ0VTUykgewogCQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7CkBAIC0yMjAyLDI0ICsyMDk1LDE4IEBACiAJCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwogCiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywgKCJcbiAqKipFcnJvcjogZGlzY29ubmVjdF9jbWRfY2FsbGJhY2sgRmFpbCAqKipcbi4iKSk7Ci0KLQkJZ290byBleGl0OworCQlyZXR1cm47CiAJfSBlbHNlIC8qIGNsZWFyIGJyaWRnZSBkYXRhYmFzZSAqLwogCQluYXQyNV9kYl9jbGVhbnVwKHBhZGFwdGVyKTsKIAogCS8qICBmcmVlIGNtZCAqLwogCXJ0d19mcmVlX2NtZF9vYmoocGNtZCk7Ci0KLWV4aXQ6Ci0KLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19qb2luYnNzX2NtZF9jYWxsYmFjayhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsICBzdHJ1Y3QgY21kX29iaiAqcGNtZCkKIHsKIAlzdHJ1Y3QJbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocGNtZC0+cmVzID09IEgyQ19EUk9QUEVEKSB7CiAJCS8qIFRPRE86IGNhbmNlbCB0aW1lciBhbmQgZG8gdGltZW91dCBoYW5kbGVyIGRpcmVjdGx5Li4uICovCkBAIC0yMjMyLDcgKzIxMTksNiBAQAogCiAJcnR3X2ZyZWVfY21kX29iaihwY21kKTsKIAotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X2NyZWF0ZWJzc19jbWRfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgY21kX29iaiAqcGNtZCkKQEAgLTIyNDQsOSArMjEzMCw4IEBACiAJc3RydWN0IHdsYW5fYnNzaWRfZXggKnBuZXR3b3JrID0gKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICopcGNtZC0+cGFybWJ1ZjsKIAlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICp0Z3RfbmV0d29yayA9ICYocG1sbWVwcml2LT5jdXJfbmV0d29yayk7CiAKLV9mdW5jX2VudGVyXzsKIAotCWlmICgocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKSkgeworCWlmIChwY21kLT5yZXMgIT0gSDJDX1NVQ0NFU1MpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLCAoIlxuICoqKioqKioqRXJyb3I6IHJ0d19jcmVhdGVic3NfY21kX2NhbGxiYWNrICBGYWlsICoqKioqKioqKioqKlxuXG4uIikpOwogCQlfc2V0X3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLCAxKTsKIAl9CkBAIC0yMjYxLDcgKzIxNDYsNyBAQAogCQkJcHN0YSA9IHJ0d19hbGxvY19zdGFpbmZvKCZwYWRhcHRlci0+c3RhcHJpdiwgcG5ldHdvcmstPk1hY0FkZHJlc3MpOwogCQkJaWYgKHBzdGEgPT0gTlVMTCkgewogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywgKCJcbkNhbid0IGFsbG9jIHN0YV9pbmZvIHdoZW4gY3JlYXRlYnNzX2NtZF9jYWxsYmFja1xuIikpOwotCQkJCWdvdG8gY3JlYXRlYnNzX2NtZF9mYWlsIDsKKwkJCQlnb3RvIGNyZWF0ZWJzc19jbWRfZmFpbDsKIAkJCX0KIAkJfQogCkBAIC0yMjk4LDcgKzIxODMsNiBAQAogCiAJcnR3X2ZyZWVfY21kX29iaihwY21kKTsKIAotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X3NldHN0YUtleV9jbWRyc3BfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCAgc3RydWN0IGNtZF9vYmogKnBjbWQpCkBAIC0yMzA3LDcgKzIxOTEsNiBAQAogCXN0cnVjdCBzZXRfc3Rha2V5X3JzcCAqcHNldHN0YWtleV9yc3AgPSAoc3RydWN0IHNldF9zdGFrZXlfcnNwICopKHBjbWQtPnJzcCk7CiAJc3RydWN0IHN0YV9pbmZvICpwc3RhID0gcnR3X2dldF9zdGFpbmZvKHBzdGFwcml2LCBwc2V0c3Rha2V5X3JzcC0+YWRkcik7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwc3RhID09IE5VTEwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLCAoIlxuRVJST1I6IHJ0d19zZXRzdGFLZXlfY21kcnNwX2NhbGxiYWNrID0+IGNhbid0IGdldCBzdGFfaW5mb1xuXG4iKSk7CkBAIC0yMzE1LDcgKzIxOTgsNiBAQAogCX0KIGV4aXQ6CiAJcnR3X2ZyZWVfY21kX29iaihwY21kKTsKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19zZXRhc3NvY3N0YV9jbWRyc3BfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCAgc3RydWN0IGNtZF9vYmogKnBjbWQpCkBAIC0yMzI2LDcgKzIyMDgsNiBAQAogCXN0cnVjdCBzZXRfYXNzb2NzdGFfcnNwICpwYXNzb2NzdGFfcnNwID0gKHN0cnVjdCBzZXRfYXNzb2NzdGFfcnNwICopKHBjbWQtPnJzcCk7CiAJc3RydWN0IHN0YV9pbmZvICpwc3RhID0gcnR3X2dldF9zdGFpbmZvKHBzdGFwcml2LCBwYXNzb2NzdGFfcGFybS0+YWRkcik7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwc3RhID09IE5VTEwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLCAoIlxuRVJST1I6IHNldGFzc29jc3RhX2NtZHJzcF9jYWxsYmFjID0+IGNhbid0IGdldCBzdGFfaW5mb1xuXG4iKSk7CkBAIC0yMzQ3LDUgKzIyMjgsNCBAQAogZXhpdDoKIAlydHdfZnJlZV9jbWRfb2JqKHBjbWQpOwogCi1fZnVuY19leGl0XzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfZGVidWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfZGVidWcuYwppbmRleCBhZjMyMDQxLi4yYmViMjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2RlYnVnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19kZWJ1Zy5jCkBAIC0yMzMsNyArMjMzLDcgQEAKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwogCWludCBsZW4gPSAwOwogCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiY3VyX2NoPSVkLCBjdXJfYnc9JWQsIGN1cl9jaF9vZmZldD0lZFxuIiwKKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJjdXJfY2g9JWQsIGN1cl9idz0lZCwgY3VyX2NoX29mZnNldD0lZFxuIiwKIAkJCQkJcG1sbWVleHQtPmN1cl9jaGFubmVsLCBwbWxtZWV4dC0+Y3VyX2J3bW9kZSwgcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQpOwogCSplb2YgPSAxOwogCXJldHVybiBsZW47CkBAIC03ODMsNyArNzgzLDcgQEAKIAlpZiAoYnVmZmVyICYmICFjb3B5X2Zyb21fdXNlcih0bXAsIGJ1ZmZlciwgc2l6ZW9mKHRtcCkpKSB7CiAJCWlmIChwcmVncHJpdikgewogCQkJcHJlZ3ByaXYtPnJ4X3N0YmMgPSBtb2RlOwotCQkJcHJpbnRrKCJyeF9zdGJjPSVkXG4iLCBtb2RlKTsKKwkJCW5ldGRldl9pbmZvKGRldiwgInJ4X3N0YmM9JWRcbiIsIG1vZGUpOwogCQl9CiAJfQogCXJldHVybiBjb3VudDsKQEAgLTgyMCw3ICs4MjAsNyBAQAogCiAJCWlmIChlbmFibGUpIHsKIAkJCURCR184OEUoIlR1cm4gT24gUnggUlNTSSBEaXNwbGF5IEZ1bmN0aW9uXG4iKTsKLQkJCXBhZGFwdGVyLT5iUnhSU1NJRGlzcGxheSA9IGVuYWJsZSA7CisJCQlwYWRhcHRlci0+YlJ4UlNTSURpc3BsYXkgPSBlbmFibGU7CiAJCX0gZWxzZSB7CiAJCQlEQkdfODhFKCJUdXJuIE9mZiBSeCBSU1NJIERpc3BsYXkgRnVuY3Rpb25cbiIpOwogCQkJcGFkYXB0ZXItPmJSeFJTU0lEaXNwbGF5ID0gMDsKQEAgLTg1MSwxMiArODUxLDEyIEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgTlVNX1NUQTsgaSsrKSB7CiAJCXBoZWFkID0gJihwc3RhcHJpdi0+c3RhX2hhc2hbaV0pOwotCQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwkJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCQl3aGlsZSAoKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpID09IGZhbHNlKSB7Ci0JCQlwc3RhID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgaGFzaF9saXN0KTsKKwkJCXBzdGEgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgaGFzaF9saXN0KTsKIAotCQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCiAJCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJzdGEncyBtYWNhZGRyOiAlcE1cbiIsIHBzdGEtPmh3YWRkcik7CiAJCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJydHNlbj0lZCwgY3RzMnNsZWY9JWRcbiIsIHBzdGEtPnJ0c2VuLCBwc3RhLT5jdHMyc2VsZik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2VmdXNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2VmdXNlLmMKaW5kZXggNjE0OWUzYS4uNDBhZmU0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19lZnVzZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfZWZ1c2UuYwpAQCAtNzYsMTEgKzc2LDEwIEBACiB7CiAJaWYgKE9mZnNldCA+PSBFRlVTRV9NQVhfSFdfU0laRSkKIAkJcmV0dXJuIGZhbHNlOwotCWlmIChmYWtlRWZ1c2VCYW5rID09IDApIHsKKwlpZiAoZmFrZUVmdXNlQmFuayA9PSAwKQogCQlmYWtlRWZ1c2VDb250ZW50W09mZnNldF0gPSBWYWx1ZTsKLQl9IGVsc2UgeworCWVsc2UKIAkJZmFrZUJURWZ1c2VDb250ZW50W2Zha2VFZnVzZUJhbmstMV1bT2Zmc2V0XSA9IFZhbHVlOwotCX0KIAlyZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMTU2LDE3ICsxNTUsMTUgQEAKIAlyZXR1cm4gd29yZF9jbnRzOwogfQogCi0vKiAgKi8KLS8qIAlEZXNjcmlwdGlvbjogKi8KLS8qIAkJRXhlY3V0ZSBFLUZ1c2UgcmVhZCBieXRlIG9wZXJhdGlvbi4gKi8KLS8qIAkJUmVmZXJyZWQgZnJvbSBTRDEgUmljaGFyZC4gKi8KLS8qICAqLwotLyogCUFzc3VtcHRpb246ICovCi0vKiAJCTEuIEJvb3QgZnJvbSBFLUZ1c2UgYW5kIHN1Y2Nlc3NmdWxseSBhdXRvLWxvYWQuICovCi0vKiAJCTIuIFBBU1NJVkVfTEVWRUwgKFVTQiBpbnRlcmZhY2UpICovCi0vKiAgKi8KLS8qIAlDcmVhdGVkIGJ5IFJvZ2VyLCAyMDA4LjEwLjIxLiAqLwotLyogICovCisvKgorICogRGVzY3JpcHRpb246CisgKiBFeGVjdXRlIEUtRnVzZSByZWFkIGJ5dGUgb3BlcmF0aW9uLgorICogUmVmZXJyZWQgZnJvbSBTRDEgUmljaGFyZC4KKyAqIEFzc3VtcHRpb246CisgKgkJMS4gQm9vdCBmcm9tIEUtRnVzZSBhbmQgc3VjY2Vzc2Z1bGx5IGF1dG8tbG9hZC4KKyAqCQkyLiBQQVNTSVZFX0xFVkVMIChVU0IgaW50ZXJmYWNlKQorICogQ3JlYXRlZCBieSBSb2dlciwgMjAwOC4xMC4yMS4KKyAqLwogdm9pZAogUmVhZEVGdXNlQnl0ZSgKIAkJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIsCkBAIC0yMTAsMjMgKzIwNywyMSBAQAogCSpwYnVmID0gKHU4KSh2YWx1ZTMyICYgMHhmZik7CiB9CiAKLS8qICAqLwotLyogCURlc2NyaXB0aW9uOiAqLwotLyogCQkxLiBFeGVjdXRlIEUtRnVzZSByZWFkIGJ5dGUgb3BlcmF0aW9uIGFjY29yZGluZyBhcyBtYXAgb2Zmc2V0IGFuZCAqLwotLyogCQkgICAgc2F2ZSB0byBFLUZ1c2UgdGFibGUuICovCi0vKiAJCTIuIFJlZmVycmVkIGZyb20gU0QxIFJpY2hhcmQuICovCi0vKiAgKi8KLS8qIAlBc3N1bXB0aW9uOiAqLwotLyogCQkxLiBCb290IGZyb20gRS1GdXNlIGFuZCBzdWNjZXNzZnVsbHkgYXV0by1sb2FkLiAqLwotLyogCQkyLiBQQVNTSVZFX0xFVkVMIChVU0IgaW50ZXJmYWNlKSAqLwotLyogICovCi0vKiAJQ3JlYXRlZCBieSBSb2dlciwgMjAwOC4xMC4yMS4gKi8KLS8qICAqLwotLyogCTIwMDgvMTIvMTIgTUgJMS4gUmVvcmdhbml6ZSBjb2RlIGZsb3cgYW5kIHJlc2VydmUgYnl0ZXMuIGFuZCBhZGQgZGVzY3JpcHRpb24uICovCi0vKiAJCQkJCTIuIEFkZCBlZnVzZSB1dGlsaXphdGlvbiBjb2xsZWN0LiAqLwotLyogCTIwMDgvMTIvMjIgTUgJUmVhZCBFZnVzZSBtdXN0IGNoZWNrIGlmIHdlIHdyaXRlIHNlY3Rpb24gMSBkYXRhIGFnYWluISEhIFNlYzEgKi8KLS8qIAkJCQkJd3JpdGUgYWRkciBtdXN0IGJlIGFmdGVyIHNlYzUuICovCi0vKiAgKi8KKy8qIERlc2NyaXB0aW9uOgorICoJMS4gRXhlY3V0ZSBFLUZ1c2UgcmVhZCBieXRlIG9wZXJhdGlvbiBhY2NvcmRpbmcgYXMgbWFwIG9mZnNldCBhbmQKKyAqCXNhdmUgdG8gRS1GdXNlIHRhYmxlLgorICoJMi4gUmVmZXJyZWQgZnJvbSBTRDEgUmljaGFyZC4KKyAqIEFzc3VtcHRpb246CisgKgkxLiBCb290IGZyb20gRS1GdXNlIGFuZCBzdWNjZXNzZnVsbHkgYXV0by1sb2FkLgorICoJMi4gUEFTU0lWRV9MRVZFTCAoVVNCIGludGVyZmFjZSkKKyAqCUNyZWF0ZWQgYnkgUm9nZXIsIDIwMDguMTAuMjEuCisgKiAyMDA4LzEyLzEyIE1ICisgKgkxLiBSZW9yZ2FuaXplIGNvZGUgZmxvdyBhbmQgcmVzZXJ2ZSBieXRlcy4gYW5kIGFkZCBkZXNjcmlwdGlvbi4KKyAqCTIuIEFkZCBlZnVzZSB1dGlsaXphdGlvbiBjb2xsZWN0LgorICogMjAwOC8xMi8yMiBNSAorICoJUmVhZCBFZnVzZSBtdXN0IGNoZWNrIGlmIHdlIHdyaXRlIHNlY3Rpb24gMSBkYXRhIGFnYWluISEhCisgKglTZWMxIHdyaXRlIGFkZHIgbXVzdCBiZSBhZnRlciBzZWM1LgorICovCiAKIHN0YXRpYyB2b2lkIGVmdXNlX1JlYWRFRnVzZShzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciwgdTggZWZ1c2VUeXBlLCB1MTYgX29mZnNldCwgdTE2IF9zaXplX2J5dGUsIHU4ICpwYnVmLCBib29sIHBzZXVkbykKIHsKQEAgLTQ1MCw3ICs0NDUsNyBAQAogewogCWludCBpID0gMDsKIAl1MTYgcmVhbF9jb250ZW50X2xlbiA9IDAsIG1heF9hdmFpbGFibGVfc2l6ZSA9IDA7Ci0JdTggcmVzID0gX0ZBSUwgOworCXU4IHJlcyA9IF9GQUlMOwogCXU4ICgqcnc4KShzdHJ1Y3QgYWRhcHRlciAqLCB1MTYsIHU4Kik7CiAKIAlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24ocGFkYXB0ZXIsIEVGVVNFX1dJRkksIFRZUEVfRUZVU0VfUkVBTF9DT05URU5UX0xFTiwgKHZvaWQgKikmcmVhbF9jb250ZW50X2xlbiwgZmFsc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pZWVlODAyMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaWVlZTgwMjExLmMKaW5kZXggZTZmOThmYi4uMDU1MjAxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pZWVlODAyMTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2llZWU4MDIxMS5jCkBAIC0xNDcsNyArMTQ3LDYgQEAKIAl1aW50ICpmcmxlbiAvKiBmcmFtZSBsZW5ndGggKi8KICkKIHsKLV9mdW5jX2VudGVyXzsKIAkqcGJ1ZiA9ICh1OClpbmRleDsKIAogCSoocGJ1ZiArIDEpID0gKHU4KWxlbjsKQEAgLTE1Nyw3ICsxNTYsNiBAQAogCiAJKmZybGVuID0gKmZybGVuICsgKGxlbiArIDIpOwogCi1fZnVuY19leGl0XzsKIAlyZXR1cm4gcGJ1ZiArIGxlbiArIDI7CiB9CiAKQEAgLTIyMSwxMSArMjE5LDggQEAKIHsKIAlpbnQgdG1wLCBpOwogCXU4ICpwOwotX2Z1bmNfZW50ZXJfOwotCWlmIChsaW1pdCA8IDEpIHsKLQkJX2Z1bmNfZXhpdF87CisJaWYgKGxpbWl0IDwgMSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJcCA9IHBidWY7CiAJaSA9IDA7CkBAIC0yNDIsNyArMjM3LDYgQEAKIAkJaWYgKGkgPj0gbGltaXQpCiAJCQlicmVhazsKIAl9Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMjczLDcgKzI2Nyw3IEBACiAJY250ID0gMDsKIAogCXdoaWxlIChjbnQgPCBpbl9sZW4pIHsKLQkJaWYgKGVpZCA9PSBpbl9pZVtjbnRdICYmICghb3VpIHx8IF9ydHdfbWVtY21wKCZpbl9pZVtjbnQrMl0sIG91aSwgb3VpX2xlbikpKSB7CisJCWlmIChlaWQgPT0gaW5faWVbY250XSAmJiAoIW91aSB8fCAhbWVtY21wKCZpbl9pZVtjbnQrMl0sIG91aSwgb3VpX2xlbikpKSB7CiAJCQl0YXJnZXRfaWUgPSAmaW5faWVbY250XTsKIAogCQkJaWYgKGllKQpAQCAtMzM5LDcgKzMzMyw2IEBACiAKIHZvaWQgcnR3X3NldF9zdXBwb3J0ZWRfcmF0ZSh1OCAqU3VwcG9ydGVkUmF0ZXMsIHVpbnQgbW9kZSkKIHsKLV9mdW5jX2VudGVyXzsKIAogCV9ydHdfbWVtc2V0KFN1cHBvcnRlZFJhdGVzLCAwLCBORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVgpOwogCkBAIC0zNjEsMTMgKzM1NCwxMSBAQAogCQltZW1jcHkoU3VwcG9ydGVkUmF0ZXMgKyBJRUVFODAyMTFfQ0NLX1JBVEVfTEVOLCBXSUZJX09GRE1SQVRFUywgSUVFRTgwMjExX05VTV9PRkRNX1JBVEVTTEVOKTsKIAkJYnJlYWs7CiAJfQotX2Z1bmNfZXhpdF87CiB9CiAKIHVpbnQJcnR3X2dldF9yYXRlc2V0X2xlbih1OAkqcmF0ZXNldCkKIHsKIAl1aW50IGkgPSAwOwotX2Z1bmNfZW50ZXJfOwogCXdoaWxlICgxKSB7CiAJCWlmICgocmF0ZXNldFtpXSkgPT0gMCkKIAkJCWJyZWFrOwpAQCAtMzc1LDcgKzM2Niw2IEBACiAJCQlicmVhazsKIAkJaSsrOwogCX0KLV9mdW5jX2V4aXRfOwogCXJldHVybiBpOwogfQogCkBAIC0zODYsNyArMzc2LDYgQEAKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGRldl9uZXR3b3JrID0gJnByZWdpc3RyeXByaXYtPmRldl9uZXR3b3JrOwogCXU4ICppZSA9IHBkZXZfbmV0d29yay0+SUVzOwogCi1fZnVuY19lbnRlcl87CiAKIAkvKiB0aW1lc3RhbXAgd2lsbCBiZSBpbnNlcnRlZCBieSBoYXJkd2FyZSAqLwogCXN6ICs9IDg7CkBAIC00NDQsNyArNDMzLDYgQEAKIAogCWlmIChyYXRlTGVuID4gOCkKIAkJaWUgPSBydHdfc2V0X2llKGllLCBfRVhUX1NVUFBPUlRFRFJBVEVTX0lFXywgKHJhdGVMZW4gLSA4KSwgKHBkZXZfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMgKyA4KSwgJnN6KTsKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN6OwogfQpAQCAtNDYzLDcgKzQ1MSw3IEBACiAKIAkJaWYgKHBidWYpIHsKIAkJCS8qIGNoZWNrIGlmIG91aSBtYXRjaGVzLi4uICovCi0JCQlpZiAoX3J0d19tZW1jbXAoKHBidWYgKyAyKSwgd3BhX291aV90eXBlLCBzaXplb2YgKHdwYV9vdWlfdHlwZSkpID09IGZhbHNlKQorCQkJaWYgKCFtZW1jbXAoKHBidWYgKyAyKSwgd3BhX291aV90eXBlLCBzaXplb2Yod3BhX291aV90eXBlKSkgPT0gZmFsc2UpCiAJCQkJZ290byBjaGVja19uZXh0X2llOwogCiAJCQkvKiBjaGVjayB2ZXJzaW9uLi4uICovCkBAIC00OTcsMTUgKzQ4NSwxNSBAQAogCiBpbnQgcnR3X2dldF93cGFfY2lwaGVyX3N1aXRlKHU4ICpzKQogewotCWlmIChfcnR3X21lbWNtcChzLCBXUEFfQ0lQSEVSX1NVSVRFX05PTkUsIFdQQV9TRUxFQ1RPUl9MRU4pID09IHRydWUpCisJaWYgKCFtZW1jbXAocywgV1BBX0NJUEhFUl9TVUlURV9OT05FLCBXUEFfU0VMRUNUT1JfTEVOKSkKIAkJcmV0dXJuIFdQQV9DSVBIRVJfTk9ORTsKLQlpZiAoX3J0d19tZW1jbXAocywgV1BBX0NJUEhFUl9TVUlURV9XRVA0MCwgV1BBX1NFTEVDVE9SX0xFTikgPT0gdHJ1ZSkKKwlpZiAoIW1lbWNtcChzLCBXUEFfQ0lQSEVSX1NVSVRFX1dFUDQwLCBXUEFfU0VMRUNUT1JfTEVOKSkKIAkJcmV0dXJuIFdQQV9DSVBIRVJfV0VQNDA7Ci0JaWYgKF9ydHdfbWVtY21wKHMsIFdQQV9DSVBIRVJfU1VJVEVfVEtJUCwgV1BBX1NFTEVDVE9SX0xFTikgPT0gdHJ1ZSkKKwlpZiAoIW1lbWNtcChzLCBXUEFfQ0lQSEVSX1NVSVRFX1RLSVAsIFdQQV9TRUxFQ1RPUl9MRU4pKQogCQlyZXR1cm4gV1BBX0NJUEhFUl9US0lQOwotCWlmIChfcnR3X21lbWNtcChzLCBXUEFfQ0lQSEVSX1NVSVRFX0NDTVAsIFdQQV9TRUxFQ1RPUl9MRU4pID09IHRydWUpCisJaWYgKCFtZW1jbXAocywgV1BBX0NJUEhFUl9TVUlURV9DQ01QLCBXUEFfU0VMRUNUT1JfTEVOKSkKIAkJcmV0dXJuIFdQQV9DSVBIRVJfQ0NNUDsKLQlpZiAoX3J0d19tZW1jbXAocywgV1BBX0NJUEhFUl9TVUlURV9XRVAxMDQsIFdQQV9TRUxFQ1RPUl9MRU4pID09IHRydWUpCisJaWYgKCFtZW1jbXAocywgV1BBX0NJUEhFUl9TVUlURV9XRVAxMDQsIFdQQV9TRUxFQ1RPUl9MRU4pKQogCQlyZXR1cm4gV1BBX0NJUEhFUl9XRVAxMDQ7CiAKIAlyZXR1cm4gMDsKQEAgLTUxMywxNSArNTAxLDE1IEBACiAKIGludCBydHdfZ2V0X3dwYTJfY2lwaGVyX3N1aXRlKHU4ICpzKQogewotCWlmIChfcnR3X21lbWNtcChzLCBSU05fQ0lQSEVSX1NVSVRFX05PTkUsIFJTTl9TRUxFQ1RPUl9MRU4pID09IHRydWUpCisJaWYgKCFtZW1jbXAocywgUlNOX0NJUEhFUl9TVUlURV9OT05FLCBSU05fU0VMRUNUT1JfTEVOKSkKIAkJcmV0dXJuIFdQQV9DSVBIRVJfTk9ORTsKLQlpZiAoX3J0d19tZW1jbXAocywgUlNOX0NJUEhFUl9TVUlURV9XRVA0MCwgUlNOX1NFTEVDVE9SX0xFTikgPT0gdHJ1ZSkKKwlpZiAoIW1lbWNtcChzLCBSU05fQ0lQSEVSX1NVSVRFX1dFUDQwLCBSU05fU0VMRUNUT1JfTEVOKSkKIAkJcmV0dXJuIFdQQV9DSVBIRVJfV0VQNDA7Ci0JaWYgKF9ydHdfbWVtY21wKHMsIFJTTl9DSVBIRVJfU1VJVEVfVEtJUCwgUlNOX1NFTEVDVE9SX0xFTikgPT0gdHJ1ZSkKKwlpZiAoIW1lbWNtcChzLCBSU05fQ0lQSEVSX1NVSVRFX1RLSVAsIFJTTl9TRUxFQ1RPUl9MRU4pKQogCQlyZXR1cm4gV1BBX0NJUEhFUl9US0lQOwotCWlmIChfcnR3X21lbWNtcChzLCBSU05fQ0lQSEVSX1NVSVRFX0NDTVAsIFJTTl9TRUxFQ1RPUl9MRU4pID09IHRydWUpCisJaWYgKCFtZW1jbXAocywgUlNOX0NJUEhFUl9TVUlURV9DQ01QLCBSU05fU0VMRUNUT1JfTEVOKSkKIAkJcmV0dXJuIFdQQV9DSVBIRVJfQ0NNUDsKLQlpZiAoX3J0d19tZW1jbXAocywgUlNOX0NJUEhFUl9TVUlURV9XRVAxMDQsIFJTTl9TRUxFQ1RPUl9MRU4pID09IHRydWUpCisJaWYgKCFtZW1jbXAocywgUlNOX0NJUEhFUl9TVUlURV9XRVAxMDQsIFJTTl9TRUxFQ1RPUl9MRU4pKQogCQlyZXR1cm4gV1BBX0NJUEhFUl9XRVAxMDQ7CiAKIAlyZXR1cm4gMDsKQEAgLTU0Miw3ICs1MzAsNyBAQAogCiAKIAlpZiAoKCp3cGFfaWUgIT0gX1dQQV9JRV9JRF8pIHx8ICgqKHdwYV9pZSsxKSAhPSAodTgpKHdwYV9pZV9sZW4gLSAyKSkgfHwKLQkgICAgKF9ydHdfbWVtY21wKHdwYV9pZSsyLCBSVFdfV1BBX09VSV9UWVBFLCBXUEFfU0VMRUNUT1JfTEVOKSAhPSB0cnVlKSkKKwkgICAgKG1lbWNtcCh3cGFfaWUrMiwgUlRXX1dQQV9PVUlfVFlQRSwgV1BBX1NFTEVDVE9SX0xFTikpKQogCQlyZXR1cm4gX0ZBSUw7CiAKIAlwb3MgPSB3cGFfaWU7CkBAIC01ODcsNyArNTc1LDcgQEAKIAlpZiAoaXNfODAyMXgpIHsKIAkJaWYgKGxlZnQgPj0gNikgewogCQkJcG9zICs9IDI7Ci0JCQlpZiAoX3J0d19tZW1jbXAocG9zLCBTVUlURV8xWCwgNCkgPT0gMSkgeworCQkJaWYgKCFtZW1jbXAocG9zLCBTVUlURV8xWCwgNCkpIHsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCIlcyA6IHRoZXJlIGhhcyA4MDIuMXggYXV0aFxuIiwgX19mdW5jX18pKTsKIAkJCQkqaXNfODAyMXggPSAxOwogCQkJfQpAQCAtNjU3LDcgKzY0NSw3IEBACiAJaWYgKGlzXzgwMjF4KSB7CiAJCWlmIChsZWZ0ID49IDYpIHsKIAkJCXBvcyArPSAyOwotCQkJaWYgKF9ydHdfbWVtY21wKHBvcywgU1VJVEVfMVgsIDQpID09IDEpIHsKKwkJCWlmICghbWVtY21wKHBvcywgU1VJVEVfMVgsIDQpKSB7CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sICgiJXMgKCk6IHRoZXJlIGhhcyA4MDIuMXggYXV0aFxuIiwgX19mdW5jX18pKTsKIAkJCQkqaXNfODAyMXggPSAxOwogCQkJfQpAQCAtNjcyLDcgKzY2MCw2IEBACiAJdTggd3BhX291aVs0XSA9IHsweDAsIDB4NTAsIDB4ZjIsIDB4MDF9OwogCXVpbnQJY250OwogCi1fZnVuY19lbnRlcl87CiAKIAkvKiBTZWFyY2ggcmVxdWlyZWQgV1BBIG9yIFdQQTIgSUUgYW5kIGNvcHkgdG8gc2VjX2llW10gKi8KIApAQCAtNjgzLDcgKzY3MCw3IEBACiAJd2hpbGUgKGNudCA8IGluX2xlbikgewogCQlhdXRobW9kZSA9IGluX2llW2NudF07CiAKLQkJaWYgKChhdXRobW9kZSA9PSBfV1BBX0lFX0lEXykgJiYgKF9ydHdfbWVtY21wKCZpbl9pZVtjbnQrMl0sICZ3cGFfb3VpWzBdLCA0KSkpIHsKKwkJaWYgKChhdXRobW9kZSA9PSBfV1BBX0lFX0lEXykgJiYgKCFtZW1jbXAoJmluX2llW2NudCsyXSwgJndwYV9vdWlbMF0sIDQpKSkgewogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAogCQkJCQkgKCJcbiBydHdfZ2V0X3dwYV9pZTogc2VjX2lkeCA9JWQgaW5faWVbY250KzFdKzIgPSVkXG4iLAogCQkJCQkgc2VjX2lkeCwgaW5faWVbY250KzFdKzIpKTsKQEAgLTcyNiw3ICs3MTMsNiBAQAogCQl9CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiAqcnNuX2xlbiArICp3cGFfbGVuOwogfQpAQCAtNzQxLDcgKzcyNyw3IEBACiAKIAllaWQgPSBpZV9wdHJbMF07CiAKLQlpZiAoKGVpZCA9PSBfV1BBX0lFX0lEXykgJiYgKF9ydHdfbWVtY21wKCZpZV9wdHJbMl0sIHdwc19vdWksIDQpKSkgeworCWlmICgoZWlkID09IF9XUEFfSUVfSURfKSAmJiAoIW1lbWNtcCgmaWVfcHRyWzJdLCB3cHNfb3VpLCA0KSkpIHsKIAkJKndwc19pZWxlbiA9IGllX3B0clsxXSsyOwogCQltYXRjaCA9IHRydWU7CiAJfQpAQCAtNzc0LDcgKzc2MCw3IEBACiAJd2hpbGUgKGNudCA8IGluX2xlbikgewogCQllaWQgPSBpbl9pZVtjbnRdOwogCi0JCWlmICgoZWlkID09IF9XUEFfSUVfSURfKSAmJiAoX3J0d19tZW1jbXAoJmluX2llW2NudCsyXSwgd3BzX291aSwgNCkpKSB7CisJCWlmICgoZWlkID09IF9XUEFfSUVfSURfKSAmJiAoIW1lbWNtcCgmaW5faWVbY250KzJdLCB3cHNfb3VpLCA0KSkpIHsKIAkJCXdwc2llX3B0ciA9ICZpbl9pZVtjbnRdOwogCiAJCQlpZiAod3BzX2llKQpAQCAtODEzLDcgKzc5OSw3IEBACiAJCSpsZW5fYXR0ciA9IDA7CiAKIAlpZiAoKHdwc19pZVswXSAhPSBfVkVORE9SX1NQRUNJRklDX0lFXykgfHwKLQkgICAgKF9ydHdfbWVtY21wKHdwc19pZSArIDIsIHdwc19vdWkgLCA0KSAhPSB0cnVlKSkKKwkgICAgKG1lbWNtcCh3cHNfaWUgKyAyLCB3cHNfb3VpICwgNCkpKQogCQlyZXR1cm4gYXR0cl9wdHI7CiAKIAkvKiAgNiA9IDEoRWxlbWVudCBJRCkgKyAxKExlbmd0aCkgKyA0KFdQUyBPVUkpICovCkBAIC0xMjIzLDcgKzEyMDksNyBAQAogCQkJZHVtcF9zdGFjaygpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KLQkJaWYgKChlaWQgPT0gX1ZFTkRPUl9TUEVDSUZJQ19JRV8pICYmIChfcnR3X21lbWNtcCgmaW5faWVbY250KzJdLCBwMnBfb3VpLCA0KSA9PSB0cnVlKSkgeworCQlpZiAoKGVpZCA9PSBfVkVORE9SX1NQRUNJRklDX0lFXykgJiYgKCFtZW1jbXAoJmluX2llW2NudCsyXSwgcDJwX291aSwgNCkpKSB7CiAJCQlwMnBfaWVfcHRyID0gaW5faWUgKyBjbnQ7CiAKIAkJCWlmIChwMnBfaWUgIT0gTlVMTCkKQEAgLTEyNTgsNyArMTI0NCw3IEBACiAJCSpsZW5fYXR0ciA9IDA7CiAKIAlpZiAoIXAycF9pZSB8fCAocDJwX2llWzBdICE9IF9WRU5ET1JfU1BFQ0lGSUNfSUVfKSB8fAotCSAgICAoX3J0d19tZW1jbXAocDJwX2llICsgMiwgcDJwX291aSAsIDQpICE9IHRydWUpKQorCSAgICAobWVtY21wKHAycF9pZSArIDIsIHAycF9vdWkgLCA0KSkpCiAJCXJldHVybiBhdHRyX3B0cjsKIAogCS8qICA2ID0gMShFbGVtZW50IElEKSArIDEoTGVuZ3RoKSArIDMgKE9VSSkgKyAxKE9VSSBUeXBlKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pby5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pby5jCmluZGV4IGZmMDM5OGYuLjc1MzA1MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2lvLmMKQEAgLTU5LDEwICs1OSw4IEBACiAJc3RydWN0CWludGZfaGRsICpwaW50ZmhkbCA9ICYocGlvX3ByaXYtPmludGYpOwogCXU4ICgqX3JlYWQ4KShzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkcik7CiAKLQlfZnVuY19lbnRlcl87CiAJX3JlYWQ4ID0gcGludGZoZGwtPmlvX29wcy5fcmVhZDg7CiAJcl92YWwgPSBfcmVhZDgocGludGZoZGwsIGFkZHIpOwotCV9mdW5jX2V4aXRfOwogCXJldHVybiByX3ZhbDsKIH0KIApAQCAtNzIsMTEgKzcwLDkgQEAKIAlzdHJ1Y3QgaW9fcHJpdiAqcGlvX3ByaXYgPSAmYWRhcHRlci0+aW9wcml2OwogCXN0cnVjdAlpbnRmX2hkbAkJKnBpbnRmaGRsID0gJihwaW9fcHJpdi0+aW50Zik7CiAJdTE2ICgqX3JlYWQxNikoc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCwgdTMyIGFkZHIpOwotX2Z1bmNfZW50ZXJfOwogCV9yZWFkMTYgPSBwaW50ZmhkbC0+aW9fb3BzLl9yZWFkMTY7CiAKIAlyX3ZhbCA9IF9yZWFkMTYocGludGZoZGwsIGFkZHIpOwotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJfdmFsOwogfQogCkBAIC04NiwxMSArODIsOSBAQAogCXN0cnVjdCBpb19wcml2ICpwaW9fcHJpdiA9ICZhZGFwdGVyLT5pb3ByaXY7CiAJc3RydWN0CWludGZfaGRsCQkqcGludGZoZGwgPSAmKHBpb19wcml2LT5pbnRmKTsKIAl1MzIJKCpfcmVhZDMyKShzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkcik7Ci1fZnVuY19lbnRlcl87CiAJX3JlYWQzMiA9IHBpbnRmaGRsLT5pb19vcHMuX3JlYWQzMjsKIAogCXJfdmFsID0gX3JlYWQzMihwaW50ZmhkbCwgYWRkcik7Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcl92YWw7CiB9CiAKQEAgLTEwMCwxMSArOTQsOSBAQAogCXN0cnVjdAlpbnRmX2hkbAkJKnBpbnRmaGRsID0gJihwaW9fcHJpdi0+aW50Zik7CiAJaW50ICgqX3dyaXRlOCkoc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCwgdTMyIGFkZHIsIHU4IHZhbCk7CiAJaW50IHJldDsKLQlfZnVuY19lbnRlcl87CiAJX3dyaXRlOCA9IHBpbnRmaGRsLT5pb19vcHMuX3dyaXRlODsKIAogCXJldCA9IF93cml0ZTgocGludGZoZGwsIGFkZHIsIHZhbCk7Ci0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gUlRXX1NUQVRVU19DT0RFKHJldCk7CiB9CkBAIC0xMTUsMTEgKzEwNyw5IEBACiAJc3RydWN0CWludGZfaGRsCQkqcGludGZoZGwgPSAmKHBpb19wcml2LT5pbnRmKTsKIAlpbnQgKCpfd3JpdGUxNikoc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCwgdTMyIGFkZHIsIHUxNiB2YWwpOwogCWludCByZXQ7Ci0JX2Z1bmNfZW50ZXJfOwogCV93cml0ZTE2ID0gcGludGZoZGwtPmlvX29wcy5fd3JpdGUxNjsKIAogCXJldCA9IF93cml0ZTE2KHBpbnRmaGRsLCBhZGRyLCB2YWwpOwotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIFJUV19TVEFUVVNfQ09ERShyZXQpOwogfQpAQCAtMTI5LDExICsxMTksOSBAQAogCXN0cnVjdAlpbnRmX2hkbAkJKnBpbnRmaGRsID0gJihwaW9fcHJpdi0+aW50Zik7CiAJaW50ICgqX3dyaXRlMzIpKHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwsIHUzMiBhZGRyLCB1MzIgdmFsKTsKIAlpbnQgcmV0OwotCV9mdW5jX2VudGVyXzsKIAlfd3JpdGUzMiA9IHBpbnRmaGRsLT5pb19vcHMuX3dyaXRlMzI7CiAKIAlyZXQgPSBfd3JpdGUzMihwaW50ZmhkbCwgYWRkciwgdmFsKTsKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiBSVFdfU1RBVFVTX0NPREUocmV0KTsKIH0KQEAgLTE0NCwxMSArMTMyLDkgQEAKIAlzdHJ1Y3QJaW50Zl9oZGwgKnBpbnRmaGRsID0gKHN0cnVjdCBpbnRmX2hkbCAqKSgmKHBpb19wcml2LT5pbnRmKSk7CiAJaW50ICgqX3dyaXRlTikoc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCwgdTMyIGFkZHIsIHUzMiBsZW5ndGgsIHU4ICpwZGF0YSk7CiAJaW50IHJldDsKLQlfZnVuY19lbnRlcl87CiAJX3dyaXRlTiA9IHBpbnRmaGRsLT5pb19vcHMuX3dyaXRlTjsKIAogCXJldCA9IF93cml0ZU4ocGludGZoZGwsIGFkZHIsIGxlbmd0aCwgcGRhdGEpOwotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIFJUV19TVEFUVVNfQ09ERShyZXQpOwogfQpAQCAtMTU4LDExICsxNDQsOSBAQAogCXN0cnVjdAlpbnRmX2hkbAkJKnBpbnRmaGRsID0gJihwaW9fcHJpdi0+aW50Zik7CiAJaW50ICgqX3dyaXRlOF9hc3luYykoc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCwgdTMyIGFkZHIsIHU4IHZhbCk7CiAJaW50IHJldDsKLQlfZnVuY19lbnRlcl87CiAJX3dyaXRlOF9hc3luYyA9IHBpbnRmaGRsLT5pb19vcHMuX3dyaXRlOF9hc3luYzsKIAogCXJldCA9IF93cml0ZThfYXN5bmMocGludGZoZGwsIGFkZHIsIHZhbCk7Ci0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gUlRXX1NUQVRVU19DT0RFKHJldCk7CiB9CkBAIC0xNzQsMTAgKzE1OCw4IEBACiAJaW50ICgqX3dyaXRlMTZfYXN5bmMpKHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwsIHUzMiBhZGRyLCB1MTYgdmFsKTsKIAlpbnQgcmV0OwogCi1fZnVuY19lbnRlcl87CiAJX3dyaXRlMTZfYXN5bmMgPSBwaW50ZmhkbC0+aW9fb3BzLl93cml0ZTE2X2FzeW5jOwogCXJldCA9IF93cml0ZTE2X2FzeW5jKHBpbnRmaGRsLCBhZGRyLCB2YWwpOwotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gUlRXX1NUQVRVU19DT0RFKHJldCk7CiB9CkBAIC0xODksMTAgKzE3MSw4IEBACiAJaW50ICgqX3dyaXRlMzJfYXN5bmMpKHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwsIHUzMiBhZGRyLCB1MzIgdmFsKTsKIAlpbnQgcmV0OwogCi1fZnVuY19lbnRlcl87CiAJX3dyaXRlMzJfYXN5bmMgPSBwaW50ZmhkbC0+aW9fb3BzLl93cml0ZTMyX2FzeW5jOwogCXJldCA9IF93cml0ZTMyX2FzeW5jKHBpbnRmaGRsLCBhZGRyLCB2YWwpOwotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gUlRXX1NUQVRVU19DT0RFKHJldCk7CiB9CkBAIC0yMDMsNyArMTgzLDYgQEAKIAlzdHJ1Y3QgaW9fcHJpdiAqcGlvX3ByaXYgPSAmYWRhcHRlci0+aW9wcml2OwogCXN0cnVjdAlpbnRmX2hkbAkJKnBpbnRmaGRsID0gJihwaW9fcHJpdi0+aW50Zik7CiAKLQlfZnVuY19lbnRlcl87CiAJaWYgKGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvX2NfLCBfZHJ2X2luZm9fLAogCQkJICgicnR3X3JlYWRfbWVtOmJEcml2ZXJTdG9wcGVkKCVkKSBPUiBiU3VycHJpc2VSZW1vdmVkKCVkKSIsCkBAIC0yMTIsNyArMTkxLDYgQEAKIAl9CiAJX3JlYWRfbWVtID0gcGludGZoZGwtPmlvX29wcy5fcmVhZF9tZW07CiAJX3JlYWRfbWVtKHBpbnRmaGRsLCBhZGRyLCBjbnQsIHBtZW0pOwotCV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIF9ydHdfd3JpdGVfbWVtKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkciwgdTMyIGNudCwgdTggKnBtZW0pCkBAIC0yMjEsMTMgKzE5OSwxMSBAQAogCXN0cnVjdCBpb19wcml2ICpwaW9fcHJpdiA9ICZhZGFwdGVyLT5pb3ByaXY7CiAJc3RydWN0CWludGZfaGRsCQkqcGludGZoZGwgPSAmKHBpb19wcml2LT5pbnRmKTsKIAotCV9mdW5jX2VudGVyXzsKIAogCV93cml0ZV9tZW0gPSBwaW50ZmhkbC0+aW9fb3BzLl93cml0ZV9tZW07CiAKIAlfd3JpdGVfbWVtKHBpbnRmaGRsLCBhZGRyLCBjbnQsIHBtZW0pOwogCi0JX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgX3J0d19yZWFkX3BvcnQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgY250LCB1OCAqcG1lbSkKQEAgLTIzNiw3ICsyMTIsNiBAQAogCXN0cnVjdCBpb19wcml2ICpwaW9fcHJpdiA9ICZhZGFwdGVyLT5pb3ByaXY7CiAJc3RydWN0CWludGZfaGRsCQkqcGludGZoZGwgPSAmKHBpb19wcml2LT5pbnRmKTsKIAotCV9mdW5jX2VudGVyXzsKIAogCWlmIChhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb19jXywgX2Rydl9pbmZvXywKQEAgLTI0OSw3ICsyMjQsNiBAQAogCiAJX3JlYWRfcG9ydChwaW50ZmhkbCwgYWRkciwgY250LCBwbWVtKTsKIAotCV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIF9ydHdfcmVhZF9wb3J0X2NhbmNlbChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKQEAgLTI3MSwxMyArMjQ1LDExIEBACiAJc3RydWN0CWludGZfaGRsCQkqcGludGZoZGwgPSAmKHBpb19wcml2LT5pbnRmKTsKIAl1MzIgcmV0ID0gX1NVQ0NFU1M7CiAKLQlfZnVuY19lbnRlcl87CiAKIAlfd3JpdGVfcG9ydCA9IHBpbnRmaGRsLT5pb19vcHMuX3dyaXRlX3BvcnQ7CiAKIAlyZXQgPSBfd3JpdGVfcG9ydChwaW50ZmhkbCwgYWRkciwgY250LCBwbWVtKTsKIAotCSBfZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2lvY3RsX3NldC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pb2N0bF9zZXQuYwppbmRleCBlMjViMzliLi5mMTM5OGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2lvY3RsX3NldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaW9jdGxfc2V0LmMKQEAgLTQyLDcgKzQyLDYgQEAKIAl1OAkgaTsKIAl1OAlyZXQgPSB0cnVlOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAoc3NpZC0+U3NpZExlbmd0aCA+IDMyKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfZXJyXywgKCJzc2lkIGxlbmd0aCA+MzJcbiIpKTsKQEAgLTYxLDggKzYwLDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC03NCwxMSArNzEsMTAgQEAKIAlzdHJ1Y3QgX19xdWV1ZSAqcXVldWUJPSAmKHBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZSk7CiAJdTggcmV0ID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCXNwaW5fbG9ja19iaCgmKHBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKSk7CiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywgKCJcbiBydHdfZG9fam9pbjogcGhlYWQgPSAlcDsgcGxpc3QgPSAlcFxuXG5cbiIsIHBoZWFkLCBwbGlzdCkpOwogCkBAIC0xNzAsNyArMTY2LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTgxLDcgKzE3Niw2IEBACiAJdTMyIGN1cl90aW1lID0gMDsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCi1fZnVuY19lbnRlcl87CiAKIAlEQkdfODhFX0xFVkVMKF9kcnZfaW5mb18sICJzZXQgYnNzaWQ6JXBNXG4iLCBic3NpZCk7CiAKQEAgLTIwNSw3ICsxOTksNyBAQAogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRHxXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywgKCJzZXRfYnNzaWQ6IF9GV19MSU5LRUR8fFdJRklfQURIT0NfTUFTVEVSX1NUQVRFXG4iKSk7CiAKLQkJaWYgKF9ydHdfbWVtY21wKCZwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuTWFjQWRkcmVzcywgYnNzaWQsIEVUSF9BTEVOKSkgeworCQlpZiAoIW1lbWNtcCgmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLk1hY0FkZHJlc3MsIGJzc2lkLCBFVEhfQUxFTikpIHsKIAkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSA9PSBmYWxzZSkKIAkJCQlnb3RvIHJlbGVhc2VfbWxtZV9sb2NrOy8qIGl0IG1lYW5zIGRyaXZlciBpcyBpbiBXSUZJX0FESE9DX01BU1RFUl9TVEFURSwgd2UgbmVlZG4ndCBjcmVhdGUgYnNzIGFnYWluLiAqLwogCQl9IGVsc2UgewpAQCAtMjU3LDcgKzI1MSw2IEBACiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9lcnJfLAogCQkgKCJydHdfc2V0XzgwMl8xMV9ic3NpZDogc3RhdHVzPSVkXG4iLCBzdGF0dXMpKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMjcwLDcgKzI2Myw2IEBACiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yayA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrOwogCi1fZnVuY19lbnRlcl87CiAKIAlEQkdfODhFX0xFVkVMKF9kcnZfaW5mb18sICJzZXQgc3NpZCBbJXNdIGZ3X3N0YXRlPTB4JTA4eFxuIiwKIAkJICAgICAgc3NpZC0+U3NpZCwgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7CkBAIC0yODUsMTggKzI3NywxNyBAQAogCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKIAogCURCR184OEUoIlNldCBTU0lEIHVuZGVyIGZ3X3N0YXRlID0gMHglMDh4XG4iLCBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpID09IHRydWUpIHsKKwlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpID09IHRydWUpCiAJCWdvdG8gaGFuZGxlX3RraXBfY291bnRlcm1lYXN1cmU7Ci0JfSBlbHNlIGlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpID09IHRydWUpIHsKKwllbHNlIGlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpID09IHRydWUpCiAJCWdvdG8gcmVsZWFzZV9tbG1lX2xvY2s7Ci0JfQogCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEfFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLAogCQkJICgic2V0X3NzaWQ6IF9GV19MSU5LRUR8fFdJRklfQURIT0NfTUFTVEVSX1NUQVRFXG4iKSk7CiAKIAkJaWYgKChwbWxtZXByaXYtPmFzc29jX3NzaWQuU3NpZExlbmd0aCA9PSBzc2lkLT5Tc2lkTGVuZ3RoKSAmJgotCQkgICAgKF9ydHdfbWVtY21wKCZwbWxtZXByaXYtPmFzc29jX3NzaWQuU3NpZCwgc3NpZC0+U3NpZCwgc3NpZC0+U3NpZExlbmd0aCkpKSB7CisJCSAgICAoIW1lbWNtcCgmcG1sbWVwcml2LT5hc3NvY19zc2lkLlNzaWQsIHNzaWQtPlNzaWQsIHNzaWQtPlNzaWRMZW5ndGgpKSkgewogCQkJaWYgKChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSA9PSBmYWxzZSkpIHsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2Vycl8sCiAJCQkJCSAoIlNldCBTU0lEIGlzIHRoZSBzYW1lIHNzaWQsIGZ3X3N0YXRlID0gMHglMDh4XG4iLApAQCAtMzU3LDExICszNDgsMTAgQEAKIAltZW1jcHkoJnBtbG1lcHJpdi0+YXNzb2Nfc3NpZCwgc3NpZCwgc2l6ZW9mKHN0cnVjdCBuZGlzXzgwMl8xMV9zc2lkKSk7CiAJcG1sbWVwcml2LT5hc3NvY19ieV9ic3NpZCA9IGZhbHNlOwogCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSA9PSB0cnVlKSB7CisJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSA9PSB0cnVlKQogCQlwbWxtZXByaXYtPnRvX2pvaW4gPSB0cnVlOwotCX0gZWxzZSB7CisJZWxzZQogCQlzdGF0dXMgPSBydHdfZG9fam9pbihwYWRhcHRlcik7Ci0JfQogCiByZWxlYXNlX21sbWVfbG9jazoKIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKQEAgLTM2OSw3ICszNTksNiBAQAogZXhpdDoKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2Vycl8sCiAJCSAoIi1ydHdfc2V0XzgwMl8xMV9zc2lkOiBzdGF0dXMgPSVkXG4iLCBzdGF0dXMpKTsKLV9mdW5jX2V4aXRfOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTM4MCw3ICszNjksNiBAQAogCXN0cnVjdAl3bGFuX25ldHdvcmsJKmN1cl9uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcms7CiAJZW51bSBuZGlzXzgwMl8xMV9uZXR3b3JrX2luZnJhICpwb2xkX3N0YXRlID0gJihjdXJfbmV0d29yay0+bmV0d29yay5JbmZyYXN0cnVjdHVyZU1vZGUpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X25vdGljZV8sCiAJCSAoIitydHdfc2V0XzgwMl8xMV9pbmZyYXN0cnVjdHVyZV9tb2RlOiBvbGQgPSVkIG5ldyA9JWQgZndfc3RhdGUgPSAweCUwOHhcbiIsCkBAIC00MTEsNyArMzk5LDcgQEAKIAogCQlpZiAoKCpwb2xkX3N0YXRlID09IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSkgfHwgKCpwb2xkX3N0YXRlID09IE5kaXM4MDJfMTFJQlNTKSkgewogCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSA9PSB0cnVlKQotCQkJCXJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0KHBhZGFwdGVyKTsgLyogd2lsbCBjbHIgTGlua2VkX3N0YXRlOyBiZWZvcmUgdGhpcyBmdW5jdGlvbiwgd2UgbXVzdCBoYXZlIGNoa2VkIHdoZXRoZXIgIGlzc3VlIGRpcy1hc3NvY19jbWQgb3Igbm90ICovCisJCQkJcnR3X2luZGljYXRlX2Rpc2Nvbm5lY3QocGFkYXB0ZXIpOyAvKiB3aWxsIGNsciBMaW5rZWRfc3RhdGU7IGJlZm9yZSB0aGlzIGZ1bmN0aW9uLCB3ZSBtdXN0IGhhdmUgY2hlY2tlZCB3aGV0aGVyICBpc3N1ZSBkaXMtYXNzb2NfY21kIG9yIG5vdCAqLwogCSAgICAgICB9CiAKIAkJKnBvbGRfc3RhdGUgPSBuZXR3b3JrdHlwZTsKQEAgLTQzOCw3ICs0MjYsNiBAQAogCQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHRydWU7CiB9CkBAIC00NDgsNyArNDM1LDYgQEAKIHsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCi1fZnVuY19lbnRlcl87CiAKIAlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7CiAKQEAgLTQ2NCw3ICs0NTAsNiBAQAogCiAJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHRydWU7CiB9CkBAIC00NzQsNyArNDU5LDYgQEAKIAlzdHJ1Y3QJbWxtZV9wcml2CQkqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAl1OAlyZXMgPSB0cnVlOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2Vycl8sICgiK3J0d19zZXRfODAyXzExX2Jzc2lkX2xpc3Rfc2NhbigpLCBmd19zdGF0ZSA9JXhcbiIsIGdldF9md3N0YXRlKHBtbG1lcHJpdikpKTsKIApAQCAtNDk0LDExICs0NzgsMTIgQEAKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9lcnJfLCAoInJ0d19zZXRfODAyXzExX2Jzc2lkX2xpc3Rfc2NhbiBmYWlsIHNpbmNlIGZ3X3N0YXRlID0gJXhcbiIsIGdldF9md3N0YXRlKHBtbG1lcHJpdikpKTsKIAkJcmVzID0gdHJ1ZTsKIAotCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIChfRldfVU5ERVJfU1VSVkVZfF9GV19VTkRFUl9MSU5LSU5HKSkgPT0gdHJ1ZSkgeworCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsCisJCQkJKF9GV19VTkRFUl9TVVJWRVl8X0ZXX1VOREVSX0xJTktJTkcpKSA9PSB0cnVlKQogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9lcnJfLCAoIlxuIyMjX0ZXX1VOREVSX1NVUlZFWXxfRldfVU5ERVJfTElOS0lOR1xuXG4iKSk7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfZXJyXywgKCJcbiMjI3BtbG1lcHJpdi0+c2l0ZXN1cnZleWN0cmwudHJhZmZpY19idXN5ID09IHRydWVcblxuIikpOwotCQl9CisKIAl9IGVsc2UgewogCQlpZiAocnR3X2lzX3NjYW5fZGVueShwYWRhcHRlcikpIHsKIAkJCURCR184OEUoRlVOQ19BRFBUX0ZNVCI6IHNjYW4gZGVueVxuIiwgRlVOQ19BRFBUX0FSRyhwYWRhcHRlcikpOwpAQCAtNTE0LDcgKzQ5OSw2IEBACiAJfQogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtNTI1LDcgKzUwOSw2IEBACiAJaW50IHJlczsKIAl1OCByZXQ7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sICgic2V0XzgwMl8xMV9hdXRoLm1vZGUoKTogbW9kZSA9JXhcbiIsIGF1dGhtb2RlKSk7CiAKQEAgLTU0NSw3ICs1MjgsNiBAQAogCWVsc2UKIAkJcmV0ID0gZmFsc2U7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTU1Niw3ICs1MzgsNiBAQAogCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJihwYWRhcHRlci0+c2VjdXJpdHlwcml2KTsKIAl1OAkJcmV0ID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCWtleWlkID0gd2VwLT5LZXlJbmRleCAmIDB4M2ZmZmZmZmY7CiAKQEAgLTU4MSw3ICs1NjIsNyBAQAogCQlicmVhazsKIAl9CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJICgicnR3X3NldF84MDJfMTFfYWRkX3dlcDpiZWZvciBtZW1jcHksIHdlcC0+S2V5TGVuZ3RoID0gMHgleCB3ZXAtPktleUluZGV4ID0gMHgleCAga2V5aWQgPSV4XG4iLAorCQkgKCJydHdfc2V0XzgwMl8xMV9hZGRfd2VwOmJlZm9yZSBtZW1jcHksIHdlcC0+S2V5TGVuZ3RoID0gMHgleCB3ZXAtPktleUluZGV4ID0gMHgleCAga2V5aWQgPSV4XG4iLAogCQkgd2VwLT5LZXlMZW5ndGgsIHdlcC0+S2V5SW5kZXgsIGtleWlkKSk7CiAKIAltZW1jcHkoJihwc2VjdXJpdHlwcml2LT5kb3QxMURlZktleVtrZXlpZF0uc2tleVswXSksICYod2VwLT5LZXlNYXRlcmlhbCksIHdlcC0+S2V5TGVuZ3RoKTsKQEAgLTYxMSw3ICs1OTIsNiBAQAogCWlmIChyZXMgPT0gX0ZBSUwpCiAJCXJldCA9IGZhbHNlOwogZXhpdDoKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTYxOSw3ICs1OTksNiBAQAogewogCXU4IHJldCA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAJaWYgKGtleWluZGV4ID49IDB4ODAwMDAwMDAgfHwgcGFkYXB0ZXIgPT0gTlVMTCkgewogCQlyZXQgPSBmYWxzZTsKIAkJZ290byBleGl0OwpAQCAtNjM4LDcgKzYxNyw2IEBACiAJfQogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjUxLDcgKzYyOSw2IEBACiAJdTgJYmdyb3VwdGtleSA9IGZhbHNlOy8qIGNhbiBiZSByZW1vdmVkIGxhdGVyICovCiAJdTgJcmV0ID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmICgoKGtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKSA9PSAwKSAmJiAoKGtleS0+S2V5SW5kZXggJiAweDQwMDAwMDAwKSA+IDApKSB7CiAJCS8qICBJdCBpcyBpbnZhbGlkIHRvIGNsZWFyIGJpdCAzMSBhbmQgc2V0IGJpdCAzMC4gSWYgdGhlIG1pbmlwb3J0IGRyaXZlciBlbmNvdW50ZXJzIHRoaXMgY29tYmluYXRpb24sICovCkBAIC05OTIsNyArOTY5LDYgQEAKIAl9CiBleGl0OgogCi1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMDA0LDcgKzk4MCw2IEBACiAJdTgJa2V5SW5kZXggPSAodTgpa2V5LT5LZXlJbmRleCAmIDB4MDM7CiAJdTgJcmV0ID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmICgoa2V5LT5LZXlJbmRleCAmIDB4YmZmZmZmZmMpID4gMCkgewogCQlyZXQgPSBfRkFJTDsKQEAgLTEwMzIsNyArMTAwNyw2IEBACiAJfQogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19sZWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbGVkLmMKaW5kZXggYWZhYzUzNy4uNDJiNDFhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19sZWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2xlZC5jCkBAIC0zNCw3ICszNCw3IEBACiAJaWYgKChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkgfHwgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCkpCiAJCXJldHVybjsKIAotCV9zZXRfd29ya2l0ZW0oJihwTGVkLT5CbGlua1dvcmtJdGVtKSk7CisJc2NoZWR1bGVfd29yaygmKHBMZWQtPkJsaW5rV29ya0l0ZW0pKTsKIH0KIAogLyogICovCkBAIC04MCw3ICs4MCw3IEBACiAKIAlfaW5pdF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCBwYWRhcHRlci0+cG5ldGRldiwgQmxpbmtUaW1lckNhbGxiYWNrLCBwTGVkKTsKIAotCV9pbml0X3dvcmtpdGVtKCYocExlZC0+QmxpbmtXb3JrSXRlbSksIEJsaW5rV29ya0l0ZW1DYWxsYmFjaywgcExlZCk7CisJSU5JVF9XT1JLKCYocExlZC0+QmxpbmtXb3JrSXRlbSksIEJsaW5rV29ya0l0ZW1DYWxsYmFjayk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWUuYwppbmRleCBjNzM4MjMwLi43NjlkNGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWUuYwpAQCAtMzEsMTEgKzMxLDEyIEBACiAjaW5jbHVkZSA8d2xhbl9ic3NkZWYuaD4KICNpbmNsdWRlIDxydHdfaW9jdGxfc2V0Lmg+CiAjaW5jbHVkZSA8dXNiX29zaW50Zi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAogZXh0ZXJuIHVuc2lnbmVkIGNoYXIJTUNTX3JhdGVfMlJbMTZdOwogZXh0ZXJuIHVuc2lnbmVkIGNoYXIJTUNTX3JhdGVfMVJbMTZdOwogCi1pbnQJX3J0d19pbml0X21sbWVfcHJpdiAoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQoraW50IF9ydHdfaW5pdF9tbG1lX3ByaXYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewogCWludAlpOwogCXU4CSpwYnVmOwpAQCAtNDMsOSArNDQsNyBAQAogCXN0cnVjdCBtbG1lX3ByaXYJCSpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCWludAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwotCi0JLyogIFdlIGRvbid0IG5lZWQgdG8gbWVtc2V0IHBhZGFwdGVyLT5YWFggdG8gemVybywgYmVjYXVzZSBhZGFwdGVyIGlzIGFsbG9jYXRlZCBieSBydHdfenZtYWxsb2MoKS4gKi8KKwkvKiAgV2UgZG9uJ3QgbmVlZCB0byBtZW1zZXQgcGFkYXB0ZXItPlhYWCB0byB6ZXJvLCBiZWNhdXNlIGFkYXB0ZXIgaXMgYWxsb2NhdGVkIGJ5IHZ6YWxsb2MoKS4gKi8KIAogCXBtbG1lcHJpdi0+bmljX2hkbCA9ICh1OCAqKXBhZGFwdGVyOwogCkBAIC02Miw3ICs2MSw3IEBACiAKIAlfcnR3X21lbXNldCgmcG1sbWVwcml2LT5hc3NvY19zc2lkLCAwLCBzaXplb2Yoc3RydWN0IG5kaXNfODAyXzExX3NzaWQpKTsKIAotCXBidWYgPSBydHdfenZtYWxsb2MoTUFYX0JTU19DTlQgKiAoc2l6ZW9mKHN0cnVjdCB3bGFuX25ldHdvcmspKSk7CisJcGJ1ZiA9IHZ6YWxsb2MoTUFYX0JTU19DTlQgKiAoc2l6ZW9mKHN0cnVjdCB3bGFuX25ldHdvcmspKSk7CiAKIAlpZiAocGJ1ZiA9PSBOVUxMKSB7CiAJCXJlcyA9IF9GQUlMOwpAQCAtODcsMTMgKzg2LDEwIEBACiAJcnR3X2luaXRfbWxtZV90aW1lcihwYWRhcHRlcik7CiAKIGV4aXQ6Ci0KLV9mdW5jX2V4aXRfOwotCiAJcmV0dXJuIHJlczsKIH0KIAotI2lmIGRlZmluZWQgKENPTkZJR184OEVVX0FQX01PREUpCisjaWYgZGVmaW5lZChDT05GSUdfODhFVV9BUF9NT0RFKQogc3RhdGljIHZvaWQgcnR3X2ZyZWVfbWxtZV9pZV9kYXRhKHU4ICoqcHBpZSwgdTMyICpwbGVuKQogewogCWtmcmVlKCpwcGllKTsKQEAgLTEyMiwyNCArMTE4LDE4IEBACiB9CiAjZW5kaWYKIAotdm9pZCBfcnR3X2ZyZWVfbWxtZV9wcml2IChzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpCit2b2lkIF9ydHdfZnJlZV9tbG1lX3ByaXYoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2KQogewotX2Z1bmNfZW50ZXJfOwotCiAJcnR3X2ZyZWVfbWxtZV9wcml2X2llX2RhdGEocG1sbWVwcml2KTsKIAogCWlmIChwbWxtZXByaXYpIHsKLQkJaWYgKHBtbG1lcHJpdi0+ZnJlZV9ic3NfYnVmKSB7Ci0JCQlydHdfdm1mcmVlKHBtbG1lcHJpdi0+ZnJlZV9ic3NfYnVmLCBNQVhfQlNTX0NOVCAqIHNpemVvZihzdHJ1Y3Qgd2xhbl9uZXR3b3JrKSk7Ci0JCX0KKwkJaWYgKHBtbG1lcHJpdi0+ZnJlZV9ic3NfYnVmKQorCQkJdmZyZWUocG1sbWVwcml2LT5mcmVlX2Jzc19idWYpOwogCX0KLV9mdW5jX2V4aXRfOwogfQogCiBpbnQJX3J0d19lbnF1ZXVlX25ldHdvcmsoc3RydWN0IF9fcXVldWUgKnF1ZXVlLCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaykKIHsKLV9mdW5jX2VudGVyXzsKLQogCWlmIChwbmV0d29yayA9PSBOVUxMKQogCQlnb3RvIGV4aXQ7CiAKQEAgLTE1MCw5ICsxNDAsNiBAQAogCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZS0+bG9jayk7CiAKIGV4aXQ6Ci0KLV9mdW5jX2V4aXRfOwotCiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCkBAIC0xNjAsMjIgKzE0NywxOCBAQAogewogCXN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrOwogCi1fZnVuY19lbnRlcl87Ci0KIAlzcGluX2xvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKIAogCWlmIChfcnR3X3F1ZXVlX2VtcHR5KHF1ZXVlKSkgewogCQlwbmV0d29yayA9IE5VTEw7CiAJfSBlbHNlIHsKLQkJcG5ldHdvcmsgPSBMSVNUX0NPTlRBSU5PUihnZXRfbmV4dCgmcXVldWUtPnF1ZXVlKSwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJCXBuZXR3b3JrID0gY29udGFpbmVyX29mKCgmcXVldWUtPnF1ZXVlKS0+bmV4dCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAKIAkJcnR3X2xpc3RfZGVsZXRlKCYocG5ldHdvcmstPmxpc3QpKTsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmcXVldWUtPmxvY2spOwogCi1fZnVuY19leGl0XzsKLQogCXJldHVybiBwbmV0d29yazsKIH0KIApAQCAtMTg1LDE3ICsxNjgsMTUgQEAKIAlzdHJ1Y3QgX19xdWV1ZSAqZnJlZV9xdWV1ZSA9ICZwbWxtZXByaXYtPmZyZWVfYnNzX3Bvb2w7CiAJc3RydWN0IGxpc3RfaGVhZCAqcGxpc3QgPSBOVUxMOwogCi1fZnVuY19lbnRlcl87Ci0KIAlzcGluX2xvY2tfYmgoJmZyZWVfcXVldWUtPmxvY2spOwogCiAJaWYgKF9ydHdfcXVldWVfZW1wdHkoZnJlZV9xdWV1ZSkgPT0gdHJ1ZSkgewogCQlwbmV0d29yayA9IE5VTEw7CiAJCWdvdG8gZXhpdDsKIAl9Ci0JcGxpc3QgPSBnZXRfbmV4dCgmKGZyZWVfcXVldWUtPnF1ZXVlKSk7CisJcGxpc3QgPSBmcmVlX3F1ZXVlLT5xdWV1ZS5uZXh0OwogCi0JcG5ldHdvcmsgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCAsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBsaXN0ICwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAKIAlydHdfbGlzdF9kZWxldGUoJnBuZXR3b3JrLT5saXN0KTsKIApAQCAtMjExLDggKzE5Miw2IEBACiBleGl0OgogCXNwaW5fdW5sb2NrX2JoKCZmcmVlX3F1ZXVlLT5sb2NrKTsKIAotX2Z1bmNfZXhpdF87Ci0KIAlyZXR1cm4gcG5ldHdvcms7CiB9CiAKQEAgLTIyMiwxMyArMjAxLDExIEBACiAJdTMyIGxpZmV0aW1lID0gU0NBTlFVRVVFX0xJRkVUSU1FOwogCXN0cnVjdCBfX3F1ZXVlICpmcmVlX3F1ZXVlID0gJihwbWxtZXByaXYtPmZyZWVfYnNzX3Bvb2wpOwogCi1fZnVuY19lbnRlcl87Ci0KIAlpZiAocG5ldHdvcmsgPT0gTlVMTCkKLQkJZ290byBleGl0OworCQlyZXR1cm47CiAKIAlpZiAocG5ldHdvcmstPmZpeGVkKQotCQlnb3RvIGV4aXQ7CisJCXJldHVybjsKIAljdXJyX3RpbWUgPSBqaWZmaWVzOwogCWlmICgoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkgfHwKIAkgICAgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSkpCkBAIC0yMzYsMzMgKzIxMywyNiBAQAogCWlmICghaXNmcmVlYWxsKSB7CiAJCWRlbHRhX3RpbWUgPSAoY3Vycl90aW1lIC0gcG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCkvSFo7CiAJCWlmIChkZWx0YV90aW1lIDwgbGlmZXRpbWUpLyogIHVuaXQ6c2VjICovCi0JCQlnb3RvIGV4aXQ7CisJCQlyZXR1cm47CiAJfQogCXNwaW5fbG9ja19iaCgmZnJlZV9xdWV1ZS0+bG9jayk7CiAJcnR3X2xpc3RfZGVsZXRlKCYocG5ldHdvcmstPmxpc3QpKTsKIAlydHdfbGlzdF9pbnNlcnRfdGFpbCgmKHBuZXR3b3JrLT5saXN0KSwgJihmcmVlX3F1ZXVlLT5xdWV1ZSkpOwogCXBtbG1lcHJpdi0+bnVtX29mX3NjYW5uZWQtLTsKIAlzcGluX3VubG9ja19iaCgmZnJlZV9xdWV1ZS0+bG9jayk7Ci0KLWV4aXQ6Ci1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBfcnR3X2ZyZWVfbmV0d29ya19ub2xvY2soc3RydWN0CW1sbWVfcHJpdiAqcG1sbWVwcml2LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaykKIHsKIAlzdHJ1Y3QgX19xdWV1ZSAqZnJlZV9xdWV1ZSA9ICYocG1sbWVwcml2LT5mcmVlX2Jzc19wb29sKTsKIAotX2Z1bmNfZW50ZXJfOwogCWlmIChwbmV0d29yayA9PSBOVUxMKQotCQlnb3RvIGV4aXQ7CisJCXJldHVybjsKIAlpZiAocG5ldHdvcmstPmZpeGVkKQotCQlnb3RvIGV4aXQ7CisJCXJldHVybjsKIAlydHdfbGlzdF9kZWxldGUoJihwbmV0d29yay0+bGlzdCkpOwogCXJ0d19saXN0X2luc2VydF90YWlsKCYocG5ldHdvcmstPmxpc3QpLCBnZXRfbGlzdF9oZWFkKGZyZWVfcXVldWUpKTsKIAlwbWxtZXByaXYtPm51bV9vZl9zY2FubmVkLS07Ci1leGl0OgotCi1fZnVuY19leGl0XzsKIH0KIAogLyoKQEAgLTI3NiwyNCArMjQ2LDIyIEBACiAJc3RydWN0CXdsYW5fbmV0d29yayAqcG5ldHdvcmsgPSBOVUxMOwogCXU4IHplcm9fYWRkcltFVEhfQUxFTl0gPSB7MCwgMCwgMCwgMCwgMCwgMH07CiAKLV9mdW5jX2VudGVyXzsKLQlpZiAoX3J0d19tZW1jbXAoemVyb19hZGRyLCBhZGRyLCBFVEhfQUxFTikpIHsKKwlpZiAoIW1lbWNtcCh6ZXJvX2FkZHIsIGFkZHIsIEVUSF9BTEVOKSkgewogCQlwbmV0d29yayA9IE5VTEw7CiAJCWdvdG8gZXhpdDsKIAl9CiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHNjYW5uZWRfcXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAocGxpc3QgIT0gcGhlYWQpIHsKLQkJcG5ldHdvcmsgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yayAsIGxpc3QpOwotCQlpZiAoX3J0d19tZW1jbXAoYWRkciwgcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywgRVRIX0FMRU4pID09IHRydWUpCisJCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICwgbGlzdCk7CisJCWlmICghbWVtY21wKGFkZHIsIHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsIEVUSF9BTEVOKSkKIAkJCWJyZWFrOwotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAl9CiAJaWYgKHBsaXN0ID09IHBoZWFkKQogCQlwbmV0d29yayA9IE5VTEw7CiBleGl0OgotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHBuZXR3b3JrOwogfQogCkBAIC0zMDUsMjkgKzI3MywyNCBAQAogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IF9fcXVldWUgKnNjYW5uZWRfcXVldWUgPSAmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlOwogCi1fZnVuY19lbnRlcl87Ci0KLQogCXNwaW5fbG9ja19iaCgmc2Nhbm5lZF9xdWV1ZS0+bG9jayk7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQoc2Nhbm5lZF9xdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlIChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpID09IGZhbHNlKSB7Ci0JCXBuZXR3b3JrID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKIAkJX3J0d19mcmVlX25ldHdvcmsocG1sbWVwcml2LCBwbmV0d29yaywgaXNmcmVlYWxsKTsKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJnNjYW5uZWRfcXVldWUtPmxvY2spOwotX2Z1bmNfZXhpdF87CiB9CiAKIGludCBydHdfaWZfdXAoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewogCWludCByZXM7Ci1fZnVuY19lbnRlcl87CiAKIAlpZiAocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkIHx8CiAJICAgIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIF9GV19MSU5LRUQpID09IGZhbHNlKSkgewpAQCAtMzM4LDggKzMwMSw2IEBACiAJfSBlbHNlIHsKIAkJcmVzID0gIHRydWU7CiAJfQotCi1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC0zNDcsMTQgKzMwOCwxMiBAQAogewogCXUzMgljdXJ0aW1lID0gamlmZmllczsKIAotX2Z1bmNfZW50ZXJfOwogCXBpYnNzWzBdID0gMHgwMjsgIC8qIGluIGFkLWhvYyBtb2RlIGJpdDEgbXVzdCBzZXQgdG8gMSAqLwogCXBpYnNzWzFdID0gMHgxMTsKIAlwaWJzc1syXSA9IDB4ODc7CiAJcGlic3NbM10gPSAodTgpKGN1cnRpbWUgJiAweGZmKTsvKiBwWzBdOyAqLwogCXBpYnNzWzRdID0gKHU4KSgoY3VydGltZT4+OCkgJiAweGZmKTsvKiBwWzFdOyAqLwogCXBpYnNzWzVdID0gKHU4KSgoY3VydGltZT4+MTYpICYgMHhmZik7LyogcFsyXTsgKi8KLV9mdW5jX2V4aXRfOwogCXJldHVybjsKIH0KIApAQCAtMzY3LDExICszMjYsOSBAQAogdTE2IHJ0d19nZXRfY2FwYWJpbGl0eShzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqYnNzKQogewogCV9fbGUxNgl2YWw7Ci1fZnVuY19lbnRlcl87CiAKIAltZW1jcHkoKHU4ICopJnZhbCwgcnR3X2dldF9jYXBhYmlsaXR5X2Zyb21faWUoYnNzLT5JRXMpLCAyKTsKIAotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIGxlMTZfdG9fY3B1KHZhbCk7CiB9CiAKQEAgLTM4NSw0NiArMzQyLDM0IEBACiAJcmV0dXJuIGllICsgODsKIH0KIAotaW50CXJ0d19pbml0X21sbWVfcHJpdiAoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKS8qIHN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdikgKi8KK2ludCBydHdfaW5pdF9tbG1lX3ByaXYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewogCWludAlyZXM7Ci1fZnVuY19lbnRlcl87CiAJcmVzID0gX3J0d19pbml0X21sbWVfcHJpdihwYWRhcHRlcik7LyogIChwbWxtZXByaXYpOyAqLwotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJlczsKIH0KIAotdm9pZCBydHdfZnJlZV9tbG1lX3ByaXYgKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKK3ZvaWQgcnR3X2ZyZWVfbWxtZV9wcml2KHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKIHsKLV9mdW5jX2VudGVyXzsKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLCAoInJ0d19mcmVlX21sbWVfcHJpdlxuIikpOwotCV9ydHdfZnJlZV9tbG1lX3ByaXYgKHBtbG1lcHJpdik7Ci1fZnVuY19leGl0XzsKKwlfcnR3X2ZyZWVfbWxtZV9wcml2KHBtbG1lcHJpdik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpydHdfYWxsb2NfbmV0d29yayhzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpCiB7Ci0Jc3RydWN0CXdsYW5fbmV0d29yawkqcG5ldHdvcms7Ci1fZnVuY19lbnRlcl87Ci0JcG5ldHdvcmsgPSBfcnR3X2FsbG9jX25ldHdvcmsocG1sbWVwcml2KTsKLV9mdW5jX2V4aXRfOwotCXJldHVybiBwbmV0d29yazsKKwlyZXR1cm4gX3J0d19hbGxvY19uZXR3b3JrKHBtbG1lcHJpdik7CiB9CiAKIHN0YXRpYyB2b2lkIHJ0d19mcmVlX25ldHdvcmtfbm9sb2NrKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiwKIAkJCQkgICAgc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmspCiB7Ci1fZnVuY19lbnRlcl87CiAJX3J0d19mcmVlX25ldHdvcmtfbm9sb2NrKHBtbG1lcHJpdiwgcG5ldHdvcmspOwotX2Z1bmNfZXhpdF87CiB9CiAKIAogdm9pZCBydHdfZnJlZV9uZXR3b3JrX3F1ZXVlKHN0cnVjdCBhZGFwdGVyICpkZXYsIHU4IGlzZnJlZWFsbCkKIHsKLV9mdW5jX2VudGVyXzsKIAlfcnR3X2ZyZWVfbmV0d29ya19xdWV1ZShkZXYsIGlzZnJlZWFsbCk7Ci1fZnVuY19leGl0XzsKIH0KIAogLyoKQEAgLTQ1OCw3ICs0MDMsNyBAQAogc3RhdGljIGludCBpc19zYW1lX2VzcyhzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqYSwgc3RydWN0IHdsYW5fYnNzaWRfZXggKmIpCiB7CiAJcmV0dXJuIChhLT5Tc2lkLlNzaWRMZW5ndGggPT0gYi0+U3NpZC5Tc2lkTGVuZ3RoKSAmJgotCSAgICAgICBfcnR3X21lbWNtcChhLT5Tc2lkLlNzaWQsIGItPlNzaWQuU3NpZCwgYS0+U3NpZC5Tc2lkTGVuZ3RoKTsKKwkgICAgICAgIW1lbWNtcChhLT5Tc2lkLlNzaWQsIGItPlNzaWQuU3NpZCwgYS0+U3NpZC5Tc2lkTGVuZ3RoKTsKIH0KIAogaW50IGlzX3NhbWVfbmV0d29yayhzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqc3JjLCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqZHN0KQpAQCAtNDY2LDcgKzQxMSw2IEBACiAJIHUxNiBzX2NhcCwgZF9jYXA7CiAJX19sZTE2IGxlX3NjYXAsIGxlX2RjYXA7CiAKLV9mdW5jX2VudGVyXzsKIAltZW1jcHkoKHU4ICopJmxlX3NjYXAsIHJ0d19nZXRfY2FwYWJpbGl0eV9mcm9tX2llKHNyYy0+SUVzKSwgMik7CiAJbWVtY3B5KCh1OCAqKSZsZV9kY2FwLCBydHdfZ2V0X2NhcGFiaWxpdHlfZnJvbV9pZShkc3QtPklFcyksIDIpOwogCkBAIC00NzQsMTEgKzQxOCw5IEBACiAJc19jYXAgPSBsZTE2X3RvX2NwdShsZV9zY2FwKTsKIAlkX2NhcCA9IGxlMTZfdG9fY3B1KGxlX2RjYXApOwogCi1fZnVuY19leGl0XzsKLQogCXJldHVybiAoKHNyYy0+U3NpZC5Tc2lkTGVuZ3RoID09IGRzdC0+U3NpZC5Tc2lkTGVuZ3RoKSAmJgotCQkoKF9ydHdfbWVtY21wKHNyYy0+TWFjQWRkcmVzcywgZHN0LT5NYWNBZGRyZXNzLCBFVEhfQUxFTikpID09IHRydWUpICYmCi0JCSgoX3J0d19tZW1jbXAoc3JjLT5Tc2lkLlNzaWQsIGRzdC0+U3NpZC5Tc2lkLCBzcmMtPlNzaWQuU3NpZExlbmd0aCkpID09IHRydWUpICYmCisJCSgoIW1lbWNtcChzcmMtPk1hY0FkZHJlc3MsIGRzdC0+TWFjQWRkcmVzcywgRVRIX0FMRU4pKSA9PSB0cnVlKSAmJgorCQkoKCFtZW1jbXAoc3JjLT5Tc2lkLlNzaWQsIGRzdC0+U3NpZC5Tc2lkLCBzcmMtPlNzaWQuU3NpZExlbmd0aCkpID09IHRydWUpICYmCiAJCSgoc19jYXAgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykgPT0KIAkJKGRfY2FwICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpKSAmJgogCQkoKHNfY2FwICYgV0xBTl9DQVBBQklMSVRZX0JTUykgPT0KQEAgLTQ5MSwyNSArNDMzLDIzIEBACiAJc3RydWN0CXdsYW5fbmV0d29yawkqcHdsYW4gPSBOVUxMOwogCXN0cnVjdAl3bGFuX25ldHdvcmsJKm9sZGVzdCA9IE5VTEw7CiAKLV9mdW5jX2VudGVyXzsKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQoc2Nhbm5lZF9xdWV1ZSk7CiAKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKDEpIHsKIAkJaWYgKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkgPT0gdHJ1ZSkKIAkJCWJyZWFrOwogCi0JCXB3bGFuID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCQlwd2xhbiA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAKIAkJaWYgKCFwd2xhbi0+Zml4ZWQpIHsKIAkJCWlmIChvbGRlc3QgPT0gTlVMTCB8fCB0aW1lX2FmdGVyKG9sZGVzdC0+bGFzdF9zY2FubmVkLCBwd2xhbi0+bGFzdF9zY2FubmVkKSkKIAkJCQlvbGRlc3QgPSBwd2xhbjsKIAkJfQogCi0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCX0KLV9mdW5jX2V4aXRfOwogCXJldHVybiBvbGRlc3Q7CiB9CiAKQEAgLTUyMiw3ICs0NjIsNiBAQAogCXU4IHNxX2ZpbmFsOwogCWxvbmcgcnNzaV9maW5hbDsKIAotX2Z1bmNfZW50ZXJfOwogCXJ0d19oYWxfYW50ZGl2X3Jzc2lfY29tcGFyZWQocGFkYXB0ZXIsIGRzdCwgc3JjKTsgLyogdGhpcyB3aWxsIHVwZGF0ZSBzcmMuUnNzaSwgbmVlZCBjb25zaWRlciBhZ2FpbiAqLwogCiAJLyogVGhlIHJ1bGUgYmVsb3cgaXMgMS81IGZvciBzYW1wbGUgdmFsdWUsIDQvNSBmb3IgaGlzdG9yeSB2YWx1ZSAqLwpAQCAtNTUzLDIyICs0OTIsMTggQEAKIAlkc3QtPlBoeUluZm8uU2lnbmFsUXVhbGl0eSA9IHNxX2ZpbmFsOwogCWRzdC0+UnNzaSA9IHJzc2lfZmluYWw7CiAKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdm9pZCB1cGRhdGVfY3VycmVudF9uZXR3b3JrKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmspCiB7CiAJc3RydWN0CW1sbWVfcHJpdgkqcG1sbWVwcml2ID0gJihhZGFwdGVyLT5tbG1lcHJpdik7CiAKLV9mdW5jX2VudGVyXzsKLQogCWlmICgoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpID09IHRydWUpICYmCiAJICAgIChpc19zYW1lX25ldHdvcmsoJihwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmspLCBwbmV0d29yaykpKSB7CiAJCXVwZGF0ZV9uZXR3b3JrKCYocG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrKSwgcG5ldHdvcmssIGFkYXB0ZXIsIHRydWUpOwogCQlydHdfdXBkYXRlX3Byb3RlY3Rpb24oYWRhcHRlciwgKHBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5JRXMpICsgc2l6ZW9mKHN0cnVjdCBuZGlzXzgwMl8xMV9maXhlZF9pZSksCiAJCQkJICAgICAgcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLklFTGVuZ3RoKTsKIAl9Ci1fZnVuY19leGl0XzsKIH0KIAogLyoKQEAgLTU4MywyNCArNTE4LDIyIEBACiAJc3RydWN0IHdsYW5fbmV0d29yawkqcG5ldHdvcmsgPSBOVUxMOwogCXN0cnVjdCB3bGFuX25ldHdvcmsJKm9sZGVzdCA9IE5VTEw7CiAKLV9mdW5jX2VudGVyXzsKLQogCXNwaW5fbG9ja19iaCgmcXVldWUtPmxvY2spOwogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICgxKSB7CiAJCWlmIChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpID09IHRydWUpCiAJCQlicmVhazsKIAotCQlwbmV0d29yawk9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwkJcG5ldHdvcmsJPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCiAJCWlmIChpc19zYW1lX25ldHdvcmsoJihwbmV0d29yay0+bmV0d29yayksIHRhcmdldCkpCiAJCQlicmVhazsKIAkJaWYgKChvbGRlc3QgPT0gKChzdHJ1Y3Qgd2xhbl9uZXR3b3JrICopMCkpIHx8CiAJCSAgICB0aW1lX2FmdGVyKG9sZGVzdC0+bGFzdF9zY2FubmVkLCBwbmV0d29yay0+bGFzdF9zY2FubmVkKSkKIAkJCW9sZGVzdCA9IHBuZXR3b3JrOwotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAl9CiAJLyogSWYgd2UgZGlkbid0IGZpbmQgYSBtYXRjaCwgdGhlbiBnZXQgYSBuZXcgbmV0d29yayBzbG90IHRvIGluaXRpYWxpemUKIAkgKiB3aXRoIHRoaXMgYmVhY29uJ3MgaW5mb3JtYXRpb24gKi8KQEAgLTY2MywyNyArNTk2LDI2IEBACiBleGl0OgogCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZS0+bG9jayk7CiAKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdm9pZCBydHdfYWRkX25ldHdvcmsoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkgICAgc3RydWN0IHdsYW5fYnNzaWRfZXggKnBuZXR3b3JrKQogewotX2Z1bmNfZW50ZXJfOwogI2lmIGRlZmluZWQoQ09ORklHXzg4RVVfUDJQKQogCXJ0d193bGFuX2Jzc2lkX2V4X3JlbW92ZV9wMnBfYXR0cihwbmV0d29yaywgUDJQX0FUVFJfR1JPVVBfSU5GTyk7CiAjZW5kaWYKIAl1cGRhdGVfY3VycmVudF9uZXR3b3JrKGFkYXB0ZXIsIHBuZXR3b3JrKTsKIAlydHdfdXBkYXRlX3NjYW5uZWRfbmV0d29yayhhZGFwdGVyLCBwbmV0d29yayk7Ci1fZnVuY19leGl0XzsKIH0KIAotLyogc2VsZWN0IHRoZSBkZXNpcmVkIG5ldHdvcmsgYmFzZWQgb24gdGhlIGNhcGFiaWxpdHkgb2YgdGhlIChpKWJzcy4gKi8KLS8qICBjaGVjayBpdGVtczoJKDEpIHNlY3VyaXR5ICovCi0vKiAJCQkoMikgbmV0d29ya190eXBlICovCi0vKiAJCQkoMykgV01NICovCi0vKgkJCSg0KSBIVCAqLwotLyoJCQkoNSkgb3RoZXJzICovCisvKgorICogc2VsZWN0IHRoZSBkZXNpcmVkIG5ldHdvcmsgYmFzZWQgb24gdGhlIGNhcGFiaWxpdHkgb2YgdGhlIChpKWJzcy4KKyAqIGNoZWNrIGl0ZW1zOgkoMSkgc2VjdXJpdHkKKyAqCQkJKDIpIG5ldHdvcmtfdHlwZQorICoJCQkoMykgV01NCisgKgkJCSg0KSBIVAorICoJCQkoNSkgb3RoZXJzCisgKi8KIHN0YXRpYyBpbnQgcnR3X2lzX2Rlc2lyZWRfbmV0d29yayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmspCiB7CiAJc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmYWRhcHRlci0+c2VjdXJpdHlwcml2OwpAQCAtNzI4LDkgKzY2MCw3IEBACiAvKiBUT0RPOiBQZXJyeTogRm9yIFBvd2VyIE1hbmFnZW1lbnQgKi8KIHZvaWQgcnR3X2F0aW1kb25lX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBhZGFwdGVyCSphZGFwdGVyICwgdTggKnBidWYpCiB7Ci1fZnVuY19lbnRlcl87CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywgKCJyZWNlaXZlIGF0aW1kb25lX2V2ZXRcbiIpKTsKLV9mdW5jX2V4aXRfOwogCXJldHVybjsKIH0KIApAQCAtNzQxLDggKzY3MSw2IEBACiAJc3RydWN0IHdsYW5fYnNzaWRfZXggKnBuZXR3b3JrOwogCXN0cnVjdAltbG1lX3ByaXYJKnBtbG1lcHJpdiA9ICYoYWRhcHRlci0+bWxtZXByaXYpOwogCi1fZnVuY19lbnRlcl87Ci0KIAlwbmV0d29yayA9IChzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqKXBidWY7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCJydHdfc3VydmV5X2V2ZW50X2NhbGxiYWNrLCBzc2lkPSVzXG4iLCAgcG5ldHdvcmstPlNzaWQuU3NpZCkpOwpAQCAtNzU2LDcgKzY4NCw3IEBACiAKIAkvKiAgdXBkYXRlIElCU1NfbmV0d29yayAncyB0aW1lc3RhbXAgKi8KIAlpZiAoKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpID09IHRydWUpIHsKLQkJaWYgKF9ydHdfbWVtY21wKCYocG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLk1hY0FkZHJlc3MpLCBwbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pKSB7CisJCWlmICghbWVtY21wKCYocG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLk1hY0FkZHJlc3MpLCBwbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pKSB7CiAJCQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICppYnNzX3dsYW4gPSBOVUxMOwogCiAJCQltZW1jcHkocG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLklFcywgcG5ldHdvcmstPklFcywgOCk7CkBAIC03ODEsMjAgKzcwOSwxNCBAQAogZXhpdDoKIAogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi1fZnVuY19leGl0XzsKLQogCXJldHVybjsKIH0KIAotCi0KIHZvaWQgcnR3X3N1cnZleWRvbmVfZXZlbnRfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIJKmFkYXB0ZXIsIHU4ICpwYnVmKQogewogCXN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICYoYWRhcHRlci0+bWxtZXByaXYpOwogCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dDsKIAotX2Z1bmNfZW50ZXJfOwogCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKIAogCWlmIChwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWUpIHsKQEAgLTg4NCw3ICs4MDYsNiBAQAogCXBtbG1lZXh0ID0gJmFkYXB0ZXItPm1sbWVleHRwcml2OwogCWlmIChwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuYnNzX2NudCA9PSAwKQogCQlydHdfaGFsX3NyZXNldF9yZXNldChhZGFwdGVyKTsKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19kdW1teV9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciAsIHU4ICpwYnVmKQpAQCAtOTAxLDE3ICs4MjIsMTUgQEAKIAlzdHJ1Y3QgX19xdWV1ZSAqc2Nhbl9xdWV1ZSA9ICZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWU7CiAJc3RydWN0IGxpc3RfaGVhZCAqcGxpc3QsICpwaGVhZCwgKnB0ZW1wOwogCi1fZnVuY19lbnRlcl87Ci0KIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9ub3RpY2VfLCAoIitmcmVlX3NjYW5xdWV1ZVxuIikpOwogCXNwaW5fbG9ja19iaCgmc2Nhbl9xdWV1ZS0+bG9jayk7CiAJc3Bpbl9sb2NrX2JoKCZmcmVlX3F1ZXVlLT5sb2NrKTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChzY2FuX3F1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKHBsaXN0ICE9IHBoZWFkKSB7Ci0JCXB0ZW1wID0gZ2V0X25leHQocGxpc3QpOworCQlwdGVtcCA9IHBsaXN0LT5uZXh0OwogCQlydHdfbGlzdF9kZWxldGUocGxpc3QpOwogCQlydHdfbGlzdF9pbnNlcnRfdGFpbChwbGlzdCwgJmZyZWVfcXVldWUtPnF1ZXVlKTsKIAkJcGxpc3QgPSBwdGVtcDsKQEAgLTkyMCw4ICs4MzksNiBAQAogCiAJc3Bpbl91bmxvY2tfYmgoJmZyZWVfcXVldWUtPmxvY2spOwogCXNwaW5fdW5sb2NrX2JoKCZzY2FuX3F1ZXVlLT5sb2NrKTsKLQotX2Z1bmNfZXhpdF87CiB9CiAKIC8qCkBAIC05MzQsOCArODUxLDYgQEAKIAlzdHJ1Y3QJc3RhX3ByaXYgKnBzdGFwcml2ID0gJmFkYXB0ZXItPnN0YXByaXY7CiAJc3RydWN0IHdsYW5fbmV0d29yayAqdGd0X25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKIAotX2Z1bmNfZW50ZXJfOwotCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywgKCIrcnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzXG4iKSk7CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCiAJCSAoInRndF9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3M9JXBNIHNzaWQ9JXNcbiIsCkBAIC05NzksNyArODk0LDYgQEAKIAlpZiAobG9ja19zY2FubmVkX3F1ZXVlKQogCQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwogCXBtbG1lcHJpdi0+a2V5X21hc2sgPSAwOwotX2Z1bmNfZXhpdF87CiB9CiAKIC8qCkBAIC05ODksOCArOTAzLDYgQEAKIHsKIAlzdHJ1Y3QgbWxtZV9wcml2CSpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCi1fZnVuY19lbnRlcl87Ci0KIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLCAoIitydHdfaW5kaWNhdGVfY29ubmVjdFxuIikpOwogCiAJcG1sbWVwcml2LT50b19qb2luID0gZmFsc2U7CkBAIC0xMDA4LDcgKzkyMCw2IEBACiAJcnR3X3NldF9zY2FuX2RlbnkocGFkYXB0ZXIsIDMwMDApOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywgKCItcnR3X2luZGljYXRlX2Nvbm5lY3Q6IGZ3X3N0YXRlPTB4JTA4eFxuIiwgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSkpOwotX2Z1bmNfZXhpdF87CiB9CiAKIC8qCkBAIC0xMDE4LDcgKzkyOSw2IEBACiB7CiAJc3RydWN0CW1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAotX2Z1bmNfZW50ZXJfOwogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sICgiK3J0d19pbmRpY2F0ZV9kaXNjb25uZWN0XG4iKSk7CiAKIAlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcgfCBXSUZJX1VOREVSX1dQUyk7CkBAIC0xMDM4LDggKzk0OCw2IEBACiAJcDJwX3BzX3drX2NtZChwYWRhcHRlciwgUDJQX1BTX0RJU0FCTEUsIDEpOwogCiAJcnR3X2xwc19jdHJsX3drX2NtZChwYWRhcHRlciwgTFBTX0NUUkxfRElTQ09OTkVDVCwgMSk7Ci0KLV9mdW5jX2V4aXRfOwogfQogCiBpbmxpbmUgdm9pZCBydHdfaW5kaWNhdGVfc2Nhbl9kb25lKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgYm9vbCBhYm9ydGVkKQpAQCAtMTEwMCw5ICsxMDA4LDEyIEBACiAJCQlfcnR3X21lbXNldCgodTggKikmcHN0YS0+ZG90MTF0eHBuLCAwLCBzaXplb2YodW5pb24gcG40OCkpOwogCQkJX3J0d19tZW1zZXQoKHU4ICopJnBzdGEtPmRvdDExcnhwbiwgMCwgc2l6ZW9mKHVuaW9uIHBuNDgpKTsKIAkJfQotCQkvKiAJQ29tbWVudGVkIGJ5IEFsYmVydCAyMDEyLzA3LzIxICovCi0JCS8qIAlXaGVuIGRvaW5nIHRoZSBXUFMsIHRoZSB3cHNfaWVfbGVuIHdvbid0IGVxdWFsIHRvIDAgKi8KLQkJLyogCUFuZCB0aGUgV2ktRmkgZHJpdmVyIHNob3VsZG4ndCBhbGxvdyB0aGUgZGF0YSBwYWNrZXQgdG8gYmUgdHJhbXNtaXR0ZWQuICovCisJCS8qCisJCSAqIENvbW1lbnRlZCBieSBBbGJlcnQgMjAxMi8wNy8yMQorCQkgKiBXaGVuIGRvaW5nIHRoZSBXUFMsIHRoZSB3cHNfaWVfbGVuIHdvbid0IGVxdWFsIHRvIDAKKwkJICogQW5kIHRoZSBXaS1GaSBkcml2ZXIgc2hvdWxkbid0IGFsbG93IHRoZSBkYXRhCisJCSAqIHBhY2tldCB0byBiZSB0cmFtc21pdHRlZC4KKwkJICovCiAJCWlmIChwYWRhcHRlci0+c2VjdXJpdHlwcml2Lndwc19pZV9sZW4gIT0gMCkgewogCQkJcHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPSB0cnVlOwogCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi53cHNfaWVfbGVuID0gMDsKQEAgLTEyMDYsOCArMTExNyw2IEBACiAJc3RydWN0IHdsYW5fbmV0d29yawkqcGN1cl93bGFuID0gTlVMTCwgKnB0YXJnZXRfd2xhbiA9IE5VTEw7CiAJdW5zaWduZWQgaW50CQl0aGVfc2FtZV9tYWNhZGRyID0gZmFsc2U7CiAKLV9mdW5jX2VudGVyXzsKLQogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLCAoImpvaW5ic3MgZXZlbnQgY2FsbCBiYWNrIHJlY2VpdmVkIHdpdGggcmVzPSVkXG4iLCBwbmV0d29yay0+am9pbl9yZXMpKTsKIAogCXJ0d19nZXRfZW5jcnlwdF9kZWNyeXB0X2Zyb21fcmVnaXN0cnlwcml2KGFkYXB0ZXIpOwpAQCAtMTIxOCwxMiArMTEyNywxMiBAQAogCWVsc2UKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywgKCJAQEBAQCAgIHJ0d19qb2luYnNzX2V2ZW50X2NhbGxiYWNrIGZvciBTU2lkOiVzXG4iLCBwbWxtZXByaXYtPmFzc29jX3NzaWQuU3NpZCkpOwogCi0JdGhlX3NhbWVfbWFjYWRkciA9IF9ydHdfbWVtY21wKHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsIGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsIEVUSF9BTEVOKTsKKwl0aGVfc2FtZV9tYWNhZGRyID0gIW1lbWNtcChwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLCBjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CiAKIAlwbmV0d29yay0+bmV0d29yay5MZW5ndGggPSBnZXRfd2xhbl9ic3NpZF9leF9zeigmcG5ldHdvcmstPm5ldHdvcmspOwogCWlmIChwbmV0d29yay0+bmV0d29yay5MZW5ndGggPiBzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sICgiXG5cbiAqKipqb2luYnNzX2V2dF9jYWxsYmFjayByZXR1cm4gYSB3cm9uZyBic3MgKioqXG5cbiIpKTsKLQkJZ290byBpZ25vcmVfbm9sb2NrOworCQlyZXR1cm47CiAJfQogCiAJc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwpAQCAtMTMxOSwyNyArMTIyOCwyMSBAQAogCiBpZ25vcmVfam9pbmJzc19jYWxsYmFjazoKIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLWlnbm9yZV9ub2xvY2s6Ci1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfam9pbmJzc19ldmVudF9jYWxsYmFjayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggKnBidWYpCiB7CiAJc3RydWN0IHdsYW5fbmV0d29yawkqcG5ldHdvcmsJPSAoc3RydWN0IHdsYW5fbmV0d29yayAqKXBidWY7CiAKLV9mdW5jX2VudGVyXzsKLQogCW1sbWVleHRfam9pbmJzc19ldmVudF9jYWxsYmFjayhhZGFwdGVyLCBwbmV0d29yay0+am9pbl9yZXMpOwogCiAJcnR3X29zX3htaXRfc2NoZWR1bGUoYWRhcHRlcik7Ci0KLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdTggc2VhcmNoX21heF9tYWNfaWQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewogCXU4IG1hY19pZDsKLSNpZiBkZWZpbmVkIChDT05GSUdfODhFVV9BUF9NT0RFKQorI2lmIGRlZmluZWQoQ09ORklHXzg4RVVfQVBfTU9ERSkKIAl1OCBhaWQ7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJihwYWRhcHRlci0+bWxtZXByaXYpOwogCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7CkBAIC0xMzQ3LDcgKzEyNTAsNyBAQAogCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICYocGFkYXB0ZXItPm1sbWVleHRwcml2KTsKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwogCi0jaWYgZGVmaW5lZCAoQ09ORklHXzg4RVVfQVBfTU9ERSkKKyNpZiBkZWZpbmVkKENPTkZJR184OEVVX0FQX01PREUpCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgewogCQlmb3IgKGFpZCA9IChwc3RhcHJpdi0+bWF4X251bV9zdGEpOyBhaWQgPiAwOyBhaWQtLSkgewogCQkJaWYgKHBzdGFwcml2LT5zdGFfYWlkW2FpZC0xXSAhPSBOVUxMKQpAQCAtMTM4OCwxOSArMTI5MSwxNyBAQAogCXN0cnVjdCB3bGFuX25ldHdvcmsJKmN1cl9uZXR3b3JrID0gJihwbWxtZXByaXYtPmN1cl9uZXR3b3JrKTsKIAlzdHJ1Y3Qgd2xhbl9uZXR3b3JrCSpwdGFyZ2V0X3dsYW4gPSBOVUxMOwogCi1fZnVuY19lbnRlcl87Ci0KIAlpZiAocnR3X2FjY2Vzc19jdHJsKGFkYXB0ZXIsIHBzdGFzc29jLT5tYWNhZGRyKSA9PSBmYWxzZSkKIAkJcmV0dXJuOwogCi0jaWYgZGVmaW5lZCAoQ09ORklHXzg4RVVfQVBfTU9ERSkKKyNpZiBkZWZpbmVkKENPTkZJR184OEVVX0FQX01PREUpCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgewogCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvKCZhZGFwdGVyLT5zdGFwcml2LCBwc3Rhc3NvYy0+bWFjYWRkcik7CiAJCWlmIChwc3RhKSB7CiAJCQlhcF9zdGFfaW5mb19kZWZlcl91cGRhdGUoYWRhcHRlciwgcHN0YSk7CiAJCQlydHdfc3Rhc3NvY19od19ycHQoYWRhcHRlciwgcHN0YSk7CiAJCX0KLQkJZ290byBleGl0OworCQlyZXR1cm47CiAJfQogI2VuZGlmCiAJLyogZm9yIEFELUhPQyBtb2RlICovCkBAIC0xNDA4LDEyICsxMzA5LDEyIEBACiAJaWYgKHBzdGEgIT0gTlVMTCkgewogCQkvKiB0aGUgc3RhIGhhdmUgYmVlbiBpbiBzdGFfaW5mb19xdWV1ZSA9PiBkbyBub3RoaW5nICovCiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sICgiRXJyb3I6IHJ0d19zdGFzc29jX2V2ZW50X2NhbGxiYWNrOiBzdGEgaGFzIGJlZW4gaW4gc3RhX2hhc2hfcXVldWVcbiIpKTsKLQkJZ290byBleGl0OyAvKiBiZXR3ZWVuIGRydiBoYXMgcmVjZWl2ZWQgdGhpcyBldmVudCBiZWZvcmUgYW5kICBmdyBoYXZlIG5vdCB5ZXQgdG8gc2V0IGtleSB0byBDQU1fRU5UUlkpICovCisJCXJldHVybjsgLyogYmV0d2VlbiBkcnYgaGFzIHJlY2VpdmVkIHRoaXMgZXZlbnQgYmVmb3JlIGFuZCAgZncgaGF2ZSBub3QgeWV0IHRvIHNldCBrZXkgdG8gQ0FNX0VOVFJZKSAqLwogCX0KIAlwc3RhID0gcnR3X2FsbG9jX3N0YWluZm8oJmFkYXB0ZXItPnN0YXByaXYsIHBzdGFzc29jLT5tYWNhZGRyKTsKIAlpZiAocHN0YSA9PSBOVUxMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sICgiQ2FuJ3QgYWxsb2Mgc3RhX2luZm8gd2hlbiBydHdfc3Rhc3NvY19ldmVudF9jYWxsYmFja1xuIikpOwotCQlnb3RvIGV4aXQ7CisJCXJldHVybjsKIAl9CiAJLyogdG8gZG86IGluaXQgc3RhX2luZm8gdmFyaWFibGUgKi8KIAlwc3RhLT5xb3Nfb3B0aW9uID0gMDsKQEAgLTE0NDAsOCArMTM0MSw2IEBACiAJfQogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwogCW1sbWVleHRfc3RhX2FkZF9ldmVudF9jYWxsYmFjayhhZGFwdGVyLCBwc3RhKTsKLWV4aXQ6Ci1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfc3RhZGVsX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCAqcGJ1ZikKQEAgLTE0NTYsOCArMTM1NSw2IEBACiAJc3RydWN0CXN0YV9wcml2ICpwc3RhcHJpdiA9ICZhZGFwdGVyLT5zdGFwcml2OwogCXN0cnVjdCB3bGFuX25ldHdvcmsgKnRndF9uZXR3b3JrID0gJihwbWxtZXByaXYtPmN1cl9uZXR3b3JrKTsKIAotX2Z1bmNfZW50ZXJfOwotCiAJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbygmYWRhcHRlci0+c3RhcHJpdiwgcHN0YWRlbC0+bWFjYWRkcik7CiAJaWYgKHBzdGEpCiAJCW1hY19pZCA9IHBzdGEtPm1hY19pZDsKQEAgLTE1NDEsMTQgKzE0MzgsMTEgQEAKIAkJfQogCX0KIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19jcHdtX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggKnBidWYpCiB7Ci1fZnVuY19lbnRlcl87CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywgKCIrcnR3X2Nwd21fZXZlbnRfY2FsbGJhY2sgISEhXG4iKSk7Ci1fZnVuY19leGl0XzsKIH0KIAogLyoKQEAgLTE1NjAsOCArMTQ1NCw2IEBACiAJc3RydWN0CW1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwogCWludCBkb19qb2luX3I7CiAKLV9mdW5jX2VudGVyXzsKLQogCURCR184OEUoIiVzLCBmd19zdGF0ZT0leFxuIiwgX19mdW5jX18sIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwogCiAJaWYgKGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpCkBAIC0xNTkyLDcgKzE0ODQsNiBAQAogCQlmcmVlX3NjYW5xdWV1ZShwbWxtZXByaXYpOy8qICAqLwogCX0KIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLV9mdW5jX2V4aXRfOwogfQogCiAvKgpAQCAtMTY1OCwxNCArMTU0OSwxMiBAQAogCQkvKiAgZXhwaXJlIE5BVDIuNSBlbnRyeSAqLwogCQluYXQyNV9kYl9leHBpcmUoYWRhcHRlcik7CiAKLQkJaWYgKGFkYXB0ZXItPnBwcG9lX2Nvbm5lY3Rpb25faW5fcHJvZ3Jlc3MgPiAwKSB7CisJCWlmIChhZGFwdGVyLT5wcHBvZV9jb25uZWN0aW9uX2luX3Byb2dyZXNzID4gMCkKIAkJCWFkYXB0ZXItPnBwcG9lX2Nvbm5lY3Rpb25faW5fcHJvZ3Jlc3MtLTsKLQkJfQogCiAJCS8qICBkdWUgdG8gcnR3X2R5bmFtaWNfY2hlY2tfdGltZXJfaGFuZGxkZXIoKSBpcyBjYWxsZWQgZXZlcnkgMiBzZWNvbmRzICovCi0JCWlmIChhZGFwdGVyLT5wcHBvZV9jb25uZWN0aW9uX2luX3Byb2dyZXNzID4gMCkgeworCQlpZiAoYWRhcHRlci0+cHBwb2VfY29ubmVjdGlvbl9pbl9wcm9ncmVzcyA+IDApCiAJCQlhZGFwdGVyLT5wcHBvZV9jb25uZWN0aW9uX2luX3Byb2dyZXNzLS07Ci0JCX0KIAl9CiAKIAlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTE2ODcsMTQgKzE1NzYsMTQgQEAKIAogCS8qIGNoZWNrIGJzc2lkLCBpZiBuZWVkZWQgKi8KIAlpZiAocG1sbWVwcml2LT5hc3NvY19ieV9ic3NpZCkgewotCQlpZiAoIV9ydHdfbWVtY21wKGNvbXBldGl0b3ItPm5ldHdvcmsuTWFjQWRkcmVzcywgcG1sbWVwcml2LT5hc3NvY19ic3NpZCwgRVRIX0FMRU4pKQorCQlpZiAobWVtY21wKGNvbXBldGl0b3ItPm5ldHdvcmsuTWFjQWRkcmVzcywgcG1sbWVwcml2LT5hc3NvY19ic3NpZCwgRVRIX0FMRU4pKQogCQkJZ290byBleGl0OwogCX0KIAogCS8qIGNoZWNrIHNzaWQsIGlmIG5lZWRlZCAqLwotCWlmIChwbWxtZXByaXYtPmFzc29jX3NzaWQuU3NpZCAmJiBwbWxtZXByaXYtPmFzc29jX3NzaWQuU3NpZExlbmd0aCkgeworCWlmIChwbWxtZXByaXYtPmFzc29jX3NzaWQuU3NpZExlbmd0aCkgewogCQlpZiAoY29tcGV0aXRvci0+bmV0d29yay5Tc2lkLlNzaWRMZW5ndGggIT0gcG1sbWVwcml2LT5hc3NvY19zc2lkLlNzaWRMZW5ndGggfHwKLQkJICAgIF9ydHdfbWVtY21wKGNvbXBldGl0b3ItPm5ldHdvcmsuU3NpZC5Tc2lkLCBwbWxtZXByaXYtPmFzc29jX3NzaWQuU3NpZCwgcG1sbWVwcml2LT5hc3NvY19zc2lkLlNzaWRMZW5ndGgpID09IGZhbHNlKQorCQkgICAgIW1lbWNtcChjb21wZXRpdG9yLT5uZXR3b3JrLlNzaWQuU3NpZCwgcG1sbWVwcml2LT5hc3NvY19zc2lkLlNzaWQsIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5Tc2lkTGVuZ3RoKSA9PSBmYWxzZSkKIAkJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTE3NDIsMjAgKzE2MzEsMTggQEAKIAlzdHJ1Y3QJd2xhbl9uZXR3b3JrCSpjYW5kaWRhdGUgPSBOVUxMOwogCXU4CXN1cHBfYW50X2RpdiA9IGZhbHNlOwogCi1fZnVuY19lbnRlcl87Ci0KIAlzcGluX2xvY2tfYmgoJihwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jaykpOwogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7CiAJYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXBtbG1lcHJpdi0+bmljX2hkbDsKLQlwbWxtZXByaXYtPnBzY2FubmVkID0gZ2V0X25leHQocGhlYWQpOworCXBtbG1lcHJpdi0+cHNjYW5uZWQgPSBwaGVhZC0+bmV4dDsKIAl3aGlsZSAoIXJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbWxtZXByaXYtPnBzY2FubmVkKSkgewotCQlwbmV0d29yayA9IExJU1RfQ09OVEFJTk9SKHBtbG1lcHJpdi0+cHNjYW5uZWQsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbWxtZXByaXYtPnBzY2FubmVkLCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAkJaWYgKHBuZXR3b3JrID09IE5VTEwpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sICgiJXMgcmV0dXJuIF9GQUlMOihwbmV0d29yaz09TlVMTClcbiIsIF9fZnVuY19fKSk7CiAJCQlyZXQgPSBfRkFJTDsKIAkJCWdvdG8gZXhpdDsKIAkJfQotCQlwbWxtZXByaXYtPnBzY2FubmVkID0gZ2V0X25leHQocG1sbWVwcml2LT5wc2Nhbm5lZCk7CisJCXBtbG1lcHJpdi0+cHNjYW5uZWQgPSBwbWxtZXByaXYtPnBzY2FubmVkLT5uZXh0OwogCQlydHdfY2hlY2tfam9pbl9jYW5kaWRhdGUocG1sbWVwcml2LCAmY2FuZGlkYXRlLCBwbmV0d29yayk7CiAJfQogCWlmIChjYW5kaWRhdGUgPT0gTlVMTCkgewpAQCAtMTc5Miw5ICsxNjc5LDYgQEAKIAogZXhpdDoKIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCi1fZnVuY19leGl0XzsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE4MDUsOCArMTY4OSw2IEBACiAJc3RydWN0CWNtZF9wcml2ICpwY21kcHJpdiA9ICYoYWRhcHRlci0+Y21kcHJpdik7CiAJaW50CQlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwotCiAJcGNtZCA9IChzdHJ1Y3QJY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwY21kID09IE5VTEwpIHsKIAkJcmVzID0gX0ZBSUw7ICAvKiB0cnkgYWdhaW4gKi8KQEAgLTE4MzIsNyArMTcxNCw2IEBACiAJCSBwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtKSk7CiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwY21kKTsKIGV4aXQ6Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC0xODQ1LDcgKzE3MjYsNiBAQAogCXN0cnVjdCBtbG1lX3ByaXYJCSpwbWxtZXByaXYgPSAmKGFkYXB0ZXItPm1sbWVwcml2KTsKIAlpbnQJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAlwY21kID0gKHN0cnVjdAljbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdAljbWRfb2JqKSk7CiAJaWYgKHBjbWQgPT0gTlVMTCkgewogCQlyZXMgPSBfRkFJTDsgIC8qIHRyeSBhZ2FpbiAqLwpAQCAtMTkxNCw3ICsxNzk0LDYgQEAKIAlfcnR3X2luaXRfbGlzdGhlYWQoJnBjbWQtPmxpc3QpOwogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGNtZCk7CiBleGl0OgotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtMTk0NiwxNyArMTgyNSwxNSBAQAogCXJldHVybiBpZWxlbmd0aDsKIH0KIAotLyogICovCi0vKiAgUG9ydGVkIGZyb20gODE4NTogSXNJblByZUF1dGhLZXlMaXN0KCkuIChSZW5hbWVkIGZyb20gU2VjSXNJblByZUF1dGhLZXlMaXN0KCksIDIwMDYtMTAtMTMuKSAqLwotLyogIEFkZGVkIGJ5IEFubmllLCAyMDA2LTA1LTA3LiAqLwotLyogICovCi0vKiAgU2VhcmNoIGJ5IEJTU0lELCAqLwotLyogIFJldHVybiBWYWx1ZTogKi8KLS8qIAkJLTEJCTppZiB0aGVyZSBpcyBubyBwcmUtYXV0aCBrZXkgaW4gdGhlICB0YWJsZSAqLwotLyogCQk+PSAwCQk6aWYgdGhlcmUgaXMgcHJlLWF1dGgga2V5LCBhbmQgICByZXR1cm4gdGhlIGVudHJ5IGlkICovCi0vKiAgKi8KLS8qICAqLwotCisvKgorICogUG9ydGVkIGZyb20gODE4NTogSXNJblByZUF1dGhLZXlMaXN0KCkuCisgKiAoUmVuYW1lZCBmcm9tIFNlY0lzSW5QcmVBdXRoS2V5TGlzdCgpLCAyMDA2LTEwLTEzLikKKyAqIEFkZGVkIGJ5IEFubmllLCAyMDA2LTA1LTA3LgorICogU2VhcmNoIGJ5IEJTU0lELAorICogUmV0dXJuIFZhbHVlOgorICoJCS0xCTppZiB0aGVyZSBpcyBubyBwcmUtYXV0aCBrZXkgaW4gdGhlIHRhYmxlCisgKgkJPj0gMAk6aWYgdGhlcmUgaXMgcHJlLWF1dGgga2V5LCBhbmQgcmV0dXJuIHRoZSBlbnRyeSBpZAorICovCiBzdGF0aWMgaW50IFNlY0lzSW5QTUtJRExpc3Qoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIsIHU4ICpic3NpZCkKIHsKIAlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZBZGFwdGVyLT5zZWN1cml0eXByaXY7CkBAIC0xOTY0LDcgKzE4NDEsNyBAQAogCiAJZG8gewogCQlpZiAoKHBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpXS5iVXNlZCkgJiYKLQkJICAgIChfcnR3X21lbWNtcChwc2VjdXJpdHlwcml2LT5QTUtJRExpc3RbaV0uQnNzaWQsIGJzc2lkLCBFVEhfQUxFTikgPT0gdHJ1ZSkpIHsKKwkJICAgICghbWVtY21wKHBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpXS5Cc3NpZCwgYnNzaWQsIEVUSF9BTEVOKSkpIHsKIAkJCWJyZWFrOwogCQl9IGVsc2UgewogCQkJaSsrOwpAQCAtMTk3MywxMSArMTg1MCw5IEBACiAKIAl9IHdoaWxlIChpIDwgTlVNX1BNS0lEX0NBQ0hFKTsKIAotCWlmIChpID09IE5VTV9QTUtJRF9DQUNIRSkgeworCWlmIChpID09IE5VTV9QTUtJRF9DQUNIRSkKIAkJaSA9IC0xOy8qICBDb3VsZCBub3QgZmluZC4gKi8KLQl9IGVsc2UgewotCQkvKiAgVGhlcmUgaXMgb25lIFByZS1BdXRoZW50aWNhdGlvbiBLZXkgZm9yIHRoZSBzcGVjaWZpYyBCU1NJRC4gKi8KLQl9CisKIAlyZXR1cm4gaTsKIH0KIApAQCAtMjAxOCw4ICsxODkzLDYgQEAKIAl1aW50CW5kaXNhdXRobW9kZSA9IHBzZWN1cml0eXByaXYtPm5kaXNhdXRodHlwZTsKIAl1aW50IG5kaXNzZWN1cml0eXR5cGUgPSBwc2VjdXJpdHlwcml2LT5uZGlzZW5jcnlwdHN0YXR1czsKIAotX2Z1bmNfZW50ZXJfOwotCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywKIAkJICgiK3J0d19yZXN0cnVjdF9zZWNfaWU6IG5kaXNhdXRobW9kZT0lZCBuZGlzc2VjdXJpdHl0eXBlPSVkXG4iLAogCQkgIG5kaXNhdXRobW9kZSwgbmRpc3NlY3VyaXR5dHlwZSkpOwpAQCAtMjA1Miw5ICsxOTI1LDYgQEAKIAkJaWYgKGF1dGhtb2RlID09IF9XUEEyX0lFX0lEXykKIAkJCWllbGVuZ3RoID0gcnR3X2FwcGVuZF9wbWtpZChhZGFwdGVyLCBpRW50cnksIG91dF9pZSwgaWVsZW5ndGgpOwogCX0KLQotX2Z1bmNfZXhpdF87Ci0KIAlyZXR1cm4gaWVsZW5ndGg7CiB9CiAKQEAgLTIwNjUsOCArMTkzNSw2IEBACiAJc3RydWN0IHdsYW5fYnNzaWRfZXggICAgKnBkZXZfbmV0d29yayA9ICZwcmVnaXN0cnlwcml2LT5kZXZfbmV0d29yazsKIAl1OCAqbXlod2FkZHIgPSBteWlkKHBlZXByaXYpOwogCi1fZnVuY19lbnRlcl87Ci0KIAltZW1jcHkocGRldl9uZXR3b3JrLT5NYWNBZGRyZXNzLCBteWh3YWRkciwgRVRIX0FMRU4pOwogCiAJbWVtY3B5KCZwZGV2X25ldHdvcmstPlNzaWQsICZwcmVnaXN0cnlwcml2LT5zc2lkLCBzaXplb2Yoc3RydWN0IG5kaXNfODAyXzExX3NzaWQpKTsKQEAgLTIwNzcsOCArMTk0NSw2IEBACiAJcGRldl9uZXR3b3JrLT5Db25maWd1cmF0aW9uLkZIQ29uZmlnLkhvcFBhdHRlcm4gPSAwOwogCXBkZXZfbmV0d29yay0+Q29uZmlndXJhdGlvbi5GSENvbmZpZy5Ib3BTZXQgPSAwOwogCXBkZXZfbmV0d29yay0+Q29uZmlndXJhdGlvbi5GSENvbmZpZy5Ed2VsbFRpbWUgPSAwOwotCi1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfdXBkYXRlX3JlZ2lzdHJ5cHJpdl9kZXZfbmV0d29yayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKQEAgLTIwODksOCArMTk1NSw2IEBACiAJc3RydWN0CXNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmYWRhcHRlci0+c2VjdXJpdHlwcml2OwogCXN0cnVjdAl3bGFuX25ldHdvcmsJKmN1cl9uZXR3b3JrID0gJmFkYXB0ZXItPm1sbWVwcml2LmN1cl9uZXR3b3JrOwogCi1fZnVuY19lbnRlcl87Ci0KIAlwZGV2X25ldHdvcmstPlByaXZhY3kgPSAocHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA+IDAgPyAxIDogMCk7IC8qICBhZGhvYyBubyA4MDIuMXggKi8KIAogCXBkZXZfbmV0d29yay0+UnNzaSA9IDA7CkBAIC0yMTQwLDEzICsyMDA0LDEwIEBACiAKIAkvKiBub3RlczogdHJhbnNsYXRlIElFTGVuZ3RoICYgTGVuZ3RoIGFmdGVyIGFzc2lnbiB0aGUgTGVuZ3RoIHRvIGNtZHN6IGluIGNyZWF0ZWJzc19jbWQoKTsgKi8KIAkvKiBwZGV2X25ldHdvcmstPklFTGVuZ3RoID0gY3B1X3RvX2xlMzIoc3opOyAqLwotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X2dldF9lbmNyeXB0X2RlY3J5cHRfZnJvbV9yZWdpc3RyeXByaXYoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci1fZnVuY19lbnRlcl87Ci1fZnVuY19leGl0XzsKIH0KIAogLyogdGhlIGZ1bmN0aW9uIGlzIGF0IHBhc3NpdmVfbGV2ZWwgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbWxtZV9leHQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbWxtZV9leHQuYwppbmRleCA2ZjdlNDE1Li4zZWQ1OTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWVfZXh0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lX2V4dC5jCkBAIC0xNzEsNyArMTcxLDcgQEAKIAl7MHgwM30sCS8qIDB4NDEsIFJUX0NIQU5ORUxfRE9NQUlOX0dMT0JBTF9ET0FNSU5fMkcgKi8KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcnRfY2hhbm5lbF9wbGFuX21hcCBSVFdfQ0hBTk5FTF9QTEFOX01BUF9SRUFMVEVLX0RFRklORSA9IHsweDAzfTsgLyogdXNlIHRoZSBjb25iaW5hdGlvbiBmb3IgbWF4IGNoYW5uZWwgbnVtYmVycyAqLworc3RhdGljIHN0cnVjdCBydF9jaGFubmVsX3BsYW5fbWFwIFJUV19DSEFOTkVMX1BMQU5fTUFQX1JFQUxURUtfREVGSU5FID0gezB4MDN9OyAvKiB1c2UgdGhlIGNvbWJpbmF0aW9uIGZvciBtYXggY2hhbm5lbCBudW1iZXJzICovCiAKIC8qCiAgKiBTZWFyY2ggdGhlIEBwYXJhbSBjaGFubmVsX251bSBpbiBnaXZlbiBAcGFyYW0gY2hhbm5lbF9zZXQKQEAgLTQxNCwyMSArNDE0LDIxIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfbWd0X2Rpc3BhdGNoZXIoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgbWxtZV9oYW5kbGVyICpwdGFibGUsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQorc3RhdGljIHZvaWQgX21ndF9kaXNwYXRjaGVyKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IG1sbWVfaGFuZGxlciAqcHRhYmxlLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJdTggYmNfYWRkcltFVEhfQUxFTl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKIAogCSAgaWYgKHB0YWJsZS0+ZnVuYykgewogCSAvKiByZWNlaXZlIHRoZSBmcmFtZXMgdGhhdCByYShhMSkgaXMgbXkgYWRkcmVzcyBvciByYShhMSkgaXMgYmMgYWRkcmVzcy4gKi8KLQkJaWYgKCFfcnR3X21lbWNtcChHZXRBZGRyMVB0cihwZnJhbWUpLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKSAmJgotCQkgICAgIV9ydHdfbWVtY21wKEdldEFkZHIxUHRyKHBmcmFtZSksIGJjX2FkZHIsIEVUSF9BTEVOKSkKKwkJaWYgKG1lbWNtcChHZXRBZGRyMVB0cihwZnJhbWUpLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKSAmJgorCQkgICAgbWVtY21wKEdldEFkZHIxUHRyKHBmcmFtZSksIGJjX2FkZHIsIEVUSF9BTEVOKSkKIAkJCXJldHVybjsKIAkJcHRhYmxlLT5mdW5jKHBhZGFwdGVyLCBwcmVjdl9mcmFtZSk7CiAJfQogfQogCi12b2lkIG1ndF9kaXNwYXRjaGVyKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit2b2lkIG1ndF9kaXNwYXRjaGVyKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCWludCBpbmRleDsKIAlzdHJ1Y3QgbWxtZV9oYW5kbGVyICpwdGFibGU7CkBAIC00MzYsNyArNDM2LDcgQEAKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogI2VuZGlmIC8qIENPTkZJR184OEVVX0FQX01PREUgKi8KIAl1OCBiY19hZGRyW0VUSF9BTEVOXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IHJ0d19nZXRfc3RhaW5mbygmcGFkYXB0ZXItPnN0YXByaXYsIEdldEFkZHIyUHRyKHBmcmFtZSkpOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCkBAIC00NDksOCArNDQ5LDggQEAKIAl9CiAKIAkvKiByZWNlaXZlIHRoZSBmcmFtZXMgdGhhdCByYShhMSkgaXMgbXkgYWRkcmVzcyBvciByYShhMSkgaXMgYmMgYWRkcmVzcy4gKi8KLQlpZiAoIV9ydHdfbWVtY21wKEdldEFkZHIxUHRyKHBmcmFtZSksIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pICYmCi0JICAgICFfcnR3X21lbWNtcChHZXRBZGRyMVB0cihwZnJhbWUpLCBiY19hZGRyLCBFVEhfQUxFTikpCisJaWYgKG1lbWNtcChHZXRBZGRyMVB0cihwZnJhbWUpLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKSAmJgorCSAgICBtZW1jbXAoR2V0QWRkcjFQdHIocGZyYW1lKSwgYmNfYWRkciwgRVRIX0FMRU4pKQogCQlyZXR1cm47CiAKIAlwdGFibGUgPSBtbG1lX3N0YV90Ymw7CkBAIC00NjUsMTMgKzQ2NSwxNSBAQAogCiAJaWYgKHBzdGEgIT0gTlVMTCkgewogCQlpZiAoR2V0UmV0cnkocGZyYW1lKSkgewotCQkJaWYgKHByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWIuc2VxX251bSA9PSBwc3RhLT5SeE1nbXRGcmFtZVNlcU51bSkgeworCQkJaWYgKHByZWN2X2ZyYW1lLT5hdHRyaWIuc2VxX251bSA9PQorCQkJICAgIHBzdGEtPlJ4TWdtdEZyYW1lU2VxTnVtKSB7CiAJCQkJLyogZHJvcCB0aGUgZHVwbGljYXRlIG1hbmFnZW1lbnQgZnJhbWUgKi8KLQkJCQlEQkdfODhFKCJEcm9wIGR1cGxpY2F0ZSBtYW5hZ2VtZW50IGZyYW1lIHdpdGggc2VxX251bT0lZC5cbiIsIHByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWIuc2VxX251bSk7CisJCQkJREJHXzg4RSgiRHJvcCBkdXBsaWNhdGUgbWFuYWdlbWVudCBmcmFtZSB3aXRoIHNlcV9udW09JWQuXG4iLAorCQkJCQlwcmVjdl9mcmFtZS0+YXR0cmliLnNlcV9udW0pOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfQotCQlwc3RhLT5SeE1nbXRGcmFtZVNlcU51bSA9IHByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWIuc2VxX251bTsKKwkJcHN0YS0+UnhNZ210RnJhbWVTZXFOdW0gPSBwcmVjdl9mcmFtZS0+YXR0cmliLnNlcV9udW07CiAJfQogCiAjaWZkZWYgQ09ORklHXzg4RVVfQVBfTU9ERQpAQCAtNTMyLDcgKzUzNCw3IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11bnNpZ25lZCBpbnQgT25Qcm9iZVJlcShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IE9uUHJvYmVSZXEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJdW5zaWduZWQgaW50CWllbGVuOwogCXVuc2lnbmVkIGNoYXIJKnA7CkBAIC01NDAsOCArNTQyLDggQEAKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAJc3RydWN0IHdsYW5fYnNzaWRfZXggKmN1ciA9ICYocG1sbWVpbmZvLT5uZXR3b3JrKTsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7Ci0JdWludCBsZW4gPSBwcmVjdl9mcmFtZS0+dS5oZHIubGVuOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKKwl1aW50IGxlbiA9IHByZWN2X2ZyYW1lLT5sZW47CiAJdTggaXNfdmFsaWRfcDJwX3Byb2JlcmVxID0gZmFsc2U7CiAKICNpZmRlZiBDT05GSUdfODhFVV9QMlAKQEAgLTU5Niw3ICs1OTgsNyBAQAogCQlpZiAoaXNfdmFsaWRfcDJwX3Byb2JlcmVxKQogCQkJZ290byBfaXNzdWVfcHJvYmVyc3A7CiAKLQkJaWYgKChpZWxlbiAhPSAwICYmICFfcnR3X21lbWNtcCgodm9pZCAqKShwKzIpLCAodm9pZCAqKWN1ci0+U3NpZC5Tc2lkLCBjdXItPlNzaWQuU3NpZExlbmd0aCkpIHx8CisJCWlmICgoaWVsZW4gIT0gMCAmJiBtZW1jbXAoKHZvaWQgKikocCsyKSwgKHZvaWQgKiljdXItPlNzaWQuU3NpZCwgY3VyLT5Tc2lkLlNzaWRMZW5ndGgpKSB8fAogCQkgICAgKGllbGVuID09IDAgJiYgcG1sbWVpbmZvLT5oaWRkZW5fc3NpZF9tb2RlKSkKIAkJCXJldHVybiBfU1VDQ0VTUzsKIApAQCAtNjA5LDE4ICs2MTEsMTggQEAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLXVuc2lnbmVkIGludCBPblByb2JlUnNwKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgT25Qcm9iZVJzcChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwogI2lmZGVmIENPTkZJR184OEVVX1AyUAogCXN0cnVjdCB3aWZpZGlyZWN0X2luZm8JKnB3ZGluZm8gPSAmcGFkYXB0ZXItPndkaW5mbzsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfODhFVV9QMlAKIAlpZiAocnR3X3AycF9jaGtfc3RhdGUocHdkaW5mbywgUDJQX1NUQVRFX1RYX1BST1ZJU0lPTl9ESVNfUkVRKSkgewogCQlpZiAocHdkaW5mby0+dHhfcHJvdl9kaXNjX2luZm8uYmVuYWJsZSkgewotCQkJaWYgKF9ydHdfbWVtY21wKHB3ZGluZm8tPnR4X3Byb3ZfZGlzY19pbmZvLnBlZXJJRkFkZHIsIEdldEFkZHIyUHRyKHBmcmFtZSksIEVUSF9BTEVOKSkgeworCQkJaWYgKCFtZW1jbXAocHdkaW5mby0+dHhfcHJvdl9kaXNjX2luZm8ucGVlcklGQWRkciwgR2V0QWRkcjJQdHIocGZyYW1lKSwgRVRIX0FMRU4pKSB7CiAJCQkJaWYgKHJ0d19wMnBfY2hrX3JvbGUocHdkaW5mbywgUDJQX1JPTEVfQ0xJRU5UKSkgewogCQkJCQlwd2RpbmZvLT50eF9wcm92X2Rpc2NfaW5mby5iZW5hYmxlID0gZmFsc2U7CiAJCQkJCWlzc3VlX3AycF9wcm92aXNpb25fcmVxdWVzdChwYWRhcHRlciwKQEAgLTYzOCw3ICs2NDAsNyBAQAogCX0gZWxzZSBpZiAocnR3X3AycF9jaGtfc3RhdGUocHdkaW5mbywgUDJQX1NUQVRFX0dPTkVHT19JTkcpKSB7CiAJCWlmIChwd2RpbmZvLT5uZWdvX3JlcV9pbmZvLmJlbmFibGUpIHsKIAkJCURCR184OEUoIlslc10gUDJQIFN0YXRlIGlzIEdPTkVHTyBJTkchXG4iLCBfX2Z1bmNfXyk7Ci0JCQlpZiAoX3J0d19tZW1jbXAocHdkaW5mby0+bmVnb19yZXFfaW5mby5wZWVyRGV2QWRkciwgR2V0QWRkcjJQdHIocGZyYW1lKSwgRVRIX0FMRU4pKSB7CisJCQlpZiAoIW1lbWNtcChwd2RpbmZvLT5uZWdvX3JlcV9pbmZvLnBlZXJEZXZBZGRyLCBHZXRBZGRyMlB0cihwZnJhbWUpLCBFVEhfQUxFTikpIHsKIAkJCQlwd2RpbmZvLT5uZWdvX3JlcV9pbmZvLmJlbmFibGUgPSBmYWxzZTsKIAkJCQlpc3N1ZV9wMnBfR09fcmVxdWVzdChwYWRhcHRlciwgcHdkaW5mby0+bmVnb19yZXFfaW5mby5wZWVyRGV2QWRkcik7CiAJCQl9CkBAIC02NDYsNyArNjQ4LDcgQEAKIAl9IGVsc2UgaWYgKHJ0d19wMnBfY2hrX3N0YXRlKHB3ZGluZm8sIFAyUF9TVEFURV9UWF9JTlZJVEVfUkVRKSkgewogCQlpZiAocHdkaW5mby0+aW52aXRlcmVxX2luZm8uYmVuYWJsZSkgewogCQkJREJHXzg4RSgiWyVzXSBQMlBfU1RBVEVfVFhfSU5WSVRFX1JFUSFcbiIsIF9fZnVuY19fKTsKLQkJCWlmIChfcnR3X21lbWNtcChwd2RpbmZvLT5pbnZpdGVyZXFfaW5mby5wZWVyX21hY2FkZHIsIEdldEFkZHIyUHRyKHBmcmFtZSksIEVUSF9BTEVOKSkgeworCQkJaWYgKCFtZW1jbXAocHdkaW5mby0+aW52aXRlcmVxX2luZm8ucGVlcl9tYWNhZGRyLCBHZXRBZGRyMlB0cihwZnJhbWUpLCBFVEhfQUxFTikpIHsKIAkJCQlwd2RpbmZvLT5pbnZpdGVyZXFfaW5mby5iZW5hYmxlID0gZmFsc2U7CiAJCQkJaXNzdWVfcDJwX2ludml0YXRpb25fcmVxdWVzdChwYWRhcHRlciwgcHdkaW5mby0+aW52aXRlcmVxX2luZm8ucGVlcl9tYWNhZGRyKTsKIAkJCX0KQEAgLTY2Myw3ICs2NjUsNyBAQAogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotdW5zaWduZWQgaW50IE9uQmVhY29uKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgT25CZWFjb24oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJaW50IGNhbV9pZHg7CiAJc3RydWN0IHN0YV9pbmZvCSpwc3RhOwpAQCAtNjcxLDggKzY3Myw4IEBACiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCBzdGFfcHJpdgkqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOwotCXVpbnQgbGVuID0gcHJlY3ZfZnJhbWUtPnUuaGRyLmxlbjsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CisJdWludCBsZW4gPSBwcmVjdl9mcmFtZS0+bGVuOwogCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwYnNzOwogCWludCByZXQgPSBfU1VDQ0VTUzsKIApAQCAtNjgxLDcgKzY4Myw3IEBACiAJCXJldHVybiBfU1VDQ0VTUzsKIAl9CiAKLQlpZiAoX3J0d19tZW1jbXAoR2V0QWRkcjNQdHIocGZyYW1lKSwgZ2V0X215X2Jzc2lkKCZwbWxtZWluZm8tPm5ldHdvcmspLCBFVEhfQUxFTikpIHsKKwlpZiAoIW1lbWNtcChHZXRBZGRyM1B0cihwZnJhbWUpLCBnZXRfbXlfYnNzaWQoJnBtbG1laW5mby0+bmV0d29yayksIEVUSF9BTEVOKSkgewogCQlpZiAocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVVUSF9OVUxMKSB7CiAJCQkvKiB3ZSBzaG91bGQgdXBkYXRlIGN1cnJlbnQgbmV0d29yayBiZWZvcmUgYXV0aCwgb3Igc29tZSBJRSBpcyB3cm9uZyAqLwogCQkJcGJzcyA9IChzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqKXJ0d19tYWxsb2Moc2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSk7CkBAIC03NTMsNyArNzU1LDcgQEAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLXVuc2lnbmVkIGludCBPbkF1dGgoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBPbkF1dGgoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAjaWZkZWYgQ09ORklHXzg4RVVfQVBfTU9ERQogCXVuc2lnbmVkIGludAlhdXRoX21vZGUsIGllX2xlbjsKQEAgLTc2Nyw4ICs3NjksOCBAQAogCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKLQl1aW50IGxlbiA9IHByZWN2X2ZyYW1lLT51Lmhkci5sZW47CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOworCXVpbnQgbGVuID0gcHJlY3ZfZnJhbWUtPmxlbjsKIAogCWlmICgocG1sbWVpbmZvLT5zdGF0ZSYweDAzKSAhPSBXSUZJX0ZXX0FQX1NUQVRFKQogCQlyZXR1cm4gX0ZBSUw7CkBAIC04NzgsNyArODgwLDcgQEAKIAkJCQlnb3RvIGF1dGhfZmFpbDsKIAkJCX0KIAotCQkJaWYgKF9ydHdfbWVtY21wKCh2b2lkICopKHAgKyAyKSwgcHN0YXQtPmNoZ190eHQsIDEyOCkpIHsKKwkJCWlmICghbWVtY21wKCh2b2lkICopKHAgKyAyKSwgcHN0YXQtPmNoZ190eHQsIDEyOCkpIHsKIAkJCQlwc3RhdC0+c3RhdGUgJj0gKH5XSUZJX0ZXX0FVVEhfU1RBVEUpOwogCQkJCXBzdGF0LT5zdGF0ZSB8PSBXSUZJX0ZXX0FVVEhfU1VDQ0VTUzsKIAkJCQkvKiAgY2hhbGxlbmdpbmcgdHh0IGlzIGNvcnJlY3QuLi4gKi8KQEAgLTkyNiwyMCArOTI4LDIwIEBACiAJcmV0dXJuIF9GQUlMOwogfQogCi11bnNpZ25lZCBpbnQgT25BdXRoQ2xpZW50KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgT25BdXRoQ2xpZW50KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXVuc2lnbmVkIGludAlzZXEsIGxlbiwgc3RhdHVzLCBvZmZzZXQ7CiAJdW5zaWduZWQgY2hhcgkqcDsKIAl1bnNpZ25lZCBpbnQJZ28yYXNvYyA9IDA7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKLQl1aW50IHBrdF9sZW4gPSBwcmVjdl9mcmFtZS0+dS5oZHIubGVuOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKKwl1aW50IHBrdF9sZW4gPSBwcmVjdl9mcmFtZS0+bGVuOwogCiAJREJHXzg4RSgiJXNcbiIsIF9fZnVuY19fKTsKIAogCS8qIGNoZWNrIEExIG1hdGNoZXMgb3Igbm90ICovCi0JaWYgKCFfcnR3X21lbWNtcChteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSwgZ2V0X2RhKHBmcmFtZSksIEVUSF9BTEVOKSkKKwlpZiAobWVtY21wKG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBnZXRfZGEocGZyYW1lKSwgRVRIX0FMRU4pKQogCQlyZXR1cm4gX1NVQ0NFU1M7CiAKIAlpZiAoIShwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19BVVRIX1NUQVRFKSkKQEAgLTEwMDEsNyArMTAwMyw3IEBACiAJcmV0dXJuIF9GQUlMOwogfQogCi11bnNpZ25lZCBpbnQgT25Bc3NvY1JlcShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IE9uQXNzb2NSZXEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAjaWZkZWYgQ09ORklHXzg4RVVfQVBfTU9ERQogCXUxNiBjYXBhYl9pbmZvOwpAQCAtMTAyMCw4ICsxMDIyLDggQEAKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwogCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXIgPSAmKHBtbG1laW5mby0+bmV0d29yayk7CiAJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7Ci0JdWludCBwa3RfbGVuID0gcHJlY3ZfZnJhbWUtPnUuaGRyLmxlbjsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CisJdWludCBwa3RfbGVuID0gcHJlY3ZfZnJhbWUtPmxlbjsKICNpZmRlZiBDT05GSUdfODhFVV9QMlAKIAlzdHJ1Y3Qgd2lmaWRpcmVjdF9pbmZvCSpwd2RpbmZvID0gJihwYWRhcHRlci0+d2RpbmZvKTsKIAl1OCBwMnBfc3RhdHVzX2NvZGUgPSBQMlBfU1RBVFVTX1NVQ0NFU1M7CkBAIC0xMDk3LDcgKzEwOTksNyBAQAogCQlzdGF0dXMgPSBfU1RBVFNfRkFJTFVSRV87CiAJfSBlbHNlIHsKIAkJLyogIGNoZWNrIGlmIHNzaWQgbWF0Y2ggKi8KLQkJaWYgKCFfcnR3X21lbWNtcCgodm9pZCAqKShwKzIpLCBjdXItPlNzaWQuU3NpZCwgY3VyLT5Tc2lkLlNzaWRMZW5ndGgpKQorCQlpZiAobWVtY21wKCh2b2lkICopKHArMiksIGN1ci0+U3NpZC5Tc2lkLCBjdXItPlNzaWQuU3NpZExlbmd0aCkpCiAJCQlzdGF0dXMgPSBfU1RBVFNfRkFJTFVSRV87CiAKIAkJaWYgKGllX2xlbiAhPSBjdXItPlNzaWQuU3NpZExlbmd0aCkKQEAgLTEyNzAsNyArMTI3Miw3IEBACiAJCWZvciAoOzspIHsKIAkJCXAgPSBydHdfZ2V0X2llKHAsIF9WRU5ET1JfU1BFQ0lGSUNfSUVfLCAmaWVfbGVuLCBwa3RfbGVuIC0gV0xBTl9IRFJfQTNfTEVOIC0gaWVfb2Zmc2V0KTsKIAkJCWlmIChwICE9IE5VTEwpIHsKLQkJCQlpZiAoX3J0d19tZW1jbXAocCsyLCBXTU1fSUUsIDYpKSB7CisJCQkJaWYgKCFtZW1jbXAocCsyLCBXTU1fSUUsIDYpKSB7CiAJCQkJCXBzdGF0LT5mbGFncyB8PSBXTEFOX1NUQV9XTUU7CiAKIAkJCQkJcHN0YXQtPnFvc19vcHRpb24gPSAxOwpAQCAtMTQ3MCw3ICsxNDcyLDcgQEAKIAlyZXR1cm4gX0ZBSUw7CiB9CiAKLXVuc2lnbmVkIGludCBPbkFzc29jUnNwKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgT25Bc3NvY1JzcChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAl1aW50IGk7CiAJaW50IHJlczsKQEAgLTE0ODAsMTMgKzE0ODIsMTMgQEAKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAJLyogc3RydWN0IHdsYW5fYnNzaWRfZXggKmN1cl9uZXR3b3JrID0gJihwbWxtZWluZm8tPm5ldHdvcmspOyAqLwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKLQl1aW50IHBrdF9sZW4gPSBwcmVjdl9mcmFtZS0+dS5oZHIubGVuOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKKwl1aW50IHBrdF9sZW4gPSBwcmVjdl9mcmFtZS0+bGVuOwogCiAJREJHXzg4RSgiJXNcbiIsIF9fZnVuY19fKTsKIAogCS8qIGNoZWNrIEExIG1hdGNoZXMgb3Igbm90ICovCi0JaWYgKCFfcnR3X21lbWNtcChteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSwgZ2V0X2RhKHBmcmFtZSksIEVUSF9BTEVOKSkKKwlpZiAobWVtY21wKG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBnZXRfZGEocGZyYW1lKSwgRVRIX0FMRU4pKQogCQlyZXR1cm4gX1NVQ0NFU1M7CiAKIAlpZiAoIShwbWxtZWluZm8tPnN0YXRlICYgKFdJRklfRldfQVVUSF9TVUNDRVNTIHwgV0lGSV9GV19BU1NPQ19TVEFURSkpKQpAQCAtMTUyNCw3ICsxNTI2LDcgQEAKIAogCQlzd2l0Y2ggKHBJRS0+RWxlbWVudElEKSB7CiAJCWNhc2UgX1ZFTkRPUl9TUEVDSUZJQ19JRV86Ci0JCQlpZiAoX3J0d19tZW1jbXAocElFLT5kYXRhLCBXTU1fUEFSQV9PVUksIDYpKQkvKiBXTU0gKi8KKwkJCWlmICghbWVtY21wKHBJRS0+ZGF0YSwgV01NX1BBUkFfT1VJLCA2KSkgLyogV01NICovCiAJCQkJV01NX3BhcmFtX2hhbmRsZXIocGFkYXB0ZXIsIHBJRSk7CiAJCQlicmVhazsKIAkJY2FzZSBfSFRfQ0FQQUJJTElUWV9JRV86CS8qIEhUIGNhcHMgKi8KQEAgLTE1NjAsMTkgKzE1NjIsMjAgQEAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLXVuc2lnbmVkIGludCBPbkRlQXV0aChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IE9uRGVBdXRoKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXVuc2lnbmVkIHNob3J0CXJlYXNvbjsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7CiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogI2lmZGVmIENPTkZJR184OEVVX1AyUAogCXN0cnVjdCB3aWZpZGlyZWN0X2luZm8gKnB3ZGluZm8gPSAmKHBhZGFwdGVyLT53ZGluZm8pOwogI2VuZGlmIC8qIENPTkZJR184OEVVX1AyUCAqLwogCiAJLyogY2hlY2sgQTMgKi8KLQlpZiAoIShfcnR3X21lbWNtcChHZXRBZGRyM1B0cihwZnJhbWUpLCBnZXRfbXlfYnNzaWQoJnBtbG1laW5mby0+bmV0d29yayksIEVUSF9BTEVOKSkpCisJaWYgKG1lbWNtcChHZXRBZGRyM1B0cihwZnJhbWUpLCBnZXRfbXlfYnNzaWQoJnBtbG1laW5mby0+bmV0d29yayksCisJCSAgIEVUSF9BTEVOKSkKIAkJcmV0dXJuIF9TVUNDRVNTOwogCiAjaWZkZWYgQ09ORklHXzg4RVVfUDJQCkBAIC0xNjIzLDE5ICsxNjI2LDIwIEBACiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi11bnNpZ25lZCBpbnQgT25EaXNhc3NvYyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IE9uRGlzYXNzb2Moc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJdTE2IHJlYXNvbjsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7CiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogI2lmZGVmIENPTkZJR184OEVVX1AyUAogCXN0cnVjdCB3aWZpZGlyZWN0X2luZm8gKnB3ZGluZm8gPSAmKHBhZGFwdGVyLT53ZGluZm8pOwogI2VuZGlmIC8qIENPTkZJR184OEVVX1AyUCAqLwogCiAJLyogY2hlY2sgQTMgKi8KLQlpZiAoIShfcnR3X21lbWNtcChHZXRBZGRyM1B0cihwZnJhbWUpLCBnZXRfbXlfYnNzaWQoJnBtbG1laW5mby0+bmV0d29yayksIEVUSF9BTEVOKSkpCisJaWYgKG1lbWNtcChHZXRBZGRyM1B0cihwZnJhbWUpLCBnZXRfbXlfYnNzaWQoJnBtbG1laW5mby0+bmV0d29yayksCisJCSAgIEVUSF9BTEVOKSkKIAkJcmV0dXJuIF9TVUNDRVNTOwogCiAjaWZkZWYgQ09ORklHXzg4RVVfUDJQCkBAIC0xNjg1LDE4ICsxNjg5LDE4IEBACiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi11bnNpZ25lZCBpbnQgT25BdGltKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgT25BdGltKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCURCR184OEUoIiVzXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi11bnNpZ25lZCBpbnQgb25fYWN0aW9uX3NwY3Qoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBvbl9hY3Rpb25fc3BjdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAl1bnNpZ25lZCBpbnQgcmV0ID0gX0ZBSUw7CiAJc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKIAlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CiAJdTggKmZyYW1lX2JvZHkgPSAodTggKikocGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcikpOwogCXU4IGNhdGVnb3J5OwogCXU4IGFjdGlvbjsKQEAgLTE3MjksMTcgKzE3MzMsMTcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi11bnNpZ25lZCBpbnQgT25BY3Rpb25fcW9zKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgT25BY3Rpb25fcW9zKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotdW5zaWduZWQgaW50IE9uQWN0aW9uX2RscyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IE9uQWN0aW9uX2RscyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLXVuc2lnbmVkIGludCBPbkFjdGlvbl9iYWNrKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgT25BY3Rpb25fYmFjayhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAl1OCAqYWRkcjsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwpAQCAtMTc0OSwxMCArMTc1MywxMSBAQAogCXVuc2lnbmVkIHNob3J0CXRpZCwgc3RhdHVzLCByZWFzb25fY29kZSA9IDA7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CiAJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKIAkvKiBjaGVjayBSQSBtYXRjaGVzIG9yIG5vdCAqLwotCWlmICghX3J0d19tZW1jbXAobXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEdldEFkZHIxUHRyKHBmcmFtZSksIEVUSF9BTEVOKSkvKiBmb3IgaWYxLCBzdGEvYXAgbW9kZSAqLworCWlmIChtZW1jbXAobXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEdldEFkZHIxUHRyKHBmcmFtZSksCisJCSAgIEVUSF9BTEVOKSkvKiBmb3IgaWYxLCBzdGEvYXAgbW9kZSAqLwogCQlyZXR1cm4gX1NVQ0NFU1M7CiAKIAlEQkdfODhFKCIlc1xuIiwgX19mdW5jX18pOwpAQCAtMTkzNyw3ICsxOTQyLDcgQEAKIAlwMnBpZVtwMnBpZWxlbisrXSA9IDB4MDk7CS8qCVdGQSBQMlAgdjEuMCAqLwogCiAJLyoJQ29tbWVudGVkIGJ5IEFsYmVydCAyMDExMDMwNiAqLwotCS8qCUFjY29yZGluZyB0byB0aGUgUDJQIFNwZWNpZmljYXRpb24sIHRoZSBncm91cCBuZWdvaXRhdGlvbiByZXF1ZXN0IGZyYW1lIHNob3VsZCBjb250YWluIDkgUDJQIGF0dHJpYnV0ZXMgKi8KKwkvKglBY2NvcmRpbmcgdG8gdGhlIFAyUCBTcGVjaWZpY2F0aW9uLCB0aGUgZ3JvdXAgbmVnb3RpYXRpb24gcmVxdWVzdCBmcmFtZSBzaG91bGQgY29udGFpbiA5IFAyUCBhdHRyaWJ1dGVzICovCiAJLyoJMS4gUDJQIENhcGFiaWxpdHkgKi8KIAkvKgkyLiBHcm91cCBPd25lciBJbnRlbnQgKi8KIAkvKgkzLiBDb25maWd1cmF0aW9uIFRpbWVvdXQgKi8KQEAgLTIyODAsNyArMjI4NSw3IEBACiAJLyoJQ29tbWVudGVkIGJ5IEt1cnQgMjAxMjAxMTMgKi8KIAkvKglJZiBzb21lIGRldmljZSB3YW50cyB0byBkbyBwMnAgaGFuZHNoYWtlIHdpdGhvdXQgc2VuZGluZyBwcm92X2Rpc2NfcmVxICovCiAJLyoJV2UgaGF2ZSB0byBnZXQgcGVlcl9yZXFfY20gZnJvbSBoZXJlLiAqLwotCWlmIChfcnR3X21lbWNtcChwd2RpbmZvLT5yeF9wcm92X2Rpc2NfaW5mby5zdHJjb25maWdfbWV0aG9kX2Rlc2Nfb2ZfcHJvdl9kaXNjX3JlcSwgIjAwMCIsIDMpKSB7CisJaWYgKCFtZW1jbXAocHdkaW5mby0+cnhfcHJvdl9kaXNjX2luZm8uc3RyY29uZmlnX21ldGhvZF9kZXNjX29mX3Byb3ZfZGlzY19yZXEsICIwMDAiLCAzKSkgewogCQlpZiAod3BzX2RldmljZXBhc3N3b3JkX2lkID09IFdQU19EUElEX1VTRVJfU1BFQykKIAkJCW1lbWNweShwd2RpbmZvLT5yeF9wcm92X2Rpc2NfaW5mby5zdHJjb25maWdfbWV0aG9kX2Rlc2Nfb2ZfcHJvdl9kaXNjX3JlcSwgImRpcyIsIDMpOwogCQllbHNlIGlmICh3cHNfZGV2aWNlcGFzc3dvcmRfaWQgPT0gV1BTX0RQSURfUkVHSVNUUkFSX1NQRUMpCkBAIC0yMzAyLDcgKzIzMDcsNyBAQAogCXAycGllW3AycGllbGVuKytdID0gMHgwOTsJLyoJV0ZBIFAyUCB2MS4wICovCiAKIAkvKglDb21tZW50ZWQgYnkgQWxiZXJ0IDIwMTAwOTA4ICovCi0JLyoJQWNjb3JkaW5nIHRvIHRoZSBQMlAgU3BlY2lmaWNhdGlvbiwgdGhlIGdyb3VwIG5lZ29pdGF0aW9uIHJlc3BvbnNlIGZyYW1lIHNob3VsZCBjb250YWluIDkgUDJQIGF0dHJpYnV0ZXMgKi8KKwkvKglBY2NvcmRpbmcgdG8gdGhlIFAyUCBTcGVjaWZpY2F0aW9uLCB0aGUgZ3JvdXAgbmVnb3RpYXRpb24gcmVzcG9uc2UgZnJhbWUgc2hvdWxkIGNvbnRhaW4gOSBQMlAgYXR0cmlidXRlcyAqLwogCS8qCTEuIFN0YXR1cyAqLwogCS8qCTIuIFAyUCBDYXBhYmlsaXR5ICovCiAJLyoJMy4gR3JvdXAgT3duZXIgSW50ZW50ICovCkBAIC0yNjA0LDcgKzI2MDksNyBAQAogCXAycGllW3AycGllbGVuKytdID0gMHgwOTsJLyoJV0ZBIFAyUCB2MS4wICovCiAKIAkvKglDb21tZW50ZWQgYnkgQWxiZXJ0IDIwMTEwMzA2ICovCi0JLyoJQWNjb3JkaW5nIHRvIHRoZSBQMlAgU3BlY2lmaWNhdGlvbiwgdGhlIGdyb3VwIG5lZ29pdGF0aW9uIHJlcXVlc3QgZnJhbWUgc2hvdWxkIGNvbnRhaW4gNSBQMlAgYXR0cmlidXRlcyAqLworCS8qCUFjY29yZGluZyB0byB0aGUgUDJQIFNwZWNpZmljYXRpb24sIHRoZSBncm91cCBuZWdvdGlhdGlvbiByZXF1ZXN0IGZyYW1lIHNob3VsZCBjb250YWluIDUgUDJQIGF0dHJpYnV0ZXMgKi8KIAkvKgkxLiBTdGF0dXMgKi8KIAkvKgkyLiBQMlAgQ2FwYWJpbGl0eSAqLwogCS8qCTMuIE9wZXJhdGluZyBDaGFubmVsICovCkBAIC0yODI1LDcgKzI4MzAsOCBAQAogCS8qCUNoYW5uZWwgTnVtYmVyICovCiAJcDJwaWVbcDJwaWVsZW4rK10gPSBwd2RpbmZvLT5pbnZpdGVyZXFfaW5mby5vcGVyYXRpbmdfY2g7CS8qCW9wZXJhdGluZyBjaGFubmVsIG51bWJlciAqLwogCi0JaWYgKF9ydHdfbWVtY21wKG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgcHdkaW5mby0+aW52aXRlcmVxX2luZm8uZ29fYnNzaWQsIEVUSF9BTEVOKSkgeworCWlmICghbWVtY21wKG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwKKwkJICAgIHB3ZGluZm8tPmludml0ZXJlcV9pbmZvLmdvX2Jzc2lkLCBFVEhfQUxFTikpIHsKIAkJLyoJUDJQIEdyb3VwIEJTU0lEICovCiAJCS8qCVR5cGU6ICovCiAJCXAycGllW3AycGllbGVuKytdID0gUDJQX0FUVFJfR1JPVVBfQlNTSUQ7CkBAIC0zMjYwLDcgKzMyNjYsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBQMlBfTUFYX1BFUlNJU1RFTlRfR1JPVVBfTlVNOyBpKyssIHByb2ZpbGVpbmZvKyspIHsKIAkgICAgICAgREJHXzg4RSgiWyVzXSBwcm9maWxlaW5mb19tYWM9JS4yWCAlLjJYICUuMlggJS4yWCAlLjJYICUuMlhcbiIsIF9fZnVuY19fLAogCQkJICAgIHByb2ZpbGVpbmZvLT5wZWVybWFjWzBdLCBwcm9maWxlaW5mby0+cGVlcm1hY1sxXSwgcHJvZmlsZWluZm8tPnBlZXJtYWNbMl0sIHByb2ZpbGVpbmZvLT5wZWVybWFjWzNdLCBwcm9maWxlaW5mby0+cGVlcm1hY1s0XSwgcHJvZmlsZWluZm8tPnBlZXJtYWNbNV0pOwotCQlpZiAoX3J0d19tZW1jbXAocGVlcm1hY2FkZHIsIHByb2ZpbGVpbmZvLT5wZWVybWFjLCBFVEhfQUxFTikpIHsKKwkJaWYgKCFtZW1jbXAocGVlcm1hY2FkZHIsIHByb2ZpbGVpbmZvLT5wZWVybWFjLCBFVEhfQUxFTikpIHsKIAkJCW1hdGNoX3Jlc3VsdCA9IDE7CiAJCQlEQkdfODhFKCJbJXNdIE1hdGNoIVxuIiwgX19mdW5jX18pOwogCQkJYnJlYWs7CkBAIC0zODUzLDEzICszODU5LDEzIEBACiAKICNlbmRpZiAvKiBDT05GSUdfODhFVV9QMlAgKi8KIAotc3RhdGljIHMzMiBydHdfYWN0aW9uX3B1YmxpY19kZWNhY2hlKHVuaW9uIHJlY3ZfZnJhbWUgKnJlY3ZfZnJhbWUsIHMzMiB0b2tlbikKK3N0YXRpYyBzMzIgcnR3X2FjdGlvbl9wdWJsaWNfZGVjYWNoZShzdHJ1Y3QgcmVjdl9mcmFtZSAqcmVjdl9mcmFtZSwgczMyIHRva2VuKQogewotCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gcmVjdl9mcmFtZS0+dS5oZHIuYWRhcHRlcjsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IHJlY3ZfZnJhbWUtPmFkYXB0ZXI7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYgKm1sbWVleHQgPSAmKGFkYXB0ZXItPm1sbWVleHRwcml2KTsKLQl1OCAqZnJhbWUgPSByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOwotCXUxNiBzZXFfY3RybCA9ICgocmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliLnNlcV9udW0mMHhmZmZmKSA8PCA0KSB8Ci0JCShyZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWIuZnJhZ19udW0gJiAweGYpOworCXU4ICpmcmFtZSA9IHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CisJdTE2IHNlcV9jdHJsID0gKChyZWN2X2ZyYW1lLT5hdHRyaWIuc2VxX251bSYweGZmZmYpIDw8IDQpIHwKKwkJKHJlY3ZfZnJhbWUtPmF0dHJpYi5mcmFnX251bSAmIDB4Zik7CiAKIAlpZiAoR2V0UmV0cnkoZnJhbWUpKSB7CiAJCWlmICh0b2tlbiA+PSAwKSB7CkBAIC0zODg1LDE0ICszODkxLDE0IEBACiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IG9uX2FjdGlvbl9wdWJsaWNfcDJwKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQorc3RhdGljIHVuc2lnbmVkIGludCBvbl9hY3Rpb25fcHVibGljX3AycChzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKIAl1OCAqZnJhbWVfYm9keTsKIAl1OCBkaWFsb2dUb2tlbiA9IDA7CiAjaWZkZWYgQ09ORklHXzg4RVVfUDJQCi0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gcHJlY3ZfZnJhbWUtPnUuaGRyLmFkYXB0ZXI7Ci0JdWludCBsZW4gPSBwcmVjdl9mcmFtZS0+dS5oZHIubGVuOworCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IHByZWN2X2ZyYW1lLT5hZGFwdGVyOworCXVpbnQgbGVuID0gcHJlY3ZfZnJhbWUtPmxlbjsKIAl1OCAqcDJwX2llOwogCXUzMglwMnBfaWVsZW47CiAJc3RydWN0CXdpZmlkaXJlY3RfaW5mbwkqcHdkaW5mbyA9ICYocGFkYXB0ZXItPndkaW5mbyk7CkBAIC0zOTM5LDcgKzM5NDUsOCBAQAogCiAJCS8qCUNvbW1lbnRlZCBieSBLdXJ0IDIwMTIwMTEzICovCiAJCS8qCUdldCBwZWVyX2Rldl9hZGRyIGhlcmUgaWYgcGVlciBkb2Vzbid0IGlzc3VlIHByb3ZfZGlzYyBmcmFtZS4gKi8KLQkJaWYgKF9ydHdfbWVtY21wKHB3ZGluZm8tPnJ4X3Byb3ZfZGlzY19pbmZvLnBlZXJEZXZBZGRyLCBlbXB0eV9hZGRyLCBFVEhfQUxFTikpCisJCWlmICghbWVtY21wKHB3ZGluZm8tPnJ4X3Byb3ZfZGlzY19pbmZvLnBlZXJEZXZBZGRyLCBlbXB0eV9hZGRyLAorCQkJICAgIEVUSF9BTEVOKSkKIAkJCW1lbWNweShwd2RpbmZvLT5yeF9wcm92X2Rpc2NfaW5mby5wZWVyRGV2QWRkciwgR2V0QWRkcjJQdHIocGZyYW1lKSwgRVRIX0FMRU4pOwogCiAJCXJlc3VsdCA9IHByb2Nlc3NfcDJwX2dyb3VwX25lZ290YXRpb25fcmVxKHB3ZGluZm8sIGZyYW1lX2JvZHksIGxlbik7CkBAIC00MDIxLDcgKzQwMjgsNyBAQAogCQkJCQlfcnR3X21lbXNldCgmZ3JvdXBfaWQsIDB4MDAsIHNpemVvZihzdHJ1Y3QgZ3JvdXBfaWRfaW5mbykpOwogCQkJCQlydHdfZ2V0X3AycF9hdHRyX2NvbnRlbnQocDJwX2llLCBwMnBfaWVsZW4sIFAyUF9BVFRSX0dST1VQX0lELCAodTggKikmZ3JvdXBfaWQsICZhdHRyX2NvbnRlbnRsZW4pOwogCQkJCQlpZiAoYXR0cl9jb250ZW50bGVuKSB7Ci0JCQkJCQlpZiAoX3J0d19tZW1jbXAoZ3JvdXBfaWQuZ29fZGV2aWNlX2FkZHIsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pKSB7CisJCQkJCQlpZiAoIW1lbWNtcChncm91cF9pZC5nb19kZXZpY2VfYWRkciwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBFVEhfQUxFTikpIHsKIAkJCQkJCQkvKglUaGUgcDJwIGRldmljZSBzZW5kaW5nIHRoaXMgcDJwIGludml0YXRpb24gcmVxdWVzdCB3YW50cyB0aGlzIFdpLUZpIGRldmljZSB0byBiZSB0aGUgcGVyc2lzdGVudCBHTy4gKi8KIAkJCQkJCQlydHdfcDJwX3NldF9zdGF0ZShwd2RpbmZvLCBQMlBfU1RBVEVfUkVDVl9JTlZJVEVfUkVRX0dPKTsKIAkJCQkJCQlydHdfcDJwX3NldF9yb2xlKHB3ZGluZm8sIFAyUF9ST0xFX0dPKTsKQEAgLTQwNjksNyArNDA3Niw3IEBACiAJCQkJCV9ydHdfbWVtc2V0KCZncm91cF9pZCwgMHgwMCwgc2l6ZW9mKHN0cnVjdCBncm91cF9pZF9pbmZvKSk7CiAJCQkJCXJ0d19nZXRfcDJwX2F0dHJfY29udGVudChwMnBfaWUsIHAycF9pZWxlbiwgUDJQX0FUVFJfR1JPVVBfSUQsICh1OCAqKSZncm91cF9pZCwgJmF0dHJfY29udGVudGxlbik7CiAJCQkJCWlmIChhdHRyX2NvbnRlbnRsZW4pIHsKLQkJCQkJCWlmIChfcnR3X21lbWNtcChncm91cF9pZC5nb19kZXZpY2VfYWRkciwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBFVEhfQUxFTikpIHsKKwkJCQkJCWlmICghbWVtY21wKGdyb3VwX2lkLmdvX2RldmljZV9hZGRyLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKSkgewogCQkJCQkJCS8qCUluIHRoaXMgY2FzZSwgdGhlIEdPIGNhbid0IGJlIG15c2VsZi4gKi8KIAkJCQkJCQlydHdfcDJwX3NldF9zdGF0ZShwd2RpbmZvLCBQMlBfU1RBVEVfUkVDVl9JTlZJVEVfUkVRX0RJU01BVENIKTsKIAkJCQkJCQlzdGF0dXNfY29kZSA9IFAyUF9TVEFUVVNfRkFJTF9JTkZPX1VOQVZBSUxBQkxFOwpAQCAtNDExNiw3ICs0MTIzLDcgQEAKIAkJCQlwd2RpbmZvLT5pbnZpdGVyZXFfaW5mby5iZW5hYmxlID0gZmFsc2U7CiAKIAkJCQlpZiAoYXR0cl9jb250ZW50ID09IFAyUF9TVEFUVVNfU1VDQ0VTUykgewotCQkJCQlpZiAoX3J0d19tZW1jbXAocHdkaW5mby0+aW52aXRlcmVxX2luZm8uZ29fYnNzaWQsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pKSB7CisJCQkJCWlmICghbWVtY21wKHB3ZGluZm8tPmludml0ZXJlcV9pbmZvLmdvX2Jzc2lkLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKSkgewogCQkJCQkJcnR3X3AycF9zZXRfcm9sZShwd2RpbmZvLCBQMlBfUk9MRV9HTyk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlydHdfcDJwX3NldF9yb2xlKHB3ZGluZm8sIFAyUF9ST0xFX0NMSUVOVCk7CkBAIC00MTc1LDIzICs0MTgyLDIyIEBACiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IG9uX2FjdGlvbl9wdWJsaWNfdmVuZG9yKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQorc3RhdGljIHVuc2lnbmVkIGludCBvbl9hY3Rpb25fcHVibGljX3ZlbmRvcihzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJdW5zaWduZWQgaW50IHJldCA9IF9GQUlMOwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CiAJdTggKmZyYW1lX2JvZHkgPSBwZnJhbWUgKyBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKIAotCWlmIChfcnR3X21lbWNtcChmcmFtZV9ib2R5ICsgMiwgUDJQX09VSSwgNCkgPT0gdHJ1ZSkgeworCWlmICghbWVtY21wKGZyYW1lX2JvZHkgKyAyLCBQMlBfT1VJLCA0KSkKIAkJcmV0ID0gb25fYWN0aW9uX3B1YmxpY19wMnAocHJlY3ZfZnJhbWUpOwotCX0KIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgb25fYWN0aW9uX3B1YmxpY19kZWZhdWx0KHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLCB1OCBhY3Rpb24pCitzdGF0aWMgdW5zaWduZWQgaW50IG9uX2FjdGlvbl9wdWJsaWNfZGVmYXVsdChzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsIHU4IGFjdGlvbikKIHsKIAl1bnNpZ25lZCBpbnQgcmV0ID0gX0ZBSUw7Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKIAl1OCAqZnJhbWVfYm9keSA9IHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOwogCXU4IHRva2VuOwogCkBAIC00MjA2LDE1ICs0MjEyLDE1IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdW5zaWduZWQgaW50IG9uX2FjdGlvbl9wdWJsaWMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBvbl9hY3Rpb25fcHVibGljKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXVuc2lnbmVkIGludCByZXQgPSBfRkFJTDsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogCXU4ICpmcmFtZV9ib2R5ID0gcGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CiAJdTggY2F0ZWdvcnksIGFjdGlvbjsKIAogCS8qIGNoZWNrIFJBIG1hdGNoZXMgb3Igbm90ICovCi0JaWYgKCFfcnR3X21lbWNtcChteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSwgR2V0QWRkcjFQdHIocGZyYW1lKSwgRVRIX0FMRU4pKQorCWlmIChtZW1jbXAobXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEdldEFkZHIxUHRyKHBmcmFtZSksIEVUSF9BTEVOKSkKIAkJZ290byBleGl0OwogCiAJY2F0ZWdvcnkgPSBmcmFtZV9ib2R5WzBdOwpAQCAtNDIzNSwzMCArNDI0MSwzMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXVuc2lnbmVkIGludCBPbkFjdGlvbl9odChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IE9uQWN0aW9uX2h0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotdW5zaWduZWQgaW50IE9uQWN0aW9uX3dtbShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IE9uQWN0aW9uX3dtbShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLXVuc2lnbmVkIGludCBPbkFjdGlvbl9wMnAoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBPbkFjdGlvbl9wMnAoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAjaWZkZWYgQ09ORklHXzg4RVVfUDJQCiAJdTggKmZyYW1lX2JvZHk7CiAJdTggY2F0ZWdvcnksIE9VSV9TdWJ0eXBlOwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKLQl1aW50IGxlbiA9IHByZWN2X2ZyYW1lLT51Lmhkci5sZW47CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOworCXVpbnQgbGVuID0gcHJlY3ZfZnJhbWUtPmxlbjsKIAlzdHJ1Y3QJd2lmaWRpcmVjdF9pbmZvCSpwd2RpbmZvID0gJihwYWRhcHRlci0+d2RpbmZvKTsKIAogCiAJREJHXzg4RSgiJXNcbiIsIF9fZnVuY19fKTsKIAogCS8qIGNoZWNrIFJBIG1hdGNoZXMgb3Igbm90ICovCi0JaWYgKCFfcnR3X21lbWNtcChteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSwgR2V0QWRkcjFQdHIocGZyYW1lKSwgRVRIX0FMRU4pKS8qIGZvciBpZjEsIHN0YS9hcCBtb2RlICovCisJaWYgKG1lbWNtcChteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSwgR2V0QWRkcjFQdHIocGZyYW1lKSwgRVRIX0FMRU4pKS8qIGZvciBpZjEsIHN0YS9hcCBtb2RlICovCiAJCXJldHVybiBfU1VDQ0VTUzsKIAogCWZyYW1lX2JvZHkgPSAodW5zaWduZWQgY2hhciAqKShwZnJhbWUgKyBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKSk7CkBAIC00MjkwLDEzICs0Mjk2LDEzIEBACiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi11bnNpZ25lZCBpbnQgT25BY3Rpb24oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBPbkFjdGlvbihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAlpbnQgaTsKIAl1bnNpZ25lZCBjaGFyCWNhdGVnb3J5OwogCXN0cnVjdCBhY3Rpb25faGFuZGxlciAqcHRhYmxlOwogCXVuc2lnbmVkIGNoYXIJKmZyYW1lX2JvZHk7Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKIAogCWZyYW1lX2JvZHkgPSAodW5zaWduZWQgY2hhciAqKShwZnJhbWUgKyBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKSk7CiAKQEAgLTQzMTAsNyArNDMxNiw3IEBACiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi11bnNpZ25lZCBpbnQgRG9SZXNlcnZlZChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IERvUmVzZXJ2ZWQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJcmV0dXJuIF9TVUNDRVNTOwogfQpAQCAtNDM0MSw3ICs0MzQ3LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotRm9sbG93aW5nIGFyZSBzb21lIFRYIGZ1Y3Rpb25zIGZvciBXaUZpIE1MTUUKK0ZvbGxvd2luZyBhcmUgc29tZSBUWCBmdW5jdGlvbnMgZm9yIFdpRmkgTUxNRQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNDQzMiw3ICs0NDM4LDcgQEAKIAl9CiAKIAlweG1pdHByaXYtPmFja190eCA9IGZhbHNlOwotCV9leGl0X2NyaXRpY2FsX211dGV4KCZweG1pdHByaXYtPmFja190eF9tdXRleCwgTlVMTCk7CisJbXV0ZXhfdW5sb2NrKCZweG1pdHByaXYtPmFja190eF9tdXRleCk7CiAKIAkgcmV0dXJuIHJldDsKIH0KQEAgLTQ5OTUsNyArNTAwMSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogIGlmIHBzdGEgPT0gTlVMTCwgaW5kaWF0ZSB3ZSBhcmUgc3RhdGlvbihjbGllbnQpIG5vdy4uLiAqLworLyogIGlmIHBzdGEgPT0gTlVMTCwgaW5kaWNhdGUgd2UgYXJlIHN0YXRpb24oY2xpZW50KSBub3cuLi4gKi8KIHZvaWQgaXNzdWVfYXV0aChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgdW5zaWduZWQgc2hvcnQgc3RhdHVzKQogewogCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwpAQCAtNTIzNCw3ICs1MjQwLDcgQEAKIAogCQlmb3IgKHBidWYgPSBpZSArIF9CRUFDT05fSUVfT0ZGU0VUXzs7IHBidWYgKz0gKGllX2xlbiArIDIpKSB7CiAJCQlwYnVmID0gcnR3X2dldF9pZShwYnVmLCBfVkVORE9SX1NQRUNJRklDX0lFXywgJmllX2xlbiwgKHBuZXR3b3JrLT5JRUxlbmd0aCAtIF9CRUFDT05fSUVfT0ZGU0VUXyAtIChpZV9sZW4gKyAyKSkpOwotCQkJaWYgKHBidWYgJiYgX3J0d19tZW1jbXAocGJ1ZisyLCBXTU1fUEFSQV9JRSwgNikpIHsKKwkJCWlmIChwYnVmICYmICFtZW1jbXAocGJ1ZisyLCBXTU1fUEFSQV9JRSwgNikpIHsKIAkJCQltZW1jcHkocGZyYW1lLCBwYnVmLCBpZV9sZW4rMik7CiAJCQkJcGZyYW1lICs9IChpZV9sZW4rMik7CiAJCQkJcGF0dHJpYi0+cGt0bGVuICs9IChpZV9sZW4rMik7CkBAIC01NDM5LDE0ICs1NDQ1LDE0IEBACiAKIAkJc3dpdGNoIChwSUUtPkVsZW1lbnRJRCkgewogCQljYXNlIF9WRU5ET1JfU1BFQ0lGSUNfSUVfOgotCQkJaWYgKChfcnR3X21lbWNtcChwSUUtPmRhdGEsIFJUV19XUEFfT1VJLCA0KSkgfHwKLQkJCSAgICAoX3J0d19tZW1jbXAocElFLT5kYXRhLCBXTU1fT1VJLCA0KSkgfHwKLQkJCSAgICAoX3J0d19tZW1jbXAocElFLT5kYXRhLCBXUFNfT1VJLCA0KSkpIHsKKwkJCWlmICgoIW1lbWNtcChwSUUtPmRhdGEsIFJUV19XUEFfT1VJLCA0KSkgfHwKKwkJCSAgICAoIW1lbWNtcChwSUUtPmRhdGEsIFdNTV9PVUksIDQpKSB8fAorCQkJICAgICghbWVtY21wKHBJRS0+ZGF0YSwgV1BTX09VSSwgNCkpKSB7CiAJCQkJaWYgKCFwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpZmlfc3BlYykgewogCQkJCQkvKiBDb21tZW50ZWQgYnkgS3VydCAyMDExMDYyOSAqLwogCQkJCQkvKiBJbiBzb21lIG9sZGVyIEFQcywgV1BTIGhhbmRzaGFrZSAqLwogCQkJCQkvKiB3b3VsZCBiZSBmYWlsIGlmIHdlIGFwcGVuZCB2ZW5kZXIgZXh0ZW5zaW9ucyBpbmZvcm1hdGlvbnMgdG8gQVAgKi8KLQkJCQkJaWYgKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgV1BTX09VSSwgNCkpCisJCQkJCWlmICghbWVtY21wKHBJRS0+ZGF0YSwgV1BTX09VSSwgNCkpCiAJCQkJCQlwSUUtPkxlbmd0aCA9IDE0OwogCQkJCX0KIAkJCQlwZnJhbWUgPSBydHdfc2V0X2llKHBmcmFtZSwgX1ZFTkRPUl9TUEVDSUZJQ19JRV8sIHBJRS0+TGVuZ3RoLCBwSUUtPmRhdGEsICYocGF0dHJpYi0+cGt0bGVuKSk7CkBAIC01NjA2LDcgKzU2MTIsNyBAQAogCXJldHVybjsKIH0KIAotLyogd2hlbiB3YWl0X2FjayBpcyB0dXJlLCB0aGlzIGZ1bmN0aW9uIHNob3VsZSBiZSBjYWxsZWQgYXQgcHJvY2VzcyBjb250ZXh0ICovCisvKiB3aGVuIHdhaXRfYWNrIGlzIHRydWUsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhdCBwcm9jZXNzIGNvbnRleHQgKi8KIHN0YXRpYyBpbnQgX2lzc3VlX251bGxkYXRhKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqZGEsIHVuc2lnbmVkIGludCBwb3dlcl9tb2RlLCBpbnQgd2FpdF9hY2spCiB7CiAJaW50IHJldCA9IF9GQUlMOwpAQCAtNTY3Niw3ICs1NjgyLDcgQEAKIH0KIAogCi0vKiB3aGVuIHdhaXRfbXMgPiAwICwgdGhpcyBmdW5jdGlvbiBzaG91bGUgYmUgY2FsbGVkIGF0IHByb2Nlc3MgY29udGV4dCAqLworLyogd2hlbiB3YWl0X21zID4gMCAsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhdCBwcm9jZXNzIGNvbnRleHQgKi8KIC8qIGRhID09IE5VTEwgZm9yIHN0YXRpb24gbW9kZSAqLwogaW50IGlzc3VlX251bGxkYXRhKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqZGEsIHVuc2lnbmVkIGludCBwb3dlcl9tb2RlLCBpbnQgdHJ5X2NudCwgaW50IHdhaXRfbXMpCiB7CkBAIC01Njg2LDcgKzU2OTIsNyBAQAogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICYocGFkYXB0ZXItPm1sbWVleHRwcml2KTsKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwogCi0JLyogZGEgPT0gTlVMTCwgYXNzdW0gaXQncyBudWxsIGRhdGEgZm9yIHN0YSB0byBhcCovCisJLyogZGEgPT0gTlVMTCwgYXNzdW1lIGl0J3MgbnVsbCBkYXRhIGZvciBzdGEgdG8gYXAqLwogCWlmIChkYSA9PSBOVUxMKQogCQlkYSA9IGdldF9teV9ic3NpZCgmKHBtbG1laW5mby0+bmV0d29yaykpOwogCkBAIC01NzIxLDcgKzU3MjcsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIHdoZW4gd2FpdF9hY2sgaXMgdHVyZSwgdGhpcyBmdW5jdGlvbiBzaG91bGUgYmUgY2FsbGVkIGF0IHByb2Nlc3MgY29udGV4dCAqLworLyogd2hlbiB3YWl0X2FjayBpcyB0cnVlLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYXQgcHJvY2VzcyBjb250ZXh0ICovCiBzdGF0aWMgaW50IF9pc3N1ZV9xb3NfbnVsbGRhdGEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpkYSwgdTE2IHRpZCwgaW50IHdhaXRfYWNrKQogewogCWludCByZXQgPSBfRkFJTDsKQEAgLTU3OTksNyArNTgwNSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogd2hlbiB3YWl0X21zID4gMCAsIHRoaXMgZnVuY3Rpb24gc2hvdWxlIGJlIGNhbGxlZCBhdCBwcm9jZXNzIGNvbnRleHQgKi8KKy8qIHdoZW4gd2FpdF9tcyA+IDAgLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYXQgcHJvY2VzcyBjb250ZXh0ICovCiAvKiBkYSA9PSBOVUxMIGZvciBzdGF0aW9uIG1vZGUgKi8KIGludCBpc3N1ZV9xb3NfbnVsbGRhdGEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpkYSwgdTE2IHRpZCwgaW50IHRyeV9jbnQsIGludCB3YWl0X21zKQogewpAQCAtNTgwOSw3ICs1ODE1LDcgQEAKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmKHBhZGFwdGVyLT5tbG1lZXh0cHJpdik7CiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKIAotCS8qIGRhID09IE5VTEwsIGFzc3VtIGl0J3MgbnVsbCBkYXRhIGZvciBzdGEgdG8gYXAqLworCS8qIGRhID09IE5VTEwsIGFzc3VtZSBpdCdzIG51bGwgZGF0YSBmb3Igc3RhIHRvIGFwKi8KIAlpZiAoZGEgPT0gTlVMTCkKIAkJZGEgPSBnZXRfbXlfYnNzaWQoJihwbWxtZWluZm8tPm5ldHdvcmspKTsKIApAQCAtNjEwMywxNyArNjEwOSwyNiBAQAogCQljYXNlIDE6IC8qIEFEREJBIHJzcCAqLwogCQkJcGZyYW1lID0gcnR3X3NldF9maXhlZF9pZShwZnJhbWUsIDEsICYocG1sbWVpbmZvLT5BRERCQV9yZXEuZGlhbG9nX3Rva2VuKSwgJihwYXR0cmliLT5wa3RsZW4pKTsKIAkJCXBmcmFtZSA9IHJ0d19zZXRfZml4ZWRfaWUocGZyYW1lLCAyLCAodW5zaWduZWQgY2hhciAqKSgmc3RhdHVzKSwgJihwYXR0cmliLT5wa3RsZW4pKTsKKworCQkJQkFfcGFyYV9zZXQgPSBsZTE2X3RvX2NwdShwbWxtZWluZm8tPkFEREJBX3JlcS5CQV9wYXJhX3NldCkgJiAweDNmOwogCQkJcnR3X2hhbF9nZXRfZGVmX3ZhcihwYWRhcHRlciwgSFdfVkFSX01BWF9SWF9BTVBEVV9GQUNUT1IsICZtYXhfcnhfYW1wZHVfZmFjdG9yKTsKLQkJCWlmIChNQVhfQU1QRFVfRkFDVE9SXzY0SyA9PSBtYXhfcnhfYW1wZHVfZmFjdG9yKQotCQkJCUJBX3BhcmFfc2V0ID0gKCgocG1sbWVpbmZvLT5BRERCQV9yZXEuQkFfcGFyYV9zZXQpICYgMHgzZikgfCAweDEwMDApOyAvKiA2NCBidWZmZXIgc2l6ZSAqLwotCQkJZWxzZSBpZiAoTUFYX0FNUERVX0ZBQ1RPUl8zMksgPT0gbWF4X3J4X2FtcGR1X2ZhY3RvcikKLQkJCQlCQV9wYXJhX3NldCA9ICgoKHBtbG1laW5mby0+QUREQkFfcmVxLkJBX3BhcmFfc2V0KSAmIDB4M2YpIHwgMHgwODAwKTsgLyogMzIgYnVmZmVyIHNpemUgKi8KLQkJCWVsc2UgaWYgKE1BWF9BTVBEVV9GQUNUT1JfMTZLID09IG1heF9yeF9hbXBkdV9mYWN0b3IpCi0JCQkJQkFfcGFyYV9zZXQgPSAoKChwbWxtZWluZm8tPkFEREJBX3JlcS5CQV9wYXJhX3NldCkgJiAweDNmKSB8IDB4MDQwMCk7IC8qIDE2IGJ1ZmZlciBzaXplICovCi0JCQllbHNlIGlmIChNQVhfQU1QRFVfRkFDVE9SXzhLID09IG1heF9yeF9hbXBkdV9mYWN0b3IpCi0JCQkJQkFfcGFyYV9zZXQgPSAoKChwbWxtZWluZm8tPkFEREJBX3JlcS5CQV9wYXJhX3NldCkgJiAweDNmKSB8IDB4MDIwMCk7IC8qIDggYnVmZmVyIHNpemUgKi8KLQkJCWVsc2UKLQkJCQlCQV9wYXJhX3NldCA9ICgoKHBtbG1laW5mby0+QUREQkFfcmVxLkJBX3BhcmFfc2V0KSAmIDB4M2YpIHwgMHgxMDAwKTsgLyogNjQgYnVmZmVyIHNpemUgKi8KKwkJCXN3aXRjaCAobWF4X3J4X2FtcGR1X2ZhY3RvcikgeworCQkJY2FzZSBNQVhfQU1QRFVfRkFDVE9SXzY0SzoKKwkJCQlCQV9wYXJhX3NldCB8PSAweDEwMDA7IC8qIDY0IGJ1ZmZlciBzaXplICovCisJCQkJYnJlYWs7CisJCQljYXNlIE1BWF9BTVBEVV9GQUNUT1JfMzJLOgorCQkJCUJBX3BhcmFfc2V0IHw9IDB4MDgwMDsgLyogMzIgYnVmZmVyIHNpemUgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgTUFYX0FNUERVX0ZBQ1RPUl8xNks6CisJCQkJQkFfcGFyYV9zZXQgfD0gMHgwNDAwOyAvKiAxNiBidWZmZXIgc2l6ZSAqLworCQkJCWJyZWFrOworCQkJY2FzZSBNQVhfQU1QRFVfRkFDVE9SXzhLOgorCQkJCUJBX3BhcmFfc2V0IHw9IDB4MDIwMDsgLyogOCBidWZmZXIgc2l6ZSAqLworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlCQV9wYXJhX3NldCB8PSAweDEwMDA7IC8qIDY0IGJ1ZmZlciBzaXplICovCisJCQkJYnJlYWs7CisJCQl9CiAKIAkJCWlmIChwcmVncHJpdi0+YW1wZHVfYW1zZHUgPT0gMCkvKiBkaXNhYmxlZCAqLwogCQkJCUJBX3BhcmFfc2V0ID0gQkFfcGFyYV9zZXQgJiB+QklUKDApOwpAQCAtNjIyMiw3ICs2MjM3LDcgQEAKIAkJc3Bpbl9sb2NrX2JoKCYocG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spKTsKIAogCQlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwkJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCQl3aGlsZSAoMSkgewogCQkJaW50IGxlbjsKQEAgLTYyMzIsOSArNjI0Nyw5IEBACiAJCQlpZiAocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkKIAkJCQlicmVhazsKIAotCQkJcG5ldHdvcmsgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAKLQkJCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAogCQkJcGJzc19uZXR3b3JrID0gKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICopJnBuZXR3b3JrLT5uZXR3b3JrOwogCkBAIC02MzU1LDcgKzYzNzAsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi1Gb2xsb3dpbmcgYXJlIHNvbWUgdXRpdGl0eSBmdWN0aW9ucyBmb3IgV2lGaSBNTE1FCitGb2xsb3dpbmcgYXJlIHNvbWUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIFdpRmkgTUxNRQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNjQ2OCw3ICs2NDgzLDcgQEAKIAkJewogCQkJLyogIDIwMTAwNzIxOkludGVycnVwdCBzY2FuIG9wZXJhdGlvbiBoZXJlLiAqLwogCQkJLyogIEZvciBTVyBhbnRlbm5hIGRpdmVyc2l0eSBiZWZvcmUgbGluaywgaXQgbmVlZHMgdG8gc3dpdGNoIHRvIGFub3RoZXIgYW50ZW5uYSBhbmQgc2NhbiBhZ2Fpbi4gKi8KLQkJCS8qICBJdCBjb21wYXJlcyB0aGUgc2NhbiByZXN1bHQgYW5kIHNlbGVjdCBiZXRlciBvbmUgdG8gZG8gY29ubmVjdGlvbi4gKi8KKwkJCS8qICBJdCBjb21wYXJlcyB0aGUgc2NhbiByZXN1bHQgYW5kIHNlbGVjdCBiZXR0ZXIgb25lIHRvIGRvIGNvbm5lY3Rpb24uICovCiAJCQlpZiAocnR3X2hhbF9hbnRkaXZfYmVmb3JlX2xpbmtlZChwYWRhcHRlcikpIHsKIAkJCQlwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuYnNzX2NudCA9IDA7CiAJCQkJcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmNoYW5uZWxfaWR4ID0gLTE7CkBAIC02NTI2LDE0ICs2NTQxLDE0IEBACiB9CiAKIC8qIGNvbGxlY3QgYnNzIGluZm8gZnJvbSBCZWFjb24gYW5kIFByb2JlIHJlcXVlc3QvcmVzcG9uc2UgZnJhbWVzLiAqLwotdTggY29sbGVjdF9ic3NfaW5mbyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqYnNzaWQpCit1OCBjb2xsZWN0X2Jzc19pbmZvKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqYnNzaWQpCiB7CiAJaW50CWk7CiAJdTMyCWxlbjsKIAl1OCAqcDsKIAl1MTYgdmFsMTYsIHN1YnR5cGU7Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOwotCXUzMglwYWNrZXRfbGVuID0gcHJlY3ZfZnJhbWUtPnUuaGRyLmxlbjsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CisJdTMyCXBhY2tldF9sZW4gPSBwcmVjdl9mcmFtZS0+bGVuOwogCXU4IGllX29mZnNldDsKIAlzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcHJlZ2lzdHJ5cHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7CkBAIC02NTcyLDEwICs2NTg3LDEwIEBACiAJYnNzaWQtPklFTGVuZ3RoID0gbGVuOwogCW1lbWNweShic3NpZC0+SUVzLCAocGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcikpLCBic3NpZC0+SUVMZW5ndGgpOwogCi0JLyogZ2V0IHRoZSBzaWduYWwgc3RyZW5ndGggKi8KLQlic3NpZC0+UnNzaSA9IHByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWIucGh5X2luZm8ucmVjdnBvd2VyOyAvKiAgaW4gZEJNLnJhdyBkYXRhICovCi0JYnNzaWQtPlBoeUluZm8uU2lnbmFsUXVhbGl0eSA9IHByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWIucGh5X2luZm8uU2lnbmFsUXVhbGl0eTsvKiBpbiBwZXJjZW50YWdlICovCi0JYnNzaWQtPlBoeUluZm8uU2lnbmFsU3RyZW5ndGggPSBwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliLnBoeV9pbmZvLlNpZ25hbFN0cmVuZ3RoOy8qIGluIHBlcmNlbnRhZ2UgKi8KKwkvKiBnZXQgdGhlIHNpZ25hbCBzdHJlbmd0aCBpbiBkQk0ucmF3IGRhdGEgKi8KKwlic3NpZC0+UnNzaSA9IHByZWN2X2ZyYW1lLT5hdHRyaWIucGh5X2luZm8ucmVjdnBvd2VyOworCWJzc2lkLT5QaHlJbmZvLlNpZ25hbFF1YWxpdHkgPSBwcmVjdl9mcmFtZS0+YXR0cmliLnBoeV9pbmZvLlNpZ25hbFF1YWxpdHk7LyogaW4gcGVyY2VudGFnZSAqLworCWJzc2lkLT5QaHlJbmZvLlNpZ25hbFN0cmVuZ3RoID0gcHJlY3ZfZnJhbWUtPmF0dHJpYi5waHlfaW5mby5TaWduYWxTdHJlbmd0aDsvKiBpbiBwZXJjZW50YWdlICovCiAJcnR3X2hhbF9nZXRfZGVmX3ZhcihwYWRhcHRlciwgSEFMX0RFRl9DVVJSRU5UX0FOVEVOTkEsICAmYnNzaWQtPlBoeUluZm8uT3B0aW11bV9hbnRlbm5hKTsKIAogCS8qICBjaGVja2luZyBTU0lEICovCkBAIC02NzA3LDcgKzY3MjIsNyBAQAogCS8qIHVwZGF0ZSB3aXJlbGVzcyBtb2RlICovCiAJdXBkYXRlX3dpcmVsZXNzX21vZGUocGFkYXB0ZXIpOwogCi0JLyogdWRwYXRlIGNhcGFiaWxpdHkgKi8KKwkvKiB1cGRhdGUgY2FwYWJpbGl0eSAqLwogCWNhcHMgPSBydHdfZ2V0X2NhcGFiaWxpdHkoKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICopcG5ldHdvcmspOwogCXVwZGF0ZV9jYXBpbmZvKHBhZGFwdGVyLCBjYXBzKTsKIAlpZiAoY2FwcyZjYXBfSUJTUykgey8qIGFkaG9jIG1hc3RlciAqLwpAQCAtNjc1OSw3ICs2Nzc0LDcgQEAKIAkvKiB1cGRhdGUgd2lyZWxlc3MgbW9kZSAqLwogCXVwZGF0ZV93aXJlbGVzc19tb2RlKHBhZGFwdGVyKTsKIAotCS8qIHVkcGF0ZSBjYXBhYmlsaXR5ICovCisJLyogdXBkYXRlIGNhcGFiaWxpdHkgKi8KIAljYXBzID0gcnR3X2dldF9jYXBhYmlsaXR5KChzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqKXBuZXR3b3JrKTsKIAl1cGRhdGVfY2FwaW5mbyhwYWRhcHRlciwgY2Fwcyk7CiAJaWYgKGNhcHMmY2FwX0VTUykgewpAQCAtNjg1MSw3ICs2ODY2LDcgQEAKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwogCiAJLyogY2hlY2sgQTMgKi8KLQlpZiAoIShfcnR3X21lbWNtcChNYWNBZGRyLCBnZXRfbXlfYnNzaWQoJnBtbG1laW5mby0+bmV0d29yayksIEVUSF9BTEVOKSkpCisJaWYgKG1lbWNtcChNYWNBZGRyLCBnZXRfbXlfYnNzaWQoJnBtbG1laW5mby0+bmV0d29yayksIEVUSF9BTEVOKSkKIAkJcmV0dXJuIF9TVUNDRVNTOwogCiAJREJHXzg4RSgiJXNcbiIsIF9fZnVuY19fKTsKQEAgLTcwMjgsNyArNzA0Myw4IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIHJlcG9ydF9zdXJ2ZXlfZXZlbnQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3ZvaWQgcmVwb3J0X3N1cnZleV9ldmVudChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCisJCQkgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXN0cnVjdCBjbWRfb2JqICpwY21kX29iajsKIAl1OCAqcGV2dGNtZDsKQEAgLTcwMzcsOCArNzA1Myw2IEBACiAJc3RydWN0IEMySEV2ZW50X0hlYWRlciAqcGMyaF9ldnRfaGRyOwogCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dDsKIAlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2OwotCS8qIHU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsgKi8KLQkvKiB1aW50IGxlbiA9IHByZWN2X2ZyYW1lLT51Lmhkci5sZW47ICovCiAKIAlpZiAoIXBhZGFwdGVyKQogCQlyZXR1cm47CkBAIC03MzczLDcgKzczODcsNyBAQAogCS8qIHR1cm4gb24gZHluYW1pYyBmdW5jdGlvbnMgKi8KIAlTd2l0Y2hfRE1fRnVuYyhwYWRhcHRlciwgRFlOQU1JQ19BTExfRlVOQ19FTkFCTEUsIHRydWUpOwogCi0JLyogIHVwZGF0ZSBJT1QtcmVsZWF0ZWQgaXNzdWUgKi8KKwkvKiAgdXBkYXRlIElPVC1yZWxhdGVkIGlzc3VlICovCiAJdXBkYXRlX0lPVF9pbmZvKHBhZGFwdGVyKTsKIAogCXJ0d19oYWxfc2V0X2h3cmVnKHBhZGFwdGVyLCBIV19WQVJfQkFTSUNfUkFURSwgY3VyX25ldHdvcmstPlN1cHBvcnRlZFJhdGVzKTsKQEAgLTczODEsNyArNzM5NSw3IEBACiAJLyogQkNOIGludGVydmFsICovCiAJcnR3X2hhbF9zZXRfaHdyZWcocGFkYXB0ZXIsIEhXX1ZBUl9CRUFDT05fSU5URVJWQUwsICh1OCAqKSgmcG1sbWVpbmZvLT5iY25faW50ZXJ2YWwpKTsKIAotCS8qIHVkcGF0ZSBjYXBhYmlsaXR5ICovCisJLyogdXBkYXRlIGNhcGFiaWxpdHkgKi8KIAl1cGRhdGVfY2FwaW5mbyhwYWRhcHRlciwgcG1sbWVpbmZvLT5jYXBhYmlsaXR5KTsKIAogCS8qIFdNTSwgVXBkYXRlIEVEQ0EgcGFyYW0gKi8KQEAgLTc5MDIsNyArNzkxNiw3IEBACiAKIAkJc3dpdGNoIChwSUUtPkVsZW1lbnRJRCkgewogCQljYXNlIF9WRU5ET1JfU1BFQ0lGSUNfSUVfOi8qIEdldCBXTU0gSUUuICovCi0JCQlpZiAoX3J0d19tZW1jbXAocElFLT5kYXRhLCBXTU1fT1VJLCA0KSkKKwkJCWlmICghbWVtY21wKHBJRS0+ZGF0YSwgV01NX09VSSwgNCkpCiAJCQkJcG1sbWVpbmZvLT5XTU1fZW5hYmxlID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIF9IVF9DQVBBQklMSVRZX0lFXzoJLyogR2V0IEhUIENhcCBJRS4gKi8KQEAgLTgwMTYsNyArODAzMCw3IEBACiAJCXNldF9pZHggPSBydHdfY2hfc2V0X3NlYXJjaF9jaChwbWxtZWV4dC0+Y2hhbm5lbF9zZXQsIGluW2ldLmh3X3ZhbHVlKTsKIAkJaWYgKGluW2ldLmh3X3ZhbHVlICYmICEoaW5baV0uZmxhZ3MgJiBSVFdfSUVFRTgwMjExX0NIQU5fRElTQUJMRUQpICYmCiAJCSAgICBzZXRfaWR4ID49IDApIHsKLQkJCW1lbWNweSgmb3V0W2pdLCAmaW5baV0sIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9jaGFubmVsKSk7CisJCQlvdXRbal0gPSBpbltpXTsKIAogCQkJaWYgKHBtbG1lZXh0LT5jaGFubmVsX3NldFtzZXRfaWR4XS5TY2FuVHlwZSA9PSBTQ0FOX1BBU1NJVkUpCiAJCQkJb3V0W2pdLmZsYWdzICY9IFJUV19JRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU47CkBAIC04MjYxLDcgKzgyNzUsNiBAQAogCXU4IHJlcyA9IF9TVUNDRVNTOwogCWludCBsZW5fZGlmZiA9IDA7CiAKLV9mdW5jX2VudGVyXzsKIAogCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGgyYyA9PSBOVUxMKSB7CkBAIC04MjkwLDcgKzgzMDMsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC04MzY4LDEyICs4MzgwLDEyIEBACiAJCQlzcGluX2xvY2tfYmgoJnBzdGFfYm1jLT5zbGVlcF9xLmxvY2spOwogCiAJCQl4bWl0ZnJhbWVfcGhlYWQgPSBnZXRfbGlzdF9oZWFkKCZwc3RhX2JtYy0+c2xlZXBfcSk7Ci0JCQl4bWl0ZnJhbWVfcGxpc3QgPSBnZXRfbmV4dCh4bWl0ZnJhbWVfcGhlYWQpOworCQkJeG1pdGZyYW1lX3BsaXN0ID0geG1pdGZyYW1lX3BoZWFkLT5uZXh0OwogCiAJCQl3aGlsZSAoIXJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHhtaXRmcmFtZV9waGVhZCwgeG1pdGZyYW1lX3BsaXN0KSkgewotCQkJCXB4bWl0ZnJhbWUgPSBMSVNUX0NPTlRBSU5PUih4bWl0ZnJhbWVfcGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKKwkJCQlweG1pdGZyYW1lID0gY29udGFpbmVyX29mKHhtaXRmcmFtZV9wbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOwogCi0JCQkJeG1pdGZyYW1lX3BsaXN0ID0gZ2V0X25leHQoeG1pdGZyYW1lX3BsaXN0KTsKKwkJCQl4bWl0ZnJhbWVfcGxpc3QgPSB4bWl0ZnJhbWVfcGxpc3QtPm5leHQ7CiAKIAkJCQlydHdfbGlzdF9kZWxldGUoJnB4bWl0ZnJhbWUtPmxpc3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21wLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21wLmMKaW5kZXggNjQ1MWVmZC4uNzA1ZjY2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbXAuYwpAQCAtMjMsNiArMjMsNyBAQAogCiAjaW5jbHVkZSAib2RtX3ByZWNvbXAuaCIKICNpbmNsdWRlICJydGw4MTg4ZV9oYWwuaCIKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKIHUzMiByZWFkX21hY3JlZyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgc3opCiB7CkBAIC00MDYsNyArNDA3LDcgQEAKIAkJZ290byBlbmRfb2ZfbXBfc3RhcnRfdGVzdDsKIAl9CiAKLQkvKiAzIDMuIGpvaW4gcHN1ZG8gQWRIb2MgKi8KKwkvKiAzIDMuIGpvaW4gcHNldWRvIEFkSG9jICovCiAJdGd0X25ldHdvcmstPmpvaW5fcmVzID0gMTsKIAl0Z3RfbmV0d29yay0+YWlkID0gMTsKIAlwc3RhLT5haWQgPSAxOwpAQCAtNDQyLDcgKzQ0Myw3IEBACiAJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9NUF9TVEFURSkgPT0gZmFsc2UpCiAJCQlnb3RvIGVuZF9vZl9tcF9zdG9wX3Rlc3Q7CiAKLQkJLyogMyAxLiBkaXNjb25uZWN0IHBzdWRvIEFkSG9jICovCisJCS8qIDMgMS4gZGlzY29ubmVjdCBwc2V1ZG8gQWRIb2MgKi8KIAkJcnR3X2luZGljYXRlX2Rpc2Nvbm5lY3QocGFkYXB0ZXIpOwogCiAJCS8qIDMgMi4gY2xlYXIgcHN0YSB1c2VkIGluIG1wIHRlc3QgbW9kZS4gKi8KQEAgLTg4Miw3ICs4ODMsNyBAQAogewogCXUzMiBpLCBwc2RfcHRzID0gMCwgcHNkX3N0YXJ0ID0gMCwgcHNkX3N0b3AgPSAwOwogCXUzMiBwc2RfZGF0YSA9IDA7Ci0KKwlpbnQgcmV0OwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKHBBZGFwdGVyLT5wbmV0ZGV2KSkgewogCQlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl93YXJuaW5nXywgKCJtcF9xdWVyeV9wc2Q6IEZhaWwhIGludGVyZmFjZSBub3Qgb3BlbmVkIVxuIikpOwpAQCAtODk5LDcgKzkwMCwxMCBAQAogCQlwc2Rfc3RhcnQgPSA2NDsKIAkJcHNkX3N0b3AgPSAxMjg7CiAJfSBlbHNlIHsKLQkJc3NjYW5mKGRhdGEsICJwdHMgPSVkLCBzdGFydCA9JWQsIHN0b3AgPSVkIiwgJnBzZF9wdHMsICZwc2Rfc3RhcnQsICZwc2Rfc3RvcCk7CisJCXJldCA9IHNzY2FuZihkYXRhLCAicHRzID0lZCwgc3RhcnQgPSVkLCBzdG9wID0lZCIsCisJCQkJJnBzZF9wdHMsICZwc2Rfc3RhcnQsICZwc2Rfc3RvcCk7CisJCWlmIChyZXQgIT0gMykKKwkJCXJldHVybiAwOwogCX0KIAogCV9ydHdfbWVtc2V0KGRhdGEsICdcMCcsIHNpemVvZigqZGF0YSkpOwpAQCAtOTQzLDcgKzk0Nyw3IEBACiAJfQogCiAJaWYgKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1ZikKLQkJcnR3X3ZtZnJlZShweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdF9leHRidWYsIG51bV94bWl0X2V4dGJ1ZiAqIHNpemVvZihzdHJ1Y3QgeG1pdF9idWYpICsgNCk7CisJCXZmcmVlKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1Zik7CiAKIAlpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5tcF9tb2RlID09IDApIHsKIAkJbWF4X3htaXRfZXh0YnVmX3NpemUgPSAyMDAwMDsKQEAgLTk1Niw3ICs5NjAsNyBAQAogCS8qICBJbml0IHhtaXQgZXh0ZW5zaW9uIGJ1ZmYgKi8KIAlfcnR3X2luaXRfcXVldWUoJnB4bWl0cHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9xdWV1ZSk7CiAKLQlweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdF9leHRidWYgPSBydHdfenZtYWxsb2MobnVtX3htaXRfZXh0YnVmICogc2l6ZW9mKHN0cnVjdCB4bWl0X2J1ZikgKyA0KTsKKwlweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdF9leHRidWYgPSB2emFsbG9jKG51bV94bWl0X2V4dGJ1ZiAqIHNpemVvZihzdHJ1Y3QgeG1pdF9idWYpICsgNCk7CiAKIAlpZiAocHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRfZXh0YnVmICA9PSBOVUxMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sICgiYWxsb2MgeG1pdF9leHRidWYgZmFpbCFcbiIpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbXBfaW9jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbXBfaW9jdGwuYwppbmRleCBlZGNkOGE1Li5lNzgzOTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21wX2lvY3RsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tcF9pb2N0bC5jCkBAIC0zMyw3ICszMyw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBvaWRfcGFyX3ByaXYtPmluZm9ybWF0aW9uX2J1Zl9sZW4gPCBzaXplb2YodTgpKQogCQlyZXR1cm4gTkRJU19TVEFUVVNfSU5WQUxJRF9MRU5HVEg7CkBAIC00OCw3ICs0Nyw2IEBACiAJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRDsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTYxLDcgKzU5LDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLCAoIitydGw4MTg4ZXVfb2lkX3J0X3Byb193cml0ZV9iYl9yZWdfaGRsXG4iKSk7CiAKQEAgLTg3LDcgKzg0LDYgQEAKIAl3cml0ZV9iYnJlZyhBZGFwdGVyLCBvZmZzZXQsIDB4RkZGRkZGRkYsIHZhbHVlKTsKIAlfaXJxbGV2ZWxfY2hhbmdlZF8oJm9sZGlycWwsIFJBSVNFKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTAwLDcgKzk2LDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLCAoIitydGw4MTg4ZXVfb2lkX3J0X3Byb19yZWFkX2JiX3JlZ19oZGxcbiIpKTsKIApAQCAtMTI2LDcgKzEyMSw2IEBACiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywKIAkJICgiLXJ0bDgxODhldV9vaWRfcnRfcHJvX3JlYWRfYmJfcmVnX2hkbDogb2Zmc2V0PTB4JTAzWCB2YWx1ZToweCUwOFhcbiIsCiAJCSAgb2Zmc2V0LCB2YWx1ZSkpOwotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTQwLDcgKzEzNCw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywgKCIrcnRsODE4OGV1X29pZF9ydF9wcm9fd3JpdGVfcmZfcmVnX2hkbFxuIikpOwogCkBAIC0xNzEsNyArMTY0LDYgQEAKIAl3cml0ZV9yZnJlZyhBZGFwdGVyLCBwYXRoLCBvZmZzZXQsIHZhbHVlKTsKIAlfaXJxbGV2ZWxfY2hhbmdlZF8oJm9sZGlycWwsIFJBSVNFKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTg1LDcgKzE3Nyw2IEBACiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywgKCIrcnRsODE4OGV1X29pZF9ydF9wcm9fcmVhZF9yZl9yZWdfaGRsXG4iKSk7CiAKQEAgLTIxNyw3ICsyMDgsNiBAQAogCQkgKCItcnRsODE4OGV1X29pZF9ydF9wcm9fcmVhZF9yZl9yZWdfaGRsOiBwYXRoPSVkIG9mZnNldD0weCUwMlggdmFsdWU9MHglMDVYXG4iLAogCQkgIHBhdGgsIG9mZnNldCwgdmFsdWUpKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMjMyLDcgKzIyMiw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywKIAkJICgiK3J0bDgxODhldV9vaWRfcnRfcHJvX3NldF9kYXRhX3JhdGVfaGRsXG4iKSk7CkBAIC0yNTUsNyArMjQ0LDYgQEAKIAlTZXREYXRhUmF0ZShBZGFwdGVyKTsKIAlfaXJxbGV2ZWxfY2hhbmdlZF8oJm9sZGlycWwsIFJBSVNFKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMjY2LDcgKzI1NCw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywgKCIrcnRsODE4OGV1X29pZF9ydF9wcm9fc3RhcnRfdGVzdF9oZGxcbiIpKTsKIApAQCAtMjkzLDcgKzI4MCw2IEBACiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLCAoIi1ydGw4MTg4ZXVfb2lkX3J0X3Byb19zdGFydF90ZXN0X2hkbDogbXBfbW9kZT0lZFxuIiwgQWRhcHRlci0+bXBwcml2Lm1vZGUpKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMzAzLDcgKzI4OSw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywgKCIrU2V0IE9JRF9SVF9QUk9fU1RPUF9URVNUXG4iKSk7CiAKQEAgLTMxNiw3ICszMDEsNiBAQAogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywgKCItU2V0IE9JRF9SVF9QUk9fU1RPUF9URVNUXG4iKSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTMyNyw3ICszMTEsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sICgiK3J0bDgxODhldV9vaWRfcnRfcHJvX3NldF9jaGFubmVsX2RpcmVjdF9jYWxsX2hkbFxuIikpOwogCkBAIC0zNTIsNyArMzM1LDYgQEAKIAlTZXRDaGFubmVsKEFkYXB0ZXIpOwogCV9pcnFsZXZlbF9jaGFuZ2VkXygmb2xkaXJxbCwgUkFJU0UpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0zNjQsNyArMzQ2LDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfaW5mb18sCiAJCSAoIitydGw4MTg4ZXVfb2lkX3J0X3NldF9iYW5kd2lkdGhfaGRsXG4iKSk7CkBAIC0zOTEsNyArMzcyLDYgQEAKIAkJICgiLXJ0bDgxODhldV9vaWRfcnRfc2V0X2JhbmR3aWR0aF9oZGw6IGJhbmR3aWR0aD0lZCBjaGFubmVsX29mZnNldD0lZFxuIiwKIAkJICBiYW5kd2lkdGgsIGNoYW5uZWxfb2Zmc2V0KSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTQwMiw3ICszODIsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sICgiK3J0bDgxODhldV9vaWRfcnRfcHJvX3NldF9hbnRlbm5hX2JiX2hkbFxuIikpOwogCkBAIC00MjYsNyArNDA1LDYgQEAKIAkJKih1MzIgKilwb2lkX3Bhcl9wcml2LT5pbmZvcm1hdGlvbl9idWYgPSBhbnRlbm5hOwogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNDM3LDcgKzQxNSw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfaW5mb18sICgiK3J0bDgxODhldV9vaWRfcnRfcHJvX3NldF90eF9wb3dlcl9jb250cm9sX2hkbFxuIikpOwogCkBAIC00NjEsNyArNDM4LDYgQEAKIAlTZXRUeFBvd2VyKEFkYXB0ZXIpOwogCV9pcnFsZXZlbF9jaGFuZ2VkXygmb2xkaXJxbCwgUkFJU0UpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC00NzQsNyArNDUwLDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocG9pZF9wYXJfcHJpdi0+dHlwZV9vZl9vaWQgIT0gUVVFUllfT0lEKSB7CiAJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRDsKQEAgLTQ4OCw3ICs0NjMsNiBAQAogCQlzdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0xFTkdUSDsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTQ5OCw3ICs0NzIsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwb2lkX3Bhcl9wcml2LT50eXBlX29mX29pZCAhPSBRVUVSWV9PSUQpIHsKIAkJc3RhdHVzID0gTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEOwpAQCAtNTEzLDcgKzQ4Niw2IEBACiAJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfTEVOR1RIOwogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNTIzLDcgKzQ5NSw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBvaWRfcGFyX3ByaXYtPnR5cGVfb2Zfb2lkICE9IFFVRVJZX09JRCkgewogCQlzdGF0dXMgPSBORElTX1NUQVRVU19OT1RfQUNDRVBURUQ7CkBAIC01MzgsNyArNTA5LDYgQEAKIAkJc3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9MRU5HVEg7CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC01NDksNyArNTE5LDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocG9pZF9wYXJfcHJpdi0+dHlwZV9vZl9vaWQgIT0gU0VUX09JRCkgewogCQlzdGF0dXMgPSBORElTX1NUQVRVU19OT1RfQUNDRVBURUQ7CkBAIC01NTksNyArNTI4LDYgQEAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9hbGVydF8sICgiPT09PiBydGw4MTg4ZXVfb2lkX3J0X3Byb19yZXNldF90eF9wYWNrZXRfc2VudF9oZGwuXG4iKSk7CiAJQWRhcHRlci0+bXBwcml2LnR4X3BrdGNvdW50ID0gMDsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNTY5LDcgKzUzNyw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBvaWRfcGFyX3ByaXYtPnR5cGVfb2Zfb2lkICE9IFNFVF9PSUQpIHsKIAkJc3RhdHVzID0gTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEOwpAQCAtNTgzLDcgKzU1MCw2IEBACiAJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfTEVOR1RIOwogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNTkzLDcgKzU1OSw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBvaWRfcGFyX3ByaXYtPnR5cGVfb2Zfb2lkICE9IFNFVF9PSUQpIHsKIAkJc3RhdHVzID0gTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEOwpAQCAtNjA0LDcgKzU2OSw2IEBACiAJUmVzZXRQaHlSeFBrdENvdW50KEFkYXB0ZXIpOwogCV9pcnFsZXZlbF9jaGFuZ2VkXygmb2xkaXJxbCwgUkFJU0UpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC02MTQsNyArNTc4LDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9pbmZvXywgKCIrcnRsODE4OGV1X29pZF9ydF9nZXRfcGh5X3J4X3BhY2tldF9yZWNlaXZlZF9oZGxcbiIpKTsKIApAQCAtNjMyLDcgKzU5NSw2IEBACiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLCAoIi1ydGw4MTg4ZXVfb2lkX3J0X2dldF9waHlfcnhfcGFja2V0X3JlY2VpdmVkX2hkbDogcmVjdl9vaz0lZFxuIiwgKih1MzIgKilwb2lkX3Bhcl9wcml2LT5pbmZvcm1hdGlvbl9idWYpKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNjQyLDcgKzYwNCw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfaW5mb18sICgiK3J0bDgxODhldV9vaWRfcnRfZ2V0X3BoeV9yeF9wYWNrZXRfY3JjMzJfZXJyb3JfaGRsXG4iKSk7CiAKQEAgLTY2Myw3ICs2MjQsNiBAQAogCQkgKCItcnRsODE4OGV1X29pZF9ydF9nZXRfcGh5X3J4X3BhY2tldF9jcmMzMl9lcnJvcl9oZGw6IHJlY3ZfZXJyID0lZFxuIiwKIAkJICoodTMyICopcG9pZF9wYXJfcHJpdi0+aW5mb3JtYXRpb25fYnVmKSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTY3NCw3ICs2MzQsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sICgiK3J0bDgxODhldV9vaWRfcnRfcHJvX3NldF9jb250aW51b3VzX3R4X2hkbFxuIikpOwogCkBAIC02OTgsNyArNjU3LDYgQEAKIAl9CiAJX2lycWxldmVsX2NoYW5nZWRfKCZvbGRpcnFsLCBSQUlTRSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTcwOSw3ICs2NjcsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X2FsZXJ0XywgKCIrcnRsODE4OGV1X29pZF9ydF9wcm9fc2V0X3NpbmdsZV9jYXJyaWVyX3R4X2hkbFxuIikpOwogCkBAIC03MzMsNyArNjkwLDYgQEAKIAl9CiAJX2lycWxldmVsX2NoYW5nZWRfKCZvbGRpcnFsLCBSQUlTRSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTc0NCw3ICs3MDAsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sICgiK3J0bDgxODhldV9vaWRfcnRfcHJvX3NldF9jYXJyaWVyX3N1cHByZXNzaW9uX3R4X2hkbFxuIikpOwogCkBAIC03NjgsNyArNzIzLDYgQEAKIAl9CiAJX2lycWxldmVsX2NoYW5nZWRfKCZvbGRpcnFsLCBSQUlTRSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTc3OSw3ICs3MzMsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X2FsZXJ0XywgKCIrcnRsODE4OGV1X29pZF9ydF9wcm9fc2V0X3NpbmdsZV90b25lX3R4X2hkbFxuIikpOwogCkBAIC03OTIsNyArNzQ1LDYgQEAKIAlTZXRTaW5nbGVUb25lVHgoQWRhcHRlciwgKHU4KWJTdGFydFRlc3QpOwogCV9pcnFsZXZlbF9jaGFuZ2VkXygmb2xkaXJxbCwgUkFJU0UpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC04MDYsNyArNzU4LDYgQEAKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBvaWRfcGFyX3ByaXYtPnR5cGVfb2Zfb2lkICE9IFNFVF9PSUQpCiAJCXJldHVybiBORElTX1NUQVRVU19OT1RfQUNDRVBURUQ7CkBAIC04MTUsNyArNzY2LDYgQEAKIAlydHdfaGFsX3NldF9od3JlZyhBZGFwdGVyLCBIV19WQVJfVFJJR0dFUl9HUElPXzAsIE5VTEwpOwogCV9pcnFsZXZlbF9jaGFuZ2VkXygmb2xkaXJxbCwgUkFJU0UpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC04MzMsNyArNzgzLDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9pbmZvXywKIAkJICgiK3J0bDgxODhldV9vaWRfcnRfcHJvX3JlYWRfcmVnaXN0ZXJfaGRsXG4iKSk7CkBAIC04NzAsNyArODE5LDYgQEAKIAogCSpwb2lkX3Bhcl9wcml2LT5ieXRlc19ydyA9IHdpZHRoOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC04ODIsNyArODMwLDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfaW5mb18sCiAJCSAoIitydGw4MTg4ZXVfb2lkX3J0X3Byb193cml0ZV9yZWdpc3Rlcl9oZGxcbiIpKTsKQEAgLTkyOSw3ICs4NzYsNiBAQAogCQkgKCItcnRsODE4OGV1X29pZF9ydF9wcm9fd3JpdGVfcmVnaXN0ZXJfaGRsOiBvZmZzZXQ9MHglMDhYIHdpZHRoPSVkIHZhbHVlPTB4JVhcbiIsCiAJCSAgb2Zmc2V0LCB3aWR0aCwgdmFsdWUpKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTAwMiw3ICs5NDgsNiBAQAogCiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sICgiK09JRF9SVF9QUk9fU0VUX0RBVEFfUkFURV9FWFxuIikpOwogCkBAIC0xMDE2LDcgKzk2MSw2IEBACiAKIAlfaXJxbGV2ZWxfY2hhbmdlZF8oJm9sZGlycWwsIFJBSVNFKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTAyNyw3ICs5NzEsNiBAQAogCXU4IHRoZXJtYWwgPSAwOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sICgiK3J0bDgxODhldV9vaWRfcnRfZ2V0X3RoZXJtYWxfbWV0ZXJfaGRsXG4iKSk7CiAKQEAgLTEwNDQsNyArOTg3LDYgQEAKIAkqKHUzMiAqKXBvaWRfcGFyX3ByaXYtPmluZm9ybWF0aW9uX2J1ZiA9ICh1MzIpdGhlcm1hbDsKIAkqcG9pZF9wYXJfcHJpdi0+Ynl0ZXNfcncgPSBzaXplb2YodTMyKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTA2MCw3ICsxMDAyLDYgQEAKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwb2lkX3Bhcl9wcml2LT5pbmZvcm1hdGlvbl9idWZfbGVuIDwgc2l6ZW9mKHU4KSkKIAkJcmV0dXJuIE5ESVNfU1RBVFVTX0lOVkFMSURfTEVOR1RIOwpAQCAtMTA3OSw3ICsxMDIwLDYgQEAKIAl9CiAJX2lycWxldmVsX2NoYW5nZWRfKCZvbGRpcnFsLCBSQUlTRSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTExNDMsNyArMTA4Myw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBvaWRfcGFyX3ByaXYtPnR5cGVfb2Zfb2lkICE9IFFVRVJZX09JRCkKIAkJcmV0dXJuIE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRDsKQEAgLTExNzYsNyArMTExNSw2IEBACiAJfQogCV9pcnFsZXZlbF9jaGFuZ2VkXygmb2xkaXJxbCwgUkFJU0UpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMTkwLDcgKzExMjgsNiBAQAogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBvaWRfcGFyX3ByaXYtPnR5cGVfb2Zfb2lkICE9IFNFVF9PSUQpCiAJCXJldHVybiBORElTX1NUQVRVU19OT1RfQUNDRVBURUQ7CkBAIC0xMjE2LDcgKzExNTMsNiBAQAogCQlzdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwogCV9pcnFsZXZlbF9jaGFuZ2VkXygmb2xkaXJxbCwgUkFJU0UpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMjI3LDcgKzExNjMsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCSpwb2lkX3Bhcl9wcml2LT5ieXRlc19ydyA9IDA7CiAKQEAgLTEyNjcsNyArMTIwMiw2IEBACiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfaW5mb18sCiAJCSAoIi1ydGw4MTg4ZXVfb2lkX3J0X3Byb19yd19lZnVzZV9wZ3BrdF9oZGw6IHN0YXR1cz0weCUwOFhcbiIsIHN0YXR1cykpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMjc5LDcgKzEyMTMsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwb2lkX3Bhcl9wcml2LT50eXBlX29mX29pZCAhPSBRVUVSWV9PSUQpCiAJCXJldHVybiBORElTX1NUQVRVU19OT1RfQUNDRVBURUQ7CkBAIC0xMjk2LDcgKzEyMjksNiBAQAogCX0gZWxzZSB7CiAJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CiAJfQotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTMwNiw3ICsxMjM4LDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocG9pZF9wYXJfcHJpdi0+dHlwZV9vZl9vaWQgIT0gUVVFUllfT0lEKQogCQlyZXR1cm4gTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEOwpAQCAtMTMyMSw3ICsxMjUyLDYgQEAKIAkJICgiLXJ0bDgxODhldV9vaWRfcnRfZ2V0X2VmdXNlX21heF9zaXplX2hkbDogc2l6ZT0lZCBzdGF0dXM9MHglMDhYXG4iLAogCQkgICooaW50ICopcG9pZF9wYXJfcHJpdi0+aW5mb3JtYXRpb25fYnVmLCBzdGF0dXMpKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTMzMCw3ICsxMjYwLDYgQEAKIHsKIAlpbnQgc3RhdHVzOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9pbmZvXywgKCIrcnRsODE4OGV1X29pZF9ydF9wcm9fZWZ1c2VfaGRsXG4iKSk7CiAKQEAgLTEzNDEsNyArMTI3MCw2IEBACiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9pbmZvXywgKCItcnRsODE4OGV1X29pZF9ydF9wcm9fZWZ1c2VfaGRsOiBzdGF0dXM9MHglMDhYXG4iLCBzdGF0dXMpKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTM1Myw3ICsxMjgxLDYgQEAKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCXUxNgltYXBsZW4gPSAwOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLCAoIitydGw4MTg4ZXVfb2lkX3J0X3Byb19lZnVzZV9tYXBfaGRsXG4iKSk7CiAKQEAgLTEzOTgsNyArMTMyNSw2IEBACiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfaW5mb18sCiAJCSAoIi1ydGw4MTg4ZXVfb2lkX3J0X3Byb19lZnVzZV9tYXBfaGRsOiBzdGF0dXM9MHglMDhYXG4iLCBzdGF0dXMpKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTQxNCw3ICsxMzQwLDYgQEAKIAl1OAkJcnhfcGt0X3R5cGU7CiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sICgiK3J0bDgxODhldV9vaWRfcnRfc2V0X3J4X3BhY2tldF90eXBlX2hkbFxuIikpOwogCkBAIC0xNDI3LDcgKzEzNTIsNiBAQAogCXJ4X3BrdF90eXBlID0gKigodTggKilwb2lkX3Bhcl9wcml2LT5pbmZvcm1hdGlvbl9idWYpOy8qIDQgKi8KIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X2luZm9fLCAoInJ4X3BrdF90eXBlOiAleFxuIiwgcnhfcGt0X3R5cGUpKTsKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE0ODIsNyArMTQwNiw2IEBACiB7CiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwb2lkX3Bhcl9wcml2LT50eXBlX29mX29pZCAhPSBTRVRfT0lEKSB7CiAJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRDsKQEAgLTE0OTcsNyArMTQyMCw2IEBACiAJLyogQ0FMTCAgdGhlIHBvd2VyX2Rvd24gZnVuY3Rpb24gKi8KIAlfaXJxbGV2ZWxfY2hhbmdlZF8oJm9sZGlycWwsIFJBSVNFKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19wMnAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcDJwLmMKaW5kZXggNmU4YzA2ZS4uOTQyNWM0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19wMnAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3AycC5jCkBAIC01NywxMyArNTcsMTMgQEAKIAogCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKIAlwaGVhZCA9ICZwc3RhcHJpdi0+YXNvY19saXN0OwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAkvKiBsb29rIHVwIHN0YSBhc29jX3F1ZXVlICovCiAJd2hpbGUgKChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSA9PSBmYWxzZSkgewotCQlwc3RhID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgYXNvY19saXN0KTsKKwkJcHN0YSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBhc29jX2xpc3QpOwogCi0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCiAKIAkJaWYgKHBzdGEtPmlzX3AycF9kZXZpY2UpIHsKQEAgLTgyNCw3ICs4MjQsNyBAQAogCWlmIChydHdfcDJwX2Noa19yb2xlKHB3ZGluZm8sIFAyUF9ST0xFX0RFVklDRSkgfHwgcnR3X3AycF9jaGtfcm9sZShwd2RpbmZvLCBQMlBfUk9MRV9HTykpIHsKIAkJcDJwaWUgPSBydHdfZ2V0X3AycF9pZShwZnJhbWUgKyBXTEFOX0hEUl9BM19MRU4gKyBfUFJPQkVSRVFfSUVfT0ZGU0VUXyAsIGxlbiAtIFdMQU5fSERSX0EzX0xFTiAtIF9QUk9CRVJFUV9JRV9PRkZTRVRfICwgTlVMTCwgJnAycGllbGVuKTsKIAkJaWYgKHAycGllKSB7Ci0JCQlpZiAoKHAgIT0gTlVMTCkgJiYgX3J0d19tZW1jbXAoKHZvaWQgKikocCsyKSwgKHZvaWQgKilwd2RpbmZvLT5wMnBfd2lsZGNhcmRfc3NpZCAsIDcpKSB7CisJCQlpZiAoKHAgIT0gTlVMTCkgJiYgIW1lbWNtcCgodm9pZCAqKShwKzIpLCAodm9pZCAqKXB3ZGluZm8tPnAycF93aWxkY2FyZF9zc2lkICwgNykpIHsKIAkJCQkvKiB0b2RvOiAqLwogCQkJCS8qIENoZWNrIFJlcXVlc3RlZCBEZXZpY2UgVHlwZSBhdHRyaWJ1dGVzIGluIFdTQyBJRS4gKi8KIAkJCQkvKiBDaGVjayBEZXZpY2UgSUQgYXR0cmlidXRlIGluIFAyUCBJRSAqLwpAQCAtOTcyLDI0ICs5NzIsMjQgQEAKIAkJdTMyCWF0dHJfY29udGVudGxlbiA9IDA7CiAKIAkJaWYgKHJ0d19nZXRfcDJwX2F0dHJfY29udGVudChwMnBfaWUsIHAycF9pZWxlbiwgUDJQX0FUVFJfR1JPVVBfSUQsIGdyb3VwaWQsICZhdHRyX2NvbnRlbnRsZW4pKSB7Ci0JCQlpZiAoX3J0d19tZW1jbXAocHdkaW5mby0+ZGV2aWNlX2FkZHIsIGdyb3VwaWQsIEVUSF9BTEVOKSAmJgotCQkJICAgIF9ydHdfbWVtY21wKHB3ZGluZm8tPnAycF9ncm91cF9zc2lkLCBncm91cGlkK0VUSF9BTEVOLCBwd2RpbmZvLT5wMnBfZ3JvdXBfc3NpZF9sZW4pKSB7CisJCQlpZiAoIW1lbWNtcChwd2RpbmZvLT5kZXZpY2VfYWRkciwgZ3JvdXBpZCwgRVRIX0FMRU4pICYmCisJCQkgICAgIW1lbWNtcChwd2RpbmZvLT5wMnBfZ3JvdXBfc3NpZCwgZ3JvdXBpZCtFVEhfQUxFTiwgcHdkaW5mby0+cDJwX2dyb3VwX3NzaWRfbGVuKSkgewogCQkJCWF0dHJfY29udGVudGxlbiA9IDA7CiAJCQkJaWYgKHJ0d19nZXRfcDJwX2F0dHJfY29udGVudChwMnBfaWUsIHAycF9pZWxlbiwgUDJQX0FUVFJfREVWSUNFX0lELCBkZXZfYWRkciwgJmF0dHJfY29udGVudGxlbikpIHsKIAkJCQkJc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQsICpwbGlzdDsKIAogCQkJCQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7CiAJCQkJCXBoZWFkID0gJnBzdGFwcml2LT5hc29jX2xpc3Q7Ci0JCQkJCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCQkJCQlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJCQkJCS8qIGxvb2sgdXAgc3RhIGFzb2NfcXVldWUgKi8KIAkJCQkJd2hpbGUgKChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSA9PSBmYWxzZSkgewotCQkJCQkJcHN0YSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGFzb2NfbGlzdCk7CisJCQkJCQlwc3RhID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGFzb2NfbGlzdCk7CiAKLQkJCQkJCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQkJCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAogCQkJCQkJaWYgKHBzdGEtPmlzX3AycF9kZXZpY2UgJiYgKHBzdGEtPmRldl9jYXAmUDJQX0RFVkNBUF9DTElFTlRfRElTQ09WRVJBQklMSVRZKSAmJgotCQkJCQkJICAgIF9ydHdfbWVtY21wKHBzdGEtPmRldl9hZGRyLCBkZXZfYWRkciwgRVRIX0FMRU4pKSB7CisJCQkJCQkgICAgIW1lbWNtcChwc3RhLT5kZXZfYWRkciwgZGV2X2FkZHIsIEVUSF9BTEVOKSkgewogCQkJCQkJCS8qIGlzc3VlIEdPIERpc2NvdmVyYWJpbGl0eSBSZXF1ZXN0ICovCiAJCQkJCQkJaXNzdWVfZ3JvdXBfZGlzY19yZXEocHdkaW5mbywgcHN0YS0+aHdhZGRyKTsKIAkJCQkJCQlzdGF0dXMgPSBQMlBfU1RBVFVTX1NVQ0NFU1M7CkBAIC0xMTE4LDcgKzExMTgsNyBAQAogCQkvKglDb21tZW50ZWQgYnkgS3VydCAyMDEyMDExMyAqLwogCQkvKglJZiBzb21lIGRldmljZSB3YW50cyB0byBkbyBwMnAgaGFuZHNoYWtlIHdpdGhvdXQgc2VuZGluZyBwcm92X2Rpc2NfcmVxICovCiAJCS8qCVdlIGhhdmUgdG8gZ2V0IHBlZXJfcmVxX2NtIGZyb20gaGVyZS4gKi8KLQkJaWYgKF9ydHdfbWVtY21wKHB3ZGluZm8tPnJ4X3Byb3ZfZGlzY19pbmZvLnN0cmNvbmZpZ19tZXRob2RfZGVzY19vZl9wcm92X2Rpc2NfcmVxLCAiMDAwIiwgMykpIHsKKwkJaWYgKCFtZW1jbXAocHdkaW5mby0+cnhfcHJvdl9kaXNjX2luZm8uc3RyY29uZmlnX21ldGhvZF9kZXNjX29mX3Byb3ZfZGlzY19yZXEsICIwMDAiLCAzKSkgewogCQkJcnR3X2dldF93cHNfYXR0cl9jb250ZW50KHdwc2llLCB3cHNfaWVsZW4sIFdQU19BVFRSX0RFVklDRV9QV0lELCAodTggKikmYmVfdG1wLCAmd3BzX2RldmljZXBhc3N3b3JkX2lkX2xlbik7CiAJCQl3cHNfZGV2aWNlcGFzc3dvcmRfaWQgPSBiZTE2X3RvX2NwdShiZV90bXApOwogCkBAIC0xNDk4LDcgKzE0OTgsNiBAQAogCXN0cnVjdCBuZGlzXzgwMl8xMV9zc2lkCXNzaWQ7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAotX2Z1bmNfZW50ZXJfOwogCiAJX3J0d19tZW1zZXQoKHVuc2lnbmVkIGNoYXIgKikmc3NpZCwgMCwgc2l6ZW9mKHN0cnVjdCBuZGlzXzgwMl8xMV9zc2lkKSk7CiAJbWVtY3B5KHNzaWQuU3NpZCwgcHdkaW5mby0+cDJwX3dpbGRjYXJkX3NzaWQsIFAyUF9XSUxEQ0FSRF9TU0lEX0xFTik7CkBAIC0xNTA5LDcgKzE1MDgsNiBAQAogICAgICAgICBzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7CiAgICAgICAgIHJ0d19zaXRlc3VydmV5X2NtZChwYWRhcHRlciwgJnNzaWQsIDEsIE5VTEwsIDApOwogICAgICAgICBzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHAycF9jb25jdXJyZW50X2hhbmRsZXIoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKQEAgLTE1MTgsNyArMTUxNiw2IEBACiB7CiAJc3RydWN0IHdpZmlkaXJlY3RfaW5mbyAgKnB3ZGluZm8gPSAmcGFkYXB0ZXItPndkaW5mbzsKIAotX2Z1bmNfZW50ZXJfOwogCWlmIChydHdfcDJwX2Noa19zdGF0ZShwd2RpbmZvLCBQMlBfU1RBVEVfR09ORUdPX0lORykgfHwgcnR3X3AycF9jaGtfc3RhdGUocHdkaW5mbywgUDJQX1NUQVRFX0dPTkVHT19GQUlMKSkKIAkJcnR3X3AycF9zZXRfcm9sZShwd2RpbmZvLCBQMlBfUk9MRV9ERVZJQ0UpOwogCXJ0d19wMnBfc2V0X3N0YXRlKHB3ZGluZm8sIHJ0d19wMnBfcHJlX3N0YXRlKHB3ZGluZm8pKTsKQEAgLTE1MjgsNTQgKzE1MjUsNDYgQEAKIAkJLyoJYmVjYXVzZSB0aGlzIFAyUCBjbGllbnQgc2hvdWxkIHN0YXkgYXQgdGhlIG9wZXJhdGluZyBjaGFubmVsIG9mIFAyUCBHTy4gKi8KIAkJc2V0X2NoYW5uZWxfYndtb2RlKHBhZGFwdGVyLCBwd2RpbmZvLT5saXN0ZW5fY2hhbm5lbCwgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSwgSFRfQ0hBTk5FTF9XSURUSF8yMCk7CiAJfQotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB2b2lkIHByZV90eF9pbnZpdGVyZXFfaGFuZGxlcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJc3RydWN0IHdpZmlkaXJlY3RfaW5mbyAgKnB3ZGluZm8gPSAmcGFkYXB0ZXItPndkaW5mbzsKIAl1OAl2YWw4ID0gMTsKLV9mdW5jX2VudGVyXzsKIAogCXNldF9jaGFubmVsX2J3bW9kZShwYWRhcHRlciwgcHdkaW5mby0+aW52aXRlcmVxX2luZm8ucGVlcl9jaCwgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSwgSFRfQ0hBTk5FTF9XSURUSF8yMCk7CiAJcGFkYXB0ZXItPkhhbEZ1bmMuU2V0SHdSZWdIYW5kbGVyKHBhZGFwdGVyLCBIV19WQVJfTUxNRV9TSVRFU1VSVkVZLCAodTggKikoJnZhbDgpKTsKIAlpc3N1ZV9wcm9iZXJlcV9wMnAocGFkYXB0ZXIsIE5VTEwpOwogCV9zZXRfdGltZXIoJnB3ZGluZm8tPnByZV90eF9zY2FuX3RpbWVyLCBQMlBfVFhfUFJFU0NBTl9USU1FT1VUKTsKIAotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB2b2lkIHByZV90eF9wcm92ZGlzY19oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKIAlzdHJ1Y3Qgd2lmaWRpcmVjdF9pbmZvICAqcHdkaW5mbyA9ICZwYWRhcHRlci0+d2RpbmZvOwogCXU4CXZhbDggPSAxOwotX2Z1bmNfZW50ZXJfOwogCiAJc2V0X2NoYW5uZWxfYndtb2RlKHBhZGFwdGVyLCBwd2RpbmZvLT50eF9wcm92X2Rpc2NfaW5mby5wZWVyX2NoYW5uZWxfbnVtWzBdLCBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFLCBIVF9DSEFOTkVMX1dJRFRIXzIwKTsKIAlydHdfaGFsX3NldF9od3JlZyhwYWRhcHRlciwgSFdfVkFSX01MTUVfU0lURVNVUlZFWSwgKHU4ICopKCZ2YWw4KSk7CiAJaXNzdWVfcHJvYmVyZXFfcDJwKHBhZGFwdGVyLCBOVUxMKTsKIAlfc2V0X3RpbWVyKCZwd2RpbmZvLT5wcmVfdHhfc2Nhbl90aW1lciwgUDJQX1RYX1BSRVNDQU5fVElNRU9VVCk7CiAKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdm9pZCBwcmVfdHhfbmVnb3JlcV9oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKIAlzdHJ1Y3Qgd2lmaWRpcmVjdF9pbmZvICAqcHdkaW5mbyA9ICZwYWRhcHRlci0+d2RpbmZvOwogCXU4CXZhbDggPSAxOwotX2Z1bmNfZW50ZXJfOwogCiAJc2V0X2NoYW5uZWxfYndtb2RlKHBhZGFwdGVyLCBwd2RpbmZvLT5uZWdvX3JlcV9pbmZvLnBlZXJfY2hhbm5lbF9udW1bMF0sIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUsIEhUX0NIQU5ORUxfV0lEVEhfMjApOwogCXJ0d19oYWxfc2V0X2h3cmVnKHBhZGFwdGVyLCBIV19WQVJfTUxNRV9TSVRFU1VSVkVZLCAodTggKikoJnZhbDgpKTsKIAlpc3N1ZV9wcm9iZXJlcV9wMnAocGFkYXB0ZXIsIE5VTEwpOwogCV9zZXRfdGltZXIoJnB3ZGluZm8tPnByZV90eF9zY2FuX3RpbWVyLCBQMlBfVFhfUFJFU0NBTl9USU1FT1VUKTsKIAotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcDJwX3Byb3RvY29sX3drX2hkbChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIGludCBpbnRDbWRUeXBlKQogewotX2Z1bmNfZW50ZXJfOwogCXN3aXRjaCAoaW50Q21kVHlwZSkgewogCWNhc2UgUDJQX0ZJTkRfUEhBU0VfV0s6CiAJCWZpbmRfcGhhc2VfaGFuZGxlcihwYWRhcHRlcik7CkBAIC0xNTk0LDcgKzE1ODMsNiBAQAogCQlicmVhazsKIAl9CiAKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHByb2Nlc3NfcDJwX3BzX2llKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggKklFcywgdTMyIElFTGVuZ3RoKQpAQCAtMTYxMCw3ICsxNTk4LDYgQEAKIAl1OAlmaW5kX3AycCA9IGZhbHNlLCBmaW5kX3AycF9wcyA9IGZhbHNlOwogCXU4CW5vYV9vZmZzZXQsIG5vYV9udW0sIG5vYV9pbmRleDsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHJ0d19wMnBfY2hrX3N0YXRlKHB3ZGluZm8sIFAyUF9TVEFURV9OT05FKSkKIAkJcmV0dXJuOwpAQCAtMTY4Myw3ICsxNjcwLDYgQEAKIAkJCXAycF9wc193a19jbWQocGFkYXB0ZXIsIFAyUF9QU19ESVNBQkxFLCAxKTsKIAl9CiAKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHAycF9wc193a19oZGwoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCBwMnBfcHNfc3RhdGUpCkBAIC0xNjkxLDcgKzE2NzcsNiBAQAogCXN0cnVjdCBwd3JjdHJsX3ByaXYJCSpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKIAlzdHJ1Y3Qgd2lmaWRpcmVjdF9pbmZvCSpwd2RpbmZvID0gJihwYWRhcHRlci0+d2RpbmZvKTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJLyogIFByZSBhY3Rpb24gZm9yIHAycCBzdGF0ZSAqLwogCXN3aXRjaCAocDJwX3BzX3N0YXRlKSB7CkBAIC0xNzM4LDcgKzE3MjMsNiBAQAogCQlicmVhazsKIAl9CiAKLV9mdW5jX2V4aXRfOwogfQogCiB1OCBwMnBfcHNfd2tfY21kKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggcDJwX3BzX3N0YXRlLCB1OCBlbnF1ZXVlKQpAQCAtMTc0OSw3ICsxNzMzLDYgQEAKIAlzdHJ1Y3QgY21kX3ByaXYJKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocnR3X3AycF9jaGtfc3RhdGUocHdkaW5mbywgUDJQX1NUQVRFX05PTkUpKQogCQlyZXR1cm4gcmVzOwpAQCAtMTc4MSw3ICsxNzY0LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMjAyNCwxMSArMjAwNiwxMSBAQAogCiAJCS8qIERpc2FibGUgUDJQIGZ1bmN0aW9uICovCiAJCWlmICghcnR3X3AycF9jaGtfc3RhdGUocHdkaW5mbywgUDJQX1NUQVRFX05PTkUpKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCZwd2RpbmZvLT5maW5kX3BoYXNlX3RpbWVyKTsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJnB3ZGluZm8tPnJlc3RvcmVfcDJwX3N0YXRlX3RpbWVyKTsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJnB3ZGluZm8tPnByZV90eF9zY2FuX3RpbWVyKTsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJnB3ZGluZm8tPnJlc2V0X2NoX3NpdGVzdXJ2ZXkpOwotCQkJX2NhbmNlbF90aW1lcl9leCgmcHdkaW5mby0+cmVzZXRfY2hfc2l0ZXN1cnZleTIpOworCQkJZGVsX3RpbWVyX3N5bmMoJnB3ZGluZm8tPmZpbmRfcGhhc2VfdGltZXIpOworCQkJZGVsX3RpbWVyX3N5bmMoJnB3ZGluZm8tPnJlc3RvcmVfcDJwX3N0YXRlX3RpbWVyKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwd2RpbmZvLT5wcmVfdHhfc2Nhbl90aW1lcik7CisJCQlkZWxfdGltZXJfc3luYygmcHdkaW5mby0+cmVzZXRfY2hfc2l0ZXN1cnZleSk7CisJCQlkZWxfdGltZXJfc3luYygmcHdkaW5mby0+cmVzZXRfY2hfc2l0ZXN1cnZleTIpOwogCQkJcmVzZXRfY2hfc2l0ZXN1cnZleV90aW1lcl9wcm9jZXNzKHBhZGFwdGVyKTsKIAkJCXJlc2V0X2NoX3NpdGVzdXJ2ZXlfdGltZXJfcHJvY2VzczIocGFkYXB0ZXIpOwogCQkJcnR3X3AycF9zZXRfc3RhdGUocHdkaW5mbywgUDJQX1NUQVRFX05PTkUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19wd3JjdHJsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3B3cmN0cmwuYwppbmRleCBiNWRiMjJjLi5mNjU4MzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3B3cmN0cmwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3B3cmN0cmwuYwpAQCAtMjI2LDExICsyMjYsOCBAQAogCXU4CXJwd207CiAJc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7CiAKLV9mdW5jX2VudGVyXzsKLQogCXBzbHYgPSBQU19TVEFURShwc2x2KTsKIAotCiAJaWYgKHB3cnByaXYtPmJ0Y29leF9yZm9uKSB7CiAJCWlmIChwc2x2IDwgUFNfU1RBVEVfUzQpCiAJCQlwc2x2ID0gUFNfU1RBVEVfUzM7CkBAIC0yNzQsOCArMjcxLDYgQEAKIAogCXB3cnByaXYtPnRvZyArPSAweDgwOwogCXB3cnByaXYtPmNwd20gPSBwc2x2OwotCi1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHU4IFBTX1JEWV9DSEVDSyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCkBAIC0zMTMsOCArMzA4LDYgQEAKIAlzdHJ1Y3Qgd2lmaWRpcmVjdF9pbmZvCSpwd2RpbmZvID0gJihwYWRhcHRlci0+d2RpbmZvKTsKICNlbmRpZiAvKiBDT05GSUdfODhFVV9QMlAgKi8KIAotX2Z1bmNfZW50ZXJfOwotCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3B3cmN0cmxfY18sIF9kcnZfbm90aWNlXywKIAkJICgiJXM6IFBvd2VyTW9kZT0lZCBTbWFydF9QUz0lZFxuIiwKIAkJICBfX2Z1bmNfXywgcHNfbW9kZSwgc21hcnRfcHMpKTsKQEAgLTM2Miw4ICszNTUsNiBAQAogCQkJcnR3X3NldF9ycHdtKHBhZGFwdGVyLCBQU19TVEFURV9TMik7CiAJCX0KIAl9Ci0KLV9mdW5jX2V4aXRfOwogfQogCiAvKgpAQCAtNDEwLDggKzQwMSw2IEBACiB7CiAJc3RydWN0IHB3cmN0cmxfcHJpdgkqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7CiAKLV9mdW5jX2VudGVyXzsKLQogCWlmIChQU19SRFlfQ0hFQ0socGFkYXB0ZXIpID09IGZhbHNlKQogCQlyZXR1cm47CiAKQEAgLTQyOCw4ICs0MTcsNiBAQAogCQkJcHdycHJpdi0+THBzSWRsZUNvdW50Kys7CiAJCX0KIAl9Ci0KLV9mdW5jX2V4aXRfOwogfQogCiAjZGVmaW5lIExQU19MRUFWRV9USU1FT1VUX01TIDEwMApAQCAtNDQwLDggKzQyNyw2IEBACiB7CiAJc3RydWN0IHB3cmN0cmxfcHJpdgkqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7CiAKLV9mdW5jX2VudGVyXzsKLQogCWlmIChwd3Jwcml2LT5iTGVpc3VyZVBzKSB7CiAJCWlmIChwd3Jwcml2LT5wd3JfbW9kZSAhPSBQU19NT0RFX0FDVElWRSkgewogCQkJcnR3X3NldF9wc19tb2RlKHBhZGFwdGVyLCBQU19NT0RFX0FDVElWRSwgMCwgMCk7CkBAIC00NTIsOCArNDM3LDYgQEAKIAl9CiAKIAlwd3Jwcml2LT5icG93ZXJfc2F2aW5nID0gZmFsc2U7Ci0KLV9mdW5jX2V4aXRfOwogfQogCiAvKiAgKi8KQEAgLTQ2NSwyMyArNDQ4LDE3IEBACiAJc3RydWN0IG1sbWVfcHJpdgkqcG1sbWVwcml2ID0gJihBZGFwdGVyLT5tbG1lcHJpdik7CiAJdTgJZW5xdWV1ZSA9IDA7CiAKLV9mdW5jX2VudGVyXzsKLQogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsgLyogY29ubmVjdCAqLwogCQlwMnBfcHNfd2tfY21kKEFkYXB0ZXIsIFAyUF9QU19ESVNBQkxFLCBlbnF1ZXVlKTsKIAogCQlydHdfbHBzX2N0cmxfd2tfY21kKEFkYXB0ZXIsIExQU19DVFJMX0xFQVZFLCBlbnF1ZXVlKTsKIAl9Ci0KLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19pbml0X3B3cmN0cmxfcHJpdihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdyY3RybHByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwogCi1fZnVuY19lbnRlcl87Ci0KIAlfaW5pdF9wd3Jsb2NrKCZwd3JjdHJscHJpdi0+bG9jayk7CiAJcHdyY3RybHByaXYtPnJmX3B3cnN0YXRlID0gcmZfb247CiAJcHdyY3RybHByaXYtPmlwc19lbnRlcl9jbnRzID0gMDsKQEAgLTUxOCw4ICs0OTUsNiBAQAogCXB3cmN0cmxwcml2LT5idGNvZXhfcmZvbiA9IGZhbHNlOwogCiAJX2luaXRfdGltZXIoJihwd3JjdHJscHJpdi0+cHdyX3N0YXRlX2NoZWNrX3RpbWVyKSwgcGFkYXB0ZXItPnBuZXRkZXYsIHB3cl9zdGF0ZV9jaGVja19oYW5kbGVyLCAodTggKilwYWRhcHRlcik7Ci0KLV9mdW5jX2V4aXRfOwogfQogCiB1OCBydHdfaW50ZXJmYWNlX3BzX2Z1bmMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBlbnVtIGhhbF9pbnRmX3BzX2Z1bmMgZWZ1bmNfaWQsIHU4ICp2YWwpCkBAIC01NDAsNyArNTE1LDcgQEAKIC8qCiAqIHJ0d19wd3Jfd2FrZXVwIC0gV2FrZSB0aGUgTklDIHVwIGZyb206IDEpSVBTLiAyKVVTQiBhdXRvc3VzcGVuZAogKiBAYWRhcHRlcjogcG9pbnRlciB0byBzdHJ1Y3QgYWRhcHRlciBzdHJ1Y3R1cmUKLSogQGlwc19kZWZmZXJfbXM6IHRoZSBtcyB3aWlsIHByZXZlbnQgZnJvbSBmYWxsaW5nIGludG8gSVBTIGFmdGVyIHdha2V1cAorKiBAaXBzX2RlZmZlcl9tczogdGhlIG1zIHdpbGwgcHJldmVudCBmcm9tIGZhbGxpbmcgaW50byBJUFMgYWZ0ZXIgd2FrZXVwCiAqIFJldHVybiBfU1VDQ0VTUyBvciBfRkFJTAogKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19yZWN2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JlY3YuYwppbmRleCBjOWMxODA2Li42MzZlYzU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JlY3YuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JlY3YuYwpAQCAtMjMsMTEgKzIzLDEyIEBACiAjaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+CiAjaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgogI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KLSNpbmNsdWRlIDxpcC5oPgotI2luY2x1ZGUgPGlmX2V0aGVyLmg+Ci0jaW5jbHVkZSA8ZXRoZXJuZXQuaD4KICNpbmNsdWRlIDx1c2Jfb3BzLmg+CiAjaW5jbHVkZSA8d2lmaS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2RlZmluZSBFVEhFUk5FVF9IRUFERVJfU0laRQkxNAkvKiAgRXRoZXJuZXQgSGVhZGVyIExlbmd0aCAqLworI2RlZmluZSBMTENfSEVBREVSX1NJWkUJCQk2CS8qICBMTEMgSGVhZGVyIExlbmd0aCAqLwogCiBzdGF0aWMgdTggU05BUF9FVEhfVFlQRV9JUFhbMl0gPSB7MHg4MSwgMHgzN307CiBzdGF0aWMgdTggU05BUF9FVEhfVFlQRV9BUFBMRVRBTEtfQUFSUFsyXSA9IHsweDgwLCAweGYzfTsKQEAgLTQ1LDcgKzQ2LDYgQEAKIAogdm9pZCBfcnR3X2luaXRfc3RhX3JlY3ZfcHJpdihzdHJ1Y3Qgc3RhX3JlY3ZfcHJpdiAqcHN0YV9yZWN2cHJpdikKIHsKLV9mdW5jX2VudGVyXzsKIAogCV9ydHdfbWVtc2V0KCh1OCAqKXBzdGFfcmVjdnByaXYsIDAsIHNpemVvZiAoc3RydWN0IHN0YV9yZWN2X3ByaXYpKTsKIApAQCAtNTMsMTggKzUzLDE2IEBACiAKIAlfcnR3X2luaXRfcXVldWUoJnBzdGFfcmVjdnByaXYtPmRlZnJhZ19xKTsKIAotX2Z1bmNfZXhpdF87CiB9CiAKIGludCBfcnR3X2luaXRfcmVjdl9wcml2KHN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiwgc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewogCWludCBpOwogCi0JdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZTsKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZTsKIAogCWludAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCXNwaW5fbG9ja19pbml0KCZwcmVjdnByaXYtPmxvY2spOwogCiAJX3J0d19pbml0X3F1ZXVlKCZwcmVjdnByaXYtPmZyZWVfcmVjdl9xdWV1ZSk7CkBAIC03Nyw3ICs3NSw3IEBACiAKIAlydHdfb3NfcmVjdl9yZXNvdXJjZV9pbml0KHByZWN2cHJpdiwgcGFkYXB0ZXIpOwogCi0JcHJlY3Zwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZiA9IHJ0d196dm1hbGxvYyhOUl9SRUNWRlJBTUUgKiBzaXplb2YodW5pb24gcmVjdl9mcmFtZSkgKyBSWEZSQU1FX0FMSUdOX1NaKTsKKwlwcmVjdnByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmID0gdnphbGxvYyhOUl9SRUNWRlJBTUUgKiBzaXplb2Yoc3RydWN0IHJlY3ZfZnJhbWUpICsgUlhGUkFNRV9BTElHTl9TWik7CiAKIAlpZiAocHJlY3Zwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZiA9PSBOVUxMKSB7CiAJCXJlcyA9IF9GQUlMOwpAQCAtODYsMTggKzg0LDE5IEBACiAKIAlwcmVjdnByaXYtPnByZWN2X2ZyYW1lX2J1ZiA9ICh1OCAqKU5fQllURV9BTElHTUVOVCgoc2l6ZV90KShwcmVjdnByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmKSwgUlhGUkFNRV9BTElHTl9TWik7CiAKLQlwcmVjdmZyYW1lID0gKHVuaW9uIHJlY3ZfZnJhbWUgKilwcmVjdnByaXYtPnByZWN2X2ZyYW1lX2J1ZjsKKwlwcmVjdmZyYW1lID0gKHN0cnVjdCByZWN2X2ZyYW1lICopcHJlY3Zwcml2LT5wcmVjdl9mcmFtZV9idWY7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTlJfUkVDVkZSQU1FOyBpKyspIHsKLQkJX3J0d19pbml0X2xpc3RoZWFkKCYocHJlY3ZmcmFtZS0+dS5saXN0KSk7CisJCV9ydHdfaW5pdF9saXN0aGVhZCgmKHByZWN2ZnJhbWUtPmxpc3QpKTsKIAotCQlydHdfbGlzdF9pbnNlcnRfdGFpbCgmKHByZWN2ZnJhbWUtPnUubGlzdCksICYocHJlY3Zwcml2LT5mcmVlX3JlY3ZfcXVldWUucXVldWUpKTsKKwkJcnR3X2xpc3RfaW5zZXJ0X3RhaWwoJihwcmVjdmZyYW1lLT5saXN0KSwKKwkJCQkgICAgICYocHJlY3Zwcml2LT5mcmVlX3JlY3ZfcXVldWUucXVldWUpKTsKIAogCQlyZXMgPSBydHdfb3NfcmVjdl9yZXNvdXJjZV9hbGxvYyhwYWRhcHRlciwgcHJlY3ZmcmFtZSk7CiAKLQkJcHJlY3ZmcmFtZS0+dS5oZHIubGVuID0gMDsKKwkJcHJlY3ZmcmFtZS0+bGVuID0gMDsKIAotCQlwcmVjdmZyYW1lLT51Lmhkci5hZGFwdGVyID0gcGFkYXB0ZXI7CisJCXByZWN2ZnJhbWUtPmFkYXB0ZXIgPSBwYWRhcHRlcjsKIAkJcHJlY3ZmcmFtZSsrOwogCX0KIAlwcmVjdnByaXYtPnJ4X3BlbmRpbmdfY250ID0gMTsKQEAgLTExMyw3ICsxMTIsNiBAQAogCXJ0d19zZXRfc2lnbmFsX3N0YXRfdGltZXIocHJlY3Zwcml2KTsKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTEyMiw0MCArMTIwLDM3IEBACiB7CiAJc3RydWN0IGFkYXB0ZXIJKnBhZGFwdGVyID0gcHJlY3Zwcml2LT5hZGFwdGVyOwogCi1fZnVuY19lbnRlcl87CiAKIAlydHdfZnJlZV91Y19zd2RlY19wZW5kaW5nX3F1ZXVlKHBhZGFwdGVyKTsKIAogCXJ0d19vc19yZWN2X3Jlc291cmNlX2ZyZWUocHJlY3Zwcml2KTsKIAogCWlmIChwcmVjdnByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmKSB7Ci0JCXJ0d192bWZyZWUocHJlY3Zwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZiwgTlJfUkVDVkZSQU1FICogc2l6ZW9mKHVuaW9uIHJlY3ZfZnJhbWUpICsgUlhGUkFNRV9BTElHTl9TWik7CisJCXZmcmVlKHByZWN2cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYpOwogCX0KIAogCXJ0d19oYWxfZnJlZV9yZWN2X3ByaXYocGFkYXB0ZXIpOwogCi1fZnVuY19leGl0XzsKIH0KIAotdW5pb24gcmVjdl9mcmFtZSAqX3J0d19hbGxvY19yZWN2ZnJhbWUgKHN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlKQorc3RydWN0IHJlY3ZfZnJhbWUgKl9ydHdfYWxsb2NfcmVjdmZyYW1lIChzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSkKIHsKLQl1bmlvbiByZWN2X2ZyYW1lICAqcHJlY3ZmcmFtZTsKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAqaGRyOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0LCAqcGhlYWQ7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyOwogCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdjsKLV9mdW5jX2VudGVyXzsKIAogCWlmIChfcnR3X3F1ZXVlX2VtcHR5KHBmcmVlX3JlY3ZfcXVldWUpKSB7Ci0JCXByZWN2ZnJhbWUgPSBOVUxMOworCQloZHIgPSBOVUxMOwogCX0gZWxzZSB7CiAJCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZnJlZV9yZWN2X3F1ZXVlKTsKIAotCQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwkJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAotCQlwcmVjdmZyYW1lID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHVuaW9uIHJlY3ZfZnJhbWUsIHUpOworCQloZHIgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCByZWN2X2ZyYW1lLCBsaXN0KTsKIAotCQlydHdfbGlzdF9kZWxldGUoJnByZWN2ZnJhbWUtPnUuaGRyLmxpc3QpOwotCQlwYWRhcHRlciA9IHByZWN2ZnJhbWUtPnUuaGRyLmFkYXB0ZXI7CisJCXJ0d19saXN0X2RlbGV0ZSgmaGRyLT5saXN0KTsKKwkJcGFkYXB0ZXIgPSBoZHItPmFkYXB0ZXI7CiAJCWlmIChwYWRhcHRlciAhPSBOVUxMKSB7CiAJCQlwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwogCQkJaWYgKHBmcmVlX3JlY3ZfcXVldWUgPT0gJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3F1ZXVlKQpAQCAtMTYzLDE0ICsxNTgsMTMgQEAKIAkJfQogCX0KIAotX2Z1bmNfZXhpdF87CiAKLQlyZXR1cm4gcHJlY3ZmcmFtZTsKKwlyZXR1cm4gKHN0cnVjdCByZWN2X2ZyYW1lICopaGRyOwogfQogCi11bmlvbiByZWN2X2ZyYW1lICpydHdfYWxsb2NfcmVjdmZyYW1lIChzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSkKK3N0cnVjdCByZWN2X2ZyYW1lICpydHdfYWxsb2NfcmVjdmZyYW1lKHN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlKQogewotCXVuaW9uIHJlY3ZfZnJhbWUgICpwcmVjdmZyYW1lOworCXN0cnVjdCByZWN2X2ZyYW1lICAqcHJlY3ZmcmFtZTsKIAogCXNwaW5fbG9ja19iaCgmcGZyZWVfcmVjdl9xdWV1ZS0+bG9jayk7CiAKQEAgLTE4MSwzNiArMTc1LDM2IEBACiAJcmV0dXJuIHByZWN2ZnJhbWU7CiB9CiAKLXZvaWQgcnR3X2luaXRfcmVjdmZyYW1lKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIHN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdikKK3ZvaWQgcnR3X2luaXRfcmVjdmZyYW1lKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYpCiB7CiAJLyogUGVycnk6IFRoaXMgY2FuIGJlIHJlbW92ZWQgKi8KLQlfcnR3X2luaXRfbGlzdGhlYWQoJnByZWN2ZnJhbWUtPnUuaGRyLmxpc3QpOworCV9ydHdfaW5pdF9saXN0aGVhZCgmcHJlY3ZmcmFtZS0+bGlzdCk7CiAKLQlwcmVjdmZyYW1lLT51Lmhkci5sZW4gPSAwOworCXByZWN2ZnJhbWUtPmxlbiA9IDA7CiB9CiAKLWludCBydHdfZnJlZV9yZWN2ZnJhbWUodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUpCitpbnQgcnR3X2ZyZWVfcmVjdmZyYW1lKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLAorCQkgICAgICAgc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUpCiB7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyOwogCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdjsKIAotX2Z1bmNfZW50ZXJfOwogCWlmICghcHJlY3ZmcmFtZSkKIAkJcmV0dXJuIF9GQUlMOwotCXBhZGFwdGVyID0gcHJlY3ZmcmFtZS0+dS5oZHIuYWRhcHRlcjsKKwlwYWRhcHRlciA9IHByZWN2ZnJhbWUtPmFkYXB0ZXI7CiAJcHJlY3Zwcml2ID0gJnBhZGFwdGVyLT5yZWN2cHJpdjsKLQlpZiAocHJlY3ZmcmFtZS0+dS5oZHIucGt0KSB7Ci0JCWRldl9rZnJlZV9za2JfYW55KHByZWN2ZnJhbWUtPnUuaGRyLnBrdCk7LyogZnJlZSBza2IgYnkgZHJpdmVyICovCi0JCXByZWN2ZnJhbWUtPnUuaGRyLnBrdCA9IE5VTEw7CisJaWYgKHByZWN2ZnJhbWUtPnBrdCkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShwcmVjdmZyYW1lLT5wa3QpOy8qIGZyZWUgc2tiIGJ5IGRyaXZlciAqLworCQlwcmVjdmZyYW1lLT5wa3QgPSBOVUxMOwogCX0KIAogCXNwaW5fbG9ja19iaCgmcGZyZWVfcmVjdl9xdWV1ZS0+bG9jayk7CiAKLQlydHdfbGlzdF9kZWxldGUoJihwcmVjdmZyYW1lLT51Lmhkci5saXN0KSk7CisJcnR3X2xpc3RfZGVsZXRlKCYocHJlY3ZmcmFtZS0+bGlzdCkpOwogCi0JcHJlY3ZmcmFtZS0+dS5oZHIubGVuID0gMDsKKwlwcmVjdmZyYW1lLT5sZW4gPSAwOwogCi0JcnR3X2xpc3RfaW5zZXJ0X3RhaWwoJihwcmVjdmZyYW1lLT51Lmhkci5saXN0KSwgZ2V0X2xpc3RfaGVhZChwZnJlZV9yZWN2X3F1ZXVlKSk7CisJcnR3X2xpc3RfaW5zZXJ0X3RhaWwoJihwcmVjdmZyYW1lLT5saXN0KSwgZ2V0X2xpc3RfaGVhZChwZnJlZV9yZWN2X3F1ZXVlKSk7CiAKIAlpZiAocGFkYXB0ZXIgIT0gTlVMTCkgewogCQlpZiAocGZyZWVfcmVjdl9xdWV1ZSA9PSAmcHJlY3Zwcml2LT5mcmVlX3JlY3ZfcXVldWUpCkBAIC0yMTksMzIgKzIxMywyOSBAQAogCiAgICAgICBzcGluX3VubG9ja19iaCgmcGZyZWVfcmVjdl9xdWV1ZS0+bG9jayk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi1pbnQgX3J0d19lbnF1ZXVlX3JlY3ZmcmFtZSh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBzdHJ1Y3QgX19xdWV1ZSAqcXVldWUpCitpbnQgX3J0d19lbnF1ZXVlX3JlY3ZmcmFtZShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgc3RydWN0IF9fcXVldWUgKnF1ZXVlKQogewotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IHByZWN2ZnJhbWUtPnUuaGRyLmFkYXB0ZXI7CisJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gcHJlY3ZmcmFtZS0+YWRhcHRlcjsKIAlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwogCi1fZnVuY19lbnRlcl87CiAKLQlydHdfbGlzdF9kZWxldGUoJihwcmVjdmZyYW1lLT51Lmhkci5saXN0KSk7Ci0JcnR3X2xpc3RfaW5zZXJ0X3RhaWwoJihwcmVjdmZyYW1lLT51Lmhkci5saXN0KSwgZ2V0X2xpc3RfaGVhZChxdWV1ZSkpOworCXJ0d19saXN0X2RlbGV0ZSgmKHByZWN2ZnJhbWUtPmxpc3QpKTsKKwlydHdfbGlzdF9pbnNlcnRfdGFpbCgmKHByZWN2ZnJhbWUtPmxpc3QpLCBnZXRfbGlzdF9oZWFkKHF1ZXVlKSk7CiAKIAlpZiAocGFkYXB0ZXIgIT0gTlVMTCkgewogCQlpZiAocXVldWUgPT0gJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3F1ZXVlKQogCQkJcHJlY3Zwcml2LT5mcmVlX3JlY3ZmcmFtZV9jbnQrKzsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi1pbnQgcnR3X2VucXVldWVfcmVjdmZyYW1lKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIHN0cnVjdCBfX3F1ZXVlICpxdWV1ZSkKK2ludCBydHdfZW5xdWV1ZV9yZWN2ZnJhbWUoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIHN0cnVjdCBfX3F1ZXVlICpxdWV1ZSkKIHsKIAlpbnQgcmV0OwogCkBAIC0yNjUsMzIgKzI1NiwzMCBAQAogCiB2b2lkIHJ0d19mcmVlX3JlY3ZmcmFtZV9xdWV1ZShzdHJ1Y3QgX19xdWV1ZSAqcGZyYW1lcXVldWUsICBzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSkKIHsKLQl1bmlvbglyZWN2X2ZyYW1lCSpwcmVjdmZyYW1lOworCXN0cnVjdCByZWN2X2ZyYW1lICpoZHI7CiAJc3RydWN0IGxpc3RfaGVhZCAqcGxpc3QsICpwaGVhZDsKIAotX2Z1bmNfZW50ZXJfOwogCXNwaW5fbG9jaygmcGZyYW1lcXVldWUtPmxvY2spOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBmcmFtZXF1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkgPT0gZmFsc2UpIHsKLQkJcHJlY3ZmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCB1bmlvbiByZWN2X2ZyYW1lLCB1KTsKKwkJaGRyID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcmVjdl9mcmFtZSwgbGlzdCk7CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKLQkJcnR3X2ZyZWVfcmVjdmZyYW1lKHByZWN2ZnJhbWUsIHBmcmVlX3JlY3ZfcXVldWUpOworCQlydHdfZnJlZV9yZWN2ZnJhbWUoKHN0cnVjdCByZWN2X2ZyYW1lICopaGRyLCBwZnJlZV9yZWN2X3F1ZXVlKTsKIAl9CiAKIAlzcGluX3VubG9jaygmcGZyYW1lcXVldWUtPmxvY2spOwogCi1fZnVuY19leGl0XzsKIH0KIAogdTMyIHJ0d19mcmVlX3VjX3N3ZGVjX3BlbmRpbmdfcXVldWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJdTMyIGNudCA9IDA7Ci0JdW5pb24gcmVjdl9mcmFtZSAqcGVuZGluZ19mcmFtZTsKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAqcGVuZGluZ19mcmFtZTsKIAl3aGlsZSAoKHBlbmRpbmdfZnJhbWUgPSBydHdfYWxsb2NfcmVjdmZyYW1lKCZhZGFwdGVyLT5yZWN2cHJpdi51Y19zd2RlY19wZW5kaW5nX3F1ZXVlKSkpIHsKIAkJcnR3X2ZyZWVfcmVjdmZyYW1lKHBlbmRpbmdfZnJhbWUsICZhZGFwdGVyLT5yZWN2cHJpdi5mcmVlX3JlY3ZfcXVldWUpOwogCQlEQkdfODhFKCIlczogZGVxdWV1ZSB1Y19zd2RlY19wZW5kaW5nX3F1ZXVlXG4iLCBfX2Z1bmNfXyk7CkBAIC0zMzcsOSArMzI2LDkgQEAKIAl9IGVsc2UgewogCQlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwogCi0JCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCQlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCi0JCXByZWN2YnVmID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCByZWN2X2J1ZiwgbGlzdCk7CisJCXByZWN2YnVmID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcmVjdl9idWYsIGxpc3QpOwogCiAJCXJ0d19saXN0X2RlbGV0ZSgmcHJlY3ZidWYtPmxpc3QpOwogCX0KQEAgLTM0OSw3ICszMzgsOCBAQAogCXJldHVybiBwcmVjdmJ1ZjsKIH0KIAotc3RhdGljIGludCByZWN2ZnJhbWVfY2hrbWljKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKK3N0YXRpYyBpbnQgcmVjdmZyYW1lX2Noa21pYyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCSAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKIHsKIAlpbnQJaSwgcmVzID0gX1NVQ0NFU1M7CiAJdTMyCWRhdGFsZW47CkBAIC0zNTgsMTIgKzM0OCwxMSBAQAogCXU4CSpwZnJhbWUsICpwYXlsb2FkLCAqcGZyYW1lbWljOwogCXU4CSptaWNrZXk7CiAJc3RydWN0CXN0YV9pbmZvCQkqc3RhaW5mbzsKLQlzdHJ1Y3QJcnhfcGt0X2F0dHJpYgkqcHJ4YXR0cmliID0gJnByZWN2ZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwlzdHJ1Y3QJcnhfcGt0X2F0dHJpYgkqcHJ4YXR0cmliID0gJnByZWN2ZnJhbWUtPmF0dHJpYjsKIAlzdHJ1Y3QJc2VjdXJpdHlfcHJpdgkqcHNlY3VyaXR5cHJpdiA9ICZhZGFwdGVyLT5zZWN1cml0eXByaXY7CiAKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmYWRhcHRlci0+bWxtZWV4dHByaXY7CiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKLV9mdW5jX2VudGVyXzsKIAogCXN0YWluZm8gPSBydHdfZ2V0X3N0YWluZm8oJmFkYXB0ZXItPnN0YXByaXYsICZwcnhhdHRyaWItPnRhWzBdKTsKIApAQCAtMzc1LDIzICszNjQsMjQgQEAKIAkJLyogY2FsY3VsYXRlIG1pYyBjb2RlICovCiAJCWlmIChzdGFpbmZvICE9IE5VTEwpIHsKIAkJCWlmIChJU19NQ0FTVChwcnhhdHRyaWItPnJhKSkgewotCQkJCW1pY2tleSA9ICZwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwcnhtaWNrZXlbcHJ4YXR0cmliLT5rZXlfaW5kZXhdLnNrZXlbMF07Ci0KLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywgKCJcbiByZWN2ZnJhbWVfY2hrbWljOiBiY21jIGtleVxuIikpOwotCiAJCQkJaWYgKCFwc2VjdXJpdHlwcml2KSB7CiAJCQkJCXJlcyA9IF9GQUlMOwogCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLCAoIlxuIHJlY3ZmcmFtZV9jaGttaWM6ZGlkbid0IGluc3RhbGwgZ3JvdXAga2V5ISEhISEhISEhIVxuIikpOwogCQkJCQlEQkdfODhFKCJcbiByZWN2ZnJhbWVfY2hrbWljOmRpZG4ndCBpbnN0YWxsIGdyb3VwIGtleSEhISEhISEhISFcbiIpOwogCQkJCQlnb3RvIGV4aXQ7CiAJCQkJfQorCQkJCW1pY2tleSA9ICZwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwcnhtaWNrZXlbcHJ4YXR0cmliLT5rZXlfaW5kZXhdLnNrZXlbMF07CisKKwkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywgKCJcbiByZWN2ZnJhbWVfY2hrbWljOiBiY21jIGtleVxuIikpOwogCQkJfSBlbHNlIHsKIAkJCQltaWNrZXkgPSAmc3RhaW5mby0+ZG90MTF0a2lwcnhtaWNrZXkuc2tleVswXTsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLCAoIlxuIHJlY3ZmcmFtZV9jaGttaWM6IHVuaWNhc3Qga2V5XG4iKSk7CiAJCQl9CiAKLQkJCWRhdGFsZW4gPSBwcmVjdmZyYW1lLT51Lmhkci5sZW4tcHJ4YXR0cmliLT5oZHJsZW4tcHJ4YXR0cmliLT5pdl9sZW4tcHJ4YXR0cmliLT5pY3ZfbGVuLTg7LyogaWN2X2xlbiBpbmNsdWRlZCB0aGUgbWljIGNvZGUgKi8KLQkJCXBmcmFtZSA9IHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJCQkvKiBpY3ZfbGVuIGluY2x1ZGVkIHRoZSBtaWMgY29kZSAqLworCQkJZGF0YWxlbiA9IHByZWN2ZnJhbWUtPmxlbi1wcnhhdHRyaWItPmhkcmxlbiAtCisJCQkJICBwcnhhdHRyaWItPml2X2xlbi1wcnhhdHRyaWItPmljdl9sZW4tODsKKwkJCXBmcmFtZSA9IHByZWN2ZnJhbWUtPnJ4X2RhdGE7CiAJCQlwYXlsb2FkID0gcGZyYW1lK3ByeGF0dHJpYi0+aGRybGVuK3ByeGF0dHJpYi0+aXZfbGVuOwogCiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywgKCJcbiBwcnhhdHRyaWItPml2X2xlbj0lZCBwcnhhdHRyaWItPmljdl9sZW49JWRcbiIsIHByeGF0dHJpYi0+aXZfbGVuLCBwcnhhdHRyaWItPmljdl9sZW4pKTsKQEAgLTQyNCwxNiArNDE0LDMwIEBACiAJCQkJCSAqKHBmcmFtZW1pYy0xMCksICoocGZyYW1lbWljLTkpKSk7CiAJCQkJewogCQkJCQl1aW50IGk7Ci0JCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sICgiXG4gPT09PT09ZGVtcCBwYWNrZXQgKGxlbj0lZCk9PT09PT1cbiIsIHByZWN2ZnJhbWUtPnUuaGRyLmxlbikpOwotCQkJCQlmb3IgKGkgPSAwOyBpIDwgcHJlY3ZmcmFtZS0+dS5oZHIubGVuOyBpID0gaSs4KSB7Ci0JCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLCAoIjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMngiLAotCQkJCQkJCSAqKHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEraSksICoocHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YStpKzEpLAotCQkJCQkJCSAqKHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEraSsyKSwgKihwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhK2krMyksCi0JCQkJCQkJICoocHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YStpKzQpLCAqKHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEraSs1KSwKLQkJCQkJCQkgKihwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhK2krNiksICoocHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YStpKzcpKSk7CisJCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCisJCQkJCQkgKCJcbiA9PT09PT1kZW1wIHBhY2tldCAobGVuPSVkKT09PT09PVxuIiwKKwkJCQkJCSBwcmVjdmZyYW1lLT5sZW4pKTsKKwkJCQkJZm9yIChpID0gMDsgaSA8IHByZWN2ZnJhbWUtPmxlbjsgaSArPSA4KSB7CisJCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywKKwkJCQkJCQkgX2Rydl9lcnJfLAorCQkJCQkJCSAoIjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMngiLAorCQkJCQkJCSAqKHByZWN2ZnJhbWUtPnJ4X2RhdGEraSksCisJCQkJCQkJICoocHJlY3ZmcmFtZS0+cnhfZGF0YStpKzEpLAorCQkJCQkJCSAqKHByZWN2ZnJhbWUtPnJ4X2RhdGEraSsyKSwKKwkJCQkJCQkgKihwcmVjdmZyYW1lLT5yeF9kYXRhK2krMyksCisJCQkJCQkJICoocHJlY3ZmcmFtZS0+cnhfZGF0YStpKzQpLAorCQkJCQkJCSAqKHByZWN2ZnJhbWUtPnJ4X2RhdGEraSs1KSwKKwkJCQkJCQkgKihwcmVjdmZyYW1lLT5yeF9kYXRhK2krNiksCisJCQkJCQkJICoocHJlY3ZmcmFtZS0+cnhfZGF0YStpKzcpKSk7CiAJCQkJCX0KLQkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywgKCJcbiA9PT09PT0gZGVtcCBwYWNrZXQgZW5kIFtsZW49JWRdPT09PT09XG4iLCBwcmVjdmZyYW1lLT51Lmhkci5sZW4pKTsKLQkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywgKCJcbiBocmRsZW49JWQsXG4iLCBwcnhhdHRyaWItPmhkcmxlbikpOworCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywKKwkJCQkJCSBfZHJ2X2Vycl8sCisJCQkJCQkgKCJcbiA9PT09PT0gZGVtcCBwYWNrZXQgZW5kIFtsZW49JWRdPT09PT09XG4iLAorCQkJCQkJIHByZWN2ZnJhbWUtPmxlbikpOworCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywKKwkJCQkJCSBfZHJ2X2Vycl8sCisJCQkJCQkgKCJcbiBocmRsZW49JWQsXG4iLAorCQkJCQkJIHByeGF0dHJpYi0+aGRybGVuKSk7CiAJCQkJfQogCiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKQEAgLTQ3MSwyNCArNDc1LDIzIEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KIAogLyogZGVjcnlwdCBhbmQgc2V0IHRoZSBpdmxlbiwgaWN2bGVuIG9mIHRoZSByZWN2X2ZyYW1lICovCi1zdGF0aWMgdW5pb24gcmVjdl9mcmFtZSAqZGVjcnlwdG9yKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCitzdGF0aWMgc3RydWN0IHJlY3ZfZnJhbWUgKmRlY3J5cHRvcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCisJCQkJICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcHJ4YXR0cmliID0gJnByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWI7CisJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnByeGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+YXR0cmliOwogCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0JdW5pb24gcmVjdl9mcmFtZSAqcmV0dXJuX3BhY2tldCA9IHByZWN2X2ZyYW1lOworCXN0cnVjdCByZWN2X2ZyYW1lICpyZXR1cm5fcGFja2V0ID0gcHJlY3ZfZnJhbWU7CiAJdTMyCSByZXMgPSBfU1VDQ0VTUzsKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLCAoInByeHN0YXQtPmRlY3J5cHRlZD0leCBwcnhhdHRyaWItPmVuY3J5cHQ9MHglMDN4XG4iLCBwcnhhdHRyaWItPmJkZWNyeXB0ZWQsIHByeGF0dHJpYi0+ZW5jcnlwdCkpOwogCiAJaWYgKHByeGF0dHJpYi0+ZW5jcnlwdCA+IDApIHsKLQkJdTggKml2ID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGErcHJ4YXR0cmliLT5oZHJsZW47CisJCXU4ICppdiA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhK3ByeGF0dHJpYi0+aGRybGVuOwogCQlwcnhhdHRyaWItPmtleV9pbmRleCA9ICgoKGl2WzNdKT4+NikmMHgzKTsKIAogCQlpZiAocHJ4YXR0cmliLT5rZXlfaW5kZXggPiBXRVBfS0VZUykgewpAQCAtNTM0LDM0ICs1MzcsMzMgQEAKIAkJcmV0dXJuX3BhY2tldCA9IE5VTEw7CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXR1cm5fcGFja2V0OwogfQogCiAvKiBzZXQgdGhlIHNlY3VyaXR5IGluZm9ybWF0aW9uIGluIHRoZSByZWN2X2ZyYW1lICovCi1zdGF0aWMgdW5pb24gcmVjdl9mcmFtZSAqcG9ydGN0cmwoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQorc3RhdGljIHN0cnVjdCByZWN2X2ZyYW1lICpwb3J0Y3RybChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJdTggICAqcHN0YV9hZGRyID0gTlVMTCwgKnB0cjsKIAl1aW50ICBhdXRoX2FsZzsKLQlzdHJ1Y3QgcmVjdl9mcmFtZV9oZHIgKnBmaGRyOworCXN0cnVjdCByZWN2X2ZyYW1lICpwZmhkcjsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7CiAJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdjsKLQl1bmlvbiByZWN2X2ZyYW1lICpwcnRuZnJhbWU7CisJc3RydWN0IHJlY3ZfZnJhbWUgKnBydG5mcmFtZTsKIAl1MTYJZXRoZXJfdHlwZSA9IDA7CiAJdTE2ICBlYXBvbF90eXBlID0gMHg4ODhlOy8qIGZvciBGdW5pYSBCRCdzIFdQQSBpc3N1ZSAqLwogCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliOwogCV9fYmUxNiBiZV90bXA7CiAKLV9mdW5jX2VudGVyXzsKIAogCXBzdGFwcml2ID0gJmFkYXB0ZXItPnN0YXByaXY7CiAJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbyhwc3RhcHJpdiwgcHN0YV9hZGRyKTsKIAogCWF1dGhfYWxnID0gYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExQXV0aEFsZ3J0aG07CiAKLQlwdHIgPSBnZXRfcmVjdmZyYW1lX2RhdGEocHJlY3ZfZnJhbWUpOwotCXBmaGRyID0gJnByZWN2X2ZyYW1lLT51LmhkcjsKKwlwdHIgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKKwlwZmhkciA9IHByZWN2X2ZyYW1lOwogCXBhdHRyaWIgPSAmcGZoZHItPmF0dHJpYjsKIAlwc3RhX2FkZHIgPSBwYXR0cmliLT50YTsKIApAQCAtNTkzLDcgKzU5NSw5IEBACiAJCQkvKiBhbGxvd2VkICovCiAJCQkvKiBjaGVjayBkZWNyeXB0aW9uIHN0YXR1cywgYW5kIGRlY3J5cHQgdGhlIGZyYW1lIGlmIG5lZWRlZCAqLwogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sICgiIyMjIyMjIyNwb3J0Y3RybDpwc3RhLT5pZWVlODAyMXhfYmxvY2tlZD09MFxuIikpOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sICgicG9ydGN0cmw6cHJlY3ZfZnJhbWUtPmhkci5hdHRyaWIucHJpdmFjeT0leFxuIiwgcHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYi5wcml2YWN5KSk7CisJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKKwkJCQkgKCJwb3J0Y3RybDpwcmVjdl9mcmFtZS0+aGRyLmF0dHJpYi5wcml2YWN5PSV4XG4iLAorCQkJCSBwcmVjdl9mcmFtZS0+YXR0cmliLnByaXZhY3kpKTsKIAogCQkJaWYgKHBhdHRyaWItPmJkZWNyeXB0ZWQgPT0gMCkKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywgKCJwb3J0Y3RybDpwcnhzdGF0LT5kZWNyeXB0ZWQ9JXhcbiIsIHBhdHRyaWItPmJkZWNyeXB0ZWQpKTsKQEAgLTYxMywxOSArNjE3LDE4IEBACiAJCXBydG5mcmFtZSA9IHByZWN2X2ZyYW1lOwogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAkJcmV0dXJuIHBydG5mcmFtZTsKIH0KIAotc3RhdGljIGludCByZWN2X2RlY2FjaGUodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsIHU4IGJyZXRyeSwgc3RydWN0IHN0YWluZm9fcnhjYWNoZSAqcHJ4Y2FjaGUpCitzdGF0aWMgaW50IHJlY3ZfZGVjYWNoZShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsIHU4IGJyZXRyeSwKKwkJCXN0cnVjdCBzdGFpbmZvX3J4Y2FjaGUgKnByeGNhY2hlKQogewotCWludCB0aWQgPSBwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliLnByaW9yaXR5OworCWludCB0aWQgPSBwcmVjdl9mcmFtZS0+YXR0cmliLnByaW9yaXR5OwogCi0JdTE2IHNlcV9jdHJsID0gKChwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliLnNlcV9udW0mMHhmZmZmKSA8PCA0KSB8Ci0JCShwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliLmZyYWdfbnVtICYgMHhmKTsKKwl1MTYgc2VxX2N0cmwgPSAoKHByZWN2X2ZyYW1lLT5hdHRyaWIuc2VxX251bSYweGZmZmYpIDw8IDQpIHwKKwkJKHByZWN2X2ZyYW1lLT5hdHRyaWIuZnJhZ19udW0gJiAweGYpOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAodGlkID4gMTUpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfbm90aWNlXywgKCJyZWN2X2RlY2FjaGUsICh0aWQ+MTUpISBzZXFfY3RybD0weCV4LCB0aWQ9MHgleFxuIiwgc2VxX2N0cmwsIHRpZCkpOwpAQCAtNjQzLDE4ICs2NDYsMTcgQEAKIAogCXByeGNhY2hlLT50aWRfcnhzZXFbdGlkXSA9IHNlcV9jdHJsOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotdm9pZCBwcm9jZXNzX3B3cmJpdF9kYXRhKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotdm9pZCBwcm9jZXNzX3B3cmJpdF9kYXRhKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit2b2lkIHByb2Nlc3NfcHdyYml0X2RhdGEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAorCQkJIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKICNpZmRlZiBDT05GSUdfODhFVV9BUF9NT0RFCiAJdW5zaWduZWQgY2hhciBwd3JiaXQ7Ci0JdTggKnB0ciA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWI7CisJdTggKnB0ciA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOworCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT5hdHRyaWI7CiAJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwogCkBAIC02NzUsMTAgKzY3NywxMSBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyB2b2lkIHByb2Nlc3Nfd21tcHNfZGF0YShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQorc3RhdGljIHZvaWQgcHJvY2Vzc193bW1wc19kYXRhKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKKwkJCSAgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAjaWZkZWYgQ09ORklHXzg4RVVfQVBfTU9ERQotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWI7CisJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPmF0dHJpYjsKIAlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7CiAKQEAgLTczMCwxNSArNzMzLDE3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQgY291bnRfcnhfc3RhdHMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmZyYW1lLCBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKK3N0YXRpYyB2b2lkIGNvdW50X3J4X3N0YXRzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKKwkJCSAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lLAorCQkJICAgc3RydWN0IHN0YV9pbmZvICpzdGEpCiB7CiAJaW50CXN6OwogCXN0cnVjdCBzdGFfaW5mbwkJKnBzdGEgPSBOVUxMOwogCXN0cnVjdCBzdGFpbmZvX3N0YXRzCSpwc3RhdHMgPSBOVUxMOwotCXN0cnVjdCByeF9wa3RfYXR0cmliCSpwYXR0cmliID0gJnByZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwlzdHJ1Y3QgcnhfcGt0X2F0dHJpYgkqcGF0dHJpYiA9ICZwcmZyYW1lLT5hdHRyaWI7CiAJc3RydWN0IHJlY3ZfcHJpdgkqcHJlY3Zwcml2ID0gJnBhZGFwdGVyLT5yZWN2cHJpdjsKIAotCXN6ID0gZ2V0X3JlY3ZmcmFtZV9sZW4ocHJmcmFtZSk7CisJc3ogPSBwcmZyYW1lLT5sZW47CiAJcHJlY3Zwcml2LT5yeF9ieXRlcyArPSBzejsKIAogCXBhZGFwdGVyLT5tbG1lcHJpdi5MaW5rRGV0ZWN0SW5mby5OdW1SeE9rSW5QZXJpb2QrKzsKQEAgLTc0OSw3ICs3NTQsNyBAQAogCWlmIChzdGEpCiAJCXBzdGEgPSBzdGE7CiAJZWxzZQotCQlwc3RhID0gcHJmcmFtZS0+dS5oZHIucHN0YTsKKwkJcHN0YSA9IHByZnJhbWUtPnBzdGE7CiAKIAlpZiAocHN0YSkgewogCQlwc3RhdHMgPSAmcHN0YS0+c3RhX3N0YXRzOwpAQCAtNzYxLDE1ICs3NjYsMTYgQEAKIAogaW50IHN0YTJzdGFfZGF0YV9mcmFtZSgKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKLQl1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsCiAJc3RydWN0IHN0YV9pbmZvICoqcHN0YQogKTsKIAotaW50IHN0YTJzdGFfZGF0YV9mcmFtZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsIHN0cnVjdCBzdGFfaW5mbyAqKnBzdGEpCitpbnQgc3RhMnN0YV9kYXRhX2ZyYW1lKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsCisJCSAgICAgICBzdHJ1Y3Qgc3RhX2luZm8gKipwc3RhKQogewotCXU4ICpwdHIgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKKwl1OCAqcHRyID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CiAJaW50IHJldCA9IF9TVUNDRVNTOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWI7CisJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPmF0dHJpYjsKIAlzdHJ1Y3QJc3RhX3ByaXYgKnBzdGFwcml2ID0gJmFkYXB0ZXItPnN0YXByaXY7CiAJc3RydWN0CW1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwogCXU4ICpteWJzc2lkICA9IGdldF9ic3NpZChwbWxtZXByaXYpOwpAQCAtNzc3LDI1ICs3ODMsMjQgQEAKIAl1OCAqc3RhX2FkZHIgPSBOVUxMOwogCWludCBibWNhc3QgPSBJU19NQ0FTVChwYXR0cmliLT5kc3QpOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAoKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSA9PSB0cnVlKSB8fAogCSAgICAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSA9PSB0cnVlKSkgewogCQkvKiAgZmlsdGVyIHBhY2tldHMgdGhhdCBTQSBpcyBteXNlbGYgb3IgbXVsdGljYXN0IG9yIGJyb2FkY2FzdCAqLwotCQlpZiAoX3J0d19tZW1jbXAobXlod2FkZHIsIHBhdHRyaWItPnNyYywgRVRIX0FMRU4pKSB7CisJCWlmICghbWVtY21wKG15aHdhZGRyLCBwYXR0cmliLT5zcmMsIEVUSF9BTEVOKSkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywgKCIgU0E9PW15c2VsZlxuIikpOwogCQkJcmV0ID0gX0ZBSUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAotCQlpZiAoKCFfcnR3X21lbWNtcChteWh3YWRkciwgcGF0dHJpYi0+ZHN0LCBFVEhfQUxFTikpCSYmICghYm1jYXN0KSkgeworCQlpZiAoKG1lbWNtcChteWh3YWRkciwgcGF0dHJpYi0+ZHN0LCBFVEhfQUxFTikpICYmICghYm1jYXN0KSkgewogCQkJcmV0ID0gX0ZBSUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAotCQlpZiAoX3J0d19tZW1jbXAocGF0dHJpYi0+YnNzaWQsICJceDBceDBceDBceDBceDBceDAiLCBFVEhfQUxFTikgfHwKLQkJICAgIF9ydHdfbWVtY21wKG15YnNzaWQsICJceDBceDBceDBceDBceDBceDAiLCBFVEhfQUxFTikgfHwKLQkJICAgICFfcnR3X21lbWNtcChwYXR0cmliLT5ic3NpZCwgbXlic3NpZCwgRVRIX0FMRU4pKSB7CisJCWlmICghbWVtY21wKHBhdHRyaWItPmJzc2lkLCAiXHgwXHgwXHgwXHgwXHgwXHgwIiwgRVRIX0FMRU4pIHx8CisJCSAgICAhbWVtY21wKG15YnNzaWQsICJceDBceDBceDBceDBceDBceDAiLCBFVEhfQUxFTikgfHwKKwkJICAgIG1lbWNtcChwYXR0cmliLT5ic3NpZCwgbXlic3NpZCwgRVRIX0FMRU4pKSB7CiAJCQlyZXQgPSBfRkFJTDsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtODAzLDcgKzgwOCw3IEBACiAJCXN0YV9hZGRyID0gcGF0dHJpYi0+c3JjOwogCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpIHsKIAkJLyogIEZvciBTdGF0aW9uIG1vZGUsIHNhIGFuZCBic3NpZCBzaG91bGQgYWx3YXlzIGJlIEJTU0lELCBhbmQgREEgaXMgbXkgbWFjLWFkZHJlc3MgKi8KLQkJaWYgKCFfcnR3X21lbWNtcChwYXR0cmliLT5ic3NpZCwgcGF0dHJpYi0+c3JjLCBFVEhfQUxFTikpIHsKKwkJaWYgKG1lbWNtcChwYXR0cmliLT5ic3NpZCwgcGF0dHJpYi0+c3JjLCBFVEhfQUxFTikpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sICgiYnNzaWQhPVRBIHVuZGVyIFNUQVRJT05fTU9ERTsgZHJvcCBwa3RcbiIpKTsKIAkJCXJldCA9IF9GQUlMOwogCQkJZ290byBleGl0OwpAQCAtODE4LDcgKzgyMyw3IEBACiAJCQl9CiAJCX0gZWxzZSB7IC8qICBub3QgbWMtZnJhbWUgKi8KIAkJCS8qICBGb3IgQVAgbW9kZSwgaWYgREEgaXMgbm9uLU1DQVNULCB0aGVuIGl0IG11c3QgYmUgQlNTSUQsIGFuZCBic3NpZCA9PSBCU1NJRCAqLwotCQkJaWYgKCFfcnR3X21lbWNtcChwYXR0cmliLT5ic3NpZCwgcGF0dHJpYi0+ZHN0LCBFVEhfQUxFTikpIHsKKwkJCWlmIChtZW1jbXAocGF0dHJpYi0+YnNzaWQsIHBhdHRyaWItPmRzdCwgRVRIX0FMRU4pKSB7CiAJCQkJcmV0ID0gX0ZBSUw7CiAJCQkJZ290byBleGl0OwogCQkJfQpAQCAtODUzLDE3ICs4NTgsMTYgQEAKIAl9CiAKIGV4aXQ6Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGFwMnN0YV9kYXRhX2ZyYW1lICgKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKLQl1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsCiAJc3RydWN0IHN0YV9pbmZvICoqcHN0YSkKIHsKLQl1OCAqcHRyID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwl1OCAqcHRyID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CisJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPmF0dHJpYjsKIAlpbnQgcmV0ID0gX1NVQ0NFU1M7CiAJc3RydWN0CXN0YV9wcml2ICpwc3RhcHJpdiA9ICZhZGFwdGVyLT5zdGFwcml2OwogCXN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKQEAgLTg3MSwyMCArODc1LDE5IEBACiAJdTggKm15aHdhZGRyID0gbXlpZCgmYWRhcHRlci0+ZWVwcm9tcHJpdik7CiAJaW50IGJtY2FzdCA9IElTX01DQVNUKHBhdHRyaWItPmRzdCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmICgoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkgPT0gdHJ1ZSkgJiYKIAkgICAgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSA9PSB0cnVlIHx8CiAJICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORykpKSB7CiAJCS8qICBmaWx0ZXIgcGFja2V0cyB0aGF0IFNBIGlzIG15c2VsZiBvciBtdWx0aWNhc3Qgb3IgYnJvYWRjYXN0ICovCi0JCWlmIChfcnR3X21lbWNtcChteWh3YWRkciwgcGF0dHJpYi0+c3JjLCBFVEhfQUxFTikpIHsKKwkJaWYgKCFtZW1jbXAobXlod2FkZHIsIHBhdHRyaWItPnNyYywgRVRIX0FMRU4pKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLCAoIiBTQT09bXlzZWxmXG4iKSk7CiAJCQlyZXQgPSBfRkFJTDsKIAkJCWdvdG8gZXhpdDsKIAkJfQogCiAJCS8qICBkYSBzaG91bGQgYmUgZm9yIG1lICovCi0JCWlmICgoIV9ydHdfbWVtY21wKG15aHdhZGRyLCBwYXR0cmliLT5kc3QsIEVUSF9BTEVOKSkgJiYgKCFibWNhc3QpKSB7CisJCWlmICgobWVtY21wKG15aHdhZGRyLCBwYXR0cmliLT5kc3QsIEVUSF9BTEVOKSkgJiYgKCFibWNhc3QpKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKIAkJCQkgKCIgYXAyc3RhX2RhdGFfZnJhbWU6ICBjb21wYXJlIERBIGZhaWw7IERBPSVwTVxuIiwgKHBhdHRyaWItPmRzdCkpKTsKIAkJCXJldCA9IF9GQUlMOwpAQCAtODkyLDkgKzg5NSw5IEBACiAJCX0KIAogCQkvKiAgY2hlY2sgQlNTSUQgKi8KLQkJaWYgKF9ydHdfbWVtY21wKHBhdHRyaWItPmJzc2lkLCAiXHgwXHgwXHgwXHgwXHgwXHgwIiwgRVRIX0FMRU4pIHx8Ci0JCSAgICBfcnR3X21lbWNtcChteWJzc2lkLCAiXHgwXHgwXHgwXHgwXHgwXHgwIiwgRVRIX0FMRU4pIHx8Ci0JCSAgICAgKCFfcnR3X21lbWNtcChwYXR0cmliLT5ic3NpZCwgbXlic3NpZCwgRVRIX0FMRU4pKSkgeworCQlpZiAoIW1lbWNtcChwYXR0cmliLT5ic3NpZCwgIlx4MFx4MFx4MFx4MFx4MFx4MCIsIEVUSF9BTEVOKSB8fAorCQkgICAgIW1lbWNtcChteWJzc2lkLCAiXHgwXHgwXHgwXHgwXHgwXHgwIiwgRVRIX0FMRU4pIHx8CisJCSAgICAgKG1lbWNtcChwYXR0cmliLT5ic3NpZCwgbXlic3NpZCwgRVRIX0FMRU4pKSkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCiAJCQkJICgiIGFwMnN0YV9kYXRhX2ZyYW1lOiAgY29tcGFyZSBCU1NJRCBmYWlsIDsgQlNTSUQ9JXBNXG4iLCAocGF0dHJpYi0+YnNzaWQpKSk7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywgKCJteWJzc2lkPSVwTVxuIiwgKG15YnNzaWQpKSk7CkBAIC05NTAsNyArOTUzLDcgQEAKIAkJcmV0ID0gUlRXX1JYX0hBTkRMRUQ7CiAJCWdvdG8gZXhpdDsKIAl9IGVsc2UgewotCQlpZiAoX3J0d19tZW1jbXAobXlod2FkZHIsIHBhdHRyaWItPmRzdCwgRVRIX0FMRU4pICYmICghYm1jYXN0KSkgeworCQlpZiAoIW1lbWNtcChteWh3YWRkciwgcGF0dHJpYi0+ZHN0LCBFVEhfQUxFTikgJiYgKCFibWNhc3QpKSB7CiAJCQkqcHN0YSA9IHJ0d19nZXRfc3RhaW5mbyhwc3RhcHJpdiwgcGF0dHJpYi0+YnNzaWQpOyAvKiAgZ2V0IHN0YV9pbmZvICovCiAJCQlpZiAoKnBzdGEgPT0gTlVMTCkgewogCQkJCURCR184OEUoImlzc3VlX2RlYXV0aCB0byB0aGUgYXAgPSVwTSBmb3IgdGhlIHJlYXNvbig3KVxuIiwgKHBhdHRyaWItPmJzc2lkKSk7CkBAIC05NjQsMjcgKzk2NywyNSBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgc3RhMmFwX2RhdGFfZnJhbWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkgICAgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLAorCQkJICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsCiAJCQkgICAgIHN0cnVjdCBzdGFfaW5mbyAqKnBzdGEpCiB7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+YXR0cmliOwogCXN0cnVjdAlzdGFfcHJpdiAqcHN0YXByaXYgPSAmYWRhcHRlci0+c3RhcHJpdjsKIAlzdHJ1Y3QJbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0JdTggKnB0ciA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOworCXU4ICpwdHIgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKIAl1bnNpZ25lZCBjaGFyICpteWJzc2lkICA9IGdldF9ic3NpZChwbWxtZXByaXYpOwogCWludCByZXQgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSA9PSB0cnVlKSB7CiAJCS8qIEZvciBBUCBtb2RlLCBSQSA9IEJTU0lELCBUWCA9IFNUQShTUkNfQUREUiksIEEzID0gRFNUX0FERFIgKi8KLQkJaWYgKCFfcnR3X21lbWNtcChwYXR0cmliLT5ic3NpZCwgbXlic3NpZCwgRVRIX0FMRU4pKSB7CisJCWlmIChtZW1jbXAocGF0dHJpYi0+YnNzaWQsIG15YnNzaWQsIEVUSF9BTEVOKSkgewogCQkJcmV0ID0gX0ZBSUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTEwMTQsNyArMTAxNSw3IEBACiAJCX0KIAl9IGVsc2UgewogCQl1OCAqbXlod2FkZHIgPSBteWlkKCZhZGFwdGVyLT5lZXByb21wcml2KTsKLQkJaWYgKCFfcnR3X21lbWNtcChwYXR0cmliLT5yYSwgbXlod2FkZHIsIEVUSF9BTEVOKSkgeworCQlpZiAobWVtY21wKHBhdHRyaWItPnJhLCBteWh3YWRkciwgRVRIX0FMRU4pKSB7CiAJCQlyZXQgPSBSVFdfUlhfSEFORExFRDsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtMTAyNiwyNSArMTAyNywyMyBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgdmFsaWRhdGVfcmVjdl9jdHJsX2ZyYW1lKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCisJCQkJICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKICNpZmRlZiBDT05GSUdfODhFVV9BUF9NT0RFCi0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+YXR0cmliOwogCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOwotCS8qIHVpbnQgbGVuID0gcHJlY3ZfZnJhbWUtPnUuaGRyLmxlbjsgKi8KKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CiAKIAlpZiAoR2V0RnJhbWVUeXBlKHBmcmFtZSkgIT0gV0lGSV9DVFJMX1RZUEUpCiAJCXJldHVybiBfRkFJTDsKIAogCS8qIHJlY2VpdmUgdGhlIGZyYW1lcyB0aGF0IHJhKGExKSBpcyBteSBhZGRyZXNzICovCi0JaWYgKCFfcnR3X21lbWNtcChHZXRBZGRyMVB0cihwZnJhbWUpLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKSkKKwlpZiAobWVtY21wKEdldEFkZHIxUHRyKHBmcmFtZSksIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pKQogCQlyZXR1cm4gX0ZBSUw7CiAKIAkvKiBvbmx5IGhhbmRsZSBwcy1wb2xsICovCkBAIC0xMDk4LDEyICsxMDk3LDEyIEBACiAJCQlzcGluX2xvY2tfYmgoJnBzdGEtPnNsZWVwX3EubG9jayk7CiAKIAkJCXhtaXRmcmFtZV9waGVhZCA9IGdldF9saXN0X2hlYWQoJnBzdGEtPnNsZWVwX3EpOwotCQkJeG1pdGZyYW1lX3BsaXN0ID0gZ2V0X25leHQoeG1pdGZyYW1lX3BoZWFkKTsKKwkJCXhtaXRmcmFtZV9wbGlzdCA9IHhtaXRmcmFtZV9waGVhZC0+bmV4dDsKIAogCQkJaWYgKChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaCh4bWl0ZnJhbWVfcGhlYWQsIHhtaXRmcmFtZV9wbGlzdCkpID09IGZhbHNlKSB7Ci0JCQkJcHhtaXRmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHhtaXRmcmFtZV9wbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOworCQkJCXB4bWl0ZnJhbWUgPSBjb250YWluZXJfb2YoeG1pdGZyYW1lX3BsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CiAKLQkJCQl4bWl0ZnJhbWVfcGxpc3QgPSBnZXRfbmV4dCh4bWl0ZnJhbWVfcGxpc3QpOworCQkJCXhtaXRmcmFtZV9wbGlzdCA9IHhtaXRmcmFtZV9wbGlzdC0+bmV4dDsKIAogCQkJCXJ0d19saXN0X2RlbGV0ZSgmcHhtaXRmcmFtZS0+bGlzdCk7CiAKQEAgLTExMjQsNyArMTEyMyw3IEBACiAJCQkJaWYgKHBzdGEtPnNsZWVwcV9sZW4gPT0gMCkgewogCQkJCQlwc3RhcHJpdi0+dGltX2JpdG1hcCAmPSB+QklUKHBzdGEtPmFpZCk7CiAKLQkJCQkJLyogdXBhdGUgQkNOIGZvciBUSU0gSUUgKi8KKwkJCQkJLyogdXBkYXRlIEJDTiBmb3IgVElNIElFICovCiAJCQkJCS8qIHVwZGF0ZV9CQ05USU0ocGFkYXB0ZXIpOyAqLwogCQkJCQl1cGRhdGVfYmVhY29uKHBhZGFwdGVyLCBfVElNX0lFXywgTlVMTCwgZmFsc2UpOwogCQkJCX0KQEAgLTExNDIsNyArMTE0MSw3IEBACiAKIAkJCQkJcHN0YXByaXYtPnRpbV9iaXRtYXAgJj0gfkJJVChwc3RhLT5haWQpOwogCi0JCQkJCS8qIHVwYXRlIEJDTiBmb3IgVElNIElFICovCisJCQkJCS8qIHVwZGF0ZSBCQ04gZm9yIFRJTSBJRSAqLwogCQkJCQkvKiB1cGRhdGVfQkNOVElNKHBhZGFwdGVyKTsgKi8KIAkJCQkJdXBkYXRlX2JlYWNvbihwYWRhcHRlciwgX1RJTV9JRV8sIE5VTEwsIGZhbHNlKTsKIAkJCQl9CkBAIC0xMTU3LDEwICsxMTU2LDExIEBACiAJcmV0dXJuIF9GQUlMOwogfQogCi11bmlvbiByZWN2X2ZyYW1lICpyZWN2ZnJhbWVfY2hrX2RlZnJhZyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKK3N0cnVjdCByZWN2X2ZyYW1lICpyZWN2ZnJhbWVfY2hrX2RlZnJhZyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCisJCQkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiAKIHN0YXRpYyBpbnQgdmFsaWRhdGVfcmVjdl9tZ250X2ZyYW1lKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCisJCQkJICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7CiAKQEAgLTExNzMsMTggKzExNzMsMjAgQEAKIAl9CiAKIAkvKiBmb3IgcnggcGt0IHN0YXRpc3RpY3MgKi8KLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvKCZwYWRhcHRlci0+c3RhcHJpdiwgR2V0QWRkcjJQdHIocHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGEpKTsKKwlwc3RhID0gcnR3X2dldF9zdGFpbmZvKCZwYWRhcHRlci0+c3RhcHJpdiwKKwkJCSAgICAgICBHZXRBZGRyMlB0cihwcmVjdl9mcmFtZS0+cnhfZGF0YSkpOwogCWlmIChwc3RhKSB7CiAJCXBzdGEtPnN0YV9zdGF0cy5yeF9tZ250X3BrdHMrKzsKLQkJaWYgKEdldEZyYW1lU3ViVHlwZShwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YSkgPT0gV0lGSV9CRUFDT04pIHsKKwkJaWYgKEdldEZyYW1lU3ViVHlwZShwcmVjdl9mcmFtZS0+cnhfZGF0YSkgPT0gV0lGSV9CRUFDT04pIHsKIAkJCXBzdGEtPnN0YV9zdGF0cy5yeF9iZWFjb25fcGt0cysrOwotCQl9IGVsc2UgaWYgKEdldEZyYW1lU3ViVHlwZShwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YSkgPT0gV0lGSV9QUk9CRVJFUSkgeworCQl9IGVsc2UgaWYgKEdldEZyYW1lU3ViVHlwZShwcmVjdl9mcmFtZS0+cnhfZGF0YSkgPT0gV0lGSV9QUk9CRVJFUSkgewogCQkJcHN0YS0+c3RhX3N0YXRzLnJ4X3Byb2JlcmVxX3BrdHMrKzsKLQkJfSBlbHNlIGlmIChHZXRGcmFtZVN1YlR5cGUocHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGEpID09IFdJRklfUFJPQkVSU1ApIHsKLQkJCWlmIChfcnR3X21lbWNtcChwYWRhcHRlci0+ZWVwcm9tcHJpdi5tYWNfYWRkciwgR2V0QWRkcjFQdHIocHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGEpLCBFVEhfQUxFTikgPT0gdHJ1ZSkKKwkJfSBlbHNlIGlmIChHZXRGcmFtZVN1YlR5cGUocHJlY3ZfZnJhbWUtPnJ4X2RhdGEpID09IFdJRklfUFJPQkVSU1ApIHsKKwkJCWlmICghbWVtY21wKHBhZGFwdGVyLT5lZXByb21wcml2Lm1hY19hZGRyLAorCQkJCSAgICBHZXRBZGRyMVB0cihwcmVjdl9mcmFtZS0+cnhfZGF0YSksIEVUSF9BTEVOKSkKIAkJCQlwc3RhLT5zdGFfc3RhdHMucnhfcHJvYmVyc3BfcGt0cysrOwotCQkJZWxzZSBpZiAoaXNfYnJvYWRjYXN0X21hY19hZGRyKEdldEFkZHIxUHRyKHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhKSkgfHwKLQkJCQkgaXNfbXVsdGljYXN0X21hY19hZGRyKEdldEFkZHIxUHRyKHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhKSkpCisJCQllbHNlIGlmIChpc19icm9hZGNhc3RfbWFjX2FkZHIoR2V0QWRkcjFQdHIocHJlY3ZfZnJhbWUtPnJ4X2RhdGEpKSB8fAorCQkJCSBpc19tdWx0aWNhc3RfbWFjX2FkZHIoR2V0QWRkcjFQdHIocHJlY3ZfZnJhbWUtPnJ4X2RhdGEpKSkKIAkJCQlwc3RhLT5zdGFfc3RhdHMucnhfcHJvYmVyc3BfYm1fcGt0cysrOwogCQkJZWxzZQogCQkJCXBzdGEtPnN0YV9zdGF0cy5yeF9wcm9iZXJzcF91b19wa3RzKys7CkBAIC0xMTk3LDE3ICsxMTk5LDE2IEBACiB9CiAKIHN0YXRpYyBpbnQgdmFsaWRhdGVfcmVjdl9kYXRhX2ZyYW1lKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAotCQkJCSAgICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKKwkJCQkgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXU4IGJyZXRyeTsKIAl1OCAqcHNhLCAqcGRhLCAqcGJzc2lkOwogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7Ci0JdTggKnB0ciA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOwotCXN0cnVjdCByeF9wa3RfYXR0cmliCSpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWI7CisJdTggKnB0ciA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOworCXN0cnVjdCByeF9wa3RfYXR0cmliCSpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT5hdHRyaWI7CiAJc3RydWN0IHNlY3VyaXR5X3ByaXYJKnBzZWN1cml0eXByaXYgPSAmYWRhcHRlci0+c2VjdXJpdHlwcml2OwogCWludCByZXQgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJYnJldHJ5ID0gR2V0UmV0cnkocHRyKTsKIAlwZGEgPSBnZXRfZGEocHRyKTsKQEAgLTEyNjUsNyArMTI2Niw3IEBACiAKIAkvKiBwc3RhLT5yc3NpID0gcHJ4Y21kLT5yc3NpOyAqLwogCS8qIHBzdGEtPnNpZ25hbF9xdWFsaXR5ID0gcHJ4Y21kLT5zcTsgKi8KLQlwcmVjdl9mcmFtZS0+dS5oZHIucHN0YSA9IHBzdGE7CisJcHJlY3ZfZnJhbWUtPnBzdGEgPSBwc3RhOwogCiAJcGF0dHJpYi0+YW1zZHUgPSAwOwogCXBhdHRyaWItPmFja19wb2xpY3kgPSAwOwpAQCAtMTI4Niw3ICsxMjg3LDcgQEAKIAlpZiAocGF0dHJpYi0+b3JkZXIpLyogSFQtQ1RSTCAxMW4gKi8KIAkJcGF0dHJpYi0+aGRybGVuICs9IDQ7CiAKLQlwcmVjdl9mcmFtZS0+dS5oZHIucHJlb3JkZXJfY3RybCA9ICZwc3RhLT5yZWN2cmVvcmRlcl9jdHJsW3BhdHRyaWItPnByaW9yaXR5XTsKKwlwcmVjdl9mcmFtZS0+cHJlb3JkZXJfY3RybCA9ICZwc3RhLT5yZWN2cmVvcmRlcl9jdHJsW3BhdHRyaWItPnByaW9yaXR5XTsKIAogCS8qICBkZWNhY2hlLCBkcm9wIGR1cGxpY2F0ZSByZWN2IHBhY2tldHMgKi8KIAlpZiAocmVjdl9kZWNhY2hlKHByZWN2X2ZyYW1lLCBicmV0cnksICZwc3RhLT5zdGFfcmVjdnByaXYucnhjYWNoZSkgPT0gX0ZBSUwpIHsKQEAgLTEzMTIsMTIgKzEzMTMsMTIgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHZhbGlkYXRlX3JlY3ZfZnJhbWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQorc3RhdGljIGludCB2YWxpZGF0ZV9yZWN2X2ZyYW1lKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkJICAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAkvKiBzaGFsbCBjaGVjayBmcmFtZSBzdWJ0eXBlLCB0byAvIGZyb20gZHMsIGRhLCBic3NpZCAqLwogCkBAIC0xMzI3LDEyICsxMzI4LDExIEBACiAJdTggc3VidHlwZTsKIAlpbnQgcmV0dmFsID0gX1NVQ0NFU1M7CiAJdTggYkR1bXBSeFBrdDsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliOwotCXU4ICpwdHIgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKKwlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+YXR0cmliOworCXU4ICpwdHIgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKIAl1OCAgdmVyID0gKHVuc2lnbmVkIGNoYXIpICgqcHRyKSYweDM7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJmFkYXB0ZXItPm1sbWVleHRwcml2OwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID09IFNDQU5fUFJPQ0VTUykgewogCQlpbnQgY2hfc2V0X2lkeCA9IHJ0d19jaF9zZXRfc2VhcmNoX2NoKHBtbG1lZXh0LT5jaGFubmVsX3NldCwgcnR3X2dldF9vcGVyX2NoKGFkYXB0ZXIpKTsKQEAgLTE0MjIsMTQgKzE0MjIsMTMgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0dmFsOwogfQogCiAvKiByZW1vdmUgdGhlIHdsYW5oZHIgYW5kIGFkZCB0aGUgZXRoX2hkciAqLwogCi1zdGF0aWMgaW50IHdsYW5oZHJfdG9fZXRoaGRyICh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQorc3RhdGljIGludCB3bGFuaGRyX3RvX2V0aGhkcihzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKIHsKIAlpbnQJcm12X2xlbjsKIAl1MTYJZXRoX3R5cGUsIGxlbjsKQEAgLTE0MzksMTMgKzE0MzgsMTAgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyCSpwc25hcDsKIAogCWludCByZXQgPSBfU1VDQ0VTUzsKLQlzdHJ1Y3QgYWRhcHRlcgkJCSphZGFwdGVyID0gcHJlY3ZmcmFtZS0+dS5oZHIuYWRhcHRlcjsKKwlzdHJ1Y3QgYWRhcHRlcgkJKmFkYXB0ZXIgPSBwcmVjdmZyYW1lLT5hZGFwdGVyOwogCXN0cnVjdCBtbG1lX3ByaXYJKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQotCXU4CSpwdHIgPSBnZXRfcmVjdmZyYW1lX2RhdGEocHJlY3ZmcmFtZSk7IC8qICBwb2ludCB0byBmcmFtZV9jdHJsIGZpZWxkICovCi0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+dS5oZHIuYXR0cmliOwotCi1fZnVuY19lbnRlcl87CisJdTggKnB0ciA9IHByZWN2ZnJhbWUtPnJ4X2RhdGE7CisJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+YXR0cmliOwogCiAJaWYgKHBhdHRyaWItPmVuY3J5cHQpCiAJCXJlY3ZmcmFtZV9wdWxsX3RhaWwocHJlY3ZmcmFtZSwgcGF0dHJpYi0+aWN2X2xlbik7CkBAIC0xNDUzLDEwICsxNDQ5LDEwIEBACiAJcHNuYXAgPSAoc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkciAqKShwdHIrcGF0dHJpYi0+aGRybGVuICsgcGF0dHJpYi0+aXZfbGVuKTsKIAlwc25hcF90eXBlID0gcHRyK3BhdHRyaWItPmhkcmxlbiArIHBhdHRyaWItPml2X2xlbitTTkFQX1NJWkU7CiAJLyogY29udmVydCBoZHIgKyBwb3NzaWJsZSBMTEMgaGVhZGVycyBpbnRvIEV0aGVybmV0IGhlYWRlciAqLwotCWlmICgoX3J0d19tZW1jbXAocHNuYXAsIHJ0d19yZmMxMDQyX2hlYWRlciwgU05BUF9TSVpFKSAmJgotCSAgICAgKF9ydHdfbWVtY21wKHBzbmFwX3R5cGUsIFNOQVBfRVRIX1RZUEVfSVBYLCAyKSA9PSBmYWxzZSkgJiYKLQkgICAgIChfcnR3X21lbWNtcChwc25hcF90eXBlLCBTTkFQX0VUSF9UWVBFX0FQUExFVEFMS19BQVJQLCAyKSA9PSBmYWxzZSkpIHx8Ci0JICAgIF9ydHdfbWVtY21wKHBzbmFwLCBydHdfYnJpZGdlX3R1bm5lbF9oZWFkZXIsIFNOQVBfU0laRSkpIHsKKwlpZiAoKCFtZW1jbXAocHNuYXAsIHJ0d19yZmMxMDQyX2hlYWRlciwgU05BUF9TSVpFKSAmJgorCSAgICAgKCFtZW1jbXAocHNuYXBfdHlwZSwgU05BUF9FVEhfVFlQRV9JUFgsIDIpID09IGZhbHNlKSAmJgorCSAgICAgKCFtZW1jbXAocHNuYXBfdHlwZSwgU05BUF9FVEhfVFlQRV9BUFBMRVRBTEtfQUFSUCwgMikgPT0gZmFsc2UpKSB8fAorCSAgICAgIW1lbWNtcChwc25hcCwgcnR3X2JyaWRnZV90dW5uZWxfaGVhZGVyLCBTTkFQX1NJWkUpKSB7CiAJCS8qIHJlbW92ZSBSRkMxMDQyIG9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiBhbmQgcmVwbGFjZSBFdGhlclR5cGUgKi8KIAkJYnNuYXBoZHIgPSB0cnVlOwogCX0gZWxzZSB7CkBAIC0xNDY1LDcgKzE0NjEsNyBAQAogCX0KIAogCXJtdl9sZW4gPSBwYXR0cmliLT5oZHJsZW4gKyBwYXR0cmliLT5pdl9sZW4gKyAoYnNuYXBoZHIgPyBTTkFQX1NJWkUgOiAwKTsKLQlsZW4gPSBwcmVjdmZyYW1lLT51Lmhkci5sZW4gLSBybXZfbGVuOworCWxlbiA9IHByZWN2ZnJhbWUtPmxlbiAtIHJtdl9sZW47CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKIAkJICgiXG49PT1wYXR0cmliLT5oZHJsZW46ICV4LCAgcGF0dHJpYi0+aXZfbGVuOiV4PT09XG5cbiIsIHBhdHRyaWItPmhkcmxlbiwgIHBhdHRyaWItPml2X2xlbikpOwpAQCAtMTQ5NiwzMCArMTQ5MiwyOSBAQAogCQltZW1jcHkocHRyKzEyLCAmYmVfdG1wLCAyKTsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXQ7CiB9CiAKIC8qIHBlcmZvcm0gZGVmcmFnICovCi1zdGF0aWMgdW5pb24gcmVjdl9mcmFtZSAqcmVjdmZyYW1lX2RlZnJhZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IF9fcXVldWUgKmRlZnJhZ19xKQorc3RhdGljIHN0cnVjdCByZWN2X2ZyYW1lICpyZWN2ZnJhbWVfZGVmcmFnKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkJCQkgICBzdHJ1Y3QgX19xdWV1ZSAqZGVmcmFnX3EpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcGxpc3QsICpwaGVhZDsKIAl1OCB3bGFuaGRyX29mZnNldDsKIAl1OAljdXJmcmFnbnVtOwotCXN0cnVjdCByZWN2X2ZyYW1lX2hkciAqcGZoZHIsICpwbmZoZHI7Ci0JdW5pb24gcmVjdl9mcmFtZSAqcHJmcmFtZSwgKnBuZXh0cmZyYW1lOworCXN0cnVjdCByZWN2X2ZyYW1lICpwZmhkciwgKnBuZmhkcjsKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSwgKnBuZXh0cmZyYW1lOwogCXN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlOwogCi1fZnVuY19lbnRlcl87CiAKIAljdXJmcmFnbnVtID0gMDsKIAlwZnJlZV9yZWN2X3F1ZXVlID0gJmFkYXB0ZXItPnJlY3Zwcml2LmZyZWVfcmVjdl9xdWV1ZTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChkZWZyYWdfcSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7Ci0JcHJmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCB1bmlvbiByZWN2X2ZyYW1lLCB1KTsKLQlwZmhkciA9ICZwcmZyYW1lLT51LmhkcjsKLQlydHdfbGlzdF9kZWxldGUoJihwcmZyYW1lLT51Lmxpc3QpKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OworCXBmaGRyID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcmVjdl9mcmFtZSwgbGlzdCk7CisJcHJmcmFtZSA9IChzdHJ1Y3QgcmVjdl9mcmFtZSAqKXBmaGRyOworCXJ0d19saXN0X2RlbGV0ZSgmKHByZnJhbWUtPmxpc3QpKTsKIAogCWlmIChjdXJmcmFnbnVtICE9IHBmaGRyLT5hdHRyaWIuZnJhZ19udW0pIHsKIAkJLyogdGhlIGZpcnN0IGZyYWdtZW50IG51bWJlciBtdXN0IGJlIDAgKi8KQEAgLTE1MzQsMTEgKzE1MjksMTEgQEAKIAogCXBsaXN0ID0gZ2V0X2xpc3RfaGVhZChkZWZyYWdfcSk7CiAKLQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCiAJd2hpbGUgKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkgPT0gZmFsc2UpIHsKLQkJcG5leHRyZnJhbWUgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgdW5pb24gcmVjdl9mcmFtZSAsIHUpOwotCQlwbmZoZHIgPSAmcG5leHRyZnJhbWUtPnUuaGRyOworCQlwbmZoZHIgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCByZWN2X2ZyYW1lLCBsaXN0KTsKKwkJcG5leHRyZnJhbWUgPSAoc3RydWN0IHJlY3ZfZnJhbWUgKilwbmZoZHI7CiAKIAkJLyogY2hlY2sgdGhlIGZyYWdtZW50IHNlcXVlbmNlICAoMm5kIH5uIGZyYWdtZW50IGZyYW1lKSAqLwogCkBAIC0xNTY4LDcgKzE1NjMsNyBAQAogCQlyZWN2ZnJhbWVfcHV0KHByZnJhbWUsIHBuZmhkci0+bGVuKTsKIAogCQlwZmhkci0+YXR0cmliLmljdl9sZW4gPSBwbmZoZHItPmF0dHJpYi5pY3ZfbGVuOwotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAl9CiAKIAkvKiBmcmVlIHRoZSBkZWZyYWdfcSBxdWV1ZSBhbmQgcmV0dXJuIHRoZSBwcmZyYW1lICovCkBAIC0xNTc2LDI5ICsxNTcxLDI4IEBACiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywgKCJQZXJmb3JtYW5jZSBkZWZyYWchISEhIVxuIikpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBwcmZyYW1lOwogfQogCiAvKiBjaGVjayBpZiBuZWVkIHRvIGRlZnJhZywgaWYgbmVlZGVkIHF1ZXVlIHRoZSBmcmFtZSB0byBkZWZyYWdfcSAqLwotdW5pb24gcmVjdl9mcmFtZSAqcmVjdmZyYW1lX2Noa19kZWZyYWcoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3N0cnVjdCByZWN2X2ZyYW1lICpyZWN2ZnJhbWVfY2hrX2RlZnJhZyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCisJCQkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAl1OAlpc21mcmFnOwogCXU4CWZyYWdudW07CiAJdTgJKnBzdGFfYWRkcjsKLQlzdHJ1Y3QgcmVjdl9mcmFtZV9oZHIgKnBmaGRyOworCXN0cnVjdCByZWN2X2ZyYW1lICpwZmhkcjsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7CiAJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQl1bmlvbiByZWN2X2ZyYW1lICpwcnRuZnJhbWUgPSBOVUxMOworCXN0cnVjdCByZWN2X2ZyYW1lICpwcnRuZnJhbWUgPSBOVUxMOwogCXN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlLCAqcGRlZnJhZ19xOwogCi1fZnVuY19lbnRlcl87CiAKIAlwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKIAotCXBmaGRyID0gJnByZWN2X2ZyYW1lLT51LmhkcjsKKwlwZmhkciA9IHByZWN2X2ZyYW1lOwogCiAJcGZyZWVfcmVjdl9xdWV1ZSA9ICZwYWRhcHRlci0+cmVjdnByaXYuZnJlZV9yZWN2X3F1ZXVlOwogCkBAIC0xNjcwLDcgKzE2NjQsNyBAQAogCQl9CiAJfQogCi0JaWYgKChwcnRuZnJhbWUgIT0gTlVMTCkgJiYgKHBydG5mcmFtZS0+dS5oZHIuYXR0cmliLnByaXZhY3kpKSB7CisJaWYgKChwcnRuZnJhbWUgIT0gTlVMTCkgJiYgKHBydG5mcmFtZS0+YXR0cmliLnByaXZhY3kpKSB7CiAJCS8qIGFmdGVyIGRlZnJhZyB3ZSBtdXN0IGNoZWNrIHRraXAgbWljIGNvZGUgKi8KIAkJaWYgKHJlY3ZmcmFtZV9jaGttaWMocGFkYXB0ZXIsICBwcnRuZnJhbWUpID09IF9GQUlMKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLCAoInJlY3ZmcmFtZV9jaGttaWMocGFkYXB0ZXIsICBwcnRuZnJhbWUpPT1fRkFJTFxuIikpOwpAQCAtMTY3OSwxMiArMTY3MywxMSBAQAogCQl9CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBwcnRuZnJhbWU7CiB9CiAKLXN0YXRpYyBpbnQgYW1zZHVfdG9fbXNkdShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZnJhbWUpCitzdGF0aWMgaW50IGFtc2R1X3RvX21zZHUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSkKIHsKIAlpbnQJYV9sZW4sIHBhZGRpbmdfbGVuOwogCXUxNglldGhfdHlwZSwgblN1YmZyYW1lX0xlbmd0aDsKQEAgLTE2OTgsMTYgKzE2OTEsMTYgQEAKIAlpbnQJcmV0ID0gX1NVQ0NFU1M7CiAJbnJfc3ViZnJhbWVzID0gMDsKIAotCXBhdHRyaWIgPSAmcHJmcmFtZS0+dS5oZHIuYXR0cmliOworCXBhdHRyaWIgPSAmcHJmcmFtZS0+YXR0cmliOwogCi0JcmVjdmZyYW1lX3B1bGwocHJmcmFtZSwgcHJmcmFtZS0+dS5oZHIuYXR0cmliLmhkcmxlbik7CisJcmVjdmZyYW1lX3B1bGwocHJmcmFtZSwgcHJmcmFtZS0+YXR0cmliLmhkcmxlbik7CiAKLQlpZiAocHJmcmFtZS0+dS5oZHIuYXR0cmliLml2X2xlbiA+IDApCi0JCXJlY3ZmcmFtZV9wdWxsKHByZnJhbWUsIHByZnJhbWUtPnUuaGRyLmF0dHJpYi5pdl9sZW4pOworCWlmIChwcmZyYW1lLT5hdHRyaWIuaXZfbGVuID4gMCkKKwkJcmVjdmZyYW1lX3B1bGwocHJmcmFtZSwgcHJmcmFtZS0+YXR0cmliLml2X2xlbik7CiAKLQlhX2xlbiA9IHByZnJhbWUtPnUuaGRyLmxlbjsKKwlhX2xlbiA9IHByZnJhbWUtPmxlbjsKIAotCXBkYXRhID0gcHJmcmFtZS0+dS5oZHIucnhfZGF0YTsKKwlwZGF0YSA9IHByZnJhbWUtPnJ4X2RhdGE7CiAKIAl3aGlsZSAoYV9sZW4gPiBFVEhfSExFTikgewogCQkvKiBPZmZzZXQgMTIgZGVub3RlIDIgbWFjIGFkZHJlc3MgKi8KQEAgLTE3MjksNyArMTcyMiw3IEBACiAJCQlkYXRhX3B0ciA9ICh1OCAqKXNrYl9wdXQoc3ViX3NrYiwgblN1YmZyYW1lX0xlbmd0aCk7CiAJCQltZW1jcHkoZGF0YV9wdHIsIHBkYXRhLCBuU3ViZnJhbWVfTGVuZ3RoKTsKIAkJfSBlbHNlIHsKLQkJCXN1Yl9za2IgPSBza2JfY2xvbmUocHJmcmFtZS0+dS5oZHIucGt0LCBHRlBfQVRPTUlDKTsKKwkJCXN1Yl9za2IgPSBza2JfY2xvbmUocHJmcmFtZS0+cGt0LCBHRlBfQVRPTUlDKTsKIAkJCWlmIChzdWJfc2tiKSB7CiAJCQkJc3ViX3NrYi0+ZGF0YSA9IHBkYXRhOwogCQkJCXN1Yl9za2ItPmxlbiA9IG5TdWJmcmFtZV9MZW5ndGg7CkBAIC0xNzY4LDkgKzE3NjEsOSBAQAogCQkvKiBjb252ZXJ0IGhkciArIHBvc3NpYmxlIExMQyBoZWFkZXJzIGludG8gRXRoZXJuZXQgaGVhZGVyICovCiAJCWV0aF90eXBlID0gUlRXX0dFVF9CRTE2KCZzdWJfc2tiLT5kYXRhWzZdKTsKIAkJaWYgKHN1Yl9za2ItPmxlbiA+PSA4ICYmCi0JCSAgICAoKF9ydHdfbWVtY21wKHN1Yl9za2ItPmRhdGEsIHJ0d19yZmMxMDQyX2hlYWRlciwgU05BUF9TSVpFKSAmJgorCQkgICAgKCghbWVtY21wKHN1Yl9za2ItPmRhdGEsIHJ0d19yZmMxMDQyX2hlYWRlciwgU05BUF9TSVpFKSAmJgogCQkJICBldGhfdHlwZSAhPSBFVEhfUF9BQVJQICYmIGV0aF90eXBlICE9IEVUSF9QX0lQWCkgfHwKLQkJCSBfcnR3X21lbWNtcChzdWJfc2tiLT5kYXRhLCBydHdfYnJpZGdlX3R1bm5lbF9oZWFkZXIsIFNOQVBfU0laRSkpKSB7CisJCQkgIW1lbWNtcChzdWJfc2tiLT5kYXRhLCBydHdfYnJpZGdlX3R1bm5lbF9oZWFkZXIsIFNOQVBfU0laRSkpKSB7CiAJCQkvKiByZW1vdmUgUkZDMTA0MiBvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24gYW5kIHJlcGxhY2UgRXRoZXJUeXBlICovCiAJCQlza2JfcHVsbChzdWJfc2tiLCBTTkFQX1NJWkUpOwogCQkJbWVtY3B5KHNrYl9wdXNoKHN1Yl9za2IsIEVUSF9BTEVOKSwgcGF0dHJpYi0+c3JjLCBFVEhfQUxFTik7CkBAIC0xNzk2LDcgKzE3ODksNyBAQAogCiBleGl0OgogCi0JcHJmcmFtZS0+dS5oZHIubGVuID0gMDsKKwlwcmZyYW1lLT5sZW4gPSAwOwogCXJ0d19mcmVlX3JlY3ZmcmFtZShwcmZyYW1lLCBwZnJlZV9yZWN2X3F1ZXVlKTsvKiBmcmVlIHRoaXMgcmVjdl9mcmFtZSAqLwogCiAJcmV0dXJuIHJldDsKQEAgLTE4MzIsNzAgKzE4MjUsNzIgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotaW50IGVucXVldWVfcmVvcmRlcl9yZWN2ZnJhbWUoc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsLCB1bmlvbiByZWN2X2ZyYW1lICpwcmZyYW1lKTsKLWludCBlbnF1ZXVlX3Jlb3JkZXJfcmVjdmZyYW1lKHN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCwgdW5pb24gcmVjdl9mcmFtZSAqcHJmcmFtZSkKK2ludCBlbnF1ZXVlX3Jlb3JkZXJfcmVjdmZyYW1lKHN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCwKKwkJCSAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lKQogewotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmZyYW1lLT5hdHRyaWI7CiAJc3RydWN0IF9fcXVldWUgKnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZSA9ICZwcmVvcmRlcl9jdHJsLT5wZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZCwgKnBsaXN0OwotCXVuaW9uIHJlY3ZfZnJhbWUgKnBuZXh0cmZyYW1lOworCXN0cnVjdCByZWN2X2ZyYW1lICpoZHI7CiAJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBuZXh0YXR0cmliOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlIChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpID09IGZhbHNlKSB7Ci0JCXBuZXh0cmZyYW1lID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHVuaW9uIHJlY3ZfZnJhbWUsIHUpOwotCQlwbmV4dGF0dHJpYiA9ICZwbmV4dHJmcmFtZS0+dS5oZHIuYXR0cmliOworCQloZHIgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCByZWN2X2ZyYW1lLCBsaXN0KTsKKwkJcG5leHRhdHRyaWIgPSAmaGRyLT5hdHRyaWI7CiAKIAkJaWYgKFNOX0xFU1MocG5leHRhdHRyaWItPnNlcV9udW0sIHBhdHRyaWItPnNlcV9udW0pKQotCQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCQllbHNlIGlmIChTTl9FUVVBTChwbmV4dGF0dHJpYi0+c2VxX251bSwgcGF0dHJpYi0+c2VxX251bSkpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCWVsc2UKIAkJCWJyZWFrOwogCX0KIAotCXJ0d19saXN0X2RlbGV0ZSgmKHByZnJhbWUtPnUuaGRyLmxpc3QpKTsKKwlydHdfbGlzdF9kZWxldGUoJihwcmZyYW1lLT5saXN0KSk7CiAKLQlydHdfbGlzdF9pbnNlcnRfdGFpbCgmKHByZnJhbWUtPnUuaGRyLmxpc3QpLCBwbGlzdCk7CisJcnR3X2xpc3RfaW5zZXJ0X3RhaWwoJihwcmZyYW1lLT5saXN0KSwgcGxpc3QpOwogCXJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgaW50IHJlY3ZfaW5kaWNhdGVwa3RzX2luX29yZGVyKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsLCBpbnQgYmZvcmNlZCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZCwgKnBsaXN0OwotCXVuaW9uIHJlY3ZfZnJhbWUgKnByZnJhbWU7CisJc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWU7CisJc3RydWN0IHJlY3ZfZnJhbWUgKnByaGRyOwogCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliOwogCWludCBiUGt0SW5CdWYgPSBmYWxzZTsKIAlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwogCXN0cnVjdCBfX3F1ZXVlICpwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUgPSAmcHJlb3JkZXJfY3RybC0+cGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7CiAKIAlwaGVhZCA9CQlnZXRfbGlzdF9oZWFkKHBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCS8qICBIYW5kbGluZyBzb21lIGNvbmRpdGlvbiBmb3IgZm9yY2VkIGluZGljYXRlIGNhc2UuICovCiAJaWYgKGJmb3JjZWQpIHsKIAkJaWYgKHJ0d19pc19saXN0X2VtcHR5KHBoZWFkKSkKIAkJCXJldHVybiB0cnVlOwogCi0JCXByZnJhbWUgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgdW5pb24gcmVjdl9mcmFtZSwgdSk7Ci0JCXBhdHRyaWIgPSAmcHJmcmFtZS0+dS5oZHIuYXR0cmliOworCQlwcmhkciA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHJlY3ZfZnJhbWUsIGxpc3QpOworCSAgICAgICAgcGF0dHJpYiA9ICZwcmhkci0+YXR0cmliOwogCQlwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgPSBwYXR0cmliLT5zZXFfbnVtOwogCX0KIAogCS8qICBQcmVwYXJlIGluZGljYXRpb24gbGlzdCBhbmQgaW5kaWNhdGlvbi4gKi8KIAkvKiAgQ2hlY2sgaWYgdGhlcmUgaXMgYW55IHBhY2tldCBuZWVkIGluZGljYXRlLiAqLwogCXdoaWxlICghcnR3X2lzX2xpc3RfZW1wdHkocGhlYWQpKSB7Ci0JCXByZnJhbWUgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgdW5pb24gcmVjdl9mcmFtZSwgdSk7Ci0JCXBhdHRyaWIgPSAmcHJmcmFtZS0+dS5oZHIuYXR0cmliOworCQlwcmhkciA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHJlY3ZfZnJhbWUsIGxpc3QpOworCQlwcmZyYW1lID0gKHN0cnVjdCByZWN2X2ZyYW1lICopcHJoZHI7CisJCXBhdHRyaWIgPSAmcHJmcmFtZS0+YXR0cmliOwogCiAJCWlmICghU05fTEVTUyhwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEsIHBhdHRyaWItPnNlcV9udW0pKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9ub3RpY2VfLAogCQkJCSAoInJlY3ZfaW5kaWNhdGVwa3RzX2luX29yZGVyOiBpbmRpY2F0ZT0lZCBzZXE9JWQgYW1zZHU9JWRcbiIsCiAJCQkJICBwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEsIHBhdHRyaWItPnNlcV9udW0sIHBhdHRyaWItPmFtc2R1KSk7Ci0JCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKLQkJCXJ0d19saXN0X2RlbGV0ZSgmKHByZnJhbWUtPnUuaGRyLmxpc3QpKTsKKwkJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CisJCQlydHdfbGlzdF9kZWxldGUoJihwcmZyYW1lLT5saXN0KSk7CiAKIAkJCWlmIChTTl9FUVVBTChwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEsIHBhdHRyaWItPnNlcV9udW0pKQogCQkJCXByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSA9IChwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgKyAxKSAmIDB4RkZGOwpAQCAtMTkyNCwxMSArMTkxOSwxMiBAQAogCXJldHVybiBiUGt0SW5CdWY7CiB9CiAKLXN0YXRpYyBpbnQgcmVjdl9pbmRpY2F0ZXBrdF9yZW9yZGVyKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJmcmFtZSkKK3N0YXRpYyBpbnQgcmVjdl9pbmRpY2F0ZXBrdF9yZW9yZGVyKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKKwkJCQkgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUpCiB7CiAJaW50IHJldHZhbCA9IF9TVUNDRVNTOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZnJhbWUtPnUuaGRyLmF0dHJpYjsKLQlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmwgPSBwcmZyYW1lLT51Lmhkci5wcmVvcmRlcl9jdHJsOworCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZnJhbWUtPmF0dHJpYjsKKwlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmwgPSBwcmZyYW1lLT5wcmVvcmRlcl9jdHJsOwogCXN0cnVjdCBfX3F1ZXVlICpwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUgPSAmcHJlb3JkZXJfY3RybC0+cGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7CiAKIAlpZiAoIXBhdHRyaWItPmFtc2R1KSB7CkBAIC0yMDAxLDcgKzE5OTcsNyBAQAogCQlzcGluX3VubG9ja19iaCgmcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlLT5sb2NrKTsKIAl9IGVsc2UgewogCQlzcGluX3VubG9ja19iaCgmcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlLT5sb2NrKTsKLQkJX2NhbmNlbF90aW1lcl9leCgmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyKTsKKwkJZGVsX3RpbWVyX3N5bmMoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lcik7CiAJfQogCiBfc3VjY2Vzc19leGl0OgpAQCAtMjAzMiwxNyArMjAyOCwxNCBAQAogCXNwaW5fdW5sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwogfQogCi1zdGF0aWMgaW50IHByb2Nlc3NfcmVjdl9pbmRpY2F0ZXBrdHMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmZyYW1lKQorc3RhdGljIGludCBwcm9jZXNzX3JlY3ZfaW5kaWNhdGVwa3RzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKKwkJCQkgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lKQogewogCWludCByZXR2YWwgPSBfU1VDQ0VTUzsKLQkvKiBzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OyAqLwotCS8qIHN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZnJhbWUtPnUuaGRyLmF0dHJpYjsgKi8KIAlzdHJ1Y3QgbWxtZV9wcml2CSpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCBodF9wcml2CSpwaHRwcml2ID0gJnBtbG1lcHJpdi0+aHRwcml2OwogCiAJaWYgKHBodHByaXYtPmh0X29wdGlvbikgeyAgLyogQi9HL04gTW9kZSAqLwotCQkvKiBwcmZyYW1lLT51Lmhkci5wcmVvcmRlcl9jdHJsID0gJnByZWN2cHJpdi0+cmVjdnJlb3JkZXJfY3RybFtwYXR0cmliLT5wcmlvcml0eV07ICovCi0KIAkJaWYgKHJlY3ZfaW5kaWNhdGVwa3RfcmVvcmRlcihwYWRhcHRlciwgcHJmcmFtZSkgIT0gX1NVQ0NFU1MpIHsKIAkJCS8qICBpbmNsdWRpbmcgcGVyZm9ybSBBLU1QRFUgUnggT3JkZXJpbmcgQnVmZmVyIENvbnRyb2wgKi8KIAkJCWlmICgoIXBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCkgJiYKQEAgLTIwNzUsMTAgKzIwNjgsMTEgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IHJlY3ZfZnVuY19wcmVoYW5kbGUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpyZnJhbWUpCitzdGF0aWMgaW50IHJlY3ZfZnVuY19wcmVoYW5kbGUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAorCQkJICAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpyZnJhbWUpCiB7CiAJaW50IHJldCA9IF9TVUNDRVNTOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnJmcmFtZS0+dS5oZHIuYXR0cmliOworCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnJmcmFtZS0+YXR0cmliOwogCXN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlID0gJnBhZGFwdGVyLT5yZWN2cHJpdi5mcmVlX3JlY3ZfcXVldWU7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIApAQCAtMjExMCwxMCArMjEwNCwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcmVjdl9mdW5jX3Bvc3RoYW5kbGUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmZyYW1lKQorc3RhdGljIGludCByZWN2X2Z1bmNfcG9zdGhhbmRsZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCisJCQkJc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUpCiB7CiAJaW50IHJldCA9IF9TVUNDRVNTOwotCXVuaW9uIHJlY3ZfZnJhbWUgKm9yaWdfcHJmcmFtZSA9IHByZnJhbWU7CisJc3RydWN0IHJlY3ZfZnJhbWUgKm9yaWdfcHJmcmFtZSA9IHByZnJhbWU7CiAJc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2ID0gJnBhZGFwdGVyLT5yZWN2cHJpdjsKIAlzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSA9ICZwYWRhcHRlci0+cmVjdnByaXYuZnJlZV9yZWN2X3F1ZXVlOwogCkBAIC0yMTU1LDE2ICsyMTUwLDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCByZWN2X2Z1bmMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpyZnJhbWUpCitzdGF0aWMgaW50IHJlY3ZfZnVuYyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpyZnJhbWUpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcHJ4YXR0cmliID0gJnJmcmFtZS0+dS5oZHIuYXR0cmliOworCXN0cnVjdCByeF9wa3RfYXR0cmliICpwcnhhdHRyaWIgPSAmcmZyYW1lLT5hdHRyaWI7CiAJc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKIAlzdHJ1Y3QgbWxtZV9wcml2ICptbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKIAkvKiBjaGVjayBpZiBuZWVkIHRvIGhhbmRsZSB1Y19zd2RlY19wZW5kaW5nX3F1ZXVlKi8KIAlpZiAoY2hlY2tfZndzdGF0ZShtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSAmJiBwc2VjdXJpdHlwcml2LT5idXNldGtpcGtleSkgewotCQl1bmlvbiByZWN2X2ZyYW1lICpwZW5kaW5nX2ZyYW1lOworCQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcGVuZGluZ19mcmFtZTsKIAogCQl3aGlsZSAoKHBlbmRpbmdfZnJhbWUgPSBydHdfYWxsb2NfcmVjdmZyYW1lKCZwYWRhcHRlci0+cmVjdnByaXYudWNfc3dkZWNfcGVuZGluZ19xdWV1ZSkpKSB7CiAJCQlpZiAocmVjdl9mdW5jX3Bvc3RoYW5kbGUocGFkYXB0ZXIsIHBlbmRpbmdfZnJhbWUpID09IF9TVUNDRVNTKQpAQCAtMjE5MywxNSArMjE4OCwxNCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXMzMiBydHdfcmVjdl9lbnRyeSh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQorczMyIHJ0d19yZWN2X2VudHJ5KHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQogewogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcjsKIAlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXY7CiAJczMyIHJldCA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKLQlwYWRhcHRlciA9IHByZWN2ZnJhbWUtPnUuaGRyLmFkYXB0ZXI7CisJcGFkYXB0ZXIgPSBwcmVjdmZyYW1lLT5hZGFwdGVyOwogCiAJcHJlY3Zwcml2ID0gJnBhZGFwdGVyLT5yZWN2cHJpdjsKIApAQCAtMjIxMyw3ICsyMjA3LDYgQEAKIAogCXByZWN2cHJpdi0+cnhfcGt0cysrOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiAKQEAgLTIyMjIsNyArMjIxNSw2IEBACiAJaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYubXBfbW9kZSA9PSAxKQogCQlwYWRhcHRlci0+bXBwcml2LnJ4X3BrdGxvc3MgPSBwcmVjdnByaXYtPnJ4X2Ryb3A7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTIyNDQsMTMgKzIyMzYsMTMgQEAKIAl9IGVsc2UgewogCQlpZiAocmVjdnByaXYtPnNpZ25hbF9zdHJlbmd0aF9kYXRhLnVwZGF0ZV9yZXEgPT0gMCkgey8qICB1cGRhdGVfcmVxIGlzIGNsZWFyLCBtZWFucyB3ZSBnb3QgcnggKi8KIAkJCWF2Z19zaWduYWxfc3RyZW5ndGggPSByZWN2cHJpdi0+c2lnbmFsX3N0cmVuZ3RoX2RhdGEuYXZnX3ZhbDsKLQkJCS8qICBhZnRlciBhdmdfdmFscyBhcmUgYWNjcXVpcmVkLCB3ZSBjYW4gcmUtc3RhdCB0aGUgc2lnbmFsIHZhbHVlcyAqLworCQkJLyogIGFmdGVyIGF2Z192YWxzIGFyZSBhY3F1aXJlZCwgd2UgY2FuIHJlLXN0YXQgdGhlIHNpZ25hbCB2YWx1ZXMgKi8KIAkJCXJlY3Zwcml2LT5zaWduYWxfc3RyZW5ndGhfZGF0YS51cGRhdGVfcmVxID0gMTsKIAkJfQogCiAJCWlmIChyZWN2cHJpdi0+c2lnbmFsX3F1YWxfZGF0YS51cGRhdGVfcmVxID09IDApIHsvKiAgdXBkYXRlX3JlcSBpcyBjbGVhciwgbWVhbnMgd2UgZ290IHJ4ICovCiAJCQlhdmdfc2lnbmFsX3F1YWwgPSByZWN2cHJpdi0+c2lnbmFsX3F1YWxfZGF0YS5hdmdfdmFsOwotCQkJLyogIGFmdGVyIGF2Z192YWxzIGFyZSBhY2NxdWlyZWQsIHdlIGNhbiByZS1zdGF0IHRoZSBzaWduYWwgdmFsdWVzICovCisJCQkvKiAgYWZ0ZXIgYXZnX3ZhbHMgYXJlIGFjcXVpcmVkLCB3ZSBjYW4gcmUtc3RhdCB0aGUgc2lnbmFsIHZhbHVlcyAqLwogCQkJcmVjdnByaXYtPnNpZ25hbF9xdWFsX2RhdGEudXBkYXRlX3JlcSA9IDE7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zZWN1cml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zZWN1cml0eS5jCmluZGV4IGUwODg0NTcuLmM0YjE2ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc2VjdXJpdHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3NlY3VyaXR5LmMKQEAgLTQxLDcgKzQxLDYgQEAKIAl1MzIJc3RhdGVpbmRleDsKIAl1OCAqc3RhdGU7CiAJdTMyCWNvdW50ZXI7Ci1fZnVuY19lbnRlcl87CiAJc3RhdGUgPSBwYXJjNGN0eC0+c3RhdGU7CiAJcGFyYzRjdHgtPnggPSAwOwogCXBhcmM0Y3R4LT55ID0gMDsKQEAgLTU4LDcgKzU3LDYgQEAKIAkJaWYgKCsra2V5aW5kZXggPj0ga2V5X2xlbikKIAkJCWtleWluZGV4ID0gMDsKIAl9Ci1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHUzMiBhcmNmb3VyX2J5dGUoc3RydWN0IGFyYzRjb250ZXh0ICpwYXJjNGN0eCkKQEAgLTY3LDcgKzY1LDYgQEAKIAl1MzIgeTsKIAl1MzIgc3gsIHN5OwogCXU4ICpzdGF0ZTsKLV9mdW5jX2VudGVyXzsKIAlzdGF0ZSA9IHBhcmM0Y3R4LT5zdGF0ZTsKIAl4ID0gKHBhcmM0Y3R4LT54ICsgMSkgJiAweGZmOwogCXN4ID0gc3RhdGVbeF07CkBAIC03NywxNyArNzQsMTQgQEAKIAlwYXJjNGN0eC0+eSA9IHk7CiAJc3RhdGVbeV0gPSAodTgpc3g7CiAJc3RhdGVbeF0gPSAodTgpc3k7Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gc3RhdGVbKHN4ICsgc3kpICYgMHhmZl07CiB9CiAKIHN0YXRpYyB2b2lkIGFyY2ZvdXJfZW5jcnlwdChzdHJ1Y3QgYXJjNGNvbnRleHQgKnBhcmM0Y3R4LCB1OCAqZGVzdCwgdTggKnNyYywgdTMyIGxlbikKIHsKIAl1MzIJaTsKLV9mdW5jX2VudGVyXzsKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCiAJCWRlc3RbaV0gPSBzcmNbaV0gXiAodW5zaWduZWQgY2hhcilhcmNmb3VyX2J5dGUocGFyYzRjdHgpOwotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyBpbnQgYmNyYzMyaW5pdGlhbGl6ZWQ7CkBAIC0xMDIsOSArOTYsOCBAQAogCiBzdGF0aWMgdm9pZCBjcmMzMl9pbml0KHZvaWQpCiB7Ci1fZnVuY19lbnRlcl87CiAJaWYgKGJjcmMzMmluaXRpYWxpemVkID09IDEpIHsKLQkJZ290byBleGl0OworCQlyZXR1cm47CiAJfSBlbHNlIHsKIAkJaW50IGksIGo7CiAJCXUzMiBjOwpAQCAtMTI2LDE1ICsxMTksMTIgQEAKIAkJfQogCQliY3JjMzJpbml0aWFsaXplZCA9IDE7CiAJfQotZXhpdDoKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgX19sZTMyIGdldGNyYzMyKHU4ICpidWYsIGludCBsZW4pCiB7CiAJdTggKnA7CiAJdTMyICBjcmM7Ci1fZnVuY19lbnRlcl87CiAJaWYgKGJjcmMzMmluaXRpYWxpemVkID09IDApCiAJCWNyYzMyX2luaXQoKTsKIApAQCAtMTQyLDcgKzEzMiw2IEBACiAKIAlmb3IgKHAgPSBidWY7IGxlbiA+IDA7ICsrcCwgLS1sZW4pCiAJCWNyYyA9IGNyYzMyX3RhYmxlWyhjcmMgXiAqcCkgJiAweGZmXSBeIChjcmMgPj4gOCk7Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gY3B1X3RvX2xlMzIofmNyYyk7ICAgIC8qIHRyYW5zbWl0IGNvbXBsZW1lbnQsIHBlciBDUkMtMzIgc3BlYyAqLwogfQogCkBAIC0xNjUsNyArMTU0LDYgQEAKIAlzdHJ1Y3QJc2VjdXJpdHlfcHJpdgkqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwogCXN0cnVjdAl4bWl0X3ByaXYJCSpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAoKChzdHJ1Y3QgeG1pdF9mcmFtZSAqKXB4bWl0ZnJhbWUpLT5idWZfYWRkciA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC0yMDYsNyArMTk0LDYgQEAKIAkJfQogCX0KIAotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X3dlcF9kZWNyeXB0KHN0cnVjdCBhZGFwdGVyICAqcGFkYXB0ZXIsIHU4ICpwcmVjdmZyYW1lKQpAQCAtMjE4LDEyICsyMDUsMTEgQEAKIAl1MzIJa2V5bGVuZ3RoOwogCXU4CSpwZnJhbWUsICpwYXlsb2FkLCAqaXYsIHdlcGtleVsxNl07CiAJdTgJIGtleWluZGV4OwotCXN0cnVjdAlyeF9wa3RfYXR0cmliCSAqcHJ4YXR0cmliID0gJigoKHVuaW9uIHJlY3ZfZnJhbWUgKilwcmVjdmZyYW1lKS0+dS5oZHIuYXR0cmliKTsKKwlzdHJ1Y3QJcnhfcGt0X2F0dHJpYgkgKnByeGF0dHJpYiA9ICYoKChzdHJ1Y3QgcmVjdl9mcmFtZSAqKXByZWN2ZnJhbWUpLT5hdHRyaWIpOwogCXN0cnVjdAlzZWN1cml0eV9wcml2CSpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7CiAKLV9mdW5jX2VudGVyXzsKIAotCXBmcmFtZSA9ICh1bnNpZ25lZCBjaGFyICopKCh1bmlvbiByZWN2X2ZyYW1lICopcHJlY3ZmcmFtZSktPnUuaGRyLnJ4X2RhdGE7CisJcGZyYW1lID0gKHVuc2lnbmVkIGNoYXIgKikoKHN0cnVjdCByZWN2X2ZyYW1lICopcHJlY3ZmcmFtZSktPnJ4X2RhdGE7CiAKIAkvKiBzdGFydCB0byBkZWNyeXB0IHJlY3ZmcmFtZSAqLwogCWlmICgocHJ4YXR0cmliLT5lbmNyeXB0ID09IF9XRVA0MF8pIHx8IChwcnhhdHRyaWItPmVuY3J5cHQgPT0gX1dFUDEwNF8pKSB7CkBAIC0yMzIsNyArMjE4LDcgQEAKIAkJa2V5bGVuZ3RoID0gcHNlY3VyaXR5cHJpdi0+ZG90MTFEZWZLZXlsZW5ba2V5aW5kZXhdOwogCQltZW1jcHkoJndlcGtleVswXSwgaXYsIDMpOwogCQltZW1jcHkoJndlcGtleVszXSwgJnBzZWN1cml0eXByaXYtPmRvdDExRGVmS2V5W2tleWluZGV4XS5za2V5WzBdLCBrZXlsZW5ndGgpOwotCQlsZW5ndGggPSAoKHVuaW9uIHJlY3ZfZnJhbWUgKilwcmVjdmZyYW1lKS0+dS5oZHIubGVuLXByeGF0dHJpYi0+aGRybGVuLXByeGF0dHJpYi0+aXZfbGVuOworCQlsZW5ndGggPSAoKHN0cnVjdCByZWN2X2ZyYW1lICopcHJlY3ZmcmFtZSktPmxlbi1wcnhhdHRyaWItPmhkcmxlbi1wcnhhdHRyaWItPml2X2xlbjsKIAogCQlwYXlsb2FkID0gcGZyYW1lK3ByeGF0dHJpYi0+aXZfbGVuK3ByeGF0dHJpYi0+aGRybGVuOwogCkBAIC0yNTIsNyArMjM4LDYgQEAKIAkJCQkgJmNyYywgJnBheWxvYWRbbGVuZ3RoLTRdKSk7CiAJCX0KIAl9Ci1fZnVuY19leGl0XzsKIAlyZXR1cm47CiB9CiAKQEAgLTI2MywxMCArMjQ4LDggQEAKIHsKIAlzMzIgaTsKIAl1MzIgcmVzID0gMDsKLV9mdW5jX2VudGVyXzsKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQlyZXMgfD0gKCh1MzIpKCpwKyspKSA8PCAoOCppKTsKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTI3NCwzOSArMjU3LDMyIEBACiAvKiAgQ29udmVydCBmcm9tIFVzMzIzMiB0byBCeXRlW10gaW4gYSBwb3J0YWJsZSB3YXkgKi8KIHsKIAlsb25nIGk7Ci1fZnVuY19lbnRlcl87CiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQkqcCsrID0gKHU4KSAodmFsICYgMHhmZik7CiAJCXZhbCA+Pj0gODsKIAl9Ci1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHZvaWQgc2VjbWljY2xlYXIoc3RydWN0IG1pY19kYXRhICpwbWljZGF0YSkKIHsKIC8qICBSZXNldCB0aGUgc3RhdGUgdG8gdGhlIGVtcHR5IG1lc3NhZ2UuICovCi1fZnVuY19lbnRlcl87CiAJcG1pY2RhdGEtPkwgPSBwbWljZGF0YS0+SzA7CiAJcG1pY2RhdGEtPlIgPSBwbWljZGF0YS0+SzE7CiAJcG1pY2RhdGEtPm5CeXRlc0luTSA9IDA7CiAJcG1pY2RhdGEtPk0gPSAwOwotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X3NlY21pY3NldGtleShzdHJ1Y3QgbWljX2RhdGEgKnBtaWNkYXRhLCB1OCAqa2V5KQogewogCS8qICBTZXQgdGhlIGtleSAqLwotX2Z1bmNfZW50ZXJfOwogCXBtaWNkYXRhLT5LMCA9IHNlY21pY2dldHVpbnQzMihrZXkpOwogCXBtaWNkYXRhLT5LMSA9IHNlY21pY2dldHVpbnQzMihrZXkgKyA0KTsKIAkvKiAgYW5kIHJlc2V0IHRoZSBtZXNzYWdlICovCiAJc2VjbWljY2xlYXIocG1pY2RhdGEpOwotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X3NlY21pY2FwcGVuZGJ5dGUoc3RydWN0IG1pY19kYXRhICpwbWljZGF0YSwgdTggYikKIHsKLV9mdW5jX2VudGVyXzsKIAkvKiAgQXBwZW5kIHRoZSBieXRlIHRvIG91ciB3b3JkLXNpemVkIGJ1ZmZlciAqLwogCXBtaWNkYXRhLT5NIHw9ICgodW5zaWduZWQgbG9uZyliKSA8PCAoOCpwbWljZGF0YS0+bkJ5dGVzSW5NKTsKIAlwbWljZGF0YS0+bkJ5dGVzSW5NKys7CkBAIC0zMjUsMjMgKzMwMSwxOSBAQAogCQlwbWljZGF0YS0+TSA9IDA7CiAJCXBtaWNkYXRhLT5uQnl0ZXNJbk0gPSAwOwogCX0KLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19zZWNtaWNhcHBlbmQoc3RydWN0IG1pY19kYXRhICpwbWljZGF0YSwgdTggKnNyYywgdTMyIG5ieXRlcykKIHsKLV9mdW5jX2VudGVyXzsKIAkvKiAgVGhpcyBpcyBzaW1wbGUgKi8KIAl3aGlsZSAobmJ5dGVzID4gMCkgewogCQlydHdfc2VjbWljYXBwZW5kYnl0ZShwbWljZGF0YSwgKnNyYysrKTsKIAkJbmJ5dGVzLS07CiAJfQotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X3NlY2dldG1pYyhzdHJ1Y3QgbWljX2RhdGEgKnBtaWNkYXRhLCB1OCAqZHN0KQogewotX2Z1bmNfZW50ZXJfOwogCS8qICBBcHBlbmQgdGhlIG1pbmltdW0gcGFkZGluZyAqLwogCXJ0d19zZWNtaWNhcHBlbmRieXRlKHBtaWNkYXRhLCAweDVhKTsKIAlydHdfc2VjbWljYXBwZW5kYnl0ZShwbWljZGF0YSwgMCk7CkBAIC0zNTYsMTQgKzMyOCwxMiBAQAogCXNlY21pY3B1dHVpbnQzMihkc3QrNCwgcG1pY2RhdGEtPlIpOwogCS8qICBSZXNldCB0byB0aGUgZW1wdHkgbWVzc2FnZS4gKi8KIAlzZWNtaWNjbGVhcihwbWljZGF0YSk7Ci1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfc2VjY2FsY3RraXBtaWModTggKmtleSwgdTggKmhlYWRlciwgdTggKmRhdGEsIHUzMiBkYXRhX2xlbiwgdTggKm1pY19jb2RlLCB1OCBwcmkpCiB7CiAJc3RydWN0IG1pY19kYXRhCW1pY2RhdGE7CiAJdTggcHJpb3JpdHlbNF0gPSB7MHgwLCAweDAsIDB4MCwgMHgwfTsKLV9mdW5jX2VudGVyXzsKIAlydHdfc2VjbWljc2V0a2V5KCZtaWNkYXRhLCBrZXkpOwogCXByaW9yaXR5WzBdID0gcHJpOwogCkBAIC0zODYsNyArMzU2LDYgQEAKIAlydHdfc2VjbWljYXBwZW5kKCZtaWNkYXRhLCBkYXRhLCBkYXRhX2xlbik7CiAKIAlydHdfc2VjZ2V0bWljKCZtaWNkYXRhLCBtaWNfY29kZSk7Ci1fZnVuY19leGl0XzsKIH0KIAogCkBAIC01MDUsNyArNDc0LDYgQEAKIHN0YXRpYyB2b2lkIHBoYXNlMSh1MTYgKnAxaywgY29uc3QgdTggKnRrLCBjb25zdCB1OCAqdGEsIHUzMiBpdjMyKQogewogCWludCAgaTsKLV9mdW5jX2VudGVyXzsKIAkvKiBJbml0aWFsaXplIHRoZSA4MCBiaXRzIG9mIFAxS1tdIGZyb20gSVYzMiBhbmQgVEFbMC4uNV0gICAgICovCiAJcDFrWzBdICAgICAgPSBMbzE2KGl2MzIpOwogCXAxa1sxXSAgICAgID0gSGkxNihpdjMyKTsKQEAgLTUyMyw3ICs0OTEsNiBAQAogCQlwMWtbNF0gKz0gX1NfKHAxa1szXSBeIFRLMTYoKGkmMSkrMCkpOwogCQlwMWtbNF0gKz0gICh1bnNpZ25lZCBzaG9ydClpOyAgIC8qIGF2b2lkICJzbGlkZSBhdHRhY2tzIiAqLwogCX0KLV9mdW5jX2V4aXRfOwogfQogCiAvKgpAQCAtNTUzLDcgKzUyMCw2IEBACiB7CiAJaW50ICBpOwogCXUxNiBQUEtbNl07CQkJLyogdGVtcG9yYXJ5IGtleSBmb3IgbWl4aW5nICAgICovCi1fZnVuY19lbnRlcl87CiAJLyogTm90ZTogYWxsIGFkZHMgaW4gdGhlIFBQS1tdIGVxdWF0aW9ucyBiZWxvdyBhcmUgbW9kIDIqKjE2CSAqLwogCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCiAJCVBQS1tpXSA9IHAxa1tpXTsJLyogZmlyc3QsIGNvcHkgUDFLIHRvIFBQSyAgICAgICovCkBAIC01OTAsNyArNTU2LDYgQEAKIAkJcmM0a2V5WzQrMippXSA9IExvOChQUEtbaV0pOwogCQlyYzRrZXlbNSsyKmldID0gSGk4KFBQS1tpXSk7CiAJfQotX2Z1bmNfZXhpdF87CiB9CiAKIC8qIFRoZSBobGVuIGlzbid0IGluY2x1ZGUgdGhlIElWICovCkBAIC02MTIsNyArNTc3LDYgQEAKIAlzdHJ1Y3QJc2VjdXJpdHlfcHJpdgkqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwogCXN0cnVjdAl4bWl0X3ByaXYJCSpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwogCXUzMglyZXMgPSBfU1VDQ0VTUzsKLV9mdW5jX2VudGVyXzsKIAogCWlmICgoKHN0cnVjdCB4bWl0X2ZyYW1lICopcHhtaXRmcmFtZSktPmJ1Zl9hZGRyID09IE5VTEwpCiAJCXJldHVybiBfRkFJTDsKQEAgLTY3Miw3ICs2MzYsNiBAQAogCQkJcmVzID0gX0ZBSUw7CiAJCX0KIAl9Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC02OTAsMTMgKzY1MywxMiBAQAogCXU4CSpwZnJhbWUsICpwYXlsb2FkLCAqaXYsICpwcndza2V5OwogCXVuaW9uIHBuNDggZG90MTF0eHBuOwogCXN0cnVjdAlzdGFfaW5mbwkJKnN0YWluZm87Ci0Jc3RydWN0CXJ4X3BrdF9hdHRyaWIJICpwcnhhdHRyaWIgPSAmKCh1bmlvbiByZWN2X2ZyYW1lICopcHJlY3ZmcmFtZSktPnUuaGRyLmF0dHJpYjsKKwlzdHJ1Y3QJcnhfcGt0X2F0dHJpYgkgKnByeGF0dHJpYiA9ICYoKHN0cnVjdCByZWN2X2ZyYW1lICopcHJlY3ZmcmFtZSktPmF0dHJpYjsKIAlzdHJ1Y3QJc2VjdXJpdHlfcHJpdgkqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwogCXUzMgkJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAotCXBmcmFtZSA9ICh1bnNpZ25lZCBjaGFyICopKCh1bmlvbiByZWN2X2ZyYW1lICopcHJlY3ZmcmFtZSktPnUuaGRyLnJ4X2RhdGE7CisJcGZyYW1lID0gKHVuc2lnbmVkIGNoYXIgKikoKHN0cnVjdCByZWN2X2ZyYW1lICopcHJlY3ZmcmFtZSktPnJ4X2RhdGE7CiAKIAkvKiA0IHN0YXJ0IHRvIGRlY3J5cHQgcmVjdmZyYW1lICovCiAJaWYgKHByeGF0dHJpYi0+ZW5jcnlwdCA9PSBfVEtJUF8pIHsKQEAgLTcxNiw3ICs2NzgsNyBAQAogCiAJCQlpdiA9IHBmcmFtZStwcnhhdHRyaWItPmhkcmxlbjsKIAkJCXBheWxvYWQgPSBwZnJhbWUrcHJ4YXR0cmliLT5pdl9sZW4rcHJ4YXR0cmliLT5oZHJsZW47Ci0JCQlsZW5ndGggPSAoKHVuaW9uIHJlY3ZfZnJhbWUgKilwcmVjdmZyYW1lKS0+dS5oZHIubGVuLXByeGF0dHJpYi0+aGRybGVuLXByeGF0dHJpYi0+aXZfbGVuOworCQkJbGVuZ3RoID0gKChzdHJ1Y3QgcmVjdl9mcmFtZSAqKXByZWN2ZnJhbWUpLT5sZW4tcHJ4YXR0cmliLT5oZHJsZW4tcHJ4YXR0cmliLT5pdl9sZW47CiAKIAkJCUdFVF9US0lQX1BOKGl2LCBkb3QxMXR4cG4pOwogCkBAIC03NDcsNyArNzA5LDYgQEAKIAkJCXJlcyA9IF9GQUlMOwogCQl9CiAJfQotX2Z1bmNfZXhpdF87CiBleGl0OgogCXJldHVybiByZXM7CiB9CkBAIC04MjEsMTkgKzc4MiwxNSBAQAogc3RhdGljIHZvaWQgeG9yXzEyOCh1OCAqYSwgdTggKmIsIHU4ICpvdXQpCiB7CiAJaW50IGk7Ci1fZnVuY19lbnRlcl87CiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCiAJCW91dFtpXSA9IGFbaV0gXiBiW2ldOwotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB2b2lkIHhvcl8zMih1OCAqYSwgdTggKmIsIHU4ICpvdXQpCiB7CiAJaW50IGk7Ci1fZnVuY19lbnRlcl87CiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKIAkJb3V0W2ldID0gYVtpXSBeIGJbaV07Ci1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHU4IHNib3godTggYSkKQEAgLTg0OSw3ICs4MDYsNiBAQAogCQkweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLAogCQkweDFiLCAweDM2LCAweDM2LCAweDM2CiAJfTsKLV9mdW5jX2VudGVyXzsKIAlzYm94X2tleVswXSA9IHNib3goa2V5WzEzXSk7CiAJc2JveF9rZXlbMV0gPSBzYm94KGtleVsxNF0pOwogCXNib3hfa2V5WzJdID0gc2JveChrZXlbMTVdKTsKQEAgLTg2MywyMSArODE5LDE3IEBACiAJeG9yXzMyKCZrZXlbNF0sICZrZXlbMF0sICZrZXlbNF0pOwogCXhvcl8zMigma2V5WzhdLCAma2V5WzRdLCAma2V5WzhdKTsKIAl4b3JfMzIoJmtleVsxMl0sICZrZXlbOF0sICZrZXlbMTJdKTsKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdm9pZCBieXRlX3N1Yih1OCAqaW4sIHU4ICpvdXQpCiB7CiAJaW50IGk7Ci1fZnVuY19lbnRlcl87CiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCiAJCW91dFtpXSA9IHNib3goaW5baV0pOwotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB2b2lkIHNoaWZ0X3Jvdyh1OCAqaW4sIHU4ICpvdXQpCiB7Ci1fZnVuY19lbnRlcl87CiAJb3V0WzBdID0gIGluWzBdOwogCW91dFsxXSA9ICBpbls1XTsKIAlvdXRbMl0gPSAgaW5bMTBdOwpAQCAtODk0LDcgKzg0Niw2IEBACiAJb3V0WzEzXSA9IGluWzFdOwogCW91dFsxNF0gPSBpbls2XTsKIAlvdXRbMTVdID0gaW5bMTFdOwotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB2b2lkIG1peF9jb2x1bW4odTggKmluLCB1OCAqb3V0KQpAQCAtOTA4LDcgKzg1OSw2IEBACiAJdTggcm90cls0XTsKIAl1OCB0ZW1wWzRdOwogCXU4IHRlbXBiWzRdOwotX2Z1bmNfZW50ZXJfOwogCWZvciAoaSA9IDAgOyBpIDwgNDsgaSsrKSB7CiAJCWlmICgoaW5baV0gJiAweDgwKSA9PSAweDgwKQogCQkJYWRkMWJbaV0gPSAweDFiOwpAQCAtOTUyLDcgKzkwMiw2IEBACiAJeG9yXzMyKGFkZDFiZjcsIHJvdHIsIHRlbXApOwogCXhvcl8zMihzd2FwX2hhbGZzLCByb3RsLCB0ZW1wYik7CiAJeG9yXzMyKHRlbXAsIHRlbXBiLCBvdXQpOwotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB2b2lkIGFlczEyOGsxMjhkKHU4ICprZXksIHU4ICpkYXRhLCB1OCAqY2lwaGVydGV4dCkKQEAgLTk2Miw3ICs5MTEsNiBAQAogCXU4IGludGVybWVkaWF0ZWFbMTZdOwogCXU4IGludGVybWVkaWF0ZWJbMTZdOwogCXU4IHJvdW5kX2tleVsxNl07Ci1fZnVuY19lbnRlcl87CiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCiAJCXJvdW5kX2tleVtpXSA9IGtleVtpXTsKIAlmb3IgKHJvdW5kID0gMDsgcm91bmQgPCAxMTsgcm91bmQrKykgewpAQCAtOTg0LDcgKzkzMiw2IEBACiAJCQluZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKIAkJfQogCX0KLV9mdW5jX2V4aXRfOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTk1LDcgKzk0Miw2IEBACiAJCQkgICAgIHVpbnQgcGF5bG9hZF9sZW5ndGgsIHU4ICpwbl92ZWN0b3IpCiB7CiAJaW50IGk7Ci1fZnVuY19lbnRlcl87CiAJbWljX2l2WzBdID0gMHg1OTsKIAlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKIAkJbWljX2l2WzFdID0gbXBkdVszMF0gJiAweDBmOyAgICAvKiBRb1NfVEMJICAgKi8KQEAgLTEwMDksNyArOTU1LDYgQEAKIAkJbWljX2l2W2ldID0gcG5fdmVjdG9yWzEzIC0gaV07CS8qIG1pY19pdls4OjEzXSA9IFBOWzU6MF0gKi8KIAltaWNfaXZbMTRdID0gKHVuc2lnbmVkIGNoYXIpIChwYXlsb2FkX2xlbmd0aCAvIDI1Nik7CiAJbWljX2l2WzE1XSA9ICh1bnNpZ25lZCBjaGFyKSAocGF5bG9hZF9sZW5ndGggJSAyNTYpOwotX2Z1bmNfZXhpdF87CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMDE5LDcgKzk2NCw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgY29uc3RydWN0X21pY19oZWFkZXIxKHU4ICptaWNfaGVhZGVyMSwgaW50IGhlYWRlcl9sZW5ndGgsIHU4ICptcGR1KQogewotX2Z1bmNfZW50ZXJfOwogCW1pY19oZWFkZXIxWzBdID0gKHU4KSgoaGVhZGVyX2xlbmd0aCAtIDIpIC8gMjU2KTsKIAltaWNfaGVhZGVyMVsxXSA9ICh1OCkoKGhlYWRlcl9sZW5ndGggLSAyKSAlIDI1Nik7CiAJbWljX2hlYWRlcjFbMl0gPSBtcGR1WzBdICYgMHhjZjsgICAgLyogTXV0ZSBDRiBwb2xsICYgQ0YgYWNrIGJpdHMgKi8KQEAgLTEwMzYsNyArOTgwLDYgQEAKIAltaWNfaGVhZGVyMVsxM10gPSBtcGR1WzEzXTsKIAltaWNfaGVhZGVyMVsxNF0gPSBtcGR1WzE0XTsKIAltaWNfaGVhZGVyMVsxNV0gPSBtcGR1WzE1XTsKLV9mdW5jX2V4aXRfOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTA0Nyw3ICs5OTAsNiBAQAogc3RhdGljIHZvaWQgY29uc3RydWN0X21pY19oZWFkZXIyKHU4ICptaWNfaGVhZGVyMiwgdTggKm1wZHUsIGludCBhNF9leGlzdHMsIGludCBxY19leGlzdHMpCiB7CiAJaW50IGk7Ci1fZnVuY19lbnRlcl87CiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCiAJCW1pY19oZWFkZXIyW2ldID0gMHgwMDsKIApAQCAtMTA3OSw3ICsxMDIxLDYgQEAKIAkJbWljX2hlYWRlcjJbMTVdID0gbXBkdVszMV0gJiAweDAwOwogCX0KIAotX2Z1bmNfZXhpdF87CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMDkwLDcgKzEwMzEsNiBAQAogc3RhdGljIHZvaWQgY29uc3RydWN0X2N0cl9wcmVsb2FkKHU4ICpjdHJfcHJlbG9hZCwgaW50IGE0X2V4aXN0cywgaW50IHFjX2V4aXN0cywgdTggKm1wZHUsIHU4ICpwbl92ZWN0b3IsIGludCBjKQogewogCWludCBpOwotX2Z1bmNfZW50ZXJfOwogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQogCQljdHJfcHJlbG9hZFtpXSA9IDB4MDA7CiAJaSA9IDA7CkBAIC0xMTA3LDcgKzEwNDcsNiBAQAogCQljdHJfcHJlbG9hZFtpXSA9ICAgIHBuX3ZlY3RvclsxMyAtIGldOwkgIC8qIGN0cl9wcmVsb2FkWzg6MTNdID0gUE5bNTowXSAqLwogCWN0cl9wcmVsb2FkWzE0XSA9ICAodW5zaWduZWQgY2hhcikgKGMgLyAyNTYpOyAvKiBDdHIgKi8KIAljdHJfcHJlbG9hZFsxNV0gPSAgKHVuc2lnbmVkIGNoYXIpIChjICUgMjU2KTsKLV9mdW5jX2V4aXRfOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTExNywxMCArMTA1Niw4IEBACiBzdGF0aWMgdm9pZCBiaXR3aXNlX3hvcih1OCAqaW5hLCB1OCAqaW5iLCB1OCAqb3V0KQogewogCWludCBpOwotX2Z1bmNfZW50ZXJfOwogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQogCQlvdXRbaV0gPSBpbmFbaV0gXiBpbmJbaV07Ci1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIGludCBhZXNfY2lwaGVyKHU4ICprZXksIHVpbnQgaGRybGVuLCB1OCAqcGZyYW1lLCB1aW50IHBsZW4pCkBAIC0xMTQyLDcgKzEwNzksNiBAQAogCXVpbnQJZnJ0eXBlICA9IEdldEZyYW1lVHlwZShwZnJhbWUpOwogCXVpbnQJZnJzdWJ0eXBlICA9IEdldEZyYW1lU3ViVHlwZShwZnJhbWUpOwogCi1fZnVuY19lbnRlcl87CiAJZnJzdWJ0eXBlID0gZnJzdWJ0eXBlPj40OwogCiAJX3J0d19tZW1zZXQoKHZvaWQgKiltaWNfaXYsIDAsIDE2KTsKQEAgLTEyNTMsNyArMTE4OSw2IEBACiAJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKIAlmb3IgKGogPSAwOyBqIDwgODsgaisrKQogCQlwZnJhbWVbcGF5bG9hZF9pbmRleCsrXSA9IGNoYWluX2J1ZmZlcltqXTsKLV9mdW5jX2V4aXRfOwogCXJldHVybiBfU1VDQ0VTUzsKIH0KIApAQCAtMTI3NCw3ICsxMjA5LDYgQEAKIAogLyoJdWludAlvZmZzZXQgPSAwOyAqLwogCXUzMiByZXMgPSBfU1VDQ0VTUzsKLV9mdW5jX2VudGVyXzsKIAogCWlmICgoKHN0cnVjdCB4bWl0X2ZyYW1lICopcHhtaXRmcmFtZSktPmJ1Zl9hZGRyID09IE5VTEwpCiAJCXJldHVybiBfRkFJTDsKQEAgLTEzMTgsNyArMTI1Miw2IEBACiAJfQogCiAKLV9mdW5jX2V4aXRfOwogCQlyZXR1cm4gcmVzOwogfQogCkBAIC0xMzQ0LDcgKzEyNzcsNiBAQAogLyoJdWludAlvZmZzZXQgPSAwOyAqLwogCXVpbnQJZnJ0eXBlICA9IEdldEZyYW1lVHlwZShwZnJhbWUpOwogCXVpbnQJZnJzdWJ0eXBlICA9IEdldEZyYW1lU3ViVHlwZShwZnJhbWUpOwotX2Z1bmNfZW50ZXJfOwogCWZyc3VidHlwZSA9IGZyc3VidHlwZT4+NDsKIAogCV9ydHdfbWVtc2V0KCh2b2lkICopbWljX2l2LCAwLCAxNik7CkBAIC0xNTE0LDcgKzE0NDYsNiBAQAogCQkJcmVzID0gX0ZBSUw7CiAJCX0KIAl9Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC0xNTI0LDExICsxNDU1LDEwIEBACiAJaW50CQlsZW5ndGg7CiAJdTgJKnBmcmFtZSwgKnByd3NrZXk7CS8qICAqcGF5bG9hZCwqaXYgKi8KIAlzdHJ1Y3QJc3RhX2luZm8JCSpzdGFpbmZvOwotCXN0cnVjdAlyeF9wa3RfYXR0cmliCSAqcHJ4YXR0cmliID0gJigodW5pb24gcmVjdl9mcmFtZSAqKXByZWN2ZnJhbWUpLT51Lmhkci5hdHRyaWI7CisJc3RydWN0CXJ4X3BrdF9hdHRyaWIJICpwcnhhdHRyaWIgPSAmKChzdHJ1Y3QgcmVjdl9mcmFtZSAqKXByZWN2ZnJhbWUpLT5hdHRyaWI7CiAJc3RydWN0CXNlY3VyaXR5X3ByaXYJKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKIAl1MzIJcmVzID0gX1NVQ0NFU1M7Ci1fZnVuY19lbnRlcl87Ci0JcGZyYW1lID0gKHVuc2lnbmVkIGNoYXIgKikoKHVuaW9uIHJlY3ZfZnJhbWUgKilwcmVjdmZyYW1lKS0+dS5oZHIucnhfZGF0YTsKKwlwZnJhbWUgPSAodW5zaWduZWQgY2hhciAqKSgoc3RydWN0IHJlY3ZfZnJhbWUgKilwcmVjdmZyYW1lKS0+cnhfZGF0YTsKIAkvKiA0IHN0YXJ0IHRvIGVuY3J5cHQgZWFjaCBmcmFnbWVudCAqLwogCWlmICgocHJ4YXR0cmliLT5lbmNyeXB0ID09IF9BRVNfKSkgewogCQlzdGFpbmZvID0gcnR3X2dldF9zdGFpbmZvKCZwYWRhcHRlci0+c3RhcHJpdiwgJnByeGF0dHJpYi0+dGFbMF0pOwpAQCAtMTU1MiwxNCArMTQ4MiwxMyBAQAogCQkJfSBlbHNlIHsKIAkJCQlwcndza2V5ID0gJnN0YWluZm8tPmRvdDExODAyMXhfVW5jc3RLZXkuc2tleVswXTsKIAkJCX0KLQkJCWxlbmd0aCA9ICgodW5pb24gcmVjdl9mcmFtZSAqKXByZWN2ZnJhbWUpLT51Lmhkci5sZW4tcHJ4YXR0cmliLT5oZHJsZW4tcHJ4YXR0cmliLT5pdl9sZW47CisJCQlsZW5ndGggPSAoKHN0cnVjdCByZWN2X2ZyYW1lICopcHJlY3ZmcmFtZSktPmxlbi1wcnhhdHRyaWItPmhkcmxlbi1wcnhhdHRyaWItPml2X2xlbjsKIAkJCXJlcyA9IGFlc19kZWNpcGhlcihwcndza2V5LCBwcnhhdHRyaWItPmhkcmxlbiwgcGZyYW1lLCBsZW5ndGgpOwogCQl9IGVsc2UgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sICgicnR3X2Flc19lbmNyeXB0OiBzdGFpbmZvPT1OVUxMISEhXG4iKSk7CiAJCQlyZXMgPSBfRkFJTDsKIAkJfQogCX0KLV9mdW5jX2V4aXRfOwogZXhpdDoKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTc2Nyw3ICsxNjk2LDYgQEAKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLCAoIl5eXnJ0d191c2VfdGtpcGtleV9oYW5kbGVyIF5eXlxuIikpOwogCkBAIC0xNzc1LDUgKzE3MDMsNCBAQAogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sICgiXl5ecnR3X3VzZV90a2lwa2V5X2hhbmRsZXIgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleT0lZF5eXlxuIiwgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleSkpOwogCi1fZnVuY19leGl0XzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc3RhX21ndC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zdGFfbWd0LmMKaW5kZXggMDJlMWUxZi4uMmQwYjYwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zdGFfbWd0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zdGFfbWd0LmMKQEAgLTI1LDEwICsyNSwxMCBAQAogI2luY2x1ZGUgPHhtaXRfb3NkZXAuaD4KICNpbmNsdWRlIDxtbG1lX29zZGVwLmg+CiAjaW5jbHVkZSA8c3RhX2luZm8uaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKIHN0YXRpYyB2b2lkIF9ydHdfaW5pdF9zdGFpbmZvKHN0cnVjdCBzdGFfaW5mbyAqcHN0YSkKIHsKLV9mdW5jX2VudGVyXzsKIAlfcnR3X21lbXNldCgodTggKilwc3RhLCAwLCBzaXplb2YgKHN0cnVjdCBzdGFfaW5mbykpOwogCiAJIHNwaW5fbG9ja19pbml0KCZwc3RhLT5sb2NrKTsKQEAgLTY5LDcgKzY5LDYgQEAKIAogI2VuZGlmCS8qICBDT05GSUdfODhFVV9BUF9NT0RFICovCiAKLV9mdW5jX2V4aXRfOwogfQogCiB1MzIJX3J0d19pbml0X3N0YV9wcml2KHN0cnVjdAlzdGFfcHJpdiAqcHN0YXByaXYpCkBAIC03Nyw5ICs3Niw4IEBACiAJc3RydWN0IHN0YV9pbmZvICpwc3RhOwogCXMzMiBpOwogCi1fZnVuY19lbnRlcl87CiAKLQlwc3RhcHJpdi0+cGFsbG9jYXRlZF9zdGFpbmZvX2J1ZiA9IHJ0d196dm1hbGxvYyhzaXplb2Yoc3RydWN0IHN0YV9pbmZvKSAqIE5VTV9TVEEgKyA0KTsKKwlwc3RhcHJpdi0+cGFsbG9jYXRlZF9zdGFpbmZvX2J1ZiA9IHZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdGFfaW5mbykgKiBOVU1fU1RBICsgNCk7CiAKIAlpZiAoIXBzdGFwcml2LT5wYWxsb2NhdGVkX3N0YWluZm9fYnVmKQogCQlyZXR1cm4gX0ZBSUw7CkBAIC0xMjUsNyArMTIzLDYgQEAKIAlwc3RhcHJpdi0+bWF4X251bV9zdGEgPSBOVU1fU1RBOwogI2VuZGlmCiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIF9TVUNDRVNTOwogfQpAQCAtMTU0LDIxICsxNTEsMTkgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdCwgKnBoZWFkOwogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7CiAKLV9mdW5jX2VudGVyXzsKIAogCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKCZwc3RhcHJpdi0+ZnJlZV9zdGFfcXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpID09IGZhbHNlKSB7Ci0JCXBzdGEgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHN0YV9pbmZvICwgbGlzdCk7Ci0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwc3RhID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8gLCBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwogCi1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHZvaWQgcnR3X21mcmVlX3N0YV9wcml2X2xvY2soc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdikKQEAgLTE4MywyMiArMTc4LDIxIEBACiAJc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsOwogCWludAlpbmRleDsKIAotX2Z1bmNfZW50ZXJfOwogCWlmIChwc3RhcHJpdikgewogCQkvKglkZWxldGUgYWxsIHJlb3JkZXJpbmdfY3RybF90aW1lcgkJKi8KIAkJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7CiAJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9TVEE7IGluZGV4KyspIHsKIAkJCXBoZWFkID0gJihwc3RhcHJpdi0+c3RhX2hhc2hbaW5kZXhdKTsKLQkJCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCQkJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCQkJd2hpbGUgKChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSA9PSBmYWxzZSkgewogCQkJCWludCBpOwotCQkJCXBzdGEgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHN0YV9pbmZvICwgaGFzaF9saXN0KTsKLQkJCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJCQlwc3RhID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8gLCBoYXNoX2xpc3QpOworCQkJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKIAkJCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogCQkJCQlwcmVvcmRlcl9jdHJsID0gJnBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbaV07Ci0JCQkJCV9jYW5jZWxfdGltZXJfZXgoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lcik7CisJCQkJCWRlbF90aW1lcl9zeW5jKCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMjA4LDEwICsyMDIsOSBAQAogCQlydHdfbWZyZWVfc3RhX3ByaXZfbG9jayhwc3RhcHJpdik7CiAKIAkJaWYgKHBzdGFwcml2LT5wYWxsb2NhdGVkX3N0YWluZm9fYnVmKQotCQkJcnR3X3ZtZnJlZShwc3RhcHJpdi0+cGFsbG9jYXRlZF9zdGFpbmZvX2J1Ziwgc2l6ZW9mKHN0cnVjdCBzdGFfaW5mbykqTlVNX1NUQSs0KTsKKwkJCXZmcmVlKHBzdGFwcml2LT5wYWxsb2NhdGVkX3N0YWluZm9fYnVmKTsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCXJldHVybiBfU1VDQ0VTUzsKIH0KIApAQCAtMjI1LDcgKzIxOCw2IEBACiAJaW50IGkgPSAwOwogCXUxNiAgd1J4U2VxSW5pdGlhbFZhbHVlID0gMHhmZmZmOwogCi1fZnVuY19lbnRlcl87CiAKIAlwZnJlZV9zdGFfcXVldWUgPSAmcHN0YXByaXYtPmZyZWVfc3RhX3F1ZXVlOwogCkBAIC0yMzUsNyArMjI3LDcgQEAKIAkJc3Bpbl91bmxvY2tfYmgoJnBmcmVlX3N0YV9xdWV1ZS0+bG9jayk7CiAJCXBzdGEgPSBOVUxMOwogCX0gZWxzZSB7Ci0JCXBzdGEgPSBMSVNUX0NPTlRBSU5PUihnZXRfbmV4dCgmcGZyZWVfc3RhX3F1ZXVlLT5xdWV1ZSksIHN0cnVjdCBzdGFfaW5mbywgbGlzdCk7CisJCXBzdGEgPSBjb250YWluZXJfb2YoKCZwZnJlZV9zdGFfcXVldWUtPnF1ZXVlKS0+bmV4dCwgc3RydWN0IHN0YV9pbmZvLCBsaXN0KTsKIAkJcnR3X2xpc3RfZGVsZXRlKCYocHN0YS0+bGlzdCkpOwogCQlzcGluX3VubG9ja19iaCgmcGZyZWVfc3RhX3F1ZXVlLT5sb2NrKTsKIAkJX3J0d19pbml0X3N0YWluZm8ocHN0YSk7CkBAIC0yOTcsOSArMjg5LDYgQEAKIAl9CiAKIGV4aXQ6Ci0KLV9mdW5jX2V4aXRfOwotCiAJcmV0dXJuIHBzdGE7CiB9CiAKQEAgLTMxMyw3ICszMDIsNiBAQAogCXN0cnVjdAl4bWl0X3ByaXYJKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7CiAJc3RydWN0CXN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBzdGEgPT0gTlVMTCkKIAkJZ290byBleGl0OwpAQCAtMzUzLDMyICszNDEsMzQgQEAKIAlfcnR3X2luaXRfc3RhX3htaXRfcHJpdigmcHN0YS0+c3RhX3htaXRwcml2KTsKIAlfcnR3X2luaXRfc3RhX3JlY3ZfcHJpdigmcHN0YS0+c3RhX3JlY3Zwcml2KTsKIAotCV9jYW5jZWxfdGltZXJfZXgoJnBzdGEtPmFkZGJhX3JldHJ5X3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmcHN0YS0+YWRkYmFfcmV0cnlfdGltZXIpOwogCiAJLyogZm9yIEEtTVBEVSBSeCByZW9yZGVyaW5nIGJ1ZmZlciBjb250cm9sLCBjYW5jZWwgcmVvcmRlcmluZ19jdHJsX3RpbWVyICovCiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKIAkJc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQsICpwbGlzdDsKLQkJdW5pb24gcmVjdl9mcmFtZSAqcHJmcmFtZTsKKwkJc3RydWN0IHJlY3ZfZnJhbWUgKnByaGRyOworCQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZTsKIAkJc3RydWN0IF9fcXVldWUgKnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKIAkJc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUgPSAmcGFkYXB0ZXItPnJlY3Zwcml2LmZyZWVfcmVjdl9xdWV1ZTsKIAogCQlwcmVvcmRlcl9jdHJsID0gJnBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbaV07CiAKLQkJX2NhbmNlbF90aW1lcl9leCgmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyKTsKKwkJZGVsX3RpbWVyX3N5bmMoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lcik7CiAKIAkJcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlID0gJnByZW9yZGVyX2N0cmwtPnBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlOwogCiAJCXNwaW5fbG9ja19iaCgmcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlLT5sb2NrKTsKIAogCQlwaGVhZCA9CQlnZXRfbGlzdF9oZWFkKHBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZSk7Ci0JCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCQlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJCXdoaWxlICghcnR3X2lzX2xpc3RfZW1wdHkocGhlYWQpKSB7Ci0JCQlwcmZyYW1lID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHVuaW9uIHJlY3ZfZnJhbWUsIHUpOworCQkJcHJoZHIgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCByZWN2X2ZyYW1lLCBsaXN0KTsKKwkJCXByZnJhbWUgPSAoc3RydWN0IHJlY3ZfZnJhbWUgKilwcmhkcjsKIAotCQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCi0JCQlydHdfbGlzdF9kZWxldGUoJihwcmZyYW1lLT51Lmhkci5saXN0KSk7CisJCQlydHdfbGlzdF9kZWxldGUoJihwcmZyYW1lLT5saXN0KSk7CiAKIAkJCXJ0d19mcmVlX3JlY3ZmcmFtZShwcmZyYW1lLCBwZnJlZV9yZWN2X3F1ZXVlKTsKIAkJfQpAQCAtNDI4LDcgKzQxOCw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIF9TVUNDRVNTOwogfQpAQCAtNDQyLDMyICs0MzEsMjYgQEAKIAlzdHJ1Y3QJc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwogCXN0cnVjdCBzdGFfaW5mbyAqcGJjbWNfc3RhaW5mbyA9IHJ0d19nZXRfYmNtY19zdGFpbmZvKHBhZGFwdGVyKTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBzdGFwcml2LT5hc29jX3N0YV9jb3VudCA9PSAxKQotCQlnb3RvIGV4aXQ7CisJCXJldHVybjsKIAogCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwogCiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX1NUQTsgaW5kZXgrKykgewogCQlwaGVhZCA9ICYocHN0YXByaXYtPnN0YV9oYXNoW2luZGV4XSk7Ci0JCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCQlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJCXdoaWxlICgoIXJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpKSB7Ci0JCQlwc3RhID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCBzdGFfaW5mbyAsIGhhc2hfbGlzdCk7CisJCQlwc3RhID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8gLCBoYXNoX2xpc3QpOwogCi0JCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKIAkJCWlmIChwYmNtY19zdGFpbmZvICE9IHBzdGEpCiAJCQkJcnR3X2ZyZWVfc3RhaW5mbyhwYWRhcHRlciAsIHBzdGEpOwogCQl9CiAJfQotCiAJc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQotZXhpdDoKLQotX2Z1bmNfZXhpdF87CiB9CiAKIC8qIGFueSBzdGF0aW9uIGFsbG9jYXRlZCBjYW4gYmUgc2VhcmNoZWQgYnkgaGFzaCBsaXN0ICovCkBAIC00NzksNyArNDYyLDYgQEAKIAl1OCAqYWRkcjsKIAl1OCBiY19hZGRyW0VUSF9BTEVOXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKGh3YWRkciA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKQEAgLTQ5NCwyMSArNDc2LDIwIEBACiAJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7CiAKIAlwaGVhZCA9ICYocHN0YXByaXYtPnN0YV9oYXNoW2luZGV4XSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICgoIXJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpKSB7Ci0JCXBzdGEgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBoYXNoX2xpc3QpOworCQlwc3RhID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGhhc2hfbGlzdCk7CiAKLQkJaWYgKChfcnR3X21lbWNtcChwc3RhLT5od2FkZHIsIGFkZHIsIEVUSF9BTEVOKSkgPT0gdHJ1ZSkgeworCQlpZiAoKCFtZW1jbXAocHN0YS0+aHdhZGRyLCBhZGRyLCBFVEhfQUxFTikpID09IHRydWUpIHsKIAkJCS8qICBpZiBmb3VuZCB0aGUgbWF0Y2hlZCBhZGRyZXNzICovCiAJCQlicmVhazsKIAkJfQogCQlwc3RhID0gTlVMTDsKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLV9mdW5jX2V4aXRfOwogCXJldHVybiBwc3RhOwogfQogCkBAIC01MTksNyArNTAwLDYgQEAKIAl1bnNpZ25lZCBjaGFyIGJjYXN0X2FkZHJbRVRIX0FMRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwogCXN0cnVjdAlzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7CiAKLV9mdW5jX2VudGVyXzsKIAogCXBzdGEgPSBydHdfYWxsb2Nfc3RhaW5mbyhwc3RhcHJpdiwgYmNhc3RfYWRkcik7CiAKQEAgLTUzMyw3ICs1MTMsNiBAQAogCXBzdGEtPm1hY19pZCA9IDE7CiAKIGV4aXQ6Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC01NDIsOSArNTIxLDcgQEAKIAlzdHJ1Y3Qgc3RhX2luZm8JCSpwc3RhOwogCXN0cnVjdCBzdGFfcHJpdgkJKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwogCXU4IGJjX2FkZHJbRVRIX0FMRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotX2Z1bmNfZW50ZXJfOwogCSBwc3RhID0gcnR3X2dldF9zdGFpbmZvKHBzdGFwcml2LCBiY19hZGRyKTsKLV9mdW5jX2V4aXRfOwogCXJldHVybiBwc3RhOwogfQogCkBAIC01NjEsMTIgKzUzOCwxMiBAQAogCiAJc3Bpbl9sb2NrX2JoKCYocGFjbF9ub2RlX3EtPmxvY2spKTsKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocGFjbF9ub2RlX3EpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAJd2hpbGUgKCghcnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkpIHsKLQkJcGFjbG5vZGUgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHJ0d193bGFuX2FjbF9ub2RlLCBsaXN0KTsKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBhY2xub2RlID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcnR3X3dsYW5fYWNsX25vZGUsIGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCi0JCWlmIChfcnR3X21lbWNtcChwYWNsbm9kZS0+YWRkciwgbWFjX2FkZHIsIEVUSF9BTEVOKSkgeworCQlpZiAoIW1lbWNtcChwYWNsbm9kZS0+YWRkciwgbWFjX2FkZHIsIEVUSF9BTEVOKSkgewogCQkJaWYgKHBhY2xub2RlLT52YWxpZCkgewogCQkJCW1hdGNoID0gdHJ1ZTsKIAkJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfd2xhbl91dGlsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3dsYW5fdXRpbC5jCmluZGV4IDk2ZGY2MmYuLjNkZDkwNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfd2xhbl91dGlsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d193bGFuX3V0aWwuYwpAQCAtOTI5LDcgKzkyOSw3IEBACiAJCXJldHVybiBfRkFJTDsKIAl9CiAKLQlpZiAoX3J0d19tZW1jbXAoY3VyX25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywgcGJzc2lkLCA2KSA9PSBmYWxzZSkgeworCWlmICghbWVtY21wKGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsIHBic3NpZCwgNikgPT0gZmFsc2UpIHsKIAkJREJHXzg4RSgiT29wczogcnR3X2NoZWNrX25ldHdvcmtfZW5jcnlwdCBsaW5rZWQgYnV0IHJlY3Ygb3RoZXIgYnNzaWQgYmNuXG4lcE0gJXBNXG4iLAogCQkJKHBic3NpZCksIChjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzKSk7CiAJCXJldHVybiB0cnVlOwpAQCAtMTAxNCw3ICsxMDE0LDcgQEAKIAkJCQlic3NpZC0+U3NpZC5Tc2lkTGVuZ3RoLCBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLlNzaWQsCiAJCQkJY3VyX25ldHdvcmstPm5ldHdvcmsuU3NpZC5Tc2lkTGVuZ3RoKSk7CiAKLQlpZiAoIV9ydHdfbWVtY21wKGJzc2lkLT5Tc2lkLlNzaWQsIGN1cl9uZXR3b3JrLT5uZXR3b3JrLlNzaWQuU3NpZCwgMzIpIHx8CisJaWYgKG1lbWNtcChic3NpZC0+U3NpZC5Tc2lkLCBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLlNzaWQsIDMyKSB8fAogCSAgICBic3NpZC0+U3NpZC5Tc2lkTGVuZ3RoICE9IGN1cl9uZXR3b3JrLT5uZXR3b3JrLlNzaWQuU3NpZExlbmd0aCkgewogCQlpZiAoYnNzaWQtPlNzaWQuU3NpZFswXSAhPSAnXDAnICYmIGJzc2lkLT5Tc2lkLlNzaWRMZW5ndGggIT0gMCkgeyAvKiBub3QgaGlkZGVuIHNzaWQgKi8KIAkJCURCR184OEUoIiVzKCksIFNTSUQgaXMgbm90IG1hdGNoIHJldHVybiBGQUlMXG4iLCBfX2Z1bmNfXyk7CkBAIC0xMDUwLDcgKzEwNTAsNyBAQAogCX0KIAogCWlmIChjdXJfbmV0d29yay0+QmNuSW5mby5lbmNyeXBfcHJvdG9jb2wgIT0gZW5jcnlwX3Byb3RvY29sKSB7Ci0JCURCR184OEUoIiVzKCk6IGVuY3R5cCBpcyBub3QgbWF0Y2ggLCByZXR1cm4gRkFJTFxuIiwgX19mdW5jX18pOworCQlEQkdfODhFKCIlcygpOiBlbmNyeXB0aW9uIHByb3RvY29sIGlzIG5vdCBtYXRjaCAsIHJldHVybiBGQUlMXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gX21pc21hdGNoOwogCX0KIApAQCAtMTA5MCwxMiArMTA5MCwxMCBAQAogCX0KIAogCWtmcmVlKGJzc2lkKTsKLQlfZnVuY19leGl0XzsKIAlyZXR1cm4gX1NVQ0NFU1M7CiAKIF9taXNtYXRjaDoKIAlrZnJlZShic3NpZCk7Ci0JX2Z1bmNfZXhpdF87CiAJcmV0dXJuIF9GQUlMOwogfQogCkBAIC0xMTQxLDExICsxMTM5LDExIEBACiAKIAkJCXN3aXRjaCAocElFLT5FbGVtZW50SUQpIHsKIAkJCWNhc2UgX1ZFTkRPUl9TUEVDSUZJQ19JRV86Ci0JCQkJaWYgKChfcnR3X21lbWNtcChwSUUtPmRhdGEsIFJUV19XUEFfT1VJLCA0KSkgJiYgKF9ydHdfbWVtY21wKChwSUUtPmRhdGEgKyAxMiksIFdQQV9US0lQX0NJUEhFUiwgNCkpKQorCQkJCWlmICgoIW1lbWNtcChwSUUtPmRhdGEsIFJUV19XUEFfT1VJLCA0KSkgJiYgKCFtZW1jbXAoKHBJRS0+ZGF0YSArIDEyKSwgV1BBX1RLSVBfQ0lQSEVSLCA0KSkpCiAJCQkJCXJldHVybiB0cnVlOwogCQkJCWJyZWFrOwogCQkJY2FzZSBfUlNOX0lFXzJfOgotCQkJCWlmIChfcnR3X21lbWNtcCgocElFLT5kYXRhICsgOCksIFJTTl9US0lQX0NJUEhFUiwgNCkpCisJCQkJaWYgKCFtZW1jbXAoKHBJRS0+ZGF0YSArIDgpLCBSU05fVEtJUF9DSVBIRVIsIDQpKQogCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCWRlZmF1bHQ6CiAJCQkJYnJlYWs7CkBAIC0xMTcyLDE0ICsxMTcwLDE0IEBACiAKIAkJCXN3aXRjaCAocElFLT5FbGVtZW50SUQpIHsKIAkJCWNhc2UgX1ZFTkRPUl9TUEVDSUZJQ19JRV86Ci0JCQkJaWYgKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgUlRXX1dQQV9PVUksIDQpICYmCi0JCQkJICAgICgoX3J0d19tZW1jbXAoKHBJRS0+ZGF0YSArIDEyKSwgV1BBX0NJUEhFUl9TVUlURV9DQ01QLCA0KSkgfHwKLQkJCQkgICAgKF9ydHdfbWVtY21wKChwSUUtPmRhdGEgKyAxNiksIFdQQV9DSVBIRVJfU1VJVEVfQ0NNUCwgNCkpKSkKKwkJCQlpZiAoIW1lbWNtcChwSUUtPmRhdGEsIFJUV19XUEFfT1VJLCA0KSAmJgorCQkJCSAgICAoKCFtZW1jbXAoKHBJRS0+ZGF0YSArIDEyKSwgV1BBX0NJUEhFUl9TVUlURV9DQ01QLCA0KSkgfHwKKwkJCQkgICAgKCFtZW1jbXAoKHBJRS0+ZGF0YSArIDE2KSwgV1BBX0NJUEhFUl9TVUlURV9DQ01QLCA0KSkpKQogCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJYnJlYWs7CiAJCQljYXNlIF9SU05fSUVfMl86Ci0JCQkJaWYgICgoX3J0d19tZW1jbXAoKHBJRS0+ZGF0YSArIDgpLCBSU05fQ0lQSEVSX1NVSVRFX0NDTVAsIDQpKSAgfHwKLQkJCQkgICAgICAgKF9ydHdfbWVtY21wKChwSUUtPmRhdGEgKyAxMiksIFJTTl9DSVBIRVJfU1VJVEVfQ0NNUCwgNCkpKQorCQkJCWlmICAoKCFtZW1jbXAoKHBJRS0+ZGF0YSArIDgpLCBSU05fQ0lQSEVSX1NVSVRFX0NDTVAsIDQpKSAgfHwKKwkJCQkgICAgICAgKCFtZW1jbXAoKHBJRS0+ZGF0YSArIDEyKSwgUlNOX0NJUEhFUl9TVUlURV9DQ01QLCA0KSkpCiAJCQkJCXJldHVybiBmYWxzZTsKIAkJCWRlZmF1bHQ6CiAJCQkJYnJlYWs7CkBAIC0xMjA4LDcgKzEyMDYsNyBAQAogCiAJCQlzd2l0Y2ggKHBJRS0+RWxlbWVudElEKSB7CiAJCQljYXNlIF9WRU5ET1JfU1BFQ0lGSUNfSUVfOgotCQkJCWlmIChfcnR3X21lbWNtcChwSUUtPmRhdGEsIFJUV19XUEFfT1VJLCA0KSkKKwkJCQlpZiAoIW1lbWNtcChwSUUtPmRhdGEsIFJUV19XUEFfT1VJLCA0KSkKIAkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCWJyZWFrOwogCQkJY2FzZSBfUlNOX0lFXzJfOgpAQCAtMTQwMCwzNSArMTM5OCwzNSBAQAogCiAJCXN3aXRjaCAocElFLT5FbGVtZW50SUQpIHsKIAkJY2FzZSBfVkVORE9SX1NQRUNJRklDX0lFXzoKLQkJCWlmICgoX3J0d19tZW1jbXAocElFLT5kYXRhLCBBUlRIRVJPU19PVUkxLCAzKSkgfHwKLQkJCSAgICAoX3J0d19tZW1jbXAocElFLT5kYXRhLCBBUlRIRVJPU19PVUkyLCAzKSkpIHsKKwkJCWlmICgoIW1lbWNtcChwSUUtPmRhdGEsIEFSVEhFUk9TX09VSTEsIDMpKSB8fAorCQkJICAgICghbWVtY21wKHBJRS0+ZGF0YSwgQVJUSEVST1NfT1VJMiwgMykpKSB7CiAJCQkJREJHXzg4RSgibGluayB0byBBcnRoZXJvcyBBUFxuIik7CiAJCQkJcmV0dXJuIEhUX0lPVF9QRUVSX0FUSEVST1M7Ci0JCQl9IGVsc2UgaWYgKChfcnR3X21lbWNtcChwSUUtPmRhdGEsIEJST0FEQ09NX09VSTEsIDMpKSB8fAotCQkJCSAgIChfcnR3X21lbWNtcChwSUUtPmRhdGEsIEJST0FEQ09NX09VSTIsIDMpKSB8fAotCQkJCSAgIChfcnR3X21lbWNtcChwSUUtPmRhdGEsIEJST0FEQ09NX09VSTIsIDMpKSkgeworCQkJfSBlbHNlIGlmICgoIW1lbWNtcChwSUUtPmRhdGEsIEJST0FEQ09NX09VSTEsIDMpKSB8fAorCQkJCSAgICghbWVtY21wKHBJRS0+ZGF0YSwgQlJPQURDT01fT1VJMiwgMykpIHx8CisJCQkJICAgKCFtZW1jbXAocElFLT5kYXRhLCBCUk9BRENPTV9PVUkyLCAzKSkpIHsKIAkJCQlEQkdfODhFKCJsaW5rIHRvIEJyb2FkY29tIEFQXG4iKTsKIAkJCQlyZXR1cm4gSFRfSU9UX1BFRVJfQlJPQURDT007Ci0JCQl9IGVsc2UgaWYgKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgTUFSVkVMTF9PVUksIDMpKSB7CisJCQl9IGVsc2UgaWYgKCFtZW1jbXAocElFLT5kYXRhLCBNQVJWRUxMX09VSSwgMykpIHsKIAkJCQlEQkdfODhFKCJsaW5rIHRvIE1hcnZlbGwgQVBcbiIpOwogCQkJCXJldHVybiBIVF9JT1RfUEVFUl9NQVJWRUxMOwotCQkJfSBlbHNlIGlmIChfcnR3X21lbWNtcChwSUUtPmRhdGEsIFJBTElOS19PVUksIDMpKSB7CisJCQl9IGVsc2UgaWYgKCFtZW1jbXAocElFLT5kYXRhLCBSQUxJTktfT1VJLCAzKSkgewogCQkJCWlmICghcmFsaW5rX3ZlbmRvcl9mbGFnKSB7CiAJCQkJCXJhbGlua192ZW5kb3JfZmxhZyA9IDE7CiAJCQkJfSBlbHNlIHsKIAkJCQkJREJHXzg4RSgibGluayB0byBSYWxpbmsgQVBcbiIpOwogCQkJCQlyZXR1cm4gSFRfSU9UX1BFRVJfUkFMSU5LOwogCQkJCX0KLQkJCX0gZWxzZSBpZiAoX3J0d19tZW1jbXAocElFLT5kYXRhLCBDSVNDT19PVUksIDMpKSB7CisJCQl9IGVsc2UgaWYgKCFtZW1jbXAocElFLT5kYXRhLCBDSVNDT19PVUksIDMpKSB7CiAJCQkJREJHXzg4RSgibGluayB0byBDaXNjbyBBUFxuIik7CiAJCQkJcmV0dXJuIEhUX0lPVF9QRUVSX0NJU0NPOwotCQkJfSBlbHNlIGlmIChfcnR3X21lbWNtcChwSUUtPmRhdGEsIFJFQUxURUtfT1VJLCAzKSkgeworCQkJfSBlbHNlIGlmICghbWVtY21wKHBJRS0+ZGF0YSwgUkVBTFRFS19PVUksIDMpKSB7CiAJCQkJREJHXzg4RSgibGluayB0byBSZWFsdGVrIDk2QlxuIik7CiAJCQkJcmV0dXJuIEhUX0lPVF9QRUVSX1JFQUxURUs7Ci0JCQl9IGVsc2UgaWYgKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgQUlSR09DQVBfT1VJLCAzKSkgeworCQkJfSBlbHNlIGlmICghbWVtY21wKHBJRS0+ZGF0YSwgQUlSR09DQVBfT1VJLCAzKSkgewogCQkJCURCR184OEUoImxpbmsgdG8gQWlyZ28gQ2FwXG4iKTsKIAkJCQlyZXR1cm4gSFRfSU9UX1BFRVJfQUlSR087Ci0JCQl9IGVsc2UgaWYgKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgRVBJR1JBTV9PVUksIDMpKSB7CisJCQl9IGVsc2UgaWYgKCFtZW1jbXAocElFLT5kYXRhLCBFUElHUkFNX09VSSwgMykpIHsKIAkJCQllcGlncmFtX3ZlbmRvcl9mbGFnID0gMTsKIAkJCQlpZiAocmFsaW5rX3ZlbmRvcl9mbGFnKSB7CiAJCQkJCURCR184OEUoImxpbmsgdG8gVGVuZGEgVzMxMVIgQVBcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d194bWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3htaXQuYwppbmRleCAyNDE4MmZiLi44ZDQyNjVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3htaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3htaXQuYwpAQCAtMjMsMjUgKzIzLDIyIEBACiAjaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+CiAjaW5jbHVkZSA8d2lmaS5oPgogI2luY2x1ZGUgPG9zZGVwX2ludGYuaD4KLSNpbmNsdWRlIDxpcC5oPgogI2luY2x1ZGUgPHVzYl9vcHMuaD4KICNpbmNsdWRlIDx1c2Jfb3NpbnRmLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiBzdGF0aWMgdTggUDgwMl8xSF9PVUlbUDgwMjExX09VSV9MRU5dID0geyAweDAwLCAweDAwLCAweGY4IH07CiBzdGF0aWMgdTggUkZDMTA0Ml9PVUlbUDgwMjExX09VSV9MRU5dID0geyAweDAwLCAweDAwLCAweDAwIH07CiAKIHN0YXRpYyB2b2lkIF9pbml0X3R4c2VydnEoc3RydWN0IHR4X3NlcnZxICpwdHhzZXJ2cSkKIHsKLV9mdW5jX2VudGVyXzsKIAlfcnR3X2luaXRfbGlzdGhlYWQoJnB0eHNlcnZxLT50eF9wZW5kaW5nKTsKIAlfcnR3X2luaXRfcXVldWUoJnB0eHNlcnZxLT5zdGFfcGVuZGluZyk7CiAJcHR4c2VydnEtPnFjbnQgPSAwOwotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQJX3J0d19pbml0X3N0YV94bWl0X3ByaXYoc3RydWN0IHN0YV94bWl0X3ByaXYgKnBzdGFfeG1pdHByaXYpCiB7Ci1fZnVuY19lbnRlcl87CiAJX3J0d19tZW1zZXQoKHVuc2lnbmVkIGNoYXIgKilwc3RhX3htaXRwcml2LCAwLCBzaXplb2YgKHN0cnVjdCBzdGFfeG1pdF9wcml2KSk7CiAJc3Bpbl9sb2NrX2luaXQoJnBzdGFfeG1pdHByaXYtPmxvY2spOwogCV9pbml0X3R4c2VydnEoJnBzdGFfeG1pdHByaXYtPmJlX3EpOwpAQCAtNTEsNyArNDgsNiBAQAogCV9ydHdfaW5pdF9saXN0aGVhZCgmcHN0YV94bWl0cHJpdi0+bGVnYWN5X2R6KTsKIAlfcnR3X2luaXRfbGlzdGhlYWQoJnBzdGFfeG1pdHByaXYtPmFwc2QpOwogCi1fZnVuY19leGl0XzsKIH0KIAogczMyCV9ydHdfaW5pdF94bWl0X3ByaXYoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LCBzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCkBAIC02Myw5ICs1OSw4IEBACiAJdTMyIG1heF94bWl0X2V4dGJ1Zl9zaXplID0gTUFYX1hNSVRfRVhUQlVGX1NaOwogCXUzMiBudW1feG1pdF9leHRidWYgPSBOUl9YTUlUX0VYVEJVRkY7CiAKLV9mdW5jX2VudGVyXzsKIAotCS8qICBXZSBkb24ndCBuZWVkIHRvIG1lbXNldCBwYWRhcHRlci0+WFhYIHRvIHplcm8sIGJlY2F1c2UgYWRhcHRlciBpcyBhbGxvY2F0ZWQgYnkgcnR3X3p2bWFsbG9jKCkuICovCisJLyogIFdlIGRvbid0IG5lZWQgdG8gbWVtc2V0IHBhZGFwdGVyLT5YWFggdG8gemVybywgYmVjYXVzZSBhZGFwdGVyIGlzIGFsbG9jYXRlZCBieSB2emFsbG9jKCkuICovCiAKIAlzcGluX2xvY2tfaW5pdCgmcHhtaXRwcml2LT5sb2NrKTsKIAlzZW1hX2luaXQoJnB4bWl0cHJpdi0+eG1pdF9zZW1hLCAwKTsKQEAgLTkxLDcgKzg2LDcgQEAKIAlQbGVhc2UgYWxzbyBhcHBseSAgZnJlZV90eG9iaiB0byBsaW5rX3VwIGFsbCB0aGUgeG1pdF9mcmFtZXMuLi4KIAkqLwogCi0JcHhtaXRwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZiA9IHJ0d196dm1hbGxvYyhOUl9YTUlURlJBTUUgKiBzaXplb2Yoc3RydWN0IHhtaXRfZnJhbWUpICsgNCk7CisJcHhtaXRwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZiA9IHZ6YWxsb2MoTlJfWE1JVEZSQU1FICogc2l6ZW9mKHN0cnVjdCB4bWl0X2ZyYW1lKSArIDQpOwogCiAJaWYgKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYgID09IE5VTEwpIHsKIAkJcHhtaXRwcml2LT5weG1pdF9mcmFtZV9idWYgPSBOVUxMOwpAQCAtMTI5LDcgKzEyNCw3IEBACiAJX3J0d19pbml0X3F1ZXVlKCZweG1pdHByaXYtPmZyZWVfeG1pdGJ1Zl9xdWV1ZSk7CiAJX3J0d19pbml0X3F1ZXVlKCZweG1pdHByaXYtPnBlbmRpbmdfeG1pdGJ1Zl9xdWV1ZSk7CiAKLQlweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdGJ1ZiA9IHJ0d196dm1hbGxvYyhOUl9YTUlUQlVGRiAqIHNpemVvZihzdHJ1Y3QgeG1pdF9idWYpICsgNCk7CisJcHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRidWYgPSB2emFsbG9jKE5SX1hNSVRCVUZGICogc2l6ZW9mKHN0cnVjdCB4bWl0X2J1ZikgKyA0KTsKIAogCWlmIChweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdGJ1ZiAgPT0gTlVMTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLCAoImFsbG9jIHhtaXRfYnVmIGZhaWwhXG4iKSk7CkBAIC0xNzEsNyArMTY2LDcgQEAKIAkvKiAgSW5pdCB4bWl0IGV4dGVuc2lvbiBidWZmICovCiAJX3J0d19pbml0X3F1ZXVlKCZweG1pdHByaXYtPmZyZWVfeG1pdF9leHRidWZfcXVldWUpOwogCi0JcHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRfZXh0YnVmID0gcnR3X3p2bWFsbG9jKG51bV94bWl0X2V4dGJ1ZiAqIHNpemVvZihzdHJ1Y3QgeG1pdF9idWYpICsgNCk7CisJcHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRfZXh0YnVmID0gdnphbGxvYyhudW1feG1pdF9leHRidWYgKiBzaXplb2Yoc3RydWN0IHhtaXRfYnVmKSArIDQpOwogCiAJaWYgKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1ZiAgPT0gTlVMTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLCAoImFsbG9jIHhtaXRfZXh0YnVmIGZhaWwhXG4iKSk7CkBAIC0yMjYsNyArMjIxLDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMjQwLDEyICsyMzQsMTEgQEAKIAl1MzIgbWF4X3htaXRfZXh0YnVmX3NpemUgPSBNQVhfWE1JVF9FWFRCVUZfU1o7CiAJdTMyIG51bV94bWl0X2V4dGJ1ZiA9IE5SX1hNSVRfRVhUQlVGRjsKIAotIF9mdW5jX2VudGVyXzsKIAogCXJ0d19oYWxfZnJlZV94bWl0X3ByaXYocGFkYXB0ZXIpOwogCiAJaWYgKHB4bWl0cHJpdi0+cHhtaXRfZnJhbWVfYnVmID09IE5VTEwpCi0JCWdvdG8gb3V0OworCQlyZXR1cm47CiAKIAlmb3IgKGkgPSAwOyBpIDwgTlJfWE1JVEZSQU1FOyBpKyspIHsKIAkJcnR3X29zX3htaXRfY29tcGxldGUocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwpAQCAtMjU5LDEwICsyNTIsMTAgQEAKIAl9CiAKIAlpZiAocHhtaXRwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZikKLQkJcnR3X3ZtZnJlZShweG1pdHByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmLCBOUl9YTUlURlJBTUUgKiBzaXplb2Yoc3RydWN0IHhtaXRfZnJhbWUpICsgNCk7CisJCXZmcmVlKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYpOwogCiAJaWYgKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0YnVmKQotCQlydHdfdm1mcmVlKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0YnVmLCBOUl9YTUlUQlVGRiAqIHNpemVvZihzdHJ1Y3QgeG1pdF9idWYpICsgNCk7CisJCXZmcmVlKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0YnVmKTsKIAogCS8qICBmcmVlIHhtaXQgZXh0ZW5zaW9uIGJ1ZmYgKi8KIAlweG1pdGJ1ZiA9IChzdHJ1Y3QgeG1pdF9idWYgKilweG1pdHByaXYtPnB4bWl0X2V4dGJ1ZjsKQEAgLTI3MiwxNiArMjY1LDEyIEBACiAJfQogCiAJaWYgKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1ZikgewotCQlydHdfdm1mcmVlKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1ZiwgbnVtX3htaXRfZXh0YnVmICogc2l6ZW9mKHN0cnVjdCB4bWl0X2J1ZikgKyA0KTsKKwkJdmZyZWUocHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRfZXh0YnVmKTsKIAl9CiAKIAlydHdfZnJlZV9od3htaXRzKHBhZGFwdGVyKTsKIAogCW11dGV4X2Rlc3Ryb3koJnB4bWl0cHJpdi0+YWNrX3R4X211dGV4KTsKLQotb3V0OgotCi1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHZvaWQgdXBkYXRlX2F0dHJpYl92Y3NfaW5mbyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKQpAQCAtNDU1LDcgKzQ0NCw2IEBACiAJc3RydWN0IHFvc19wcml2CQkqcHFvc3ByaXYgPSAmcG1sbWVwcml2LT5xb3Nwcml2OwogCWludCByZXMgPSBfU1VDQ0VTUzsKIAotIF9mdW5jX2VudGVyXzsKIAogCV9ydHdfb3Blbl9wa3RmaWxlKHBrdCwgJnBrdGZpbGUpOwogCV9ydHdfcGt0ZmlsZV9yZWFkKCZwa3RmaWxlLCAodTggKikmZXRoZXJoZHIsIEVUSF9ITEVOKTsKQEAgLTYzOSw3ICs2MjcsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC02NjIsNyArNjQ5LDYgQEAKIAllbHNlCiAJCXN0YWluZm8gPSBydHdfZ2V0X3N0YWluZm8oJnBhZGFwdGVyLT5zdGFwcml2ICwgJnBhdHRyaWItPnJhWzBdKTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaHdfaGRyX29mZnNldCA9IFRYREVTQ19TSVpFICsgKHB4bWl0ZnJhbWUtPnBrdF9vZmZzZXQgKiBQQUNLRVRfT0ZGU0VUX1NaKTsKIApAQCAtNjc2LDEyICs2NjIsMTIgQEAKIAkJCXBmcmFtZSA9IHB4bWl0ZnJhbWUtPmJ1Zl9hZGRyICsgaHdfaGRyX29mZnNldDsKIAogCQkJaWYgKGJtY3N0KSB7Ci0JCQkJaWYgKF9ydHdfbWVtY21wKHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnB0eG1pY2tleVtwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5aWRdLnNrZXksIG51bGxfa2V5LCAxNikpCisJCQkJaWYgKCFtZW1jbXAocHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycHR4bWlja2V5W3BzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZF0uc2tleSwgbnVsbF9rZXksIDE2KSkKIAkJCQkJcmV0dXJuIF9GQUlMOwogCQkJCS8qIHN0YXJ0IHRvIGNhbGN1bGF0ZSB0aGUgbWljIGNvZGUgKi8KIAkJCQlydHdfc2VjbWljc2V0a2V5KCZtaWNkYXRhLCBwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwdHhtaWNrZXlbcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleWlkXS5za2V5KTsKIAkJCX0gZWxzZSB7Ci0JCQkJaWYgKF9ydHdfbWVtY21wKCZzdGFpbmZvLT5kb3QxMXRraXB0eG1pY2tleS5za2V5WzBdLCBudWxsX2tleSwgMTYpID09IHRydWUpIHsKKwkJCQlpZiAoIW1lbWNtcCgmc3RhaW5mby0+ZG90MTF0a2lwdHhtaWNrZXkuc2tleVswXSwgbnVsbF9rZXksIDE2KSkgewogCQkJCQkvKiBEYmdQcmludCgiXG54bWl0ZnJhbWVfYWRkbWljOnN0YWluZm8tPmRvdDExdGtpcHR4bWlja2V5ID09IDBcbiIpOyAqLwogCQkJCQkvKiBtc2xlZXAoMTApOyAqLwogCQkJCQlyZXR1cm4gX0ZBSUw7CkBAIC03NjAsNyArNzQ2LDYgQEAKIAkJCX0KIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIF9TVUNDRVNTOwogfQpAQCAtNzY5LDcgKzc1NCw2IEBACiB7CiAJc3RydWN0CXBrdF9hdHRyaWIJICpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBhdHRyaWItPmJzd2VuYykgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9hbGVydF8sICgiIyMjIHhtaXRmcmFtZV9zd2VuY3J5cHRcbiIpKTsKQEAgLTc5MSw3ICs3NzUsNiBAQAogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9ub3RpY2VfLCAoIiMjIyB4bWl0ZnJhbWVfaHdlbmNyeXB0XG4iKSk7CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBfU1VDQ0VTUzsKIH0KQEAgLTgxMiw3ICs3OTUsNiBAQAogCiAJaW50IGJtY3N0ID0gSVNfTUNBU1QocGF0dHJpYi0+cmEpOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocGF0dHJpYi0+cHN0YSkgewogCQlwc3RhID0gcGF0dHJpYi0+cHN0YTsKQEAgLTkxOCw3ICs5MDAsNiBAQAogCX0KIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTEwMDcsNyArOTg4LDYgQEAKIAlzMzIgYm1jc3QgPSBJU19NQ0FTVChwYXR0cmliLT5yYSk7CiAJczMyIHJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlwc3RhID0gcnR3X2dldF9zdGFpbmZvKCZwYWRhcHRlci0+c3RhcHJpdiwgcGF0dHJpYi0+cmEpOwogCkBAIC0xMTQ1LDcgKzExMjUsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xMTYyLDcgKzExNDEsNiBAQAogCXN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgKnNuYXA7CiAJdTggKm91aTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJc25hcCA9IChzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyICopZGF0YTsKIAlzbmFwLT5kc2FwID0gMHhhYTsKQEAgLTExODAsNyArMTE1OCw2IEBACiAKIAkqKF9fYmUxNiAqKShkYXRhICsgU05BUF9TSVpFKSA9IGh0b25zKGhfcHJvdG8pOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBTTkFQX1NJWkUgKyBzaXplb2YodTE2KTsKIH0KQEAgLTExOTMsNyArMTE3MCw2IEBACiAJc3RydWN0CXhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKIAlzdHJ1Y3QJcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwogCi1fZnVuY19lbnRlcl87CiAKIAlzd2l0Y2ggKHB4bWl0cHJpdi0+dmNzX3NldHRpbmcpIHsKIAljYXNlIERJU0FCTEVfVkNTOgpAQCAtMTIyMCw3ICsxMTk2LDYgQEAKIAkJYnJlYWs7CiAJfQogCi1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfY291bnRfdHhfc3RhdHMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSwgaW50IHN6KQpAQCAtMTI1MCw3ICsxMjI1LDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdCwgKnBoZWFkOwogCXN0cnVjdCBfX3F1ZXVlICpwZnJlZV9xdWV1ZSA9ICZweG1pdHByaXYtPmZyZWVfeG1pdF9leHRidWZfcXVldWU7CiAKLV9mdW5jX2VudGVyXzsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwZnJlZV9xdWV1ZS0+bG9jaywgaXJxbCk7CiAKQEAgLTEyNTksOSArMTIzMyw5IEBACiAJfSBlbHNlIHsKIAkJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBmcmVlX3F1ZXVlKTsKIAotCQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwkJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAotCQlweG1pdGJ1ZiA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3QgeG1pdF9idWYsIGxpc3QpOworCQlweG1pdGJ1ZiA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHhtaXRfYnVmLCBsaXN0KTsKIAogCQlydHdfbGlzdF9kZWxldGUoJihweG1pdGJ1Zi0+bGlzdCkpOwogCX0KQEAgLTEyODAsNyArMTI1NCw2IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZnJlZV9xdWV1ZS0+bG9jaywgaXJxbCk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHB4bWl0YnVmOwogfQpAQCAtMTI5MCw3ICsxMjYzLDYgQEAKIAl1bnNpZ25lZCBsb25nIGlycWw7CiAJc3RydWN0IF9fcXVldWUgKnBmcmVlX3F1ZXVlID0gJnB4bWl0cHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9xdWV1ZTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHB4bWl0YnVmID09IE5VTEwpCiAJCXJldHVybiBfRkFJTDsKQEAgLTEzMDQsNyArMTI3Niw2IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZnJlZV9xdWV1ZS0+bG9jaywgaXJxbCk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIF9TVUNDRVNTOwogfQpAQCAtMTMxNiw3ICsxMjg3LDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdCwgKnBoZWFkOwogCXN0cnVjdCBfX3F1ZXVlICpwZnJlZV94bWl0YnVmX3F1ZXVlID0gJnB4bWl0cHJpdi0+ZnJlZV94bWl0YnVmX3F1ZXVlOwogCi1fZnVuY19lbnRlcl87CiAKIAkvKiBEQkdfODhFKCIrcnR3X2FsbG9jX3htaXRidWZcbiIpOyAqLwogCkBAIC0xMzI3LDkgKzEyOTcsOSBAQAogCX0gZWxzZSB7CiAJCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZnJlZV94bWl0YnVmX3F1ZXVlKTsKIAotCQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwkJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAotCQlweG1pdGJ1ZiA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3QgeG1pdF9idWYsIGxpc3QpOworCQlweG1pdGJ1ZiA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHhtaXRfYnVmLCBsaXN0KTsKIAogCQlydHdfbGlzdF9kZWxldGUoJihweG1pdGJ1Zi0+bGlzdCkpOwogCX0KQEAgLTEzNDQsNyArMTMxNCw2IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmcmVlX3htaXRidWZfcXVldWUtPmxvY2ssIGlycWwpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBweG1pdGJ1ZjsKIH0KQEAgLTEzNTQsNyArMTMyMyw2IEBACiAJdW5zaWduZWQgbG9uZyBpcnFsOwogCXN0cnVjdCBfX3F1ZXVlICpwZnJlZV94bWl0YnVmX3F1ZXVlID0gJnB4bWl0cHJpdi0+ZnJlZV94bWl0YnVmX3F1ZXVlOwogCi1fZnVuY19lbnRlcl87CiAJaWYgKHB4bWl0YnVmID09IE5VTEwpCiAJCXJldHVybiBfRkFJTDsKIApAQCAtMTM3Niw3ICsxMzQ0LDYgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZyZWVfeG1pdGJ1Zl9xdWV1ZS0+bG9jaywgaXJxbCk7CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBfU1VDQ0VTUzsKIH0KQEAgLTE0MDUsNyArMTM3Miw2IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqcGxpc3QsICpwaGVhZDsKIAlzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfeG1pdF9xdWV1ZSA9ICZweG1pdHByaXYtPmZyZWVfeG1pdF9xdWV1ZTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJc3Bpbl9sb2NrX2JoKCZwZnJlZV94bWl0X3F1ZXVlLT5sb2NrKTsKIApAQCAtMTQxNSw5ICsxMzgxLDkgQEAKIAl9IGVsc2UgewogCQlwaGVhZCA9IGdldF9saXN0X2hlYWQocGZyZWVfeG1pdF9xdWV1ZSk7CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKLQkJcHhmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CisJCXB4ZnJhbWUgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKIAogCQlydHdfbGlzdF9kZWxldGUoJihweGZyYW1lLT5saXN0KSk7CiAJfQpAQCAtMTQ0NCw3ICsxNDEwLDYgQEAKIAogCXNwaW5fdW5sb2NrX2JoKCZwZnJlZV94bWl0X3F1ZXVlLT5sb2NrKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcHhmcmFtZTsKIH0KQEAgLTE0NTUsNyArMTQyMCw2IEBACiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gcHhtaXRwcml2LT5hZGFwdGVyOwogCXN0cnVjdCBza19idWZmICpwbmRpc19wa3QgPSBOVUxMOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocHhtaXRmcmFtZSA9PSBOVUxMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sICgiPT09PT09IHJ0d19mcmVlX3htaXRmcmFtZSgpOnB4bWl0ZnJhbWUgPT0gTlVMTCEhISEhISEhISFcbiIpKTsKQEAgLTE0ODMsNyArMTQ0Nyw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIF9TVUNDRVNTOwogfQpAQCAtMTQ5MywyMyArMTQ1NiwyMSBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0LCAqcGhlYWQ7CiAJc3RydWN0CXhtaXRfZnJhbWUJKnB4bWl0ZnJhbWU7CiAKLV9mdW5jX2VudGVyXzsKIAogCXNwaW5fbG9ja19iaCgmKHBmcmFtZXF1ZXVlLT5sb2NrKSk7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocGZyYW1lcXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoIXJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpIHsKLQkJcHhtaXRmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CisJCXB4bWl0ZnJhbWUgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKIAotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAogCQlydHdfZnJlZV94bWl0ZnJhbWUocHhtaXRwcml2LCBweG1pdGZyYW1lKTsKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJihwZnJhbWVxdWV1ZS0+bG9jaykpOwogCi1fZnVuY19leGl0XzsKIH0KIAogczMyIHJ0d194bWl0ZnJhbWVfZW5xdWV1ZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKQpAQCAtMTUzMCwxMiArMTQ5MSwxMiBAQAogCXN0cnVjdAl4bWl0X2ZyYW1lCSpweG1pdGZyYW1lID0gTlVMTDsKIAogCXhtaXRmcmFtZV9waGVhZCA9IGdldF9saXN0X2hlYWQocGZyYW1lX3F1ZXVlKTsKLQl4bWl0ZnJhbWVfcGxpc3QgPSBnZXRfbmV4dCh4bWl0ZnJhbWVfcGhlYWQpOworCXhtaXRmcmFtZV9wbGlzdCA9IHhtaXRmcmFtZV9waGVhZC0+bmV4dDsKIAogCWlmICghcnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2goeG1pdGZyYW1lX3BoZWFkLCB4bWl0ZnJhbWVfcGxpc3QpKSB7Ci0JCXB4bWl0ZnJhbWUgPSBMSVNUX0NPTlRBSU5PUih4bWl0ZnJhbWVfcGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKKwkJcHhtaXRmcmFtZSA9IGNvbnRhaW5lcl9vZih4bWl0ZnJhbWVfcGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKIAotCQl4bWl0ZnJhbWVfcGxpc3QgPSBnZXRfbmV4dCh4bWl0ZnJhbWVfcGxpc3QpOworCQl4bWl0ZnJhbWVfcGxpc3QgPSB4bWl0ZnJhbWVfcGxpc3QtPm5leHQ7CiAKIAkJcnR3X2xpc3RfZGVsZXRlKCZweG1pdGZyYW1lLT5saXN0KTsKIApAQCAtMTU1NSw3ICsxNTE2LDYgQEAKIAlzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKIAlpbnQgaSwgaW54WzRdOwogCi1fZnVuY19lbnRlcl87CiAKIAlpbnhbMF0gPSAwOyBpbnhbMV0gPSAxOyBpbnhbMl0gPSAyOyBpbnhbM10gPSAzOwogCkBAIC0xNTcyLDEwICsxNTMyLDEwIEBACiAJCXBod3htaXQgPSBwaHd4bWl0X2kgKyBpbnhbaV07CiAKIAkJc3RhX3BoZWFkID0gZ2V0X2xpc3RfaGVhZChwaHd4bWl0LT5zdGFfcXVldWUpOwotCQlzdGFfcGxpc3QgPSBnZXRfbmV4dChzdGFfcGhlYWQpOworCQlzdGFfcGxpc3QgPSBzdGFfcGhlYWQtPm5leHQ7CiAKIAkJd2hpbGUgKCFydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChzdGFfcGhlYWQsIHN0YV9wbGlzdCkpIHsKLQkJCXB0eHNlcnZxID0gTElTVF9DT05UQUlOT1Ioc3RhX3BsaXN0LCBzdHJ1Y3QgdHhfc2VydnEsIHR4X3BlbmRpbmcpOworCQkJcHR4c2VydnEgPSBjb250YWluZXJfb2Yoc3RhX3BsaXN0LCBzdHJ1Y3QgdHhfc2VydnEsIHR4X3BlbmRpbmcpOwogCiAJCQlwZnJhbWVfcXVldWUgPSAmcHR4c2VydnEtPnN0YV9wZW5kaW5nOwogCkBAIC0xNTkwLDEyICsxNTUwLDExIEBACiAJCQkJZ290byBleGl0OwogCQkJfQogCi0JCQlzdGFfcGxpc3QgPSBnZXRfbmV4dChzdGFfcGxpc3QpOworCQkJc3RhX3BsaXN0ID0gc3RhX3BsaXN0LT5uZXh0OwogCQl9CiAJfQogZXhpdDoKIAlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLV9mdW5jX2V4aXRfOwogCXJldHVybiBweG1pdGZyYW1lOwogfQogCkBAIC0xNjAzLDcgKzE1NjIsNiBAQAogewogCXN0cnVjdCB0eF9zZXJ2cSAqcHR4c2VydnE7CiAKLV9mdW5jX2VudGVyXzsKIAlzd2l0Y2ggKHVwKSB7CiAJY2FzZSAxOgogCWNhc2UgMjoKQEAgLTE2MzIsNyArMTU5MCw2IEBACiAJYnJlYWs7CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBwdHhzZXJ2cTsKIH0KQEAgLTE2NTEsNyArMTYwOCw2IEBACiAJc3RydWN0IGh3X3htaXQJKnBod3htaXRzID0gIHBhZGFwdGVyLT54bWl0cHJpdi5od3htaXRzOwogCWludCByZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBhdHRyaWItPnBzdGEpIHsKIAkJcHN0YSA9IHBhdHRyaWItPnBzdGE7CkBAIC0xNjc2LDcgKzE2MzIsNiBAQAogCXBod3htaXRzW2FjX2luZGV4XS5hY2NudCsrOwogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTcxOSwxMCArMTY3NCw4IEBACiB2b2lkIHJ0d19pbml0X2h3eG1pdHMoc3RydWN0IGh3X3htaXQgKnBod3htaXQsIGludCBlbnRyeSkKIHsKIAlpbnQgaTsKLV9mdW5jX2VudGVyXzsKIAlmb3IgKGkgPSAwOyBpIDwgZW50cnk7IGkrKywgcGh3eG1pdCsrKQogCQlwaHd4bWl0LT5hY2NudCA9IDA7Ci1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIGludCBydHdfYnJfY2xpZW50X3R4KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKipwc2tiKQpAQCAtMTk5Nyw3ICsxOTUwLDcgQEAKIAkJCXBzdGFwcml2LT50aW1fYml0bWFwIHw9IEJJVCgwKTsvKiAgKi8KIAkJCXBzdGFwcml2LT5zdGFfZHpfYml0bWFwIHw9IEJJVCgwKTsKIAotCQkJdXBkYXRlX2JlYWNvbihwYWRhcHRlciwgX1RJTV9JRV8sIE5VTEwsIGZhbHNlKTsvKiB0eCBiYy9tYyBwYWNrZXRzIGFmdGVyIHVwYXRlIGJjbiAqLworCQkJdXBkYXRlX2JlYWNvbihwYWRhcHRlciwgX1RJTV9JRV8sIE5VTEwsIGZhbHNlKTsvKiB0eCBiYy9tYyBwYWNrZXRzIGFmdGVyIHVwZGF0ZSBiY24gKi8KIAogCQkJcmV0ID0gdHJ1ZTsKIAkJfQpAQCAtMjA0Nyw3ICsyMDAwLDcgQEAKIAkJCQlwc3RhcHJpdi0+dGltX2JpdG1hcCB8PSBCSVQocHN0YS0+YWlkKTsKIAogCQkJCWlmIChwc3RhLT5zbGVlcHFfbGVuID09IDEpIHsKLQkJCQkJLyogdXBhdGUgQkNOIGZvciBUSU0gSUUgKi8KKwkJCQkJLyogdXBkYXRlIEJDTiBmb3IgVElNIElFICovCiAJCQkJCXVwZGF0ZV9iZWFjb24ocGFkYXB0ZXIsIF9USU1fSUVfLCBOVUxMLCBmYWxzZSk7CiAJCQkJfQogCQkJfQpAQCAtMjA3MCwxMiArMjAyMywxMiBAQAogCXN0cnVjdCBod194bWl0ICpwaHd4bWl0cyA9ICBwYWRhcHRlci0+eG1pdHByaXYuaHd4bWl0czsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZnJhbWVxdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICghcnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkgewotCQlweG1pdGZyYW1lID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKKwkJcHhtaXRmcmFtZSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOwogCi0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCiAJCXhtaXRmcmFtZV9lbnF1ZXVlX2Zvcl9zbGVlcGluZ19zdGEocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwogCkBAIC0yMTM3LDEyICsyMDkwLDEyIEBACiAJc3Bpbl9sb2NrX2JoKCZwc3RhLT5zbGVlcF9xLmxvY2spOwogCiAJeG1pdGZyYW1lX3BoZWFkID0gZ2V0X2xpc3RfaGVhZCgmcHN0YS0+c2xlZXBfcSk7Ci0JeG1pdGZyYW1lX3BsaXN0ID0gZ2V0X25leHQoeG1pdGZyYW1lX3BoZWFkKTsKKwl4bWl0ZnJhbWVfcGxpc3QgPSB4bWl0ZnJhbWVfcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoIXJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHhtaXRmcmFtZV9waGVhZCwgeG1pdGZyYW1lX3BsaXN0KSkgewotCQlweG1pdGZyYW1lID0gTElTVF9DT05UQUlOT1IoeG1pdGZyYW1lX3BsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CisJCXB4bWl0ZnJhbWUgPSBjb250YWluZXJfb2YoeG1pdGZyYW1lX3BsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CiAKLQkJeG1pdGZyYW1lX3BsaXN0ID0gZ2V0X25leHQoeG1pdGZyYW1lX3BsaXN0KTsKKwkJeG1pdGZyYW1lX3BsaXN0ID0geG1pdGZyYW1lX3BsaXN0LT5uZXh0OwogCiAJCXJ0d19saXN0X2RlbGV0ZSgmcHhtaXRmcmFtZS0+bGlzdCk7CiAKQEAgLTIyMTgsMTIgKzIxNzEsMTIgQEAKIAkJc3Bpbl9sb2NrX2JoKCZwc3RhX2JtYy0+c2xlZXBfcS5sb2NrKTsKIAogCQl4bWl0ZnJhbWVfcGhlYWQgPSBnZXRfbGlzdF9oZWFkKCZwc3RhX2JtYy0+c2xlZXBfcSk7Ci0JCXhtaXRmcmFtZV9wbGlzdCA9IGdldF9uZXh0KHhtaXRmcmFtZV9waGVhZCk7CisJCXhtaXRmcmFtZV9wbGlzdCA9IHhtaXRmcmFtZV9waGVhZC0+bmV4dDsKIAogCQl3aGlsZSAoIXJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHhtaXRmcmFtZV9waGVhZCwgeG1pdGZyYW1lX3BsaXN0KSkgewotCQkJcHhtaXRmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHhtaXRmcmFtZV9wbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOworCQkJcHhtaXRmcmFtZSA9IGNvbnRhaW5lcl9vZih4bWl0ZnJhbWVfcGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKIAotCQkJeG1pdGZyYW1lX3BsaXN0ID0gZ2V0X25leHQoeG1pdGZyYW1lX3BsaXN0KTsKKwkJCXhtaXRmcmFtZV9wbGlzdCA9IHhtaXRmcmFtZV9wbGlzdC0+bmV4dDsKIAogCQkJcnR3X2xpc3RfZGVsZXRlKCZweG1pdGZyYW1lLT5saXN0KTsKIApAQCAtMjI2NSwxMiArMjIxOCwxMiBAQAogCXNwaW5fbG9ja19iaCgmcHN0YS0+c2xlZXBfcS5sb2NrKTsKIAogCXhtaXRmcmFtZV9waGVhZCA9IGdldF9saXN0X2hlYWQoJnBzdGEtPnNsZWVwX3EpOwotCXhtaXRmcmFtZV9wbGlzdCA9IGdldF9uZXh0KHhtaXRmcmFtZV9waGVhZCk7CisJeG1pdGZyYW1lX3BsaXN0ID0geG1pdGZyYW1lX3BoZWFkLT5uZXh0OwogCiAJd2hpbGUgKCFydHdfZW5kX29mX3F1ZXVlX3NlYXJjaCh4bWl0ZnJhbWVfcGhlYWQsIHhtaXRmcmFtZV9wbGlzdCkpIHsKLQkJcHhtaXRmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHhtaXRmcmFtZV9wbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOworCQlweG1pdGZyYW1lID0gY29udGFpbmVyX29mKHhtaXRmcmFtZV9wbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOwogCi0JCXhtaXRmcmFtZV9wbGlzdCA9IGdldF9uZXh0KHhtaXRmcmFtZV9wbGlzdCk7CisJCXhtaXRmcmFtZV9wbGlzdCA9IHhtaXRmcmFtZV9wbGlzdC0+bmV4dDsKIAogCQlzd2l0Y2ggKHB4bWl0ZnJhbWUtPmF0dHJpYi5wcmlvcml0eSkgewogCQljYXNlIDE6CkBAIC0yMzE2LDcgKzIyNjksNyBAQAogCQlpZiAoKHBzdGEtPnNsZWVwcV9hY19sZW4gPT0gMCkgJiYgKCFwc3RhLT5oYXNfbGVnYWN5X2FjKSAmJiAod21tcHNfYWMpKSB7CiAJCQlwc3RhcHJpdi0+dGltX2JpdG1hcCAmPSB+QklUKHBzdGEtPmFpZCk7CiAKLQkJCS8qIHVwYXRlIEJDTiBmb3IgVElNIElFICovCisJCQkvKiB1cGRhdGUgQkNOIGZvciBUSU0gSUUgKi8KIAkJCXVwZGF0ZV9iZWFjb24ocGFkYXB0ZXIsIF9USU1fSUVfLCBOVUxMLCBmYWxzZSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9IYWw4MTg4RVJhdGVBZGFwdGl2ZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvSGFsODE4OEVSYXRlQWRhcHRpdmUuYwppbmRleCAzZGYzM2JjLi5kZWEyMjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9IYWw4MTg4RVJhdGVBZGFwdGl2ZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL0hhbDgxODhFUmF0ZUFkYXB0aXZlLmMKQEAgLTMzMSw2ICszMzEsNyBAQAogCiBzdGF0aWMgaW50IG9kbV9BUkZCUmVmcmVzaF84MTg4RShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtLCBzdHJ1Y3Qgb2RtX3JhX2luZm8gKnBSYUluZm8pCiB7ICAvKiAgV2lsc29uIDIwMTEvMTAvMjYgKi8KKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHQgPSBkbV9vZG0tPkFkYXB0ZXI7CiAJdTMyIE1hc2tGcm9tUmVnOwogCXM4IGk7CiAKQEAgLTM1NywxOSArMzU4LDE5IEBACiAJCXBSYUluZm8tPlJBVXNlUmF0ZSA9IChwUmFJbmZvLT5SYXRlTWFzaykmMHgwMDAwMDAwZDsKIAkJYnJlYWs7CiAJY2FzZSAxMjoKLQkJTWFza0Zyb21SZWcgPSBPRE1fUmVhZDRCeXRlKGRtX29kbSwgUkVHX0FSRlIwKTsKKwkJTWFza0Zyb21SZWcgPSBydHdfcmVhZDMyKGFkYXB0LCBSRUdfQVJGUjApOwogCQlwUmFJbmZvLT5SQVVzZVJhdGUgPSAocFJhSW5mby0+UmF0ZU1hc2spJk1hc2tGcm9tUmVnOwogCQlicmVhazsKIAljYXNlIDEzOgotCQlNYXNrRnJvbVJlZyA9IE9ETV9SZWFkNEJ5dGUoZG1fb2RtLCBSRUdfQVJGUjEpOworCQlNYXNrRnJvbVJlZyA9IHJ0d19yZWFkMzIoYWRhcHQsIFJFR19BUkZSMSk7CiAJCXBSYUluZm8tPlJBVXNlUmF0ZSA9IChwUmFJbmZvLT5SYXRlTWFzaykmTWFza0Zyb21SZWc7CiAJCWJyZWFrOwogCWNhc2UgMTQ6Ci0JCU1hc2tGcm9tUmVnID0gT0RNX1JlYWQ0Qnl0ZShkbV9vZG0sIFJFR19BUkZSMik7CisJCU1hc2tGcm9tUmVnID0gcnR3X3JlYWQzMihhZGFwdCwgUkVHX0FSRlIyKTsKIAkJcFJhSW5mby0+UkFVc2VSYXRlID0gKHBSYUluZm8tPlJhdGVNYXNrKSZNYXNrRnJvbVJlZzsKIAkJYnJlYWs7CiAJY2FzZSAxNToKLQkJTWFza0Zyb21SZWcgPSBPRE1fUmVhZDRCeXRlKGRtX29kbSwgUkVHX0FSRlIzKTsKKwkJTWFza0Zyb21SZWcgPSBydHdfcmVhZDMyKGFkYXB0LCBSRUdfQVJGUjMpOwogCQlwUmFJbmZvLT5SQVVzZVJhdGUgPSAocFJhSW5mby0+UmF0ZU1hc2spJk1hc2tGcm9tUmVnOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtNjY3LDcgKzY2OCw5IEBACiAKIHZvaWQgT0RNX1JBX1NldF9UeFJQVF9UaW1lKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0sIHUxNiBtaW5ScHRUaW1lKQogewotCU9ETV9Xcml0ZTJCeXRlKGRtX29kbSwgUkVHX1RYX1JQVF9USU1FLCBtaW5ScHRUaW1lKTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHQgPSBkbV9vZG0tPkFkYXB0ZXI7CisKKwlydHdfd3JpdGUxNihhZGFwdCwgUkVHX1RYX1JQVF9USU1FLCBtaW5ScHRUaW1lKTsKIH0KIAogdm9pZCBPRE1fUkFfVHhSUFQySGFuZGxlXzgxODhFKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0sIHU4ICpUeFJQVF9CdWYsIHUxNiBUeFJQVF9MZW4sIHUzMiBtYWNpZF9lbnRyeTAsIHUzMiBtYWNpZF9lbnRyeTEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9IYWxQaHlSZl84MTg4ZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvSGFsUGh5UmZfODE4OGUuYwppbmRleCAxNWU4ZTNmLi4wNTYwNTJkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvSGFsUGh5UmZfODE4OGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9IYWxQaHlSZl84MTg4ZS5jCkBAIC0yMTcsNyArMjE3LDcgQEAKIAogCQlmb3IgKGkgPSAwOyBpIDwgQ0NLX1RBQkxFX1NJWkU7IGkrKykgewogCQkJaWYgKGRtX29kbS0+UkZDYWxpYnJhdGVJbmZvLmJDQ0tpbkNIMTQpIHsKLQkJCQlpZiAoT0RNX0NvbXBhcmVNZW1vcnkoZG1fb2RtLCAodm9pZCAqKSZUZW1wQ0NrLCAodm9pZCAqKSZDQ0tTd2luZ1RhYmxlX0NoMTRbaV1bMl0sIDQpID09IDApIHsKKwkJCQlpZiAobWVtY21wKCZUZW1wQ0NrLCAmQ0NLU3dpbmdUYWJsZV9DaDE0W2ldWzJdLCA0KSkgewogCQkJCQlDQ0tfaW5kZXhfb2xkID0gKHU4KWk7CiAJCQkJCWRtX29kbS0+QmJTd2luZ0lkeENja0Jhc2UgPSAodTgpaTsKIAkJCQkJT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfQ0FMSUJSQVRJT04sIE9ETV9EQkdfTE9VRCwKQEAgLTIyOSw3ICsyMjksNyBAQAogCQkJCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX0NBTElCUkFUSU9OLCBPRE1fREJHX0xPVUQsCiAJCQkJCSAgICAgKCJSZWdBMjQ6IDB4JVgsIENDS1N3aW5nVGFibGVfQ2gxX0NoMTNbJWRdWzJdOiBDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW2ldWzJdOiAweCVYXG4iLAogCQkJCQkgICAgIFRlbXBDQ2ssIGksIENDS1N3aW5nVGFibGVfQ2gxX0NoMTNbaV1bMl0pKTsKLQkJCQlpZiAoT0RNX0NvbXBhcmVNZW1vcnkoZG1fb2RtLCAodm9pZCAqKSZUZW1wQ0NrLCAodm9pZCAqKSZDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW2ldWzJdLCA0KSA9PSAwKSB7CisJCQkJaWYgKG1lbWNtcCgmVGVtcENDaywgJkNDS1N3aW5nVGFibGVfQ2gxX0NoMTNbaV1bMl0sIDQpKSB7CiAJCQkJCUNDS19pbmRleF9vbGQgPSAodTgpaTsKIAkJCQkJZG1fb2RtLT5CYlN3aW5nSWR4Q2NrQmFzZSA9ICh1OClpOwogCQkJCQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9DQUxJQlJBVElPTiwgT0RNX0RCR19MT1VELApAQCAtODM5LDkgKzgzOSw5IEBACiAJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICZwSGFsRGF0YS0+b2RtcHJpdjsKIAlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9DQUxJQlJBVElPTiwgT0RNX0RCR19MT1VELCAoIlNhdmUgTUFDIHBhcmFtZXRlcnMuXG4iKSk7CiAJZm9yIChpID0gMDsgaSA8IChJUUtfTUFDX1JFR19OVU0gLSAxKTsgaSsrKSB7Ci0JCU1BQ0JhY2t1cFtpXSA9IE9ETV9SZWFkMUJ5dGUoZG1fb2RtLCBNQUNSZWdbaV0pOworCQlNQUNCYWNrdXBbaV0gPSBydHdfcmVhZDgoYWRhcHQsIE1BQ1JlZ1tpXSk7CiAJfQotCU1BQ0JhY2t1cFtpXSA9IE9ETV9SZWFkNEJ5dGUoZG1fb2RtLCBNQUNSZWdbaV0pOworCU1BQ0JhY2t1cFtpXSA9IHJ0d19yZWFkMzIoYWRhcHQsIE1BQ1JlZ1tpXSk7CiB9CiAKIHN0YXRpYyB2b2lkIHJlbG9hZF9hZGRhX3JlZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHUzMiAqQUREQVJlZywgdTMyICpBRERBQmFja3VwLCB1MzIgUmVnaWVzdGVyTnVtKQpAQCAtODY4LDkgKzg2OCw5IEBACiAKIAlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9DQUxJQlJBVElPTiwgT0RNX0RCR19MT1VELCAgKCJSZWxvYWQgTUFDIHBhcmFtZXRlcnMgIVxuIikpOwogCWZvciAoaSA9IDA7IGkgPCAoSVFLX01BQ19SRUdfTlVNIC0gMSk7IGkrKykgewotCQlPRE1fV3JpdGUxQnl0ZShkbV9vZG0sIE1BQ1JlZ1tpXSwgKHU4KU1BQ0JhY2t1cFtpXSk7CisJCXJ0d193cml0ZTgoYWRhcHQsIE1BQ1JlZ1tpXSwgKHU4KU1BQ0JhY2t1cFtpXSk7CiAJfQotCU9ETV9Xcml0ZTRCeXRlKGRtX29kbSwgTUFDUmVnW2ldLCBNQUNCYWNrdXBbaV0pOworCXJ0d193cml0ZTMyKGFkYXB0LCBNQUNSZWdbaV0sIE1BQ0JhY2t1cFtpXSk7CiB9CiAKIHZvaWQKQEAgLTkxMiwxMiArOTEyLDEyIEBACiAKIAlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9DQUxJQlJBVElPTiwgT0RNX0RCR19MT1VELCAoIk1BQyBzZXR0aW5ncyBmb3IgQ2FsaWJyYXRpb24uXG4iKSk7CiAKLQlPRE1fV3JpdGUxQnl0ZShkbV9vZG0sIE1BQ1JlZ1tpXSwgMHgzRik7CisJcnR3X3dyaXRlOChhZGFwdCwgTUFDUmVnW2ldLCAweDNGKTsKIAogCWZvciAoaSA9IDE7IGkgPCAoSVFLX01BQ19SRUdfTlVNIC0gMSk7IGkrKykgewotCQlPRE1fV3JpdGUxQnl0ZShkbV9vZG0sIE1BQ1JlZ1tpXSwgKHU4KShNQUNCYWNrdXBbaV0mKH5CSVQzKSkpOworCQlydHdfd3JpdGU4KGFkYXB0LCBNQUNSZWdbaV0sICh1OCkoTUFDQmFja3VwW2ldJih+QklUMykpKTsKIAl9Ci0JT0RNX1dyaXRlMUJ5dGUoZG1fb2RtLCBNQUNSZWdbaV0sICh1OCkoTUFDQmFja3VwW2ldJih+QklUNSkpKTsKKwlydHdfd3JpdGU4KGFkYXB0LCBNQUNSZWdbaV0sICh1OCkoTUFDQmFja3VwW2ldJih+QklUNSkpKTsKIH0KIAogdm9pZApAQCAtMTIyMywxNiArMTIyMywxNCBAQAogewogCXU4IHRtcHJlZzsKIAl1MzIgUkZfQW1vZGUgPSAwLCBSRl9CbW9kZSA9IDAsIExDX0NhbDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJnBIYWxEYXRhLT5vZG1wcml2OwogCiAJLyogQ2hlY2sgY29udGludW91cyBUWCBhbmQgUGFja2V0IFRYICovCi0JdG1wcmVnID0gT0RNX1JlYWQxQnl0ZShkbV9vZG0sIDB4ZDAzKTsKKwl0bXByZWcgPSBydHdfcmVhZDgoYWRhcHQsIDB4ZDAzKTsKIAogCWlmICgodG1wcmVnJjB4NzApICE9IDApCQkJLyogRGVhbCB3aXRoIGNvbnRpc3VvdXMgVFggY2FzZSAqLwotCQlPRE1fV3JpdGUxQnl0ZShkbV9vZG0sIDB4ZDAzLCB0bXByZWcmMHg4Rik7CS8qIGRpc2FibGUgYWxsIGNvbnRpbnVvdXMgVFggKi8KKwkJcnR3X3dyaXRlOChhZGFwdCwgMHhkMDMsIHRtcHJlZyYweDhGKTsJLyogZGlzYWJsZSBhbGwgY29udGludW91cyBUWCAqLwogCWVsc2UJCQkJCQkJLyogIERlYWwgd2l0aCBQYWNrZXQgVFggY2FzZSAqLwotCQlPRE1fV3JpdGUxQnl0ZShkbV9vZG0sIFJFR19UWFBBVVNFLCAweEZGKTsJCQkvKiAgYmxvY2sgYWxsIHF1ZXVlcyAqLworCQlydHdfd3JpdGU4KGFkYXB0LCBSRUdfVFhQQVVTRSwgMHhGRik7CQkJLyogIGJsb2NrIGFsbCBxdWV1ZXMgKi8KIAogCWlmICgodG1wcmVnJjB4NzApICE9IDApIHsKIAkJLyogMS4gUmVhZCBvcmlnaW5hbCBSRiBtb2RlICovCkBAIC0xMjY0LDcgKzEyNjIsNyBAQAogCWlmICgodG1wcmVnJjB4NzApICE9IDApIHsKIAkJLyogRGVhbCB3aXRoIGNvbnRpbnVvdXMgVFggY2FzZSAqLwogCQkvKiBQYXRoLUEgKi8KLQkJT0RNX1dyaXRlMUJ5dGUoZG1fb2RtLCAweGQwMywgdG1wcmVnKTsKKwkJcnR3X3dyaXRlOChhZGFwdCwgMHhkMDMsIHRtcHJlZyk7CiAJCVBIWV9TZXRSRlJlZyhhZGFwdCwgUkZfUEFUSF9BLCBSRl9BQywgYk1hc2sxMkJpdHMsIFJGX0Ftb2RlKTsKIAogCQkvKiBQYXRoLUIgKi8KQEAgLTEyNzIsNyArMTI3MCw3IEBACiAJCQlQSFlfU2V0UkZSZWcoYWRhcHQsIFJGX1BBVEhfQiwgUkZfQUMsIGJNYXNrMTJCaXRzLCBSRl9CbW9kZSk7CiAJfSBlbHNlIHsKIAkJLyogIERlYWwgd2l0aCBQYWNrZXQgVFggY2FzZSAqLwotCQlPRE1fV3JpdGUxQnl0ZShkbV9vZG0sIFJFR19UWFBBVVNFLCAweDAwKTsKKwkJcnR3X3dyaXRlOChhZGFwdCwgUkVHX1RYUEFVU0UsIDB4MDApOwogCX0KIH0KIApAQCAtMTQ2OCwxMyArMTQ2NiwxMCBAQAogCiBzdGF0aWMgdm9pZCBwaHlfc2V0cmZwYXRoc3dpdGNoXzgxODhlKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgYm9vbCBtYWluLCBib29sIGlzMnQpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7Ci0Jc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICZwSGFsRGF0YS0+b2RtcHJpdjsKLQogCWlmICghYWRhcHQtPmh3X2luaXRfY29tcGxldGVkKSB7CiAJCXU4IHUxYnRtcDsKLQkJdTFidG1wID0gT0RNX1JlYWQxQnl0ZShkbV9vZG0sIFJFR19MRURDRkcyKSB8IEJJVDc7Ci0JCU9ETV9Xcml0ZTFCeXRlKGRtX29kbSwgUkVHX0xFRENGRzIsIHUxYnRtcCk7CisJCXUxYnRtcCA9IHJ0d19yZWFkOChhZGFwdCwgUkVHX0xFRENGRzIpIHwgQklUNzsKKwkJcnR3X3dyaXRlOChhZGFwdCwgUkVHX0xFRENGRzIsIHUxYnRtcCk7CiAJCVBIWV9TZXRCQlJlZyhhZGFwdCwgckZQR0EwX1hBQl9SRlBhcmFtZXRlciwgQklUMTMsIDB4MDEpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvaGFsX2ludGYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL2hhbF9pbnRmLmMKaW5kZXggNTk4MTQwNC4uZDc1Y2E3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvaGFsX2ludGYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9oYWxfaW50Zi5jCkBAIC0xMTYsOCArMTE2LDYgQEAKIHsKIAl1aW50CXN0YXR1cyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87Ci0KIAlzdGF0dXMgPSBhZGFwdC0+SGFsRnVuYy5oYWxfZGVpbml0KGFkYXB0KTsKIAogCWlmIChzdGF0dXMgPT0gX1NVQ0NFU1MpCkBAIC0xMjUsOCArMTIzLDYgQEAKIAllbHNlCiAJCURCR184OEUoIlxuIHJ0d19oYWxfZGVpbml0OiBoYWxfaW5pdCBmYWlsXG4iKTsKIAotX2Z1bmNfZXhpdF87Ci0KIAlyZXR1cm4gc3RhdHVzOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL29kbS5jCmluZGV4IDM1NTVmZmEuLjg5YTI2ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL29kbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL29kbS5jCkBAIC04ODcsOSArODg3LDEwIEBACiB2b2lkIE9ETV9Xcml0ZV9DQ0tfQ0NBX1RocmVzKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB1OCBDdXJDQ0tfQ0NBVGhyZXMpCiB7CiAJc3RydWN0IHJ0d19kaWcgKnBETV9EaWdUYWJsZSA9ICZwRE1fT2RtLT5ETV9EaWdUYWJsZTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHQgPSBwRE1fT2RtLT5BZGFwdGVyOwogCiAJaWYgKHBETV9EaWdUYWJsZS0+Q3VyQ0NLX0NDQVRocmVzICE9IEN1ckNDS19DQ0FUaHJlcykJCS8qIG1vZGlmeSBieSBHdW8uTWluZ3poaSAyMDEyLTAxLTAzICovCi0JCU9ETV9Xcml0ZTFCeXRlKHBETV9PZG0sIE9ETV9SRUcoQ0NLX0NDQSwgcERNX09kbSksIEN1ckNDS19DQ0FUaHJlcyk7CisJCXJ0d193cml0ZTgoYWRhcHQsIE9ETV9SRUcoQ0NLX0NDQSwgcERNX09kbSksIEN1ckNDS19DQ0FUaHJlcyk7CiAJcERNX0RpZ1RhYmxlLT5QcmVDQ0tfQ0NBVGhyZXMgPSBwRE1fRGlnVGFibGUtPkN1ckNDS19DQ0FUaHJlczsKIAlwRE1fRGlnVGFibGUtPkN1ckNDS19DQ0FUaHJlcyA9IEN1ckNDS19DQ0FUaHJlczsKIH0KQEAgLTEzMDEsOCArMTMwMiw4IEBACiAJCXBzdGEgPSBwRE1fT2RtLT5wT0RNX1N0YUluZm9baV07CiAJCWlmIChJU19TVEFfVkFMSUQocHN0YSkgJiYKIAkJICAgIChwc3RhLT5zdGF0ZSAmIFdJRklfQVNPQ19TVEFURSkgJiYKLQkJICAgICFfcnR3X21lbWNtcChwc3RhLT5od2FkZHIsIGJjYXN0X2FkZHIsIEVUSF9BTEVOKSAmJgotCQkgICAgIV9ydHdfbWVtY21wKHBzdGEtPmh3YWRkciwgbXlpZCgmQWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKSkgeworCQkgICAgbWVtY21wKHBzdGEtPmh3YWRkciwgYmNhc3RfYWRkciwgRVRIX0FMRU4pICYmCisJCSAgICBtZW1jbXAocHN0YS0+aHdhZGRyLCBteWlkKCZBZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pKSB7CiAJCQlpZiAocHN0YS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCIDwgdG1wRW50cnlNaW5QV0RCKQogCQkJCXRtcEVudHJ5TWluUFdEQiA9IHBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKIApAQCAtMTQzMywxMCArMTQzNCwxMCBAQAogCXBETV9PZG0tPkRNX0VEQ0FfVGFibGUuYklzQ3VyUkRMU3RhdGUgPSBmYWxzZTsKIAlBZGFwdGVyLT5yZWN2cHJpdi5iSXNBbnlOb25CRVBrdHMgPSBmYWxzZTsKIAotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9FRENBX1RVUkJPLCBPRE1fREJHX0xPVUQsICgiT3JnaW5pYWwgVk8gUEFSQU06IDB4JXhcbiIsIE9ETV9SZWFkNEJ5dGUocERNX09kbSwgT0RNX0VEQ0FfVk9fUEFSQU0pKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0VEQ0FfVFVSQk8sIE9ETV9EQkdfTE9VRCwgKCJPcmdpbmlhbCBWSSBQQVJBTTogMHgleFxuIiwgT0RNX1JlYWQ0Qnl0ZShwRE1fT2RtLCBPRE1fRURDQV9WSV9QQVJBTSkpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRURDQV9UVVJCTywgT0RNX0RCR19MT1VELCAoIk9yZ2luaWFsIEJFIFBBUkFNOiAweCV4XG4iLCBPRE1fUmVhZDRCeXRlKHBETV9PZG0sIE9ETV9FRENBX0JFX1BBUkFNKSkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9FRENBX1RVUkJPLCBPRE1fREJHX0xPVUQsICgiT3JnaW5pYWwgQksgUEFSQU06IDB4JXhcbiIsIE9ETV9SZWFkNEJ5dGUocERNX09kbSwgT0RNX0VEQ0FfQktfUEFSQU0pKSk7CisJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0VEQ0FfVFVSQk8sIE9ETV9EQkdfTE9VRCwgKCJPcmdpbmlhbCBWTyBQQVJBTTogMHgleFxuIiwgcnR3X3JlYWQzMihBZGFwdGVyLCBPRE1fRURDQV9WT19QQVJBTSkpKTsKKwlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRURDQV9UVVJCTywgT0RNX0RCR19MT1VELCAoIk9yZ2luaWFsIFZJIFBBUkFNOiAweCV4XG4iLCBydHdfcmVhZDMyKEFkYXB0ZXIsIE9ETV9FRENBX1ZJX1BBUkFNKSkpOworCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9FRENBX1RVUkJPLCBPRE1fREJHX0xPVUQsICgiT3JnaW5pYWwgQkUgUEFSQU06IDB4JXhcbiIsIHJ0d19yZWFkMzIoQWRhcHRlciwgT0RNX0VEQ0FfQkVfUEFSQU0pKSk7CisJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0VEQ0FfVFVSQk8sIE9ETV9EQkdfTE9VRCwgKCJPcmdpbmlhbCBCSyBQQVJBTTogMHgleFxuIiwgcnR3X3JlYWQzMihBZGFwdGVyLCBPRE1fRURDQV9CS19QQVJBTSkpKTsKIH0JLyogIE9ETV9Jbml0RWRjYVR1cmJvICovCiAKIHZvaWQgb2RtX0VkY2FUdXJib0NoZWNrKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvb2RtX1JlZ0NvbmZpZzgxODhFLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG1fUmVnQ29uZmlnODE4OEUuYwppbmRleCA2MTkzZDlmLi5hOTg4NjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG1fUmVnQ29uZmlnODE4OEUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG1fUmVnQ29uZmlnODE4OEUuYwpAQCAtNjYsNyArNjYsOSBAQAogCiB2b2lkIG9kbV9Db25maWdNQUNfODE4OEUoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHUzMiBBZGRyLCB1OCBEYXRhKQogewotCU9ETV9Xcml0ZTFCeXRlKHBETV9PZG0sIEFkZHIsIERhdGEpOworCXN0cnVjdCBhZGFwdGVyICphZGFwdCA9IHBETV9PZG0tPkFkYXB0ZXI7CisKKwlydHdfd3JpdGU4KGFkYXB0LCBBZGRyLCBEYXRhKTsKIAlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfSU5JVCwgT0RNX0RCR19UUkFDRSwgKCI9PT0+IE9ETV9Db25maWdNQUNXaXRoSGVhZGVyRmlsZTogW01BQ19SRUddICUwOFggJTA4WFxuIiwgQWRkciwgRGF0YSkpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG1faW50ZXJmYWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG1faW50ZXJmYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZDY4MjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvb2RtX2ludGVyZmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAib2RtX3ByZWNvbXAuaCIKLS8qICBPRE0gSU8gUmVsYXRpdmUgQVBJLiAqLwotCi11OCBPRE1fUmVhZDFCeXRlKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB1MzIgUmVnQWRkcikKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0JcmV0dXJuIHJ0d19yZWFkOChBZGFwdGVyLCBSZWdBZGRyKTsKLX0KLQotdTE2IE9ETV9SZWFkMkJ5dGUoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyKQotewotCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQlyZXR1cm4gcnR3X3JlYWQxNihBZGFwdGVyLCBSZWdBZGRyKTsKLX0KLQotdTMyIE9ETV9SZWFkNEJ5dGUoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyKQotewotCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQlyZXR1cm4gcnR3X3JlYWQzMihBZGFwdGVyLCBSZWdBZGRyKTsKLX0KLQotdm9pZCBPRE1fV3JpdGUxQnl0ZShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIsIHU4IERhdGEpCi17Ci0Jc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCXJ0d193cml0ZTgoQWRhcHRlciwgUmVnQWRkciwgRGF0YSk7Ci19Ci0KLXZvaWQgT0RNX1dyaXRlMkJ5dGUoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyLCB1MTYgRGF0YSkKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0JcnR3X3dyaXRlMTYoQWRhcHRlciwgUmVnQWRkciwgRGF0YSk7Ci19Ci0KLXZvaWQgT0RNX1dyaXRlNEJ5dGUoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyLCB1MzIgRGF0YSkKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0JcnR3X3dyaXRlMzIoQWRhcHRlciwgUmVnQWRkciwgRGF0YSk7Ci19Ci0KLS8qICBPRE0gTWVtb3J5IHJlbGF0aXZlIEFQSS4gKi8KLXZvaWQgT0RNX0FsbG9jYXRlTWVtb3J5KHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB2b2lkICoqcFB0ciwgdTMyIGxlbmd0aCkKLXsKLQkqcFB0ciA9IHJ0d196dm1hbGxvYyhsZW5ndGgpOwotfQotCi0vKiAgbGVuZ3RoIGNvdWxkIGJlIGlnbm9yZWQsIHVzZWQgdG8gZGV0ZWN0IG1lbW9yeSBsZWFrYWdlLiAqLwotdm9pZCBPRE1fRnJlZU1lbW9yeShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdm9pZCAqcFB0ciwgdTMyIGxlbmd0aCkKLXsKLQlydHdfdm1mcmVlKHBQdHIsIGxlbmd0aCk7Ci19Ci0KLXMzMiBPRE1fQ29tcGFyZU1lbW9yeShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdm9pZCAqcEJ1ZjEsIHZvaWQgKnBCdWYyLCB1MzIgbGVuZ3RoKQotewotCXJldHVybiBfcnR3X21lbWNtcChwQnVmMSwgcEJ1ZjIsIGxlbmd0aCk7Ci19Ci0KLXZvaWQgT0RNX1NldFRpbWVyKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCBzdHJ1Y3QgdGltZXJfbGlzdCAqcFRpbWVyLCB1MzIgbXNEZWxheSkKLXsKLQlfc2V0X3RpbWVyKHBUaW1lciwgbXNEZWxheSk7IC8qIG1zICovCi19Ci0KLXZvaWQgT0RNX0luaXRpYWxpemVUaW1lcihzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgc3RydWN0IHRpbWVyX2xpc3QgKnBUaW1lciwKLQkJCSB2b2lkICpDYWxsQmFja0Z1bmMsIHZvaWQgKnBDb250ZXh0LAotCQkJIGNvbnN0IGNoYXIgKnN6SUQpCi17Ci0Jc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCV9pbml0X3RpbWVyKHBUaW1lciwgQWRhcHRlci0+cG5ldGRldiwgQ2FsbEJhY2tGdW5jLCBwRE1fT2RtKTsKLX0KLQotdm9pZCBPRE1fQ2FuY2VsVGltZXIoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHN0cnVjdCB0aW1lcl9saXN0ICpwVGltZXIpCi17Ci0JX2NhbmNlbF90aW1lcl9leChwVGltZXIpOwotfQotCi0vKiAgT0RNIEZXIHJlbGF0aXZlIEFQSS4gKi8KLXUzMiBPRE1fRmlsbEgyQ0NtZCh1OCAqcEgyQ0J1ZmZlciwgdTMyIEgyQ0J1ZmZlckxlbiwgdTMyIENtZE51bSwKLQkJICAgICAgdTMyICpwRWxlbWVudElELCB1MzIgKnBDbWRMZW4sCi0JCSAgICAgIHU4ICoqcENtYkJ1ZmZlciwgdTggKkNtZFN0YXJ0U2VxKQotewotCXJldHVybgl0cnVlOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfY21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9jbWQuYwppbmRleCBjYTBhNzA4Li4wMjFlNTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9jbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9jbWQuYwpAQCAtNzIsNyArNzIsNiBAQAogCXUzMiBoMmNfY21kX2V4ID0gMDsKIAlzMzIgcmV0ID0gX0ZBSUw7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmICghYWRhcHQtPmJGV1JlYWR5KSB7CiAJCURCR184OEUoIkZpbGxIMkNDbWRfODhFKCk6IHJldHVybiBIMkMgY21kIGJlY2F1c2UgZncgaXMgbm90IHJlYWR5XG4iKTsKQEAgLTEyNSw3ICsxMjQsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMzQsNyArMTMyLDYgQEAKIHsKIAl1OCByZXMgPSBfU1VDQ0VTUzsKIAlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKGhhbGRhdGEtPmZ3X3JhY3RybCkgewogCQk7CkBAIC0xNDMsNyArMTQwLDYgQEAKIAkJcmVzID0gX0ZBSUw7CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xNTQsNyArMTUwLDYgQEAKIAl1OCByZXMgPSBfU1VDQ0VTUzsKIAlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwogCi1fZnVuY19lbnRlcl87CiAJaWYgKGhhbGRhdGEtPmZ3X3JhY3RybCkgewogCQlfX2xlMzIgbG1hc2s7CiAKQEAgLTE2OCw3ICsxNjMsNiBAQAogCQlyZXMgPSBfRkFJTDsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTIxNSw3ICsyMDksNiBAQAogCXN0cnVjdCBzZXRwd3Jtb2RlX3Bhcm0gSDJDU2V0UHdyTW9kZTsKIAlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJmFkYXB0LT5wd3JjdHJscHJpdjsKIAl1OCBSTEJNID0gMDsgLyogIDA6TWluLCAxOk1heCwgMjpVc2VyIGRlZmluZSAqLwotX2Z1bmNfZW50ZXJfOwogCiAJREJHXzg4RSgiJXM6IE1vZGU9JWQgU21hcnRQUz0lZCBVQVBTRD0lZFxuIiwgX19mdW5jX18sCiAJCU1vZGUsIHB3cnByaXYtPnNtYXJ0X3BzLCBhZGFwdC0+cmVnaXN0cnlwcml2LnVhcHNkX2VuYWJsZSk7CkBAIC0yNTYsNyArMjQ5LDYgQEAKIAogCUZpbGxIMkNDbWRfODhFKGFkYXB0LCBIMkNfUFNfUFdSX01PREUsIHNpemVvZihIMkNTZXRQd3JNb2RlKSwgKHU4ICopJkgyQ1NldFB3ck1vZGUpOwogCi1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydGw4MTg4ZV9zZXRfRndNZWRpYVN0YXR1c19jbWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBfX2xlMTYgbXN0YXR1c19ycHQpCkBAIC02MTcsNyArNjA5LDYgQEAKIAl1OCBETEJjbkNvdW50ID0gMDsKIAl1MzIgcG9sbCA9IDA7CiAKLV9mdW5jX2VudGVyXzsKIAogCURCR184OEUoIiVzIG1zdGF0dXMoJXgpXG4iLCBfX2Z1bmNfXywgbXN0YXR1cyk7CiAKQEAgLTcwMSw3ICs2OTIsNiBAQAogCQloYWxkYXRhLT5SZWdDUl8xICY9ICh+QklUMCk7CiAJCXJ0d193cml0ZTgoYWRhcHQsICBSRUdfQ1IrMSwgaGFsZGF0YS0+UmVnQ1JfMSk7CiAJfQotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnRsODE4OGVfc2V0X3AycF9wc19vZmZsb2FkX2NtZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHU4IHAycF9wc19zdGF0ZSkKQEAgLTcxMiw3ICs3MDIsNiBAQAogCXN0cnVjdCBQMlBfUFNfT2ZmbG9hZF90CSpwMnBfcHNfb2ZmbG9hZCA9ICZoYWxkYXRhLT5wMnBfcHNfb2ZmbG9hZDsKIAl1OCBpOwogCi1fZnVuY19lbnRlcl87CiAKIAlzd2l0Y2ggKHAycF9wc19zdGF0ZSkgewogCWNhc2UgUDJQX1BTX0RJU0FCTEU6CkBAIC03NzUsNSArNzY0LDQgQEAKIAlGaWxsSDJDQ21kXzg4RShhZGFwdCwgSDJDX1BTX1AyUF9PRkZMT0FELCAxLCAodTggKilwMnBfcHNfb2ZmbG9hZCk7CiAjZW5kaWYKIAotX2Z1bmNfZXhpdF87CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfZG0uYwppbmRleCA0YzkzNGUyLi5jZjg4YmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9kbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2RtLmMKQEAgLTE2MCw3ICsxNjAsNiBAQAogCXU4IGh3X2luaXRfY29tcGxldGVkID0gZmFsc2U7CiAJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKIAotCV9mdW5jX2VudGVyXzsKIAlod19pbml0X2NvbXBsZXRlZCA9IEFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkOwogCiAJaWYgKCFod19pbml0X2NvbXBsZXRlZCkKQEAgLTE3OCw3ICsxNzcsNiBAQAogCQkvKiAgQ2FsY3VsYXRlIFR4L1J4IHN0YXRpc3RpY3MuICovCiAJCWRtX0NoZWNrU3RhdGlzdGljcyhBZGFwdGVyKTsKIAotCV9mdW5jX2V4aXRfOwogCX0KIAogCS8qIE9ETSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfaGFsX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2hhbF9pbml0LmMKaW5kZXggNTkyMWRiOC4uZjlkNTU1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfaGFsX2luaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9oYWxfaW5pdC5jCkBAIC0yMCw2ICsyMCw3IEBACiAjZGVmaW5lIF9IQUxfSU5JVF9DXwogCiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+CiAjaW5jbHVkZSA8cnR3X2VmdXNlLmg+CiAKQEAgLTM2NSw3ICszNjYsNyBAQAogCXUzMiBmaWZvX2RhdGEsIHJlZ18xNDA7CiAJdTMyIGFkZHIsIHJzdGF0dXMsIGxvb3AgPSAwOwogCXUxNiBkYXRhX2NudHMgPSAoZGF0YV9sZW4vOCkrMTsKLQl1OCAqcGJ1ZiA9IHJ0d196dm1hbGxvYyhkYXRhX2xlbisxMCk7CisJdTggKnBidWYgPSB2emFsbG9jKGRhdGFfbGVuKzEwKTsKIAlEQkdfODhFKCIjIyMjIyMgJXMgIyMjIyMjXG4iLCBfX2Z1bmNfXyk7CiAKIAlydHdfd3JpdGU4KEFkYXB0ZXIsIFJFR19QS1RfQlVGRl9BQ0NFU1NfQ1RSTCwgVFhQS1RfQlVGX1NFTEVDVCk7CkBAIC0zODcsNyArMzg4LDcgQEAKIAkJCX0gd2hpbGUgKCFyc3RhdHVzICYmIChsb29wKysgPCAxMCkpOwogCQl9CiAJCXJ0d19JT0xfY21kX2J1Zl9kdW1wKEFkYXB0ZXIsIGRhdGFfbGVuLCBwYnVmKTsKLQkJcnR3X3ZtZnJlZShwYnVmLCBkYXRhX2xlbisxMCk7CisJCXZmcmVlKHBidWYpOwogCX0KIAlEQkdfODhFKCIjIyMjIyMgJXMgIyMjIyMjXG4iLCBfX2Z1bmNfXyk7CiB9CkBAIC01ODMsNiArNTg0LDQ1IEBACiAKICNkZWZpbmUgSVNfRldfODF4eEMocGFkYXB0ZXIpCSgoKEdFVF9IQUxfREFUQShwYWRhcHRlcikpLT5GaXJtd2FyZVNpZ25hdHVyZSAmIDB4RkZGMCkgPT0gMHg4OEMwKQogCitzdGF0aWMgaW50IGxvYWRfZmlybXdhcmUoc3RydWN0IHJ0X2Zpcm13YXJlICpwRmlybXdhcmUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlpbnQgcnRzdGF0dXMgPSBfU1VDQ0VTUzsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCWNvbnN0IGNoYXIgZndfbmFtZVtdID0gInJ0bHdpZmkvcnRsODE4OGV1ZncuYmluIjsKKworCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfbmFtZSwgZGV2aWNlKSkgeworCQlydHN0YXR1cyA9IF9GQUlMOworCQlnb3RvIGV4aXQ7CisJfQorCWlmICghZncpIHsKKwkJcHJfZXJyKCJGaXJtd2FyZSAlcyBub3QgYXZhaWxhYmxlXG4iLCBmd19uYW1lKTsKKwkJcnRzdGF0dXMgPSBfRkFJTDsKKwkJZ290byBleGl0OworCX0KKwlpZiAoZnctPnNpemUgPiBGV184MTg4RV9TSVpFKSB7CisJCXJ0c3RhdHVzID0gX0ZBSUw7CisJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKKwkJCSAoIkZpcm13YXJlIHNpemUgZXhjZWVkIDB4JVguIENoZWNrIGl0LlxuIiwKKwkJCSBGV184MTg4RV9TSVpFKSk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlwRmlybXdhcmUtPnN6RndCdWZmZXIgPSBremFsbG9jKEZXXzgxODhFX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghcEZpcm13YXJlLT5zekZ3QnVmZmVyKSB7CisJCXJ0c3RhdHVzID0gX0ZBSUw7CisJCWdvdG8gZXhpdDsKKwl9CisJbWVtY3B5KHBGaXJtd2FyZS0+c3pGd0J1ZmZlciwgZnctPmRhdGEsIGZ3LT5zaXplKTsKKwlwRmlybXdhcmUtPnVsRndMZW5ndGggPSBmdy0+c2l6ZTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKworCURCR184OEVfTEVWRUwoX2Rydl9pbmZvXywKKwkJICAgICAgIislczogIWJVc2VkV29XTEFORncsIEZtcm13YXJlTGVuOiVkK1xuIiwgX19mdW5jX18sCisJCSAgICAgIHBGaXJtd2FyZS0+dWxGd0xlbmd0aCk7CitleGl0OgorCXJldHVybiBydHN0YXR1czsKK30KKwogczMyIHJ0bDgxODhlX0Zpcm13YXJlRG93bmxvYWQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewogCXMzMglydFN0YXR1cyA9IF9TVUNDRVNTOwpAQCAtNTkxLDUxICs2MzEsMjMgQEAKIAlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKIAlzdHJ1Y3QgZHZvYmpfcHJpdiAqZHZvYmogPSBhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXZpY2UgPSBkdm9ial90b19kZXYoZHZvYmopOwotCXN0cnVjdCBydF9maXJtd2FyZSAqcEZpcm13YXJlID0gTlVMTDsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCXN0cnVjdCBydF9maXJtd2FyZV9oZHIgKnBGd0hkciA9IE5VTEw7CiAJdTggKnBGaXJtd2FyZUJ1ZjsKIAl1MzIgRmlybXdhcmVMZW47Ci0JY2hhciBmd19uYW1lW10gPSAicnRsd2lmaS9ydGw4MTg4ZXVmdy5iaW4iOwogCXN0YXRpYyBpbnQgbG9nX3ZlcnNpb247CiAKIAlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAoIislc1xuIiwgX19mdW5jX18pKTsKLQlwRmlybXdhcmUgPSAoc3RydWN0IHJ0X2Zpcm13YXJlICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9maXJtd2FyZSkpOwotCWlmICghcEZpcm13YXJlKSB7Ci0JCXJ0U3RhdHVzID0gX0ZBSUw7CisJaWYgKCFkdm9iai0+ZmlybXdhcmUuc3pGd0J1ZmZlcikKKwkJcnRTdGF0dXMgPSBsb2FkX2Zpcm13YXJlKCZkdm9iai0+ZmlybXdhcmUsIGRldmljZSk7CisJaWYgKHJ0U3RhdHVzID09IF9GQUlMKSB7CisJCWR2b2JqLT5maXJtd2FyZS5zekZ3QnVmZmVyID0gTlVMTDsKIAkJZ290byBFeGl0OwogCX0KLQotCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfbmFtZSwgZGV2aWNlKSkgewotCQlydFN0YXR1cyA9IF9GQUlMOwotCQlnb3RvIEV4aXQ7Ci0JfQotCWlmICghZncpIHsKLQkJcHJfZXJyKCJGaXJtd2FyZSAlcyBub3QgYXZhaWxhYmxlXG4iLCBmd19uYW1lKTsKLQkJcnRTdGF0dXMgPSBfRkFJTDsKLQkJZ290byBFeGl0OwotCX0KLQlpZiAoZnctPnNpemUgPiBGV184MTg4RV9TSVpFKSB7Ci0JCXJ0U3RhdHVzID0gX0ZBSUw7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfZXJyXywgKCJGaXJtd2FyZSBzaXplIGV4Y2VlZCAweCVYLiBDaGVjayBpdC5cbiIsIEZXXzgxODhFX1NJWkUpKTsKLQkJZ290byBFeGl0OwotCX0KLQotCXBGaXJtd2FyZS0+c3pGd0J1ZmZlciA9IGt6YWxsb2MoRldfODE4OEVfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwRmlybXdhcmUtPnN6RndCdWZmZXIpIHsKLQkJcnRTdGF0dXMgPSBfRkFJTDsKLQkJZ290byBFeGl0OwotCX0KLQltZW1jcHkocEZpcm13YXJlLT5zekZ3QnVmZmVyLCBmdy0+ZGF0YSwgZnctPnNpemUpOwotCXBGaXJtd2FyZS0+dWxGd0xlbmd0aCA9IGZ3LT5zaXplOwotCXBGaXJtd2FyZUJ1ZiA9IHBGaXJtd2FyZS0+c3pGd0J1ZmZlcjsKLQlGaXJtd2FyZUxlbiA9IHBGaXJtd2FyZS0+dWxGd0xlbmd0aDsKLQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQotCURCR184OEVfTEVWRUwoX2Rydl9pbmZvXywgIislczogIWJVc2VkV29XTEFORncsIEZtcm13YXJlTGVuOiVkK1xuIiwgX19mdW5jX18sIEZpcm13YXJlTGVuKTsKKwlwRmlybXdhcmVCdWYgPSBkdm9iai0+ZmlybXdhcmUuc3pGd0J1ZmZlcjsKKwlGaXJtd2FyZUxlbiA9IGR2b2JqLT5maXJtd2FyZS51bEZ3TGVuZ3RoOwogCiAJLyogIFRvIENoZWNrIEZ3IGhlYWRlci4gQWRkZWQgYnkgdHlubGkuIDIwMDkuMTIuMDQuICovCi0JcEZ3SGRyID0gKHN0cnVjdCBydF9maXJtd2FyZV9oZHIgKilwRmlybXdhcmUtPnN6RndCdWZmZXI7CisJcEZ3SGRyID0gKHN0cnVjdCBydF9maXJtd2FyZV9oZHIgKilkdm9iai0+ZmlybXdhcmUuc3pGd0J1ZmZlcjsKIAogCXBIYWxEYXRhLT5GaXJtd2FyZVZlcnNpb24gPSAgbGUxNl90b19jcHUocEZ3SGRyLT5WZXJzaW9uKTsKIAlwSGFsRGF0YS0+RmlybXdhcmVTdWJWZXJzaW9uID0gcEZ3SGRyLT5TdWJ2ZXJzaW9uOwpAQCAtNjg3LDEwICs2OTksNyBAQAogCQlnb3RvIEV4aXQ7CiAJfQogCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sICgiRmlybXdhcmUgaXMgcmVhZHkgdG8gcnVuIVxuIikpOwotCWtmcmVlKHBGaXJtd2FyZS0+c3pGd0J1ZmZlcik7CiBFeGl0OgotCi0Ja2ZyZWUocEZpcm13YXJlKTsKIAlyZXR1cm4gcnRTdGF0dXM7CiB9CiAKQEAgLTcwNywxMCArNzE2LDggQEAKIAogc3RhdGljIHZvaWQgcnRsODE4OGVfZnJlZV9oYWxfZGF0YShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7Ci1fZnVuY19lbnRlcl87CiAJa2ZyZWUocGFkYXB0ZXItPkhhbERhdGEpOwogCXBhZGFwdGVyLT5IYWxEYXRhID0gTlVMTDsKLV9mdW5jX2V4aXRfOwogfQogCiAvKiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX21wLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9tcC5jCmluZGV4IDNkMGU2YzkuLmE0ZDA1N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX21wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfbXAuYwpAQCAtMTE1LDE0ICsxMTUsMTIgQEAKIAogCiAJCS8qIFdyaXRlIDB4YTI0IH4gMHhhMjcgKi8KLQkJVGVtcFZhbDIgPSAwOwogCQlUZW1wVmFsMiA9IENDS1N3aW5nVGFibGVfQ2gxX0NoMTNbQ0NLU3dpbmdJbmRleF1bMl0gKwogCQkJCShDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW0NDS1N3aW5nSW5kZXhdWzNdPDw4KSArCiAJCQkJKENDS1N3aW5nVGFibGVfQ2gxX0NoMTNbQ0NLU3dpbmdJbmRleF1bNF08PDE2KSsKIAkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tDQ0tTd2luZ0luZGV4XVs1XTw8MjQpOwogCiAJCS8qIFdyaXRlIDB4YTI4ICAweGEyOSAqLwotCQlUZW1wVmFsMyA9IDA7CiAJCVRlbXBWYWwzID0gQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tDQ0tTd2luZ0luZGV4XVs2XSArCiAJCQkJKENDS1N3aW5nVGFibGVfQ2gxX0NoMTNbQ0NLU3dpbmdJbmRleF1bN108PDgpOwogCX0gZWxzZSB7CkBAIC0xMzksMTQgKzEzNywxMiBAQAogCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbQ0NLU3dpbmdJbmRleF1bMV08PDgpOwogCiAJCS8qIFdyaXRlIDB4YTI0IH4gMHhhMjcgKi8KLQkJVGVtcFZhbDIgPSAwOwogCQlUZW1wVmFsMiA9IENDS1N3aW5nVGFibGVfQ2gxNFtDQ0tTd2luZ0luZGV4XVsyXSArCiAJCQkJKENDS1N3aW5nVGFibGVfQ2gxNFtDQ0tTd2luZ0luZGV4XVszXTw8OCkgKwogCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbQ0NLU3dpbmdJbmRleF1bNF08PDE2KSsKIAkJCQkoQ0NLU3dpbmdUYWJsZV9DaDE0W0NDS1N3aW5nSW5kZXhdWzVdPDwyNCk7CiAKIAkJLyogV3JpdGUgMHhhMjggIDB4YTI5ICovCi0JCVRlbXBWYWwzID0gMDsKIAkJVGVtcFZhbDMgPSBDQ0tTd2luZ1RhYmxlX0NoMTRbQ0NLU3dpbmdJbmRleF1bNl0gKwogCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbQ0NLU3dpbmdJbmRleF1bN108PDgpOwogCX0KQEAgLTE4NCwxMiArMTgwLDEyIEBACiAJCVRlbXBDQ2sgPSByZWFkX2JicmVnKHBBZGFwdGVyLCByQ0NLMF9UeEZpbHRlcjIsIGJNYXNrRFdvcmQpICYgYk1hc2tDQ0s7CiAJCWZvciAoaSA9IDA7IGkgPCBDQ0tfVEFCTEVfU0laRTsgaSsrKSB7CiAJCQlpZiAocERNX09kbS0+UkZDYWxpYnJhdGVJbmZvLmJDQ0tpbkNIMTQpIHsKLQkJCQlpZiAoX3J0d19tZW1jbXAoKHZvaWQgKikmVGVtcENDaywgKHZvaWQgKikmQ0NLU3dpbmdUYWJsZV9DaDE0W2ldWzJdLCA0KSkgeworCQkJCWlmICghbWVtY21wKCh2b2lkICopJlRlbXBDQ2ssICh2b2lkICopJkNDS1N3aW5nVGFibGVfQ2gxNFtpXVsyXSwgNCkpIHsKIAkJCQkJQ0NLX2luZGV4X29sZCA9ICh1OClpOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCWlmIChfcnR3X21lbWNtcCgodm9pZCAqKSZUZW1wQ0NrLCAodm9pZCAqKSZDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW2ldWzJdLCA0KSkgeworCQkJCWlmICghbWVtY21wKCh2b2lkICopJlRlbXBDQ2ssICh2b2lkICopJkNDS1N3aW5nVGFibGVfQ2gxX0NoMTNbaV1bMl0sIDQpKSB7CiAJCQkJCUNDS19pbmRleF9vbGQgPSAodTgpaTsKIAkJCQkJYnJlYWs7CiAJCQkJfQpAQCAtMjAxLDYgKzE5Nyw4IEBACiAJCWVsc2UKIAkJCUNDS19pbmRleCA9IENDS19pbmRleF9vbGQgKyAxOwogCisJCWlmIChDQ0tfaW5kZXggPiAzMikKKwkJCUNDS19pbmRleCA9IDMyOwogCQkvKiBBZGp1c3QgQ0NLIGFjY29yZGluZyB0byBnYWluIGluZGV4ICovCiAJCWlmICghcERNX09kbS0+UkZDYWxpYnJhdGVJbmZvLmJDQ0tpbkNIMTQpIHsKIAkJCXJ0d193cml0ZTgocEFkYXB0ZXIsIDB4YTIyLCBDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW0NDS19pbmRleF1bMF0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfcnhkZXNjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9yeGRlc2MuYwppbmRleCA1MTFmNjFjLi40M2ViOTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9yeGRlc2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9yeGRlc2MuYwpAQCAtMjMsOSArMjMsOSBAQAogI2luY2x1ZGUgPGRydl90eXBlcy5oPgogI2luY2x1ZGUgPHJ0bDgxODhlX2hhbC5oPgogCi1zdGF0aWMgdm9pZCBwcm9jZXNzX3Jzc2koc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmZyYW1lKQorc3RhdGljIHZvaWQgcHJvY2Vzc19yc3NpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUpCiB7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJmcmFtZS0+dS5oZHIuYXR0cmliOworCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZnJhbWUtPmF0dHJpYjsKIAlzdHJ1Y3Qgc2lnbmFsX3N0YXQgKnNpZ25hbF9zdGF0ID0gJnBhZGFwdGVyLT5yZWN2cHJpdi5zaWduYWxfc3RyZW5ndGhfZGF0YTsKIAogCWlmIChzaWduYWxfc3RhdC0+dXBkYXRlX3JlcSkgewpAQCAtMzksNyArMzksOCBAQAogCXNpZ25hbF9zdGF0LT5hdmdfdmFsID0gc2lnbmFsX3N0YXQtPnRvdGFsX3ZhbCAvIHNpZ25hbF9zdGF0LT50b3RhbF9udW07CiB9IC8qICBQcm9jZXNzX1VJX1JTU0lfODE5MkMgKi8KIAotc3RhdGljIHZvaWQgcHJvY2Vzc19saW5rX3F1YWwoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmZyYW1lKQorc3RhdGljIHZvaWQgcHJvY2Vzc19saW5rX3F1YWwoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAorCQkJICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUpCiB7CiAJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWI7CiAJc3RydWN0IHNpZ25hbF9zdGF0ICpzaWduYWxfc3RhdDsKQEAgLTQ3LDcgKzQ4LDcgQEAKIAlpZiAocHJmcmFtZSA9PSBOVUxMIHx8IHBhZGFwdGVyID09IE5VTEwpCiAJCXJldHVybjsKIAotCXBhdHRyaWIgPSAmcHJmcmFtZS0+dS5oZHIuYXR0cmliOworCXBhdHRyaWIgPSAmcHJmcmFtZS0+YXR0cmliOwogCXNpZ25hbF9zdGF0ID0gJnBhZGFwdGVyLT5yZWN2cHJpdi5zaWduYWxfcXVhbF9kYXRhOwogCiAJaWYgKHNpZ25hbF9zdGF0LT51cGRhdGVfcmVxKSB7CkBAIC02Myw3ICs2NCw3IEBACiAKIHZvaWQgcnRsODE4OGVfcHJvY2Vzc19waHlfaW5mbyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHZvaWQgKnByZnJhbWUpCiB7Ci0JdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSA9ICh1bmlvbiByZWN2X2ZyYW1lICopcHJmcmFtZTsKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSA9IChzdHJ1Y3QgcmVjdl9mcmFtZSAqKXByZnJhbWU7CiAKIAkvKiAgQ2hlY2sgUlNTSSAqLwogCXByb2Nlc3NfcnNzaShwYWRhcHRlciwgcHJlY3ZmcmFtZSk7CkBAIC03MSw3ICs3Miw4IEBACiAJcHJvY2Vzc19saW5rX3F1YWwocGFkYXB0ZXIsICBwcmVjdmZyYW1lKTsKIH0KIAotdm9pZCB1cGRhdGVfcmVjdmZyYW1lX2F0dHJpYl84OGUodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgc3RydWN0IHJlY3Zfc3RhdCAqcHJ4c3RhdCkKK3ZvaWQgdXBkYXRlX3JlY3ZmcmFtZV9hdHRyaWJfODhlKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLAorCQkJCSBzdHJ1Y3QgcmVjdl9zdGF0ICpwcnhzdGF0KQogewogCXN0cnVjdCByeF9wa3RfYXR0cmliCSpwYXR0cmliOwogCXN0cnVjdCByZWN2X3N0YXQJcmVwb3J0OwpAQCAtODMsNyArODUsNyBAQAogCXJlcG9ydC5yeGR3NCA9IHByeHN0YXQtPnJ4ZHc0OwogCXJlcG9ydC5yeGR3NSA9IHByeHN0YXQtPnJ4ZHc1OwogCi0JcGF0dHJpYiA9ICZwcmVjdmZyYW1lLT51Lmhkci5hdHRyaWI7CisJcGF0dHJpYiA9ICZwcmVjdmZyYW1lLT5hdHRyaWI7CiAJX3J0d19tZW1zZXQocGF0dHJpYiwgMCwgc2l6ZW9mKHN0cnVjdCByeF9wa3RfYXR0cmliKSk7CiAKIAlwYXR0cmliLT5jcmNfZXJyID0gKHU4KSgobGUzMl90b19jcHUocmVwb3J0LnJ4ZHcwKSA+PiAxNCkgJiAweDEpOy8qIHU4KXByeHJlcG9ydC0+Y3JjMzI7ICovCkBAIC0xMzYsMTIgKzEzOCwxMyBAQAogLyoKICAqIE5vdGljZToKICAqCUJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sCi0gKglwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhIHNob3VsZCBiZSByZWFkeSEKKyAqCXByZWN2ZnJhbWUtPnJ4X2RhdGEgc2hvdWxkIGJlIHJlYWR5IQogICovCi12b2lkIHVwZGF0ZV9yZWN2ZnJhbWVfcGh5aW5mb184OGUodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgc3RydWN0IHBoeV9zdGF0ICpwcGh5X3N0YXR1cykKK3ZvaWQgdXBkYXRlX3JlY3ZmcmFtZV9waHlpbmZvXzg4ZShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwKKwkJCQkgIHN0cnVjdCBwaHlfc3RhdCAqcHBoeV9zdGF0dXMpCiB7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gcHJlY3ZmcmFtZS0+dS5oZHIuYWRhcHRlcjsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdmZyYW1lLT51Lmhkci5hdHRyaWI7CisJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gcHJlY3ZmcmFtZS0+YWRhcHRlcjsKKwlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdmZyYW1lLT5hdHRyaWI7CiAJc3RydWN0IGhhbF9kYXRhXzgxODhlICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7CiAJc3RydWN0IG9kbV9waHlfc3RhdHVzX2luZm8gKnBQSFlJbmZvICA9IChzdHJ1Y3Qgb2RtX3BoeV9zdGF0dXNfaW5mbyAqKSgmcGF0dHJpYi0+cGh5X2luZm8pOwogCXU4ICp3bGFuaGRyOwpAQCAtMTU0LDE1ICsxNTcsMTUgQEAKIAlwa3RfaW5mby5iUGFja2V0VG9TZWxmID0gZmFsc2U7CiAJcGt0X2luZm8uYlBhY2tldEJlYWNvbiA9IGZhbHNlOwogCi0Jd2xhbmhkciA9IGdldF9yZWN2ZnJhbWVfZGF0YShwcmVjdmZyYW1lKTsKKwl3bGFuaGRyID0gcHJlY3ZmcmFtZS0+cnhfZGF0YTsKIAogCXBrdF9pbmZvLmJQYWNrZXRNYXRjaEJTU0lEID0gKCghSXNGcmFtZVR5cGVDdHJsKHdsYW5oZHIpKSAmJgogCQkhcGF0dHJpYi0+aWN2X2VyciAmJiAhcGF0dHJpYi0+Y3JjX2VyciAmJgotCQlfcnR3X21lbWNtcChnZXRfaGRyX2Jzc2lkKHdsYW5oZHIpLAorCQkhbWVtY21wKGdldF9oZHJfYnNzaWQod2xhbmhkciksCiAJCSBnZXRfYnNzaWQoJnBhZGFwdGVyLT5tbG1lcHJpdiksIEVUSF9BTEVOKSk7CiAKIAlwa3RfaW5mby5iUGFja2V0VG9TZWxmID0gcGt0X2luZm8uYlBhY2tldE1hdGNoQlNTSUQgJiYKLQkJCQkgKF9ydHdfbWVtY21wKGdldF9kYSh3bGFuaGRyKSwKKwkJCQkgKCFtZW1jbXAoZ2V0X2RhKHdsYW5oZHIpLAogCQkJCSAgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBFVEhfQUxFTikpOwogCiAJcGt0X2luZm8uYlBhY2tldEJlYWNvbiA9IHBrdF9pbmZvLmJQYWNrZXRNYXRjaEJTU0lEICYmCkBAIC0xODUsMTcgKzE4OCwxNyBAQAogCiAJT0RNX1BoeVN0YXR1c1F1ZXJ5KCZwSGFsRGF0YS0+b2RtcHJpdiwgcFBIWUluZm8sICh1OCAqKXBwaHlfc3RhdHVzLCAmKHBrdF9pbmZvKSk7CiAKLQlwcmVjdmZyYW1lLT51Lmhkci5wc3RhID0gTlVMTDsKKwlwcmVjdmZyYW1lLT5wc3RhID0gTlVMTDsKIAlpZiAocGt0X2luZm8uYlBhY2tldE1hdGNoQlNTSUQgJiYKIAkgICAgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpKSB7CiAJCWlmIChwc3RhKSB7Ci0JCQlwcmVjdmZyYW1lLT51Lmhkci5wc3RhID0gcHN0YTsKKwkJCXByZWN2ZnJhbWUtPnBzdGEgPSBwc3RhOwogCQkJcnRsODE4OGVfcHJvY2Vzc19waHlfaW5mbyhwYWRhcHRlciwgcHJlY3ZmcmFtZSk7CiAJCX0KIAl9IGVsc2UgaWYgKHBrdF9pbmZvLmJQYWNrZXRUb1NlbGYgfHwgcGt0X2luZm8uYlBhY2tldEJlYWNvbikgewogCQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFfFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkgewogCQkJaWYgKHBzdGEpCi0JCQkJcHJlY3ZmcmFtZS0+dS5oZHIucHN0YSA9IHBzdGE7CisJCQkJcHJlY3ZmcmFtZS0+cHN0YSA9IHBzdGE7CiAJCX0KIAkJcnRsODE4OGVfcHJvY2Vzc19waHlfaW5mbyhwYWRhcHRlciwgcHJlY3ZmcmFtZSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X3JlY3YuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV9yZWN2LmMKaW5kZXggMTdjOTRmNC4uYjFiMTU4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X3JlY3YuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfcmVjdi5jCkBAIC0yMiw5ICsyMiw2IEBACiAjaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+CiAjaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgogI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KLSNpbmNsdWRlIDxpcC5oPgotI2luY2x1ZGUgPGlmX2V0aGVyLmg+Ci0jaW5jbHVkZSA8ZXRoZXJuZXQuaD4KIAogI2luY2x1ZGUgPHVzYl9vcHMuaD4KICNpbmNsdWRlIDx3aWZpLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfeG1pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X3htaXQuYwppbmRleCA2ZmI2YTQ2Li4zNDc2Zjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfeG1pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV94bWl0LmMKQEAgLTUzNywxMSArNTM3LDExIEBACiAJc3Bpbl9sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwogCiAJeG1pdGZyYW1lX3BoZWFkID0gZ2V0X2xpc3RfaGVhZCgmcHR4c2VydnEtPnN0YV9wZW5kaW5nKTsKLQl4bWl0ZnJhbWVfcGxpc3QgPSBnZXRfbmV4dCh4bWl0ZnJhbWVfcGhlYWQpOworCXhtaXRmcmFtZV9wbGlzdCA9IHhtaXRmcmFtZV9waGVhZC0+bmV4dDsKIAogCXdoaWxlICghcnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2goeG1pdGZyYW1lX3BoZWFkLCB4bWl0ZnJhbWVfcGxpc3QpKSB7Ci0JCXB4bWl0ZnJhbWUgPSBMSVNUX0NPTlRBSU5PUih4bWl0ZnJhbWVfcGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKLQkJeG1pdGZyYW1lX3BsaXN0ID0gZ2V0X25leHQoeG1pdGZyYW1lX3BsaXN0KTsKKwkJcHhtaXRmcmFtZSA9IGNvbnRhaW5lcl9vZih4bWl0ZnJhbWVfcGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKKwkJeG1pdGZyYW1lX3BsaXN0ID0geG1pdGZyYW1lX3BsaXN0LT5uZXh0OwogCiAJCXB4bWl0ZnJhbWUtPmFnZ19udW0gPSAwOyAvKiAgbm90IGZpcnN0IGZyYW1lIG9mIGFnZ3JlZ2F0aW9uICovCiAJCXB4bWl0ZnJhbWUtPnBrdF9vZmZzZXQgPSAwOyAvKiAgbm90IGZpcnN0IGZyYW1lIG9mIGFnZ3JlZ2F0aW9uLCBubyBuZWVkIHRvIHJlc2VydmUgb2Zmc2V0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC91c2JfaGFsaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvdXNiX2hhbGluaXQuYwppbmRleCBiMjRhZDQ5Li5jOTIwNjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC91c2JfaGFsaW5pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3VzYl9oYWxpbml0LmMKQEAgLTcwOSw3ICs3MDksNiBAQAogCiAJI2RlZmluZSBIQUxfSU5JVF9QUk9GSUxFX1RBRyhzdGFnZSkgZG8ge30gd2hpbGUgKDApCiAKLV9mdW5jX2VudGVyXzsKIAogCUhBTF9JTklUX1BST0ZJTEVfVEFHKEhBTF9JTklUX1NUQUdFU19CRUdJTik7CiAKQEAgLTk2Nyw3ICs5NjYsNiBAQAogCiAJREJHXzg4RSgiJXMgaW4gJWRtc1xuIiwgX19mdW5jX18sIHJ0d19nZXRfcGFzc2luZ190aW1lX21zKGluaXRfc3RhcnRfdGltZSkpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMDg0LDcgKzEwODIsNiBAQAogCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICYoQWRhcHRlci0+cmVjdnByaXYpOwogCXUzMiAoKl9yZWFkX3BvcnQpKHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwsIHUzMiBhZGRyLCB1MzIgY250LCB1OCAqcG1lbSk7CiAKLV9mdW5jX2VudGVyXzsKIAogCV9yZWFkX3BvcnQgPSBwaW50ZmhkbC0+aW9fb3BzLl9yZWFkX3BvcnQ7CiAKQEAgLTExMTIsNyArMTEwOSw2IEBACiAKIAlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgKCI8PT09IHVzYl9pbmlycF9pbml0XG4iKSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE0MDIsNyArMTM5OCw2IEBACiAJc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwogCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJmhhbGRhdGEtPmRtcHJpdjsKIAlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcG9kbXByaXYgPSAmaGFsZGF0YS0+b2RtcHJpdjsKLV9mdW5jX2VudGVyXzsKIAogCXN3aXRjaCAodmFyaWFibGUpIHsKIAljYXNlIEhXX1ZBUl9NRURJQV9TVEFUVVM6CkBAIC0xOTIxLDE0ICsxOTE2LDEyIEBACiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB2b2lkIEdldEh3UmVnODE4OEVVKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLCB1OCB2YXJpYWJsZSwgdTggKnZhbCkKIHsKIAlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CiAJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBvZG1wcml2ID0gJmhhbGRhdGEtPm9kbXByaXY7Ci1fZnVuY19lbnRlcl87CiAKIAlzd2l0Y2ggKHZhcmlhYmxlKSB7CiAJY2FzZSBIV19WQVJfQkFTSUNfUkFURToKQEAgLTE5ODAsNyArMTk3Myw2IEBACiAJCWJyZWFrOwogCX0KIAotX2Z1bmNfZXhpdF87CiB9CiAKIC8qICAqLwpAQCAtMjMwMiw3ICsyMjk0LDYgQEAKIHsKIAlzdHJ1Y3QgaGFsX29wcwkqaGFsZnVuYyA9ICZhZGFwdC0+SGFsRnVuYzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJYWRhcHQtPkhhbERhdGEgPSBydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGhhbF9kYXRhXzgxODhlKSk7CiAJaWYgKGFkYXB0LT5IYWxEYXRhID09IE5VTEwpCkBAIC0yMzQyLDUgKzIzMzMsNCBAQAogCWhhbGZ1bmMtPmludGVyZmFjZV9wc19mdW5jID0gJnJ0bDgxODhldV9wc19mdW5jOwogCiAJcnRsODE4OGVfc2V0X2hhbF9vcHMoaGFsZnVuYyk7Ci1fZnVuY19leGl0XzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3VzYl9vcHNfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3VzYl9vcHNfbGludXguYwppbmRleCAzMWFlMjFhLi4xZmE1MzcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC91c2Jfb3BzX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvdXNiX29wc19saW51eC5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAkJCWJyZWFrOwogCX0KIHJlbGVhc2VfbXV0ZXg6Ci0JX2V4aXRfY3JpdGljYWxfbXV0ZXgoJmR2b2JqcHJpdi0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgsIE5VTEwpOworCW11dGV4X3VubG9jaygmZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9tdXRleCk7CiBleGl0OgogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMjUsNyArMTI1LDYgQEAKIAl1MTYgbGVuOwogCXU4IGRhdGEgPSAwOwogCi0JX2Z1bmNfZW50ZXJfOwogCiAJcmVxdWVzdCA9IDB4MDU7CiAJcmVxdWVzdHR5cGUgPSAweDAxOy8qIHJlYWRfaW4gKi8KQEAgLTEzNiw3ICsxMzUsNiBAQAogCiAJdXNiY3RybF92ZW5kb3JyZXEocGludGZoZGwsIHJlcXVlc3QsIHd2YWx1ZSwgaW5kZXgsICZkYXRhLCBsZW4sIHJlcXVlc3R0eXBlKTsKIAotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIGRhdGE7CiAKQEAgLTE1MSwxNCArMTQ5LDEyIEBACiAJdTE2IGxlbjsKIAlfX2xlMzIgZGF0YTsKIAotX2Z1bmNfZW50ZXJfOwogCXJlcXVlc3QgPSAweDA1OwogCXJlcXVlc3R0eXBlID0gMHgwMTsvKiByZWFkX2luICovCiAJaW5kZXggPSAwOy8qIG4vYSAqLwogCXd2YWx1ZSA9ICh1MTYpKGFkZHImMHgwMDAwZmZmZik7CiAJbGVuID0gMjsKIAl1c2JjdHJsX3ZlbmRvcnJlcShwaW50ZmhkbCwgcmVxdWVzdCwgd3ZhbHVlLCBpbmRleCwgJmRhdGEsIGxlbiwgcmVxdWVzdHR5cGUpOwotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gKHUxNikobGUzMl90b19jcHUoZGF0YSkmMHhmZmZmKTsKIH0KQEAgLTE3Miw3ICsxNjgsNiBAQAogCXUxNiBsZW47CiAJX19sZTMyIGRhdGE7CiAKLV9mdW5jX2VudGVyXzsKIAogCXJlcXVlc3QgPSAweDA1OwogCXJlcXVlc3R0eXBlID0gMHgwMTsvKiByZWFkX2luICovCkBAIC0xODMsNyArMTc4LDYgQEAKIAogCXVzYmN0cmxfdmVuZG9ycmVxKHBpbnRmaGRsLCByZXF1ZXN0LCB3dmFsdWUsIGluZGV4LCAmZGF0YSwgbGVuLCByZXF1ZXN0dHlwZSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIGxlMzJfdG9fY3B1KGRhdGEpOwogfQpAQCAtMTk4LDcgKzE5Miw2IEBACiAJdTggZGF0YTsKIAlpbnQgcmV0OwogCi0JX2Z1bmNfZW50ZXJfOwogCXJlcXVlc3QgPSAweDA1OwogCXJlcXVlc3R0eXBlID0gMHgwMDsvKiB3cml0ZV9vdXQgKi8KIAlpbmRleCA9IDA7Lyogbi9hICovCkBAIC0yMDYsNyArMTk5LDYgQEAKIAlsZW4gPSAxOwogCWRhdGEgPSB2YWw7CiAJcmV0ID0gdXNiY3RybF92ZW5kb3JyZXEocGludGZoZGwsIHJlcXVlc3QsIHd2YWx1ZSwgaW5kZXgsICZkYXRhLCBsZW4sIHJlcXVlc3R0eXBlKTsKLQlfZnVuY19leGl0XzsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yMjAsNyArMjEyLDYgQEAKIAlfX2xlMzIgZGF0YTsKIAlpbnQgcmV0OwogCi0JX2Z1bmNfZW50ZXJfOwogCiAJcmVxdWVzdCA9IDB4MDU7CiAJcmVxdWVzdHR5cGUgPSAweDAwOy8qIHdyaXRlX291dCAqLwpAQCAtMjMzLDcgKzIyNCw2IEBACiAKIAlyZXQgPSB1c2JjdHJsX3ZlbmRvcnJlcShwaW50ZmhkbCwgcmVxdWVzdCwgd3ZhbHVlLCBpbmRleCwgJmRhdGEsIGxlbiwgcmVxdWVzdHR5cGUpOwogCi0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjQ4LDcgKzIzOCw2IEBACiAJX19sZTMyIGRhdGE7CiAJaW50IHJldDsKIAotCV9mdW5jX2VudGVyXzsKIAogCXJlcXVlc3QgPSAweDA1OwogCXJlcXVlc3R0eXBlID0gMHgwMDsvKiB3cml0ZV9vdXQgKi8KQEAgLTI2MCw3ICsyNDksNiBAQAogCiAJcmV0ID0gdXNiY3RybF92ZW5kb3JyZXEocGludGZoZGwsIHJlcXVlc3QsIHd2YWx1ZSwgaW5kZXgsICZkYXRhLCBsZW4sIHJlcXVlc3R0eXBlKTsKIAotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI3NSw3ICsyNjMsNiBAQAogCXU4IGJ1ZltWRU5ET1JfQ01EX01BWF9EQVRBX0xFTl0gPSB7MH07CiAJaW50IHJldDsKIAotCV9mdW5jX2VudGVyXzsKIAogCXJlcXVlc3QgPSAweDA1OwogCXJlcXVlc3R0eXBlID0gMHgwMDsvKiB3cml0ZV9vdXQgKi8KQEAgLTI4Nyw3ICsyNzQsNiBAQAogCiAJcmV0ID0gdXNiY3RybF92ZW5kb3JyZXEocGludGZoZGwsIHJlcXVlc3QsIHd2YWx1ZSwgaW5kZXgsIGJ1ZiwgbGVuLCByZXF1ZXN0dHlwZSk7CiAKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0zMjAsNyArMzA2LDcgQEAKIAlzdHJ1Y3QgcmVjdl9zdGF0CSpwcnhzdGF0OwogCXN0cnVjdCBwaHlfc3RhdAkqcHBoeV9zdGF0dXMgPSBOVUxMOwogCXN0cnVjdCBza19idWZmICpwa3RfY29weSA9IE5VTEw7Ci0JdW5pb24gcmVjdl9mcmFtZQkqcHJlY3ZmcmFtZSA9IE5VTEw7CisJc3RydWN0IHJlY3ZfZnJhbWUJKnByZWN2ZnJhbWUgPSBOVUxMOwogCXN0cnVjdCByeF9wa3RfYXR0cmliCSpwYXR0cmliID0gTlVMTDsKIAlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwogCXN0cnVjdCByZWN2X3ByaXYJKnByZWN2cHJpdiA9ICZhZGFwdC0+cmVjdnByaXY7CkBAIC0zNDYsMTMgKzMzMiwxMyBAQAogCQkJZ290byBfZXhpdF9yZWN2YnVmMnJlY3ZmcmFtZTsKIAkJfQogCi0JCV9ydHdfaW5pdF9saXN0aGVhZCgmcHJlY3ZmcmFtZS0+dS5oZHIubGlzdCk7Ci0JCXByZWN2ZnJhbWUtPnUuaGRyLnByZWN2YnVmID0gTlVMTDsJLyogY2FuJ3QgYWNjZXNzIHRoZSBwcmVjdmJ1ZiBmb3IgbmV3IGFyY2guICovCi0JCXByZWN2ZnJhbWUtPnUuaGRyLmxlbiA9IDA7CisJCV9ydHdfaW5pdF9saXN0aGVhZCgmcHJlY3ZmcmFtZS0+bGlzdCk7CisJCXByZWN2ZnJhbWUtPnByZWN2YnVmID0gTlVMTDsJLyogY2FuJ3QgYWNjZXNzIHRoZSBwcmVjdmJ1ZiBmb3IgbmV3IGFyY2guICovCisJCXByZWN2ZnJhbWUtPmxlbiA9IDA7CiAKIAkJdXBkYXRlX3JlY3ZmcmFtZV9hdHRyaWJfODhlKHByZWN2ZnJhbWUsIHByeHN0YXQpOwogCi0JCXBhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+dS5oZHIuYXR0cmliOworCQlwYXR0cmliID0gJnByZWN2ZnJhbWUtPmF0dHJpYjsKIAogCQlpZiAoKHBhdHRyaWItPmNyY19lcnIpIHx8IChwYXR0cmliLT5pY3ZfZXJyKSkgewogCQkJREJHXzg4RSgiJXM6IFJYIFdhcm5pbmchIGNyY19lcnI9JWQgaWN2X2Vycj0lZCwgc2tpcCFcbiIsIF9fZnVuY19fLCBwYXR0cmliLT5jcmNfZXJyLCBwYXR0cmliLT5pY3ZfZXJyKTsKQEAgLTM5OSwyNiArMzg1LDI2IEBACiAJCXBrdF9jb3B5ID0gbmV0ZGV2X2FsbG9jX3NrYihhZGFwdC0+cG5ldGRldiwgYWxsb2Nfc3opOwogCQlpZiAocGt0X2NvcHkpIHsKIAkJCXBrdF9jb3B5LT5kZXYgPSBhZGFwdC0+cG5ldGRldjsKLQkJCXByZWN2ZnJhbWUtPnUuaGRyLnBrdCA9IHBrdF9jb3B5OwotCQkJcHJlY3ZmcmFtZS0+dS5oZHIucnhfaGVhZCA9IHBrdF9jb3B5LT5kYXRhOwotCQkJcHJlY3ZmcmFtZS0+dS5oZHIucnhfZW5kID0gcGt0X2NvcHktPmRhdGEgKyBhbGxvY19zejsKKwkJCXByZWN2ZnJhbWUtPnBrdCA9IHBrdF9jb3B5OworCQkJcHJlY3ZmcmFtZS0+cnhfaGVhZCA9IHBrdF9jb3B5LT5kYXRhOworCQkJcHJlY3ZmcmFtZS0+cnhfZW5kID0gcGt0X2NvcHktPmRhdGEgKyBhbGxvY19zejsKIAkJCXNrYl9yZXNlcnZlKHBrdF9jb3B5LCA4IC0gKChzaXplX3QpKHBrdF9jb3B5LT5kYXRhKSAmIDcpKTsvKiBmb3JjZSBwa3RfY29weS0+ZGF0YSBhdCA4LWJ5dGUgYWxpZ25tZW50IGFkZHJlc3MgKi8KIAkJCXNrYl9yZXNlcnZlKHBrdF9jb3B5LCBzaGlmdF9zeik7LyogZm9yY2UgaXBfaGRyIGF0IDgtYnl0ZSBhbGlnbm1lbnQgYWRkcmVzcyBhY2NvcmRpbmcgdG8gc2hpZnRfc3ouICovCiAJCQltZW1jcHkocGt0X2NvcHktPmRhdGEsIChwYnVmICsgcGF0dHJpYi0+ZHJ2aW5mb19zeiArIFJYREVTQ19TSVpFKSwgc2tiX2xlbik7Ci0JCQlwcmVjdmZyYW1lLT51Lmhkci5yeF90YWlsID0gcGt0X2NvcHktPmRhdGE7Ci0JCQlwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhID0gcGt0X2NvcHktPmRhdGE7CisJCQlwcmVjdmZyYW1lLT5yeF90YWlsID0gcGt0X2NvcHktPmRhdGE7CisJCQlwcmVjdmZyYW1lLT5yeF9kYXRhID0gcGt0X2NvcHktPmRhdGE7CiAJCX0gZWxzZSB7CiAJCQlpZiAoKHBhdHRyaWItPm1mcmFnID09IDEpICYmIChwYXR0cmliLT5mcmFnX251bSA9PSAwKSkgewogCQkJCURCR184OEUoInJlY3ZidWYycmVjdmZyYW1lOiBhbGxvY19za2IgZmFpbCAsIGRyb3AgZnJhZyBmcmFtZVxuIik7CiAJCQkJcnR3X2ZyZWVfcmVjdmZyYW1lKHByZWN2ZnJhbWUsIHBmcmVlX3JlY3ZfcXVldWUpOwogCQkJCWdvdG8gX2V4aXRfcmVjdmJ1ZjJyZWN2ZnJhbWU7CiAJCQl9Ci0JCQlwcmVjdmZyYW1lLT51Lmhkci5wa3QgPSBza2JfY2xvbmUocHNrYiwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAocHJlY3ZmcmFtZS0+dS5oZHIucGt0KSB7Ci0JCQkJcHJlY3ZmcmFtZS0+dS5oZHIucnhfdGFpbCA9IHBidWYgKyBwYXR0cmliLT5kcnZpbmZvX3N6ICsgUlhERVNDX1NJWkU7Ci0JCQkJcHJlY3ZmcmFtZS0+dS5oZHIucnhfaGVhZCA9IHByZWN2ZnJhbWUtPnUuaGRyLnJ4X3RhaWw7Ci0JCQkJcHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YSA9IHByZWN2ZnJhbWUtPnUuaGRyLnJ4X3RhaWw7Ci0JCQkJcHJlY3ZmcmFtZS0+dS5oZHIucnhfZW5kID0gIHBidWYgKyBwYXR0cmliLT5kcnZpbmZvX3N6ICsgUlhERVNDX1NJWkUgKyBhbGxvY19zejsKKwkJCXByZWN2ZnJhbWUtPnBrdCA9IHNrYl9jbG9uZShwc2tiLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChwcmVjdmZyYW1lLT5wa3QpIHsKKwkJCQlwcmVjdmZyYW1lLT5yeF90YWlsID0gcGJ1ZiArIHBhdHRyaWItPmRydmluZm9fc3ogKyBSWERFU0NfU0laRTsKKwkJCQlwcmVjdmZyYW1lLT5yeF9oZWFkID0gcHJlY3ZmcmFtZS0+cnhfdGFpbDsKKwkJCQlwcmVjdmZyYW1lLT5yeF9kYXRhID0gcHJlY3ZmcmFtZS0+cnhfdGFpbDsKKwkJCQlwcmVjdmZyYW1lLT5yeF9lbmQgPSAgcGJ1ZiArIHBhdHRyaWItPmRydmluZm9fc3ogKyBSWERFU0NfU0laRSArIGFsbG9jX3N6OwogCQkJfSBlbHNlIHsKIAkJCQlEQkdfODhFKCJyZWN2YnVmMnJlY3ZmcmFtZTogc2tiX2Nsb25lIGZhaWxcbiIpOwogCQkJCXJ0d19mcmVlX3JlY3ZmcmFtZShwcmVjdmZyYW1lLCBwZnJlZV9yZWN2X3F1ZXVlKTsKQEAgLTQ1MSwxNyArNDM3LDE3IEBACiAJCQkvKiBlbnF1ZXVlIHJlY3ZmcmFtZSB0byB0eHJ0cCBxdWV1ZSAqLwogCQkJaWYgKHBhdHRyaWItPnBrdF9ycHRfdHlwZSA9PSBUWF9SRVBPUlQxKSB7CiAJCQkJLyogQ0NYLVRYUlBUIGFjayBmb3IgeG1pdCBtZ210IGZyYW1lcy4gKi8KLQkJCQloYW5kbGVfdHhycHRfY2N4Xzg4ZShhZGFwdCwgcHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YSk7CisJCQkJaGFuZGxlX3R4cnB0X2NjeF84OGUoYWRhcHQsIHByZWN2ZnJhbWUtPnJ4X2RhdGEpOwogCQkJfSBlbHNlIGlmIChwYXR0cmliLT5wa3RfcnB0X3R5cGUgPT0gVFhfUkVQT1JUMikgewogCQkJCU9ETV9SQV9UeFJQVDJIYW5kbGVfODE4OEUoCiAJCQkJCQkJJmhhbGRhdGEtPm9kbXByaXYsCi0JCQkJCQkJcHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YSwKKwkJCQkJCQlwcmVjdmZyYW1lLT5yeF9kYXRhLAogCQkJCQkJCXBhdHRyaWItPnBrdF9sZW4sCiAJCQkJCQkJcGF0dHJpYi0+TWFjSURWYWxpZEVudHJ5WzBdLAogCQkJCQkJCXBhdHRyaWItPk1hY0lEVmFsaWRFbnRyeVsxXQogCQkJCQkJCSk7CiAJCQl9IGVsc2UgaWYgKHBhdHRyaWItPnBrdF9ycHRfdHlwZSA9PSBISVNfUkVQT1JUKSB7Ci0JCQkJaW50ZXJydXB0X2hhbmRsZXJfODE4OGV1KGFkYXB0LCBwYXR0cmliLT5wa3RfbGVuLCBwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhKTsKKwkJCQlpbnRlcnJ1cHRfaGFuZGxlcl84MTg4ZXUoYWRhcHQsIHBhdHRyaWItPnBrdF9sZW4sIHByZWN2ZnJhbWUtPnJ4X2RhdGEpOwogCQkJfQogCQkJcnR3X2ZyZWVfcmVjdmZyYW1lKHByZWN2ZnJhbWUsIHBmcmVlX3JlY3ZfcXVldWUpOwogCQl9CkBAIC01MTksNyArNTA1LDcgQEAKIAkJREJHXzg4RSgiJXMoKSBSWCBXYXJuaW5nISBiRHJpdmVyU3RvcHBlZCglZCkgT1IgYlN1cnByaXNlUmVtb3ZlZCglZCkgYlJlYWRQb3J0Q2FuY2VsKCVkKVxuIiwKIAkJCV9fZnVuY19fLCBhZGFwdC0+YkRyaXZlclN0b3BwZWQsCiAJCQlhZGFwdC0+YlN1cnByaXNlUmVtb3ZlZCwgYWRhcHQtPmJSZWFkUG9ydENhbmNlbCk7Ci0JCWdvdG8gZXhpdDsKKwkJcmV0dXJuOwogCX0KIAogCWlmIChwdXJiLT5zdGF0dXMgPT0gMCkgeyAvKiBTVUNDRVNTICovCkBAIC01NzksOSArNTY1LDYgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCi1leGl0OgotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB1MzIgdXNiX3JlYWRfcG9ydChzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkciwgdTMyIGNudCwgdTggKnJtZW0pCkBAIC01OTgsNyArNTgxLDYgQEAKIAlzaXplX3QgYWxpZ25tZW50ID0gMDsKIAl1MzIgcmV0ID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkIHx8CiAJICAgIGFkYXB0ZXItPnB3cmN0cmxwcml2LnBucF9ic3RvcF90cngpIHsKQEAgLTY3Miw3ICs2NTQsNiBAQAogCQlyZXQgPSBfRkFJTDsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTcwMiw3ICs2ODMsNiBAQAogCiB2b2lkIHJ0bDgxODhldV9zZXRfaW50Zl9vcHMoc3RydWN0IF9pb19vcHMJKnBvcHMpCiB7Ci0JX2Z1bmNfZW50ZXJfOwogCV9ydHdfbWVtc2V0KCh1OCAqKXBvcHMsIDAsIHNpemVvZihzdHJ1Y3QgX2lvX29wcykpOwogCXBvcHMtPl9yZWFkOCA9ICZ1c2JfcmVhZDg7CiAJcG9wcy0+X3JlYWQxNiA9ICZ1c2JfcmVhZDE2OwpAQCAtNzE3LDcgKzY5Nyw2IEBACiAJcG9wcy0+X3dyaXRlX3BvcnQgPSAmdXNiX3dyaXRlX3BvcnQ7CiAJcG9wcy0+X3JlYWRfcG9ydF9jYW5jZWwgPSAmdXNiX3JlYWRfcG9ydF9jYW5jZWw7CiAJcG9wcy0+X3dyaXRlX3BvcnRfY2FuY2VsID0gJnVzYl93cml0ZV9wb3J0X2NhbmNlbDsKLQlfZnVuY19leGl0XzsKIH0KIAogdm9pZCBydGw4MTg4ZXVfc2V0X2h3X3R5cGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2Rydl90eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2Rydl90eXBlcy5oCmluZGV4IGE0OTJhMWMuLjkzNmMxOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9kcnZfdHlwZXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvZHJ2X3R5cGVzLmgKQEAgLTE1OSw5ICsxNTksMTUgQEAKIAogI2RlZmluZSBNQVhfQ09OVElOVUFMX1VSQl9FUlIJCTQKIAorc3RydWN0IHJ0X2Zpcm13YXJlIHsKKwl1OAkJCSpzekZ3QnVmZmVyOworCXUzMgkJCXVsRndMZW5ndGg7Cit9OworCiBzdHJ1Y3QgZHZvYmpfcHJpdiB7CiAJc3RydWN0IGFkYXB0ZXIgKmlmMTsKIAlzdHJ1Y3QgYWRhcHRlciAqaWYyOworCXN0cnVjdCBydF9maXJtd2FyZSBmaXJtd2FyZTsKIAogCS8qIEZvciA5MkQsIERNRFAgaGF2ZSAyIGludGVyZmFjZS4gKi8KIAl1OAlJbnRlcmZhY2VOdW1iZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvZXRoZXJuZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ldGhlcm5ldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTlmOTEyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ldGhlcm5ldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiEgXGZpbGUgKi8KLSNpZm5kZWYgX19JTkNfRVRIRVJORVRfSAotI2RlZmluZSBfX0lOQ19FVEhFUk5FVF9ICi0KLSNkZWZpbmUgRVRIRVJORVRfQUREUkVTU19MRU5HVEgJCTYJLyogIEV0aGVybmV0IEFkZHJlc3MgTGVuZ3RoICovCi0jZGVmaW5lIEVUSEVSTkVUX0hFQURFUl9TSVpFCQkxNAkvKiAgRXRoZXJuZXQgSGVhZGVyIExlbmd0aCAqLwotI2RlZmluZSBMTENfSEVBREVSX1NJWkUJCQk2CS8qICBMTEMgSGVhZGVyIExlbmd0aCAqLwotI2RlZmluZSBUWVBFX0xFTkdUSF9GSUVMRF9TSVpFCQkyCS8qICBUeXBlL0xlbmd0aCBTaXplICovCi0jZGVmaW5lIE1JTklNVU1fRVRIRVJORVRfUEFDS0VUX1NJWkUJNjAJLyogIE1pbiBFdGhlcm5ldCBQYWNrZXQgU2l6ZSAqLwotI2RlZmluZSBNQVhJTVVNX0VUSEVSTkVUX1BBQ0tFVF9TSVpFCTE1MTQJLyogIE1heCBFdGhlcm5ldCBQYWNrZXQgU2l6ZSAqLwotCi0vKiAgSXMgTXVsdGljYXN0IEFkZHJlc3M/ICovCi0jZGVmaW5lIFJUX0VUSF9JU19NVUxUSUNBU1QoX2FkZHIpCSgoKCh1OCAqKShfYWRkcikpWzBdJjB4MDEpICE9IDApCi0jZGVmaW5lIFJUX0VUSF9JU19CUk9BRENBU1QoX2FkZHIpCSgJCQlcCi0JCSgodTggKikoX2FkZHIpKVswXSA9PSAweGZmICYmCQlcCi0JCSgodTggKikoX2FkZHIpKVsxXSA9PSAweGZmICYmCQlcCi0JCSgodTggKikoX2FkZHIpKVsyXSA9PSAweGZmICYmCQlcCi0JCSgodTggKikoX2FkZHIpKVszXSA9PSAweGZmICYmCQlcCi0JCSgodTggKikoX2FkZHIpKVs0XSA9PSAweGZmICYmCQlcCi0JCSgodTggKikoX2FkZHIpKVs1XSA9PSAweGZmKQkvKiAgSXMgQnJvYWRjYXN0IEFkZHJlc3M/ICovCi0KLQotI2VuZGlmIC8qICAjaWZuZGVmIF9fSU5DX0VUSEVSTkVUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9oMmNsYmsuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9oMmNsYmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU5NTAzMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaDJjbGJrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIF9IMkNMQktfSF8KLQotCi0jaW5jbHVkZSA8cnRsODcxMV9zcGVjLmg+Ci0jaW5jbHVkZSA8VHlwZURlZi5oPgotCi0KLXZvaWQgX2xia19jbWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwotCi12b2lkIF9sYmtfcnNwKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKLQotdm9pZCBfbGJrX2V2dChJTiBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Ci0KLXZvaWQgaDJjX2V2ZW50X2NhbGxiYWNrKHVuc2lnbmVkIGNoYXIgKmRldiwgdW5zaWduZWQgY2hhciAqcGJ1Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaWZfZXRoZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9pZl9ldGhlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjE1NzcxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9pZl9ldGhlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9MSU5VWF9JRl9FVEhFUl9ICi0jZGVmaW5lIF9MSU5VWF9JRl9FVEhFUl9ICi0KLS8qCi0gKglJRUVFIDgwMi4zIEV0aGVybmV0IG1hZ2ljIGNvbnN0YW50cy4gIFRoZSBmcmFtZSBzaXplcyBvbWl0IHRoZSBwcmVhbWJsZQotICoJYW5kIEZDUy9DUkMgKGZyYW1lIGNoZWNrIHNlcXVlbmNlKS4KLSAqLwotCi0jZGVmaW5lIEVUSF9BTEVOCTYJCS8qIE9jdGV0cyBpbiBvbmUgZXRoZXJuZXQgYWRkcgkgKi8KLSNkZWZpbmUgRVRIX0hMRU4JMTQJCS8qIFRvdGFsIG9jdGV0cyBpbiBoZWFkZXIuCSAqLwotI2RlZmluZSBFVEhfWkxFTgk2MAkJLyogTWluLiBvY3RldHMgaW4gZnJhbWUgc2FucyBGQ1MgKi8KLSNkZWZpbmUgRVRIX0RBVEFfTEVOCTE1MDAJCS8qIE1heC4gb2N0ZXRzIGluIHBheWxvYWQJICovCi0jZGVmaW5lIEVUSF9GUkFNRV9MRU4JMTUxNAkJLyogTWF4LiBvY3RldHMgaW4gZnJhbWUgc2FucyBGQ1MgKi8KLQotLyoKLSAqCVRoZXNlIGFyZSB0aGUgZGVmaW5lZCBFdGhlcm5ldCBQcm90b2NvbCBJRCdzLgotICovCi0KLSNkZWZpbmUgRVRIX1BfTE9PUAkweDAwNjAJCS8qIEV0aGVybmV0IExvb3BiYWNrIHBhY2tldAkqLwotI2RlZmluZSBFVEhfUF9QVVAJMHgwMjAwCQkvKiBYZXJveCBQVVAgcGFja2V0CQkqLwotI2RlZmluZSBFVEhfUF9QVVBBVAkweDAyMDEJCS8qIFhlcm94IFBVUCBBZGRyIFRyYW5zIHBhY2tldAkqLwotI2RlZmluZSBFVEhfUF9JUAkweDA4MDAJCS8qIEludGVybmV0IFByb3RvY29sIHBhY2tldAkqLwotI2RlZmluZSBFVEhfUF9YMjUJMHgwODA1CQkvKiBDQ0lUVCBYLjI1CQkJKi8KLSNkZWZpbmUgRVRIX1BfQVJQCTB4MDgwNgkJLyogQWRkcmVzcyBSZXNvbHV0aW9uIHBhY2tldAkqLwotI2RlZmluZQlFVEhfUF9CUFEJMHgwOEZGCQkvKiBHOEJQUSBBWC4yNSBFdGhlcm5ldCBQYWNrZXQgICovCi0jZGVmaW5lIEVUSF9QX0lFRUVQVVAJMHgwYTAwCQkvKiBYZXJveCBJRUVFODAyLjMgUFVQIHBhY2tldCAgICovCi0jZGVmaW5lIEVUSF9QX0lFRUVQVVBBVAkweDBhMDEJCS8qIFhlcm94IElFRUU4MDIuMyBQVVAJCSovCi0jZGVmaW5lIEVUSF9QX0RFQyAgICAgICAweDYwMDAgICAgICAgICAgLyogREVDIEFzc2lnbmVkIHByb3RvICAgICAgICAgICAqLwotI2RlZmluZSBFVEhfUF9ETkFfREwgICAgMHg2MDAxICAgICAgICAgIC8qIERFQyBETkEgRHVtcC9Mb2FkICAgICAgICAgICAgKi8KLSNkZWZpbmUgRVRIX1BfRE5BX1JDICAgIDB4NjAwMiAgICAgICAgICAvKiBERUMgRE5BIFJlbW90ZSBDb25zb2xlICAgICAgICovCi0jZGVmaW5lIEVUSF9QX0ROQV9SVCAgICAweDYwMDMgICAgICAgICAgLyogREVDIEROQSBSb3V0aW5nICAgICAgICAgICAgICAqLwotI2RlZmluZSBFVEhfUF9MQVQgICAgICAgMHg2MDA0ICAgICAgICAgIC8qIERFQyBMQVQgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRVRIX1BfRElBRyAgICAgIDB4NjAwNSAgICAgICAgICAvKiBERUMgRGlhZ25vc3RpY3MgICAgICAgICAgICAgICovCi0jZGVmaW5lIEVUSF9QX0NVU1QgICAgICAweDYwMDYgICAgICAgICAgLyogREVDIEN1c3RvbWVyIHVzZSAgICAgICAgICAgICAqLwotI2RlZmluZSBFVEhfUF9TQ0EgICAgICAgMHg2MDA3ICAgICAgICAgIC8qIERFQyBTeXN0ZW1zIENvbW1zIEFyY2ggICAgICAgKi8KLSNkZWZpbmUgRVRIX1BfUkFSUCAgICAgIDB4ODAzNQkJLyogUmV2ZXJzZSBBZGRyIFJlcyBwYWNrZXQJKi8KLSNkZWZpbmUgRVRIX1BfQVRBTEsJMHg4MDlCCQkvKiBBcHBsZXRhbGsgRERQCQkqLwotI2RlZmluZSBFVEhfUF9BQVJQCTB4ODBGMwkJLyogQXBwbGV0YWxrIEFBUlAJCSovCi0jZGVmaW5lIEVUSF9QXzgwMjFRCTB4ODEwMCAgICAgICAgICAvKiA4MDIuMVEgVkxBTiBFeHRlbmRlZCBIZWFkZXIgICovCi0jZGVmaW5lIEVUSF9QX0lQWAkweDgxMzcJCS8qIElQWCBvdmVyIERJWAkJCSovCi0jZGVmaW5lIEVUSF9QX0lQVjYJMHg4NkRECQkvKiBJUHY2IG92ZXIgYmx1ZWJvb2sJCSovCi0jZGVmaW5lIEVUSF9QX1BQUF9ESVNDCTB4ODg2MwkJLyogUFBQb0UgZGlzY292ZXJ5IG1lc3NhZ2VzICAgICAqLwotI2RlZmluZSBFVEhfUF9QUFBfU0VTCTB4ODg2NAkJLyogUFBQb0Ugc2Vzc2lvbiBtZXNzYWdlcwkqLwotI2RlZmluZSBFVEhfUF9BVE1NUE9BCTB4ODg0YwkJLyogTXVsdGlQcm90b2NvbCBPdmVyIEFUTQkqLwotI2RlZmluZSBFVEhfUF9BVE1GQVRFCTB4ODg4NAkJLyogRnJhbWUtYmFzZWQgQVRNIFRyYW5zcG9ydAotCQkJCQkgKiBvdmVyIEV0aGVybmV0Ci0JCQkJCSAqLwotCi0vKgotICoJTm9uIERJWCB0eXBlcy4gV29uJ3QgY2xhc2ggZm9yIDE1MDAgdHlwZXMuCi0gKi8KLQotI2RlZmluZSBFVEhfUF84MDJfMwkweDAwMDEJCS8qIER1bW15IHR5cGUgZm9yIDgwMi4zIGZyYW1lcyAgKi8KLSNkZWZpbmUgRVRIX1BfQVgyNQkweDAwMDIJCS8qIER1bW15IHByb3RvY29sIGlkIGZvciBBWC4yNSAgKi8KLSNkZWZpbmUgRVRIX1BfQUxMCTB4MDAwMwkJLyogRXZlcnkgcGFja2V0IChiZSBjYXJlZnVsISEhKSAqLwotI2RlZmluZSBFVEhfUF84MDJfMgkweDAwMDQJCS8qIDgwMi4yIGZyYW1lcwkJCSovCi0jZGVmaW5lIEVUSF9QX1NOQVAJMHgwMDA1CQkvKiBJbnRlcm5hbCBvbmx5CQkqLwotI2RlZmluZSBFVEhfUF9ERENNUCAgICAgMHgwMDA2ICAgICAgICAgIC8qIERFQyBERENNUDogSW50ZXJuYWwgb25seSAgICAgKi8KLSNkZWZpbmUgRVRIX1BfV0FOX1BQUCAgIDB4MDAwNyAgICAgICAgICAvKiBEdW1teSB0eXBlIGZvciBXQU4gUFBQIGZyYW1lcyovCi0jZGVmaW5lIEVUSF9QX1BQUF9NUCAgICAweDAwMDggICAgICAgICAgLyogRHVtbXkgdHlwZSBmb3IgUFBQIE1QIGZyYW1lcyAqLwotI2RlZmluZSBFVEhfUF9MT0NBTFRBTEsgMHgwMDA5CQkvKiBMb2NhbHRhbGsgcHNldWRvIHR5cGUJKi8KLSNkZWZpbmUgRVRIX1BfUFBQVEFMSwkweDAwMTAJCS8qIER1bW15IHR5cGUgZm9yIEF0YWxrIG92ZXIgUFBQKi8KLSNkZWZpbmUgRVRIX1BfVFJfODAyXzIJMHgwMDExCQkvKiA4MDIuMiBmcmFtZXMJCQkqLwotI2RlZmluZSBFVEhfUF9NT0JJVEVYCTB4MDAxNQkJLyogTW9iaXRleCAoa2F6QGNhZmUubmV0KQkqLwotI2RlZmluZSBFVEhfUF9DT05UUk9MCTB4MDAxNgkJLyogQ2FyZCBzcGVjaWZpYyBjb250cm9sIGZyYW1lcyAqLwotI2RlZmluZSBFVEhfUF9JUkRBCTB4MDAxNwkJLyogTGludXgtSXJEQQkJCSovCi0jZGVmaW5lIEVUSF9QX0VDT05FVAkweDAwMTgJCS8qIEFjb3JuIEVjb25ldAkJCSovCi0KLS8qCi0gKglUaGlzIGlzIGFuIEV0aGVybmV0IGZyYW1lIGhlYWRlci4KLSAqLwotCi1zdHJ1Y3QgZXRoaGRyIHsKLQl1bnNpZ25lZCBjaGFyCWhfZGVzdFtFVEhfQUxFTl07CS8qIGRlc3RpbmF0aW9uIGV0aCBhZGRyCSovCi0JdW5zaWduZWQgY2hhcgloX3NvdXJjZVtFVEhfQUxFTl07CS8qIHNvdXJjZSBldGhlciBhZGRyCSovCi0JdW5zaWduZWQgc2hvcnQJaF9wcm90bzsJCS8qIHBhY2tldCB0eXBlIElEIGZpZWxkCSovCi19OwotCi1zdHJ1Y3QgX3ZsYW4gewotCXVuc2lnbmVkIHNob3J0ICAgICAgIGhfdmxhbl9UQ0k7CS8qICBFbmNhcCBwcmlvIGFuZCBWTEFOIElEICovCi0JdW5zaWduZWQgc2hvcnQgICAgICAgaF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90bzsKLX07Ci0KLSNkZWZpbmUgZ2V0X3ZsYW5faWQocHZsYW4pCQkJCVwKLQkoKG50b2hzKCh1bnNpZ25lZCBzaG9ydClwdmxhbi0+aF92bGFuX1RDSSkpICYgMHhmZmYpCi0jZGVmaW5lIGdldF92bGFuX3ByaW9yaXR5KHB2bGFuKQkJCVwKLQkoKG50b2hzKCh1bnNpZ25lZCBzaG9ydClwdmxhbi0+aF92bGFuX1RDSSkpPj4xMykKLSNkZWZpbmUgZ2V0X3ZsYW5fZW5jYXBfcHJvdG8ocHZsYW4pCQkJXAotCSAobnRvaHMoKHVuc2lnbmVkIHNob3J0KXB2bGFuLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvKSkKLQotI2VuZGlmCS8qIF9MSU5VWF9JRl9FVEhFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaW9jdGxfY2ZnODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9pb2N0bF9jZmc4MDIxMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzdlOWE1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9pb2N0bF9jZmc4MDIxMS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX0lPQ1RMX0NGRzgwMjExX0hfXwotI2RlZmluZSBfX0lPQ1RMX0NGRzgwMjExX0hfXwotCi1zdHJ1Y3QgcnR3X3dkZXZfaW52aXRfaW5mbyB7Ci0JdTggdG9rZW47Ci0JdTggZmxhZ3M7Ci0JdTggc3RhdHVzOwotCXU4IHJlcV9vcF9jaDsKLQl1OCByc3Bfb3BfY2g7Ci19OwotCi0jZGVmaW5lIHJ0d193ZGV2X2ludml0X2luZm9faW5pdChpbnZpdF9pbmZvKSBcCi0JZG8geyBcCi0JCShpbnZpdF9pbmZvKS0+dG9rZW4gPSAwOyBcCi0JCShpbnZpdF9pbmZvKS0+ZmxhZ3MgPSAweDAwOyBcCi0JCShpbnZpdF9pbmZvKS0+c3RhdHVzID0gMHhmZjsgXAotCQkoaW52aXRfaW5mbyktPnJlcV9vcF9jaCA9IDA7IFwKLQkJKGludml0X2luZm8pLT5yc3Bfb3BfY2ggPSAwOyBcCi0JfSB3aGlsZSAoMCkKLQotc3RydWN0IHJ0d193ZGV2X3ByaXYgewotCXN0cnVjdCB3aXJlbGVzc19kZXYgKnJ0d193ZGV2OwotCi0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyOwotCi0Jc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqc2Nhbl9yZXF1ZXN0OwotCXNwaW5sb2NrX3Qgc2Nhbl9yZXFfbG9jazsKLQotCXN0cnVjdCBuZXRfZGV2aWNlICpwbW9uX25kZXY7LyogZm9yIG1vbml0b3IgaW50ZXJmYWNlICovCi0JY2hhciBpZm5hbWVfbW9uW0lGTkFNU0laICsgMV07IC8qIG5hbWUgb2YgbW9uaXRvciBpbnRlcmZhY2UgKi8KLQotCXU4IHAycF9lbmFibGVkOwotCi0JdTggcHJvdmRpc2NfcmVxX2lzc3VlZDsKLQotCXN0cnVjdCBydHdfd2Rldl9pbnZpdF9pbmZvIGludml0X2luZm87Ci0KLQl1OCBiYW5kcm9pZF9zY2FuOwotCWJvb2wgYmxvY2s7Ci0JYm9vbCBwb3dlcl9tZ210OwotfTsKLQotI2RlZmluZSB3ZGV2X3RvX3ByaXYodykgKChzdHJ1Y3QgcnR3X3dkZXZfcHJpdiAqKSh3ZGV2X3ByaXYodykpKQotCi0jZGVmaW5lIHdpcGh5X3RvX3dkZXYoeCkJCQkJXAotKChzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICopKCgoc3RydWN0IHJ0d193ZGV2X3ByaXYgKil3aXBoeV9wcml2KHgpKS0+cnR3X3dkZXYpKQotCi1pbnQgcnR3X3dkZXZfYWxsb2Moc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgZGV2aWNlICpkZXYpOwotdm9pZCBydHdfd2Rldl9mcmVlKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpOwotdm9pZCBydHdfd2Rldl91bnJlZ2lzdGVyKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpOwotCi12b2lkIHJ0d19jZmc4MDIxMV9pbml0X3dpcGh5KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgcnR3X2NmZzgwMjExX3N1cnZleWRvbmVfZXZlbnRfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQotdm9pZCBydHdfY2ZnODAyMTFfaW5kaWNhdGVfY29ubmVjdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydHdfY2ZnODAyMTFfaW5kaWNhdGVfZGlzY29ubmVjdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydHdfY2ZnODAyMTFfaW5kaWNhdGVfc2Nhbl9kb25lKHN0cnVjdCBydHdfd2Rldl9wcml2ICpwd2Rldl9wcml2LAotCQkJCSAgICAgYm9vbCBhYm9ydGVkKTsKLQotI2lmZGVmIENPTkZJR184OEVVX0FQX01PREUKLXZvaWQgcnR3X2NmZzgwMjExX2luZGljYXRlX3N0YV9hc3NvYyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgICB1OCAqcG1nbXRfZnJhbWUsIHVpbnQgZnJhbWVfbGVuKTsKLXZvaWQgcnR3X2NmZzgwMjExX2luZGljYXRlX3N0YV9kaXNhc3NvYyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJCXVuc2lnbmVkIGNoYXIgKmRhLAotCQkJCQl1bnNpZ25lZCBzaG9ydCByZWFzb24pOwotI2VuZGlmIC8qIENPTkZJR184OEVVX0FQX01PREUgKi8KLQotdm9pZCBydHdfY2ZnODAyMTFfaXNzdWVfcDJwX3Byb3Zpc2lvbl9yZXF1ZXN0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCQkJICAgICAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbik7Ci12b2lkIHJ0d19jZmc4MDIxMV9yeF9wMnBfYWN0aW9uX3B1YmxpYyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgICAgIHU4ICpwbWdtdF9mcmFtZSwgdWludCBmcmFtZV9sZW4pOwotdm9pZCBydHdfY2ZnODAyMTFfcnhfYWN0aW9uX3AycChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwbWdtdF9mcmFtZSwKLQkJCQl1aW50IGZyYW1lX2xlbik7Ci12b2lkIHJ0d19jZmc4MDIxMV9yeF9hY3Rpb24oc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpmcmFtZSwKLQkJCSAgICB1aW50IGZyYW1lX2xlbiwgY29uc3QgY2hhciAqbXNnKTsKLQotaW50IHJ0d19jZmc4MDIxMV9zZXRfbWdudF93cHNwMnBpZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LAotCQkJCSAgIGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50IHR5cGUpOwotCi1ib29sIHJ0d19jZmc4MDIxMV9wd3JfbWdtdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Ci0KLSNkZWZpbmUgcnR3X2NmZzgwMjExX3J4X21nbXQoZGV2LCBmcmVxLCBzaWdfZGJtLCBidWYsIGxlbiwgZ2ZwKQkJXAotCWNmZzgwMjExX3J4X21nbXQoZGV2LCBmcmVxLCBzaWdfZGJtLCBidWYsIGxlbiwgZ2ZwKQotI2RlZmluZSBydHdfY2ZnODAyMTFfc2VuZF9yeF9hc3NvYyhkZXYsIGJzcywgYnVmLCBsZW4pCQkJXAotCWNmZzgwMjExX3NlbmRfcnhfYXNzb2MoZGV2LCBic3MsIGJ1ZiwgbGVuKQotCi0jZW5kaWYgLyogX19JT0NUTF9DRkc4MDIxMV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9pcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2lwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZGFjNmQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2lwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9MSU5VWF9JUF9ICi0jZGVmaW5lIF9MSU5VWF9JUF9ICi0KLS8qIFNPTF9JUCBzb2NrZXQgb3B0aW9ucyAqLwotCi0jZGVmaW5lIElQVE9TX1RPU19NQVNLCQkweDFFCi0jZGVmaW5lIElQVE9TX1RPUyh0b3MpCQkoKHRvcykmSVBUT1NfVE9TX01BU0spCi0jZGVmaW5lCUlQVE9TX0xPV0RFTEFZCQkweDEwCi0jZGVmaW5lCUlQVE9TX1RIUk9VR0hQVVQJMHgwOAotI2RlZmluZQlJUFRPU19SRUxJQUJJTElUWQkweDA0Ci0jZGVmaW5lCUlQVE9TX01JTkNPU1QJCTB4MDIKLQotI2RlZmluZSBJUFRPU19QUkVDX01BU0sJCTB4RTAKLSNkZWZpbmUgSVBUT1NfUFJFQyh0b3MpCQkoKHRvcykmSVBUT1NfUFJFQ19NQVNLKQotI2RlZmluZSBJUFRPU19QUkVDX05FVENPTlRST0wgICAgICAgICAgIDB4ZTAKLSNkZWZpbmUgSVBUT1NfUFJFQ19JTlRFUk5FVENPTlRST0wgICAgICAweGMwCi0jZGVmaW5lIElQVE9TX1BSRUNfQ1JJVElDX0VDUCAgICAgICAgICAgMHhhMAotI2RlZmluZSBJUFRPU19QUkVDX0ZMQVNIT1ZFUlJJREUgICAgICAgIDB4ODAKLSNkZWZpbmUgSVBUT1NfUFJFQ19GTEFTSCAgICAgICAgICAgICAgICAweDYwCi0jZGVmaW5lIElQVE9TX1BSRUNfSU1NRURJQVRFICAgICAgICAgICAgMHg0MAotI2RlZmluZSBJUFRPU19QUkVDX1BSSU9SSVRZICAgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgSVBUT1NfUFJFQ19ST1VUSU5FICAgICAgICAgICAgICAweDAwCi0KLQotLyogSVAgb3B0aW9ucyAqLwotI2RlZmluZSBJUE9QVF9DT1BZCQkweDgwCi0jZGVmaW5lIElQT1BUX0NMQVNTX01BU0sJMHg2MAotI2RlZmluZSBJUE9QVF9OVU1CRVJfTUFTSwkweDFmCi0KLSNkZWZpbmUJSVBPUFRfQ09QSUVEKG8pCQkoKG8pJklQT1BUX0NPUFkpCi0jZGVmaW5lCUlQT1BUX0NMQVNTKG8pCQkoKG8pJklQT1BUX0NMQVNTX01BU0spCi0jZGVmaW5lCUlQT1BUX05VTUJFUihvKQkJKChvKSZJUE9QVF9OVU1CRVJfTUFTSykKLQotI2RlZmluZQlJUE9QVF9DT05UUk9MCQkweDAwCi0jZGVmaW5lCUlQT1BUX1JFU0VSVkVEMQkJMHgyMAotI2RlZmluZQlJUE9QVF9NRUFTVVJFTUVOVAkweDQwCi0jZGVmaW5lCUlQT1BUX1JFU0VSVkVEMgkJMHg2MAotCi0jZGVmaW5lIElQT1BUX0VORAkoMCB8IElQT1BUX0NPTlRST0wpCi0jZGVmaW5lIElQT1BUX05PT1AJKDEgfCBJUE9QVF9DT05UUk9MKQotI2RlZmluZSBJUE9QVF9TRUMJKDIgfCBJUE9QVF9DT05UUk9MIHwgSVBPUFRfQ09QWSkKLSNkZWZpbmUgSVBPUFRfTFNSUgkoMyB8IElQT1BUX0NPTlRST0wgfCBJUE9QVF9DT1BZKQotI2RlZmluZSBJUE9QVF9USU1FU1RBTVAJKDQgfCBJUE9QVF9NRUFTVVJFTUVOVCkKLSNkZWZpbmUgSVBPUFRfUlIJKDcgfCBJUE9QVF9DT05UUk9MKQotI2RlZmluZSBJUE9QVF9TSUQJKDggfCBJUE9QVF9DT05UUk9MIHwgSVBPUFRfQ09QWSkKLSNkZWZpbmUgSVBPUFRfU1NSUgkoOSB8IElQT1BUX0NPTlRST0wgfCBJUE9QVF9DT1BZKQotI2RlZmluZSBJUE9QVF9SQQkoMjAgfCBJUE9QVF9DT05UUk9MIHwgSVBPUFRfQ09QWSkKLQotI2RlZmluZSBJUFZFUlNJT04JNAotI2RlZmluZSBNQVhUVEwJCTI1NQotI2RlZmluZSBJUERFRlRUTAk2NAotI2RlZmluZSBJUE9QVF9PUFRWQUwgMAotI2RlZmluZSBJUE9QVF9PTEVOICAgMQotI2RlZmluZSBJUE9QVF9PRkZTRVQgMgotI2RlZmluZSBJUE9QVF9NSU5PRkYgNAotI2RlZmluZSBNQVhfSVBPUFRMRU4gNDAKLSNkZWZpbmUgSVBPUFRfTk9QIElQT1BUX05PT1AKLSNkZWZpbmUgSVBPUFRfRU9MIElQT1BUX0VORAotI2RlZmluZSBJUE9QVF9UUyAgSVBPUFRfVElNRVNUQU1QCi0KLSNkZWZpbmUJSVBPUFRfVFNfVFNPTkxZCQkwCS8qIHRpbWVzdGFtcHMgb25seSAqLwotI2RlZmluZQlJUE9QVF9UU19UU0FOREFERFIJMQkvKiB0aW1lc3RhbXBzIGFuZCBhZGRyZXNzZXMgKi8KLSNkZWZpbmUJSVBPUFRfVFNfUFJFU1BFQwkzCS8qIHNwZWNpZmllZCBtb2R1bGVzIG9ubHkgKi8KLQotc3RydWN0IGlwX29wdGlvbnMgewotCV9fdTMyCQlmYWRkcjsJCQkvKiBTYXZlZCBmaXJzdCBob3AgYWRkcmVzcyAqLwotCXVuc2lnbmVkIGNoYXIJb3B0bGVuOwotCXVuc2lnbmVkIGNoYXIgc3JyOwotCXVuc2lnbmVkIGNoYXIgcnI7Ci0JdW5zaWduZWQgY2hhciB0czsKLQl1bnNpZ25lZCBjaGFyCWlzX3NldGJ5dXNlcjoxLAkvKiBTZXQgYnkgc2V0c29ja29wdD8JCSovCi0JCQlpc19kYXRhOjEsCS8qIE9wdGlvbnMgaW4gX19kYXRhLCByYXRoZXIgdGhhbiBza2IqLwotCQkJaXNfc3RyaWN0cm91dGU6MSwvKiBTdHJpY3Qgc291cmNlIHJvdXRlCQkqLwotCQkJc3JyX2lzX2hpdDoxLAkvKiBQYWNrZXQgZGVzdG4gYWRkciB3YXMgb3VycyAqLwotCQkJaXNfY2hhbmdlZDoxLAkvKiBJUCBjaGVja3N1bSBtb3JlIG5vdCB2YWxpZAkqLwotCQkJcnJfbmVlZGFkZHI6MSwJLyogTmVlZCB0byByZWNvcmQgYWRkciBvZiBvdXQgZGV2Ki8KLQkJCXRzX25lZWR0aW1lOjEsCS8qIE5lZWQgdG8gcmVjb3JkIHRpbWVzdGFtcAkqLwotCQkJdHNfbmVlZGFkZHI6MTsJLyogTmVlZCB0byByZWNvcmQgYWRkciBvZiBvdXQgZGV2ICAqLwotCXVuc2lnbmVkIGNoYXIgcm91dGVyX2FsZXJ0OwotCXVuc2lnbmVkIGNoYXIgX19wYWQxOwotCXVuc2lnbmVkIGNoYXIgX19wYWQyOwotCXVuc2lnbmVkIGNoYXIgX19kYXRhWzBdOwotfTsKLQotI2RlZmluZSBvcHRsZW5ndGgob3B0KSAoc2l6ZW9mKHN0cnVjdCBpcF9vcHRpb25zKSArIG9wdC0+b3B0bGVuKQotCi1zdHJ1Y3QgaXBoZHIgewotI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQotCV9fdTgJaWhsOjQsCi0JCXZlcnNpb246NDsKLSNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQotCV9fdTgJdmVyc2lvbjo0LAotCQlpaGw6NDsKLSNlbmRpZgotCV9fdTgJdG9zOwotCV9fdTE2CXRvdF9sZW47Ci0JX191MTYJaWQ7Ci0JX191MTYJZnJhZ19vZmY7Ci0JX191OAl0dGw7Ci0JX191OAlwcm90b2NvbDsKLQlfX3UxNgljaGVjazsKLQlfX3UzMglzYWRkcjsKLQlfX3UzMglkYWRkcjsKLQkvKlRoZSBvcHRpb25zIHN0YXJ0IGhlcmUuICovCi19OwotCi0jZW5kaWYJLyogX0xJTlVYX0lQX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9uaWNfc3BlYy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL25pY19zcGVjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MjI0NDcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL25pY19zcGVjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fTklDX1NQRUNfSF9fCi0jZGVmaW5lIF9fTklDX1NQRUNfSF9fCi0KLSNkZWZpbmUgUlRMODcxMV9NQ1RSTF8JCSgweDIwMDAwKQotI2RlZmluZSBSVEw4NzExX1VBUlRfCQkoMHgzMDAwMCkKLSNkZWZpbmUgUlRMODcxMV9USU1FUl8JCSgweDQwMDAwKQotI2RlZmluZSBSVEw4NzExX0ZJTlRfCQkoMHg1MDAwMCkKLSNkZWZpbmUgUlRMODcxMV9ISU5UXwkJKDB4NTAwMDApCi0jZGVmaW5lIFJUTDg3MTFfR1BJT18JCSgweDYwMDAwKQotI2RlZmluZSBSVEw4NzExX1dMQU5DVFJMXwkoMHgyMDAwMDApCi0jZGVmaW5lIFJUTDg3MTFfV0xBTkZGXwkJKDB4ZTAwMDAwKQotI2RlZmluZSBSVEw4NzExX0hDSUNUUkxfCSgweDYwMDAwMCkKLSNkZWZpbmUgUlRMODcxMV9TWVNDRkdfCQkoMHg2MjAwMDApCi0jZGVmaW5lIFJUTDg3MTFfU1lTQ1RSTF8JKDB4NjIwMDAwKQotI2RlZmluZSBSVEw4NzExX01DQ1RSTF8JCSgweDAyMDAwMCkKLQotCi0jaW5jbHVkZSA8cnRsODcxMV9yZWdkZWYuaD4KLQotI2luY2x1ZGUgPHJ0bDg3MTFfYml0ZGVmLmg+Ci0KLQotI2VuZGlmIC8qICBfX1JUTDg3MTFfU1BFQ19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vZG1faW50ZXJmYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb2RtX2ludGVyZmFjZS5oCmluZGV4IGE1MGVhZTMuLjU0OGEzMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vZG1faW50ZXJmYWNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29kbV9pbnRlcmZhY2UuaApAQCAtNzcsMzIgKzc3LDkgQEAKIAogLyogID09PT09PT09PT09IEVYdGVybiBGdW5jdGlvbiBQcm90b3R5cGUgKi8KIAotdTggT0RNX1JlYWQxQnl0ZShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIpOwotCi11MTYgT0RNX1JlYWQyQnl0ZShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIpOwotCi11MzIgT0RNX1JlYWQ0Qnl0ZShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIpOwotCi12b2lkIE9ETV9Xcml0ZTFCeXRlKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB1MzIgUmVnQWRkciwgdTggRGF0YSk7Ci0KLXZvaWQgT0RNX1dyaXRlMkJ5dGUoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyLCB1MTYgRGF0YSk7Ci0KLXZvaWQgT0RNX1dyaXRlNEJ5dGUoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyLCB1MzIgRGF0YSk7Ci0KIC8qICBNZW1vcnkgUmVsYXRpdmUgRnVuY3Rpb24uICovCi12b2lkIE9ETV9BbGxvY2F0ZU1lbW9yeShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdm9pZCAqKnBQdHIsIHUzMiBsZW5ndGgpOwotdm9pZCBPRE1fRnJlZU1lbW9yeShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdm9pZCAqcFB0ciwgdTMyIGxlbmd0aCk7Ci0KLXMzMiBPRE1fQ29tcGFyZU1lbW9yeShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdm9pZCAqcEJ1ZjEsIHZvaWQgKnBCdWYyLAotCQkgICAgICB1MzIgbGVuZ3RoKTsKIAogLyogIE9ETSBUaW1lciByZWxhdGl2ZSBBUEkuICovCi12b2lkIE9ETV9TZXRUaW1lcihzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgc3RydWN0IHRpbWVyX2xpc3QgKnBUaW1lciwKLQkJICB1MzIgbXNEZWxheSk7Ci0KLXZvaWQgT0RNX0luaXRpYWxpemVUaW1lcihzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwKLQkJCSBzdHJ1Y3QgdGltZXJfbGlzdCAqcFRpbWVyLCB2b2lkICpDYWxsQmFja0Z1bmMsCi0JCQkgdm9pZCAqcENvbnRleHQsIGNvbnN0IGNoYXIgKnN6SUQpOwogCiB2b2lkIE9ETV9DYW5jZWxUaW1lcihzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgc3RydWN0IHRpbWVyX2xpc3QgKnBUaW1lcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vc2RlcF9zZXJ2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb3NkZXBfc2VydmljZS5oCmluZGV4IDc5NTZmMGMuLjU4ODlmNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vc2RlcF9zZXJ2aWNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29zZGVwX3NlcnZpY2UuaApAQCAtNjIsMjAgKzYyLDExIEBACiAJc3BpbmxvY2tfdCBsb2NrOwogfTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgbGlzdF9oZWFkICpnZXRfbmV4dChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQotewotCXJldHVybiBsaXN0LT5uZXh0OwotfQotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBsaXN0X2hlYWQgKmdldF9saXN0X2hlYWQoc3RydWN0IF9fcXVldWUgKnF1ZXVlKQogewogCXJldHVybiAmKHF1ZXVlLT5xdWV1ZSk7CiB9CiAKLQotI2RlZmluZSBMSVNUX0NPTlRBSU5PUihwdHIsIHR5cGUsIG1lbWJlcikgXAotCSgodHlwZSAqKSgoY2hhciAqKShwdHIpLShzaXplX3QpKCYoKHR5cGUgKikwKS0+bWVtYmVyKSkpCi0KIHN0YXRpYyBpbmxpbmUgaW50IF9lbnRlcl9jcml0aWNhbF9tdXRleChzdHJ1Y3QgbXV0ZXggKnBtdXRleCwKIAkJCQkJdW5zaWduZWQgbG9uZyAqcGlycUwpCiB7CkBAIC04NSwxMyArNzYsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLQotc3RhdGljIGlubGluZSB2b2lkIF9leGl0X2NyaXRpY2FsX211dGV4KHN0cnVjdCBtdXRleCAqcG11dGV4LAotCQkJCQl1bnNpZ25lZCBsb25nICpwaXJxTCkKLXsKLQkJbXV0ZXhfdW5sb2NrKHBtdXRleCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBydHdfbGlzdF9kZWxldGUoc3RydWN0IGxpc3RfaGVhZCAqcGxpc3QpCiB7CiAJbGlzdF9kZWxfaW5pdChwbGlzdCk7CkBAIC0xMjIsMTcgKzEwNiw2IEBACiAjZGVmaW5lIFJUV19ERUNMQVJFX1RJTUVSX0hETChuYW1lKSBcCiAJdm9pZCBSVFdfVElNRVJfSERMX05BTUUobmFtZSkoUlRXX1RJTUVSX0hETF9BUkdTKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX2luaXRfd29ya2l0ZW0oc3RydWN0IHdvcmtfc3RydWN0ICpwd29yaywgdm9pZCAqcGZ1bmMsCi0JCQkJICB2b2lkICpjbnR4KQotewotCUlOSVRfV09SSyhwd29yaywgcGZ1bmMpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX3NldF93b3JraXRlbShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnB3b3JrKQotewotCXNjaGVkdWxlX3dvcmsocHdvcmspOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgX2NhbmNlbF93b3JraXRlbV9zeW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqcHdvcmspCiB7CiAJY2FuY2VsX3dvcmtfc3luYyhwd29yayk7CkBAIC0yMzAsMTUgKzIwMyw5IEBACiBleHRlcm4gdW5zaWduZWQgY2hhciBSU05fVEtJUF9DSVBIRVJbNF07CiAKICNkZWZpbmUgcnR3X3VwZGF0ZV9tZW1fc3RhdChmbGFnLCBzeikgZG8ge30gd2hpbGUgKDApCi11OCAqX3J0d192bWFsbG9jKHUzMiBzeik7Ci11OCAqX3J0d196dm1hbGxvYyh1MzIgc3opOwotdm9pZCBfcnR3X3ZtZnJlZSh1OCAqcGJ1ZiwgdTMyIHN6KTsKIHU4ICpfcnR3X3ptYWxsb2ModTMyIHN6KTsKIHU4ICpfcnR3X21hbGxvYyh1MzIgc3opOwogdm9pZCBfcnR3X21mcmVlKHU4ICpwYnVmLCB1MzIgc3opOwotI2RlZmluZSBydHdfdm1hbGxvYyhzeikJCQlfcnR3X3ZtYWxsb2MoKHN6KSkKLSNkZWZpbmUgcnR3X3p2bWFsbG9jKHN6KQkJCV9ydHdfenZtYWxsb2MoKHN6KSkKLSNkZWZpbmUgcnR3X3ZtZnJlZShwYnVmLCBzeikJCV9ydHdfdm1mcmVlKChwYnVmKSwgKHN6KSkKICNkZWZpbmUgcnR3X21hbGxvYyhzeikJCQlfcnR3X21hbGxvYygoc3opKQogI2RlZmluZSBydHdfem1hbGxvYyhzeikJCQlfcnR3X3ptYWxsb2MoKHN6KSkKICNkZWZpbmUgcnR3X21mcmVlKHBidWYsIHN6KQkJX3J0d19tZnJlZSgocGJ1ZiksIChzeikpCkBAIC0yNDcsNyArMjE0LDYgQEAKIHZvaWQgcnR3X21mcmVlMmQodm9pZCAqcGJ1ZiwgaW50IGgsIGludCB3LCBpbnQgc2l6ZSk7CiAKIHZvaWQgX3J0d19tZW1jcHkodm9pZCAqZGVjLCB2b2lkICpzb3VyLCB1MzIgc3opOwotaW50ICBfcnR3X21lbWNtcCh2b2lkICpkc3QsIHZvaWQgKnNyYywgdTMyIHN6KTsKIHZvaWQgX3J0d19tZW1zZXQodm9pZCAqcGJ1ZiwgaW50IGMsIHUzMiBzeik7CiAKIHZvaWQgX3J0d19pbml0X2xpc3RoZWFkKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3JlY3Zfb3NkZXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9yZWN2X29zZGVwLmgKaW5kZXggNjkxMjM4MC4uZDc2Y2MyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3JlY3Zfb3NkZXAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcmVjdl9vc2RlcC5oCkBAIC0yOCwxOCArMjgsMjAgQEAKIHZvaWQgX3J0d19mcmVlX3JlY3ZfcHJpdihzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYpOwogCiAKLXMzMiAgcnR3X3JlY3ZfZW50cnkodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotaW50IHJ0d19yZWN2X2luZGljYXRlcGt0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpyZWN2X2ZyYW1lKTsKK3MzMiAgcnR3X3JlY3ZfZW50cnkoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKK2ludCBydHdfcmVjdl9pbmRpY2F0ZXBrdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCSBzdHJ1Y3QgcmVjdl9mcmFtZSAqcmVjdl9mcmFtZSk7CiB2b2lkIHJ0d19yZWN2X3JldHVybnBhY2tldChzdHJ1Y3QgIG5ldF9kZXZpY2UgKmNueHQsIHN0cnVjdCBza19idWZmICpyZXRwa3QpOwogCi12b2lkIHJ0d19ob3N0YXBkX21sbWVfcngoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpyZWN2X2ZyKTsKK3ZvaWQgcnR3X2hvc3RhcGRfbWxtZV9yeChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpyZWN2X2ZyKTsKIHZvaWQgcnR3X2hhbmRsZV90a2lwX21pY19lcnIoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiZ3JvdXApOwogCiBpbnQgcnR3X2luaXRfcmVjdl9wcml2KHN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiwgc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIHZvaWQgcnR3X2ZyZWVfcmVjdl9wcml2KHN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdik7CiAKIGludCBydHdfb3NfcmVjdl9yZXNvdXJjZV9pbml0KHN0cnVjdCByZWN2X3ByaXYgKnJlY3Zwciwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0KTsKLWludCBydHdfb3NfcmVjdl9yZXNvdXJjZV9hbGxvYyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHVuaW9uIHJlY3ZfZnJhbWUgKnJlY3Zmcik7CitpbnQgcnR3X29zX3JlY3ZfcmVzb3VyY2VfYWxsb2Moc3RydWN0IGFkYXB0ZXIgKmFkYXB0LAorCQkJICAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpyZWN2ZnIpOwogdm9pZCBydHdfb3NfcmVjdl9yZXNvdXJjZV9mcmVlKHN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdik7CiAKIGludCBydHdfb3NfcmVjdmJ1Zl9yZXNvdXJjZV9hbGxvYyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHN0cnVjdCByZWN2X2J1ZiAqYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9oYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9oYWwuaAppbmRleCAxNjFmMWU1Li43NWU0MWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfaGFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2hhbC5oCkBAIC03NiwxNyArNzYsNiBAQAogCShsZTE2X3RvX2NwdShfcEZ3SGRyLT5TaWduYXR1cmUpJjB4RkZGMCkgPT0gMHgyMzAwIHx8CVwKIAkobGUxNl90b19jcHUoX3BGd0hkci0+U2lnbmF0dXJlKSYweEZGRjApID09IDB4ODhFMCkKIAotZW51bSBmaXJtd2FyZV9zb3VyY2UgewotCUZXX1NPVVJDRV9JTUdfRklMRSA9IDAsCi0JRldfU09VUkNFX0hFQURFUl9GSUxFID0gMSwJCS8qIGZyb20gaGVhZGVyIGZpbGUgKi8KLX07Ci0KLXN0cnVjdCBydF9maXJtd2FyZSB7Ci0JZW51bSBmaXJtd2FyZV9zb3VyY2UJZUZXU291cmNlOwotCXU4CQkJKnN6RndCdWZmZXI7Ci0JdTMyCQkJdWxGd0xlbmd0aDsKLX07Ci0KIC8qICBUaGlzIHN0cnVjdHVyZSBtdXN0IGJlIGNhcmVmdWwgd2l0aCBieXRlLW9yZGVyaW5nICovCiAKIHN0cnVjdCBydF9maXJtd2FyZV9oZHIgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX3JlY3YuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9yZWN2LmgKaW5kZXggYThmYWNmMC4uMDdlNWY1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX3JlY3YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfcmVjdi5oCkBAIC02MSw5ICs2MSwxMCBAQAogdm9pZCBydGw4MTg4ZXVfZnJlZV9yZWN2X3ByaXYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIHZvaWQgcnRsODE4OGV1X3JlY3ZfaGRsKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfYnVmICpwcmVjdmJ1Zik7CiB2b2lkIHJ0bDgxODhldV9yZWN2X3Rhc2tsZXQodm9pZCAqcHJpdik7Ci12b2lkIHJ0bDgxODhlX3F1ZXJ5X3J4X3BoeV9zdGF0dXModW5pb24gcmVjdl9mcmFtZSAqZnIsIHN0cnVjdCBwaHlfc3RhdCAqcGh5KTsKK3ZvaWQgcnRsODE4OGVfcXVlcnlfcnhfcGh5X3N0YXR1cyhzdHJ1Y3QgcmVjdl9mcmFtZSAqZnIsIHN0cnVjdCBwaHlfc3RhdCAqcGh5KTsKIHZvaWQgcnRsODE4OGVfcHJvY2Vzc19waHlfaW5mbyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHZvaWQgKnByZnJhbWUpOwotdm9pZCB1cGRhdGVfcmVjdmZyYW1lX3BoeWluZm9fODhlKHVuaW9uIHJlY3ZfZnJhbWUgKmZyYSwgc3RydWN0IHBoeV9zdGF0ICpwaHkpOwotdm9pZCB1cGRhdGVfcmVjdmZyYW1lX2F0dHJpYl84OGUodW5pb24gcmVjdl9mcmFtZSAqZnJhLCBzdHJ1Y3QgcmVjdl9zdGF0ICpzdGF0KTsKK3ZvaWQgdXBkYXRlX3JlY3ZmcmFtZV9waHlpbmZvXzg4ZShzdHJ1Y3QgcmVjdl9mcmFtZSAqZnJhLCBzdHJ1Y3QgcGh5X3N0YXQgKnBoeSk7Cit2b2lkIHVwZGF0ZV9yZWN2ZnJhbWVfYXR0cmliXzg4ZShzdHJ1Y3QgcmVjdl9mcmFtZSAqZnJhLAorCQkJCSBzdHJ1Y3QgcmVjdl9zdGF0ICpzdGF0KTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2RlYnVnLmgKaW5kZXggYzZiMTkzYS4uYWUwNTE0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfZGVidWcuaApAQCAtOTksMjAgKzk5LDYgQEAKIAkJfQkJCQkJCQlcCiAJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBfZnVuY19lbnRlcl8JCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJaWYgKEdsb2JhbERlYnVnTGV2ZWwgPj0gX2Rydl9kZWJ1Z18pCQkJXAotCQkJcHJfaW5mbygiJXMgOiAlcyBlbnRlcnMgYXQgJWRcbiIsCQlcCi0JCQkJIERSSVZFUl9QUkVGSVgsIF9fZnVuY19fLCBfX0xJTkVfXyk7CVwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIF9mdW5jX2V4aXRfCQkJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCWlmIChHbG9iYWxEZWJ1Z0xldmVsID49IF9kcnZfZGVidWdfKQkJCVwKLQkJCXByX2luZm8oIiVzIDogJXMgZXhpdHMgYXQgJWRcbiIsCQlcCi0JCQkJIERSSVZFUl9QUkVGSVgsIF9fZnVuY19fLCBfX0xJTkVfXyk7CVwKLQl9IHdoaWxlICgwKQotCiAjZGVmaW5lIFJUX1BSSU5UX0RBVEEoX2NvbXAsIF9sZXZlbCwgX3RpdGxlc3RyaW5nLCBfaGV4ZGF0YSwgX2hleGRhdGFsZW4pXAogCWRvIHsJCQkJCQkJCVwKIAkJaWYgKF9sZXZlbCA8PSBHbG9iYWxEZWJ1Z0xldmVsKSB7CQkJXApAQCAtMjc3LDE0ICsyNjMsNCBAQAogaW50IHByb2Nfc2V0X3Jzc2lfZGlzcChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpOwogCi0jaWZkZWYgQ09ORklHX0JUX0NPRVhJU1QKLWludCBwcm9jX2dldF9idGNvZXhfZGJnKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCW9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19zZXRfYnRjb2V4X2RiZyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLAotCQkJc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpOwotCi0jZW5kaWYgLyogQ09ORklHX0JUX0NPRVhJU1QgKi8KLQogI2VuZGlmCS8qIF9fUlRXX0RFQlVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19pby5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19pby5oCmluZGV4IDNkMWRmY2MuLmU4NzkwZjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2lvLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19pby5oCkBAIC05OSw3ICs5OSw2IEBACiAKIHN0cnVjdCBpbnRmX3ByaXY7CiBzdHJ1Y3QgaW50Zl9oZGw7Ci1zdHJ1Y3QgaW9fcXVldWU7CiAKIHN0cnVjdCBfaW9fb3BzIHsKIAl1OCAoKl9yZWFkOCkoc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCwgdTMyIGFkZHIpOwpAQCAtMTE3LDcgKzExNiw2IEBACiAJCQkgIHU4ICpwbWVtKTsKIAl2b2lkICgqX3dyaXRlX21lbSkoc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCwgdTMyIGFkZHIsIHUzMiBjbnQsCiAJCQkgICB1OCAqcG1lbSk7Ci0Jdm9pZCAoKl9zeW5jX2lycF9wcm90b2NvbF9ydykoc3RydWN0IGlvX3F1ZXVlICpwaW9fcSk7CiAJdTMyICgqX3JlYWRfaW50ZXJydXB0KShzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkcik7CiAJdTMyICgqX3JlYWRfcG9ydCkoc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCwgdTMyIGFkZHIsIHUzMiBjbnQsCiAJCQkgIHU4ICpwbWVtKTsKQEAgLTIzNywzNCArMjM1LDExIEBACiBCZWxvdyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgdXNlZCBieSBfaW9faGFuZGxlcgogKi8KIAotc3RydWN0IGlvX3F1ZXVlIHsKLQlzcGlubG9ja190IGxvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZCBmcmVlX2lvcmVxczsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHBlbmRpbmc7CS8qIFRoZSBpb19yZXEgbGlzdCB0aGF0IHdpbGwgYmUgc2VydmVkCi0JCQkJCSAqIGluIHRoZSBzaW5nbGUgcHJvdG9jb2wgcmVhZC93cml0ZS4qLwotCXN0cnVjdCBsaXN0X2hlYWQgcHJvY2Vzc2luZzsKLQl1OAkqZnJlZV9pb3JlcXNfYnVmOyAvKiAgNC1ieXRlIGFsaWduZWQgKi8KLQl1OAkqcGFsbG9jYXRlZF9mcmVlX2lvcmVxc19idWY7Ci0Jc3RydWN0CWludGZfaGRsCWludGY7Ci19OwotCiBzdHJ1Y3QgaW9fcHJpdiB7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyOwogCXN0cnVjdCBpbnRmX2hkbCBpbnRmOwogfTsKIAotdWludCBpb3JlcV9mbHVzaChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGlvX3F1ZXVlICppb3F1ZXVlKTsKLXZvaWQgc3luY19pb3JlcV9lbnF1ZXVlKHN0cnVjdCBpb19yZXEgKnByZXEsIHN0cnVjdCBpb19xdWV1ZSAqaW9xdWV1ZSk7Ci11aW50IHN5bmNfaW9yZXFfZmx1c2goc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBpb19xdWV1ZSAqaW9xdWV1ZSk7Ci11aW50IGZyZWVfaW9yZXEoc3RydWN0IGlvX3JlcSAqcHJlcSwgc3RydWN0IGlvX3F1ZXVlICpwaW9fcXVldWUpOwotc3RydWN0IGlvX3JlcSAqYWxsb2NfaW9yZXEoc3RydWN0IGlvX3F1ZXVlICpwaW9fcSk7Ci0KLXVpbnQgcmVnaXN0ZXJfaW50Zl9oZGwodTggKmRldiwgc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCk7Ci12b2lkIHVucmVnaXN0ZXJfaW50Zl9oZGwoc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCk7Ci0KLXZvaWQgX3J0d19hdHRyaWJfcmVhZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIsIHUzMiBjbnQsIHU4ICpwbWVtKTsKLXZvaWQgX3J0d19hdHRyaWJfd3JpdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgY250LCB1OCAqcG1lbSk7Ci0KIHU4IF9ydHdfcmVhZDgoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyKTsKIHUxNiBfcnR3X3JlYWQxNihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIpOwogdTMyIF9ydHdfcmVhZDMyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkcik7CkBAIC0zNjMsMjUgKzMzOCw2IEBACiBpbnQgcnR3X2luaXRfaW9fcHJpdihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCiAJCSAgICAgdm9pZCAoKnNldF9pbnRmX29wcykoc3RydWN0IF9pb19vcHMgKnBvcHMpKTsKIAotdWludCBhbGxvY19pb19xdWV1ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIGZyZWVfaW9fcXVldWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBhc3luY19idXNfaW8oc3RydWN0IGlvX3F1ZXVlICpwaW9fcSk7Ci12b2lkIGJ1c19zeW5jX2lvKHN0cnVjdCBpb19xdWV1ZSAqcGlvX3EpOwotdTMyIF9pb3JlcTJyd21lbShzdHJ1Y3QgaW9fcXVldWUgKnBpb19xKTsKIHZvaWQgZGV2X3Bvd2VyX2Rvd24oc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIsIHU4IGJwd3J1cCk7CiAKLSNkZWZpbmUgUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShfYSwgX2IsIF9jKQkJXAotCXJ0d193cml0ZTgoX2EsIF9iLCBfYykKLSNkZWZpbmUgUGxhdGZvcm1FRklPV3JpdGUyQnl0ZShfYSwgX2IsIF9jKQkJXAotCXJ0d193cml0ZTE2KF9hLCBfYiwgX2MpCi0jZGVmaW5lIFBsYXRmb3JtRUZJT1dyaXRlNEJ5dGUoX2EsIF9iLCBfYykJCVwKLQlydHdfd3JpdGUzMihfYSwgX2IsIF9jKQotCi0jZGVmaW5lIFBsYXRmb3JtRUZJT1JlYWQxQnl0ZShfYSwgX2IpCQlcCi0JCXJ0d19yZWFkOChfYSwgX2IpCi0jZGVmaW5lIFBsYXRmb3JtRUZJT1JlYWQyQnl0ZShfYSwgX2IpCQlcCi0JCXJ0d19yZWFkMTYoX2EsIF9iKQotI2RlZmluZSBQbGF0Zm9ybUVGSU9SZWFkNEJ5dGUoX2EsIF9iKQkJXAotCQlydHdfcmVhZDMyKF9hLCBfYikKLQogI2VuZGlmCS8qIF9SVEw4NzExX0lPX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2lvY3RsLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2lvY3RsLmgKaW5kZXggODc3MmQxZC4uZjNhYTkyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19pb2N0bC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfaW9jdGwuaApAQCAtMTAyLDggKzEwMiw2IEBACiAKICNpZiBkZWZpbmVkKF9SVFdfTVBfSU9DVExfQ18pCiBzdGF0aWMgaW50IG9pZF9udWxsX2Z1bmN0aW9uKHN0cnVjdCBvaWRfcGFyX3ByaXYgKnBvaWRfcGFyX3ByaXYpIHsKLQlfZnVuY19lbnRlcl87Ci0JX2Z1bmNfZXhpdF87CiAJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19tbG1lLmgKaW5kZXggNmNkOTg4Zi4uNDVjMjJlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19tbG1lLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19tbG1lLmgKQEAgLTEwNiwxMyArMTA2LDYgQEAKICNkZWZpbmUgdHJhZmZpY190aHJlc2hvbGQJMTAKICNkZWZpbmUJdHJhZmZpY19zY2FuX3BlcmlvZAk1MDAKIAotc3RydWN0IHNpdGVzdXJ2ZXlfY3RybCB7Ci0JdTY0CWxhc3RfdHhfcGt0czsKLQl1aW50CWxhc3RfcnhfcGt0czsKLQlpbnQJdHJhZmZpY19idXN5OwotCXN0cnVjdCB0aW1lcl9saXN0IHNpdGVzdXJ2ZXlfY3RybF90aW1lcjsKLX07Ci0KIHN0cnVjdCBydF9saW5rX2RldGVjdCB7CiAJdTMyCU51bVR4T2tJblBlcmlvZDsKIAl1MzIJTnVtUnhPa0luUGVyaW9kOwpAQCAtMzA0LDMxICsyOTcsNiBAQAogCXUzMiBub2Ffc3RhcnRfdGltZVtQMlBfTUFYX05PQV9OVU1dOwogfTsKIAotc3RydWN0IHRkbHNfc3NfcmVjb3JkIHsJLyogc2lnbmFsIHN0cmVuZ3RoIHJlY29yZCAqLwotCXU4IG1hY2FkZHJbRVRIX0FMRU5dOwotCXU4IFJ4UFdEQkFsbDsKLQl1OCBpc190ZGxzX3N0YTsJLyogIHRydWU6IGRpcmVjdCBsaW5rIHN0YSwgZmFsc2U6IGVsc2UgKi8KLX07Ci0KLXN0cnVjdCB0ZGxzX2luZm8gewotCXU4IGFwX3Byb2hpYml0ZWQ7Ci0JdWludCBzZXR1cF9zdGF0ZTsKLQl1OCBzdGFfY250OwotCXU4IHN0YV9tYXhpbXVtOwkvKiAgMTp0ZGxzIHN0YSBpcyBlcXVhbCAoTlVNX1NUQS0xKSwgcmVhY2ggbWF4IGRpcmVjdCBsaW5rIG51bWJlcjsgMDogZWxzZTsgKi8KLQlzdHJ1Y3QgdGRsc19zc19yZWNvcmQJc3NfcmVjb3JkOwotCXU4IG1hY2lkX2luZGV4OwkvKiBtYWNpZCBlbnRyeSB0aGF0IGlzIHJlYWR5IHRvIHdyaXRlICovCi0JdTggY2xlYXJfY2FtOwkvKiBjYW0gZW50cnkgdGhhdCBpcyB0cnlpbmcgdG8gY2xlYXIsIHVzaW5nIGl0IGluIGRpcmVjdCBsaW5rIHRlYXJkb3duICovCi0JdTggY2hfc2Vuc2luZzsKLQl1OCBjdXJfY2hhbm5lbDsKLQl1OCBjYW5kaWRhdGVfY2g7Ci0JdTggY29sbGVjdF9wa3RfbnVtW01BWF9DSEFOTkVMX05VTV07Ci0Jc3BpbmxvY2tfdCBjbWRfbG9jazsKLQlzcGlubG9ja190IGhkbF9sb2NrOwotCXU4IHdhdGNoZG9nX2NvdW50OwotCXU4IGRldl9kaXNjb3ZlcmVkOwkJLyogV0ZEX1RETFM6IGZvciBzaWdtYSB0ZXN0ICovCi0JdTggZW5hYmxlOwotfTsKLQogc3RydWN0IG1sbWVfcHJpdiB7CiAJc3BpbmxvY2tfdCBsb2NrOwogCWludCBmd19zdGF0ZTsJLyogc2hhbGwgd2UgcHJvdGVjdCB0aGlzIHZhcmlhYmxlPyBtYXliZSBub3QgbmVjZXNzYXJpbHkuLi4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZV9leHQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZV9leHQuaAppbmRleCBmMGM5ODJkLi4wOWUyYTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWVfZXh0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19tbG1lX2V4dC5oCkBAIC0yMzYsMTMgKzIzNiwxMyBAQAogc3RydWN0IG1sbWVfaGFuZGxlciB7CiAJdW5zaWduZWQgaW50ICAgbnVtOwogCWNoYXIgKnN0cjsKLQl1bnNpZ25lZCBpbnQgKCpmdW5jKShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHVuaW9uIHJlY3ZfZnJhbWUgKmZyYW1lKTsKKwl1bnNpZ25lZCBpbnQgKCpmdW5jKShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHN0cnVjdCByZWN2X2ZyYW1lICpmcmFtZSk7CiB9OwogCiBzdHJ1Y3QgYWN0aW9uX2hhbmRsZXIgewogCXVuc2lnbmVkIGludCAgIG51bTsKIAljaGFyICpzdHI7Ci0JdW5zaWduZWQgaW50ICgqZnVuYykoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1bmlvbiByZWN2X2ZyYW1lICpmcmFtZSk7CisJdW5zaWduZWQgaW50ICgqZnVuYykoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBzdHJ1Y3QgcmVjdl9mcmFtZSAqZnJhbWUpOwogfTsKIAogc3RydWN0CXNzX3JlcyB7CkBAIC00OTAsNyArNDkwLDcgQEAKIHZvaWQgZmx1c2hfYWxsX2NhbV9lbnRyeShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogCiB2b2lkIHNpdGVfc3VydmV5KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci11OCBjb2xsZWN0X2Jzc19pbmZvKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsCit1OCBjb2xsZWN0X2Jzc19pbmZvKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLAogCQkgICAgc3RydWN0IHdsYW5fYnNzaWRfZXggKmJzc2lkKTsKIHZvaWQgdXBkYXRlX25ldHdvcmsoc3RydWN0IHdsYW5fYnNzaWRfZXggKmRzdCwgc3RydWN0IHdsYW5fYnNzaWRfZXggKnNyYywKIAkJICAgIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBib29sIHVwZGF0ZV9pZSk7CkBAIC01NDQsNyArNTQ0LDggQEAKIHVuc2lnbmVkIGludCBzaG91bGRfZm9yYmlkX25fcmF0ZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogCiB2b2lkIHJlcG9ydF9qb2luX3JlcyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIGludCByZXMpOwotdm9pZCByZXBvcnRfc3VydmV5X2V2ZW50KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwordm9pZCByZXBvcnRfc3VydmV5X2V2ZW50KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKKwkJCSBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdm9pZCByZXBvcnRfc3VydmV5ZG9uZV9ldmVudChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogdm9pZCByZXBvcnRfZGVsX3N0YV9ldmVudChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCiAJCQkgIHVuc2lnbmVkIGNoYXIgKmFkZHIsIHVuc2lnbmVkIHNob3J0IHJlYXNvbik7CkBAIC02MDksNDYgKzYxMCw0NiBAQAogdm9pZCBzdGFydF9jcmVhdGVfaWJzcyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogCiB1bnNpZ25lZCBpbnQgT25Bc3NvY1JlcShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQl1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdW5zaWduZWQgaW50IE9uQXNzb2NSc3Aoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkJc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHVuc2lnbmVkIGludCBPblByb2JlUmVxKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCXVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB1bnNpZ25lZCBpbnQgT25Qcm9iZVJzcChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQl1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdW5zaWduZWQgaW50IERvUmVzZXJ2ZWQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkJc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHVuc2lnbmVkIGludCBPbkJlYWNvbihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICAgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHVuc2lnbmVkIGludCBPbkF0aW0oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHVuc2lnbmVkIGludCBPbkRpc2Fzc29jKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCXVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB1bnNpZ25lZCBpbnQgT25BdXRoKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJICAgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB1bnNpZ25lZCBpbnQgT25BdXRoQ2xpZW50KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkJICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdW5zaWduZWQgaW50IE9uRGVBdXRoKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdW5zaWduZWQgaW50IE9uQWN0aW9uKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogCiB1bnNpZ25lZCBpbnQgb25fYWN0aW9uX3NwY3Qoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJCSAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdW5zaWduZWQgaW50IE9uQWN0aW9uX3FvcyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJCSAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHVuc2lnbmVkIGludCBPbkFjdGlvbl9kbHMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCQkgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB1bnNpZ25lZCBpbnQgT25BY3Rpb25fYmFjayhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCQkgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdW5zaWduZWQgaW50IG9uX2FjdGlvbl9wdWJsaWMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkJICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHVuc2lnbmVkIGludCBPbkFjdGlvbl9odChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkJIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB1bnNpZ25lZCBpbnQgT25BY3Rpb25fd21tKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkJICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdW5zaWduZWQgaW50IE9uQWN0aW9uX3AycChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJCSAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIAogdm9pZCBtbG1lZXh0X2pvaW5ic3NfZXZlbnRfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBpbnQgam9pbl9yZXMpOwogdm9pZCBtbG1lZXh0X3N0YV9kZWxfZXZlbnRfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfcHdyY3RybC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19wd3JjdHJsLmgKaW5kZXggNGEwZTlmZi4uOWE0Mjg1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19wd3JjdHJsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19wd3JjdHJsLmgKQEAgLTIwNiwxMCArMjA2LDYgQEAKIAogCXU4CQliSW50ZXJuYWxBdXRvU3VzcGVuZDsKIAl1OAkJYkluU3VzcGVuZDsKLSNpZmRlZglDT05GSUdfQlRfQ09FWElTVAotCXU4CQliQXV0b1Jlc3VtZTsKLQl1OAkJYXV0b3BtX2NudDsKLSNlbmRpZgogCXU4CQliU3VwcG9ydFJlbW90ZVdha2V1cDsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBwd3Jfc3RhdGVfY2hlY2tfdGltZXI7CiAJaW50CQlwd3Jfc3RhdGVfY2hlY2tfaW50ZXJ2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3JlY3YuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfcmVjdi5oCmluZGV4IGJlOWMzMGMuLmJjYmNlNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfcmVjdi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfcmVjdi5oCkBAIC0yNzAsNyArMjcwLDcgQEAKIAlsZW4gPSAodW5zaWduZWQgaW50ICkodGFpbCAtIGRhdGEpOwogCiAqLwotc3RydWN0IHJlY3ZfZnJhbWVfaGRyIHsKK3N0cnVjdCByZWN2X2ZyYW1lIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IHNrX2J1ZmYJICpwa3Q7CiAJc3RydWN0IHNrX2J1ZmYJICpwa3RfbmV3YWxsb2M7CkBAIC0yODksMjMgKzI4OSwxNiBAQAogCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybDsKIH07CiAKLXVuaW9uIHJlY3ZfZnJhbWUgewotCXVuaW9uIHsKLQkJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCQlzdHJ1Y3QgcmVjdl9mcmFtZV9oZHIgaGRyOwotCQl1aW50IG1lbVtSRUNWRlJBTUVfSERSX0FMSUdOPj4yXTsKLQl9IHU7Ci19OwotCi11bmlvbiByZWN2X2ZyYW1lICpfcnR3X2FsbG9jX3JlY3ZmcmFtZShzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSk7Ci11bmlvbiByZWN2X2ZyYW1lICpydHdfYWxsb2NfcmVjdmZyYW1lKHN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlKTsKLXZvaWQgcnR3X2luaXRfcmVjdmZyYW1lKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsCitzdHJ1Y3QgcmVjdl9mcmFtZSAqX3J0d19hbGxvY19yZWN2ZnJhbWUoc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUpOworc3RydWN0IHJlY3ZfZnJhbWUgKnJ0d19hbGxvY19yZWN2ZnJhbWUoc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUpOwordm9pZCBydHdfaW5pdF9yZWN2ZnJhbWUoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsCiAJCQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYpOwotaW50ICBydHdfZnJlZV9yZWN2ZnJhbWUodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwKK2ludCAgcnR3X2ZyZWVfcmVjdmZyYW1lKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLAogCQkJc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUpOwogI2RlZmluZSBydHdfZGVxdWV1ZV9yZWN2ZnJhbWUocXVldWUpIHJ0d19hbGxvY19yZWN2ZnJhbWUocXVldWUpCi1pbnQgX3J0d19lbnF1ZXVlX3JlY3ZmcmFtZSh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBzdHJ1Y3QgX19xdWV1ZSAqcXVldWUpOwotaW50IHJ0d19lbnF1ZXVlX3JlY3ZmcmFtZSh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBzdHJ1Y3QgX19xdWV1ZSAqcXVldWUpOworaW50IF9ydHdfZW5xdWV1ZV9yZWN2ZnJhbWUoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsCisJCQkgICBzdHJ1Y3QgX19xdWV1ZSAqcXVldWUpOworaW50IHJ0d19lbnF1ZXVlX3JlY3ZmcmFtZShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgc3RydWN0IF9fcXVldWUgKnF1ZXVlKTsKIHZvaWQgcnR3X2ZyZWVfcmVjdmZyYW1lX3F1ZXVlKHN0cnVjdCBfX3F1ZXVlICpwZnJhbWVxdWV1ZSwKIAkJCSAgICAgIHN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlKTsKIHUzMiBydHdfZnJlZV91Y19zd2RlY19wZW5kaW5nX3F1ZXVlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKQEAgLTMxNSwyOSArMzA4LDIwIEBACiAKIHZvaWQgcnR3X3Jlb3JkZXJpbmdfY3RybF90aW1lb3V0X2hhbmRsZXIodm9pZCAqcGNvbnRleHQpOwogCi1zdGF0aWMgaW5saW5lIHU4ICpnZXRfcnhtZW0odW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKK3N0YXRpYyBpbmxpbmUgdTggKmdldF9yeG1lbShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKIHsKIAkvKiBhbHdheXMgcmV0dXJuIHJ4X2hlYWQuLi4gKi8KIAlpZiAocHJlY3ZmcmFtZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gcHJlY3ZmcmFtZS0+dS5oZHIucnhfaGVhZDsKKwlyZXR1cm4gcHJlY3ZmcmFtZS0+cnhfaGVhZDsKIH0KIAotc3RhdGljIGlubGluZSB1OCAqZ2V0X3J4X3N0YXR1cyh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQorc3RhdGljIGlubGluZSB1OCAqZ2V0X3J4X3N0YXR1cyhzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKIHsKIAlyZXR1cm4gZ2V0X3J4bWVtKHByZWN2ZnJhbWUpOwogfQogCi1zdGF0aWMgaW5saW5lIHU4ICpnZXRfcmVjdmZyYW1lX2RhdGEodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKLXsKLQkvKiBhbHdheXMgcmV0dXJuIHJ4X2RhdGEgKi8KLQlpZiAocHJlY3ZmcmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhOwotfQotCi1zdGF0aWMgaW5saW5lIHU4ICpyZWN2ZnJhbWVfcHVzaCh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBpbnQgc3opCitzdGF0aWMgaW5saW5lIHU4ICpyZWN2ZnJhbWVfcHVzaChzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgaW50IHN6KQogewogCS8qICBhcHBlbmQgZGF0YSBiZWZvcmUgcnhfZGF0YSAqLwogCkBAIC0zNDgsMTYgKzMzMiwxNiBAQAogICovCiAJaWYgKHByZWN2ZnJhbWUgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0JcHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YSAtPSBzeiA7Ci0JaWYgKHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEgPCBwcmVjdmZyYW1lLT51Lmhkci5yeF9oZWFkKSB7Ci0JCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEgKz0gc3o7CisJcHJlY3ZmcmFtZS0+cnhfZGF0YSAtPSBzejsKKwlpZiAocHJlY3ZmcmFtZS0+cnhfZGF0YSA8IHByZWN2ZnJhbWUtPnJ4X2hlYWQpIHsKKwkJcHJlY3ZmcmFtZS0+cnhfZGF0YSArPSBzejsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCXByZWN2ZnJhbWUtPnUuaGRyLmxlbiArPSBzejsKLQlyZXR1cm4gcHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YTsKKwlwcmVjdmZyYW1lLT5sZW4gKz0gc3o7CisJcmV0dXJuIHByZWN2ZnJhbWUtPnJ4X2RhdGE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTggKnJlY3ZmcmFtZV9wdWxsKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIGludCBzeikKK3N0YXRpYyBpbmxpbmUgdTggKnJlY3ZmcmFtZV9wdWxsKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBpbnQgc3opCiB7CiAJLyogIHJ4X2RhdGEgKz0gc3o7IG1vdmUgcnhfZGF0YSBzeiBieXRlcyAgaGVyZWFmdGVyICovCiAKQEAgLTM2NiwxNiArMzUwLDE2IEBACiAKIAlpZiAocHJlY3ZmcmFtZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQlwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhICs9IHN6OwotCWlmIChwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhID4gcHJlY3ZmcmFtZS0+dS5oZHIucnhfdGFpbCkgewotCQlwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhIC09IHN6OworCXByZWN2ZnJhbWUtPnJ4X2RhdGEgKz0gc3o7CisJaWYgKHByZWN2ZnJhbWUtPnJ4X2RhdGEgPiBwcmVjdmZyYW1lLT5yeF90YWlsKSB7CisJCXByZWN2ZnJhbWUtPnJ4X2RhdGEgLT0gc3o7CiAJCXJldHVybiBOVUxMOwogCX0KLQlwcmVjdmZyYW1lLT51Lmhkci5sZW4gLT0gc3o7Ci0JcmV0dXJuIHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJcHJlY3ZmcmFtZS0+bGVuIC09IHN6OworCXJldHVybiBwcmVjdmZyYW1lLT5yeF9kYXRhOwogfQogCi1zdGF0aWMgaW5saW5lIHU4ICpyZWN2ZnJhbWVfcHV0KHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIGludCBzeikKK3N0YXRpYyBpbmxpbmUgdTggKnJlY3ZmcmFtZV9wdXQoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIGludCBzeikKIHsKIAkvKiB1c2VkIGZvciBhcHBlbmQgc3ogYnl0ZXMgZnJvbSBwdHIgdG8gcnhfdGFpbCwgdXBkYXRlIHJ4X3RhaWwKIAkgKiBhbmQgcmV0dXJuIHRoZSB1cGRhdGVkIHJ4X3RhaWwgdG8gdGhlIGNhbGxlciAqLwpAQCAtMzg0LDE3ICszNjgsMTcgQEAKIAlpZiAocHJlY3ZmcmFtZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X3RhaWwgKz0gc3o7CisJcHJlY3ZmcmFtZS0+cnhfdGFpbCArPSBzejsKIAotCWlmIChwcmVjdmZyYW1lLT51Lmhkci5yeF90YWlsID4gcHJlY3ZmcmFtZS0+dS5oZHIucnhfZW5kKSB7Ci0JCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X3RhaWwgLT0gc3o7CisJaWYgKHByZWN2ZnJhbWUtPnJ4X3RhaWwgPiBwcmVjdmZyYW1lLT5yeF9lbmQpIHsKKwkJcHJlY3ZmcmFtZS0+cnhfdGFpbCAtPSBzejsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCXByZWN2ZnJhbWUtPnUuaGRyLmxlbiArPSBzejsKLQlyZXR1cm4gcHJlY3ZmcmFtZS0+dS5oZHIucnhfdGFpbDsKKwlwcmVjdmZyYW1lLT5sZW4gKz0gc3o7CisJcmV0dXJuIHByZWN2ZnJhbWUtPnJ4X3RhaWw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTggKnJlY3ZmcmFtZV9wdWxsX3RhaWwodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgaW50IHN6KQorc3RhdGljIGlubGluZSB1OCAqcmVjdmZyYW1lX3B1bGxfdGFpbChzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgaW50IHN6KQogewogCS8qICBybXYgZGF0YSBmcm9tIHJ4X3RhaWwgKGJ5IHlpdHNlbikgKi8KIApAQCAtNDA0LDY0ICszODgsMTMgQEAKIAogCWlmIChwcmVjdmZyYW1lID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X3RhaWwgLT0gc3o7Ci0JaWYgKHByZWN2ZnJhbWUtPnUuaGRyLnJ4X3RhaWwgPCBwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhKSB7Ci0JCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X3RhaWwgKz0gc3o7CisJcHJlY3ZmcmFtZS0+cnhfdGFpbCAtPSBzejsKKwlpZiAocHJlY3ZmcmFtZS0+cnhfdGFpbCA8IHByZWN2ZnJhbWUtPnJ4X2RhdGEpIHsKKwkJcHJlY3ZmcmFtZS0+cnhfdGFpbCArPSBzejsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCXByZWN2ZnJhbWUtPnUuaGRyLmxlbiAtPSBzejsKLQlyZXR1cm4gcHJlY3ZmcmFtZS0+dS5oZHIucnhfdGFpbDsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICpnZXRfcnhidWZfZGVzYyh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQotewotCXVuc2lnbmVkIGNoYXIgKmJ1Zl9kZXNjOwotCi0JaWYgKHByZWN2ZnJhbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGJ1Zl9kZXNjOwotfQotCi1zdGF0aWMgaW5saW5lIHVuaW9uIHJlY3ZfZnJhbWUgKnJ4bWVtX3RvX3JlY3ZmcmFtZSh1OCAqcnhtZW0pCi17Ci0JLyogZHVlIHRvIHRoZSBkZXNpZ24gb2YgMjA0OCBieXRlcyBhbGlnbm1lbnQgb2YgcmVjdl9mcmFtZSwKLQkgKiB3ZSBjYW4gcmVmZXJlbmNlIHRoZSB1bmlvbiByZWN2X2ZyYW1lICovCi0JLyogZnJvbSBhbnkgZ2l2ZW4gbWVtYmVyIG9mIHJlY3ZfZnJhbWUuICovCi0JLyogIHJ4bWVtIGluZGljYXRlcyB0aGUgYW55IG1lbWJlci9hZGRyZXNzIGluIHJlY3ZfZnJhbWUgKi8KLQotCXJldHVybiAodW5pb24gcmVjdl9mcmFtZSAqKSgoKHNpemVfdClyeG1lbSA+PiBSWEZSQU1FX0FMSUdOKSA8PCBSWEZSQU1FX0FMSUdOKTsKLX0KLQotc3RhdGljIGlubGluZSB1bmlvbiByZWN2X2ZyYW1lICpwa3RfdG9fcmVjdmZyYW1lKHN0cnVjdCBza19idWZmICpwa3QpCi17Ci0JdTggKmJ1Zl9zdGFyOwotCXVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lOwotCXByZWN2X2ZyYW1lID0gcnhtZW1fdG9fcmVjdmZyYW1lKCh1bnNpZ25lZCBjaGFyICopYnVmX3N0YXIpOwotCi0JcmV0dXJuIHByZWN2X2ZyYW1lOwotfQotCi1zdGF0aWMgaW5saW5lIHU4ICpwa3RfdG9fcmVjdm1lbShzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQotewotCS8qICByZXR1cm4gdGhlIHJ4X2hlYWQgKi8KLQotCXVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lID0gcGt0X3RvX3JlY3ZmcmFtZShwa3QpOwotCi0JcmV0dXJuCXByZWN2X2ZyYW1lLT51Lmhkci5yeF9oZWFkOwotfQotCi1zdGF0aWMgaW5saW5lIHU4ICpwa3RfdG9fcmVjdmRhdGEoc3RydWN0IHNrX2J1ZmYgKnBrdCkKLXsKLQkvKiAgcmV0dXJuIHRoZSByeF9kYXRhICovCi0KLQl1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSA9IHBrdF90b19yZWN2ZnJhbWUocGt0KTsKLQotCXJldHVybglwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZ2V0X3JlY3ZmcmFtZV9sZW4odW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKLXsKLQlyZXR1cm4gcHJlY3ZmcmFtZS0+dS5oZHIubGVuOworCXByZWN2ZnJhbWUtPmxlbiAtPSBzejsKKwlyZXR1cm4gcHJlY3ZmcmFtZS0+cnhfdGFpbDsKIH0KIAogc3RhdGljIGlubGluZSBzMzIgdHJhbnNsYXRlX3BlcmNlbnRhZ2VfdG9fZGJtKHUzMiBzaWdfc3RyZW5faW5kZXgpCkBAIC00ODAsNiArNDEzLDYgQEAKIAogdm9pZCBfcnR3X2luaXRfc3RhX3JlY3ZfcHJpdihzdHJ1Y3Qgc3RhX3JlY3ZfcHJpdiAqcHN0YV9yZWN2cHJpdik7CiAKLXZvaWQgIG1ndF9kaXNwYXRjaGVyKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwordm9pZCAgbWd0X2Rpc3BhdGNoZXIoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfeG1pdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d194bWl0LmgKaW5kZXggMWFjMWRkMy4uNjJmNWRiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d194bWl0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d194bWl0LmgKQEAgLTEwNSwxMSArMTA1LDYgQEAKIAlfX2xlMzIgdHhkdzc7CiB9OwogCi11bmlvbiB0eGRlc2MgewotCXN0cnVjdCB0eF9kZXNjIHR4ZGVzYzsKLQl1bnNpZ25lZCBpbnQgdmFsdWVbVFhERVNDX1NJWkU+PjJdOwotfTsKLQogc3RydWN0CWh3X3htaXQJewogCXN0cnVjdCBfX3F1ZXVlICpzdGFfcXVldWU7CiAJaW50CWFjY250OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3dpZmkuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS93aWZpLmgKaW5kZXggMmU3MzA3Zi4uYTg4ZWJmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3dpZmkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2lmaS5oCkBAIC02OTQsNyArNjk0LDcgQEAKIAogc3RydWN0IEFEREJBX3JlcXVlc3QgewogCXVuc2lnbmVkIGNoYXIJZGlhbG9nX3Rva2VuOwotCXVuc2lnbmVkIHNob3J0CUJBX3BhcmFfc2V0OworCV9fbGUxNgkJQkFfcGFyYV9zZXQ7CiAJdW5zaWduZWQgc2hvcnQJQkFfdGltZW91dF92YWx1ZTsKIAl1bnNpZ25lZCBzaG9ydAlCQV9zdGFydGluZ19zZXFjdHJsOwogfSBfX3BhY2tlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL2lvY3RsX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9pb2N0bF9saW51eC5jCmluZGV4IDRhZDgwYWUuLjI2MzZlN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL2lvY3RsX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvaW9jdGxfbGludXguYwpAQCAtMzUsNiArMzUsNyBAQAogCiAjaW5jbHVkZSA8cnR3X21wLmg+CiAjaW5jbHVkZSA8cnR3X2lvbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAogI2RlZmluZSBSVExfSU9DVExfV1BBX1NVUFBMSUNBTlQJKFNJT0NJV0ZJUlNUUFJJViArIDMwKQogCkBAIC00NzIsOCArNDczLDYgQEAKIAlzdHJ1Y3Qgd2lmaWRpcmVjdF9pbmZvICpwd2RpbmZvID0gJnBhZGFwdGVyLT53ZGluZm87CiAjZW5kaWYgLyogQ09ORklHXzg4RVVfUDJQICovCiAKLV9mdW5jX2VudGVyXzsKLQogCXBhcmFtLT51LmNyeXB0LmVyciA9IDA7CiAJcGFyYW0tPnUuY3J5cHQuYWxnW0lFRUVfQ1JZUFRfQUxHX05BTUVfTEVOIC0gMV0gPSAnXDAnOwogCkBAIC02MTQsOSArNjEzLDYgQEAKIGV4aXQ6CiAKIAlrZnJlZShwd2VwKTsKLQotX2Z1bmNfZXhpdF87Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC03NzAsOCArNzY2LDYgQEAKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLCAoImNtZF9jb2RlID0leFxuIiwgaW5mby0+Y21kKSk7CiAKLQlfZnVuY19lbnRlcl87Ci0KIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUR8V0lGSV9BREhPQ19NQVNURVJfU1RBVEUpID09IHRydWUpIHsKIAkJLyogcGFyc2luZyBIVF9DQVBfSUUgKi8KIAkJcCA9IHJ0d19nZXRfaWUoJnBjdXJfYnNzLT5JRXNbMTJdLCBfSFRfQ0FQQUJJTElUWV9JRV8sICZodF9pZWxlbiwgcGN1cl9ic3MtPklFTGVuZ3RoLTEyKTsKQEAgLTgwNiw5ICs4MDAsNiBAQAogCX0gZWxzZSB7CiAJCXNucHJpbnRmKHdycXUtPm5hbWUsIElGTkFNU0laLCAidW5hc3NvY2lhdGVkIik7CiAJfQotCi0JX2Z1bmNfZXhpdF87Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtODE2LDEyICs4MDcsNyBAQAogCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlfZnVuY19lbnRlcl87Ci0KIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9ub3RpY2VfLCAoIitydHdfd3hfc2V0X2ZyZXFcbiIpKTsKLQotCV9mdW5jX2V4aXRfOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg1NCw4ICs4NDAsNiBAQAogCWVudW0gbmRpc184MDJfMTFfbmV0d29ya19pbmZyYSBuZXR3b3JrVHlwZTsKIAlpbnQgcmV0ID0gMDsKIAotCV9mdW5jX2VudGVyXzsKLQogCWlmIChfRkFJTCA9PSBydHdfcHdyX3dha2V1cChwYWRhcHRlcikpIHsKIAkJcmV0ID0gLUVQRVJNOwogCQlnb3RvIGV4aXQ7CkBAIC04OTQsNyArODc4LDYgQEAKIAl9CiAJcnR3X3NldG9wbW9kZV9jbWQocGFkYXB0ZXIsIG5ldHdvcmtUeXBlKTsKIGV4aXQ6Ci0JX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtOTA2LDggKzg4OSw2IEBACiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCIgcnR3X3d4X2dldF9tb2RlXG4iKSk7CiAKLQlfZnVuY19lbnRlcl87Ci0KIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpCiAJCXdycXUtPm1vZGUgPSBJV19NT0RFX0lORlJBOwogCWVsc2UgaWYgICgoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkgfHwKQEAgLTkxOCw4ICs4OTksNiBAQAogCWVsc2UKIAkJd3JxdS0+bW9kZSA9IElXX01PREVfQVVUTzsKIAotCV9mdW5jX2V4aXRfOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMTEsOCArOTkwLDYgQEAKIAl1MTYgdmFsOwogCWludCBpOwogCi0JX2Z1bmNfZW50ZXJfOwotCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sICgicnR3X3d4X2dldF9yYW5nZS4gY21kX2NvZGUgPSV4XG4iLCBpbmZvLT5jbWQpKTsKIAogCXdycXUtPmRhdGEubGVuZ3RoID0gc2l6ZW9mKCpyYW5nZSk7CkBAIC0xMDkzLDggKzEwNzAsNiBAQAogCXJhbmdlLT5zY2FuX2NhcGEgPSBJV19TQ0FOX0NBUEFfRVNTSUQgfCBJV19TQ0FOX0NBUEFfVFlQRSB8CiAJCQkgICBJV19TQ0FOX0NBUEFfQlNTSUQgfCBJV19TQ0FOX0NBUEFfQ0hBTk5FTCB8CiAJCQkgICBJV19TQ0FOX0NBUEFfTU9ERSB8IElXX1NDQU5fQ0FQQV9SQVRFOwotCV9mdW5jX2V4aXRfOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExMTgsOCArMTA5Myw2IEBACiAJc3RydWN0CXdsYW5fbmV0d29yawkqcG5ldHdvcmsgPSBOVUxMOwogCWVudW0gbmRpc184MDJfMTFfYXV0aF9tb2RlCWF1dGhtb2RlOwogCi0JX2Z1bmNfZW50ZXJfOwotCiAJaWYgKF9GQUlMID09IHJ0d19wd3Jfd2FrZXVwKHBhZGFwdGVyKSkgewogCQlyZXQgPSAtMTsKIAkJZ290byBleGl0OwpAQCAtMTEzOCwxNSArMTExMSwxNSBAQAogCWF1dGhtb2RlID0gcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzYXV0aHR5cGU7CiAJc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+bG9jayk7CiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKLQlwbWxtZXByaXYtPnBzY2FubmVkID0gZ2V0X25leHQocGhlYWQpOworCXBtbG1lcHJpdi0+cHNjYW5uZWQgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICgxKSB7CiAJCWlmICgocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBtbG1lcHJpdi0+cHNjYW5uZWQpKSA9PSB0cnVlKQogCQkJYnJlYWs7CiAKLQkJcG5ldHdvcmsgPSBMSVNUX0NPTlRBSU5PUihwbWxtZXByaXYtPnBzY2FubmVkLCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocG1sbWVwcml2LT5wc2Nhbm5lZCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAKLQkJcG1sbWVwcml2LT5wc2Nhbm5lZCA9IGdldF9uZXh0KHBtbG1lcHJpdi0+cHNjYW5uZWQpOworCQlwbWxtZXByaXYtPnBzY2FubmVkID0gcG1sbWVwcml2LT5wc2Nhbm5lZC0+bmV4dDsKIAogCQlkc3RfYnNzaWQgPSBwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzOwogCkBAIC0xMTczLDggKzExNDYsNiBAQAogCiBleGl0OgogCi0JX2Z1bmNfZXhpdF87Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMTkyLDE3ICsxMTYzLDEyIEBACiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCJydHdfd3hfZ2V0X3dhcFxuIikpOwogCi0JX2Z1bmNfZW50ZXJfOwotCiAJaWYgKCgoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKSA9PSB0cnVlKSB8fAogCSAgICAoKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpID09IHRydWUpIHx8CiAJICAgICgoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSA9PSB0cnVlKSkKIAkJbWVtY3B5KHdycXUtPmFwX2FkZHIuc2FfZGF0YSwgcGN1cl9ic3MtPk1hY0FkZHJlc3MsIEVUSF9BTEVOKTsKIAllbHNlCiAJCV9ydHdfbWVtc2V0KHdycXUtPmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOwotCi0JX2Z1bmNfZXhpdF87Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI1Miw3ICsxMjE4LDYgQEAKICNlbmRpZiAvKiBDT05GSUdfODhFVV9QMlAgKi8KIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCJydHdfd3hfc2V0X3NjYW5cbiIpKTsKIAotX2Z1bmNfZW50ZXJfOwogCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2Lm1wX21vZGUgPT0gMSkgewogCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfTVBfU1RBVEUpKSB7CiAJCQlyZXQgPSAtMTsKQEAgLTEzODMsNyArMTM0OCw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0MDcsOCArMTM3MSw2IEBACiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sICgicnR3X3d4X2dldF9zY2FuXG4iKSk7CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX29zX2MsIF9kcnZfaW5mb18sICgiIFN0YXJ0IG9mIFF1ZXJ5IFNJT0NHSVdTQ0FOIC5cbiIpKTsKIAotCV9mdW5jX2VudGVyXzsKLQogCWlmIChwYWRhcHRlci0+cHdyY3RybHByaXYuYnJmb2ZmYnlodyAmJiBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBleGl0OwpAQCAtMTQ0MCw3ICsxNDAyLDcgQEAKIAlzcGluX2xvY2tfYmgoJihwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jaykpOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKDEpIHsKIAkJaWYgKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpCkBAIC0xNDUxLDEzICsxNDEzLDEzIEBACiAJCQlicmVhazsKIAkJfQogCi0JCXBuZXR3b3JrID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAKIAkJLyogcmVwb3J0IG5ldHdvcmsgb25seSBpZiB0aGUgY3VycmVudCBjaGFubmVsIHNldCBjb250YWlucyB0aGUgY2hhbm5lbCB0byB3aGljaCB0aGlzIG5ldHdvcmsgYmVsb25ncyAqLwogCQlpZiAocnR3X2NoX3NldF9zZWFyY2hfY2gocGFkYXB0ZXItPm1sbWVleHRwcml2LmNoYW5uZWxfc2V0LCBwbmV0d29yay0+bmV0d29yay5Db25maWd1cmF0aW9uLkRTQ29uZmlnKSA+PSAwKQogCQkJZXYgPSB0cmFuc2xhdGVfc2NhbihwYWRhcHRlciwgYSwgcG5ldHdvcmssIGV2LCBzdG9wKTsKIAotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwpAQCAtMTQ2Niw3ICsxNDI4LDYgQEAKIAl3cnF1LT5kYXRhLmZsYWdzID0gMDsKIAogZXhpdDoKLQlfZnVuY19leGl0XzsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNDkwLDcgKzE0NTEsNiBAQAogCiAJdWludCByZXQgPSAwLCBsZW47CiAKLQlfZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfb3NfYywgX2Rydl9pbmZvXywKIAkJICgiK3J0d193eF9zZXRfZXNzaWQ6IGZ3X3N0YXRlID0gMHglMDh4XG4iLCBnZXRfZndzdGF0ZShwbWxtZXByaXYpKSk7CkBAIC0xNTMwLDcgKzE0OTAsNyBAQAogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfb3NfYywgX2Rydl9pbmZvXywgKCJydHdfd3hfc2V0X2Vzc2lkOiBzc2lkID1bJXNdXG4iLCBzcmNfc3NpZCkpOwogCQlzcGluX2xvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKIAkgICAgICAgcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKLQkgICAgICBwbWxtZXByaXYtPnBzY2FubmVkID0gZ2V0X25leHQocGhlYWQpOworCSAgICAgIHBtbG1lcHJpdi0+cHNjYW5uZWQgPSBwaGVhZC0+bmV4dDsKIAogCQl3aGlsZSAoMSkgewogCQkJaWYgKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbWxtZXByaXYtPnBzY2FubmVkKSA9PSB0cnVlKSB7CkBAIC0xNTQwLDkgKzE1MDAsOSBAQAogCQkJCWJyZWFrOwogCQkJfQogCi0JCQlwbmV0d29yayA9IExJU1RfQ09OVEFJTk9SKHBtbG1lcHJpdi0+cHNjYW5uZWQsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCQkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocG1sbWVwcml2LT5wc2Nhbm5lZCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAKLQkJCXBtbG1lcHJpdi0+cHNjYW5uZWQgPSBnZXRfbmV4dChwbWxtZXByaXYtPnBzY2FubmVkKTsKKwkJCXBtbG1lcHJpdi0+cHNjYW5uZWQgPSBwbWxtZXByaXYtPnBzY2FubmVkLT5uZXh0OwogCiAJCQlkc3Rfc3NpZCA9IHBuZXR3b3JrLT5uZXR3b3JrLlNzaWQuU3NpZDsKIApAQCAtMTU4Myw3ICsxNTQzLDYgQEAKIAogCURCR184OEUoIjw9JXMsIHJldCAlZFxuIiwgX19mdW5jX18sIHJldCk7CiAKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNTk5LDcgKzE1NTgsNiBAQAogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sICgicnR3X3d4X2dldF9lc3NpZFxuIikpOwogCi0JX2Z1bmNfZW50ZXJfOwogCiAJaWYgKChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHx8CiAJICAgIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSkgewpAQCAtMTYxNyw3ICsxNTc1LDYgQEAKIAogZXhpdDoKIAotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE2MzQsNyArMTU5MSw2IEBACiAJdTMyCXJhdGV2YWx1ZSA9IDA7CiAJIHU4IG1wZGF0YXJhdGVbTnVtUmF0ZXNdID0gezExLCAxMCwgOSwgOCwgNywgNiwgNSwgNCwgMywgMiwgMSwgMCwgMHhmZn07CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLCAoIiBydHdfd3hfc2V0X3JhdGVcbiIpKTsKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfb3NfYywgX2Rydl9pbmZvXywgKCJ0YXJnZXRfcmF0ZSA9ICVkLCBmaXhlZCA9ICVkXG4iLCB0YXJnZXRfcmF0ZSwgZml4ZWQpKTsKQEAgLTE3MDYsNyArMTY2Miw2IEBACiAJCXJldCA9IC0xOwogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTczNCw3ICsxNjg5LDYgQEAKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKIAotCV9mdW5jX2VudGVyXzsKIAogCWlmICh3cnF1LT5ydHMuZGlzYWJsZWQpIHsKIAkJcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5ydHNfdGhyZXNoID0gMjM0NzsKQEAgLTE3NDgsNyArMTcwMiw2IEBACiAKIAlEQkdfODhFKCIlcywgcnRzX3RocmVzaCA9JWRcbiIsIF9fZnVuY19fLCBwYWRhcHRlci0+cmVnaXN0cnlwcml2LnJ0c190aHJlc2gpOwogCi0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE3NTksNyArMTcxMiw2IEBACiB7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7CiAKLQlfZnVuY19lbnRlcl87CiAKIAlEQkdfODhFKCIlcywgcnRzX3RocmVzaCA9JWRcbiIsIF9fZnVuY19fLCBwYWRhcHRlci0+cmVnaXN0cnlwcml2LnJ0c190aHJlc2gpOwogCkBAIC0xNzY3LDcgKzE3MTksNiBAQAogCXdycXUtPnJ0cy5maXhlZCA9IDA7CS8qIG5vIGF1dG8gc2VsZWN0ICovCiAJLyogd3JxdS0+cnRzLmRpc2FibGVkID0gKHdycXUtPnJ0cy52YWx1ZSA9PSBERUZBVUxUX1JUU19USFJFU0hPTEQpOyAqLwogCi0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE3NzgsNyArMTcyOSw2IEBACiB7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7CiAKLQlfZnVuY19lbnRlcl87CiAKIAlpZiAod3JxdS0+ZnJhZy5kaXNhYmxlZCkgewogCQlwYWRhcHRlci0+eG1pdHByaXYuZnJhZ19sZW4gPSBNQVhfRlJBR19USFJFU0hPTEQ7CkBAIC0xNzkyLDcgKzE3NDIsNiBAQAogCiAJREJHXzg4RSgiJXMsIGZyYWdfbGVuID0lZFxuIiwgX19mdW5jX18sIHBhZGFwdGVyLT54bWl0cHJpdi5mcmFnX2xlbik7CiAKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiAwOwogfQpAQCAtMTgwMywxNCArMTc1MiwxMiBAQAogewogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwogCi0JX2Z1bmNfZW50ZXJfOwogCiAJREJHXzg4RSgiJXMsIGZyYWdfbGVuID0lZFxuIiwgX19mdW5jX18sIHBhZGFwdGVyLT54bWl0cHJpdi5mcmFnX2xlbik7CiAKIAl3cnF1LT5mcmFnLnZhbHVlID0gcGFkYXB0ZXItPnhtaXRwcml2LmZyYWdfbGVuOwogCXdycXUtPmZyYWcuZml4ZWQgPSAwOwkvKiBubyBhdXRvIHNlbGVjdCAqLwogCi0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE4NDQsNyArMTc5MSw2IEBACiAKIAlrZXkgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOwogCi0JX2Z1bmNfZW50ZXJfOwogCiAJaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKIAkJREJHXzg4RSgiRW5jcnlwdGlvbkRpc2FibGVkXG4iKTsKQEAgLTE5MzksNyArMTg4NSw2IEBACiAKIGV4aXQ6CiAKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xOTUzLDcgKzE4OTgsNiBAQAogCXN0cnVjdCBpd19wb2ludCAqZXJxID0gJih3cnF1LT5lbmNvZGluZyk7CiAJc3RydWN0CW1sbWVfcHJpdgkqcG1sbWVwcml2ID0gJihwYWRhcHRlci0+bWxtZXByaXYpOwogCi0JX2Z1bmNfZW50ZXJfOwogCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSAhPSB0cnVlKSB7CiAJCWlmICghY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkgewpAQCAtMjAwNyw3ICsxOTUxLDYgQEAKIAkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CiAJCWJyZWFrOwogCX0KLQlfZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yMjEwLDYgKzIxNTMsNyBAQAogCXUzMiBkYXRhMzI7CiAJdTMyIGJ5dGVzOwogCXU4ICpwdG1wOworCWludCBydjsKIAogCXBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7CiAJcCA9ICZ3cnF1LT5kYXRhOwpAQCAtMjIyNSw3ICsyMTY5LDExIEBACiAKIAlieXRlcyA9IDA7CiAJYWRkciA9IDA7Ci0Jc3NjYW5mKHB0bXAsICIlZCwleCIsICZieXRlcywgJmFkZHIpOworCXJ2ID0gc3NjYW5mKHB0bXAsICIlZCwleCIsICZieXRlcywgJmFkZHIpOworCWlmIChydiAhPSAyKSB7CisJCWtmcmVlKHB0bXApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlzd2l0Y2ggKGJ5dGVzKSB7CiAJY2FzZSAxOgpAQCAtMjI1NSw2ICsyMjAzLDcgQEAKIAkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcnY7CiAKIAl1MzIgYWRkcjsKIAl1MzIgZGF0YTMyOwpAQCAtMjI2Myw3ICsyMjEyLDkgQEAKIAlieXRlcyA9IDA7CiAJYWRkciA9IDA7CiAJZGF0YTMyID0gMDsKLQlzc2NhbmYoZXh0cmEsICIlZCwleCwleCIsICZieXRlcywgJmFkZHIsICZkYXRhMzIpOworCXJ2ID0gc3NjYW5mKGV4dHJhLCAiJWQsJXgsJXgiLCAmYnl0ZXMsICZhZGRyLCAmZGF0YTMyKTsKKwlpZiAocnYgIT0gMykKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzd2l0Y2ggKGJ5dGVzKSB7CiAJY2FzZSAxOgpAQCAtMjYwNywxMyArMjU1OCwxMyBAQAogCXNwaW5fbG9ja19iaCgmKHBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKSk7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoMSkgewogCQlpZiAocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSA9PSB0cnVlKQogCQkJYnJlYWs7CiAKLQkJcG5ldHdvcmsgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAogCQlpZiAoaHdhZGRyX2F0b25faShkYXRhLCBic3NpZCkpIHsKIAkJCURCR184OEUoIkludmFsaWQgQlNTSUQgJyVzJy5cbiIsICh1OCAqKWRhdGEpOwpAQCAtMjYzOCw3ICsyNTg5LDcgQEAKIAkJCX0KIAkJfQogCi0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7CkBAIC0yNjkwLDEzICsyNjQxLDEzIEBACiAJc3RydWN0IGl3X3BvaW50ICpwZGF0YSA9ICZ3cnF1LT5kYXRhOwogCXUzMiAgIHUzMndwc19zdGFydCA9IDA7CiAKLQlyZXQgPSBjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZ1MzJ3cHNfc3RhcnQsIHBkYXRhLT5wb2ludGVyLCA0KTsKLQlpZiAocmV0KSB7CisJaWYgKChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQpIHx8IChwZGF0YSA9PSBOVUxMKSkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGV4aXQ7CiAJfQogCi0JaWYgKChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQpIHx8IChwZGF0YSA9PSBOVUxMKSkgeworCXJldCA9IGNvcHlfZnJvbV91c2VyKCh2b2lkICopJnUzMndwc19zdGFydCwgcGRhdGEtPnBvaW50ZXIsIDQpOworCWlmIChyZXQpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBleGl0OwogCX0KQEAgLTMxMTAsMTMgKzMwNjEsMTMgQEAKIAlzcGluX2xvY2tfYmgoJihwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jaykpOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKDEpIHsKIAkJaWYgKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkgPT0gdHJ1ZSkKIAkJCWJyZWFrOwogCi0JCXBuZXR3b3JrID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAJCWlmICghbWVtY21wKHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsIHBlZXJNQUMsIEVUSF9BTEVOKSkgewogCQkJdTggKndwc2llOwogCQkJdWludCB3cHNpZV9sZW4gPSAwOwpAQCAtMzEzNCw3ICszMDg1LDcgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQl9Ci0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7CkBAIC0zMTgwLDEzICszMTMxLDEzIEBACiAJc3Bpbl9sb2NrX2JoKCYocG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spKTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICgxKSB7CiAJCWlmIChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpID09IHRydWUpCiAJCQlicmVhazsKIAotCQlwbmV0d29yayA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCQlpZiAoIW1lbWNtcChwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLCBwZWVyTUFDLCBFVEhfQUxFTikpIHsKIAkJCS8qCUNvbW1lbnRlZCBieSBBbGJlcnQgMjAxMS8wNS8xOCAqLwogCQkJLyoJTWF0Y2ggdGhlIGRldmljZSBhZGRyZXNzIGxvY2F0ZWQgaW4gdGhlIFAyUCBJRSAqLwpAQCAtMzIxNSw3ICszMTY2LDcgQEAKIAkJCX0KIAkgICAgIH0KIAotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwpAQCAtMzI2NCwxMyArMzIxNSwxMyBAQAogCXNwaW5fbG9ja19iaCgmKHBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKSk7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoMSkgewogCQlpZiAocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSA9PSB0cnVlKQogCQkJYnJlYWs7CiAKLQkJcG5ldHdvcmsgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAkJaWYgKCFtZW1jbXAocG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywgcGVlck1BQywgRVRIX0FMRU4pKSB7CiAJCQl1OCAqd3BzaWU7CiAJCQl1aW50IHdwc2llX2xlbiA9IDA7CkBAIC0zMjk1LDcgKzMyNDYsNyBAQAogCQkJYnJlYWs7CiAJICAgICB9CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKQEAgLTMzNDMsMTMgKzMyOTQsMTMgQEAKIAlzcGluX2xvY2tfYmgoJihwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jaykpOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKDEpIHsKIAkJaWYgKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkgPT0gdHJ1ZSkKIAkJCWJyZWFrOwogCi0JCXBuZXR3b3JrID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAJCWlmICghbWVtY21wKHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsIHBlZXJNQUMsIEVUSF9BTEVOKSkgewogCQkJdTggKndwc2llOwogCQkJdWludCB3cHNpZV9sZW4gPSAwOwpAQCAtMzM2Niw3ICszMzE3LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKQEAgLTM0MTQsMTMgKzMzNjUsMTMgQEAKIAlzcGluX2xvY2tfYmgoJihwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jaykpOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKDEpIHsKIAkJaWYgKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkgPT0gdHJ1ZSkKIAkJCWJyZWFrOwogCi0JCXBuZXR3b3JrID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAJCWlmICghbWVtY21wKHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsIHBlZXJNQUMsIEVUSF9BTEVOKSkgewogCQkJLyoJQ29tbWVudGVkIGJ5IEFsYmVydCAyMDEyMTIyNiAqLwogCQkJLyoJTWF0Y2ggdGhlIGRldmljZSBhZGRyZXNzIGxvY2F0ZWQgaW4gdGhlIFAyUCBJRSAqLwpAQCAtMzQ0MCw3ICszMzkxLDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKQEAgLTM0OTYsMTkgKzM0NDcsMTkgQEAKIAlzcGluX2xvY2tfYmgoJihwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jaykpOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKDEpIHsKIAkJaWYgKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkgPT0gdHJ1ZSkKIAkJCWJyZWFrOwogCi0JCXBuZXR3b3JrID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAJCWlmICghbWVtY21wKHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsIHBlZXJNQUMsIEVUSF9BTEVOKSkgewogCQkJdWludFBlZXJDaGFubmVsID0gcG5ldHdvcmstPm5ldHdvcmsuQ29uZmlndXJhdGlvbi5EU0NvbmZpZzsKIAkJCWJyZWFrOwogCQl9CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKQEAgLTM1OTEsMTMgKzM1NDIsMTMgQEAKIAlzcGluX2xvY2tfYmgoJihwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jaykpOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKDEpIHsKIAkJaWYgKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkgPT0gdHJ1ZSkKIAkJCWJyZWFrOwogCi0JCXBuZXR3b3JrID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAKIAkJLyoJQ29tbWVudGVkIGJ5IEFsYmVydCAyMDExLzA1LzE4ICovCiAJCS8qCU1hdGNoIHRoZSBkZXZpY2UgYWRkcmVzcyBsb2NhdGVkIGluIHRoZSBQMlAgSUUgKi8KQEAgLTM2MjIsNyArMzU3Myw3IEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7CkBAIC0zNzQxLDcgKzM2OTIsNyBAQAogCXNwaW5fbG9ja19iaCgmKHBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKSk7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoMSkgewogCQlpZiAocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSA9PSB0cnVlKQpAQCAtMzc1MCw3ICszNzAxLDcgQEAKIAkJaWYgKHVpbnRQZWVyQ2hhbm5lbCAhPSAwKQogCQkJYnJlYWs7CiAKLQkJcG5ldHdvcmsgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAogCQkvKglDb21tZW50ZWQgYnkgQWxiZXJ0IDIwMTEvMDUvMTggKi8KIAkJLyoJTWF0Y2ggdGhlIGRldmljZSBhZGRyZXNzIGxvY2F0ZWQgaW4gdGhlIFAyUCBJRSAqLwpAQCAtMzc4MSw3ICszNzMyLDcgQEAKIAkJCX0KIAkJfQogCi0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7CkBAIC0zOTE0LDI0ICszODY1LDMzIEBACiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7CiAKIAlpZiAocGFkYXB0ZXItPmJTaG93R2V0UDJQU3RhdGUpCi0JCURCR184OEUoIlslc10gZXh0cmEgPSAlc1xuIiwgX19mdW5jX18sIChjaGFyICopd3JxdS0+ZGF0YS5wb2ludGVyKTsKLQlpZiAoIW1lbWNtcCh3cnF1LT5kYXRhLnBvaW50ZXIsICJzdGF0dXMiLCA2KSkgeworCQlEQkdfODhFKCJbJXNdIGV4dHJhID0gJXNcbiIsIF9fZnVuY19fLAorCQkJKGNoYXIgX191c2VyICopd3JxdS0+ZGF0YS5wb2ludGVyKTsKKwlpZiAoIW1lbWNtcCgoX19mb3JjZSBjb25zdCBjaGFyICopd3JxdS0+ZGF0YS5wb2ludGVyLAorCQkJInN0YXR1cyIsIDYpKSB7CiAJCXJ0d19wMnBfZ2V0X3N0YXR1cyhkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKLQl9IGVsc2UgaWYgKCFtZW1jbXAod3JxdS0+ZGF0YS5wb2ludGVyLCAicm9sZSIsIDQpKSB7CisJfSBlbHNlIGlmICghbWVtY21wKChfX2ZvcmNlIGNvbnN0IGNoYXIgKil3cnF1LT5kYXRhLnBvaW50ZXIsCisJCQkicm9sZSIsIDQpKSB7CiAJCXJ0d19wMnBfZ2V0X3JvbGUoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7Ci0JfSBlbHNlIGlmICghbWVtY21wKHdycXUtPmRhdGEucG9pbnRlciwgInBlZXJfaWZhIiwgOCkpIHsKKwl9IGVsc2UgaWYgKCFtZW1jbXAoKF9fZm9yY2UgY29uc3QgY2hhciAqKXdycXUtPmRhdGEucG9pbnRlciwKKwkJCSJwZWVyX2lmYSIsIDgpKSB7CiAJCXJ0d19wMnBfZ2V0X3BlZXJfaWZhZGRyKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOwotCX0gZWxzZSBpZiAoIW1lbWNtcCh3cnF1LT5kYXRhLnBvaW50ZXIsICJyZXFfY20iLCA2KSkgeworCX0gZWxzZSBpZiAoIW1lbWNtcCgoX19mb3JjZSBjb25zdCBjaGFyICopd3JxdS0+ZGF0YS5wb2ludGVyLAorCQkJInJlcV9jbSIsIDYpKSB7CiAJCXJ0d19wMnBfZ2V0X3JlcV9jbShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKLQl9IGVsc2UgaWYgKCFtZW1jbXAod3JxdS0+ZGF0YS5wb2ludGVyLCAicGVlcl9kZXZhIiwgOSkpIHsKKwl9IGVsc2UgaWYgKCFtZW1jbXAoKF9fZm9yY2UgY29uc3QgY2hhciAqKXdycXUtPmRhdGEucG9pbnRlciwKKwkJCSJwZWVyX2RldmEiLCA5KSkgewogCQkvKglHZXQgdGhlIFAyUCBkZXZpY2UgYWRkcmVzcyB3aGVuIHJlY2VpdmluZyB0aGUgcHJvdmlzaW9uIGRpc2NvdmVyeSByZXF1ZXN0IGZyYW1lLiAqLwogCQlydHdfcDJwX2dldF9wZWVyX2RldmFkZHIoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7Ci0JfSBlbHNlIGlmICghbWVtY21wKHdycXUtPmRhdGEucG9pbnRlciwgImdyb3VwX2lkIiwgOCkpIHsKKwl9IGVsc2UgaWYgKCFtZW1jbXAoKF9fZm9yY2UgY29uc3QgY2hhciAqKXdycXUtPmRhdGEucG9pbnRlciwKKwkJCSJncm91cF9pZCIsIDgpKSB7CiAJCXJ0d19wMnBfZ2V0X2dyb3VwaWQoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7Ci0JfSBlbHNlIGlmICghbWVtY21wKHdycXUtPmRhdGEucG9pbnRlciwgInBlZXJfZGV2YV9pbnYiLCA5KSkgeworCX0gZWxzZSBpZiAoIW1lbWNtcCgoX19mb3JjZSBjb25zdCBjaGFyICopd3JxdS0+ZGF0YS5wb2ludGVyLAorCQkJInBlZXJfZGV2YV9pbnYiLCA5KSkgewogCQkvKglHZXQgdGhlIFAyUCBkZXZpY2UgYWRkcmVzcyB3aGVuIHJlY2VpdmluZyB0aGUgUDJQIEludml0YXRpb24gcmVxdWVzdCBmcmFtZS4gKi8KIAkJcnR3X3AycF9nZXRfcGVlcl9kZXZhZGRyX2J5X2ludml0YXRpb24oZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7Ci0JfSBlbHNlIGlmICghbWVtY21wKHdycXUtPmRhdGEucG9pbnRlciwgIm9wX2NoIiwgNSkpIHsKKwl9IGVsc2UgaWYgKCFtZW1jbXAoKF9fZm9yY2UgY29uc3QgY2hhciAqKXdycXUtPmRhdGEucG9pbnRlciwKKwkJCSJvcF9jaCIsIDUpKSB7CiAJCXJ0d19wMnBfZ2V0X29wX2NoKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOwogCX0KICNlbmRpZiAvKiBDT05GSUdfODhFVV9QMlAgKi8KQEAgLTM5NDUsNyArMzkwNSw4IEBACiAJaW50IHJldCA9IDA7CiAKICNpZmRlZiBDT05GSUdfODhFVV9QMlAKLQlEQkdfODhFKCJbJXNdIGV4dHJhID0gJXNcbiIsIF9fZnVuY19fLCAoY2hhciAqKXdycXUtPmRhdGEucG9pbnRlcik7CisJREJHXzg4RSgiWyVzXSBleHRyYSA9ICVzXG4iLCBfX2Z1bmNfXywKKwkJCShjaGFyIF9fdXNlciAqKXdycXUtPmRhdGEucG9pbnRlcik7CiAJaWYgKCFtZW1jbXAoZXh0cmEsICJ3cHNDTSA9IiwgNikpIHsKIAkJd3JxdS0+ZGF0YS5sZW5ndGggLT0gNjsKIAkJcnR3X3AycF9nZXRfd3BzX2NvbmZpZ21ldGhvZChkZXYsIGluZm8sIHdycXUsICAmZXh0cmFbNl0pOwpAQCAtNDQzNiwxMiArNDM5NywxMiBAQAogCiAJCQkJZm9yIChpID0gMDsgaSA8IE5VTV9TVEE7IGkrKykgewogCQkJCQlwaGVhZCA9ICYocHN0YXByaXYtPnN0YV9oYXNoW2ldKTsKLQkJCQkJcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJCQkJCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAkJCQkJd2hpbGUgKChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSA9PSBmYWxzZSkgewotCQkJCQkJcHN0YSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGhhc2hfbGlzdCk7CisJCQkJCQlwc3RhID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGhhc2hfbGlzdCk7CiAKLQkJCQkJCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQkJCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAogCQkJCQkJaWYgKGV4dHJhX2FyZyA9PSBwc3RhLT5haWQpIHsKIAkJCQkJCQlEQkdfODhFKCJzdGEncyBtYWNhZGRyOiVwTVxuIiwgKHBzdGEtPmh3YWRkcikpOwpAQCAtNDUwNywxMSArNDQ2OCw5IEBACiAJCQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKIAkJCS8qICAwOiBkaXNhYmxlLCBiaXQoMCk6ZW5hYmxlIDIuNGcsIGJpdCgxKTplbmFibGUgNWcsIDB4MzogZW5hYmxlIGJvdGggMi40ZyBhbmQgNWcgKi8KIAkJCS8qIGRlZmF1bHQgaXMgc2V0IHRvIGVuYWJsZSAyLjRHSFogZm9yIElPVCBpc3N1ZSB3aXRoIGJ1ZmZsYW8ncyBBUCBhdCA1R0haICovCi0JCQlpZiAocHJlZ3ByaXYgJiYKLQkJCSAgICAoZXh0cmFfYXJnID09IDAgfHwKLQkJCSAgICAgZXh0cmFfYXJnID09IDEgfHwKLQkJCSAgICAgZXh0cmFfYXJnID09IDIgfHwKLQkJCSAgICAgZXh0cmFfYXJnID09IDMpKSB7CisJCQlpZiAoIXByZWdwcml2KQorCQkJCWJyZWFrOworCQkJaWYgKGV4dHJhX2FyZyA+PSAwICYmIGV4dHJhX2FyZyA8PSAzKSB7CiAJCQkJcHJlZ3ByaXYtPnJ4X3N0YmMgPSBleHRyYV9hcmc7CiAJCQkJREJHXzg4RSgic2V0IHJ4X3N0YmMgPSVkXG4iLCBwcmVncHJpdi0+cnhfc3RiYyk7CiAJCQl9IGVsc2UgewpAQCAtNDUyMyw3ICs0NDgyLDkgQEAKIAkJewogCQkJc3RydWN0IHJlZ2lzdHJ5X3ByaXYJKnByZWdwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7CiAJCQkvKiAgMDogZGlzYWJsZSwgMHgxOmVuYWJsZSAoYnV0IHdpZmlfc3BlYyBzaG91bGQgYmUgMCksIDB4MjogZm9yY2UgZW5hYmxlIChkb24ndCBjYXJlIHdpZmlfc3BlYykgKi8KLQkJCWlmIChwcmVncHJpdiAmJiBleHRyYV9hcmcgPj0gMCAmJiBleHRyYV9hcmcgPCAzKSB7CisJCQlpZiAoIXByZWdwcml2KQorCQkJCWJyZWFrOworCQkJaWYgKGV4dHJhX2FyZyA+PSAwICYmIGV4dHJhX2FyZyA8IDMpIHsKIAkJCQlwcmVncHJpdi0+YW1wZHVfZW5hYmxlID0gZXh0cmFfYXJnOwogCQkJCURCR184OEUoInNldCBhbXBkdV9lbmFibGUgPSVkXG4iLCBwcmVncHJpdi0+YW1wZHVfZW5hYmxlKTsKIAkJCX0gZWxzZSB7CkBAIC01NjQ4LDEyICs1NjA5LDEyIEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJbGVuID0gZHdycS0+bGVuZ3RoOwotCWV4dCA9IHJ0d192bWFsbG9jKGxlbik7CisJZXh0ID0gdm1hbGxvYyhsZW4pOwogCWlmICghZXh0KQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcihleHQsIGR3cnEtPnBvaW50ZXIsIGxlbikpIHsKLQkJcnR3X3ZtZnJlZShleHQsIGxlbik7CisJCXZmcmVlKGV4dCk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIApAQCAtNTY5Myw3ICs1NjU0LDcgQEAKIAogRlJFRV9FWFQ6CiAKLQlydHdfdm1mcmVlKGV4dCwgbGVuKTsKKwl2ZnJlZShleHQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTU3MDksMTAgKzU2NzAsMTQgQEAKIAlEQkdfODhFKCJbJXNdIGV4dHJhID0gJXNcbiIsIF9fZnVuY19fLCBleHRyYSk7CiAKIAlpZiAoIW1lbWNtcChleHRyYSwgImxwcyA9IiwgNCkpIHsKLQkJc3NjYW5mKGV4dHJhKzQsICIldSIsICZtb2RlKTsKKwkJcmV0ID0gc3NjYW5mKGV4dHJhKzQsICIldSIsICZtb2RlKTsKKwkJaWYgKHJldCAhPSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXJldCA9IHJ0d19wbV9zZXRfbHBzKHBhZGFwdGVyLCBtb2RlKTsKIAl9IGVsc2UgaWYgKCFtZW1jbXAoZXh0cmEsICJpcHMgPSIsIDQpKSB7Ci0JCXNzY2FuZihleHRyYSs0LCAiJXUiLCAmbW9kZSk7CisJCXJldCA9IHNzY2FuZihleHRyYSs0LCAiJXUiLCAmbW9kZSk7CisJCWlmIChyZXQgIT0gMSkKKwkJCXJldHVybiAtRUlOVkFMOwogCQlyZXQgPSBydHdfcG1fc2V0X2lwcyhwYWRhcHRlciwgbW9kZSk7CiAJfSBlbHNlIHsKIAkJcmV0ID0gLUVJTlZBTDsKQEAgLTY4MTIsOCArNjc3NywxMSBAQAogewogCXUzMiBiYW5kd2lkdGggPSAwLCBzZyA9IDA7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gcnR3X25ldGRldl9wcml2KGRldik7CisJaW50IHJ2OwogCi0Jc3NjYW5mKGV4dHJhLCAiNDBNID0lZCwgc2hvcnRHSSA9JWQiLCAmYmFuZHdpZHRoLCAmc2cpOworCXJ2ID0gc3NjYW5mKGV4dHJhLCAiNDBNID0lZCwgc2hvcnRHSSA9JWQiLCAmYmFuZHdpZHRoLCAmc2cpOworCWlmIChydiAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChiYW5kd2lkdGggIT0gSFRfQ0hBTk5FTF9XSURUSF80MCkKIAkJYmFuZHdpZHRoID0gSFRfQ0hBTk5FTF9XSURUSF8yMDsKQEAgLTY4MzMsNiArNjgwMSw3IEBACiAJdTMyCQlpZHhfYSA9IDAsIGlkeF9iID0gMDsKIAljaGFyCSppbnB1dCA9IGttYWxsb2Mod3JxdS0+bGVuZ3RoLCBHRlBfS0VSTkVMKTsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSBydHdfbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcnY7CiAKIAlpZiAoIWlucHV0KQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTY4NDAsNyArNjgwOSwxMSBAQAogCQlrZnJlZShpbnB1dCk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KLQlzc2NhbmYoaW5wdXQsICJwYXRoYSA9JWQsIHBhdGhiID0lZCIsICZpZHhfYSwgJmlkeF9iKTsKKwlydiA9IHNzY2FuZihpbnB1dCwgInBhdGhhID0lZCwgcGF0aGIgPSVkIiwgJmlkeF9hLCAmaWR4X2IpOworCWlmIChydiAhPSAyKSB7CisJCWtmcmVlKGlucHV0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJc3ByaW50ZihleHRyYSwgIlNldCBwb3dlciBsZXZlbCBwYXRoX0E6JWQgcGF0aF9COiVkIiwgaWR4X2EsIGlkeF9iKTsKIAlwYWRhcHRlci0+bXBwcml2LnR4cG93ZXJpZHggPSAodTgpaWR4X2E7CkBAIC02OTM0LDYgKzY5MDcsNyBAQAogCXUzMiBwa1R4ID0gMSwgY291bnRQa1R4ID0gMSwgY290dVR4ID0gMSwgQ2FyclNwclR4ID0gMSwgc2NUeCA9IDEsIHNnbGVUeCA9IDEsIHN0b3AgPSAxOwogCXUzMiBiU3RhcnRUZXN0ID0gMTsKIAl1MzIgY291bnQgPSAwOworCWludCBydjsKIAlzdHJ1Y3QgbXBfcHJpdiAqcG1wX3ByaXY7CiAJc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWI7CiAKQEAgLTY5NTMsNyArNjkyNyw5IEBACiAJc2dsZVR4ID0gc3RybmNtcChleHRyYSwgImJhY2tncm91bmQsIHN0b25lIiwgMjApOwogCXBrVHggPSBzdHJuY21wKGV4dHJhLCAiYmFja2dyb3VuZCwgcGt0IiwgMjApOwogCXN0b3AgPSBzdHJuY21wKGV4dHJhLCAic3RvcCIsIDQpOwotCXNzY2FuZihleHRyYSwgImNvdW50ID0lZCwgcGt0IiwgJmNvdW50KTsKKwlydiA9IHNzY2FuZihleHRyYSwgImNvdW50ID0lZCwgcGt0IiwgJmNvdW50KTsKKwlpZiAocnYgIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlfcnR3X21lbXNldChleHRyYSwgJ1wwJywgc2l6ZW9mKCpleHRyYSkpOwogCkBAIC03MzEyLDYgKzcyODgsNyBAQAogewogCWNoYXIJKmlucHV0ID0ga21hbGxvYyh3cnF1LT5sZW5ndGgsIEdGUF9LRVJORUwpOwogCXUzMgkJdmFseGNhcDsKKwlpbnQgcnY7CiAKIAlpZiAoIWlucHV0KQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTczMjIsNyArNzI5OSwxMSBAQAogCiAJREJHXzg4RSgiJXM6aXdwcml2IGluID0lc1xuIiwgX19mdW5jX18sIGlucHV0KTsKIAotCXNzY2FuZihpbnB1dCwgInhjYXAgPSVkIiwgJnZhbHhjYXApOworCXJ2ID0gc3NjYW5mKGlucHV0LCAieGNhcCA9JWQiLCAmdmFseGNhcCk7CisJaWYgKHJ2ICE9IDEpIHsKKwkJa2ZyZWUoaW5wdXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlrZnJlZShpbnB1dCk7CiAJcmV0dXJuIDA7CkBAIC03ODg4LDYgKzc4NjksNyBAQAogCXMzMiBsZW47CiAJdTggKmV4dHJhID0gTlVMTDsKIAl1MzIgZXh0cmFfc2l6ZSA9IDA7CisJaW50IHJ2OwogCiAJczMyIGs7CiAJY29uc3QgaXdfaGFuZGxlciAqcHJpdjsJCS8qIFByaXZhdGUgaW9jdGwgKi8KQEAgLTc5MTMsNyArNzg5NSwxMSBAQAogCXB0ciA9IGlucHV0OwogCWxlbiA9IGlucHV0X2xlbjsKIAotCXNzY2FuZihwdHIsICIlMTZzIiwgY21kbmFtZSk7CisJcnYgPSBzc2NhbmYocHRyLCAiJTE2cyIsIGNtZG5hbWUpOworCWlmIChydiAhPSAxKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CiAJY21kbGVuID0gc3RybGVuKGNtZG5hbWUpOwogCURCR184OEUoIiVzOiBjbWQgPSVzXG4iLCBfX2Z1bmNfXywgY21kbmFtZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL21sbWVfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL21sbWVfbGludXguYwppbmRleCA1N2QxZmY3Li4wNjI0Mzc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9tbG1lX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvbWxtZV9saW51eC5jCkBAIC02MSwxMiArNjEsMTAgQEAKIAogdm9pZCBydHdfb3NfaW5kaWNhdGVfY29ubmVjdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKLV9mdW5jX2VudGVyXzsKIAlydHdfaW5kaWNhdGVfd3hfYXNzb2NfZXZlbnQoYWRhcHRlcik7CiAJbmV0aWZfY2Fycmllcl9vbihhZGFwdGVyLT5wbmV0ZGV2KTsKIAlpZiAoYWRhcHRlci0+cGlkWzJdICE9IDApCiAJCXJ0d19zaWduYWxfcHJvY2VzcyhhZGFwdGVyLT5waWRbMl0sIFNJR0FMUk0pOwotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X29zX2luZGljYXRlX3NjYW5fZG9uZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIGJvb2wgYWJvcnRlZCkKQEAgLTExOSwxMSArMTE3LDkgQEAKIAogdm9pZCBydHdfb3NfaW5kaWNhdGVfZGlzY29ubmVjdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKLV9mdW5jX2VudGVyXzsKIAluZXRpZl9jYXJyaWVyX29mZihhZGFwdGVyLT5wbmV0ZGV2KTsgLyogIERvIGl0IGZpcnN0IGZvciB0eCBicm9hZGNhc3QgcGt0IGFmdGVyIGRpc2Nvbm5lY3Rpb24gaXNzdWUhICovCiAJcnR3X2luZGljYXRlX3d4X2Rpc2Fzc29jX2V2ZW50KGFkYXB0ZXIpOwogCSBydHdfcmVzZXRfc2VjdXJpdHlwcml2KGFkYXB0ZXIpOwotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X3JlcG9ydF9zZWNfaWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHU4IGF1dGhtb2RlLCB1OCAqc2VjX2llKQpAQCAtMTMyLDcgKzEyOCw2IEBACiAJdTgJKmJ1ZmYsICpwLCBpOwogCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKIAotX2Z1bmNfZW50ZXJfOwogCVJUX1RSQUNFKF9tb2R1bGVfbWxtZV9vc2RlcF9jXywgX2Rydl9pbmZvXywKIAkJICgiK3J0d19yZXBvcnRfc2VjX2llLCBhdXRobW9kZT0lZFxuIiwgYXV0aG1vZGUpKTsKIAlidWZmID0gTlVMTDsKQEAgLTE0MSw3ICsxMzYsNyBAQAogCQkJICgicnR3X3JlcG9ydF9zZWNfaWUsIGF1dGhtb2RlPSVkXG4iLCBhdXRobW9kZSkpOwogCQlidWZmID0gcnR3X21hbGxvYyhJV19DVVNUT01fTUFYKTsKIAkJaWYgKCFidWZmKQotCQkJZ290byBleGl0OworCQkJcmV0dXJuOwogCQlfcnR3X21lbXNldChidWZmLCAwLCBJV19DVVNUT01fTUFYKTsKIAkJcCA9IGJ1ZmY7CiAJCXAgKz0gc3ByaW50ZihwLCAiQVNTT0NJTkZPKFJlcUlFcyA9Iik7CkBAIC0xNTcsOCArMTUyLDYgQEAKIAkJd2lyZWxlc3Nfc2VuZF9ldmVudChhZGFwdGVyLT5wbmV0ZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgYnVmZik7CiAJCWtmcmVlKGJ1ZmYpOwogCX0KLWV4aXQ6Ci1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHZvaWQgX3N1cnZleV90aW1lcl9oZGwodm9pZCAqRnVuY3Rpb25Db250ZXh0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvb3NfaW50ZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zX2ludGZzLmMKaW5kZXggN2M5ZWU1OC4uYjIyNWQxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvb3NfaW50ZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9vc19pbnRmcy5jCkBAIC01MjAsNyArNTIwLDYgQEAKIAl1aW50IHN0YXR1cyA9IF9TVUNDRVNTOwogCXN0cnVjdCByZWdpc3RyeV9wcml2ICAqcmVnaXN0cnlfcGFyID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7CiAKLV9mdW5jX2VudGVyXzsKIAogCUdsb2JhbERlYnVnTGV2ZWwgPSBydHdfZGVidWc7CiAJcmVnaXN0cnlfcGFyLT5jaGlwX3ZlcnNpb24gPSAodTgpcnR3X2NoaXBfdmVyc2lvbjsKQEAgLTU4OCw3ICs1ODcsNiBAQAogCXNucHJpbnRmKHJlZ2lzdHJ5X3Bhci0+aWZuYW1lLCAxNiwgIiVzIiwgaWZuYW1lKTsKIAlzbnByaW50ZihyZWdpc3RyeV9wYXItPmlmMm5hbWUsIDE2LCAiJXMiLCBpZjJuYW1lKTsKIAlyZWdpc3RyeV9wYXItPm5vdGNoX2ZpbHRlciA9ICh1OClydHdfbm90Y2hfZmlsdGVyOwotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtODU1LDcgKzg1Myw2IEBACiB7CiAJdTgJcmV0OCA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAoIitydHdfaW5pdF9kcnZfc3dcbiIpKTsKIApAQCAtOTMwLDcgKzkyNyw2IEBACiBleGl0OgogCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICgiLXJ0d19pbml0X2Rydl9zd1xuIikpOwogCi0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0ODsKIH0KQEAgLTExMTUsNyArMTExMSw3IEBACiAKIAlfZW50ZXJfY3JpdGljYWxfbXV0ZXgocGFkYXB0ZXItPmh3X2luaXRfbXV0ZXgsIE5VTEwpOwogCXJldCA9IF9uZXRkZXZfb3BlbihwbmV0ZGV2KTsKLQlfZXhpdF9jcml0aWNhbF9tdXRleChwYWRhcHRlci0+aHdfaW5pdF9tdXRleCwgTlVMTCk7CisJbXV0ZXhfdW5sb2NrKHBhZGFwdGVyLT5od19pbml0X211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMjA4LDYgKzEyMDQsNyBAQAogaW50IG5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldikKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYocG5ldGRldik7CisJc3RydWN0IGR2b2JqX3ByaXYgKmR2b2JqID0gYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcik7CiAKIAlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAoIis4OGV1X2RydiAtIGRydl9jbG9zZVxuIikpOwogCkBAIC0xMjQ2LDYgKzEyNDMsOSBAQAogCXJ0d19wMnBfZW5hYmxlKHBhZGFwdGVyLCBQMlBfUk9MRV9ESVNBQkxFKTsKICNlbmRpZiAvKiBDT05GSUdfODhFVV9QMlAgKi8KIAorCWtmcmVlKGR2b2JqLT5maXJtd2FyZS5zekZ3QnVmZmVyKTsKKwlkdm9iai0+ZmlybXdhcmUuc3pGd0J1ZmZlciA9IE5VTEw7CisKIAlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAoIi04OGV1X2RydiAtIGRydl9jbG9zZVxuIikpOwogCURCR184OEUoIi04OGV1X2RydiAtIGRydl9jbG9zZSwgYnVwID0lZFxuIiwgcGFkYXB0ZXItPmJ1cCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9vc2RlcF9zZXJ2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9vc2RlcF9zZXJ2aWNlLmMKaW5kZXggOGMzYjA3Ny4uMjU3OWE0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvb3NkZXBfc2VydmljZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zZGVwX3NlcnZpY2UuYwpAQCAtNTUsMjcgKzU1LDYgQEAKIAlyZXR1cm4gbnVtOwogfQogCi1pbmxpbmUgdTggKl9ydHdfdm1hbGxvYyh1MzIgc3opCi17Ci0JdTgJKnBidWY7Ci0JcGJ1ZiA9IHZtYWxsb2Moc3opOwotCXJldHVybiBwYnVmOwotfQotCi1pbmxpbmUgdTggKl9ydHdfenZtYWxsb2ModTMyIHN6KQotewotCXU4CSpwYnVmOwotCXBidWYgPSBfcnR3X3ZtYWxsb2Moc3opOwotCWlmIChwYnVmICE9IE5VTEwpCi0JCW1lbXNldChwYnVmLCAwLCBzeik7Ci0JcmV0dXJuIHBidWY7Ci19Ci0KLWlubGluZSB2b2lkIF9ydHdfdm1mcmVlKHU4ICpwYnVmLCB1MzIgc3opCi17Ci0JdmZyZWUocGJ1Zik7Ci19Ci0KIHU4ICpfcnR3X21hbGxvYyh1MzIgc3opCiB7CiAJdTgJKnBidWYgPSBOVUxMOwpAQCAtMTE0LDE2ICs5Myw2IEBACiAJa2ZyZWUocGJ1Zik7CiB9CiAKLWludCBfcnR3X21lbWNtcCh2b2lkICpkc3QsIHZvaWQgKnNyYywgdTMyIHN6KQotewotLyogdW5kZXIgTGludXgvR05VL0dMaWJjLCB0aGUgcmV0dXJuIHZhbHVlIG9mIG1lbWNtcCBmb3IgdHdvIHNhbWUKLSAqIG1lbS4gY2h1bmsgaXMgMCAqLwotCWlmICghKG1lbWNtcChkc3QsIHNyYywgc3opKSkKLQkJcmV0dXJuIHRydWU7Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KIHZvaWQgX3J0d19tZW1zZXQodm9pZCAqcGJ1ZiwgaW50IGMsIHUzMiBzeikKIHsKIAltZW1zZXQocGJ1ZiwgYywgc3opOwpAQCAtMjUyLDcgKzIyMSw3IEBACiAKIAlwbnBpID0gbmV0ZGV2X3ByaXYocG5ldGRldik7CiAKLQlwbnBpLT5wcml2ID0gcnR3X3p2bWFsbG9jKHNpemVvZl9wcml2KTsKKwlwbnBpLT5wcml2ID0gdnphbGxvYyhzaXplb2ZfcHJpdik7CiAJaWYgKCFwbnBpLT5wcml2KSB7CiAJCWZyZWVfbmV0ZGV2KHBuZXRkZXYpOwogCQlwbmV0ZGV2ID0gTlVMTDsKQEAgLTI3Niw3ICsyNDUsNyBAQAogCWlmICghcG5waS0+cHJpdikKIAkJZ290byBSRVRVUk47CiAKLQlydHdfdm1mcmVlKHBucGktPnByaXYsIHBucGktPnNpemVvZl9wcml2KTsKKwl2ZnJlZShwbnBpLT5wcml2KTsKIAlmcmVlX25ldGRldihuZXRkZXYpOwogCiBSRVRVUk46CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9yZWN2X2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9yZWN2X2xpbnV4LmMKaW5kZXggMmExOGIzMi4uZGEzOTdlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvcmVjdl9saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3JlY3ZfbGludXguYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPHJlY3Zfb3NkZXAuaD4KIAogI2luY2x1ZGUgPG9zZGVwX2ludGYuaD4KLSNpbmNsdWRlIDxldGhlcm5ldC5oPgogI2luY2x1ZGUgPHVzYl9vcHMuaD4KIAogLyogaW5pdCBvcyByZWxhdGVkIHJlc291cmNlIGluIHN0cnVjdCByZWN2X3ByaXYgKi8KQEAgLTM2LDE2ICszNSwxNiBAQAogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotLyogYWxsb2Mgb3MgcmVsYXRlZCByZXNvdXJjZSBpbiB1bmlvbiByZWN2X2ZyYW1lICovCisvKiBhbGxvYyBvcyByZWxhdGVkIHJlc291cmNlIGluIHN0cnVjdCByZWN2X2ZyYW1lICovCiBpbnQgcnR3X29zX3JlY3ZfcmVzb3VyY2VfYWxsb2Moc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCisJCQkgICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCiB7Ci0JcHJlY3ZmcmFtZS0+dS5oZHIucGt0X25ld2FsbG9jID0gTlVMTDsKLQlwcmVjdmZyYW1lLT51Lmhkci5wa3QgPSBOVUxMOworCXByZWN2ZnJhbWUtPnBrdF9uZXdhbGxvYyA9IE5VTEw7CisJcHJlY3ZmcmFtZS0+cGt0ID0gTlVMTDsKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLS8qIGZyZWUgb3MgcmVsYXRlZCByZXNvdXJjZSBpbiB1bmlvbiByZWN2X2ZyYW1lICovCisvKiBmcmVlIG9zIHJlbGF0ZWQgcmVzb3VyY2UgaW4gc3RydWN0IHJlY3ZfZnJhbWUgKi8KIHZvaWQgcnR3X29zX3JlY3ZfcmVzb3VyY2VfZnJlZShzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYpCiB7CiB9CkBAIC0xMTgsMjQgKzExNywyMyBAQAogfQogCiB2b2lkIHJ0d19ob3N0YXBkX21sbWVfcngoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQorCQkJIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIH0KIAogaW50IHJ0d19yZWN2X2luZGljYXRlcGt0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCSB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKKwkJCSBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2OwogCXN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcHJlY3Zwcml2ID0gJihwYWRhcHRlci0+cmVjdnByaXYpOwogCXBmcmVlX3JlY3ZfcXVldWUgPSAmKHByZWN2cHJpdi0+ZnJlZV9yZWN2X3F1ZXVlKTsKIAotCXNrYiA9IHByZWN2X2ZyYW1lLT51Lmhkci5wa3Q7CisJc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKIAlpZiAoc2tiID09IE5VTEwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9yZWN2X29zZGVwX2NfLCBfZHJ2X2Vycl8sCiAJCQkgKCJydHdfcmVjdl9pbmRpY2F0ZXBrdCgpOnNrYiA9PSBOVUxMIHNvbWV0aGluZyB3cm9uZyEhISFcbiIpKTsKQEAgLTE0NSwxOCArMTQzLDE4IEBACiAJUlRfVFJBQ0UoX21vZHVsZV9yZWN2X29zZGVwX2NfLCBfZHJ2X2luZm9fLAogCQkgKCJydHdfcmVjdl9pbmRpY2F0ZXBrdCgpOnNrYiAhPSBOVUxMICEhIVxuIikpOwogCVJUX1RSQUNFKF9tb2R1bGVfcmVjdl9vc2RlcF9jXywgX2Rydl9pbmZvXywKLQkJICgicnR3X3JlY3ZfaW5kaWNhdGVwa3QoKTpwcmVjdl9mcmFtZS0+dS5oZHIucnhfaGVhZCA9JXAgIHByZWN2X2ZyYW1lLT5oZHIucnhfZGF0YSA9JXBcbiIsCi0JCSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfaGVhZCwgcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGEpKTsKKwkJICgicnR3X3JlY3ZfaW5kaWNhdGVwa3QoKTpwcmVjdl9mcmFtZS0+cnhfaGVhZCA9JXAgIHByZWN2X2ZyYW1lLT5oZHIucnhfZGF0YSA9JXBcbiIsCisJCSBwcmVjdl9mcmFtZS0+cnhfaGVhZCwgcHJlY3ZfZnJhbWUtPnJ4X2RhdGEpKTsKIAlSVF9UUkFDRShfbW9kdWxlX3JlY3Zfb3NkZXBfY18sIF9kcnZfaW5mb18sCi0JCSAoInByZWN2X2ZyYW1lLT5oZHIucnhfdGFpbCA9JXAgcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2VuZCA9JXAgcHJlY3ZfZnJhbWUtPmhkci5sZW4gPSVkXG4iLAotCQkgcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X3RhaWwsIHByZWN2X2ZyYW1lLT51Lmhkci5yeF9lbmQsCi0JCSBwcmVjdl9mcmFtZS0+dS5oZHIubGVuKSk7CisJCSAoInByZWN2X2ZyYW1lLT5oZHIucnhfdGFpbCA9JXAgcHJlY3ZfZnJhbWUtPnJ4X2VuZCA9JXAgcHJlY3ZfZnJhbWUtPmhkci5sZW4gPSVkXG4iLAorCQkgcHJlY3ZfZnJhbWUtPnJ4X3RhaWwsIHByZWN2X2ZyYW1lLT5yeF9lbmQsCisJCSBwcmVjdl9mcmFtZS0+bGVuKSk7CiAKLQlza2ItPmRhdGEgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKKwlza2ItPmRhdGEgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKIAotCXNrYl9zZXRfdGFpbF9wb2ludGVyKHNrYiwgcHJlY3ZfZnJhbWUtPnUuaGRyLmxlbik7CisJc2tiX3NldF90YWlsX3BvaW50ZXIoc2tiLCBwcmVjdl9mcmFtZS0+bGVuKTsKIAotCXNrYi0+bGVuID0gcHJlY3ZfZnJhbWUtPnUuaGRyLmxlbjsKKwlza2ItPmxlbiA9IHByZWN2X2ZyYW1lLT5sZW47CiAKIAlSVF9UUkFDRShfbW9kdWxlX3JlY3Zfb3NkZXBfY18sIF9kcnZfaW5mb18sCiAJCSAoInNrYi0+aGVhZCA9JXAgc2tiLT5kYXRhID0lcCBza2ItPnRhaWwgPSVwIHNrYi0+ZW5kID0lcCBza2ItPmxlbiA9JWRcbiIsCkBAIC0xNjcsMTEgKzE2NSwxMSBAQAogCQlzdHJ1Y3Qgc2tfYnVmZiAqcHNrYjIgPSBOVUxMOwogCQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwogCQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliOworCQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+YXR0cmliOwogCQlpbnQgYm1jYXN0ID0gSVNfTUNBU1QocGF0dHJpYi0+ZHN0KTsKIAotCQlpZiAoIV9ydHdfbWVtY21wKHBhdHRyaWItPmRzdCwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLAotCQkJCSBFVEhfQUxFTikpIHsKKwkJaWYgKG1lbWNtcChwYXR0cmliLT5kc3QsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwKKwkJCSAgIEVUSF9BTEVOKSkgewogCQkJaWYgKGJtY2FzdCkgewogCQkJCXBzdGEgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbyhwYWRhcHRlcik7CiAJCQkJcHNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKQEAgLTIwOSwxNCArMjA3LDEzIEBACiBfcmVjdl9pbmRpY2F0ZXBrdF9lbmQ6CiAKIAkvKiAgcG9pbnRlcnMgdG8gTlVMTCBiZWZvcmUgcnR3X2ZyZWVfcmVjdmZyYW1lKCkgKi8KLQlwcmVjdl9mcmFtZS0+dS5oZHIucGt0ID0gTlVMTDsKKwlwcmVjdl9mcmFtZS0+cGt0ID0gTlVMTDsKIAogCXJ0d19mcmVlX3JlY3ZmcmFtZShwcmVjdl9mcmFtZSwgcGZyZWVfcmVjdl9xdWV1ZSk7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3JlY3Zfb3NkZXBfY18sIF9kcnZfaW5mb18sCiAJCSAoIlxuIHJ0d19yZWN2X2luZGljYXRlcGt0IDphZnRlciBuZXRpZl9yeCEhISFcbiIpKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gX1NVQ0NFU1M7CiAKQEAgLTIyNSw3ICsyMjIsNiBAQAogCSAvKiBlbnF1ZXVlIGJhY2sgdG8gZnJlZV9yZWN2X3F1ZXVlICovCiAJcnR3X2ZyZWVfcmVjdmZyYW1lKHByZWN2X2ZyYW1lLCBwZnJlZV9yZWN2X3F1ZXVlKTsKIAotX2Z1bmNfZXhpdF87CiAJIHJldHVybiBfRkFJTDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvcnR3X2FuZHJvaWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3J0d19hbmRyb2lkLmMKaW5kZXggYTNjMmJjNS4uY2EyNzM2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvcnR3X2FuZHJvaWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9ydHdfYW5kcm9pZC5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8cnR3X2FuZHJvaWQuaD4KICNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+CiAjaW5jbHVkZSA8cnR3X2RlYnVnLmg+Ci0jaW5jbHVkZSA8aW9jdGxfY2ZnODAyMTEuaD4KICNpbmNsdWRlIDxydHdfaW9jdGxfc2V0Lmg+CiAKIHN0YXRpYyBjb25zdCBjaGFyICphbmRyb2lkX3dpZmlfY21kX3N0cltBTkRST0lEX1dJRklfQ01EX01BWF0gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2JfaW50Zi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX2ludGYuYwppbmRleCAyZjQwZmY1Li4yZTQ5Y2Q1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2JfaW50Zi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9pbnRmLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxoYWxfaW50Zi5oPgogI2luY2x1ZGUgPHJ0d192ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPG9zZGVwX2ludGYuaD4KIAogI2luY2x1ZGUgPHVzYl92ZW5kb3JfcmVxLmg+CkBAIC0xNjIsNyArMTYzLDYgQEAKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKnBlbmRwX2Rlc2M7CiAJc3RydWN0IHVzYl9kZXZpY2UJKnB1c2JkOwogCi1fZnVuY19lbnRlcl87CiAKIAlwZHZvYmpwcml2ID0gKHN0cnVjdCBkdm9ial9wcml2ICopcnR3X3ptYWxsb2Moc2l6ZW9mKCpwZHZvYmpwcml2KSk7CiAJaWYgKHBkdm9ianByaXYgPT0gTlVMTCkKQEAgLTI1NSw3ICsyNTUsNiBAQAogCQlwZHZvYmpwcml2ID0gTlVMTDsKIAl9CiBleGl0OgotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHBkdm9ianByaXY7CiB9CiAKQEAgLTI2Myw3ICsyNjIsNiBAQAogewogCXN0cnVjdCBkdm9ial9wcml2ICpkdm9iaiA9IHVzYl9nZXRfaW50ZmRhdGEodXNiX2ludGYpOwogCi1fZnVuY19lbnRlcl87CiAKIAl1c2Jfc2V0X2ludGZkYXRhKHVzYl9pbnRmLCBOVUxMKTsKIAlpZiAoZHZvYmopIHsKQEAgLTI4OCw3ICsyODYsNiBAQAogCiAJdXNiX3B1dF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldih1c2JfaW50ZikpOwogCi1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHZvaWQgY2hpcF9ieV91c2JfaWQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLApAQCAtMzkwLDcgKzM4Nyw2IEBACiAJc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYgPSBwYWRhcHRlci0+cG5ldGRldjsKIAotCV9mdW5jX2VudGVyXzsKIAogCWlmICgoIXBhZGFwdGVyLT5idXApIHx8IChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQpIHx8CiAJICAgIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkpIHsKQEAgLTQ0Myw3ICs0MzksNiBAQAogCX0gZWxzZSB7CiAJCWdvdG8gZXJyb3JfZXhpdDsKIAl9Ci0JX2Z1bmNfZXhpdF87CiAJcmV0dXJuIDA7CiAKIGVycm9yX2V4aXQ6CkBAIC00NTYsNyArNDUxLDYgQEAKIAlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwogCi0JX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBhZGFwdGVyKSB7IC8qIHN5c3RlbSByZXN1bWUgKi8KIAkJREJHXzg4RSgiPT0+IHJ0d19od19yZXN1bWVcbiIpOwpAQCAtNDg4LDcgKzQ4Miw2IEBACiAJCWdvdG8gZXJyb3JfZXhpdDsKIAl9CiAKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiAwOwogZXJyb3JfZXhpdDoKQEAgLTUwNyw3ICs1MDAsNiBAQAogCWludCByZXQgPSAwOwogCXUzMiBzdGFydF90aW1lID0gamlmZmllczsKIAotCV9mdW5jX2VudGVyXzsKIAogCURCR184OEUoIj09PiAlcyAoJXM6JWQpXG4iLCBfX2Z1bmNfXywgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkKTsKIApAQCAtNTY0LDcgKzU1Niw2IEBACiAJREJHXzg4RSgiPD09PSAgJXMgcmV0dXJuICVkLi4uLi4uLi4uLi4uLi4gaW4gJWRtc1xuIiwgX19mdW5jX18KIAkJLCByZXQsIHJ0d19nZXRfcGFzc2luZ190aW1lX21zKHN0YXJ0X3RpbWUpKTsKIAotCV9mdW5jX2V4aXRfOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTU4OCw3ICs1NzksNiBAQAogCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cnByaXYgPSBOVUxMOwogCWludCByZXQgPSAtMTsKIAl1MzIgc3RhcnRfdGltZSA9IGppZmZpZXM7Ci0JX2Z1bmNfZW50ZXJfOwogCiAJREJHXzg4RSgiPT0+ICVzICglczolZClcbiIsIF9fZnVuY19fLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQpOwogCkBAIC02MjcsNyArNjE3LDYgQEAKIAlEQkdfODhFKCI8PT09ICAlcyByZXR1cm4gJWQuLi4uLi4uLi4uLi4uLiBpbiAlZG1zXG4iLCBfX2Z1bmNfXywKIAkJcmV0LCBydHdfZ2V0X3Bhc3NpbmdfdGltZV9tcyhzdGFydF90aW1lKSk7CiAKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiB9CkBAIC02NDcsNyArNjM2LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiA9IE5VTEw7CiAJaW50IHN0YXR1cyA9IF9GQUlMOwogCi0JcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfenZtYWxsb2Moc2l6ZW9mKCpwYWRhcHRlcikpOworCXBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopdnphbGxvYyhzaXplb2YoKnBhZGFwdGVyKSk7CiAJaWYgKHBhZGFwdGVyID09IE5VTEwpCiAJCWdvdG8gZXhpdDsKIAlwYWRhcHRlci0+ZHZvYmogPSBkdm9iajsKQEAgLTc0Nyw3ICs3MzYsNyBAQAogCQlpZiAocG5ldGRldikKIAkJCXJ0d19mcmVlX25ldGRldihwbmV0ZGV2KTsKIAkJZWxzZSBpZiAocGFkYXB0ZXIpCi0JCQlydHdfdm1mcmVlKCh1OCAqKXBhZGFwdGVyLCBzaXplb2YoKnBhZGFwdGVyKSk7CisJCQl2ZnJlZShwYWRhcHRlcik7CiAJCXBhZGFwdGVyID0gTlVMTDsKIAl9CiBleGl0OgpAQCAtODM2LDcgKzgyNSw2IEBACiAJc3RydWN0IGR2b2JqX3ByaXYgKmR2b2JqID0gdXNiX2dldF9pbnRmZGF0YShwdXNiX2ludGYpOwogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IGR2b2JqLT5pZjE7CiAKLV9mdW5jX2VudGVyXzsKIAogCURCR184OEUoIitydHdfZGV2X3JlbW92ZVxuIik7CiAJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgKCIrZGV2X3JlbW92ZSgpXG4iKSk7CkBAIC04NTUsNyArODQzLDYgQEAKIAogCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICgiLWRldl9yZW1vdmUoKVxuIikpOwogCURCR184OEUoIi1yODcxeHVfZGV2X3JlbW92ZSwgZG9uZVxuIik7Ci1fZnVuY19leGl0XzsKIAogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9vcHNfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9vcHNfbGludXguYwppbmRleCA3ZTNmMmZhLi5mYjBiYmE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2Jfb3BzX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX29wc19saW51eC5jCkBAIC04MCw3ICs4MCw2IEBACiAJc3RydWN0IHhtaXRfcHJpdgkqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKIAlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGE7CiAKLV9mdW5jX2VudGVyXzsKIAogCXN3aXRjaCAocHhtaXRidWYtPmZsYWdzKSB7CiAJY2FzZSBWT19RVUVVRV9JTlg6CkBAIC0xNTYsOCArMTU1LDYgQEAKIAlydHdfZnJlZV94bWl0YnVmKHB4bWl0cHJpdiwgcHhtaXRidWYpOwogCiAJdGFza2xldF9oaV9zY2hlZHVsZSgmcHhtaXRwcml2LT54bWl0X3Rhc2tsZXQpOwotCi1fZnVuY19leGl0XzsKIH0KIAogdTMyIHVzYl93cml0ZV9wb3J0KHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwsIHUzMiBhZGRyLCB1MzIgY250LCB1OCAqd21lbSkKQEAgLTE3NCw3ICsxNzEsNiBAQAogCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lID0gKHN0cnVjdCB4bWl0X2ZyYW1lICopcHhtaXRidWYtPnByaXZfZGF0YTsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYmQgPSBwZHZvYmotPnB1c2JkZXY7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLCAoIit1c2Jfd3JpdGVfcG9ydFxuIikpOwogCkBAIC0yNTUsNyArMjUxLDYgQEAKIGV4aXQ6CiAJaWYgKHJldCAhPSBfU1VDQ0VTUykKIAkJcnR3X2ZyZWVfeG1pdGJ1ZihweG1pdHByaXYsIHB4bWl0YnVmKTsKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3htaXRfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3htaXRfbGludXguYwppbmRleCA5MDA1OTcxLi4yYzhlM2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC94bWl0X2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAveG1pdF9saW51eC5jCkBAIC0yMyw4ICsyMyw2IEBACiAjaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgogI2luY2x1ZGUgPGRydl90eXBlcy5oPgogCi0jaW5jbHVkZSA8aWZfZXRoZXIuaD4KLSNpbmNsdWRlIDxpcC5oPgogI2luY2x1ZGUgPHdpZmkuaD4KICNpbmNsdWRlIDxtbG1lX29zZGVwLmg+CiAjaW5jbHVkZSA8eG1pdF9vc2RlcC5oPgpAQCAtMzksNyArMzcsNiBAQAogCiB2b2lkIF9ydHdfb3Blbl9wa3RmaWxlKHN0cnVjdCBza19idWZmICpwa3RwdHIsIHN0cnVjdCBwa3RfZmlsZSAqcGZpbGUpCiB7Ci1fZnVuY19lbnRlcl87CiAKIAlwZmlsZS0+cGt0ID0gcGt0cHRyOwogCXBmaWxlLT5jdXJfYWRkciA9IHBrdHB0ci0+ZGF0YTsKQEAgLTQ5LDE0ICs0NiwxMiBAQAogCiAJcGZpbGUtPmN1cl9idWZmZXIgPSBwZmlsZS0+YnVmX3N0YXJ0OwogCi1fZnVuY19leGl0XzsKIH0KIAogdWludCBfcnR3X3BrdGZpbGVfcmVhZCAoc3RydWN0IHBrdF9maWxlICpwZmlsZSwgdTggKnJtZW0sIHVpbnQgcmxlbikKIHsKIAl1aW50CWxlbiA9IDA7CiAKLV9mdW5jX2VudGVyXzsKIAogCWxlbiA9ICBydHdfcmVtYWluZGVyX2xlbihwZmlsZSk7CiAJbGVuID0gKHJsZW4gPiBsZW4pID8gbGVuIDogcmxlbjsKQEAgLTY3LDIxICs2MiwxNyBAQAogCXBmaWxlLT5jdXJfYWRkciArPSBsZW47CiAJcGZpbGUtPnBrdF9sZW4gLT0gbGVuOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBsZW47CiB9CiAKIGludCBydHdfZW5kb2Zwa3RmaWxlKHN0cnVjdCBwa3RfZmlsZSAqcGZpbGUpCiB7Ci1fZnVuY19lbnRlcl87CiAKIAlpZiAocGZpbGUtPnBrdF9sZW4gPT0gMCkgewotCV9mdW5jX2V4aXRfOwogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIGZhbHNlOwogfQpAQCAtMjAwLDEzICsxOTEsMTMgQEAKIAogCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKIAlwaGVhZCA9ICZwc3RhcHJpdi0+YXNvY19saXN0OwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAkvKiBmcmVlIHN0YSBhc29jX3F1ZXVlICovCiAJd2hpbGUgKCFydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSB7Ci0JCXBzdGEgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBhc29jX2xpc3QpOworCQlwc3RhID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGFzb2NfbGlzdCk7CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKIAkJLyogYXZvaWQgICBjb21lIGZyb20gU1RBMSBhbmQgc2VuZCBiYWNrIFNUQTEgKi8KIAkJaWYgKCFtZW1jbXAocHN0YS0+aHdhZGRyLCAmc2tiLT5kYXRhWzZdLCA2KSkKQEAgLTI0Niw3ICsyMzcsNiBAQAogCXN0cnVjdCBtbG1lX3ByaXYJKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJczMyIHJlcyA9IDA7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLCAoIit4bWl0X2VucnlcbiIpKTsKIApAQCAtMjgyLDcgKzI3Miw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvZG90MTFkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvZG90MTFkLmMKaW5kZXggZWIzM2M1MS4uNTNkYTYxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2RvdDExZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9kb3QxMWQuYwpAQCAtMTMzLDE0ICsxMzMsMTIgQEAKIAlwVHJpcGxlID0gKHN0cnVjdCBjaG5sX3R4cG93X3RyaXBsZSAqKShwQ291dHJ5SWUgKyAzKTsKIAlmb3IgKGkgPSAwOyBpIDwgTnVtVHJpcGxlczsgaSsrKSB7CiAJCWlmIChNYXhDaG5sTnVtID49IHBUcmlwbGUtPkZpcnN0Q2hubCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBJbnZhbGlkIgotCQkJICAgICAgICIgY291bnRyeSBJRSwgc2tpcCBpdC4uLi4uLi4uMVxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJEb3QxMWRfVXBkYXRlQ291bnRyeUllKCk6IEludmFsaWQgY291bnRyeSBJRSwgc2tpcCBpdC4uLi4uLi4uMVxuIik7CiAJCQlyZXR1cm47CiAJCX0KIAkJaWYgKE1BWF9DSEFOTkVMX05VTUJFUiA8IChwVHJpcGxlLT5GaXJzdENobmwgKwogCQkgICAgcFRyaXBsZS0+TnVtQ2hubHMpKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJEb3QxMWRfVXBkYXRlQ291bnRyeUllKCk6IEludmFsaWQgIgotCQkJICAgICAgICJjb3VudHJ5IElFLCBza2lwIGl0Li4uLi4uLi4yXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogSW52YWxpZCBjb3VudHJ5IElFLCBza2lwIGl0Li4uLi4uLi4yXG4iKTsKIAkJCXJldHVybjsKIAkJfQogCkBAIC0xNjcsOCArMTY1LDcgQEAKIAl1OCBNYXhUeFB3ckluRGJtID0gMjU1OwogCiAJaWYgKE1BWF9DSEFOTkVMX05VTUJFUiA8IENoYW5uZWwpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRE9UMTFEX0dldE1heFR4UHdySW5EYm0oKTogSW52YWxpZCAiCi0JCSAgICAgICAiQ2hhbm5lbFxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIkRPVDExRF9HZXRNYXhUeFB3ckluRGJtKCk6IEludmFsaWQgQ2hhbm5lbFxuIik7CiAJCXJldHVybiBNYXhUeFB3ckluRGJtOwogCX0KIAlpZiAocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW0NoYW5uZWxdKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9wY2kuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfcGNpLmgKaW5kZXggMzU2YWVjNC4uNGI5NDY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9wY2kuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3BjaS5oCkBAIC0yOCwzMSArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBOZGlzUmF3V3JpdGVQb3J0VWxvbmcodTMyIHBvcnQsICB1MzIgdmFsKQotewotCW91dGwodmFsLCBwb3J0KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIE5kaXNSYXdXcml0ZVBvcnRVY2hhcih1MzIgcG9ydCwgIHU4IHZhbCkKLXsKLQlvdXRiKHZhbCwgcG9ydCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBOZGlzUmF3UmVhZFBvcnRVY2hhcih1MzIgcG9ydCwgdTggKnB2YWwpCi17Ci0JKnB2YWwgPSBpbmIocG9ydCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBOZGlzUmF3UmVhZFBvcnRVc2hvcnQodTMyIHBvcnQsIHUxNiAqcHZhbCkKLXsKLQkqcHZhbCA9IGludyhwb3J0KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIE5kaXNSYXdSZWFkUG9ydFVsb25nKHUzMiBwb3J0LCB1MzIgKnB2YWwpCi17Ci0JKnB2YWwgPSBpbmwocG9ydCk7Ci19Ci0KIHN0cnVjdCBtcF9hZGFwdGVyIHsKIAl1OAkJTGlua0N0cmxSZWc7CiAKQEAgLTcwLDMzICs0NSw2IEBACiAJdTgJCVBjaUJyaWRnZUxpbmtDdHJsUmVnOwogfTsKIAotc3RydWN0IHJ0X3BjaV9jYXBhYl9oZWFkZXIgewotCXVuc2lnbmVkIGNoYXIgICBDYXBhYmlsaXR5SUQ7Ci0JdW5zaWduZWQgY2hhciAgIE5leHQ7Ci19OwotCi0jZGVmaW5lIFBDSV9NQVhfQlJJREdFX05VTUJFUgkJCQkyNTUKLSNkZWZpbmUgUENJX01BWF9ERVZJQ0VTCQkJCQkJMzIKLSNkZWZpbmUgUENJX01BWF9GVU5DVElPTgkJCQkJOAotCi0jZGVmaW5lIFBDSV9DT05GX0FERFJFU1MJCQkJCTB4MENGOAotI2RlZmluZSBQQ0lfQ09ORl9EQVRBCQkJCQkJMHgwQ0ZDCi0KLSNkZWZpbmUJUENJX0NMQVNTX0JSSURHRV9ERVYJCQkJMHgwNgotI2RlZmluZQlQQ0lfU1VCQ0xBU1NfQlJfUENJX1RPX1BDSQkJMHgwNAotCi0jZGVmaW5lCVUxRE9OVENBUkUJCQkJCQkweEZGCi0jZGVmaW5lCVUyRE9OVENBUkUJCQkJCQkweEZGRkYKLSNkZWZpbmUJVTRET05UQ0FSRQkJCQkJCTB4RkZGRkZGRkYKLQotI2RlZmluZQlJTlRFTF9WRU5ET1JfSUQJCQkJCTB4ODA4NgotI2RlZmluZQlTSVNfVkVORE9SX0lECQkJCQkJMHgxMDM5Ci0jZGVmaW5lCUFUSV9WRU5ET1JfSUQJCQkJCQkweDEwMDIKLSNkZWZpbmUJQVRJX0RFVklDRV9JRAkJCQkJCTB4NzkxNAotI2RlZmluZQlBTURfVkVORE9SX0lECQkJCQkJMHgxMDIyCi0KLSNkZWZpbmUgUENJX0NBUEFCSUxJVFlfSURfUENJX0VYUFJFU1MJCTB4MTAKLQogc3RydWN0IG5ldF9kZXZpY2U7CiBib29sIHJ0bDgxOTJfcGNpX2ZpbmRhZGFwdGVyKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF93eC5jCmluZGV4IDYyMDIzNTguLjQ5ODk5NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3d4LmMKQEAgLTYwOSw3ICs2MDksNyBAQAogCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKQogCQlyZXR1cm4gLUUyQklHOwogCWRvd24oJnByaXYtPnd4X3NlbSk7Ci0Jd3JxdS0+ZGF0YS5sZW5ndGggPSBtaW4oKHNpemVfdCkgd3JxdS0+ZGF0YS5sZW5ndGgsIHNpemVvZihwcml2LT5uaWNrKSk7CisJd3JxdS0+ZGF0YS5sZW5ndGggPSBtaW5fdChzaXplX3QsIHdycXUtPmRhdGEubGVuZ3RoLCBzaXplb2YocHJpdi0+bmljaykpOwogCW1lbXNldChwcml2LT5uaWNrLCAwLCBzaXplb2YocHJpdi0+bmljaykpOwogCW1lbWNweShwcml2LT5uaWNrLCBleHRyYSwgd3JxdS0+ZGF0YS5sZW5ndGgpOwogCXVwKCZwcml2LT53eF9zZW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl90eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl90eC5jCmluZGV4IDc3OTY0ODguLjExZDBhOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfdHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3R4LmMKQEAgLTkzOSwxMiArOTM5LDEyIEBACiAJaWYgKHR4YikgewogCQlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSkgewogCQkJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHR4Yi0+cGF5bG9hZF9zaXplOworCQkJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBsZTE2X3RvX2NwdSh0eGItPnBheWxvYWRfc2l6ZSk7CiAJCQlydGxsaWJfc29mdG1hY194bWl0KHR4YiwgaWVlZSk7CiAJCX0gZWxzZSB7CiAJCQlpZiAoKCppZWVlLT5oYXJkX3N0YXJ0X3htaXQpKHR4YiwgZGV2KSA9PSAwKSB7CiAJCQkJc3RhdHMtPnR4X3BhY2tldHMrKzsKLQkJCQlzdGF0cy0+dHhfYnl0ZXMgKz0gdHhiLT5wYXlsb2FkX3NpemU7CisJCQkJc3RhdHMtPnR4X2J5dGVzICs9IGxlMTZfdG9fY3B1KHR4Yi0+cGF5bG9hZF9zaXplKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCXJ0bGxpYl90eGJfZnJlZSh0eGIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9FbmRpYW5GcmVlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL0VuZGlhbkZyZWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM4NWZiOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL0VuZGlhbkZyZWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0jaWZuZGVmIF9fSU5DX0VORElBTkZSRUVfSAotI2RlZmluZSBfX0lOQ19FTkRJQU5GUkVFX0gKLQotLyoKLSAqCUNhbGwgZW5kaWFuIGZyZWUgZnVuY3Rpb24gd2hlbgotICoJCTEuIFJlYWQvd3JpdGUgcGFja2V0IGNvbnRlbnQuCi0gKgkJMi4gQmVmb3JlIHdyaXRlIGludGVnZXIgdG8gSU8uCi0gKgkJMy4gQWZ0ZXIgcmVhZCBpbnRlZ2VyIGZyb20gSU8uCi0gKi8KLQotI2RlZmluZSBfX01BQ0hJTkVfTElUVExFX0VORElBTiAxMjM0ICAgIC8qIExTQiBmaXJzdDogaTM4NiwgdmF4ICovCi0jZGVmaW5lIF9fTUFDSElORV9CSUdfRU5ESUFOICAgIDQzMjEgICAgLyogTVNCIGZpcnN0OiA2ODAwMCwgaWJtLCBuZXQsIHBwYyAqLwotCi0jZGVmaW5lIEJZVEVfT1JERVIgX19NQUNISU5FX0xJVFRMRV9FTkRJQU4KLQotI2lmIEJZVEVfT1JERVIgPT0gX19NQUNISU5FX0xJVFRMRV9FTkRJQU4KLS8vIENvbnZlcnQgZGF0YQotI2RlZmluZSBFRjFCeXRlKF92YWwpCQkJCSgodTgpKF92YWwpKQotI2RlZmluZSBFRjJCeXRlKF92YWwpCQkJCSgodTE2KShfdmFsKSkKLSNkZWZpbmUgRUY0Qnl0ZShfdmFsKQkJCQkoKHUzMikoX3ZhbCkpCi0KLSNlbHNlCi0vLyBDb252ZXJ0IGRhdGEKLSNkZWZpbmUgRUYxQnl0ZShfdmFsKQkJCQkoKHU4KShfdmFsKSkKLSNkZWZpbmUgRUYyQnl0ZShfdmFsKQkJCQkoKCgoKHUxNikoX3ZhbCkpJjB4MDBmZik8PDgpfCgoKCh1MTYpKF92YWwpKSYweGZmMDApPj44KSkKLSNkZWZpbmUgRUY0Qnl0ZShfdmFsKQkJCQkoKCgoKHUzMikoX3ZhbCkpJjB4MDAwMDAwZmYpPDwyNCl8XAotCQkJCQkJKCgoKHUzMikoX3ZhbCkpJjB4MDAwMGZmMDApPDw4KXxcCi0JCQkJCQkoKCgodTMyKShfdmFsKSkmMHgwMGZmMDAwMCk+PjgpfFwKLQkJCQkJCSgoKCh1MzIpKF92YWwpKSYweGZmMDAwMDAwKT4+MjQpKQotI2VuZGlmCi0KLS8vIFJlYWQgZGF0YSBmcm9tIG1lbW9yeQotI2RlZmluZSBSZWFkRUYxQnl0ZShfcHRyKQkJRUYxQnl0ZSgqKCh1OCAqKShfcHRyKSkpCi0jZGVmaW5lIFJlYWRFRjJCeXRlKF9wdHIpCQlFRjJCeXRlKCooKHUxNiAqKShfcHRyKSkpCi0jZGVmaW5lIFJlYWRFRjRCeXRlKF9wdHIpCQlFRjRCeXRlKCooKHUzMiAqKShfcHRyKSkpCi0KLS8vIFdyaXRlIGRhdGEgdG8gbWVtb3J5Ci0jZGVmaW5lIFdyaXRlRUYxQnl0ZShfcHRyLCBfdmFsKQkoKigodTggKikoX3B0cikpKT1FRjFCeXRlKF92YWwpCi0jZGVmaW5lIFdyaXRlRUYyQnl0ZShfcHRyLCBfdmFsKQkoKigodTE2ICopKF9wdHIpKSk9RUYyQnl0ZShfdmFsKQotI2RlZmluZSBXcml0ZUVGNEJ5dGUoX3B0ciwgX3ZhbCkJKCooKHUzMiAqKShfcHRyKSkpPUVGNEJ5dGUoX3ZhbCkKLS8vIENvbnZlcnQgSG9zdCBzeXN0ZW0gc3BlY2lmaWMgYnl0ZSBvcmRpbmcgKGxpdHRlbiBvciBiaWcgZW5kaWEpIHRvIE5ldHdvcmsgYnl0ZSBvcmRpbmcgKGJpZyBlbmRpYW4pLgotLy8gMjAwNi4wNS4wNywgYnkgcmNuamtvLgotI2lmIEJZVEVfT1JERVIgPT0gX19NQUNISU5FX0xJVFRMRV9FTkRJQU4KLSNkZWZpbmUgSDJOMUJZVEUoX3ZhbCkJKCh1OCkoX3ZhbCkpCi0jZGVmaW5lIEgyTjJCWVRFKF92YWwpCSgoKCgodTE2KShfdmFsKSkmMHgwMGZmKTw8OCl8XAotCQkJKCgoKHUxNikoX3ZhbCkpJjB4ZmYwMCk+PjgpKQotI2RlZmluZSBIMk40QllURShfdmFsKQkoKCgoKHUzMikoX3ZhbCkpJjB4MDAwMDAwZmYpPDwyNCl8XAotCQkJKCgoKHUzMikoX3ZhbCkpJjB4MDAwMGZmMDApPDw4KQl8XAotCQkJKCgoKHUzMikoX3ZhbCkpJjB4MDBmZjAwMDApPj44KQl8XAotCQkJKCgoKHUzMikoX3ZhbCkpJjB4ZmYwMDAwMDApPj4yNCkpCi0jZWxzZQotI2RlZmluZSBIMk4xQllURShfdmFsKQkJCSgodTgpKF92YWwpKQotI2RlZmluZSBIMk4yQllURShfdmFsKQkJCSgodTE2KShfdmFsKSkKLSNkZWZpbmUgSDJONEJZVEUoX3ZhbCkJCQkoKHUzMikoX3ZhbCkpCi0jZW5kaWYKLQotLy8gQ29udmVydCBmcm9tIE5ldHdvcmsgYnl0ZSBvcmRpbmcgKGJpZyBlbmRpYW4pIHRvIEhvc3Qgc3lzdGVtIHNwZWNpZmljIGJ5dGUgb3JkaW5nIChsaXR0ZW4gb3IgYmlnIGVuZGlhKS4KLS8vIDIwMDYuMDUuMDcsIGJ5IHJjbmprby4KLSNpZiBCWVRFX09SREVSID09IF9fTUFDSElORV9MSVRUTEVfRU5ESUFOCi0jZGVmaW5lIE4ySDFCWVRFKF92YWwpCSgodTgpKF92YWwpKQotI2RlZmluZSBOMkgyQllURShfdmFsKQkoKCgoKHUxNikoX3ZhbCkpJjB4MDBmZik8PDgpfFwKLQkJCSgoKCh1MTYpKF92YWwpKSYweGZmMDApPj44KSkKLSNkZWZpbmUgTjJINEJZVEUoX3ZhbCkJKCgoKCh1MzIpKF92YWwpKSYweDAwMDAwMGZmKTw8MjQpfFwKLQkJCSgoKCh1MzIpKF92YWwpKSYweDAwMDBmZjAwKTw8OCkJfFwKLQkJCSgoKCh1MzIpKF92YWwpKSYweDAwZmYwMDAwKT4+OCkJfFwKLQkJCSgoKCh1MzIpKF92YWwpKSYweGZmMDAwMDAwKT4+MjQpKQotI2Vsc2UKLSNkZWZpbmUgTjJIMUJZVEUoX3ZhbCkJCQkoKHU4KShfdmFsKSkKLSNkZWZpbmUgTjJIMkJZVEUoX3ZhbCkJCQkoKHUxNikoX3ZhbCkpCi0jZGVmaW5lIE4ySDRCWVRFKF92YWwpCQkJKCh1MzIpKF92YWwpKQotI2VuZGlmCi0KLS8vCi0vLwlFeGFtcGxlOgotLy8JCUJJVF9MRU5fTUFTS18zMigwKSA9PiAweDAwMDAwMDAwCi0vLwkJQklUX0xFTl9NQVNLXzMyKDEpID0+IDB4MDAwMDAwMDEKLS8vCQlCSVRfTEVOX01BU0tfMzIoMikgPT4gMHgwMDAwMDAwMwotLy8JCUJJVF9MRU5fTUFTS18zMigzMikgPT4gMHhGRkZGRkZGRgotLy8KLSNkZWZpbmUgQklUX0xFTl9NQVNLXzMyKF9fQml0TGVuKSAoMHhGRkZGRkZGRiA+PiAoMzIgLSAoX19CaXRMZW4pKSkKLS8vCi0vLwlFeGFtcGxlOgotLy8JCUJJVF9PRkZTRVRfTEVOX01BU0tfMzIoMCwgMikgPT4gMHgwMDAwMDAwMwotLy8JCUJJVF9PRkZTRVRfTEVOX01BU0tfMzIoMTYsIDIpID0+IDB4MDAwMzAwMDAKLS8vCi0jZGVmaW5lIEJJVF9PRkZTRVRfTEVOX01BU0tfMzIoX19CaXRPZmZzZXQsIF9fQml0TGVuKSAoQklUX0xFTl9NQVNLXzMyKF9fQml0TGVuKSA8PCAoX19CaXRPZmZzZXQpKQotCi0vLwotLy8JRGVzY3JpcHRpb246Ci0vLwkJUmV0dXJuIDQtYnl0ZSB2YWx1ZSBpbiBob3N0IGJ5dGUgb3JkZXJpbmcgZnJvbQotLy8JCTQtYnl0ZSBwb2ludGVyIGluIGxpdHRlbi1lbmRpYW4gc3lzdGVtLgotLy8KLSNkZWZpbmUgTEVfUDRCWVRFX1RPX0hPU1RfNEJZVEUoX19wU3RhcnQpIChFRjRCeXRlKCooKHUzMiAqKShfX3BTdGFydCkpKSkKLQotLy8KLS8vCURlc2NyaXB0aW9uOgotLy8JCVRyYW5zbGF0ZSBzdWJmaWVsZCAoY29udGludW91cyBiaXRzIGluIGxpdHRsZS1lbmRpYW4pIG9mIDQtYnl0ZSB2YWx1ZSBpbiBsaXR0ZW4gYnl0ZSB0bwotLy8JCTQtYnl0ZSB2YWx1ZSBpbiBob3N0IGJ5dGUgb3JkZXJpbmcuCi0vLwotI2RlZmluZSBMRV9CSVRTX1RPXzRCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKLQkoIFwKLQkgICggTEVfUDRCWVRFX1RPX0hPU1RfNEJZVEUoX19wU3RhcnQpID4+IChfX0JpdE9mZnNldCkgKSBcCi0JICAmIFwKLQkgIEJJVF9MRU5fTUFTS18zMihfX0JpdExlbikgXAotCSkKLQotLy8KLS8vCURlc2NyaXB0aW9uOgotLy8JCU1hc2sgc3ViZmllbGQgKGNvbnRpbnVvdXMgYml0cyBpbiBsaXR0bGUtZW5kaWFuKSBvZiA0LWJ5dGUgdmFsdWUgaW4gbGl0dGVuIGJ5dGUgb3JlZGVyaW5nCi0vLwkJYW5kIHJldHVybiB0aGUgcmVzdWx0IGluIDQtYnl0ZSB2YWx1ZSBpbiBob3N0IGJ5dGUgb3JkZXJpbmcuCi0vLwotI2RlZmluZSBMRV9CSVRTX0NMRUFSRURfVE9fNEJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAotCSggXAotCSAgTEVfUDRCWVRFX1RPX0hPU1RfNEJZVEUoX19wU3RhcnQpIFwKLQkgICYgXAotCSAgKCB+QklUX09GRlNFVF9MRU5fTUFTS18zMihfX0JpdE9mZnNldCwgX19CaXRMZW4pICkgXAotCSkKLQotLy8KLS8vCURlc2NyaXB0aW9uOgotLy8JCVNldCBzdWJmaWVsZCBvZiBsaXR0bGUtZW5kaWFuIDQtYnl0ZSB2YWx1ZSB0byBzcGVjaWZpZWQgdmFsdWUuCi0vLwotI2RlZmluZSBTRVRfQklUU19UT19MRV80QllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuLCBfX1ZhbHVlKSBcCi0JKigodTMyICopKF9fcFN0YXJ0KSkgPSBcCi0JRUY0Qnl0ZSggXAotCUxFX0JJVFNfQ0xFQVJFRF9UT180QllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCi0JfCBcCi0JKCAoKCh1MzIpX19WYWx1ZSkgJiBCSVRfTEVOX01BU0tfMzIoX19CaXRMZW4pKSA8PCAoX19CaXRPZmZzZXQpICkgXAotICAgICAgICk7Ci0KLQotI2RlZmluZSBCSVRfTEVOX01BU0tfMTYoX19CaXRMZW4pIFwKLQkoMHhGRkZGID4+ICgxNiAtIChfX0JpdExlbikpKQotCi0jZGVmaW5lIEJJVF9PRkZTRVRfTEVOX01BU0tfMTYoX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCi0JKEJJVF9MRU5fTUFTS18xNihfX0JpdExlbikgPDwgKF9fQml0T2Zmc2V0KSkKLQotI2RlZmluZSBMRV9QMkJZVEVfVE9fSE9TVF8yQllURShfX3BTdGFydCkgXAotCShFRjJCeXRlKCooKHUxNiAqKShfX3BTdGFydCkpKSkKLQotI2RlZmluZSBMRV9CSVRTX1RPXzJCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKLQkoIFwKLQkgICggTEVfUDJCWVRFX1RPX0hPU1RfMkJZVEUoX19wU3RhcnQpID4+IChfX0JpdE9mZnNldCkgKSBcCi0JICAmIFwKLQkgIEJJVF9MRU5fTUFTS18xNihfX0JpdExlbikgXAotCSkKLQotI2RlZmluZSBMRV9CSVRTX0NMRUFSRURfVE9fMkJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAotCSggXAotCSAgTEVfUDJCWVRFX1RPX0hPU1RfMkJZVEUoX19wU3RhcnQpIFwKLQkgICYgXAotCSAgKCB+QklUX09GRlNFVF9MRU5fTUFTS18xNihfX0JpdE9mZnNldCwgX19CaXRMZW4pICkgXAotCSkKLQotI2RlZmluZSBTRVRfQklUU19UT19MRV8yQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuLCBfX1ZhbHVlKSBcCi0JKigodTE2ICopKF9fcFN0YXJ0KSkgPSBcCi0JRUYyQnl0ZSggXAotCQlMRV9CSVRTX0NMRUFSRURfVE9fMkJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAotCQl8IFwKLQkJKCAoKCh1MTYpX19WYWx1ZSkgJiBCSVRfTEVOX01BU0tfMTYoX19CaXRMZW4pKSA8PCAoX19CaXRPZmZzZXQpICkgXAotICAgICAgICk7Ci0KLSNkZWZpbmUgQklUX0xFTl9NQVNLXzgoX19CaXRMZW4pIFwKLQkoMHhGRiA+PiAoOCAtIChfX0JpdExlbikpKQotCi0jZGVmaW5lIEJJVF9PRkZTRVRfTEVOX01BU0tfOChfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKLQkoQklUX0xFTl9NQVNLXzgoX19CaXRMZW4pIDw8IChfX0JpdE9mZnNldCkpCi0KLSNkZWZpbmUgTEVfUDFCWVRFX1RPX0hPU1RfMUJZVEUoX19wU3RhcnQpIFwKLQkoRUYxQnl0ZSgqKCh1OCAqKShfX3BTdGFydCkpKSkKLQotI2RlZmluZSBMRV9CSVRTX1RPXzFCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKLQkoIFwKLQkgICggTEVfUDFCWVRFX1RPX0hPU1RfMUJZVEUoX19wU3RhcnQpID4+IChfX0JpdE9mZnNldCkgKSBcCi0JICAmIFwKLQkgIEJJVF9MRU5fTUFTS184KF9fQml0TGVuKSBcCi0JKQotCi0jZGVmaW5lIExFX0JJVFNfQ0xFQVJFRF9UT18xQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCi0JKCBcCi0JICBMRV9QMUJZVEVfVE9fSE9TVF8xQllURShfX3BTdGFydCkgXAotCSAgJiBcCi0JICAoIH5CSVRfT0ZGU0VUX0xFTl9NQVNLXzgoX19CaXRPZmZzZXQsIF9fQml0TGVuKSApIFwKLQkpCi0KLSNkZWZpbmUgU0VUX0JJVFNfVE9fTEVfMUJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbiwgX19WYWx1ZSkgXAotCSooKHU4ICopKF9fcFN0YXJ0KSkgPSBcCi0JRUYxQnl0ZSggXAotCQlMRV9CSVRTX0NMRUFSRURfVE9fMUJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAotCQl8IFwKLQkJKCAoKCh1OClfX1ZhbHVlKSAmIEJJVF9MRU5fTUFTS184KF9fQml0TGVuKSkgPDwgKF9fQml0T2Zmc2V0KSApIFwKLSAgICAgICApOwotCi0jZW5kaWYgLy8gI2lmbmRlZiBfX0lOQ19FTkRJQU5GUkVFX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYWVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2Flcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmMxMDIzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYWVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotLyoKLSAqIENyeXB0b2dyYXBoaWMgQVBJLgotICoKLSAqIEFFUyBDaXBoZXIgQWxnb3JpdGhtLgotICoKLSAqIEJhc2VkIG9uIEJyaWFuIEdsYWRtYW4ncyBjb2RlLgotICoKLSAqIExpbnV4IGRldmVsb3BlcnM6Ci0gKiAgQWxleGFuZGVyIEtqZWxkYWFzIDxhc3RvckBmYXN0Lm5vPgotICogIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBodnJsYWIub3JnPgotICogIEt5bGUgTWNNYXJ0aW4gPGt5bGVAZGViaWFuLm9yZz4KLSAqICBBZGFtIEouIFJpY2h0ZXIgPGFkYW1AeWdnZHJhc2lsLmNvbT4gKGNvbnZlcnNpb24gdG8gMi41IEFQSSkuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoYykgMjAwMiwgRHIgQnJpYW4gR2xhZG1hbiA8YnJnQGdsYWRtYW4ubWUudWs+LCBXb3JjZXN0ZXIsIFVLLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBMSUNFTlNFIFRFUk1TCi0gKgotICogVGhlIGZyZWUgZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBib3RoIHNvdXJjZSBhbmQgYmluYXJ5Ci0gKiBmb3JtIGlzIGFsbG93ZWQgKHdpdGggb3Igd2l0aG91dCBjaGFuZ2VzKSBwcm92aWRlZCB0aGF0OgotICoKLSAqICAgMS4gZGlzdHJpYnV0aW9ucyBvZiB0aGlzIHNvdXJjZSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXI7Ci0gKgotICogICAyLiBkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqICAgICAgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIGFzc29jaWF0ZWQgbWF0ZXJpYWxzOwotICoKLSAqICAgMy4gdGhlIGNvcHlyaWdodCBob2xkZXIncyBuYW1lIGlzIG5vdCB1c2VkIHRvIGVuZG9yc2UgcHJvZHVjdHMKLSAqICAgICAgYnVpbHQgdXNpbmcgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBTFRFUk5BVElWRUxZLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIGlzIHJldGFpbmVkIGluIGZ1bGwsIHRoaXMgcHJvZHVjdAotICogbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksCi0gKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXBwbHkgSU5TVEVBRCBPRiB0aG9zZSBnaXZlbiBhYm92ZS4KLSAqCi0gKiBESVNDTEFJTUVSCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMgaXMnIHdpdGggbm8gZXhwbGljaXQgb3IgaW1wbGllZCB3YXJyYW50aWVzCi0gKiBpbiByZXNwZWN0IG9mIGl0cyBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgY29ycmVjdG5lc3MKLSAqIGFuZC9vciBmaXRuZXNzIGZvciBwdXJwb3NlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotLyogU29tZSBjaGFuZ2VzIGZyb20gdGhlIEdsYWRtYW4gdmVyc2lvbjoKLSAgICBzL1JJSk5EQUVMKGVfa2V5KS9FX0tFWS9nCi0gICAgcy9SSUpOREFFTChkX2tleSkvRF9LRVkvZwotKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0vLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KLSNpbmNsdWRlICJydGxfY3J5cHRvLmgiCi0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotCi0jZGVmaW5lIEFFU19NSU5fS0VZX1NJWkUJMTYKLSNkZWZpbmUgQUVTX01BWF9LRVlfU0laRQkzMgotCi0jZGVmaW5lIEFFU19CTE9DS19TSVpFCQkxNgotCi1zdGF0aWMgaW5saW5lCi11MzIgZ2VuZXJpY19yb3RyMzIgKGNvbnN0IHUzMiB4LCBjb25zdCB1bnNpZ25lZCBiaXRzKQotewotCWNvbnN0IHVuc2lnbmVkIG4gPSBiaXRzICUgMzI7Ci0JcmV0dXJuICh4ID4+IG4pIHwgKHggPDwgKDMyIC0gbikpOwotfQotCi1zdGF0aWMgaW5saW5lCi11MzIgZ2VuZXJpY19yb3RsMzIgKGNvbnN0IHUzMiB4LCBjb25zdCB1bnNpZ25lZCBiaXRzKQotewotCWNvbnN0IHVuc2lnbmVkIG4gPSBiaXRzICUgMzI7Ci0JcmV0dXJuICh4IDw8IG4pIHwgKHggPj4gKDMyIC0gbikpOwotfQotCi0jZGVmaW5lIHJvdGwgZ2VuZXJpY19yb3RsMzIKLSNkZWZpbmUgcm90ciBnZW5lcmljX3JvdHIzMgotCi0vKgotICogI2RlZmluZSBieXRlKHgsIG5yKSAoKHVuc2lnbmVkIGNoYXIpKCh4KSA+PiAobnIqOCkpKQotICovCi1pbmxpbmUgc3RhdGljIHU4Ci1ieXRlKGNvbnN0IHUzMiB4LCBjb25zdCB1bnNpZ25lZCBuKQotewotCXJldHVybiB4ID4+IChuIDw8IDMpOwotfQotCi0jZGVmaW5lIHUzMl9pbih4KSBsZTMyX3RvX2NwdSgqKGNvbnN0IHUzMiAqKSh4KSkKLSNkZWZpbmUgdTMyX291dCh0bywgZnJvbSkgKCoodTMyICopKHRvKSA9IGNwdV90b19sZTMyKGZyb20pKQotCi1zdHJ1Y3QgYWVzX2N0eCB7Ci0JaW50IGtleV9sZW5ndGg7Ci0JdTMyIEVbNjBdOwotCXUzMiBEWzYwXTsKLX07Ci0KLSNkZWZpbmUgRV9LRVkgY3R4LT5FCi0jZGVmaW5lIERfS0VZIGN0eC0+RAotCi1zdGF0aWMgdTggcG93X3RhYlsyNTZdIF9faW5pdGRhdGE7Ci1zdGF0aWMgdTggbG9nX3RhYlsyNTZdIF9faW5pdGRhdGE7Ci1zdGF0aWMgdTggc2J4X3RhYlsyNTZdIF9faW5pdGRhdGE7Ci1zdGF0aWMgdTggaXNiX3RhYlsyNTZdIF9faW5pdGRhdGE7Ci1zdGF0aWMgdTMyIHJjb190YWJbMTBdOwotc3RhdGljIHUzMiBmdF90YWJbNF1bMjU2XTsKLXN0YXRpYyB1MzIgaXRfdGFiWzRdWzI1Nl07Ci0KLXN0YXRpYyB1MzIgZmxfdGFiWzRdWzI1Nl07Ci1zdGF0aWMgdTMyIGlsX3RhYls0XVsyNTZdOwotCi1zdGF0aWMgaW5saW5lIHU4IF9faW5pdAotZl9tdWx0ICh1OCBhLCB1OCBiKQotewotCXU4IGFhID0gbG9nX3RhYlthXSwgY2MgPSBhYSArIGxvZ190YWJbYl07Ci0KLQlyZXR1cm4gcG93X3RhYltjYyArIChjYyA8IGFhID8gMSA6IDApXTsKLX0KLQotI2RlZmluZSBmZl9tdWx0KGEsYikgICAgKGEgJiYgYiA/IGZfbXVsdChhLCBiKSA6IDApCi0KLSNkZWZpbmUgZl9ybihibywgYmksIG4sIGspCQkJCQlcCi0gICAgYm9bbl0gPSAgZnRfdGFiWzBdW2J5dGUoYmlbbl0sMCldIF4JCQkJXAotCSAgICAgZnRfdGFiWzFdW2J5dGUoYmlbKG4gKyAxKSAmIDNdLDEpXSBeCQlcCi0JICAgICBmdF90YWJbMl1bYnl0ZShiaVsobiArIDIpICYgM10sMildIF4JCVwKLQkgICAgIGZ0X3RhYlszXVtieXRlKGJpWyhuICsgMykgJiAzXSwzKV0gXiAqKGsgKyBuKQotCi0jZGVmaW5lIGlfcm4oYm8sIGJpLCBuLCBrKQkJCQkJXAotICAgIGJvW25dID0gIGl0X3RhYlswXVtieXRlKGJpW25dLDApXSBeCQkJCVwKLQkgICAgIGl0X3RhYlsxXVtieXRlKGJpWyhuICsgMykgJiAzXSwxKV0gXgkJXAotCSAgICAgaXRfdGFiWzJdW2J5dGUoYmlbKG4gKyAyKSAmIDNdLDIpXSBeCQlcCi0JICAgICBpdF90YWJbM11bYnl0ZShiaVsobiArIDEpICYgM10sMyldIF4gKihrICsgbikKLQotI2RlZmluZSBsc19ib3goeCkJCQkJXAotICAgICggZmxfdGFiWzBdW2J5dGUoeCwgMCldIF4JCQlcCi0gICAgICBmbF90YWJbMV1bYnl0ZSh4LCAxKV0gXgkJCVwKLSAgICAgIGZsX3RhYlsyXVtieXRlKHgsIDIpXSBeCQkJXAotICAgICAgZmxfdGFiWzNdW2J5dGUoeCwgMyldICkKLQotI2RlZmluZSBmX3JsKGJvLCBiaSwgbiwgaykJCQkJCVwKLSAgICBib1tuXSA9ICBmbF90YWJbMF1bYnl0ZShiaVtuXSwwKV0gXgkJCQlcCi0JICAgICBmbF90YWJbMV1bYnl0ZShiaVsobiArIDEpICYgM10sMSldIF4JCVwKLQkgICAgIGZsX3RhYlsyXVtieXRlKGJpWyhuICsgMikgJiAzXSwyKV0gXgkJXAotCSAgICAgZmxfdGFiWzNdW2J5dGUoYmlbKG4gKyAzKSAmIDNdLDMpXSBeICooayArIG4pCi0KLSNkZWZpbmUgaV9ybChibywgYmksIG4sIGspCQkJCQlcCi0gICAgYm9bbl0gPSAgaWxfdGFiWzBdW2J5dGUoYmlbbl0sMCldIF4JCQkJXAotCSAgICAgaWxfdGFiWzFdW2J5dGUoYmlbKG4gKyAzKSAmIDNdLDEpXSBeCQlcCi0JICAgICBpbF90YWJbMl1bYnl0ZShiaVsobiArIDIpICYgM10sMildIF4JCVwKLQkgICAgIGlsX3RhYlszXVtieXRlKGJpWyhuICsgMSkgJiAzXSwzKV0gXiAqKGsgKyBuKQotCi1zdGF0aWMgdm9pZCBfX2luaXQKLWdlbl90YWJzICh2b2lkKQotewotCXUzMiBpLCB0OwotCXU4IHAsIHE7Ci0KLQkvKiBsb2cgYW5kIHBvd2VyIHRhYmxlcyBmb3IgR0YoMioqOCkgZmluaXRlIGZpZWxkIHdpdGgKLQkgICAweDAxMWIgYXMgbW9kdWxhciBwb2x5bm9taWFsIC0gdGhlIHNpbXBsZXN0IHByaW1pdGl2ZQotCSAgIHJvb3QgaXMgMHgwMywgdXNlZCBoZXJlIHRvIGdlbmVyYXRlIHRoZSB0YWJsZXMgKi8KLQotCWZvciAoaSA9IDAsIHAgPSAxOyBpIDwgMjU2OyArK2kpIHsKLQkJcG93X3RhYltpXSA9ICh1OCkgcDsKLQkJbG9nX3RhYltwXSA9ICh1OCkgaTsKLQotCQlwIF49IChwIDw8IDEpIF4gKHAgJiAweDgwID8gMHgwMWIgOiAwKTsKLQl9Ci0KLQlsb2dfdGFiWzFdID0gMDsKLQotCWZvciAoaSA9IDAsIHAgPSAxOyBpIDwgMTA7ICsraSkgewotCQlyY29fdGFiW2ldID0gcDsKLQotCQlwID0gKHAgPDwgMSkgXiAocCAmIDB4ODAgPyAweDAxYiA6IDApOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgewotCQlwID0gKGkgPyBwb3dfdGFiWzI1NSAtIGxvZ190YWJbaV1dIDogMCk7Ci0JCXEgPSAoKHAgPj4gNykgfCAocCA8PCAxKSkgXiAoKHAgPj4gNikgfCAocCA8PCAyKSk7Ci0JCXAgXj0gMHg2MyBeIHEgXiAoKHEgPj4gNikgfCAocSA8PCAyKSk7Ci0JCXNieF90YWJbaV0gPSBwOwotCQlpc2JfdGFiW3BdID0gKHU4KSBpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgewotCQlwID0gc2J4X3RhYltpXTsKLQotCQl0ID0gcDsKLQkJZmxfdGFiWzBdW2ldID0gdDsKLQkJZmxfdGFiWzFdW2ldID0gcm90bCAodCwgOCk7Ci0JCWZsX3RhYlsyXVtpXSA9IHJvdGwgKHQsIDE2KTsKLQkJZmxfdGFiWzNdW2ldID0gcm90bCAodCwgMjQpOwotCi0JCXQgPSAoKHUzMikgZmZfbXVsdCAoMiwgcCkpIHwKLQkJICAgICgodTMyKSBwIDw8IDgpIHwKLQkJICAgICgodTMyKSBwIDw8IDE2KSB8ICgodTMyKSBmZl9tdWx0ICgzLCBwKSA8PCAyNCk7Ci0KLQkJZnRfdGFiWzBdW2ldID0gdDsKLQkJZnRfdGFiWzFdW2ldID0gcm90bCAodCwgOCk7Ci0JCWZ0X3RhYlsyXVtpXSA9IHJvdGwgKHQsIDE2KTsKLQkJZnRfdGFiWzNdW2ldID0gcm90bCAodCwgMjQpOwotCi0JCXAgPSBpc2JfdGFiW2ldOwotCi0JCXQgPSBwOwotCQlpbF90YWJbMF1baV0gPSB0OwotCQlpbF90YWJbMV1baV0gPSByb3RsICh0LCA4KTsKLQkJaWxfdGFiWzJdW2ldID0gcm90bCAodCwgMTYpOwotCQlpbF90YWJbM11baV0gPSByb3RsICh0LCAyNCk7Ci0KLQkJdCA9ICgodTMyKSBmZl9tdWx0ICgxNCwgcCkpIHwKLQkJICAgICgodTMyKSBmZl9tdWx0ICg5LCBwKSA8PCA4KSB8Ci0JCSAgICAoKHUzMikgZmZfbXVsdCAoMTMsIHApIDw8IDE2KSB8Ci0JCSAgICAoKHUzMikgZmZfbXVsdCAoMTEsIHApIDw8IDI0KTsKLQotCQlpdF90YWJbMF1baV0gPSB0OwotCQlpdF90YWJbMV1baV0gPSByb3RsICh0LCA4KTsKLQkJaXRfdGFiWzJdW2ldID0gcm90bCAodCwgMTYpOwotCQlpdF90YWJbM11baV0gPSByb3RsICh0LCAyNCk7Ci0JfQotfQotCi0jZGVmaW5lIHN0YXJfeCh4KSAoKCh4KSAmIDB4N2Y3ZjdmN2YpIDw8IDEpIF4gKCgoKHgpICYgMHg4MDgwODA4MCkgPj4gNykgKiAweDFiKQotCi0jZGVmaW5lIGltaXhfY29sKHkseCkgICAgICAgXAotICAgIHUgICA9IHN0YXJfeCh4KTsgICAgICAgIFwKLSAgICB2ICAgPSBzdGFyX3godSk7ICAgICAgICBcCi0gICAgdyAgID0gc3Rhcl94KHYpOyAgICAgICAgXAotICAgIHQgICA9IHcgXiAoeCk7ICAgICAgICAgIFwKLSAgICh5KSAgPSB1IF4gdiBeIHc7ICAgICAgICBcCi0gICAoeSkgXj0gcm90cih1IF4gdCwgIDgpIF4gXAotCSAgcm90cih2IF4gdCwgMTYpIF4gXAotCSAgcm90cih0LDI0KQotCi0vKiBpbml0aWFsaXNlIHRoZSBrZXkgc2NoZWR1bGUgZnJvbSB0aGUgdXNlciBzdXBwbGllZCBrZXkgKi8KLQotI2RlZmluZSBsb29wNChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICB0ID0gcm90cih0LCAgOCk7IHQgPSBsc19ib3godCkgXiByY29fdGFiW2ldOyAgICBcCi0gICAgdCBePSBFX0tFWVs0ICogaV07ICAgICBFX0tFWVs0ICogaSArIDRdID0gdDsgICAgXAotICAgIHQgXj0gRV9LRVlbNCAqIGkgKyAxXTsgRV9LRVlbNCAqIGkgKyA1XSA9IHQ7ICAgIFwKLSAgICB0IF49IEVfS0VZWzQgKiBpICsgMl07IEVfS0VZWzQgKiBpICsgNl0gPSB0OyAgICBcCi0gICAgdCBePSBFX0tFWVs0ICogaSArIDNdOyBFX0tFWVs0ICogaSArIDddID0gdDsgICAgXAotfQotCi0jZGVmaW5lIGxvb3A2KGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgIHQgPSByb3RyKHQsICA4KTsgdCA9IGxzX2JveCh0KSBeIHJjb190YWJbaV07ICAgIFwKLSAgICB0IF49IEVfS0VZWzYgKiBpXTsgICAgIEVfS0VZWzYgKiBpICsgNl0gPSB0OyAgICBcCi0gICAgdCBePSBFX0tFWVs2ICogaSArIDFdOyBFX0tFWVs2ICogaSArIDddID0gdDsgICAgXAotICAgIHQgXj0gRV9LRVlbNiAqIGkgKyAyXTsgRV9LRVlbNiAqIGkgKyA4XSA9IHQ7ICAgIFwKLSAgICB0IF49IEVfS0VZWzYgKiBpICsgM107IEVfS0VZWzYgKiBpICsgOV0gPSB0OyAgICBcCi0gICAgdCBePSBFX0tFWVs2ICogaSArIDRdOyBFX0tFWVs2ICogaSArIDEwXSA9IHQ7ICAgXAotICAgIHQgXj0gRV9LRVlbNiAqIGkgKyA1XTsgRV9LRVlbNiAqIGkgKyAxMV0gPSB0OyAgIFwKLX0KLQotI2RlZmluZSBsb29wOChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICB0ID0gcm90cih0LCAgOCk7IDsgdCA9IGxzX2JveCh0KSBeIHJjb190YWJbaV07ICBcCi0gICAgdCBePSBFX0tFWVs4ICogaV07ICAgICBFX0tFWVs4ICogaSArIDhdID0gdDsgICAgXAotICAgIHQgXj0gRV9LRVlbOCAqIGkgKyAxXTsgRV9LRVlbOCAqIGkgKyA5XSA9IHQ7ICAgIFwKLSAgICB0IF49IEVfS0VZWzggKiBpICsgMl07IEVfS0VZWzggKiBpICsgMTBdID0gdDsgICBcCi0gICAgdCBePSBFX0tFWVs4ICogaSArIDNdOyBFX0tFWVs4ICogaSArIDExXSA9IHQ7ICAgXAotICAgIHQgID0gRV9LRVlbOCAqIGkgKyA0XSBeIGxzX2JveCh0KTsgICAgXAotICAgIEVfS0VZWzggKiBpICsgMTJdID0gdDsgICAgICAgICAgICAgICAgXAotICAgIHQgXj0gRV9LRVlbOCAqIGkgKyA1XTsgRV9LRVlbOCAqIGkgKyAxM10gPSB0OyAgIFwKLSAgICB0IF49IEVfS0VZWzggKiBpICsgNl07IEVfS0VZWzggKiBpICsgMTRdID0gdDsgICBcCi0gICAgdCBePSBFX0tFWVs4ICogaSArIDddOyBFX0tFWVs4ICogaSArIDE1XSA9IHQ7ICAgXAotfQotCi1zdGF0aWMgaW50Ci1hZXNfc2V0X2tleSh2b2lkICpjdHhfYXJnLCBjb25zdCB1OCAqaW5fa2V5LCB1bnNpZ25lZCBpbnQga2V5X2xlbiwgdTMyICpmbGFncykKLXsKLQlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gY3R4X2FyZzsKLQl1MzIgaSwgdCwgdSwgdiwgdzsKLQotCWlmIChrZXlfbGVuICE9IDE2ICYmIGtleV9sZW4gIT0gMjQgJiYga2V5X2xlbiAhPSAzMikgewotCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU47Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWN0eC0+a2V5X2xlbmd0aCA9IGtleV9sZW47Ci0KLQlFX0tFWVswXSA9IHUzMl9pbiAoaW5fa2V5KTsKLQlFX0tFWVsxXSA9IHUzMl9pbiAoaW5fa2V5ICsgNCk7Ci0JRV9LRVlbMl0gPSB1MzJfaW4gKGluX2tleSArIDgpOwotCUVfS0VZWzNdID0gdTMyX2luIChpbl9rZXkgKyAxMik7Ci0KLQlzd2l0Y2ggKGtleV9sZW4pIHsKLQljYXNlIDE2OgotCQl0ID0gRV9LRVlbM107Ci0JCWZvciAoaSA9IDA7IGkgPCAxMDsgKytpKQotCQkJbG9vcDQgKGkpOwotCQlicmVhazsKLQotCWNhc2UgMjQ6Ci0JCUVfS0VZWzRdID0gdTMyX2luIChpbl9rZXkgKyAxNik7Ci0JCXQgPSBFX0tFWVs1XSA9IHUzMl9pbiAoaW5fa2V5ICsgMjApOwotCQlmb3IgKGkgPSAwOyBpIDwgODsgKytpKQotCQkJbG9vcDYgKGkpOwotCQlicmVhazsKLQotCWNhc2UgMzI6Ci0JCUVfS0VZWzRdID0gdTMyX2luIChpbl9rZXkgKyAxNik7Ci0JCUVfS0VZWzVdID0gdTMyX2luIChpbl9rZXkgKyAyMCk7Ci0JCUVfS0VZWzZdID0gdTMyX2luIChpbl9rZXkgKyAyNCk7Ci0JCXQgPSBFX0tFWVs3XSA9IHUzMl9pbiAoaW5fa2V5ICsgMjgpOwotCQlmb3IgKGkgPSAwOyBpIDwgNzsgKytpKQotCQkJbG9vcDggKGkpOwotCQlicmVhazsKLQl9Ci0KLQlEX0tFWVswXSA9IEVfS0VZWzBdOwotCURfS0VZWzFdID0gRV9LRVlbMV07Ci0JRF9LRVlbMl0gPSBFX0tFWVsyXTsKLQlEX0tFWVszXSA9IEVfS0VZWzNdOwotCi0JZm9yIChpID0gNDsgaSA8IGtleV9sZW4gKyAyNDsgKytpKSB7Ci0JCWltaXhfY29sIChEX0tFWVtpXSwgRV9LRVlbaV0pOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBlbmNyeXB0IGEgYmxvY2sgb2YgdGV4dCAqLwotCi0jZGVmaW5lIGZfbnJvdW5kKGJvLCBiaSwgaykgXAotICAgIGZfcm4oYm8sIGJpLCAwLCBrKTsgICAgIFwKLSAgICBmX3JuKGJvLCBiaSwgMSwgayk7ICAgICBcCi0gICAgZl9ybihibywgYmksIDIsIGspOyAgICAgXAotICAgIGZfcm4oYm8sIGJpLCAzLCBrKTsgICAgIFwKLSAgICBrICs9IDQKLQotI2RlZmluZSBmX2xyb3VuZChibywgYmksIGspIFwKLSAgICBmX3JsKGJvLCBiaSwgMCwgayk7ICAgICBcCi0gICAgZl9ybChibywgYmksIDEsIGspOyAgICAgXAotICAgIGZfcmwoYm8sIGJpLCAyLCBrKTsgICAgIFwKLSAgICBmX3JsKGJvLCBiaSwgMywgaykKLQotc3RhdGljIHZvaWQgYWVzX2VuY3J5cHQodm9pZCAqY3R4X2FyZywgdTggKm91dCwgY29uc3QgdTggKmluKQotewotCWNvbnN0IHN0cnVjdCBhZXNfY3R4ICpjdHggPSBjdHhfYXJnOwotCXUzMiBiMFs0XSwgYjFbNF07Ci0JY29uc3QgdTMyICprcCA9IEVfS0VZICsgNDsKLQotCWIwWzBdID0gdTMyX2luIChpbikgXiBFX0tFWVswXTsKLQliMFsxXSA9IHUzMl9pbiAoaW4gKyA0KSBeIEVfS0VZWzFdOwotCWIwWzJdID0gdTMyX2luIChpbiArIDgpIF4gRV9LRVlbMl07Ci0JYjBbM10gPSB1MzJfaW4gKGluICsgMTIpIF4gRV9LRVlbM107Ci0KLQlpZiAoY3R4LT5rZXlfbGVuZ3RoID4gMjQpIHsKLQkJZl9ucm91bmQgKGIxLCBiMCwga3ApOwotCQlmX25yb3VuZCAoYjAsIGIxLCBrcCk7Ci0JfQotCi0JaWYgKGN0eC0+a2V5X2xlbmd0aCA+IDE2KSB7Ci0JCWZfbnJvdW5kIChiMSwgYjAsIGtwKTsKLQkJZl9ucm91bmQgKGIwLCBiMSwga3ApOwotCX0KLQotCWZfbnJvdW5kIChiMSwgYjAsIGtwKTsKLQlmX25yb3VuZCAoYjAsIGIxLCBrcCk7Ci0JZl9ucm91bmQgKGIxLCBiMCwga3ApOwotCWZfbnJvdW5kIChiMCwgYjEsIGtwKTsKLQlmX25yb3VuZCAoYjEsIGIwLCBrcCk7Ci0JZl9ucm91bmQgKGIwLCBiMSwga3ApOwotCWZfbnJvdW5kIChiMSwgYjAsIGtwKTsKLQlmX25yb3VuZCAoYjAsIGIxLCBrcCk7Ci0JZl9ucm91bmQgKGIxLCBiMCwga3ApOwotCWZfbHJvdW5kIChiMCwgYjEsIGtwKTsKLQotCXUzMl9vdXQgKG91dCwgYjBbMF0pOwotCXUzMl9vdXQgKG91dCArIDQsIGIwWzFdKTsKLQl1MzJfb3V0IChvdXQgKyA4LCBiMFsyXSk7Ci0JdTMyX291dCAob3V0ICsgMTIsIGIwWzNdKTsKLX0KLQotLyogZGVjcnlwdCBhIGJsb2NrIG9mIHRleHQgKi8KLQotI2RlZmluZSBpX25yb3VuZChibywgYmksIGspIFwKLSAgICBpX3JuKGJvLCBiaSwgMCwgayk7ICAgICBcCi0gICAgaV9ybihibywgYmksIDEsIGspOyAgICAgXAotICAgIGlfcm4oYm8sIGJpLCAyLCBrKTsgICAgIFwKLSAgICBpX3JuKGJvLCBiaSwgMywgayk7ICAgICBcCi0gICAgayAtPSA0Ci0KLSNkZWZpbmUgaV9scm91bmQoYm8sIGJpLCBrKSBcCi0gICAgaV9ybChibywgYmksIDAsIGspOyAgICAgXAotICAgIGlfcmwoYm8sIGJpLCAxLCBrKTsgICAgIFwKLSAgICBpX3JsKGJvLCBiaSwgMiwgayk7ICAgICBcCi0gICAgaV9ybChibywgYmksIDMsIGspCi0KLXN0YXRpYyB2b2lkIGFlc19kZWNyeXB0KHZvaWQgKmN0eF9hcmcsIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKLXsKLQljb25zdCBzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gY3R4X2FyZzsKLQl1MzIgYjBbNF0sIGIxWzRdOwotCWNvbnN0IGludCBrZXlfbGVuID0gY3R4LT5rZXlfbGVuZ3RoOwotCWNvbnN0IHUzMiAqa3AgPSBEX0tFWSArIGtleV9sZW4gKyAyMDsKLQotCWIwWzBdID0gdTMyX2luIChpbikgXiBFX0tFWVtrZXlfbGVuICsgMjRdOwotCWIwWzFdID0gdTMyX2luIChpbiArIDQpIF4gRV9LRVlba2V5X2xlbiArIDI1XTsKLQliMFsyXSA9IHUzMl9pbiAoaW4gKyA4KSBeIEVfS0VZW2tleV9sZW4gKyAyNl07Ci0JYjBbM10gPSB1MzJfaW4gKGluICsgMTIpIF4gRV9LRVlba2V5X2xlbiArIDI3XTsKLQotCWlmIChrZXlfbGVuID4gMjQpIHsKLQkJaV9ucm91bmQgKGIxLCBiMCwga3ApOwotCQlpX25yb3VuZCAoYjAsIGIxLCBrcCk7Ci0JfQotCi0JaWYgKGtleV9sZW4gPiAxNikgewotCQlpX25yb3VuZCAoYjEsIGIwLCBrcCk7Ci0JCWlfbnJvdW5kIChiMCwgYjEsIGtwKTsKLQl9Ci0KLQlpX25yb3VuZCAoYjEsIGIwLCBrcCk7Ci0JaV9ucm91bmQgKGIwLCBiMSwga3ApOwotCWlfbnJvdW5kIChiMSwgYjAsIGtwKTsKLQlpX25yb3VuZCAoYjAsIGIxLCBrcCk7Ci0JaV9ucm91bmQgKGIxLCBiMCwga3ApOwotCWlfbnJvdW5kIChiMCwgYjEsIGtwKTsKLQlpX25yb3VuZCAoYjEsIGIwLCBrcCk7Ci0JaV9ucm91bmQgKGIwLCBiMSwga3ApOwotCWlfbnJvdW5kIChiMSwgYjAsIGtwKTsKLQlpX2xyb3VuZCAoYjAsIGIxLCBrcCk7Ci0KLQl1MzJfb3V0IChvdXQsIGIwWzBdKTsKLQl1MzJfb3V0IChvdXQgKyA0LCBiMFsxXSk7Ci0JdTMyX291dCAob3V0ICsgOCwgYjBbMl0pOwotCXUzMl9vdXQgKG91dCArIDEyLCBiMFszXSk7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGFlc19hbGcgPSB7Ci0JLmNyYV9uYW1lCQk9CSJhZXMiLAotCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKLQkuY3JhX2Jsb2Nrc2l6ZQkJPQlBRVNfQkxPQ0tfU0laRSwKLQkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBhZXNfY3R4KSwKLQkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKLQkuY3JhX2xpc3QJCT0JTElTVF9IRUFEX0lOSVQoYWVzX2FsZy5jcmFfbGlzdCksCi0JLmNyYV91CQkJPQl7Ci0JCS5jaXBoZXIgPSB7Ci0JCQkuY2lhX21pbl9rZXlzaXplCT0JQUVTX01JTl9LRVlfU0laRSwKLQkJCS5jaWFfbWF4X2tleXNpemUJPQlBRVNfTUFYX0tFWV9TSVpFLAotCQkJLmNpYV9zZXRrZXkJCT0JYWVzX3NldF9rZXksCi0JCQkuY2lhX2VuY3J5cHQJCT0JYWVzX2VuY3J5cHQsCi0JCQkuY2lhX2RlY3J5cHQJCT0JYWVzX2RlY3J5cHQKLQkJfQotCX0KLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFlc19pbml0KHZvaWQpCi17Ci0JZ2VuX3RhYnMoKTsKLQlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX2FsZygmYWVzX2FsZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhZXNfZmluaSh2b2lkKQotewotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmYWVzX2FsZyk7Ci19Ci0KLW1vZHVsZV9pbml0KGFlc19pbml0KTsKLW1vZHVsZV9leGl0KGFlc19maW5pKTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJSaWpuZGFlbCAoQUVTKSBDaXBoZXIgQWxnb3JpdGhtIik7Ci1NT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2FyYzQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYXJjNC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzkwZTlhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYXJjNC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDcnlwdG9ncmFwaGljIEFQSQotICoKLSAqIEFSQzQgQ2lwaGVyIEFsZ29yaXRobQotICoKLSAqIEpvbiBPYmVyaGVpZGUgPGpvbkBvYmVyaGVpZGUub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKLQotI2RlZmluZSBBUkM0X01JTl9LRVlfU0laRQkxCi0jZGVmaW5lIEFSQzRfTUFYX0tFWV9TSVpFCTI1NgotI2RlZmluZSBBUkM0X0JMT0NLX1NJWkUJCTEKLQotc3RydWN0IGFyYzRfY3R4IHsKLQl1OCBTWzI1Nl07Ci0JdTggeCwgeTsKLX07Ci0KLXN0YXRpYyBpbnQgYXJjNF9zZXRfa2V5KHZvaWQgKmN0eF9hcmcsIGNvbnN0IHU4ICppbl9rZXksIHVuc2lnbmVkIGludCBrZXlfbGVuLCB1MzIgKmZsYWdzKQotewotCXN0cnVjdCBhcmM0X2N0eCAqY3R4ID0gY3R4X2FyZzsKLQlpbnQgaSwgaiA9IDAsIGsgPSAwOwotCi0JY3R4LT54ID0gMTsKLQljdHgtPnkgPSAwOwotCi0JZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCWN0eC0+U1tpXSA9IGk7Ci0KLQlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKLQl7Ci0JCXU4IGEgPSBjdHgtPlNbaV07Ci0JCWogPSAoaiArIGluX2tleVtrXSArIGEpICYgMHhmZjsKLQkJY3R4LT5TW2ldID0gY3R4LT5TW2pdOwotCQljdHgtPlNbal0gPSBhOwotCQlpZigodW5zaWduZWQgaW50KSsrayA+PSBrZXlfbGVuKQotCQkJayA9IDA7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGFyYzRfY3J5cHQodm9pZCAqY3R4X2FyZywgdTggKm91dCwgY29uc3QgdTggKmluKQotewotCXN0cnVjdCBhcmM0X2N0eCAqY3R4ID0gY3R4X2FyZzsKLQotCXU4ICpjb25zdCBTID0gY3R4LT5TOwotCXU4IHggPSBjdHgtPng7Ci0JdTggeSA9IGN0eC0+eTsKLQl1OCBhLCBiOwotCi0JYSA9IFNbeF07Ci0JeSA9ICh5ICsgYSkgJiAweGZmOwotCWIgPSBTW3ldOwotCVNbeF0gPSBiOwotCVNbeV0gPSBhOwotCXggPSAoeCArIDEpICYgMHhmZjsKLQkqb3V0KysgPSAqaW4gXiBTWyhhICsgYikgJiAweGZmXTsKLQotCWN0eC0+eCA9IHg7Ci0JY3R4LT55ID0geTsKLX0KLQotc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGFyYzRfYWxnID0gewotCS5jcmFfbmFtZQkJPQkiYXJjNCIsCi0JLmNyYV9mbGFncwkJPQlDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAotCS5jcmFfYmxvY2tzaXplCQk9CUFSQzRfQkxPQ0tfU0laRSwKLQkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBhcmM0X2N0eCksCi0JLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCi0JLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGFyYzRfYWxnLmNyYV9saXN0KSwKLQkuY3JhX3UJCQk9CXsgLmNpcGhlciA9IHsKLQkuY2lhX21pbl9rZXlzaXplCT0JQVJDNF9NSU5fS0VZX1NJWkUsCi0JLmNpYV9tYXhfa2V5c2l6ZQk9CUFSQzRfTUFYX0tFWV9TSVpFLAotCS5jaWFfc2V0a2V5CQk9CWFyYzRfc2V0X2tleSwKLQkuY2lhX2VuY3J5cHQJCT0JYXJjNF9jcnlwdCwKLQkuY2lhX2RlY3J5cHQJCT0JYXJjNF9jcnlwdCB9IH0KLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFyYzRfaW5pdCh2b2lkKQotewotCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZhcmM0X2FsZyk7Ci19Ci0KLQotc3RhdGljIHZvaWQgX19leGl0IGFyYzRfZXhpdCh2b2lkKQotewotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmYXJjNF9hbGcpOwotfQotCi1tb2R1bGVfaW5pdChhcmM0X2luaXQpOwotbW9kdWxlX2V4aXQoYXJjNF9leGl0KTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBUkM0IENpcGhlciBBbGdvcml0aG0iKTsKLU1PRFVMRV9BVVRIT1IoIkpvbiBPYmVyaGVpZGUgPGpvbkBvYmVyaGVpZGUub3JnPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hdXRvbG9hZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hdXRvbG9hZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTc3NTZmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYXV0b2xvYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDcnlwdG9ncmFwaGljIEFQSS4KLSAqCi0gKiBBbGdvcml0aG0gYXV0b2xvYWRlci4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLSNpbmNsdWRlICJrbWFwX3R5cGVzLmgiCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLS8vI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgotI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9rbW9kLmg+Ci0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotLyoKLSAqIEEgZmFyIG1vcmUgaW50ZWxsaWdlbnQgdmVyc2lvbiBvZiB0aGlzIGlzIHBsYW5uZWQuICBGb3Igbm93LCBqdXN0Ci0gKiB0cnkgYW4gZXhhY3QgbWF0Y2ggb24gdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobS4KLSAqLwotdm9pZCBjcnlwdG9fYWxnX2F1dG9sb2FkKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JcmVxdWVzdF9tb2R1bGUobmFtZSk7Ci19Ci0KLXN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX21vZF9sb29rdXAoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnID0gY3J5cHRvX2FsZ19sb29rdXAobmFtZSk7Ci0JaWYgKGFsZyA9PSBOVUxMKSB7Ci0JCWNyeXB0b19hbGdfYXV0b2xvYWQobmFtZSk7Ci0JCWFsZyA9IGNyeXB0b19hbGdfbG9va3VwKG5hbWUpOwotCX0KLQlyZXR1cm4gYWxnOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jaXBoZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY2lwaGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NzM0NWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jaXBoZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKgotICogQ3J5cHRvZ3JhcGhpYyBBUEkuCi0gKgotICogQ2lwaGVyIG9wZXJhdGlvbnMuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0vLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KLSNpbmNsdWRlICJydGxfY3J5cHRvLmgiCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotI2luY2x1ZGUgInNjYXR0ZXJ3YWxrLmgiCi0KLXR5cGVkZWYgdm9pZCAoY3J5cHRmbl90KSh2b2lkICosIHU4ICosIGNvbnN0IHU4ICopOwotdHlwZWRlZiB2b2lkIChwcm9jZm5fdCkoc3RydWN0IGNyeXB0b190Zm0gKiwgdTggKiwKLQkJCXU4KiwgY3J5cHRmbl90LCBpbnQgZW5jLCB2b2lkICosIGludCk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB4b3JfNjQodTggKmEsIGNvbnN0IHU4ICpiKQotewotCSgodTMyICopYSlbMF0gXj0gKCh1MzIgKiliKVswXTsKLQkoKHUzMiAqKWEpWzFdIF49ICgodTMyICopYilbMV07Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB4b3JfMTI4KHU4ICphLCBjb25zdCB1OCAqYikKLXsKLQkoKHUzMiAqKWEpWzBdIF49ICgodTMyICopYilbMF07Ci0JKCh1MzIgKilhKVsxXSBePSAoKHUzMiAqKWIpWzFdOwotCSgodTMyICopYSlbMl0gXj0gKCh1MzIgKiliKVsyXTsKLQkoKHUzMiAqKWEpWzNdIF49ICgodTMyICopYilbM107Ci19Ci0KLQotLyoKLSAqIEdlbmVyaWMgZW5jcnlwdC9kZWNyeXB0IHdyYXBwZXIgZm9yIGNpcGhlcnMsIGhhbmRsZXMgb3BlcmF0aW9ucyBhY3Jvc3MKLSAqIG11bHRpcGxlIHBhZ2UgYm91bmRhcmllcyBieSB1c2luZyB0ZW1wb3JhcnkgYmxvY2tzLiAgSW4gdXNlciBjb250ZXh0LAotICogdGhlIGtlcm5lbCBpcyBnaXZlbiBhIGNoYW5jZSB0byBzY2hlZHVsZSB1cyBvbmNlIHBlciBibG9jay4KLSAqLwotc3RhdGljIGludCBjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJIHVuc2lnbmVkIGludCBuYnl0ZXMsIGNyeXB0Zm5fdCBjcmZuLAotCQkgcHJvY2ZuX3QgcHJmbiwgaW50IGVuYywgdm9pZCAqaW5mbykKLXsKLQlzdHJ1Y3Qgc2NhdHRlcl93YWxrIHdhbGtfaW4sIHdhbGtfb3V0OwotCWNvbnN0IHVuc2lnbmVkIGludCBic2l6ZSA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pOwotCXU4IHRtcF9zcmNbYnNpemVdOwotCXU4IHRtcF9kc3RbYnNpemVdOwotCi0JaWYgKCFuYnl0ZXMpCi0JCXJldHVybiAwOwotCi0JaWYgKG5ieXRlcyAlIGJzaXplKSB7Ci0JCXRmbS0+Y3J0X2ZsYWdzIHw9IENSWVBUT19URk1fUkVTX0JBRF9CTE9DS19MRU47Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXNjYXR0ZXJ3YWxrX3N0YXJ0KCZ3YWxrX2luLCBzcmMpOwotCXNjYXR0ZXJ3YWxrX3N0YXJ0KCZ3YWxrX291dCwgZHN0KTsKLQotCWZvcig7OykgewotCQl1OCAqc3JjX3AsICpkc3RfcDsKLQkJaW50IGluX3BsYWNlOwotCi0JCXNjYXR0ZXJ3YWxrX21hcCgmd2Fsa19pbik7Ci0JCXNjYXR0ZXJ3YWxrX21hcCgmd2Fsa19vdXQpOwotCQlzcmNfcCA9IHNjYXR0ZXJ3YWxrX3doaWNoYnVmKCZ3YWxrX2luLCBic2l6ZSwgdG1wX3NyYyk7Ci0JCWRzdF9wID0gc2NhdHRlcndhbGtfd2hpY2hidWYoJndhbGtfb3V0LCBic2l6ZSwgdG1wX2RzdCk7Ci0JCWluX3BsYWNlID0gc2NhdHRlcndhbGtfc2FtZWJ1Zigmd2Fsa19pbiwgJndhbGtfb3V0LAotCQkJCQkgICAgICAgc3JjX3AsIGRzdF9wKTsKLQotCQluYnl0ZXMgLT0gYnNpemU7Ci0KLQkJc2NhdHRlcndhbGtfY29weWNodW5rcyhzcmNfcCwgJndhbGtfaW4sIGJzaXplLCAwKTsKLQotCQlwcmZuKHRmbSwgZHN0X3AsIHNyY19wLCBjcmZuLCBlbmMsIGluZm8sIGluX3BsYWNlKTsKLQotCQlzY2F0dGVyd2Fsa19kb25lKCZ3YWxrX2luLCBuYnl0ZXMpOwotCi0JCXNjYXR0ZXJ3YWxrX2NvcHljaHVua3MoZHN0X3AsICZ3YWxrX291dCwgYnNpemUsIDEpOwotCQlzY2F0dGVyd2Fsa19kb25lKCZ3YWxrX291dCwgbmJ5dGVzKTsKLQotCQlpZiAoIW5ieXRlcykKLQkJCXJldHVybiAwOwotCi0JCWNyeXB0b195aWVsZCh0Zm0pOwotCX0KLX0KLQotc3RhdGljIHZvaWQgY2JjX3Byb2Nlc3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgdTggKnNyYywKLQkJCWNyeXB0Zm5fdCBmbiwgaW50IGVuYywgdm9pZCAqaW5mbywgaW50IGluX3BsYWNlKQotewotCXU4ICppdiA9IGluZm87Ci0KLQkvKiBOdWxsIGVuY3J5cHRpb24gKi8KLQlpZiAoIWl2KQotCQlyZXR1cm47Ci0KLQlpZiAoZW5jKSB7Ci0JCXRmbS0+Y3J0X3UuY2lwaGVyLmNpdF94b3JfYmxvY2soaXYsIHNyYyk7Ci0JCWZuKGNyeXB0b190Zm1fY3R4KHRmbSksIGRzdCwgaXYpOwotCQltZW1jcHkoaXYsIGRzdCwgY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSkpOwotCX0gZWxzZSB7Ci0JCXU4IHN0YWNrW2luX3BsYWNlID8gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSkgOiAwXTsKLQkJdTggKmJ1ZiA9IGluX3BsYWNlID8gc3RhY2sgOiBkc3Q7Ci0KLQkJZm4oY3J5cHRvX3RmbV9jdHgodGZtKSwgYnVmLCBzcmMpOwotCQl0Zm0tPmNydF91LmNpcGhlci5jaXRfeG9yX2Jsb2NrKGJ1ZiwgaXYpOwotCQltZW1jcHkoaXYsIHNyYywgY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSkpOwotCQlpZiAoYnVmICE9IGRzdCkKLQkJCW1lbWNweShkc3QsIGJ1ZiwgY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSkpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZWNiX3Byb2Nlc3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgdTggKnNyYywKLQkJCWNyeXB0Zm5fdCBmbiwgaW50IGVuYywgdm9pZCAqaW5mbywgaW50IGluX3BsYWNlKQotewotCWZuKGNyeXB0b190Zm1fY3R4KHRmbSksIGRzdCwgc3JjKTsKLX0KLQotc3RhdGljIGludCBzZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKLXsKLQlzdHJ1Y3QgY2lwaGVyX2FsZyAqY2lhID0gJnRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyOwotCi0JaWYgKGtleWxlbiA8IGNpYS0+Y2lhX21pbl9rZXlzaXplIHx8IGtleWxlbiA+IGNpYS0+Y2lhX21heF9rZXlzaXplKSB7Ci0JCXRmbS0+Y3J0X2ZsYWdzIHw9IENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9IGVsc2UKLQkJcmV0dXJuIGNpYS0+Y2lhX3NldGtleShjcnlwdG9fdGZtX2N0eCh0Zm0pLCBrZXksIGtleWxlbiwKLQkJCQkgICAgICAgJnRmbS0+Y3J0X2ZsYWdzKTsKLX0KLQotc3RhdGljIGludCBlY2JfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAotCQkgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9lbmNyeXB0LAotCQkgICAgIGVjYl9wcm9jZXNzLCAxLCBOVUxMKTsKLX0KLQotc3RhdGljIGludCBlY2JfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCi17Ci0JcmV0dXJuIGNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywKLQkJICAgICB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZGVjcnlwdCwKLQkJICAgICBlY2JfcHJvY2VzcywgMSwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBpbnQgY2JjX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCXJldHVybiBjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsCi0JCSAgICAgdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2VuY3J5cHQsCi0JCSAgICAgY2JjX3Byb2Nlc3MsIDEsIHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYpOwotfQotCi1zdGF0aWMgaW50IGNiY19lbmNyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJCSAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQotewotCXJldHVybiBjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsCi0JCSAgICAgdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2VuY3J5cHQsCi0JCSAgICAgY2JjX3Byb2Nlc3MsIDEsIGl2KTsKLX0KLQotc3RhdGljIGludCBjYmNfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCi17Ci0JcmV0dXJuIGNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywKLQkJICAgICB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZGVjcnlwdCwKLQkJICAgICBjYmNfcHJvY2VzcywgMCwgdGZtLT5jcnRfY2lwaGVyLmNpdF9pdik7Ci19Ci0KLXN0YXRpYyBpbnQgY2JjX2RlY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkJICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCi17Ci0JcmV0dXJuIGNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywKLQkJICAgICB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZGVjcnlwdCwKLQkJICAgICBjYmNfcHJvY2VzcywgMCwgaXYpOwotfQotCi1zdGF0aWMgaW50IG5vY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCXJldHVybiAtRU5PU1lTOwotfQotCi1zdGF0aWMgaW50IG5vY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLWludCBjcnlwdG9faW5pdF9jaXBoZXJfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKQotewotCXUzMiBtb2RlID0gZmxhZ3MgJiBDUllQVE9fVEZNX01PREVfTUFTSzsKLQotCXRmbS0+Y3J0X2NpcGhlci5jaXRfbW9kZSA9IG1vZGUgPyBtb2RlIDogQ1JZUFRPX1RGTV9NT0RFX0VDQjsKLQlpZiAoZmxhZ3MgJiBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSkKLQkJdGZtLT5jcnRfZmxhZ3MgPSBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgY3J5cHRvX2luaXRfY2lwaGVyX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBjaXBoZXJfdGZtICpvcHMgPSAmdGZtLT5jcnRfY2lwaGVyOwotCi0Jb3BzLT5jaXRfc2V0a2V5ID0gc2V0a2V5OwotCi0Jc3dpdGNoICh0Zm0tPmNydF9jaXBoZXIuY2l0X21vZGUpIHsKLQljYXNlIENSWVBUT19URk1fTU9ERV9FQ0I6Ci0JCW9wcy0+Y2l0X2VuY3J5cHQgPSBlY2JfZW5jcnlwdDsKLQkJb3BzLT5jaXRfZGVjcnlwdCA9IGVjYl9kZWNyeXB0OwotCQlicmVhazsKLQotCWNhc2UgQ1JZUFRPX1RGTV9NT0RFX0NCQzoKLQkJb3BzLT5jaXRfZW5jcnlwdCA9IGNiY19lbmNyeXB0OwotCQlvcHMtPmNpdF9kZWNyeXB0ID0gY2JjX2RlY3J5cHQ7Ci0JCW9wcy0+Y2l0X2VuY3J5cHRfaXYgPSBjYmNfZW5jcnlwdF9pdjsKLQkJb3BzLT5jaXRfZGVjcnlwdF9pdiA9IGNiY19kZWNyeXB0X2l2OwotCQlicmVhazsKLQotCWNhc2UgQ1JZUFRPX1RGTV9NT0RFX0NGQjoKLQkJb3BzLT5jaXRfZW5jcnlwdCA9IG5vY3J5cHQ7Ci0JCW9wcy0+Y2l0X2RlY3J5cHQgPSBub2NyeXB0OwotCQlvcHMtPmNpdF9lbmNyeXB0X2l2ID0gbm9jcnlwdF9pdjsKLQkJb3BzLT5jaXRfZGVjcnlwdF9pdiA9IG5vY3J5cHRfaXY7Ci0JCWJyZWFrOwotCi0JY2FzZSBDUllQVE9fVEZNX01PREVfQ1RSOgotCQlvcHMtPmNpdF9lbmNyeXB0ID0gbm9jcnlwdDsKLQkJb3BzLT5jaXRfZGVjcnlwdCA9IG5vY3J5cHQ7Ci0JCW9wcy0+Y2l0X2VuY3J5cHRfaXYgPSBub2NyeXB0X2l2OwotCQlvcHMtPmNpdF9kZWNyeXB0X2l2ID0gbm9jcnlwdF9pdjsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci0KLQlpZiAob3BzLT5jaXRfbW9kZSA9PSBDUllQVE9fVEZNX01PREVfQ0JDKSB7Ci0KLQkJc3dpdGNoIChjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSkgewotCQljYXNlIDg6Ci0JCQlvcHMtPmNpdF94b3JfYmxvY2sgPSB4b3JfNjQ7Ci0JCQlicmVhazsKLQotCQljYXNlIDE2OgotCQkJb3BzLT5jaXRfeG9yX2Jsb2NrID0geG9yXzEyODsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogYmxvY2sgc2l6ZSAldSBub3Qgc3VwcG9ydGVkXG4iLAotCQkJICAgICAgIGNyeXB0b190Zm1fYWxnX25hbWUodGZtKSwKLQkJCSAgICAgICBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlvcHMtPmNpdF9pdnNpemUgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKTsKLQkJb3BzLT5jaXRfaXYgPSBrbWFsbG9jKG9wcy0+Y2l0X2l2c2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChvcHMtPmNpdF9pdiA9PSBOVUxMKQotCQkJcmV0ID0gLUVOT01FTTsKLQl9Ci0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGNyeXB0b19leGl0X2NpcGhlcl9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlrZnJlZSh0Zm0tPmNydF9jaXBoZXIuY2l0X2l2KTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY29tcHJlc3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY29tcHJlc3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQxNmFiNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2NvbXByZXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ3J5cHRvZ3JhcGhpYyBBUEkuCi0gKgotICogQ29tcHJlc3Npb24gb3BlcmF0aW9ucy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotLyojaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+Ki8KLSNpbmNsdWRlICJydGxfY3J5cHRvLmgiCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgImludGVybmFsLmgiCi0KLXN0YXRpYyBpbnQgY3J5cHRvX2NvbXByZXNzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCi0JCQkgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKQotewotCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NvbXByZXNzLmNvYV9jb21wcmVzcyhjcnlwdG9fdGZtX2N0eCh0Zm0pLAotCQkJCQkJCSBzcmMsIHNsZW4sIGRzdCwKLQkJCQkJCQkgZGxlbik7Ci19Ci0KLXN0YXRpYyBpbnQgY3J5cHRvX2RlY29tcHJlc3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCSAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCi0JCQkgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbikKLXsKLQlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9jb21wcmVzcy5jb2FfZGVjb21wcmVzcyhjcnlwdG9fdGZtX2N0eCh0Zm0pLAotCQkJCQkJCSAgIHNyYywgc2xlbiwgZHN0LAotCQkJCQkJCSAgIGRsZW4pOwotfQotCi1pbnQgY3J5cHRvX2luaXRfY29tcHJlc3NfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKQotewotCXJldHVybiBmbGFncyA/IC1FSU5WQUwgOiAwOwotfQotCi1pbnQgY3J5cHRvX2luaXRfY29tcHJlc3Nfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGNvbXByZXNzX3RmbSAqb3BzID0gJnRmbS0+Y3J0X2NvbXByZXNzOwotCi0JcmV0ID0gdGZtLT5fX2NydF9hbGctPmNyYV9jb21wcmVzcy5jb2FfaW5pdChjcnlwdG9fdGZtX2N0eCh0Zm0pKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQotCW9wcy0+Y290X2NvbXByZXNzID0gY3J5cHRvX2NvbXByZXNzOwotCW9wcy0+Y290X2RlY29tcHJlc3MgPSBjcnlwdG9fZGVjb21wcmVzczsKLQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgY3J5cHRvX2V4aXRfY29tcHJlc3Nfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JdGZtLT5fX2NydF9hbGctPmNyYV9jb21wcmVzcy5jb2FfZXhpdChjcnlwdG9fdGZtX2N0eCh0Zm0pKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY3J5cHRvX2NvbXBhdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jcnlwdG9fY29tcGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYTM3NGEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jcnlwdG9fY29tcGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogSGVhZGVyIGZpbGUgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSBhbW9uZyBkaWZmZXJlbnQga2VybmVsIHZlcnNpb25zLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2ICA8bGF3cmVuY2Vfd2FuZ0ByZWFsc2lsLmNvbS5jbj4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgotICogbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KLQotc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJCQkJdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwotCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2VuY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7Ci0JcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZGVjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMpOwotfQotCi0gc3RydWN0IGNyeXB0b190Zm0gKmNyeXB0b19hbGxvY190Zm0oY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKQotewotCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBOVUxMOwotCWludCBlcnI7Ci0JcHJpbnRrKCJjYWxsIGNyeXB0b19hbGxvY190Zm0hISFcbiIpOwotCWRvIHsKLQkJc3RydWN0IGNyeXB0b19hbGcgKmFsZzsKLQotCQlhbGcgPSBjcnlwdG9fYWxnX21vZF9sb29rdXAobmFtZSwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7Ci0JCWVyciA9IFBUUl9FUlIoYWxnKTsKLQkJaWYgKElTX0VSUihhbGcpKQotCQkJY29udGludWU7Ci0KLQkJdGZtID0gX19jcnlwdG9fYWxsb2NfdGZtKGFsZywgZmxhZ3MpOwotCQllcnIgPSAwOwotCQlpZiAoSVNfRVJSKHRmbSkpIHsKLQkJCWNyeXB0b19tb2RfcHV0KGFsZyk7Ci0JCQllcnIgPSBQVFJfRVJSKHRmbSk7Ci0JCQl0Zm0gPSBOVUxMOwotCQl9Ci0JfSB3aGlsZSAoZXJyID09IC1FQUdBSU4gJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKTsKLQotCXJldHVybiB0Zm07Ci19Ci0vL0VYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19hbGxvY190Zm0pOwotLy9FWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fZnJlZV90Zm0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kaWdlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZGlnZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZTc0OTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kaWdlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogQ3J5cHRvZ3JhcGhpYyBBUEkuCi0gKgotICogRGlnZXN0IG9wZXJhdGlvbnMuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0vLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KLSNpbmNsdWRlICJydGxfY3J5cHRvLmgiCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KLSNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi1zdGF0aWMgdm9pZCBpbml0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX2luaXQoY3J5cHRvX3RmbV9jdHgodGZtKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnKQotewotCXVuc2lnbmVkIGludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IG5zZzsgaSsrKSB7Ci0KLQkJc3RydWN0IHBhZ2UgKnBnID0gc2dbaV0ucGFnZTsKLQkJdW5zaWduZWQgaW50IG9mZnNldCA9IHNnW2ldLm9mZnNldDsKLQkJdW5zaWduZWQgaW50IGwgPSBzZ1tpXS5sZW5ndGg7Ci0KLQkJZG8gewotCQkJdW5zaWduZWQgaW50IGJ5dGVzX2Zyb21fcGFnZSA9IG1pbihsLCAoKHVuc2lnbmVkIGludCkKLQkJCQkJCQkgICAoUEFHRV9TSVpFKSkgLQotCQkJCQkJCSAgIG9mZnNldCk7Ci0JCQljaGFyICpwID0ga21hcF9hdG9taWMocGcpICsgb2Zmc2V0OwotCi0JCQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfdXBkYXRlCi0JCQkJCShjcnlwdG9fdGZtX2N0eCh0Zm0pLCBwLAotCQkJCQkgYnl0ZXNfZnJvbV9wYWdlKTsKLQkJCWt1bm1hcF9hdG9taWMocCk7Ci0JCQljcnlwdG9feWllbGQodGZtKTsKLQkJCW9mZnNldCA9IDA7Ci0JCQlwZysrOwotCQkJbCAtPSBieXRlc19mcm9tX3BhZ2U7Ci0JCX0gd2hpbGUgKGwgPiAwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpCi17Ci0JdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX2ZpbmFsKGNyeXB0b190Zm1fY3R4KHRmbSksIG91dCk7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCi17Ci0JdTMyIGZsYWdzOwotCWlmICh0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfc2V0a2V5ID09IE5VTEwpCi0JCXJldHVybiAtRU5PU1lTOwotCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfc2V0a2V5KGNyeXB0b190Zm1fY3R4KHRmbSksCi0JCQkJCQkgICAgIGtleSwga2V5bGVuLCAmZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBkaWdlc3Qoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZywgdTggKm91dCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCXRmbS0+Y3J0X2RpZ2VzdC5kaXRfaW5pdCh0Zm0pOwotCi0JZm9yIChpID0gMDsgaSA8IG5zZzsgaSsrKSB7Ci0JCWNoYXIgKnAgPSBrbWFwX2F0b21pYyhzZ1tpXS5wYWdlKSArIHNnW2ldLm9mZnNldDsKLQkJdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX3VwZGF0ZShjcnlwdG9fdGZtX2N0eCh0Zm0pLAotCQkJCQkJICAgICAgcCwgc2dbaV0ubGVuZ3RoKTsKLQkJa3VubWFwX2F0b21pYyhwKTsKLQkJY3J5cHRvX3lpZWxkKHRmbSk7Ci0JfQotCWNyeXB0b19kaWdlc3RfZmluYWwodGZtLCBvdXQpOwotfQotCi1pbnQgY3J5cHRvX2luaXRfZGlnZXN0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKLXsKLQlyZXR1cm4gZmxhZ3MgPyAtRUlOVkFMIDogMDsKLX0KLQotaW50IGNyeXB0b19pbml0X2RpZ2VzdF9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlzdHJ1Y3QgZGlnZXN0X3RmbSAqb3BzID0gJnRmbS0+Y3J0X2RpZ2VzdDsKLQotCW9wcy0+ZGl0X2luaXQJPSBpbml0OwotCW9wcy0+ZGl0X3VwZGF0ZQk9IHVwZGF0ZTsKLQlvcHMtPmRpdF9maW5hbAk9IGZpbmFsOwotCW9wcy0+ZGl0X2RpZ2VzdAk9IGRpZ2VzdDsKLQlvcHMtPmRpdF9zZXRrZXkJPSBzZXRrZXk7Ci0KLQlyZXR1cm4gY3J5cHRvX2FsbG9jX2htYWNfYmxvY2sodGZtKTsKLX0KLQotdm9pZCBjcnlwdG9fZXhpdF9kaWdlc3Rfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JY3J5cHRvX2ZyZWVfaG1hY19ibG9jayh0Zm0pOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmMKaW5kZXggMzRlZGNmYS4uOTBhY2U3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5jCkBAIC0xLDE2ICsxLDggQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCUZpbGU6Ci0vLwkJRG90MTFkLmMKLS8vCi0vLwlEZXNjcmlwdGlvbjoKLS8vCQlJbXBsZW1lbnQgODAyLjExZC4KLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiBJbXBsZW1lbnQgODAyLjExZC4gKi8KIAogI2luY2x1ZGUgImRvdDExZC5oIgogCi12b2lkCi1Eb3QxMWRfSW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3ZvaWQgRG90MTFkX0luaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGllZWUpOwogCkBAIC0yMiw1NSArMTQsNDIgQEAKIAltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOwogCVJFU0VUX0NJRV9XQVRDSERPRyhpZWVlKTsKIAotCXByaW50aygiRG90MTFkX0luaXQoKVxuIik7CisJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiRG90MTFkX0luaXQoKVxuIik7CiB9CitFWFBPUlRfU1lNQk9MKERvdDExZF9Jbml0KTsKIAotLy8KLS8vCURlc2NyaXB0aW9uOgotLy8JCVJlc2V0IHRvIHRoZSBzdGF0ZSBhcyB3ZSBhcmUganVzdCBlbnRlcmluZyBhIHJlZ3VsYXRvcnkgZG9tYWluLgotLy8KLXZvaWQKLURvdDExZF9SZXNldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKKy8qIFJlc2V0IHRvIHRoZSBzdGF0ZSBhcyB3ZSBhcmUganVzdCBlbnRlcmluZyBhIHJlZ3VsYXRvcnkgZG9tYWluLiAqLwordm9pZCBEb3QxMWRfUmVzZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJdTMyIGk7CiAJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGllZWUpOwotCS8vIENsZWFyIG9sZCBjaGFubmVsIG1hcAorCS8qIENsZWFyIG9sZCBjaGFubmVsIG1hcCAqLwogCW1lbXNldChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXAsIDAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKIAltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOwotCS8vIFNldCBuZXcgY2hhbm5lbCBtYXAKLQlmb3IgKGk9MTsgaTw9MTE7IGkrKykgeworCS8qIFNldCBuZXcgY2hhbm5lbCBtYXAgKi8KKwlmb3IgKGkgPSAxOyBpIDw9IDExOyBpKyspCiAJCShwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXApW2ldID0gMTsKLQl9Ci0JZm9yIChpPTEyOyBpPD0xNDsgaSsrKSB7CisKKwlmb3IgKGkgPSAxMjsgaSA8PSAxNDsgaSsrKQogCQkocERvdDExZEluZm8tPmNoYW5uZWxfbWFwKVtpXSA9IDI7Ci0JfQogCiAJcERvdDExZEluZm8tPlN0YXRlID0gRE9UMTFEX1NUQVRFX05PTkU7CiAJcERvdDExZEluZm8tPkNvdW50cnlJZUxlbiA9IDA7CiAJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOwotCi0JLy9wcmludGsoIkRvdDExZF9SZXNldCgpXG4iKTsKIH0KK0VYUE9SVF9TWU1CT0woRG90MTFkX1Jlc2V0KTsKIAotLy8KLS8vCURlc2NyaXB0aW9uOgotLy8JCVVwZGF0ZSBjb3VudHJ5IElFIGZyb20gQmVhY29uIG9yIFByb2JlIFJlc29wbnNlCi0vLwkJYW5kIGNvbmZpZ3VyZSBQSFkgZm9yIG9wZXJhdGlvbiBpbiB0aGUgcmVndWxhdG9yeSBkb21haW4uCi0vLwotLy8JVE9ETzoKLS8vCQlDb25maWd1cmUgVHggcG93ZXIuCi0vLwotLy8JQXNzdW1wdGlvbjoKLS8vCQkxLiBJU19ET1QxMURfRU5BQkxFKCkgaXMgVFJVRS4KLS8vCQkyLiBJbnB1dCBJRSBpcyBhbiB2YWxpZCBvbmUuCi0vLwotdm9pZAotRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LAotCXU4ICpwVGFkZHIsCi0JdTE2CUNvdXRyeUllTGVuLAotCXU4ICpwQ291dHJ5SWUKLQkpCisvKgorICogVXBkYXRlIGNvdW50cnkgSUUgZnJvbSBCZWFjb24gb3IgUHJvYmUgUmVzb3Buc2UgYW5kIGNvbmZpZ3VyZSBQSFkgZm9yCisgKiBvcGVyYXRpb24gaW4gdGhlIHJlZ3VsYXRvcnkgZG9tYWluLgorICoKKyAqIFRPRE86IENvbmZpZ3VyZSBUeCBwb3dlci4KKyAqIEFzc3VtcHRpb246CisgKiAxLiBJU19ET1QxMURfRU5BQkxFKCkgaXMgVFJVRS4KKyAqIDIuIElucHV0IElFIGlzIGFuIHZhbGlkIG9uZS4KKyAqLwordm9pZCBEb3QxMWRfVXBkYXRlQ291bnRyeUllKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsIHU4ICpwVGFkZHIsCisJCQkgICAgdTE2IENvdXRyeUllTGVuLCB1OCAqcENvdXRyeUllKQogewogCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOwogCXU4IGksIGosIE51bVRyaXBsZXMsIE1heENobmxOdW07CkBAIC03OSwyMyArNTgsMjUgQEAKIAltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CiAJbWVtc2V0KHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3QsIDB4RkYsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKIAlNYXhDaG5sTnVtID0gMDsKLQlOdW1UcmlwbGVzID0gKENvdXRyeUllTGVuIC0gMykgLyAzOyAvLyBza2lwIDMtYnl0ZSBjb3VudHJ5IHN0cmluZy4KKwlOdW1UcmlwbGVzID0gKENvdXRyeUllTGVuIC0gMykgLyAzOyAvKiBza2lwIDMtYnl0ZSBjb3VudHJ5IHN0cmluZy4gKi8KIAlwVHJpcGxlID0gKFBDSE5MX1RYUE9XRVJfVFJJUExFKShwQ291dHJ5SWUgKyAzKTsKLQlmb3IoaSA9IDA7IGkgPCBOdW1UcmlwbGVzOyBpKyspCi0JewotCQlpZihNYXhDaG5sTnVtID49IHBUcmlwbGUtPkZpcnN0Q2hubCkKLQkJeyAvLyBJdCBpcyBub3QgaW4gYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgb3JkZXIsIHNvIHN0b3AgcHJvY2Vzc2luZy4KLQkJCXByaW50aygiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBJbnZhbGlkIGNvdW50cnkgSUUsIHNraXAgaXQuLi4uLi4uLjFcbiIpOworCWZvciAoaSA9IDA7IGkgPCBOdW1UcmlwbGVzOyBpKyspIHsKKwkJaWYgKE1heENobmxOdW0gPj0gcFRyaXBsZS0+Rmlyc3RDaG5sKSB7CisJCQkvKiBJdCBpcyBub3QgaW4gYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgb3JkZXIsIHNvCisJCQkgKiBzdG9wIHByb2Nlc3NpbmcuCisJCQkgKi8KKwkJCW5ldGRldl9lcnIoZGV2LT5kZXYsICJEb3QxMWRfVXBkYXRlQ291bnRyeUllKCk6IEludmFsaWQgY291bnRyeSBJRSwgc2tpcCBpdC4uLi4uLi4uMVxuIik7CiAJCQlyZXR1cm47CiAJCX0KLQkJaWYoTUFYX0NIQU5ORUxfTlVNQkVSIDwgKHBUcmlwbGUtPkZpcnN0Q2hubCArIHBUcmlwbGUtPk51bUNobmxzKSkKLQkJeyAvLyBJdCBpcyBub3QgYSB2YWxpZCBzZXQgb2YgY2hhbm5lbCBpZCwgc28gc3RvcCBwcm9jZXNzaW5nLgotCQkJcHJpbnRrKCJEb3QxMWRfVXBkYXRlQ291bnRyeUllKCk6IEludmFsaWQgY291bnRyeSBJRSwgc2tpcCBpdC4uLi4uLi4uMlxuIik7CisJCWlmIChNQVhfQ0hBTk5FTF9OVU1CRVIgPCAocFRyaXBsZS0+Rmlyc3RDaG5sICsgcFRyaXBsZS0+TnVtQ2hubHMpKSB7CisJCQkvKiBJdCBpcyBub3QgYSB2YWxpZCBzZXQgb2YgY2hhbm5lbCBpZCwgc28gc3RvcAorCQkJICogcHJvY2Vzc2luZy4KKwkJCSAqLworCQkJbmV0ZGV2X2VycihkZXYtPmRldiwgIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogSW52YWxpZCBjb3VudHJ5IElFLCBza2lwIGl0Li4uLi4uLi4yXG4iKTsKIAkJCXJldHVybjsKIAkJfQogCi0JCWZvcihqID0gMCA7IGogPCBwVHJpcGxlLT5OdW1DaG5sczsgaisrKQotCQl7CisJCWZvciAoaiA9IDA7IGogPCBwVHJpcGxlLT5OdW1DaG5sczsgaisrKSB7CiAJCQlwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbcFRyaXBsZS0+Rmlyc3RDaG5sICsgal0gPSAxOwogCQkJcERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdFtwVHJpcGxlLT5GaXJzdENobmwgKyBqXSA9IHBUcmlwbGUtPk1heFR4UG93ZXJJbkRibTsKIAkJCU1heENobmxOdW0gPSBwVHJpcGxlLT5GaXJzdENobmwgKyBqOwpAQCAtMTAzLDYwICs4NCw0OCBAQAogCiAJCXBUcmlwbGUgPSAoUENITkxfVFhQT1dFUl9UUklQTEUpKCh1OCAqKXBUcmlwbGUgKyAzKTsKIAl9Ci0JLy9wcmludGsoIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogQ2hhbm5lbCBMaXN0OlxuIik7Ci0JcHJpbnRrKCJDaGFubmVsIExpc3Q6Iik7Ci0JZm9yKGk9MTsgaTw9IE1BWF9DSEFOTkVMX05VTUJFUjsgaSsrKQotCQlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbaV0gPiAwKQotCQkJcHJpbnRrKCIgJWQiLCBpKTsKLQlwcmludGsoIlxuIik7CisJbmV0ZGV2X2luZm8oZGV2LT5kZXYsICJDaGFubmVsIExpc3Q6Iik7CisJZm9yIChpID0gMTsgaSA8PSBNQVhfQ0hBTk5FTF9OVU1CRVI7IGkrKykKKwkJaWYgKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtpXSA+IDApCisJCQluZXRkZXZfaW5mbyhkZXYtPmRldiwgIiAlZCIsIGkpOworCW5ldGRldl9pbmZvKGRldi0+ZGV2LCAiXG4iKTsKIAogCVVQREFURV9DSUVfU1JDKGRldiwgcFRhZGRyKTsKIAogCXBEb3QxMWRJbmZvLT5Db3VudHJ5SWVMZW4gPSBDb3V0cnlJZUxlbjsKLQltZW1jcHkocERvdDExZEluZm8tPkNvdW50cnlJZUJ1ZiwgcENvdXRyeUllLENvdXRyeUllTGVuKTsKKwltZW1jcHkocERvdDExZEluZm8tPkNvdW50cnlJZUJ1ZiwgcENvdXRyeUllLCBDb3V0cnlJZUxlbik7CiAJcERvdDExZEluZm8tPlN0YXRlID0gRE9UMTFEX1NUQVRFX0xFQVJORUQ7CiB9CitFWFBPUlRfU1lNQk9MKERvdDExZF9VcGRhdGVDb3VudHJ5SWUpOwogCi0KLXU4Ci1ET1QxMURfR2V0TWF4VHhQd3JJbkRibSgKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LAotCXU4IENoYW5uZWwKLQkpCit1OCBET1QxMURfR2V0TWF4VHhQd3JJbkRibShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LCB1OCBDaGFubmVsKQogewogCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOwogCXU4IE1heFR4UHdySW5EYm0gPSAyNTU7CiAKLQlpZihNQVhfQ0hBTk5FTF9OVU1CRVIgPCBDaGFubmVsKQotCXsKLQkJcHJpbnRrKCJET1QxMURfR2V0TWF4VHhQd3JJbkRibSgpOiBJbnZhbGlkIENoYW5uZWxcbiIpOworCWlmIChNQVhfQ0hBTk5FTF9OVU1CRVIgPCBDaGFubmVsKSB7CisJCW5ldGRldl9lcnIoZGV2LT5kZXYsICJET1QxMURfR2V0TWF4VHhQd3JJbkRibSgpOiBJbnZhbGlkIENoYW5uZWxcbiIpOwogCQlyZXR1cm4gTWF4VHhQd3JJbkRibTsKIAl9Ci0JaWYocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW0NoYW5uZWxdKQotCXsKKwlpZiAocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW0NoYW5uZWxdKQogCQlNYXhUeFB3ckluRGJtID0gcERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdFtDaGFubmVsXTsKLQl9CiAKIAlyZXR1cm4gTWF4VHhQd3JJbkRibTsKIH0KK0VYUE9SVF9TWU1CT0woRE9UMTFEX0dldE1heFR4UHdySW5EYm0pOwogCi0KLXZvaWQKLURPVDExRF9TY2FuQ29tcGxldGUoCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldgotCSkKK3ZvaWQgRE9UMTFEX1NjYW5Db21wbGV0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2KQogewogCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOwogCi0Jc3dpdGNoIChwRG90MTFkSW5mby0+U3RhdGUpCi0JeworCXN3aXRjaCAocERvdDExZEluZm8tPlN0YXRlKSB7CiAJY2FzZSBET1QxMURfU1RBVEVfTEVBUk5FRDoKIAkJcERvdDExZEluZm8tPlN0YXRlID0gRE9UMTFEX1NUQVRFX0RPTkU7CiAJCWJyZWFrOwogCiAJY2FzZSBET1QxMURfU1RBVEVfRE9ORToKLQkJaWYoIEdFVF9DSUVfV0FUQ0hET0coZGV2KSA9PSAwICkKLQkJeyAvLyBSZXNldCBjb3VudHJ5IElFIGlmIHByZXZpb3VzIG9uZSBpcyBnb25lLgorCQlpZiAoR0VUX0NJRV9XQVRDSERPRyhkZXYpID09IDApIHsKKwkJCS8qIFJlc2V0IGNvdW50cnkgSUUgaWYgcHJldmlvdXMgb25lIGlzIGdvbmUuICovCiAJCQlEb3QxMWRfUmVzZXQoZGV2KTsKIAkJfQogCQlicmVhazsKQEAgLTE2NCw1NyArMTMzLDQzIEBACiAJCWJyZWFrOwogCX0KIH0KK0VYUE9SVF9TWU1CT0woRE9UMTFEX1NjYW5Db21wbGV0ZSk7CiAKLWludCBJc0xlZ2FsQ2hhbm5lbCgKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LAotCXU4IGNoYW5uZWwKLSkKK2ludCBJc0xlZ2FsQ2hhbm5lbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LCB1OCBjaGFubmVsKQogewogCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOwogCi0JaWYoTUFYX0NIQU5ORUxfTlVNQkVSIDwgY2hhbm5lbCkKLQl7Ci0JCXByaW50aygiSXNMZWdhbENoYW5uZWwoKTogSW52YWxpZCBDaGFubmVsXG4iKTsKKwlpZiAoTUFYX0NIQU5ORUxfTlVNQkVSIDwgY2hhbm5lbCkgeworCQluZXRkZXZfZXJyKGRldi0+ZGV2LCAiSXNMZWdhbENoYW5uZWwoKTogSW52YWxpZCBDaGFubmVsXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQotCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtjaGFubmVsXSA+IDApCisJaWYgKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtjaGFubmVsXSA+IDApCiAJCXJldHVybiAxOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChJc0xlZ2FsQ2hhbm5lbCk7CiAKLWludCBUb0xlZ2FsQ2hhbm5lbCgKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LAotCXU4IGNoYW5uZWwKLSkKK2ludCBUb0xlZ2FsQ2hhbm5lbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LCB1OCBjaGFubmVsKQogewogCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOwogCXU4IGRlZmF1bHRfY2huID0gMDsKIAl1MzIgaSA9IDA7CiAKLQlmb3IgKGk9MTsgaTw9IE1BWF9DSEFOTkVMX05VTUJFUjsgaSsrKQotCXsKLQkJaWYocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2ldID4gMCkKLQkJeworCWZvciAoaSA9IDE7IGkgPD0gTUFYX0NIQU5ORUxfTlVNQkVSOyBpKyspIHsKKwkJaWYgKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtpXSA+IDApIHsKIAkJCWRlZmF1bHRfY2huID0gaTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi0JaWYoTUFYX0NIQU5ORUxfTlVNQkVSIDwgY2hhbm5lbCkKLQl7Ci0JCXByaW50aygiSXNMZWdhbENoYW5uZWwoKTogSW52YWxpZCBDaGFubmVsXG4iKTsKKwlpZiAoTUFYX0NIQU5ORUxfTlVNQkVSIDwgY2hhbm5lbCkgeworCQluZXRkZXZfZXJyKGRldi0+ZGV2LCAiSXNMZWdhbENoYW5uZWwoKTogSW52YWxpZCBDaGFubmVsXG4iKTsKIAkJcmV0dXJuIGRlZmF1bHRfY2huOwogCX0KIAotCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtjaGFubmVsXSA+IDApCisJaWYgKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtjaGFubmVsXSA+IDApCiAJCXJldHVybiBjaGFubmVsOwogCiAJcmV0dXJuIGRlZmF1bHRfY2huOwogfQotRVhQT1JUX1NZTUJPTChEb3QxMWRfSW5pdCk7Ci1FWFBPUlRfU1lNQk9MKERvdDExZF9SZXNldCk7Ci1FWFBPUlRfU1lNQk9MKERvdDExZF9VcGRhdGVDb3VudHJ5SWUpOwotRVhQT1JUX1NZTUJPTChET1QxMURfR2V0TWF4VHhQd3JJbkRibSk7Ci1FWFBPUlRfU1lNQk9MKERPVDExRF9TY2FuQ29tcGxldGUpOwotRVhQT1JUX1NZTUJPTChJc0xlZ2FsQ2hhbm5lbCk7CiBFWFBPUlRfU1lNQk9MKFRvTGVnYWxDaGFubmVsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMS5oCmluZGV4IGJjNjRmMDUuLmNhYzIwNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaApAQCAtMTE1Miw3ICsxMTUyLDcgQEAKIAogc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwotCXUzMiB0aW1lX3N0YW1wWzJdOworCV9fbGUzMiB0aW1lX3N0YW1wWzJdOwogCV9fbGUxNiBiZWFjb25faW50ZXJ2YWw7CiAJX19sZTE2IGNhcGFiaWxpdHk7CiAJLyogU1NJRCwgc3VwcG9ydGVkIHJhdGVzLCBGSCBwYXJhbXMsIERTIHBhcmFtcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCmluZGV4IGU3MzBlZDYuLmE5ODQxNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpAQCAtNTE3LDExICs1MTcsOCBAQAogCiAJcmV0dXJuIDE7CiB9Ci1ib29sCi1BZGRSZW9yZGVyRW50cnkoCi0JUFJYX1RTX1JFQ09SRAkJCXBUUywKLQlQUlhfUkVPUkRFUl9FTlRSWQkJcFJlb3JkZXJFbnRyeQotCSkKKworc3RhdGljIGJvb2wgQWRkUmVvcmRlckVudHJ5KFBSWF9UU19SRUNPUkQgcFRTLCBQUlhfUkVPUkRFUl9FTlRSWSBwUmVvcmRlckVudHJ5KQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnBMaXN0ID0gJnBUUy0+UnhQZW5kaW5nUGt0TGlzdDsKIAl3aGlsZShwTGlzdC0+bmV4dCAhPSAmcFRTLT5SeFBlbmRpbmdQa3RMaXN0KQpAQCAtNjAxLDEwICs1OTgsOSBAQAogfQogCiAKLXZvaWQgUnhSZW9yZGVySW5kaWNhdGVQYWNrZXQoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQlzdHJ1Y3QgaWVlZTgwMjExX3J4YiAqcHJ4YiwKLQkJUFJYX1RTX1JFQ09SRAkJcFRTLAotCQl1MTYJCQlTZXFOdW0pCitzdGF0aWMgdm9pZCBSeFJlb3JkZXJJbmRpY2F0ZVBhY2tldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9yeGIgKnByeGIsCisJCQkJICAgIFBSWF9UU19SRUNPUkQgcFRTLCB1MTYgU2VxTnVtKQogewogCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CiAJUFJYX1JFT1JERVJfRU5UUlkJcFJlb3JkZXJFbnRyeSA9IE5VTEw7CkBAIC03NzEsOSArNzY3LDkgQEAKIAl9CiB9CiAKLXU4IHBhcnNlX3N1YmZyYW1lKHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMsCi0JCSAgc3RydWN0IGllZWU4MDIxMV9yeGIgKnJ4Yix1OCAqc3JjLHU4ICpkc3QpCitzdGF0aWMgdTggcGFyc2Vfc3ViZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX3J4YiAqcnhiLHU4ICpzcmMsdTggKmRzdCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKXNrYi0+ZGF0YTsKIAl1MTYJCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOwpAQCAtMjIwMCw3ICsyMTk2LDcgQEAKIAluZXR3b3JrLT5sYXN0X3NjYW5uZWQgPSBqaWZmaWVzOwogCW5ldHdvcmstPnRpbWVfc3RhbXBbMF0gPSBsZTMyX3RvX2NwdShiZWFjb24tPnRpbWVfc3RhbXBbMF0pOwogCW5ldHdvcmstPnRpbWVfc3RhbXBbMV0gPSBsZTMyX3RvX2NwdShiZWFjb24tPnRpbWVfc3RhbXBbMV0pOwotCW5ldHdvcmstPmJlYWNvbl9pbnRlcnZhbCA9IGxlMzJfdG9fY3B1KGJlYWNvbi0+YmVhY29uX2ludGVydmFsKTsKKwluZXR3b3JrLT5iZWFjb25faW50ZXJ2YWwgPSBsZTE2X3RvX2NwdShiZWFjb24tPmJlYWNvbl9pbnRlcnZhbCk7CiAJLyogV2hlcmUgdG8gcHVsbCB0aGlzPyBiZWFjb24tPmxpc3Rlbl9pbnRlcnZhbDsqLwogCW5ldHdvcmstPmxpc3Rlbl9pbnRlcnZhbCA9IDB4MEE7CiAJbmV0d29yay0+cmF0ZXNfbGVuID0gbmV0d29yay0+cmF0ZXNfZXhfbGVuID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwppbmRleCA2NjJjN2U0Li4yMTMxOTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCkBAIC0yNCwxNSArMjQsNiBAQAogCiAjaW5jbHVkZSAiZG90MTFkLmgiCiAKLXU4IHJzbl9hdXRoZW5fY2lwaGVyX3N1aXRlWzE2XVs0XSA9IHsKLQl7MHgwMCwweDBGLDB4QUMsMHgwMH0sIC8vVXNlIGdyb3VwIGtleSwgLy9SZXNlcnZlZAotCXsweDAwLDB4MEYsMHhBQywweDAxfSwgLy9XRVAtNDAgICAgICAgICAvL1JTTkEgZGVmYXVsdAotCXsweDAwLDB4MEYsMHhBQywweDAyfSwgLy9US0lQICAgICAgICAgICAvL05PTkUJCS8ve3VzZWQganVzdCBhcyBkZWZhdWx0fQotCXsweDAwLDB4MEYsMHhBQywweDAzfSwgLy9XUkFQLWhpc3RvcmljYWwKLQl7MHgwMCwweDBGLDB4QUMsMHgwNH0sIC8vQ0NNUAotCXsweDAwLDB4MEYsMHhBQywweDA1fSwgLy9XRVAtMTA0Ci19OwotCiBzaG9ydCBpZWVlODAyMTFfaXNfNTRnKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0KQogewogCXJldHVybiAobmV0LT5yYXRlc19leF9sZW4gPiAwKSB8fCAobmV0LT5yYXRlc19sZW4gPiA0KTsKQEAgLTQ3LDcgKzM4LDcgQEAKICAqIHRhZyBhbmQgdGhlIEVYVEVOREVEIFJBVEUgTUZJRSB0YWcgaWYgbmVlZGVkLgogICogSXQgZW5jbHVkZXMgdHdvIGJ5dGVzIHBlciB0YWcgZm9yIHRoZSB0YWcgaXRzZWxmIGFuZCBpdHMgbGVuCiAgKi8KLXVuc2lnbmVkIGludCBpZWVlODAyMTFfTUZJRV9yYXRlX2xlbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaWVlZTgwMjExX01GSUVfcmF0ZV9sZW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJdW5zaWduZWQgaW50IHJhdGVfbGVuID0gMDsKIApAQCAtNjUsNyArNTYsNyBAQAogICogVGhlbiBpdCB1cGRhdGVzIHRoZSBwb2ludGVyIHNvIHRoYXQKICAqIGl0IHBvaW50cyBhZnRlciB0aGUgbmV3IE1GSUUgdGFnIGFkZGVkLgogICovCi12b2lkIGllZWU4MDIxMV9NRklFX0JyYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqKnRhZ19wKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX01GSUVfQnJhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApCiB7CiAJdTggKnRhZyA9ICp0YWdfcDsKIApAQCAtODIsNyArNzMsNyBAQAogCSp0YWdfcCA9IHRhZzsKIH0KIAotdm9pZCBpZWVlODAyMTFfTUZJRV9HcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9NRklFX0dyYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqKnRhZ19wKQogewogCXU4ICp0YWcgPSAqdGFnX3A7CiAKQEAgLTEwNiw3ICs5Nyw4IEBACiB9CiAKIAotdm9pZCBpZWVlODAyMTFfV01NX0luZm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApIHsKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9XTU1fSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkKK3sKIAl1OCAqdGFnID0gKnRhZ19wOwogCiAJKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7IC8vMApAQCAtMTQ4LDcgKzE0MCw3IEBACiB9CiAjZW5kaWYKIAotdm9pZCBlbnF1ZXVlX21nbXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCBlbnF1ZXVlX21nbXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaW50IG5oOwogCW5oID0gKGllZWUtPm1nbXRfcXVldWVfaGVhZCArMSkgJSBNR01UX1FVRVVFX05VTTsKQEAgLTE2Niw3ICsxNTgsNyBAQAogCS8vcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBza19idWZmICpkZXF1ZXVlX21nbXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmRlcXVldWVfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcmV0OwogCkBAIC0xODEsMTIgKzE3MywxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgaW5pdF9tZ210X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIHZvaWQgaW5pdF9tZ210X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCWllZWUtPm1nbXRfcXVldWVfdGFpbCA9IGllZWUtPm1nbXRfcXVldWVfaGVhZCA9IDA7CiB9CiAKLXU4IE1nbnRRdWVyeV9NZ250RnJhbWVUeFJhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgdTggTWdudFF1ZXJ5X01nbnRGcmFtZVR4UmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlQUlRfSElHSF9USFJPVUdIUFVUICAgICAgcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CiAJdTggcmF0ZTsKQEAgLTM2NSw3ICszNTcsOCBAQAogfQogCiBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb25fKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLXZvaWQgaWVlZTgwMjExX3NlbmRfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2VuZF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpZighaWVlZS0+aWVlZV91cCkKQEAgLTM5MSw3ICszODQsNyBAQAogfQogCiAKLXZvaWQgaWVlZTgwMjExX3NlbmRfYmVhY29uX2NiKHVuc2lnbmVkIGxvbmcgX2llZWUpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2VuZF9iZWFjb25fY2IodW5zaWduZWQgbG9uZyBfaWVlZSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9CiAJCShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKSBfaWVlZTsKQEAgLTQwMyw3ICszOTYsNyBAQAogfQogCiAKLXZvaWQgaWVlZTgwMjExX3NlbmRfcHJvYmUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2VuZF9wcm9iZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCkBAIC00OTQsNyArNDg3LDcgQEAKIH0KIAogCi12b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBzb2Z0bWFjX3NjYW5fd3EpOwpAQCAtNTM4LDcgKzUzMSw3IEBACiAKIAogCi12b2lkIGllZWU4MDIxMV9iZWFjb25zX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX2JlYWNvbnNfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOwpAQCAtNTQ5LDcgKzU0Miw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOwogfQogCi12b2lkIGllZWU4MDIxMV9iZWFjb25zX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfYmVhY29uc19zdG9wKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTU4MSw3ICs1NzQsNyBAQAogfQogCiAKLXZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogLy8JdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtNjA5LDcgKzYwMiw3IEBACiB9CiAKIC8qIGNhbGxlZCB3aXRoIGllZWUtPmxvY2sgaGVsZCAqLwotdm9pZCBpZWVlODAyMTFfc3RhcnRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgKQogCXsKQEAgLTg0MSw3ICs4MzQsOCBAQAogfQogCiAKLXN0cnVjdCBza19idWZmICppZWVlODAyMTFfYXNzb2NfcmVzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QpCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9hc3NvY19yZXNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQkgICAgdTggKmRlc3QpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1OCAqdGFnOwpAQCAtODk2LDcgKzg5MCw4IEBACiAJcmV0dXJuIHNrYjsKIH0KIAotc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9hdXRoX3Jlc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsaW50IHN0YXR1cywgdTggKmRlc3QpCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9hdXRoX3Jlc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJCSAgIGludCBzdGF0dXMsIHU4ICpkZXN0KQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYXV0aDsKQEAgLTkyNCw3ICs5MTksOCBAQAogCiB9CiAKLXN0cnVjdCBza19idWZmICppZWVlODAyMTFfbnVsbF9mdW5jKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLHNob3J0IHB3cikKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX251bGxfZnVuYyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJICAgc2hvcnQgcHdyKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmhkcjsKQEAgLTk1MCw3ICs5NDYsNyBAQAogfQogCiAKLXZvaWQgaWVlZTgwMjExX3Jlc3BfdG9fYXNzb2NfcnEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0KQorc3RhdGljIHZvaWQgaWVlZTgwMjExX3Jlc3BfdG9fYXNzb2NfcnEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0KQogewogCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfYXNzb2NfcmVzcChpZWVlLCBkZXN0KTsKIApAQCAtOTU5LDcgKzk1NSw4IEBACiB9CiAKIAotdm9pZCBpZWVlODAyMTFfcmVzcF90b19hdXRoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgcywgdTggKmRlc3QpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfcmVzcF90b19hdXRoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgcywKKwkJCQkgICB1OCAqZGVzdCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX2F1dGhfcmVzcChpZWVlLCBzLCBkZXN0KTsKIApAQCAtOTY4LDcgKzk2NSw3IEBACiB9CiAKIAotdm9pZCBpZWVlODAyMTFfcmVzcF90b19wcm9iZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfcmVzcF90b19wcm9iZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QpCiB7CiAKIApAQCAtMTI1MCwxMyArMTI0NywxMyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIH0KIAotdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0X2NiKHVuc2lnbmVkIGxvbmcgZGV2KQorc3RhdGljIHZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydF9jYih1bnNpZ25lZCBsb25nIGRldikKIHsKIAlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKSBkZXYpOwogfQogCiAKLXZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24gPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOwogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC0xMjgyLDcgKzEyNzksOSBAQAogCX0KIH0KIAotdm9pZCBpZWVlODAyMTFfYXV0aF9jaGFsbGVuZ2Uoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpjaGFsbGVuZ2UsIGludCBjaGxlbikKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9hdXRoX2NoYWxsZW5nZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICAgIHU4ICpjaGFsbGVuZ2UsCisJCQkJICAgICBpbnQgY2hsZW4pCiB7CiAJdTggKmM7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTEzMTIsNyArMTMxMSw3IEBACiAJa2ZyZWUoY2hhbGxlbmdlKTsKIH0KIAotdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKQEAgLTEzMzEsNyArMTMzMCw3IEBACiAJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCiAJfQogfQotdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGVfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBhc3NvY2lhdGVfY29tcGxldGVfd3EpOwogCXByaW50ayhLRVJOX0lORk8gIkFzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKQEAgLTEzNzgsNyArMTM3Nyw3IEBACiAJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOwogfQogCi12b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogLy8JaW50IGk7CiAvLwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2ID0gaWVlZS0+ZGV2OwpAQCAtMTM4OSw3ICsxMzg4LDcgQEAKIAlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX2NvbXBsZXRlX3dxKTsKIH0KIAotdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3Byb2NlZHVyZV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3Byb2NlZHVyZV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOwogCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKQEAgLTE1NjIsNyArMTU2MSw3IEBACiB9CiAKIAotaW50IGF1dGhfcnFfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYix1OCAqZGVzdCkKK3N0YXRpYyBpbnQgYXV0aF9ycV9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqZGVzdCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICphOwogCkBAIC0xNjE4LDcgKzE2MTcsNyBAQAogCiB9CiAKLWludCBhc3NvY19ycV9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLHU4ICpkZXN0KQorc3RhdGljIGludCBhc3NvY19ycV9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqZGVzdCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUgKmE7CiAKQEAgLTE3MTIsNyArMTcxMSw4IEBACiAKIAogCi12b2lkIGllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBwd3IpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJICAgICBzaG9ydCBwd3IpCiB7CiAKIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX251bGxfZnVuYyhpZWVlLCBwd3IpOwpAQCAtMTcyMyw3ICsxNzIzLDggQEAKIH0KIAogCi1zaG9ydCBpZWVlODAyMTFfc3RhX3BzX3NsZWVwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1MzIgKnRpbWVfaCwgdTMyICp0aW1lX2wpCitzdGF0aWMgc2hvcnQgaWVlZTgwMjExX3N0YV9wc19zbGVlcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTMyICp0aW1lX2gsCisJCQkJICAgIHUzMiAqdGltZV9sKQogewogCWludCB0aW1lb3V0ID0gaWVlZS0+cHNfdGltZW91dDsKIAl1OCBkdGltOwpAQCAtMTc3MSw3ICsxNzcyLDcgQEAKIAogfQogCi1pbmxpbmUgdm9pZCBpZWVlODAyMTFfc3RhX3BzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9zdGFfcHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAKIAl1MzIgdGgsdGw7CkBAIC0xODg4LDcgKzE4ODksOCBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiB9Ci12b2lkIGllZWU4MDIxMV9wcm9jZXNzX2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9wcm9jZXNzX2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKIAl1OCAqYWN0ID0gaWVlZTgwMjExX2dldF9wYXlsb2FkKGhlYWRlcik7CkBAIC0xOTU5LDcgKzE5NjEsOCBAQAogCQkJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldHdvcmtfcmVzcDsKIAkJCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yayA9ICZuZXR3b3JrX3Jlc3A7CiAKLQkJCWlmICgwID09IChlcnJjb2RlPWFzc29jX3BhcnNlKGllZWUsc2tiLCAmYWlkKSkpeworCQkJZXJyY29kZSA9IGFzc29jX3BhcnNlKGllZWUsIHNrYiwgJmFpZCk7CisJCQlpZiAoIWVycmNvZGUpIHsKIAkJCQlpZWVlLT5zdGF0ZT1JRUVFODAyMTFfTElOS0VEOwogCQkJCWllZWUtPmFzc29jX2lkID0gYWlkOwogCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXNzX29rKys7CkBAIC0yMDE3LDcgKzIwMjAsOCBAQAogCiAJCQkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJSZWNlaXZlZCBhdXRoZW50aWNhdGlvbiByZXNwb25zZSIpOwogCi0JCQkJCWlmICgwID09IChlcnJjb2RlPWF1dGhfcGFyc2Uoc2tiLCAmY2hhbGxlbmdlLCAmY2hsZW4pKSl7CisJCQkJCWVycmNvZGUgPSBhdXRoX3BhcnNlKHNrYiwgJmNoYWxsZW5nZSwgJmNobGVuKTsKKwkJCQkJaWYgKCFlcnJjb2RlKSB7CiAJCQkJCQlpZihpZWVlLT5vcGVuX3dlcCB8fCAhY2hhbGxlbmdlKXsKIAkJCQkJCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVEOwogCQkJCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXV0aF9yc19vaysrOwpAQCAtMjE4OSw3ICsyMTkzLDcgQEAKIH0KIAogLyogY2FsbGVkIHdpdGggaWVlZS0+bG9jayBhY3F1aXJlZCAqLwotdm9pZCBpZWVlODAyMTFfcmVzdW1lX3R4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX3Jlc3VtZV90eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlpbnQgaTsKIAlmb3IoaSA9IGllZWUtPnR4X3BlbmRpbmcuZnJhZzsgaSA8IGllZWUtPnR4X3BlbmRpbmcudHhiLT5ucl9mcmFnczsgaSsrKSB7CkBAIC0yMzE4LDcgKzIzMjIsNyBAQAogCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKIH0KIAotdm9pZCBpZWVlODAyMTFfc3RhcnRfbW9uaXRvcl9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX3N0YXJ0X21vbml0b3JfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlpZihpZWVlLT5yYXdfdHgpewogCkBAIC0yMzI4LDcgKzIzMzIsNyBAQAogCQluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7CiAJfQogfQotdm9pZCBpZWVlODAyMTFfc3RhcnRfaWJzc193cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RhcnRfaWJzc193cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKQEAgLTI1MDEsNyArMjUwNSw3IEBACiAJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOwogCiB9Ci12b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfcmV0cnlfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9yZXRyeV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBhc3NvY2lhdGVfcmV0cnlfd3EpOwpAQCAtMjc3Miw3ICsyNzc2LDggQEAKIH0KIAogCi12b2lkIGllZWU4MDIxMV93cGFfYXNzb2NfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGNoYXIgKndwYV9pZSwgaW50IHdwYV9pZV9sZW4pCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfd3BhX2Fzc29jX2ZyYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICAgIGNoYXIgKndwYV9pZSwgaW50IHdwYV9pZV9sZW4pCiB7CiAJLyogbWFrZSBzdXJlIFdQQSBpcyBlbmFibGVkICovCiAJaWVlZTgwMjExX3dwYV9lbmFibGUoaWVlZSwgMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwppbmRleCAxNTdiMmQ3Li42Nzc5YmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKQEAgLTM3OCw3ICszNzgsOCBAQAogCQlyZXR1cm47CiB9CiAKLWV4dGVybiB2b2lkIGllZWU4MDIxMV9xdXJleV9TaG9ydFByZWFtYmxlTW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgY2JfZGVzYyAqdGNiX2Rlc2MpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfcXVyZXlfU2hvcnRQcmVhbWJsZU1vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJCSAgICAgIGNiX2Rlc2MgKnRjYl9kZXNjKQogewogCXRjYl9kZXNjLT5iVXNlU2hvcnRQcmVhbWJsZSA9IGZhbHNlOwogCWlmICh0Y2JfZGVzYy0+ZGF0YV9yYXRlID09IDIpCkBAIC0zOTEsNyArMzkyLDcgQEAKIAl9CiAJcmV0dXJuOwogfQotZXh0ZXJuCXZvaWQKK3N0YXRpYyB2b2lkCiBpZWVlODAyMTFfcXVlcnlfSFRDYXBTaG9ydEdJKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBjYl9kZXNjICp0Y2JfZGVzYykKIHsKIAlQUlRfSElHSF9USFJPVUdIUFVUCQlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCmluZGV4IGUxZmU1NGEuLmJkZjY3ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwpAQCAtMzksNyArMzksNyBAQAogCWNoYXIgKm1vZGVfc3RyaW5nOwogCWludCBtb2RlX3NpemU7CiB9Owotc3RydWN0IG1vZGVzX3VuaXQgaWVlZTgwMjExX21vZGVzW10gPSB7CitzdGF0aWMgc3RydWN0IG1vZGVzX3VuaXQgaWVlZTgwMjExX21vZGVzW10gPSB7CiAJeyJhIiwxfSwKIAl7ImIiLDF9LAogCXsiZyIsMX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNTRjZmUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENyeXB0b2dyYXBoaWMgQVBJLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotI2lmbmRlZiBfQ1JZUFRPX0lOVEVSTkFMX0gKLSNkZWZpbmUgX0NSWVBUT19JTlRFUk5BTF9ICi0KLQotLy8jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+Ci0jaW5jbHVkZSAicnRsX2NyeXB0by5oIgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vaGFyZGlycS5oPgotI2luY2x1ZGUgPGFzbS9zb2Z0aXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2ttYXBfdHlwZXMuaD4KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX3lpZWxkKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JaWYgKCFpbl9zb2Z0aXJxKCkpCi0JCWNvbmRfcmVzY2hlZCgpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgKmNyeXB0b190Zm1fY3R4KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JcmV0dXJuICh2b2lkICopJnRmbVsxXTsKLX0KLQotc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpOwotCi0jaWZkZWYgQ09ORklHX0tNT0QKLXZvaWQgY3J5cHRvX2FsZ19hdXRvbG9hZChjb25zdCBjaGFyICpuYW1lKTsKLXN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX21vZF9sb29rdXAoY29uc3QgY2hhciAqbmFtZSk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2FsZ19tb2RfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JcmV0dXJuIGNyeXB0b19hbGdfbG9va3VwKG5hbWUpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQ1JZUFRPX0hNQUMKLWludCBjcnlwdG9fYWxsb2NfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKLXZvaWQgY3J5cHRvX2ZyZWVfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYWxsb2NfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2ZyZWVfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoteyB9Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi12b2lkIF9faW5pdCBjcnlwdG9faW5pdF9wcm9jKHZvaWQpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9faW5pdF9wcm9jKHZvaWQpCi17IH0KLSNlbmRpZgotCi1pbnQgY3J5cHRvX2luaXRfZGlnZXN0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncyk7Ci1pbnQgY3J5cHRvX2luaXRfY2lwaGVyX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncyk7Ci1pbnQgY3J5cHRvX2luaXRfY29tcHJlc3NfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKTsKLQotaW50IGNyeXB0b19pbml0X2RpZ2VzdF9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Ci1pbnQgY3J5cHRvX2luaXRfY2lwaGVyX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKLWludCBjcnlwdG9faW5pdF9jb21wcmVzc19vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Ci0KLXZvaWQgY3J5cHRvX2V4aXRfZGlnZXN0X29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKLXZvaWQgY3J5cHRvX2V4aXRfY2lwaGVyX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKLXZvaWQgY3J5cHRvX2V4aXRfY29tcHJlc3Nfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwotCi0jZW5kaWYJLyogX0NSWVBUT19JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL21pY2hhZWxfbWljLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL21pY2hhZWxfbWljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMjU2ZTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9taWNoYWVsX21pYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qCi0gKiBDcnlwdG9ncmFwaGljIEFQSQotICoKLSAqIE1pY2hhZWwgTUlDIChJRUVFIDgwMi4xMWkvVEtJUCkga2V5ZWQgZGlnZXN0Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA0IEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0vLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KLSNpbmNsdWRlICJydGxfY3J5cHRvLmgiCi0KLQotc3RydWN0IG1pY2hhZWxfbWljX2N0eCB7Ci0JdTggcGVuZGluZ1s0XTsKLQlzaXplX3QgcGVuZGluZ19sZW47Ci0KLQl1MzIgbCwgcjsKLX07Ci0KLQotc3RhdGljIGlubGluZSB1MzIgcm90bCh1MzIgdmFsLCBpbnQgYml0cykKLXsKLQlyZXR1cm4gKHZhbCA8PCBiaXRzKSB8ICh2YWwgPj4gKDMyIC0gYml0cykpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdTMyIHJvdHIodTMyIHZhbCwgaW50IGJpdHMpCi17Ci0JcmV0dXJuICh2YWwgPj4gYml0cykgfCAodmFsIDw8ICgzMiAtIGJpdHMpKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHUzMiB4c3dhcCh1MzIgdmFsKQotewotCXJldHVybiAoKHZhbCAmIDB4MDBmZjAwZmYpIDw8IDgpIHwgKCh2YWwgJiAweGZmMDBmZjAwKSA+PiA4KTsKLX0KLQotCi0jZGVmaW5lIG1pY2hhZWxfYmxvY2sobCwgcikJXAotZG8gewkJCQlcCi0JciBePSByb3RsKGwsIDE3KTsJXAotCWwgKz0gcjsJCQlcCi0JciBePSB4c3dhcChsKTsJCVwKLQlsICs9IHI7CQkJXAotCXIgXj0gcm90bChsLCAzKTsJXAotCWwgKz0gcjsJCQlcCi0JciBePSByb3RyKGwsIDIpOwlcCi0JbCArPSByOwkJCVwKLX0gd2hpbGUgKDApCi0KLQotc3RhdGljIGlubGluZSB1MzIgZ2V0X2xlMzIoY29uc3QgdTggKnApCi17Ci0JcmV0dXJuIHBbMF0gfCAocFsxXSA8PCA4KSB8IChwWzJdIDw8IDE2KSB8IChwWzNdIDw8IDI0KTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHV0X2xlMzIodTggKnAsIHUzMiB2KQotewotCXBbMF0gPSB2OwotCXBbMV0gPSB2ID4+IDg7Ci0JcFsyXSA9IHYgPj4gMTY7Ci0JcFszXSA9IHYgPj4gMjQ7Ci19Ci0KLQotc3RhdGljIHZvaWQgbWljaGFlbF9pbml0KHZvaWQgKmN0eCkKLXsKLQlzdHJ1Y3QgbWljaGFlbF9taWNfY3R4ICptY3R4ID0gY3R4OwotCW1jdHgtPnBlbmRpbmdfbGVuID0gMDsKLX0KLQotCi1zdGF0aWMgdm9pZCBtaWNoYWVsX3VwZGF0ZSh2b2lkICpjdHgsIGNvbnN0IHU4ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQotewotCXN0cnVjdCBtaWNoYWVsX21pY19jdHggKm1jdHggPSBjdHg7Ci0KLQlpZiAobWN0eC0+cGVuZGluZ19sZW4pIHsKLQkJaW50IGZsZW4gPSA0IC0gbWN0eC0+cGVuZGluZ19sZW47Ci0JCWlmIChmbGVuID4gbGVuKQotCQkJZmxlbiA9IGxlbjsKLQkJbWVtY3B5KCZtY3R4LT5wZW5kaW5nW21jdHgtPnBlbmRpbmdfbGVuXSwgZGF0YSwgZmxlbik7Ci0JCW1jdHgtPnBlbmRpbmdfbGVuICs9IGZsZW47Ci0JCWRhdGEgKz0gZmxlbjsKLQkJbGVuIC09IGZsZW47Ci0KLQkJaWYgKG1jdHgtPnBlbmRpbmdfbGVuIDwgNCkKLQkJCXJldHVybjsKLQotCQltY3R4LT5sIF49IGdldF9sZTMyKG1jdHgtPnBlbmRpbmcpOwotCQltaWNoYWVsX2Jsb2NrKG1jdHgtPmwsIG1jdHgtPnIpOwotCQltY3R4LT5wZW5kaW5nX2xlbiA9IDA7Ci0JfQotCi0Jd2hpbGUgKGxlbiA+PSA0KSB7Ci0JCW1jdHgtPmwgXj0gZ2V0X2xlMzIoZGF0YSk7Ci0JCW1pY2hhZWxfYmxvY2sobWN0eC0+bCwgbWN0eC0+cik7Ci0JCWRhdGEgKz0gNDsKLQkJbGVuIC09IDQ7Ci0JfQotCi0JaWYgKGxlbiA+IDApIHsKLQkJbWN0eC0+cGVuZGluZ19sZW4gPSBsZW47Ci0JCW1lbWNweShtY3R4LT5wZW5kaW5nLCBkYXRhLCBsZW4pOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCBtaWNoYWVsX2ZpbmFsKHZvaWQgKmN0eCwgdTggKm91dCkKLXsKLQlzdHJ1Y3QgbWljaGFlbF9taWNfY3R4ICptY3R4ID0gY3R4OwotCXU4ICpkYXRhID0gbWN0eC0+cGVuZGluZzsKLQotCS8qIExhc3QgYmxvY2sgYW5kIHBhZGRpbmcgKDB4NWEsIDQuLjcgeCAwKSAqLwotCXN3aXRjaCAobWN0eC0+cGVuZGluZ19sZW4pIHsKLQljYXNlIDA6Ci0JCW1jdHgtPmwgXj0gMHg1YTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQltY3R4LT5sIF49IGRhdGFbMF0gfCAweDVhMDA7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJbWN0eC0+bCBePSBkYXRhWzBdIHwgKGRhdGFbMV0gPDwgOCkgfCAweDVhMDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQltY3R4LT5sIF49IGRhdGFbMF0gfCAoZGF0YVsxXSA8PCA4KSB8IChkYXRhWzJdIDw8IDE2KSB8Ci0JCQkweDVhMDAwMDAwOwotCQlicmVhazsKLQl9Ci0JbWljaGFlbF9ibG9jayhtY3R4LT5sLCBtY3R4LT5yKTsKLQkvKiBsIF49IDA7ICovCi0JbWljaGFlbF9ibG9jayhtY3R4LT5sLCBtY3R4LT5yKTsKLQotCXB1dF9sZTMyKG91dCwgbWN0eC0+bCk7Ci0JcHV0X2xlMzIob3V0ICsgNCwgbWN0eC0+cik7Ci19Ci0KLQotc3RhdGljIGludCBtaWNoYWVsX3NldGtleSh2b2lkICpjdHgsIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4sCi0JCQkgIHUzMiAqZmxhZ3MpCi17Ci0Jc3RydWN0IG1pY2hhZWxfbWljX2N0eCAqbWN0eCA9IGN0eDsKLQlpZiAoa2V5bGVuICE9IDgpIHsKLQkJaWYgKGZsYWdzKQotCQkJKmZsYWdzID0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU47Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQltY3R4LT5sID0gZ2V0X2xlMzIoa2V5KTsKLQltY3R4LT5yID0gZ2V0X2xlMzIoa2V5ICsgNCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIG1pY2hhZWxfbWljX2FsZyA9IHsKLQkuY3JhX25hbWUJPSAibWljaGFlbF9taWMiLAotCS5jcmFfZmxhZ3MJPSBDUllQVE9fQUxHX1RZUEVfRElHRVNULAotCS5jcmFfYmxvY2tzaXplCT0gOCwKLQkuY3JhX2N0eHNpemUJPSBzaXplb2Yoc3RydWN0IG1pY2hhZWxfbWljX2N0eCksCi0JLmNyYV9tb2R1bGUJPSBUSElTX01PRFVMRSwKLQkuY3JhX2xpc3QJPSBMSVNUX0hFQURfSU5JVChtaWNoYWVsX21pY19hbGcuY3JhX2xpc3QpLAotCS5jcmFfdQkJPSB7IC5kaWdlc3QgPSB7Ci0JLmRpYV9kaWdlc3RzaXplCT0gOCwKLQkuZGlhX2luaXQJPSBtaWNoYWVsX2luaXQsCi0JLmRpYV91cGRhdGUJPSBtaWNoYWVsX3VwZGF0ZSwKLQkuZGlhX2ZpbmFsCT0gbWljaGFlbF9maW5hbCwKLQkuZGlhX3NldGtleQk9IG1pY2hhZWxfc2V0a2V5IH0gfQotfTsKLQotCi1zdGF0aWMgaW50IF9faW5pdCBtaWNoYWVsX21pY19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl9hbGcoJm1pY2hhZWxfbWljX2FsZyk7Ci19Ci0KLQotc3RhdGljIHZvaWQgX19leGl0IG1pY2hhZWxfbWljX2V4aXQodm9pZCkKLXsKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJm1pY2hhZWxfbWljX2FsZyk7Ci19Ci0KLQotbW9kdWxlX2luaXQobWljaGFlbF9taWNfaW5pdCk7Ci1tb2R1bGVfZXhpdChtaWNoYWVsX21pY19leGl0KTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNaWNoYWVsIE1JQyIpOwotTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9wcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3Byb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQyNmRmZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3Byb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogU2NhdHRlcmxpc3QgQ3J5cHRvZ3JhcGhpYyBBUEkuCi0gKgotICogUHJvY2ZzIGluZm9ybWF0aW9uLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLS8vI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgotI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKLSNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgImludGVybmFsLmgiCi0KLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGNyeXB0b19hbGdfbGlzdDsKLWV4dGVybiBzdHJ1Y3Qgcndfc2VtYXBob3JlIGNyeXB0b19hbGdfc2VtOwotCi1zdGF0aWMgdm9pZCAqY19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnY7Ci0JbG9mZl90IG4gPSAqcG9zOwotCi0JZG93bl9yZWFkKCZjcnlwdG9fYWxnX3NlbSk7Ci0JbGlzdF9mb3JfZWFjaCh2LCAmY3J5cHRvX2FsZ19saXN0KQotCQlpZiAoIW4tLSkKLQkJCXJldHVybiBsaXN0X2VudHJ5KHYsIHN0cnVjdCBjcnlwdG9fYWxnLCBjcmFfbGlzdCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkICpjX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwLCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp2ID0gcDsKLQotCSgqcG9zKSsrOwotCXYgPSB2LT5uZXh0OwotCXJldHVybiAodiA9PSAmY3J5cHRvX2FsZ19saXN0KSA/Ci0JCU5VTEwgOiBsaXN0X2VudHJ5KHYsIHN0cnVjdCBjcnlwdG9fYWxnLCBjcmFfbGlzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCi17Ci0JdXBfcmVhZCgmY3J5cHRvX2FsZ19zZW0pOwotfQotCi1zdGF0aWMgaW50IGNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCi17Ci0Jc3RydWN0IGNyeXB0b19hbGcgKmFsZyA9IChzdHJ1Y3QgY3J5cHRvX2FsZyAqKXA7Ci0KLQlzZXFfcHJpbnRmKG0sICJuYW1lICAgICAgICAgOiAlc1xuIiwgYWxnLT5jcmFfbmFtZSk7Ci0Jc2VxX3ByaW50ZihtLCAibW9kdWxlICAgICAgIDogJXNcbiIsCi0JCSAgIChhbGctPmNyYV9tb2R1bGUgPwotCQkgICAgYWxnLT5jcmFfbW9kdWxlLT5uYW1lIDoKLQkJICAgICJrZXJuZWwiKSk7Ci0KLQlzd2l0Y2ggKGFsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19UWVBFX01BU0spIHsKLQljYXNlIENSWVBUT19BTEdfVFlQRV9DSVBIRVI6Ci0JCXNlcV9wcmludGYobSwgInR5cGUgICAgICAgICA6IGNpcGhlclxuIik7Ci0JCXNlcV9wcmludGYobSwgImJsb2Nrc2l6ZSAgICA6ICV1XG4iLCBhbGctPmNyYV9ibG9ja3NpemUpOwotCQlzZXFfcHJpbnRmKG0sICJtaW4ga2V5c2l6ZSAgOiAldVxuIiwKLQkJCQkJYWxnLT5jcmFfY2lwaGVyLmNpYV9taW5fa2V5c2l6ZSk7Ci0JCXNlcV9wcmludGYobSwgIm1heCBrZXlzaXplICA6ICV1XG4iLAotCQkJCQlhbGctPmNyYV9jaXBoZXIuY2lhX21heF9rZXlzaXplKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENSWVBUT19BTEdfVFlQRV9ESUdFU1Q6Ci0JCXNlcV9wcmludGYobSwgInR5cGUgICAgICAgICA6IGRpZ2VzdFxuIik7Ci0JCXNlcV9wcmludGYobSwgImJsb2Nrc2l6ZSAgICA6ICV1XG4iLCBhbGctPmNyYV9ibG9ja3NpemUpOwotCQlzZXFfcHJpbnRmKG0sICJkaWdlc3RzaXplICAgOiAldVxuIiwKLQkJCSAgIGFsZy0+Y3JhX2RpZ2VzdC5kaWFfZGlnZXN0c2l6ZSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTOgotCQlzZXFfcHJpbnRmKG0sICJ0eXBlICAgICAgICAgOiBjb21wcmVzc2lvblxuIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXNlcV9wcmludGYobSwgInR5cGUgICAgICAgICA6IHVua25vd25cbiIpOwotCQlicmVhazsKLQl9Ci0KLQlzZXFfcHV0YyhtLCAnXG4nKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjcnlwdG9fc2VxX29wcyA9IHsKLQkuc3RhcnQJCT0gY19zdGFydCwKLQkubmV4dAkJPSBjX25leHQsCi0JLnN0b3AJCT0gY19zdG9wLAotCS5zaG93CQk9IGNfc2hvdwotfTsKLQotc3RhdGljIGludCBjcnlwdG9faW5mb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzZXFfb3BlbihmaWxlLCAmY3J5cHRvX3NlcV9vcHMpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2NyeXB0b19vcHMgPSB7Ci0JLm9wZW4JCT0gY3J5cHRvX2luZm9fb3BlbiwKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNlcV9yZWxlYXNlCi19OwotCi12b2lkIF9faW5pdCBjcnlwdG9faW5pdF9wcm9jKHZvaWQpCi17Ci0JcHJvY19jcmVhdGUoImNyeXB0byIsIDAsIE5VTEwsICZwcm9jX2NyeXB0b19vcHMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0JBUHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0JBUHJvYy5jCmluZGV4IDM2ODRkYTMuLjdiZjU1ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfQkFQcm9jLmMKQEAgLTEzLDcgKzEzLDcgQEAKICAqCSAgICAgdTE2CQkJVGltZSAvL2luZGljYXRlIHRpbWUgZGVsYXkuCiAgKiAgb3V0cHV0OiAgbm9uZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEFjdGl2YXRlQkFFbnRyeShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgUEJBX1JFQ09SRCBwQkEsIHUxNiBUaW1lKQorc3RhdGljIHZvaWQgQWN0aXZhdGVCQUVudHJ5KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBQQkFfUkVDT1JEIHBCQSwgdTE2IFRpbWUpCiB7CiAJcEJBLT5iVmFsaWQgPSB0cnVlOwogCWlmKFRpbWUgIT0gMCkKQEAgLTI1LDcgKzI1LDcgQEAKICAqICAgaW5wdXQ6ICBQQkFfUkVDT1JECQkJcEJBICAvL0JBIGVudHJ5IHRvIGJlIGRpc2FibGVkCiAgKiAgb3V0cHV0OiAgbm9uZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIERlQWN0aXZhdGVCQUVudHJ5KCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgUEJBX1JFQ09SRCBwQkEpCitzdGF0aWMgdm9pZCBEZUFjdGl2YXRlQkFFbnRyeShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgUEJBX1JFQ09SRCBwQkEpCiB7CiAJcEJBLT5iVmFsaWQgPSBmYWxzZTsKIAlkZWxfdGltZXJfc3luYygmcEJBLT5UaW1lcik7CkBAIC0zNyw3ICszNyw3IEBACiAgKiAgb3V0cHV0OiAgbm9uZQogICogIG5vdGljZTogIEFzIFBUWF9UU19SRUNPUkQgc3RydWN0dXJlIHdpbGwgYmUgZGVmaW5lZCBpbiBRT1MsIHNvIHdhaXQgdG8gYmUgbWVyZ2VkLiAvL0ZJWE1FCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IFR4VHNEZWxldGVCQSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIFBUWF9UU19SRUNPUkQJcFR4VHMpCitzdGF0aWMgdTggVHhUc0RlbGV0ZUJBKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBQVFhfVFNfUkVDT1JEIHBUeFRzKQogewogCVBCQV9SRUNPUkQJCXBBZG1pdHRlZEJhID0gJnBUeFRzLT5UeEFkbWl0dGVkQkFSZWNvcmQ7ICAvL1RoZXNlIHR3byBCQSBlbnRyaWVzIG11c3QgZXhpc3QgaW4gVFMgc3RydWN0dXJlCiAJUEJBX1JFQ09SRAkJcFBlbmRpbmdCYSA9ICZwVHhUcy0+VHhQZW5kaW5nQkFSZWNvcmQ7CkBAIC02Nyw3ICs2Nyw3IEBACiAgKiAgb3V0cHV0OiAgbm9uZQogICogIG5vdGljZTogIEFzIFBSWF9UU19SRUNPUkQgc3RydWN0dXJlIHdpbGwgYmUgZGVmaW5lZCBpbiBRT1MsIHNvIHdhaXQgdG8gYmUgbWVyZ2VkLiAvL0ZJWE1FLCBzYW1lIHdpdGggYWJvdmUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggUnhUc0RlbGV0ZUJBKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgUFJYX1RTX1JFQ09SRAlwUnhUcykKK3N0YXRpYyB1OCBSeFRzRGVsZXRlQkEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIFBSWF9UU19SRUNPUkQgcFJ4VHMpCiB7CiAJUEJBX1JFQ09SRAkJcEJhID0gJnBSeFRzLT5SeEFkbWl0dGVkQkFSZWNvcmQ7CiAJdTgJCQliU2VuZERFTEJBID0gZmFsc2U7CkBAIC0zMDcsNyArMzA3LDkgQEAKICAqICBub3RpY2U6IElmIGFueSBwb3NzaWJsZSwgcGxlYXNlIGhpZGUgcEJBIGluIGllZWUuIEFuZCB0ZW1wb3JhcmlseSB1c2UgTWFuYWdlIFF1ZXVlIGFzIHNvZnRtYWNfbWdtdF94bWl0KCkgdXN1YWxseSBkb2VzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBpZWVlODAyMTFfc2VuZF9ERUxCQShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRzdCwgUEJBX1JFQ09SRCBwQkEsIFRSX1NFTEVDVCBUeFJ4U2VsZWN0LCB1MTYgUmVhc29uQ29kZSkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zZW5kX0RFTEJBKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZHN0LAorCQkJCSBQQkFfUkVDT1JEIHBCQSwgVFJfU0VMRUNUIFR4UnhTZWxlY3QsCisJCQkJIHUxNiBSZWFzb25Db2RlKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCXNrYiA9IGllZWU4MDIxMV9ERUxCQShpZWVlLCBkc3QsIHBCQSwgVHhSeFNlbGVjdCwgUmVhc29uQ29kZSk7IC8vY29uc3RydWN0IEFDVF9BRERCQVJTUCBmcmFtZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9IVFByb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9IVFByb2MuYwppbmRleCBlOTU2ZGE1Li41M2VjMmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfSFRQcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0hUUHJvYy5jCkBAIC0yMTksNyArMjE5LDcgQEAKIC8qCiAqCVJldHVybjoJCXRydWUgaWYgc3RhdGlvbiBpbiBoYWxmIG4gbW9kZSBhbmQgQVAgc3VwcG9ydHMgNDAgYncKICovCi1ib29sIElzSFRIYWxmTm1vZGU0MEJhbmR3aWR0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyBib29sIElzSFRIYWxmTm1vZGU0MEJhbmR3aWR0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlib29sCQkJcmV0VmFsdWUgPSBmYWxzZTsKIAlQUlRfSElHSF9USFJPVUdIUFVUCSBwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKQEAgLTIzOCw3ICsyMzgsNyBAQAogCXJldHVybiByZXRWYWx1ZTsKIH0KIAotYm9vbCBJc0hUSGFsZk5tb2RlU0dJKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBib29sIGlzNDBNSHopCitzdGF0aWMgYm9vbCBJc0hUSGFsZk5tb2RlU0dJKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBib29sIGlzNDBNSHopCiB7CiAJYm9vbAkJCXJldFZhbHVlID0gZmFsc2U7CiAJUFJUX0hJR0hfVEhST1VHSFBVVAkgcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CkBAIC0zNzYsNyArMzc2LDcgQEAKICAqICByZXR1cm46CiAgKiAgbm90aWNlOgogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEhUSU9UUGVlckRldGVybWluZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyB2b2lkIEhUSU9UUGVlckRldGVybWluZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwogCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0ID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKQEAgLTQxMyw3ICs0MTMsNyBAQAogICogIG91dHB1dDogIG5vbmUKICAqICByZXR1cm46ICByZXR1cm4gMSBpZiBkcml2ZXIgc2hvdWxkIGRlY2xhcmUgTUNTMTMgb25seShvdGhlcndpc2UgcmV0dXJuIDApCiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBIVElPVEFjdElzRGlzYWJsZU1DUzE0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqUGVlck1hY0FkZHIpCitzdGF0aWMgdTggSFRJT1RBY3RJc0Rpc2FibGVNQ1MxNChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKlBlZXJNYWNBZGRyKQogewogCXU4IHJldCA9IDA7CiAJcmV0dXJuIHJldDsKQEAgLTQzMiw3ICs0MzIsNyBAQAogKiBSZXR1cm46CXRydWUgaWYgZHJpdmVyIHNob3VsZCBkaXNhYmxlIE1DUzE1CiAqIDIwMDguMDQuMTUJRW1pbHkKICovCi1ib29sIEhUSU9UQWN0SXNEaXNhYmxlTUNTMTUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgYm9vbCBIVElPVEFjdElzRGlzYWJsZU1DUzE1KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCWJvb2wgcmV0VmFsdWUgPSBmYWxzZTsKIApAQCAtNDY5LDcgKzQ2OSw4IEBACiAqIFJldHVybjoJdHJ1ZSBpZiBkcml2ZXIgc2hvdWxkIGRpc2FibGUgYWxsIHR3byBzcGF0aWFsIHN0cmVhbSBwYWNrZXQKICogMjAwOC4wNC4yMQlFbWlseQogKi8KLWJvb2wgSFRJT1RBY3RJc0Rpc2FibGVNQ1NUd29TcGF0aWFsU3RyZWFtKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqUGVlck1hY0FkZHIpCitzdGF0aWMgYm9vbCBIVElPVEFjdElzRGlzYWJsZU1DU1R3b1NwYXRpYWxTdHJlYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJCQkgdTggKlBlZXJNYWNBZGRyKQogewogCWJvb2wgcmV0VmFsdWUgPSBmYWxzZTsKIApAQCAtNDg2LDcgKzQ4Nyw4IEBACiAgKiAgb3V0cHV0OiAgbm9uZQogICogIHJldHVybjogIHJldHVybiAxIGlmIGRyaXZlciBzaG91bGQgZGlzYWJsZSBFRENBIHR1cmJvIG1vZGUob3RoZXJ3aXNlIHJldHVybiAwKQogICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggSFRJT1RBY3RJc0Rpc2FibGVFRENBVHVyYm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpQZWVyTWFjQWRkcikKK3N0YXRpYyB1OCBIVElPVEFjdElzRGlzYWJsZUVEQ0FUdXJibyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICAgIHU4ICpQZWVyTWFjQWRkcikKIHsKIAl1OAlyZXRWYWx1ZSA9IGZhbHNlOwkvLyBkZWZhdWx0IGVuYWJsZSBFRENBIFR1cmJvIG1vZGUuCiAJLy8gU2V0IHNwZWNpZmljIEVEQ0EgcGFyYW1ldGVyIGZvciBkaWZmZXJlbnQgQVAgaW4gRE0gaGFuZGxlci4KQEAgLTUwMCw3ICs1MDIsNyBAQAogICogIG91dHB1dDogIG5vbmUKICAqICByZXR1cm46ICByZXR1cm4gMSBpZiB0cnVlCiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBIVElPVEFjdElzTWdudFVzZUNDSzZNKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaykKK3N0YXRpYyB1OCBIVElPVEFjdElzTWdudFVzZUNDSzZNKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaykKIHsKIAl1OAlyZXRWYWx1ZSA9IDA7CiAKQEAgLTUxNSw3ICs1MTcsNyBAQAogCXJldHVybiByZXRWYWx1ZTsKIH0KIAotdTggSFRJT1RBY3RJc0NDREZzeW5jKHU4ICpQZWVyTWFjQWRkcikKK3N0YXRpYyB1OCBIVElPVEFjdElzQ0NERnN5bmModTggKlBlZXJNYWNBZGRyKQogewogCXU4CXJldFZhbHVlID0gMDsKIAlpZigJKG1lbWNtcChQZWVyTWFjQWRkciwgVU5LTk9XTl9CT1JBRENPTSwgMyk9PTApIHx8CkBAIC03OTIsNyArNzk0LDcgQEAKICAqICByZXR1cm46ICBhbHdheXMgd2UgcmV0dXJuIHRydWUKICAqICBub3RpY2U6CiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBIVF9QaWNrTUNTUmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKnBPcGVyYXRlTUNTKQorc3RhdGljIHU4IEhUX1BpY2tNQ1NSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqcE9wZXJhdGVNQ1MpCiB7CiAJdTgJCQkJCWk7CiAJaWYgKHBPcGVyYXRlTUNTID09IE5VTEwpCkBAIC05MDcsNyArOTA5LDggQEAKICoqCiAqKiBccEhUU3VwcG9ydGVkQ2FwOiB0aGUgY29ubmVjdGVkIFNUQSdzIHN1cHBvcnRlZCByYXRlIENhcGFiaWxpdHkgZWxlbWVudAogKi8KLXU4IEhURmlsdGVyTUNTUmF0ZSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpwU3VwcG9ydE1DUywgdTggKnBPcGVyYXRlTUNTKQorc3RhdGljIHU4IEhURmlsdGVyTUNTUmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKnBTdXBwb3J0TUNTLAorCQkJICB1OCAqcE9wZXJhdGVNQ1MpCiB7CiAKIAl1OCBpPTA7CkBAIC0xMzE3LDUxICsxMzIwLDYgQEAKIAl9CiB9CiAKLXZvaWQgSFRVc2VEZWZhdWx0U2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQlQUlRfSElHSF9USFJPVUdIUFVUIHBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwotLy8JdTgJcmVnQndPcE1vZGU7Ci0KLQlpZihwSFRJbmZvLT5iRW5hYmxlSFQpCi0JewotCQlwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9IHRydWU7Ci0KLQkJcEhUSW5mby0+YkN1clN1cHBDQ0sgPSBwSFRJbmZvLT5iUmVnU3VwcENDSzsKLQotCQlwSFRJbmZvLT5iQ3VyQlc0ME1IeiA9IHBIVEluZm8tPmJSZWdCVzQwTUh6OwotCi0JCXBIVEluZm8tPmJDdXJTaG9ydEdJMjBNSHo9IHBIVEluZm8tPmJSZWdTaG9ydEdJMjBNSHo7Ci0KLQkJcEhUSW5mby0+YkN1clNob3J0R0k0ME1Iej0gcEhUSW5mby0+YlJlZ1Nob3J0R0k0ME1IejsKLQotCQlwSFRJbmZvLT5iQ3VycmVudF9BTVNEVV9TdXBwb3J0ID0gcEhUSW5mby0+YkFNU0RVX1N1cHBvcnQ7Ci0KLQkJcEhUSW5mby0+bkN1cnJlbnRfQU1TRFVfTWF4U2l6ZSA9IHBIVEluZm8tPm5BTVNEVV9NYXhTaXplOwotCi0JCXBIVEluZm8tPmJDdXJyZW50QU1QRFVFbmFibGUgPSBwSFRJbmZvLT5iQU1QRFVFbmFibGU7Ci0KLQkJcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yID0gcEhUSW5mby0+QU1QRFVfRmFjdG9yOwotCi0JCXBIVEluZm8tPkN1cnJlbnRNUERVRGVuc2l0eSA9IHBIVEluZm8tPk1QRFVfRGVuc2l0eTsKLQotCQkvLyBTZXQgQldPcE1vZGUgcmVnaXN0ZXIKLQotCQkvL3VwZGF0ZSBSQVRSIGluZGV4MAotCQlIVEZpbHRlck1DU1JhdGUoaWVlZSwgaWVlZS0+UmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwgaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCk7Ci0JLy9mdW5jdGlvbiBiZWxvdyBpcyBub3QgaW1wbGVtZW50ZWQgYXQgYWxsLiBXQgotI2lmZGVmIFRPRE8KLQkJQWRhcHRlci0+SGFsRnVuYy5Jbml0SGFsUkFUUlRhYmxlSGFuZGxlciggQWRhcHRlciwgJnBNZ250SW5mby0+ZG90MTFPcGVyYXRpb25hbFJhdGVTZXQsIHBNZ250SW5mby0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCk7Ci0jZW5kaWYKLQkJaWVlZS0+SFRIaWdoZXN0T3BlcmFSYXRlID0gSFRHZXRIaWdoZXN0TUNTUmF0ZShpZWVlLCBpZWVlLT5kb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0LCBNQ1NfRklMVEVSX0FMTCk7Ci0JCWllZWUtPkhUQ3VycmVudE9wZXJhUmF0ZSA9IGllZWUtPkhUSGlnaGVzdE9wZXJhUmF0ZTsKLQotCX0KLQllbHNlCi0JewotCQlwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9IGZhbHNlOwotCX0KLQlyZXR1cm47Ci19CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqZnVuY3Rpb246ICBjaGVjayB3aGV0aGVyIEhUIGNvbnRyb2wgZmllbGQgZXhpc3RzCiAgKiAgIGlucHV0OiAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UJKmllZWUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9UU1Byb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9UU1Byb2MuYwppbmRleCAzMDU4MTIwLi40MjZmMjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfVFNQcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1RTUHJvYy5jCkBAIC0zLDEzICszLDEzIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgInJ0bDgxOXhfVFMuaCIKIAotdm9pZCBUc1NldHVwVGltZU91dCh1bnNpZ25lZCBsb25nIGRhdGEpCitzdGF0aWMgdm9pZCBUc1NldHVwVGltZU91dCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJLy8gTm90IGltcGxlbWVudCB5ZXQKIAkvLyBUaGlzIGlzIHVzZWQgZm9yIFdNTVNBIGFuZCBBQ00gLCB0aGF0IHdvdWxkIHNlbmQgQUREVFNSZXEgZnJhbWUuCiB9CiAKLXZvaWQgVHNJbmFjdFRpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQorc3RhdGljIHZvaWQgVHNJbmFjdFRpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQogewogCS8vIE5vdCBpbXBsZW1lbnQgeWV0CiAJLy8gVGhpcyBpcyB1c2VkIGZvciBXTU1TQSBhbmQgQUNNLgpAQCAtMjIsNyArMjIsNyBAQAogICogIHJldHVybjogIE5VTEwKICAqICBub3RpY2U6CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUnhQa3RQZW5kaW5nVGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCitzdGF0aWMgdm9pZCBSeFBrdFBlbmRpbmdUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlQUlhfVFNfUkVDT1JECXBSeFRzID0gKFBSWF9UU19SRUNPUkQpZGF0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihwUnhUcywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIFJ4VHNSZWNvcmRbcFJ4VHMtPm51bV0pOwpAQCAtOTksNyArOTksNyBAQAogICogIHJldHVybjogIE5VTEwKICAqICBub3RpY2U6CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgVHNBZGRCYVByb2Nlc3ModW5zaWduZWQgbG9uZyBkYXRhKQorc3RhdGljIHZvaWQgVHNBZGRCYVByb2Nlc3ModW5zaWduZWQgbG9uZyBkYXRhKQogewogCVBUWF9UU19SRUNPUkQJcFR4VHMgPSAoUFRYX1RTX1JFQ09SRClkYXRhOwogCXU4IG51bSA9IHBUeFRzLT5udW07CkBAIC0xMTAsNyArMTEwLDcgQEAKIH0KIAogCi12b2lkIFJlc2V0VHNDb21tb25JbmZvKFBUU19DT01NT05fSU5GTwlwVHNDb21tb25JbmZvKQorc3RhdGljIHZvaWQgUmVzZXRUc0NvbW1vbkluZm8oUFRTX0NPTU1PTl9JTkZPIHBUc0NvbW1vbkluZm8pCiB7CiAJbWVtc2V0KHBUc0NvbW1vbkluZm8tPkFkZHIsIDAsIDYpOwogCW1lbXNldCgmcFRzQ29tbW9uSW5mby0+VFNwZWMsIDAsIHNpemVvZihUU1BFQ19CT0RZKSk7CkBAIC0xMTksNyArMTE5LDcgQEAKIAlwVHNDb21tb25JbmZvLT5UQ2xhc051bSA9IDA7CiB9CiAKLXZvaWQgUmVzZXRUeFRzRW50cnkoUFRYX1RTX1JFQ09SRCBwVFMpCitzdGF0aWMgdm9pZCBSZXNldFR4VHNFbnRyeShQVFhfVFNfUkVDT1JEIHBUUykKIHsKIAlSZXNldFRzQ29tbW9uSW5mbygmcFRTLT5Uc0NvbW1vbkluZm8pOwogCXBUUy0+VHhDdXJTZXEgPSAwOwpAQCAtMTMwLDcgKzEzMCw3IEBACiAJUmVzZXRCYUVudHJ5KCZwVFMtPlR4UGVuZGluZ0JBUmVjb3JkKTsKIH0KIAotdm9pZCBSZXNldFJ4VHNFbnRyeShQUlhfVFNfUkVDT1JEIHBUUykKK3N0YXRpYyB2b2lkIFJlc2V0UnhUc0VudHJ5KFBSWF9UU19SRUNPUkQgcFRTKQogewogCVJlc2V0VHNDb21tb25JbmZvKCZwVFMtPlRzQ29tbW9uSW5mbyk7CiAJcFRTLT5SeEluZGljYXRlU2VxID0gMHhmZmZmOyAvLyBUaGlzIGluZGljYXRlIHRoZSBSeEluZGljYXRlU2VxIGlzIG5vdCB1c2VkIG5vdyEhCkBAIC0yMjQsNyArMjI0LDggQEAKIAogfQogCi12b2lkIEFkbWl0VFMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIFBUU19DT01NT05fSU5GTyBwVHNDb21tb25JbmZvLCB1MzIgSW5hY3RUaW1lKQorc3RhdGljIHZvaWQgQWRtaXRUUyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJICAgIFBUU19DT01NT05fSU5GTyBwVHNDb21tb25JbmZvLCB1MzIgSW5hY3RUaW1lKQogewogCWRlbF90aW1lcl9zeW5jKCZwVHNDb21tb25JbmZvLT5TZXR1cFRpbWVyKTsKIAlkZWxfdGltZXJfc3luYygmcFRzQ29tbW9uSW5mby0+SW5hY3RUaW1lcik7CkBAIC0yMzQsNyArMjM1LDkgQEAKIH0KIAogCi1QVFNfQ09NTU9OX0lORk8gU2VhcmNoQWRtaXRUUlN0cmVhbShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKkFkZHIsIHU4IFRJRCwgVFJfU0VMRUNUCVR4UnhTZWxlY3QpCitzdGF0aWMgUFRTX0NPTU1PTl9JTkZPIFNlYXJjaEFkbWl0VFJTdHJlYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJCSAgIHU4ICpBZGRyLCB1OCBUSUQsCisJCQkJCSAgIFRSX1NFTEVDVCBUeFJ4U2VsZWN0KQogewogCS8vRElSRUNUSU9OX1ZBTFVFCWRpcjsKIAl1OAlkaXI7CkBAIC0zMDksMTQgKzMxMiw5IEBACiAJCXJldHVybiBOVUxMOwogfQogCi12b2lkIE1ha2VUU0VudHJ5KAotCQlQVFNfQ09NTU9OX0lORk8JcFRzQ29tbW9uSW5mbywKLQkJdTgJCSpBZGRyLAotCQlQVFNQRUNfQk9EWQlwVFNQRUMsCi0JCVBRT1NfVENMQVMJcFRDTEFTLAotCQl1OAkJVENMQVNfTnVtLAotCQl1OAkJVENMQVNfUHJvYwotCSkKK3N0YXRpYyB2b2lkIE1ha2VUU0VudHJ5KFBUU19DT01NT05fSU5GTyBwVHNDb21tb25JbmZvLCB1OCAqQWRkciwKKwkJCVBUU1BFQ19CT0RZIHBUU1BFQywgUFFPU19UQ0xBUyBwVENMQVMsIHU4IFRDTEFTX051bSwKKwkJCXU4IFRDTEFTX1Byb2MpCiB7CiAJdTgJY291bnQ7CiAKQEAgLTQ3MiwxMSArNDcwLDggQEAKIAl9CiB9CiAKLXZvaWQgUmVtb3ZlVHNFbnRyeSgKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZQkJKmllZWUsCi0JUFRTX0NPTU1PTl9JTkZPCQkJcFRzLAotCVRSX1NFTEVDVAkJCVR4UnhTZWxlY3QKLQkpCitzdGF0aWMgdm9pZCBSZW1vdmVUc0VudHJ5KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBQVFNfQ09NTU9OX0lORk8gcFRzLAorCQkJICBUUl9TRUxFQ1QgVHhSeFNlbGVjdCkKIHsKIAkvL3UzMiBmbGFncyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bF9jcnlwdG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsX2NyeXB0by5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2M4NzEwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsX2NyeXB0by5oCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qCi0gKiBTY2F0dGVybGlzdCBDcnlwdG9ncmFwaGljIEFQSS4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQotICoKLSAqIFBvcnRpb25zIGRlcml2ZWQgZnJvbSBDcnlwdG9hcGksIGJ5IEFsZXhhbmRlciBLamVsZGFhcyA8YXN0b3JAZmFzdC5ubz4KLSAqIGFuZCBOZXR0bGUsIGJ5IE5pZWxzIE3psIhsZXIuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLSNpZm5kZWYgX0xJTlVYX0NSWVBUT19ICi0jZGVmaW5lIF9MSU5VWF9DUllQVE9fSAotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vZXJybm8uaD4KLQotI2RlZmluZSBjcnlwdG9fcmVnaXN0ZXJfYWxnIGNyeXB0b19yZWdpc3Rlcl9hbGdfcnNsCi0jZGVmaW5lIGNyeXB0b191bnJlZ2lzdGVyX2FsZyBjcnlwdG9fdW5yZWdpc3Rlcl9hbGdfcnNsCi0jZGVmaW5lIGNyeXB0b19hbGxvY190Zm0gY3J5cHRvX2FsbG9jX3RmbV9yc2wKLSNkZWZpbmUgY3J5cHRvX2ZyZWVfdGZtIGNyeXB0b19mcmVlX3RmbV9yc2wKLSNkZWZpbmUgY3J5cHRvX2FsZ19hdmFpbGFibGUgY3J5cHRvX2FsZ19hdmFpbGFibGVfcnNsCi0KLS8qCi0gKiBBbGdvcml0aG0gbWFza3MgYW5kIHR5cGVzLgotICovCi0jZGVmaW5lIENSWVBUT19BTEdfVFlQRV9NQVNLCQkweDAwMDAwMGZmCi0jZGVmaW5lIENSWVBUT19BTEdfVFlQRV9DSVBIRVIJCTB4MDAwMDAwMDEKLSNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0RJR0VTVAkJMHgwMDAwMDAwMgotI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1MJMHgwMDAwMDAwNAotCi0vKgotICogVHJhbnNmb3JtIG1hc2tzIGFuZCB2YWx1ZXMgKGZvciBjcnRfZmxhZ3MpLgotICovCi0jZGVmaW5lIENSWVBUT19URk1fTU9ERV9NQVNLCQkweDAwMDAwMGZmCi0jZGVmaW5lIENSWVBUT19URk1fUkVRX01BU0sJCTB4MDAwZmZmMDAKLSNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfTUFTSwkJMHhmZmYwMDAwMAotCi0jZGVmaW5lIENSWVBUT19URk1fTU9ERV9FQ0IJCTB4MDAwMDAwMDEKLSNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0NCQwkJMHgwMDAwMDAwMgotI2RlZmluZSBDUllQVE9fVEZNX01PREVfQ0ZCCQkweDAwMDAwMDA0Ci0jZGVmaW5lIENSWVBUT19URk1fTU9ERV9DVFIJCTB4MDAwMDAwMDgKLQotI2RlZmluZSBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWQkJMHgwMDAwMDEwMAotI2RlZmluZSBDUllQVE9fVEZNX1JFU19XRUFLX0tFWQkJMHgwMDEwMDAwMAotI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTgkweDAwMjAwMDAwCi0jZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9LRVlfU0NIRUQJMHgwMDQwMDAwMAotI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfQkxPQ0tfTEVOCTB4MDA4MDAwMDAKLSNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0ZMQUdTCTB4MDEwMDAwMDAKLQotLyoKLSAqIE1pc2NlbGxhbmVvdXMgc3R1ZmYuCi0gKi8KLSNkZWZpbmUgQ1JZUFRPX1VOU1BFQwkJCTAKLSNkZWZpbmUgQ1JZUFRPX01BWF9BTEdfTkFNRQkJNjQKLQotc3RydWN0IHNjYXR0ZXJsaXN0OwotCi0vKgotICogQWxnb3JpdGhtczogbW9kdWxhciBjcnlwdG8gYWxnb3JpdGhtIGltcGxlbWVudGF0aW9ucywgbWFuYWdlZAotICogdmlhIGNyeXB0b19yZWdpc3Rlcl9hbGcoKSBhbmQgY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCkuCi0gKi8KLXN0cnVjdCBjaXBoZXJfYWxnIHsKLQl1bnNpZ25lZCBpbnQgY2lhX21pbl9rZXlzaXplOwotCXVuc2lnbmVkIGludCBjaWFfbWF4X2tleXNpemU7Ci0JaW50ICgqY2lhX3NldGtleSkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LAotCQkJICB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKTsKLQl2b2lkICgqY2lhX2VuY3J5cHQpKHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7Ci0Jdm9pZCAoKmNpYV9kZWNyeXB0KSh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwotfTsKLQotc3RydWN0IGRpZ2VzdF9hbGcgewotCXVuc2lnbmVkIGludCBkaWFfZGlnZXN0c2l6ZTsKLQl2b2lkICgqZGlhX2luaXQpKHZvaWQgKmN0eCk7Ci0Jdm9pZCAoKmRpYV91cGRhdGUpKHZvaWQgKmN0eCwgY29uc3QgdTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pOwotCXZvaWQgKCpkaWFfZmluYWwpKHZvaWQgKmN0eCwgdTggKm91dCk7Ci0JaW50ICgqZGlhX3NldGtleSkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LAotCQkJICB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKTsKLX07Ci0KLXN0cnVjdCBjb21wcmVzc19hbGcgewotCWludCAoKmNvYV9pbml0KSh2b2lkICpjdHgpOwotCXZvaWQgKCpjb2FfZXhpdCkodm9pZCAqY3R4KTsKLQlpbnQgKCpjb2FfY29tcHJlc3MpKHZvaWQgKmN0eCwgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCi0JCQkgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKLQlpbnQgKCpjb2FfZGVjb21wcmVzcykodm9pZCAqY3R4LCBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKLQkJCSAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7Ci19OwotCi0jZGVmaW5lIGNyYV9jaXBoZXIJY3JhX3UuY2lwaGVyCi0jZGVmaW5lIGNyYV9kaWdlc3QJY3JhX3UuZGlnZXN0Ci0jZGVmaW5lIGNyYV9jb21wcmVzcwljcmFfdS5jb21wcmVzcwotCi1zdHJ1Y3QgY3J5cHRvX2FsZyB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBjcmFfbGlzdDsKLQl1MzIgY3JhX2ZsYWdzOwotCXVuc2lnbmVkIGludCBjcmFfYmxvY2tzaXplOwotCXVuc2lnbmVkIGludCBjcmFfY3R4c2l6ZTsKLQljb25zdCBjaGFyIGNyYV9uYW1lW0NSWVBUT19NQVhfQUxHX05BTUVdOwotCi0JdW5pb24gewotCQlzdHJ1Y3QgY2lwaGVyX2FsZyBjaXBoZXI7Ci0JCXN0cnVjdCBkaWdlc3RfYWxnIGRpZ2VzdDsKLQkJc3RydWN0IGNvbXByZXNzX2FsZyBjb21wcmVzczsKLQl9IGNyYV91OwotCi0Jc3RydWN0IG1vZHVsZSAqY3JhX21vZHVsZTsKLX07Ci0KLS8qCi0gKiBBbGdvcml0aG0gcmVnaXN0cmF0aW9uIGludGVyZmFjZS4KLSAqLwotaW50IGNyeXB0b19yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZyk7Ci1pbnQgY3J5cHRvX3VucmVnaXN0ZXJfYWxnKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpOwotCi0vKgotICogQWxnb3JpdGhtIHF1ZXJ5IGludGVyZmFjZS4KLSAqLwotaW50IGNyeXB0b19hbGdfYXZhaWxhYmxlKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBmbGFncyk7Ci0KLS8qCi0gKiBUcmFuc2Zvcm1zOiB1c2VyLWluc3RhbnRpYXRlZCBvYmplY3RzIHdoaWNoIGVuY2Fwc3VsYXRlIGFsZ29yaXRobXMKLSAqIGFuZCBjb3JlIHByb2Nlc3NpbmcgbG9naWMuICBNYW5hZ2VkIHZpYSBjcnlwdG9fYWxsb2NfdGZtKCkgYW5kCi0gKiBjcnlwdG9fZnJlZV90Zm0oKSwgYXMgd2VsbCBhcyB0aGUgdmFyaW91cyBoZWxwZXJzIGJlbG93LgotICovCi1zdHJ1Y3QgY3J5cHRvX3RmbTsKLQotc3RydWN0IGNpcGhlcl90Zm0gewotCXZvaWQgKmNpdF9pdjsKLQl1bnNpZ25lZCBpbnQgY2l0X2l2c2l6ZTsKLQl1MzIgY2l0X21vZGU7Ci0JaW50ICgqY2l0X3NldGtleSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCSAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbik7Ci0JaW50ICgqY2l0X2VuY3J5cHQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcyk7Ci0JaW50ICgqY2l0X2VuY3J5cHRfaXYpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkJICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KTsKLQlpbnQgKCpjaXRfZGVjcnlwdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKLQlpbnQgKCpjaXRfZGVjcnlwdF9pdikoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpOwotCXZvaWQgKCpjaXRfeG9yX2Jsb2NrKSh1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKLX07Ci0KLXN0cnVjdCBkaWdlc3RfdGZtIHsKLQl2b2lkICgqZGl0X2luaXQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwotCXZvaWQgKCpkaXRfdXBkYXRlKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZyk7Ci0Jdm9pZCAoKmRpdF9maW5hbCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCk7Ci0Jdm9pZCAoKmRpdF9kaWdlc3QpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCQkgICB1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KTsKLQlpbnQgKCpkaXRfc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKTsKLSNpZmRlZiBDT05GSUdfQ1JZUFRPX0hNQUMKLQl2b2lkICpkaXRfaG1hY19ibG9jazsKLSNlbmRpZgotfTsKLQotc3RydWN0IGNvbXByZXNzX3RmbSB7Ci0JaW50ICgqY290X2NvbXByZXNzKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAotCQkJICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7Ci0JaW50ICgqY290X2RlY29tcHJlc3MpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKLQkJCSAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7Ci19OwotCi0jZGVmaW5lIGNydF9jaXBoZXIJY3J0X3UuY2lwaGVyCi0jZGVmaW5lIGNydF9kaWdlc3QJY3J0X3UuZGlnZXN0Ci0jZGVmaW5lIGNydF9jb21wcmVzcwljcnRfdS5jb21wcmVzcwotCi1zdHJ1Y3QgY3J5cHRvX3RmbSB7Ci0KLQl1MzIgY3J0X2ZsYWdzOwotCi0JdW5pb24gewotCQlzdHJ1Y3QgY2lwaGVyX3RmbSBjaXBoZXI7Ci0JCXN0cnVjdCBkaWdlc3RfdGZtIGRpZ2VzdDsKLQkJc3RydWN0IGNvbXByZXNzX3RmbSBjb21wcmVzczsKLQl9IGNydF91OwotCi0Jc3RydWN0IGNyeXB0b19hbGcgKl9fY3J0X2FsZzsKLX07Ci0KLS8qCi0gKiBUcmFuc2Zvcm0gdXNlciBpbnRlcmZhY2UuCi0gKi8KLQotLyoKLSAqIGNyeXB0b19hbGxvY190Zm0oKSB3aWxsIGZpcnN0IGF0dGVtcHQgdG8gbG9jYXRlIGFuIGFscmVhZHkgbG9hZGVkIGFsZ29yaXRobS4KLSAqIElmIHRoYXQgZmFpbHMgYW5kIHRoZSBrZXJuZWwgc3VwcG9ydHMgZHluYW1pY2FsbHkgbG9hZGFibGUgbW9kdWxlcywgaXQKLSAqIHdpbGwgdGhlbiBhdHRlbXB0IHRvIGxvYWQgYSBtb2R1bGUgb2YgdGhlIHNhbWUgbmFtZSBvciBhbGlhcy4gIEEgcmVmY291bnQKLSAqIGlzIGdyYWJiZWQgb24gdGhlIGFsZ29yaXRobSB3aGljaCBpcyB0aGVuIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IHRyYW5zZm9ybS4KLSAqCi0gKiBjcnlwdG9fZnJlZV90Zm0oKSBmcmVlcyB1cCB0aGUgdHJhbnNmb3JtIGFuZCBhbnkgYXNzb2NpYXRlZCByZXNvdXJjZXMsCi0gKiB0aGVuIGRyb3BzIHRoZSByZWZjb3VudCBvbiB0aGUgYXNzb2NpYXRlZCBhbGdvcml0aG0uCi0gKi8KLXN0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9fYWxsb2NfdGZtKGNvbnN0IGNoYXIgKmFsZ19uYW1lLCB1MzIgdGZtX2ZsYWdzKTsKLXZvaWQgY3J5cHRvX2ZyZWVfdGZtKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwotCi0vKgotICogVHJhbnNmb3JtIGhlbHBlcnMgd2hpY2ggcXVlcnkgdGhlIHVuZGVybHlpbmcgYWxnb3JpdGhtLgotICovCi1zdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNyeXB0b190Zm1fYWxnX25hbWUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9uYW1lOwotfQotCi1zdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNyeXB0b190Zm1fYWxnX21vZG5hbWUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnID0gdGZtLT5fX2NydF9hbGc7Ci0KLQlpZiAoYWxnLT5jcmFfbW9kdWxlKQotCQlyZXR1cm4gYWxnLT5jcmFfbW9kdWxlLT5uYW1lOwotCWVsc2UKLQkJcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGNyeXB0b190Zm1fYWxnX3R5cGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9mbGFncyAmIENSWVBUT19BTEdfVFlQRV9NQVNLOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19taW5fa2V5c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7Ci0JcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9taW5fa2V5c2l6ZTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfbWF4X2tleXNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwotCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfbWF4X2tleXNpemU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2l2c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7Ci0JcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfaXZzaXplOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9ibG9ja3NpemU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2RpZ2VzdHNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOwotCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfZGlnZXN0c2l6ZTsKLX0KLQotLyoKLSAqIEFQSSB3cmFwcGVycy4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19kaWdlc3RfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7Ci0JdGZtLT5jcnRfZGlnZXN0LmRpdF9pbml0KHRmbSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZGlnZXN0X3VwZGF0ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQkJCQl1bnNpZ25lZCBpbnQgbnNnKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7Ci0JdGZtLT5jcnRfZGlnZXN0LmRpdF91cGRhdGUodGZtLCBzZywgbnNnKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19kaWdlc3RfZmluYWwoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCkKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOwotCXRmbS0+Y3J0X2RpZ2VzdC5kaXRfZmluYWwodGZtLCBvdXQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2RpZ2VzdF9kaWdlc3Qoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJCQkJdW5zaWduZWQgaW50IG5zZywgdTggKm91dCkKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOwotCXRmbS0+Y3J0X2RpZ2VzdC5kaXRfZGlnZXN0KHRmbSwgc2csIG5zZywgb3V0KTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2RpZ2VzdF9zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCQkgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOwotCWlmICh0Zm0tPmNydF9kaWdlc3QuZGl0X3NldGtleSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT1NZUzsKLQlyZXR1cm4gdGZtLT5jcnRfZGlnZXN0LmRpdF9zZXRrZXkodGZtLCBrZXksIGtleWxlbik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkJICAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKLQlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9zZXRrZXkodGZtLCBrZXksIGtleWxlbik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKLQlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9lbmNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZW5jcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCQkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwotCUJVR19PTih0Zm0tPmNydF9jaXBoZXIuY2l0X21vZGUgPT0gQ1JZUFRPX1RGTV9NT0RFX0VDQik7Ci0JcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZW5jcnlwdF9pdih0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsIGl2KTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJCQkJdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwotCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2RlY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9kZWNyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7Ci0JQlVHX09OKHRmbS0+Y3J0X2NpcGhlci5jaXRfbW9kZSA9PSBDUllQVE9fVEZNX01PREVfRUNCKTsKLQlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9kZWNyeXB0X2l2KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywgaXYpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2NpcGhlcl9zZXRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCQkJY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IGxlbikKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwotCW1lbWNweSh0Zm0tPmNydF9jaXBoZXIuY2l0X2l2LCBzcmMsIGxlbik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fY2lwaGVyX2dldF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCQl1OCAqZHN0LCB1bnNpZ25lZCBpbnQgbGVuKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7Ci0JbWVtY3B5KGRzdCwgdGZtLT5jcnRfY2lwaGVyLmNpdF9pdiwgbGVuKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NvbXBfY29tcHJlc3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCQkgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCi0JCQkJICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbikKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DT01QUkVTUyk7Ci0JcmV0dXJuIHRmbS0+Y3J0X2NvbXByZXNzLmNvdF9jb21wcmVzcyh0Zm0sIHNyYywgc2xlbiwgZHN0LCBkbGVuKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NvbXBfZGVjb21wcmVzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCQkgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCi0JCQkJCSB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1MpOwotCXJldHVybiB0Zm0tPmNydF9jb21wcmVzcy5jb3RfZGVjb21wcmVzcyh0Zm0sIHNyYywgc2xlbiwgZHN0LCBkbGVuKTsKLX0KLQotLyoKLSAqIEhNQUMgc3VwcG9ydC4KLSAqLwotI2lmZGVmIENPTkZJR19DUllQVE9fSE1BQwotdm9pZCBjcnlwdG9faG1hY19pbml0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICprZXksIHVuc2lnbmVkIGludCAqa2V5bGVuKTsKLXZvaWQgY3J5cHRvX2htYWNfdXBkYXRlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnKTsKLXZvaWQgY3J5cHRvX2htYWNfZmluYWwoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmtleSwKLQkJICAgICAgIHVuc2lnbmVkIGludCAqa2V5bGVuLCB1OCAqb3V0KTsKLXZvaWQgY3J5cHRvX2htYWMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmtleSwgdW5zaWduZWQgaW50ICprZXlsZW4sCi0JCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KTsKLSNlbmRpZgkvKiBDT05GSUdfQ1JZUFRPX0hNQUMgKi8KLQotI2VuZGlmCS8qIF9MSU5VWF9DUllQVE9fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9zY2F0dGVyd2Fsay5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9zY2F0dGVyd2Fsay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjczZjZjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvc2NhdHRlcndhbGsuYworKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogQ3J5cHRvZ3JhcGhpYyBBUEkuCi0gKgotICogQ2lwaGVyIG9wZXJhdGlvbnMuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgotICogICAgICAgICAgICAgICAyMDAyIEFkYW0gSi4gUmljaHRlciA8YWRhbUB5Z2dkcmFzaWwuY29tPgotICogICAgICAgICAgICAgICAyMDA0IEplYW4tTHVjIENvb2tlIDxqbGNvb2tlQGNlcnRhaW5rZXkuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgotI2luY2x1ZGUgImludGVybmFsLmgiCi0jaW5jbHVkZSAic2NhdHRlcndhbGsuaCIKLQotdm9pZCAqc2NhdHRlcndhbGtfd2hpY2hidWYoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgdW5zaWduZWQgaW50IG5ieXRlcywgdm9pZCAqc2NyYXRjaCkKLXsKLQlpZiAobmJ5dGVzIDw9IHdhbGstPmxlbl90aGlzX3BhZ2UgJiYKLQkgICAgKCgodW5zaWduZWQgbG9uZyl3YWxrLT5kYXRhKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgKyBuYnl0ZXMgPD0KLQkgICAgUEFHRV9DQUNIRV9TSVpFKQotCQlyZXR1cm4gd2Fsay0+ZGF0YTsKLQllbHNlCi0JCXJldHVybiBzY3JhdGNoOwotfQotCi1zdGF0aWMgdm9pZCBtZW1jcHlfZGlyKHZvaWQgKmJ1Ziwgdm9pZCAqc2dkYXRhLCBzaXplX3QgbmJ5dGVzLCBpbnQgb3V0KQotewotCWlmIChvdXQpCi0JCW1lbWNweShzZ2RhdGEsIGJ1ZiwgbmJ5dGVzKTsKLQllbHNlCi0JCW1lbWNweShidWYsIHNnZGF0YSwgbmJ5dGVzKTsKLX0KLQotdm9pZCBzY2F0dGVyd2Fsa19zdGFydChzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKQotewotCXVuc2lnbmVkIGludCByZXN0X29mX3BhZ2U7Ci0KLQl3YWxrLT5zZyA9IHNnOwotCi0Jd2Fsay0+cGFnZSA9IHNnLT5wYWdlOwotCXdhbGstPmxlbl90aGlzX3NlZ21lbnQgPSBzZy0+bGVuZ3RoOwotCi0JcmVzdF9vZl9wYWdlID0gUEFHRV9DQUNIRV9TSVpFIC0gKHNnLT5vZmZzZXQgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOwotCXdhbGstPmxlbl90aGlzX3BhZ2UgPSBtaW4oc2ctPmxlbmd0aCwgcmVzdF9vZl9wYWdlKTsKLQl3YWxrLT5vZmZzZXQgPSBzZy0+b2Zmc2V0OwotfQotCi12b2lkIHNjYXR0ZXJ3YWxrX21hcChzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrKQotewotCXdhbGstPmRhdGEgPSBrbWFwX2F0b21pYyh3YWxrLT5wYWdlKSArIHdhbGstPm9mZnNldDsKLX0KLQotc3RhdGljIHZvaWQgc2NhdHRlcndhbGtfcGFnZWRvbmUoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgaW50IG91dCwKLQkJCQkgdW5zaWduZWQgaW50IG1vcmUpCi17Ci0JLyogd2Fsay0+ZGF0YSBtYXkgYmUgcG9pbnRpbmcgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG5leHQgcGFnZTsKLQkgICBob3dldmVyLCB3ZSBrbm93IHdlIHRyYW5zZmVycmVkIGF0IGxlYXN0IG9uZSBieXRlLiAgU28sCi0JICAgd2Fsay0+ZGF0YSAtIDEgd2lsbCBiZSBhIHZpcnR1YWwgYWRkcmVzcyBpbiB0aGUgbWFwcGVkIHBhZ2UuICovCi0KLQlpZiAob3V0KQotCQlmbHVzaF9kY2FjaGVfcGFnZSh3YWxrLT5wYWdlKTsKLQotCWlmIChtb3JlKSB7Ci0JCXdhbGstPmxlbl90aGlzX3NlZ21lbnQgLT0gd2Fsay0+bGVuX3RoaXNfcGFnZTsKLQotCQlpZiAod2Fsay0+bGVuX3RoaXNfc2VnbWVudCkgewotCQkJd2Fsay0+cGFnZSsrOwotCQkJd2Fsay0+bGVuX3RoaXNfcGFnZSA9IG1pbih3YWxrLT5sZW5fdGhpc19zZWdtZW50LAotCQkJCQkJICAodW5zaWduZWQpUEFHRV9DQUNIRV9TSVpFKTsKLQkJCXdhbGstPm9mZnNldCA9IDA7Ci0JCX0KLQkJZWxzZQotCQkJc2NhdHRlcndhbGtfc3RhcnQod2Fsaywgc2dfbmV4dCh3YWxrLT5zZykpOwotCX0KLX0KLQotdm9pZCBzY2F0dGVyd2Fsa19kb25lKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIGludCBvdXQsIGludCBtb3JlKQotewotCWNyeXB0b19rdW5tYXAod2Fsay0+ZGF0YSwgb3V0KTsKLQlpZiAod2Fsay0+bGVuX3RoaXNfcGFnZSA9PSAwIHx8ICFtb3JlKQotCQlzY2F0dGVyd2Fsa19wYWdlZG9uZSh3YWxrLCBvdXQsIG1vcmUpOwotfQotCi0vKgotICogRG8gbm90IGNhbGwgdGhpcyB1bmxlc3MgdGhlIHRvdGFsIGxlbmd0aCBvZiBhbGwgb2YgdGhlIGZyYWdtZW50cwotICogaGFzIGJlZW4gdmVyaWZpZWQgYXMgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuCi0gKi8KLWludCBzY2F0dGVyd2Fsa19jb3B5Y2h1bmtzKHZvaWQgKmJ1Ziwgc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywKLQkJCSAgIHNpemVfdCBuYnl0ZXMpCi17Ci0JaWYgKGJ1ZiAhPSB3YWxrLT5kYXRhKSB7Ci0JCXdoaWxlIChuYnl0ZXMgPiB3YWxrLT5sZW5fdGhpc19wYWdlKSB7Ci0JCQltZW1jcHlfZGlyKGJ1Ziwgd2Fsay0+ZGF0YSwgd2Fsay0+bGVuX3RoaXNfcGFnZSwgb3V0KTsKLQkJCWJ1ZiArPSB3YWxrLT5sZW5fdGhpc19wYWdlOwotCQkJbmJ5dGVzIC09IHdhbGstPmxlbl90aGlzX3BhZ2U7Ci0KLQkJCWt1bm1hcF9hdG9taWMod2Fsay0+ZGF0YSk7Ci0JCQlzY2F0dGVyd2Fsa19wYWdlZG9uZSh3YWxrLCBvdXQsIDEpOwotCQkJc2NhdHRlcndhbGtfbWFwKHdhbGspOwotCQl9Ci0KLQkJbWVtY3B5X2RpcihidWYsIHdhbGstPmRhdGEsIG5ieXRlcywgb3V0KTsKLQl9Ci0KLQl3YWxrLT5vZmZzZXQgKz0gbmJ5dGVzOwotCXdhbGstPmxlbl90aGlzX3BhZ2UgLT0gbmJ5dGVzOwotCXdhbGstPmxlbl90aGlzX3NlZ21lbnQgLT0gbmJ5dGVzOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9zY2F0dGVyd2Fsay5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9zY2F0dGVyd2Fsay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTY0NDY1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvc2NhdHRlcndhbGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDcnlwdG9ncmFwaGljIEFQSS4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgQWRhbSBKLiBSaWNodGVyIDxhZGFtQHlnZ2RyYXNpbC5jb20+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSmVhbi1MdWMgQ29va2UgPGpsY29va2VAY2VydGFpbmtleS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2lmbmRlZiBfQ1JZUFRPX1NDQVRURVJXQUxLX0gKLSNkZWZpbmUgX0NSWVBUT19TQ0FUVEVSV0FMS19ICi0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KLQotc3RydWN0IHNjYXR0ZXJfd2FsayB7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0CSpzZzsKLQlzdHJ1Y3QgcGFnZQkJKnBhZ2U7Ci0Jdm9pZAkJCSpkYXRhOwotCXVuc2lnbmVkIGludAkJbGVuX3RoaXNfcGFnZTsKLQl1bnNpZ25lZCBpbnQJCWxlbl90aGlzX3NlZ21lbnQ7Ci0JdW5zaWduZWQgaW50CQlvZmZzZXQ7Ci19OwotCi0vKiBEZWZpbmUgc2dfbmV4dCBpcyBhbiBpbmxpbmUgcm91dGluZSBub3cgaW4gY2FzZSB3ZSB3YW50IHRvIGNoYW5nZQotICAgc2NhdHRlcmxpc3QgdG8gYSBsaW5rZWQgbGlzdCBsYXRlci4gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19uZXh0KHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCi17Ci0JcmV0dXJuIHNnICsgMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgc2NhdHRlcndhbGtfc2FtZWJ1ZihzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrX2luLAotCQkJCSAgICAgIHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGtfb3V0LAotCQkJCSAgICAgIHZvaWQgKnNyY19wLCB2b2lkICpkc3RfcCkKLXsKLQlyZXR1cm4gd2Fsa19pbi0+cGFnZSA9PSB3YWxrX291dC0+cGFnZSAmJgotCSAgICAgICB3YWxrX2luLT5vZmZzZXQgPT0gd2Fsa19vdXQtPm9mZnNldCAmJgotCSAgICAgICB3YWxrX2luLT5kYXRhID09IHNyY19wICYmIHdhbGtfb3V0LT5kYXRhID09IGRzdF9wOwotfQotCi12b2lkICpzY2F0dGVyd2Fsa193aGljaGJ1ZihzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB2b2lkICpzY3JhdGNoKTsKLXZvaWQgc2NhdHRlcndhbGtfc3RhcnQoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2Fsaywgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyk7Ci1pbnQgc2NhdHRlcndhbGtfY29weWNodW5rcyh2b2lkICpidWYsIHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIHNpemVfdCBuYnl0ZXMsIGludCBvdXQpOwotdm9pZCBzY2F0dGVyd2Fsa19tYXAoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgaW50IG91dCk7Ci12b2lkIHNjYXR0ZXJ3YWxrX2RvbmUoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgaW50IG91dCwgaW50IG1vcmUpOwotCi0jZW5kaWYgIC8qIF9DUllQVE9fU0NBVFRFUldBTEtfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwXzkzY3g2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfOTNjeDYuYwppbmRleCBjNjE3MjliLi5jZDA2MDU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfOTNjeDYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfOTNjeDYuYwpAQCAtMjAsNyArMjAsNyBAQAogCiAjaW5jbHVkZSAicjgxODBfOTNjeDYuaCIKIAotdm9pZCBlcHJvbV9jcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBiaXQpCitzdGF0aWMgdm9pZCBlcHJvbV9jcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBiaXQpCiB7CiAJdTggY21kcmVnOwogCkBAIC0zNyw3ICszNyw3IEBACiB9CiAKIAotdm9pZCBlcHJvbV9ja19jeWNsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgZXByb21fY2tfY3ljbGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAl1OCBjbWRyZWc7CiAKQEAgLTUzLDcgKzUzLDcgQEAKIH0KIAogCi12b2lkIGVwcm9tX3coc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBiaXQpCitzdGF0aWMgdm9pZCBlcHJvbV93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgYml0KQogewogCXU4IGNtZHJlZzsKIApAQCAtNjgsNyArNjgsNyBAQAogfQogCiAKLXNob3J0IGVwcm9tX3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBzaG9ydCBlcHJvbV9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJdTggYml0OwogCkBAIC04Miw3ICs4Miw3IEBACiB9CiAKIAotdm9pZCBlcHJvbV9zZW5kX2JpdHNfc3RyaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGJbXSwgaW50IGxlbikKK3N0YXRpYyB2b2lkIGVwcm9tX3NlbmRfYml0c19zdHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgYltdLCBpbnQgbGVuKQogewogCWludCBpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCmluZGV4IGMyYmNiZTIuLjFiYjYxNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCkBAIC0yMzgsNyArMjM4LDcgQEAKIAogCiAKLXZvaWQgQ2FtUmVzZXRBbGxFbnRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgQ2FtUmVzZXRBbGxFbnRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXUzMiB1bGNvbW1hbmQgPSAwOwogCS8vMjAwNC8wMi8xMSAgSW4gc3RhdGljIFdFUCwgT0lEX0FERF9LRVkgb3IgT0lEX0FERF9XRVAgYXJlIHNldCBiZWZvcmUgU1RBIGFzc29jaWF0ZSB0byBBUC4KQEAgLTU5MSwxMiArNTkxLDYgQEAKIAlydGw4MTkyX3Byb2MgPSBwcm9jX21rZGlyKFJUTDgxOXhVX01PRFVMRV9OQU1FLCBpbml0X25ldC5wcm9jX25ldCk7CiB9CiAKLQotdm9pZCBydGw4MTkyX3Byb2NfbW9kdWxlX3JlbW92ZSh2b2lkKQotewotCXJlbW92ZV9wcm9jX2VudHJ5KFJUTDgxOXhVX01PRFVMRV9OQU1FLCBpbml0X25ldC5wcm9jX25ldCk7Ci19Ci0KIC8qCiAgKiBzZXFfZmlsZSB3cmFwcGVycyBmb3IgcHJvY2ZpbGUgc2hvdyByb3V0aW5lcy4KICAqLwpAQCAtNjczLDcgKzY2Nyw3IEBACiAJcmV0dXJuICh1c2VkIDwgTUFYX1RYX1VSQik7CiB9CiAKLXZvaWQgdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIApAQCAtNjg5LDI0ICs2ODMsNiBAQAogCQlSVF9UUkFDRShDT01QX0VQUk9NLCAiRUVQUk9NIGFkZHIgJXggOiAleCIsIGksIGVwcm9tX3JlYWQoZGV2LCBpKSk7CiB9CiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUhXIFNUVUZGLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi12b2lkIHJ0bDgxOTJfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1vZGUpCi17Ci0JdTggZWNtZDsKLQlyZWFkX25pY19ieXRlKGRldiwgRVBST01fQ01ELCAmZWNtZCk7Ci0JZWNtZCA9IGVjbWQgJiB+RVBST01fQ01EX09QRVJBVElOR19NT0RFX01BU0s7Ci0JZWNtZCA9IGVjbWQgfCAobW9kZTw8RVBST01fQ01EX09QRVJBVElOR19NT0RFX1NISUZUKTsKLQllY21kID0gZWNtZCAmIH5FUFJPTV9DU19CSVQ7Ci0JZWNtZCA9IGVjbWQgJiB+RVBST01fQ0tfQklUOwotCXdyaXRlX25pY19ieXRlKGRldiwgRVBST01fQ01ELCBlY21kKTsKLX0KLQotCiB2b2lkIHJ0bDgxOTJfdXBkYXRlX21zcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKQEAgLTkwMywxMiArODc5LDYgQEAKIAlyZXR1cm47CiB9CiAKLQotaW50IGFsbG9jX3R4X2JlYWNvbl9kZXNjX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50KQotewotCXJldHVybiAwOwotfQotCiBpbmxpbmUgdTE2IGllZWVyYXRlMnJ0bHJhdGUoaW50IHJhdGUpCiB7CiAJc3dpdGNoIChyYXRlKSB7CkBAIC0xMDExLDEzICs5ODEsMTMgQEAKIH0KIAogCi12b2lkIHJ0bDgxOTJfZGF0YV9oYXJkX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfZGF0YV9oYXJkX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAkvL0ZJWE1FICEhCiB9CiAKIAotdm9pZCBydGw4MTkyX2RhdGFfaGFyZF9yZXN1bWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfZGF0YV9oYXJkX3Jlc3VtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCS8vIEZJWE1FICEhCiB9CkBAIC0xMDI1LDcgKzk5NSw3IEBACiAvKiB0aGlzIGZ1bmN0aW9uIFRYIGRhdGEgZnJhbWVzIHdoZW4gdGhlIGllZWU4MDIxMSBzdGFjayByZXF1aXJlcyB0aGlzLgogICogSXQgY2hlY2tzIGFsc28gaWYgd2UgbmVlZCB0byBzdG9wIHRoZSBpZWVlIHR4IHF1ZXVlLCBldmVudHVhbGx5IGRvIGl0CiAgKi8KLXZvaWQgcnRsODE5Ml9oYXJkX2RhdGFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmF0ZSkKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfaGFyZF9kYXRhX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJhdGUpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOwogCWludCByZXQ7CkBAIC0xMDUzLDcgKzEwMjMsNyBAQAogICogSWYgdGhlIHJpbmcgaXMgZnVsbCBwYWNrZXQgYXJlIGRyb3BwZWQgKGZvciBkYXRhIGZyYW1lIHRoZSBxdWV1ZQogICogaXMgc3RvcHBlZCBiZWZvcmUgdGhpcyBjYW4gaGFwcGVuKS4KICAqLwotaW50IHJ0bDgxOTJfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHJ0bDgxOTJfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOwogCWludCByZXQ7CkBAIC0xMzE4LDcgKzEyODgsOCBAQAogCQkvKiBEb24ndCBzZW5kIGRhdGEgZnJhbWUgZHVyaW5nIHNjYW5uaW5nLiovCiAJCWlmICgoc2tiX3F1ZXVlX2xlbigmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbcXVldWVfaW5kZXhdKSAhPSAwKSAmJgogCQkgICAgKCEocHJpdi0+aWVlZTgwMjExLT5xdWV1ZV9zdG9wKSkpIHsKLQkJCWlmIChOVUxMICE9IChza2IgPSBza2JfZGVxdWV1ZSgmKHByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW3F1ZXVlX2luZGV4XSkpKSkKKwkJCXNrYiA9IHNrYl9kZXF1ZXVlKCYocHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbcXVldWVfaW5kZXhdKSk7CisJCQlpZiAoc2tiKQogCQkJCXByaXYtPmllZWU4MDIxMS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLCBkZXYpOwogCiAJCQlyZXR1cm47IC8vbW9kaWZpZWQgYnkgZGF2aWQgdG8gYXZvaWQgZnVydGhlciBwcm9jZXNzaW5nIEFNU0RVCkBAIC0xMzU4LDI1ICsxMzI5LDcgQEAKIAogfQogCi12b2lkIHJ0bDgxOTJfYmVhY29uX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQl1OCBtc3IsIG1zcm0sIG1zcjI7Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCi0JcmVhZF9uaWNfYnl0ZShkZXYsIE1TUiwgJm1zcik7Ci0JbXNybSA9IG1zciAmIE1TUl9MSU5LX01BU0s7Ci0JbXNyMiA9IG1zciAmIH5NU1JfTElOS19NQVNLOwotCi0JaWYgKE5JQ184MTkyVSA9PSBwcml2LT5jYXJkXzgxOTIpCi0JCXVzYl9raWxsX3VyYihwcml2LT5yeF91cmJbTUFYX1JYX1VSQl0pOwotCWlmICgobXNybSA9PSAoTVNSX0xJTktfQURIT0M8PE1TUl9MSU5LX1NISUZUKSB8fAotCSAgICAobXNybSA9PSAoTVNSX0xJTktfTUFTVEVSPDxNU1JfTElOS19TSElGVCkpKSkgewotCQl3cml0ZV9uaWNfYnl0ZShkZXYsIE1TUiwgbXNyMiB8IE1TUl9MSU5LX05PTkUpOwotCQl3cml0ZV9uaWNfYnl0ZShkZXYsIE1TUiwgbXNyKTsKLQl9Ci19Ci0KLXZvaWQgcnRsODE5Ml9jb25maWdfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgKnJhdGVfY29uZmlnKQorc3RhdGljIHZvaWQgcnRsODE5Ml9jb25maWdfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgKnJhdGVfY29uZmlnKQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldDsKQEAgLTE0MjMsNyArMTM3Niw3IEBACiAjZGVmaW5lIFNIT1JUX1NMT1RfVElNRSA5CiAjZGVmaW5lIE5PTl9TSE9SVF9TTE9UX1RJTUUgMjAKIAotdm9pZCBydGw4MTkyX3VwZGF0ZV9jYXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGNhcCkKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfdXBkYXRlX2NhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgY2FwKQogewogCXUzMiB0bXAgPSAwOwogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKQEAgLTE0NDUsNyArMTM5OCw3IEBACiAJfQogCiB9Ci12b2lkIHJ0bDgxOTJfbmV0X3VwZGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgcnRsODE5Ml9uZXRfdXBkYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CkBAIC0xNTYwLDExICsxNTEzLDYgQEAKIAlyZXR1cm4gTl9EQlBTOwogfQogCi12b2lkIHJ0bDgxOXhVX2NtZF9pc3Ioc3RydWN0IHVyYiAqdHhfY21kX3VyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JdXNiX2ZyZWVfdXJiKHR4X2NtZF91cmIpOwotfQotCiB1bnNpZ25lZCBpbnQgdHhxdWV1ZTJvdXRwaXBlKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgdHhfcXVldWUpCiB7CiAJaWYgKHR4X3F1ZXVlID49IDkpIHsKQEAgLTE2NzMsNyArMTYyMSw3IEBACiAJcmV0dXJuIFF1ZXVlU2VsZWN0OwogfQogCi11OCBNUmF0ZVRvSHdSYXRlODE5MFBjaSh1OCByYXRlKQorc3RhdGljIHU4IE1SYXRlVG9Id1JhdGU4MTkwUGNpKHU4IHJhdGUpCiB7CiAJdTggIHJldCA9IERFU0M5MF9SQVRFMU07CiAKQEAgLTIwMzksNyArMTk4Nyw3IEBACiAjZW5kaWYKIAogZXh0ZXJuIHZvaWQgcnRsODE5Ml91cGRhdGVfcmF0cl90YWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXZvaWQgcnRsODE5Ml9saW5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgcnRsODE5Ml9saW5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKQEAgLTIwNzEsNyArMjAxOSw3IEBACiB9OwogCiAKLXZvaWQgcnRsODE5Ml91cGRhdGVfYmVhY29uKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfdXBkYXRlX2JlYWNvbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHI4MTkyX3ByaXYsIHVwZGF0ZV9iZWFjb25fd3Eud29yayk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPmllZWU4MDIxMS0+ZGV2OwpAQCAtMjA4Niw4ICsyMDM0LDggQEAKIC8qCiAqIGJhY2tncm91bmQgc3VwcG9ydCB0byBydW4gUW9TIGFjdGl2YXRlIGZ1bmN0aW9uYWxpdHkKICovCi1pbnQgV0RDQVBBUkFfQUREW10gPSB7RURDQVBBUkFfQkUsIEVEQ0FQQVJBX0JLLCBFRENBUEFSQV9WSSwgRURDQVBBUkFfVk99Owotdm9pZCBydGw4MTkyX3Fvc19hY3RpdmF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgaW50IFdEQ0FQQVJBX0FERFtdID0ge0VEQ0FQQVJBX0JFLCBFRENBUEFSQV9CSywgRURDQVBBUkFfVkksIEVEQ0FQQVJBX1ZPfTsKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfcW9zX2FjdGl2YXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcjgxOTJfcHJpdiwgcW9zX2FjdGl2YXRlKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+aWVlZTgwMjExLT5kZXY7CkBAIC0yMzE1LDcgKzIyNjMsNyBAQAogCXJldHVybiB0cnVlOwogfQogCi1ib29sIEdldEhhbGZObW9kZVN1cHBvcnRCeUFQczgxOXhVc2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBib29sIEdldEhhbGZObW9kZVN1cHBvcnRCeUFQczgxOXhVc2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlib29sCQkJUmV2YWw7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwpAQCAtMjMyOSw3ICsyMjc3LDcgQEAKIAlyZXR1cm4gUmV2YWw7CiB9CiAKLXZvaWQgcnRsODE5Ml9yZWZyZXNoX3N1cHBvcnRyYXRlKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQorc3RhdGljIHZvaWQgcnRsODE5Ml9yZWZyZXNoX3N1cHBvcnRyYXRlKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQogewogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOwogCS8vd2UgZG8gbm90IGNvbnNpZGVyIHNldCBzdXBwb3J0IHJhdGUgZm9yIEFCRyBtb2RlLCBvbmx5IEhUIE1DUyByYXRlIGlzIHNldCBoZXJlLgpAQCAtMjM0MCw3ICsyMjg4LDcgQEAKIAlyZXR1cm47CiB9CiAKLXU4IHJ0bDgxOTJfZ2V0U3VwcG9ydGVkV2lyZWxlZU1vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB1OCBydGw4MTkyX2dldFN1cHBvcnRlZFdpcmVsZWVNb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXU4IHJldCA9IDA7CkBAIC0yMzU5LDcgKzIzMDcsNyBAQAogCX0KIAlyZXR1cm4gcmV0OwogfQotdm9pZCBydGw4MTkyX1NldFdpcmVsZXNzTW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCB3aXJlbGVzc19tb2RlKQorc3RhdGljIHZvaWQgcnRsODE5Ml9TZXRXaXJlbGVzc01vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggd2lyZWxlc3NfbW9kZSkKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTggYlN1cHBvcnRNb2RlID0gcnRsODE5Ml9nZXRTdXBwb3J0ZWRXaXJlbGVlTW9kZShkZXYpOwpAQCAtMjc3OSw3ICsyNzI3LDcgQEAKIAlyZXR1cm47CiB9CiAKLXNob3J0IHJ0bDgxOTJfZ2V0X2NoYW5uZWxfbWFwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgc2hvcnQgcnRsODE5Ml9nZXRfY2hhbm5lbF9tYXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJaWYgKHByaXYtPkNoYW5uZWxQbGFuID4gQ09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU4pIHsKQEAgLTI3OTIsNyArMjc0MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXNob3J0IHJ0bDgxOTJfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHNob3J0IHJ0bDgxOTJfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwpAQCAtMjg0MCw3ICsyNzg4LDcgQEAKICAqICByZXR1cm46ICBub25lCiAgKiAgbm90aWNlOiAgVGhpcyBwYXJ0IG5lZWQgdG8gbW9kaWZpZWQgYWNjb3JkaW5nIHRvIHRoZSByYXRlIHNldCB3ZSBmaWx0ZXJlZAogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcnRsODE5Ml9od2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgcnRsODE5Ml9od2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXUzMiByZWdSQVRSID0gMCwgcmVnUlJTUiA9IDA7CiAJdTggcmVnQndPcE1vZGUgPSAwLCByZWdUbXAgPSAwOwpAQCAtMjkyMyw3ICsyODcxLDcgQEAKIAogCiAvL0luaXRpYWxpemVBZGFwdGVyIGFuZCBQaHlDZmcKLWJvb2wgcnRsODE5Ml9hZGFwdGVyX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgYm9vbCBydGw4MTkyX2FkYXB0ZXJfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTMyIGR3UmVnUmVhZCA9IDA7CkBAIC0zMTc5LDcgKzMxMjcsNyBAQAogKgk8QXNzdW1wdGlvbjogUlRfVFhfU1BJTkxPQ0sgaXMgYWNxdWlyZWQuPgogKglGaXJzdCBhZGRlZDogMjAwNi4xMS4xOSBieSBlbWlseQogKi8KLVJFU0VUX1RZUEUgVHhDaGVja1N0dWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgUkVTRVRfVFlQRSBUeENoZWNrU3R1Y2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTgJCQlRdWV1ZUlEOwpAQCAtMzI4Miw3ICszMjMwLDcgQEAKICoKICoJODE4NSBhbmQgODE4NWIgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uIFRoaXMgaXMgYWRkZWQgYnkgRW1pbHkgYXQgMjAwNi4xMS4yNAogKi8KLVJFU0VUX1RZUEUgcnRsODE5eF9pZmNoZWNrX3Jlc2V0b3Jub3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBSRVNFVF9UWVBFIHJ0bDgxOXhfaWZjaGVja19yZXNldG9ybm90KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCVJFU0VUX1RZUEUJVHhSZXNldFR5cGUgPSBSRVNFVF9UWVBFX05PUkVTRVQ7CkBAIC0zMzIxLDcgKzMyNjksNyBAQAogCiAKIAotdm9pZCBDYW1SZXN0b3JlQWxsRW50cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIENhbVJlc3RvcmVBbGxFbnRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXU4IEVudHJ5SWQgPSAwOwogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKQEAgLTMzOTcsNyArMzM0NSw3IEBACiAvLyBUaGUgbWV0aG9kIGNoZWNraW5nIFR4L1J4IHN0dWNrIG9mIHRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIGJ5IEZXLAogLy8gd2hpY2ggcmVwb3J0cyBUeCBhbmQgUnggY291bnRlciB0byByZWdpc3RlciAweDEyOCBhbmQgMHgxMzAuCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBydGw4MTl4X2lmc2lsZW50cmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHJ0bDgxOXhfaWZzaWxlbnRyZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1OAlyZXNldF90aW1lcyA9IDA7CkBAIC0zNTE3LDcgKzM0NjUsNyBAQAogCXByaW50aygiXG4iKTsKIH0KIAotdm9pZCBydGw4MTl4X3VwZGF0ZV9yeGNvdW50cyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTMyICpUb3RhbFJ4QmNuTnVtLAorc3RhdGljIHZvaWQgcnRsODE5eF91cGRhdGVfcnhjb3VudHMoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHUzMiAqVG90YWxSeEJjbk51bSwKIAkJCSAgICAgdTMyICpUb3RhbFJ4RGF0YU51bSkKIHsKIAl1MTYJCQlTbG90SW5kZXg7CkBAIC0zNTM2LDcgKzM0ODQsNyBAQAogfQogCiAKLWV4dGVybiB2b2lkIHJ0bDgxOXhfd2F0Y2hkb2dfd3FjYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit2b2lkIHJ0bDgxOXhfd2F0Y2hkb2dfd3FjYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCByODE5Ml9wcml2LCB3YXRjaF9kb2dfd3EpOwpAQCAtMzYzNCw3ICszNTgyLDcgQEAKIH0KIAogCi1pbnQgcnRsODE5Ml9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHJ0bDgxOTJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlpbnQgcmV0OwpAQCAtMzc1NCw3ICszNzAyLDcgQEAKIH0KIAogCi1pbnQgcjgxOTJfc2V0X21hY19hZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqbWFjKQorc3RhdGljIGludCByODE5Ml9zZXRfbWFjX2FkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICptYWMpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IG1hYzsKQEAgLTM3NzAsNyArMzcxOCw3IEBACiB9CiAKIC8qIGJhc2VkIG9uIGlwdzIyMDAgZHJpdmVyICovCi1pbnQgcnRsODE5Ml9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQorc3RhdGljIGludCBydGw4MTkyX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOwogCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJxOwpAQCAtMzg2MSw3ICszODA5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi11OCBId1JhdGVUb01SYXRlOTAoYm9vbCBiSXNIVCwgdTggcmF0ZSkKK3N0YXRpYyB1OCBId1JhdGVUb01SYXRlOTAoYm9vbCBiSXNIVCwgdTggcmF0ZSkKIHsKIAl1OCAgcmV0X3JhdGUgPSAweGZmOwogCkBAIC0zOTQ3LDcgKzM4OTUsNyBAQAogCiAvL2J5IGFteSAwODA2MDYKIAotbG9uZyBydGw4MTl4X3RyYW5zbGF0ZV90b2RibSh1OCBzaWduYWxfc3RyZW5ndGhfaW5kZXgpLy8gMC0xMDAgaW5kZXguCitzdGF0aWMgbG9uZyBydGw4MTl4X3RyYW5zbGF0ZV90b2RibSh1OCBzaWduYWxfc3RyZW5ndGhfaW5kZXgpLy8gMC0xMDAgaW5kZXguCiB7CiAJbG9uZwlzaWduYWxfcG93ZXI7IC8vIGluIGRCbS4KIApAQCAtMzk2Myw3ICszOTExLDkgQEAKICAgICBiZSBhIGxvY2FsIHN0YXRpYy4gT3RoZXJ3aXNlLCBpdCBtYXkgaW5jcmVhc2Ugd2hlbiB3ZSByZXR1cm4gZnJvbSBTMy9TNC4gVGhlCiAgICAgdmFsdWUgd2lsbCBiZSBrZXB0IGluIG1lbW9yeSBvciBkaXNrLiBEZWNsYXJlIHRoZSB2YWx1ZSBpbiB0aGUgYWRhcHRvcgogICAgIGFuZCBpdCB3aWxsIGJlIHJlaW5pdGlhbGl6ZWQgd2hlbiByZXR1cm5lZCBmcm9tIFMzL1M0LiAqLwotdm9pZCBydGw4MTkyX3Byb2Nlc3NfcGh5aW5mbyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTggKmJ1ZmZlciwgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcHByZXZpb3VzX3N0YXRzLCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpwY3VycmVudF9zdGF0cykKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfcHJvY2Vzc19waHlpbmZvKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCB1OCAqYnVmZmVyLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpwcHJldmlvdXNfc3RhdHMsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnBjdXJyZW50X3N0YXRzKQogewogCWJvb2wgYmNoZWNrID0gZmFsc2U7CiAJdTgJcmZwYXRoOwpAQCAtNDQ0OSw4ICs0Mzk5LDggQEAKIAl9CiB9CS8qIFF1ZXJ5UnhQaHlTdGF0dXM4MTkwUGNpICovCiAKLXZvaWQgcnRsODE5Ml9yZWNvcmRfcnhkZXNjX2ZvcmxhdGVydXNlKHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnBzcmNfc3RhdHMsCi0JCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnB0YXJnZXRfc3RhdHMpCitzdGF0aWMgdm9pZCBydGw4MTkyX3JlY29yZF9yeGRlc2NfZm9ybGF0ZXJ1c2Uoc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcHNyY19zdGF0cywKKwkJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcHRhcmdldF9zdGF0cykKIHsKIAlwdGFyZ2V0X3N0YXRzLT5iSXNBTVBEVSA9IHBzcmNfc3RhdHMtPmJJc0FNUERVOwogCXB0YXJnZXRfc3RhdHMtPmJGaXJzdE1QRFUgPSBwc3JjX3N0YXRzLT5iRmlyc3RNUERVOwpAQCAtNDcyMSw3ICs0NjcxLDcgQEAKIAkJCSsgU3RhdHVzLT5SeEJ1ZlNoaWZ0KTsKIH0KIAotdm9pZCBydGw4MTkyX3J4X25vbWFsKHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCBydGw4MTkyX3J4X25vbWFsKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJcnRsODE5Ml9yeF9pbmZvICppbmZvID0gKHN0cnVjdCBydGw4MTkyX3J4X2luZm8gKilza2ItPmNiOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbmZvLT5kZXY7CkBAIC00ODcxLDggKzQ4MjEsOCBAQAogCiB9CiAKLXZvaWQgcnRsODE5eHVzYl9wcm9jZXNzX3JlY2VpdmVkX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpwc3RhdHMpCitzdGF0aWMgdm9pZCBydGw4MTl4dXNiX3Byb2Nlc3NfcmVjZWl2ZWRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpwc3RhdHMpCiB7CiAJdTgJKmZyYW1lOwogCXUxNiAgICAgZnJhbWVfbGVuID0gMDsKQEAgLTQ5MzIsNyArNDg4Miw3IEBACiB9CiAKIAotdm9pZCBydGw4MTkyX3J4X2NtZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgcnRsODE5Ml9yeF9jbWQoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICppbmZvID0gKHN0cnVjdCBydGw4MTkyX3J4X2luZm8gKilza2ItPmNiOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbmZvLT5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmMKaW5kZXggNDFmYjY3Yi4uZDk3YWQ3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfZG0uYwpAQCAtNTAsMzQgKzUwLDcgQEAKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGV4cG9ydCBmdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1leHRlcm4Jdm9pZAlpbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybgl2b2lkIGRlaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0KLWV4dGVybiB2b2lkIGhhbF9kbV93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQotCi1leHRlcm4Jdm9pZAlpbml0X3JhdGVfYWRhcHRpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4Jdm9pZAlkbV90eHBvd2VyX3RyYWNraW5nY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLQotZXh0ZXJuCXZvaWQJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsYm9vbCAgYmluY2gxNCk7Ci1leHRlcm4Jdm9pZAlkbV9yZXN0b3JlX2R5bmFtaWNfbWVjaGFuaXNtX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotZXh0ZXJuCXZvaWQJZG1fYmFja3VwX2R5bmFtaWNfbWVjaGFuaXNtX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotZXh0ZXJuCXZvaWQJZG1fY2hhbmdlX2R5bmFtaWNfaW5pdGdhaW5fdGhyZXNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQkJCXUzMgkJZG1fdHlwZSwKLQkJCQkJCQkJdTMyCQlkbV92YWx1ZSk7Ci1leHRlcm4Jdm9pZAlETV9DaGFuZ2VGc3luY1NldHRpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJCQkJCQkJCXMzMgkJRE1fVHlwZSwKLQkJCQkJCQkJCQkJCXMzMgkJRE1fVmFsdWUpOwotZXh0ZXJuCXZvaWQgZG1fZm9yY2VfdHhfZndfaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkJCQkJCXUzMgkJZm9yY2VfdHlwZSwKLQkJCQkJCQkJCQl1MzIJCWZvcmNlX3ZhbHVlKTsKLWV4dGVybgl2b2lkCWRtX2luaXRfZWRjYV90dXJibyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybgl2b2lkCWRtX3JmX29wZXJhdGlvbl90ZXN0X2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1leHRlcm4Jdm9pZAlkbV9yZl9wYXRoY2hlY2tfd29ya2l0ZW1jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotZXh0ZXJuCXZvaWQgZG1fZnN5bmNfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKIGV4dGVybgl2b2lkIGRtX2NoZWNrX2ZzeW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotZXh0ZXJuCXZvaWQJZG1fc2hhZG93X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBleHBvcnQgZnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0xNTUsOCArMTI4LDcgQEAKIC8vCQlUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgaW52b2tlZCBhdCBkcml2ZXIgaW50aWFsaXphdGlvbiBvbmNlLgogLy8KIC8vCi1leHRlcm4Jdm9pZAotaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3ZvaWQgaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAKQEAgLTE3Niw3ICsxNDgsNyBAQAogCiB9CS8vIEluaXRIYWxEbQogCi1leHRlcm4gdm9pZCBkZWluaXRfaGFsX2RtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit2b2lkIGRlaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAogCWRtX2RlSW5pdF9mc3luYyhkZXYpOwpAQCAtMjQyLDcgKzIxNCw3IEBACiAKIAogCi1leHRlcm4gIHZvaWQgICAgaGFsX2RtX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit2b2lkIGhhbF9kbV93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCS8vc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCkBAIC0yNzUsNyArMjQ3LDcgQEAKICAgKgkwMS8xNi8yMDA4CU1IQwkJUkZfVHlwZSBpcyBhc3NpZ25lZCBpbiBSZWFkQWRhcHRlckluZm8oKS4gV2UgbXVzdCBjYWxsCiAgICoJCQkJCQl0aGUgZnVuY3Rpb24gYWZ0ZXIgbWFraW5nIHN1cmUgUkZfVHlwZS4KICAgKi8KLWV4dGVybiB2b2lkIGluaXRfcmF0ZV9hZGFwdGl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQordm9pZCBpbml0X3JhdGVfYWRhcHRpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKQEAgLTg3NSw3ICs4NDcsNyBAQAogCXByaXYtPnR4cG93ZXJfY291bnQgPSAwOwogfQogCi1leHRlcm4Jdm9pZAlkbV90eHBvd2VyX3RyYWNraW5nY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQordm9pZCBkbV90eHBvd2VyX3RyYWNraW5nY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssc3RydWN0IGRlbGF5ZWRfd29yayx3b3JrKTsKICAgICAgICBzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihkd29yayxzdHJ1Y3QgcjgxOTJfcHJpdix0eHBvd2VyX3RyYWNraW5nX3dxKTsKQEAgLTE2MDYsMTAgKzE1NzgsNyBAQAogCiAKIAotZXh0ZXJuIHZvaWQgZG1fY2NrX3R4cG93ZXJfYWRqdXN0KAotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JYm9vbCAgYmluY2gxNAotKQordm9pZCBkbV9jY2tfdHhwb3dlcl9hZGp1c3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYm9vbCBiaW5jaDE0KQogewkvLyBkbV9DQ0tUeFBvd2VyQWRqdXN0CiAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CkBAIC0xNjQyLDcgKzE2MTEsNyBAQAogCiB9CS8vIGRtX1RYUG93ZXJSZXNldFJlY292ZXJ5CiAKLWV4dGVybiB2b2lkIGRtX3Jlc3RvcmVfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3ZvaWQgZG1fcmVzdG9yZV9keW5hbWljX21lY2hhbmlzbV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1MzIJcmVnX3JhdHIgPSBwcml2LT5yYXRlX2FkYXB0aXZlLmxhc3RfcmF0cjsKQEAgLTE3MTgsNyArMTY4Nyw3IEBACiB9CS8vIGRtX0JCSW5pdGlhbEdhaW5SZXN0b3JlCiAKIAotZXh0ZXJuIHZvaWQgZG1fYmFja3VwX2R5bmFtaWNfbWVjaGFuaXNtX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit2b2lkIGRtX2JhY2t1cF9keW5hbWljX21lY2hhbmlzbV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIApAQCAtMTc3Myw5ICsxNzQyLDkgQEAKICAqCTA1LzI5LzIwMDgJYW15CQlDcmVhdGUgVmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCiAgKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotZXh0ZXJuIHZvaWQgZG1fY2hhbmdlX2R5bmFtaWNfaW5pdGdhaW5fdGhyZXNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQkJCXUzMgkJZG1fdHlwZSwKLQkJCQkJCQkJdTMyCQlkbV92YWx1ZSkKKwordm9pZCBkbV9jaGFuZ2VfZHluYW1pY19pbml0Z2Fpbl90aHJlc2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRtX3R5cGUsCisJCQkJICAgICAgIHUzMiBkbV92YWx1ZSkKIHsKIAlpZiAoZG1fdHlwZSA9PSBESUdfVFlQRV9USFJFU0hfSElHSCkKIAl7CkBAIC0xODQyLDI0ICsxODExLDggQEAKIAkJZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9tYXggPSAodTgpZG1fdmFsdWU7CiAJfQogfQkvKiBETV9DaGFuZ2VEeW5hbWljSW5pdEdhaW5UaHJlc2ggKi8KLWV4dGVybgl2b2lkCi1kbV9jaGFuZ2VfZnN5bmNfc2V0dGluZygKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCXMzMgkJRE1fVHlwZSwKLQlzMzIJCURNX1ZhbHVlKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAotCWlmIChETV9UeXBlID09IDApCS8vIG1vbml0b3IgMHhjMzggcmVnaXN0ZXIKLQl7Ci0JCWlmKERNX1ZhbHVlID4gMSkKLQkJCURNX1ZhbHVlID0gMTsKLQkJcHJpdi0+ZnJhbWVzeW5jTW9uaXRvciA9ICh1OClETV9WYWx1ZTsKLQkJLy9EYmdQcmludCgicEhhbERhdGEtPmZyYW1lc3luY01vbml0b3IgPSAlZCIsIHBIYWxEYXRhLT5mcmFtZXN5bmNNb25pdG9yKTsKLQl9Ci19Ci0KLWV4dGVybiB2b2lkCit2b2lkCiBkbV9jaGFuZ2VfcnhwYXRoX3NlbGVjdGlvbl9zZXR0aW5nKAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJczMyCQlETV9UeXBlLApAQCAtMjU0MCw3ICsyNDkzLDcgQEAKIAl9CiB9CiAKLWV4dGVybiB2b2lkIGRtX2luaXRfZWRjYV90dXJibyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQordm9pZCBkbV9pbml0X2VkY2FfdHVyYm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAKQEAgLTI2NjAsMjYgKzI2MTMsNiBAQAogCWxhc3RSeE9rQ250ID0gcHJpdi0+c3RhdHMucnhieXRlc3VuaWNhc3Q7CiB9CS8vIGRtX0NoZWNrRWRjYVR1cmJvCiAKLWV4dGVybiB2b2lkIERNX0NUU1RvU2VsZlNldHRpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1MzIgRE1fVHlwZSwgdTMyIERNX1ZhbHVlKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2KTsKLQotCWlmIChETV9UeXBlID09IDApCS8vIENUUyB0byBzZWxmIGRpc2FibGUvZW5hYmxlCi0JewotCQlpZihETV9WYWx1ZSA+IDEpCi0JCQlETV9WYWx1ZSA9IDE7Ci0JCXByaXYtPmllZWU4MDIxMS0+YkNUU1RvU2VsZkVuYWJsZSA9IChib29sKURNX1ZhbHVlOwotCQkvL0RiZ1ByaW50KCJwTWdudEluZm8tPmJDVFNUb1NlbGZFbmFibGUgPSAlZFxuIiwgcE1nbnRJbmZvLT5iQ1RTVG9TZWxmRW5hYmxlKTsKLQl9Ci0JZWxzZSBpZihETV9UeXBlID09IDEpIC8vQ1RTIHRvIHNlbGYgVGgKLQl7Ci0JCWlmKERNX1ZhbHVlID49IDUwKQotCQkJRE1fVmFsdWUgPSA1MDsKLQkJcHJpdi0+aWVlZTgwMjExLT5DVFNUb1NlbGZUSCA9ICh1OClETV9WYWx1ZTsKLQkJLy9EYmdQcmludCgicE1nbnRJbmZvLT5DVFNUb1NlbGZUSCA9ICVkXG4iLCBwTWdudEluZm8tPkNUU1RvU2VsZlRIKTsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIGRtX2luaXRfY3RzdG9zZWxmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdigoc3RydWN0IG5ldF9kZXZpY2UgKilkZXYpOwpAQCAtMjc3OSw3ICsyNzEyLDcgQEAKICAqCTAxLzMwLzIwMDgJTUhDCQlDcmVhdGUgVmVyc2lvbiAwLgogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWV4dGVybgl2b2lkCWRtX3JmX3BhdGhjaGVja193b3JraXRlbWNhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3ZvaWQgZG1fcmZfcGF0aGNoZWNrX3dvcmtpdGVtY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssc3RydWN0IGRlbGF5ZWRfd29yayx3b3JrKTsKICAgICAgICBzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihkd29yayxzdHJ1Y3QgcjgxOTJfcHJpdixyZnBhdGhfY2hlY2tfd3EpOwpAQCAtMzEzOSw3ICszMDcyLDcgQEAKIAlkZWxfdGltZXJfc3luYygmcHJpdi0+ZnN5bmNfdGltZXIpOwogfQogCi1leHRlcm4gdm9pZCBkbV9mc3luY190aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpCit2b2lkIGRtX2ZzeW5jX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpOwpAQCAtMzQ3OCw3ICszNDExLDcgQEAKICAqCTA1LzI5LzIwMDgJYW15CQlDcmVhdGUgVmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCiAgKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotZXh0ZXJuIHZvaWQgZG1fc2hhZG93X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3ZvaWQgZG1fc2hhZG93X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAl1OAlwYWdlOwogCXUxNglvZmZzZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmgKaW5kZXggYWU1NTA1Mi4uMzAwOGY5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfZG0uaApAQCAtMjAwLDkgKzIwMCw5IEBACiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1leHRlcm4JZGlnX3QJZG1fZGlndGFibGU7Ci1leHRlcm4JdTgJCWRtX3NoYWRvd1sxNl1bMjU2XTsKLWV4dGVybiBEUnhQYXRoU2VsICAgICAgRE1fUnhQYXRoU2VsVGFibGU7CitleHRlcm4gZGlnX3QgZG1fZGlndGFibGU7CitleHRlcm4gdTggZG1fc2hhZG93WzE2XVsyNTZdOworZXh0ZXJuIERSeFBhdGhTZWwgRE1fUnhQYXRoU2VsVGFibGU7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogCkBAIC0yMTIsMjUgKzIxMiwyMyBAQAogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnRlZCBGdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotZXh0ZXJuICB2b2lkICAgIGluaXRfaGFsX2RtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotZXh0ZXJuICB2b2lkIGRlaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0KK2V4dGVybiB2b2lkIGluaXRfaGFsX2RtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZGVpbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGhhbF9kbV93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQotZXh0ZXJuICB2b2lkICAgIGluaXRfcmF0ZV9hZGFwdGl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybiAgdm9pZCAgICBkbV90eHBvd2VyX3RyYWNraW5nY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLWV4dGVybiAgdm9pZCAgICBkbV9yZXN0b3JlX2R5bmFtaWNfbWVjaGFuaXNtX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotZXh0ZXJuICB2b2lkICAgIGRtX2JhY2t1cF9keW5hbWljX21lY2hhbmlzbV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybiAgdm9pZCAgICBkbV9jaGFuZ2VfZHluYW1pY19pbml0Z2Fpbl90aHJlc2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJCXUzMiBkbV90eXBlLCB1MzIgZG1fdmFsdWUpOwotZXh0ZXJuICB2b2lkICAgIGRtX2ZvcmNlX3R4X2Z3X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJdTMyIGZvcmNlX3R5cGUsIHUzMiBmb3JjZV92YWx1ZSk7Ci1leHRlcm4gIHZvaWQgICAgZG1faW5pdF9lZGNhX3R1cmJvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotZXh0ZXJuICB2b2lkICAgIGRtX3JmX29wZXJhdGlvbl90ZXN0X2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1leHRlcm4gIHZvaWQgICAgZG1fcmZfcGF0aGNoZWNrX3dvcmtpdGVtY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLWV4dGVybiAgdm9pZCBkbV9mc3luY190aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOwotZXh0ZXJuCXZvaWQJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJvb2wgIGJpbmNoMTQpOwotZXh0ZXJuICB2b2lkICAgIGRtX3NoYWRvd19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaW5pdF9yYXRlX2FkYXB0aXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZG1fdHhwb3dlcl90cmFja2luZ2NhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitleHRlcm4gdm9pZCBkbV9yZXN0b3JlX2R5bmFtaWNfbWVjaGFuaXNtX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZG1fYmFja3VwX2R5bmFtaWNfbWVjaGFuaXNtX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZG1fY2hhbmdlX2R5bmFtaWNfaW5pdGdhaW5fdGhyZXNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgIHUzMiBkbV90eXBlLCB1MzIgZG1fdmFsdWUpOworZXh0ZXJuIHZvaWQgZG1fZm9yY2VfdHhfZndfaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXUzMiBmb3JjZV90eXBlLCB1MzIgZm9yY2VfdmFsdWUpOworZXh0ZXJuIHZvaWQgZG1faW5pdF9lZGNhX3R1cmJvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZG1fcmZfb3BlcmF0aW9uX3Rlc3RfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKK2V4dGVybiB2b2lkIGRtX3JmX3BhdGhjaGVja193b3JraXRlbWNhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitleHRlcm4gdm9pZCBkbV9mc3luY190aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOworZXh0ZXJuIHZvaWQgZG1fY2NrX3R4cG93ZXJfYWRqdXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJvb2wgIGJpbmNoMTQpOworZXh0ZXJuIHZvaWQgZG1fc2hhZG93X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBkbV9pbml0aWFsaXplX3R4cG93ZXJfdHJhY2tpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0ZWQgRnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9IVEdlbi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9IVEdlbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTQ2NzhmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfSFRHZW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8vCi0vLyBJT1QgQWN0aW9uIGZvciBkaWZmZXJlbnQgQVAKLS8vCi10eXBlZGVmIGVudW0gX0hUX0lPVF9BQ1RJT057Ci0JSFRfSU9UX0FDVF9UWF9VU0VfQU1TRFVfNEsgPSAweDAwMDAwMDAxLAotCUhUX0lPVF9BQ1RfVFhfVVNFX0FNU0RVXzhLID0gMHgwMDAwMDAwMiwKLQlIVF9JT1RfQUNUX0RFQ0xBUkVfTUNTMTMgPSAweDAwMDAwMDA0LAotCUhUX0lPVF9BQ1RfRElTQUJMRV9FRENBX1RVUkJPID0gMHgwMDAwMDAwOCwKLQlIVF9JT1RfQUNUX01HTlRfVVNFX0NDS182TSA9IDB4MDAwMDAwMTAsCi0JSFRfSU9UX0FDVF9DRERfRlNZTkMgPSAweDAwMDAwMDIwLAotCUhUX0lPVF9BQ1RfUFVSRV9OX01PREUgPSAweDAwMDAwMDQwLAotfUhUX0lPVF9BQ1RJT05fRSwgKlBIVF9JT1RfQUNUSU9OX0U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX0hUVHlwZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9IVFR5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNiYjhlNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX0hUVHlwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzc5ICswLDAgQEAKLSNpZm5kZWYgX1I4MTlYVV9IVFRZUEVfSF8KLSNkZWZpbmUgX1I4MTlYVV9IVFRZUEVfSF8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFRoZSBIVCBDYXBhYmlsaXR5IGVsZW1lbnQgaXMgcHJlc2VudCBpbiBiZWFjb25zLCBhc3NvY2lhdGlvbiByZXF1ZXN0LAotICogcmVhc3NvY2lhdGlvbiByZXF1ZXN0IGFuZCBwcm9iZSByZXNwb25zZSBmcmFtZXMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIE9wZXJhdGlvbiBtb2RlIHZhbHVlICovCi0jZGVmaW5lIEhUX09QTU9ERV9OT19QUk9URUNUCQkwCi0jZGVmaW5lIEhUX09QTU9ERV9PUFRJT05BTAkJMQotI2RlZmluZSBIVF9PUE1PREVfNDBNSFpfUFJPVEVDVAkJMgotI2RlZmluZSBIVF9PUE1PREVfTUlYRUQJCQkzCi0KLS8qIE1JTU8gUG93ZXIgU2F2ZSBTZXR0aW5ncyAqLwotI2RlZmluZSBNSU1PX1BTX1NUQVRJQwkJCTAKLSNkZWZpbmUgTUlNT19QU19EWU5BTUlDCQkJMQotI2RlZmluZSBNSU1PX1BTX05PTElNSVQJCQkzCi0KLQotLyogVGhlcmUgc2hvdWxkIGJlIDEyOCBiaXRzIHRvIGNvdmVyIGFsbCBvZiB0aGUgTUNTIHJhdGVzLiBIb3dldmVyLCBzaW5jZQotICogODE5MCBkb2VzIG5vdCBzdXBwb3J0IHRvbyBtdWNoIHJhdGVzLCBvbmUgaW50ZWdlciBpcyBxdWl0ZSBlbm91Z2guICovCi0KLSNkZWZpbmUgc0hUQ0xuZwkJCQk0Ci0KLQotI2RlZmluZSBIVF9TVVBQT1JURURfTUNTXzFTU19CSVRNQVAJMHgwMDAwMDBmZgotI2RlZmluZSBIVF9TVVBQT1JURURfTUNTXzJTU19CSVRNQVAJMHgwMDAwZmYwMAotI2RlZmluZSBIVF9TVVBQT1JURURfTUNTXzFTU18yU1NfQklUTUFQCVwKLQkJKEhUX01DU18xU1NfQklUTUFQIHwgSFRfTUNTXzFTU18yU1NfQklUTUFQKQotCi0KLXR5cGVkZWYgZW51bSBfSFRfTUNTX1JBVEUgewotCUhUX01DUzAgICA9IDB4MDAwMDAwMDEsCi0JSFRfTUNTMSAgID0gMHgwMDAwMDAwMiwKLQlIVF9NQ1MyICAgPSAweDAwMDAwMDA0LAotCUhUX01DUzMgICA9IDB4MDAwMDAwMDgsCi0JSFRfTUNTNCAgID0gMHgwMDAwMDAxMCwKLQlIVF9NQ1M1ICAgPSAweDAwMDAwMDIwLAotCUhUX01DUzYgICA9IDB4MDAwMDAwNDAsCi0JSFRfTUNTNyAgID0gMHgwMDAwMDA4MCwKLQlIVF9NQ1M4ICAgPSAweDAwMDAwMTAwLAotCUhUX01DUzkgICA9IDB4MDAwMDAyMDAsCi0JSFRfTUNTMTAgID0gMHgwMDAwMDQwMCwKLQlIVF9NQ1MxMSAgPSAweDAwMDAwODAwLAotCUhUX01DUzEyICA9IDB4MDAwMDEwMDAsCi0JSFRfTUNTMTMgID0gMHgwMDAwMjAwMCwKLQlIVF9NQ1MxNCAgPSAweDAwMDA0MDAwLAotCUhUX01DUzE1ICA9IDB4MDAwMDgwMDAsCi0JLyogRG8gbm90IGRlZmluZSBNQ1MzMiBoZXJlIGFsdGhvdWdoIDgxOTAgc3VwcG9ydCBNQ1MzMiAqLwotfSBIVF9NQ1NfUkFURSwgKlBIVF9NQ1NfUkFURTsKLQotLyogUmVwcmVzZW50IENoYW5uZWwgV2lkdGggaW4gSFQgQ2FwYWJpbGl0aWVzICovCi10eXBlZGVmIGVudW0gX0hUX0NIQU5ORUxfV0lEVEggewotCUhUX0NIQU5ORUxfV0lEVEhfMjAgICAgPSAwLAotCUhUX0NIQU5ORUxfV0lEVEhfMjBfNDAgPSAxLAotfSBIVF9DSEFOTkVMX1dJRFRILCAqUEhUX0NIQU5ORUxfV0lEVEg7Ci0KLS8qIFJlcHJlc2VudCBFeHRlbnNpb24gQ2hhbm5lbCBPZmZzZXQgaW4gSFQgQ2FwYWJpbGl0aWVzCi0gKiBUaGlzIGlzIGF2YWlsYWJsZSBvbmx5IGluIDQwTWh6IG1vZGUuICovCi10eXBlZGVmIGVudW0gX0hUX0VYVENITkxfT0ZGU0VUIHsKLQlIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQgPSAwLAotCUhUX0VYVENITkxfT0ZGU0VUX1VQUEVSICA9IDEsCi0JSFRfRVhUQ0hOTF9PRkZTRVRfTk9fREVGID0gMiwKLQlIVF9FWFRDSE5MX09GRlNFVF9MT1dFUiAgPSAzLAotfSBIVF9FWFRDSE5MX09GRlNFVCwgKlBIVF9FWFRDSE5MX09GRlNFVDsKLQotdHlwZWRlZiBlbnVtIF9DSE5MT1AgewotCUNITkxPUF9OT05FICAgPSAwLAkvKiBObyBBY3Rpb24gbm93ICovCi0JQ0hOTE9QX1NDQU4gICA9IDEsCS8qIFNjYW4gaW4gcHJvZ3Jlc3MgKi8KLQlDSE5MT1BfU1dCVyAgID0gMiwJLyogQmFuZHdpZHRoIHN3aXRjaGluZyBpbiBwcm9ncmVzcyAqLwotCUNITkxPUF9TV0NITkwgPSAzLAkvKiBTb2Z0d2FyZSBDaGFubmVsIHN3aXRjaGluZyBpbiBwcm9ncmVzcyAqLwotfSBDSE5MT1AsICpQQ0hOTE9QOwotCi0vKiBEZXRlcm1pbmUgaWYgdGhlIENoYW5uZWwgT3BlcmF0aW9uIGlzIGluIHByb2dyZXNzICovCi0jZGVmaW5lIENISExPUF9JTl9QUk9HUkVTUyhfcEhUSW5mbykJXAotCQkoKChfcEhUSW5mbyktPkNobmxPcCA+IENITkxPUF9OT05FKSA/IFRSVUUgOiBGQUxTRSkKLQotCi10eXBlZGVmIGVudW0gX0hUX0FDVElPTiB7Ci0JQUNUX1JFQ09NTUFORF9XSURUSAkJPSAwLAotCUFDVF9NSU1PX1BXUl9TQVZFCQk9IDEsCi0JQUNUX1BTTVAJCQk9IDIsCi0JQUNUX1NFVF9QQ09fUEhBU0UJCT0gMywKLQlBQ1RfTUlNT19DSExfTUVBU1VSRQkJPSA0LAotCUFDVF9SRUNJUFJPQ0lUWV9DT1JSRUNUCQk9IDUsCi0JQUNUX01JTU9fQ1NJX01BVFJJQ1MJCT0gNiwKLQlBQ1RfTUlNT19OT0NPTVBSX1NURUVSCQk9IDcsCi0JQUNUX01JTU9fQ09NUFJfU1RFRVIJCT0gOCwKLQlBQ1RfQU5URU5OQV9TRUxFQ1QJCT0gOSwKLX0gSFRfQUNUSU9OLCAqUEhUX0FDVElPTjsKLQotCi0vKiBEZWZpbmUgc3ViLWNhcnJpZXIgbW9kZSBmb3IgNDBNSFouICovCi10eXBlZGVmIGVudW0gX0hUX0JhbmR3aWR0aF80ME1IWl9TdWJfQ2FycmllciB7Ci0JU0NfTU9ERV9EVVBMSUNBVEUgPSAwLAotCVNDX01PREVfTE9XRVIgICAgID0gMSwKLQlTQ19NT0RFX1VQUEVSICAgICA9IDIsCi0JU0NfTU9ERV9GVUxMNDBNSFogPSAzLAotfSBIVF9CVzQwX1NDX0U7Ci0KLXR5cGVkZWYJc3RydWN0IF9IVF9DQVBBQklMSVRZX0VMRSB7Ci0KLQkvKiBIVCBjYXBhYmlsaXR5IGluZm8gKi8KLQl1OAlBZHZDb2Rpbmc6MTsKLQl1OAlDaGxXaWR0aDoxOwotCXU4CU1pbW9Qd3JTYXZlOjI7Ci0JdTgJR3JlZW5GaWVsZDoxOwotCXU4CVNob3J0R0kyME1oejoxOwotCXU4CVNob3J0R0k0ME1oejoxOwotCXU4CVR4U1RCQzoxOwotCXU4CVJ4U1RCQzoyOwotCXU4CURlbGF5QkE6MTsKLQl1OAlNYXhBTVNEVVNpemU6MTsKLQl1OAlEc3NDQ2s6MTsKLQl1OAlQU01QOjE7Ci0JdTgJUnN2ZDE6MTsKLQl1OAlMU2lnVHhvcFByb3RlY3Q6MTsKLQotCS8qIE1BQyBIVCBwYXJhbWV0ZXJzIGluZm8gKi8KLQl1OAlNYXhSeEFNUERVRmFjdG9yOjI7Ci0JdTgJTVBEVURlbnNpdHk6MzsKLQl1OAlSc3ZkMjozOwotCi0JLyogU3VwcG9ydGVkIE1DUyBzZXQgKi8KLQl1OAlNQ1NbMTZdOwotCi0KLQkvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXR5IEluZm8gKi8KLQl1MTYJRXh0SFRDYXBJbmZvOwotCi0JLyogVFhCRiBDYXBhYmlsaXRpZXMgKi8KLQl1OAlUeEJGQ2FwWzRdOwotCi0JLyogQW50ZW5uYSBTZWxlY3Rpb24gQ2FwYWJpbGl0aWVzICovCi0JdTgJQVNDYXA7Ci0KLX0gX19wYWNrZWQgSFRfQ0FQQUJJTElUWV9FTEUsICpQSFRfQ0FQQUJJTElUWV9FTEU7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBUaGUgSFQgSW5mb3JtYXRpb24gZWxlbWVudCBpcyBwcmVzZW50IGluIGJlYWNvbnMKLSAqIE9ubHkgQVAgaXMgcmVxdWlyZWQgdG8gaW5jbHVkZSB0aGlzIGVsZW1lbnQKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX0hUX0lORk9STUFUSU9OX0VMRSB7Ci0JdTgJQ29udHJvbENobDsKLQotCXU4CUV4dENobE9mZnNldDoyOwotCXU4CVJlY29tbWVtZGVkVHhXaWR0aDoxOwotCXU4CVJJRlM6MTsKLQl1OAlQU01QQWNjZXNzT25seToxOwotCXU4CVNydkludEdyYW51bGFyaXR5OjM7Ci0KLQl1OAlPcHRNb2RlOjI7Ci0JdTgJTm9uR0ZEZXZQcmVzZW50OjE7Ci0JdTgJUmV2ZDE6NTsKLQl1OAlSZXZkMjo4OwotCi0JdTgJUnN2ZDM6NjsKLQl1OAlEdWFsQmVhY29uOjE7Ci0JdTgJRHVhbENUU1Byb3RlY3Q6MTsKLQotCXU4CVNlY29uZGFyeUJlYWNvbjoxOwotCXU4CUxTaWdUeG9wUHJvdGVjdEZ1bGw6MTsKLQl1OAlQY29BY3RpdmU6MTsKLQl1OAlQY29QaGFzZToxOwotCXU4CVJzdmQ0OjQ7Ci0KLQl1OAlCYXNpY01TQ1sxNl07Ci19IF9fcGFja2VkIEhUX0lORk9STUFUSU9OX0VMRSwgKlBIVF9JTkZPUk1BVElPTl9FTEU7Ci0KLS8qIE1JTU8gUG93ZXIgU2F2ZSBjb250cm9sIGZpZWxkLgotICogVGhpcyBpcyBhcHBlYXIgaW4gTUlNTyBQb3dlciBTYXZlIEFjdGlvbiBGcmFtZSAqLwotdHlwZWRlZiBzdHJ1Y3QgX01JTU9QU19DVFJMIHsKLQl1OAlNaW1vUHNFbmFibGU6MTsKLQl1OAlNaW1vUHNNb2RlOjE7Ci0JdTgJUmVzZXJ2ZWQ6NjsKLX0gTUlNT1BTX0NUUkwsICpQTUlNT1BTX0NUUkw7Ci0KLXR5cGVkZWYgZW51bSBfSFRfU1BFQ19WRVIgewotCUhUX1NQRUNfVkVSX0lFRUUgPSAwLAotCUhUX1NQRUNfVkVSX0VXQyA9IDEsCi19IEhUX1NQRUNfVkVSLCAqUEhUX1NQRUNfVkVSOwotCi10eXBlZGVmIGVudW0gX0hUX0FHR1JFX01PREVfRSB7Ci0JSFRfQUdHX0FVVE8gPSAwLAotCUhUX0FHR19GT1JDRV9FTkFCTEUgPSAxLAotCUhUX0FHR19GT1JDRV9ESVNBQkxFID0gMiwKLX0gSFRfQUdHUkVfTU9ERV9FLCAqUEhUX0FHR1JFX01PREVfRTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgVGhlIERhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCBIVCByZWxhdGVkIHZhcmlhYmxlcyB3aGVuIGNhcmQgaXMKLSAqICBjb25maWd1cmVkIGFzIG5vbi1BUCBTVEEgbW9kZS4KLSAqICAqKk5vdGUqKiBDdXJyZW50X3h4eCBzaG91bGQgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWUgaW4gSFRJbml0aWFsaXplSFRJbmZvKCkKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgc3RydWN0IF9SVF9ISUdIX1RIUk9VR0hQVVQgewotCXU4CQkJYkVuYWJsZUhUOwotCXU4CQkJYkN1cnJlbnRIVFN1cHBvcnQ7Ci0JLyogVHggNDBNSHogY2hhbm5lbCBjYXBhYmlsaXR5ICovCi0JdTgJCQliUmVnQlc0ME1IejsKLQl1OAkJCWJDdXJCVzQwTUh6OwotCS8qIFR4IFNob3J0IEdJIGZvciA0ME1oeiAqLwotCXU4CQkJYlJlZ1Nob3J0R0k0ME1IejsKLQl1OAkJCWJDdXJTaG9ydEdJNDBNSHo7Ci0JLyogVHggU2hvcnQgR0kgZm9yIDIwTUh6ICovCi0JdTgJCQliUmVnU2hvcnRHSTIwTUh6OwotCXU4CQkJYkN1clNob3J0R0kyME1IejsKLQkvKiBUeCBDQ0sgcmF0ZSBjYXBhYmlsaXR5ICovCi0JdTgJCQliUmVnU3VwcENDSzsKLQl1OAkJCWJDdXJTdXBwQ0NLOwotCi0JLyogODAyLjExbiBzcGVjIHZlcnNpb24gZm9yICJwZWVyIiAqLwotCUhUX1NQRUNfVkVSCQllUGVlckhUU3BlY1ZlcjsKLQotCi0JLyogSFQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgIlNlbGYiICovCi0JLyogVGhpcyBpcyBIVCBjYXAgZWxlbWVudCBzZW50IHRvIHBlZXIgU1RBLCB3aGljaCBhbHNvIGluZGljYXRlCi0JICogSFQgUnggY2FwYWJpbGl0aWVzLiAqLwotCUhUX0NBUEFCSUxJVFlfRUxFCVNlbGZIVENhcDsKLQlIVF9JTkZPUk1BVElPTl9FTEUJU2VsZkhUSW5mbzsKLQotCS8qIEhUIHJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yICJQZWVyIiAqLwotCXU4CQkJUGVlckhUQ2FwQnVmWzMyXTsKLQl1OAkJCVBlZXJIVEluZm9CdWZbMzJdOwotCi0KLQkvKiBBLU1TRFUgcmVsYXRlZCAqLwotCS8qIFRoaXMgaW5kaWNhdGVzIFR4IEEtTVNEVSBjYXBhYmlsaXR5ICovCi0JdTgJCQliQU1TRFVfU3VwcG9ydDsKLQl1MTYJCQluQU1TRFVfTWF4U2l6ZTsKLQl1OAkJCWJDdXJyZW50X0FNU0RVX1N1cHBvcnQ7Ci0JdTE2CQkJbkN1cnJlbnRfQU1TRFVfTWF4U2l6ZTsKLQotCi0JLyogQS1NUERVIHJlbGF0ZWQgKi8KLQkvKiBUaGlzIGluZGljYXRlIFR4IEEtTVBEVSBjYXBhYmlsaXR5ICovCi0JdTgJCQliQU1QRFVFbmFibGU7Ci0JdTgJCQliQ3VycmVudEFNUERVRW5hYmxlOwotCXU4CQkJQU1QRFVfRmFjdG9yOwotCXU4CQkJQ3VycmVudEFNUERVRmFjdG9yOwotCXU4CQkJTVBEVV9EZW5zaXR5OwotCXU4CQkJQ3VycmVudE1QRFVEZW5zaXR5OwotCi0JLyogRm9yY2VkIEEtTVBEVSBlbmFibGUgKi8KLQlIVF9BR0dSRV9NT0RFX0UJCUZvcmNlZEFNUERVTW9kZTsKLQl1OAkJCUZvcmNlZEFNUERVRmFjdG9yOwotCXU4CQkJRm9yY2VkTVBEVURlbnNpdHk7Ci0KLQkvKiBGb3JjZWQgQS1NU0RVIGVuYWJsZSAqLwotCUhUX0FHR1JFX01PREVfRQkJRm9yY2VkQU1TRFVNb2RlOwotCXUxNgkJCUZvcmNlZEFNU0RVTWF4U2l6ZTsKLQotCXU4CQkJYkZvcmNlZFNob3J0R0k7Ci0KLQl1OAkJCUN1cnJlbnRPcE1vZGU7Ci0KLQkvKiBNSU1PIFBTIHJlbGF0ZWQgKi8KLQl1OAkJCVNlbGZNaW1vUHM7Ci0JdTgJCQlQZWVyTWltb1BzOwotCi0JLyogNDBNSHogQ2hhbm5lbCBPZmZzZXQgc2V0dGluZ3MuICovCi0JSFRfRVhUQ0hOTF9PRkZTRVQJQ3VyU1RBRXh0Q2hubE9mZnNldDsKLQl1OAkJCWJDdXJUeEJXNDBNSHo7CS8qIElmIHdlIHVzZSA0MCBNSHogdG8gVHggKi8KLQl1OAkJCVBlZXJCYW5kd2lkdGg7Ci0KLQkvKiBGb3IgQmFuZHdpZHRoIFN3aXRjaGluZyAqLwotCXU4CQkJYlN3QndJblByb2dyZXNzOwotCUNITkxPUAkJCUNobmxPcDsgLyogc3cgc3dpdGNoaW5nIGNoYW5uZWwgaW4gcHJvZ3Jlc3MuICovCi0JdTgJCQlTd0J3U3RlcDsKLQlzdHJ1Y3QgdGltZXJfbGlzdAlTd0J3VGltZXI7Ci0KLQkvKiBGb3IgUmVhbHRlayBwcm9wcmlldGFyeSBBLU1QRFUgZmFjdG9yIGZvciBhZ2dyZWdhdGlvbiAqLwotCXU4CQkJYlJlZ1JUMlJUQWdncmVnYXRpb247Ci0JdTgJCQliQ3VycmVudFJUMlJUQWdncmVnYXRpb247Ci0JdTgJCQliQ3VycmVudFJUMlJUTG9uZ1Nsb3RUaW1lOwotCXU4CQkJc3pSVDJSVEFnZ0J1ZmZlclsxMF07Ci0KLQkvKiBSeCBSZW9yZGVyIGNvbnRyb2wgKi8KLQl1OAkJCWJSZWdSeFJlb3JkZXJFbmFibGU7Ci0JdTgJCQliQ3VyUnhSZW9yZGVyRW5hYmxlOwotCXU4CQkJUnhSZW9yZGVyV2luU2l6ZTsKLQl1OAkJCVJ4UmVvcmRlclBlbmRpbmdUaW1lOwotCXUxNgkJCVJ4UmVvcmRlckRyb3BDb3VudGVyOwotCi0jaWZkZWYgVVNCX1RYX0RSSVZFUl9BR0dSRUdBVElPTl9FTkFCTEUKLQl1OAkJCVVzYlR4QWdnck51bTsKLSNlbmRpZgotI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCi0JdTgJCQlVc2JSeEZ3QWdnckVuOwotCXU4CQkJVXNiUnhGd0FnZ3JQYWdlTnVtOwotCXU4CQkJVXNiUnhGd0FnZ3JQYWNrZXROdW07Ci0JdTgJCQlVc2JSeEZ3QWdnclRpbWVvdXQ7Ci0jZW5kaWYKLQotCS8qIEFkZCBmb3IgQnJvYWRjb20oTGlua3N5cykgSU9ULiAqLwotCXU4CQkJYklzUGVlckJjbTsKLQotCS8qIEZvciBJT1QgaXNzdWUuICovCi0JdTMyCQkJSU9UQWN0aW9uOwotfSBSVF9ISUdIX1RIUk9VR0hQVVQsICpQUlRfSElHSF9USFJPVUdIUFVUOwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogVGhlIERhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCBIVCByZWxhdGVkIHZhcmlhYmxlIGZvciAiZWFjaCBTdGEiCi0gKiB3aGVuIGNhcmQgaXMgY29uZmlndXJlZCBhcyAiQVAgbW9kZSIKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgc3RydWN0IF9SVF9IVElORk9fU1RBX0VOVFJZIHsKLQl1OAkJCWJFbmFibGVIVDsKLQotCXU4CQkJYlN1cHBvcnRDY2s7Ci0KLQl1MTYJCQlBTVNEVV9NYXhTaXplOwotCi0JdTgJCQlBTVBEVV9GYWN0b3I7Ci0JdTgJCQlNUERVX0RlbnNpdHk7Ci0KLQl1OAkJCUhUSGlnaGVzdE9wZXJhUmF0ZTsKLQotCXU4CQkJYkJ3NDBNSHo7Ci0KLQl1OAkJCU1pbW9QczsKLQotCXU4CQkJTWNzUmF0ZVNldFsxNl07Ci0KLQotfSBSVF9IVElORk9fU1RBX0VOVFJZLCAqUFJUX0hUSU5GT19TVEFfRU5UUlk7Ci0KLQotCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFRoZSBEYXRhIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGtlZXAgSFQgcmVsYXRlZCB2YXJpYWJsZSBmb3IgImVhY2ggQVAiCi0gKiB3aGVuIGNhcmQgaXMgY29uZmlndXJlZCBhcyAiU1RBIG1vZGUiCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgc3RydWN0IF9CU1NfSFQgewotCi0JdTgJCQkJYmRTdXBwb3J0SFQ7Ci0KLQkvKiBIVCByZWxhdGVkIGVsZW1lbnRzICovCi0JdTgJCQkJYmRIVENhcEJ1ZlszMl07Ci0JdTE2CQkJCWJkSFRDYXBMZW47Ci0JdTgJCQkJYmRIVEluZm9CdWZbMzJdOwotCXUxNgkJCQliZEhUSW5mb0xlbjsKLQotCUhUX1NQRUNfVkVSCQkJYmRIVFNwZWNWZXI7Ci0KLQl1OAkJCQliZFJUMlJUQWdncmVnYXRpb247Ci0JdTgJCQkJYmRSVDJSVExvbmdTbG90VGltZTsKLX0gQlNTX0hULCAqUEJTU19IVDsKLQotdHlwZWRlZiBzdHJ1Y3QgX01JTU9fUlNTSSB7Ci0JdTMyCUVuYWJsZUFudGVubmE7Ci0JdTMyCUFudGVubmFBOwotCXUzMglBbnRlbm5hQjsKLQl1MzIJQW50ZW5uYUM7Ci0JdTMyCUFudGVubmFEOwotCXUzMglBdmVyYWdlOwotfSBNSU1PX1JTU0ksICpQTUlNT19SU1NJOwotCi10eXBlZGVmIHN0cnVjdCBfTUlNT19FVk0gewotCXUzMglFVk0xOwotCXUzMglFVk0yOwotfSBNSU1PX0VWTSwgKlBNSU1PX0VWTTsKLQotdHlwZWRlZiBzdHJ1Y3QgX0ZBTFNFX0FMQVJNX1NUQVRJU1RJQ1MgewotCXUzMglDbnRfUGFyaXR5X0ZhaWw7Ci0JdTMyCUNudF9SYXRlX0lsbGVnYWw7Ci0JdTMyCUNudF9DcmM4X2ZhaWw7Ci0JdTMyCUNudF9hbGw7Ci19IEZBTFNFX0FMQVJNX1NUQVRJU1RJQ1MsICpQRkFMU0VfQUxBUk1fU1RBVElTVElDUzsKLQotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9jbWRwa3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfY21kcGt0LmMKaW5kZXggN2JkY2JkMy4uNzIzYzg2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9jbWRwa3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2NtZHBrdC5jCkBAIC0xODIsNyArMTgyLDcgQEAKIAogfQogCi12b2lkIGNtZHBrdF9iZWFjb250aW1lcmludGVycnVwdF84MTl4dXNiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBjbWRwa3RfYmVhY29udGltZXJpbnRlcnJ1cHRfODE5eHVzYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1MTYgdHhfcmF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmUuYwppbmRleCBkNmE2ZGUzLi5lY2ZiNjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9maXJtd2FyZS5jCkBAIC0xNyw3ICsxNyw4IEBACiAjaW5jbHVkZSAicjgxOXhVX2Zpcm13YXJlX2ltZy5oIgogI2luY2x1ZGUgInI4MTl4VV9maXJtd2FyZS5oIgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci12b2lkIGZpcm13YXJlX2luaXRfcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKworc3RhdGljIHZvaWQgZmlybXdhcmVfaW5pdF9wYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2CSpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlydF9maXJtd2FyZQkJKnBmaXJtd2FyZSA9IHByaXYtPnBGaXJtd2FyZTsKQEAgLTI5LDcgKzMwLDggQEAKICAqIHNlZ21lbnQgdGhlIGltZyBhbmQgdXNlIHRoZSBwdHIgYW5kIGxlbmd0aCB0byByZW1lbWJlciBpbmZvIG9uIGVhY2ggc2VnbWVudAogICoKICAqLwotYm9vbCBmd19kb3dubG9hZF9jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpjb2RlX3ZpcnR1YWxfYWRkcmVzcywgdTMyIGJ1ZmZlcl9sZW4pCitzdGF0aWMgYm9vbCBmd19kb3dubG9hZF9jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpjb2RlX3ZpcnR1YWxfYWRkcmVzcywKKwkJCSAgICAgdTMyIGJ1ZmZlcl9sZW4pCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgICAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJYm9vbAkJICAgIHJ0X3N0YXR1cyA9IHRydWU7CkBAIC0xMDMsNDYgKzEwNSw2IEBACiAKIH0KIAotYm9vbAotZndTZW5kTnVsbFBhY2tldCgKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCXUzMgkJCUxlbmd0aAotKQotewotCWJvb2wJcnRTdGF0dXMgPSB0cnVlOwotCXN0cnVjdCByODE5Ml9wcml2ICAgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCXN0cnVjdCBza19idWZmCSAgICAqc2tiOwotCWNiX2Rlc2MJCSAgICAqdGNiX2Rlc2M7Ci0JdW5zaWduZWQgY2hhcgkgICAgKnB0cl9idWY7Ci0JYm9vbAliTGFzdEluaXRQYWNrZXQgPSBmYWxzZTsKLQotCS8vUGxhdGZvcm1BY3F1aXJlU3BpbkxvY2soQWRhcHRlciwgUlRfVFhfU1BJTkxPQ0spOwotCi0JLy9HZXQgVENCIGFuZCBsb2NhbCBidWZmZXIgZnJvbSBjb21tb24gcG9vbC4gKEl0IGlzIHNoYXJlZCBieSBDbWRRLCBNZ250USwgYW5kIFVTQiBjb2FsZXNjZSBEYXRhUSkKLQlza2IgID0gZGV2X2FsbG9jX3NrYihMZW5ndGgrIDQpOwotCW1lbWNweSgodW5zaWduZWQgY2hhciAqKShza2ItPmNiKSwmZGV2LHNpemVvZihkZXYpKTsKLQl0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7Ci0JdGNiX2Rlc2MtPnF1ZXVlX2luZGV4ID0gVFhDTURfUVVFVUU7Ci0JdGNiX2Rlc2MtPmJDbWRPckluaXQgPSBERVNDX1BBQ0tFVF9UWVBFX0lOSVQ7Ci0JdGNiX2Rlc2MtPmJMYXN0SW5pUGt0ID0gYkxhc3RJbml0UGFja2V0OwotCXB0cl9idWYgPSBza2JfcHV0KHNrYiwgTGVuZ3RoKTsKLQltZW1zZXQocHRyX2J1ZiwwLExlbmd0aCk7Ci0JdGNiX2Rlc2MtPnR4YnVmX3NpemU9ICh1MTYpTGVuZ3RoOwotCi0JaWYgKCFwcml2LT5pZWVlODAyMTEtPmNoZWNrX25pY19lbm91Z2hfZGVzYyhkZXYsdGNiX2Rlc2MtPnF1ZXVlX2luZGV4KXx8Ci0JCQkoIXNrYl9xdWV1ZV9lbXB0eSgmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSkpfHxcCi0JCQkocHJpdi0+aWVlZTgwMjExLT5xdWV1ZV9zdG9wKSApIHsKLQkJCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsIj09PT09PT09PT09PT09PT09PT1OVUxMIHBhY2tldD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+IHR4IGZ1bGwhXG4iKTsKLQkJCXNrYl9xdWV1ZV90YWlsKCZwcml2LT5pZWVlODAyMTEtPnNrYl93YWl0UVt0Y2JfZGVzYy0+cXVldWVfaW5kZXhdLCBza2IpOwotCQl9IGVsc2UgewotCQkJcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsZGV2KTsKLQkJfQotCi0JLy9QbGF0Zm9ybVJlbGVhc2VTcGluTG9jayhBZGFwdGVyLCBSVF9UWF9TUElOTE9DSyk7Ci0JcmV0dXJuIHJ0U3RhdHVzOwotfQotCi0KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFByb2NlZHVyZTogICAgQ2hlY2sgd2hldGhlciBtYWluIGNvZGUgaXMgZG93bmxvYWQgT0suIElmIE9LLCB0dXJuIG9uIENQVQogLy8KQEAgLTE1Niw3ICsxMTgsNyBAQAogLy8gICAgICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUgLSB0aGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9uIHByb2Nlc3Mgc2hvdWxkIGJlIHRlcm1pbmF0ZWQKIC8vICAgICAgICBORElTX1NUQVRVU19TVUNDRVNTIC0gaWYgZmlybXdhcmUgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBzdWNjZXNzCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1ib29sIENQVWNoZWNrX21haW5jb2Rlb2tfdHVybm9uQ1BVKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgYm9vbCBDUFVjaGVja19tYWluY29kZW9rX3R1cm5vbkNQVShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWJvb2wJCXJ0X3N0YXR1cyA9IHRydWU7CiAJaW50CQljaGVja19wdXRjb2RlT0tfdGltZSA9IDIwMDAwMCwgY2hlY2tfYm9vdE9rX3RpbWUgPSAyMDAwMDA7CkBAIC0yMDUsNyArMTY3LDcgQEAKIAlyZXR1cm4gcnRfc3RhdHVzOwogfQogCi1ib29sIENQVWNoZWNrX2Zpcm13YXJlX3JlYWR5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgYm9vbCBDUFVjaGVja19maXJtd2FyZV9yZWFkeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCiAJYm9vbAkJcnRfc3RhdHVzID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmVfaW1nLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlX2ltZy5jCmluZGV4IGRmMGY5ZDEuLjA3ODVkZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmVfaW1nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9maXJtd2FyZV9pbWcuYwpAQCAtMSw1ICsxLDYgQEAKIC8qQ3JlYXRlZCBvbiAgMjAwOC8gNy8xNiwgIDU6MzEqLwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSAicjgxOXhVX2Zpcm13YXJlX2ltZy5oIgogCiB1MzIgUnRsODE5MlVzYlBIWV9SRUdBcnJheVtdID0gewogMHgwLCB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9waHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmMKaW5kZXggMzljZDQyNi4uYjlmMzUzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9waHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5jCkBAIC00NCw3ICs0NCw3IEBACiAgKiBvdXRwdXQ6ICAgbm9uZQogICogcmV0dXJuOiAgIHUzMglyZXR1cm4gdGhlIHNoaWZ0IGJpdCBwb3NpdGlvbiBvZiB0aGUgbWFzawogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KHUzMiBiaXRtYXNrKQorc3RhdGljIHUzMiBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KHUzMiBiaXRtYXNrKQogewogCXUzMiBpOwogCkBAIC0xNDQsOCArMTQ0LDggQEAKICAqICAgICAgICAgICAgRHJpdmVyIGhlcmUgbmVlZCB0byBpbXBsZW1lbnQgKDEpIGFuZCAoMikKICAqICAgICAgICAgICAgLS0tbmVlZCBtb3JlIHNwZWMgZm9yIHRoaXMgaW5mb3JtYXRpb24uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIHJ0bDgxOTJfcGh5X1JGU2VyaWFsUmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoLAotCQkJICAgICB1MzIgb2Zmc2V0KQorc3RhdGljIHUzMiBydGw4MTkyX3BoeV9SRlNlcmlhbFJlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIG9mZnNldCkKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTMyIHJldCA9IDA7CkBAIC0yMjksOCArMjI5LDkgQEAKICAqIFJlZ19Nb2RlMgkxCQkxCQkJUmVnIDMxIH4gNDUoMHgxIH4gMHhmKQogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJ0bDgxOTJfcGh5X1JGU2VyaWFsV3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoLCB1MzIgb2Zmc2V0LCB1MzIgZGF0YSkKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfcGh5X1JGU2VyaWFsV3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoLCB1MzIgb2Zmc2V0LAorCQkJCSAgICAgIHUzMiBkYXRhKQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1MzIgRGF0YUFuZEFkZHIgPSAwLCBuZXdfb2Zmc2V0ID0gMDsKQEAgLTU3MSw3ICs1NzIsNyBAQAogICogbm90aWNlOiAgICBJbml0aWFsaXphdGlvbiB2YWx1ZSBoZXJlIGlzIGNvbnN0YW50IGFuZCBpdCBzaG91bGQgbmV2ZXIKICAqICAgICAgICAgICAgYmUgY2hhbmdlZAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBydGw4MTkyX0luaXRCQlJGUmVnRGVmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBydGw4MTkyX0luaXRCQlJGUmVnRGVmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCkBAIC03ODAsNyArNzgxLDcgQEAKICAqIG5vdGljZTogICAgSW5pdGlhbGl6YXRpb24gdmFsdWUgbWF5IGNoYW5nZSBhbGwgdGhlIHRpbWUsIHNvIHBsZWFzZSBtYWtlCiAgKiAgICAgICAgICAgIHN1cmUgaXQgaGFzIGJlZW4gc3luY2VkIHdpdGggdGhlIG5ld2VzdC4KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJ0bDgxOTJfQkJfQ29uZmlnX1BhcmFGaWxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBydGw4MTkyX0JCX0NvbmZpZ19QYXJhRmlsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1OCByZWdfdTggPSAwLCBlQ2hlY2tJdGVtID0gMCwgc3RhdHVzID0gMDsKQEAgLTEwNzAsNyArMTA3MSw3IEBACiAgKiByZXR1cm46ICAgIG5vbmUKICAqIG5vdGljZToKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJ0bDgxOTJfU2V0VHhQb3dlckxldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGNoYW5uZWwpCitzdGF0aWMgdm9pZCBydGw4MTkyX1NldFR4UG93ZXJMZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBjaGFubmVsKQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1OAlwb3dlcmxldmVsID0gcHJpdi0+VHhQb3dlckxldmVsQ0NLW2NoYW5uZWwtMV07CkBAIC0xMjM5LDkgKzEyNDAsOSBAQAogICogcmV0dXJuOiAgICB0cnVlIGlmIGZpbmlzaGVkLCBmYWxzZSBvdGhlcndpc2UKICAqIG5vdGljZToKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBydGw4MTkyX3BoeV9TZXRTd0NobmxDbWRBcnJheShTd0NobmxDbWQgKkNtZFRhYmxlLCB1MzIgQ21kVGFibGVJZHgsCi0JCQkJIHUzMiBDbWRUYWJsZVN6LCBTd0NobmxDbWRJRCBDbWRJRCwgdTMyIFBhcmExLAotCQkJCSB1MzIgUGFyYTIsIHUzMiBtc0RlbGF5KQorc3RhdGljIHU4IHJ0bDgxOTJfcGh5X1NldFN3Q2hubENtZEFycmF5KFN3Q2hubENtZCAqQ21kVGFibGUsIHUzMiBDbWRUYWJsZUlkeCwKKwkJCQkJdTMyIENtZFRhYmxlU3osIFN3Q2hubENtZElEIENtZElELAorCQkJCQl1MzIgUGFyYTEsIHUzMiBQYXJhMiwgdTMyIG1zRGVsYXkpCiB7CiAJU3dDaG5sQ21kICpwQ21kOwogCkBAIC0xMjc2LDggKzEyNzcsOCBAQAogICogcmV0dXJuOiAgICB0cnVlIGlmIGZpbmlzaGVkLCBmYWxzZSBvdGhlcndpc2UKICAqIG5vdGljZTogICAgV2FpdCBmb3Igc2ltcGxlciBmdW5jdGlvbiB0byByZXBsYWNlIGl0CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBydGw4MTkyX3BoeV9Td0NobmxTdGVwQnlTdGVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGNoYW5uZWwsIHU4ICpzdGFnZSwKLQkJCQl1OCAqc3RlcCwgdTMyICpkZWxheSkKK3N0YXRpYyB1OCBydGw4MTkyX3BoeV9Td0NobmxTdGVwQnlTdGVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGNoYW5uZWwsCisJCQkJICAgICAgIHU4ICpzdGFnZSwgdTggKnN0ZXAsIHUzMiAqZGVsYXkpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCVN3Q2hubENtZAlQcmVDb21tb25DbWRbTUFYX1BSRUNNRF9DTlRdOwpAQCAtMTQzMyw3ICsxNDM0LDcgQEAKICAqIHJldHVybjogICAgbm9uZQogICogbm90aWNlOiAgICBXZSBzaG91bGQgbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBydGw4MTkyX3BoeV9GaW5pc2hTd0NobmxOb3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggY2hhbm5lbCkKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfcGh5X0ZpbmlzaFN3Q2hubE5vdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBjaGFubmVsKQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1MzIJZGVsYXkgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvZHJ2X3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9kcnZfdHlwZXMuaAppbmRleCBhMDc0ZmU4Li4zMzYyZTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9kcnZfdHlwZXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9kcnZfdHlwZXMuaApAQCAtMTY4LDcgKzE2OCw3IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICp4bWl0VGhyZWFkOwogCXBpZF90IHJlY3ZUaHJlYWQ7CiAJdWludCgqZHZvYmpfaW5pdCkoc3RydWN0IF9hZGFwdGVyICphZGFwdGVyKTsKLQl2b2lkICAoKmR2b2JqX2RlaW5pdCkoc3RydWN0IF9hZGFwdGVyICphZGFwdGVyKTsKKwl2b2lkICgqZHZvYmpfZGVpbml0KShzdHJ1Y3QgX2FkYXB0ZXIgKmFkYXB0ZXIpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2OwogCWludCBidXA7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9pZWVlODAyMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2llZWU4MDIxMS5jCmluZGV4IGNjNjhkOTcuLjU3ZmVmNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2llZWU4MDIxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2llZWU4MDIxMS5jCkBAIC03OCw5ICs3OCw5IEBACiAJCWlmICgoKChyYXRlW2ldKSAmIDB4N2YpID09IDIpIHx8ICgoKHJhdGVbaV0pICYgMHg3ZikgPT0gNCkgfHwKIAkJICAgICgoKHJhdGVbaV0pICYgMHg3ZikgPT0gMTEpIHx8ICgoKHJhdGVbaV0pICYgMHg3ZikgPT0gMjIpKQogCQkJcmV0dXJuIHRydWU7Ci0JCQlpKys7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOworCQlpKys7CisJfQorCXJldHVybiBmYWxzZTsKIH0KIAogdWludCByODcxMl9pc19jY2tyYXRlc29ubHlfaW5jbHVkZWQodTggKnJhdGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc19pbnRmcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NfaW50ZnMuYwppbmRleCAzN2ZlMzMwLi42YmQwODIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc19pbnRmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zX2ludGZzLmMKQEAgLTIzOSw3ICsyMzksNyBAQAogewogCXBhZGFwdGVyLT5jbWRUaHJlYWQgPSBrdGhyZWFkX3J1bihyODcxMl9jbWRfdGhyZWFkLCBwYWRhcHRlciwgIiVzIiwKIAkJCSAgICAgIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQlpZiAoSVNfRVJSKHBhZGFwdGVyLT5jbWRUaHJlYWQpIDwgMCkKKwlpZiAoSVNfRVJSKHBhZGFwdGVyLT5jbWRUaHJlYWQpKQogCQlyZXR1cm4gX0ZBSUw7CiAJcmV0dXJuIF9TVUNDRVNTOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfc2VydmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfc2VydmljZS5oCmluZGV4IGYxY2NjN2UuLjU2NjIzNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX3NlcnZpY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9zZXJ2aWNlLmgKQEAgLTE0Nyw3ICsxNDcsOCBAQAogCXJldHVybiBpc19saXN0X2VtcHR5KCYocHF1ZXVlLT5xdWV1ZSkpOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiBlbmRfb2ZfcXVldWVfc2VhcmNoKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0KQorc3RhdGljIGlubGluZSB1MzIgZW5kX29mX3F1ZXVlX3NlYXJjaChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAorCQlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdCkKIHsKIAlpZiAoaGVhZCA9PSBwbGlzdCkKIAkJcmV0dXJuIHRydWU7CkBAIC0xNjQsNyArMTY1LDcgQEAKIAkJZGVsdGEgPSAxOy8qIDEgbXMgKi8KIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCWlmIChzY2hlZHVsZV90aW1lb3V0KGRlbHRhKSAhPSAwKQotCQlyZXR1cm4gOworCQlyZXR1cm47CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTggKl9tYWxsb2ModTMyIHN6KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JlY3YuYwppbmRleCBlYTk2NTM3Li4wNzIzYjJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JlY3YuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JlY3YuYwpAQCAtOTAsNyArOTAsNiBAQAogCQlwc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihwYWRhcHRlci0+cG5ldGRldiwgTUFYX1JFQ1ZCVUZfU1ogKwogCQkgICAgICAgUkVDVkJVRkZfQUxJR05fU1opOwogCQlpZiAocHNrYikgewotCQkJcHNrYi0+ZGV2ID0gcGFkYXB0ZXItPnBuZXRkZXY7CiAJCQl0bXBhZGRyID0gKGFkZHJfdClwc2tiLT5kYXRhOwogCQkJYWxpZ25tZW50ID0gdG1wYWRkciAmIChSRUNWQlVGRl9BTElHTl9TWi0xKTsKIAkJCXNrYl9yZXNlcnZlKHBza2IsIChSRUNWQlVGRl9BTElHTl9TWiAtIGFsaWdubWVudCkpOwpAQCAtMTA4Myw3ICsxMDgyLDYgQEAKIAkJYWxsb2Nfc3ogKz0gNjsKIAkJcGt0X2NvcHkgPSBuZXRkZXZfYWxsb2Nfc2tiKHBhZGFwdGVyLT5wbmV0ZGV2LCBhbGxvY19zeik7CiAJCWlmIChwa3RfY29weSkgewotCQkJcGt0X2NvcHktPmRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwogCQkJcHJlY3ZmcmFtZS0+dS5oZHIucGt0ID0gcGt0X2NvcHk7CiAJCQlza2JfcmVzZXJ2ZShwa3RfY29weSwgNCAtICgoYWRkcl90KShwa3RfY29weS0+ZGF0YSkKIAkJCQkgICAgJSA0KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2NtZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9jbWQuYwppbmRleCBjNzFjN2U1Li5hNjcxODVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2NtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmMKQEAgLTQ2OCwxMCArNDY4LDkgQEAKIAlwY21kLT5yc3AgPSBOVUxMOwogCXBjbWQtPnJzcHN6ID0gMDsKIAkvKiBub3RlczogdHJhbnNsYXRlIElFTGVuZ3RoICYgTGVuZ3RoIGFmdGVyIGFzc2lnbiB0byBjbWRzejsgKi8KLQlwZGV2X25ldHdvcmstPkxlbmd0aCA9IGNwdV90b19sZTMyKHBjbWQtPmNtZHN6KTsKLQlwZGV2X25ldHdvcmstPklFTGVuZ3RoID0gY3B1X3RvX2xlMzIocGRldl9uZXR3b3JrLT5JRUxlbmd0aCk7Ci0JcGRldl9uZXR3b3JrLT5Tc2lkLlNzaWRMZW5ndGggPSBjcHVfdG9fbGUzMigKLQkJCQkJcGRldl9uZXR3b3JrLT5Tc2lkLlNzaWRMZW5ndGgpOworCXBkZXZfbmV0d29yay0+TGVuZ3RoID0gcGNtZC0+Y21kc3o7CisJcGRldl9uZXR3b3JrLT5JRUxlbmd0aCA9IHBkZXZfbmV0d29yay0+SUVMZW5ndGg7CisJcGRldl9uZXR3b3JrLT5Tc2lkLlNzaWRMZW5ndGggPQlwZGV2X25ldHdvcmstPlNzaWQuU3NpZExlbmd0aDsKIAlyODcxMl9lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGNtZCk7CiAJcmV0dXJuIF9TVUNDRVNTOwogfQpAQCAtOTExLDcgKzkxMCw3IEBACiB7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAotCWlmICgocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKSkKKwlpZiAocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKQogCQlfc2V0X3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLCAxKTsKIAlyODcxMl9mcmVlX2NtZF9vYmoocGNtZCk7CiB9CkBAIC05MjgsNyArOTI3LDcgQEAKIAkJCQkJICAgICAgcGNtZC0+cGFybWJ1ZjsKIAlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICp0Z3RfbmV0d29yayA9ICYocG1sbWVwcml2LT5jdXJfbmV0d29yayk7CiAKLQlpZiAoKHBjbWQtPnJlcyAhPSBIMkNfU1VDQ0VTUykpCisJaWYgKHBjbWQtPnJlcyAhPSBIMkNfU1VDQ0VTUykKIAkJX3NldF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwgMSk7CiAJX2NhbmNlbF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwgJnRpbWVyX2NhbmNlbGxlZCk7CiAjaWZkZWYgX19CSUdfRU5ESUFOCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3NlY3VyaXR5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3NlY3VyaXR5LmMKaW5kZXggYWFlNTEyNS4uNWZmYzQ4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zZWN1cml0eS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfc2VjdXJpdHkuYwpAQCAtMTI0NCwxNyArMTI0NCwxOCBAQAogCSAgICAoZnJ0eXBlID09IFdJRklfREFUQV9DRlBPTEwpIHx8CiAJICAgIChmcnR5cGUgPT0gV0lGSV9EQVRBX0NGQUNLUE9MTCkpIHsKIAkJcWNfZXhpc3RzID0gMTsKLQkJaWYgKGhkcmxlbiAhPSAgV0xBTl9IRFJfQTNfUU9TX0xFTikKKwkJaWYgKGhkcmxlbiAhPSBXTEFOX0hEUl9BM19RT1NfTEVOKQogCQkJaGRybGVuICs9IDI7Ci0JCX0gIGVsc2UgaWYgKChmcnN1YnR5cGUgPT0gMHgwOCkgfHwKKwl9IGVsc2UgaWYgKChmcnN1YnR5cGUgPT0gMHgwOCkgfHwKIAkJICAgKGZyc3VidHlwZSA9PSAweDA5KSB8fAogCQkgICAoZnJzdWJ0eXBlID09IDB4MGEpIHx8CiAJCSAgIChmcnN1YnR5cGUgPT0gMHgwYikpIHsKLQkJCWlmIChoZHJsZW4gIT0gIFdMQU5fSERSX0EzX1FPU19MRU4pCi0JCQkJaGRybGVuICs9IDI7Ci0JCQlxY19leGlzdHMgPSAxOwotCX0gZWxzZQorCQlpZiAoaGRybGVuICE9IFdMQU5fSERSX0EzX1FPU19MRU4pCisJCQloZHJsZW4gKz0gMjsKKwkJcWNfZXhpc3RzID0gMTsKKwl9IGVsc2UgewogCQlxY19leGlzdHMgPSAwOworCX0KIAkvKiBub3csIGRlY3J5cHQgcGZyYW1lIHdpdGggaGRybGVuIG9mZnNldCBhbmQgcGxlbiBsb25nICovCiAJcGF5bG9hZF9pbmRleCA9IGhkcmxlbiArIDg7IC8qIDggaXMgZm9yIGV4dGl2ICovCiAJZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9iYXNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2Jhc2UuYwppbmRleCAxOGM5MzZmLi5lNTA3M2ZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2Jhc2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2Jhc2UuYwpAQCAtMzksMTAgKzM5LDEwIEBACiAjaW5jbHVkZSAicGNpLmgiCiAKIC8qCi0gKk5PVElDRSEhITogVGhpcyBmaWxlIHdpbGwgYmUgdmVyeSBiaWcsIHdlIGhzb3VsZAotICprZWVwIGl0IGNsZWFyIHVuZGVyIGZvbGx3aW5nIHJvbGVzOgorICpOT1RJQ0UhISE6IFRoaXMgZmlsZSB3aWxsIGJlIHZlcnkgYmlnLCB3ZSBzaG91bGQKKyAqa2VlcCBpdCBjbGVhciB1bmRlciBmb2xsb3dpbmcgcm9sZXM6CiAgKgotICpUaGlzIGZpbGUgaW5jbHVkZSBmb2xsd2luZyBwYXJ0LCBzbywgaWYgeW91IGFkZCBuZXcKKyAqVGhpcyBmaWxlIGluY2x1ZGUgZm9sbG93aW5nIHBhcnQsIHNvLCBpZiB5b3UgYWRkIG5ldwogICpmdW5jdGlvbnMgaW50byB0aGlzIGZpbGUsIHBsZWFzZSBjaGVjayB3aGljaCBwYXJ0IGl0CiAgKnNob3VsZCBpbmNsdWRlcy4gb3IgY2hlY2sgaWYgeW91IHNob3VsZCBhZGQgbmV3IHBhcnQKICAqZm9yIHRoaXMgZmlsZToKQEAgLTY0LDczICs2NCw3MyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIHJ0bF9jaGFubmVsdGFibGVfMmdbXSA9IHsKLQl7LmNlbnRlcl9mcmVxID0gMjQxMiwuaHdfdmFsdWUgPSAxLH0sCi0Jey5jZW50ZXJfZnJlcSA9IDI0MTcsLmh3X3ZhbHVlID0gMix9LAotCXsuY2VudGVyX2ZyZXEgPSAyNDIyLC5od192YWx1ZSA9IDMsfSwKLQl7LmNlbnRlcl9mcmVxID0gMjQyNywuaHdfdmFsdWUgPSA0LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDI0MzIsLmh3X3ZhbHVlID0gNSx9LAotCXsuY2VudGVyX2ZyZXEgPSAyNDM3LC5od192YWx1ZSA9IDYsfSwKLQl7LmNlbnRlcl9mcmVxID0gMjQ0MiwuaHdfdmFsdWUgPSA3LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDI0NDcsLmh3X3ZhbHVlID0gOCx9LAotCXsuY2VudGVyX2ZyZXEgPSAyNDUyLC5od192YWx1ZSA9IDksfSwKLQl7LmNlbnRlcl9mcmVxID0gMjQ1NywuaHdfdmFsdWUgPSAxMCx9LAotCXsuY2VudGVyX2ZyZXEgPSAyNDYyLC5od192YWx1ZSA9IDExLH0sCi0Jey5jZW50ZXJfZnJlcSA9IDI0NjcsLmh3X3ZhbHVlID0gMTIsfSwKLQl7LmNlbnRlcl9mcmVxID0gMjQ3MiwuaHdfdmFsdWUgPSAxMyx9LAotCXsuY2VudGVyX2ZyZXEgPSAyNDg0LC5od192YWx1ZSA9IDE0LH0sCisJey5jZW50ZXJfZnJlcSA9IDI0MTIsIC5od192YWx1ZSA9IDEsfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQxNywgLmh3X3ZhbHVlID0gMix9LAorCXsuY2VudGVyX2ZyZXEgPSAyNDIyLCAuaHdfdmFsdWUgPSAzLH0sCisJey5jZW50ZXJfZnJlcSA9IDI0MjcsIC5od192YWx1ZSA9IDQsfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQzMiwgLmh3X3ZhbHVlID0gNSx9LAorCXsuY2VudGVyX2ZyZXEgPSAyNDM3LCAuaHdfdmFsdWUgPSA2LH0sCisJey5jZW50ZXJfZnJlcSA9IDI0NDIsIC5od192YWx1ZSA9IDcsfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQ0NywgLmh3X3ZhbHVlID0gOCx9LAorCXsuY2VudGVyX2ZyZXEgPSAyNDUyLCAuaHdfdmFsdWUgPSA5LH0sCisJey5jZW50ZXJfZnJlcSA9IDI0NTcsIC5od192YWx1ZSA9IDEwLH0sCisJey5jZW50ZXJfZnJlcSA9IDI0NjIsIC5od192YWx1ZSA9IDExLH0sCisJey5jZW50ZXJfZnJlcSA9IDI0NjcsIC5od192YWx1ZSA9IDEyLH0sCisJey5jZW50ZXJfZnJlcSA9IDI0NzIsIC5od192YWx1ZSA9IDEzLH0sCisJey5jZW50ZXJfZnJlcSA9IDI0ODQsIC5od192YWx1ZSA9IDE0LH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIHJ0bF9jaGFubmVsdGFibGVfNWdbXSA9IHsKLQl7LmNlbnRlcl9mcmVxID0gNTE4MCwuaHdfdmFsdWUgPSAzNix9LAotCXsuY2VudGVyX2ZyZXEgPSA1MjAwLC5od192YWx1ZSA9IDQwLH0sCi0Jey5jZW50ZXJfZnJlcSA9IDUyMjAsLmh3X3ZhbHVlID0gNDQsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTI0MCwuaHdfdmFsdWUgPSA0OCx9LAotCXsuY2VudGVyX2ZyZXEgPSA1MjYwLC5od192YWx1ZSA9IDUyLH0sCi0Jey5jZW50ZXJfZnJlcSA9IDUyODAsLmh3X3ZhbHVlID0gNTYsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTMwMCwuaHdfdmFsdWUgPSA2MCx9LAotCXsuY2VudGVyX2ZyZXEgPSA1MzIwLC5od192YWx1ZSA9IDY0LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDU1MDAsLmh3X3ZhbHVlID0gMTAwLH0sCi0Jey5jZW50ZXJfZnJlcSA9IDU1MjAsLmh3X3ZhbHVlID0gMTA0LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDU1NDAsLmh3X3ZhbHVlID0gMTA4LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDU1NjAsLmh3X3ZhbHVlID0gMTEyLH0sCi0Jey5jZW50ZXJfZnJlcSA9IDU1ODAsLmh3X3ZhbHVlID0gMTE2LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDU2MDAsLmh3X3ZhbHVlID0gMTIwLH0sCi0Jey5jZW50ZXJfZnJlcSA9IDU2MjAsLmh3X3ZhbHVlID0gMTI0LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDU2NDAsLmh3X3ZhbHVlID0gMTI4LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDU2NjAsLmh3X3ZhbHVlID0gMTMyLH0sCi0Jey5jZW50ZXJfZnJlcSA9IDU2ODAsLmh3X3ZhbHVlID0gMTM2LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDU3MDAsLmh3X3ZhbHVlID0gMTQwLH0sCi0Jey5jZW50ZXJfZnJlcSA9IDU3NDUsLmh3X3ZhbHVlID0gMTQ5LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDU3NjUsLmh3X3ZhbHVlID0gMTUzLH0sCi0Jey5jZW50ZXJfZnJlcSA9IDU3ODUsLmh3X3ZhbHVlID0gMTU3LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDU4MDUsLmh3X3ZhbHVlID0gMTYxLH0sCi0Jey5jZW50ZXJfZnJlcSA9IDU4MjUsLmh3X3ZhbHVlID0gMTY1LH0sCisJey5jZW50ZXJfZnJlcSA9IDUxODAsIC5od192YWx1ZSA9IDM2LH0sCisJey5jZW50ZXJfZnJlcSA9IDUyMDAsIC5od192YWx1ZSA9IDQwLH0sCisJey5jZW50ZXJfZnJlcSA9IDUyMjAsIC5od192YWx1ZSA9IDQ0LH0sCisJey5jZW50ZXJfZnJlcSA9IDUyNDAsIC5od192YWx1ZSA9IDQ4LH0sCisJey5jZW50ZXJfZnJlcSA9IDUyNjAsIC5od192YWx1ZSA9IDUyLH0sCisJey5jZW50ZXJfZnJlcSA9IDUyODAsIC5od192YWx1ZSA9IDU2LH0sCisJey5jZW50ZXJfZnJlcSA9IDUzMDAsIC5od192YWx1ZSA9IDYwLH0sCisJey5jZW50ZXJfZnJlcSA9IDUzMjAsIC5od192YWx1ZSA9IDY0LH0sCisJey5jZW50ZXJfZnJlcSA9IDU1MDAsIC5od192YWx1ZSA9IDEwMCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1NTIwLCAuaHdfdmFsdWUgPSAxMDQsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTU0MCwgLmh3X3ZhbHVlID0gMTA4LH0sCisJey5jZW50ZXJfZnJlcSA9IDU1NjAsIC5od192YWx1ZSA9IDExMix9LAorCXsuY2VudGVyX2ZyZXEgPSA1NTgwLCAuaHdfdmFsdWUgPSAxMTYsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTYwMCwgLmh3X3ZhbHVlID0gMTIwLH0sCisJey5jZW50ZXJfZnJlcSA9IDU2MjAsIC5od192YWx1ZSA9IDEyNCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1NjQwLCAuaHdfdmFsdWUgPSAxMjgsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTY2MCwgLmh3X3ZhbHVlID0gMTMyLH0sCisJey5jZW50ZXJfZnJlcSA9IDU2ODAsIC5od192YWx1ZSA9IDEzNix9LAorCXsuY2VudGVyX2ZyZXEgPSA1NzAwLCAuaHdfdmFsdWUgPSAxNDAsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTc0NSwgLmh3X3ZhbHVlID0gMTQ5LH0sCisJey5jZW50ZXJfZnJlcSA9IDU3NjUsIC5od192YWx1ZSA9IDE1Myx9LAorCXsuY2VudGVyX2ZyZXEgPSA1Nzg1LCAuaHdfdmFsdWUgPSAxNTcsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTgwNSwgLmh3X3ZhbHVlID0gMTYxLH0sCisJey5jZW50ZXJfZnJlcSA9IDU4MjUsIC5od192YWx1ZSA9IDE2NSx9LAogfTsKIAogc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSBydGxfcmF0ZXRhYmxlXzJnW10gPSB7Ci0Jey5iaXRyYXRlID0gMTAsLmh3X3ZhbHVlID0gMHgwMCx9LAotCXsuYml0cmF0ZSA9IDIwLC5od192YWx1ZSA9IDB4MDEsfSwKLQl7LmJpdHJhdGUgPSA1NSwuaHdfdmFsdWUgPSAweDAyLH0sCi0Jey5iaXRyYXRlID0gMTEwLC5od192YWx1ZSA9IDB4MDMsfSwKLQl7LmJpdHJhdGUgPSA2MCwuaHdfdmFsdWUgPSAweDA0LH0sCi0Jey5iaXRyYXRlID0gOTAsLmh3X3ZhbHVlID0gMHgwNSx9LAotCXsuYml0cmF0ZSA9IDEyMCwuaHdfdmFsdWUgPSAweDA2LH0sCi0Jey5iaXRyYXRlID0gMTgwLC5od192YWx1ZSA9IDB4MDcsfSwKLQl7LmJpdHJhdGUgPSAyNDAsLmh3X3ZhbHVlID0gMHgwOCx9LAotCXsuYml0cmF0ZSA9IDM2MCwuaHdfdmFsdWUgPSAweDA5LH0sCi0Jey5iaXRyYXRlID0gNDgwLC5od192YWx1ZSA9IDB4MGEsfSwKLQl7LmJpdHJhdGUgPSA1NDAsLmh3X3ZhbHVlID0gMHgwYix9LAorCXsuYml0cmF0ZSA9IDEwLCAuaHdfdmFsdWUgPSAweDAwLH0sCisJey5iaXRyYXRlID0gMjAsIC5od192YWx1ZSA9IDB4MDEsfSwKKwl7LmJpdHJhdGUgPSA1NSwgLmh3X3ZhbHVlID0gMHgwMix9LAorCXsuYml0cmF0ZSA9IDExMCwgLmh3X3ZhbHVlID0gMHgwMyx9LAorCXsuYml0cmF0ZSA9IDYwLCAuaHdfdmFsdWUgPSAweDA0LH0sCisJey5iaXRyYXRlID0gOTAsIC5od192YWx1ZSA9IDB4MDUsfSwKKwl7LmJpdHJhdGUgPSAxMjAsIC5od192YWx1ZSA9IDB4MDYsfSwKKwl7LmJpdHJhdGUgPSAxODAsIC5od192YWx1ZSA9IDB4MDcsfSwKKwl7LmJpdHJhdGUgPSAyNDAsIC5od192YWx1ZSA9IDB4MDgsfSwKKwl7LmJpdHJhdGUgPSAzNjAsIC5od192YWx1ZSA9IDB4MDksfSwKKwl7LmJpdHJhdGUgPSA0ODAsIC5od192YWx1ZSA9IDB4MGEsfSwKKwl7LmJpdHJhdGUgPSA1NDAsIC5od192YWx1ZSA9IDB4MGIsfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgcnRsX3JhdGV0YWJsZV81Z1tdID0gewotCXsuYml0cmF0ZSA9IDYwLC5od192YWx1ZSA9IDB4MDQsfSwKLQl7LmJpdHJhdGUgPSA5MCwuaHdfdmFsdWUgPSAweDA1LH0sCi0Jey5iaXRyYXRlID0gMTIwLC5od192YWx1ZSA9IDB4MDYsfSwKLQl7LmJpdHJhdGUgPSAxODAsLmh3X3ZhbHVlID0gMHgwNyx9LAotCXsuYml0cmF0ZSA9IDI0MCwuaHdfdmFsdWUgPSAweDA4LH0sCi0Jey5iaXRyYXRlID0gMzYwLC5od192YWx1ZSA9IDB4MDksfSwKLQl7LmJpdHJhdGUgPSA0ODAsLmh3X3ZhbHVlID0gMHgwYSx9LAotCXsuYml0cmF0ZSA9IDU0MCwuaHdfdmFsdWUgPSAweDBiLH0sCisJey5iaXRyYXRlID0gNjAsIC5od192YWx1ZSA9IDB4MDQsfSwKKwl7LmJpdHJhdGUgPSA5MCwgLmh3X3ZhbHVlID0gMHgwNSx9LAorCXsuYml0cmF0ZSA9IDEyMCwgLmh3X3ZhbHVlID0gMHgwNix9LAorCXsuYml0cmF0ZSA9IDE4MCwgLmh3X3ZhbHVlID0gMHgwNyx9LAorCXsuYml0cmF0ZSA9IDI0MCwgLmh3X3ZhbHVlID0gMHgwOCx9LAorCXsuYml0cmF0ZSA9IDM2MCwgLmh3X3ZhbHVlID0gMHgwOSx9LAorCXsuYml0cmF0ZSA9IDQ4MCwgLmh3X3ZhbHVlID0gMHgwYSx9LAorCXsuYml0cmF0ZSA9IDU0MCwgLmh3X3ZhbHVlID0gMHgwYix9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgcnRsX2JhbmRfMmdoeiA9IHsKQEAgLTMyMCw3ICszMjAsNyBAQAogCS8qIDw1PiBzZXQgaHcgY2FwcyAqLwogCWh3LT5mbGFncyA9IElFRUU4MDIxMV9IV19TSUdOQUxfREJNIHwKIAkgICAgSUVFRTgwMjExX0hXX1JYX0lOQ0xVREVTX0ZDUyB8Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsNCwwKSkKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgNCwgMCkpCiAJICAgIElFRUU4MDIxMV9IV19CRUFDT05fRklMVEVSIHwKICNlbmRpZgogCSAgICBJRUVFODAyMTFfSFdfQU1QRFVfQUdHUkVHQVRJT04gfApAQCAtMzMyLDExICszMzIsMTEgQEAKIAkvKiBzd2xwcyBvciBod2xwcyBoYXMgYmVlbiBzZXQgaW4gZGlmZiBjaGlwIGluIGluaXRfc3dfdmFycyAqLwogCWlmIChydGxwcml2LT5wc2MuYl9zd2N0cmxfbHBzKQogCQlody0+ZmxhZ3MgfD0gSUVFRTgwMjExX0hXX1NVUFBPUlRTX1BTIHwKLQkgICAgCQlJRUVFODAyMTFfSFdfUFNfTlVMTEZVTkNfU1RBQ0sgfAotCSAgICAJCS8qIElFRUU4MDIxMV9IV19TVVBQT1JUU19EWU5BTUlDX1BTIHwgKi8KKwkJCUlFRUU4MDIxMV9IV19QU19OVUxMRlVOQ19TVEFDSyB8CisJCQkvKiBJRUVFODAyMTFfSFdfU1VQUE9SVFNfRFlOQU1JQ19QUyB8ICovCiAJCQkwOwogLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDM3KSkKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDM3KSkKIAlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyA9CiAJICAgIEJJVChOTDgwMjExX0lGVFlQRV9BUCkgfAogCSAgICBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgfApAQCAtMzU0LDExICszNTQsMTEgQEAKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KICNlbmRpZgogLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDM5KSkKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMzkpKQogCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19JQlNTX1JTTjsKICNlbmRpZgogCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDMsMCkpCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAzLCAwKSkKIAlody0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfSEFTX1JFTUFJTl9PTl9DSEFOTkVMOwogI2VuZGlmCiAKQEAgLTQwMiw3ICs0MDIsNyBAQAogCS8qIDwyPiB3b3JrIHF1ZXVlICovCiAJcnRscHJpdi0+d29ya3MuaHcgPSBodzsKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzNykpCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAzNykpCiAvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLwogCXJ0bHByaXYtPndvcmtzLnJ0bF93cSA9IGFsbG9jX3dvcmtxdWV1ZShydGxwcml2LT5jZmctPm5hbWUsIDAsIDApOwogLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLwpAQCAtNjYyLDMwICs2NjIsMjcgQEAKIAogCWlmIChydGxwcml2LT5kbS5iX3VzZXJhbWFzaykgewogCQl0Y2JfZGVzYy0+cmF0cl9pbmRleCA9IHJhdHJfaW5kZXg7Ci0JCS8qIFRPRE8gd2Ugd2lsbCBkaWZmZXJlbnRpYXRlIGFkaG9jIGFuZCBzdGF0aW9uIGZ1dHJ1ZSAgKi8KKwkJLyogVE9ETyB3ZSB3aWxsIGRpZmZlcmVudGlhdGUgYWRob2MgYW5kIHN0YXRpb24gZnV0dXJlICAqLwogCQlpZiAobWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiB8fAogCQkJbWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCkgewogCQkJdGNiX2Rlc2MtPm1hY19pZCA9IDA7Ci0KLQkJCWlmIChtYWMtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9OXzI0RykgeworCQkJaWYgKG1hYy0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX05fMjRHKQogCQkJCXRjYl9kZXNjLT5yYXRyX2luZGV4ID0gUkFUUl9JTlhfV0lSRUxFU1NfTkdCOwotCQkJfSBlbHNlIGlmIChtYWMtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9OXzVHKSB7CisJCQllbHNlIGlmIChtYWMtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9OXzVHKQogCQkJCXRjYl9kZXNjLT5yYXRyX2luZGV4ID0gUkFUUl9JTlhfV0lSRUxFU1NfTkc7Ci0JCQl9IGVsc2UgaWYgKG1hYy0+bW9kZSAmIFdJUkVMRVNTX01PREVfRykgeworCQkJZWxzZSBpZiAobWFjLT5tb2RlICYgV0lSRUxFU1NfTU9ERV9HKQogCQkJCXRjYl9kZXNjLT5yYXRyX2luZGV4ID0gUkFUUl9JTlhfV0lSRUxFU1NfR0I7Ci0JCQl9IGVsc2UgaWYgKG1hYy0+bW9kZSAmIFdJUkVMRVNTX01PREVfQikgeworCQkJZWxzZSBpZiAobWFjLT5tb2RlICYgV0lSRUxFU1NfTU9ERV9CKQogCQkJCXRjYl9kZXNjLT5yYXRyX2luZGV4ID0gUkFUUl9JTlhfV0lSRUxFU1NfQjsKLQkJCX0gZWxzZSBpZiAobWFjLT5tb2RlICYgV0lSRUxFU1NfTU9ERV9BKSB7CisJCQllbHNlIGlmIChtYWMtPm1vZGUgJiBXSVJFTEVTU19NT0RFX0EpCiAJCQkJdGNiX2Rlc2MtPnJhdHJfaW5kZXggPSBSQVRSX0lOWF9XSVJFTEVTU19HOwotCQkJfQogCQl9IGVsc2UgaWYgKG1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8CiAJCQltYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQkJaWYgKE5VTEwgIT0gc3RhKSB7Ci0JCQkJaWYgKHN0YS0+YWlkID4gMCkgeworCQkJCWlmIChzdGEtPmFpZCA+IDApCiAJCQkJCXRjYl9kZXNjLT5tYWNfaWQgPSBzdGEtPmFpZCArIDE7Ci0JCQkJfSBlbHNlIHsKKwkJCQllbHNlCiAJCQkJCXRjYl9kZXNjLT5tYWNfaWQgPSAxOwotCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJdGNiX2Rlc2MtPm1hY19pZCA9IDA7CiAJCQl9CkBAIC03MTEsNyArNzA4LDcgQEAKIAkJCXJldHVybjsKIAl9IGVsc2UgaWYgKG1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKIAkJaWYgKCFtYWMtPmJ3XzQwIHx8ICEoc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKSkKLQkJcmV0dXJuOworCQkJcmV0dXJuOwogCX0KIAlpZiAodGNiX2Rlc2MtPmJfbXVsdGljYXN0IHx8IHRjYl9kZXNjLT5iX2Jyb2FkY2FzdCkKIAkJcmV0dXJuOwpAQCAtNzMwLDcgKzcyNyw3IEBACiAJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKIAl1OCBod19yYXRlOwogCi0JaWYgKChnZXRfcmZfdHlwZShydGxwaHkpID09IFJGXzJUMlIpICYmIChzdGEtPmh0X2NhcC5tY3MucnhfbWFza1sxXSE9MCkpCisJaWYgKChnZXRfcmZfdHlwZShydGxwaHkpID09IFJGXzJUMlIpICYmIChzdGEtPmh0X2NhcC5tY3MucnhfbWFza1sxXSAhPSAwKSkKIAkJaHdfcmF0ZSA9IHJ0bHByaXYtPmNmZy0+bWFwc1tSVExfUkNfSFRfUkFURU1DUzE1XTsKIAllbHNlCiAJCWh3X3JhdGUgPSBydGxwcml2LT5jZmctPm1hcHNbUlRMX1JDX0hUX1JBVEVNQ1M3XTsKQEAgLTc3MiwxNiArNzY5LDE2IEBACiAJCQl0Y2JfZGVzYy0+ZGlzYWJsZV9yYXRlZmFsbGJhY2sgPSAxOwogCQl9IGVsc2UgewogCQkJLyoKLQkJCSAqYmVjYXVzZSBodyB3aWxsIG5lcnZlciB1c2UgaHdfcmF0ZQorCQkJICpiZWNhdXNlIGh3IHdpbGwgbmV2ZXIgdXNlIGh3X3JhdGUKIAkJCSAqd2hlbiB0Y2JfZGVzYy0+dXNlX2RyaXZlcl9yYXRlID0gZmFsc2UKIAkJCSAqc28gd2UgbmV2ZXIgc2V0IGhpZ2hlc3QgTiByYXRlIGhlcmUsCi0JCQkgKmFuZCBOIHJhdGUgd2lsbCBhbGwgYmUgY29udHJvbGVkIGJ5IEZXCisJCQkgKmFuZCBOIHJhdGUgd2lsbCBhbGwgYmUgY29udHJvbGxlZCBieSBGVwogCQkJICp3aGVuIHRjYl9kZXNjLT51c2VfZHJpdmVyX3JhdGUgPSBmYWxzZQogCQkJICovCiAJCQlpZiAoc3RhICYmIChzdGEtPmh0X2NhcC5odF9zdXBwb3J0ZWQpKSB7CiAJCQkJdGNiX2Rlc2MtPmh3X3JhdGUgPSBfcnRsX2dldF9oaWdoZXN0X25fcmF0ZShodywgc3RhKTsKIAkJCX0gZWxzZSB7Ci0JCQkJaWYocnRsbWFjLT5tb2RlID09IFdJUkVMRVNTX01PREVfQikgeworCQkJCWlmIChydGxtYWMtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9CKSB7CiAJCQkJCXRjYl9kZXNjLT5od19yYXRlID0KIAkJCQkJICAgIHJ0bHByaXYtPmNmZy0+bWFwc1tSVExfUkNfQ0NLX1JBVEUxMU1dOwogCQkJCX0gZWxzZSB7CkBAIC04MDksNyArODA2LDcgQEAKIAkJdGNiX2Rlc2MtPmJfcGFja2V0X2J3ID0gZmFsc2U7CiAJfQogfQotLy9FWFBPUlRfU1lNQk9MKHJ0bF9nZXRfdGNiX2Rlc2MpOworLyogRVhQT1JUX1NZTUJPTChydGxfZ2V0X3RjYl9kZXNjKTsgKi8KIAogYm9vbCBydGxfdHhfbWdtdF9wcm9jKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtODYyLDggKzg1OSw4IEBACiAJCQlSVF9UUkFDRSgoQ09NUF9TRU5EIHwgQ09NUF9SRUNWKSwgREJHX0RNRVNHLAogCQkJCSAoIiVzIEFDVF9BRERCQVJFUSBGcm9tIDolcE1cbiIsCiAJCQkJICBpc190eCA/ICJUeCIgOiAiUngiLCBoZHItPmFkZHIyKSk7Ci0JCQlSVF9QUklOVF9EQVRBKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0RNRVNHLCAoInJlcSBcbiIpLAotCQkgICAgICAJc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCQlSVF9QUklOVF9EQVRBKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0RNRVNHLCAoInJlcVxuIiksCisJCQlza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAkJCWlmICghaXNfdHgpIHsKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhID0gTlVMTDsKIAkJCQlzdHJ1Y3QgcnRsX3N0YV9pbmZvICpzdGFfZW50cnkgPSBOVUxMOwpAQCAtODk3LDcgKzg5NCw3IEBACiAJCQkJCQkJCSAgICBoZHItPmFkZHIzLAogCQkJCQkJCQkgICAgdGlkKTsKIAkJCQkJaWYgKHNrYl9kZWxiYSkgewotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywxMCwwKSkKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDEwLCAwKSkKIAkJCQkJCXJ4X3N0YXR1cy5mcmVxID0gaHctPmNvbmYuY2hhbmRlZi5jaGFuLT5jZW50ZXJfZnJlcTsKIAkJCQkJCXJ4X3N0YXR1cy5iYW5kID0gaHctPmNvbmYuY2hhbmRlZi5jaGFuLT5iYW5kOwogI2Vsc2UKQEAgLTExODQsNyArMTE4MSw3IEBACiAJaWYgKGV0aGVyX2FkZHJfZXF1YWwoaGRyLT5hZGRyMywgcnRscHJpdi0+bWFjODAyMTEuYnNzaWQpKQogCQlyZXR1cm47CiAKLQlydGxwcml2LT5saW5rX2luZm8uYmNuX3J4X2lucGVyaW9kICsrOworCXJ0bHByaXYtPmxpbmtfaW5mby5iY25fcnhfaW5wZXJpb2QrKzsKIH0KIAogdm9pZCBydGxfd2F0Y2hkb2dfd3FfY2FsbGJhY2sodm9pZCAqZGF0YSkKQEAgLTEzNjMsNyArMTM2MCw3IEBACiAJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOwogCXN0cnVjdCBydGxfcHJpdiAqYnVkZHlfcHJpdiA9IHJ0bHByaXYtPmJ1ZGR5X3ByaXY7CiAKLQlpZihidWRkeV9wcml2ID09IE5VTEwpCisJaWYgKGJ1ZGR5X3ByaXYgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAJcnRscHJpdi0+Y2ZnLT5vcHMtPmR1YWxtYWNfZWFzeV9jb25jdXJyZW50KGh3KTsKQEAgLTE0NzgsMTMgKzE0NzUsMTMgQEAKIAkJLyogcnRscHJpdi0+Y2ZnLT5vcHMtPnVwZGF0ZV9yYXRlX3RibChodywgc3RhLCAwKTsgKi8KIAogCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmlkeCA9IDA7Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDEwLDApKQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTAsIDApKQogCQlpbmZvLT5iYW5kID0gaHctPmNvbmYuY2hhbmRlZi5jaGFuLT5iYW5kOwogI2Vsc2UKIAkJaW5mby0+YmFuZCA9IGh3LT5jb25mLmNoYW5uZWwtPmJhbmQ7CiAjZW5kaWYKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMyw3LDApKQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA3LCAwKSkKIAkJaW5mby0+Y29udHJvbC5zdGEgPSBzdGE7CiAJCXJ0bHByaXYtPmludGZfb3BzLT5hZGFwdGVyX3R4KGh3LCBza2IsICZ0Y2JfZGVzYyk7CiAjZWxzZQpAQCAtMTQ5OSw3ICsxNDk2LDcgQEAKIGVycl9mcmVlOgogCXJldHVybiAwOwogfQotLy9FWFBPUlRfU1lNQk9MKHJ0bF9zZW5kX3NtcHNfYWN0aW9uKTsKKy8qIEVYUE9SVF9TWU1CT0wocnRsX3NlbmRfc21wc19hY3Rpb24pOyAqLwogCiAvKiBiZWNhdXNlIG1hYzgwMjExIGhhdmUgaXNzdWVzIHdoZW4gY2FuIHJlY2VpdmUgZGVsIGJhCiAgKiBzbyBoZXJlIHdlIGp1c3QgbWFrZSBhIGZha2UgZGVsX2JhIGlmIHdlIHJlY2VpdmUgYSBiYV9yZXEKQEAgLTE1MjgsOCArMTUyNSw4IEBACiAJCQkJCQkgIElFRUU4MDIxMV9TVFlQRV9BQ1RJT04pOwogCWFjdGlvbl9mcmFtZS0+dS5hY3Rpb24uY2F0ZWdvcnkgPSBXTEFOX0NBVEVHT1JZX0JBQ0s7CiAJYWN0aW9uX2ZyYW1lLT51LmFjdGlvbi51LmRlbGJhLmFjdGlvbl9jb2RlID0gV0xBTl9BQ1RJT05fREVMQkE7Ci0JcGFyYW1zID0gKHUxNikoMSA8PCAxMSk7IAkvKiBiaXQgMTEgaW5pdGlhdG9yICovCi0JcGFyYW1zIHw9ICh1MTYpKHRpZCA8PCAxMik7IAkJLyogYml0IDE1OjEyIFRJRCBudW1iZXIgKi8KKwlwYXJhbXMgPSAodTE2KSgxIDw8IDExKTsJLyogYml0IDExIGluaXRpYXRvciAqLworCXBhcmFtcyB8PSAodTE2KSh0aWQgPDwgMTIpOwkvKiBiaXQgMTU6MTIgVElEIG51bWJlciAqLwogCiAJYWN0aW9uX2ZyYW1lLT51LmFjdGlvbi51LmRlbGJhLnBhcmFtcyA9IGNwdV90b19sZTE2KHBhcmFtcyk7CiAJYWN0aW9uX2ZyYW1lLT51LmFjdGlvbi51LmRlbGJhLnJlYXNvbl9jb2RlID0KQEAgLTE2NTIsOSArMTY0OSw4IEBACiAJaWYgKGV0aGVyX2FkZHJfZXF1YWwoaGRyLT5hZGRyMywgcnRscHJpdi0+bWFjODAyMTEuYnNzaWQpKQogCQlyZXR1cm47CiAKLQlpZiAocnRsX2ZpbmRfMjIxX2llKGh3LCBkYXRhLCBsZW4pKSB7CisJaWYgKHJ0bF9maW5kXzIyMV9pZShodywgZGF0YSwgbGVuKSkKIAkJdmVuZG9yID0gbWFjLT52ZW5kb3I7Ci0JfQogCiAJaWYgKChtZW1jbXAobWFjLT5ic3NpZCwgYXA1XzEsIDMpID09IDApIHx8CiAJCShtZW1jbXAobWFjLT5ic3NpZCwgYXA1XzIsIDMpID09IDApIHx8CkBAIC0xNjcxLDcgKzE2NjcsNyBAQAogCQkobWVtY21wKG1hYy0+YnNzaWQsIGFwNF8yLCAzKSA9PSAwKSB8fAogCQkobWVtY21wKG1hYy0+YnNzaWQsIGFwNF8zLCAzKSA9PSAwKSB8fAogCQl2ZW5kb3IgPT0gUEVFUl9SQUwpIHsKLQkJUlRfVFJBQ0UoQ09NUF9NQUM4MDIxMSwgREJHX0xPVUQsICgiPT5yYWwgZmluZG5cbiIpKTsKKwkJUlRfVFJBQ0UoQ09NUF9NQUM4MDIxMSwgREJHX0xPVUQsICgiPT5yYWwgZmluZFxuIikpOwogCQl2ZW5kb3IgPSBQRUVSX1JBTDsKIAl9IGVsc2UgaWYgKG1lbWNtcChtYWMtPmJzc2lkLCBhcDZfMSwgMykgPT0gMCB8fAogCQl2ZW5kb3IgPT0gUEVFUl9DSVNDTykgewpAQCAtMTcxNSw3ICsxNzExLDcgQEAKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAlpbnQgcmV0OwogCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKKwlyZXQgPSBrc3RydG91bChidWYsIDAsICZ2YWwpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIGlzIG5vdCBpbiBoZXggb3IgZGVjaW1hbCBmb3JtLlxuIiwgYnVmKTsKIAl9IGVsc2UgewpAQCAtMTg0NSw4ICsxODQxLDcgQEAKIGludCBydGxfY29yZV9tb2R1bGVfaW5pdCh2b2lkKQogewogCWlmIChydGxfcmF0ZV9jb250cm9sX3JlZ2lzdGVyKCkpCi0JCXByaW50ayhLRVJOX0RFQlVHICJydGw6IFVuYWJsZSB0byByZWdpc3RlciBydGxfcmMsIgotCQkJICAidXNlIGRlZmF1bHQgUkMgISFcbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyAicnRsOiBVbmFibGUgdG8gcmVnaXN0ZXIgcnRsX3JjLCB1c2UgZGVmYXVsdCBSQyAhIVxuIik7CiAKIAkvKiBhZGQgcHJvYyBmb3IgZGVidWcgKi8KIAlydGxfcHJvY19hZGRfdG9wZGlyKCk7CkBAIC0xODYxLDcgKzE4NTYsNyBAQAogdm9pZCBydGxfY29yZV9tb2R1bGVfZXhpdCh2b2lkKQogewogCS8qUkMqLwotICAgCXJ0bF9yYXRlX2NvbnRyb2xfdW5yZWdpc3RlcigpOworCXJ0bF9yYXRlX2NvbnRyb2xfdW5yZWdpc3RlcigpOwogCiAJLyogYWRkIHByb2MgZm9yIGRlYnVnICovCiAJcnRsX3Byb2NfcmVtb3ZlX3RvcGRpcigpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvSGFsQnRjODgxMmExQW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9IYWxCdGM4ODEyYTFBbnQuYwppbmRleCBiMzBmMTdhLi41YTU0YmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9IYWxCdGM4ODEyYTFBbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9IYWxCdGM4ODEyYTFBbnQuYwpAQCAtMTY1Myw3ICsxNjUzLDcgQEAKIAl9CiAJZWxzZQogCXsKLQkJLy9hY2NxdWlyZSB0aGUgQlQgVFJ4IHJldHJ5IGNvdW50IGZyb20gQlRfSW5mbyBieXRlMgorCQkvL2FjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIKIAkJcmV0cnlfY291bnQgPSBjb2V4X3N0YS0+YnRfcmV0cnlfY250OwogCQlidF9pbmZvX2V4dCA9IGNvZXhfc3RhLT5idF9pbmZvX2V4dDsKIAkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcmV0cnlfY291bnQgPSAlZFxuIiwgcmV0cnlfY291bnQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhYnRjODcyM2ExYW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWJ0Yzg3MjNhMWFudC5jCmluZGV4IGU2MTk5MjMuLjhlNDI5M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhYnRjODcyM2ExYW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFidGM4NzIzYTFhbnQuYwpAQCAtNjI5LDcgKzYyOSw3IEBACiAJfQogCWVsc2UKIAl7Ci0JCS8vYWNjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIKKwkJLy9hY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyCiAJCXJldHJ5Q291bnQgPSBwQ29leFN0YS0+YnRSZXRyeUNudDsKIAkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCByZXRyeUNvdW50ID0gJWRcbiIsIHJldHJ5Q291bnQpKTsKIAkJcmVzdWx0ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0YzgxOTJlMWFudC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODE5MmUxYW50LmMKaW5kZXggOTczZDBlYS4uMWIwNDUzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODE5MmUxYW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODE5MmUxYW50LmMKQEAgLTE3MjEsNyArMTcyMSw3IEBACiAJfQogCWVsc2UKIAl7Ci0JCS8vYWNjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIKKwkJLy9hY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyCiAJCXJldHJ5Q291bnQgPSBwQ29leFN0YS0+YnRSZXRyeUNudDsKIAkJYnRJbmZvRXh0ID0gcENvZXhTdGEtPmJ0SW5mb0V4dDsKIAkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcmV0cnlDb3VudCA9ICVkXG4iLCByZXRyeUNvdW50KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4MTkyZTJhbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0YzgxOTJlMmFudC5jCmluZGV4IDQ0ZWM3ODUuLjExNTkwODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0YzgxOTJlMmFudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0YzgxOTJlMmFudC5jCkBAIC0xODAzLDcgKzE4MDMsNyBAQAogCQlyZXN1bHQgPSAwOwogCQl3YWl0X2NudCA9IDA7CiAJfSBlbHNlIHsKLQkJLyogYWNjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIgKi8KKwkJLyogYWNxdWlyZSB0aGUgQlQgVFJ4IHJldHJ5IGNvdW50IGZyb20gQlRfSW5mbyBieXRlMiAqLwogCQlyZXRyeV9jbnQgPSBjb2V4X3N0YS0+YnRfcmV0cnlfY250OwogCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLAogCQkJICAiW0JUQ29leF0sIHJldHJ5X2NudCA9ICVkXG4iLCByZXRyeV9jbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODcyM2EyYW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4NzIzYTJhbnQuYwppbmRleCAxODBkNmYxLi4zZjVjNGZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4NzIzYTJhbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4NzIzYTJhbnQuYwpAQCAtMTY4Nyw3ICsxNjg3LDcgQEAKIAl9CiAJZWxzZQogCXsKLQkJLy9hY2NxdWlyZSB0aGUgQlQgVFJ4IHJldHJ5IGNvdW50IGZyb20gQlRfSW5mbyBieXRlMgorCQkvL2FjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIKIAkJcmV0cnlDb3VudCA9IHBDb2V4U3RhLT5idFJldHJ5Q250OwogCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCByZXRyeUNvdW50ID0gJWRcbiIsIHJldHJ5Q291bnQpKTsKIAkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgdXA9JWQsIGRuPSVkLCBtPSVkLCBuPSVkLCBXYWl0Q291bnQ9JWRcbiIsIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODcyM2IxYW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4NzIzYjFhbnQuYwppbmRleCAzNDE0YmE3Li45Njc3OTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4NzIzYjFhbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4NzIzYjFhbnQuYwpAQCAtMTk1MCw3ICsxOTUwLDcgQEAKIAkJcmVzdWx0ID0gMDsKIAkJd2FpdF9jb3VudCA9IDA7CiAJfSBlbHNlIHsKLQkJLyphY2NxdWlyZSB0aGUgQlQgVFJ4IHJldHJ5IGNvdW50IGZyb20gQlRfSW5mbyBieXRlMiAqLworCQkvKmFjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIgKi8KIAkJcmV0cnlfY291bnQgPSBjb2V4X3N0YS0+YnRfcmV0cnlfY250OwogCQlidF9pbmZvX2V4dCA9IGNvZXhfc3RhLT5idF9pbmZvX2V4dDsKIAkJcmVzdWx0ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Yzg3MjNiMmFudC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODcyM2IyYW50LmMKaW5kZXggODNiMWI0Mi4uZDMzN2JkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODcyM2IyYW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODcyM2IyYW50LmMKQEAgLTE4MzAsNyArMTgzMCw3IEBACiAJCXJlc3VsdCA9IDA7CiAJCXdhaXRfY291bnQgPSAwOwogCX0gZWxzZSB7Ci0JCS8qYWNjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIqLworCQkvKmFjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIqLwogCQlyZXRyeUNvdW50ID0gY29leF9zdGEtPmJ0X3JldHJ5X2NudDsKIAkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKIAkJCSAgIltCVENvZXhdLCByZXRyeUNvdW50ID0gJWRcbiIsIHJldHJ5Q291bnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjb3V0c3JjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGNvdXRzcmMuYwppbmRleCA5ZDlmYTRkLi5jNGU4Mzc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGNvdXRzcmMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGNvdXRzcmMuYwpAQCAtNzMyLDE3ICs3MzIsNyBAQAogCWVsc2UKIAkJYnRjb2V4aXN0LT5iaW5kZWQgPSB0cnVlOwogCi0jaWYgKCBkZWZpbmVkKENPTkZJR19QQ0lfSENJKSkKLQlidGNvZXhpc3QtPmNoaXBfaW50ZXJmYWNlID0gQlRDX0lOVEZfUENJOwotI2VsaWYgKCBkZWZpbmVkKENPTkZJR19VU0JfSENJKSkKLQlidGNvZXhpc3QtPmNoaXBfaW50ZXJmYWNlID0gQlRDX0lOVEZfVVNCOwotI2VsaWYgKCBkZWZpbmVkKENPTkZJR19TRElPX0hDSSkpCi0JYnRjb2V4aXN0LT5jaGlwX2ludGVyZmFjZSA9IEJUQ19JTlRGX1NESU87Ci0jZWxpZiAoIGRlZmluZWQoQ09ORklHX0dTUElfSENJKSkKLQlidGNvZXhpc3QtPmNoaXBfaW50ZXJmYWNlID0gQlRDX0lOVEZfR1NQSTsKLSNlbHNlCiAJYnRjb2V4aXN0LT5jaGlwX2ludGVyZmFjZSA9IEJUQ19JTlRGX1VOS05PV047Ci0jZW5kaWYKIAogCWlmIChOVUxMID09IGJ0Y29leGlzdC0+YWRhcHRlcikKIAkJYnRjb2V4aXN0LT5hZGFwdGVyID0gYWRhcHRlcjsKQEAgLTEwODcsNyArMTA3Nyw3IEBACiAJYnRjb2V4aXN0LT5zdGF0aXN0aWNzLmNudF9kYmdfY3RybCsrOwogfQogCi12b2lkIGV4aGFsYnRjX3N0YWNrX3VwZGF0ZV9wcm9maWxlX2luZm8oKQordm9pZCBleGhhbGJ0Y19zdGFja191cGRhdGVfcHJvZmlsZV9pbmZvKHZvaWQpCiB7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9jb3JlLmMKaW5kZXggNDBkZTYwOC4uZmYzMTM5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9jb3JlLmMKQEAgLTM3Myw3ICszNzMsNyBAQAogCQkJLyogc2xlZXAgaGVyZSBpcyBtdXN0LCBvciB3ZSBtYXkgcmVjdiB0aGUgYmVhY29uIGFuZAogCQkJICogY2F1c2UgbWFjODAyMTEgaW50byB3cm9uZyBwcyBzdGF0ZSwgdGhpcyB3aWxsIGNhdXNlCiAJCQkgKiBwb3dlciBzYXZlIG51bGxmdW5jIHNlbmQgZmFpbCwgYW5kIGZ1cnRoZXIgY2F1c2UKLQkJCSAqIHBrdCBsb3NzLCBTbyBzbGVlcCBtdXN0IHF1aWNrbHkgYnV0IG5vdCBpbW1lZGlhdGx5CisJCQkgKiBwa3QgbG9zcywgU28gc2xlZXAgbXVzdCBxdWlja2x5IGJ1dCBub3QgaW1tZWRpYXRlbHkKIAkJCSAqIGJlY2F1c2UgdGhhdCB3aWxsIGNhdXNlIG51bGxmdW5jIHNlbmQgYnkgbWFjODAyMTEKIAkJCSAqIGZhaWwsIGFuZCBjYXVzZSBwa3QgbG9zcywgd2UgaGF2ZSB0ZXN0ZWQgdGhhdCA1bUEKIAkJCSAqIGlzIHdvcmtlZCB2ZXJ5IHdlbGwgKi8KQEAgLTEyMDAsOCArMTIwMCw4IEBACiAJCWtleV90eXBlID0gQUVTQ01BQ19FTkNSWVBUSU9OOwogCQlSVF9UUkFDRShDT01QX1NFQywgREJHX0RNRVNHLCAoImFsZzpDTUFDXG4iKSk7CiAJCVJUX1RSQUNFKENPTVBfU0VDLCBEQkdfRE1FU0csCi0JCQkJKCJIVyBkb24ndCBzdXBwb3J0IENNQUMgZW5jcnlwaXRvbiwgIgotCQkJCSJ1c2Ugc29mdHdhcmUgQ01BQyBlbmNyeXBpdG9uXG4iKSk7CisJCQkJKCJIVyBkb24ndCBzdXBwb3J0IENNQUMgZW5jcnlwdGlvbiwgIgorCQkJCSJ1c2Ugc29mdHdhcmUgQ01BQyBlbmNyeXB0aW9uXG4iKSk7CiAJCWVyciA9IC1FT1BOT1RTVVBQOwogCQlnb3RvIG91dF91bmxvY2s7CiAJZGVmYXVsdDoKQEAgLTEyMzUsOCArMTIzNSw4IEBACiAJCWtleV90eXBlID0gQUVTQ01BQ19FTkNSWVBUSU9OOwogCQlSVF9UUkFDRShDT01QX1NFQywgREJHX0RNRVNHLCAoImFsZzpDTUFDXG4iKSk7CiAJCVJUX1RSQUNFKENPTVBfU0VDLCBEQkdfRE1FU0csCi0JCQkgKCJIVyBkb24ndCBzdXBwb3J0IENNQUMgZW5jcnlwaXRvbiwgIgotCQkJICAidXNlIHNvZnR3YXJlIENNQUMgZW5jcnlwaXRvblxuIikpOworCQkJICgiSFcgZG9uJ3Qgc3VwcG9ydCBDTUFDIGVuY3J5cHRpb24sICIKKwkJCSAgInVzZSBzb2Z0d2FyZSBDTUFDIGVuY3J5cHRpb25cbiIpKTsKIAkJZXJyID0gLUVPUE5PVFNVUFA7CiAJCWdvdG8gb3V0X3VubG9jazsKIAlkZWZhdWx0OgpAQCAtMTQxMSw3ICsxNDExLDcgQEAKIH0KIAogLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbWFjODAyMTEgdG8gZmx1c2ggdHggYnVmZmVyCi0gKiBiZWZvcmUgc3dpdGNoIGNoYW5ubGUgb3IgcG93ZXIgc2F2ZSwgb3IgdHggYnVmZmVyIHBhY2tldAorICogYmVmb3JlIHN3aXRjaCBjaGFubmVsIG9yIHBvd2VyIHNhdmUsIG9yIHR4IGJ1ZmZlciBwYWNrZXQKICAqIG1heWJlIHNlbmQgYWZ0ZXIgb2ZmY2hhbm5lbCBvciByZiBzbGVlcCwgdGhpcyBtYXkgY2F1c2UKICAqIGRpcy1hc3NvY2lhdGlvbiBieSBBUCAqLwogI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywxMCwwKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvY29yZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9jb3JlLmgKaW5kZXggNGIyNDdkYi4uZjBjNzRlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9jb3JlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9jb3JlLmgKQEAgLTIsMjAgKzIsMjAgQEAKICAqCiAgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgogICoKLSAqIFRtaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRtaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICAqIG1vcmUgZGV0YWlscy4KICAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0bWlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAogICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCiAgKgotICogVG1lIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKICAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCiAgKgogICogQ29udGFjdCBJbmZvcm1hdGlvbjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvZGVidWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvZGVidWcuYwppbmRleCBjYjA1MTIyLi44YTZjNzk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2RlYnVnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9kZWJ1Zy5jCkBAIC0yLDIwICsyLDIwIEBACiAgKgogICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KICAqCi0gKiBUbWlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUbWlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAgKiBtb3JlIGRldGFpbHMuCiAgKgogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdG1pcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKICAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQogICoKLSAqIFRtZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCiAgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgogICoKICAqIENvbnRhY3QgSW5mb3JtYXRpb246CkBAIC05ODUsNCArOTg1LDQgQEAKIHsKIAlpZiAocHJvY190b3BkaXIpCiAJCXJlbW92ZV9wcm9jX2VudHJ5KCJydGx3aWZpIiwgaW5pdF9uZXQucHJvY19uZXQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvZGVidWcuaAppbmRleCA1ZWI2MjUxLi42YzBhNTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2RlYnVnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9kZWJ1Zy5oCkBAIC0yLDIwICsyLDIwIEBACiAgKgogICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KICAqCi0gKiBUbWlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUbWlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAgKiBtb3JlIGRldGFpbHMuCiAgKgogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdG1pcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKICAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQogICoKLSAqIFRtZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCiAgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgogICoKICAqIENvbnRhY3QgSW5mb3JtYXRpb246CkBAIC00NCw3ICs0NCw3IEBACiAjZGVmaW5lIERCR19FTUVSRwkJCTAKIAogLyoKLSAqQWJub3JtYWwsIHJhcmUsIG9yIHVuZXhwZXRlZCBjYXNlcy4KKyAqQWJub3JtYWwsIHJhcmUsIG9yIHVuZXhwZWN0ZWQgY2FzZXMuCiAgKkZvciBleGFtcGxlLCBQYWNrZXQvSU8gQ3RsIGNhbmNlbGVkLAogICpkZXZpY2Ugc3VwcmlzZWx5IHVucmVtb3ZlZCBhbmQgc28gb24uCiAgKi8KQEAgLTU0LDcgKzU0LDcgQEAKICAqTm9ybWFsIGNhc2UgZHJpdmVyIGRldmVsb3BlciBzaG91bGQKICAqb3Blbiwgd2UgY2FuIHNlZSBsaW5rIHN0YXR1cyBsaWtlCiAgKmFzc29jL0FkZEJBL0RIQ1AvYWRhcHRlciBzdGFydCBhbmQKLSAqc28gb24gYmFzaWMgYW5kIHVzZWZ1bCBpbmZyb21hdGlvbnMuCisgKnNvIG9uIGJhc2ljIGFuZCB1c2VmdWwgaW5mb3JtYXRpb25zLgogICovCiAjZGVmaW5lIERCR19ETUVTRwkJCTMKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9lZnVzZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9lZnVzZS5jCmluZGV4IDc0YzE5ZWMuLjI1MGFhZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvZWZ1c2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2VmdXNlLmMKQEAgLTIsMjAgKzIsMjAgQEAKICAqCiAgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgogICoKLSAqIFRtaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRtaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICAqIG1vcmUgZGV0YWlscy4KICAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0bWlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAogICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCiAgKgotICogVG1lIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKICAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCiAgKgogICogQ29udGFjdCBJbmZvcm1hdGlvbjoKQEAgLTE0OSw3ICsxNDksNyBAQAogCQlyZXR1cm4gMHhGRjsKIAogfQotLy9FWFBPUlRfU1lNQk9MKGVmdXNlX3JlYWRfMWJ5dGUpOworLyogRVhQT1JUX1NZTUJPTChlZnVzZV9yZWFkXzFieXRlKTsgKi8KIAogdm9pZCBlZnVzZV93cml0ZV8xYnl0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IGFkZHJlc3MsIHU4IHZhbHVlKQogewpAQCAtNTE3LDcgKzUxNyw3IEBACiAJCQlydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfSFdTRVRfTUFYX1NJWkVdKTsKIAogfQotLy9FWFBPUlRfU1lNQk9MKHJ0bF9lZnVzZV9zaGFkb3dfbWFwX3VwZGF0ZSk7CisvKiBFWFBPUlRfU1lNQk9MKHJ0bF9lZnVzZV9zaGFkb3dfbWFwX3VwZGF0ZSk7ICovCiAKIHZvaWQgZWZ1c2VfZm9yY2Vfd3JpdGVfdmVuZG9yX0lkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewpAQCAtNjI4LDcgKzYyOCw3IEBACiAJfQogCXJldHVybiBicmVzdWx0OwogfQotLy9FWFBPUlRfU1lNQk9MKGVmdXNlX29uZV9ieXRlX3JlYWQpOworLyogRVhQT1JUX1NZTUJPTChlZnVzZV9vbmVfYnl0ZV9yZWFkKTsgKi8KIAogc3RhdGljIGludCBlZnVzZV9vbmVfYnl0ZV93cml0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IGFkZHIsIHU4IGRhdGEpCiB7CkBAIC0xMTIwLDE2ICsxMTIwLDE2IEBACiAJCXsKIAkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9BQ0NFU1NdLCAweDY5KTsKIAotCQkJLy8gMS4yViBQb3dlcjogRnJvbSBWRERPTiB3aXRoIFBvd2VyIEN1dCgweDAwMDBoWzE1XSksIGRlZnVhbHQgdmFsaWQKKwkJCS8qIDEuMlYgUG93ZXI6IEZyb20gVkRET04gd2l0aCBQb3dlciBDdXQoMHgwMDAwaFsxNV0pLCBkZWZhdWx0IHZhbGlkICovCiAJCQl0bXBWMTYgPSBydGxfcmVhZF93b3JkKHJ0bHByaXYsCiAJCQkJCSAgICAgICBydGxwcml2LT5jZmctPm1hcHNbU1lTX0lTT19DVFJMXSk7CiAKIAkJCXByaW50aygiU1lTX0lTT19DVFJMPSUwNHguXG4iLHRtcFYxNik7CiAJCQlpZiggISAodG1wVjE2ICYgUFdDX0VWMTJWICkgKXsKIAkJCQl0bXBWMTYgfD0gUFdDX0VWMTJWIDsKLQkJCQkgLy9QbGF0Zm9ybUVGSU9Xcml0ZTJCeXRlKHBBZGFwdGVyLFJFR19TWVNfSVNPX0NUUkwsdG1wVjE2KTsKKwkJCQkgLyogUGxhdGZvcm1FRklPV3JpdGUyQnl0ZShwQWRhcHRlcixSRUdfU1lTX0lTT19DVFJMLHRtcFYxNik7ICovCiAJCQl9Ci0JCQkvLyBSZXNldDogMHgwMDAwaFsyOF0sIGRlZmF1bHQgdmFsaWQKKwkJCS8qIFJlc2V0OiAweDAwMDBoWzI4XSwgZGVmYXVsdCB2YWxpZCAqLwogIAkJCXRtcFYxNiA9IHJ0bF9yZWFkX3dvcmQocnRscHJpdiwgIHJ0bHByaXYtPmNmZy0+bWFwc1tTWVNfRlVOQ19FTl0pOwogCQkJcHJpbnRrKCJTWVNfRlVOQ19FTj0lMDR4LlxuIix0bXBWMTYpOwogCQkJaWYoICEodG1wVjE2ICYgRkVOX0VMRFIpICl7CkBAIC0xMTM3LDcgKzExMzcsNyBAQAogCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tTWVNfRlVOQ19FTl0sIHRtcFYxNik7CiAJCQl9CiAKLQkJCS8vIENsb2NrOiBHYXRlZCgweDAwMDhoWzVdKSA4TSgweDAwMDhoWzFdKSBjbG9jayBmcm9tIEFOQSwgZGVmYXVsdCB2YWxpZAorCQkJLyogQ2xvY2s6IEdhdGVkKDB4MDAwOGhbNV0pIDhNKDB4MDAwOGhbMV0pIGNsb2NrIGZyb20gQU5BLCBkZWZhdWx0IHZhbGlkICovCiAJCQl0bXBWMTYgPSBydGxfcmVhZF93b3JkKHJ0bHByaXYsICBydGxwcml2LT5jZmctPm1hcHNbU1lTX0NMS10gKTsKIAkJCXByaW50aygiU1lTX0NMSz0lMDR4LlxuIix0bXBWMTYpOwogCQkJaWYoICghKHRtcFYxNiAmIExPQURFUl9DTEtfRU4pICkgIHx8KCEodG1wVjE2ICYgQU5BOE0pICkgKQpAQCAtMTE0OCw3ICsxMTQ4LDcgQEAKIAogCQkJaWYoYndyaXRlID09IHRydWUpCiAJCQl7Ci0JCQkJLy8gRW5hYmxlIExETyAyLjVWIGJlZm9yZSByZWFkL3dyaXRlIGFjdGlvbgorCQkJCS8qIEVuYWJsZSBMRE8gMi41ViBiZWZvcmUgcmVhZC93cml0ZSBhY3Rpb24gKi8KIAkJCQl0ZW1wdmFsID0gcnRsX3JlYWRfd29yZChydGxwcml2LCAgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX1RFU1RdICsgMyk7CiAJCQkJcHJpbnRrKCJFRlVTRV9URVNUPSUwNHguXG4iLHRtcFYxNik7CiAJCQkJdGVtcHZhbCAmPSB+KEJJVCgzKSB8IEJJVCg0KSB8QklUKDUpIHwgQklUKDYpKTsKQEAgLTExNjEsNyArMTE2MSw3IEBACiAJCXsKIAkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9BQ0NFU1NdLCAweDAwKTsKIAkJCWlmKGJ3cml0ZSA9PSB0cnVlKXsKLQkJCQkvLyBEaXNhYmxlIExETyAyLjVWIGFmdGVyIHJlYWQvd3JpdGUgYWN0aW9uCisJCQkJLyogRGlzYWJsZSBMRE8gMi41ViBhZnRlciByZWFkL3dyaXRlIGFjdGlvbiAqLwogCQkJCXRlbXB2YWwgPSBydGxfcmVhZF93b3JkKHJ0bHByaXYsICBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfVEVTVF0gKyAzKTsKIAkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX1RFU1RdICsgMywgKHRlbXB2YWwgJiAweDdGKSk7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9wY2kuYwppbmRleCBjZmE2NTFlLi5hNTYyYWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3BjaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcGNpLmMKQEAgLTM4OCwxMyArMzg4LDEzIEBACiAJCSAqIGNhcGFiaWxpdHkgdGhhdCB3ZSBhcmUgbG9va2luZyBmb3IsIGZvbGxvdyB0aGUgbGluayB0bwogCQkgKiB0aGUgbmV4dCBjYXBhYmlsaXR5IGFuZCBjb250aW51ZSBsb29waW5nLgogCQkgKi8KLQkJcnRsX3BjaV9yYXdfd3JpdGVfcG9ydF91bG9uZyhQQ0lfQ09ORl9BRERSRVNTICwgCi0JCQkJCSAgICAgcGNpY2ZnX2FkZHJfcG9ydCArIAorCQlydGxfcGNpX3Jhd193cml0ZV9wb3J0X3Vsb25nKFBDSV9DT05GX0FERFJFU1MgLAorCQkJCQkgICAgIHBjaWNmZ19hZGRyX3BvcnQgKwogCQkJCQkgICAgIChudW00Ynl0ZXMgPDwgMikpOwogCQlydGxfcGNpX3Jhd19yZWFkX3BvcnRfdXNob3J0KFBDSV9DT05GX0RBVEEsCiAJCQkJCSAgICAgKHUxNiopJmNhcGFiaWxpdHlfaGRyKTsKIAkJLyogRm91bmQgdGhlIFBDSSBleHByZXNzIGNhcGFiaWxpdHkuICovCi0JCWlmIChjYXBhYmlsaXR5X2hkci5jYXBhYmlsaXR5X2lkID09IAorCQlpZiAoY2FwYWJpbGl0eV9oZHIuY2FwYWJpbGl0eV9pZCA9PQogCQkgICAgUENJX0NBUEFCSUxJVFlfSURfUENJX0VYUFJFU1MpCiAJCQlicmVhazsKIAkJZWxzZQpAQCAtNDE4LDcgKzQxOCw3IEBACiAJCWxpc3RfZm9yX2VhY2hfZW50cnkodGVtcF9wcml2LCAmcnRscHJpdi0+Z2xiX3Zhci0+Z2xiX3ByaXZfbGlzdCwKIAkJCWxpc3QpIHsKIAkJCWlmICh0ZW1wX3ByaXYpIHsKLQkJCQl0ZW1wX3BjaXByaXYgPSAKKwkJCQl0ZW1wX3BjaXByaXYgPQogCQkJCQkoc3RydWN0IHJ0bF9wY2lfcHJpdiAqKXRlbXBfcHJpdi0+cHJpdjsKIAkJCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAogCQkJCQkoKCJwY2lwcml2LT5uZGlzX2FkYXB0ZXIuZnVuY251bWJlciAleCBcbiIpLApAQCAtNTI2LDggKzUyNiw4IEBACiB9CiAKIHN0YXRpYyBib29sIF9ydGxfcGNpX3VwZGF0ZV9lYXJseW1vZGVfaW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgCi0JCQkJCSAgIHN0cnVjdCBydGxfdGNiX2Rlc2MgKnRjYl9kZXNjLCAKKwkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICAgc3RydWN0IHJ0bF90Y2JfZGVzYyAqdGNiX2Rlc2MsCiAJCQkJCSAgIHU4IHRpZCkKIHsKIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CkBAIC01MzUsNyArNTM1LDcgQEAKIAlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOwogCXU4IGFkZGl0aW9ubGVuID0gRkNTX0xFTjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dF9za2I7Ci0JCQorCiAJLyogaGVyZSBvcGVuIGlzIDQsIHdlcC90a2lwIGlzIDgsIGFlcyBpcyAxMiovCiAJaWYgKGluZm8tPmNvbnRyb2wuaHdfa2V5KQogCQlhZGRpdGlvbmxlbiArPSBpbmZvLT5jb250cm9sLmh3X2tleS0+aWN2X2xlbjsKQEAgLTU0NCw3ICs1NDQsNyBAQAogCXRjYl9kZXNjLT5lbXBrdF9udW0gPSAwOwogCXNwaW5fbG9ja19iaCgmcnRscHJpdi0+bG9ja3Mud2FpdHFfbG9jayk7CiAJc2tiX3F1ZXVlX3dhbGsoJnJ0bHByaXYtPm1hYzgwMjExLnNrYl93YWl0cVt0aWRdLCBuZXh0X3NrYikgewotCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKm5leHRfaW5mbyA9IAorCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKm5leHRfaW5mbyA9CiAJCQkJCUlFRUU4MDIxMV9TS0JfQ0IobmV4dF9za2IpOwogCQlpZiAobmV4dF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpIHsKIAkJCXRjYl9kZXNjLT5lbXBrdF9sZW5bdGNiX2Rlc2MtPmVtcGt0X251bV0gPQpAQCAtNTU0LDcgKzU1NCw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWlmIChza2JfcXVldWVfaXNfbGFzdCgmcnRscHJpdi0+bWFjODAyMTEuc2tiX3dhaXRxW3RpZF0sIAorCQlpZiAoc2tiX3F1ZXVlX2lzX2xhc3QoJnJ0bHByaXYtPm1hYzgwMjExLnNrYl93YWl0cVt0aWRdLAogCQkJCSAgICAgIG5leHRfc2tiKSkKIAkJCWJyZWFrOwogCkBAIC01NzUsMjYgKzU3NSwyNiBAQAogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IE5VTEw7CiAJaW50IHRpZDsgLyogc2hvdWxkIGJlIGludCAqLwotCQorCiAJaWYgKCFydGxwcml2LT5ydGxoYWwuYl9lYXJseW1vZGVfZW5hYmxlKQotCQlyZXR1cm47CQorCQlyZXR1cm47CiAJaWYgKHJ0bHByaXYtPmRtLnN1cHBfcGh5bW9kZV9zd2l0Y2ggJiYKIAkJKHJ0bHByaXYtPmVhc3lfY29uY3VycmVudF9jdGwuYnN3aXRjaF9pbl9wcm9jZXNzIHx8Ci0JCShydGxwcml2LT5idWRkeV9wcml2ICYmIAorCQkocnRscHJpdi0+YnVkZHlfcHJpdiAmJgogCQkgcnRscHJpdi0+YnVkZHlfcHJpdi0+ZWFzeV9jb25jdXJyZW50X2N0bC5ic3dpdGNoX2luX3Byb2Nlc3MpKSkKIAkJcmV0dXJuOwotCS8qIHdlIGp1c2UgdXNlIGVtIGZvciBCRS9CSy9WSS9WTyAqLworCS8qIHdlIGp1c3QgdXNlIGVtIGZvciBCRS9CSy9WSS9WTyAqLwogCWZvciAodGlkID0gNzsgdGlkID49IDA7IHRpZC0tKSB7CiAJCXU4IGh3X3F1ZXVlID0gYWNfdG9faHdxW3J0bF90aWRfdG9fYWMoaHcsIHRpZCldOwogCQlzdHJ1Y3QgcnRsODE5Ml90eF9yaW5nICpyaW5nID0gJnJ0bHBjaS0+dHhfcmluZ1tod19xdWV1ZV07Ci0JCXdoaWxlICghbWFjLT5hY3Rfc2Nhbm5pbmcgJiYgCisJCXdoaWxlICghbWFjLT5hY3Rfc2Nhbm5pbmcgJiYKIAkJICAgICAgIHJ0bHByaXYtPnBzYy5yZnB3cl9zdGF0ZSA9PSBFUkZPTikgewogCQkJc3RydWN0IHJ0bF90Y2JfZGVzYyB0Y2JfZGVzYzsKLQkJCW1lbXNldCgmdGNiX2Rlc2MsIDAsIHNpemVvZihzdHJ1Y3QgcnRsX3RjYl9kZXNjKSk7CQkJCisJCQltZW1zZXQoJnRjYl9kZXNjLCAwLCBzaXplb2Yoc3RydWN0IHJ0bF90Y2JfZGVzYykpOwogCiAJCQlzcGluX2xvY2tfYmgoJnJ0bHByaXYtPmxvY2tzLndhaXRxX2xvY2spOwogCQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJm1hYy0+c2tiX3dhaXRxW3RpZF0pICYmCi0JCQkgICAgKHJpbmctPmVudHJpZXMgLSBza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkgPiAKKwkJCSAgICAocmluZy0+ZW50cmllcyAtIHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSA+CiAJCQkgICAgIHJ0bGhhbC0+bWF4X2Vhcmx5bW9kZV9udW0pKSB7CiAJCQkJc2tiID0gc2tiX2RlcXVldWUoJm1hYy0+c2tiX3dhaXRxW3RpZF0pOwogCQkJfSBlbHNlIHsKQEAgLTYwNyw3ICs2MDcsNyBAQAogCQkJICogbXVsdGljYXN0L2Jyb2FkY2FzdC9ub19xb3MgZGF0YSAqLwogCQkJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAkJCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpCi0JCQkJX3J0bF9wY2lfdXBkYXRlX2Vhcmx5bW9kZV9pbmZvKGh3LCBza2IsIAorCQkJCV9ydGxfcGNpX3VwZGF0ZV9lYXJseW1vZGVfaW5mbyhodywgc2tiLAogCQkJCQkJCSAgICAgICAmdGNiX2Rlc2MsIHRpZCk7CiAKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KQEAgLTYzNSw3ICs2MzUsNyBAQAogCQl1OCB0aWQ7CiAJCXU4ICplbnRyeTsKIAotCQkKKwogCQlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykKIAkJCWVudHJ5ID0gKHU4ICopKCZyaW5nLT5idWZmZXJfZGVzY1tyaW5nLT5pZHhdKTsKIAkJZWxzZQpAQCAtNjQzLDExICs2NDMsMTEgQEAKIAogCQlpZiAoIXJ0bHByaXYtPmNmZy0+b3BzLT5pc190eF9kZXNjX2Nsb3NlZChodywgcHJpbywgcmluZy0+aWR4KSkKIAkJCXJldHVybjsKLQkJCQorCiAJCXJpbmctPmlkeCA9IChyaW5nLT5pZHggKyAxKSAlIHJpbmctPmVudHJpZXM7Ci0JCQorCiAJCXNrYiA9IF9fc2tiX2RlcXVldWUoJnJpbmctPnF1ZXVlKTsKLQkJCisKIAkJcGNpX3VubWFwX3NpbmdsZShydGxwY2ktPnBkZXYsCiAJCQkJIGxlMzJfdG9fY3B1KHJ0bHByaXYtPmNmZy0+b3BzLT4KIAkJCQkJICAgICBnZXRfZGVzYygodTggKikgZW50cnksIHRydWUsCkBAIC02NzIsNyArNjcyLDcgQEAKIAkJfQogCiAJCS8qIGZvciBzdyBMUFMsIGp1c3QgYWZ0ZXIgTlVMTCBza2Igc2VuZCBvdXQsIHdlIGNhbgotCQkgKiBzdXJlIEFQIGtvd24gd2UgYXJlIHNsZWVwZWQsIG91ciB3ZSBzaG91bGQgbm90IGxldAorCQkgKiBzdXJlIEFQIGtub3duIHdlIGFyZSBzbGVwdCwgb3VyIHdlIHNob3VsZCBub3QgbGV0CiAJCSAqIHJmIHRvIHNsZWVwKi8KIAkJZmMgPSBydGxfZ2V0X2ZjKHNrYik7CiAJCWlmIChpZWVlODAyMTFfaXNfbnVsbGZ1bmMoZmMpKSB7CkBAIC03NDAsNyArNzQwLDcgQEAKIAl1OCB0bXBfb25lID0gMTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0Jc2tiID0gZGV2X2FsbG9jX3NrYihydGxwY2ktPnJ4YnVmZmVyc2l6ZSk7CQorCXNrYiA9IGRldl9hbGxvY19za2IocnRscGNpLT5yeGJ1ZmZlcnNpemUpOwogCWlmICghc2tiKQogCQlyZXR1cm4gMDsKIAlydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0ucnhfYnVmW2Rlc2NfaWR4XSA9IHNrYjsKQEAgLTc1NCwyNSArNzU0LDI1IEBACiAJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihydGxwY2ktPnBkZXYsIGJ1ZmZlcmFkZHJlc3MpKQogCQlyZXR1cm4gMDsKIAlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykgewotCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoaHcsICh1OCAqKSBlbnRyeSwgZmFsc2UsIAorCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoaHcsICh1OCAqKSBlbnRyeSwgZmFsc2UsCiAJCQkJCSAgICBIV19ERVNDX1JYX1BSRVBBUkUsCiAJCQkJCSAgICAodTggKikgJiBidWZmZXJhZGRyZXNzKTsKLQl9IGVsc2UgewkKLQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9kZXNjKGh3LCAodTggKikgZW50cnksIGZhbHNlLCAKKwl9IGVsc2UgeworCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoaHcsICh1OCAqKSBlbnRyeSwgZmFsc2UsCiAJCQkJCSAgICBIV19ERVNDX1JYQlVGRl9BRERSLAogCQkJCQkgICAgKHU4ICopICYgYnVmZmVyYWRkcmVzcyk7Ci0JCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfZGVzYyhodywgKHU4ICopIGVudHJ5LCBmYWxzZSwgCisJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfZGVzYyhodywgKHU4ICopIGVudHJ5LCBmYWxzZSwKIAkJCQkJICAgIEhXX0RFU0NfUlhQS1RfTEVOLAogCQkJCQkgICAgKHU4ICopICYgcnRscGNpLT5yeGJ1ZmZlcnNpemUpOwotCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoaHcsICh1OCAqKSBlbnRyeSwgZmFsc2UsIAorCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoaHcsICh1OCAqKSBlbnRyeSwgZmFsc2UsCiAJCQkJCSAgICBIV19ERVNDX1JYT1dOLAogCQkJCQkgICAgKHU4ICopICYgdG1wX29uZSk7CiAJfQotCQorCiAJcmV0dXJuIDE7CiB9CiAKLS8qIGlub3JkZXIgdG8gcmVjZWl2ZSA4SyBBTVNEVSB3ZSBoYXZlIHNldCBza2IgdG8KKy8qIEluIG9yZGVyIHRvIHJlY2VpdmUgOEsgQU1TRFUgd2UgaGF2ZSBzZXQgc2tiIHRvCiAgKiA5MTAwYnl0ZXMgaW4gaW5pdCByeCByaW5nLCBidXQgaWYgdGhpcyBwYWNrZXQgaXMKICAqIG5vdCBhIEFNU0RVLCB0aGlzIHNvIGJpZyBwYWNrZXQgd2lsbCBiZSBzZW50IHRvCiAgKiBUQ1AvSVAgZGlyZWN0bHksIHRoaXMgY2F1c2UgYmlnIHBhY2tldCBwaW5nIGZhaWwKQEAgLTc4Myw3ICs3ODMsNyBAQAogLyogYnV0IHNvbWUgcGxhdGZvcm0gd2lsbCBmYWlsIHdoZW4gYWxsb2Mgc2tiIHNvbWV0aW1lcy4KICAqIGluIHRoaXMgY29uZGl0aW9uLCB3ZSB3aWxsIHNlbmQgdGhlIG9sZCBza2IgdG8KICAqIG1hYzgwMjExIGRpcmVjdGx5LCB0aGlzIHdpbGwgbm90IGNhdXNlIGFueSBvdGhlcgotICogaXNzdWVzLCBidXQgb25seSBiZSBsb3N0ZWQgYnkgVENQL0lQICovCisgKiBpc3N1ZXMsIGJ1dCBvbmx5IGJlIGxvc3QgYnkgVENQL0lQICovCiBzdGF0aWMgdm9pZCBfcnRsX3BjaV9yeF90b19tYWM4MDIxMShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyByeF9zdGF0dXMpCiB7CkBAIC03OTIsNyArNzkyLDcgQEAKIAl9IGVsc2UgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqdXNrYiA9IE5VTEw7CiAJCXU4ICpwZGF0YTsKLQkJCisKIAkJdXNrYiA9IGRldl9hbGxvY19za2Ioc2tiLT5sZW4gKyAxMjgpOwogCQlpZiAobGlrZWx5KHVza2IpKSB7CiAJCQltZW1jcHkoSUVFRTgwMjExX1NLQl9SWENCKHVza2IpLCAmcnhfc3RhdHVzLApAQCAtODA0LDcgKzgwNCw3IEBACiAJCQlpZWVlODAyMTFfcnhfaXJxc2FmZShodywgdXNrYik7CiAJCX0gZWxzZSB7CiAJCQlpZWVlODAyMTFfcnhfaXJxc2FmZShodywgc2tiKTsKLQkJfQkKKwkJfQogCX0KIH0KIApAQCAtODE0LDExICs4MTQsMTEgQEAKIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CiAJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKIAotCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tNQUNfSFNJU1JdLCAKLQkJICAgICAgIHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW01BQ19IU0lTUl0pIHwgCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW01BQ19IU0lTUl0sCisJCSAgICAgICBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tNQUNfSFNJU1JdKSB8CiAJCSAgICAgICBydGxwY2ktPnN5c19pcnFfbWFzayk7CiAKLQkKKwogfQogc3RhdGljIHZvaWQgX3J0bF9wY2lfcnhfaW50ZXJydXB0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewpAQCAtODM5LDcgKzgzOSw3IEBACiAJCS5ub2lzZSA9IC05OCwKIAkJLnJhdGUgPSAwLAogCX07Ci0JCisKIAkvKlJYIE5PUk1BTCBQS1QgKi8KIAl3aGlsZSAoY291bnQtLSkgewogCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwpAQCAtODUyLDY1ICs4NTIsNjUgQEAKIAkJLypyeCBwa3QgKi8KIAkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5yeF9idWZbCiAJCQkJCXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHhdOwotCQkKKwogCQlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykgewotCQkJcnhfcmVtYWluZWRfY250ID0gCisJCQlyeF9yZW1haW5lZF9jbnQgPQogCQkJCXJ0bHByaXYtPmNmZy0+b3BzLT5yeF9kZXNjX2J1ZmZfcmVtYWluZWRfY250KGh3LAogCQkJCQkJCQkgICAgICBod19xdWV1ZSk7Ci0JCQlpZiAocnhfcmVtYWluZWRfY250IDwgMSkgCisJCQlpZiAocnhfcmVtYWluZWRfY250IDwgMSkKIAkJCQlyZXR1cm47Ci0JCQkKKwogCQl9IGVsc2UgewkvKiByeCBkZXNjcmlwdG9yICovCiAJCQlwZGVzYyA9ICZydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uZGVzY1sKIAkJCQlydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4XTsKLQkJCQorCiAJCQlvd24gPSAodTgpIHJ0bHByaXYtPmNmZy0+b3BzLT5nZXRfZGVzYygodTggKikgcGRlc2MsCi0JCQkJCQkJICAgICAgIGZhbHNlLCAKKwkJCQkJCQkgICAgICAgZmFsc2UsCiAJCQkJCQkJICAgICAgIEhXX0RFU0NfT1dOKTsKIAkJCWlmIChvd24pIC8qIHdhaXQgZGF0YSB0byBiZSBmaWxsZWQgYnkgaGFyZHdhcmUgKi8KIAkJCQlyZXR1cm47CiAJCX0KLQkJCisKIAkJLyogR2V0IGhlcmUgbWVhbnM6IGRhdGEgaXMgZmlsbGVkIGFscmVhZHkqLwogCQkvKiBBQUFBQUF0dGVudGlvbiAhISEKIAkJICogV2UgY2FuIE5PVCBhY2Nlc3MgJ3NrYicgYmVmb3JlICdwY2lfdW5tYXBfc2luZ2xlJyAqLwogCQlwY2lfdW5tYXBfc2luZ2xlKHJ0bHBjaS0+cGRldiwgKigoZG1hX2FkZHJfdCAqKSBza2ItPmNiKSwKIAkJCSAJIHJ0bHBjaS0+cnhidWZmZXJzaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkKKwogCQlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykgewogCQkJYnVmZmVyX2Rlc2MgPSAmcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmJ1ZmZlcl9kZXNjWwogCQkJCXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHhdOwogCQkJLyptZWFucyByeCB3aWZpIGluZm8qLwogCQkJcGRlc2MgPSAoc3RydWN0IHJ0bF9yeF9kZXNjICopc2tiLT5kYXRhOwogCQl9Ci0JCQorCiAJCXJ0bHByaXYtPmNmZy0+b3BzLT5xdWVyeV9yeF9kZXNjKGh3LCAmc3RhdHVzLAogCQkJCQkJICZyeF9zdGF0dXMsICh1OCAqKSBwZGVzYywgc2tiKTsKLQkJCQorCiAJCWlmIChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93KQotCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnJ4X2NoZWNrX2RtYV9vayhodywgCi0JCQkJCQkJICAgKHU4ICopYnVmZmVyX2Rlc2MsIAorCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnJ4X2NoZWNrX2RtYV9vayhodywKKwkJCQkJCQkgICAodTggKilidWZmZXJfZGVzYywKIAkJCQkJCQkgICBod19xdWV1ZSk7CiAKLQkJCQotCQlsZW4gPSBydGxwcml2LT5jZmctPm9wcy0+Z2V0X2Rlc2MoKHU4ICopcGRlc2MsIGZhbHNlLCAKKworCQlsZW4gPSBydGxwcml2LT5jZmctPm9wcy0+Z2V0X2Rlc2MoKHU4ICopcGRlc2MsIGZhbHNlLAogCQkJCQkJICBIV19ERVNDX1JYUEtUX0xFTik7Ci0JCQkKKwogCQlpZiAoc2tiLT5lbmQgLSBza2ItPnRhaWwgPiBsZW4pIHsKIAkJCXNrYl9wdXQoc2tiLCBsZW4pOwotCQkJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpCQotCQkJCXNrYl9yZXNlcnZlKHNrYiwgc3RhdHVzLnJ4X2RydmluZm9fc2l6ZSArIAorCQkJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpCisJCQkJc2tiX3Jlc2VydmUoc2tiLCBzdGF0dXMucnhfZHJ2aW5mb19zaXplICsKIAkJCQkJCSBzdGF0dXMucnhfYnVmc2hpZnQgKyAyNCk7CiAJCQllbHNlCi0JCQkJc2tiX3Jlc2VydmUoc2tiLCBzdGF0dXMucnhfZHJ2aW5mb19zaXplICsgCisJCQkJc2tiX3Jlc2VydmUoc2tiLCBzdGF0dXMucnhfZHJ2aW5mb19zaXplICsKIAkJCQkJCSBzdGF0dXMucnhfYnVmc2hpZnQpOwogCiAJCX0gZWxzZSB7Ci0JCQlwcmludGsoInNrYi0+ZW5kIC0gc2tiLT50YWlsID0gJWQsIGxlbiBpcyAlZFxuIiwgCisJCQlwcmludGsoInNrYi0+ZW5kIC0gc2tiLT50YWlsID0gJWQsIGxlbiBpcyAlZFxuIiwKIAkJCSAgICAgICBza2ItPmVuZCAtIHNrYi0+dGFpbCwgbGVuKTsKIAkJCWJyZWFrOwogCQl9Ci0JCQkKKwogCQlydGxwcml2LT5jZmctPm9wcy0+cnhfY29tbWFuZF9wYWNrZXRfaGFuZGxlcihodywgc3RhdHVzLCBza2IpOwogCiAJCS8qCkBAIC05MjIsOSArOTIyLDkgQEAKIAogCQloZHIgPSBydGxfZ2V0X2hkcihza2IpOwogCQlmYyA9IHJ0bF9nZXRfZmMoc2tiKTsKLQkJCisKIAkJaWYgKCFzdGF0dXMuYl9jcmMgJiYgIXN0YXR1cy5iX2h3ZXJyb3IpIHsKLQkJCW1lbWNweShJRUVFODAyMTFfU0tCX1JYQ0Ioc2tiKSwgJnJ4X3N0YXR1cywgCisJCQltZW1jcHkoSUVFRTgwMjExX1NLQl9SWENCKHNrYiksICZyeF9zdGF0dXMsCiAJCQkgICAgICAgc2l6ZW9mKHJ4X3N0YXR1cykpOwogCiAJCQlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpIHsKQEAgLTk0NywxMyArOTQ3LDEzIEBACiAKIAkJCS8qIHN0YXRpYyBiY24gZm9yIHJvYW1pbmcgKi8KIAkJCXJ0bF9iZWFjb25fc3RhdGlzdGljKGh3LCBza2IpOwotCQkJcnRsX3AycF9pbmZvKGh3LCAodm9pZCopc2tiLT5kYXRhLCBza2ItPmxlbik7CQorCQkJcnRsX3AycF9pbmZvKGh3LCAodm9pZCopc2tiLT5kYXRhLCBza2ItPmxlbik7CiAJCQkvKiBmb3Igc3cgbHBzICovCiAJCQlydGxfc3dscHNfYmVhY29uKGh3LCAodm9pZCopc2tiLT5kYXRhLCBza2ItPmxlbik7CiAJCQlydGxfcmVjb2duaXplX3BlZXIoaHcsICh2b2lkKilza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAkJCWlmICgocnRscHJpdi0+bWFjODAyMTEub3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKSAmJgogCQkJICAgIChydGxwcml2LT5ydGxoYWwuY3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzJfNEcpJiYKLQkJCSAgICAoaWVlZTgwMjExX2lzX2JlYWNvbihmYykgfHwgCisJCQkgICAgKGllZWU4MDIxMV9pc19iZWFjb24oZmMpIHx8CiAJCQkgICAgIGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGZjKSkpIHsKIAkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQkJfSBlbHNlIHsKQEAgLTk2NCwxMyArOTY0LDEzIEBACiAJCX0KIAkJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpIHsKIAkJCXJ0bHBjaS0+cnhfcmluZ1tod19xdWV1ZV0ubmV4dF9yeF9ycCArPSAxOwotCQkJcnRscGNpLT5yeF9yaW5nW2h3X3F1ZXVlXS5uZXh0X3J4X3JwICU9IAorCQkJcnRscGNpLT5yeF9yaW5nW2h3X3F1ZXVlXS5uZXh0X3J4X3JwICU9CiAJCQkJCQkJUlRMX1BDSV9NQVhfUlhfQ09VTlQ7CiAKIAogCQkJcnhfcmVtYWluZWRfY250LS07CiAJCQlpZiAoMS8qcnhfcmVtYWluZWRfY250ID09IDAqLykgewotCQkJCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIDB4M0I0LCAKKwkJCQlydGxfd3JpdGVfd29yZChydGxwcml2LCAweDNCNCwKIAkJCQkJcnRscGNpLT5yeF9yaW5nW2h3X3F1ZXVlXS5uZXh0X3J4X3JwKTsKIAkJCX0KIAkJfQpAQCAtOTgxLDIyICs5ODEsMjIgQEAKIAkJfQogCiAJCWlmIChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93KSB7Ci0JCQlfcnRsX3BjaV9pbml0X29uZV9yeGRlc2MoaHcsICh1OCAqKWJ1ZmZlcl9kZXNjLCAKKwkJCV9ydGxfcGNpX2luaXRfb25lX3J4ZGVzYyhodywgKHU4ICopYnVmZmVyX2Rlc2MsCiAJCQkJCQkgcnhyaW5nX2lkeCwKLQkJCQkJICAgICAgIHJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHgpOwkJCQorCQkJCQkgICAgICAgcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeCk7CiAJCX0gZWxzZSB7CiAJCQlfcnRsX3BjaV9pbml0X29uZV9yeGRlc2MoaHcsICh1OCAqKXBkZXNjLCByeHJpbmdfaWR4LAotCQkJCQkgICAgICAgcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeCk7CQkJCisJCQkJCSAgICAgICBydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4KTsKIAotCQkJaWYgKHJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHggPT0gCisJCQlpZiAocnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeCA9PQogCQkJICAgIHJ0bHBjaS0+cnhyaW5nY291bnQgLSAxKQotCQkJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfZGVzYyhodywgKHU4ICopIHBkZXNjLCAKLQkJCQkJCQkgICAgZmFsc2UsIAorCQkJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfZGVzYyhodywgKHU4ICopIHBkZXNjLAorCQkJCQkJCSAgICBmYWxzZSwKIAkJCQkJCQkgICAgSFdfREVTQ19SWEVSTywKIAkJCQkJCQkgICAgKHU4ICopICYgdG1wX29uZSk7CiAJCX0KLQkJcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeCA9IAotCQkJCShydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4ICsgMSkgJSAKKwkJcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeCA9CisJCQkJKHJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHggKyAxKSAlCiAJCQkJcnRscGNpLT5yeHJpbmdjb3VudDsKIAl9CiB9CkBAIC0xMDExLDcgKzEwMTEsNyBAQAogCXUzMiBpbnRhID0gMDsKIAl1MzIgaW50YiA9IDA7CiAKLQkKKwogCiAJaWYgKHJ0bHBjaS0+aXJxX2VuYWJsZWQgPT0gMCkKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMTAyMCw3ICsxMDIwLDcgQEAKIAogCiAJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tNQUNfSElNUl0sIDB4MCk7Ci0JCisKIAogCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbTUFDX0hJTVJFXSwgMHgwKTsKIApAQCAtMTAyOSw3ICsxMDI5LDcgQEAKIAlydGxwcml2LT5jZmctPm9wcy0+aW50ZXJydXB0X3JlY29nbml6ZWQoaHcsICZpbnRhLCAmaW50Yik7CiAKIAotCS8qU2hhcmVkIElSUSBvciBIVyBkaXNhcHBhcmVkICovCisJLypTaGFyZWQgSVJRIG9yIEhXIGRpc2FwcGVhcmVkICovCiAJaWYgKCFpbnRhIHx8IGludGEgPT0gMHhmZmZmKQogCQlnb3RvIGRvbmU7CiAJLyo8MT4gYmVhY29uIHJlbGF0ZWQgKi8KQEAgLTExMjcsNyArMTEyNyw3IEBACiAJLyo8ND4gZncgcmVsYXRlZCovCiAJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg3MjNBRSkgewogCQlpZiAoaW50YSAmIHJ0bHByaXYtPmNmZy0+bWFwc1tSVExfSU1SX0MySENNRF0pIHsKLQkJCVJUX1RSQUNFKENPTVBfSU5UUiwgREJHX1RSQUNFLCAKKwkJCVJUX1RSQUNFKENPTVBfSU5UUiwgREJHX1RSQUNFLAogCQkJCSAoImZpcm13YXJlIGludGVycnVwdCFcbiIpKTsKIAkJCXF1ZXVlX2RlbGF5ZWRfd29yayhydGxwcml2LT53b3Jrcy5ydGxfd3EsCiAJCQkJCSAgICZydGxwcml2LT53b3Jrcy5md2V2dF93cSwgMCk7CkBAIC0xMTQyLDEyICsxMTQyLDEyIEBACiAJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDgxODhFRSB8fAogCSAgICBydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4NzIzQkUpIHsKIAkJaWYgKHVubGlrZWx5KGludGEgJiBydGxwcml2LT5jZmctPm1hcHNbUlRMX0lNUl9IU0lTUl9JTkRdKSkgewotCQkJUlRfVFJBQ0UoQ09NUF9JTlRSLCBEQkdfVFJBQ0UsIAorCQkJUlRfVFJBQ0UoQ09NUF9JTlRSLCBEQkdfVFJBQ0UsCiAJCQkJCSAoImhzaXNyIGludGVycnVwdCFcbiIpKTsKIAkJCV9ydGxfcGNpX2hzX2ludGVycnVwdChodyk7CiAJCX0KIAl9Ci0JCisKIAogCWlmKHJ0bHByaXYtPnJ0bGhhbC5iX2Vhcmx5bW9kZV9lbmFibGUpCiAJCXRhc2tsZXRfc2NoZWR1bGUoJnJ0bHByaXYtPndvcmtzLmlycV90YXNrbGV0KTsKQEAgLTExNTcsNyArMTE1Nyw3IEBACiAJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tNQUNfSElNUkVdLAogCQkJcnRscGNpLT5pcnFfbWFza1sxXSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MuaXJxX3RoX2xvY2ssIGZsYWdzKTsKLQkKKwogCXJldHVybiBJUlFfSEFORExFRDsKIAogZG9uZToKQEAgLTEyMDAsMTYgKzEyMDAsMTYgQEAKIAlwZGVzYyA9ICZyaW5nLT5kZXNjWzBdOwogCWlmIChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93KQogCQlwYnVmZmVyX2Rlc2MgPSAmcmluZy0+YnVmZmVyX2Rlc2NbMF07Ci0JCisKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KICNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMyw3LDApKQotCXJ0bHByaXYtPmNmZy0+b3BzLT5maWxsX3R4X2Rlc2MoaHcsIGhkciwgKHU4ICopIHBkZXNjLCAKLQkJCQkgICAgICAgICh1OCAqKXBidWZmZXJfZGVzYywgaW5mbywgcHNrYiwgCisJcnRscHJpdi0+Y2ZnLT5vcHMtPmZpbGxfdHhfZGVzYyhodywgaGRyLCAodTggKikgcGRlc2MsCisJCQkJICAgICAgICAodTggKilwYnVmZmVyX2Rlc2MsIGluZm8sIHBza2IsCiAJCQkJICAgICAgICBCRUFDT05fUVVFVUUsICZ0Y2JfZGVzYyk7CiAjZWxzZQogLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KIAlydGxwcml2LT5jZmctPm9wcy0+ZmlsbF90eF9kZXNjKGh3LCBoZHIsICh1OCAqKSBwZGVzYywKLQkJCQkJKHU4ICopcGJ1ZmZlcl9kZXNjLCBpbmZvLCBOVUxMLCBwc2tiLCAKKwkJCQkJKHU4ICopcGJ1ZmZlcl9kZXNjLCBpbmZvLCBOVUxMLCBwc2tiLAogCQkJCQlCRUFDT05fUVVFVUUsICZ0Y2JfZGVzYyk7CiAvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCiAjZW5kaWYKQEAgLTEyMzUsNyArMTIzNSw3IEBACiAJCWRlc2NfbnVtID0gVFhfREVTQ19OVU1fOTJFOwogCWVsc2UKIAkJZGVzY19udW0gPSBSVF9UWERFU0NfTlVNOwotCQorCiAJZm9yIChpID0gMDsgaSA8IFJUTF9QQ0lfTUFYX1RYX1FVRVVFX0NPVU5UOyBpKyspIHsKIAkJcnRscGNpLT50eHJpbmdjb3VudFtpXSA9IGRlc2NfbnVtOwogCX0KQEAgLTEzMDksMTIgKzEzMDksMTIgQEAKIAkvKiBhbGxvYyB0eCBidWZmZXIgZGVzYyBmb3IgbmV3IHRyeCBmbG93Ki8KIAlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykgewogCQlidWZmZXJfZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHJ0bHBjaS0+cGRldiwKLQkJCQkJICAgIHNpemVvZigqYnVmZmVyX2Rlc2MpICogZW50cmllcywgCisJCQkJCSAgICBzaXplb2YoKmJ1ZmZlcl9kZXNjKSAqIGVudHJpZXMsCiAJCQkJCSAgICAmYnVmZmVyX2Rlc2NfZG1hKTsKIAogCQlpZiAoIWJ1ZmZlcl9kZXNjIHx8ICh1bnNpZ25lZCBsb25nKWJ1ZmZlcl9kZXNjICYgMHhGRikgewogCQkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkgKCJDYW5ub3QgYWxsb2NhdGUgVFggcmluZyAocHJpbyA9ICVkKVxuIiwgCisJCQkJICgiQ2Fubm90IGFsbG9jYXRlIFRYIHJpbmcgKHByaW8gPSAlZClcbiIsCiAJCQkJIHByaW8pKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CkBAIC0xMzIyLDEzICsxMzIyLDEzIEBACiAJCW1lbXNldChidWZmZXJfZGVzYywgMCwgc2l6ZW9mKCpidWZmZXJfZGVzYykgKiBlbnRyaWVzKTsKIAkJcnRscGNpLT50eF9yaW5nW3ByaW9dLmJ1ZmZlcl9kZXNjID0gYnVmZmVyX2Rlc2M7CiAJCXJ0bHBjaS0+dHhfcmluZ1twcmlvXS5idWZmZXJfZGVzY19kbWEgPSBidWZmZXJfZGVzY19kbWE7Ci0JCQorCiAJCXJ0bHBjaS0+dHhfcmluZ1twcmlvXS5jdXJfdHhfcnAgPSAwOwogCQlydGxwY2ktPnR4X3JpbmdbcHJpb10uY3VyX3R4X3dwID0gMDsKIAkJcnRscGNpLT50eF9yaW5nW3ByaW9dLmF2bF9kZXNjID0gZW50cmllczsKIAogCX0KLQkKKwogCS8qIGFsbG9jIGRtYSBmb3IgdGhpcyByaW5nICovCiAJZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHJ0bHBjaS0+cGRldiwKIAkJCQkgICAgc2l6ZW9mKCpkZXNjKSAqIGVudHJpZXMsICZkZXNjX2RtYSk7CkBAIC0xMzQyLDcgKzEzNDIsNyBAQAogCW1lbXNldChkZXNjLCAwLCBzaXplb2YoKmRlc2MpICogZW50cmllcyk7CiAJcnRscGNpLT50eF9yaW5nW3ByaW9dLmRlc2MgPSBkZXNjOwogCXJ0bHBjaS0+dHhfcmluZ1twcmlvXS5kbWEgPSBkZXNjX2RtYTsKLQkKKwogCXJ0bHBjaS0+dHhfcmluZ1twcmlvXS5pZHggPSAwOwogCXJ0bHBjaS0+dHhfcmluZ1twcmlvXS5lbnRyaWVzID0gZW50cmllczsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZydGxwY2ktPnR4X3JpbmdbcHJpb10ucXVldWUpOwpAQCAtMTM1Nyw3ICsxMzU3LDcgQEAKIAkJCQkJCSAgICAgIHNpemVvZigqZGVzYykpOwogCiAJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoaHcsICh1OCAqKSAmIChkZXNjW2ldKSwKLQkJCQkJCSAgICB0cnVlLCAKKwkJCQkJCSAgICB0cnVlLAogCQkJCQkJICAgIEhXX0RFU0NfVFhfTkVYVERFU0NfQUREUiwKIAkJCQkJCSAgICAodTggKikgJiBuZXh0ZGVzY2FkZHJlc3MpOwogCQl9CkBAIC0xMzcxLDE1ICsxMzcxLDE1IEBACiAJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOwogCiAJaW50IGk7Ci0JCisKIAlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykgewogCQlzdHJ1Y3QgcnRsX3J4X2J1ZmZlcl9kZXNjICplbnRyeSA9IE5VTEw7CiAJCS8qIGFsbG9jIGRtYSBmb3IgdGhpcyByaW5nICovCi0JCXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5idWZmZXJfZGVzYyA9IAorCQlydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uYnVmZmVyX2Rlc2MgPQogCQkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocnRscGNpLT5wZGV2LAogCQkJCQkgc2l6ZW9mKCpydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uCi0JCQkJCSAgICAgICAgYnVmZmVyX2Rlc2MpICogCi0JCQkJCSAgICAgICAgcnRscGNpLT5yeHJpbmdjb3VudCwgCisJCQkJCSAgICAgICAgYnVmZmVyX2Rlc2MpICoKKwkJCQkJICAgICAgICBydGxwY2ktPnJ4cmluZ2NvdW50LAogCQkJCQkgJnJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kbWEpOwogCQlpZiAoIXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5idWZmZXJfZGVzYyB8fAogCQkgICAgKHVuc2lnbmVkIGxvbmcpcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmJ1ZmZlcl9kZXNjICYgMHhGRikgewpAQCAtMTM5Myw5ICsxMzkzLDkgQEAKIAogCQkvKiBpbml0IGV2ZXJ5IGRlc2MgaW4gdGhpcyByaW5nICovCiAJCXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHggPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgcnRscGNpLT5yeHJpbmdjb3VudDsgaSsrKSB7CQkJCisJCWZvciAoaSA9IDA7IGkgPCBydGxwY2ktPnJ4cmluZ2NvdW50OyBpKyspIHsKIAkJCWVudHJ5ID0gJnJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5idWZmZXJfZGVzY1tpXTsKLQkJCWlmICghX3J0bF9wY2lfaW5pdF9vbmVfcnhkZXNjKGh3LCAodTggKillbnRyeSwgCisJCQlpZiAoIV9ydGxfcGNpX2luaXRfb25lX3J4ZGVzYyhodywgKHU4ICopZW50cnksCiAJCQkJCQkgICAgICByeHJpbmdfaWR4LCBpKSkKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMTQwMywxNCArMTQwMywxNCBAQAogCQlzdHJ1Y3QgcnRsX3J4X2Rlc2MgKmVudHJ5ID0gTlVMTDsKIAkJdTggdG1wX29uZSA9IDE7CiAJCS8qIGFsbG9jIGRtYSBmb3IgdGhpcyByaW5nICovCi0JCXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kZXNjID0gCisJCXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kZXNjID0KIAkJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KHJ0bHBjaS0+cGRldiwKIAkJCQkJIHNpemVvZigqcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLgotCQkJCQkgICAgICAgIGRlc2MpICogcnRscGNpLT5yeHJpbmdjb3VudCwgCisJCQkJCSAgICAgICAgZGVzYykgKiBydGxwY2ktPnJ4cmluZ2NvdW50LAogCQkJCQkgJnJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kbWEpOwogCQlpZiAoIXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kZXNjIHx8CiAJCSAgICAodW5zaWduZWQgbG9uZylydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uZGVzYyAmIDB4RkYpIHsKLQkJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsIAorCQkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywKIAkJCQkgKCJDYW5ub3QgYWxsb2NhdGUgUlggcmluZ1xuIikpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTE0MjEsOSArMTQyMSw5IEBACiAKIAkJLyogaW5pdCBldmVyeSBkZXNjIGluIHRoaXMgcmluZyAqLwogCQlydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4ID0gMDsKLQkJZm9yIChpID0gMDsgaSA8IHJ0bHBjaS0+cnhyaW5nY291bnQ7IGkrKykgewkJCQorCQlmb3IgKGkgPSAwOyBpIDwgcnRscGNpLT5yeHJpbmdjb3VudDsgaSsrKSB7CiAJCQllbnRyeSA9ICZydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uZGVzY1tpXTsKLQkJCWlmICghX3J0bF9wY2lfaW5pdF9vbmVfcnhkZXNjKGh3LCAodTggKillbnRyeSwgCisJCQlpZiAoIV9ydGxfcGNpX2luaXRfb25lX3J4ZGVzYyhodywgKHU4ICopZW50cnksCiAJCQkJCQkgICAgICByeHJpbmdfaWR4LCBpKSkKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMTQ2Nyw3ICsxNDY3LDcgQEAKIAkJCQkgICAgc2l6ZW9mKCpyaW5nLT5idWZmZXJfZGVzYykgKiByaW5nLT5lbnRyaWVzLAogCQkJCSAgICByaW5nLT5idWZmZXJfZGVzYywgcmluZy0+YnVmZmVyX2Rlc2NfZG1hKTsKIAkJcmluZy0+YnVmZmVyX2Rlc2MgPSBOVUxMOwotCX0JCisJfQogfQogCiBzdGF0aWMgdm9pZCBfcnRsX3BjaV9mcmVlX3J4X3Jpbmcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGludCByeHJpbmdfaWR4KQpAQCAtMTUzMiw3ICsxNTMyLDcgQEAKIAkJX3J0bF9wY2lfZnJlZV9yeF9yaW5nKGh3LCByeHJpbmdfaWR4KTsKIAogCWZvciAoaSA9IDA7IGkgPCBSVExfUENJX01BWF9UWF9RVUVVRV9DT1VOVDsgaSsrKQotCQlpZiAocnRscGNpLT50eF9yaW5nW2ldLmRlc2MgfHwgCisJCWlmIChydGxwY2ktPnR4X3JpbmdbaV0uZGVzYyB8fAogCQkgICAgcnRscGNpLT50eF9yaW5nW2ldLmJ1ZmZlcl9kZXNjKQogCQkJX3J0bF9wY2lfZnJlZV90eF9yaW5nKGh3LCBpKTsKIApAQCAtMTU2NywxNiArMTU2NywxNiBAQAogCQkvKiBmb3JjZSB0aGUgcnhfcmluZ1tSWF9NUERVX1FVRVVFLwogCQkgKiBSWF9DTURfUVVFVUVdLmlkeCB0byB0aGUgZmlyc3Qgb25lICovCiAJCS8qbmV3IHRyeCBmbG93LCBkbyBub3RoaW5nKi8KLQkJaWYgKChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93ID09IGZhbHNlKSAmJiAKKwkJaWYgKChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93ID09IGZhbHNlKSAmJgogCQkgICAgIHJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kZXNjKSB7CiAJCQlzdHJ1Y3QgcnRsX3J4X2Rlc2MgKmVudHJ5ID0gTlVMTDsKIAogCQkJZm9yIChpID0gMDsgaSA8IHJ0bHBjaS0+cnhyaW5nY291bnQ7IGkrKykgewotCQkJCWVudHJ5ID0gJnJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kZXNjW2ldOwkJCQotCQkJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfZGVzYyhodywgKHU4ICopIGVudHJ5LCAKKwkJCQllbnRyeSA9ICZydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uZGVzY1tpXTsKKwkJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoaHcsICh1OCAqKSBlbnRyeSwKIAkJCQkJCQkgICAgZmFsc2UsCi0JCQkJCQkJICAgIEhXX0RFU0NfUlhPV04sIAotCQkJCQkJCSAgICAodTggKikgJiB0bXBfb25lKTsJCQorCQkJCQkJCSAgICBIV19ERVNDX1JYT1dOLAorCQkJCQkJCSAgICAodTggKikgJiB0bXBfb25lKTsKIAkJCX0KIAkJfQogCQlydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4ID0gMDsJfQpAQCAtMTU4NSwxMyArMTU4NSwxMyBAQAogCSAqIGFuZCBmb3JjZSB0aGUgIHR4IGlkeCB0byB0aGUgZmlyc3Qgb25lICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0bHByaXYtPmxvY2tzLmlycV90aF9sb2NrLCBmbGFncyk7CiAJZm9yIChpID0gMDsgaSA8IFJUTF9QQ0lfTUFYX1RYX1FVRVVFX0NPVU5UOyBpKyspIHsKLQkJaWYgKHJ0bHBjaS0+dHhfcmluZ1tpXS5kZXNjIHx8IAorCQlpZiAocnRscGNpLT50eF9yaW5nW2ldLmRlc2MgfHwKIAkJCXJ0bHBjaS0+dHhfcmluZ1tpXS5idWZmZXJfZGVzYykgewogCQkJc3RydWN0IHJ0bDgxOTJfdHhfcmluZyAqcmluZyA9ICZydGxwY2ktPnR4X3JpbmdbaV07CiAKIAkJCXdoaWxlIChza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkpIHsKIAkJCQl1OCAqZW50cnk7Ci0JCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IAorCQkJCXN0cnVjdCBza19idWZmICpza2IgPQogCQkJCQlfX3NrYl9kZXF1ZXVlKCZyaW5nLT5xdWV1ZSk7CiAJCQkJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpCiAJCQkJCWVudHJ5ID0gKHU4ICopKCZyaW5nLT5idWZmZXJfZGVzYwpAQCAtMTYxOCw3ICsxNjE4LDcgQEAKIAogLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLwogI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLDcsMCkpCi1zdGF0aWMgYm9vbCBydGxfcGNpX3R4X2Noa193YWl0cV9pbnNlcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIAorc3RhdGljIGJvb2wgcnRsX3BjaV90eF9jaGtfd2FpdHFfaW5zZXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogI2Vsc2UKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCkBAIC0xNzQxLDEwICsxNzQxLDEwIEBACiAJfQogCiAJcGRlc2MgPSAmcmluZy0+ZGVzY1tpZHhdOwotCQorCiAJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpIHsKIAkJcHR4X2JkX2Rlc2MgPSAmcmluZy0+YnVmZmVyX2Rlc2NbaWR4XTsKLQl9IGVsc2UgewkKKwl9IGVsc2UgewogCQlvd24gPSAodTgpIHJ0bHByaXYtPmNmZy0+b3BzLT5nZXRfZGVzYygodTggKikgcGRlc2MsCiAJCQkJdHJ1ZSwgSFdfREVTQ19PV04pOwogCkBAIC0xNzU1LDE3ICsxNzU1LDE3IEBACiAJCQkJICBod19xdWV1ZSwgcmluZy0+aWR4LCBpZHgsCiAJCQkJICBza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkpKTsKIAotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MuaXJxX3RoX2xvY2ssIAorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MuaXJxX3RoX2xvY2ssCiAJCQkJCSAgICAgICBmbGFncyk7CiAJCQlyZXR1cm4gc2tiLT5sZW47CiAJCX0KIAl9Ci0JCisKIAlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkgewogCQl0aWQgPSBydGxfZ2V0X3RpZChza2IpOwogCQlpZiAoc3RhKSB7CiAJCQlzdGFfZW50cnkgPSAoc3RydWN0IHJ0bF9zdGFfaW5mbyAqKXN0YS0+ZHJ2X3ByaXY7Ci0JCQlzZXFfbnVtYmVyID0gKGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpICYgCisJCQlzZXFfbnVtYmVyID0gKGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpICYKIAkJCQkgICAgICBJRUVFODAyMTFfU0NUTF9TRVEpID4+IDQ7CiAJCQlzZXFfbnVtYmVyICs9IDE7CiAKQEAgLTE3NzksMTMgKzE3NzksMTMgQEAKIAogLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLwogI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLDcsMCkpCi0JcnRscHJpdi0+Y2ZnLT5vcHMtPmZpbGxfdHhfZGVzYyhodywgaGRyLCAodTggKikgcGRlc2MsIAotCQkJCQkodTggKilwdHhfYmRfZGVzYywgaW5mbywgc2tiLCAKKwlydGxwcml2LT5jZmctPm9wcy0+ZmlsbF90eF9kZXNjKGh3LCBoZHIsICh1OCAqKSBwZGVzYywKKwkJCQkJKHU4ICopcHR4X2JkX2Rlc2MsIGluZm8sIHNrYiwKIAkJCQkJaHdfcXVldWUsIHB0Y2JfZGVzYyk7CiAjZWxzZQogLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KLQlydGxwcml2LT5jZmctPm9wcy0+ZmlsbF90eF9kZXNjKGh3LCBoZHIsICh1OCAqKSBwZGVzYywgCi0JCQkJCSh1OCAqKXB0eF9iZF9kZXNjLCBpbmZvLCBzdGEsIHNrYiwgCisJcnRscHJpdi0+Y2ZnLT5vcHMtPmZpbGxfdHhfZGVzYyhodywgaGRyLCAodTggKikgcGRlc2MsCisJCQkJCSh1OCAqKXB0eF9iZF9kZXNjLCBpbmZvLCBzdGEsIHNrYiwKIAkJCQkJaHdfcXVldWUsIHB0Y2JfZGVzYyk7CiAvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCiAjZW5kaWYKQEAgLTE4MzIsMTAgKzE4MzIsMTAgQEAKIAl1MTYgaSA9IDA7CiAJaW50IHF1ZXVlX2lkOwogCXN0cnVjdCBydGw4MTkyX3R4X3JpbmcgKnJpbmc7Ci0JCisKIAlpZiAobWFjLT5za2lwX3NjYW4pCiAJCXJldHVybjsKLQkKKwogCWZvciAocXVldWVfaWQgPSBSVExfUENJX01BWF9UWF9RVUVVRV9DT1VOVCAtIDE7IHF1ZXVlX2lkID49IDA7KSB7CiAJCXUzMiBxdWV1ZV9sZW47CiAjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDEwLDApKQpAQCAtMTkzNiw3ICsxOTM2LDcgQEAKIAl1OCBSRkluUHJvZ3Jlc3NUaW1lT3V0ID0gMDsKIAogCS8qCi0JICpzaG91bGQgYmVmb3JlIGRpc2FibGUgaW50ZXJycnVwdCZhZGFwdGVyCisJICpzaG91bGQgYmVmb3JlIGRpc2FibGUgaW50ZXJydXB0JmFkYXB0ZXIKIAkgKmFuZCB3aWxsIGRvIGl0IGltbWVkaWF0ZWx5LgogCSAqLwogCXNldF9oYWxfc3RvcChydGxoYWwpOwpAQCAtMjA4MSwxMyArMjA4MSwxMyBAQAogCQkJcnRsaGFsLT5pbnRlcmZhY2VpbmRleCA9IDA7CiAJCX0KIAl9Ci0JCisKIAkvKiA5MmVlIHVzZSBuZXcgdHJ4IGZsb3cgKi8KIAlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODE5MkVFKQogCQlydGxwcml2LT51c2VfbmV3X3RyeF9mbG93ID0gdHJ1ZTsKIAllbHNlCiAJCXJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cgPSBmYWxzZTsKLQkKKwogCS8qZmluZCBidXMgaW5mbyAqLwogCXBjaXByaXYtPm5kaXNfYWRhcHRlci5idXNudW1iZXIgPSBwZGV2LT5idXMtPm51bWJlcjsKIAlwY2lwcml2LT5uZGlzX2FkYXB0ZXIuZGV2bnVtYmVyID0gUENJX1NMT1QocGRldi0+ZGV2Zm4pOwpAQCAtMjA5NSw3ICsyMDk1LDcgQEAKIAogCS8qZmluZCBicmlkZ2UgaW5mbyAqLwogCXBjaXByaXYtPm5kaXNfYWRhcHRlci5wY2licmlkZ2VfdmVuZG9yID0gUENJX0JSSURHRV9WRU5ET1JfVU5LTk9XTjsKLQkvKiBzb21lIEFSTSBoYXZlIG5vIGJyaWRnZV9wZGV2IGFuZCB3aWxsIGNyYXNoIGhlcmUgCisJLyogc29tZSBBUk0gaGF2ZSBubyBicmlkZ2VfcGRldiBhbmQgd2lsbCBjcmFzaCBoZXJlCiAJICogc28gd2Ugc2hvdWxkIGNoZWNrIGlmIGJyaWRnZV9wZGV2IGlzIE5VTEwgKi8KIAlpZiAoYnJpZGdlX3BkZXYpIHsKIAkJcGNpcHJpdi0+bmRpc19hZGFwdGVyLnBjaWJyaWRnZV92ZW5kb3JpZCA9IGJyaWRnZV9wZGV2LT52ZW5kb3I7CkBAIC0yMTg3LDcgKzIxODcsNyBAQAogCX0KIAogCXJ0bHBjaS0+dXNpbmdfbXNpID0gdHJ1ZTsKLQkKKwogCVJUX1RSQUNFKENPTVBfSU5JVHxDT01QX0lOVFIsIERCR19ETUVTRywgKCJNU0kgSW50ZXJydXB0IE1vZGUhXG4iKSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMTk4LDcgKzIxOTgsNyBAQAogCXN0cnVjdCBydGxfcGNpX3ByaXYgKnBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CiAJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocGNpcHJpdik7CiAJaW50IHJldDsKLQkKKwogCXJldCA9IHJlcXVlc3RfaXJxKHJ0bHBjaS0+cGRldi0+aXJxLCAmX3J0bF9wY2lfaW50ZXJydXB0LAogCQkJICBJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGh3KTsKIAlpZiAocmV0IDwgMCkgewpAQCAtMjIwNiw3ICsyMjA2LDcgQEAKIAl9CiAKIAlydGxwY2ktPnVzaW5nX21zaSA9IGZhbHNlOwotCVJUX1RSQUNFKENPTVBfSU5JVHxDT01QX0lOVFIsIERCR19ETUVTRywgCisJUlRfVFJBQ0UoQ09NUF9JTklUfENPTVBfSU5UUiwgREJHX0RNRVNHLAogCQkgKCJQaW4tYmFzZWQgSW50ZXJydXB0IE1vZGUhXG4iKSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMjkzLDcgKzIyOTMsNyBAQAogCS8qCiAJICppbml0IGRiZ3AgZmxhZ3MgYmVmb3JlIGFsbAogCSAqb3RoZXIgZnVuY3Rpb25zLCBiZWNhdXNlIHdlIHdpbGwKLQkgKnVzZSBpdCBpbiBvdGhlciBmdW50aW9ucyBsaWtlCisJICp1c2UgaXQgaW4gb3RoZXIgZnVuY3Rpb25zIGxpa2UKIAkgKlJUX1RSQUNFL1JUX1BSSU5UL1JUTF9QUklOVF9EQVRBCiAJICp5b3UgY2FuIG5vdCB1c2UgdGhlc2UgbWFjcm8KIAkgKmJlZm9yZSB0aGlzCkBAIC0yMzc3LDcgKzIzNzcsNyBAQAogCX0gZWxzZSB7CiAJCXJ0bHByaXYtPm1hYzgwMjExLm1hYzgwMjExX3JlZ2lzdGVyZWQgPSAxOwogCX0KLQkvKiB0aGUgd2lwaHkgbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZWQgdG8gCisJLyogdGhlIHdpcGh5IG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVkIHRvCiAJICogY2ZnODAyMTEgcHJpb3IgdG8gcmVndWxhdG9yeV9oaW50ICovCiAJaWYgKHJlZ3VsYXRvcnlfaGludChody0+d2lwaHksIHJ0bHByaXYtPnJlZ2QuYWxwaGEyKSkgewogCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX1dBUk5JTkcsICgicmVndWxhdG9yeV9oaW50IGZhaWxcbiIpKTsKQEAgLTI0MjgsMTMgKzI0MjgsMTMgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIAogfQotLy9FWFBPUlRfU1lNQk9MKHJ0bF9wY2lfcHJvYmUpOworLyogRVhQT1JUX1NZTUJPTChydGxfcGNpX3Byb2JlKTsgKi8KIAogc3RydWN0IGllZWU4MDIxMV9odyAqcnRsX3BjaV9nZXRfaHdfcG9pbnRlcih2b2lkKQogewogCXJldHVybiBod19leHBvcnQ7CiB9Ci0vL0VYUE9SVF9TWU1CT0wocnRsX3BjaV9nZXRfaHdfcG9pbnRlcik7CisvKiBFWFBPUlRfU1lNQk9MKHJ0bF9wY2lfZ2V0X2h3X3BvaW50ZXIpOyAqLwogCiB2b2lkIHJ0bF9wY2lfZGlzY29ubmVjdChzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKQEAgLTI0NTAsNyArMjQ1MCw3IEBACiAKIAkvKiBhZGQgZm9yIHByb3YgKi8KIAlydGxfcHJvY19yZW1vdmVfb25lKGh3KTsKLQkKKwogCiAJLyppZWVlODAyMTFfdW5yZWdpc3Rlcl9odyB3aWxsIGNhbGwgb3BzX3N0b3AgKi8KIAlpZiAocnRsbWFjLT5tYWM4MDIxMV9yZWdpc3RlcmVkID09IDEpIHsKQEAgLTI0OTEsNyArMjQ5MSw3IEBACiAKIAlpZWVlODAyMTFfZnJlZV9odyhodyk7CiB9Ci0vL0VYUE9SVF9TWU1CT0wocnRsX3BjaV9kaXNjb25uZWN0KTsKKy8qIEVYUE9SVF9TWU1CT0wocnRsX3BjaV9kaXNjb25uZWN0KTsgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoga2VybmVsIHBjaSBwb3dlciBzdGF0ZSBkZWZpbmU6CkBAIC0yNTE5LDcgKzI1MTksNyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0vL0VYUE9SVF9TWU1CT0wocnRsX3BjaV9zdXNwZW5kKTsKKy8qIEVYUE9SVF9TWU1CT0wocnRsX3BjaV9zdXNwZW5kKTsgKi8KIAogaW50IHJ0bF9wY2lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTI1MjksMTAgKzI1MjksMTAgQEAKIAogCXJ0bHByaXYtPmNmZy0+b3BzLT5od19yZXN1bWUoaHcpOwogCXJ0bF9pbml0X3Jma2lsbChodyk7Ci0JCisKIAlyZXR1cm4gMDsKIH0KLS8vRVhQT1JUX1NZTUJPTChydGxfcGNpX3Jlc3VtZSk7CisvKiBFWFBPUlRfU1lNQk9MKHJ0bF9wY2lfcmVzdW1lKTsgKi8KIAogc3RydWN0IHJ0bF9pbnRmX29wcyBydGxfcGNpX29wcyA9IHsKIAkucmVhZF9lZnVzZV9ieXRlID0gcmVhZF9lZnVzZV9ieXRlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9wY2kuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcGNpLmgKaW5kZXggOWYyMDY1NS4uMDZlYWE1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9wY2kuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3BjaS5oCkBAIC0xNDgsMTEgKzE0OCwxMSBAQAogICAqIFJYIHdpZmkgaW5mbyA9PSBSWCBkZXNjcmlwdG9yIGluIG9sZCBmbG93ICovCiBzdHJ1Y3QgcnRsX3R4X2J1ZmZlcl9kZXNjIHsKICNpZiAoUlRMODE5MkVFX1NFR19OVU0gPT0gMikKLQl1MzIgZHdvcmRbMiooRE1BX0lTXzY0QklUICsgMSkqOF07IC8vc2VnID0gOAorCXUzMiBkd29yZFsyKihETUFfSVNfNjRCSVQgKyAxKSo4XTsgLyogc2VnID0gOCAqLwogI2VsaWYgKFJUTDgxOTJFRV9TRUdfTlVNID09IDEpCi0JdTMyIGR3b3JkWzIqKERNQV9JU182NEJJVCArIDEpKjRdOyAvL3NlZyA9IDQKKwl1MzIgZHdvcmRbMiooRE1BX0lTXzY0QklUICsgMSkqNF07IC8qIHNlZyA9IDQgKi8KICNlbGlmIChSVEw4MTkyRUVfU0VHX05VTSA9PSAwKQotCXUzMiBkd29yZFsyKihETUFfSVNfNjRCSVQgKyAxKSoyXTsgLy9zZWcgPSAyCisJdTMyIGR3b3JkWzIqKERNQV9JU182NEJJVCArIDEpKjJdOyAvKiBzZWcgPSAyICovCiAjZW5kaWYKIH0gX19wYWNrZWQ7CiAKQEAgLTE4Nyw3ICsxODcsNyBAQAogfTsKIAogc3RydWN0IHJ0bDgxOTJfcnhfcmluZyB7Ci0Jc3RydWN0IHJ0bF9yeF9kZXNjICpkZXNjOy8qZm9yIG9sZCB0cnggZmxvdywgbm90IHVlc2QgaW4gbmV3IHRyeCovCisJc3RydWN0IHJ0bF9yeF9kZXNjICpkZXNjOy8qZm9yIG9sZCB0cnggZmxvdywgbm90IHVzZWQgaW4gbmV3IHRyeCovCiAJLypkbWEgbWF0Y2hlcyBlaXRoZXIgJ2Rlc2MnIG9yICdidWZmZXJfZGVzYycqLwogCWRtYV9hZGRyX3QgZG1hOwogCXVuc2lnbmVkIGludCBpZHg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3BzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3BzLmMKaW5kZXggZjEyZmZhOC4uNzg3NjQ0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9wcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcHMuYwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAJCSAqRG8gbm90IGVudGVyIElQUyBpbiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAJCSAqKDEpIFJGIGlzIGFscmVhZHkgT0ZGIG9yIFNsZWVwCiAJCSAqKDIpIGJfc3dyZl9wcm9jZXNzaW5nIChpbmRpY2F0ZXMgdGhlIElQUyBpcyBzdGlsbCB1bmRlciBnb2luZykKLQkJICooMykgQ29ubmVjdHRlZCAob25seSBkaXNjb25uZWN0ZWQgY2FuIHRyaWdnZXIgSVBTKQorCQkgKigzKSBDb25uZWN0ZWQgKG9ubHkgZGlzY29ubmVjdGVkIGNhbiB0cmlnZ2VyIElQUykKIAkJICooNCkgSUJTUyAoc2VuZCBCZWFjb24pCiAJCSAqKDUpIEFQIG1vZGUgKHNlbmQgQmVhY29uKQogCQkgKig2KSBtb25pdG9yIG1vZGUgKHJjdiBwYWNrZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3JlZ2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcmVnZC5jCmluZGV4IGQ4OWYxNWMuLjBhNGIzOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcmVnZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcmVnZC5jCkBAIC0yNDMsNyArMjQzLDcgQEAKIAl9CiAKIAkvKgotCSAqSWYgYSBjb3VudHJ5IElFIGhhcyBiZWVuIHJlY2lldmVkIGNoZWNrIGl0cyBydWxlIGZvciB0aGlzCisJICpJZiBhIGNvdW50cnkgSUUgaGFzIGJlZW4gcmVjZWl2ZWQgY2hlY2sgaXRzIHJ1bGUgZm9yIHRoaXMKIAkgKmNoYW5uZWwgZmlyc3QgYmVmb3JlIGVuYWJsaW5nIGFjdGl2ZSBzY2FuLiBUaGUgcGFzc2l2ZSBzY2FuCiAJICp3b3VsZCBoYXZlIGJlZW4gZW5mb3JjZWQgYnkgdGhlIGluaXRpYWwgcHJvY2Vzc2luZyBvZiBvdXIKIAkgKmN1c3RvbSByZWd1bGF0b3J5IGRvbWFpbi4KQEAgLTQ1NSw3ICs0NTUsNyBAQAogCiAJaWYgKHJ0bHByaXYtPnJlZ2QuY291bnRyeV9jb2RlID49IENPVU5UUllfQ09ERV9NQVgpIHsKIAkJUlRfVFJBQ0UoQ09NUF9SRUdELCBEQkdfRE1FU0csCi0JCQkgKEtFUk5fREVCVUcgInJ0bDogRUVQUk9NIGluZGljYXRlcyBpbnZhbGlkIGNvbnRyeSBjb2RlIgorCQkJIChLRVJOX0RFQlVHICJydGw6IEVFUFJPTSBpbmRpY2F0ZXMgaW52YWxpZCBjb3VudHJ5IGNvZGUiCiAJCQkgICJ3b3JsZCB3aWRlIDEzIHNob3VsZCBiZSB1c2VkXG4iKSk7CiAKIAkJcnRscHJpdi0+cmVnZC5jb3VudHJ5X2NvZGUgPSBDT1VOVFJZX0NPREVfV09STERfV0lERV8xMzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcmVnZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9yZWdkLmgKaW5kZXggYWJjNjBhYi4uZGNlYjNmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9yZWdkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9yZWdkLmgKQEAgLTMwLDggKzMwLDggQEAKICNpZm5kZWYgX19SVExfUkVHRF9IX18KICNkZWZpbmUgX19SVExfUkVHRF9IX18KIAotI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9OT19JQlNTCQkxPDwyCi0jZGVmaW5lIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTgkxPDwxCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX05PX0lCU1MJCSgxIDw8IDIpCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTgkoMSA8PCAxKQogI2RlZmluZSBXSVBIWV9GTEFHX0NVU1RPTV9SRUdVTEFUT1JZCUJJVCgwKQogI2RlZmluZSBXSVBIWV9GTEFHX1NUUklDVF9SRUdVTEFUT1JZCUJJVCgxKQogI2RlZmluZSBXSVBIWV9GTEFHX0RJU0FCTEVfQkVBQ09OX0hJTlRTCUJJVCgyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2RtLmMKaW5kZXggODYzNDIwNi4uZTBlZmNkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9kbS5jCkBAIC03MzEsNyArNzMxLDcgQEAKIAkJcnRsX2RtX2RpZy0+bWluX3VuZGVjb3JhdGVkX3B3ZGJfZm9yX2RtID0KIAkJICAgIHJ0bHByaXYtPmRtLmVudHJ5X21pbl91bmRlY29yYXRlZHNtb290aGVkX3B3ZGI7CiAJCVJUX1RSQUNFKENPTVBfQkJfUE9XRVJTQVZJTkcsIERCR19MT1VELAotCQkJICgiQVAgRXh0IFBvcnQgb3IgZGlzY29ubmV0IFBXREIgPSAweCV4IFxuIiwKKwkJCSAoIkFQIEV4dCBQb3J0IG9yIGRpc2Nvbm5lY3QgUFdEQiA9IDB4JXggXG4iLAogCQkJICBydGxfZG1fZGlnLT5taW5fdW5kZWNvcmF0ZWRfcHdkYl9mb3JfZG0pKTsKIAl9CiAJUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19MT1VELCAoIk1pblVuZGVjb3JhdGVkUFdEQkZvckRNID0lZFxuIiwKQEAgLTkyNSw3ICs5MjUsNyBAQAogCiAJaWYgKHJ0bHByaXYtPmZhbHNlYWxtX2NudC5jbnRfYWxsID4gMTAwMDApIHsKIAkJUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19MT1VELAotCQkJKCJydGw4ODIxYWVfZG1fZGlnKCk6IEFibm9ybmFsbHkgZmFsc2UgYWxhcm0gY2FzZS4gXG4iKSk7CisJCQkoInJ0bDg4MjFhZV9kbV9kaWcoKTogQWJub3JtYWxseSBmYWxzZSBhbGFybSBjYXNlLiBcbiIpKTsKIAogCQlpZiAoZG1fZGlndGFibGUubGFyZ2VfZmFfaGl0ICE9IDMpCiAJCSAgICAgICAgZG1fZGlndGFibGUubGFyZ2VfZmFfaGl0Kys7CkBAIC0xMDg3LDcgKzEwODcsNyBAQAogCWVsc2UKIAkJZmFsc2VhbG1fY250LT5jbnRfYWxsID0gZmFsc2VhbG1fY250LT5jbnRfb2ZkbV9mYWlsOwogCi0JLypyZXNldCBPRkRNIEZBIGNvdXRuZXIqLworCS8qcmVzZXQgT0ZETSBGQSBjb3VudGVyKi8KIAlydGxfc2V0X2JicmVnKGh3LCBPRE1fUkVHX09GRE1fRkFfUlNUXzExQUMsIEJJVCgxNyksIDEpOwogCXJ0bF9zZXRfYmJyZWcoaHcsIE9ETV9SRUdfT0ZETV9GQV9SU1RfMTFBQywgQklUKDE3KSwgMCk7CiAJLyogcmVzZXQgQ0NLIEZBIGNvdW50ZXIqLwpAQCAtMTMxNiw3ICsxMzE2LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEZ1bmN0aW9uOglvZG1fVHhQd3JUcmFja1NldFB3cjg4RSgpCiAgKgotICogT3ZlcnZpZXc6CTg4RSBjaGFuZ2UgYWxsIGNoYW5uZWwgdHggcG93ZXIgYWNjb3JkaWduIHRvIGZsYWcuCisgKiBPdmVydmlldzoJODhFIGNoYW5nZSBhbGwgY2hhbm5lbCB0eCBwb3dlciBhY2NvcmRpbmcgdG8gZmxhZy4KICAqCQkJCU9GRE0gJiBDQ0sgYXJlIGFsbCBkaWZmZXJlbnQuCiAgKgogICogSW5wdXQ6CQlOT05FCkBAIC0xNTM3LDcgKzE1MzcsNyBAQAogCQkJCQlydGxkbS0+bW9kaWZ5X3R4YWdjX2ZsYWdfcGF0aF9iID0gZmFsc2U7CiAKIAkJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCi0JCQkJCQkoIioqKioqKlBhdGhfQiBwRE1fT2RtLT5Nb2RpZnlfVHhBR0NfRmxhZyA9IEZBTFNFIFxuIikpOworCQkJCQkJKCIqKioqKipQYXRoX0IgZG1fT2RtLT5Nb2RpZnlfVHhBR0NfRmxhZyA9IEZBTFNFIFxuIikpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMTY1NCw3ICsxNjU0LDcgQEAKIAogCWlmIChkZWx0YSA+IDAgJiYgcnRsZG0tPnR4cG93ZXJfdHJhY2tfY29udHJvbCkKIAl7Ci0JCS8qImRlbHRhIiBoZXJlIGlzIHVzZWQgdG8gcmVjb3JkIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBkaWZmZXJyZW5jZS4qLworCQkvKiJkZWx0YSIgaGVyZSBpcyB1c2VkIHRvIHJlY29yZCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgZGlmZmVyZW5jZS4qLwogCSAgICAJZGVsdGEgPSB0aGVybWFsX3ZhbHVlID4gcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIgPyBcCiAJCSAgICAJKHRoZXJtYWxfdmFsdWUgLSBydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlcikgOiBcCiAJCSAgICAJKHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyIC0gdGhlcm1hbF92YWx1ZSk7CkBAIC0xOTc2LDcgKzE5NzYsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRnVuY3Rpb246CW9kbV9UeFB3clRyYWNrU2V0UHdyODhFKCkKICAqCi0gKiBPdmVydmlldzoJODhFIGNoYW5nZSBhbGwgY2hhbm5lbCB0eCBwb3dlciBhY2NvcmRpZ24gdG8gZmxhZy4KKyAqIE92ZXJ2aWV3Ogk4OEUgY2hhbmdlIGFsbCBjaGFubmVsIHR4IHBvd2VyIGFjY29yZGluZyB0byBmbGFnLgogICoJCQkJT0ZETSAmIENDSyBhcmUgYWxsIGRpZmZlcmVudC4KICAqCiAgKiBJbnB1dDoJCU5PTkUKQEAgLTIxNTksNyArMjE1OSw3IEBACiAJdTggKmRlbHRhX3N3aW5nX3RhYmxlX2lkeF90dXBfYjsKIAl1OCAqZGVsdGFfc3dpbmdfdGFibGVfaWR4X3Rkb3duX2I7CiAKLQkvKjIuIEluaXRpbGl6YXRpb24gKCA3IHN0ZXBzIGluIHRvdGFsICkqLworCS8qMi4gSW5pdGlhbGl6YXRpb24gKCA3IHN0ZXBzIGluIHRvdGFsICkqLwogCXJ0bDg4MjFhZV9nZXRfZGVsdGFfc3dpbmdfdGFibGUoaHcsICh1OCoqKSZkZWx0YV9zd2luZ190YWJsZV9pZHhfdHVwX2EsCiAJCQkJCQkJCQkodTgqKikmZGVsdGFfc3dpbmdfdGFibGVfaWR4X3Rkb3duX2EsCiAJCQkJCQkJCQkgICh1OCoqKSZkZWx0YV9zd2luZ190YWJsZV9pZHhfdHVwX2IsCkBAIC0yMjQ0LDcgKzIyNDQsNyBAQAogCiAJaWYgKGRlbHRhID4gMCAmJiBydGxkbS0+dHhwb3dlcl90cmFja19jb250cm9sKQogCXsKLQkJLyoiZGVsdGEiIGhlcmUgaXMgdXNlZCB0byByZWNvcmQgdGhlIGFic29sdXRlIHZhbHVlIG9mIGRpZmZlcnJlbmNlLiovCisJCS8qImRlbHRhIiBoZXJlIGlzIHVzZWQgdG8gcmVjb3JkIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBkaWZmZXJlbmNlLiovCiAJICAgIAlkZWx0YSA9IHRoZXJtYWxfdmFsdWUgPiBydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlciA/IFwKIAkJICAgIAkodGhlcm1hbF92YWx1ZSAtIHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyKSA6IFwKIAkJICAgIAkocnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIgLSB0aGVybWFsX3ZhbHVlKTsKQEAgLTI2MTMsMTEgKzI2MTMsMTEgQEAKIAlSVF9UUkFDRShDT01QX1RVUkJPLCBEQkdfTE9VRCwKIAkJKCJydGw4ODIxYWVfZG1fY2hlY2tfZWRjYV90dXJibz09PT09PiIpKTsKIAlSVF9UUkFDRShDT01QX1RVUkJPLCBEQkdfTE9VRCwKLQkJKCJPcmdpbmlhbCBCRSBQQVJBTTogMHgleFxuIiwKKwkJKCJPcmlnaW5hbCBCRSBQQVJBTTogMHgleFxuIiwKIAkJcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgRE1fUkVHX0VEQ0FfQkVfMTFOKSkpOwogCiAJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JbGlzdCBwYXJhbXRlciBmb3IgZGlmZmVyZW50IHBsYXRmb3JtCisJbGlzdCBwYXJhbWV0ZXIgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybQogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCWJfbGFzdF9pc19jdXJfcmRsX3N0YXRlID0gcnRscHJpdi0+ZG0uYmlzX2N1cl9yZGxzdGF0ZTsKIAlwYl9pc19jdXJfcmRsX3N0YXRlID0gJiggcnRscHJpdi0+ZG0uYmlzX2N1cl9yZGxzdGF0ZSk7CkBAIC0yOTYzLDcgKzI5NjMsNyBAQAogCQkJIkNyeXN0YWwgY2FwID0gMHgleCwgQ3J5c3RhbCBjYXAgb2Zmc2V0ID0gJWRcbiIsCiAJCQlydGxkbS0+Y3J5c3RhbF9jYXAsIGFkanVzdF94dGFsKSk7CiAKLQkJLyozLkFkanVkdCBDcnlzdGFsIENhcC4qLworCQkvKjMuQWRqdXN0IENyeXN0YWwgQ2FwLiovCiAJCWlmIChhZGp1c3RfeHRhbCAhPSAwKXsKIAkJCXJ0bGRtLT5pc19mcmVlemUgPSAwOwogCQkJcnRsZG0tPmNyeXN0YWxfY2FwICs9IGFkanVzdF94dGFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvZncuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2Z3LmMKaW5kZXggNDA4M2NhYi4uNDZlYjQxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvZncuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9mdy5jCkBAIC0xNjQsNyArMTY0LDcgQEAKIAogCWlmIChjb3VudGVyID49IEZXXzg4MjFBRV9QT0xMSU5HX1RJTUVPVVRfQ09VTlQpIHsKIAkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19MT1VELAotCQkJICgiY2hrc3VtIHJlcG9ydCBmYWlsbCAhIFJFR19NQ1VGV0RMOjB4JTA4eCAuXG4iLAorCQkJICgiY2hrc3VtIHJlcG9ydCBmYWlsICEgUkVHX01DVUZXREw6MHglMDh4IC5cbiIsCiAJCQkgIHZhbHVlMzIpKTsKIAkJZ290byBleGl0OwogCX0KQEAgLTM2OCw3ICszNjgsNyBAQAogCQkJCXdhaXRfaDJjX2xpbW1pdC0tOwogCQkJCWlmICh3YWl0X2gyY19saW1taXQgPT0gMCkgewogCQkJCQlSVF9UUkFDRShDT01QX0NNRCwgREJHX0xPVUQsCi0JCQkJCQkgKCJXYXRpbmcgdG9vIGxvbmcgZm9yIEZXIHJlYWQgIgorCQkJCQkJICgiV2FpdGluZyB0b28gbG9uZyBmb3IgRlcgcmVhZCAiCiAJCQkJCQkgICJjbGVhciBITUVCb3goJWQpIVxuIiwgYm94bnVtKSk7CiAJCQkJCWJyZWFrOwogCQkJCX0KQEAgLTM3OCw3ICszNzgsNyBAQAogCQkJCWlzZndfcmVhZCA9IF9ydGw4ODIxYWVfY2hlY2tfZndfcmVhZF9sYXN0X2gyYyhodywgYm94bnVtKTsKIAkJCQl1MWJfdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCAweDEzMCk7CiAJCQkJUlRfVFJBQ0UoQ09NUF9DTUQsIERCR19MT1VELAotCQkJCQkgKCJXYXRpbmcgZm9yIEZXIHJlYWQgY2xlYXIgSE1FQm94KCVkKSEhISAiCisJCQkJCSAoIldhaXRpbmcgZm9yIEZXIHJlYWQgY2xlYXIgSE1FQm94KCVkKSEhISAiCiAJCQkJCSAgIjB4MTMwID0gJTJ4XG4iLCBib3hudW0sIHUxYl90bXApKTsKIAkJCX0KIAkJfQpAQCAtMTE3OSw3ICsxMTc5LDcgQEAKIAkJCSAoIlNldCBSU1ZEIHBhZ2UgbG9jYXRpb24gdG8gRncgRkFJTCEhISEhIS5cbiIpKTsKIH0KIAotLypTaG91ZCBjaGVjayBGVyBzdXBwb3J0IHAycCBvciBub3QuKi8KKy8qU2hvdWxkIGNoZWNrIEZXIHN1cHBvcnQgcDJwIG9yIG5vdC4qLwogdm9pZCBydGw4ODIxYWVfc2V0X3AycF9jdHdfcGVyaW9kX2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggY3R3aW5kb3cpCiB7CiAJdTggdTFfY3R3aW5kb3dfcGVyaW9kWzFdID17IGN0d2luZG93fTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2hhbF9idF9jb2V4aXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9oYWxfYnRfY29leGlzdC5oCmluZGV4IDc5OWNjNmYuLmIzNjVmODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2hhbF9idF9jb2V4aXN0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvaGFsX2J0X2NvZXhpc3QuaApAQCAtMTQyLDcgKzE0Miw3IEBACiBsb25nIHJ0bDg4MjFhZV9kbV9idF9nZXRfcnhfc3Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogdm9pZCBydGw4ODIxYWVfZG1fYnRfYmFsYW5jZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCWJvb2wgYl9iYWxhbmNlX29uLCB1OCBtczAsIHU4IG1zMSk7Ci12b2lkIHJ0bDg4MjFhZV9kbV9idF9hZ2NfdGFibGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHR5ZXApOwordm9pZCBydGw4ODIxYWVfZG1fYnRfYWdjX3RhYmxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB0eXBlKTsKIHZvaWQgcnRsODgyMWFlX2RtX2J0X2JiX2JhY2tfb2ZmX2xldmVsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB0eXBlKTsKIHU4IHJ0bDg4MjFhZV9kbV9idF9jaGVja19jb2V4X3Jzc2lfc3RhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkJCQl1OAlsZXZlbF9udW0sIHU4CXJzc2lfdGhyZXNoLCB1OCByc3NpX3RocmVzaDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvaGFsX2J0Yy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvaGFsX2J0Yy5jCmluZGV4IDc5Mzg2ZWUuLjdiMWQxMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2hhbF9idGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9oYWxfYnRjLmMKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCQkmJihydGxwY2lwcml2LT5idGNvZXhpc3QucHJldmlvdXNfc3RhdGVfaAogCQk9PSBydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZV9oKSkgewogCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKLQkJCQkoIltETV1bQlRdLCBDb2V4aXN0IHN0YXRlIGRvIG5vdCBjaGFuZyEhXG4iKSk7CisJCQkJKCJbRE1dW0JUXSwgQ29leGlzdCBzdGF0ZSBkbyBub3QgY2hhbmdlISFcbiIpKTsKIAkJcmV0dXJuIHRydWU7CiAJfSBlbHNlIHsKIAkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCkBAIC05MDIsNyArOTAyLDcgQEAKIAogCS8qCiAJICogTm90ZToKLQkgKiBXZSBzaG91bGQgYWRkIGRlbGF5IGZvciBtYWtpbmcgc3VyZSBzdyBEYWNTd2luZyBjYW4gYmUgc2V0IHN1Y2Vzc2Z1bGx5LgorCSAqIFdlIHNob3VsZCBhZGQgZGVsYXkgZm9yIG1ha2luZyBzdXJlIHN3IERhY1N3aW5nIGNhbiBiZSBzZXQgc3VjY2Vzc2Z1bGx5LgogCSAqIGJlY2F1c2Ugb2YgdGhhdCBydGw4ODIxYWVfZG1fYnRfc2V0X2Z3XzJfYW50X2hpZCgpIGFuZCBydGw4ODIxYWVfZG1fYnRfc2V0X2Z3X3RkbWFfY3RybCgpCiAJICogd2lsbCBvdmVyd3JpdGUgdGhlIHJlZyAweDg4MC4KIAkqLwpAQCAtMjAyNSw3ICsyMDI1LDcgQEAKIAkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHgxQUYsIDB4MDApOwogCQlyZXR1cm47CiAJfQotCXB0bXBfYnVmID0gKHU4ICopIGttYWxsb2MoYzJoX2V2ZW50LmNtZF9sZW4sIEdGUF9LRVJORUwpOworCXB0bXBfYnVmID0ga21hbGxvYyhjMmhfZXZlbnQuY21kX2xlbiwgR0ZQX0tFUk5FTCk7CiAJaWYocHRtcF9idWYgPT0gTlVMTCkgewogCQlSVF9UUkFDRShDT01QX0ZXLCBEQkdfVFJBQ0UsICgibWFsbG9jIGNtZCBidWYgZmFpbGVkXG4iKSk7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2h3LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9ody5jCmluZGV4IDVlZDdhMTEuLjFiODU4M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2h3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvaHcuYwpAQCAtMTQ3LDYgKzE0Nyw3IEBACiAJCX0gZWxzZSB7CiAJCQlydGxoYWwtPmJmd19jbGtfY2hhbmdlX2luX3Byb2dyZXNzID0gZmFsc2U7CiAJCQlzcGluX3VubG9ja19iaCgmcnRscHJpdi0+bG9ja3MuZndfcHNfbG9jayk7CisJCQlicmVhazsKIAkJfQogCX0KIApAQCAtMTAxNiw3ICsxMDE3LDcgQEAKIAkvKiBBUkZCIHRhYmxlIDEyIGZvciAxMWFjIDI0RyAxU1MgKi8KIAlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0FSRlIzLCAweDAwMDAwMDE1KTsKIAlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0FSRlIzICsgNCwgMHhmZmNmZjAwMCk7Ci0JLyogMHg0MjBbN10gPSAwICwgZW5hYmxlIHJldHJ5IEFNUERVIGluIG5ldyBBTVBEIG5vdCBzaW5nYWwgTVBEVS4gKi8KKwkvKiAweDQyMFs3XSA9IDAgLCBlbmFibGUgcmV0cnkgQU1QRFUgaW4gbmV3IEFNUEQgbm90IHNpZ25hbCBNUERVLiAqLwogCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19GV0hXX1RYUV9DVFJMLCAweDFGMDApOwogCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19BTVBEVV9NQVhfVElNRSwgMHg3MCk7CiAKQEAgLTE0MDYsNyArMTQwNyw3IEBACiAJcnRsODgyMWFlX3BoeV9tYWNfY29uZmlnKGh3KTsKIAkvKiBiZWNhdXNlIGxhc3QgZnVuY3Rpb24gbW9kaWZ5IFJDUiwgc28gd2UgdXBkYXRlCiAJICogcmNyIHZhciBoZXJlLCBvciBUUCB3aWxsIHVuc3RhYmxlIGZvciByZWNlaXZlX2NvbmZpZwotCSAqIGlzIHdyb25nLCBSWCBSQ1JfQUNSQzMyIHdpbGwgY2F1c2UgVFAgdW5zdGFiZWwgJiBSeAorCSAqIGlzIHdyb25nLCBSWCBSQ1JfQUNSQzMyIHdpbGwgY2F1c2UgVFAgdW5zdGFibGUgJiBSeAogCSAqIFJDUl9BUFBfSUNWIHdpbGwgY2F1c2UgbWFjODAyMTEgdW5hc3NvYyBmb3IgY2lzY28gMTI1MgogCXJ0bHBjaS0+cmVjZWl2ZV9jb25maWcgPSBydGxfcmVhZF9kd29yZChydGxwcml2LCBSRUdfUkNSKTsKIAlydGxwY2ktPnJlY2VpdmVfY29uZmlnICY9IH4oUkNSX0FDUkMzMiB8IFJDUl9BSUNWKTsKQEAgLTE1NjIsNyArMTU2Myw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCi0JCQkJKCJDaGlwIFZlcnNpb24gSUQ6IFVua25vdyAoMHglWCkuXG4iLCB2ZXJzaW9uKSk7CisJCQkJKCJDaGlwIFZlcnNpb24gSUQ6IFVua25vd24gKDB4JVgpLlxuIiwgdmVyc2lvbikpOwogCQkJYnJlYWs7CiAJfQogCkBAIC0xNjIyLDcgKzE2MjMsNyBAQAogCiAJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgKE1TUiksIGJ0X21zcik7CiAJcnRscHJpdi0+Y2ZnLT5vcHMtPmxlZF9jb250cm9sKGh3LCBsZWRhY3Rpb24pOwotCWlmICgoYnRfbXNyICYgMHhmYykgPT0gTVNSX0FQKQorCWlmICgoYnRfbXNyICYgfjB4ZmMpID09IE1TUl9BUCkKIAkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0JDTlRDRkcgKyAxLCAweDAwKTsKIAllbHNlCiAJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19CQ05UQ0ZHICsgMSwgMHg2Nik7CkBAIC0yMzcxLDcgKzIzNzIsNyBAQAogCWlmIChydGxlZnVzZS0+ZWVwcm9tX2NoYW5uZWxwbGFuID09IDB4ZmYpCiAJCXJ0bGVmdXNlLT5lZXByb21fY2hhbm5lbHBsYW4gPSAweDdGOwogCi0JLyogc2V0IGNoYW5uZWwgcGFsbiB0byB3b3JsZCB3aWRlIDEzICovCisJLyogc2V0IGNoYW5uZWwgcGxhbiB0byB3b3JsZCB3aWRlIDEzICovCiAJLy9ydGxlZnVzZS0+Y2hhbm5lbF9wbGFuID0gKHU4KSBydGxlZnVzZS0+ZWVwcm9tX2NoYW5uZWxwbGFuOwogCiAJLypwYXJzZSB4dGFsKi8KQEAgLTI1MzQsNyArMjUzNSw3IEBACiAJaWYgKHJ0bGVmdXNlLT5lZXByb21fY2hhbm5lbHBsYW4gPT0gMHhmZikKIAkJcnRsZWZ1c2UtPmVlcHJvbV9jaGFubmVscGxhbiA9IDB4N0Y7CiAKLQkvKiBzZXQgY2hhbm5lbCBwYWxuIHRvIHdvcmxkIHdpZGUgMTMgKi8KKwkvKiBzZXQgY2hhbm5lbCBwbGFuIHRvIHdvcmxkIHdpZGUgMTMgKi8KIAkvL3J0bGVmdXNlLT5jaGFubmVsX3BsYW4gPSAodTgpIHJ0bGVmdXNlLT5lZXByb21fY2hhbm5lbHBsYW47CiAKIAkvKnBhcnNlIHh0YWwqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcGh5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9waHkuYwppbmRleCBkMDJmY2EzLi4xZGQzMzAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9waHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9waHkuYwpAQCAtODYsNyArODYsNyBAQAogCQkJLyogMHg4QUNbMTE6MTBdID0gMidiMTAqLwogCiAKLQkJLyogPDIwMTIwOTE0LCBLb3JkYW4+IEEgd29ya2Fyb3VsZCB0byByZXNvbHZlCisJCS8qIDwyMDEyMDkxNCwgS29yZGFuPiBBIHdvcmthcm91bmQgdG8gcmVzb2x2ZQogCQkyNDgwTWh6IHNwdXIgYnkgc2V0dGluZyBBREMgY2xvY2sgYXMgMTYwTS4gKEFza2VkIGJ5IEJpbnNvbikqLwogCQlpZiAoYmFuZF93aWR0aCA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwICYmCiAJCQkoY2hhbm5lbCA9PSAxMyB8fCBjaGFubmVsID09IDE0KSkgewpAQCAtMTA3LDcgKzEwNyw3IEBACiAJfQogCWVsc2UgaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg4MTJBRSkKIAl7Ci0JCS8qIDwyMDEyMDkxNCwgS29yZGFuPiBBIHdvcmthcm91bGQgdG8gcmVzb2x2ZQorCQkvKiA8MjAxMjA5MTQsIEtvcmRhbj4gQSB3b3JrYXJvdW5kIHRvIHJlc29sdmUKIAkJMjQ4ME1oeiBzcHVyIGJ5IHNldHRpbmcgQURDIGNsb2NrIGFzIDE2ME0uIChBc2tlZCBieSBCaW5zb24pKi8KIAkJaWYgKGJhbmRfd2lkdGggPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCAmJgogCQkJKGNoYW5uZWwgPT0gMTMgfHwgY2hhbm5lbCA9PSAxNCkpCkBAIC00NDEsOCArNDQxLDggQEAKIAlzdHJ1Y3QgcnRsX2RtICpydGxkbSA9IHJ0bF9kbShydGxwcml2KTsKIAlzdHJ1Y3QgcnRsX2VmdXNlICpydGxlZnVzZSA9IHJ0bF9lZnVzZShydGxfcHJpdihodykpOwogCi0JY2hhciBiYl9zd2luZ18yZyA9IChjaGFyKSAoLTEgKiAweEZGKTsKLQljaGFyIGJiX3N3aW5nXzVnID0gKGNoYXIpICgtMSAqIDB4RkYpOworCWNoYXIgYmJfc3dpbmdfMmcgPSAoY2hhcikgKCgtMSAqIDB4RkYpICYgMHhGRik7CisJY2hhciBiYl9zd2luZ181ZyA9IChjaGFyKSAoKC0xICogMHhGRikgJiAweEZGKTsKIAl1MzIgIG91dCA9IDB4MjAwOwogCWNvbnN0IGNoYXIgYXV0b190ZW1wID0gLTE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3BoeS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcGh5LmgKaW5kZXggYTkzMmQ4Yy4uYTgwYmY3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcGh5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcGh5LmgKQEAgLTMwLDcgKzMwLDcgQEAKICNpZm5kZWYgX19SVEw4ODIxQUVfUEhZX0hfXwogI2RlZmluZSBfX1JUTDg4MjFBRV9QSFlfSF9fCiAKLS8qSXQgbXVzdCBhbHdheXMgc2V0IHRvIDQsIG90aGVyd2lzZSByZWFkIGVmdXNlIHRhYmxlIHNlY3F1ZW5jZSB3aWxsIGJlIHdyb25nLiovCisvKkl0IG11c3QgYWx3YXlzIHNldCB0byA0LCBvdGhlcndpc2UgcmVhZCBlZnVzZSB0YWJsZSBzZXF1ZW5jZSB3aWxsIGJlIHdyb25nLiovCiAjZGVmaW5lIE1BWF9UWF9DT1VOVAk0CiAjZGVmaW5lCVRYXzFTCQkJMAogI2RlZmluZQlUWF8yUwkJCTEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3B3cnNlcS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcHdyc2VxLmgKaW5kZXggOGIzOWMwNC4uNDgwYTZiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcHdyc2VxLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcHdyc2VxLmgKQEAgLTgxLDcgKzgxLDcgQEAKIAl7MHgwMDQ3LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB9LC8qIDB4NDdbNzowXSA9IDAwIGdwaW8gbW9kZSAqLwlcCiAJezB4MDAwNywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAwfSwvKiBzdXNwZW5kIG9wdGlvbiBhbGwgb2ZmICovCVwKIAl7MHgwMDE0LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4ODAsIEJJVDd9LC8qMHgxNFs3XSA9IDEgdHVybiBvbiBaQ0QgKi8JXAotCXsweDAwMTUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHgwMSwgQklUMH0sLyogMHgxNVswXSA9MSB0cnVuIG9uIFpDRCAqLwlcCisJezB4MDAxNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDAxLCBCSVQwfSwvKiAweDE1WzBdID0xIHR1cm4gb24gWkNEICovCVwKIAl7MHgwMDIzLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4MTAsIEJJVDR9LC8qMHgyM1s0XSA9IDEgaHBvbiBMRE8gc2xlZXAgbW9kZSAqLwlcCiAJezB4MDAwOCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDAyLCAwfSwvKjB4OFsxXSA9IDAgQU5BIGNsayA9NTAwayAqLwlcCiAJezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQzLCBCSVQzfSwgLyoweDA0WzExXSA9IDJiJzExIGVuYWJsZSBXTCBzdXNwZW5kIGZvciBQQ0llKi8KQEAgLTkxLDcgKzkxLDcgQEAKIAkvKiB7IG9mZnNldCwgY3V0X21zaywgZmFiX21za3xpbnRlcmZhY2VfbXNrLCBiYXNlfGNtZCwgbXNrLCB2YWx1ZSB9LCAvLyBjb21tZW50cyBoZXJlKi8JCQkJCQkJCVwKIAl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDMsIDB9LCAvKjB4MDRbMTFdID0gMmInMDFlbmFibGUgV0wgc3VzcGVuZCovICAgXAogCXsweDAwMjMsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHgxMCwgMH0sLyoweDIzWzRdID0gMCBocG9uIExETyBzbGVlcCBtb2RlIGxlYXZlICovCVwKLQl7MHgwMDE1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4MDEsIDB9LC8qIDB4MTVbMF0gPTAgdHJ1biBvZmYgWkNEICovCVwKKwl7MHgwMDE1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4MDEsIDB9LC8qIDB4MTVbMF0gPTAgdHVybiBvZmYgWkNEICovCVwKIAl7MHgwMDE0LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4ODAsIDB9LC8qMHgxNFs3XSA9IDAgdHVybiBvZmYgWkNEICovCVwKIAl7MHgwMDQ2LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4MDB9LC8qIGdwaW8wfjcgaW5wdXQgbW9kZSAqLwlcCiAJezB4MDA0MywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAweDAwfSwvKiBncGlvMTEgaW5wdXQgbW9kZSwgZ3BpbzEwfjggaW5wdXQgbW9kZSAqLwpAQCAtMTEwLDcgKzExMCw3IEBACiAJezB4MDA0NiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAweGZmfSwvKiBncGlvMH43IG91dHB1dCBtb2RlICovCVwKIAl7MHgwMDQ3LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB9LC8qIDB4NDdbNzowXSA9IDAwIGdwaW8gbW9kZSAqLwlcCiAJezB4MDAxNCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDgwLCBCSVQ3fSwvKjB4MTRbN10gPSAxIHR1cm4gb24gWkNEICovCVwKLQl7MHgwMDE1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4MDEsIEJJVDB9LC8qIDB4MTVbMF0gPTEgdHJ1biBvbiBaQ0QgKi8JXAorCXsweDAwMTUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHgwMSwgQklUMH0sLyogMHgxNVswXSA9MSB0dXJuIG9uIFpDRCAqLwlcCiAJezB4MDAxMiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDAxLCAwfSwvKjB4MTJbMF0gPSAwIGZvcmNlIFBGTSBtb2RlICovCVwKIAl7MHgwMDIzLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4MTAsIEJJVDR9LC8qMHgyM1s0XSA9IDEgaHBvbiBMRE8gc2xlZXAgbW9kZSAqLwlcCiAJezB4MDAwOCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDAyLCAwfSwvKjB4OFsxXSA9IDAgQU5BIGNsayA9NTAwayAqLwlcCkBAIC0xMjQsNyArMTI0LDcgQEAKIAkvKiB7IG9mZnNldCwgY3V0X21zaywgZmFiX21za3xpbnRlcmZhY2VfbXNrLCBiYXNlfGNtZCwgbXNrLCB2YWx1ZSB9LCAvLyBjb21tZW50cyBoZXJlKi8gICAgICAgICAgICAgICAgICAgICAgIFwKIAl7MHgwMDEyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDAsIEJJVDB9LC8qMHgxMlswXSA9IDEgZm9yY2UgUFdNIG1vZGUgKi8JXAogCXsweDAwMTQsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHg4MCwgMH0sLyoweDE0WzddID0gMCB0dXJuIG9mZiBaQ0QgKi8JXAotCXsweDAwMTUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHgwMSwgMH0sLyogMHgxNVswXSA9MCB0cnVuIG9mZiBaQ0QgKi8JXAorCXsweDAwMTUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHgwMSwgMH0sLyogMHgxNVswXSA9MCB0dXJuIG9mZiBaQ0QgKi8JXAogCXsweDAwMjMsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHgxMCwgMH0sLyoweDIzWzRdID0gMCBocG9uIExETyBsZWF2ZSBzbGVlcCBtb2RlICovCVwKIAl7MHgwMDQ2LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4MDB9LC8qIGdwaW8wfjcgaW5wdXQgbW9kZSAqLwlcCiAJezB4MDA0MywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAweDAwfSwvKiBncGlvMTEgaW5wdXQgbW9kZSwgZ3BpbzEwfjggaW5wdXQgbW9kZSAqLyBcCkBAIC0yMDQsNyArMjA0LDcgQEAKIAk0OiBMUFMtLUxvdyBQb3dlciBTdGF0ZQogCTU6IFNVUy0tU3VzcGVuZAogCi0JVGhlIHRyYW5zaXNpb24gZnJvbSBkaWZmZXJlbnQgc3RhdGVzIGFyZSBkZWZpbmVkIGJlbG93CisJVGhlIHRyYW5zaXRpb24gZnJvbSBkaWZmZXJlbnQgc3RhdGVzIGFyZSBkZWZpbmVkIGJlbG93CiAJVFJBTlNfQ0FSREVNVV9UT19BQ1QKIAlUUkFOU19BQ1RfVE9fQ0FSREVNVQogCVRSQU5TX0NBUkRFTVVfVE9fU1VTCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9wd3JzZXFjbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3B3cnNlcWNtZC5jCmluZGV4IDcxMGJjMDEuLmZmMTg4NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3B3cnNlcWNtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3B3cnNlcWNtZC5jCkBAIC04Miw3ICs4Miw3IEBACiAJCQkJCXZhbHVlID0gdmFsdWUgfCAoR0VUX1BXUl9DRkdfVkFMVUUocHdyX2NmZ19jbWQpCiAJCQkJCQkJJiBHRVRfUFdSX0NGR19NQVNLKHB3cl9jZmdfY21kKSk7CiAKLQkJCQkJLypXcml0ZSB0aGUgdmFsdWUgYmFjayB0byBzeXRlbSByZWdpc3RlciovCisJCQkJCS8qV3JpdGUgdGhlIHZhbHVlIGJhY2sgdG8gc3lzdGVtIHJlZ2lzdGVyKi8KIAkJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgb2Zmc2V0LCB2YWx1ZSk7CiAJCQkJfQogCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9yZWcuaAppbmRleCAwOWM1ZjAwLi5iZWZmYjQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9yZWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9yZWcuaApAQCAtNTk2LDEzICs1OTYsMTMgQEAKICNkZWZpbmUJSU1SX0JDTkRNQUlOVDMJCQlCSVQoMjMpCQkvKiBCZWFjb24gRE1BIEludGVycnVwdCAzCQkqLwogI2RlZmluZQlJTVJfQkNORE1BSU5UMgkJCUJJVCgyMikJCS8qIEJlYWNvbiBETUEgSW50ZXJydXB0IDIJCSovCiAjZGVmaW5lCUlNUl9CQ05ETUFJTlQxCQkJQklUKDIxKQkJLyogQmVhY29uIERNQSBJbnRlcnJ1cHQgMQkJKi8KLSNkZWZpbmUJSU1SX0JDTkRPSzcJCQkJQklUKDIwKQkJLyogQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCA3ICovCi0jZGVmaW5lCUlNUl9CQ05ET0s2CQkJCUJJVCgxOSkJCS8qIEJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgNiAqLwotI2RlZmluZQlJTVJfQkNORE9LNQkJCQlCSVQoMTgpCQkvKiBCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDUgKi8KLSNkZWZpbmUJSU1SX0JDTkRPSzQJCQkJQklUKDE3KQkJLyogQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCA0ICovCi0jZGVmaW5lCUlNUl9CQ05ET0szCQkJCUJJVCgxNikJCS8qIEJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgMyAqLwotI2RlZmluZQlJTVJfQkNORE9LMgkJCQlCSVQoMTUpCQkvKiBCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDIgKi8KLSNkZWZpbmUJSU1SX0JDTkRPSzEJCQkJQklUKDE0KQkJLyogQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCAxICovCisjZGVmaW5lCUlNUl9CQ05ET0s3CQkJCUJJVCgyMCkJCS8qIEJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXB0IDcgKi8KKyNkZWZpbmUJSU1SX0JDTkRPSzYJCQkJQklUKDE5KQkJLyogQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgNiAqLworI2RlZmluZQlJTVJfQkNORE9LNQkJCQlCSVQoMTgpCQkvKiBCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwdCA1ICovCisjZGVmaW5lCUlNUl9CQ05ET0s0CQkJCUJJVCgxNykJCS8qIEJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXB0IDQgKi8KKyNkZWZpbmUJSU1SX0JDTkRPSzMJCQkJQklUKDE2KQkJLyogQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgMyAqLworI2RlZmluZQlJTVJfQkNORE9LMgkJCQlCSVQoMTUpCQkvKiBCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwdCAyICovCisjZGVmaW5lCUlNUl9CQ05ET0sxCQkJCUJJVCgxNCkJCS8qIEJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXB0IDEgKi8KICNkZWZpbmUJSU1SX0FUSU1FTkRfRQkJQklUKDEzKQkJLyogQVRJTSBXaW5kb3cgRW5kIEV4dGVuc2lvbiBmb3IgV2luNyAqLwogI2RlZmluZQlJTVJfVFhFUlIJCQkJQklUKDExKQkJLyogVHggRXJyb3IgRmxhZyBJbnRlcnJ1cHQgU3RhdHVzLCB3cml0ZSAxIGNsZWFyLiAqLwogI2RlZmluZQlJTVJfUlhFUlIJCQkJQklUKDEwKQkJLyogUnggRXJyb3IgRmxhZyBJTlQgU3RhdHVzLCBXcml0ZSAxIGNsZWFyICovCkBAIC02MTMsNyArNjEzLDcgQEAKICNkZWZpbmUJSFdTRVRfTUFYX1NJWkUJCQkJNTEyCiAjZGVmaW5lICAgRUZVU0VfTUFYX1NFQ1RJT04JCQk2NAogI2RlZmluZSAgIEVGVVNFX1JFQUxfQ09OVEVOVF9MRU4JCQkyNTYKLSNkZWZpbmUgCUVGVVNFX09PQl9QUk9URUNUX0JZVEVTICAgIAkxOCAJLyogUEcgZGF0YSBleGNsdWRlIGhlYWRlciwgZHVtbXkgNyBieXRlcyBmcm9tZSBDUCB0ZXN0IGFuZCByZXNlcnZlZCAxYnl0ZS4qLworI2RlZmluZSAJRUZVU0VfT09CX1BST1RFQ1RfQllURVMgICAgCTE4IAkvKiBQRyBkYXRhIGV4Y2x1ZGUgaGVhZGVyLCBkdW1teSA3IGJ5dGVzIGZyb20gQ1AgdGVzdCBhbmQgcmVzZXJ2ZWQgMWJ5dGUuKi8KIAogCiAjZGVmaW5lCUVFUFJPTV9ERUZBVUxUX1RTU0kJCQkJCTB4MApAQCAtMTUxMSw3ICsxNTExLDcgQEAKICNkZWZpbmUJUk9GRE0wX1RYQ09FRkY1CQkJCTB4Y2I0CiAjZGVmaW5lCVJPRkRNMF9UWENPRUZGNgkJCQkweGNiOAogCi0vKlBhdGhfQSBSRkUgY290cm9sICovCisvKlBhdGhfQSBSRkUgY29udHJvbCAqLwogI2RlZmluZQlSQV9SRkVfQ1RSTF84ODEyCQkJCTB4Y2I4CiAvKlBhdGhfQiBSRkUgY29udHJvbCovCiAjZGVmaW5lCVJCX1JGRV9DVFJMXzg4MTIJCQkJMHhlYjgKQEAgLTIzMzYsMTkgKzIzMzYsMTkgQEAKICNkZWZpbmUJCVdPTF9SRUFTT05fREVBVVRICQkJQklUKDMpCiAjZGVmaW5lCQlXT0xfUkVBU09OX0ZXX0RJU0NPTk5FQ1QJQklUKDQpCiAKLSNkZWZpbmUJCVJBX1JGRV9QSU5NVVgJMHhjYjAgIC8qIFBhdGhfQSBSRkUgY290cm9sIHBpbm11eCovCisjZGVmaW5lCQlSQV9SRkVfUElOTVVYCTB4Y2IwICAvKiBQYXRoX0EgUkZFIGNvbnRyb2wgcGlubXV4Ki8KICNkZWZpbmUJCVJCX1JGRV9QSU5NVVgJMHhlYjAgLyogUGF0aF9CIFJGRSBjb250cm9sIHBpbm11eCovCiAKICNkZWZpbmUJCVJBX1JGRV9JTlYgMHhjYjQKICNkZWZpbmUJCVJCX1JGRV9JTlYgMHhlYjQKIAogLyogUlhJUUMgKi8KLSNkZWZpbmUJCVJBX1JYSVFDX0FCICAgIAkweGMxMCAgLypSeElRIGltYmxhbmNlIG1hdHJpeCBjb2VmZi4gQSAmIEIqLwotI2RlZmluZQkJUkFfUlhJUUNfQ0QgICAgCTB4YzE0ICAvKlJ4SVEgaW1ibGFuY2UgbWF0cml4IGNvZWZmLiBDICYgRCovCisjZGVmaW5lCQlSQV9SWElRQ19BQiAgICAJMHhjMTAgIC8qUnhJUSBpbWJhbGFuY2UgbWF0cml4IGNvZWZmLiBBICYgQiovCisjZGVmaW5lCQlSQV9SWElRQ19DRCAgICAJMHhjMTQgIC8qUnhJUSBpbWJhbGFuY2UgbWF0cml4IGNvZWZmLiBDICYgRCovCiAjZGVmaW5lCSAJUkFfVFhTQ0FMRSAJCTB4YzFjICAvKiBQYWhfQSBUWCBzY2FsaW5nIGZhY3RvciovCiAjZGVmaW5lCQlSQl9UWFNDQUxFIAkJMHhlMWMgIC8qIFBhdGhfQiBUWCBzY2FsaW5nIGZhY3RvciovCi0jZGVmaW5lCQlSQl9SWElRQ19BQiAgICAJMHhlMTAgIC8qUnhJUSBpbWJsYW5jZSBtYXRyaXggY29lZmYuIEEgJiBCKi8KLSNkZWZpbmUJCVJCX1JYSVFDX0NEICAgIAkweGUxNCAgLypSeElRIGltYmxhbmNlIG1hdHJpeCBjb2VmZi4gQyAmIEQqLworI2RlZmluZQkJUkJfUlhJUUNfQUIgICAgCTB4ZTEwICAvKlJ4SVEgaW1iYWxhbmNlIG1hdHJpeCBjb2VmZi4gQSAmIEIqLworI2RlZmluZQkJUkJfUlhJUUNfQ0QgICAgCTB4ZTE0ICAvKlJ4SVEgaW1iYWxhbmNlIG1hdHJpeCBjb2VmZi4gQyAmIEQqLwogI2RlZmluZQkJUlhJUUNfQUMJCTB4MDJmZiAgLypiaXQgbWFzayBmb3IgSVFDIG1hdHJpeCBlbGVtZW50IEEgJiBDKi8KICNkZWZpbmUJCVJYSVFDX0JECQkweDAyZmYwMDAwIC8qYml0IG1hc2sgZm9yIElRQyBtYXRyaXggZWxlbWVudCBBICYgQyovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3N3LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9zdy5jCmluZGV4IDg1YTM0NzQuLmE4ZDE3NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3N3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvc3cuYwpAQCAtNTcsOSArNTcsOSBAQAogCSAqIDAgLSBEaXNhYmxlIEFTUE0sCiAJICogMSAtIEVuYWJsZSBBU1BNIHdpdGhvdXQgQ2xvY2sgUmVxLAogCSAqIDIgLSBFbmFibGUgQVNQTSB3aXRoIENsb2NrIFJlcSwKLQkgKiAzIC0gQWx3eWFzIEVuYWJsZSBBU1BNIHdpdGggQ2xvY2sgUmVxLAorCSAqIDMgLSBBbHdheXMgRW5hYmxlIEFTUE0gd2l0aCBDbG9jayBSZXEsCiAJICogNCAtIEFsd2F5cyBFbmFibGUgQVNQTSB3aXRob3V0IENsb2NrIFJlcS4KLQkgKiBzZXQgZGVmdWx0IHRvIFJUTDgxOTJDRTozIFJUTDgxOTJFOjIKKwkgKiBzZXQgZGVmYXVsdCB0byBSVEw4MTkyQ0U6MyBSVEw4MTkyRToyCiAJICogKi8KIAlydGxwY2ktPmNvbnN0X3BjaV9hc3BtID0gMzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvdHJ4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS90cnguYwppbmRleCA3NWFlNDM4Li5kZDBmNmRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS90cnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS90cnguYwpAQCAtMzcsOCArMzcsOCBAQAogI2luY2x1ZGUgInRyeC5oIgogI2luY2x1ZGUgImxlZC5oIgogI2luY2x1ZGUgImRtLmgiCi0jaW5jbHVkZSAicGh5LmgiCi11OCBfcnRsODgyMWFlX21hcF9od3F1ZXVlX3RvX2Z3cXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggaHdfcXVldWUpCisKK3N0YXRpYyB1OCBfcnRsODgyMWFlX21hcF9od3F1ZXVlX3RvX2Z3cXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggaHdfcXVldWUpCiB7CiAJdTE2IGZjID0gcnRsX2dldF9mYyhza2IpOwogCkBAIC0yNDQsNyArMjQ0LDcgQEAKIAkJY2NrX2FnY19ycHQgPSBjY2tfYnVmLT5jY2tfYWdjX3JwdDsKIAogCQkvKiAoMSlIYXJkd2FyZSBkb2VzIG5vdCBwcm92aWRlIFJTU0kgZm9yIENDSyAqLwotCQkvKiAoMilQV0RCLCBBdmVyYWdlIFBXREIgY2FjbHVhdGVkIGJ5CisJCS8qICgyKVBXREIsIEF2ZXJhZ2UgUFdEQiBjYWxjdWxhdGVkIGJ5CiAJCSAqIGhhcmR3YXJlIChmb3IgcmF0ZSBhZGFwdGl2ZSkgKi8KIAkJaWYgKHBwc2MtPnJmcHdyX3N0YXRlID09IEVSRk9OKQogCQkJY2NrX2hpZ2hwd3IgPSAodTgpIHJ0bF9nZXRfYmJyZWcoaHcsIFJGUEdBMF9YQV9IU1NJUEFSQU1FVEVSMiwKQEAgLTM2Myw3ICszNjMsNyBAQAogCQkJCXBzdGF0dXMtPnJ4X21pbW9fc2lnbmFsc3RyZW5ndGhbaV0gPSAodTgpIHJzc2k7CiAJCX0KIAotCQkvKiAoMilQV0RCLCBBdmVyYWdlIFBXREIgY2FjbHVhdGVkIGJ5CisJCS8qICgyKVBXREIsIEF2ZXJhZ2UgUFdEQiBjYWxjdWxhdGVkIGJ5CiAJCSAqIGhhcmR3YXJlIChmb3IgcmF0ZSBhZGFwdGl2ZSkgKi8KIAkJcnhfcHdyX2FsbCA9ICgocF9kcnZpbmZvLT5wd2RiX2FsbCA+PiAxKSAmIDB4N2YpIC0gMTEwOwogCkBAIC02MDMsNyArNjAzLDcgQEAKIAogCS8qIGh3IHdpbGwgc2V0IHN0YXR1cy0+ZGVjcnlwdGVkIHRydWUsIGlmIGl0IGZpbmRzIHRoZQogCSAqIGZyYW1lIGlzIG9wZW4gZGF0YSBmcmFtZSBvciBtZ210IGZyYW1lLiAqLwotCS8qIFNvIGh3IHdpbGwgbm90IGRlY3J5cHRpb24gcm9idXN0IG1hbmFnbWVudCBmcmFtZQorCS8qIFNvIGh3IHdpbGwgbm90IGRlY3J5cHRpb24gcm9idXN0IG1hbmFnZW1lbnQgZnJhbWUKIAkgKiBmb3IgSUVFRTgwMjExdyBidXQgc3RpbGwgc2V0IHN0YXR1cy0+ZGVjcnlwdGVkCiAJICogdHJ1ZSwgc28gaGVyZSB3ZSBzaG91bGQgc2V0IGl0IGJhY2sgdG8gdW5kZWNyeXB0ZWQKIAkgKiBmb3IgSUVFRTgwMjExdyBmcmFtZSwgYW5kIG1hYzgwMjExIHN3IHdpbGwgaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS93aWZpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3dpZmkuaAppbmRleCA3NmJlZjkzLi4xN2E5ZDlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3dpZmkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3dpZmkuaApAQCAtNDAsMTAgKzQwLDEwIEBACiAKIAogI2RlZmluZSBSRl9DSEFOR0VfQllfSU5JVAkJMAotI2RlZmluZSBSRl9DSEFOR0VfQllfSVBTIAkJQklUKDI4KQotI2RlZmluZSBSRl9DSEFOR0VfQllfUFMgCQlCSVQoMjkpCi0jZGVmaW5lIFJGX0NIQU5HRV9CWV9IVyAJCUJJVCgzMCkKLSNkZWZpbmUgUkZfQ0hBTkdFX0JZX1NXIAkJQklUKDMxKQorI2RlZmluZSBSRl9DSEFOR0VfQllfSVBTCQlCSVQoMjgpCisjZGVmaW5lIFJGX0NIQU5HRV9CWV9QUwkJCUJJVCgyOSkKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX0hXCQkJQklUKDMwKQorI2RlZmluZSBSRl9DSEFOR0VfQllfU1cJCQlCSVQoMzEpCiAKICNkZWZpbmUgSVFLX0FEREFfUkVHX05VTQkJMTYKICNkZWZpbmUgSVFLX01BQ19SRUdfTlVNCQkJNApAQCAtNjksMzUgKzY5LDM1IEBACiAjZGVmaW5lIFFCU1NfTE9BRF9TSVpFCQkJNQogI2RlZmluZSBNQVhfV01NRUxFX0xFTkdUSAkJNjQKIAotI2RlZmluZSBUT1RBTF9DQU1fRU5UUlkgCQkzMgorI2RlZmluZSBUT1RBTF9DQU1fRU5UUlkJCQkzMgogCiAvKnNsb3QgdGltZSBmb3IgMTFnLiAqLwogI2RlZmluZSBSVExfU0xPVF9USU1FXzkJCQk5CiAjZGVmaW5lIFJUTF9TTE9UX1RJTUVfMjAJCTIwCiAKIC8qcmVsYXRlZCB3aXRoIHRjcC9pcC4gKi8KLS8qaWZfZWh0aGVyLmgqLwotI2RlZmluZSBFVEhfUF9QQUUgCQkJMHg4ODhFCS8qUG9ydCBBY2Nlc3MgRW50aXR5CisvKmlmX2V0aGVyLmgqLworI2RlZmluZSBFVEhfUF9QQUUJCQkweDg4OEUJLypQb3J0IEFjY2VzcyBFbnRpdHkKIAkJCQkJCSAqKElFRUUgODAyLjFYKSAqLwotI2RlZmluZSBFVEhfUF9JUCAgICAgICAgCQkweDA4MDAJLypJbnRlcm5ldCBQcm90b2NvbCBwYWNrZXQgKi8KLSNkZWZpbmUgRVRIX1BfQVJQICAgICAgIAkJMHgwODA2CS8qQWRkcmVzcyBSZXNvbHV0aW9uIHBhY2tldCAqLwotI2RlZmluZSBTTkFQX1NJWkUgCQkJNgorI2RlZmluZSBFVEhfUF9JUAkJCTB4MDgwMAkvKkludGVybmV0IFByb3RvY29sIHBhY2tldCAqLworI2RlZmluZSBFVEhfUF9BUlAJCQkweDA4MDYJLypBZGRyZXNzIFJlc29sdXRpb24gcGFja2V0ICovCisjZGVmaW5lIFNOQVBfU0laRQkJCTYKICNkZWZpbmUgUFJPVE9DX1RZUEVfU0laRQkJMgogCiAvKnJlbGF0ZWQgd2l0aCA4MDIuMTEgZnJhbWUqLwotI2RlZmluZSBNQUM4MDIxMV8zQUREUl9MRU4gCQkyNAotI2RlZmluZSBNQUM4MDIxMV80QUREUl9MRU4gCQkzMAorI2RlZmluZSBNQUM4MDIxMV8zQUREUl9MRU4JCTI0CisjZGVmaW5lIE1BQzgwMjExXzRBRERSX0xFTgkJMzAKIAogI2RlZmluZSBDSEFOTkVMX01BWF9OVU1CRVIJCSgxNCArIDI0ICsgMjEpCS8qIDE0IGlzIHRoZSBtYXgKIAkJCQkJCQkgKiBjaGFubmVsIG51bWJlciAqLwogI2RlZmluZSBDSEFOTkVMX01BWF9OVU1CRVJfMkcJCTE0Ci0jZGVmaW5lIENIQU5ORUxfTUFYX05VTUJFUl81RwkgICAgCTU0IC8qIFBsZWFzZSByZWZlciB0bworI2RlZmluZSBDSEFOTkVMX01BWF9OVU1CRVJfNUcJCTU0IC8qIFBsZWFzZSByZWZlciB0bwogCQkJCQkgICAgKiJwaHlfR2V0Q2hubEdyb3VwODgxMkEiIGFuZAogCQkJCQkgICAgKiAiSGFsX1JlYWRUeFBvd2VySW5mbzg4MTJBIiovCiAjZGVmaW5lIENIQU5ORUxfTUFYX05VTUJFUl81R184ME0JNwogI2RlZmluZSBDSEFOTkVMX0dST1VQX01BWAkJKDMgKyA5KQkvKiBjaDF+MywgY2g0fjksIGNoMTB+MTQKIAkJCQkJCSAqIHRvdGFsIHRocmVlIGdyb3VwcyAqLwotI2RlZmluZSBNQVhfUEdfR1JPVVAgCQkJMTMKKyNkZWZpbmUgTUFYX1BHX0dST1VQCQkJMTMKICNkZWZpbmUJQ0hBTk5FTF9HUk9VUF9NQVhfMkcJCTMKICNkZWZpbmUJQ0hBTk5FTF9HUk9VUF9JRFhfNUdMCQkzCiAjZGVmaW5lCUNIQU5ORUxfR1JPVVBfSURYXzVHTQkJNgpAQCAtMTEyLDE0ICsxMTIsMTQgQEAKICNkZWZpbmUgTUFYX05VTV9SQVRFUwkJCTI2NAogCiAvKmZvciA4OEUgdXNlKi8KLS8qSXQgbXVzdCBhbHdheXMgc2V0IHRvIDQsIG90aGVyd2lzZSByZWFkIGVmdXNlIHRhYmxlIHNlY3F1ZW5jZSB3aWxsIGJlIHdyb25nLiovCisvKkl0IG11c3QgYWx3YXlzIHNldCB0byA0LCBvdGhlcndpc2UgcmVhZCBlZnVzZSB0YWJsZSBzZXF1ZW5jZSB3aWxsIGJlIHdyb25nLiovCiAjZGVmaW5lIE1BWF9UWF9DT1VOVAkJCTQKICNkZWZpbmUJTUFYX1JGX1BBVEgJCQk0CiAjZGVmaW5lCU1BWF9DSE5MX0dST1VQXzI0RwkJNgogI2RlZmluZQlNQVhfQ0hOTF9HUk9VUF81RwkJMTQKIAogLyogQkssIEJFLCBWSSwgVk8sIEhDQ0EsIE1BTkFHRU1FTlQsIENPTU1BTkQsIEhJR0gsIEJFQUNPTi4gKi8KLSNkZWZpbmUgTUFYX1RYX1FVRVVFIAkJCTkKKyNkZWZpbmUgTUFYX1RYX1FVRVVFCQkJOQogCiAjZGVmaW5lIFRYX1BXUl9CWV9SQVRFX05VTV9CQU5ECQkyCiAjZGVmaW5lIFRYX1BXUl9CWV9SQVRFX05VTV9SRgkJNApAQCAtMTI3LDExICsxMjcsMTEgQEAKICNkZWZpbmUgTUFYX0JBU0VfTlVNX0lOX1BIWV9SRUdfUEdfMjRHICA2CiAjZGVmaW5lIE1BWF9CQVNFX05VTV9JTl9QSFlfUkVHX1BHXzVHCTUKIAotI2RlZmluZSBERUxUQV9TV0lOR0lEWF9TSVpFCTMwCi0jZGVmaW5lIEJBTkRfTlVNIAkJCQkzCisjZGVmaW5lIERFTFRBX1NXSU5HSURYX1NJWkUJCTMwCisjZGVmaW5lIEJBTkRfTlVNCQkJMwogLypOb3csIGl0J3MganVzdCBmb3IgODE5MmVlCiAgKm5vdCBPSyB5ZXQsIGtlZXAgaXQgMCovCi0jZGVmaW5lIERNQV9JU182NEJJVCAwCisjZGVmaW5lIERNQV9JU182NEJJVAkJCTAKICNkZWZpbmUgUlRMODE5MkVFX1NFR19OVU0JCTEgLyogMDoyIHNlZywgMTogNCBzZWcsIDI6IDggc2VnICovCiAKIHN0cnVjdCB0eHBvd2VyX2luZm9fMmcgewpAQCAtMjE5LDcgKzIxOSw3IEBACiB9OwogCiBlbnVtIHNjYW5fb3BlcmF0aW9uX2JhY2t1cF9vcHQgewotCVNDQU5fT1BUX0JBQ0tVUF9CQU5EMD0wLAorCVNDQU5fT1BUX0JBQ0tVUF9CQU5EMCA9IDAsCiAJU0NBTl9PUFRfQkFDS1VQX0JBTkQxLAogCVNDQU5fT1BUX1JFU1RPUkUsCiAJU0NBTl9PUFRfTUFYCkBAIC00MzUsNyArNDM1LDcgQEAKIAlIVF9DSEFOTkVMX1dJRFRIXzgwID0gMiwKIH07CiAKLS8qIFJlZjogODAyLjExaSBzZXBjIEQxMC4wIDcuMy4yLjI1LjEKKy8qIFJlZjogODAyLjExaSBzcGVjIEQxMC4wIDcuMy4yLjI1LjEKIENpcGhlciBTdWl0ZXMgRW5jcnlwdGlvbiBBbGdvcml0aG1zICovCiBlbnVtIHJ0X2VuY19hbGcgewogCU5PX0VOQ1JZUFRJT04gPSAwLApAQCAtNDk5LDE0ICs0OTksMTQgQEAKIAlSVExfSU1SX0JDTkRNQUlOVDMsCS8qQmVhY29uIERNQSBJbnRlcnJ1cHQgMyAqLwogCVJUTF9JTVJfQkNORE1BSU5UMiwJLypCZWFjb24gRE1BIEludGVycnVwdCAyICovCiAJUlRMX0lNUl9CQ05ETUFJTlQxLAkvKkJlYWNvbiBETUEgSW50ZXJydXB0IDEgKi8KLQlSVExfSU1SX0JDTkRPSzgsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCA4ICovCi0JUlRMX0lNUl9CQ05ET0s3LAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgNyAqLwotCVJUTF9JTVJfQkNORE9LNiwJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDYgKi8KLQlSVExfSU1SX0JDTkRPSzUsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCA1ICovCi0JUlRMX0lNUl9CQ05ET0s0LAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgNCAqLwotCVJUTF9JTVJfQkNORE9LMywJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDMgKi8KLQlSVExfSU1SX0JDTkRPSzIsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCAyICovCi0JUlRMX0lNUl9CQ05ET0sxLAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgMSAqLworCVJUTF9JTVJfQkNORE9LOCwJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwdCA4ICovCisJUlRMX0lNUl9CQ05ET0s3LAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXB0IDcgKi8KKwlSVExfSU1SX0JDTkRPSzYsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgNiAqLworCVJUTF9JTVJfQkNORE9LNSwJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwdCA1ICovCisJUlRMX0lNUl9CQ05ET0s0LAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXB0IDQgKi8KKwlSVExfSU1SX0JDTkRPSzMsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgMyAqLworCVJUTF9JTVJfQkNORE9LMiwJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwdCAyICovCisJUlRMX0lNUl9CQ05ET0sxLAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXB0IDEgKi8KIAlSVExfSU1SX1RJTUVPVVQyLAkvKlRpbWVvdXQgaW50ZXJydXB0IDIgKi8KIAlSVExfSU1SX1RJTUVPVVQxLAkvKlRpbWVvdXQgaW50ZXJydXB0IDEgKi8KIAlSVExfSU1SX1RYRk9WVywJCS8qVHJhbnNtaXQgRklGTyBPdmVyZmxvdyAqLwpAQCAtNTE1LDEwICs1MTUsMTAgQEAKIAlSVExfSU1SX1JYRk9WVywJCS8qUmVjZWl2ZSBGSUZPIE92ZXJmbG93ICovCiAJUlRMX0lNUl9SRFUsCQkvKlJlY2VpdmUgRGVzY3JpcHRvciBVbmF2YWlsYWJsZSAqLwogCVJUTF9JTVJfQVRJTUVORCwJLypGb3IgOTJDLEFUSU0gV2luZG93IEVuZCBJbnRlcnJ1cHQgKi8KLQlSVExfSU1SX0JET0ssCQkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgKi8KKwlSVExfSU1SX0JET0ssCQkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXB0ICovCiAJUlRMX0lNUl9ISUdIRE9LLAkvKkhpZ2ggUXVldWUgRE1BIE9LIEludGVycnVwdCAqLwogCVJUTF9JTVJfQ09NRE9LLAkJLypDb21tYW5kIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQqLwotCVJUTF9JTVJfVEJET0ssCQkvKlRyYW5zbWl0IEJlYWNvbiBPSyBpbnRlcnJ1cCAqLworCVJUTF9JTVJfVEJET0ssCQkvKlRyYW5zbWl0IEJlYWNvbiBPSyBpbnRlcnJ1cHQgKi8KIAlSVExfSU1SX01HTlRET0ssCS8qTWFuYWdlbWVudCBRdWV1ZSBETUEgT0sgSW50ZXJydXB0ICovCiAJUlRMX0lNUl9UQkRFUiwJCS8qRm9yIDkyQyxUcmFuc21pdCBCZWFjb24gRXJyb3IgSW50ZXJydXB0ICovCiAJUlRMX0lNUl9CS0RPSywJCS8qQUNfQksgRE1BIE9LIEludGVycnVwdCAqLwpAQCAtNjQ1LDkgKzY0NSw5IEBACiB9OwogCiBlbnVtIHJhdHJfdGFibGVfbW9kZSB7Ci0JUkFUUl9JTlhfV0lSRUxFU1NfTkdCID0gMCwJCS8vIEJHTiA0MCBNaHogMlNTIDFTUwotCVJBVFJfSU5YX1dJUkVMRVNTX05HID0gMSwJCS8vIEdOIG9yIE4KLQlSQVRSX0lOWF9XSVJFTEVTU19OQiA9IDIsCQkvLyBCR04gMjAgTWh6IDJTUyAxU1MgIG9yIEJOCisJUkFUUl9JTlhfV0lSRUxFU1NfTkdCID0gMCwJCS8qIEJHTiA0MCBNaHogMlNTIDFTUyAqLworCVJBVFJfSU5YX1dJUkVMRVNTX05HID0gMSwJCS8qIEdOIG9yIE4gKi8KKwlSQVRSX0lOWF9XSVJFTEVTU19OQiA9IDIsCQkvKiBCR04gMjAgTWh6IDJTUyAxU1MgIG9yIEJOICovCiAJUkFUUl9JTlhfV0lSRUxFU1NfTiA9IDMsCiAJUkFUUl9JTlhfV0lSRUxFU1NfR0IgPSA0LAogCVJBVFJfSU5YX1dJUkVMRVNTX0cgPSA1LApAQCAtNzU5LDcgKzc1OSw3IEBACiAJc3RydWN0IHJ0bF9odF9hZ2cgYWdnOwogfTsKIAotc3RydWN0IHJzc2lfc3Rheworc3RydWN0IHJzc2lfc3RhIHsKIAlsb25nIHVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGI7CiB9OwogCkBAIC04OTksNyArODk5LDcgQEAKIAl1MTYgcmVnXzJnaHpfY3RsOwogfTsKIAotc3RydWN0IGR5bmFtaWNfcHJpbWFyeV9jY2F7CitzdHJ1Y3QgZHluYW1pY19wcmltYXJ5X2NjYSB7CiAJdTggcHJpY2NhX2ZsYWc7CiAJdTggaW50Zl9mbGFnOwogCXU4IGludGZfdHlwZTsKQEAgLTkzOSwxNCArOTM5LDE0IEBACiAJUDJQX1BTX0VOQUJMRSA9IDEsCiAJUDJQX1BTX1NDQU4gPSAyLAogCVAyUF9QU19TQ0FOX0RPTkUgPSAzLAotCVAyUF9QU19BTExTVEFTTEVFUCA9IDQsIC8vIGZvciBQMlAgR08KKwlQMlBfUFNfQUxMU1RBU0xFRVAgPSA0LCAvKiBmb3IgUDJQIEdPICovCiB9OwogCiBlbnVtIHAycF9wc19tb2RlIHsKIAlQMlBfUFNfTk9ORSA9IDAsCiAJUDJQX1BTX0NUV0lORE9XID0gMSwKIAlQMlBfUFNfTk9BID0gMiwKLQlQMlBfUFNfTUlYID0gMywgLy8gQ1RXaW5kb3cgYW5kIE5vQQorCVAyUF9QU19NSVggPSAzLCAvKiBDVFdpbmRvdyBhbmQgTm9BICovCiB9OwogCiBzdHJ1Y3QgcnRsX3AycF9wc19pbmZvIHsKQEAgLTk2OSw3ICs5NjksNyBAQAogCXUzMiBub2Ffc3RhcnRfdGltZVtQMlBfTUFYX05PQV9OVU1dOwogfTsKIAotIHN0cnVjdCBwMnBfcHNfb2ZmbG9hZF90IHsKK3N0cnVjdCBwMnBfcHNfb2ZmbG9hZF90IHsKIAl1OCBPZmZsb2FkX0VuOjE7CiAJdTggcm9sZToxOyAvKiAxOiBPd25lciwgMDogQ2xpZW50ICovCiAJdTggQ1RXaW5kb3dfRW46MTsKQEAgLTk4MSw3ICs5ODEsNyBAQAogfTsKIAogI2RlZmluZSBJUUtfTUFUUklYX1JFR19OVU0JOAotI2RlZmluZSBJUUtfTUFUUklYX1NFVFRJTkdTX05VTQkgKDE0KzI0KzIxKSAvLyBDaGFubmVsc18yXzRHX05VTSArIENoYW5uZWxzXzVHXzIwTV9OVU0gKyBDaGFubmVsc181RworI2RlZmluZSBJUUtfTUFUUklYX1NFVFRJTkdTX05VTQkgKDE0KzI0KzIxKSAvKiBDaGFubmVsc18yXzRHX05VTSArIENoYW5uZWxzXzVHXzIwTV9OVU0gKyBDaGFubmVsc181RyAqLwogc3RydWN0IGlxa19tYXRyaXhfcmVncyB7CiAJYm9vbCBiX2lxa19kb25lOwogCWxvbmcgdmFsdWVbMV1bSVFLX01BVFJJWF9SRUdfTlVNXTsKQEAgLTEwNzQsMTIgKzEwNzQsMTIgQEAKIAllbnVtIHJ0X3BvbGFyaXR5X2N0bCBwb2xhcml0eV9jdGw7CiB9OwogCi0jZGVmaW5lIFJUTF9BR0dfU1RPUCAJCQkJCQkwCisjZGVmaW5lIFJUTF9BR0dfU1RPUAkJCQkJCTAKICNkZWZpbmUgUlRMX0FHR19QUk9HUkVTUwkJCQkJMQotI2RlZmluZSBSVExfQUdHX1NUQVJUIAkJCQkJCTIKKyNkZWZpbmUgUlRMX0FHR19TVEFSVAkJCQkJCTIKICNkZWZpbmUgUlRMX0FHR19PUEVSQVRJT05BTAkJCQkJMwotI2RlZmluZSBSVExfUlhfQUdHX1NUQVJUIAkJCQkJMQotI2RlZmluZSBSVExfUlhfQUdHX1NUT1AgCQkJCQkwCisjZGVmaW5lIFJUTF9SWF9BR0dfU1RBUlQJCQkJCTEKKyNkZWZpbmUgUlRMX1JYX0FHR19TVE9QCQkJCQkJMAogCiBzdHJ1Y3QgcnRsX3ByaXY7CiBzdHJ1Y3QgcnRsX2lvIHsKQEAgLTEwOTIsMTMgKzEwOTIsMTMgQEAKIAkvKlBDSSBJTyBtYXAgKi8KIAl1bnNpZ25lZCBsb25nIHBjaV9iYXNlX2FkZHI7CS8qZGV2aWNlIEkvTyBhZGRyZXNzICovCiAKLQl2b2lkICgqd3JpdGU4X2FzeW5jKSAoc3RydWN0IHJ0bF9wcml2ICogcnRscHJpdiwgdTMyIGFkZHIsIHU4IHZhbCk7Ci0Jdm9pZCAoKndyaXRlMTZfYXN5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKiBydGxwcml2LCB1MzIgYWRkciwgdTE2IHZhbCk7Ci0Jdm9pZCAoKndyaXRlMzJfYXN5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKiBydGxwcml2LCB1MzIgYWRkciwgdTMyIHZhbCk7CisJdm9pZCAoKndyaXRlOF9hc3luYykoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1MzIgYWRkciwgdTggdmFsKTsKKwl2b2lkICgqd3JpdGUxNl9hc3luYykoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1MzIgYWRkciwgdTE2IHZhbCk7CisJdm9pZCAoKndyaXRlMzJfYXN5bmMpKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIsIHUzMiB2YWwpOwogCi0JdTgoKnJlYWQ4X3N5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKiBydGxwcml2LCB1MzIgYWRkcik7Ci0JdTE2KCpyZWFkMTZfc3luYykgKHN0cnVjdCBydGxfcHJpdiAqIHJ0bHByaXYsIHUzMiBhZGRyKTsKLQl1MzIoKnJlYWQzMl9zeW5jKSAoc3RydWN0IHJ0bF9wcml2ICogcnRscHJpdiwgdTMyIGFkZHIpOworCXU4ICgqcmVhZDhfc3luYykoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1MzIgYWRkcik7CisJdTE2ICgqcmVhZDE2X3N5bmMpKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIpOworCXUzMiAoKnJlYWQzMl9zeW5jKShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyKTsKIAogfTsKIApAQCAtMTI1Niw3ICsxMjU2LDcgQEAKIAlib29sIHVzZV9kZWZhdWx0a2V5OwogCS8qRW5jcnlwdGlvbiBBbGdvcml0aG0gZm9yIFVuaWNhc3QgUGFja2V0ICovCiAJZW51bSBydF9lbmNfYWxnIHBhaXJ3aXNlX2VuY19hbGdvcml0aG07Ci0JLypFbmNyeXB0aW9uIEFsZ29yaXRobSBmb3IgQnJvY2FzdC9NdWx0aWNhc3QgKi8KKwkvKkVuY3J5cHRpb24gQWxnb3JpdGhtIGZvciBCcm9hZGNhc3QvTXVsdGljYXN0ICovCiAJZW51bSBydF9lbmNfYWxnIGdyb3VwX2VuY19hbGdvcml0aG07CiAJLypDYW0gRW50cnkgQml0bWFwICovCiAJdTMyIGh3c2VjX2NhbV9iaXRtYXA7CkBAIC0xMzE3LDkgKzEzMTcsOSBAQAogCiB9OwogCi0jZGVmaW5lIEFTU09DSUFURV9FTlRSWV9OVU0JMzIrMQorI2RlZmluZSBBU1NPQ0lBVEVfRU5UUllfTlVNCSgzMisxKQogCi1zdHJ1Y3QgZmFzdF9hbnRfdHJhaW5uaW5neworc3RydWN0IGZhc3RfYW50X3RyYWlubmluZyB7CiAJdTggYnNzaWRbNl07CiAJdTggYW50c2VsX3J4X2tlZXBfMDsKIAl1OCBhbnRzZWxfcnhfa2VlcF8xOwpAQCAtMTQyNywxOSArMTQyNywxOSBAQAogCWNoYXIgYmJfc3dpbmdfZGlmZl81ZzsKIAogCXU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdjY2thX3BbREVMVEFfU1dJTkdJRFhfU0laRV07Ci0gICAgdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Nja2FfbltERUxUQV9TV0lOR0lEWF9TSVpFXTsKLSAgICB1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYl9wW0RFTFRBX1NXSU5HSURYX1NJWkVdOworCXU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdjY2thX25bREVMVEFfU1dJTkdJRFhfU0laRV07CisJdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Nja2JfcFtERUxUQV9TV0lOR0lEWF9TSVpFXTsKIAl1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYl9uW0RFTFRBX1NXSU5HSURYX1NJWkVdOwogCXU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdhX3BbREVMVEFfU1dJTkdJRFhfU0laRV07Ci0gICAJdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2FfbltERUxUQV9TV0lOR0lEWF9TSVpFXTsKLSAgICB1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYl9wW0RFTFRBX1NXSU5HSURYX1NJWkVdOwotICAgCXU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdiX25bREVMVEFfU1dJTkdJRFhfU0laRV07Ci0gICAgdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYV9wW0JBTkRfTlVNXVtERUxUQV9TV0lOR0lEWF9TSVpFXTsKLSAgICB1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfNWdhX25bQkFORF9OVU1dW0RFTFRBX1NXSU5HSURYX1NJWkVdOwotICAgIHU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2JfcFtCQU5EX05VTV1bREVMVEFfU1dJTkdJRFhfU0laRV07Ci0gICAgdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYl9uW0JBTkRfTlVNXVtERUxUQV9TV0lOR0lEWF9TSVpFXTsKLSAgICB1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYV9wXzgxODhlW0RFTFRBX1NXSU5HSURYX1NJWkVdOwotICAgIHU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdhX25fODE4OGVbREVMVEFfU1dJTkdJRFhfU0laRV07CisJdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2FfbltERUxUQV9TV0lOR0lEWF9TSVpFXTsKKwl1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYl9wW0RFTFRBX1NXSU5HSURYX1NJWkVdOworCXU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdiX25bREVMVEFfU1dJTkdJRFhfU0laRV07CisJdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYV9wW0JBTkRfTlVNXVtERUxUQV9TV0lOR0lEWF9TSVpFXTsKKwl1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfNWdhX25bQkFORF9OVU1dW0RFTFRBX1NXSU5HSURYX1NJWkVdOworCXU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2JfcFtCQU5EX05VTV1bREVMVEFfU1dJTkdJRFhfU0laRV07CisJdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYl9uW0JBTkRfTlVNXVtERUxUQV9TV0lOR0lEWF9TSVpFXTsKKwl1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYV9wXzgxODhlW0RFTFRBX1NXSU5HSURYX1NJWkVdOworCXU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdhX25fODE4OGVbREVMVEFfU1dJTkdJRFhfU0laRV07CiAKIAogCS8qIERNU1AgKi8KQEAgLTE0NTEsNyArMTQ1MSw3IEBACiAJc3RydWN0IGZhc3RfYW50X3RyYWlubmluZyBmYXRfdGFibGU7CiAKIAl1OAlyZXNwX3R4X3BhdGg7Ci0JdTggCXBhdGhfc2VsOworCXU4CXBhdGhfc2VsOwogCXUzMglwYXRoYV9zdW07CiAJdTMyCXBhdGhiX3N1bTsKIAl1MzIJcGF0aGFfY250OwpAQCAtMTY3MSw3ICsxNjcxLDYgQEAKIAl1OCByeF9taW1vX2V2bV9kYm1bNF07CiAJdTE2IGNmb19zaG9ydFs0XTsgCQkvKiBwZXItcGF0aCdzIENmb19zaG9ydCAqLwogCXUxNiBjZm9fdGFpbFs0XTsKLQogCXU4IHJ4X3B3cls0XTsgLyogcGVyLXBhdGgncyBwd2RiICovCiAJdTggcnhfc25yWzRdOyAvKiBwZXItcGF0aCdzIFNOUiAqLwogCXU4IGJhbmR3aWR0aDsKQEAgLTE2OTIsNyArMTY5MSw3IEBACiB9OwogCiBzdHJ1Y3QgcnRfbGlua19kZXRlY3QgewotCS8qIGNvdW50IGZvciByYW9taW5nICovCisJLyogY291bnQgZm9yIHJvYW1pbmcgKi8KIAl1MzIgYmNuX3J4X2lucGVyaW9kOwogCXUzMiByb2FtX3RpbWVzOwogCkBAIC0xNzU2LDQ4ICsxNzU1LDQ4IEBACiAJdm9pZCAqcHJveGltaXR5X3ByaXY7CiAJaW50ICgqcHJveGltX3J4KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHJ0bF9zdGF0cyAqc3RhdHVzLAogCQkJIHN0cnVjdCBza19idWZmICpza2IpOwotCXU4ICAoKnByb3hpbV9nZXRfdmFyKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggdHlwZSk7CisJdTggKCpwcm94aW1fZ2V0X3Zhcikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHR5cGUpOwogfTsKIAogc3RydWN0IHJ0bF9oYWxfb3BzIHsKLQlpbnQgKCppbml0X3N3X3ZhcnMpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCXZvaWQgKCpkZWluaXRfc3dfdmFycykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0Jdm9pZCAoKnJlYWRfZWVwcm9tX2luZm8pIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCXZvaWQgKCppbnRlcnJ1cHRfcmVjb2duaXplZCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywKLQkJCQkgICAgICB1MzIgKiBwX2ludGEsIHUzMiAqIHBfaW50Yik7Ci0JaW50ICgqaHdfaW5pdCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0Jdm9pZCAoKmh3X2Rpc2FibGUpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCXZvaWQgKCpod19zdXNwZW5kKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQl2b2lkICgqaHdfcmVzdW1lKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQl2b2lkICgqZW5hYmxlX2ludGVycnVwdCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0Jdm9pZCAoKmRpc2FibGVfaW50ZXJydXB0KSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQlpbnQgKCpzZXRfbmV0d29ya190eXBlKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LAotCQkJCSBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUpOworCWludCAoKmluaXRfc3dfdmFycykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCpkZWluaXRfc3dfdmFycykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCpyZWFkX2VlcHJvbV9pbmZvKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKmludGVycnVwdF9yZWNvZ25pemVkKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgIHUzMiAqcF9pbnRhLCB1MzIgKnBfaW50Yik7CisJaW50ICgqaHdfaW5pdCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCpod19kaXNhYmxlKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKmh3X3N1c3BlbmQpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqaHdfcmVzdW1lKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKmVuYWJsZV9pbnRlcnJ1cHQpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqZGlzYWJsZV9pbnRlcnJ1cHQpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwlpbnQgKCpzZXRfbmV0d29ya190eXBlKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQllbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUpOwogCXZvaWQgKCpzZXRfY2hrX2Jzc2lkKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCSAgICAgIGJvb2wgY2hlY2tfYnNzaWQpOwotCXZvaWQgKCpzZXRfYndfbW9kZSkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywKLQkJCSAgICAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaF90eXBlKTsKLQkgdTgoKnN3aXRjaF9jaGFubmVsKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQl2b2lkICgqc2V0X3FvcykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgaW50IGFjaSk7Ci0Jdm9pZCAoKnNldF9iY25fcmVnKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQl2b2lkICgqc2V0X2Jjbl9pbnR2KSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQl2b2lkICgqdXBkYXRlX2ludGVycnVwdF9tYXNrKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LAotCQkJCSAgICAgICB1MzIgYWRkX21zciwgdTMyIHJtX21zcik7Ci0Jdm9pZCAoKmdldF9od19yZWcpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsIHU4IHZhcmlhYmxlLCB1OCAqIHZhbCk7Ci0Jdm9pZCAoKnNldF9od19yZWcpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsIHU4IHZhcmlhYmxlLCB1OCAqIHZhbCk7Ci0Jdm9pZCAoKnVwZGF0ZV9yYXRlX3RibCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywKLQkJCQkgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTggcnNzaV9sZXZlbCk7Ci0Jdm9pZCAoKnByZV9maWxsX3R4X2JkX2Rlc2MpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKnR4X2JkX2Rlc2MsCi0JCQkJICAgICB1OCAqZGVzYywgdTggcXVldWVfaW5kZXgsCi0JCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBkbWFfYWRkcl90IGFkZHIpOwotCXUxNiAoKnJ4X2Rlc2NfYnVmZl9yZW1haW5lZF9jbnQpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkJICB1OCBxdWV1ZV9pbmRleCk7Ci0Jdm9pZCAoKnJ4X2NoZWNrX2RtYV9vaykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqaGVhZGVyX2Rlc2MsCi0JCQkJIHU4IHF1ZXVlX2luZGV4KTsKLQl2b2lkICgqZmlsbF90eF9kZXNjKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKiBoZHIsCi0JCQkgICAgICB1OCAqIHBkZXNjX3R4LCB1OCAqIHBiZF9kZXNjLAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICogaW5mbywKKwl2b2lkICgqc2V0X2J3X21vZGUpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hfdHlwZSk7CisJdTggKCpzd2l0Y2hfY2hhbm5lbCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCpzZXRfcW9zKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgaW50IGFjaSk7CisJdm9pZCAoKnNldF9iY25fcmVnKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKnNldF9iY25faW50dikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCp1cGRhdGVfaW50ZXJydXB0X21hc2spKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgIHUzMiBhZGRfbXNyLCB1MzIgcm1fbXNyKTsKKwl2b2lkICgqZ2V0X2h3X3JlZykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHZhcmlhYmxlLCB1OCAqdmFsKTsKKwl2b2lkICgqc2V0X2h3X3JlZykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHZhcmlhYmxlLCB1OCAqdmFsKTsKKwl2b2lkICgqdXBkYXRlX3JhdGVfdGJsKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1OCByc3NpX2xldmVsKTsKKwl2b2lkICgqcHJlX2ZpbGxfdHhfYmRfZGVzYykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICp0eF9iZF9kZXNjLAorCQkJCSAgICB1OCAqZGVzYywgdTggcXVldWVfaW5kZXgsCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIGRtYV9hZGRyX3QgYWRkcik7CisJdTE2ICgqcnhfZGVzY19idWZmX3JlbWFpbmVkX2NudCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSB1OCBxdWV1ZV9pbmRleCk7CisJdm9pZCAoKnJ4X2NoZWNrX2RtYV9vaykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICpoZWFkZXJfZGVzYywKKwkJCQl1OCBxdWV1ZV9pbmRleCk7CisJdm9pZCAoKmZpbGxfdHhfZGVzYykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQkgICAgIHU4ICpwZGVzY190eCwgdTggKnBiZF9kZXNjLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCiAvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCiAjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDcsMCkpCiAvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLwpAQCAtMTgwNSw3NCArMTgwNCw3NyBAQAogLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLwogI2VuZGlmCiAvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLwotCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKiBza2IsIHU4IGh3X3F1ZXVlLAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggaHdfcXVldWUsCiAJCQkgICAgICBzdHJ1Y3QgcnRsX3RjYl9kZXNjICpwdGNiX2Rlc2MpOwotCXZvaWQgKCpmaWxsX3R4X2NtZGRlc2MpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsIHU4ICogcGRlc2MsCi0JCQkJIGJvb2wgYl9maXJzdHNlZywgYm9vbCBiX2xhc3RzZWcsCi0JCQkJIHN0cnVjdCBza19idWZmICogc2tiKTsKLQkgYm9vbCgqcXVlcnlfcnhfZGVzYykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywKLQkJCSAgICAgICBzdHJ1Y3QgcnRsX3N0YXRzICogc3RhdHVzLAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICogcnhfc3RhdHVzLAotCQkJICAgICAgIHU4ICogcGRlc2MsIHN0cnVjdCBza19idWZmICogc2tiKTsKLQl2b2lkICgqc2V0X2NoYW5uZWxfYWNjZXNzKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQkgYm9vbCgqcmFkaW9fb25vZmZfY2hlY2tpbmcpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsIHU4ICogdmFsaWQpOwotCXZvaWQgKCpkbV93YXRjaGRvZykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0Jdm9pZCAoKnNjYW5fb3BlcmF0aW9uX2JhY2t1cCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgdTggb3BlcmF0aW9uKTsKLQkgYm9vbCgqc2V0X3JmX3Bvd2VyX3N0YXRlKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LAotCQkJCSAgICBlbnVtIHJmX3B3cnN0YXRlIHJmcHdyX3N0YXRlKTsKLQl2b2lkICgqbGVkX2NvbnRyb2wpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsCi0JCQkgICAgIGVudW0gbGVkX2N0bF9tb2RlIGxlZGFjdGlvbik7Ci0Jdm9pZCAoKnNldF9kZXNjKSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICogcGRlc2MsIGJvb2wgaXN0eCwKLQkJCSAgdTggZGVzY19uYW1lLCB1OCAqIHZhbCk7Ci0JIHUzMigqZ2V0X2Rlc2MpICh1OCAqIHBkZXNjLCBib29sIGlzdHgsIHU4IGRlc2NfbmFtZSk7Ci0JYm9vbCAoKmlzX3R4X2Rlc2NfY2xvc2VkKSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgdTggaHdfcXVldWUsIHUxNiBpbmRleCk7Ci0Jdm9pZCAoKnR4X3BvbGxpbmcpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsIHU4IGh3X3F1ZXVlKTsKLQl2b2lkICgqZW5hYmxlX2h3X3NlYykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0Jdm9pZCAoKnNldF9rZXkpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsIHUzMiBrZXlfaW5kZXgsCi0JCQkgdTggKiBwX21hY2FkZHIsIGJvb2wgaXNfZ3JvdXAsIHU4IGVuY19hbGdvLAotCQkJIGJvb2wgaXNfd2Vwa2V5LCBib29sIGNsZWFyX2FsbCk7Ci0Jdm9pZCAoKmluaXRfc3dfbGVkcykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0JIHUzMigqZ2V0X2JicmVnKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2spOwotCXZvaWQgKCpzZXRfYmJyZWcpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsIHUzMiByZWdhZGRyLCB1MzIgYml0bWFzaywKLQkJCSAgIHUzMiBkYXRhKTsKLQkgdTMyKCpnZXRfcmZyZWcpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsIGVudW0gcmFkaW9fcGF0aCByZnBhdGgsCi0JCQkgIHUzMiByZWdhZGRyLCB1MzIgYml0bWFzayk7Ci0Jdm9pZCAoKnNldF9yZnJlZykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgZW51bSByYWRpb19wYXRoIHJmcGF0aCwKLQkJCSAgIHUzMiByZWdhZGRyLCB1MzIgYml0bWFzaywgdTMyIGRhdGEpOworCXZvaWQgKCpmaWxsX3R4X2NtZGRlc2MpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqcGRlc2MsCisJCQkJYm9vbCBiX2ZpcnN0c2VnLCBib29sIGJfbGFzdHNlZywKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwlib29sICgqcXVlcnlfcnhfZGVzYykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgICBzdHJ1Y3QgcnRsX3N0YXRzICpzdGF0dXMsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHVzLAorCQkJICAgICAgdTggKnBkZXNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwl2b2lkICgqc2V0X2NoYW5uZWxfYWNjZXNzKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJYm9vbCAoKnJhZGlvX29ub2ZmX2NoZWNraW5nKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKnZhbGlkKTsKKwl2b2lkICgqZG1fd2F0Y2hkb2cpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqc2Nhbl9vcGVyYXRpb25fYmFja3VwKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggb3BlcmF0aW9uKTsKKwlib29sICgqc2V0X3JmX3Bvd2VyX3N0YXRlKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICBlbnVtIHJmX3B3cnN0YXRlIHJmcHdyX3N0YXRlKTsKKwl2b2lkICgqbGVkX2NvbnRyb2wpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgIGVudW0gbGVkX2N0bF9tb2RlIGxlZGFjdGlvbik7CisJdm9pZCAoKnNldF9kZXNjKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKnBkZXNjLCBib29sIGlzdHgsCisJCQkgdTggZGVzY19uYW1lLCB1OCAqdmFsKTsKKwl1MzIgKCpnZXRfZGVzYykodTggKnBkZXNjLCBib29sIGlzdHgsIHU4IGRlc2NfbmFtZSk7CisJYm9vbCAoKmlzX3R4X2Rlc2NfY2xvc2VkKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgIHU4IGh3X3F1ZXVlLCB1MTYgaW5kZXgpOworCXZvaWQgKCp0eF9wb2xsaW5nKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggaHdfcXVldWUpOworCXZvaWQgKCplbmFibGVfaHdfc2VjKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKnNldF9rZXkpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIga2V5X2luZGV4LAorCQkJdTggKnBfbWFjYWRkciwgYm9vbCBpc19ncm91cCwgdTggZW5jX2FsZ28sCisJCQlib29sIGlzX3dlcGtleSwgYm9vbCBjbGVhcl9hbGwpOworCXZvaWQgKCppbml0X3N3X2xlZHMpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl1MzIgKCpnZXRfYmJyZWcpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2spOworCXZvaWQgKCpzZXRfYmJyZWcpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2ssCisJCQkgIHUzMiBkYXRhKTsKKwl1MzIgKCpnZXRfcmZyZWcpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBlbnVtIHJhZGlvX3BhdGggcmZwYXRoLAorCQkJIHUzMiByZWdhZGRyLCB1MzIgYml0bWFzayk7CisJdm9pZCAoKnNldF9yZnJlZykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gcmFkaW9fcGF0aCByZnBhdGgsCisJCQkgIHUzMiByZWdhZGRyLCB1MzIgYml0bWFzaywgdTMyIGRhdGEpOwogCXZvaWQgKCphbGxvd19hbGxfZGVzdGFkZHIpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQlib29sIGFsbG93X2FsbF9kYSwgYm9vbCB3cml0ZV9pbnRvX3JlZyk7Ci0Jdm9pZCAoKmxpbmtlZF9zZXRfcmVnKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQl2b2lkICgqY2hlY2tfc3dpdGNoX3RvX2RtZHApIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCXZvaWQgKCpkdWFsbWFjX2Vhc3lfY29uY3VycmVudCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKLQl2b2lkICgqZHVhbG1hY19zd2l0Y2hfdG9fZG1kcCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKLQl2b2lkICgqYzJoX2NvbW1hbmRfaGFuZGxlKSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwotCXZvaWQgKCpidF93aWZpX21lZGlhX3N0YXR1c19ub3RpZnkpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBtc3RhdGUpOwotCXZvaWQgKCpidF90dXJuX29mZl9idF9jb2V4aXN0X2JlZm9yZV9lbnRlcl9scHMpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Ci0Jdm9pZCAoKmZpbGxfaDJjX2NtZCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBlbGVtZW50X2lkLAotCQkJICAgICAgdTMyIGNtZF9sZW4sIHU4ICpwX2NtZGJ1ZmZlcik7Ci0JYm9vbCAoKmdldF9idGNfc3RhdHVzKSAodm9pZCk7Ci0gIAl1MzIgKCpyeF9jb21tYW5kX3BhY2tldF9oYW5kbGVyKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHJ0bF9zdGF0cyBzdGF0dXMsIHN0cnVjdCBza19idWZmICpza2IpOworCQkJCSAgIGJvb2wgYWxsb3dfYWxsX2RhLCBib29sIHdyaXRlX2ludG9fcmVnKTsKKwl2b2lkICgqbGlua2VkX3NldF9yZWcpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqY2hlY2tfc3dpdGNoX3RvX2RtZHApKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqZHVhbG1hY19lYXN5X2NvbmN1cnJlbnQpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqZHVhbG1hY19zd2l0Y2hfdG9fZG1kcCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCpjMmhfY29tbWFuZF9oYW5kbGUpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqYnRfd2lmaV9tZWRpYV9zdGF0dXNfbm90aWZ5KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJICAgIGJvb2wgbXN0YXRlKTsKKwl2b2lkICgqYnRfdHVybl9vZmZfYnRfY29leGlzdF9iZWZvcmVfZW50ZXJfbHBzKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKmZpbGxfaDJjX2NtZCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGVsZW1lbnRfaWQsCisJCQkgICAgIHUzMiBjbWRfbGVuLCB1OCAqcF9jbWRidWZmZXIpOworCWJvb2wgKCpnZXRfYnRjX3N0YXR1cykodm9pZCk7CisJdTMyICgqcnhfY29tbWFuZF9wYWNrZXRfaGFuZGxlcikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSBzdHJ1Y3QgcnRsX3N0YXRzIHN0YXR1cywKKwkJCQkJIHN0cnVjdCBza19idWZmICpza2IpOwogfTsKIAogc3RydWN0IHJ0bF9pbnRmX29wcyB7CiAJLypjb20gKi8KIAl2b2lkICgqcmVhZF9lZnVzZV9ieXRlKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IF9vZmZzZXQsIHU4ICpwYnVmKTsKLQlpbnQgKCphZGFwdGVyX3N0YXJ0KSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQl2b2lkICgqYWRhcHRlcl9zdG9wKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKKwlpbnQgKCphZGFwdGVyX3N0YXJ0KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKmFkYXB0ZXJfc3RvcCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogCWJvb2wgKCpjaGVja19idWRkeV9wcml2KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCXN0cnVjdCBydGxfcHJpdiAqKmJ1ZGR5X3ByaXYpOworCQkJCSBzdHJ1Y3QgcnRsX3ByaXYgKipidWRkeV9wcml2KTsKIAogLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLwogI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLDcsMCkpCi0JaW50ICgqYWRhcHRlcl90eCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgc3RydWN0IHNrX2J1ZmYgKiBza2IsCi0JCQkgICBzdHJ1Y3QgcnRsX3RjYl9kZXNjICpwdGNiX2Rlc2MpOworCWludCAoKmFkYXB0ZXJfdHgpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBzdHJ1Y3QgcnRsX3RjYl9kZXNjICpwdGNiX2Rlc2MpOwogI2Vsc2UKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCi0JaW50ICgqYWRhcHRlcl90eCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICBzdHJ1Y3QgcnRsX3RjYl9kZXNjICpwdGNiX2Rlc2MpOworCWludCAoKmFkYXB0ZXJfdHgpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBzdHJ1Y3QgcnRsX3RjYl9kZXNjICpwdGNiX2Rlc2MpOwogLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLwogI2VuZGlmCiAvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLwpAQCAtMTg4MSwyMiArMTg4MywyMiBAQAogI2Vsc2UKIAl2b2lkICgqZmx1c2gpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGRyb3ApOwogI2VuZGlmCi0JaW50ICgqcmVzZXRfdHJ4X3JpbmcpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOworCWludCAoKnJlc2V0X3RyeF9yaW5nKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiAvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCiAjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsNywwKSkKLQlib29sICgqd2FpdHFfaW5zZXJ0KSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpOworCWJvb2wgKCp3YWl0cV9pbnNlcnQpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKICNlbHNlCiAvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLwotCWJvb2wgKCp3YWl0cV9pbnNlcnQpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwlib29sICgqd2FpdHFfaW5zZXJ0KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCiAjZW5kaWYKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCiAKIAkvKnBjaSAqLwotCXZvaWQgKCpkaXNhYmxlX2FzcG0pIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCXZvaWQgKCplbmFibGVfYXNwbSkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7CisJdm9pZCAoKmRpc2FibGVfYXNwbSkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCplbmFibGVfYXNwbSkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogCiAJLyp1c2IgKi8KIH07CkBAIC0yMDI3LDIxICsyMDI5LDIxIEBACiB9OwogCiBzdHJ1Y3QgcnRsX2J0Y19vcHMgewotCXZvaWQgKCpidGNfaW5pdF92YXJpYWJsZXMpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpOwotCXZvaWQgKCpidGNfaW5pdF9oYWxfdmFycykgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7Ci0Jdm9pZCAoKmJ0Y19pbml0X2h3X2NvbmZpZykgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7Ci0Jdm9pZCAoKmJ0Y19pcHNfbm90aWZ5KSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1OCB0eXBlKTsKLQl2b2lkICgqYnRjX3NjYW5fbm90aWZ5KSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1OCBzY2FudHlwZSk7Ci0Jdm9pZCAoKmJ0Y19jb25uZWN0X25vdGlmeSkgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTggYWN0aW9uKTsKLQl2b2lkICgqYnRjX21lZGlhc3RhdHVzX25vdGlmeSkgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwKLQkJCQkJZW51bSBydF9tZWRpYV9zdGF0dXMgbXN0YXR1cyk7Ci0Jdm9pZCAoKmJ0Y19wZXJpb2RpY2FsKSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKLQl2b2lkICgqYnRjX2hhbHRfbm90aWZ5KSAodm9pZCk7Ci0Jdm9pZCAoKmJ0Y19idGluZm9fbm90aWZ5KSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LAotCQkJCSAgIHU4ICogdG1wX2J1ZiwgdTggbGVuZ3RoKTsKLQlib29sICgqYnRjX2lzX2xpbWl0ZWRfZGlnKSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKLQlib29sICgqYnRjX2lzX2Rpc2FibGVfZWRjYV90dXJibykgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7Ci0JYm9vbCAoKmJ0Y19pc19idF9kaXNhYmxlZCkgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7CisJdm9pZCAoKmJ0Y19pbml0X3ZhcmlhYmxlcykoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKKwl2b2lkICgqYnRjX2luaXRfaGFsX3ZhcnMpKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7CisJdm9pZCAoKmJ0Y19pbml0X2h3X2NvbmZpZykoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKKwl2b2lkICgqYnRjX2lwc19ub3RpZnkpKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTggdHlwZSk7CisJdm9pZCAoKmJ0Y19zY2FuX25vdGlmeSkoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1OCBzY2FudHlwZSk7CisJdm9pZCAoKmJ0Y19jb25uZWN0X25vdGlmeSkoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1OCBhY3Rpb24pOworCXZvaWQgKCpidGNfbWVkaWFzdGF0dXNfbm90aWZ5KShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsCisJCQkJICAgICAgIGVudW0gcnRfbWVkaWFfc3RhdHVzIG1zdGF0dXMpOworCXZvaWQgKCpidGNfcGVyaW9kaWNhbCkoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKKwl2b2lkICgqYnRjX2hhbHRfbm90aWZ5KSh2b2lkKTsKKwl2b2lkICgqYnRjX2J0aW5mb19ub3RpZnkpKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwKKwkJCQkgIHU4ICp0bXBfYnVmLCB1OCBsZW5ndGgpOworCWJvb2wgKCpidGNfaXNfbGltaXRlZF9kaWcpKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7CisJYm9vbCAoKmJ0Y19pc19kaXNhYmxlX2VkY2FfdHVyYm8pKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7CisJYm9vbCAoKmJ0Y19pc19idF9kaXNhYmxlZCkoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKIH07CiAKIHN0cnVjdCBydGxfYnRfY29leGlzdCB7CkBAIC0yMDg3LDcgKzIwODksNyBAQAogCiAJLyoKIAkgKmhhbF9jZmcgOiBmb3IgZGlmZiBjYXJkcwotCSAqaW50Zl9vcHMgOiBmb3IgZGlmZiBpbnRlcnJmYWNlIHVzYi9wY2llCisJICppbnRmX29wcyA6IGZvciBkaWZmIGludGVyZmFjZSB1c2IvcGNpZQogCSAqLwogCXN0cnVjdCBydGxfaGFsX2NmZyAqY2ZnOwogCXN0cnVjdCBydGxfaW50Zl9vcHMgKmludGZfb3BzOwpAQCAtMjEwNSw3ICsyMTA3LDcgQEAKIAkvKmZvciBidCBjb2V4aXN0IHVzZSovCiAJc3RydWN0IHJ0bF9idF9jb2V4aXN0IGJ0Y29leGlzdDsKIAotCS8qIHNlcGVyYXRlIDkyZWUgZnJvbSBvdGhlciBJQ3MsCisJLyogc2VwYXJhdGUgOTJlZSBmcm9tIG90aGVyIElDcywKIAkgICogOTJlZSB1c2UgbmV3IHRyeCBmbG93LiAqLwogCWJvb2wgdXNlX25ld190cnhfZmxvdzsKIAkvKlRoaXMgbXVzdCBiZSB0aGUgbGFzdCBpdGVtIHNvCkBAIC0yMTIwLDU3ICsyMTIyLDU3IEBACiAjZGVmaW5lIHJ0bF9oYWwocnRscHJpdikJKCYoKHJ0bHByaXYpLT5ydGxoYWwpKQogI2RlZmluZSBydGxfZWZ1c2UocnRscHJpdikJKCYoKHJ0bHByaXYpLT5lZnVzZSkpCiAjZGVmaW5lIHJ0bF9wc2MocnRscHJpdikJKCYoKHJ0bHByaXYpLT5wc2MpKQotI2RlZmluZSBydGxfc2VjKHJ0bHByaXYpIAkoJigocnRscHJpdiktPnNlYykpCi0jZGVmaW5lIHJ0bF9kbShydGxwcml2KQkoJigocnRscHJpdiktPmRtKSkKKyNkZWZpbmUgcnRsX3NlYyhydGxwcml2KQkoJigocnRscHJpdiktPnNlYykpCisjZGVmaW5lIHJ0bF9kbShydGxwcml2KQkJKCYoKHJ0bHByaXYpLT5kbSkpCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgQmx1ZXRvb3RoIENvLWV4aXN0YW5jZSBSZWxhdGVkCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBlbnVtIGJ0X2FudF9udW0gewotICAgICAgICBBTlRfWDIgPSAwLAotICAgICAgICBBTlRfWDEgPSAxLAorCUFOVF9YMiA9IDAsCisJQU5UX1gxID0gMSwKIH07CiAKIGVudW0gYnRfY29fdHlwZSB7Ci0gICAgICAgIEJUXzJXSVJFID0gMCwKLSAgICAgICAgQlRfSVNTQ18zV0lSRSA9IDEsCi0gICAgICAgIEJUX0FDQ0VMID0gMiwKLSAgICAgICAgQlRfQ1NSX0JDNCA9IDMsCi0gICAgICAgIEJUX0NTUl9CQzggPSA0LAotICAgICAgICBCVF9SVEw4NzU2ID0gNSwKLSAgICAgICAgQlRfUlRMODcyM0EgPSA2LAotICAgICAgICBCVF9SVEw4ODIxQSA9IDcsCi0gICAgICAgIEJUX1JUTDg3MjNCID0gOCwKLSAgICAgICAgQlRfUlRMODE5MkUgPSA5LAotICAgICAgICBCVF9SVEw4ODEyQSA9IDExLAorCUJUXzJXSVJFID0gMCwKKwlCVF9JU1NDXzNXSVJFID0gMSwKKwlCVF9BQ0NFTCA9IDIsCisJQlRfQ1NSX0JDNCA9IDMsCisJQlRfQ1NSX0JDOCA9IDQsCisJQlRfUlRMODc1NiA9IDUsCisJQlRfUlRMODcyM0EgPSA2LAorCUJUX1JUTDg4MjFBID0gNywKKwlCVF9SVEw4NzIzQiA9IDgsCisJQlRfUlRMODE5MkUgPSA5LAorCUJUX1JUTDg4MTJBID0gMTEsCiB9OwogCi1lbnVtIGJ0X3RvdGFsX2FudF9udW17CitlbnVtIGJ0X3RvdGFsX2FudF9udW0gewogCUFOVF9UT1RBTF9YMiA9IDAsCiAJQU5UX1RPVEFMX1gxID0gMQogfTsKIAogZW51bSBidF9jdXJfc3RhdGUgewotICAgICAgICBCVF9PRkYgPSAwLAotICAgICAgICBCVF9PTiA9IDEsCisJQlRfT0ZGID0gMCwKKwlCVF9PTiA9IDEsCiB9OwogCiBlbnVtIGJ0X3NlcnZpY2VfdHlwZSB7Ci0gICAgICAgIEJUX1NDTyA9IDAsCi0gICAgICAgIEJUX0EyRFAgPSAxLAotICAgICAgICBCVF9ISUQgPSAyLAotICAgICAgICBCVF9ISURfSURMRSA9IDMsCi0gICAgICAgIEJUX1NDQU4gPSA0LAotICAgICAgICBCVF9JRExFID0gNSwKLSAgICAgICAgQlRfT1RIRVJfQUNUSU9OID0gNiwKLSAgICAgICAgQlRfQlVTWSA9IDcsCi0gICAgICAgIEJUX09USEVSQlVTWSA9IDgsCi0gICAgICAgIEJUX1BBTiA9IDksCisJQlRfU0NPID0gMCwKKwlCVF9BMkRQID0gMSwKKwlCVF9ISUQgPSAyLAorCUJUX0hJRF9JRExFID0gMywKKwlCVF9TQ0FOID0gNCwKKwlCVF9JRExFID0gNSwKKwlCVF9PVEhFUl9BQ1RJT04gPSA2LAorCUJUX0JVU1kgPSA3LAorCUJUX09USEVSQlVTWSA9IDgsCisJQlRfUEFOID0gOSwKIH07CiAKIGVudW0gYnRfcmFkaW9fc2hhcmVkIHsKLSAgICAgICAgQlRfUkFESU9fU0hBUkVEID0gMCwKLSAgICAgICAgQlRfUkFESU9fSU5ESVZJRFVBTCA9IDEsCisJQlRfUkFESU9fU0hBUkVEID0gMCwKKwlCVF9SQURJT19JTkRJVklEVUFMID0gMSwKIH07CiAKIHN0cnVjdCBidF9jb2V4aXN0X2luZm8gewpAQCAtMjI1NSwxMSArMjI1NywxMSBAQAogCiAvKiBXcml0ZSBkYXRhIHRvIG1lbW9yeSAqLwogI2RlZmluZSBXUklURUVGMUJZVEUoX3B0ciwgX3ZhbCkJXAotCSgqKCh1OCAqKShfcHRyKSkpPUVGMUJZVEUoX3ZhbCkKKwkoKCooKHU4ICopKF9wdHIpKSkgPSBFRjFCWVRFKF92YWwpKQogI2RlZmluZSBXUklURUVGMkJZVEUoX3B0ciwgX3ZhbCkJXAotCSgqKCh1MTYgKikoX3B0cikpKT1FRjJCWVRFKF92YWwpCisJKCgqKCh1MTYgKikoX3B0cikpKSA9IEVGMkJZVEUoX3ZhbCkpCiAjZGVmaW5lIFdSSVRFRUY0QllURShfcHRyLCBfdmFsKQlcCi0JKCooKHUzMiAqKShfcHRyKSkpPUVGNEJZVEUoX3ZhbCkKKwkoKCooKHUzMiAqKShfcHRyKSkpID0gRUY0QllURShfdmFsKSkKIAogLypFeGFtcGxlOgogQklUX0xFTl9NQVNLXzMyKDApID0+IDB4MDAwMDAwMDAKQEAgLTIyOTgsMTcgKzIzMDAsMTcgQEAKIHZhbHVlIHRvIGhvc3QgYnl0ZSBvcmRlcmluZy4qLwogI2RlZmluZSBMRV9CSVRTX1RPXzRCWVRFKF9fcHN0YXJ0LCBfX2JpdG9mZnNldCwgX19iaXRsZW4pIFwKIAkoIFwKLQkJKCBMRV9QNEJZVEVfVE9fSE9TVF80QllURShfX3BzdGFydCkgPj4gKF9fYml0b2Zmc2V0KSApICAmIFwKKwkJKExFX1A0QllURV9UT19IT1NUXzRCWVRFKF9fcHN0YXJ0KSA+PiAoX19iaXRvZmZzZXQpKSAgJiBcCiAJCUJJVF9MRU5fTUFTS18zMihfX2JpdGxlbikgXAogCSkKICNkZWZpbmUgTEVfQklUU19UT18yQllURShfX3BzdGFydCwgX19iaXRvZmZzZXQsIF9fYml0bGVuKSBcCiAJKCBcCi0JCSggTEVfUDJCWVRFX1RPX0hPU1RfMkJZVEUoX19wc3RhcnQpID4+IChfX2JpdG9mZnNldCkgKSAmIFwKKwkJKExFX1AyQllURV9UT19IT1NUXzJCWVRFKF9fcHN0YXJ0KSA+PiAoX19iaXRvZmZzZXQpKSAmIFwKIAkJQklUX0xFTl9NQVNLXzE2KF9fYml0bGVuKSBcCiAJKQogI2RlZmluZSBMRV9CSVRTX1RPXzFCWVRFKF9fcHN0YXJ0LCBfX2JpdG9mZnNldCwgX19iaXRsZW4pIFwKIAkoIFwKLQkJKCBMRV9QMUJZVEVfVE9fSE9TVF8xQllURShfX3BzdGFydCkgPj4gKF9fYml0b2Zmc2V0KSApICYgXAorCQkoTEVfUDFCWVRFX1RPX0hPU1RfMUJZVEUoX19wc3RhcnQpID4+IChfX2JpdG9mZnNldCkpICYgXAogCQlCSVRfTEVOX01BU0tfOChfX2JpdGxlbikgXAogCSkKIApAQCAtMjMxOCwxNyArMjMyMCwxNyBAQAogI2RlZmluZSBMRV9CSVRTX0NMRUFSRURfVE9fNEJZVEUoX19wc3RhcnQsIF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgXAogCSggXAogCQlMRV9QNEJZVEVfVE9fSE9TVF80QllURShfX3BzdGFydCkgICYgXAotCQkoIH5CSVRfT0ZGU0VUX0xFTl9NQVNLXzMyKF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgKSBcCisJCSh+QklUX09GRlNFVF9MRU5fTUFTS18zMihfX2JpdG9mZnNldCwgX19iaXRsZW4pKSBcCiAJKQogI2RlZmluZSBMRV9CSVRTX0NMRUFSRURfVE9fMkJZVEUoX19wc3RhcnQsIF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgXAogCSggXAogCQlMRV9QMkJZVEVfVE9fSE9TVF8yQllURShfX3BzdGFydCkgJiBcCi0JCSggfkJJVF9PRkZTRVRfTEVOX01BU0tfMTYoX19iaXRvZmZzZXQsIF9fYml0bGVuKSApIFwKKwkJKH5CSVRfT0ZGU0VUX0xFTl9NQVNLXzE2KF9fYml0b2Zmc2V0LCBfX2JpdGxlbikpIFwKIAkpCiAjZGVmaW5lIExFX0JJVFNfQ0xFQVJFRF9UT18xQllURShfX3BzdGFydCwgX19iaXRvZmZzZXQsIF9fYml0bGVuKSBcCiAJKCBcCiAJCUxFX1AxQllURV9UT19IT1NUXzFCWVRFKF9fcHN0YXJ0KSAmIFwKLQkJKCB+QklUX09GRlNFVF9MRU5fTUFTS184KF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgKSBcCisJCSh+QklUX09GRlNFVF9MRU5fTUFTS184KF9fYml0b2Zmc2V0LCBfX2JpdGxlbikpIFwKIAkpCiAKIC8qRGVzY3JpcHRpb246CkBAIC0yMzM3LDE5ICsyMzM5LDE5IEBACiAJKigodTMyICopKF9fcHN0YXJ0KSkgPSBFRjRCWVRFIFwKIAkoIFwKIAkJTEVfQklUU19DTEVBUkVEX1RPXzRCWVRFKF9fcHN0YXJ0LCBfX2JpdG9mZnNldCwgX19iaXRsZW4pIHwgXAotCQkoICgoKHUzMilfX3ZhbCkgJiBCSVRfTEVOX01BU0tfMzIoX19iaXRsZW4pKSA8PCAoX19iaXRvZmZzZXQpIClcCisJCSgoKCh1MzIpX192YWwpICYgQklUX0xFTl9NQVNLXzMyKF9fYml0bGVuKSkgPDwgKF9fYml0b2Zmc2V0KSlcCiAgICAgICAgKTsKICNkZWZpbmUgU0VUX0JJVFNfVE9fTEVfMkJZVEUoX19wc3RhcnQsIF9fYml0b2Zmc2V0LCBfX2JpdGxlbiwgX192YWwpIFwKIAkqKCh1MTYgKikoX19wc3RhcnQpKSA9IEVGMkJZVEUgXAogCSggXAogCQlMRV9CSVRTX0NMRUFSRURfVE9fMkJZVEUoX19wc3RhcnQsIF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgfCBcCi0JCSggKCgodTE2KV9fdmFsKSAmIEJJVF9MRU5fTUFTS18xNihfX2JpdGxlbikpIDw8IChfX2JpdG9mZnNldCkgKVwKKwkJKCgoKHUxNilfX3ZhbCkgJiBCSVRfTEVOX01BU0tfMTYoX19iaXRsZW4pKSA8PCAoX19iaXRvZmZzZXQpKVwKICAgICAgICApOwogI2RlZmluZSBTRVRfQklUU19UT19MRV8xQllURShfX3BzdGFydCwgX19iaXRvZmZzZXQsIF9fYml0bGVuLCBfX3ZhbCkgXAogCSooKHU4ICopKF9fcHN0YXJ0KSkgPSBFRjFCWVRFIFwKIAkoIFwKIAkJTEVfQklUU19DTEVBUkVEX1RPXzFCWVRFKF9fcHN0YXJ0LCBfX2JpdG9mZnNldCwgX19iaXRsZW4pIHwgXAotCQkoICgoKHU4KV9fdmFsKSAmIEJJVF9MRU5fTUFTS184KF9fYml0bGVuKSkgPDwgKF9fYml0b2Zmc2V0KSApIFwKKwkJKCgoKHU4KV9fdmFsKSAmIEJJVF9MRU5fTUFTS184KF9fYml0bGVuKSkgPDwgKF9fYml0b2Zmc2V0KSkgXAogICAgICAgICk7CiAKICNkZWZpbmUJTl9CWVRFX0FMSUdNRU5UKF9fdmFsdWUsIF9fYWxpZ21lbnQpICgoX19hbGlnbWVudCA9PSAxKSA/IFwKQEAgLTIzNTksMTggKzIzNjEsMTggQEAKIAltZW0gYWNjZXNzIG1hY3JvIGRlZmluZSBlbmQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgYnl0ZSh4LG4pICgoeCA+PiAoOCAqIG4pKSAmIDB4ZmYpCisjZGVmaW5lIGJ5dGUoeCwgbikgKCh4ID4+ICg4ICogbikpICYgMHhmZikKIAogI2RlZmluZSBwYWNrZXRfZ2V0X3R5cGUoX3BhY2tldCkgKEVGMUJZVEUoKF9wYWNrZXQpLm9jdGV0WzBdKSAmIDB4RkMpCi0jZGVmaW5lIFJUTF9XQVRDSF9ET0dfVElNRSAgICAJMjAwMAorI2RlZmluZSBSVExfV0FUQ0hfRE9HX1RJTUUJMjAwMAogI2RlZmluZSBNU0VDUyh0KQkJbXNlY3NfdG9famlmZmllcyh0KQotI2RlZmluZSBXTEFOX0ZDX0dFVF9WRVJTKGZjKSAJKChmYykgJiBJRUVFODAyMTFfRkNUTF9WRVJTKQotI2RlZmluZSBXTEFOX0ZDX0dFVF9UWVBFKGZjKSAJKChmYykgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkKLSNkZWZpbmUgV0xBTl9GQ19HRVRfU1RZUEUoZmMpIAkoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKQotI2RlZmluZSBXTEFOX0ZDX01PUkVfREFUQShmYykgCSgoZmMpICYgSUVFRTgwMjExX0ZDVExfTU9SRURBVEEpCi0jZGVmaW5lIFNFUV9UT19TTihzZXEpIAkJKCgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKLSNkZWZpbmUgU05fVE9fU0VRKHNzbikgCQkoKChzc24pIDw8IDQpICYgSUVFRTgwMjExX1NDVExfU0VRKQotI2RlZmluZSBNQVhfU04gCQkJKChJRUVFODAyMTFfU0NUTF9TRVEpID4+IDQpCisjZGVmaW5lIFdMQU5fRkNfR0VUX1ZFUlMoZmMpCSgoZmMpICYgSUVFRTgwMjExX0ZDVExfVkVSUykKKyNkZWZpbmUgV0xBTl9GQ19HRVRfVFlQRShmYykJKChmYykgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkKKyNkZWZpbmUgV0xBTl9GQ19HRVRfU1RZUEUoZmMpCSgoZmMpICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpCisjZGVmaW5lIFdMQU5fRkNfTU9SRV9EQVRBKGZjKQkoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX01PUkVEQVRBKQorI2RlZmluZSBTRVFfVE9fU04oc2VxKQkJKCgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKKyNkZWZpbmUgU05fVE9fU0VRKHNzbikJCSgoKHNzbikgPDwgNCkgJiBJRUVFODAyMTFfU0NUTF9TRVEpCisjZGVmaW5lIE1BWF9TTgkJCSgoSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0KQogCiAjZGVmaW5lCVJUX1JGX09GRl9MRVZMX0FTUE0JCUJJVCgwKQkvKlBDSSBBU1BNICovCiAjZGVmaW5lCVJUX1JGX09GRl9MRVZMX0NMS19SRVEJCUJJVCgxKQkvKlBDSSBjbG9jayByZXF1ZXN0ICovCkBAIC0yMzgzLDcgKzIzODUsNyBAQAogI2RlZmluZQlSVF9SRl9QU19MRVZFTF9BTFdBWVNfQVNQTQlCSVQoNikKIC8qIG5vIG1hdHRlciBSRk9GRiBvciBTTEVFUCB3ZSBzZXQgUFNfQVNQTV9MRVZMKi8KICNkZWZpbmUJUlRfUFNfTEVWRUxfQVNQTQkJQklUKDcpCi0vKldoZW4gTFBTIGlzIG9uLCBkaXNhYmxlIDJSIGlmIG5vIHBhY2tldCBpcyByZWNlaXZlZCBvciB0cmFuc21pdHRkLiovCisvKldoZW4gTFBTIGlzIG9uLCBkaXNhYmxlIDJSIGlmIG5vIHBhY2tldCBpcyByZWNlaXZlZCBvciB0cmFuc21pdHRlZC4qLwogI2RlZmluZQlSVF9SRl9MUFNfRElTQUxCRV8yUgkJQklUKDMwKQogI2RlZmluZQlSVF9SRl9MUFNfTEVWRUxfQVNQTQkJQklUKDMxKQkvKkxQUyB3aXRoIEFTUE0gKi8KICNkZWZpbmUJUlRfSU5fUFNfTEVWRUwocHBzYywgX3BzX2ZsZykJCVwKQEAgLTIzOTcsMTMgKzIzOTksMTMgQEAKIAljb250YWluZXJfb2YoY29udGFpbmVyX29mKHgsIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspLCB5LCB6KQogCiAjZGVmaW5lIEZJTExfT0NURVRfU1RSSU5HKF9vcyxfb2N0ZXQsX2xlbikJXAotCQkoX29zKS5vY3RldD0odTgqKShfb2N0ZXQpOwkJXAotCQkoX29zKS5sZW5ndGg9KF9sZW4pOworCQkoX29zKS5vY3RldCA9ICh1OCAqKShfb2N0ZXQpOwkJXAorCQkoX29zKS5sZW5ndGggPSAoX2xlbik7CiAKICNkZWZpbmUgQ1BfTUFDQUREUihkZXMsc3JjKQlcCi0JKChkZXMpWzBdPShzcmMpWzBdLChkZXMpWzFdPShzcmMpWzFdLFwKLQkoZGVzKVsyXT0oc3JjKVsyXSwoZGVzKVszXT0oc3JjKVszXSxcCi0JKGRlcylbNF09KHNyYylbNF0sKGRlcylbNV09KHNyYylbNV0pCisJKChkZXMpWzBdID0gKHNyYylbMF0sKGRlcylbMV0gPSAoc3JjKVsxXSxcCisJKGRlcylbMl0gPSAoc3JjKVsyXSwoZGVzKVszXSA9IChzcmMpWzNdLFwKKwkoZGVzKVs0XSA9IChzcmMpWzRdLChkZXMpWzVdID0gKHNyYylbNV0pCiAKIHN0YXRpYyBpbmxpbmUgdTggcnRsX3JlYWRfYnl0ZShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvbXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L21zLmMKaW5kZXggOTI1M2Y2YS4uMzkwMjkyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvbXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9tcy5jCkBAIC0xMDMzLDggKzEwMzMsNyBAQAogCQkJICAgICgodTMyKSBidWZbY3VyX2FkZHJfb2ZmICsgNV0gPDwgMTYpIHwKIAkJCSAgICAoKHUzMikgYnVmW2N1cl9hZGRyX29mZiArIDZdIDw8IDgpIHwKIAkJCSAgICBidWZbY3VyX2FkZHJfb2ZmICsgN107Ci0JCQlSVFM1MVhfREVCVUdQKCJzeXNfaW5mb19hZGRyID0gMHgleCwiCi0JCQkJCSJzeXNfaW5mb19zaXplID0gMHgleFxuIiwKKwkJCVJUUzUxWF9ERUJVR1AoInN5c19pbmZvX2FkZHIgPSAweCV4LCBzeXNfaW5mb19zaXplID0gMHgleFxuIiwKIAkJCQkJCXN5c19pbmZvX2FkZHIsIHN5c19pbmZvX3NpemUpOwogCQkJaWYgKHN5c19pbmZvX3NpemUgIT0gOTYpIHsKIAkJCQlrZnJlZShidWYpOwpAQCAtMTA2OSw4ICsxMDY4LDcgQEAKIAkJCSAgICAoKHUzMikgYnVmW2N1cl9hZGRyX29mZiArIDVdIDw8IDE2KSB8CiAJCQkgICAgKCh1MzIpIGJ1ZltjdXJfYWRkcl9vZmYgKyA2XSA8PCA4KSB8CiAJCQkgICAgYnVmW2N1cl9hZGRyX29mZiArIDddOwotCQkJUlRTNTFYX0RFQlVHUCgibW9kZWxfbmFtZV9hZGRyID0gMHgleCwiCi0JCQkJCSJtb2RlbF9uYW1lX3NpemUgPSAweCV4XG4iLAorCQkJUlRTNTFYX0RFQlVHUCgibW9kZWxfbmFtZV9hZGRyID0gMHgleCwgbW9kZWxfbmFtZV9zaXplID0gMHgleFxuIiwKIAkJCQkJbW9kZWxfbmFtZV9hZGRyLCBtb2RlbF9uYW1lX3NpemUpOwogCQkJaWYgKG1vZGVsX25hbWVfc2l6ZSAhPSA0OCkgewogCQkJCWtmcmVlKGJ1Zik7CkBAIC0xNzUxLDggKzE3NDksNyBAQAogCQkJCXJldHZhbCA9IG1zX3JlYWRfc3RhdHVzX3JlZyhjaGlwKTsKIAkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJCXVuY29ycmVjdF9mbGFnID0gMTsKLQkJCQkJUlRTNTFYX0RFQlVHUCgiVW5jb3JyZWN0YWJsZSIKLQkJCQkJCQkJImVycm9yXG4iKTsKKwkJCQkJUlRTNTFYX0RFQlVHUCgiVW5jb3JyZWN0YWJsZSBlcnJvclxuIik7CiAJCQkJfSBlbHNlIHsKIAkJCQkJdW5jb3JyZWN0X2ZsYWcgPSAwOwogCQkJCX0KQEAgLTE3NzAsOCArMTc2Nyw3IEBACiAJCQkJCW1zX3dyaXRlX2V4dHJhX2RhdGEoY2hpcCwgb2xkX2JsaywgaSwKIAkJCQkJCQkgICAgZXh0cmEsCiAJCQkJCQkJICAgIE1TX0VYVFJBX1NJWkUpOwotCQkJCQlSVFM1MVhfREVCVUdQKCJwYWdlICVkIDoiCi0JCQkJCQkJImV4dHJhWzBdID0gMHgleFxuIiwKKwkJCQkJUlRTNTFYX0RFQlVHUCgicGFnZSAlZCA6IGV4dHJhWzBdID0gMHgleFxuIiwKIAkJCQkJCQlpLCBleHRyYVswXSk7CiAJCQkJCU1TX1NFVF9CQURfQkxPQ0tfRkxHKG1zX2NhcmQpOwogCkBAIC0xOTMyLDggKzE5MjgsNyBAQAogCXU4IHBhZ2VfbGVuLCBidXNfd2lkdGgsIHZhbCA9IDA7CiAJdTggZXh0cmFbTVNfRVhUUkFfU0laRV07CiAKLQlSVFM1MVhfREVCVUdQKCJBdXRvIGNvcHkgcGFnZSBmcm9tIDB4JXggdG8gMHgleCwiCi0JCQkJImxvZ2ljYWwgYmxvY2sgaXMgMHgleFxuIiwKKwlSVFM1MVhfREVCVUdQKCJBdXRvIGNvcHkgcGFnZSBmcm9tIDB4JXggdG8gMHgleCwgbG9naWNhbCBibG9jayBpcyAweCV4XG4iLAogCQkJCW9sZF9ibGssIG5ld19ibGssIGxvZ19ibGspOwogCVJUUzUxWF9ERUJVR1AoInN0YXJ0X3BhZ2UgPSAlZCwgZW5kX3BhZ2UgPSAlZFxuIiwgc3RhcnRfcGFnZSwKIAkJICAgICAgIGVuZF9wYWdlKTsKQEAgLTI1NTUsOCArMjU1MCw3IEBACiAJCWZvciAobG9nX2JsayA9IDA7IGxvZ19ibGsgPCA0OTQ7IGxvZ19ibGsrKykgewogCQkJdG1wX2JsayA9IHNlZ21lbnQtPmwycF90YWJsZVtsb2dfYmxrXTsKIAkJCWlmICh0bXBfYmxrIDwgbXNfY2FyZC0+Ym9vdF9ibG9jaykgewotCQkJCVJUUzUxWF9ERUJVR1AoIkJvb3QgYmxvY2sgaXMgbm90IHRoZSBmaXJzdCIKLQkJCQkJCQkibm9ybWFsIGJsb2NrLlxuIik7CisJCQkJUlRTNTFYX0RFQlVHUCgiQm9vdCBibG9jayBpcyBub3QgdGhlIGZpcnN0IG5vcm1hbCBibG9jay5cbiIpOwogCiAJCQkJaWYgKGNoaXAtPmNhcmRfd3AgJiBNU19DQVJEKQogCQkJCQlicmVhazsKQEAgLTM5NzYsOCArMzk3MCw3IEBACiAJCQllbmRfcGFnZSA9IHN0YXJ0X3BhZ2UgKyAodTgpIHRvdGFsX3NlY19jbnQ7CiAJCXBhZ2VfY250ID0gZW5kX3BhZ2UgLSBzdGFydF9wYWdlOwogCi0JCVJUUzUxWF9ERUJVR1AoInN0YXJ0X3BhZ2UgPSAlZCwgZW5kX3BhZ2UgPSAlZCwiCi0JCQkJCSJwYWdlX2NudCA9ICVkXG4iLAorCQlSVFM1MVhfREVCVUdQKCJzdGFydF9wYWdlID0gJWQsIGVuZF9wYWdlID0gJWQsIHBhZ2VfY250ID0gJWRcbiIsCiAJCQkJCXN0YXJ0X3BhZ2UsIGVuZF9wYWdlLCBwYWdlX2NudCk7CiAKIAkJaWYgKHNyYi0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvbXNfbWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L21zX21nLmMKaW5kZXggNTRjZmQ4NS4uMDA4NjJjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvbXNfbWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9tc19tZy5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSAicnRzNTF4X3Njc2kuaCIKICNpbmNsdWRlICJydHM1MXhfY2FyZC5oIgogI2luY2x1ZGUgIm1zLmgiCisjaW5jbHVkZSAibXNfbWcuaCIKIAogI2lmZGVmIFNVUFBPUlRfTUFHSUNfR0FURQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeC5jCmluZGV4IGE4ZDJkMDQuLmM4ZDA2ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeC5jCkBAIC0yMTUsNyArMjE1LDcgQEAKICAqIGEgVVNCIHBvcnQgcmVzZXQsIHdoZXRoZXIgZnJvbSB0aGlzIGRyaXZlciBvciBhIGRpZmZlcmVudCBvbmUuCiAgKi8KIAotaW50IHJ0czUxeF9wcmVfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKQorc3RhdGljIGludCBydHM1MXhfcHJlX3Jlc2V0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSkKIHsKIAlzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAgPSB1c2JfZ2V0X2ludGZkYXRhKGlmYWNlKTsKIApAQCAtMjI2LDcgKzIyNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBydHM1MXhfcG9zdF9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UpCitzdGF0aWMgaW50IHJ0czUxeF9wb3N0X3Jlc2V0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSkKIHsKIAlzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAgPSB1c2JfZ2V0X2ludGZkYXRhKGlmYWNlKTsKIApAQCAtODMyLDcgKzgzMiw3IEBACiAgKiBJbml0aWFsaXphdGlvbiBhbmQgcmVnaXN0cmF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCB1c2JfZGV2aWNlX2lkIHJ0czUxMzlfdXNiX2lkc1tdID0geworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHJ0czUxMzlfdXNiX2lkc1tdID0gewogCXtVU0JfREVWSUNFKDB4MEJEQSwgMHgwMTM5KX0sCiAJe1VTQl9ERVZJQ0UoMHgwQkRBLCAweDAxMjkpfSwKIAl7fQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfZm9wLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfZm9wLmMKaW5kZXggZGVlN2Q4YS4uNjc3ZDE4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X2ZvcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9mb3AuYwpAQCAtOTMsNyArOTMsNyBAQAogCQl9CiAKIAkJcmV0dmFsID0KLQkJICAgIGNvcHlfdG9fdXNlcigodm9pZCAqKWNtbmQtPmJ1ZiwgKHZvaWQgKilidWYsIGNtbmQtPmJ1Zl9sZW4pOworCQkgICAgY29weV90b191c2VyKGNtbmQtPmJ1ZiwgKHZvaWQgKilidWYsIGNtbmQtPmJ1Zl9sZW4pOwogCQlpZiAocmV0dmFsKSB7CiAJCQlrZnJlZShidWYpOwogCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19OT01FTSk7CkBAIC0xMDksNyArMTA5LDcgQEAKIAkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfTk9NRU0pOwogCiAJCXJldHZhbCA9Ci0JCSAgICBjb3B5X2Zyb21fdXNlcigodm9pZCAqKWJ1ZiwgKHZvaWQgKiljbW5kLT5idWYsCisJCSAgICBjb3B5X2Zyb21fdXNlcigodm9pZCAqKWJ1ZiwgY21uZC0+YnVmLAogCQkJCSAgIGNtbmQtPmJ1Zl9sZW4pOwogCQlpZiAocmV0dmFsKSB7CiAJCQlrZnJlZShidWYpOwpAQCAtMTU0LDcgKzE1NCw3IEBACiAJZWxzZQogCQljb3VudCA9IChyc3AtPnJzcF9sZW4gPCA2KSA/IHJzcC0+cnNwX2xlbiA6IDY7CiAKLQlyZXR2YWwgPSBjb3B5X3RvX3VzZXIoKHZvaWQgKilyc3AtPnJzcCwgKHZvaWQgKilzZF9jYXJkLT5yc3AsIGNvdW50KTsKKwlyZXR2YWwgPSBjb3B5X3RvX3VzZXIocnNwLT5yc3AsICh2b2lkICopc2RfY2FyZC0+cnNwLCBjb3VudCk7CiAJaWYgKHJldHZhbCkKIAkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19OT01FTSk7CiAKQEAgLTI1MCw3ICsyNTAsNyBAQAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBSVFM1MTM5X0lPQ19TRF9ESVJFQ1Q6CiAJCXJldHZhbCA9Ci0JCSAgICBjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZjbW5kLCAodm9pZCAqKWFyZywKKwkJICAgIGNvcHlfZnJvbV91c2VyKCh2b2lkICopJmNtbmQsICh2b2lkIF9fdXNlciAqKWFyZywKIAkJCQkgICBzaXplb2Yoc3RydWN0IHNkX2RpcmVjdF9jbW5kKSk7CiAJCWlmIChyZXR2YWwpIHsKIAkJCXJldHZhbCA9IC1FTk9NRU07CkBAIC0yNjUsNyArMjY1LDcgQEAKIAogCWNhc2UgUlRTNTEzOV9JT0NfU0RfR0VUX1JTUDoKIAkJcmV0dmFsID0KLQkJICAgIGNvcHlfZnJvbV91c2VyKCh2b2lkICopJnJzcCwgKHZvaWQgKilhcmcsCisJCSAgICBjb3B5X2Zyb21fdXNlcigmcnNwLCAodm9pZCBfX3VzZXIgKilhcmcsCiAJCQkJICAgc2l6ZW9mKHN0cnVjdCBzZF9yc3ApKTsKIAkJaWYgKHJldHZhbCkgewogCQkJcmV0dmFsID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9mb3AuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9mb3AuaAppbmRleCBlYjQ1YWNmLi5jNjkxZWU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfZm9wLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X2ZvcC5oCkBAIC0zNSwxMiArMzUsMTIgQEAKIAogc3RydWN0IHNkX2RpcmVjdF9jbW5kIHsKIAl1OCBjbW5kWzEyXTsKLQl2b2lkICpidWY7CisJdm9pZCBfX3VzZXIgKmJ1ZjsKIAlpbnQgYnVmX2xlbjsKIH07CiAKIHN0cnVjdCBzZF9yc3AgewotCXZvaWQgKnJzcDsKKwl2b2lkIF9fdXNlciAqcnNwOwogCWludCByc3BfbGVuOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X3Njc2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9zY3NpLmMKaW5kZXggM2E5OTAyNS4uNzUyODJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X3Njc2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfc2NzaS5jCkBAIC00NDEsNyArNDQxLDcgQEAKIAlyZXR1cm4gVFJBTlNQT1JUX0dPT0Q7CiB9CiAKLXVuc2lnbmVkIGNoYXIgZm9ybWF0dGVyX2lucXVpcnlfc3RyWzIwXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGZvcm1hdHRlcl9pbnF1aXJ5X3N0clsyMF0gPSB7CiAJJ00nLCAnRScsICdNJywgJ08nLCAnUicsICdZJywgJ1MnLCAnVCcsICdJJywgJ0MnLCAnSycsCiAJJy0nLCAnTScsICdHJywJCS8qIEJ5dGVbNDc6NDldICovCiAJMHgwQiwJCQkvKiBCeXRlWzUwXTogTUcsIE1TLCBNU1BybywgTVNYQyAqLwpAQCAtMTk5MCw3ICsxOTkwLDcgQEAKIAogLyogcXVldWUgYSBjb21tYW5kICovCiAvKiBUaGlzIGlzIGFsd2F5cyBjYWxsZWQgd2l0aCBzY3NpX2xvY2soaG9zdCkgaGVsZCAqLwotaW50IHF1ZXVlY29tbWFuZF9sY2soc3RydWN0IHNjc2lfY21uZCAqc3JiLCB2b2lkICgqZG9uZSkgKHN0cnVjdCBzY3NpX2NtbmQgKikpCitzdGF0aWMgaW50IHF1ZXVlY29tbWFuZF9sY2soc3RydWN0IHNjc2lfY21uZCAqc3JiLCB2b2lkICgqZG9uZSkgKHN0cnVjdCBzY3NpX2NtbmQgKikpCiB7CiAJc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwID0gaG9zdF90b19ydHM1MXgoc3JiLT5kZXZpY2UtPmhvc3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfdHJhbnNwb3J0LmMKaW5kZXggYzE3MmY0YWUuLjc0NTg4ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF90cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfdHJhbnNwb3J0LmMKQEAgLTY0Niw5ICs2NDYsOSBAQAogCQkJCSAgICBjaGlwLT51c2ItPmludHJfdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIH0KIAotdTggbWVkaWFfbm90X3ByZXNlbnRbXSA9IHsKK3N0YXRpYyB1OCBtZWRpYV9ub3RfcHJlc2VudFtdID0gewogCTB4NzAsIDAsIDB4MDIsIDAsIDAsIDAsIDAsIDEwLCAwLCAwLCAwLCAwLCAweDNBLCAwLCAwLCAwLCAwLCAwIH07Ci11OCBpbnZhbGlkX2NtZF9maWVsZFtdID0geworc3RhdGljIHU4IGludmFsaWRfY21kX2ZpZWxkW10gPSB7CiAJMHg3MCwgMCwgMHgwNSwgMCwgMCwgMCwgMCwgMTAsIDAsIDAsIDAsIDAsIDB4MjQsIDAsIDAsIDAsIDAsIDAgfTsKIAogdm9pZCBydHM1MXhfaW52b2tlX3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3NkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9zZC5jCmluZGV4IDQyODNiMDkuLmRhNWE5YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3NkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvc2QuYwpAQCAtMTUyOSw3ICsxNTI5LDcgQEAKIAlpbnQgaSwgajsKIAl1MzIgcmF3X3BoYXNlX21hcFszXSwgcGhhc2VfbWFwOwogCXU4IGZpbmFsX3BoYXNlOwotCWludCAoKnR1bmluZ19jbWQpIChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IHNhbXBsZV9wb2ludCk7CisJaW50ICgqdHVuaW5nX2NtZCkoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBzYW1wbGVfcG9pbnQpOwogCiAJaWYgKENIS19TRChzZF9jYXJkKSkgewogCQlpZiAoQ0hLX1NEX0REUjUwKHNkX2NhcmQpKQpAQCAtMTYyNyw3ICsxNjI3LDcgQEAKIAlpbnQgaSwgajsKIAl1MzIgcmF3X3BoYXNlX21hcFszXSwgcGhhc2VfbWFwOwogCXU4IGZpbmFsX3BoYXNlOwotCWludCAoKnR1bmluZ19jbWQpIChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IHNhbXBsZV9wb2ludCk7CisJaW50ICgqdHVuaW5nX2NtZCkoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBzYW1wbGVfcG9pbnQpOwogCiAJaWYgKENIS19TRChzZF9jYXJkKSkgewogCQlpZiAoQ0hLX1NEX0REUjUwKHNkX2NhcmQpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvc2RfY3BybS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvc2RfY3BybS5jCmluZGV4IGQ0Njg5ODMuLmNlZGU2YzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3NkX2Nwcm0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9zZF9jcHJtLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlICJydHM1MXhfc2NzaS5oIgogI2luY2x1ZGUgInJ0czUxeF9jYXJkLmgiCiAjaW5jbHVkZSAicnRzNTF4X2NoaXAuaCIKKyNpbmNsdWRlICJzZF9jcHJtLmgiCiAjaW5jbHVkZSAic2QuaCIKIAogI2lmZGVmIFNVUFBPUlRfQ1BSTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkveGQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3hkLmMKaW5kZXggMTBmZWE3ZS4uYmU0MzIzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkveGQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS94ZC5jCkBAIC00NzMsNyArNDczLDggQEAKIAkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfRFRDVEwsIDB4RkYsCiAJCQlYRF9USU1FX1NFVFVQX1NURVAgKiAzICsgWERfVElNRV9SV19TVEVQICoKIAkJCSgyICsgaSArIGNoaXAtPm9wdGlvbi5ydHM1MXhfeGRfcndfc3RlcCkKLQkJCSsgWERfVElNRV9SV05fU1RFUCAqIChpICsgY2hpcC0+b3B0aW9uLnJ0czUxeF94ZF9yd25fc3RlcCkpOworCQkJKyBYRF9USU1FX1JXTl9TVEVQICoKKwkJCShpICsgY2hpcC0+b3B0aW9uLnJ0czUxeF94ZF9yd25fc3RlcCkpOwogCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9DQVRDVEwsIDB4RkYsCiAJCQlYRF9USU1FX1NFVFVQX1NURVAgKiAzICsgWERfVElNRV9SV19TVEVQICogKDQgKwogCQkJaSkgKyBYRF9USU1FX1JXTl9TVEVQICogKDMgKyBpKSk7CkBAIC0xNTI2LDggKzE1MjcsOCBAQAogCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0NIS19EQVRBX1NUQVRVUywKIAkJICAgICAgIFhEX0FVVE9fQ0hLX0RBVEFfU1RBVFVTLCBYRF9BVVRPX0NIS19EQVRBX1NUQVRVUyk7CiAKLQlydHM1MXhfdHJhbnNfZG1hX2VuYWJsZShjaGlwLT5zcmItPnNjX2RhdGFfZGlyZWN0aW9uLCBjaGlwLCBwYWdlX2NudCAqIDUxMiwKLQkJCSBETUFfNTEyKTsKKwlydHM1MXhfdHJhbnNfZG1hX2VuYWJsZShjaGlwLT5zcmItPnNjX2RhdGFfZGlyZWN0aW9uLCBjaGlwLAorCQkJcGFnZV9jbnQgKiA1MTIsIERNQV81MTIpOwogCiAJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfVFJBTlNGRVIsIDB4RkYsCiAJCSAgICAgICBYRF9UUkFOU0ZFUl9TVEFSVCB8IFhEX1JFQURfUEFHRVMpOwpAQCAtMTc0NSw4ICsxNzQ2LDggQEAKIAlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX0RBVEFfU09VUkNFLCAweDAxLAogCQkgICAgICAgUklOR19CVUZGRVIpOwogCi0JcnRzNTF4X3RyYW5zX2RtYV9lbmFibGUoY2hpcC0+c3JiLT5zY19kYXRhX2RpcmVjdGlvbiwgY2hpcCwgcGFnZV9jbnQgKiA1MTIsCi0JCQkgRE1BXzUxMik7CisJcnRzNTF4X3RyYW5zX2RtYV9lbmFibGUoY2hpcC0+c3JiLT5zY19kYXRhX2RpcmVjdGlvbiwgY2hpcCwKKwkJCXBhZ2VfY250ICogNTEyLCBETUFfNTEyKTsKIAogCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX1RSQU5TRkVSLCAweEZGLAogCQkgICAgICAgWERfVFJBTlNGRVJfU1RBUlQgfCBYRF9XUklURV9QQUdFUyk7CkBAIC0xODQyLDggKzE4NDMsOCBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotaW50IHJ0czUxeF94ZF9ydyhzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTMyIHN0YXJ0X3NlY3RvciwKLQkgIHUxNiBzZWN0b3JfY250KQoraW50IHJ0czUxeF94ZF9ydyhzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwKKwl1MzIgc3RhcnRfc2VjdG9yLCB1MTYgc2VjdG9yX2NudCkKIHsKIAlzdHJ1Y3QgeGRfaW5mbyAqeGRfY2FyZCA9ICYoY2hpcC0+eGRfY2FyZCk7CiAJdW5zaWduZWQgaW50IGx1biA9IFNDU0lfTFVOKHNyYik7CkBAIC0xODgzLDcgKzE4ODQsOCBAQAogCQlyZXR2YWwgPSB4ZF9idWlsZF9sMnBfdGJsKGNoaXAsIHpvbmVfbm8pOwogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQljaGlwLT5jYXJkX2ZhaWwgfD0gWERfQ0FSRDsKLQkJCXJ0czUxeF9zZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOworCQkJcnRzNTF4X3NldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKKwkJCQlTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKIAkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L21zLmMKaW5kZXggZWRmOTc5Zi4uZDIyOTE2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9tcy5jCkBAIC0yNTksNyArMjU5LDcgQEAKIAkJTVNfVFJBTlNGRVJfRU5ELCBNU19UUkFOU0ZFUl9FTkQpOwogCiAJZm9yIChpID0gMDsgaSA8IGRhdGFfbGVuIC0gMTsgaSsrKQotCSAgICAgICBydHN4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBQUEJVRl9CQVNFMiArIGksIDAsIDApOworCQlydHN4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBQUEJVRl9CQVNFMiArIGksIDAsIDApOwogCiAJaWYgKGRhdGFfbGVuICUgMikKIAkJcnRzeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgUFBCVUZfQkFTRTIgKyBkYXRhX2xlbiwgMCwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4LmMKaW5kZXggODU4NmFjNS4uZDJkMTM0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3guYwpAQCAtMTAzMSw4ICsxMDMxLDEwIEBACiAKIC8qIFBDSSBJRHMgKi8KIHN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShydHN4X2lkcykgPSB7Ci0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUkVBTFRFSywgMHg1MjA4KSwgUENJX0NMQVNTX09USEVSUyA8PCAxNiwgMHhGRjAwMDAgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9SRUFMVEVLLCAweDUyODgpLCBQQ0lfQ0xBU1NfT1RIRVJTIDw8IDE2LCAweEZGMDAwMCB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1JFQUxURUssIDB4NTIwOCksCisJCVBDSV9DTEFTU19PVEhFUlMgPDwgMTYsIDB4RkYwMDAwIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUkVBTFRFSywgMHg1Mjg4KSwKKwkJUENJX0NMQVNTX09USEVSUyA8PCAxNiwgMHhGRjAwMDAgfSwKIAl7IDAsIH0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NhcmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2FyZC5jCmluZGV4IDMwNTVlYjEuLjAxYWViMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2FyZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2FyZC5jCkBAIC0xMDUsOCArMTA1LDEwIEBACiAJUlRTWF9ERUJVR1AoInJlZyAweEZGMzQ6IDB4JXgsIHJlZyAweEZGMzg6IDB4JXhcbiIsIHJlZzEsIHJlZzIpOwogCWlmICgocmVnMSAmIDB4QzApICYmIChyZWcyICYgMHhDMCkpIHsKIAkJY2hpcC0+c2RfaW50ID0gMTsKLQkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRElPX0NUUkwsIDB4RkYsIFNESU9fQlVTX0NUUkwgfCBTRElPX0NEX0NUUkwpOwotCQlydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFBXUl9HQVRFX0NUUkwsIExETzMzMThfUFdSX01BU0ssIExET19PTik7CisJCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RJT19DVFJMLCAweEZGLAorCQkJCVNESU9fQlVTX0NUUkwgfCBTRElPX0NEX0NUUkwpOworCQlydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFBXUl9HQVRFX0NUUkwsCisJCQkJTERPMzMxOF9QV1JfTUFTSywgTERPX09OKTsKIAl9CiB9CiAKQEAgLTQ1Miw3ICs0NTQsOCBAQAogfQogCiAjaWZkZWYgRElTQUJMRV9DQVJEX0lOVAotdm9pZCBjYXJkX2NkX2RlYm91bmNlKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGxvbmcgKm5lZWRfcmVzZXQsIHVuc2lnbmVkIGxvbmcgKm5lZWRfcmVsZWFzZSkKK3ZvaWQgY2FyZF9jZF9kZWJvdW5jZShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1bnNpZ25lZCBsb25nICpuZWVkX3Jlc2V0LAorCQl1bnNpZ25lZCBsb25nICpuZWVkX3JlbGVhc2UpCiB7CiAJdTggcmVsZWFzZV9tYXAgPSAwLCByZXNldF9tYXAgPSAwOwogCkBAIC01MDQsMTEgKzUwNywxNCBAQAogCQl9CiAKIAkJcmVzZXRfbWFwID0gMDsKLQkJaWYgKCEoY2hpcC0+Y2FyZF9leGlzdCAmIFhEX0NBUkQpICYmICh4ZF9jbnQgPiAoREVCT1VOQ0VfQ05ULTEpKSkKKwkJaWYgKCEoY2hpcC0+Y2FyZF9leGlzdCAmIFhEX0NBUkQpICYmCisJCQkJKHhkX2NudCA+IChERUJPVU5DRV9DTlQtMSkpKQogCQkJcmVzZXRfbWFwIHw9IFhEX0NBUkQ7Ci0JCWlmICghKGNoaXAtPmNhcmRfZXhpc3QgJiBTRF9DQVJEKSAmJiAoc2RfY250ID4gKERFQk9VTkNFX0NOVC0xKSkpCisJCWlmICghKGNoaXAtPmNhcmRfZXhpc3QgJiBTRF9DQVJEKSAmJgorCQkJCShzZF9jbnQgPiAoREVCT1VOQ0VfQ05ULTEpKSkKIAkJCXJlc2V0X21hcCB8PSBTRF9DQVJEOwotCQlpZiAoIShjaGlwLT5jYXJkX2V4aXN0ICYgTVNfQ0FSRCkgJiYgKG1zX2NudCA+IChERUJPVU5DRV9DTlQtMSkpKQorCQlpZiAoIShjaGlwLT5jYXJkX2V4aXN0ICYgTVNfQ0FSRCkgJiYKKwkJCQkobXNfY250ID4gKERFQk9VTkNFX0NOVC0xKSkpCiAJCQlyZXNldF9tYXAgfD0gTVNfQ0FSRDsKIAl9CiAKQEAgLTU0OSw3ICs1NTUsOCBAQAogCQlpZiAoIShjaGlwLT5jYXJkX2V4aXN0ICYgTVNfQ0FSRCkpCiAJCQljbGVhcl9iaXQoTVNfTlIsICYoY2hpcC0+bmVlZF9yZWxlYXNlKSk7CiAKLQkJUlRTWF9ERUJVR1AoImNoaXAtPm5lZWRfcmVsZWFzZSA9IDB4JXhcbiIsICh1bnNpZ25lZCBpbnQpKGNoaXAtPm5lZWRfcmVsZWFzZSkpOworCQlSVFNYX0RFQlVHUCgiY2hpcC0+bmVlZF9yZWxlYXNlID0gMHgleFxuIiwKKwkJCQkodW5zaWduZWQgaW50KShjaGlwLT5uZWVkX3JlbGVhc2UpKTsKIAogI2lmZGVmIFNVUFBPUlRfT0NQCiAJCWlmIChjaGlwLT5uZWVkX3JlbGVhc2UpIHsKQEAgLTU4OCw4ICs1OTUsMTAgQEAKIAogCQkJcmVsZWFzZV94ZF9jYXJkKGNoaXApOwogCi0JCQlpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTI4OCkgJiYgQ0hFQ0tfQkFST19QS0coY2hpcCwgUUZOKSkKLQkJCQlydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIEhPU1RfU0xFRVBfU1RBVEUsIDB4QzAsIDB4QzApOworCQkJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyODgpICYmCisJCQkJCUNIRUNLX0JBUk9fUEtHKGNoaXAsIFFGTikpCisJCQkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBIT1NUX1NMRUVQX1NUQVRFLAorCQkJCQkJMHhDMCwgMHhDMCk7CiAJCX0KIAogCQlpZiAoY2hpcC0+bmVlZF9yZWxlYXNlICYgTVNfQ0FSRCkgewpAQCAtNjEwLDEzICs2MTksMTUgQEAKIAl9CiAKIAlpZiAoY2hpcC0+bmVlZF9yZXNldCkgewotCQlSVFNYX0RFQlVHUCgiY2hpcC0+bmVlZF9yZXNldCA9IDB4JXhcbiIsICh1bnNpZ25lZCBpbnQpKGNoaXAtPm5lZWRfcmVzZXQpKTsKKwkJUlRTWF9ERUJVR1AoImNoaXAtPm5lZWRfcmVzZXQgPSAweCV4XG4iLAorCQkJCSh1bnNpZ25lZCBpbnQpKGNoaXAtPm5lZWRfcmVzZXQpKTsKIAogCQlydHN4X3Jlc2V0X2NhcmRzKGNoaXApOwogCX0KIAogCWlmIChjaGlwLT5uZWVkX3JlaW5pdCkgewotCQlSVFNYX0RFQlVHUCgiY2hpcC0+bmVlZF9yZWluaXQgPSAweCV4XG4iLCAodW5zaWduZWQgaW50KShjaGlwLT5uZWVkX3JlaW5pdCkpOworCQlSVFNYX0RFQlVHUCgiY2hpcC0+bmVlZF9yZWluaXQgPSAweCV4XG4iLAorCQkJCSh1bnNpZ25lZCBpbnQpKGNoaXAtPm5lZWRfcmVpbml0KSk7CiAKIAkJcnRzeF9yZWluaXRfY2FyZHMoY2hpcCwgMCk7CiAJfQpAQCAtNjI0LDcgKzYzNSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdTggZG91YmxlX2RlcHRoKHU4IGRlcHRoKQogewotCXJldHVybiAoKGRlcHRoID4gMSkgPyAoZGVwdGggLSAxKSA6IGRlcHRoKTsKKwlyZXR1cm4gKGRlcHRoID4gMSkgPyAoZGVwdGggLSAxKSA6IGRlcHRoOwogfQogCiBpbnQgc3dpdGNoX3NzY19jbG9jayhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCBpbnQgY2xrKQpAQCAtNjQxLDcgKzY1Miw4IEBACiAJbWF4X04gPSAxMjA7CiAJbWF4X2RpdiA9IENMS19ESVZfNDsKIAotCVJUU1hfREVCVUdQKCJTd2l0Y2ggU1NDIGNsb2NrIHRvICVkTUh6IChjdXJfY2xrID0gJWQpXG4iLCBjbGssIGNoaXAtPmN1cl9jbGspOworCVJUU1hfREVCVUdQKCJTd2l0Y2ggU1NDIGNsb2NrIHRvICVkTUh6IChjdXJfY2xrID0gJWQpXG4iLAorCQkJY2xrLCBjaGlwLT5jdXJfY2xrKTsKIAogCWlmICgoY2xrIDw9IDIpIHx8IChOID4gbWF4X04pKQogCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOwpAQCAtNjc2LDggKzY4OCwxMCBAQAogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTU0NfRElWX05fMCwgMHhGRiwgTik7CiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNTQ19DVEwxLCBTU0NfUlNUQiwgU1NDX1JTVEIpOwogCWlmIChzZF92cGNsa19waGFzZV9yZXNldCkgewotCQlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfVlBDTEswX0NUTCwgUEhBU0VfTk9UX1JFU0VULCAwKTsKLQkJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX1ZQQ0xLMF9DVEwsIFBIQVNFX05PVF9SRVNFVCwgUEhBU0VfTk9UX1JFU0VUKTsKKwkJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX1ZQQ0xLMF9DVEwsCisJCQlQSEFTRV9OT1RfUkVTRVQsIDApOworCQlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfVlBDTEswX0NUTCwKKwkJCVBIQVNFX05PVF9SRVNFVCwgUEhBU0VfTk9UX1JFU0VUKTsKIAl9CiAKIAlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIDAsIFdBSVRfVElNRSk7CkBAIC03ODYsOCArODAwLDEwIEBACiAKIAlpZiAoc2RfdnBjbGtfcGhhc2VfcmVzZXQpIHsKIAkJdWRlbGF5KDIwMCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEX1ZQQ0xLMF9DVEwsIFBIQVNFX05PVF9SRVNFVCwgUEhBU0VfTk9UX1JFU0VUKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfVlBDTEsxX0NUTCwgUEhBU0VfTk9UX1JFU0VULCBQSEFTRV9OT1RfUkVTRVQpOworCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9WUENMSzBfQ1RMLCBQSEFTRV9OT1RfUkVTRVQsCisJCQkJUEhBU0VfTk9UX1JFU0VUKTsKKwkJUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfVlBDTEsxX0NUTCwgUEhBU0VfTk9UX1JFU0VULAorCQkJCVBIQVNFX05PVF9SRVNFVCk7CiAJCXVkZWxheSgyMDApOwogCX0KIAlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDTEtfQ1RMLCAweEZGLCAwKTsKQEAgLTc5Nyw3ICs4MTMsOCBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotdm9pZCB0cmFuc19kbWFfZW5hYmxlKGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwgc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTMyIGJ5dGVfY250LCB1OCBwYWNrX3NpemUpCit2b2lkIHRyYW5zX2RtYV9lbmFibGUoZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLAorCQl1MzIgYnl0ZV9jbnQsIHU4IHBhY2tfc2l6ZSkKIHsKIAlpZiAocGFja19zaXplID4gRE1BXzEwMjQpCiAJCXBhY2tfc2l6ZSA9IERNQV81MTI7CkBAIC04MTAsMTAgKzgyNywxMiBAQAogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBETUFUQzAsIDB4RkYsICh1OClieXRlX2NudCk7CiAKIAlpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSkgewotCQlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgRE1BQ1RMLCAweDAzIHwgRE1BX1BBQ0tfU0laRV9NQVNLLAorCQlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgRE1BQ1RMLAorCQkJMHgwMyB8IERNQV9QQUNLX1NJWkVfTUFTSywKIAkJCSAgICAgRE1BX0RJUl9GUk9NX0NBUkQgfCBETUFfRU4gfCBwYWNrX3NpemUpOwogCX0gZWxzZSB7Ci0JCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBETUFDVEwsIDB4MDMgfCBETUFfUEFDS19TSVpFX01BU0ssCisJCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBETUFDVEwsCisJCQkweDAzIHwgRE1BX1BBQ0tfU0laRV9NQVNLLAogCQkJICAgICBETUFfRElSX1RPX0NBUkQgfCBETUFfRU4gfCBwYWNrX3NpemUpOwogCX0KIApAQCAtOTAzLDcgKzkyMiw4IEBACiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi1pbnQgY2FyZF9ydyhzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHUzMiBzZWNfYWRkciwgdTE2IHNlY19jbnQpCitpbnQgY2FyZF9ydyhzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsCisJdTMyIHNlY19hZGRyLCB1MTYgc2VjX2NudCkKIHsKIAlpbnQgcmV0dmFsOwogCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOwpAQCAtOTIxLDcgKzk0MSw4IEBACiAJCQkJcnRzeF9yZWxlYXNlX2NoaXAoY2hpcCk7CiAJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKIAkJCX0KLQkJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBjaGlwLT5jdXJfY2FyZCkgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgY2hpcC0+Y3VyX2NhcmQpICE9CisJCQkJCQkJU1RBVFVTX1NVQ0NFU1MpCiAJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKIAogCQkJaWYgKCFjaGlwLT5yd19uZWVkX3JldHJ5KSB7CkBAIC0xMDE2LDcgKzEwMzcsOCBAQAogdm9pZCB0dXJuX29uX2xlZChzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCBncGlvKQogewogCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1Mjg4KSkKLQkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0dQSU8sICh1OCkoMSA8PCBncGlvKSwgKHU4KSgxIDw8IGdwaW8pKTsKKwkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0dQSU8sICh1OCkoMSA8PCBncGlvKSwKKwkJCQkodTgpKDEgPDwgZ3BpbykpOwogCWVsc2UKIAkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0dQSU8sICh1OCkoMSA8PCBncGlvKSwgMCk7CiB9CkBAIC0xMDI2LDcgKzEwNDgsOCBAQAogCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1Mjg4KSkKIAkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0dQSU8sICh1OCkoMSA8PCBncGlvKSwgMCk7CiAJZWxzZQotCQlydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfR1BJTywgKHU4KSgxIDw8IGdwaW8pLCAodTgpKDEgPDwgZ3BpbykpOworCQlydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfR1BJTywgKHU4KSgxIDw8IGdwaW8pLAorCQkJCSh1OCkoMSA8PCBncGlvKSk7CiB9CiAKIGludCBkZXRlY3RfY2FyZF9jZChzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCBpbnQgY2FyZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfc2NzaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9zY3NpLmMKaW5kZXggMzgyZTczYS4uYmJmYTY2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9zY3NpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9zY3NpLmMKQEAgLTI4NjcsNyArMjg2Nyw3IEBACiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CiAJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKIAl9Ci0JaWYgKChnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKSAhPSBNU19DQVJEKSkgeworCWlmIChnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKSAhPSBNU19DQVJEKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9MVU5fTk9UX1NVUFBPUlQpOwogCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CiAJfQpAQCAtMjk4Myw3ICsyOTgzLDcgQEAKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKIAkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOwogCX0KLQlpZiAoKGdldF9sdW5fY2FyZChjaGlwLCBsdW4pICE9IFNEX0NBUkQpKSB7CisJaWYgKGdldF9sdW5fY2FyZChjaGlwLCBsdW4pICE9IFNEX0NBUkQpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0xVTl9OT1RfU1VQUE9SVCk7CiAJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKIAl9CkBAIC0zMDQ2LDcgKzMwNDYsNyBAQAogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwogCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CiAJfQotCWlmICgoZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bikgIT0gTVNfQ0FSRCkpIHsKKwlpZiAoZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bikgIT0gTVNfQ0FSRCkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTFVOX05PVF9TVVBQT1JUKTsKIAkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOwogCX0KQEAgLTMxNTEsNyArMzE1MSw3IEBACiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9XUklURV9QUk9URUNUKTsKIAkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOwogCX0KLQlpZiAoKGdldF9sdW5fY2FyZChjaGlwLCBsdW4pICE9IE1TX0NBUkQpKSB7CisJaWYgKGdldF9sdW5fY2FyZChjaGlwLCBsdW4pICE9IE1TX0NBUkQpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0xVTl9OT1RfU1VQUE9SVCk7CiAJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3RyYW5zcG9ydC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF90cmFuc3BvcnQuYwppbmRleCA5N2I3YjAxLi42OTRkMzgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfdHJhbnNwb3J0LmMKQEAgLTYyNSw4ICs2MjUsOCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgcnRzeF90cmFuc2Zlcl9idWYoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTggY2FyZCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuLAotCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkbWFfZGlyLCBpbnQgdGltZW91dCkKK3N0YXRpYyBpbnQgcnRzeF90cmFuc2Zlcl9idWYoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTggY2FyZCwgdm9pZCAqYnVmLAorCQlzaXplX3QgbGVuLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkbWFfZGlyLCBpbnQgdGltZW91dCkKIHsKIAlzdHJ1Y3QgcnRzeF9kZXYgKnJ0c3ggPSBjaGlwLT5ydHN4OwogCXN0cnVjdCBjb21wbGV0aW9uIHRyYW5zX2RvbmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2IxMDV4L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvc2IxMDV4L0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NWU3ODQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1jb25maWcgU0IxMDVYCi0JdHJpc3RhdGUgIlN5c3RlbUJhc2UgUENJIE11bHRpcG9ydCBVQVJUIgotCXNlbGVjdCBTRVJJQUxfQ09SRQotCWRlcGVuZHMgb24gUENJICYmIFg4NiAmJiBUVFkgJiYgQlJPS0VOCi0JaGVscAotCSAgQSBkcml2ZXIgZm9yIHRoZSBTeXN0ZW1CYXNlIE11bHRpLTIvUENJIHNlcmlhbCBjYXJkCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkICJzYjEwNXgiLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9zYjEwNXgvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYmYzNzcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotb2JqLSQoQ09ORklHX1NCMTA1WCkgKz0Jc2IxMDV4Lm8KLQotc2IxMDV4LXkgOj0gIHNiX3BjaV9tcC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2IxMDV4L3NiX21wX3JlZ2lzdGVyLmggYi9kcml2ZXJzL3N0YWdpbmcvc2IxMDV4L3NiX21wX3JlZ2lzdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NmMxYmIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9zYl9tcF9yZWdpc3Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLQotLyoKLSAqIFNCMTA1WF9VQVJULmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggc3lzdGVtYmFzZQotICoKLSAqIFVBUlQgcmVnaXN0ZXJzLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBVQVJUX1NCMTA1WF9ICi0jZGVmaW5lIFVBUlRfU0IxMDVYX0gKLQotLyoKLSAqIG9wdGlvbiByZWdpc3RlcgotICovCi0KLS8qIERldmljZSBJbmZvcm1hdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZSBNUF9PUFRSX0RJUjAJCTB4MDQgCS8qIHBvcnQwIH4gcG9ydDggKi8KLSNkZWZpbmUgTVBfT1BUUl9ESVIxCQkweDA1IAkvKiBwb3J0OCB+IHBvcnQxNSAqLwotI2RlZmluZSBNUF9PUFRSX0RJUjIJCTB4MDYgCS8qIHBvcnQxNiB+IHBvcnQyMyAqLwotI2RlZmluZSBNUF9PUFRSX0RJUjMJCTB4MDcgCS8qIHBvcnQyNCB+IHBvcnQzMSAqLwotCi0jZGVmaW5lIERJUl9VQVJUXzE2QzU1MCAJMAotI2RlZmluZSBESVJfVUFSVF8xNkMxMDUwCTEKLSNkZWZpbmUgRElSX1VBUlRfMTZDMTA1MEEJMgotCi0jZGVmaW5lCURJUl9DTEtfMTg0MzIwMAkJMHgwCQkvKiBpbnB1dCBjbG9jayAxODQzMjAwIEh6ICovCi0jZGVmaW5lCURJUl9DTEtfMzY4NjQwMAkJMHgxCQkvKiBpbnB1dCBjbG9jayAzNjg2NDAwIEh6ICovCi0jZGVmaW5lCURJUl9DTEtfNzM3MjgwMAkJMHgyCQkvKiBpbnB1dCBjbG9jayA3MzcyODAwIEh6ICovCi0jZGVmaW5lCURJUl9DTEtfMTQ3NDU2MDAJMHgzCQkvKiBpbnB1dCBjbG9jayAxNDc0NTYwMCBIeiAqLwotI2RlZmluZQlESVJfQ0xLXzI5NDkxMjAwCTB4NAkJLyogaW5wdXQgY2xvY2sgMjk0OTEyMDAgSHogKi8KLSNkZWZpbmUJRElSX0NMS181ODk4NTQwMAkweDUJCS8qIGlucHV0IGNsb2NrIDU4OTg1NDAwIEh6ICovCi0KLS8qIEludGVyZmFjZSBJbmZvcm1hdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZSBNUF9PUFRSX0lJUjAJCTB4MDggCS8qIHBvcnQwIH4gcG9ydDggKi8KLSNkZWZpbmUgTVBfT1BUUl9JSVIxCQkweDA5IAkvKiBwb3J0OCB+IHBvcnQxNSAqLwotI2RlZmluZSBNUF9PUFRSX0lJUjIJCTB4MEEgCS8qIHBvcnQxNiB+IHBvcnQyMyAqLwotI2RlZmluZSBNUF9PUFRSX0lJUjMJCTB4MEIgCS8qIHBvcnQyNCB+IHBvcnQzMSAqLwotCi0jZGVmaW5lIElJUl9SUzIzMgkJMHgwMAkJLyogUlMyMzIgdHlwZSAqLwotI2RlZmluZSBJSVJfUlM0MjIJCTB4MTAJCS8qIFJTNDIyIHR5cGUgKi8KLSNkZWZpbmUgSUlSX1JTNDg1CQkweDIwCQkvKiBSUzQ4NSB0eXBlICovCi0jZGVmaW5lIElJUl9UWVBFX01BU0sJCTB4MzAKLQotLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTVBfT1BUUl9JTVIwCQkweDBDIAkvKiBwb3J0MCB+IHBvcnQ4ICovCi0jZGVmaW5lIE1QX09QVFJfSU1SMQkJMHgwRCAJLyogcG9ydDggfiBwb3J0MTUgKi8KLSNkZWZpbmUgTVBfT1BUUl9JTVIyCQkweDBFIAkvKiBwb3J0MTYgfiBwb3J0MjMgKi8KLSNkZWZpbmUgTVBfT1BUUl9JTVIzCQkweDBGIAkvKiBwb3J0MjQgfiBwb3J0MzEgKi8KLQotLyogSW50ZXJydXB0IFBvbGwgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTVBfT1BUUl9JUFIwCQkweDEwIAkvKiBwb3J0MCB+IHBvcnQ4ICovCi0jZGVmaW5lIE1QX09QVFJfSVBSMQkJMHgxMSAJLyogcG9ydDggfiBwb3J0MTUgKi8KLSNkZWZpbmUgTVBfT1BUUl9JUFIyCQkweDEyIAkvKiBwb3J0MTYgfiBwb3J0MjMgKi8KLSNkZWZpbmUgTVBfT1BUUl9JUFIzCQkweDEzIAkvKiBwb3J0MjQgfiBwb3J0MzEgKi8KLQotLyogR2VuZXJhbCBQdXJwb3NlIE91dHB1dCBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIE1QX09QVFJfR1BPQ1IJCTB4MjAKLQotLyogR2VuZXJhbCBQdXJwb3NlIE91dHB1dCBEYXRhIFJlZ2lzdGVyICovCi0jZGVmaW5lIE1QX09QVFJfR1BPRFIJCTB4MjEKLQotLyogUGFyYWxsZWwgQWRkaXRpb25hbCBGdW5jdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZSBNUF9PUFRSX1BBRlIJCTB4MjMKLQotLyoKLSAqIHN5c3RlbWJhc2UgMTZjMTA1eCBVQVJUIHJlZ2lzdGVyCi0gKi8KLQotI2RlZmluZSBQQUdFXzAgMAotI2RlZmluZSBQQUdFXzEgMQotI2RlZmluZSBQQUdFXzIgMgotI2RlZmluZSBQQUdFXzMgMwotI2RlZmluZSBQQUdFXzQgNAotCi0vKgotICogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICogRExBQj0wICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09ICAgICAgIFBhZ2UgMCBSZWdpc3RlcnMgKgotICogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNkZWZpbmUgU0IxMDVYX1JYCQkwCS8qIEluOiAgUmVjZWl2ZSBidWZmZXIgKi8KLSNkZWZpbmUgU0IxMDVYX1RYCQkwCS8qIE91dDogVHJhbnNtaXQgYnVmZmVyICovCi0KLSNkZWZpbmUgU0IxMDVYX0lFUgkJMQkvKiBPdXQ6IEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KLQotI2RlZmluZSBTQjEwNVhfSUVSX0NUU0kJICAJMHg4MAkvKiBDVFMjIEludGVycnVwdCBFbmFibGUgKFJlcXVpcmVzIEVGUls0XSA9IDEpICovCi0jZGVmaW5lIFNCMTA1WF9JRVJfUlRTSQkgIAkweDQwCS8qIFJUUyMgSW50ZXJydXB0IEVuYWJsZSAoUmVxdWlyZXMgRUZSWzRdID0gMSkgKi8KLSNkZWZpbmUgU0IxMDVYX0lFUl9YT0kJICAJMHgyMAkvKiBYb2ZmIEludGVycnVwdCBFbmFibGUgKFJlcXVpcmVzIEVGUls0XSA9IDEpICovCi0jZGVmaW5lIFNCMTA1WF9JRVJfU01FCSAgCTB4MTAJLyogU2xlZXAgTW9kZSBFbmFibGUgKFJlcXVpcmVzIEVGUls0XSA9IDEpICovCi0jZGVmaW5lIFNCMTA1WF9JRVJfTVNJCSAgCTB4MDgJLyogRW5hYmxlIE1vZGVtIHN0YXR1cyBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgU0IxMDVYX0lFUl9STFNJCSAgCTB4MDQJLyogRW5hYmxlIHJlY2VpdmVyIGxpbmUgc3RhdHVzIGludGVycnVwdCAqLwotI2RlZmluZSBTQjEwNVhfSUVSX1RIUkkJICAJMHgwMgkvKiBFbmFibGUgVHJhbnNtaXR0ZXIgaG9sZGluZyByZWdpc3RlciBpbnQuICovCi0jZGVmaW5lIFNCMTA1WF9JRVJfUkRJCSAgCTB4MDEJLyogRW5hYmxlIHJlY2VpdmVyIGRhdGEgaW50ZXJydXB0ICovCi0KLSNkZWZpbmUgU0IxMDVYX0lTUgkJMgkvKiBJbjogIEludGVycnVwdCBJRCBSZWdpc3RlciAqLwotCi0jZGVmaW5lIFNCMTA1WF9JU1JfTk9JTlQJMHgwMQkvKiBObyBpbnRlcnJ1cHRzIHBlbmRpbmcgKi8KLSNkZWZpbmUgU0IxMDVYX0lTUl9STFNJCSAgCTB4MDYJLyogUmVjZWl2ZXIgbGluZSBzdGF0dXMgaW50ZXJydXB0IChQcmlvcml0eSA9IDEpKi8KLSNkZWZpbmUgU0IxMDVYX0lTUl9SREFJCSAgCTB4MGMJLyogUmVjZWl2ZSBEYXRhIEF2YWlsYWJsZSBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgU0IxMDVYX0lTUl9DVElJCSAgCTB4MDQJLyogQ2hhcmFjdGVyIFRpbWVvdXQgSW5kaWNhdGlvbiBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgU0IxMDVYX0lTUl9USFJJCSAgCTB4MDIJLyogVHJhbnNtaXR0ZXIgaG9sZGluZyByZWdpc3RlciBlbXB0eSAqLwotI2RlZmluZSBTQjEwNVhfSVNSX01TSQkgIAkweDAwCS8qIE1vZGVtIHN0YXR1cyBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgU0IxMDVYX0lTUl9SWENJCSAgCTB4MTAJLyogUmVjZWl2ZSBYb2ZmIG9yIFNwZWNpYWwgQ2hhcmFjdGVyIGludGVycnVwdCAqLwotI2RlZmluZSBTQjEwNVhfSVNSX1JDU0kJICAJMHgyMAkvKiBSVFMjLCBDVFMjIHN0YXR1cyBpbnRlcnJ1cHQgZHVyaW5nIEF1dG8gUlRTL0NUUyBmbG93IGNvbnRyb2wgKi8KLQotI2RlZmluZSBTQjEwNVhfRkNSCQkyCS8qIE91dDogRklGTyBDb250cm9sIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUgU0IxMDVYX0ZDUl9GRU4gICAgCTB4MDEJLyogRklGTyBFbmFibGUgKi8KLSNkZWZpbmUgU0IxMDVYX0ZDUl9SWEZSCSAgCTB4MDIJLyogUlggRklGTyBSZXNldCAqLwotI2RlZmluZSBTQjEwNVhfRkNSX1RYRlIJICAJMHgwNAkvKiBUWCBGSUZPIFJlc2V0ICovCi0jZGVmaW5lIFNCMTA1WF9GQ1JfRE1TCSAgCTB4MDgJLyogRE1BIE1vZGUgU2VsZWN0ICovCi0KLSNkZWZpbmUgU0IxMDVYX0ZDUl9SVFIwOCAgCTB4MDAgIC8qIFJlY2VpdmUgVHJpZ2dlciBMZXZlbCBzZXQgYXQgOCAqLwotI2RlZmluZSBTQjEwNVhfRkNSX1JUUjE2ICAJMHg0MCAgLyogUmVjZWl2ZSBUcmlnZ2VyIExldmVsIHNldCBhdCAxNiAqLwotI2RlZmluZSBTQjEwNVhfRkNSX1JUUjU2ICAJMHg4MCAgLyogUmVjZWl2ZSBUcmlnZ2VyIExldmVsIHNldCBhdCA1NiAqLwotI2RlZmluZSBTQjEwNVhfRkNSX1JUUjYwICAJMHhjMCAgLyogUmVjZWl2ZSBUcmlnZ2VyIExldmVsIHNldCBhdCA2MCAqLwotI2RlZmluZSBTQjEwNVhfRkNSX1RUUjA4ICAJMHgwMCAgLyogVHJhbnNtaXQgVHJpZ2dlciBMZXZlbCBzZXQgYXQgOCAqLwotI2RlZmluZSBTQjEwNVhfRkNSX1RUUjE2CTB4MTAgIC8qIFRyYW5zbWl0IFRyaWdnZXIgTGV2ZWwgc2V0IGF0IDE2ICovCi0jZGVmaW5lIFNCMTA1WF9GQ1JfVFRSMzIJMHgyMCAgLyogVHJhbnNtaXQgVHJpZ2dlciBMZXZlbCBzZXQgYXQgMzIgKi8KLSNkZWZpbmUgU0IxMDVYX0ZDUl9UVFI1NgkweDMwICAvKiBUcmFuc21pdCBUcmlnZ2VyIExldmVsIHNldCBhdCA1NiAqLwotCi0jZGVmaW5lIFNCMTA1WF9MQ1IJCTMJLyogT3V0OiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgKi8KLS8qCi0gKiAgKiBOb3RlOiBpZiB0aGUgd29yZCBsZW5ndGggaXMgNSBiaXRzIChTQjEwNVhfTENSX1dMRU41KSwgdGhlbiBzZXR0aW5nIAotICogICogU0IxMDVYX0xDUl9TVE9QIHdpbGwgc2VsZWN0IDEuNSBzdG9wIGJpdHMsIG5vdCAyIHN0b3AgYml0cy4KLSAqLwotI2RlZmluZSBTQjEwNVhfTENSX0RMQUIgICAJMHg4MCAgLyogRGl2aXNvciBMYXRjaCBFbmFibGUgKi8KLSNkZWZpbmUgU0IxMDVYX0xDUl9TQkMgICAgCTB4NDAgIC8qIEJyZWFrIEVuYWJsZSovCi0jZGVmaW5lIFNCMTA1WF9MQ1JfU1BBUiAgIAkweDIwICAvKiBTZXQgU3RpY2sgcGFyaXR5ICovCi0jZGVmaW5lIFNCMTA1WF9MQ1JfRVBBUiAgIAkweDEwICAvKiBFdmVuIHBhcml0eSBzZWxlY3QgKi8KLSNkZWZpbmUgU0IxMDVYX0xDUl9QQVJFTiAgCTB4MDggIC8qIFBhcml0eSBFbmFibGUgKi8KLSNkZWZpbmUgU0IxMDVYX0xDUl9TVE9QICAgCTB4MDQgIC8qIFN0b3AgYml0czogMC0+MSBiaXQsIDEtPjIgYml0cywgMSBhbmQgU0IxMDVYX0xDUl9XTEVONSAtPiAxLjUgYml0ICovCi0jZGVmaW5lIFNCMTA1WF9MQ1JfV0xFTjUgIAkweDAwICAvKiBXb3JkbGVuZ3RoOiA1IGJpdHMgKi8KLSNkZWZpbmUgU0IxMDVYX0xDUl9XTEVONiAgCTB4MDEgIC8qIFdvcmRsZW5ndGg6IDYgYml0cyAqLwotI2RlZmluZSBTQjEwNVhfTENSX1dMRU43ICAJMHgwMiAgLyogV29yZGxlbmd0aDogNyBiaXRzICovCi0jZGVmaW5lIFNCMTA1WF9MQ1JfV0xFTjggIAkweDAzICAvKiBXb3JkbGVuZ3RoOiA4IGJpdHMgKi8KLQotI2RlZmluZSBTQjEwNVhfTENSX0JGCQkweEJGCi0KLSNkZWZpbmUgU0IxMDVYX01DUgkJNAkvKiBPdXQ6IE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0IxMDVYX01DUl9DUFMgICAgCTB4ODAgIC8qIENsb2NrIFByZXNjYWxlciBTZWxlY3QgKi8KLSNkZWZpbmUgU0IxMDVYX01DUl9QMlMgICAgCTB4NDAgIC8qIFBhZ2UgMiBTZWxlY3QgL1hvZmYgUmUtVHJhbnNtaXQgQWNjZXNzIEVuYWJsZSAqLwotI2RlZmluZSBTQjEwNVhfTUNSX1hPQSAgICAJMHgyMCAgLyogWG9uIEFueSBFbmFibGUgKi8KLSNkZWZpbmUgU0IxMDVYX01DUl9JTEIJCTB4MTAgIC8qIEludGVybmFsIExvb3BiYWNrIEVuYWJsZSAqLwotI2RlZmluZSBTQjEwNVhfTUNSX09VVDIJCTB4MDggIC8qIE91dDIvSW50ZXJydXB0IE91dHB1dCBFbmFibGUqLwotI2RlZmluZSBTQjEwNVhfTUNSX09VVDEJCTB4MDQgIC8qIE91dDEvSW50ZXJydXB0IE91dHB1dCBFbmFibGUgKi8KLSNkZWZpbmUgU0IxMDVYX01DUl9SVFMgICAgCTB4MDIgIC8qIFJUUyMgT3V0cHV0ICovCi0jZGVmaW5lIFNCMTA1WF9NQ1JfRFRSICAgIAkweDAxICAvKiBEVFIjIE91dHB1dCAqLwotCi0jZGVmaW5lIFNCMTA1WF9MU1IJCTUJLyogSW46ICBMaW5lIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBTQjEwNVhfTFNSX1JGRUkgICAJMHg4MCAgLyogUmVjZWl2ZSBGSUZPIGRhdGEgZXJyb3IgSW5kaWNhdG9yICovCi0jZGVmaW5lIFNCMTA1WF9MU1JfVEVNSSAgIAkweDQwICAvKiBUSFIgYW5kIFRTUiBFbXB0eSBJbmRpY2F0b3IgKi8KLSNkZWZpbmUgU0IxMDVYX0xTUl9USFJFCQkweDIwICAvKiBUSFIgRW1wdHkgSW5kaWNhdG9yICovCi0jZGVmaW5lIFNCMTA1WF9MU1JfQklJCQkweDEwICAvKiBCcmVhayBpbnRlcnJ1cHQgaW5kaWNhdG9yICovCi0jZGVmaW5lIFNCMTA1WF9MU1JfRkVJCQkweDA4ICAvKiBGcmFtZSBlcnJvciBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgU0IxMDVYX0xTUl9QRUkJCTB4MDQgIC8qIFBhcml0eSBlcnJvciBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgU0IxMDVYX0xTUl9PRUkJCTB4MDIgIC8qIE92ZXJydW4gZXJyb3IgaW5kaWNhdG9yICovCi0jZGVmaW5lIFNCMTA1WF9MU1JfUkRSSQkJMHgwMSAgLyogUmVjZWl2ZSBkYXRhIHJlYWR5IEluZGljYXRvciovCi0KLSNkZWZpbmUgU0IxMDVYX01TUgkJNgkvKiBJbjogIE1vZGVtIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBTQjEwNVhfTVNSX0RDRAkJMHg4MCAgLyogRGF0YSBDYXJyaWVyIERldGVjdCAqLwotI2RlZmluZSBTQjEwNVhfTVNSX1JJCQkweDQwICAvKiBSaW5nIEluZGljYXRvciAqLwotI2RlZmluZSBTQjEwNVhfTVNSX0RTUgkJMHgyMCAgLyogRGF0YSBTZXQgUmVhZHkgKi8KLSNkZWZpbmUgU0IxMDVYX01TUl9DVFMJCTB4MTAgIC8qIENsZWFyIHRvIFNlbmQgKi8KLSNkZWZpbmUgU0IxMDVYX01TUl9ERENECQkweDA4ICAvKiBEZWx0YSBEQ0QgKi8KLSNkZWZpbmUgU0IxMDVYX01TUl9EUkkJCTB4MDQgIC8qIERlbHRhIHJpbmcgaW5kaWNhdG9yICovCi0jZGVmaW5lIFNCMTA1WF9NU1JfRERTUgkJMHgwMiAgLyogRGVsdGEgRFNSICovCi0jZGVmaW5lIFNCMTA1WF9NU1JfRENUUwkJMHgwMSAgLyogRGVsdGEgQ1RTICovCi0KLSNkZWZpbmUgU0IxMDVYQV9NRFIJCTYJLyogT3V0OiBNdWx0aSBEcm9wIG1vZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0IxMDVYQV9NRFJfTlBTCQkweDA4ICAvKiA5dGggQml0IFBvbGFyaXR5IFNlbGVjdCAqLwotI2RlZmluZSBTQjEwNVhBX01EUl9BTUUJCTB4MDIgIC8qIEF1dG8gTXVsdGktZHJvcCBFbmFibGUgKi8KLSNkZWZpbmUgU0IxMDVYQV9NRFJfTURFCQkweDAxICAvKiBNdWx0aSBEcm9wIEVuYWJsZSAqLwotCi0jZGVmaW5lIFNCMTA1WF9TUFIJCTcJLyogSS9POiBTY3JhdGNoIFJlZ2lzdGVyICovCi0KLS8qCi0gKiBETEFCPTEKLSAqLwotI2RlZmluZSBTQjEwNVhfRExMCQkwCS8qIE91dDogRGl2aXNvciBMYXRjaCBMb3cgKi8KLSNkZWZpbmUgU0IxMDVYX0RMTQkJMQkvKiBPdXQ6IERpdmlzb3IgTGF0Y2ggSGlnaCAqLwotCi0vKgotICogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICogRExBQihMQ1JbN10pID0gMCAsIE1DUls2XSA9IDEgID09PT09PT09PT09PT0gIFBhZ2UgMiBSZWdpc3RlcnMgKgotICogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jZGVmaW5lIFNCMTA1WF9HSUNSCQkxCS8qIEdsb2JhbCBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBTQjEwNVhfR0lDUl9HSU0gICAJMHgwMSAgLyogR2xvYmFsIEludGVycnVwdCBNYXNrICovCi0KLSNkZWZpbmUgU0IxMDVYX0dJU1IJCTIJLyogR2xvYmFsIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0IxMDVYX0dJU1JfTUdJQ1IwICAJMHg4MCAgLyogTWlycm9yIHRoZSBjb250ZW50IG9mIEdJQ1JbMF0gKi8KLSNkZWZpbmUgU0IxMDVYX0dJU1JfQ1MzSVMgICAJMHgwOCAgLyogU0IxMDVYIG9mIENTMyMgSW50ZXJydXB0IFN0YXR1cyAqLwotI2RlZmluZSBTQjEwNVhfR0lTUl9DUzJJUyAgIAkweDA0ICAvKiBTQjEwNVggb2YgQ1MyIyBJbnRlcnJ1cHQgU3RhdHVzICovCi0jZGVmaW5lIFNCMTA1WF9HSVNSX0NTMUlTICAgCTB4MDIgIC8qIFNCMTA1WCBvZiBDUzEjIEludGVycnVwdCBTdGF0dXMgKi8KLSNkZWZpbmUgU0IxMDVYX0dJU1JfQ1MwSVMgICAJMHgwMSAgLyogU0IxMDVYIG9mIENTMCMgSW50ZXJydXB0IFN0YXR1cyAqLwotCi0jZGVmaW5lIFNCMTA1WF9URkNSCQk1CS8qIFRyYW5zbWl0IEZJRk8gQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZSBTQjEwNVhfUkZDUgkJNgkvKiBSZWNlaXZlIEZJRk8gQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlTQjEwNVhfRlNSCQk3CS8qIEZsb3cgQ29udHJvbCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0IxMDVYX0ZTUl9USEZTICAgICAJMHgyMCAgLyogVHJhbnNtaXQgSGFyZHdhcmUgRmxvdyBDb250cm9sIFN0YXR1cyAqLwotI2RlZmluZSBTQjEwNVhfRlNSX1RTRlMgICAgIAkweDEwICAvKiBUcmFuc21pdCBTb2Z0d2FyZSBGbG93IENvbnRyb2wgU3RhdHVzICovCi0jZGVmaW5lIFNCMTA1WF9GU1JfUkhGUyAgICAgCTB4MDIgIC8qIFJlY2VpdmUgSGFyZHdhcmUgRmxvdyBDb250cm9sIFN0YXR1cyAqLwotI2RlZmluZSBTQjEwNVhfRlNSX1JTRlMgICAgIAkweDAxICAvKiBSZWNlaXZlIFNvZnR3YXJlIEZsb3cgQ29udHJvbCBTdGF0dXMgKi8KLQotLyoKLSAqICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAqIExDUiA9IDB4QkYsIFBTUlswXSA9IDAgICAgICAgPT09PT09PT09PT09PSAgICBQYWdlIDMgUmVnaXN0ZXJzICoKLSAqICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jZGVmaW5lIFNCMTA1WF9QU1IJCTAJLyogUGFnZSBTZWxlY3QgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0IxMDVYX1BTUl9QM0tFWSAgICAJMHhBNCAvKiBQYWdlIDMgU2VsZWN0IEtleSAqLwotI2RlZmluZSBTQjEwNVhfUFNSX1A0S0VZICAgIAkweEE1IC8qIFBhZ2UgNSBTZWxlY3QgS2V5ICovCi0KLSNkZWZpbmUgU0IxMDVYX0FUUgkJMQkvKiBBdXRvIFRvZ2dsZSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNCMTA1WF9BVFJfUlBTICAgICAgCTB4ODAgIC8qIFJYRU4gUG9sYXJpdHkgU2VsZWN0ICovCi0jZGVmaW5lIFNCMTA1WF9BVFJfUkNNUyAgICAgCTB4NDAgIC8qIFJYRU4gQ29udHJvbCBNb2RlIFNlbGVjdCAqLwotI2RlZmluZSBTQjEwNVhfQVRSX1RQUyAgICAgIAkweDIwICAvKiBUWEVOIFBvbGFyaXR5IFNlbGVjdCAqLwotI2RlZmluZSBTQjEwNVhfQVRSX1RDTVMgICAgIAkweDEwICAvKiBUWEVOIENvbnRyb2wgTW9kZSBTZWxlY3QgKi8KLSNkZWZpbmUgU0IxMDVYX0FUUl9BVERJUyAgICAJMHgwMCAgLyogQXV0byBUb2dnbGUgaXMgZGlzYWJsZWQgKi8KLSNkZWZpbmUgU0IxMDVYX0FUUl9BUlQgICAgICAJMHgwMSAgLyogUlRTIy9UWEVOIHBpbiBvcGVyYXRlcyBhcyBUWEVOICovCi0jZGVmaW5lIFNCMTA1WF9BVFJfQURUICAgICAgCTB4MDIgIC8qIERUUiMvVFhFTiBwaW4gb3BlcmF0ZXMgYXMgVFhFTiAqLwotI2RlZmluZSBTQjEwNVhfQVRSX0E4MCAgICAgIAkweDAzICAvKiBvbmx5IGluIDgwIHBpbiB1c2UgKi8KLQotI2RlZmluZSBTQjEwNVhfRUZSCQkyCS8qIChBdXRvKSBFbmhhbmNlZCBGZWF0dXJlIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNCMTA1WF9FRlJfQUNUUyAgICAgCTB4ODAgIC8qIEF1dG8tQ1RTIEZsb3cgQ29udHJvbCBFbmFibGUgKi8KLSNkZWZpbmUgU0IxMDVYX0VGUl9BUlRTICAgICAJMHg0MCAgLyogQXV0by1SVFMgRmxvdyBDb250cm9sIEVuYWJsZSAqLwotI2RlZmluZSBTQjEwNVhfRUZSX1NDRCAgICAgIAkweDIwICAvKiBTcGVjaWFsIENoYXJhY3RlciBEZXRlY3QgKi8KLSNkZWZpbmUgU0IxMDVYX0VGUl9FRkJFTiAgICAJMHgxMCAgLyogRW5oYW5jZWQgRnVuY3Rpb24gQml0cyBFbmFibGUgKi8KLQotI2RlZmluZSBTQjEwNVhfWE9OMQkJNAkvKiBYb24xIENoYXJhY3RlciBSZWdpc3RlciAqLwotI2RlZmluZSBTQjEwNVhfWE9OMgkJNQkvKiBYb24yIENoYXJhY3RlciBSZWdpc3RlciAqLwotI2RlZmluZSBTQjEwNVhfWE9GRjEJCTYJLyogWG9mZjEgQ2hhcmFjdGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNCMTA1WF9YT0ZGMgkJNwkvKiBYb2ZmMiBDaGFyYWN0ZXIgUmVnaXN0ZXIgKi8KLQotLyoKLSAqICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAqIExDUiA9IDB4QkYsIFBTUlswXSA9IDEgICAgICAgPT09PT09PT09PT09ICAgICBQYWdlIDQgUmVnaXN0ZXJzICoKLSAqICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jZGVmaW5lIFNCMTA1WF9BRlIJCTEJLyogQWRkaXRpb25hbCBGZWF0dXJlIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNCMTA1WF9BRlJfR0lQUyAgICAgCTB4MjAgIC8qIEdsb2JhbCBJbnRlcnJ1cHQgUG9sYXJpdHkgU2VsZWN0ICovCi0jZGVmaW5lIFNCMTA1WF9BRlJfR0lFTiAgICAgCTB4MTAgIC8qIEdsb2JhbCBJbnRlcnJ1cHQgRW5hYmxlICovCi0jZGVmaW5lIFNCMTA1WF9BRlJfQUZFTiAgICAgCTB4MDEgIC8qIDI1Ni1ieXRlIEZJRk8gRW5hYmxlICovCi0KLSNkZWZpbmUgU0IxMDVYX1hSQ1IJCTIJLyogWG9mZiBSZS10cmFuc21pdCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZSBTQjEwNVhfWFJDUl9OUkMxICAgIAkweDAwICAvKiBUcmFuc21pdHMgWG9mZiBDaGFyYWN0ZXIgd2hlbmV2ZXIgdGhlIG51bWJlciBvZiByZWNlaXZlZCBkYXRhIGlzIDEgZHVyaW5nIFhPRkYgc3RhdHVzICovCi0jZGVmaW5lIFNCMTA1WF9YUkNSX05SQzQgICAgCTB4MDEgIC8qIFRyYW5zbWl0cyBYb2ZmIENoYXJhY3RlciB3aGVuZXZlciB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIGRhdGEgaXMgNCBkdXJpbmcgWE9GRiBzdGF0dXMgKi8KLSNkZWZpbmUgU0IxMDVYX1hSQ1JfTlJDOCAgICAJMHgwMiAgLyogVHJhbnNtaXRzIFhvZmYgQ2hhcmFjdGVyIHdoZW5ldmVyIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZGF0YSBpcyA4IGR1cmluZyBYT0ZGIHN0YXR1cyAqLwotI2RlZmluZSBTQjEwNVhfWFJDUl9OUkMxNiAgIAkweDAzICAvKiBUcmFuc21pdHMgWG9mZiBDaGFyYWN0ZXIgd2hlbmV2ZXIgdGhlIG51bWJlciBvZiByZWNlaXZlZCBkYXRhIGlzIDE2IGR1cmluZyBYT0ZGIHN0YXR1cyAqLwotCi0jZGVmaW5lIFNCMTA1WF9UVFIJCTQJLyogVHJhbnNtaXQgRklGTyBUcmlnZ2VyIExldmVsIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNCMTA1WF9SVFIJCTUJLyogUmVjZWl2ZSBGSUZPIFRyaWdnZXIgTGV2ZWwgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0IxMDVYX0ZVUgkJNgkvKiBGbG93IENvbnRyb2wgVXBwZXIgVGhyZXNob2xkIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNCMTA1WF9GTFIJCTcJLyogRmxvdyBDb250cm9sIExvd2VyIFRocmVzaG9sZCBSZWdpc3RlciAqLwotCi0KLS8qIHBhZ2UgMCAqLwotCi0jZGVmaW5lIFNCMTA1WF9HRVRfQ0hBUihwb3J0KQlpbmIoKHBvcnQpLT5pb2Jhc2UgKyBTQjEwNVhfUlgpCi0jZGVmaW5lIFNCMTA1WF9HRVRfSUVSKHBvcnQpCWluYigocG9ydCktPmlvYmFzZSArIFNCMTA1WF9JRVIpCi0jZGVmaW5lIFNCMTA1WF9HRVRfSVNSKHBvcnQpCWluYigocG9ydCktPmlvYmFzZSArIFNCMTA1WF9JU1IpCi0jZGVmaW5lIFNCMTA1WF9HRVRfTENSKHBvcnQpCWluYigocG9ydCktPmlvYmFzZSArIFNCMTA1WF9MQ1IpCi0jZGVmaW5lIFNCMTA1WF9HRVRfTUNSKHBvcnQpCWluYigocG9ydCktPmlvYmFzZSArIFNCMTA1WF9NQ1IpCi0jZGVmaW5lIFNCMTA1WF9HRVRfTFNSKHBvcnQpCWluYigocG9ydCktPmlvYmFzZSArIFNCMTA1WF9MU1IpCi0jZGVmaW5lIFNCMTA1WF9HRVRfTVNSKHBvcnQpCWluYigocG9ydCktPmlvYmFzZSArIFNCMTA1WF9NU1IpCi0jZGVmaW5lIFNCMTA1WF9HRVRfU1BSKHBvcnQpCWluYigocG9ydCktPmlvYmFzZSArIFNCMTA1WF9TUFIpCi0KLSNkZWZpbmUgU0IxMDVYX1BVVF9DSEFSKHBvcnQsdikJb3V0YigodiksKHBvcnQpLT5pb2Jhc2UgKyBTQjEwNVhfVFggKQotI2RlZmluZSBTQjEwNVhfUFVUX0lFUihwb3J0LHYpCW91dGIoKHYpLChwb3J0KS0+aW9iYXNlICsgU0IxMDVYX0lFUiApCi0jZGVmaW5lIFNCMTA1WF9QVVRfRkNSKHBvcnQsdikJb3V0YigodiksKHBvcnQpLT5pb2Jhc2UgKyBTQjEwNVhfRkNSICkKLSNkZWZpbmUgU0IxMDVYX1BVVF9MQ1IocG9ydCx2KQlvdXRiKCh2KSwocG9ydCktPmlvYmFzZSArIFNCMTA1WF9MQ1IgKQotI2RlZmluZSBTQjEwNVhfUFVUX01DUihwb3J0LHYpCW91dGIoKHYpLChwb3J0KS0+aW9iYXNlICsgU0IxMDVYX01DUiApCi0jZGVmaW5lIFNCMTA1WF9QVVRfU1BSKHBvcnQsdikJb3V0YigodiksKHBvcnQpLT5pb2Jhc2UgKyBTQjEwNVhfU1BSICkKLQotCi0vKiBwYWdlIDEgKi8KLSNkZWZpbmUgU0IxMDVYX0dFVF9SRUcocG9ydCxyZWcpCWluYigocG9ydCktPmlvYmFzZSArIChyZWcpKQotI2RlZmluZSBTQjEwNVhfUFVUX1JFRyhwb3J0LHJlZyx2KQlvdXRiKCh2KSwocG9ydCktPmlvYmFzZSArIChyZWcpKQotCi0vKiBwYWdlIDIgKi8KLQotI2RlZmluZSBTQjEwNVhfUFVUX1BTUihwb3J0LHYpCW91dGIoKHYpLChwb3J0KS0+aW9iYXNlICsgU0IxMDVYX1BTUiApCi0KLSNlbmRpZiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYjEwNXgvc2JfcGNpX21wLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2IxMDV4L3NiX3BjaV9tcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWQ2ZWUzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zYjEwNXgvc2JfcGNpX21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTg5ICswLDAgQEAKLSNpbmNsdWRlICJzYl9wY2lfbXAuaCIKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+Ci0KLWV4dGVybiBzdHJ1Y3QgcGFycG9ydCAqcGFycG9ydF9wY19wcm9iZV9wb3J0KHVuc2lnbmVkIGxvbmcgYmFzZV9sbywKLQkJdW5zaWduZWQgbG9uZyBiYXNlX2hpLAotCQlpbnQgaXJxLCBpbnQgZG1hLAotCQlzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCWludCBpcnFmbGFncyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgbXBfZGV2aWNlX3QgbXBfZGV2c1tNQVhfTVBfREVWXTsKLXN0YXRpYyBpbnQgbXBfbnJwY2licmRzID0gc2l6ZW9mKG1wX3BjaWJvYXJkcykvc2l6ZW9mKG1wcGNpYnJkX3QpOwotc3RhdGljIGludCBOUl9CT0FSRD0wOwotc3RhdGljIGludCBOUl9QT1JUUz0wOwotc3RhdGljIHN0cnVjdCBtcF9wb3J0IG11bHRpX3BvcnRzW01BWF9NUF9QT1JUXTsKLXN0YXRpYyBzdHJ1Y3QgaXJxX2luZm8gaXJxX2xpc3RzW05SX0lSUVNdOwotCi1zdGF0aWMgX0lOTElORV8gdW5zaWduZWQgaW50IHNlcmlhbF9pbihzdHJ1Y3QgbXBfcG9ydCAqbXRwdCwgaW50IG9mZnNldCk7Ci1zdGF0aWMgX0lOTElORV8gdm9pZCBzZXJpYWxfb3V0KHN0cnVjdCBtcF9wb3J0ICptdHB0LCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpOwotc3RhdGljIF9JTkxJTkVfIHVuc2lnbmVkIGludCByZWFkX29wdGlvbl9yZWdpc3RlcihzdHJ1Y3QgbXBfcG9ydCAqbXRwdCwgaW50IG9mZnNldCk7Ci1zdGF0aWMgaW50IHNiMTA1NF9nZXRfcmVnaXN0ZXIoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgaW50IHBhZ2UsIGludCByZWcpOwotc3RhdGljIGludCBzYjEwNTRfc2V0X3JlZ2lzdGVyKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIGludCBwYWdlLCBpbnQgcmVnLCBpbnQgdmFsdWUpOwotc3RhdGljIHZvaWQgU2VuZEFUQ29tbWFuZChzdHJ1Y3QgbXBfcG9ydCAqbXRwdCk7Ci1zdGF0aWMgaW50IHNldF9kZWVwX2ZpZm8oc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgaW50IHN0YXR1cyk7Ci1zdGF0aWMgaW50IGdldF9kZWVwX2ZpZm8oc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgaW50IGdldF9kZXZpY2VfdHlwZShpbnQgYXJnKTsKLXN0YXRpYyBpbnQgc2V0X2F1dG9fcnRzKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIGludCBzdGF0dXMpOwotc3RhdGljIHZvaWQgbXBfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyB2b2lkIF9fbXBfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgdm9pZCBtcF9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyB2b2lkIG1wX3Rhc2tsZXRfYWN0aW9uKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgbXBfdXBkYXRlX21jdHJsKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcik7Ci1zdGF0aWMgaW50IG1wX3N0YXJ0dXAoc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlLCBpbnQgaW5pdF9odyk7Ci1zdGF0aWMgdm9pZCBtcF9zaHV0ZG93bihzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUpOwotc3RhdGljIHZvaWQgbXBfY2hhbmdlX3NwZWVkKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSwgc3RydWN0IE1QX1RFUk1JT1MgKm9sZF90ZXJtaW9zKTsKLQotc3RhdGljIGlubGluZSBpbnQgX19tcF9wdXRfY2hhcihzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3QgY2lyY19idWYgKmNpcmMsIHVuc2lnbmVkIGNoYXIgYyk7Ci1zdGF0aWMgaW50IG1wX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpOwotCi1zdGF0aWMgdm9pZCBtcF9wdXRfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgaW50IG1wX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKLXN0YXRpYyBpbnQgbXBfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyBpbnQgbXBfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgbXBfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgbXBfc2VuZF94Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKTsKLXN0YXRpYyB2b2lkIG1wX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgbXBfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyBpbnQgbXBfZ2V0X2luZm8oc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqcmV0aW5mbyk7Ci1zdGF0aWMgaW50IG1wX3NldF9pbmZvKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKm5ld2luZm8pOwotc3RhdGljIGludCBtcF9nZXRfbHNyX2luZm8oc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBpbnQgKnZhbHVlKTsKLQotc3RhdGljIGludCBtcF90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyBpbnQgbXBfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKLXN0YXRpYyBpbnQgbXBfYnJlYWtfY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSk7Ci1zdGF0aWMgaW50IG1wX2RvX2F1dG9jb25maWcoc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlKTsKLXN0YXRpYyBpbnQgbXBfd2FpdF9tb2RlbV9zdGF0dXMoc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1zdGF0aWMgaW50IG1wX2dldF9jb3VudChzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0ICppY250KTsKLXN0YXRpYyBpbnQgbXBfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotc3RhdGljIHZvaWQgbXBfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IE1QX1RFUk1JT1MgKm9sZF90ZXJtaW9zKTsKLXN0YXRpYyB2b2lkIG1wX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKTsKLXN0YXRpYyB2b2lkIG1wX3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCk7Ci1zdGF0aWMgdm9pZCBtcF9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgdm9pZCBtcF91cGRhdGVfdGVybWlvcyhzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUpOwotc3RhdGljIGludCBtcF9ibG9ja190aWxfcmVhZHkoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSk7Ci1zdGF0aWMgc3RydWN0IHNiX3VhcnRfc3RhdGUgKnVhcnRfZ2V0KHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2LCBpbnQgbGluZSk7Ci1zdGF0aWMgaW50IG1wX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApOwotc3RhdGljIGNvbnN0IGNoYXIgKm1wX3R5cGUoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgdm9pZCBtcF9jaGFuZ2VfcG0oc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlLCBpbnQgcG1fc3RhdGUpOwotc3RhdGljIGlubGluZSB2b2lkIG1wX3JlcG9ydF9wb3J0KHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2LCBzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyB2b2lkIG1wX2NvbmZpZ3VyZV9wb3J0KHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2LCBzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpOwotc3RhdGljIHZvaWQgbXBfdW5jb25maWd1cmVfcG9ydChzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydiwgc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlKTsKLXN0YXRpYyBpbnQgbXBfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2KTsKLXN0YXRpYyB2b2lkIG1wX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2KTsKLXN0YXRpYyBpbnQgbXBfYWRkX29uZV9wb3J0KHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2LCBzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyBpbnQgbXBfcmVtb3ZlX29uZV9wb3J0KHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2LCBzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyB2b2lkIGF1dG9jb25maWcoc3RydWN0IG1wX3BvcnQgKm10cHQsIHVuc2lnbmVkIGludCBwcm9iZWZsYWdzKTsKLXN0YXRpYyB2b2lkIGF1dG9jb25maWdfaXJxKHN0cnVjdCBtcF9wb3J0ICptdHB0KTsKLXN0YXRpYyB2b2lkIG11bHRpX3N0b3BfdHgoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgdm9pZCBtdWx0aV9zdGFydF90eChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyB2b2lkIG11bHRpX3N0b3Bfcngoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgdm9pZCBtdWx0aV9lbmFibGVfbXMoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgX0lOTElORV8gdm9pZCByZWNlaXZlX2NoYXJzKHN0cnVjdCBtcF9wb3J0ICptdHB0LCBpbnQgKnN0YXR1cyApOwotc3RhdGljIF9JTkxJTkVfIHZvaWQgdHJhbnNtaXRfY2hhcnMoc3RydWN0IG1wX3BvcnQgKm10cHQpOwotc3RhdGljIF9JTkxJTkVfIHZvaWQgY2hlY2tfbW9kZW1fc3RhdHVzKHN0cnVjdCBtcF9wb3J0ICptdHB0KTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBtdWx0aV9oYW5kbGVfcG9ydChzdHJ1Y3QgbXBfcG9ydCAqbXRwdCk7Ci1zdGF0aWMgaXJxcmV0dXJuX3QgbXVsdGlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCk7Ci1zdGF0aWMgdm9pZCBzZXJpYWxfZG9fdW5saW5rKHN0cnVjdCBpcnFfaW5mbyAqaSwgc3RydWN0IG1wX3BvcnQgKm10cHQpOwotc3RhdGljIGludCBzZXJpYWxfbGlua19pcnFfY2hhaW4oc3RydWN0IG1wX3BvcnQgKm10cHQpOwotc3RhdGljIHZvaWQgc2VyaWFsX3VubGlua19pcnFfY2hhaW4oc3RydWN0IG1wX3BvcnQgKm10cHQpOwotc3RhdGljIHZvaWQgbXVsdGlfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHVuc2lnbmVkIGludCBtdWx0aV90eF9lbXB0eShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbXVsdGlfZ2V0X21jdHJsKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpOwotc3RhdGljIHZvaWQgbXVsdGlfc2V0X21jdHJsKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBtY3RybCk7Ci1zdGF0aWMgdm9pZCBtdWx0aV9icmVha19jdGwoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKTsKLXN0YXRpYyBpbnQgbXVsdGlfc3RhcnR1cChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyB2b2lkIG11bHRpX3NodXRkb3duKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpOwotc3RhdGljIHVuc2lnbmVkIGludCBtdWx0aV9nZXRfZGl2aXNvcihzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgYmF1ZCk7Ci1zdGF0aWMgdm9pZCBtdWx0aV9zZXRfdGVybWlvcyhzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3QgTVBfVEVSTUlPUyAqdGVybWlvcywgc3RydWN0IE1QX1RFUk1JT1MgKm9sZCk7Ci1zdGF0aWMgdm9pZCBtdWx0aV9wbShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgc3RhdGUsIHVuc2lnbmVkIGludCBvbGRzdGF0ZSk7Ci1zdGF0aWMgdm9pZCBtdWx0aV9yZWxlYXNlX3N0ZF9yZXNvdXJjZShzdHJ1Y3QgbXBfcG9ydCAqbXRwdCk7Ci1zdGF0aWMgdm9pZCBtdWx0aV9yZWxlYXNlX3BvcnQoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgaW50IG11bHRpX3JlcXVlc3RfcG9ydChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyB2b2lkIG11bHRpX2NvbmZpZ19wb3J0KHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIGludCBmbGFncyk7Ci1zdGF0aWMgaW50IG11bHRpX3ZlcmlmeV9wb3J0KHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBzZXJpYWxfc3RydWN0ICpzZXIpOwotc3RhdGljIGNvbnN0IGNoYXIgKm11bHRpX3R5cGUoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgdm9pZCBfX2luaXQgbXVsdGlfaW5pdF9wb3J0cyh2b2lkKTsKLXN0YXRpYyB2b2lkIF9faW5pdCBtdWx0aV9yZWdpc3Rlcl9wb3J0cyhzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydik7Ci1zdGF0aWMgaW50IGluaXRfbXBfZGV2KHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIG1wcGNpYnJkX3QgYnJkKTsKLQotc3RhdGljIGludCBkZWVwWzI1Nl07Ci1zdGF0aWMgaW50IGRlZXBfY291bnQ7Ci1zdGF0aWMgaW50IGZjcl9hcnJbMjU2XTsKLXN0YXRpYyBpbnQgZmNyX2NvdW50Owotc3RhdGljIGludCB0dHJbMjU2XTsKLXN0YXRpYyBpbnQgdHRyX2NvdW50Owotc3RhdGljIGludCBydHJbMjU2XTsKLXN0YXRpYyBpbnQgcnRyX2NvdW50OwotCi1tb2R1bGVfcGFyYW1fYXJyYXkoZGVlcCxpbnQsJmRlZXBfY291bnQsMCk7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoZmNyX2FycixpbnQsJmZjcl9jb3VudCwwKTsKLW1vZHVsZV9wYXJhbV9hcnJheSh0dHIsaW50LCZ0dHJfY291bnQsMCk7Ci1tb2R1bGVfcGFyYW1fYXJyYXkocnRyLGludCwmcnRyX2NvdW50LDApOwotCi1zdGF0aWMgX0lOTElORV8gdW5zaWduZWQgaW50IHNlcmlhbF9pbihzdHJ1Y3QgbXBfcG9ydCAqbXRwdCwgaW50IG9mZnNldCkKLXsKLQlyZXR1cm4gaW5iKG10cHQtPnBvcnQuaW9iYXNlICsgb2Zmc2V0KTsKLX0KLQotc3RhdGljIF9JTkxJTkVfIHZvaWQgc2VyaWFsX291dChzdHJ1Y3QgbXBfcG9ydCAqbXRwdCwgaW50IG9mZnNldCwgaW50IHZhbHVlKQotewotCW91dGIodmFsdWUsIG10cHQtPnBvcnQuaW9iYXNlICsgb2Zmc2V0KTsKLX0KLQotc3RhdGljIF9JTkxJTkVfIHVuc2lnbmVkIGludCByZWFkX29wdGlvbl9yZWdpc3RlcihzdHJ1Y3QgbXBfcG9ydCAqbXRwdCwgaW50IG9mZnNldCkKLXsKLQlyZXR1cm4gaW5iKG10cHQtPm9wdGlvbl9iYXNlX2FkZHIgKyBvZmZzZXQpOwotfQotCi1zdGF0aWMgaW50IHNiMTA1M2FfZ2V0X2ludGVyZmFjZShzdHJ1Y3QgbXBfcG9ydCAqbXRwdCwgaW50IHBvcnRfbnVtKQotewotCXVuc2lnbmVkIGxvbmcgb3B0aW9uX2Jhc2VfYWRkciA9IG10cHQtPm9wdGlvbl9iYXNlX2FkZHI7Ci0JdW5zaWduZWQgaW50ICBpbnRlcmZhY2UgPSAwOwotCi0Jc3dpdGNoIChwb3J0X251bSkKLQl7Ci0JCWNhc2UgMDoKLQkJY2FzZSAxOgotCQkJLyogc2V0IEdQT1sxOjBdID0gMDAgKi8KLQkJCW91dGIoMHgwMCwgb3B0aW9uX2Jhc2VfYWRkciArIE1QX09QVFJfR1BPRFIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJY2FzZSAzOgotCQkJLyogc2V0IEdQT1sxOjBdID0gMDEgKi8KLQkJCW91dGIoMHgwMSwgb3B0aW9uX2Jhc2VfYWRkciArIE1QX09QVFJfR1BPRFIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJY2FzZSA1OgotCQkJLyogc2V0IEdQT1sxOjBdID0gMTAgKi8KLQkJCW91dGIoMHgwMiwgb3B0aW9uX2Jhc2VfYWRkciArIE1QX09QVFJfR1BPRFIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci0KLQlwb3J0X251bSAmPSAweDE7Ci0KLQkvKiBnZXQgaW50ZXJmYWNlICovCi0JaW50ZXJmYWNlID0gaW5iKG9wdGlvbl9iYXNlX2FkZHIgKyBNUF9PUFRSX0lJUjAgKyBwb3J0X251bSk7Ci0KLQkvKiBzZXQgR1BPWzE6MF0gPSAxMSAqLwotCW91dGIoMHgwMywgb3B0aW9uX2Jhc2VfYWRkciArIE1QX09QVFJfR1BPRFIpOwotCi0JcmV0dXJuIChpbnRlcmZhY2UpOwotfQotCQkKLXN0YXRpYyBpbnQgc2IxMDU0X2dldF9yZWdpc3RlcihzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBpbnQgcGFnZSwgaW50IHJlZykKLXsKLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBpbnQgbGNyID0gMDsKLQl1bnNpZ25lZCBpbnQgbWNyID0gMDsKLQl1bnNpZ25lZCBpbnQgdG1wID0gMDsKLQotCWlmKCBwYWdlIDw9IDApCi0JewotCQlwcmludGsoIiBwYWdlIDAgY2FuIG5vdCB1c2UgdGhpcyBmdW5jdGlvblxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlzd2l0Y2gocGFnZSkKLQl7Ci0JCWNhc2UgMToKLQkJCWxjciA9IFNCMTA1WF9HRVRfTENSKHBvcnQpOwotCQkJdG1wID0gbGNyIHwgU0IxMDVYX0xDUl9ETEFCOwotCQkJU0IxMDVYX1BVVF9MQ1IocG9ydCwgdG1wKTsKLQotCQkJdG1wID0gU0IxMDVYX0dFVF9MQ1IocG9ydCk7Ci0KLQkJCXJldCA9IFNCMTA1WF9HRVRfUkVHKHBvcnQscmVnKTsKLQkJCVNCMTA1WF9QVVRfTENSKHBvcnQsbGNyKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQltY3IgPSBTQjEwNVhfR0VUX01DUihwb3J0KTsKLQkJCXRtcCA9IG1jciB8IFNCMTA1WF9NQ1JfUDJTOwotCQkJU0IxMDVYX1BVVF9NQ1IocG9ydCx0bXApOwotCi0JCQlyZXQgPSBTQjEwNVhfR0VUX1JFRyhwb3J0LHJlZyk7Ci0KLQkJCVNCMTA1WF9QVVRfTUNSKHBvcnQsbWNyKTsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlsY3IgPSBTQjEwNVhfR0VUX0xDUihwb3J0KTsKLQkJCXRtcCA9IGxjciB8IFNCMTA1WF9MQ1JfQkY7Ci0JCQlTQjEwNVhfUFVUX0xDUihwb3J0LHRtcCk7Ci0JCQlTQjEwNVhfUFVUX1JFRyhwb3J0LFNCMTA1WF9QU1IsU0IxMDVYX1BTUl9QM0tFWSk7Ci0KLQkJCXJldCA9IFNCMTA1WF9HRVRfUkVHKHBvcnQscmVnKTsKLQotCQkJU0IxMDVYX1BVVF9MQ1IocG9ydCxsY3IpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCWxjciA9IFNCMTA1WF9HRVRfTENSKHBvcnQpOwotCQkJdG1wID0gbGNyIHwgU0IxMDVYX0xDUl9CRjsKLQkJCVNCMTA1WF9QVVRfTENSKHBvcnQsdG1wKTsKLQkJCVNCMTA1WF9QVVRfUkVHKHBvcnQsU0IxMDVYX1BTUixTQjEwNVhfUFNSX1A0S0VZKTsKLQotCQkJcmV0ID0gU0IxMDVYX0dFVF9SRUcocG9ydCxyZWcpOwotCi0JCQlTQjEwNVhfUFVUX0xDUihwb3J0LGxjcik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByaW50aygiIGVycm9yIGludmFsaWQgcGFnZSBudW1iZXIgXG4iKTsKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHNiMTA1NF9zZXRfcmVnaXN0ZXIoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgaW50IHBhZ2UsIGludCByZWcsIGludCB2YWx1ZSkKLXsgIAotCWludCBsY3IgPSAwOwotCWludCBtY3IgPSAwOwotCWludCByZXQgPSAwOwotCi0JaWYoIHBhZ2UgPD0gMCkKLQl7Ci0JCXByaW50aygiIHBhZ2UgMCBjYW4gbm90IHVzZSB0aGlzIGZ1bmN0aW9uXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzd2l0Y2gocGFnZSkKLQl7Ci0JCWNhc2UgMToKLQkJCWxjciA9IFNCMTA1WF9HRVRfTENSKHBvcnQpOwotCQkJU0IxMDVYX1BVVF9MQ1IocG9ydCwgbGNyIHwgU0IxMDVYX0xDUl9ETEFCKTsKLQotCQkJU0IxMDVYX1BVVF9SRUcocG9ydCxyZWcsdmFsdWUpOwotCi0JCQlTQjEwNVhfUFVUX0xDUihwb3J0LCBsY3IpOwotCQkJcmV0ID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQltY3IgPSBTQjEwNVhfR0VUX01DUihwb3J0KTsKLQkJCVNCMTA1WF9QVVRfTUNSKHBvcnQsIG1jciB8IFNCMTA1WF9NQ1JfUDJTKTsKLQotCQkJU0IxMDVYX1BVVF9SRUcocG9ydCxyZWcsdmFsdWUpOwotCi0JCQlTQjEwNVhfUFVUX01DUihwb3J0LCBtY3IpOwotCQkJcmV0ID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlsY3IgPSBTQjEwNVhfR0VUX0xDUihwb3J0KTsKLQkJCVNCMTA1WF9QVVRfTENSKHBvcnQsIGxjciB8IFNCMTA1WF9MQ1JfQkYpOwotCQkJU0IxMDVYX1BVVF9QU1IocG9ydCwgU0IxMDVYX1BTUl9QM0tFWSk7Ci0KLQkJCVNCMTA1WF9QVVRfUkVHKHBvcnQscmVnLHZhbHVlKTsKLQotCQkJU0IxMDVYX1BVVF9MQ1IocG9ydCwgbGNyKTsKLQkJCXJldCA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQkJbGNyID0gU0IxMDVYX0dFVF9MQ1IocG9ydCk7Ci0JCQlTQjEwNVhfUFVUX0xDUihwb3J0LCBsY3IgfCBTQjEwNVhfTENSX0JGKTsKLQkJCVNCMTA1WF9QVVRfUFNSKHBvcnQsIFNCMTA1WF9QU1JfUDRLRVkpOwotCi0JCQlTQjEwNVhfUFVUX1JFRyhwb3J0LHJlZyx2YWx1ZSk7Ci0KLQkJCVNCMTA1WF9QVVRfTENSKHBvcnQsIGxjcik7Ci0JCQlyZXQgPSAxOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoIiBlcnJvciBpbnZhbGlkIHBhZ2UgbnVtYmVyIFxuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzZXRfbXVsdGlkcm9wX21vZGUoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IG1vZGUpCi17Ci0JaW50IG1kciA9IFNCMTA1WEFfTURSX05QUzsKLQotCWlmIChtb2RlICYgTURNT0RFX0VOQUJMRSkKLQl7Ci0JCW1kciB8PSBTQjEwNVhBX01EUl9NREU7Ci0JfQotCi0JaWYgKDEpIC8vKG1vZGUgJiBNRE1PREVfQVVUTykKLQl7Ci0JCWludCBlZnIgPSAwOwotCQltZHIgfD0gU0IxMDVYQV9NRFJfQU1FOwotCQllZnIgPSBzYjEwNTRfZ2V0X3JlZ2lzdGVyKHBvcnQsIFBBR0VfMywgU0IxMDVYX0VGUik7Ci0JCWVmciB8PSBTQjEwNVhfRUZSX1NDRDsKLQkJc2IxMDU0X3NldF9yZWdpc3Rlcihwb3J0LCBQQUdFXzMsIFNCMTA1WF9FRlIsIGVmcik7Ci0JfQotCi0Jc2IxMDU0X3NldF9yZWdpc3Rlcihwb3J0LCBQQUdFXzEsIFNCMTA1WEFfTURSLCBtZHIpOwotCXBvcnQtPm1kbW9kZSAmPSB+MHg2OwotCXBvcnQtPm1kbW9kZSB8PSBtb2RlOwotCXByaW50aygiWyVkXSBtdWx0aWRyb3AgaW5pdDogJXhcbiIsIHBvcnQtPmxpbmUsIHBvcnQtPm1kbW9kZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBnZXRfbXVsdGlkcm9wX2FkZHIoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLQlyZXR1cm4gc2IxMDU0X2dldF9yZWdpc3Rlcihwb3J0LCBQQUdFXzMsIFNCMTA1WF9YT0ZGMik7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X211bHRpZHJvcF9hZGRyKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBhZGRyKQotewotCXNiMTA1NF9zZXRfcmVnaXN0ZXIocG9ydCwgUEFHRV8zLCBTQjEwNVhfWE9GRjIsIGFkZHIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIFNlbmRBVENvbW1hbmQoc3RydWN0IG1wX3BvcnQgKm10cHQpCi17Ci0JLy8JCSAgICAgIGEgICAgdAljciAgIGxmCi0JdW5zaWduZWQgY2hhciBjaFtdID0gezB4NjEsMHg3NCwweDBkLDB4MGEsMHgwfTsKLQl1bnNpZ25lZCBjaGFyIGxpbmVDb250cm9sOwotCXVuc2lnbmVkIGNoYXIgaT0wOwotCXVuc2lnbmVkIGNoYXIgRGl2aXNvciA9IDB4YzsKLQotCWxpbmVDb250cm9sID0gc2VyaWFsX2lucChtdHB0LFVBUlRfTENSKTsKLQlzZXJpYWxfb3V0cChtdHB0LFVBUlRfTENSLChsaW5lQ29udHJvbCB8IFVBUlRfTENSX0RMQUIpKTsKLQlzZXJpYWxfb3V0cChtdHB0LFVBUlRfRExMLChEaXZpc29yICYgMHhmZikpOwotCXNlcmlhbF9vdXRwKG10cHQsVUFSVF9ETE0sKERpdmlzb3IgJiAweGZmMDApPj44KTsgLy9iYXVkcmF0ZSBpcyA0ODAwCi0KLQotCXNlcmlhbF9vdXRwKG10cHQsVUFSVF9MQ1IsbGluZUNvbnRyb2wpOwkKLQlzZXJpYWxfb3V0cChtdHB0LFVBUlRfTENSLDB4MDMpOyAvLyBOLTgtMQotCXNlcmlhbF9vdXRwKG10cHQsVUFSVF9GQ1IsNyk7IAotCXNlcmlhbF9vdXRwKG10cHQsVUFSVF9NQ1IsMHgzKTsKLQl3aGlsZShjaFtpXSl7Ci0JCXdoaWxlKChzZXJpYWxfaW5wKG10cHQsVUFSVF9MU1IpICYgMHg2MCkgIT0weDYwKXsKLQkJCTsKLQkJfQotCQlzZXJpYWxfb3V0cChtdHB0LDAsY2hbaSsrXSk7Ci0JfQotCi0KLX0vLyBlbmQgb2YgU2VuZEFUQ29tbWFuZCgpCi0KLXN0YXRpYyBpbnQgc2V0X2RlZXBfZmlmbyhzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBpbnQgc3RhdHVzKQotewotCWludCBhZnJfc3RhdHVzID0gMDsKLQlhZnJfc3RhdHVzID0gc2IxMDU0X2dldF9yZWdpc3Rlcihwb3J0LCBQQUdFXzQsIFNCMTA1WF9BRlIpOwotCi0JaWYoc3RhdHVzID09IEVOQUJMRSkKLQl7Ci0JCWFmcl9zdGF0dXMgfD0gU0IxMDVYX0FGUl9BRkVOOwotCX0KLQllbHNlCi0JewotCQlhZnJfc3RhdHVzICY9IH5TQjEwNVhfQUZSX0FGRU47Ci0JfQotCQkKLQlzYjEwNTRfc2V0X3JlZ2lzdGVyKHBvcnQsUEFHRV80LFNCMTA1WF9BRlIsYWZyX3N0YXR1cyk7Ci0Jc2IxMDU0X3NldF9yZWdpc3Rlcihwb3J0LFBBR0VfNCxTQjEwNVhfVFRSLHR0cltwb3J0LT5saW5lXSk7IAotCXNiMTA1NF9zZXRfcmVnaXN0ZXIocG9ydCxQQUdFXzQsU0IxMDVYX1JUUixydHJbcG9ydC0+bGluZV0pOyAKLQlhZnJfc3RhdHVzID0gc2IxMDU0X2dldF9yZWdpc3Rlcihwb3J0LCBQQUdFXzQsIFNCMTA1WF9BRlIpOwotCQkKLQlyZXR1cm4gYWZyX3N0YXR1czsKLX0KLQotc3RhdGljIGludCBnZXRfZGV2aWNlX3R5cGUoaW50IGFyZykKLXsKLQlpbnQgcmV0OwotICAgICAgICByZXQgPSBpbmIobXBfZGV2c1thcmddLm9wdGlvbl9yZWdfYWRkcitNUF9PUFRSX0RJUjApOwotICAgICAgICByZXQgPSAocmV0ICYgMHhmMCkgPj4gNDsKLSAgICAgICAgc3dpdGNoIChyZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgRElSX1VBUlRfMTZDNTUwOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUE9SVF8xNkM1NVg7Ci0gICAgICAgICAgICAgICBjYXNlIERJUl9VQVJUXzE2QzEwNTA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBQT1JUXzE2QzEwNVg7Ci0gICAgICAgICAgICAgICBjYXNlIERJUl9VQVJUXzE2QzEwNTBBOgotICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgIGlmIChtdHB0LT5wb3J0LmxpbmUgPCAyKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUE9SVF8xNkMxMDVYQTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBpZiAobXRwdC0+ZGV2aWNlLT5kZXZpY2VfaWQgJiAweDUwKQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBPUlRfMTZDNTVYOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUE9SVF8xNkMxMDVYOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0qLwotICAgICAgICAgICAgICAgcmV0dXJuIFBPUlRfMTZDMTA1WEE7Ci0gICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUE9SVF9VTktOT1dOOwotICAgICAgICB9Ci0KLX0KLXN0YXRpYyBpbnQgZ2V0X2RlZXBfZmlmbyhzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotCWludCBhZnJfc3RhdHVzID0gMDsKLQlhZnJfc3RhdHVzID0gc2IxMDU0X2dldF9yZWdpc3Rlcihwb3J0LCBQQUdFXzQsIFNCMTA1WF9BRlIpOwotCXJldHVybiBhZnJfc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IHNldF9hdXRvX3J0cyhzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBpbnQgc3RhdHVzKQotewotCWludCBhdHJfc3RhdHVzID0gMDsKLQotI2lmIDAKLQlpbnQgZWZyX3N0YXR1cyA9IDA7Ci0KLQllZnJfc3RhdHVzID0gc2IxMDU0X2dldF9yZWdpc3Rlcihwb3J0LCBQQUdFXzMsIFNCMTA1WF9FRlIpOwotCWlmKHN0YXR1cyA9PSBFTkFCTEUpCi0JCWVmcl9zdGF0dXMgfD0gU0IxMDVYX0VGUl9BUlRTOwotCWVsc2UKLQkJZWZyX3N0YXR1cyAmPSB+U0IxMDVYX0VGUl9BUlRTOwotCXNiMTA1NF9zZXRfcmVnaXN0ZXIocG9ydCxQQUdFXzMsU0IxMDVYX0VGUixlZnJfc3RhdHVzKTsKLQllZnJfc3RhdHVzID0gc2IxMDU0X2dldF9yZWdpc3Rlcihwb3J0LCBQQUdFXzMsIFNCMTA1WF9FRlIpOwotI2VuZGlmCi0JCQotLy9BVFIKLQlhdHJfc3RhdHVzID0gc2IxMDU0X2dldF9yZWdpc3Rlcihwb3J0LCBQQUdFXzMsIFNCMTA1WF9BVFIpOwotCXN3aXRjaChzdGF0dXMpCi0JewotCQljYXNlIFJTNDIyUFRQOgotCQkJYXRyX3N0YXR1cyA9IChTQjEwNVhfQVRSX1RQUykgfCAoU0IxMDVYX0FUUl9BODApOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlM0MjJNRDoKLQkJCWF0cl9zdGF0dXMgPSAoU0IxMDVYX0FUUl9UUFMpIHwgKFNCMTA1WF9BVFJfVENNUykgfCAoU0IxMDVYX0FUUl9BODApOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlM0ODVORToKLQkJCWF0cl9zdGF0dXMgPSAoU0IxMDVYX0FUUl9SQ01TKSB8IChTQjEwNVhfQVRSX1RQUykgfCAoU0IxMDVYX0FUUl9UQ01TKSB8IChTQjEwNVhfQVRSX0E4MCk7Ci0JCQlicmVhazsKLQkJY2FzZSBSUzQ4NUVDSE86Ci0JCQlhdHJfc3RhdHVzID0gKFNCMTA1WF9BVFJfVFBTKSB8IChTQjEwNVhfQVRSX1RDTVMpIHwgKFNCMTA1WF9BVFJfQTgwKTsKLQkJCWJyZWFrOwotCX0KLQotCXNiMTA1NF9zZXRfcmVnaXN0ZXIocG9ydCxQQUdFXzMsU0IxMDVYX0FUUixhdHJfc3RhdHVzKTsKLQlhdHJfc3RhdHVzID0gc2IxMDU0X2dldF9yZWdpc3Rlcihwb3J0LCBQQUdFXzMsIFNCMTA1WF9BVFIpOwotCi0JcmV0dXJuIGF0cl9zdGF0dXM7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQlwb3J0LT5vcHMtPnN0b3BfdHgocG9ydCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBfX21wX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0KLQlpZiAoIXVhcnRfY2lyY19lbXB0eSgmc3RhdGUtPmluZm8tPnhtaXQpICYmIHN0YXRlLT5pbmZvLT54bWl0LmJ1ZiAmJgotCQkJIXR0eS0+c3RvcHBlZCAmJiAhdHR5LT5od19zdG9wcGVkKQotCQlwb3J0LT5vcHMtPnN0YXJ0X3R4KHBvcnQpOwotfQotCi1zdGF0aWMgdm9pZCBtcF9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCV9fbXBfc3RhcnQodHR5KTsKLX0KLQotc3RhdGljIHZvaWQgbXBfdGFza2xldF9hY3Rpb24odW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqKWRhdGE7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKLQotCXByaW50aygidGFza2xldCBpcyBjYWxsZWQhXG4iKTsKLQl0dHkgPSBzdGF0ZS0+aW5mby0+dHR5OwotCXR0eV93YWtldXAodHR5KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG1wX3VwZGF0ZV9tY3RybChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCi17Ci0JdW5zaWduZWQgaW50IG9sZDsKLQotCW9sZCA9IHBvcnQtPm1jdHJsOwotCXBvcnQtPm1jdHJsID0gKG9sZCAmIH5jbGVhcikgfCBzZXQ7Ci0JaWYgKG9sZCAhPSBwb3J0LT5tY3RybCkKLQkJcG9ydC0+b3BzLT5zZXRfbWN0cmwocG9ydCwgcG9ydC0+bWN0cmwpOwotfQotCi0jZGVmaW5lIHVhcnRfc2V0X21jdHJsKHBvcnQsc2V0KQltcF91cGRhdGVfbWN0cmwocG9ydCxzZXQsMCkKLSNkZWZpbmUgdWFydF9jbGVhcl9tY3RybChwb3J0LGNsZWFyKQltcF91cGRhdGVfbWN0cmwocG9ydCwwLGNsZWFyKQotCi1zdGF0aWMgaW50IG1wX3N0YXJ0dXAoc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlLCBpbnQgaW5pdF9odykKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9pbmZvICppbmZvID0gc3RhdGUtPmluZm87Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCXVuc2lnbmVkIGxvbmcgcGFnZTsKLQlpbnQgcmV0dmFsID0gMDsKLQotCWlmIChpbmZvLT5mbGFncyAmIFVJRl9JTklUSUFMSVpFRCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoaW5mby0+dHR5KQotCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOwotCi0JaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9VTktOT1dOKQotCQlyZXR1cm4gMDsKLQotCWlmICghaW5mby0+eG1pdC5idWYpIHsKLQkJcGFnZSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQkJaWYgKCFwYWdlKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJaW5mby0+eG1pdC5idWYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOwotCQkJCi0JCXVhcnRfY2lyY19jbGVhcigmaW5mby0+eG1pdCk7Ci0JfQotCi0JcmV0dmFsID0gcG9ydC0+b3BzLT5zdGFydHVwKHBvcnQpOwotCWlmIChyZXR2YWwgPT0gMCkgewotCQlpZiAoaW5pdF9odykgewotCQkJbXBfY2hhbmdlX3NwZWVkKHN0YXRlLCBOVUxMKTsKLQotCQkJaWYgKGluZm8tPnR0eSAmJiAoaW5mby0+dHR5LT50ZXJtaW9zLmNfY2ZsYWcgJiBDQkFVRCkpCi0JCQkJdWFydF9zZXRfbWN0cmwocG9ydCwgVElPQ01fUlRTIHwgVElPQ01fRFRSKTsKLQkJfQotCi0JCWluZm8tPmZsYWdzIHw9IFVJRl9JTklUSUFMSVpFRDsKLQotCQlpZiAoaW5mby0+dHR5KQotCQkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOwotCX0KLQotCWlmIChyZXR2YWwgJiYgY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJcmV0dmFsID0gMDsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wX3NodXRkb3duKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9pbmZvICppbmZvID0gc3RhdGUtPmluZm87Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCi0JaWYgKGluZm8tPnR0eSkKLQkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKLQotCWlmIChpbmZvLT5mbGFncyAmIFVJRl9JTklUSUFMSVpFRCkgewotCQlpbmZvLT5mbGFncyAmPSB+VUlGX0lOSVRJQUxJWkVEOwotCi0JCWlmICghaW5mby0+dHR5IHx8IChpbmZvLT50dHktPnRlcm1pb3MuY19jZmxhZyAmIEhVUENMKSkKLQkJCXVhcnRfY2xlYXJfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKLQotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKLQotCQlwb3J0LT5vcHMtPnNodXRkb3duKHBvcnQpOwotCi0JCXN5bmNocm9uaXplX2lycShwb3J0LT5pcnEpOwotCX0KLQl0YXNrbGV0X2tpbGwoJmluZm8tPnRsZXQpOwotCi0JaWYgKGluZm8tPnhtaXQuYnVmKSB7Ci0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylpbmZvLT54bWl0LmJ1Zik7Ci0JCWluZm8tPnhtaXQuYnVmID0gTlVMTDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG1wX2NoYW5nZV9zcGVlZChzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBNUF9URVJNSU9TICpvbGRfdGVybWlvcykKLXsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gc3RhdGUtPmluZm8tPnR0eTsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0KLQlpZiAoIXR0eSB8fCBwb3J0LT50eXBlID09IFBPUlRfVU5LTk9XTikKLQkJcmV0dXJuOwotCi0JaWYgKHR0eS0+dGVybWlvcy5jX2NmbGFnICYgQ1JUU0NUUykKLQkJc3RhdGUtPmluZm8tPmZsYWdzIHw9IFVJRl9DVFNfRkxPVzsKLQllbHNlCi0JCXN0YXRlLT5pbmZvLT5mbGFncyAmPSB+VUlGX0NUU19GTE9XOwotCi0JaWYgKHR0eS0+dGVybWlvcy5jX2NmbGFnICYgQ0xPQ0FMKQotCQlzdGF0ZS0+aW5mby0+ZmxhZ3MgJj0gflVJRl9DSEVDS19DRDsKLQllbHNlCi0JCXN0YXRlLT5pbmZvLT5mbGFncyB8PSBVSUZfQ0hFQ0tfQ0Q7Ci0KLQlwb3J0LT5vcHMtPnNldF90ZXJtaW9zKHBvcnQsICZ0dHktPnRlcm1pb3MsIG9sZF90ZXJtaW9zKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgX19tcF9wdXRfY2hhcihzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3QgY2lyY19idWYgKmNpcmMsIHVuc2lnbmVkIGNoYXIgYykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAwOwotCi0JaWYgKCFjaXJjLT5idWYpCi0JCXJldHVybiAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQlpZiAodWFydF9jaXJjX2NoYXJzX2ZyZWUoY2lyYykgIT0gMCkgewotCQljaXJjLT5idWZbY2lyYy0+aGVhZF0gPSBjOwotCQljaXJjLT5oZWFkID0gKGNpcmMtPmhlYWQgKyAxKSAmIChVQVJUX1hNSVRfU0laRSAtIDEpOwotCQlyZXQgPSAxOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtcF9wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0KLQlyZXR1cm4gX19tcF9wdXRfY2hhcihzdGF0ZS0+cG9ydCwgJnN0YXRlLT5pbmZvLT54bWl0LCBjaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wX3B1dF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCW1wX3N0YXJ0KHR0eSk7Ci19Ci0KLXN0YXRpYyBpbnQgbXBfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0OwotCXN0cnVjdCBjaXJjX2J1ZiAqY2lyYzsKLQlpbnQgYywgcmV0ID0gMDsKLQotCWlmICghc3RhdGUgfHwgIXN0YXRlLT5pbmZvKSB7Ci0JCXJldHVybiAtRUwzSExUOwotCX0KLQotCXBvcnQgPSBzdGF0ZS0+cG9ydDsKLQljaXJjID0gJnN0YXRlLT5pbmZvLT54bWl0OwotCi0JaWYgKCFjaXJjLT5idWYpCi0JCXJldHVybiAwOwotCQkKLQl3aGlsZSAoMSkgewotCQljID0gQ0lSQ19TUEFDRV9UT19FTkQoY2lyYy0+aGVhZCwgY2lyYy0+dGFpbCwgVUFSVF9YTUlUX1NJWkUpOwotCQlpZiAoY291bnQgPCBjKQotCQkJYyA9IGNvdW50OwotCQlpZiAoYyA8PSAwKQotCQkJYnJlYWs7Ci0JbWVtY3B5KGNpcmMtPmJ1ZiArIGNpcmMtPmhlYWQsIGJ1ZiwgYyk7Ci0KLQkJY2lyYy0+aGVhZCA9IChjaXJjLT5oZWFkICsgYykgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKLQkJYnVmICs9IGM7Ci0JCWNvdW50IC09IGM7Ci0JCXJldCArPSBjOwotCX0KLQltcF9zdGFydCh0dHkpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXBfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0KLQlyZXR1cm4gdWFydF9jaXJjX2NoYXJzX2ZyZWUoJnN0YXRlLT5pbmZvLT54bWl0KTsKLX0KLQotc3RhdGljIGludCBtcF9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwotCi0JcmV0dXJuIHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKCZzdGF0ZS0+aW5mby0+eG1pdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFzdGF0ZSB8fCAhc3RhdGUtPmluZm8pIHsKLQkJcmV0dXJuOwotCX0KLQotCXBvcnQgPSBzdGF0ZS0+cG9ydDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCXVhcnRfY2lyY19jbGVhcigmc3RhdGUtPmluZm8tPnhtaXQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7Ci0JdHR5X3dha2V1cCh0dHkpOwotfQotCi1zdGF0aWMgdm9pZCBtcF9zZW5kX3hjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChwb3J0LT5vcHMtPnNlbmRfeGNoYXIpCi0JCXBvcnQtPm9wcy0+c2VuZF94Y2hhcihwb3J0LCBjaCk7Ci0JZWxzZSB7Ci0JCXBvcnQtPnhfY2hhciA9IGNoOwotCQlpZiAoY2gpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JCQlwb3J0LT5vcHMtPnN0YXJ0X3R4KHBvcnQpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBtcF90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0KLQlpZiAoSV9JWE9GRih0dHkpKQotCQltcF9zZW5kX3hjaGFyKHR0eSwgU1RPUF9DSEFSKHR0eSkpOwotCi0JaWYgKHR0eS0+dGVybWlvcy5jX2NmbGFnICYgQ1JUU0NUUykKLQkJdWFydF9jbGVhcl9tY3RybChzdGF0ZS0+cG9ydCwgVElPQ01fUlRTKTsKLX0KLQotc3RhdGljIHZvaWQgbXBfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCi0JaWYgKElfSVhPRkYodHR5KSkgewotCQlpZiAocG9ydC0+eF9jaGFyKQotCQkJcG9ydC0+eF9jaGFyID0gMDsKLQkJZWxzZQotCQkJbXBfc2VuZF94Y2hhcih0dHksIFNUQVJUX0NIQVIodHR5KSk7Ci0JfQotCi0JaWYgKHR0eS0+dGVybWlvcy5jX2NmbGFnICYgQ1JUU0NUUykKLQkJdWFydF9zZXRfbWN0cmwocG9ydCwgVElPQ01fUlRTKTsKLX0KLQotc3RhdGljIGludCBtcF9nZXRfaW5mbyhzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBzZXJpYWxfc3RydWN0ICpyZXRpbmZvKQotewotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB0bXA7Ci0KLQltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOwotCXRtcC50eXBlCSAgICA9IHBvcnQtPnR5cGU7Ci0JdG1wLmxpbmUJICAgID0gcG9ydC0+bGluZTsKLQl0bXAucG9ydAkgICAgPSBwb3J0LT5pb2Jhc2U7Ci0JaWYgKEhJR0hfQklUU19PRkZTRVQpCi0JCXRtcC5wb3J0X2hpZ2ggPSAobG9uZykgcG9ydC0+aW9iYXNlID4+IEhJR0hfQklUU19PRkZTRVQ7Ci0JdG1wLmlycQkJICAgID0gcG9ydC0+aXJxOwotCXRtcC5mbGFncwkgICAgPSBwb3J0LT5mbGFnczsKLQl0bXAueG1pdF9maWZvX3NpemUgID0gcG9ydC0+Zmlmb3NpemU7Ci0JdG1wLmJhdWRfYmFzZQkgICAgPSBwb3J0LT51YXJ0Y2xrIC8gMTY7Ci0JdG1wLmNsb3NlX2RlbGF5CSAgICA9IHN0YXRlLT5jbG9zZV9kZWxheTsKLQl0bXAuY2xvc2luZ193YWl0ICAgID0gc3RhdGUtPmNsb3Npbmdfd2FpdCA9PSBVU0ZfQ0xPU0lOR19XQUlUX05PTkUgPwotCQlBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSA6Ci0JCXN0YXRlLT5jbG9zaW5nX3dhaXQ7Ci0JdG1wLmN1c3RvbV9kaXZpc29yICA9IHBvcnQtPmN1c3RvbV9kaXZpc29yOwotCXRtcC5odWI2CSAgICA9IHBvcnQtPmh1YjY7Ci0JdG1wLmlvX3R5cGUgICAgICAgICA9IHBvcnQtPmlvdHlwZTsKLQl0bXAuaW9tZW1fcmVnX3NoaWZ0ID0gcG9ydC0+cmVnc2hpZnQ7Ci0JdG1wLmlvbWVtX2Jhc2UgICAgICA9ICh2b2lkICopcG9ydC0+bWFwYmFzZTsKLQotCWlmIChjb3B5X3RvX3VzZXIocmV0aW5mbywgJnRtcCwgc2l6ZW9mKCpyZXRpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1wX3NldF9pbmZvKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKm5ld2luZm8pCi17Ci0Jc3RydWN0IHNlcmlhbF9zdHJ1Y3QgbmV3X3NlcmlhbDsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBuZXdfcG9ydDsKLQl1bnNpZ25lZCBpbnQgY2hhbmdlX2lycSwgY2hhbmdlX3BvcnQsIGNsb3Npbmdfd2FpdDsKLQl1bnNpZ25lZCBpbnQgb2xkX2N1c3RvbV9kaXZpc29yOwotCXVuc2lnbmVkIGludCBvbGRfZmxhZ3MsIG5ld19mbGFnczsKLQlpbnQgcmV0dmFsID0gMDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3NlcmlhbCwgbmV3aW5mbywgc2l6ZW9mKG5ld19zZXJpYWwpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQluZXdfcG9ydCA9IG5ld19zZXJpYWwucG9ydDsKLQlpZiAoSElHSF9CSVRTX09GRlNFVCkKLQkJbmV3X3BvcnQgKz0gKHVuc2lnbmVkIGxvbmcpIG5ld19zZXJpYWwucG9ydF9oaWdoIDw8IEhJR0hfQklUU19PRkZTRVQ7Ci0KLQluZXdfc2VyaWFsLmlycSA9IGlycV9jYW5vbmljYWxpemUobmV3X3NlcmlhbC5pcnEpOwotCi0JY2xvc2luZ193YWl0ID0gbmV3X3NlcmlhbC5jbG9zaW5nX3dhaXQgPT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUgPwotCQlVU0ZfQ0xPU0lOR19XQUlUX05PTkUgOiBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdDsKLQlNUF9TVEFURV9MT0NLKHN0YXRlKTsKLQotCWNoYW5nZV9pcnEgID0gbmV3X3NlcmlhbC5pcnEgIT0gcG9ydC0+aXJxOwotCWNoYW5nZV9wb3J0ID0gbmV3X3BvcnQgIT0gcG9ydC0+aW9iYXNlIHx8Ci0JCSh1bnNpZ25lZCBsb25nKW5ld19zZXJpYWwuaW9tZW1fYmFzZSAhPSBwb3J0LT5tYXBiYXNlIHx8Ci0JCW5ld19zZXJpYWwuaHViNiAhPSBwb3J0LT5odWI2IHx8Ci0JCW5ld19zZXJpYWwuaW9fdHlwZSAhPSBwb3J0LT5pb3R5cGUgfHwKLQkJbmV3X3NlcmlhbC5pb21lbV9yZWdfc2hpZnQgIT0gcG9ydC0+cmVnc2hpZnQgfHwKLQkJbmV3X3NlcmlhbC50eXBlICE9IHBvcnQtPnR5cGU7Ci0Jb2xkX2ZsYWdzID0gcG9ydC0+ZmxhZ3M7Ci0JbmV3X2ZsYWdzID0gbmV3X3NlcmlhbC5mbGFnczsKLQlvbGRfY3VzdG9tX2Rpdmlzb3IgPSBwb3J0LT5jdXN0b21fZGl2aXNvcjsKLQotCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewotCQlyZXR2YWwgPSAtRVBFUk07Ci0JCWlmIChjaGFuZ2VfaXJxIHx8IGNoYW5nZV9wb3J0IHx8Ci0JCQkJKG5ld19zZXJpYWwuYmF1ZF9iYXNlICE9IHBvcnQtPnVhcnRjbGsgLyAxNikgfHwKLQkJCQkobmV3X3NlcmlhbC5jbG9zZV9kZWxheSAhPSBzdGF0ZS0+Y2xvc2VfZGVsYXkpIHx8Ci0JCQkJKGNsb3Npbmdfd2FpdCAhPSBzdGF0ZS0+Y2xvc2luZ193YWl0KSB8fAotCQkJCShuZXdfc2VyaWFsLnhtaXRfZmlmb19zaXplICE9IHBvcnQtPmZpZm9zaXplKSB8fAotCQkJCSgoKG5ld19mbGFncyBeIG9sZF9mbGFncykgJiB+VVBGX1VTUl9NQVNLKSAhPSAwKSkKLQkJCWdvdG8gZXhpdDsKLQkJcG9ydC0+ZmxhZ3MgPSAoKHBvcnQtPmZsYWdzICYgflVQRl9VU1JfTUFTSykgfAotCQkJCShuZXdfZmxhZ3MgJiBVUEZfVVNSX01BU0spKTsKLQkJcG9ydC0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOwotCQlnb3RvIGNoZWNrX2FuZF9leGl0OwotCX0KLQotCWlmIChwb3J0LT5vcHMtPnZlcmlmeV9wb3J0KQotCQlyZXR2YWwgPSBwb3J0LT5vcHMtPnZlcmlmeV9wb3J0KHBvcnQsICZuZXdfc2VyaWFsKTsKLQotCWlmICgobmV3X3NlcmlhbC5pcnEgPj0gTlJfSVJRUykgfHwgKG5ld19zZXJpYWwuaXJxIDwgMCkgfHwKLQkJCShuZXdfc2VyaWFsLmJhdWRfYmFzZSA8IDk2MDApKQotCQlyZXR2YWwgPSAtRUlOVkFMOwotCi0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0OwotCi0JaWYgKGNoYW5nZV9wb3J0IHx8IGNoYW5nZV9pcnEpIHsKLQkJcmV0dmFsID0gLUVCVVNZOwotCi0JCWlmICh1YXJ0X3VzZXJzKHN0YXRlKSA+IDEpCi0JCQlnb3RvIGV4aXQ7Ci0KLQkJbXBfc2h1dGRvd24oc3RhdGUpOwotCX0KLQotCWlmIChjaGFuZ2VfcG9ydCkgewotCQl1bnNpZ25lZCBsb25nIG9sZF9pb2Jhc2UsIG9sZF9tYXBiYXNlOwotCQl1bnNpZ25lZCBpbnQgb2xkX3R5cGUsIG9sZF9pb3R5cGUsIG9sZF9odWI2LCBvbGRfc2hpZnQ7Ci0KLQkJb2xkX2lvYmFzZSA9IHBvcnQtPmlvYmFzZTsKLQkJb2xkX21hcGJhc2UgPSBwb3J0LT5tYXBiYXNlOwotCQlvbGRfdHlwZSA9IHBvcnQtPnR5cGU7Ci0JCW9sZF9odWI2ID0gcG9ydC0+aHViNjsKLQkJb2xkX2lvdHlwZSA9IHBvcnQtPmlvdHlwZTsKLQkJb2xkX3NoaWZ0ID0gcG9ydC0+cmVnc2hpZnQ7Ci0KLQkJaWYgKG9sZF90eXBlICE9IFBPUlRfVU5LTk9XTikKLQkJCXBvcnQtPm9wcy0+cmVsZWFzZV9wb3J0KHBvcnQpOwotCi0JCXBvcnQtPmlvYmFzZSA9IG5ld19wb3J0OwotCQlwb3J0LT50eXBlID0gbmV3X3NlcmlhbC50eXBlOwotCQlwb3J0LT5odWI2ID0gbmV3X3NlcmlhbC5odWI2OwotCQlwb3J0LT5pb3R5cGUgPSBuZXdfc2VyaWFsLmlvX3R5cGU7Ci0JCXBvcnQtPnJlZ3NoaWZ0ID0gbmV3X3NlcmlhbC5pb21lbV9yZWdfc2hpZnQ7Ci0JCXBvcnQtPm1hcGJhc2UgPSAodW5zaWduZWQgbG9uZyluZXdfc2VyaWFsLmlvbWVtX2Jhc2U7Ci0KLQkJaWYgKHBvcnQtPnR5cGUgIT0gUE9SVF9VTktOT1dOKSB7Ci0JCQlyZXR2YWwgPSBwb3J0LT5vcHMtPnJlcXVlc3RfcG9ydChwb3J0KTsKLQkJfSBlbHNlIHsKLQkJCXJldHZhbCA9IDA7Ci0JCX0KLQotCQlpZiAocmV0dmFsICYmIG9sZF90eXBlICE9IFBPUlRfVU5LTk9XTikgewotCQkJcG9ydC0+aW9iYXNlID0gb2xkX2lvYmFzZTsKLQkJCXBvcnQtPnR5cGUgPSBvbGRfdHlwZTsKLQkJCXBvcnQtPmh1YjYgPSBvbGRfaHViNjsKLQkJCXBvcnQtPmlvdHlwZSA9IG9sZF9pb3R5cGU7Ci0JCQlwb3J0LT5yZWdzaGlmdCA9IG9sZF9zaGlmdDsKLQkJCXBvcnQtPm1hcGJhc2UgPSBvbGRfbWFwYmFzZTsKLQkJCXJldHZhbCA9IHBvcnQtPm9wcy0+cmVxdWVzdF9wb3J0KHBvcnQpOwotCQkJaWYgKHJldHZhbCkKLQkJCQlwb3J0LT50eXBlID0gUE9SVF9VTktOT1dOOwotCi0JCQlyZXR2YWwgPSAtRUJVU1k7Ci0JCX0KLQl9Ci0KLQlwb3J0LT5pcnEgICAgICAgICAgICAgID0gbmV3X3NlcmlhbC5pcnE7Ci0JcG9ydC0+dWFydGNsayAgICAgICAgICA9IG5ld19zZXJpYWwuYmF1ZF9iYXNlICogMTY7Ci0JcG9ydC0+ZmxhZ3MgICAgICAgICAgICA9IChwb3J0LT5mbGFncyAmIH5VUEZfQ0hBTkdFX01BU0spIHwKLQkJKG5ld19mbGFncyAmIFVQRl9DSEFOR0VfTUFTSyk7Ci0JcG9ydC0+Y3VzdG9tX2Rpdmlzb3IgICA9IG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3I7Ci0Jc3RhdGUtPmNsb3NlX2RlbGF5ICAgICA9IG5ld19zZXJpYWwuY2xvc2VfZGVsYXk7Ci0Jc3RhdGUtPmNsb3Npbmdfd2FpdCAgICA9IGNsb3Npbmdfd2FpdDsKLQlwb3J0LT5maWZvc2l6ZSAgICAgICAgID0gbmV3X3NlcmlhbC54bWl0X2ZpZm9fc2l6ZTsKLQlpZiAoc3RhdGUtPmluZm8tPnR0eSkKLQkJc3RhdGUtPmluZm8tPnR0eS0+bG93X2xhdGVuY3kgPQotCQkJKHBvcnQtPmZsYWdzICYgVVBGX0xPV19MQVRFTkNZKSA/IDEgOiAwOwotCi1jaGVja19hbmRfZXhpdDoKLQlyZXR2YWwgPSAwOwotCWlmIChwb3J0LT50eXBlID09IFBPUlRfVU5LTk9XTikKLQkJZ290byBleGl0OwotCWlmIChzdGF0ZS0+aW5mby0+ZmxhZ3MgJiBVSUZfSU5JVElBTElaRUQpIHsKLQkJaWYgKCgob2xkX2ZsYWdzIF4gcG9ydC0+ZmxhZ3MpICYgVVBGX1NQRF9NQVNLKSB8fAotCQkJCW9sZF9jdXN0b21fZGl2aXNvciAhPSBwb3J0LT5jdXN0b21fZGl2aXNvcikgewotCQkJaWYgKHBvcnQtPmZsYWdzICYgVVBGX1NQRF9NQVNLKSB7Ci0JCQkJcHJpbnRrKEtFUk5fTk9USUNFCi0JCQkJCQkiJXMgc2V0cyBjdXN0b20gc3BlZWQgb24gdHR5TVAlZC4gVGhpcyAiCi0JCQkJCQkiaXMgZGVwcmVjYXRlZC5cbiIsIGN1cnJlbnQtPmNvbW0sCi0JCQkJCQlwb3J0LT5saW5lKTsKLQkJCX0KLQkJCW1wX2NoYW5nZV9zcGVlZChzdGF0ZSwgTlVMTCk7Ci0JCX0KLQl9IGVsc2UKLQkJcmV0dmFsID0gbXBfc3RhcnR1cChzdGF0ZSwgMSk7Ci1leGl0OgotCU1QX1NUQVRFX1VOTE9DSyhzdGF0ZSk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotCi1zdGF0aWMgaW50IG1wX2dldF9sc3JfaW5mbyhzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGludCAqdmFsdWUpCi17Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCXVuc2lnbmVkIGludCByZXN1bHQ7Ci0KLQlyZXN1bHQgPSBwb3J0LT5vcHMtPnR4X2VtcHR5KHBvcnQpOwotCi0JaWYgKHBvcnQtPnhfY2hhciB8fAotCQkJKCh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZygmc3RhdGUtPmluZm8tPnhtaXQpID4gMCkgJiYKLQkJCQkhc3RhdGUtPmluZm8tPnR0eS0+c3RvcHBlZCAmJiAhc3RhdGUtPmluZm8tPnR0eS0+aHdfc3RvcHBlZCkpCi0JCXJlc3VsdCAmPSB+VElPQ1NFUl9URU1UOwotCi0JcmV0dXJuIHB1dF91c2VyKHJlc3VsdCwgdmFsdWUpOwotfQotCi1zdGF0aWMgaW50IG1wX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0JaW50IHJlc3VsdCA9IC1FSU87Ci0KLQlNUF9TVEFURV9MT0NLKHN0YXRlKTsKLQlpZiAoISh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkpIHsKLQkJcmVzdWx0ID0gcG9ydC0+bWN0cmw7Ci0JCXNwaW5fbG9ja19pcnEoJnBvcnQtPmxvY2spOwotCQlyZXN1bHQgfD0gcG9ydC0+b3BzLT5nZXRfbWN0cmwocG9ydCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+bG9jayk7Ci0JfQotCU1QX1NUQVRFX1VOTE9DSyhzdGF0ZSk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBtcF90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0JaW50IHJldCA9IC1FSU87Ci0KLQotCU1QX1NUQVRFX0xPQ0soc3RhdGUpOwotCWlmICghKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgewotCQltcF91cGRhdGVfbWN0cmwocG9ydCwgc2V0LCBjbGVhcik7Ci0JCXJldCA9IDA7Ci0JfQotCU1QX1NUQVRFX1VOTE9DSyhzdGF0ZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1wX2JyZWFrX2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0KLQlNUF9TVEFURV9MT0NLKHN0YXRlKTsKLQotCWlmIChwb3J0LT50eXBlICE9IFBPUlRfVU5LTk9XTikKLQkJcG9ydC0+b3BzLT5icmVha19jdGwocG9ydCwgYnJlYWtfc3RhdGUpOwotCi0JTVBfU1RBVEVfVU5MT0NLKHN0YXRlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtcF9kb19hdXRvY29uZmlnKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0JaW50IGZsYWdzLCByZXQ7Ci0KLQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+bXV0ZXgpKQotCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCXJldCA9IC1FQlVTWTsKLQlpZiAodWFydF91c2VycyhzdGF0ZSkgPT0gMSkgewotCQltcF9zaHV0ZG93bihzdGF0ZSk7Ci0KLQkJaWYgKHBvcnQtPnR5cGUgIT0gUE9SVF9VTktOT1dOKQotCQkJcG9ydC0+b3BzLT5yZWxlYXNlX3BvcnQocG9ydCk7Ci0KLQkJZmxhZ3MgPSBVQVJUX0NPTkZJR19UWVBFOwotCQlpZiAocG9ydC0+ZmxhZ3MgJiBVUEZfQVVUT19JUlEpCi0JCQlmbGFncyB8PSBVQVJUX0NPTkZJR19JUlE7Ci0KLQkJcG9ydC0+b3BzLT5jb25maWdfcG9ydChwb3J0LCBmbGFncyk7Ci0KLQkJcmV0ID0gbXBfc3RhcnR1cChzdGF0ZSwgMSk7Ci0JfQotCU1QX1NUQVRFX1VOTE9DSyhzdGF0ZSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtcF93YWl0X21vZGVtX3N0YXR1cyhzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQlzdHJ1Y3Qgc2JfdWFydF9pY291bnQgY3ByZXYsIGNub3c7Ci0JaW50IHJldDsKLQotCXNwaW5fbG9ja19pcnEoJnBvcnQtPmxvY2spOwotCW1lbWNweSgmY3ByZXYsICZwb3J0LT5pY291bnQsIHNpemVvZihzdHJ1Y3Qgc2JfdWFydF9pY291bnQpKTsKLQotCXBvcnQtPm9wcy0+ZW5hYmxlX21zKHBvcnQpOwotCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+bG9jayk7Ci0KLQlhZGRfd2FpdF9xdWV1ZSgmc3RhdGUtPmluZm8tPmRlbHRhX21zcl93YWl0LCAmd2FpdCk7Ci0JZm9yICg7OykgewotCQlzcGluX2xvY2tfaXJxKCZwb3J0LT5sb2NrKTsKLQkJbWVtY3B5KCZjbm93LCAmcG9ydC0+aWNvdW50LCBzaXplb2Yoc3RydWN0IHNiX3VhcnRfaWNvdW50KSk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+bG9jayk7Ci0KLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQotCQlpZiAoKChhcmcgJiBUSU9DTV9STkcpICYmIChjbm93LnJuZyAhPSBjcHJldi5ybmcpKSB8fAotCQkJCSgoYXJnICYgVElPQ01fRFNSKSAmJiAoY25vdy5kc3IgIT0gY3ByZXYuZHNyKSkgfHwKLQkJCQkoKGFyZyAmIFRJT0NNX0NEKSAgJiYgKGNub3cuZGNkICE9IGNwcmV2LmRjZCkpIHx8Ci0JCQkJKChhcmcgJiBUSU9DTV9DVFMpICYmIChjbm93LmN0cyAhPSBjcHJldi5jdHMpKSkgewotCQkJcmV0ID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc2NoZWR1bGUoKTsKLQotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY3ByZXYgPSBjbm93OwotCX0KLQotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZzdGF0ZS0+aW5mby0+ZGVsdGFfbXNyX3dhaXQsICZ3YWl0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXBfZ2V0X2NvdW50KHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSwgc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgKmljbnQpCi17Ci0Jc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgaWNvdW50ID0ge307Ci0Jc3RydWN0IHNiX3VhcnRfaWNvdW50IGNub3c7Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCi0Jc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7Ci0JbWVtY3B5KCZjbm93LCAmcG9ydC0+aWNvdW50LCBzaXplb2Yoc3RydWN0IHNiX3VhcnRfaWNvdW50KSk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKLQotCWljb3VudC5jdHMgICAgICAgICA9IGNub3cuY3RzOwotCWljb3VudC5kc3IgICAgICAgICA9IGNub3cuZHNyOwotCWljb3VudC5ybmcgICAgICAgICA9IGNub3cucm5nOwotCWljb3VudC5kY2QgICAgICAgICA9IGNub3cuZGNkOwotCWljb3VudC5yeCAgICAgICAgICA9IGNub3cucng7Ci0JaWNvdW50LnR4ICAgICAgICAgID0gY25vdy50eDsKLQlpY291bnQuZnJhbWUgICAgICAgPSBjbm93LmZyYW1lOwotCWljb3VudC5vdmVycnVuICAgICA9IGNub3cub3ZlcnJ1bjsKLQlpY291bnQucGFyaXR5ICAgICAgPSBjbm93LnBhcml0eTsKLQlpY291bnQuYnJrICAgICAgICAgPSBjbm93LmJyazsKLQlpY291bnQuYnVmX292ZXJydW4gPSBjbm93LmJ1Zl9vdmVycnVuOwotCi0JcmV0dXJuIGNvcHlfdG9fdXNlcihpY250LCAmaWNvdW50LCBzaXplb2YoaWNvdW50KSkgPyAtRUZBVUxUIDogMDsKLX0KLQotc3RhdGljIGludCBtcF9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBtcF9wb3J0ICppbmZvID0gKHN0cnVjdCBtcF9wb3J0ICopc3RhdGUtPnBvcnQ7Ci0JaW50IHJldCA9IC1FTk9JT0NUTENNRDsKLQotCi0Jc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBUSU9DU01VTFRJRFJPUDoKLQkJCS8qIHNldCBtdWx0aS1kcm9wIG1vZGUgZW5hYmxlIG9yIGRpc2FibGUsIGFuZCBkZWZhdWx0IG9wZXJhdGlvbiBtb2RlIGlzIEgvVyBtb2RlICovCi0JCQlpZiAoaW5mby0+cG9ydC50eXBlID09IFBPUlRfMTZDMTA1WEEpCi0JCQl7Ci0JCQkJLy9hcmcgJj0gfjB4NjsKLQkJCQkvL3N0YXRlLT5wb3J0LT5tZG1vZGUgPSAwOwotCQkJCXJldHVybiBzZXRfbXVsdGlkcm9wX21vZGUoKHN0cnVjdCBzYl91YXJ0X3BvcnQgKilpbmZvLCAodW5zaWduZWQgaW50KWFyZyk7Ci0JCQl9Ci0JCQlyZXQgPSAtRU5PVFNVUFA7Ci0JCQlicmVhazsKLQkJY2FzZSBHRVRERUVQRklGTzoKLQkJCXJldCA9IGdldF9kZWVwX2ZpZm8oc3RhdGUtPnBvcnQpOwotCQkJcmV0dXJuIHJldDsKLQkJY2FzZSBTRVRERUVQRklGTzoKLQkJCXJldCA9IHNldF9kZWVwX2ZpZm8oc3RhdGUtPnBvcnQsYXJnKTsKLQkJCWRlZXBbc3RhdGUtPnBvcnQtPmxpbmVdID0gYXJnOwotCQkJcmV0dXJuIHJldDsKLQkJY2FzZSBTRVRUVFI6Ci0JCQlpZiAoaW5mby0+cG9ydC50eXBlID09IFBPUlRfMTZDMTA1WCB8fCBpbmZvLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkMxMDVYQSl7Ci0JCQkJcmV0ID0gc2IxMDU0X3NldF9yZWdpc3RlcihzdGF0ZS0+cG9ydCxQQUdFXzQsU0IxMDVYX1RUUixhcmcpOwotCQkJCXR0cltzdGF0ZS0+cG9ydC0+bGluZV0gPSBhcmc7Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0OwotCQljYXNlIFNFVFJUUjoKLQkJCWlmIChpbmZvLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkMxMDVYIHx8IGluZm8tPnBvcnQudHlwZSA9PSBQT1JUXzE2QzEwNVhBKXsKLQkJCQlyZXQgPSBzYjEwNTRfc2V0X3JlZ2lzdGVyKHN0YXRlLT5wb3J0LFBBR0VfNCxTQjEwNVhfUlRSLGFyZyk7Ci0JCQkJcnRyW3N0YXRlLT5wb3J0LT5saW5lXSA9IGFyZzsKLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCWNhc2UgR0VUVFRSOgotCQkJaWYgKGluZm8tPnBvcnQudHlwZSA9PSBQT1JUXzE2QzEwNVggfHwgaW5mby0+cG9ydC50eXBlID09IFBPUlRfMTZDMTA1WEEpewotCQkJCXJldCA9IHNiMTA1NF9nZXRfcmVnaXN0ZXIoc3RhdGUtPnBvcnQsUEFHRV80LFNCMTA1WF9UVFIpOwotCQkJfQotCQkJcmV0dXJuIHJldDsKLQkJY2FzZSBHRVRSVFI6Ci0JCQlpZiAoaW5mby0+cG9ydC50eXBlID09IFBPUlRfMTZDMTA1WCB8fCBpbmZvLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkMxMDVYQSl7Ci0JCQkJcmV0ID0gc2IxMDU0X2dldF9yZWdpc3RlcihzdGF0ZS0+cG9ydCxQQUdFXzQsU0IxMDVYX1JUUik7Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0OwotCi0JCWNhc2UgU0VURkNSOgotCQkJaWYgKGluZm8tPnBvcnQudHlwZSA9PSBQT1JUXzE2QzEwNVggfHwgaW5mby0+cG9ydC50eXBlID09IFBPUlRfMTZDMTA1WEEpewotCQkJCXJldCA9IHNiMTA1NF9zZXRfcmVnaXN0ZXIoc3RhdGUtPnBvcnQsUEFHRV8xLFNCMTA1WF9GQ1IsYXJnKTsKLQkJCX0KLQkJCWVsc2V7Ci0JCQkJc2VyaWFsX291dChpbmZvLDIsYXJnKTsKLQkJCX0KLQotCQkJcmV0dXJuIHJldDsKLQkJY2FzZSBUSU9DU01EQUREUjoKLQkJCS8qIHNldCBtdWx0aS1kcm9wIGFkZHJlc3MgKi8KLQkJCWlmIChpbmZvLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkMxMDVYQSkKLQkJCXsKLQkJCQlzdGF0ZS0+cG9ydC0+bWRtb2RlIHw9IE1ETU9ERV9BRERSOwotCQkJCXJldHVybiBzZXRfbXVsdGlkcm9wX2FkZHIoKHN0cnVjdCBzYl91YXJ0X3BvcnQgKilpbmZvLCAodW5zaWduZWQgaW50KWFyZyk7Ci0JCQl9Ci0JCQlyZXQgPSAtRU5PVFNVUFA7Ci0JCQlicmVhazsKLQotCQljYXNlIFRJT0NHTURBRERSOgotCQkJLyogc2V0IG11bHRpLWRyb3AgYWRkcmVzcyAqLwotCQkJaWYgKChpbmZvLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkMxMDVYQSkgJiYgKHN0YXRlLT5wb3J0LT5tZG1vZGUgJiBNRE1PREVfQUREUikpCi0JCQl7Ci0JCQkJcmV0dXJuIGdldF9tdWx0aWRyb3BfYWRkcigoc3RydWN0IHNiX3VhcnRfcG9ydCAqKWluZm8pOwotCQkJfQotCQkJcmV0ID0gLUVOT1RTVVBQOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBUSU9DU0VOREFERFI6Ci0JCQkvKiBzZW5kIGFkZHJlc3MgaW4gbXVsdGktZHJvcCBtb2RlICovCi0JCQlpZiAoKGluZm8tPnBvcnQudHlwZSA9PSBQT1JUXzE2QzEwNVhBKSAKLQkJCQkJJiYgKHN0YXRlLT5wb3J0LT5tZG1vZGUgJiAoTURNT0RFX0VOQUJMRSkpKQotCQkJewotCQkJCWlmIChtcF9jaGFyc19pbl9idWZmZXIodHR5KSA+IDApCi0JCQkJewotCQkJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7Ci0JCQkJfQotCQkJCS8vd2hpbGUgKChzZXJpYWxfaW4oaW5mbywgVUFSVF9MU1IpICYgMHg2MCkgIT0gMHg2MCk7Ci0JCQkJLy93aGlsZSAoc2IxMDU0X2dldF9yZWdpc3RlcihzdGF0ZS0+cG9ydCwgUEFHRV8yLCBTQjEwNVhfVEZDUikgIT0gMCk7Ci0JCQkJd2hpbGUgKChzZXJpYWxfaW4oaW5mbywgVUFSVF9MU1IpICYgMHg2MCkgIT0gMHg2MCk7Ci0JCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX1NDUiwgKGludClhcmcpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBUSU9DR1NFUklBTDoKLQkJCXJldCA9IG1wX2dldF9pbmZvKHN0YXRlLCAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKilhcmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBUSU9DU1NFUklBTDoKLQkJCXJldCA9IG1wX3NldF9pbmZvKHN0YXRlLCAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKilhcmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBUSU9DU0VSQ09ORklHOgotCQkJcmV0ID0gbXBfZG9fYXV0b2NvbmZpZyhzdGF0ZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFRJT0NTRVJHV0lMRDogLyogb2Jzb2xldGUgKi8KLQkJY2FzZSBUSU9DU0VSU1dJTEQ6IC8qIG9ic29sZXRlICovCi0JCQlyZXQgPSAwOwotCQkJYnJlYWs7Ci0JCQkvKiBmb3IgTXVsdGlwb3J0ICovCi0JCWNhc2UgVElPQ0dOVU1PRlBPUlQ6IC8qIEdldCBudW1iZXIgb2YgcG9ydHMgKi8KLQkJCXJldHVybiBOUl9QT1JUUzsKLQkJY2FzZSBUSU9DR0dFVERFVklEOgotCQkJcmV0dXJuIG1wX2RldnNbYXJnXS5kZXZpY2VfaWQ7Ci0JCWNhc2UgVElPQ0dHRVRSRVY6Ci0JCQlyZXR1cm4gbXBfZGV2c1thcmddLnJldmlzaW9uOwotCQljYXNlIFRJT0NHR0VUTlJQT1JUUzoKLQkJCXJldHVybiBtcF9kZXZzW2FyZ10ubnJfcG9ydHM7Ci0JCWNhc2UgVElPQ0dHRVRCRE5POgotCQkJcmV0dXJuIE5SX0JPQVJEOwotCQljYXNlIFRJT0NHR0VUSU5URVJGQUNFOgotCQkJaWYgKG1wX2RldnNbYXJnXS5yZXZpc2lvbiA9PSAweGMwKQotCQkJewotCQkJCS8qIGZvciBTQjE2QzEwNTNBUENJICovCi0JCQkJcmV0dXJuIChzYjEwNTNhX2dldF9pbnRlcmZhY2UoaW5mbywgaW5mby0+cG9ydC5saW5lKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuIChpbmIobXBfZGV2c1thcmddLm9wdGlvbl9yZWdfYWRkcitNUF9PUFRSX0lJUjArKHN0YXRlLT5wb3J0LT5saW5lLzgpKSk7Ci0JCQl9Ci0JCWNhc2UgVElPQ0dHRVRQT1JUVFlQRToKLQkJCXJldCA9IGdldF9kZXZpY2VfdHlwZShhcmcpOwotCQkJcmV0dXJuIHJldDsKLQkJY2FzZSBUSU9DU01VTFRJRUNITzogLyogc2V0IHRvIG11bHRpLWRyb3AgbW9kZShSUzQyMikgb3IgZWNobyBtb2RlKFJTNDg1KSovCi0JCQlvdXRiKCAoIGluYihpbmZvLT5pbnRlcmZhY2VfY29uZmlnX2FkZHIpICYgfjB4MDMgKSB8IDB4MDEgLCAgCi0JCQkJCWluZm8tPmludGVyZmFjZV9jb25maWdfYWRkcik7Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBUSU9DU1BUUE5PRUNITzogLyogc2V0IHRvIG11bHRpLWRyb3AgbW9kZShSUzQyMikgb3IgZWNobyBtb2RlKFJTNDg1KSAqLwotCQkJb3V0YiggKCBpbmIoaW5mby0+aW50ZXJmYWNlX2NvbmZpZ19hZGRyKSAmIH4weDAzICkgICwgICAgICAgICAgICAgCi0JCQkJCWluZm8tPmludGVyZmFjZV9jb25maWdfYWRkcik7Ci0JCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAocmV0ICE9IC1FTk9JT0NUTENNRCkKLQkJZ290byBvdXQ7Ci0KLQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpIHsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBUSU9DTUlXQUlUOgotCQkJcmV0ID0gbXBfd2FpdF9tb2RlbV9zdGF0dXMoc3RhdGUsIGFyZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFRJT0NHSUNPVU5UOgotCQkJcmV0ID0gbXBfZ2V0X2NvdW50KHN0YXRlLCAoc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgKilhcmcpOwotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKHJldCAhPSAtRU5PSU9DVExDTUQpCi0JCWdvdG8gb3V0OwotCi0JTVBfU1RBVEVfTE9DSyhzdGF0ZSk7Ci0Jc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBUSU9DU0VSR0VUTFNSOiAvKiBHZXQgbGluZSBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJCXJldCA9IG1wX2dldF9sc3JfaW5mbyhzdGF0ZSwgKHVuc2lnbmVkIGludCAqKWFyZyk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OiB7Ci0JCQkJCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQkJCQkJaWYgKHBvcnQtPm9wcy0+aW9jdGwpCi0JCQkJCQlyZXQgPSBwb3J0LT5vcHMtPmlvY3RsKHBvcnQsIGNtZCwgYXJnKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCX0KLQotCU1QX1NUQVRFX1VOTE9DSyhzdGF0ZSk7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgbXBfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IE1QX1RFUk1JT1MgKm9sZF90ZXJtaW9zKQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgY2ZsYWcgPSB0dHktPnRlcm1pb3MuY19jZmxhZzsKLQotI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykJKChpZmxhZykgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLKSkKLQotCWlmICgoY2ZsYWcgXiBvbGRfdGVybWlvcy0+Y19jZmxhZykgPT0gMCAmJgotCQkJUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLmNfaWZsYWcgXiBvbGRfdGVybWlvcy0+Y19pZmxhZykgPT0gMCkKLQkJcmV0dXJuOwotCi0JbXBfY2hhbmdlX3NwZWVkKHN0YXRlLCBvbGRfdGVybWlvcyk7Ci0KLQlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpICYmICEoY2ZsYWcgJiBDQkFVRCkpCi0JCXVhcnRfY2xlYXJfbWN0cmwoc3RhdGUtPnBvcnQsIFRJT0NNX1JUUyB8IFRJT0NNX0RUUik7Ci0KLQlpZiAoIShvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAmJiAoY2ZsYWcgJiBDQkFVRCkpIHsKLQkJdW5zaWduZWQgaW50IG1hc2sgPSBUSU9DTV9EVFI7Ci0JCWlmICghKGNmbGFnICYgQ1JUU0NUUykgfHwKLQkJCQkhdGVzdF9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpKQotCQkJbWFzayB8PSBUSU9DTV9SVFM7Ci0JCXVhcnRfc2V0X21jdHJsKHN0YXRlLT5wb3J0LCBtYXNrKTsKLQl9Ci0KLQlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYgIShjZmxhZyAmIENSVFNDVFMpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+cG9ydC0+bG9jaywgZmxhZ3MpOwotCQl0dHktPmh3X3N0b3BwZWQgPSAwOwotCQlfX21wX3N0YXJ0KHR0eSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5wb3J0LT5sb2NrLCBmbGFncyk7Ci0JfQotCi0JaWYgKCEob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJiAoY2ZsYWcgJiBDUlRTQ1RTKSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKCEoc3RhdGUtPnBvcnQtPm9wcy0+Z2V0X21jdHJsKHN0YXRlLT5wb3J0KSAmIFRJT0NNX0NUUykpIHsKLQkJCXR0eS0+aHdfc3RvcHBlZCA9IDE7Ci0JCQlzdGF0ZS0+cG9ydC0+b3BzLT5zdG9wX3R4KHN0YXRlLT5wb3J0KTsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+cG9ydC0+bG9jaywgZmxhZ3MpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbXBfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0OwotCi0JcHJpbnRrKCJtcF9jbG9zZSFcbiIpOwotCWlmICghc3RhdGUgfHwgIXN0YXRlLT5wb3J0KQotCQlyZXR1cm47Ci0KLQlwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0KLQlwcmludGsoImNsb3NlMSAlZFxuIiwgX19MSU5FX18pOwotCU1QX1NUQVRFX0xPQ0soc3RhdGUpOwotCi0JcHJpbnRrKCJjbG9zZTIgJWRcbiIsIF9fTElORV9fKTsKLQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkKLQkJZ290byBkb25lOwotCi0JcHJpbnRrKCJjbG9zZTMgJWRcbiIsIF9fTElORV9fKTsKLQlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKHN0YXRlLT5jb3VudCAhPSAxKSkgewotCQlwcmludGsoIm1wX2Nsb3NlOiBiYWQgc2VyaWFsIHBvcnQgY291bnQ7IHR0eS0+Y291bnQgaXMgMSwgIgotCQkJCSJzdGF0ZS0+Y291bnQgaXMgJWRcbiIsIHN0YXRlLT5jb3VudCk7Ci0JCXN0YXRlLT5jb3VudCA9IDE7Ci0JfQotCXByaW50aygiY2xvc2U0ICVkXG4iLCBfX0xJTkVfXyk7Ci0JaWYgKC0tc3RhdGUtPmNvdW50IDwgMCkgewotCQlwcmludGsoInJzX2Nsb3NlOiBiYWQgc2VyaWFsIHBvcnQgY291bnQgZm9yIHR0eU1QJWQ6ICVkXG4iLAotCQkJCXBvcnQtPmxpbmUsIHN0YXRlLT5jb3VudCk7Ci0JCXN0YXRlLT5jb3VudCA9IDA7Ci0JfQotCWlmIChzdGF0ZS0+Y291bnQpCi0JCWdvdG8gZG9uZTsKLQotCXR0eS0+Y2xvc2luZyA9IDE7Ci0KLQlwcmludGsoImNsb3NlNSAlZFxuIiwgX19MSU5FX18pOwotCWlmIChzdGF0ZS0+Y2xvc2luZ193YWl0ICE9IFVTRl9DTE9TSU5HX1dBSVRfTk9ORSkKLQkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIHN0YXRlLT5jbG9zaW5nX3dhaXQpOwotCi0JcHJpbnRrKCJjbG9zZTYgJWRcbiIsIF9fTElORV9fKTsKLQlpZiAoc3RhdGUtPmluZm8tPmZsYWdzICYgVUlGX0lOSVRJQUxJWkVEKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JCXBvcnQtPm9wcy0+c3RvcF9yeChwb3J0KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCQltcF93YWl0X3VudGlsX3NlbnQodHR5LCBwb3J0LT50aW1lb3V0KTsKLQl9Ci0JcHJpbnRrKCJjbG9zZTcgJWRcbiIsIF9fTElORV9fKTsKLQotCW1wX3NodXRkb3duKHN0YXRlKTsKLQlwcmludGsoImNsb3NlOCAlZFxuIiwgX19MSU5FX18pOwotCW1wX2ZsdXNoX2J1ZmZlcih0dHkpOwotCXR0eV9sZGlzY19mbHVzaCh0dHkpOwotCXR0eS0+Y2xvc2luZyA9IDA7Ci0Jc3RhdGUtPmluZm8tPnR0eSA9IE5VTEw7Ci0JaWYgKHN0YXRlLT5pbmZvLT5ibG9ja2VkX29wZW4pIAotCXsKLQkJaWYgKHN0YXRlLT5jbG9zZV9kZWxheSkKLQkJewotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoc3RhdGUtPmNsb3NlX2RlbGF5KTsKLQkJfQotCX0KLQllbHNlCi0JewotCQltcF9jaGFuZ2VfcG0oc3RhdGUsIDMpOwotCX0KLQlwcmludGsoImNsb3NlOCAlZFxuIiwgX19MSU5FX18pOwotCi0Jc3RhdGUtPmluZm8tPmZsYWdzICY9IH5VSUZfTk9STUFMX0FDVElWRTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnN0YXRlLT5pbmZvLT5vcGVuX3dhaXQpOwotCi1kb25lOgotCXByaW50aygiY2xvc2UgZG9uZVxuIik7Ci0JTVBfU1RBVEVfVU5MT0NLKHN0YXRlKTsKLQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKLX0KLQotc3RhdGljIHZvaWQgbXBfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCXVuc2lnbmVkIGxvbmcgY2hhcl90aW1lLCBleHBpcmU7Ci0KLQlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1VOS05PV04gfHwgcG9ydC0+Zmlmb3NpemUgPT0gMCkKLQkJcmV0dXJuOwotCi0JY2hhcl90aW1lID0gKHBvcnQtPnRpbWVvdXQgLSBIWi81MCkgLyBwb3J0LT5maWZvc2l6ZTsKLQljaGFyX3RpbWUgPSBjaGFyX3RpbWUgLyA1OwotCWlmIChjaGFyX3RpbWUgPT0gMCkKLQkJY2hhcl90aW1lID0gMTsKLQlpZiAodGltZW91dCAmJiB0aW1lb3V0IDwgY2hhcl90aW1lKQotCQljaGFyX3RpbWUgPSB0aW1lb3V0OwotCi0JaWYgKHRpbWVvdXQgPT0gMCB8fCB0aW1lb3V0ID4gMiAqIHBvcnQtPnRpbWVvdXQpCi0JCXRpbWVvdXQgPSAyICogcG9ydC0+dGltZW91dDsKLQotCWV4cGlyZSA9IGppZmZpZXMgKyB0aW1lb3V0OwotCi0Jd2hpbGUgKCFwb3J0LT5vcHMtPnR4X2VtcHR5KHBvcnQpKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoY2hhcl90aW1lKTsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJYnJlYWs7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGV4cGlyZSkpCi0JCQlicmVhazsKLQl9Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsgLyogbWlnaHQgbm90IGJlIG5lZWRlZCAqLwotfQotCi1zdGF0aWMgdm9pZCBtcF9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwotCi0JTVBfU1RBVEVfTE9DSyhzdGF0ZSk7Ci0JaWYgKHN0YXRlLT5pbmZvICYmIHN0YXRlLT5pbmZvLT5mbGFncyAmIFVJRl9OT1JNQUxfQUNUSVZFKSB7Ci0JCW1wX2ZsdXNoX2J1ZmZlcih0dHkpOwotCQltcF9zaHV0ZG93bihzdGF0ZSk7Ci0JCXN0YXRlLT5jb3VudCA9IDA7Ci0JCXN0YXRlLT5pbmZvLT5mbGFncyAmPSB+VUlGX05PUk1BTF9BQ1RJVkU7Ci0JCXN0YXRlLT5pbmZvLT50dHkgPSBOVUxMOwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnN0YXRlLT5pbmZvLT5vcGVuX3dhaXQpOwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnN0YXRlLT5pbmZvLT5kZWx0YV9tc3Jfd2FpdCk7Ci0JfQotCU1QX1NUQVRFX1VOTE9DSyhzdGF0ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wX3VwZGF0ZV90ZXJtaW9zKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gc3RhdGUtPmluZm8tPnR0eTsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0KLQlpZiAoISh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkpIHsKLQkJbXBfY2hhbmdlX3NwZWVkKHN0YXRlLCBOVUxMKTsKLQotCQlpZiAodHR5LT50ZXJtaW9zLmNfY2ZsYWcgJiBDQkFVRCkKLQkJCXVhcnRfc2V0X21jdHJsKHBvcnQsIFRJT0NNX0RUUiB8IFRJT0NNX1JUUyk7Ci0JfQotfQotCi1zdGF0aWMgaW50IG1wX2Jsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlKQotewotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCXN0cnVjdCBzYl91YXJ0X2luZm8gKmluZm8gPSBzdGF0ZS0+aW5mbzsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0JdW5zaWduZWQgaW50IG1jdHJsOwotCi0JaW5mby0+YmxvY2tlZF9vcGVuKys7Ci0Jc3RhdGUtPmNvdW50LS07Ci0KLQlhZGRfd2FpdF9xdWV1ZSgmaW5mby0+b3Blbl93YWl0LCAmd2FpdCk7Ci0Jd2hpbGUgKDEpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQotCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCBpbmZvLT50dHkgPT0gTlVMTCkKLQkJCWJyZWFrOwotCi0JCWlmICghKGluZm8tPmZsYWdzICYgVUlGX0lOSVRJQUxJWkVEKSkKLQkJCWJyZWFrOwotCi0JCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHx8Ci0JCQkJKGluZm8tPnR0eS0+dGVybWlvcy5jX2NmbGFnICYgQ0xPQ0FMKSB8fAotCQkJCShpbmZvLT50dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkpIHsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGluZm8tPnR0eS0+dGVybWlvcy5jX2NmbGFnICYgQ0JBVUQpCi0JCQl1YXJ0X3NldF9tY3RybChwb3J0LCBUSU9DTV9EVFIpOwotCi0JCXNwaW5fbG9ja19pcnEoJnBvcnQtPmxvY2spOwotCQlwb3J0LT5vcHMtPmVuYWJsZV9tcyhwb3J0KTsKLQkJbWN0cmwgPSBwb3J0LT5vcHMtPmdldF9tY3RybChwb3J0KTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKLQkJaWYgKG1jdHJsICYgVElPQ01fQ0FSKQotCQkJYnJlYWs7Ci0KLQkJTVBfU1RBVEVfVU5MT0NLKHN0YXRlKTsKLQkJc2NoZWR1bGUoKTsKLQkJTVBfU1RBVEVfTE9DSyhzdGF0ZSk7Ci0KLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJYnJlYWs7Ci0JfQotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOwotCi0Jc3RhdGUtPmNvdW50Kys7Ci0JaW5mby0+YmxvY2tlZF9vcGVuLS07Ci0KLQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0KLQlpZiAoIWluZm8tPnR0eSB8fCB0dHlfaHVuZ191cF9wKGZpbHApKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNiX3VhcnRfc3RhdGUgKnVhcnRfZ2V0KHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2LCBpbnQgbGluZSkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGU7Ci0KLQlNUF9NVVRFWF9MT0NLKG1wX211dGV4KTsKLQlzdGF0ZSA9IGRydi0+c3RhdGUgKyBsaW5lOwotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnN0YXRlLT5tdXRleCkpIHsKLQkJc3RhdGUgPSBFUlJfUFRSKC1FUkVTVEFSVFNZUyk7Ci0JCWdvdG8gb3V0OwotCX0KLQlzdGF0ZS0+Y291bnQrKzsKLQlpZiAoIXN0YXRlLT5wb3J0KSB7Ci0JCXN0YXRlLT5jb3VudC0tOwotCQlNUF9TVEFURV9VTkxPQ0soc3RhdGUpOwotCQlzdGF0ZSA9IEVSUl9QVFIoLUVOWElPKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKCFzdGF0ZS0+aW5mbykgewotCQlzdGF0ZS0+aW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYl91YXJ0X2luZm8pLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHN0YXRlLT5pbmZvKSB7Ci0JCQltZW1zZXQoc3RhdGUtPmluZm8sIDAsIHNpemVvZihzdHJ1Y3Qgc2JfdWFydF9pbmZvKSk7Ci0JCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdGF0ZS0+aW5mby0+b3Blbl93YWl0KTsKLQkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN0YXRlLT5pbmZvLT5kZWx0YV9tc3Jfd2FpdCk7Ci0KLQkJCXN0YXRlLT5wb3J0LT5pbmZvID0gc3RhdGUtPmluZm87Ci0KLQkJCXRhc2tsZXRfaW5pdCgmc3RhdGUtPmluZm8tPnRsZXQsIG1wX3Rhc2tsZXRfYWN0aW9uLAotCQkJCQkodW5zaWduZWQgbG9uZylzdGF0ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0ZS0+Y291bnQtLTsKLQkJCU1QX1NUQVRFX1VOTE9DSyhzdGF0ZSk7Ci0JCQlzdGF0ZSA9IEVSUl9QVFIoLUVOT01FTSk7Ci0JCX0KLQl9Ci0KLW91dDoKLQlNUF9NVVRFWF9VTkxPQ0sobXBfbXV0ZXgpOwotCXJldHVybiBzdGF0ZTsKLX0KLQotc3RhdGljIGludCBtcF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2ID0gKHN0cnVjdCB1YXJ0X2RyaXZlciAqKXR0eS0+ZHJpdmVyLT5kcml2ZXJfc3RhdGU7Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlOwotCWludCByZXR2YWw7Ci0JaW50ICBsaW5lID0gdHR5LT5pbmRleDsKLQlzdHJ1Y3QgbXBfcG9ydCAqbXRwdDsKLQotCXJldHZhbCA9IC1FTk9ERVY7Ci0JaWYgKGxpbmUgPj0gdHR5LT5kcml2ZXItPm51bSkKLQkJZ290byBmYWlsOwotCi0Jc3RhdGUgPSB1YXJ0X2dldChkcnYsIGxpbmUpOwotCi0JaWYgKElTX0VSUihzdGF0ZSkpIHsKLQkJcmV0dmFsID0gUFRSX0VSUihzdGF0ZSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQltdHB0ICA9IChzdHJ1Y3QgbXBfcG9ydCAqKXN0YXRlLT5wb3J0OwotCi0JdHR5LT5kcml2ZXJfZGF0YSA9IHN0YXRlOwotCXR0eS0+bG93X2xhdGVuY3kgPSAoc3RhdGUtPnBvcnQtPmZsYWdzICYgVVBGX0xPV19MQVRFTkNZKSA/IDEgOiAwOwotCXR0eS0+YWx0X3NwZWVkID0gMDsKLQlzdGF0ZS0+aW5mby0+dHR5ID0gdHR5OwotCi0JaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIHsKLQkJcmV0dmFsID0gLUVBR0FJTjsKLQkJc3RhdGUtPmNvdW50LS07Ci0JCU1QX1NUQVRFX1VOTE9DSyhzdGF0ZSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlpZiAoc3RhdGUtPmNvdW50ID09IDEpCi0JCW1wX2NoYW5nZV9wbShzdGF0ZSwgMCk7Ci0KLQlyZXR2YWwgPSBtcF9zdGFydHVwKHN0YXRlLCAwKTsKLQotCWlmIChyZXR2YWwgPT0gMCkKLQkJcmV0dmFsID0gbXBfYmxvY2tfdGlsX3JlYWR5KGZpbHAsIHN0YXRlKTsKLQlNUF9TVEFURV9VTkxPQ0soc3RhdGUpOwotCi0JaWYgKHJldHZhbCA9PSAwICYmICEoc3RhdGUtPmluZm8tPmZsYWdzICYgVUlGX05PUk1BTF9BQ1RJVkUpKSB7Ci0JCXN0YXRlLT5pbmZvLT5mbGFncyB8PSBVSUZfTk9STUFMX0FDVElWRTsKLQotCQltcF91cGRhdGVfdGVybWlvcyhzdGF0ZSk7Ci0JfQotCi0JdWFydF9jbGVhcl9tY3RybChzdGF0ZS0+cG9ydCwgVElPQ01fUlRTKTsKLQl0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSk7Ci1mYWlsOgotCXJldHVybiByZXR2YWw7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKm1wX3R5cGUoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLQljb25zdCBjaGFyICpzdHIgPSBOVUxMOwotCi0JaWYgKHBvcnQtPm9wcy0+dHlwZSkKLQkJc3RyID0gcG9ydC0+b3BzLT50eXBlKHBvcnQpOwotCi0JaWYgKCFzdHIpCi0JCXN0ciA9ICJ1bmtub3duIjsKLQotCXJldHVybiBzdHI7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wX2NoYW5nZV9wbShzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUsIGludCBwbV9zdGF0ZSkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0JaWYgKHBvcnQtPm9wcy0+cG0pCi0JCXBvcnQtPm9wcy0+cG0ocG9ydCwgcG1fc3RhdGUsIHN0YXRlLT5wbV9zdGF0ZSk7Ci0Jc3RhdGUtPnBtX3N0YXRlID0gcG1fc3RhdGU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtcF9yZXBvcnRfcG9ydChzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydiwgc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLQljaGFyIGFkZHJlc3NbNjRdOwotCi0Jc3dpdGNoIChwb3J0LT5pb3R5cGUpIHsKLQkJY2FzZSBVUElPX1BPUlQ6Ci0JCQlzbnByaW50ZihhZGRyZXNzLCBzaXplb2YoYWRkcmVzcyksIkkvTyAweCV4IiwgcG9ydC0+aW9iYXNlKTsKLQkJCWJyZWFrOwotCQljYXNlIFVQSU9fSFVCNjoKLQkJCXNucHJpbnRmKGFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSwiSS9PIDB4JXggb2Zmc2V0IDB4JXgiLCBwb3J0LT5pb2Jhc2UsIHBvcnQtPmh1YjYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVVBJT19NRU06Ci0JCQlzbnByaW50ZihhZGRyZXNzLCBzaXplb2YoYWRkcmVzcyksIk1NSU8gMHglbHgiLCBwb3J0LT5tYXBiYXNlKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc25wcmludGYoYWRkcmVzcywgc2l6ZW9mKGFkZHJlc3MpLCIqdW5rbm93bioiICk7Ci0JCQlzdHJsY3B5KGFkZHJlc3MsICIqdW5rbm93bioiLCBzaXplb2YoYWRkcmVzcykpOwotCQkJYnJlYWs7Ci0JfQotCi0JcHJpbnRrKCAiJXMlZCBhdCAlcyAoaXJxID0gJWQpIGlzIGEgJXNcbiIsCi0JCQlkcnYtPmRldl9uYW1lLCBwb3J0LT5saW5lLCBhZGRyZXNzLCBwb3J0LT5pcnEsIG1wX3R5cGUocG9ydCkpOwotCi19Ci0KLXN0YXRpYyB2b2lkIG1wX2NvbmZpZ3VyZV9wb3J0KHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2LCBzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0JdW5zaWduZWQgaW50IGZsYWdzOwotCi0KLQlpZiAoIXBvcnQtPmlvYmFzZSAmJiAhcG9ydC0+bWFwYmFzZSAmJiAhcG9ydC0+bWVtYmFzZSkKLQl7Ci0JCURQUklOVEsoIiVzIGVycm9yIFxuIixfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm47Ci0JfQotCWZsYWdzID0gVUFSVF9DT05GSUdfVFlQRTsKLQlpZiAocG9ydC0+ZmxhZ3MgJiBVUEZfQVVUT19JUlEpCi0JCWZsYWdzIHw9IFVBUlRfQ09ORklHX0lSUTsKLQlpZiAocG9ydC0+ZmxhZ3MgJiBVUEZfQk9PVF9BVVRPQ09ORikgewotCQlwb3J0LT50eXBlID0gUE9SVF9VTktOT1dOOwotCQlwb3J0LT5vcHMtPmNvbmZpZ19wb3J0KHBvcnQsIGZsYWdzKTsKLQl9Ci0KLQlpZiAocG9ydC0+dHlwZSAhPSBQT1JUX1VOS05PV04pIHsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQltcF9yZXBvcnRfcG9ydChkcnYsIHBvcnQpOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JCXBvcnQtPm9wcy0+c2V0X21jdHJsKHBvcnQsIDApOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0KLQkJbXBfY2hhbmdlX3BtKHN0YXRlLCAzKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG1wX3VuY29uZmlndXJlX3BvcnQoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYsIHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0Jc3RydWN0IHNiX3VhcnRfaW5mbyAqaW5mbyA9IHN0YXRlLT5pbmZvOwotCi0JaWYgKGluZm8gJiYgaW5mby0+dHR5KQotCQl0dHlfaGFuZ3VwKGluZm8tPnR0eSk7Ci0KLQlNUF9TVEFURV9MT0NLKHN0YXRlKTsKLQotCXN0YXRlLT5pbmZvID0gTlVMTDsKLQotCWlmIChwb3J0LT50eXBlICE9IFBPUlRfVU5LTk9XTikKLQkJcG9ydC0+b3BzLT5yZWxlYXNlX3BvcnQocG9ydCk7Ci0KLQlwb3J0LT50eXBlID0gUE9SVF9VTktOT1dOOwotCi0JaWYgKGluZm8pIHsKLQkJdGFza2xldF9raWxsKCZpbmZvLT50bGV0KTsKLQkJa2ZyZWUoaW5mbyk7Ci0JfQotCi0JTVBfU1RBVEVfVU5MT0NLKHN0YXRlKTsKLX0KLXN0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgbXBfb3BzID0gewotCS5vcGVuCQk9IG1wX29wZW4sCi0JLmNsb3NlCQk9IG1wX2Nsb3NlLAotCS53cml0ZQkJPSBtcF93cml0ZSwKLQkucHV0X2NoYXIJPSBtcF9wdXRfY2hhciwKLQkuZmx1c2hfY2hhcnMJPSBtcF9wdXRfY2hhcnMsCi0JLndyaXRlX3Jvb20JPSBtcF93cml0ZV9yb29tLAotCS5jaGFyc19pbl9idWZmZXI9IG1wX2NoYXJzX2luX2J1ZmZlciwKLQkuZmx1c2hfYnVmZmVyCT0gbXBfZmx1c2hfYnVmZmVyLAotCS5pb2N0bAkJPSBtcF9pb2N0bCwKLQkudGhyb3R0bGUJPSBtcF90aHJvdHRsZSwKLQkudW50aHJvdHRsZQk9IG1wX3VudGhyb3R0bGUsCi0JLnNlbmRfeGNoYXIJPSBtcF9zZW5kX3hjaGFyLAotCS5zZXRfdGVybWlvcwk9IG1wX3NldF90ZXJtaW9zLAotCS5zdG9wCQk9IG1wX3N0b3AsCi0JLnN0YXJ0CQk9IG1wX3N0YXJ0LAotCS5oYW5ndXAJCT0gbXBfaGFuZ3VwLAotCS5icmVha19jdGwJPSBtcF9icmVha19jdGwsCi0JLndhaXRfdW50aWxfc2VudD0gbXBfd2FpdF91bnRpbF9zZW50LAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JLnByb2NfZm9wcwk9IE5VTEwsCi0jZW5kaWYKLQkudGlvY21nZXQJPSBtcF90aW9jbWdldCwKLQkudGlvY21zZXQJPSBtcF90aW9jbXNldCwKLX07Ci0KLXN0YXRpYyBpbnQgbXBfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2KQotewotCXN0cnVjdCB0dHlfZHJpdmVyICpub3JtYWwgPSBOVUxMOwotCWludCBpLCByZXR2YWw7Ci0KLQlkcnYtPnN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNiX3VhcnRfc3RhdGUpICogZHJ2LT5uciwgR0ZQX0tFUk5FTCk7Ci0JcmV0dmFsID0gLUVOT01FTTsKLQlpZiAoIWRydi0+c3RhdGUpCi0JewotCQlwcmludGsoIlNCIFBDSSBFcnJvcjogS2VybmVsIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIVxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQltZW1zZXQoZHJ2LT5zdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBzYl91YXJ0X3N0YXRlKSAqIGRydi0+bnIpOwotCi0Jbm9ybWFsID0gYWxsb2NfdHR5X2RyaXZlcihkcnYtPm5yKTsKLQlpZiAoIW5vcm1hbCkKLQl7Ci0JCXByaW50aygiU0IgUENJIEVycm9yOiB0dHkgYWxsb2NhdGlvbiBlcnJvciFcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlkcnYtPnR0eV9kcml2ZXIgPSBub3JtYWw7Ci0KLQlub3JtYWwtPm93bmVyICAgICAgICAgICA9IGRydi0+b3duZXI7Ci0Jbm9ybWFsLT5tYWdpYwkJPSBUVFlfRFJJVkVSX01BR0lDOwotCW5vcm1hbC0+ZHJpdmVyX25hbWUgICAgID0gZHJ2LT5kcml2ZXJfbmFtZTsKLQlub3JtYWwtPm5hbWUJCT0gZHJ2LT5kZXZfbmFtZTsKLQlub3JtYWwtPm1ham9yCQk9IGRydi0+bWFqb3I7Ci0Jbm9ybWFsLT5taW5vcl9zdGFydAk9IGRydi0+bWlub3I7Ci0KLQlub3JtYWwtPm51bQkJPSBNQVhfTVBfUE9SVCA7IAotCi0Jbm9ybWFsLT50eXBlCQk9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7Ci0Jbm9ybWFsLT5zdWJ0eXBlCQk9IFNFUklBTF9UWVBFX05PUk1BTDsKLQlub3JtYWwtPmluaXRfdGVybWlvcwk9IHR0eV9zdGRfdGVybWlvczsKLQlub3JtYWwtPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOwotCW5vcm1hbC0+ZmxhZ3MJCT0gVFRZX0RSSVZFUl9SRUFMX1JBVyB8IFRUWV9EUklWRVJfRFlOQU1JQ19ERVY7Ci0Jbm9ybWFsLT5kcml2ZXJfc3RhdGUgICAgPSBkcnY7Ci0KLQl0dHlfc2V0X29wZXJhdGlvbnMobm9ybWFsLCAmbXBfb3BzKTsKLQotZm9yIChpID0gMDsgaSA8IGRydi0+bnI7IGkrKykgewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IGRydi0+c3RhdGUgKyBpOwotCi0Jc3RhdGUtPmNsb3NlX2RlbGF5ICAgICA9IDUwMDsgICAKLQlzdGF0ZS0+Y2xvc2luZ193YWl0ICAgID0gMzAwMDA7IAotCi0JbXV0ZXhfaW5pdCgmc3RhdGUtPm11dGV4KTsKLQl9Ci0KLQlyZXR2YWwgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKG5vcm1hbCk7Ci1vdXQ6Ci0JaWYgKHJldHZhbCA8IDApIHsKLQkJcHJpbnRrKCJSZWdpc3RlciB0dHkgZHJpdmVyIEZhaWwhXG4iKTsKLQkJcHV0X3R0eV9kcml2ZXIobm9ybWFsKTsKLQkJa2ZyZWUoZHJ2LT5zdGF0ZSk7Ci0JfQotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotdm9pZCBtcF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydikKLXsKLSAgICBzdHJ1Y3QgdHR5X2RyaXZlciAqbm9ybWFsID0gTlVMTDsKLQotICAgIG5vcm1hbCA9IGRydi0+dHR5X2RyaXZlcjsKLQotICAgIGlmICghbm9ybWFsKQotICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHR0eV91bnJlZ2lzdGVyX2RyaXZlcihub3JtYWwpOwotICAgIHB1dF90dHlfZHJpdmVyKG5vcm1hbCk7Ci0gICAgZHJ2LT50dHlfZHJpdmVyID0gTlVMTDsKLQotCi0gICAga2ZyZWUoZHJ2LT5zdGF0ZSk7Ci0KLX0KLQotc3RhdGljIGludCBtcF9hZGRfb25lX3BvcnQoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYsIHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlOwotCWludCByZXQgPSAwOwotCi0KLQlpZiAocG9ydC0+bGluZSA+PSBkcnYtPm5yKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN0YXRlID0gZHJ2LT5zdGF0ZSArIHBvcnQtPmxpbmU7Ci0KLQlNUF9NVVRFWF9MT0NLKG1wX211dGV4KTsKLQlpZiAoc3RhdGUtPnBvcnQpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jc3RhdGUtPnBvcnQgPSBwb3J0OwotCi0Jc3Bpbl9sb2NrX2luaXQoJnBvcnQtPmxvY2spOwotCXBvcnQtPmNvbnMgPSBkcnYtPmNvbnM7Ci0JcG9ydC0+aW5mbyA9IHN0YXRlLT5pbmZvOwotCi0JbXBfY29uZmlndXJlX3BvcnQoZHJ2LCBzdGF0ZSwgcG9ydCk7Ci0KLQl0dHlfcmVnaXN0ZXJfZGV2aWNlKGRydi0+dHR5X2RyaXZlciwgcG9ydC0+bGluZSwgcG9ydC0+ZGV2KTsKLQotb3V0OgotCU1QX01VVEVYX1VOTE9DSyhtcF9tdXRleCk7Ci0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXBfcmVtb3ZlX29uZV9wb3J0KHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2LCBzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IGRydi0+c3RhdGUgKyBwb3J0LT5saW5lOwotCi0JaWYgKHN0YXRlLT5wb3J0ICE9IHBvcnQpCi0JCXByaW50ayhLRVJOX0FMRVJUICJSZW1vdmluZyB3cm9uZyBwb3J0OiAlcCAhPSAlcFxuIiwKLQkJCQlzdGF0ZS0+cG9ydCwgcG9ydCk7Ci0KLQlNUF9NVVRFWF9MT0NLKG1wX211dGV4KTsKLQotCXR0eV91bnJlZ2lzdGVyX2RldmljZShkcnYtPnR0eV9kcml2ZXIsIHBvcnQtPmxpbmUpOwotCi0JbXBfdW5jb25maWd1cmVfcG9ydChkcnYsIHN0YXRlKTsKLQlzdGF0ZS0+cG9ydCA9IE5VTEw7Ci0JTVBfTVVURVhfVU5MT0NLKG1wX211dGV4KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhdXRvY29uZmlnKHN0cnVjdCBtcF9wb3J0ICptdHB0LCB1bnNpZ25lZCBpbnQgcHJvYmVmbGFncykKLXsKLQl1bnNpZ25lZCBjaGFyIHN0YXR1czEsIHNjcmF0Y2gsIHNjcmF0Y2gyLCBzY3JhdGNoMzsKLQl1bnNpZ25lZCBjaGFyIHNhdmVfbGNyLCBzYXZlX21jcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JdW5zaWduZWQgY2hhciB1X3R5cGU7Ci0JdW5zaWduZWQgY2hhciBiX3JldCA9IDA7Ci0KLQlpZiAoIW10cHQtPnBvcnQuaW9iYXNlICYmICFtdHB0LT5wb3J0Lm1hcGJhc2UgJiYgIW10cHQtPnBvcnQubWVtYmFzZSkKLQkJcmV0dXJuOwotCi0JREVCVUdfQVVUT0NPTkYoInR0eU1QJWQ6IGF1dG9jb25mICgweCUwNHgsIDB4JXApOiAiLAotCQkJbXRwdC0+cG9ydC5saW5lLCBtdHB0LT5wb3J0LmlvYmFzZSwgbXRwdC0+cG9ydC5tZW1iYXNlKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtdHB0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLQotCWlmICghKG10cHQtPnBvcnQuZmxhZ3MgJiBVUEZfQlVHR1lfVUFSVCkpIHsKLQkJc2NyYXRjaCA9IHNlcmlhbF9pbnAobXRwdCwgVUFSVF9JRVIpOwotCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0lFUiwgMCk7Ci0jaWZkZWYgX19pMzg2X18KLQkJb3V0YigweGZmLCAweDA4MCk7Ci0jZW5kaWYKLQkJc2NyYXRjaDIgPSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfSUVSKSAmIDB4MGY7Ci0JCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfSUVSLCAweDBGKTsKLSNpZmRlZiBfX2kzODZfXwotCQlvdXRiKDAsIDB4MDgwKTsKLSNlbmRpZgotCQlzY3JhdGNoMyA9IHNlcmlhbF9pbnAobXRwdCwgVUFSVF9JRVIpICYgMHgwRjsKLQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9JRVIsIHNjcmF0Y2gpOwotCQlpZiAoc2NyYXRjaDIgIT0gMCB8fCBzY3JhdGNoMyAhPSAweDBGKSB7Ci0JCQlERUJVR19BVVRPQ09ORigiSUVSIHRlc3QgZmFpbGVkICglMDJ4LCAlMDJ4KSAiLAotCQkJCQlzY3JhdGNoMiwgc2NyYXRjaDMpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQlzYXZlX21jciA9IHNlcmlhbF9pbihtdHB0LCBVQVJUX01DUik7Ci0Jc2F2ZV9sY3IgPSBzZXJpYWxfaW4obXRwdCwgVUFSVF9MQ1IpOwotCi0JaWYgKCEobXRwdC0+cG9ydC5mbGFncyAmIFVQRl9TS0lQX1RFU1QpKSB7Ci0JCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTUNSLCBVQVJUX01DUl9MT09QIHwgMHgwQSk7Ci0JCXN0YXR1czEgPSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfTVNSKSAmIDB4RjA7Ci0JCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTUNSLCBzYXZlX21jcik7Ci0JCWlmIChzdGF0dXMxICE9IDB4OTApIHsKLQkJCURFQlVHX0FVVE9DT05GKCJMT09QIHRlc3QgZmFpbGVkICglMDJ4KSAiLAotCQkJCQlzdGF0dXMxKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9MQ1IsIDB4QkYpOwotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfRUZSLCAwKTsKLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0xDUiwgMCk7Ci0KLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0ZDUiwgVUFSVF9GQ1JfRU5BQkxFX0ZJRk8pOwotCXNjcmF0Y2ggPSBzZXJpYWxfaW4obXRwdCwgVUFSVF9JSVIpID4+IDY7Ci0KLQlERUJVR19BVVRPQ09ORigiaWlyPSVkICIsIHNjcmF0Y2gpOwotCWlmKG10cHQtPmRldmljZS0+bnJfcG9ydHMgPj0gOCkKLQkJYl9yZXQgPSByZWFkX29wdGlvbl9yZWdpc3RlcihtdHB0LChNUF9PUFRSX0RJUjAgKyAoKG10cHQtPnBvcnQubGluZSkvOCkpKTsKLQllbHNlCQotCQliX3JldCA9IHJlYWRfb3B0aW9uX3JlZ2lzdGVyKG10cHQsTVBfT1BUUl9ESVIwKTsKLQl1X3R5cGUgPSAoYl9yZXQgJiAweGYwKSA+PiA0OwotCWlmKG10cHQtPnBvcnQudHlwZSA9PSBQT1JUX1VOS05PV04gKQotCXsKLQkJc3dpdGNoICh1X3R5cGUpCi0JCXsKLQkJCWNhc2UgRElSX1VBUlRfMTZDNTUwOgotCQkJCW10cHQtPnBvcnQudHlwZSA9IFBPUlRfMTZDNTVYOwotCQkJCWJyZWFrOwotCQkJY2FzZSBESVJfVUFSVF8xNkMxMDUwOgotCQkJCW10cHQtPnBvcnQudHlwZSA9IFBPUlRfMTZDMTA1WDsKLQkJCQlicmVhazsKLQkJCWNhc2UgRElSX1VBUlRfMTZDMTA1MEE6Ci0JCQkJaWYgKG10cHQtPnBvcnQubGluZSA8IDIpCi0JCQkJewotCQkJCQltdHB0LT5wb3J0LnR5cGUgPSBQT1JUXzE2QzEwNVhBOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlpZiAobXRwdC0+ZGV2aWNlLT5kZXZpY2VfaWQgJiAweDUwKQotCQkJCQl7Ci0JCQkJCQltdHB0LT5wb3J0LnR5cGUgPSBQT1JUXzE2QzU1WDsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCW10cHQtPnBvcnQudHlwZSA9IFBPUlRfMTZDMTA1WDsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6CQotCQkJCW10cHQtPnBvcnQudHlwZSA9IFBPUlRfVU5LTk9XTjsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCWlmKG10cHQtPnBvcnQudHlwZSA9PSBQT1JUX1VOS05PV04gKQotCXsKLXByaW50aygidW5rbm93MlxuIik7Ci0JCXN3aXRjaCAoc2NyYXRjaCkgewotCQkJY2FzZSAwOgotCQkJY2FzZSAxOgotCQkJCW10cHQtPnBvcnQudHlwZSA9IFBPUlRfVU5LTk9XTjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCWNhc2UgMzoKLQkJCQltdHB0LT5wb3J0LnR5cGUgPSBQT1JUXzE2QzU1WDsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTENSLCBzYXZlX2xjcik7Ci0KLQltdHB0LT5wb3J0LmZpZm9zaXplID0gdWFydF9jb25maWdbbXRwdC0+cG9ydC50eXBlXS5kZmxfeG1pdF9maWZvX3NpemU7Ci0JbXRwdC0+Y2FwYWJpbGl0aWVzID0gdWFydF9jb25maWdbbXRwdC0+cG9ydC50eXBlXS5mbGFnczsKLQotCWlmIChtdHB0LT5wb3J0LnR5cGUgPT0gUE9SVF9VTktOT1dOKQotCQlnb3RvIG91dDsKLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX01DUiwgc2F2ZV9tY3IpOwotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfRkNSLCAoVUFSVF9GQ1JfRU5BQkxFX0ZJRk8gfAotCQkJCVVBUlRfRkNSX0NMRUFSX1JDVlIgfAotCQkJCVVBUlRfRkNSX0NMRUFSX1hNSVQpKTsKLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0ZDUiwgMCk7Ci0JKHZvaWQpc2VyaWFsX2luKG10cHQsIFVBUlRfUlgpOwotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfSUVSLCAwKTsKLQotb3V0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm10cHQtPnBvcnQubG9jaywgZmxhZ3MpOwotCURFQlVHX0FVVE9DT05GKCJ0eXBlPSVzXG4iLCB1YXJ0X2NvbmZpZ1ttdHB0LT5wb3J0LnR5cGVdLm5hbWUpOwotfQotCi1zdGF0aWMgdm9pZCBhdXRvY29uZmlnX2lycShzdHJ1Y3QgbXBfcG9ydCAqbXRwdCkKLXsKLQl1bnNpZ25lZCBjaGFyIHNhdmVfbWNyLCBzYXZlX2llcjsKLQl1bnNpZ25lZCBsb25nIGlycXM7Ci0JaW50IGlycTsKLQotCS8qIGZvcmdldCBwb3NzaWJsZSBpbml0aWFsbHkgbWFza2VkIGFuZCBwZW5kaW5nIElSUSAqLwotCXByb2JlX2lycV9vZmYocHJvYmVfaXJxX29uKCkpOwotCXNhdmVfbWNyID0gc2VyaWFsX2lucChtdHB0LCBVQVJUX01DUik7Ci0Jc2F2ZV9pZXIgPSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfSUVSKTsKLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX01DUiwgVUFSVF9NQ1JfT1VUMSB8IFVBUlRfTUNSX09VVDIpOwotCi0JaXJxcyA9IHByb2JlX2lycV9vbigpOwotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTUNSLCAwKTsKLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX01DUiwKLQkJVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTIHwgVUFSVF9NQ1JfT1VUMik7Ci0KLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0lFUiwgMHgwZik7ICAgIC8qIGVuYWJsZSBhbGwgaW50cnMgKi8KLQkodm9pZClzZXJpYWxfaW5wKG10cHQsIFVBUlRfTFNSKTsKLQkodm9pZClzZXJpYWxfaW5wKG10cHQsIFVBUlRfUlgpOwotCSh2b2lkKXNlcmlhbF9pbnAobXRwdCwgVUFSVF9JSVIpOwotCSh2b2lkKXNlcmlhbF9pbnAobXRwdCwgVUFSVF9NU1IpOwotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfVFgsIDB4RkYpOwotCWlycSA9IHByb2JlX2lycV9vZmYoaXJxcyk7Ci0KLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX01DUiwgc2F2ZV9tY3IpOwotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfSUVSLCBzYXZlX2llcik7Ci0KLQltdHB0LT5wb3J0LmlycSA9IChpcnEgPiAwKSA/IGlycSA6IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG11bHRpX3N0b3BfdHgoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLQlzdHJ1Y3QgbXBfcG9ydCAqbXRwdCA9IChzdHJ1Y3QgbXBfcG9ydCAqKXBvcnQ7Ci0KLQlpZiAobXRwdC0+aWVyICYgVUFSVF9JRVJfVEhSSSkgewotCQltdHB0LT5pZXIgJj0gflVBUlRfSUVSX1RIUkk7Ci0JCXNlcmlhbF9vdXQobXRwdCwgVUFSVF9JRVIsIG10cHQtPmllcik7Ci0JfQotCi0JdGFza2xldF9zY2hlZHVsZSgmcG9ydC0+aW5mby0+dGxldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG11bHRpX3N0YXJ0X3R4KHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IG1wX3BvcnQgKm10cHQgPSAoc3RydWN0IG1wX3BvcnQgKilwb3J0OwotCi0JaWYgKCEobXRwdC0+aWVyICYgVUFSVF9JRVJfVEhSSSkpIHsKLQkJbXRwdC0+aWVyIHw9IFVBUlRfSUVSX1RIUkk7Ci0JCXNlcmlhbF9vdXQobXRwdCwgVUFSVF9JRVIsIG10cHQtPmllcik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBtdWx0aV9zdG9wX3J4KHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IG1wX3BvcnQgKm10cHQgPSAoc3RydWN0IG1wX3BvcnQgKilwb3J0OwotCi0JbXRwdC0+aWVyICY9IH5VQVJUX0lFUl9STFNJOwotCW10cHQtPnBvcnQucmVhZF9zdGF0dXNfbWFzayAmPSB+VUFSVF9MU1JfRFI7Ci0Jc2VyaWFsX291dChtdHB0LCBVQVJUX0lFUiwgbXRwdC0+aWVyKTsKLX0KLQotc3RhdGljIHZvaWQgbXVsdGlfZW5hYmxlX21zKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IG1wX3BvcnQgKm10cHQgPSAoc3RydWN0IG1wX3BvcnQgKilwb3J0OwotCi0JbXRwdC0+aWVyIHw9IFVBUlRfSUVSX01TSTsKLQlzZXJpYWxfb3V0KG10cHQsIFVBUlRfSUVSLCBtdHB0LT5pZXIpOwotfQotCi0KLXN0YXRpYyBfSU5MSU5FXyB2b2lkIHJlY2VpdmVfY2hhcnMoc3RydWN0IG1wX3BvcnQgKm10cHQsIGludCAqc3RhdHVzICkKLXsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gbXRwdC0+cG9ydC5pbmZvLT50dHk7Ci0JdW5zaWduZWQgY2hhciBsc3IgPSAqc3RhdHVzOwotCWludCBtYXhfY291bnQgPSAyNTY7Ci0JdW5zaWduZWQgY2hhciBjaDsKLQljaGFyIGZsYWc7Ci0KLQkvL2xzciAmPSBtdHB0LT5wb3J0LnJlYWRfc3RhdHVzX21hc2s7Ci0KLQlkbyB7Ci0JCWlmICgobHNyICYgVUFSVF9MU1JfUEUpICYmIChtdHB0LT5wb3J0Lm1kbW9kZSAmIE1ETU9ERV9FTkFCTEUpKQotCQl7Ci0JCQljaCA9IHNlcmlhbF9pbnAobXRwdCwgVUFSVF9SWCk7Ci0JCX0KLQkJZWxzZSBpZiAobHNyICYgVUFSVF9MU1JfU1BFQ0lBTCkgCi0JCXsKLQkJCWZsYWcgPSAwOwotCQkJY2ggPSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfUlgpOwotCi0JCQlpZiAobHNyICYgVUFSVF9MU1JfQkkpIAotCQkJewotCi0JCQkJbXRwdC0+cG9ydC5pY291bnQuYnJrKys7Ci0JCQkJZmxhZyA9IFRUWV9CUkVBSzsKLQotCQkJCWlmIChzYl91YXJ0X2hhbmRsZV9icmVhaygmbXRwdC0+cG9ydCkpCi0JCQkJCWdvdG8gaWdub3JlX2NoYXI7Ci0JCQl9IAotCQkJaWYgKGxzciAmIFVBUlRfTFNSX1BFKQotCQkJewotCQkJCW10cHQtPnBvcnQuaWNvdW50LnBhcml0eSsrOwotCQkJCWZsYWcgPSBUVFlfUEFSSVRZOwotCQkJfQotCQkJaWYgKGxzciAmIFVBUlRfTFNSX0ZFKQotCQkJewotCQkJCW10cHQtPnBvcnQuaWNvdW50LmZyYW1lKys7Ci0JCQkJZmxhZyA9IFRUWV9GUkFNRTsKLQkJCX0KLQkJCWlmIChsc3IgJiBVQVJUX0xTUl9PRSkKLQkJCXsKLQkJCQltdHB0LT5wb3J0Lmljb3VudC5vdmVycnVuKys7Ci0JCQkJZmxhZyA9IFRUWV9PVkVSUlVOOwotCQkJfQotCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZmxhZyk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQljaCA9IHNlcmlhbF9pbnAobXRwdCwgVUFSVF9SWCk7Ci0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCAwKTsKLQkJfQotaWdub3JlX2NoYXI6Ci0JCWxzciA9IHNlcmlhbF9pbnAobXRwdCwgVUFSVF9MU1IpOwotCX0gd2hpbGUgKChsc3IgJiBVQVJUX0xTUl9EUikgJiYgKG1heF9jb3VudC0tID4gMCkpOwotCi0JdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKLX0KLQotCi0KLQotc3RhdGljIF9JTkxJTkVfIHZvaWQgdHJhbnNtaXRfY2hhcnMoc3RydWN0IG1wX3BvcnQgKm10cHQpCi17Ci0Jc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJm10cHQtPnBvcnQuaW5mby0+eG1pdDsKLQlpbnQgY291bnQ7Ci0KLQlpZiAobXRwdC0+cG9ydC54X2NoYXIpIHsKLQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9UWCwgbXRwdC0+cG9ydC54X2NoYXIpOwotCQltdHB0LT5wb3J0Lmljb3VudC50eCsrOwotCQltdHB0LT5wb3J0LnhfY2hhciA9IDA7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSB8fCB1YXJ0X3R4X3N0b3BwZWQoJm10cHQtPnBvcnQpKSB7Ci0JCW11bHRpX3N0b3BfdHgoJm10cHQtPnBvcnQpOwotCQlyZXR1cm47Ci0JfQotCi0JY291bnQgPSB1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh4bWl0KTsKLQotCWlmKGNvdW50ID4gbXRwdC0+cG9ydC5maWZvc2l6ZSkKLQl7Ci0JCWNvdW50ID0gbXRwdC0+cG9ydC5maWZvc2l6ZTsKLQl9Ci0KLQlwcmludGsoIlslZF0gbWRtb2RlOiAleFxuIiwgbXRwdC0+cG9ydC5saW5lLCBtdHB0LT5wb3J0Lm1kbW9kZSk7Ci0JZG8gewotI2lmIDAKLQkJLyogY2hlY2sgbXVsdGktZHJvcCBtb2RlICovCi0JCWlmICgobXRwdC0+cG9ydC5tZG1vZGUgJiAoTURNT0RFX0VOQUJMRSB8IE1ETU9ERV9BRERSKSkgPT0gKE1ETU9ERV9FTkFCTEUgfCBNRE1PREVfQUREUikpCi0JCXsKLQkJCXByaW50aygic2VuZCBhZGRyZXNzXG4iKTsKLQkJCS8qIHNlbmQgbXVsdGktZHJvcCBhZGRyZXNzICovCi0JCQlzZXJpYWxfb3V0KG10cHQsIFVBUlRfU0NSLCB4bWl0LT5idWZbeG1pdC0+dGFpbF0pOwotCQl9Ci0JCWVsc2UKLSNlbmRpZgotCQl7Ci0JCQlzZXJpYWxfb3V0KG10cHQsIFVBUlRfVFgsIHhtaXQtPmJ1Zlt4bWl0LT50YWlsXSk7Ci0JCX0KLQkJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgMSkgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKLQkJbXRwdC0+cG9ydC5pY291bnQudHgrKzsKLQl9IHdoaWxlICgtLWNvdW50ID4gMCk7Ci19Ci0KLQotCi1zdGF0aWMgX0lOTElORV8gdm9pZCBjaGVja19tb2RlbV9zdGF0dXMoc3RydWN0IG1wX3BvcnQgKm10cHQpCi17Ci0JaW50IHN0YXR1czsKLQotCXN0YXR1cyA9IHNlcmlhbF9pbihtdHB0LCBVQVJUX01TUik7Ci0KLQlpZiAoKHN0YXR1cyAmIFVBUlRfTVNSX0FOWV9ERUxUQSkgPT0gMCkKLQkJcmV0dXJuOwotCi0JaWYgKHN0YXR1cyAmIFVBUlRfTVNSX1RFUkkpCi0JCW10cHQtPnBvcnQuaWNvdW50LnJuZysrOwotCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERFNSKQotCQltdHB0LT5wb3J0Lmljb3VudC5kc3IrKzsKLQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERDRCkKLQkJc2JfdWFydF9oYW5kbGVfZGNkX2NoYW5nZSgmbXRwdC0+cG9ydCwgc3RhdHVzICYgVUFSVF9NU1JfRENEKTsKLQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRENUUykKLQkJc2JfdWFydF9oYW5kbGVfY3RzX2NoYW5nZSgmbXRwdC0+cG9ydCwgc3RhdHVzICYgVUFSVF9NU1JfQ1RTKTsKLQotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbXRwdC0+cG9ydC5pbmZvLT5kZWx0YV9tc3Jfd2FpdCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtdWx0aV9oYW5kbGVfcG9ydChzdHJ1Y3QgbXBfcG9ydCAqbXRwdCkKLXsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzID0gc2VyaWFsX2lucChtdHB0LCBVQVJUX0xTUik7Ci0KLQkvL3ByaW50aygibHNyOiAleFxuIiwgc3RhdHVzKTsKLQotCWlmICgoc3RhdHVzICYgVUFSVF9MU1JfRFIpIHx8IChzdGF0dXMgJiBVQVJUX0xTUl9TUEVDSUFMKSkKLQkJcmVjZWl2ZV9jaGFycyhtdHB0LCAmc3RhdHVzKTsKLQljaGVja19tb2RlbV9zdGF0dXMobXRwdCk7Ci0JaWYgKHN0YXR1cyAmIFVBUlRfTFNSX1RIUkUpCi0JewotCQlpZiAoKG10cHQtPnBvcnQudHlwZSA9PSBQT1JUXzE2QzEwNVgpCi0JCQl8fCAobXRwdC0+cG9ydC50eXBlID09IFBPUlRfMTZDMTA1WEEpKQotCQkJdHJhbnNtaXRfY2hhcnMobXRwdCk7Ci0JCWVsc2UKLQkJewotCQkJaWYgKG10cHQtPmludGVyZmFjZSA+PSBSUzQ4NU5FKQotCQkJCXVhcnRfc2V0X21jdHJsKCZtdHB0LT5wb3J0LCBUSU9DTV9SVFMpOwotCQkJCi0JCQl0cmFuc21pdF9jaGFycyhtdHB0KTsKLQotCi0JCQlpZiAobXRwdC0+aW50ZXJmYWNlID49IFJTNDg1TkUpCi0JCQl7Ci0JCQkJd2hpbGUoKHN0YXR1cz1zZXJpYWxfaW4obXRwdCxVQVJUX0xTUikgJjB4NjApIT0weDYwKTsKLQkJCQl1YXJ0X2NsZWFyX21jdHJsKCZtdHB0LT5wb3J0LCBUSU9DTV9SVFMpOwotCQkJfQotCQl9Ci0JfQotfQotCi0KLQotc3RhdGljIGlycXJldHVybl90IG11bHRpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IGlycV9pbmZvICppaW5mbyA9IGRldl9pZDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaGVhZCwgKmVuZCA9IE5VTEw7Ci0JaW50IHBhc3NfY291bnRlciA9IDA7Ci0KLQotCXNwaW5fbG9jaygmaWluZm8tPmxvY2spOwotCi0JbGhlYWQgPSBpaW5mby0+aGVhZDsKLQlkbyB7Ci0JCXN0cnVjdCBtcF9wb3J0ICptdHB0OwotCQl1bnNpZ25lZCBpbnQgaWlyOwotCi0JCW10cHQgPSBsaXN0X2VudHJ5KGxoZWFkLCBzdHJ1Y3QgbXBfcG9ydCwgbGlzdCk7Ci0JCQotCQlpaXIgPSBzZXJpYWxfaW4obXRwdCwgVUFSVF9JSVIpOwotCQlwcmludGsoImludGVycnVwdCEgcG9ydCAlZCwgaWlyIDB4JXhcbiIsIG10cHQtPnBvcnQubGluZSwgaWlyKTsgLy93bGVlCi0JCWlmICghKGlpciAmIFVBUlRfSUlSX05PX0lOVCkpIAotCQl7Ci0JCQlwcmludGsoImludGVycnVwdCBoYW5kbGVcbiIpOwotCQkJc3Bpbl9sb2NrKCZtdHB0LT5wb3J0LmxvY2spOwotCQkJbXVsdGlfaGFuZGxlX3BvcnQobXRwdCk7Ci0JCQlzcGluX3VubG9jaygmbXRwdC0+cG9ydC5sb2NrKTsKLQotCQkJZW5kID0gTlVMTDsKLQkJfSBlbHNlIGlmIChlbmQgPT0gTlVMTCkKLQkJCWVuZCA9IGxoZWFkOwotCi0JCWxoZWFkID0gbGhlYWQtPm5leHQ7Ci0JCWlmIChsaGVhZCA9PSBpaW5mby0+aGVhZCAmJiBwYXNzX2NvdW50ZXIrKyA+IFBBU1NfTElNSVQpIAotCQl7Ci0JCQlwcmludGsoS0VSTl9FUlIgIm11bHRpOiB0b28gbXVjaCB3b3JrIGZvciAiCi0JCQkJCSJpcnElZFxuIiwgaXJxKTsKLQkJCXByaW50ayggIm11bHRpOiB0b28gbXVjaCB3b3JrIGZvciAiCi0JCQkJCSJpcnElZFxuIiwgaXJxKTsKLQkJCWJyZWFrOwotCQl9Ci0JfSB3aGlsZSAobGhlYWQgIT0gZW5kKTsKLQotCXNwaW5fdW5sb2NrKCZpaW5mby0+bG9jayk7Ci0KLQotICAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHNlcmlhbF9kb191bmxpbmsoc3RydWN0IGlycV9pbmZvICppLCBzdHJ1Y3QgbXBfcG9ydCAqbXRwdCkKLXsKLQlzcGluX2xvY2tfaXJxKCZpLT5sb2NrKTsKLQotCWlmICghbGlzdF9lbXB0eShpLT5oZWFkKSkgewotCQlpZiAoaS0+aGVhZCA9PSAmbXRwdC0+bGlzdCkKLQkJCWktPmhlYWQgPSBpLT5oZWFkLT5uZXh0OwotCQlsaXN0X2RlbCgmbXRwdC0+bGlzdCk7Ci0JfSBlbHNlIHsKLQkJaS0+aGVhZCA9IE5VTEw7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxKCZpLT5sb2NrKTsKLX0KLQotc3RhdGljIGludCBzZXJpYWxfbGlua19pcnFfY2hhaW4oc3RydWN0IG1wX3BvcnQgKm10cHQpCi17Ci0Jc3RydWN0IGlycV9pbmZvICppID0gaXJxX2xpc3RzICsgbXRwdC0+cG9ydC5pcnE7Ci0JaW50IHJldCwgaXJxX2ZsYWdzID0gbXRwdC0+cG9ydC5mbGFncyAmIFVQRl9TSEFSRV9JUlEgPyBJUlFGX1NIQVJFRCA6IDA7Ci0Jc3Bpbl9sb2NrX2lycSgmaS0+bG9jayk7Ci0KLQlpZiAoaS0+aGVhZCkgewotCQlsaXN0X2FkZCgmbXRwdC0+bGlzdCwgaS0+aGVhZCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmaS0+bG9jayk7Ci0KLQkJcmV0ID0gMDsKLQl9IGVsc2UgewotCQlJTklUX0xJU1RfSEVBRCgmbXRwdC0+bGlzdCk7Ci0JCWktPmhlYWQgPSAmbXRwdC0+bGlzdDsKLQkJc3Bpbl91bmxvY2tfaXJxKCZpLT5sb2NrKTsKLQotCQlyZXQgPSByZXF1ZXN0X2lycShtdHB0LT5wb3J0LmlycSwgbXVsdGlfaW50ZXJydXB0LAotCQkJCWlycV9mbGFncywgInNlcmlhbCIsIGkpOwotCQlpZiAocmV0IDwgMCkKLQkJCXNlcmlhbF9kb191bmxpbmsoaSwgbXRwdCk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotCi0KLQotc3RhdGljIHZvaWQgc2VyaWFsX3VubGlua19pcnFfY2hhaW4oc3RydWN0IG1wX3BvcnQgKm10cHQpCi17Ci0Jc3RydWN0IGlycV9pbmZvICppID0gaXJxX2xpc3RzICsgbXRwdC0+cG9ydC5pcnE7Ci0KLQlpZiAobGlzdF9lbXB0eShpLT5oZWFkKSkKLQl7Ci0JCWZyZWVfaXJxKG10cHQtPnBvcnQuaXJxLCBpKTsKLQl9Ci0Jc2VyaWFsX2RvX3VubGluayhpLCBtdHB0KTsKLX0KLQotc3RhdGljIHZvaWQgbXVsdGlfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IG1wX3BvcnQgKm10cHQgPSAoc3RydWN0IG1wX3BvcnQgKilkYXRhOwotCi0KLQlzcGluX2xvY2soJm10cHQtPnBvcnQubG9jayk7Ci0JbXVsdGlfaGFuZGxlX3BvcnQobXRwdCk7Ci0Jc3Bpbl91bmxvY2soJm10cHQtPnBvcnQubG9jayk7Ci0KLQltb2RfdGltZXIoJm10cHQtPnRpbWVyLCBqaWZmaWVzKzEgKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBtdWx0aV90eF9lbXB0eShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBtcF9wb3J0ICptdHB0ID0gKHN0cnVjdCBtcF9wb3J0ICopcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCByZXQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXRwdC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0JcmV0ID0gc2VyaWFsX2luKG10cHQsIFVBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQgPyBUSU9DU0VSX1RFTVQgOiAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm10cHQtPnBvcnQubG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgaW50IG11bHRpX2dldF9tY3RybChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBtcF9wb3J0ICptdHB0ID0gKHN0cnVjdCBtcF9wb3J0ICopcG9ydDsKLQl1bnNpZ25lZCBjaGFyIHN0YXR1czsKLQl1bnNpZ25lZCBpbnQgcmV0OwotCi0Jc3RhdHVzID0gc2VyaWFsX2luKG10cHQsIFVBUlRfTVNSKTsKLQotCXJldCA9IDA7Ci0JaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkKLQkJcmV0IHw9IFRJT0NNX0NBUjsKLQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfUkkpCi0JCXJldCB8PSBUSU9DTV9STkc7Ci0JaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RTUikKLQkJcmV0IHw9IFRJT0NNX0RTUjsKLQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKQotCQlyZXQgfD0gVElPQ01fQ1RTOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG11bHRpX3NldF9tY3RybChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgbWN0cmwpCi17Ci0Jc3RydWN0IG1wX3BvcnQgKm10cHQgPSAoc3RydWN0IG1wX3BvcnQgKilwb3J0OwotCXVuc2lnbmVkIGNoYXIgbWNyID0gMDsKLQotCW1jdHJsICY9IDB4ZmY7Ci0KLQlpZiAobWN0cmwgJiBUSU9DTV9SVFMpCi0JCW1jciB8PSBVQVJUX01DUl9SVFM7Ci0JaWYgKG1jdHJsICYgVElPQ01fRFRSKQotCQltY3IgfD0gVUFSVF9NQ1JfRFRSOwotCWlmIChtY3RybCAmIFRJT0NNX09VVDEpCi0JCW1jciB8PSBVQVJUX01DUl9PVVQxOwotCWlmIChtY3RybCAmIFRJT0NNX09VVDIpCi0JCW1jciB8PSBVQVJUX01DUl9PVVQyOwotCWlmIChtY3RybCAmIFRJT0NNX0xPT1ApCi0JCW1jciB8PSBVQVJUX01DUl9MT09QOwotCi0KLQlzZXJpYWxfb3V0KG10cHQsIFVBUlRfTUNSLCBtY3IpOwotfQotCi0KLXN0YXRpYyB2b2lkIG11bHRpX2JyZWFrX2N0bChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBpbnQgYnJlYWtfc3RhdGUpCi17Ci0Jc3RydWN0IG1wX3BvcnQgKm10cHQgPSAoc3RydWN0IG1wX3BvcnQgKilwb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXRwdC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0JaWYgKGJyZWFrX3N0YXRlID09IC0xKQotCQltdHB0LT5sY3IgfD0gVUFSVF9MQ1JfU0JDOwotCWVsc2UKLQkJbXRwdC0+bGNyICY9IH5VQVJUX0xDUl9TQkM7Ci0Jc2VyaWFsX291dChtdHB0LCBVQVJUX0xDUiwgbXRwdC0+bGNyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdHB0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLX0KLQotCi0KLXN0YXRpYyBpbnQgbXVsdGlfc3RhcnR1cChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBtcF9wb3J0ICptdHB0ID0gKHN0cnVjdCBtcF9wb3J0ICopcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXR2YWw7Ci0KLQltdHB0LT5jYXBhYmlsaXRpZXMgPSB1YXJ0X2NvbmZpZ1ttdHB0LT5wb3J0LnR5cGVdLmZsYWdzOwotCW10cHQtPm1jciA9IDA7Ci0KLQlpZiAobXRwdC0+Y2FwYWJpbGl0aWVzICYgVUFSVF9DTEVBUl9GSUZPKSB7Ci0JCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfRkNSLCBVQVJUX0ZDUl9FTkFCTEVfRklGTyk7Ci0JCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfRkNSLCBVQVJUX0ZDUl9FTkFCTEVfRklGTyB8Ci0JCQkJVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQpOwotCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0ZDUiwgMCk7Ci0JfQotCi0JKHZvaWQpIHNlcmlhbF9pbnAobXRwdCwgVUFSVF9MU1IpOwotCSh2b2lkKSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfUlgpOwotCSh2b2lkKSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfSUlSKTsKLQkodm9pZCkgc2VyaWFsX2lucChtdHB0LCBVQVJUX01TUik7Ci0JLy90ZXN0LXdsZWUgOS1iaXQgZGlzYWJsZQotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTVNSLCAwKTsKLQotCi0JaWYgKCEobXRwdC0+cG9ydC5mbGFncyAmIFVQRl9CVUdHWV9VQVJUKSAmJgotCQkJKHNlcmlhbF9pbnAobXRwdCwgVUFSVF9MU1IpID09IDB4ZmYpKSB7Ci0JCXByaW50aygidHR5UyVkOiBMU1Igc2FmZXR5IGNoZWNrIGVuZ2FnZWQhXG4iLCBtdHB0LT5wb3J0LmxpbmUpOwotCQkvL3JldHVybiAtRU5PREVWOwotCX0KLQotCWlmICgoIWlzX3JlYWxfaW50ZXJydXB0KG10cHQtPnBvcnQuaXJxKSkgfHwgKG10cHQtPnBvbGxfdHlwZT09VFlQRV9QT0xMKSkgewotCQl1bnNpZ25lZCBpbnQgdGltZW91dCA9IG10cHQtPnBvcnQudGltZW91dDsKLQotCQl0aW1lb3V0ID0gdGltZW91dCA+IDYgPyAodGltZW91dCAvIDIgLSAyKSA6IDE7Ci0KLQkJbXRwdC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKW10cHQ7Ci0JCW1vZF90aW1lcigmbXRwdC0+dGltZXIsIGppZmZpZXMgKyB0aW1lb3V0KTsKLQl9IAotCWVsc2UgCi0JewotCQlyZXR2YWwgPSBzZXJpYWxfbGlua19pcnFfY2hhaW4obXRwdCk7Ci0JCWlmIChyZXR2YWwpCi0JCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTENSLCBVQVJUX0xDUl9XTEVOOCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXRwdC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0JaWYgKChpc19yZWFsX2ludGVycnVwdChtdHB0LT5wb3J0LmlycSkpfHwobXRwdC0+cG9sbF90eXBlPT1UWVBFX0lOVEVSUlVQVCkpCi0JCW10cHQtPnBvcnQubWN0cmwgfD0gVElPQ01fT1VUMjsKLQotCW11bHRpX3NldF9tY3RybCgmbXRwdC0+cG9ydCwgbXRwdC0+cG9ydC5tY3RybCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXRwdC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0KLQkKLQltdHB0LT5pZXIgPSBVQVJUX0lFUl9STFNJIHwgVUFSVF9JRVJfUkRJOwotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfSUVSLCBtdHB0LT5pZXIpOwotCi0JKHZvaWQpIHNlcmlhbF9pbnAobXRwdCwgVUFSVF9MU1IpOwotCSh2b2lkKSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfUlgpOwotCSh2b2lkKSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfSUlSKTsKLQkodm9pZCkgc2VyaWFsX2lucChtdHB0LCBVQVJUX01TUik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0KLXN0YXRpYyB2b2lkIG11bHRpX3NodXRkb3duKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IG1wX3BvcnQgKm10cHQgPSAoc3RydWN0IG1wX3BvcnQgKilwb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQotCW10cHQtPmllciA9IDA7Ci0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9JRVIsIDApOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm10cHQtPnBvcnQubG9jaywgZmxhZ3MpOwotCW10cHQtPnBvcnQubWN0cmwgJj0gflRJT0NNX09VVDI7Ci0KLQltdWx0aV9zZXRfbWN0cmwoJm10cHQtPnBvcnQsIG10cHQtPnBvcnQubWN0cmwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm10cHQtPnBvcnQubG9jaywgZmxhZ3MpOwotCi0Jc2VyaWFsX291dChtdHB0LCBVQVJUX0xDUiwgc2VyaWFsX2lucChtdHB0LCBVQVJUX0xDUikgJiB+VUFSVF9MQ1JfU0JDKTsKLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0ZDUiwgVUFSVF9GQ1JfRU5BQkxFX0ZJRk8gfAotCQkJVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8Ci0JCQlVQVJUX0ZDUl9DTEVBUl9YTUlUKTsKLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0ZDUiwgMCk7Ci0KLQotCSh2b2lkKSBzZXJpYWxfaW4obXRwdCwgVUFSVF9SWCk7Ci0KLQlpZiAoKCFpc19yZWFsX2ludGVycnVwdChtdHB0LT5wb3J0LmlycSkpfHwobXRwdC0+cG9sbF90eXBlPT1UWVBFX1BPTEwpKQotCXsKLQkJZGVsX3RpbWVyX3N5bmMoJm10cHQtPnRpbWVyKTsKLQl9Ci0JZWxzZQotCXsKLQkJc2VyaWFsX3VubGlua19pcnFfY2hhaW4obXRwdCk7Ci0JfQotfQotCi0KLQotc3RhdGljIHVuc2lnbmVkIGludCBtdWx0aV9nZXRfZGl2aXNvcihzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgYmF1ZCkKLXsKLQl1bnNpZ25lZCBpbnQgcXVvdDsKLQotCWlmICgocG9ydC0+ZmxhZ3MgJiBVUEZfTUFHSUNfTVVMVElQTElFUikgJiYKLQkJCWJhdWQgPT0gKHBvcnQtPnVhcnRjbGsvNCkpCi0JCXF1b3QgPSAweDgwMDE7Ci0JZWxzZSBpZiAoKHBvcnQtPmZsYWdzICYgVVBGX01BR0lDX01VTFRJUExJRVIpICYmCi0JCQliYXVkID09IChwb3J0LT51YXJ0Y2xrLzgpKQotCQlxdW90ID0gMHg4MDAyOwotCWVsc2UKLQkJcXVvdCA9IHNiX3VhcnRfZ2V0X2Rpdmlzb3IocG9ydCwgYmF1ZCk7Ci0KLQlyZXR1cm4gcXVvdDsKLX0KLQotCi0KLQotc3RhdGljIHZvaWQgbXVsdGlfc2V0X3Rlcm1pb3Moc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgc3RydWN0IE1QX1RFUk1JT1MgKnRlcm1pb3MsIHN0cnVjdCBNUF9URVJNSU9TICpvbGQpCi17Ci0Jc3RydWN0IG1wX3BvcnQgKm10cHQgPSAoc3RydWN0IG1wX3BvcnQgKilwb3J0OwotCXVuc2lnbmVkIGNoYXIgY3ZhbCwgZmNyID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBiYXVkLCBxdW90OwotCi0Jc3dpdGNoICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NJWkUpIHsKLQkJY2FzZSBDUzU6Ci0JCQljdmFsID0gMHgwMDsKLQkJCWJyZWFrOwotCQljYXNlIENTNjoKLQkJCWN2YWwgPSAweDAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ1M3OgotCQkJY3ZhbCA9IDB4MDI7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJY2FzZSBDUzg6Ci0JCQljdmFsID0gMHgwMzsKLQkJCWJyZWFrOwotCX0KLQotCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NUT1BCKQotCQljdmFsIHw9IDB4MDQ7Ci0JaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJFTkIpCi0JCWN2YWwgfD0gVUFSVF9MQ1JfUEFSSVRZOwotCWlmICghKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJPREQpKQotCQljdmFsIHw9IFVBUlRfTENSX0VQQVI7Ci0KLSNpZmRlZiBDTVNQQVIKLQlpZiAodGVybWlvcy0+Y19jZmxhZyAmIENNU1BBUikKLQkJY3ZhbCB8PSBVQVJUX0xDUl9TUEFSOwotI2VuZGlmCi0KLQliYXVkID0gc2JfdWFydF9nZXRfYmF1ZF9yYXRlKHBvcnQsIHRlcm1pb3MsIG9sZCwgMCwgcG9ydC0+dWFydGNsay8xNik7Ci0JcXVvdCA9IG11bHRpX2dldF9kaXZpc29yKHBvcnQsIGJhdWQpOwotCi0JaWYgKG10cHQtPmNhcGFiaWxpdGllcyAmIFVBUlRfVVNFX0ZJRk8pIHsKLQkJLy9pZiAoYmF1ZCA8IDI0MDApCi0JCS8vCWZjciA9IFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwgVUFSVF9GQ1JfVFJJR0dFUl8xOwotCQkvL2Vsc2UKLQkJLy8JZmNyID0gVUFSVF9GQ1JfRU5BQkxFX0ZJRk8gfCBVQVJUX0ZDUl9UUklHR0VSXzg7Ci0KLQkJLy8JZmNyID0gVUFSVF9GQ1JfRU5BQkxFX0ZJRk8gfCAweDkwOwotCQkJZmNyID0gZmNyX2FyclttdHB0LT5wb3J0LmxpbmVdOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtdHB0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLQotCXNiX3VhcnRfdXBkYXRlX3RpbWVvdXQocG9ydCwgdGVybWlvcy0+Y19jZmxhZywgYmF1ZCk7Ci0KLQltdHB0LT5wb3J0LnJlYWRfc3RhdHVzX21hc2sgPSBVQVJUX0xTUl9PRSB8IFVBUlRfTFNSX1RIUkUgfCBVQVJUX0xTUl9EUjsKLQlpZiAodGVybWlvcy0+Y19pZmxhZyAmIElOUENLKQotCQltdHB0LT5wb3J0LnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfRkUgfCBVQVJUX0xTUl9QRTsKLQlpZiAodGVybWlvcy0+Y19pZmxhZyAmIChCUktJTlQgfCBQQVJNUkspKQotCQltdHB0LT5wb3J0LnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7Ci0KLQltdHB0LT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzayA9IDA7Ci0JaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJR05QQVIpCi0JCW10cHQtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX1BFIHwgVUFSVF9MU1JfRkU7Ci0JaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJR05CUkspIHsKLQkJbXRwdC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7Ci0JCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOUEFSKQotCQkJbXRwdC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfT0U7Ci0JfQotCi0JaWYgKCh0ZXJtaW9zLT5jX2NmbGFnICYgQ1JFQUQpID09IDApCi0JCW10cHQtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0RSOwotCi0JbXRwdC0+aWVyICY9IH5VQVJUX0lFUl9NU0k7Ci0JaWYgKFVBUlRfRU5BQkxFX01TKCZtdHB0LT5wb3J0LCB0ZXJtaW9zLT5jX2NmbGFnKSkKLQkJbXRwdC0+aWVyIHw9IFVBUlRfSUVSX01TSTsKLQotCXNlcmlhbF9vdXQobXRwdCwgVUFSVF9JRVIsIG10cHQtPmllcik7Ci0KLQlpZiAobXRwdC0+Y2FwYWJpbGl0aWVzICYgVUFSVF9TVEFSVEVDSCkgewotCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0xDUiwgMHhCRik7Ci0JCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfRUZSLAotCQkJCXRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTID8gVUFSVF9FRlJfQ1RTIDowKTsKLQl9Ci0KLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0xDUiwgY3ZhbCB8IFVBUlRfTENSX0RMQUIpOy8qIHNldCBETEFCICovCi0KLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0RMTCwgcXVvdCAmIDB4ZmYpOyAgICAgLyogTFMgb2YgZGl2aXNvciAqLwotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfRExNLCBxdW90ID4+IDgpOyAgICAgICAvKiBNUyBvZiBkaXZpc29yICovCi0KLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0xDUiwgY3ZhbCk7ICAgICAgICAvKiByZXNldCBETEFCICovCi0JbXRwdC0+bGNyID0gY3ZhbDsgICAgICAgICAgICAgICAgIC8qIFNhdmUgTENSICovCi0KLQlpZiAoZmNyICYgVUFSVF9GQ1JfRU5BQkxFX0ZJRk8pIHsKLQkJLyogZW11bGF0ZWQgVUFSVHMgKEx1Y2VudCBWZW51cyAxNjd4KSBuZWVkIHR3byBzdGVwcyAqLwotCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0ZDUiwgVUFSVF9GQ1JfRU5BQkxFX0ZJRk8pOwotCX0KLQotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfRkNSLCBmY3IpOyAgICAgLyogc2V0IGZjciAqLwotCi0KLQlpZiAoKG10cHQtPnBvcnQudHlwZSA9PSBQT1JUXzE2QzEwNVgpCi0JCXx8IChtdHB0LT5wb3J0LnR5cGUgPT0gUE9SVF8xNkMxMDVYQSkpCi0JewotCQlpZihkZWVwW210cHQtPnBvcnQubGluZV0hPTApCi0JCQlzZXRfZGVlcF9maWZvKHBvcnQsIEVOQUJMRSk7Ci0KLQkJaWYgKG10cHQtPmludGVyZmFjZSAhPSBSUzIzMikKLQkJCXNldF9hdXRvX3J0cyhwb3J0LG10cHQtPmludGVyZmFjZSk7Ci0KLQl9Ci0JZWxzZQotCXsKLQkJaWYgKG10cHQtPmludGVyZmFjZSA+PSBSUzQ4NU5FKQotCQl7Ci0JCQl1YXJ0X2NsZWFyX21jdHJsKCZtdHB0LT5wb3J0LCBUSU9DTV9SVFMpOwotCQl9Ci0JfQotCi0JaWYobXRwdC0+ZGV2aWNlLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9NUDRNKQotCXsKLQkJU2VuZEFUQ29tbWFuZChtdHB0KTsKLQkJcHJpbnRrKCJTZW5kQVRDb21tYW5kXG4iKTsKLQl9CQotCW11bHRpX3NldF9tY3RybCgmbXRwdC0+cG9ydCwgbXRwdC0+cG9ydC5tY3RybCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXRwdC0+cG9ydC5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG11bHRpX3BtKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBzdGF0ZSwgdW5zaWduZWQgaW50IG9sZHN0YXRlKQotewotCXN0cnVjdCBtcF9wb3J0ICptdHB0ID0gKHN0cnVjdCBtcF9wb3J0ICopcG9ydDsKLQlpZiAoc3RhdGUpIHsKLQkJaWYgKG10cHQtPmNhcGFiaWxpdGllcyAmIFVBUlRfU1RBUlRFQ0gpIHsKLQkJCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTENSLCAweEJGKTsKLQkJCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfRUZSLCBVQVJUX0VGUl9FQ0IpOwotCQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9MQ1IsIDApOwotCQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9JRVIsIFVBUlRfSUVSWF9TTEVFUCk7Ci0JCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0xDUiwgMHhCRik7Ci0JCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0VGUiwgMCk7Ci0JCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0xDUiwgMCk7Ci0JCX0KLQotCQlpZiAobXRwdC0+cG0pCi0JCQltdHB0LT5wbShwb3J0LCBzdGF0ZSwgb2xkc3RhdGUpOwotCX0gCi0JZWxzZSAKLQl7Ci0JCWlmIChtdHB0LT5jYXBhYmlsaXRpZXMgJiBVQVJUX1NUQVJURUNIKSB7Ci0JCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0xDUiwgMHhCRik7Ci0JCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0VGUiwgVUFSVF9FRlJfRUNCKTsKLQkJCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTENSLCAwKTsKLQkJCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfSUVSLCAwKTsKLQkJCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTENSLCAweEJGKTsKLQkJCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfRUZSLCAwKTsKLQkJCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTENSLCAwKTsKLQkJfQotCi0JCWlmIChtdHB0LT5wbSkKLQkJCW10cHQtPnBtKHBvcnQsIHN0YXRlLCBvbGRzdGF0ZSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBtdWx0aV9yZWxlYXNlX3N0ZF9yZXNvdXJjZShzdHJ1Y3QgbXBfcG9ydCAqbXRwdCkKLXsKLQl1bnNpZ25lZCBpbnQgc2l6ZSA9IDggPDwgbXRwdC0+cG9ydC5yZWdzaGlmdDsKLQotCXN3aXRjaCAobXRwdC0+cG9ydC5pb3R5cGUpIHsKLQkJY2FzZSBVUElPX01FTToKLQkJCWlmICghbXRwdC0+cG9ydC5tYXBiYXNlKQotCQkJCWJyZWFrOwotCi0JCQlpZiAobXRwdC0+cG9ydC5mbGFncyAmIFVQRl9JT1JFTUFQKSB7Ci0JCQkJaW91bm1hcChtdHB0LT5wb3J0Lm1lbWJhc2UpOwotCQkJCW10cHQtPnBvcnQubWVtYmFzZSA9IE5VTEw7Ci0JCQl9Ci0KLQkJCXJlbGVhc2VfbWVtX3JlZ2lvbihtdHB0LT5wb3J0Lm1hcGJhc2UsIHNpemUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBVUElPX0hVQjY6Ci0JCWNhc2UgVVBJT19QT1JUOgotCQkJcmVsZWFzZV9yZWdpb24obXRwdC0+cG9ydC5pb2Jhc2Usc2l6ZSk7Ci0JCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG11bHRpX3JlbGVhc2VfcG9ydChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotfQotCi1zdGF0aWMgaW50IG11bHRpX3JlcXVlc3RfcG9ydChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBtdWx0aV9jb25maWdfcG9ydChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBpbnQgZmxhZ3MpCi17Ci0Jc3RydWN0IG1wX3BvcnQgKm10cHQgPSAoc3RydWN0IG1wX3BvcnQgKilwb3J0OwotCWludCBwcm9iZWZsYWdzID0gUFJPQkVfQU5ZOwotCi0JaWYgKGZsYWdzICYgVUFSVF9DT05GSUdfVFlQRSkKLQkJYXV0b2NvbmZpZyhtdHB0LCBwcm9iZWZsYWdzKTsKLQlpZiAobXRwdC0+cG9ydC50eXBlICE9IFBPUlRfVU5LTk9XTiAmJiBmbGFncyAmIFVBUlRfQ09ORklHX0lSUSkKLQkJYXV0b2NvbmZpZ19pcnEobXRwdCk7Ci0KLQlpZiAobXRwdC0+cG9ydC50eXBlID09IFBPUlRfVU5LTk9XTikKLQkJbXVsdGlfcmVsZWFzZV9zdGRfcmVzb3VyY2UobXRwdCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXVsdGlfdmVyaWZ5X3BvcnQoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnNlcikKLXsKLQlpZiAoc2VyLT5pcnEgPj0gTlJfSVJRUyB8fCBzZXItPmlycSA8IDAgfHwKLQkJCXNlci0+YmF1ZF9iYXNlIDwgOTYwMCB8fCBzZXItPnR5cGUgPCBQT1JUX1VOS05PV04gfHwKLQkJCXNlci0+dHlwZSA9PSBQT1JUX1NUQVJURUNIKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKm11bHRpX3R5cGUoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLQlpbnQgdHlwZSA9IHBvcnQtPnR5cGU7Ci0KLQlpZiAodHlwZSA+PSBBUlJBWV9TSVpFKHVhcnRfY29uZmlnKSkKLQkJdHlwZSA9IDA7Ci0JcmV0dXJuIHVhcnRfY29uZmlnW3R5cGVdLm5hbWU7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2JfdWFydF9vcHMgbXVsdGlfcG9wcyA9IHsKLQkudHhfZW1wdHkgICA9IG11bHRpX3R4X2VtcHR5LAotCS5zZXRfbWN0cmwgID0gbXVsdGlfc2V0X21jdHJsLAotCS5nZXRfbWN0cmwgID0gbXVsdGlfZ2V0X21jdHJsLAotCS5zdG9wX3R4ICAgID0gbXVsdGlfc3RvcF90eCwKLQkuc3RhcnRfdHggICA9IG11bHRpX3N0YXJ0X3R4LAotCS5zdG9wX3J4ICAgID0gbXVsdGlfc3RvcF9yeCwKLQkuZW5hYmxlX21zICA9IG11bHRpX2VuYWJsZV9tcywKLQkuYnJlYWtfY3RsICA9IG11bHRpX2JyZWFrX2N0bCwKLQkuc3RhcnR1cCAgICA9IG11bHRpX3N0YXJ0dXAsCi0JLnNodXRkb3duICAgPSBtdWx0aV9zaHV0ZG93biwKLQkuc2V0X3Rlcm1pb3MgICAgPSBtdWx0aV9zZXRfdGVybWlvcywKLQkucG0gICAgIAk9IG11bHRpX3BtLAotCS50eXBlICAgICAgIAk9IG11bHRpX3R5cGUsCi0JLnJlbGVhc2VfcG9ydCAgID0gbXVsdGlfcmVsZWFzZV9wb3J0LAotCS5yZXF1ZXN0X3BvcnQgICA9IG11bHRpX3JlcXVlc3RfcG9ydCwKLQkuY29uZmlnX3BvcnQgICAgPSBtdWx0aV9jb25maWdfcG9ydCwKLQkudmVyaWZ5X3BvcnQgICAgPSBtdWx0aV92ZXJpZnlfcG9ydCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgbXVsdGlfcmVnID0gewotCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAotCS5kcml2ZXJfbmFtZSAgICA9ICJnb2xkZWxfdHVsaXAiLAotCS5kZXZfbmFtZSAgICAgICA9ICJ0dHlNUCIsCi0JLm1ham9yICAgICAgICAgID0gU0JfVFRZX01QX01BSk9SLAotCS5taW5vciAgICAgICAgICA9IDAsCi0JLm5yICAgICAgICAgICAgID0gTUFYX01QX1BPUlQsIAotCS5jb25zICAgICAgICAgICA9IE5VTEwsCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgbXVsdGlfaW5pdF9wb3J0cyh2b2lkKQotewotCXN0cnVjdCBtcF9wb3J0ICptdHB0OwotCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCWludCBpLGosazsKLQl1bnNpZ25lZCBjaGFyIG9zYzsKLQl1bnNpZ25lZCBjaGFyIGJfcmV0ID0gMDsKLQlzdGF0aWMgc3RydWN0IG1wX2RldmljZV90ICpzYmRldjsgCi0KLQlpZiAoIWZpcnN0KQotCQlyZXR1cm47Ci0JZmlyc3QgPSAwOwotCi0JbXRwdCA9IG11bHRpX3BvcnRzOyAKLQotCWZvciAoaz0wO2s8TlJfQk9BUkQ7aysrKQotCXsKLQkJc2JkZXYgPSAmbXBfZGV2c1trXTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgc2JkZXYtPm5yX3BvcnRzOyBpKyssIG10cHQrKykgCi0JCXsKLQkJCW10cHQtPmRldmljZSAJCT0gc2JkZXY7Ci0JCQltdHB0LT5wb3J0LmlvYmFzZSAgID0gc2JkZXYtPnVhcnRfYWNjZXNzX2FkZHIgKyA4Kmk7Ci0JCQltdHB0LT5wb3J0LmlycSAgICAgID0gc2JkZXYtPmlycTsKLQkJCWlmICggKChzYmRldi0+ZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfTVA0KSYmKHNiZGV2LT5yZXZpc2lvbj09MHg5MSkpKQotCQkJCW10cHQtPmludGVyZmFjZV9jb25maWdfYWRkciA9IHNiZGV2LT5vcHRpb25fcmVnX2FkZHIgKyAweDA4ICsgaTsKLQkJCWVsc2UgaWYgKHNiZGV2LT5yZXZpc2lvbiA9PSAweGMwKQotCQkJCW10cHQtPmludGVyZmFjZV9jb25maWdfYWRkciA9IHNiZGV2LT5vcHRpb25fcmVnX2FkZHIgKyAweDA4ICsgKGkgJiAweDEpOwotCQkJZWxzZQotCQkJCW10cHQtPmludGVyZmFjZV9jb25maWdfYWRkciA9IHNiZGV2LT5vcHRpb25fcmVnX2FkZHIgKyAweDA4ICsgaS84OwotCi0JCQltdHB0LT5vcHRpb25fYmFzZV9hZGRyID0gc2JkZXYtPm9wdGlvbl9yZWdfYWRkcjsKLQotCQkJbXRwdC0+cG9sbF90eXBlID0gc2JkZXYtPnBvbGxfdHlwZTsKLQotCQkJbXRwdC0+cG9ydC51YXJ0Y2xrICA9IEJBU0VfQkFVRCAqIDE2OwotCi0JCQkvKiBnZXQgaW5wdXQgY2xvY2sgaW5mb3JtYXRpb24gKi8KLQkJCW9zYyA9IGluYihzYmRldi0+b3B0aW9uX3JlZ19hZGRyICsgTVBfT1BUUl9ESVIwICsgaS84KSAmIDB4MEY7Ci0JCQlpZiAob3NjPT0weDBmKQotCQkJCW9zYyA9IDA7Ci0JCQlmb3Ioaj0wO2o8b3NjO2orKykKLQkJCQltdHB0LT5wb3J0LnVhcnRjbGsgKj0gMjsKLQkJCW10cHQtPnBvcnQuZmxhZ3MgICAgfD0gU1REX0NPTV9GTEFHUyB8IFVQRl9TSEFSRV9JUlEgOwotCQkJbXRwdC0+cG9ydC5pb3R5cGUgICA9IFVQSU9fUE9SVDsKLQkJCW10cHQtPnBvcnQub3BzICAgICAgPSAmbXVsdGlfcG9wczsKLQotCQkJaWYgKHNiZGV2LT5yZXZpc2lvbiA9PSAweGMwKQotCQkJewotCQkJCS8qIGZvciBTQjE2QzEwNTNBUENJICovCi0JCQkJYl9yZXQgPSBzYjEwNTNhX2dldF9pbnRlcmZhY2UobXRwdCwgaSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJYl9yZXQgPSByZWFkX29wdGlvbl9yZWdpc3RlcihtdHB0LChNUF9PUFRSX0lJUjAgKyBpLzgpKTsKLQkJCQlwcmludGsoIklJUl9SRVQgPSAleFxuIixiX3JldCk7Ci0JCQl9Ci0KLQkJCS8qIGRlZmF1bHQgdG8gUlMyMzIgKi8KLQkJCW10cHQtPmludGVyZmFjZSA9IFJTMjMyOwotCQkJaWYgKElJUl9SUzQyMiA9PSAoYl9yZXQgJiBJSVJfVFlQRV9NQVNLKSkKLQkJCQltdHB0LT5pbnRlcmZhY2UgPSBSUzQyMlBUUDsKLQkJCWlmIChJSVJfUlM0ODUgPT0gKGJfcmV0ICYgSUlSX1RZUEVfTUFTSykpCi0JCQkJbXRwdC0+aW50ZXJmYWNlID0gUlM0ODVORTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgX19pbml0IG11bHRpX3JlZ2lzdGVyX3BvcnRzKHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2KQotewotCWludCBpOwotCi0JbXVsdGlfaW5pdF9wb3J0cygpOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyspIHsKLQkJc3RydWN0IG1wX3BvcnQgKm10cHQgPSAmbXVsdGlfcG9ydHNbaV07Ci0KLQkJbXRwdC0+cG9ydC5saW5lID0gaTsKLQkJbXRwdC0+cG9ydC5vcHMgPSAmbXVsdGlfcG9wczsKLQkJaW5pdF90aW1lcigmbXRwdC0+dGltZXIpOwotCQltdHB0LT50aW1lci5mdW5jdGlvbiA9IG11bHRpX3RpbWVvdXQ7Ci0JCW1wX2FkZF9vbmVfcG9ydChkcnYsICZtdHB0LT5wb3J0KTsKLQl9Ci19Ci0KLS8qKgotICogcGNpX3JlbWFwX2Jhc2UgLSByZW1hcCBCQVIgdmFsdWUgb2YgcGNpIGRldmljZQotICoKLSAqIFBBUkFNRVRFUlMKLSAqICBwY2lkZXYgIC0gcGNpX2RldiBzdHJ1Y3R1cmUgYWRkcmVzcwotICogIG9mZnNldCAgLSBCQVIgb2Zmc2V0IFBDSV9CQVNFX0FERFJFU1NfMCB+IFBDSV9CQVNFX0FERFJFU1NfNAotICogIGFkZHJlc3MgLSBhZGRyZXNzIHRvIGJlIGNoYW5nZWQgQkFSIHZhbHVlCi0gKiAgc2l6ZQktIHNpemUgb2YgYWRkcmVzcyBzcGFjZSAKLSAqCi0gKiBSRVRVUk5TCi0gKiAgSWYgdGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBzdWNjZXNzZnVsLCBpdCByZXR1cm5zIDAuIE90aGVyd2lzZSwgSXQgcmV0dXJucyAtMS4KLSAqLwotc3RhdGljIGludCBwY2lfcmVtYXBfYmFzZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCAKLQkJdW5zaWduZWQgaW50IGFkZHJlc3MsIHVuc2lnbmVkIGludCBzaXplKSAKLXsKLSNpZiAwCi0Jc3RydWN0IHJlc291cmNlICpyb290OwotCXVuc2lnbmVkIGluZGV4ID0gKG9mZnNldCAtIDB4MTApID4+IDI7Ci0jZW5kaWYKLQotCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpZGV2LCBvZmZzZXQsIGFkZHJlc3MpOwotI2lmIDAKLQlyb290ID0gcGNpZGV2LT5yZXNvdXJjZVtpbmRleF0ucGFyZW50OwotCXJlbGVhc2VfcmVzb3VyY2UoJnBjaWRldi0+cmVzb3VyY2VbaW5kZXhdKTsKLQlhZGRyZXNzICY9IH4weDE7Ci0JcGNpZGV2LT5yZXNvdXJjZVtpbmRleF0uc3RhcnQgPSBhZGRyZXNzOwotCXBjaWRldi0+cmVzb3VyY2VbaW5kZXhdLmVuZAkgID0gYWRkcmVzcyArIHNpemUgLSAxOwotCi0JaWYgKHJlcXVlc3RfcmVzb3VyY2Uocm9vdCwgJnBjaWRldi0+cmVzb3VyY2VbaW5kZXhdKSAhPSBOVUxMKQotCXsKLQkJcHJpbnRrKEtFUk5fRVJSICJwY2kgcmVtYXAgY29uZmxpY3QhISAweCV4XG4iLCBhZGRyZXNzKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotI2VuZGlmCi0KLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgaW50IGluaXRfbXBfZGV2KHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIG1wcGNpYnJkX3QgYnJkKQotewotCXN0YXRpYyBzdHJ1Y3QgbXBfZGV2aWNlX3QgKnNiZGV2ID0gbXBfZGV2czsKLQl1bnNpZ25lZCBsb25nIGFkZHIgPSAwOwotCWludCBqOwotCXN0cnVjdCByZXNvdXJjZSAqcmV0ID0gTlVMTDsKLQotCXNiZGV2LT5kZXZpY2VfaWQgPSBicmQuZGV2aWNlX2lkOwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaWRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmKHNiZGV2LT5yZXZpc2lvbikpOwotCXNiZGV2LT5uYW1lID0gYnJkLm5hbWU7Ci0Jc2JkZXYtPnVhcnRfYWNjZXNzX2FkZHIgPSBwY2lkZXYtPnJlc291cmNlWzBdLnN0YXJ0ICYgUENJX0JBU0VfQUREUkVTU19JT19NQVNLOwotCi0JLyogY2hlY2sgcmV2aXNpb24uIFRoZSBTQjE2QzEwNTNBUENJJ3Mgb3B0aW9uIGkvbyBhZGRyZXNzIGlzIEJBUjQgKi8KLQlpZiAoc2JkZXYtPnJldmlzaW9uID09IDB4YzApCi0JewotCQkvKiBTQjE2QzEwNTNBUENJICovCi0JCXNiZGV2LT5vcHRpb25fcmVnX2FkZHIgPSBwY2lkZXYtPnJlc291cmNlWzRdLnN0YXJ0ICYgUENJX0JBU0VfQUREUkVTU19JT19NQVNLOwotCX0KLQllbHNlCi0JewotCQlzYmRldi0+b3B0aW9uX3JlZ19hZGRyID0gcGNpZGV2LT5yZXNvdXJjZVsxXS5zdGFydCAmIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKLQl9Ci0jaWYgMQkKLQlpZiAoc2JkZXYtPnJldmlzaW9uID09IDB4YzApCi0JewotCQlvdXRiKDB4MDAsIHNiZGV2LT5vcHRpb25fcmVnX2FkZHIgKyBNUF9PUFRSX0dQT0NSKTsKLQkJaW5iKHNiZGV2LT5vcHRpb25fcmVnX2FkZHIgKyBNUF9PUFRSX0dQT0NSKTsKLQkJb3V0YigweDgzLCBzYmRldi0+b3B0aW9uX3JlZ19hZGRyICsgTVBfT1BUUl9HUE9DUik7Ci0JfQotI2VuZGlmCi0KLQlzYmRldi0+aXJxID0gcGNpZGV2LT5pcnE7Ci0KLQlpZiAoKGJyZC5kZXZpY2VfaWQgJiAweDA4MDApIHx8ICEoYnJkLmRldmljZV9pZCAmMHhmZjAwKSkKLQl7Ci0JCXNiZGV2LT5wb2xsX3R5cGUgPSBUWVBFX0lOVEVSUlVQVDsKLQl9Ci0JZWxzZQotCXsKLQkJc2JkZXYtPnBvbGxfdHlwZSA9IFRZUEVfUE9MTDsKLQl9Ci0KLQkvKiBjb2RlcyB3aGljaCBpcyBzcGVjaWZpYyB0byBlYWNoIGJvYXJkKi8KLQlzd2l0Y2goYnJkLmRldmljZV9pZCl7Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9NUDEgOgotCQljYXNlIFBDSUVfREVWSUNFX0lEX01QMSA6Ci0JCWNhc2UgUENJRV9ERVZJQ0VfSURfTVAxRSA6Ci0JCWNhc2UgUENJRV9ERVZJQ0VfSURfR1RfTVAxIDoKLQkJCXNiZGV2LT5ucl9wb3J0cyA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX01QMiA6Ci0JCWNhc2UgUENJRV9ERVZJQ0VfSURfTVAyIDoKLQkJY2FzZSBQQ0lFX0RFVklDRV9JRF9HVF9NUDIgOgotCQljYXNlIFBDSUVfREVWSUNFX0lEX01QMkIgOgotCQljYXNlIFBDSUVfREVWSUNFX0lEX01QMkUgOgotCQkJc2JkZXYtPm5yX3BvcnRzID0gMjsKLQotCQkJLyogc2VyaWFsIGJhc2UgYWRkcmVzcyByZW1hcCAqLwotCQkJaWYgKHNiZGV2LT5yZXZpc2lvbiA9PSAweGMwKQotCQkJewotCQkJCWludCBwcmV2X3BvcnRfYWRkciA9IDA7Ci0KLQkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAsICZwcmV2X3BvcnRfYWRkcik7Ci0JCQkJcGNpX3JlbWFwX2Jhc2UocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzEsIHByZXZfcG9ydF9hZGRyICsgOCwgOCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX01QNCA6Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9NUDRBIDoKLQkJY2FzZSBQQ0lFX0RFVklDRV9JRF9NUDQgOgotCQljYXNlIFBDSV9ERVZJQ0VfSURfR1RfTVA0IDoKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX0dUX01QNEEgOgotCQljYXNlIFBDSUVfREVWSUNFX0lEX0dUX01QNCA6Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9NUDRNIDoKLQkJY2FzZSBQQ0lFX0RFVklDRV9JRF9NUDRCIDoKLQkJCXNiZGV2LT5ucl9wb3J0cyA9IDQ7Ci0KLQkJCWlmKHNiZGV2LT5yZXZpc2lvbiA9PSAweDkxKXsKLQkJCQlzYmRldi0+cmVzZXJ2ZWRfYWRkclswXSA9IHBjaWRldi0+cmVzb3VyY2VbMF0uc3RhcnQgJiBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7Ci0JCQkJb3V0YigweDAzICwgc2JkZXYtPnJlc2VydmVkX2FkZHJbMF0gKyAweDAxKTsKLQkJCQlvdXRiKDB4MDMgLCBzYmRldi0+cmVzZXJ2ZWRfYWRkclswXSArIDB4MDIpOwotCQkJCW91dGIoMHgwMSAsIHNiZGV2LT5yZXNlcnZlZF9hZGRyWzBdICsgMHgyMCk7Ci0JCQkJb3V0YigweDAwICwgc2JkZXYtPnJlc2VydmVkX2FkZHJbMF0gKyAweDIxKTsKLQkJCQlyZXF1ZXN0X3JlZ2lvbihzYmRldi0+cmVzZXJ2ZWRfYWRkclswXSwgMzIsIHNiZGV2LT5uYW1lKTsKLQkJCQlzYmRldi0+dWFydF9hY2Nlc3NfYWRkciA9IHBjaWRldi0+cmVzb3VyY2VbMV0uc3RhcnQgJiBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7Ci0JCQkJc2JkZXYtPm9wdGlvbl9yZWdfYWRkciA9IHBjaWRldi0+cmVzb3VyY2VbMl0uc3RhcnQgJiBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7Ci0JCQl9Ci0KLQkJCS8qIFNCMTZDMTA1M0FQQ0kgKi8KLQkJCWlmIChzYmRldi0+cmV2aXNpb24gPT0gMHhjMCkKLQkJCXsKLQkJCQlpbnQgcHJldl9wb3J0X2FkZHIgPSAwOwotCi0JCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18wLCAmcHJldl9wb3J0X2FkZHIpOwotCQkJCXBjaV9yZW1hcF9iYXNlKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18xLCBwcmV2X3BvcnRfYWRkciArIDgsIDgpOwotCQkJCXBjaV9yZW1hcF9iYXNlKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18yLCBwcmV2X3BvcnRfYWRkciArIDE2LCA4KTsKLQkJCQlwY2lfcmVtYXBfYmFzZShwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfMywgcHJldl9wb3J0X2FkZHIgKyAyNCwgOCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX01QNiA6Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9NUDZBIDoKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX0dUX01QNiA6Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9HVF9NUDZBIDoKLQkJCXNiZGV2LT5ucl9wb3J0cyA9IDY7Ci0KLQkJCS8qIFNCMTZDMTA1M0FQQ0kgKi8KLQkJCWlmIChzYmRldi0+cmV2aXNpb24gPT0gMHhjMCkKLQkJCXsKLQkJCQlpbnQgcHJldl9wb3J0X2FkZHIgPSAwOwotCi0JCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18wLCAmcHJldl9wb3J0X2FkZHIpOwotCQkJCXBjaV9yZW1hcF9iYXNlKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18xLCBwcmV2X3BvcnRfYWRkciArIDgsIDgpOwotCQkJCXBjaV9yZW1hcF9iYXNlKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18yLCBwcmV2X3BvcnRfYWRkciArIDE2LCAxNik7Ci0JCQkJcGNpX3JlbWFwX2Jhc2UocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzMsIHByZXZfcG9ydF9hZGRyICsgMzIsIDE2KTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBDSV9ERVZJQ0VfSURfTVA4IDoKLQkJY2FzZSBQQ0lFX0RFVklDRV9JRF9NUDggOgotCQljYXNlIFBDSV9ERVZJQ0VfSURfR1RfTVA4IDoKLQkJY2FzZSBQQ0lFX0RFVklDRV9JRF9HVF9NUDggOgotCQljYXNlIFBDSUVfREVWSUNFX0lEX01QOEIgOgotCQkJc2JkZXYtPm5yX3BvcnRzID0gODsKLQkJCWJyZWFrOwotCQljYXNlIFBDSV9ERVZJQ0VfSURfTVAzMiA6Ci0JCWNhc2UgUENJRV9ERVZJQ0VfSURfTVAzMiA6Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9HVF9NUDMyIDoKLQkJY2FzZSBQQ0lFX0RFVklDRV9JRF9HVF9NUDMyIDoKLQkJCXsKLQkJCQlpbnQgcG9ydG51bV9oZXg9MDsKLQkJCQlwb3J0bnVtX2hleCA9IGluYihzYmRldi0+b3B0aW9uX3JlZ19hZGRyKTsKLQkJCQlzYmRldi0+bnJfcG9ydHMgPSAoKHBvcnRudW1faGV4LzE2KSoxMCkgKyAocG9ydG51bV9oZXggJSAxNik7Ci0JCQl9Ci0JCQlicmVhazsKLSNpZmRlZiBDT05GSUdfUEFSUE9SVF9QQwotCQljYXNlIFBDSV9ERVZJQ0VfSURfTVAyUzFQIDoKLQkJCXNiZGV2LT5ucl9wb3J0cyA9IDI7Ci0KLQkJCS8qIFNCMTZDMTA1M0FQQ0kgKi8KLQkJCWlmIChzYmRldi0+cmV2aXNpb24gPT0gMHhjMCkKLQkJCXsKLQkJCQlpbnQgcHJldl9wb3J0X2FkZHIgPSAwOwotCi0JCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18wLCAmcHJldl9wb3J0X2FkZHIpOwotCQkJCXBjaV9yZW1hcF9iYXNlKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18xLCBwcmV2X3BvcnRfYWRkciArIDgsIDgpOwotCQkJfQotCi0JCQkvKiBhZGQgUEMgY29tcGF0aWJsZSBwYXJhbGxlbCBwb3J0ICovCi0JCQlwYXJwb3J0X3BjX3Byb2JlX3BvcnQocGNpZGV2LT5yZXNvdXJjZVsyXS5zdGFydCwgcGNpZGV2LT5yZXNvdXJjZVszXS5zdGFydCwgUEFSUE9SVF9JUlFfTk9ORSwgUEFSUE9SVF9ETUFfTk9ORSwgJnBjaWRldi0+ZGV2LCAwKTsKLQkJCWJyZWFrOwotCQljYXNlIFBDSV9ERVZJQ0VfSURfTVAxUCA6Ci0JCQkvKiBhZGQgUEMgY29tcGF0aWJsZSBwYXJhbGxlbCBwb3J0ICovCi0JCQlwYXJwb3J0X3BjX3Byb2JlX3BvcnQocGNpZGV2LT5yZXNvdXJjZVsyXS5zdGFydCwgcGNpZGV2LT5yZXNvdXJjZVszXS5zdGFydCwgUEFSUE9SVF9JUlFfTk9ORSwgUEFSUE9SVF9ETUFfTk9ORSwgJnBjaWRldi0+ZGV2LCAwKTsKLQkJCWJyZWFrOwotI2VuZGlmCi0JfQotCi0JcmV0ID0gcmVxdWVzdF9yZWdpb24oc2JkZXYtPnVhcnRfYWNjZXNzX2FkZHIsICg4KnNiZGV2LT5ucl9wb3J0cyksIHNiZGV2LT5uYW1lKTsKLQotCWlmIChzYmRldi0+cmV2aXNpb24gPT0gMHhjMCkKLQl7Ci0JCXJldCA9IHJlcXVlc3RfcmVnaW9uKHNiZGV2LT5vcHRpb25fcmVnX2FkZHIsIDB4NDAsIHNiZGV2LT5uYW1lKTsKLQl9Ci0JZWxzZQotCXsKLQkJcmV0ID0gcmVxdWVzdF9yZWdpb24oc2JkZXYtPm9wdGlvbl9yZWdfYWRkciwgMHgyMCwgc2JkZXYtPm5hbWUpOwotCX0KLQotCi0JTlJfQk9BUkQrKzsKLQlOUl9QT1JUUyArPSBzYmRldi0+bnJfcG9ydHM7Ci0KLQkvKiBFbmFibGUgUENJIGludGVycnVwdCAqLwotCWFkZHIgPSBzYmRldi0+b3B0aW9uX3JlZ19hZGRyICsgTVBfT1BUUl9JTVIwOwotCWZvcihqPTA7IGogPCAoc2JkZXYtPm5yX3BvcnRzLzgpKzE7IGorKykKLQl7Ci0JCWlmIChzYmRldi0+cG9sbF90eXBlID09IFRZUEVfSU5URVJSVVBUKQotCQl7Ci0JCQlvdXRiKDB4ZmYsYWRkciAraik7Ci0JCX0KLQl9Ci0Jc2JkZXYrKzsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBtdWx0aV9pbml0KHZvaWQpCi17Ci0JaW50IHJldCwgaTsKLQlzdHJ1Y3QgcGNpX2RldiAgKmRldiA9IE5VTEw7Ci0KLQlpZihmY3JfY291bnQ9PTApCi0JewotCQlmb3IoaT0wO2k8MjU2O2krKykKLQkJewotCQkJZmNyX2FycltpXSA9IDB4MDE7Ci0JCQkKLQkJfQotCX0KLQlpZihkZWVwX2NvdW50PT0wKQotCXsKLQkJZm9yKGk9MDtpPDI1NjtpKyspCi0JCXsKLQkJCWRlZXBbaV0gPSAxOwotCQkJCi0JCX0KLQl9Ci0JaWYocnRyX2NvdW50PT0wKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yKGk9MDtpPDI1NjtpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcnRyW2ldID0gMHgxMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQlpZih0dHJfY291bnQ9PTApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IoaT0wO2k8MjU2O2krKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0dHJbaV0gPSAweDM4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLXByaW50aygiTVVMVEkgSU5JVFxuIik7Ci0JZm9yKCBpPTA7IGk8IG1wX25ycGNpYnJkczsgaSsrKQotCXsKLQotCQl3aGlsZSggKGRldiA9IHBjaV9nZXRfZGV2aWNlKG1wX3BjaWJvYXJkc1tpXS52ZW5kb3JfaWQsIG1wX3BjaWJvYXJkc1tpXS5kZXZpY2VfaWQsIGRldikgKSApCi0KLQkJewotcHJpbnRrKCJGT1VORH5+flxuIik7Ci0vLwlDZW50IE9TIGJ1ZyBmaXgKLS8vCQkJaWYgKG1wX3BjaWJvYXJkc1tpXS5kZXZpY2VfaWQgJiAweDA4MDApCi0JCQl7Ci0JCQkJaW50IHN0YXR1czsKLQkgICAgICAgIAkJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7Ci0JICAgICAgICAJCXN0YXR1cyA9IHBjaV9lbmFibGVfZGV2aWNlKGRldik7Ci0gICAgICAgICAgICAKLQkgICAJCSAgICAgCWlmIChzdGF0dXMgIT0gMCkKLSAgICAgICAgCQkJeyAKLSAgICAgICAgICAgICAgIAkJCQlwcmludGsoIk11bHRpcG9ydCBCb2FyZCBFbmFibGUgRmFpbCAhXG5cbiIpOwotICAgICAgICAgICAgICAgCQkJCXN0YXR1cyA9IC1FTlhJTzsKLSAgICAgICAgICAgICAgICAJCQlyZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAJCQl9Ci0JCQl9Ci0KLQkJCWluaXRfbXBfZGV2KGRldiwgbXBfcGNpYm9hcmRzW2ldKTsJCi0JCX0KLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfSVJRUzsgaSsrKQotCQlzcGluX2xvY2tfaW5pdCgmaXJxX2xpc3RzW2ldLmxvY2spOwotCi0JcmV0ID0gbXBfcmVnaXN0ZXJfZHJpdmVyKCZtdWx0aV9yZWcpOwotCi0JaWYgKHJldCA+PSAwKQotCQltdWx0aV9yZWdpc3Rlcl9wb3J0cygmbXVsdGlfcmVnKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtdWx0aV9leGl0KHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfUE9SVFM7IGkrKykKLQkJbXBfcmVtb3ZlX29uZV9wb3J0KCZtdWx0aV9yZWcsICZtdWx0aV9wb3J0c1tpXS5wb3J0KTsKLQotCW1wX3VucmVnaXN0ZXJfZHJpdmVyKCZtdWx0aV9yZWcpOwotfQotCi1tb2R1bGVfaW5pdChtdWx0aV9pbml0KTsKLW1vZHVsZV9leGl0KG11bHRpX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlN5c3RlbUJhc2UgTXVsdGlwb3J0IFBDSS9QQ0llIENPUkUiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYjEwNXgvc2JfcGNpX21wLmggYi9kcml2ZXJzL3N0YWdpbmcvc2IxMDV4L3NiX3BjaV9tcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGFlNGFiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zYjEwNXgvc2JfcGNpX21wLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90dHlfZHJpdmVyLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvY2lyY19idWYuaD4KLQotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9zZXJpYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQotCi0jaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotCi0KLSNkZWZpbmUgTVBfVEVSTUlPUyAga3Rlcm1pb3MKLQotI2luY2x1ZGUgInNiX21wX3JlZ2lzdGVyLmgiCi0jaW5jbHVkZSAic2Jfc2VyX2NvcmUuaCIKLQotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAgIjEuMSIKLSNkZWZpbmUgRFJJVkVSX0RBVEUgICAgICIyMDEyLzAxLzA1IgotI2RlZmluZSBEUklWRVJfQVVUSE9SICAiU1lTVEVNQkFTRTx0ZWNoQHN5c2Jhcy5jb20+IgotI2RlZmluZSBEUklWRVJfREVTQyAgIlN5c3RlbUJhc2UgUENJL1BDSWUgTXVsdGlwb3J0IENvcmUiCi0KLSNkZWZpbmUgU0JfVFRZX01QX01BSk9SCQkJNTQKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQJCTB4MTRBMQotCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVAxCQkweDRkMDEKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9NUDIJCTB4NGQwMgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QNAkJMHg0ZDA0Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVA0QQkJMHg0ZDU0Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVA2CQkweDRkMDYKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9NUDZBCQkweDRkNTYKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9NUDgJCTB4NGQwOAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QMzIJCTB4NGQzMgotLyogUGFyYWxsZWwgcG9ydCAqLwotI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QMVAJCTB4NDMwMQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QMlMxUAkJMHg0MzAzCi0KLSNkZWZpbmUgUENJRV9ERVZJQ0VfSURfTVAxCQkweDQ1MDEKLSNkZWZpbmUgUENJRV9ERVZJQ0VfSURfTVAyCQkweDQ1MDIKLSNkZWZpbmUgUENJRV9ERVZJQ0VfSURfTVA0CQkweDQ1MDQKLSNkZWZpbmUgUENJRV9ERVZJQ0VfSURfTVA4CQkweDQ1MDgKLSNkZWZpbmUgUENJRV9ERVZJQ0VfSURfTVAzMgkJMHg0NTMyCi0KLSNkZWZpbmUgUENJRV9ERVZJQ0VfSURfTVAxRQkJMHg0ZTAxCi0jZGVmaW5lIFBDSUVfREVWSUNFX0lEX01QMkUJCTB4NGUwMgotI2RlZmluZSBQQ0lFX0RFVklDRV9JRF9NUDJCCQkweDRiMDIKLSNkZWZpbmUgUENJRV9ERVZJQ0VfSURfTVA0QgkJMHg0YjA0Ci0jZGVmaW5lIFBDSUVfREVWSUNFX0lEX01QOEIJCTB4NGIwOAotCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfR1RfTVA0CQkweDAwMDQKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9HVF9NUDRBCQkweDAwNTQKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9HVF9NUDYJCTB4MDAwNgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0dUX01QNkEJCTB4MDA1NgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0dUX01QOAkJMHgwMDA4Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfR1RfTVAzMgkJMHgwMDMyCi0KLSNkZWZpbmUgUENJRV9ERVZJQ0VfSURfR1RfTVAxCQkweDE1MDEKLSNkZWZpbmUgUENJRV9ERVZJQ0VfSURfR1RfTVAyCQkweDE1MDIKLSNkZWZpbmUgUENJRV9ERVZJQ0VfSURfR1RfTVA0CQkweDE1MDQKLSNkZWZpbmUgUENJRV9ERVZJQ0VfSURfR1RfTVA4CQkweDE1MDgKLSNkZWZpbmUgUENJRV9ERVZJQ0VfSURfR1RfTVAzMgkJMHgxNTMyCi0KLSNkZWZpbmUgUENJX0RFVklDRV9JRF9NUDRNCQkweDQ2MDQgIC8vbW9kZW0KLQotI2RlZmluZSBNQVhfTVBfREVWICA4Ci0jZGVmaW5lIEJEX01BWF9QT1JUIDMyIAkvKiBNYXggc2VyaWFsIHBvcnQgaW4gb25lIGJvYXJkICovCi0jZGVmaW5lIE1BWF9NUF9QT1JUIDI1NiAvKiBNYXggc2VyaWFsIHBvcnQgaW4gb25lIFBDICovCi0KLSNkZWZpbmUgUE9SVF8xNkMxMDVYQQkzCi0jZGVmaW5lIFBPUlRfMTZDMTA1WAkyCi0jZGVmaW5lIFBPUlRfMTZDNTVYCQkxCi0KLSNkZWZpbmUgRU5BQkxFCQkxCi0jZGVmaW5lIERJU0FCTEUJCTAKLQotLyogaW9jdGxzICovCi0jZGVmaW5lIFRJT0NHTlVNT0ZQT1JUCQkweDU0NUYKLSNkZWZpbmUgVElPQ1NNVUxUSUVDSE8JCTB4NTQ0MAotI2RlZmluZSBUSU9DU1BUUE5PRUNITwkJMHg1NDQxCi0KLSNkZWZpbmUgVElPQ0dPUFRJT05SRUcJCTB4NTQ2MQotI2RlZmluZSBUSU9DR0RJU0FCTEVJUlEJCTB4NTQ2MgotI2RlZmluZSBUSU9DR0VOQUJMRUlSUQkJMHg1NDYzCi0jZGVmaW5lIFRJT0NHU09GVFJFU0VUCQkweDU0NjQKLSNkZWZpbmUgVElPQ0dTT0ZUUkVTRVRSCQkweDU0NjUKLSNkZWZpbmUgVElPQ0dSRUdJTkZPCQkweDU0NjYKLSNkZWZpbmUgVElPQ0dHRVRMU1IJCTB4NTQ2NwotI2RlZmluZSBUSU9DR0dFVERFVklECQkweDU0NjgKLSNkZWZpbmUgVElPQ0dHRVRCRE5PCQkweDU0NjkKLSNkZWZpbmUgVElPQ0dHRVRJTlRFUkZBQ0UJMHg1NDZBCi0jZGVmaW5lIFRJT0NHR0VUUkVWCQkweDU0NkIKLSNkZWZpbmUgVElPQ0dHRVROUlBPUlRTCQkweDU0NkMKLSNkZWZpbmUgVElPQ0dHRVRQT1JUVFlQRQkweDU0NkQKLSNkZWZpbmUgR0VUREVFUEZJRk8JCTB4NTRBQQotI2RlZmluZSBTRVRERUVQRklGTwkJMHg1NEFCCi0jZGVmaW5lIFNFVEZDUgkJCTB4NTRCQQotI2RlZmluZSBTRVRUVFIJCQkweDU0QjEKLSNkZWZpbmUgU0VUUlRSCQkJMHg1NEIyCi0jZGVmaW5lIEdFVFRUUgkJCTB4NTRCMwotI2RlZmluZSBHRVRSVFIJCQkweDU0QjQKLQotLyogbXVsdGktZHJvcCBtb2RlIHJlbGF0ZWQgaW9jdGwgY29tbWFuZHMgKi8KLSNkZWZpbmUgVElPQ1NNVUxUSURST1AJCTB4NTQ3MAotI2RlZmluZSBUSU9DU01EQUREUiAgIAkJMHg1NDcxCi0jZGVmaW5lIFRJT0NHTURBRERSICAgCQkweDU0NzIKLSNkZWZpbmUgVElPQ1NFTkRBRERSCQkweDU0NzMKLQotCi0vKiBzZXJpYWwgaW50ZXJmYWNlICovCi0jZGVmaW5lIFJTMjMyCQkxIAotI2RlZmluZSBSUzQyMlBUUAkyCi0jZGVmaW5lIFJTNDIyTUQJCTMKLSNkZWZpbmUgUlM0ODVORQkJNAotI2RlZmluZSBSUzQ4NUVDSE8JNQotCi0jZGVmaW5lIHNlcmlhbF9pbnAodXAsIG9mZnNldCkgICAgICBzZXJpYWxfaW4odXAsIG9mZnNldCkKLSNkZWZpbmUgc2VyaWFsX291dHAodXAsIG9mZnNldCwgdmFsdWUpICBzZXJpYWxfb3V0KHVwLCBvZmZzZXQsIHZhbHVlKQotCQotI2RlZmluZSBQQVNTX0xJTUlUICAyNTYKLSNkZWZpbmUgaXNfcmVhbF9pbnRlcnJ1cHQoaXJxKSAgKChpcnEpICE9IDApCi0KLSNkZWZpbmUgUFJPQkVfQU5ZICAgKH4wKQotCi1zdGF0aWMgREVGSU5FX01VVEVYKG1wX211dGV4KTsKLSNkZWZpbmUgTVBfTVVURVhfTE9DSyh4KSBtdXRleF9sb2NrKCYoeCkpIAotI2RlZmluZSBNUF9NVVRFWF9VTkxPQ0soeCkgbXV0ZXhfdW5sb2NrKCYoeCkpIAotI2RlZmluZSBNUF9TVEFURV9MT0NLKHgpIG11dGV4X2xvY2soJigoeCktPm11dGV4KSkgCi0jZGVmaW5lIE1QX1NUQVRFX1VOTE9DSyh4KSBtdXRleF91bmxvY2soJigoeCktPm11dGV4KSkgCi0gICAgICAgIAotCi0jZGVmaW5lIFVBUlRfTFNSX1NQRUNJQUwgICAgMHgxRQotICAgICAgICAKLSNkZWZpbmUgSElHSF9CSVRTX09GRlNFVCAgICAgICAgKChzaXplb2YobG9uZyktc2l6ZW9mKGludCkpKjgpCi0jZGVmaW5lIHVhcnRfdXNlcnMoc3RhdGUpICAgICAgICgoc3RhdGUpLT5jb3VudCArICgoc3RhdGUpLT5pbmZvID8gKHN0YXRlKS0+aW5mby0+YmxvY2tlZF9vcGVuIDogMCkpCi0KLQotLy8jZGVmaW5lIE1QX0RFQlVHIDEKLSN1bmRlZiBNUF9ERUJVRwotCi0jaWZkZWYgTVBfREVCVUcKLSNkZWZpbmUgRFBSSU5USyh4Li4uKSAgIHByaW50ayh4KQotI2Vsc2UKLSNkZWZpbmUgRFBSSU5USyh4Li4uKSAgIGRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWZkZWYgTVBfREVCVUcKLSNkZWZpbmUgREVCVUdfQVVUT0NPTkYoZm10Li4uKSAgcHJpbnRrKGZtdCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHX0FVVE9DT05GKGZtdC4uLikgIGRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWZkZWYgTVBfREVCVUcKLSNkZWZpbmUgREVCVUdfSU5UUihmbXQuLi4pICBwcmludGsoZm10KQotI2Vsc2UKLSNkZWZpbmUgREVCVUdfSU5UUihmbXQuLi4pICBkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19pMzg2X18pICYmIGRlZmluZWQoQ09ORklHX000ODYpCi0jZGVmaW5lIFNFUklBTF9JTkxJTkUKLSNlbmRpZgotI2lmZGVmIFNFUklBTF9JTkxJTkUKLSNkZWZpbmUgX0lOTElORV8gaW5saW5lCi0jZWxzZQotI2RlZmluZSBfSU5MSU5FXwotI2VuZGlmCi0KLSNkZWZpbmUgVFlQRV9QT0xMCTEKLSNkZWZpbmUgVFlQRV9JTlRFUlJVUFQJMgotCi0KLXN0cnVjdCBtcF9kZXZpY2VfdCB7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0ICBkZXZpY2VfaWQ7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICByZXZpc2lvbjsKLSAgICAgICAgY2hhciAgICAgICAgICAgICpuYW1lOwotICAgICAgICB1bnNpZ25lZCBsb25nICAgdWFydF9hY2Nlc3NfYWRkcjsKLSAgICAgICAgdW5zaWduZWQgbG9uZyAgIG9wdGlvbl9yZWdfYWRkcjsKLSAgICAgICAgdW5zaWduZWQgbG9uZyAgIHJlc2VydmVkX2FkZHJbNF07Ci0gICAgICAgIGludCAgICAgICAgICAgICBpcnE7Ci0gICAgICAgIGludCAgICAgICAgICAgICBucl9wb3J0czsKLSAgICAgICAgaW50ICAgICAgICAgICAgIHBvbGxfdHlwZTsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IG1wcGNpYnJkIHsKLSAgICAgICAgY2hhciAgICAgICAgICAgICpuYW1lOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCAgdmVuZG9yX2lkOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCAgZGV2aWNlX2lkOwotfSBtcHBjaWJyZF90OwotCi1zdGF0aWMgbXBwY2licmRfdCBtcF9wY2lib2FyZHNbXSA9IHsKLQotICAgICAgICB7ICJNdWx0aS0xIFBDSSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJX0RFVklDRV9JRF9NUDF9ICwKLSAgICAgICAgeyAiTXVsdGktMiBQQ0kiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSV9ERVZJQ0VfSURfTVAyfSAsCi0gICAgICAgIHsgIk11bHRpLTQgUENJIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lfREVWSUNFX0lEX01QNH0gLAotICAgICAgICB7ICJNdWx0aS00IFBDSSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJX0RFVklDRV9JRF9NUDRBfSAsCi0gICAgICAgIHsgIk11bHRpLTYgUENJIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lfREVWSUNFX0lEX01QNn0gLAotICAgICAgICB7ICJNdWx0aS02IFBDSSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJX0RFVklDRV9JRF9NUDZBfSAsCi0gICAgICAgIHsgIk11bHRpLTggUENJIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lfREVWSUNFX0lEX01QOH0gLAotICAgICAgICB7ICJNdWx0aS0zMiBQQ0kiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSV9ERVZJQ0VfSURfTVAzMn0gLAotCi0gICAgICAgIHsgIk11bHRpLTFQIFBDSSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJX0RFVklDRV9JRF9NUDFQfSAsCi0gICAgICAgIHsgIk11bHRpLTJTMVAgUENJIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lfREVWSUNFX0lEX01QMlMxUH0gLAotCi0gICAgICAgIHsgIk11bHRpLTQoR1QpIFBDSSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJX0RFVklDRV9JRF9HVF9NUDR9ICwKLSAgICAgICAgeyAiTXVsdGktNChHVCkgUENJIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lfREVWSUNFX0lEX0dUX01QNEF9ICwKLSAgICAgICAgeyAiTXVsdGktNihHVCkgUENJIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lfREVWSUNFX0lEX0dUX01QNn0gLAotICAgICAgICB7ICJNdWx0aS02KEdUKSBQQ0kiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSV9ERVZJQ0VfSURfR1RfTVA2QX0gLAotICAgICAgICB7ICJNdWx0aS04KEdUKSBQQ0kiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSV9ERVZJQ0VfSURfR1RfTVA4fSAsCi0gICAgICAgIHsgIk11bHRpLTMyKEdUKSBQQ0kiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSV9ERVZJQ0VfSURfR1RfTVAzMn0gLAotCi0gICAgICAgIHsgIk11bHRpLTEgUENJZSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJRV9ERVZJQ0VfSURfTVAxfSAsCi0gICAgICAgIHsgIk11bHRpLTIgUENJZSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJRV9ERVZJQ0VfSURfTVAyfSAsCi0gICAgICAgIHsgIk11bHRpLTQgUENJZSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJRV9ERVZJQ0VfSURfTVA0fSAsCi0gICAgICAgIHsgIk11bHRpLTggUENJZSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJRV9ERVZJQ0VfSURfTVA4fSAsCi0gICAgICAgIHsgIk11bHRpLTMyIFBDSWUiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSUVfREVWSUNFX0lEX01QMzJ9ICwKLQotICAgICAgICB7ICJNdWx0aS0xIFBDSWUgRSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJRV9ERVZJQ0VfSURfTVAxRX0gLAotICAgICAgICB7ICJNdWx0aS0yIFBDSWUgRSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJRV9ERVZJQ0VfSURfTVAyRX0gLAotICAgICAgICB7ICJNdWx0aS0yIFBDSWUgQiIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJRV9ERVZJQ0VfSURfTVAyQn0gLAotICAgICAgICB7ICJNdWx0aS00IFBDSWUgQiIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJRV9ERVZJQ0VfSURfTVA0Qn0gLAotICAgICAgICB7ICJNdWx0aS04IFBDSWUgQiIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJRV9ERVZJQ0VfSURfTVA4Qn0gLAotCi0gICAgICAgIHsgIk11bHRpLTEoR1QpIFBDSWUiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSUVfREVWSUNFX0lEX0dUX01QMX0gLAotICAgICAgICB7ICJNdWx0aS0yKEdUKSBQQ0llIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lFX0RFVklDRV9JRF9HVF9NUDJ9ICwKLSAgICAgICAgeyAiTXVsdGktNChHVCkgUENJZSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJRV9ERVZJQ0VfSURfR1RfTVA0fSAsCi0gICAgICAgIHsgIk11bHRpLTgoR1QpIFBDSWUiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSUVfREVWSUNFX0lEX0dUX01QOH0gLAotICAgICAgICB7ICJNdWx0aS0zMihHVCkgUENJZSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJRV9ERVZJQ0VfSURfR1RfTVAzMn0gLAotCi0gICAgICAgIHsgIk11bHRpLTRNIFBDSSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJX0RFVklDRV9JRF9NUDRNfSAsCi19OwotCi1zdHJ1Y3QgbXBfcG9ydCB7Ci0gICAgICAgIHN0cnVjdCBzYl91YXJ0X3BvcnQgcG9ydDsKLQotICAgICAgICBzdHJ1Y3QgdGltZXJfbGlzdCAgIHRpbWVyOyAgICAgIC8qICJubyBpcnEiIHRpbWVyICovCi0gICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgICAgbGlzdDsgICAgICAgLyogcG9ydHMgb24gdGhpcyBJUlEgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICBjYXBhYmlsaXRpZXM7ICAgLyogcG9ydCBjYXBhYmlsaXRpZXMgKi8KLSAgICAgICAgdW5zaWduZWQgc2hvcnQgICAgICByZXY7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgYWNyOwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgIGllcjsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICBsY3I7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgbWNyOwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgIG1jcl9tYXNrOyAgIC8qIG1hc2sgb2YgdXNlciBiaXRzICovCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgbWNyX2ZvcmNlOyAgLyogbWFzayBvZiBmb3JjZWQgYml0cyAqLwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgIGxzcl9icmVha19mbGFnOwotCi0gICAgICAgIHZvaWQgICAgICAgICAgICAoKnBtKShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN0YXRlLCB1bnNpZ25lZCBpbnQgb2xkKTsKLSAgICAgICAgc3RydWN0IG1wX2RldmljZV90ICpkZXZpY2U7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgICBpbnRlcmZhY2VfY29uZmlnX2FkZHI7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgICBvcHRpb25fYmFzZV9hZGRyOwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgaW50ZXJmYWNlOwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgcG9sbF90eXBlOwotfTsKLQotc3RydWN0IGlycV9pbmZvIHsKLSAgICAgICAgc3BpbmxvY2tfdCAgICAgIGxvY2s7Ci0gICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgICAgKmhlYWQ7Ci19OwotCi1zdHJ1Y3Qgc2IxMDV4X3VhcnRfY29uZmlnIHsKLQljaGFyICAgICpuYW1lOwotCWludCAgICAgZGZsX3htaXRfZmlmb19zaXplOwotCWludCAgICAgZmxhZ3M7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNiMTA1eF91YXJ0X2NvbmZpZyB1YXJ0X2NvbmZpZ1tdID0gewotICAgICAgICB7ICJ1bmtub3duIiwgICAgMSwgIDAgfSwKLSAgICAgICAgeyAiMTY1NTBBIiwgMTYsIFVBUlRfQ0xFQVJfRklGTyB8IFVBUlRfVVNFX0ZJRk8gfSwKLSAgICAgICAgeyAiU0IxNkMxMDUwIiwgICAgMTI4LCAgICBVQVJUX0NMRUFSX0ZJRk8gfCBVQVJUX1VTRV9GSUZPIHwgVUFSVF9TVEFSVEVDSCB9LAotICAgICAgICB7ICJTQjE2QzEwNTBBIiwgICAgMTI4LCAgICBVQVJUX0NMRUFSX0ZJRk8gfCBVQVJUX1VTRV9GSUZPIHwgVUFSVF9TVEFSVEVDSCB9LAotfTsKLQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYjEwNXgvc2Jfc2VyX2NvcmUuaCBiL2RyaXZlcnMvc3RhZ2luZy9zYjEwNXgvc2Jfc2VyX2NvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmYjk5MS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2IxMDV4L3NiX3Nlcl9jb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLQotI2RlZmluZSBVQVJUX0NPTkZJR19UWVBFCSgxIDw8IDApCi0jZGVmaW5lIFVBUlRfQ09ORklHX0lSUQkJKDEgPDwgMSkKLSNkZWZpbmUgVVBJT19QT1JUCQkoMCkKLSNkZWZpbmUgVVBJT19IVUI2CQkoMSkKLSNkZWZpbmUgVVBJT19NRU0JCSgyKQotI2RlZmluZSBVUElPX01FTTMyCQkoMykKLSNkZWZpbmUgVVBJT19BVQkJCSg0KQkJCS8qIEF1MXgwMCB0eXBlIElPICovCi0jZGVmaW5lIFVQSU9fVFNJCQkoNSkJCQkvKiBUc2kxMDgvMTA5IHR5cGUgSU8gKi8KLSNkZWZpbmUgVVBGX0ZPVVJQT1JUCQkoMSA8PCAxKQotI2RlZmluZSBVUEZfU0FLCQkJKDEgPDwgMikKLSNkZWZpbmUgVVBGX1NQRF9NQVNLCQkoMHgxMDMwKQotI2RlZmluZSBVUEZfU1BEX0hJCQkoMHgwMDEwKQotI2RlZmluZSBVUEZfU1BEX1ZISQkJKDB4MDAyMCkKLSNkZWZpbmUgVVBGX1NQRF9DVVNUCQkoMHgwMDMwKQotI2RlZmluZSBVUEZfU1BEX1NISQkJKDB4MTAwMCkKLSNkZWZpbmUgVVBGX1NQRF9XQVJQCQkoMHgxMDEwKQotI2RlZmluZSBVUEZfU0tJUF9URVNUCQkoMSA8PCA2KQotI2RlZmluZSBVUEZfQVVUT19JUlEJCSgxIDw8IDcpCi0jZGVmaW5lIFVQRl9IQVJEUFBTX0NECQkoMSA8PCAxMSkKLSNkZWZpbmUgVVBGX0xPV19MQVRFTkNZCQkoMSA8PCAxMykKLSNkZWZpbmUgVVBGX0JVR0dZX1VBUlQJCSgxIDw8IDE0KQotI2RlZmluZSBVUEZfTUFHSUNfTVVMVElQTElFUgkoMSA8PCAxNikKLSNkZWZpbmUgVVBGX0NPTlNfRkxPVwkJKDEgPDwgMjMpCi0jZGVmaW5lIFVQRl9TSEFSRV9JUlEJCSgxIDw8IDI0KQotI2RlZmluZSBVUEZfQk9PVF9BVVRPQ09ORgkoMSA8PCAyOCkKLSNkZWZpbmUgVVBGX0RFQUQJCSgxIDw8IDMwKQotI2RlZmluZSBVUEZfSU9SRU1BUAkJKDEgPDwgMzEpCi0jZGVmaW5lIFVQRl9DSEFOR0VfTUFTSwkJKDB4MTdmZmYpCi0jZGVmaW5lIFVQRl9VU1JfTUFTSwkJKFVQRl9TUERfTUFTS3xVUEZfTE9XX0xBVEVOQ1kpCi0jZGVmaW5lIFVTRl9DTE9TSU5HX1dBSVRfSU5GCSgwKQotI2RlZmluZSBVU0ZfQ0xPU0lOR19XQUlUX05PTkUJKH4wVSkKLQotI2RlZmluZSBVQVJUX1hNSVRfU0laRQlQQUdFX1NJWkUKLQotI2RlZmluZSBVSUZfQ0hFQ0tfQ0QJCSgxIDw8IDI1KQotI2RlZmluZSBVSUZfQ1RTX0ZMT1cJCSgxIDw8IDI2KQotI2RlZmluZSBVSUZfTk9STUFMX0FDVElWRQkoMSA8PCAyOSkKLSNkZWZpbmUgVUlGX0lOSVRJQUxJWkVECQkoMSA8PCAzMSkKLSNkZWZpbmUgVUlGX1NVU1BFTkRFRAkJKDEgPDwgMzApCi0KLSNkZWZpbmUgV0FLRVVQX0NIQVJTCQkyNTYKLQotI2RlZmluZSB1YXJ0X2NpcmNfZW1wdHkoY2lyYykJCSgoY2lyYyktPmhlYWQgPT0gKGNpcmMpLT50YWlsKQotI2RlZmluZSB1YXJ0X2NpcmNfY2xlYXIoY2lyYykJCSgoY2lyYyktPmhlYWQgPSAoY2lyYyktPnRhaWwgPSAwKQotCi0jZGVmaW5lIHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKGNpcmMpCVwKLQkoQ0lSQ19DTlQoKGNpcmMpLT5oZWFkLCAoY2lyYyktPnRhaWwsIFVBUlRfWE1JVF9TSVpFKSkKLQotI2RlZmluZSB1YXJ0X2NpcmNfY2hhcnNfZnJlZShjaXJjKQlcCi0JKENJUkNfU1BBQ0UoKGNpcmMpLT5oZWFkLCAoY2lyYyktPnRhaWwsIFVBUlRfWE1JVF9TSVpFKSkKLQotI2RlZmluZSB1YXJ0X3R4X3N0b3BwZWQocG9ydCkJCVwKLQkoKHBvcnQpLT5pbmZvLT50dHktPnN0b3BwZWQgfHwgKHBvcnQpLT5pbmZvLT50dHktPmh3X3N0b3BwZWQpCi0KLSNkZWZpbmUgVUFSVF9FTkFCTEVfTVMocG9ydCxjZmxhZykJKChwb3J0KS0+ZmxhZ3MgJiBVUEZfSEFSRFBQU19DRCB8fCBcCi0JCQkJCSAoY2ZsYWcpICYgQ1JUU0NUUyB8fCBcCi0JCQkJCSAhKChjZmxhZykgJiBDTE9DQUwpKQotCi0KLXN0cnVjdCBzYl91YXJ0X3BvcnQ7Ci1zdHJ1Y3Qgc2JfdWFydF9pbmZvOwotc3RydWN0IHNlcmlhbF9zdHJ1Y3Q7Ci1zdHJ1Y3QgZGV2aWNlOwotCi1zdHJ1Y3Qgc2JfdWFydF9vcHMgewotCXVuc2lnbmVkIGludAkoKnR4X2VtcHR5KShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICopOwotCXZvaWQJCSgqc2V0X21jdHJsKShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICosIHVuc2lnbmVkIGludCBtY3RybCk7Ci0JdW5zaWduZWQgaW50CSgqZ2V0X21jdHJsKShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICopOwotCXZvaWQJCSgqc3RvcF90eCkoc3RydWN0IHNiX3VhcnRfcG9ydCAqKTsKLQl2b2lkCQkoKnN0YXJ0X3R4KShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICopOwotCXZvaWQJCSgqc2VuZF94Y2hhcikoc3RydWN0IHNiX3VhcnRfcG9ydCAqLCBjaGFyIGNoKTsKLQl2b2lkCQkoKnN0b3BfcngpKHN0cnVjdCBzYl91YXJ0X3BvcnQgKik7Ci0Jdm9pZAkJKCplbmFibGVfbXMpKHN0cnVjdCBzYl91YXJ0X3BvcnQgKik7Ci0Jdm9pZAkJKCpicmVha19jdGwpKHN0cnVjdCBzYl91YXJ0X3BvcnQgKiwgaW50IGN0bCk7Ci0JaW50CQkoKnN0YXJ0dXApKHN0cnVjdCBzYl91YXJ0X3BvcnQgKik7Ci0Jdm9pZAkJKCpzaHV0ZG93bikoc3RydWN0IHNiX3VhcnRfcG9ydCAqKTsKLQl2b2lkCQkoKnNldF90ZXJtaW9zKShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICosIHN0cnVjdCBNUF9URVJNSU9TICpuZXcsCi0JCQkJICAgICAgIHN0cnVjdCBNUF9URVJNSU9TICpvbGQpOwotCXZvaWQJCSgqcG0pKHN0cnVjdCBzYl91YXJ0X3BvcnQgKiwgdW5zaWduZWQgaW50IHN0YXRlLAotCQkJICAgICAgdW5zaWduZWQgaW50IG9sZHN0YXRlKTsKLQlpbnQJCSgqc2V0X3dha2UpKHN0cnVjdCBzYl91YXJ0X3BvcnQgKiwgdW5zaWduZWQgaW50IHN0YXRlKTsKLQotCWNvbnN0IGNoYXIgKigqdHlwZSkoc3RydWN0IHNiX3VhcnRfcG9ydCAqKTsKLQotCXZvaWQJCSgqcmVsZWFzZV9wb3J0KShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICopOwotCi0JaW50CQkoKnJlcXVlc3RfcG9ydCkoc3RydWN0IHNiX3VhcnRfcG9ydCAqKTsKLQl2b2lkCQkoKmNvbmZpZ19wb3J0KShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICosIGludCk7Ci0JaW50CQkoKnZlcmlmeV9wb3J0KShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICosIHN0cnVjdCBzZXJpYWxfc3RydWN0ICopOwotCWludAkJKCppb2N0bCkoc3RydWN0IHNiX3VhcnRfcG9ydCAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwotfTsKLQotCi1zdHJ1Y3Qgc2JfdWFydF9pY291bnQgewotCV9fdTMyCWN0czsKLQlfX3UzMglkc3I7Ci0JX191MzIJcm5nOwotCV9fdTMyCWRjZDsKLQlfX3UzMglyeDsKLQlfX3UzMgl0eDsKLQlfX3UzMglmcmFtZTsKLQlfX3UzMglvdmVycnVuOwotCV9fdTMyCXBhcml0eTsKLQlfX3UzMglicms7Ci0JX191MzIJYnVmX292ZXJydW47Ci19OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgIHVwZl90OwotCi1zdHJ1Y3Qgc2JfdWFydF9wb3J0IHsKLQlzcGlubG9ja190CQlsb2NrOwkJCS8qIHBvcnQgbG9jayAqLwotCXVuc2lnbmVkIGludAkJaW9iYXNlOwkJCS8qIGluL291dFtid2xdICovCi0JdW5zaWduZWQgY2hhciBfX2lvbWVtCSptZW1iYXNlOwkJLyogcmVhZC93cml0ZVtid2xdICovCi0JdW5zaWduZWQgaW50CQlpcnE7CQkJLyogaXJxIG51bWJlciAqLwotCXVuc2lnbmVkIGludAkJdWFydGNsazsJCS8qIGJhc2UgdWFydCBjbG9jayAqLwotCXVuc2lnbmVkIGludAkJZmlmb3NpemU7CQkvKiB0eCBmaWZvIHNpemUgKi8KLQl1bnNpZ25lZCBjaGFyCQl4X2NoYXI7CQkJLyogeG9uL3hvZmYgY2hhciAqLwotCXVuc2lnbmVkIGNoYXIJCXJlZ3NoaWZ0OwkJLyogcmVnIG9mZnNldCBzaGlmdCAqLwotCXVuc2lnbmVkIGNoYXIJCWlvdHlwZTsJCQkvKiBpbyBhY2Nlc3Mgc3R5bGUgKi8KLQl1bnNpZ25lZCBjaGFyCQl1bnVzZWQxOwotCi0KLQl1bnNpZ25lZCBpbnQJCXJlYWRfc3RhdHVzX21hc2s7CS8qIGRyaXZlciBzcGVjaWZpYyAqLwotCXVuc2lnbmVkIGludAkJaWdub3JlX3N0YXR1c19tYXNrOwkvKiBkcml2ZXIgc3BlY2lmaWMgKi8KLQlzdHJ1Y3Qgc2JfdWFydF9pbmZvCSppbmZvOwkJCS8qIHBvaW50ZXIgdG8gcGFyZW50IGluZm8gKi8KLQlzdHJ1Y3Qgc2JfdWFydF9pY291bnQJaWNvdW50OwkJCS8qIHN0YXRpc3RpY3MgKi8KLQotCXN0cnVjdCBjb25zb2xlCQkqY29uczsJCQkvKiBzdHJ1Y3QgY29uc29sZSwgaWYgYW55ICovCi0jaWZkZWYgQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEUKLQl1bnNpZ25lZCBsb25nCQlzeXNycTsJCQkvKiBzeXNycSB0aW1lb3V0ICovCi0jZW5kaWYKLQotCXVwZl90CQkJZmxhZ3M7Ci0KLQl1bnNpZ25lZCBpbnQJCW1jdHJsOwkJCS8qIGN1cnJlbnQgbW9kZW0gY3RybCBzZXR0aW5ncyAqLwotCXVuc2lnbmVkIGludAkJdGltZW91dDsJCS8qIGNoYXJhY3Rlci1iYXNlZCB0aW1lb3V0ICovCi0JdW5zaWduZWQgaW50CQl0eXBlOwkJCS8qIHBvcnQgdHlwZSAqLwotCWNvbnN0IHN0cnVjdCBzYl91YXJ0X29wcwkqb3BzOwotCXVuc2lnbmVkIGludAkJY3VzdG9tX2Rpdmlzb3I7Ci0JdW5zaWduZWQgaW50CQlsaW5lOwkJCS8qIHBvcnQgaW5kZXggKi8KLQl1bnNpZ25lZCBsb25nCQltYXBiYXNlOwkJLyogZm9yIGlvcmVtYXAgKi8KLQlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwkJCS8qIHBhcmVudCBkZXZpY2UgKi8KLQl1bnNpZ25lZCBjaGFyCQlodWI2OwkJCS8qIHRoaXMgc2hvdWxkIGJlIGluIHRoZSA4MjUwIGRyaXZlciAqLwotCXVuc2lnbmVkIGNoYXIJCXVudXNlZFszXTsKLX07Ci0KLSNkZWZpbmUgbWRtb2RlCQkJdW51c2VkWzJdCi0jZGVmaW5lIE1ETU9ERV9BRERSCQkweDEKLSNkZWZpbmUgTURNT0RFX0VOQUJMRQkweDIKLSNkZWZpbmUgTURNT0RFX0FVVE8JCTB4NAotI2RlZmluZSBNRE1PREVfQUREUlNFTkQJMHg4Ci0KLXN0cnVjdCBzYl91YXJ0X3N0YXRlIHsKLQl1bnNpZ25lZCBpbnQJCWNsb3NlX2RlbGF5OwkJLyogbXNlYyAqLwotCXVuc2lnbmVkIGludAkJY2xvc2luZ193YWl0OwkJLyogbXNlYyAqLwotCi0KLQlpbnQJCQljb3VudDsKLQlpbnQJCQlwbV9zdGF0ZTsKLQlzdHJ1Y3Qgc2JfdWFydF9pbmZvCSppbmZvOwotCXN0cnVjdCBzYl91YXJ0X3BvcnQJKnBvcnQ7Ci0KLQlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwotfTsKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgIHVpZl90OwotCi1zdHJ1Y3Qgc2JfdWFydF9pbmZvIHsKLQlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OwotCXN0cnVjdCBjaXJjX2J1ZgkJeG1pdDsKLQl1aWZfdAkJCWZsYWdzOwotCi0JaW50CQkJYmxvY2tlZF9vcGVuOwotCi0Jc3RydWN0IHRhc2tsZXRfc3RydWN0CXRsZXQ7Ci0KLQl3YWl0X3F1ZXVlX2hlYWRfdAlvcGVuX3dhaXQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJZGVsdGFfbXNyX3dhaXQ7Ci19OwotCi0KLXN0cnVjdCBtb2R1bGU7Ci1zdHJ1Y3QgdHR5X2RyaXZlcjsKLQotc3RydWN0IHVhcnRfZHJpdmVyIHsKLQlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7Ci0JY29uc3QgY2hhcgkJKmRyaXZlcl9uYW1lOwotCWNvbnN0IGNoYXIJCSpkZXZfbmFtZTsKLQlpbnQJCQkgbWFqb3I7Ci0JaW50CQkJIG1pbm9yOwotCWludAkJCSBucjsKLQlzdHJ1Y3QgY29uc29sZQkJKmNvbnM7Ci0KLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZQkqc3RhdGU7Ci0gICAgICAgIHN0cnVjdCB0dHlfZHJpdmVyICAgICAgICAgICAgICAgKnR0eV9kcml2ZXI7Ci19OwotCi12b2lkIHNiX3VhcnRfd3JpdGVfd2FrZXVwKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0gICAgc3RydWN0IHNiX3VhcnRfaW5mbyAqaW5mbyA9IHBvcnQtPmluZm87Ci0gICAgdGFza2xldF9zY2hlZHVsZSgmaW5mby0+dGxldCk7Ci19Ci0KLXZvaWQgc2JfdWFydF91cGRhdGVfdGltZW91dChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgY2ZsYWcsCi0JCQkgdW5zaWduZWQgaW50IGJhdWQpCi17Ci0gICAgdW5zaWduZWQgaW50IGJpdHM7Ci0KLSAgICBzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpCi0gICAgewotICAgICAgICBjYXNlIENTNToKLSAgICAgICAgICAgIGJpdHMgPSA3OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBDUzY6Ci0gICAgICAgICAgICBiaXRzID0gODsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQ1M3OgotICAgICAgICAgICAgYml0cyA9IDk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYml0cyA9IDEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKGNmbGFnICYgQ1NUT1BCKQotICAgIHsKLSAgICAgICAgYml0cysrOwotICAgIH0KLQotICAgIGlmIChjZmxhZyAmIFBBUkVOQikKLSAgICB7Ci0gICAgICAgIGJpdHMrKzsKLSAgICB9Ci0KLSAgICBiaXRzID0gYml0cyAqIHBvcnQtPmZpZm9zaXplOwotCi0gICAgcG9ydC0+dGltZW91dCA9IChIWiAqIGJpdHMpIC8gYmF1ZCArIEhaLzUwOwotfQotdW5zaWduZWQgaW50IHNiX3VhcnRfZ2V0X2JhdWRfcmF0ZShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3QgTVBfVEVSTUlPUyAqdGVybWlvcywKLQkJCQlzdHJ1Y3QgTVBfVEVSTUlPUyAqb2xkLCB1bnNpZ25lZCBpbnQgbWluLAotCQkJCXVuc2lnbmVkIGludCBtYXgpCi17Ci0gICAgICAgIHVuc2lnbmVkIGludCB0cnksIGJhdWQsIGFsdGJhdWQgPSAzODQwMDsKLSAgICAgICAgdXBmX3QgZmxhZ3MgPSBwb3J0LT5mbGFncyAmIFVQRl9TUERfTUFTSzsKLQotICAgICAgICBpZiAoZmxhZ3MgPT0gVVBGX1NQRF9ISSkKLSAgICAgICAgICAgICAgICBhbHRiYXVkID0gNTc2MDA7Ci0gICAgICAgIGlmIChmbGFncyA9PSBVUEZfU1BEX1ZISSkKLSAgICAgICAgICAgICAgICBhbHRiYXVkID0gMTE1MjAwOwotICAgICAgICBpZiAoZmxhZ3MgPT0gVVBGX1NQRF9TSEkpCi0gICAgICAgICAgICAgICAgYWx0YmF1ZCA9IDIzMDQwMDsKLSAgICAgICAgaWYgKGZsYWdzID09IFVQRl9TUERfV0FSUCkKLSAgICAgICAgICAgICAgICBhbHRiYXVkID0gNDYwODAwOwotCi0gICAgICAgIGZvciAodHJ5ID0gMDsgdHJ5IDwgMjsgdHJ5KyspIHsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAodGVybWlvcy0+Y19jZmxhZyAmIChDQkFVRCB8IENCQVVERVgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAJY2FzZSBCOTIxNjAwICAgIDogYmF1ZCA9IDkyMTYwMDsgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjQ2MDgwMCAgICA6IGJhdWQgPSA0NjA4MDA7ICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAljYXNlIEIyMzA0MDAgICAgOiBiYXVkID0gMjMwNDAwOyAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJY2FzZSBCMTE1MjAwICAgIDogYmF1ZCA9IDExNTIwMDsgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjU3NjAwICAgICA6IGJhdWQgPSA1NzYwMDsgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAljYXNlIEIzODQwMCAgICAgOiBiYXVkID0gMzg0MDA7ICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJY2FzZSBCMTkyMDAgICAgIDogYmF1ZCA9IDE5MjAwOyAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjk2MDAgICAgICA6IGJhdWQgPSA5NjAwOyAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAljYXNlIEI0ODAwICAgICAgOiBiYXVkID0gNDgwMDsgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJY2FzZSBCMjQwMCAgICAgIDogYmF1ZCA9IDI0MDA7ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjE4MDAgICAgICA6IGJhdWQgPSAxODAwOyAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAljYXNlIEIxMjAwICAgICAgOiBiYXVkID0gMTIwMDsgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJY2FzZSBCNjAwICAgICAgIDogYmF1ZCA9IDYwMDsgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjMwMCAgICAgICA6IGJhdWQgPSAzMDA7ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCMjAwICAgICAgIDogYmF1ZCA9IDIwMDsgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjE1MCAgICAgICA6IGJhdWQgPSAxNTA7ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAljYXNlIEIxMzQgICAgICAgOiBiYXVkID0gMTM0OyAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJY2FzZSBCMTEwICAgICAgIDogYmF1ZCA9IDExMDsgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjc1ICAgICAgICA6IGJhdWQgPSA3NTsgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAljYXNlIEI1MCAgICAgICAgOiBiYXVkID0gNTA7ICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJZGVmYXVsdCAgICAgICAgIDogYmF1ZCA9IDk2MDA7ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGJhdWQgPT0gMzg0MDApCi0gICAgICAgICAgICAgICAgICAgICAgICBiYXVkID0gYWx0YmF1ZDsKLQotICAgICAgICAgICAgICAgIGlmIChiYXVkID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBiYXVkID0gOTYwMDsKLQotICAgICAgICAgICAgICAgIGlmIChiYXVkID49IG1pbiAmJiBiYXVkIDw9IG1heCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXVkOwotCi0gICAgICAgICAgICAgICAgdGVybWlvcy0+Y19jZmxhZyAmPSB+Q0JBVUQ7Ci0gICAgICAgICAgICAgICAgaWYgKG9sZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGVybWlvcy0+Y19jZmxhZyB8PSBvbGQtPmNfY2ZsYWcgJiBDQkFVRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9sZCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0ZXJtaW9zLT5jX2NmbGFnIHw9IEI5NjAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci19Ci11bnNpZ25lZCBpbnQgc2JfdWFydF9nZXRfZGl2aXNvcihzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgYmF1ZCkKLXsKLSAgICAgICAgdW5zaWduZWQgaW50IHF1b3Q7Ci0KLSAgICAgICAgaWYgKGJhdWQgPT0gMzg0MDAgJiYgKHBvcnQtPmZsYWdzICYgVVBGX1NQRF9NQVNLKSA9PSBVUEZfU1BEX0NVU1QpCi0gICAgICAgICAgICAgICAgcXVvdCA9IHBvcnQtPmN1c3RvbV9kaXZpc29yOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcXVvdCA9IChwb3J0LT51YXJ0Y2xrICsgKDggKiBiYXVkKSkgLyAoMTYgKiBiYXVkKTsKLQotICAgICAgICByZXR1cm4gcXVvdDsKLX0KLQotCi0KLXN0YXRpYyBpbmxpbmUgaW50IHNiX3VhcnRfaGFuZGxlX2JyZWFrKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IHNiX3VhcnRfaW5mbyAqaW5mbyA9IHBvcnQtPmluZm87Ci0KLQlpZiAocG9ydC0+ZmxhZ3MgJiBVUEZfU0FLKQotCQlkb19TQUsoaW5mby0+dHR5KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNiX3VhcnRfaGFuZGxlX2RjZF9jaGFuZ2Uoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHN0YXR1cykKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9pbmZvICppbmZvID0gcG9ydC0+aW5mbzsKLQotCXBvcnQtPmljb3VudC5kY2QrKzsKLQotCWlmIChpbmZvLT5mbGFncyAmIFVJRl9DSEVDS19DRCkgewotCQlpZiAoc3RhdHVzKQotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOwotCQllbHNlIGlmIChpbmZvLT50dHkpCi0JCQl0dHlfaGFuZ3VwKGluZm8tPnR0eSk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2JfdWFydF9oYW5kbGVfY3RzX2NoYW5nZShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgc3RhdHVzKQotewotCXN0cnVjdCBzYl91YXJ0X2luZm8gKmluZm8gPSBwb3J0LT5pbmZvOwotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7Ci0KLQlwb3J0LT5pY291bnQuY3RzKys7Ci0KLQlpZiAoaW5mby0+ZmxhZ3MgJiBVSUZfQ1RTX0ZMT1cpIHsKLQkJaWYgKHR0eS0+aHdfc3RvcHBlZCkgewotCQkJaWYgKHN0YXR1cykgewotCQkJCXR0eS0+aHdfc3RvcHBlZCA9IDA7Ci0JCQkJcG9ydC0+b3BzLT5zdGFydF90eChwb3J0KTsKLQkJCQlzYl91YXJ0X3dyaXRlX3dha2V1cChwb3J0KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJdHR5LT5od19zdG9wcGVkID0gMTsKLQkJCQlwb3J0LT5vcHMtPnN0b3BfdHgocG9ydCk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzLzJ0M2UzLmggYi9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzLzJ0M2UzLmgKaW5kZXggY2NhZDA0OS4uZTdiZjcyMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvMnQzZTMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzLzJ0M2UzLmgKQEAgLTYxMywxMiArNjEzLDEyIEBACiAgKiBkZXNjcmlwdG9yIGxpc3QgYW5kIGRhdGEgYnVmZmVyCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCB7CitzdHJ1Y3QgdDNlM19yeF9kZXNjIHsKIAl1MzIgcmRlczA7CiAJdTMyIHJkZXMxOwogCXUzMiByZGVzMjsKIAl1MzIgcmRlczM7Ci19IHQzZTNfcnhfZGVzY190OworfTsKIAogI2RlZmluZSBTQkVfMlQzRTNfUlhfREVTQ19SSU5HX1NJWkUJCQk2NAogCkBAIC02NDgsMTIgKzY0OCwxMiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqLwogCi10eXBlZGVmIHN0cnVjdCB7CitzdHJ1Y3QgdDNlM190eF9kZXNjIHsKIAl1MzIgdGRlczA7CiAJdTMyIHRkZXMxOwogCXUzMiB0ZGVzMjsKIAl1MzIgdGRlczM7Ci19IHQzZTNfdHhfZGVzY190OworfTsKIAogI2RlZmluZSBTQkVfMlQzRTNfVFhfREVTQ19SSU5HX1NJWkUJCQkyNTYKIApAQCAtNzAxLDcgKzcwMSw3IEBACiAJfSBoOwogCiAJLyogc3RhdGlzdGljcyAqLwotCXQzZTNfc3RhdHNfdCBzOworCXN0cnVjdCB0M2UzX3N0YXRzIHM7CiAKIAkvKiBydW5uaW5nICovCiAJc3RydWN0IHsKQEAgLTcwOSw3ICs3MDksNyBAQAogCX0gcjsKIAogCS8qIHBhcmFtZXRlcnMgKi8KLQl0M2UzX3BhcmFtX3QgcDsKKwlzdHJ1Y3QgdDNlM19wYXJhbSBwOwogCiAJdTMyIGxpdV9yZWdzW1NCRV8yVDNFM19MSVVfUkVHX01BWF07CSAgIC8qIExJVSByZWdpc3RlcnMgKi8KIAl1MzIgZnJhbWVyX3JlZ3NbU0JFXzJUM0UzX0ZSQU1FUl9SRUdfTUFYXTsgLyogRnJhbWVyIHJlZ2lzdGVycyAqLwpAQCAtNzIzLDEyICs3MjMsMTIgQEAKIAkJdTMyIGludGVycnVwdF9lbmFibGVfbWFzazsKIAogCQkvKiByZWNlaXZlIGNoYWluL3JpbmcgKi8KLQkJdDNlM19yeF9kZXNjX3QgKnJ4X3Jpbmc7CisJCXN0cnVjdCB0M2UzX3J4X2Rlc2MgKnJ4X3Jpbmc7CiAJCXN0cnVjdCBza19idWZmICpyeF9kYXRhW1NCRV8yVDNFM19SWF9ERVNDX1JJTkdfU0laRV07CiAJCXUzMiByeF9yaW5nX2N1cnJlbnRfcmVhZDsKIAogCQkvKiB0cmFuc21pdCBjaGFpbi9yaW5nICovCi0JCXQzZTNfdHhfZGVzY190ICp0eF9yaW5nOworCQlzdHJ1Y3QgdDNlM190eF9kZXNjICp0eF9yaW5nOwogCQlzdHJ1Y3Qgc2tfYnVmZiAqdHhfZGF0YVtTQkVfMlQzRTNfVFhfREVTQ19SSU5HX1NJWkVdOwogCQl1MzIgdHhfcmluZ19jdXJyZW50X3JlYWQ7CiAJCXUzMiB0eF9yaW5nX2N1cnJlbnRfd3JpdGU7CkBAIC03NjAsOCArNzYwLDcgQEAKIHZvaWQgdDNlM19pZl91cChzdHJ1Y3QgY2hhbm5lbCAqKTsKIHZvaWQgdDNlM19pZl9kb3duKHN0cnVjdCBjaGFubmVsICopOwogaW50IHQzZTNfaWZfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXZvaWQgdDNlM19pZl9jb25maWcoc3RydWN0IGNoYW5uZWwgKiwgdTMyLCBjaGFyICosCi0JCSAgICB0M2UzX3Jlc3BfdCAqLCBpbnQgKik7Cit2b2lkIHQzZTNfaWZfY29uZmlnKHN0cnVjdCBjaGFubmVsICosIHUzMiwgY2hhciAqLCBzdHJ1Y3QgdDNlM19yZXNwICosIGludCAqKTsKIHZvaWQgdDNlM19zZXRfZnJhbWVfdHlwZShzdHJ1Y3QgY2hhbm5lbCAqLCB1MzIpOwogdTMyIHQzZTNfZWVwcm9tX3JlYWRfd29yZChzdHJ1Y3QgY2hhbm5lbCAqLCB1MzIpOwogdm9pZCB0M2UzX3JlYWRfY2FyZF9zZXJpYWxfbnVtYmVyKHN0cnVjdCBjaGFubmVsICopOwpAQCAtODM4LDcgKzgzNyw3IEBACiAJcmV0dXJuIHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gUENJX1NVQkRFVklDRV9JRF9TQkVfMlQzRTNfUDA7CiB9CiAKLSNkZWZpbmUgZGV2X3RvX3ByaXYoZGV2KSAoKihzdHJ1Y3QgY2hhbm5lbCAqKikgKChoZGxjX2RldmljZSopKGRldikgKyAxKSkKKyNkZWZpbmUgZGV2X3RvX3ByaXYoZGV2KSAoKihzdHJ1Y3QgY2hhbm5lbCAqKikgKChoZGxjX2RldmljZSAqKShkZXYpICsgMSkpCiAKIHN0YXRpYyBpbmxpbmUgdTMyIGRjX3JlYWQodW5zaWduZWQgbG9uZyBhZGRyLCB1MzIgcmVnKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9jdHJsLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL2N0cmwuYwppbmRleCBkMjgwYmNmLi5lMDk2NGFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL2N0cmwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL2N0cmwuYwpAQCAtMTY0LDEyICsxNjQsMTIgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHQzZTNfcG9ydF9nZXQoc3RydWN0IGNoYW5uZWwgKnNjLCB0M2UzX3BhcmFtX3QgKnBhcmFtKQorc3RhdGljIHZvaWQgdDNlM19wb3J0X2dldChzdHJ1Y3QgY2hhbm5lbCAqc2MsIHN0cnVjdCB0M2UzX3BhcmFtICpwYXJhbSkKIHsKLQltZW1jcHkocGFyYW0sICYoc2MtPnApLCBzaXplb2YodDNlM19wYXJhbV90KSk7CisJbWVtY3B5KHBhcmFtLCAmKHNjLT5wKSwgc2l6ZW9mKHN0cnVjdCB0M2UzX3BhcmFtKSk7CiB9CiAKLXN0YXRpYyB2b2lkIHQzZTNfcG9ydF9zZXQoc3RydWN0IGNoYW5uZWwgKnNjLCB0M2UzX3BhcmFtX3QgKnBhcmFtKQorc3RhdGljIHZvaWQgdDNlM19wb3J0X3NldChzdHJ1Y3QgY2hhbm5lbCAqc2MsIHN0cnVjdCB0M2UzX3BhcmFtICpwYXJhbSkKIHsKIAlpZiAocGFyYW0tPmZyYW1lX21vZGUgIT0gMHhmZikKIAkJY3BsZF9zZXRfZnJhbWVfbW9kZShzYywgcGFyYW0tPmZyYW1lX21vZGUpOwpAQCAtMjE2LDggKzIxNiw3IEBACiAJCWNwbGRfc2V0X3NjcmFtYmxlcihzYywgcGFyYW0tPnNjcmFtYmxlcik7CiB9CiAKLXN0YXRpYyB2b2lkIHQzZTNfcG9ydF9nZXRfc3RhdHMoc3RydWN0IGNoYW5uZWwgKnNjLAotCQkJIHQzZTNfc3RhdHNfdCAqc3RhdHMpCitzdGF0aWMgdm9pZCB0M2UzX3BvcnRfZ2V0X3N0YXRzKHN0cnVjdCBjaGFubmVsICpzYywgc3RydWN0IHQzZTNfc3RhdHMgKnN0YXRzKQogewogCXUzMiByZXN1bHQ7CiAKQEAgLTI3OSwxOCArMjc4LDE4IEBACiAJcmVzdWx0ICs9IGV4YXI3MjUwX3JlYWQoc2MsIFNCRV8yVDNFM19GUkFNRVJfUkVHX1BNT05fSE9MRElOR19SRUdJU1RFUik7CiAJc2MtPnMuQ1BfQklUICs9IHJlc3VsdDsKIAotCW1lbWNweShzdGF0cywgJihzYy0+cyksIHNpemVvZih0M2UzX3N0YXRzX3QpKTsKKwltZW1jcHkoc3RhdHMsICYoc2MtPnMpLCBzaXplb2Yoc3RydWN0IHQzZTNfc3RhdHMpKTsKIH0KIAogc3RhdGljIHZvaWQgdDNlM19wb3J0X2RlbF9zdGF0cyhzdHJ1Y3QgY2hhbm5lbCAqc2MpCiB7Ci0JbWVtc2V0KCYoc2MtPnMpLCAwLCBzaXplb2YodDNlM19zdGF0c190KSk7CisJbWVtc2V0KCYoc2MtPnMpLCAwLCBzaXplb2Yoc3RydWN0IHQzZTNfc3RhdHMpKTsKIH0KIAogdm9pZCB0M2UzX2lmX2NvbmZpZyhzdHJ1Y3QgY2hhbm5lbCAqc2MsIHUzMiBjbWQsIGNoYXIgKnNldCwKLQkJICAgIHQzZTNfcmVzcF90ICpyZXQsIGludCAqcmxlbikKKwkJICAgIHN0cnVjdCB0M2UzX3Jlc3AgKnJldCwgaW50ICpybGVuKQogewotCXQzZTNfcGFyYW1fdCAqcGFyYW0gPSAodDNlM19wYXJhbV90ICopc2V0OworCXN0cnVjdCB0M2UzX3BhcmFtICpwYXJhbSA9IChzdHJ1Y3QgdDNlM19wYXJhbSAqKXNldDsKIAl1MzIgKmRhdGEgPSAodTMyICopc2V0OwogCiAJLyogdHVybiBvZmYgYWxsIGludGVycnVwdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9jdHJsLmggYi9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL2N0cmwuaAppbmRleCBjMTFhNTg4Li40MWYxNDRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL2N0cmwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL2N0cmwuaApAQCAtODQsNyArODQsNyBAQAogI2RlZmluZSBOR19TQkVfMlQzRTNfTk9ERV9UWVBFICAic2JlMlQzRTMiCiAjZGVmaW5lIE5HX1NCRV8yVDNFM19DT09LSUUgICAgIDB4MDM4MDA4OTEKIAotdHlwZWRlZiBzdHJ1Y3QgdDNlM19wYXJhbSB7CitzdHJ1Y3QgdDNlM19wYXJhbSB7CiAJdV9pbnQ4X3QgZnJhbWVfbW9kZTsJCS8qIEZSQU1FX01PREVfKiAqLwogCXVfaW50OF90IGNyYzsJCQkvKiBDUkNfKiAqLwogCXVfaW50OF90IHJlY2VpdmVyX29uOwkJLyogT04vT0ZGICovCkBAIC0xMDIsOSArMTAyLDkgQEAKIAl1X2ludDhfdCBmcmFjdGlvbmFsX21vZGU7CS8qIEZSQUNUSU9OQUxfTU9ERV8qICovCiAJdV9pbnQ4X3QgYmFuZHdpZHRoX3N0YXJ0OwkvKiAwLTI1NSAqLwogCXVfaW50OF90IGJhbmR3aWR0aF9zdG9wOwkvKiAwLTI1NSAqLwotfSB0M2UzX3BhcmFtX3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCB0M2UzX3N0YXRzIHsKK3N0cnVjdCB0M2UzX3N0YXRzIHsKIAl1X2ludDY0X3QgaW5fYnl0ZXM7CiAJdTMyIGluX3BhY2tldHMsIGluX2Ryb3BwZWQ7CiAJdTMyIGluX2Vycm9ycywgaW5fZXJyb3JfZGVzYywgaW5fZXJyb3JfY29sbCwgaW5fZXJyb3JfZHJpYiwKQEAgLTExNywxNSArMTE3LDE1IEBACiAJdV9pbnQ4X3QgTE9DLCBMT0YsIE9PRiwgTE9TLCBBSVMsIEZFUkYsIElETEUsIEFJQywgRkVBQzsKIAl1X2ludDE2X3QgRkVCRV9jb2RlOwogCXUzMiBMQ1YsIEZSQU1JTkdfQklULCBQQVJJVFlfRVJST1IsIEZFQkVfY291bnQsIENQX0JJVDsKLX0gdDNlM19zdGF0c190OworfTsKIAogCi10eXBlZGVmIHN0cnVjdCB0M2UzX3Jlc3Ageworc3RydWN0IHQzZTNfcmVzcCB7CiAJdW5pb24gewotCQl0M2UzX3BhcmFtX3QgcGFyYW07Ci0JCXQzZTNfc3RhdHNfdCBzdGF0czsKKwkJc3RydWN0IHQzZTNfcGFyYW0gcGFyYW07CisJCXN0cnVjdCB0M2UzX3N0YXRzIHN0YXRzOwogCQl1MzIgZGF0YTsKIAl9IHU7Ci19IHQzZTNfcmVzcF90OworfTsKIAogI2VuZGlmIC8qIENUUkxfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9kYy5jIGIvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9kYy5jCmluZGV4IGYyMDdiOWUuLjAyNTEwZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvZGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL2RjLmMKQEAgLTMxNiwxMyArMzE2LDEzIEBACiAKIAlpZiAoc2MtPmV0aGVyLnJ4X3JpbmcgPT0gTlVMTCkKIAkJc2MtPmV0aGVyLnJ4X3JpbmcgPSBrY2FsbG9jKFNCRV8yVDNFM19SWF9ERVNDX1JJTkdfU0laRSwKLQkJCQkJICAgIHNpemVvZih0M2UzX3J4X2Rlc2NfdCksIEdGUF9LRVJORUwpOworCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCB0M2UzX3J4X2Rlc2MpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc2MtPmV0aGVyLnJ4X3JpbmcgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAoc2MtPmV0aGVyLnR4X3JpbmcgPT0gTlVMTCkKIAkJc2MtPmV0aGVyLnR4X3JpbmcgPSBrY2FsbG9jKFNCRV8yVDNFM19UWF9ERVNDX1JJTkdfU0laRSwKLQkJCQkJICAgIHNpemVvZih0M2UzX3R4X2Rlc2NfdCksIEdGUF9LRVJORUwpOworCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCB0M2UzX3R4X2Rlc2MpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc2MtPmV0aGVyLnR4X3JpbmcgPT0gTlVMTCkgewogCQlrZnJlZShzYy0+ZXRoZXIucnhfcmluZyk7CiAJCXNjLT5ldGhlci5yeF9yaW5nID0gTlVMTDsKQEAgLTMzOSw3ICszMzksOCBAQAogCQkJU0JFXzJUM0UzX1JYX0RFU0NfU0VDT05EX0FERFJFU1NfQ0hBSU5FRCB8IFNCRV8yVDNFM19NVFU7CiAKIAkJaWYgKHNjLT5ldGhlci5yeF9kYXRhW2ldID09IE5VTEwpIHsKLQkJCWlmICghKG0gPSBkZXZfYWxsb2Nfc2tiKE1DTEJZVEVTKSkpIHsKKwkJCW0gPSBkZXZfYWxsb2Nfc2tiKE1DTEJZVEVTKTsKKwkJCWlmICghbSkgewogCQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKIAkJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2MtPmV0aGVyLnJ4X2RhdGFbal0pOwogCQkJCQlzYy0+ZXRoZXIucnhfZGF0YVtqXSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL2ludHIuYyBiL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvaW50ci5jCmluZGV4IGVmZGViNzUuLjFiZjc0YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvaW50ci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvaW50ci5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIHsKIAl1MzIgY3VycmVudF9yZWFkOwogCXUzMiBlcnJvcl9tYXNrLCBlcnJvcjsKLQl0M2UzX3J4X2Rlc2NfdCAqY3VycmVudF9kZXNjOworCXN0cnVjdCB0M2UzX3J4X2Rlc2MgKmN1cnJlbnRfZGVzYzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbSwgKm0yOwogCXVuc2lnbmVkIHJjdl9sZW47CiAKQEAgLTI5Miw3ICsyOTIsNyBAQAogewogCXUzMiBjdXJyZW50X3JlYWQsIGN1cnJlbnRfd3JpdGU7CiAJdTMyIGxhc3Rfc2VnbWVudCwgZXJyb3I7Ci0JdDNlM190eF9kZXNjX3QgKmN1cnJlbnRfZGVzYzsKKwlzdHJ1Y3QgdDNlM190eF9kZXNjICpjdXJyZW50X2Rlc2M7CiAKIAlzcGluX2xvY2soJnNjLT5ldGhlci50eF9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9tYXBzLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL21hcHMuYwppbmRleCA3MDg0ZmJlLi5lNTQ5NDUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL21hcHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL21hcHMuYwpAQCAtMTMsOCArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgIjJ0M2UzLmgiCiAKLWNvbnN0IHUzMiBjcGxkX3JlZ19tYXBbXVsyXSA9Ci17Citjb25zdCB1MzIgY3BsZF9yZWdfbWFwW11bMl0gPSB7CiAJeyAweDAwMDAsIDB4MDA4MCB9LCAvKiAwIC0gUG9ydCBDb250cm9sIFJlZ2lzdGVyIEEgKFBDUkEpICovCiAJeyAweDAwMDQsIDB4MDA4NCB9LCAvKiAxIC0gUG9ydCBDb250cm9sIFJlZ2lzdGVyIEIgKFBDUkIpICovCiAJeyAweDAwMDgsIDB4MDA4OCB9LCAvKiAyIC0gTENWIENvdW50IFJlZ2lzdGVyIChQTENSKSAqLwpAQCAtMzUsOCArMzQsNyBAQAogCXsgMHgwMDcwLCAweDAwZjAgfSwgLyogMTcgLSBQb3J0IEJhbmR3aWR0aCBTdG9wIChQQldMKSAqLwogfTsKIAotY29uc3QgdTMyIGNwbGRfdmFsX21hcFtdWzJdID0KLXsKK2NvbnN0IHUzMiBjcGxkX3ZhbF9tYXBbXVsyXSA9IHsKIAl7IDB4MDEsIDB4MDIgfSwgLyogTElVMSAvIExJVTIgc2VsZWN0IGZvciBTZXJpYWwgQ2hpcCBTZWxlY3QgKi8KIAl7IDB4MDQsIDB4MDggfSwgLyogREFDMSAvIERBQzIgc2VsZWN0IGZvciBTZXJpYWwgQ2hpcCBTZWxlY3QgKi8KIAl7IDB4MDAsIDB4MDQgfSwgLyogTE9PUDEgLyBMT09QMiAtIHNlbGVjdCBvZiBsb29wIHRpbWluZyBzb3VyY2UgKi8KQEAgLTk0LDggKzkyLDcgQEAKIAkweDgxICAvKiA0NyAtIExJTkVfSU5URVJGQUNFX1NDQU4gKi8KIH07CiAKLWNvbnN0IHUzMiB0M2UzX2xpdV9yZWdfbWFwW10gPQoteworY29uc3QgdTMyIHQzZTNfbGl1X3JlZ19tYXBbXSA9IHsKIAkweDAwLCAvKiBSRUcwICovCiAJMHgwMSwgLyogUkVHMSAqLwogCTB4MDIsIC8qIFJFRzIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL21vZHVsZS5jCmluZGV4IDBlMzJiZTUuLmE2ZjkzYTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL21vZHVsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvbW9kdWxlLmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogCXN0cnVjdCBjaGFubmVsICpjaGFubmVsMCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgY2FyZCAqY2FyZCA9IGNoYW5uZWwwLT5jYXJkOwogCi0JZGVsX3RpbWVyKCZjYXJkLT50aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmNhcmQtPnRpbWVyKTsKIAlpZiAoaGFzX3R3b19wb3J0cyhjaGFubmVsMC0+cGRldikpIHsKIAkJdDNlM19yZW1vdmVfY2hhbm5lbCgmY2FyZC0+Y2hhbm5lbHNbMV0pOwogCQlwY2lfZGV2X3B1dChjYXJkLT5jaGFubmVsc1sxXS5wZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvbmV0ZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL25ldGRldi5jCmluZGV4IDFmNTA4OGIuLmZlNmM5NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9uZXRkZXYuYwpAQCAtMjUsOCArMjUsOCBAQAogewogCXN0cnVjdCBjaGFubmVsICpzYyA9IGRldl90b19wcml2KGRldik7CiAJaW50IGNtZF8ydDNlMywgbGVuLCBybGVuOwotCXQzZTNfcGFyYW1fdCBwYXJhbTsKLQl0M2UzX3Jlc3BfdCAgcmVzcDsKKwlzdHJ1Y3QgdDNlM19wYXJhbSBwYXJhbTsKKwlzdHJ1Y3QgdDNlM19yZXNwIHJlc3A7CiAJdm9pZCBfX3VzZXIgKmRhdGEgPSBpZnItPmlmcl9kYXRhICsgc2l6ZW9mKGNtZF8ydDNlMykgKyBzaXplb2YobGVuKTsKIAogCWlmIChjbWQgPT0gU0lPQ1dBTkRFVikKQEAgLTYxLDcgKzYxLDcgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbnN0YXRzID0gJmRldi0+c3RhdHM7CiAJc3RydWN0IGNoYW5uZWwgKnNjID0gZGV2X3RvX3ByaXYoZGV2KTsKLQl0M2UzX3N0YXRzX3QgKnN0YXRzID0gJnNjLT5zOworCXN0cnVjdCB0M2UzX3N0YXRzICpzdGF0cyA9ICZzYy0+czsKIAogCW1lbXNldChuc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOwogCW5zdGF0cy0+cnhfcGFja2V0cyA9IHN0YXRzLT5pbl9wYWNrZXRzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfY3J5cHRvLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9jcnlwdG8uYwppbmRleCA3ZmMyNjc1Li45NjU0ODVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9jcnlwdG8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9jcnlwdG8uYwpAQCAtMTEyLDcgKzExMiw3IEBACiAgKglvbiB3aGF0IG9wZXJhdGlvbiBpcyB0byBiZSBkb25lCiAgKi8KIHN0YXRpYyBpbnQgc2VwX3N1Ym1pdF93b3JrKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrX3F1ZXVlLAotCXZvaWQoKmZ1bmN0KSh2b2lkICopLAorCXZvaWQgKCpmdW5jdCkodm9pZCAqKSwKIAl2b2lkICpkYXRhKQogewogCXN0cnVjdCBzZXBfd29ya19zdHJ1Y3QgKnNlcF93b3JrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfbWFpbi5jCmluZGV4IDEyMjYxNGMuLmUzMDEyMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9tYWluLmMKQEAgLTEyNjYsOSArMTI2Niw4IEBACiAJLyogQ2hlY2sgdGhlIG51bWJlciBvZiBwYWdlcyBsb2NrZWQgLSBpZiBub3QgYWxsIHRoZW4gZXhpdCB3aXRoIGVycm9yICovCiAJaWYgKHJlc3VsdCAhPSBudW1fcGFnZXMpIHsKIAkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAotCQkJIltQSUQlZF0gbm90IGFsbCBwYWdlcyBsb2NrZWQgYnkgZ2V0X3VzZXJfcGFnZXMsICIKLQkJCSJyZXN1bHQgMHglWCwgbnVtX3BhZ2VzIDB4JVhcbiIsCi0JCQkJY3VycmVudC0+cGlkLCByZXN1bHQsIG51bV9wYWdlcyk7CisJCQkiW1BJRCVkXSBub3QgYWxsIHBhZ2VzIGxvY2tlZCBieSBnZXRfdXNlcl9wYWdlcywgcmVzdWx0IDB4JVgsIG51bV9wYWdlcyAweCVYXG4iLAorCQkJY3VycmVudC0+cGlkLCByZXN1bHQsIG51bV9wYWdlcyk7CiAJCWVycm9yID0gLUVOT01FTTsKIAkJZ290byBlbmRfZnVuY3Rpb25fd2l0aF9lcnJvcjM7CiAJfQpAQCAtMTI5Myw5ICsxMjkyLDkgQEAKIAkJbGxpX2FycmF5W2NvdW50XS5ibG9ja19zaXplID0gUEFHRV9TSVpFOwogCiAJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAotCQkJIltQSUQlZF0gbGxpX2FycmF5WyV4XS5idXNfYWRkcmVzcyBpcyAlMDhseCwgIgotCQkJImxsaV9hcnJheVsleF0uYmxvY2tfc2l6ZSBpcyAoaGV4KSAleFxuIiwgY3VycmVudC0+cGlkLAotCQkJY291bnQsICh1bnNpZ25lZCBsb25nKWxsaV9hcnJheVtjb3VudF0uYnVzX2FkZHJlc3MsCisJCQkiW1BJRCVkXSBsbGlfYXJyYXlbJXhdLmJ1c19hZGRyZXNzIGlzICUwOGx4LCBsbGlfYXJyYXlbJXhdLmJsb2NrX3NpemUgaXMgKGhleCkgJXhcbiIsCisJCQljdXJyZW50LT5waWQsIGNvdW50LAorCQkJKHVuc2lnbmVkIGxvbmcpbGxpX2FycmF5W2NvdW50XS5idXNfYWRkcmVzcywKIAkJCWNvdW50LCBsbGlfYXJyYXlbY291bnRdLmJsb2NrX3NpemUpOwogCX0KIApAQCAtMTMxNCw4ICsxMzEzLDcgQEAKIAkJCSJbUElEJWRdIEFmdGVyIGNoZWNrIGlmIHBhZ2UgMCBoYXMgYWxsIGRhdGFcbiIsCiAJCQljdXJyZW50LT5waWQpOwogCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKLQkJCSJbUElEJWRdIGxsaV9hcnJheVswXS5idXNfYWRkcmVzcyBpcyAoaGV4KSAlMDhseCwgIgotCQkJImxsaV9hcnJheVswXS5ibG9ja19zaXplIGlzIChoZXgpICV4XG4iLAorCQkJIltQSUQlZF0gbGxpX2FycmF5WzBdLmJ1c19hZGRyZXNzIGlzIChoZXgpICUwOGx4LCBsbGlfYXJyYXlbMF0uYmxvY2tfc2l6ZSBpcyAoaGV4KSAleFxuIiwKIAkJCWN1cnJlbnQtPnBpZCwKIAkJCSh1bnNpZ25lZCBsb25nKWxsaV9hcnJheVswXS5idXNfYWRkcmVzcywKIAkJCWxsaV9hcnJheVswXS5ibG9ja19zaXplKTsKQEAgLTEzMzIsOCArMTMzMCw3IEBACiAJCQkiW1BJRCVkXSBBZnRlciBsYXN0IHBhZ2Ugc2l6ZSBhZGp1c3RtZW50XG4iLAogCQkJY3VycmVudC0+cGlkKTsKIAkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCi0JCQkiW1BJRCVkXSBsbGlfYXJyYXlbJXhdLmJ1c19hZGRyZXNzIGlzIChoZXgpICUwOGx4LCAiCi0JCQkibGxpX2FycmF5WyV4XS5ibG9ja19zaXplIGlzIChoZXgpICV4XG4iLAorCQkJIltQSUQlZF0gbGxpX2FycmF5WyV4XS5idXNfYWRkcmVzcyBpcyAoaGV4KSAlMDhseCwgbGxpX2FycmF5WyV4XS5ibG9ja19zaXplIGlzIChoZXgpICV4XG4iLAogCQkJY3VycmVudC0+cGlkLAogCQkJbnVtX3BhZ2VzIC0gMSwKIAkJCSh1bnNpZ25lZCBsb25nKWxsaV9hcnJheVtudW1fcGFnZXMgLSAxXS5idXNfYWRkcmVzcywKQEAgLTE0NDksOCArMTQ0Niw3IEBACiAJCXN0YXJ0X3BhZ2UgKz0gUEFHRV9TSVpFOwogCiAJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAotCQkJIltQSUQlZF0gbGxpX2FycmF5WyV4XS5idXNfYWRkcmVzcyBpcyAlMDhseCwgIgotCQkJImxsaV9hcnJheVsleF0uYmxvY2tfc2l6ZSBpcyAoaGV4KSAleFxuIiwKKwkJCSJbUElEJWRdIGxsaV9hcnJheVsleF0uYnVzX2FkZHJlc3MgaXMgJTA4bHgsIGxsaV9hcnJheVsleF0uYmxvY2tfc2l6ZSBpcyAoaGV4KSAleFxuIiwKIAkJCWN1cnJlbnQtPnBpZCwKIAkJCWNvdW50LCAodW5zaWduZWQgbG9uZylsbGlfYXJyYXlbY291bnRdLmJ1c19hZGRyZXNzLAogCQkJY291bnQsIGxsaV9hcnJheVtjb3VudF0uYmxvY2tfc2l6ZSk7CkBAIC0xNDY5LDggKzE0NjUsNyBAQAogCiAJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCiAJCSJbUElEJWRdIEFmdGVyIGNoZWNrIGlmIHBhZ2UgMCBoYXMgYWxsIGRhdGFcbiIKLQkJImxsaV9hcnJheVswXS5idXNfYWRkcmVzcyBpcyAoaGV4KSAlMDhseCwgIgotCQkibGxpX2FycmF5WzBdLmJsb2NrX3NpemUgaXMgKGhleCkgJXhcbiIsCisJCSJsbGlfYXJyYXlbMF0uYnVzX2FkZHJlc3MgaXMgKGhleCkgJTA4bHgsIGxsaV9hcnJheVswXS5ibG9ja19zaXplIGlzIChoZXgpICV4XG4iLAogCQljdXJyZW50LT5waWQsCiAJCSh1bnNpZ25lZCBsb25nKWxsaV9hcnJheVswXS5idXNfYWRkcmVzcywKIAkJbGxpX2FycmF5WzBdLmJsb2NrX3NpemUpOwpAQCAtMTQ4NCw4ICsxNDc5LDcgQEAKIAogCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKIAkJCSJbUElEJWRdIEFmdGVyIGxhc3QgcGFnZSBzaXplIGFkanVzdG1lbnRcbiIKLQkJCSJsbGlfYXJyYXlbJXhdLmJ1c19hZGRyZXNzIGlzIChoZXgpICUwOGx4LCAiCi0JCQkibGxpX2FycmF5WyV4XS5ibG9ja19zaXplIGlzIChoZXgpICV4XG4iLAorCQkJImxsaV9hcnJheVsleF0uYnVzX2FkZHJlc3MgaXMgKGhleCkgJTA4bHgsIGxsaV9hcnJheVsleF0uYmxvY2tfc2l6ZSBpcyAoaGV4KSAleFxuIiwKIAkJCWN1cnJlbnQtPnBpZCwgbnVtX3BhZ2VzIC0gMSwKIAkJCSh1bnNpZ25lZCBsb25nKWxsaV9hcnJheVtudW1fcGFnZXMgLSAxXS5idXNfYWRkcmVzcywKIAkJCW51bV9wYWdlcyAtIDEsCkBAIC0xNzQ1LDkgKzE3MzksOCBAQAogCiAJd2hpbGUgKCh1bnNpZ25lZCBsb25nKSBsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcyAhPSAweGZmZmZmZmZmKSB7CiAJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAotCQkJIltQSUQlZF0gbGxpIHRhYmxlICUwOGx4LCAiCi0JCQkidGFibGVfZGF0YV9zaXplIGlzIChoZXgpICVseFxuIiwKLQkJCQljdXJyZW50LT5waWQsIHRhYmxlX2NvdW50LCB0YWJsZV9kYXRhX3NpemUpOworCQkJIltQSUQlZF0gbGxpIHRhYmxlICUwOGx4LCB0YWJsZV9kYXRhX3NpemUgaXMgKGhleCkgJWx4XG4iLAorCQkJY3VycmVudC0+cGlkLCB0YWJsZV9jb3VudCwgdGFibGVfZGF0YV9zaXplKTsKIAkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCiAJCQkiW1BJRCVkXSBudW1fdGFibGVfZW50cmllcyBpcyAoaGV4KSAlbHhcbiIsCiAJCQkJY3VycmVudC0+cGlkLCBudW1fdGFibGVfZW50cmllcyk7CkBAIC0xNzYyLDggKzE3NTUsOCBAQAogCQkJCSh1bnNpZ25lZCBsb25nKSBsbGlfdGFibGVfcHRyKTsKIAogCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCi0JCQkJIltQSUQlZF0gcGh5cyBhZGRyZXNzIGlzICUwOGx4ICIKLQkJCQkiYmxvY2sgc2l6ZSBpcyAoaGV4KSAleFxuIiwgY3VycmVudC0+cGlkLAorCQkJCSJbUElEJWRdIHBoeXMgYWRkcmVzcyBpcyAlMDhseCBibG9jayBzaXplIGlzIChoZXgpICV4XG4iLAorCQkJCWN1cnJlbnQtPnBpZCwKIAkJCQkodW5zaWduZWQgbG9uZylsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcywKIAkJCQlsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplKTsKIAkJfQpAQCAtMTc3MiwxNCArMTc2NSwxMiBAQAogCQlsbGlfdGFibGVfcHRyLS07CiAKIAkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCi0JCQkiW1BJRCVkXSBwaHlzIGxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUgIgotCQkJImlzIChoZXgpICV4XG4iLAorCQkJIltQSUQlZF0gcGh5cyBsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplIGlzIChoZXgpICV4XG4iLAogCQkJY3VycmVudC0+cGlkLAogCQkJbGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSk7CiAKIAkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCi0JCQkiW1BJRCVkXSBwaHlzIGxsaV90YWJsZV9wdHItPnBoeXNpY2FsX2FkZHJlc3MgIgotCQkJImlzICUwOGx4XG4iLAorCQkJIltQSUQlZF0gcGh5cyBsbGlfdGFibGVfcHRyLT5waHlzaWNhbF9hZGRyZXNzIGlzICUwOGx4XG4iLAogCQkJY3VycmVudC0+cGlkLAogCQkJKHVuc2lnbmVkIGxvbmcpbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MpOwogCkBAIC0xNzg4LDEzICsxNzc5LDExIEBACiAJCW51bV90YWJsZV9lbnRyaWVzID0gKGxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUgPj4gMjQpICYgMHhmZjsKIAogCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKLQkJCSJbUElEJWRdIHBoeXMgdGFibGVfZGF0YV9zaXplIGlzICIKLQkJCSIoaGV4KSAlbHggbnVtX3RhYmxlX2VudHJpZXMgaXMiCi0JCQkiICVseCBidXNfYWRkcmVzcyBpcyVseFxuIiwKLQkJCQljdXJyZW50LT5waWQsCi0JCQkJdGFibGVfZGF0YV9zaXplLAotCQkJCW51bV90YWJsZV9lbnRyaWVzLAotCQkJCSh1bnNpZ25lZCBsb25nKWxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzKTsKKwkJCSJbUElEJWRdIHBoeXMgdGFibGVfZGF0YV9zaXplIGlzIChoZXgpICVseCBudW1fdGFibGVfZW50cmllcyBpcyAlbHggYnVzX2FkZHJlc3MgaXMlbHhcbiIsCisJCQljdXJyZW50LT5waWQsCisJCQl0YWJsZV9kYXRhX3NpemUsCisJCQludW1fdGFibGVfZW50cmllcywKKwkJCSh1bnNpZ25lZCBsb25nKWxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzKTsKIAogCQlpZiAoKHVuc2lnbmVkIGxvbmcpbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MgIT0gMHhmZmZmZmZmZikKIAkJCWxsaV90YWJsZV9wdHIgPSAoc3RydWN0IHNlcF9sbGlfZW50cnkgKikKQEAgLTIyNDQsMTQgKzIyMzMsMTIgQEAKIAkJCXRhYmxlX2RhdGFfc2l6ZSA9IG91dF90YWJsZV9kYXRhX3NpemU7CiAKIAkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCi0JCQkiW1BJRCVkXSBjb25zdHJ1Y3QgdGFibGVzIGZyb20gbGxpIgotCQkJIiBpbl90YWJsZV9kYXRhX3NpemUgaXMgKGhleCkgJXhcbiIsIGN1cnJlbnQtPnBpZCwKLQkJCWluX3RhYmxlX2RhdGFfc2l6ZSk7CisJCQkiW1BJRCVkXSBjb25zdHJ1Y3QgdGFibGVzIGZyb20gbGxpIGluX3RhYmxlX2RhdGFfc2l6ZSBpcyAoaGV4KSAleFxuIiwKKwkJCWN1cnJlbnQtPnBpZCwgaW5fdGFibGVfZGF0YV9zaXplKTsKIAogCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKLQkJCSJbUElEJWRdIGNvbnN0cnVjdCB0YWJsZXMgZnJvbSBsbGkiCi0JCQkib3V0X3RhYmxlX2RhdGFfc2l6ZSBpcyAoaGV4KSAleFxuIiwgY3VycmVudC0+cGlkLAotCQkJb3V0X3RhYmxlX2RhdGFfc2l6ZSk7CisJCQkiW1BJRCVkXSBjb25zdHJ1Y3QgdGFibGVzIGZyb20gbGxpIG91dF90YWJsZV9kYXRhX3NpemUgaXMgKGhleCkgJXhcbiIsCisJCQljdXJyZW50LT5waWQsIG91dF90YWJsZV9kYXRhX3NpemUpOwogCiAJCS8qIENvbnN0cnVjdCBpbnB1dCBsbGkgdGFibGUgKi8KIAkJc2VwX2J1aWxkX2xsaV90YWJsZShzZXAsICZsbGlfaW5fYXJyYXlbY3VycmVudF9pbl9lbnRyeV0sCkBAIC0yMzE2LDggKzIzMDMsNyBAQAogCQkJCWluZm9faW5fZW50cnlfcHRyLT5ibG9ja19zaXplKTsKIAogCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCi0JCQkJIltQSUQlZF0gb3V0cHV0IGxsaV90YWJsZV9vdXRfcHRyOiIKLQkJCQkiJTA4bHggICUwOHhcbiIsCisJCQkJIltQSUQlZF0gb3V0cHV0IGxsaV90YWJsZV9vdXRfcHRyOiAlMDhseCAgJTA4eFxuIiwKIAkJCQljdXJyZW50LT5waWQsCiAJCQkJKHVuc2lnbmVkIGxvbmcpaW5mb19vdXRfZW50cnlfcHRyLT5idXNfYWRkcmVzcywKIAkJCQlpbmZvX291dF9lbnRyeV9wdHItPmJsb2NrX3NpemUpOwpAQCAtMjQ0Niw4ICsyNDMyLDggQEAKIAkJCQlkbWFfY3R4KTsKIAkJaWYgKGVycm9yKSB7CiAJCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsCi0JCQkJIltQSUQlZF0gc2VwX2xvY2tfa2VybmVsX3BhZ2VzIGZvciBpbnB1dCAiCi0JCQkJInZpcnR1YWwgYnVmZmVyIGZhaWxlZFxuIiwgY3VycmVudC0+cGlkKTsKKwkJCQkiW1BJRCVkXSBzZXBfbG9ja19rZXJuZWxfcGFnZXMgZm9yIGlucHV0IHZpcnR1YWwgYnVmZmVyIGZhaWxlZFxuIiwKKwkJCQljdXJyZW50LT5waWQpOwogCiAJCQlnb3RvIGVuZF9mdW5jdGlvbjsKIAkJfQpAQCAtMjQ2MCw4ICsyNDQ2LDggQEAKIAogCQlpZiAoZXJyb3IpIHsKIAkJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwKLQkJCQkiW1BJRCVkXSBzZXBfbG9ja19rZXJuZWxfcGFnZXMgZm9yIG91dHB1dCAiCi0JCQkJInZpcnR1YWwgYnVmZmVyIGZhaWxlZFxuIiwgY3VycmVudC0+cGlkKTsKKwkJCQkiW1BJRCVkXSBzZXBfbG9ja19rZXJuZWxfcGFnZXMgZm9yIG91dHB1dCB2aXJ0dWFsIGJ1ZmZlciBmYWlsZWRcbiIsCisJCQkJY3VycmVudC0+cGlkKTsKIAogCQkJZ290byBlbmRfZnVuY3Rpb25fZnJlZV9sbGlfaW47CiAJCX0KQEAgLTI0NzYsOCArMjQ2Miw4IEBACiAJCQkJZG1hX2N0eCk7CiAJCWlmIChlcnJvcikgewogCQkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAotCQkJCSJbUElEJWRdIHNlcF9sb2NrX3VzZXJfcGFnZXMgZm9yIGlucHV0ICIKLQkJCQkidmlydHVhbCBidWZmZXIgZmFpbGVkXG4iLCBjdXJyZW50LT5waWQpOworCQkJCSJbUElEJWRdIHNlcF9sb2NrX3VzZXJfcGFnZXMgZm9yIGlucHV0IHZpcnR1YWwgYnVmZmVyIGZhaWxlZFxuIiwKKwkJCQljdXJyZW50LT5waWQpOwogCiAJCQlnb3RvIGVuZF9mdW5jdGlvbjsKIAkJfQpAQCAtMjQ5MSw4ICsyNDc3LDcgQEAKIAkJCQlTRVBfRFJJVkVSX09VVF9GTEFHLCBkbWFfY3R4KTsKIAkJCWlmIChlcnJvcikgewogCQkJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwKLQkJCQkJIltQSUQlZF0gc2VjdXJlIGRtYSB0YWJsZSBzZXR1cCAiCi0JCQkJCSIgZm9yIG91dHB1dCB2aXJ0dWFsIGJ1ZmZlciBmYWlsZWRcbiIsCisJCQkJCSJbUElEJWRdIHNlY3VyZSBkbWEgdGFibGUgc2V0dXAgZm9yIG91dHB1dCB2aXJ0dWFsIGJ1ZmZlciBmYWlsZWRcbiIsCiAJCQkJCWN1cnJlbnQtPnBpZCk7CiAKIAkJCQlnb3RvIGVuZF9mdW5jdGlvbl9mcmVlX2xsaV9pbjsKQEAgLTI1MTIsOCArMjQ5Nyw3IEBACiAKIAkJCWlmIChlcnJvcikgewogCQkJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwKLQkJCQkJIltQSUQlZF0gc2VwX2xvY2tfdXNlcl9wYWdlcyIKLQkJCQkJIiBmb3Igb3V0cHV0IHZpcnR1YWwgYnVmZmVyIGZhaWxlZFxuIiwKKwkJCQkJIltQSUQlZF0gc2VwX2xvY2tfdXNlcl9wYWdlcyBmb3Igb3V0cHV0IHZpcnR1YWwgYnVmZmVyIGZhaWxlZFxuIiwKIAkJCQkJY3VycmVudC0+cGlkKTsKIAogCQkJCWdvdG8gZW5kX2Z1bmN0aW9uX2ZyZWVfbGxpX2luOwpAQCAtMjgyNiw4ICsyODEwLDcgQEAKIAogCWlmIChlcnJvcikgewogCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsCi0JCQkicHJlcGFyZSBETUEgdGFibGUgY2FsbCBmYWlsZWQgIgotCQkJImZyb20gcHJlcGFyZSBEQ0IgY2FsbFxuIik7CisJCQkicHJlcGFyZSBETUEgdGFibGUgY2FsbCBmYWlsZWQgZnJvbSBwcmVwYXJlIERDQiBjYWxsXG4iKTsKIAkJZ290byBlbmRfZnVuY3Rpb25fZXJyb3I7CiAJfQogCkBAIC0yODg5LDcgKzI4NzIsOCBAQAogCQkgKiBHbyBvdmVyIGVhY2ggRENCIGFuZCBzZWUgaWYKIAkJICogdGFpbCBwb2ludGVyIG11c3QgYmUgdXBkYXRlZAogCQkgKi8KLQkJZm9yIChpID0gMDsgaSA8ICgqZG1hX2N0eCktPm5yX2RjYl9jcmVhdDsgaSsrLCBkY2JfdGFibGVfcHRyKyspIHsKKwkJZm9yIChpID0gMDsgaSA8ICgqZG1hX2N0eCktPm5yX2RjYl9jcmVhdDsKKwkJICAgICBpKyssIGRjYl90YWJsZV9wdHIrKykgewogCQkJaWYgKGRjYl90YWJsZV9wdHItPm91dF92cl90YWlsX3B0KSB7CiAJCQkJcHRfaG9sZCA9ICh1bnNpZ25lZCBsb25nKWRjYl90YWJsZV9wdHItPgogCQkJCQlvdXRfdnJfdGFpbF9wdDsKQEAgLTMwODksNiArMzA3Myw3IEBACiAJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAogCQkJIltQSUQlZF0gU0VQX0lPQ1BSRVBBUkVEQ0Igc3RhcnRcbiIsCiAJCQljdXJyZW50LT5waWQpOworCQkvKiBmYWxsLXRocm91Z2ggKi8KIAljYXNlIFNFUF9JT0NQUkVQQVJFRENCX1NFQ1VSRV9ETUE6CiAJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAogCQkJIltQSUQlZF0gU0VQX0lPQ1BSRVBBUkVEQ0JfU0VDVVJFX0RNQSBzdGFydFxuIiwKQEAgLTM3NjIsOCArMzc0Nyw3IEBACiAKIAlpZiAoYWN0dWFsX2NvdW50ICE9IGNvdW50X3VzZXIpIHsKIAkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAotCQkJICJbUElEJWRdIGluY29uc2lzdGVudCBtZXNzYWdlICIKLQkJCSAic2l6ZXMgMHglMDh6WCB2cyAweCUwOHpYXG4iLAorCQkJICJbUElEJWRdIGluY29uc2lzdGVudCBtZXNzYWdlIHNpemVzIDB4JTA4elggdnMgMHglMDh6WFxuIiwKIAkJCSBjdXJyZW50LT5waWQsIGFjdHVhbF9jb3VudCwgY291bnRfdXNlcik7CiAJCWVycm9yID0gLUVNU0dTSVpFOwogCQlnb3RvIGVuZF9mdW5jdGlvbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zZXJxdF91c2IyL3NlcnF0X3VzYjIuYyBiL2RyaXZlcnMvc3RhZ2luZy9zZXJxdF91c2IyL3NlcnF0X3VzYjIuYwppbmRleCBmMGZjYmY3Li4wMjY3ZGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2VycXRfdXNiMi9zZXJxdF91c2IyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NlcnF0X3VzYjIvc2VycXRfdXNiMi5jCkBAIC03MjQsNyArNzI0LDcgQEAKIAkJZ290byBzdGFydHVwX2Vycm9yOwogCX0KIAotCXN3aXRjaCAoc2VyaWFsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSB7CisJc3dpdGNoIChsZTE2X3RvX2NwdShzZXJpYWwtPmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKSB7CiAJY2FzZSBRVUFURUNIX0RTVTEwMDoKIAljYXNlIFFVQVRFQ0hfUVNVMTAwOgogCWNhc2UgUVVBVEVDSF9FU1UxMDBBOgpAQCAtNzYyLDcgKzc2Miw5IEBACiAKIAl9CiAKLQlzdGF0dXMgPSBib3hfc2V0X3ByZWJ1ZmZlcl9sZXZlbChzZXJpYWwpOwkvKiBzZXRzIHRvIGRlZmF1bHQgdmFsdWUgKi8KKwlzdGF0dXMgPSBib3hfc2V0X3ByZWJ1ZmZlcl9sZXZlbChzZXJpYWwpOwkvKiBzZXRzIHRvCisJCQkJCQkJICogZGVmYXVsdCB2YWx1ZQorCQkJCQkJCSAqLwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWRldl9kYmcoZGV2LCAiYm94X3NldF9wcmVidWZmZXJfbGV2ZWwgZmFpbGVkXG4iKTsKIAkJZ290byBzdGFydHVwX2Vycm9yOwpAQCAtODg3LDcgKzg4OSw4IEBACiAJICAgIChTRVJJQUxfTVNSX0NUUyB8IFNFUklBTF9NU1JfRFNSIHwgU0VSSUFMX01TUl9SSSB8IFNFUklBTF9NU1JfQ0QpOwogCiAJLyogU2V0IEJhdWQgcmF0ZSB0byBkZWZhdWx0IGFuZCB0dXJuIG9mZiAoZGVmYXVsdClmbG93IGNvbnRyb2wgaGVyZSAqLwotCXJlc3VsdCA9IHF0X3NldHVhcnQoc2VyaWFsLCBwb3J0LT5wb3J0X251bWJlciwgREVGQVVMVF9ESVZJU09SLCBERUZBVUxUX0xDUik7CisJcmVzdWx0ID0gcXRfc2V0dWFydChzZXJpYWwsIHBvcnQtPnBvcnRfbnVtYmVyLCBERUZBVUxUX0RJVklTT1IsCisJCQlERUZBVUxUX0xDUik7CiAJaWYgKHJlc3VsdCA8IDApIHsKIAkJZGV2X2RiZygmcG9ydC0+ZGV2LCAicXRfc2V0dWFydCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gcmVzdWx0OwpAQCAtMTAxNCwxMSArMTAxNywxMyBAQAogCS8qIENsb3NlIHVhcnQgY2hhbm5lbCAqLwogCXN0YXR1cyA9IHF0X2Nsb3NlX2NoYW5uZWwoc2VyaWFsLCBpbmRleCk7CiAJaWYgKHN0YXR1cyA8IDApCi0JCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gcXRfY2xvc2VfY2hhbm5lbCBmYWlsZWQuXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gcXRfY2xvc2VfY2hhbm5lbCBmYWlsZWQuXG4iLAorCQkJX19mdW5jX18pOwogCiAJcG9ydDAtPm9wZW5fcG9ydHMtLTsKIAotCWRldl9kYmcoJnBvcnQtPmRldiwgInF0X251bV9vcGVuX3BvcnRzIGluIGNsb3NlJWRcbiIsIHBvcnQwLT5vcGVuX3BvcnRzKTsKKwlkZXZfZGJnKCZwb3J0LT5kZXYsICJxdF9udW1fb3Blbl9wb3J0cyBpbiBjbG9zZSVkXG4iLAorCQlwb3J0MC0+b3Blbl9wb3J0cyk7CiAKIAlpZiAocG9ydDAtPm9wZW5fcG9ydHMgPT0gMCkgewogCQlpZiAoc2VyaWFsLT5wb3J0WzBdLT5pbnRlcnJ1cHRfaW5fdXJiKSB7CkBAIC0xMjM1LDcgKzEyNDAsOCBAQAogCiAJLyogTm93IGRldGVybWluZSBmbG93IGNvbnRyb2wgKi8KIAlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7Ci0JCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gRW5hYmxpbmcgSFcgZmxvdyBjb250cm9sXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gRW5hYmxpbmcgSFcgZmxvdyBjb250cm9sXG4iLAorCQkJX19mdW5jX18pOwogCiAJCS8qIEVuYWJsZSBSVFMvQ1RTIGZsb3cgY29udHJvbCAqLwogCQlzdGF0dXMgPSBib3hfc2V0X2h3X2Zsb3dfY3RybChwb3J0LT5zZXJpYWwsIGluZGV4LCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zaWxpY29tL2JwX21vZC5oIGIvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnBfbW9kLmgKaW5kZXggODE1NGE3Yi4uODJiNDk2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnBfbW9kLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnBfbW9kLmgKQEAgLTQ5NywxMSArNDk3LDE5IEBACiAjZGVmaW5lIEJQQ1RMSV9TVEFUVVMgICAweDAwMDA4CS8qIERldmljZSBTdGF0dXMgLSBSTyAqLwogCiAvKiBIVyByZWxhdGVkICovCi0jZGVmaW5lIEJQQ1RMSV9DVFJMX0VYVF9TRFA2X0RBVEEgMHgwMDAwMDA0MAkvKiBWYWx1ZSBvZiBTVyBEZWZpbmVhYmxlIFBpbiA2ICovCi0jZGVmaW5lIEJQQ1RMSV9DVFJMX0VYVF9TRFA3X0RBVEEgMHgwMDAwMDA4MAkvKiBWYWx1ZSBvZiBTVyBEZWZpbmVhYmxlIFBpbiA3ICovCisjZGVmaW5lIEJQQ1RMSV9DVFJMX0VYVF9TRFA2X0RBVEEgMHgwMDAwMDA0MAkvKiBWYWx1ZSBvZiBTVworCQkJCQkJCQkJCSAgICAgKiBEZWZpbmVhYmxlIFBpbiA2CisJCQkJCQkJCQkJICAgICAqLworI2RlZmluZSBCUENUTElfQ1RSTF9FWFRfU0RQN19EQVRBIDB4MDAwMDAwODAJLyogVmFsdWUgb2YgU1cKKwkJCQkJCQkJCQkgICAgICogRGVmaW5lYWJsZSBQaW4gNworCQkJCQkJCQkJCSAgICAgKi8KICNkZWZpbmUgQlBDVExJX0NUUkxfU0RQMF9EQVRBICAgICAweDAwMDQwMDAwCS8qIFNXRFBJTiAwIHZhbHVlICovCi0jZGVmaW5lIEJQQ1RMSV9DVFJMX0VYVF9TRFA2X0RJUiAgMHgwMDAwMDQwMAkvKiBEaXJlY3Rpb24gb2YgU0RQNiAwPWluIDE9b3V0ICovCi0jZGVmaW5lIEJQQ1RMSV9DVFJMX0VYVF9TRFA3X0RJUiAgMHgwMDAwMDgwMAkvKiBEaXJlY3Rpb24gb2YgU0RQNyAwPWluIDE9b3V0ICovCisjZGVmaW5lIEJQQ1RMSV9DVFJMX0VYVF9TRFA2X0RJUiAgMHgwMDAwMDQwMAkvKiBEaXJlY3Rpb24gb2YgU0RQNgorCQkJCQkJCQkJCSAgICogMD1pbiAxPW91dAorCQkJCQkJCQkJCSAgICovCisjZGVmaW5lIEJQQ1RMSV9DVFJMX0VYVF9TRFA3X0RJUiAgMHgwMDAwMDgwMAkvKiBEaXJlY3Rpb24gb2YgU0RQNworCQkJCQkJCQkJCSAgICogMD1pbiAxPW91dAorCQkJCQkJCQkJCSAgICovCiAjZGVmaW5lIEJQQ1RMSV9DVFJMX1NEUDBfRElSICAgICAgMHgwMDQwMDAwMAkvKiBTRFAwIElucHV0IG9yIG91dHB1dCAqLwogI2RlZmluZSBCUENUTElfQ1RSTF9TV0RQSU4xICAgICAgIDB4MDAwODAwMDAKICNkZWZpbmUgQlBDVExJX0NUUkxfU0RQMV9ESVIgICAgICAweDAwODAwMDAwCkBAIC01NjUsNyArNTczLDkgQEAKICNkZWZpbmUgQlBDVExJX1NXRldfUEhZMF9TTSAgMHgwMgogI2RlZmluZSBCUENUTElfU1dGV19QSFkxX1NNICAweDA0CiAKLSNkZWZpbmUgQlBDVExJX1NXX0ZXX1NZTkMgIDB4MDVCNUMJLyogU29mdHdhcmUtRmlybXdhcmUgU3luY2hyb25pemF0aW9uIC0gUlcgKi8KKyNkZWZpbmUgQlBDVExJX1NXX0ZXX1NZTkMgIDB4MDVCNUMJLyogU29mdHdhcmUtRmlybXdhcmUKKwkJCQkJCQkJICAgICAqIFN5bmNocm9uaXphdGlvbiAtIFJXCisJCQkJCQkJCSAgICAgKi8KIAogI2RlZmluZSBCUENUTElfU1dTTSAgICAgIDB4MDVCNTAJLyogU1cgU2VtYXBob3JlICovCiAjZGVmaW5lIEJQQ1RMSV9GV1NNICAgICAgMHgwNUI1NAkvKiBGVyBTZW1hcGhvcmUgKi8KQEAgLTYyMyw3ICs2MzMsOCBAQAogLyojZGVmaW5lIEJQMTBHX01DTEtfREFUQV9PVVQ5ICAgICAgIEJQMTBHX0kyQ19DTEtfT1VUCiAjZGVmaW5lIEJQMTBHX01ESU9fREFUQV9PVVQ5ICAgICAgIEJQMTBHX0kyQ19EQVRBX09VVCovCiAKLQkJCQkgICAgICAgLyojZGVmaW5lIEJQMTBHX01DTEtfREFUQV9PVVQ5Ki8vKkJQMTBHX0kyQ19EQVRBX09VVCAqLworCQkJCSAgICAgICAvKiNkZWZpbmUgQlAxMEdfTUNMS19EQVRBX09VVDkqLworCQkJCQkvKkJQMTBHX0kyQ19EQVRBX09VVCAqLwogI2RlZmluZSBCUDEwR19NRElPX0RBVEFfT1VUOSAgICAgICAgICAgQlAxMEdfSTJDX0RBVEFfT1VUCS8qQlAxMEdfSTJDX0NMS19PVVQgKi8KIAogLyogVklBIEVPU0RQICEgKi8KQEAgLTY5OCw1ICs3MDksMyBAQAogCXJlYWRsKCh2b2lkICopKChhKS0+bWVtX21hcCkgKyBCUDEwR0JfIyNyZWcpKQogCiAjZW5kaWYKLQotaW50IGJwX3Byb2NfY3JlYXRlKHZvaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnBjdGxfbW9kLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2lsaWNvbS9icGN0bF9tb2QuYwppbmRleCAyMDMyNWY1Li42YjkzNjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2lsaWNvbS9icGN0bF9tb2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2lsaWNvbS9icGN0bF9tb2QuYwpAQCAtMTE3LDEyICsxMTcsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgYnBjdGxfZGV2ICpnZXRfc3RhdHVzX3BvcnRfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2Rldik7CiBzdGF0aWMgdm9pZCBpZl9zY2FuX2luaXQodm9pZCk7CiAKLWludCBieXBhc3NfcHJvY19jcmVhdGVfZGV2X3NkKHN0cnVjdCBicGN0bF9kZXYgKnBicF9kZXZpY2VfYmxvY2spOwotaW50IGJ5cGFzc19wcm9jX3JlbW92ZV9kZXZfc2Qoc3RydWN0IGJwY3RsX2RldiAqcGJwX2RldmljZV9ibG9jayk7Ci1pbnQgYnBfcHJvY19jcmVhdGUodm9pZCk7CitzdGF0aWMgaW50IGJ5cGFzc19wcm9jX2NyZWF0ZV9kZXZfc2Qoc3RydWN0IGJwY3RsX2RldiAqcGJwX2RldmljZV9ibG9jayk7CitzdGF0aWMgaW50IGJ5cGFzc19wcm9jX3JlbW92ZV9kZXZfc2Qoc3RydWN0IGJwY3RsX2RldiAqcGJwX2RldmljZV9ibG9jayk7CitzdGF0aWMgaW50IGJwX3Byb2NfY3JlYXRlKHZvaWQpOwogCi1pbnQgaXNfYnlwYXNzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpOwotaW50IGdldF9kZXZfaWR4X2JzZihpbnQgYnVzLCBpbnQgc2xvdCwgaW50IGZ1bmMpOworc3RhdGljIGludCBpc19ieXBhc3NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2Rldik7CitzdGF0aWMgaW50IGdldF9kZXZfaWR4X2JzZihpbnQgYnVzLCBpbnQgc2xvdCwgaW50IGZ1bmMpOwogCiBzdGF0aWMgaW50IGJwX2dldF9kZXZfaWR4X2JzZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmluZGV4KQogewpAQCAtMjYyLDcgKzI2Miw3IEBACiAJLm5vdGlmaWVyX2NhbGwgPSBicF9kZXZpY2VfZXZlbnQsCiB9OwogCi1pbnQgaXNfYnlwYXNzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpOworc3RhdGljIGludCBpc19ieXBhc3NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2Rldik7CiBpbnQgd2R0X3RpbWVfbGVmdChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KTsKIAogc3RhdGljIHZvaWQgd3JpdGVfcHVsc2Uoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwKQEAgLTE1MDIsNyArMTUwMiw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgc2VuZF9ieXBhc3NfY2xlYXJfcHVsc2Uoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgdW5zaWduZWQgaW50IHZhbHVlKQorc3RhdGljIHZvaWQgc2VuZF9ieXBhc3NfY2xlYXJfcHVsc2Uoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwKKwkJCQkgICAgdW5zaWduZWQgaW50IHZhbHVlKQogewogCXVpbnQzMl90IGN0cmxfZXh0ID0gMDsKIApAQCAtMTc1Nyw3ICsxNzU4LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBDTU5EX09OICAweDQgKDEwMCkqLwotaW50IGNtbmRfb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgY21uZF9vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSBCUF9OT1RfQ0FQOwogCkBAIC0xNzc0LDcgKzE3NzUsNyBAQAogfQogCiAvKiBDTU5EX09GRiAgMHgyICgxMCkqLwotaW50IGNtbmRfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGNtbmRfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IEJQX05PVF9DQVA7CiAKQEAgLTE3OTIsNyArMTc5Myw3IEBACiB9CiAKIC8qIEJZUEFTU19PTiAoMHhhKSovCi1pbnQgYnlwYXNzX29uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGJ5cGFzc19vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSBCUF9OT1RfQ0FQOwogCkBAIC0xODEzLDcgKzE4MTQsNyBAQAogfQogCiAvKiBCWVBBU1NfT0ZGICgweDggMTExKSovCi1pbnQgYnlwYXNzX29mZihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBieXBhc3Nfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IEJQX05PVF9DQVA7CiAKQEAgLTE4MzYsNyArMTgzNyw3IEBACiB9CiAKIC8qIFRBUF9PRkYgKDB4OSkqLwotaW50IHRhcF9vZmYoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgdGFwX29mZihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSBCUF9OT1RfQ0FQOwogCWlmICgocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFRBUF9DQVApCkBAIC0xODQ5LDcgKzE4NTAsNyBAQAogfQogCiAvKiBUQVBfT04gKDB4YikqLwotaW50IHRhcF9vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCB0YXBfb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gQlBfTk9UX0NBUDsKIAlpZiAoKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBUQVBfQ0FQKQpAQCAtMTg2Miw3ICsxODYzLDcgQEAKIH0KIAogLyogRElTQ19PRkYgKDB4OSkqLwotaW50IGRpc2Nfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRpc2Nfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IDA7CiAJaWYgKChwYnBjdGxfZGV2LT5icF9jYXBzICYgRElTQ19DQVApICYmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IDB4OCkpIHsKQEAgLTE4NzQsNyArMTg3NSw3IEBACiB9CiAKIC8qIERJU0NfT04gKDB4YikqLwotaW50IGRpc2Nfb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZGlzY19vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSAwOwogCWlmICgocGJwY3RsX2Rldi0+YnBfY2FwcyAmIERJU0NfQ0FQKSAmJiAocGJwY3RsX2Rldi0+YnBfZXh0X3ZlciA+PSAweDgpKSB7CkBAIC0xODg1LDU4ICsxODg2LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBESVNDX1BPUlRfT04gKi8KLWludCBkaXNjX3BvcnRfb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X207Ci0KLQlpZiAoKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSkgPT0gMSkKLQkJcGJwY3RsX2Rldl9tID0gcGJwY3RsX2RldjsKLQllbHNlCi0JCXBicGN0bF9kZXZfbSA9IGdldF9tYXN0ZXJfcG9ydF9mbihwYnBjdGxfZGV2KTsKLQlpZiAocGJwY3RsX2Rldl9tID09IE5VTEwpCi0JCXJldHVybiBCUF9OT1RfQ0FQOwotCi0JaWYgKHBicGN0bF9kZXZfbS0+YnBfY2Fwc19leCAmIERJU0NfUE9SVF9DQVBfRVgpIHsKLQkJaWYgKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSA9PSAxKQotCQkJd3JpdGVfZGF0YShwYnBjdGxfZGV2X20sIFRYX0RJU0EpOwotCQllbHNlCi0JCQl3cml0ZV9kYXRhKHBicGN0bF9kZXZfbSwgVFhfRElTQik7Ci0KLQkJbXNlY19kZWxheV9icChMQVRDSF9ERUxBWSk7Ci0KLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogRElTQ19QT1JUX09GRiAqLwotaW50IGRpc2NfcG9ydF9vZmYoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X207Ci0KLQlpZiAoKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSkgPT0gMSkKLQkJcGJwY3RsX2Rldl9tID0gcGJwY3RsX2RldjsKLQllbHNlCi0JCXBicGN0bF9kZXZfbSA9IGdldF9tYXN0ZXJfcG9ydF9mbihwYnBjdGxfZGV2KTsKLQlpZiAocGJwY3RsX2Rldl9tID09IE5VTEwpCi0JCXJldHVybiBCUF9OT1RfQ0FQOwotCi0JaWYgKHBicGN0bF9kZXZfbS0+YnBfY2Fwc19leCAmIERJU0NfUE9SVF9DQVBfRVgpIHsKLQkJaWYgKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSA9PSAxKQotCQkJd3JpdGVfZGF0YShwYnBjdGxfZGV2X20sIFRYX0VOQSk7Ci0JCWVsc2UKLQkJCXdyaXRlX2RhdGEocGJwY3RsX2Rldl9tLCBUWF9FTkIpOwotCi0JCW1zZWNfZGVsYXlfYnAoTEFUQ0hfREVMQVkpOwotCi0JfQotCXJldHVybiByZXQ7Ci19Ci0KIC8qVFdPX1BPUlRfTElOS19IV19FTiAoMHhlKSovCi1pbnQgdHBsX2h3X29uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IHRwbF9od19vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSAwLCBjdHJsID0gMDsKIAlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X2IgPSBOVUxMOwpAQCAtMTk2NCw3ICsxOTE1LDcgQEAKIH0KIAogLypUV09fUE9SVF9MSU5LX0hXX0RJUyAoMHhjKSovCi1pbnQgdHBsX2h3X29mZihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCB0cGxfaHdfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IDAsIGN0cmwgPSAwOwogCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfYiA9IE5VTEw7CkBAIC0xOTkwLDcgKzE5NDEsNyBAQAogfQogCiAvKiBXRFRfT0ZGICgweDYgMTEwKSovCi1pbnQgd2R0X29mZihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCB3ZHRfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IEJQX05PVF9DQVA7CiAKQEAgLTIwMTMsNyArMTk2NCw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50CiAgICAgd2R0X3ZhbF9hcnJheVtdID0geyAxMDAwLCAxNTAwLCAyMDAwLCAzMDAwLCA0MDAwLCA4MDAwLCAxNjAwMCwgMzIwMDAsIDAgfTsKIAotaW50IHdkdF9vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCB1bnNpZ25lZCBpbnQgdGltZW91dCkKK3N0YXRpYyBpbnQgd2R0X29uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIHVuc2lnbmVkIGludCB0aW1lb3V0KQogewogCiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBXRF9DVExfQ0FQKSB7CkBAIC0yMDY1LDcgKzIwMTYsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi12b2lkIGJwNzVfcHV0X2h3X3NlbWFwaG9yZV9nZW5lcmljKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgdm9pZCBicDc1X3B1dF9od19zZW1hcGhvcmVfZ2VuZXJpYyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCXUzMiBzd3NtOwogCkBAIC0yMDc2LDcgKzIwMjcsNyBAQAogCUJQQ1RMX1dSSVRFX1JFRyhwYnBjdGxfZGV2LCBTV1NNLCBzd3NtKTsKIH0KIAotczMyIGJwNzVfZ2V0X2h3X3NlbWFwaG9yZV9nZW5lcmljKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgczMyIGJwNzVfZ2V0X2h3X3NlbWFwaG9yZV9nZW5lcmljKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJdTMyIHN3c207CiAJczMyIHJldF92YWwgPSAwOwpAQCAtMjE5MCw3ICsyMTQxLDggQEAKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIAotczMyIGJwNzVfcmVhZF9waHlfcmVnX21kaWMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgdTMyIG9mZnNldCwgdTE2ICpkYXRhKQorc3RhdGljIHMzMiBicDc1X3JlYWRfcGh5X3JlZ19tZGljKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIHUzMiBvZmZzZXQsCisJCQkJICB1MTYgKmRhdGEpCiB7CiAJdTMyIGksIG1kaWMgPSAwOwogCXMzMiByZXRfdmFsID0gMDsKQEAgLTIyMjMsNyArMjE3NSw4IEBACiAJcmV0dXJuIHJldF92YWw7CiB9CiAKLXMzMiBicDc1X3dyaXRlX3BoeV9yZWdfbWRpYyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCB1MzIgb2Zmc2V0LCB1MTYgZGF0YSkKK3N0YXRpYyBzMzIgYnA3NV93cml0ZV9waHlfcmVnX21kaWMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgdTMyIG9mZnNldCwKKwkJCQkgICB1MTYgZGF0YSkKIHsKIAl1MzIgaSwgbWRpYyA9IDA7CiAJczMyIHJldF92YWwgPSAwOwpAQCAtMjM1MywxMSArMjMwNiwxMCBAQAogCQlpZiAoUEVHNV9JRl9TRVJJRVMocGJwY3RsX2Rldi0+c3ViZGV2aWNlKSkgewogCQkJaWYgKHR4X3N0YXRlKSB7CiAJCQkJdWludDE2X3QgbWlpX3JlZzsKLQkJCQlpZiAoIQotCQkJCSAgICAocmV0ID0KLQkJCQkgICAgIGJwNzVfcmVhZF9waHlfcmVnKHBicGN0bF9kZXYsCi0JCQkJCQkgICAgICAgQlBDVExJX1BIWV9DT05UUk9MLAotCQkJCQkJICAgICAgICZtaWlfcmVnKSkpIHsKKwkJCQlyZXQgPSBicDc1X3JlYWRfcGh5X3JlZyhwYnBjdGxfZGV2LAorCQkJCQkgICAgICBCUENUTElfUEhZX0NPTlRST0wsCisJCQkJCSAgICAgICZtaWlfcmVnKTsKKwkJCQlpZiAoIXJldCkgewogCQkJCQlpZiAobWlpX3JlZyAmIEJQQ1RMSV9NSUlfQ1JfUE9XRVJfRE9XTikgewogCQkJCQkJcmV0ID0KIAkJCQkJCSAgICBicDc1X3dyaXRlX3BoeV9yZWcKQEAgLTIzNjksMTcgKzIzMjEsMTUgQEAKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCXVpbnQxNl90IG1paV9yZWc7Ci0JCQkJaWYgKCEKLQkJCQkgICAgKHJldCA9Ci0JCQkJICAgICBicDc1X3JlYWRfcGh5X3JlZyhwYnBjdGxfZGV2LAotCQkJCQkJICAgICAgIEJQQ1RMSV9QSFlfQ09OVFJPTCwKLQkJCQkJCSAgICAgICAmbWlpX3JlZykpKSB7CisJCQkJcmV0ID0gYnA3NV9yZWFkX3BoeV9yZWcocGJwY3RsX2RldiwKKwkJCQkJICAgICAgQlBDVExJX1BIWV9DT05UUk9MLAorCQkJCQkgICAgICAmbWlpX3JlZyk7CisJCQkJaWYgKCFyZXQpIHsKIAogCQkJCQltaWlfcmVnIHw9IEJQQ1RMSV9NSUlfQ1JfUE9XRVJfRE9XTjsKLQkJCQkJcmV0ID0KLQkJCQkJICAgIGJwNzVfd3JpdGVfcGh5X3JlZyhwYnBjdGxfZGV2LAotCQkJCQkJCSAgICAgICBCUENUTElfUEhZX0NPTlRST0wsCi0JCQkJCQkJICAgICAgIG1paV9yZWcpOworCQkJCQlyZXQgPSBicDc1X3dyaXRlX3BoeV9yZWcocGJwY3RsX2RldiwKKwkJCQkJCSAgICAgICBCUENUTElfUEhZX0NPTlRST0wsCisJCQkJCQkgICAgICAgbWlpX3JlZyk7CiAJCQkJfQogCQkJfQogCkBAIC0yNTM0LDcgKzI0ODQsNyBAQAogfQogCiAvKlJFU0VUX0NPTlQgMHgyMCAqLwotaW50IHJlc2V0X2NvbnQoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgcmVzZXRfY29udChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSBCUF9OT1RfQ0FQOwogCkBAIC0yNTUxLDcgKzI1MDEsNyBAQAogfQogCiAvKkRJU19CWVBBU1NfQ0FQIDB4MjIgKi8KLWludCBkaXNfYnlwYXNzX2NhcChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBkaXNfYnlwYXNzX2NhcChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBCUF9ESVNfQ0FQKSB7CkBAIC0yNTcwLDcgKzI1MjAsNyBAQAogfQogCiAvKkVOX0JZUEFTU19DQVAgMHgyNCAqLwotaW50IGVuX2J5cGFzc19jYXAoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZW5fYnlwYXNzX2NhcChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgQlBfRElTX0NBUCkgewogCQlpZiAoSU5URUxfSUZfU0VSSUVTKHBicGN0bF9kZXYtPnN1YmRldmljZSkpIHsKQEAgLTI1ODYsNyArMjUzNiw3IEBACiB9CiAKIC8qIEJZUEFTU19TVEFURV9QV1JPTiAweDI2Ki8KLWludCBieXBhc3Nfc3RhdGVfcHdyb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgYnlwYXNzX3N0YXRlX3B3cm9uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBCUF9QV1VQX0NUTF9DQVApIHsKIAkJd3JpdGVfZGF0YShwYnBjdGxfZGV2LCBCWVBBU1NfU1RBVEVfUFdST04pOwpAQCAtMjYwMCw3ICsyNTUwLDcgQEAKIH0KIAogLyogTk9STUFMX1NUQVRFX1BXUk9OIDB4MjgqLwotaW50IG5vcm1hbF9zdGF0ZV9wd3JvbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBub3JtYWxfc3RhdGVfcHdyb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAoKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBCUF9QV1VQX0NUTF9DQVApCiAJICAgIHx8IChwYnBjdGxfZGV2LT5icF9jYXBzICYgVEFQX1BXVVBfQ1RMX0NBUCkpIHsKQEAgLTI2MTUsNyArMjU2NSw3IEBACiB9CiAKIC8qIEJZUEFTU19TVEFURV9QV1JPRkYgMHgyNyovCi1pbnQgYnlwYXNzX3N0YXRlX3B3cm9mZihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBieXBhc3Nfc3RhdGVfcHdyb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBCUF9QV09GRl9DVExfQ0FQKSB7CiAJCXdyaXRlX2RhdGEocGJwY3RsX2RldiwgQllQQVNTX1NUQVRFX1BXUk9GRik7CkBAIC0yNjI2LDcgKzI1NzYsNyBAQAogfQogCiAvKiBOT1JNQUxfU1RBVEVfUFdST0ZGIDB4MjkqLwotaW50IG5vcm1hbF9zdGF0ZV9wd3JvZmYoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgbm9ybWFsX3N0YXRlX3B3cm9mZihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmICgocGJwY3RsX2Rldi0+YnBfY2FwcyAmIEJQX1BXT0ZGX0NUTF9DQVApKSB7CiAJCXdyaXRlX2RhdGEocGJwY3RsX2RldiwgTk9STUFMX1NUQVRFX1BXUk9GRik7CkBAIC0yNjM3LDcgKzI1ODcsNyBAQAogfQogCiAvKlRBUF9TVEFURV9QV1JPTiAweDJhKi8KLWludCB0YXBfc3RhdGVfcHdyb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgdGFwX3N0YXRlX3B3cm9uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBUQVBfUFdVUF9DVExfQ0FQKSB7CiAJCXdyaXRlX2RhdGEocGJwY3RsX2RldiwgVEFQX1NUQVRFX1BXUk9OKTsKQEAgLTI2NDgsNyArMjU5OCw3IEBACiB9CiAKIC8qRElTX1RBUF9DQVAgMHgyYyovCi1pbnQgZGlzX3RhcF9jYXAoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZGlzX3RhcF9jYXAoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFRBUF9ESVNfQ0FQKSB7CiAJCXdyaXRlX2RhdGEocGJwY3RsX2RldiwgRElTX1RBUF9DQVApOwpAQCAtMjY1OSw3ICsyNjA5LDcgQEAKIH0KIAogLypFTl9UQVBfQ0FQIDB4MmUqLwotaW50IGVuX3RhcF9jYXAoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZW5fdGFwX2NhcChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgVEFQX0RJU19DQVApIHsKIAkJd3JpdGVfZGF0YShwYnBjdGxfZGV2LCBFTl9UQVBfQ0FQKTsKQEAgLTI2NzAsNyArMjYyMCw3IEBACiB9CiAKIC8qRElTQ19TVEFURV9QV1JPTiAweDJhKi8KLWludCBkaXNjX3N0YXRlX3B3cm9uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRpc2Nfc3RhdGVfcHdyb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIERJU0NfUFdVUF9DVExfQ0FQKSB7CiAJCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IDB4OCkgewpAQCAtMjY4Myw3ICsyNjMzLDcgQEAKIH0KIAogLypESVNfRElTQ19DQVAgMHgyYyovCi1pbnQgZGlzX2Rpc2NfY2FwKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRpc19kaXNjX2NhcChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgRElTQ19ESVNfQ0FQKSB7CiAJCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IDB4OCkgewpAQCAtMjY5NSw2MCArMjY0NSw4IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLS8qRElTQ19TVEFURV9QV1JPTiAweDJhKi8KLWludCBkaXNjX3BvcnRfc3RhdGVfcHdyb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X207Ci0KLQlyZXR1cm4gQlBfTk9UX0NBUDsKLQotCWlmICgoaXNfYnlwYXNzX2ZuKHBicGN0bF9kZXYpKSA9PSAxKQotCQlwYnBjdGxfZGV2X20gPSBwYnBjdGxfZGV2OwotCWVsc2UKLQkJcGJwY3RsX2Rldl9tID0gZ2V0X21hc3Rlcl9wb3J0X2ZuKHBicGN0bF9kZXYpOwotCWlmIChwYnBjdGxfZGV2X20gPT0gTlVMTCkKLQkJcmV0dXJuIEJQX05PVF9DQVA7Ci0KLQlpZiAocGJwY3RsX2Rldl9tLT5icF9jYXBzX2V4ICYgRElTQ19QT1JUX0NBUF9FWCkgewotCQlpZiAoaXNfYnlwYXNzX2ZuKHBicGN0bF9kZXYpID09IDEpCi0JCQl3cml0ZV9kYXRhKHBicGN0bF9kZXZfbSwgVFhfRElTQV9QV1JVUCk7Ci0JCWVsc2UKLQkJCXdyaXRlX2RhdGEocGJwY3RsX2Rldl9tLCBUWF9ESVNCX1BXUlVQKTsKLQotCQltc2VjX2RlbGF5X2JwKExBVENIX0RFTEFZKTsKLQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgbm9ybWFsX3BvcnRfc3RhdGVfcHdyb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X207Ci0JcmV0dXJuIEJQX05PVF9DQVA7Ci0KLQlpZiAoKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSkgPT0gMSkKLQkJcGJwY3RsX2Rldl9tID0gcGJwY3RsX2RldjsKLQllbHNlCi0JCXBicGN0bF9kZXZfbSA9IGdldF9tYXN0ZXJfcG9ydF9mbihwYnBjdGxfZGV2KTsKLQlpZiAocGJwY3RsX2Rldl9tID09IE5VTEwpCi0JCXJldHVybiBCUF9OT1RfQ0FQOwotCi0JaWYgKHBicGN0bF9kZXZfbS0+YnBfY2Fwc19leCAmIERJU0NfUE9SVF9DQVBfRVgpIHsKLQkJaWYgKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSA9PSAxKQotCQkJd3JpdGVfZGF0YShwYnBjdGxfZGV2X20sIFRYX0VOQV9QV1JVUCk7Ci0JCWVsc2UKLQkJCXdyaXRlX2RhdGEocGJwY3RsX2Rldl9tLCBUWF9FTkJfUFdSVVApOwotCi0JCW1zZWNfZGVsYXlfYnAoTEFUQ0hfREVMQVkpOwotCi0JfQotCXJldHVybiByZXQ7Ci19Ci0KIC8qRU5fVEFQX0NBUCAweDJlKi8KLWludCBlbl9kaXNjX2NhcChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBlbl9kaXNjX2NhcChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgRElTQ19ESVNfQ0FQKSB7CiAJCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IDB4OCkgewpAQCAtMjc2MCw3ICsyNjU4LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IHN0ZF9uaWNfb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgc3RkX25pY19vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBTVERfTklDX0NBUCkgewpAQCAtMjgxNCw3ICsyNzEyLDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IHN0ZF9uaWNfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IHN0ZF9uaWNfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFNURF9OSUNfQ0FQKSB7CkBAIC0yOTc3LDcgKzI4NzUsNyBAQAogfQogCiAvKldBSVRfQVRfUFdSVVAgMHg4MCAgICovCi1pbnQgYnBfd2FpdF9hdF9wd3VwX2VuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGJwX3dhaXRfYXRfcHd1cF9lbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBTV19DVExfQ0FQKSB7CkBAIC0yOTkyLDcgKzI4OTAsNyBAQAogfQogCiAvKkRJU19XQUlUX0FUX1BXUlVQICAgICAgIDB4ODEgKi8KLWludCBicF93YWl0X2F0X3B3dXBfZGlzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGJwX3dhaXRfYXRfcHd1cF9kaXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgU1dfQ1RMX0NBUCkgewpAQCAtMzAwOSw3ICsyOTA3LDcgQEAKIAogLypFTl9IV19SRVNFVCAgMHg4MiAgICovCiAKLWludCBicF9od19yZXNldF9lbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBicF9od19yZXNldF9lbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBTV19DVExfQ0FQKSB7CkBAIC0zMDI1LDcgKzI5MjMsNyBAQAogCiAvKkRJU19IV19SRVNFVCAgICAgICAgICAgICAweDgzICAgKi8KIAotaW50IGJwX2h3X3Jlc2V0X2RpcyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBicF9od19yZXNldF9kaXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgU1dfQ1RMX0NBUCkgewpAQCAtMzA0MCw3ICsyOTM4LDcgQEAKIH0KIAogCi1pbnQgd2R0X2V4cF9tb2RlKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBtb2RlKQorc3RhdGljIGludCB3ZHRfZXhwX21vZGUoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IG1vZGUpCiB7CiAJdWludDMyX3Qgc3RhdHVzX3JlZyA9IDAsIHN0YXR1c19yZWcxID0gMDsKIApAQCAtMzA5MSw3ICsyOTg5LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGJ5cGFzc19md192ZXIoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgYnlwYXNzX2Z3X3ZlcihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChpc19ieXBhc3NfZm4ocGJwY3RsX2RldikpCiAJCXJldHVybiByZWFkX3JlZyhwYnBjdGxfZGV2LCBWRVJfUkVHX0FERFIpOwpAQCAtMzA5OSw3ICsyOTk3LDcgQEAKIAkJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBieXBhc3Nfc2lnbl9jaGVjayhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBieXBhc3Nfc2lnbl9jaGVjayhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCiAJaWYgKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSkKQEAgLTMyMTAsNyArMzEwOCw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBieXBhc3NfZnJvbV9sYXN0X3JlYWQoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgYnlwYXNzX2Zyb21fbGFzdF9yZWFkKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJdWludDMyX3QgY3RybF9leHQgPSAwOwogCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfYiA9IE5VTEw7CkBAIC0zMjMwLDcgKzMxMjgsNyBAQAogCQlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGJ5cGFzc19zdGF0dXNfY2xlYXIoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgYnlwYXNzX3N0YXR1c19jbGVhcihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfYiA9IE5VTEw7CiAKQEAgLTMyNDQsNyArMzE0Miw3IEBACiAJCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgYnlwYXNzX2ZsYWdfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGJ5cGFzc19mbGFnX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCiAJaWYgKChwYnBjdGxfZGV2LT5icF9jYXBzICYgQlBfQ0FQKSkgewpAQCAtMzI1Nyw3ICszMTU1LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGJ5cGFzc19mbGFnX3N0YXR1c19jbGVhcihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBieXBhc3NfZmxhZ19zdGF0dXNfY2xlYXIoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgQlBfQ0FQKSB7CkBAIC0zMjcyLDcgKzMxNzAsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgYnlwYXNzX2NoYW5nZV9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgYnlwYXNzX2NoYW5nZV9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gQlBfTk9UX0NBUDsKIApAQCAtMzI5MSwxOCArMzE4OSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGJ5cGFzc19vZmZfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCi17Ci0KLQlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIEJQX0NBUCkgewotCQlpZiAocGJwY3RsX2Rldi0+YnBfZXh0X3ZlciA+PSBQWEcyQlBJX1ZFUikgewotCQkJcmV0dXJuICgoKChyZWFkX3JlZyhwYnBjdGxfZGV2LCBTVEFUVVNfUkVHX0FERFIpKSAmCi0JCQkJICBCWVBBU1NfT0ZGX01BU0spID09IEJZUEFTU19PRkZfTUFTSykgPyAxIDogMCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIEJQX05PVF9DQVA7Ci19Ci0KIHN0YXRpYyBpbnQgYnlwYXNzX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCXUzMiBjdHJsX2V4dCA9IDA7CkBAIC0zMzg2LDcgKzMyNzIsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZGVmYXVsdF9wd3Jvbl9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZGVmYXVsdF9wd3Jvbl9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgU1dfQ1RMX0NBUCkgewpAQCAtMzQxOCw3ICszMzA0LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGRpc19ieXBhc3NfY2FwX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBkaXNfYnlwYXNzX2NhcF9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgQlBfRElTX0NBUCkgewpAQCAtMzQzMSwzMSArMzMxNyw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBjbWRfZW5fc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCi17Ci0KLQlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFNXX0NUTF9DQVApIHsKLQkJaWYgKHBicGN0bF9kZXYtPmJwX2V4dF92ZXIgPj0gUFhHMkJQSV9WRVIpIHsKLQkJCXJldHVybiAoKCgocmVhZF9yZWcocGJwY3RsX2RldiwgU1RBVFVTX1JFR19BRERSKSkgJgotCQkJCSAgQ01ORF9FTl9NQVNLKSA9PSBDTU5EX0VOX01BU0spID8gMSA6IDApOwotCQl9Ci0JfQotCXJldHVybiBCUF9OT1RfQ0FQOwotfQotCi1pbnQgd2R0X2VuX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCi0JaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBXRF9DVExfQ0FQKSB7Ci0JCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IFBYRzJCUElfVkVSKSB7Ci0JCQlyZXR1cm4gKCgoKHJlYWRfcmVnKHBicGN0bF9kZXYsIFNUQVRVU19SRUdfQUREUikpICYKLQkJCQkgIFdEVF9FTl9NQVNLKSA9PSBXRFRfRU5fTUFTSykgPyAxIDogMCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIEJQX05PVF9DQVA7Ci19Ci0KLWludCB3ZHRfcHJvZ3JhbW1lZChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgKnRpbWVvdXQpCitzdGF0aWMgaW50IHdkdF9wcm9ncmFtbWVkKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCAqdGltZW91dCkKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFdEX0NUTF9DQVApIHsKQEAgLTM0ODEsNDAgKzMzNDMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBieXBhc3Nfc3VwcG9ydChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCWludCByZXQgPSAwOwotCi0JaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBTV19DVExfQ0FQKSB7Ci0JCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IFBYRzJUQlBJX1ZFUikgewotCQkJcmV0ID0KLQkJCSAgICAoKCgocmVhZF9yZWcocGJwY3RsX2RldiwgUFJPRFVDVF9DQVBfUkVHX0FERFIpKSAmCi0JCQkgICAgICAgQllQQVNTX1NVUFBPUlRfTUFTSykgPT0KLQkJCSAgICAgIEJZUEFTU19TVVBQT1JUX01BU0spID8gMSA6IDApOwotCQl9IGVsc2UgaWYgKHBicGN0bF9kZXYtPmJwX2V4dF92ZXIgPT0gUFhHMkJQSV9WRVIpCi0JCQlyZXQgPSAxOwotCX0gZWxzZQotCQlyZXQgPSBCUF9OT1RfQ0FQOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCB0YXBfc3VwcG9ydChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCWludCByZXQgPSAwOwotCi0JaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBTV19DVExfQ0FQKSB7Ci0JCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IFBYRzJUQlBJX1ZFUikgewotCQkJcmV0ID0KLQkJCSAgICAoKCgocmVhZF9yZWcocGJwY3RsX2RldiwgUFJPRFVDVF9DQVBfUkVHX0FERFIpKSAmCi0JCQkgICAgICAgVEFQX1NVUFBPUlRfTUFTSykgPT0gVEFQX1NVUFBPUlRfTUFTSykgPyAxIDogMCk7Ci0JCX0gZWxzZSBpZiAocGJwY3RsX2Rldi0+YnBfZXh0X3ZlciA9PSBQWEcyQlBJX1ZFUikKLQkJCXJldCA9IDA7Ci0JfSBlbHNlCi0JCXJldCA9IEJQX05PVF9DQVA7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IG5vcm1hbF9zdXBwb3J0KHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IG5vcm1hbF9zdXBwb3J0KHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IEJQX05PVF9DQVA7CiAKQEAgLTM1MzAsNyArMzM1OSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGdldF9icF9wcm9kX2NhcHMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X2JwX3Byb2RfY2FwcyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmICgocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFNXX0NUTF9DQVApICYmCiAJICAgIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IFBYRzJUQlBJX1ZFUikpCkBAIC0zNTM5LDcgKzMzNjgsNyBAQAogCiB9CiAKLWludCB0YXBfZmxhZ19zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgdGFwX2ZsYWdfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFRBUF9TVEFUVVNfQ0FQKSB7CkBAIC0zNTUxLDcgKzMzODAsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgdGFwX2ZsYWdfc3RhdHVzX2NsZWFyKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IHRhcF9mbGFnX3N0YXR1c19jbGVhcihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCXVpbnQzMl90IHN0YXR1c19yZWcgPSAwOwogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgVEFQX1NUQVRVU19DQVApIHsKQEAgLTM1NjUsNyArMzM5NCw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCB0YXBfY2hhbmdlX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCB0YXBfY2hhbmdlX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSBCUF9OT1RfQ0FQOwogCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IFBYRzJUQlBJX1ZFUikgewpAQCAtMzU4MiwxNyArMzQxMSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHRhcF9vZmZfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCi17Ci0JaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBUQVBfQ0FQKSB7Ci0JCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IFBYRzJUQlBJX1ZFUikKLQkJCXJldHVybiAoKCgocmVhZF9yZWcocGJwY3RsX2RldiwgU1RBVFVTX1RBUF9SRUdfQUREUikpICYKLQkJCQkgIFRBUF9PRkZfTUFTSykgPT0gVEFQX09GRl9NQVNLKSA/IDEgOiAwKTsKLQl9Ci0JcmV0dXJuIEJQX05PVF9DQVA7Ci19Ci0KLWludCB0YXBfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IHRhcF9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAl1MzIgY3RybF9leHQgPSAwOwogCkBAIC0zNjMxLDcgKzM0NTAsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZGVmYXVsdF9wd3Jvbl90YXBfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRlZmF1bHRfcHdyb25fdGFwX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgVEFQX1BXVVBfQ1RMX0NBUCkgewogCQlpZiAocGJwY3RsX2Rldi0+YnBfZXh0X3ZlciA+PSBQWEcyVEJQSV9WRVIpCkBAIC0zNjQyLDcgKzM0NjEsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZGlzX3RhcF9jYXBfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRpc190YXBfY2FwX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgVEFQX1BXVVBfQ1RMX0NBUCkgewogCQlpZiAocGJwY3RsX2Rldi0+YnBfZXh0X3ZlciA+PSBQWEcyVEJQSV9WRVIpCkBAIC0zNjUzLDcgKzM0NzIsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZGlzY19mbGFnX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBkaXNjX2ZsYWdfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIERJU0NfQ0FQKSB7CkBAIC0zNjY1LDcgKzM0ODQsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZGlzY19mbGFnX3N0YXR1c19jbGVhcihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBkaXNjX2ZsYWdfc3RhdHVzX2NsZWFyKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJdWludDMyX3Qgc3RhdHVzX3JlZyA9IDA7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBESVNDX0NBUCkgewpAQCAtMzY3OSw3ICszNDk4LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGRpc2NfY2hhbmdlX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBkaXNjX2NoYW5nZV9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gQlBfTk9UX0NBUDsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIERJU0NfQ0FQKSB7CkBAIC0zNjkwLDcgKzM1MDksNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZGlzY19vZmZfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRpc2Nfb2ZmX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfYiA9IE5VTEw7CiAJdTMyIGN0cmxfZXh0ID0gMDsKQEAgLTM3ODYsNyArMzYwNSw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBkZWZhdWx0X3B3cm9uX2Rpc2Nfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRlZmF1bHRfcHdyb25fZGlzY19zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIERJU0NfUFdVUF9DVExfQ0FQKSB7CiAJCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IDB4OCkKQEAgLTM3OTcsNyArMzYxNiw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBkaXNfZGlzY19jYXBfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRpc19kaXNjX2NhcF9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIERJU19ESVNDX0NBUCkgewogCQlpZiAocGJwY3RsX2Rldi0+YnBfZXh0X3ZlciA+PSAweDgpCkBAIC0zODA4LDU1ICszNjI3LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGRpc2NfcG9ydF9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQlpbnQgcmV0ID0gQlBfTk9UX0NBUDsKLQlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X207Ci0KLQlpZiAoKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSkgPT0gMSkKLQkJcGJwY3RsX2Rldl9tID0gcGJwY3RsX2RldjsKLQllbHNlCi0JCXBicGN0bF9kZXZfbSA9IGdldF9tYXN0ZXJfcG9ydF9mbihwYnBjdGxfZGV2KTsKLQlpZiAocGJwY3RsX2Rldl9tID09IE5VTEwpCi0JCXJldHVybiBCUF9OT1RfQ0FQOwotCi0JaWYgKHBicGN0bF9kZXZfbS0+YnBfY2Fwc19leCAmIERJU0NfUE9SVF9DQVBfRVgpIHsKLQkJaWYgKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSA9PSAxKSB7Ci0JCQlyZXR1cm4gKCgoKHJlYWRfcmVnKHBicGN0bF9kZXYsIFNUQVRVU19UQVBfUkVHX0FERFIpKSAmCi0JCQkJICBUWF9ESVNBX01BU0spID09IFRYX0RJU0FfTUFTSykgPyAxIDogMCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuICgoKChyZWFkX3JlZyhwYnBjdGxfZGV2LCBTVEFUVVNfVEFQX1JFR19BRERSKSkgJgotCQkJCSAgVFhfRElTQl9NQVNLKSA9PSBUWF9ESVNCX01BU0spID8gMSA6IDApOwotCi0JfQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBkZWZhdWx0X3B3cm9uX2Rpc2NfcG9ydF9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQlpbnQgcmV0ID0gQlBfTk9UX0NBUDsKLQlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X207Ci0KLQlpZiAoKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSkgPT0gMSkKLQkJcGJwY3RsX2Rldl9tID0gcGJwY3RsX2RldjsKLQllbHNlCi0JCXBicGN0bF9kZXZfbSA9IGdldF9tYXN0ZXJfcG9ydF9mbihwYnBjdGxfZGV2KTsKLQlpZiAocGJwY3RsX2Rldl9tID09IE5VTEwpCi0JCXJldHVybiBCUF9OT1RfQ0FQOwotCi0JaWYgKHBicGN0bF9kZXZfbS0+YnBfY2Fwc19leCAmIERJU0NfUE9SVF9DQVBfRVgpIHsKLQkJaWYgKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSA9PSAxKQotCQkJcmV0dXJuIHJldDsKLQkJLyogIHJldHVybigoKChyZWFkX3JlZyhwYnBjdGxfZGV2LFNUQVRVU19UQVBfUkVHX0FERFIpKSAmIFRYX0RJU0FfTUFTSyk9PVRYX0RJU0FfTUFTSyk/MTowKTsgKi8KLQkJZWxzZQotCQkJcmV0dXJuIHJldDsKLQkJLyogICByZXR1cm4oKCgocmVhZF9yZWcocGJwY3RsX2RldixTVEFUVVNfVEFQX1JFR19BRERSKSkgJiBUWF9ESVNBX01BU0spPT1UWF9ESVNBX01BU0spPzE6MCk7ICovCi0KLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHdkdF9leHBfbW9kZV9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgd2R0X2V4cF9tb2RlX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgV0RfQ1RMX0NBUCkgewogCQlpZiAocGJwY3RsX2Rldi0+YnBfZXh0X3ZlciA8PSBQWEcyQlBJX1ZFUikKQEAgLTM4NzksNyArMzY1MCw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCB0cGwyX2ZsYWdfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IHRwbDJfZmxhZ19zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzX2V4ICYgVFBMMl9DQVBfRVgpIHsKQEAgLTM4OTAsMjIgKzM2NjEsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgdHBsX2h3X3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfYiA9IE5VTEw7Ci0KLQlwYnBjdGxfZGV2X2IgPSBnZXRfc3RhdHVzX3BvcnRfZm4ocGJwY3RsX2Rldik7Ci0JaWYgKCFwYnBjdGxfZGV2X2IpCi0JCXJldHVybiBCUF9OT1RfQ0FQOwotCi0JaWYgKFRQTF9JRl9TRVJJRVMocGJwY3RsX2Rldi0+c3ViZGV2aWNlKSkKLQkJcmV0dXJuICgoKEJQQ1RMX1JFQURfUkVHKHBicGN0bF9kZXYsIENUUkwpKSAmCi0JCQkgQlBDVExJX0NUUkxfU1dEUElOMCkgIT0gMCA/IDEgOiAwKTsKLQlyZXR1cm4gQlBfTk9UX0NBUDsKLX0KLQotCi1pbnQgYnBfd2FpdF9hdF9wd3VwX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBicF93YWl0X2F0X3B3dXBfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBTV19DVExfQ0FQKSB7CiAJCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IDB4OCkKQEAgLTM5MTYsNyArMzY3Miw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBicF9od19yZXNldF9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgYnBfaHdfcmVzZXRfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFNXX0NUTF9DQVApIHsKQEAgLTM5MzAsNyArMzY4Niw3IEBACiB9CiAKIAotaW50IHN0ZF9uaWNfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IHN0ZF9uaWNfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHN0YXR1c192YWwgPSAwOwogCkBAIC0zOTc4LDcgKzM3MzQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKlNXX0lOSVQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBieXBhc3NfY2Fwc19pbml0KHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgdm9pZCBieXBhc3NfY2Fwc19pbml0KHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJdV9pbnQzMl90IGN0cmxfZXh0ID0gMDsKIAlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X20gPSBOVUxMOwpAQCAtNDE5NiwyMyArMzk1Miw3IEBACiAJfQogfQogCi1pbnQgYnlwYXNzX29mZl9pbml0KHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCi17Ci0JaW50IHJldCA9IGNtbmRfb24ocGJwY3RsX2Rldik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JaWYgKElOVEVMX0lGX1NFUklFUyhwYnBjdGxfZGV2LT5zdWJkZXZpY2UpKQotCQlyZXR1cm4gZGlzX2J5cGFzc19jYXAocGJwY3RsX2Rldik7Ci0Jd2R0X29mZihwYnBjdGxfZGV2KTsKLQlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIEJQX0NBUCkKLQkJYnlwYXNzX29mZihwYnBjdGxfZGV2KTsKLQlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFRBUF9DQVApCi0JCXRhcF9vZmYocGJwY3RsX2Rldik7Ci0JY21uZF9vZmYocGJwY3RsX2Rldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcmVtb3ZlX2J5cGFzc193ZF9hdXRvKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgdm9pZCByZW1vdmVfYnlwYXNzX3dkX2F1dG8oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKICNpZmRlZiBCUF9TRUxGX1RFU1QKIAlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X3NsID0gTlVMTDsKQEAgLTQyNDEsNyArMzk4MSw3IEBACiAKIH0KIAotaW50IGluaXRfYnlwYXNzX3dkX2F1dG8oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgaW5pdF9ieXBhc3Nfd2RfYXV0byhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgV0RfQ1RMX0NBUCkgewogCQlpbml0X3RpbWVyKCZwYnBjdGxfZGV2LT5icF90aW1lcik7CkBAIC00Mjg4LDcgKzQwMjgsNyBAQAogfQogI2VuZGlmCiAKLWludCBzZXRfYnlwYXNzX3dkX2F1dG8oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgdW5zaWduZWQgaW50IHBhcmFtKQorc3RhdGljIGludCBzZXRfYnlwYXNzX3dkX2F1dG8oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgdW5zaWduZWQgaW50IHBhcmFtKQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgV0RfQ1RMX0NBUCkgewogCQlpZiAocGJwY3RsX2Rldi0+cmVzZXRfdGltZSAhPSBwYXJhbSkgewpAQCAtNDMwNyw3ICs0MDQ3LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGdldF9ieXBhc3Nfd2RfYXV0byhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfYnlwYXNzX3dkX2F1dG8oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFdEX0NUTF9DQVApCiAJCXJldHVybiBwYnBjdGxfZGV2LT5yZXNldF90aW1lOwpAQCAtNDM3OCw3ICs0MTE4LDcgQEAKIAlyZXR1cm4gKCgocGJwY3RsX2Rldi0+ZnVuYyA9PSAwKSB8fCAocGJwY3RsX2Rldi0+ZnVuYyA9PSAyKSkgPyAxIDogMCk7CiB9CiAKLWludCBzZXRfYnlwYXNzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBieXBhc3NfbW9kZSkKK3N0YXRpYyBpbnQgc2V0X2J5cGFzc19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgYnlwYXNzX21vZGUpCiB7CiAJaW50IHJldCA9IDA7CiAKQEAgLTQzOTYsMTIgKzQxMzYsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgZ2V0X2J5cGFzc19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfYnlwYXNzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJcmV0dXJuIGJ5cGFzc19zdGF0dXMocGJwY3RsX2Rldik7CiB9CiAKLWludCBnZXRfYnlwYXNzX2NoYW5nZV9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfYnlwYXNzX2NoYW5nZV9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNDQwOSw3ICs0MTQ5LDcgQEAKIAlyZXR1cm4gYnlwYXNzX2NoYW5nZV9zdGF0dXMocGJwY3RsX2Rldik7CiB9CiAKLWludCBzZXRfZGlzX2J5cGFzc19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgZGlzX3BhcmFtKQorc3RhdGljIGludCBzZXRfZGlzX2J5cGFzc19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgZGlzX3BhcmFtKQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTQ0MjgsNyArNDE2OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGdldF9kaXNfYnlwYXNzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF9kaXNfYnlwYXNzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00NDM2LDcgKzQxNzYsNyBAQAogCXJldHVybiBkaXNfYnlwYXNzX2NhcF9zdGF0dXMocGJwY3RsX2Rldik7CiB9CiAKLWludCBzZXRfYnlwYXNzX3B3b2ZmX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBieXBhc3NfbW9kZSkKK3N0YXRpYyBpbnQgc2V0X2J5cGFzc19wd29mZl9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgYnlwYXNzX21vZGUpCiB7CiAJaW50IHJldCA9IDA7CiAJaWYgKCFwYnBjdGxfZGV2KQpAQCAtNDQ1NSw3ICs0MTk1LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgZ2V0X2J5cGFzc19wd29mZl9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfYnlwYXNzX3B3b2ZmX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00NDYzLDcgKzQyMDMsNyBAQAogCXJldHVybiBkZWZhdWx0X3B3cm9mZl9zdGF0dXMocGJwY3RsX2Rldik7CiB9CiAKLWludCBzZXRfYnlwYXNzX3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IGJ5cGFzc19tb2RlKQorc3RhdGljIGludCBzZXRfYnlwYXNzX3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IGJ5cGFzc19tb2RlKQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTQ0ODIsNyArNDIyMiw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGdldF9ieXBhc3NfcHd1cF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfYnlwYXNzX3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAoIXBicGN0bF9kZXYpCiAJCXJldHVybiAtMTsKQEAgLTQ0OTAsNyArNDIzMCw3IEBACiAJcmV0dXJuIGRlZmF1bHRfcHdyb25fc3RhdHVzKHBicGN0bF9kZXYpOwogfQogCi1pbnQgc2V0X2J5cGFzc193ZF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgdGltZW91dCkKK3N0YXRpYyBpbnQgc2V0X2J5cGFzc193ZF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgdGltZW91dCkKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00NTEyLDcgKzQyNTIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBnZXRfYnlwYXNzX3dkX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCAqdGltZW91dCkKK3N0YXRpYyBpbnQgZ2V0X2J5cGFzc193ZF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgKnRpbWVvdXQpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00NTIwLDcgKzQyNjAsNyBAQAogCXJldHVybiB3ZHRfcHJvZ3JhbW1lZChwYnBjdGxfZGV2LCB0aW1lb3V0KTsKIH0KIAotaW50IGdldF93ZF9leHBpcmVfdGltZV9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgKnRpbWVfbGVmdCkKK3N0YXRpYyBpbnQgZ2V0X3dkX2V4cGlyZV90aW1lX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCAqdGltZV9sZWZ0KQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNDUyOCw3ICs0MjY4LDcgQEAKIAlyZXR1cm4gd2R0X3RpbWVyKHBicGN0bF9kZXYsIHRpbWVfbGVmdCk7CiB9CiAKLWludCByZXNldF9ieXBhc3Nfd2RfdGltZXJfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgcmVzZXRfYnlwYXNzX3dkX3RpbWVyX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00NTM2LDcgKzQyNzYsNyBAQAogCXJldHVybiB3ZHRfdGltZXJfcmVsb2FkKHBicGN0bF9kZXYpOwogfQogCi1pbnQgZ2V0X3dkX3NldF9jYXBzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF93ZF9zZXRfY2Fwc19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCBicF9zdGF0dXMgPSAwOwogCkBAIC00NTYwLDcgKzQzMDAsNyBAQAogCXJldHVybiBicF9zdGF0dXM7CiB9CiAKLWludCBzZXRfc3RkX25pY19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgbmljX21vZGUpCitzdGF0aWMgaW50IHNldF9zdGRfbmljX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBuaWNfbW9kZSkKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00NTgwLDcgKzQzMjAsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBnZXRfc3RkX25pY19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfc3RkX25pY19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNDU4OCw3ICs0MzI4LDcgQEAKIAlyZXR1cm4gc3RkX25pY19zdGF0dXMocGJwY3RsX2Rldik7CiB9CiAKLWludCBzZXRfdGFwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCB0YXBfbW9kZSkKK3N0YXRpYyBpbnQgc2V0X3RhcF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgdGFwX21vZGUpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00NjA0LDcgKzQzNDQsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZ2V0X3RhcF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfdGFwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00NjEyLDcgKzQzNTIsNyBAQAogCXJldHVybiB0YXBfc3RhdHVzKHBicGN0bF9kZXYpOwogfQogCi1pbnQgc2V0X3RhcF9wd3VwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCB0YXBfbW9kZSkKK3N0YXRpYyBpbnQgc2V0X3RhcF9wd3VwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCB0YXBfbW9kZSkKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00NjMwLDcgKzQzNzAsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBnZXRfdGFwX3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X3RhcF9wd3VwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IDA7CiAJaWYgKCFwYnBjdGxfZGV2KQpAQCAtNDY0Miw3ICs0MzgyLDcgQEAKIAlyZXR1cm4gKChyZXQgPT0gMCkgPyAxIDogMCk7CiB9CiAKLWludCBnZXRfdGFwX2NoYW5nZV9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfdGFwX2NoYW5nZV9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNDY1MCw3ICs0MzkwLDcgQEAKIAlyZXR1cm4gdGFwX2NoYW5nZV9zdGF0dXMocGJwY3RsX2Rldik7CiB9CiAKLWludCBzZXRfZGlzX3RhcF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgZGlzX3BhcmFtKQorc3RhdGljIGludCBzZXRfZGlzX3RhcF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgZGlzX3BhcmFtKQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTQ2NjcsNyArNDQwNyw3IEBACiAJCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZ2V0X2Rpc190YXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X2Rpc190YXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAoIXBicGN0bF9kZXYpCiAJCXJldHVybiAtMTsKQEAgLTQ2NzUsNyArNDQxNSw3IEBACiAJcmV0dXJuIGRpc190YXBfY2FwX3N0YXR1cyhwYnBjdGxfZGV2KTsKIH0KIAotaW50IHNldF9kaXNjX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBkaXNjX21vZGUpCitzdGF0aWMgaW50IHNldF9kaXNjX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBkaXNjX21vZGUpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00NjkyLDcgKzQ0MzIsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZ2V0X2Rpc2NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X2Rpc2NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00NzAzLDcgKzQ0NDMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBzZXRfZGlzY19wd3VwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBkaXNjX21vZGUpCitzdGF0aWMgaW50IHNldF9kaXNjX3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IGRpc2NfbW9kZSkKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00NzIxLDcgKzQ0NjEsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBnZXRfZGlzY19wd3VwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF9kaXNjX3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00NzMxLDcgKzQ0NzEsNyBAQAogCXJldHVybiAocmV0ID09IDAgPyAxIDogKHJldCA8IDAgPyBCUF9OT1RfQ0FQIDogMCkpOwogfQogCi1pbnQgZ2V0X2Rpc2NfY2hhbmdlX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF9kaXNjX2NoYW5nZV9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTQ3NDEsNyArNDQ4MSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHNldF9kaXNfZGlzY19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgZGlzX3BhcmFtKQorc3RhdGljIGludCBzZXRfZGlzX2Rpc2NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IGRpc19wYXJhbSkKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00NzU5LDcgKzQ0OTksNyBAQAogCQlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGdldF9kaXNfZGlzY19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfZGlzX2Rpc2NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00NzcwLDU1ICs0NTEwLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgc2V0X2Rpc2NfcG9ydF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgZGlzY19tb2RlKQotewotCWludCByZXQgPSBCUF9OT1RfQ0FQOwotCWlmICghcGJwY3RsX2RldikKLQkJcmV0dXJuIC0xOwotCi0JaWYgKCFkaXNjX21vZGUpCi0JCXJldCA9IGRpc2NfcG9ydF9vZmYocGJwY3RsX2Rldik7Ci0JZWxzZQotCQlyZXQgPSBkaXNjX3BvcnRfb24ocGJwY3RsX2Rldik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgZ2V0X2Rpc2NfcG9ydF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCWlmICghcGJwY3RsX2RldikKLQkJcmV0dXJuIC0xOwotCi0JcmV0dXJuIGRpc2NfcG9ydF9zdGF0dXMocGJwY3RsX2Rldik7Ci19Ci0KLWludCBzZXRfZGlzY19wb3J0X3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IGRpc2NfbW9kZSkKLXsKLQlpbnQgcmV0ID0gQlBfTk9UX0NBUDsKLQlpZiAoIXBicGN0bF9kZXYpCi0JCXJldHVybiAtMTsKLQotCWlmICghZGlzY19tb2RlKQotCQlyZXQgPSBub3JtYWxfcG9ydF9zdGF0ZV9wd3JvbihwYnBjdGxfZGV2KTsKLQllbHNlCi0JCXJldCA9IGRpc2NfcG9ydF9zdGF0ZV9wd3JvbihwYnBjdGxfZGV2KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBnZXRfZGlzY19wb3J0X3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQlpbnQgcmV0ID0gMDsKLQlpZiAoIXBicGN0bF9kZXYpCi0JCXJldHVybiAtMTsKLQotCXJldCA9IGRlZmF1bHRfcHdyb25fZGlzY19wb3J0X3N0YXR1cyhwYnBjdGxfZGV2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gKChyZXQgPT0gMCkgPyAxIDogMCk7Ci19Ci0KLWludCBnZXRfd2RfZXhwX21vZGVfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X3dkX2V4cF9tb2RlX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00ODI2LDcgKzQ1MTgsNyBAQAogCXJldHVybiB3ZHRfZXhwX21vZGVfc3RhdHVzKHBicGN0bF9kZXYpOwogfQogCi1pbnQgc2V0X3dkX2V4cF9tb2RlX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBwYXJhbSkKK3N0YXRpYyBpbnQgc2V0X3dkX2V4cF9tb2RlX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBwYXJhbSkKIHsKIAlpZiAoIXBicGN0bF9kZXYpCiAJCXJldHVybiAtMTsKQEAgLTQ4MzQsMTkgKzQ1MjYsNyBAQAogCXJldHVybiB3ZHRfZXhwX21vZGUocGJwY3RsX2RldiwgcGFyYW0pOwogfQogCi1pbnQgcmVzZXRfY29udF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCWludCByZXQgPSAwOwotCWlmICghcGJwY3RsX2RldikKLQkJcmV0dXJuIC0xOwotCi0JcmV0ID0gY21uZF9vbihwYnBjdGxfZGV2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gcmVzZXRfY29udChwYnBjdGxfZGV2KTsKLX0KLQotaW50IHNldF90eF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgdHhfc3RhdGUpCitzdGF0aWMgaW50IHNldF90eF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgdHhfc3RhdGUpCiB7CiAKIAlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X2IgPSBOVUxMOwpAQCAtNDg2Nyw3ICs0NTQ3LDcgQEAKIAlyZXR1cm4gc2V0X3R4KHBicGN0bF9kZXYsIHR4X3N0YXRlKTsKIH0KIAotaW50IHNldF9icF9mb3JjZV9saW5rX2ZuKGludCBkZXZfbnVtLCBpbnQgdHhfc3RhdGUpCitzdGF0aWMgaW50IHNldF9icF9mb3JjZV9saW5rX2ZuKGludCBkZXZfbnVtLCBpbnQgdHhfc3RhdGUpCiB7CiAJc3RhdGljIHN0cnVjdCBicGN0bF9kZXYgKmJwY3RsX2Rldl9jdXJyOwogCkBAIC00ODc5LDcgKzQ1NTksNyBAQAogCXJldHVybiBzZXRfYnBfZm9yY2VfbGluayhicGN0bF9kZXZfY3VyciwgdHhfc3RhdGUpOwogfQogCi1pbnQgc2V0X3dkX2F1dG9yZXNldF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgcGFyYW0pCitzdGF0aWMgaW50IHNldF93ZF9hdXRvcmVzZXRfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IHBhcmFtKQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNDg4Nyw3ICs0NTY3LDcgQEAKIAlyZXR1cm4gc2V0X2J5cGFzc193ZF9hdXRvKHBicGN0bF9kZXYsIHBhcmFtKTsKIH0KIAotaW50IGdldF93ZF9hdXRvcmVzZXRfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X3dkX2F1dG9yZXNldF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNDkxNCw3ICs0NTk0LDcgQEAKIAogI2VuZGlmCiAKLWludCBnZXRfYnlwYXNzX2NhcHNfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X2J5cGFzc19jYXBzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00OTIzLDcgKzQ2MDMsOCBAQAogCiB9CiAKLWludCBnZXRfYnlwYXNzX3NsYXZlX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIHN0cnVjdCBicGN0bF9kZXYgKipwYnBjdGxfZGV2X291dCkKK3N0YXRpYyBpbnQgZ2V0X2J5cGFzc19zbGF2ZV9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LAorCQkJICAgICAgIHN0cnVjdCBicGN0bF9kZXYgKipwYnBjdGxfZGV2X291dCkKIHsKIAlpbnQgaWR4X2RldiA9IDA7CiAJaWYgKCFwYnBjdGxfZGV2KQpAQCAtNDk1NSw3ICs0NjM2LDcgQEAKIAkJcmV0dXJuIDA7CiB9CiAKLWludCBpc19ieXBhc3Moc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgaXNfYnlwYXNzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00OTY2LDcgKzQ2NDcsNyBAQAogCQlyZXR1cm4gMDsKIH0KIAotaW50IGdldF90eF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfdHhfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X2IgPSBOVUxMOwogCWlmICghcGJwY3RsX2RldikKQEAgLTQ5ODYsNyArNDY2Nyw3IEBACiAJcmV0dXJuIHR4X3N0YXR1cyhwYnBjdGxfZGV2KTsKIH0KIAotaW50IGdldF9icF9mb3JjZV9saW5rX2ZuKGludCBkZXZfbnVtKQorc3RhdGljIGludCBnZXRfYnBfZm9yY2VfbGlua19mbihpbnQgZGV2X251bSkKIHsKIAlzdGF0aWMgc3RydWN0IGJwY3RsX2RldiAqYnBjdGxfZGV2X2N1cnI7CiAKQEAgLTUwNDksNyArNDczMCw3IEBACiAJbW9kX3RpbWVyKCZwYnBjdGxfZGV2LT5icF90cGxfdGltZXIsIGppZmZpZXMgKyBCUF9MSU5LX01PTl9ERUxBWSAqIEhaKTsKIH0KIAotdm9pZCByZW1vdmVfYnlwYXNzX3RwbF9hdXRvKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgdm9pZCByZW1vdmVfYnlwYXNzX3RwbF9hdXRvKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2Rldl9iID0gTlVMTDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC01MDY3LDcgKzQ3NDgsNyBAQAogCXJldHVybjsKIH0KIAotaW50IGluaXRfYnlwYXNzX3RwbF9hdXRvKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGluaXRfYnlwYXNzX3RwbF9hdXRvKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC01MDgwLDcgKzQ3NjEsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgc2V0X2J5cGFzc190cGxfYXV0byhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCB1bnNpZ25lZCBpbnQgcGFyYW0pCitzdGF0aWMgaW50IHNldF9ieXBhc3NfdHBsX2F1dG8oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgdW5zaWduZWQgaW50IHBhcmFtKQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNTA5OCwxNyArNDc3OSw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBnZXRfYnlwYXNzX3RwbF9hdXRvKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCi17Ci0JaWYgKCFwYnBjdGxfZGV2KQotCQlyZXR1cm4gLTE7Ci0JaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBUUExfQ0FQKQotCQlyZXR1cm4gcGJwY3RsX2Rldi0+YnBfdHBsX2ZsYWc7Ci0KLQlyZXR1cm4gQlBfTk9UX0NBUDsKLX0KLQotaW50IHNldF90cGxfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IHRwbF9tb2RlKQorc3RhdGljIGludCBzZXRfdHBsX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCB0cGxfbW9kZSkKIHsKIAogCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfYiA9IE5VTEw7CkBAIC01MTM4LDcgKzQ4MDksNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZ2V0X3RwbF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfdHBsX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IEJQX05PVF9DQVA7CiAJaWYgKCFwYnBjdGxfZGV2KQpAQCAtNTE1Miw3ICs0ODIzLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgc2V0X2JwX3dhaXRfYXRfcHd1cF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgdGFwX21vZGUpCitzdGF0aWMgaW50IHNldF9icF93YWl0X2F0X3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IHRhcF9tb2RlKQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNTE3Miw3ICs0ODQzLDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGdldF9icF93YWl0X2F0X3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X2JwX3dhaXRfYXRfcHd1cF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTUxODUsNyArNDg1Niw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHNldF9icF9od19yZXNldF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgdGFwX21vZGUpCitzdGF0aWMgaW50IHNldF9icF9od19yZXNldF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgdGFwX21vZGUpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC01MjA1LDcgKzQ4NzYsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZ2V0X2JwX2h3X3Jlc2V0X2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF9icF9od19yZXNldF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTUyMjAsNyArNDg5MSw3IEBACiB9CiAKIAotaW50IGdldF9ieXBhc3NfaW5mb19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBjaGFyICpkZXZfbmFtZSwKK3N0YXRpYyBpbnQgZ2V0X2J5cGFzc19pbmZvX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGNoYXIgKmRldl9uYW1lLAogCQkgICAgICAgY2hhciAqYWRkX3BhcmFtKQogewogCWlmICghcGJwY3RsX2RldikKQEAgLTUyMzIsNyArNDkwMyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBnZXRfZGV2X2lkeF9ic2YoaW50IGJ1cywgaW50IHNsb3QsIGludCBmdW5jKQorc3RhdGljIGludCBnZXRfZGV2X2lkeF9ic2YoaW50IGJ1cywgaW50IHNsb3QsIGludCBmdW5jKQogewogCWludCBpZHhfZGV2ID0gMDsKIAlmb3IgKGlkeF9kZXYgPSAwOwpAQCAtNzAyMiwxMiArNjY5Myw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKHNldF93ZF9leHBfbW9kZV9zZCk7CiAKLWludCByZXNldF9jb250X3NkKGludCBpZmluZGV4KQotewotCXJldHVybiByZXNldF9jb250X2ZuKGdldF9kZXZfaWR4X3AoaWZpbmRleCkpOwotCi19Ci0KIGludCBzZXRfdHhfc2QoaW50IGlmaW5kZXgsIGludCB0eF9zdGF0ZSkKIHsKIAlyZXR1cm4gc2V0X3R4X2ZuKGdldF9kZXZfaWR4X3AoaWZpbmRleCksIHR4X3N0YXRlKTsKQEAgLTcxMTgsNyArNjc4Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmJwX3Byb2Nmc19kaXI7CiAKLWludCBicF9wcm9jX2NyZWF0ZSh2b2lkKQorc3RhdGljIGludCBicF9wcm9jX2NyZWF0ZSh2b2lkKQogewogCWJwX3Byb2Nmc19kaXIgPSBwcm9jX21rZGlyKEJQX1BST0NfRElSLCBpbml0X25ldC5wcm9jX25ldCk7CiAJaWYgKGJwX3Byb2Nmc19kaXIgPT0gKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKTApIHsKQEAgLTc3NDYsNyArNzQxMSw3IEBACiB9CiBSV19GT1BTKHdkX2F1dG9yZXNldCkKIAotaW50IGJ5cGFzc19wcm9jX2NyZWF0ZV9kZXZfc2Qoc3RydWN0IGJwY3RsX2RldiAqcGJwX2RldmljZV9ibG9jaykKK3N0YXRpYyBpbnQgYnlwYXNzX3Byb2NfY3JlYXRlX2Rldl9zZChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBfZGV2aWNlX2Jsb2NrKQogewogCXN0cnVjdCBieXBhc3NfcGZzX3NkICpjdXJyZW50X3BmcyA9ICYocGJwX2RldmljZV9ibG9jay0+YnlwYXNzX3Bmc19zZXQpOwogCXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2Nmc19kaXI7CkBAIC03ODE2LDcgKzc0ODEsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBieXBhc3NfcHJvY19yZW1vdmVfZGV2X3NkKHN0cnVjdCBicGN0bF9kZXYgKnBicF9kZXZpY2VfYmxvY2spCitzdGF0aWMgaW50IGJ5cGFzc19wcm9jX3JlbW92ZV9kZXZfc2Qoc3RydWN0IGJwY3RsX2RldiAqcGJwX2RldmljZV9ibG9jaykKIHsKIAogCXN0cnVjdCBieXBhc3NfcGZzX3NkICpjdXJyZW50X3BmcyA9ICZwYnBfZGV2aWNlX2Jsb2NrLT5ieXBhc3NfcGZzX3NldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zaWxpY29tL2J5cGFzc2xpYi9icF9pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnlwYXNzbGliL2JwX2lvY3RsLmgKaW5kZXggMmQxZWY1My4uYmY0N2Y3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnlwYXNzbGliL2JwX2lvY3RsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnlwYXNzbGliL2JwX2lvY3RsLmgKQEAgLTUxLDkgKzUxLDkgQEAKICNkZWZpbmUgV0RUX1NURVBfVElNRSAgICAgICAgICAgICAgMHgxMAkvKiBCSVRfNCAqLwogCiAjZGVmaW5lIFdEX01JTl9USU1FX0dFVChkZXNjKSAgIChkZXNjICYgMHhmKQotI2RlZmluZSBXRF9TVEVQX0NPVU5UX0dFVChkZXNjKSAoZGVzYz4+NSkgJiAweGYKKyNkZWZpbmUgV0RfU1RFUF9DT1VOVF9HRVQoZGVzYykgKChkZXNjPj41KSAmIDB4ZikKIAotdHlwZWRlZiBlbnVtIHsKK2VudW0gewogCUlTX0JZUEFTUyA9IDEsCiAJR0VUX0JZUEFTU19TTEFWRSwKIAlHRVRfQllQQVNTX0NBUFMsCkBAIC0xMDMsNyArMTAzLDcgQEAKIAlTRVRfQlBfSFdfUkVTRVQsCiB9IENNTkRfVFlQRTsKIAotdHlwZWRlZiBlbnVtIHsKK2VudW0gewogCUlGX1NDQU5fU0QsCiAJR0VUX0RFVl9OVU1fU0QsCiAJSVNfQllQQVNTX1NELApAQCAtMTU2LDcgKzE1Niw3IEBACiAKIH0gQ01ORF9UWVBFX1NEOwogCi0jZGVmaW5lIFNJT0NHSUZCWVBBU1MgU0lPQ0RFVlBSSVZBVEUrMTAKKyNkZWZpbmUgU0lPQ0dJRkJZUEFTUyAoU0lPQ0RFVlBSSVZBVEUrMTApCiAKIHN0cnVjdCBicF9pbmZvIHsKIAljaGFyIHByb2RfbmFtZVsxNF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2lsaWNvbS9ieXBhc3NsaWIvbGliYnBfc2QuaCBiL2RyaXZlcnMvc3RhZ2luZy9zaWxpY29tL2J5cGFzc2xpYi9saWJicF9zZC5oCmluZGV4IDNiNGY4MzYuLmNhYzRiMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zaWxpY29tL2J5cGFzc2xpYi9saWJicF9zZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zaWxpY29tL2J5cGFzc2xpYi9saWJicF9zZC5oCkBAIC0xOCw3ICsxOCw3IEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4CiAgKgogICogT3V0cHV0OgotICogIDEgLSAgaWYgZGV2aWNlIGlzIGJ5cGFzcyBjb250cm9sbGluZyBkZXZpY2UsIAorICogIDEgLSAgaWYgZGV2aWNlIGlzIGJ5cGFzcyBjb250cm9sbGluZyBkZXZpY2UsCiAgKiAgMCAtICBpZiBkZXZpY2UgaXMgYnlwYXNzIHNsYXZlIGRldmljZQogICogLTEgLSAgZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcwogICoqLwpAQCAtMzAsNyArMzAsNyBAQAogICoKICAqIE91dHB1dDoKICAqICBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgc2xhdmUgZGV2aWNlCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBnZXRfYnlwYXNzX3NsYXZlX3NkKGludCBpZl9pbmRleCk7CiAKQEAgLTM5LDU1ICszOSw3MiBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleAogICoKICAqIE91dHB1dDoKLSAqIGZsYWdzIHdvcmQgb24gc3VjY2VzcztmbGFnIHdvcmQgaXMgYSAzMi1iaXQgbWFzayB3b3JkIHdpdGggZWFjaCBiaXQgZGVmaW5lcyBkaWZmZXJlbnQgCi0gKiBjYXBhYmlsaXR5IGFzIGRlc2NyaWJlZCBiZWxsb3cuCisgKiBmbGFncyB3b3JkIG9uIHN1Y2Nlc3M7ZmxhZyB3b3JkIGlzIGEgMzItYml0IG1hc2sgd29yZCB3aXRoIGVhY2ggYml0IGRlZmluZXMKKyAqIGRpZmZlcmVudCBjYXBhYmlsaXR5IGFzIGRlc2NyaWJlZCBiZWxsb3cuCiAgKiBWYWx1ZSBvZiAxIGZvciBzdXBwb3J0aW5nIHRoaXMgZmVhdHVyZS4gMCBmb3Igbm90IHN1cHBvcnRpbmcgdGhpcyBmZWF0dXJlLgotICogLTEgLSBvbiBmYWlsdXJlIChpZiB0aGUgZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3Igbm90IGEgQnlwYXNzIGRldmljZSkKLSAqIEJpdAlmZWF0dXJlCSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbgotICogCi0gKiAwCUJQX0NBUAkgICAgICAgICAgICAgICAgVGhlIGludGVyZmFjZSBpcyBCeXBhc3MgY2FwYWJsZSBpbiBnZW5lcmFsCi0gKiAKLSAqIDEJQlBfU1RBVFVTX0NBUAkgICAgICAgIFRoZSBpbnRlcmZhY2UgY2FuIHJlcG9ydCBvZiB0aGUgY3VycmVudCBCeXBhc3MgbW9kZQotICogCi0gKiAyCUJQX1NUQVRVU19DSEFOR0VfQ0FQCVRoZSBpbnRlcmZhY2UgY2FuIHJlcG9ydCBvbiBhIGNoYW5nZSB0byBieXBhc3MgbW9kZSBmcm9tIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGFzdCB0aW1lIHRoZSBtb2RlIHdhcyBkZWZpbmVkCi0gKiAKLSAqIDMJU1dfQ1RMX0NBUAkgICAgICAgICAgICBUaGUgaW50ZXJmYWNlIGlzIFNvZnR3YXJlIGNvbnRyb2xsZWQgY2FwYWJsZSBmb3IgYnlwYXNzL25vbiBieXBhc3MgbW9kZXMuCi0gKiAKLSAqIDQJQlBfRElTX0NBUAkgICAgICAgICAgICBUaGUgaW50ZXJmYWNlIGlzIGNhcGFibGUgb2YgZGlzYWJsaW5nIHRoZSBCeXBhc3MgbW9kZSBhdCBhbGwgdGltZXMuIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1vZGUgd2lsbCByZXRhaW4gaXRzIG1vZGUgZXZlbiBkdXJpbmcgcG93ZXIgbG9zcyBhbmQgYWxzbyBhZnRlciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG93ZXIgcmVjb3ZlcnkuIFRoaXMgd2lsbCBvdmVyY29tZSBvbiBhbnkgYnlwYXNzIG9wZXJhdGlvbiBkdWUgdG8gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoZG9nIHRpbWVvdXQgb3Igc2V0IGJ5cGFzcyBjb21tYW5kLgotICogCi0gKiA1CUJQX0RJU19TVEFUVVNfQ0FQCSAgICBUaGUgaW50ZXJmYWNlIGNhbiByZXBvcnQgb2YgdGhlIGN1cnJlbnQgRElTX0JQX0NBUAotICogCi0gKiA2CVNURF9OSUNfQ0FQCSAgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgaXMgY2FwYWJsZSB0byBiZSBjb25maWd1cmVkIHRvIG9wZXJhdGUgYXMgc3RhbmRhcmQsIG5vbiBCeXBhc3MsIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUMgaW50ZXJmYWNlIChoYXZlIGRpcmVjdCBjb25uZWN0aW9uIHRvIGludGVyZmFjZXMgYXQgYWxsIHBvd2VyIG1vZGVzKQotICogCi0gKiA3CUJQX1BXT0ZGX05PX0NBUAkgICAgICAgIFRoZSBpbnRlcmZhY2UgY2FuIGJlIGluIEJ5cGFzcyBtb2RlIGF0IHBvd2VyIG9mZiBzdGF0ZQotICogCi0gKiA4CUJQX1BXT0ZGX09GRl9DQVAJICAgIFRoZSBpbnRlcmZhY2UgY2FuIGRpc2Nvbm5lY3QgdGhlIEJ5cGFzcyBtb2RlIGF0IHBvd2VyIG9mZiBzdGF0ZSB3aXRob3V0IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RpbmcgYWxsIHRoZSBvdGhlciBzdGF0ZXMgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqIDkJQlBfUFdPRkZfQ1RMX0NBUAkgICAgVGhlIGJlaGF2aW9yIG9mIHRoZSBCeXBhc3MgbW9kZSBhdCBQb3dlci1vZmYgc3RhdGUgY2FuIGJlIGNvbnRyb2xsZWQgYnkgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvZnR3YXJlIHdpdGhvdXQgZWZmZWN0aW5nIGFueSBvdGhlciBzdGF0ZQotICogCi0gKjEwICAgIEJQX1BXVVBfT05fQ0FQCSAgICAgICAgVGhlIGludGVyZmFjZSBjYW4gYmUgaW4gQnlwYXNzIG1vZGUgd2hlbiBwb3dlciBpcyB0dXJuZWQgb24gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnRpbCB0aGUgc3lzdGVtIHRha2UgY29udHJvbCBvZiB0aGUgYnlwYXNzIGZ1bmN0aW9uYWxpdHkpCi0gKiAKLSAqMTEJQlBfUFdVUF9PRkZfQ0FQCSAgICAgICAgVGhlIGludGVyZmFjZSBjYW4gZGlzY29ubmVjdCBmcm9tIEJ5cGFzcyBtb2RlIHdoZW4gcG93ZXIgaXMgdHVybmVkIG9uIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW50aWwgdGhlIHN5c3RlbSB0YWtlIGNvbnRyb2wgb2YgdGhlIGJ5cGFzcyBmdW5jdGlvbmFsaXR5KQotICogCi0gKjEyCUJQX1BXVVBfQ1RMX0NBUAkgICAgICAgIFRoZSBiZWhhdmlvciBvZiB0aGUgQnlwYXNzIG1vZGUgYXQgUG93ZXItdXAgY2FuIGJlIGNvbnRyb2xsZWQgYnkgc29mdHdhcmUKLSAqIAotICoxMwlXRF9DVExfQ0FQCSAgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgaGFzIHdhdGNoZG9nIGNhcGFiaWxpdGllcyB0byB0dXJuIHRvIEJ5cGFzcyBtb2RlIHdoZW4gbm90IHJlc2V0IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZGVmaW5lZCBwZXJpb2Qgb2YgdGltZS4KLSAqIAotICoxNAlXRF9TVEFUVVNfQ0FQCSAgICAgICAgVGhlIGludGVyZmFjZSBjYW4gcmVwb3J0IG9uIHRoZSB3YXRjaGRvZyBzdGF0dXMgKEFjdGl2ZS9pbmFjdGl2ZSkKLSAqIAotICoxNQlXRF9USU1FT1VUX0NBUAkgICAgICAgIFRoZSBpbnRlcmZhY2UgY2FuIHJlcG9ydCB0aGUgdGltZSBsZWZ0IHRpbGwgd2F0Y2hkb2cgdHJpZ2dlcnMgdG8gQnlwYXNzIG1vZGUuCi0gKiAKLSAqMTYtMzEgUkVTRVJWRUQJCisgKiAtMSAtIG9uIGZhaWx1cmUgKGlmIHRoZSBkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBub3QgYQorICogIEJ5cGFzcyBkZXZpY2UpCisgKiBCaXQJZmVhdHVyZQkJCWRlc2NyaXB0aW9uCisgKgorICogMAlCUF9DQVAJCQlUaGUgaW50ZXJmYWNlIGlzIEJ5cGFzcyBjYXBhYmxlIGluIGdlbmVyYWwKKyAqCisgKiAxCUJQX1NUQVRVU19DQVAJCVRoZSBpbnRlcmZhY2UgY2FuIHJlcG9ydCBvZiB0aGUgY3VycmVudCBCeXBhc3MKKyAqCQkJCW1vZGUKKyAqCisgKiAyCUJQX1NUQVRVU19DSEFOR0VfQ0FQCVRoZSBpbnRlcmZhY2UgY2FuIHJlcG9ydCBvbiBhIGNoYW5nZSB0byBieXBhc3MKKyAqCQkJCW1vZGUgZnJvbSB0aGUgbGFzdCB0aW1lIHRoZSBtb2RlIHdhcyBkZWZpbmVkCisgKgorICogMwlTV19DVExfQ0FQCQlUaGUgaW50ZXJmYWNlIGlzIFNvZnR3YXJlIGNvbnRyb2xsZWQgY2FwYWJsZSBmb3IKKyAqCQkJCWJ5cGFzcy9ub24gYnlwYXNzIG1vZGVzLgorICoKKyAqIDQJQlBfRElTX0NBUAkJVGhlIGludGVyZmFjZSBpcyBjYXBhYmxlIG9mIGRpc2FibGluZyB0aGUgQnlwYXNzCisgKgkJCQltb2RlIGF0IGFsbCB0aW1lcy4gIFRoaXMgbW9kZSB3aWxsIHJldGFpbiBpdHMKKyAqCQkJCW1vZGUgZXZlbiBkdXJpbmcgcG93ZXIgbG9zcyBhbmQgYWxzbyBhZnRlciBwb3dlcgorICoJCQkJcmVjb3ZlcnkuIFRoaXMgd2lsbCBvdmVyY29tZSBvbiBhbnkgYnlwYXNzCisgKgkJCQlvcGVyYXRpb24gZHVlIHRvIHdhdGNoZG9nIHRpbWVvdXQgb3Igc2V0IGJ5cGFzcworICoJCQkJY29tbWFuZC4KKyAqCisgKiA1CUJQX0RJU19TVEFUVVNfQ0FQCVRoZSBpbnRlcmZhY2UgY2FuIHJlcG9ydCBvZiB0aGUgY3VycmVudAorICoJCQkJRElTX0JQX0NBUAorICoKKyAqIDYJU1REX05JQ19DQVAJCVRoZSBpbnRlcmZhY2UgaXMgY2FwYWJsZSB0byBiZSBjb25maWd1cmVkIHRvCisgKgkJCQlvcGVyYXRlIGFzIHN0YW5kYXJkLCBub24gQnlwYXNzLCBOSUMgaW50ZXJmYWNlCisgKgkJCQkoaGF2ZSBkaXJlY3QgY29ubmVjdGlvbiB0byBpbnRlcmZhY2VzIGF0IGFsbAorICoJCQkJcG93ZXIgbW9kZXMpCisgKgorICogNwlCUF9QV09GRl9OT19DQVAJCVRoZSBpbnRlcmZhY2UgY2FuIGJlIGluIEJ5cGFzcyBtb2RlIGF0IHBvd2VyIG9mZgorICoJCQkJc3RhdGUKKyAqCisgKiA4CUJQX1BXT0ZGX09GRl9DQVAJVGhlIGludGVyZmFjZSBjYW4gZGlzY29ubmVjdCB0aGUgQnlwYXNzIG1vZGUgYXQKKyAqCQkJCXBvd2VyIG9mZiBzdGF0ZSB3aXRob3V0IGVmZmVjdGluZyBhbGwgdGhlIG90aGVyCisgKgkJCQlzdGF0ZXMgb2Ygb3BlcmF0aW9uCisgKgorICogOQlCUF9QV09GRl9DVExfQ0FQCVRoZSBiZWhhdmlvciBvZiB0aGUgQnlwYXNzIG1vZGUgYXQgUG93ZXItb2ZmCisgKgkJCQlzdGF0ZSBjYW4gYmUgY29udHJvbGxlZCBieSBzb2Z0d2FyZSB3aXRob3V0CisgKgkJCQllZmZlY3RpbmcgYW55IG90aGVyIHN0YXRlCisgKgorICoxMCAgQlBfUFdVUF9PTl9DQVAJCVRoZSBpbnRlcmZhY2UgY2FuIGJlIGluIEJ5cGFzcyBtb2RlIHdoZW4gcG93ZXIKKyAqCQkJCWlzIHR1cm5lZCBvbiAodW50aWwgdGhlIHN5c3RlbSB0YWtlIGNvbnRyb2wgb2YKKyAqCQkJCXRoZSBieXBhc3MgZnVuY3Rpb25hbGl0eSkKKyAqCisgKjExCUJQX1BXVVBfT0ZGX0NBUAkJVGhlIGludGVyZmFjZSBjYW4gZGlzY29ubmVjdCBmcm9tIEJ5cGFzcyBtb2RlCisgKgkJCQl3aGVuIHBvd2VyIGlzIHR1cm5lZCBvbiAodW50aWwgdGhlIHN5c3RlbSB0YWtlCisgKgkJCQljb250cm9sIG9mIHRoZSBieXBhc3MgZnVuY3Rpb25hbGl0eSkKKyAqCisgKjEyCUJQX1BXVVBfQ1RMX0NBUAkJVGhlIGJlaGF2aW9yIG9mIHRoZSBCeXBhc3MgbW9kZSBhdCBQb3dlci11cCBjYW4KKyAqCQkJCWJlIGNvbnRyb2xsZWQgYnkgc29mdHdhcmUKKyAqCisgKjEzCVdEX0NUTF9DQVAJCVRoZSBpbnRlcmZhY2UgaGFzIHdhdGNoZG9nIGNhcGFiaWxpdGllcyB0byB0dXJuCisgKgkJCQl0byBCeXBhc3MgbW9kZSB3aGVuIG5vdCByZXNldCBmb3IgZGVmaW5lZCBwZXJpb2QKKyAqCQkJCW9mIHRpbWUuCisgKgorICoxNAlXRF9TVEFUVVNfQ0FQCQlUaGUgaW50ZXJmYWNlIGNhbiByZXBvcnQgb24gdGhlIHdhdGNoZG9nIHN0YXR1cworICoJCQkJKEFjdGl2ZS9pbmFjdGl2ZSkKKyAqCisgKjE1CVdEX1RJTUVPVVRfQ0FQCQlUaGUgaW50ZXJmYWNlIGNhbiByZXBvcnQgdGhlIHRpbWUgbGVmdCB0aWxsCisgKgkJCQl3YXRjaGRvZyB0cmlnZ2VycyB0byBCeXBhc3MgbW9kZS4KKyAqCisgKjE2LTMxIFJFU0VSVkVECiAgKgogICogKiovCiBpbnQgZ2V0X2J5cGFzc19jYXBzX3NkKGludCBpZl9pbmRleCk7CkBAIC05NywzNCArMTE0LDM1IEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4CiAgKgogICogT3V0cHV0OgotICogCi0gKiBTZXQgb2YgbnVtYmVycyBkZWZpbmluZyB0aGUgdmFyaW91cyBwYXJhbWV0ZXJzIG9mIHRoZSB3YXRjaGRvZyBjYXBhYmxlIAorICoKKyAqIFNldCBvZiBudW1iZXJzIGRlZmluaW5nIHRoZSB2YXJpb3VzIHBhcmFtZXRlcnMgb2YgdGhlIHdhdGNoZG9nIGNhcGFibGUKICAqIHRvIGJlIHNldCB0byBhcyBkZXNjcmliZWQgYmVsbG93LgogICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCi0gKiAKKyAqCiAgKiBCaXQJZmVhdHVyZQkgICAgICAgIGRlc2NyaXB0aW9uCi0gKiAKKyAqCiAgKiAwLTMJV0RfTUlOX1RJTUUJICAgIFRoZSBpbnRlcmZhY2UgV0QgbWluaW1hbCB0aW1lIHBlcmlvZCAgaW4gMTAwbVMgdW5pdHMKLSAqIAotICogNAlXRF9TVEVQX1RJTUUJVGhlIHN0ZXBzIG9mIHRoZSBXRCB0aW1lciBpbiAKKyAqCisgKiA0CVdEX1NURVBfVElNRQlUaGUgc3RlcHMgb2YgdGhlIFdEIHRpbWVyIGluCiAgKiAgICAgICAgICAgICAgICAgICAgICAwIC0gZm9yIGxpbmVhciBzdGVwcyAoV0RfTUlOX1RJTUUgKiBYKQotICogICAgICAgICAgICAgICAgICAgICAgMSAtIGZvciBtdWx0aXBseSBieSAyIGZyb20gcHJldmlvdXMgc3RlcCAoV0RfTUlOX1RJTUUgKiAyXlgpCi0gKiAKLSAqIDUtOAlXRF9TVEVQX0NPVU5UCU51bWJlciBvZiBzdGVwcyB0aGUgV0QgdGltZXIgc3VwcG9ydHMgaW4gMl5YIAorICogICAgICAgICAgICAgICAgICAgICAgMSAtIGZvciBtdWx0aXBseSBieSAyIGZyb20gcHJldmlvdXMgc3RlcAorICogICAgICAgICAgICAgICAgICAgICAgICAgIChXRF9NSU5fVElNRSAqIDJeWCkKKyAqCisgKiA1LTgJV0RfU1RFUF9DT1VOVAlOdW1iZXIgb2Ygc3RlcHMgdGhlIFdEIHRpbWVyIHN1cHBvcnRzIGluIDJeWAogICogICAgICAgICAgICAgICAgICAgICAgKFggYml0IGF2YWlsYWJsZSBmb3IgZGVmaW5pbmcgdGhlIHZhbHVlKQotICogCi0gKiAKLSAqIAorICoKKyAqCisgKgogICoqLwogaW50IGdldF93ZF9zZXRfY2Fwc19zZChpbnQgaWZfaW5kZXgpOwogCiAvKioKICAqIHNldF9ieXBhc3MgLSBzZXQgQnlwYXNzIHN0YXRlCiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKLSAqIEBieXBhc3NfbW9kZTogIGJ5cGFzcyBtb2RlICgxPW9uLCAwPW9mZikgCisgKiBAYnlwYXNzX21vZGU6ICBieXBhc3MgbW9kZSAoMT1vbiwgMD1vZmYpCiAgKiBPdXRwdXQ6CiAgKiAgMCAtIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IHNldF9ieXBhc3Nfc2QoaW50IGlmX2luZGV4LCBpbnQgYnlwYXNzX21vZGUpOwogCkBAIC0xMzMsNyArMTUxLDcgQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgogICogIDAvMSAtIChvZmYvb24pIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IGdldF9ieXBhc3Nfc2QoaW50IGlmX2luZGV4KTsKIApAQCAtMTQyLDcgKzE2MCw3IEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKICAqIE91dHB1dDoKICAqICAwLzEgLSAob2ZmL29uKSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBnZXRfYnlwYXNzX2NoYW5nZV9zZChpbnQgaWZfaW5kZXgpOwogCkBAIC0xNTIsOCArMTcwLDggQEAKICAqIEBkaXNfYnlwYXNzOiBkaXNhYmxlIGJ5cGFzcygxPWRpcywgMD1lbikKICAqIE91dHB1dDoKICAqICAwIC0gb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X2Rpc19ieXBhc3Nfc2QoaW50IGlmX2luZGV4LCBpbnQgZGlzX2J5cGFzcyk7CiAKQEAgLTE2Miw4ICsxODAsOCBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBPdXRwdXQ6CiAgKiAgMC8xIC0gb24gc3VjY2VzcyAobm9ybWFsIEJ5cGFzcyBtb2RlLyBEaXNhYmxlIGJ5cGFzcykKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3IgZGV2aWNlIG5vdCBzdXBwb3J0CisgKiAgICAgICAgICAgICAgICAgIEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IGdldF9kaXNfYnlwYXNzX3NkKGludCBpZl9pbmRleCk7CiAKQEAgLTE3Miw5ICsxOTAsOSBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBAYnlwYXNzX21vZGU6IGJ5cGFzcyBtb2RlIHNldHRpbmcgYXQgcG93ZXIgb2ZmIHN0YXRlICgxPUJQIGVuLCAwPUJQIERpcykKICAqIE91dHB1dDoKLSAqICAwIC0gb24gc3VjY2VzcyAKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqICAwIC0gb24gc3VjY2VzcworICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X2J5cGFzc19wd29mZl9zZChpbnQgaWZfaW5kZXgsIGludCBieXBhc3NfbW9kZSk7CiAKQEAgLTE4Myw4ICsyMDEsOCBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBPdXRwdXQ6CiAgKiAgMC8xIC0gb24gc3VjY2VzcyAoRGlzYWJsZSBieXBhc3MgYXQgcG93ZXIgb2ZmIHN0YXRlIC8gbm9ybWFsIEJ5cGFzcyBtb2RlKQotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X2J5cGFzc19wd29mZl9zZChpbnQgaWZfaW5kZXgpOwogCkBAIC0xOTMsOSArMjExLDkgQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogQGJ5cGFzc19tb2RlOiBieXBhc3MgbW9kZSBzZXR0aW5nIGF0IHBvd2VyIHVwIHN0YXRlICgxPUJQIGVuLCAwPUJQIERpcykKICAqIE91dHB1dDoKLSAqICAwIC0gb24gc3VjY2VzcyAKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqICAwIC0gb24gc3VjY2VzcworICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X2J5cGFzc19wd3VwX3NkKGludCBpZl9pbmRleCwgaW50IGJ5cGFzc19tb2RlKTsKIApAQCAtMjA0LDU5ICsyMjIsNjAgQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgogICogIDAvMSAtIG9uIHN1Y2Nlc3MgKERpc2FibGUgYnlwYXNzIGF0IHBvd2VyIHVwIHN0YXRlIC8gbm9ybWFsIEJ5cGFzcyBtb2RlKQotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X2J5cGFzc19wd3VwX3NkKGludCBpZl9pbmRleCk7CiAKIC8qKgogICogc2V0X2J5cGFzc193ZCAtIFNldCB3YXRjaGRvZyBzdGF0ZQogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCi0gKiBAbXNfdGltZW91dDogcmVxdWVzdGVkIHRpbWVvdXQgKGluIG1zIHVuaXRzKSwgMCBmb3IgZGlzYWJsaW5nIHRoZSB3YXRjaGRvZyB0aW1lcgotICogQG1zX3RpbWVvdXRfc2V0KG91dHB1dCk6IHJlcXVlc3RlZCB0aW1lb3V0IChpbiBtcyB1bml0cyksIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIGFkYXB0ZXIgc3VwcG9ydHMgYW5kIHdpbGwgYmUgdXNlZCBieSB0aGUgd2F0Y2hkb2cKKyAqIEBtc190aW1lb3V0OiByZXF1ZXN0ZWQgdGltZW91dCAoaW4gbXMgdW5pdHMpLCAwIGZvciBkaXNhYmxpbmcgdGhlIHdhdGNoZG9nCisgKiAgICAgICAgICAgICAgdGltZXIKKyAqIEBtc190aW1lb3V0X3NldChvdXRwdXQpOiByZXF1ZXN0ZWQgdGltZW91dCAoaW4gbXMgdW5pdHMpLCB0aGF0IHRoZSBhZGFwdGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgYW5kIHdpbGwgYmUgdXNlZCBieSB0aGUgd2F0Y2hkb2cKICAqIE91dHB1dDoKLSAqIDAgIC0gb24gc3VjY2VzcyAKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIDAgIC0gb24gc3VjY2VzcworICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X2J5cGFzc193ZF9zZChpbnQgaWZfaW5kZXgsIGludCBtc190aW1lb3V0LCBpbnQgKm1zX3RpbWVvdXRfc2V0KTsKIAogLyoqCiAgKiBnZXRfYnlwYXNzX3dkIC0gR2V0IHdhdGNoZG9nIHN0YXRlCiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKLSAqIEBtc190aW1lb3V0IChvdXRwdXQpOiBXRFQgdGltZW91dCAoaW4gbXMgdW5pdHMpLCAKKyAqIEBtc190aW1lb3V0IChvdXRwdXQpOiBXRFQgdGltZW91dCAoaW4gbXMgdW5pdHMpLAogICogICAgICAgICAgICAgICAgICAgICAgIC0xIGZvciB1bmtub3duIHdkdCBzdGF0dXMKICAqICAgICAgICAgICAgICAgICAgICAgICAgMCBpZiBXRFQgaXMgZGlzYWJsZWQKICAqIE91dHB1dDoKICAqIDAgIC0gb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X2J5cGFzc193ZF9zZChpbnQgaWZfaW5kZXgsIGludCAqbXNfdGltZW91dF9zZXQpOwogCiAvKioKICAqIGdldF93ZF9leHBpcmVfdGltZSAtIEdldCB3YXRjaGRvZyBleHBpcmUKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQotICogQG1zX3RpbWVfbGVmdCAob3V0cHV0KTogdGltZSBsZWZ0IHRpbGwgd2F0Y2hkb2cgdGltZSBleHBpcmUsIAorICogQG1zX3RpbWVfbGVmdCAob3V0cHV0KTogdGltZSBsZWZ0IHRpbGwgd2F0Y2hkb2cgdGltZSBleHBpcmUsCiAgKiAgICAgICAgICAgICAgICAgICAgICAgLTEgaWYgV0RUIGhhcyBleHBpcmVkCiAgKiAgICAgICAgICAgICAgICAgICAgICAgMCAgaWYgV0RUIGlzIGRpc2FibGVkCiAgKiBPdXRwdXQ6CiAgKiAwICAtIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlIG9yIHVua25vd24gd2R0IHN0YXR1cykgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3Qgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSBvciB1bmtub3duIHdkdCBzdGF0dXMpCiAgKiovCiBpbnQgZ2V0X3dkX2V4cGlyZV90aW1lX3NkKGludCBpZl9pbmRleCwgaW50ICptc190aW1lX2xlZnQpOwogCiAvKioKICAqIHJlc2V0X2J5cGFzc193ZF90aW1lciAtIFJlc2V0IHdhdGNoZG9nIHRpbWVyCiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKLSAqIAorICoKICAqIE91dHB1dDoKICAqIDEgIC0gb24gc3VjY2VzcwogICogMCAtIHdhdGNoZG9nIGlzIG5vdCBjb25maWd1cmVkCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSBvciB1bmtub3duIHdkdCBzdGF0dXMpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2Ugb3IgdW5rbm93biB3ZHQgc3RhdHVzKQogICoqLwogaW50IHJlc2V0X2J5cGFzc193ZF90aW1lcl9zZChpbnQgaWZfaW5kZXgpOwogCkBAIC0yNjQsNTMgKzI4Myw1NCBAQAogICogc2V0X3N0ZF9uaWMgLSBTdGFuZGFyZCBOSUMgbW9kZSBvZiBvcGVyYXRpb24KICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogQG5pY19tb2RlOiAwLzEgKERlZmF1bHQgQnlwYXNzIG1vZGUgLyBTdGFuZGFyZCBOSUMgbW9kZSkKLSAqIAorICoKICAqIE91dHB1dDoKICAqIDAgIC0gb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X3N0ZF9uaWNfc2QoaW50IGlmX2luZGV4LCBpbnQgbmljX21vZGUpOwogCiAvKioKICAqIGdldF9zdGRfbmljIC0gR2V0IFN0YW5kYXJkIE5JQyBtb2RlIHNldHRpbmcKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQotICogCisgKgogICogT3V0cHV0OgogICogMC8xIChEZWZhdWx0IEJ5cGFzcyBtb2RlIC8gU3RhbmRhcmQgTklDIG1vZGUpIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3IgZGV2aWNlIG5vdCBzdXBwb3J0CisgKiAgICAgICAgICAgICAgICAgIEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IGdldF9zdGRfbmljX3NkKGludCBpZl9pbmRleCk7CiAKIC8qKgotICogc2V0X3R4IC0gc2V0IHRyYW5zbWl0dGVyIGVuYWJsZS9kaXNhYmxlIAorICogc2V0X3R4IC0gc2V0IHRyYW5zbWl0dGVyIGVuYWJsZS9kaXNhYmxlCiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKICAqIEB0eF9zdGF0ZTogMC8xIChUcmFuc21pdCBEaXNhYmxlIC8gVHJhbnNtaXQgRW5hYmxlKQotICogCisgKgogICogT3V0cHV0OgogICogMCAgLSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uICkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uICkKICAqKi8KIGludCBzZXRfdHhfc2QoaW50IGlmX2luZGV4LCBpbnQgdHhfc3RhdGUpOwogCiAvKioKICAqIGdldF9zdGRfbmljIC0gZ2V0IHRyYW5zbWl0dGVyIHN0YXRlIChkaXNhYmxlIC8gZW5hYmxlKQogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCi0gKiAKKyAqCiAgKiBPdXRwdXQ6CiAgKiAwLzEgKHJhbnNtaXQgRGlzYWJsZSAvIFRyYW5zbWl0IEVuYWJsZSkgb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzKQogICoqLwogaW50IGdldF90eF9zZChpbnQgaWZfaW5kZXgpOwogCiAvKioKICAqIHNldF90YXAgLSBzZXQgVEFQIHN0YXRlCiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKLSAqIEB0YXBfbW9kZTogMSB0YXAgbW9kZSAsIDAgbm9ybWFsIG5pYyBtb2RlIAorICogQHRhcF9tb2RlOiAxIHRhcCBtb2RlICwgMCBub3JtYWwgbmljIG1vZGUKICAqIE91dHB1dDoKICAqICAwIC0gb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgVEFQIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgVEFQIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X3RhcF9zZChpbnQgaWZfaW5kZXgsIGludCB0YXBfbW9kZSk7CiAKQEAgLTMxOSw3ICszMzksNyBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBPdXRwdXQ6CiAgKiAgMC8xIC0gKG9mZi9vbikgb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgVEFQIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgVEFQIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X3RhcF9zZChpbnQgaWZfaW5kZXgpOwogCkBAIC0zMjgsNyArMzQ4LDcgQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgogICogIDAvMSAtIChvZmYvb24pIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IFRBUCBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IFRBUCBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IGdldF90YXBfY2hhbmdlX3NkKGludCBpZl9pbmRleCk7CiAKQEAgLTMzOCw4ICszNTgsOCBAQAogICogQGRpc190YXA6IGRpc2FibGUgdGFwKDE9ZGlzLCAwPWVuKQogICogT3V0cHV0OgogICogIDAgLSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yZGV2aWNlIG5vdCBzdXBwb3J0IFRBUCAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3Qgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICBUQVAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBzZXRfZGlzX3RhcF9zZChpbnQgaWZfaW5kZXgsIGludCBkaXNfdGFwKTsKIApAQCAtMzQ4LDggKzM2OCw4IEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKICAqIE91dHB1dDoKICAqICAwLzEgLSBvbiBzdWNjZXNzIChub3JtYWwgVEFQIG1vZGUvIERpc2FibGUgVEFQKQotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBUQVAgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgVEFQIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X2Rpc190YXBfc2QoaW50IGlmX2luZGV4KTsKIApAQCAtMzU4LDkgKzM3OCw5IEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKICAqIEBieXBhc3NfbW9kZTogdGFwIG1vZGUgc2V0dGluZyBhdCBwb3dlciB1cCBzdGF0ZSAoMT1UQVAgZW4sIDA9VEFQIERpcykKICAqIE91dHB1dDoKLSAqICAwIC0gb24gc3VjY2VzcyAKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgVEFQIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqICAwIC0gb24gc3VjY2VzcworICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90CisgKiAgICAgICAgICAgICAgICAgIHN1cHBvcnQgVEFQIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X3RhcF9wd3VwX3NkKGludCBpZl9pbmRleCwgaW50IHRhcF9tb2RlKTsKIApAQCAtMzY5LDE4ICszODksMTggQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgogICogIDAvMSAtIG9uIHN1Y2Nlc3MgKERpc2FibGUgVEFQIGF0IHBvd2VyIHVwIHN0YXRlIC8gbm9ybWFsIFRBUCBtb2RlKQotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBUQVAgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90CisgKiAgICAgICAgICAgICAgICAgIHN1cHBvcnQgVEFQIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X3RhcF9wd3VwX3NkKGludCBpZl9pbmRleCk7CiAKIC8qKgogICogc2V0X2JwX2Rpc2MgLSBzZXQgRGlzY29ubmVjdCBzdGF0ZQogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCi0gKiBAdGFwX21vZGU6IDEgZGlzYyBtb2RlICwgMCBub24tZGlzYyBtb2RlIAorICogQHRhcF9tb2RlOiAxIGRpc2MgbW9kZSAsIDAgbm9uLWRpc2MgbW9kZQogICogT3V0cHV0OgogICogIDAgLSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBEaXNjb25uZWN0IG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgRGlzY29ubmVjdCBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IHNldF9icF9kaXNjX3NkKGludCBpZl9pbmRleCwgaW50IGRpc2NfbW9kZSk7CiAKQEAgLTM4OSw3ICs0MDksNyBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBPdXRwdXQ6CiAgKiAgMC8xIC0gKG9mZi9vbikgb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgRGlzY29ubmVjdCBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IERpc2Nvbm5lY3Qgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBnZXRfYnBfZGlzY19zZChpbnQgaWZfaW5kZXgpOwogCkBAIC0zOTgsNyArNDE4LDcgQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgogICogIDAvMSAtIChvZmYvb24pIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IERpc2Nvbm5lY3Qgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBEaXNjb25uZWN0IG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X2JwX2Rpc2NfY2hhbmdlX3NkKGludCBpZl9pbmRleCk7CiAKQEAgLTQwOCw4ICs0MjgsOCBAQAogICogQGRpc190YXA6IGRpc2FibGUgdGFwKDE9ZGlzLCAwPWVuKQogICogT3V0cHV0OgogICogIDAgLSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZnRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgRGlzY29ubmVjdCAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZnRoZSBvcGVyYXRpb24gb3IgZGV2aWNlIG5vdAorICogICAgICAgICAgICAgICAgICBzdXBwb3J0IERpc2Nvbm5lY3Qgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBzZXRfYnBfZGlzX2Rpc2Nfc2QoaW50IGlmX2luZGV4LCBpbnQgZGlzX2Rpc2MpOwogCkBAIC00MTgsOCArNDM4LDggQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgogICogIDAvMSAtIG9uIHN1Y2Nlc3MgKG5vcm1hbCBEaXNjb25uZWN0IG1vZGUvIERpc2FibGUgRGlzY29ubmVjdCkKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgRGlzY29ubmVjdCAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3QKKyAqICAgICAgICAgICAgICAgICAgc3VwcG9ydCBEaXNjb25uZWN0IG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X2JwX2Rpc19kaXNjX3NkKGludCBpZl9pbmRleCk7CiAKQEAgLTQyOCw5ICs0NDgsOSBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBAZGlzY19tb2RlOiB0YXAgbW9kZSBzZXR0aW5nIGF0IHBvd2VyIHVwIHN0YXRlICgxPURpc2MgZW4sIDA9RGlzYyBEaXMpCiAgKiBPdXRwdXQ6Ci0gKiAgMCAtIG9uIHN1Y2Nlc3MgCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yZGV2aWNlIG5vdCBzdXBwb3J0IERpc2Nvbm5lY3QgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogIDAgLSBvbiBzdWNjZXNzCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3QKKyAqICAgICAgICAgICAgICAgICAgc3VwcG9ydCBEaXNjb25uZWN0IG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X2JwX2Rpc2NfcHd1cF9zZChpbnQgaWZfaW5kZXgsIGludCBkaXNjX21vZGUpOwogCkBAIC00MzgsMTkgKzQ1OCwyMCBAQAogICogZ2V0X2JwX2Rpc2NfcHd1cCAtIEdldCBEaXNjb25uZWN0IG1vZGUgc3RhdGUgYXQgcG93ZXItdXAgc3RhdGUKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgotICogIDAvMSAtIG9uIHN1Y2Nlc3MgKERpc2FibGUgRGlzY29ubmVjdCBhdCBwb3dlciB1cCBzdGF0ZSAvIG5vcm1hbCBEaXNjb25uZWN0IG1vZGUpCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yZGV2aWNlIG5vdCBzdXBwb3J0IFRBUCAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAgMC8xIC0gb24gc3VjY2VzcyAoRGlzYWJsZSBEaXNjb25uZWN0IGF0IHBvd2VyIHVwIHN0YXRlIC8gbm9ybWFsIERpc2Nvbm5lY3QKKyAqICAgICAgICAgICAgICAgICAgICBtb2RlKQorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90CisgKiAgICAgICAgICAgICAgICAgIHN1cHBvcnQgVEFQIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X2JwX2Rpc2NfcHd1cF9zZChpbnQgaWZfaW5kZXgpOwogCiAvKioKICAqIHNldF93ZF9leHBfbW9kZSAtIFNldCBhZGFwdGVyIHN0YXRlIHdoZW4gV0RUIGV4cGlyZWQuCiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKLSAqIEBieXBhc3NfbW9kZTogIGFkYXB0ZXIgbW9kZSAoMT10YXAgbW9kZSwgMD1ieXBhc3MgbW9kZSkgCisgKiBAYnlwYXNzX21vZGU6ICBhZGFwdGVyIG1vZGUgKDE9dGFwIG1vZGUsIDA9YnlwYXNzIG1vZGUpCiAgKiBPdXRwdXQ6CiAgKiAgMCAtIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IHNldF93ZF9leHBfbW9kZV9zZChpbnQgaWZfaW5kZXgsIGludCBieXBhc3NfbW9kZSk7CiAKQEAgLTQ1OSwzOSArNDgwLDQxIEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKICAqIE91dHB1dDoKICAqICAwLzEgLSAoYnlwYXNzL3RhcCkgb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X3dkX2V4cF9tb2RlX3NkKGludCBpZl9pbmRleCk7CiAKIC8qKgogICogc2V0X3dkX2F1dG9yZXNldCAtIHJlc2V0IFdEVCBwZXJpb2RpY2FsbHkuCiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKLSAqIEBieXBhc3NfbW9kZTogIGFkYXB0ZXIgbW9kZSAoMT10YXAgbW9kZSwgMD1ieXBhc3MgbW9kZSkgCisgKiBAYnlwYXNzX21vZGU6ICBhZGFwdGVyIG1vZGUgKDE9dGFwIG1vZGUsIDA9YnlwYXNzIG1vZGUpCiAgKiBPdXRwdXQ6CiAgKiAxICAtIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlIG9yIHVua25vd24gd2R0IHN0YXR1cykgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3QKKyAqICAgICAgICAgICAgICAgICAgc3VwcG9ydCBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSBvciB1bmtub3duIHdkdAorICogICAgICAgICAgICAgICAgICBzdGF0dXMpCiAgKiovCiBpbnQgc2V0X3dkX2F1dG9yZXNldF9zZChpbnQgaWZfaW5kZXgsIGludCB0aW1lKTsKIAogLyoqCiAgKiBzZXRfd2RfYXV0b3Jlc2V0IC0gcmVzZXQgV0RUIHBlcmlvZGljYWxseS4KICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQotICogQGJ5cGFzc19tb2RlOiAgYWRhcHRlciBtb2RlICgxPXRhcCBtb2RlLCAwPWJ5cGFzcyBtb2RlKSAKKyAqIEBieXBhc3NfbW9kZTogIGFkYXB0ZXIgbW9kZSAoMT10YXAgbW9kZSwgMD1ieXBhc3MgbW9kZSkKICAqIE91dHB1dDoKICAqIDEgIC0gb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2Ugb3IgdW5rbm93biB3ZHQgc3RhdHVzKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3IgZGV2aWNlIG5vdAorICogICAgICAgICAgICAgICAgICBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlIG9yIHVua25vd24gd2R0CisgKiAgICAgICAgICAgICAgICAgIHN0YXR1cykKICAqKi8KIGludCBnZXRfd2RfYXV0b3Jlc2V0X3NkKGludCBpZl9pbmRleCk7CiAKIC8qKgogICogc2V0X3RwbCAtIHNldCBUUEwgc3RhdGUKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQotICogQHRwbF9tb2RlOiAxIHRwbCBtb2RlICwgMCBub3JtYWwgbmljIG1vZGUgCisgKiBAdHBsX21vZGU6IDEgdHBsIG1vZGUgLCAwIG5vcm1hbCBuaWMgbW9kZQogICogT3V0cHV0OgogICogIDAgLSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBUUEwpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgVFBMKQogICoqLwogaW50IHNldF90cGxfc2QoaW50IGlmX2luZGV4LCBpbnQgdHBsX21vZGUpOwogCkBAIC01MDAsNyArNTIzLDcgQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgogICogIDAvMSAtIChvZmYvb24pIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IFRQTCBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IFRQTCBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IGdldF90cGxfc2QoaW50IGlmX2luZGV4KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3MvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3MvUkVBRE1FCmluZGV4IDUzMDUyYzQuLjRmYTUwZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL1JFQURNRQorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9SRUFETUUKQEAgLTUsNDMgKzUsMyBAQAogCUthbGFoYXJpIGNhcmRzIChkdWFsIGFuZCBxdWFkIHBvcnQgUENJLWUgR2lnYWJpdCkgY29wcGVyIGFuZCBmaWJlcgogCiBUaGUgZHJpdmVyIHdhcyBhY3R1YWxseSB0ZXN0ZWQgb24gT2FzaXMgYW5kIEthbGFoYXJpIGNhcmRzLgotCi1UT0RPOgotCS0gbW92ZSBmaXJtd2FyZSBsb2FkaW5nIHRvIHJlcXVlc3RfZmlybXdhcmUoKQotCS0gcmVtb3ZlIGRpcmVjdCBtZW1vcnkgYWNjZXNzIG9mIHN0cnVjdHVyZXMKLQktIGFueSByZW1haW5pbmcgc3BhcnNlIGFuZCBjaGVja3BhdGNoLnBsIHdhcm5pbmdzCi0KLQktIHVzZSBuZXRfZGV2aWNlX29wcwotCS0gdXNlIGRldi0+c3RhdHMgcmF0aGVyIHRoYW4gYWRhcHRlci0+c3RhdHMKLQktIGRvbid0IGNhc3QgbmV0ZGV2X3ByaXYgaXQgaXMgYWxyZWFkeSB2b2lkCi0JLSBHRVQgUklEIE9GIE1BQ1JPUwotCS0gd29yayBvbiBhbGwgYXJjaGl0ZWN0dXJlcwotCSAgIC0gd2l0aG91dCBDT05GSUdfWDg2XzY0IGNvbmZ1c2lvbgotCSAgIC0gZG8gNjQgYml0IGNvcnJlY3RseQotCSAgIC0gZG9uJ3QgZGVwZW5kIG9uIG9yZGVyIG9mIHVuaW9uCi0JLSBnZXQgcmlkIG9mIEFTU0VSVCgpLCB1c2UgQlVHKCkgaW5zdGVhZCBidXQgb25seSB3aGVyZSBuZWNlc3NhcnkKLQkgIGxvb2tzIGxpa2UgbW9zdCBhcmVuJ3QgcmVhbGx5IHVzZWZ1bAotCS0gbm8gbmV3IFNJT0NERVZQUklWQVRFIGlvY3RsIGFsbG93ZWQKLQktIGRvbid0IHVzZSBtb2R1bGVfcGFyYW0gZm9yIGNvbmZpZ3VyaW5nIGludGVycnVwdCBtaXRpZ2F0aW9uCi0JICB1c2UgZXRodG9vbCBpbnN0ZWFkCi0JLSByZW9yZGVyIGNvZGUgdG8gZWxtaW5hdGUgdXNlIG9mIGZvcndhcmQgZGVjbGFyYXRpb25zCi0JLSBkb24ndCBrZWVwIHByaXZhdGUgbGlua2VkIGxpc3Qgb2YgZHJpdmVycy4KLQktIHJlbW92ZSBhbGwgdGhlIGdyYXRpdXRvdXMgZGVidWcgaW5mcmFzdHJ1Y3R1cmUKLQktIHVzZSBQQ0lfREVWSUNFKCkKLQktIGRvIGV0aHRvb2wgY29ycmVjdGx5IHVzaW5nIGV0aHRvb2xfb3BzCi0JLSBOQVBJPwotCS0gd2FzdGVkIG92ZXJoZWFkIG9mIGV4dHJhIHN0YXRzCi0JLSBzdGF0ZSB2YXJpYWJsZXMgZm9yIHRoaW5ncyB0aGF0IGFyZQotCSAgZWFzaWx5IGF2YWlsYWJsZSBhbmQgc2hvdWxkbid0IGJlIGtlcHQgaW4gY2FyZCBzdHJ1Y3R1cmUsIGNhcmRudW0sIC4uLgotCSAgc2xvdG51bWJlciwgZXZlbnRzLCAuLi4KLQktIGdldCByaWQgb2Ygc2xpY19zcGlubG9jayB3cmFwcGVyCi0JLSB2b2xhdGlsZSA9PSBiYWQgZGVzaWduID0+IGJhZCBjb2RlCi0JLSBsb2NraW5nIHRvbyBmaW5lIGdyYWluZWQsIG5vdCBkZXNpZ25lZCBqdXN0IHRocm93IG1vcmUgbG9ja3MKLQkgIGF0IHByb2JsZW0KLQotCi1QbGVhc2Ugc2VuZCBwYXRjaGVzIHRvOgotICAgICAgICBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBsaW51eGZvdW5kYXRpb24ub3JnPgotYW5kIENjOiBMaW9yIERvdGFuIDxsaW9kb3RAZ21haWwuY29tPiBhbmQgQ2hyaXN0b3BoZXIgSGFycmVyCi08Y2hhcnJlckBhbGFjcml0ZWNoLmNvbT4gYXMgd2VsbCBhcyB0aGV5IGFyZSBhbHNvIGFibGUgdG8gdGVzdCBvdXQgYW55Ci1jaGFuZ2VzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3MvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJmZjEwMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL1RPRE8KQEAgLTAsMCArMSwzOCBAQAorVE9ETzoKKwktIG1vdmUgZmlybXdhcmUgbG9hZGluZyB0byByZXF1ZXN0X2Zpcm13YXJlKCkKKwktIHJlbW92ZSBkaXJlY3QgbWVtb3J5IGFjY2VzcyBvZiBzdHJ1Y3R1cmVzCisJLSBhbnkgcmVtYWluaW5nIHNwYXJzZSBhbmQgY2hlY2twYXRjaC5wbCB3YXJuaW5ncworCisJLSB1c2UgbmV0X2RldmljZV9vcHMKKwktIHVzZSBkZXYtPnN0YXRzIHJhdGhlciB0aGFuIGFkYXB0ZXItPnN0YXRzCisJLSBkb24ndCBjYXN0IG5ldGRldl9wcml2IGl0IGlzIGFscmVhZHkgdm9pZAorCS0gR0VUIFJJRCBPRiBNQUNST1MKKwktIHdvcmsgb24gYWxsIGFyY2hpdGVjdHVyZXMKKwkgICAtIHdpdGhvdXQgQ09ORklHX1g4Nl82NCBjb25mdXNpb24KKwkgICAtIGRvIDY0IGJpdCBjb3JyZWN0bHkKKwkgICAtIGRvbid0IGRlcGVuZCBvbiBvcmRlciBvZiB1bmlvbgorCS0gZ2V0IHJpZCBvZiBBU1NFUlQoKSwgdXNlIEJVRygpIGluc3RlYWQgYnV0IG9ubHkgd2hlcmUgbmVjZXNzYXJ5CisJICBsb29rcyBsaWtlIG1vc3QgYXJlbid0IHJlYWxseSB1c2VmdWwKKwktIG5vIG5ldyBTSU9DREVWUFJJVkFURSBpb2N0bCBhbGxvd2VkCisJLSBkb24ndCB1c2UgbW9kdWxlX3BhcmFtIGZvciBjb25maWd1cmluZyBpbnRlcnJ1cHQgbWl0aWdhdGlvbgorCSAgdXNlIGV0aHRvb2wgaW5zdGVhZAorCS0gcmVvcmRlciBjb2RlIHRvIGVsbWluYXRlIHVzZSBvZiBmb3J3YXJkIGRlY2xhcmF0aW9ucworCS0gZG9uJ3Qga2VlcCBwcml2YXRlIGxpbmtlZCBsaXN0IG9mIGRyaXZlcnMuCisJLSByZW1vdmUgYWxsIHRoZSBncmF0aXV0b3VzIGRlYnVnIGluZnJhc3RydWN0dXJlCisJLSB1c2UgUENJX0RFVklDRSgpCisJLSBkbyBldGh0b29sIGNvcnJlY3RseSB1c2luZyBldGh0b29sX29wcworCS0gTkFQST8KKwktIHdhc3RlZCBvdmVyaGVhZCBvZiBleHRyYSBzdGF0cworCS0gc3RhdGUgdmFyaWFibGVzIGZvciB0aGluZ3MgdGhhdCBhcmUKKwkgIGVhc2lseSBhdmFpbGFibGUgYW5kIHNob3VsZG4ndCBiZSBrZXB0IGluIGNhcmQgc3RydWN0dXJlLCBjYXJkbnVtLCAuLi4KKwkgIHNsb3RudW1iZXIsIGV2ZW50cywgLi4uCisJLSBnZXQgcmlkIG9mIHNsaWNfc3BpbmxvY2sgd3JhcHBlcgorCS0gdm9sYXRpbGUgPT0gYmFkIGRlc2lnbiA9PiBiYWQgY29kZQorCS0gbG9ja2luZyB0b28gZmluZSBncmFpbmVkLCBub3QgZGVzaWduZWQganVzdCB0aHJvdyBtb3JlIGxvY2tzCisJICBhdCBwcm9ibGVtCisKK1BsZWFzZSBzZW5kIHBhdGNoZXMgdG86CisgICAgICAgIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQGxpbnV4Zm91bmRhdGlvbi5vcmc+CithbmQgQ2M6IExpb3IgRG90YW4gPGxpb2RvdEBnbWFpbC5jb20+IGFuZCBDaHJpc3RvcGhlciBIYXJyZXIKKzxjaGFycmVyQGFsYWNyaXRlY2guY29tPiBhcyB3ZWxsIGFzIHRoZXkgYXJlIGFsc28gYWJsZSB0byB0ZXN0IG91dCBhbnkKK2NoYW5nZXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljLmggYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljLmgKaW5kZXggNGM3ODIyYi4uNzAyOTAyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWMuaApAQCAtNDY0LDkgKzQ2NCwxMiBAQAogCS8qCiAJKiAgU0xJQyBIYW5kbGVzCiAJKi8KLQlzdHJ1Y3Qgc2xpY19oYW5kbGUgc2xpY19oYW5kbGVzW1NMSUNfQ01EUV9NQVhDTURTKzFdOyAvKiBPYmplY3QgaGFuZGxlcyovCi0Jc3RydWN0IHNsaWNfaGFuZGxlICpwZnJlZV9zbGljX2hhbmRsZXM7ICAgICAgICAgIC8qIEZyZWUgb2JqZWN0IGhhbmRsZXMqLwotCXN0cnVjdCBzbGljX3NwaW5sb2NrICAgICBoYW5kbGVfbG9jazsgICAgICAgICAgIC8qIE9iamVjdCBoYW5kbGUgbGlzdCBsb2NrKi8KKwkvKiBPYmplY3QgaGFuZGxlcyovCisJc3RydWN0IHNsaWNfaGFuZGxlIHNsaWNfaGFuZGxlc1tTTElDX0NNRFFfTUFYQ01EUysxXTsKKwkvKiBGcmVlIG9iamVjdCBoYW5kbGVzKi8KKwlzdHJ1Y3Qgc2xpY19oYW5kbGUgKnBmcmVlX3NsaWNfaGFuZGxlczsKKwkvKiBPYmplY3QgaGFuZGxlIGxpc3QgbG9jayovCisJc3RydWN0IHNsaWNfc3BpbmxvY2sgICAgIGhhbmRsZV9sb2NrOwogCXVzaG9ydCAgICAgICAgICAgICAgc2xpY19oYW5kbGVfaXg7CiAKIAl1MzIgICAgICAgICAgICAgeG1pdHFfZnVsbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYwppbmRleCAxNDI2Y2E0Li5lMjdiODhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jCkBAIC0xMDAsMTEgKzEwMCwxMSBAQAogI2luY2x1ZGUgInNsaWMuaCIKIAogc3RhdGljIHVpbnQgc2xpY19maXJzdF9pbml0ID0gMTsKLXN0YXRpYyBjaGFyICpzbGljX2Jhbm5lciA9ICJBbGFjcml0ZWNoIFNMSUMgVGVjaG5vbG9neSh0bSkgU2VydmVyICJcCitzdGF0aWMgY2hhciAqc2xpY19iYW5uZXIgPSAiQWxhY3JpdGVjaCBTTElDIFRlY2hub2xvZ3kodG0pIFNlcnZlciAiCiAJCSJhbmQgU3RvcmFnZSBBY2NlbGVyYXRvciAoTm9uLUFjY2VsZXJhdGVkKSI7CiAKIHN0YXRpYyBjaGFyICpzbGljX3Byb2NfdmVyc2lvbiA9ICIyLjAuMzUxICAyMDA2LzA3LzE0IDEyOjI2OjAwIjsKLXN0YXRpYyBjaGFyICpzbGljX3Byb2R1Y3RfbmFtZSA9ICJTTElDIFRlY2hub2xvZ3kodG0pIFNlcnZlciAiXAorc3RhdGljIGNoYXIgKnNsaWNfcHJvZHVjdF9uYW1lID0gIlNMSUMgVGVjaG5vbG9neSh0bSkgU2VydmVyICIKIAkJImFuZCBTdG9yYWdlIEFjY2VsZXJhdG9yIChOb24tQWNjZWxlcmF0ZWQpIjsKIHN0YXRpYyBjaGFyICpzbGljX3ZlbmRvciA9ICJBbGFjcml0ZWNoLCBJbmMuIjsKIApAQCAtMTQ0LDI5ICsxNDQsNiBAQAogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2xpY19wY2lfdGJsKTsKIAotI2RlZmluZSBTTElDX0dFVF9TTElDX0hBTkRMRShfYWRhcHRlciwgX3BzbGljX2hhbmRsZSkgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXNwaW5fbG9ja19pcnFzYXZlKCZfYWRhcHRlci0+aGFuZGxlX2xvY2subG9jaywgICAgICAgICAgICAgICAgICBcCi0JCQlfYWRhcHRlci0+aGFuZGxlX2xvY2suZmxhZ3MpOyAgICAgICAgICAgICAgICAgICBcCi0JX3BzbGljX2hhbmRsZSAgPSAgX2FkYXB0ZXItPnBmcmVlX3NsaWNfaGFuZGxlczsgICAgICAgICAgICAgICAgIFwKLQlpZiAoX3BzbGljX2hhbmRsZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlfYWRhcHRlci0+cGZyZWVfc2xpY19oYW5kbGVzID0gX3BzbGljX2hhbmRsZS0+bmV4dDsgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJl9hZGFwdGVyLT5oYW5kbGVfbG9jay5sb2NrLCAgICAgICAgICAgICBcCi0JCQlfYWRhcHRlci0+aGFuZGxlX2xvY2suZmxhZ3MpOyAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgU0xJQ19GUkVFX1NMSUNfSEFORExFKF9hZGFwdGVyLCBfcHNsaWNfaGFuZGxlKSAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlfcHNsaWNfaGFuZGxlLT50eXBlID0gU0xJQ19IQU5ETEVfRlJFRTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXNwaW5fbG9ja19pcnFzYXZlKCZfYWRhcHRlci0+aGFuZGxlX2xvY2subG9jaywgICAgICAgICAgICAgICAgICBcCi0JCQlfYWRhcHRlci0+aGFuZGxlX2xvY2suZmxhZ3MpOyAgICAgICAgICAgICAgICAgICBcCi0JX3BzbGljX2hhbmRsZS0+bmV4dCA9IF9hZGFwdGVyLT5wZnJlZV9zbGljX2hhbmRsZXM7ICAgICAgICAgICAgIFwKLQlfYWRhcHRlci0+cGZyZWVfc2xpY19oYW5kbGVzID0gX3BzbGljX2hhbmRsZTsgICAgICAgICAgICAgICAgICAgXAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJl9hZGFwdGVyLT5oYW5kbGVfbG9jay5sb2NrLCAgICAgICAgICAgICBcCi0JCQlfYWRhcHRlci0+aGFuZGxlX2xvY2suZmxhZ3MpOyAgICAgICAgICAgICAgICAgICBcCi19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzbGljX3JlZzMyX3dyaXRlKHZvaWQgX19pb21lbSAqcmVnLCB1MzIgdmFsdWUsIGJvb2wgZmx1c2gpCiB7CiAJd3JpdGVsKHZhbHVlLCByZWcpOwpAQCAtMTQ0Miw3ICsxNDE5LDEzIEBACiAJd2hpbGUgKChjbWRjbnQgPCBTTElDX0NNRFFfQ01EU0lOUEFHRSkgJiYKIAkgICAgICAgKGFkYXB0ZXItPnNsaWNfaGFuZGxlX2l4IDwgMjU2KSkgewogCQkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIFNMSUNfSEFORExFIGZvciB0aGlzIGNvbW1hbmQgKi8KLQkJU0xJQ19HRVRfU0xJQ19IQU5ETEUoYWRhcHRlciwgcHNsaWNfaGFuZGxlKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmhhbmRsZV9sb2NrLmxvY2ssCisJCQkJYWRhcHRlci0+aGFuZGxlX2xvY2suZmxhZ3MpOworCQlwc2xpY19oYW5kbGUgID0gIGFkYXB0ZXItPnBmcmVlX3NsaWNfaGFuZGxlczsKKwkJaWYgKHBzbGljX2hhbmRsZSkKKwkJCWFkYXB0ZXItPnBmcmVlX3NsaWNfaGFuZGxlcyA9IHBzbGljX2hhbmRsZS0+bmV4dDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+aGFuZGxlX2xvY2subG9jaywKKwkJCQlhZGFwdGVyLT5oYW5kbGVfbG9jay5mbGFncyk7CiAJCXBzbGljX2hhbmRsZS0+dHlwZSA9IFNMSUNfSEFORExFX0NNRDsKIAkJcHNsaWNfaGFuZGxlLT5hZGRyZXNzID0gKHZvaWQgKikgY21kOwogCQlwc2xpY19oYW5kbGUtPm9mZnNldCA9ICh1c2hvcnQpIGFkYXB0ZXItPnNsaWNfaGFuZGxlX2l4Kys7CkBAIC0xODMwLDcgKzE4MTMsNyBAQAogI2VuZGlmCiAKIAlzZXFfcHJpbnRmKHNlcSwgImRyaXZlcl92ZXJzaW9uICAgICAgICAgICA6ICVzXG4iLCBzbGljX3Byb2NfdmVyc2lvbik7Ci0Jc2VxX3B1dHMoc2VxLCAiTWljcm9jb2RlIHZlcnNpb25zOiAgICAgICAgICAgXG4iKTsKKwlzZXFfcHV0cyhzZXEsICJNaWNyb2NvZGUgdmVyc2lvbnM6XG4iKTsKIAlzZXFfcHJpbnRmKHNlcSwgIiAgICBHaWdhYml0IChnYikgICAgICAgICA6ICVzICVzXG4iLAogCQkgICAgTU9KQVZFX1VDT0RFX1ZFUlNfU1RSSU5HLCBNT0pBVkVfVUNPREVfVkVSU19EQVRFKTsKIAlzZXFfcHJpbnRmKHNlcSwgIiAgICBHaWdhYml0IFJlY2VpdmVyICAgICA6ICVzICVzXG4iLApAQCAtMTkxNywxNiArMTkwMCwxNCBAQAogCiAJCQlpZiAoY29uZmlnLT5PRU1GcnVGb3JtYXQgPT0gVkVORE9SNF9GUlVfRk9STUFUKSB7CiAJCQkJc2VxX3ByaW50ZihzZXEsCi0JCQkJCSAgICAiU2VyaWFsICAgIyAgICAgICAgICAgICAgIDogIgotCQkJCQkgICAgIiVjJWMlYyVjJWMlYyVjJWMlYyVjJWMlY1xuIiwKKwkJCQkJICAgICJTZXJpYWwgICAjICAgICAgICAgICAgICAgOiAlYyVjJWMlYyVjJWMlYyVjJWMlYyVjJWNcbiIsCiAJCQkJCSAgICBmcnVbOF0sIGZydVs5XSwgZnJ1WzEwXSwKIAkJCQkJICAgIGZydVsxMV0sIGZydVsxMl0sIGZydVsxM10sCiAJCQkJCSAgICBmcnVbMTZdLCBmcnVbMTddLCBmcnVbMThdLAogCQkJCQkgICAgZnJ1WzE5XSwgZnJ1WzIwXSwgZnJ1WzIxXSk7CiAJCQl9IGVsc2UgewogCQkJCXNlcV9wcmludGYoc2VxLAotCQkJCQkgICAgIlNlcmlhbCAgICMgICAgICAgICAgICAgICA6ICIKLQkJCQkJICAgICIlYyVjJWMlYyVjJWMlYyVjJWMlYyVjJWMlYyVjXG4iLAorCQkJCQkgICAgIlNlcmlhbCAgICMgICAgICAgICAgICAgICA6ICVjJWMlYyVjJWMlYyVjJWMlYyVjJWMlYyVjJWNcbiIsCiAJCQkJCSAgICBmcnVbOF0sIGZydVs5XSwgZnJ1WzEwXSwKIAkJCQkJICAgIGZydVsxMV0sIGZydVsxMl0sIGZydVsxM10sCiAJCQkJCSAgICBmcnVbMTRdLCBmcnVbMTVdLCBmcnVbMTZdLApAQCAtMTk3NCw4ICsxOTU1LDcgQEAKIAkJewogCQkJc2VxX3B1dHMoc2VxLCAiRlJVIEluZm9ybWF0aW9uOlxuIik7CiAJCQlzZXFfcHJpbnRmKHNlcSwKLQkJCQkgICAgIiAgICBQYXJ0ICAgICAjICAgICAgICAgICA6ICIKLQkJCQkgICAgIiVjJWMlYyVjJWMlYyVjJWNcbiIsCisJCQkJICAgICIgICAgUGFydCAgICAgIyAgICAgICAgICAgOiAlYyVjJWMlYyVjJWMlYyVjXG4iLAogCQkJCSAgICBvZW1mcnVbMF0sIG9lbWZydVsxXSwgb2VtZnJ1WzJdLAogCQkJCSAgICBvZW1mcnVbM10sIG9lbWZydVs0XSwgb2VtZnJ1WzVdLAogCQkJCSAgICBvZW1mcnVbNl0sIG9lbWZydVs3XSk7CkBAIC0yMDAyLDIwICsxOTgyLDE3IEBACiAJCXsKIAkJCXNlcV9wdXRzKHNlcSwgIkZSVSBJbmZvcm1hdGlvbjpcbiIpOwogCQkJc2VxX3ByaW50ZihzZXEsCi0JCQkJICAgICIgICAgRlJVIE51bWJlciAgICAgICAgICAgOiAiCi0JCQkJICAgICIlYyVjJWMlYyVjJWMlYyVjXG4iLAorCQkJCSAgICAiICAgIEZSVSBOdW1iZXIgICAgICAgICAgIDogJWMlYyVjJWMlYyVjJWMlY1xuIiwKIAkJCQkgICAgb2VtZnJ1WzBdLCBvZW1mcnVbMV0sIG9lbWZydVsyXSwKIAkJCQkgICAgb2VtZnJ1WzNdLCBvZW1mcnVbNF0sIG9lbWZydVs1XSwKIAkJCQkgICAgb2VtZnJ1WzZdLCBvZW1mcnVbN10pOwogCQkJc2VxX3NwcmludGYoc2VxLAotCQkJCSAgICAiICAgIFBhcnQgTnVtYmVyICAgICAgICAgIDogIgotCQkJCSAgICAiJWMlYyVjJWMlYyVjJWMlY1xuIiwKKwkJCQkgICAgIiAgICBQYXJ0IE51bWJlciAgICAgICAgICA6ICVjJWMlYyVjJWMlYyVjJWNcbiIsCiAJCQkJICAgIG9lbWZydVs4XSwgb2VtZnJ1WzldLCBvZW1mcnVbMTBdLAogCQkJCSAgICBvZW1mcnVbMTFdLCBvZW1mcnVbMTJdLCBvZW1mcnVbMTNdLAogCQkJCSAgICBvZW1mcnVbMTRdLCBvZW1mcnVbMTVdKTsKIAkJCXNlcV9wcmludGYoc2VxLAotCQkJCSAgICAiICAgIEVDIExldmVsICAgICAgICAgICAgIDogIgotCQkJCSAgICAiJWMlYyVjJWMlYyVjJWMlY1xuIiwKKwkJCQkgICAgIiAgICBFQyBMZXZlbCAgICAgICAgICAgICA6ICVjJWMlYyVjJWMlYyVjJWNcbiIsCiAJCQkJICAgIG9lbWZydVsxNl0sIG9lbWZydVsxN10sIG9lbWZydVsxOF0sCiAJCQkJICAgIG9lbWZydVsxOV0sIG9lbWZydVsyMF0sIG9lbWZydVsyMV0sCiAJCQkJICAgIG9lbWZydVsyMl0sIG9lbWZydVsyM10pOwpAQCAtMjQxMiw4ICsyMzg5LDcgQEAKIAkJc3dpdGNoIChzdGF0dXMpIHsKIAkJY2FzZSBYTUlUX0ZBSUxfTElOS19TVEFURToKIAkJCWRldl9lcnIoJmFkYXB0ZXItPm5ldGRldi0+ZGV2LAotCQkJCSJyZWplY3QgeG1pdCBza2JbJXA6ICV4XSBsaW5rc3RhdGVbJXNdICIKLQkJCQkiYWRhcHRlclslczolZF0gY2FyZFslczolZF1cbiIsCisJCQkJInJlamVjdCB4bWl0IHNrYlslcDogJXhdIGxpbmtzdGF0ZVslc10gYWRhcHRlclslczolZF0gY2FyZFslczolZF1cbiIsCiAJCQkJc2tiLCBza2ItPnBrdF90eXBlLAogCQkJCVNMSUNfTElOS1NUQVRFKGFkYXB0ZXItPmxpbmtzdGF0ZSksCiAJCQkJU0xJQ19BREFQVEVSX1NUQVRFKGFkYXB0ZXItPnN0YXRlKSwKQEAgLTI0MjgsOCArMjQwNCw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBYTUlUX0ZBSUxfSE9TVENNRF9GQUlMOgogCQkJZGV2X2VycigmYWRhcHRlci0+bmV0ZGV2LT5kZXYsCi0JCQkJInhtaXRfc3RhcnQgc2tiWyVwXSB0eXBlWyV4XSBObyBob3N0IGNvbW1hbmRzICIKLQkJCQkiYXZhaWxhYmxlXG4iLCBza2IsIHNrYi0+cGt0X3R5cGUpOworCQkJCSJ4bWl0X3N0YXJ0IHNrYlslcF0gdHlwZVsleF0gTm8gaG9zdCBjb21tYW5kcyBhdmFpbGFibGVcbiIsIHNrYiwgc2tiLT5wa3RfdHlwZSk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTI2NDIsOCArMjYxNyw3IEBACiAJCQkJfQogCQkJfSBlbHNlIGlmIChpc3IgJiBJU1JfWERST1ApIHsKIAkJCQlkZXZfZXJyKCZkZXYtPmRldiwKLQkJCQkJCSJpc3IgJiBJU1JfRVJSIFsleF0gIgotCQkJCQkJIklTUl9YRFJPUCBcbiIsIGlzcik7CisJCQkJCQkiaXNyICYgSVNSX0VSUiBbJXhdIElTUl9YRFJPUFxuIiwgaXNyKTsKIAkJCX0gZWxzZSB7CiAJCQkJZGV2X2VycigmZGV2LT5kZXYsCiAJCQkJCQkiaXNyICYgSVNSX0VSUiBbJXhdXG4iLApAQCAtMjk3MCw3ICsyOTQ0LDcgQEAKIHsKIAlpZiAoY2FyZC0+bG9hZHRpbWVyc2V0KSB7CiAJCWNhcmQtPmxvYWR0aW1lcnNldCA9IDA7Ci0JCWRlbF90aW1lcigmY2FyZC0+bG9hZHRpbWVyKTsKKwkJZGVsX3RpbWVyX3N5bmMoJmNhcmQtPmxvYWR0aW1lcik7CiAJfQogCiAJc2xpY19kZWJ1Z19jYXJkX2Rlc3Ryb3koY2FyZCk7CkBAIC0zMjY5LDggKzMyNDMsNyBAQAogCiAJCWlmICghcGVlcHJvbSkgewogCQkJZGV2X2VycigmYWRhcHRlci0+cGNpZGV2LT5kZXYsCi0JCQkJImVlcHJvbSByZWFkIGZhaWxlZCB0byBnZXQgbWVtb3J5ICIKLQkJCQkiYnVzICVkIHNsb3QgJWRcbiIsIGFkYXB0ZXItPmJ1c251bWJlciwKKwkJCQkiZWVwcm9tIHJlYWQgZmFpbGVkIHRvIGdldCBtZW1vcnkgYnVzICVkIHNsb3QgJWRcbiIsIGFkYXB0ZXItPmJ1c251bWJlciwKIAkJCQlhZGFwdGVyLT5zbG90bnVtYmVyKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9IGVsc2UgewpAQCAtMzcwMyw3ICszNjc2LDcgQEAKIAllcnIgPSBzbGljX2NhcmRfbG9jYXRlKGFkYXB0ZXIpOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGNpZGV2LT5kZXYsICJjYW5ub3QgbG9jYXRlIGNhcmRcbiIpOwotCQlnb3RvIGVycl9vdXRfZnJlZV9tbWlvX3JlZ2lvbjsKKwkJZ290byBlcnJfb3V0X3VubWFwOwogCX0KIAogCWNhcmQgPSBhZGFwdGVyLT5jYXJkOwpAQCAtMzc0Myw4ICszNzE2LDYgQEAKIAogZXJyX291dF91bm1hcDoKIAlpb3VubWFwKG1lbW1hcHBlZF9pb2FkZHIpOwotZXJyX291dF9mcmVlX21taW9fcmVnaW9uOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihtbWlvX3N0YXJ0LCBtbWlvX2xlbik7CiBlcnJfb3V0X2ZyZWVfbmV0ZGV2OgogCWZyZWVfbmV0ZGV2KG5ldGRldik7CiBlcnJfb3V0X2V4aXRfc2xpY19wcm9iZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvc203eHhmYi9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjkyMmFlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1jb25maWcgRkJfU003WFgKLQl0cmlzdGF0ZSAiU2lsaWNvbiBNb3Rpb24gU003WFggZnJhbWVidWZmZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEZCICYmIFBDSQotCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKLQlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCi0Jc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKLQloZWxwCi0JICBGcmFtZSBidWZmZXIgZHJpdmVyIGZvciB0aGUgU2lsaWNvbiBNb3Rpb24gU003MTAsIFNNNzEyLCBTTTcyMQotCSAgYW5kIFNNNzIyIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZS4gVGhlIG1vZHVsZSB3aWxsIGJlCi0JICBjYWxsZWQgc203eHhmYi4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0KLQkgIGhlcmUgYW5kIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9rYnVpbGQvbW9kdWxlcy50eHQ+LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvc203eHhmYi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmNDcxY2YuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vYmotJChDT05GSUdfRkJfU003WFgpICs9IHNtN3h4ZmIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmY2VhZDUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotVE9ETzoKLS0gRHVhbCBoZWFkIHN1cHBvcnQKLS0gMkQgYWNjZWxlcmF0aW9uIHN1cHBvcnQKLS0gdXNlIGtlcm5lbCBjb2Rpbmcgc3R5bGUKLS0gcmVmaW5lIHRoZSBjb2RlIGFuZCByZW1vdmUgdW51c2VkIGNvZGUKLS0gbW92ZSBpdCB0byBkcml2ZXJzL3ZpZGVvL3NtN3h4ZmIuYwotCi1QbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQKLVRlZGR5IFdhbmcgPHRlZGR5LndhbmdAc2lsaWNvbm1vdGlvbi5jb20uY24+LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvc203eHguaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL3NtN3h4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OTk4NjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvc203eHguaAorKysgL2Rldi9udWxsCkBAIC0xLDc3OSArMCwwIEBACi0vKgotICogU2lsaWNvbiBNb3Rpb24gU003MTIgZnJhbWUgYnVmZmVyIGRldmljZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBTaWxpY29uIE1vdGlvbiBUZWNobm9sb2d5IENvcnAuCi0gKiBBdXRob3JzOglHZSBXYW5nLCBnZXdhbmdAc2lsaWNvbm1vdGlvbi5jb20KLSAqCQlCb3lvZCBib3lvZC55YW5nQHNpbGljb25tb3Rpb24uY29tLmNuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IExlbW90ZSwgSW5jLgotICogQXV0aG9yOiBXdSBaaGFuZ2ppbiwgd3V6aGFuZ2ppbkBnbWFpbC5jb20KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgotICogIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jZGVmaW5lIE5SX1BBTEVUVEUgICAgICAgIDI1NgotCi0jZGVmaW5lIEZCX0FDQ0VMX1NNSV9MWU5YIDg4Ci0KLSNkZWZpbmUgU0NSRUVOX1hfUkVTICAgICAgMTAyNAotI2RlZmluZSBTQ1JFRU5fWV9SRVMgICAgICA2MDAKLSNkZWZpbmUgU0NSRUVOX0JQUCAgICAgICAgMTYKLQotLypBc3N1bWUgU003MTIgZ3JhcGhpY3MgY2hpcCBoYXMgNE1CIFZSQU0gKi8KLSNkZWZpbmUgU003MTJfVklERU9NRU1PUllTSVpFCSAgMHgwMDQwMDAwMAotLypBc3N1bWUgU003MjIgZ3JhcGhpY3MgY2hpcCBoYXMgOE1CIFZSQU0gKi8KLSNkZWZpbmUgU003MjJfVklERU9NRU1PUllTSVpFCSAgMHgwMDgwMDAwMAotCi0jZGVmaW5lIGRhY19yZWcJKDB4M2M4KQotI2RlZmluZSBkYWNfdmFsCSgweDNjOSkKLQotZXh0ZXJuIHZvaWQgX19pb21lbSAqc210Y19SZWdCYXNlQWRkcmVzczsKLSNkZWZpbmUgc210Y19tbWlvd2IoZGF0LCByZWcpCXdyaXRlYihkYXQsIHNtdGNfUmVnQmFzZUFkZHJlc3MgKyByZWcpCi0jZGVmaW5lIHNtdGNfbW1pb3d3KGRhdCwgcmVnKQl3cml0ZXcoZGF0LCBzbXRjX1JlZ0Jhc2VBZGRyZXNzICsgcmVnKQotI2RlZmluZSBzbXRjX21taW93bChkYXQsIHJlZykJd3JpdGVsKGRhdCwgc210Y19SZWdCYXNlQWRkcmVzcyArIHJlZykKLQotI2RlZmluZSBzbXRjX21taW9yYihyZWcpCXJlYWRiKHNtdGNfUmVnQmFzZUFkZHJlc3MgKyByZWcpCi0jZGVmaW5lIHNtdGNfbW1pb3J3KHJlZykJcmVhZHcoc210Y19SZWdCYXNlQWRkcmVzcyArIHJlZykKLSNkZWZpbmUgc210Y19tbWlvcmwocmVnKQlyZWFkbChzbXRjX1JlZ0Jhc2VBZGRyZXNzICsgcmVnKQotCi0jZGVmaW5lIFNJWkVfU1IwMF9TUjA0ICAgICAgKDB4MDQgLSAweDAwICsgMSkKLSNkZWZpbmUgU0laRV9TUjEwX1NSMjQgICAgICAoMHgyNCAtIDB4MTAgKyAxKQotI2RlZmluZSBTSVpFX1NSMzBfU1I3NSAgICAgICgweDc1IC0gMHgzMCArIDEpCi0jZGVmaW5lIFNJWkVfU1I4MF9TUjkzICAgICAgKDB4OTMgLSAweDgwICsgMSkKLSNkZWZpbmUgU0laRV9TUkEwX1NSQUYgICAgICAoMHhBRiAtIDB4QTAgKyAxKQotI2RlZmluZSBTSVpFX0dSMDBfR1IwOCAgICAgICgweDA4IC0gMHgwMCArIDEpCi0jZGVmaW5lIFNJWkVfQVIwMF9BUjE0ICAgICAgKDB4MTQgLSAweDAwICsgMSkKLSNkZWZpbmUgU0laRV9DUjAwX0NSMTggICAgICAoMHgxOCAtIDB4MDAgKyAxKQotI2RlZmluZSBTSVpFX0NSMzBfQ1I0RCAgICAgICgweDREIC0gMHgzMCArIDEpCi0jZGVmaW5lIFNJWkVfQ1I5MF9DUkE3ICAgICAgKDB4QTcgLSAweDkwICsgMSkKLSNkZWZpbmUgU0laRV9WUFIJCSgweDZDICsgMSkKLSNkZWZpbmUgU0laRV9EUFIJCSgweDQ0ICsgMSkKLQotc3RhdGljIGlubGluZSB2b2lkIHNtdGNfY3J0Y3coaW50IHJlZywgaW50IHZhbCkKLXsKLQlzbXRjX21taW93YihyZWcsIDB4M2Q0KTsKLQlzbXRjX21taW93Yih2YWwsIDB4M2Q1KTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc210Y19jcnRjcihpbnQgcmVnKQotewotCXNtdGNfbW1pb3diKHJlZywgMHgzZDQpOwotCXJldHVybiBzbXRjX21taW9yYigweDNkNSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzbXRjX2dycGh3KGludCByZWcsIGludCB2YWwpCi17Ci0Jc210Y19tbWlvd2IocmVnLCAweDNjZSk7Ci0Jc210Y19tbWlvd2IodmFsLCAweDNjZik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNtdGNfZ3JwaHIoaW50IHJlZykKLXsKLQlzbXRjX21taW93YihyZWcsIDB4M2NlKTsKLQlyZXR1cm4gc210Y19tbWlvcmIoMHgzY2YpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc210Y19hdHRydyhpbnQgcmVnLCBpbnQgdmFsKQotewotCXNtdGNfbW1pb3JiKDB4M2RhKTsKLQlzbXRjX21taW93YihyZWcsIDB4M2MwKTsKLQlzbXRjX21taW9yYigweDNjMSk7Ci0Jc210Y19tbWlvd2IodmFsLCAweDNjMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzbXRjX3NlcXcoaW50IHJlZywgaW50IHZhbCkKLXsKLQlzbXRjX21taW93YihyZWcsIDB4M2M0KTsKLQlzbXRjX21taW93Yih2YWwsIDB4M2M1KTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc210Y19zZXFyKGludCByZWcpCi17Ci0Jc210Y19tbWlvd2IocmVnLCAweDNjNCk7Ci0JcmV0dXJuIHNtdGNfbW1pb3JiKDB4M2M1KTsKLX0KLQotLyogVGhlIG5leHQgc3RydWN0dXJlIGhvbGRzIGFsbCBpbmZvcm1hdGlvbiByZWxldmFudCBmb3IgYSBzcGVjaWZpYyB2aWRlbyBtb2RlLgotICovCi0KLXN0cnVjdCBNb2RlSW5pdCB7Ci0JaW50IG1tU2l6ZVg7Ci0JaW50IG1tU2l6ZVk7Ci0JaW50IGJwcDsKLQlpbnQgaHo7Ci0JdW5zaWduZWQgY2hhciBJbml0X01JU0M7Ci0JdW5zaWduZWQgY2hhciBJbml0X1NSMDBfU1IwNFtTSVpFX1NSMDBfU1IwNF07Ci0JdW5zaWduZWQgY2hhciBJbml0X1NSMTBfU1IyNFtTSVpFX1NSMTBfU1IyNF07Ci0JdW5zaWduZWQgY2hhciBJbml0X1NSMzBfU1I3NVtTSVpFX1NSMzBfU1I3NV07Ci0JdW5zaWduZWQgY2hhciBJbml0X1NSODBfU1I5M1tTSVpFX1NSODBfU1I5M107Ci0JdW5zaWduZWQgY2hhciBJbml0X1NSQTBfU1JBRltTSVpFX1NSQTBfU1JBRl07Ci0JdW5zaWduZWQgY2hhciBJbml0X0dSMDBfR1IwOFtTSVpFX0dSMDBfR1IwOF07Ci0JdW5zaWduZWQgY2hhciBJbml0X0FSMDBfQVIxNFtTSVpFX0FSMDBfQVIxNF07Ci0JdW5zaWduZWQgY2hhciBJbml0X0NSMDBfQ1IxOFtTSVpFX0NSMDBfQ1IxOF07Ci0JdW5zaWduZWQgY2hhciBJbml0X0NSMzBfQ1I0RFtTSVpFX0NSMzBfQ1I0RF07Ci0JdW5zaWduZWQgY2hhciBJbml0X0NSOTBfQ1JBN1tTSVpFX0NSOTBfQ1JBN107Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkJIFNNNzEyIE1vZGUgdGFibGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBNb2RlSW5pdCBWR0FNb2RlW10gPSB7Ci0JewotCSAvKiAgbW9kZSMwOiA2NDAgeCA0ODAgIDE2QnBwICA2MEh6ICovCi0JIDY0MCwgNDgwLCAxNiwgNjAsCi0JIC8qICBJbml0X01JU0MgKi8KLQkgMHhFMywKLQkgewkJCS8qICBJbml0X1NSMF9TUjQgKi8KLQkgIDB4MDMsIDB4MDEsIDB4MEYsIDB4MDAsIDB4MEUsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1IxMF9TUjI0ICovCi0JICAweEZGLCAweEJFLCAweEVGLCAweEZGLCAweDAwLCAweDBFLCAweDE3LCAweDJDLAotCSAgMHg5OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4QzQsIDB4MzAsIDB4MDIsIDB4MDEsIDB4MDEsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1IzMF9TUjc1ICovCi0JICAweDMyLCAweDAzLCAweEEwLCAweDA5LCAweEMwLCAweDMyLCAweDMyLCAweDMyLAotCSAgMHgzMiwgMHgzMiwgMHgzMiwgMHgzMiwgMHgwMCwgMHgwMCwgMHgwMywgMHhGRiwKLQkgIDB4MDAsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MTgsIDB4MDAsIDB4RkMsCi0JICAweDIwLCAweDBDLCAweDQ0LCAweDIwLCAweDAwLCAweDMyLCAweDMyLCAweDMyLAotCSAgMHgwNCwgMHgyNCwgMHg2MywgMHg0RiwgMHg1MiwgMHgwQiwgMHhERiwgMHhFQSwKLQkgIDB4MDQsIDB4NTAsIDB4MTksIDB4MzIsIDB4MzIsIDB4MDAsIDB4MDAsIDB4MzIsCi0JICAweDAxLCAweDgwLCAweDdFLCAweDFBLCAweDFBLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHg1MCwgMHgwMywgMHg3NCwgMHgxNCwgMHgwNywgMHg4MiwgMHgwNywgMHgwNCwKLQkgIDB4MDAsIDB4NDUsIDB4MzAsIDB4MzAsIDB4NDAsIDB4MzAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1I4MF9TUjkzICovCi0JICAweEZGLCAweDA3LCAweDAwLCAweDZGLCAweDdGLCAweDdGLCAweEZGLCAweDMyLAotCSAgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhGRiwgMHgzMiwgMHgzMiwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1JBMF9TUkFGICovCi0JICAweDAwLCAweEZGLCAweEJGLCAweEZGLCAweEZGLCAweEVELCAweEVELCAweEVELAotCSAgMHg3QiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRiwgMHhFRiwgMHhGRiwgMHhERiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9HUjAwX0dSMDggKi8KLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDUsIDB4MEYsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0FSMDBfQVIxNCAqLwotCSAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKLQkgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCi0JICAweDQxLCAweDAwLCAweDBGLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMDBfQ1IxOCAqLwotCSAgMHg1RiwgMHg0RiwgMHg0RiwgMHgwMCwgMHg1MywgMHgxRiwgMHgwQiwgMHgzRSwKLQkgIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweEVBLCAweDBDLCAweERGLCAweDUwLCAweDQwLCAweERGLCAweDAwLCAweEUzLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjMwX0NSNEQgKi8KLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTUsIDB4MDMsIDB4MjAsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweEU3LCAweEZGLCAweEZELAotCSAgMHg1RiwgMHg0RiwgMHgwMCwgMHg1NCwgMHgwMCwgMHgwQiwgMHhERiwgMHgwMCwKLQkgIDB4RUEsIDB4MEMsIDB4MkUsIDB4MDAsIDB4NEYsIDB4REYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1I5MF9DUkE3ICovCi0JICAweDU2LCAweERELCAweDVFLCAweEVBLCAweDg3LCAweDQ0LCAweDhGLCAweDU1LAotCSAgMHgwQSwgMHg4RiwgMHg1NSwgMHgwQSwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwKLQkgIDB4MTEsIDB4MTAsIDB4MEIsIDB4MEEsIDB4MEEsIDB4MEEsIDB4MEEsIDB4MDAsCi0JICB9LAotCSB9LAotCXsKLQkgLyogIG1vZGUjMTogNjQwIHggNDgwICAyNEJwcCAgNjBIeiAqLwotCSA2NDAsIDQ4MCwgMjQsIDYwLAotCSAvKiAgSW5pdF9NSVNDICovCi0JIDB4RTMsCi0JIHsJCQkvKiAgSW5pdF9TUjBfU1I0ICovCi0JICAweDAzLCAweDAxLCAweDBGLCAweDAwLCAweDBFLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMTBfU1IyNCAqLwotCSAgMHhGRiwgMHhCRSwgMHhFRiwgMHhGRiwgMHgwMCwgMHgwRSwgMHgxNywgMHgyQywKLQkgIDB4OTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweEM0LCAweDMwLCAweDAyLCAweDAxLCAweDAxLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMzBfU1I3NSAqLwotCSAgMHgzMiwgMHgwMywgMHhBMCwgMHgwOSwgMHhDMCwgMHgzMiwgMHgzMiwgMHgzMiwKLQkgIDB4MzIsIDB4MzIsIDB4MzIsIDB4MzIsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RkYsCi0JICAweDAwLCAweEZDLCAweDAwLCAweDAwLCAweDIwLCAweDE4LCAweDAwLCAweEZDLAotCSAgMHgyMCwgMHgwQywgMHg0NCwgMHgyMCwgMHgwMCwgMHgzMiwgMHgzMiwgMHgzMiwKLQkgIDB4MDQsIDB4MjQsIDB4NjMsIDB4NEYsIDB4NTIsIDB4MEIsIDB4REYsIDB4RUEsCi0JICAweDA0LCAweDUwLCAweDE5LCAweDMyLCAweDMyLCAweDAwLCAweDAwLCAweDMyLAotCSAgMHgwMSwgMHg4MCwgMHg3RSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4NTAsIDB4MDMsIDB4NzQsIDB4MTQsIDB4MDcsIDB4ODIsIDB4MDcsIDB4MDQsCi0JICAweDAwLCAweDQ1LCAweDMwLCAweDMwLCAweDQwLCAweDMwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSODBfU1I5MyAqLwotCSAgMHhGRiwgMHgwNywgMHgwMCwgMHg2RiwgMHg3RiwgMHg3RiwgMHhGRiwgMHgzMiwKLQkgIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RkYsIDB4MzIsIDB4MzIsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSQTBfU1JBRiAqLwotCSAgMHgwMCwgMHhGRiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhFRCwgMHhFRCwKLQkgIDB4N0IsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RUYsIDB4RkYsIDB4REYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfR1IwMF9HUjA4ICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDA1LCAweDBGLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9BUjAwX0FSMTQgKi8KLQkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCi0JICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAotCSAgMHg0MSwgMHgwMCwgMHgwRiwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjAwX0NSMTggKi8KLQkgIDB4NUYsIDB4NEYsIDB4NEYsIDB4MDAsIDB4NTMsIDB4MUYsIDB4MEIsIDB4M0UsCi0JICAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHhFQSwgMHgwQywgMHhERiwgMHg1MCwgMHg0MCwgMHhERiwgMHgwMCwgMHhFMywKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IzMF9DUjREICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDU1LCAweDAzLCAweDIwLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHhFNywgMHhGRiwgMHhGRCwKLQkgIDB4NUYsIDB4NEYsIDB4MDAsIDB4NTQsIDB4MDAsIDB4MEIsIDB4REYsIDB4MDAsCi0JICAweEVBLCAweDBDLCAweDJFLCAweDAwLCAweDRGLCAweERGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSOTBfQ1JBNyAqLwotCSAgMHg1NiwgMHhERCwgMHg1RSwgMHhFQSwgMHg4NywgMHg0NCwgMHg4RiwgMHg1NSwKLQkgIDB4MEEsIDB4OEYsIDB4NTUsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsCi0JICAweDExLCAweDEwLCAweDBCLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDAwLAotCSAgfSwKLQkgfSwKLQl7Ci0JIC8qICBtb2RlIzA6IDY0MCB4IDQ4MCAgMzJCcHAgIDYwSHogKi8KLQkgNjQwLCA0ODAsIDMyLCA2MCwKLQkgLyogIEluaXRfTUlTQyAqLwotCSAweEUzLAotCSB7CQkJLyogIEluaXRfU1IwX1NSNCAqLwotCSAgMHgwMywgMHgwMSwgMHgwRiwgMHgwMCwgMHgwRSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjEwX1NSMjQgKi8KLQkgIDB4RkYsIDB4QkUsIDB4RUYsIDB4RkYsIDB4MDAsIDB4MEUsIDB4MTcsIDB4MkMsCi0JICAweDk5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHhDNCwgMHgzMCwgMHgwMiwgMHgwMSwgMHgwMSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjMwX1NSNzUgKi8KLQkgIDB4MzIsIDB4MDMsIDB4QTAsIDB4MDksIDB4QzAsIDB4MzIsIDB4MzIsIDB4MzIsCi0JICAweDMyLCAweDMyLCAweDMyLCAweDMyLCAweDAwLCAweDAwLCAweDAzLCAweEZGLAotCSAgMHgwMCwgMHhGQywgMHgwMCwgMHgwMCwgMHgyMCwgMHgxOCwgMHgwMCwgMHhGQywKLQkgIDB4MjAsIDB4MEMsIDB4NDQsIDB4MjAsIDB4MDAsIDB4MzIsIDB4MzIsIDB4MzIsCi0JICAweDA0LCAweDI0LCAweDYzLCAweDRGLCAweDUyLCAweDBCLCAweERGLCAweEVBLAotCSAgMHgwNCwgMHg1MCwgMHgxOSwgMHgzMiwgMHgzMiwgMHgwMCwgMHgwMCwgMHgzMiwKLQkgIDB4MDEsIDB4ODAsIDB4N0UsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweDUwLCAweDAzLCAweDc0LCAweDE0LCAweDA3LCAweDgyLCAweDA3LCAweDA0LAotCSAgMHgwMCwgMHg0NSwgMHgzMCwgMHgzMCwgMHg0MCwgMHgzMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjgwX1NSOTMgKi8KLQkgIDB4RkYsIDB4MDcsIDB4MDAsIDB4NkYsIDB4N0YsIDB4N0YsIDB4RkYsIDB4MzIsCi0JICAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEZGLCAweDMyLCAweDMyLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUkEwX1NSQUYgKi8KLQkgIDB4MDAsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4RUQsIDB4RUQsCi0JICAweDdCLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEVGLCAweEZGLCAweERGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0dSMDBfR1IwOCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwRiwKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQVIwMF9BUjE0ICovCi0JICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotCSAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKLQkgIDB4NDEsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IwMF9DUjE4ICovCi0JICAweDVGLCAweDRGLCAweDRGLCAweDAwLCAweDUzLCAweDFGLCAweDBCLCAweDNFLAotCSAgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4RUEsIDB4MEMsIDB4REYsIDB4NTAsIDB4NDAsIDB4REYsIDB4MDAsIDB4RTMsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMzBfQ1I0RCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1NSwgMHgwMywgMHgyMCwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4RTcsIDB4RkYsIDB4RkQsCi0JICAweDVGLCAweDRGLCAweDAwLCAweDU0LCAweDAwLCAweDBCLCAweERGLCAweDAwLAotCSAgMHhFQSwgMHgwQywgMHgyRSwgMHgwMCwgMHg0RiwgMHhERiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjkwX0NSQTcgKi8KLQkgIDB4NTYsIDB4REQsIDB4NUUsIDB4RUEsIDB4ODcsIDB4NDQsIDB4OEYsIDB4NTUsCi0JICAweDBBLCAweDhGLCAweDU1LCAweDBBLCAweDAwLCAweDAwLCAweDE4LCAweDAwLAotCSAgMHgxMSwgMHgxMCwgMHgwQiwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwMCwKLQkgIH0sCi0JIH0sCi0KLQl7CQkJLyogIG1vZGUjMjogODAwIHggNjAwICAxNkJwcCAgNjBIeiAqLwotCSA4MDAsIDYwMCwgMTYsIDYwLAotCSAvKiAgSW5pdF9NSVNDICovCi0JIDB4MkIsCi0JIHsJCQkvKiAgSW5pdF9TUjBfU1I0ICovCi0JICAweDAzLCAweDAxLCAweDBGLCAweDAzLCAweDBFLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMTBfU1IyNCAqLwotCSAgMHhGRiwgMHhCRSwgMHhFRSwgMHhGRiwgMHgwMCwgMHgwRSwgMHgxNywgMHgyQywKLQkgIDB4OTksIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweEM0LCAweDMwLCAweDAyLCAweDAxLCAweDAxLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMzBfU1I3NSAqLwotCSAgMHgzNCwgMHgwMywgMHgyMCwgMHgwOSwgMHhDMCwgMHgyNCwgMHgyNCwgMHgyNCwKLQkgIDB4MjQsIDB4MjQsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RkYsCi0JICAweDAwLCAweEZDLCAweDAwLCAweDAwLCAweDIwLCAweDM4LCAweDAwLCAweEZDLAotCSAgMHgyMCwgMHgwQywgMHg0NCwgMHgyMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgyNCwKLQkgIDB4MDQsIDB4NDgsIDB4ODMsIDB4NjMsIDB4NjgsIDB4NzIsIDB4NTcsIDB4NTgsCi0JICAweDA0LCAweDU1LCAweDU5LCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDI0LAotCSAgMHgwMSwgMHg4MCwgMHg3QSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4NTAsIDB4MDMsIDB4NzQsIDB4MTQsIDB4MUMsIDB4ODUsIDB4MzUsIDB4MTMsCi0JICAweDAyLCAweDQ1LCAweDMwLCAweDM1LCAweDQwLCAweDIwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSODBfU1I5MyAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHg2RiwgMHg3RiwgMHg3RiwgMHhGRiwgMHgyNCwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MjQsIDB4MjQsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSQTBfU1JBRiAqLwotCSAgMHgwMCwgMHhGRiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhFRCwgMHhFRCwKLQkgIDB4N0IsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RUYsIDB4QkYsIDB4REYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfR1IwMF9HUjA4ICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDA1LCAweDBGLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9BUjAwX0FSMTQgKi8KLQkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCi0JICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAotCSAgMHg0MSwgMHgwMCwgMHgwRiwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjAwX0NSMTggKi8KLQkgIDB4N0YsIDB4NjMsIDB4NjMsIDB4MDAsIDB4NjgsIDB4MTgsIDB4NzIsIDB4RjAsCi0JICAweDAwLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHg1OCwgMHgwQywgMHg1NywgMHg2NCwgMHg0MCwgMHg1NywgMHgwMCwgMHhFMywKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IzMF9DUjREICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDMzLCAweDAzLCAweDIwLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHhFNywgMHhCRiwgMHhGRCwKLQkgIDB4N0YsIDB4NjMsIDB4MDAsIDB4NjksIDB4MTgsIDB4NzIsIDB4NTcsIDB4MDAsCi0JICAweDU4LCAweDBDLCAweEUwLCAweDIwLCAweDYzLCAweDU3LAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSOTBfQ1JBNyAqLwotCSAgMHg1NiwgMHg0QiwgMHg1RSwgMHg1NSwgMHg4NiwgMHg5RCwgMHg4RSwgMHhBQSwKLQkgIDB4REIsIDB4MkEsIDB4REYsIDB4MzMsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsCi0JICAweDIwLCAweDFGLCAweDFBLCAweDE5LCAweDBGLCAweDBGLCAweDBGLCAweDAwLAotCSAgfSwKLQkgfSwKLQl7CQkJLyogIG1vZGUjMzogODAwIHggNjAwICAyNEJwcCAgNjBIeiAqLwotCSA4MDAsIDYwMCwgMjQsIDYwLAotCSAweDJCLAotCSB7CQkJLyogIEluaXRfU1IwX1NSNCAqLwotCSAgMHgwMywgMHgwMSwgMHgwRiwgMHgwMywgMHgwRSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjEwX1NSMjQgKi8KLQkgIDB4RkYsIDB4QkUsIDB4RUUsIDB4RkYsIDB4MDAsIDB4MEUsIDB4MTcsIDB4MkMsCi0JICAweDk5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHhDNCwgMHgzMCwgMHgwMiwgMHgwMSwgMHgwMSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjMwX1NSNzUgKi8KLQkgIDB4MzYsIDB4MDMsIDB4MjAsIDB4MDksIDB4QzAsIDB4MzYsIDB4MzYsIDB4MzYsCi0JICAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDAwLCAweDAwLCAweDAzLCAweEZGLAotCSAgMHgwMCwgMHhGQywgMHgwMCwgMHgwMCwgMHgyMCwgMHgxOCwgMHgwMCwgMHhGQywKLQkgIDB4MjAsIDB4MEMsIDB4NDQsIDB4MjAsIDB4MDAsIDB4MzYsIDB4MzYsIDB4MzYsCi0JICAweDA0LCAweDQ4LCAweDgzLCAweDYzLCAweDY4LCAweDcyLCAweDU3LCAweDU4LAotCSAgMHgwNCwgMHg1NSwgMHg1OSwgMHgzNiwgMHgzNiwgMHgwMCwgMHgwMCwgMHgzNiwKLQkgIDB4MDEsIDB4ODAsIDB4N0UsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweDUwLCAweDAzLCAweDc0LCAweDE0LCAweDFDLCAweDg1LCAweDM1LCAweDEzLAotCSAgMHgwMiwgMHg0NSwgMHgzMCwgMHgzMCwgMHg0MCwgMHgyMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjgwX1NSOTMgKi8KLQkgIDB4RkYsIDB4MDcsIDB4MDAsIDB4NkYsIDB4N0YsIDB4N0YsIDB4RkYsIDB4MzYsCi0JICAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEZGLCAweDM2LCAweDM2LAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUkEwX1NSQUYgKi8KLQkgIDB4MDAsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4RUQsIDB4RUQsCi0JICAweDdCLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEVGLCAweEJGLCAweERGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0dSMDBfR1IwOCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwRiwKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQVIwMF9BUjE0ICovCi0JICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotCSAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKLQkgIDB4NDEsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IwMF9DUjE4ICovCi0JICAweDdGLCAweDYzLCAweDYzLCAweDAwLCAweDY4LCAweDE4LCAweDcyLCAweEYwLAotCSAgMHgwMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4NTgsIDB4MEMsIDB4NTcsIDB4NjQsIDB4NDAsIDB4NTcsIDB4MDAsIDB4RTMsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMzBfQ1I0RCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMywgMHgwMywgMHgyMCwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4RTcsIDB4QkYsIDB4RkQsCi0JICAweDdGLCAweDYzLCAweDAwLCAweDY5LCAweDE4LCAweDcyLCAweDU3LCAweDAwLAotCSAgMHg1OCwgMHgwQywgMHhFMCwgMHgyMCwgMHg2MywgMHg1NywKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjkwX0NSQTcgKi8KLQkgIDB4NTYsIDB4NEIsIDB4NUUsIDB4NTUsIDB4ODYsIDB4OUQsIDB4OEUsIDB4QUEsCi0JICAweERCLCAweDJBLCAweERGLCAweDMzLCAweDAwLCAweDAwLCAweDE4LCAweDAwLAotCSAgMHgyMCwgMHgxRiwgMHgxQSwgMHgxOSwgMHgwRiwgMHgwRiwgMHgwRiwgMHgwMCwKLQkgIH0sCi0JIH0sCi0JewkJCS8qICBtb2RlIzc6IDgwMCB4IDYwMCAgMzJCcHAgIDYwSHogKi8KLQkgODAwLCA2MDAsIDMyLCA2MCwKLQkgLyogIEluaXRfTUlTQyAqLwotCSAweDJCLAotCSB7CQkJLyogIEluaXRfU1IwX1NSNCAqLwotCSAgMHgwMywgMHgwMSwgMHgwRiwgMHgwMywgMHgwRSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjEwX1NSMjQgKi8KLQkgIDB4RkYsIDB4QkUsIDB4RUUsIDB4RkYsIDB4MDAsIDB4MEUsIDB4MTcsIDB4MkMsCi0JICAweDk5LCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHhDNCwgMHgzMCwgMHgwMiwgMHgwMSwgMHgwMSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjMwX1NSNzUgKi8KLQkgIDB4MzQsIDB4MDMsIDB4MjAsIDB4MDksIDB4QzAsIDB4MjQsIDB4MjQsIDB4MjQsCi0JICAweDI0LCAweDI0LCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDAzLCAweEZGLAotCSAgMHgwMCwgMHhGQywgMHgwMCwgMHgwMCwgMHgyMCwgMHgzOCwgMHgwMCwgMHhGQywKLQkgIDB4MjAsIDB4MEMsIDB4NDQsIDB4MjAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MjQsCi0JICAweDA0LCAweDQ4LCAweDgzLCAweDYzLCAweDY4LCAweDcyLCAweDU3LCAweDU4LAotCSAgMHgwNCwgMHg1NSwgMHg1OSwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgyNCwKLQkgIDB4MDEsIDB4ODAsIDB4N0EsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweDUwLCAweDAzLCAweDc0LCAweDE0LCAweDFDLCAweDg1LCAweDM1LCAweDEzLAotCSAgMHgwMiwgMHg0NSwgMHgzMCwgMHgzNSwgMHg0MCwgMHgyMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjgwX1NSOTMgKi8KLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NkYsIDB4N0YsIDB4N0YsIDB4RkYsIDB4MjQsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDI0LCAweDI0LAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUkEwX1NSQUYgKi8KLQkgIDB4MDAsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4RUQsIDB4RUQsCi0JICAweDdCLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEVGLCAweEJGLCAweERGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0dSMDBfR1IwOCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwRiwKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQVIwMF9BUjE0ICovCi0JICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotCSAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKLQkgIDB4NDEsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IwMF9DUjE4ICovCi0JICAweDdGLCAweDYzLCAweDYzLCAweDAwLCAweDY4LCAweDE4LCAweDcyLCAweEYwLAotCSAgMHgwMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4NTgsIDB4MEMsIDB4NTcsIDB4NjQsIDB4NDAsIDB4NTcsIDB4MDAsIDB4RTMsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMzBfQ1I0RCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMywgMHgwMywgMHgyMCwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4RTcsIDB4QkYsIDB4RkQsCi0JICAweDdGLCAweDYzLCAweDAwLCAweDY5LCAweDE4LCAweDcyLCAweDU3LCAweDAwLAotCSAgMHg1OCwgMHgwQywgMHhFMCwgMHgyMCwgMHg2MywgMHg1NywKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjkwX0NSQTcgKi8KLQkgIDB4NTYsIDB4NEIsIDB4NUUsIDB4NTUsIDB4ODYsIDB4OUQsIDB4OEUsIDB4QUEsCi0JICAweERCLCAweDJBLCAweERGLCAweDMzLCAweDAwLCAweDAwLCAweDE4LCAweDAwLAotCSAgMHgyMCwgMHgxRiwgMHgxQSwgMHgxOSwgMHgwRiwgMHgwRiwgMHgwRiwgMHgwMCwKLQkgIH0sCi0JIH0sCi0JLyogV2UgdXNlIDEwMjR4NzY4IHRhYmxlIHRvIGxpZ2h0IDEwMjR4NjAwIHBhbmVsIGZvciBsZW1vdGUgKi8KLQl7CQkJLyogIG1vZGUjNDogMTAyNCB4IDYwMCAgMTZCcHAgIDYwSHogICovCi0JIDEwMjQsIDYwMCwgMTYsIDYwLAotCSAvKiAgSW5pdF9NSVNDICovCi0JIDB4RUIsCi0JIHsJCQkvKiAgSW5pdF9TUjBfU1I0ICovCi0JICAweDAzLCAweDAxLCAweDBGLCAweDAwLCAweDBFLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMTBfU1IyNCAqLwotCSAgMHhDOCwgMHg0MCwgMHgxNCwgMHg2MCwgMHgwMCwgMHgwQSwgMHgxNywgMHgyMCwKLQkgIDB4NTEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweEM0LCAweDMwLCAweDAyLCAweDAwLCAweDAxLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMzBfU1I3NSAqLwotCSAgMHgyMiwgMHgwMywgMHgyNCwgMHgwOSwgMHhDMCwgMHgyMiwgMHgyMiwgMHgyMiwKLQkgIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RkYsCi0JICAweDAwLCAweEZDLCAweDAwLCAweDAwLCAweDIwLCAweDE4LCAweDAwLCAweEZDLAotCSAgMHgyMCwgMHgwQywgMHg0NCwgMHgyMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgyMiwKLQkgIDB4MDYsIDB4NjgsIDB4QTcsIDB4N0YsIDB4ODMsIDB4MjQsIDB4RkYsIDB4MDMsCi0JICAweDAwLCAweDYwLCAweDU5LCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDIyLAotCSAgMHgwMSwgMHg4MCwgMHg3QSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4NTAsIDB4MDMsIDB4MTYsIDB4MDIsIDB4MEQsIDB4ODIsIDB4MDksIDB4MDIsCi0JICAweDA0LCAweDQ1LCAweDNGLCAweDMwLCAweDQwLCAweDIwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSODBfU1I5MyAqLwotCSAgMHhGRiwgMHgwNywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzQSwKLQkgIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4M0EsIDB4M0EsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSQTBfU1JBRiAqLwotCSAgMHgwMCwgMHhGQiwgMHg5RiwgMHgwMSwgMHgwMCwgMHhFRCwgMHhFRCwgMHhFRCwKLQkgIDB4N0IsIDB4RkIsIDB4RkYsIDB4RkYsIDB4OTcsIDB4RUYsIDB4QkYsIDB4REYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfR1IwMF9HUjA4ICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDA1LCAweDBGLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9BUjAwX0FSMTQgKi8KLQkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCi0JICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAotCSAgMHg0MSwgMHgwMCwgMHgwRiwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjAwX0NSMTggKi8KLQkgIDB4QTMsIDB4N0YsIDB4N0YsIDB4MDAsIDB4ODUsIDB4MTYsIDB4MjQsIDB4RjUsCi0JICAweDAwLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHgwMywgMHgwOSwgMHhGRiwgMHg4MCwgMHg0MCwgMHhGRiwgMHgwMCwgMHhFMywKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IzMF9DUjREICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAyLCAweDIwLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHhGRiwgMHhCRiwgMHhGRiwKLQkgIDB4QTMsIDB4N0YsIDB4MDAsIDB4ODIsIDB4MGIsIDB4NmYsIDB4NTcsIDB4MDAsCi0JICAweDVjLCAweDBmLCAweEUwLCAweGUwLCAweDdGLCAweDU3LAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSOTBfQ1JBNyAqLwotCSAgMHg1NSwgMHhEOSwgMHg1RCwgMHhFMSwgMHg4NiwgMHgxQiwgMHg4RSwgMHgyNiwKLQkgIDB4REEsIDB4OEQsIDB4REUsIDB4OTQsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsCi0JICAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDE1LCAweDAzLAotCSAgfSwKLQkgfSwKLQl7CQkJLyogIG1vZGUjNTogMTAyNCB4IDc2OCAgMjRCcHAgIDYwSHogKi8KLQkgMTAyNCwgNzY4LCAyNCwgNjAsCi0JIC8qICBJbml0X01JU0MgKi8KLQkgMHhFQiwKLQkgewkJCS8qICBJbml0X1NSMF9TUjQgKi8KLQkgIDB4MDMsIDB4MDEsIDB4MEYsIDB4MDMsIDB4MEUsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1IxMF9TUjI0ICovCi0JICAweEYzLCAweEI2LCAweEMwLCAweERELCAweDAwLCAweDBFLCAweDE3LCAweDJDLAotCSAgMHg5OSwgMHgwMiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4QzQsIDB4MzAsIDB4MDIsIDB4MDEsIDB4MDEsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1IzMF9TUjc1ICovCi0JICAweDM4LCAweDAzLCAweDIwLCAweDA5LCAweEMwLCAweDNBLCAweDNBLCAweDNBLAotCSAgMHgzQSwgMHgzQSwgMHgzQSwgMHgzQSwgMHgwMCwgMHgwMCwgMHgwMywgMHhGRiwKLQkgIDB4MDAsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MTgsIDB4MDAsIDB4RkMsCi0JICAweDIwLCAweDBDLCAweDQ0LCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDNBLAotCSAgMHgwNiwgMHg2OCwgMHhBNywgMHg3RiwgMHg4MywgMHgyNCwgMHhGRiwgMHgwMywKLQkgIDB4MDAsIDB4NjAsIDB4NTksIDB4M0EsIDB4M0EsIDB4MDAsIDB4MDAsIDB4M0EsCi0JICAweDAxLCAweDgwLCAweDdFLCAweDFBLCAweDFBLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHg1MCwgMHgwMywgMHg3NCwgMHgxNCwgMHgzQiwgMHgwRCwgMHgwOSwgMHgwMiwKLQkgIDB4MDQsIDB4NDUsIDB4MzAsIDB4MzAsIDB4NDAsIDB4MjAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1I4MF9TUjkzICovCi0JICAweEZGLCAweDA3LCAweDAwLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDNBLAotCSAgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzQSwgMHgzQSwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1JBMF9TUkFGICovCi0JICAweDAwLCAweEZCLCAweDlGLCAweDAxLCAweDAwLCAweEVELCAweEVELCAweEVELAotCSAgMHg3QiwgMHhGQiwgMHhGRiwgMHhGRiwgMHg5NywgMHhFRiwgMHhCRiwgMHhERiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9HUjAwX0dSMDggKi8KLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDUsIDB4MEYsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0FSMDBfQVIxNCAqLwotCSAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKLQkgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCi0JICAweDQxLCAweDAwLCAweDBGLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMDBfQ1IxOCAqLwotCSAgMHhBMywgMHg3RiwgMHg3RiwgMHgwMCwgMHg4NSwgMHgxNiwgMHgyNCwgMHhGNSwKLQkgIDB4MDAsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweDAzLCAweDA5LCAweEZGLCAweDgwLCAweDQwLCAweEZGLCAweDAwLCAweEUzLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjMwX0NSNEQgKi8KLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDIsIDB4MjAsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweEZGLCAweEJGLCAweEZGLAotCSAgMHhBMywgMHg3RiwgMHgwMCwgMHg4NiwgMHgxNSwgMHgyNCwgMHhGRiwgMHgwMCwKLQkgIDB4MDEsIDB4MDcsIDB4RTUsIDB4MjAsIDB4N0YsIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1I5MF9DUkE3ICovCi0JICAweDU1LCAweEQ5LCAweDVELCAweEUxLCAweDg2LCAweDFCLCAweDhFLCAweDI2LAotCSAgMHhEQSwgMHg4RCwgMHhERSwgMHg5NCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwKLQkgIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MTUsIDB4MDMsCi0JICB9LAotCSB9LAotCXsJCQkvKiAgbW9kZSM0OiAxMDI0IHggNzY4ICAzMkJwcCAgNjBIeiAqLwotCSAxMDI0LCA3NjgsIDMyLCA2MCwKLQkgLyogIEluaXRfTUlTQyAqLwotCSAweEVCLAotCSB7CQkJLyogIEluaXRfU1IwX1NSNCAqLwotCSAgMHgwMywgMHgwMSwgMHgwRiwgMHgwMywgMHgwRSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjEwX1NSMjQgKi8KLQkgIDB4RjMsIDB4QjYsIDB4QzAsIDB4REQsIDB4MDAsIDB4MEUsIDB4MTcsIDB4MkMsCi0JICAweDk5LCAweDAyLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHhDNCwgMHgzMiwgMHgwMiwgMHgwMSwgMHgwMSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjMwX1NSNzUgKi8KLQkgIDB4MzgsIDB4MDMsIDB4MjAsIDB4MDksIDB4QzAsIDB4M0EsIDB4M0EsIDB4M0EsCi0JICAweDNBLCAweDNBLCAweDNBLCAweDNBLCAweDAwLCAweDAwLCAweDAzLCAweEZGLAotCSAgMHgwMCwgMHhGQywgMHgwMCwgMHgwMCwgMHgyMCwgMHgxOCwgMHgwMCwgMHhGQywKLQkgIDB4MjAsIDB4MEMsIDB4NDQsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4M0EsCi0JICAweDA2LCAweDY4LCAweEE3LCAweDdGLCAweDgzLCAweDI0LCAweEZGLCAweDAzLAotCSAgMHgwMCwgMHg2MCwgMHg1OSwgMHgzQSwgMHgzQSwgMHgwMCwgMHgwMCwgMHgzQSwKLQkgIDB4MDEsIDB4ODAsIDB4N0UsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweDUwLCAweDAzLCAweDc0LCAweDE0LCAweDNCLCAweDBELCAweDA5LCAweDAyLAotCSAgMHgwNCwgMHg0NSwgMHgzMCwgMHgzMCwgMHg0MCwgMHgyMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjgwX1NSOTMgKi8KLQkgIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4M0EsCi0JICAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDNBLCAweDNBLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUkEwX1NSQUYgKi8KLQkgIDB4MDAsIDB4RkIsIDB4OUYsIDB4MDEsIDB4MDAsIDB4RUQsIDB4RUQsIDB4RUQsCi0JICAweDdCLCAweEZCLCAweEZGLCAweEZGLCAweDk3LCAweEVGLCAweEJGLCAweERGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0dSMDBfR1IwOCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwRiwKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQVIwMF9BUjE0ICovCi0JICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotCSAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKLQkgIDB4NDEsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IwMF9DUjE4ICovCi0JICAweEEzLCAweDdGLCAweDdGLCAweDAwLCAweDg1LCAweDE2LCAweDI0LCAweEY1LAotCSAgMHgwMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4MDMsIDB4MDksIDB4RkYsIDB4ODAsIDB4NDAsIDB4RkYsIDB4MDAsIDB4RTMsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMzBfQ1I0RCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMiwgMHgyMCwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4RkYsIDB4QkYsIDB4RkYsCi0JICAweEEzLCAweDdGLCAweDAwLCAweDg2LCAweDE1LCAweDI0LCAweEZGLCAweDAwLAotCSAgMHgwMSwgMHgwNywgMHhFNSwgMHgyMCwgMHg3RiwgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjkwX0NSQTcgKi8KLQkgIDB4NTUsIDB4RDksIDB4NUQsIDB4RTEsIDB4ODYsIDB4MUIsIDB4OEUsIDB4MjYsCi0JICAweERBLCAweDhELCAweERFLCAweDk0LCAweDAwLCAweDAwLCAweDE4LCAweDAwLAotCSAgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgxNSwgMHgwMywKLQkgIH0sCi0JIH0sCi0JewkJCS8qICBtb2RlIzY6IDMyMCB4IDI0MCAgMTZCcHAgIDYwSHogKi8KLQkgMzIwLCAyNDAsIDE2LCA2MCwKLQkgLyogIEluaXRfTUlTQyAqLwotCSAweEVCLAotCSB7CQkJLyogIEluaXRfU1IwX1NSNCAqLwotCSAgMHgwMywgMHgwMSwgMHgwRiwgMHgwMywgMHgwRSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjEwX1NSMjQgKi8KLQkgIDB4RjMsIDB4QjYsIDB4QzAsIDB4REQsIDB4MDAsIDB4MEUsIDB4MTcsIDB4MkMsCi0JICAweDk5LCAweDAyLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHhDNCwgMHgzMiwgMHgwMiwgMHgwMSwgMHgwMSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjMwX1NSNzUgKi8KLQkgIDB4MzgsIDB4MDMsIDB4MjAsIDB4MDksIDB4QzAsIDB4M0EsIDB4M0EsIDB4M0EsCi0JICAweDNBLCAweDNBLCAweDNBLCAweDNBLCAweDAwLCAweDAwLCAweDAzLCAweEZGLAotCSAgMHgwMCwgMHhGQywgMHgwMCwgMHgwMCwgMHgyMCwgMHgxOCwgMHgwMCwgMHhGQywKLQkgIDB4MjAsIDB4MEMsIDB4NDQsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4M0EsCi0JICAweDA2LCAweDY4LCAweEE3LCAweDdGLCAweDgzLCAweDI0LCAweEZGLCAweDAzLAotCSAgMHgwMCwgMHg2MCwgMHg1OSwgMHgzQSwgMHgzQSwgMHgwMCwgMHgwMCwgMHgzQSwKLQkgIDB4MDEsIDB4ODAsIDB4N0UsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweDUwLCAweDAzLCAweDc0LCAweDE0LCAweDA4LCAweDQzLCAweDA4LCAweDQzLAotCSAgMHgwNCwgMHg0NSwgMHgzMCwgMHgzMCwgMHg0MCwgMHgyMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjgwX1NSOTMgKi8KLQkgIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4M0EsCi0JICAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDNBLCAweDNBLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUkEwX1NSQUYgKi8KLQkgIDB4MDAsIDB4RkIsIDB4OUYsIDB4MDEsIDB4MDAsIDB4RUQsIDB4RUQsIDB4RUQsCi0JICAweDdCLCAweEZCLCAweEZGLCAweEZGLCAweDk3LCAweEVGLCAweEJGLCAweERGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0dSMDBfR1IwOCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwRiwKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQVIwMF9BUjE0ICovCi0JICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotCSAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKLQkgIDB4NDEsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IwMF9DUjE4ICovCi0JICAweEEzLCAweDdGLCAweDdGLCAweDAwLCAweDg1LCAweDE2LCAweDI0LCAweEY1LAotCSAgMHgwMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4MDMsIDB4MDksIDB4RkYsIDB4ODAsIDB4NDAsIDB4RkYsIDB4MDAsIDB4RTMsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMzBfQ1I0RCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMiwgMHgyMCwKLQkgIDB4MDAsIDB4MDAsIDB4MzAsIDB4NDAsIDB4MDAsIDB4RkYsIDB4QkYsIDB4RkYsCi0JICAweDJFLCAweDI3LCAweDAwLCAweDJiLCAweDBjLCAweDBGLCAweEVGLCAweDAwLAotCSAgMHhGZSwgMHgwZiwgMHgwMSwgMHhDMCwgMHgyNywgMHhFRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjkwX0NSQTcgKi8KLQkgIDB4NTUsIDB4RDksIDB4NUQsIDB4RTEsIDB4ODYsIDB4MUIsIDB4OEUsIDB4MjYsCi0JICAweERBLCAweDhELCAweERFLCAweDk0LCAweDAwLCAweDAwLCAweDE4LCAweDAwLAotCSAgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgxNSwgMHgwMywKLQkgIH0sCi0JIH0sCi0KLQl7CQkJLyogIG1vZGUjODogMzIwIHggMjQwICAzMkJwcCAgNjBIeiAqLwotCSAzMjAsIDI0MCwgMzIsIDYwLAotCSAvKiAgSW5pdF9NSVNDICovCi0JIDB4RUIsCi0JIHsJCQkvKiAgSW5pdF9TUjBfU1I0ICovCi0JICAweDAzLCAweDAxLCAweDBGLCAweDAzLCAweDBFLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMTBfU1IyNCAqLwotCSAgMHhGMywgMHhCNiwgMHhDMCwgMHhERCwgMHgwMCwgMHgwRSwgMHgxNywgMHgyQywKLQkgIDB4OTksIDB4MDIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweEM0LCAweDMyLCAweDAyLCAweDAxLCAweDAxLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMzBfU1I3NSAqLwotCSAgMHgzOCwgMHgwMywgMHgyMCwgMHgwOSwgMHhDMCwgMHgzQSwgMHgzQSwgMHgzQSwKLQkgIDB4M0EsIDB4M0EsIDB4M0EsIDB4M0EsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RkYsCi0JICAweDAwLCAweEZDLCAweDAwLCAweDAwLCAweDIwLCAweDE4LCAweDAwLCAweEZDLAotCSAgMHgyMCwgMHgwQywgMHg0NCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzQSwKLQkgIDB4MDYsIDB4NjgsIDB4QTcsIDB4N0YsIDB4ODMsIDB4MjQsIDB4RkYsIDB4MDMsCi0JICAweDAwLCAweDYwLCAweDU5LCAweDNBLCAweDNBLCAweDAwLCAweDAwLCAweDNBLAotCSAgMHgwMSwgMHg4MCwgMHg3RSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4NTAsIDB4MDMsIDB4NzQsIDB4MTQsIDB4MDgsIDB4NDMsIDB4MDgsIDB4NDMsCi0JICAweDA0LCAweDQ1LCAweDMwLCAweDMwLCAweDQwLCAweDIwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSODBfU1I5MyAqLwotCSAgMHhGRiwgMHgwNywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzQSwKLQkgIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4M0EsIDB4M0EsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSQTBfU1JBRiAqLwotCSAgMHgwMCwgMHhGQiwgMHg5RiwgMHgwMSwgMHgwMCwgMHhFRCwgMHhFRCwgMHhFRCwKLQkgIDB4N0IsIDB4RkIsIDB4RkYsIDB4RkYsIDB4OTcsIDB4RUYsIDB4QkYsIDB4REYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfR1IwMF9HUjA4ICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDA1LCAweDBGLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9BUjAwX0FSMTQgKi8KLQkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCi0JICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAotCSAgMHg0MSwgMHgwMCwgMHgwRiwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjAwX0NSMTggKi8KLQkgIDB4QTMsIDB4N0YsIDB4N0YsIDB4MDAsIDB4ODUsIDB4MTYsIDB4MjQsIDB4RjUsCi0JICAweDAwLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHgwMywgMHgwOSwgMHhGRiwgMHg4MCwgMHg0MCwgMHhGRiwgMHgwMCwgMHhFMywKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IzMF9DUjREICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAyLCAweDIwLAotCSAgMHgwMCwgMHgwMCwgMHgzMCwgMHg0MCwgMHgwMCwgMHhGRiwgMHhCRiwgMHhGRiwKLQkgIDB4MkUsIDB4MjcsIDB4MDAsIDB4MmIsIDB4MGMsIDB4MEYsIDB4RUYsIDB4MDAsCi0JICAweEZlLCAweDBmLCAweDAxLCAweEMwLCAweDI3LCAweEVGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSOTBfQ1JBNyAqLwotCSAgMHg1NSwgMHhEOSwgMHg1RCwgMHhFMSwgMHg4NiwgMHgxQiwgMHg4RSwgMHgyNiwKLQkgIDB4REEsIDB4OEQsIDB4REUsIDB4OTQsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsCi0JICAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDE1LCAweDAzLAotCSAgfSwKLQkgfSwKLX07Ci0KLSNkZWZpbmUgbnVtVkdBTW9kZXMJCUFSUkFZX1NJWkUoVkdBTW9kZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL3NtN3h4ZmIuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL3NtN3h4ZmIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE3NmQ5OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc203eHhmYi9zbTd4eGZiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDI4ICswLDAgQEAKLS8qCi0gKiBTaWxpY29uIE1vdGlvbiBTTTdYWCBmcmFtZSBidWZmZXIgZGV2aWNlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFNpbGljb24gTW90aW9uIFRlY2hub2xvZ3kgQ29ycC4KLSAqIEF1dGhvcnM6ICBHZSBXYW5nLCBnZXdhbmdAc2lsaWNvbm1vdGlvbi5jb20KLSAqCSAgICAgQm95b2QgYm95b2QueWFuZ0BzaWxpY29ubW90aW9uLmNvbS5jbgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBMZW1vdGUsIEluYy4KLSAqIEF1dGhvcjogICBXdSBaaGFuZ2ppbiwgd3V6aGFuZ2ppbkBnbWFpbC5jb20KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgSWdhbGlhLCBTLkwuCi0gKiBBdXRob3I6ICAgSmF2aWVyIE0uIE1lbGxpZCA8am11bmhvekBpZ2FsaWEuY29tPgotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIEZyYW1lYnVmZmVyIGRyaXZlciBmb3IgU2lsaWNvbiBNb3Rpb24gU003MTAsIFNNNzEyLCBTTTcyMSBhbmQgU003MjIgY2hpcHMKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9mYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zY3JlZW5faW5mby5oPgotCi0jaWZkZWYgQ09ORklHX1BNCi0jaW5jbHVkZSA8bGludXgvcG0uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAic203eHguaCIKLQotLyoKLSogUHJpdmF0ZSBzdHJ1Y3R1cmUKLSovCi1zdHJ1Y3Qgc210Y2ZiX2luZm8gewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXN0cnVjdCBmYl9pbmZvIGZiOwotCXUxNiBjaGlwX2lkOwotCXU4ICBjaGlwX3Jldl9pZDsKLQotCXZvaWQgX19pb21lbSAqbGZiOwkvKiBsaW5lYXIgZnJhbWUgYnVmZmVyICovCi0Jdm9pZCBfX2lvbWVtICpkcF9yZWdzOwkvKiBkcmF3aW5nIHByb2Nlc3NvciBjb250cm9sIHJlZ3MgKi8KLQl2b2lkIF9faW9tZW0gKnZwX3JlZ3M7CS8qIHZpZGVvIHByb2Nlc3NvciBjb250cm9sIHJlZ3MgKi8KLQl2b2lkIF9faW9tZW0gKmNwX3JlZ3M7CS8qIGNhcHR1cmUgcHJvY2Vzc29yIGNvbnRyb2wgcmVncyAqLwotCXZvaWQgX19pb21lbSAqbW1pbzsJLyogbWVtb3J5IG1hcCBJTyBwb3J0ICovCi0KLQl1X2ludCB3aWR0aDsKLQl1X2ludCBoZWlnaHQ7Ci0JdV9pbnQgaHo7Ci0KLQl1MzIgY29scmVnWzE3XTsKLX07Ci0KLXZvaWQgX19pb21lbSAqc210Y19SZWdCYXNlQWRkcmVzczsJLyogTWVtb3J5IE1hcCBJTyBzdGFydGluZyBhZGRyZXNzICovCi0KLXN0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gc210Y2ZiX3ZhciA9IHsKLQkueHJlcyAgICAgICAgICAgPSAxMDI0LAotCS55cmVzICAgICAgICAgICA9IDYwMCwKLQkueHJlc192aXJ0dWFsICAgPSAxMDI0LAotCS55cmVzX3ZpcnR1YWwgICA9IDYwMCwKLQkuYml0c19wZXJfcGl4ZWwgPSAxNiwKLQkucmVkICAgICAgICAgICAgPSB7MTYsIDgsIDB9LAotCS5ncmVlbiAgICAgICAgICA9IHs4LCA4LCAwfSwKLQkuYmx1ZSAgICAgICAgICAgPSB7MCwgOCwgMH0sCi0JLmFjdGl2YXRlICAgICAgID0gRkJfQUNUSVZBVEVfTk9XLAotCS5oZWlnaHQgICAgICAgICA9IC0xLAotCS53aWR0aCAgICAgICAgICA9IC0xLAotCS52bW9kZSAgICAgICAgICA9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsCi0JLm5vbnN0ZCAgICAgICAgID0gMCwKLQkuYWNjZWxfZmxhZ3MgICAgPSBGQl9BQ0NFTEZfVEVYVCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gc210Y2ZiX2ZpeCA9IHsKLQkuaWQgICAgICAgICAgICAgPSAic21YWFhmYiIsCi0JLnR5cGUgICAgICAgICAgID0gRkJfVFlQRV9QQUNLRURfUElYRUxTLAotCS52aXN1YWwgICAgICAgICA9IEZCX1ZJU1VBTF9UUlVFQ09MT1IsCi0JLmxpbmVfbGVuZ3RoICAgID0gODAwICogMywKLQkuYWNjZWwgICAgICAgICAgPSBGQl9BQ0NFTF9TTUlfTFlOWCwKLQkudHlwZV9hdXggICAgICAgPSAwLAotCS54cGFuc3RlcCAgICAgICA9IDAsCi0JLnlwYW5zdGVwICAgICAgID0gMCwKLQkueXdyYXBzdGVwICAgICAgPSAwLAotfTsKLQotc3RydWN0IHZlc2FfbW9kZSB7Ci0JY2hhciBpbmRleFs2XTsKLQl1MTYgIGxmYl93aWR0aDsKLQl1MTYgIGxmYl9oZWlnaHQ7Ci0JdTE2ICBsZmJfZGVwdGg7Ci19OwotCi1zdGF0aWMgc3RydWN0IHZlc2FfbW9kZSB2ZXNhX21vZGVfdGFibGVbXSA9IHsKLQl7IjB4MzAxIiwgNjQwLCAgNDgwLCAgOH0sCi0JeyIweDMwMyIsIDgwMCwgIDYwMCwgIDh9LAotCXsiMHgzMDUiLCAxMDI0LCA3NjgsICA4fSwKLQl7IjB4MzA3IiwgMTI4MCwgMTAyNCwgOH0sCi0KLQl7IjB4MzExIiwgNjQwLCAgNDgwLCAgMTZ9LAotCXsiMHgzMTQiLCA4MDAsICA2MDAsICAxNn0sCi0JeyIweDMxNyIsIDEwMjQsIDc2OCwgIDE2fSwKLQl7IjB4MzFBIiwgMTI4MCwgMTAyNCwgMTZ9LAotCi0JeyIweDMxMiIsIDY0MCwgIDQ4MCwgIDI0fSwKLQl7IjB4MzE1IiwgODAwLCAgNjAwLCAgMjR9LAotCXsiMHgzMTgiLCAxMDI0LCA3NjgsICAyNH0sCi0JeyIweDMxQiIsIDEyODAsIDEwMjQsIDI0fSwKLX07Ci0KLXN0cnVjdCBzY3JlZW5faW5mbyBzbXRjX3Njcl9pbmZvOwotCi0vKiBwcm9jZXNzIGNvbW1hbmQgbGluZSBvcHRpb25zLCBnZXQgdmdhIHBhcmFtZXRlciAqLwotc3RhdGljIGludCBfX2luaXQgc203eHhfdmdhX3NldHVwKGNoYXIgKm9wdGlvbnMpCi17Ci0JaW50IGk7Ci0KLQlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXNtdGNfc2NyX2luZm8ubGZiX3dpZHRoID0gMDsKLQlzbXRjX3Njcl9pbmZvLmxmYl9oZWlnaHQgPSAwOwotCXNtdGNfc2NyX2luZm8ubGZiX2RlcHRoID0gMDsKLQotCXByX2RlYnVnKCJzbTd4eF92Z2Ffc2V0dXAgPSAlc1xuIiwgb3B0aW9ucyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2ZXNhX21vZGVfdGFibGUpOyBpKyspIHsKLQkJaWYgKHN0cnN0cihvcHRpb25zLCB2ZXNhX21vZGVfdGFibGVbaV0uaW5kZXgpKSB7Ci0JCQlzbXRjX3Njcl9pbmZvLmxmYl93aWR0aCAgPSB2ZXNhX21vZGVfdGFibGVbaV0ubGZiX3dpZHRoOwotCQkJc210Y19zY3JfaW5mby5sZmJfaGVpZ2h0ID0KLQkJCQkJCXZlc2FfbW9kZV90YWJsZVtpXS5sZmJfaGVpZ2h0OwotCQkJc210Y19zY3JfaW5mby5sZmJfZGVwdGggID0gdmVzYV9tb2RlX3RhYmxlW2ldLmxmYl9kZXB0aDsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcmV0dXJuIC0xOwotfQotX19zZXR1cCgidmdhPSIsIHNtN3h4X3ZnYV9zZXR1cCk7Ci0KLXN0YXRpYyB2b2lkIHNtNzEyX3NldHBhbGV0dGUoaW50IHJlZ25vLCB1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLAotCQkJICAgICB1bnNpZ25lZCBibHVlLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQkvKiBzZXQgYml0IDU6NCA9IDAxICh3cml0ZSBMQ0QgUkFNIG9ubHkpICovCi0Jc210Y19zZXF3KDB4NjYsIChzbXRjX3NlcXIoMHg2NikgJiAweEMzKSB8IDB4MTApOwotCi0Jc210Y19tbWlvd2IocmVnbm8sIGRhY19yZWcpOwotCXNtdGNfbW1pb3diKHJlZCA+PiAxMCwgZGFjX3ZhbCk7Ci0Jc210Y19tbWlvd2IoZ3JlZW4gPj4gMTAsIGRhY192YWwpOwotCXNtdGNfbW1pb3diKGJsdWUgPj4gMTAsIGRhY192YWwpOwotfQotCi0vKiBjaGFuX3RvX2ZpZWxkCi0gKgotICogY29udmVydCBhIGNvbG91ciB2YWx1ZSBpbnRvIGEgZmllbGQgcG9zaXRpb24KLSAqCi0gKiBmcm9tIHB4YWZiLmMKLSAqLwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjaGFuX3RvX2ZpZWxkKHVuc2lnbmVkIGludCBjaGFuLAotCQkJCQkgc3RydWN0IGZiX2JpdGZpZWxkICpiZikKLXsKLQljaGFuICY9IDB4ZmZmZjsKLQljaGFuID4+PSAxNiAtIGJmLT5sZW5ndGg7Ci0JcmV0dXJuIGNoYW4gPDwgYmYtPm9mZnNldDsKLX0KLQotc3RhdGljIGludCBzbXRjX2JsYW5rKGludCBibGFua19tb2RlLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQkvKiBjbGVhciBEUE1TIHNldHRpbmcgKi8KLQlzd2l0Y2ggKGJsYW5rX21vZGUpIHsKLQljYXNlIEZCX0JMQU5LX1VOQkxBTks6Ci0JCS8qIFNjcmVlbiBPbjogSFN5bmM6IE9uLCBWU3luYyA6IE9uICovCi0JCXNtdGNfc2VxdygweDAxLCAoc210Y19zZXFyKDB4MDEpICYgKH4weDIwKSkpOwotCQlzbXRjX3NlcXcoMHg2YSwgMHgxNik7Ci0JCXNtdGNfc2VxdygweDZiLCAweDAyKTsKLQkJc210Y19zZXF3KDB4MjEsIChzbXRjX3NlcXIoMHgyMSkgJiAweDc3KSk7Ci0JCXNtdGNfc2VxdygweDIyLCAoc210Y19zZXFyKDB4MjIpICYgKH4weDMwKSkpOwotCQlzbXRjX3NlcXcoMHgyMywgKHNtdGNfc2VxcigweDIzKSAmICh+MHhjMCkpKTsKLQkJc210Y19zZXF3KDB4MjQsIChzbXRjX3NlcXIoMHgyNCkgfCAweDAxKSk7Ci0JCXNtdGNfc2VxdygweDMxLCAoc210Y19zZXFyKDB4MzEpIHwgMHgwMykpOwotCQlicmVhazsKLQljYXNlIEZCX0JMQU5LX05PUk1BTDoKLQkJLyogU2NyZWVuIE9mZjogSFN5bmM6IE9uLCBWU3luYyA6IE9uICAgU29mdCBibGFuayAqLwotCQlzbXRjX3NlcXcoMHgwMSwgKHNtdGNfc2VxcigweDAxKSAmICh+MHgyMCkpKTsKLQkJc210Y19zZXF3KDB4NmEsIDB4MTYpOwotCQlzbXRjX3NlcXcoMHg2YiwgMHgwMik7Ci0JCXNtdGNfc2VxdygweDIyLCAoc210Y19zZXFyKDB4MjIpICYgKH4weDMwKSkpOwotCQlzbXRjX3NlcXcoMHgyMywgKHNtdGNfc2VxcigweDIzKSAmICh+MHhjMCkpKTsKLQkJc210Y19zZXF3KDB4MjQsIChzbXRjX3NlcXIoMHgyNCkgfCAweDAxKSk7Ci0JCXNtdGNfc2VxdygweDMxLCAoKHNtdGNfc2VxcigweDMxKSAmICh+MHgwNykpIHwgMHgwMCkpOwotCQlicmVhazsKLQljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6Ci0JCS8qIFNjcmVlbiBPbjogSFN5bmM6IE9uLCBWU3luYyA6IE9mZiAqLwotCQlzbXRjX3NlcXcoMHgwMSwgKHNtdGNfc2VxcigweDAxKSB8IDB4MjApKTsKLQkJc210Y19zZXF3KDB4MjAsIChzbXRjX3NlcXIoMHgyMCkgJiAofjB4QjApKSk7Ci0JCXNtdGNfc2VxdygweDZhLCAweDBjKTsKLQkJc210Y19zZXF3KDB4NmIsIDB4MDIpOwotCQlzbXRjX3NlcXcoMHgyMSwgKHNtdGNfc2VxcigweDIxKSB8IDB4ODgpKTsKLQkJc210Y19zZXF3KDB4MjIsICgoc210Y19zZXFyKDB4MjIpICYgKH4weDMwKSkgfCAweDIwKSk7Ci0JCXNtdGNfc2VxdygweDIzLCAoKHNtdGNfc2VxcigweDIzKSAmICh+MHhjMCkpIHwgMHgyMCkpOwotCQlzbXRjX3NlcXcoMHgyNCwgKHNtdGNfc2VxcigweDI0KSAmICh+MHgwMSkpKTsKLQkJc210Y19zZXF3KDB4MzEsICgoc210Y19zZXFyKDB4MzEpICYgKH4weDA3KSkgfCAweDAwKSk7Ci0JCXNtdGNfc2VxdygweDM0LCAoc210Y19zZXFyKDB4MzQpIHwgMHg4MCkpOwotCQlicmVhazsKLQljYXNlIEZCX0JMQU5LX0hTWU5DX1NVU1BFTkQ6Ci0JCS8qIFNjcmVlbiBPbjogSFN5bmM6IE9mZiwgVlN5bmMgOiBPbiAqLwotCQlzbXRjX3NlcXcoMHgwMSwgKHNtdGNfc2VxcigweDAxKSB8IDB4MjApKTsKLQkJc210Y19zZXF3KDB4MjAsIChzbXRjX3NlcXIoMHgyMCkgJiAofjB4QjApKSk7Ci0JCXNtdGNfc2VxdygweDZhLCAweDBjKTsKLQkJc210Y19zZXF3KDB4NmIsIDB4MDIpOwotCQlzbXRjX3NlcXcoMHgyMSwgKHNtdGNfc2VxcigweDIxKSB8IDB4ODgpKTsKLQkJc210Y19zZXF3KDB4MjIsICgoc210Y19zZXFyKDB4MjIpICYgKH4weDMwKSkgfCAweDEwKSk7Ci0JCXNtdGNfc2VxdygweDIzLCAoKHNtdGNfc2VxcigweDIzKSAmICh+MHhjMCkpIHwgMHhEOCkpOwotCQlzbXRjX3NlcXcoMHgyNCwgKHNtdGNfc2VxcigweDI0KSAmICh+MHgwMSkpKTsKLQkJc210Y19zZXF3KDB4MzEsICgoc210Y19zZXFyKDB4MzEpICYgKH4weDA3KSkgfCAweDAwKSk7Ci0JCXNtdGNfc2VxdygweDM0LCAoc210Y19zZXFyKDB4MzQpIHwgMHg4MCkpOwotCQlicmVhazsKLQljYXNlIEZCX0JMQU5LX1BPV0VSRE9XTjoKLQkJLyogU2NyZWVuIE9uOiBIU3luYzogT2ZmLCBWU3luYyA6IE9mZiAqLwotCQlzbXRjX3NlcXcoMHgwMSwgKHNtdGNfc2VxcigweDAxKSB8IDB4MjApKTsKLQkJc210Y19zZXF3KDB4MjAsIChzbXRjX3NlcXIoMHgyMCkgJiAofjB4QjApKSk7Ci0JCXNtdGNfc2VxdygweDZhLCAweDBjKTsKLQkJc210Y19zZXF3KDB4NmIsIDB4MDIpOwotCQlzbXRjX3NlcXcoMHgyMSwgKHNtdGNfc2VxcigweDIxKSB8IDB4ODgpKTsKLQkJc210Y19zZXF3KDB4MjIsICgoc210Y19zZXFyKDB4MjIpICYgKH4weDMwKSkgfCAweDMwKSk7Ci0JCXNtdGNfc2VxdygweDIzLCAoKHNtdGNfc2VxcigweDIzKSAmICh+MHhjMCkpIHwgMHhEOCkpOwotCQlzbXRjX3NlcXcoMHgyNCwgKHNtdGNfc2VxcigweDI0KSAmICh+MHgwMSkpKTsKLQkJc210Y19zZXF3KDB4MzEsICgoc210Y19zZXFyKDB4MzEpICYgKH4weDA3KSkgfCAweDAwKSk7Ci0JCXNtdGNfc2VxdygweDM0LCAoc210Y19zZXFyKDB4MzQpIHwgMHg4MCkpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbXRjX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKLQkJCSAgdW5zaWduZWQgYmx1ZSwgdW5zaWduZWQgdHJhbnMsIHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCXN0cnVjdCBzbXRjZmJfaW5mbyAqc2ZiOwotCXUzMiB2YWw7Ci0KLQlzZmIgPSBpbmZvLT5wYXI7Ci0KLQlpZiAocmVnbm8gPiAyNTUpCi0JCXJldHVybiAxOwotCi0Jc3dpdGNoIChzZmItPmZiLmZpeC52aXN1YWwpIHsKLQljYXNlIEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUjoKLQljYXNlIEZCX1ZJU1VBTF9UUlVFQ09MT1I6Ci0JCS8qCi0JCSAqIDE2LzMyIGJpdCB0cnVlLWNvbG91ciwgdXNlIHBzZXVkby1wYWxldHRlIGZvciAxNiBiYXNlIGNvbG9yCi0JCSAqLwotCQlpZiAocmVnbm8gPCAxNikgewotCQkJaWYgKHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsID09IDE2KSB7Ci0JCQkJdTMyICpwYWwgPSBzZmItPmZiLnBzZXVkb19wYWxldHRlOwotCQkJCXZhbCA9IGNoYW5fdG9fZmllbGQocmVkLCAmc2ZiLT5mYi52YXIucmVkKTsKLQkJCQl2YWwgfD0gY2hhbl90b19maWVsZChncmVlbiwgJnNmYi0+ZmIudmFyLmdyZWVuKTsKLQkJCQl2YWwgfD0gY2hhbl90b19maWVsZChibHVlLCAmc2ZiLT5mYi52YXIuYmx1ZSk7Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JCQkJcGFsW3JlZ25vXSA9Ci0JCQkJICAgICgocmVkICYgMHhmODAwKSA+PiA4KSB8Ci0JCQkJICAgICgoZ3JlZW4gJiAweGUwMDApID4+IDEzKSB8Ci0JCQkJICAgICgoZ3JlZW4gJiAweDFjMDApIDw8IDMpIHwKLQkJCQkgICAgKChibHVlICYgMHhmODAwKSA+PiAzKTsKLSNlbHNlCi0JCQkJcGFsW3JlZ25vXSA9IHZhbDsKLSNlbmRpZgotCQkJfSBlbHNlIHsKLQkJCQl1MzIgKnBhbCA9IHNmYi0+ZmIucHNldWRvX3BhbGV0dGU7Ci0JCQkJdmFsID0gY2hhbl90b19maWVsZChyZWQsICZzZmItPmZiLnZhci5yZWQpOwotCQkJCXZhbCB8PSBjaGFuX3RvX2ZpZWxkKGdyZWVuLCAmc2ZiLT5mYi52YXIuZ3JlZW4pOwotCQkJCXZhbCB8PSBjaGFuX3RvX2ZpZWxkKGJsdWUsICZzZmItPmZiLnZhci5ibHVlKTsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQkJCQl2YWwgPQotCQkJCSAgICAodmFsICYgMHhmZjAwZmYwMCA+PiA4KSB8Ci0JCQkJICAgICh2YWwgJiAweDAwZmYwMGZmIDw8IDgpOwotI2VuZGlmCi0JCQkJcGFsW3JlZ25vXSA9IHZhbDsKLQkJCX0KLQkJfQotCQlicmVhazsKLQotCWNhc2UgRkJfVklTVUFMX1BTRVVET0NPTE9SOgotCQkvKiBjb2xvciBkZXB0aCA4IGJpdCAqLwotCQlzbTcxMl9zZXRwYWxldHRlKHJlZ25vLCByZWQsIGdyZWVuLCBibHVlLCBpbmZvKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gMTsJLyogdW5rbm93biB0eXBlICovCi0JfQotCi0JcmV0dXJuIDA7Ci0KLX0KLQotI2lmZGVmIF9fQklHX0VORElBTgotc3RhdGljIHNzaXplX3Qgc210Y2ZiX3JlYWQoc3RydWN0IGZiX2luZm8gKmluZm8sIGNoYXIgX191c2VyICpidWYsIHNpemVfdAotCQkJCWNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JdW5zaWduZWQgbG9uZyBwID0gKnBwb3M7Ci0KLQl1MzIgKmJ1ZmZlciwgKmRzdDsKLQl1MzIgX19pb21lbSAqc3JjOwotCWludCBjLCBpLCBjbnQgPSAwLCBlcnIgPSAwOwotCXVuc2lnbmVkIGxvbmcgdG90YWxfc2l6ZTsKLQotCWlmICghaW5mbyB8fCAhaW5mby0+c2NyZWVuX2Jhc2UpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JdG90YWxfc2l6ZSA9IGluZm8tPnNjcmVlbl9zaXplOwotCi0JaWYgKHRvdGFsX3NpemUgPT0gMCkKLQkJdG90YWxfc2l6ZSA9IGluZm8tPmZpeC5zbWVtX2xlbjsKLQotCWlmIChwID49IHRvdGFsX3NpemUpCi0JCXJldHVybiAwOwotCi0JaWYgKGNvdW50ID49IHRvdGFsX3NpemUpCi0JCWNvdW50ID0gdG90YWxfc2l6ZTsKLQotCWlmIChjb3VudCArIHAgPiB0b3RhbF9zaXplKQotCQljb3VudCA9IHRvdGFsX3NpemUgLSBwOwotCi0JYnVmZmVyID0ga21hbGxvYygoY291bnQgPiBQQUdFX1NJWkUpID8gUEFHRV9TSVpFIDogY291bnQsIEdGUF9LRVJORUwpOwotCWlmICghYnVmZmVyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNyYyA9ICh1MzIgX19pb21lbSAqKSAoaW5mby0+c2NyZWVuX2Jhc2UgKyBwKTsKLQotCWlmIChpbmZvLT5mYm9wcy0+ZmJfc3luYykKLQkJaW5mby0+ZmJvcHMtPmZiX3N5bmMoaW5mbyk7Ci0KLQl3aGlsZSAoY291bnQpIHsKLQkJYyA9IChjb3VudCA+IFBBR0VfU0laRSkgPyBQQUdFX1NJWkUgOiBjb3VudDsKLQkJZHN0ID0gYnVmZmVyOwotCQlmb3IgKGkgPSBjID4+IDI7IGktLTspIHsKLQkJCSpkc3QgPSBmYl9yZWFkbChzcmMrKyk7Ci0JCQkqZHN0ID0KLQkJCSAgICAoKmRzdCAmIDB4ZmYwMGZmMDAgPj4gOCkgfAotCQkJICAgICgqZHN0ICYgMHgwMGZmMDBmZiA8PCA4KTsKLQkJCWRzdCsrOwotCQl9Ci0JCWlmIChjICYgMykgewotCQkJdTggKmRzdDggPSAodTggKikgZHN0OwotCQkJdTggX19pb21lbSAqc3JjOCA9ICh1OCBfX2lvbWVtICopIHNyYzsKLQotCQkJZm9yIChpID0gYyAmIDM7IGktLTspIHsKLQkJCQlpZiAoaSAmIDEpIHsKLQkJCQkJKmRzdDgrKyA9IGZiX3JlYWRiKCsrc3JjOCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJKmRzdDgrKyA9IGZiX3JlYWRiKC0tc3JjOCk7Ci0JCQkJCXNyYzggKz0gMjsKLQkJCQl9Ci0JCQl9Ci0JCQlzcmMgPSAodTMyIF9faW9tZW0gKikgc3JjODsKLQkJfQotCi0JCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBidWZmZXIsIGMpKSB7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJKnBwb3MgKz0gYzsKLQkJYnVmICs9IGM7Ci0JCWNudCArPSBjOwotCQljb3VudCAtPSBjOwotCX0KLQotCWtmcmVlKGJ1ZmZlcik7Ci0KLQlyZXR1cm4gKGVycikgPyBlcnIgOiBjbnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1zbXRjZmJfd3JpdGUoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKLQkgICAgIGxvZmZfdCAqcHBvcykKLXsKLQl1bnNpZ25lZCBsb25nIHAgPSAqcHBvczsKLQotCXUzMiAqYnVmZmVyLCAqc3JjOwotCXUzMiBfX2lvbWVtICpkc3Q7Ci0JaW50IGMsIGksIGNudCA9IDAsIGVyciA9IDA7Ci0JdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplOwotCi0JaWYgKCFpbmZvIHx8ICFpbmZvLT5zY3JlZW5fYmFzZSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCi0JCXJldHVybiAtRVBFUk07Ci0KLQl0b3RhbF9zaXplID0gaW5mby0+c2NyZWVuX3NpemU7Ci0KLQlpZiAodG90YWxfc2l6ZSA9PSAwKQotCQl0b3RhbF9zaXplID0gaW5mby0+Zml4LnNtZW1fbGVuOwotCi0JaWYgKHAgPiB0b3RhbF9zaXplKQotCQlyZXR1cm4gLUVGQklHOwotCi0JaWYgKGNvdW50ID4gdG90YWxfc2l6ZSkgewotCQllcnIgPSAtRUZCSUc7Ci0JCWNvdW50ID0gdG90YWxfc2l6ZTsKLQl9Ci0KLQlpZiAoY291bnQgKyBwID4gdG90YWxfc2l6ZSkgewotCQlpZiAoIWVycikKLQkJCWVyciA9IC1FTk9TUEM7Ci0KLQkJY291bnQgPSB0b3RhbF9zaXplIC0gcDsKLQl9Ci0KLQlidWZmZXIgPSBrbWFsbG9jKChjb3VudCA+IFBBR0VfU0laRSkgPyBQQUdFX1NJWkUgOiBjb3VudCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmZXIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZHN0ID0gKHUzMiBfX2lvbWVtICopIChpbmZvLT5zY3JlZW5fYmFzZSArIHApOwotCi0JaWYgKGluZm8tPmZib3BzLT5mYl9zeW5jKQotCQlpbmZvLT5mYm9wcy0+ZmJfc3luYyhpbmZvKTsKLQotCXdoaWxlIChjb3VudCkgewotCQljID0gKGNvdW50ID4gUEFHRV9TSVpFKSA/IFBBR0VfU0laRSA6IGNvdW50OwotCQlzcmMgPSBidWZmZXI7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKHNyYywgYnVmLCBjKSkgewotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZm9yIChpID0gYyA+PiAyOyBpLS07KSB7Ci0JCQlmYl93cml0ZWwoKCpzcmMgJiAweGZmMDBmZjAwID4+IDgpIHwKLQkJCQkgICgqc3JjICYgMHgwMGZmMDBmZiA8PCA4KSwgZHN0KyspOwotCQkJc3JjKys7Ci0JCX0KLQkJaWYgKGMgJiAzKSB7Ci0JCQl1OCAqc3JjOCA9ICh1OCAqKSBzcmM7Ci0JCQl1OCBfX2lvbWVtICpkc3Q4ID0gKHU4IF9faW9tZW0gKikgZHN0OwotCi0JCQlmb3IgKGkgPSBjICYgMzsgaS0tOykgewotCQkJCWlmIChpICYgMSkgewotCQkJCQlmYl93cml0ZWIoKnNyYzgrKywgKytkc3Q4KTsKLQkJCQl9IGVsc2UgewotCQkJCQlmYl93cml0ZWIoKnNyYzgrKywgLS1kc3Q4KTsKLQkJCQkJZHN0OCArPSAyOwotCQkJCX0KLQkJCX0KLQkJCWRzdCA9ICh1MzIgX19pb21lbSAqKSBkc3Q4OwotCQl9Ci0KLQkJKnBwb3MgKz0gYzsKLQkJYnVmICs9IGM7Ci0JCWNudCArPSBjOwotCQljb3VudCAtPSBjOwotCX0KLQotCWtmcmVlKGJ1ZmZlcik7Ci0KLQlyZXR1cm4gKGNudCkgPyBjbnQgOiBlcnI7Ci19Ci0jZW5kaWYJLyogISBfX0JJR19FTkRJQU4gKi8KLQotc3RhdGljIHZvaWQgc203eHhfc2V0X3RpbWluZyhzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYikKLXsKLQlpbnQgaSA9IDAsIGogPSAwOwotCXUzMiBtX25TY3JlZW5TdHJpZGU7Ci0KLQlkZXZfZGJnKCZzZmItPnBkZXYtPmRldiwKLQkJInNmYi0+d2lkdGg9JWQgc2ZiLT5oZWlnaHQ9JWQgIgotCQkic2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWw9JWQgc2ZiLT5oej0lZFxuIiwKLQkJc2ZiLT53aWR0aCwgc2ZiLT5oZWlnaHQsIHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsLCBzZmItPmh6KTsKLQotCWZvciAoaiA9IDA7IGogPCBudW1WR0FNb2RlczsgaisrKSB7Ci0JCWlmIChWR0FNb2RlW2pdLm1tU2l6ZVggPT0gc2ZiLT53aWR0aCAmJgotCQkgICAgVkdBTW9kZVtqXS5tbVNpemVZID09IHNmYi0+aGVpZ2h0ICYmCi0JCSAgICBWR0FNb2RlW2pdLmJwcCA9PSBzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCAmJgotCQkgICAgVkdBTW9kZVtqXS5oeiA9PSBzZmItPmh6KSB7Ci0KLQkJCWRldl9kYmcoJnNmYi0+cGRldi0+ZGV2LAotCQkJCSJWR0FNb2RlW2pdLm1tU2l6ZVg9JWQgVkdBTW9kZVtqXS5tbVNpemVZPSVkICIKLQkJCQkiVkdBTW9kZVtqXS5icHA9JWQgVkdBTW9kZVtqXS5oej0lZFxuIiwKLQkJCQlWR0FNb2RlW2pdLm1tU2l6ZVgsIFZHQU1vZGVbal0ubW1TaXplWSwKLQkJCQlWR0FNb2RlW2pdLmJwcCwgVkdBTW9kZVtqXS5oeik7Ci0KLQkJCWRldl9kYmcoJnNmYi0+cGRldi0+ZGV2LCAiVkdBTW9kZSBpbmRleD0lZFxuIiwgaik7Ci0KLQkJCXNtdGNfbW1pb3diKDB4MCwgMHgzYzYpOwotCi0JCQlzbXRjX3NlcXcoMCwgMHgxKTsKLQotCQkJc210Y19tbWlvd2IoVkdBTW9kZVtqXS5Jbml0X01JU0MsIDB4M2MyKTsKLQotCQkJLyogaW5pdCBTRVEgcmVnaXN0ZXIgU1IwMCAtIFNSMDQgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBTSVpFX1NSMDBfU1IwNDsgaSsrKQotCQkJCXNtdGNfc2VxdyhpLCBWR0FNb2RlW2pdLkluaXRfU1IwMF9TUjA0W2ldKTsKLQotCQkJLyogaW5pdCBTRVEgcmVnaXN0ZXIgU1IxMCAtIFNSMjQgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBTSVpFX1NSMTBfU1IyNDsgaSsrKQotCQkJCXNtdGNfc2VxdyhpICsgMHgxMCwKLQkJCQkJICBWR0FNb2RlW2pdLkluaXRfU1IxMF9TUjI0W2ldKTsKLQotCQkJLyogaW5pdCBTRVEgcmVnaXN0ZXIgU1IzMCAtIFNSNzUgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBTSVpFX1NSMzBfU1I3NTsgaSsrKQotCQkJCWlmICgoaSArIDB4MzApICE9IDB4NjIgJiYKLQkJCQkgICAgKGkgKyAweDMwKSAhPSAweDZhICYmCi0JCQkJICAgIChpICsgMHgzMCkgIT0gMHg2YikKLQkJCQkJc210Y19zZXF3KGkgKyAweDMwLAotCQkJCQkJVkdBTW9kZVtqXS5Jbml0X1NSMzBfU1I3NVtpXSk7Ci0KLQkJCS8qIGluaXQgU0VRIHJlZ2lzdGVyIFNSODAgLSBTUjkzICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgU0laRV9TUjgwX1NSOTM7IGkrKykKLQkJCQlzbXRjX3NlcXcoaSArIDB4ODAsCi0JCQkJCSAgVkdBTW9kZVtqXS5Jbml0X1NSODBfU1I5M1tpXSk7Ci0KLQkJCS8qIGluaXQgU0VRIHJlZ2lzdGVyIFNSQTAgLSBTUkFGICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgU0laRV9TUkEwX1NSQUY7IGkrKykKLQkJCQlzbXRjX3NlcXcoaSArIDB4YTAsCi0JCQkJCSAgVkdBTW9kZVtqXS5Jbml0X1NSQTBfU1JBRltpXSk7Ci0KLQkJCS8qIGluaXQgR3JhcGhpYyByZWdpc3RlciBHUjAwIC0gR1IwOCAqLwotCQkJZm9yIChpID0gMDsgaSA8IFNJWkVfR1IwMF9HUjA4OyBpKyspCi0JCQkJc210Y19ncnBodyhpLCBWR0FNb2RlW2pdLkluaXRfR1IwMF9HUjA4W2ldKTsKLQotCQkJLyogaW5pdCBBdHRyaWJ1dGUgcmVnaXN0ZXIgQVIwMCAtIEFSMTQgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBTSVpFX0FSMDBfQVIxNDsgaSsrKQotCQkJCXNtdGNfYXR0cncoaSwgVkdBTW9kZVtqXS5Jbml0X0FSMDBfQVIxNFtpXSk7Ci0KLQkJCS8qIGluaXQgQ1JUQyByZWdpc3RlciBDUjAwIC0gQ1IxOCAqLwotCQkJZm9yIChpID0gMDsgaSA8IFNJWkVfQ1IwMF9DUjE4OyBpKyspCi0JCQkJc210Y19jcnRjdyhpLCBWR0FNb2RlW2pdLkluaXRfQ1IwMF9DUjE4W2ldKTsKLQotCQkJLyogaW5pdCBDUlRDIHJlZ2lzdGVyIENSMzAgLSBDUjREICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgU0laRV9DUjMwX0NSNEQ7IGkrKykKLQkJCQlzbXRjX2NydGN3KGkgKyAweDMwLAotCQkJCQkgICBWR0FNb2RlW2pdLkluaXRfQ1IzMF9DUjREW2ldKTsKLQotCQkJLyogaW5pdCBDUlRDIHJlZ2lzdGVyIENSOTAgLSBDUkE3ICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgU0laRV9DUjkwX0NSQTc7IGkrKykKLQkJCQlzbXRjX2NydGN3KGkgKyAweDkwLAotCQkJCQkgICBWR0FNb2RlW2pdLkluaXRfQ1I5MF9DUkE3W2ldKTsKLQkJfQotCX0KLQlzbXRjX21taW93YigweDY3LCAweDNjMik7Ci0KLQkvKiBzZXQgVlBSIHJlZ2lzdGVycyAqLwotCXdyaXRlbCgweDAsIHNmYi0+dnBfcmVncyArIDB4MEMpOwotCXdyaXRlbCgweDAsIHNmYi0+dnBfcmVncyArIDB4NDApOwotCi0JLyogc2V0IGRhdGEgd2lkdGggKi8KLQltX25TY3JlZW5TdHJpZGUgPQotCQkoc2ZiLT53aWR0aCAqIHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsKSAvIDY0OwotCXN3aXRjaCAoc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwpIHsKLQljYXNlIDg6Ci0JCXdyaXRlbCgweDAsIHNmYi0+dnBfcmVncyArIDB4MCk7Ci0JCWJyZWFrOwotCWNhc2UgMTY6Ci0JCXdyaXRlbCgweDAwMDIwMDAwLCBzZmItPnZwX3JlZ3MgKyAweDApOwotCQlicmVhazsKLQljYXNlIDI0OgotCQl3cml0ZWwoMHgwMDA0MDAwMCwgc2ZiLT52cF9yZWdzICsgMHgwKTsKLQkJYnJlYWs7Ci0JY2FzZSAzMjoKLQkJd3JpdGVsKDB4MDAwMzAwMDAsIHNmYi0+dnBfcmVncyArIDB4MCk7Ci0JCWJyZWFrOwotCX0KLQl3cml0ZWwoKHUzMikgKCgobV9uU2NyZWVuU3RyaWRlICsgMikgPDwgMTYpIHwgbV9uU2NyZWVuU3RyaWRlKSwKLQkgICAgICAgc2ZiLT52cF9yZWdzICsgMHgxMCk7Ci0KLX0KLQotc3RhdGljIHZvaWQgc210Y19zZXRfdGltaW5nKHN0cnVjdCBzbXRjZmJfaW5mbyAqc2ZiKQotewotCXN3aXRjaCAoc2ZiLT5jaGlwX2lkKSB7Ci0JY2FzZSAweDcxMDoKLQljYXNlIDB4NzEyOgotCWNhc2UgMHg3MjA6Ci0JCXNtN3h4X3NldF90aW1pbmcoc2ZiKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzbXRjZmJfc2V0bW9kZShzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYikKLXsKLQlzd2l0Y2ggKHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsKSB7Ci0JY2FzZSAzMjoKLQkJc2ZiLT5mYi5maXgudmlzdWFsICAgICAgID0gRkJfVklTVUFMX1RSVUVDT0xPUjsKLQkJc2ZiLT5mYi5maXgubGluZV9sZW5ndGggID0gc2ZiLT5mYi52YXIueHJlcyAqIDQ7Ci0JCXNmYi0+ZmIudmFyLnJlZC5sZW5ndGggICA9IDg7Ci0JCXNmYi0+ZmIudmFyLmdyZWVuLmxlbmd0aCA9IDg7Ci0JCXNmYi0+ZmIudmFyLmJsdWUubGVuZ3RoICA9IDg7Ci0JCXNmYi0+ZmIudmFyLnJlZC5vZmZzZXQgICA9IDE2OwotCQlzZmItPmZiLnZhci5ncmVlbi5vZmZzZXQgPSA4OwotCQlzZmItPmZiLnZhci5ibHVlLm9mZnNldCAgPSAwOwotCQlicmVhazsKLQljYXNlIDI0OgotCQlzZmItPmZiLmZpeC52aXN1YWwgICAgICAgPSBGQl9WSVNVQUxfVFJVRUNPTE9SOwotCQlzZmItPmZiLmZpeC5saW5lX2xlbmd0aCAgPSBzZmItPmZiLnZhci54cmVzICogMzsKLQkJc2ZiLT5mYi52YXIucmVkLmxlbmd0aCAgID0gODsKLQkJc2ZiLT5mYi52YXIuZ3JlZW4ubGVuZ3RoID0gODsKLQkJc2ZiLT5mYi52YXIuYmx1ZS5sZW5ndGggID0gODsKLQkJc2ZiLT5mYi52YXIucmVkLm9mZnNldCAgID0gMTY7Ci0JCXNmYi0+ZmIudmFyLmdyZWVuLm9mZnNldCA9IDg7Ci0JCXNmYi0+ZmIudmFyLmJsdWUub2Zmc2V0ICA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgODoKLQkJc2ZiLT5mYi5maXgudmlzdWFsICAgICAgID0gRkJfVklTVUFMX1BTRVVET0NPTE9SOwotCQlzZmItPmZiLmZpeC5saW5lX2xlbmd0aCAgPSBzZmItPmZiLnZhci54cmVzOwotCQlzZmItPmZiLnZhci5yZWQubGVuZ3RoICAgPSAzOwotCQlzZmItPmZiLnZhci5ncmVlbi5sZW5ndGggPSAzOwotCQlzZmItPmZiLnZhci5ibHVlLmxlbmd0aCAgPSAyOwotCQlzZmItPmZiLnZhci5yZWQub2Zmc2V0ICAgPSA1OwotCQlzZmItPmZiLnZhci5ncmVlbi5vZmZzZXQgPSAyOwotCQlzZmItPmZiLnZhci5ibHVlLm9mZnNldCAgPSAwOwotCQlicmVhazsKLQljYXNlIDE2OgotCWRlZmF1bHQ6Ci0JCXNmYi0+ZmIuZml4LnZpc3VhbCAgICAgICA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7Ci0JCXNmYi0+ZmIuZml4LmxpbmVfbGVuZ3RoICA9IHNmYi0+ZmIudmFyLnhyZXMgKiAyOwotCQlzZmItPmZiLnZhci5yZWQubGVuZ3RoICAgPSA1OwotCQlzZmItPmZiLnZhci5ncmVlbi5sZW5ndGggPSA2OwotCQlzZmItPmZiLnZhci5ibHVlLmxlbmd0aCAgPSA1OwotCQlzZmItPmZiLnZhci5yZWQub2Zmc2V0ICAgPSAxMTsKLQkJc2ZiLT5mYi52YXIuZ3JlZW4ub2Zmc2V0ID0gNTsKLQkJc2ZiLT5mYi52YXIuYmx1ZS5vZmZzZXQgID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0Jc2ZiLT53aWR0aCAgPSBzZmItPmZiLnZhci54cmVzOwotCXNmYi0+aGVpZ2h0ID0gc2ZiLT5mYi52YXIueXJlczsKLQlzZmItPmh6ID0gNjA7Ci0Jc210Y19zZXRfdGltaW5nKHNmYik7Ci19Ci0KLXN0YXRpYyBpbnQgc210Y19jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCS8qIHNhbml0eSBjaGVja3MgKi8KLQlpZiAodmFyLT54cmVzX3ZpcnR1YWwgPCB2YXItPnhyZXMpCi0JCXZhci0+eHJlc192aXJ0dWFsID0gdmFyLT54cmVzOwotCi0JaWYgKHZhci0+eXJlc192aXJ0dWFsIDwgdmFyLT55cmVzKQotCQl2YXItPnlyZXNfdmlydHVhbCA9IHZhci0+eXJlczsKLQotCS8qIHNldCB2YWxpZCBkZWZhdWx0IGJwcCAqLwotCWlmICgodmFyLT5iaXRzX3Blcl9waXhlbCAhPSA4KSAgJiYgKHZhci0+Yml0c19wZXJfcGl4ZWwgIT0gMTYpICYmCi0JICAgICh2YXItPmJpdHNfcGVyX3BpeGVsICE9IDI0KSAmJiAodmFyLT5iaXRzX3Blcl9waXhlbCAhPSAzMikpCi0JCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAxNjsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNtdGNfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlzbXRjZmJfc2V0bW9kZShpbmZvLT5wYXIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHNtdGNmYl9vcHMgPSB7Ci0JLm93bmVyICAgICAgICA9IFRISVNfTU9EVUxFLAotCS5mYl9jaGVja192YXIgPSBzbXRjX2NoZWNrX3ZhciwKLQkuZmJfc2V0X3BhciAgID0gc210Y19zZXRfcGFyLAotCS5mYl9zZXRjb2xyZWcgPSBzbXRjX3NldGNvbHJlZywKLQkuZmJfYmxhbmsgICAgID0gc210Y19ibGFuaywKLQkuZmJfZmlsbHJlY3QgID0gY2ZiX2ZpbGxyZWN0LAotCS5mYl9pbWFnZWJsaXQgPSBjZmJfaW1hZ2VibGl0LAotCS5mYl9jb3B5YXJlYSAgPSBjZmJfY29weWFyZWEsCi0jaWZkZWYgX19CSUdfRU5ESUFOCi0JLmZiX3JlYWQgICAgICA9IHNtdGNmYl9yZWFkLAotCS5mYl93cml0ZSAgICAgPSBzbXRjZmJfd3JpdGUsCi0jZW5kaWYKLX07Ci0KLS8qCi0gKiBhbGxvYyBzdHJ1Y3Qgc210Y2ZiX2luZm8gYW5kIGFzc2lnbiBkZWZhdWx0IHZhbHVlcwotICovCi1zdGF0aWMgc3RydWN0IHNtdGNmYl9pbmZvICpzbXRjX2FsbG9jX2ZiX2luZm8oc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IHNtdGNmYl9pbmZvICpzZmI7Ci0KLQlzZmIgPSBremFsbG9jKHNpemVvZigqc2ZiKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIXNmYikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzZmItPnBkZXYgPSBwZGV2OwotCi0Jc2ZiLT5mYi5mbGFncyAgICAgICAgICA9IEZCSU5GT19GTEFHX0RFRkFVTFQ7Ci0Jc2ZiLT5mYi5mYm9wcyAgICAgICAgICA9ICZzbXRjZmJfb3BzOwotCXNmYi0+ZmIuZml4ICAgICAgICAgICAgPSBzbXRjZmJfZml4OwotCXNmYi0+ZmIudmFyICAgICAgICAgICAgPSBzbXRjZmJfdmFyOwotCXNmYi0+ZmIucHNldWRvX3BhbGV0dGUgPSBzZmItPmNvbHJlZzsKLQlzZmItPmZiLnBhciAgICAgICAgICAgID0gc2ZiOwotCi0JcmV0dXJuIHNmYjsKLX0KLQotLyoKLSAqIGZyZWUgc3RydWN0IHNtdGNmYl9pbmZvCi0gKi8KLXN0YXRpYyB2b2lkIHNtdGNfZnJlZV9mYl9pbmZvKHN0cnVjdCBzbXRjZmJfaW5mbyAqc2ZiKQotewotCWtmcmVlKHNmYik7Ci19Ci0KLS8qCi0gKiBVbm1hcCBpbiB0aGUgbWVtb3J5IG1hcHBlZCBJTyByZWdpc3RlcnMKLSAqLwotCi1zdGF0aWMgdm9pZCBzbXRjX3VubWFwX21taW8oc3RydWN0IHNtdGNmYl9pbmZvICpzZmIpCi17Ci0JaWYgKHNmYiAmJiBzbXRjX1JlZ0Jhc2VBZGRyZXNzKQotCQlzbXRjX1JlZ0Jhc2VBZGRyZXNzID0gTlVMTDsKLX0KLQotLyoKLSAqIE1hcCBpbiB0aGUgc2NyZWVuIG1lbW9yeQotICovCi0KLXN0YXRpYyBpbnQgc210Y19tYXBfc21lbShzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYiwKLQkJc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVfbG9uZyBzbWVtX2xlbikKLXsKLQotCXNmYi0+ZmIuZml4LnNtZW1fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7Ci0KLSNpZmRlZiBfX0JJR19FTkRJQU4KLQlpZiAoc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwgPT0gMzIpCi0JCXNmYi0+ZmIuZml4LnNtZW1fc3RhcnQgKz0gMHg4MDAwMDA7Ci0jZW5kaWYKLQotCXNmYi0+ZmIuZml4LnNtZW1fbGVuID0gc21lbV9sZW47Ci0KLQlzZmItPmZiLnNjcmVlbl9iYXNlID0gc2ZiLT5sZmI7Ci0KLQlpZiAoIXNmYi0+ZmIuc2NyZWVuX2Jhc2UpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIiVzOiB1bmFibGUgdG8gbWFwIHNjcmVlbiBtZW1vcnlcbiIsIHNmYi0+ZmIuZml4LmlkKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBVbm1hcCBpbiB0aGUgc2NyZWVuIG1lbW9yeQotICoKLSAqLwotc3RhdGljIHZvaWQgc210Y191bm1hcF9zbWVtKHN0cnVjdCBzbXRjZmJfaW5mbyAqc2ZiKQotewotCWlmIChzZmIgJiYgc2ZiLT5mYi5zY3JlZW5fYmFzZSkgewotCQlpb3VubWFwKHNmYi0+ZmIuc2NyZWVuX2Jhc2UpOwotCQlzZmItPmZiLnNjcmVlbl9iYXNlID0gTlVMTDsKLQl9Ci19Ci0KLS8qCi0gKiBXZSBuZWVkIHRvIHdha2UgdXAgdGhlIGRldmljZSBhbmQgbWFrZSBzdXJlIGl0cyBpbiBsaW5lYXIgbWVtb3J5IG1vZGUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzbTd4eF9pbml0X2h3KHZvaWQpCi17Ci0Jb3V0Yl9wKDB4MTgsIDB4M2M0KTsKLQlvdXRiX3AoMHgxMSwgMHgzYzUpOwotfQotCi1zdGF0aWMgaW50IHNtdGNmYl9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKLXsKLQlzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYjsKLQl1X2xvbmcgc21lbV9zaXplID0gMHgwMDgwMDAwMDsJLyogZGVmYXVsdCA4TUIgKi8KLQlpbnQgZXJyOwotCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlOwotCi0JZGV2X2luZm8oJnBkZXYtPmRldiwgIlNpbGljb24gTW90aW9uIGRpc3BsYXkgZHJpdmVyLiIpOwotCi0JZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CS8qIGVuYWJsZSBTTVRDIGNoaXAgKi8KLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0Jc3ByaW50ZihzbXRjZmJfZml4LmlkLCAic20lWGZiIiwgZW50LT5kZXZpY2UpOwotCi0Jc2ZiID0gc210Y19hbGxvY19mYl9pbmZvKHBkZXYpOwotCi0JaWYgKCFzZmIpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBmYWlsZWRfZnJlZTsKLQl9Ci0KLQlzZmItPmNoaXBfaWQgPSBlbnQtPmRldmljZTsKLQotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBzZmIpOwotCi0Jc203eHhfaW5pdF9odygpOwotCi0JLyogZ2V0IG1vZGUgcGFyYW1ldGVyIGZyb20gc210Y19zY3JfaW5mbyAqLwotCWlmIChzbXRjX3Njcl9pbmZvLmxmYl93aWR0aCAhPSAwKSB7Ci0JCXNmYi0+ZmIudmFyLnhyZXMgPSBzbXRjX3Njcl9pbmZvLmxmYl93aWR0aDsKLQkJc2ZiLT5mYi52YXIueXJlcyA9IHNtdGNfc2NyX2luZm8ubGZiX2hlaWdodDsKLQkJc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwgPSBzbXRjX3Njcl9pbmZvLmxmYl9kZXB0aDsKLQl9IGVsc2UgewotCQkvKiBkZWZhdWx0IHJlc29sdXRpb24gMTAyNHg2MDAgMTZiaXQgbW9kZSAqLwotCQlzZmItPmZiLnZhci54cmVzID0gU0NSRUVOX1hfUkVTOwotCQlzZmItPmZiLnZhci55cmVzID0gU0NSRUVOX1lfUkVTOwotCQlzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCA9IFNDUkVFTl9CUFA7Ci0JfQotCi0jaWZkZWYgX19CSUdfRU5ESUFOCi0JaWYgKHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsID09IDI0KQotCQlzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCA9IChzbXRjX3Njcl9pbmZvLmxmYl9kZXB0aCA9IDMyKTsKLSNlbmRpZgotCS8qIE1hcCBhZGRyZXNzIGFuZCBtZW1vcnkgZGV0ZWN0aW9uICovCi0JbW1pb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnNmYi0+Y2hpcF9yZXZfaWQpOwotCi0Jc3dpdGNoIChzZmItPmNoaXBfaWQpIHsKLQljYXNlIDB4NzEwOgotCWNhc2UgMHg3MTI6Ci0JCXNmYi0+ZmIuZml4Lm1taW9fc3RhcnQgPSBtbWlvX2Jhc2UgKyAweDAwNDAwMDAwOwotCQlzZmItPmZiLmZpeC5tbWlvX2xlbiA9IDB4MDA0MDAwMDA7Ci0JCXNtZW1fc2l6ZSA9IFNNNzEyX1ZJREVPTUVNT1JZU0laRTsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQkJc2ZiLT5sZmIgPSBpb3JlbWFwKG1taW9fYmFzZSwgMHgwMGMwMDAwMCk7Ci0jZWxzZQotCQlzZmItPmxmYiA9IGlvcmVtYXAobW1pb19iYXNlLCAweDAwODAwMDAwKTsKLSNlbmRpZgotCQlzZmItPm1taW8gPSAoc210Y19SZWdCYXNlQWRkcmVzcyA9Ci0JCSAgICBzZmItPmxmYiArIDB4MDA3MDAwMDApOwotCQlzZmItPmRwX3JlZ3MgPSBzZmItPmxmYiArIDB4MDA0MDgwMDA7Ci0JCXNmYi0+dnBfcmVncyA9IHNmYi0+bGZiICsgMHgwMDQwYzAwMDsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQkJaWYgKHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsID09IDMyKSB7Ci0JCQlzZmItPmxmYiArPSAweDgwMDAwMDsKLQkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJzZmItPmxmYj0lcCIsIHNmYi0+bGZiKTsKLQkJfQotI2VuZGlmCi0JCWlmICghc210Y19SZWdCYXNlQWRkcmVzcykgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJCSIlczogdW5hYmxlIHRvIG1hcCBtZW1vcnkgbWFwcGVkIElPISIsCi0JCQkJc2ZiLT5mYi5maXguaWQpOwotCQkJZXJyID0gLUVOT01FTTsKLQkJCWdvdG8gZmFpbGVkX2ZiOwotCQl9Ci0KLQkJLyogc2V0IE1DTEsgPSAxNC4zMTgxOCAqICgweDE2IC8gMHgyKSAqLwotCQlzbXRjX3NlcXcoMHg2YSwgMHgxNik7Ci0JCXNtdGNfc2VxdygweDZiLCAweDAyKTsKLQkJc210Y19zZXF3KDB4NjIsIDB4M2UpOwotCQkvKiBlbmFibGUgUENJIGJ1cnN0ICovCi0JCXNtdGNfc2VxdygweDE3LCAweDIwKTsKLQkJLyogZW5hYmxlIHdvcmQgc3dhcCAqLwotI2lmZGVmIF9fQklHX0VORElBTgotCQlpZiAoc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwgPT0gMzIpCi0JCQlzbXRjX3NlcXcoMHgxNywgMHgzMCk7Ci0jZW5kaWYKLQkJYnJlYWs7Ci0JY2FzZSAweDcyMDoKLQkJc2ZiLT5mYi5maXgubW1pb19zdGFydCA9IG1taW9fYmFzZTsKLQkJc2ZiLT5mYi5maXgubW1pb19sZW4gPSAweDAwMjAwMDAwOwotCQlzbWVtX3NpemUgPSBTTTcyMl9WSURFT01FTU9SWVNJWkU7Ci0JCXNmYi0+ZHBfcmVncyA9IGlvcmVtYXAobW1pb19iYXNlLCAweDAwYTAwMDAwKTsKLQkJc2ZiLT5sZmIgPSBzZmItPmRwX3JlZ3MgKyAweDAwMjAwMDAwOwotCQlzZmItPm1taW8gPSAoc210Y19SZWdCYXNlQWRkcmVzcyA9Ci0JCSAgICBzZmItPmRwX3JlZ3MgKyAweDAwMGMwMDAwKTsKLQkJc2ZiLT52cF9yZWdzID0gc2ZiLT5kcF9yZWdzICsgMHg4MDA7Ci0KLQkJc210Y19zZXF3KDB4NjIsIDB4ZmYpOwotCQlzbXRjX3NlcXcoMHg2YSwgMHgwZCk7Ci0JCXNtdGNfc2VxdygweDZiLCAweDAyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIk5vIHZhbGlkIFNpbGljb24gTW90aW9uIGRpc3BsYXkgY2hpcCB3YXMgZGV0ZWN0ZWQhIik7Ci0KLQkJZ290byBmYWlsZWRfZmI7Ci0JfQotCi0JLyogY2FuIHN1cHBvcnQgMzIgYnBwICovCi0JaWYgKDE1ID09IHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsKQotCQlzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCA9IDE2OwotCi0Jc2ZiLT5mYi52YXIueHJlc192aXJ0dWFsID0gc2ZiLT5mYi52YXIueHJlczsKLQlzZmItPmZiLnZhci55cmVzX3ZpcnR1YWwgPSBzZmItPmZiLnZhci55cmVzOwotCWVyciA9IHNtdGNfbWFwX3NtZW0oc2ZiLCBwZGV2LCBzbWVtX3NpemUpOwotCWlmIChlcnIpCi0JCWdvdG8gZmFpbGVkOwotCi0Jc210Y2ZiX3NldG1vZGUoc2ZiKTsKLQotCWVyciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZzZmItPmZiKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBmYWlsZWQ7Ci0KLQlkZXZfaW5mbygmcGRldi0+ZGV2LAotCQkgIlNpbGljb24gTW90aW9uIFNNJVggUmV2JVggcHJpbWFyeSBkaXNwbGF5IG1vZGUgJWR4JWQtJWQgSW5pdCBDb21wbGV0ZS4iLAotCQkgc2ZiLT5jaGlwX2lkLCBzZmItPmNoaXBfcmV2X2lkLCBzZmItPmZiLnZhci54cmVzLAotCQkgc2ZiLT5mYi52YXIueXJlcywgc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwpOwotCi0JcmV0dXJuIDA7Ci0KLWZhaWxlZDoKLQlkZXZfZXJyKCZwZGV2LT5kZXYsICJTaWxpY29uIE1vdGlvbiwgSW5jLiBwcmltYXJ5IGRpc3BsYXkgaW5pdCBmYWlsLiIpOwotCi0Jc210Y191bm1hcF9zbWVtKHNmYik7Ci0Jc210Y191bm1hcF9tbWlvKHNmYik7Ci1mYWlsZWRfZmI6Ci0Jc210Y19mcmVlX2ZiX2luZm8oc2ZiKTsKLQotZmFpbGVkX2ZyZWU6Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqIDB4NzEwIChMeW54RU0pCi0gKiAweDcxMiAoTHlueEVNKykKLSAqIDB4NzIwIChMeW54M0RNLCBMeW54M0RNKykKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNtdGNmYl9wY2lfdGFibGVbXSA9IHsKLQl7IFBDSV9ERVZJQ0UoMHgxMjZmLCAweDcxMCksIH0sCi0JeyBQQ0lfREVWSUNFKDB4MTI2ZiwgMHg3MTIpLCB9LAotCXsgUENJX0RFVklDRSgweDEyNmYsIDB4NzIwKSwgfSwKLQl7MCx9Ci19OwotCi1zdGF0aWMgdm9pZCBzbXRjZmJfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYjsKLQotCXNmYiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzbXRjX3VubWFwX3NtZW0oc2ZiKTsKLQlzbXRjX3VubWFwX21taW8oc2ZiKTsKLQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZzZmItPmZiKTsKLQlzbXRjX2ZyZWVfZmJfaW5mbyhzZmIpOwotfQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHNtdGNmYl9wY2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldmljZSk7Ci0Jc3RydWN0IHNtdGNmYl9pbmZvICpzZmI7Ci0KLQlzZmIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0KLQkvKiBzZXQgdGhlIGh3IGluIHNsZWVwIG1vZGUgdXNlIGV4dGVybmFsIGNsb2NrIGFuZCBzZWxmIG1lbW9yeSByZWZyZXNoCi0JICogc28gdGhhdCB3ZSBjYW4gdHVybiBvZmYgaW50ZXJuYWwgUExMcyBsYXRlciBvbgotCSAqLwotCXNtdGNfc2VxdygweDIwLCAoc210Y19zZXFyKDB4MjApIHwgMHhjMCkpOwotCXNtdGNfc2VxdygweDY5LCAoc210Y19zZXFyKDB4NjkpICYgMHhmNykpOwotCi0JY29uc29sZV9sb2NrKCk7Ci0JZmJfc2V0X3N1c3BlbmQoJnNmYi0+ZmIsIDEpOwotCWNvbnNvbGVfdW5sb2NrKCk7Ci0KLQkvKiBhZGRpdGlvbmFsbHkgdHVybiBvZmYgYWxsIGZ1bmN0aW9uIGJsb2NrcyBpbmNsdWRpbmcgaW50ZXJuYWwgUExMcyAqLwotCXNtdGNfc2VxdygweDIxLCAweGZmKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNtdGNmYl9wY2lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKLQlzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYjsKLQotCXNmYiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCS8qIHJlaW5pdCBoYXJkd2FyZSAqLwotCXNtN3h4X2luaXRfaHcoKTsKLQlzd2l0Y2ggKHNmYi0+Y2hpcF9pZCkgewotCWNhc2UgMHg3MTA6Ci0JY2FzZSAweDcxMjoKLQkJLyogc2V0IE1DTEsgPSAxNC4zMTgxOCAqICAoMHgxNiAvIDB4MikgKi8KLQkJc210Y19zZXF3KDB4NmEsIDB4MTYpOwotCQlzbXRjX3NlcXcoMHg2YiwgMHgwMik7Ci0JCXNtdGNfc2VxdygweDYyLCAweDNlKTsKLQkJLyogZW5hYmxlIFBDSSBidXJzdCAqLwotCQlzbXRjX3NlcXcoMHgxNywgMHgyMCk7Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JCWlmIChzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCA9PSAzMikKLQkJCXNtdGNfc2VxdygweDE3LCAweDMwKTsKLSNlbmRpZgotCQlicmVhazsKLQljYXNlIDB4NzIwOgotCQlzbXRjX3NlcXcoMHg2MiwgMHhmZik7Ci0JCXNtdGNfc2VxdygweDZhLCAweDBkKTsKLQkJc210Y19zZXF3KDB4NmIsIDB4MDIpOwotCQlicmVhazsKLQl9Ci0KLQlzbXRjX3NlcXcoMHgzNCwgKHNtdGNfc2VxcigweDM0KSB8IDB4YzApKTsKLQlzbXRjX3NlcXcoMHgzMywgKChzbXRjX3NlcXIoMHgzMykgfCAweDA4KSAmIDB4ZmIpKTsKLQotCXNtdGNmYl9zZXRtb2RlKHNmYik7Ci0KLQljb25zb2xlX2xvY2soKTsKLQlmYl9zZXRfc3VzcGVuZCgmc2ZiLT5mYiwgMCk7Ci0JY29uc29sZV91bmxvY2soKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoc203eHhfcG1fb3BzLCBzbXRjZmJfcGNpX3N1c3BlbmQsIHNtdGNmYl9wY2lfcmVzdW1lKTsKLSNkZWZpbmUgU003WFhfUE1fT1BTICgmc203eHhfcG1fb3BzKQotCi0jZWxzZSAgLyogIUNPTkZJR19QTSAqLwotCi0jZGVmaW5lIFNNN1hYX1BNX09QUyBOVUxMCi0KLSNlbmRpZiAvKiAhQ09ORklHX1BNICovCi0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzbXRjZmJfZHJpdmVyID0gewotCS5uYW1lID0gInNtdGNmYiIsCi0JLmlkX3RhYmxlID0gc210Y2ZiX3BjaV90YWJsZSwKLQkucHJvYmUgPSBzbXRjZmJfcGNpX3Byb2JlLAotCS5yZW1vdmUgPSBzbXRjZmJfcGNpX3JlbW92ZSwKLQkuZHJpdmVyLnBtICA9IFNNN1hYX1BNX09QUywKLX07Ci0KLW1vZHVsZV9wY2lfZHJpdmVyKHNtdGNmYl9kcml2ZXIpOwotCi1NT0RVTEVfQVVUSE9SKCJTaWxpY29ubW90aW9uICIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJGcmFtZWJ1ZmZlciBkcml2ZXIgZm9yIFNNSSBHcmFwaGljIENhcmRzIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zZXJpYWxpby5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc2VyaWFsaW8uYwppbmRleCA0ZTE4ZmI0Li5jNjJkNzRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zZXJpYWxpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NlcmlhbGlvLmMKQEAgLTQwLDcgKzQwLDcgQEAKIAkJY3ZhbCB8PSBVQVJUX0xDUl9FUEFSOwogCWlmIChzeW50aF9yZXF1ZXN0X3JlZ2lvbihzZXItPnBvcnQsIDgpKSB7CiAJCS8qIHRyeSB0byB0YWtlIGl0IGJhY2suICovCi0JCXByaW50ayhLRVJOX0lORk8gIlBvcnRzIG5vdCBhdmFpbGFibGUsIHRyeWluZyB0byBzdGVhbCB0aGVtXG4iKTsKKwkJcHJfaW5mbygiUG9ydHMgbm90IGF2YWlsYWJsZSwgdHJ5aW5nIHRvIHN0ZWFsIHRoZW1cbiIpOwogCQlfX3JlbGVhc2VfcmVnaW9uKCZpb3BvcnRfcmVzb3VyY2UsIHNlci0+cG9ydCwgOCk7CiAJCWVyciA9IHN5bnRoX3JlcXVlc3RfcmVnaW9uKHNlci0+cG9ydCwgOCk7CiAJCWlmIChlcnIpIHsKQEAgLTEwNiw3ICsxMDYsNyBAQAogCQkJICJzZXJpYWwiLCAodm9pZCAqKSBzeW50aF9yZWFkYnVmX2hhbmRsZXIpOwogCiAJaWYgKHJ2KQotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZXF1ZXN0IFNwZWFrdXAgc2VyaWFsIEkgUiBRXG4iKTsKKwkJcHJfZXJyKCJVbmFibGUgdG8gcmVxdWVzdCBTcGVha3VwIHNlcmlhbCBJIFIgUVxuIik7CiAJLyogU2V0IE1DUiAqLwogCW91dGIoVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTIHwgVUFSVF9NQ1JfT1VUMiwKIAkJCXNwZWFrdXBfaW5mby5wb3J0X3R0cyArIFVBUlRfTUNSKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZGVjdGxrLmMgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2RlY3Rsay5jCmluZGV4IDE1ZmRlYzMuLjc1NmQwMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZGVjdGxrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9kZWN0bGsuYwpAQCAtMjcwLDEwICsyNzAsMTIgQEAKIAkJCWlmIChqaWZmaWVzID49IGppZmZfbWF4KSB7CiAJCQkJaWYgKCFpbl9lc2NhcGUpCiAJCQkJCXNwa19zZXJpYWxfb3V0KFBST0NTUEVFQ0gpOwotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzcGVha3VwX2luZm8uc3BpbmxvY2ssIGZsYWdzKTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3BlYWt1cF9pbmZvLnNwaW5sb2NrLAorCQkJCQkJZmxhZ3MpOwogCQkJCWppZmZ5X2RlbHRhX3ZhbCA9IGppZmZ5X2RlbHRhLT51Lm4udmFsdWU7CiAJCQkJZGVsYXlfdGltZV92YWwgPSBkZWxheV90aW1lLT51Lm4udmFsdWU7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BlYWt1cF9pbmZvLnNwaW5sb2NrLCBmbGFncyk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BlYWt1cF9pbmZvLnNwaW5sb2NrLAorCQkJCQkJZmxhZ3MpOwogCQkJCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcwogCQkJCQkJIChkZWxheV90aW1lX3ZhbCkpOwogCQkJCWppZmZfbWF4ID0gamlmZmllcyArIGppZmZ5X2RlbHRhX3ZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL0tjb25maWcKaW5kZXggMWI2ZDU4MS4uYjVlNzRlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL0tjb25maWcKQEAgLTE3LDcgKzE3LDcgQEAKIAogY29uZmlnIFRJRFNQQlJJREdFX0RWRlMKIAlib29sICJFbmFibGUgQnJpZGdlIER5bmFtaWMgVm9sdGFnZSBhbmQgRnJlcXVlbmN5IFNjYWxpbmcgKERWRlMpIgotCWRlcGVuZHMgb24gVElEU1BCUklER0UgJiYgT01BUF9QTV9TUkYgJiYgQ1BVX0ZSRVEKKwlkZXBlbmRzIG9uIFRJRFNQQlJJREdFICYmIENQVV9GUkVRCiAJaGVscAogCSAgRFZGUyBhbGxvd3MgRFNQIEJyaWRnZSB0byBpbml0aWF0ZSB0aGUgb3BlcmF0aW5nIHBvaW50IGNoYW5nZSB0bwogCSAgc2NhbGUgdGhlIGNoaXAgdm9sdGFnZSBhbmQgZnJlcXVlbmN5IGluIG9yZGVyIHRvIG1hdGNoIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvaW9fc20uYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL2lvX3NtLmMKaW5kZXggZTMyMmZiNy4uYzI4MjlhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvaW9fc20uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS9pb19zbS5jCkBAIC0yMTI3LDcgKzIxMjcsNyBAQAogCXUzMiBtb2R1bGVfc2l6ZTsKIAl1MzIgbW9kdWxlX3N0cnVjdF9zaXplID0gMDsKIAl1MzIgc2VjdF9uZHg7Ci0JY2hhciAqc2VjdF9zdHIgOworCWNoYXIgKnNlY3Rfc3RyOwogCWludCBzdGF0dXMgPSAwOwogCiAJc3RhdHVzID0gZGV2X2dldF9pbnRmX2Z4bnMoZGV2X29iamVjdCwgJmludGZfZnhucyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS90aW9tYXAzNDMwLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS90aW9tYXAzNDMwLmMKaW5kZXggYjc3MGIyMi4uODk0NWI0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvdGlvbWFwMzQzMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcDM0MzAuYwpAQCAtMjgwLDkgKzI4MCw4IEBACiAJCQkJCU9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMl9DTV9DTEtTVENUUkwpOwogCiAJCS8qIFdhaXQgdW50aWwgdGhlIHN0YXRlIGhhcyBtb3ZlZCB0byBPTiAqLwotCQl3aGlsZSAoKCpwZGF0YS0+ZHNwX3BybV9yZWFkKShPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfUE1fUFdTVFNUKSAmCi0JCQkJCQlPTUFQX0lOVFJBTlNJVElPTl9NQVNLKQotCQkJOworCQl3aGlsZSAoKnBkYXRhLT5kc3BfcHJtX3JlYWQoT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAyX1BNX1BXU1RTVCkmCisJCQkJCU9NQVBfSU5UUkFOU0lUSU9OX01BU0spOwogCQkvKiBEaXNhYmxlIEF1dG9tYXRpYyB0cmFuc2l0aW9uICovCiAJCSgqcGRhdGEtPmRzcF9jbV93cml0ZSkoT01BUDM0WFhfQ0xLU1RDVFJMX0RJU0FCTEVfQVVUTywKIAkJCQkJT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAyX0NNX0NMS1NUQ1RSTCk7CkBAIC00MTksNyArNDE4LDggQEAKIAkJLyogQXNzZXJ0IFJTVDEgaS5lIG9ubHkgdGhlIFJTVCBvbmx5IGZvciBEU1AgbWVnYWNlbGwgKi8KIAkJaWYgKCFzdGF0dXMpIHsKIAkJCSgqcGRhdGEtPmRzcF9wcm1fcm13X2JpdHMpKE9NQVAzNDMwX1JTVDFfSVZBMl9NQVNLLAotCQkJCQlPTUFQMzQzMF9SU1QxX0lWQTJfTUFTSywgT01BUDM0MzBfSVZBMl9NT0QsCisJCQkJCU9NQVAzNDMwX1JTVDFfSVZBMl9NQVNLLAorCQkJCQlPTUFQMzQzMF9JVkEyX01PRCwKIAkJCQkJT01BUDJfUk1fUlNUQ1RSTCk7CiAKIAkJCS8qIE1hc2sgYWRkcmVzcyB3aXRoIDFLIGZvciBjb21wYXRpYmlsaXR5ICovCkBAIC00MzIsNyArNDMyLDggQEAKIAkJLyogUmVzZXQgYW5kIFVucmVzZXQgdGhlIFJTVDIsIHNvIHRoYXQgQk9PVEFERFIgaXMgY29waWVkIHRvCiAJCSAqIElWQTIgU1lTQyByZWdpc3RlciAqLwogCQkoKnBkYXRhLT5kc3BfcHJtX3Jtd19iaXRzKShPTUFQMzQzMF9SU1QyX0lWQTJfTUFTSywKLQkJCU9NQVAzNDMwX1JTVDJfSVZBMl9NQVNLLCBPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfUk1fUlNUQ1RSTCk7CisJCQlPTUFQMzQzMF9SU1QyX0lWQTJfTUFTSywgT01BUDM0MzBfSVZBMl9NT0QsCisJCQlPTUFQMl9STV9SU1RDVFJMKTsKIAkJdWRlbGF5KDEwMCk7CiAJCSgqcGRhdGEtPmRzcF9wcm1fcm13X2JpdHMpKE9NQVAzNDMwX1JTVDJfSVZBMl9NQVNLLCAwLAogCQkJCQlPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfUk1fUlNUQ1RSTCk7CkBAIC00NDYsNyArNDQ3LDggQEAKIAkJLyogT25seSBtYWtlIFRMQiBlbnRyeSBpZiBib3RoIGFkZHJlc3NlcyBhcmUgbm9uLXplcm8gKi8KIAkJZm9yIChlbnRyeV9uZHggPSAwOyBlbnRyeV9uZHggPCBCUkRJT0NUTF9OVU1PRk1NVVRMQjsKIAkJICAgICBlbnRyeV9uZHgrKykgewotCQkJc3RydWN0IGJyaWRnZV9pb2N0bF9leHRwcm9jICplID0gJmRldl9jb250ZXh0LT5hdGxiX2VudHJ5W2VudHJ5X25keF07CisJCQlzdHJ1Y3QgYnJpZGdlX2lvY3RsX2V4dHByb2MgKmUgPQorCQkJCSZkZXZfY29udGV4dC0+YXRsYl9lbnRyeVtlbnRyeV9uZHhdOwogCQkJc3RydWN0IGh3X21tdV9tYXBfYXR0cnNfdCBtYXBfYXR0cnMgPSB7CiAJCQkJLmVuZGlhbmlzbSA9IGUtPmVuZGlhbmlzbSwKIAkJCQkuZWxlbWVudF9zaXplID0gZS0+ZWxlbV9zaXplLApAQCAtNjQxLDggKzY0Myw4IEBACiAJLyogYXMgcGVyIFRSTSwgaXQgaXMgYWR2aXNlZCB0byBmaXJzdCBkcml2ZSB0aGUgSVZBMiB0byAnU3RhbmRieScgbW9kZSwKIAkgKiBiZWZvcmUgdHVybmluZyBvZmYgdGhlIGNsb2Nrcy4uIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgdGhlcmUgYXJlIG5vCiAJICogcGVuZGluZyBMMyBvciBvdGhlciB0cmFuc2FjdG9ucyBmcm9tIElWQTIgKi8KLQlkc3BfcHdyX3N0YXRlID0gKCpwZGF0YS0+ZHNwX3BybV9yZWFkKShPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfUE1fUFdTVFNUKSAmCi0JCQkJCU9NQVBfUE9XRVJTVEFURVNUX01BU0s7CisJZHNwX3B3cl9zdGF0ZSA9ICgqcGRhdGEtPmRzcF9wcm1fcmVhZCkKKwkJKE9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMl9QTV9QV1NUU1QpICYgT01BUF9QT1dFUlNUQVRFU1RfTUFTSzsKIAlpZiAoZHNwX3B3cl9zdGF0ZSAhPSBQV1JETV9QT1dFUl9PRkYpIHsKIAkJKCpwZGF0YS0+ZHNwX3BybV9ybXdfYml0cykoT01BUDM0MzBfUlNUMl9JVkEyX01BU0ssIDAsCiAJCQkJCU9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMl9STV9SU1RDVFJMKTsKQEAgLTY4Miw4ICs2ODQsOSBAQAogCQlkZXZfY29udGV4dC0+bWJveCA9IE5VTEw7CiAJfQogCS8qIFJlc2V0IElWQTIgY2xvY2tzKi8KLQkoKnBkYXRhLT5kc3BfcHJtX3dyaXRlKShPTUFQMzQzMF9SU1QxX0lWQTJfTUFTSyB8IE9NQVAzNDMwX1JTVDJfSVZBMl9NQVNLIHwKLQkJCU9NQVAzNDMwX1JTVDNfSVZBMl9NQVNLLCBPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfUk1fUlNUQ1RSTCk7CisJKCpwZGF0YS0+ZHNwX3BybV93cml0ZSkoT01BUDM0MzBfUlNUMV9JVkEyX01BU0sgfAorCQkJT01BUDM0MzBfUlNUMl9JVkEyX01BU0sgfCBPTUFQMzQzMF9SU1QzX0lWQTJfTUFTSywKKwkJCU9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMl9STV9SU1RDVFJMKTsKIAogCWRzcF9jbG9ja19kaXNhYmxlX2FsbChkZXZfY29udGV4dC0+ZHNwX3Blcl9jbGtzKTsKIAlkc3BfY2xrX2Rpc2FibGUoRFNQX0NMS19JVkEyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcDM0MzBfcHdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS90aW9tYXAzNDMwX3B3ci5jCmluZGV4IDE4NjJhZmQuLjY1NzEwNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcDM0MzBfcHdyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvdGlvbWFwMzQzMF9wd3IuYwpAQCAtOTksNyArOTksOCBAQAogCQkJcmV0dXJuIC1FUEVSTTsKIAkJfQogCQlwd3Jfc3RhdGUgPSAoKnBkYXRhLT5kc3BfcHJtX3JlYWQpKE9NQVAzNDMwX0lWQTJfTU9ELAotCQkJCQlPTUFQMl9QTV9QV1NUU1QpICYgT01BUF9QT1dFUlNUQVRFU1RfTUFTSzsKKwkJCQkJCSAgIE9NQVAyX1BNX1BXU1RTVCkgJgorCQkJCQkJICAgT01BUF9QT1dFUlNUQVRFU1RfTUFTSzsKIAl9CiAJaWYgKHRpbWVvdXQgPT0gMCkgewogCQlwcl9lcnIoIiVzOiBUaW1lZCBvdXQgd2FpdGluZyBmb3IgRFNQIG9mZiBtb2RlXG4iLCBfX2Z1bmNfXyk7CkBAIC0yMDksNyArMjEwLDggQEAKIAkJCXJldHVybiAtRVBFUk07CiAJCX0KIAkJcHdyX3N0YXRlID0gKCpwZGF0YS0+ZHNwX3BybV9yZWFkKShPTUFQMzQzMF9JVkEyX01PRCwKLQkJCQkJT01BUDJfUE1fUFdTVFNUKSAmIE9NQVBfUE9XRVJTVEFURVNUX01BU0s7CisJCQkJCQkgICBPTUFQMl9QTV9QV1NUU1QpICYKKwkJCQkJCSAgIE9NQVBfUE9XRVJTVEFURVNUX01BU0s7CiAJfQogCiAJaWYgKCF0aW1lb3V0KSB7CkBAIC0zNTUsNyArMzU3LDcgQEAKIAkgICAgKGRldl9jb250ZXh0LT5icmRfc3RhdGUgPT0gQlJEX0RTUF9ISUJFUk5BVElPTikpIHsKIAkJZGV2X2RiZyhicmlkZ2UsICJPUFA6ICVzIElWQSBpbiBzbGVlcC4gTm8gbWVzc2FnZSB0byBEU1BcbiIpOwogCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKChkZXZfY29udGV4dC0+YnJkX3N0YXRlID09IEJSRF9SVU5OSU5HKSkgeworCX0gZWxzZSBpZiAoZGV2X2NvbnRleHQtPmJyZF9zdGF0ZSA9PSBCUkRfUlVOTklORykgewogCQkvKiBTZW5kIGEgcHJlbm90aWZpY2F0aW9uIHRvIERTUCAqLwogCQlkZXZfZGJnKGJyaWRnZSwgIk9QUDogJXMgc2VudCBub3RpZmljYXRpb24gdG8gRFNQXG4iLCBfX2Z1bmNfXyk7CiAJCXNtX2ludGVycnVwdF9kc3AoZGV2X2NvbnRleHQsIE1CWF9QTV9TRVRQT0lOVF9QUkVOT1RJRlkpOwpAQCAtMzk2LDEzICszOTgsMTQgQEAKIAkJaW9fc2hfbXNldHRpbmcoaGlvX21nciwgU0hNX0NVUlJPUFAsICZsZXZlbCk7CiAJCWRldl9kYmcoYnJpZGdlLCAiT1BQOiAlcyBJVkEgaW4gc2xlZXAuIFdyb3RlIHRvIHNobVxuIiwKIAkJCV9fZnVuY19fKTsKLQl9IGVsc2UgaWYgKChkZXZfY29udGV4dC0+YnJkX3N0YXRlID09IEJSRF9SVU5OSU5HKSkgeworCX0gZWxzZSBpZiAoZGV2X2NvbnRleHQtPmJyZF9zdGF0ZSA9PSBCUkRfUlVOTklORykgewogCQkvKiBVcGRhdGUgdGhlIE9QUCB2YWx1ZSBpbiBzaGFyZWQgbWVtb3J5ICovCiAJCWlvX3NoX21zZXR0aW5nKGhpb19tZ3IsIFNITV9DVVJST1BQLCAmbGV2ZWwpOwogCQkvKiBTZW5kIGEgcG9zdCBub3RpZmljYXRpb24gdG8gRFNQICovCiAJCXNtX2ludGVycnVwdF9kc3AoZGV2X2NvbnRleHQsIE1CWF9QTV9TRVRQT0lOVF9QT1NUTk9USUZZKTsKLQkJZGV2X2RiZyhicmlkZ2UsICJPUFA6ICVzIHdyb3RlIHRvIHNobS4gU2VudCBwb3N0IG5vdGlmaWNhdGlvbiAiCi0JCQkidG8gRFNQXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9kYmcoYnJpZGdlLAorCQkJIk9QUDogJXMgd3JvdGUgdG8gc2htLiBTZW50IHBvc3Qgbm90aWZpY2F0aW9uIHRvIERTUFxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAJfSBlbHNlIHsKIAkJc3RhdHVzID0gLUVQRVJNOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9keW5sb2FkL3RyYW1wLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZHlubG9hZC90cmFtcC5jCmluZGV4IDQwNGFmMTguLjVmMDQzMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9keW5sb2FkL3RyYW1wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvdHJhbXAuYwpAQCAtNTAzLDcgKzUwMyw3IEBACiAgKgkgIFRSQU1QT0xJTkVTIEFSRSBUUkVBVEVEIEFTIDJORCBQQVNTIGV2ZW4gdGhvdWdoIHRoaXMgaXMgcmVhbGx5CiAgKgkgIHRoZSBmaXJzdCAoYW5kIG9ubHkpIHJlbG9jYXRpb24gdGhhdCB3aWxsIGJlIHBlcmZvcm1lZCBvbiB0aGVtLgogICovCi1zdGF0aWMgaW50IHByaXZfcGt0X3JlbG8oc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMsIHRndF9hdV90ICogZGF0YSwKK3N0YXRpYyBpbnQgcHJpdl9wa3RfcmVsbyhzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywgdGd0X2F1X3QgKmRhdGEsCiAJCQkgc3RydWN0IHJlbG9jX3JlY29yZF90ICpycFtdLCB1MzIgcmVsb19jb3VudCkKIHsKIAlpbnQgcmV0X3ZhbCA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9kYmRjZC5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3IvZGJkY2QuYwppbmRleCAxOTBjYTNmLi4yYWU0OGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9kYmRjZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2RiZGNkLmMKQEAgLTEwMSwxNCArMTAxLDE0IEBACiAJICogaWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBkb2Vzbid0IGZpdCBpbiB1MzIuIFNvLCBjb252ZXJ0IHRoZQogCSAqIGxhc3Qgc2l4IGJ5dGVzIHRvIHU2NCBhbmQgbWVtY3B5IHdoYXQgaXMgbmVlZGVkCiAJICovCi0JaWYoc3NjYW5mKHN6X3V1aWQsICIlOHglYyU0aHglYyU0aHglYyUyaGh4JTJoaHglYyVsbHgiLAorCWlmIChzc2NhbmYoc3pfdXVpZCwgIiU4eCVjJTRoeCVjJTRoeCVjJTJoaHglMmhoeCVjJWxseCIsCiAJICAgICAgICZ1dWlkX3RtcC5kYXRhMSwgJmMsICZ1dWlkX3RtcC5kYXRhMiwgJmMsCiAJICAgICAgICZ1dWlkX3RtcC5kYXRhMywgJmMsICZ1dWlkX3RtcC5kYXRhNCwKIAkgICAgICAgJnV1aWRfdG1wLmRhdGE1LCAmYywgJnQpICE9IDEwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXQgPSBjcHVfdG9fYmU2NCh0KTsKLQltZW1jcHkoJnV1aWRfdG1wLmRhdGE2WzBdLCAoKGNoYXIqKSZ0KSArIDIsIDYpOworCW1lbWNweSgmdXVpZF90bXAuZGF0YTZbMF0sICgoY2hhciAqKSZ0KSArIDIsIDYpOwogCSp1dWlkX29iaiA9IHV1aWRfdG1wOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2Rydi5jCmluZGV4IGJlMjY5MTcuLjc1N2FlMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2Rydi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2Rydi5jCkBAIC03MzgsNyArNzM4LDcgQEAKICAqICAgICBBbGxvY2F0ZSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMsIHVuY2FjaGVkIG1lbW9yeSBmcm9tIGV4dGVybmFsIG1lbW9yeSBwb29sCiAgKi8KIAotc3RhdGljIHZvaWQgKm1lbV9leHRfcGh5c19tZW1fYWxsb2ModTMyIGJ5dGVzLCB1MzIgYWxpZ24sIHUzMiAqIHBoeXNfYWRkcikKK3N0YXRpYyB2b2lkICptZW1fZXh0X3BoeXNfbWVtX2FsbG9jKHUzMiBieXRlcywgdTMyIGFsaWduLCB1MzIgKnBoeXNfYWRkcikKIHsKIAl1MzIgbmV3X2FsbG9jX3B0cjsKIAl1MzIgb2Zmc2V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3IvbWdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9tZ3IuYwppbmRleCBiMzJiYTBhLi45M2U2MjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9tZ3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9tZ3IuYwpAQCAtMjY2LDE1ICsyNjYsMTUgQEAKIAkJCSAqIHRoaXMgaXMgYSBjbHVtc3kgb3ZlcndyaXRlICovCiAJCQlwcm9jZXNzb3JfaW5mby0+cHJvY2Vzc29yX3R5cGUgPSBEU1BUWVBFNjQ7CiAJCX0gZWxzZSB7Ci0JCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBGYWlsZWQgdG8gZ2V0IERDRCBwcm9jZXNzb3IgaW5mbyAiCi0JCQkJIiV4XG4iLCBfX2Z1bmNfXywgc3RhdHVzMik7CisJCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBGYWlsZWQgdG8gZ2V0IERDRCBwcm9jZXNzb3IgaW5mbyAleFxuIiwKKwkJCQkJX19mdW5jX18sIHN0YXR1czIpOwogCQkJc3RhdHVzID0gLUVQRVJNOwogCQl9CiAJfQogCSpwdV9udW1fcHJvY3MgPSBwcm9jX2luZGV4OwogCWlmIChwcm9jX2RldGVjdCA9PSBmYWxzZSkgewotCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBGYWlsZWQgdG8gZ2V0IHByb2MgaW5mbyBmcm9tIERDRCwgc28gdXNlICIKLQkJCSJDRkcgcmVnaXN0cnlcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2RiZyhicmlkZ2UsICIlczogRmFpbGVkIHRvIGdldCBwcm9jIGluZm8gZnJvbSBEQ0QsIHNvIHVzZSBDRkcgcmVnaXN0cnlcbiIsCisJCQkJX19mdW5jX18pOwogCQlwcm9jZXNzb3JfaW5mby0+cHJvY2Vzc29yX3R5cGUgPSBEU1BUWVBFNjQ7CiAJfQogZnVuY19lbmQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9ubGRyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9ubGRyLmMKaW5kZXggY2EzODA1MC4uNWFjNTA3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3Ivbmxkci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL25sZHIuYwpAQCAtNjIzLDcgKzYyMyw3IEBACiAgKiAgPT09PT09PT0gbmxkcl9nZXRfZnhuX2FkZHIgPT09PT09PT0KICAqLwogaW50IG5sZHJfZ2V0X2Z4bl9hZGRyKHN0cnVjdCBubGRyX25vZGVvYmplY3QgKm5sZHJfbm9kZV9vYmosCi0JCQkgICAgIGNoYXIgKnN0cl9meG4sIHUzMiAqIGFkZHIpCisJCQkgICAgIGNoYXIgKnN0cl9meG4sIHUzMiAqYWRkcikKIHsKIAlzdHJ1Y3QgZGJsbF9zeW1fdmFsICpkYmxsX3N5bTsKIAlzdHJ1Y3Qgbmxkcl9vYmplY3QgKm5sZHJfb2JqOwpAQCAtMTc1MSw5ICsxNzUxLDggQEAKIAl9CiAJaWYgKHJlZl9jb3VudCAmJiAoKnJlZl9jb3VudCA+IDApKSB7CiAJCSpyZWZfY291bnQgLT0gMTsKLQkJaWYgKG90aGVyX3JlZikgeworCQlpZiAob3RoZXJfcmVmKQogCQkJKm90aGVyX3JlZiAtPSAxOwotCQl9CiAJfQogCiAJaWYgKHJlZl9jb3VudCAmJiAqcmVmX2NvdW50ID09IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL25vZGUuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL25vZGUuYwppbmRleCA4N2RmYTkyLi45ZDMwNDRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9ub2RlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3Ivbm9kZS5jCkBAIC0yNDYsNyArMjQ2LDcgQEAKIAkJCSAgICBzdHJ1Y3Qgbm9kZV9zdHJtZGVmICpwc3RybV9kZWYsCiAJCQkgICAgc3RydWN0IGRzcF9zdHJtYXR0ciAqcGF0dHJzKTsKIHN0YXRpYyB2b2lkIGZyZWVfc3RyZWFtKHN0cnVjdCBub2RlX21nciAqaG5vZGVfbWdyLCBzdHJ1Y3Qgc3RyZWFtX2Nobmwgc3RyZWFtKTsKLXN0YXRpYyBpbnQgZ2V0X2Z4bl9hZGRyZXNzKHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUsIHUzMiAqIGZ4bl9hZGRyLAorc3RhdGljIGludCBnZXRfZnhuX2FkZHJlc3Moc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwgdTMyICpmeG5fYWRkciwKIAkJCQkgIHUzMiBwaGFzZSk7CiBzdGF0aWMgaW50IGdldF9ub2RlX3Byb3BzKHN0cnVjdCBkY2RfbWFuYWdlciAqaGRjZF9tZ3IsCiAJCQkJIHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUsCkBAIC00MDYsNyArNDA2LDcgQEAKIAogCS8qIGNoZWNrIGZvciBwYWdlIGFsaWduZWQgSGVhcCBzaXplICovCiAJaWYgKCgoYXR0cl9pbi0+aGVhcF9zaXplKSAmIChQR19TSVpFNEsgLSAxKSkpIHsKLQkJcHJfZXJyKCIlczogbm9kZSBoZWFwIHNpemUgbm90IGFsaWduZWQgdG8gNEssIHNpemUgPSAweCV4IFxuIiwKKwkJcHJfZXJyKCIlczogbm9kZSBoZWFwIHNpemUgbm90IGFsaWduZWQgdG8gNEssIHNpemUgPSAweCV4XG4iLAogCQkgICAgICAgX19mdW5jX18sIGF0dHJfaW4tPmhlYXBfc2l6ZSk7CiAJCXN0YXR1cyA9IC1FSU5WQUw7CiAJfSBlbHNlIHsKQEAgLTcwMyw5ICs3MDMsOSBAQAogCQlwYXR0ciA9ICZub2RlX2RmbHRidWZhdHRyczsJLyogc2V0IGRlZmF1bHRzICovCiAKIAlzdGF0dXMgPSBwcm9jX2dldF9wcm9jZXNzb3JfaWQocG5vZGUtPnByb2Nlc3NvciwgJnByb2NfaWQpOwotCWlmIChwcm9jX2lkICE9IERTUF9VTklUKSB7CisJaWYgKHByb2NfaWQgIT0gRFNQX1VOSVQpCiAJCWdvdG8gZnVuY19lbmQ7Ci0JfQorCiAJLyogIElmIHNlZ21lbnQgSUQgaW5jbHVkZXMgTUVNX1NFVFZJUlRVQUxTRUdJRCB0aGVuIHBidWZmZXIgaXMgYQogCSAqICB2aXJ0ICBhZGRyZXNzLCBzbyBzZXQgdGhpcyBpbmZvIGluIHRoaXMgbm9kZSdzIHRyYW5zbGF0b3IKIAkgKiAgb2JqZWN0IGZvciAgZnV0dXJlIHJlZi4gSWYgTUVNX0dFVFZJUlRVQUxTRUdJRCB0aGVuIHJldHJpZXZlCkBAIC04ODYsMTEgKzg4NiwxMCBAQAogCWlmIChwYXR0cnMgJiYgcGF0dHJzLT5zdHJtX21vZGUgIT0gU1RSTU1PREVfUFJPQ0NPUFkpCiAJCXJldHVybiAtRVBFUk07CS8qIGlsbGVnYWwgc3RyZWFtIG1vZGUgKi8KIAotCWlmIChub2RlMV90eXBlICE9IE5PREVfR1BQKSB7CisJaWYgKG5vZGUxX3R5cGUgIT0gTk9ERV9HUFApCiAJCWhub2RlX21nciA9IG5vZGUxLT5ub2RlX21ncjsKLQl9IGVsc2UgeworCWVsc2UKIAkJaG5vZGVfbWdyID0gbm9kZTItPm5vZGVfbWdyOwotCX0KIAogCS8qIEVudGVyIGNyaXRpY2FsIHNlY3Rpb24gKi8KIAltdXRleF9sb2NrKCZobm9kZV9tZ3ItPm5vZGVfbWdyX2xvY2spOwpAQCAtMTU3Niw3ICsxNTc1LDcgQEAKICAqICBQdXJwb3NlOgogICogICAgICBGcmVlcyB0aGUgbWVzc2FnZSBidWZmZXIuCiAgKi8KLWludCBub2RlX2ZyZWVfbXNnX2J1ZihzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlLCB1OCAqIHBidWZmZXIsCitpbnQgbm9kZV9mcmVlX21zZ19idWYoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwgdTggKnBidWZmZXIsCiAJCQkgICAgIHN0cnVjdCBkc3BfYnVmZmVyYXR0ciAqcGF0dHIpCiB7CiAJc3RydWN0IG5vZGVfb2JqZWN0ICpwbm9kZSA9IChzdHJ1Y3Qgbm9kZV9vYmplY3QgKilobm9kZTsKQEAgLTIzMjIsNyArMjMyMSw4IEBACiAJCQlpZiAoIWhkZWhfbWdyKQogCQkJCWdvdG8gZnVuY19jb250OwogCi0JCQlicmlkZ2VfZGVoX25vdGlmeShoZGVoX21nciwgRFNQX1NZU0VSUk9SLCBEU1BfRVhDRVBUSU9OQUJPUlQpOworCQkJYnJpZGdlX2RlaF9ub3RpZnkoaGRlaF9tZ3IsIERTUF9TWVNFUlJPUiwKKwkJCQkJICBEU1BfRVhDRVBUSU9OQUJPUlQpOwogCQl9CiAJfQogZnVuY19jb250OgpAQCAtMjY0MCw3ICsyNjQwLDcgQEAKICAqICBQdXJwb3NlOgogICogICAgICBSZXRyaWV2ZXMgdGhlIGFkZHJlc3MgZm9yIGNyZWF0ZSwgZXhlY3V0ZSBvciBkZWxldGUgcGhhc2UgZm9yIGEgbm9kZS4KICAqLwotc3RhdGljIGludCBnZXRfZnhuX2FkZHJlc3Moc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwgdTMyICogZnhuX2FkZHIsCitzdGF0aWMgaW50IGdldF9meG5fYWRkcmVzcyhzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlLCB1MzIgKmZ4bl9hZGRyLAogCQkJCSAgdTMyIHBoYXNlKQogewogCWNoYXIgKnBzdHJfZnhuX25hbWUgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9Eb2N1bWVudGF0aW9uL292ZXJ2aWV3LnR4dCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvRG9jdW1lbnRhdGlvbi9vdmVydmlldy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwNzhlNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvRG9jdW1lbnRhdGlvbi9vdmVydmlldy50eHQKQEAgLTAsMCArMSwxNzQgQEAKKworT3ZlcnZpZXcKKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGRyaXZlciBzZXQgZm9yIFVuaXN5cyBTZWN1cmUgUGFydGl0aW9uaW5nIChzLVBhcsKuKS4KKworcy1QYXIgaXMgZmlybXdhcmUgdGhhdCBwcm92aWRlcyBoYXJkd2FyZSBwYXJ0aXRpb25pbmcgY2FwYWJpbGl0aWVzIGZvcgorc3BsaXR0aW5nIGxhcmdlLXNjYWxlIEludGVsIHg4NiBzZXJ2ZXJzIGludG8gbXVsdGlwbGUgaXNvbGF0ZWQKK3BhcnRpdGlvbnMuIHMtUGFyIHByb3ZpZGVzIGEgc2V0IG9mIHBhcmEtdmlydHVhbGl6ZWQgZGV2aWNlIGRyaXZlcnMgdG8KK2FsbG93IGd1ZXN0IHBhcnRpdGlvbnMgb24gdGhlIHNhbWUgc2VydmVyIHRvIHNoYXJlIGRldmljZXMgdGhhdCB3b3VsZAorbm9ybWFsbHkgYmUgdW5zaGFyYWJsZTsgc3BlY2lmaWNhbGx5LCBQQ0kgbmV0d29yayBpbnRlcmZhY2VzIGFuZCBob3N0CitidXMgYWRhcHRlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBzaGFyZWQgYWNjZXNzIHZpYSBTUi1JT1YuIFRoZSBzaGFyZWQKK2RldmljZSBpcyBvd25lZCBhbmQgbWFuYWdlZCBieSBhIHNtYWxsLCBzaW5nbGUtcHVycG9zZSBzZXJ2aWNlCitwYXJ0aXRpb24sIHdoaWNoIGNvbW11bmljYXRlcyB3aXRoIGVhY2ggZ3Vlc3QgcGFydGl0aW9uIHNoYXJpbmcgdGhhdAorZGV2aWNlIHRocm91Z2ggYW4gYXJlYSBvZiBzaGFyZWQgbWVtb3J5IGNhbGxlZCBhIGNoYW5uZWwuIEFkZGl0aW9uYWwKK2RyaXZlcnMgcHJvdmlkZSBzdXBwb3J0IGludGVyZmFjZXMgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBzLVBhcgorc2VydmljZXMsIGxvZ2dpbmcgYW5kIGRpYWdub3N0aWNzLCBhbmQgYWNjZXNzaW5nIHRoZSBMaW51eCBjb25zb2xlCitmcm9tIHRoZSBzLVBhciB1c2VyIGludGVyZmFjZS4KKworVGhlIGRyaXZlciBzdGFjayBjb25zaXN0cyBvZiBhIHNldCBvZiBzdXBwb3J0IG1vZHVsZXMsIGEgc2V0IG9mIGJ1cworbW9kdWxlcywgYW5kIGEgc2V0IG9mIGRldmljZSBkcml2ZXIgbW9kdWxlcy4gVGhlIHN1cHBvcnQgbW9kdWxlcworaGFuZGxlIGEgbnVtYmVyIG9mIGNvbW1vbiBmdW5jdGlvbnMgYWNyb3NzIGVhY2ggb2YgdGhlIG90aGVyCitkcml2ZXJzLiBUaGUgYnVzIG1vZHVsZXMgcHJvdmlkZSBvcmdhbml6YXRpb24gZm9yIHRoZSBkZXZpY2UgZHJpdmVyCittb2R1bGVzLCB3aGljaCBwcm92aWRlIHRoZSBzaGFyZWQgZGV2aWNlIGZ1bmN0aW9uYWxpdHkuCisKK1RoZXNlIGRyaXZlcnMgYXJlIGZvciB0aGUgVW5pc3lzIHZpcnR1YWwgUENJIGhhcmR3YXJlIG1vZGVsIHdoZXJlIHRoZQoraHlwZXJ2aXNvciBuZWVkIG5vdCBpbnRlcnZlbmUgKG90aGVyIHRoYW4gbm9ybWFsIGludGVycnVwdCBoYW5kbGluZykKK2luIHRoZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiB0aGUgY2xpZW50IGRyaXZlcnMgYW5kIHRoZSB2aXJ0dWFsIGFkYXB0ZXIKK2Zpcm13YXJlIGluIHRoZSBhZGFwdGVyIHNlcnZpY2UgcGFydGl0aW9uLgorCitEcml2ZXIgRGVzY3JpcHRpb25zCisKK0RldmljZSBNb2R1bGVzCisKK1RoZSBtb2R1bGVzIGluIHRoaXMgc2VjdGlvbiBoYW5kbGUgc2hhcmVkIGRldmljZXMgYW5kIHRoZSB2aXJ0dWFsCitidXNlcyByZXF1aXJlZCB0byBzdXBwb3J0IHRoZW0uIFRoZXNlIG1vZHVsZXMgdXNlIGZ1bmN0aW9ucyBpbiBhbmQKK2RlcGVuZCBvbiB0aGUgbW9kdWxlcyBkZXNjcmliZWQgaW4gdGhlIHN1cHBvcnQgbW9kdWxlcyBzZWN0aW9uLgorCit2aXNvcmNoaXBzZXQKKworVGhlIHZpc29yY2hpcHNldCBtb2R1bGUgcmVjZWl2ZXMgZGV2aWNlIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbgorZXZlbnRzIGZyb20gdGhlIENvbW1hbmQgc2VydmljZSBwYXJ0aXRpb24gb2Ygcy1QYXIsIGFzIHdlbGwgYXMKK2NvbnRyb2xsaW5nIHJlZ2lzdHJhdGlvbiBvZiBzaGFyZWQgZGV2aWNlIGRyaXZlcnMgd2l0aCB0aGUgcy1QYXIKK2RyaXZlciBjb3JlLiBUaGUgZXZlbnRzIHJlY2VpdmVkIGFyZSB1c2VkIHRvIHBvcHVsYXRlIG90aGVyIHMtUGFyCittb2R1bGVzIHdpdGggdGhlaXIgYXNzaWduZWQgc2hhcmVkIGRldmljZXMuIFZpc29yY2hpcHNldCBpcyByZXF1aXJlZAorZm9yIHNoYXJlZCBkZXZpY2UgZHJpdmVycyB0byBmdW5jdGlvbiBwcm9wZXJseS4gVmlzb3JjaGlwc2V0IGFsc28KK3N0b3JlcyBpbmZvcm1hdGlvbiBmb3IgaGFuZGxpbmcgZHVtcCBkaXNrIGRldmljZSBjcmVhdGlvbiBkdXJpbmcKK2tkdW1wLgorCitJbiBvcGVyYXRpb24sIHRoZSB2aXNvcmNoaXBzZXQgbW9kdWxlIHByb2Nlc3NlcyBkZXZpY2UgY3JlYXRpb24gYW5kCitkZXN0cnVjdGlvbiBtZXNzYWdlcyBzZW50IGJ5IHMtUGFyJ3MgQ29tbWFuZCBzZXJ2aWNlIHBhcnRpdGlvbiB0aHJvdWdoCithIGNoYW5uZWwuIFRoZXNlIG1lc3NhZ2VzIHJlc3VsdCBpbiBjcmVhdGlvbiAob3IgZGVzdHJ1Y3Rpb24pIG9mIGVhY2gKK3ZpcnR1YWwgYnVzIGFuZCB2aXJ0dWFsIGRldmljZS4gRWFjaCBidXMgYW5kIGRldmljZSBpcyBhbHNvIGFzc29jaWF0ZWQKK3dpdGggYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwsIHdoaWNoIGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBvbmUgb3IKK21vcmUgSU8gc2VydmljZSBwYXJ0aXRpb25zIHRvIHBlcmZvcm0gZGV2aWNlIElPIG9uIGJlaGFsZiBvZiB0aGUKK2d1ZXN0LgorCit2aXJ0aGJhCisKK1RoZSB2aXJ0aGJhIG1vZHVsZSBwcm92aWRlcyBhY2Nlc3MgdG8gYSBzaGFyZWQgU0NTSSBob3N0IGJ1cyBhZGFwdGVyCithbmQgb25lIG9yIG1vcmUgZGlzayBkZXZpY2VzLCBieSBwcm94eWluZyBTQ1NJIGNvbW1hbmRzIGJldHdlZW4gdGhlCitndWVzdCBhbmQgdGhlIHNlcnZpY2UgcGFydGl0aW9uIHRoYXQgb3ducyB0aGUgc2hhcmVkIFNDU0kgYWRhcHRlciwKK3VzaW5nIGEgY2hhbm5lbCBiZXR3ZWVuIHRoZSBndWVzdCBhbmQgdGhlIHNlcnZpY2UgcGFydGl0aW9uLiBUaGUgZGlza3MKK3RoYXQgYXBwZWFyIG9uIHRoZSBzaGFyZWQgYnVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBzLVBhciBjb25maWd1cmF0aW9uCithbmQgZW5mb3JjZWQgYnkgdGhlIHNlcnZpY2UgcGFydGl0aW9uLCB3aGlsZSB0aGUgZ3Vlc3QgZHJpdmVyIGhhbmRsZXMKK3NlbmRpbmcgY29tbWFuZHMgYW5kIGhhbmRsaW5nIHJlc3BvbnNlcy4gRWFjaCBkaXNrIGlzIHNoYXJlZCBhcyBhCit3aG9sZSB0byBhIGd1ZXN0LiBTaGFyaW5nIHRoZSBidXMgYWRhcHRlciBpbiB0aGlzIHdheSBwcm92aWRlcworcmVzaWxpZW5jeTsgc2hvdWxkIHRoZSBkZXZpY2UgZW5jb3VudGVyIGFuIGVycm9yLCBvbmx5IHRoZSBzZXJ2aWNlCitwYXJ0aXRpb24gaXMgcmVib290ZWQsIGFuZCB0aGUgZGV2aWNlIGlzIHJlaW5pdGlhbGl6ZWQuIFRoaXMgYWxsb3dzCitndWVzdHMgdG8gY29udGludWUgcnVubmluZyBhbmQgdG8gcmVjb3ZlciBmcm9tIHRoZSBlcnJvci4KKwordmlydG5pYworCitUaGUgdmlydG5pYyBtb2R1bGUgcHJvdmlkZXMgYSBwYXJhdmlydHVhbGl6ZWQgbmV0d29yayBpbnRlcmZhY2UgdG8gYQorZ3Vlc3QgYnkgcHJveHlpbmcgYnVmZmVyIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIGd1ZXN0IGFuZCB0aGUgc2VydmljZQorcGFydGl0aW9uIHRoYXQgb3ducyB0aGUgc2hhcmVkIG5ldHdvcmsgaW50ZXJmYWNlLCB1c2luZyBhIGNoYW5uZWwKK2JldHdlZW4gdGhlIGd1ZXN0IGFuZCB0aGUgc2VydmljZSBwYXJ0aXRpb24uIFRoZSBjb25uZWN0aXZpdHkgb2YgdGhpcworaW50ZXJmYWNlIHdpdGggdGhlIHNoYXJlZCBpbnRlcmZhY2UgYW5kIHBvc3NpYmx5IG90aGVyIGd1ZXN0CitwYXJ0aXRpb25zIGlzIGRlZmluZWQgYnkgdGhlIHMtUGFyIGNvbmZpZ3VyYXRpb24gYW5kIGVuZm9yY2VkIGJ5IHRoZQorc2VydmljZSBwYXJ0aXRpb247IHRoZSBndWVzdCBkcml2ZXIgaGFuZGxlcyBjb21tdW5pY2F0aW9uIGFuZCBsaW5rCitzdGF0dXMuCisKK3Zpc29yc2VyaWFsCisKK1RoZSB2aXNvcnNlcmlhbCBtb2R1bGUgYWxsb3dzIHRoZSBjb25zb2xlIG9mIHRoZSBsaW51eCBndWVzdCB0byBiZQorYWNjZXNzZWQgdmlhIHRoZSBzLVBhciBjb25zb2xlIHNlcmlhbCBjaGFubmVsLiBJdCBjcmVhdGVzIGRldmljZXMgaW4KKy9kZXYvdmlzb3JzZXJpYWxjbGllbnRYIHdoaWNoIGJlaGF2ZSBsaWtlIGEgc2VyaWFsIHRlcm1pbmFsIGFuZCBhcmUKK2Nvbm5lY3RlZCB0byB0aGUgZGlhZ25vc3RpY3Mgc3lzdGVtIGluIHMtUGFyLiBCeSBhc3NpZ25pbmcgYSBnZXR0eSB0bwordGhlIHRlcm1pbmFsIGluIHRoZSBndWVzdCwgYSB1c2VyIGNvdWxkIGxvZyBpbnRvIGFuZCBhY2Nlc3MgdGhlIGd1ZXN0Citmcm9tIHRoZSBzLVBhciBkaWFnbm9zdGljcyBTV0lUQ0ggUlVOIHRlcm1pbmFsLgorCit2aXNvcmJ1cworCitUaGUgdmlzb3JidXMgbW9kdWxlIGhhbmRsZXMgdGhlIGJ1cyBmdW5jdGlvbnMgZm9yIG1vc3QgZnVuY3Rpb25hbAorZHJpdmVycyBleGNlcHQgdmlzb3JzZXJpYWwsIHZpc29yZGlhZywgdmlydGhiYSwgYW5kIHZpcnRuaWMuIEl0CittYWludGFpbnMgdGhlIHN5c2ZzIHN1YnRyZWUgL3N5cy9kZXZpY2VzL3Zpc29yYnVzKi8uIEl0IGlzIHJlc3BvbnNpYmxlCitmb3IgZGV2aWNlIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiBvZiB0aGUgZGV2aWNlcyBvbiBpdHMgYnVzLgorCit2aXNvcmNsaWVudGJ1cworCitUaGUgdmlzb3JjbGllbnRidXMgbW9kdWxlIGZvcndhcmRzIHRoZSBidXMgZnVuY3Rpb25zIGZvciB2aXJ0aGJhLCBhbmQKK3ZpcnRuaWMgdG8gdGhlIHZpcnRwY2kgZHJpdmVyLgorCit2aXJ0cGNpCisKK1RoZSB2aXJ0cGNpIG1vZHVsZSBoYW5kbGVzIHRoZSBidXMgZnVuY3Rpb25zIGZvciB2aXJ0aGJhLCBhbmQgdmlydG5pYy4KKworcy1QYXIgSW50ZWdyYXRpb24gTW9kdWxlcworCitUaGUgbW9kdWxlcyBpbiB0aGlzIHNlY3Rpb24gcHJvdmlkZSBpbnRlZ3JhdGlvbiB3aXRoIHMtUGFyIGd1ZXN0CitwYXJ0aXRpb24gc2VydmljZXMgbGlrZSBkaWFnbm9zdGljcyBhbmQgcmVtb3RlIGRlc2t0b3AuIFRoZXNlIG1vZHVsZXMKK2RlcGVuZCBvbiBmdW5jdGlvbnMgaW4gdGhlIG1vZHVsZXMgZGVzY3JpYmVkIGluIHRoZSBzdXBwb3J0IG1vZHVsZXMKK3NlY3Rpb24uCisKK3Zpc29ydmlkZW9jbGllbnQKKworVGhlIHZpc29ydmlkZW9jbGllbnQgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIHZpZGVvIHN1cHBvcnQKK2ZvciB0aGUgVW5pc3lzIHMtUGFyIFBhcnRpdGlvbiBEZXNrdG9wIGFwcGxpY2F0aW9uLiBUaGUgZ3Vlc3QgT1MgbXVzdAorYWxzbyBoYXZlIHRoZSBVRUZJIEdPUCBwcm90b2NvbCBlbmFibGVkIGZvciB0aGUgcGFydGl0aW9uIGRlc2t0b3AgdG8KK2Z1bmN0aW9uLiAgdmlzb3Jjb25pbmNsaWVudCBUaGUgdmlzb3Jjb25pbmNsaWVudCBtb2R1bGUgcHJvdmlkZXMKK2tleWJvYXJkIGFuZCBtb3VzZSBzdXBwb3J0IGZvciB0aGUgVW5pc3lzIHMtUGFyIFBhcnRpdGlvbiBEZXNrdG9wCithcHBsaWNhdGlvbi4KKworc3BhcnN0b3AKKworVGhlIHNwYXJzdG9wIG1vZHVsZSBoYW5kbGVzIHJlcXVlc3RzIGZyb20gdGhlIFVuaXN5cyBzLVBhciBwbGF0Zm9ybSB0bworc2h1dGRvd24gdGhlIGxpbnV4IGd1ZXN0LiBJdCBhbGxvd3MgYSBwcm9ncmFtIG9uIHRoZSBndWVzdCB0byBwZXJmb3JtCitjbGVhbi11cCBmdW5jdGlvbnMgb24gdGhlIGd1ZXN0IGJlZm9yZSB0aGUgZ3Vlc3QgaXMgc2h1dCBkb3duIG9yCityZWJvb3RlZCB1c2luZyBBQ1BJLgorCit2aXNvcmRpYWcKKworVGhpcyBkcml2ZXIgcHJvdmlkZXMgdGhlIGFiaWxpdHkgZm9yIHRoZSBndWVzdCB0byB3cml0ZSBpbmZvcm1hdGlvbgoraW50byB0aGUgcy1QYXIgZGlhZ25vc3RpY3Mgc3Vic3lzdGVtLiBJdCBjcmVhdGVzIGEgc2V0IG9mIGRldmljZXMKK25hbWVkIC9kZXYvdmlzb3JkaWFnLlggd2hpY2ggY2FuIGJlIHdyaXR0ZW4gdG8gYnkgdGhlIGd1ZXN0IHRvIGFkZAordGV4dCB0byB0aGUgcy1QYXIgc3lzdGVtIGxvZy4KKworU3VwcG9ydCBNb2R1bGVzCisKK1RoZSBtb2R1bGVzIGRlc2NyaWJlZCBpbiB0aGlzIHNlY3Rpb24gcHJvdmlkZSBmdW5jdGlvbnMgYW5kCithYnN0cmFjdGlvbnMgdG8gc3VwcG9ydCB0aGUgbW9kdWxlcyBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzCitzZWN0aW9ucywgdG8gYXZvaWQgaGF2aW5nIGR1cGxpY2F0ZWQgZnVuY3Rpb25hbGl0eS4KKwordmlzb3Jub29wCisKK1RoZSB2aXNvcm5vb3AgbW9kdWxlIGlzIGEgcGxhY2Vob2xkZXIgdGhhdCByZXNwb25kcyB0byBkZXZpY2UKK2NyZWF0ZS9kZXN0cm95IG1lc3NhZ2VzIHRoYXQgYXJlIGN1cnJlbnRseSBub3QgaW4gdXNlIGJ5IGxpbnV4IGd1ZXN0cy4KKwordmlzb3J1aXNsaWIKKworVGhlIHZpc29ydWlzbGliIG1vZHVsZSBpcyBhIHN1cHBvcnQgbGlicmFyeSwgdXNlZCB0byBoYW5kbGUgcmVxdWVzdHMKK2Zyb20gdmlydHBjaS4KKwordmlzb3JjaGFubmVsc3R1YgorCitUaGUgdmlzb3JjaGFubmVsc3R1YiBtb2R1bGUgcHJvdmlkZXMgc3VwcG9ydCByb3V0aW5lcyBmb3Igc3RvcmluZyBhbmQKK3JldHJpZXZpbmcgZGF0YSBmcm9tIGEgY2hhbm5lbC4KKwordmlzb3JjaGFubmVsCisKK1RoZSB2aXNvcmNoYW5uZWwgbW9kdWxlIGlzIGEgc3VwcG9ydCBsaWJyYXJ5IHRoYXQgYWJzdHJhY3RzIHJlYWRpbmcKK2FuZCB3cml0aW5nIGEgY2hhbm5lbCBpbiBtZW1vcnkuCisKK3Zpc29ydXRpbAorCitUaGUgdmlzb3J1dGlsIG1vZHVsZSBpcyBhIHN1cHBvcnQgbGlicmFyeSByZXF1aXJlZCBieSBhbGwgb3RoZXIgcy1QYXIKK2RyaXZlciBtb2R1bGVzLiBBbW9uZyBpdHMgZmVhdHVyZXMgaXQgYWJzdHJhY3RzIHJlYWRpbmcsIHdyaXRpbmcsIGFuZAorbWFuaXB1bGF0aW5nIGEgYmxvY2sgb2YgbWVtb3J5LgorCitNaW5pbXVtIFJlcXVpcmVkIERyaXZlciBTZXQKKworVGhlIGRyaXZlcnMgcmVxdWlyZWQgdG8gYm9vdCBhIExpbnV4IGd1ZXN0IGFyZSB2aXNvcmNoaXBzZXQsIHZpc29yYnVzLAordmlzb3J2aWRlb2NsaWVudCwgdmlzb3Jjb25pbmNsaWVudCwgdmlzb3J1aXNsaWIsIHZpc29yY2hhbm5lbHN0dWIsCit2aXNvcmNoYW5uZWwsIGFuZCB2aXNvcnV0aWwuIFRoZSBvdGhlciBkcml2ZXJzIGFyZSByZXF1aXJlZCBieSB0aGUKK3Byb2R1Y3QgY29uZmlndXJhdGlvbnMgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIG1hcmtldGVkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9Eb2N1bWVudGF0aW9uL3Byb2MtZW50cmllcy50eHQgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL0RvY3VtZW50YXRpb24vcHJvYy1lbnRyaWVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjZmOTJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9Eb2N1bWVudGF0aW9uL3Byb2MtZW50cmllcy50eHQKQEAgLTAsMCArMSw5MyBAQAorIHMtUGFyIFByb2MgRW50cmllcworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIHByb2MgZW50cmllcyBjcmVhdGVkIGJ5IHRoZSBVbmlzeXMgcy1QYXIgbW9kdWxlcy4KKworU3VwcG9ydCBNb2R1bGUgRW50cmllcworVGhlc2UgZW50cmllcyBhcmUgcHJvdmlkZWQgcHJpbWFyaWx5IGZvciBkZWJ1Z2dpbmcuCisKKy9wcm9jL3Vpc2xpYi9pbmZvOiBUaGlzIGVudHJ5IGNvbnRhaW5zIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlCit1aXNsaWIgbW9kdWxlLCBpbmNsdWRpbmcgYnVzIGluZm9ybWF0aW9uIGFuZCBtZW1vcnkgdXNhZ2UuCisKKy9wcm9jL3Zpc29yY2hpcHNldC9jb250cm9sdm06IFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGRlYnVnZ2luZworZW50cmllcyBmb3IgdGhlIGNvbnRyb2x2bSBjaGFubmVsIHVzZWQgYnkgdmlzb3JjaGlwc2V0LgorCisvcHJvYy91aXNsaWIvcGxhdGZvcm06IFRoaXMgZW50cnkgaXMgdXNlZCB0byBkaXNwbGF5IHRoZSBwbGF0Zm9ybQorbnVtYmVyIHRoaXMgbm9kZSBpcyBpbiB0aGUgc3lzdGVtLiBGb3Igc29tZSBndWVzdHMsIHRoaXMgbWF5IGJlCitpbnZhbGlkLgorCisvcHJvYy92aXNvcmNoaXBzZXQvY2hpcHNldHJlYWR5OiBUaGlzIGVudHJ5IGlzIHdyaXR0ZW4gdG8gYnkgc2NyaXB0cwordG8gc2lnbmlmeSB0aGF0IGFueSB1c2VyIGxldmVsIGFjdGl2aXR5IGhhcyBiZWVuIGNvbXBsZXRlZCBiZWZvcmUgdGhlCitndWVzdCBjYW4gYmUgY29uc2lkZXJlZCBydW5uaW5nIGFuZCBpcyBzaG93biBhcyBydW5uaW5nIGluIHRoZSBzLVBhcgorVUkuCisKK0RldmljZSBFbnRyaWVzCitUaGVzZSBlbnRyaWVzIHByb3ZpZGUgc3RhdHVzIG9mIHRoZSBkZXZpY2VzIHNoYXJlZCBieSBhIHNlcnZpY2UgcGFydGl0aW9uLgorCisvcHJvYy91aXNsaWIvdmJ1czogdGhpcyBpcyBhIGRpcmVjdG9yeSBjb250YWluaW5nIGVudHJpZXMgZm9yIGVhY2gKK3ZpcnR1YWwgYnVzLiBFYWNoIG51bWJlcmVkIHN1Yi1kaXJlY3RvcnkgY29udGFpbnMgYW4gaW5mbyBlbnRyeSwgd2hpY2gKK2Rlc2NyaWJlcyB0aGUgZGV2aWNlcyB0aGF0IGFwcGVhciBvbiB0aGF0IGJ1cy4KKworL3Byb2MvdWlzbGliL2N5Y2xlc19iZWZvcmVfd2FpdDogVGhpcyBlbnRyeSBpcyB1c2VkIHRvIHR1bmUKK3BlcmZvcm1hbmNlLCBieSBzZXR0aW5nIHRoZSBudW1iZXIgb2YgY3ljbGVzIHdlIHdhaXQgYmVmb3JlIGdvaW5nIGlkbGUKK3doZW4gaW4gcG9sbGluZyBtb2RlLiBBIGxvbmdlciB0aW1lIHdpbGwgcmVkdWNlIG1lc3NhZ2UgbGF0ZW5jeSBidXQKK3NwZW5kIG1vcmUgcHJvY2Vzc2luZyB0aW1lIHBvbGxpbmcuCisKKy9wcm9jL3Vpc2xpYi9zbWFydF93YWtldXA6IFRoaXMgZW50cnkgaXMgdXNlZCB0byB0dW5lIHBlcmZvcm1hbmNlLCBieQorZW5hYmxpbmcgb3IgZGlzYWJsaW5nIHNtYXJ0IHdha2V1cC4KKworL3Byb2MvdmlydGhiYS9pbmZvOiBUaGlzIGVudHJ5IGNvbnRhaW5zIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlCit2aXJ0aGJhIG1vZHVsZSwgaW5jbHVkaW5nIGludGVycnVwdCBpbmZvcm1hdGlvbiBhbmQgbWVtb3J5IHVzYWdlLgorCisvcHJvYy92aXJ0aGJhL2VuYWJsZV9pbnRzOiBUaGlzIGVudHJ5IGNvbnRyb2xzIGludGVycnVwdCB1c2UgYnkgdGhlCit2aXJ0aGJhIG1vZHVsZS4gV3JpdGluZyBhIDAgdG8gdGhpcyBlbnRyeSB3aWxsIGRpc2FibGUgaW50ZXJydXB0cy4KKworL3Byb2MvdmlydG5pYy9pbmZvOiBUaGlzIGVudHJ5IGNvbnRhaW5zIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlCit2aXJ0bmljIG1vZHVsZSwgaW5jbHVkaW5nIGludGVycnVwdCBpbmZvcm1hdGlvbiwgc2VuZCBhbmQgcmVjZWl2ZQorY291bnRzLCBhbmQgb3RoZXIgZGV2aWNlIGluZm9ybWF0aW9uLgorCisvcHJvYy92aXJ0bmljL2V0aFg6IFRoaXMgaXMgYSBkaXJlY3RvcnkgY29udGFpbmluZyBlbnRyaWVzIGZvciBlYWNoCit2aXJ0dWFsIE5JQy4gRWFjaCBuYW1lZCBzdWJkaXJlY3RvcnkgY29udGFpbnMgdHdvIGVudHJpZXMsCitjbGllbnRzdHJpbmcgYW5kIHpvbmUuCisKKy9wcm9jL3ZpcnRwY2kvaW5mbzogVGhpcyBlbnRyeSBjb250YWlucyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIHRoZQordmlydHBjaSBtb2R1bGUsIGluY2x1ZGluZyB2aXJ0dWFsIFBDSSBidXMgaW5mb3JtYXRpb24gYW5kIGRldmljZQorbG9jYXRpb25zLgorCisvcHJvYy92aXJ0bmljL2VuYWJsZV9pbnRzOiBUaGlzIGVudHJ5IGNvbnRyb2xzIGludGVycnVwdCB1c2UgYnkgdGhlCit2aXJ0bmljIG1vZHVsZS4gV3JpdGluZyBhIDAgdG8gdGhpcyBlbnRyeSB3aWxsIGRpc2FibGUgaW50ZXJydXB0cy4KKworVmlzb3Jjb25pbmNsaWVudCwgdmlzb3JkaWFnLCB2aXNvcm5vb3AsIHZpc29yc2VyaWFsY2xpZW50LCBhbmQKK3Zpc29ydmlkZW9jbGllbnQgRW50cmllcworCitUaGUgZW50cmllcyBpbiBwcm9jIGZvciB0aGVzZSBtb2R1bGVzIGFsbCBmb2xsb3cgdGhlIHNhbWUKK3BhdHRlcm4uIEVhY2ggbW9kdWxlIGhhcyBpdHMgb3duIHByb2MgZGlyZWN0b3J5IHdpdGggdGhlIHNhbWUgbmFtZSwKK2UuZy4gdmlzb3JkaWFnIHByZXNlbnRzIGEgL3Byb2Mvdmlzb3JkaWFnIGRpcmVjdG9yeS4gSW5zaWRlIG9mIHRoZQorbW9kdWxlJ3MgZGlyZWN0b3J5IGFyZSBhIGRldmljZSBkaXJlY3RvcnksIHdoaWNoIGNvbnRhaW5zIG9uZSBudW1iZXJlZAorZGlyZWN0b3J5IGZvciBlYWNoIGRldmljZSBwcm92aWRlZCBieSB0aGF0IG1vZHVsZS4gRWFjaCBkZXZpY2UgaGFzIGEKK2RpYWcgZW50cnkgdGhhdCBwcmVzZW50cyB0aGUgZGV2aWNlIG51bWJlciBhbmQgdmlzb3JidXMgbmFtZSBmb3IgdGhhdAorZGV2aWNlLiBUaGUgbW9kdWxlIGRpcmVjdG9yeSBhbHNvIGhhcyBhIGRyaXZlci9kaWFnIGVudHJ5LCB3aGljaAorcmVwb3J0cyB0aGUgY29ycmVzcG9uZGluZyBzLVBhciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZHJpdmVyLgorCitBdXRvbWF0ZWQgSW5zdGFsbGF0aW9uIEVudHJpZXMKKworVGhlc2UgZW50cmllcyBhcmUgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIHMtUGFyIHBsYXRmb3JtCithbmQgdGhlIExpbnV4LWJhc2VkIGluc3RhbGxhdGlvbiBhbmQgcmVjb3ZlcnkgdG9vbC4gVGhlc2UgdmFsdWVzIGFyZQorcmVhZC93cml0ZSwgaG93ZXZlciwgdGhlIGd1ZXN0IGNhbiBvbmx5IHJlc2V0IHRoZW0gdG8gMCwgb3IgcmVwb3J0IGFuCitlcnJvciBzdGF0dXMgdGhyb3VnaCB0aGUgaW5zdGFsbGVyIGVudHJ5LiBUaGUgdmFsdWVzIGFyZSBvbmx5IHNldCB2aWEKK3MtUGFyJ3MgZmlybXdhcmUgaW50ZXJmYWNlLCB0byBoZWxwIHByZXZlbnQgYWNjaWRlbnRhbGx5IGJvb3RpbmcgaW50bwordGhlIHRvb2wuCisKKy9wcm9jL3Zpc29yY2hpcHNldC9ib290dG90b29sOiBUaGlzIGVudHJ5IGluc3RydWN0cyBzLVBhciB0aGF0IHRoZQorbmV4dCByZWJvb3Qgd2lsbCBsYXVuY2ggdGhlIGluc3RhbGxhdGlvbiBhbmQgcmVjb3ZlcnkgdG9vbC4gSWYgc2V0IHRvCiswLCB0aGUgbmV4dCBib290IHdpbGwgaGFwcGVuIGFjY29yZGluZyB0byB0aGUgVUVGSSBib290IG1hbmFnZXIKK3NldHRpbmdzLgorCisvcHJvYy92aXNvcmNoaXBzZXQvdG9vbGFjdGlvbjogVGhpcyBlbnRyeSBpbmRpY2F0ZXMgdGhlIGluc3RhbGxhdGlvbgorYW5kIHJlY292ZXJ5IHRvb2wgbW9kZSByZXF1ZXN0ZWQgZm9yIHRoZSBuZXh0IGJvb3QuCisKKy9wcm9jL3Zpc29yY2hpcHNldC9pbnN0YWxsZXI6IHRoaXMgZW50cnkgaXMgdXNlZCBieSB0aGUgaW5zdGFsbGF0aW9uCithbmQgcmVjb3ZlcnkgdG9vbCB0byBwYXNzIHN0YXR1cyBhbmQgcmVzdWx0IGluZm9ybWF0aW9uIGJhY2sgdG8gdGhlCitzLVBhciBmaXJtd2FyZS4KKworL3Byb2Mvdmlzb3JjaGlwc2V0L3BhcnRpdGlvbjogVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGd1ZXN0CitwYXJ0aXRpb24gY29uZmlndXJhdGlvbiBkYXRhIGZvciBlYWNoIHZpcnR1YWwgYnVzLCBmb3IgdXNlIGR1cmluZworaW5zdGFsbGF0aW9uIGFuZCBhdCBydW50aW1lIGZvciBzLVBhciBzZXJ2aWNlIHBhcnRpdGlvbnMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwODBjOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvS2NvbmZpZwpAQCAtMCwwICsxLDIwIEBACisjCisjIFVuaXN5cyBTUEFSIGRyaXZlciBjb25maWd1cmF0aW9uCisjCittZW51Y29uZmlnIFVOSVNZU1NQQVIKKwlib29sICJVbmlzeXMgU1BBUiBkcml2ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFg4Nl82NAorCS0tLWhlbHAtLS0KKwlTdXBwb3J0IGZvciB0aGUgVW5pc3lzIFNQQVIgZHJpdmVycworCitpZiBVTklTWVNTUEFSCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jaGFubmVscy9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRwY2kvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL0tjb25maWciCisKK2VuZGlmICMgVU5JU1lTU1BBUgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9NQUlOVEFJTkVSUyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvTUFJTlRBSU5FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzljZWYwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvTUFJTlRBSU5FUlMKQEAgLTAsMCArMSw2IEBACitVbmlzeXMgcy1QYXIgZHJpdmVycworTToJQmVuIFJvbWVyIDxzcGFybWFpbnRhaW5lckB1bmlzeXMuY29tPgorUzoJTWFpbnRhaW5lZAorRjoJRG9jdW1lbnRhdGlvbi9zLVBhci9vdmVydmlldy50eHQKK0Y6CURvY3VtZW50YXRpb24vcy1QYXIvcHJvYy1lbnRyaWVzLnR4dAorRjoJZHJpdmVycy9zdGFnaW5nL3VuaXN5cy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ODhkNjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIFVuaXN5cyBTUEFSIGRyaXZlcnMKKyMKK29iai0kKENPTkZJR19VTklTWVNfVklTT1JVVElMKQkJKz0gdmlzb3J1dGlsLworb2JqLSQoQ09ORklHX1VOSVNZU19WSVNPUkNIQU5ORUwpCSs9IHZpc29yY2hhbm5lbC8KK29iai0kKENPTkZJR19VTklTWVNfVklTT1JDSElQU0VUKQkrPSB2aXNvcmNoaXBzZXQvCitvYmotJChDT05GSUdfVU5JU1lTX0NIQU5ORUxTVFVCKQkrPSBjaGFubmVscy8KK29iai0kKENPTkZJR19VTklTWVNfVUlTTElCKQkJKz0gdWlzbGliLworb2JqLSQoQ09ORklHX1VOSVNZU19WSVJUUENJKQkJKz0gdmlydHBjaS8KK29iai0kKENPTkZJR19VTklTWVNfVklSVEhCQSkJCSs9IHZpcnRoYmEvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0YWM2MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvVE9ETwpAQCAtMCwwICsxLDIxIEBACitUT0RPOgorCS1jaGVja3BhdGNoIHdhcm5pbmdzCisJLW1vdmUgL3Byb2MgZW50cmllcyB0byAvc3lzCisJLXByb3BlciBtYWpvciBudW1iZXIocykKKwktYWRkIG90aGVyIGRyaXZlcnMgbmVlZGVkIGZvciBmdWxsIGZ1bmN0aW9uYWxpdHk6CisJCS12aXNvcmNsaWVudGJ1cworCQktdmlzb3JidXMKKwkJLXZpc29yZGlhZworCQktdmlydG5pYworCQktdmlzb3Jub29wCisJCS12aXNvcnNlcmlhbAorCQktdmlzb3J2aWRlb2NsaWVudAorCQktdmlzb3Jjb25pbmNsaWVudAorCQktc3BhcnN0b3AKKwktbW92ZSBpbmRpdmlkdWFsIGRyaXZlcnMgaW50byBwcm9wZXIgZHJpdmVyIHN1YnN5c3RlbXMKKwkJCisKK1BhdGNoZXMgdG86CisJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAbGludXhmb3VuZGF0aW9uLm9yZz4KKwlLZW4gQ294IDxqa2NAcmVkaGF0LmNvbT4KKwlVbmlzeXMgcy1QYXIgbWFpbnRhaW5lciBtYWlsaW5nIGxpc3QgPHNwYXJtYWludGFpbmVyQHVuaXN5cy5jb20+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NoYW5uZWxzL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NoYW5uZWxzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhMjM1MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvS2NvbmZpZwpAQCAtMCwwICsxLDEwIEBACisjCisjIFVuaXN5cyBjaGFubmVscyBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBVTklTWVNfQ0hBTk5FTFNUVUIKKwl0cmlzdGF0ZSAiVW5pc3lzIGNoYW5uZWxzdHViIGRyaXZlciIKKwlkZXBlbmRzIG9uIFVOSVNZU1NQQVIKKwktLS1oZWxwLS0tCisJSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGVuYWJsZSB0aGUgVW5pc3lzIGNoYW5uZWxzIGRyaXZlci4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jaGFubmVscy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYwYjBhZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIworIyBNYWtlZmlsZSBmb3IgVW5pc3lzIGNoYW5uZWxzdHViCisjCisKK29iai0kKENPTkZJR19VTklTWVNfQ0hBTk5FTFNUVUIpCSs9IHZpc29yY2hhbm5lbHN0dWIubworCit2aXNvcmNoYW5uZWxzdHViLXkgOj0gY2hhbm5lbC5vIGNoYW5zdHViLm8KKworY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscworY2NmbGFncy15ICs9IC1EQ09ORklHX1NQQVJfR1VFU1QgLURHVUVTVERSSVZFUkJVSUxEIC1ETk9BVVRPVkVSU0lPTgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NoYW5uZWxzL2NoYW5uZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvY2hhbm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NDUyNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NoYW5uZWxzL2NoYW5uZWwuYwpAQCAtMCwwICsxLDIxOSBAQAorLyogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaWZkZWYgQ09ORklHX01PRFZFUlNJT05TCisjaW5jbHVkZSA8Y29uZmlnL21vZHZlcnNpb25zLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CQkvKiBmb3IgbW9kdWxlX2luaXQgYW5kIG1vZHVsZV9leGl0ICovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkJLyogZm9yIG1lbWNweSAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEltcGxlbWVudGF0aW9uIG9mIGV4cG9ydGVkIGZ1bmN0aW9ucyBmb3IgU3VwZXJ2aXNvciBjaGFubmVscyAqLworI2luY2x1ZGUgImNoYW5uZWwuaCIKKworLyoKKyAqIFJvdXRpbmUgRGVzY3JpcHRpb246CisgKiBUcmllcyB0byBpbnNlcnQgdGhlIHByZWJ1aWx0IHNpZ25hbCBwb2ludGVkIHRvIGJ5IHBTaWduYWwgaW50byB0aGUgbnRoCisgKiBRdWV1ZSBvZiB0aGUgQ2hhbm5lbCBwb2ludGVkIHRvIGJ5IHBDaGFubmVsCisgKgorICogUGFyYW1ldGVyczoKKyAqIHBDaGFubmVsOiAoSU4pIHBvaW50cyB0byB0aGUgSU8gQ2hhbm5lbAorICogUXVldWU6IChJTikgbnRoIFF1ZXVlIG9mIHRoZSBJTyBDaGFubmVsCisgKiBwU2lnbmFsOiAoSU4pIHBvaW50ZXIgdG8gdGhlIHNpZ25hbAorICoKKyAqIEFzc3VtcHRpb25zOgorICogLSBwQ2hhbm5lbCwgUXVldWUgYW5kIHBTaWduYWwgYXJlIHZhbGlkLgorICogLSBJZiBpbnNlcnRpb24gZmFpbHMgZHVlIHRvIGEgZnVsbCBxdWV1ZSwgdGhlIGNhbGxlciB3aWxsIGRldGVybWluZSB0aGUKKyAqIHJldHJ5IHBvbGljeSAoZS5nLiB3YWl0ICYgdHJ5IGFnYWluLCByZXBvcnQgYW4gZXJyb3IsIGV0Yy4pLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIDEgaWYgdGhlIGluc2VydGlvbiBzdWNjZWVkcywgMCBpZiB0aGUgcXVldWUgd2FzIGZ1bGwuCisgKi8KK3Vuc2lnbmVkIGNoYXIKK3Zpc29yX3NpZ25hbF9pbnNlcnQoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW5uZWwsIFUzMiBRdWV1ZSwgdm9pZCAqcFNpZ25hbCkKK3sKKwl2b2lkIF9faW9tZW0gKnBzaWduYWw7CisJdW5zaWduZWQgaW50IGhlYWQsIHRhaWwsIG5vZjsKKworCVNJR05BTF9RVUVVRV9IRUFERVIgX19pb21lbSAqcHFoZHIgPQorCSAgICAoU0lHTkFMX1FVRVVFX0hFQURFUiBfX2lvbWVtICopCisJCSgoY2hhciBfX2lvbWVtICopIHBDaGFubmVsICsgcmVhZHEoJnBDaGFubmVsLT5vQ2hhbm5lbFNwYWNlKSkKKwkJKyBRdWV1ZTsKKworCS8qIGNhcHR1cmUgY3VycmVudCBoZWFkIGFuZCB0YWlsICovCisJaGVhZCA9IHJlYWRsKCZwcWhkci0+SGVhZCk7CisJdGFpbCA9IHJlYWRsKCZwcWhkci0+VGFpbCk7CisKKwkvKiBxdWV1ZSBpcyBmdWxsIGlmIChoZWFkICsgMSkgJSBuIGVxdWFscyB0YWlsICovCisJaWYgKCgoaGVhZCArIDEpICUgcmVhZGwoJnBxaGRyLT5NYXhTaWduYWxTbG90cykpID09IHRhaWwpIHsKKwkJbm9mID0gcmVhZHEoJnBxaGRyLT5OdW1PdmVyZmxvd3MpICsgMTsKKwkJd3JpdGVxKG5vZiwgJnBxaGRyLT5OdW1PdmVyZmxvd3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBpbmNyZW1lbnQgdGhlIGhlYWQgaW5kZXggKi8KKwloZWFkID0gKGhlYWQgKyAxKSAlIHJlYWRsKCZwcWhkci0+TWF4U2lnbmFsU2xvdHMpOworCisJLyogY29weSBzaWduYWwgdG8gdGhlIGhlYWQgbG9jYXRpb24gZnJvbSB0aGUgYXJlYSBwb2ludGVkIHRvCisJICogYnkgcFNpZ25hbAorCSAqLworCXBzaWduYWwgPSAoY2hhciBfX2lvbWVtICopcHFoZHIgKyByZWFkcSgmcHFoZHItPm9TaWduYWxCYXNlKSArCisJCShoZWFkICogcmVhZGwoJnBxaGRyLT5TaWduYWxTaXplKSk7CisJTUVNQ1BZX1RPSU8ocHNpZ25hbCwgcFNpZ25hbCwgcmVhZGwoJnBxaGRyLT5TaWduYWxTaXplKSk7CisKKwlWb2xhdGlsZUJhcnJpZXIoKTsKKwl3cml0ZWwoaGVhZCwgJnBxaGRyLT5IZWFkKTsKKworCXdyaXRlcShyZWFkcSgmcHFoZHItPk51bVNpZ25hbHNTZW50KSArIDEsICZwcWhkci0+TnVtU2lnbmFsc1NlbnQpOworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3Jfc2lnbmFsX2luc2VydCk7CisKKy8qCisgKiBSb3V0aW5lIERlc2NyaXB0aW9uOgorICogUmVtb3ZlcyBvbmUgc2lnbmFsIGZyb20gQ2hhbm5lbCBwQ2hhbm5lbCdzIG50aCBRdWV1ZSBhdCB0aGUKKyAqIHRpbWUgb2YgdGhlIGNhbGwgYW5kIGNvcGllcyBpdCBpbnRvIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieQorICogcFNpZ25hbC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogcENoYW5uZWw6IChJTikgcG9pbnRzIHRvIHRoZSBJTyBDaGFubmVsCisgKiBRdWV1ZTogKElOKSBudGggUXVldWUgb2YgdGhlIElPIENoYW5uZWwKKyAqIHBTaWduYWw6IChJTikgcG9pbnRlciB0byB3aGVyZSB0aGUgc2lnbmFscyBhcmUgdG8gYmUgY29waWVkCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAtIHBDaGFubmVsIGFuZCBRdWV1ZSBhcmUgdmFsaWQuCisgKiAtIHBTaWduYWwgcG9pbnRzIHRvIGEgbWVtb3J5IGFyZWEgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgcXVldWUncyBTaWduYWxTaXplCisgKgorICogUmV0dXJuIHZhbHVlOgorICogMSBpZiB0aGUgcmVtb3ZhbCBzdWNjZWVkcywgMCBpZiB0aGUgcXVldWUgd2FzIGVtcHR5LgorICovCit1bnNpZ25lZCBjaGFyCit2aXNvcl9zaWduYWxfcmVtb3ZlKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsLCBVMzIgUXVldWUsIHZvaWQgKnBTaWduYWwpCit7CisJdm9pZCBfX2lvbWVtICpwc291cmNlOworCXVuc2lnbmVkIGludCBoZWFkLCB0YWlsOworCVNJR05BTF9RVUVVRV9IRUFERVIgX19pb21lbSAqcHFoZHIgPQorCSAgICAoU0lHTkFMX1FVRVVFX0hFQURFUiBfX2lvbWVtICopICgoY2hhciBfX2lvbWVtICopIHBDaGFubmVsICsKKwkJCQkgICAgcmVhZHEoJnBDaGFubmVsLT5vQ2hhbm5lbFNwYWNlKSkgKyBRdWV1ZTsKKworCS8qIGNhcHR1cmUgY3VycmVudCBoZWFkIGFuZCB0YWlsICovCisJaGVhZCA9IHJlYWRsKCZwcWhkci0+SGVhZCk7CisJdGFpbCA9IHJlYWRsKCZwcWhkci0+VGFpbCk7CisKKwkvKiBxdWV1ZSBpcyBlbXB0eSBpZiB0aGUgaGVhZCBpbmRleCBlcXVhbHMgdGhlIHRhaWwgaW5kZXggKi8KKwlpZiAoaGVhZCA9PSB0YWlsKSB7CisJCXdyaXRlcShyZWFkcSgmcHFoZHItPk51bUVtcHR5Q250KSArIDEsICZwcWhkci0+TnVtRW1wdHlDbnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBhZHZhbmNlIHBhc3QgdGhlICdlbXB0eScgZnJvbnQgc2xvdCAqLworCXRhaWwgPSAodGFpbCArIDEpICUgcmVhZGwoJnBxaGRyLT5NYXhTaWduYWxTbG90cyk7CisKKwkvKiBjb3B5IHNpZ25hbCBmcm9tIHRhaWwgbG9jYXRpb24gdG8gdGhlIGFyZWEgcG9pbnRlZCB0byBieSBwU2lnbmFsICovCisJcHNvdXJjZSA9IChjaGFyIF9faW9tZW0gKikgcHFoZHIgKyByZWFkcSgmcHFoZHItPm9TaWduYWxCYXNlKSArCisJCSh0YWlsICogcmVhZGwoJnBxaGRyLT5TaWduYWxTaXplKSk7CisJTUVNQ1BZX0ZST01JTyhwU2lnbmFsLCBwc291cmNlLCByZWFkbCgmcHFoZHItPlNpZ25hbFNpemUpKTsKKworCVZvbGF0aWxlQmFycmllcigpOworCXdyaXRlbCh0YWlsLCAmcHFoZHItPlRhaWwpOworCisJd3JpdGVxKHJlYWRxKCZwcWhkci0+TnVtU2lnbmFsc1JlY2VpdmVkKSArIDEsCisJICAgICAgICZwcWhkci0+TnVtU2lnbmFsc1JlY2VpdmVkKTsKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3NpZ25hbF9yZW1vdmUpOworCisvKgorICogUm91dGluZSBEZXNjcmlwdGlvbjoKKyAqIFJlbW92ZXMgYWxsIHNpZ25hbHMgcHJlc2VudCBpbiBDaGFubmVsIHBDaGFubmVsJ3MgbnRoIFF1ZXVlIGF0IHRoZQorICogdGltZSBvZiB0aGUgY2FsbCBhbmQgY29waWVzIHRoZW0gaW50byB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkKKyAqIHBTaWduYWwuICBSZXR1cm5zIHRoZSAjIG9mIHNpZ25hbHMgY29waWVkIGFzIHRoZSB2YWx1ZSBvZiB0aGUgcm91dGluZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogcENoYW5uZWw6IChJTikgcG9pbnRzIHRvIHRoZSBJTyBDaGFubmVsCisgKiBRdWV1ZTogKElOKSBudGggUXVldWUgb2YgdGhlIElPIENoYW5uZWwKKyAqIHBTaWduYWw6IChJTikgcG9pbnRlciB0byB3aGVyZSB0aGUgc2lnbmFscyBhcmUgdG8gYmUgY29waWVkCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAtIHBDaGFubmVsIGFuZCBRdWV1ZSBhcmUgdmFsaWQuCisgKiAtIHBTaWduYWwgcG9pbnRzIHRvIGEgbWVtb3J5IGFyZWEgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgUXVldWUncyBNYXhTaWduYWxzCisgKiAjIG9mIHNpZ25hbHMsIGVhY2ggb2Ygd2hpY2ggaXMgUXVldWUncyBTaWduYWxTaXplLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqICMgb2Ygc2lnbmFscyBjb3BpZWQuCisgKi8KK3Vuc2lnbmVkIGludAorU2lnbmFsUmVtb3ZlQWxsKHBDSEFOTkVMX0hFQURFUiBwQ2hhbm5lbCwgVTMyIFF1ZXVlLCB2b2lkICpwU2lnbmFsKQoreworCXZvaWQgKnBzb3VyY2U7CisJdW5zaWduZWQgaW50IGhlYWQsIHRhaWwsIHNpZ25hbENvdW50ID0gMDsKKwlwU0lHTkFMX1FVRVVFX0hFQURFUiBwcWhkciA9CisJICAgIChwU0lHTkFMX1FVRVVFX0hFQURFUikgKChjaGFyICopIHBDaGFubmVsICsKKwkJCQkgICAgcENoYW5uZWwtPm9DaGFubmVsU3BhY2UpICsgUXVldWU7CisKKwkvKiBjYXB0dXJlIGN1cnJlbnQgaGVhZCBhbmQgdGFpbCAqLworCWhlYWQgPSBwcWhkci0+SGVhZDsKKwl0YWlsID0gcHFoZHItPlRhaWw7CisKKwkvKiBxdWV1ZSBpcyBlbXB0eSBpZiB0aGUgaGVhZCBpbmRleCBlcXVhbHMgdGhlIHRhaWwgaW5kZXggKi8KKwlpZiAoaGVhZCA9PSB0YWlsKQorCQlyZXR1cm4gMDsKKworCXdoaWxlIChoZWFkICE9IHRhaWwpIHsKKwkJLyogYWR2YW5jZSBwYXN0IHRoZSAnZW1wdHknIGZyb250IHNsb3QgKi8KKwkJdGFpbCA9ICh0YWlsICsgMSkgJSBwcWhkci0+TWF4U2lnbmFsU2xvdHM7CisKKwkJLyogY29weSBzaWduYWwgZnJvbSB0YWlsIGxvY2F0aW9uIHRvIHRoZSBhcmVhIHBvaW50ZWQKKwkJICogdG8gYnkgcFNpZ25hbAorCQkgKi8KKwkJcHNvdXJjZSA9CisJCSAgICAoY2hhciAqKSBwcWhkciArIHBxaGRyLT5vU2lnbmFsQmFzZSArCisJCSAgICAodGFpbCAqIHBxaGRyLT5TaWduYWxTaXplKTsKKwkJTUVNQ1BZKChjaGFyICopIHBTaWduYWwgKyAocHFoZHItPlNpZ25hbFNpemUgKiBzaWduYWxDb3VudCksCisJCSAgICAgICBwc291cmNlLCBwcWhkci0+U2lnbmFsU2l6ZSk7CisKKwkJVm9sYXRpbGVCYXJyaWVyKCk7CisJCXBxaGRyLT5UYWlsID0gdGFpbDsKKworCQlzaWduYWxDb3VudCsrOworCQlwcWhkci0+TnVtU2lnbmFsc1JlY2VpdmVkKys7CisJfQorCisJcmV0dXJuIHNpZ25hbENvdW50OworfQorCisvKgorICogUm91dGluZSBEZXNjcmlwdGlvbjoKKyAqIERldGVybWluZSB3aGV0aGVyIGEgc2lnbmFsIHF1ZXVlIGlzIGVtcHR5LgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBwQ2hhbm5lbDogKElOKSBwb2ludHMgdG8gdGhlIElPIENoYW5uZWwKKyAqIFF1ZXVlOiAoSU4pIG50aCBRdWV1ZSBvZiB0aGUgSU8gQ2hhbm5lbAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIDEgaWYgdGhlIHNpZ25hbCBxdWV1ZSBpcyBlbXB0eSwgMCBvdGhlcndpc2UuCisgKi8KK3Vuc2lnbmVkIGNoYXIKK3Zpc29yX3NpZ25hbHF1ZXVlX2VtcHR5KENIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsLCBVMzIgUXVldWUpCit7CisJU0lHTkFMX1FVRVVFX0hFQURFUiBfX2lvbWVtICpwcWhkciA9CisJICAgIChTSUdOQUxfUVVFVUVfSEVBREVSIF9faW9tZW0gKikgKChjaGFyIF9faW9tZW0gKikgcENoYW5uZWwgKworCQkJCSAgICByZWFkcSgmcENoYW5uZWwtPm9DaGFubmVsU3BhY2UpKSArIFF1ZXVlOworCXJldHVybiByZWFkbCgmcHFoZHItPkhlYWQpID09IHJlYWRsKCZwcWhkci0+VGFpbCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9zaWduYWxxdWV1ZV9lbXB0eSk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvY2hhbnN0dWIuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvY2hhbnN0dWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTA0ZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jaGFubmVscy9jaGFuc3R1Yi5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2RlZmluZSBFWFBPUlRfU1lNVEFCCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaWZkZWYgQ09ORklHX01PRFZFUlNJT05TCisjaW5jbHVkZSA8Y29uZmlnL21vZHZlcnNpb25zLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CQkvKiBmb3IgbW9kdWxlX2luaXQgYW5kIG1vZHVsZV9leGl0ICovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkJLyogZm9yIG1lbWNweSAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJjaGFubmVsLmgiCisjaW5jbHVkZSAiY2hhbnN0dWIuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKK3N0YXRpYyBfX2luaXQgaW50CitjaGFubmVsX21vZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZAorY2hhbm5lbF9tb2RfZXhpdCh2b2lkKQoreworfQorCit1bnNpZ25lZCBjaGFyCitTaWduYWxJbnNlcnRfd2l0aExvY2soQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW5uZWwsIFUzMiBRdWV1ZSwKKwkJICAgICAgdm9pZCAqcFNpZ25hbCwgc3BpbmxvY2tfdCAqbG9jaykKK3sKKwl1bnNpZ25lZCBjaGFyIHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKTsKKwlyZXN1bHQgPSB2aXNvcl9zaWduYWxfaW5zZXJ0KHBDaGFubmVsLCBRdWV1ZSwgcFNpZ25hbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKwordW5zaWduZWQgY2hhcgorU2lnbmFsUmVtb3ZlX3dpdGhMb2NrKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsLCBVMzIgUXVldWUsCisJCSAgICAgIHZvaWQgKnBTaWduYWwsIHNwaW5sb2NrX3QgKmxvY2spCit7CisJdW5zaWduZWQgY2hhciByZXN1bHQ7CisJc3Bpbl9sb2NrKGxvY2spOworCXJlc3VsdCA9IHZpc29yX3NpZ25hbF9yZW1vdmUocENoYW5uZWwsIFF1ZXVlLCBwU2lnbmFsKTsKKwlzcGluX3VubG9jayhsb2NrKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCittb2R1bGVfaW5pdChjaGFubmVsX21vZF9pbml0KTsKK21vZHVsZV9leGl0KGNoYW5uZWxfbW9kX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJCcnlhbiBHbGF1ZGVsIik7CitNT0RVTEVfQUxJQVMoInVpc2NoYW4iKTsKKwkvKiB0aGlzIGlzIGV4dHJhY3RlZCBkdXJpbmcgZGVwbW9kIGFuZCBrZXB0IGluIG1vZHVsZXMuZGVwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NoYW5uZWxzL2NoYW5zdHViLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NoYW5uZWxzL2NoYW5zdHViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3MjdkZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvY2hhbnN0dWIuaApAQCAtMCwwICsxLDIzIEBACisvKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19DSEFOU1RVQl9IX18KKyNkZWZpbmUgX19DSEFOU1RVQl9IX18KK3Vuc2lnbmVkIGNoYXIgU2lnbmFsSW5zZXJ0X3dpdGhMb2NrKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsLCBVMzIgUXVldWUsCisJCQkJICAgICB2b2lkICpwU2lnbmFsLCBzcGlubG9ja190ICpsb2NrKTsKK3Vuc2lnbmVkIGNoYXIgU2lnbmFsUmVtb3ZlX3dpdGhMb2NrKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsLCBVMzIgUXVldWUsCisJCQkJICAgICB2b2lkICpwU2lnbmFsLCBzcGlubG9ja190ICpsb2NrKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvY2hhbm5lbC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2NoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWUyMDQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2NoYW5uZWwuaApAQCAtMCwwICsxLDY2MSBAQAorLyogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQ0hBTk5FTF9IX18KKyNkZWZpbmUgX19DSEFOTkVMX0hfXworCisvKgorKiBXaGVuZXZlciB0aGlzIGZpbGUgaXMgY2hhbmdlZCBhIGNvcnJlc3BvbmRpbmcgY2hhbmdlIG11c3QgYmUgbWFkZSBpbgorKiB0aGUgQ29uc29sZS9TZXJ2aWNlUGFydC92aXNvcmRpYWdfZWFybHkvc3VwZXJ2aXNvcl9jaGFubmVsLmggZmlsZQorKiB3aGljaCBpcyBuZWVkZWQgZm9yIExpbnV4IGtlcm5lbCBjb21waWxlcy4gVGhlc2UgdHdvIGZpbGVzIG11c3QgYmUKKyogaW4gc3luYy4KKyovCisKKy8qIGRlZmluZSB0aGUgZm9sbG93aW5nIHRvIHByZXZlbnQgaW5jbHVkZSBuZXN0aW5nIGluIGtlcm5lbCBoZWFkZXIKKyAqIGZpbGVzIG9mIHNpbWlsYXIgYWJyZXZpYXRlZCBjb250ZW50CisgKi8KKyNkZWZpbmUgX19TVVBFUlZJU09SX0NIQU5ORUxfSF9fCisKKyNpbmNsdWRlICJjb21tb250eXBlcy5oIgorCisjZGVmaW5lIFNJR05BVFVSRV8xNihBLCBCKSAoKEEpIHwgKEI8PDgpKQorI2RlZmluZSBTSUdOQVRVUkVfMzIoQSwgQiwgQywgRCkgXAorCShTSUdOQVRVUkVfMTYoQSwgQikgfCAoU0lHTkFUVVJFXzE2KEMsIEQpIDw8IDE2KSkKKyNkZWZpbmUgU0lHTkFUVVJFXzY0KEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgpIFwKKwkoU0lHTkFUVVJFXzMyKEEsIEIsIEMsIEQpIHwgKChVNjQpKFNJR05BVFVSRV8zMihFLCBGLCBHLCBIKSkgPDwgMzIpKQorCisjaWZuZGVmIGxlbmd0aG9mCisjZGVmaW5lIGxlbmd0aG9mKFRZUEUsIE1FTUJFUikgKHNpemVvZigoKFRZUEUgKikwKS0+TUVNQkVSKSkKKyNlbmRpZgorI2lmbmRlZiBDT1ZFUlEKKyNkZWZpbmUgQ09WRVJRKHYsIGQpICAoKCh2KSsoZCktMSkgLyAoZCkpCisjZW5kaWYKKyNpZm5kZWYgQ09WRVIKKyNkZWZpbmUgQ09WRVIodiwgZCkgICAoKGQpKkNPVkVSUSh2LCBkKSkKKyNlbmRpZgorCisjaWZuZGVmIEdVSUQwCisjZGVmaW5lIEdVSUQwIHswLCAwLCAwLCB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0gfQorI2VuZGlmCisKKy8qICBUaGUgQyBsYW5ndWFnZSBpcyBpbmNvbnNpc3RlbnQgd2l0aCByZXNwZWN0IHRvIHdoZXJlIGl0IGFsbG93cyBsaXRlcmFsCisgKiAgY29uc3RhbnRzLCBlc3BlY2lhbGx5IGxpdGVyYWwgY29uc3RhbnQgc3RydWN0cy4gIExpdGVyYWwgY29uc3RhbnQgc3RydWN0cworICogIGFyZSBhbGxvd2VkIGZvciBpbml0aWFsaXphdGlvbiBvbmx5LCB3aGVyZWFzIG90aGVyIHR5cGVzIG9mIGxpdGVyYWwKKyAqICBjb25zdGFudHMgYXJlIGFsbG93ZWQgYW55d2hlcmUuICBXZSBnZXQgYXJvdW5kIHRoaXMgaW5jb25zaXN0ZW5jeSBieQorICogIGRlY2xhcmluZyBhICJzdGF0aWMgY29uc3QiIHZhcmlhYmxlIGZvciBlYWNoIEdVSUQuICBUaGlzIHZhcmlhYmxlIGNhbiBiZQorICogIHVzZWQgaW4gZXhwcmVzc2lvbnMgd2hlcmUgdGhlIGxpdGVyYWwgY29uc3RhbnQgd291bGQgbm90IGJlIGFsbG93ZWQuCisgKi8KK3N0YXRpYyBjb25zdCBHVUlEIEd1aWQwID0gR1VJRDA7CisKKyNkZWZpbmUgVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUgIFNJR05BVFVSRV8zMignRScsICdDJywgJ04nLCAnTCcpCisKK3R5cGVkZWYgZW51bSB7CisJQ0hBTk5FTFNSVl9VTklOSVRJQUxJWkVEID0gMCwJLyogY2hhbm5lbCBpcyBpbiBhbiB1bmRlZmluZWQgc3RhdGUgKi8KKwlDSEFOTkVMU1JWX1JFQURZID0gMQkvKiBjaGFubmVsIGhhcyBiZWVuIGluaXRpYWxpemVkIGJ5IHNlcnZlciAqLworfSBDSEFOTkVMX1NFUlZFUlNUQVRFOworCit0eXBlZGVmIGVudW0geworCUNIQU5ORUxDTElfREVUQUNIRUQgPSAwLAorCUNIQU5ORUxDTElfRElTQUJMRUQgPSAxLAkvKiBjbGllbnQgY2FuIHNlZSBjaGFubmVsIGJ1dCBpcyBOT1QKKwkJCQkJICogYWxsb3dlZCB0byB1c2UgaXQgdW5sZXNzIGdpdmVuIFRCRAorCQkJCQkgKiBleHBsaWNpdCByZXF1ZXN0IChzaG91bGQgYWN0dWFsbHkgYmUKKwkJCQkJICogPCBERVRBQ0hFRCkgKi8KKwlDSEFOTkVMQ0xJX0FUVEFDSElORyA9IDIsCS8qIGxlZ2FjeSBFRkkgY2xpZW50IHJlcXVlc3QKKwkJCQkJICogZm9yIEVGSSBzZXJ2ZXIgdG8gYXR0YWNoICovCisJQ0hBTk5FTENMSV9BVFRBQ0hFRCA9IDMsCS8qIGlkbGUsIGJ1dCBjbGllbnQgbWF5IHdhbnQKKwkJCQkJICogdG8gdXNlIGNoYW5uZWwgYW55IHRpbWUgKi8KKwlDSEFOTkVMQ0xJX0JVU1kgPSA0LAkvKiBjbGllbnQgZWl0aGVyIHdhbnRzIHRvIHVzZSBvciBpcworCQkJCSAqIHVzaW5nIGNoYW5uZWwgKi8KKwlDSEFOTkVMQ0xJX09XTkVEID0gNQkvKiAibm8gd29ycmllcyIgc3RhdGUgLSBjbGllbnQgY2FuCisJCQkJICogYWNjZXNzIGNoYW5uZWwgYW55dGltZSAqLworfSBDSEFOTkVMX0NMSUVOVFNUQVRFOworc3RhdGljIGlubGluZSBjb25zdCBVOCAqCitVTFRSQV9DSEFOTkVMQ0xJX1NUUklORyhVMzIgdikKK3sKKwlzd2l0Y2ggKHYpIHsKKwljYXNlIENIQU5ORUxDTElfREVUQUNIRUQ6CisJCXJldHVybiAoY29uc3QgVTggKikgKCJERVRBQ0hFRCIpOworCWNhc2UgQ0hBTk5FTENMSV9ESVNBQkxFRDoKKwkJcmV0dXJuIChjb25zdCBVOCAqKSAoIkRJU0FCTEVEIik7CisJY2FzZSBDSEFOTkVMQ0xJX0FUVEFDSElORzoKKwkJcmV0dXJuIChjb25zdCBVOCAqKSAoIkFUVEFDSElORyIpOworCWNhc2UgQ0hBTk5FTENMSV9BVFRBQ0hFRDoKKwkJcmV0dXJuIChjb25zdCBVOCAqKSAoIkFUVEFDSEVEIik7CisJY2FzZSBDSEFOTkVMQ0xJX0JVU1k6CisJCXJldHVybiAoY29uc3QgVTggKikgKCJCVVNZIik7CisJY2FzZSBDSEFOTkVMQ0xJX09XTkVEOgorCQlyZXR1cm4gKGNvbnN0IFU4ICopICgiT1dORUQiKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIChjb25zdCBVOCAqKSAoIj8iKTsKK30KKworI2RlZmluZSBVTFRSQV9DSEFOTkVMU1JWX0lTX1JFQURZKHgpICAgICAoKHgpID09IENIQU5ORUxTUlZfUkVBRFkpCisjZGVmaW5lIFVMVFJBX0NIQU5ORUxfU0VSVkVSX1JFQURZKHBDaGFubmVsKSBcCisJKFVMVFJBX0NIQU5ORUxTUlZfSVNfUkVBRFkocmVhZGwoJihwQ2hhbm5lbCktPlNydlN0YXRlKSkpCisKKyNkZWZpbmUgVUxUUkFfVkFMSURfQ0hBTk5FTENMSV9UUkFOU0lUSU9OKG8sIG4pCQkJCVwKKwkoKCgoKG8pID09IENIQU5ORUxDTElfREVUQUNIRUQpICYmICgobikgPT0gQ0hBTk5FTENMSV9ESVNBQkxFRCkpIHx8IFwKKwkgICgoKG8pID09IENIQU5ORUxDTElfQVRUQUNISU5HKSAmJiAoKG4pID09IENIQU5ORUxDTElfRElTQUJMRUQpKSB8fCBcCisJICAoKChvKSA9PSBDSEFOTkVMQ0xJX0FUVEFDSEVEKSAmJiAoKG4pID09IENIQU5ORUxDTElfRElTQUJMRUQpKSB8fCBcCisJICAoKChvKSA9PSBDSEFOTkVMQ0xJX0FUVEFDSElORykgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX0RFVEFDSEVEKSkgfHwgXAorCSAgKCgobykgPT0gQ0hBTk5FTENMSV9BVFRBQ0hFRCkgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX0RFVEFDSEVEKSkgfHwgXAorCSAgKCgobykgPT0gQ0hBTk5FTENMSV9ERVRBQ0hFRCkgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX0FUVEFDSElORykpIHx8IFwKKwkgICgoKG8pID09IENIQU5ORUxDTElfQVRUQUNISU5HKSAmJiAoKG4pID09IENIQU5ORUxDTElfQVRUQUNIRUQpKSB8fCBcCisJICAoKChvKSA9PSBDSEFOTkVMQ0xJX0RFVEFDSEVEKSAmJiAoKG4pID09IENIQU5ORUxDTElfQVRUQUNIRUQpKSB8fCBcCisJICAoKChvKSA9PSBDSEFOTkVMQ0xJX0JVU1kpICYmICgobikgPT0gQ0hBTk5FTENMSV9BVFRBQ0hFRCkpIHx8CVwKKwkgICgoKG8pID09IENIQU5ORUxDTElfQVRUQUNIRUQpICYmICgobikgPT0gQ0hBTk5FTENMSV9CVVNZKSkgfHwJXAorCSAgKCgobykgPT0gQ0hBTk5FTENMSV9ERVRBQ0hFRCkgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX09XTkVEKSkgfHwgXAorCSAgKCgobykgPT0gQ0hBTk5FTENMSV9ESVNBQkxFRCkgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX09XTkVEKSkgfHwgXAorCSAgKCgobykgPT0gQ0hBTk5FTENMSV9BVFRBQ0hJTkcpICYmICgobikgPT0gQ0hBTk5FTENMSV9PV05FRCkpIHx8IFwKKwkgICgoKG8pID09IENIQU5ORUxDTElfQVRUQUNIRUQpICYmICgobikgPT0gQ0hBTk5FTENMSV9PV05FRCkpIHx8IFwKKwkgICgoKG8pID09IENIQU5ORUxDTElfQlVTWSkgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX09XTkVEKSkgfHwgKDApKSBcCisJID8gKDEpIDogKDApKQorCisjZGVmaW5lIFVMVFJBX0NIQU5ORUxfQ0xJRU5UX0NIS19UUkFOU0lUSU9OKG9sZCwgbmV3LCBjaGFuSWQsIGxvZ0N0eCwJXAorCQkJCQkgICAgZmlsZSwgbGluZSkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAoIVVMVFJBX1ZBTElEX0NIQU5ORUxDTElfVFJBTlNJVElPTihvbGQsIG5ldykpCVwKKwkJCVVsdHJhTG9nRXZlbnQobG9nQ3R4LAkJCQlcCisJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfRVZFTlRJRF9UUkFOU0lURVJSLCBcCisJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU0VWRVJJVFksIFwKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TVUJTWVMsCQlcCisJCQkJICAgICAgX19mdW5jX18sIF9fTElORV9fLAkJXAorCQkJCSAgICAgICIlcyBDaGFubmVsIFN0YXRlVHJhbnNpdGlvbiBJTlZBTElEISAoJXMpICVzKCVkKS0tPiVzKCVkKSBAJXM6JWRcbiIsIFwKKwkJCQkgICAgICBjaGFuSWQsICJDbGlTdGF0ZTx4PiIsCQlcCisJCQkJICAgICAgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcob2xkKSwJXAorCQkJCSAgICAgIG9sZCwJCQkJXAorCQkJCSAgICAgIFVMVFJBX0NIQU5ORUxDTElfU1RSSU5HKG5ldyksCVwKKwkJCQkgICAgICBuZXcsCQkJCVwKKwkJCQkgICAgICBQYXRoTmFtZV9MYXN0X05fTm9kZXMoKFU4ICopZmlsZSwgNCksIFwKKwkJCQkgICAgICBsaW5lKTsJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgVUxUUkFfQ0hBTk5FTF9DTElFTlRfVFJBTlNJVElPTihwQ2hhbiwgY2hhbklkLAkJCVwKKwkJCQkJbmV3c3RhdGUsIGxvZ0N0eCkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCVVMVFJBX0NIQU5ORUxfQ0xJRU5UX0NIS19UUkFOU0lUSU9OKAkJCVwKKwkJCXJlYWRsKCYoKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopIFwKKwkJCQkgKHBDaGFuKSktPkNsaVN0YXRlT1MpKSwJCVwKKwkJCW5ld3N0YXRlLAkJCQkJXAorCQkJY2hhbklkLCBsb2dDdHgsIF9fRklMRV9fLCBfX0xJTkVfXyk7CQlcCisJCVVsdHJhTG9nRXZlbnQobG9nQ3R4LCBDSEFOTkVMU1RBVEVfRElBR19FVkVOVElEX1RSQU5TSVRPSywgXAorCQkJQ0hBTk5FTFNUQVRFX0RJQUdfU0VWRVJJVFksIFwKKwkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NVQlNZUywJCQlcCisJCQkgICAgICBfX2Z1bmNfXywgX19MSU5FX18sCQkJXAorCQkJICAgICAgIiVzIENoYW5uZWwgU3RhdGVUcmFuc2l0aW9uICglcykgJXMoJWQpLS0+JXMoJWQpIEAlczolZFxuIiwgXAorCQkJICAgICAgY2hhbklkLCAiQ2xpU3RhdGVPUyIsCQkJXAorCQkJICAgICAgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcoIFwKKwkJCQkgICAgICByZWFkbCgmKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopIFwKKwkJCQkJICAgICAgKHBDaGFuKSktPkNsaVN0YXRlT1MpKSwJXAorCQkJICAgICAgcmVhZGwoJigoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqKSBcCisJCQkJICAgICAgKHBDaGFuKSktPkNsaVN0YXRlT1MpLAkJXAorCQkJICAgICAgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcobmV3c3RhdGUpLAlcCisJCQkgICAgICBuZXdzdGF0ZSwJCQkJCVwKKwkJCSAgICAgIFBhdGhOYW1lX0xhc3RfTl9Ob2RlcyhfX0ZJTEVfXywgNCksIF9fTElORV9fKTsgXAorCQl3cml0ZWwobmV3c3RhdGUsICYoKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKikgXAorCQkJCSAgIChwQ2hhbikpLT5DbGlTdGF0ZU9TKTsJCVwKKwkJTUVNT1JZQkFSUklFUjsJCQkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBVTFRSQV9DSEFOTkVMX0NMSUVOVF9BQ1FVSVJFX09TKHBDaGFuLCBjaGFuSWQsIGxvZ0N0eCkJXAorCVVMVFJBX2NoYW5uZWxfY2xpZW50X2FjcXVpcmVfb3MocENoYW4sIGNoYW5JZCwgbG9nQ3R4LAkJXAorCQkJCQkoY2hhciAqKV9fRklMRV9fLCBfX0xJTkVfXywJXAorCQkJCQkoY2hhciAqKV9fZnVuY19fKQorI2RlZmluZSBVTFRSQV9DSEFOTkVMX0NMSUVOVF9SRUxFQVNFX09TKHBDaGFuLCBjaGFuSWQsIGxvZ0N0eCkJXAorCVVMVFJBX2NoYW5uZWxfY2xpZW50X3JlbGVhc2Vfb3MocENoYW4sIGNoYW5JZCwgbG9nQ3R4LAlcCisJCShjaGFyICopX19GSUxFX18sIF9fTElORV9fLCAoY2hhciAqKV9fZnVuY19fKQorCisvKiBWYWx1ZXMgZm9yIFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wuQ2xpRXJyb3JCb290OiAqLworLyogdGhyb3R0bGluZyBpbnZhbGlkIGJvb3QgY2hhbm5lbCBzdGF0ZXRyYW5zaXRpb24gZXJyb3IgZHVlIHRvIGNsaWVudAorICogZGlzYWJsZWQgKi8KKyNkZWZpbmUgVUxUUkFfQ0xJRVJST1JCT09UX1RIUk9UVExFTVNHX0RJU0FCTEVEICAgIDB4MDEKKworLyogdGhyb3R0bGluZyBpbnZhbGlkIGJvb3QgY2hhbm5lbCBzdGF0ZXRyYW5zaXRpb24gZXJyb3IgZHVlIHRvIGNsaWVudAorICogbm90IGF0dGFjaGVkICovCisjZGVmaW5lIFVMVFJBX0NMSUVSUk9SQk9PVF9USFJPVFRMRU1TR19OT1RBVFRBQ0hFRCAweDAyCisKKy8qIHRocm90dGxpbmcgaW52YWxpZCBib290IGNoYW5uZWwgc3RhdGV0cmFuc2l0aW9uIGVycm9yIGR1ZSB0byBidXN5IGNoYW5uZWwgKi8KKyNkZWZpbmUgVUxUUkFfQ0xJRVJST1JCT09UX1RIUk9UVExFTVNHX0JVU1kgICAgICAgIDB4MDQKKworLyogVmFsdWVzIGZvciBVTFRSQV9DSEFOTkVMX1BST1RPQ09MLkNsaUVycm9yT1M6ICovCisvKiB0aHJvdHRsaW5nIGludmFsaWQgZ3Vlc3QgT1MgY2hhbm5lbCBzdGF0ZXRyYW5zaXRpb24gZXJyb3IgZHVlIHRvCisgKiBjbGllbnQgZGlzYWJsZWQgKi8KKyNkZWZpbmUgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19ESVNBQkxFRCAgICAgIDB4MDEKKworLyogdGhyb3R0bGluZyBpbnZhbGlkIGd1ZXN0IE9TIGNoYW5uZWwgc3RhdGV0cmFuc2l0aW9uIGVycm9yIGR1ZSB0bworICogY2xpZW50IG5vdCBhdHRhY2hlZCAqLworI2RlZmluZSBVTFRSQV9DTElFUlJPUk9TX1RIUk9UVExFTVNHX05PVEFUVEFDSEVEICAgMHgwMgorCisvKiB0aHJvdHRsaW5nIGludmFsaWQgZ3Vlc3QgT1MgY2hhbm5lbCBzdGF0ZXRyYW5zaXRpb24gZXJyb3IgZHVlIHRvCisgKiBidXN5IGNoYW5uZWwgKi8KKyNkZWZpbmUgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19CVVNZICAgICAgICAgIDB4MDQKKworLyogVmFsdWVzIGZvciBVTFRSQV9DSEFOTkVMX1BST1RPQ09MLkZlYXR1cmVzOiBUaGlzIGRlZmluZSBleGlzdHMgc28KKyogdGhhdCB3aW5kb3dzIGd1ZXN0IGNhbiBsb29rIGF0IHRoZSBGZWF0dXJlRmxhZ3MgaW4gdGhlIGlvIGNoYW5uZWwsCisqIGFuZCBjb25maWd1cmUgdGhlIHdpbmRvd3MgZHJpdmVyIHRvIHVzZSBpbnRlcnJ1cHRzIG9yIG5vdCBiYXNlZCBvbgorKiB0aGlzIHNldHRpbmcuICBUaGlzIGZsYWcgaXMgc2V0IGluIHVpc2xpYiBhZnRlciB0aGUKKyogVUxUUkFfVkhCQV9pbml0X2NoYW5uZWwgaXMgY2FsbGVkLiAgQWxsIGZlYXR1cmUgYml0cyBmb3IgYWxsCisqIGNoYW5uZWxzIHNob3VsZCBiZSBkZWZpbmVkIGhlcmUuICBUaGUgaW8gY2hhbm5lbCBmZWF0dXJlIGJpdHMgYXJlCisqIGRlZmluZWQgcmlnaHQgaGVyZSAqLworI2RlZmluZSBVTFRSQV9JT19EUklWRVJfRU5BQkxFU19JTlRTICgweDFVTEwgPDwgMSkKKyNkZWZpbmUgVUxUUkFfSU9fQ0hBTk5FTF9JU19QT0xMSU5HICgweDFVTEwgPDwgMykKKyNkZWZpbmUgVUxUUkFfSU9fSU9WTV9JU19PS19XSVRIX0RSSVZFUl9ESVNBQkxJTkdfSU5UUyAoMHgxVUxMIDw8IDQpCisjZGVmaW5lIFVMVFJBX0lPX0RSSVZFUl9ESVNBQkxFU19JTlRTICgweDFVTEwgPDwgNSkKKyNkZWZpbmUgVUxUUkFfSU9fRFJJVkVSX1NVUFBPUlRTX0VOSEFOQ0VEX1JDVkJVRl9DSEVDS0lORyAoMHgxVUxMIDw8IDYpCisKKyNwcmFnbWEgcGFjayhwdXNoLCAxKQkJLyogYm90aCBHQ0MgYW5kIFZDIG5vdyBhbGxvdyB0aGlzIHByYWdtYSAqLworLyogQ29tbW9uIENoYW5uZWwgSGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCBfQ0hBTk5FTF9IRUFERVIgeworCVU2NCBTaWduYXR1cmU7CQkvKiBTaWduYXR1cmUgKi8KKwlVMzIgTGVnYWN5U3RhdGU7CS8qIERFUFJFQ0FURUQgLSBiZWluZyByZXBsYWNlZCBieSAqLworCS8qIC8gICAgICAgICAgICAgIFNydlN0YXRlLCBDbGlTdGF0ZUJvb3QsIGFuZCBDbGlTdGF0ZU9TIGJlbG93ICovCisJVTMyIEhlYWRlclNpemU7CQkvKiBzaXplb2YoQ0hBTk5FTF9IRUFERVIpICovCisJVTY0IFNpemU7CQkvKiBUb3RhbCBzaXplIG9mIHRoaXMgY2hhbm5lbCBpbiBieXRlcyAqLworCVU2NCBGZWF0dXJlczsJCS8qIEZsYWdzIHRvIG1vZGlmeSBiZWhhdmlvciAqLworCUdVSUQgVHlwZTsJCS8qIENoYW5uZWwgdHlwZTogZGF0YSwgYnVzLCBjb250cm9sLCBldGMuICovCisJVTY0IFBhcnRpdGlvbkhhbmRsZTsJLyogSUQgb2YgZ3Vlc3QgcGFydGl0aW9uICovCisJVTY0IEhhbmRsZTsJCS8qIERldmljZSBudW1iZXIgb2YgdGhpcyBjaGFubmVsIGluIGNsaWVudCAqLworCVU2NCBvQ2hhbm5lbFNwYWNlOwkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gY2hhbm5lbCBzcGVjaWZpYyBhcmVhICovCisJVTMyIFZlcnNpb25JZDsJCS8qIENIQU5ORUxfSEVBREVSIFZlcnNpb24gSUQgKi8KKwlVMzIgUGFydGl0aW9uSW5kZXg7CS8qIEluZGV4IG9mIGd1ZXN0IHBhcnRpdGlvbiAqLworCUdVSUQgWm9uZUd1aWQ7CQkvKiBHdWlkIG9mIENoYW5uZWwncyB6b25lICovCisJVTMyIG9DbGllbnRTdHJpbmc7CS8qIG9mZnNldCBmcm9tIGNoYW5uZWwgaGVhZGVyIHRvCisJCQkJICogbnVsLXRlcm1pbmF0ZWQgQ2xpZW50U3RyaW5nICgwIGlmCisJCQkJICogQ2xpZW50U3RyaW5nIG5vdCBwcmVzZW50KSAqLworCVUzMiBDbGlTdGF0ZUJvb3Q7CS8qIENIQU5ORUxfQ0xJRU5UU1RBVEUgb2YgcHJlLWJvb3QKKwkJCQkgKiBFRkkgY2xpZW50IG9mIHRoaXMgY2hhbm5lbCAqLworCVUzMiBDbWRTdGF0ZUNsaTsJLyogQ0hBTk5FTF9DT01NQU5EU1RBVEUgKG92ZXJsb2FkZWQgaW4KKwkJCQkgKiBXaW5kb3dzIGRyaXZlcnMsIHNlZSBTZXJ2ZXJTdGF0ZVVwLAorCQkJCSAqIFNlcnZlclN0YXRlRG93biwgZXRjKSAqLworCVUzMiBDbGlTdGF0ZU9TOwkJLyogQ0hBTk5FTF9DTElFTlRTVEFURSBvZiBHdWVzdCBPUworCQkJCSAqIGNsaWVudCBvZiB0aGlzIGNoYW5uZWwgKi8KKwlVMzIgQ2hhbm5lbENoYXJhY3RlcmlzdGljczsJLyogQ0hBTk5FTF9DSEFSQUNURVJJU1RJQ188eHh4PiAqLworCVUzMiBDbWRTdGF0ZVNydjsJLyogQ0hBTk5FTF9DT01NQU5EU1RBVEUgKG92ZXJsb2FkZWQgaW4KKwkJCQkgKiBXaW5kb3dzIGRyaXZlcnMsIHNlZSBTZXJ2ZXJTdGF0ZVVwLAorCQkJCSAqIFNlcnZlclN0YXRlRG93biwgZXRjKSAqLworCVUzMiBTcnZTdGF0ZTsJCS8qIENIQU5ORUxfU0VSVkVSU1RBVEUgKi8KKwlVOCBDbGlFcnJvckJvb3Q7CS8qIGJpdHMgdG8gaW5kaWNhdGUgZXJyIHN0YXRlcyBmb3IKKwkJCQkgKiBib290IGNsaWVudHMsIHNvIGVyciBtZXNzYWdlcyBjYW4KKwkJCQkgKiBiZSB0aHJvdHRsZWQgKi8KKwlVOCBDbGlFcnJvck9TOwkJLyogYml0cyB0byBpbmRpY2F0ZSBlcnIgc3RhdGVzIGZvciBPUworCQkJCSAqIGNsaWVudHMsIHNvIGVyciBtZXNzYWdlcyBjYW4gYmUKKwkJCQkgKiB0aHJvdHRsZWQgKi8KKwlVOCBGaWxsZXJbMV07CQkvKiBQYWQgb3V0IHRvIDEyOCBieXRlIGNhY2hlbGluZSAqLworCS8qIFBsZWFzZSBhZGQgYWxsIG5ldyBzaW5nbGUtYnl0ZSB2YWx1ZXMgYmVsb3cgaGVyZSAqLworCVU4IFJlY292ZXJDaGFubmVsOworfSBDSEFOTkVMX0hFQURFUiwgKnBDSEFOTkVMX0hFQURFUiwgVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTDsKKworI2RlZmluZSBVTFRSQV9DSEFOTkVMX0VOQUJMRV9JTlRTICgweDFVTEwgPDwgMCkKKworLyogU3ViaGVhZGVyIGZvciB0aGUgU2lnbmFsIFR5cGUgdmFyaWF0aW9uIG9mIHRoZSBDb21tb24gQ2hhbm5lbCAqLwordHlwZWRlZiBzdHJ1Y3QgX1NJR05BTF9RVUVVRV9IRUFERVIgeworCS8qIDFzdCBjYWNoZSBsaW5lICovCisJVTMyIFZlcnNpb25JZDsJCS8qIFNJR05BTF9RVUVVRV9IRUFERVIgVmVyc2lvbiBJRCAqLworCVUzMiBUeXBlOwkJLyogUXVldWUgdHlwZTogc3RvcmFnZSwgbmV0d29yayAqLworCVU2NCBTaXplOwkJLyogVG90YWwgc2l6ZSBvZiB0aGlzIHF1ZXVlIGluIGJ5dGVzICovCisJVTY0IG9TaWduYWxCYXNlOwkvKiBPZmZzZXQgdG8gc2lnbmFsIHF1ZXVlIGFyZWEgKi8KKwlVNjQgRmVhdHVyZUZsYWdzOwkvKiBGbGFncyB0byBtb2RpZnkgYmVoYXZpb3IgKi8KKwlVNjQgTnVtU2lnbmFsc1NlbnQ7CS8qIFRvdGFsICMgb2Ygc2lnbmFscyBwbGFjZWQgaW4gdGhpcyBxdWV1ZSAqLworCVU2NCBOdW1PdmVyZmxvd3M7CS8qIFRvdGFsICMgb2YgaW5zZXJ0cyBmYWlsZWQgZHVlIHRvCisJCQkJICogZnVsbCBxdWV1ZSAqLworCVUzMiBTaWduYWxTaXplOwkJLyogVG90YWwgc2l6ZSBvZiBhIHNpZ25hbCBmb3IgdGhpcyBxdWV1ZSAqLworCVUzMiBNYXhTaWduYWxTbG90czsJLyogTWF4ICMgb2Ygc2xvdHMgaW4gcXVldWUsIDEgc2xvdCBpcworCQkJCSAqIGFsd2F5cyBlbXB0eSAqLworCVUzMiBNYXhTaWduYWxzOwkJLyogTWF4ICMgb2Ygc2lnbmFscyBpbiBxdWV1ZQorCQkJCSAqIChNYXhTaWduYWxTbG90cy0xKSAqLworCVUzMiBIZWFkOwkJLyogUXVldWUgaGVhZCBzaWduYWwgIyAqLworCS8qIDJuZCBjYWNoZSBsaW5lICovCisJVTY0IE51bVNpZ25hbHNSZWNlaXZlZDsJLyogVG90YWwgIyBvZiBzaWduYWxzIHJlbW92ZWQgZnJvbSB0aGlzIHF1ZXVlICovCisJVTMyIFRhaWw7CQkvKiBRdWV1ZSB0YWlsIHNpZ25hbCAjIChvbiBzZXBhcmF0ZQorCQkJCSAqIGNhY2hlIGxpbmUpICovCisJVTMyIFJlc2VydmVkMTsJCS8qIFJlc2VydmVkIGZpZWxkICovCisJVTY0IFJlc2VydmVkMjsJCS8qIFJlc3J2ZWQgZmllbGQgKi8KKwlVNjQgQ2xpZW50UXVldWU7CisJVTY0IE51bUludGVycnVwdHNSZWNlaXZlZDsJLyogVG90YWwgIyBvZiBJbnRlcnJ1cHRzIHJlY2VpdmVkLiAgVGhpcworCQkJCQkgKiBpcyBpbmNyZW1lbnRlZCBieSB0aGUgSVNSIGluIHRoZQorCQkJCQkgKiBndWVzdCB3aW5kb3dzIGRyaXZlciAqLworCVU2NCBOdW1FbXB0eUNudDsJLyogTnVtYmVyIG9mIHRpbWVzIHRoYXQgdmlzb3Jfc2lnbmFsX3JlbW92ZQorCQkJCSAqIGlzIGNhbGxlZCBhbmQgcmV0dXJuZWQgRW1wdHkKKwkJCQkgKiBTdGF0dXMuICovCisJVTMyIEVycm9yRmxhZ3M7CQkvKiBFcnJvciBiaXRzIHNldCBkdXJpbmcgU2lnbmFsUmVpbml0CisJCQkJICogdG8gZGVub3RlIHRyb3VibGUgd2l0aCBjbGllbnQncworCQkJCSAqIGZpZWxkcyAqLworCVU4IEZpbGxlclsxMl07CQkvKiBQYWQgb3V0IHRvIDY0IGJ5dGUgY2FjaGVsaW5lICovCit9IFNJR05BTF9RVUVVRV9IRUFERVIsICpwU0lHTkFMX1FVRVVFX0hFQURFUjsKKworI3ByYWdtYSBwYWNrKHBvcCkKKworI2RlZmluZSBTaWduYWxJbml0KGNoYW4sIFFIRFJGTEQsIFFEQVRBRkxELCBRREFUQVRZUEUsIHZlciwgdHlwKQlcCisJZG8gewkJCQkJCQkJXAorCQlNRU1TRVQoJmNoYW4tPlFIRFJGTEQsIDAsIHNpemVvZihjaGFuLT5RSERSRkxEKSk7CVwKKwkJY2hhbi0+UUhEUkZMRC5WZXJzaW9uSWQgPSB2ZXI7CQkJCVwKKwkJY2hhbi0+UUhEUkZMRC5UeXBlID0gdHlwOwkJCQlcCisJCWNoYW4tPlFIRFJGTEQuU2l6ZSA9IHNpemVvZihjaGFuLT5RREFUQUZMRCk7CQlcCisJCWNoYW4tPlFIRFJGTEQuU2lnbmFsU2l6ZSA9IHNpemVvZihRREFUQVRZUEUpOwkJXAorCQljaGFuLT5RSERSRkxELm9TaWduYWxCYXNlID0gKFVJTlROKShjaGFuLT5RREFUQUZMRCktCVwKKwkJCShVSU5UTikoJmNoYW4tPlFIRFJGTEQpOwkJCVwKKwkJY2hhbi0+UUhEUkZMRC5NYXhTaWduYWxTbG90cyA9CQkJCVwKKwkJCXNpemVvZihjaGFuLT5RREFUQUZMRCkvc2l6ZW9mKFFEQVRBVFlQRSk7CVwKKwkJY2hhbi0+UUhEUkZMRC5NYXhTaWduYWxzID0gY2hhbi0+UUhEUkZMRC5NYXhTaWduYWxTbG90cy0xOyBcCisJfSB3aGlsZSAoMCkKKworLyogR2VuZXJpYyBmdW5jdGlvbiB1c2VmdWwgZm9yIHZhbGlkYXRpbmcgYW55IHR5cGUgb2YgY2hhbm5lbCB3aGVuIGl0IGlzCisgKiByZWNlaXZlZCBieSB0aGUgY2xpZW50IHRoYXQgd2lsbCBiZSBhY2Nlc3NpbmcgdGhlIGNoYW5uZWwuCisgKiBOb3RlIHRoYXQgPGxvZ0N0eD4gaXMgb25seSBuZWVkZWQgZm9yIGNhbGxlcnMgaW4gdGhlIEVGSSBlbnZpcm9ubWVudCwgYW5kCisgKiBpcyB1c2VkIHRvIHBhc3MgdGhlIEVGSV9ESUFHX0NBUFRVUkVfUFJPVE9DT0wgbmVlZGVkIHRvIGxvZyBtZXNzYWdlcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK1VMVFJBX2NoZWNrX2NoYW5uZWxfY2xpZW50KHZvaWQgX19pb21lbSAqcENoYW5uZWwsCisJCQkgICBHVUlEIGV4cGVjdGVkVHlwZUd1aWQsCisJCQkgICBjaGFyICpjaGFubmVsTmFtZSwKKwkJCSAgIFU2NCBleHBlY3RlZE1pbkJ5dGVzLAorCQkJICAgVTMyIGV4cGVjdGVkVmVyc2lvbklkLAorCQkJICAgVTY0IGV4cGVjdGVkU2lnbmF0dXJlLAorCQkJICAgY2hhciAqZmlsZU5hbWUsIGludCBsaW5lTnVtYmVyLCB2b2lkICpsb2dDdHgpCit7CisJaWYgKE1FTUNNUCgmZXhwZWN0ZWRUeXBlR3VpZCwgJkd1aWQwLCBzaXplb2YoR1VJRCkpICE9IDApCisJCS8qIGNhbGxlciB3YW50cyB1cyB0byB2ZXJpZnkgdHlwZSBHVUlEICovCisJCWlmIChNRU1DTVBfSU8oJigoKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKikgKHBDaGFubmVsKSktPlR5cGUpLAorCQkJICAgJmV4cGVjdGVkVHlwZUd1aWQsIHNpemVvZihHVUlEKSkgIT0gMCkgeworCQkJQ0hBTk5FTF9HVUlEX01JU01BVENIKGV4cGVjdGVkVHlwZUd1aWQsIGNoYW5uZWxOYW1lLAorCQkJCQkgICAgICAidHlwZSIsIGV4cGVjdGVkVHlwZUd1aWQsCisJCQkJCSAgICAgICgoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqKQorCQkJCQkgICAgICAgKHBDaGFubmVsKSktPlR5cGUsIGZpbGVOYW1lLAorCQkJCQkgICAgICBsaW5lTnVtYmVyLCBsb2dDdHgpOworCQkJcmV0dXJuIDA7CisJCX0KKwlpZiAoZXhwZWN0ZWRNaW5CeXRlcyA+IDApCS8qIGNhbGxlciB3YW50cyB1cyB0byB2ZXJpZnkKKwkJCQkJICogY2hhbm5lbCBzaXplICovCisJCWlmIChyZWFkcSgmKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopCisJCQkgICAocENoYW5uZWwpKS0+U2l6ZSkgPCBleHBlY3RlZE1pbkJ5dGVzKSB7CisJCQlDSEFOTkVMX1U2NF9NSVNNQVRDSChleHBlY3RlZFR5cGVHdWlkLCBjaGFubmVsTmFtZSwKKwkJCQkJICAgICAic2l6ZSIsIGV4cGVjdGVkTWluQnl0ZXMsCisJCQkJCSAgICAgKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopCisJCQkJCSAgICAgIChwQ2hhbm5lbCkpLT5TaXplLCBmaWxlTmFtZSwKKwkJCQkJICAgICBsaW5lTnVtYmVyLCBsb2dDdHgpOworCQkJcmV0dXJuIDA7CisJCX0KKwlpZiAoZXhwZWN0ZWRWZXJzaW9uSWQgPiAwKQkvKiBjYWxsZXIgd2FudHMgdXMgdG8gdmVyaWZ5CisJCQkJCSAqIGNoYW5uZWwgdmVyc2lvbiAqLworCQlpZiAocmVhZGwoJigoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqKSAocENoYW5uZWwpKS0+VmVyc2lvbklkKQorCQkgICAgIT0gZXhwZWN0ZWRWZXJzaW9uSWQpIHsKKwkJCUNIQU5ORUxfVTMyX01JU01BVENIKGV4cGVjdGVkVHlwZUd1aWQsIGNoYW5uZWxOYW1lLAorCQkJCQkgICAgICJ2ZXJzaW9uIiwgZXhwZWN0ZWRWZXJzaW9uSWQsCisJCQkJCSAgICAgKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopCisJCQkJCSAgICAgIChwQ2hhbm5lbCkpLT5WZXJzaW9uSWQsIGZpbGVOYW1lLAorCQkJCQkgICAgIGxpbmVOdW1iZXIsIGxvZ0N0eCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCWlmIChleHBlY3RlZFNpZ25hdHVyZSA+IDApCS8qIGNhbGxlciB3YW50cyB1cyB0byB2ZXJpZnkKKwkJCQkJICogY2hhbm5lbCBzaWduYXR1cmUgKi8KKwkJaWYgKHJlYWRxKCYoKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKikgKHBDaGFubmVsKSktPlNpZ25hdHVyZSkKKwkJICAgICE9IGV4cGVjdGVkU2lnbmF0dXJlKSB7CisJCQlDSEFOTkVMX1U2NF9NSVNNQVRDSChleHBlY3RlZFR5cGVHdWlkLCBjaGFubmVsTmFtZSwKKwkJCQkJICAgICAic2lnbmF0dXJlIiwgZXhwZWN0ZWRTaWduYXR1cmUsCisJCQkJCSAgICAgKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopCisJCQkJCSAgICAgIChwQ2hhbm5lbCkpLT5TaWduYXR1cmUsIGZpbGVOYW1lLAorCQkJCQkgICAgIGxpbmVOdW1iZXIsIGxvZ0N0eCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworfQorCisvKiBHZW5lcmljIGZ1bmN0aW9uIHVzZWZ1bCBmb3IgdmFsaWRhdGluZyBhbnkgdHlwZSBvZiBjaGFubmVsIHdoZW4gaXQgaXMgYWJvdXQKKyAqIHRvIGJlIGluaXRpYWxpemVkIGJ5IHRoZSBzZXJ2ZXIgb2YgdGhlIGNoYW5uZWwuCisgKiBOb3RlIHRoYXQgPGxvZ0N0eD4gaXMgb25seSBuZWVkZWQgZm9yIGNhbGxlcnMgaW4gdGhlIEVGSSBlbnZpcm9ubWVudCwgYW5kCisgKiBpcyB1c2VkIHRvIHBhc3MgdGhlIEVGSV9ESUFHX0NBUFRVUkVfUFJPVE9DT0wgbmVlZGVkIHRvIGxvZyBtZXNzYWdlcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK1VMVFJBX2NoZWNrX2NoYW5uZWxfc2VydmVyKEdVSUQgdHlwZUd1aWQsCisJCQkgICBjaGFyICpjaGFubmVsTmFtZSwKKwkJCSAgIFU2NCBleHBlY3RlZE1pbkJ5dGVzLAorCQkJICAgVTY0IGFjdHVhbEJ5dGVzLAorCQkJICAgY2hhciAqZmlsZU5hbWUsIGludCBsaW5lTnVtYmVyLCB2b2lkICpsb2dDdHgpCit7CisJaWYgKGV4cGVjdGVkTWluQnl0ZXMgPiAwKQkvKiBjYWxsZXIgd2FudHMgdXMgdG8gdmVyaWZ5CisJCQkJCSAqIGNoYW5uZWwgc2l6ZSAqLworCQlpZiAoYWN0dWFsQnl0ZXMgPCBleHBlY3RlZE1pbkJ5dGVzKSB7CisJCQlDSEFOTkVMX1U2NF9NSVNNQVRDSCh0eXBlR3VpZCwgY2hhbm5lbE5hbWUsICJzaXplIiwKKwkJCQkJICAgICBleHBlY3RlZE1pbkJ5dGVzLCBhY3R1YWxCeXRlcywKKwkJCQkJICAgICBmaWxlTmFtZSwgbGluZU51bWJlciwgbG9nQ3R4KTsKKwkJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7Cit9CisKKy8qIEdpdmVuIGEgZmlsZSBwYXRobmFtZSA8cz4gKHdpdGggJy8nIG9yICdcJyBzZXBhcmF0aW5nIGRpcmVjdG9yeSBub2RlcyksCisgKiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGEgbm9kZSB3aXRoaW4gdGhhdCBwYXRobmFtZSBzdWNoCisgKiB0aGF0IHRoZSBudW1iZXIgb2Ygbm9kZXMgZnJvbSB0aGF0IHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGlzCisgKiBOT1QgbW9yZSB0aGFuIDxuPi4gIE5vdGUgdGhhdCBpZiB0aGUgcGF0aG5hbWUgaGFzIGxlc3MgdGhhbiA8bj4gbm9kZXMKKyAqIGluIGl0LCB0aGUgcmV0dXJuIHBvaW50ZXIgd2lsbCBiZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuCisgKi8KK3N0YXRpYyBpbmxpbmUgVTggKgorUGF0aE5hbWVfTGFzdF9OX05vZGVzKFU4ICpzLCB1bnNpZ25lZCBpbnQgbikKK3sKKwlVOCAqcCA9IHM7CisJdW5zaWduZWQgaW50IG5vZGVfY291bnQgPSAwOworCXdoaWxlICgqcCAhPSAnXDAnKSB7CisJCWlmICgoKnAgPT0gJy8nKSB8fCAoKnAgPT0gJ1xcJykpCisJCQlub2RlX2NvdW50Kys7CisJCXArKzsKKwl9CisJaWYgKG5vZGVfY291bnQgPD0gbikKKwkJcmV0dXJuIHM7CisJd2hpbGUgKG4gPiAwKSB7CisJCXAtLTsKKwkJaWYgKHAgPT0gcykKKwkJCWJyZWFrOwkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuLCB1bmxlc3Mgc29tZW9uZQorCQkJCSAqIGlzIGNoYW5naW5nIHRoZSBzdHJpbmcgd2hpbGUgd2UgYXJlCisJCQkJICogbG9va2luZyBhdCBpdCEhICovCisJCWlmICgoKnAgPT0gJy8nKSB8fCAoKnAgPT0gJ1xcJykpCisJCQluLS07CisJfQorCXJldHVybiBwICsgMTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK1VMVFJBX2NoYW5uZWxfY2xpZW50X2FjcXVpcmVfb3Modm9pZCBfX2lvbWVtICpwQ2hhbm5lbCwgVTggKmNoYW5JZCwKKwkJCQl2b2lkICpsb2dDdHgsIGNoYXIgKmZpbGUsIGludCBsaW5lLCBjaGFyICpmdW5jKQoreworCUNIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFuID0gcENoYW5uZWw7CisKKwlpZiAocmVhZGwoJnBDaGFuLT5DbGlTdGF0ZU9TKSA9PSBDSEFOTkVMQ0xJX0RJU0FCTEVEKSB7CisJCWlmICgocmVhZGIoJnBDaGFuLT5DbGlFcnJvck9TKQorCQkgICAgICYgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19ESVNBQkxFRCkgPT0gMCkgeworCQkJLyogd2UgYXJlIE5PVCB0aHJvdHRsaW5nIHRoaXMgbWVzc2FnZSAqLworCQkJd3JpdGViKHJlYWRiKCZwQ2hhbi0+Q2xpRXJyb3JPUykgfAorCQkJICAgICAgIFVMVFJBX0NMSUVSUk9ST1NfVEhST1RUTEVNU0dfRElTQUJMRUQsCisJCQkgICAgICAgJnBDaGFuLT5DbGlFcnJvck9TKTsKKwkJCS8qIHRocm90dGxlIHVudGlsIGFjcXVpcmUgc3VjY2Vzc2Z1bCAqLworCisJCQlVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19FVkVOVElEX1RSQU5TSVRFUlIsCisJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU0VWRVJJVFksCisJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU1VCU1lTLCBmdW5jLCBsaW5lLAorCQkJCSAgICAgICIlcyBDaGFubmVsIFN0YXRlVHJhbnNpdGlvbiBJTlZBTElEISAtIGFjcXVpcmUgZmFpbGVkIGJlY2F1c2UgT1MgY2xpZW50IERJU0FCTEVEIEAlczolZFxuIiwKKwkJCQkgICAgICBjaGFuSWQsIFBhdGhOYW1lX0xhc3RfTl9Ob2RlcygKKwkJCQkJICAgICAgKFU4ICopIGZpbGUsIDQpLCBsaW5lKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJaWYgKChyZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpICE9IENIQU5ORUxDTElfT1dORUQpCisJICAgICYmIChyZWFkbCgmcENoYW4tPkNsaVN0YXRlQm9vdCkgPT0gQ0hBTk5FTENMSV9ESVNBQkxFRCkpIHsKKwkJLyogT3VyIGNvbXBldGl0b3IgaXMgRElTQUJMRUQsIHNvIHdlIGNhbiB0cmFuc2l0aW9uIHRvIE9XTkVEICovCisJCVVsdHJhTG9nRXZlbnQobG9nQ3R4LCBDSEFOTkVMU1RBVEVfRElBR19FVkVOVElEX1RSQU5TSVRPSywKKwkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NFVkVSSVRZLAorCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU1VCU1lTLCBmdW5jLCBsaW5lLAorCQkJICAgICAgIiVzIENoYW5uZWwgU3RhdGVUcmFuc2l0aW9uICglcykgJXMoJWQpLS0+JXMoJWQpIEAlczolZFxuIiwKKwkJCSAgICAgIGNoYW5JZCwgIkNsaVN0YXRlT1MiLAorCQkJICAgICAgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcoCisJCQkJICAgICAgcmVhZGwoJnBDaGFuLT5DbGlTdGF0ZU9TKSksCisJCQkgICAgICByZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpLAorCQkJICAgICAgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcoQ0hBTk5FTENMSV9PV05FRCksCisJCQkgICAgICBDSEFOTkVMQ0xJX09XTkVELAorCQkJICAgICAgUGF0aE5hbWVfTGFzdF9OX05vZGVzKChVOCAqKSBmaWxlLCA0KSwgbGluZSk7CisJCXdyaXRlbChDSEFOTkVMQ0xJX09XTkVELCAmcENoYW4tPkNsaVN0YXRlT1MpOworCQlNRU1PUllCQVJSSUVSOworCX0KKwlpZiAocmVhZGwoJnBDaGFuLT5DbGlTdGF0ZU9TKSA9PSBDSEFOTkVMQ0xJX09XTkVEKSB7CisJCWlmIChyZWFkYigmcENoYW4tPkNsaUVycm9yT1MpICE9IDApIHsKKwkJCS8qIHdlIGFyZSBpbiBhbiBlcnJvciBtc2cgdGhyb3R0bGluZyBzdGF0ZTsKKwkJCSAqIGNvbWUgb3V0IG9mIGl0ICovCisJCQlVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19FVkVOVElEX1RSQU5TSVRPSywKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TRVZFUklUWSwKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TVUJTWVMsIGZ1bmMsIGxpbmUsCisJCQkJICAgICAgIiVzIENoYW5uZWwgT1MgY2xpZW50IGFjcXVpcmUgbm93IHN1Y2Nlc3NmdWwgQCVzOiVkXG4iLAorCQkJCSAgICAgIGNoYW5JZCwgUGF0aE5hbWVfTGFzdF9OX05vZGVzKChVOCAqKSBmaWxlLAorCQkJCQkJCQkgICAgNCksIGxpbmUpOworCQkJd3JpdGViKDAsICZwQ2hhbi0+Q2xpRXJyb3JPUyk7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJLyogV2UgaGF2ZSB0byBkbyBpdCB0aGUgImhhcmQgd2F5Ii4gIFdlIHRyYW5zaXRpb24gdG8gQlVTWSwKKwkqIGFuZCBjYW4gdXNlIHRoZSBjaGFubmVsIGlmZiBvdXIgY29tcGV0aXRvciBoYXMgbm90IGFsc28KKwkqIHRyYW5zaXRpb25lZCB0byBCVVNZLiAqLworCWlmIChyZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpICE9IENIQU5ORUxDTElfQVRUQUNIRUQpIHsKKwkJaWYgKChyZWFkYigmcENoYW4tPkNsaUVycm9yT1MpCisJCSAgICAgJiBVTFRSQV9DTElFUlJPUk9TX1RIUk9UVExFTVNHX05PVEFUVEFDSEVEKSA9PSAwKSB7CisJCQkvKiB3ZSBhcmUgTk9UIHRocm90dGxpbmcgdGhpcyBtZXNzYWdlICovCisJCQl3cml0ZWIocmVhZGIoJnBDaGFuLT5DbGlFcnJvck9TKSB8CisJCQkgICAgICAgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19OT1RBVFRBQ0hFRCwKKwkJCSAgICAgICAmcENoYW4tPkNsaUVycm9yT1MpOworCQkJLyogdGhyb3R0bGUgdW50aWwgYWNxdWlyZSBzdWNjZXNzZnVsICovCisJCQlVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19FVkVOVElEX1RSQU5TSVRFUlIsCisJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU0VWRVJJVFksCisJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU1VCU1lTLCBmdW5jLCBsaW5lLAorCQkJCSAgICAgICIlcyBDaGFubmVsIFN0YXRlVHJhbnNpdGlvbiBJTlZBTElEISAtIGFjcXVpcmUgZmFpbGVkIGJlY2F1c2UgT1MgY2xpZW50IE5PVCBBVFRBQ0hFRCAoc3RhdGU9JXMoJWQpKSBAJXM6JWRcbiIsCisJCQkJICAgICAgY2hhbklkLAorCQkJCSAgICAgIFVMVFJBX0NIQU5ORUxDTElfU1RSSU5HKAorCQkJCQkgICAgICByZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpKSwKKwkJCQkgICAgICByZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpLAorCQkJCSAgICAgIFBhdGhOYW1lX0xhc3RfTl9Ob2RlcygoVTggKikgZmlsZSwgNCksCisJCQkJICAgICAgbGluZSk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCXdyaXRlbChDSEFOTkVMQ0xJX0JVU1ksICZwQ2hhbi0+Q2xpU3RhdGVPUyk7CisJTUVNT1JZQkFSUklFUjsKKwlpZiAocmVhZGwoJnBDaGFuLT5DbGlTdGF0ZUJvb3QpID09IENIQU5ORUxDTElfQlVTWSkgeworCQlpZiAoKHJlYWRiKCZwQ2hhbi0+Q2xpRXJyb3JPUykKKwkJICAgICAmIFVMVFJBX0NMSUVSUk9ST1NfVEhST1RUTEVNU0dfQlVTWSkgPT0gMCkgeworCQkJLyogd2UgYXJlIE5PVCB0aHJvdHRsaW5nIHRoaXMgbWVzc2FnZSAqLworCQkJd3JpdGViKHJlYWRiKCZwQ2hhbi0+Q2xpRXJyb3JPUykgfAorCQkJICAgICAgIFVMVFJBX0NMSUVSUk9ST1NfVEhST1RUTEVNU0dfQlVTWSwKKwkJCSAgICAgICAmcENoYW4tPkNsaUVycm9yT1MpOworCQkJLyogdGhyb3R0bGUgdW50aWwgYWNxdWlyZSBzdWNjZXNzZnVsICovCisJCQlVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19FVkVOVElEX1RSQU5TSVRCVVNZLAorCQkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NFVkVSSVRZLAorCQkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NVQlNZUywgZnVuYywgbGluZSwKKwkJCQkgICAgICAiJXMgQ2hhbm5lbCBTdGF0ZVRyYW5zaXRpb24gZmFpbGVkIC0gaG9zdCBPUyBhY3F1aXJlIGZhaWxlZCBiZWNhdXNlIGJvb3QgQlVTWSBAJXM6JWRcbiIsCisJCQkJICAgICAgY2hhbklkLCBQYXRoTmFtZV9MYXN0X05fTm9kZXMoKFU4ICopIGZpbGUsCisJCQkJCQkJCSAgICA0KSwgbGluZSk7CisJCX0KKwkJLyogcmVzZXQgYnVzeSAqLworCQl3cml0ZWwoQ0hBTk5FTENMSV9BVFRBQ0hFRCwgJnBDaGFuLT5DbGlTdGF0ZU9TKTsKKwkJTUVNT1JZQkFSUklFUjsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChyZWFkYigmcENoYW4tPkNsaUVycm9yT1MpICE9IDApIHsKKwkJLyogd2UgYXJlIGluIGFuIGVycm9yIG1zZyB0aHJvdHRsaW5nIHN0YXRlOyBjb21lIG91dCBvZiBpdCAqLworCQlVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwgQ0hBTk5FTFNUQVRFX0RJQUdfRVZFTlRJRF9UUkFOU0lUT0ssCisJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TRVZFUklUWSwKKwkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NVQlNZUywgZnVuYywgbGluZSwKKwkJCSAgICAgICIlcyBDaGFubmVsIE9TIGNsaWVudCBhY3F1aXJlIG5vdyBzdWNjZXNzZnVsIEAlczolZFxuIiwKKwkJCSAgICAgIGNoYW5JZCwgUGF0aE5hbWVfTGFzdF9OX05vZGVzKChVOCAqKSBmaWxlLCA0KSwKKwkJCSAgICAgIGxpbmUpOworCQl3cml0ZWIoMCwgJnBDaGFuLT5DbGlFcnJvck9TKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorVUxUUkFfY2hhbm5lbF9jbGllbnRfcmVsZWFzZV9vcyh2b2lkIF9faW9tZW0gKnBDaGFubmVsLCBVOCAqY2hhbklkLAorCQkJCXZvaWQgKmxvZ0N0eCwgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNoYXIgKmZ1bmMpCit7CisJQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW4gPSBwQ2hhbm5lbDsKKwlpZiAocmVhZGIoJnBDaGFuLT5DbGlFcnJvck9TKSAhPSAwKSB7CisJCS8qIHdlIGFyZSBpbiBhbiBlcnJvciBtc2cgdGhyb3R0bGluZyBzdGF0ZTsgY29tZSBvdXQgb2YgaXQgKi8KKwkJVWx0cmFMb2dFdmVudChsb2dDdHgsIENIQU5ORUxTVEFURV9ESUFHX0VWRU5USURfVFJBTlNJVE9LLAorCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU0VWRVJJVFksCisJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TVUJTWVMsIGZ1bmMsIGxpbmUsCisJCQkgICAgICAiJXMgQ2hhbm5lbCBPUyBjbGllbnQgZXJyb3Igc3RhdGUgY2xlYXJlZCBAJXM6JWRcbiIsCisJCQkgICAgICBjaGFuSWQsIFBhdGhOYW1lX0xhc3RfTl9Ob2RlcygoVTggKikgZmlsZSwgNCksCisJCQkgICAgICBsaW5lKTsKKwkJd3JpdGViKDAsICZwQ2hhbi0+Q2xpRXJyb3JPUyk7CisJfQorCWlmIChyZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpID09IENIQU5ORUxDTElfT1dORUQpCisJCXJldHVybjsKKwlpZiAocmVhZGwoJnBDaGFuLT5DbGlTdGF0ZU9TKSAhPSBDSEFOTkVMQ0xJX0JVU1kpIHsKKwkJVWx0cmFMb2dFdmVudChsb2dDdHgsIENIQU5ORUxTVEFURV9ESUFHX0VWRU5USURfVFJBTlNJVEVSUiwKKwkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NFVkVSSVRZLAorCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU1VCU1lTLCBmdW5jLCBsaW5lLAorCQkJICAgICAgIiVzIENoYW5uZWwgU3RhdGVUcmFuc2l0aW9uIElOVkFMSUQhIC0gcmVsZWFzZSBmYWlsZWQgYmVjYXVzZSBPUyBjbGllbnQgTk9UIEJVU1kgKHN0YXRlPSVzKCVkKSkgQCVzOiVkXG4iLAorCQkJICAgICAgY2hhbklkLAorCQkJICAgICAgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcoCisJCQkJICAgICAgcmVhZGwoJnBDaGFuLT5DbGlTdGF0ZU9TKSksCisJCQkgICAgICByZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpLAorCQkJICAgICAgUGF0aE5hbWVfTGFzdF9OX05vZGVzKChVOCAqKSBmaWxlLCA0KSwgbGluZSk7CisJCS8qIHJldHVybjsgKi8KKwl9CisJd3JpdGVsKENIQU5ORUxDTElfQVRUQUNIRUQsICZwQ2hhbi0+Q2xpU3RhdGVPUyk7IC8qIHJlbGVhc2UgYnVzeSAqLworfQorCisvKgorKiBSb3V0aW5lIERlc2NyaXB0aW9uOgorKiBUcmllcyB0byBpbnNlcnQgdGhlIHByZWJ1aWx0IHNpZ25hbCBwb2ludGVkIHRvIGJ5IHBTaWduYWwgaW50byB0aGUgbnRoCisqIFF1ZXVlIG9mIHRoZSBDaGFubmVsIHBvaW50ZWQgdG8gYnkgcENoYW5uZWwKKyoKKyogUGFyYW1ldGVyczoKKyogcENoYW5uZWw6IChJTikgcG9pbnRzIHRvIHRoZSBJTyBDaGFubmVsCisqIFF1ZXVlOiAoSU4pIG50aCBRdWV1ZSBvZiB0aGUgSU8gQ2hhbm5lbAorKiBwU2lnbmFsOiAoSU4pIHBvaW50ZXIgdG8gdGhlIHNpZ25hbAorKgorKiBBc3N1bXB0aW9uczoKKyogLSBwQ2hhbm5lbCwgUXVldWUgYW5kIHBTaWduYWwgYXJlIHZhbGlkLgorKiAtIElmIGluc2VydGlvbiBmYWlscyBkdWUgdG8gYSBmdWxsIHF1ZXVlLCB0aGUgY2FsbGVyIHdpbGwgZGV0ZXJtaW5lIHRoZQorKiByZXRyeSBwb2xpY3kgKGUuZy4gd2FpdCAmIHRyeSBhZ2FpbiwgcmVwb3J0IGFuIGVycm9yLCBldGMuKS4KKyoKKyogUmV0dXJuIHZhbHVlOiAxIGlmIHRoZSBpbnNlcnRpb24gc3VjY2VlZHMsIDAgaWYgdGhlIHF1ZXVlIHdhcworKiBmdWxsLgorKi8KKwordW5zaWduZWQgY2hhciB2aXNvcl9zaWduYWxfaW5zZXJ0KENIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsLCBVMzIgUXVldWUsCisJCQkJICB2b2lkICpwU2lnbmFsKTsKKworLyoKKyogUm91dGluZSBEZXNjcmlwdGlvbjoKKyogUmVtb3ZlcyBvbmUgc2lnbmFsIGZyb20gQ2hhbm5lbCBwQ2hhbm5lbCdzIG50aCBRdWV1ZSBhdCB0aGUKKyogdGltZSBvZiB0aGUgY2FsbCBhbmQgY29waWVzIGl0IGludG8gdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5CisqIHBTaWduYWwuCisqCisqIFBhcmFtZXRlcnM6CisqIHBDaGFubmVsOiAoSU4pIHBvaW50cyB0byB0aGUgSU8gQ2hhbm5lbAorKiBRdWV1ZTogKElOKSBudGggUXVldWUgb2YgdGhlIElPIENoYW5uZWwKKyogcFNpZ25hbDogKElOKSBwb2ludGVyIHRvIHdoZXJlIHRoZSBzaWduYWxzIGFyZSB0byBiZSBjb3BpZWQKKyoKKyogQXNzdW1wdGlvbnM6CisqIC0gcENoYW5uZWwgYW5kIFF1ZXVlIGFyZSB2YWxpZC4KKyogLSBwU2lnbmFsIHBvaW50cyB0byBhIG1lbW9yeSBhcmVhIGxhcmdlIGVub3VnaCB0byBob2xkIHF1ZXVlJ3MgU2lnbmFsU2l6ZQorKgorKiBSZXR1cm4gdmFsdWU6IDEgaWYgdGhlIHJlbW92YWwgc3VjY2VlZHMsIDAgaWYgdGhlIHF1ZXVlIHdhcworKiBlbXB0eS4KKyovCisKK3Vuc2lnbmVkIGNoYXIgdmlzb3Jfc2lnbmFsX3JlbW92ZShDSEFOTkVMX0hFQURFUiBfX2lvbWVtICpwQ2hhbm5lbCwgVTMyIFF1ZXVlLAorCQkJCSAgdm9pZCAqcFNpZ25hbCk7CisKKy8qCisqIFJvdXRpbmUgRGVzY3JpcHRpb246CisqIFJlbW92ZXMgYWxsIHNpZ25hbHMgcHJlc2VudCBpbiBDaGFubmVsIHBDaGFubmVsJ3MgbnRoIFF1ZXVlIGF0IHRoZQorKiB0aW1lIG9mIHRoZSBjYWxsIGFuZCBjb3BpZXMgdGhlbSBpbnRvIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieQorKiBwU2lnbmFsLiAgUmV0dXJucyB0aGUgIyBvZiBzaWduYWxzIGNvcGllZCBhcyB0aGUgdmFsdWUgb2YgdGhlIHJvdXRpbmUuCisqCisqIFBhcmFtZXRlcnM6CisqIHBDaGFubmVsOiAoSU4pIHBvaW50cyB0byB0aGUgSU8gQ2hhbm5lbAorKiBRdWV1ZTogKElOKSBudGggUXVldWUgb2YgdGhlIElPIENoYW5uZWwKKyogcFNpZ25hbDogKElOKSBwb2ludGVyIHRvIHdoZXJlIHRoZSBzaWduYWxzIGFyZSB0byBiZSBjb3BpZWQKKyoKKyogQXNzdW1wdGlvbnM6CisqIC0gcENoYW5uZWwgYW5kIFF1ZXVlIGFyZSB2YWxpZC4KKyogLSBwU2lnbmFsIHBvaW50cyB0byBhIG1lbW9yeSBhcmVhIGxhcmdlIGVub3VnaCB0byBob2xkIFF1ZXVlJ3MgTWF4U2lnbmFscworKiAjIG9mIHNpZ25hbHMsIGVhY2ggb2Ygd2hpY2ggaXMgUXVldWUncyBTaWduYWxTaXplLgorKgorKiBSZXR1cm4gdmFsdWU6CisqICMgb2Ygc2lnbmFscyBjb3BpZWQuCisqLwordW5zaWduZWQgaW50IFNpZ25hbFJlbW92ZUFsbChwQ0hBTk5FTF9IRUFERVIgcENoYW5uZWwsIFUzMiBRdWV1ZSwKKwkJCSAgICAgdm9pZCAqcFNpZ25hbCk7CisKKy8qCisqIFJvdXRpbmUgRGVzY3JpcHRpb246CisqIERldGVybWluZSB3aGV0aGVyIGEgc2lnbmFsIHF1ZXVlIGlzIGVtcHR5LgorKgorKiBQYXJhbWV0ZXJzOgorKiBwQ2hhbm5lbDogKElOKSBwb2ludHMgdG8gdGhlIElPIENoYW5uZWwKKyogUXVldWU6IChJTikgbnRoIFF1ZXVlIG9mIHRoZSBJTyBDaGFubmVsCisqCisqIFJldHVybiB2YWx1ZToKKyogMSBpZiB0aGUgc2lnbmFsIHF1ZXVlIGlzIGVtcHR5LCAwIG90aGVyd2lzZS4KKyovCit1bnNpZ25lZCBjaGFyIHZpc29yX3NpZ25hbHF1ZXVlX2VtcHR5KENIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsLAorCQkJCSAgICAgIFUzMiBRdWV1ZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2NoYW5uZWxfZ3VpZC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2NoYW5uZWxfZ3VpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMGRjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvY2hhbm5lbF9ndWlkLmgKQEAgLTAsMCArMSw2NCBAQAorLyogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKgorICogQ0hBTk5FTCBHdWlkcworICovCisKKy8qIFVzZWQgaW4gSU9DaGFubmVsCisgKiB7NDE0ODE1ZWQtYzU4Yy0xMWRhLTk1YTktMDBlMDgxNjExNjVmfQorICovCisjZGVmaW5lIFVMVFJBX1ZIQkFfQ0hBTk5FTF9QUk9UT0NPTF9HVUlEIFwKKwl7IDB4NDE0ODE1ZWQsIDB4YzU4YywgMHgxMWRhLCBcCisJCXsgMHg5NSwgMHhhOSwgMHgwLCAweGUwLCAweDgxLCAweDYxLCAweDE2LCAweDVmIH0gfQorc3RhdGljIGNvbnN0IEdVSUQgVWx0cmFWaGJhQ2hhbm5lbFByb3RvY29sR3VpZCA9CisJVUxUUkFfVkhCQV9DSEFOTkVMX1BST1RPQ09MX0dVSUQ7CisKKy8qIFVzZWQgaW4gSU9DaGFubmVsCisgKiB7OGNkNTk5NGQtYzU4ZS0xMWRhLTk1YTktMDBlMDgxNjExNjVmfQorICovCisjZGVmaW5lIFVMVFJBX1ZOSUNfQ0hBTk5FTF9QUk9UT0NPTF9HVUlEIFwKKwl7IDB4OGNkNTk5NGQsIDB4YzU4ZSwgMHgxMWRhLCBcCisJCXsgMHg5NSwgMHhhOSwgMHgwLCAweGUwLCAweDgxLCAweDYxLCAweDE2LCAweDVmIH0gfQorc3RhdGljIGNvbnN0IEdVSUQgVWx0cmFWbmljQ2hhbm5lbFByb3RvY29sR3VpZCA9CisJVUxUUkFfVk5JQ19DSEFOTkVMX1BST1RPQ09MX0dVSUQ7CisKKy8qIFVzZWQgaW4gSU9DaGFubmVsCisgKiB7NzIxMjAwMDgtNEFBQi0xMURDLTg1MzAtNDQ0NTUzNTQ0MjAwfQorICovCisjZGVmaW5lIFVMVFJBX1NJT1ZNX0dVSUQgXAorCXsgMHg3MjEyMDAwOCwgMHg0QUFCLCAweDExREMsCQkJCQlcCisJCXsgMHg4NSwgMHgzMCwgMHg0NCwgMHg0NSwgMHg1MywgMHg1NCwgMHg0MiwgMHgwMCB9IH0KK3N0YXRpYyBjb25zdCBHVUlEIFVsdHJhU0lPVk1HdWlkID0gVUxUUkFfU0lPVk1fR1VJRDsKKworCisvKiBVc2VkIGluIHZpc29ybm9vcC92aXNvcm5vb3BfbWFpbi5jCisgKiB7NWI1MmM1YWMtZTVmNS00ZDQyLThkZmYtNDI5ZWFlY2QyMjFmfQorICovCisjZGVmaW5lIFVMVFJBX0NPTlRST0xESVJFQ1RPUl9DSEFOTkVMX1BST1RPQ09MX0dVSUQgIFwKKwl7IDB4NWI1MmM1YWMsIDB4ZTVmNSwgMHg0ZDQyLCBcCisJCXsgMHg4ZCwgMHhmZiwgMHg0MiwgMHg5ZSwgMHhhZSwgMHhjZCwgMHgyMiwgMHgxZiB9IH0KKworc3RhdGljIGNvbnN0IEdVSUQgVWx0cmFDb250cm9sRGlyZWN0b3JDaGFubmVsUHJvdG9jb2xHdWlkID0KKwlVTFRSQV9DT05UUk9MRElSRUNUT1JfQ0hBTk5FTF9QUk9UT0NPTF9HVUlEOworCisvKiBVc2VkIGluIHZpc29yY2hpcHNldC92aXNvcmNoaXBzZXRfbWFpbi5jCisgKiB7QjRFNzk2MjUtQUVERS00RUFBLTlFMTEtRDNFRERDRDQ1MDRDfQorICovCisjZGVmaW5lIFVMVFJBX0RJQUdfUE9PTF9DSEFOTkVMX1BST1RPQ09MX0dVSUQJCQkJXAorCXsweGI0ZTc5NjI1LCAweGFlZGUsIDB4NGVhYSwJCQkJCVwKKwkJeyAweDllLCAweDExLCAweGQzLCAweGVkLCAweGRjLCAweGQ0LCAweDUwLCAweDRjIH0gfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy9jb250cm9sZnJhbWV3b3JrLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvY29udHJvbGZyYW1ld29yay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMjY0MzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvY29udHJvbGZyYW1ld29yay5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qIENvcHlyaWdodCDCqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qCisgKiBNb2R1bGUgTmFtZToKKyAqICBjb250cm9sZnJhbWV3b3JrLmgKKyAqCisgKiBBYnN0cmFjdDogVGhpcyBmaWxlIGRlZmluZXMgY29tbW9uIHN0cnVjdHVyZXMgaW4gdGhlIHVubWFuYWdlZAorICoJICAgICBVbHRyYXZpc29yIChtb3N0bHkgRUZJKSBzcGFjZS4KKyAqCisgKi8KKworI2lmbmRlZiBfQ09OVFJPTF9GUkFNRVdPUktfSF8KKyNkZWZpbmUgX0NPTlRST0xfRlJBTUVXT1JLX0hfCisKKyNpbmNsdWRlICJjb21tb250eXBlcy5oIgorI2luY2x1ZGUgImNoYW5uZWwuaCIKKworI2RlZmluZSBVTFRSQV9NRU1PUllfQ09VTlRfS2kgMTAyNAorCisvKiBTY2FsZSBvcmRlciAwIGlzIG9uZSAzMi1iaXQgKDQtYnl0ZSkgd29yZCAoaW4gNjQgb3IgMTI4LWJpdAorICogYXJjaGl0ZWN0dXJlIHBvdGVudGlhbGx5IDY0IG9yIDEyOC1iaXQgd29yZCkgKi8KKyNkZWZpbmUgVUxUUkFfTUVNT1JZX1BBR0VfV09SRCA0CisKKy8qIERlZmluZSBLaSBzY2FsZSBwYWdlIHRvIGJlIHRyYWRpdGlvbmFsIDRLQiBwYWdlICovCisjZGVmaW5lIFVMVFJBX01FTU9SWV9QQUdFX0tpIChVTFRSQV9NRU1PUllfUEFHRV9XT1JEICogVUxUUkFfTUVNT1JZX0NPVU5UX0tpKQordHlwZWRlZiBzdHJ1Y3QgX1VMVFJBX1NFR01FTlRfU1RBVEUgIHsKKwlVMTYgRW5hYmxlZDoxOwkJLyogQml0IDA6IE1heSBlbnRlciBvdGhlciBzdGF0ZXMgKi8KKwlVMTYgQWN0aXZlOjE7CQkvKiBCaXQgMTogQXNzaWduZWQgdG8gYWN0aXZlIHBhcnRpdGlvbiAqLworCVUxNiBBbGl2ZToxOwkJLyogQml0IDI6IENvbmZpZ3VyZSBtZXNzYWdlIHNlbnQgdG8KKwkJCQkgKiBzZXJ2aWNlL3NlcnZlciAqLworCVUxNiBSZXZva2VkOjE7CQkvKiBCaXQgMzogc2ltaWxhciB0byBwYXJ0aXRpb24gc3RhdGUKKwkJCQkgKiBTaHV0dGluZ0Rvd24gKi8KKwlVMTYgQWxsb2NhdGVkOjE7CS8qIEJpdCA0OiBtZW1vcnkgKGRldmljZS9wb3J0IG51bWJlcikKKwkJCQkgKiBoYXMgYmVlbiBzZWxlY3RlZCBieSBDb21tYW5kICovCisJVTE2IEtub3duOjE7CQkvKiBCaXQgNTogaGFzIGJlZW4gaW50cm9kdWNlZCB0byB0aGUKKwkJCQkgKiBzZXJ2aWNlL2d1ZXN0IHBhcnRpdGlvbiAqLworCVUxNiBSZWFkeToxOwkJLyogQml0IDY6IHNlcnZpY2UvR3Vlc3QgcGFydGl0aW9uIGhhcworCQkJCSAqIHJlc3BvbmRlZCB0byBpbnRyb2R1Y3Rpb24gKi8KKwlVMTYgT3BlcmF0aW5nOjE7CS8qIEJpdCA3OiByZXNvdXJjZSBpcyBjb25maWd1cmVkIGFuZAorCQkJCSAqIG9wZXJhdGluZyAqLworCS8qIE5vdGU6IGRvbid0IHVzZSBoaWdoIGJpdCB1bmxlc3Mgd2UgbmVlZCB0byBzd2l0Y2ggdG8gdXNob3J0CisJICogd2hpY2ggaXMgbm9uLWNvbXBsaWFudCAqLworfSBVTFRSQV9TRUdNRU5UX1NUQVRFOworc3RhdGljIGNvbnN0IFVMVFJBX1NFR01FTlRfU1RBVEUgU2VnbWVudFN0YXRlUnVubmluZyA9IHsKKwkxLCAxLCAxLCAwLCAxLCAxLCAxLCAxCit9Oworc3RhdGljIGNvbnN0IFVMVFJBX1NFR01FTlRfU1RBVEUgU2VnbWVudFN0YXRlUGF1c2VkID0geworCTEsIDEsIDEsIDAsIDEsIDEsIDEsIDAKK307CitzdGF0aWMgY29uc3QgVUxUUkFfU0VHTUVOVF9TVEFURSBTZWdtZW50U3RhdGVTdGFuZGJ5ID0geworCTEsIDEsIDAsIDAsIDEsIDEsIDEsIDAKK307Cit0eXBlZGVmIHVuaW9uIHsKKwlVNjQgRnVsbDsKKwlzdHJ1Y3QgeworCQlVOCBNYWpvcjsJLyogd2lsbCBiZSAxIGZvciB0aGUgZmlyc3QgcmVsZWFzZSBhbmQKKwkJCQkgKiBpbmNyZW1lbnQgdGhlcmVhZnRlciAgKi8KKwkJVTggTWlub3I7CisJCVUxNiBNYWludGVuYW5jZTsKKwkJVTMyIFJldmlzaW9uOwkvKiBTdWJ2ZXJzaW9uIHJldmlzaW9uICovCisJfSBQYXJ0OworfSBVTFRSQV9DT01QT05FTlRfVkVSU0lPTjsKKworI2VuZGlmCQkJCS8qIF9DT05UUk9MX0ZSQU1FV09SS19IXyBub3QgZGVmaW5lZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2NvbnRyb2x2bWNoYW5uZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy9jb250cm9sdm1jaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmMWM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy9jb250cm9sdm1jaGFubmVsLmgKQEAgLTAsMCArMSw2MTkgQEAKKy8qIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0NPTlRST0xWTUNIQU5ORUxfSF9fCisjZGVmaW5lIF9fQ09OVFJPTFZNQ0hBTk5FTF9IX18KKworI2luY2x1ZGUgImNvbW1vbnR5cGVzLmgiCisjaW5jbHVkZSAiY2hhbm5lbC5oIgorI2luY2x1ZGUgImNvbnRyb2xmcmFtZXdvcmsuaCIKK2VudW0geyBJTlZBTElEX0dVRVNUX0ZJUk1XQVJFLCBTQU1QTEVfR1VFU1RfRklSTVdBUkUsCisJICAgIFRJQU5PMzJfR1VFU1RfRklSTVdBUkUsIFRJQU5PNjRfR1VFU1RfRklSTVdBUkUKK307CisKKy8qIHsyQjNDMkQxMC03RUY1LTRhZDgtQjk2Ni0zNDQ4QjczODZCM0R9ICovCisjZGVmaW5lIFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MX0dVSUQJXAorCXsweDJiM2MyZDEwLCAweDdlZjUsIDB4NGFkOCwgXAorCQl7MHhiOSwgMHg2NiwgMHgzNCwgMHg0OCwgMHhiNywgMHgzOCwgMHg2YiwgMHgzZH0gfQorCitzdGF0aWMgY29uc3QgR1VJRCBVbHRyYUNvbnRyb2x2bUNoYW5uZWxQcm90b2NvbEd1aWQgPQorCVVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MX0dVSUQ7CisKKyNkZWZpbmUgVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFIFwKKwlVTFRSQV9DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRQorI2RlZmluZSBDT05UUk9MVk1fTUVTU0FHRV9NQVggICAgIDY0CisKKy8qIE11c3QgaW5jcmVtZW50IHRoaXMgd2hlbmV2ZXIgeW91IGluc2VydCBvciBkZWxldGUgZmllbGRzIHdpdGhpbgorKiB0aGlzIGNoYW5uZWwgc3RydWN0LiAgQWxzbyBpbmNyZW1lbnQgd2hlbmV2ZXIgeW91IGNoYW5nZSB0aGUgbWVhbmluZworKiBvZiBmaWVsZHMgd2l0aGluIHRoaXMgY2hhbm5lbCBzdHJ1Y3Qgc28gYXMgdG8gYnJlYWsgcHJlLWV4aXN0aW5nCisqIHNvZnR3YXJlLiAgTm90ZSB0aGF0IHlvdSBjYW4gdXN1YWxseSBhZGQgZmllbGRzIHRvIHRoZSBFTkQgb2YgdGhlCisqIGNoYW5uZWwgc3RydWN0IHdpdGhPVVQgbmVlZGluZyB0byBpbmNyZW1lbnQgdGhpcy4gKi8KKyNkZWZpbmUgVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0xfVkVSU0lPTklEICAxCisKKyNkZWZpbmUgVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfT0tfQ0xJRU5UKHBDaGFubmVsLCBsb2dDdHgpICAgICAgICAgICBcCisJKFVMVFJBX2NoZWNrX2NoYW5uZWxfY2xpZW50KHBDaGFubmVsLCBcCisJCVVsdHJhQ29udHJvbHZtQ2hhbm5lbFByb3RvY29sR3VpZCwgXAorCQkiY29udHJvbHZtIiwgXAorCQlzaXplb2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wpLCBcCisJCVVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MX1ZFUlNJT05JRCwgXAorCQlVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUsIFwKKwkJX19GSUxFX18sIF9fTElORV9fLCBsb2dDdHgpKQorI2RlZmluZSBVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9PS19TRVJWRVIoYWN0dWFsQnl0ZXMsIGxvZ0N0eCkgICAgICAgIFwKKwkoVUxUUkFfY2hlY2tfY2hhbm5lbF9zZXJ2ZXIoVWx0cmFDb250cm9sdm1DaGFubmVsUHJvdG9jb2xHdWlkLAlcCisJCQkJICAgICJjb250cm9sdm0iLAkJCVwKKwkJCQkgICAgc2l6ZW9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MKSwgXAorCQkJCSAgICBhY3R1YWxCeXRlcywgX19GSUxFX18sIF9fTElORV9fLCBsb2dDdHgpKQorCisjZGVmaW5lIE1ZX0RFVklDRV9JTkRFWCAwCisjZGVmaW5lIE1BWF9NQUNEQVRBX0xFTiA4IC8qIG51bWJlciBvZiBieXRlcyBmb3IgTUFDIGFkZHJlc3MgaW4gY29uZmlnIHBhY2tldCAqLworI2RlZmluZSBNQVhfU0VSSUFMX05VTQkzMgorCisjZGVmaW5lIERJU0tfWkVST19QVU5fTlVNQkVSCTEgIC8qIFRhcmdldCBJRCBvbiB0aGUgU0NTSSBidXMgZm9yIExVTiAwICovCisjZGVmaW5lIERJU0tfWkVST19MVU5fTlVNQkVSCTMgIC8qIExvZ2ljYWwgVW5pdCBOdW1iZXIgKi8KKworLyogRGVmaW5lcyBmb3IgdmFyaW91cyBjaGFubmVsIHF1ZXVlcy4uLiAqLworI2RlZmluZSBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVAkJMAorI2RlZmluZSBDT05UUk9MVk1fUVVFVUVfUkVTUE9OU0UJMQorI2RlZmluZQlDT05UUk9MVk1fUVVFVUVfRVZFTlQJCTIKKyNkZWZpbmUgQ09OVFJPTFZNX1FVRVVFX0FDSwkJMworCisvKiBNYXggbnVtYmVyIG9mIG1lc3NhZ2VzIHN0b3JlZCBkdXJpbmcgSU9WTSBjcmVhdGlvbiB0byBiZSByZXVzZWQKKyAqIGFmdGVyIGNyYXNoICovCisjZGVmaW5lIENPTlRST0xWTV9DUkFTSE1TR19NQVgJCTIKKworLyoqIElkcyBmb3IgY29tbWFuZHMgdGhhdCBtYXkgYXBwZWFyIGluIGVpdGhlciBxdWV1ZSBvZiBhIENvbnRyb2xWbSBjaGFubmVsLgorICoKKyAqICBDb21tYW5kcyB0aGF0IGFyZSBpbml0aWF0ZWQgYnkgdGhlIGNvbW1hbmQgcGFydGl0aW9uIChDUCksIGJ5IGFuIElPIG9yCisgKiAgY29uc29sZSBzZXJ2aWNlIHBhcnRpdGlvbiAoU1ApLCBvciBieSBhIGd1ZXN0IHBhcnRpdGlvbiAoR1ApYXJlOgorICogIC0gaXNzdWVkIG9uIHRoZSBSZXF1ZXN0UXVldWUgcXVldWUgKHEgIzApIGluIHRoZSBDb250cm9sVm0gY2hhbm5lbAorICogIC0gcmVzcG9uZGVkIHRvIG9uIHRoZSBSZXNwb25zZVF1ZXVlIHF1ZXVlIChxICMxKSBpbiB0aGUgQ29udHJvbFZtIGNoYW5uZWwKKyAqCisgKiAgRXZlbnRzIHRoYXQgYXJlIGluaXRpYXRlZCBieSBhbiBJTyBvciBjb25zb2xlIHNlcnZpY2UgcGFydGl0aW9uIChTUCkgb3IKKyAqICBieSBhIGd1ZXN0IHBhcnRpdGlvbiAoR1ApIGFyZToKKyAqICAtIGlzc3VlZCBvbiB0aGUgRXZlbnRRdWV1ZSBxdWV1ZSAocSAjMikgaW4gdGhlIENvbnRyb2xWbSBjaGFubmVsCisgKiAgLSByZXNwb25kZWQgdG8gb24gdGhlIEV2ZW50QWNrUXVldWUgcXVldWUgKHEgIzMpIGluIHRoZSBDb250cm9sVm0gY2hhbm5lbAorICovCit0eXBlZGVmIGVudW0gIHsKKwlDT05UUk9MVk1fSU5WQUxJRCA9IDAsCisJLyogU1dJVENIIGNvbW1hbmRzIHJlcXVpcmVkIFBhcmFtZXRlcjogU3dpdGNoTnVtYmVyICAqLworCS8qIEJVUyBjb21tYW5kcyByZXF1aXJlZCBQYXJhbWV0ZXI6IEJ1c051bWJlciAgKi8KKwlDT05UUk9MVk1fQlVTX0NSRUFURSA9IDB4MTAxLAkvKiBDUCAtLT4gU1AsIEdQICovCisJQ09OVFJPTFZNX0JVU19ERVNUUk9ZID0gMHgxMDIsCS8qIENQIC0tPiBTUCwgR1AgKi8KKwlDT05UUk9MVk1fQlVTX0NPTkZJR1VSRSA9IDB4MTA0LAkvKiBDUCAtLT4gU1AgKi8KKwlDT05UUk9MVk1fQlVTX0NIQU5HRVNUQVRFID0gMHgxMDUsCS8qIENQIC0tPiBTUCwgR1AgKi8KKwlDT05UUk9MVk1fQlVTX0NIQU5HRVNUQVRFX0VWRU5UID0gMHgxMDYsIC8qIFNQLCBHUCAtLT4gQ1AgKi8KKy8qIERFVklDRSBjb21tYW5kcyByZXF1aXJlZCBQYXJhbWV0ZXI6IEJ1c051bWJlciwgRGV2aWNlTnVtYmVyICAqLworCisJQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgPSAweDIwMSwJLyogQ1AgLS0+IFNQLCBHUCAqLworCUNPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSA9IDB4MjAyLAkvKiBDUCAtLT4gU1AsIEdQICovCisJQ09OVFJPTFZNX0RFVklDRV9DT05GSUdVUkUgPSAweDIwMywJLyogQ1AgLS0+IFNQICovCisJQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSA9IDB4MjA0LAkvKiBDUCAtLT4gU1AsIEdQICovCisJQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURV9FVkVOVCA9IDB4MjA1LCAvKiBTUCwgR1AgLS0+IENQICovCisJQ09OVFJPTFZNX0RFVklDRV9SRUNPTkZJR1VSRSA9IDB4MjA2LAkvKiBDUCAtLT4gQm9vdCAqLworLyogRElTSyBjb21tYW5kcyByZXF1aXJlZCBQYXJhbWV0ZXI6IEJ1c051bWJlciwgRGV2aWNlTnVtYmVyICAqLworCUNPTlRST0xWTV9ESVNLX0NSRUFURSA9IDB4MjIxLAkvKiBDUCAtLT4gU1AgKi8KKwlDT05UUk9MVk1fRElTS19ERVNUUk9ZID0gMHgyMjIsCS8qIENQIC0tPiBTUCAqLworCUNPTlRST0xWTV9ESVNLX0NPTkZJR1VSRSA9IDB4MjIzLAkvKiBDUCAtLT4gU1AgKi8KKwlDT05UUk9MVk1fRElTS19DSEFOR0VTVEFURSA9IDB4MjI0LAkvKiBDUCAtLT4gU1AgKi8KKy8qIENISVBTRVQgY29tbWFuZHMgKi8KKwlDT05UUk9MVk1fQ0hJUFNFVF9JTklUID0gMHgzMDEsCS8qIENQIC0tPiBTUCwgR1AgKi8KKwlDT05UUk9MVk1fQ0hJUFNFVF9TVE9QID0gMHgzMDIsCS8qIENQIC0tPiBTUCwgR1AgKi8KKwlDT05UUk9MVk1fQ0hJUFNFVF9TSFVURE9XTiA9IDB4MzAzLAkvKiBDUCAtLT4gU1AgKi8KKwlDT05UUk9MVk1fQ0hJUFNFVF9SRUFEWSA9IDB4MzA0LAkvKiBDUCAtLT4gU1AgKi8KKwlDT05UUk9MVk1fQ0hJUFNFVF9TRUxGVEVTVCA9IDB4MzA1LAkvKiBDUCAtLT4gU1AgKi8KKworfSBDT05UUk9MVk1fSUQ7CisKK3N0cnVjdCBJbnRlcnJ1cHRJbmZvIHsKKwkgLyoqPCBzcGVjaWZpZXMgaW50ZXJydXB0IGluZm8uIEl0IGlzIHVzZWQgdG8gc2VuZCBpbnRlcnJ1cHRzCisJICAqICAgZm9yIHRoaXMgY2hhbm5lbC4gVGhlIHBlZXIgYXQgdGhlIGVuZCBvZiB0aGlzIGNoYW5uZWwKKwkgICogICB3aG8gaGFzIHJlZ2lzdGVyZWQgYW4gaW50ZXJydXB0ICh1c2luZyByZWN2IGZpZWxkcworCSAgKiAgIGFib3ZlKSB3aWxsIHJlY2VpdmUgdGhlIGludGVycnVwdC4gUGFzc2VkIGFzIGEgcGFyYW1ldGVyCisJICAqICAgdG8gSXNzdWVfVk1DQUxMX0lPX1FVRVVFX1RSQU5TSVRJT04sIHdoaWNoIGdlbmVyYXRlcyB0aGUKKwkgICogICBpbnRlcnJ1cHQuICBDdXJyZW50bHkgdGhpcyBpcyB1c2VkIGJ5IElPUGFydC1TUCB0byB3YWtlCisJICAqICAgdXAgR1Agd2hlbiBEYXRhIENoYW5uZWwgdHJhbnNpdGlvbnMgZnJvbSBlbXB0eSB0bworCSAgKiAgIG5vbi1lbXB0eS4qLworCVU2NCBzZW5kSW50ZXJydXB0SGFuZGxlOworCisJIC8qKjwgc3BlY2lmaWVzIGludGVycnVwdCBoYW5kbGUuIEl0IGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlCisJICAqICAgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQgcGluIGZyb20gTW9uaXRvcjsgYW5kIHRoZQorCSAgKiAgIGludGVycnVwdCBwaW4gaXMgdXNlZCB0byBjb25uZWN0IHRvIHRoZSBjb3JyZXNwb25kaW5nCisJICAqICAgaW50cnJ1cHQuICBVc2VkIGJ5IElPUGFydC1HUCBvbmx5LiAqLworCVU2NCByZWN2SW50ZXJydXB0SGFuZGxlOworCisJIC8qKjwgc3BlY2lmaWVzIGludGVycnVwdCB2ZWN0b3IuIEl0LCBpbnRlcnJ1cHQgcGluLCBhbmQgc2hhcmVkIGFyZQorCSAgKiAgIHVzZWQgdG8gY29ubmVjdCB0byB0aGUgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQuICBVc2VkIGJ5CisJICAqICAgSU9QYXJ0LUdQIG9ubHkuICovCisJVTMyIHJlY3ZJbnRlcnJ1cHRWZWN0b3I7CisKKyAgICAvKio8IHNwZWNpZmllcyBpZiB0aGUgcmVjdkludGVycnVwdCBpcyBzaGFyZWQuICBJdCwgaW50ZXJydXB0IHBpbgorICAgICAqICAgYW5kIHZlY3RvciBhcmUgdXNlZCB0byBjb25uZWN0IHRvIDAgPSBub3Qgc2hhcmVkOyAxID0gc2hhcmVkLgorICAgICAqICAgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0LiAgVXNlZCBieSBJT1BhcnQtR1Agb25seS4gKi8KKwlVOCByZWN2SW50ZXJydXB0U2hhcmVkOworCVU4IHJlc2VydmVkWzNdOwkvKiBOYXR1cmFsIGFsaWdubWVudCBwdXJwb3NlcyAqLworfTsKKworc3RydWN0IFBjaUlkIHsKKwlVMTYgRG9tYWluOworCVU4IEJ1czsKKwlVOCBTbG90OworCVU4IEZ1bmM7CisJVTggUmVzZXJ2ZWRbM107CS8qIE5hdHVyYWwgYWxpZ25tZW50IHB1cnBvc2VzICovCit9OworCitzdHJ1Y3QgUGNpQ29uZmlnSGRyIHsKKwlVMTYgVmVuZG9ySWQ7CisJVTE2IFN1YlN5c1ZlbmRvcjsKKwlVMTYgRGV2aWNlSWQ7CisJVTE2IFN1YlN5c0RldmljZTsKKwlVMzIgQ2xhc3NDb2RlOworCVUzMiBSZXNlcnZlZDsJCS8qIE5hdHVyYWwgYWxpZ25tZW50IHB1cnBvc2VzICovCit9OworCitzdHJ1Y3QgU2NzaUlkIHsKKwlVMzIgQnVzOworCVUzMiBUYXJnZXQ7CisJVTMyIEx1bjsKKwlVMzIgSG9zdDsgLyogQ29tbWFuZCBzaG91bGQgaWdub3JlIHRoaXMgZm9yICoKKwkJICAgKiBEaXNrQXJyaXZhbC9SZW1vdmFsRXZlbnRzICovCit9OworCitzdHJ1Y3QgV1dJRCB7CisJVTMyIHd3aWQxOworCVUzMiB3d2lkMjsKK307CisKK3N0cnVjdCB2aXJ0RGlza0luZm8gIHsKKwlVMzIgc3dpdGNoTm87CQkvKiBkZWZpbmVkIGJ5IFNXSVRDSF9DUkVBVEUgKi8KKwlVMzIgZXh0ZXJuYWxQb3J0Tm87CS8qIDAgZm9yIFNBUyBSQUlEIHByb3ZpZGVkIChleHRlcm5hbCkKKwkJCQkgKiB2aXJ0dWFsIGRpc2tzLCAxIGZvciB2aXJ0dWFsIGRpc2sKKwkJCQkgKiBpbWFnZXMsIDIgZm9yIGdvbGQgZGlzayBpbWFnZXMgKi8KKwlVMTYgVmlydHVhbERpc2tJbmRleDsJLyogSW5kZXggb2YgZGlzayBkZXNjcmlwdG9yIGluIHRoZQorCQkJCSAqIFZpcnR1YWxEaXNrIHNlZ21lbnQgYXNzb2NpYXRlZCB3aXRoCisJCQkJICogZXh0ZXJuYWxQb3J0Tm8gKi8KKwlVMTYgUmVzZXJ2ZWQxOworCVUzMiBSZXNlcnZlZDI7Cit9OworCit0eXBlZGVmIGVudW0geworCUNPTlRST0xWTV9BQ1RJT05fTk9ORSA9IDAsCisJQ09OVFJPTFZNX0FDVElPTl9TRVRfUkVTVE9SRSA9IDB4MDVFNywKKwlDT05UUk9MVk1fQUNUSU9OX0NMRUFSX1JFU1RPUkUgPSAweDBDMTgsCisJQ09OVFJPTFZNX0FDVElPTl9SRVNUT1JJTkcgPSAweDA4RTUsCisJQ09OVFJPTFZNX0FDVElPTl9SRVNUT1JFX0JVU1kgPSAweDA5OTksCisJQ09OVFJPTFZNX0FDVElPTl9DTEVBUl9OVlJBTSA9IDB4QjAxCit9IENPTlRST0xWTV9BQ1RJT047CisKK3R5cGVkZWYgZW51bSBfVUxUUkFfVE9PTF9BQ1RJT05TIHsKKwkgICAgLyogZW51bWVyYXRpb24gdGhhdCBkZWZpbmVzIGludGVuZGVkIGFjdGlvbiAgKi8KKwkgICAgVUxUUkFfVE9PTF9BQ1RJT05fTk9ORSA9IDAsCS8qIG5vcm1hbCBib290IG9mIGJvb3QgZGlzayAqLworCVVMVFJBX1RPT0xfQUNUSU9OX0lOU1RBTEwgPSAxLAkvKiBpbnN0YWxsIHNvdXJjZSBkaXNrKHMpIHRvIGJvb3QKKwkJCQkJICogZGlzayAqLworCVVMVFJBX1RPT0xfQUNUSU9OX0NBUFRVUkUgPSAyLAkvKiBjYXB0dXJlIGJvb3QgZGlzayB0byB0YXJnZXQgZGlzayhzKQorCQkJCQkgKiBhcyAnZ29sZCBpbWFnZScgKi8KKwlVTFRSQV9UT09MX0FDVElPTl9SRVBBSVIgPSAzLAkvKiB1c2Ugc291cmNlIGRpc2socykgdG8gcmVwYWlyCisJCQkJCSAqIGluc3RhbGxhdGlvbiBvbiBib290IGRpc2sgKi8KKwlVTFRSQV9UT09MX0FDVElPTl9DTEVBTiA9IDQsCS8qICdzY3J1YicgdmlydHVhbCBkaXNrIGJlZm9yZQorCQkJCQkgKiByZWxlYXNpbmcgYmFjayB0byBzdG9yYWdlIHBvb2wgKi8KKwlVTFRSQV9UT09MX0FDVElPTl9VUEdSQURFID0gNSwJLyogdXBncmFkZSB0byB1c2UgY29udGVudCBvZiBpbWFnZXMKKwkJCQkJICogcmVmZXJlbmNlZCBmcm9tIG5ld2VyIGJsdWVwcmludCAqLworCVVMVFJBX1RPT0xfQUNUSU9OX0RJQUcgPSA2LAkvKiB1c2UgdG9vbCB0byBpbnZva2UgZGlhZ25vc3RpYyBzY3JpcHQKKwkJCQkJICogcHJvdmlkZWQgYnkgYmx1ZXByaW50ICovCisJVUxUUkFfVE9PTF9BQ1RJT05fRkFJTEVEID0gNywJLyogdXNlZCB3aGVuIHRvb2wgZmFpbHMgaW5zdGFsbGF0aW9uCisJCQkJCSAgIGFuZCBjYW5ub3QgY29udGludWUgKi8KKwlVTFRSQV9UT09MX0FDVElPTl9DT1VOVCA9IDgKK30gVUxUUkFfVE9PTF9BQ1RJT05TOworCit0eXBlZGVmIHN0cnVjdCBfVUxUUkFfRUZJX1NQQVJfSU5ESUNBVElPTiAgeworCVU2NCBCb290VG9GaXJtd2FyZVVJOjE7CS8qIEJpdCAwOiBTdG9wIGluIHVlZmkgdWkgKi8KKwlVNjQgQ2xlYXJOdnJhbToxOwkvKiBCaXQgMTogQ2xlYXIgTlZSQU0gKi8KKwlVNjQgQ2xlYXJDbW9zOjE7CS8qIEJpdCAyOiBDbGVhciBDTU9TICovCisJVTY0IEJvb3RUb1Rvb2w6MTsJLyogQml0IDM6IFJ1biBpbnN0YWxsIHRvb2wgKi8KKwkvKiByZW1haW5pbmcgYml0cyBhcmUgYXZhaWxhYmxlICovCit9IFVMVFJBX0VGSV9TUEFSX0lORElDQVRJT047CisKK3R5cGVkZWYgZW51bSB7CisJVUxUUkFfQ0hJUFNFVF9GRUFUVVJFX1JFUExZID0gMHgwMDAwMDAwMSwKKwlVTFRSQV9DSElQU0VUX0ZFQVRVUkVfUEFSQV9IT1RQTFVHID0gMHgwMDAwMDAwMiwKKwlVTFRSQV9DSElQU0VUX0ZFQVRVUkVfUENJVkJVUyA9IDB4MDAwMDAwMDQKK30gVUxUUkFfQ0hJUFNFVF9GRUFUVVJFOworCisvKiogVGhpcyBpcyB0aGUgY29tbW9uIHN0cnVjdHVyZSB0aGF0IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkKKyAqICBDb250cm9sVm0gbWVzc2FnZSAoYm90aCBjb21tYW5kcyBhbmQgcmVzcG9uc2VzKSBpbiBhbnkgQ29udHJvbFZtCisgKiAgcXVldWUuICBDb21tYW5kcyBhcmUgZWFzaWx5IGRpc3Rpbmd1aXNoZWQgZnJvbSByZXNwb25zZXMgYnkKKyAqICBsb29raW5nIGF0IHRoZSBmbGFncy5yZXNwb25zZSBmaWVsZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX0NPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAgeworCVUzMiBJZDsJCS8qIFNlZSBDT05UUk9MVk1fSUQuICovCisJLyogRm9yIHJlcXVlc3RzLCBpbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgdHlwZS4gKi8KKwkvKiBGb3IgcmVzcG9uc2VzLCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgbWVzc2FnZSB3ZSBhcmUgcmVzcG9uZGluZyB0by4gKi8KKworCVUzMiBNZXNzYWdlU2l6ZTsJLyogSW5jbHVkZXMgc2l6ZSBvZiB0aGlzIHN0cnVjdCArIHNpemUKKwkJCQkgKiBvZiBtZXNzYWdlICovCisJVTMyIFNlZ21lbnRJbmRleDsJLyogSW5kZXggb2Ygc2VnbWVudCBjb250YWluaW5nIFZtCisJCQkJICogbWVzc2FnZS9pbmZvcm1hdGlvbiAqLworCVUzMiBDb21wbGV0aW9uU3RhdHVzOwkvKiBFcnJvciBzdGF0dXMgY29kZSBvciByZXN1bHQgb2YKKwkJCQkgKiBtZXNzYWdlIGNvbXBsZXRpb24gKi8KKwlzdHJ1Y3QgIHsKKwkJVTMyIGZhaWxlZDoxOwkJICAgLyoqPCA9MSBpbiBhIHJlc3BvbnNlIHRvICogc2lnbmlmeQorCQkJCQkgICAgKiBmYWlsdXJlICovCisJCVUzMiByZXNwb25zZUV4cGVjdGVkOjE7ICAgLyoqPCA9MSBpbiBhbGwgbWVzc2FnZXMgdGhhdCBleHBlY3QgYQorCQkJCQkgICAqIHJlc3BvbnNlIChDb250cm9sIGlnbm9yZXMgdGhpcworCQkJCQkgICAqIGJpdCkgKi8KKwkJVTMyIHNlcnZlcjoxOwkJICAgLyoqPCA9MSBpbiBhbGwgYnVzICYgZGV2aWNlLXJlbGF0ZWQKKwkJCQkJICAgICogbWVzc2FnZXMgd2hlcmUgdGhlIG1lc3NhZ2UKKwkJCQkJICAgICogcmVjZWl2ZXIgaXMgdG8gYWN0IGFzIHRoZSBidXMgb3IKKwkJCQkJICAgICogZGV2aWNlIHNlcnZlciAqLworCQlVMzIgdGVzdE1lc3NhZ2U6MTsJICAgLyoqPCA9MSBmb3IgdGVzdGluZyB1c2Ugb25seQorCQkJCQkgICAgKiAoQ29udHJvbCBhbmQgQ29tbWFuZCBpZ25vcmUgdGhpcworCQkJCQkgICAgKiBiaXQpICovCisJCVUzMiBwYXJ0aWFsQ29tcGxldGlvbjoxOyAgLyoqPCA9MSBpZiB0aGVyZSBhcmUgZm9ydGhjb21pbmcKKwkJCQkJICAgKiByZXNwb25zZXMvYWNrcyBhc3NvY2lhdGVkCisJCQkJCSAgICogd2l0aCB0aGlzIG1lc3NhZ2UgKi8KKwkJVTMyIHByZXNlcnZlOjE7CSAgICAgICAvKio8ID0xIHRoaXMgaXMgdG8gbGV0IHVzIGtub3cgdG8KKwkJCQkJKiBwcmVzZXJ2ZSBjaGFubmVsIGNvbnRlbnRzCisJCQkJCSogKGZvciBydW5uaW5nIGd1ZXN0cykqLworCQlVMzIgd3JpdGVySW5EaWFnOjE7CS8qKjwgPTEgdGhlIERpYWdXcml0ZXIgaXMgYWN0aXZlIGluIHRoZQorCQkJCQkgKiBEaWFnbm9zdGljIFBhcnRpdGlvbiovCisKKwkJICAgIC8qIHJlbWFpbmluZyBiaXRzIGluIHRoaXMgMzItYml0IHdvcmQgYXJlIGF2YWlsYWJsZSAqLworCX0gRmxhZ3M7CisJVTMyIFJlc2VydmVkOwkJLyogTmF0dXJhbCBhbGlnbm1lbnQgKi8KKwlVNjQgTWVzc2FnZUhhbmRsZTsJLyogSWRlbnRpZmllcyB0aGUgcGFydGljdWxhciBtZXNzYWdlIGluc3RhbmNlLAorCQkJCSAqIGFuZCBpcyB1c2VkIHRvIG1hdGNoIHBhcnRpY3VsYXIgKi8KKwkvKiByZXF1ZXN0IGluc3RhbmNlcyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlIGluc3RhbmNlLiAqLworCVU2NCBQYXlsb2FkVm1PZmZzZXQ7CS8qIE9mZnNldCBvZiBwYXlsb2FkIGFyZWEgZnJvbSBzdGFydCBvZiB0aGlzCisJCQkJICogaW5zdGFuY2Ugb2YgQ29udHJvbFZtIHNlZ21lbnQgKi8KKwlVMzIgUGF5bG9hZE1heEJ5dGVzOwkvKiBNYXhpbXVtIGJ5dGVzIGFsbG9jYXRlZCBpbiBwYXlsb2FkCisJCQkJICogYXJlYSBvZiBDb250cm9sVm0gc2VnbWVudCAqLworCVUzMiBQYXlsb2FkQnl0ZXM7CS8qIEFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgb2YgcGF5bG9hZAorCQkJCSAqIGFyZWEgdG8gY29weSBiZXR3ZWVuIElPL0NvbW1hbmQ7ICovCisJLyogaWYgbm9uLXplcm8sIHRoZXJlIGlzIGEgcGF5bG9hZCB0byBjb3B5LiAqLworfSBDT05UUk9MVk1fTUVTU0FHRV9IRUFERVI7CisKK3R5cGVkZWYgc3RydWN0IF9DT05UUk9MVk1fUEFDS0VUX0RFVklDRV9DUkVBVEUgIHsKKwlVMzIgYnVzTm87CSAgIC8qKjwgYnVzICMgKDAuLm4tMSkgZnJvbSB0aGUgbXNnIHJlY2VpdmVyJ3MKKwkJCSAgICAqIHBlcnNwZWN0aXZlICovCisKKwkgICAgLyogQ29udHJvbCB1c2VzIGhlYWRlciBTZWdtZW50SW5kZXggZmllbGQgdG8gYWNjZXNzIGJ1cyBudW1iZXIuLi4gKi8KKwlVMzIgZGV2Tm87CSAgIC8qKjwgYnVzLXJlbGF0aXZlICgwLi5uLTEpIGRldmljZSBudW1iZXIgKi8KKwlVNjQgY2hhbm5lbEFkZHI7ICAvKio8IEd1ZXN0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGNoYW5uZWwsIHdoaWNoCisJCQkqICAgY2FuIGJlIGRlcmVmZXJlbmNlZCBieSB0aGUgcmVjZWl2ZXIKKwkJCSogICBvZiB0aGlzIENvbnRyb2xWbSBjb21tYW5kICovCisJVTY0IGNoYW5uZWxCeXRlczsgLyoqPCBzcGVjaWZpZXMgc2l6ZSBvZiB0aGUgY2hhbm5lbCBpbiBieXRlcyAqLworCUdVSUQgZGF0YVR5cGVHdWlkOy8qKjwgc3BlY2lmaWVzIGZvcm1hdCBvZiBkYXRhIGluIGNoYW5uZWwgKi8KKwlHVUlEIGRldkluc3RHdWlkOyAvKio8IGluc3RhbmNlIGd1aWQgZm9yIHRoZSBkZXZpY2UgKi8KKwlzdHJ1Y3QgSW50ZXJydXB0SW5mbyBpbnRyOyAvKio8IHNwZWNpZmllcyBpbnRlcnJ1cHQgaW5mb3JtYXRpb24gKi8KK30gQ09OVFJPTFZNX1BBQ0tFVF9ERVZJQ0VfQ1JFQVRFOwkvKiBmb3IgQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0NPTlRST0xWTV9QQUNLRVRfREVWSUNFX0NPTkZJR1VSRSAgeworCVUzMiBidXNObzsJICAgICAgLyoqPCBidXMgIyAoMC4ubi0xKSBmcm9tIHRoZSBtc2cKKwkJCSAgICAgICAqIHJlY2VpdmVyJ3MgcGVyc3BlY3RpdmUgKi8KKworCSAgICAvKiBDb250cm9sIHVzZXMgaGVhZGVyIFNlZ21lbnRJbmRleCBmaWVsZCB0byBhY2Nlc3MgYnVzIG51bWJlci4uLiAqLworCVUzMiBkZXZObzsJICAgICAgLyoqPCBidXMtcmVsYXRpdmUgKDAuLm4tMSkgZGV2aWNlIG51bWJlciAqLworfSBDT05UUk9MVk1fUEFDS0VUX0RFVklDRV9DT05GSUdVUkU7CS8qIGZvciBDT05UUk9MVk1fREVWSUNFX0NPTkZJR1VSRSAqLworCit0eXBlZGVmIHN0cnVjdCBfQ09OVFJPTFZNX01FU1NBR0VfREVWSUNFX0NSRUFURSAgeworCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBIZWFkZXI7CisJQ09OVFJPTFZNX1BBQ0tFVF9ERVZJQ0VfQ1JFQVRFIFBhY2tldDsKK30gQ09OVFJPTFZNX01FU1NBR0VfREVWSUNFX0NSRUFURTsJLyogdG90YWwgMTI4IGJ5dGVzICovCisKK3R5cGVkZWYgc3RydWN0IF9DT05UUk9MVk1fTUVTU0FHRV9ERVZJQ0VfQ09ORklHVVJFICB7CisJQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIEhlYWRlcjsKKwlDT05UUk9MVk1fUEFDS0VUX0RFVklDRV9DT05GSUdVUkUgUGFja2V0OworfSBDT05UUk9MVk1fTUVTU0FHRV9ERVZJQ0VfQ09ORklHVVJFOwkvKiB0b3RhbCA1NiBieXRlcyAqLworCisvKiBUaGlzIGlzIHRoZSBmb3JtYXQgZm9yIGEgbWVzc2FnZSBpbiBhbnkgQ29udHJvbFZtIHF1ZXVlLiAqLwordHlwZWRlZiBzdHJ1Y3QgX0NPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVCAgeworCXVuaW9uICB7CisKKwkJLyogQkVHSU4gUmVxdWVzdCBtZXNzYWdlcyAqLworCQlzdHJ1Y3QgIHsKKwkJCVUzMiBidXNObzsJICAgICAgLyo8IGJ1cyAjICgwLi5uLTEpIGZyb20gdGhlIG1zZworCQkJCQkgICAgICAgKiByZWNlaXZlcidzIHBlcnNwZWN0aXZlICovCisKKwkgICAgLyogQ29udHJvbCB1c2VzIGhlYWRlciBTZWdtZW50SW5kZXggZmllbGQgdG8gYWNjZXNzIGJ1cyBudW1iZXIuLi4gKi8KKwkJCVUzMiBkZXZpY2VDb3VudDsgICAgICAvKjwgaW5kaWNhdGVzIHRoZSBtYXggbnVtYmVyIG9mCisJCQkJCSAgICAgICAqIGRldmljZXMgb24gdGhpcyBidXMgKi8KKwkJCVU2NCBjaGFubmVsQWRkcjsgICAgIC8qPCBHdWVzdCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZQorCQkJCQkgICAgICAqICAgY2hhbm5lbCwgd2hpY2ggY2FuIGJlCisJCQkJCSAgICAgICogICBkZXJlZmVyZW5jZWQgYnkgdGhlIHJlY2VpdmVyCisJCQkJCSAgICAgICogICBvZiB0aGlzIENvbnRyb2xWbSBjb21tYW5kICovCisJCQlVNjQgY2hhbm5lbEJ5dGVzOyAgICAvKjwgc2l6ZSBvZiB0aGUgY2hhbm5lbCBpbiBieXRlcyAqLworCQkJR1VJRCBidXNEYXRhVHlwZUd1aWQ7Lyo8IGluZGljYXRlcyBmb3JtYXQgb2YgZGF0YSBpbiBidXMKKwkJCQkJICAgICAgKiBjaGFubmVsICovCisJCQlHVUlEIGJ1c0luc3RHdWlkOyAgICAvKjwgaW5zdGFuY2UgZ3VpZCBmb3IgdGhlIGJ1cyAqLworCQl9IGNyZWF0ZUJ1czsJLyogZm9yIENPTlRST0xWTV9CVVNfQ1JFQVRFICovCisJCXN0cnVjdCAgeworCQkJVTMyIGJ1c05vOwkgICAgICAvKjwgYnVzICMgKDAuLm4tMSkgZnJvbSB0aGUgbXNnCisJCQkJCSAgICAgICAqIHJlY2VpdmVyJ3MgcGVyc3BlY3RpdmUgKi8KKworCSAgICAvKiBDb250cm9sIHVzZXMgaGVhZGVyIFNlZ21lbnRJbmRleCBmaWVsZCB0byBhY2Nlc3MgYnVzIG51bWJlci4uLiAqLworCQkJVTMyIHJlc2VydmVkOwkvKiBOYXR1cmFsIGFsaWdubWVudCBwdXJwb3NlcyAqLworCQl9IGRlc3Ryb3lCdXM7CS8qIGZvciBDT05UUk9MVk1fQlVTX0RFU1RST1kgKi8KKwkJc3RydWN0ICB7CisJCQlVMzIgYnVzTm87CQkgICAgLyo8IGJ1cyAjICgwLi5uLTEpIGZyb20gdGhlCisJCQkJCQkgICAgICogbXNnIHJlY2VpdmVyJ3MKKwkJCQkJCSAgICAgKiBwZXJzcGVjdGl2ZSAqLworCisJICAgIC8qIENvbnRyb2wgdXNlcyBoZWFkZXIgU2VnbWVudEluZGV4IGZpZWxkIHRvIGFjY2VzcyBidXMgbnVtYmVyLi4uICovCisJCQlVMzIgcmVzZXJ2ZWQxOwkJICAgIC8qIGZvciBhbGlnbm1lbnQgcHVycG9zZXMgKi8KKwkJCVU2NCBndWVzdEhhbmRsZTsJICAgIC8qIFRoaXMgaXMgdXNlZCB0byBjb252ZXJ0CisJCQkJCSAqICBndWVzdCBwaHlzaWNhbCBhZGRyZXNzIHRvIHJlYWwKKwkJCQkJICogIHBoeXNpY2FsIGFkZHJlc3MgZm9yIERNQSwgZm9yIGV4LiAqLworCQkJVTY0IHJlY3ZCdXNJbnRlcnJ1cHRIYW5kbGU7Lyo8IHNwZWNpZmllcyBpbnRlcnJ1cHQKKwkJCQkJICogICBpbmZvLiBJdCBpcyB1c2VkIGJ5IFNQIHRvIHJlZ2lzdGVyCisJCQkJCSAqICAgdG8gcmVjZWl2ZSBpbnRlcnJ1cHRzIGZyb20gdGhlIENQLgorCQkJCQkgKiAgIFRoaXMgaW50ZXJydXB0IGlzIHVzZWQgZm9yIGJ1cworCQkJCQkgKiAgIGxldmVsIG5vdGlmaWNhdGlvbnMuICBUaGUKKwkJCQkJICogICBjb3JyZXNwb25kaW5nCisJCQkJCSAqICAgc2VuZEJ1c0ludGVycnVwdEhhbmRsZSBpcyBrZXB0IGluCisJCQkJCSAqICAgQ1AuICovCisJCX0gY29uZmlndXJlQnVzOwkvKiBmb3IgQ09OVFJPTFZNX0JVU19DT05GSUdVUkUgKi8KKworCQkvKiBmb3IgQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgKi8KKwkJQ09OVFJPTFZNX1BBQ0tFVF9ERVZJQ0VfQ1JFQVRFIGNyZWF0ZURldmljZTsKKwkJc3RydWN0ICB7CisJCQlVMzIgYnVzTm87CSAgICAgIC8qPCBidXMgIyAoMC4ubi0xKSBmcm9tIHRoZSBtc2cKKwkJCQkJICAgICAgICogcmVjZWl2ZXIncyBwZXJzcGVjdGl2ZSAqLworCisJICAgIC8qIENvbnRyb2wgdXNlcyBoZWFkZXIgU2VnbWVudEluZGV4IGZpZWxkIHRvIGFjY2VzcyBidXMgbnVtYmVyLi4uICovCisJCQlVMzIgZGV2Tm87CSAgICAgIC8qPCBidXMtcmVsYXRpdmUgKDAuLm4tMSkgZGV2aWNlCisJCQkJCSAgICAgICAqIG51bWJlciAqLworCQl9IGRlc3Ryb3lEZXZpY2U7CS8qIGZvciBDT05UUk9MVk1fREVWSUNFX0RFU1RST1kgKi8KKworCQkvKiBmb3IgQ09OVFJPTFZNX0RFVklDRV9DT05GSUdVUkUgKi8KKwkJQ09OVFJPTFZNX1BBQ0tFVF9ERVZJQ0VfQ09ORklHVVJFIGNvbmZpZ3VyZURldmljZTsKKwkJc3RydWN0ICB7CisJCQlVMzIgYnVzTm87CSAgICAgIC8qPCBidXMgIyAoMC4ubi0xKSBmcm9tIHRoZSBtc2cKKwkJCQkJICAgICAgICogcmVjZWl2ZXIncyBwZXJzcGVjdGl2ZSAqLworCisJICAgIC8qIENvbnRyb2wgdXNlcyBoZWFkZXIgU2VnbWVudEluZGV4IGZpZWxkIHRvIGFjY2VzcyBidXMgbnVtYmVyLi4uICovCisJCQlVMzIgZGV2Tm87CSAgICAgIC8qPCBidXMtcmVsYXRpdmUgKDAuLm4tMSkgZGV2aWNlCisJCQkJCSAgICAgICAqIG51bWJlciAqLworCQl9IHJlY29uZmlndXJlRGV2aWNlOwkvKiBmb3IgQ09OVFJPTFZNX0RFVklDRV9SRUNPTkZJR1VSRSAqLworCQlzdHJ1Y3QgIHsKKwkJCVUzMiBidXNObzsKKwkJCVVMVFJBX1NFR01FTlRfU1RBVEUgc3RhdGU7CisJCQlVOCByZXNlcnZlZFsyXTsJLyogTmF0dXJhbCBhbGlnbm1lbnQgcHVycG9zZXMgKi8KKwkJfSBidXNDaGFuZ2VTdGF0ZTsJLyogZm9yIENPTlRST0xWTV9CVVNfQ0hBTkdFU1RBVEUgKi8KKwkJc3RydWN0ICB7CisJCQlVMzIgYnVzTm87CisJCQlVMzIgZGV2Tm87CisJCQlVTFRSQV9TRUdNRU5UX1NUQVRFIHN0YXRlOworCQkJc3RydWN0ICB7CisJCQkJVTMyIHBoeXNpY2FsRGV2aWNlOjE7CS8qID0xIGlmIG1lc3NhZ2UgaXMgZm9yCisJCQkJCQkJICogYSBwaHlzaWNhbCBkZXZpY2UgKi8KKwkJCS8qIHJlbWFpbmluZyBiaXRzIGluIHRoaXMgMzItYml0IHdvcmQgYXJlIGF2YWlsYWJsZSAqLworCQkJfSBmbGFnczsKKwkJCVU4IHJlc2VydmVkWzJdOwkvKiBOYXR1cmFsIGFsaWdubWVudCBwdXJwb3NlcyAqLworCQl9IGRldmljZUNoYW5nZVN0YXRlOwkvKiBmb3IgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSAqLworCQlzdHJ1Y3QgIHsKKwkJCVUzMiBidXNObzsKKwkJCVUzMiBkZXZObzsKKwkJCVVMVFJBX1NFR01FTlRfU1RBVEUgc3RhdGU7CisJCQlVOCByZXNlcnZlZFs2XTsJLyogTmF0dXJhbCBhbGlnbm1lbnQgcHVycG9zZXMgKi8KKwkJfSBkZXZpY2VDaGFuZ2VTdGF0ZUV2ZW50OyAvKiBmb3IgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURV9FVkVOVCAqLworCQlzdHJ1Y3QgIHsKKwkJCVUzMiBidXNDb3VudDsgLyo8IGluZGljYXRlcyB0aGUgbWF4IG51bWJlciBvZiBidXNzZXMgKi8KKwkJCVUzMiBzd2l0Y2hDb3VudDsgLyo8IGluZGljYXRlcyB0aGUgbWF4IG51bWJlciBvZgorCQkJCQkgICogICBzd2l0Y2hlcyAoYXBwbGljYWJsZSBmb3Igc2VydmljZQorCQkJCQkgICogICBwYXJ0aXRpb24gb25seSkgKi8KKwkJCVVMVFJBX0NISVBTRVRfRkVBVFVSRSBmZWF0dXJlczsKKwkJCVUzMiBwbGF0Zm9ybU51bWJlcjsJLyogUGxhdGZvcm0gTnVtYmVyICovCisJCX0gaW5pdENoaXBzZXQ7CS8qIGZvciBDT05UUk9MVk1fQ0hJUFNFVF9JTklUICovCisJCXN0cnVjdCAgeworCQkJVTMyIE9wdGlvbnM7IC8qPCByZXNlcnZlZCAqLworCQkJVTMyIFRlc3Q7ICAgIC8qPCBiaXQgMCBzZXQgdG8gcnVuIGVtYmVkZGVkIHNlbGZ0ZXN0ICovCisJCX0gY2hpcHNldFNlbGZ0ZXN0OwkvKiBmb3IgQ09OVFJPTFZNX0NISVBTRVRfU0VMRlRFU1QgKi8KKworCQkgICAgLyogRU5EIFJlcXVlc3QgbWVzc2FnZXMgKi8KKworCQkgICAgLyogQkVHSU4gUmVzcG9uc2UgbWVzc2FnZXMgKi8KKworCQkgICAgLyogRU5EIFJlc3BvbnNlIG1lc3NhZ2VzICovCisKKwkJICAgIC8qIEJFR0lOIEV2ZW50IG1lc3NhZ2VzICovCisKKwkJICAgIC8qIEVORCBFdmVudCBtZXNzYWdlcyAqLworCisJCSAgICAvKiBCRUdJTiBBY2sgbWVzc2FnZXMgKi8KKworCQkgICAgLyogRU5EIEFjayBtZXNzYWdlcyAqLworCQlVNjQgYWRkcjsJICAgIC8qPCBhIHBoeXNpY2FsIGFkZHJlc3Mgb2Ygc29tZXRoaW5nLCB0aGF0CisJCQkJICAgICAqICAgY2FuIGJlIGRlcmVmZXJlbmNlZCBieSB0aGUgcmVjZWl2ZXIgb2YKKwkJCQkgICAgICogICB0aGlzIENvbnRyb2xWbSBjb21tYW5kIChkZXBlbmRzIG9uCisJCQkJICAgICAqICAgY29tbWFuZCBpZCkgKi8KKwkJVTY0IGhhbmRsZTsJICAgIC8qPCBhIGhhbmRsZSBvZiBzb21ldGhpbmcgKGRlcGVuZHMgb24KKwkJCQkgICAgICogY29tbWFuZCBpZCkgKi8KKwl9OworfSBDT05UUk9MVk1fTUVTU0FHRV9QQUNLRVQ7CisKKy8qIEFsbCBtZXNzYWdlcyBpbiBhbnkgQ29udHJvbFZtIHF1ZXVlIGhhdmUgdGhpcyBsYXlvdXQuICovCit0eXBlZGVmIHN0cnVjdCBfQ09OVFJPTFZNX01FU1NBR0UgIHsKKwlDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgaGRyOworCUNPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVCBjbWQ7Cit9IENPTlRST0xWTV9NRVNTQUdFOworCit0eXBlZGVmIHN0cnVjdCBfREVWSUNFX01BUCAgeworCUdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgRGV2aWNlQ2hhbm5lbEFkZHJlc3M7CisJVTY0IERldmljZUNoYW5uZWxTaXplOworCVUzMiBDQV9JbmRleDsKKwlVMzIgUmVzZXJ2ZWQ7CQkvKiBuYXR1cmFsIGFsaWdubWVudCAqLworCVU2NCBSZXNlcnZlZDI7CQkvKiBBbGlnbiBzdHJ1Y3R1cmUgb24gMzItYnl0ZSBib3VuZGFyeSAqLworfSBERVZJQ0VfTUFQOworCit0eXBlZGVmIHN0cnVjdCBfR1VFU1RfREVWSUNFUyAgeworCURFVklDRV9NQVAgVmlkZW9DaGFubmVsOworCURFVklDRV9NQVAgS2V5Ym9hcmRDaGFubmVsOworCURFVklDRV9NQVAgTmV0d29ya0NoYW5uZWw7CisJREVWSUNFX01BUCBTdG9yYWdlQ2hhbm5lbDsKKwlERVZJQ0VfTUFQIENvbnNvbGVDaGFubmVsOworCVUzMiBQYXJ0aXRpb25JbmRleDsKKwlVMzIgUGFkOworfSBHVUVTVF9ERVZJQ0VTOworCit0eXBlZGVmIHN0cnVjdCBfVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wgIHsKKwkgQ0hBTk5FTF9IRUFERVIgSGVhZGVyOworCSBHVUVTVF9QSFlTSUNBTF9BRERSRVNTIGdwQ29udHJvbFZtOwkvKiBndWVzdCBwaHlzaWNhbCBhZGRyZXNzIG9mCisJCQkJCQkgKiB0aGlzIGNoYW5uZWwgKi8KKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBncFBhcnRpdGlvblRhYmxlczsgLyogZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyBvZgorCQkJCQkJICAgICogcGFydGl0aW9uIHRhYmxlcyAqLworCSBHVUVTVF9QSFlTSUNBTF9BRERSRVNTIGdwRGlhZ0d1ZXN0OwkvKiBndWVzdCBwaHlzaWNhbCBhZGRyZXNzIG9mCisJCQkJCQkgKiBkaWFnbm9zdGljIGNoYW5uZWwgKi8KKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBncEJvb3RSb21EaXNrOwkvKiBndWVzdCBwaHlzIGFkZHIgb2YgKHJlYWQKKwkJCQkJCSAqIG9ubHkpIEJvb3QgUk9NIGRpc2sgKi8KKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBncEJvb3RSYW1EaXNrOwkvKiBndWVzdCBwaHlzIGFkZHIgb2Ygd3JpdGFibGUKKwkJCQkJCSAqIEJvb3QgUkFNIGRpc2sgKi8KKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBncEFjcGlUYWJsZTsJLyogZ3Vlc3QgcGh5cyBhZGRyIG9mIGFjcGkKKwkJCQkJCSAqIHRhYmxlICovCisJIEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgZ3BDb250cm9sQ2hhbm5lbDsgLyogZ3Vlc3QgcGh5cyBhZGRyIG9mIGNvbnRyb2wKKwkJCQkJCSAgICogY2hhbm5lbCAqLworCSBHVUVTVF9QSFlTSUNBTF9BRERSRVNTIGdwRGlhZ1JvbURpc2s7CS8qIGd1ZXN0IHBoeXMgYWRkciBvZiBkaWFnbm9zdGljCisJCQkJCQkgKiBST00gZGlzayAqLworCSBHVUVTVF9QSFlTSUNBTF9BRERSRVNTIGdwTnZyYW07CS8qIGd1ZXN0IHBoeXMgYWRkciBvZiBOVlJBTQorCQkJCQkJICogY2hhbm5lbCAqLworCSBVNjQgUmVxdWVzdFBheWxvYWRPZmZzZXQ7CS8qIE9mZnNldCB0byByZXF1ZXN0IHBheWxvYWQgYXJlYSAqLworCSBVNjQgRXZlbnRQYXlsb2FkT2Zmc2V0OwkvKiBPZmZzZXQgdG8gZXZlbnQgcGF5bG9hZCBhcmVhICovCisJIFUzMiBSZXF1ZXN0UGF5bG9hZEJ5dGVzOwkvKiBCeXRlcyBhdmFpbGFibGUgaW4gcmVxdWVzdCBwYXlsb2FkCisJCQkJCSAqIGFyZWEgKi8KKwkgVTMyIEV2ZW50UGF5bG9hZEJ5dGVzOwkvKiBCeXRlcyBhdmFpbGFibGUgaW4gZXZlbnQgcGF5bG9hZCBhcmVhICovCisJIFUzMiBDb250cm9sQ2hhbm5lbEJ5dGVzOworCSBVMzIgTnZyYW1DaGFubmVsQnl0ZXM7CS8qIEJ5dGVzIGluIFBhcnRpdGlvbk52cmFtIHNlZ21lbnQgKi8KKwkgVTMyIE1lc3NhZ2VCeXRlczsJLyogc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFKSAqLworCSBVMzIgTWVzc2FnZUNvdW50OwkvKiBDT05UUk9MVk1fTUVTU0FHRV9NQVggKi8KKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBncFNtYmlvc1RhYmxlOwkvKiBndWVzdCBwaHlzIGFkZHIgb2YgU01CSU9TCisJCQkJCQkgKiB0YWJsZXMgKi8KKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBncFBoeXNpY2FsU21iaW9zVGFibGU7CS8qIGd1ZXN0IHBoeXMgYWRkciBvZgorCQkJCQkJCSAqIFNNQklPUyB0YWJsZSAgKi8KKwkgLyogVUxUUkFfTUFYX0dVRVNUU19QRVJfU0VSVklDRSAqLworCSBHVUVTVF9ERVZJQ0VTIGdwT2Jzb2xldGVHdWVzdERldmljZXNbMTZdOworCisJIC8qIGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRUZJIGZpcm13YXJlIGltYWdlIGJhc2UgICovCisJIEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgVmlydHVhbEd1ZXN0RmlybXdhcmVJbWFnZUJhc2U7CisKKwkgLyogZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyBvZiBFRkkgZmlybXdhcmUgZW50cnkgcG9pbnQgICovCisJIEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgVmlydHVhbEd1ZXN0RmlybXdhcmVFbnRyeVBvaW50OworCisJIC8qIGd1ZXN0IEVGSSBmaXJtd2FyZSBpbWFnZSBzaXplICAqLworCSBVNjQgVmlydHVhbEd1ZXN0RmlybXdhcmVJbWFnZVNpemU7CisKKwkgLyogR1BBID0gMU1CIHdoZXJlIEVGSSBmaXJtd2FyZSBpbWFnZSBpcyBjb3BpZWQgdG8gICovCisJIEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgVmlydHVhbEd1ZXN0RmlybXdhcmVCb290QmFzZTsKKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBWaXJ0dWFsR3Vlc3RJbWFnZUJhc2U7CisJIEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgVmlydHVhbEd1ZXN0SW1hZ2VTaXplOworCSBVNjQgUHJvdG90eXBlQ29udHJvbENoYW5uZWxPZmZzZXQ7CisJIEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgVmlydHVhbEd1ZXN0UGFydGl0aW9uSGFuZGxlOworCisJIFUxNiBSZXN0b3JlQWN0aW9uOwkvKiBSZXN0b3JlIEFjdGlvbiBmaWVsZCB0byByZXN0b3JlIHRoZSBndWVzdAorCQkJCSAqIHBhcnRpdGlvbiAqLworCVUxNiBEdW1wQWN0aW9uOwkJLyogRm9yIFdpbmRvd3MgZ3Vlc3RzIGl0IHNob3dzIGlmIHRoZSB2aXNvcmRpc2sKKwkJCQkgKiBpcyBydW5uaW5nIGluIGR1bXAgbW9kZSAqLworCVUxNiBOdnJhbUZhaWxDb3VudDsKKwlVMTYgU2F2ZWRDcmFzaE1zZ0NvdW50OwkvKiA9IENPTlRST0xWTV9DUkFTSE1TR19NQVggKi8KKwlVMzIgU2F2ZWRDcmFzaE1zZ09mZnNldDsJLyogT2Zmc2V0IHRvIHJlcXVlc3QgcGF5bG9hZCBhcmVhIG5lZWRlZAorCQkJCQkgKiBmb3IgY3Jhc2ggZHVtcCAqLworCVUzMiBJbnN0YWxsYXRpb25FcnJvcjsJLyogVHlwZSBvZiBlcnJvciBlbmNvdW50ZXJlZCBkdXJpbmcKKwkJCQkgKiBpbnN0YWxsYXRpb24gKi8KKwlVMzIgSW5zdGFsbGF0aW9uVGV4dElkOwkvKiBJZCBvZiBzdHJpbmcgdG8gZGlzcGxheSAqLworCVUxNiBJbnN0YWxsYXRpb25SZW1haW5pbmdTdGVwczsJLyogTnVtYmVyIG9mIHJlbWFpbmluZyBpbnN0YWxsYXRpb24KKwkJCQkJICogc3RlcHMgKGZvciBwcm9ncmVzcyBiYXJzKSAqLworCVU4IFRvb2xBY3Rpb247CQkvKiBVTFRSQV9UT09MX0FDVElPTlMgSW5zdGFsbGF0aW9uIEFjdGlvbgorCQkJCSAqIGZpZWxkICovCisJVTggUmVzZXJ2ZWQ7CQkvKiBhbGlnbm1lbnQgKi8KKwlVTFRSQV9FRklfU1BBUl9JTkRJQ0FUSU9OIEVmaVNwYXJJbmRpY2F0aW9uOworCVVMVFJBX0VGSV9TUEFSX0lORElDQVRJT04gRWZpU3BhckluZGljYXRpb25TdXBwb3J0ZWQ7CisJVTMyIFNQUmVzZXJ2ZWQ7CisJVTggUmVzZXJ2ZWQyWzI4XTsJLyogRm9yY2Ugc2lnbmFscyB0byBiZWdpbiBvbiAxMjgtYnl0ZSBjYWNoZQorCQkJCSAqIGxpbmUgKi8KKwlTSUdOQUxfUVVFVUVfSEVBREVSIFJlcXVlc3RRdWV1ZTsJLyogU2VydmljZSBvciBndWVzdCBwYXJ0aXRpb24KKwkJCQkJCSAqIHVzZXMgdGhpcyBxdWV1ZSB0byBzZW5kCisJCQkJCQkgKiByZXF1ZXN0cyB0byBDb250cm9sICovCisJU0lHTkFMX1FVRVVFX0hFQURFUiBSZXNwb25zZVF1ZXVlOwkvKiBDb250cm9sIHVzZXMgdGhpcyBxdWV1ZSB0bworCQkJCQkJICogcmVzcG9uZCB0byBzZXJ2aWNlIG9yIGd1ZXN0CisJCQkJCQkgKiBwYXJ0aXRpb24gcmVxdWVzdHMgKi8KKwlTSUdOQUxfUVVFVUVfSEVBREVSIEV2ZW50UXVldWU7CQkvKiBDb250cm9sIHVzZXMgdGhpcyBxdWV1ZSB0bworCQkJCQkJICogc2VuZCBldmVudHMgdG8gc2VydmljZSBvcgorCQkJCQkJICogZ3Vlc3QgcGFydGl0aW9uICovCisJU0lHTkFMX1FVRVVFX0hFQURFUiBFdmVudEFja1F1ZXVlOwkvKiBTZXJ2aWNlIG9yIGd1ZXN0IHBhcnRpdGlvbgorCQkJCQkJICogdXNlcyB0aGlzIHF1ZXVlIHRvIGFjaworCQkJCQkJICogQ29udHJvbCBldmVudHMgKi8KKworCSAvKiBSZXF1ZXN0IGZpeGVkLXNpemUgbWVzc2FnZSBwb29sIC0gZG9lcyBub3QgaW5jbHVkZSBwYXlsb2FkICovCisJIENPTlRST0xWTV9NRVNTQUdFIFJlcXVlc3RNc2dbQ09OVFJPTFZNX01FU1NBR0VfTUFYXTsKKworCSAvKiBSZXNwb25zZSBmaXhlZC1zaXplIG1lc3NhZ2UgcG9vbCAtIGRvZXMgbm90IGluY2x1ZGUgcGF5bG9hZCAqLworCSBDT05UUk9MVk1fTUVTU0FHRSBSZXNwb25zZU1zZ1tDT05UUk9MVk1fTUVTU0FHRV9NQVhdOworCisJIC8qIEV2ZW50IGZpeGVkLXNpemUgbWVzc2FnZSBwb29sIC0gZG9lcyBub3QgaW5jbHVkZSBwYXlsb2FkICovCisJIENPTlRST0xWTV9NRVNTQUdFIEV2ZW50TXNnW0NPTlRST0xWTV9NRVNTQUdFX01BWF07CisKKwkgLyogQWNrIGZpeGVkLXNpemUgbWVzc2FnZSBwb29sIC0gZG9lcyBub3QgaW5jbHVkZSBwYXlsb2FkICovCisJIENPTlRST0xWTV9NRVNTQUdFIEV2ZW50QWNrTXNnW0NPTlRST0xWTV9NRVNTQUdFX01BWF07CisKKwkgLyogTWVzc2FnZSBzdG9yZWQgZHVyaW5nIElPVk0gY3JlYXRpb24gdG8gYmUgcmV1c2VkIGFmdGVyIGNyYXNoICovCisJIENPTlRST0xWTV9NRVNTQUdFIFNhdmVkQ3Jhc2hNc2dbQ09OVFJPTFZNX0NSQVNITVNHX01BWF07Cit9IFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MOworCisvKiBPZmZzZXRzIGZvciBWTSBjaGFubmVsIGF0dHJpYnV0ZXMuLi4gKi8KKyNkZWZpbmUgVk1fQ0hfUkVRX1FVRVVFX09GRlNFVCBcCisJb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsIFJlcXVlc3RRdWV1ZSkKKyNkZWZpbmUgVk1fQ0hfUkVTUF9RVUVVRV9PRkZTRVQgXAorCW9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLCBSZXNwb25zZVF1ZXVlKQorI2RlZmluZSBWTV9DSF9FVkVOVF9RVUVVRV9PRkZTRVQgXAorCW9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLCBFdmVudFF1ZXVlKQorI2RlZmluZSBWTV9DSF9BQ0tfUVVFVUVfT0ZGU0VUIFwKKwlvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwgRXZlbnRBY2tRdWV1ZSkKKyNkZWZpbmUgVk1fQ0hfUkVRX01TR19PRkZTRVQgXAorCW9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLCBSZXF1ZXN0TXNnKQorI2RlZmluZSBWTV9DSF9SRVNQX01TR19PRkZTRVQgXAorCW9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLCBSZXNwb25zZU1zZykKKyNkZWZpbmUgVk1fQ0hfRVZFTlRfTVNHX09GRlNFVCBcCisJb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsIEV2ZW50TXNnKQorI2RlZmluZSBWTV9DSF9BQ0tfTVNHX09GRlNFVCBcCisJb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsIEV2ZW50QWNrTXNnKQorI2RlZmluZSBWTV9DSF9DUkFTSF9NU0dfT0ZGU0VUIFwKKwlvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwgU2F2ZWRDcmFzaE1zZykKKworLyogVGhlIGZvbGxvd2luZyBoZWFkZXIgd2lsbCBiZSBsb2NhdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgUGF5bG9hZFZtT2Zmc2V0IGZvcgorICogIHZhcmlvdXMgQ29udHJvbFZtIGNvbW1hbmRzLiBUaGUgcmVjZWl2ZXIgb2YgYSBDb250cm9sVm0gY29tbWFuZCB3aXRoIGEKKyAqICBQYXlsb2FkVm1PZmZzZXQgd2lsbCBkZXJlZmVyZW5jZSB0aGlzIGFkZHJlc3MgYW5kIHRoZW4gdXNlIENvbm5lY3Rpb25PZmZzZXQsCisgKiAgSW5pdGlhdG9yT2Zmc2V0LCBhbmQgVGFyZ2V0T2Zmc2V0IHRvIGdldCB0aGUgbG9jYXRpb24gb2YgVVRGLTggZm9ybWF0dGVkCisgKiAgc3RyaW5ncyB0aGF0IGNhbiBiZSBwYXJzZWQgdG8gb2J0YWluIGNvbW1hbmQtc3BlY2lmaWMgaW5mb3JtYXRpb24uIFRoZSB2YWx1ZQorICogIG9mIFRvdGFsTGVuZ3RoIHNob3VsZCBlcXVhbCBQYXlsb2FkQnl0ZXMuICBUaGUgZm9ybWF0IG9mIHRoZSBzdHJpbmdzIGF0CisgKiAgUGF5bG9hZFZtT2Zmc2V0IHdpbGwgdGFrZSBkaWZmZXJlbnQgZm9ybXMgZGVwZW5kaW5nIG9uIHRoZSBtZXNzYWdlLiAgU2VlIHRoZQorICogIGZvbGxvd2luZyBXaWtpIHBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb246CisgKiAgaHR0cHM6Ly91c3RyLWxpbnV4LTEubmEudWlzLnVuaXN5cy5jb20vc3Bhci9pbmRleC5waHAvQ29udHJvbFZtX1BhcmFtZXRlcnNfQXJlYQorICovCit0eXBlZGVmIHN0cnVjdCBfVUxUUkFfQ09OVFJPTFZNX1BBUkFNRVRFUlNfSEVBREVSICB7CisJVTMyIFRvdGFsTGVuZ3RoOworCVUzMiBIZWFkZXJMZW5ndGg7CisJVTMyIENvbm5lY3Rpb25PZmZzZXQ7CisJVTMyIENvbm5lY3Rpb25MZW5ndGg7CisJVTMyIEluaXRpYXRvck9mZnNldDsKKwlVMzIgSW5pdGlhdG9yTGVuZ3RoOworCVUzMiBUYXJnZXRPZmZzZXQ7CisJVTMyIFRhcmdldExlbmd0aDsKKwlVMzIgQ2xpZW50T2Zmc2V0OworCVUzMiBDbGllbnRMZW5ndGg7CisJVTMyIE5hbWVPZmZzZXQ7CisJVTMyIE5hbWVMZW5ndGg7CisJR1VJRCBJZDsKKwlVMzIgUmV2aXNpb247CisJVTMyIFJlc2VydmVkOwkJLyogTmF0dXJhbCBhbGlnbm1lbnQgKi8KK30gVUxUUkFfQ09OVFJPTFZNX1BBUkFNRVRFUlNfSEVBREVSOworCisjZW5kaWYJCQkJLyogX19DT05UUk9MVk1DSEFOTkVMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2RpYWdjaGFubmVsLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvZGlhZ2NoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTM1MTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2RpYWdjaGFubmVsLmgKQEAgLTAsMCArMSw0MjcgQEAKKy8qIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyorKworICoKKyAqIE1vZHVsZSBOYW1lOgorICoKKyAqIGRpYWdjaGFubmVsLmgKKyAqCisgKiBBYnN0cmFjdDoKKyAqCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRGlhZ0NoYW5uZWwgcHJvdG9jb2wuICBUaGlzIHByb3RvY29sIGlzIHVzZWQgdG8gYWlkIGluCisgKiBwcmVzZXJ2aW5nIGV2ZW50IGRhdGEgc2VudCBieSBleHRlcm5hbCBhcHBsaWNhdGlvbnMuICBUaGlzIHByb3RvY29sIHByb3ZpZGVzCisgKiBhIHJlZ2lvbiBmb3IgZXZlbnQgZGF0YSB0byByZXNpZGUgaW4uICBUaGlzIGRhdGEgd2lsbCBldmVudHVhbGx5IGJlIHNlbnQgdG8KKyAqIHRoZSBCb290IFBhcnRpdGlvbiB3aGVyZSBpdCB3aWxsIGJlIGNvbW1pdHRlZCB0byBtZW1vcnkgYW5kL29yIGRpc2suICBUaGlzCisgKiBmaWxlIGNvbnRhaW5zIHBsYXRmb3JtLWluZGVwZW5kZW50IGRhdGEgdGhhdCBjYW4gYmUgYnVpbHQgdXNpbmcgYW55CisgKiBTdXBlcnZpc29yIGJ1aWxkIGVudmlyb25tZW50IChXaW5kb3dzLCBMaW51eCwgRUZJKS4KKyAqCisqLworCisjaWZuZGVmIF9ESUFHX0NIQU5ORUxfSF8KKyNkZWZpbmUgX0RJQUdfQ0hBTk5FTF9IXworCisjaW5jbHVkZSAiY29tbW9udHlwZXMuaCIKKyNpbmNsdWRlICJjaGFubmVsLmgiCisKKy8qIHtFRUE3QTU3My1EQjgyLTQ0N2MtODcxNi1FRkJFQUFBRTQ4NTh9ICovCisjZGVmaW5lIFVMVFJBX0RJQUdfQ0hBTk5FTF9QUk9UT0NPTF9HVUlEIFwKKwl7MHhlZWE3YTU3MywgMHhkYjgyLCAweDQ0N2MsIFwKKwkJezB4ODcsIDB4MTYsIDB4ZWYsIDB4YmUsIDB4YWEsIDB4YWUsIDB4NDgsIDB4NTh9IH0KKworc3RhdGljIGNvbnN0IEdVSUQgVWx0cmFEaWFnQ2hhbm5lbFByb3RvY29sR3VpZCA9CisJVUxUUkFfRElBR19DSEFOTkVMX1BST1RPQ09MX0dVSUQ7CisKKy8qIHtFODUwRjk2OC0zMjYzLTQ0ODQtOENBNS0yQTM1RDA4N0E1QTh9ICovCisjZGVmaW5lIFVMVFJBX0RJQUdfUk9PVF9DSEFOTkVMX1BST1RPQ09MX0dVSUQgXAorCXsweGU4NTBmOTY4LCAweDMyNjMsIDB4NDQ4NCwgXAorCQl7MHg4YywgMHhhNSwgMHgyYSwgMHgzNSwgMHhkMCwgMHg4NywgMHhhNSwgMHhhOH0gfQorCisjZGVmaW5lIFVMVFJBX0RJQUdfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUgIFVMVFJBX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFCisKKy8qIE11c3QgaW5jcmVtZW50IHRoaXMgd2hlbmV2ZXIgeW91IGluc2VydCBvciBkZWxldGUgZmllbGRzIHdpdGhpbiB0aGlzIGNoYW5uZWwKKyogc3RydWN0LiAgQWxzbyBpbmNyZW1lbnQgd2hlbmV2ZXIgeW91IGNoYW5nZSB0aGUgbWVhbmluZyBvZiBmaWVsZHMgd2l0aGluIHRoaXMKKyogY2hhbm5lbCBzdHJ1Y3Qgc28gYXMgdG8gYnJlYWsgcHJlLWV4aXN0aW5nIHNvZnR3YXJlLiAgTm90ZSB0aGF0IHlvdSBjYW4KKyogdXN1YWxseSBhZGQgZmllbGRzIHRvIHRoZSBFTkQgb2YgdGhlIGNoYW5uZWwgc3RydWN0IHdpdGhPVVQgbmVlZGluZyB0bworKiBpbmNyZW1lbnQgdGhpcy4gKi8KKyNkZWZpbmUgVUxUUkFfRElBR19DSEFOTkVMX1BST1RPQ09MX1ZFUlNJT05JRCAyCisKKyNkZWZpbmUgVUxUUkFfRElBR19DSEFOTkVMX09LX0NMSUVOVChwQ2hhbm5lbCwgbG9nQ3R4KQkJCVwKKwkoVUxUUkFfY2hlY2tfY2hhbm5lbF9jbGllbnQocENoYW5uZWwsCQkJCVwKKwkJCQkgICAgVWx0cmFEaWFnQ2hhbm5lbFByb3RvY29sR3VpZCwJXAorCQkJCSAgICAiZGlhZyIsCQkJCVwKKwkJCQkgICAgc2l6ZW9mKFVMVFJBX0RJQUdfQ0hBTk5FTF9QUk9UT0NPTCksIFwKKwkJCQkgICAgVUxUUkFfRElBR19DSEFOTkVMX1BST1RPQ09MX1ZFUlNJT05JRCwgXAorCQkJCSAgICBVTFRSQV9ESUFHX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFLCBcCisJCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgbG9nQ3R4KSkKKyNkZWZpbmUgVUxUUkFfRElBR19DSEFOTkVMX09LX1NFUlZFUihhY3R1YWxCeXRlcywgbG9nQ3R4KQkJXAorCShVTFRSQV9jaGVja19jaGFubmVsX3NlcnZlcihVbHRyYURpYWdDaGFubmVsUHJvdG9jb2xHdWlkLAlcCisJCQkJICAgICJkaWFnIiwJCQkJXAorCQkJCSAgICBzaXplb2YoVUxUUkFfRElBR19DSEFOTkVMX1BST1RPQ09MKSwgXAorCQkJCSAgICBhY3R1YWxCeXRlcywgX19GSUxFX18sIF9fTElORV9fLCBsb2dDdHgpKQorI2RlZmluZSBNQVhfTU9EVUxFX05BTUVfU0laRSAxMjgJLyogTWF4aW11bSBsZW5ndGggb2YgbW9kdWxlIG5hbWUuLi4gKi8KKyNkZWZpbmUgTUFYX0FERElUSU9OQUxfSU5GT19TSVpFIDI1NgkvKiBNYXhpbXVtIGxlbmd0aCBvZiBhbnkgYWRkaXRpb25hbCBpbmZvCisJCQkJCSAqIGFjY29tcGFueWluZyBldmVudC4uLiAqLworI2RlZmluZSBNQVhfU1VCU1lTVEVNUyA2NAkvKiBNYXhpbXVtIG51bWJlciBvZiBzdWJzeXN0ZW1zIGFsbG93ZWQgaW4KKwkJCQkgKiBEaWFnQ2hhbm5lbC4uLiAqLworI2RlZmluZSBMT1dfU1VCU1lTVEVNUyAzMgkvKiBIYWxmIG9mIE1BWF9TVUJTWVNURU1TIHRvIGFsbG93IDY0LWJpdAorCQkJCSAqIG1hdGggKi8KKyNkZWZpbmUgU1VCU1lTVEVNX0RFQlVHIDAJLyogU3RhbmRhcmQgc3Vic3lzdGVtIGZvciBkZWJ1ZyBldmVudHMgKi8KKyNkZWZpbmUgU1VCU1lTVEVNX0RFRkFVTFQgMQkvKiBEZWZhdWx0IHN1YnN5c3RlbSBmb3IgbGVnYWN5IGNhbGxzIHRvCisJCQkJICogUmVwb3J0RXZlbnQgKi8KKworLyogZmV3IHVzZWZ1bCBzdWJzeXN0ZW0gbWFzayB2YWx1ZXMgKi8KKyNkZWZpbmUgU1VCU1lTVEVNX01BU0tfREVCVUcJMHgwMQkvKiBTdGFuZGFyZCBzdWJzeXN0ZW0gZm9yIGRlYnVnCisJCQkJCSAqIGV2ZW50cyAqLworI2RlZmluZSBTVUJTWVNURU1fTUFTS19ERUZBVUxUICAweDAyCS8qIERlZmF1bHQgc3Vic3lzdGVtIGZvciBsZWdhY3kgY2FsbHMgdG8KKwkJCQkJICogUmVwb3J0RXZlbnRzICovCisKKy8qIEV2ZW50IHBhcmFtZXRlciAiU2V2ZXJpdHkiIGlzIG92ZXJsb2FkZWQgd2l0aCBDYXVzZSBpbiBieXRlIDIgYW5kIFNldmVyaXR5IGluCisgKiBieXRlIDAsIGJ5dGVzIDEgYW5kIDMgYXJlIHJlc2VydmVkICovCisjZGVmaW5lIFNFVkVSSVRZX01BU0sgMHgwRkYJLyogbWFzayBvdXQgYWxsIGJ1dCB0aGUgU2V2ZXJpdHkgaW4gYnl0ZSAwICovCisjZGVmaW5lIENBVVNFX01BU0sgMHgwRkYwMDAwCS8qIG1hc2sgb3V0IGFsbCBidXQgdGhlIGNhdXNlIGluIGJ5dGUgMiAqLworI2RlZmluZSBDQVVTRV9TSElGVF9BTVQgMTYJLyogc2hpZnQgMiBieXRlcyB0byBwbGFjZSBpdCBpbiBieXRlIDIgKi8KKworLyogU3Vic3lzdGVtU2V2ZXJpdHlGaWx0ZXIgKi8KKyNkZWZpbmUgU0VWRVJJVFlfRklMVEVSX01BU0sgMHgwRiAvKiBtYXNrIG91dCB0aGUgQ2F1c2UgaGFsZiwgU2V2ZXJpdHlGaWx0ZXIgaXMKKwkJCQkgICAqIGluIHRoZSBsb3dlciBuaWJibGUgKi8KKyNkZWZpbmUgQ0FVU0VfRklMVEVSX01BU0sgMHhGMAkvKiBtYXNrIG91dCB0aGUgU2V2ZXJpdHkgaGFsZiwgQ2F1c2VGaWx0ZXIgaXMgaW4KKwkJCQkgKiB0aGUgdXBwZXIgbmliYmxlICovCisjZGVmaW5lIENBVVNFX0ZJTFRFUl9TSElGVF9BTVQJNCAvKiBzaGlmdCBhbW91bnQgdG8gcGxhY2UgaXQgaW4gbG93ZXIgb3IgdXBwZXIKKwkJCQkgICAqIG5pYmJsZSAqLworCisvKiBDb3BpZWQgZnJvbSBFRkkncyBFRklfVElNRSBzdHJ1Y3QgaW4gZWZpZGVmLmguICBFRkkgaGVhZGVycyBhcmUgbm90IGFsbG93ZWQKKyogaW4gc29tZSBvZiB0aGUgU3VwZXJ2aXNvciBhcmVhcywgc3VjaCBhcyBNb25pdG9yLCBzbyBpdCBoYXMgYmVlbiAicG9ydGVkIiBoZXJlCisqIGZvciB1c2UgaW4gZGlhZ25vc3RpYyBldmVudCB0aW1lc3RhbXBzLi4uICovCit0eXBlZGVmIHN0cnVjdCBfRElBR19FRklfVElNRSAgeworCVUxNiBZZWFyOwkJLyogMTk5OCAtIDIwWFggKi8KKwlVOCBNb250aDsJCS8qIDEgLSAxMiAqLworCVU4IERheTsJCQkvKiAxIC0gMzEgKi8KKwlVOCBIb3VyOwkJLyogMCAtIDIzICovCisJVTggTWludXRlOwkJLyogMCAtIDU5ICovCisJVTggU2Vjb25kOwkJLyogMCAtIDU5ICovCisJVTggUGFkMTsKKwlVMzIgTmFub3NlY29uZDsJLyogMCAtIDk5OSwgOTk5LCA5OTkgKi8KKwlTMTYgVGltZVpvbmU7CQkvKiAtMTQ0MCB0byAxNDQwIG9yIDIwNDcgKi8KKwlVOCBEYXlsaWdodDsKKwlVOCBQYWQyOworfSBESUFHX0VGSV9USU1FOworCit0eXBlZGVmIGVudW0gIHsKKwkgVUxUUkFfQ09NUE9ORU5UX0dVRVNUID0gMCwKKwkgVUxUUkFfQ09NUE9ORU5UX01PTklUT1IgPSAweDAxLAorCSBVTFRSQV9DT01QT05FTlRfQ0NNID0gMHgwMiwJLyogQ29tbW9uIENvbnRyb2wgbW9kdWxlICovCisJIC8qIFJFU0VSVkVEIDB4MDMgLSAweDcgKi8KKworCSAvKiBVbHRyYXZpc29yIENvbXBvbmVudHMgKi8KKwkgVUxUUkFfQ09NUE9ORU5UX0JPT1QgPSAweDA4LAorCSBVTFRSQV9DT01QT05FTlRfSURMRSA9IDB4MDksCisJIFVMVFJBX0NPTVBPTkVOVF9DT05UUk9MID0gMHgwQSwKKwkgVUxUUkFfQ09NUE9ORU5UX0xPR0dFUiA9IDB4MEIsCisJIFVMVFJBX0NPTVBPTkVOVF9BQ1BJID0gMFgwQywKKwkgLyogUkVTRVJWRUQgMHgwRCAtIDB4MEYgKi8KKworCSAvKiBzUEFSIENvbXBvbmVudHMgKi8KKwkgVUxUUkFfQ09NUE9ORU5UX0NPTU1BTkQgPSAweDEwLAorCSBVTFRSQV9DT01QT05FTlRfSU9EUklWRVIgPSAweDExLAorCSBVTFRSQV9DT01QT05FTlRfQ09OU09MRSA9IDB4MTIsCisJIFVMVFJBX0NPTVBPTkVOVF9PUEVSQVRJT05TID0gMHgxMywKKwkgVUxUUkFfQ09NUE9ORU5UX01BTkFHRU1FTlQgPSAweDE0LAorCSBVTFRSQV9DT01QT05FTlRfRElBRyA9IDB4MTUsCisJIFVMVFJBX0NPTVBPTkVOVF9IV0RJQUcgPSAweDE2LAorCSBVTFRSQV9DT01QT05FTlRfUFNFUlZJQ0VTID0gMHgxNywKKwkgVUxUUkFfQ09NUE9ORU5UX1BESUFHID0gMHgxOAorCSAvKiBSRVNFUlZFRCAweDE4IC0gMHgxRiAqLworfSBVTFRSQV9DT01QT05FTlRfVFlQRVM7CisKKy8qIFN0cnVjdHVyZTogRElBR19DSEFOTkVMX0VWRU5UIFB1cnBvc2U6IENvbnRhaW5zIGF0dHJpYnV0ZXMgdGhhdCBtYWtlIHVwIGFuCisgKiBldmVudCB0byBiZSB3cml0dGVuIHRvIHRoZSBESUFHX0NIQU5ORUwgbWVtb3J5LiAgQXR0cmlidXRlczogRXZlbnRJZDogSWQgb2YKKyAqIHRoZSBkaWFnbm9zdGljIGV2ZW50IHRvIHdyaXRlIHRvIG1lbW9yeS4gIFNldmVyaXR5OiBTZXZlcml0eSBvZiB0aGUgZXZlbnQKKyAqIChFcnJvciwgSW5mbywgZXRjKS4gIE1vZHVsZU5hbWU6IE1vZHVsZS9maWxlIG5hbWUgd2hlcmUgZXZlbnQgb3JpZ2luYXRlZC4KKyAqIExpbmVOdW1iZXI6IExpbmUgbnVtYmVyIGluIG1vZHVsZSBuYW1lIHdoZXJlIGV2ZW50IG9yaWdpbmF0ZWQuICBUaW1lc3RhbXA6CisgKiBEYXRlL3RpbWUgd2hlbiBldmVudCB3YXMgcmVjZWl2ZWQgYnkgUmVwb3J0RXZlbnQsIGFuZCB3cml0dGVuIHRvIERpYWdDaGFubmVsLgorICogUmVzZXJ2ZWQ6IFBhZGRpbmcgdG8gYWxpZ24gc3RydWN0dXJlIG9uIGEgNjQtYnl0ZSBjYWNoZSBsaW5lIGJvdW5kYXJ5LgorICogQWRkaXRpb25hbEluZm86IEFycmF5IG9mIGNoYXJhY3RlcnMgZm9yIGFkZGl0aW9uYWwgZXZlbnQgaW5mbyAobWF5IGJlCisgKiBlbXB0eSkuICAqLwordHlwZWRlZiBzdHJ1Y3QgX0RJQUdfQ0hBTk5FTF9FVkVOVCAgeworCVUzMiBFdmVudElkOworCVUzMiBTZXZlcml0eTsKKwlVOCBNb2R1bGVOYW1lW01BWF9NT0RVTEVfTkFNRV9TSVpFXTsKKwlVMzIgTGluZU51bWJlcjsKKwlESUFHX0VGSV9USU1FIFRpbWVzdGFtcDsJLyogU2l6ZSA9IDE2IGJ5dGVzICovCisJVTMyIFBhcnRpdGlvbk51bWJlcjsJLyogRmlsbGVkIGluIGJ5IERpYWcgU3dpdGNoIGFzIHBvb2wgYmxvY2tzIGFyZQorCQkJCSAqIGZpbGxlZCAqLworCVUxNiBWaXJ0dWFsUHJvY2Vzc29yTnVtYmVyOworCVUxNiBMb2dpY2FsUHJvY2Vzc29yTnVtYmVyOworCVU4IENvbXBvbmVudFR5cGU7CS8qIFVMVFJBX0NPTVBPTkVOVF9UWVBFUyAqLworCVU4IFN1YnN5c3RlbTsKKwlVMTYgUmVzZXJ2ZWQwOwkJLyogcGFkIHRvIFU2NCBhbGlnbm1lbnQgKi8KKwlVMzIgQmxvY2tOdW1iZXI7CS8qIGZpbGxlZCBpbiBieSBEaWFnU3dpdGNoIGFzIHBvb2wgYmxvY2tzIGFyZQorCQkJCSAqIGZpbGxlZCAqLworCVUzMiBCbG9ja051bWJlckhpZ2g7CisJVTMyIEV2ZW50TnVtYmVyOwkvKiBmaWxsZWQgaW4gYnkgRGlhZ1N3aXRjaCBhcyBwb29sIGJsb2NrcyBhcmUKKwkJCQkgKiBmaWxsZWQgKi8KKwlVMzIgRXZlbnROdW1iZXJIaWdoOworCisJLyogVGhlIEJsb2NrTnVtYmVyIGFuZCBFdmVudE51bWJlciBmaWVsZHMgYXJlIHNldCBvbmx5IGJ5IERpYWdTd2l0Y2gKKwkgKiBhbmQgcmVmZXJlbmNlZCBvbmx5IGJ5IFdpbkRpYWdEaXNwbGF5IGZvcm1hdHRpbmcgdG9vbCBhcworCSAqIGFkZGl0aW9uYWwgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbi4gIE90aGVyIHRvb2xzIGluY2x1ZGluZworCSAqIFdpbkRpYWdEaXNwbGF5IGN1cnJlbnRseSBpZ25vcmUgdGhlc2UgJ1Jlc2VydmVkJyBieXRlcy4gKi8KKwlVOCBSZXNlcnZlZFs4XTsKKwlVOCBBZGRpdGlvbmFsSW5mb1tNQVhfQURESVRJT05BTF9JTkZPX1NJWkVdOworCisJLyogTk9URTogQ2hhbmdlc3RvIERJQUdfQ0hBTk5FTF9FVkVOVCBnZW5lcmFsbHkgbmVlZCB0byBiZSByZWZsZWN0ZWQgaW4KKwkgKiBleGlzdGluZyBjb3BpZXMgKgorCSAqIC0gZm9yIEFwcE9TIGF0CisJICogR3Vlc3RMaW51eC92aXNvcmRpYWdfZWFybHkvc3VwZXJ2aXNvcl9kaWFnY2hhbm5lbC5oICoKKwkgKiAtIGZvciBXaW5EaWFnRGlzcGxheSBhdAorCSAqIEVGSS9VbHRyYS9Ub29scy9XaW5EaWFnRGlzcGxheS9XaW5EaWFnRGlzcGxheS9kaWFnc3RydWN0LmggKi8KK30gRElBR19DSEFOTkVMX0VWRU5UOworCisvKiBMZXZlbHMgb2Ygc2V2ZXJpdHkgZm9yIGRpYWdub3N0aWMgZXZlbnRzLCBpbiBvcmRlciBmcm9tIGxvd2VzdCBzZXZlcml0eSB0bworKiBoaWdoZXN0IChpLmUuIGZhdGFsIGVycm9ycyBhcmUgdGhlIG1vc3Qgc2V2ZXJlLCBhbmQgc2hvdWxkIGFsd2F5cyBiZSBsb2dnZWQsCisqIGJ1dCBpbmZvIGV2ZW50cyByYXJlbHkgbmVlZCB0byBiZSBsb2dnZWQgZXhjZXB0IGR1cmluZyBkZWJ1Z2dpbmcpLiAgVGhlIHZhbHVlcworKiBESUFHX1NFVkVSSVRZX0VOVU1fQkVHSU4gYW5kIERJQUdfU0VWRVJJVFlfRU5VTV9FTkQgYXJlIG5vdCB2YWxpZCBzZXZlcml0eQorKiB2YWx1ZXMuICBUaGV5IGV4aXN0IG1lcmVseSB0byBkaWxpbmVhdGUgdGhlIGxpc3QsIHNvIHRoYXQgZnV0dXJlIGFkZGl0aW9ucworKiB3b24ndCByZXF1aXJlIGNoYW5nZXMgdG8gdGhlIGRyaXZlciAoaS5lLiB3aGVuIGNoZWNraW5nIGZvciBvdXQtb2YtcmFuZ2UKKyogc2V2ZXJpdGllcyBpbiBTZXRTZXZlcml0eSkuICBUaGUgdmFsdWVzIERJQUdfU0VWRVJJVFlfT1ZFUlJJREUgYW5kCisqIERJQUdfU0VWRVJJVFlfU0hVVE9GRiBhcmUgbm90IHZhbGlkIHNldmVyaXR5IHZhbHVlcyBmb3IgbG9nZ2luZyBldmVudHMgYnV0CisqIHRoZXkgYXJlIHZhbGlkIGZvciBjb250cm9sbGluZyB0aGUgYW1vdW50IG9mIGV2ZW50IGRhdGEuICBUaGlzIGVudW0gaXMgYWxzbworKiBkZWZpbmVkIGluIERvdE5ldFxzUGFyRnJhbWV3b3JrXENvbnRyb2xGcmFtZXdvcmtcQ29udHJvbEZyYW1ld29yay5jcy4gIElmIGEKKyogY2hhbmdlIGlzIG1hZGUgdG8gdGhpcyBlbnVtLCB0aGV5IHNob3VsZCBhbHNvIGJlIHJlZmxlY3RlZCBpbiB0aGF0IGZpbGUuICAqLwordHlwZWRlZiBlbnVtICB7IERJQUdfU0VWRVJJVFlfRU5VTV9CRUdJTiA9IDAsCisJCURJQUdfU0VWRVJJVFlfT1ZFUlJJREUgPSBESUFHX1NFVkVSSVRZX0VOVU1fQkVHSU4sCisJCURJQUdfU0VWRVJJVFlfVkVSQk9TRSA9IERJQUdfU0VWRVJJVFlfT1ZFUlJJREUsCS8qIDAgKi8KKwkJRElBR19TRVZFUklUWV9JTkZPID0gRElBR19TRVZFUklUWV9WRVJCT1NFICsgMSwJLyogMSAqLworCQlESUFHX1NFVkVSSVRZX1dBUk5JTkcgPSBESUFHX1NFVkVSSVRZX0lORk8gKyAxLAkvKiAyICovCisJCURJQUdfU0VWRVJJVFlfRVJSID0gRElBR19TRVZFUklUWV9XQVJOSU5HICsgMSwJLyogMyAqLworCQlESUFHX1NFVkVSSVRZX1BSSU5UID0gRElBR19TRVZFUklUWV9FUlIgKyAxLAkvKiA0ICovCisJCURJQUdfU0VWRVJJVFlfU0hVVE9GRiA9IERJQUdfU0VWRVJJVFlfUFJJTlQgKyAxLCAvKiA1ICovCisJCURJQUdfU0VWRVJJVFlfRU5VTV9FTkQgPSBESUFHX1NFVkVSSVRZX1NIVVRPRkYsCS8qIDUgKi8KKwkJRElBR19TRVZFUklUWV9OT05GQVRBTF9FUlIgPSBESUFHX1NFVkVSSVRZX0VSUiwKKwkJRElBR19TRVZFUklUWV9GQVRBTF9FUlIgPSBESUFHX1NFVkVSSVRZX1BSSU5UCit9IERJQUdfU0VWRVJJVFk7CisKKy8qIEV2ZW50IENhdXNlIGVudW1zCisqCisqIExldmVscyBvZiBjYXVzZSBmb3IgZGlhZ25vc3RpYyBldmVudHMsIGluIG9yZGVyIGZyb20gbGVhc3QgdG8gZ3JlYXRlc3QgY2F1c2UKKyogSW50ZXJuYWwgZXJyb3JzIGFyZSBtb3N0IHVyZ2VudCBzaW5jZSBpZGVhbGx5IHRoZXkgc2hvdWxkIG5ldmVyIGV4aXN0CisqIEludmFsaWQgcmVxdWVzdHMgYXJlIHByZXZlbnRhYmxlIGJ5IGF2b2lkaW5nIGludmFsaWQgaW5wdXRzCisqIE9wZXJhdGlvbnMgZXJyb3JzIGRlcGVuZCBvbiBlbnZpcm9ubWVudGFsIGZhY3RvcnMgd2hpY2ggbWF5IGltcGFjdCB3aGljaAorKiByZXF1ZXN0cyBhcmUgcG9zc2libGUKKyogTWFuaWZlc3QgcHJvdmlkZXMgaW50ZXJtZWRpYXRlIHZhbHVlIHRvIGNhcHR1cmUgZmlybXdhcmUgYW5kIGNvbmZpZ3VyYXRpb24KKyogdmVyc2lvbiBpbmZvcm1hdGlvbgorKiBUcmFjZSBwcm92aWRlcyBzdXBsaW1lbnRhbCBkZWJ1ZyBpbmZvcm1hdGlvbiBpbiByZWxlYXNlIGZpcm13YXJlCisqIFVua25vd24gTG9nIGNhcHR1cmVzIHVuY2xhc2lmaWVkIExvZ0V2ZW50IGNhbGxzLgorKiBEZWJ1ZyBpcyB0aGUgbGVhc3QgdXJnZW50IHNpbmNlIGl0IHByb3ZpZGVzIHN1cGxpbWVudGFsIGRlYnVnIGluZm9ybWF0aW9uIG9ubHkKKyogaW4gZGVidWcgZmlybXdhcmUKKyogVW5rbm93biBEZWJ1ZyBjYXB0dXJlcyB1bmNsYXNzaWZpZWQgRGVidWdFdmVudCBjYWxscy4KKyogVGhpcyBlbnVtIGlzIGFsc28gZGVmaW5lZCBpbgorKiBEb3ROZXRcc1BhckZyYW1ld29ya1xDb250cm9sRnJhbWV3b3JrXENvbnRyb2xGcmFtZXdvcmsuY3MuCisqIElmIGEgY2hhbmdlIGlzIG1hZGUgdG8gdGhpcyBlbnVtLCB0aGV5IHNob3VsZCBhbHNvIGJlIHJlZmxlY3RlZCBpbiB0aGF0CisqIGZpbGUuICAqLworCisKKworLyogQSBjYXVzZSB2YWx1ZSAiRElBR19DQVVTRV9GSUxFX1hGRVIiIHRvZ2V0aGVyIHdpdGggYSBzZXZlcml0eSB2YWx1ZSBvZgorKiAiRElBR19TRVZFUklUWV9QUklOVCIgKD00KSwgaXMgdXNlZCBmb3IgdHJhbnNmZXJyaW5nIHRleHQgb3IgYmluYXJ5IGZpbGUgdG8KKyogdGhlIERpYWcgcGFydGl0aW9uLiBUaGlzIGNhdXNlLXNldmVyaXR5IGNvbWJpbmF0aW9uIHdpbGwgYmUgdXNlZCBieSBMb2dnZXIKKyogRGlhZ1N3aXRjaCB0byBzZWdyZWdhdGUgZXZlbnRzIGludG8gYmxvY2sgdHlwZXMuIFRoZSBmaWxlcyBhcmUgdHJhbnNmZXJyZWQgaW4KKyogMjU2IGJ5dGUgY2h1bmtzIG1heGltdW0sIGluIHRoZSBBZGRpdGlvbmFsSW5mbyBmaWVsZCBvZiB0aGUgRElBR19DSEFOTkVMX0VWRU5UCisqIHN0cnVjdHVyZS4gSW4gdGhlIGZpbGUgdHJhbnNmZXIgbW9kZSwgc29tZSBldmVudCBmaWVsZHMgd2lsbCBoYXZlIGRpZmZlcmVudAorKiBtZWFuaW5nOiBFdmVudElkIHNwZWNpZmllcyB0aGUgZmlsZSBvZmZzZXQsIHNldmVyaXR5IHNwZWNpZmllcyB0aGUgYmxvY2sgdHlwZSwKKyogTW9kdWxlTmFtZSBzcGVjaWZpZXMgdGhlIGZpbGVuYW1lLCBMaW5lTnVtYmVyIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHZhbGlkCisqIGRhdGEgYnl0ZXMgaW4gYW4gZXZlbnQgYW5kIEFkZGl0aW9uYWxJbmZvIGNvbnRhaW5zIHVwIHRvIDI1NiBieXRlcyBvZiBkYXRhLiAqLworCisvKiBUaGUgRGlhZyBEaWFnV3JpdGVyIGFwcGVuZHMgZXZlbnQgYmxvY2tzIHRvIGV2ZW50cy5yYXcgYXMgdG9kYXksIGFuZCBmb3IgZGF0YQorICogYmxvY2tzIHVzZXMgRElBR19DSEFOTkVMX0VWRU5UCisgKiBQYXJ0aXRpb25OdW1iZXIgdG8gZXh0cmFjdCBhbmQgYXBwZW5kICdBZGRpdGlvbmFsSW5mbycgdG8gZmlsZW5hbWUgKHNwZWNpZmllZAorICogYnkgTW9kdWxlTmFtZSkuICovCisKKy8qIFRoZSBEZWxsIFBEaWFnIHVzZXMgdGhpcyBuZXcgbWVjaGFuaXNtIHRvIHN0YXNoIERTRVQgLnppcCBvbnRvIHRoZQorICogJ2RpYWdub3N0aWMnIHZpcnR1YWwgZGlzay4gICovCit0eXBlZGVmIGVudW0gIHsKKwlESUFHX0NBVVNFX1VOS05PV04gPSAwLAorCURJQUdfQ0FVU0VfVU5LTk9XTl9ERUJVRyA9IERJQUdfQ0FVU0VfVU5LTk9XTiArIDEsCS8qIDEgKi8KKwlESUFHX0NBVVNFX0RFQlVHID0gRElBR19DQVVTRV9VTktOT1dOX0RFQlVHICsgMSwJLyogMiAqLworCURJQUdfQ0FVU0VfVU5LTk9XTl9MT0cgPSBESUFHX0NBVVNFX0RFQlVHICsgMSwJLyogMyAqLworCURJQUdfQ0FVU0VfVFJBQ0UgPSBESUFHX0NBVVNFX1VOS05PV05fTE9HICsgMSwJLyogNCAqLworCURJQUdfQ0FVU0VfTUFOSUZFU1QgPSBESUFHX0NBVVNFX1RSQUNFICsgMSwJLyogNSAqLworCURJQUdfQ0FVU0VfT1BFUkFUSU9OU19FUlJPUiA9IERJQUdfQ0FVU0VfTUFOSUZFU1QgKyAxLAkvKiA2ICovCisJRElBR19DQVVTRV9JTlZBTElEX1JFUVVFU1QgPSBESUFHX0NBVVNFX09QRVJBVElPTlNfRVJST1IgKyAxLAkvKiA3ICovCisJRElBR19DQVVTRV9JTlRFUk5BTF9FUlJPUiA9IERJQUdfQ0FVU0VfSU5WQUxJRF9SRVFVRVNUICsgMSwgLyogOCAqLworCURJQUdfQ0FVU0VfRklMRV9YRkVSID0gRElBR19DQVVTRV9JTlRFUk5BTF9FUlJPUiArIDEsCS8qIDkgKi8KKwlESUFHX0NBVVNFX0VOVU1fRU5EID0gRElBR19DQVVTRV9GSUxFX1hGRVIJLyogOSAqLworfSBESUFHX0NBVVNFOworCisvKiBFdmVudCBDYXVzZSBjYXRlZ29yeSBkZWZpbmVkIGludG8gdGhlIGJ5dGUgMiBvZiBTZXZlcml0eSAqLworI2RlZmluZSBDQVVTRV9ERUJVRyAoRElBR19DQVVTRV9ERUJVRyA8PCBDQVVTRV9TSElGVF9BTVQpCisjZGVmaW5lIENBVVNFX1RSQUNFIChESUFHX0NBVVNFX1RSQUNFIDw8IENBVVNFX1NISUZUX0FNVCkKKyNkZWZpbmUgQ0FVU0VfTUFOSUZFU1QgKERJQUdfQ0FVU0VfTUFOSUZFU1QgPDwgQ0FVU0VfU0hJRlRfQU1UKQorI2RlZmluZSBDQVVTRV9PUEVSQVRJT05TX0VSUk9SIChESUFHX0NBVVNFX09QRVJBVElPTlNfRVJST1IgPDwgQ0FVU0VfU0hJRlRfQU1UKQorI2RlZmluZSBDQVVTRV9JTlZBTElEX1JFUVVFU1QgKERJQUdfQ0FVU0VfSU5WQUxJRF9SRVFVRVNUIDw8IENBVVNFX1NISUZUX0FNVCkKKyNkZWZpbmUgQ0FVU0VfSU5URVJOQUxfRVJST1IgKERJQUdfQ0FVU0VfSU5URVJOQUxfRVJST1IgPDwgQ0FVU0VfU0hJRlRfQU1UKQorI2RlZmluZSBDQVVTRV9GSUxFX1hGRVIgKERJQUdfQ0FVU0VfRklMRV9YRkVSIDw8IENBVVNFX1NISUZUX0FNVCkKKyNkZWZpbmUgQ0FVU0VfRU5VTV9FTkQgQ0FVU0VfRklMRV9YRkVSCisKKy8qIENvbWJpbmUgQ2F1c2UgYW5kIFNldmVyaXR5IGNhdGVnb3JpZXMgaW50byBvbmUgKi8KKyNkZWZpbmUgQ0FVU0VfREVCVUdfU0VWRVJJVFlfVkVSQk9TRSBcCisJKENBVVNFX0RFQlVHIHwgRElBR19TRVZFUklUWV9WRVJCT1NFKQorI2RlZmluZSBDQVVTRV9UUkFDRV9TRVZFUklUWV9WRVJCT1NFIFwKKwkoQ0FVU0VfVFJBQ0UgfCBESUFHX1NFVkVSSVRZX1ZFUkJPU0UpCisjZGVmaW5lIENBVVNFX01BTklGRVNUX1NFVkVSSVRZX1ZFUkJPU0VcCisJKENBVVNFX01BTklGRVNUIHwgRElBR19TRVZFUklUWV9WRVJCT1NFKQorI2RlZmluZSBDQVVTRV9PUEVSQVRJT05TX1NFVkVSSVRZX1ZFUkJPU0UgXAorCShDQVVTRV9PUEVSQVRJT05TX0VSUk9SIHwgRElBR19TRVZFUklUWV9WRVJCT1NFKQorI2RlZmluZSBDQVVTRV9JTlZBTElEX1NFVkVSSVRZX1ZFUkJPU0UgXAorCShDQVVTRV9JTlZBTElEX1JFUVVFU1QgIHwgRElBR19TRVZFUklUWV9WRVJCT1NFKQorI2RlZmluZSBDQVVTRV9JTlRFUk5BTF9TRVZFUklUWV9WRVJCT1NFIFwKKwkoQ0FVU0VfSU5URVJOQUxfRVJST1IgICB8IERJQUdfU0VWRVJJVFlfVkVSQk9TRSkKKworI2RlZmluZSBDQVVTRV9ERUJVR19TRVZFUklUWV9JTkZPIFwKKwkoQ0FVU0VfREVCVUcgfCBESUFHX1NFVkVSSVRZX0lORk8pCisjZGVmaW5lIENBVVNFX1RSQUNFX1NFVkVSSVRZX0lORk8gXAorCShDQVVTRV9UUkFDRSB8IERJQUdfU0VWRVJJVFlfSU5GTykKKyNkZWZpbmUgQ0FVU0VfTUFOSUZFU1RfU0VWRVJJVFlfSU5GTyBcCisJKENBVVNFX01BTklGRVNUIHwgRElBR19TRVZFUklUWV9JTkZPKQorI2RlZmluZSBDQVVTRV9PUEVSQVRJT05TX1NFVkVSSVRZX0lORk8gXAorCShDQVVTRV9PUEVSQVRJT05TX0VSUk9SIHwgRElBR19TRVZFUklUWV9JTkZPKQorI2RlZmluZSBDQVVTRV9JTlZBTElEX1NFVkVSSVRZX0lORk8gXAorCShDQVVTRV9JTlZBTElEX1JFUVVFU1QgIHwgRElBR19TRVZFUklUWV9JTkZPKQorI2RlZmluZSBDQVVTRV9JTlRFUk5BTF9TRVZFUklUWV9JTkZPIFwKKwkoQ0FVU0VfSU5URVJOQUxfRVJST1IgfCBESUFHX1NFVkVSSVRZX0lORk8pCisKKyNkZWZpbmUgQ0FVU0VfREVCVUdfU0VWRVJJVFlfV0FSTiBcCisJKENBVVNFX0RFQlVHIHwgRElBR19TRVZFUklUWV9XQVJOSU5HKQorI2RlZmluZSBDQVVTRV9UUkFDRV9TRVZFUklUWV9XQVJOIFwKKwkoQ0FVU0VfVFJBQ0UgfCBESUFHX1NFVkVSSVRZX1dBUk5JTkcpCisjZGVmaW5lIENBVVNFX01BTklGRVNUX1NFVkVSSVRZX1dBUk4gXAorCShDQVVTRV9NQU5JRkVTVCB8IERJQUdfU0VWRVJJVFlfV0FSTklORykKKyNkZWZpbmUgQ0FVU0VfT1BFUkFUSU9OU19TRVZFUklUWV9XQVJOIFwKKwkoQ0FVU0VfT1BFUkFUSU9OU19FUlJPUiB8IERJQUdfU0VWRVJJVFlfV0FSTklORykKKyNkZWZpbmUgQ0FVU0VfSU5WQUxJRF9TRVZFUklUWV9XQVJOIFwKKwkoQ0FVU0VfSU5WQUxJRF9SRVFVRVNUIHwgRElBR19TRVZFUklUWV9XQVJOSU5HKQorI2RlZmluZSBDQVVTRV9JTlRFUk5BTF9TRVZFUklUWV9XQVJOIFwKKwkoQ0FVU0VfSU5URVJOQUxfRVJST1IgfCBESUFHX1NFVkVSSVRZX1dBUk5JTkcpCisKKyNkZWZpbmUgQ0FVU0VfREVCVUdfU0VWRVJJVFlfRVJSIFwKKwkoQ0FVU0VfREVCVUcgfCBESUFHX1NFVkVSSVRZX0VSUikKKyNkZWZpbmUgQ0FVU0VfVFJBQ0VfU0VWRVJJVFlfRVJSIFwKKwkoQ0FVU0VfVFJBQ0UgfCBESUFHX1NFVkVSSVRZX0VSUikKKyNkZWZpbmUgQ0FVU0VfTUFOSUZFU1RfU0VWRVJJVFlfRVJSIFwKKwkoQ0FVU0VfTUFOSUZFU1QgfCBESUFHX1NFVkVSSVRZX0VSUikKKyNkZWZpbmUgQ0FVU0VfT1BFUkFUSU9OU19TRVZFUklUWV9FUlIgXAorCShDQVVTRV9PUEVSQVRJT05TX0VSUk9SIHwgRElBR19TRVZFUklUWV9FUlIpCisjZGVmaW5lIENBVVNFX0lOVkFMSURfU0VWRVJJVFlfRVJSIFwKKwkoQ0FVU0VfSU5WQUxJRF9SRVFVRVNUICB8IERJQUdfU0VWRVJJVFlfRVJSKQorI2RlZmluZSBDQVVTRV9JTlRFUk5BTF9TRVZFUklUWV9FUlIgXAorCShDQVVTRV9JTlRFUk5BTF9FUlJPUiAgIHwgRElBR19TRVZFUklUWV9FUlIpCisKKyNkZWZpbmUgQ0FVU0VfREVCVUdfU0VWRVJJVFlfUFJJTlQgXAorCShDQVVTRV9ERUJVRyB8IERJQUdfU0VWRVJJVFlfUFJJTlQpCisjZGVmaW5lIENBVVNFX1RSQUNFX1NFVkVSSVRZX1BSSU5UIFwKKwkoQ0FVU0VfVFJBQ0UgfCBESUFHX1NFVkVSSVRZX1BSSU5UKQorI2RlZmluZSBDQVVTRV9NQU5JRkVTVF9TRVZFUklUWV9QUklOVCBcCisJKENBVVNFX01BTklGRVNUIHwgRElBR19TRVZFUklUWV9QUklOVCkKKyNkZWZpbmUgQ0FVU0VfT1BFUkFUSU9OU19TRVZFUklUWV9QUklOVCBcCisJKENBVVNFX09QRVJBVElPTlNfRVJST1IgfCBESUFHX1NFVkVSSVRZX1BSSU5UKQorI2RlZmluZSBDQVVTRV9JTlZBTElEX1NFVkVSSVRZX1BSSU5UIFwKKwkoQ0FVU0VfSU5WQUxJRF9SRVFVRVNUIHwgRElBR19TRVZFUklUWV9QUklOVCkKKyNkZWZpbmUgQ0FVU0VfSU5URVJOQUxfU0VWRVJJVFlfUFJJTlQgXAorCShDQVVTRV9JTlRFUk5BTF9FUlJPUiB8IERJQUdfU0VWRVJJVFlfUFJJTlQpCisjZGVmaW5lIENBVVNFX0ZJTEVfWEZFUl9TRVZFUklUWV9QUklOVCBcCisJKENBVVNFX0ZJTEVfWEZFUiB8IERJQUdfU0VWRVJJVFlfUFJJTlQpCisKKy8qIFN0cnVjdHVyZTogRElBR19DSEFOTkVMX1BST1RPQ09MX0hFQURFUgorICoKKyAqIFB1cnBvc2U6IENvbnRhaW5zIGF0dHJpYnV0ZXMgdGhhdCBtYWtlIHVwIHRoZSBoZWFkZXIgc3BlY2lmaWMgdG8gdGhlCisgKiBESUFHX0NIQU5ORUwgYXJlYS4KKyAqCisgKiBBdHRyaWJ1dGVzOgorICoKKyAqIERpYWdMb2NrOiBEaWFnIENoYW5uZWwgc3BpbmxvY2suCisgKgorICpJc0NoYW5uZWxJbml0aWFsaXplZDogMSBpZmYgU2lnbmFsSW5pdCB3YXMgY2FsbGVkIGZvciB0aGlzIGNoYW5uZWw7IG90aGVyd2lzZQorICoJCQkwLCBhbmQgYXNzdW1lIHRoZSBjaGFubmVsIGlzIG5vdCByZWFkeSBmb3IgdXNlIHlldC4KKyAqCisgKiBSZXNlcnZlZDogUGFkZGluZyB0byBhbGxpZ24gdGhlIGZpZWxkcyBpbiB0aGlzIHN0cnVjdHVyZS4KKyAqCisgKlN1YnN5c3RlbVNldmVyaXR5RmlsdGVyOiBMZXZlbCBvZiBzZXZlcml0eSBvbiBhIHN1YnN5c3RlbSBiYXNpcyB0aGF0IGNvbnRyb2xzCisgKgkJCXdoZXRoZXIgZXZlbnRzIGFyZSBsb2dnZWQuICBBbnkgZXZlbnQncyBzZXZlcml0eSBmb3IgYQorICoJCQlwYXJ0aWN1bGFyIHN1YnN5c3RlbSBiZWxvdyB0aGlzIGxldmVsIHdpbGwgYmUgZGlzY2FyZGVkLgorICovCit0eXBlZGVmIHN0cnVjdCBfRElBR19DSEFOTkVMX1BST1RPQ09MX0hFQURFUiAgeworCXZvbGF0aWxlIFUzMiBEaWFnTG9jazsKKwlVOCBJc0NoYW5uZWxJbml0aWFsaXplZDsKKwlVOCBSZXNlcnZlZFszXTsKKwlVOCBTdWJzeXN0ZW1TZXZlcml0eUZpbHRlcls2NF07Cit9IERJQUdfQ0hBTk5FTF9QUk9UT0NPTF9IRUFERVI7CisKKy8qIFRoZSBEaWFncmFtIGZvciB0aGUgRGlhZ25vc3RpYyBDaGFubmVsOiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHwgQ2hhbm5lbCBIZWFkZXIgICAgICAgIHwJRGVmaW5lZCBieSBVTFRSQV9DSEFOTkVMX1BST1RPQ09MICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogfCBTaWduYWwgUXVldWUgSGVhZGVyICAgfAlEZWZpbmVkIGJ5IFNJR05BTF9RVUVVRV9IRUFERVIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB8IERpYWdDaGFubmVsIEhlYWRlciAgICB8CURlZmluZWQgYnkgRElBR19DSEFOTkVMX1BST1RPQ09MX0hFQURFUiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHwgQ2hhbm5lbCBFdmVudCBJbmZvICAgIHwJRGVmaW5lZCBieSAoRElBR19DSEFOTkVMX0VWRU5UICogTUFYX0VWRU5UUykgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB8IFJlc2VydmVkICAgICAgICAgICAgICB8CVJlc2VydmVkIChwYWQgb3V0IHRvIDRNQikgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIE9mZnNldHMvc2l6ZXMgZm9yIGRpYWdub3N0aWMgY2hhbm5lbCBhdHRyaWJ1dGVzLi4uICovCisjZGVmaW5lIERJQUdfQ0hfUVVFVUVfSEVBREVSX09GRlNFVCAoc2l6ZW9mKFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wpKQorI2RlZmluZSBESUFHX0NIX1FVRVVFX0hFQURFUl9TSVpFIChzaXplb2YoU0lHTkFMX1FVRVVFX0hFQURFUikpCisjZGVmaW5lIERJQUdfQ0hfUFJPVE9DT0xfSEVBREVSX09GRlNFVCBcCisJKERJQUdfQ0hfUVVFVUVfSEVBREVSX09GRlNFVCArIERJQUdfQ0hfUVVFVUVfSEVBREVSX1NJWkUpCisjZGVmaW5lIERJQUdfQ0hfUFJPVE9DT0xfSEVBREVSX1NJWkUgKHNpemVvZihESUFHX0NIQU5ORUxfUFJPVE9DT0xfSEVBREVSKSkKKyNkZWZpbmUgRElBR19DSF9FVkVOVF9PRkZTRVQgXAorCShESUFHX0NIX1BST1RPQ09MX0hFQURFUl9PRkZTRVQgKyBESUFHX0NIX1BST1RPQ09MX0hFQURFUl9TSVpFKQorI2RlZmluZSBESUFHX0NIX1NJWkUgKDQwOTYgKiAxMDI0KQorCisvKiBGb3IgQ29udHJvbCBhbmQgSWRsZSBQYXJ0aXRpb25zIHdpdGggbGFyZ2VyICg4IE1CKSBkaWFnbm9zdGljKHJvb3QpCisgKiBjaGFubmVscyAqLworI2RlZmluZSBESUFHX0NIX0xSR19TSVpFICgyICogRElBR19DSF9TSVpFKQkvKiA4IE1CICovCisKKy8qCisgKiBTdHJ1Y3R1cmU6IFVMVFJBX0RJQUdfQ0hBTk5FTF9QUk9UT0NPTAorICoKKyAqIFB1cnBvc2U6IENvbnRhaW5zIGF0dHJpYnV0ZXMgdGhhdCBtYWtlIHVwIHRoZSBESUFHX0NIQU5ORUwgbWVtb3J5LgorICoKKyAqIEF0dHJpYnV0ZXM6CisgKgorICogQ29tbW9uQ2hhbm5lbEhlYWRlcjoJSGVhZGVyIGluZm8gY29tbW9uIHRvIGFsbCBjaGFubmVscy4KKyAqCisgKiBRdWV1ZUhlYWRlcjogUXVldWUgaGVhZGVyIGNvbW1vbiB0byBhbGwgY2hhbm5lbHMgLSB1c2VkIHRvIGRldGVybWluZSB3aGVyZSB0bworICogc3RvcmUgZXZlbnQuCisgKgorICogRGlhZ0NoYW5uZWxIZWFkZXI6IERpYWdub3N0aWMgY2hhbm5lbCBoZWFkZXIgaW5mbyAoc2VlCisgKiBESUFHX0NIQU5ORUxfUFJPVE9DT0xfSEVBREVSIGNvbW1lbnRzKS4KKyAqCisgKiBFdmVudHM6IEFyZWEgd2hlcmUgZGlhZ25vc3RpYyBldmVudHMgKHVwIHRvIE1BWF9FVkVOVFMpIGFyZSB3cml0dGVuLgorICoKKyAqUmVzZXJ2ZWQ6IFJlc2VydmVkIGFyZWEgdG8gYWxsb3cgZm9yIGNvcnJlY3QgY2hhbm5lbCBzaXplIHBhZGRpbmcuCisqLwordHlwZWRlZiBzdHJ1Y3QgX1VMVFJBX0RJQUdfQ0hBTk5FTF9QUk9UT0NPTCAgeworCVVMVFJBX0NIQU5ORUxfUFJPVE9DT0wgQ29tbW9uQ2hhbm5lbEhlYWRlcjsKKwlTSUdOQUxfUVVFVUVfSEVBREVSIFF1ZXVlSGVhZGVyOworCURJQUdfQ0hBTk5FTF9QUk9UT0NPTF9IRUFERVIgRGlhZ0NoYW5uZWxIZWFkZXI7CisJRElBR19DSEFOTkVMX0VWRU5UIEV2ZW50c1soRElBR19DSF9TSVpFIC0gRElBR19DSF9FVkVOVF9PRkZTRVQpIC8KKwkJCQkgICBzaXplb2YoRElBR19DSEFOTkVMX0VWRU5UKV07Cit9CitVTFRSQV9ESUFHX0NIQU5ORUxfUFJPVE9DT0w7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2lvY2hhbm5lbC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2lvY2hhbm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZTFkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvaW9jaGFubmVsLmgKQEAgLTAsMCArMSw5MzMgQEAKKy8qIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTiAqLworLyogQWxsIHJpZ2h0cyByZXNlcnZlZC4gKi8KKyNpZm5kZWYgX19JT0NIQU5ORUxfSF9fCisjZGVmaW5lIF9fSU9DSEFOTkVMX0hfXworCisvKgorKiBFdmVyeXRoaW5nIG5lZWRlZCBmb3IgSU9QYXJ0LUd1ZXN0UGFydCBjb21tdW5pY2F0aW9uIGlzIGRlZmluZSBpbgorKiB0aGlzIGZpbGUuICBOb3RlOiBFdmVyeXRoaW5nIGlzIE9TLWluZGVwZW5kZW50IGJlY2F1c2UgdGhpcyBmaWxlIGlzCisqIHVzZWQgYnkgV2luZG93cywgTGludXggYW5kIHBvc3NpYmxlIEVGSSBkcml2ZXJzLiAgKi8KKworCisvKgorKiBDb21tdW5pY2F0aW9uIGZsb3cgYmV0d2VlbiB0aGUgSU9QYXJ0IGFuZCBHdWVzdFBhcnQgdXNlcyB0aGUgY2hhbm5lbCBoZWFkZXJzCisqIGNoYW5uZWwgc3RhdGUuICBUaGUgZm9sbG93aW5nIHN0YXRlcyBhcmUgY3VycmVudGx5IGJlaW5nIHVzZWQ6CisqICAgICAgIFVOSU5JVChBbGwgWmVyb2VzKSwgQ0hBTk5FTF9BVFRBQ0hJTkcsIENIQU5ORUxfQVRUQUNIRUQsIENIQU5ORUxfT1BFTkVECisqCisqIGFkZGl0aW9uYWwgc3RhdGVzIHdpbGwgYmUgdXNlZCBsYXRlci4gIE5vIGxvY2tpbmcgaXMgbmVlZGVkIHRvIHN3aXRjaCBiZXR3ZWVuCisqIHN0YXRlcyBkdWUgdG8gdGhlIGZvbGxvd2luZyBydWxlczoKKyoKKyogICAgICAxLiAgSU9QYXJ0IGlzIG9ubHkgdGhlIG9ubHkgcGFydGl0aW9uIGFsbG93ZWQgdG8gY2hhbmdlIGZyb20gVU5JVAorKiAgICAgIDIuICBJT1BhcnQgaXMgb25seSB0aGUgb25seSBwYXJ0aXRpb24gYWxsb3dlZCB0byBjaGFuZ2UgZnJvbQorKgkJQ0hBTk5FTF9BVFRBQ0hJTkcKKyogICAgICAzLiAgR3Vlc3RQYXJ0IGlzIG9ubHkgdGhlIG9ubHkgcGFydGl0aW9uIGFsbG93ZWQgdG8gY2hhbmdlIGZyb20KKyoJCUNIQU5ORUxfQVRUQUNIRUQKKyoKKyogVGhlIHN0YXRlIGNoYW5nZXMgYXJlIHRoZSBmb2xsb3dpbmc6IElPUGFydCBzZWVzIHRoZSBjaGFubmVsIGlzIGluIFVOSU5JVCwKKyogICAgICAgIFVOSU5JVCAtPiBDSEFOTkVMX0FUVEFDSElORyAocGVyZm9ybWVkIG9ubHkgYnkgSU9QYXJ0KQorKiAgICAgICAgQ0hBTk5FTF9BVFRBQ0hJTkcgLT4gQ0hBTk5FTF9BVFRBQ0hFRCAocGVyZm9ybWVkIG9ubHkgYnkgSU9QYXJ0KQorKiAgICAgICAgQ0hBTk5FTF9BVFRBQ0hFRCAtPiBDSEFOTkVMX09QRU5FRCAocGVyZm9ybWVkIG9ubHkgYnkgR3Vlc3RQYXJ0KQorKi8KKworI2luY2x1ZGUgImNvbW1vbnR5cGVzLmgiCisjaW5jbHVkZSAidm1jYWxsaW50ZXJmYWNlLmgiCisKKyNkZWZpbmUgX1VMVFJBX0NPTlRST0xWTV9DSEFOTkVMX0lOTElORV8KKyNpbmNsdWRlIDxsaW51eC9kbWEtZGlyZWN0aW9uLmg+CisjaW5jbHVkZSAiY29udHJvbHZtY2hhbm5lbC5oIgorI2luY2x1ZGUgInZidXNjaGFubmVsLmgiCisjdW5kZWYgX1VMVFJBX0NPTlRST0xWTV9DSEFOTkVMX0lOTElORV8KKyNpbmNsdWRlICJjaGFubmVsLmgiCisKKy8qCisgKiBDSEFOTkVMIEd1aWRzCisgKi8KKworI2luY2x1ZGUgImNoYW5uZWxfZ3VpZC5oIgorCisjZGVmaW5lIFVMVFJBX1ZIQkFfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUgVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUKKyNkZWZpbmUgVUxUUkFfVk5JQ19DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRSBVTFRSQV9DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRQorI2RlZmluZSBVTFRSQV9WU1dJVENIX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFIFwKKwlVTFRSQV9DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRQorCisvKiBNdXN0IGluY3JlbWVudCB0aGVzZSB3aGVuZXZlciB5b3UgaW5zZXJ0IG9yIGRlbGV0ZSBmaWVsZHMgd2l0aGluIHRoaXMgY2hhbm5lbAorKiBzdHJ1Y3QuICBBbHNvIGluY3JlbWVudCB3aGVuZXZlciB5b3UgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIGZpZWxkcyB3aXRoaW4gdGhpcworKiBjaGFubmVsIHN0cnVjdCBzbyBhcyB0byBicmVhayBwcmUtZXhpc3Rpbmcgc29mdHdhcmUuICBOb3RlIHRoYXQgeW91IGNhbgorKiB1c3VhbGx5IGFkZCBmaWVsZHMgdG8gdGhlIEVORCBvZiB0aGUgY2hhbm5lbCBzdHJ1Y3Qgd2l0aE9VVCBuZWVkaW5nIHRvCisqIGluY3JlbWVudCB0aGlzLiAqLworI2RlZmluZSBVTFRSQV9WSEJBX0NIQU5ORUxfUFJPVE9DT0xfVkVSU0lPTklEIDIKKyNkZWZpbmUgVUxUUkFfVk5JQ19DSEFOTkVMX1BST1RPQ09MX1ZFUlNJT05JRCAyCisjZGVmaW5lIFVMVFJBX1ZTV0lUQ0hfQ0hBTk5FTF9QUk9UT0NPTF9WRVJTSU9OSUQgMQorCisjZGVmaW5lIFVMVFJBX1ZIQkFfQ0hBTk5FTF9PS19DTElFTlQocENoYW5uZWwsIGxvZ0N0eCkJCQlcCisJKFVMVFJBX2NoZWNrX2NoYW5uZWxfY2xpZW50KHBDaGFubmVsLCBVbHRyYVZoYmFDaGFubmVsUHJvdG9jb2xHdWlkLCBcCisJCQkJICAgICJ2aGJhIiwgTUlOX0lPX0NIQU5ORUxfU0laRSwJXAorCQkJCSAgICBVTFRSQV9WSEJBX0NIQU5ORUxfUFJPVE9DT0xfVkVSU0lPTklELCBcCisJCQkJICAgIFVMVFJBX1ZIQkFfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUsIFwKKwkJCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBsb2dDdHgpKQorI2RlZmluZSBVTFRSQV9WSEJBX0NIQU5ORUxfT0tfU0VSVkVSKGFjdHVhbEJ5dGVzLCBsb2dDdHgpCQlcCisJKFVMVFJBX2NoZWNrX2NoYW5uZWxfc2VydmVyKFVsdHJhVmhiYUNoYW5uZWxQcm90b2NvbEd1aWQsCVwKKwkJCQkgICAgInZoYmEiLCBNSU5fSU9fQ0hBTk5FTF9TSVpFLCBhY3R1YWxCeXRlcywgXAorCQkJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGxvZ0N0eCkpCisjZGVmaW5lIFVMVFJBX1ZOSUNfQ0hBTk5FTF9PS19DTElFTlQocENoYW5uZWwsIGxvZ0N0eCkJCQlcCisJKFVMVFJBX2NoZWNrX2NoYW5uZWxfY2xpZW50KHBDaGFubmVsLCBVbHRyYVZuaWNDaGFubmVsUHJvdG9jb2xHdWlkLCBcCisJCQkJICAgICJ2bmljIiwgTUlOX0lPX0NIQU5ORUxfU0laRSwJXAorCQkJCSAgICBVTFRSQV9WTklDX0NIQU5ORUxfUFJPVE9DT0xfVkVSU0lPTklELCBcCisJCQkJICAgIFVMVFJBX1ZOSUNfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUsIFwKKwkJCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBsb2dDdHgpKQorI2RlZmluZSBVTFRSQV9WTklDX0NIQU5ORUxfT0tfU0VSVkVSKGFjdHVhbEJ5dGVzLCBsb2dDdHgpCQlcCisJKFVMVFJBX2NoZWNrX2NoYW5uZWxfc2VydmVyKFVsdHJhVm5pY0NoYW5uZWxQcm90b2NvbEd1aWQsCVwKKwkJCQkgICAgInZuaWMiLCBNSU5fSU9fQ0hBTk5FTF9TSVpFLCBhY3R1YWxCeXRlcywgXAorCQkJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGxvZ0N0eCkpCisjZGVmaW5lIFVMVFJBX1ZTV0lUQ0hfQ0hBTk5FTF9PS19DTElFTlQocENoYW5uZWwsIGxvZ0N0eCkJCVwKKwkoVUxUUkFfY2hlY2tfY2hhbm5lbF9jbGllbnQocENoYW5uZWwsIFVsdHJhVnN3aXRjaENoYW5uZWxQcm90b2NvbEd1aWQsIFwKKwkJCQkgICAgInZzd2l0Y2giLCBNSU5fSU9fQ0hBTk5FTF9TSVpFLAlcCisJCQkJICAgIFVMVFJBX1ZTV0lUQ0hfQ0hBTk5FTF9QUk9UT0NPTF9WRVJTSU9OSUQsIFwKKwkJCQkgICAgVUxUUkFfVlNXSVRDSF9DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRSwgXAorCQkJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGxvZ0N0eCkpCisjZGVmaW5lIFVMVFJBX1ZTV0lUQ0hfQ0hBTk5FTF9PS19TRVJWRVIoYWN0dWFsQnl0ZXMsIGxvZ0N0eCkgICAgICAgICAgXAorCShVTFRSQV9jaGVja19jaGFubmVsX3NlcnZlcihVbHRyYVZzd2l0Y2hDaGFubmVsUHJvdG9jb2xHdWlkLAlcCisJCQkJICAgICJ2c3dpdGNoIiwgTUlOX0lPX0NIQU5ORUxfU0laRSwJXAorCQkJCSAgICBhY3R1YWxCeXRlcywJCSAgICBcCisJCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgbG9nQ3R4KSkKKy8qCisqIEV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIGhhbmRsZSBTQ1NJICYgTklDIHRyYWZmaWMgYmV0d2VlbiBHdWVzdCBQYXJ0aXRpb24gYW5kCisqIElPIFBhcnRpdGlvbiBpcyBkZWZpbmVkIGJlbG93LiAgKi8KKworCisvKgorKiBEZWZpbmVzIGFuZCBlbnVtcy4KKyovCisKKyNkZWZpbmUgTUlOTlVNKGEsIGIpICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgTUFYTlVNKGEsIGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKworLyogdGhlc2UgZGVmaW5lIHRoZSB0d28gcXVldWVzIHBlciBkYXRhIGNoYW5uZWwgYmV0d2VlbiBpb3BhcnQgYW5kCisgKiBpb2d1ZXN0cGFydHMgKi8KKyNkZWZpbmUgSU9DSEFOX1RPX0lPUEFSVCAwIC8qIHVzZWQgYnkgaW9ndWVzdHBhcnQgdG8gJ2luc2VydCcgc2lnbmFscyB0bworCQkJICAgICogaW9wYXJ0ICovCisjZGVmaW5lIElPQ0hBTl9GUk9NX0dVRVNUUEFSVCAwIC8qIHVzZWQgYnkgaW9wYXJ0IHRvICdyZW1vdmUnIHNpZ25hbHMgZnJvbQorCQkJCSAqIGlvZ3Vlc3RwYXJ0IC0gc2FtZSBxdWV1ZSBhcyBwcmV2aW91cyBxdWV1ZSAqLworCisjZGVmaW5lIElPQ0hBTl9UT19HVUVTVFBBUlQgMSAvKiB1c2VkIGJ5IGlvcGFydCB0byAnaW5zZXJ0JyBzaWduYWxzIHRvCisJCQkgICAgICAgKiBpb2d1ZXN0cGFydCAqLworI2RlZmluZSBJT0NIQU5fRlJPTV9JT1BBUlQgMSAvKiB1c2VkIGJ5IGlvZ3Vlc3RwYXJ0IHRvICdyZW1vdmUnIHNpZ25hbHMgZnJvbQorCQkJICAgICAgKiBpb3BhcnQgLSBzYW1lIHF1ZXVlIGFzIHByZXZpb3VzIHF1ZXVlICovCisKKy8qIHRoZXNlIGRlZmluZSB0aGUgdHdvIHF1ZXVlcyBwZXIgY29udHJvbCBjaGFubmVsIGJldHdlZW4gY29udHJvbHBhcnQgYW5kICJpdHMiCisgKiBndWVzdHMsIHdoaWNoIGluY2x1ZGVzIHRoZSBpb3BhcnQgICovCisjZGVmaW5lIENUUkxDSEFOX1RPX0NUUkxHVUVTVFBBUlQgMCAvKiB1c2VkIGJ5IGN0cmxndWVzdHBhcnQgdG8gJ2luc2VydCcgc2lnbmFscworCQkJCSAgICAgKiB0byBjdHJscGFydCAqLworI2RlZmluZSBDVExSQ0hBTl9GUk9NX0NUUkxQQVJUIDAgLyogdXNlZCBieSBjdHJscGFydCB0byAncmVtb3ZlJyBzaWduYWxzIGZyb20KKwkJCQkgICogY3RybHF1ZXN0cGFydCAtIHNhbWUgcXVldWUgYXMgcHJldmlvdXMKKwkJCQkgICogcXVldWUgKi8KKworI2RlZmluZSBDVFJMQ0hBTl9UT19DVFJMUEFSVCAxIC8qIHVzZWQgYnkgY3RybHBhcnQgdG8gJ2luc2VydCcgc2lnbmFscyB0bworCQkJCSogY3RybGd1ZXN0cGFydCAqLworI2RlZmluZSBDVFJMQ0hBTl9GUk9NX0NUUkxHVUVTVFBBUlQgMSAvKiB1c2VkIGJ5IGN0cmd1ZXN0cGFydCB0byAncmVtb3ZlJworCQkJCSAgICAgICAqIHNpZ25hbHMgZnJvbSBjdHJscGFydCAtIHNhbWUgcXVldWUgYXMKKwkJCQkgICAgICAgKiBwcmV2aW91cyBxdWV1ZSAqLworCisvKiB0aGVzZSBkZWZpbmUgdGhlIEV2ZW50ICYgQWNrIHF1ZXVlcyBwZXIgY29udHJvbCBjaGFubmVsIEV2ZW50cyBhcmUgZ2VuZXJhdGVkCisqIGJ5IENUUkxHVUVTVFBBUlQgYW5kIHNlbnQgdG8gQ1RSTFBBUlQ7IEFja3MgYXJlIGdlbmVyYXRlZCBieSBDVFJMUEFSVCBhbmQgc2VudAorKiB0byBDVFJMR1VFU1RQQVJULiAqLworI2RlZmluZSBDVFJMQ0hBTl9FVkVOVF9UT19DVFJMUEFSVCAyIC8qIHVzZWQgYnkgY3RybGd1ZXN0cGFydCB0byAnaW5zZXJ0JyBFdmVudHMKKwkJCQkgICAgICAqIHRvIGN0cmxwYXJ0ICovCisjZGVmaW5lIENUUkxDSEFOX0VWRU5UX0ZST01fQ1RSTEdVRVNUUEFSVCAyIC8qIHVzZWQgYnkgY3RybHBhcnQgdG8gJ3JlbW92ZScKKwkJCQkJICAgICAqIEV2ZW50cyBmcm9tIGN0cmxndWVzdHBhcnQgKi8KKworI2RlZmluZSBDVFJMQ0hBTl9BQ0tfVE9fQ1RSTEdVRVNUUEFSVCAzCS8qIHVzZWQgYnkgY3RybHBhcnQgdG8gJ2luc2VydCcgQWNrcyB0bworCQkJCQkgKiBjdHJsZ3Vlc3RwYXJ0ICovCisjZGVmaW5lIENUUkxDSEFOX0FDS19GUk9NX0NUUkxQQVJUIDMgLyogdXNlZCBieSBjdHJsZ3Vlc3RwYXJ0IHRvICdyZW1vdmUnIEV2ZW50cworCQkJCSAgICAgICogZnJvbSBjdHJscGFydCAqLworCisvKiBzaXplIG9mIGNkYiAtIGkuZS4sIHNjc2kgY21uZCAqLworI2RlZmluZSBNQVhfQ01ORF9TSVpFIDE2CisKKyNkZWZpbmUgTUFYX1NFTlNFX1NJWkUgNjQKKworI2RlZmluZSBNQVhfUEhZU19JTkZPIDY0CisKKy8qIEJlY2F1c2UgR3Vlc3RUb0d1ZXN0Q29weSBpcyBsaW1pdGVkIHRvIDRLaUIgc2VnbWVudHMsIGFuZCB3ZSBoYXZlIGxpbWl0ZWQgdGhlCisqIEVtdWxleCBEcml2ZXIgdG8gMjU2IHNjYXR0ZXIgbGlzdCBzZWdtZW50cyB2aWEgdGhlIGxwZmNfc2dfc2VnX2NudCBwYXJhbWV0ZXIKKyogdG8gMjU2LCB0aGUgbWF4aW11bSBJL08gc2l6ZSBpcyBsaW1pdGVkIHRvIDI1NiAqIDQgS2lCID0gMSBNQiAqLworI2RlZmluZSBNQVhfSU9fU0laRSAgICgxMDI0KjEwMjQpCS8qIDEgTUIgKi8KKworLyogTk9URSAxOiBscGZjIGRlZmluZXMgaXRzIHN1cHBvcnQgZm9yIHNlZ21lbnRzIGluCisqICNkZWZpbmUgTFBGQ19TR19TRUdfQ05UIDY0CisqCisqIE5PVEUgMjogSW4gTGludXgsIGZyYWdzIGFycmF5IGluIHNrYiBpcyBjdXJyZW50bHkgYWxsb2NhdGVkIHRvIGJlCisqIE1BWF9TS0JfRlJBR1Mgc2l6ZSwgd2hpY2ggaXMgMTggd2hpY2ggaXMgc21hbGxlciB0aGFuIE1BWF9QSFlTX0lORk8gZm9yCisqIG5vdy4gICovCisKKyNpZm5kZWYgTUFYX1NFUklBTF9OVU0KKyNkZWZpbmUgTUFYX1NFUklBTF9OVU0JCTMyCisjZW5kaWYJCQkJLyogTUFYX1NFUklBTF9OVU0gKi8KKworI2RlZmluZSBNQVhfU0NTSV9CVVNFUwkJMQorI2RlZmluZSBNQVhfU0NTSV9UQVJHRVRTCTgKKyNkZWZpbmUgTUFYX1NDU0lfTFVOUwkJMTYKKyNkZWZpbmUgTUFYX1NDU0lfRlJPTV9IT1NUCTB4RkZGRkZGRkYJLyogSW5kaWNhdG9yIHRvIHVzZSBQaHlzaWNhbCBIQkEKKwkJCQkJCSAqIFNDU0kgSG9zdCB2YWx1ZSAqLworCisvKiB2YXJpb3VzIHR5cGVzIG9mIG5ldHdvcmsgcGFja2V0cyB0aGF0IGNhbiBiZSBzZW50IGluIGNtZHJzcCAqLwordHlwZWRlZiBlbnVtIHsgTkVUX1JDVl9QT1NUID0gMCwJLyogc3VibWl0IGJ1ZmZlciB0byBob2xkIHJlY2VpdmluZworCQkJCQkgKiBpbmNvbWluZyBwYWNrZXQgKi8KKwkvKiB2aXJ0bmljIC0+IHVpc25pYyAqLworCU5FVF9SQ1YsCQkvKiBpbmNvbWluZyBwYWNrZXQgcmVjZWl2ZWQgKi8KKwkvKiB1aXNuaWMgLT4gdmlydHBjaSAqLworCU5FVF9YTUlULAkJLyogZm9yIG91dGdvaW5nIG5ldCBwYWNrZXRzICAgICAgKi8KKwkvKiB2aXJ0bmljIC0+IHVpc25pYyAqLworCU5FVF9YTUlUX0RPTkUsCQkvKiBvdXRnb2luZyBwYWNrZXQgeG1pdHRlZCAqLworCS8qIHVpc25pYyAtPiB2aXJ0cGNpICovCisJTkVUX1JDVl9FTkJESVMsCQkvKiBlbmFibGUvZGlzYWJsZSBwYWNrZXQgcmVjZXB0aW9uICovCisJLyogdmlydG5pYyAtPiB1aXNuaWMgKi8KKwlORVRfUkNWX0VOQkRJU19BQ0ssCS8qIGFja25vd2xlZGdlIGVuYWJsZS9kaXNhYmxlIHBhY2tldAorCQkJCSAqIHJlY2VwdGlvbiAqLworCS8qIHVpc25pYyAtPiB2aXJ0bmljICovCisJTkVUX1JDVl9QUk9NSVNDLAkvKiBlbmFibGUvZGlzYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJLyogdmlydG5pYyAtPiB1aXNuaWMgKi8KKwlORVRfQ09OTkVDVF9TVEFUVVMsCS8qIGluZGljYXRlIHRoZSBsb3NzIG9yIHJlc3RvcmF0aW9uIG9mIGEgbmV0d29yaworCQkJCSAqIGNvbm5lY3Rpb24gKi8KKwkvKiB1aXNuaWMgLT4gdmlydG5pYyAqLworCU5FVF9NQUNBRERSLAkJLyogaW5kaWNhdGVzIHRoZSBjbGllbnQgaGFzIHJlcXVlc3RlZCB0byB1cGRhdGUKKwkJCQkgKiBpdHMgTUFDIGFkZHIgKi8KKwlORVRfTUFDQUREUl9BQ0ssCS8qIE1hYyBhZGRyZXMgICovCisKK30gTkVUX1RZUEVTOworCisjZGVmaW5lCQlFVEhfSEVBREVSX1NJWkUgMTQJLyogc2l6ZSBvZiBldGhlcm5ldCBoZWFkZXIgKi8KKworI2RlZmluZQkJRVRIX01JTl9EQVRBX1NJWkUgNDYJLyogbWluaW11bSBldGggZGF0YSBzaXplICovCisjZGVmaW5lCQlFVEhfTUlOX1BBQ0tFVF9TSVpFIChFVEhfSEVBREVSX1NJWkUgKyBFVEhfTUlOX0RBVEFfU0laRSkKKworI2RlZmluZSAgICAgRVRIX0RFRl9EQVRBX1NJWkUgMTUwMAkvKiBkZWZhdWx0IGRhdGEgc2l6ZSAqLworI2RlZmluZSAgICAgRVRIX0RFRl9QQUNLRVRfU0laRSAoRVRIX0hFQURFUl9TSVpFICsgRVRIX0RFRl9EQVRBX1NJWkUpCisKKyNkZWZpbmUJCUVUSF9NQVhfTVRVIDE2Mzg0CS8qIG1heGltdW0gZGF0YSBzaXplICovCisKKyNpZm5kZWYgTUFYX01BQ0FERFJfTEVOCisjZGVmaW5lIE1BWF9NQUNBRERSX0xFTiA2CS8qIG51bWJlciBvZiBieXRlcyBpbiBNQUMgYWRkcmVzcyAqLworI2VuZGlmCQkJCS8qIE1BWF9NQUNBRERSX0xFTiAqLworCisjZGVmaW5lIEVUSF9JU19MT0NBTExZX0FETUlOSVNURVJFRChBZGRyZXNzKSBcCisJKCgoVTggKikgKEFkZHJlc3MpKVswXSAmICgoVTgpIDB4MDIpKQorI2RlZmluZSBOSUNfVkVORE9SX0lEIDB4MDAwODAwMEIKKworLyogdmFyaW91cyB0eXBlcyBvZiBzY3NpIHRhc2sgbWdtdCBjb21tYW5kcyAgKi8KK3R5cGVkZWYgZW51bSB7IFRBU0tfTUdNVF9BQk9SVF9UQVNLID0KKwkgICAgMSwgVEFTS19NR01UX0JVU19SRVNFVCwgVEFTS19NR01UX0xVTl9SRVNFVCwKKwkgICAgVEFTS19NR01UX1RBUkdFVF9SRVNFVCwKK30gVEFTS19NR01UX1RZUEVTOworCisvKiB2YXJpb3VzIHR5cGVzIG9mIHZkaXNrIG1nbXQgY29tbWFuZHMgICovCit0eXBlZGVmIGVudW0geyBWRElTS19NR01UX0FDUVVJUkUgPSAxLCBWRElTS19NR01UX1JFTEVBU0UsCit9IFZESVNLX01HTVRfVFlQRVM7CisKKy8qIHRoaXMgaXMgdXNlZCBpbiB0aGUgdmRlc3QgZmllbGQgICovCisjZGVmaW5lIFZERVNUX0FMTCAweEZGRkYKKworI2RlZmluZSBNSU5fTlVNU0lHTkFMUyA2NAorI2RlZmluZSBNQVhfTlVNU0lHTkFMUyA0MDk2CisKKy8qIE1BWF9ORVRfUkNWX0JVRiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiByY3YgYnVmZmVycyB0aGF0IGFyZSBjcmVhdGVkIGJ5IGVhY2gKKyogZ3Vlc3QncyB2aXJ0bmljIGFuZCBwb3N0ZWQgdG8gdWlzbmljLiAgVWlzbmljLCBmb3IgZWFjaCBjaGFubmVsLCBrZWVwcyB0aGUgcmN2CisqIGJ1ZmZlcnMgcG9zdGVkIGFuZCB1c2VzIHRoZW0gdG8gcmVjZWl2ZSBkYXRhIG9uIGJlaGFsZiBvZiB0aGUgZ3Vlc3QncyB2aXJ0bmljLgorKiBOT1RFOiB0aGUgbnVtX3Jjdl9idWZzIGlzIGNvbmZpZ3VyYWJsZSBmb3IgZWFjaCBWTklDLiBTbyB0aGUgZm9sbG93aW5nIGlzCisqIHNpbXBseSBhbiB1cHBlcmxpbWl0IG9uIHdoYXQgZWFjaCBWTklDIGNhbiBwcm92aWRlLiAgU2V0dGluZyBpdCB0byBoYWxmIG9mIHRoZQorKiBOVU1TSUdOQUxTIHRvIHByZXZlbnQgcXVldWUgZnVsbCBkZWFkbG9ja3MgKi8KKyNkZWZpbmUgTUFYX05FVF9SQ1ZfQlVGUyAoTUlOX05VTVNJR05BTFMgLyAyKQorCisvKgorICogc3RydWN0cyB3aXRoIHByYWdtYSBwYWNrICAqLworCisKKy8qIC8vLy8vLy8vLy8vLy8gQkVHSU4gUFJBR01BIFBBQ0sgUFVTSCAxIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKy8qIC8vLy8vLy8vLy8vLy8gT05MWSBTVFJVQ1QgVFlQRSBTSE9VTEQgQkUgQkVMT1cgKi8KKworI3ByYWdtYSBwYWNrKHB1c2gsIDEpCisKK3N0cnVjdCBndWVzdF9waHlzX2luZm8geworCVU2NCBhZGRyZXNzOworCVU2NCBsZW5ndGg7Cit9OworCisjZGVmaW5lIEdQSV9FTlRSSUVTX1BFUl9QQUdFIChQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGd1ZXN0X3BoeXNfaW5mbykpCisKK3N0cnVjdCB1aXNzY3NpX2Rlc3QgeworCVUzMiBjaGFubmVsOwkJLyogY2hhbm5lbCA9PSBidXMgbnVtYmVyICovCisJVTMyIGlkOwkJCS8qIGlkID09IHRhcmdldCBudW1iZXIgKi8KKwlVMzIgbHVuOwkJLyogbHVuID09IGxvZ2ljYWwgdW5pdCBudW1iZXIgKi8KK307CisKK3N0cnVjdCB2aGJhX3d3bm4geworCVUzMiB3d25uMTsKKwlVMzIgd3dubjI7Cit9OworCisvKiBXQVJOSU5HOiBWYWx1ZXMgc3RpcmVkIGluIHRoaXMgc3RydWN0dXJlIG11c3QgY29udGFpbiBtYXhpbXVtIGNvdW50cyAobm90CisgKiBtYXhpbXVtIHZhbHVlcykuICovCitzdHJ1Y3QgdmhiYV9jb25maWdfbWF4IHsJLyogMjAgYnl0ZXMgKi8KKwlVMzIgbWF4X2NoYW5uZWw7CS8qIG1heGltdW0gY2hhbm5lbCBmb3IgZGV2aWNlcyBhdHRhY2hlZCB0byB0aGlzCisJCQkJICogYnVzICovCisJVTMyIG1heF9pZDsJCS8qIG1heGltdW0gU0NTSSBJRCBmb3IgZGV2aWNlcyBhdHRhY2hlZCB0byB0aGlzCisJCQkJICogYnVzICovCisJVTMyIG1heF9sdW47CQkvKiBtYXhpbXVtIFNDU0kgTFVOIGZvciBkZXZpY2VzIGF0dGFjaGVkIHRvIHRoaXMKKwkJCQkgKiBidXMgKi8KKwlVMzIgY21kX3Blcl9sdW47CS8qIG1heGltdW0gbnVtYmVyIG9mIG91dHN0YW5kaW5nIGNvbW1hbmRzIHBlcgorCQkJCSAqIGx1biB0aGF0IGFyZSBhbGxvd2VkIGF0IG9uZSB0aW1lICovCisJVTMyIG1heF9pb19zaXplOwkvKiBtYXhpbXVtIGlvIHNpemUgZm9yIGRldmljZXMgYXR0YWNoZWQgdG8gdGhpcworCQkJCSAqIGJ1cyAqLworCS8qIG1heCBpbyBzaXplIGlzIG9mdGVuIGRldGVybWluZWQgYnkgdGhlIHJlc291cmNlIG9mIHRoZSBoYmEuIGUuZyAqLworCS8qIG1heCBzY2F0dGVyIGdhdGhlciBsaXN0IGxlbmd0aCAqIHBhZ2Ugc2l6ZSAvIHNlY3RvciBzaXplICovCit9OworCitzdHJ1Y3QgdWlzY21kcnNwX3Njc2kgeworCXZvaWQgKnNjc2ljbWQ7CQkvKiB0aGUgaGFuZGxlIHRvIHRoZSBjbWQgdGhhdCB3YXMgcmVjZWl2ZWQgLQorCQkJCSAqIHNlbmQgaXQgYmFjayBhcyBpcyBpbiB0aGUgcnNwIHBhY2tldC4gICovCisJVTggY21uZFtNQVhfQ01ORF9TSVpFXTsJLyogdGhlIGNkYiBmb3IgdGhlIGNvbW1hbmQgKi8KKwlVMzIgYnVmZmxlbjsJCS8qIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIG91dCBvciBpbiAqLworCVUxNiBndWVzdF9waHlzX2VudHJpZXM7CS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHNjYXR0ZXItZ2F0aGVyIChzZykKKwkJCQkgKiBsaXN0ICovCisJc3RydWN0IGd1ZXN0X3BoeXNfaW5mbyBncGlfbGlzdFtNQVhfUEhZU19JTkZPXTsJLyogcGh5c2ljYWwgYWRkcmVzcworCQkJCQkJCSAqIGluZm9ybWF0aW9uIGZvciBlYWNoCisJCQkJCQkJICogZnJhZ21lbnQgKi8KKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiAgZGF0YV9kaXI7IC8qIGRpcmVjdGlvbiBvZiB0aGUgZGF0YSwgaWYgYW55ICovCisJc3RydWN0IHVpc3Njc2lfZGVzdCB2ZGVzdDsJLyogaWRlbnRpZmllcyB0aGUgdmlydHVhbCBoYmEsIGlkLAorCQkJCQkgKiBjaGFubmVsLCBsdW4gdG8gd2hpY2ggY21kIHdhcyBzZW50ICovCisKKwkgICAgLyogdGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG5lZWRlZCB0byBxdWV1ZSB0aGUgcnNwIGJhY2sgdG8gY21kCisJICAgICAqIG9yaWdpbmF0b3IgKi8KKwlpbnQgbGludXhzdGF0OwkJLyogdGhlIG9yaWdpbmFsIExpbnV4IHN0YXR1cyAtIGZvciB1c2UgYnkgbGludXgKKwkJCQkgKiB2ZGlzayBjb2RlICovCisJVTggc2NzaXN0YXQ7CQkvKiB0aGUgc2NzaSBzdGF0dXMgKi8KKwlVOCBhZGRsc3RhdDsJCS8qIG5vbi1zY3NpIHN0YXR1cyAtIGNvdmVycyBjYXNlcyBsaWtlIHRpbWVvdXQKKwkJCQkgKiBuZWVkZWQgYnkgd2luZG93cyBndWVzdHMgKi8KKyNkZWZpbmUgQURETF9SRVNFVAkJMQorI2RlZmluZSBBRERMX1RJTUVPVVQJCTIKKyNkZWZpbmUgQURETF9JTlRFUk5BTF9FUlJPUgkzCisjZGVmaW5lIEFERExfU0VMX1RJTUVPVVQJNAorI2RlZmluZSBBRERMX0NNRF9USU1FT1VUCTUKKyNkZWZpbmUgQURETF9CQURfVEFSR0VUCQk2CisjZGVmaW5lIEFERExfUkVUUlkJCTcKKworCS8qIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBuZWVkIHRvIGRldGVybWluZSB0aGUgcmVzdWx0IG9mIGNvbW1hbmQgKi8KKwkgVTggc2Vuc2VidWZbTUFYX1NFTlNFX1NJWkVdOwkvKiBzZW5zZSBpbmZvIGluIGNhc2UgY21kIGZhaWxlZDsgKi8KKwkvKiBpdCBob2xkcyB0aGUgc2Vuc2VfZGF0YSBzdHJ1Y3Q7ICovCisJLyogc2VlIHRoYXQgc3RydWN0IGZvciBkZXRhaWxzLiAqLworCXZvaWQgKnZkaXNrOyAvKiBjb250YWlucyBwb2ludGVyIHRvIHRoZSB2ZGlzayBzbyB0aGF0IHdlIGNhbiBjbGVhbiB1cAorCQkgICAgICAqIHdoZW4gdGhlIElPIGNvbXBsZXRlcy4gKi8KKwlpbnQgbm9fZGlza19yZXN1bHQ7CS8qIHVzZWQgdG8gcmV0dXJuIG5vIGRpc2sgaW5xdWlyeSByZXN1bHQgKi8KKwkvKiB3aGVuIG5vX2Rpc2tfcmVzdWx0IGlzIHNldCB0byAxLCAgKi8KKwkvKiBzY3NpLnNjc2lzdGF0IGlzIFNBTV9TVEFUX0dPT0QgKi8KKwkvKiBzY3NpLmFkZGxzdGF0IGlzIDAgKi8KKwkvKiBzY3NpLmxpbnV4c3RhdCBpcyBTQU1fU1RBVF9HT09EICovCisJLyogVGhhdCBpcywgdGhlcmUgaXMgTk8gZXJyb3IuICovCit9OworCisvKgorKiBEZWZpbmVzIHRvIHN1cHBvcnQgc2VuZGluZyBjb3JyZWN0IGlucXVpcnkgcmVzdWx0IHdoZW4gbm8gZGlzayBpcworKiBjb25maWd1cmVkLiAgKi8KKworLyogRnJvbSBTQ1NJIFNQQzIgLQorICoKKyAqIElmIHRoZSB0YXJnZXQgaXMgbm90IGNhcGFibGUgb2Ygc3VwcG9ydGluZyBhIGRldmljZSBvbiB0aGlzIGxvZ2ljYWwgdW5pdCwgdGhlCisgKiBkZXZpY2Ugc2VydmVyIHNoYWxsIHNldCB0aGlzIGZpZWxkIHRvIDdGaCAoUEVSSVBIRVJBTCBRVUFMSUZJRVIgc2V0IHRvIDAxMWIKKyAqIGFuZCBQRVJJUEhFUkFMIERFVklDRSBUWVBFIHNldCB0byAxRmgpLgorICoKKyAqVGhlIGRldmljZSBzZXJ2ZXIgaXMgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIHRoZSBzcGVjaWZpZWQgcGVyaXBoZXJhbCBkZXZpY2UKKyAqdHlwZSBvbiB0aGlzIGxvZ2ljYWwgdW5pdC4gSG93ZXZlciwgdGhlIHBoeXNpY2FsIGRldmljZSBpcyBub3QgY3VycmVudGx5CisgKmNvbm5lY3RlZCB0byB0aGlzIGxvZ2ljYWwgdW5pdC4KKyAqLworCisjZGVmaW5lIERFVl9OT1RfUFJFU0VOVCAweDdmCS8qIG9sZCBuYW1lIC0gY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBERVZfTk9UX0NBUEFCTEUgMHg3ZgkvKiBwZXJpcGhlcmFsIHF1YWxpZmllciBvZiAweDMgICovCisgICAgLyogcGVyaXBoZXJhbCB0eXBlIG9mIDB4MWYgKi8KKyAgICAvKiBzcGVjaWZpZXMgbm8gZGV2aWNlIGJ1dCB0YXJnZXQgcHJlc2VudCAqLworCisjZGVmaW5lIERFVl9ESVNLX0NBUEFCTEVfTk9UX1BSRVNFTlQgMHgyMCAvKiBwZXJpcGhlcmFsIHF1YWxpZmllciBvZiAweDEgKi8KKyAgICAvKiBwZXJpcGhlcmFsIHR5cGUgb2YgMCAtIGRpc2sgKi8KKyAgICAvKiBzcGVjaWZpZXMgZGV2aWNlIGNhcGFibGUsIGJ1dCBub3QgcHJlc2VudCAqLworCisjZGVmaW5lIERFVl9QUk9DX0NBUEFCTEVfTk9UX1BSRVNFTlQgMHgyMyAvKiBwZXJpcGhlcmFsIHF1YWxpZmllciBvZiAweDEgKi8KKyAgICAvKiBwZXJpcGhlcmFsIHR5cGUgb2YgMyAtIHByb2Nlc3NvciAqLworICAgIC8qIHNwZWNpZmllcyBkZXZpY2UgY2FwYWJsZSwgYnV0IG5vdCBwcmVzZW50ICovCisKKyNkZWZpbmUgREVWX0hJU1VQUE9SVCAweDEwOwkvKiBIaVN1cCA9IDE7IHNob3dzIHN1cHBvcnQgZm9yIHJlcG9ydCBsdW5zICovCisgICAgLyogbXVzdCBiZSByZXR1cm5lZCBmb3IgbHVuIDAuICovCisKKy8qIE5PVEU6IExpbnV4IGNvZGUgYXNzdW1lcyBpbnF1aXJ5IGNvbnRhaW5zIDM2IGJ5dGVzLiBXaXRob3V0IGNoZWNraW5nIGxlbmd0aAorKiBpbiBidWZbNF0gc29tZSBsaW51eCBjb2RlIGFjY2Vzc2VzIGJ5dGVzIGJleW9uZCA1IHRvIHJldHJpZXZlIHZlbmRvciwgcHJvZHVjdAorKiAmIHJldmlzaW9uLiAgWWlrZXMhIFNvIGxldCB1cyBhbHdheXMgc2VuZCBiYWNrIDM2IGJ5dGVzLCB0aGUgbWluaW11bSBmb3IKKyogaW5xdWlyeSByZXN1bHQuICovCisjZGVmaW5lIE5PX0RJU0tfSU5RVUlSWV9SRVNVTFRfTEVOIDM2CisKKyNkZWZpbmUgTUlOX0lOUVVJUllfUkVTVUxUX0xFTiA1IC8qIHdlIG5lZWQgYXQgbGVhc3QgNSBieXRlcyBtaW5pbXVtIGZvciBpbnF1aXJ5CisJCQkJICAqIHJlc3VsdCAqLworCisvKiBTQ1NJIGRldmljZSB2ZXJzaW9uIGZvciBubyBkaXNrIGlucXVpcnkgcmVzdWx0ICovCisjZGVmaW5lIFNDU0lfU1BDMl9WRVIgNAkJLyogaW5kaWNhdGVzIFNDU0kgU1BDMiAoU1BDMyBpcyA1KSAqLworCisvKiBXaW5kb3dzIGFuZCBMaW51eCB3YW50IGRpZmZlcmVudCB0aGluZ3MgZm9yIGEgbm9uLWV4aXN0ZW50IGx1bi4gU28sIHdlJ2xsIGxldAorICogY2FsbGVyIHBhc3MgaW4gdGhlIHBlcmlwaGVyYWwgcXVhbGlmaWVyIGFuZCB0eXBlLgorICogTk9URTpbNF0gU0NTSSByZXR1cm5zIChuLTQpOyBzbyB3ZSByZXR1cm4gbGVuZ3RoLTEtNCBvciBsZW5ndGgtNS4gKi8KKworI2RlZmluZSBTRVRfTk9fRElTS19JTlFVSVJZX1JFU1VMVChidWYsIGxlbiwgbHVuLCBsdW4wbm90cHJlc2VudCwgbm90cHJlc2VudCkgXAorCWRvIHsJCQkJCQkJCVwKKwkJTUVNU0VUKGJ1ZiwgMCwJCQkJCQlcCisJCSAgICAgICBNSU5OVU0obGVuLAkJCQkJXAorCQkJICAgICAgKHVuc2lnbmVkIGludCkgTk9fRElTS19JTlFVSVJZX1JFU1VMVF9MRU4pKTsgXAorCQlidWZbMl0gPSAoVTgpIFNDU0lfU1BDMl9WRVI7CQkJCVwKKwkJaWYgKGx1biA9PSAwKSB7CQkJCQkJXAorCQkJYnVmWzBdID0gKFU4KSBsdW4wbm90cHJlc2VudDsJCQlcCisJCQlidWZbM10gPSAoVTgpIERFVl9ISVNVUFBPUlQ7CQkJXAorCQl9IGVsc2UJCQkJCQkJXAorCQkJYnVmWzBdID0gKFU4KSBub3RwcmVzZW50OwkJCVwKKwkJYnVmWzRdID0gKFU4KSAoCQkJCQkJXAorCQkJTUlOTlVNKGxlbiwJCQkJCVwKKwkJCSAgICAgICAodW5zaWduZWQgaW50KSBOT19ESVNLX0lOUVVJUllfUkVTVUxUX0xFTikgLSA1KTsJXAorCQlpZiAobGVuID49IE5PX0RJU0tfSU5RVUlSWV9SRVNVTFRfTEVOKSB7CQlcCisJCQlidWZbOF0gPSAnRCc7CQkJCQlcCisJCQlidWZbOV0gPSAnRSc7CQkJCQlcCisJCQlidWZbMTBdID0gJ0wnOwkJCQkJXAorCQkJYnVmWzExXSA9ICdMJzsJCQkJCVwKKwkJCWJ1ZlsxNl0gPSAnUCc7CQkJCQlcCisJCQlidWZbMTddID0gJ1MnOwkJCQkJXAorCQkJYnVmWzE4XSA9ICdFJzsJCQkJCVwKKwkJCWJ1ZlsxOV0gPSAnVSc7CQkJCQlcCisJCQlidWZbMjBdID0gJ0QnOwkJCQkJXAorCQkJYnVmWzIxXSA9ICdPJzsJCQkJCVwKKwkJCWJ1ZlsyMl0gPSAnICc7CQkJCQlcCisJCQlidWZbMjNdID0gJ0QnOwkJCQkJXAorCQkJYnVmWzI0XSA9ICdFJzsJCQkJCVwKKwkJCWJ1ZlsyNV0gPSAnVic7CQkJCQlcCisJCQlidWZbMjZdID0gJ0knOwkJCQkJXAorCQkJYnVmWzI3XSA9ICdDJzsJCQkJCVwKKwkJCWJ1ZlsyOF0gPSAnRSc7CQkJCQlcCisJCQlidWZbMzBdID0gJyAnOwkJCQkJXAorCQkJYnVmWzMxXSA9ICcuJzsJCQkJCVwKKwkJfQkJCQkJCQlcCisJfSB3aGlsZSAoMCkKKworCisvKgorKiBTdHJ1Y3QgJiBEZWZpbmVzIHRvIHN1cHBvcnQgc2Vuc2UgaW5mb3JtYXRpb24uCisqLworCisKKy8qIFRoZSBmb2xsb3dpbmcgc3RydWN0IGlzIHJldHVybmVkIGluIHNlbnNlYnVmIGZpZWxkIGluIHVpc2NtZHJzcF9zY3NpLiAgSXQgaXMKKyogaW5pdGlhbGl6ZWQgaW4gZXhhY3RseSB0aGUgbWFubmVyIHRoYXQgaXMgcmVjb21tZW5kZWQgaW4gV2luZG93cyAoaGVuY2UgdGhlCisqIG9kZCB2YWx1ZXMpLgorKiBXaGVuIHNldCwgdGhlc2UgZmllbGRzIHdpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyogRXJyb3JDb2RlID0gMHg3MAkJaW5kaWNhdGVzIGN1cnJlbnQgZXJyb3IKKyogVmFsaWQgPSAxCQkJaW5kaWNhdGVzIHNlbnNlIGluZm8gaXMgdmFsaWQKKyogU2Vuc2VLZXkJCQljb250YWlucyBzZW5zZSBrZXkgYXMgZGVmaW5lZCBieSBTQ1NJIHNwZWNzLgorKiBBZGRpdGlvbmFsU2Vuc2VDb2RlCQljb250YWlucyBzZW5zZSBrZXkgYXMgZGVmaW5lZCBieSBTQ1NJIHNwZWNzLgorKiBBZGRpdGlvbmFsU2Vuc2VDb2RlUXVhbGlmaWVyCWNvbnRhaW5zIHF1YWxpZmllciB0byBzZW5zZSBjb2RlIGFzIGRlZmluZWQgYnkKKyoJCQkJc2NzaSBkb2NzLgorKiBBZGRpdGlvbmFsU2Vuc2VMZW5ndGgJCWNvbnRhaW5zIHdpbGwgYmUgc2l6ZW9mKHNlbnNlX2RhdGEpLTg9MTAuCisqLworc3RydWN0IHNlbnNlX2RhdGEgeworCVU4IEVycm9yQ29kZTo3OworCVU4IFZhbGlkOjE7CisJVTggU2VnbWVudE51bWJlcjsKKwlVOCBTZW5zZUtleTo0OworCVU4IFJlc2VydmVkOjE7CisJVTggSW5jb3JyZWN0TGVuZ3RoOjE7CisJVTggRW5kT2ZNZWRpYToxOworCVU4IEZpbGVNYXJrOjE7CisJVTggSW5mb3JtYXRpb25bNF07CisJVTggQWRkaXRpb25hbFNlbnNlTGVuZ3RoOworCVU4IENvbW1hbmRTcGVjaWZpY0luZm9ybWF0aW9uWzRdOworCVU4IEFkZGl0aW9uYWxTZW5zZUNvZGU7CisJVTggQWRkaXRpb25hbFNlbnNlQ29kZVF1YWxpZmllcjsKKwlVOCBGaWVsZFJlcGxhY2VhYmxlVW5pdENvZGU7CisJVTggU2Vuc2VLZXlTcGVjaWZpY1szXTsKK307CisKKy8qIHNvbWUgU0NTSSBBRFNFTlNFIGNvZGVzICovCisjaWZuZGVmIFNDU0lfQURTRU5TRV9MVU5fTk9UX1JFQURZCisjZGVmaW5lIFNDU0lfQURTRU5TRV9MVU5fTk9UX1JFQURZIDB4MDQKKyNlbmRpZgkvKiAgKi8KKyNpZm5kZWYgU0NTSV9BRFNFTlNFX0lMTEVHQUxfQ09NTUFORAorI2RlZmluZSBTQ1NJX0FEU0VOU0VfSUxMRUdBTF9DT01NQU5EIDB4MjAKKyNlbmRpZgkvKiAgKi8KKyNpZm5kZWYgU0NTSV9BRFNFTlNFX0lMTEVHQUxfQkxPQ0sKKyNlbmRpZgkvKiAgKi8KKyNpZm5kZWYgU0NTSV9BRFNFTlNFX0lMTEVHQUxfQkxPQ0sKKyNkZWZpbmUgU0NTSV9BRFNFTlNFX0lMTEVHQUxfQkxPQ0sgIDB4MjEKKyNlbmRpZgkvKiAgKi8KKyNpZm5kZWYgU0NTSV9BRFNFTlNFX0lOVkFMSURfQ0RCCisjZGVmaW5lIFNDU0lfQURTRU5TRV9JTlZBTElEX0NEQiAgICAweDI0CisjZW5kaWYJLyogICovCisjaWZuZGVmIFNDU0lfQURTRU5TRV9JTlZBTElEX0xVTgorI2RlZmluZSBTQ1NJX0FEU0VOU0VfSU5WQUxJRF9MVU4gICAgMHgyNQorI2VuZGlmCS8qICAqLworI2lmbmRlZiBTQ1NJX0FEV1JJVEVfUFJPVEVDVAorI2RlZmluZSBTQ1NJX0FEV1JJVEVfUFJPVEVDVCAgICAgICAgMHgyNworI2VuZGlmCS8qICAqLworI2lmbmRlZiBTQ1NJX0FEU0VOU0VfTUVESVVNX0NIQU5HRUQKKyNkZWZpbmUgU0NTSV9BRFNFTlNFX01FRElVTV9DSEFOR0VEIDB4MjgKKyNlbmRpZgkvKiAgKi8KKyNpZm5kZWYgU0NTSV9BRFNFTlNFX0JVU19SRVNFVAorI2RlZmluZSBTQ1NJX0FEU0VOU0VfQlVTX1JFU0VUICAgICAgMHgyOQorI2VuZGlmCS8qICAqLworI2lmbmRlZiBTQ1NJX0FEU0VOU0VfTk9fTUVESUFfSU5fREVWSUNFCisjZGVmaW5lIFNDU0lfQURTRU5TRV9OT19NRURJQV9JTl9ERVZJQ0UgMHgzYQorI2VuZGlmCS8qICAqLworCitzdHJ1Y3QgbmV0X3BrdF94bXQgeworCWludCBsZW47CS8qIGZ1bGwgbGVuZ3RoIG9mIGRhdGEgaW4gdGhlIHBhY2tldCAqLworCWludCBudW1fZnJhZ3M7CS8qIG51bWJlciBvZiBmcmFnbWVudHMgaW4gZnJhZ3MgY29udGFpbmluZyBkYXRhICovCisJc3RydWN0IHBoeXNfaW5mbyBmcmFnc1tNQVhfUEhZU19JTkZPXTsJLyogcGh5c2ljYWwgcGFnZSBpbmZvcm1hdGlvbiBmb3IKKwkJCQkJCSAqIGVhY2ggZnJhZ21lbnQgKi8KKwljaGFyIGV0aGhkcltFVEhfSEVBREVSX1NJWkVdOwkvKiB0aGUgZXRoZXJuZXQgaGVhZGVyICAqLworCXN0cnVjdCB7CisKKwkJICAgIC8qIHRoZXNlIGFyZSBuZWVkZWQgZm9yIGNzdW0gYXQgdWlzbmljIGVuZCAqLworCQlVOCB2YWxpZDsJLyogMSA9IHJlc3Qgb2YgdGhpcyBzdHJ1Y3QgaXMgdmFsaWQgLSBlbHNlCisJCQkJICogaWdub3JlICovCisJCVU4IGhyYXdvZmZ2OwkvKiAxID0gaHdyYWZvZmYgaXMgdmFsaWQgKi8KKwkJVTggbmhyYXdvZmZ2OwkvKiAxID0gbmh3cmFmb2ZmIGlzIHZhbGlkICovCisJCVUxNiBwcm90b2NvbDsJLyogc3BlY2lmaWVzIHBhY2tldCBwcm90b2NvbCAqLworCQlVMzIgY3N1bTsJLyogdmFsdWUgdXNlZCB0byBzZXQgc2tiLT5jc3VtIGF0IElPUGFydCAqLworCQlVMzIgaHJhd29mZjsJLyogdmFsdWUgdXNlZCB0byBzZXQgc2tiLT5oLnJhdyBhdCBJT1BhcnQgKi8KKwkJLyogaHJhd29mZiBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBUUkFOU1BPUlQgTEFZRVIgSEVBREVSICovCisJCVUzMiBuaHJhd29mZjsJLyogdmFsdWUgdXNlZCB0byBzZXQgc2tiLT5uaC5yYXcgYXQgSU9QYXJ0ICovCisJCS8qIG5ocmF3b2ZmIHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIE5FVFdPUksgTEFZRVIgSEVBREVSICovCisJfSBsaW5jc3VtOworCisJICAgIC8qICoqKiogTk9URSAqKioqCisJICAgICAqIFRoZSBmdWxsIHBhY2tldCBpcyBkZXNjcmliZWQgaW4gZnJhZ3MgYnV0IHRoZSBldGhlcm5ldCBoZWFkZXIgaXMKKwkgICAgICogc2VwYXJhdGVseSBrZXB0IGluIGV0aGhkciBzbyB0aGF0IHVpc25pYyBkb2Vzbid0IGhhdmUgIk1BUCIgdGhlCisJICAgICAqIGd1ZXN0IG1lbW9yeSB0byBnZXQgdG8gdGhlIGhlYWRlci4gdWlzbmljIG5lZWRzIGV0aGhkciB0bworCSAgICAgKiBkZXRlcm1pbmUgaG93IHRvIHJvdXRlIHRoZSBwYWNrZXQuCisJICAgICAqLworfTsKKworc3RydWN0IG5ldF9wa3RfeG10ZG9uZSB7CisJVTMyIHhtdF9kb25lX3Jlc3VsdDsJLyogcmVzdWx0IG9mIE5FVF9YTUlUICovCisjZGVmaW5lIFhNSVRfU1VDQ0VTUyAwCisjZGVmaW5lIFhNSVRfRkFJTEVEIDEKK307CisKKy8qIFJDVlBPU1RfQlVGX1NJWmUgbXVzdCBiZSBhdCBtb3N0IHBhZ2Vfc2l6ZSg0MDk2KSAtIGNhY2hlX2xpbmVfc2l6ZSAoNjQpIFRoZQorKiByZWFzb24gaXMgYmVjYXVzZSBkZXZfc2tiX2FsbG9jIHdoaWNoIGlzIHVzZWQgdG8gZ2VuZXJhdGUgUkNWX1BPU1Qgc2ticyBpbgorKiB2aXJ0bmljIHJlcXVpcmVzIHRoYXQgdGhlcmUgaXMgIm92ZXJoZWFkIiBpbiB0aGUgYnVmZmVyLCBhbmQgcGFkcyAxNiBieXRlcy4gIEkKKyogcHJlZmVyIHRvIHVzZSAxIGZ1bGwgY2FjaGUgbGluZSBzaXplIGZvciAib3ZlcmhlYWQiIHNvIHRoYXQgdHJhbnNmZXJzIGFyZQorKiBiZXR0ZXIuICBJT1ZNIHJlcXVpcmVzIHRoYXQgYSBidWZmZXIgYmUgcmVwcmVzZW50ZWQgYnkgMSBwaHlzX2luZm8gc3RydWN0dXJlCisqIHdoaWNoIGNhbiBvbmx5IGNvdmVyIHBhZ2Vfc2l6ZS4gKi8KKyNkZWZpbmUgUkNWUE9TVF9CVUZfU0laRSA0MDMyCisjZGVmaW5lIE1BWF9ORVRfUkNWX0NIQUlOIFwKKwkoKEVUSF9NQVhfTVRVK0VUSF9IRUFERVJfU0laRSArIFJDVlBPU1RfQlVGX1NJWkUtMSkgLyBSQ1ZQT1NUX0JVRl9TSVpFKQorCitzdHJ1Y3QgbmV0X3BrdF9yY3Zwb3N0IHsKKwkgICAgLyogcmN2IGJ1ZiBzaXplIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGluY2x1ZGUgZXRoZXJuZXQgZGF0YSBsZW4gKworCSAgICAqIGV0aGVybmV0IGhlYWRlciBsZW4gLSB3ZSBhcmUgY2hvb3NpbmcgMksgYmVjYXVzZSBpdCBpcyBndWFyYW50ZWVkCisJICAgICogdG8gYmUgZGVzY3JpYmFibGUgKi8KKwkgICAgc3RydWN0IHBoeXNfaW5mbyBmcmFnOwkvKiBwaHlzaWNhbCBwYWdlIGluZm9ybWF0aW9uIGZvciB0aGUKKwkJCQkJICogc2luZ2xlIGZyYWdtZW50IDJLIHJjdiBidWYgKi8KKwkgICAgVTY0IFVuaXF1ZU51bTsJCS8qIFRoaXMgaXMgdXNlZCB0byBtYWtlIHN1cmUgdGhhdAorCQkJCQkgKiByZWNlaXZlIHBvc3RzIGFyZSByZXR1cm5lZCB0byAgKi8KKwkgICAgLyogdGhlIEFkYXB0ZXIgd2hpY2ggc2VudCB0aGVtIG9yaWdvbmFsbHkuICovCit9OworCitzdHJ1Y3QgbmV0X3BrdF9yY3YgeworCisJLyogdGhlIG51bWJlciBvZiByZWNlaXZlIGJ1ZmZlcnMgdGhhdCBjYW4gYmUgY2hhaW5lZCAgKi8KKwkvKiBpcyBiYXNlZCBvbiBtYXggbXR1IGFuZCBzaXplIG9mIGVhY2ggcmN2IGJ1ZiAqLworCVUzMiByY3ZfZG9uZV9sZW47CS8qIGxlbmd0aCBvZiByZWNlaXZlZCBkYXRhICovCisJVTggbnVtcmN2YnVmczsJCS8qIG51bWJlciBvZiByZWNlaXZlIGJ1ZmZlcnMgdGhhdCBjb250YWluIHRoZSAqLworCS8qIGluY29taW5nIGRhdGE7IGd1ZXN0IGVuZCBNVVNUIGNoYWluIHRoZXNlIHRvZ2V0aGVyLiAqLworCXZvaWQgKnJjdmJ1ZltNQVhfTkVUX1JDVl9DSEFJTl07CS8qIHRoZSBsaXN0IG9mIHJlY2VpdmUgYnVmZmVycworCQkJCQkJICogdGhhdCBtdXN0IGJlIGNoYWluZWQ7ICovCisJLyogZWFjaCBlbnRyeSBpcyBhIHJlY2VpdmUgYnVmZmVyIHByb3ZpZGVkIGJ5IE5FVF9SQ1ZfUE9TVC4gKi8KKwkvKiBOT1RFOiBmaXJzdCByY3ZidWYgaW4gdGhlIGNoYWluIHdpbGwgYWxzbyBiZSBwcm92aWRlZCBpbiBuZXQuYnVmLiAqLworCVU2NCBVbmlxdWVOdW07CisJVTMyIFJjdnNEcm9wcGVkRGVsdGE7Cit9OworCitzdHJ1Y3QgbmV0X3BrdF9lbmJkaXMgeworCXZvaWQgKmNvbnRleHQ7CisJVTE2IGVuYWJsZTsJCS8qIDEgPSBlbmFibGUsIDAgPSBkaXNhYmxlICovCit9OworCitzdHJ1Y3QgbmV0X3BrdF9tYWNhZGRyIHsKKwl2b2lkICpjb250ZXh0OworCVU4IG1hY2FkZHJbTUFYX01BQ0FERFJfTEVOXTsJLyogNiBieXRlcyAqLworfTsKKworLyogY21kIHJzcCBwYWNrZXQgdXNlZCBmb3IgVk5JQyBuZXR3b3JrIHRyYWZmaWMgICovCitzdHJ1Y3QgdWlzY21kcnNwX25ldCB7CisJTkVUX1RZUEVTIHR5cGU7CisJdm9pZCAqYnVmOworCXVuaW9uIHsKKwkJc3RydWN0IG5ldF9wa3RfeG10IHhtdDsJLyogdXNlZCBmb3IgTkVUX1hNSVQgKi8KKwkJc3RydWN0IG5ldF9wa3RfeG10ZG9uZSB4bXRkb25lOwkvKiB1c2VkIGZvciBORVRfWE1JVF9ET05FICovCisJCXN0cnVjdCBuZXRfcGt0X3JjdnBvc3QgcmN2cG9zdDsJLyogdXNlZCBmb3IgTkVUX1JDVl9QT1NUICovCisJCXN0cnVjdCBuZXRfcGt0X3JjdiByY3Y7CS8qIHVzZWQgZm9yIE5FVF9SQ1YgKi8KKwkJc3RydWN0IG5ldF9wa3RfZW5iZGlzIGVuYmRpczsJLyogdXNlZCBmb3IgTkVUX1JDVl9FTkJESVMsICovCisJCS8qIE5FVF9SQ1ZfRU5CRElTX0FDSywgICovCisJCS8qIE5FVF9SQ1ZfUFJPTVNJQywgKi8KKwkJLyogYW5kIE5FVF9DT05ORUNUX1NUQVRVUyAqLworCQlzdHJ1Y3QgbmV0X3BrdF9tYWNhZGRyIG1hY2FkZHI7CisJfTsKK307CisKK3N0cnVjdCB1aXNjbWRyc3Bfc2NzaXRhc2ttZ210IHsKKwlUQVNLX01HTVRfVFlQRVMgdGFza3R5cGU7CisKKwkgICAgLyogdGhlIHR5cGUgb2YgdGFzayAqLworCXN0cnVjdCB1aXNzY3NpX2Rlc3QgdmRlc3Q7CisKKwkgICAgLyogdGhlIHZkaXNrIGZvciB3aGljaCB0aGlzIHRhc2sgbWdtdCBpcyBnZW5lcmF0ZWQgKi8KKwl2b2lkICpzY3NpY21kOworCisJICAgIC8qIFRoaXMgaXMgc29tZSBoYW5kbGUgdGhhdCB0aGUgZ3Vlc3QgaGFzIHNhdmVkIG9mZiBmb3IgaXRzIG93biB1c2UuCisJICAgICogSXRzIHZhbHVlIGlzIHByZXNlcnZlZCBieSBpb3BhcnQgJiByZXR1cm5lZCBhcyBpcyBpbiB0aGUgdGFzayBtZ210CisJICAgICogcnNwLiAqLworCXZvaWQgKm5vdGlmeTsKKworCSAgICAvKiBGb3IgbGludXggZ3Vlc3RzLCB0aGlzIGlzIGEgcG9pbnRlciB0byB3YWl0X3F1ZXVlX2hlYWQgdGhhdCBhCisJICAgICogdGhyZWFkIGlzIHdhaXRpbmcgb24gdG8gc2VlIGlmIHRoZSB0YXNrbWdtdCBjb21tYW5kIGhhcyBjb21wbGV0ZWQuCisJICAgICogRm9yIHdpbmRvd3MgZ3Vlc3RzLCB0aGlzIGlzIGEgcG9pbnRlciB0byBhIGxvY2F0aW9uIHRoYXQgYSB3YWl0aW5nCisJICAgICogdGhyZWFkIGlzIHRlc3RpbmcgdG8gc2VlIGlmIHRoZSB0YXNrbWdtdCBjb21tYW5kIGhhcyBjb21wbGV0ZWQuCisJICAgICogV2hlbiB0aGUgcnNwIGlzIHJlY2VpdmVkIGJ5IGd1ZXN0LCB0aGUgdGhyZWFkIHJlY2VpdmluZyB0aGUKKwkgICAgKiByZXNwb25zZSB1c2VzIHRoaXMgdG8gbm90aWZ5IHRoZSB0aGUgdGhyZWFkIHdhaXRpbmcgZm9yIHRhc2ttZ210CisJICAgICogY29tbWFuZCBjb21wbGV0aW9uLiAgSXRzIHZhbHVlIGlzIHByZXNlcnZlZCBieSBpb3BhcnQgJiByZXR1cm5lZAorCSAgICAqIGFzIGlzIGluIHRoZSB0YXNrIG1nbXQgcnNwLiAqLworCXZvaWQgKm5vdGlmeXJlc3VsdDsKKworCSAgICAvKiB0aGlzIGlzIGEgaGFuZGxlIHRvIGxvY2F0aW9uIGluIGd1ZXN0IHdoZXJlIHRoZSByZXN1bHQgb2YgdGhlCisJICAgICogdGFza21nbXQgY29tbWFuZCAocmVzdWx0IGZpZWxkKSBpcyB0byBzYXZlZCBvZmYgd2hlbiB0aGUgcmVzcG9uc2UKKwkgICAgKiBpcyBoYW5kbGVkLiAgSXRzIHZhbHVlIGlzIHByZXNlcnZlZCBieSBpb3BhcnQgJiByZXR1cm5lZCBhcyBpcyBpbgorCSAgICAqIHRoZSB0YXNrIG1nbXQgcnNwLiAqLworCWNoYXIgcmVzdWx0OworCisJICAgIC8qIHJlc3VsdCBvZiB0YXNrbWdtdCBjb21tYW5kIC0gc2V0IGJ5IElPUGFydCAtIHZhbHVlcyBhcmU6ICovCisjZGVmaW5lIFRBU0tfTUdNVF9GQUlMRUQgIDAKKyNkZWZpbmUgVEFTS19NR01UX1NVQ0NFU1MgMQorfTsKKworLyogVGhlIGZvbGxvd2luZyBpcyB1c2VkIGJ5IHVpc3NkIHRvIHNlbmQgZGlzayBhZGQvcmVtb3ZlIG5vdGlmaWNhdGlvbnMgdG8KKyAqIEd1ZXN0ICovCisvKiBOb3RlIHRoYXQgdGhlIHZIYmEgcG9pbnRlciBpcyBub3QgdXNlZCBieSB0aGUgQ2xpZW50L0d1ZXN0IHNpZGUuICovCitzdHJ1Y3QgdWlzY21kcnNwX2Rpc2tub3RpZnkgeworCVU4IGFkZDsJCS8qIDAtcmVtb3ZlLCAxLWFkZCAqLworCXZvaWQgKnZIYmE7CQkvKiBQb2ludGVyIHRvIHZoYmFfaW5mbyBmb3IgY2hhbm5lbCBpbmZvIHRvCisJCQkJICogcm91dGUgbXNnICovCisJVTMyIGNoYW5uZWwsIGlkLCBsdW47CS8qIFNDU0kgUGF0aCBvZiBEaXNrIHRvIGFkZGVkIG9yIHJlbW92ZWQgKi8KK307CisKKy8qIFRoZSBmb2xsb3dpbmcgaXMgdXNlZCBieSB2aXJ0aGJhL3ZTQ1NJIHRvIHNlbmQgdGhlIEFjcXVpcmUvUmVsZWFzZSBjb21tYW5kcworKiB0byB0aGUgSU9WTS4gICovCitzdHJ1Y3QgdWlzY21kcnNwX3ZkaXNrbWdtdCB7CisJVkRJU0tfTUdNVF9UWVBFUyB2ZGlza3R5cGU7CisKKwkgICAgLyogdGhlIHR5cGUgb2YgdGFzayAqLworCXN0cnVjdCB1aXNzY3NpX2Rlc3QgdmRlc3Q7CisKKwkgICAgLyogdGhlIHZkaXNrIGZvciB3aGljaCB0aGlzIHRhc2sgbWdtdCBpcyBnZW5lcmF0ZWQgKi8KKwl2b2lkICpzY3NpY21kOworCisJICAgIC8qIFRoaXMgaXMgc29tZSBoYW5kbGUgdGhhdCB0aGUgZ3Vlc3QgaGFzIHNhdmVkIG9mZiBmb3IgaXRzIG93biB1c2UuCisJICAgICogSXRzIHZhbHVlIGlzIHByZXNlcnZlZCBieSBpb3BhcnQgJiByZXR1cm5lZCBhcyBpcyBpbiB0aGUgdGFzayBtZ210CisJICAgICogcnNwLiAqLworCXZvaWQgKm5vdGlmeTsKKworCSAgICAvKiBGb3IgbGludXggZ3Vlc3RzLCB0aGlzIGlzIGEgcG9pbnRlciB0byB3YWl0X3F1ZXVlX2hlYWQgdGhhdCBhCisJICAgICogdGhyZWFkIGlzIHdhaXRpbmcgb24gdG8gc2VlIGlmIHRoZSB0YXNrbWdtdCBjb21tYW5kIGhhcyBjb21wbGV0ZWQuCisJICAgICogRm9yIHdpbmRvd3MgZ3Vlc3RzLCB0aGlzIGlzIGEgcG9pbnRlciB0byBhIGxvY2F0aW9uIHRoYXQgYSB3YWl0aW5nCisJICAgICogdGhyZWFkIGlzIHRlc3RpbmcgdG8gc2VlIGlmIHRoZSB0YXNrbWdtdCBjb21tYW5kIGhhcyBjb21wbGV0ZWQuCisJICAgICogV2hlbiB0aGUgcnNwIGlzIHJlY2VpdmVkIGJ5IGd1ZXN0LCB0aGUgdGhyZWFkIHJlY2VpdmluZyB0aGUKKwkgICAgKiByZXNwb25zZSB1c2VzIHRoaXMgdG8gbm90aWZ5IHRoZSB0aGUgdGhyZWFkIHdhaXRpbmcgZm9yIHRhc2ttZ210CisJICAgICogY29tbWFuZCBjb21wbGV0aW9uLiAgSXRzIHZhbHVlIGlzIHByZXNlcnZlZCBieSBpb3BhcnQgJiByZXR1cm5lZAorCSAgICAqIGFzIGlzIGluIHRoZSB0YXNrIG1nbXQgcnNwLiAqLworCXZvaWQgKm5vdGlmeXJlc3VsdDsKKworCSAgICAvKiB0aGlzIGlzIGEgaGFuZGxlIHRvIGxvY2F0aW9uIGluIGd1ZXN0IHdoZXJlIHRoZSByZXN1bHQgb2YgdGhlCisJICAgICogdGFza21nbXQgY29tbWFuZCAocmVzdWx0IGZpZWxkKSBpcyB0byBzYXZlZCBvZmYgd2hlbiB0aGUgcmVzcG9uc2UKKwkgICAgKiBpcyBoYW5kbGVkLiAgSXRzIHZhbHVlIGlzIHByZXNlcnZlZCBieSBpb3BhcnQgJiByZXR1cm5lZCBhcyBpcyBpbgorCSAgICAqIHRoZSB0YXNrIG1nbXQgcnNwLiAqLworCWNoYXIgcmVzdWx0OworCisJICAgIC8qIHJlc3VsdCBvZiB0YXNrbWdtdCBjb21tYW5kIC0gc2V0IGJ5IElPUGFydCAtIHZhbHVlcyBhcmU6ICovCisjZGVmaW5lIFZESVNLX01HTVRfRkFJTEVEICAwCisjZGVmaW5lIFZESVNLX01HTVRfU1VDQ0VTUyAxCit9OworCisvKiBrZWVwaW5nIGNtZCAmIHJzcCBpbmZvIGluIG9uZSBzdHJ1Y3R1cmUgZm9yIG5vdyBjbWQgcnNwIHBhY2tldCBmb3Igc2NzaSAqLworc3RydWN0IHVpc2NtZHJzcCB7CisJY2hhciBjbWR0eXBlOworCisJICAgIC8qIGRlc2NyaWJlcyB3aGF0IHR5cGUgb2YgaW5mb3JtYXRpb24gaXMgaW4gdGhlIHN0cnVjdCAqLworI2RlZmluZSBDTURfU0NTSV9UWVBFCQkxCisjZGVmaW5lIENNRF9ORVRfVFlQRQkJMgorI2RlZmluZSBDTURfU0NTSVRBU0tNR01UX1RZUEUJMworI2RlZmluZSBDTURfTk9USUZZR1VFU1RfVFlQRQk0CisjZGVmaW5lIENNRF9WRElTS01HTVRfVFlQRQk1CisJdW5pb24geworCQlzdHJ1Y3QgdWlzY21kcnNwX3Njc2kgc2NzaTsKKwkJc3RydWN0IHVpc2NtZHJzcF9uZXQgbmV0OworCQlzdHJ1Y3QgdWlzY21kcnNwX3Njc2l0YXNrbWdtdCBzY3NpdGFza21nbXQ7CisJCXN0cnVjdCB1aXNjbWRyc3BfZGlza25vdGlmeSBkaXNrbm90aWZ5OworCQlzdHJ1Y3QgdWlzY21kcnNwX3ZkaXNrbWdtdCB2ZGlza21nbXQ7CisJfTsKKwl2b2lkICpwcml2YXRlX2RhdGE7CS8qIHVzZWQgdG8gc2VuZCB0aGUgcmVzcG9uc2Ugd2hlbiB0aGUgY21kIGlzCisJCQkJICogZG9uZSAoc2NzaSAmIHNjc2l0dGFza21nbXQpLiAgKi8KKwlzdHJ1Y3QgdWlzY21kcnNwICpuZXh0OwkvKiBHZW5lcmFsIFB1cnBvc2UgUXVldWUgTGluayAqLworCXN0cnVjdCB1aXNjbWRyc3AgKmFjdGl2ZVFfbmV4dDsJLyogVXNlZCB0byB0cmFjayBhY3RpdmUgY29tbWFuZHMgKi8KKwlzdHJ1Y3QgdWlzY21kcnNwICphY3RpdmVRX3ByZXY7CS8qIFVzZWQgdG8gdHJhY2sgYWN0aXZlIGNvbW1hbmRzICAqLworfTsKKworLyogVGhpcyBpcyBqdXN0IHRoZSBoZWFkZXIgb2YgdGhlIElPIGNoYW5uZWwuICBJdCBpcyBhc3N1bWVkIHRoYXQgZGlyZWN0bHkgYWZ0ZXIKKyogdGhpcyBoZWFkZXIgdGhlcmUgaXMgYSBsYXJnZSByZWdpb24gb2YgbWVtb3J5IHdoaWNoIGNvbnRhaW5zIHRoZSBjb21tYW5kIGFuZAorKiByZXNwb25zZSBxdWV1ZXMgYXMgc3BlY2lmaWVkIGluIGNtZFEgYW5kIHJzcFEgU0lHTkFMX1FVRVVFX0hFQURFUlMuICovCit0eXBlZGVmIHN0cnVjdCBfVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCB7CisJQ0hBTk5FTF9IRUFERVIgQ2hhbm5lbEhlYWRlcjsKKwlTSUdOQUxfUVVFVUVfSEVBREVSIGNtZFE7CisJU0lHTkFMX1FVRVVFX0hFQURFUiByc3BROworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCB2aGJhX3d3bm4gd3dubjsJLyogOCBieXRlcyAqLworCQkJc3RydWN0IHZoYmFfY29uZmlnX21heCBtYXg7CS8qIDIwIGJ5dGVzICovCisJCX0gdmhiYTsJCS8qIDI4ICovCisJCXN0cnVjdCB7CisJCQlVOCBtYWNhZGRyW01BWF9NQUNBRERSX0xFTl07CS8qIDYgYnl0ZXMgKi8KKwkJCVUzMiBudW1fcmN2X2J1ZnM7CS8qIDQgKi8KKwkJCVUzMiBtdHU7CS8qIDQgKi8KKwkJCUdVSUQgem9uZUd1aWQ7CS8qIDE2ICovCisJCX0gdm5pYzsJCS8qIHRvdGFsICAgICAzMCAqLworCX07CisKKyNkZWZpbmUgTUFYX0NMSUVOVFNUUklOR19MRU4gMTAyNAorCSBVOCBjbGllbnRTdHJpbmdbTUFYX0NMSUVOVFNUUklOR19MRU5dOwkvKiBOVUxMIHRlcm1pbmF0ZWQgLSBzbyBob2xkcworCQkJCQkJICogbWF4IC0gMSBieXRlcyAqLworfSBVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MOworCisjcHJhZ21hIHBhY2socG9wKQorLyogLy8vLy8vLy8vLy8vLyBFTkQgUFJBR01BIFBBQ0sgUFVTSCAxIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCisvKiBkZWZpbmUgb2Zmc2V0cyB0byBtZW1iZXJzIG9mIHN0cnVjdCB1aXNjbWRyc3AgKi8KKyNkZWZpbmUgT0ZGU0VUX0NNRFRZUEUgT0ZGU0VUT0Yoc3RydWN0IHVpc2NtZHJzcCwgY21kdHlwZSkKKyNkZWZpbmUgT0ZGU0VUX1NDU0kgT0ZGU0VUT0Yoc3RydWN0IHVpc2NtZHJzcCwgc2NzaSkKKyNkZWZpbmUgT0ZGU0VUX05FVCBPRkZTRVRPRihzdHJ1Y3QgdWlzY21kcnNwLCBuZXQpCisjZGVmaW5lIE9GRlNFVF9TQ1NJVEFTS01HTVQgT0ZGU0VUT0Yoc3RydWN0IHVpc2NtZHJzcCwgc2NzaXRhc2ttZ210KQorI2RlZmluZSBPRkZTRVRfTkVYVCBPRkZTRVRPRihzdHJ1Y3QgdWlzY21kcnNwLCBuZXh0KQorCisvKiBkZWZpbmUgb2Zmc2V0cyB0byBtZW1iZXJzIG9mIHN0cnVjdCB1aXNjbWRyc3BfbmV0ICovCisjZGVmaW5lIE9GRlNFVF9UWVBFIE9GRlNFVE9GKHN0cnVjdCB1aXNjbWRyc3BfbmV0LCB0eXBlKQorI2RlZmluZSBPRkZTRVRfQlVGIE9GRlNFVE9GKHN0cnVjdCB1aXNjbWRyc3BfbmV0LCBidWYpCisjZGVmaW5lIE9GRlNFVF9YTVQgT0ZGU0VUT0Yoc3RydWN0IHVpc2NtZHJzcF9uZXQsIHhtdCkKKyNkZWZpbmUgT0ZGU0VUX1hNVF9ET05FX1JFU1VMVCBPRkZTRVRPRihzdHJ1Y3QgdWlzY21kcnNwX25ldCwgeG10ZG9uZSkKKyNkZWZpbmUgT0ZGU0VUX1JDVlBPU1QgT0ZGU0VUT0Yoc3RydWN0IHVpc2NtZHJzcF9uZXQsIHJjdnBvc3QpCisjZGVmaW5lIE9GRlNFVF9SQ1ZfRE9ORV9MRU4gT0ZGU0VUT0Yoc3RydWN0IHVpc2NtZHJzcF9uZXQsIHJjdikKKyNkZWZpbmUgT0ZGU0VUX0VOQkRJUyBPRkZTRVRPRihzdHJ1Y3QgdWlzY21kcnNwX25ldCwgZW5iZGlzKQorCisvKiBkZWZpbmUgb2Zmc2V0cyB0byBtZW1iZXJzIG9mIHN0cnVjdCBuZXRfcGt0X3JjdnBvc3QgKi8KKyNkZWZpbmUgT0ZGU0VUX1RPVEFMTEVOIE9GRlNFVE9GKHN0cnVjdCBuZXRfcGt0X3JjdnBvc3QsIHRvdGFsbGVuKQorI2RlZmluZQlPRkZTRVRfRlJBRyBPRkZTRVRPRihzdHJ1Y3QgbmV0X3BrdF9yY3Zwb3N0LCBmcmFnKQorCisvKgorKiBJTkxJTkUgZnVuY3Rpb25zIGZvciBpbml0aWFsaXppbmcgYW5kIGFjY2Vzc2luZyBJL08gZGF0YSBjaGFubmVscworKi8KKworCisjZGVmaW5lIE5VTVNJR05BTFMoeCwgcSkgKCgoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCAqKSh4KSktPnEuTWF4U2lnbmFsU2xvdHMpCisjZGVmaW5lIFNJWkVPRl9QUk9UT0NPTCAoQ09WRVIoc2l6ZW9mKFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wpLCA2NCkpCisjZGVmaW5lIFNJWkVPRl9DTURSU1AgKENPVkVSKHNpemVvZihzdHJ1Y3QgdWlzY21kcnNwKSwgNjQpKQorCisjZGVmaW5lIElPX0NIQU5ORUxfU0laRSh4KSBDT1ZFUihTSVpFT0ZfUFJPVE9DT0wgKyBcCisJCQkJIChOVU1TSUdOQUxTKHgsIGNtZFEpICsgXAorCQkJCSAgTlVNU0lHTkFMUyh4LCByc3BRKSkgKiBTSVpFT0ZfQ01EUlNQLCA0MDk2KQorI2RlZmluZSBNSU5fSU9fQ0hBTk5FTF9TSVpFIENPVkVSKFNJWkVPRl9QUk9UT0NPTCArIFwKKwkJCQkgIDIgKiBNSU5fTlVNU0lHTkFMUyAqIFNJWkVPRl9DTURSU1AsIDQwOTYpCisjaWZkZWYgX19HTlVDX18KKy8qIFRoZXNlIGRlZmluZXMgc2hvdWxkIG9ubHkgZXZlciBiZSB1c2VkIGluIHNlcnZpY2UgcGFydGl0b25zICovCisvKiBiZWNhdXNlIHRoZXkgcmVseSBvbiB0aGUgc2l6ZSBvZiB1aXNjbWRyc3AgKi8KKyNkZWZpbmUgUVNMT1RTRlJPTUJZVEVTKGJ5dGVzKSAoKChieXRlcy1TSVpFT0ZfUFJPVE9DT0wpLzIpL1NJWkVPRl9DTURSU1ApCisjZGVmaW5lIFFTSVpFRlJPTUJZVEVTKGJ5dGVzKSAoUVNMT1RTRlJPTUJZVEVTKGJ5dGVzKSpTSVpFT0ZfQ01EUlNQKQorI2RlZmluZSBTaWduYWxRSW5pdCh4KQkJCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJeC0+Y21kUS5TaXplID0gUVNJWkVGUk9NQllURVMoeC0+Q2hhbm5lbEhlYWRlci5TaXplKTsJXAorCQl4LT5jbWRRLm9TaWduYWxCYXNlID0gU0laRU9GX1BST1RPQ09MIC0JCQlcCisJCQlPRkZTRVRPRihVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MLCBjbWRRKTsJXAorCQl4LT5jbWRRLlNpZ25hbFNpemUgPSBTSVpFT0ZfQ01EUlNQOwkJCVwKKwkJeC0+Y21kUS5NYXhTaWduYWxTbG90cyA9CQkJCVwKKwkJCVFTTE9UU0ZST01CWVRFUyh4LT5DaGFubmVsSGVhZGVyLlNpemUpOwkJXAorCQl4LT5jbWRRLk1heFNpZ25hbHMgPSB4LT5jbWRRLk1heFNpZ25hbFNsb3RzIC0gMTsJXAorCQl4LT5yc3BRLlNpemUgPSBRU0laRUZST01CWVRFUyh4LT5DaGFubmVsSGVhZGVyLlNpemUpOwlcCisJCXgtPnJzcFEub1NpZ25hbEJhc2UgPQkJCQkJXAorCQkJKFNJWkVPRl9QUk9UT0NPTCArIHgtPmNtZFEuU2l6ZSkgLQkJXAorCQkJT0ZGU0VUT0YoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCwgcnNwUSk7CVwKKwkJeC0+cnNwUS5TaWduYWxTaXplID0gU0laRU9GX0NNRFJTUDsJCQlcCisJCXgtPnJzcFEuTWF4U2lnbmFsU2xvdHMgPQkJCQlcCisJCQlRU0xPVFNGUk9NQllURVMoeC0+Q2hhbm5lbEhlYWRlci5TaXplKTsJCVwKKwkJeC0+cnNwUS5NYXhTaWduYWxzID0geC0+cnNwUS5NYXhTaWduYWxTbG90cyAtIDE7CVwKKwkJeC0+Q2hhbm5lbEhlYWRlci5vQ2hhbm5lbFNwYWNlID0JCQlcCisJCQlPRkZTRVRPRihVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MLCBjbWRRKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSU5JVF9DTElFTlRTVFJJTkcoY2hhbiwgdHlwZSwgY2xpZW50U3RyLCBjbGllbnRTdHJMZW4pCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmIChjbGllbnRTdHIpIHsJCQkJCVwKKwkJCWNoYW4tPkNoYW5uZWxIZWFkZXIub0NsaWVudFN0cmluZyA9CQlcCisJCQkJT0ZGU0VUT0YodHlwZSwgY2xpZW50U3RyaW5nKTsJCVwKKwkJCU1FTUNQWShjaGFuLT5jbGllbnRTdHJpbmcsIGNsaWVudFN0ciwJCVwKKwkJCSAgICAgICBNSU5OVU0oY2xpZW50U3RyTGVuLAkJCVwKKwkJCQkgICAgICAoVTMyKSAoTUFYX0NMSUVOVFNUUklOR19MRU4gLSAxKSkpOyBcCisJCQljaGFuLT5jbGllbnRTdHJpbmdbTUlOTlVNKGNsaWVudFN0ckxlbiwJCVwKKwkJCQkJCSAgKFUzMikgKE1BWF9DTElFTlRTVFJJTkdfTEVOIFwKKwkJCQkJCQkgLSAxKSldCQlcCisJCQkJPSAnXDAnOwkJCQkJXAorCQl9CQkJCQkJCVwKKwkJZWxzZQkJCQkJCQlcCisJCQlpZiAoY2xpZW50U3RyTGVuID4gMCkJCQkJXAorCQkJCXJldHVybiAwOwkJCQlcCisJfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIFVMVFJBX0lPX0NIQU5ORUxfU0VSVkVSX1JFQURZKHgsIGNoYW5JZCwgbG9nQ3R4KSBcCisJVUxUUkFfQ0hBTk5FTF9TRVJWRVJfVFJBTlNJVElPTih4LCBjaGFuSWQsIFNydlN0YXRlLCBDSEFOTkVMU1JWX1JFQURZLCBcCisJCQkJCWxvZ0N0eCk7CisKKyNkZWZpbmUgVUxUUkFfSU9fQ0hBTk5FTF9TRVJWRVJfTk9UUkVBRFkoeCwgY2hhbklkLCBsb2dDdHgpCVwKKwlVTFRSQV9DSEFOTkVMX1NFUlZFUl9UUkFOU0lUSU9OKHgsIGNoYW5JZCwgU3J2U3RhdGUsIFwKKwkJCQkJQ0hBTk5FTFNSVl9VTklOSVRJQUxJWkVELCBsb2dDdHgpOworCitzdGF0aWMgaW5saW5lIGludCBVTFRSQV9WSEJBX2luaXRfY2hhbm5lbChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MICp4LAorCQkJCQkgICAgICBzdHJ1Y3QgdmhiYV93d25uICp3d25uLAorCQkJCQkgICAgICBzdHJ1Y3QgdmhiYV9jb25maWdfbWF4ICptYXgsCisJCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmNsaWVudFN0ciwKKwkJCQkJICAgICAgVTMyIGNsaWVudFN0ckxlbiwgVTY0IGJ5dGVzKSAgeworCU1FTVNFVCh4LCAwLCBzaXplb2YoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCkpOworCXgtPkNoYW5uZWxIZWFkZXIuVmVyc2lvbklkID0gVUxUUkFfVkhCQV9DSEFOTkVMX1BST1RPQ09MX1ZFUlNJT05JRDsKKwl4LT5DaGFubmVsSGVhZGVyLlNpZ25hdHVyZSA9IFVMVFJBX1ZIQkFfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkU7CisJeC0+Q2hhbm5lbEhlYWRlci5TcnZTdGF0ZSA9IENIQU5ORUxTUlZfVU5JTklUSUFMSVpFRDsKKwl4LT5DaGFubmVsSGVhZGVyLkhlYWRlclNpemUgPSBzaXplb2YoeC0+Q2hhbm5lbEhlYWRlcik7CisJeC0+Q2hhbm5lbEhlYWRlci5TaXplID0gQ09WRVIoYnl0ZXMsIDQwOTYpOworCXgtPkNoYW5uZWxIZWFkZXIuVHlwZSA9IFVsdHJhVmhiYUNoYW5uZWxQcm90b2NvbEd1aWQ7CisJeC0+Q2hhbm5lbEhlYWRlci5ab25lR3VpZCA9IEd1aWQwOworCXgtPnZoYmEud3dubiA9ICp3d25uOworCXgtPnZoYmEubWF4ID0gKm1heDsKKwlJTklUX0NMSUVOVFNUUklORyh4LCBVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MLCBjbGllbnRTdHIsCisJCQkgIGNsaWVudFN0ckxlbik7CisJU2lnbmFsUUluaXQoeCk7CisJaWYgKCh4LT5jbWRRLk1heFNpZ25hbFNsb3RzID4gTUFYX05VTVNJR05BTFMpIHx8CisJICAgICAoeC0+cnNwUS5NYXhTaWduYWxTbG90cyA+IE1BWF9OVU1TSUdOQUxTKSkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCh4LT5jbWRRLk1heFNpZ25hbFNsb3RzIDwgTUlOX05VTVNJR05BTFMpIHx8CisJICAgICAoeC0+cnNwUS5NYXhTaWduYWxTbG90cyA8IE1JTl9OVU1TSUdOQUxTKSkgeworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBVTFRSQV9WSEJBX3NldF9tYXgoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCAqeCwKKwkJCQkgICAgICBzdHJ1Y3QgdmhiYV9jb25maWdfbWF4ICptYXgpICB7CisJeC0+dmhiYS5tYXggPSAqbWF4OworfQorCitzdGF0aWMgaW5saW5lIGludCBVTFRSQV9WTklDX2luaXRfY2hhbm5lbChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MICp4LAorCQkJCQkJIHVuc2lnbmVkIGNoYXIgKm1hY2FkZHIsCisJCQkJCQkgVTMyIG51bV9yY3ZfYnVmcywgVTMyIG10dSwKKwkJCQkJCSBHVUlEIHpvbmVHdWlkLAorCQkJCQkJIHVuc2lnbmVkIGNoYXIgKmNsaWVudFN0ciwKKwkJCQkJCSBVMzIgY2xpZW50U3RyTGVuLAorCQkJCQkJIFU2NCBieXRlcykgIHsKKwlNRU1TRVQoeCwgMCwgc2l6ZW9mKFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wpKTsKKwl4LT5DaGFubmVsSGVhZGVyLlZlcnNpb25JZCA9IFVMVFJBX1ZOSUNfQ0hBTk5FTF9QUk9UT0NPTF9WRVJTSU9OSUQ7CisJeC0+Q2hhbm5lbEhlYWRlci5TaWduYXR1cmUgPSBVTFRSQV9WTklDX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFOworCXgtPkNoYW5uZWxIZWFkZXIuU3J2U3RhdGUgPSBDSEFOTkVMU1JWX1VOSU5JVElBTElaRUQ7CisJeC0+Q2hhbm5lbEhlYWRlci5IZWFkZXJTaXplID0gc2l6ZW9mKHgtPkNoYW5uZWxIZWFkZXIpOworCXgtPkNoYW5uZWxIZWFkZXIuU2l6ZSA9IENPVkVSKGJ5dGVzLCA0MDk2KTsKKwl4LT5DaGFubmVsSGVhZGVyLlR5cGUgPSBVbHRyYVZuaWNDaGFubmVsUHJvdG9jb2xHdWlkOworCXgtPkNoYW5uZWxIZWFkZXIuWm9uZUd1aWQgPSBHdWlkMDsKKwlNRU1DUFkoeC0+dm5pYy5tYWNhZGRyLCBtYWNhZGRyLCBNQVhfTUFDQUREUl9MRU4pOworCXgtPnZuaWMubnVtX3Jjdl9idWZzID0gbnVtX3Jjdl9idWZzOworCXgtPnZuaWMubXR1ID0gbXR1OworCXgtPnZuaWMuem9uZUd1aWQgPSB6b25lR3VpZDsKKwlJTklUX0NMSUVOVFNUUklORyh4LCBVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MLCBjbGllbnRTdHIsCisJCQkgICBjbGllbnRTdHJMZW4pOworCVNpZ25hbFFJbml0KHgpOworCWlmICgoeC0+Y21kUS5NYXhTaWduYWxTbG90cyA+IE1BWF9OVU1TSUdOQUxTKSB8fAorCSAgICAgKHgtPnJzcFEuTWF4U2lnbmFsU2xvdHMgPiBNQVhfTlVNU0lHTkFMUykpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmICgoeC0+Y21kUS5NYXhTaWduYWxTbG90cyA8IE1JTl9OVU1TSUdOQUxTKSB8fAorCSAgICAgKHgtPnJzcFEuTWF4U2lnbmFsU2xvdHMgPCBNSU5fTlVNU0lHTkFMUykpIHsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisjZW5kaWYJLyogX19HTlVDX18gKi8KKworLyoKKyogSU5MSU5FIGZ1bmN0aW9uIGZvciBleHBhbmRpbmcgYSBndWVzdCdzIHBmbi1vZmYtc2l6ZSBpbnRvIG11bHRpcGxlIDRLIHBhZ2UKKyogcGZuLW9mZi1zaXplIGVudGlyZXMuCisqLworCisKKy8qIHdlIGRlYWwgd2l0aCA0SyBwYWdlIHNpemVzIHdoZW4gd2UgaXQgY29tZXMgdG8gcGFzc2luZyBwYWdlIGluZm9ybWF0aW9uCisgKiBiZXR3ZWVuICovCisvKiBHdWVzdCBhbmQgSU9QYXJ0aXRpb24uICovCisjZGVmaW5lIFBJX1BBR0VfU0laRSAgMHgxMDAwCisjZGVmaW5lIFBJX1BBR0VfTUFTSyAgMHgwRkZGCisjZGVmaW5lIFBJX1BBR0VfU0hJRlQgMTIKKworLyogcmV0dXJucyBuZXh0IG5vbi16ZXJvIGluZGV4IG9uIHN1Y2Nlc3Mgb3IgemVybyBvbiBmYWlsdXJlIChpLmUuIG91dCBvZgorICogcm9vbSkKKyAqLworc3RhdGljIElOTElORSAgVTE2CithZGRfcGh5c2luZm9fZW50cmllcyhVMzIgaW5wX3BmbiwJLyogaW5wdXQgLSBzcGVjaWZpZXMgdGhlIHBmbiB0byBiZSB1c2VkCisJCQkJCSAqIHRvIGFkZCBlbnRyaWVzICovCisJCSAgICAgVTE2IGlucF9vZmYsCS8qIGlucHV0IC0gc3BlY2lmaWVzIHRoZSBvZmYgdG8gYmUgdXNlZAorCQkJCQkgKiB0byBhZGQgZW50cmllcyAqLworCQkgICAgIFUzMiBpbnBfbGVuLAkvKiBpbnB1dCAtIHNwZWNpZmllcyB0aGUgbGVuIHRvIGJlIHVzZWQKKwkJCQkJICogdG8gYWRkIGVudHJpZXMgKi8KKwkJICAgICBVMTYgaW5kZXgsCQkvKiBpbnB1dCAtIGluZGV4IGluIGFycmF5IGF0IHdoaWNoIG5ldworCQkJCQkgKiBlbnRyaWVzIGFyZSBhZGRlZCAqLworCQkgICAgIFUxNiBtYXhfcGlfYXJyX2VudHJpZXMsCS8qIGlucHV0IC0gc3BlY2lmaWVzIHRoZSBtYXhpbXVtCisJCQkJCQkgKiBlbnRyaWVzIHBpX2FyciBjYW4gaG9sZCAqLworCQkgICAgIHN0cnVjdCBwaHlzX2luZm8gcGlfYXJyW10pIC8qIGlucHV0ICYgb3V0cHV0IC0gYXJyYXkgdG8KKwkJCQkJCSAgKiB3aGljaCBlbnRyaWVzIGFyZSBhZGRlZCAqLworeworCVUzMiBsZW47CisJVTE2IGksIGZpcnN0bGVuOworCisJZmlyc3RsZW4gPSBQSV9QQUdFX1NJWkUgLSBpbnBfb2ZmOworCWlmIChpbnBfbGVuIDw9IGZpcnN0bGVuKSB7CisKKwkJLyogdGhlIGlucHV0IGVudHJ5IHNwYW5zIG9ubHkgb25lIHBhZ2UgLSBhZGQgYXMgaXMgKi8KKwkJaWYgKGluZGV4ID49IG1heF9waV9hcnJfZW50cmllcykKKwkJCXJldHVybiAwOworCQlwaV9hcnJbaW5kZXhdLnBpX3BmbiA9IGlucF9wZm47CisJCXBpX2FycltpbmRleF0ucGlfb2ZmID0gKFUxNikgaW5wX29mZjsKKwkJcGlfYXJyW2luZGV4XS5waV9sZW4gPSAoVTE2KSBpbnBfbGVuOworCQkgICAgcmV0dXJuIGluZGV4ICsgMTsKKwl9CisKKwkgICAgLyogdGhpcyBlbnRyeSBzcGFucyBtdWx0aXBsZSBwYWdlcyAqLworCSAgICBmb3IgKGxlbiA9IGlucF9sZW4sIGkgPSAwOyBsZW47CisJCSBsZW4gLT0gcGlfYXJyW2luZGV4ICsgaV0ucGlfbGVuLCBpKyspIHsKKwkJaWYgKGluZGV4ICsgaSA+PSBtYXhfcGlfYXJyX2VudHJpZXMpCisJCQlyZXR1cm4gMDsKKwkJcGlfYXJyW2luZGV4ICsgaV0ucGlfcGZuID0gaW5wX3BmbiArIGk7CisJCWlmIChpID09IDApIHsKKwkJCXBpX2FycltpbmRleF0ucGlfb2ZmID0gaW5wX29mZjsKKwkJCXBpX2FycltpbmRleF0ucGlfbGVuID0gZmlyc3RsZW47CisJCX0KKworCQllbHNlIHsKKwkJCXBpX2FycltpbmRleCArIGldLnBpX29mZiA9IDA7CisJCQlwaV9hcnJbaW5kZXggKyBpXS5waV9sZW4gPQorCQkJICAgIChVMTYpIE1JTk5VTShsZW4sIChVMzIpIFBJX1BBR0VfU0laRSk7CisJCX0KKworCX0KKwlyZXR1cm4gaW5kZXggKyBpOworfQorCisjZW5kaWYJCQkJLyogX19JT0NIQU5ORUxfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvdmJ1c2NoYW5uZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy92YnVzY2hhbm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZGJiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvdmJ1c2NoYW5uZWwuaApAQCAtMCwwICsxLDEzNSBAQAorLyogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fVkJVU0NIQU5ORUxfSF9fCisjZGVmaW5lIF9fVkJVU0NIQU5ORUxfSF9fCisKKy8qICBUaGUgdmJ1cyBjaGFubmVsIGlzIHRoZSBjaGFubmVsIGFyZWEgcHJvdmlkZWQgdmlhIHRoZSBCVVNfQ1JFQVRFIGNvbnRyb2x2bQorICogIG1lc3NhZ2UgZm9yIGVhY2ggdmlydHVhbCBidXMuICBUaGlzIGNoYW5uZWwgYXJlYSBpcyBwcm92aWRlZCB0byBib3RoIHNlcnZlcgorICogIGFuZCBjbGllbnQgZW5kcyBvZiB0aGUgYnVzLiAgVGhlIGNoYW5uZWwgaGVhZGVyIGFyZWEgaXMgaW5pdGlhbGl6ZWQgYnkKKyAqICB0aGUgc2VydmVyLCBhbmQgdGhlIHJlbWFpbmluZyBpbmZvcm1hdGlvbiBpcyBmaWxsZWQgaW4gYnkgdGhlIGNsaWVudC4KKyAqICBXZSBjdXJyZW50bHkgdXNlIHRoaXMgZm9yIHRoZSBjbGllbnQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0CisgKiAgdGhlIGNsaWVudCBkZXZpY2VzIGFuZCBjbGllbnQgZHJpdmVycyBmb3IgdGhlIHNlcnZlciBlbmQgdG8gc2VlLgorICovCisjaW5jbHVkZSAiY29tbW9udHlwZXMuaCIKKyNpbmNsdWRlICJ2YnVzZGV2aWNlaW5mby5oIgorI2luY2x1ZGUgImNoYW5uZWwuaCIKKworLyogezE5M2IzMzFiLWM1OGYtMTFkYS05NWE5LTAwZTA4MTYxMTY1Zn0gKi8KKyNkZWZpbmUgVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MX0dVSUQgXAorCXsweDE5M2IzMzFiLCAweGM1OGYsIDB4MTFkYSwgXAorCQl7MHg5NSwgMHhhOSwgMHgwLCAweGUwLCAweDgxLCAweDYxLCAweDE2LCAweDVmfSB9CitzdGF0aWMgY29uc3QgR1VJRCBVbHRyYVZidXNDaGFubmVsUHJvdG9jb2xHdWlkID0KKwlVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0xfR1VJRDsKKworI2RlZmluZSBVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFIFVMVFJBX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFCisKKy8qIE11c3QgaW5jcmVtZW50IHRoaXMgd2hlbmV2ZXIgeW91IGluc2VydCBvciBkZWxldGUgZmllbGRzIHdpdGhpbiB0aGlzIGNoYW5uZWwKKyogc3RydWN0LiAgQWxzbyBpbmNyZW1lbnQgd2hlbmV2ZXIgeW91IGNoYW5nZSB0aGUgbWVhbmluZyBvZiBmaWVsZHMgd2l0aGluIHRoaXMKKyogY2hhbm5lbCBzdHJ1Y3Qgc28gYXMgdG8gYnJlYWsgcHJlLWV4aXN0aW5nIHNvZnR3YXJlLiAgTm90ZSB0aGF0IHlvdSBjYW4KKyogdXN1YWxseSBhZGQgZmllbGRzIHRvIHRoZSBFTkQgb2YgdGhlIGNoYW5uZWwgc3RydWN0IHdpdGhPVVQgbmVlZGluZyB0bworKiBpbmNyZW1lbnQgdGhpcy4gKi8KKyNkZWZpbmUgVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MX1ZFUlNJT05JRCAxCisKKyNkZWZpbmUgVUxUUkFfVkJVU19DSEFOTkVMX09LX0NMSUVOVChwQ2hhbm5lbCwgbG9nQ3R4KSAgICAgICBcCisJKFVMVFJBX2NoZWNrX2NoYW5uZWxfY2xpZW50KHBDaGFubmVsLAkJCQlcCisJCQkJICAgIFVsdHJhVmJ1c0NoYW5uZWxQcm90b2NvbEd1aWQsCVwKKwkJCQkgICAgInZidXMiLAkJCQlcCisJCQkJICAgIHNpemVvZihVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wpLCBcCisJCQkJICAgIFVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTF9WRVJTSU9OSUQsIFwKKwkJCQkgICAgVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRSwgXAorCQkJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGxvZ0N0eCkpCisKKyNkZWZpbmUgVUxUUkFfVkJVU19DSEFOTkVMX09LX1NFUlZFUihhY3R1YWxCeXRlcywgbG9nQ3R4KSAgICBcCisJKFVMVFJBX2NoZWNrX2NoYW5uZWxfc2VydmVyKFVsdHJhVmJ1c0NoYW5uZWxQcm90b2NvbEd1aWQsCVwKKwkJCQkgICAgInZidXMiLAkJCQlcCisJCQkJICAgIHNpemVvZihVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wpLCBcCisJCQkJICAgIGFjdHVhbEJ5dGVzLAkJCVwKKwkJCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBsb2dDdHgpKQorCisKKyNwcmFnbWEgcGFjayhwdXNoLCAxKQkJLyogYm90aCBHQ0MgYW5kIFZDIG5vdyBhbGxvdyB0aGlzIHByYWdtYSAqLwordHlwZWRlZiBzdHJ1Y3QgX1VMVFJBX1ZCVVNfSEVBREVSSU5GTyB7CisJVTMyIHN0cnVjdEJ5dGVzOwkvKiBzaXplIG9mIHRoaXMgc3RydWN0IGluIGJ5dGVzICovCisJVTMyIGRldmljZUluZm9TdHJ1Y3RCeXRlczsJLyogc2l6ZW9mKFVMVFJBX1ZCVVNfREVWSUNFSU5GTykgKi8KKwlVMzIgZGV2SW5mb0NvdW50OwkvKiBudW0gb2YgaXRlbXMgaW4gRGV2SW5mbyBtZW1iZXIgKi8KKwkvKiAodGhpcyBpcyB0aGUgYWxsb2NhdGVkIHNpemUpICovCisJVTMyIGNocEluZm9CeXRlT2Zmc2V0OwkvKiBieXRlIG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiB0aGlzIHN0cnVjdCAqLworCS8qIHRvIHRoZSB0aGUgQ2hwSW5mbyBzdHJ1Y3QgKGJlbG93KSAqLworCVUzMiBidXNJbmZvQnl0ZU9mZnNldDsJLyogYnl0ZSBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2YgdGhpcyBzdHJ1Y3QgKi8KKwkvKiB0byB0aGUgdGhlIEJ1c0luZm8gc3RydWN0IChiZWxvdykgKi8KKwlVMzIgZGV2SW5mb0J5dGVPZmZzZXQ7CS8qIGJ5dGUgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIHRoaXMgc3RydWN0ICovCisJLyogdG8gdGhlIHRoZSBEZXZJbmZvIGFycmF5IChiZWxvdykgKi8KKwlVOCByZXNlcnZlZFsxMDRdOworfSBVTFRSQV9WQlVTX0hFQURFUklORk87CisKK3R5cGVkZWYgc3RydWN0IF9VTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wgeworCVVMVFJBX0NIQU5ORUxfUFJPVE9DT0wgQ2hhbm5lbEhlYWRlcjsJLyogaW5pdGlhbGl6ZWQgYnkgc2VydmVyICovCisJVUxUUkFfVkJVU19IRUFERVJJTkZPIEhkckluZm87CS8qIGluaXRpYWxpemVkIGJ5IHNlcnZlciAqLworCS8qIHRoZSByZW1haW5kZXIgb2YgdGhpcyBjaGFubmVsIGlzIGZpbGxlZCBpbiBieSB0aGUgY2xpZW50ICovCisJVUxUUkFfVkJVU19ERVZJQ0VJTkZPIENocEluZm87CS8qIGRlc2NyaWJlcyBjbGllbnQgY2hpcHNldCBkZXZpY2UgYW5kCisJCQkJCSAqIGRyaXZlciAqLworCVVMVFJBX1ZCVVNfREVWSUNFSU5GTyBCdXNJbmZvOwkvKiBkZXNjcmliZXMgY2xpZW50IGJ1cyBkZXZpY2UgYW5kCisJCQkJCSAqIGRyaXZlciAqLworCVVMVFJBX1ZCVVNfREVWSUNFSU5GTyBEZXZJbmZvWzBdOwkvKiBkZXNjcmliZXMgY2xpZW50IGRldmljZSBhbmQKKwkJCQkJCSAqIGRyaXZlciBmb3IgKi8KKwkvKiBlYWNoIGRldmljZSBvbiB0aGUgYnVzICovCit9IFVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTDsKKworI2RlZmluZSBWQlVTX0NIX1NJWkVfRVhBQ1QoTUFYREVWSUNFUykgXAorCShzaXplb2YoVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MKSArICgoTUFYREVWSUNFUykgKiBcCisJCQkJCQlzaXplb2YoVUxUUkFfVkJVU19ERVZJQ0VJTkZPKSkpCisjZGVmaW5lIFZCVVNfQ0hfU0laRShNQVhERVZJQ0VTKSBDT1ZFUihWQlVTX0NIX1NJWkVfRVhBQ1QoTUFYREVWSUNFUyksIDQwOTYpCisKK3N0YXRpYyBJTkxJTkUgdm9pZAorVUxUUkFfVkJVU19pbml0X2NoYW5uZWwoVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MIF9faW9tZW0gKngsCisJCQlpbnQgYnl0ZXNBbGxvY2F0ZWQpCit7CisJLyogUGxlYXNlIG5vdGUgdGhhdCB0aGUgbWVtb3J5IGF0IDx4PiBkb2VzIE5PVCBuZWNlc3NhcmlseSBoYXZlIHNwYWNlCisJKiBmb3IgRGV2SW5mbyBzdHJ1Y3RzIGFsbG9jYXRlZCBhdCB0aGUgZW5kLCB3aGljaCBpcyB3aHkgd2UgZG8gTk9UIHVzZQorCSogPGJ5dGVzQWxsb2NhdGVkPiB0byBjbGVhci4gKi8KKwltZW1zZXRfaW8oeCwgMCwgc2l6ZW9mKFVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTCkpOworCWlmIChieXRlc0FsbG9jYXRlZCA8IChpbnQpIHNpemVvZihVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wpKQorCQlyZXR1cm47CisJd3JpdGVsKFVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTF9WRVJTSU9OSUQsCisJICAgICAgICZ4LT5DaGFubmVsSGVhZGVyLlZlcnNpb25JZCk7CisJd3JpdGVxKFVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUsCisJICAgICAgICZ4LT5DaGFubmVsSGVhZGVyLlNpZ25hdHVyZSk7CisJd3JpdGVsKENIQU5ORUxTUlZfUkVBRFksICZ4LT5DaGFubmVsSGVhZGVyLlNydlN0YXRlKTsKKwl3cml0ZWwoc2l6ZW9mKHgtPkNoYW5uZWxIZWFkZXIpLCAmeC0+Q2hhbm5lbEhlYWRlci5IZWFkZXJTaXplKTsKKwl3cml0ZXEoYnl0ZXNBbGxvY2F0ZWQsICZ4LT5DaGFubmVsSGVhZGVyLlNpemUpOworCW1lbWNweV90b2lvKCZ4LT5DaGFubmVsSGVhZGVyLlR5cGUsICZVbHRyYVZidXNDaGFubmVsUHJvdG9jb2xHdWlkLAorCQkgICAgc2l6ZW9mKHgtPkNoYW5uZWxIZWFkZXIuVHlwZSkpOworCW1lbWNweV90b2lvKCZ4LT5DaGFubmVsSGVhZGVyLlpvbmVHdWlkLCAmR3VpZDAsCisJCSAgICBzaXplb2YoeC0+Q2hhbm5lbEhlYWRlci5ab25lR3VpZCkpOworCXdyaXRlbChzaXplb2YoVUxUUkFfVkJVU19IRUFERVJJTkZPKSwgJngtPkhkckluZm8uc3RydWN0Qnl0ZXMpOworCXdyaXRlbChzaXplb2YoVUxUUkFfVkJVU19IRUFERVJJTkZPKSwgJngtPkhkckluZm8uY2hwSW5mb0J5dGVPZmZzZXQpOworCXdyaXRlbChyZWFkbCgmeC0+SGRySW5mby5jaHBJbmZvQnl0ZU9mZnNldCkgKworCSAgICAgICBzaXplb2YoVUxUUkFfVkJVU19ERVZJQ0VJTkZPKSwKKwkgICAgICAgJngtPkhkckluZm8uYnVzSW5mb0J5dGVPZmZzZXQpOworCXdyaXRlbChyZWFkbCgmeC0+SGRySW5mby5idXNJbmZvQnl0ZU9mZnNldCkKKwkgICAgICAgKyBzaXplb2YoVUxUUkFfVkJVU19ERVZJQ0VJTkZPKSwKKwkgICAgICAgJngtPkhkckluZm8uZGV2SW5mb0J5dGVPZmZzZXQpOworCXdyaXRlbChzaXplb2YoVUxUUkFfVkJVU19ERVZJQ0VJTkZPKSwKKwkgICAgICAgJngtPkhkckluZm8uZGV2aWNlSW5mb1N0cnVjdEJ5dGVzKTsKKwlieXRlc0FsbG9jYXRlZCAtPSAoc2l6ZW9mKFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wpCisJCQkgICArIHJlYWRsKCZ4LT5IZHJJbmZvLmRldkluZm9CeXRlT2Zmc2V0KSk7CisJd3JpdGVsKGJ5dGVzQWxsb2NhdGVkIC8gcmVhZGwoJngtPkhkckluZm8uZGV2aWNlSW5mb1N0cnVjdEJ5dGVzKSwKKwkgICAgICAgJngtPkhkckluZm8uZGV2SW5mb0NvdW50KTsKK30KKworI3ByYWdtYSBwYWNrKHBvcCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY29udHJvbHZtY29tcGxldGlvbnN0YXR1cy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NvbnRyb2x2bWNvbXBsZXRpb25zdGF0dXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTMwZDMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NvbnRyb2x2bWNvbXBsZXRpb25zdGF0dXMuaApAQCAtMCwwICsxLDkyIEBACisvKiBjb250cm9sdm1jb21wbGV0aW9uc3RhdHVzLmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qICBEZWZpbmVzIGZvciBhbGwgdmFsaWQgdmFsdWVzIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBtZXNzYWdlIGhlYWRlcgorICogIGNvbXBsZXRpb25TdGF0dXMgZmllbGQuICBTZWUgY29udHJvbHZtY2hhbm5lbC5oIGZvciBkZXNjcmlwdGlvbiBvZgorICogIHRoZSBoZWFkZXI6IF9DT05UUk9MVk1fTUVTU0FHRV9IRUFERVIuCisgKi8KKworI2lmbmRlZiBfX0NPTlRST0xWTUNPTVBMRVRJT05TVEFUVVNfSF9fCisjZGVmaW5lIF9fQ09OVFJPTFZNQ09NUExFVElPTlNUQVRVU19IX18KKworLyogR2VuZXJhbCBFcnJvcnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMC05OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORSAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9JT1JFTUFQX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfS01BTExPQ19GQUlMRUQgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX01FU1NBR0VfSURfVU5LTk9XTiAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9NRVNTQUdFX0lEX0lOVkFMSURfRk9SX0NMSUVOVCAgICAgIDUKKworLyogQ09OVFJPTFZNX0lOSVRfQ0hJUFNFVC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMTAwLTE5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0xJRU5UX1NXSVRDSENPVU5UX05PTlpFUk8gICAgICAgICAxMDAKKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfRVhQRUNURURfQ0hJUFNFVF9JTklUICAgICAgICAgICAgICAxMDEKKworLyogTWF4aW11bSBMaW1pdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMjAwLTI5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfTUFYX0JVU0VTCQkyMDEJLyogQlVTX0NSRUFURSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9NQVhfREVWSUNFUyAgICAgICAgMjAyCS8qIERFVklDRV9DUkVBVEUgKi8KKy8qIFBheWxvYWQgYW5kIFBhcmFtZXRlciBSZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzQwMC00OTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX1BBWUxPQURfSU5WQUxJRAk0MDAJLyogU1dJVENIX0FUVEFDSEVYVFBPUlQsCisJCQkJCQkJICogREVWSUNFX0NPTkZJR1VSRSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9JTklUSUFUT1JfUEFSQU1FVEVSX0lOVkFMSUQgNDAxCS8qIE11bHRpcGxlICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX1RBUkdFVF9QQVJBTUVURVJfSU5WQUxJRCA0MDIgLyogREVWSUNFX0NPTkZJR1VSRSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DTElFTlRfUEFSQU1FVEVSX0lOVkFMSUQgNDAzIC8qIERFVklDRV9DT05GSUdVUkUgKi8KKy8qIFNwZWNpZmllZFtQYWNrZXQgU3RydWN0dXJlXSBWYWx1ZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bNTAwLTU5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0lOVkFMSUQJNTAwCS8qIFNXSVRDSF9BVFRBQ0hJTlRQT1JULAorCQkJCQkJCSAqIEJVU19DT05GSUdVUkUsCisJCQkJCQkJICogREVWSUNFX0NSRUFURSwKKwkJCQkJCQkgKiBERVZJQ0VfQ09ORklHCisJCQkJCQkJICogREVWSUNFX0RFU1RST1kgKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX0lOVkFMSUQJNTAxIC8qIFNXSVRDSF9BVFRBQ0hJTlRQT1JUICovCisJCQkJCQkgICAgLyogREVWSUNFX0NSRUFURSwKKwkJCQkJCSAgICAgKiBERVZJQ0VfQ09ORklHVVJFLAorCQkJCQkJICAgICAqIERFVklDRV9ERVNUUk9ZICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfSU5WQUxJRAk1MDIgLyogREVWSUNFX0NSRUFURSwKKwkJCQkJCSAgICAgKiBERVZJQ0VfQ09ORklHVVJFICovCisvKiBQYXJ0aXRpb24gRHJpdmVyIENhbGxiYWNrIEludGVyZmFjZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bNjAwLTY5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfRkFJTFVSRSA2MDQJLyogQlVTX0NSRUFURSwKKwkJCQkJCQkgKiBCVVNfREVTVFJPWSwKKwkJCQkJCQkgKiBERVZJQ0VfQ1JFQVRFLAorCQkJCQkJCSAqIERFVklDRV9ERVNUUk9ZICovCisvKiBVbmFibGUgdG8gaW52b2tlIFZJUlRQQ0kgY2FsbGJhY2sgKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfQ0FMTEJBQ0tfRVJST1IgNjA1IC8qIEJVU19DUkVBVEUsCisJCQkJCQkJCSogQlVTX0RFU1RST1ksCisJCQkJCQkJCSogREVWSUNFX0NSRUFURSwKKwkJCQkJCQkJKiBERVZJQ0VfREVTVFJPWSAqLworLyogVklSVFBDSSBDYWxsYmFjayByZXR1cm5lZCBlcnJvciAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9HRU5FUklDX0RSSVZFUl9DQUxMQkFDS19FUlJPUiA2MDYgLyogU1dJVENIX0FUVEFDSEVYVFBPUlQsCisJCQkJCQkJCSogU1dJVENIX0RFVEFDSEVYVFBPUlQKKwkJCQkJCQkJKiBERVZJQ0VfQ09ORklHVVJFICovCisKKy8qIGdlbmVyaWMgZGV2aWNlIGNhbGxiYWNrIHJldHVybmVkIGVycm9yICovCisvKiBCdXMgUmVsYXRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVs3MDAtNzk5XSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfREVWSUNFX0FUVEFDSEVEIDcwMAkvKiBCVVNfREVTVFJPWSAqLworLyogQ2hhbm5lbCBSZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bODAwLTg5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hBTk5FTF9UWVBFX1VOS05PV04gODAwCS8qIEdFVF9DSEFOTkVMSU5GTywKKwkJCQkJCQkgKiBERVZJQ0VfREVTVFJPWSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX1NJWkVfVE9PX1NNQUxMIDgwMQkvKiBERVZJQ0VfQ1JFQVRFICovCisvKiBDaGlwc2V0IFNodXRkb3duIFJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMTAwMC0xMDk5XSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSElQU0VUX1NIVVRET1dOX0ZBSUxFRCAgICAgICAgICAgIDEwMDAKKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hJUFNFVF9TSFVURE9XTl9BTFJFQURZX0FDVElWRSAgICAxMDAxCisKKy8qIENoaXBzZXQgU3RvcCBSZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVsxMTAwLTExOTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NISVBTRVRfU1RPUF9GQUlMRURfQlVTICAgICAgICAgICAgMTEwMAorI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSElQU0VUX1NUT1BfRkFJTEVEX1NXSVRDSCAgICAgICAgIDExMDEKKworLyogRGV2aWNlIFJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzE0MDAtMTQ5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX1VERVZfVElNRU9VVCAgICAgICAgICAgICAgICAxNDAwCisKKyNlbmRpZiAvKiBfX0NPTlRST0xWTUNPTVBMRVRJT05TVEFUVVNfSF9fIG5vdCBkZWZpbmVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvZGlhZ25vc3RpY3MvYXBwb3Nfc3Vic3lzdGVtcy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2RpYWdub3N0aWNzL2FwcG9zX3N1YnN5c3RlbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzYyOTRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2RpYWdub3N0aWNzL2FwcG9zX3N1YnN5c3RlbXMuaApAQCAtMCwwICsxLDMxMCBAQAorLyogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgZmlsZSBpcyB0byBiZSB1c2VkIE9OTFkgZm9yIGRlZmluaW5nIGRpYWdub3N0aWMKKyAqIHN1YnN5c3RlbSB2YWx1ZXMgZm9yIHRoZSBhcHBvcyAoc1BBUiBMaW51eCBzZXJ2aWNlIHBhcnRpdGlvbnMpIGNvbXBvbmVudC4KKyAqLworI2lmbmRlZiBfX0FQUE9TX1NVQlNZU1RFTVNfSF9fCisjZGVmaW5lIF9fQVBQT1NfU1VCU1lTVEVNU19IX18KKworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGNoYXIgKgorc3Vic3lzX3Vua25vd25fdG9fcyhpbnQgc3Vic3lzLCBjaGFyICpzLCBpbnQgbikKK3sKKwlzbnByaW50ZihzLCBuLCAiU1VCU1lTLSUtMi4yZCIsIHN1YnN5cyk7CisJc1tuIC0gMV0gPSAnXDAnOworCXJldHVybiBzOworfQorCisjZGVmaW5lIFNVQlNZU19UT19NQVNLKHN1YnN5cykgICAgICAoMVVMTCA8PCAoc3Vic3lzKSkKKworLyogVGhlIGZpcnN0IFNVQlNZU19BUFBPU19NQVggc3Vic3lzdGVtcyBhcmUgdGhlIHNhbWUgZm9yIGVhY2ggQXBwT1MgdHlwZQorICogKElPVk0sIFNNUywgZXRjLikgVGhlIHJlc3QgaGF2ZSB1bmlxdWUgdmFsdWVzIGZvciBlYWNoIEFwcE9TIHR5cGUuCisgKi8KKyNkZWZpbmUgU1VCU1lTX0FQUE9TX01BWCAxNgorCisjZGVmaW5lCVNVQlNZU19BUFBPU19ERUZBVUxUICAgICAgICAgMQkvKiBvciAib3RoZXIiICovCisjZGVmaW5lIFNVQlNZU19BUFBPU19DSElQU0VUICAgICAgICAgMgkvKiBjb250cm9sdm0gYW5kIG90aGVyICovCisJCQkJCS8qIGxvdy1sZXZlbCBzUEFSIGFjdGl2aXR5ICovCisjZGVmaW5lIFNVQlNZU19BUFBPU19CVVMgICAgICAgICAgICAgMwkvKiBzUEFSIGJ1cyAqLworLyogREFLICNkZWZpbmUgU1VCU1lTX0FQUE9TX0RJQUcgICAgICAgICAgICA0ICAvLyBkaWFnbm9zdGljcyBhbmQgZHVtcCAqLworI2RlZmluZSBTVUJTWVNfQVBQT1NfQ0hBTk5FTEFDQ0VTUyAgIDUJLyogZ2VuZXJpYyBjaGFubmVsIGFjY2VzcyAqLworI2RlZmluZSBTVUJTWVNfQVBQT1NfTklDQ0xJRU5UICAgICAgIDYJLyogdmlydHVhbCBOSUMgY2xpZW50ICovCisjZGVmaW5lIFNVQlNZU19BUFBPU19IQkFDTElFTlQgICAgICAgNwkvKiB2aXJ0dWFsIEhCQSBjbGllbnQgKi8KKyNkZWZpbmUgU1VCU1lTX0FQUE9TX0NPTlNPTEVTRVJJQUwgICA4CS8qIHNQQVIgdmlydHVhbCBzZXJpYWwgY29uc29sZSAqLworI2RlZmluZSBTVUJTWVNfQVBQT1NfVUlTTElCICAgICAgICAgIDkJLyogICovCisjZGVmaW5lIFNVQlNZU19BUFBPU19WUlRDVVBERCAgICAgICAxMAkvKiAgKi8KKyNkZWZpbmUgU1VCU1lTX0FQUE9TX1dBVENIRE9HICAgICAgIDExCS8qIHdhdGNoZG9nIHRpbWVyIGFuZCBoZWFsdGhjaGVjayAqLworI2RlZmluZSBTVUJTWVNfQVBQT1NfMTMgICAgICAgICAgICAgMTMJLyogYXZhaWxhYmxlICovCisjZGVmaW5lIFNVQlNZU19BUFBPU18xNCAgICAgICAgICAgICAxNAkvKiBhdmFpbGFibGUgKi8KKyNkZWZpbmUgU1VCU1lTX0FQUE9TXzE1ICAgICAgICAgICAgIDE1CS8qIGF2YWlsYWJsZSAqLworI2RlZmluZSBTVUJTWVNfQVBQT1NfMTYgICAgICAgICAgICAgMTYJLyogYXZhaWxhYmxlICovCitzdGF0aWMgaW5saW5lIGNoYXIgKgorc3Vic3lzX2dlbmVyaWNfdG9fcyhpbnQgc3Vic3lzLCBjaGFyICpzLCBpbnQgbikKK3sKKwlzd2l0Y2ggKHN1YnN5cykgeworCWNhc2UgU1VCU1lTX0FQUE9TX0RFRkFVTFQ6CisJCXN0cm5jcHkocywgIkFQUE9TX0RFRkFVTFQiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQVBQT1NfQ0hJUFNFVDoKKwkJc3RybmNweShzLCAiQVBQT1NfQ0hJUFNFVCIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19BUFBPU19CVVM6CisJCXN0cm5jcHkocywgIkFQUE9TX0JVUyIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19BUFBPU19DSEFOTkVMQUNDRVNTOgorCQlzdHJuY3B5KHMsICJBUFBPU19DSEFOTkVMQUNDRVNTIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0FQUE9TX05JQ0NMSUVOVDoKKwkJc3RybmNweShzLCAiQVBQT1NfTklDQ0xJRU5UIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0FQUE9TX0hCQUNMSUVOVDoKKwkJc3RybmNweShzLCAiQVBQT1NfSEJBQ0xJRU5UIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0FQUE9TX0NPTlNPTEVTRVJJQUw6CisJCXN0cm5jcHkocywgIkFQUE9TX0NPTlNPTEVTRVJJQUwiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQVBQT1NfVUlTTElCOgorCQlzdHJuY3B5KHMsICJBUFBPU19VSVNMSUIiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQVBQT1NfVlJUQ1VQREQ6CisJCXN0cm5jcHkocywgIkFQUE9TX1ZSVENVUEREIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0FQUE9TX1dBVENIRE9HOgorCQlzdHJuY3B5KHMsICJBUFBPU19XQVRDSERPRyIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19BUFBPU18xMzoKKwkJc3RybmNweShzLCAiQVBQT1NfMTMiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQVBQT1NfMTQ6CisJCXN0cm5jcHkocywgIkFQUE9TXzE0Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0FQUE9TXzE1OgorCQlzdHJuY3B5KHMsICJBUFBPU18xNSIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19BUFBPU18xNjoKKwkJc3RybmNweShzLCAiQVBQT1NfMTYiLCBuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3Vic3lzX3Vua25vd25fdG9fcyhzdWJzeXMsIHMsIG4pOworCQlicmVhazsKKwl9CisJc1tuIC0gMV0gPSAnXDAnOworCXJldHVybiBzOworfQorCisvKiBDT05TT0xFICovCisKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfVklERU8gICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMSkJLyogMTcgKi8KKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfS0JETU9VICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMikJLyogMTggKi8KKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMDQgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgNCkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMDUgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgNSkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMDYgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgNikKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMDcgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgNykKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMDggICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgOCkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMDkgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgOSkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMTAgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMTApCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzExICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDExKQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8xMiAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAxMikKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMTMgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMTMpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzE0ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDE0KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8xNSAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAxNSkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMTYgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMTYpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzE3ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDE3KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8xOCAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAxOCkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMTkgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMTkpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzIwICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDIwKQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8yMSAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAyMSkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMjIgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMjIpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzIzICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDIzKQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8yNCAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAyNCkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMjUgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMjUpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzI2ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDI2KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8yNyAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAyNykKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMjggICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMjgpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzI5ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDI5KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8zMCAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAzMCkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMzEgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMzEpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzMyICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDMyKQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8zMyAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAzMykKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMzQgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMzQpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzM1ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDM1KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8zNiAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAzNikKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMzcgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMzcpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzM4ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDM4KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8zOSAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAzOSkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfNDAgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgNDApCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzQxICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDQxKQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV80MiAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyA0MikKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfNDMgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgNDMpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzQ0ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDQ0KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV80NSAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyA0NSkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfNDYgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgNDYpCisKK3N0YXRpYyBpbmxpbmUgY2hhciAqCitzdWJzeXNfY29uc29sZV90b19zKGludCBzdWJzeXMsIGNoYXIgKnMsIGludCBuKQoreworCXN3aXRjaCAoc3Vic3lzKSB7CisJY2FzZSBTVUJTWVNfQ09OU09MRV9WSURFTzoKKwkJc3RybmNweShzLCAiQ09OU09MRV9WSURFTyIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFX0tCRE1PVToKKwkJc3RybmNweShzLCAiQ09OU09MRV9LQkRNT1UiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8wNDoKKwkJc3RybmNweShzLCAiQ09OU09MRV8wNCIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzA1OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzA1Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMDY6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMDYiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8wNzoKKwkJc3RybmNweShzLCAiQ09OU09MRV8wNyIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzA4OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzA4Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMDk6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMDkiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8xMDoKKwkJc3RybmNweShzLCAiQ09OU09MRV8xMCIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzExOgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzExIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMTI6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMTIiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8xMzoKKwkJc3RybmNweShzLCAiQ09OU09MRV8xMyIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzE0OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzE0Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMTU6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMTUiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8xNjoKKwkJc3RybmNweShzLCAiQ09OU09MRV8xNiIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzE3OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzE3Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMTg6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMTgiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8xOToKKwkJc3RybmNweShzLCAiQ09OU09MRV8xOSIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzIwOgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzIwIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMjE6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMjEiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8yMjoKKwkJc3RybmNweShzLCAiQ09OU09MRV8yMiIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzIzOgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzIzIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMjQ6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMjQiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8yNToKKwkJc3RybmNweShzLCAiQ09OU09MRV8yNSIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzI2OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzI2Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMjc6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMjciLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8yODoKKwkJc3RybmNweShzLCAiQ09OU09MRV8yOCIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzI5OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzI5Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMzA6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMzAiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8zMToKKwkJc3RybmNweShzLCAiQ09OU09MRV8zMSIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzMyOgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzMyIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMzM6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMzMiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8zNDoKKwkJc3RybmNweShzLCAiQ09OU09MRV8zNCIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzM1OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzM1Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMzY6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMzYiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8zNzoKKwkJc3RybmNweShzLCAiQ09OU09MRV8zNyIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzM4OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzM4Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMzk6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMzkiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV80MDoKKwkJc3RybmNweShzLCAiQ09OU09MRV80MCIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzQxOgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzQxIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfNDI6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfNDIiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV80MzoKKwkJc3RybmNweShzLCAiQ09OU09MRV80MyIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzQ0OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzQ0Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfNDU6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfNDUiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV80NjoKKwkJc3RybmNweShzLCAiQ09OU09MRV80NiIsIG4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdWJzeXNfdW5rbm93bl90b19zKHN1YnN5cywgcywgbik7CisJCWJyZWFrOworCX0KKwlzW24gLSAxXSA9ICdcMCc7CisJcmV0dXJuIHM7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2lvdm1jYWxsX2dudWMuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9pb3ZtY2FsbF9nbnVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwNGU5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvaW92bWNhbGxfZ251Yy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIENvcHlyaWdodCDCqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qIExpbnV4IEdDQyBWZXJzaW9uICgzMi1iaXQgYW5kIDY0LWJpdCkgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworX191bmlzeXNfdm1jYWxsX2dudWModW5zaWduZWQgbG9uZyB0dXBsZSwgdW5zaWduZWQgbG9uZyByZWdfZWJ4LAorCQkgICAgIHVuc2lnbmVkIGxvbmcgcmVnX2VjeCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDA7CisKKwl1bnNpZ25lZCBpbnQgY3B1aWRfZWF4LCBjcHVpZF9lYngsIGNwdWlkX2VjeCwgY3B1aWRfZWR4OworCWNwdWlkKDB4MDAwMDAwMDEsICZjcHVpZF9lYXgsICZjcHVpZF9lYngsICZjcHVpZF9lY3gsICZjcHVpZF9lZHgpOworCWlmIChjcHVpZF9lY3ggJiAweDgwMDAwMDAwKSB7CisJICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIi5ieXRlIDB4MDBmLCAweDAwMSwgMHgwYzEiIDogIj1hIihyZXN1bHQpIDoKKwkJCQkgICAiYSIodHVwbGUpLCAiYiIocmVnX2VieCksICJjIihyZWdfZWN4KQorCQkJCSAgICAgICk7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gLTE7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworX191bmlzeXNfZXh0ZW5kZWRfdm1jYWxsX2dudWModW5zaWduZWQgbG9uZyBsb25nIHR1cGxlLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHJlZ19lYngsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgcmVnX2VjeCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyByZWdfZWR4KQoreworCXVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gMDsKKworCXVuc2lnbmVkIGludCBjcHVpZF9lYXgsIGNwdWlkX2VieCwgY3B1aWRfZWN4LCBjcHVpZF9lZHg7CisJY3B1aWQoMHgwMDAwMDAwMSwgJmNwdWlkX2VheCwgJmNwdWlkX2VieCwgJmNwdWlkX2VjeCwgJmNwdWlkX2VkeCk7CisJaWYgKGNwdWlkX2VjeCAmIDB4ODAwMDAwMDApIHsKKwkgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiLmJ5dGUgMHgwMGYsIDB4MDAxLCAweDBjMSIgOiAiPWEiKHJlc3VsdCkgOgorCQkJCSAgICJhIih0dXBsZSksICJiIihyZWdfZWJ4KSwgImMiKHJlZ19lY3gpLAorCQkJCSAgICJkIihyZWdfZWR4KSk7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gLTE7CisJfQorCXJldHVybiByZXN1bHQ7CisJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL3ZidXNkZXZpY2VpbmZvLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvdmJ1c2RldmljZWluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTcwOGZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL3ZidXNkZXZpY2VpbmZvLmgKQEAgLTAsMCArMSwyMDkgQEAKKy8qIENvcHlyaWdodCDCqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19WQlVTREVWSUNFSU5GT19IX18KKyNkZWZpbmUgX19WQlVTREVWSUNFSU5GT19IX18KKworI2luY2x1ZGUgImNvbW1vbnR5cGVzLmgiCisKKyNwcmFnbWEgcGFjayhwdXNoLCAxKQkJLyogYm90aCBHQ0MgYW5kIFZDIG5vdyBhbGxvdyB0aGlzIHByYWdtYSAqLworCisvKiBBbiBhcnJheSBvZiB0aGlzIHN0cnVjdCBpcyBwcmVzZW50IGluIHRoZSBjaGFubmVsIGFyZWEgZm9yIGVhY2ggdmJ1cy4KKyAqIChTZWUgdmJ1c2NoYW5uZWwuaC4pCisgKiBJdCBpcyBmaWxsZWQgaW4gYnkgdGhlIGNsaWVudCBzaWRlIHRvIHByb3ZpZGUgaW5mbyBhYm91dCB0aGUgZGV2aWNlCisgKiBhbmQgZHJpdmVyIGZyb20gdGhlIGNsaWVudCdzIHBlcnNwZWN0aXZlLgorICovCit0eXBlZGVmIHN0cnVjdCBfVUxUUkFfVkJVU19ERVZJQ0VJTkZPIHsKKwlVOCBkZXZUeXBlWzE2XTsJCS8qIHNob3J0IHN0cmluZyBpZGVudGlmeWluZyB0aGUgZGV2aWNlIHR5cGUgKi8KKwlVOCBkcnZOYW1lWzE2XTsJCS8qIGRyaXZlciAuc3lzIGZpbGUgbmFtZSAqLworCVU4IGluZm9TdHJpbmdzWzk2XTsJLyogc2VxdWVuY2Ugb2YgdGFiLWRlbGltaXRlZCBpZCBzdHJpbmdzOiAqLworCS8qIDxEUklWRVJfUkVWPiA8RFJJVkVSX1ZFUlRBRz4gPERSSVZFUl9DT01QSUxFVElNRT4gKi8KKwlVOCByZXNlcnZlZFsxMjhdOwkvKiBwYWQgc2l6ZSB0byAyNTYgYnl0ZXMgKi8KK30gVUxUUkFfVkJVU19ERVZJQ0VJTkZPOworCisjcHJhZ21hIHBhY2socG9wKQorCisvKiBSZWFkcyBjaGFycyBmcm9tIHRoZSBidWZmZXIgYXQgPHNyYz4gZm9yIDxzcmNtYXg+IGJ5dGVzLCBhbmQgd3JpdGVzIHRvCisgKiB0aGUgYnVmZmVyIGF0IDxwPiwgd2hpY2ggaXMgPHJlbWFpbj4gYnl0ZXMgbG9uZywgZW5zdXJpbmcgbmV2ZXIgdG8KKyAqIG92ZXJmbG93IHRoZSBidWZmZXIgYXQgPHA+LCB1c2luZyB0aGUgZm9sbG93aW5nIHJ1bGVzOgorICogLSBwcmludGFibGUgY2hhcmFjdGVycyBhcmUgc2ltcGx5IGNvcGllZCBmcm9tIHRoZSBidWZmZXIgYXQgPHNyYz4gdG8gdGhlCisgKiAgIGJ1ZmZlciBhdCA8cD4KKyAqIC0gaW50ZXJ2ZW5pbmcgc3RyZWFrcyBvZiBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gdGhlIGJ1ZmZlciBhdCA8c3JjPgorICogICBhcmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSBzcGFjZSBpbiB0aGUgYnVmZmVyIGF0IDxwPgorICogTm90ZSB0aGF0IHdlIHBheSBubyBhdHRlbnRpb24gdG8gJ1wwJy10ZXJtaW5hdGlvbi4KKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIDxwPi4KKyAqCisgKiBQYXNzIDxwPiA9PSBOVUxMIGFuZCA8cmVtYWluPiA9PSAwIGZvciB0aGlzIHNwZWNpYWwgYmVoYXZpb3IuICBJbiB0aGlzCisgKiBjYXNlLCB3ZSBzaW1wbHkgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBXT1VMRCBIQVZFIGJlZW4gd3JpdHRlbgorICogdG8gYSBidWZmZXIgYXQgPHA+LCBoYWQgaXQgYmVlbiBpbmZpbml0ZWx5IGJpZy4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK1ZCVVNDSEFOTkVMX3Nhbml0aXplX2J1ZmZlcihjaGFyICpwLCBpbnQgcmVtYWluLCBjaGFyIF9faW9tZW0gKnNyYywgaW50IHNyY21heCkKK3sKKwlpbnQgY2hhcnMgPSAwOworCWludCBub25wcmludGFibGVfc3RyZWFrID0gMDsKKwl3aGlsZSAoc3JjbWF4ID4gMCkgeworCQlpZiAoKHJlYWRiKHNyYykgPj0gJyAnKSAmJiAocmVhZGIoc3JjKSA8IDB4N2YpKSB7CisJCQlpZiAobm9ucHJpbnRhYmxlX3N0cmVhaykgeworCQkJCWlmIChyZW1haW4gPiAwKSB7CisJCQkJCSpwID0gJyAnOworCQkJCQlwKys7CisJCQkJCXJlbWFpbi0tOworCQkJCQljaGFycysrOworCQkJCX0gZWxzZSBpZiAocCA9PSBOVUxMKQorCQkJCQljaGFycysrOworCQkJCW5vbnByaW50YWJsZV9zdHJlYWsgPSAwOworCQkJfQorCQkJaWYgKHJlbWFpbiA+IDApIHsKKwkJCQkqcCA9IHJlYWRiKHNyYyk7CisJCQkJcCsrOworCQkJCXJlbWFpbi0tOworCQkJCWNoYXJzKys7CisJCQl9IGVsc2UgaWYgKHAgPT0gTlVMTCkKKwkJCQljaGFycysrOworCQl9IGVsc2UKKwkJCW5vbnByaW50YWJsZV9zdHJlYWsgPSAxOworCQlzcmMrKzsKKwkJc3JjbWF4LS07CisJfQorCXJldHVybiBjaGFyczsKK30KKworI2RlZmluZSBWQlVTQ0hBTk5FTF9BRERBQ0hBUihjaCwgcCwgcmVtYWluLCBjaGFycykgXAorCWRvIHsJCQkJCSAgIFwKKwkJaWYgKHJlbWFpbiA8PSAwKQkJICAgXAorCQkJYnJlYWs7CQkJICAgXAorCQkqcCA9IGNoOwkJCSAgIFwKKwkJcCsrOyAgY2hhcnMrKzsgIHJlbWFpbi0tOwkgICBcCisJfSB3aGlsZSAoMCkKKworLyogQ29udmVydHMgdGhlIG5vbi1uZWdhdGl2ZSB2YWx1ZSBhdCA8bnVtPiB0byBhbiBhc2NpaSBkZWNpbWFsIHN0cmluZworICogYXQgPHA+LCB3cml0aW5nIGF0IG1vc3QgPHJlbWFpbj4gYnl0ZXMuICBOb3RlIHRoZXJlIGlzIE5PICdcMCcgdGVybWluYXRpb24KKyAqIHdyaXR0ZW4gdG8gPHA+LgorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIDxwPi4KKyAqCisgKiBOb3RlIHRoYXQgd2UgY3JlYXRlIHRoaXMgZnVuY3Rpb24gYmVjYXVzZSB3ZSBuZWVkIHRvIGRvIHRoaXMgb3BlcmF0aW9uIGluCisgKiBhbiBlbnZpcm9ubWVudC1pbmRlcGVuZGVudCB3YXkgKHNpbmNlIHdlIGFyZSBpbiBhIGNvbW1vbiBoZWFkZXIgZmlsZSkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitWQlVTQ0hBTk5FTF9pdG9hKGNoYXIgKnAsIGludCByZW1haW4sIGludCBudW0pCit7CisJaW50IGRpZ2l0cyA9IDA7CisJY2hhciBzWzMyXTsKKwlpbnQgaTsKKworCWlmIChudW0gPT0gMCkgeworCQkvKiAnMCcgaXMgYSBzcGVjaWFsIGNhc2UgKi8KKwkJaWYgKHJlbWFpbiA8PSAwKQorCQkJcmV0dXJuIDA7CisJCSpwID0gJzAnOworCQlyZXR1cm4gMTsKKwl9CisJLyogZm9ybSBhIGJhY2t3YXJkcyBkZWNpbWFsIGFzY2lpIHN0cmluZyBpbiA8cz4gKi8KKwl3aGlsZSAobnVtID4gMCkgeworCQlpZiAoZGlnaXRzID49IChpbnQpIHNpemVvZihzKSkKKwkJCXJldHVybiAwOworCQlzW2RpZ2l0cysrXSA9IChudW0gJSAxMCkgKyAnMCc7CisJCW51bSA9IG51bSAvIDEwOworCX0KKwlpZiAocmVtYWluIDwgZGlnaXRzKSB7CisJCS8qIG5vdCBlbm91Z2ggcm9vbSBsZWZ0IGF0IDxwPiB0byBob2xkIG51bWJlciwgc28gZmlsbCB3aXRoCisJCSAqICc/JyAqLworCQlmb3IgKGkgPSAwOyBpIDwgcmVtYWluOyBpKyssIHArKykKKwkJCSpwID0gJz8nOworCQlyZXR1cm4gcmVtYWluOworCX0KKwkvKiBwbHVnIGluIHRoZSBkZWNpbWFsIGFzY2lpIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG51bWJlciwgYnkgKi8KKwkvKiByZXZlcnNpbmcgdGhlIHN0cmluZyB3ZSBqdXN0IGJ1aWx0IGluIDxzPiAqLworCWkgPSBkaWdpdHM7CisJd2hpbGUgKGkgPiAwKSB7CisJCWktLTsKKwkJKnAgPSBzW2ldOworCQlwKys7CisJfQorCXJldHVybiBkaWdpdHM7Cit9CisKKy8qIFJlYWRzIDxkZXZJbmZvPiwgYW5kIGNvbnZlcnRzIGl0cyBjb250ZW50cyB0byBhIHByaW50YWJsZSBzdHJpbmcgYXQgPHA+LAorICogd3JpdGluZyBhdCBtb3N0IDxyZW1haW4+IGJ5dGVzLiAgTm90ZSB0aGVyZSBpcyBOTyAnXDAnIHRlcm1pbmF0aW9uCisgKiB3cml0dGVuIHRvIDxwPi4KKyAqCisgKiBQYXNzIDxkZXZpeD4gPj0gMCBpZiB5b3Ugd2FudCBhIGRldmljZSBpbmRleCBwcmVzZW50ZWQuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gPHA+LgorICovCitzdGF0aWMgaW5saW5lIGludAorVkJVU0NIQU5ORUxfZGV2SW5mb1RvU3RyaW5nQnVmZmVyKFVMVFJBX1ZCVVNfREVWSUNFSU5GTyBfX2lvbWVtICpkZXZJbmZvLAorCQkJCSAgY2hhciAqcCwgaW50IHJlbWFpbiwgaW50IGRldml4KQoreworCWNoYXIgX19pb21lbSAqcHNyYzsKKwlpbnQgbnNyYywgeCwgaSwgcGFkOworCWludCBjaGFycyA9IDA7CisKKwlwc3JjID0gJihkZXZJbmZvLT5kZXZUeXBlWzBdKTsKKwluc3JjID0gc2l6ZW9mKGRldkluZm8tPmRldlR5cGUpOworCWlmIChWQlVTQ0hBTk5FTF9zYW5pdGl6ZV9idWZmZXIoTlVMTCwgMCwgcHNyYywgbnNyYykgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBlbWl0IGRldmljZSBpbmRleCAqLworCWlmIChkZXZpeCA+PSAwKSB7CisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCdbJywgcCwgcmVtYWluLCBjaGFycyk7CisJCXggPSBWQlVTQ0hBTk5FTF9pdG9hKHAsIHJlbWFpbiwgZGV2aXgpOworCQlwICs9IHg7CisJCXJlbWFpbiAtPSB4OworCQljaGFycyArPSB4OworCQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignXScsIHAsIHJlbWFpbiwgY2hhcnMpOworCX0gZWxzZSB7CisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7CisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7CisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7CisJfQorCisJLyogZW1pdCBkZXZpY2UgdHlwZSAqLworCXggPSBWQlVTQ0hBTk5FTF9zYW5pdGl6ZV9idWZmZXIocCwgcmVtYWluLCBwc3JjLCBuc3JjKTsKKwlwICs9IHg7CisJcmVtYWluIC09IHg7CisJY2hhcnMgKz0geDsKKwlwYWQgPSAxNSAtIHg7CQkvKiBwYWQgZGV2aWNlIHR5cGUgdG8gYmUgZXhhY3RseSAxNSBjaGFycyAqLworCWZvciAoaSA9IDA7IGkgPCBwYWQ7IGkrKykKKwkJVkJVU0NIQU5ORUxfQUREQUNIQVIoJyAnLCBwLCByZW1haW4sIGNoYXJzKTsKKwlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOworCisJLyogZW1pdCBkcml2ZXIgbmFtZSAqLworCXBzcmMgPSAmKGRldkluZm8tPmRydk5hbWVbMF0pOworCW5zcmMgPSBzaXplb2YoZGV2SW5mby0+ZHJ2TmFtZSk7CisJeCA9IFZCVVNDSEFOTkVMX3Nhbml0aXplX2J1ZmZlcihwLCByZW1haW4sIHBzcmMsIG5zcmMpOworCXAgKz0geDsKKwlyZW1haW4gLT0geDsKKwljaGFycyArPSB4OworCXBhZCA9IDE1IC0geDsJCS8qIHBhZCBkcml2ZXIgbmFtZSB0byBiZSBleGFjdGx5IDE1IGNoYXJzICovCisJZm9yIChpID0gMDsgaSA8IHBhZDsgaSsrKQorCQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOworCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7CisKKwkvKiBlbWl0IHN0cmluZ3MgKi8KKwlwc3JjID0gJihkZXZJbmZvLT5pbmZvU3RyaW5nc1swXSk7CisJbnNyYyA9IHNpemVvZihkZXZJbmZvLT5pbmZvU3RyaW5ncyk7CisJeCA9IFZCVVNDSEFOTkVMX3Nhbml0aXplX2J1ZmZlcihwLCByZW1haW4sIHBzcmMsIG5zcmMpOworCXAgKz0geDsKKwlyZW1haW4gLT0geDsKKwljaGFycyArPSB4OworCVZCVVNDSEFOTkVMX0FEREFDSEFSKCdcbicsIHAsIHJlbWFpbiwgY2hhcnMpOworCisJcmV0dXJuIGNoYXJzOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS92ZXJzaW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYjBlYmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvdmVyc2lvbi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIENvcHlyaWdodCDCqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qIHZlcnNpb24uaCAqLworCisvKiAgQ29tbW9uIHZlcnNpb24vcmVsZWFzZSBpbmZvIG5lZWRlZCBieSBhbGwgY29tcG9uZW50cyBnb2VzIGhlcmUuCisgKiAgKFRoaXMgZmlsZSBtdXN0IGNvbXBpbGUgY2xlYW5seSBpbiBhbGwgZW52aXJvbm1lbnRzLikKKyAqICBVbHRpbWF0ZWx5LCB0aGlzIHdpbGwgYmUgY29tYmluZWQgd2l0aCBkZWZpbmVzIGdlbmVyYXRlZCBkeW5hbWljYWxseSBhcworICogIHBhcnQgb2YgdGhlIHN5c2dlbiwgYW5kIHNvbWUgb2YgdGhlIGRlZmluZXMgYmVsb3cgbWF5IGluIGZhY3QgZW5kIHVwCisgKiAgYmVpbmcgcmVwbGFjZWQgd2l0aCBkeW5hbWljYWxseSBnZW5lcmF0ZWQgb25lcy4KKyAqLworI2lmbmRlZiBfX1ZFUlNJT05fSF9fCisjZGVmaW5lIF9fVkVSU0lPTl9IX18KKworI2RlZmluZSBTUEFSVkVSMSAiMSIKKyNkZWZpbmUgU1BBUlZFUjIgIjAiCisjZGVmaW5lIFNQQVJWRVIzICIwIgorI2RlZmluZSBTUEFSVkVSNCAiMCIKKworI2RlZmluZSAgVkVSU0lPTiAgICAgICAgU1BBUlZFUjEgIi4iIFNQQVJWRVIyICIuIiBTUEFSVkVSMyAiLiIgU1BBUlZFUjQKKyNkZWZpbmUgIFZFUlNJT05EQVRFICAgIF9fREFURV9fCisKKy8qIEhlcmUgYXJlIHZhcmlvdXMgdmVyc2lvbiBmb3JtcyBuZWVkZWQgaW4gV2luZG93cyBlbnZpcm9ubWVudHMuCisgKi8KKyNkZWZpbmUgVklTT1JfUFJPRFVDVFZFUlNJT04gICAgICBTUEFSVkVSQ09NTUEKKyNkZWZpbmUgVklTT1JfUFJPRFVDVFZFUlNJT05fU1RSICBTUEFSVkVSMSAiLiIgU1BBUlZFUjIgIi4iIFNQQVJWRVIzICIuIiBcCisJU1BBUlZFUjQKKyNkZWZpbmUgVklTT1JfT0JKRUNUVkVSU0lPTl9TVFIgICBTUEFSVkVSMSAiLCIgU1BBUlZFUjIgIiwiIFNQQVJWRVIzICIsIiBcCisJU1BBUlZFUjQKKworI2RlZmluZSAgQ09QWVJJR0hUICAgICAgIlVuaXN5cyBDb3Jwb3JhdGlvbiIKKyNkZWZpbmUgIENPUFlSSUdIVERBVEUgICIyMDEwIC0gMjAxMyIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvdm1jYWxsaW50ZXJmYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvdm1jYWxsaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjNDA0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS92bWNhbGxpbnRlcmZhY2UuaApAQCAtMCwwICsxLDE2NyBAQAorLyogQ29weXJpZ2h0IMKpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0lPTU9OSU5URl9IX18KKyNkZWZpbmUgX19JT01PTklOVEZfSF9fCisKKy8qCisqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgc3RydWN0dXJlcyBuZWVkZWQgdG8gc3VwcG9ydCB0aGUgVk1DQUxMcyBmb3IgSU8KKyogVmlydHVhbGl6YXRpb24uICBUaGUgVk1DQUxMcyBhcmUgcHJvdmlkZWQgYnkgTW9uaXRvciBhbmQgdXNlZCBieSBJTyBjb2RlCisqIHJ1bm5pbmcgb24gSU8gUGFydGl0aW9ucy4KKyovCisKKyNpZmRlZiBfX0dOVUNfXworI2luY2x1ZGUgImlvdm1jYWxsX2dudWMuaCIKKyNlbmRpZgkvKiAgKi8KKyNpbmNsdWRlICJkaWFnY2hhbm5lbC5oIgorCisjaWZkZWYgVk1DQUxMX0lPX0NPTlRST0xWTV9BRERSCisjdW5kZWYgVk1DQUxMX0lPX0NPTlRST0xWTV9BRERSCisjZW5kaWYJLyogICovCisKKy8qIGRlZmluZSBzdWJzeXN0ZW0gbnVtYmVyIGZvciBBcHBPUywgdXNlZCBpbiB1aXNsaWIgZHJpdmVyICAqLworI2RlZmluZSBNRFNfQVBQT1MgMHg0MDAwMDAwMDAwMDAwMDAwTAkvKiBzdWJzeXN0ZW0gPSA2MiAtIEFwcE9TICovCit0eXBlZGVmIGVudW0gewkJLyogVk1DQUxMIGlkZW50aWZpY2F0aW9uIHR1cGxlcyAgKi8KKwkgICAgLyogTm90ZTogd2hlbiBhIG5ldyBWTUNBTEwgaXMgYWRkZWQ6CisJICAgICAqIC0gdGhlIDFzdCAyIGhleCBkaWdpdHMgY29ycmVzcG9uZCB0byBvbmUgb2YgdGhlCisJICAgICAqICAgVk1DQUxMX01PTklUT1JfSU5URVJGQUNFIHR5cGVzIGFuZAorCSAgICAgKiAtIHRoZSBuZXh0IDIgaGV4IGRpZ2l0cyBhcmUgdGhlIG50aCByZWxhdGl2ZSBpbnN0YW5jZSBvZiB3aXRoaW4gYQorCSAgICAgKiAgIHR5cGUKKwkgICAgICogRS5HLiBmb3IgVk1DQUxMX1ZJUlRQQVJUX1JFQ1lDTEVfUEFSVCwKKwkgICAgICogLSB0aGUgMHgwMiBpZGVudGlmaWVzIGl0IGFzIGEgVk1DQUxMX1ZJUlRQQVJUIHR5cGUgYW5kCisJICAgICAqIC0gdGhlIDB4MDEgaWRlbnRpZmllcyBpdCBhcyB0aGUgMXN0IGluc3RhbmNlIG9mIGEgVk1DQUxMX1ZJUlRQQVJUCisJICAgICAqICAgdHlwZSBvZiBWTUNBTEwKKwkgICAgICovCisKKwlWTUNBTExfSU9fQ09OVFJPTFZNX0FERFIgPSAweDA1MDEsCS8qIHVzZWQgYnkgYWxsIEd1ZXN0cywgbm90IGp1c3QKKwkJCQkJCSAqIElPICovCisJVk1DQUxMX0lPX0RJQUdfQUREUiA9IDB4MDUwOCwKKwlWTUNBTExfSU9fVklTT1JTRVJJQUxfQUREUiA9IDB4MDUwOSwKKwlWTUNBTExfUVVFUllfR1VFU1RfVklSVFVBTF9USU1FX09GRlNFVCA9IDB4MDcwOCwgLyogQWxsb3cgY2FsbGVyIHRvCisJCQkJCQkJICAqIHF1ZXJ5IHZpcnR1YWwgdGltZQorCQkJCQkJCSAgKiBvZmZzZXQgKi8KKwlWTUNBTExfQ0hBTk5FTF9WRVJTSU9OX01JU01BVENIID0gMHgwNzA5LAorCVZNQ0FMTF9QT1NUX0NPREVfTE9HRVZFTlQgPSAweDA3MEIsCS8qIExPR0VWRU5UIFBvc3QgQ29kZSAoUkRYKSB3aXRoCisJCQkJCQkgKiBzcGVjaWZpZWQgc3Vic3lzdGVtIG1hc2sgKFJDWAorCQkJCQkJICogLSBtb25pdG9yX3N1YnN5c3RlbXMuaCkgYW5kCisJCQkJCQkgKiBzZXZlcml0eSAoUkRYKSAqLworCVZNQ0FMTF9HRU5FUklDX1NVUlJFTkRFUl9RVUFOVFVNX0ZPUkVWRVIgPSAweDA4MDIsIC8qIFlpZWxkIHRoZQorCQkJCQkJCSAgICAqIHJlbWFpbmRlciAmIGFsbAorCQkJCQkJCSAgICAqIGZ1dHVyZSBxdWFudHVtcyBvZgorCQkJCQkJCSAgICAqIHRoZSBjYWxsZXIgKi8KKwlWTUNBTExfTUVBU1VSRU1FTlRfRE9fTk9USElORyA9IDB4MDkwMSwKKwlWTUNBTExfVVBEQVRFX1BIWVNJQ0FMX1RJTUUgPSAweDBhMDIJLyogQWxsb3cKKwkJCQkJCSAqIFVMVFJBX1NFUlZJQ0VfQ0FQQUJJTElUWV9USU1FCisJCQkJCQkgKiBjYXBhYmxlIGd1ZXN0IHRvIG1ha2UKKwkJCQkJCSAqIFZNQ0FMTCAqLworfSBWTUNBTExfTU9OSVRPUl9JTlRFUkZBQ0VfTUVUSE9EX1RVUExFOworCisjZGVmaW5lIFZNQ0FMTF9TVUNDRVNTIDAKKyNkZWZpbmUgVk1DQUxMX1NVQ0NFU1NGVUwocmVzdWx0KQkocmVzdWx0ID09IDApCisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSB1bmlzeXNfdm1jYWxsKHR1cGxlLCByZWdfZWJ4LCByZWdfZWN4KSBcCisJX191bmlzeXNfdm1jYWxsX2dudWModHVwbGUsIHJlZ19lYngsIHJlZ19lY3gpCisjZGVmaW5lIHVuaXN5c19leHRlbmRlZF92bWNhbGwodHVwbGUsIHJlZ19lYngsIHJlZ19lY3gsIHJlZ19lZHgpIFwKKwlfX3VuaXN5c19leHRlbmRlZF92bWNhbGxfZ251Yyh0dXBsZSwgcmVnX2VieCwgcmVnX2VjeCwgcmVnX2VkeCkKKyNkZWZpbmUgSVNTVUVfSU9fVk1DQUxMKEludGVyZmFjZU1ldGhvZCwgcGFyYW0sIHJlc3VsdCkgXAorCShyZXN1bHQgPSB1bmlzeXNfdm1jYWxsKEludGVyZmFjZU1ldGhvZCwgKHBhcmFtKSAmIDB4RkZGRkZGRkYsCVwKKwkJCQkocGFyYW0pID4+IDMyKSkKKyNkZWZpbmUgSVNTVUVfSU9fRVhURU5ERURfVk1DQUxMKEludGVyZmFjZU1ldGhvZCwgcGFyYW0xLCBwYXJhbTIsCVwKKwkJCQkgcGFyYW0zLCByZXN1bHQpCQkJXAorCShyZXN1bHQgPSB1bmlzeXNfZXh0ZW5kZWRfdm1jYWxsKEludGVyZmFjZU1ldGhvZCwgcGFyYW0xLAlcCisJCQkJCSBwYXJhbTIsIHBhcmFtMykpCisKKyAgICAvKiBUaGUgZm9sbG93aW5nIHVzZXMgVk1DQUxMX1BPU1RfQ09ERV9MT0dFVkVOVCBpbnRlcmZhY2UgYnV0IGlzIGN1cnJlbnRseQorICAgICAqIG5vdCB1c2VkIG11Y2ggKi8KKyNkZWZpbmUgSVNTVUVfSU9fVk1DQUxMX1BPU1RDT0RFX1NFVkVSSVRZKHBvc3Rjb2RlLCBzZXZlcml0eSkJCVwKK2RvIHsJCQkJCQkJCQlcCisJVTMyIF90ZW1wcmVzdWx0ID0gVk1DQUxMX1NVQ0NFU1M7CQkJCVwKKwlJU1NVRV9JT19FWFRFTkRFRF9WTUNBTEwoVk1DQUxMX1BPU1RfQ09ERV9MT0dFVkVOVCwgc2V2ZXJpdHksCVwKKwkJCQkgTURTX0FQUE9TLCBwb3N0Y29kZSwgX3RlbXByZXN1bHQpOwlcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIFN0cnVjdHVyZXMgZm9yIElPIFZNQ0FMTHMgKi8KKworLyogLy8vLy8vLy8vLy8vLyBCRUdJTiBQUkFHTUEgUEFDSyBQVVNIIDEgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworLyogLy8vLy8vLy8vLy8vLyBPTkxZIFNUUlVDVCBUWVBFIFNIT1VMRCBCRSBCRUxPVyAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDEpCitzdHJ1Y3QgcGh5c19pbmZvIHsKKwlVNjQgcGlfcGZuOworCVUxNiBwaV9vZmY7CisJVTE2IHBpX2xlbjsKK307CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiAvLy8vLy8vLy8vLy8vIEVORCBQUkFHTUEgUEFDSyBQVVNIIDEgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCit0eXBlZGVmIHN0cnVjdCBwaHlzX2luZm8gSU9fREFUQV9TVFJVQ1RVUkU7CisKKy8qIC8vLy8vLy8vLy8vLy8gQkVHSU4gUFJBR01BIFBBQ0sgUFVTSCAxIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKy8qIC8vLy8vLy8vLy8vLy8gT05MWSBTVFJVQ1QgVFlQRSBTSE9VTEQgQkUgQkVMT1cgKi8KKyNwcmFnbWEgcGFjayhwdXNoLCAxKQorLyogUGFyYW1ldGVycyB0byBWTUNBTExfSU9fQ09OVFJPTFZNX0FERFIgaW50ZXJmYWNlICovCit0eXBlZGVmIHN0cnVjdCBfVk1DQUxMX0lPX0NPTlRST0xWTV9BRERSX1BBUkFNUyB7CisJICAgIC8qIFRoZSBHdWVzdC1yZWxhdGl2ZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBDb250cm9sVm0gY2hhbm5lbC4KKwkgICAgKiBUaGlzIFZNQ2FsbCBmaWxscyB0aGlzIGluIHdpdGggdGhlIGFwcHJvcHJpYXRlIGFkZHJlc3MuICovCisJVTY0IENoYW5uZWxBZGRyZXNzOwkvKiBjb250ZW50cyBwcm92aWRlZCBieSB0aGlzIFZNQ0FMTCAoT1VUKSAqLworCSAgICAvKiB0aGUgc2l6ZSBvZiB0aGUgQ29udHJvbFZtIGNoYW5uZWwgaW4gYnl0ZXMgVGhpcyBWTUNhbGwgZmlsbHMgdGhpcworCSAgICAqIGluIHdpdGggdGhlIGFwcHJvcHJpYXRlIGFkZHJlc3MuICovCisJVTMyIENoYW5uZWxCeXRlczsJLyogY29udGVudHMgcHJvdmlkZWQgYnkgdGhpcyBWTUNBTEwgKE9VVCkgKi8KKwlVOCBVbnVzZWRbNF07CQkvKiBVbnVzZWQgQnl0ZXMgaW4gdGhlIDY0LUJpdCBBbGlnbmVkIFN0cnVjdCAqLworfSBWTUNBTExfSU9fQ09OVFJPTFZNX0FERFJfUEFSQU1TOworCisjcHJhZ21hIHBhY2socG9wKQorLyogLy8vLy8vLy8vLy8vLyBFTkQgUFJBR01BIFBBQ0sgUFVTSCAxIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCisvKiAvLy8vLy8vLy8vLy8vIEJFR0lOIFBSQUdNQSBQQUNLIFBVU0ggMSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisvKiAvLy8vLy8vLy8vLy8vIE9OTFkgU1RSVUNUIFRZUEUgU0hPVUxEIEJFIEJFTE9XICovCisjcHJhZ21hIHBhY2socHVzaCwgMSkKKy8qIFBhcmFtZXRlcnMgdG8gVk1DQUxMX0lPX0RJQUdfQUREUiBpbnRlcmZhY2UgKi8KK3R5cGVkZWYgc3RydWN0IF9WTUNBTExfSU9fRElBR19BRERSX1BBUkFNUyB7CisJICAgIC8qIFRoZSBHdWVzdC1yZWxhdGl2ZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBkaWFnbm9zdGljIGNoYW5uZWwuCisJICAgICogVGhpcyBWTUNhbGwgZmlsbHMgdGhpcyBpbiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBhZGRyZXNzLiAqLworCVU2NCBDaGFubmVsQWRkcmVzczsJLyogY29udGVudHMgcHJvdmlkZWQgYnkgdGhpcyBWTUNBTEwgKE9VVCkgKi8KK30gVk1DQUxMX0lPX0RJQUdfQUREUl9QQVJBTVM7CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiAvLy8vLy8vLy8vLy8vIEVORCBQUkFHTUEgUEFDSyBQVVNIIDEgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKy8qIC8vLy8vLy8vLy8vLy8gQkVHSU4gUFJBR01BIFBBQ0sgUFVTSCAxIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKy8qIC8vLy8vLy8vLy8vLy8gT05MWSBTVFJVQ1QgVFlQRSBTSE9VTEQgQkUgQkVMT1cgKi8KKyNwcmFnbWEgcGFjayhwdXNoLCAxKQorLyogUGFyYW1ldGVycyB0byBWTUNBTExfSU9fVklTT1JTRVJJQUxfQUREUiBpbnRlcmZhY2UgKi8KK3R5cGVkZWYgc3RydWN0IF9WTUNBTExfSU9fVklTT1JTRVJJQUxfQUREUl9QQVJBTVMgeworCSAgICAvKiBUaGUgR3Vlc3QtcmVsYXRpdmUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgc2VyaWFsIGNvbnNvbGUKKwkgICAgKiBjaGFubmVsLiAgVGhpcyBWTUNhbGwgZmlsbHMgdGhpcyBpbiB3aXRoIHRoZSBhcHByb3ByaWF0ZQorCSAgICAqIGFkZHJlc3MuICovCisJVTY0IENoYW5uZWxBZGRyZXNzOwkvKiBjb250ZW50cyBwcm92aWRlZCBieSB0aGlzIFZNQ0FMTCAoT1VUKSAqLworfSBWTUNBTExfSU9fVklTT1JTRVJJQUxfQUREUl9QQVJBTVM7CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiAvLy8vLy8vLy8vLy8vIEVORCBQUkFHTUEgUEFDSyBQVVNIIDEgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKy8qIFBhcmFtZXRlcnMgdG8gVk1DQUxMX0NIQU5ORUxfTUlTTUFUQ0ggaW50ZXJmYWNlICovCit0eXBlZGVmIHN0cnVjdCBfVk1DQUxMX0NIQU5ORUxfVkVSU0lPTl9NSVNNQVRDSF9QQVJBTVMgeworCVU4IENoYW5uZWxOYW1lWzMyXTsJLyogTnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBnaXZpbmcgbmFtZSBvZiBjaGFubmVsCisJCQkJICogKElOKSAqLworCVU4IEl0ZW1OYW1lWzMyXTsJLyogTnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBnaXZpbmcgbmFtZSBvZgorCQkJCSAqIG1pc21hdGNoZWQgaXRlbSAoSU4pICovCisJVTMyIFNvdXJjZUxpbmVOdW1iZXI7CS8qIGxpbmUjIHdoZXJlIGludm9rZWQuIChJTikgKi8KKwlVOCBTb3VyY2VGaWxlTmFtZVszNl07CS8qIHNvdXJjZSBjb2RlIHdoZXJlIGludm9rZWQgLSBOdWxsIHRlcm1pbmF0ZWQKKwkJCQkgKiBzdHJpbmcgKElOKSAqLworfSBWTUNBTExfQ0hBTk5FTF9WRVJTSU9OX01JU01BVENIX1BBUkFNUzsKKworI2VuZGlmIC8qIF9fSU9NT05JTlRGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2NvbW1vbnR5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvY29tbW9udHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjEyYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2NvbW1vbnR5cGVzLmgKQEAgLTAsMCArMSwxNzAgQEAKKy8qIENvcHlyaWdodCDCqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0NPTU1PTlRZUEVTX0hfCisjZGVmaW5lIF9DT01NT05UWVBFU19IXworCisvKiBkZWZpbmUgdGhlIGZvbGxvd2luZyB0byBwcmV2ZW50IGluY2x1ZGUgbmVzdGluZyBpbiBrZXJuZWwgaGVhZGVyIGZpbGVzIG9mCisgKiBzaW1pbGFyIGFicmV2aWF0ZWQgY29udGVudCAqLworI2RlZmluZSBfU1VQRVJWSVNPUl9DT01NT05UWVBFU19IXworCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2VuZGlmCisKKyNkZWZpbmUgVTggIHVpbnQ4X3QKKyNkZWZpbmUgVTE2IHVpbnQxNl90CisjZGVmaW5lIFUzMiB1aW50MzJfdAorI2RlZmluZSBVNjQgdWludDY0X3QKKyNkZWZpbmUgUzggIGludDhfdAorI2RlZmluZSBTMTYgaW50MTZfdAorI2RlZmluZSBTMzIgaW50MzJfdAorI2RlZmluZSBTNjQgaW50NjRfdAorCisjaWZkZWYgX19LRVJORUxfXworCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorI2RlZmluZSBVSU5UTiBVMzIKKyNlbHNlCisjZGVmaW5lIFVJTlROIFU2NAorI2VuZGlmCisKKyNlbHNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpZiBfX1dPUkRTSVpFID09IDMyCisjZGVmaW5lIFVJTlROIFUzMgorI2VsaWYgX19XT1JEU0laRSA9PSA2NAorI2RlZmluZSBVSU5UTiBVNjQKKyNlbHNlCisjZXJyb3IgVW5zdXBwb3J0ZWQgX19XT1JEU0laRQorI2VuZGlmCisKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJVTMyIGRhdGExOworCVUxNiBkYXRhMjsKKwlVMTYgZGF0YTM7CisJVTggZGF0YTRbOF07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgR1VJRDsKKworI2lmbmRlZiBHVUlEMAorI2RlZmluZSBHVUlEMCB7MCwgMCwgMCwgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9IH0KKyNlbmRpZgordHlwZWRlZiBVNjQgR1VFU1RfUEhZU0lDQUxfQUREUkVTUzsKKworI2RlZmluZSBNRU1TRVQocHRyLCB2YWwsIGxlbikgbWVtc2V0KHB0ciwgdmFsLCBsZW4pCisjZGVmaW5lIE1FTUNNUChtMSwgbTIsIGxlbikgbWVtY21wKG0xLCBtMiwgbGVuKQorI2RlZmluZSBNRU1DTVBfSU8obTEsIG0yLCBsZW4pIG1lbWNtcCgodm9pZCBfX2ZvcmNlICopbTEsIG0yLCBsZW4pCisjZGVmaW5lIFNUUkxFTihzKSAoKFVJTlROKXN0cmxlbigoY29uc3QgY2hhciAqKXMpKQorI2RlZmluZSBTVFJDUFkoZCwgcykgKHN0cmNweSgoY2hhciAqKWQsIChjb25zdCBjaGFyICopcykpCisKKyNkZWZpbmUgSU5MSU5FIGlubGluZQorI2RlZmluZSBPRkZTRVRPRiBvZmZzZXRvZgorCisjaWZkZWYgX19LRVJORUxfXworI2RlZmluZSBNRU1PUllCQVJSSUVSIG1iKCkKKyNkZWZpbmUgTUVNQ1BZKGRlc3QsIHNyYywgbGVuKSBtZW1jcHkoZGVzdCwgc3JjLCBsZW4pCisjZGVmaW5lIE1FTUNQWV9UT0lPKGRlc3QsIHNyYywgbGVuKSBtZW1jcHlfdG9pbyhkZXN0LCBzcmMsIGxlbikKKyNkZWZpbmUgTUVNQ1BZX0ZST01JTyhkZXN0LCBzcmMsIGxlbikgbWVtY3B5X2Zyb21pbyhkZXN0LCBzcmMsIGxlbikKKworI2RlZmluZSBDSEFOTkVMX0dVSURfTUlTTUFUQ0goY2hUeXBlLCBjaE5hbWUsIGZpZWxkLCBleHBlY3RlZCwgYWN0dWFsLCBmaWwsIFwKKwkJCSAgICAgIGxpbiwgbG9nQ3R4KQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQljaGFyIHMxWzUwXSwgczJbNTBdLCBzM1s1MF07CQkJCVwKKwkJcHJfZXJyKCJDaGFubmVsIG1pc21hdGNoIG9uIGNoYW5uZWw9JXMoJXMpIGZpZWxkPSVzIGV4cGVjdGVkPSVzIGFjdHVhbD0lcyBAJXM6JWRcbiIsIFwKKwkJICAgICAgIGNoTmFtZSwgR1VJRF9mb3JtYXQyKCZjaFR5cGUsIHMxKSwgZmllbGQsCVwKKwkJICAgICAgIEdVSURfZm9ybWF0MigmZXhwZWN0ZWQsIHMyKSwgR1VJRF9mb3JtYXQyKCZhY3R1YWwsIHMzKSwgXAorCQkgICAgICAgZmlsLCBsaW4pOwkJCQkJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIENIQU5ORUxfVTMyX01JU01BVENIKGNoVHlwZSwgY2hOYW1lLCBmaWVsZCwgZXhwZWN0ZWQsIGFjdHVhbCwgZmlsLCBcCisJCQkgICAgIGxpbiwgbG9nQ3R4KQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQljaGFyIHMxWzUwXTsJCQkJCQlcCisJCXByX2VycigiQ2hhbm5lbCBtaXNtYXRjaCBvbiBjaGFubmVsPSVzKCVzKSBmaWVsZD0lcyBleHBlY3RlZD0weCUtOC44bHggYWN0dWFsPTB4JS04LjhseCBAJXM6JWRcbiIsIFwKKwkJICAgICAgIGNoTmFtZSwgR1VJRF9mb3JtYXQyKCZjaFR5cGUsIHMxKSwgZmllbGQsCVwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKWV4cGVjdGVkLCAodW5zaWduZWQgbG9uZylhY3R1YWwsCVwKKwkJICAgICAgIGZpbCwgbGluKTsJCQkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIENIQU5ORUxfVTY0X01JU01BVENIKGNoVHlwZSwgY2hOYW1lLCBmaWVsZCwgZXhwZWN0ZWQsIGFjdHVhbCwgZmlsLCBcCisJCQkgICAgIGxpbiwgbG9nQ3R4KQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQljaGFyIHMxWzUwXTsJCQkJCQlcCisJCXByX2VycigiQ2hhbm5lbCBtaXNtYXRjaCBvbiBjaGFubmVsPSVzKCVzKSBmaWVsZD0lcyBleHBlY3RlZD0weCUtOC44THggYWN0dWFsPTB4JS04LjhMeCBAJXM6JWRcbiIsIFwKKwkJICAgICAgIGNoTmFtZSwgR1VJRF9mb3JtYXQyKCZjaFR5cGUsIHMxKSwgZmllbGQsCVwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZXhwZWN0ZWQsCQkJXAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhY3R1YWwsCQkJXAorCQkgICAgICAgZmlsLCBsaW4pOwkJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgVWx0cmFMb2dFdmVudChsb2dDdHgsIEV2ZW50SWQsIFNldmVyaXR5LCBTdWJzeXN0ZW1NYXNrLCBwRnVuY3Rpb25OYW1lLCBcCisJCSAgICAgIExpbmVOdW1iZXIsIFN0ciwgYXJncy4uLikJCQkJXAorCXByX2luZm8oU3RyLCAjIyBhcmdzKQorCisjZWxzZQorI2RlZmluZSBNRU1DUFkoZGVzdCwgc3JjLCBsZW4pIG1lbWNweShkZXN0LCBzcmMsIGxlbikKKworI2RlZmluZSBNRU1PUllCQVJSSUVSIG1iKCkKKworI2RlZmluZSBDSEFOTkVMX0dVSURfTUlTTUFUQ0goY2hUeXBlLCBjaE5hbWUsIGZpZWxkLCBleHBlY3RlZCwgYWN0dWFsLCBmaWwsIFwKKwkJCSAgICAgIGxpbiwgbG9nQ3R4KQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQljaGFyIHMxWzUwXSwgczJbNTBdLCBzM1s1MF07CQkJCVwKKwkJc3lzbG9nKExPR19VU0VSIHwgTE9HX0VSUiwJCQkJXAorCQkgICAgICAgIkNoYW5uZWwgbWlzbWF0Y2ggb24gY2hhbm5lbD0lcyglcykgZmllbGQ9JXMgZXhwZWN0ZWQ9JXMgYWN0dWFsPSVzIEAlczolZCIsIFwKKwkJICAgICAgIGNoTmFtZSwgR1VJRF9mb3JtYXQyKCZjaFR5cGUsIHMxKSwgZmllbGQsCVwKKwkJICAgICAgIEdVSURfZm9ybWF0MigmZXhwZWN0ZWQsIHMyKSwgR1VJRF9mb3JtYXQyKCZhY3R1YWwsIHMzKSwgXAorCQkgICAgICAgZmlsLCBsaW4pOwkJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0hBTk5FTF9VMzJfTUlTTUFUQ0goY2hUeXBlLCBjaE5hbWUsIGZpZWxkLCBleHBlY3RlZCwgYWN0dWFsLCBmaWwsIFwKKwkJCSAgICAgbGluLCBsb2dDdHgpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWNoYXIgczFbNTBdOwkJCQkJCVwKKwkJc3lzbG9nKExPR19VU0VSIHwgTE9HX0VSUiwJCQkJXAorCQkgICAgICAgIkNoYW5uZWwgbWlzbWF0Y2ggb24gY2hhbm5lbD0lcyglcykgZmllbGQ9JXMgZXhwZWN0ZWQ9MHglLTguOGx4IGFjdHVhbD0weCUtOC44bHggQCVzOiVkIiwgXAorCQkgICAgICAgY2hOYW1lLCBHVUlEX2Zvcm1hdDIoJmNoVHlwZSwgczEpLCBmaWVsZCwJXAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpZXhwZWN0ZWQsICh1bnNpZ25lZCBsb25nKWFjdHVhbCwJXAorCQkgICAgICAgZmlsLCBsaW4pOwkJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0hBTk5FTF9VNjRfTUlTTUFUQ0goY2hUeXBlLCBjaE5hbWUsIGZpZWxkLCBleHBlY3RlZCwgYWN0dWFsLCBmaWwsIFwKKwkJCSAgICAgbGluLCBsb2dDdHgpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWNoYXIgczFbNTBdOwkJCQkJCVwKKwkJc3lzbG9nKExPR19VU0VSIHwgTE9HX0VSUiwJCQkJXAorCQkgICAgICAgIkNoYW5uZWwgbWlzbWF0Y2ggb24gY2hhbm5lbD0lcyglcykgZmllbGQ9JXMgZXhwZWN0ZWQ9MHglLTguOEx4IGFjdHVhbD0weCUtOC44THggQCVzOiVkIiwgXAorCQkgICAgICAgY2hOYW1lLCBHVUlEX2Zvcm1hdDIoJmNoVHlwZSwgczEpLCBmaWVsZCwJXAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylleHBlY3RlZCwJCQlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWFjdHVhbCwJCQlcCisJCSAgICAgICBmaWwsIGxpbik7CQkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwgRXZlbnRJZCwgU2V2ZXJpdHksIFN1YnN5c3RlbU1hc2ssIHBGdW5jdGlvbk5hbWUsIFwKKwkJICAgICAgTGluZU51bWJlciwgU3RyLCBhcmdzLi4uKQkJCQlcCisJc3lzbG9nKExPR19VU0VSIHwgTE9HX0lORk8sIFN0ciwgIyMgYXJncykKKyNlbmRpZgorCisjZGVmaW5lIFZvbGF0aWxlQmFycmllcigpIE1FTU9SWUJBUlJJRVIKKworI2VuZGlmCisjaW5jbHVkZSAiZ3VpZHV0aWxzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvZ3Vlc3RsaW51eGRlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvZ3Vlc3RsaW51eGRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkZTg0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9ndWVzdGxpbnV4ZGVidWcuaApAQCAtMCwwICsxLDE4MiBAQAorLyogQ29weXJpZ2h0IMKpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0dVRVNUTElOVVhERUJVR19IX18KKyNkZWZpbmUgX19HVUVTVExJTlVYREVCVUdfSF9fCisKKy8qCisqIFRoaXMgZmlsZSBjb250YWlucyBzdXBwb3J0aW5nIGludGVyZmFjZSBmb3IgInZtY2FsbGludGVyZmFjZS5oIiwgcGFydGljdWFybHkKKyogcmVnYXJkaW5nIGFkZGluZyBhZGRpdGlvbmFsIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb25hbGl0eSB0byBsaW51eAorKiBJU1NVRV9JT19WTUNBTExfUE9TVENPREVfU0VWRVJJVFkgKi8KKworCisvKioqKioqKiBJTkZPIE9OIElTU1VFX1BPU1RDT0RFX0xJTlVYKCkgQkVMT1cgKioqKioqKi8KKyNpbmNsdWRlICJ2bWNhbGxpbnRlcmZhY2UuaCIKK3R5cGVkZWYgZW51bSB7CQkvKiBQT1NUQ09ERSBkcml2ZXIgaWRlbnRpZmllciB0dXBsZXMgKi8KKwkvKiB2aXNvcmNoaXBzZXQgZHJpdmVyIGZpbGVzICovCisJVklTT1JfQ0hJUFNFVF9QQyA9IDB4QTAsCisJVklTT1JfQ0hJUFNFVF9QQ19jb250cm9sdm1fYyA9IDB4QTEsCisJVklTT1JfQ0hJUFNFVF9QQ19jb250cm9sdm1fY20yID0gMHhBMiwKKwlWSVNPUl9DSElQU0VUX1BDX2NvbnRyb2x2bV9kaXJlY3RfYyA9IDB4QTMsCisJVklTT1JfQ0hJUFNFVF9QQ19maWxlX2MgPSAweEE0LAorCVZJU09SX0NISVBTRVRfUENfcGFyc2VyX2MgPSAweEE1LAorCVZJU09SX0NISVBTRVRfUENfdGVzdGluZ19jID0gMHhBNiwKKwlWSVNPUl9DSElQU0VUX1BDX3Zpc29yY2hpcHNldF9tYWluX2MgPSAweEE3LAorCVZJU09SX0NISVBTRVRfUENfdmlzb3Jzd2l0Y2hidXNfYyA9IDB4QTgsCisJLyogdmlzb3JidXMgZHJpdmVyIGZpbGVzICovCisJVklTT1JfQlVTX1BDID0gMHhCMCwKKwlWSVNPUl9CVVNfUENfYnVzaW5zdF9hdHRyX2MgPSAweEIxLAorCVZJU09SX0JVU19QQ19jaGFubmVsX2F0dHJfYyA9IDB4QjIsCisJVklTT1JfQlVTX1BDX2Rldm1ham9ybWlub3JfYXR0cl9jID0gMHhCMywKKwlWSVNPUl9CVVNfUENfdmlzb3JidXNfbWFpbl9jID0gMHhCNCwKKwkvKiB2aXNvcmNsaWVudGJ1cyBkcml2ZXIgZmlsZXMgKi8KKwlWSVNPUl9DTElFTlRfQlVTX1BDID0gMHhDMCwKKwlWSVNPUl9DTElFTlRfQlVTX1BDX3Zpc29yY2xpZW50YnVzX21haW5fYyA9IDB4QzEsCisJLyogdmlydCBoYmEgZHJpdmVyIGZpbGVzICovCisJVklSVF9IQkFfUEMgPSAweEMyLAorCVZJUlRfSEJBX1BDX3ZpcnRoYmFfYyA9IDB4QzMsCisJLyogdmlydHBjaSBkcml2ZXIgZmlsZXMgKi8KKwlWSVJUX1BDSV9QQyA9IDB4QzQsCisJVklSVF9QQ0lfUENfdmlydHBjaV9jID0gMHhDNSwKKwkvKiB2aXJ0bmljIGRyaXZlciBmaWxlcyAqLworCVZJUlRfTklDX1BDID0gMHhDNiwKKwlWSVJUX05JQ19QX3ZpcnRuaWNfYyA9IDB4QzcsCisJLyogdWlzbGliIGRyaXZlciBmaWxlcyAqLworCVVJU0xJQl9QQyA9IDB4RDAsCisJVUlTTElCX1BDX3Vpc2xpYl9jID0gMHhEMSwKKwlVSVNMSUJfUENfdWlzcXVldWVfYyA9IDB4RDIsCisJVUlTTElCX1BDX3Vpc3RocmVhZF9jID0gMHhEMywKKwlVSVNMSUJfUENfdWlzdXRpbHNfYyA9IDB4RDQsCit9IERSSVZFUl9QQzsKKwordHlwZWRlZiBlbnVtIHsJCQkvKiBQT1NUQ09ERSBldmVudCBpZGVudGlmaWVyIHR1cGxlcyAqLworCUFUVEFDSF9QT1JUX0VOVFJZX1BDID0gMHgwMDEsCisJQVRUQUNIX1BPUlRfRkFJTFVSRV9QQyA9IDB4MDAyLAorCUFUVEFDSF9QT1JUX1NVQ0NFU1NfUEMgPSAweDAwMywKKwlCVVNfRkFJTFVSRV9QQyA9IDB4MDA0LAorCUJVU19DUkVBVEVfRU5UUllfUEMgPSAweDAwNSwKKwlCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMgPSAweDAwNiwKKwlCVVNfQ1JFQVRFX0VYSVRfUEMgPSAweDAwNywKKwlCVVNfQ09ORklHVVJFX0VOVFJZX1BDID0gMHgwMDgsCisJQlVTX0NPTkZJR1VSRV9GQUlMVVJFX1BDID0gMHgwMDksCisJQlVTX0NPTkZJR1VSRV9FWElUX1BDID0gMHgwMEEsCisJQ0hJUFNFVF9JTklUX0VOVFJZX1BDID0gMHgwMEIsCisJQ0hJUFNFVF9JTklUX1NVQ0NFU1NfUEMgPSAweDAwQywKKwlDSElQU0VUX0lOSVRfRkFJTFVSRV9QQyA9IDB4MDBELAorCUNISVBTRVRfSU5JVF9FWElUX1BDID0gMHgwMEUsCisJQ1JFQVRFX1dPUktRVUVVRV9QQyA9IDB4MDBGLAorCUNSRUFURV9XT1JLUVVFVUVfRkFJTEVEX1BDID0gMHgwQTAsCisJQ09OVFJPTFZNX0lOSVRfRkFJTFVSRV9QQyA9IDB4MEExLAorCURFVklDRV9DUkVBVEVfRU5UUllfUEMgPSAweDBBMiwKKwlERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMgPSAweDBBMywKKwlERVZJQ0VfQ1JFQVRFX1NVQ0NFU1NfUEMgPSAweDBBNCwKKwlERVZJQ0VfQ1JFQVRFX0VYSVRfUEMgPSAweDBBNSwKKwlERVZJQ0VfQUREX1BDID0gMHgwQTYsCisJREVWSUNFX1JFR0lTVEVSX0ZBSUxVUkVfUEMgPSAweDBBNywKKwlERVZJQ0VfQ0hBTkdFU1RBVEVfRU5UUllfUEMgPSAweDBBOCwKKwlERVZJQ0VfQ0hBTkdFU1RBVEVfRkFJTFVSRV9QQyA9IDB4MEE5LAorCURFVklDRV9DSEFOR0VTVEFURV9FWElUX1BDID0gMHgwQUEsCisJRFJJVkVSX0VOVFJZX1BDID0gMHgwQUIsCisJRFJJVkVSX0VYSVRfUEMgPSAweDBBQywKKwlNQUxMT0NfRkFJTFVSRV9QQyA9IDB4MEFELAorCVFVRVVFX0RFTEFZRURfV09SS19QQyA9IDB4MEFFLAorCVVJU0xJQl9USFJFQURfRkFJTFVSRV9QQyA9IDB4MEI3LAorCVZCVVNfQ0hBTk5FTF9FTlRSWV9QQyA9IDB4MEI4LAorCVZCVVNfQ0hBTk5FTF9GQUlMVVJFX1BDID0gMHgwQjksCisJVkJVU19DSEFOTkVMX0VYSVRfUEMgPSAweDBCQSwKKwlWSEJBX0NSRUFURV9FTlRSWV9QQyA9IDB4MEJCLAorCVZIQkFfQ1JFQVRFX0ZBSUxVUkVfUEMgPSAweDBCQywKKwlWSEJBX0NSRUFURV9FWElUX1BDID0gMHgwQkQsCisJVkhCQV9DUkVBVEVfU1VDQ0VTU19QQyA9IDB4MEJFLAorCVZIQkFfQ09NTUFORF9IQU5ETEVSX1BDID0gMHgwQkYsCisJVkhCQV9QUk9CRV9FTlRSWV9QQyA9IDB4MEMwLAorCVZIQkFfUFJPQkVfRkFJTFVSRV9QQyA9IDB4MEMxLAorCVZIQkFfUFJPQkVfRVhJVF9QQyA9IDB4MEMyLAorCVZOSUNfQ1JFQVRFX0VOVFJZX1BDID0gMHgwQzMsCisJVk5JQ19DUkVBVEVfRkFJTFVSRV9QQyA9IDB4MEM0LAorCVZOSUNfQ1JFQVRFX1NVQ0NFU1NfUEMgPSAweDBDNSwKKwlWTklDX1BST0JFX0VOVFJZX1BDID0gMHgwQzYsCisJVk5JQ19QUk9CRV9GQUlMVVJFX1BDID0gMHgwQzcsCisJVk5JQ19QUk9CRV9FWElUX1BDID0gMHgwQzgsCisJVlBDSV9DUkVBVEVfRU5UUllfUEMgPSAweDBDOSwKKwlWUENJX0NSRUFURV9GQUlMVVJFX1BDID0gMHgwQ0EsCisJVlBDSV9DUkVBVEVfRVhJVF9QQyA9IDB4MENCLAorCVZQQ0lfUFJPQkVfRU5UUllfUEMgPSAweDBDQywKKwlWUENJX1BST0JFX0ZBSUxVUkVfUEMgPSAweDBDRCwKKwlWUENJX1BST0JFX0VYSVRfUEMgPSAweDBDRSwKKwlDUkFTSF9ERVZfRU5UUllfUEMgPSAweDBDRiwKKwlDUkFTSF9ERVZfRVhJVF9QQyA9IDB4MEQwLAorCUNSQVNIX0RFVl9IQUREUl9OVUxMID0gMHgwRDEsCisJQ1JBU0hfREVWX0NPTlRST0xWTV9OVUxMID0gMHgwRDIsCisJQ1JBU0hfREVWX1JEX0JVU19GQUlVTFJFX1BDID0gMHgwRDMsCisJQ1JBU0hfREVWX1JEX0RFVl9GQUlVTFJFX1BDID0gMHgwRDQsCisJQ1JBU0hfREVWX0JVU19OVUxMX0ZBSUxVUkVfUEMgPSAweDBENSwKKwlDUkFTSF9ERVZfREVWX05VTExfRkFJTFVSRV9QQyA9IDB4MEQ2LAorCUNSQVNIX0RFVl9DVFJMX1JEX0ZBSUxVUkVfUEMgPSAweDBENywKKwlDUkFTSF9ERVZfQ09VTlRfRkFJTFVSRV9QQyA9IDB4MEQ4LAorCVNBVkVfTVNHX0JVU19GQUlMVVJFX1BDID0gMHgwRDksCisJU0FWRV9NU0dfREVWX0ZBSUxVUkVfUEMgPSAweDBEQSwKKwlDQUxMSE9NRV9JTklUX0ZBSUxVUkVfUEMgPSAweDBEQgorfSBFVkVOVF9QQzsKKworI2lmZGVmIF9fR05VQ19fCisKKyNkZWZpbmUgUE9TVENPREVfU0VWRVJJVFlfRVJSIERJQUdfU0VWRVJJVFlfRVJSCisjZGVmaW5lIFBPU1RDT0RFX1NFVkVSSVRZX1dBUk5JTkcgRElBR19TRVZFUklUWV9XQVJOSU5HCisjZGVmaW5lIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8gRElBR19TRVZFUklUWV9QUklOVAkvKiBUT0RPLT4gSW5mbyBjdXJyZW50bHkKKwkJCQkJCQkgKiBkb2VzbnQgc2hvdywgc28gd2UKKwkJCQkJCQkgKiBzZXQgaW5mbz13YXJuaW5nICovCisvKiBleGFtcGxlIGNhbGwgb2YgUE9TVENPREVfTElOVVhfMihWSVNPUl9DSElQU0VUX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworICogUGxlYXNlIGFsc28gbm90ZSB0aGF0IHRoZSByZXN1bHRpbmcgcG9zdGNvZGUgaXMgaW4gaGV4LCBzbyBpZiB5b3UgYXJlCisgKiBzZWFyY2hpbmcgZm9yIHRoZSBfX0xJTkVfXyBudW1iZXIsIGNvbnZlcnQgaXQgZmlyc3QgdG8gZGVjaW1hbC4gIFRoZSBsaW5lCisgKiBudW1iZXIgY29tYmluZWQgd2l0aCBkcml2ZXIgYW5kIHR5cGUgb2YgY2FsbCwgd2lsbCBhbGxvdyB5b3UgdG8gdHJhY2sgZG93bgorICogZXhhY3RseSB3aGF0IGxpbmUgYW4gZXJyb3Igb2NjdXJlZCBvbiwgb3Igd2hlcmUgdGhlIGxhc3QgZHJpdmVyCisgKiBlbnRlcmVkL2V4aXRlZCBmcm9tLgorICovCisKKy8qIEJBU0UgRlVOQ1RJT05TICovCisjZGVmaW5lIFBPU1RDT0RFX0xJTlVYX0EoRFJJVkVSX1BDLCBFVkVOVF9QQywgcGMzMmJpdCwgc2V2ZXJpdHkpCVwKK2RvIHsJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBsb25nIHBvc3RfY29kZV90ZW1wOwkJCQlcCisJcG9zdF9jb2RlX3RlbXAgPSAoKChVNjQpRFJJVkVSX1BDKSA8PCA1NikgfCAoKChVNjQpRVZFTlRfUEMpIDw8IDQ0KSB8IFwKKwkJKCgoKFU2NClfX0xJTkVfXykgJiAweEZGRikgPDwgMzIpIHwJCQlcCisJCSgoKFU2NClwYzMyYml0KSAmIDB4RkZGRkZGRkYpOwkJCQlcCisJSVNTVUVfSU9fVk1DQUxMX1BPU1RDT0RFX1NFVkVSSVRZKHBvc3RfY29kZV90ZW1wLCBzZXZlcml0eSk7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUE9TVENPREVfTElOVVhfQihEUklWRVJfUEMsIEVWRU5UX1BDLCBwYzE2Yml0MSwgcGMxNmJpdDIsIHNldmVyaXR5KSBcCitkbyB7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgbG9uZyBwb3N0X2NvZGVfdGVtcDsJCQkJXAorCXBvc3RfY29kZV90ZW1wID0gKCgoVTY0KURSSVZFUl9QQykgPDwgNTYpIHwgKCgoVTY0KUVWRU5UX1BDKSA8PCA0NCkgfCBcCisJCSgoKChVNjQpX19MSU5FX18pICYgMHhGRkYpIDw8IDMyKSB8CQkJXAorCQkoKCgoVTY0KXBjMTZiaXQxKSAmIDB4RkZGRikgPDwgMTYpIHwJCQlcCisJCSgoKFU2NClwYzE2Yml0MikgJiAweEZGRkYpOwkJCQlcCisJSVNTVUVfSU9fVk1DQUxMX1BPU1RDT0RFX1NFVkVSSVRZKHBvc3RfY29kZV90ZW1wLCBzZXZlcml0eSk7CVwKK30gd2hpbGUgKDApCisKKy8qIE1PU1QgQ09NTU9OICovCisjZGVmaW5lIFBPU1RDT0RFX0xJTlVYXzIoRVZFTlRfUEMsIHNldmVyaXR5KQkJCQlcCisJUE9TVENPREVfTElOVVhfQShDVVJSRU5UX0ZJTEVfUEMsIEVWRU5UX1BDLCAweDAwMDAsIHNldmVyaXR5KTsKKworI2RlZmluZSBQT1NUQ09ERV9MSU5VWF8zKEVWRU5UX1BDLCBwYzMyYml0LCBzZXZlcml0eSkJCQlcCisJUE9TVENPREVfTElOVVhfQShDVVJSRU5UX0ZJTEVfUEMsIEVWRU5UX1BDLCBwYzMyYml0LCBzZXZlcml0eSk7CisKKworI2RlZmluZSBQT1NUQ09ERV9MSU5VWF80KEVWRU5UX1BDLCBwYzE2Yml0MSwgcGMxNmJpdDIsIHNldmVyaXR5KQlcCisJUE9TVENPREVfTElOVVhfQihDVVJSRU5UX0ZJTEVfUEMsIEVWRU5UX1BDLCBwYzE2Yml0MSwJCVwKKwkJCSBwYzE2Yml0Miwgc2V2ZXJpdHkpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2d1aWR1dGlscy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2d1aWR1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1Y2FmOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvZ3VpZHV0aWxzLmgKQEAgLTAsMCArMSwyMDMgQEAKKy8qIENvcHlyaWdodCDCqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qIGd1aWR1dGlscy5oCisgKgorICogVGhlc2UgYXJlIEdVSUQgbWFuaXB1bGF0aW9uIGlubGluZXMgdGhhdCBjYW4gYmUgdXNlZCBmcm9tIGVpdGhlcgorICoga2VybmVsLW1vZGUgb3IgdXNlci1tb2RlLgorICoKKyAqLworI2lmbmRlZiBfX0dVSURVVElMU19IX18KKyNkZWZpbmUgX19HVUlEVVRJTFNfSF9fCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNkZWZpbmUgR1VJRF9TVFJUT1VMIGtzdHJ0b3VsCisjZWxzZQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBHVUlEX1NUUlRPVUwgc3RydG91bAorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgY2hhciAqCitHVUlEX2Zvcm1hdDEoY29uc3QgR1VJRCAqZ3VpZCwgY2hhciAqcykKK3sKKwlzcHJpbnRmKHMsICJ7JS04LjhseC0lLTQuNHgtJS00LjR4LSUtMi4yeCUtMi4yeCUtMi4yeCUtMi4yeCUtMi4yeCUtMi4yeCUtMi4yeCUtMi4yeH0iLAorCQkodWxvbmcpIGd1aWQtPmRhdGExLAorCQlndWlkLT5kYXRhMiwKKwkJZ3VpZC0+ZGF0YTMsCisJCWd1aWQtPmRhdGE0WzBdLAorCQlndWlkLT5kYXRhNFsxXSwKKwkJZ3VpZC0+ZGF0YTRbMl0sCisJCWd1aWQtPmRhdGE0WzNdLAorCQlndWlkLT5kYXRhNFs0XSwgZ3VpZC0+ZGF0YTRbNV0sIGd1aWQtPmRhdGE0WzZdLCBndWlkLT5kYXRhNFs3XSk7CisJcmV0dXJuIHM7Cit9CisKKy8qKiBGb3JtYXQgYSBHVUlEIGluIE1pY3Jvc29mdCdzICd3aGF0IGluIHRoZSB3b3JsZCB3ZXJlIHRoZXkgdGhpbmtpbmcnCisgKiAgZm9ybWF0LgorICovCitzdGF0aWMgaW5saW5lIGNoYXIgKgorR1VJRF9mb3JtYXQyKGNvbnN0IEdVSUQgKmd1aWQsIGNoYXIgKnMpCit7CisJc3ByaW50ZihzLCAieyUtOC44bHgtJS00LjR4LSUtNC40eC0lLTIuMnglLTIuMngtJS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4fSIsCisJCSh1bG9uZykgZ3VpZC0+ZGF0YTEsCisJCWd1aWQtPmRhdGEyLAorCQlndWlkLT5kYXRhMywKKwkJZ3VpZC0+ZGF0YTRbMF0sCisJCWd1aWQtPmRhdGE0WzFdLAorCQlndWlkLT5kYXRhNFsyXSwKKwkJZ3VpZC0+ZGF0YTRbM10sCisJCWd1aWQtPmRhdGE0WzRdLCBndWlkLT5kYXRhNFs1XSwgZ3VpZC0+ZGF0YTRbNl0sIGd1aWQtPmRhdGE0WzddKTsKKwlyZXR1cm4gczsKK30KKworLyoqCisgKiBMaWtlIEdVSURfZm9ybWF0MiBidXQgd2l0aG91dCB0aGUgY3VybHkgYnJhY2VzIGFuZCB0aGUKKyAqIGhleCBkaWdpdHMgaW4gdXBwZXIgY2FzZQorICovCitzdGF0aWMgaW5saW5lIGNoYXIgKgorR1VJRF9mb3JtYXQzKGNvbnN0IEdVSUQgKmd1aWQsIGNoYXIgKnMpCit7CisJc3ByaW50ZihzLCAiJS04LjhsWC0lLTQuNFgtJS00LjRYLSUtMi4yWCUtMi4yWC0lLTIuMlglLTIuMlglLTIuMlglLTIuMlglLTIuMlglLTIuMlgiLAorCQkodWxvbmcpIGd1aWQtPmRhdGExLAorCQlndWlkLT5kYXRhMiwKKwkJZ3VpZC0+ZGF0YTMsCisJCWd1aWQtPmRhdGE0WzBdLAorCQlndWlkLT5kYXRhNFsxXSwKKwkJZ3VpZC0+ZGF0YTRbMl0sCisJCWd1aWQtPmRhdGE0WzNdLAorCQlndWlkLT5kYXRhNFs0XSwgZ3VpZC0+ZGF0YTRbNV0sIGd1aWQtPmRhdGE0WzZdLCBndWlkLT5kYXRhNFs3XSk7CisJcmV0dXJuIHM7Cit9CisKKy8qKiBQYXJzZSBhIGd1aWQgc3RyaW5nIGluIGFueSBvZiB0aGVzZSBmb3JtczoKKyAqICAgICAgezExMTExMTExLTIyMjItMzMzMy00NDU1LTY2Nzc4ODk5YWFiYn0KKyAqICAgICAgezExMTExMTExLTIyMjItMzMzMy00NDU1NjY3Nzg4OTlhYWJifQorICogICAgICAxMTExMTExMS0yMjIyLTMzMzMtNDQ1NS02Njc3ODg5OWFhYmIKKyAqICAgICAgMTExMTExMTEtMjIyMi0zMzMzLTQ0NTU2Njc3ODg5OWFhYmIKKyAqLworc3RhdGljIGlubGluZSBHVUlECitHVUlEX3NjYW4oVTggKnApCit7CisJR1VJRCBndWlkID0gR1VJRDA7CisJVTggeFszM107CisJaW50IGNvdW50ID0gMDsKKwlpbnQgYywgaSA9IDA7CisJVTggY2RhdGExWzldOworCVU4IGNkYXRhMls1XTsKKwlVOCBjZGF0YTNbNV07CisJVTggY2RhdGE0WzNdOworCWludCBkYXNoY291bnQgPSAwOworCWludCBicmFjZSA9IDA7CisJdW5zaWduZWQgbG9uZyB1bGRhdGE7CisKKwlpZiAoIXApCisJCXJldHVybiBndWlkOworCWlmICgqcCA9PSAneycpIHsKKwkJcCsrOworCQlicmFjZSA9IDE7CisJfQorCXdoaWxlIChjb3VudCA8IDMyKSB7CisJCWlmICgqcCA9PSAnfScpCisJCQlyZXR1cm4gZ3VpZDsKKwkJaWYgKCpwID09ICdcMCcpCisJCQlyZXR1cm4gZ3VpZDsKKwkJYyA9IHRvdXBwZXIoKnApOworCQlwKys7CisJCWlmIChjID09ICctJykgeworCQkJc3dpdGNoIChkYXNoY291bnQpIHsKKwkJCWNhc2UgMDoKKwkJCQlpZiAoaSAhPSA4KQorCQkJCQlyZXR1cm4gZ3VpZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlpZiAoaSAhPSA0KQorCQkJCQlyZXR1cm4gZ3VpZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlpZiAoaSAhPSA0KQorCQkJCQlyZXR1cm4gZ3VpZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlpZiAoaSAhPSA0KQorCQkJCQlyZXR1cm4gZ3VpZDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIGd1aWQ7CisJCQl9CisJCQlkYXNoY291bnQrKzsKKwkJCWkgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKChjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKSkKKwkJCWkrKzsKKwkJZWxzZQorCQkJcmV0dXJuIGd1aWQ7CisJCXhbY291bnQrK10gPSBjOworCX0KKwl4W2NvdW50XSA9ICdcMCc7CisJaWYgKGJyYWNlKSB7CisJCWlmICgqcCA9PSAnfScpCisJCQlwKys7CisJCWVsc2UKKwkJCXJldHVybiBndWlkOworCX0KKwlpZiAoZGFzaGNvdW50ID09IDMgfHwgZGFzaGNvdW50ID09IDQpCisJCTsKKwllbHNlCisJCXJldHVybiBndWlkOworCW1lbXNldChjZGF0YTEsIDAsIHNpemVvZihjZGF0YTEpKTsKKwltZW1zZXQoY2RhdGEyLCAwLCBzaXplb2YoY2RhdGEyKSk7CisJbWVtc2V0KGNkYXRhMywgMCwgc2l6ZW9mKGNkYXRhMykpOworCW1lbXNldChjZGF0YTQsIDAsIHNpemVvZihjZGF0YTQpKTsKKwltZW1jcHkoY2RhdGExLCB4ICsgMCwgOCk7CisJbWVtY3B5KGNkYXRhMiwgeCArIDgsIDQpOworCW1lbWNweShjZGF0YTMsIHggKyAxMiwgNCk7CisKKwlpZiAoR1VJRF9TVFJUT1VMKChjaGFyICopIGNkYXRhMSwgMTYsICZ1bGRhdGEpID09IDApCisJCWd1aWQuZGF0YTEgPSAoVTMyKXVsZGF0YTsKKwlpZiAoR1VJRF9TVFJUT1VMKChjaGFyICopIGNkYXRhMiwgMTYsICZ1bGRhdGEpID09IDApCisJCWd1aWQuZGF0YTIgPSAoVTE2KXVsZGF0YTsKKwlpZiAoR1VJRF9TVFJUT1VMKChjaGFyICopIGNkYXRhMywgMTYsICZ1bGRhdGEpID09IDApCisJCWd1aWQuZGF0YTMgPSAoVTE2KXVsZGF0YTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJbWVtY3B5KGNkYXRhNCwgeCArIDE2ICsgKGkgKiAyKSwgMik7CisJCWlmIChHVUlEX1NUUlRPVUwoKGNoYXIgKikgY2RhdGE0LCAxNiwgJnVsZGF0YSkgPT0gMCkKKwkJCWd1aWQuZGF0YTRbaV0gPSAoVTgpIHVsZGF0YTsKKwl9CisKKwlyZXR1cm4gZ3VpZDsKK30KKworc3RhdGljIGlubGluZSBjaGFyICoKK0dVSURfc2FuaXRpemUoY2hhciAqaW5wdXRHdWlkU3RyLCBjaGFyICpvdXRwdXRHdWlkU3RyKQoreworCUdVSUQgZzsKKwlHVUlEIGd1aWQwID0gR1VJRDA7CisJKm91dHB1dEd1aWRTdHIgPSAnXDAnOworCWcgPSBHVUlEX3NjYW4oKFU4ICopIGlucHV0R3VpZFN0cik7CisJaWYgKG1lbWNtcCgmZywgJmd1aWQwLCBzaXplb2YoR1VJRCkpID09IDApCisJCXJldHVybiBvdXRwdXRHdWlkU3RyOwkvKiBiYWQgR1VJRCBmb3JtYXQgKi8KKwlyZXR1cm4gR1VJRF9mb3JtYXQxKCZnLCBvdXRwdXRHdWlkU3RyKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvcGVyaW9kaWNfd29yay5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3BlcmlvZGljX3dvcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzcxOTBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3BlcmlvZGljX3dvcmsuaApAQCAtMCwwICsxLDQwIEBACisvKiBwZXJpb2RpY193b3JrLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19QRVJJT0RJQ19XT1JLX0hfXworI2RlZmluZSBfX1BFUklPRElDX1dPUktfSF9fCisKKyNpbmNsdWRlICJ0aW1za21vZC5oIgorCisKKworLyogUEVSSU9ESUNfV09SSyBhbiBvcGFxdWUgc3RydWN0dXJlIHRvIHVzZXJzLgorICogRmllbGRzIGFyZSBkZWNsYXJlZCBvbmx5IGluIHRoZSBpbXBsZW1lbnRhdGlvbiAuYyBmaWxlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgUEVSSU9ESUNfV09SS19UYWcgUEVSSU9ESUNfV09SSzsKKworUEVSSU9ESUNfV09SSyAqdmlzb3JfcGVyaW9kaWNfd29ya19jcmVhdGUodWxvbmcgamlmZnlfaW50ZXJ2YWwsCisJCQkJCSAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZSwKKwkJCQkJICB2b2lkICgqd29ya2Z1bmMpKHZvaWQgKiksCisJCQkJCSAgdm9pZCAqd29ya2Z1bmNhcmcsCisJCQkJCSAgY29uc3QgY2hhciAqZGV2bmFtKTsKK3ZvaWQgICAgICAgICAgICB2aXNvcl9wZXJpb2RpY193b3JrX2Rlc3Ryb3koUEVSSU9ESUNfV09SSyAqcGVyaW9kaWNfd29yayk7CitCT09MICAgICAgICAgICAgdmlzb3JfcGVyaW9kaWNfd29ya19uZXh0cGVyaW9kKFBFUklPRElDX1dPUksgKnBlcmlvZGljX3dvcmspOworQk9PTCAgICAgICAgICAgIHZpc29yX3BlcmlvZGljX3dvcmtfc3RhcnQoUEVSSU9ESUNfV09SSyAqcGVyaW9kaWNfd29yayk7CitCT09MICAgICAgICAgICAgdmlzb3JfcGVyaW9kaWNfd29ya19zdG9wKFBFUklPRElDX1dPUksgKnBlcmlvZGljX3dvcmspOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9wcm9jb2JqZWN0dHJlZS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Byb2NvYmplY3R0cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgxZDExMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9wcm9jb2JqZWN0dHJlZS5oCkBAIC0wLDAgKzEsNDggQEAKKy8qIHByb2NvYmplY3R0cmVlLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qKiBAZmlsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgVGhpcyBkZXNjcmliZXMgdGhlIGludGVyZmFjZXMgbmVjZXNzYXJ5IGZvciBjcmVhdGluZyBhIHRyZWUgb2YgdHlwZXMsCisgKiAgb2JqZWN0cywgYW5kIHByb3BlcnRpZXMgaW4gL3Byb2MuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX19QUk9DT0JKRUNUVFJFRV9IX18KKyNkZWZpbmUgX19QUk9DT0JKRUNUVFJFRV9IX18KKworI2luY2x1ZGUgInVuaWtsb2cuaCIKKyNpbmNsdWRlICJ0aW1za21vZC5oIgorCisvKiBUaGVzZSBhcmUgb3BhcXVlIHN0cnVjdHVyZXMgdG8gdXNlcnMuCisgKiBGaWVsZHMgYXJlIGRlY2xhcmVkIG9ubHkgaW4gdGhlIGltcGxlbWVudGF0aW9uIC5jIGZpbGVzLgorICovCit0eXBlZGVmIHN0cnVjdCBNWVBST0NPQkpFQ1RfVGFnIE1ZUFJPQ09CSkVDVDsKK3R5cGVkZWYgc3RydWN0IE1ZUFJPQ1RZUEVfVGFnICAgTVlQUk9DVFlQRTsKKworTVlQUk9DT0JKRUNUICp2aXNvcl9wcm9jX0NyZWF0ZU9iamVjdChNWVBST0NUWVBFICp0eXBlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgIHZvaWQgKmNvbnRleHQpOwordm9pZCAgICAgICAgICB2aXNvcl9wcm9jX0Rlc3Ryb3lPYmplY3QoTVlQUk9DT0JKRUNUICpvYmopOworTVlQUk9DVFlQRSAgICp2aXNvcl9wcm9jX0NyZWF0ZVR5cGUoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jUm9vdERpciwKKwkJCQkgICAgY29uc3QgY2hhciAqKm5hbWUsCisJCQkJICAgIGNvbnN0IGNoYXIgKipwcm9wZXJ0eU5hbWVzLAorCQkJCSAgICB2b2lkICgqc2hvd19wcm9wZXJ0eSkoc3RydWN0IHNlcV9maWxlICosCisJCQkJCQkJICB2b2lkICosIGludCkpOwordm9pZCAgICAgICAgICB2aXNvcl9wcm9jX0Rlc3Ryb3lUeXBlKE1ZUFJPQ1RZUEUgKnR5cGUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9zcGFyc3RvcC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3NwYXJzdG9wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwM2FjNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9zcGFyc3RvcC5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIHNwYXJzdG9wLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19TUEFSU1RPUF9IX18KKyNkZWZpbmUgX19TUEFSU1RPUF9IX18KKworI2luY2x1ZGUgInRpbXNrbW9kLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisKK3R5cGVkZWYgdm9pZCAoKlNQQVJTVE9QX0NPTVBMRVRFX0ZVTkMpICh2b2lkICpjb250ZXh0LCBpbnQgc3RhdHVzKTsKKworaW50IHNwX3N0b3Aodm9pZCAqY29udGV4dCwgU1BBUlNUT1BfQ09NUExFVEVfRlVOQyBnZXRfY29tcGxldGVfZnVuYyk7Cit2b2lkIHRlc3RfcmVtb3ZlX3N0b3BfZGV2aWNlKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS90aW1za21vZC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3RpbXNrbW9kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkNWFkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS90aW1za21vZC5oCkBAIC0wLDAgKzEsMzI0IEBACisvKiB0aW1za21vZC5oCisgKgorICogQ29weXJpZ2h0IO+/vSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19USU1TS01PRF9IX18KKyNkZWZpbmUgX19USU1TS01PRF9IX18KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisvKiAjZGVmaW5lIEVYUE9SVF9TWU1UQUIgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvYWlvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworLyogI2RlZmluZSBERUJVRyAqLworI2lmbmRlZiBCT09MCisjZGVmaW5lIEJPT0wgICAgaW50CisjZW5kaWYKKyNkZWZpbmUgRkFMU0UgICAwCisjZGVmaW5lIFRSVUUgICAgMQorI2lmICFkZWZpbmVkIFNVQ0NFU1MKKyNkZWZpbmUgU1VDQ0VTUyAwCisjZW5kaWYKKyNkZWZpbmUgRkFJTFVSRSAoLTEpCisjZGVmaW5lIERSSVZFUk5BTUVNQVggNTAKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIE1BWChhLCBiKSAgICAgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQorI2RlZmluZSBTVFJVQ1RTRVFVQUwoeCwgeSkgKG1lbWNtcCgmeCwgJnksIHNpemVvZih4KSkgPT0gMCkKKyNpZm5kZWYgSE9TVEFERFJFU1MKKyNkZWZpbmUgSE9TVEFERFJFU1MgdW5zaWduZWQgbG9uZyBsb25nCisjZW5kaWYKKwordHlwZWRlZiBsb25nIFZNTUlPOyAgLyoqPCBWaXJ0dWFsIE1NSU8gYWRkcmVzcyAocmV0dXJuZWQgZnJvbSBpb3JlbWFwKSwgd2hpY2gKKyAgICAqICAgaXMgYSB2aXJ0dWFsIGFkZHJlc3MgcG9pbnRlciB0byBhIG1lbW9yeS1tYXBwZWQgcmVnaW9uLgorICAgICogICBUaGVzZSBhcmUgZGVjbGFyZWQgYXMgImxvbmciIGluc3RlYWQgb2YgdTMyKiB0byBmb3JjZSB5b3UgdG8KKyAgICAqICAgdXNlIHJlYWRiKCkvd3JpdGViKCkvbWVtY3B5X2Zyb21pbygpL2V0YyB0byBhY2Nlc3MgdGhlbS4KKyAgICAqICAgKE9uIHg4NiB3ZSBjb3VsZCBwcm9iYWJseSBnZXQgYXdheSB3aXRoIHRyZWF0aW5nIHRoZW0gYXMKKyAgICAqICAgcG9pbnRlcnMuKQorICAgICovCit0eXBlZGVmIGxvbmcgVk1NSU84OyAvKio8ICNWTU1JTyBwb2ludGluZyB0byAgOC1iaXQgZGF0YSAqLwordHlwZWRlZiBsb25nIFZNTUlPMTY7LyoqPCAjVk1NSU8gcG9pbnRpbmcgdG8gMTYtYml0IGRhdGEgKi8KK3R5cGVkZWYgbG9uZyBWTU1JTzMyOy8qKjwgI1ZNTUlPIHBvaW50aW5nIHRvIDMyLWJpdCBkYXRhICovCisKKyNkZWZpbmUgTE9DS1NFTShzZW0pICAgICAgICAgICAgICAgICAgIGRvd25faW50ZXJydXB0aWJsZShzZW0pCisjZGVmaW5lIExPQ0tTRU1fVU5JTlRFUlJVUFRJQkxFKHNlbSkgICBkb3duKHNlbSkKKyNkZWZpbmUgVU5MT0NLU0VNKHNlbSkgICAgICAgICAgICAgICAgIHVwKHNlbSkKKworLyoqIGxvY2sgcmVhZC93cml0ZSBzZW1hcGhvcmUgZm9yIHJlYWRpbmcuCisgICAgTm90ZSB0aGF0IGFsbCByZWFkL3dyaXRlIHNlbWFwaG9yZXMgYXJlIG9mIHRoZSAidW5pbnRlcnJ1cHRpYmxlIiB2YXJpZXR5LgorICAgIEBwYXJhbSBzZW0gKHJ3X3NlbWFwaG9yZSAqKSBwb2ludHMgdG8gc2VtYXBob3JlIHRvIGxvY2sKKyAqLworI2RlZmluZSBMT0NLUkVBRFNFTShzZW0pICAgICAgICAgICAgICAgZG93bl9yZWFkKHNlbSkKKworLyoqIHVubG9jayByZWFkL3dyaXRlIHNlbWFwaG9yZSBmb3IgcmVhZGluZy4KKyAgICBOb3RlIHRoYXQgYWxsIHJlYWQvd3JpdGUgc2VtYXBob3JlcyBhcmUgb2YgdGhlICJ1bmludGVycnVwdGlibGUiIHZhcmlldHkuCisgICAgQHBhcmFtIHNlbSAocndfc2VtYXBob3JlICopIHBvaW50cyB0byBzZW1hcGhvcmUgdG8gdW5sb2NrCisgKi8KKyNkZWZpbmUgVU5MT0NLUkVBRFNFTShzZW0pICAgICAgICAgICAgIHVwX3JlYWQoc2VtKQorCisvKiogbG9jayByZWFkL3dyaXRlIHNlbWFwaG9yZSBmb3Igd3JpdGluZy4KKyAgICBOb3RlIHRoYXQgYWxsIHJlYWQvd3JpdGUgc2VtYXBob3JlcyBhcmUgb2YgdGhlICJ1bmludGVycnVwdGlibGUiIHZhcmlldHkuCisgICAgQHBhcmFtIHNlbSAocndfc2VtYXBob3JlICopIHBvaW50cyB0byBzZW1hcGhvcmUgdG8gbG9jaworICovCisjZGVmaW5lIExPQ0tXUklURVNFTShzZW0pICAgICAgICAgICAgICBkb3duX3dyaXRlKHNlbSkKKworLyoqIHVubG9jayByZWFkL3dyaXRlIHNlbWFwaG9yZSBmb3Igd3JpdGluZy4KKyAgICBOb3RlIHRoYXQgYWxsIHJlYWQvd3JpdGUgc2VtYXBob3JlcyBhcmUgb2YgdGhlICJ1bmludGVycnVwdGlibGUiIHZhcmlldHkuCisgICAgQHBhcmFtIHNlbSAocndfc2VtYXBob3JlICopIHBvaW50cyB0byBzZW1hcGhvcmUgdG8gdW5sb2NrCisgKi8KKyNkZWZpbmUgVU5MT0NLV1JJVEVTRU0oc2VtKSAgICAgICAgICAgIHVwX3dyaXRlKHNlbSkKKworI2lmZGVmIEVOQUJMRV9SRVRVUk5fVFJBQ0UKKyNkZWZpbmUgUkVUVFJBQ0UoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkbyB7CQkJCQkJICAgICAgIFwKKwkJaWYgKDEpIHsJCQkJICAgICAgIFwKKwkJCUlORk9EUlYoIlJFVCAweCVseCBpbiAlcyIsCSAgICAgICBcCisJCQkJKHVsb25nKSh4KSwgX19mdW5jX18pOyAgICAgXAorCQl9CQkJCQkgICBcCisJfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIFJFVFRSQUNFKHgpCisjZW5kaWYKKworLyoqIFRyeSB0byBldmF1bGF0ZSB0aGUgcHJvdmlkZWQgZXhwcmVzc2lvbiwgYW5kIGRvIGEgUkVUSU5UKHgpIGlmZgorICogIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byA8IDAuCisgKiAgQHBhcmFtIHggdGhlIGV4cHJlc3Npb24gdG8gdHJ5CisgKi8KKyNkZWZpbmUgQVNTRVJUKGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkbyB7IGlmICghKGNvbmQpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJSFVIRFJWKCJBU1NFUlQgZmFpbGVkIC0gJXMiLAkgICAgICAgXAorCQkJICAgICAgIF9fc3RyaW5naWZ5KGNvbmQpKTsJICAgICAgIFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIHNpemVvZm1lbWJlcihUWVBFLCBNRU1CRVIpIChzaXplb2YoKChUWVBFICopMCktPk1FTUJFUikpCisvKiogIkNvdmVyZWQgcXVvdGllbnQiIGZ1bmN0aW9uICovCisjZGVmaW5lIENPVlEodiwgZCkgICgoKHYpICsgKGQpIC0gMSkgLyAoZCkpCisjZGVmaW5lIFNXQVBQT0lOVEVSUyhwMSwgcDIpCQkJCVwKKwlkbyB7CQkJCQkJXAorCQl2b2lkICpTV0FQUE9JTlRFUlNfVEVNUCA9ICh2b2lkICopcDE7CVwKKwkJKHZvaWQgKikocDEpID0gKHZvaWQgKikocDIpOyAgICAgICAgICAgIFwKKwkJKHZvaWQgKikocDIpID0gU1dBUFBPSU5URVJTX1RFTVA7CVwKKwl9IHdoaWxlICgwKQorCisvKioKKyAqICBAYWRkdG9ncm91cCBkcml2ZXJsb2dnaW5nCisgKiAgQHsKKyAqLworCisjZGVmaW5lIFBSSU5US0RSVihmbXQsIGFyZ3MuLi4pIExPR0lORihmbXQsICMjIGFyZ3MpCisjZGVmaW5lIFRCRERSVihmbXQsIGFyZ3MuLi4pICAgIExPR0VSUihmbXQsICMjIGFyZ3MpCisjZGVmaW5lIEhVSERSVihmbXQsIGFyZ3MuLi4pICAgIExPR0VSUihmbXQsICMjIGFyZ3MpCisjZGVmaW5lIEVSUkRSVihmbXQsIGFyZ3MuLi4pICAgIExPR0VSUihmbXQsICMjIGFyZ3MpCisjZGVmaW5lIFdBUk5EUlYoZm10LCBhcmdzLi4uKSAgIExPR1dSTihmbXQsICMjIGFyZ3MpCisjZGVmaW5lIFNFQ1VSRURSVihmbXQsIGFyZ3MuLi4pIExPR1dSTihmbXQsICMjIGFyZ3MpCisjZGVmaW5lIElORk9EUlYoZm10LCBhcmdzLi4uKSAgIExPR0lORihmbXQsICMjIGFyZ3MpCisjZGVmaW5lIERFQlVHRFJWKGZtdCwgYXJncy4uLikgIERCR0lORihmbXQsICMjIGFyZ3MpCisKKyNkZWZpbmUgUFJJTlRLREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgIExPR0lORkRFVihkZXZuYW1lLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIFRCRERFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pICAgICBMT0dFUlJERVYoZGV2bmFtZSwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBIVUhERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSAgICAgTE9HRVJSREVWKGRldm5hbWUsIGZtdCwgIyMgYXJncykKKyNkZWZpbmUgRVJSREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgICAgIExPR0VSUkRFVihkZXZuYW1lLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIEVSUkRFVlgoZGV2bm8sIGZtdCwgYXJncy4uLikJICBMT0dFUlJERVZYKGRldm5vLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIFdBUk5ERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSAgICBMT0dXUk5ERVYoZGV2bmFtZSwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBTRUNVUkVERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSAgTE9HV1JOREVWKGRldm5hbWUsIGZtdCwgIyMgYXJncykKKyNkZWZpbmUgSU5GT0RFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pICAgIExPR0lORkRFVihkZXZuYW1lLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIElORk9ERVZYKGRldm5vLCBmbXQsIGFyZ3MuLi4pICAgICBMT0dJTkZERVZYKGRldm5vLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIERFQlVHREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgICBEQkdJTkZERVYoZGV2bmFtZSwgZm10LCAjIyBhcmdzKQorCisKKy8qIEB9ICovCisKKy8qKiBWZXJpZmllcyB0aGUgY29uc2lzdGVuY3kgb2YgeW91ciBQUklWQVRFREVWSUNFREFUQSBzdHJ1Y3R1cmUgdXNpbmcKKyAqICBjb252ZW50aW9uYWwgInNpZ25hdHVyZSIgZmllbGRzOgorICogIDxwPgorICogIC0gc2lnMSBzaG91bGQgY29udGFpbiB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCisgKiAgLSBzaWcyIHNob3VsZCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3R1cmUKKyAqLworI2RlZmluZSBERExPT0tTVkFMSUQoZGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkoKGRkICE9IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJglcCisJCSAoKGRkKS0+c2lnMSA9PSBzaXplb2YoUFJJVkFURURFVklDRURBVEEpKSAmJglcCisJCSAoKGRkKS0+c2lnMiA9PSBkZCkpCisKKy8qKiBWZXJpZmllcyB0aGUgY29uc2lzdGVuY3kgb2YgeW91ciBQUklWQVRFRklMRURBVEEgc3RydWN0dXJlIHVzaW5nCisgKiAgY29udmVudGlvbmFsICJzaWduYXR1cmUiIGZpZWxkczoKKyAqICA8cD4KKyAqICAtIHNpZzEgc2hvdWxkIGNvbnRhaW4gdGhlIHNpemUgb2YgdGhlIHN0cnVjdHVyZQorICogIC0gc2lnMiBzaG91bGQgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RydWN0dXJlCisgKi8KKyNkZWZpbmUgRkRMT09LU1ZBTElEKGZkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKChmZCAhPSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICAgICBcCisJICgoZmQpLT5zaWcxID09IHNpemVvZihQUklWQVRFRklMRURBVEEpKSAmJiAgICBcCisJICgoZmQpLT5zaWcyID09IGZkKSkKKworLyoqIExvY2tzIGRkLT5sb2NrRGV2IGlmIHlvdSBoYXZuJ3QgYWxyZWFkeSBsb2NrZWQgaXQgKi8KKyNkZWZpbmUgTE9DS0RFVihkZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKCFsb2NrZWREZXYpIHsJCQkJICAgICAgIFwKKwkJCXNwaW5fbG9jaygmZGQtPmxvY2tEZXYpOwkJICAgICAgIFwKKwkJCWxvY2tlZERldiA9IFRSVUU7CQkJICAgICAgIFwKKwkJfQkJCQkJCSAgICAgICBcCisJfQorCisvKiogVW5sb2NrcyBkZC0+bG9ja0RldiBpZiB5b3UgcHJldmlvdXNseSBsb2NrZWQgaXQgKi8KKyNkZWZpbmUgVU5MT0NLREVWKGRkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKGxvY2tlZERldikgewkJCQkgICAgICAgXAorCQkJc3Bpbl91bmxvY2soJmRkLT5sb2NrRGV2KTsJCSAgICAgICBcCisJCQlsb2NrZWREZXYgPSBGQUxTRTsJCQkgICAgICAgXAorCQl9CQkJCQkJICAgICAgIFwKKwl9CisKKy8qKiBMb2NrcyBkZC0+bG9ja0RldklTUiBpZiB5b3UgaGF2bid0IGFscmVhZHkgbG9ja2VkIGl0ICovCisjZGVmaW5lIExPQ0tERVZJU1IoZGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmICghbG9ja2VkRGV2SVNSKSB7CQkJCSAgICAgICBcCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGQtPmxvY2tEZXZJU1IsIGZsYWdzKTsgICAgIFwKKwkJCWxvY2tlZERldklTUiA9IFRSVUU7CQkJICAgICAgIFwKKwkJfQkJCQkJCSAgICAgICBcCisJfQorCisvKiogVW5sb2NrcyBkZC0+bG9ja0RldklTUiBpZiB5b3UgcHJldmlvdXNseSBsb2NrZWQgaXQgKi8KKyNkZWZpbmUgVU5MT0NLREVWSVNSKGRkKQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJCWlmIChsb2NrZWREZXZJU1IpIHsJCQkJCVwKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRkLT5sb2NrRGV2SVNSLCBmbGFncyk7IFwKKwkJCWxvY2tlZERldklTUiA9IEZBTFNFOwkJCQlcCisJCX0JCQkJCQkJXAorCX0KKworLyoqIExvY2tzIExvY2tHbG9iYWxJU1IgaWYgeW91IGhhdm4ndCBhbHJlYWR5IGxvY2tlZCBpdCAqLworI2RlZmluZSBMT0NLR0xPQkFMSVNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoIWxvY2tlZEdsb2JhbElTUikgewkJCQkgICAgICAgXAorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJkxvY2tHbG9iYWxJU1IsIGZsYWdzKTsgICAgICBcCisJCQlsb2NrZWRHbG9iYWxJU1IgPSBUUlVFOwkJCSAgICAgICBcCisJCX0JCQkJCQkgICAgICAgXAorCX0KKworLyoqIFVubG9ja3MgTG9ja0dsb2JhbElTUiBpZiB5b3UgcHJldmlvdXNseSBsb2NrZWQgaXQgKi8KKyNkZWZpbmUgVU5MT0NLR0xPQkFMSVNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKGxvY2tlZEdsb2JhbElTUikgewkJCQkgICAgICAgXAorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmTG9ja0dsb2JhbElTUiwgZmxhZ3MpOyBcCisJCQlsb2NrZWRHbG9iYWxJU1IgPSBGQUxTRTsJCSAgICAgICBcCisJCX0JCQkJCQkgICAgICAgXAorCX0KKworLyoqIExvY2tzIExvY2tHbG9iYWwgaWYgeW91IGhhdm4ndCBhbHJlYWR5IGxvY2tlZCBpdCAqLworI2RlZmluZSBMT0NLR0xPQkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoIWxvY2tlZEdsb2JhbCkgewkJCQkgICAgICAgXAorCQkJc3Bpbl9sb2NrKCZMb2NrR2xvYmFsKTsJCQkgICAgICAgXAorCQkJbG9ja2VkR2xvYmFsID0gVFJVRTsJCQkgICAgICAgXAorCQl9CQkJCQkJICAgICAgIFwKKwl9CisKKy8qKiBVbmxvY2tzIExvY2tHbG9iYWwgaWYgeW91IHByZXZpb3VzbHkgbG9ja2VkIGl0ICovCisjZGVmaW5lIFVOTE9DS0dMT0JBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmIChsb2NrZWRHbG9iYWwpIHsJCQkJICAgICAgIFwKKwkJCXNwaW5fdW5sb2NrKCZMb2NrR2xvYmFsKTsJCSAgICAgICBcCisJCQlsb2NrZWRHbG9iYWwgPSBGQUxTRTsJCQkgICAgICAgXAorCQl9CQkJCQkJICAgICAgIFwKKwl9CisKKy8qKiBVc2UgdGhpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGZ1bmN0aW9ucyB3aGVyZSB5b3UgaW50ZW5kIHRvCisgKiAgdXNlICNMT0NLREVWLyNVTkxPQ0tERVYsICNMT0NLREVWSVNSLyNVTkxPQ0tERVZJU1IsCisgKiAgI0xPQ0tHTE9CQUwvI1VOTE9DS0dMT0JBTCwgI0xPQ0tHTE9CQUxJU1IvI1VOTE9DS0dMT0JBTElTUi4KKyAqCisgKiAgTm90ZSB0aGF0IF9fYXR0cmlidXRlX18oKHVudXNlZCkpIGlzIGhvdyB5b3UgdGVsbCBHTlUgQyB0byBzdXBwcmVzcworICogIGFueSB3YXJuaW5nIG1lc3NhZ2VzIGFib3V0IHRoZSB2YXJpYWJsZSBiZWluZyB1bnVzZWQuCisgKi8KKyNkZWZpbmUgTE9DS1BSRUFNQkxFCQkJCQkJCVwKKwl1bG9uZyBmbGFncyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IDA7CQkJXAorCUJPT0wgbG9ja2VkRGV2IF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gRkFMU0U7CQkJXAorCUJPT0wgbG9ja2VkRGV2SVNSIF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gRkFMU0U7CQlcCisJQk9PTCBsb2NrZWRHbG9iYWwgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgPSBGQUxTRTsJCVwKKwlCT09MIGxvY2tlZEdsb2JhbElTUiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IEZBTFNFCisKKworCisvKiogU2xlZXAgZm9yIGFuIGluZGljYXRlZCBudW1iZXIgb2Ygc2Vjb25kcyAoZm9yIHVzZSBpbiBrZXJuZWwgbW9kZSkuCisgKiAgQHBhcmFtIHggdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHNsZWVwLgorICovCisjZGVmaW5lIFNMRUVQKHgpCQkJCQkgICAgIFwKKwlkbyB7IGN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwkgICAgIFwKKwkJc2NoZWR1bGVfdGltZW91dCgoeCkqSFopOwkJICAgICBcCisJfSB3aGlsZSAoMCkKKworLyoqIFNsZWVwIGZvciBhbiBpbmRpY2F0ZWQgbnVtYmVyIG9mIGppZmZpZXMgKGZvciB1c2UgaW4ga2VybmVsIG1vZGUpLgorICogIEBwYXJhbSB4IHRoZSBudW1iZXIgb2YgamlmZmllcyB0byBzbGVlcC4KKyAqLworI2RlZmluZSBTTEVFUEpJRkZJRVMoeCkJCQkJCQkgICAgXAorCWRvIHsgY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CQkgICAgXAorCQlzY2hlZHVsZV90aW1lb3V0KHgpOwkJCQkgICAgXAorCX0gd2hpbGUgKDApCisKKyNpZm5kZWYgbWF4CisjZGVmaW5lIG1heChhLCBiKSAoKChhKSA+IChiKSkgPyAoYSk6KGIpKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNkZXYgKmNkZXZfYWxsb2NfaW5pdChzdHJ1Y3QgbW9kdWxlICpvd25lciwKKwkJCQkJICAgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcykKK3sKKwlzdHJ1Y3QgY2RldiAqY2RldiA9IE5VTEw7CisJY2RldiA9IGNkZXZfYWxsb2MoKTsKKwlpZiAoIWNkZXYpCisJCXJldHVybiBOVUxMOworCWNkZXYtPm9wcyA9IGZvcHM7CisJY2Rldi0+b3duZXIgPSBvd25lcjsKKworCS8qIE5vdGUgdGhhdCB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgY2RldiB3aWxsIGJlIGRlYWxsb2NhdGVkCisJICogd2hlbiB0aGUgdXNhZ2UgY291bnQgZHJvcHMgdG8gMCwgYmVjYXVzZSBpdCBpcyBjb250cm9sbGVkCisJICogYnkgYSBrb2JqZWN0IG9mIHR5cGUga3R5cGVfY2Rldl9keW5hbWljLiAgKFRoaXMKKwkgKiBkZWFsbG9jYXRpb24gY291bGQgdmVyeSB3ZWxsIGhhcHBlbiBvdXRzaWRlIG9mIG91ciBrZXJuZWwKKwkgKiBtb2R1bGUsIGxpa2UgdmlhIHRoZSBjZGV2X3B1dCBpbiBfX2ZwdXQoKSBmb3IgZXhhbXBsZS4pCisJICovCisJcmV0dXJuIGNkZXY7Cit9CisKKyNpbmNsdWRlICJ0aW1za21vZHV0aWxzLmgiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3RpbXNrbW9kdXRpbHMuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS90aW1za21vZHV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4MWQ0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS90aW1za21vZHV0aWxzLmgKQEAgLTAsMCArMSw3NSBAQAorLyogdGltc2ttb2R1dGlscy5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fVElNU0tNT0RVVElMU19IX18KKyNkZWZpbmUgX19USU1TS01PRFVUSUxTX0hfXworCisjaW5jbHVkZSAidGltc2ttb2QuaCIKKwordm9pZCAqa21hbGxvY19rZXJuZWwoc2l6ZV90IHNpeik7Cit2b2lkICBteXByaW50ayhjb25zdCBjaGFyICpteURydk5hbWUsIGNvbnN0IGNoYXIgKmRldm5hbWUsCisJCWNvbnN0IGNoYXIgKnRlbXBsYXRlLCAuLi4pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICotLS0gIEdFTkVSQUwgTUVTU0FHRVEgU1RVRkYgIC0tLSoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdHJ1Y3QgTWVzc2FnZVFFbnRyeTsKKworLyoqIHRoZSBkYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgYW4gYXJiaXRyYXJ5IGRhdGEgaXRlbSB0aGF0IHlvdSB3YW50CisgKiAgdG8gcGxhY2Ugb24gYSAjTUVTU0FHRVEuICBEZWNsYXJlIGFuZCBpbml0aWFsaXplIGFzIGZvbGxvd3M6CisgKgorICogIFRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBjb25zaWRlcmVkIG9wYXF1ZTsgdGhlIGNsaWVudCB1c2luZyBpdCBzaG91bGQKKyAqICBuZXZlciBhY2Nlc3MgdGhlIGZpZWxkcyBkaXJlY3RseS4KKyAqICBSZWZlciB0byB0aGVzZSBmdW5jdGlvbnMgZm9yIG1vcmUgaW5mbzoKKyAqCisgKiAgQGluZ3JvdXAgbWVzc2FnZXEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgTWVzc2FnZVFFbnRyeSB7CisJdm9pZCAqZGF0YTsKKwlzdHJ1Y3QgTWVzc2FnZVFFbnRyeSAqcU5leHQ7CisJc3RydWN0IE1lc3NhZ2VRRW50cnkgKnFQcmV2OworfSBNRVNTQUdFUUVOVFJZOworCisvKiogdGhlIGRhdGEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBhIEZJRk8gcXVldWUgb2YgI01FU1NBR0VRRU5UUlk8Yj48L2I+cy4KKyAqICBEZWNsYXJlIGFuZCBpbml0aWFsaXplIGFzIGZvbGxvd3M6CisgKiAgQGNvZGUKKyAqICAgICAgTUVTU0FHRVEgbXlRdWV1ZTsKKyAqICBAZW5kY29kZQorICogIFRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBjb25zaWRlcmVkIG9wYXF1ZTsgdGhlIGNsaWVudCB1c2luZyBpdCBzaG91bGQKKyAqICBuZXZlciBhY2Nlc3MgdGhlIGZpZWxkcyBkaXJlY3RseS4KKyAqICBSZWZlciB0byB0aGVzZSBmdW5jdGlvbnMgZm9yIG1vcmUgaW5mbzoKKyAqCisgKiAgQGluZ3JvdXAgbWVzc2FnZXEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgTWVzc2FnZVEgeworCU1FU1NBR0VRRU5UUlkgKnFIZWFkOworCU1FU1NBR0VRRU5UUlkgKnFUYWlsOworCXN0cnVjdCBzZW1hcGhvcmUgblFFbnRyaWVzOworCXNwaW5sb2NrX3QgICAgICAgcXVldWVMb2NrOworfSBNRVNTQUdFUTsKKworY2hhciAqY3ljbGVzVG9TZWNvbmRzKHU2NCBjeWNsZXMsIHU2NCBjeWNsZXNQZXJTZWNvbmQsCisJCSAgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUpOworY2hhciAqY3ljbGVzVG9JdGVyYXRpb25TZWNvbmRzKHU2NCBjeWNsZXMsIHU2NCBjeWNsZXNQZXJTZWNvbmQsCisJCQkgICAgICAgdTY0IGl0ZXJhdGlvbnMsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUpOworY2hhciAqY3ljbGVzVG9Tb21ldGhpbmdzUGVyU2Vjb25kKHU2NCBjeWNsZXMsIHU2NCBjeWNsZXNQZXJTZWNvbmQsCisJCQkJICB1NjQgc29tZXRoaW5ncywgY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6ZSk7CitzdHJ1Y3Qgc2VxX2ZpbGUgKnZpc29yX3NlcV9maWxlX25ld19idWZmZXIodm9pZCAqYnVmLCBzaXplX3QgYnVmX3NpemUpOwordm9pZCB2aXNvcl9zZXFfZmlsZV9kb25lX2J1ZmZlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91aXNxdWV1ZS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Vpc3F1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhYjM5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91aXNxdWV1ZS5oCkBAIC0wLDAgKzEsNDQwIEBACisvKiB1aXNxdWV1ZS5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKgorICogVW5pc3lzIElPIFZpcnR1YWxpemF0aW9uIGhlYWRlciBOT1RFOiBUaGlzIGZpbGUgY29udGFpbnMgb25seSBMaW51eAorICogc3BlY2lmaWMgc3RydWN0cy4gIEFsbCBPUy1pbmRlcGVuZGVudCBzdHJ1Y3RzIGFyZSBpbiBpb2NoYW5uZWwuaC54eAorICovCisKKyNpZm5kZWYgX19VSVNRVUVVRV9IX18KKyNkZWZpbmUgX19VSVNRVUVVRV9IX18KKworI2luY2x1ZGUgImxpbnV4L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJpb2NoYW5uZWwuaCIKKyNpbmNsdWRlICJ1bmlrbG9nLmgiCisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlICJjb250cm9sdm1jaGFubmVsLmgiCisjaW5jbHVkZSAiY29udHJvbHZtY29tcGxldGlvbnN0YXR1cy5oIgorCitzdHJ1Y3QgdWlzcXVldWVfaW5mbyB7CisKKwlDSEFOTkVMX0hFQURFUiBfX2lvbWVtICpjaGFuOworCS8qIGNoYW5uZWwgY29udGFpbmluZyBxdWV1ZXMgaW4gd2hpY2ggc2NzaSBjb21tYW5kcyAmCisJICogcmVzcG9uc2VzIGFyZSBxdWV1ZWQKKwkgKi8KKwlVNjQgcGFja2V0c19zZW50OworCVU2NCBwYWNrZXRzX3JlY2VpdmVkOworCVU2NCBpbnRlcnJ1cHRzX3NlbnQ7CisJVTY0IGludGVycnVwdHNfcmVjZWl2ZWQ7CisJVTY0IG1heF9ub3RfZW1wdHlfY250OworCVU2NCB0b3RhbF93YWtldXBfY250OworCVU2NCBub25fZW1wdHlfd2FrZXVwX2NudDsKKworCXN0cnVjdCB7CisJCVNJR05BTF9RVUVVRV9IRUFERVIgUmVzZXJ2ZWQxOwkvKiAgKi8KKwkJU0lHTkFMX1FVRVVFX0hFQURFUiBSZXNlcnZlZDI7CS8qICAqLworCX0gc2FmZV91aXNfcXVldWU7CisJdW5zaWduZWQgaW50ICgqc2VuZF9pbnRfaWZfbmVlZGVkKShzdHJ1Y3QgdWlzcXVldWVfaW5mbyAqaW5mbywKKwkJCQkJICAgdW5zaWduZWQgaW50IHdoaWNoY3F1ZXVlLAorCQkJCQkgICB1bnNpZ25lZCBjaGFyIGlzc3VlSW50ZXJydXB0SWZFbXB0eSwKKwkJCQkJICAgVTY0IGludGVycnVwdEhhbmRsZSwKKwkJCQkJICAgdW5zaWduZWQgY2hhciBpb190ZXJtaW5hdGlvbik7Cit9OworCisvKiB1aXNxdWV1ZV9wdXRfY21kcnNwX3dpdGhfbG9ja19jbGllbnQgcXVldWVzIGEgY29tbW1hbmQgb3IgcmVzcG9uc2UKKyAqIHRvIHRoZSBzcGVjaWZpZWQgcXVldWUsIGF0IHRoZSB0YWlsIGlmIHRoZSBxdWV1ZSBpcyBmdWxsIGJ1dAorICogb2t0b3dhaXQgPT0gMCwgdGhlbiBpdCByZXR1cm4gMCBpbmRpY2F0aW5nIGZhaWx1cmUuICBvdGhlcndpc2UgaXQKKyAqIHdhaXQgZm9yIHRoZSBxdWV1ZSB0byBiZWNvbWUgbm9uLWZ1bGwuIElmIGNvbW1hbmQgaXMgcXVldWVkLCByZXR1cm4KKyAqIDEgZm9yIHN1Y2Nlc3MuCisgKi8KKyNkZWZpbmUgRE9OVF9JU1NVRV9JTlRFUlJVUFQgMAorI2RlZmluZSBJU1NVRV9JTlRFUlJVUFQJCSAxCisKKyNkZWZpbmUgRE9OVF9XQUlUCQkJIDAKKyNkZWZpbmUgT0tfVE9fV0FJVAkJCSAxCisjZGVmaW5lIFVJU0xJQl9MT0NLX1BSRUZJWCBcCisJCSIuc2VjdGlvbiAuc21wX2xvY2tzLFwiYVwiXG4iICAgXAorCQlfQVNNX0FMSUdOICJcbiIgICAgICAgICAgICAgICAgIFwKKwkJX0FTTV9QVFIgIjY2MWZcbiIgLyogYWRkcmVzcyAqLyBcCisJCSIucHJldmlvdXNcbiIgICAgICAgICAgICAgICAgICAgXAorCQkiNjYxOlxuXHRsb2NrOyAiCisKK3Vuc2lnbmVkIGxvbmcgbG9uZyB1aXNxdWV1ZV9JbnRlcmxvY2tlZE9yKHVuc2lnbmVkIGxvbmcgbG9uZyBfX2lvbWVtICpUYXJnZXQsCisJCQkJCSAgdW5zaWduZWQgbG9uZyBsb25nIFNldCk7Cit1bnNpZ25lZCBsb25nIGxvbmcgdWlzcXVldWVfSW50ZXJsb2NrZWRBbmQodW5zaWduZWQgbG9uZyBsb25nIF9faW9tZW0gKlRhcmdldCwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBsb25nIFNldCk7CisKK3Vuc2lnbmVkIGludCB1aXNxdWV1ZV9zZW5kX2ludF9pZl9uZWVkZWQoc3RydWN0IHVpc3F1ZXVlX2luZm8gKnBxdWV1ZWluZm8sCisJCQkJCSB1bnNpZ25lZCBpbnQgd2hpY2hxdWV1ZSwKKwkJCQkJIHVuc2lnbmVkIGNoYXIgaXNzdWVJbnRlcnJ1cHRJZkVtcHR5LAorCQkJCQkgVTY0IGludGVycnVwdEhhbmRsZSwKKwkJCQkJIHVuc2lnbmVkIGNoYXIgaW9fdGVybWluYXRpb24pOworCitpbnQgdWlzcXVldWVfcHV0X2NtZHJzcF93aXRoX2xvY2tfY2xpZW50KHN0cnVjdCB1aXNxdWV1ZV9pbmZvICpxdWV1ZWluZm8sCisJCQkJCSBzdHJ1Y3QgdWlzY21kcnNwICpjbWRyc3AsCisJCQkJCSB1bnNpZ25lZCBpbnQgcXVldWUsCisJCQkJCSB2b2lkICppbnNlcnRsb2NrLAorCQkJCQkgdW5zaWduZWQgY2hhciBpc3N1ZUludGVycnVwdElmRW1wdHksCisJCQkJCSBVNjQgaW50ZXJydXB0SGFuZGxlLAorCQkJCQkgY2hhciBva3Rvd2FpdCwKKwkJCQkJIFU4ICpjaGFubmVsSWQpOworCisvKiB1aXNxdWV1ZV9nZXRfY21kcnNwIGdldHMgdGhlIGNtZHJzcCBlbnRyeSBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUKKyAqIGFuZCBjb3BpZXMgaXQgdG8gdGhlIGFyZWEgcG9pbnRlZCBieSBjbWRyc3AgcGFyYW0uCisgKiByZXR1cm5zIDAgaWYgcXVldWUgaXMgZW1wdHksIDEgb3RoZXJ3aXNlCisgKi8KK2ludAorCit1aXNxdWV1ZV9nZXRfY21kcnNwKHN0cnVjdCB1aXNxdWV1ZV9pbmZvICpxdWV1ZWluZm8sIHZvaWQgKmNtZHJzcCwKKwkJICAgIHVuc2lnbmVkIGludCBxdWV1ZSk7CisKKyNkZWZpbmUgTUFYX05BTUVfU0laRV9VSVNRVUVVRSA2NAorCitzdHJ1Y3QgZXh0cG9ydF9pbmZvIHsKKwlVOCB2YWxpZDoxOworCS8qIGlmIDEsIGluZGljYXRlcyB0aGlzIGV4dHBvcnQgc2xvdCBpcyBvY2N1cGllZAorCSAqIGlmIDAsIGluZGljYXRlcyB0aGF0IGV4dHBvcnQgc2xvdCBpcyB1bm9jY3VwaWVkICovCisKKwlVMzIgbnVtX2RldnNfdXNpbmc7CisJLyogV2hlbiBleHRwb3J0IGlzIGFkZGVkLCB0aGlzIGlzIHNldCB0byAwLiAgRm9yIGV4cG9ydHMKKwkqIGxvY2F0ZWQgaW4gTkVUV09SSyBzd2l0Y2hlczoKKwkqIEVhY2ggdGltZSBhIFZOSUMsIGkuZS4sIGludHBvcnQsIGlzIGFkZGVkIHRvIHRoZSBzd2l0Y2ggdGhpcworCSogaXMgdXNlZCB0byBhc3NpZ24gYSBwcmVmX3BuaWMgZm9yIHRoZSBWTklDIGFuZCB3aGVuIGFzc2lnbmVkCisJKiB0byBhIFZOSUMgdGhpcyBjb3VudGVyIGlzIGluY3JlbWVudGVkLiBXaGVuIGEgVk5JQyBpcworCSogZGVsZXRlZCwgdGhlIGV4dHBvcnQgY29ycmVzcG9uZGluZyB0byB0aGUgVk5JQydzIHByZWZfcG5pYworCSogaXMgbG9jYXRlZCBhbmQgaXRzIG51bV9kZXZzX3VzaW5nIGlzIGRlY3JlbWVudGVkLiBGb3IgVk5JQ3MsCisJKiBudW1fZGV2c191c2luZyBpcyBiYXNpY2FsbHkgdXNlZCB0byBsb2FkLWJhbGFuY2UgdHJhbnNtaXQKKwkqIHRyYWZmaWMgZnJvbSBWTklDcy4KKwkqLworCisJc3RydWN0IHN3aXRjaF9pbmZvICpzd3RjaDsKKwlzdHJ1Y3QgUGNpSWQgcGNpX2lkOworCWNoYXIgbmFtZVtNQVhfTkFNRV9TSVpFX1VJU1FVRVVFXTsKKwl1bmlvbiB7CisJCXN0cnVjdCB2aGJhX3d3bm4gd3dubjsKKwkJdW5zaWduZWQgY2hhciBtYWNhZGRyW01BWF9NQUNBRERSX0xFTl07CisJfTsKK307CisKK3N0cnVjdCBkZXZpY2VfaW5mbyB7CisJdm9pZCBfX2lvbWVtICpjaGFucHRyOworCVU2NCBjaGFubmVsQWRkcjsKKwlVNjQgY2hhbm5lbEJ5dGVzOworCUdVSUQgY2hhbm5lbFR5cGVHdWlkOworCUdVSUQgZGV2SW5zdEd1aWQ7CisJc3RydWN0IEludGVycnVwdEluZm8gaW50cjsKKwlzdHJ1Y3Qgc3dpdGNoX2luZm8gKnN3dGNoOworCWNoYXIgZGV2aWRbMzBdOwkJLyogInZidXM8YnVzbm8+OmRldjxkZXZubz4iICovCisJVTE2IHBvbGxpbmc7CisJc3RydWN0IHNlbWFwaG9yZSBpbnRlcnJ1cHRfY2FsbGJhY2tfbG9jazsKKwlVMzIgYnVzTm87CisJVTMyIGRldk5vOworCWludCAoKmludGVycnVwdCkodm9pZCAqKTsKKwl2b2lkICppbnRlcnJ1cHRfY29udGV4dDsKKwl2b2lkICpwcml2YXRlX2RhdGE7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X3BvbGxpbmdfZGV2aWNlX2NoYW5uZWxzOworCXVuc2lnbmVkIGxvbmcgbG9uZyBtb3ZlZF90b190YWlsX2NudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZmlyc3RfYnVzeV9jbnQ7CisJdW5zaWduZWQgbG9uZyBsb25nIGxhc3Rfb25fbGlzdF9jbnQ7Cit9OworCit0eXBlZGVmIGVudW0geworCVJFQ09WRVJZX0xBTiA9IDEsCisJSUJfTEFOID0gMgorfSBTV0lUQ0hfVFlQRTsKKworc3RydWN0IGJ1c19pbmZvIHsKKwlVMzIgYnVzTm8sIGRldmljZUNvdW50OworCXN0cnVjdCBkZXZpY2VfaW5mbyAqKmRldmljZTsKKwlVNjQgZ3Vlc3RIYW5kbGUsIHJlY3ZCdXNJbnRlcnJ1cHRIYW5kbGU7CisJR1VJRCBidXNJbnN0R3VpZDsKKwlVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wgX19pb21lbSAqcEJ1c0NoYW5uZWw7CisJaW50IGJ1c0NoYW5uZWxCeXRlczsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZGlyOwkvKiBwcm9jL3Vpc2xpYi92YnVzLzx4PiAqLworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pbmZvOwkvKiBwcm9jL3Vpc2xpYi92YnVzLzx4Pi9pbmZvICovCisJY2hhciBuYW1lWzI1XTsKKwljaGFyIHBhcnRpdGlvbk5hbWVbOTldOworCXN0cnVjdCBidXNfaW5mbyAqbmV4dDsKKwlVOCBsb2NhbFZuaWM7CQkvKiAxIGlmIGxvY2FsIHZuaWMgY3JlYXRlZCBpbnRlcm5hbGx5CisJCQkJICogYnkgSU9WTTsgMCBvdGhlcndpc2UuLi4gKi8KK307CisKKyNkZWZpbmUgREVESUNBVEVEX1NXSVRDSChwU3dpdGNoKSAoKHBTd2l0Y2gtPmV4dFBvcnRDb3VudCA9PSAxKSAmJglcCisJCQkJICAgKHBTd2l0Y2gtPmludFBvcnRDb3VudCA9PSAxKSkKKworc3RydWN0IHNuX2xpc3RfZW50cnkgeworCXN0cnVjdCB1aXNzY3NpX2Rlc3QgcGRlc3Q7CS8qIHNjc2kgYnVzLCB0YXJnZXQsIGx1biBmb3IKKwkJCQkJICogcGh5cyBkaXNrICovCisJVTggc2VybnVtW01BWF9TRVJJQUxfTlVNXTsJLyogc2VyaWFsIG51bSBvZiBwaHlzaWNhbAorCQkJCQkgKiBkaXNrLi4gVGhlIGxlbmd0aCBpcyBhbHdheXMKKwkJCQkJICogTUFYX1NFUklBTF9OVU0sIHBhZGRlZCB3aXRoCisJCQkJCSAqIHNwYWNlcyAqLworCXN0cnVjdCBzbl9saXN0X2VudHJ5ICpuZXh0OworfTsKKworc3RydWN0IG5ldHdvcmtQb2xpY3kgeworCVUzMiBwcm9taXNjdW91czoxOworCVUzMiBtYWNhc3NpZ246MTsKKwlVMzIgcGVlcmZvcndhcmRpbmc6MTsKKwlVMzIgbm9ub3RpZnk6MTsKKwlVMzIgc3RhbmRieToxOworCVUzMiBjYWxsaG9tZToyOworCWNoYXIgaXBfYWRkclszMF07Cit9OworCisvKgorICogSU8gbWVzc2FnZXMgc2VudCB0byBVaXNuaWNDb250cm9sQ2hhbkZ1bmMgJiBVaXNzZENvbnRyb2xDaGFuRnVuYyBieQorICogY29kZSB0aGF0IHByb2Nlc3NlcyB0aGUgQ29udHJvbFZtIGNoYW5uZWwgbWVzc2FnZXMuCisgKi8KKworCit0eXBlZGVmIGVudW0geworCUlPUEFSVF9BRERfVk5JQywKKwlJT1BBUlRfREVMX1ZOSUMsCisJSU9QQVJUX0RFTF9BTExfVk5JQ1MsCisJSU9QQVJUX0FERF9WSEJBLAorCUlPUEFSVF9BRERfVkRJU0ssCisJSU9QQVJUX0RFTF9WSEJBLAorCUlPUEFSVF9ERUxfVkRJU0ssCisJSU9QQVJUX0RFTF9BTExfVkRJU0tTX0ZPUl9WSEJBLAorCUlPUEFSVF9ERUxfQUxMX1ZIQkFTLAorCUlPUEFSVF9BVFRBQ0hfUEhCQSwKKwlJT1BBUlRfREVUQUNIX1BIQkEsCS8qIDEwICovCisJSU9QQVJUX0FUVEFDSF9QTklDLAorCUlPUEFSVF9ERVRBQ0hfUE5JQywKKwlJT1BBUlRfREVUQUNIX1ZIQkEsCisJSU9QQVJUX0RFVEFDSF9WTklDLAorCUlPUEFSVF9QQVVTRV9WRElTSywKKwlJT1BBUlRfUkVTVU1FX1ZESVNLLAorCUlPUEFSVF9BRERfREVWSUNFLAkvKiBhZGQgZ2VuZXJpYyBkZXZpY2UgKi8KKwlJT1BBUlRfREVMX0RFVklDRSwJLyogZGVsIGdlbmVyaWMgZGV2aWNlICovCit9IElPUEFSVF9NU0dfVFlQRTsKKworc3RydWN0IGFkZF92aXJ0X2lvcGFydCB7CisJdm9pZCAqY2hhbnB0cjsJCS8qIHBvaW50ZXIgdG8gZGF0YSBjaGFubmVsICovCisJVTY0IGd1ZXN0SGFuZGxlOwkvKiB1c2VkIHRvIGNvbnZlcnQgZ3Vlc3QgcGh5c2ljYWwKKwkJCQkgKiBhZGRyZXNzIHRvIHJlYWwgcGh5c2ljYWwgYWRkcmVzcworCQkJCSAqIGZvciBETUEsIGZvciBleC4gKi8KKwlVNjQgcmVjdkJ1c0ludGVycnVwdEhhbmRsZTsJLyogdXNlZCB0byByZWdpc3RlciB0byByZWNlaXZlCisJCQkJCSAqIGJ1cyBsZXZlbCBpbnRlcnJ1cHRzLiAqLworCXN0cnVjdCBJbnRlcnJ1cHRJbmZvIGludHI7CS8qIGNvbnRhaW5zIHJlY3YgJiBzZW5kCisJCQkJCSAqIGludGVycnVwdCBpbmZvICovCisJLyogcmVjdkludGVycnVwdEhhbmRsZSBpcyB1c2VkIHRvIHJlZ2lzdGVyIHRvIHJlY2VpdmUKKwkqIGludGVycnVwdHMgb24gdGhlIGRhdGEgY2hhbm5lbC4gVXNlZCBieSBHdWVzdExpbnV4L1dpbmRvd3MKKwkqIElPIGRyaXZlcnMgdG8gY29ubmVjdCB0byBpbnRlcnJ1cHQuICBzZW5kSW50ZXJydXB0SGFuZGxlIGlzCisJKiB1c2VkIGJ5IElPUGFydCBkcml2ZXJzIGFzIHBhcmFtZXRlciB0bworCSogSXNzdWVfVk1DQUxMX0lPX1FVRVVFX1RSQU5TSVRJT04gdG8gaW50ZXJydXB0IHRocmVhZCBpbgorCSogZ3Vlc3QgbGludXgvd2luZG93cyBJTyBkcml2ZXJzIHdoZW4gZGF0YSBjaGFubmVsIHF1ZXVlIGZvcgorCSogdmhiYS92bmljIGdvZXMgZnJvbSBFTVBUWSB0byBOT04tRU1QVFkuICovCisJc3RydWN0IHN3aXRjaF9pbmZvICpzd3RjaDsJLyogcG9pbnRlciB0byB0aGUgdmlydHVhbAorCQkJCQkgKiBzd2l0Y2ggdG8gd2hpY2ggdGhlIHZuaWMgaXMKKwkJCQkJICogY29ubmVjdGVkICovCisKKwlVOCB1c2VHMkdDb3B5OwkJLyogVXNlZCB0byBkZXRlcm1pbmUgaWYgYSB2aXJ0dWFsIEhCQQorCQkJCSAqIG5lZWRzIHRvIHVzZSBHMkcgY29weS4gKi8KKwlVOCBGaWxsZXJbN107CisKKwlVMzIgYnVzTm87CisJVTMyIGRldk5vOworCWNoYXIgKnBhcmFtczsKKwl1bG9uZyBwYXJhbXNfYnl0ZXM7CisKK307CisKK3N0cnVjdCBhZGRfdmRpc2tfaW9wYXJ0IHsKKwl2b2lkICpjaGFucHRyOwkJICAgICAgLyogcG9pbnRlciB0byBkYXRhIGNoYW5uZWwgKi8KKwlpbnQgaW1wbGljaXQ7CisJc3RydWN0IHVpc3Njc2lfZGVzdCB2ZGVzdDsgICAgLyogc2NzaSBidXMsIHRhcmdldCwgbHVuIGZvciB2aXJ0IGRpc2sgKi8KKwlzdHJ1Y3QgdWlzc2NzaV9kZXN0IHBkZXN0OyAgICAvKiBzY3NpIGJ1cywgdGFyZ2V0LCBsdW4gZm9yIHBoeXMgZGlzayAqLworCVU4IHNlcm51bVtNQVhfU0VSSUFMX05VTV07ICAgIC8qIHNlcmlhbCBudW0gb2YgcGh5c2ljYWwgZGlzayAqLworCVUzMiBzZXJsZW47CQkgICAgICAvKiBsZW5ndGggb2Ygc2VyaWFsIG51bSAqLworCVUzMiBidXNObzsKKwlVMzIgZGV2Tm87Cit9OworCitzdHJ1Y3QgZGVsX3ZkaXNrX2lvcGFydCB7CisJdm9pZCAqY2hhbnB0cjsJCSAgICAgLyogcG9pbnRlciB0byBkYXRhIGNoYW5uZWwgKi8KKwlzdHJ1Y3QgdWlzc2NzaV9kZXN0IHZkZXN0OyAgIC8qIHNjc2kgYnVzLCB0YXJnZXQsIGx1biBmb3IgdmlydCBkaXNrICovCisJVTMyIGJ1c05vOworCVUzMiBkZXZObzsKK307CisKK3N0cnVjdCBkZWxfdmlydF9pb3BhcnQgeworCXZvaWQgKmNoYW5wdHI7CQkgICAgIC8qIHBvaW50ZXIgdG8gZGF0YSBjaGFubmVsICovCisJVTMyIGJ1c05vOworCVUzMiBkZXZObzsKK307CisKK3N0cnVjdCBkZXRfdmlydF9pb3BhcnQgewkgICAgIC8qIGRldGFjaCBpbnRlcm5hbCBwb3J0ICovCisJdm9pZCAqY2hhbnB0cjsJCSAgICAgLyogcG9pbnRlciB0byBkYXRhIGNoYW5uZWwgKi8KKwlzdHJ1Y3Qgc3dpdGNoX2luZm8gKnN3dGNoOworfTsKKworc3RydWN0IHBhdXJlc192ZGlza19pb3BhcnQgeworCXZvaWQgKmNoYW5wdHI7CQkgICAgIC8qIHBvaW50ZXIgdG8gZGF0YSBjaGFubmVsICovCisJc3RydWN0IHVpc3Njc2lfZGVzdCB2ZGVzdDsgICAvKiBzY3NpIGJ1cywgdGFyZ2V0LCBsdW4gZm9yIHZpcnQgZGlzayAqLworfTsKKworc3RydWN0IGFkZF9zd2l0Y2hfaW9wYXJ0IHsJICAgICAvKiBhZGQgc3dpdGNoICovCisJc3RydWN0IHN3aXRjaF9pbmZvICpzd3RjaDsKKwljaGFyICpwYXJhbXM7CisJdWxvbmcgcGFyYW1zX2J5dGVzOworfTsKKworc3RydWN0IGRlbF9zd2l0Y2hfaW9wYXJ0IHsJICAgICAvKiBkZXN0cm95IHN3aXRjaCAqLworCXN0cnVjdCBzd2l0Y2hfaW5mbyAqc3d0Y2g7Cit9OworCitzdHJ1Y3QgaW9fbXNncyB7CisKKwlJT1BBUlRfTVNHX1RZUEUgbXNndHlwZTsKKworCS8qIGFkZGl0aW9uYWwgcGFyYW1zIG5lZWRlZCBieSBzb21lIG1lc3NhZ2VzICovCisJdW5pb24geworCQlzdHJ1Y3QgYWRkX3ZpcnRfaW9wYXJ0IGFkZF92aGJhOworCQlzdHJ1Y3QgYWRkX3ZpcnRfaW9wYXJ0IGFkZF92bmljOworCQlzdHJ1Y3QgYWRkX3ZkaXNrX2lvcGFydCBhZGRfdmRpc2s7CisJCXN0cnVjdCBkZWxfdmlydF9pb3BhcnQgZGVsX3ZoYmE7CisJCXN0cnVjdCBkZWxfdmlydF9pb3BhcnQgZGVsX3ZuaWM7CisJCXN0cnVjdCBkZXRfdmlydF9pb3BhcnQgZGV0X3ZoYmE7CisJCXN0cnVjdCBkZXRfdmlydF9pb3BhcnQgZGV0X3ZuaWM7CisJCXN0cnVjdCBkZWxfdmRpc2tfaW9wYXJ0IGRlbF92ZGlzazsKKwkJc3RydWN0IGRlbF92aXJ0X2lvcGFydCBkZWxfYWxsX3ZkaXNrc19mb3JfdmhiYTsKKwkJc3RydWN0IGFkZF92aXJ0X2lvcGFydCBhZGRfZGV2aWNlOworCQlzdHJ1Y3QgZGVsX3ZpcnRfaW9wYXJ0IGRlbF9kZXZpY2U7CisJCXN0cnVjdCBkZXRfdmlydF9pb3BhcnQgZGV0X2ludHBvcnQ7CisJCXN0cnVjdCBhZGRfc3dpdGNoX2lvcGFydCBhZGRfc3dpdGNoOworCQlzdHJ1Y3QgZGVsX3N3aXRjaF9pb3BhcnQgZGVsX3N3aXRjaDsKKwkJc3RydWN0IGV4dHBvcnRfaW5mbyAqZXh0UG9ydDsJLyogZm9yIGF0dGFjaCBvciBkZXRhY2gKKwkJCQkJCSAqIHBuaWMvZ2VuZXJpYyBkZWxldGUgYWxsCisJCQkJCQkgKiB2aGJhcy9hbGx2bmljcyBuZWVkIG5vCisJCQkJCQkgKiBwYXJhbWV0ZXJzICovCisJCXN0cnVjdCBwYXVyZXNfdmRpc2tfaW9wYXJ0IHBhdXJlc192ZGlzazsKKwl9OworfTsKKworLyoKKyogR3Vlc3QgbWVzc2FnZXMgc2VudCB0byBWaXJ0Q29udHJvbENoYW5GdW5jIGJ5IGNvZGUgdGhhdCBwcm9jZXNzZXMKKyogdGhlIENvbnRyb2xWbSBjaGFubmVsIG1lc3NhZ2VzLgorKi8KKwordHlwZWRlZiBlbnVtIHsKKwlHVUVTVF9BRERfVkJVUywKKwlHVUVTVF9BRERfVkhCQSwKKwlHVUVTVF9BRERfVk5JQywKKwlHVUVTVF9ERUxfVkJVUywKKwlHVUVTVF9ERUxfVkhCQSwKKwlHVUVTVF9ERUxfVk5JQywKKwlHVUVTVF9ERUxfQUxMX1ZIQkFTLAorCUdVRVNUX0RFTF9BTExfVk5JQ1MsCisJR1VFU1RfREVMX0FMTF9WQlVTRVMsCS8qIGRlbGV0ZXMgYWxsIHZoYmFzICYgdm5pY3Mgb24gYWxsCisJCQkJICogYnVzZXMgYW5kIGRlbGV0ZXMgYWxsIGJ1c2VzICovCisJR1VFU1RfUEFVU0VfVkhCQSwKKwlHVUVTVF9QQVVTRV9WTklDLAorCUdVRVNUX1JFU1VNRV9WSEJBLAorCUdVRVNUX1JFU1VNRV9WTklDCit9IEdVRVNUUEFSVF9NU0dfVFlQRTsKKworc3RydWN0IGFkZF92YnVzX2d1ZXN0cGFydCB7CisJdm9pZCBfX2lvbWVtICpjaGFucHRyOwkJLyogcG9pbnRlciB0byBkYXRhIGNoYW5uZWwgZm9yIGJ1cyAtCisJCQkJCSAqIE5PVCBZRVQgVVNFRCAqLworCVUzMiBidXNObzsJCS8qIGJ1cyBudW1iZXIgdG8gYmUgY3JlYXRlZC9kZWxldGVkICovCisJVTMyIGRldmljZUNvdW50OwkvKiBtYXggbnVtIG9mIGRldmljZXMgb24gYnVzICovCisJR1VJRCBidXNUeXBlR3VpZDsJLyogaW5kaWNhdGVzIHR5cGUgb2YgYnVzICovCisJR1VJRCBidXNJbnN0R3VpZDsJLyogaW5zdGFuY2UgZ3VpZCBmb3IgZGV2aWNlICovCit9OworCitzdHJ1Y3QgZGVsX3ZidXNfZ3Vlc3RwYXJ0IHsKKwlVMzIgYnVzTm87CQkvKiBidXMgbnVtYmVyIHRvIGJlIGRlbGV0ZWQgKi8KKwkvKiBvbmNlIHdlIHN0YXJ0IHVzaW5nIHRoZSBidXMncyBjaGFubmVsLCBhZGQgY2FuIGR1bXAgYnVzTm8KKwkqIGludG8gdGhlIGNoYW5uZWwgaGVhZGVyIGFuZCB0aGVuIGRlbGV0ZSB3aWxsIG5lZWQgb25seSBvbmUKKwkqIHBhcmFtZXRlciwgY2hhbnB0ci4gKi8KK307CisKK3N0cnVjdCBhZGRfdmlydF9ndWVzdHBhcnQgeworCXZvaWQgX19pb21lbSAqY2hhbnB0cjsJCS8qIHBvaW50ZXIgdG8gZGF0YSBjaGFubmVsICovCisJVTMyIGJ1c05vOwkJLyogYnVzIG51bWJlciBmb3IgdGhlIG9wZXJhdGlvbiAqLworCVUzMiBkZXZpY2VObzsJCS8qIG51bWJlciBvZiBkZXZpY2Ugb24gdGhlIGJ1cyAqLworCUdVSUQgZGV2SW5zdEd1aWQ7CS8qIGluc3RhbmNlIGd1aWQgZm9yIGRldmljZSAqLworCXN0cnVjdCBJbnRlcnJ1cHRJbmZvIGludHI7CS8qIHJlY3Yvc2VuZCBpbnRlcnJ1cHQgaW5mbyAqLworCS8qIHJlY3ZJbnRlcnJ1cHRIYW5kbGUgY29udGFpbnMgaW5mbyBuZWVkZWQgaW4gb3JkZXIgdG8KKwkgKiByZWdpc3RlciB0byByZWNlaXZlIGludGVycnVwdHMgb24gdGhlIGRhdGEgY2hhbm5lbC4KKwkgKiBzZW5kSW50ZXJydXB0SGFuZGxlIGNvbnRhaW5zIGhhbmRsZSB3aGljaCBpcyBwcm92aWRlZCB0bworCSAqIG1vbml0b3IgVk1DQUxMIHRoYXQgd2lsbCBjYXVzZSBhbiBpbnRlcnJ1cHQgdG8gYmUgZ2VuZXJhdGVkCisJICogZm9yIHRoZSBvdGhlciBlbmQuCisJICovCit9OworCitzdHJ1Y3QgcGF1c2VfdmlydF9ndWVzdHBhcnQgeworCXZvaWQgX19pb21lbSAqY2hhbnB0cjsJCS8qIHBvaW50ZXIgdG8gZGF0YSBjaGFubmVsICovCit9OworCitzdHJ1Y3QgcmVzdW1lX3ZpcnRfZ3Vlc3RwYXJ0IHsKKwl2b2lkIF9faW9tZW0gKmNoYW5wdHI7CQkvKiBwb2ludGVyIHRvIGRhdGEgY2hhbm5lbCAqLworfTsKKworc3RydWN0IGRlbF92aXJ0X2d1ZXN0cGFydCB7CisJdm9pZCBfX2lvbWVtICpjaGFucHRyOwkJLyogcG9pbnRlciB0byBkYXRhIGNoYW5uZWwgKi8KK307CisKK3N0cnVjdCBpbml0X2NoaXBzZXRfZ3Vlc3RwYXJ0IHsKKwlVMzIgYnVzQ291bnQ7CQkvKiBpbmRpY2F0ZXMgdGhlIG1heCBudW1iZXIgb2YgYnVzc2VzICovCisJVTMyIHN3aXRjaENvdW50OwkvKiBpbmRpY2F0ZXMgdGhlIG1heCBudW1iZXIgb2Ygc3dpdGNoZXMgKi8KK307CisKK3N0cnVjdCBndWVzdF9tc2dzIHsKKworCUdVRVNUUEFSVF9NU0dfVFlQRSBtc2d0eXBlOworCisJLyogYWRkaXRpb25hbCBwYXJhbXMgbmVlZGVkIGJ5IG1lc3NhZ2VzICovCisJdW5pb24geworCQlzdHJ1Y3QgYWRkX3ZidXNfZ3Vlc3RwYXJ0IGFkZF92YnVzOworCQlzdHJ1Y3QgYWRkX3ZpcnRfZ3Vlc3RwYXJ0IGFkZF92aGJhOworCQlzdHJ1Y3QgYWRkX3ZpcnRfZ3Vlc3RwYXJ0IGFkZF92bmljOworCQlzdHJ1Y3QgcGF1c2VfdmlydF9ndWVzdHBhcnQgcGF1c2VfdmhiYTsKKwkJc3RydWN0IHBhdXNlX3ZpcnRfZ3Vlc3RwYXJ0IHBhdXNlX3ZuaWM7CisJCXN0cnVjdCByZXN1bWVfdmlydF9ndWVzdHBhcnQgcmVzdW1lX3ZoYmE7CisJCXN0cnVjdCByZXN1bWVfdmlydF9ndWVzdHBhcnQgcmVzdW1lX3ZuaWM7CisJCXN0cnVjdCBkZWxfdmJ1c19ndWVzdHBhcnQgZGVsX3ZidXM7CisJCXN0cnVjdCBkZWxfdmlydF9ndWVzdHBhcnQgZGVsX3ZoYmE7CisJCXN0cnVjdCBkZWxfdmlydF9ndWVzdHBhcnQgZGVsX3ZuaWM7CisJCXN0cnVjdCBkZWxfdmJ1c19ndWVzdHBhcnQgZGVsX2FsbF92aGJhczsKKwkJc3RydWN0IGRlbF92YnVzX2d1ZXN0cGFydCBkZWxfYWxsX3ZuaWNzOworCQkvKiBkZWxfYWxsX3ZidXNlcyBuZWVkcyBubyBwYXJhbWV0ZXJzICovCisJfTsKKwlzdHJ1Y3QgaW5pdF9jaGlwc2V0X2d1ZXN0cGFydCBpbml0X2NoaXBzZXQ7CisKK307CisKKyNpZm5kZWYgX194ZworI2RlZmluZSBfX3hnKHgpICgodm9sYXRpbGUgbG9uZyAqKSh4KSkKKyNlbmRpZgorCisvKgorKiAgQmVsb3cgY29kZSBpcyBhIGNvcHkgb2YgTGludXgga2VybmVsJ3MgY21weGNoZyBmdW5jdGlvbiBsb2NhdGVkIGF0CisqICB0aGlzIHBsYWNlCisqICBodHRwOi8vdGNzeGVvbjo4MDgwL3NvdXJjZS94cmVmLzAwdHJ1bmstQXBwT1MtbGludXgvaW5jbHVkZS9hc20teDg2L2NtcHhjaGdfNjQuaCM4NAorKiAgUmVhc29uIGZvciBjcmVhdGluZyBvdXIgb3duIHZlcnNpb24gb2YgY21weGNoZyBhbG9uZyB3aXRoCisqICBVSVNMSUJfTE9DS19QUkVGSVggaXMgdG8gbWFrZSB0aGUgb3BlcmF0aW9uIGF0b21pYyBldmVuIGZvciBub24gU01QCisqICBndWVzdHMuCisqLworCisjZGVmaW5lIHVpc2xpYmNtcHhjaGc2NChwLCBvLCBuLCBzKSBjbXB4Y2hnKHAsIG8sIG4pCisKKyNlbmRpZgkJCQkvKiBfX1VJU1FVRVVFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Vpc3RocmVhZC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Vpc3RocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMWZiYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdWlzdGhyZWFkLmgKQEAgLTAsMCArMSw0NiBAQAorLyogdWlzdGhyZWFkLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFVuaXN5cyB0aHJlYWQgdXRpbGl0aWVzIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fVUlTVEhSRUFEX0hfXworI2RlZmluZSBfX1VJU1RIUkVBRF9IX18KKworCisjaW5jbHVkZSAibGludXgvY29tcGxldGlvbi5oIgorCitzdHJ1Y3QgdWlzdGhyZWFkX2luZm8geworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwlpbnQgaWQ7CisJaW50IHNob3VsZF9zdG9wOworCXN0cnVjdCBjb21wbGV0aW9uIGhhc19zdG9wcGVkOworfTsKKworCisvKiByZXR1cm5zIDAgZm9yIGZhaWx1cmUsIDEgZm9yIHN1Y2Nlc3MgKi8KK2ludCB1aXN0aHJlYWRfc3RhcnQoCisJc3RydWN0IHVpc3RocmVhZF9pbmZvICp0aHJpbmZvLAorCWludCAoKnRocmVhZGZuKSh2b2lkICopLAorCXZvaWQgKnRocmNvbnRleHQsCisJY2hhciAqbmFtZSk7CisKK3ZvaWQgdWlzdGhyZWFkX3N0b3Aoc3RydWN0IHVpc3RocmVhZF9pbmZvICp0aHJpbmZvKTsKKworI2VuZGlmIC8qIF9fVUlTVEhSRUFEX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Vpc3V0aWxzLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdWlzdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmRhYjNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Vpc3V0aWxzLmgKQEAgLTAsMCArMSwzNDggQEAKKy8qIHVpc3V0aWxzLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qCisgKiBVbmlzeXMgVmlydHVhbCBIQkEgdXRpbGl0aWVzIGhlYWRlcgorICovCisKKyNpZm5kZWYgX19VSVNVVElMU19fSF9fCisjZGVmaW5lIF9fVUlTVVRJTFNfX0hfXworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKworI2luY2x1ZGUgInZtY2FsbGludGVyZmFjZS5oIgorI2luY2x1ZGUgImNoYW5uZWwuaCIKKyNpbmNsdWRlICJ1aXN0aHJlYWQuaCIKKyNpbmNsdWRlICJ1aXNxdWV1ZS5oIgorI2luY2x1ZGUgImRpYWdub3N0aWNzL2FwcG9zX3N1YnN5c3RlbXMuaCIKKyNpbmNsdWRlICJ2YnVzZGV2aWNlaW5mby5oIgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorCisvKiBUaGlzIGlzIHRoZSBNQUdJQyBudW1iZXIgc3R1ZmZlZCBieSB2aXJ0aGJhIGluIGhvc3QtPnRoaXNfaWQuIFVzZWQgdG8KKyAqIGlkZW50aWZ5IHZpcnR1YWwgaGJhcy4KKyAqLworI2RlZmluZSBVSVNfTUFHSUNfVkhCQSA3MDcKKworLyogZ2xvYmFsIGZ1bmN0aW9uIHBvaW50ZXJzIHRoYXQgYWN0IGFzIGNhbGxiYWNrIGZ1bmN0aW9ucyBpbnRvCisgKiB1aXNuaWNtb2QsIHVpc3NkbW9kLCBhbmQgdmlydHBjaW1vZAorICovCitleHRlcm4gaW50ICgqVWlzbmljQ29udHJvbENoYW5GdW5jKShzdHJ1Y3QgaW9fbXNncyAqKTsKK2V4dGVybiBpbnQgKCpVaXNzZENvbnRyb2xDaGFuRnVuYykoc3RydWN0IGlvX21zZ3MgKik7CitleHRlcm4gaW50ICgqVmlydENvbnRyb2xDaGFuRnVuYykoc3RydWN0IGd1ZXN0X21zZ3MgKik7CisKKy8qIFJldHVybiB2YWx1ZXMgb2YgYWJvdmUgY2FsbGJhY2sgZnVuY3Rpb25zOiAqLworI2RlZmluZSBDQ0ZfRVJST1IgICAgICAgIDAJLyogY29tcGxldGVkIGFuZCBmYWlsZWQgKi8KKyNkZWZpbmUgQ0NGX09LICAgICAgICAgICAxCS8qIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KKyNkZWZpbmUgQ0NGX1BFTkRJTkcgICAgICAyCS8qIG9wZXJhdGlvbiBzdGlsbCBwZW5kaW5nICovCitleHRlcm4gYXRvbWljX3QgVWlzVXRpbHNfUmVnaXN0ZXJlZF9TZXJ2aWNlczsKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgTUFDQVJSQVlbTUFYX01BQ0FERFJfTEVOXTsKK3R5cGVkZWYgc3RydWN0IFJlcUhhbmRsZXJJbmZvX3N0cnVjdCB7CisJR1VJRCBzd2l0Y2hUeXBlR3VpZDsKKwlpbnQgKCpjb250cm9sZnVuYykoc3RydWN0IGlvX21zZ3MgKik7CisJdW5zaWduZWQgbG9uZyBtaW5fY2hhbm5lbF9ieXRlczsKKwlpbnQgKCpTZXJ2ZXJfQ2hhbm5lbF9PaykodW5zaWduZWQgbG9uZyBjaGFubmVsQnl0ZXMpOworCWludCAoKlNlcnZlcl9DaGFubmVsX0luaXQpCisJICh2b2lkICp4LCB1bnNpZ25lZCBjaGFyICpjbGllbnRTdHIsIFUzMiBjbGllbnRTdHJMZW4sIFU2NCBieXRlcyk7CisJY2hhciBzd2l0Y2hfdHlwZV9uYW1lWzk5XTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RfbGluazsJLyogbGlua3MgaW50byBSZXFIYW5kbGVySW5mb19saXN0ICovCit9IFJlcUhhbmRsZXJJbmZvX3Q7CisKK1JlcUhhbmRsZXJJbmZvX3QgKlJlcUhhbmRsZXJBZGQoR1VJRCBzd2l0Y2hUeXBlR3VpZCwKKwkJCQljb25zdCBjaGFyICpzd2l0Y2hfdHlwZV9uYW1lLAorCQkJCWludCAoKmNvbnRyb2xmdW5jKShzdHJ1Y3QgaW9fbXNncyAqKSwKKwkJCQl1bnNpZ25lZCBsb25nIG1pbl9jaGFubmVsX2J5dGVzLAorCQkJCWludCAoKlNlcnZlcl9DaGFubmVsX09rKSh1bnNpZ25lZCBsb25nCisJCQkJCQkJIGNoYW5uZWxCeXRlcyksCisJCQkJaW50ICgqU2VydmVyX0NoYW5uZWxfSW5pdCkKKwkJCQkgKHZvaWQgKngsIHVuc2lnbmVkIGNoYXIgKmNsaWVudFN0ciwKKwkJCQkgIFUzMiBjbGllbnRTdHJMZW4sIFU2NCBieXRlcykpOworUmVxSGFuZGxlckluZm9fdCAqUmVxSGFuZGxlckZpbmQoR1VJRCBzd2l0Y2hUeXBlR3VpZCk7CitpbnQgUmVxSGFuZGxlckRlbChHVUlEIHN3aXRjaFR5cGVHdWlkKTsKKworI2RlZmluZSB1aXNsaWJfaW9yZW1hcF9jYWNoZShhZGRyLCBzaXplKSBcCisJZGJnX2lvcmVtYXBfY2FjaGUoYWRkciwgc2l6ZSwgX19GSUxFX18sIF9fTElORV9fKQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqCitkYmdfaW9yZW1hcF9jYWNoZShVNjQgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKwl2b2lkIF9faW9tZW0gKm5ldzsKKwluZXcgPSBpb3JlbWFwX2NhY2hlKGFkZHIsIHNpemUpOworCXJldHVybiBuZXc7Cit9CisKKyNkZWZpbmUgdWlzbGliX2lvcmVtYXAoYWRkciwgc2l6ZSkgZGJnX2lvcmVtYXAoYWRkciwgc2l6ZSwgX19GSUxFX18sIF9fTElORV9fKQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgorZGJnX2lvcmVtYXAoVTY0IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7CisJdm9pZCAqbmV3OworCW5ldyA9IGlvcmVtYXAoYWRkciwgc2l6ZSk7CisJcmV0dXJuIG5ldzsKK30KKworI2RlZmluZSB1aXNsaWJfaW91bm1hcChhZGRyKSBkYmdfaW91bm1hcChhZGRyLCBfX0ZJTEVfXywgX19MSU5FX18pCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZGJnX2lvdW5tYXAodm9pZCBfX2lvbWVtICphZGRyLCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKwlpb3VubWFwKGFkZHIpOworfQorCisjZGVmaW5lIFBST0NfUkVBRF9CVUZGRVJfU0laRSAxMzEwNzIJLyogc2l6ZSBvZiB0aGUgYnVmZmVyIHRvIGFsbG9jYXRlIHRvCisJCQkJCSAqIGhvbGQgYWxsIG9mIC9wcm9jL1hYWC9pbmZvICovCitpbnQgdWlzdXRpbF9hZGRfcHJvY19saW5lX2V4KGludCAqdG90YWwsIGNoYXIgKipidWZmZXIsIGludCAqYnVmZmVyX3JlbWFpbmluZywKKwkJCSAgICAgY2hhciAqZm9ybWF0LCAuLi4pOworCitpbnQgdWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcihpbnQgdHlwZSwgdm9pZCAqZnB0ciwKKwkJCQkgVUxUUkFfVkJVU19ERVZJQ0VJTkZPICpjaGlwc2V0X0RyaXZlckluZm8pOworaW50IHVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXJfZXgoR1VJRCBzd2l0Y2hUeXBlR3VpZCwKKwkJCQkgICAgY29uc3QgY2hhciAqc3dpdGNoX3R5cGVfbmFtZSwKKwkJCQkgICAgaW50ICgqZnB0cikoc3RydWN0IGlvX21zZ3MgKiksCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgbWluX2NoYW5uZWxfYnl0ZXMsCisJCQkJICAgIGludCAoKlNlcnZlcl9DaGFubmVsX09rKSh1bnNpZ25lZCBsb25nCisJCQkJCQkJICAgICBjaGFubmVsQnl0ZXMpLAorCQkJCSAgICBpbnQgKCpTZXJ2ZXJfQ2hhbm5lbF9Jbml0KQorCQkJCSAgICAodm9pZCAqeCwgdW5zaWduZWQgY2hhciAqY2xpZW50U3RyLAorCQkJCSAgICAgVTMyIGNsaWVudFN0ckxlbiwgVTY0IGJ5dGVzKSwKKwkJCQkgICAgVUxUUkFfVkJVU19ERVZJQ0VJTkZPICpjaGlwc2V0X0RyaXZlckluZm8pOworCitpbnQgdWlzY3RybF91bnJlZ2lzdGVyX3JlcV9oYW5kbGVyX2V4KEdVSUQgc3dpdGNoVHlwZUd1aWQpOwordW5zaWduZWQgY2hhciAqdXRpbF9tYXBfdmlydChzdHJ1Y3QgcGh5c19pbmZvICpzZyk7Cit2b2lkIHV0aWxfdW5tYXBfdmlydChzdHJ1Y3QgcGh5c19pbmZvICpzZyk7Cit1bnNpZ25lZCBjaGFyICp1dGlsX21hcF92aXJ0X2F0b21pYyhzdHJ1Y3QgcGh5c19pbmZvICpzZyk7Cit2b2lkIHV0aWxfdW5tYXBfdmlydF9hdG9taWModm9pZCAqYnVmKTsKK2ludCB1aXNsaWJfc2VydmVyX2luamVjdF9hZGRfdm5pYyhVMzIgc3dpdGNoTm8sIFUzMiBCdXNObywgVTMyIG51bUludFBvcnRzLAorCQkJCSAgVTMyIG51bUV4dFBvcnRzLCBNQUNBUlJBWSBwbWFjW10sCisJCQkJICBwQ0hBTk5FTF9IRUFERVIgKipjaGFuKTsKK3ZvaWQgdWlzbGliX3NlcnZlcl9pbmplY3RfZGVsX3ZuaWMoVTMyIHN3aXRjaE5vLCBVMzIgYnVzTm8sIFUzMiBudW1JbnRQb3J0cywKKwkJCQkgICBVMzIgbnVtRXh0UG9ydHMpOworaW50IHVpc2xpYl9jbGllbnRfaW5qZWN0X2FkZF9idXMoVTMyIGJ1c05vLCBHVUlEIGluc3RHdWlkLAorCQkJCSBVNjQgY2hhbm5lbEFkZHIsIHVsb25nIG5DaGFubmVsQnl0ZXMpOworaW50ICB1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfYnVzKFUzMiBidXNObyk7CisKK2ludCB1aXNsaWJfY2xpZW50X2luamVjdF9hZGRfdmhiYShVMzIgYnVzTm8sIFUzMiBkZXZObywKKwkJCQkgIFU2NCBwaHlzX2NoYW5fYWRkciwgVTMyIGNoYW5fYnl0ZXMsCisJCQkJICBpbnQgaXNfdGVzdF9hZGRyLCBHVUlEIGluc3RHdWlkLAorCQkJCSAgc3RydWN0IEludGVycnVwdEluZm8gKmludHIpOworaW50ICB1aXNsaWJfY2xpZW50X2luamVjdF9wYXVzZV92aGJhKFUzMiBidXNObywgVTMyIGRldk5vKTsKK2ludCAgdWlzbGliX2NsaWVudF9pbmplY3RfcmVzdW1lX3ZoYmEoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pOworaW50IHVpc2xpYl9jbGllbnRfaW5qZWN0X2RlbF92aGJhKFUzMiBidXNObywgVTMyIGRldk5vKTsKK2ludCB1aXNsaWJfY2xpZW50X2luamVjdF9hZGRfdm5pYyhVMzIgYnVzTm8sIFUzMiBkZXZObywKKwkJCQkgIFU2NCBwaHlzX2NoYW5fYWRkciwgVTMyIGNoYW5fYnl0ZXMsCisJCQkJICBpbnQgaXNfdGVzdF9hZGRyLCBHVUlEIGluc3RHdWlkLAorCQkJCSAgc3RydWN0IEludGVycnVwdEluZm8gKmludHIpOworaW50IHVpc2xpYl9jbGllbnRfaW5qZWN0X3BhdXNlX3ZuaWMoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pOworaW50IHVpc2xpYl9jbGllbnRfaW5qZWN0X3Jlc3VtZV92bmljKFUzMiBidXNObywgVTMyIGRldk5vKTsKK2ludCB1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfdm5pYyhVMzIgYnVzTm8sIFUzMiBkZXZObyk7CisjaWZkZWYgU1RPUkFHRV9DSEFOTkVMCitVNjQgdWlzbGliX3N0b3JhZ2VfY2hhbm5lbChpbnQgY2xpZW50X2lkKTsKKyNlbmRpZgoraW50IHVpc2xpYl9nZXRfb3duZWRfcGRlc3Qoc3RydWN0IHVpc3Njc2lfZGVzdCAqcGRlc3QpOworCitpbnQgdWlzbGliX3NlbmRfZXZlbnQoQ09OVFJPTFZNX0lEIGlkLCBDT05UUk9MVk1fTUVTU0FHRV9QQUNLRVQgKmV2ZW50KTsKKworLyogc3RydWN0dXJlIHVzZWQgYnkgdmhiYSAmIHZuaWMgdG8ga2VlcCB0cmFjayBvZiBxdWV1ZSAmIHRocmVhZCBpbmZvICovCitzdHJ1Y3QgY2hhbmluZm8geworCXN0cnVjdCB1aXNxdWV1ZV9pbmZvICpxdWV1ZWluZm87CisJLyogdGhpcyBzcGVjaWZpZXMgdGhlIHF1ZXVlIHN0cnVjdHVyZXMgZm9yIGEgY2hhbm5lbCAqLworCS8qIEFMTE9DQVRFRCBCWSBUSEUgT1RIRVIgRU5EIC0gV0UgSlVTVCBHRVQgQSBQT0lOVEVSIFRPIFRIRSBNRU1PUlkgKi8KKwlzcGlubG9ja190IGluc2VydGxvY2s7CisJLyogY3VycmVudGx5IHVzZWQgb25seSBpbiB2aXJ0bmljIHdoZW4gc2VuZGluZyBkYXRhIHRvIHVpc25pYyAqLworCS8qIHRvIHN5bmNocm9uaXplIHRoZSBpbnNlcnRzIGludG8gdGhlIHNpZ25hbCBxdWV1ZSAqLworCXN0cnVjdCB1aXN0aHJlYWRfaW5mbyB0aHJlYWRpbmZvOworCS8qIHRoaXMgc3BlY2lmaWVzIHRoZSB0aHJlYWQgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSB0aHJlYWQgdGhhdCAqLworCS8qIGhhbmRsZXMgdGhpcyBjaGFubmVsICovCit9OworCisvKiB0aGlzIGlzIHRoZSB3YWl0IGNvZGUgZm9yIGFsbCB0aGUgdGhyZWFkcyAtIGl0IGlzIHVzZWQgdG8gZ2V0CisqIHNvbWV0aGluZyBmcm9tIGEgcXVldWUgY2hvaWNlczogd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlLAorKiBfdGltZW91dCwgaW50ZXJydXB0aWJsZV90aW1lb3V0CisqLworI2RlZmluZSBVSVNfVEhSRUFEX1dBSVRfTVNFQyh4KSB7IFwKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOyBcCisJc2NoZWR1bGVfdGltZW91dChtc2Vjc190b19qaWZmaWVzKHgpKTsgXAorfQorI2RlZmluZSBVSVNfVEhSRUFEX1dBSVRfVVNFQyh4KSB7IFwKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOyBcCisJc2NoZWR1bGVfdGltZW91dCh1c2Vjc190b19qaWZmaWVzKHgpKTsgXAorfQorI2RlZmluZSBVSVNfVEhSRUFEX1dBSVQgVUlTX1RIUkVBRF9XQUlUX01TRUMoNSkKKyNkZWZpbmUgVUlTX1RIUkVBRF9XQUlUX1NFQyh4KSB7IFwKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOyBcCisJc2NoZWR1bGVfdGltZW91dCgoeCkqSFopOyBcCit9CisKKy8qIFRoaXMgaXMgYSBoYWNrIHVudGlsIHdlIGZpeCBJT1ZNIHRvIGluaXRpYWxpemUgdGhlIGNoYW5uZWwgaGVhZGVyCisgKiBjb3JyZWN0bHkgYXQgREVWSUNFX0NSRUFURSB0aW1lLCBJTlNURUFEIE9GIHdhaXRpbmcgdW50aWwKKyAqIERFVklDRV9DT05GSUdVUkUgdGltZS4KKyAqLworI2RlZmluZSBXQUlUX0ZPUl9WQUxJRF9HVUlEKGd1aWQpIFwKKwlkbyB7CQkJCQkJICAgXAorCQl3aGlsZSAoTUVNQ01QX0lPKCZndWlkLCAmR3VpZDAsIHNpemVvZihHdWlkMCkpID09IDApIHsJXAorCQkJTE9HRVJSKCJXYWl0aW5nIGZvciBub24tMCBHVUlEICh3aHk/Pz8pLi4uXG4iKTsgXAorCQkJVUlTX1RIUkVBRF9XQUlUX1NFQyg1KTsJCQkJXAorCQl9CQkJCQkJCVwKKwkJTE9HRVJSKCJPSy4uLiBHVUlEIGlzIG5vbi0wIG5vd1xuIik7CQkJXAorCX0gd2hpbGUgKDApCisKKy8qIENvcHlGcmFnc0luZm9Gcm9tU2tiIHJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGFkZGVkIHRvIGZyYWdzIGFycmF5CisgKiBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuCisgKi8KK3Vuc2lnbmVkIGludCB1aXN1dGlsX2NvcHlfZnJhZ3NpbmZvX2Zyb21fc2tiKHVuc2lnbmVkIGNoYXIgKmNhbGxpbmdfY3R4LAorCQkJCQkgICAgIHZvaWQgKnNrYl9pbiwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgZmlyc3RmcmFnbGVuLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBmcmFnc19tYXgsCisJCQkJCSAgICAgc3RydWN0IHBoeXNfaW5mbyBmcmFnc1tdKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK0lzc3VlX1ZNQ0FMTF9JT19DT05UUk9MVk1fQUREUihVNjQgKkNvbnRyb2xBZGRyZXNzLCBVMzIgKkNvbnRyb2xCeXRlcykKK3sKKwlWTUNBTExfSU9fQ09OVFJPTFZNX0FERFJfUEFSQU1TIHBhcmFtczsKKwlpbnQgcmVzdWx0ID0gVk1DQUxMX1NVQ0NFU1M7CisJVTY0IHBoeXNhZGRyOworCisJcGh5c2FkZHIgPSB2aXJ0X3RvX3BoeXMoJnBhcmFtcyk7CisJSVNTVUVfSU9fVk1DQUxMKFZNQ0FMTF9JT19DT05UUk9MVk1fQUREUiwgcGh5c2FkZHIsIHJlc3VsdCk7CisJaWYgKFZNQ0FMTF9TVUNDRVNTRlVMKHJlc3VsdCkpIHsKKwkJKkNvbnRyb2xBZGRyZXNzID0gcGFyYW1zLkNoYW5uZWxBZGRyZXNzOworCQkqQ29udHJvbEJ5dGVzID0gcGFyYW1zLkNoYW5uZWxCeXRlczsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgSXNzdWVfVk1DQUxMX0lPX0RJQUdfQUREUihVNjQgKkRpYWdDaGFubmVsQWRkcmVzcykKK3sKKwlWTUNBTExfSU9fRElBR19BRERSX1BBUkFNUyBwYXJhbXM7CisJaW50IHJlc3VsdCA9IFZNQ0FMTF9TVUNDRVNTOworCVU2NCBwaHlzYWRkcjsKKworCXBoeXNhZGRyID0gdmlydF90b19waHlzKCZwYXJhbXMpOworCUlTU1VFX0lPX1ZNQ0FMTChWTUNBTExfSU9fRElBR19BRERSLCBwaHlzYWRkciwgcmVzdWx0KTsKKwlpZiAoVk1DQUxMX1NVQ0NFU1NGVUwocmVzdWx0KSkKKwkJKkRpYWdDaGFubmVsQWRkcmVzcyA9IHBhcmFtcy5DaGFubmVsQWRkcmVzczsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorSXNzdWVfVk1DQUxMX0lPX1ZJU09SU0VSSUFMX0FERFIoVTY0ICpEaWFnQ2hhbm5lbEFkZHJlc3MpCit7CisJVk1DQUxMX0lPX1ZJU09SU0VSSUFMX0FERFJfUEFSQU1TIHBhcmFtczsKKwlpbnQgcmVzdWx0ID0gVk1DQUxMX1NVQ0NFU1M7CisJVTY0IHBoeXNhZGRyOworCisJcGh5c2FkZHIgPSB2aXJ0X3RvX3BoeXMoJnBhcmFtcyk7CisJSVNTVUVfSU9fVk1DQUxMKFZNQ0FMTF9JT19WSVNPUlNFUklBTF9BRERSLCBwaHlzYWRkciwgcmVzdWx0KTsKKwlpZiAoVk1DQUxMX1NVQ0NFU1NGVUwocmVzdWx0KSkKKwkJKkRpYWdDaGFubmVsQWRkcmVzcyA9IHBhcmFtcy5DaGFubmVsQWRkcmVzczsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIFM2NCBJc3N1ZV9WTUNBTExfUVVFUllfR1VFU1RfVklSVFVBTF9USU1FX09GRlNFVCh2b2lkKQoreworCVU2NCByZXN1bHQgPSBWTUNBTExfU1VDQ0VTUzsKKwlVNjQgcGh5c2FkZHIgPSAwOworCisJSVNTVUVfSU9fVk1DQUxMKFZNQ0FMTF9RVUVSWV9HVUVTVF9WSVJUVUFMX1RJTUVfT0ZGU0VULCBwaHlzYWRkciwKKwkJCXJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBTNjQgSXNzdWVfVk1DQUxMX01FQVNVUkVNRU5UX0RPX05PVEhJTkcodm9pZCkKK3sKKwlVNjQgcmVzdWx0ID0gVk1DQUxMX1NVQ0NFU1M7CisJVTY0IHBoeXNhZGRyID0gMDsKKworCUlTU1VFX0lPX1ZNQ0FMTChWTUNBTExfTUVBU1VSRU1FTlRfRE9fTk9USElORywgcGh5c2FkZHIsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RydWN0IGxvZ19pbmZvX3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbG9uZyBsYXN0X2N5Y2xlczsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZGVsdGFfc3VtWzY0XTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZGVsdGFfY250WzY0XTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWF4X2RlbHRhWzY0XTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWluX2RlbHRhWzY0XTsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IElzc3VlX1ZNQ0FMTF9VUERBVEVfUEhZU0lDQUxfVElNRShVNjQgYWRqdXN0bWVudCkKK3sKKwlpbnQgcmVzdWx0ID0gVk1DQUxMX1NVQ0NFU1M7CisKKwlJU1NVRV9JT19WTUNBTEwoVk1DQUxMX1VQREFURV9QSFlTSUNBTF9USU1FLCBhZGp1c3RtZW50LCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitJc3N1ZV9WTUNBTExfQ0hBTk5FTF9NSVNNQVRDSChjb25zdCBjaGFyICpDaGFubmVsTmFtZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKkl0ZW1OYW1lLAorCQkJICAgICAgVTMyIFNvdXJjZUxpbmVOdW1iZXIsIGNvbnN0IGNoYXIgKnBhdGhfbl9mbikKK3sKKwlWTUNBTExfQ0hBTk5FTF9WRVJTSU9OX01JU01BVENIX1BBUkFNUyBwYXJhbXM7CisJaW50IHJlc3VsdCA9IFZNQ0FMTF9TVUNDRVNTOworCVU2NCBwaHlzYWRkcjsKKwljaGFyICpsYXN0X3NsYXNoID0gTlVMTDsKKworCXN0cm5jcHkocGFyYW1zLkNoYW5uZWxOYW1lLCBDaGFubmVsTmFtZSwKKwkJbGVuZ3Rob2YoVk1DQUxMX0NIQU5ORUxfVkVSU0lPTl9NSVNNQVRDSF9QQVJBTVMsIENoYW5uZWxOYW1lKSk7CisJc3RybmNweShwYXJhbXMuSXRlbU5hbWUsIEl0ZW1OYW1lLAorCQlsZW5ndGhvZihWTUNBTExfQ0hBTk5FTF9WRVJTSU9OX01JU01BVENIX1BBUkFNUywgSXRlbU5hbWUpKTsKKwlwYXJhbXMuU291cmNlTGluZU51bWJlciA9IFNvdXJjZUxpbmVOdW1iZXI7CisKKwlsYXN0X3NsYXNoID0gc3RycmNocihwYXRoX25fZm4sICcvJyk7CisJaWYgKGxhc3Rfc2xhc2ggIT0gTlVMTCkgeworCQlsYXN0X3NsYXNoKys7CisJCXN0cm5jcHkocGFyYW1zLlNvdXJjZUZpbGVOYW1lLCBsYXN0X3NsYXNoLAorCQkJbGVuZ3Rob2YoVk1DQUxMX0NIQU5ORUxfVkVSU0lPTl9NSVNNQVRDSF9QQVJBTVMsCisJCQkJIFNvdXJjZUZpbGVOYW1lKSk7CisJfSBlbHNlCisJCXN0cm5jcHkocGFyYW1zLlNvdXJjZUZpbGVOYW1lLAorCQkJIkNhbm5vdCBkZXRlcm1pbmUgc291cmNlIGZpbGVuYW1lIiwKKwkJCWxlbmd0aG9mKFZNQ0FMTF9DSEFOTkVMX1ZFUlNJT05fTUlTTUFUQ0hfUEFSQU1TLAorCQkJCSBTb3VyY2VGaWxlTmFtZSkpOworCisJcGh5c2FkZHIgPSB2aXJ0X3RvX3BoeXMoJnBhcmFtcyk7CisJSVNTVUVfSU9fVk1DQUxMKFZNQ0FMTF9DSEFOTkVMX1ZFUlNJT05fTUlTTUFUQ0gsIHBoeXNhZGRyLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IElzc3VlX1ZNQ0FMTF9GQVRBTF9CWUVfQllFKHZvaWQpCit7CisJaW50IHJlc3VsdCA9IFZNQ0FMTF9TVUNDRVNTOworCVU2NCBwaHlzYWRkciA9IDA7CisKKwlJU1NVRV9JT19WTUNBTEwoVk1DQUxMX0dFTkVSSUNfU1VSUkVOREVSX1FVQU5UVU1fRk9SRVZFUiwgcGh5c2FkZHIsCisJCQlyZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKyNkZWZpbmUgVUlTX0RBRU1PTklaRShuYW0pCit2b2lkICp1aXNsaWJfY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKmN1cl9wb29sLCBjaGFyICpmbiwgaW50IGxuKTsKKyNkZWZpbmUgVUlTQ0FDSEVBTExPQyhjdXJfcG9vbCkgdWlzbGliX2NhY2hlX2FsbG9jKGN1cl9wb29sLCBfX0ZJTEVfXywgX19MSU5FX18pCit2b2lkIHVpc2xpYl9jYWNoZV9mcmVlKHN0cnVjdCBrbWVtX2NhY2hlICpjdXJfcG9vbCwgdm9pZCAqcCwgY2hhciAqZm4sIGludCBsbik7CisjZGVmaW5lIFVJU0NBQ0hFRlJFRShjdXJfcG9vbCwgcCkgXAorCXVpc2xpYl9jYWNoZV9mcmVlKGN1cl9wb29sLCBwLCBfX0ZJTEVfXywgX19MSU5FX18pCisKK3ZvaWQgdWlzbGliX2VuYWJsZV9jaGFubmVsX2ludGVycnVwdHMoVTMyIGJ1c05vLCBVMzIgZGV2Tm8sCisJCQkJICAgICAgaW50ICgqaW50ZXJydXB0KSh2b2lkICopLAorCQkJCSAgICAgIHZvaWQgKmludGVycnVwdF9jb250ZXh0KTsKK3ZvaWQgdWlzbGliX2Rpc2FibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKFUzMiBidXNObywgVTMyIGRldk5vKTsKK3ZvaWQgdWlzbGliX2ZvcmNlX2NoYW5uZWxfaW50ZXJydXB0KFUzMiBidXNObywgVTMyIGRldk5vKTsKKworI2VuZGlmIC8qIF9fVUlTVVRJTFNfX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3VuaWtsb2cuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91bmlrbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3Yjg3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91bmlrbG9nLmgKQEAgLTAsMCArMSwxOTMgQEAKKy8qIHVuaWtsb2cuaAorICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyogVGhpcyBtb2R1bGUgY29udGFpbnMgbWFjcm9zIHRvIGFpZCBkZXZlbG9wZXJzIGluIGxvZ2dpbmcgbWVzc2FnZXMuCisgKgorICogVGhpcyBtb2R1bGUgaXMgYWZmZWN0ZWQgYnkgdGhlIERFQlVHIGNvbXBpbGV0aW1lIG9wdGlvbi4KKyAqCisgKi8KKyNpZm5kZWYgX19VTklLTE9HX0hfXworI2RlZmluZSBfX1VOSUtMT0dfSF9fCisKKworI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgorCisvKgorICogIyBEQkdJTkYKKyAqCisgKiBcYnJpZWYgTG9nIGRlYnVnIGluZm9ybWF0aW9uYWwgbWVzc2FnZSAtIGxvZyBhIExPR19JTkZPIG1lc3NhZ2Ugb25seQorICogICAgICAgIGlmIERFQlVHIGNvbXBpbGV0aW1lIG9wdGlvbiBlbmFibGVkCisgKgorICogXHBhcmFtIGRldm5hbWUgdGhlIGRldmljZSBuYW1lIG9mIHRoZSBkZXZpY2UgcmVwb3J0aW5nIHRoaXMgbWVzc2FnZSwgb3IKKyAqICAgICAgICAgICAgICAgIE5VTEwgaWYgdGhpcyBtZXNzYWdlIGlzIE5PVCBkZXZpY2UtcmVsYXRlZC4KKyAqIFxwYXJhbSBmbXQgcHJpbnRmKCktc3R5bGUgZm9ybWF0IHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRvIGxvZy4KKyAqIFxwYXJhbSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYW5kIGluc2VydGVkIGludG8gdGhlCisgKiAgICAgICAgICAgICBmb3JtYXQgc3RyaW5nLgorICogXHJldHVybiBub3RoaW5nCisgKgorICogTG9nIGEgbWVzc2FnZSBhdCB0aGUgTE9HX0lORk8gbGV2ZWwsIGJ1dCBvbmx5IGlmIERFQlVHIGlzIGVuYWJsZWQuICBJZgorICogREVCVUcgaXMgZGlzYWJsZWQsIHRoaXMgZXhwYW5kcyB0byBhIG5vLW9wLgorICovCisKKy8qCisgKiAjIERCR1ZFUgorICoKKyAqIFxicmllZiBMb2cgZGVidWcgdmVyYm9zZSBtZXNzYWdlIC0gbG9nIGEgTE9HX0RFQlVHIG1lc3NhZ2Ugb25seSBpZgorICogICAgICAgIERFQlVHIGNvbXBpbGV0aW1lIG9wdGlvbiBlbmFibGVkCisgKgorICogXHBhcmFtIGRldm5hbWUgdGhlIGRldmljZSBuYW1lIG9mIHRoZSBkZXZpY2UgcmVwb3J0aW5nIHRoaXMgbWVzc2FnZSwgb3IKKyAqICAgICAgICAgICAgICAgIE5VTEwgaWYgdGhpcyBtZXNzYWdlIGlzIE5PVCBkZXZpY2UtcmVsYXRlZC4KKyAqIFxwYXJhbSBmbXQgcHJpbnRmKCktc3R5bGUgZm9ybWF0IHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRvIGxvZy4KKyAqIFxwYXJhbSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYW5kIGluc2VydGVkIGludG8gdGhlCisgKiAgICAgICAgICAgICBmb3JtYXQgc3RyaW5nLgorICogXHJldHVybiBub3RoaW5nCisgKgorICogTG9nIGEgbWVzc2FnZSBhdCB0aGUgTE9HX0RFQlVHIGxldmVsLCBidXQgb25seSBpZiBERUJVRyBpcyBlbmFibGVkLiAgSWYKKyAqIERFQlVHIGlzIGRpc2FibGVkLCB0aGlzIGV4cGFuZHMgdG8gYSBuby1vcC4gIE5vdGUgYWxzbyB0aGF0IExPR19ERUJVRworICogbWVzc2FnZXMgY2FuIGJlIGVuYWJsZWQvZGlzYWJsZWQgYXQgcnVudGltZSBhcyB3ZWxsLgorICovCisjZGVmaW5lIERCR0lORkRFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pICAgICAgICBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIERCR1ZFUkRFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pICAgICAgICBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIERCR0lORihmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIERCR1ZFUihmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICBkbyB7IH0gd2hpbGUgKDApCisKKy8qCisgKiAjIExPR0lORgorICoKKyAqIFxicmllZiBMb2cgaW5mb3JtYXRpb25hbCBtZXNzYWdlIC0gbG9ncyBhIG1lc3NhZ2UgYXQgdGhlIExPR19JTkZPIGxldmVsCisgKgorICogXHBhcmFtIGRldm5hbWUgdGhlIGRldmljZSBuYW1lIG9mIHRoZSBkZXZpY2UgcmVwb3J0aW5nIHRoaXMgbWVzc2FnZSwgb3IKKyAqICAgICAgICAgICAgICAgIE5VTEwgaWYgdGhpcyBtZXNzYWdlIGlzIE5PVCBkZXZpY2UtcmVsYXRlZC4KKyAqIFxwYXJhbSBmbXQgcHJpbnRmKCktc3R5bGUgZm9ybWF0IHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRvIGxvZy4KKyAqIFxwYXJhbSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYW5kIGluc2VydGVkIGludG8gdGhlCisgKiAgICAgICAgICAgICBmb3JtYXQgc3RyaW5nLgorICogXHJldHVybiBub3RoaW5nCisgKgorICogTG9ncyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgYXQgdGhlIExPR19JTkZPIGxldmVsLgorICovCisKKyNkZWZpbmUgTE9HSU5GKGZtdCwgYXJncy4uLikgcHJfaW5mbyhmbXQsICMjIGFyZ3MpCisjZGVmaW5lIExPR0lORkRFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pIFwKKwlwcl9pbmZvKCIlcyAiIGZtdCwgZGV2bmFtZSwgIyMgYXJncykKKyNkZWZpbmUgTE9HSU5GREVWWChkZXZubywgZm10LCBhcmdzLi4uKSBcCisJcHJfaW5mbygiZGV2JWQgIiBmbXQsIGRldm5vLCAjIyBhcmdzKQorI2RlZmluZSBMT0dJTkZOQU1FKHZuaWMsIGZtdCwgYXJncy4uLikJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKHZuaWMgIT0gTlVMTCkgewkJCQkJXAorCQkJcHJfaW5mbygiJXMgIiBmbXQsIHZuaWMtPm5hbWUsICMjIGFyZ3MpOwlcCisJCX0gZWxzZSB7CQkJCQkJXAorCQkJcHJfaW5mbyhmbXQsICMjIGFyZ3MpOwkJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisKKy8qCisgKiAjIExPR1ZFUgorICoKKyAqIFxicmllZiBMb2cgdmVyYm9zZSBtZXNzYWdlIC0gbG9ncyBhIG1lc3NhZ2UgYXQgdGhlIExPR19ERUJVRyBsZXZlbCwKKyAqICAgICAgICB3aGljaCBjYW4gYmUgZGlzYWJsZWQgYXQgcnVudGltZQorICoKKyAqIFxwYXJhbSBkZXZuYW1lIHRoZSBkZXZpY2UgbmFtZSBvZiB0aGUgZGV2aWNlIHJlcG9ydGluZyB0aGlzIG1lc3NhZ2UsIG9yCisgKiAgICAgICAgICAgICAgICBOVUxMIGlmIHRoaXMgbWVzc2FnZSBpcyBOT1QgZGV2aWNlLXJlbGF0ZWQuCisgKiBccGFyYW0gZm10IHByaW50ZigpLXN0eWxlIGZvcm1hdCBzdHJpbmcgY29udGFpbmluZyB0aGUgbWVzc2FnZSB0byBsb2cuCisgKiBccGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgZm9ybWF0dGVkIGFuZCBpbnNlcnRlZCBpbnRvIHRoZSBmb3JtYXQKKyAqIFxwYXJhbSBzdHJpbmcuCisgKiBccmV0dXJuIG5vdGhpbmcKKyAqCisgKiBMb2dzIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhdCB0aGUgTE9HX0RFQlVHIGxldmVsLiAgTm90ZSBhbHNvIHRoYXQKKyAqIExPR19ERUJVRyBtZXNzYWdlcyBjYW4gYmUgZW5hYmxlZC9kaXNhYmxlZCBhdCBydW50aW1lIGFzIHdlbGwuCisgKi8KKyNkZWZpbmUgTE9HVkVSKGZtdCwgYXJncy4uLikgcHJfZGVidWcoZm10LCAjIyBhcmdzKQorI2RlZmluZSBMT0dWRVJERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSBcCisJcHJfZGVidWcoIiVzICIgZm10LCBkZXZuYW1lLCAjIyBhcmdzKQorI2RlZmluZSBMT0dWRVJOQU1FKHZuaWMsIGZtdCwgYXJncy4uLikJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmICh2bmljICE9IE5VTEwpIHsJCQkJCVwKKwkJCXByX2RlYnVnKCIlcyAiIGZtdCwgdm5pYy0+bmFtZSwgIyMgYXJncyk7CVwKKwkJfSBlbHNlIHsJCQkJCQlcCisJCQlwcl9kZWJ1ZyhmbXQsICMjIGFyZ3MpOwkJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisKKworLyoKKyAqICMgTE9HRVJSCisgKgorICogXGJyaWVmIExvZyBlcnJvciBtZXNzYWdlIC0gbG9ncyBhIG1lc3NhZ2UgYXQgdGhlIExPR19FUlIgbGV2ZWwsCisgKiAgICAgICAgaW5jbHVkaW5nIHNvdXJjZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbgorICoKKyAqIFxwYXJhbSBkZXZuYW1lIHRoZSBkZXZpY2UgbmFtZSBvZiB0aGUgZGV2aWNlIHJlcG9ydGluZyB0aGlzIG1lc3NhZ2UsIG9yCisgKiAgICAgICAgICAgICAgICBOVUxMIGlmIHRoaXMgbWVzc2FnZSBpcyBOT1QgZGV2aWNlLXJlbGF0ZWQuCisgKiBccGFyYW0gZm10IHByaW50ZigpLXN0eWxlIGZvcm1hdCBzdHJpbmcgY29udGFpbmluZyB0aGUgbWVzc2FnZSB0byBsb2cuCisgKiBccGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgZm9ybWF0dGVkIGFuZCBpbnNlcnRlZCBpbnRvIHRoZSBmb3JtYXQKKyAqIFxwYXJhbSBzdHJpbmcuCisgKiBccmV0dXJuIG5vdGhpbmcKKyAqCisgKiBMb2dzIHRoZSBzcGVjaWZpZWQgZXJyb3IgbWVzc2FnZSBhdCB0aGUgTE9HX0VSUiBsZXZlbC4gIEl0IHdpbGwgYWxzbworICogaW5jbHVkZSB0aGUgZmlsZSwgbGluZSBudW1iZXIsIGFuZCBmdW5jdGlvbiBuYW1lIG9mIHdoZXJlIHRoZSBlcnJvcgorICogb3JpZ2luYXRlZCBpbiB0aGUgbG9nIG1lc3NhZ2UuCisgKi8KKyNkZWZpbmUgTE9HRVJSKGZtdCwgYXJncy4uLikgcHJfZXJyKGZtdCwgIyMgYXJncykKKyNkZWZpbmUgTE9HRVJSREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgXAorCXByX2VycigiJXMgIiBmbXQsIGRldm5hbWUsICMjIGFyZ3MpCisjZGVmaW5lIExPR0VSUkRFVlgoZGV2bm8sIGZtdCwgYXJncy4uLikgXAorCXByX2VycigiZGV2JWQgIiBmbXQsIGRldm5vLCAjIyBhcmdzKQorI2RlZmluZSBMT0dFUlJOQU1FKHZuaWMsIGZtdCwgYXJncy4uLikJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKHZuaWMgIT0gTlVMTCkgewkJCQkJXAorCQkJcHJfZXJyKCIlcyAiIGZtdCwgdm5pYy0+bmFtZSwgIyMgYXJncyk7CVwKKwkJfSBlbHNlIHsJCQkJCQlcCisJCQlwcl9lcnIoZm10LCAjIyBhcmdzKTsJCQkJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBMT0dPUkRVTVBFUlIoc2VxZmlsZSwgZm10LCBhcmdzLi4uKSBkbyB7CQlcCisJCWlmIChzZXFmaWxlKSB7CQkJCQlcCisJCQlzZXFfcHJpbnRmKHNlcWZpbGUsIGZtdCwgIyMgYXJncyk7CVwKKwkJfSBlbHNlIHsJCQkJCVwKKwkJCUxPR0VSUihmbXQsICMjIGFyZ3MpOwkJCVwKKwkJfQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisvKgorICogIyBMT0dXUk4KKyAqCisgKiBcYnJpZWYgTG9nIHdhcm5pbmcgbWVzc2FnZSAtIExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBMT0dfV0FSTklORyBsZXZlbCwKKyAqICAgICAgICBpbmNsdWRpbmcgc291cmNlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uCisgKgorICogXHBhcmFtIGRldm5hbWUgdGhlIGRldmljZSBuYW1lIG9mIHRoZSBkZXZpY2UgcmVwb3J0aW5nIHRoaXMgbWVzc2FnZSwgb3IKKyAqICAgICAgICAgICAgICAgIE5VTEwgaWYgdGhpcyBtZXNzYWdlIGlzIE5PVCBkZXZpY2UtcmVsYXRlZC4KKyAqIFxwYXJhbSBmbXQgcHJpbnRmKCktc3R5bGUgZm9ybWF0IHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRvIGxvZy4KKyAqIFxwYXJhbSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYW5kIGluc2VydGVkIGludG8gdGhlIGZvcm1hdAorICogXHBhcmFtIHN0cmluZy4KKyAqIFxyZXR1cm4gbm90aGluZworICoKKyAqIExvZ3MgdGhlIHNwZWNpZmllZCBlcnJvciBtZXNzYWdlIGF0IHRoZSBMT0dfV0FSTklORyBsZXZlbC4gIEl0IHdpbGwgYWxzbworICogaW5jbHVkZSB0aGUgZmlsZSwgbGluZSBudW1iZXIsIGFuZCBmdW5jdGlvbiBuYW1lIG9mIHdoZXJlIHRoZSBlcnJvcgorICogb3JpZ2luYXRlZCBpbiB0aGUgbG9nIG1lc3NhZ2UuCisgKi8KKyNkZWZpbmUgTE9HV1JOKGZtdCwgYXJncy4uLikgcHJfd2FybihmbXQsICMjIGFyZ3MpCisjZGVmaW5lIExPR1dSTkRFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pIFwKKwlwcl93YXJuKCIlcyAiIGZtdCwgZGV2bmFtZSwgIyMgYXJncykKKyNkZWZpbmUgTE9HV1JOTkFNRSh2bmljLCBmbXQsIGFyZ3MuLi4pIFwKKwlkbyB7CQkJCQkJCQlcCisJCWlmICh2bmljICE9IE5VTEwpIHsJCQkJCVwKKwkJCXByX3dhcm4oIiVzICIgZm10LCB2bmljLT5uYW1lLCAjIyBhcmdzKTsJXAorCQl9IGVsc2UgewkJCQkJCVwKKwkJCXByX3dhcm4oZm10LCAjIyBhcmdzKTsJCQkJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisjZW5kaWYgLyogX19VTklLTE9HX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3ZidXNoZWxwZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS92YnVzaGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlMzVmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS92YnVzaGVscGVyLmgKQEAgLTAsMCArMSw0NyBAQAorLyogdmJ1c2hlbHBlci5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMSAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fVkJVU0hFTFBFUl9IX18KKyNkZWZpbmUgX19WQlVTSEVMUEVSX0hfXworCisjaW5jbHVkZSAidmJ1c2RldmljZWluZm8uaCIKKworLyogVEFSR0VUX0hPU1ROQU1FIHNwZWNpZmllZCBhcyAtRFRBUkdFVF9IT1NUTkFNRT1cInRoZW5hbWVcIiBvbiB0aGUKKyAqIGNvbW1hbmQgbGluZSAqLworCisjZGVmaW5lIFRBUkdFVF9IT1NUTkFNRSAibGludXhndWVzdCIKKworc3RhdGljIGlubGluZSB2b2lkCitCdXNEZXZpY2VJbmZvX0luaXQoVUxUUkFfVkJVU19ERVZJQ0VJTkZPICpwQnVzRGV2aWNlSW5mbywKKwkJICAgY29uc3QgY2hhciAqZGV2aWNlVHlwZSwgY29uc3QgY2hhciAqZHJpdmVyTmFtZSwKKwkJICAgY29uc3QgY2hhciAqdmVyLCBjb25zdCBjaGFyICp2ZXJUYWcsCisJCSAgIGNvbnN0IGNoYXIgKmJ1aWxkRGF0ZSwgY29uc3QgY2hhciAqYnVpbGRUaW1lKQoreworCW1lbXNldChwQnVzRGV2aWNlSW5mbywgMCwgc2l6ZW9mKFVMVFJBX1ZCVVNfREVWSUNFSU5GTykpOworCXNucHJpbnRmKHBCdXNEZXZpY2VJbmZvLT5kZXZUeXBlLCBzaXplb2YocEJ1c0RldmljZUluZm8tPmRldlR5cGUpLAorCQkgIiVzIiwgKGRldmljZVR5cGUpID8gZGV2aWNlVHlwZSA6ICJ1bmtub3duVHlwZSIpOworCXNucHJpbnRmKHBCdXNEZXZpY2VJbmZvLT5kcnZOYW1lLCBzaXplb2YocEJ1c0RldmljZUluZm8tPmRydk5hbWUpLAorCQkgIiVzIiwgKGRyaXZlck5hbWUpID8gZHJpdmVyTmFtZSA6ICJ1bmtub3duRHJpdmVyIik7CisJc25wcmludGYocEJ1c0RldmljZUluZm8tPmluZm9TdHJpbmdzLAorCQkgc2l6ZW9mKHBCdXNEZXZpY2VJbmZvLT5pbmZvU3RyaW5ncyksICIlc1x0JXNcdCVzICVzXHQlcyIsCisJCSAodmVyKSA/IHZlciA6ICJ1bmtub3duVmVyIiwKKwkJICh2ZXJUYWcpID8gdmVyVGFnIDogInVua25vd25WZXJUYWciLAorCQkgKGJ1aWxkRGF0ZSkgPyBidWlsZERhdGUgOiAibm9CdWlsZERhdGUiLAorCQkgKGJ1aWxkVGltZSkgPyBidWlsZFRpbWUgOiAibm9idWlsZFRpbWUiLCBUQVJHRVRfSE9TVE5BTUUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkODdkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgVW5pc3lzIHVpc2xpYiBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBVTklTWVNfVUlTTElCCisJdHJpc3RhdGUgIlVuaXN5cyB1aXNsaWIgZHJpdmVyIgorCWRlcGVuZHMgb24gVU5JU1lTU1BBUiAmJiBVTklTWVNfVklTT1JDSElQU0VUICYmIFVOSVNZU19DSEFOTkVMU1RVQgorCS0tLWhlbHAtLS0KKwlJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgZW5hYmxlIHRoZSBVbmlzeXMgdWlzbGliIGRyaXZlci4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTQ0ZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvTWFrZWZpbGUKQEAgLTAsMCArMSwxNyBAQAorIworIyBNYWtlZmlsZSBmb3IgVW5pc3lzIHVpc2xpYgorIworCitvYmotJChDT05GSUdfVU5JU1lTX1VJU0xJQikJKz0gdmlzb3J1aXNsaWIubworCit2aXNvcnVpc2xpYi15IDo9IHVpc2xpYi5vIHVpc3F1ZXVlLm8gIHVpc3RocmVhZC5vICB1aXN1dGlscy5vCisKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jaGFubmVscworY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvc3BhcnN0b3Bkcml2ZXIKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzCisKK2NjZmxhZ3MteSArPSAtRENPTkZJR19TUEFSX0dVRVNUIC1ER1VFU1REUklWRVJCVUlMRCAtRE5PQVVUT1ZFUlNJT04KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvdWlzbGliLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXNsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWE5YzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvdWlzbGliLmMKQEAgLTAsMCArMSwyNDIxIEBACisvKiB1aXNsaWIuYworICoKKyAqIENvcHlyaWdodCDvv70gMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKiBAQUxMX0lOU1BFQ1RFRCAqLworI2RlZmluZSBFWFBPUlRfU1lNVEFCCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2lmZGVmIENPTkZJR19NT0RWRVJTSU9OUworI2luY2x1ZGUgPGNvbmZpZy9tb2R2ZXJzaW9ucy5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJjb21tb250eXBlcy5oIgorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgInVuaWtsb2cuaCIKKyNpbmNsdWRlICJkaWFnbm9zdGljcy9hcHBvc19zdWJzeXN0ZW1zLmgiCisjaW5jbHVkZSAidWlzdXRpbHMuaCIKKyNpbmNsdWRlICJ2YnVzY2hhbm5lbC5oIgorCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4JLyogZm9yIGNvcHlfZnJvbV91c2VyICovCisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4JLyogZm9yIHRvdXBwZXIgKi8KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICJzcGFyc3RvcC5oIgorI2luY2x1ZGUgInZpc29yY2hpcHNldC5oIgorI2luY2x1ZGUgImNoYW5zdHViLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorI2luY2x1ZGUgImd1ZXN0bGludXhkZWJ1Zy5oIgorCisjZGVmaW5lIFNFVF9QUk9DX09XTkVSKHgsIHkpCisKKyNkZWZpbmUgVUlTTElCX1RFU1RfUFJPQworI2RlZmluZSBQT0xMSklGRklFU19OT1JNQUwgMQorLyogQ2hvb3NlIHdoZXRoZXIgb3Igbm90IHlvdSB3YW50IHRvIHdha2V1cCB0aGUgcmVxdWVzdC1wb2xsaW5nIHRocmVhZAorICogYWZ0ZXIgYW4gSU8gdGVybWluYXRpb246CisgKiB0aGlzIGlzIHNob3J0ZXIgdGhhbiB1c2luZyBfX0ZJTEVfXyAoZnVsbCBwYXRoIG5hbWUpIGluCisgKiBkZWJ1Zy9pbmZvL2Vycm9yIG1lc3NhZ2VzCisgKi8KKyNkZWZpbmUgQ1VSUkVOVF9GSUxFX1BDIFVJU0xJQl9QQ191aXNsaWJfYworI2RlZmluZSBfX01ZRklMRV9fICJ1aXNsaWIuYyIKKworLyogZ2xvYmFsIGZ1bmN0aW9uIHBvaW50ZXJzIHRoYXQgYWN0IGFzIGNhbGxiYWNrIGZ1bmN0aW9ucyBpbnRvIHZpcnRwY2ltb2QgKi8KK2ludCAoKlZpcnRDb250cm9sQ2hhbkZ1bmMpKHN0cnVjdCBndWVzdF9tc2dzICopOworCitzdGF0aWMgaW50IFByb2NSZWFkQnVmZmVyVmFsaWQ7CitzdGF0aWMgY2hhciAqUHJvY1JlYWRCdWZmZXI7CS8qIE5vdGUgdGhpcyBNVVNUIGJlIGdsb2JhbCwKKwkJCQkJICogYmVjYXVzZSB0aGUgY29udGVudHMgbXVzdCAqLworc3RhdGljIHVuc2lnbmVkIGludCBjaGlwc2V0X2luaXRlZDsKKworI2RlZmluZSBXQUlUX09OX0NBTExCQUNLKGhhbmRsZSkJXAorCWRvIHsJCQlcCisJCWlmIChoYW5kbGUpCQlcCisJCQlicmVhazsJCVwKKwkJVUlTX1RIUkVBRF9XQUlUOwlcCisJfSB3aGlsZSAoMSkKKworc3RhdGljIHN0cnVjdCBidXNfaW5mbyAqQnVzTGlzdEhlYWQ7CitzdGF0aWMgcndsb2NrX3QgQnVzTGlzdExvY2s7CitzdGF0aWMgaW50IEJ1c0xpc3RDb3VudDsJLyogbnVtYmVyIG9mIGJ1c2VzIGluIHRoZSBsaXN0ICovCitzdGF0aWMgaW50IE1heEJ1c0NvdW50OwkJLyogbWF4aW11bSBudW1iZXIgb2YgYnVzZXMgZXhwZWN0ZWQgKi8KK3N0YXRpYyBVNjQgUGh5c2ljYWxEYXRhQ2hhbjsKK3N0YXRpYyBpbnQgUGxhdGZvcm1OdW1iZXI7CisKK3N0YXRpYyBzdHJ1Y3QgdWlzdGhyZWFkX2luZm8gSW5jb21pbmdfVGhyZWFkSW5mbzsKK3N0YXRpYyBCT09MIEluY29taW5nX1RocmVhZF9TdGFydGVkID0gRkFMU0U7CitzdGF0aWMgTElTVF9IRUFEKExpc3RfUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyB0b3RfbW92ZWRfdG9fdGFpbF9jbnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHRvdF93YWl0X2NudDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgdG90X3dha2V1cF9jbnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHRvdF9zY2hlZHVsZV9jbnQ7CitzdGF0aWMgaW50IGVuX3NtYXJ0X3dha2V1cCA9IDE7CitzdGF0aWMgREVGSU5FX1NFTUFQSE9SRShMb2NrX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzKTsJLyogdW5sb2NrZWQgKi8KK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChXYWtldXBfUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMpOworc3RhdGljIGludCBHb19Qb2xsaW5nX0RldmljZV9DaGFubmVsczsKKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqdWlzbGliX3Byb2NfZGlyOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqdWlzbGliX3Byb2NfdmJ1c19kaXI7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp2bmljX3Byb2NfZW50cnk7CS8qIFVzZWQgdG8gYmUgImRhdGFjaGFuIiAqLworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqY3RybGNoYW5fcHJvY19lbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBtZW1fcHJvY19lbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmluZm9fcHJvY19lbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnN3aXRjaF9wcm9jX2VudHJ5Oworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZXh0cG9ydF9wcm9jX2VudHJ5Oworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGxhdGZvcm1udW1iZXJfcHJvY19lbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmJ1c19wcm9jX2VudHJ5Oworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGV2X3Byb2NfZW50cnk7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpjaGlwc2V0X3Byb2NfZW50cnk7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpjeWNsZXNfYmVmb3JlX3dhaXRfcHJvY19lbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJlc2V0X2NvdW50c19wcm9jX2VudHJ5Oworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqc21hcnRfd2FrZXVwX3Byb2NfZW50cnk7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkaXNhYmxlX3Byb2NfZW50cnk7CisKKyNkZWZpbmUgRElSX1BST0NfRU5UUlkgInVpc2xpYiIKKyNkZWZpbmUgRElSX1ZCVVNfUFJPQ19FTlRSWSAidmJ1cyIKKyNkZWZpbmUgVk5JQ19QUk9DX0VOVFJZX0ZOICJ2bmljIgkvKiBVc2VkIHRvIGJlICJkYXRhY2hhbiIgKi8KKyNkZWZpbmUgQ1RSTENIQU5fUFJPQ19FTlRSWV9GTiAiY3RybGNoYW4iCisjZGVmaW5lIFBNRU1fUFJPQ19FTlRSWV9GTiAicGh5c190b192aXJ0IgorI2RlZmluZSBJTkZPX1BST0NfRU5UUllfRk4gImluZm8iCisjZGVmaW5lIFNXSVRDSF9QUk9DX0VOVFJZX0ZOICJzd2l0Y2giCisjZGVmaW5lIFNXSVRDSF9DT1VOVF9QUk9DX0VOVFJZX0ZOICJzd2l0Y2hfY291bnQiCisjZGVmaW5lIEVYVFBPUlRfUFJPQ19FTlRSWV9GTiAiZXh0cG9ydCIKKyNkZWZpbmUgUExBVEZPUk1OVU1CRVJfUFJPQ19FTlRSWV9GTiAicGxhdGZvcm0iCisjZGVmaW5lIEJVU19QUk9DX0VOVFJZX0ZOICJidXMiCisjZGVmaW5lIERFVl9QUk9DX0VOVFJZX0ZOICJkZXZpY2UiCisjZGVmaW5lIENISVBTRVRfUFJPQ19FTlRSWV9GTiAiY2hpcHNldCIKKyNkZWZpbmUgQ1lDTEVTX0JFRk9SRV9XQUlUX1BST0NfRU5UUllfRk4gImN5Y2xlc19iZWZvcmVfd2FpdCIKKyNkZWZpbmUgUkVTRVRfQ09VTlRTX1BST0NfRU5UUllfRk4gInJlc2V0X2NvdW50cyIKKyNkZWZpbmUgU01BUlRfV0FLRVVQX1BST0NfRU5UUllfRk4gInNtYXJ0X3dha2V1cCIKKyNkZWZpbmUgQ0FMTEhPTUVfUFJPQ19FTlRSWV9GTiAiY2FsbGhvbWUiCisjZGVmaW5lIENBTExIT01FX1RIUk9UVExFRF9QUk9DX0VOVFJZX0ZOICJjYWxsaG9tZV90aHJvdHRsZWQiCisjZGVmaW5lIERJU0FCTEVfUFJPQ19FTlRSWV9GTiAic3dpdGNoX3N0YXRlIgorI2lmZGVmIFVJU0xJQl9URVNUX1BST0MKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnRlc3RfcHJvY19lbnRyeTsKKyNkZWZpbmUgVEVTVF9QUk9DX0VOVFJZX0ZOICJ0ZXN0IgorI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGN5Y2xlc19iZWZvcmVfd2FpdCwgd2FpdF9jeWNsZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGxvY2FsIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBwcm9jX2luZm9fdmJ1c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdik7CitzdGF0aWMgaW50Citwcm9jX2luZm9fdmJ1c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCS8qIHByb2NfaW5mb192YnVzX3Nob3cgd2lsbCBncmFiIHRoaXMgZnJvbSBzZXFfZmlsZS5wcml2YXRlOiAqLworCXN0cnVjdCBidXNfaW5mbyAqYnVzID0gUERFX0RBVEEoaW5vZGUpOworCXJldHVybiBzaW5nbGVfb3BlbihmaWxwLCBwcm9jX2luZm9fdmJ1c19zaG93LCBidXMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2luZm9fdmJ1c19mb3BzID0geworCS5vcGVuID0gcHJvY19pbmZvX3ZidXNfb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IHVpc2xpYl9wcm9jX3JlYWRfd3JpdGVvbmx5KHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkgIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworCitzdGF0aWMgc3NpemVfdCB2bmljX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3ZuaWNfZm9wcyA9IHsKKwkucmVhZCA9IHVpc2xpYl9wcm9jX3JlYWRfd3JpdGVvbmx5LAorCS53cml0ZSA9IHZuaWNfcHJvY193cml0ZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IGNoaXBzZXRfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19jaGlwc2V0X2ZvcHMgPSB7CisJLnJlYWQgPSB1aXNsaWJfcHJvY19yZWFkX3dyaXRlb25seSwKKwkud3JpdGUgPSBjaGlwc2V0X3Byb2Nfd3JpdGUsCit9OworCitzdGF0aWMgc3NpemVfdCBpbmZvX3Byb2NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfaW5mb19mb3BzID0geworCS5yZWFkID0gaW5mb19wcm9jX3JlYWQsCit9OworCitzdGF0aWMgc3NpemVfdCBwbGF0Zm9ybW51bWJlcl9wcm9jX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJCXNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfcGxhdGZvcm1udW1iZXJfZm9wcyA9IHsKKwkucmVhZCA9IHBsYXRmb3JtbnVtYmVyX3Byb2NfcmVhZCwKK307CisKK3N0YXRpYyBzc2l6ZV90IGN5Y2xlc19iZWZvcmVfd2FpdF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19jeWNsZXNfYmVmb3JlX3dhaXRfZm9wcyA9IHsKKwkucmVhZCA9IHVpc2xpYl9wcm9jX3JlYWRfd3JpdGVvbmx5LAorCS53cml0ZSA9IGN5Y2xlc19iZWZvcmVfd2FpdF9wcm9jX3dyaXRlLAorfTsKKworc3RhdGljIHNzaXplX3QgcmVzZXRfY291bnRzX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfcmVzZXRfY291bnRzX2ZvcHMgPSB7CisJLnJlYWQgPSB1aXNsaWJfcHJvY19yZWFkX3dyaXRlb25seSwKKwkud3JpdGUgPSByZXNldF9jb3VudHNfcHJvY193cml0ZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IHNtYXJ0X3dha2V1cF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3NtYXJ0X3dha2V1cF9mb3BzID0geworCS5yZWFkID0gdWlzbGliX3Byb2NfcmVhZF93cml0ZW9ubHksCisJLndyaXRlID0gc21hcnRfd2FrZXVwX3Byb2Nfd3JpdGUsCit9OworCitzdGF0aWMgc3NpemVfdCB0ZXN0X3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3Rlc3RfZm9wcyA9IHsKKwkucmVhZCA9IHVpc2xpYl9wcm9jX3JlYWRfd3JpdGVvbmx5LAorCS53cml0ZSA9IHRlc3RfcHJvY193cml0ZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IGJ1c19wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfYnVzX2ZvcHMgPSB7CisJLnJlYWQgPSB1aXNsaWJfcHJvY19yZWFkX3dyaXRlb25seSwKKwkud3JpdGUgPSBidXNfcHJvY193cml0ZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IGRldl9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfZGV2X2ZvcHMgPSB7CisJLnJlYWQgPSB1aXNsaWJfcHJvY19yZWFkX3dyaXRlb25seSwKKwkud3JpdGUgPSBkZXZfcHJvY193cml0ZSwKK307CisKK3N0YXRpYyB2b2lkCitpbml0X21zZ19oZWFkZXIoQ09OVFJPTFZNX01FU1NBR0UgKm1zZywgVTMyIGlkLCB1aW50IHJzcCwgdWludCBzdnIpCit7CisJbWVtc2V0KG1zZywgMCwgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFKSk7CisJbXNnLT5oZHIuSWQgPSBpZDsKKwltc2ctPmhkci5GbGFncy5yZXNwb25zZUV4cGVjdGVkID0gcnNwOworCW1zZy0+aGRyLkZsYWdzLnNlcnZlciA9IHN2cjsKK30KKworc3RhdGljIHZvaWQKK2NyZWF0ZV9idXNfcHJvY19lbnRyaWVzKHN0cnVjdCBidXNfaW5mbyAqYnVzKQoreworCWJ1cy0+cHJvY19kaXIgPSBwcm9jX21rZGlyKGJ1cy0+bmFtZSwgdWlzbGliX3Byb2NfdmJ1c19kaXIpOworCWlmICghYnVzLT5wcm9jX2RpcikgeworCQlMT0dFUlIoImZhaWxlZCB0byBjcmVhdGUgL3Byb2MvdWlzbGliL3ZidXMvJXMgZGlyZWN0b3J5IiwKKwkJICAgICAgIGJ1cy0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJYnVzLT5wcm9jX2luZm8gPSBwcm9jX2NyZWF0ZV9kYXRhKCJpbmZvIiwgMCwgYnVzLT5wcm9jX2RpciwKKwkJCQkJICAmcHJvY19pbmZvX3ZidXNfZm9wcywgYnVzKTsKKwlpZiAoIWJ1cy0+cHJvY19pbmZvKSB7CisJCUxPR0VSUigiZmFpbGVkIHRvIGNyZWF0ZSAvcHJvYy91aXNsaWIvdmJ1cy8lcy9pbmZvIiwgYnVzLT5uYW1lKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoYnVzLT5uYW1lLCB1aXNsaWJfcHJvY192YnVzX2Rpcik7CisJCWJ1cy0+cHJvY19kaXIgPSBOVUxMOworCQlyZXR1cm47CisJfQorCVNFVF9QUk9DX09XTkVSKGJ1cy0+cHJvY19pbmZvLCBUSElTX01PRFVMRSk7CisKK30KKworc3RhdGljIF9faW9tZW0gdm9pZCAqCitpbml0X3ZidXNfY2hhbm5lbChVNjQgY2hhbm5lbEFkZHIsIFUzMiBjaGFubmVsQnl0ZXMsIGludCBpc1NlcnZlcikKK3sKKwl2b2lkICpyYyA9IE5VTEw7CisJdm9pZCBfX2lvbWVtICpwQ2hhbiA9IHVpc2xpYl9pb3JlbWFwX2NhY2hlKGNoYW5uZWxBZGRyLCBjaGFubmVsQnl0ZXMpOworCWlmICghcENoYW4pIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBlcnJvcjogaW9yZW1hcF9jYWNoZSBvZiBjaGFubmVsQWRkcjolTHggZm9yIGNoYW5uZWxCeXRlczolbGx1IGZhaWxlZCIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgY2hhbm5lbEFkZHIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgY2hhbm5lbEJ5dGVzKTsKKwkJcmMgPSBOVUxMOworCQlnb3RvIEF3YXk7CisJfQorCWlmIChpc1NlcnZlcikgeworCQltZW1zZXRfaW8ocENoYW4sIDAsIGNoYW5uZWxCeXRlcyk7CisJCWlmICghVUxUUkFfVkJVU19DSEFOTkVMX09LX1NFUlZFUihjaGFubmVsQnl0ZXMsIE5VTEwpKSB7CisJCQlFUlJEUlYoIiVzIGNoYW5uZWwgY2Fubm90IGJlIHVzZWQiLCBfX2Z1bmNfXyk7CisJCQl1aXNsaWJfaW91bm1hcChwQ2hhbik7CisJCQlyYyA9IE5VTEw7CisJCQlnb3RvIEF3YXk7CisJCX0KKwkJVUxUUkFfVkJVU19pbml0X2NoYW5uZWwocENoYW4sIGNoYW5uZWxCeXRlcyk7CisJfSBlbHNlIHsKKwkJaWYgKCFVTFRSQV9WQlVTX0NIQU5ORUxfT0tfQ0xJRU5UKHBDaGFuLCBOVUxMKSkgeworCQkJRVJSRFJWKCIlcyBjaGFubmVsIGNhbm5vdCBiZSB1c2VkIiwgX19mdW5jX18pOworCQkJdWlzbGliX2lvdW5tYXAocENoYW4pOworCQkJcmMgPSBOVUxMOworCQkJZ290byBBd2F5OworCQl9CisJfQorCXJjID0gcENoYW47CitBd2F5OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorY3JlYXRlX2J1cyhDT05UUk9MVk1fTUVTU0FHRSAqbXNnLCBjaGFyICpidWYpCit7CisJVTMyIGJ1c05vLCBkZXZpY2VDb3VudDsKKwlzdHJ1Y3QgYnVzX2luZm8gKnRtcCwgKmJ1czsKKwlzaXplX3Qgc2l6ZTsKKworCWlmIChNYXhCdXNDb3VudCA9PSBCdXNMaXN0Q291bnQpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWQ6IG1heCBidXNlczolZCBhbHJlYWR5IGNyZWF0ZWRcbiIsCisJCSAgICAgTWF4QnVzQ291bnQpOworCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRkFJTFVSRV9QQywgTWF4QnVzQ291bnQsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9NQVhfQlVTRVM7CisJfQorCisJYnVzTm8gPSBtc2ctPmNtZC5jcmVhdGVCdXMuYnVzTm87CisJZGV2aWNlQ291bnQgPSBtc2ctPmNtZC5jcmVhdGVCdXMuZGV2aWNlQ291bnQ7CisKKwlQT1NUQ09ERV9MSU5VWF80KEJVU19DUkVBVEVfRU5UUllfUEMsIGJ1c05vLCBkZXZpY2VDb3VudCwKKwkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCXNpemUgPQorCSAgICBzaXplb2Yoc3RydWN0IGJ1c19pbmZvKSArCisJICAgIChkZXZpY2VDb3VudCAqIHNpemVvZihzdHJ1Y3QgZGV2aWNlX2luZm8gKikpOworCWJ1cyA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCFidXMpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWQ6IGttYWxsb2MgZm9yIGJ1cyBmYWlsZWQuXG4iKTsKKwkJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGJ1c05vLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfS01BTExPQ19GQUlMRUQ7CisJfQorCisJLyogQ3VycmVudGx5IGJ5IGRlZmF1bHQsIHRoZSBidXMgTnVtYmVyIGlzIHRoZSBHdWVzdEhhbmRsZS4KKwkgKiBDb25maWd1cmUgQnVzIG1lc3NhZ2UgY2FuIG92ZXJyaWRlIHRoaXMuCisJICovCisJaWYgKG1zZy0+aGRyLkZsYWdzLnRlc3RNZXNzYWdlKSB7CisJCS8qIFRoaXMgaW1wbGllcyB3ZSdyZSB0aGUgSU9WTSBzbyBzZXQgZ3Vlc3QgaGFuZGxlIHRvIDAuLi4gKi8KKwkJYnVzLT5ndWVzdEhhbmRsZSA9IDA7CisJCWJ1cy0+YnVzTm8gPSBidXNObzsKKwkJYnVzLT5sb2NhbFZuaWMgPSAxOworCX0gZWxzZQorCQlidXMtPmJ1c05vID0gYnVzLT5ndWVzdEhhbmRsZSA9IGJ1c05vOworCXNwcmludGYoYnVzLT5uYW1lLCAiJWQiLCAoaW50KSBidXMtPmJ1c05vKTsKKwlidXMtPmRldmljZUNvdW50ID0gZGV2aWNlQ291bnQ7CisJYnVzLT5kZXZpY2UgPQorCSAgICAoc3RydWN0IGRldmljZV9pbmZvICoqKSAoKGNoYXIgKikgYnVzICsgc2l6ZW9mKHN0cnVjdCBidXNfaW5mbykpOworCWJ1cy0+YnVzSW5zdEd1aWQgPSBtc2ctPmNtZC5jcmVhdGVCdXMuYnVzSW5zdEd1aWQ7CisJYnVzLT5idXNDaGFubmVsQnl0ZXMgPSAwOworCWJ1cy0+cEJ1c0NoYW5uZWwgPSBOVUxMOworCisJLyogYWRkIGJ1cyB0byBvdXIgYnVzIGxpc3QgLSBidXQgY2hlY2sgZm9yIGR1cGxpY2F0ZXMgZmlyc3QgKi8KKwlyZWFkX2xvY2soJkJ1c0xpc3RMb2NrKTsKKwlmb3IgKHRtcCA9IEJ1c0xpc3RIZWFkOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkgeworCQlpZiAodG1wLT5idXNObyA9PSBidXMtPmJ1c05vKQorCQkJYnJlYWs7CisJfQorCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJaWYgKHRtcCkgeworCQkvKiBmb3VuZCBhIGJ1cyBhbHJlYWR5IGluIHRoZSBsaXN0IHdpdGggc2FtZSBidXNObyAtCisJCSAqIHJlamVjdCBhZGQKKwkJICovCisJCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DUkVBVEUgRmFpbGVkOiBidXMgJWQgYWxyZWFkeSBleGlzdHMuXG4iLAorCQkgICAgICAgYnVzLT5idXNObyk7CisJCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9GQUlMVVJFX1BDLCBidXMtPmJ1c05vLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlrZnJlZShidXMpOworCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOworCX0KKwlpZiAoKG1zZy0+Y21kLmNyZWF0ZUJ1cy5jaGFubmVsQWRkciAhPSAwKQorCSAgICAmJiAobXNnLT5jbWQuY3JlYXRlQnVzLmNoYW5uZWxCeXRlcyAhPSAwKSkgeworCQlidXMtPmJ1c0NoYW5uZWxCeXRlcyA9IG1zZy0+Y21kLmNyZWF0ZUJ1cy5jaGFubmVsQnl0ZXM7CisJCWJ1cy0+cEJ1c0NoYW5uZWwgPQorCQkgICAgaW5pdF92YnVzX2NoYW5uZWwobXNnLT5jbWQuY3JlYXRlQnVzLmNoYW5uZWxBZGRyLAorCQkJCSAgICAgIG1zZy0+Y21kLmNyZWF0ZUJ1cy5jaGFubmVsQnl0ZXMsCisJCQkJICAgICAgbXNnLT5oZHIuRmxhZ3Muc2VydmVyKTsKKwl9CisJLyogdGhlIG1zZyBpcyBib3VuZCBmb3IgdmlydHBjaTsgc2VuZCBndWVzdF9tc2dzIHN0cnVjdCB0byBjYWxsYmFjayAqLworCWlmICghbXNnLT5oZHIuRmxhZ3Muc2VydmVyKSB7CisJCXN0cnVjdCBndWVzdF9tc2dzIGNtZDsKKwkJY21kLm1zZ3R5cGUgPSBHVUVTVF9BRERfVkJVUzsKKwkJY21kLmFkZF92YnVzLmJ1c05vID0gYnVzTm87CisJCWNtZC5hZGRfdmJ1cy5jaGFucHRyID0gYnVzLT5wQnVzQ2hhbm5lbDsKKwkJY21kLmFkZF92YnVzLmRldmljZUNvdW50ID0gZGV2aWNlQ291bnQ7CisJCWNtZC5hZGRfdmJ1cy5idXNUeXBlR3VpZCA9IG1zZy0+Y21kLmNyZWF0ZUJ1cy5idXNEYXRhVHlwZUd1aWQ7CisJCWNtZC5hZGRfdmJ1cy5idXNJbnN0R3VpZCA9IG1zZy0+Y21kLmNyZWF0ZUJ1cy5idXNJbnN0R3VpZDsKKwkJaWYgKCFWaXJ0Q29udHJvbENoYW5GdW5jKSB7CisJCQlrZnJlZShidXMpOworCQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWQ6IHZpcnRwY2kgY2FsbGJhY2sgbm90IHJlZ2lzdGVyZWQuIik7CisJCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRkFJTFVSRV9QQywgYnVzLT5idXNObywKKwkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfRkFJTFVSRTsKKwkJfQorCQlpZiAoIVZpcnRDb250cm9sQ2hhbkZ1bmMoJmNtZCkpIHsKKwkJCWtmcmVlKGJ1cyk7CisJCQlMT0dFUlIoIkNPTlRST0xWTV9CVVNfQ1JFQVRFIEZhaWxlZDogdmlydHBjaSBHVUVTVF9BRERfVkJVUyByZXR1cm5lZCBlcnJvci4iKTsKKwkJCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9GQUlMVVJFX1BDLCBidXMtPmJ1c05vLAorCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJCXJldHVybgorCQkJICAgIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SOworCQl9CisJfQorCWNyZWF0ZV9idXNfcHJvY19lbnRyaWVzKGJ1cyk7CisKKwkvKiBhZGQgYnVzIGF0IHRoZSBoZWFkIG9mIG91ciBsaXN0ICovCisJd3JpdGVfbG9jaygmQnVzTGlzdExvY2spOworCWlmICghQnVzTGlzdEhlYWQpCisJCUJ1c0xpc3RIZWFkID0gYnVzOworCWVsc2UgeworCQlidXMtPm5leHQgPSBCdXNMaXN0SGVhZDsKKwkJQnVzTGlzdEhlYWQgPSBidXM7CisJfQorCUJ1c0xpc3RDb3VudCsrOworCXdyaXRlX3VubG9jaygmQnVzTGlzdExvY2spOworCisJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0VYSVRfUEMsIGJ1cy0+YnVzTm8sCisJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJcmV0dXJuIENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQKK2Rlc3Ryb3lfYnVzKENPTlRST0xWTV9NRVNTQUdFICptc2csIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYnVzX2luZm8gKmJ1cywgKnByZXYgPSBOVUxMOworCVUzMiBidXNObzsKKworCWJ1c05vID0gbXNnLT5jbWQuZGVzdHJveUJ1cy5idXNObzsKKworCS8qIGZpbmQgYW5kIGRlbGV0ZSB0aGUgYnVzICovCisJcmVhZF9sb2NrKCZCdXNMaXN0TG9jayk7CisJZm9yIChidXMgPSBCdXNMaXN0SGVhZDsgYnVzOyBwcmV2ID0gYnVzLCBidXMgPSBidXMtPm5leHQpIHsKKwkJaWYgKGJ1cy0+YnVzTm8gPT0gYnVzTm8pIHsKKwkJCS8qIGZvdW5kIHRoZSBidXMgLSBlbnN1cmUgdGhhdCBhbGwgZGV2aWNlCisJCQkgKiBzbG90cyBhcmUgTlVMTAorCQkJICovCisJCQlmb3IgKGkgPSAwOyBpIDwgYnVzLT5kZXZpY2VDb3VudDsgaSsrKSB7CisJCQkJaWYgKGJ1cy0+ZGV2aWNlW2ldICE9IE5VTEwpIHsKKwkJCQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0RFU1RST1kgRmFpbGVkOiBkZXZpY2UgJWkgYXR0YWNoZWQgdG8gYnVzICVkLiIsCisJCQkJCSAgICAgaSwgYnVzTm8pOworCQkJCQlyZWFkX3VubG9jaygmQnVzTGlzdExvY2spOworCQkJCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0RFVklDRV9BVFRBQ0hFRDsKKwkJCQl9CisJCQl9CisJCQlyZWFkX3VubG9jaygmQnVzTGlzdExvY2spOworCQkJLyogdGhlIG1zZyBpcyBib3VuZCBmb3IgdmlydHBjaTsgc2VuZAorCQkJICogZ3Vlc3RfbXNncyBzdHJ1Y3QgdG8gY2FsbGJhY2sKKwkJCSAqLworCQkJaWYgKCFtc2ctPmhkci5GbGFncy5zZXJ2ZXIpIHsKKwkJCQlzdHJ1Y3QgZ3Vlc3RfbXNncyBjbWQ7CisJCQkJY21kLm1zZ3R5cGUgPSBHVUVTVF9ERUxfVkJVUzsKKwkJCQljbWQuZGVsX3ZidXMuYnVzTm8gPSBidXNObzsKKwkJCQlpZiAoIVZpcnRDb250cm9sQ2hhbkZ1bmMpIHsKKwkJCQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0RFU1RST1kgRmFpbGVkOiB2aXJ0cGNpIGNhbGxiYWNrIG5vdCByZWdpc3RlcmVkLiIpOworCQkJCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfRkFJTFVSRTsKKwkJCQl9CisJCQkJaWYgKCFWaXJ0Q29udHJvbENoYW5GdW5jKCZjbWQpKSB7CisJCQkJCUxPR0VSUigiQ09OVFJPTFZNX0JVU19ERVNUUk9ZIEZhaWxlZDogdmlydHBjaSBHVUVTVF9ERUxfVkJVUyByZXR1cm5lZCBlcnJvci4iKTsKKwkJCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SOworCQkJCX0KKwkJCX0KKwkJCS8qIHJlbW92ZSB0aGUgYnVzIGZyb20gdGhlIGxpc3QgKi8KKwkJCXdyaXRlX2xvY2soJkJ1c0xpc3RMb2NrKTsKKwkJCWlmIChwcmV2KQkvKiBub3QgYXQgaGVhZCAqLworCQkJCXByZXYtPm5leHQgPSBidXMtPm5leHQ7CisJCQllbHNlCisJCQkJQnVzTGlzdEhlYWQgPSBidXMtPm5leHQ7CisJCQlCdXNMaXN0Q291bnQtLTsKKwkJCXdyaXRlX3VubG9jaygmQnVzTGlzdExvY2spOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWJ1cykgeworCQlMT0dFUlIoIkNPTlRST0xWTV9CVVNfREVTVFJPWSBGYWlsZWQ6IGZhaWxlZCB0byBmaW5kIGJ1cyAlZC5cbiIsCisJCSAgICAgICBidXNObyk7CisJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkU7CisJfQorCWlmIChidXMtPnByb2NfaW5mbykgeworCQlyZW1vdmVfcHJvY19lbnRyeSgiaW5mbyIsIGJ1cy0+cHJvY19kaXIpOworCQlidXMtPnByb2NfaW5mbyA9IE5VTEw7CisJfQorCWlmIChidXMtPnByb2NfZGlyKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KGJ1cy0+bmFtZSwgdWlzbGliX3Byb2NfdmJ1c19kaXIpOworCQlidXMtPnByb2NfZGlyID0gTlVMTDsKKwl9CisJaWYgKGJ1cy0+cEJ1c0NoYW5uZWwpIHsKKwkJdWlzbGliX2lvdW5tYXAoYnVzLT5wQnVzQ2hhbm5lbCk7CisJCWJ1cy0+cEJ1c0NoYW5uZWwgPSBOVUxMOworCX0KKworCWtmcmVlKGJ1cyk7CisJcmV0dXJuIENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQKK2NyZWF0ZV9kZXZpY2UoQ09OVFJPTFZNX01FU1NBR0UgKm1zZywgY2hhciAqYnVmKQoreworCXN0cnVjdCBkZXZpY2VfaW5mbyAqZGV2OworCXN0cnVjdCBidXNfaW5mbyAqYnVzOworCVUzMiBidXNObywgZGV2Tm87CisJaW50IHJlc3VsdCA9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CisJVTY0IG1pblNpemUgPSBNSU5fSU9fQ0hBTk5FTF9TSVpFOworCVJlcUhhbmRsZXJJbmZvX3QgKnBSZXFIYW5kbGVyOworCisJYnVzTm8gPSBtc2ctPmNtZC5jcmVhdGVEZXZpY2UuYnVzTm87CisJZGV2Tm8gPSBtc2ctPmNtZC5jcmVhdGVEZXZpY2UuZGV2Tm87CisKKwlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRU5UUllfUEMsIGRldk5vLCBidXNObywKKwkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZpY2VfaW5mbyksIEdGUF9BVE9NSUMpOworCWlmICghZGV2KSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBrbWFsbG9jIGZvciBkZXYgZmFpbGVkLlxuIik7CisJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9LTUFMTE9DX0ZBSUxFRDsKKwl9CisKKwlkZXYtPmNoYW5uZWxUeXBlR3VpZCA9IG1zZy0+Y21kLmNyZWF0ZURldmljZS5kYXRhVHlwZUd1aWQ7CisJZGV2LT5pbnRyID0gbXNnLT5jbWQuY3JlYXRlRGV2aWNlLmludHI7CisJZGV2LT5jaGFubmVsQWRkciA9IG1zZy0+Y21kLmNyZWF0ZURldmljZS5jaGFubmVsQWRkcjsKKwlkZXYtPmJ1c05vID0gYnVzTm87CisJZGV2LT5kZXZObyA9IGRldk5vOworCXNlbWFfaW5pdCgmZGV2LT5pbnRlcnJ1cHRfY2FsbGJhY2tfbG9jaywgMSk7CS8qIHVubG9ja2VkICovCisJc3ByaW50ZihkZXYtPmRldmlkLCAidmJ1cyV1OmRldiV1IiwgKHVuc2lnbmVkKSBidXNObywgKHVuc2lnbmVkKSBkZXZObyk7CisJLyogbWFwIHRoZSBjaGFubmVsIG1lbW9yeSBmb3IgdGhlIGRldmljZS4gKi8KKwlpZiAobXNnLT5oZHIuRmxhZ3MudGVzdE1lc3NhZ2UpCisJCWRldi0+Y2hhbnB0ciA9ICh2b2lkIF9faW9tZW0gKilfX3ZhKGRldi0+Y2hhbm5lbEFkZHIpOworCWVsc2UgeworCQlwUmVxSGFuZGxlciA9IFJlcUhhbmRsZXJGaW5kKGRldi0+Y2hhbm5lbFR5cGVHdWlkKTsKKwkJaWYgKHBSZXFIYW5kbGVyKQorCQkJLyogZ2VuZXJpYyBzZXJ2aWNlIGhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgdGhpcworCQkJICogY2hhbm5lbAorCQkJICovCisJCQltaW5TaXplID0gcFJlcUhhbmRsZXItPm1pbl9jaGFubmVsX2J5dGVzOworCQlpZiAobWluU2l6ZSA+IG1zZy0+Y21kLmNyZWF0ZURldmljZS5jaGFubmVsQnl0ZXMpIHsKKwkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBjaGFubmVsIHNpemUgaXMgdG9vIHNtYWxsLCBjaGFubmVsIHNpemU6MHglbHgsIHJlcXVpcmVkIHNpemU6MHglbHgiLAorCQkJICAgICAodWxvbmcpIG1zZy0+Y21kLmNyZWF0ZURldmljZS5jaGFubmVsQnl0ZXMsCisJCQkgICAgICh1bG9uZykgbWluU2l6ZSk7CisJCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2Tm8sIGJ1c05vLAorCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJCXJlc3VsdCA9IENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfU0laRV9UT09fU01BTEw7CisJCQlnb3RvIEF3YXk7CisJCX0KKwkJZGV2LT5jaGFucHRyID0KKwkJICAgIHVpc2xpYl9pb3JlbWFwX2NhY2hlKGRldi0+Y2hhbm5lbEFkZHIsCisJCQkJCSBtc2ctPmNtZC5jcmVhdGVEZXZpY2UuY2hhbm5lbEJ5dGVzKTsKKwkJaWYgKCFkZXYtPmNoYW5wdHIpIHsKKwkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBpb3JlbWFwX2NhY2hlIG9mIGNoYW5uZWxBZGRyOiVMeCBmb3IgY2hhbm5lbEJ5dGVzOiVsbHUgZmFpbGVkIiwKKwkJCSAgICAgZGV2LT5jaGFubmVsQWRkciwKKwkJCSAgICAgbXNnLT5jbWQuY3JlYXRlRGV2aWNlLmNoYW5uZWxCeXRlcyk7CisJCQlyZXN1bHQgPSBDT05UUk9MVk1fUkVTUF9FUlJPUl9JT1JFTUFQX0ZBSUxFRDsKKwkJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQkJZ290byBBd2F5OworCQl9CisJfQorCWRldi0+ZGV2SW5zdEd1aWQgPSBtc2ctPmNtZC5jcmVhdGVEZXZpY2UuZGV2SW5zdEd1aWQ7CisJZGV2LT5jaGFubmVsQnl0ZXMgPSBtc2ctPmNtZC5jcmVhdGVEZXZpY2UuY2hhbm5lbEJ5dGVzOworCisJcmVhZF9sb2NrKCZCdXNMaXN0TG9jayk7CisJZm9yIChidXMgPSBCdXNMaXN0SGVhZDsgYnVzOyBidXMgPSBidXMtPm5leHQpIHsKKwkJaWYgKGJ1cy0+YnVzTm8gPT0gYnVzTm8pIHsKKwkJCS8qIG1ha2Ugc3VyZSB0aGUgZGV2aWNlIG51bWJlciBpcyB2YWxpZCAqLworCQkJaWYgKGRldk5vID49IGJ1cy0+ZGV2aWNlQ291bnQpIHsKKwkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogZGV2aWNlICglZCkgPj0gZGV2aWNlQ291bnQgKCVkKS4iLAorCQkJCSAgICAgZGV2Tm8sIGJ1cy0+ZGV2aWNlQ291bnQpOworCQkJCXJlc3VsdCA9IENPTlRST0xWTV9SRVNQX0VSUk9SX01BWF9ERVZJQ0VTOworCQkJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLAorCQkJCQkJIGRldk5vLCBidXNObywKKwkJCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQkJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCQkJZ290byBBd2F5OworCQkJfQorCQkJLyogbWFrZSBzdXJlIHRoaXMgZGV2aWNlIGlzIG5vdCBhbHJlYWR5IHNldCAqLworCQkJaWYgKGJ1cy0+ZGV2aWNlW2Rldk5vXSkgeworCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBkZXZpY2UgJWQgaXMgYWxyZWFkeSBleGlzdHMuIiwKKwkJCQkgICAgIGRldk5vKTsKKwkJCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywKKwkJCQkJCSBkZXZObywgYnVzTm8sCisJCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJCQlyZXN1bHQgPSBDT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkU7CisJCQkJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwkJCQlnb3RvIEF3YXk7CisJCQl9CisJCQlyZWFkX3VubG9jaygmQnVzTGlzdExvY2spOworCQkJLyogdGhlIG1zZyBpcyBib3VuZCBmb3IgdmlydHBjaTsgc2VuZAorCQkJICogZ3Vlc3RfbXNncyBzdHJ1Y3QgdG8gY2FsbGJhY2sKKwkJCSAqLworCQkJaWYgKCFtc2ctPmhkci5GbGFncy5zZXJ2ZXIpIHsKKwkJCQlzdHJ1Y3QgZ3Vlc3RfbXNncyBjbWQ7CisJCQkJaWYgKCFtZW1jbXAKKwkJCQkgICAgKCZkZXYtPmNoYW5uZWxUeXBlR3VpZCwKKwkJCQkgICAgICZVbHRyYVZoYmFDaGFubmVsUHJvdG9jb2xHdWlkLAorCQkJCSAgICAgc2l6ZW9mKEdVSUQpKSkgeworCQkJCQlXQUlUX0ZPUl9WQUxJRF9HVUlEKCgoQ0hBTk5FTF9IRUFERVIKKwkJCQkJCQkgICAgICBfX2lvbWVtICopIChkZXYtPgorCQkJCQkJCQkgIGNoYW5wdHIpKS0+CisJCQkJCQkJICAgIFR5cGUpOworCQkJCQlpZiAoIVVMVFJBX1ZIQkFfQ0hBTk5FTF9PS19DTElFTlQKKwkJCQkJICAgIChkZXYtPmNoYW5wdHIsIE5VTEwpKSB7CisJCQkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDpbQ0xJRU5UXVZIQkEgZGV2ICVkIGNoYW4gaW52YWxpZC4iLAorCQkJCQkJICAgICBkZXZObyk7CisJCQkJCQlQT1NUQ09ERV9MSU5VWF80CisJCQkJCQkgICAgKERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywKKwkJCQkJCSAgICAgZGV2Tm8sIGJ1c05vLAorCQkJCQkJICAgICBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQkJCQkJcmVzdWx0ID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hBTk5FTF9JTlZBTElEOworCQkJCQkJZ290byBBd2F5OworCQkJCQl9CisJCQkJCWNtZC5tc2d0eXBlID0gR1VFU1RfQUREX1ZIQkE7CisJCQkJCWNtZC5hZGRfdmhiYS5jaGFucHRyID0gZGV2LT5jaGFucHRyOworCQkJCQljbWQuYWRkX3ZoYmEuYnVzTm8gPSBidXNObzsKKwkJCQkJY21kLmFkZF92aGJhLmRldmljZU5vID0gZGV2Tm87CisJCQkJCWNtZC5hZGRfdmhiYS5kZXZJbnN0R3VpZCA9CisJCQkJCSAgICBkZXYtPmRldkluc3RHdWlkOworCQkJCQljbWQuYWRkX3ZoYmEuaW50ciA9IGRldi0+aW50cjsKKwkJCQl9IGVsc2UKKwkJCQkgICAgaWYgKCFtZW1jbXAKKwkJCQkJKCZkZXYtPmNoYW5uZWxUeXBlR3VpZCwKKwkJCQkJICZVbHRyYVZuaWNDaGFubmVsUHJvdG9jb2xHdWlkLAorCQkJCQkgc2l6ZW9mKEdVSUQpKSkgeworCQkJCQlXQUlUX0ZPUl9WQUxJRF9HVUlEKCgoQ0hBTk5FTF9IRUFERVIKKwkJCQkJCQkgICAgICBfX2lvbWVtICopIChkZXYtPgorCQkJCQkJCQkgIGNoYW5wdHIpKS0+CisJCQkJCQkJICAgIFR5cGUpOworCQkJCQlpZiAoIVVMVFJBX1ZOSUNfQ0hBTk5FTF9PS19DTElFTlQKKwkJCQkJICAgIChkZXYtPmNoYW5wdHIsIE5VTEwpKSB7CisJCQkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogVk5JQ1tDTElFTlRdIGRldiAlZCBjaGFuIGludmFsaWQuIiwKKwkJCQkJCSAgICAgZGV2Tm8pOworCQkJCQkJUE9TVENPREVfTElOVVhfNAorCQkJCQkJICAgIChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsCisJCQkJCQkgICAgIGRldk5vLCBidXNObywKKwkJCQkJCSAgICAgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJCQkJCXJlc3VsdCA9IENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfSU5WQUxJRDsKKwkJCQkJCWdvdG8gQXdheTsKKwkJCQkJfQorCQkJCQljbWQubXNndHlwZSA9IEdVRVNUX0FERF9WTklDOworCQkJCQljbWQuYWRkX3ZuaWMuY2hhbnB0ciA9IGRldi0+Y2hhbnB0cjsKKwkJCQkJY21kLmFkZF92bmljLmJ1c05vID0gYnVzTm87CisJCQkJCWNtZC5hZGRfdm5pYy5kZXZpY2VObyA9IGRldk5vOworCQkJCQljbWQuYWRkX3ZuaWMuZGV2SW5zdEd1aWQgPQorCQkJCQkgICAgZGV2LT5kZXZJbnN0R3VpZDsKKwkJCQkJY21kLmFkZF92aGJhLmludHIgPSBkZXYtPmludHI7CisJCQkJfSBlbHNlIHsKKwkJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IHVua25vd24gY2hhbm5lbFR5cGVHdWlkLlxuIik7CisJCQkJCVBPU1RDT0RFX0xJTlVYXzQKKwkJCQkJICAgIChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldk5vLAorCQkJCQkgICAgIGJ1c05vLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQkJCQlyZXN1bHQgPSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX1RZUEVfVU5LTk9XTjsKKwkJCQkJZ290byBBd2F5OworCQkJCX0KKworCQkJCWlmICghVmlydENvbnRyb2xDaGFuRnVuYykgeworCQkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogdmlydHBjaSBjYWxsYmFjayBub3QgcmVnaXN0ZXJlZC4iKTsKKwkJCQkJUE9TVENPREVfTElOVVhfNAorCQkJCQkgICAgKERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2Tm8sCisJCQkJCSAgICAgYnVzTm8sIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCQkJCXJlc3VsdCA9IENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0ZBSUxVUkU7CisJCQkJCWdvdG8gQXdheTsKKwkJCQl9CisKKwkJCQlpZiAoIVZpcnRDb250cm9sQ2hhbkZ1bmMoJmNtZCkpIHsKKwkJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IHZpcnRwY2kgR1VFU1RfQUREX1tWSEJBfHxWTklDXSByZXR1cm5lZCBlcnJvci4iKTsKKwkJCQkJUE9TVENPREVfTElOVVhfNAorCQkJCQkgICAgKERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2Tm8sCisJCQkJCSAgICAgYnVzTm8sIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCQkJCXJlc3VsdCA9IENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SOworCQkJCQlnb3RvIEF3YXk7CisJCQkJfQorCQkJfQorCQkJYnVzLT5kZXZpY2VbZGV2Tm9dID0gZGV2OworCQkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX1NVQ0NFU1NfUEMsIGRldk5vLCBidXNObywKKwkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKworCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBmYWlsZWQgdG8gZmluZCBidXMgJWQuIiwgYnVzTm8pOworCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwlyZXN1bHQgPSBDT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfSU5WQUxJRDsKKworQXdheToKKwlpZiAoIW1zZy0+aGRyLkZsYWdzLnRlc3RNZXNzYWdlKSB7CisJCXVpc2xpYl9pb3VubWFwKGRldi0+Y2hhbnB0cik7CisJCWRldi0+Y2hhbnB0ciA9IE5VTEw7CisJfQorCisJa2ZyZWUoZGV2KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CitwYXVzZV9kZXZpY2UoQ09OVFJPTFZNX01FU1NBR0UgKm1zZykKK3sKKwlVMzIgYnVzTm8sIGRldk5vOworCXN0cnVjdCBidXNfaW5mbyAqYnVzOworCXN0cnVjdCBkZXZpY2VfaW5mbyAqZGV2OworCXN0cnVjdCBndWVzdF9tc2dzIGNtZDsKKworCWJ1c05vID0gbXNnLT5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuYnVzTm87CisJZGV2Tm8gPSBtc2ctPmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5kZXZObzsKKworCXJlYWRfbG9jaygmQnVzTGlzdExvY2spOworCWZvciAoYnVzID0gQnVzTGlzdEhlYWQ7IGJ1czsgYnVzID0gYnVzLT5uZXh0KSB7CisJCWlmIChidXMtPmJ1c05vID09IGJ1c05vKSB7CisJCQkvKiBtYWtlIHN1cmUgdGhlIGRldmljZSBudW1iZXIgaXMgdmFsaWQgKi8KKwkJCWlmIChkZXZObyA+PSBidXMtPmRldmljZUNvdW50KSB7CisJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFOnBhdXNlIEZhaWxlZDogZGV2aWNlKCVkKSA+PSBkZXZpY2VDb3VudCglZCkuIiwKKwkJCQkgICAgIGRldk5vLCBidXMtPmRldmljZUNvdW50KTsKKwkJCQlyZWFkX3VubG9jaygmQnVzTGlzdExvY2spOworCQkJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9ERVZJQ0VfSU5WQUxJRDsKKwkJCX0KKwkJCS8qIG1ha2Ugc3VyZSB0aGlzIGRldmljZSBleGlzdHMgKi8KKwkJCWRldiA9IGJ1cy0+ZGV2aWNlW2Rldk5vXTsKKwkJCWlmICghZGV2KSB7CisJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFOnBhdXNlIEZhaWxlZDogZGV2aWNlICVkIGRvZXMgbm90IGV4aXN0LiIsCisJCQkJICAgICBkZXZObyk7CisJCQkJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwkJCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOworCQkJfQorCQkJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwkJCS8qIHRoZSBtc2cgaXMgYm91bmQgZm9yIHZpcnRwY2k7IHNlbmQKKwkJCSAqIGd1ZXN0X21zZ3Mgc3RydWN0IHRvIGNhbGxiYWNrCisJCQkgKi8KKwkJCWlmICghbWVtY21wCisJCQkgICAgKCZkZXYtPmNoYW5uZWxUeXBlR3VpZCwKKwkJCSAgICAgJlVsdHJhVmhiYUNoYW5uZWxQcm90b2NvbEd1aWQsIHNpemVvZihHVUlEKSkpIHsKKwkJCQljbWQubXNndHlwZSA9IEdVRVNUX1BBVVNFX1ZIQkE7CisJCQkJY21kLnBhdXNlX3ZoYmEuY2hhbnB0ciA9IGRldi0+Y2hhbnB0cjsKKwkJCX0gZWxzZQorCQkJICAgIGlmICghbWVtY21wCisJCQkJKCZkZXYtPmNoYW5uZWxUeXBlR3VpZCwKKwkJCQkgJlVsdHJhVm5pY0NoYW5uZWxQcm90b2NvbEd1aWQsCisJCQkJIHNpemVvZihHVUlEKSkpIHsKKwkJCQljbWQubXNndHlwZSA9IEdVRVNUX1BBVVNFX1ZOSUM7CisJCQkJY21kLnBhdXNlX3ZuaWMuY2hhbnB0ciA9IGRldi0+Y2hhbnB0cjsKKwkJCX0gZWxzZSB7CisJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFOnBhdXNlIEZhaWxlZDogdW5rbm93biBjaGFubmVsVHlwZUd1aWQuXG4iKTsKKwkJCQlyZXR1cm4KKwkJCQkgICAgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hBTk5FTF9UWVBFX1VOS05PV047CisJCQl9CisKKwkJCWlmICghVmlydENvbnRyb2xDaGFuRnVuYykgeworCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSBGYWlsZWQ6IHZpcnRwY2kgY2FsbGJhY2sgbm90IHJlZ2lzdGVyZWQuIik7CisJCQkJcmV0dXJuCisJCQkJICAgIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0ZBSUxVUkU7CisJCQl9CisKKwkJCWlmICghVmlydENvbnRyb2xDaGFuRnVuYygmY21kKSkgeworCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURTpwYXVzZSBGYWlsZWQ6IHZpcnRwY2kgR1VFU1RfUEFVU0VfW1ZIQkF8fFZOSUNdIHJldHVybmVkIGVycm9yLiIpOworCQkJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9WSVJUUENJX0RSSVZFUl9DQUxMQkFDS19FUlJPUjsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFidXMpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFOnBhdXNlIEZhaWxlZDogYnVzICVkIGRvZXMgbm90IGV4aXN0IiwKKwkJICAgICBidXNObyk7CisJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfSU5WQUxJRDsKKwl9CisKKwlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKK30KKworc3RhdGljIGludAorcmVzdW1lX2RldmljZShDT05UUk9MVk1fTUVTU0FHRSAqbXNnKQoreworCVUzMiBidXNObywgZGV2Tm87CisJc3RydWN0IGJ1c19pbmZvICpidXM7CisJc3RydWN0IGRldmljZV9pbmZvICpkZXY7CisJc3RydWN0IGd1ZXN0X21zZ3MgY21kOworCisJYnVzTm8gPSBtc2ctPmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5idXNObzsKKwlkZXZObyA9IG1zZy0+Y21kLmRldmljZUNoYW5nZVN0YXRlLmRldk5vOworCisJcmVhZF9sb2NrKCZCdXNMaXN0TG9jayk7CisJZm9yIChidXMgPSBCdXNMaXN0SGVhZDsgYnVzOyBidXMgPSBidXMtPm5leHQpIHsKKwkJaWYgKGJ1cy0+YnVzTm8gPT0gYnVzTm8pIHsKKwkJCS8qIG1ha2Ugc3VyZSB0aGUgZGV2aWNlIG51bWJlciBpcyB2YWxpZCAqLworCQkJaWYgKGRldk5vID49IGJ1cy0+ZGV2aWNlQ291bnQpIHsKKwkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cmVzdW1lIEZhaWxlZDogZGV2aWNlKCVkKSA+PSBkZXZpY2VDb3VudCglZCkuIiwKKwkJCQkgICAgIGRldk5vLCBidXMtPmRldmljZUNvdW50KTsKKwkJCQlyZWFkX3VubG9jaygmQnVzTGlzdExvY2spOworCQkJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9ERVZJQ0VfSU5WQUxJRDsKKwkJCX0KKwkJCS8qIG1ha2Ugc3VyZSB0aGlzIGRldmljZSBleGlzdHMgKi8KKwkJCWRldiA9IGJ1cy0+ZGV2aWNlW2Rldk5vXTsKKwkJCWlmICghZGV2KSB7CisJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFOnJlc3VtZSBGYWlsZWQ6IGRldmljZSAlZCBkb2VzIG5vdCBleGlzdC4iLAorCQkJCSAgICAgZGV2Tm8pOworCQkJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKKwkJCX0KKwkJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCQkvKiB0aGUgbXNnIGlzIGJvdW5kIGZvciB2aXJ0cGNpOyBzZW5kCisJCQkgKiBndWVzdF9tc2dzIHN0cnVjdCB0byBjYWxsYmFjaworCQkJICovCisJCQlpZiAoIW1lbWNtcCgmZGV2LT5jaGFubmVsVHlwZUd1aWQsCisJCQkJICAgICZVbHRyYVZoYmFDaGFubmVsUHJvdG9jb2xHdWlkLAorCQkJCSAgICBzaXplb2YoR1VJRCkpKSB7CisJCQkJY21kLm1zZ3R5cGUgPSBHVUVTVF9SRVNVTUVfVkhCQTsKKwkJCQljbWQucmVzdW1lX3ZoYmEuY2hhbnB0ciA9IGRldi0+Y2hhbnB0cjsKKwkJCX0gZWxzZQorCQkJICAgIGlmICghbWVtY21wKCZkZXYtPmNoYW5uZWxUeXBlR3VpZCwKKwkJCQkJJlVsdHJhVm5pY0NoYW5uZWxQcm90b2NvbEd1aWQsCisJCQkJCXNpemVvZihHVUlEKSkpIHsKKwkJCQljbWQubXNndHlwZSA9IEdVRVNUX1JFU1VNRV9WTklDOworCQkJCWNtZC5yZXN1bWVfdm5pYy5jaGFucHRyID0gZGV2LT5jaGFucHRyOworCQkJfSBlbHNlIHsKKwkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cmVzdW1lIEZhaWxlZDogdW5rbm93biBjaGFubmVsVHlwZUd1aWQuXG4iKTsKKwkJCQlyZXR1cm4KKwkJCQkgICAgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hBTk5FTF9UWVBFX1VOS05PV047CisJCQl9CisKKwkJCWlmICghVmlydENvbnRyb2xDaGFuRnVuYykgeworCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSBGYWlsZWQ6IHZpcnRwY2kgY2FsbGJhY2sgbm90IHJlZ2lzdGVyZWQuIik7CisJCQkJcmV0dXJuCisJCQkJICAgIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0ZBSUxVUkU7CisJCQl9CisKKwkJCWlmICghVmlydENvbnRyb2xDaGFuRnVuYygmY21kKSkgeworCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURTpyZXN1bWUgRmFpbGVkOiB2aXJ0cGNpIEdVRVNUX1JFU1VNRV9bVkhCQXx8Vk5JQ10gcmV0dXJuZWQgZXJyb3IuIik7CisJCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWJ1cykgeworCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cmVzdW1lIEZhaWxlZDogYnVzICVkIGRvZXMgbm90IGV4aXN0IiwKKwkJICAgICBidXNObyk7CisJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfSU5WQUxJRDsKKwl9CisKKwlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKK30KKworc3RhdGljIGludAorZGVzdHJveV9kZXZpY2UoQ09OVFJPTFZNX01FU1NBR0UgKm1zZywgY2hhciAqYnVmKQoreworCVUzMiBidXNObywgZGV2Tm87CisJc3RydWN0IGJ1c19pbmZvICpidXM7CisJc3RydWN0IGRldmljZV9pbmZvICpkZXY7CisJc3RydWN0IGd1ZXN0X21zZ3MgY21kOworCisJYnVzTm8gPSBtc2ctPmNtZC5kZXN0cm95RGV2aWNlLmJ1c05vOworCWRldk5vID0gbXNnLT5jbWQuZGVzdHJveURldmljZS5kZXZObzsKKworCXJlYWRfbG9jaygmQnVzTGlzdExvY2spOworCUxPR0lORigiZGVzdHJveV9kZXZpY2UgY2FsbGVkIGZvciBidXNObz0ldSwgZGV2Tm89JXUiLCBidXNObywgZGV2Tm8pOworCWZvciAoYnVzID0gQnVzTGlzdEhlYWQ7IGJ1czsgYnVzID0gYnVzLT5uZXh0KSB7CisJCWlmIChidXMtPmJ1c05vID09IGJ1c05vKSB7CisJCQkvKiBtYWtlIHN1cmUgdGhlIGRldmljZSBudW1iZXIgaXMgdmFsaWQgKi8KKwkJCWlmIChkZXZObyA+PSBidXMtPmRldmljZUNvdW50KSB7CisJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0RFU1RPUlkgRmFpbGVkOiBkZXZpY2UoJWQpID49IGRldmljZUNvdW50KCVkKS4iLAorCQkJCSAgICAgZGV2Tm8sIGJ1cy0+ZGV2aWNlQ291bnQpOworCQkJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9JTlZBTElEOworCQkJfQorCQkJLyogbWFrZSBzdXJlIHRoaXMgZGV2aWNlIGV4aXN0cyAqLworCQkJZGV2ID0gYnVzLT5kZXZpY2VbZGV2Tm9dOworCQkJaWYgKCFkZXYpIHsKKwkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSBGYWlsZWQ6IGRldmljZSAlZCBkb2VzIG5vdCBleGlzdC4iLAorCQkJCSAgICAgZGV2Tm8pOworCQkJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKKwkJCX0KKwkJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCQkvKiB0aGUgbXNnIGlzIGJvdW5kIGZvciB2aXJ0cGNpOyBzZW5kCisJCQkgKiBndWVzdF9tc2dzIHN0cnVjdCB0byBjYWxsYmFjaworCQkJICovCisJCQlpZiAoIW1lbWNtcAorCQkJICAgICgmZGV2LT5jaGFubmVsVHlwZUd1aWQsCisJCQkgICAgICZVbHRyYVZoYmFDaGFubmVsUHJvdG9jb2xHdWlkLCBzaXplb2YoR1VJRCkpKSB7CisJCQkJY21kLm1zZ3R5cGUgPSBHVUVTVF9ERUxfVkhCQTsKKwkJCQljbWQuZGVsX3ZoYmEuY2hhbnB0ciA9IGRldi0+Y2hhbnB0cjsKKwkJCX0gZWxzZQorCQkJICAgIGlmICghbWVtY21wCisJCQkJKCZkZXYtPmNoYW5uZWxUeXBlR3VpZCwKKwkJCQkgJlVsdHJhVm5pY0NoYW5uZWxQcm90b2NvbEd1aWQsCisJCQkJIHNpemVvZihHVUlEKSkpIHsKKwkJCQljbWQubXNndHlwZSA9IEdVRVNUX0RFTF9WTklDOworCQkJCWNtZC5kZWxfdm5pYy5jaGFucHRyID0gZGV2LT5jaGFucHRyOworCQkJfSBlbHNlIHsKKwkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSBGYWlsZWQ6IHVua25vd24gY2hhbm5lbFR5cGVHdWlkLlxuIik7CisJCQkJcmV0dXJuCisJCQkJICAgIENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfVFlQRV9VTktOT1dOOworCQkJfQorCisJCQlpZiAoIVZpcnRDb250cm9sQ2hhbkZ1bmMpIHsKKwkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfREVTVE9SWSBGYWlsZWQ6IHZpcnRwY2kgY2FsbGJhY2sgbm90IHJlZ2lzdGVyZWQuIik7CisJCQkJcmV0dXJuCisJCQkJICAgIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0ZBSUxVUkU7CisJCQl9CisKKwkJCWlmICghVmlydENvbnRyb2xDaGFuRnVuYygmY21kKSkgeworCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZIEZhaWxlZDogdmlydHBjaSBHVUVTVF9ERUxfW1ZIQkF8fFZOSUNdIHJldHVybmVkIGVycm9yLiIpOworCQkJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9WSVJUUENJX0RSSVZFUl9DQUxMQkFDS19FUlJPUjsKKwkJCX0KKy8qIHlvdSBtdXN0IGRpc2FibGUgY2hhbm5lbCBpbnRlcnJ1cHRzIEJFRk9SRSB5b3UgdW5tYXAgdGhlIGNoYW5uZWwsCisgKiBiZWNhdXNlIGlmIHlvdSB1bm1hcCBmaXJzdCwgdGhlcmUgbWF5IHN0aWxsIGJlIHNvbWUgYWN0aXZpdHkgZ29pbmcKKyAqIG9uIHdoaWNoIGFjY2Vzc2VzIHRoZSBjaGFubmVsIGFuZCB5b3Ugd2lsbCBnZXQgYSAidW5hYmxlIHRvIGhhbmRsZQorICoga2VybmVsIHBhZ2luZyByZXF1ZXN0IgorICovCisJCQlpZiAoZGV2LT5wb2xsaW5nKSB7CisJCQkJTE9HSU5GKCJjYWxsaW5nIHVpc2xpYl9kaXNhYmxlX2NoYW5uZWxfaW50ZXJydXB0cyIpOworCQkJCXVpc2xpYl9kaXNhYmxlX2NoYW5uZWxfaW50ZXJydXB0cyhidXNObywgZGV2Tm8pOworCQkJfQorCQkJLyogdW5tYXAgdGhlIGNoYW5uZWwgbWVtb3J5IGZvciB0aGUgZGV2aWNlLiAqLworCQkJaWYgKCFtc2ctPmhkci5GbGFncy50ZXN0TWVzc2FnZSkgeworCQkJCUxPR0lORigiZGVzdHJveV9kZXZpY2UsIGRvaW5nIGlvdW5tYXAiKTsKKwkJCQl1aXNsaWJfaW91bm1hcChkZXYtPmNoYW5wdHIpOworCQkJfQorCQkJa2ZyZWUoZGV2KTsKKwkJCWJ1cy0+ZGV2aWNlW2Rldk5vXSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghYnVzKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZIEZhaWxlZDogYnVzICVkIGRvZXMgbm90IGV4aXN0IiwKKwkJICAgICAgIGJ1c05vKTsKKwkJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOworCX0KKworCXJldHVybiBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworfQorCitzdGF0aWMgaW50Citpbml0X2NoaXBzZXQoQ09OVFJPTFZNX01FU1NBR0UgKm1zZywgY2hhciAqYnVmKQoreworCVBPU1RDT0RFX0xJTlVYXzIoQ0hJUFNFVF9JTklUX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCU1heEJ1c0NvdW50ID0gbXNnLT5jbWQuaW5pdENoaXBzZXQuYnVzQ291bnQ7CisJUGxhdGZvcm1OdW1iZXIgPSBtc2ctPmNtZC5pbml0Q2hpcHNldC5wbGF0Zm9ybU51bWJlcjsKKwlQaHlzaWNhbERhdGFDaGFuID0gMDsKKworCS8qIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgb3VyIGZ1bmN0aW9ucyByZWdpc3RlcmVkCisJKiBiZWZvcmUgcHJvY2Vzc2luZyBtZXNzYWdlcy4gIElmIHdlIGFyZSBhIHRlc3QgdmVoaWNsZSB0aGUKKwkqIHRlc3RNZXNzYWdlIGZvciBpbml0X2NoaXBzZXQgd2lsbCBiZSBzZXQuICBXZSBjYW4gaWdub3JlIHRoZQorCSogd2FpdHMgZm9yIHRoZSBjYWxsYmFja3MsIHNpbmNlIHRoaXMgd2lsbCBiZSBtYW51YWxseSBlbnRlcmVkCisJKiBmcm9tIGEgdXNlci4gIElmIG5vIHRlc3RNZXNzYWdlIGlzIHNldCwgd2Ugd2lsbCB3YWl0IGZvciB0aGUKKwkqIGZ1bmN0aW9ucy4KKwkqLworCWlmICghbXNnLT5oZHIuRmxhZ3MudGVzdE1lc3NhZ2UpCisJCVdBSVRfT05fQ0FMTEJBQ0soVmlydENvbnRyb2xDaGFuRnVuYyk7CisKKwljaGlwc2V0X2luaXRlZCA9IDE7CisJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisKKwlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKK30KKworc3RhdGljIGludAorc3RvcF9jaGlwc2V0KENPTlRST0xWTV9NRVNTQUdFICptc2csIGNoYXIgKmJ1ZikKK3sKKwkvKiBDaGVjayB0aGF0IGFsbCBidXNlcyBhbmQgc3dpdGNoZXMgaGF2ZSBiZWVuIHRvcm4gZG93biBhbmQKKwkgKiBkZXN0cm95ZWQuCisJICovCisJaWYgKEJ1c0xpc3RIZWFkKSB7CisJCS8qIEJ1c2VzIHN0aWxsIGV4aXN0LiAqLworCQlMT0dFUlIoIkNPTlRST0xWTV9DSElQU0VUX1NUT1A6IEJ1c0xpc3RIZWFkIGlzIG5vdCBOVUxMIik7CisJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSElQU0VUX1NUT1BfRkFJTEVEX0JVUzsKKwl9CisJaWYgKEJ1c0xpc3RDb3VudCkgeworCQkvKiBCdXNMaXN0SGVhZCBpcyBOVUxMLCBidXQgQnVzTGlzdENvdW50ICE9IDAgKi8KKwkJTE9HRVJSKCJDT05UUk9MVk1fQ0hJUFNFVF9TVE9QOiBCdXNMaXN0Q291bnQgIT0gMCIpOworCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hJUFNFVF9TVE9QX0ZBSUxFRF9CVVM7CisJfQorCisJLyogQnVzZXMgYXJlIHNodXQgZG93bi4gKi8KKwlyZXR1cm4gdmlzb3JjaGlwc2V0X2NoaXBzZXRfbm90cmVhZHkoKTsKK30KKworc3RhdGljIGludAorZGVsZXRlX2J1c19nbHVlKFUzMiBidXNObykKK3sKKwlDT05UUk9MVk1fTUVTU0FHRSBtc2c7CisKKwlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0JVU19ERVNUUk9ZLCAwLCAwKTsKKwltc2cuY21kLmRlc3Ryb3lCdXMuYnVzTm8gPSBidXNObzsKKwlpZiAoZGVzdHJveV9idXMoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoImRlc3Ryb3lfYnVzIGZhaWxlZC4gYnVzTm89MHgleFxuIiwgYnVzTm8pOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2RlbGV0ZV9kZXZpY2VfZ2x1ZShVMzIgYnVzTm8sIFUzMiBkZXZObykKK3sKKwlDT05UUk9MVk1fTUVTU0FHRSBtc2c7CisKKwlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZLCAwLCAwKTsKKwltc2cuY21kLmRlc3Ryb3lEZXZpY2UuYnVzTm8gPSBidXNObzsKKwltc2cuY21kLmRlc3Ryb3lEZXZpY2UuZGV2Tm8gPSBkZXZObzsKKwlpZiAoZGVzdHJveV9kZXZpY2UoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoImRlc3Ryb3lfZGV2aWNlIGZhaWxlZC4gYnVzTm89MHgleCBkZXZObz0weCV4XG4iLCBidXNObywKKwkJICAgICAgIGRldk5vKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitpbnQKK3Vpc2xpYl9jbGllbnRfaW5qZWN0X2FkZF9idXMoVTMyIGJ1c05vLCBHVUlEIGluc3RHdWlkLAorCQkJICAgICBVNjQgY2hhbm5lbEFkZHIsIHVsb25nIG5DaGFubmVsQnl0ZXMpCit7CisJQ09OVFJPTFZNX01FU1NBR0UgbXNnOworCisJTE9HSU5GKCJlbnRlciBidXNObz0weCV4XG4iLCBidXNObyk7CisJLyogc3RlcCAwOiBpbml0IHRoZSBjaGlwc2V0ICovCisJUE9TVENPREVfTElOVVhfMyhDSElQU0VUX0lOSVRfRU5UUllfUEMsIGJ1c05vLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCWlmICghY2hpcHNldF9pbml0ZWQpIHsKKwkJLyogc3RlcDogaW5pdGlhbGl6ZSB0aGUgY2hpcHNldCAqLworCQlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0NISVBTRVRfSU5JVCwgMCwgMCk7CisJCS8qIHRoaXMgY2hhbmdlIGlzIG5lZWRlZCBzbyB0aGF0IGNvbnNvbGUgd2lsbCBjb21lIHVwCisJCSogT0sgZXZlbiB3aGVuIHRoZSBidXMgMCBjcmVhdGUgY29tZXMgaW4gbGF0ZS4gIElmIHRoZQorCQkqIGJ1cyAwIGNyZWF0ZSBpcyB0aGUgZmlyc3QgY3JlYXRlLCB0aGVuIHRoZSBhZGRfdm5pYworCQkqIHdpbGwgd29yayBmaW5lLCBidXQgaWYgdGhlIGJ1cyAwIGNyZWF0ZSBhcnJpdmVzCisJCSogYWZ0ZXIgbnVtYmVyIDQsIHRoZW4gdGhlIGFkZF92bmljIHdpbGwgZmFpbCwgYW5kIHRoZQorCQkqIHVsdHJhYm9vdCB3aWxsIGZhaWwuCisJCSovCisJCW1zZy5jbWQuaW5pdENoaXBzZXQuYnVzQ291bnQgPSAyMzsKKwkJbXNnLmNtZC5pbml0Q2hpcHNldC5zd2l0Y2hDb3VudCA9IDA7CisJCWlmIChpbml0X2NoaXBzZXQoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQkJTE9HRVJSKCJpbml0X2NoaXBzZXQgZmFpbGVkLlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlMT0dJTkYoImNoaXBzZXQgaW5pdGlhbGl6ZWRcbiIpOworCQlQT1NUQ09ERV9MSU5VWF8zKENISVBTRVRfSU5JVF9FWElUX1BDLCBidXNObywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJfQorCisJLyogc3RlcCAxOiBjcmVhdGUgYSBidXMgKi8KKwlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRU5UUllfUEMsIGJ1c05vLCBQT1NUQ09ERV9TRVZFUklUWV9XQVJOSU5HKTsKKwlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0JVU19DUkVBVEUsIDAsIDApOworCW1zZy5jbWQuY3JlYXRlQnVzLmJ1c05vID0gYnVzTm87CisJbXNnLmNtZC5jcmVhdGVCdXMuZGV2aWNlQ291bnQgPSAyMzsJLyogZGV2Tm8rMTsgKi8KKwltc2cuY21kLmNyZWF0ZUJ1cy5jaGFubmVsQWRkciA9IGNoYW5uZWxBZGRyOworCW1zZy5jbWQuY3JlYXRlQnVzLmNoYW5uZWxCeXRlcyA9IG5DaGFubmVsQnl0ZXM7CisJaWYgKGNyZWF0ZV9idXMoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoImNyZWF0ZV9idXMgZmFpbGVkLlxuIik7CisJCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9GQUlMVVJFX1BDLCBidXNObywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIDA7CisJfQorCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9FWElUX1BDLCBidXNObywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfaW5qZWN0X2FkZF9idXMpOworCisKK2ludAordWlzbGliX2NsaWVudF9pbmplY3RfZGVsX2J1cyhVMzIgYnVzTm8pCit7CisJcmV0dXJuIGRlbGV0ZV9idXNfZ2x1ZShidXNObyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfYnVzKTsKKworaW50Cit1aXNsaWJfY2xpZW50X2luamVjdF9wYXVzZV92aGJhKFUzMiBidXNObywgVTMyIGRldk5vKQoreworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKwlpbnQgcmM7CisKKwlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSwgMCwgMCk7CisJbXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5idXNObyA9IGJ1c05vOworCW1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuZGV2Tm8gPSBkZXZObzsKKwltc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLnN0YXRlID0gU2VnbWVudFN0YXRlU3RhbmRieTsKKwlyYyA9IHBhdXNlX2RldmljZSgmbXNnKTsKKwlpZiAocmMgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoIlZIQkEgcGF1c2VfZGV2aWNlIGZhaWxlZC4gYnVzTm89MHgleCBkZXZObz0weCV4XG4iLAorCQkgICAgICAgYnVzTm8sIGRldk5vKTsKKwkJcmV0dXJuIHJjOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfaW5qZWN0X3BhdXNlX3ZoYmEpOworCitpbnQKK3Vpc2xpYl9jbGllbnRfaW5qZWN0X3Jlc3VtZV92aGJhKFUzMiBidXNObywgVTMyIGRldk5vKQoreworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKwlpbnQgcmM7CisKKwlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSwgMCwgMCk7CisJbXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5idXNObyA9IGJ1c05vOworCW1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuZGV2Tm8gPSBkZXZObzsKKwltc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLnN0YXRlID0gU2VnbWVudFN0YXRlUnVubmluZzsKKwlyYyA9IHJlc3VtZV9kZXZpY2UoJm1zZyk7CisJaWYgKHJjICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKKwkJTE9HRVJSKCJWSEJBIHJlc3VtZV9kZXZpY2UgZmFpbGVkLiBidXNObz0weCV4IGRldk5vPTB4JXhcbiIsCisJCSAgICAgICBidXNObywgZGV2Tm8pOworCQlyZXR1cm4gcmM7CisJfQorCXJldHVybiAwOworCit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2xpZW50X2luamVjdF9yZXN1bWVfdmhiYSk7CisKK2ludAordWlzbGliX2NsaWVudF9pbmplY3RfYWRkX3ZoYmEoVTMyIGJ1c05vLCBVMzIgZGV2Tm8sCisJCQkgICAgICBVNjQgcGh5c19jaGFuX2FkZHIsIFUzMiBjaGFuX2J5dGVzLAorCQkJICAgICAgaW50IGlzX3Rlc3RfYWRkciwgR1VJRCBpbnN0R3VpZCwKKwkJCSAgICAgIHN0cnVjdCBJbnRlcnJ1cHRJbmZvICppbnRyKQoreworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKworCUxPR0lORigiIGVudGVyIGJ1c05vPTB4JXggZGV2Tm89MHgleFxuIiwgYnVzTm8sIGRldk5vKTsKKwkvKiBjaGlwc2V0IGluaXQnZWQgd2l0aCBidXMgYnVzIGhhcyBiZWVuIHByZXZpb3VzbHkgY3JlYXRlZCAtCisJKiBWZXJpZnkgaXQgc3RpbGwgZXhpc3RzIHN0ZXAgMjogY3JlYXRlIHRoZSBWSEJBIGRldmljZSBvbiB0aGUKKwkqIGJ1cworCSovCisJUE9TVENPREVfTElOVVhfNChWSEJBX0NSRUFURV9FTlRSWV9QQywgZGV2Tm8sIGJ1c05vLAorCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCisJaW5pdF9tc2dfaGVhZGVyKCZtc2csIENPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFLCAwLCAwKTsKKwlpZiAoaXNfdGVzdF9hZGRyKQorCQkvKiBzaWduaWZ5IHRoYXQgdGhlIHBoeXNpY2FsIGNoYW5uZWwgYWRkcmVzcyBkb2VzIE5PVAorCQkgKiBuZWVkIHRvIGJlIGlvcmVtYXAoKWVkCisJCSAqLworCQltc2cuaGRyLkZsYWdzLnRlc3RNZXNzYWdlID0gMTsKKwltc2cuY21kLmNyZWF0ZURldmljZS5idXNObyA9IGJ1c05vOworCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmRldk5vID0gZGV2Tm87CisJbXNnLmNtZC5jcmVhdGVEZXZpY2UuZGV2SW5zdEd1aWQgPSBpbnN0R3VpZDsKKwlpZiAoaW50cikKKwkJbXNnLmNtZC5jcmVhdGVEZXZpY2UuaW50ciA9ICppbnRyOworCWVsc2UKKwkJbWVtc2V0KCZtc2cuY21kLmNyZWF0ZURldmljZS5pbnRyLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBJbnRlcnJ1cHRJbmZvKSk7CisJbXNnLmNtZC5jcmVhdGVEZXZpY2UuY2hhbm5lbEFkZHIgPSBwaHlzX2NoYW5fYWRkcjsKKwlpZiAoY2hhbl9ieXRlcyA8IE1JTl9JT19DSEFOTkVMX1NJWkUpIHsKKwkJTE9HRVJSKCJ3cm9uZyBjaGFubmVsIHNpemUuY2hhbl9ieXRlcyA9IDB4JXggSU9fQ0hBTk5FTF9TSVpFPSAweCV4XG4iLAorCQkgICAgIGNoYW5fYnl0ZXMsICh1bnNpZ25lZCBpbnQpIE1JTl9JT19DSEFOTkVMX1NJWkUpOworCQlQT1NUQ09ERV9MSU5VWF80KFZIQkFfQ1JFQVRFX0ZBSUxVUkVfUEMsIGNoYW5fYnl0ZXMsCisJCQkJIE1JTl9JT19DSEFOTkVMX1NJWkUsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiAwOworCX0KKwltc2cuY21kLmNyZWF0ZURldmljZS5jaGFubmVsQnl0ZXMgPSBjaGFuX2J5dGVzOworCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmRhdGFUeXBlR3VpZCA9IFVsdHJhVmhiYUNoYW5uZWxQcm90b2NvbEd1aWQ7CisJaWYgKGNyZWF0ZV9kZXZpY2UoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoIlZIQkEgY3JlYXRlX2RldmljZSBmYWlsZWQuXG4iKTsKKwkJUE9TVENPREVfTElOVVhfNChWSEJBX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiAwOworCX0KKwlQT1NUQ09ERV9MSU5VWF80KFZIQkFfQ1JFQVRFX1NVQ0NFU1NfUEMsIGRldk5vLCBidXNObywKKwkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfaW5qZWN0X2FkZF92aGJhKTsKKworaW50Cit1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfdmhiYShVMzIgYnVzTm8sIFUzMiBkZXZObykKK3sKKwlyZXR1cm4gZGVsZXRlX2RldmljZV9nbHVlKGJ1c05vLCBkZXZObyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfdmhiYSk7CisKK2ludAordWlzbGliX2NsaWVudF9pbmplY3RfYWRkX3ZuaWMoVTMyIGJ1c05vLCBVMzIgZGV2Tm8sCisJCQkgICAgICBVNjQgcGh5c19jaGFuX2FkZHIsIFUzMiBjaGFuX2J5dGVzLAorCQkJICAgICAgaW50IGlzX3Rlc3RfYWRkciwgR1VJRCBpbnN0R3VpZCwKKwkJCSAgICAgIHN0cnVjdCBJbnRlcnJ1cHRJbmZvICppbnRyKQoreworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKworCUxPR0lORigiIGVudGVyIGJ1c05vPTB4JXggZGV2Tm89MHgleFxuIiwgYnVzTm8sIGRldk5vKTsKKwkvKiBjaGlwc2V0IGluaXQnZWQgd2l0aCBidXMgYnVzIGhhcyBiZWVuIHByZXZpb3VzbHkgY3JlYXRlZCAtCisJKiBWZXJpZnkgaXQgc3RpbGwgZXhpc3RzIHN0ZXAgMjogY3JlYXRlIHRoZSBWTklDIGRldmljZSBvbiB0aGUKKwkqIGJ1cworCSovCisJUE9TVENPREVfTElOVVhfNChWTklDX0NSRUFURV9FTlRSWV9QQywgZGV2Tm8sIGJ1c05vLAorCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCisJaW5pdF9tc2dfaGVhZGVyKCZtc2csIENPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFLCAwLCAwKTsKKwlpZiAoaXNfdGVzdF9hZGRyKQorCQkvKiBzaWduaWZ5IHRoYXQgdGhlIHBoeXNpY2FsIGNoYW5uZWwgYWRkcmVzcyBkb2VzIE5PVAorCQkgKiBuZWVkIHRvIGJlIGlvcmVtYXAoKWVkCisJCSAqLworCQltc2cuaGRyLkZsYWdzLnRlc3RNZXNzYWdlID0gMTsKKwltc2cuY21kLmNyZWF0ZURldmljZS5idXNObyA9IGJ1c05vOworCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmRldk5vID0gZGV2Tm87CisJbXNnLmNtZC5jcmVhdGVEZXZpY2UuZGV2SW5zdEd1aWQgPSBpbnN0R3VpZDsKKwlpZiAoaW50cikKKwkJbXNnLmNtZC5jcmVhdGVEZXZpY2UuaW50ciA9ICppbnRyOworCWVsc2UKKwkJbWVtc2V0KCZtc2cuY21kLmNyZWF0ZURldmljZS5pbnRyLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBJbnRlcnJ1cHRJbmZvKSk7CisJbXNnLmNtZC5jcmVhdGVEZXZpY2UuY2hhbm5lbEFkZHIgPSBwaHlzX2NoYW5fYWRkcjsKKwlpZiAoY2hhbl9ieXRlcyA8IE1JTl9JT19DSEFOTkVMX1NJWkUpIHsKKwkJTE9HRVJSKCJ3cm9uZyBjaGFubmVsIHNpemUuY2hhbl9ieXRlcyA9IDB4JXggSU9fQ0hBTk5FTF9TSVpFPSAweCV4XG4iLAorCQkgICAgIGNoYW5fYnl0ZXMsICh1bnNpZ25lZCBpbnQpIE1JTl9JT19DSEFOTkVMX1NJWkUpOworCQlQT1NUQ09ERV9MSU5VWF80KFZOSUNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGNoYW5fYnl0ZXMsCisJCQkJIE1JTl9JT19DSEFOTkVMX1NJWkUsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiAwOworCX0KKwltc2cuY21kLmNyZWF0ZURldmljZS5jaGFubmVsQnl0ZXMgPSBjaGFuX2J5dGVzOworCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmRhdGFUeXBlR3VpZCA9IFVsdHJhVm5pY0NoYW5uZWxQcm90b2NvbEd1aWQ7CisJaWYgKGNyZWF0ZV9kZXZpY2UoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoIlZOSUMgY3JlYXRlX2RldmljZSBmYWlsZWQuXG4iKTsKKwkJUE9TVENPREVfTElOVVhfNChWTklDX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiAwOworCX0KKworCVBPU1RDT0RFX0xJTlVYXzQoVk5JQ19DUkVBVEVfU1VDQ0VTU19QQywgZGV2Tm8sIGJ1c05vLAorCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzbGliX2NsaWVudF9pbmplY3RfYWRkX3ZuaWMpOworCitpbnQKK3Vpc2xpYl9jbGllbnRfaW5qZWN0X3BhdXNlX3ZuaWMoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pCit7CisJQ09OVFJPTFZNX01FU1NBR0UgbXNnOworCWludCByYzsKKworCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFLCAwLCAwKTsKKwltc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLmJ1c05vID0gYnVzTm87CisJbXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5kZXZObyA9IGRldk5vOworCW1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuc3RhdGUgPSBTZWdtZW50U3RhdGVTdGFuZGJ5OworCXJjID0gcGF1c2VfZGV2aWNlKCZtc2cpOworCWlmIChyYyAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CisJCUxPR0VSUigiVk5JQyBwYXVzZV9kZXZpY2UgZmFpbGVkLiBidXNObz0weCV4IGRldk5vPTB4JXhcbiIsCisJCSAgICAgICBidXNObywgZGV2Tm8pOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzbGliX2NsaWVudF9pbmplY3RfcGF1c2Vfdm5pYyk7CisKK2ludAordWlzbGliX2NsaWVudF9pbmplY3RfcmVzdW1lX3ZuaWMoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pCit7CisJQ09OVFJPTFZNX01FU1NBR0UgbXNnOworCWludCByYzsKKworCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFLCAwLCAwKTsKKwltc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLmJ1c05vID0gYnVzTm87CisJbXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5kZXZObyA9IGRldk5vOworCW1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuc3RhdGUgPSBTZWdtZW50U3RhdGVSdW5uaW5nOworCXJjID0gcmVzdW1lX2RldmljZSgmbXNnKTsKKwlpZiAocmMgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoIlZOSUMgcmVzdW1lX2RldmljZSBmYWlsZWQuIGJ1c05vPTB4JXggZGV2Tm89MHgleFxuIiwKKwkJICAgICAgIGJ1c05vLCBkZXZObyk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7CisKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfaW5qZWN0X3Jlc3VtZV92bmljKTsKKworaW50Cit1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfdm5pYyhVMzIgYnVzTm8sIFUzMiBkZXZObykKK3sKKwlyZXR1cm4gZGVsZXRlX2RldmljZV9nbHVlKGJ1c05vLCBkZXZObyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfdm5pYyk7CisKK3N0YXRpYyBpbnQKK3Vpc2xpYl9jbGllbnRfYWRkX3ZuaWMoVTMyIGJ1c05vKQoreworCUJPT0wgYnVzQ3JlYXRlZCA9IEZBTFNFOworCWludCBkZXZObyA9IDA7CQkvKiBEZWZhdWx0IHRvIDAsIHNpbmNlIG9ubHkgb25lIGRldmljZQorCQkJCSAqIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhpcyBidXMuLi4gKi8KKwlHVUlEIGR1bW15R3VpZCA9IEdVSUQwOworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKworCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fQlVTX0NSRUFURSwgMCwgMCk7CisJbXNnLmhkci5GbGFncy50ZXN0TWVzc2FnZSA9IDE7CisJbXNnLmNtZC5jcmVhdGVCdXMuYnVzTm8gPSBidXNObzsKKwltc2cuY21kLmNyZWF0ZUJ1cy5kZXZpY2VDb3VudCA9IDQ7CisJbXNnLmNtZC5jcmVhdGVCdXMuY2hhbm5lbEFkZHIgPSAwOworCW1zZy5jbWQuY3JlYXRlQnVzLmNoYW5uZWxCeXRlcyA9IDA7CisJaWYgKGNyZWF0ZV9idXMoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoImNsaWVudCBjcmVhdGVfYnVzIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisJYnVzQ3JlYXRlZCA9IFRSVUU7CisKKwlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUsIDAsIDApOworCW1zZy5oZHIuRmxhZ3MudGVzdE1lc3NhZ2UgPSAxOworCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmJ1c05vID0gYnVzTm87CisJbXNnLmNtZC5jcmVhdGVEZXZpY2UuZGV2Tm8gPSBkZXZObzsKKwltc2cuY21kLmNyZWF0ZURldmljZS5kZXZJbnN0R3VpZCA9IGR1bW15R3VpZDsKKwltZW1zZXQoJm1zZy5jbWQuY3JlYXRlRGV2aWNlLmludHIsIDAsIHNpemVvZihzdHJ1Y3QgSW50ZXJydXB0SW5mbykpOworCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmNoYW5uZWxBZGRyID0gUGh5c2ljYWxEYXRhQ2hhbjsKKwltc2cuY21kLmNyZWF0ZURldmljZS5jaGFubmVsQnl0ZXMgPSBNSU5fSU9fQ0hBTk5FTF9TSVpFOworCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmRhdGFUeXBlR3VpZCA9IFVsdHJhVm5pY0NoYW5uZWxQcm90b2NvbEd1aWQ7CisJaWYgKGNyZWF0ZV9kZXZpY2UoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoImNsaWVudCBjcmVhdGVfZGV2aWNlIGZhaWxlZCIpOworCQlnb3RvIEF3YXlDbGVhbnVwOworCX0KKworCXJldHVybiAxOworCitBd2F5Q2xlYW51cDoKKwlpZiAoYnVzQ3JlYXRlZCkgeworCQlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0JVU19ERVNUUk9ZLCAwLCAwKTsKKwkJbXNnLmhkci5GbGFncy50ZXN0TWVzc2FnZSA9IDE7CisJCW1zZy5jbWQuZGVzdHJveUJ1cy5idXNObyA9IGJ1c05vOworCQlpZiAoZGVzdHJveV9idXMoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKKwkJCUxPR0VSUigiY2xpZW50IGRlc3Ryb3lfYnVzIGZhaWxlZC5cbiIpOworCX0KKworCXJldHVybiAwOworfQkJCQkvKiBlbmQgdWlzbGliX2NsaWVudF9hZGRfdm5pYyAqLworRVhQT1JUX1NZTUJPTF9HUEwodWlzbGliX2NsaWVudF9hZGRfdm5pYyk7CisKK3N0YXRpYyBpbnQKK3Vpc2xpYl9jbGllbnRfZGVsZXRlX3ZuaWMoVTMyIGJ1c05vKQoreworCWludCBkZXZObyA9IDA7CQkvKiBEZWZhdWx0IHRvIDAsIHNpbmNlIG9ubHkgb25lIGRldmljZQorCQkJCSAqIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhpcyBidXMuLi4gKi8KKwlDT05UUk9MVk1fTUVTU0FHRSBtc2c7CisKKwlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZLCAwLCAwKTsKKwltc2cuaGRyLkZsYWdzLnRlc3RNZXNzYWdlID0gMTsKKwltc2cuY21kLmRlc3Ryb3lEZXZpY2UuYnVzTm8gPSBidXNObzsKKwltc2cuY21kLmRlc3Ryb3lEZXZpY2UuZGV2Tm8gPSBkZXZObzsKKwlpZiAoZGVzdHJveV9kZXZpY2UoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQkvKiBEb24ndCBlcnJvciBleGl0IC0gdHJ5IHRvIHNlZSBpZiBidXMgY2FuIGJlIGRlc3Ryb3llZC4uLiAqLworCQlMT0dFUlIoImNsaWVudCBkZXN0cm95X2RldmljZSBmYWlsZWQuXG4iKTsKKwl9CisKKwlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0JVU19ERVNUUk9ZLCAwLCAwKTsKKwltc2cuaGRyLkZsYWdzLnRlc3RNZXNzYWdlID0gMTsKKwltc2cuY21kLmRlc3Ryb3lCdXMuYnVzTm8gPSBidXNObzsKKwlpZiAoZGVzdHJveV9idXMoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKKwkJTE9HRVJSKCJjbGllbnQgZGVzdHJveV9idXMgZmFpbGVkLlxuIik7CisKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfZGVsZXRlX3ZuaWMpOworLyogZW5kIGNsaWVudF9kZWxldGVfdm5pYyAqLworCit2b2lkICoKK3Vpc2xpYl9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqY3VyX3Bvb2wsIGNoYXIgKmZuLCBpbnQgbG4pCit7CisJLyogX19HRlBfTk9SRVRSWSBtZWFucyAib2sgdG8gZmFpbCIsIG1lYW5pbmcga21hbGxvYygpIGNhbgorCSogcmV0dXJuIE5VTEwuICBJZiB5b3UgZG8gTk9UIHNwZWNpZnkgX19HRlBfTk9SRVRSWSwgTGludXgKKwkqIHdpbGwgZ28gdG8gZXh0cmVtZSBtZWFzdXJlcyB0byBnZXQgbWVtb3J5IGZvciB5b3UgKGxpa2UsCisJKiBpbnZva2Ugb29tIGtpbGxlciksIHdoaWNoIHdpbGwgcHJvYmFibHkgY3JpcHBsZSB0aGUgc3lzdGVtLgorCSovCisJdm9pZCAqcCA9IGttZW1fY2FjaGVfYWxsb2MoY3VyX3Bvb2wsIEdGUF9BVE9NSUMgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAocCA9PSBOVUxMKSB7CisJCUxPR0VSUigidWlzbGliX21hbGxvYyBmYWlsZWQgdG8gYWxsb2MgdWlzY21kcnNwIEAlczolZCIsCisJCSAgICAgICBmbiwgbG4pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2FjaGVfYWxsb2MpOworCit2b2lkCit1aXNsaWJfY2FjaGVfZnJlZShzdHJ1Y3Qga21lbV9jYWNoZSAqY3VyX3Bvb2wsIHZvaWQgKnAsIGNoYXIgKmZuLCBpbnQgbG4pCit7CisJaWYgKHAgPT0gTlVMTCkgeworCQlMT0dFUlIoInVpc2xpYl9mcmVlIE5VTEwgcG9pbnRlciBAJXM6JWQiLCBmbiwgbG4pOworCQlyZXR1cm47CisJfQorCWttZW1fY2FjaGVfZnJlZShjdXJfcG9vbCwgcCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2FjaGVfZnJlZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHByb2MgZmlsZXN5c3RlbSBjYWxsYmFjayBmdW5jdGlvbnMgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHNzaXplX3QKK3ZuaWNfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGFjdGlvbiA9IDB4ZmZmZiwgYnVzTm8gPSAwLCBpLCByZXN1bHQgPSAwOworCWNoYXIgYnVmWzRdOworCWNoYXIgZGlyZWN0aW9uOworLyogR1VJRCBndWlkOyAqLworCWlmIChjb3VudCA+PSBBUlJBWV9TSVpFKGJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCkpIHsKKwkJTE9HRVJSKCJlY2hvID4gL3Byb2MvdWlzbGliL3ZuaWMgY29weV9mcm9tX3VzZXIgKioqKkZBSUxFRC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpID0gc3NjYW5mKGJ1ZiwgIiVkJWMiLCAmYWN0aW9uLCAmZGlyZWN0aW9uKTsKKwlpZiAoaSAhPSAyKSB7CisJCUxPR0VSUigidW5hYmxlIHRvIHBhcnNlIHZuaWMgcHJvYyBwYXJhbWV0ZXJzLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmICgoZGlyZWN0aW9uICE9ICctJykgJiYgKGRpcmVjdGlvbiAhPSAnKycpKSB7CisJCUxPR0VSUigidW5hYmxlIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGFkZCBvciBkZWxldGUgdm5pY1xuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIGlmIChpIDwgMSksIGkuZS4sIGlmIHdlIGRpZG4ndCBldmVuIHJlYWQgdGhlIGFjdGlvbiBmaWVsZCwKKwkqIHRoZW4gYWN0aW9uIHdpbGwgZGVmYXVsdCB0byAweGZmZmYgYW5kIHRoZSBjb2RlIGJlbG93IHdpbGwKKwkqIGZhbGwgdGhyb3VnaCB0aGUgc3dpdGNoIGFuZCBwcmludCB1c2FnZS4KKwkqLworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSAwOgorCQkvKiBjYWxsIGNsaWVudCBtZXRob2QuLi4gKi8KKwkJYnVzTm8gPSAwOwkvKiBBbGwgY2xpZW50IGRyaXZlcnMgdXNlIGJ1cyB2YWx1ZSBvZiAwLi4uICovCisJCWlmIChkaXJlY3Rpb24gPT0gJysnKQorCQkJcmVzdWx0ID0gdWlzbGliX2NsaWVudF9hZGRfdm5pYyhidXNObyk7CisJCWVsc2UKKwkJCXJlc3VsdCA9IHVpc2xpYl9jbGllbnRfZGVsZXRlX3ZuaWMoYnVzTm8pOworCQlpZiAoIXJlc3VsdCkgeworCQkJTE9HRVJSKCJlY2hvIDAlYyA+IC9wcm9jL3Vpc2xpYi92bmljIGZhaWxlZCAoY2xpZW50IGVuZCkiLAorCQkJICAgICBkaXJlY3Rpb24pOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIGNvdW50OworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJTE9HRVJSKCJVU0FHRTogZWNobyA8YWN0aW9uPjxkaXJlY3Rpb24gKHVwL2Rvd24pPiA+IC9wcm9jL3Vpc2xpYi92bmljIik7CisJTE9HRVJSKCIgIik7CisJTE9HRVJSKCJDbGllbnQgU3ludGF4Iik7CisJTE9HRVJSKCItLS0tLS0tLS0tLS0tIik7CisJTE9HRVJSKCIwKyAgICA9PT4gYWRkIHZuaWMiKTsKKwlMT0dFUlIoIjAtICAgID09PiBkZWxldGUgdm5pYyIpOworCUxPR0VSUigiICIpOworCXJldHVybiBjb3VudDsKK30JCQkJLyogZW5kIHZuaWNfcHJvY193cml0ZSAqLworCitzdGF0aWMgc3NpemVfdAorY2hpcHNldF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgaSwgYWN0aW9uID0gMHhmZmZmOworCWNoYXIgYnVmWzRdOworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKworCWlmIChjb3VudCA+PSBBUlJBWV9TSVpFKGJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KCZtc2csIDAsIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRSkpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCkpIHsKKwkJTE9HRVJSKCJjb3B5X2Zyb21fdXNlciAqKioqRkFJTEVELlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChjaGlwc2V0X2luaXRlZCkgeworCQlMT0dJTkYoIkNoaXBzZXQgYWxyZWFkeSBpbml0aWFsaXplZFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlpID0gc3NjYW5mKGJ1ZiwgIiV4IiwgJmFjdGlvbik7CisKKwkvKiBpZiAoaSA8IDEpLCBpLmUuLCBpZiB3ZSBkaWRuJ3QgZXZlbiByZWFkIHRoZSBhY3Rpb24gZmllbGQsCisJKiB0aGVuIGFjdGlvbiB3aWxsIGRlZmF1bHQgdG8gMHhmZmZmIGFuZCB0aGUgY29kZSBiZWxvdyB3aWxsCisJKiBmYWxsIHRocm91Z2ggdGhlIHN3aXRjaCBhbmQgcHJpbnQgdXNhZ2UuCisJKi8KKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgMToKKwkJLyogR1VFU1QgKi8KKwkJLyogc3RlcDogaW5pdGlhbGl6ZSB0aGUgY2hpcHNldCAqLworCQlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0NISVBTRVRfSU5JVCwgMCwgMCk7CisJCW1zZy5oZHIuRmxhZ3MudGVzdE1lc3NhZ2UgPSAwOworCQltc2cuY21kLmluaXRDaGlwc2V0LmJ1c0NvdW50ID0gMjM7CisJCW1zZy5jbWQuaW5pdENoaXBzZXQuc3dpdGNoQ291bnQgPSAyMzsKKworCQlpZiAoaW5pdF9jaGlwc2V0KCZtc2csIE5VTEwpICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKKwkJCUxPR0VSUigiaW5pdF9jaGlwc2V0IGZhaWxlZC5cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIDE7CisJY2FzZSAyOgorCQkvKiBCT1RIICovCisJCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fQ0hJUFNFVF9JTklULCAwLCAwKTsKKwkJbXNnLmhkci5GbGFncy50ZXN0TWVzc2FnZSA9IDE7CisJCW1zZy5jbWQuaW5pdENoaXBzZXQuYnVzQ291bnQgPSAyMzsKKwkJbXNnLmNtZC5pbml0Q2hpcHNldC5zd2l0Y2hDb3VudCA9IDIzOworCisJCWlmIChpbml0X2NoaXBzZXQoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQkJTE9HRVJSKCJpbml0X2NoaXBzZXQgZmFpbGVkLlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMTsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCUxPR0VSUigidXNhZ2U6IDEgPT0+IGluaXRfY2hpcHNldCBjbGllbnRcbiIpOworCUxPR0VSUigidXNhZ2U6IDIgPT0+IGluaXRfY2hpcHNldCB0ZXN0XG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworI2RlZmluZSBQTElORSguLi4pIHVpc3V0aWxfYWRkX3Byb2NfbGluZV9leCgmdG90LCBidWZmLCBcCisJCQkJCSAgICAgICBidWZmX2xlbiwgX19WQV9BUkdTX18pCisKK3N0YXRpYyBpbnQKK2luZm9fcHJvY19yZWFkX2hlbHBlcihjaGFyICoqYnVmZiwgaW50ICpidWZmX2xlbikKK3sKKwlpbnQgaSwgdG90ID0gMDsKKwlzdHJ1Y3QgYnVzX2luZm8gKmJ1czsKKworCWlmIChQTElORSgiXG5CdXNlczpcbiIpIDwgMCkKKwkJZ290byBlcnJfZG9uZTsKKworCXJlYWRfbG9jaygmQnVzTGlzdExvY2spOworCWZvciAoYnVzID0gQnVzTGlzdEhlYWQ7IGJ1czsgYnVzID0gYnVzLT5uZXh0KSB7CisKKwkJaWYgKFBMSU5FKCIgICAgYnVzPTB4JXAsIGJ1c05vPSVkLCBkZXZpY2VDb3VudD0lZFxuIiwKKwkJCSAgYnVzLCBidXMtPmJ1c05vLCBidXMtPmRldmljZUNvdW50KSA8IDApCisJCQlnb3RvIGVycl9kb25lX3VubG9jazsKKworCisJCWlmIChQTElORSgiICAgICAgICBEZXZpY2VzOlxuIikgPCAwKQorCQkJZ290byBlcnJfZG9uZV91bmxvY2s7CisKKwkJZm9yIChpID0gMDsgaSA8IGJ1cy0+ZGV2aWNlQ291bnQ7IGkrKykgeworCQkJaWYgKGJ1cy0+ZGV2aWNlW2ldKSB7CisJCQkJaWYgKFBMSU5FKCIgICAgICAgICAgICBidXNObyAlZCwgZGV2aWNlWyVpXTogMHglcCwgY2hhbnB0cj0weCVwLCBzd3RjaD0weCVwXG4iLAorCQkJCQkgIGJ1cy0+YnVzTm8sIGksIGJ1cy0+ZGV2aWNlW2ldLAorCQkJCQkgIGJ1cy0+ZGV2aWNlW2ldLT5jaGFucHRyLAorCQkJCQkgIGJ1cy0+ZGV2aWNlW2ldLT5zd3RjaCkgPCAwKQorCQkJCQlnb3RvIGVycl9kb25lX3VubG9jazsKKworCQkJCWlmIChQTElORSgiICAgICAgICAgICAgZmlyc3RfYnVzeV9jbnQ9JWxsdSwgbW92ZWRfdG9fdGFpbF9jbnQ9JWxsdSwgbGFzdF9vbl9saXN0X2NudD0lbGx1XG4iLAorCQkJCQkgIGJ1cy0+ZGV2aWNlW2ldLT5maXJzdF9idXN5X2NudCwKKwkJCQkJICBidXMtPmRldmljZVtpXS0+bW92ZWRfdG9fdGFpbF9jbnQsCisJCQkJCSAgYnVzLT5kZXZpY2VbaV0tPmxhc3Rfb25fbGlzdF9jbnQpIDwgMCkKKwkJCQkJZ290byBlcnJfZG9uZV91bmxvY2s7CisJCQl9CisJCX0KKwl9CisJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKworCWlmIChQTElORSgiVWlzVXRpbHNfUmVnaXN0ZXJlZF9TZXJ2aWNlczogJWRcbiIsCisJCSAgYXRvbWljX3JlYWQoJlVpc1V0aWxzX1JlZ2lzdGVyZWRfU2VydmljZXMpKSA8IDApCisJCWdvdG8gZXJyX2RvbmU7CisJaWYgKFBMSU5FKCJjeWNsZXNfYmVmb3JlX3dhaXQgJWxsdSB3YWl0X2N5Y2xlczolbGx1XG4iLAorCQkgIGN5Y2xlc19iZWZvcmVfd2FpdCwgd2FpdF9jeWNsZXMpIDwgMCkKKwkJCWdvdG8gZXJyX2RvbmU7CisJaWYgKFBMSU5FKCJ0b3Rfd2FrZXVwX2NudCAlbGx1OnRvdF93YWl0X2NudCAlbGx1OnRvdF9zY2hlZHVsZV9jbnQgJWxsdVxuIiwKKwkJICB0b3Rfd2FrZXVwX2NudCwgdG90X3dhaXRfY250LCB0b3Rfc2NoZWR1bGVfY250KSA8IDApCisJCQlnb3RvIGVycl9kb25lOworCWlmIChQTElORSgiZW5fc21hcnRfd2FrZXVwICVkXG4iLCBlbl9zbWFydF93YWtldXApIDwgMCkKKwkJCWdvdG8gZXJyX2RvbmU7CisJaWYgKFBMSU5FKCJ0b3RfbW92ZWRfdG9fdGFpbF9jbnQgJWxsdVxuIiwgdG90X21vdmVkX3RvX3RhaWxfY250KSA8IDApCisJCQlnb3RvIGVycl9kb25lOworCisJcmV0dXJuIHRvdDsKKworZXJyX2RvbmVfdW5sb2NrOgorCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CitlcnJfZG9uZToKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbmZvX3Byb2NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCit7CisJY2hhciAqdGVtcDsKKwlpbnQgdG90YWxCeXRlcyA9IDA7CisJaW50IHJlbWFpbmluZ19ieXRlcyA9IFBST0NfUkVBRF9CVUZGRVJfU0laRTsKKworLyogKnN0YXJ0ID0gYnVmOyAqLworCWlmIChQcm9jUmVhZEJ1ZmZlciA9PSBOVUxMKSB7CisJCURCR0lORigiUHJvY1JlYWRCdWZmZXIgPT0gTlVMTDsgYWxsb2NhdGluZyBidWZmZXIuXG4uIik7CisJCVByb2NSZWFkQnVmZmVyID0gdm1hbGxvYyhQUk9DX1JFQURfQlVGRkVSX1NJWkUpOworCisJCWlmIChQcm9jUmVhZEJ1ZmZlciA9PSBOVUxMKSB7CisJCQlMT0dFUlIoImZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgdG8gcHJvdmlkZSBwcm9jIGRhdGEuXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJdGVtcCA9IFByb2NSZWFkQnVmZmVyOworCisJaWYgKCgqb2Zmc2V0ID09IDApIHx8ICghUHJvY1JlYWRCdWZmZXJWYWxpZCkpIHsKKwkJREJHSU5GKCJjYWxsaW5nIGluZm9fcHJvY19yZWFkX2hlbHBlci5cbiIpOworCQkvKiBpZiB0aGUgcmVhZCBmYWlscywgdGhlbiAtMSB3aWxsIGJlIHJldHVybmVkICovCisJCXRvdGFsQnl0ZXMgPSBpbmZvX3Byb2NfcmVhZF9oZWxwZXIoJnRlbXAsICZyZW1haW5pbmdfYnl0ZXMpOworCQlQcm9jUmVhZEJ1ZmZlclZhbGlkID0gMTsKKwl9IGVsc2UKKwkJdG90YWxCeXRlcyA9IHN0cmxlbihQcm9jUmVhZEJ1ZmZlcik7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBsZW4sIG9mZnNldCwKKwkJCQkgICAgICAgUHJvY1JlYWRCdWZmZXIsIHRvdGFsQnl0ZXMpOworfQorCitzdGF0aWMgc3NpemVfdAorcGxhdGZvcm1udW1iZXJfcHJvY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KQoreworCWludCBsZW5ndGggPSAwOworCWNoYXIgKnZidWY7CisJbG9mZl90IHBvcyA9ICpvZmZzZXQ7CisKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocG9zID4gMCB8fCAhbGVuKQorCQlyZXR1cm4gMDsKKworCXZidWYgPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2YnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlbmd0aCA9IHNwcmludGYodmJ1ZiwgIiVkXG4iLCBQbGF0Zm9ybU51bWJlcik7CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgdmJ1ZiwgbGVuZ3RoKSkgeworCQlrZnJlZSh2YnVmKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2ZyZWUodmJ1Zik7CisJKm9mZnNldCArPSBsZW5ndGg7CisJcmV0dXJuIGxlbmd0aDsKK30KKworI2lmZGVmIFVJU0xJQl9URVNUX1BST0MKKworLyogcHJvYy91aXNsaWIvdmJ1cy88eD4vaW5mbyAqLworc3RhdGljIGludAorcHJvY19pbmZvX3ZidXNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IGJ1c19pbmZvICpidXMgPSBtLT5wcml2YXRlOworCWludCBpLCBkZXZJbmZvQ291bnQsIHg7CisJY2hhciBidWZbOTk5XTsKKworCWlmIChidXMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJc2VxX3ByaW50ZihtLCAiQ2xpZW50IGRldmljZSAvIGNsaWVudCBkcml2ZXIgaW5mbyBmb3IgJXMgcGFydGl0aW9uICh2YnVzICMlZCk6XG4iLAorCQkgICBidXMtPnBhcnRpdGlvbk5hbWUsIGJ1cy0+YnVzTm8pOworCWlmICgoYnVzLT5idXNDaGFubmVsQnl0ZXMgPT0gMCkgfHwgKGJ1cy0+cEJ1c0NoYW5uZWwgPT0gTlVMTCkpCisJCXJldHVybiAwOworCWRldkluZm9Db3VudCA9CisJICAgIChidXMtPmJ1c0NoYW5uZWxCeXRlcyAtCisJICAgICBzaXplb2YoVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MKSkgLworCSAgICBzaXplb2YoVUxUUkFfVkJVU19ERVZJQ0VJTkZPKTsKKwl4ID0gVkJVU0NIQU5ORUxfZGV2SW5mb1RvU3RyaW5nQnVmZmVyKCZidXMtPnBCdXNDaGFubmVsLT5DaHBJbmZvLCBidWYsCisJCQkJCSAgICAgIHNpemVvZihidWYpIC0gMSwgLTEpOworCWJ1Zlt4XSA9ICdcMCc7CisJc2VxX3ByaW50ZihtLCAiJXMiLCBidWYpOworCXggPSBWQlVTQ0hBTk5FTF9kZXZJbmZvVG9TdHJpbmdCdWZmZXIoJmJ1cy0+cEJ1c0NoYW5uZWwtPkJ1c0luZm8sCisJCQkJCSAgICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxLCAtMSk7CisJYnVmW3hdID0gJ1wwJzsKKwlzZXFfcHJpbnRmKG0sICIlcyIsIGJ1Zik7CisJZm9yIChpID0gMDsgaSA8IGRldkluZm9Db3VudDsgaSsrKSB7CisJCXggPSBWQlVTQ0hBTk5FTF9kZXZJbmZvVG9TdHJpbmdCdWZmZXIoJmJ1cy0+cEJ1c0NoYW5uZWwtPgorCQkJCQkJICAgICAgRGV2SW5mb1tpXSwgYnVmLAorCQkJCQkJICAgICAgc2l6ZW9mKGJ1ZikgLSAxLCBpKTsKKwkJaWYgKHggPiAwKSB7CisJCQlidWZbeF0gPSAnXDAnOworCQkJc2VxX3ByaW50ZihtLCAiJXMiLCBidWYpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAorYnVzX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCBzZXJ2ZXJfZmxhZyA9IDA7CisJaW50IGksIGFjdGlvbiA9IDB4ZmZmZiwgcmVzdWx0OworCWNoYXIgYnVmWzE2XTsKKwlDT05UUk9MVk1fTUVTU0FHRSBtc2c7CisJVTMyIGJ1c05vLCBkZXZpY2VDb3VudDsKKworCWlmIChjb3VudCA+PSBBUlJBWV9TSVpFKGJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KCZtc2csIDAsIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRSkpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCkpIHsKKwkJTE9HRVJSKCJlY2hvID4gL3Byb2MvdWlzbGliL2J1czogY29weV9mcm9tX3VzZXIgKioqKkZBSUxFRC4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaSA9IHNzY2FuZihidWYsICIleC0lZC0lZCIsICZhY3Rpb24sICZidXNObywgJmRldmljZUNvdW50KTsKKworCS8qIGlmIChpIDwgMSksIGkuZS4sIGlmIHdlIGRpZG4ndCBldmVuIHJlYWQgdGhlIGFjdGlvbiBmaWVsZCwKKwkqIHRoZW4gYWN0aW9uIHdpbGwgZGVmYXVsdCB0byAweGZmZmYgYW5kIHRoZSBjb2RlIGJlbG93IHdpbGwKKwkqIGZhbGwgdGhyb3VnaCB0aGUgc3dpdGNoIGFuZCBwcmludCB1c2FnZS4KKwkqLworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSAwOgorCQkvKiBkZXN0cm95IGEgYnVzICovCisJCWlmIChpICE9IDIpCisJCQlicmVhazsKKwkJaW5pdF9tc2dfaGVhZGVyKCZtc2csIENPTlRST0xWTV9CVVNfREVTVFJPWSwgMCwgc2VydmVyX2ZsYWcpOworCQltc2cuY21kLmRlc3Ryb3lCdXMuYnVzTm8gPSBidXNObzsKKworCQlyZXN1bHQgPSBkZXN0cm95X2J1cygmbXNnLCBOVUxMKTsKKworCQlpZiAocmVzdWx0ICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKKwkJCUxPR0VSUigiZWNobyAwLSVkID4gL3Byb2MvdWlzbGliL2J1cyB7Q09OVFJPTFZNX0JVU19ERVNUUk9ZIEZhaWxlZH0gUmVzdWx0KCVkKSIsCisJCQkgICAgIGJ1c05vLCByZXN1bHQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIGNvdW50OworCWNhc2UgMToKKwkJLyogY3JlYXRlIGEgYnVzICovCisJCWlmIChpICE9IDMpCisJCQlicmVhazsKKwkJaW5pdF9tc2dfaGVhZGVyKCZtc2csIENPTlRST0xWTV9CVVNfQ1JFQVRFLCAwLCBzZXJ2ZXJfZmxhZyk7CisJCW1zZy5jbWQuY3JlYXRlQnVzLmJ1c05vID0gYnVzTm87CisJCW1zZy5jbWQuY3JlYXRlQnVzLmRldmljZUNvdW50ID0gZGV2aWNlQ291bnQ7CisKKwkJcmVzdWx0ID0gY3JlYXRlX2J1cygmbXNnLCBOVUxMKTsKKworCQlpZiAocmVzdWx0ICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKKwkJCUxPR0VSUigiZWNobyAxLSVkLSVkID4gL3Byb2MvdWlzbGliL2J1cyB7Q09OVFJPTFZNX0JVU19DUkVBVEUgRmFpbGVkfSBSZXN1bHQoJWQpIiwKKwkJCSAgICAgYnVzTm8sIGRldmljZUNvdW50LCByZXN1bHQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlyZXR1cm4gY291bnQ7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJTE9HRVJSKCJVU0FHRTogZWNobyA8YWN0aW9uPi08YnVzTm8+Li4uID4gL3Byb2MvdWlzbGliL2J1cyIpOworCUxPR0VSUigiICIpOworCUxPR0VSUigiRGVzdHJ1Y3QgU3ludGF4ICAgICBDb250cm9sVk0gTWVzc2FnZSBJZCIpOworCUxPR0VSUigiLS0tLS0tLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwlMT0dFUlIoIjAtPGJ1c05vPiAgICAgICA9PT4gQ09OVFJPTFZNX0JVU19ERVNUUk9ZIik7CisJTE9HRVJSKCIgIik7CisJTE9HRVJSKCJDb25zdHJ1Y3QgU3ludGF4ICAgICAgICAgICAgQ29udHJvbFZNIE1lc3NhZ2UgSWQiKTsKKwlMT0dFUlIoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLSAiKTsKKwlMT0dFUlIoIjEtPGJ1c05vPi08ZGV2aWNlQ291bnQ+ID09PiBDT05UUk9MVk1fQlVTX0NSRUFURSIpOworCisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit1aXNsaWJfcHJvY19yZWFkX3dyaXRlb25seShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitkZXZfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHNlcnZlcl9mbGFnID0gMDsKKwlDT05UUk9MVk1fTUVTU0FHRSBtc2c7CisJVTMyIGJ1c05vLCBkZXZObzsKKwljaGFyIGJ1ZlszMl07CisJdW5zaWduZWQgaW50IGNoYW5wdHI7CisJaW50IHR5cGUsIGksIGFjdGlvbiA9IDB4ZmZmZiwgcmVzdWx0OworCisJaWYgKGNvdW50ID49IEFSUkFZX1NJWkUoYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlMT0dFUlIoImVjaG8gPiAvcHJvYy91aXNsaWIvZGV2aWNlOiBjb3B5X2Zyb21fdXNlciAqKioqRkFJTEVELiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpID0gc3NjYW5mKGJ1ZiwgIiV4LSVkLSVkLSV4LSVkIiwKKwkJICAgJmFjdGlvbiwgJmJ1c05vLCAmZGV2Tm8sICZjaGFucHRyLCAmdHlwZSk7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgMDoKKwkJaWYgKGkgIT0gMykKKwkJCWJyZWFrOworCisJCS8qIGRlc3Ryb3kgYSBkZXZpY2UgKi8KKwkJaW5pdF9tc2dfaGVhZGVyKCZtc2csIENPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSwgMCwgc2VydmVyX2ZsYWcpOworCQltc2cuY21kLmRlc3Ryb3lEZXZpY2UuYnVzTm8gPSBidXNObzsKKwkJbXNnLmNtZC5kZXN0cm95RGV2aWNlLmRldk5vID0gZGV2Tm87CisKKwkJcmVzdWx0ID0gZGVzdHJveV9kZXZpY2UoJm1zZywgTlVMTCk7CisKKwkJaWYgKHJlc3VsdCAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CisJCQlMT0dFUlIoImVjaG8gMC0lZC0lZCA+IC9wcm9jL3Vpc2xpYi9kZXZpY2Uge0NPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSBGYWlsZWR9IFJlc3VsdCglZCkiLAorCQkJICAgICBidXNObywgZGV2Tm8sIHJlc3VsdCk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXJldHVybiBjb3VudDsKKworCWNhc2UgMToKKwkJaWYgKGkgIT0gNSkKKwkJCWJyZWFrOworCisJCS8qIGNyZWF0ZSBhIGRldmljZSAqLworCQlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUsIDAsIHNlcnZlcl9mbGFnKTsKKwkJbXNnLmNtZC5jcmVhdGVEZXZpY2UuYnVzTm8gPSBidXNObzsKKwkJbXNnLmNtZC5jcmVhdGVEZXZpY2UuZGV2Tm8gPSBkZXZObzsKKwkJbXNnLmNtZC5jcmVhdGVEZXZpY2UuY2hhbm5lbEFkZHIgPSBfX3BhKGNoYW5wdHIpOworCQltc2cuY21kLmNyZWF0ZURldmljZS5jaGFubmVsQnl0ZXMgPSBNSU5fSU9fQ0hBTk5FTF9TSVpFOworCisJCWlmICh0eXBlID09IDApCisJCQltc2cuY21kLmNyZWF0ZURldmljZS5kYXRhVHlwZUd1aWQgPQorCQkJICAgIFVsdHJhVmhiYUNoYW5uZWxQcm90b2NvbEd1aWQ7CisJCWVsc2UgaWYgKHR5cGUgPT0gMSkKKwkJCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmRhdGFUeXBlR3VpZCA9CisJCQkgICAgVWx0cmFWbmljQ2hhbm5lbFByb3RvY29sR3VpZDsKKwkJZWxzZSB7CisJCQlMT0dFUlIoImVjaG8gMS0lZC0lZC0leC08dHlwZT4gPiAvcHJvYy91aXNsaWIvZGV2Y2UgZmFpbGVkOiBpbnZhbGlkIGRldmljZSB0eXBlICVkLiIsCisJCQkgICAgIGJ1c05vLCBkZXZObywgY2hhbnB0ciwgdHlwZSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXJlc3VsdCA9IGNyZWF0ZV9kZXZpY2UoJm1zZywgTlVMTCk7CisKKwkJaWYgKHJlc3VsdCAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CisJCQlpZiAodHlwZSA9PSAwKQorCQkJCUxPR0VSUigiZWNobyAxLSVkLSVkLSV4LTAgPiAvcHJvYy91aXNsaWIvZGV2aWNlIHtDT05UUk9MVk1fREVWSUNFX0NSRUFURVt2SEJBXSBGYWlsZWR9IFJlc3VsdCglZCkiLAorCQkJCSAgICAgYnVzTm8sIGRldk5vLCBjaGFucHRyLCByZXN1bHQpOworCQkJZWxzZQorCQkJCUxPR0VSUigiZWNobyAxLSVkLSVkLSV4LTEgPiAvcHJvYy91aXNsaWIvZGV2aWNlIHtDT05UUk9MVk1fREVWSUNFX0NSRUFURVt2TklDXSBGYWlsZWR9IFJlc3VsdCglZCkiLAorCQkJCSAgICAgYnVzTm8sIGRldk5vLCBjaGFucHRyLCByZXN1bHQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCUxPR0VSUigiVVNBR0U6IGVjaG8gPGFjdGlvbj4tPGJ1c05vPi08ZGV2Tm8+Li4uID4gL3Byb2MvdWlzbGliL2RldmljZSIpOworCUxPR0VSUigiICIpOworCUxPR0VSUigiRGVzdHJ1Y3QgU3ludGF4ICAgICAgIENvbnRyb2xWTSBNZXNzYWdlIElkIik7CisJTE9HRVJSKCItLS0tLS0tLS0tLS0tLS0tLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJTE9HRVJSKCIwLTxidXNObz4tPGRldk5vPiA9PT4gQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZIik7CisJTE9HRVJSKCIgIik7CisJTE9HRVJSKCJDb25zdHJ1Y3QgU3ludGF4ICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sVk0gTWVzc2FnZSBJZCIpOworCUxPR0VSUgorCSAgICAoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICIpOworCUxPR0VSUgorCSAgICAoIjEtPGJ1c05vPi08ZGV2Tm8+LTxjaGFucHRyPi08dHlwZT4gPT0+IENPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIik7CisJTE9HRVJSKCIgICAgICA8dHlwZSA9IDA+OiB2SEJBIik7CisJTE9HRVJSKCIgICAgICA8dHlwZSA9IDE+OiB2TklDIik7CisJTE9HRVJSKCIgIik7CisKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworc3RhdGljIHNzaXplX3QKK2N5Y2xlc19iZWZvcmVfd2FpdF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZbMTZdOworCisjZGVmaW5lIENZQ0xFU19CRUZPUkVfV0FJVF9VU0VfRVJST1IgIHsgXAorCUxPR0VSUigiSW5jb3JyZWN0IENhbGwgSG9tZSBJbnB1dC5cbiIpOyBcCisJcHJfaW5mbygiUGxlYXNlIHBhc3MgQ2FsbCBIb21lIEV2ZW50IFBhcmFtZXRlcnMgaW4gdGhlIGZvcm06XG4iKTsgXAorCXByX2luZm8oIkV2ZW50SUQgQ2F0ZWdvcnkgVHlwZVtwYXJhbWV0ZXIxXVtwYXJhbWV0ZXIyXVtwYXJhbWV0ZXIzXVtwYXJhbWV0ZXI0XVtwYXJhbWV0ZXI1XVtwYXJhbWV0ZXI2XVxuIik7IFwKKwlyZXR1cm4gLUVGQVVMVDsgXAorfQorCWlmIChjb3VudCA+PSBBUlJBWV9TSVpFKGJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvdW50ID09IDApCisJCUNZQ0xFU19CRUZPUkVfV0FJVF9VU0VfRVJST1I7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlMT0dFUlIoImNvcHlfZnJvbV91c2VyIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJYnVmW2NvdW50IC0gMV0gPSAnXDAnOwkvKiBSZXBsYWNlIHRoZSBMRiBhdCB0aGUgZW5kIG9mIHRoZQorCQkJCSAqIGlucHV0IHdpdGggYSBOVUxMICovCisJLyogUHVsbCBvdXQgdGhlIGN5Y2xlc19iZWZvcmVfd2FpdCBtdXN0IGJlIGRlY2ltYWwgaW50ZWdlciAqLworCWlmIChzc2NhbmYoYnVmLCAiJWxsZCIsICZjeWNsZXNfYmVmb3JlX3dhaXQpICE9IDEpCisJCUNZQ0xFU19CRUZPUkVfV0FJVF9VU0VfRVJST1I7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CityZXNldF9jb3VudHNfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgYnVmWzE2XTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbmV3X3ZhbHVlOworCXN0cnVjdCBidXNfaW5mbyAqYnVzOworCWludCBpOworCisjZGVmaW5lIFJFU0VUX0NPVU5UU19VU0VfRVJST1IgIHsgXAorCUxPR0VSUigiSW5jb3JyZWN0IHJlc2V0X2NvdW50cyBJbnB1dC5cbiIpOyBcCisJcHJfaW5mbygiUGxlYXNlIHBhc3MgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGNvdW50ZXJzOlxuIik7IFwKKwlwcl9pbmZvKCJlLmcuIGVjaG8gMCA+IHJlc2V0X2NvdW50c1xuIik7IFwKKwlyZXR1cm4gLUVGQVVMVDsgXAorCX0KKworCWlmIChjb3VudCA+PSBBUlJBWV9TSVpFKGJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvdW50ID09IDApCisJCVJFU0VUX0NPVU5UU19VU0VfRVJST1I7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlMT0dFUlIoImNvcHlfZnJvbV91c2VyIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJYnVmW2NvdW50IC0gMV0gPSAnXDAnOwkvKiBSZXBsYWNlIHRoZSBMRiBhdCB0aGUgZW5kIG9mIHRoZQorCQkJCSAqIGlucHV0IHdpdGggYSBOVUxMICovCisJLyogUHVsbCBvdXQgdGhlIHJlc2V0X2NvdW50cyBtdXN0IGJlIGRlY2ltYWwgaW50ZWdlciAqLworCWlmIChzc2NhbmYoYnVmLCAiJWxsdSIsICZuZXdfdmFsdWUpICE9IDEpCisJCVJFU0VUX0NPVU5UU19VU0VfRVJST1I7CisJcmVhZF9sb2NrKCZCdXNMaXN0TG9jayk7CisJZm9yIChidXMgPSBCdXNMaXN0SGVhZDsgYnVzOyBidXMgPSBidXMtPm5leHQpIHsKKworCQlmb3IgKGkgPSAwOyBpIDwgYnVzLT5kZXZpY2VDb3VudDsgaSsrKSB7CisJCQlpZiAoYnVzLT5kZXZpY2VbaV0pIHsKKwkJCQlidXMtPmRldmljZVtpXS0+Zmlyc3RfYnVzeV9jbnQgPSBuZXdfdmFsdWU7CisJCQkJYnVzLT5kZXZpY2VbaV0tPm1vdmVkX3RvX3RhaWxfY250ID0gbmV3X3ZhbHVlOworCQkJCWJ1cy0+ZGV2aWNlW2ldLT5sYXN0X29uX2xpc3RfY250ID0gbmV3X3ZhbHVlOworCQkJfQorCQl9CisJfQorCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJdG90X21vdmVkX3RvX3RhaWxfY250ID0gbmV3X3ZhbHVlOworCXRvdF93YWl0X2NudCA9IG5ld192YWx1ZTsKKwl0b3Rfd2FrZXVwX2NudCA9IG5ld192YWx1ZTsKKwl0b3Rfc2NoZWR1bGVfY250ID0gbmV3X3ZhbHVlOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK3NtYXJ0X3dha2V1cF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZbMTZdOworCWludCBuZXdfdmFsdWU7CisKKyNkZWZpbmUgU01BUlRfV0FLRVVQX1VTRV9FUlJPUiAgeyBcCisJTE9HRVJSKCJJbmNvcnJlY3Qgc21hcnRfd2FrZXVwIElucHV0IDAgZGlzYWJsZXMgc21hcnRfd2FrZXVwLCBhbmQgMSBlbmFibGVzIHNtYXJ0X3dha2V1cC5cbiIpOyBcCisJcHJfaW5mbygiZWNobyAwID4gc21hcnRfd2FrZXVwXG4iKTsgXAorCXByX2luZm8oImVjaG8gMSA+IHNtYXJ0X3dha2V1cFxuIik7IFwKKwlyZXR1cm4gLUVGQVVMVDsgXAorCX0KKworCWlmIChjb3VudCA+PSBBUlJBWV9TSVpFKGJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvdW50ID09IDApCisJCVNNQVJUX1dBS0VVUF9VU0VfRVJST1I7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlMT0dFUlIoImNvcHlfZnJvbV91c2VyIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJYnVmW2NvdW50IC0gMV0gPSAnXDAnOwkvKiBSZXBsYWNlIHRoZSBMRiBhdCB0aGUgZW5kIG9mIHRoZQorCQkJCSAqIGlucHV0IHdpdGggYSBOVUxMICovCisJLyogUHVsbCBvdXQgdGhlIHNtYXJ0X3dha2V1cCBtdXN0IGJlIGRlY2ltYWwgaW50ZWdlciAqLworCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmbmV3X3ZhbHVlKSAhPSAxKQorCQlTTUFSVF9XQUtFVVBfVVNFX0VSUk9SOworCWVuX3NtYXJ0X3dha2V1cCA9IG5ld192YWx1ZTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit0ZXN0X3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCBpLCBhY3Rpb24gPSAweGZmZmY7CisJY2hhciBidWZbMTZdOworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKwlTNjQgdnJ0Y19vZmZzZXQ7CisKKwlpZiAoY291bnQgPj0gQVJSQVlfU0laRShidWYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YoQ09OVFJPTFZNX01FU1NBR0UpKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCUxPR0VSUigiY29weV9mcm9tX3VzZXIgKioqKkZBSUxFRC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpID0gc3NjYW5mKGJ1ZiwgIiV4IiwgJmFjdGlvbik7CisKKwkvKiBpZiAoaSA8IDEpLCBpLmUuLCBpZiB3ZSBkaWRuJ3QgZXZlbiByZWFkIHRoZSBhY3Rpb24gZmllbGQsCisJKiB0aGVuIGFjdGlvbiB3aWxsIGRlZmF1bHQgdG8gMHhmZmZmIGFuZCB0aGUgY29kZSBiZWxvdyB3aWxsCisJKiBmYWxsIHRocm91Z2ggdGhlIHN3aXRjaCBhbmQgcHJpbnQgdXNhZ2UuICovCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIDY6CisJCW1zZy5oZHIuSWQgPSBDT05UUk9MVk1fQ0hJUFNFVF9TVE9QOworCQltc2cuaGRyLkZsYWdzLnJlc3BvbnNlRXhwZWN0ZWQgPSAxOworCQlzdG9wX2NoaXBzZXQoJm1zZywgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJdnJ0Y19vZmZzZXQgPSAwOworCQlMT0dFUlIoImFib3V0IHRvIGlzc3VlIFFVRVJZIHZydGNfb2Zmc2V0PSVMWCIsIHZydGNfb2Zmc2V0KTsKKwkJdnJ0Y19vZmZzZXQgPSBJc3N1ZV9WTUNBTExfUVVFUllfR1VFU1RfVklSVFVBTF9USU1FX09GRlNFVCgpOworCQlMT0dFUlIoInJlc3VsdCBpcyB2cnRjX29mZnNldD0lTFgiLCB2cnRjX29mZnNldCk7CisJCWJyZWFrOworCWNhc2UgODoKKwkJdnJ0Y19vZmZzZXQgPSA2MDsKKwkJTE9HRVJSKCJhYm91dCB0byBpbmNyZWFzZSBwaHlzaWNhbCB0aW1lIGJ5IDB4JUxYIHNlY29uZHMiLAorCQkgICAgICAgdnJ0Y19vZmZzZXQpOworCQl2cnRjX29mZnNldCA9IElzc3VlX1ZNQ0FMTF9VUERBVEVfUEhZU0lDQUxfVElNRSh2cnRjX29mZnNldCk7CisJCWJyZWFrOworCWNhc2UgOToKKwkJdnJ0Y19vZmZzZXQgPSAtNjA7CisJCUxPR0VSUigiYWJvdXQgdG8gZGVjcmVhc2UgcGh5c2ljYWwgdGltZSBieSAweCVMWCBzZWNvbmRzIiwKKwkJICAgICAgIHZydGNfb2Zmc2V0KTsKKwkJdnJ0Y19vZmZzZXQgPSBJc3N1ZV9WTUNBTExfVVBEQVRFX1BIWVNJQ0FMX1RJTUUodnJ0Y19vZmZzZXQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dFUlIoInVzYWdlOiA2IGZvciBDSElQU0VUX1NUT1BcbiIpOworCQlMT0dFUlIoIiAgICAgICA3IGZvciBWTUNBTExfUVVFUllfR1VFU1RfVklSVFVBTF9USU1FX09GRlNFVCgpXG4iKTsKKwkJTE9HRVJSKCIgICAgICAgOCBmb3IgVk1DQUxMX1VQREFURV9QSFlTSUNBTF9USU1FKDYwKVxuIik7CisJCUxPR0VSUigiICAgICAgIDkgZm9yIFZNQ0FMTF9VUERBVEVfUEhZU0lDQUxfVElNRSgtNjApXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKKyNlbmRpZgkJCQkvKiBVSVNMSUJfVEVTVF9QUk9DICovCitzdGF0aWMgc3RydWN0IGRldmljZV9pbmZvICoKK2ZpbmRfZGV2KFUzMiBidXNObywgVTMyIGRldk5vKQoreworCXN0cnVjdCBidXNfaW5mbyAqYnVzOworCXN0cnVjdCBkZXZpY2VfaW5mbyAqZGV2ID0gTlVMTDsKKworCXJlYWRfbG9jaygmQnVzTGlzdExvY2spOworCWZvciAoYnVzID0gQnVzTGlzdEhlYWQ7IGJ1czsgYnVzID0gYnVzLT5uZXh0KSB7CisJCWlmIChidXMtPmJ1c05vID09IGJ1c05vKSB7CisJCQkvKiBtYWtlIHN1cmUgdGhlIGRldmljZSBudW1iZXIgaXMgdmFsaWQgKi8KKwkJCWlmIChkZXZObyA+PSBidXMtPmRldmljZUNvdW50KSB7CisJCQkJTE9HRVJSKCIlcyBiYWQgYnVzTm8sIGRldk5vPSVkLCVkIiwKKwkJCQkgICAgICAgX19mdW5jX18sCisJCQkJICAgICAgIChpbnQpIChidXNObyksIChpbnQpIChkZXZObykpOworCQkJCWdvdG8gQXdheTsKKwkJCX0KKwkJCWRldiA9IGJ1cy0+ZGV2aWNlW2Rldk5vXTsKKwkJCWlmICghZGV2KQorCQkJCUxPR0VSUigiJXMgYmFkIGJ1c05vLCBkZXZObz0lZCwlZCIsCisJCQkJICAgICAgIF9fZnVuY19fLAorCQkJCSAgICAgICAoaW50KSAoYnVzTm8pLCAoaW50KSAoZGV2Tm8pKTsKKwkJCWdvdG8gQXdheTsKKwkJfQorCX0KK0F3YXk6CisJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwlyZXR1cm4gZGV2OworfQorCisvKiAgVGhpcyB0aHJlYWQgY2FsbHMgdGhlICJpbnRlcnJ1cHQiIGZ1bmN0aW9uIGZvciBlYWNoIGRldmljZSB0aGF0IGhhcworICogIGVuYWJsZWQgc3VjaCB1c2luZyB1aXNsaWJfZW5hYmxlX2NoYW5uZWxfaW50ZXJydXB0cygpLiAgVGhlICJpbnRlcnJ1cHQiCisgKiAgZnVuY3Rpb24gdHlwaWNhbGx5IHJlYWRzIGFuZCBwcm9jZXNzZXMgdGhlIGRldmljZXMncyBjaGFubmVsIGlucHV0CisgKiAgcXVldWUuICBUaGlzIHRocmVhZCByZXBlYXRlZGx5IGRvZXMgdGhpcywgdW50aWwgdGhlIHRocmVhZCBpcyB0b2xkIHRvIHN0b3AKKyAqICAodmlhIHVpc3RocmVhZF9zdG9wKCkpLiAgU2xlZXBpbmcgcnVsZXM6CisgKiAgLSBJZiB3ZSBoYXZlIGNhbGxlZCB0aGUgImludGVycnVwdCIgZnVuY3Rpb24gZm9yIGFsbCBkZXZpY2VzLCBhbmQgYWxsIG9mCisgKiAgICB0aGVtIGhhdmUgcmVwb3J0ZWQgIm5vdGhpbmcgcHJvY2Vzc2VkIiAocmV0dXJuZWQgMCksIHRoZW4gd2Ugd2lsbCBnbyB0bworICogICAgc2xlZXAgZm9yIGEgbWF4aW11bSBvZiBQT0xMSklGRklFU19OT1JNQUwgamlmZmllcy4KKyAqICAtIElmIGFueW9uZSBjYWxscyB1aXNsaWJfZm9yY2VfY2hhbm5lbF9pbnRlcnJ1cHQoKSwgdGhlIGFib3ZlIGppZmZ5CisgKiAgICBzbGVlcCB3aWxsIGJlIGludGVycnVwdGVkLCBhbmQgd2Ugd2lsbCByZXN1bWUgY2FsbGluZyB0aGUgImludGVycnVwdCIKKyAqICAgIGZ1bmN0aW9uIGZvciBhbGwgZGV2aWNlcy4KKyAqICAtIFRoZSBsaXN0IG9mIGRldmljZXMgaXMgZHluYW1pY2FsbHkgcmUtb3JkZXJlZCBpbiBvcmRlciB0bworICogICAgYXR0ZW1wdCB0byBwcmVzZXJ2ZSBmYWlybmVzcy4gIFdoZW5ldmVyIHdlIHNwaW4gdGhydSB0aGUgbGlzdCBvZgorICogICAgZGV2aWNlcyBhbmQgY2FsbCB0aGUgZGV2LT5pbnRlcnJ1cHQoKSBmdW5jdGlvbiwgaWYgd2UgZmluZAorICogICAgZGV2aWNlcyB3aGljaCByZXBvcnQgdGhhdCB0aGVyZSBpcyBzdGlsbCBtb3JlIHdvcmsgdG8gZG8sIHRoZQorICogICAgdGhlIGZpcnN0IHN1Y2ggZGV2aWNlIHdlIGZpbmQgaXMgbW92ZWQgdG8gdGhlIGVuZCBvZiB0aGUgZGV2aWNlCisgKiAgICBsaXN0LiAgVGhpcyBlbnN1cmVzIHRoYXQgZXh0cmVtZWx5IGJ1c3kgZGV2aWNlcyBkb24ndCBzdGFydmUgb3V0CisgKiAgICBsZXNzLWJ1c3kgb25lcy4KKyAqCisgKi8KK3N0YXRpYyBpbnQKK1Byb2Nlc3NfSW5jb21pbmcodm9pZCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgY3VyX2N5Y2xlcywgb2xkX2N5Y2xlcywgaWRsZV9jeWNsZXMsIGRlbHRhX2N5Y2xlczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXdfdGFpbCA9IE5VTEw7CisJaW50IGk7CisJVUlTX0RBRU1PTklaRSgiZGV2X2luY29taW5nIik7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJb2xkX2N5Y2xlcyA9IGdldF9jeWNsZXMoKTsKKwkJd2FpdF9ldmVudF90aW1lb3V0KFdha2V1cF9Qb2xsaW5nX0RldmljZV9DaGFubmVscywKKwkJCQkgICAwLCBQT0xMSklGRklFU19OT1JNQUwpOworCQljdXJfY3ljbGVzID0gZ2V0X2N5Y2xlcygpOworCQlpZiAod2FpdF9jeWNsZXMgPT0gMCkgeworCQkJd2FpdF9jeWNsZXMgPSAoY3VyX2N5Y2xlcyAtIG9sZF9jeWNsZXMpOworCQl9IGVsc2UgeworCQkJaWYgKHdhaXRfY3ljbGVzIDwgKGN1cl9jeWNsZXMgLSBvbGRfY3ljbGVzKSkKKwkJCQl3YWl0X2N5Y2xlcyA9IChjdXJfY3ljbGVzIC0gb2xkX2N5Y2xlcyk7CisJCX0KKwl9CisJTE9HSU5GKCJ3YWl0X2N5Y2xlcz0lbGx1Iiwgd2FpdF9jeWNsZXMpOworCWN5Y2xlc19iZWZvcmVfd2FpdCA9IHdhaXRfY3ljbGVzOworCWlkbGVfY3ljbGVzID0gMDsKKwlHb19Qb2xsaW5nX0RldmljZV9DaGFubmVscyA9IDA7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqbGVsdCwgKnRtcDsKKwkJc3RydWN0IGRldmljZV9pbmZvICpkZXYgPSBOVUxMOworCisJCS8qIHBvbGwgZWFjaCBjaGFubmVsIGZvciBpbnB1dCAqLworCQlMT0NLU0VNX1VOSU5URVJSVVBUSUJMRSgmTG9ja19Qb2xsaW5nX0RldmljZV9DaGFubmVscyk7CisJCW5ld190YWlsID0gTlVMTDsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKGxlbHQsIHRtcCwgJkxpc3RfUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMpIHsKKwkJCWludCByYyA9IDA7CisJCQlkZXYgPSBsaXN0X2VudHJ5KGxlbHQsIHN0cnVjdCBkZXZpY2VfaW5mbywKKwkJCQkJIGxpc3RfcG9sbGluZ19kZXZpY2VfY2hhbm5lbHMpOworCQkJTE9DS1NFTV9VTklOVEVSUlVQVElCTEUoJmRldi0+aW50ZXJydXB0X2NhbGxiYWNrX2xvY2spOworCQkJaWYgKGRldi0+aW50ZXJydXB0KQorCQkJCXJjID0gZGV2LT5pbnRlcnJ1cHQoZGV2LT5pbnRlcnJ1cHRfY29udGV4dCk7CisJCQllbHNlCisJCQkJY29udGludWU7CisJCQlVTkxPQ0tTRU0oJmRldi0+aW50ZXJydXB0X2NhbGxiYWNrX2xvY2spOworCQkJaWYgKHJjKSB7CisJCQkJLyogZGV2LT5pbnRlcnJ1cHQgcmV0dXJuZWQsIGJ1dCB0aGVyZQorCQkJCSogaXMgc3RpbGwgbW9yZSB3b3JrIHRvIGRvLgorCQkJCSogUmVzY2hlZHVsZSB3b3JrIHRvIG9jY3VyIGFzIHNvb24gYXMKKwkJCQkqIHBvc3NpYmxlLiAqLworCQkJCWlkbGVfY3ljbGVzID0gMDsKKwkJCQlpZiAobmV3X3RhaWwgPT0gTlVMTCkgeworCQkJCQlkZXYtPmZpcnN0X2J1c3lfY250Kys7CisJCQkJCWlmICghCisJCQkJCSAgICAobGlzdF9pc19sYXN0CisJCQkJCSAgICAgKGxlbHQsCisJCQkJCSAgICAgICZMaXN0X1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzKSkpIHsKKwkJCQkJCW5ld190YWlsID0gbGVsdDsKKwkJCQkJCWRldi0+bW92ZWRfdG9fdGFpbF9jbnQrKzsKKwkJCQkJfSBlbHNlCisJCQkJCQlkZXYtPmxhc3Rfb25fbGlzdF9jbnQrKzsKKwkJCQl9CisKKwkJCX0KKwkJCWlmIChJbmNvbWluZ19UaHJlYWRJbmZvLnNob3VsZF9zdG9wKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChuZXdfdGFpbCAhPSBOVUxMKSB7CisJCQl0b3RfbW92ZWRfdG9fdGFpbF9jbnQrKzsKKwkJCWxpc3RfbW92ZV90YWlsKG5ld190YWlsLCAmTGlzdF9Qb2xsaW5nX0RldmljZV9DaGFubmVscyk7CisJCX0KKwkJVU5MT0NLU0VNKCZMb2NrX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzKTsKKwkJY3VyX2N5Y2xlcyA9IGdldF9jeWNsZXMoKTsKKwkJZGVsdGFfY3ljbGVzID0gY3VyX2N5Y2xlcyAtIG9sZF9jeWNsZXM7CisJCW9sZF9jeWNsZXMgPSBjdXJfY3ljbGVzOworCisJCS8qIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgc2Nhbm5lZCB0aHJ1IGFsbCBvZiB0aGUKKwkJKiBjaGFubmVscywgYW5kIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6CisJCSogLSB0aGVyZSBpcyBubyBpbnB1dCB3YWl0aW5nIG9uIGFueSBvZiB0aGUgY2hhbm5lbHMKKwkJKiAtIHdlIGhhdmUgcmVjZWl2ZWQgYSBzaWduYWwgdG8gc3RvcCB0aGlzIHRocmVhZAorCQkqLworCQlpZiAoSW5jb21pbmdfVGhyZWFkSW5mby5zaG91bGRfc3RvcCkKKwkJCWJyZWFrOworCQlpZiAoZW5fc21hcnRfd2FrZXVwID09IDB4RkYpIHsKKwkJCUxPR0lORigiZW5fc21hcnRfd2FrZXVwIHNldCB0byAweGZmLCB0byBmb3JjZSBleGl0aW5nIHByb2Nlc3NfaW5jb21pbmciKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIHdhaXQgZm9yIFBPTExKSUZGSUVTX05PUk1BTCBqaWZmaWVzLCBvciB1bnRpbAorCQkqIHNvbWVvbmUgd2FrZXMgdXAgV2FrZXVwX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzLAorCQkqIHdoaWNoZXZlciBjb21lcyBmaXJzdCBvbmx5IGRvIGEgd2FpdCB3aGVuIHdlIGhhdmUKKwkJKiBiZWVuIGlkbGUgZm9yIGN5Y2xlc19iZWZvcmVfd2FpdCBjeWNsZXMuCisJCSovCisJCWlmIChpZGxlX2N5Y2xlcyA+IGN5Y2xlc19iZWZvcmVfd2FpdCkgeworCQkJR29fUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMgPSAwOworCQkJdG90X3dhaXRfY250Kys7CisJCQl3YWl0X2V2ZW50X3RpbWVvdXQoV2FrZXVwX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzLAorCQkJCQkgICBHb19Qb2xsaW5nX0RldmljZV9DaGFubmVscywKKwkJCQkJICAgUE9MTEpJRkZJRVNfTk9STUFMKTsKKwkJCUdvX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzID0gMTsKKwkJfSBlbHNlIHsKKwkJCXRvdF9zY2hlZHVsZV9jbnQrKzsKKwkJCXNjaGVkdWxlKCk7CisJCQlpZGxlX2N5Y2xlcyA9IGlkbGVfY3ljbGVzICsgZGVsdGFfY3ljbGVzOworCQl9CisJfQorCURCR0lORigiZXhpdGluZy5cbiIpOworCWNvbXBsZXRlX2FuZF9leGl0KCZJbmNvbWluZ19UaHJlYWRJbmZvLmhhc19zdG9wcGVkLCAwKTsKK30KKworc3RhdGljIEJPT0wKK0luaXRpYWxpemVfaW5jb21pbmdfdGhyZWFkKHZvaWQpCit7CisJaWYgKEluY29taW5nX1RocmVhZF9TdGFydGVkKQorCQlyZXR1cm4gVFJVRTsKKwlpZiAoIXVpc3RocmVhZF9zdGFydCgmSW5jb21pbmdfVGhyZWFkSW5mbywKKwkJCSAgICAgJlByb2Nlc3NfSW5jb21pbmcsIE5VTEwsICJkZXZfaW5jb21pbmciKSkgeworCQlMT0dFUlIoInVpc3RocmVhZF9zdGFydCBJbml0aWFsaXplX2luY29taW5nX3RocmVhZCAqKioqRkFJTEVEIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJSW5jb21pbmdfVGhyZWFkX1N0YXJ0ZWQgPSBUUlVFOworCXJldHVybiBUUlVFOworfQorCisvKiAgQWRkIGEgbmV3IGRldmljZS9jaGFubmVsIHRvIHRoZSBsaXN0IGJlaW5nIHByb2Nlc3NlZCBieQorICogIFByb2Nlc3NfSW5jb21pbmcoKS4KKyAqICA8aW50ZXJydXB0PiAtIGluZGljYXRlcyB0aGUgZnVuY3Rpb24gdG8gY2FsbCBwZXJpb2RpY2FsbHkuCisgKiAgPGludGVycnVwdF9jb250ZXh0PiAtIGluZGljYXRlcyB0aGUgZGF0YSB0byBwYXNzIHRvIHRoZSA8aW50ZXJydXB0PgorICogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KKyAqLwordm9pZAordWlzbGliX2VuYWJsZV9jaGFubmVsX2ludGVycnVwdHMoVTMyIGJ1c05vLCBVMzIgZGV2Tm8sCisJCQkJIGludCAoKmludGVycnVwdCkodm9pZCAqKSwKKwkJCQkgdm9pZCAqaW50ZXJydXB0X2NvbnRleHQpCit7CisJc3RydWN0IGRldmljZV9pbmZvICpkZXY7CisJZGV2ID0gZmluZF9kZXYoYnVzTm8sIGRldk5vKTsKKwlpZiAoIWRldikgeworCQlMT0dFUlIoIiVzIGJ1c05vPSVkLCBkZXZObz0lZCIsIF9fZnVuY19fLCAoaW50KSAoYnVzTm8pLAorCQkgICAgICAgKGludCkgKGRldk5vKSk7CisJCXJldHVybjsKKwl9CisJTE9DS1NFTV9VTklOVEVSUlVQVElCTEUoJkxvY2tfUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMpOworCUluaXRpYWxpemVfaW5jb21pbmdfdGhyZWFkKCk7CisJZGV2LT5pbnRlcnJ1cHQgPSBpbnRlcnJ1cHQ7CisJZGV2LT5pbnRlcnJ1cHRfY29udGV4dCA9IGludGVycnVwdF9jb250ZXh0OworCWRldi0+cG9sbGluZyA9IFRSVUU7CisJbGlzdF9hZGRfdGFpbCgmKGRldi0+bGlzdF9wb2xsaW5nX2RldmljZV9jaGFubmVscyksCisJCSAgICAgICZMaXN0X1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzKTsKKwlVTkxPQ0tTRU0oJkxvY2tfUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzbGliX2VuYWJsZV9jaGFubmVsX2ludGVycnVwdHMpOworCisvKiAgUmVtb3ZlIGEgZGV2aWNlL2NoYW5uZWwgZnJvbSB0aGUgbGlzdCBiZWluZyBwcm9jZXNzZWQgYnkKKyAqICBQcm9jZXNzX0luY29taW5nKCkuCisgKi8KK3ZvaWQKK3Vpc2xpYl9kaXNhYmxlX2NoYW5uZWxfaW50ZXJydXB0cyhVMzIgYnVzTm8sIFUzMiBkZXZObykKK3sKKwlzdHJ1Y3QgZGV2aWNlX2luZm8gKmRldjsKKwlkZXYgPSBmaW5kX2RldihidXNObywgZGV2Tm8pOworCWlmICghZGV2KSB7CisJCUxPR0VSUigiJXMgYnVzTm89JWQsIGRldk5vPSVkIiwgX19mdW5jX18sIChpbnQpIChidXNObyksCisJCSAgICAgICAoaW50KSAoZGV2Tm8pKTsKKwkJcmV0dXJuOworCX0KKwlMT0NLU0VNX1VOSU5URVJSVVBUSUJMRSgmTG9ja19Qb2xsaW5nX0RldmljZV9DaGFubmVscyk7CisJbGlzdF9kZWwoJmRldi0+bGlzdF9wb2xsaW5nX2RldmljZV9jaGFubmVscyk7CisJZGV2LT5wb2xsaW5nID0gRkFMU0U7CisJZGV2LT5pbnRlcnJ1cHQgPSBOVUxMOworCVVOTE9DS1NFTSgmTG9ja19Qb2xsaW5nX0RldmljZV9DaGFubmVscyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfZGlzYWJsZV9jaGFubmVsX2ludGVycnVwdHMpOworCitzdGF0aWMgdm9pZAorZG9fd2FrZXVwX3BvbGxpbmdfZGV2aWNlX2NoYW5uZWxzKHN0cnVjdCB3b3JrX3N0cnVjdCAqZHVtbXkpCit7CisJaWYgKCFHb19Qb2xsaW5nX0RldmljZV9DaGFubmVscykgeworCQlHb19Qb2xsaW5nX0RldmljZV9DaGFubmVscyA9IDE7CisJCXdha2VfdXAoJldha2V1cF9Qb2xsaW5nX0RldmljZV9DaGFubmVscyk7CisJfQorfQorCitzdGF0aWMgREVDTEFSRV9XT1JLKFdvcmtfd2FrZXVwX3BvbGxpbmdfZGV2aWNlX2NoYW5uZWxzLAorCQkgICAgZG9fd2FrZXVwX3BvbGxpbmdfZGV2aWNlX2NoYW5uZWxzKTsKKworLyogIENhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHlvdSB3YW50IHRvIHNlbmQgYSBoaW50IHRvIFByb2Nlc3NfSW5jb21pbmcoKSB0aGF0CisgKiAgeW91ciBkZXZpY2UgbWlnaHQgaGF2ZSBtb3JlIHJlcXVlc3RzLgorICovCit2b2lkCit1aXNsaWJfZm9yY2VfY2hhbm5lbF9pbnRlcnJ1cHQoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pCit7CisJaWYgKGVuX3NtYXJ0X3dha2V1cCA9PSAwKQorCQlyZXR1cm47CisJaWYgKEdvX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzKQorCQlyZXR1cm47CisJLyogVGhlIHBvaW50IG9mIHVzaW5nIHNjaGVkdWxlX3dvcmsoKSBpbnN0ZWFkIG9mIGp1c3QgZG9pbmcKKwkgKiB0aGUgd29yayBpbmxpbmUgaXMgdG8gZm9yY2UgYSBzbGlnaHQgZGVsYXkgYmVmb3JlIHdha2luZyB1cAorCSAqIHRoZSBQcm9jZXNzX0luY29taW5nKCkgdGhyZWFkLgorCSAqLworCXRvdF93YWtldXBfY250Kys7CisJc2NoZWR1bGVfd29yaygmV29ya193YWtldXBfcG9sbGluZ19kZXZpY2VfY2hhbm5lbHMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzbGliX2ZvcmNlX2NoYW5uZWxfaW50ZXJydXB0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTW9kdWxlIEluaXQgJiBFeGl0IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9faW5pdAordWlzbGliX21vZF9pbml0KHZvaWQpCit7CisKKwlMT0dJTkYoIk1PTklUT1JBUElTIik7CisKKwlMT0dJTkYoInNpemVvZihzdHJ1Y3QgdWlzY21kcnNwKTolbHUgYnl0ZXNcbiIsCisJICAgICAgICh1bG9uZykgc2l6ZW9mKHN0cnVjdCB1aXNjbWRyc3ApKTsKKwlMT0dJTkYoInNpemVvZihzdHJ1Y3QgcGh5c19pbmZvKTolbHVcbiIsCisJICAgICAgICh1bG9uZykgc2l6ZW9mKHN0cnVjdCBwaHlzX2luZm8pKTsKKwlMT0dJTkYoInNpemVvZih1aXNjbWRyc3Bfc2NzaSk6JWx1XG4iLAorCSAgICAgICAodWxvbmcpIHNpemVvZihzdHJ1Y3QgdWlzY21kcnNwX3Njc2kpKTsKKwlMT0dJTkYoInNpemVvZih1aXNjbWRyc3BfbmV0KTolbHVcbiIsCisJICAgICAgICh1bG9uZykgc2l6ZW9mKHN0cnVjdCB1aXNjbWRyc3BfbmV0KSk7CisJTE9HSU5GKCJzaXplb2YoQ09OVFJPTFZNX01FU1NBR0UpOiVsdSBieXRlc1xuIiwKKwkgICAgICAgKHVsb25nKSBzaXplb2YoQ09OVFJPTFZNX01FU1NBR0UpKTsKKwlMT0dJTkYoInNpemVvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCk6JWx1IGJ5dGVzXG4iLAorCSAgICAgICAodWxvbmcpIHNpemVvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCkpOworCUxPR0lORigic2l6ZW9mKENIQU5ORUxfSEVBREVSKTolbHUgYnl0ZXNcbiIsCisJICAgICAgICh1bG9uZykgc2l6ZW9mKENIQU5ORUxfSEVBREVSKSk7CisJTE9HSU5GKCJzaXplb2YoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCk6JWx1IGJ5dGVzXG4iLAorCSAgICAgICAodWxvbmcpIHNpemVvZihVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MKSk7CisJTE9HSU5GKCJTSVpFT0ZfQ01EUlNQOiVsdSBieXRlc1xuIiwgU0laRU9GX0NNRFJTUCk7CisJTE9HSU5GKCJTSVpFT0ZfUFJPVE9DT0w6JWx1IGJ5dGVzXG4iLCBTSVpFT0ZfUFJPVE9DT0wpOworCisJLyogaW5pdGlhbGl6ZSBnbG9iYWwgcG9pbnRlcnMgdG8gTlVMTCAqLworCUJ1c0xpc3RIZWFkID0gTlVMTDsKKwlCdXNMaXN0Q291bnQgPSBNYXhCdXNDb3VudCA9IDA7CisJcndsb2NrX2luaXQoJkJ1c0xpc3RMb2NrKTsKKwlWaXJ0Q29udHJvbENoYW5GdW5jID0gTlVMTDsKKworCS8qIElzc3VlIFZNQ0FMTF9HRVRfQ09OVFJPTFZNX0FERFIgdG8gZ2V0IEN0cmxDaGFuUGh5c0FkZHIgYW5kCisJICogdGhlbiBtYXAgdGhpcyBwaHlzaWNhbCBhZGRyZXNzIHRvIGEgdmlydHVhbCBhZGRyZXNzLiAqLworCVBPU1RDT0RFX0xJTlVYXzIoRFJJVkVSX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCS8qIGNyZWF0ZSB0aGUgcHJvYyBlbnRyaWVzIGZvciB0aGUgY2hhbm5lbHMgKi8KKwl1aXNsaWJfcHJvY19kaXIgPSBwcm9jX21rZGlyKERJUl9QUk9DX0VOVFJZLCBOVUxMKTsKKwkvKiAoZS5nLiwgZm9yIC9wcm9jL3Vpc2xpYi92YnVzLzx4Pi9pbmZvKSAqLworCXVpc2xpYl9wcm9jX3ZidXNfZGlyID0gcHJvY19ta2RpcihESVJfVkJVU19QUk9DX0VOVFJZLCB1aXNsaWJfcHJvY19kaXIpOworCisJdm5pY19wcm9jX2VudHJ5ID0gcHJvY19jcmVhdGUoVk5JQ19QUk9DX0VOVFJZX0ZOLCAwLCB1aXNsaWJfcHJvY19kaXIsCisJCQkJICAgICAgJnByb2Nfdm5pY19mb3BzKTsKKwlTRVRfUFJPQ19PV05FUih2bmljX3Byb2NfZW50cnksIFRISVNfTU9EVUxFKTsKKworCS8qIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHksIGNyZWF0ZSB0aGUgcHJvYyBlbnRyaWVzIGZvcgorCSAqIGVucXVldWluZyBDb250cm9sIENoYW5uZWwgbWVzc2FnZXMgKi8KKwljaGlwc2V0X3Byb2NfZW50cnkgPQorCSAgICBwcm9jX2NyZWF0ZShDSElQU0VUX1BST0NfRU5UUllfRk4sIDAsIHVpc2xpYl9wcm9jX2RpciwKKwkJCSZwcm9jX2NoaXBzZXRfZm9wcyk7CisJU0VUX1BST0NfT1dORVIoY2hpcHNldF9wcm9jX2VudHJ5LCBUSElTX01PRFVMRSk7CisKKwlpbmZvX3Byb2NfZW50cnkgPSBwcm9jX2NyZWF0ZShJTkZPX1BST0NfRU5UUllfRk4sIDAsIHVpc2xpYl9wcm9jX2RpciwKKwkJCQkgICAgICAmcHJvY19pbmZvX2ZvcHMpOworCVNFVF9QUk9DX09XTkVSKGluZm9fcHJvY19lbnRyeSwgVEhJU19NT0RVTEUpOworCisJcGxhdGZvcm1udW1iZXJfcHJvY19lbnRyeSA9CisJICAgIHByb2NfY3JlYXRlKFBMQVRGT1JNTlVNQkVSX1BST0NfRU5UUllfRk4sIDAsIHVpc2xpYl9wcm9jX2RpciwKKwkJCSZwcm9jX3BsYXRmb3JtbnVtYmVyX2ZvcHMpOworCVNFVF9QUk9DX09XTkVSKHBsYXRmb3JtbnVtYmVyaW5mb19wcm9jX2VudHJ5LCBUSElTX01PRFVMRSk7CisKKwljeWNsZXNfYmVmb3JlX3dhaXRfcHJvY19lbnRyeSA9CisJICAgIHByb2NfY3JlYXRlKENZQ0xFU19CRUZPUkVfV0FJVF9QUk9DX0VOVFJZX0ZOLCAwLCB1aXNsaWJfcHJvY19kaXIsCisJCQkmcHJvY19jeWNsZXNfYmVmb3JlX3dhaXRfZm9wcyk7CisJU0VUX1BST0NfT1dORVIoY3ljbGVzX2JlZm9yZV93YWl0X3Byb2NfZW50cnksIFRISVNfTU9EVUxFKTsKKworCXJlc2V0X2NvdW50c19wcm9jX2VudHJ5ID0KKwkgICAgcHJvY19jcmVhdGUoUkVTRVRfQ09VTlRTX1BST0NfRU5UUllfRk4sIDAsIHVpc2xpYl9wcm9jX2RpciwKKwkJCSZwcm9jX3Jlc2V0X2NvdW50c19mb3BzKTsKKwlTRVRfUFJPQ19PV05FUihyZXNldF9jb3VudHNfcHJvY19lbnRyeSwgVEhJU19NT0RVTEUpOworCisJc21hcnRfd2FrZXVwX3Byb2NfZW50cnkgPQorCSAgICBwcm9jX2NyZWF0ZShTTUFSVF9XQUtFVVBfUFJPQ19FTlRSWV9GTiwgMCwgdWlzbGliX3Byb2NfZGlyLAorCQkJJnByb2Nfc21hcnRfd2FrZXVwX2ZvcHMpOworCVNFVF9QUk9DX09XTkVSKHNtYXJ0X3dha2V1cF9wcm9jX2VudHJ5LCBUSElTX01PRFVMRSk7CisKKyNpZmRlZiBVSVNMSUJfVEVTVF9QUk9DCisJdGVzdF9wcm9jX2VudHJ5ID0gcHJvY19jcmVhdGUoVEVTVF9QUk9DX0VOVFJZX0ZOLCAwLCB1aXNsaWJfcHJvY19kaXIsCisJCQkJICAgICAgJnByb2NfdGVzdF9mb3BzKTsKKwlTRVRfUFJPQ19PV05FUih0ZXN0X3Byb2NfZW50cnksIFRISVNfTU9EVUxFKTsKKworCWJ1c19wcm9jX2VudHJ5ID0gcHJvY19jcmVhdGUoQlVTX1BST0NfRU5UUllfRk4sIDAsIHVpc2xpYl9wcm9jX2RpciwKKwkJCQkgICAgICZwcm9jX2J1c19mb3BzKTsKKwlTRVRfUFJPQ19PV05FUihidXNfcHJvY19lbnRyeSwgVEhJU19NT0RVTEUpOworCisJZGV2X3Byb2NfZW50cnkgPSBwcm9jX2NyZWF0ZShERVZfUFJPQ19FTlRSWV9GTiwgMCwgdWlzbGliX3Byb2NfZGlyLAorCQkJCSAgICAgJnByb2NfZGV2X2ZvcHMpOworCVNFVF9QUk9DX09XTkVSKGRldl9wcm9jX2VudHJ5LCBUSElTX01PRFVMRSk7CisjZW5kaWYJCQkJLyogVUlTTElCX1RFU1RfUFJPQyAqLworCVBPU1RDT0RFX0xJTlVYXzMoRFJJVkVSX0VYSVRfUEMsIDAsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3Vpc2xpYl9tb2RfZXhpdCh2b2lkKQoreworCWlmIChkaXNhYmxlX3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KERJU0FCTEVfUFJPQ19FTlRSWV9GTiwgdWlzbGliX3Byb2NfZGlyKTsKKwlpZiAoY3ljbGVzX2JlZm9yZV93YWl0X3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KENZQ0xFU19CRUZPUkVfV0FJVF9QUk9DX0VOVFJZX0ZOLAorCQkJCSAgdWlzbGliX3Byb2NfZGlyKTsKKwlpZiAocmVzZXRfY291bnRzX3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFJFU0VUX0NPVU5UU19QUk9DX0VOVFJZX0ZOLCB1aXNsaWJfcHJvY19kaXIpOworCWlmIChzbWFydF93YWtldXBfcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoU01BUlRfV0FLRVVQX1BST0NfRU5UUllfRk4sIHVpc2xpYl9wcm9jX2Rpcik7CisJaWYgKGN0cmxjaGFuX3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KENUUkxDSEFOX1BST0NfRU5UUllfRk4sIHVpc2xpYl9wcm9jX2Rpcik7CisJaWYgKHBtZW1fcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoUE1FTV9QUk9DX0VOVFJZX0ZOLCB1aXNsaWJfcHJvY19kaXIpOworCWlmIChpbmZvX3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KElORk9fUFJPQ19FTlRSWV9GTiwgdWlzbGliX3Byb2NfZGlyKTsKKwlpZiAoc3dpdGNoX3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFNXSVRDSF9QUk9DX0VOVFJZX0ZOLCB1aXNsaWJfcHJvY19kaXIpOworCWlmIChleHRwb3J0X3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KEVYVFBPUlRfUFJPQ19FTlRSWV9GTiwgdWlzbGliX3Byb2NfZGlyKTsKKwlpZiAocGxhdGZvcm1udW1iZXJfcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoUExBVEZPUk1OVU1CRVJfUFJPQ19FTlRSWV9GTiwKKwkJCQkgIHVpc2xpYl9wcm9jX2Rpcik7CisJaWYgKGJ1c19wcm9jX2VudHJ5KQorCQlyZW1vdmVfcHJvY19lbnRyeShCVVNfUFJPQ19FTlRSWV9GTiwgdWlzbGliX3Byb2NfZGlyKTsKKwlpZiAoZGV2X3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KERFVl9QUk9DX0VOVFJZX0ZOLCB1aXNsaWJfcHJvY19kaXIpOworCWlmICh2bmljX3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFZOSUNfUFJPQ19FTlRSWV9GTiwgdWlzbGliX3Byb2NfZGlyKTsKKwlpZiAoY2hpcHNldF9wcm9jX2VudHJ5KQorCQlyZW1vdmVfcHJvY19lbnRyeShDSElQU0VUX1BST0NfRU5UUllfRk4sIHVpc2xpYl9wcm9jX2Rpcik7CisJaWYgKHVpc2xpYl9wcm9jX3ZidXNfZGlyKQorCQlyZW1vdmVfcHJvY19lbnRyeShESVJfVkJVU19QUk9DX0VOVFJZLCB1aXNsaWJfcHJvY19kaXIpOworCWlmICh1aXNsaWJfcHJvY19kaXIpCisJCXJlbW92ZV9wcm9jX2VudHJ5KERJUl9QUk9DX0VOVFJZLCBOVUxMKTsKKworCWlmIChQcm9jUmVhZEJ1ZmZlcikgeworCQl2ZnJlZShQcm9jUmVhZEJ1ZmZlcik7CisJCVByb2NSZWFkQnVmZmVyID0gTlVMTDsKKwl9CisKKwlEQkdJTkYoImdvb2RieWUuXG4iKTsKKwlyZXR1cm47Cit9CisKK21vZHVsZV9pbml0KHVpc2xpYl9tb2RfaW5pdCk7Cittb2R1bGVfZXhpdCh1aXNsaWJfbW9kX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJVc2hhIFNyaW5pdmFzYW4iKTsKK01PRFVMRV9BTElBUygidWlzbGliIik7CisgIC8qIHRoaXMgaXMgZXh0cmFjdGVkIGR1cmluZyBkZXBtb2QgYW5kIGtlcHQgaW4gbW9kdWxlcy5kZXAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL3Vpc3F1ZXVlLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXNxdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNTk4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXNxdWV1ZS5jCkBAIC0wLDAgKzEsMTYwIEBACisvKiB1aXNxdWV1ZS5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKiBAQUxMX0lOU1BFQ1RFRCAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAidWlzdXRpbHMuaCIKKworI2luY2x1ZGUgImNoYW5zdHViLmgiCisKKy8qIHRoaXMgaXMgc2hvcnRlciB0aGFuIHVzaW5nIF9fRklMRV9fIChmdWxsIHBhdGggbmFtZSkgaW4KKyAqIGRlYnVnL2luZm8vZXJyb3IgbWVzc2FnZXMgKi8KKyNkZWZpbmUgQ1VSUkVOVF9GSUxFX1BDIFVJU0xJQl9QQ191aXNxdWV1ZV9jCisjZGVmaW5lIF9fTVlGSUxFX18gInVpc3F1ZXVlLmMiCisKKyNkZWZpbmUgQ0hFQ0tfQ0FDSEVfQUxJR04gMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBsb25nIGxvbmcKK3Vpc3F1ZXVlX0ludGVybG9ja2VkT3IodW5zaWduZWQgbG9uZyBsb25nIF9faW9tZW0gKlRhcmdldCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBTZXQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGk7CisJdW5zaWduZWQgbG9uZyBsb25nIGo7CisKKwlqID0gcmVhZHEoVGFyZ2V0KTsKKwlkbyB7CisJCWkgPSBqOworCQlqID0gdWlzbGliY21weGNoZzY0KChfX2ZvcmNlIHVuc2lnbmVkIGxvbmcgbG9uZyAqKVRhcmdldCwKKwkJCQkgICAgaSwgaSB8IFNldCwgc2l6ZW9mKCooVGFyZ2V0KSkpOworCisJfSB3aGlsZSAoaSAhPSBqKTsKKworCXJldHVybiBqOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzcXVldWVfSW50ZXJsb2NrZWRPcik7CisKK3Vuc2lnbmVkIGxvbmcgbG9uZwordWlzcXVldWVfSW50ZXJsb2NrZWRBbmQodW5zaWduZWQgbG9uZyBsb25nIF9faW9tZW0gKlRhcmdldCwKKwkJCXVuc2lnbmVkIGxvbmcgbG9uZyBTZXQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGk7CisJdW5zaWduZWQgbG9uZyBsb25nIGo7CisKKwlqID0gcmVhZHEoVGFyZ2V0KTsKKwlkbyB7CisJCWkgPSBqOworCQlqID0gdWlzbGliY21weGNoZzY0KChfX2ZvcmNlIHVuc2lnbmVkIGxvbmcgbG9uZyAqKVRhcmdldCwKKwkJCQkgICAgaSwgaSAmIFNldCwgc2l6ZW9mKCooVGFyZ2V0KSkpOworCisJfSB3aGlsZSAoaSAhPSBqKTsKKworCXJldHVybiBqOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzcXVldWVfSW50ZXJsb2NrZWRBbmQpOworCitzdGF0aWMgVTgKK2RvX2xvY2tlZF9jbGllbnRfaW5zZXJ0KHN0cnVjdCB1aXNxdWV1ZV9pbmZvICpxdWV1ZWluZm8sCisJCQl1bnNpZ25lZCBpbnQgd2hpY2hxdWV1ZSwKKwkJCXZvaWQgKnBTaWduYWwsCisJCQlzcGlubG9ja190ICpsb2NrLAorCQkJdW5zaWduZWQgY2hhciBpc3N1ZUludGVycnVwdElmRW1wdHksCisJCQlVNjQgaW50ZXJydXB0SGFuZGxlLCBVOCAqY2hhbm5lbElkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBxdWV1ZVdhc0VtcHR5OworCXVuc2lnbmVkIGludCBsb2NrZWQgPSAwOworCXVuc2lnbmVkIGludCBhY3F1aXJlZCA9IDA7CisJVTggcmMgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpOworCWxvY2tlZCA9IDE7CisKKwlpZiAoIVVMVFJBX0NIQU5ORUxfQ0xJRU5UX0FDUVVJUkVfT1MocXVldWVpbmZvLT5jaGFuLCBjaGFubmVsSWQsIE5VTEwpKQorCQlnb3RvIEF3YXk7CisKKwlhY3F1aXJlZCA9IDE7CisKKwlxdWV1ZVdhc0VtcHR5ID0gdmlzb3Jfc2lnbmFscXVldWVfZW1wdHkocXVldWVpbmZvLT5jaGFuLCB3aGljaHF1ZXVlKTsKKwlpZiAoIXZpc29yX3NpZ25hbF9pbnNlcnQocXVldWVpbmZvLT5jaGFuLCB3aGljaHF1ZXVlLCBwU2lnbmFsKSkKKwkJZ290byBBd2F5OworCVVMVFJBX0NIQU5ORUxfQ0xJRU5UX1JFTEVBU0VfT1MocXVldWVpbmZvLT5jaGFuLCBjaGFubmVsSWQsIE5VTEwpOworCWFjcXVpcmVkID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKTsKKwlsb2NrZWQgPSAwOworCisJcXVldWVpbmZvLT5wYWNrZXRzX3NlbnQrKzsKKworCXJjID0gMTsKK0F3YXk6CisJaWYgKGFjcXVpcmVkKSB7CisJCVVMVFJBX0NIQU5ORUxfQ0xJRU5UX1JFTEVBU0VfT1MocXVldWVpbmZvLT5jaGFuLCBjaGFubmVsSWQsCisJCQkJCQlOVUxMKTsKKwkJYWNxdWlyZWQgPSAwOworCX0KKwlpZiAobG9ja2VkKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHNwaW5sb2NrX3QgKikgbG9jaywgZmxhZ3MpOworCQlsb2NrZWQgPSAwOworCX0KKworCXJldHVybiByYzsKK30KKworaW50Cit1aXNxdWV1ZV9wdXRfY21kcnNwX3dpdGhfbG9ja19jbGllbnQoc3RydWN0IHVpc3F1ZXVlX2luZm8gKnF1ZXVlaW5mbywKKwkJCQkgICAgIHN0cnVjdCB1aXNjbWRyc3AgKmNtZHJzcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB3aGljaHF1ZXVlLAorCQkJCSAgICAgdm9pZCAqaW5zZXJ0bG9jaywKKwkJCQkgICAgIHVuc2lnbmVkIGNoYXIgaXNzdWVJbnRlcnJ1cHRJZkVtcHR5LAorCQkJCSAgICAgVTY0IGludGVycnVwdEhhbmRsZSwKKwkJCQkgICAgIGNoYXIgb2t0b3dhaXQsIFU4ICpjaGFubmVsSWQpCit7CisJd2hpbGUgKCFkb19sb2NrZWRfY2xpZW50X2luc2VydChxdWV1ZWluZm8sIHdoaWNocXVldWUsIGNtZHJzcCwKKwkJCQkJKHNwaW5sb2NrX3QgKikgaW5zZXJ0bG9jaywKKwkJCQkJaXNzdWVJbnRlcnJ1cHRJZkVtcHR5LAorCQkJCQlpbnRlcnJ1cHRIYW5kbGUsIGNoYW5uZWxJZCkpIHsKKwkJaWYgKG9rdG93YWl0ICE9IE9LX1RPX1dBSVQpIHsKKwkJCUxPR0VSUigiKioqKkZBSUxFRCB2aXNvcl9zaWduYWxfaW5zZXJ0IGZhaWxlZDsgY2Fubm90IHdhaXQ7IGluc2VydCBhYm9ydGVkXG4iKTsKKwkJCXJldHVybiAwOwkvKiBmYWlsZWQgdG8gcXVldWUgKi8KKwkJfQorCQkvKiB0cnkgYWdhaW4gKi8KKwkJTE9HRVJSKCIqKioqRkFJTEVEIHZpc29yX3NpZ25hbF9pbnNlcnQgZmFpbGVkOyB3YWl0aW5nIHRvIHRyeSBhZ2FpblxuIik7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcygxMCkpOworCX0KKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc3F1ZXVlX3B1dF9jbWRyc3Bfd2l0aF9sb2NrX2NsaWVudCk7CisKKy8qIHVpc3F1ZXVlX2dldF9jbWRyc3AgZ2V0cyB0aGUgY21kcnNwIGVudHJ5IGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZQorICogcmV0dXJucyBOVUxMIGlmIHF1ZXVlIGlzIGVtcHR5ICovCitpbnQKK3Vpc3F1ZXVlX2dldF9jbWRyc3Aoc3RydWN0IHVpc3F1ZXVlX2luZm8gKnF1ZXVlaW5mbywKKwkJICAgIHZvaWQgKmNtZHJzcCwgdW5zaWduZWQgaW50IHdoaWNocXVldWUpCit7CisJaWYgKCF2aXNvcl9zaWduYWxfcmVtb3ZlKHF1ZXVlaW5mby0+Y2hhbiwgd2hpY2hxdWV1ZSwgY21kcnNwKSkKKwkJcmV0dXJuIDA7CisKKwlxdWV1ZWluZm8tPnBhY2tldHNfcmVjZWl2ZWQrKzsKKworCXJldHVybiAxOwkJLyogU3VjY2VzcyAqLworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzcXVldWVfZ2V0X2NtZHJzcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXN0aHJlYWQuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL3Vpc3RocmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MmIwNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXN0aHJlYWQuYwpAQCAtMCwwICsxLDg1IEBACisvKiB1aXN0aHJlYWQuYworICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyogQEFMTF9JTlNQRUNURUQgKi8KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgInVpc3V0aWxzLmgiCisjaW5jbHVkZSAidWlzdGhyZWFkLmgiCisKKyNkZWZpbmUgS0lMTChhLCBiLCBjKSBraWxsX3BpZChmaW5kX3ZwaWQoYSksIGIsIGMpCisKKy8qIHRoaXMgaXMgc2hvcnRlciB0aGFuIHVzaW5nIF9fRklMRV9fIChmdWxsIHBhdGggbmFtZSkgaW4KKyAqIGRlYnVnL2luZm8vZXJyb3IgbWVzc2FnZXMKKyAqLworI2RlZmluZSBDVVJSRU5UX0ZJTEVfUEMgVUlTTElCX1BDX3Vpc3RocmVhZF9jCisjZGVmaW5lIF9fTVlGSUxFX18gInVpc3RocmVhZC5jIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHJldHVybnMgMCBmb3IgZmFpbHVyZSwgMSBmb3Igc3VjY2VzcyAqLworaW50Cit1aXN0aHJlYWRfc3RhcnQoc3RydWN0IHVpc3RocmVhZF9pbmZvICp0aHJpbmZvLAorCQlpbnQgKCp0aHJlYWRmbikodm9pZCAqKSwgdm9pZCAqdGhyY29udGV4dCwgY2hhciAqbmFtZSkKK3sKKwl0aHJpbmZvLT5zaG91bGRfc3RvcCA9IDA7CisJLyogdXNlZCB0byBzdG9wIHRoZSB0aHJlYWQgKi8KKwlpbml0X2NvbXBsZXRpb24oJnRocmluZm8tPmhhc19zdG9wcGVkKTsKKwl0aHJpbmZvLT50YXNrID0ga3RocmVhZF9jcmVhdGUodGhyZWFkZm4sIHRocmNvbnRleHQsIG5hbWUsIE5VTEwpOworCWlmIChJU19FUlIodGhyaW5mby0+dGFzaykpIHsKKwkJdGhyaW5mby0+aWQgPSAwOworCQlyZXR1cm4gMDsJLyogZmFpbHVyZSAqLworCX0KKwl0aHJpbmZvLT5pZCA9IHRocmluZm8tPnRhc2stPnBpZDsKKwl3YWtlX3VwX3Byb2Nlc3ModGhyaW5mby0+dGFzayk7CisJTE9HSU5GKCJzdGFydGVkIHRocmVhZCBwaWQ6JWRcbiIsIHRocmluZm8tPmlkKTsKKwlyZXR1cm4gMTsKKworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzdGhyZWFkX3N0YXJ0KTsKKwordm9pZAordWlzdGhyZWFkX3N0b3Aoc3RydWN0IHVpc3RocmVhZF9pbmZvICp0aHJpbmZvKQoreworCWludCByZXQ7CisJaW50IHN0b3BwZWQgPSAwOworCWlmICh0aHJpbmZvLT5pZCA9PSAwKQorCQlyZXR1cm47CQkvKiB0aHJlYWQgbm90IHJ1bm5pbmcgKi8KKworCUxPR0lORigidWlzdGhyZWFkX3N0b3Agc3RvcHBpbmcgaWQ6JWRcbiIsIHRocmluZm8tPmlkKTsKKwl0aHJpbmZvLT5zaG91bGRfc3RvcCA9IDE7CisJcmV0ID0gS0lMTCh0aHJpbmZvLT5pZCwgU0lHSFVQLCAxKTsKKwlpZiAocmV0KSB7CisJCUxPR0VSUigidW5hYmxlIHRvIHNpZ25hbCB0aHJlYWQgJWRcbiIsIHJldCk7CisJfSBlbHNlIHsKKwkJLyogZ2l2ZSB1cCBpZiB0aGUgdGhyZWFkIGhhcyBOT1QgZGllZCBpbiAxIG1pbnV0ZSAqLworCQlpZiAod2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ0aHJpbmZvLT5oYXNfc3RvcHBlZCwgNjAgKiBIWikpCisJCQlzdG9wcGVkID0gMTsKKwkJZWxzZQorCQkJTE9HRVJSKCJ0aW1lZCBvdXQgdHJ5aW5nIHRvIHNpZ25hbCB0aHJlYWRcbiIpOworCX0KKwlpZiAoc3RvcHBlZCkgeworCQlMT0dJTkYoInVpc3RocmVhZF9zdG9wIHN0b3BwZWQgaWQ6JWRcbiIsIHRocmluZm8tPmlkKTsKKwkJdGhyaW5mby0+aWQgPSAwOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc3RocmVhZF9zdG9wKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL3Vpc3V0aWxzLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXN1dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNzhmNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXN1dGlscy5jCkBAIC0wLDAgKzEsMzUwIEBACisvKiB1aXN1dGlscy5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGNvbW1vbnR5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgInVpc3V0aWxzLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorI2luY2x1ZGUgInZidXNoZWxwZXIuaCIKKyNpbmNsdWRlICJndWlkdXRpbHMuaCIKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpZmRlZiBDT05GSUdfSElHSE1FTQorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNlbmRpZgorCisvKiB0aGlzIGlzIHNob3J0ZXIgdGhhbiB1c2luZyBfX0ZJTEVfXyAoZnVsbCBwYXRoIG5hbWUpIGluCisgKiBkZWJ1Zy9pbmZvL2Vycm9yIG1lc3NhZ2VzCisgKi8KKyNkZWZpbmUgQ1VSUkVOVF9GSUxFX1BDIFVJU0xJQl9QQ191aXN1dGlsc19jCisjZGVmaW5lIF9fTVlGSUxFX18gInVpc3V0aWxzLmMiCisKKy8qIGV4cG9ydHMgKi8KK2F0b21pY190IFVpc1V0aWxzX1JlZ2lzdGVyZWRfU2VydmljZXMgPSBBVE9NSUNfSU5JVCgwKTsKKwkJCQkJLyogbnVtIHJlZ2lzdHJhdGlvbnMgdmlhCisJCQkJCSAqIHVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXIoKSBvcgorCQkJCQkgKiB1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyX2V4KCkgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBVdGlsaXR5IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludAordWlzdXRpbF9hZGRfcHJvY19saW5lX2V4KGludCAqdG90YWwsIGNoYXIgKipidWZmZXIsIGludCAqYnVmZmVyX3JlbWFpbmluZywKKwkJICAgICAgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCBsZW47CisKKwlEQkdJTkYoImJ1ZmZlciA9IDB4JXAgOiAqYnVmZmVyID0gMHglcC5cbiIsIGJ1ZmZlciwgKmJ1ZmZlcik7CisJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwlsZW4gPSB2c25wcmludGYoKmJ1ZmZlciwgKmJ1ZmZlcl9yZW1haW5pbmcsIGZvcm1hdCwgYXJncyk7CisJaWYgKGxlbiA+PSAqYnVmZmVyX3JlbWFpbmluZykgeworCQkqYnVmZmVyICs9ICpidWZmZXJfcmVtYWluaW5nOworCQkqdG90YWwgKz0gKmJ1ZmZlcl9yZW1haW5pbmc7CisJCSpidWZmZXJfcmVtYWluaW5nID0gMDsKKwkJTE9HRVJSKCJieXRlcyByZW1haW5pbmcgaXMgdG9vIHNtYWxsIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJKmJ1ZmZlcl9yZW1haW5pbmcgLT0gbGVuOworCSpidWZmZXIgKz0gbGVuOworCSp0b3RhbCArPSBsZW47CisJcmV0dXJuIGxlbjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc3V0aWxfYWRkX3Byb2NfbGluZV9leCk7CisKK2ludAordWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcihpbnQgdHlwZSwgdm9pZCAqZnB0ciwKKwkJCSAgICAgVUxUUkFfVkJVU19ERVZJQ0VJTkZPICpjaGlwc2V0X0RyaXZlckluZm8pCit7CisJTE9HSU5GKCJ0eXBlID0gJWQsIGZwdHIgPSAweCVwLlxuIiwgdHlwZSwgZnB0cik7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIDI6CisJCWlmIChmcHRyKSB7CisJCQlpZiAoIVZpcnRDb250cm9sQ2hhbkZ1bmMpCisJCQkJYXRvbWljX2luYygmVWlzVXRpbHNfUmVnaXN0ZXJlZF9TZXJ2aWNlcyk7CisJCQlWaXJ0Q29udHJvbENoYW5GdW5jID0gZnB0cjsKKwkJfSBlbHNlIHsKKwkJCWlmIChWaXJ0Q29udHJvbENoYW5GdW5jKQorCQkJCWF0b21pY19kZWMoJlVpc1V0aWxzX1JlZ2lzdGVyZWRfU2VydmljZXMpOworCQkJVmlydENvbnRyb2xDaGFuRnVuYyA9IE5VTEw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlMT0dFUlIoImludmFsaWQgdHlwZSAlZC5cbiIsIHR5cGUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNoaXBzZXRfRHJpdmVySW5mbykKKwkJQnVzRGV2aWNlSW5mb19Jbml0KGNoaXBzZXRfRHJpdmVySW5mbywKKwkJCQkgICAiY2hpcHNldCIsICJ1aXNsaWIiLAorCQkJCSAgIFZFUlNJT04sIE5VTEwsIF9fREFURV9fLCBfX1RJTUVfXyk7CisKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXIpOworCitpbnQKK3Vpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXJfZXgoR1VJRCBzd2l0Y2hUeXBlR3VpZCwKKwkJCQljb25zdCBjaGFyICpzd2l0Y2hfdHlwZV9uYW1lLAorCQkJCWludCAoKmNvbnRyb2xmdW5jKShzdHJ1Y3QgaW9fbXNncyAqKSwKKwkJCQl1bnNpZ25lZCBsb25nIG1pbl9jaGFubmVsX2J5dGVzLAorCQkJCWludCAoKlNlcnZlcl9DaGFubmVsX09rKSh1bnNpZ25lZCBsb25nCisJCQkJCQkJICBjaGFubmVsQnl0ZXMpLAorCQkJCWludCAoKlNlcnZlcl9DaGFubmVsX0luaXQpCisJCQkJICh2b2lkICp4LCB1bnNpZ25lZCBjaGFyICpjbGllbnRTdHIsCisJCQkJICBVMzIgY2xpZW50U3RyTGVuLCBVNjQgYnl0ZXMpLAorCQkJCVVMVFJBX1ZCVVNfREVWSUNFSU5GTyAqY2hpcHNldF9Ecml2ZXJJbmZvKQoreworCWNoYXIgc1s5OV07CisJUmVxSGFuZGxlckluZm9fdCAqcFJlcUhhbmRsZXJJbmZvOworCWludCByYyA9IDA7CQkvKiBhc3N1bWUgZmFpbHVyZSAqLworCUxPR0lORigidHlwZT0lcywgY29udHJvbGZ1bmM9MHglcC5cbiIsCisJICAgICAgIEdVSURfZm9ybWF0MSgmc3dpdGNoVHlwZUd1aWQsIHMpLCBjb250cm9sZnVuYyk7CisJaWYgKCFjb250cm9sZnVuYykgeworCQlMT0dFUlIoIiVzOiBjb250cm9sZnVuYyBtdXN0IGJlIHN1cHBsaWVkXG4iLAorCQkgICAgICAgR1VJRF9mb3JtYXQxKCZzd2l0Y2hUeXBlR3VpZCwgcykpOworCQlnb3RvIEF3YXk7CisJfQorCWlmICghU2VydmVyX0NoYW5uZWxfT2spIHsKKwkJTE9HRVJSKCIlczogU2VydmVyX0NoYW5uZWxfT2sgbXVzdCBiZSBzdXBwbGllZFxuIiwKKwkJICAgICAgIEdVSURfZm9ybWF0MSgmc3dpdGNoVHlwZUd1aWQsIHMpKTsKKwkJZ290byBBd2F5OworCX0KKwlpZiAoIVNlcnZlcl9DaGFubmVsX0luaXQpIHsKKwkJTE9HRVJSKCIlczogU2VydmVyX0NoYW5uZWxfSW5pdCBtdXN0IGJlIHN1cHBsaWVkXG4iLAorCQkgICAgICAgR1VJRF9mb3JtYXQxKCZzd2l0Y2hUeXBlR3VpZCwgcykpOworCQlnb3RvIEF3YXk7CisJfQorCXBSZXFIYW5kbGVySW5mbyA9IFJlcUhhbmRsZXJBZGQoc3dpdGNoVHlwZUd1aWQsCisJCQkJCXN3aXRjaF90eXBlX25hbWUsCisJCQkJCWNvbnRyb2xmdW5jLAorCQkJCQltaW5fY2hhbm5lbF9ieXRlcywKKwkJCQkJU2VydmVyX0NoYW5uZWxfT2ssIFNlcnZlcl9DaGFubmVsX0luaXQpOworCWlmICghcFJlcUhhbmRsZXJJbmZvKSB7CisJCUxPR0VSUigiZmFpbGVkIHRvIGFkZCAlcyB0byBzZXJ2ZXIgbGlzdFxuIiwKKwkJICAgICAgIEdVSURfZm9ybWF0MSgmc3dpdGNoVHlwZUd1aWQsIHMpKTsKKwkJZ290byBBd2F5OworCX0KKworCWF0b21pY19pbmMoJlVpc1V0aWxzX1JlZ2lzdGVyZWRfU2VydmljZXMpOworCXJjID0gMTsJCQkvKiBzdWNjZXNzICovCitBd2F5OgorCWlmIChyYykgeworCQlpZiAoY2hpcHNldF9Ecml2ZXJJbmZvKQorCQkJQnVzRGV2aWNlSW5mb19Jbml0KGNoaXBzZXRfRHJpdmVySW5mbywKKwkJCQkJICAgImNoaXBzZXQiLCAidWlzbGliIiwKKwkJCQkJICAgVkVSU0lPTiwgTlVMTCwKKwkJCQkJICAgX19EQVRFX18sIF9fVElNRV9fKTsKKwl9IGVsc2UKKwkJTE9HRVJSKCJmYWlsZWQgdG8gcmVnaXN0ZXIgdHlwZSAlcy5cbiIsCisJCSAgICAgICBHVUlEX2Zvcm1hdDEoJnN3aXRjaFR5cGVHdWlkLCBzKSk7CisKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyX2V4KTsKKworaW50Cit1aXNjdHJsX3VucmVnaXN0ZXJfcmVxX2hhbmRsZXJfZXgoR1VJRCBzd2l0Y2hUeXBlR3VpZCkKK3sKKwljaGFyIHNbOTldOworCWludCByYyA9IDA7CQkvKiBhc3N1bWUgZmFpbHVyZSAqLworCUxPR0lORigidHlwZT0lcy5cbiIsIEdVSURfZm9ybWF0MSgmc3dpdGNoVHlwZUd1aWQsIHMpKTsKKwlpZiAoUmVxSGFuZGxlckRlbChzd2l0Y2hUeXBlR3VpZCkgPCAwKSB7CisJCUxPR0VSUigiZmFpbGVkIHRvIHJlbW92ZSAlcyBmcm9tIHNlcnZlciBsaXN0XG4iLAorCQkgICAgICAgR1VJRF9mb3JtYXQxKCZzd2l0Y2hUeXBlR3VpZCwgcykpOworCQlnb3RvIEF3YXk7CisJfQorCWF0b21pY19kZWMoJlVpc1V0aWxzX1JlZ2lzdGVyZWRfU2VydmljZXMpOworCXJjID0gMTsJCQkvKiBzdWNjZXNzICovCitBd2F5OgorCWlmICghcmMpCisJCUxPR0VSUigiZmFpbGVkIHRvIHVucmVnaXN0ZXIgdHlwZSAlcy5cbiIsCisJCSAgICAgICBHVUlEX2Zvcm1hdDEoJnN3aXRjaFR5cGVHdWlkLCBzKSk7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzY3RybF91bnJlZ2lzdGVyX3JlcV9oYW5kbGVyX2V4KTsKKworLyoKKyAqIHVuc2lnbmVkIGludCB1aXN1dGlsX2NvcHlfZnJhZ3NpbmZvX2Zyb21fc2tiKHVuc2lnbmVkIGNoYXIgKmNhbGxpbmdfY3R4LAorICoJCQkJCSAgICAgdm9pZCAqc2tiX2luLAorICoJCQkJCSAgICAgdW5zaWduZWQgaW50IGZpcnN0ZnJhZ2xlbiwKKyAqCQkJCQkgICAgIHVuc2lnbmVkIGludCBmcmFnc19tYXgsCisgKgkJCQkJICAgICBzdHJ1Y3QgcGh5c19pbmZvIGZyYWdzW10pCisgKgorICoJY2FsbGluZ19jdHggLSBpbnB1dCAtICAgYSBzdHJpbmcgdGhhdCBpcyBkaXNwbGF5ZWQgdG8gc2hvdworICoJCQkJd2hvIGNhbGxlZCAqIHRoaXMgZnVuYworICoJdm9pZCAqc2tiX2luIC0gIHNrYiB3aG9zZSBmcmFnIGluZm8gd2UncmUgY29weWluZyB0eXBlIGlzIGhpZGRlbiBzbyB3ZQorICoJCQlkb24ndCBuZWVkIHRvIGluY2x1ZGUgc2tiYnVmZiBpbiB1aXN1dGlscy5oIHdoaWNoIGlzCisgKgkJCWluY2x1ZGVkIGluIG5vbi1uZXR3b3JraW5nIGNvZGUuCisgKgl1bnNpZ25lZCBpbnQgZmlyc3RmcmFnbGVuIC0gaW5wdXQgLSBsZW5ndGggb2YgZmlyc3QgZnJhZ21lbnQgaW4gc2tiCisgKgl1bnNpZ25lZCBpbnQgZnJhZ3NfbWF4IC0gaW5wdXQgLSBtYXggbGVuIG9mIGZyYWdzIGFycmF5CisgKglzdHJ1Y3QgcGh5c19pbmZvIGZyYWdzW10gLSBvdXRwdXQgLSBmcmFncyBhcnJheSBmaWxsZWQgaW4gb24gb3V0cHV0CisgKgkJCQkJICAgIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgbnVtYmVyIG9mCisgKgkJCQkJICAgIGVudHJpZXMgZmlsbGVkIGluIGZyYWdzCisgKi8KK3Vuc2lnbmVkIGludAordWlzdXRpbF9jb3B5X2ZyYWdzaW5mb19mcm9tX3NrYih1bnNpZ25lZCBjaGFyICpjYWxsaW5nX2N0eCwgdm9pZCAqc2tiX2luLAorCQkJCXVuc2lnbmVkIGludCBmaXJzdGZyYWdsZW4sCisJCQkJdW5zaWduZWQgaW50IGZyYWdzX21heCwKKwkJCQlzdHJ1Y3QgcGh5c19pbmZvIGZyYWdzW10pCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMCwgaWksIHNpemUsIG9mZnNldCA9IDAsIG51bWZyYWdzOworCXN0cnVjdCBza19idWZmICpza2IgPSBza2JfaW47CisKKwludW1mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisKKwl3aGlsZSAoZmlyc3RmcmFnbGVuKSB7CisJCWlmIChjb3VudCA9PSBmcmFnc19tYXgpIHsKKwkJCUxPR0VSUigiJXMgZnJhZ3MgYXJyYXkgdG9vIHNtYWxsOiBtYXg6JWQgY291bnQ6JWRcbiIsCisJCQkgICAgICAgY2FsbGluZ19jdHgsIGZyYWdzX21heCwgY291bnQpOworCQkJcmV0dXJuIC0xOwkvKiBmYWlsdXJlICovCisJCX0KKwkJZnJhZ3NbY291bnRdLnBpX3BmbiA9CisJCSAgICBwYWdlX3RvX3Bmbih2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhICsgb2Zmc2V0KSk7CisJCWZyYWdzW2NvdW50XS5waV9vZmYgPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpIChza2ItPmRhdGEgKyBvZmZzZXQpICYgUElfUEFHRV9NQVNLOworCQlzaXplID0KKwkJICAgIG1pbihmaXJzdGZyYWdsZW4sCisJCQkodW5zaWduZWQgaW50KSAoUElfUEFHRV9TSVpFIC0gZnJhZ3NbY291bnRdLnBpX29mZikpOworCQkvKiBjYW4gdGFrZSBzbWFsbGVzdCBvZiBmaXJzdGZyYWdsZW4od2hhdCdzIGxlZnQpIE9SCisJCSogYnl0ZXMgbGVmdCBpbiB0aGUgcGFnZQorCQkqLworCQlmcmFnc1tjb3VudF0ucGlfbGVuID0gc2l6ZTsKKwkJZmlyc3RmcmFnbGVuIC09IHNpemU7CisJCW9mZnNldCArPSBzaXplOworCQljb3VudCsrOworCX0KKwlpZiAobnVtZnJhZ3MpIHsKKwkJaWYgKChjb3VudCArIG51bWZyYWdzKSA+IGZyYWdzX21heCkgeworCQkJTE9HRVJSKCIqKioqIEZBSUxFRCAlcyBmcmFncyBhcnJheSB0b28gc21hbGw6IG1heDolZCBjb3VudCtucl9mcmFnczolZFxuIiwKKwkJCSAgICAgY2FsbGluZ19jdHgsIGZyYWdzX21heCwgY291bnQgKyBudW1mcmFncyk7CisJCQlyZXR1cm4gLTE7CS8qIGZhaWx1cmUgKi8KKwkJfQorCisJCWZvciAoaWkgPSAwOyBpaSA8IG51bWZyYWdzOyBpaSsrKSB7CisJCQljb3VudCA9IGFkZF9waHlzaW5mb19lbnRyaWVzKHBhZ2VfdG9fcGZuKHNrYl9mcmFnX3BhZ2UoJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaWldKSksCS8qIHBmbiAqLworCQkJCQkJICAgICBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2lpXS4KKwkJCQkJCSAgICAgcGFnZV9vZmZzZXQsCisJCQkJCQkgICAgIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaWldLgorCQkJCQkJICAgICBzaXplLCBjb3VudCwgZnJhZ3NfbWF4LAorCQkJCQkJICAgICBmcmFncyk7CisJCQlpZiAoY291bnQgPT0gMCkgeworCQkJCUxPR0VSUigiKioqKiBGQUlMRUQgdG8gYWRkIHBoeXNpbmZvIGVudHJpZXNcbiIpOworCQkJCXJldHVybiAtMTsJLyogZmFpbHVyZSAqLworCQkJfQorCQl9CisJfQorCWlmIChza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiaW5saXN0OworCQlpbnQgYzsKKwkJZm9yIChza2Jpbmxpc3QgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsgc2tiaW5saXN0OworCQkgICAgIHNrYmlubGlzdCA9IHNrYmlubGlzdC0+bmV4dCkgeworCisJCQljID0gdWlzdXRpbF9jb3B5X2ZyYWdzaW5mb19mcm9tX3NrYigicmVjdXJzaXZlIiwKKwkJCQkJCQkgICAgc2tiaW5saXN0LAorCQkJCQkJCSAgICBza2Jpbmxpc3QtPmxlbiAtCisJCQkJCQkJICAgIHNrYmlubGlzdC0+ZGF0YV9sZW4sCisJCQkJCQkJICAgIGZyYWdzX21heCAtIGNvdW50LAorCQkJCQkJCSAgICAmZnJhZ3NbY291bnRdKTsKKwkJCWlmIChjID09IC0xKSB7CisJCQkJTE9HRVJSKCIqKioqIEZBSUxFRCByZWN1cnNpdmUgY2FsbCBmYWlsZWRcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWNvdW50ICs9IGM7CisJCX0KKwl9CisJcmV0dXJuIGNvdW50OworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzdXRpbF9jb3B5X2ZyYWdzaW5mb19mcm9tX3NrYik7CisKK3N0YXRpYyBMSVNUX0hFQUQoUmVxSGFuZGxlckluZm9fbGlzdCk7CS8qIGxpc3Qgb2YgUmVxSGFuZGxlckluZm9fdCAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhSZXFIYW5kbGVySW5mb19saXN0X2xvY2spOworCitSZXFIYW5kbGVySW5mb190ICoKK1JlcUhhbmRsZXJBZGQoR1VJRCBzd2l0Y2hUeXBlR3VpZCwKKwkgICAgICBjb25zdCBjaGFyICpzd2l0Y2hfdHlwZV9uYW1lLAorCSAgICAgIGludCAoKmNvbnRyb2xmdW5jKShzdHJ1Y3QgaW9fbXNncyAqKSwKKwkgICAgICB1bnNpZ25lZCBsb25nIG1pbl9jaGFubmVsX2J5dGVzLAorCSAgICAgIGludCAoKlNlcnZlcl9DaGFubmVsX09rKSh1bnNpZ25lZCBsb25nIGNoYW5uZWxCeXRlcyksCisJICAgICAgaW50ICgqU2VydmVyX0NoYW5uZWxfSW5pdCkKKwkgICAgICAgKHZvaWQgKngsIHVuc2lnbmVkIGNoYXIgKmNsaWVudFN0ciwgVTMyIGNsaWVudFN0ckxlbiwgVTY0IGJ5dGVzKSkKK3sKKwlSZXFIYW5kbGVySW5mb190ICpyYyA9IE5VTEw7CisKKwlyYyA9IGt6YWxsb2Moc2l6ZW9mKCpyYyksIEdGUF9BVE9NSUMpOworCWlmICghcmMpCisJCXJldHVybiBOVUxMOworCXJjLT5zd2l0Y2hUeXBlR3VpZCA9IHN3aXRjaFR5cGVHdWlkOworCXJjLT5jb250cm9sZnVuYyA9IGNvbnRyb2xmdW5jOworCXJjLT5taW5fY2hhbm5lbF9ieXRlcyA9IG1pbl9jaGFubmVsX2J5dGVzOworCXJjLT5TZXJ2ZXJfQ2hhbm5lbF9PayA9IFNlcnZlcl9DaGFubmVsX09rOworCXJjLT5TZXJ2ZXJfQ2hhbm5lbF9Jbml0ID0gU2VydmVyX0NoYW5uZWxfSW5pdDsKKwlpZiAoc3dpdGNoX3R5cGVfbmFtZSkKKwkJc3RybmNweShyYy0+c3dpdGNoX3R5cGVfbmFtZSwgc3dpdGNoX3R5cGVfbmFtZSwKKwkJCXNpemVvZihyYy0+c3dpdGNoX3R5cGVfbmFtZSkgLSAxKTsKKwlzcGluX2xvY2soJlJlcUhhbmRsZXJJbmZvX2xpc3RfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmKHJjLT5saXN0X2xpbmspLCAmUmVxSGFuZGxlckluZm9fbGlzdCk7CisJc3Bpbl91bmxvY2soJlJlcUhhbmRsZXJJbmZvX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK1JlcUhhbmRsZXJJbmZvX3QgKgorUmVxSGFuZGxlckZpbmQoR1VJRCBzd2l0Y2hUeXBlR3VpZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsZWx0LCAqdG1wOworCVJlcUhhbmRsZXJJbmZvX3QgKmVudHJ5ID0gTlVMTDsKKwlzcGluX2xvY2soJlJlcUhhbmRsZXJJbmZvX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGxlbHQsIHRtcCwgJlJlcUhhbmRsZXJJbmZvX2xpc3QpIHsKKwkJZW50cnkgPSBsaXN0X2VudHJ5KGxlbHQsIFJlcUhhbmRsZXJJbmZvX3QsIGxpc3RfbGluayk7CisJCWlmIChtZW1jbXAKKwkJICAgICgmZW50cnktPnN3aXRjaFR5cGVHdWlkLCAmc3dpdGNoVHlwZUd1aWQsCisJCSAgICAgc2l6ZW9mKEdVSUQpKSA9PSAwKSB7CisJCQlzcGluX3VubG9jaygmUmVxSGFuZGxlckluZm9fbGlzdF9sb2NrKTsKKwkJCXJldHVybiBlbnRyeTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmUmVxSGFuZGxlckluZm9fbGlzdF9sb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworaW50CitSZXFIYW5kbGVyRGVsKEdVSUQgc3dpdGNoVHlwZUd1aWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGVsdCwgKnRtcDsKKwlSZXFIYW5kbGVySW5mb190ICplbnRyeSA9IE5VTEw7CisJaW50IHJjID0gLTE7CisJc3Bpbl9sb2NrKCZSZXFIYW5kbGVySW5mb19saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfc2FmZShsZWx0LCB0bXAsICZSZXFIYW5kbGVySW5mb19saXN0KSB7CisJCWVudHJ5ID0gbGlzdF9lbnRyeShsZWx0LCBSZXFIYW5kbGVySW5mb190LCBsaXN0X2xpbmspOworCQlpZiAobWVtY21wCisJCSAgICAoJmVudHJ5LT5zd2l0Y2hUeXBlR3VpZCwgJnN3aXRjaFR5cGVHdWlkLAorCQkgICAgIHNpemVvZihHVUlEKSkgPT0gMCkgeworCQkJbGlzdF9kZWwobGVsdCk7CisJCQlrZnJlZShlbnRyeSk7CisJCQlyYysrOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZSZXFIYW5kbGVySW5mb19saXN0X2xvY2spOworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkNzk4NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgVW5pc3lzIHZpcnRoYmEgY29uZmlndXJhdGlvbgorIworCitjb25maWcgVU5JU1lTX1ZJUlRIQkEKKwl0cmlzdGF0ZSAiVW5pc3lzIHZpcnRoYmEgZHJpdmVyIgorCWRlcGVuZHMgb24gVU5JU1lTU1BBUiAmJiBVTklTWVNfVklTT1JDSElQU0VUICYmIFVOSVNZU19DSEFOTkVMU1RVQiAmJiBVTklTWVNfVUlTTElCICYmIFVOSVNZU19WSVJUUENJICYmIFNDU0kKKwktLS1oZWxwLS0tCisJSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGVuYWJsZSB0aGUgVW5pc3lzIHZpcnRoYmEgZHJpdmVyLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyYjFjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS9NYWtlZmlsZQpAQCAtMCwwICsxLDE2IEBACisjCisjIE1ha2VmaWxlIGZvciBVbmlzeXMgdmlydGhiYQorIworCitvYmotJChDT05GSUdfVU5JU1lTX1ZJUlRIQkEpCSs9IHZpcnRoYmEubworCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3RpbXNrbW9kCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldAorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscworCitjY2ZsYWdzLXkgKz0gLURDT05GSUdfU1BBUl9HVUVTVCAtREdVRVNURFJJVkVSQlVJTEQgLUROT0FVVE9WRVJTSU9OCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS92aXJ0aGJhLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvdmlydGhiYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxN2IxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvdmlydGhiYS5jCkBAIC0wLDAgKzEsMTgyMyBAQAorLyogdmlydGhiYS5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjZGVmaW5lIEVYUE9SVF9TWU1UQUIKKworLyogaWYgeW91IHdhbnQgdG8gdHVybiBvbiBzb21lIGRlYnVnZ2luZyBvZiB3cml0ZSBkZXZpY2UgZGF0YSBvciByZWFkCisgKiBkZXZpY2UgZGF0YSwgZGVmaW5lIHRoZXNlIHR3byB1bmRlZnMuICBZb3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvCisgKiBjdXN0b21pemUgdGhlIGNvZGUgd2hpY2ggaXMgaGVyZSBzaW5jZSBpdCB3YXMgd3JpdHRlbiBhc3N1bWluZworICogcmVhZGluZyBhbmQgd3JpdGluZyBhIHNwZWNpZmljIGRhdGEgZmlsZSBkZi42NE0udHh0IHdoaWNoIGlzIGEKKyAqIDY0TWVnYWJ5dGUgZmlsZSBjcmVhdGVkIGJ5IEFydCBOaWxzb24gdXNpbmcgYSBzY3JpdHAgSSB3cm90ZSBjYWxsZWQKKyAqIGNyX3Rlc3RfZGF0YS5wbC4gIFRoZSBkYXRhIGZpbGUgY29uc2lzdHMgb2YgMjU2IGJ5dGUgbGluZXMgb2YgdGV4dAorICogd2hpY2ggc3RhcnQgd2l0aCBhbiA4IGRpZ2l0IHNlcXVlbmNlIG51bWJlciwgYSBjb2xvbiwgYW5kIHRoZW4KKyAqIGxldHRlcnMgYWZ0ZXIgdGhhdCAqLworCisjdW5kZWYgREJHSU5GCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpZmRlZiBDT05GSUdfTU9EVkVSU0lPTlMKKyNpbmNsdWRlIDxjb25maWcvbW9kdmVyc2lvbnMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgImRpYWdub3N0aWNzL2FwcG9zX3N1YnN5c3RlbXMuaCIKKyNpbmNsdWRlICJ1aXN1dGlscy5oIgorI2luY2x1ZGUgInVpc3F1ZXVlLmgiCisjaW5jbHVkZSAidWlzdGhyZWFkLmgiCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgInZpcnRoYmEuaCIKKyNpbmNsdWRlICJ2aXJ0cGNpLmgiCisjaW5jbHVkZSAidmlzb3JjaGlwc2V0LmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorI2luY2x1ZGUgImd1ZXN0bGludXhkZWJ1Zy5oIgorLyogdGhpcyBpcyBzaG9ydGVyIHRoYW4gdXNpbmcgX19GSUxFX18gKGZ1bGwgcGF0aCBuYW1lKSBpbgorICogZGVidWcvaW5mby9lcnJvciBtZXNzYWdlcworICovCisjZGVmaW5lIENVUlJFTlRfRklMRV9QQyBWSVJUX0hCQV9QQ192aXJ0aGJhX2MKKyNkZWZpbmUgX19NWUZJTEVfXyAidmlydGhiYS5jIgorCisvKiBOT1RFOiAgTDFfQ0FDSEVfQllURVMgPj0xMjggKi8KKyNkZWZpbmUgREVWSUNFX0FUVFJJQlVURSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHZpcnRoYmFfcHJvYmUoc3RydWN0IHZpcnRwY2lfZGV2ICpkZXYsCisJCQkgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKTsKK3N0YXRpYyB2b2lkIHZpcnRoYmFfcmVtb3ZlKHN0cnVjdCB2aXJ0cGNpX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgdmlydGhiYV9hYm9ydF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQpOworc3RhdGljIGludCB2aXJ0aGJhX2J1c19yZXNldF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQpOworc3RhdGljIGludCB2aXJ0aGJhX2RldmljZV9yZXNldF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQpOworc3RhdGljIGludCB2aXJ0aGJhX2hvc3RfcmVzZXRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kKTsKK3N0YXRpYyBjb25zdCBjaGFyICp2aXJ0aGJhX2dldF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNocCk7CitzdGF0aWMgaW50IHZpcnRoYmFfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpkZXYsIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpOworc3RhdGljIGludCB2aXJ0aGJhX3F1ZXVlX2NvbW1hbmRfbGNrKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQsCisJCQkJICAgICB2b2lkICgqdmlydGhiYV9jbW5kX2RvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpOworCisjaWZkZWYgREVGX1NDU0lfUUNNRAorREVGX1NDU0lfUUNNRCh2aXJ0aGJhX3F1ZXVlX2NvbW1hbmQpCisjZWxzZQorI2RlZmluZSB2aXJ0aGJhX3F1ZXVlX2NvbW1hbmQgdmlydGhiYV9xdWV1ZV9jb21tYW5kX2xjaworI2VuZGlmCisKKworc3RhdGljIGludCB2aXJ0aGJhX3NsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldik7CitzdGF0aWMgaW50IHZpcnRoYmFfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldik7CitzdGF0aWMgdm9pZCB2aXJ0aGJhX3NsYXZlX2Rlc3Ryb3koc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2KTsKK3N0YXRpYyBpbnQgcHJvY2Vzc19pbmNvbWluZ19yc3BzKHZvaWQgKik7CitzdGF0aWMgaW50IHZpcnRoYmFfc2VydmVydXAoc3RydWN0IHZpcnRwY2lfZGV2ICp2aXJ0cGNpZGV2KTsKK3N0YXRpYyBpbnQgdmlydGhiYV9zZXJ2ZXJkb3duKHN0cnVjdCB2aXJ0cGNpX2RldiAqdmlydHBjaWRldiwgdTMyIHN0YXRlKTsKK3N0YXRpYyB2b2lkIGRvRGlza0FkZFJlbW92ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIHZvaWQgdmlydGhiYV9zZXJ2ZXJkb3duX2NvbXBsZXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKK3N0YXRpYyBzc2l6ZV90IGluZm9fcHJvY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpOworc3RhdGljIHNzaXplX3QgcnF3dV9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBzc2l6ZV90IGVuYWJsZV9pbnRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHNzaXplX3QgZW5hYmxlX2ludHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogR2xvYmFscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHJzbHRxX3dhaXRfdXNlY3MgPSA0MDAwOwkvKiBEZWZhdWx0IDRtcyAqLworc3RhdGljIHVuc2lnbmVkIGludCBNYXhCdWZmTGVuOworCisvKiBNb2R1bGUgb3B0aW9ucyAqLworc3RhdGljIGNoYXIgKnZpcnRoYmFfb3B0aW9ucyA9ICJOT05FIjsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZpcnRoYmFfaWRfdGFibGVbXSA9IHsKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1VOSVNZUywgUENJX0RFVklDRV9JRF9WSVJUSEJBKX0sCisJezB9LAorfTsKKworLyogZXhwb3J0IHZpcnRoYmFfaWRfdGFibGUgKi8KK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB2aXJ0aGJhX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp2aXJ0aGJhX3NlcnZlcmRvd25fd29ya3F1ZXVlOworCitzdGF0aWMgc3RydWN0IHZpcnRwY2lfZHJpdmVyIHZpcnRoYmFfZHJpdmVyID0geworCS5uYW1lID0gInVpc3ZpcnRoYmEiLAorCS52ZXJzaW9uID0gVkVSU0lPTiwKKwkudmVydGFnID0gTlVMTCwKKwkuYnVpbGRfZGF0ZSA9IF9fREFURV9fLAorCS5idWlsZF90aW1lID0gX19USU1FX18sCisJLmlkX3RhYmxlID0gdmlydGhiYV9pZF90YWJsZSwKKwkucHJvYmUgPSB2aXJ0aGJhX3Byb2JlLAorCS5yZW1vdmUgPSB2aXJ0aGJhX3JlbW92ZSwKKwkucmVzdW1lID0gdmlydGhiYV9zZXJ2ZXJ1cCwKKwkuc3VzcGVuZCA9IHZpcnRoYmFfc2VydmVyZG93bgorfTsKKworLyogVGhlIFNlbmQgYW5kIFJlY2l2ZSBCdWZmZXJzIG9mIHRoZSBJTyBRdWV1ZSBtYXkgYm90aCBiZSBmdWxsICovCisjZGVmaW5lIE1BWF9QRU5ESU5HX1JFUVVFU1RTIChNSU5fTlVNU0lHTkFMUyoyKQorI2RlZmluZSBJTlRFUlJVUFRfVkVDVE9SX01BU0sgMHgzRgorCitzdHJ1Y3Qgc2NzaXBlbmRpbmcgeworCWNoYXIgY21kdHlwZTsJCS8qIFR5cGUgb2YgcG9pbnRlciB0aGF0IGlzIGJlaW5nIHN0b3JlZCAqLworCXZvaWQgKnNlbnQ7CQkvKiBUaGUgRGF0YSBiZWluZyB0cmFja2VkICovCisJLyogc3RydWN0IHNjc2lfY21uZCAqdHlwZSBmb3IgdmlydGhiYV9xdWV1ZV9jb21tYW5kICovCisJLyogc3RydWN0IHVpc2NtZHJzcCAqdHlwZSBmb3IgbWFuYWdlbWVudCBjb21tYW5kcyAqLworfTsKKworI2RlZmluZSBWSVJUSEJBX0VSUk9SX0NPVU5UIDMwCisjZGVmaW5lIElPU19FUlJPUl9USFJFU0hPTEQgMTAwMAorc3RydWN0IHZpcnRkaXNrX2luZm8geworCVUzMiB2YWxpZDsKKwlVMzIgY2hhbm5lbCwgaWQsIGx1bjsJLyogRGlzayBQYXRoICovCisJYXRvbWljX3QgaW9zX3RocmVzaG9sZDsKKwlhdG9taWNfdCBlcnJvcl9jb3VudDsKKwlzdHJ1Y3QgdmlydGRpc2tfaW5mbyAqbmV4dDsKK307CisvKiBFYWNoIFNjc2lfSG9zdCBoYXMgYSBob3N0X2RhdGEgYXJlYSB0aGF0IGNvbnRhaW5zIHRoaXMgc3RydWN0LiAqLworc3RydWN0IHZpcnRoYmFfaW5mbyB7CisJc3RydWN0IFNjc2lfSG9zdCAqc2NzaWhvc3Q7CisJc3RydWN0IHZpcnRwY2lfZGV2ICp2aXJ0cGNpZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgZGV2X2luZm9fbGlzdDsKKwlzdHJ1Y3QgY2hhbmluZm8gY2hpbmZvOworCXN0cnVjdCBJbnRlcnJ1cHRJbmZvIGludHI7CS8qIHVzZSByZWN2SW50ZXJydXB0IGluZm8gdG8gcmVjZWl2ZQorCQkJCQkgICBpbnRlcnJ1cHRzIHdoZW4gSU9zIGNvbXBsZXRlICovCisJaW50IGludGVycnVwdF92ZWN0b3I7CisJc3RydWN0IHNjc2lwZW5kaW5nIHBlbmRpbmdbTUFYX1BFTkRJTkdfUkVRVUVTVFNdOyAvKiBUcmFja3MgdGhlIHJlcXVlc3RzCisJCQkJCQkJICAgICB0aGF0IGhhdmUgYmVlbiAqLworCS8qIGZvcndhcmRlZCB0byB0aGUgSU9WTSBhbmQgaGF2ZW4ndCByZXR1cm5lZCB5ZXQgKi8KKwl1bnNpZ25lZCBpbnQgbmV4dGluc2VydDsJLyogU3RhcnQgc2VhcmNoIGZvciBuZXh0IHBlbmRpbmcKKwkJCQkJICAgZnJlZSBzbG90IGhlcmUgKi8KKwlzcGlubG9ja190IHByaXZsb2NrOworCWJvb2wgc2VydmVyZG93bjsKKwlib29sIHNlcnZlcmNoYW5naW5nc3RhdGU7CisJdW5zaWduZWQgbG9uZyBsb25nIGFjcXVpcmVfZmFpbGVkX2NudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgaW50ZXJydXB0c19yY3ZkOworCXVuc2lnbmVkIGxvbmcgbG9uZyBpbnRlcnJ1cHRzX25vdG1lOworCXVuc2lnbmVkIGxvbmcgbG9uZyBpbnRlcnJ1cHRzX2Rpc2FibGVkOworCXN0cnVjdCB3b3JrX3N0cnVjdCBzZXJ2ZXJkb3duX2NvbXBsZXRpb247CisJVTY0IF9faW9tZW0gKmZsYWdzX2FkZHI7CisJYXRvbWljX3QgaW50ZXJydXB0X3JjdmQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcnNwX3F1ZXVlOworCXN0cnVjdCB2aXJ0ZGlza19pbmZvIGhlYWQ7Cit9OworCisvKiBXb3JrIERhdGEgZm9yIERBUldvcmtRICovCitzdHJ1Y3QgZGlza2FkZHJlbW92ZSB7CisJVTggYWRkOwkJCS8qIDAtcmVtb3ZlLCAxLWFkZCAqLworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OyAvKiBTY3NpIEhvc3QgZm9yIHRoaXMgdmlydGhiYSBpbnN0YW5jZSAqLworCVUzMiBjaGFubmVsLCBpZCwgbHVuOwkvKiBEaXNrIFBhdGggKi8KKwlzdHJ1Y3QgZGlza2FkZHJlbW92ZSAqbmV4dDsKK307CisKKyNkZWZpbmUgdmlydHBjaV9kZXZfdG9fdmlydGhiYV92aXJ0aGJhX2dldF9pbmZvKGQpIFwKKwljb250YWluZXJfb2YoZCwgc3RydWN0IHZpcnRoYmFfaW5mbywgdmlydHBjaWRldikKKworc3RhdGljIERFVklDRV9BVFRSSUJVVEUgKnZpcnRoYmFfc2hvc3RfYXR0cnNbXTsKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHZpcnRoYmFfZHJpdmVyX3RlbXBsYXRlID0geworCS5uYW1lID0gIlVuaXN5cyBWaXJ0dWFsIEhCQSIsCisJLnByb2NfbmFtZSA9ICJ1aXN2aXJ0aGJhIiwKKwkuaW5mbyA9IHZpcnRoYmFfZ2V0X2luZm8sCisJLmlvY3RsID0gdmlydGhiYV9pb2N0bCwKKwkucXVldWVjb21tYW5kID0gdmlydGhiYV9xdWV1ZV9jb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyID0gdmlydGhiYV9hYm9ydF9oYW5kbGVyLAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9IHZpcnRoYmFfZGV2aWNlX3Jlc2V0X2hhbmRsZXIsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyID0gdmlydGhiYV9idXNfcmVzZXRfaGFuZGxlciwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyID0gdmlydGhiYV9ob3N0X3Jlc2V0X2hhbmRsZXIsCisJLnNob3N0X2F0dHJzID0gdmlydGhiYV9zaG9zdF9hdHRycywKKworI2RlZmluZSBWSVJUSEJBX01BWF9DTU5EUyAxMjgKKwkuY2FuX3F1ZXVlID0gVklSVEhCQV9NQVhfQ01ORFMsCisJLnNnX3RhYmxlc2l6ZSA9IDY0LAkvKiBsYXJnZXN0IG51bWJlciBvZiBhZGRyZXNzL2xlbmd0aCBwYWlycyAqLworCS50aGlzX2lkID0gLTEsCisJLnNsYXZlX2FsbG9jID0gdmlydGhiYV9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfY29uZmlndXJlID0gdmlydGhiYV9zbGF2ZV9jb25maWd1cmUsCisJLnNsYXZlX2Rlc3Ryb3kgPSB2aXJ0aGJhX3NsYXZlX2Rlc3Ryb3ksCisJLnVzZV9jbHVzdGVyaW5nID0gRU5BQkxFX0NMVVNURVJJTkcsCit9OworCitzdHJ1Y3QgdmlydGhiYV9kZXZpY2VzX29wZW4geworCXN0cnVjdCB2aXJ0aGJhX2luZm8gKnZpcnRoYmFpbmZvOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19pbmZvX2ZvcHMgPSB7CisJLnJlYWQgPSBpbmZvX3Byb2NfcmVhZCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfcnF3dV9mb3BzID0geworCS53cml0ZSA9IHJxd3VfcHJvY193cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfZW5hYmxlX2ludHNfZm9wcyA9IHsKKwkucmVhZCA9IGVuYWJsZV9pbnRzX3JlYWQsCisJLndyaXRlID0gZW5hYmxlX2ludHNfd3JpdGUsCit9OworCisKKyNkZWZpbmUgVklSVEhCQVNPUEVOTUFYIDEKKy8qIGFycmF5IG9mIG9wZW4gZGV2aWNlcyBtYWludGFpbmVkIGJ5IG9wZW4oKSBhbmQgY2xvc2UoKTsgKi8KK3N0YXRpYyBzdHJ1Y3QgdmlydGhiYV9kZXZpY2VzX29wZW4gVmlydEhiYXNPcGVuW1ZJUlRIQkFTT1BFTk1BWF07CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp2aXJ0aGJhX3Byb2NfZGlyOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaW5mb19wcm9jX2VudHJ5Oworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcnF3YWl0dXNfcHJvY19lbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVuYWJsZV9pbnRzX3Byb2NfZW50cnk7CisjZGVmaW5lIElORk9fUFJPQ19FTlRSWV9GTiAiaW5mbyIKKyNkZWZpbmUgRU5BQkxFX0lOVFNfRU5UUllfRk4gImVuYWJsZV9pbnRzIgorI2RlZmluZSBSUVdVX1BST0NfRU5UUllfRk4gInJxd2FpdF91c2VjcyIKKyNkZWZpbmUgRElSX1BST0NfRU5UUlkgInZpcnRoYmEiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIExvY2FsIEZ1bmN0aW9ucwkJCQkgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithZGRfc2NzaXBlbmRpbmdfZW50cnkoc3RydWN0IHZpcnRoYmFfaW5mbyAqdmhiYWluZm8sIGNoYXIgY21kdHlwZSwgdm9pZCAqbmV3KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGluc2VydF9sb2NhdGlvbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aGJhaW5mby0+cHJpdmxvY2ssIGZsYWdzKTsKKwlpbnNlcnRfbG9jYXRpb24gPSB2aGJhaW5mby0+bmV4dGluc2VydDsKKwl3aGlsZSAodmhiYWluZm8tPnBlbmRpbmdbaW5zZXJ0X2xvY2F0aW9uXS5zZW50ICE9IE5VTEwpIHsKKwkJaW5zZXJ0X2xvY2F0aW9uID0gKGluc2VydF9sb2NhdGlvbiArIDEpICUgTUFYX1BFTkRJTkdfUkVRVUVTVFM7CisJCWlmIChpbnNlcnRfbG9jYXRpb24gPT0gKGludCkgdmhiYWluZm8tPm5leHRpbnNlcnQpIHsKKwkJCUxPR0VSUigiUXVldWUgc2hvdWxkIGJlIGZ1bGwuIGluc2VydF9sb2NhdGlvbjw8JWQ+PiAgVW5hYmxlIHRvIGZpbmQgb3BlbiBzbG90IGZvciBwZW5kaW5nIGNvbW1hbmRzLlxuIiwKKwkJCSAgICAgaW5zZXJ0X2xvY2F0aW9uKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoYmFpbmZvLT5wcml2bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJdmhiYWluZm8tPnBlbmRpbmdbaW5zZXJ0X2xvY2F0aW9uXS5jbWR0eXBlID0gY21kdHlwZTsKKwl2aGJhaW5mby0+cGVuZGluZ1tpbnNlcnRfbG9jYXRpb25dLnNlbnQgPSBuZXc7CisJdmhiYWluZm8tPm5leHRpbnNlcnQgPSAoaW5zZXJ0X2xvY2F0aW9uICsgMSkgJSBNQVhfUEVORElOR19SRVFVRVNUUzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGJhaW5mby0+cHJpdmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBpbnNlcnRfbG9jYXRpb247Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2FkZF9zY3NpcGVuZGluZ19lbnRyeV93aXRoX3dhaXQoc3RydWN0IHZpcnRoYmFfaW5mbyAqdmhiYWluZm8sIGNoYXIgY21kdHlwZSwKKwkJCQl2b2lkICpuZXcpCit7CisJaW50IGluc2VydF9sb2NhdGlvbiA9IGFkZF9zY3NpcGVuZGluZ19lbnRyeSh2aGJhaW5mbywgY21kdHlwZSwgbmV3KTsKKworCXdoaWxlIChpbnNlcnRfbG9jYXRpb24gPT0gLTEpIHsKKwkJTE9HRVJSKCJGYWlsZWQgdG8gZmluZCBlbXB0eSBxdWV1ZSBzbG90LiAgV2FpdGluZyB0byB0cnkgYWdhaW5cbiIpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKKwkJaW5zZXJ0X2xvY2F0aW9uID0gYWRkX3Njc2lwZW5kaW5nX2VudHJ5KHZoYmFpbmZvLCBjbWR0eXBlLCBuZXcpOworCX0KKworCXJldHVybiAodW5zaWduZWQgaW50KSBpbnNlcnRfbG9jYXRpb247Cit9CisKK3N0YXRpYyB2b2lkICoKK2RlbF9zY3NpcGVuZGluZ19lbnRyeShzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aGJhaW5mbywgdWludHB0cl90IGRlbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgKnNlbnQgPSBOVUxMOworCisJaWYgKGRlbCA+PSBNQVhfUEVORElOR19SRVFVRVNUUykgeworCQlMT0dFUlIoIkludmFsaWQgcXVldWUgcG9zaXRpb24gPDwlbHU+PiBnaXZlbiB0byBkZWxldGUuIE1BWF9QRU5ESU5HX1JFUVVFU1RTIDw8JWQ+PlxuIiwKKwkJICAgICAodW5zaWduZWQgbG9uZykgZGVsLCBNQVhfUEVORElOR19SRVFVRVNUUyk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnZoYmFpbmZvLT5wcml2bG9jaywgZmxhZ3MpOworCisJCWlmICh2aGJhaW5mby0+cGVuZGluZ1tkZWxdLnNlbnQgPT0gTlVMTCkKKwkJCUxPR0VSUigiRGVsZXRpbmcgYWxyZWFkeSBjbGVhcmVkIHF1ZXVlIGVudHJ5IGF0IDw8JWx1Pj4uXG4iLAorCQkJICAgICAodW5zaWduZWQgbG9uZykgZGVsKTsKKworCQlzZW50ID0gdmhiYWluZm8tPnBlbmRpbmdbZGVsXS5zZW50OworCisJCXZoYmFpbmZvLT5wZW5kaW5nW2RlbF0uY21kdHlwZSA9IDA7CisJCXZoYmFpbmZvLT5wZW5kaW5nW2RlbF0uc2VudCA9IE5VTEw7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoYmFpbmZvLT5wcml2bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiBzZW50OworfQorCisvKiBEQVJXb3JrUSAoRGlzayBBZGQvUmVtb3ZlKSAqLworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBEQVJXb3JrUTsKK3N0YXRpYyBzdHJ1Y3QgZGlza2FkZHJlbW92ZSAqREFSV29ya1FIZWFkOworc3RhdGljIHNwaW5sb2NrX3QgREFSV29ya1FMb2NrOworc3RhdGljIHVuc2lnbmVkIHNob3J0IERBUldvcmtRU2NoZWQ7CisjZGVmaW5lIFFVRVVFX0RJU0tBRERSRU1PVkUoZGFyKSB7IFwKKwlzcGluX2xvY2tfaXJxc2F2ZSgmREFSV29ya1FMb2NrLCBmbGFncyk7IFwKKwlpZiAoIURBUldvcmtRSGVhZCkgeyBcCisJCURBUldvcmtRSGVhZCA9IGRhcjsgXAorCQlkYXItPm5leHQgPSBOVUxMOyBcCisJfSBcCisJZWxzZSB7IFwKKwkJZGFyLT5uZXh0ID0gREFSV29ya1FIZWFkOyBcCisJCURBUldvcmtRSGVhZCA9IGRhcjsgXAorCX0gXAorCWlmICghREFSV29ya1FTY2hlZCkgeyBcCisJCXNjaGVkdWxlX3dvcmsoJkRBUldvcmtRKTsgXAorCQlEQVJXb3JrUVNjaGVkID0gMTsgXAorCX0gXAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkRBUldvcmtRTG9jaywgZmxhZ3MpOyBcCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorU2VuZERpc2tBZGRSZW1vdmUoc3RydWN0IGRpc2thZGRyZW1vdmUgKmRhcikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJaW50IGVycm9yOworCisJc2RldiA9IHNjc2lfZGV2aWNlX2xvb2t1cChkYXItPnNob3N0LCBkYXItPmNoYW5uZWwsIGRhci0+aWQsIGRhci0+bHVuKTsKKwlpZiAoc2RldikgeworCQlpZiAoIShkYXItPmFkZCkpCisJCQlzY3NpX3JlbW92ZV9kZXZpY2Uoc2Rldik7CisJfSBlbHNlIGlmIChkYXItPmFkZCkgeworCQllcnJvciA9CisJCSAgICBzY3NpX2FkZF9kZXZpY2UoZGFyLT5zaG9zdCwgZGFyLT5jaGFubmVsLCBkYXItPmlkLAorCQkJCSAgICBkYXItPmx1bik7CisJCWlmIChlcnJvcikKKwkJCUxPR0VSUigiRmFpbGVkIHNjc2lfYWRkX2RldmljZTogaG9zdF9ubz0lZFtjaGFuPSVkOmlkPSVkOmx1bj0lZF1cbiIsCisJCQkgICAgIGRhci0+c2hvc3QtPmhvc3Rfbm8sIGRhci0+Y2hhbm5lbCwgZGFyLT5pZCwKKwkJCSAgICAgZGFyLT5sdW4pOworCX0gZWxzZQorCQlMT0dFUlIoIkZhaWxlZCBzY3NpX2RldmljZV9sb29rdXA6W2NoYW49JWQ6aWQ9JWQ6bHVuPSVkXVxuIiwKKwkJICAgICAgIGRhci0+Y2hhbm5lbCwgZGFyLT5pZCwgZGFyLT5sdW4pOworCWtmcmVlKGRhcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERBUldvcmtRIEhhbmRsZXIgVGhyZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitkb0Rpc2tBZGRSZW1vdmUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkaXNrYWRkcmVtb3ZlICpkYXI7CisJc3RydWN0IGRpc2thZGRyZW1vdmUgKnRtcGhlYWQ7CisJaW50IGkgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmREFSV29ya1FMb2NrLCBmbGFncyk7CisJdG1waGVhZCA9IERBUldvcmtRSGVhZDsKKwlEQVJXb3JrUUhlYWQgPSBOVUxMOworCURBUldvcmtRU2NoZWQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkRBUldvcmtRTG9jaywgZmxhZ3MpOworCXdoaWxlICh0bXBoZWFkKSB7CisJCWRhciA9IHRtcGhlYWQ7CisJCXRtcGhlYWQgPSBkYXItPm5leHQ7CisJCVNlbmREaXNrQWRkUmVtb3ZlKGRhcik7CisJCWkrKzsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJvdXRpbmUgdG8gYWRkIGVudHJ5IHRvIERBUldvcmtRICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitwcm9jZXNzX2Rpc2tfbm90aWZ5KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzdHJ1Y3QgdWlzY21kcnNwICpjbWRyc3ApCit7CisJc3RydWN0IGRpc2thZGRyZW1vdmUgKmRhcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGFyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRpc2thZGRyZW1vdmUpLCBHRlBfQVRPTUlDKTsKKwlpZiAoZGFyKSB7CisJCWRhci0+YWRkID0gY21kcnNwLT5kaXNrbm90aWZ5LmFkZDsKKwkJZGFyLT5zaG9zdCA9IHNob3N0OworCQlkYXItPmNoYW5uZWwgPSBjbWRyc3AtPmRpc2tub3RpZnkuY2hhbm5lbDsKKwkJZGFyLT5pZCA9IGNtZHJzcC0+ZGlza25vdGlmeS5pZDsKKwkJZGFyLT5sdW4gPSBjbWRyc3AtPmRpc2tub3RpZnkubHVuOworCQlRVUVVRV9ESVNLQUREUkVNT1ZFKGRhcik7CisJfSBlbHNlIHsKKwkJTE9HRVJSKCJrbWFsbG9jIGZhaWxlZCBmb3IgZGFyLiBob3N0X25vPSVkW2NoYW49JWQ6aWQ9JWQ6bHVuPSVkXVxuIiwKKwkJICAgICBzaG9zdC0+aG9zdF9ubywgY21kcnNwLT5kaXNrbm90aWZ5LmNoYW5uZWwsCisJCSAgICAgY21kcnNwLT5kaXNrbm90aWZ5LmlkLCBjbWRyc3AtPmRpc2tub3RpZnkubHVuKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFByb2JlIFJlbW92ZSBGdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAordmlydGhiYV9JU1IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCB2aXJ0aGJhX2luZm8gKnZpcnRoYmFpbmZvID0gKHN0cnVjdCB2aXJ0aGJhX2luZm8gKikgZGV2X2lkOworCUNIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsSGVhZGVyOworCVNJR05BTF9RVUVVRV9IRUFERVIgX19pb21lbSAqcHFoZHI7CisJVTY0IG1hc2s7CisJdW5zaWduZWQgbG9uZyBsb25nIHJjMTsKKworCWlmICh2aXJ0aGJhaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gSVJRX05PTkU7CisJdmlydGhiYWluZm8tPmludGVycnVwdHNfcmN2ZCsrOworCXBDaGFubmVsSGVhZGVyID0gdmlydGhiYWluZm8tPmNoaW5mby5xdWV1ZWluZm8tPmNoYW47CisJaWYgKCgocmVhZHEoJnBDaGFubmVsSGVhZGVyLT5GZWF0dXJlcykKKwkgICAgICAmIFVMVFJBX0lPX0lPVk1fSVNfT0tfV0lUSF9EUklWRVJfRElTQUJMSU5HX0lOVFMpICE9IDApCisJICAgICYmICgocmVhZHEoJnBDaGFubmVsSGVhZGVyLT5GZWF0dXJlcykgJgorCQkgVUxUUkFfSU9fRFJJVkVSX0RJU0FCTEVTX0lOVFMpICE9CisJCTApKSB7CisJCXZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRzX2Rpc2FibGVkKys7CisJCW1hc2sgPSB+VUxUUkFfQ0hBTk5FTF9FTkFCTEVfSU5UUzsKKwkJcmMxID0gdWlzcXVldWVfSW50ZXJsb2NrZWRBbmQodmlydGhiYWluZm8tPmZsYWdzX2FkZHIsIG1hc2spOworCX0KKwlpZiAodmlzb3Jfc2lnbmFscXVldWVfZW1wdHkocENoYW5uZWxIZWFkZXIsIElPQ0hBTl9GUk9NX0lPUEFSVCkpIHsKKwkJdmlydGhiYWluZm8tPmludGVycnVwdHNfbm90bWUrKzsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwlwcWhkciA9IChTSUdOQUxfUVVFVUVfSEVBREVSIF9faW9tZW0gKikKKwkJKChjaGFyIF9faW9tZW0gKikgcENoYW5uZWxIZWFkZXIgKworCQkgcmVhZHEoJnBDaGFubmVsSGVhZGVyLT5vQ2hhbm5lbFNwYWNlKSkgKyBJT0NIQU5fRlJPTV9JT1BBUlQ7CisJd3JpdGVxKHJlYWRxKCZwcWhkci0+TnVtSW50ZXJydXB0c1JlY2VpdmVkKSArIDEsCisJICAgICAgICZwcWhkci0+TnVtSW50ZXJydXB0c1JlY2VpdmVkKTsKKwlhdG9taWNfc2V0KCZ2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3JjdmQsIDEpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdmlydGhiYWluZm8tPnJzcF9xdWV1ZSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50Cit2aXJ0aGJhX3Byb2JlKHN0cnVjdCB2aXJ0cGNpX2RldiAqdmlydHBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpaG9zdDsKKwlzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aXJ0aGJhaW5mbzsKKwlpbnQgcnNwOworCWludCBpOworCWlycV9oYW5kbGVyX3QgaGFuZGxlciA9IHZpcnRoYmFfSVNSOworCUNIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsSGVhZGVyOworCVNJR05BTF9RVUVVRV9IRUFERVIgX19pb21lbSAqcHFoZHI7CisJVTY0IG1hc2s7CisKKwlMT0dWRVIoImVudGVyaW5nIHZpcnRoYmFfcHJvYmUuLi5cbiIpOworCUxPR1ZFUigidmlydHBjaWRldiBidXNObzw8JWQ+PmRldk5vPDwlZD4+IiwgdmlydHBjaWRldi0+YnVzTm8sCisJICAgICAgIHZpcnRwY2lkZXYtPmRldmljZU5vKTsKKworCUxPR0lORigiZW50ZXJpbmcgdmlydGhiYV9wcm9iZS4uLlxuIik7CisJTE9HSU5GKCJ2aXJ0cGNpZGV2IGJ1c05vPDwlZD4+ZGV2Tm88PCVkPj4iLCB2aXJ0cGNpZGV2LT5idXNObywKKwkgICAgICAgdmlydHBjaWRldi0+ZGV2aWNlTm8pOworCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9QUk9CRV9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJLyogY2FsbCBzY3NpX2hvc3RfYWxsb2MgdG8gcmVnaXN0ZXIgYSBzY3NpIGhvc3QgYWRhcHRlcgorCSAqIGluc3RhbmNlIC0gdGhpcyB2aXJ0aGJhIHRoYXQgaGFzIGp1c3QgYmVlbiBjcmVhdGVkIGlzIGFuCisJICogaW5zdGFuY2Ugb2YgYSBzY3NpIGhvc3QgYWRhcHRlci4gVGhpcyBzY3NpX2hvc3RfYWxsb2MKKwkgKiBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBuZXcgU2NzaV9Ib3N0IHN0cnVjdCAmIHBlcmZvcm1zIGJhc2ljCisJICogaW5pdGlhbGl6YXRvaW4uICBUaGUgaG9zdCBpcyBub3QgcHVibGlzaGVkIHRvIHRoZSBzY3NpCisJICogbWlkbGF5ZXIgdW50aWwgc2NzaV9hZGRfaG9zdCBpcyBjYWxsZWQuCisJICovCisJREJHSU5GKCJjYWxsaW5nIHNjc2lfaG9zdF9hbGxvYy5cbiIpOworCisJLyogYXJnIDIgcGFzc2VkIGluIGxlbmd0aCBvZiBleHRyYSBzcGFjZSB3ZSB3YW50IGFsbG9jYXRlZAorCSAqIHdpdGggc2NzaV9ob3N0IHN0cnVjdCBmb3Igb3VyIG93biB1c2Ugc2NzaV9ob3N0X2FsbG9jCisJICogYXNzaWduIGhvc3Rfbm8KKwkgKi8KKwlzY3NpaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmdmlydGhiYV9kcml2ZXJfdGVtcGxhdGUsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCB2aXJ0aGJhX2luZm8pKTsKKwlpZiAoc2NzaWhvc3QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlEQkdJTkYoInNjc2lob3N0OiAweCVwLCBzY3NpaG9zdC0+dGhpc19pZDogJWQsIGhvc3Rfbm86ICVkLlxuIiwKKwkgICAgICAgc2NzaWhvc3QsIHNjc2lob3N0LT50aGlzX2lkLCBzY3NpaG9zdC0+aG9zdF9ubyk7CisKKwlzY3NpaG9zdC0+dGhpc19pZCA9IFVJU19NQUdJQ19WSEJBOworCS8qIGxpbnV4IHRyZWF0cyBtYXgtY2hhbm5lbCBkaWZmZXJlbnRseSB0aGFuIG1heC1pZCAmIG1heC1sdW4uCisJICogSW4gdGhlIGxhdHRlciBjYXNlcywgdGhvc2UgdHdvIHZhbHVlcyByZXN1bHQgaW4gMCB0byBtYXgtMQorCSAqIChpbmNsdXNpdmUpIGJlaW5nIHNjYW5uZWQuIEJ1dCBpbiB0aGUgY2FzZSBvZiBjaGFubmVscywgdGhlCisJICogc2NhbiBpcyAwIHRvIG1heCAoaW5jbHVzaXZlKTsgc28gd2Ugd2lsbCBzdWJ0cmFjdCBvbmUgZnJvbQorCSAqIHRoZSBtYXgtY2hhbm5lbCB2YWx1ZS4KKwkgKi8KKwlMT0dJTkYoInZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9jaGFubmVsPSV1LCBtYXhfaWQ9JXUsIG1heF9sdW49JXUsIGNtZF9wZXJfbHVuPSV1LCBtYXhfaW9fc2l6ZT0ldVxuIiwKKwkgICAgICh1bnNpZ25lZCkgdmlydHBjaWRldi0+c2NzaS5tYXgubWF4X2NoYW5uZWwgLSAxLAorCSAgICAgKHVuc2lnbmVkKSB2aXJ0cGNpZGV2LT5zY3NpLm1heC5tYXhfaWQsCisJICAgICAodW5zaWduZWQpIHZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9sdW4sCisJICAgICAodW5zaWduZWQpIHZpcnRwY2lkZXYtPnNjc2kubWF4LmNtZF9wZXJfbHVuLAorCSAgICAgKHVuc2lnbmVkKSB2aXJ0cGNpZGV2LT5zY3NpLm1heC5tYXhfaW9fc2l6ZSk7CisJc2NzaWhvc3QtPm1heF9jaGFubmVsID0gKHVuc2lnbmVkKSB2aXJ0cGNpZGV2LT5zY3NpLm1heC5tYXhfY2hhbm5lbDsKKwlzY3NpaG9zdC0+bWF4X2lkID0gKHVuc2lnbmVkKSB2aXJ0cGNpZGV2LT5zY3NpLm1heC5tYXhfaWQ7CisJc2NzaWhvc3QtPm1heF9sdW4gPSAodW5zaWduZWQpIHZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9sdW47CisJc2NzaWhvc3QtPmNtZF9wZXJfbHVuID0gKHVuc2lnbmVkKSB2aXJ0cGNpZGV2LT5zY3NpLm1heC5jbWRfcGVyX2x1bjsKKwlzY3NpaG9zdC0+bWF4X3NlY3RvcnMgPQorCSAgICAodW5zaWduZWQgc2hvcnQpICh2aXJ0cGNpZGV2LT5zY3NpLm1heC5tYXhfaW9fc2l6ZSA+PiA5KTsKKwlzY3NpaG9zdC0+c2dfdGFibGVzaXplID0KKwkgICAgKHVuc2lnbmVkIHNob3J0KSAodmlydHBjaWRldi0+c2NzaS5tYXgubWF4X2lvX3NpemUgLyBQQUdFX1NJWkUpOworCWlmIChzY3NpaG9zdC0+c2dfdGFibGVzaXplID4gTUFYX1BIWVNfSU5GTykKKwkJc2NzaWhvc3QtPnNnX3RhYmxlc2l6ZSA9IE1BWF9QSFlTX0lORk87CisJTE9HSU5GKCJzY3NpaG9zdC0+bWF4X2NoYW5uZWw9JXUsIG1heF9pZD0ldSwgbWF4X2x1bj0ldSwgY21kX3Blcl9sdW49JXUsIG1heF9zZWN0b3JzPSVodSwgc2dfdGFibGVzaXplPSVodVxuIiwKKwkgICAgIHNjc2lob3N0LT5tYXhfY2hhbm5lbCwgc2NzaWhvc3QtPm1heF9pZCwgc2NzaWhvc3QtPm1heF9sdW4sCisJICAgICBzY3NpaG9zdC0+Y21kX3Blcl9sdW4sIHNjc2lob3N0LT5tYXhfc2VjdG9ycywKKwkgICAgIHNjc2lob3N0LT5zZ190YWJsZXNpemUpOworCUxPR0lORigic2NzaWhvc3QtPmNhbl9xdWV1ZT0ldSwgc2NzaWhvc3QtPmNtZF9wZXJfbHVuPSV1LCBtYXhfc2VjdG9ycz0laHUsIHNnX3RhYmxlc2l6ZT0laHVcbiIsCisJICAgICBzY3NpaG9zdC0+Y2FuX3F1ZXVlLCBzY3NpaG9zdC0+Y21kX3Blcl9sdW4sIHNjc2lob3N0LT5tYXhfc2VjdG9ycywKKwkgICAgIHNjc2lob3N0LT5zZ190YWJsZXNpemUpOworCisJREJHSU5GKCJjYWxsaW5nIHNjc2lfYWRkX2hvc3RcbiIpOworCisJLyogdGhpcyBjcmVhdGVzICJob3N0JWQiIGluIHN5c2ZzLiAgSWYgMm5kIGFyZ3VtZW50IGlzIE5VTEwsCisJICogdGhlbiB0aGlzIGdlbmVyaWMgL3N5cy9kZXZpY2VzL3BsYXRmb3JtL2hvc3Q/ICBkZXZpY2UgaXMKKwkgKiBjcmVhdGVkIGFuZCAvc3lzL3Njc2lfaG9zdC9ob3N0PyAtPgorCSAqIC9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9ob3N0PyAgSWYgMm5kIGFyZ3VtZW50IGlzIG5vdCBOVUxMLAorCSAqIHRoZW4gdGhpcyBnZW5lcmljIC9zeXMvZGV2aWNlcy88cGF0aD4vaG9zdD8gaXMgY3JlYXRlZCBhbmQKKwkgKiBob3N0PyBwb2ludHMgdG8gdGhhdCBkZXZpY2UgaW5zdGVhZC4KKwkgKi8KKwllcnJvciA9IHNjc2lfYWRkX2hvc3Qoc2NzaWhvc3QsICZ2aXJ0cGNpZGV2LT5nZW5lcmljX2Rldik7CisJaWYgKGVycm9yKSB7CisJCUxPR0VSUigic2NzaV9hZGRfaG9zdCAqKioqRkFJTEVEIDB4JXggIFRCRCAtIFJFQ09WRVJcbiIsIGVycm9yKTsKKwkJUE9TVENPREVfTElOVVhfMihWSEJBX1BST0JFX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCS8qIGRlY3IgcmVmY291bnQgb24gc2NzaWhvc3Qgd2hpY2ggd2FzIGluY3JlbWVudGVkIGJ5CisJCSAqIHNjc2lfYWRkX2hvc3Qgc28gdGhlIHNjc2lfaG9zdCBnZXRzIGRlbGV0ZWQKKwkJICovCisJCXNjc2lfaG9zdF9wdXQoc2NzaWhvc3QpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl2aXJ0aGJhaW5mbyA9IChzdHJ1Y3QgdmlydGhiYV9pbmZvICopIHNjc2lob3N0LT5ob3N0ZGF0YTsKKwltZW1zZXQodmlydGhiYWluZm8sIDAsIHNpemVvZihzdHJ1Y3QgdmlydGhiYV9pbmZvKSk7CisJZm9yIChpID0gMDsgaSA8IFZJUlRIQkFTT1BFTk1BWDsgaSsrKSB7CisJCWlmIChWaXJ0SGJhc09wZW5baV0udmlydGhiYWluZm8gPT0gTlVMTCkgeworCQkJVmlydEhiYXNPcGVuW2ldLnZpcnRoYmFpbmZvID0gdmlydGhiYWluZm87CisJCQlicmVhazsKKwkJfQorCX0KKwl2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3ZlY3RvciA9IC0xOworCXZpcnRoYmFpbmZvLT5jaGluZm8ucXVldWVpbmZvID0gJnZpcnRwY2lkZXYtPnF1ZXVlaW5mbzsKKwl2aXJ0aGJhaW5mby0+dmlydHBjaWRldiA9IHZpcnRwY2lkZXY7CisJc3Bpbl9sb2NrX2luaXQoJnZpcnRoYmFpbmZvLT5jaGluZm8uaW5zZXJ0bG9jayk7CisKKwlEQkdJTkYoImdlbmVyaWNfZGV2OiAweCVwLCBxdWV1ZWluZm86IDB4JXAuXG4iLAorCSAgICAgICAmdmlydHBjaWRldi0+Z2VuZXJpY19kZXYsICZ2aXJ0cGNpZGV2LT5xdWV1ZWluZm8pOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmdmlydGhiYWluZm8tPnJzcF9xdWV1ZSk7CisJc3Bpbl9sb2NrX2luaXQoJnZpcnRoYmFpbmZvLT5wcml2bG9jayk7CisJbWVtc2V0KCZ2aXJ0aGJhaW5mby0+cGVuZGluZywgMCwgc2l6ZW9mKHZpcnRoYmFpbmZvLT5wZW5kaW5nKSk7CisJdmlydGhiYWluZm8tPnNlcnZlcmRvd24gPSBmYWxzZTsKKwl2aXJ0aGJhaW5mby0+c2VydmVyY2hhbmdpbmdzdGF0ZSA9IGZhbHNlOworCisJdmlydGhiYWluZm8tPmludHIgPSB2aXJ0cGNpZGV2LT5pbnRyOworCS8qIHNhdmUgb2YgaG9zdCB3aXRoaW4gdmlydGhiYV9pbmZvICovCisJdmlydGhiYWluZm8tPnNjc2lob3N0ID0gc2NzaWhvc3Q7CisKKwkvKiBzYXZlIG9mIGhvc3Qgd2l0aGluIHZpcnRwY2lfZGV2ICovCisJdmlydHBjaWRldi0+c2NzaS5zY3NpaG9zdCA9IHNjc2lob3N0OworCisJLyogU2V0dXAgd29ya3F1ZXVlIGZvciBzZXJ2ZXJkb3duIG1lc3NhZ2VzICovCisJSU5JVF9XT1JLKCZ2aXJ0aGJhaW5mby0+c2VydmVyZG93bl9jb21wbGV0aW9uLAorCQkgIHZpcnRoYmFfc2VydmVyZG93bl9jb21wbGV0ZSk7CisKKwl3cml0ZXEocmVhZHEoJnZpcnRoYmFpbmZvLT5jaGluZm8ucXVldWVpbmZvLT5jaGFuLT5GZWF0dXJlcykgfAorCSAgICAgICBVTFRSQV9JT19DSEFOTkVMX0lTX1BPTExJTkcsCisJICAgICAgICZ2aXJ0aGJhaW5mby0+Y2hpbmZvLnF1ZXVlaW5mby0+Y2hhbi0+RmVhdHVyZXMpOworCS8qIHN0YXJ0IHRocmVhZCB0aGF0IHdpbGwgcmVjZWl2ZSBzY3NpY21uZCByZXNwb25zZXMgKi8KKwlEQkdJTkYoInN0YXJ0aW5nIHJzcCB0aHJlYWQgLS0gcXVldWVpbmZvOiAweCVwLCB0aHJlYWRpbmZvOiAweCVwLlxuIiwKKwkgICAgICAgdmlydGhiYWluZm8tPmNoaW5mby5xdWV1ZWluZm8sICZ2aXJ0aGJhaW5mby0+Y2hpbmZvLnRocmVhZGluZm8pOworCisJcENoYW5uZWxIZWFkZXIgPSB2aXJ0aGJhaW5mby0+Y2hpbmZvLnF1ZXVlaW5mby0+Y2hhbjsKKwlwcWhkciA9IChTSUdOQUxfUVVFVUVfSEVBREVSIF9faW9tZW0gKikKKwkJKChjaGFyIF9faW9tZW0gKilwQ2hhbm5lbEhlYWRlciArCisJCSByZWFkcSgmcENoYW5uZWxIZWFkZXItPm9DaGFubmVsU3BhY2UpKSArIElPQ0hBTl9GUk9NX0lPUEFSVDsKKwl2aXJ0aGJhaW5mby0+ZmxhZ3NfYWRkciA9ICZwcWhkci0+RmVhdHVyZUZsYWdzOworCisJaWYgKCF1aXN0aHJlYWRfc3RhcnQoJnZpcnRoYmFpbmZvLT5jaGluZm8udGhyZWFkaW5mbywKKwkJCSAgICAgcHJvY2Vzc19pbmNvbWluZ19yc3BzLAorCQkJICAgICB2aXJ0aGJhaW5mbywgInZoYmFfaW5jb21pbmciKSkgeworCQlMT0dFUlIoInVpc3RocmVhZF9zdGFydCByc3AgKioqKkZBSUxFRFxuIik7CisJCS8qIGRlY3IgcmVmY291bnQgb24gc2NzaWhvc3Qgd2hpY2ggd2FzIGluY3JlbWVudGVkIGJ5CisJCSAqIHNjc2lfYWRkX2hvc3Qgc28gdGhlIHNjc2lfaG9zdCBnZXRzIGRlbGV0ZWQKKwkJICovCisJCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9QUk9CRV9GQUlMVVJFX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlzY3NpX2hvc3RfcHV0KHNjc2lob3N0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCUxPR0lORigic2VuZEludGVycnVwdEhhbmRsZT0weCUxNmxsWCIsCisJICAgICAgIHZpcnRoYmFpbmZvLT5pbnRyLnNlbmRJbnRlcnJ1cHRIYW5kbGUpOworCUxPR0lORigicmVjdkludGVycnVwdEhhbmRsZT0weCUxNmxsWCIsCisJICAgICAgIHZpcnRoYmFpbmZvLT5pbnRyLnJlY3ZJbnRlcnJ1cHRIYW5kbGUpOworCUxPR0lORigicmVjdkludGVycnVwdFZlY3Rvcj0weCU4WCIsCisJICAgICAgIHZpcnRoYmFpbmZvLT5pbnRyLnJlY3ZJbnRlcnJ1cHRWZWN0b3IpOworCUxPR0lORigicmVjdkludGVycnVwdFNoYXJlZD0weCUyWCIsCisJICAgICAgIHZpcnRoYmFpbmZvLT5pbnRyLnJlY3ZJbnRlcnJ1cHRTaGFyZWQpOworCUxPR0lORigic2NzaWhvc3QuaG9zdHQtPm5hbWU9JXMiLCBzY3NpaG9zdC0+aG9zdHQtPm5hbWUpOworCXZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfdmVjdG9yID0KKwkgICAgdmlydGhiYWluZm8tPmludHIucmVjdkludGVycnVwdEhhbmRsZSAmIElOVEVSUlVQVF9WRUNUT1JfTUFTSzsKKwlyc3AgPSByZXF1ZXN0X2lycSh2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3ZlY3RvciwgaGFuZGxlciwgSVJRRl9TSEFSRUQsCisJCQkgIHNjc2lob3N0LT5ob3N0dC0+bmFtZSwgdmlydGhiYWluZm8pOworCWlmIChyc3AgIT0gMCkgeworCQlMT0dFUlIoInJlcXVlc3RfaXJxKCVkKSB1aXNsaWJfdmlydGhiYV9JU1IgcmVxdWVzdCBmYWlsZWQgd2l0aCByc3A9JWRcbiIsCisJCSAgICAgICB2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3ZlY3RvciwgcnNwKTsKKwkJdmlydGhiYWluZm8tPmludGVycnVwdF92ZWN0b3IgPSAtMTsKKwkJUE9TVENPREVfTElOVVhfMihWSEJBX1BST0JFX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJfSBlbHNlIHsKKwkJVTY0IF9faW9tZW0gKkZlYXR1cmVzX2FkZHIgPQorCQkgICAgJnZpcnRoYmFpbmZvLT5jaGluZm8ucXVldWVpbmZvLT5jaGFuLT5GZWF0dXJlczsKKwkJTE9HRVJSKCJyZXF1ZXN0X2lycSglZCkgdWlzbGliX3ZpcnRoYmFfSVNSIHJlcXVlc3Qgc3VjY2VlZGVkXG4iLAorCQkgICAgICAgdmlydGhiYWluZm8tPmludGVycnVwdF92ZWN0b3IpOworCQltYXNrID0gfihVTFRSQV9JT19DSEFOTkVMX0lTX1BPTExJTkcgfAorCQkJIFVMVFJBX0lPX0RSSVZFUl9ESVNBQkxFU19JTlRTKTsKKwkJdWlzcXVldWVfSW50ZXJsb2NrZWRBbmQoRmVhdHVyZXNfYWRkciwgbWFzayk7CisJCW1hc2sgPSBVTFRSQV9JT19EUklWRVJfRU5BQkxFU19JTlRTOworCQl1aXNxdWV1ZV9JbnRlcmxvY2tlZE9yKEZlYXR1cmVzX2FkZHIsIG1hc2spOworCQlyc2x0cV93YWl0X3VzZWNzID0gNDAwMDAwMDsKKwl9CisKKwlEQkdJTkYoImNhbGxpbmcgc2NzaV9zY2FuX2hvc3QuXG4iKTsKKwlzY3NpX3NjYW5faG9zdChzY3NpaG9zdCk7CisJREJHSU5GKCJyZXR1cm4gZnJvbSBzY3NpX3NjYW5faG9zdC5cbiIpOworCisJTE9HSU5GKCJ2aXJ0aGJhIGFkZGVkIHNjc2lob3N0OjB4JXBcbiIsIHNjc2lob3N0KTsKKwlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfUFJPQkVfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit2aXJ0aGJhX3JlbW92ZShzdHJ1Y3QgdmlydHBjaV9kZXYgKnZpcnRwY2lkZXYpCit7CisJc3RydWN0IHZpcnRoYmFfaW5mbyAqdmlydGhiYWluZm87CisJc3RydWN0IFNjc2lfSG9zdCAqc2NzaWhvc3QgPQorCSAgICAoc3RydWN0IFNjc2lfSG9zdCAqKSB2aXJ0cGNpZGV2LT5zY3NpLnNjc2lob3N0OworCisJTE9HSU5GKCJ2aXJ0cGNpZGV2IGJ1c05vPDwlZD4+ZGV2Tm88PCVkPj4iLCB2aXJ0cGNpZGV2LT5idXNObywKKwkgICAgICAgdmlydHBjaWRldi0+ZGV2aWNlTm8pOworCXZpcnRoYmFpbmZvID0gKHN0cnVjdCB2aXJ0aGJhX2luZm8gKikgc2NzaWhvc3QtPmhvc3RkYXRhOworCWlmICh2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3ZlY3RvciAhPSAtMSkKKwkJZnJlZV9pcnEodmlydGhiYWluZm8tPmludGVycnVwdF92ZWN0b3IsIHZpcnRoYmFpbmZvKTsKKwlMT0dJTkYoIlJlbW92aW5nIHZpcnRwY2lkZXY6IDB4JXAsIHZpcnRoYmFpbmZvOiAweCVwXG4iLCB2aXJ0cGNpZGV2LAorCSAgICAgICB2aXJ0aGJhaW5mbyk7CisKKwlEQkdJTkYoInJlbW92aW5nIHNjc2lob3N0OiAweCVwLCBzY3NpaG9zdC0+dGhpc19pZDogJWRcbiIsIHNjc2lob3N0LAorCSAgICAgICBzY3NpaG9zdC0+dGhpc19pZCk7CisJc2NzaV9yZW1vdmVfaG9zdChzY3NpaG9zdCk7CisKKwlEQkdJTkYoInN0b3BwaW5nIHRocmVhZC5cbiIpOworCXVpc3RocmVhZF9zdG9wKCZ2aXJ0aGJhaW5mby0+Y2hpbmZvLnRocmVhZGluZm8pOworCisJREJHSU5GKCJjYWxsaW5nIHNjc2lfaG9zdF9wdXRcbiIpOworCisJLyogZGVjciByZWZjb3VudCBvbiBzY3NpaG9zdCB3aGljaCB3YXMgaW5jcmVtZW50ZWQgYnkKKwkgKiBzY3NpX2FkZF9ob3N0IHNvIHRoZSBzY3NpX2hvc3QgZ2V0cyBkZWxldGVkCisJICovCisJc2NzaV9ob3N0X3B1dChzY3NpaG9zdCk7CisJTE9HSU5GKCJ2aXJ0aGJhIHJlbW92ZWQgc2NzaV9ob3N0LlxuIik7Cit9CisKK3N0YXRpYyBpbnQKK2ZvcndhcmRfdmRpc2ttZ210X2NvbW1hbmQoVkRJU0tfTUdNVF9UWVBFUyB2ZGlza2NtZHR5cGUsCisJCQkgIHN0cnVjdCBTY3NpX0hvc3QgKnNjc2lob3N0LAorCQkJICBzdHJ1Y3QgdWlzc2NzaV9kZXN0ICp2ZGVzdCkKK3sKKwlzdHJ1Y3QgdWlzY21kcnNwICpjbWRyc3A7CisJc3RydWN0IHZpcnRoYmFfaW5mbyAqdmlydGhiYWluZm8gPQorCSAgICAoc3RydWN0IHZpcnRoYmFfaW5mbyAqKSBzY3NpaG9zdC0+aG9zdGRhdGE7CisJaW50IG5vdGlmeXJlc3VsdCA9IDB4ZmZmZjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBub3RpZnlldmVudDsKKworCUxPR0lORigidkRpc2tNZ210OiVkICVkOiVkOiVkXG4iLCB2ZGlza2NtZHR5cGUsCisJICAgICAgIHZkZXN0LT5jaGFubmVsLCB2ZGVzdC0+aWQsIHZkZXN0LT5sdW4pOworCisJaWYgKHZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duIHx8IHZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlKSB7CisJCURCR0lORigiU2VydmVyIGlzIGRvd24vY2hhbmdpbmcgc3RhdGUuIFJldHVybmluZyBGYWlsdXJlLlxuIik7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJY21kcnNwID0ga3phbGxvYyhTSVpFT0ZfQ01EUlNQLCBHRlBfQVRPTUlDKTsKKwlpZiAoY21kcnNwID09IE5VTEwpIHsKKwkJTE9HRVJSKCJrbWFsbG9jIG9mIGNtZHJzcCBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIEZBSUxFRDsJLyogcmVqZWN0ICovCisJfQorCisJaW5pdF93YWl0cXVldWVfaGVhZCgmbm90aWZ5ZXZlbnQpOworCisJLyogaXNzdWUgVkRJU0tfTUdNVF9DTUQKKwkgKiBzZXQgdHlwZSB0byBjb21tYW5kIC0gYXMgb3Bwb3NlZCB0byB0YXNrIG1nbXQKKwkgKi8KKwljbWRyc3AtPmNtZHR5cGUgPSBDTURfVkRJU0tNR01UX1RZUEU7CisJLyogc3BlY2lmeSB0aGUgZXZlbnQgdGhhdCBoYXMgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhpcyBjbWQgaXMKKwkgKiBjb21wbGV0ZQorCSAqLworCWNtZHJzcC0+dmRpc2ttZ210Lm5vdGlmeSA9ICh2b2lkICopICZub3RpZnlldmVudDsKKwljbWRyc3AtPnZkaXNrbWdtdC5ub3RpZnlyZXN1bHQgPSAodm9pZCAqKSAmbm90aWZ5cmVzdWx0OworCisJLyogc2F2ZSBkZXN0aW5hdGlvbiAqLworCWNtZHJzcC0+dmRpc2ttZ210LnZkaXNrdHlwZSA9IHZkaXNrY21kdHlwZTsKKwljbWRyc3AtPnZkaXNrbWdtdC52ZGVzdC5jaGFubmVsID0gdmRlc3QtPmNoYW5uZWw7CisJY21kcnNwLT52ZGlza21nbXQudmRlc3QuaWQgPSB2ZGVzdC0+aWQ7CisJY21kcnNwLT52ZGlza21nbXQudmRlc3QubHVuID0gdmRlc3QtPmx1bjsKKwljbWRyc3AtPnZkaXNrbWdtdC5zY3NpY21kID0KKwkgICAgKHZvaWQgKikgKHVpbnRwdHJfdCkKKwkJYWRkX3Njc2lwZW5kaW5nX2VudHJ5X3dpdGhfd2FpdCh2aXJ0aGJhaW5mbywgQ01EX1ZESVNLTUdNVF9UWVBFLAorCQkJCQkJKHZvaWQgKikgY21kcnNwKTsKKworCXVpc3F1ZXVlX3B1dF9jbWRyc3Bfd2l0aF9sb2NrX2NsaWVudCh2aXJ0aGJhaW5mby0+Y2hpbmZvLnF1ZXVlaW5mbywKKwkJCQkJICAgICBjbWRyc3AsIElPQ0hBTl9UT19JT1BBUlQsCisJCQkJCSAgICAgJnZpcnRoYmFpbmZvLT5jaGluZm8uaW5zZXJ0bG9jaywKKwkJCQkJICAgICBET05UX0lTU1VFX0lOVEVSUlVQVCwgKFU2NCkgTlVMTCwKKwkJCQkJICAgICBPS19UT19XQUlULCAidmhiYSIpOworCUxPR0lORigiVmRpc2tNZ210IHdhaXRpbmcgb24gZXZlbnQgbm90aWZ5ZXZlbnQ9MHglcFxuIiwKKwkgICAgICAgY21kcnNwLT5zY3NpdGFza21nbXQubm90aWZ5KTsKKwl3YWl0X2V2ZW50KG5vdGlmeWV2ZW50LCBub3RpZnlyZXN1bHQgIT0gMHhmZmZmKTsKKwlMT0dJTkYoIlZkaXNrTWdtdCBjb21wbGV0ZTsgcmVzdWx0OiVkXG4iLCBjbWRyc3AtPnZkaXNrbWdtdC5yZXN1bHQpOworCWtmcmVlKGNtZHJzcCk7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNjc2kgSG9zdCBzdXBwb3J0IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorZm9yd2FyZF90YXNrbWdtdF9jb21tYW5kKFRBU0tfTUdNVF9UWVBFUyB0YXNrdHlwZSwgc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2KQoreworCXN0cnVjdCB1aXNjbWRyc3AgKmNtZHJzcDsKKwlzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aXJ0aGJhaW5mbyA9CisJICAgIChzdHJ1Y3QgdmlydGhiYV9pbmZvICopIHNjc2lkZXYtPmhvc3QtPmhvc3RkYXRhOworCWludCBub3RpZnlyZXN1bHQgPSAweGZmZmY7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgbm90aWZ5ZXZlbnQ7CisKKwlMT0dJTkYoIlRhc2tNZ210OiVkICVkOiVkOiVkXG4iLCB0YXNrdHlwZSwKKwkgICAgICAgc2NzaWRldi0+Y2hhbm5lbCwgc2NzaWRldi0+aWQsIHNjc2lkZXYtPmx1bik7CisKKwlpZiAodmlydGhiYWluZm8tPnNlcnZlcmRvd24gfHwgdmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpIHsKKwkJREJHSU5GKCJTZXJ2ZXIgaXMgZG93bi9jaGFuZ2luZyBzdGF0ZS4gUmV0dXJuaW5nIEZhaWx1cmUuXG4iKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwljbWRyc3AgPSBremFsbG9jKFNJWkVPRl9DTURSU1AsIEdGUF9BVE9NSUMpOworCWlmIChjbWRyc3AgPT0gTlVMTCkgeworCQlMT0dFUlIoImttYWxsb2Mgb2YgY21kcnNwIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gRkFJTEVEOwkvKiByZWplY3QgKi8KKwl9CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZub3RpZnlldmVudCk7CisKKwkvKiBpc3N1ZSBUQVNLX01HTVRfQUJPUlRfVEFTSyAqLworCS8qIHNldCB0eXBlIHRvIGNvbW1hbmQgLSBhcyBvcHBvc2VkIHRvIHRhc2sgbWdtdCAqLworCWNtZHJzcC0+Y21kdHlwZSA9IENNRF9TQ1NJVEFTS01HTVRfVFlQRTsKKwkvKiBzcGVjaWZ5IHRoZSBldmVudCB0aGF0IGhhcyB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGlzICovCisJLyogY21kIGlzIGNvbXBsZXRlICovCisJY21kcnNwLT5zY3NpdGFza21nbXQubm90aWZ5ID0gKHZvaWQgKikgJm5vdGlmeWV2ZW50OworCWNtZHJzcC0+c2NzaXRhc2ttZ210Lm5vdGlmeXJlc3VsdCA9ICh2b2lkICopICZub3RpZnlyZXN1bHQ7CisKKwkvKiBzYXZlIGRlc3RpbmF0aW9uICovCisJY21kcnNwLT5zY3NpdGFza21nbXQudGFza3R5cGUgPSB0YXNrdHlwZTsKKwljbWRyc3AtPnNjc2l0YXNrbWdtdC52ZGVzdC5jaGFubmVsID0gc2NzaWRldi0+Y2hhbm5lbDsKKwljbWRyc3AtPnNjc2l0YXNrbWdtdC52ZGVzdC5pZCA9IHNjc2lkZXYtPmlkOworCWNtZHJzcC0+c2NzaXRhc2ttZ210LnZkZXN0Lmx1biA9IHNjc2lkZXYtPmx1bjsKKwljbWRyc3AtPnNjc2l0YXNrbWdtdC5zY3NpY21kID0KKwkgICAgKHZvaWQgKikgKHVpbnRwdHJfdCkKKwkJYWRkX3Njc2lwZW5kaW5nX2VudHJ5X3dpdGhfd2FpdCh2aXJ0aGJhaW5mbywKKwkJCQkJCUNNRF9TQ1NJVEFTS01HTVRfVFlQRSwKKwkJCQkJCSh2b2lkICopIGNtZHJzcCk7CisKKwl1aXNxdWV1ZV9wdXRfY21kcnNwX3dpdGhfbG9ja19jbGllbnQodmlydGhiYWluZm8tPmNoaW5mby5xdWV1ZWluZm8sCisJCQkJCSAgICAgY21kcnNwLCBJT0NIQU5fVE9fSU9QQVJULAorCQkJCQkgICAgICZ2aXJ0aGJhaW5mby0+Y2hpbmZvLmluc2VydGxvY2ssCisJCQkJCSAgICAgRE9OVF9JU1NVRV9JTlRFUlJVUFQsIChVNjQpIE5VTEwsCisJCQkJCSAgICAgT0tfVE9fV0FJVCwgInZoYmEiKTsKKwlMT0dJTkYoIlRhc2tNZ210IHdhaXRpbmcgb24gZXZlbnQgbm90aWZ5ZXZlbnQ9MHglcFxuIiwKKwkgICAgICAgY21kcnNwLT5zY3NpdGFza21nbXQubm90aWZ5KTsKKwl3YWl0X2V2ZW50KG5vdGlmeWV2ZW50LCBub3RpZnlyZXN1bHQgIT0gMHhmZmZmKTsKKwlMT0dJTkYoIlRhc2tNZ210IGNvbXBsZXRlOyByZXN1bHQ6JWRcbiIsIGNtZHJzcC0+c2NzaXRhc2ttZ210LnJlc3VsdCk7CisJa2ZyZWUoY21kcnNwKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyogVGhlIGFib3J0IGhhbmRsZXIgcmV0dXJucyBTVUNDRVNTIGlmIGl0IGhhcyBzdWNjZWVkZWQgdG8gbWFrZSBMTERECisgKiBhbmQgYWxsIHJlbGF0ZWQgaGFyZHdhcmUgZm9yZ2V0IGFib3V0IHRoZSBzY21kLgorICovCitzdGF0aWMgaW50Cit2aXJ0aGJhX2Fib3J0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqc2NzaWNtZCkKK3sKKwkvKiBpc3N1ZSBUQVNLX01HTVRfQUJPUlRfVEFTSyAqLworCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldjsKKwlzdHJ1Y3QgdmlydGRpc2tfaW5mbyAqdmRpc2s7CisKKwlzY3NpZGV2ID0gc2NzaWNtZC0+ZGV2aWNlOworCWZvciAodmRpc2sgPSAmKChzdHJ1Y3QgdmlydGhiYV9pbmZvICopIHNjc2lkZXYtPmhvc3QtPmhvc3RkYXRhKS0+aGVhZDsKKwkgICAgIHZkaXNrLT5uZXh0OyB2ZGlzayA9IHZkaXNrLT5uZXh0KSB7CisJCWlmICgoc2NzaWRldi0+Y2hhbm5lbCA9PSB2ZGlzay0+Y2hhbm5lbCkKKwkJICAgICYmIChzY3NpZGV2LT5pZCA9PSB2ZGlzay0+aWQpCisJCSAgICAmJiAoc2NzaWRldi0+bHVuID09IHZkaXNrLT5sdW4pKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJnZkaXNrLT5lcnJvcl9jb3VudCkgPAorCQkJICAgIFZJUlRIQkFfRVJST1JfQ09VTlQpIHsKKwkJCQlhdG9taWNfaW5jKCZ2ZGlzay0+ZXJyb3JfY291bnQpOworCQkJCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9DT01NQU5EX0hBTkRMRVJfUEMsCisJCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJCQl9IGVsc2UKKwkJCQlhdG9taWNfc2V0KCZ2ZGlzay0+aW9zX3RocmVzaG9sZCwKKwkJCQkJICAgSU9TX0VSUk9SX1RIUkVTSE9MRCk7CisJCX0KKwl9CisJcmV0dXJuIGZvcndhcmRfdGFza21nbXRfY29tbWFuZChUQVNLX01HTVRfQUJPUlRfVEFTSywgc2NzaWNtZC0+ZGV2aWNlKTsKK30KKworc3RhdGljIGludAordmlydGhiYV9idXNfcmVzZXRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kKQoreworCS8qIGlzc3VlIFRBU0tfTUdNVF9UQVJHRVRfUkVTRVQgZm9yIGVhY2ggdGFyZ2V0IG9uIHRoZSBidXMgKi8KKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkZXY7CisJc3RydWN0IHZpcnRkaXNrX2luZm8gKnZkaXNrOworCisJc2NzaWRldiA9IHNjc2ljbWQtPmRldmljZTsKKwlmb3IgKHZkaXNrID0gJigoc3RydWN0IHZpcnRoYmFfaW5mbyAqKSBzY3NpZGV2LT5ob3N0LT5ob3N0ZGF0YSktPmhlYWQ7CisJICAgICB2ZGlzay0+bmV4dDsgdmRpc2sgPSB2ZGlzay0+bmV4dCkgeworCQlpZiAoKHNjc2lkZXYtPmNoYW5uZWwgPT0gdmRpc2stPmNoYW5uZWwpCisJCSAgICAmJiAoc2NzaWRldi0+aWQgPT0gdmRpc2stPmlkKQorCQkgICAgJiYgKHNjc2lkZXYtPmx1biA9PSB2ZGlzay0+bHVuKSkgeworCQkJaWYgKGF0b21pY19yZWFkKCZ2ZGlzay0+ZXJyb3JfY291bnQpIDwKKwkJCSAgICBWSVJUSEJBX0VSUk9SX0NPVU5UKSB7CisJCQkJYXRvbWljX2luYygmdmRpc2stPmVycm9yX2NvdW50KTsKKwkJCQlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfQ09NTUFORF9IQU5ETEVSX1BDLAorCQkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCQkJfSBlbHNlCisJCQkJYXRvbWljX3NldCgmdmRpc2stPmlvc190aHJlc2hvbGQsCisJCQkJCSAgIElPU19FUlJPUl9USFJFU0hPTEQpOworCQl9CisJfQorCXJldHVybiBmb3J3YXJkX3Rhc2ttZ210X2NvbW1hbmQoVEFTS19NR01UX0JVU19SRVNFVCwgc2NzaWNtZC0+ZGV2aWNlKTsKK30KKworc3RhdGljIGludAordmlydGhiYV9kZXZpY2VfcmVzZXRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kKQoreworCS8qIGlzc3VlIFRBU0tfTUdNVF9MVU5fUkVTRVQgKi8KKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkZXY7CisJc3RydWN0IHZpcnRkaXNrX2luZm8gKnZkaXNrOworCisJc2NzaWRldiA9IHNjc2ljbWQtPmRldmljZTsKKwlmb3IgKHZkaXNrID0gJigoc3RydWN0IHZpcnRoYmFfaW5mbyAqKSBzY3NpZGV2LT5ob3N0LT5ob3N0ZGF0YSktPmhlYWQ7CisJICAgICB2ZGlzay0+bmV4dDsgdmRpc2sgPSB2ZGlzay0+bmV4dCkgeworCQlpZiAoKHNjc2lkZXYtPmNoYW5uZWwgPT0gdmRpc2stPmNoYW5uZWwpCisJCSAgICAmJiAoc2NzaWRldi0+aWQgPT0gdmRpc2stPmlkKQorCQkgICAgJiYgKHNjc2lkZXYtPmx1biA9PSB2ZGlzay0+bHVuKSkgeworCQkJaWYgKGF0b21pY19yZWFkKCZ2ZGlzay0+ZXJyb3JfY291bnQpIDwKKwkJCSAgICBWSVJUSEJBX0VSUk9SX0NPVU5UKSB7CisJCQkJYXRvbWljX2luYygmdmRpc2stPmVycm9yX2NvdW50KTsKKwkJCQlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfQ09NTUFORF9IQU5ETEVSX1BDLAorCQkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCQkJfSBlbHNlCisJCQkJYXRvbWljX3NldCgmdmRpc2stPmlvc190aHJlc2hvbGQsCisJCQkJCSAgIElPU19FUlJPUl9USFJFU0hPTEQpOworCQl9CisJfQorCXJldHVybiBmb3J3YXJkX3Rhc2ttZ210X2NvbW1hbmQoVEFTS19NR01UX0xVTl9SRVNFVCwgc2NzaWNtZC0+ZGV2aWNlKTsKK30KKworc3RhdGljIGludAordmlydGhiYV9ob3N0X3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqc2NzaWNtZCkKK3sKKwkvKiBpc3N1ZSBUQVNLX01HTVRfVEFSR0VUX1JFU0VUIGZvciBlYWNoIHRhcmdldCBvbiBlYWNoIGJ1cyBmb3IgaG9zdCAqLworCUxPR0VSUigidmlydGhiYV9ob3N0X3Jlc2V0X2hhbmRsZXIgTm90IHlldCBpbXBsZW1lbnRlZFxuIik7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBjaGFyIHZpcnRoYmFfZ2V0X2luZm9fc3RyWzI1Nl07CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3ZpcnRoYmFfZ2V0X2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hwKQoreworCS8qIFJldHVybiB2ZXJzaW9uIHN0cmluZyAqLworCXNwcmludGYodmlydGhiYV9nZXRfaW5mb19zdHIsICJ2aXJ0aGJhLCB2ZXJzaW9uICVzXG4iLCBWSVJUSEJBX1ZFUlNJT04pOworCXJldHVybiB2aXJ0aGJhX2dldF9pbmZvX3N0cjsKK30KKworc3RhdGljIGludAordmlydGhiYV9pb2N0bChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldiwgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlEQkdJTkYoIkluIHZpcnRoYmFfaW9jdGw6IGlvY3RsOiBjbWQ9MHgleFxuIiwgY21kKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogVGhpcyByZXR1cm5zIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWSBpZiB0aGUgc2lnbmFsIHF1ZXVlIHRvIElPcGFydAorICogaXMgZnVsbC4KKyAqLworc3RhdGljIGludAordmlydGhiYV9xdWV1ZV9jb21tYW5kX2xjayhzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kLAorCQkJICB2b2lkICgqdmlydGhiYV9jbW5kX2RvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2ID0gc2NzaWNtZC0+ZGV2aWNlOworCWludCBpbnNlcnRfbG9jYXRpb247CisJdW5zaWduZWQgY2hhciBvcDsKKwl1bnNpZ25lZCBjaGFyICpjZGIgPSBzY3NpY21kLT5jbW5kOworCXN0cnVjdCBTY3NpX0hvc3QgKnNjc2lob3N0ID0gc2NzaWRldi0+aG9zdDsKKwlzdHJ1Y3QgdWlzY21kcnNwICpjbWRyc3A7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IHZpcnRoYmFfaW5mbyAqdmlydGhiYWluZm8gPQorCSAgICAoc3RydWN0IHZpcnRoYmFfaW5mbyAqKSBzY3NpaG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IE5VTEw7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wgPSBOVUxMOworCWludCBzZ19mYWlsZWQgPSAwOworCisJaWYgKHZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duIHx8IHZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlKSB7CisJCURCR0lORigiU2VydmVyIGlzIGRvd24vY2hhbmdpbmcgc3RhdGUuIFJldHVybmluZyBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1kuXG4iKTsKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKKwl9CisKKwljbWRyc3AgPSBremFsbG9jKFNJWkVPRl9DTURSU1AsIEdGUF9BVE9NSUMpOworCWlmIChjbWRyc3AgPT0gTlVMTCkgeworCQlMT0dFUlIoImttYWxsb2Mgb2YgY21kcnNwIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gMTsJLyogcmVqZWN0IHRoZSBjb21tYW5kICovCisJfQorCisJLyogbm93IHNhdmluZyBldmVyeXRoaW5nIHdlIG5lZWQgZnJvbSBzY3NpX2NtZCBpbnRvIGNtZHJzcAorCSAqIGJlZm9yZSB3ZSBxdWV1ZSBjbWRyc3Agc2V0IHR5cGUgdG8gY29tbWFuZCAtIGFzIG9wcG9zZWQgdG8KKwkgKiB0YXNrIG1nbXQKKwkgKi8KKwljbWRyc3AtPmNtZHR5cGUgPSBDTURfU0NTSV9UWVBFOworCS8qIHNhdmUgdGhlIHBlbmRpbmcgaW5zZXJ0aW9uIGxvY2F0aW9uLiAgRGVsZXRpb24gZnJvbSBwZW5kaW5nCisJICogd2lsbCByZXR1cm4gdGhlIHNjc2ljbWQgcG9pbnRlciBmb3IgY29tcGxldGlvbgorCSAqLworCWluc2VydF9sb2NhdGlvbiA9CisJICAgIGFkZF9zY3NpcGVuZGluZ19lbnRyeSh2aXJ0aGJhaW5mbywgQ01EX1NDU0lfVFlQRSwgKHZvaWQgKikgc2NzaWNtZCk7CisJaWYgKGluc2VydF9sb2NhdGlvbiAhPSAtMSkgeworCQljbWRyc3AtPnNjc2kuc2NzaWNtZCA9ICh2b2lkICopICh1aW50cHRyX3QpIGluc2VydF9sb2NhdGlvbjsKKwl9IGVsc2UgeworCQlMT0dFUlIoIlF1ZXVlIGlzIGZ1bGwuIFJldHVybmluZyBidXN5LlxuIik7CisJCWtmcmVlKGNtZHJzcCk7CisJCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7CisJfQorCS8qIHNhdmUgZG9uZSBmdW5jdGlvbiB0aGF0IHdlIGhhdmUgY2FsbCB3aGVuIGNtZCBpcyBjb21wbGV0ZSAqLworCXNjc2ljbWQtPnNjc2lfZG9uZSA9IHZpcnRoYmFfY21uZF9kb25lOworCS8qIHNhdmUgZGVzdGluYXRpb24gKi8KKwljbWRyc3AtPnNjc2kudmRlc3QuY2hhbm5lbCA9IHNjc2lkZXYtPmNoYW5uZWw7CisJY21kcnNwLT5zY3NpLnZkZXN0LmlkID0gc2NzaWRldi0+aWQ7CisJY21kcnNwLT5zY3NpLnZkZXN0Lmx1biA9IHNjc2lkZXYtPmx1bjsKKwkvKiBzYXZlIGRhdGFkaXIgKi8KKwljbWRyc3AtPnNjc2kuZGF0YV9kaXIgPSBzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbjsKKwltZW1jcHkoY21kcnNwLT5zY3NpLmNtbmQsIGNkYiwgTUFYX0NNTkRfU0laRSk7CisKKwljbWRyc3AtPnNjc2kuYnVmZmxlbiA9IHNjc2lfYnVmZmxlbihzY3NpY21kKTsKKworCS8qIGtlZXAgdHJhY2sgb2YgdGhlIG1heCBidWZmZXIgbGVuZ3RoIHNvIGZhci4gKi8KKwlpZiAoY21kcnNwLT5zY3NpLmJ1ZmZsZW4gPiBNYXhCdWZmTGVuKQorCQlNYXhCdWZmTGVuID0gY21kcnNwLT5zY3NpLmJ1ZmZsZW47CisKKwlpZiAoc2NzaV9zZ19jb3VudChzY3NpY21kKSA+IE1BWF9QSFlTX0lORk8pIHsKKwkJTE9HRVJSKCJzY3NpY21kIHVzZV9zZzolZCBncmVhdGVyIHRoYW4gTUFYOiVkXG4iLAorCQkgICAgICAgc2NzaV9zZ19jb3VudChzY3NpY21kKSwgTUFYX1BIWVNfSU5GTyk7CisJCWRlbF9zY3NpcGVuZGluZ19lbnRyeSh2aXJ0aGJhaW5mbywgKHVpbnRwdHJfdCkgaW5zZXJ0X2xvY2F0aW9uKTsKKwkJa2ZyZWUoY21kcnNwKTsKKwkJcmV0dXJuIDE7CS8qIHJlamVjdCB0aGUgY29tbWFuZCAqLworCX0KKworCS8qIFRoaXMgaXMgd2hhdCB3ZSBVU0VEIHRvIGRvIHdoZW4gd2UgYXNzdW1lZCB3ZSB3ZXJlIHJ1bm5pbmcgKi8KKwkvKiB1aXNzZCAmIHZpcnRoYmEgb24gdGhlIHNhbWUgTGludXggc3lzdGVtLiAqLworCS8qIGNtZHJzcC0+c2NzaS5idWZmZXIgPSBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZlcjsgKi8KKwkvKiBUaGUgZm9sbG93aW5nIGNvZGUgZG9lcyBOT1QgbWFrZSB0aGF0IGFzc3VtcHRpb24uICovCisJLyogY29udmVydCBidWZmZXIgdG8gcGh5cyBpbmZvcm1hdGlvbiAqLworCWlmIChzY3NpX3NnX2NvdW50KHNjc2ljbWQpID09IDApIHsKKwkJaWYgKHNjc2lfYnVmZmxlbihzY3NpY21kKSA+IDApIHsKKwkJCUxPR0VSUigiKioqKiBGQUlMRUQgTm8gc2NhdHRlciBsaXN0IGZvciBidWZmbGVuID4gMFxuIik7CisJCQlCVUdfT04oc2NzaV9zZ19jb3VudChzY3NpY21kKSA9PSAwKTsKKwkJfQorCQlEQkdJTkYoIk5vIHNnOyBidWZmZXI6MHglcCBidWZmbGVuOiVkXG4iLAorCQkgICAgICAgc2NzaV9zZ2xpc3Qoc2NzaWNtZCksIHNjc2lfYnVmZmxlbihzY3NpY21kKSk7CisJfSBlbHNlIHsKKwkJLyogYnVmZmVyIGlzIHNjYXR0ZXJsaXN0IC0gY29weSBpdCBvdXQgKi8KKwkJc2dsID0gc2NzaV9zZ2xpc3Qoc2NzaWNtZCk7CisKKwkJZm9yX2VhY2hfc2coc2dsLCBzZywgc2NzaV9zZ19jb3VudChzY3NpY21kKSwgaSkgeworCisJCQljbWRyc3AtPnNjc2kuZ3BpX2xpc3RbaV0uYWRkcmVzcyA9IHNnX3BoeXMoc2cpOworCQkJY21kcnNwLT5zY3NpLmdwaV9saXN0W2ldLmxlbmd0aCA9IHNnLT5sZW5ndGg7CisJCQlpZiAoKGkgIT0gMCkgJiYgKHNnLT5vZmZzZXQgIT0gMCkpCisJCQkJTE9HSU5GKCJPZmZzZXQgb24gYSBzZ19lbnRyeSBvdGhlciB0aGFuIHplcm8gPTw8JWQ+Pi5cbiIsCisJCQkJICAgICBzZy0+b2Zmc2V0KTsKKwkJfQorCisJCWlmIChzZ19mYWlsZWQpIHsKKwkJCUxPR0VSUigiU3RhcnQgc2dfbGlzdCBkdW1wIChlbnRyaWVzICVkLCBidWZmbGVuICVkKS4uLlxuIiwKKwkJCSAgICAgc2NzaV9zZ19jb3VudChzY3NpY21kKSwgY21kcnNwLT5zY3NpLmJ1ZmZsZW4pOworCQkJZm9yX2VhY2hfc2coc2dsLCBzZywgc2NzaV9zZ19jb3VudChzY3NpY21kKSwgaSkgeworCQkJCUxPR0VSUigiICAgRW50cnkoJWQpOiBwYWdlLT5bMHglcF0sIHBoeXMtPlsweCVMeF0sIG9mZiglZCksIGxlbiglZClcbiIsCisJCQkJICAgICBpLCBzZ19wYWdlKHNnKSwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHNnX3BoeXMoc2cpLAorCQkJCSAgICAgc2ctPm9mZnNldCwgc2ctPmxlbmd0aCk7CisJCQl9CisJCQlMT0dFUlIoIkRvbmUgc2dfbGlzdCBkdW1wLlxuIik7CisJCQkvKiBCVUcoKTsgKioqKiogRm9yIG5vdywgbGV0IGl0IGZhaWwgaW4gdWlzc2QKKwkJCSAqIGlmIGl0IGlzIGEgcHJvYmxlbSwgYXMgaXQgbWlnaHQganVzdAorCQkJICogd29yaworCQkJICovCisJCX0KKworCQljbWRyc3AtPnNjc2kuZ3Vlc3RfcGh5c19lbnRyaWVzID0gc2NzaV9zZ19jb3VudChzY3NpY21kKTsKKwl9CisKKwlvcCA9IGNkYlswXTsKKwlpID0gdWlzcXVldWVfcHV0X2NtZHJzcF93aXRoX2xvY2tfY2xpZW50KHZpcnRoYmFpbmZvLT5jaGluZm8ucXVldWVpbmZvLAorCQkJCQkJIGNtZHJzcCwgSU9DSEFOX1RPX0lPUEFSVCwKKwkJCQkJCSAmdmlydGhiYWluZm8tPmNoaW5mby4KKwkJCQkJCSBpbnNlcnRsb2NrLAorCQkJCQkJIERPTlRfSVNTVUVfSU5URVJSVVBULAorCQkJCQkJIChVNjQpIE5VTEwsIERPTlRfV0FJVCwgInZoYmEiKTsKKwlpZiAoaSA9PSAwKSB7CisJCS8qIHF1ZXVlIG11c3QgYmUgZnVsbCAtIGFuZCB3ZSBzYWlkIGRvbid0IHdhaXQgLSByZXR1cm4gYnVzeSAqLworCQlMT0dFUlIoInVpc3F1ZXVlX3B1dF9jbWRyc3Bfd2l0aF9sb2NrICoqKipGQUlMRURcbiIpOworCQlrZnJlZShjbWRyc3ApOworCQlkZWxfc2NzaXBlbmRpbmdfZW50cnkodmlydGhiYWluZm8sICh1aW50cHRyX3QpIGluc2VydF9sb2NhdGlvbik7CisJCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7CisJfQorCisJLyogd2UncmUgZG9uZSB3aXRoIGNtZHJzcCBzcGFjZSAtIGRhdGEgZnJvbSBpdCBoYXMgYmVlbiBjb3BpZWQKKwkgKiBpbnRvIGNoYW5uZWwgLSBmcmVlIGl0IG5vdy4KKwkgKi8KKwlrZnJlZShjbWRyc3ApOworCXJldHVybiAwOwkJLyogbm9uLXplcm8gaW1wbGllcyBob3N0L2RldmljZSBpcyBidXN5ICovCit9CisKK3N0YXRpYyBpbnQKK3ZpcnRoYmFfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2KQoreworCS8qIHRoaXMgY2FsbGVkIGJ5IHRoZSBtaWRsYXllciBiZWZvcmUgc2NhbiBmb3IgbmV3IGRldmljZXMgLQorCSAqIExMRCBjYW4gYWxsb2MgYW55IHN0cnVjICYgZG8gaW5pdCBpZiBuZWVkZWQuCisJICovCisJc3RydWN0IHZpcnRkaXNrX2luZm8gKnZkaXNrOworCXN0cnVjdCB2aXJ0ZGlza19pbmZvICp0bXB2ZGlzazsKKwlzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aXJ0aGJhaW5mbzsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpaG9zdCA9IChzdHJ1Y3QgU2NzaV9Ib3N0ICopIHNjc2lkZXYtPmhvc3Q7CisKKwl2aXJ0aGJhaW5mbyA9IChzdHJ1Y3QgdmlydGhiYV9pbmZvICopIHNjc2lob3N0LT5ob3N0ZGF0YTsKKwlpZiAoIXZpcnRoYmFpbmZvKSB7CisJCUxPR0VSUigiQ291bGQgbm90IGZpbmQgdmlydGhiYV9pbmZvIGZvciBzY3NpaG9zdFxuIik7CisJCXJldHVybiAwOwkvKiBldmVuIHRob3VnaCB3ZSBlcnJvcmVkLCB0cmVhdCBhcyBzdWNjZXNzICovCisJfQorCWZvciAodmRpc2sgPSAmdmlydGhiYWluZm8tPmhlYWQ7IHZkaXNrLT5uZXh0OyB2ZGlzayA9IHZkaXNrLT5uZXh0KSB7CisJCWlmICh2ZGlzay0+bmV4dC0+dmFsaWQgJiYKKwkJICAgICh2ZGlzay0+bmV4dC0+Y2hhbm5lbCA9PSBzY3NpZGV2LT5jaGFubmVsKSAmJgorCQkgICAgKHZkaXNrLT5uZXh0LT5pZCA9PSBzY3NpZGV2LT5pZCkgJiYKKwkJICAgICh2ZGlzay0+bmV4dC0+bHVuID09IHNjc2lkZXYtPmx1bikpCisJCQlyZXR1cm4gMDsKKwl9CisJdG1wdmRpc2sgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmlydGRpc2tfaW5mbyksIEdGUF9BVE9NSUMpOworCWlmICghdG1wdmRpc2spIHsJLyogZXJyb3IgYWxsb2NhdGluZyAqLworCQlMT0dFUlIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRpc2tcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0bXB2ZGlzay0+Y2hhbm5lbCA9IHNjc2lkZXYtPmNoYW5uZWw7CisJdG1wdmRpc2stPmlkID0gc2NzaWRldi0+aWQ7CisJdG1wdmRpc2stPmx1biA9IHNjc2lkZXYtPmx1bjsKKwl0bXB2ZGlzay0+dmFsaWQgPSAxOworCXZkaXNrLT5uZXh0ID0gdG1wdmRpc2s7CisJcmV0dXJuIDA7CQkvKiBzdWNjZXNzICovCit9CisKK3N0YXRpYyBpbnQKK3ZpcnRoYmFfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldikKK3sKKwlyZXR1cm4gMDsJCS8qIHN1Y2Nlc3MgKi8KK30KKworc3RhdGljIHZvaWQKK3ZpcnRoYmFfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkZXYpCit7CisJLyogbWlkbGV2ZWwgY2FsbHMgdGhpcyBhZnRlciBkZXZpY2UgaGFzIGJlZW4gcXVpZXNjZWQgYW5kCisJICogYmVmb3JlIGl0IGlzIHRvIGJlIGRlbGV0ZWQuCisJICovCisJc3RydWN0IHZpcnRkaXNrX2luZm8gKnZkaXNrLCAqZGVsdmRpc2s7CisJc3RydWN0IHZpcnRoYmFfaW5mbyAqdmlydGhiYWluZm87CisJc3RydWN0IFNjc2lfSG9zdCAqc2NzaWhvc3QgPSAoc3RydWN0IFNjc2lfSG9zdCAqKSBzY3NpZGV2LT5ob3N0OworCisJdmlydGhiYWluZm8gPSAoc3RydWN0IHZpcnRoYmFfaW5mbyAqKSBzY3NpaG9zdC0+aG9zdGRhdGE7CisJaWYgKCF2aXJ0aGJhaW5mbykKKwkJTE9HRVJSKCJDb3VsZCBub3QgZmluZCB2aXJ0aGJhX2luZm8gZm9yIHNjc2lob3N0XG4iKTsKKwlmb3IgKHZkaXNrID0gJnZpcnRoYmFpbmZvLT5oZWFkOyB2ZGlzay0+bmV4dDsgdmRpc2sgPSB2ZGlzay0+bmV4dCkgeworCQlpZiAodmRpc2stPm5leHQtPnZhbGlkICYmCisJCSAgICAodmRpc2stPm5leHQtPmNoYW5uZWwgPT0gc2NzaWRldi0+Y2hhbm5lbCkgJiYKKwkJICAgICh2ZGlzay0+bmV4dC0+aWQgPT0gc2NzaWRldi0+aWQpICYmCisJCSAgICAodmRpc2stPm5leHQtPmx1biA9PSBzY3NpZGV2LT5sdW4pKSB7CisJCQlkZWx2ZGlzayA9IHZkaXNrLT5uZXh0OworCQkJdmRpc2stPm5leHQgPSB2ZGlzay0+bmV4dC0+bmV4dDsKKwkJCWtmcmVlKGRlbHZkaXNrKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNjc2kgQ21uZCBzdXBwb3J0IHRocmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2RvX3Njc2lfbGludXhzdGF0KHN0cnVjdCB1aXNjbWRyc3AgKmNtZHJzcCwgc3RydWN0IHNjc2lfY21uZCAqc2NzaWNtZCkKK3sKKwlzdHJ1Y3QgdmlydGRpc2tfaW5mbyAqdmRpc2s7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2OworCXN0cnVjdCBzZW5zZV9kYXRhICpzZDsKKworCXNjc2lkZXYgPSBzY3NpY21kLT5kZXZpY2U7CisJbWVtY3B5KHNjc2ljbWQtPnNlbnNlX2J1ZmZlciwgY21kcnNwLT5zY3NpLnNlbnNlYnVmLCBNQVhfU0VOU0VfU0laRSk7CisJc2QgPSAoc3RydWN0IHNlbnNlX2RhdGEgKikgc2NzaWNtZC0+c2Vuc2VfYnVmZmVyOworCisJLyogRG8gbm90IGxvZyBlcnJvcnMgZm9yIGRpc2stbm90LXByZXNlbnQgaW5xdWlyaWVzICovCisJaWYgKChjbWRyc3AtPnNjc2kuY21uZFswXSA9PSBJTlFVSVJZKSAmJgorCSAgICAoaG9zdF9ieXRlKGNtZHJzcC0+c2NzaS5saW51eHN0YXQpID09IERJRF9OT19DT05ORUNUKSAmJgorCSAgICAoY21kcnNwLT5zY3NpLmFkZGxzdGF0ID09IEFERExfU0VMX1RJTUVPVVQpKQorCQlyZXR1cm47CisKKwkvKiBPa2F5IHNlZSB3aGF0IG91ciBlcnJvcl9jb3VudCBpcyBoZXJlLi4uLiAqLworCWZvciAodmRpc2sgPSAmKChzdHJ1Y3QgdmlydGhiYV9pbmZvICopIHNjc2lkZXYtPmhvc3QtPmhvc3RkYXRhKS0+aGVhZDsKKwkgICAgIHZkaXNrLT5uZXh0OyB2ZGlzayA9IHZkaXNrLT5uZXh0KSB7CisJCWlmICgoc2NzaWRldi0+Y2hhbm5lbCAhPSB2ZGlzay0+Y2hhbm5lbCkKKwkJICAgIHx8IChzY3NpZGV2LT5pZCAhPSB2ZGlzay0+aWQpCisJCSAgICB8fCAoc2NzaWRldi0+bHVuICE9IHZkaXNrLT5sdW4pKQorCQkJY29udGludWU7CisKKwkJaWYgKGF0b21pY19yZWFkKCZ2ZGlzay0+ZXJyb3JfY291bnQpIDwgVklSVEhCQV9FUlJPUl9DT1VOVCkgeworCQkJYXRvbWljX2luYygmdmRpc2stPmVycm9yX2NvdW50KTsKKwkJCUxPR0VSUigiU0NTSUNNRCAqKioqRkFJTEVEIHNjc2ljbWQ6MHglcCBvcDoweCV4IDwlZDolZDolZDolZD4gMHgleC0weCV4LTB4JXgtMHgleC0weCV4LlxuIiwKKwkJCSAgICAgICBzY3NpY21kLCBjbWRyc3AtPnNjc2kuY21uZFswXSwKKwkJCSAgICAgICBzY3NpZGV2LT5ob3N0LT5ob3N0X25vLCBzY3NpZGV2LT5pZCwKKwkJCSAgICAgICBzY3NpZGV2LT5jaGFubmVsLCBzY3NpZGV2LT5sdW4sCisJCQkgICAgICAgY21kcnNwLT5zY3NpLmxpbnV4c3RhdCwgc2QtPlZhbGlkLCBzZC0+U2Vuc2VLZXksCisJCQkgICAgICAgc2QtPkFkZGl0aW9uYWxTZW5zZUNvZGUsCisJCQkgICAgICAgc2QtPkFkZGl0aW9uYWxTZW5zZUNvZGVRdWFsaWZpZXIpOworCQkJaWYgKGF0b21pY19yZWFkKCZ2ZGlzay0+ZXJyb3JfY291bnQpID09CisJCQkgICAgVklSVEhCQV9FUlJPUl9DT1VOVCkgeworCQkJCUxPR0VSUigiVGhyb3RsaW5nIFNDU0lDTUQgZXJyb3JzIGRpc2sgPCVkOiVkOiVkOiVkPlxuIiwKKwkJCQkgICAgIHNjc2lkZXYtPmhvc3QtPmhvc3Rfbm8sIHNjc2lkZXYtPmlkLAorCQkJCSAgICAgc2NzaWRldi0+Y2hhbm5lbCwgc2NzaWRldi0+bHVuKTsKKwkJCX0KKwkJCWF0b21pY19zZXQoJnZkaXNrLT5pb3NfdGhyZXNob2xkLCBJT1NfRVJST1JfVEhSRVNIT0xEKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK2RvX3Njc2lfbm9saW51eHN0YXQoc3RydWN0IHVpc2NtZHJzcCAqY21kcnNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldjsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlszNl07CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl1bnNpZ25lZCBpbnQgaTsKKwljaGFyICp0aGlzcGFnZTsKKwljaGFyICp0aGlzcGFnZV9vcmlnOworCWludCBidWZpbmQgPSAwOworCXN0cnVjdCB2aXJ0ZGlza19pbmZvICp2ZGlzazsKKworCXNjc2lkZXYgPSBzY3NpY21kLT5kZXZpY2U7CisJaWYgKChjbWRyc3AtPnNjc2kuY21uZFswXSA9PSBJTlFVSVJZKQorCSAgICAmJiAoY21kcnNwLT5zY3NpLmJ1ZmZsZW4gPj0gTUlOX0lOUVVJUllfUkVTVUxUX0xFTikpIHsKKwkJaWYgKGNtZHJzcC0+c2NzaS5ub19kaXNrX3Jlc3VsdCA9PSAwKQorCQkJcmV0dXJuOworCisJCS8qIExpbnV4IHNjc2kgY29kZSBpcyB3ZWlyZDsgaXQgd2FudHMKKwkJICogYSBkZXZpY2UgYXQgTHVuIDAgdG8gaXNzdWUgcmVwb3J0CisJCSAqIGx1bnMsIGJ1dCB3ZSBkb24ndCB3YW50IGEgZGlzaworCQkgKiB0aGVyZSBzbyB3ZSdsbCBwcmVzZW50IGEgcHJvY2Vzc29yCisJCSAqIHRoZXJlLiAqLworCQlTRVRfTk9fRElTS19JTlFVSVJZX1JFU1VMVChidWYsIGNtZHJzcC0+c2NzaS5idWZmbGVuLAorCQkJCQkgICBzY3NpZGV2LT5sdW4sCisJCQkJCSAgIERFVl9ESVNLX0NBUEFCTEVfTk9UX1BSRVNFTlQsCisJCQkJCSAgIERFVl9OT1RfQ0FQQUJMRSk7CisKKwkJaWYgKHNjc2lfc2dfY291bnQoc2NzaWNtZCkgPT0gMCkgeworCQkJaWYgKHNjc2lfYnVmZmxlbihzY3NpY21kKSA+IDApIHsKKwkJCQlMT0dFUlIoIioqKiogRkFJTEVEIE5vIHNjYXR0ZXIgbGlzdCBmb3IgYnVmZmxlbiA+IDBcbiIpOworCQkJCUJVR19PTihzY3NpX3NnX2NvdW50KHNjc2ljbWQpID09CisJCQkJICAgICAgIDApOworCQkJfQorCQkJbWVtY3B5KHNjc2lfc2dsaXN0KHNjc2ljbWQpLCBidWYsCisJCQkgICAgICAgY21kcnNwLT5zY3NpLmJ1ZmZsZW4pOworCQkJcmV0dXJuOworCQl9CisKKwkJc2cgPSBzY3NpX3NnbGlzdChzY3NpY21kKTsKKwkJZm9yIChpID0gMDsgaSA8IHNjc2lfc2dfY291bnQoc2NzaWNtZCk7IGkrKykgeworCQkJREJHVkVSKCJjb3B5aW5nIE9VVCBPRiBidWYgaW50byAweCVwICVkXG4iLAorCQkJICAgICBzZ19wYWdlKHNnICsgaSksIHNnW2ldLmxlbmd0aCk7CisJCQl0aGlzcGFnZV9vcmlnID0ga21hcF9hdG9taWMoc2dfcGFnZShzZyArIGkpKTsKKwkJCXRoaXNwYWdlID0gKHZvaWQgKikgKCh1bnNpZ25lZCBsb25nKXRoaXNwYWdlX29yaWcgfAorCQkJCQkgICAgIHNnW2ldLm9mZnNldCk7CisJCQltZW1jcHkodGhpc3BhZ2UsIGJ1ZiArIGJ1ZmluZCwgc2dbaV0ubGVuZ3RoKTsKKwkJCWt1bm1hcF9hdG9taWModGhpc3BhZ2Vfb3JpZyk7CisJCQlidWZpbmQgKz0gc2dbaV0ubGVuZ3RoOworCQl9CisJfSBlbHNlIHsKKworCQl2ZGlzayA9ICYoKHN0cnVjdCB2aXJ0aGJhX2luZm8gKilzY3NpZGV2LT5ob3N0LT5ob3N0ZGF0YSktPmhlYWQ7CisJCWZvciAoIDsgdmRpc2stPm5leHQ7IHZkaXNrID0gdmRpc2stPm5leHQpIHsKKwkJCWlmICgoc2NzaWRldi0+Y2hhbm5lbCAhPSB2ZGlzay0+Y2hhbm5lbCkKKwkJCSAgICB8fCAoc2NzaWRldi0+aWQgIT0gdmRpc2stPmlkKQorCQkJICAgIHx8IChzY3NpZGV2LT5sdW4gIT0gdmRpc2stPmx1bikpCisJCQkJY29udGludWU7CisKKwkJCWlmIChhdG9taWNfcmVhZCgmdmRpc2stPmlvc190aHJlc2hvbGQpID4gMCkgeworCQkJCWF0b21pY19kZWMoJnZkaXNrLT5pb3NfdGhyZXNob2xkKTsKKwkJCQlpZiAoYXRvbWljX3JlYWQoJnZkaXNrLT5pb3NfdGhyZXNob2xkKSA9PSAwKSB7CisJCQkJCUxPR0VSUigiUmVzZXR0aW5nIGVycm9yIGNvdW50IGZvciBkaXNrXG4iKTsKKwkJCQkJYXRvbWljX3NldCgmdmRpc2stPmVycm9yX2NvdW50LCAwKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjb21wbGV0ZV9zY3NpX2NvbW1hbmQoc3RydWN0IHVpc2NtZHJzcCAqY21kcnNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kKQoreworCURCR0lORigiY21kcnNwOiAweCVwLCBzY3Npc3RhdDoweCV4LlxuIiwgY21kcnNwLCBjbWRyc3AtPnNjc2kuc2NzaXN0YXQpOworCisJLyogdGFrZSB3aGF0IHdlIG5lZWQgb3V0IG9mIGNtZHJzcCBhbmQgY29tcGxldGUgdGhlIHNjc2ljbWQgKi8KKwlzY3NpY21kLT5yZXN1bHQgPSBjbWRyc3AtPnNjc2kubGludXhzdGF0OworCWlmIChjbWRyc3AtPnNjc2kubGludXhzdGF0KQorCQlkb19zY3NpX2xpbnV4c3RhdChjbWRyc3AsIHNjc2ljbWQpOworCWVsc2UKKwkJZG9fc2NzaV9ub2xpbnV4c3RhdChjbWRyc3AsIHNjc2ljbWQpOworCisJaWYgKHNjc2ljbWQtPnNjc2lfZG9uZSkgeworCQlEQkdWRVIoIlNjc2lfRE9ORVxuIik7CisJCXNjc2ljbWQtPnNjc2lfZG9uZShzY3NpY21kKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY29tcGxldGVfdmRpc2ttZ210X2NvbW1hbmQoc3RydWN0IHVpc2NtZHJzcCAqY21kcnNwKQoreworCS8qIGNvcHkgdGhlIHJlc3VsdCBvZiB0aGUgdGFza21nbXQgYW5kICovCisJLyogd2FrZSB1cCB0aGUgZXJyb3IgaGFuZGxlciB0aGF0IGlzIHdhaXRpbmcgZm9yIHRoaXMgKi8KKwkqKGludCAqKSBjbWRyc3AtPnZkaXNrbWdtdC5ub3RpZnlyZXN1bHQgPSBjbWRyc3AtPnZkaXNrbWdtdC5yZXN1bHQ7CisJd2FrZV91cF9hbGwoKHdhaXRfcXVldWVfaGVhZF90ICopIGNtZHJzcC0+dmRpc2ttZ210Lm5vdGlmeSk7CisJTE9HSU5GKCJzZXQgbm90aWZ5IHJlc3VsdCB0byAlZFxuIiwgY21kcnNwLT52ZGlza21nbXQucmVzdWx0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitjb21wbGV0ZV90YXNrbWdtdF9jb21tYW5kKHN0cnVjdCB1aXNjbWRyc3AgKmNtZHJzcCkKK3sKKwkvKiBjb3B5IHRoZSByZXN1bHQgb2YgdGhlIHRhc2ttZ210IGFuZCAqLworCS8qIHdha2UgdXAgdGhlIGVycm9yIGhhbmRsZXIgdGhhdCBpcyB3YWl0aW5nIGZvciB0aGlzICovCisJKihpbnQgKikgY21kcnNwLT5zY3NpdGFza21nbXQubm90aWZ5cmVzdWx0ID0KKwkgICAgY21kcnNwLT5zY3NpdGFza21nbXQucmVzdWx0OworCXdha2VfdXBfYWxsKCh3YWl0X3F1ZXVlX2hlYWRfdCAqKSBjbWRyc3AtPnNjc2l0YXNrbWdtdC5ub3RpZnkpOworCUxPR0lORigic2V0IG5vdGlmeSByZXN1bHQgdG8gJWRcbiIsIGNtZHJzcC0+c2NzaXRhc2ttZ210LnJlc3VsdCk7Cit9CisKK3N0YXRpYyB2b2lkCitkcmFpbl9xdWV1ZShzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aXJ0aGJhaW5mbywgc3RydWN0IGNoYW5pbmZvICpkYywKKwkJc3RydWN0IHVpc2NtZHJzcCAqY21kcnNwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHFyc2x0ID0gMDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdmlydGhiYWluZm8tPnNjc2lob3N0OworCisJd2hpbGUgKDEpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnZpcnRoYmFpbmZvLT5jaGluZm8uaW5zZXJ0bG9jaywgZmxhZ3MpOworCQlpZiAoIVVMVFJBX0NIQU5ORUxfQ0xJRU5UX0FDUVVJUkVfT1MoZGMtPnF1ZXVlaW5mby0+Y2hhbiwKKwkJCQkJCSAgICAgInZoYmEiLCBOVUxMKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlydGhiYWluZm8tPmNoaW5mby5pbnNlcnRsb2NrLAorCQkJCQkgICAgICAgZmxhZ3MpOworCQkJdmlydGhiYWluZm8tPmFjcXVpcmVfZmFpbGVkX2NudCsrOworCQkJYnJlYWs7CisJCX0KKwkJcXJzbHQgPSB1aXNxdWV1ZV9nZXRfY21kcnNwKGRjLT5xdWV1ZWluZm8sIGNtZHJzcCwKKwkJCQkJICAgIElPQ0hBTl9GUk9NX0lPUEFSVCk7CisJCVVMVFJBX0NIQU5ORUxfQ0xJRU5UX1JFTEVBU0VfT1MoZGMtPnF1ZXVlaW5mby0+Y2hhbiwKKwkJCQkJCSJ2aGJhIiwgTlVMTCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpcnRoYmFpbmZvLT5jaGluZm8uaW5zZXJ0bG9jaywgZmxhZ3MpOworCQlpZiAocXJzbHQgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoY21kcnNwLT5jbWR0eXBlID09IENNRF9TQ1NJX1RZUEUpIHsKKwkJCS8qIHNjc2ljbWQgbG9jYXRpb24gaXMgcmV0dXJuZWQgYnkgdGhlCisJCQkgKiBkZWxldGlvbgorCQkJICovCisJCQlzY3NpY21kID0gZGVsX3Njc2lwZW5kaW5nX2VudHJ5KHZpcnRoYmFpbmZvLAorCQkJCQkodWludHB0cl90KSBjbWRyc3AtPnNjc2kuc2NzaWNtZCk7CisJCQlpZiAoIXNjc2ljbWQpCisJCQkJYnJlYWs7CisJCQkvKiBjb21wbGV0ZSB0aGUgb3JpZyBjbWQgKi8KKwkJCWNvbXBsZXRlX3Njc2lfY29tbWFuZChjbWRyc3AsIHNjc2ljbWQpOworCQl9IGVsc2UgaWYgKGNtZHJzcC0+Y21kdHlwZSA9PSBDTURfU0NTSVRBU0tNR01UX1RZUEUpIHsKKwkJCWlmICghZGVsX3Njc2lwZW5kaW5nX2VudHJ5KHZpcnRoYmFpbmZvLAorCQkJCSAgICh1aW50cHRyX3QpIGNtZHJzcC0+c2NzaXRhc2ttZ210LnNjc2ljbWQpKQorCQkJCWJyZWFrOworCQkJY29tcGxldGVfdGFza21nbXRfY29tbWFuZChjbWRyc3ApOworCQl9IGVsc2UgaWYgKGNtZHJzcC0+Y21kdHlwZSA9PSBDTURfTk9USUZZR1VFU1RfVFlQRSkgeworCQkJLyogVGhlIHZIYmEgcG9pbnRlciBoYXMgbm8gbWVhbmluZyBpbgorCQkJICogYSBDbGllbnQvR3Vlc3QgUGFydGl0aW9uLiBMZXQncyBiZQorCQkJICogc2FmZSBhbmQgc2V0IGl0IHRvIE5VTEwgbm93LiAgRG8KKwkJCSAqIG5vdCB1c2UgaXQgaGVyZSEgKi8KKwkJCWNtZHJzcC0+ZGlza25vdGlmeS52SGJhID0gTlVMTDsKKwkJCXByb2Nlc3NfZGlza19ub3RpZnkoc2hvc3QsIGNtZHJzcCk7CisJCX0gZWxzZSBpZiAoY21kcnNwLT5jbWR0eXBlID09IENNRF9WRElTS01HTVRfVFlQRSkgeworCQkJaWYgKCFkZWxfc2NzaXBlbmRpbmdfZW50cnkodmlydGhiYWluZm8sCisJCQkJICAgKHVpbnRwdHJfdCkgY21kcnNwLT52ZGlza21nbXQuc2NzaWNtZCkpCisJCQkJYnJlYWs7CisJCQljb21wbGV0ZV92ZGlza21nbXRfY29tbWFuZChjbWRyc3ApOworCQl9IGVsc2UKKwkJCUxPR0VSUigiSW52YWxpZCBjbWR0eXBlICVkXG4iLCBjbWRyc3AtPmNtZHR5cGUpOworCQkvKiBjbWRyc3AgaXMgbm93IGF2YWlsYWJsZSBmb3IgcmV1c2UgKi8KKwl9Cit9CisKKworLyogbWFpbiBmdW5jdGlvbiBmb3IgdGhlIHRocmVhZCB0aGF0IHdhaXRzIGZvciBzY3NpIGNvbW1hbmRzIHRvIGFycml2ZQorICogaW4gYSBzcGVjaWZpZWQgcXVldWUKKyAqLworc3RhdGljIGludAorcHJvY2Vzc19pbmNvbWluZ19yc3BzKHZvaWQgKnYpCit7CisJc3RydWN0IHZpcnRoYmFfaW5mbyAqdmlydGhiYWluZm8gPSB2OworCXN0cnVjdCBjaGFuaW5mbyAqZGMgPSAmdmlydGhiYWluZm8tPmNoaW5mbzsKKwlzdHJ1Y3QgdWlzY21kcnNwICpjbWRyc3AgPSBOVUxMOworCWNvbnN0IGludCBTWiA9IHNpemVvZihzdHJ1Y3QgdWlzY21kcnNwKTsKKwlVNjQgbWFzazsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmMxOworCisJVUlTX0RBRU1PTklaRSgidmhiYV9pbmNvbWluZyIpOworCS8qIGFsbG9jIG9uY2UgYW5kIHJldXNlICovCisJY21kcnNwID0ga21hbGxvYyhTWiwgR0ZQX0FUT01JQyk7CisJaWYgKGNtZHJzcCA9PSBOVUxMKSB7CisJCUxPR0VSUigicHJvY2Vzc19pbmNvbWluZ19yc3BzICoqKipGQUlMRUQgdG8gbWFsbG9jIC0gdGhyZWFkIGV4aXRpbmdcbiIpOworCQljb21wbGV0ZV9hbmRfZXhpdCgmZGMtPnRocmVhZGluZm8uaGFzX3N0b3BwZWQsIDApOworCQlyZXR1cm4gMDsKKwl9CisJbWFzayA9IFVMVFJBX0NIQU5ORUxfRU5BQkxFX0lOVFM7CisJd2hpbGUgKDEpIHsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQodmlydGhiYWluZm8tPnJzcF9xdWV1ZSwKKwkJCSAoYXRvbWljX3JlYWQoJnZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfcmN2ZCkgPT0gMSksCisJCQkJCSB1c2Vjc190b19qaWZmaWVzKHJzbHRxX3dhaXRfdXNlY3MpKTsKKwkJYXRvbWljX3NldCgmdmlydGhiYWluZm8tPmludGVycnVwdF9yY3ZkLCAwKTsKKwkJLyogZHJhaW4gcXVldWUgKi8KKwkJZHJhaW5fcXVldWUodmlydGhiYWluZm8sIGRjLCBjbWRyc3ApOworCQlyYzEgPSB1aXNxdWV1ZV9JbnRlcmxvY2tlZE9yKHZpcnRoYmFpbmZvLT5mbGFnc19hZGRyLCBtYXNrKTsKKwkJaWYgKGRjLT50aHJlYWRpbmZvLnNob3VsZF9zdG9wKQorCQkJYnJlYWs7CisJfQorCisJa2ZyZWUoY21kcnNwKTsKKworCURCR0lORigiZXhpdGluZyBwcm9jZXNzaW5nIGluY29taW5nIHJzcHMuXG4iKTsKKwljb21wbGV0ZV9hbmRfZXhpdCgmZGMtPnRocmVhZGluZm8uaGFzX3N0b3BwZWQsIDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBwcm9jIGZpbGVzeXN0ZW0gZnVuY3Rpb25zCQkJCQkJICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzc2l6ZV90CitpbmZvX3Byb2NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCit7CisJaW50IGxlbmd0aCA9IDA7CisJVTY0IHBoeXNfZmxhZ3NfYWRkcjsKKwlpbnQgaTsKKwlzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aXJ0aGJhaW5mbzsKKwljaGFyICp2YnVmOworCWxvZmZfdCBwb3MgPSAqb2Zmc2V0OworCisJaWYgKHBvcyA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBvcyA+IDAgfHwgIWxlbikKKwkJcmV0dXJuIDA7CisKKwl2YnVmID0ga3phbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICghdmJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgVklSVEhCQVNPUEVOTUFYOyBpKyspIHsKKwkJaWYgKFZpcnRIYmFzT3BlbltpXS52aXJ0aGJhaW5mbyA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJdmlydGhiYWluZm8gPSBWaXJ0SGJhc09wZW5baV0udmlydGhiYWluZm87CisJCWxlbmd0aCArPSBzcHJpbnRmKHZidWYgKyBsZW5ndGgsICJDSEFOU09DSyBpcyBub3QgZGVmaW5lZC5cbiIpOworCisJCWxlbmd0aCArPSBzcHJpbnRmKHZidWYgKyBsZW5ndGgsICJNYXhCdWZmTGVuOiVkXG4iLCBNYXhCdWZmTGVuKTsKKworCQlsZW5ndGggKz0gc3ByaW50Zih2YnVmICsgbGVuZ3RoLCAiXG52aXJ0aGJhIHJlc3VsdCBxdWV1ZSBwb2xsIHdhaXQ6JWQgdXNlY3MuXG4iLAorCQkJCSAgcnNsdHFfd2FpdF91c2Vjcyk7CisKKwkJbGVuZ3RoICs9IHNwcmludGYodmJ1ZiArIGxlbmd0aCwKKwkJCQkgICJcbk1vZHVsZSBidWlsZDogRGF0ZTolcyBUaW1lOiVzXG4iLAorCQkJCSAgX19EQVRFX18sIF9fVElNRV9fKTsKKwkJbGVuZ3RoICs9IHNwcmludGYodmJ1ZiArIGxlbmd0aCwgIlxuaW50ZXJydXB0c19yY3ZkID0gJWxsdSwgaW50ZXJydXB0c19kaXNhYmxlZCA9ICVsbHVcbiIsCisJCQkJICB2aXJ0aGJhaW5mby0+aW50ZXJydXB0c19yY3ZkLAorCQkJCSAgdmlydGhiYWluZm8tPmludGVycnVwdHNfZGlzYWJsZWQpOworCQlsZW5ndGggKz0gc3ByaW50Zih2YnVmICsgbGVuZ3RoLCAiXG5pbnRlcnJ1cHRzX25vdG1lID0gJWxsdSxcbiIsCisJCQkJICB2aXJ0aGJhaW5mby0+aW50ZXJydXB0c19ub3RtZSk7CisJCXBoeXNfZmxhZ3NfYWRkciA9IHZpcnRfdG9fcGh5cygoX19mb3JjZSAgdm9pZCAqKQorCQkJCQkgICAgICAgdmlydGhiYWluZm8tPmZsYWdzX2FkZHIpOworCQlsZW5ndGggKz0gc3ByaW50Zih2YnVmICsgbGVuZ3RoLCAiZmxhZ3NfYWRkciA9ICVwLCBwaHlzX2ZsYWdzX2FkZHI9MHglMDE2bGx4LCBGZWF0dXJlRmxhZ3M9JWxsdVxuIiwKKwkJCSAgdmlydGhiYWluZm8tPmZsYWdzX2FkZHIsIHBoeXNfZmxhZ3NfYWRkciwKKwkJCQkgIChfX2xlNjQpcmVhZHEodmlydGhiYWluZm8tPmZsYWdzX2FkZHIpKTsKKwkJbGVuZ3RoICs9IHNwcmludGYodmJ1ZiArIGxlbmd0aCwgImFjcXVpcmVfZmFpbGVkX2NudDolbGx1XG4iLAorCQkJCSAgdmlydGhiYWluZm8tPmFjcXVpcmVfZmFpbGVkX2NudCk7CisJCWxlbmd0aCArPSBzcHJpbnRmKHZidWYgKyBsZW5ndGgsICJcbiIpOworCX0KKwlpZiAoY29weV90b191c2VyKGJ1ZiwgdmJ1ZiwgbGVuZ3RoKSkgeworCQlrZnJlZSh2YnVmKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2ZyZWUodmJ1Zik7CisJKm9mZnNldCArPSBsZW5ndGg7CisJcmV0dXJuIGxlbmd0aDsKK30KKworc3RhdGljIHNzaXplX3QKK2VuYWJsZV9pbnRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsCisJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitlbmFibGVfaW50c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1Zls0XTsKKwlpbnQgaSwgbmV3X3ZhbHVlOworCXN0cnVjdCB2aXJ0aGJhX2luZm8gKnZpcnRoYmFpbmZvOworCVU2NCBfX2lvbWVtICpGZWF0dXJlc19hZGRyOworCVU2NCBtYXNrOworCisJaWYgKGNvdW50ID49IEFSUkFZX1NJWkUoYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidWZbY291bnRdID0gJ1wwJzsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlMT0dFUlIoImNvcHlfZnJvbV91c2VyIGZhaWxlZC4gYnVmPDwlLipzPj4gY291bnQ8PCVsdT4+XG4iLAorCQkgICAgICAgKGludCkgY291bnQsIGJ1ZiwgY291bnQpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpID0gc3NjYW5mKGJ1ZiwgIiVkIiwgJm5ld192YWx1ZSk7CisKKwlpZiAoaSA8IDEpIHsKKwkJTE9HRVJSKCJGYWlsZWQgdG8gc2NhbiB2YWx1ZSBmb3IgZW5hYmxlX2ludHMsIGJ1Zjw8JS4qcz4+IiwKKwkJICAgICAgIChpbnQpIGNvdW50LCBidWYpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKiBzZXQgYWxsIGNvdW50cyB0byBuZXdfdmFsdWUgdXN1YWxseSAwICovCisJZm9yIChpID0gMDsgaSA8IFZJUlRIQkFTT1BFTk1BWDsgaSsrKSB7CisJCWlmIChWaXJ0SGJhc09wZW5baV0udmlydGhiYWluZm8gIT0gTlVMTCkgeworCQkJdmlydGhiYWluZm8gPSBWaXJ0SGJhc09wZW5baV0udmlydGhiYWluZm87CisJCQlGZWF0dXJlc19hZGRyID0KKwkJCQkmdmlydGhiYWluZm8tPmNoaW5mby5xdWV1ZWluZm8tPmNoYW4tPkZlYXR1cmVzOworCQkJaWYgKG5ld192YWx1ZSA9PSAxKSB7CisJCQkJbWFzayA9IH4oVUxUUkFfSU9fQ0hBTk5FTF9JU19QT0xMSU5HIHwKKwkJCQkJIFVMVFJBX0lPX0RSSVZFUl9ESVNBQkxFU19JTlRTKTsKKwkJCQl1aXNxdWV1ZV9JbnRlcmxvY2tlZEFuZChGZWF0dXJlc19hZGRyLCBtYXNrKTsKKwkJCQltYXNrID0gVUxUUkFfSU9fRFJJVkVSX0VOQUJMRVNfSU5UUzsKKwkJCQl1aXNxdWV1ZV9JbnRlcmxvY2tlZE9yKEZlYXR1cmVzX2FkZHIsIG1hc2spOworCQkJCXJzbHRxX3dhaXRfdXNlY3MgPSA0MDAwMDAwOworCQkJfSBlbHNlIHsKKwkJCQltYXNrID0gfihVTFRSQV9JT19EUklWRVJfRU5BQkxFU19JTlRTIHwKKwkJCQkJIFVMVFJBX0lPX0RSSVZFUl9ESVNBQkxFU19JTlRTKTsKKwkJCQl1aXNxdWV1ZV9JbnRlcmxvY2tlZEFuZChGZWF0dXJlc19hZGRyLCBtYXNrKTsKKwkJCQltYXNrID0gVUxUUkFfSU9fQ0hBTk5FTF9JU19QT0xMSU5HOworCQkJCXVpc3F1ZXVlX0ludGVybG9ja2VkT3IoRmVhdHVyZXNfYWRkciwgbWFzayk7CisJCQkJcnNsdHFfd2FpdF91c2VjcyA9IDQwMDA7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAorcnF3dV9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1ZlsxNl07CisJaW50IGksIHVzZWNzOworCisJaWYgKGNvdW50ID49IEFSUkFZX1NJWkUoYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlMT0dFUlIoImNvcHlfZnJvbV91c2VyIGZhaWxlZC4gYnVmPDwlLipzPj4gY291bnQ8PCVsdT4+XG4iLAorCQkgICAgICAgKGludCkgY291bnQsIGJ1ZiwgY291bnQpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpID0gc3NjYW5mKGJ1ZiwgIiVkIiwgJnVzZWNzKTsKKworCWlmIChpIDwgMSkgeworCQlMT0dFUlIoIkZhaWxlZCB0byBzY2FuIHZhbHVlIGZvciBycXdhaXRfdXNlY3MgYnVmPDwlLipzPj4iLAorCQkgICAgICAgKGludCkgY291bnQsIGJ1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIHNldCBnbG9iYWwgd2FpdCB0aW1lICovCisJcnNsdHFfd2FpdF91c2VjcyA9IHVzZWNzOworCXJldHVybiBjb3VudDsKK30KKworLyogQXMgcGVyIFZpcnRwY2lGdW5jIHJldHVybnMgMSBmb3Igc3VjY2VzcyBhbmQgMCBmb3IgZmFpbHVyZSAqLworc3RhdGljIGludAordmlydGhiYV9zZXJ2ZXJ1cChzdHJ1Y3QgdmlydHBjaV9kZXYgKnZpcnRwY2lkZXYpCit7CisJc3RydWN0IHZpcnRoYmFfaW5mbyAqdmlydGhiYWluZm8gPQorCSAgICAoc3RydWN0IHZpcnRoYmFfaW5mbyAqKSAoKHN0cnVjdCBTY3NpX0hvc3QgKikgdmlydHBjaWRldi0+c2NzaS4KKwkJCQkgICAgIHNjc2lob3N0KS0+aG9zdGRhdGE7CisKKwlEQkdJTkYoInZpcnRwY2lkZXYgYnVzTm88PCVkPj5kZXZObzw8JWQ+PiIsIHZpcnRwY2lkZXYtPmJ1c05vLAorCSAgICAgICB2aXJ0cGNpZGV2LT5kZXZpY2VObyk7CisKKwlpZiAoIXZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duKSB7CisJCURCR0lORigiU2VydmVyIHVwIG1lc3NhZ2UgcmVjaWV2ZWQgd2hpbGUgc2VydmVyIGlzIGFscmVhZHkgdXAuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICh2aXJ0aGJhaW5mby0+c2VydmVyY2hhbmdpbmdzdGF0ZSkgeworCQlMT0dFUlIoIlNlcnZlciBhbHJlYWR5IHByb2Nlc3NpbmcgY2hhbmdlIHN0YXRlIG1lc3NhZ2VcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl2aXJ0aGJhaW5mby0+c2VydmVyY2hhbmdpbmdzdGF0ZSA9IHRydWU7CisJLyogTXVzdCB0cmFuc2l0aW9uIGNoYW5uZWwgdG8gQVRUQUNIRUQgc3RhdGUgQkVGT1JFIHdlCisJICogY2FuIHN0YXJ0IHVzaW5nIHRoZSBkZXZpY2UgYWdhaW4KKwkgKi8KKwlVTFRSQV9DSEFOTkVMX0NMSUVOVF9UUkFOU0lUSU9OKHZpcnRoYmFpbmZvLT5jaGluZm8ucXVldWVpbmZvLT5jaGFuLAorCQkJCQlkZXZfbmFtZSgmdmlydHBjaWRldi0+Z2VuZXJpY19kZXYpLAorCQkJCQlDSEFOTkVMQ0xJX0FUVEFDSEVELCBOVUxMKTsKKworCS8qIFN0YXJ0IFByb2Nlc3NpbmcgdGhlIElPVk0gUmVzcG9uc2UgUXVldWUgQWdhaW4gKi8KKwlpZiAoIXVpc3RocmVhZF9zdGFydCgmdmlydGhiYWluZm8tPmNoaW5mby50aHJlYWRpbmZvLAorCQkJICAgICBwcm9jZXNzX2luY29taW5nX3JzcHMsCisJCQkgICAgIHZpcnRoYmFpbmZvLCAidmhiYV9pbmNvbWluZyIpKSB7CisJCUxPR0VSUigidWlzdGhyZWFkX3N0YXJ0IHJzcCAqKioqRkFJTEVEXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duID0gZmFsc2U7CisJdmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUgPSBmYWxzZTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAordmlydGhiYV9zZXJ2ZXJkb3duX2NvbXBsZXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aXJ0aGJhaW5mbzsKKwlzdHJ1Y3QgdmlydHBjaV9kZXYgKnZpcnRwY2lkZXY7CisJaW50IGk7CisJc3RydWN0IHNjc2lwZW5kaW5nICpwZW5kaW5nZGVsID0gTlVMTDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kID0gTlVMTDsKKwlzdHJ1Y3QgdWlzY21kcnNwICpjbWRyc3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXZpcnRoYmFpbmZvID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2aXJ0aGJhX2luZm8sCisJCQkJICAgc2VydmVyZG93bl9jb21wbGV0aW9uKTsKKworCS8qIFN0b3AgVXNpbmcgdGhlIElPVk0gUmVzcG9uc2UgUXVldWUgKHF1ZXVlIHNob3VsZCBiZSBkcmFpbmVkCisJICogYnkgdGhlIGVuZCkKKwkgKi8KKwl1aXN0aHJlYWRfc3RvcCgmdmlydGhiYWluZm8tPmNoaW5mby50aHJlYWRpbmZvKTsKKworCS8qIEZhaWwgQ29tbWFuZHMgdGhhdCB3ZXJlbid0IGNvbXBsZXRlZCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aXJ0aGJhaW5mby0+cHJpdmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1BFTkRJTkdfUkVRVUVTVFM7IGkrKykgeworCQlwZW5kaW5nZGVsID0gJih2aXJ0aGJhaW5mby0+cGVuZGluZ1tpXSk7CisJCXN3aXRjaCAocGVuZGluZ2RlbC0+Y21kdHlwZSkgeworCQljYXNlIENNRF9TQ1NJX1RZUEU6CisJCQlzY3NpY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgcGVuZGluZ2RlbC0+c2VudDsKKwkJCXNjc2ljbWQtPnJlc3VsdCA9IChESURfUkVTRVQgPDwgMTYpOworCQkJaWYgKHNjc2ljbWQtPnNjc2lfZG9uZSkKKwkJCQlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfU0NTSVRBU0tNR01UX1RZUEU6CisJCQljbWRyc3AgPSAoc3RydWN0IHVpc2NtZHJzcCAqKSBwZW5kaW5nZGVsLT5zZW50OworCQkJREJHSU5GKCJjbWRyc3A9MHgleCwgbm90aWZ5PTB4JXhcbiIsIGNtZHJzcCwKKwkJCSAgICAgICBjbWRyc3AtPnNjc2l0YXNrbWdtdC5ub3RpZnkpOworCQkJKihpbnQgKikgY21kcnNwLT5zY3NpdGFza21nbXQubm90aWZ5cmVzdWx0ID0KKwkJCSAgICBUQVNLX01HTVRfRkFJTEVEOworCQkJd2FrZV91cF9hbGwoKHdhaXRfcXVldWVfaGVhZF90ICopCisJCQkJICAgIGNtZHJzcC0+c2NzaXRhc2ttZ210Lm5vdGlmeSk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfVkRJU0tNR01UX1RZUEU6CisJCQljbWRyc3AgPSAoc3RydWN0IHVpc2NtZHJzcCAqKSBwZW5kaW5nZGVsLT5zZW50OworCQkJKihpbnQgKikgY21kcnNwLT52ZGlza21nbXQubm90aWZ5cmVzdWx0ID0KKwkJCSAgICBWRElTS19NR01UX0ZBSUxFRDsKKwkJCXdha2VfdXBfYWxsKCh3YWl0X3F1ZXVlX2hlYWRfdCAqKQorCQkJCSAgICBjbWRyc3AtPnZkaXNrbWdtdC5ub3RpZnkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAocGVuZGluZ2RlbC0+c2VudCAhPSBOVUxMKQorCQkJCUxPR0VSUigiVW5rbm93biBjb21tYW5kIHR5cGU6IDB4JXguICBPbmx5IGZyZWVpbmcgbGlzdCBzdHJ1Y3R1cmUuXG4iLAorCQkJCSAgICAgcGVuZGluZ2RlbC0+Y21kdHlwZSk7CisJCX0KKwkJcGVuZGluZ2RlbC0+Y21kdHlwZSA9IDA7CisJCXBlbmRpbmdkZWwtPnNlbnQgPSBOVUxMOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aXJ0aGJhaW5mby0+cHJpdmxvY2ssIGZsYWdzKTsKKworCXZpcnRwY2lkZXYgPSB2aXJ0aGJhaW5mby0+dmlydHBjaWRldjsKKworCURCR0lORigidmlydHBjaWRldiBidXNObzw8JWQ+PmRldk5vPDwlZD4+IiwgdmlydHBjaWRldi0+YnVzTm8sCisJICAgICAgIHZpcnRwY2lkZXYtPmRldmljZU5vKTsKKwl2aXJ0aGJhaW5mby0+c2VydmVyZG93biA9IHRydWU7CisJdmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUgPSBmYWxzZTsKKwkvKiBSZXR1cm4gdGhlIFNlcnZlckRvd24gcmVzcG9uc2UgdG8gQ29tbWFuZCAqLworCXZpc29yY2hpcHNldF9kZXZpY2VfcGF1c2VfcmVzcG9uc2UodmlydHBjaWRldi0+YnVzTm8sCisJCQkJCSAgIHZpcnRwY2lkZXYtPmRldmljZU5vLCAwKTsKK30KKworLyogQXMgcGVyIFZpcnRwY2lGdW5jIHJldHVybnMgMSBmb3Igc3VjY2VzcyBhbmQgMCBmb3IgZmFpbHVyZSAqLworc3RhdGljIGludAordmlydGhiYV9zZXJ2ZXJkb3duKHN0cnVjdCB2aXJ0cGNpX2RldiAqdmlydHBjaWRldiwgdTMyIHN0YXRlKQoreworCXN0cnVjdCB2aXJ0aGJhX2luZm8gKnZpcnRoYmFpbmZvID0KKwkgICAgKHN0cnVjdCB2aXJ0aGJhX2luZm8gKikgKChzdHJ1Y3QgU2NzaV9Ib3N0ICopIHZpcnRwY2lkZXYtPnNjc2kuCisJCQkJICAgICBzY3NpaG9zdCktPmhvc3RkYXRhOworCisJREJHSU5GKCJ2aXJ0aGJhX3NlcnZlcmRvd24iKTsKKwlEQkdJTkYoInZpcnRwY2lkZXYgYnVzTm88PCVkPj5kZXZObzw8JWQ+PiIsIHZpcnRwY2lkZXYtPmJ1c05vLAorCSAgICAgICB2aXJ0cGNpZGV2LT5kZXZpY2VObyk7CisKKwlpZiAoIXZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duICYmICF2aXJ0aGJhaW5mby0+c2VydmVyY2hhbmdpbmdzdGF0ZSkgeworCQl2aXJ0aGJhaW5mby0+c2VydmVyY2hhbmdpbmdzdGF0ZSA9IHRydWU7CisJCXF1ZXVlX3dvcmsodmlydGhiYV9zZXJ2ZXJkb3duX3dvcmtxdWV1ZSwKKwkJCSAgICZ2aXJ0aGJhaW5mby0+c2VydmVyZG93bl9jb21wbGV0aW9uKTsKKwl9IGVsc2UgaWYgKHZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlKSB7CisJCUxPR0VSUigiU2VydmVyIGFscmVhZHkgcHJvY2Vzc2luZyBjaGFuZ2Ugc3RhdGUgbWVzc2FnZVxuIik7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlMT0dFUlIoIlNlcnZlciBhbHJlYWR5IGRvd24sIGJ1dCBhbm90aGVyIHNlcnZlciBkb3duIG1lc3NhZ2UgcmVjZWl2ZWQuIik7CisKKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTW9kdWxlIEluaXQgJiBFeGl0IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9faW5pdAordmlydGhiYV9wYXJzZV9saW5lKGNoYXIgKnN0cikKK3sKKwlEQkdJTkYoIkluIHZpcnRoYmFfcGFyc2VfbGluZSAlc1xuIiwgc3RyKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX19pbml0Cit2aXJ0aGJhX3BhcnNlX29wdGlvbnMoY2hhciAqbGluZSkKK3sKKwljaGFyICpuZXh0ID0gbGluZTsKKworCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9DUkVBVEVfRU5UUllfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCWlmIChsaW5lID09IE5VTEwgfHwgISpsaW5lKQorCQlyZXR1cm47CisJd2hpbGUgKChsaW5lID0gbmV4dCkgIT0gTlVMTCkgeworCQluZXh0ID0gc3RyY2hyKGxpbmUsICcgJyk7CisJCWlmIChuZXh0ICE9IE5VTEwpCisJCQkqbmV4dCsrID0gMDsKKwkJaWYgKCF2aXJ0aGJhX3BhcnNlX2xpbmUobGluZSkpCisJCQlEQkdJTkYoIlVua25vd24gb3B0aW9uICclcydcbiIsIGxpbmUpOworCX0KKworCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9DUkVBVEVfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0Cit2aXJ0aGJhX21vZF9pbml0KHZvaWQpCit7CisJaW50IGVycm9yOworCWludCBpOworCisJTE9HSU5GKCJFbnRlcmluZyB2aXJ0aGJhX21vZF9pbml0Li4uXG4iKTsKKworCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9DUkVBVEVfRU5UUllfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCXZpcnRoYmFfcGFyc2Vfb3B0aW9ucyh2aXJ0aGJhX29wdGlvbnMpOworCisJZXJyb3IgPSB2aXJ0cGNpX3JlZ2lzdGVyX2RyaXZlcigmdmlydGhiYV9kcml2ZXIpOworCWlmIChlcnJvciA8IDApIHsKKwkJTE9HRVJSKCJyZWdpc3RlciAqKioqRkFJTEVEIDB4JXhcbiIsIGVycm9yKTsKKwkJUE9TVENPREVfTElOVVhfMyhWSEJBX0NSRUFURV9GQUlMVVJFX1BDLCBlcnJvciwKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwl9IGVsc2UgeworCQkvKiBjcmVhdGUgdGhlIHByb2MgZGlyZWN0b3JpZXMgKi8KKwkJdmlydGhiYV9wcm9jX2RpciA9IHByb2NfbWtkaXIoRElSX1BST0NfRU5UUlksIE5VTEwpOworCQlpbmZvX3Byb2NfZW50cnkgPSBwcm9jX2NyZWF0ZShJTkZPX1BST0NfRU5UUllfRk4sIDAsCisJCQkJCSAgICAgIHZpcnRoYmFfcHJvY19kaXIsCisJCQkJCSAgICAgICZwcm9jX2luZm9fZm9wcyk7CisJCXJxd2FpdHVzX3Byb2NfZW50cnkgPSBwcm9jX2NyZWF0ZShSUVdVX1BST0NfRU5UUllfRk4sIDAsCisJCQkJCQkgIHZpcnRoYmFfcHJvY19kaXIsCisJCQkJCQkgICZwcm9jX3Jxd3VfZm9wcyk7CisJCWVuYWJsZV9pbnRzX3Byb2NfZW50cnkgPSBwcm9jX2NyZWF0ZShFTkFCTEVfSU5UU19FTlRSWV9GTiwgMCwKKwkJCQkJCSAgICAgdmlydGhiYV9wcm9jX2RpciwKKwkJCQkJCSAgICAgJnByb2NfZW5hYmxlX2ludHNfZm9wcyk7CisKKwkJLyogSW5pdGlhbGl6ZSBEQVJXb3JrUSAqLworCQlJTklUX1dPUksoJkRBUldvcmtRLCBkb0Rpc2tBZGRSZW1vdmUpOworCQlzcGluX2xvY2tfaW5pdCgmREFSV29ya1FMb2NrKTsKKworCQkvKiBjbGVhciBvdXQgYXJyYXkgKi8KKwkJZm9yIChpID0gMDsgaSA8IFZJUlRIQkFTT1BFTk1BWDsgaSsrKQorCQkJVmlydEhiYXNPcGVuW2ldLnZpcnRoYmFpbmZvID0gTlVMTDsKKwkJLyogSW5pdGlhbGl6ZSB0aGUgc2VydmVyZG93biB3b3JrcXVldWUgKi8KKwkJdmlydGhiYV9zZXJ2ZXJkb3duX3dvcmtxdWV1ZSA9CisJCSAgICBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgidmlydGhiYV9zZXJ2ZXJkb3duIik7CisJCWlmICh2aXJ0aGJhX3NlcnZlcmRvd25fd29ya3F1ZXVlID09IE5VTEwpIHsKKwkJCUxPR0VSUigiKioqKiBGQUlMRUQgdmlydGhiYV9zZXJ2ZXJkb3duX3dvcmtxdWV1ZSBjcmVhdGlvblxuIik7CisJCQlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfQ1JFQVRFX0ZBSUxVUkVfUEMsCisJCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQkJZXJyb3IgPSAtMTsKKwkJfQorCX0KKworCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9DUkVBVEVfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJTE9HSU5GKCJMZWF2aW5nIHZpcnRoYmFfbW9kX2luaXRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHNzaXplX3QKK3ZpcnRoYmFfYWNxdWlyZV9sdW4oc3RydWN0IGRldmljZSAqY2Rldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgdWlzc2NzaV9kZXN0IHZkZXN0OworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJaW50IGk7CisKKwlpID0gc3NjYW5mKGJ1ZiwgIiVkLSVkLSVkIiwgJnZkZXN0LmNoYW5uZWwsICZ2ZGVzdC5pZCwgJnZkZXN0Lmx1bik7CisJaWYgKGkgIT0gMykKKwkJcmV0dXJuIGk7CisKKwlyZXR1cm4gZm9yd2FyZF92ZGlza21nbXRfY29tbWFuZChWRElTS19NR01UX0FDUVVJUkUsIHNob3N0LCAmdmRlc3QpOworfQorCitzdGF0aWMgc3NpemVfdAordmlydGhiYV9yZWxlYXNlX2x1bihzdHJ1Y3QgZGV2aWNlICpjZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB1aXNzY3NpX2Rlc3QgdmRlc3Q7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlpbnQgaTsKKworCWkgPSBzc2NhbmYoYnVmLCAiJWQtJWQtJWQiLCAmdmRlc3QuY2hhbm5lbCwgJnZkZXN0LmlkLCAmdmRlc3QubHVuKTsKKwlpZiAoaSAhPSAzKQorCQlyZXR1cm4gaTsKKworCXJldHVybiBmb3J3YXJkX3ZkaXNrbWdtdF9jb21tYW5kKFZESVNLX01HTVRfUkVMRUFTRSwgc2hvc3QsICZ2ZGVzdCk7Cit9CisKKyNkZWZpbmUgQ0xBU1NfREVWSUNFX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKSAgICAgIFwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBjbGFzc19kZXZpY2VfYXR0cl8jI19uYW1lID0gICBcCisJCV9fQVRUUihfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUpCisKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihhY3F1aXJlX2x1biwgU19JV1VTUiwgTlVMTCwgdmlydGhiYV9hY3F1aXJlX2x1bik7CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIocmVsZWFzZV9sdW4sIFNfSVdVU1IsIE5VTEwsIHZpcnRoYmFfcmVsZWFzZV9sdW4pOworCitzdGF0aWMgREVWSUNFX0FUVFJJQlVURSAqdmlydGhiYV9zaG9zdF9hdHRyc1tdID0geworCSZjbGFzc19kZXZpY2VfYXR0cl9hY3F1aXJlX2x1biwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfcmVsZWFzZV9sdW4sCisJTlVMTAorfTsKKworc3RhdGljIHZvaWQgX19leGl0Cit2aXJ0aGJhX21vZF9leGl0KHZvaWQpCit7CisJTE9HSU5GKCJlbnRlcmluZyB2aXJ0aGJhX21vZF9leGl0Li4uXG4iKTsKKworCXZpcnRwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnZpcnRoYmFfZHJpdmVyKTsKKwkvKiB1bnJlZ2lzdGVyIGlzIGdvaW5nIHRvIGNhbGwgdmlydGhiYV9yZW1vdmUgKi8KKwkvKiBkZXN0cm95IHNlcnZlcmRvd24gY29tcGxldGlvbiB3b3JrcXVldWUgKi8KKwlpZiAodmlydGhiYV9zZXJ2ZXJkb3duX3dvcmtxdWV1ZSkgeworCQlkZXN0cm95X3dvcmtxdWV1ZSh2aXJ0aGJhX3NlcnZlcmRvd25fd29ya3F1ZXVlKTsKKwkJdmlydGhiYV9zZXJ2ZXJkb3duX3dvcmtxdWV1ZSA9IE5VTEw7CisJfQorCisJaWYgKGluZm9fcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoSU5GT19QUk9DX0VOVFJZX0ZOLCB2aXJ0aGJhX3Byb2NfZGlyKTsKKworCWlmIChycXdhaXR1c19wcm9jX2VudHJ5KQorCQlyZW1vdmVfcHJvY19lbnRyeShSUVdVX1BST0NfRU5UUllfRk4sIE5VTEwpOworCisJaWYgKGVuYWJsZV9pbnRzX3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KEVOQUJMRV9JTlRTX0VOVFJZX0ZOLCBOVUxMKTsKKworCWlmICh2aXJ0aGJhX3Byb2NfZGlyKQorCQlyZW1vdmVfcHJvY19lbnRyeShESVJfUFJPQ19FTlRSWSwgTlVMTCk7CisKKwlMT0dJTkYoIkxlYXZpbmcgdmlydGhiYV9tb2RfZXhpdFxuIik7CisKK30KKworLyogc3BlY2lmeSBmdW5jdGlvbiB0byBiZSBydW4gYXQgbW9kdWxlIGluc2VydGlvbiB0aW1lICovCittb2R1bGVfaW5pdCh2aXJ0aGJhX21vZF9pbml0KTsKKworLyogc3BlY2lmeSBmdW5jdGlvbiB0byBiZSBydW4gd2hlbiBtb2R1bGUgaXMgcmVtb3ZlZCAqLworbW9kdWxlX2V4aXQodmlydGhiYV9tb2RfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlVzaGEgU3Jpbml2YXNhbiIpOworTU9EVUxFX0FMSUFTKCJ1aXN2aXJ0aGJhIik7CisJLyogdGhpcyBpcyBleHRyYWN0ZWQgZHVyaW5nIGRlcG1vZCBhbmQga2VwdCBpbiBtb2R1bGVzLmRlcCAqLworLyogbW9kdWxlIHBhcmFtZXRlciAqLworbW9kdWxlX3BhcmFtKHZpcnRoYmFfb3B0aW9ucywgY2hhcnAsIFNfSVJVR08pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL3ZpcnRoYmEuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS92aXJ0aGJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiNzk3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS92aXJ0aGJhLmgKQEAgLTAsMCArMSwzMSBAQAorLyogdmlydGhiYS5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKgorICogVW5pc3lzIFZpcnR1YWwgSEJBIGRyaXZlciBoZWFkZXIKKyAqLworCisKKworI2lmbmRlZiBfX1ZJUlRIQkFfSF9fCisjZGVmaW5lIF9fVklSVEhCQV9IX18KKworCisjZGVmaW5lIFZJUlRIQkFfVkVSU0lPTiAiMDEuMDAiCisKKworI2VuZGlmIC8qIF9fVklSVEhCQV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydHBjaS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU5ZWZjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydHBjaS9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgVW5pc3lzIHZpcnRwY2kgY29uZmlndXJhdGlvbgorIworCitjb25maWcgVU5JU1lTX1ZJUlRQQ0kKKwl0cmlzdGF0ZSAiVW5pc3lzIHZpcnRwY2kgZHJpdmVyIgorCWRlcGVuZHMgb24gVU5JU1lTU1BBUiAmJiBVTklTWVNfVUlTTElCCisJLS0taGVscC0tLQorCUlmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBlbmFibGUgdGhlIFVuaXN5cyB2aXJ0cGNpIGRyaXZlci4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Mzk5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRwY2kvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIworIyBNYWtlZmlsZSBmb3IgVW5pc3lzIHZpcnRwY2kKKyMKKworb2JqLSQoQ09ORklHX1VOSVNZU19WSVJUUENJKQkrPSB2aXJ0cGNpLm8KKworY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYgorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMKKworY2NmbGFncy15ICs9IC1EQ09ORklHX1NQQVJfR1VFU1QgLURHVUVTVERSSVZFUkJVSUxEIC1ETk9BVVRPVkVSU0lPTgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRwY2kvdmlydHBjaS5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL3ZpcnRwY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTM0NjUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL3ZpcnRwY2kuYwpAQCAtMCwwICsxLDE3NzEgQEAKKy8qIHZpcnRwY2kuYworICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2RlZmluZSBFWFBPUlRfU1lNVEFCCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpZmRlZiBDT05GSUdfTU9EVkVSU0lPTlMKKyNpbmNsdWRlIDxjb25maWcvbW9kdmVyc2lvbnMuaD4KKyNlbmRpZgorI2luY2x1ZGUgInVuaWtsb2cuaCIKKyNpbmNsdWRlICJkaWFnbm9zdGljcy9hcHBvc19zdWJzeXN0ZW1zLmgiCisjaW5jbHVkZSAidWlzdXRpbHMuaCIKKyNpbmNsdWRlICJjb21tb250eXBlcy5oIgorI2luY2x1ZGUgInZidXNjaGFubmVsLmgiCisjaW5jbHVkZSAidmJ1c2hlbHBlci5oIgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisjaW5jbHVkZSAiZ3Vlc3RsaW51eGRlYnVnLmgiCisKK3N0cnVjdCBkcml2ZXJfcHJpdmF0ZSB7CisJc3RydWN0IGtvYmplY3Qga29iajsKKwlzdHJ1Y3Qga2xpc3Qga2xpc3RfZGV2aWNlczsKKwlzdHJ1Y3Qga2xpc3Rfbm9kZSBrbm9kZV9idXM7CisJc3RydWN0IG1vZHVsZV9rb2JqZWN0ICpta29iajsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyOworfTsKKyNkZWZpbmUgdG9fZHJpdmVyKG9iaikgY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGRyaXZlcl9wcml2YXRlLCBrb2JqKQorCisvKiBidXNfaWQgd2VudCBhd2F5IGluIDIuNi4zMCAtIHRoZSBzaXplIHdhcyAyMCBieXRlcywgc28gd2UnbGwgZGVmaW5lCisgKiBpdCBvdXJzZWx2ZXMsIGFuZCBhIG1hY3JvIHRvIG1ha2UgZ2V0dGluZyB0aGUgZmllbGQgYSBiaXQgc2ltcGxlci4KKyAqLworI2lmbmRlZiBCVVNfSURfU0laRQorI2RlZmluZSBCVVNfSURfU0laRSAyMAorI2VuZGlmCisKKyNkZWZpbmUgQlVTX0lEKHgpIGRldl9uYW1lKHgpCisKKyNpbmNsdWRlICJ2aXJ0cGNpLmgiCisKKy8qIHRoaXMgaXMgc2hvcnRlciB0aGFuIHVzaW5nIF9fRklMRV9fIChmdWxsIHBhdGggbmFtZSkgaW4KKyAqIGRlYnVnL2luZm8vZXJyb3IgbWVzc2FnZXMKKyAqLworI2RlZmluZSBDVVJSRU5UX0ZJTEVfUEMgVklSVF9QQ0lfUENfdmlydHBjaV9jCisjZGVmaW5lIF9fTVlGSUxFX18gInZpcnRwY2kuYyIKKworI2RlZmluZSBWSVJUUENJX1ZFUlNJT04gIjAxLjAwIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgZGVsZXRlX3ZidXNfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKnZidXMsIHZvaWQgKmRhdGEpOworc3RhdGljIGludCBtYXRjaF9idXNpZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgdmlydHBjaV9idXNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdmlydHBjaV9kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIGludCB2aXJ0cGNpX2RldmljZV9hZGQoc3RydWN0IGRldmljZSAqcGFyZW50YnVzLCBpbnQgZGV2dHlwZSwKKwkJCSAgICAgIHN0cnVjdCBhZGRfdmlydF9ndWVzdHBhcnQgKmFkZHBhcmFtcywKKwkJCSAgICAgIHN0cnVjdCBzY3NpX2FkYXBfaW5mbyAqc2NzaSwKKwkJCSAgICAgIHN0cnVjdCBuZXRfYWRhcF9pbmZvICpuZXQpOworc3RhdGljIGludCB2aXJ0cGNpX2RldmljZV9kZWwoc3RydWN0IGRldmljZSAqcGFyZW50YnVzLCBpbnQgZGV2dHlwZSwKKwkJCSAgICAgIHN0cnVjdCB2aGJhX3d3bm4gKnd3bm4sIHVuc2lnbmVkIGNoYXIgbWFjYWRkcltdKTsKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2Vfc2VydmVyZG93bihzdHJ1Y3QgZGV2aWNlICpwYXJlbnRidXMsIGludCBkZXZ0eXBlLAorCQkJCSAgICAgc3RydWN0IHZoYmFfd3dubiAqd3dubiwKKwkJCQkgICAgIHVuc2lnbmVkIGNoYXIgbWFjYWRkcltdKTsKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2Vfc2VydmVydXAoc3RydWN0IGRldmljZSAqcGFyZW50YnVzLCBpbnQgZGV2dHlwZSwKKwkJCQkgICBzdHJ1Y3QgdmhiYV93d25uICp3d25uLAorCQkJCSAgIHVuc2lnbmVkIGNoYXIgbWFjYWRkcltdKTsKK3N0YXRpYyBzc2l6ZV90IHZpcnRwY2lfZHJpdmVyX2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKK3N0YXRpYyBzc2l6ZV90IHZpcnRwY2lfZHJpdmVyX2F0dHJfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJCSBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworc3RhdGljIGludCB2aXJ0cGNpX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpOworc3RhdGljIGludCB2aXJ0cGNpX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudik7CitzdGF0aWMgaW50IHZpcnRwY2lfZGV2aWNlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworc3RhdGljIGludCB2aXJ0cGNpX2RldmljZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2VfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgc3NpemVfdCB2aXJ0X3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHNzaXplX3QgaW5mb19wcm9jX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfdmlydF9mb3BzID0geworCS53cml0ZSA9IHZpcnRfcHJvY193cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfaW5mb19mb3BzID0geworCS5yZWFkID0gaW5mb19wcm9jX3JlYWQsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHbG9iYWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIG1ldGhvZHMgaW4gYnVzX3R5cGUgc3RydWN0IGFsbG93IHRoZSBidXMgY29kZSB0byBzZXJ2ZSBhcyBhbgorICogaW50ZXJtZWRpYXJ5IGJldHdlZW4gdGhlIGRldmljZSBjb3JlIGFuZCBpbmRpdmlkdWFsIGRldmljZSBjb3JlIGFuZAorICogaW5kaXZpZHVhbCBkcml2ZXJzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgdmlydHBjaV9idXNfdHlwZSA9IHsKKwkubmFtZSA9ICJ1aXN2aXJ0cGNpIiwKKwkubWF0Y2ggPSB2aXJ0cGNpX2J1c19tYXRjaCwKKwkudWV2ZW50ID0gdmlydHBjaV91ZXZlbnQsCisJLnN1c3BlbmQgPSB2aXJ0cGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUgPSB2aXJ0cGNpX2RldmljZV9yZXN1bWUsCit9OworCitzdGF0aWMgc3RydWN0IGRldmljZSB2aXJ0cGNpX3Jvb3RidXNfZGV2aWNlID0geworCS5pbml0X25hbWUgPSAidmJ1c3Jvb3QiLAkvKiByb290IGJ1cyAqLworCS5yZWxlYXNlID0gdmlydHBjaV9idXNfcmVsZWFzZQorfTsKKworLyogZmlsbGVkIGluIHdpdGggaW5mbyBhYm91dCBwYXJlbnQgY2hpcHNldCBkcml2ZXIgd2hlbiB3ZSByZWdpc3RlciB3aXRoIGl0ICovCitzdGF0aWMgVUxUUkFfVkJVU19ERVZJQ0VJTkZPIENoaXBzZXRfRHJpdmVySW5mbzsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMgdmlydHBjaV9kcml2ZXJfc3lzZnNfb3BzID0geworCS5zaG93ID0gdmlydHBjaV9kcml2ZXJfYXR0cl9zaG93LAorCS5zdG9yZSA9IHZpcnRwY2lfZHJpdmVyX2F0dHJfc3RvcmUsCit9OworCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSB2aXJ0cGNpX2RyaXZlcl9rb2JqX3R5cGUgPSB7CisJLnN5c2ZzX29wcyA9ICZ2aXJ0cGNpX2RyaXZlcl9zeXNmc19vcHMsCit9OworCitzdGF0aWMgc3RydWN0IHZpcnRwY2lfZGV2ICpWcGNpZGV2TGlzdEhlYWQ7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhWcGNpZGV2TGlzdExvY2spOworCisvKiBmaWxsZWQgaW4gd2l0aCBpbmZvIGFib3V0IHRoaXMgZHJpdmVyLCB3cnQgaXQgc2VydmljaW5nIGNsaWVudCBidXNzZXMgKi8KK3N0YXRpYyBVTFRSQV9WQlVTX0RFVklDRUlORk8gQnVzX0RyaXZlckluZm87CisKKy8qIHZpcnRwY2lfcHJvY19kaXJfZW50cnkgaXMgdXNlZCB0byBjcmVhdGUgdGhlIHByb2MgZW50cnkgZGlyZWN0b3J5CisgKiBmb3IgdmlydHBjaQorICovCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp2aXJ0cGNpX3Byb2NfZGlyOworLyogdmlydF9wcm9jX2VudHJ5IGlzIHVzZWQgdG8gdGVsbCB2aXJ0cGNpIHRvIGFkZC9kZWxldGUgdmhiYXMvdm5pY3MvdmJ1c2VzICovCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp2aXJ0X3Byb2NfZW50cnk7CisvKiBpbmZvX3Byb2NfZW50cnkgaXMgdXNlZCB0byB0ZWxsIHZpcnRwY2kgdG8gZGlzcGxheSBjdXJyZW50IGluZm8KKyAqIGtlcHQgaW4gdGhlIGRyaXZlcgorICovCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICppbmZvX3Byb2NfZW50cnk7CisjZGVmaW5lIFZJUlRfUFJPQ19FTlRSWV9GTiAidmlydCIKKyNkZWZpbmUgSU5GT19QUk9DX0VOVFJZX0ZOICJpbmZvIgorI2RlZmluZSBESVJfUFJPQ19FTlRSWSAidmlydHBjaSIKKworc3RydWN0IHZpcnRwY2lfYnVzZGV2IHsKKwlzdHJ1Y3QgZGV2aWNlIHZpcnRwY2lfYnVzX2RldmljZTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIExvY2FsIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZQoraW50IFdBSVRfRk9SX0lPX0NIQU5ORUwoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCBfX2lvbWVtICAqY2hhbnB0cikKK3sKKwlpbnQgY291bnQgPSAxMjA7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCisJCWlmIChVTFRSQV9DSEFOTkVMX1NFUlZFUl9SRUFEWSgmY2hhbnB0ci0+Q2hhbm5lbEhlYWRlcikpCisJCQlyZXR1cm4gMTsKKwkJVUlTX1RIUkVBRF9XQUlUX1NFQygxKTsKKwkJY291bnQtLTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFdyaXRlIHRoZSBjb250ZW50cyBvZiA8aW5mbz4gdG8gdGhlIFVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTC5DaHBJbmZvLiAqLworc3RhdGljIGludCB3cml0ZV92YnVzX2NocEluZm8oVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MICpjaGFuLAorCQkJICAgICAgVUxUUkFfVkJVU19ERVZJQ0VJTkZPICppbmZvKQoreworCWludCBvZmY7CisJaWYgKCFjaGFuKSB7CisJCUxPR0VSUigidmJ1cyBjaGFubmVsIG5vdCBwcmVzZW50Iik7CisJCXJldHVybiAtMTsKKwl9CisJb2ZmID0gc2l6ZW9mKFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wpICsgY2hhbi0+SGRySW5mby5jaHBJbmZvQnl0ZU9mZnNldDsKKwlpZiAoY2hhbi0+SGRySW5mby5jaHBJbmZvQnl0ZU9mZnNldCA9PSAwKSB7CisJCUxPR0VSUigidmJ1cyBjaGFubmVsIG5vdCB1c2VkLCBiZWNhdXNlIGNocEluZm9CeXRlT2Zmc2V0ID09IDAiKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1jcHkoKChVOCAqKSAoY2hhbikpICsgb2ZmLCBpbmZvLCBzaXplb2YoKmluZm8pKTsKKwlyZXR1cm4gMDsKK30KKworLyogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIDxpbmZvPiB0byB0aGUgVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MLkJ1c0luZm8uICovCitzdGF0aWMgaW50IHdyaXRlX3ZidXNfYnVzSW5mbyhVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wgKmNoYW4sCisJCQkgICAgICBVTFRSQV9WQlVTX0RFVklDRUlORk8gKmluZm8pCit7CisJaW50IG9mZjsKKwlpZiAoIWNoYW4pIHsKKwkJTE9HRVJSKCJ2YnVzIGNoYW5uZWwgbm90IHByZXNlbnQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlvZmYgPSBzaXplb2YoVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTCkgKyBjaGFuLT5IZHJJbmZvLmJ1c0luZm9CeXRlT2Zmc2V0OworCWlmIChjaGFuLT5IZHJJbmZvLmJ1c0luZm9CeXRlT2Zmc2V0ID09IDApIHsKKwkJTE9HRVJSKCJ2YnVzIGNoYW5uZWwgbm90IHVzZWQsIGJlY2F1c2UgYnVzSW5mb0J5dGVPZmZzZXQgPT0gMCIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbWNweSgoKFU4ICopIChjaGFuKSkgKyBvZmYsIGluZm8sIHNpemVvZigqaW5mbykpOworCXJldHVybiAwOworfQorCisvKiBXcml0ZSB0aGUgY29udGVudHMgb2YgPGluZm8+IHRvIHRoZQorICogVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MLkRldkluZm9bPGRldml4Pl0uCisgKi8KK3N0YXRpYyBpbnQKK3dyaXRlX3ZidXNfZGV2SW5mbyhVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wgKmNoYW4sCisJCSAgIFVMVFJBX1ZCVVNfREVWSUNFSU5GTyAqaW5mbywgaW50IGRldml4KQoreworCWludCBvZmY7CisJaWYgKCFjaGFuKSB7CisJCUxPR0VSUigidmJ1cyBjaGFubmVsIG5vdCBwcmVzZW50Iik7CisJCXJldHVybiAtMTsKKwl9CisJb2ZmID0KKwkgICAgKHNpemVvZihVTFRSQV9DSEFOTkVMX1BST1RPQ09MKSArCisJICAgICBjaGFuLT5IZHJJbmZvLmRldkluZm9CeXRlT2Zmc2V0KSArCisJICAgIChjaGFuLT5IZHJJbmZvLmRldmljZUluZm9TdHJ1Y3RCeXRlcyAqIGRldml4KTsKKwlpZiAoY2hhbi0+SGRySW5mby5kZXZJbmZvQnl0ZU9mZnNldCA9PSAwKSB7CisJCUxPR0VSUigidmJ1cyBjaGFubmVsIG5vdCB1c2VkLCBiZWNhdXNlIGRldkluZm9CeXRlT2Zmc2V0ID09IDAiKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1jcHkoKChVOCAqKSAoY2hhbikpICsgb2ZmLCBpbmZvLCBzaXplb2YoKmluZm8pKTsKKwlyZXR1cm4gMDsKK30KKworLyogYWRkcyBhIHZidXMKKyAqIHJldHVybnMgMCBmYWlsdXJlLCAxIHN1Y2Nlc3MsCisgKi8KK3N0YXRpYyBpbnQgYWRkX3ZidXMoc3RydWN0IGFkZF92YnVzX2d1ZXN0cGFydCAqYWRkcGFyYW1zKQoreworCWludCByZXQ7CisJc3RydWN0IGRldmljZSAqdmJ1czsKKwl2YnVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRldmljZSksIEdGUF9BVE9NSUMpOworCisJUE9TVENPREVfTElOVVhfMihWUENJX0NSRUFURV9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJaWYgKCF2YnVzKQorCQlyZXR1cm4gMDsKKworCWRldl9zZXRfbmFtZSh2YnVzLCAidmJ1cyVkIiwgYWRkcGFyYW1zLT5idXNObyk7CisJdmJ1cy0+cmVsZWFzZSA9IHZpcnRwY2lfYnVzX3JlbGVhc2U7CisJdmJ1cy0+cGFyZW50ID0gJnZpcnRwY2lfcm9vdGJ1c19kZXZpY2U7CS8qIHJvb3QgYnVzIGlzIHBhcmVudCAqLworCXZidXMtPmJ1cyA9ICZ2aXJ0cGNpX2J1c190eXBlOwkvKiBidXMgdHlwZSAqLworCXZidXMtPnBsYXRmb3JtX2RhdGEgPSAoX19mb3JjZSB2b2lkICopYWRkcGFyYW1zLT5jaGFucHRyOworCisJLyogcmVnaXN0ZXIgYSB2aXJ0IGJ1cyBkZXZpY2UgLQorCSAqIHRoaXMgYnVzIHNob3dzIHVwIHVuZGVyIC9zeXMvZGV2aWNlcyB3aXRoIC5uYW1lIHZhbHVlCisJICogInZpcnRwY2klZCIgYW55IGRldmljZXMgYWRkZWQgdG8gdGhpcyBidXMgdGhlbiBzaG93IHVwIHVuZGVyCisJICogL3N5cy9kZXZpY2VzL3ZpcnRwY2kwCisJICovCisJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKHZidXMpOworCWlmIChyZXQpIHsKKwkJTE9HRVJSKCJkZXZpY2VfcmVnaXN0ZXIgRkFJTEVEOiVkXG4iLCByZXQpOworCQlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiAwOworCX0KKwl3cml0ZV92YnVzX2NocEluZm8odmJ1cy0+cGxhdGZvcm1fZGF0YSAvKiBjaGFucHRyICovICwKKwkJCSAgICZDaGlwc2V0X0RyaXZlckluZm8pOworCXdyaXRlX3ZidXNfYnVzSW5mbyh2YnVzLT5wbGF0Zm9ybV9kYXRhIC8qIGNoYW5wdHIgKi8gLCAmQnVzX0RyaXZlckluZm8pOworCUxPR0lORigiQWRkZWQgdmJ1cyAlZDsgZGV2aWNlICVzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5XG4iLAorCSAgICAgICBhZGRwYXJhbXMtPmJ1c05vLCBCVVNfSUQodmJ1cykpOworCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJcmV0dXJuIDE7Cit9CisKKy8qIGZvciBDSEFOU09DSyB3d3dubi9tYXggYXJlIEFVVE8tR0VORVJBVEVEOyBmb3Igbm9ybWFsIGNoYW5uZWxzLAorICogd3dubi9tYXggYXJlIGluIHRoZSBjaGFubmVsIGhlYWRlci4KKyAqLworI2RlZmluZSBHRVRfU0NTSUFEQVBJTkZPX0ZST01fQ0hBTlBUUihjaGFucHRyKSB7CQkJXAorCW1lbWNweV9mcm9taW8oJnNjc2kud3dubiwJCQkJCVwKKwkJICAgICAgJigoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCBfX2lvbWVtICopCQlcCisJCQljaGFucHRyKS0+dmhiYS53d25uLAkJCQlcCisJCSAgICAgIHNpemVvZihzdHJ1Y3QgdmhiYV93d25uKSk7CQkJXAorCW1lbWNweV9mcm9taW8oJnNjc2kubWF4LAkJCQkJXAorCQkgICAgICAmKChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MIF9faW9tZW0gKikJCVwKKwkJCWNoYW5wdHIpLT52aGJhLm1heCwJCQkJXAorCQkgICAgICBzaXplb2Yoc3RydWN0IHZoYmFfY29uZmlnX21heCkpOwkJCVwKKwl9CisKKy8qIGZpbmQgYnVzIGRldmljZSB3aXRoIHRoZSBidXNpZCB0aGF0IG1hdGNoZXMgLSBtYXRjaF9idXNpZCBtYXRjaGVzIGJ1c19pZCAqLworI2RlZmluZSBHRVRfQlVTX0RFVihidXNubykgeyBcCisJc3ByaW50ZihidXNpZCwgInZidXMlZCIsIGJ1c25vKTsgXAorCXZidXMgPSBidXNfZmluZF9kZXZpY2UoJnZpcnRwY2lfYnVzX3R5cGUsIE5VTEwsIFwKKwkJCSAgICAgICAodm9pZCAqKWJ1c2lkLCBtYXRjaF9idXNpZCk7CVwKKwlpZiAoIXZidXMpIHsgXAorCQlMT0dFUlIoIioqKiogRkFJTEVEIHRvIGZpbmQgdmJ1cyAlc1xuIiwgYnVzaWQpOyBcCisJCXJldHVybiAwOyBcCisJfSBcCit9CisKKy8qIGFkZHMgYSB2aGJhCisgKiByZXR1cm5zIDAgZmFpbHVyZSwgMSBzdWNjZXNzLAorICovCitzdGF0aWMgaW50IGFkZF92aGJhKHN0cnVjdCBhZGRfdmlydF9ndWVzdHBhcnQgKmFkZHBhcmFtcykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NzaV9hZGFwX2luZm8gc2NzaTsKKwlzdHJ1Y3QgZGV2aWNlICp2YnVzOworCXVuc2lnbmVkIGNoYXIgYnVzaWRbQlVTX0lEX1NJWkVdOworCisJUE9TVENPREVfTElOVVhfMihWUENJX0NSRUFURV9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJaWYgKCFXQUlUX0ZPUl9JT19DSEFOTkVMCisJICAgICgoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCBfX2lvbWVtICopIGFkZHBhcmFtcy0+Y2hhbnB0cikpIHsKKwkJTE9HRVJSKCJUaW1lZCBvdXQuICBDaGFubmVsIG5vdCByZWFkeVxuIik7CisJCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRkFJTFVSRV9QQywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIDA7CisJfQorCisJR0VUX1NDU0lBREFQSU5GT19GUk9NX0NIQU5QVFIoYWRkcGFyYW1zLT5jaGFucHRyKTsKKworCUdFVF9CVVNfREVWKGFkZHBhcmFtcy0+YnVzTm8pOworCisJTE9HSU5GKCJBZGRpbmcgdmhiYSB3d25uOiV4OiV4IGNvbmZpZzolZC0lZC0lZC0lZCBjaGFucHRyOiVwXG4iLAorCSAgICAgICBzY3NpLnd3bm4ud3dubjEsIHNjc2kud3dubi53d25uMiwKKwkgICAgICAgc2NzaS5tYXgubWF4X2NoYW5uZWwsIHNjc2kubWF4Lm1heF9pZCwgc2NzaS5tYXgubWF4X2x1biwKKwkgICAgICAgc2NzaS5tYXguY21kX3Blcl9sdW4sIGFkZHBhcmFtcy0+Y2hhbnB0cik7CisJaSA9IHZpcnRwY2lfZGV2aWNlX2FkZCh2YnVzLCBWSVJUSEJBX1RZUEUsIGFkZHBhcmFtcywgJnNjc2ksIE5VTEwpOworCWlmIChpKSB7CisJCUxPR0lORigiQWRkZWQgdmhiYSB3d25uOiV4OiV4IGNoYW5wdHI6JXBcbiIsIHNjc2kud3dubi53d25uMSwKKwkJICAgICAgIHNjc2kud3dubi53d25uMiwgYWRkcGFyYW1zLT5jaGFucHRyKTsKKwkJUE9TVENPREVfTElOVVhfMyhWUENJX0NSRUFURV9FWElUX1BDLCBpLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwl9CisJcmV0dXJuIGk7CisKK30KKworLyogZm9yIENIQU5TT0NLIG1hY2FkZHIgaXMgQVVUTy1HRU5FUkFURUQ7IGZvciBub3JtYWwgY2hhbm5lbHMsCisgKiBtYWNhZGRyIGlzIGluIHRoZSBjaGFubmVsIGhlYWRlci4KKyAqLworI2RlZmluZSBHRVRfTkVUQURBUElORk9fRlJPTV9DSEFOUFRSKGNoYW5wdHIpIHsJCQkJXAorCQltZW1jcHlfZnJvbWlvKG5ldC5tYWNfYWRkciwJCQkJXAorCQkgICAgICAgKChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MIF9faW9tZW0gKikJCVwKKwkJCWNoYW5wdHIpLT52bmljLm1hY2FkZHIsCQkJCVwKKwkJICAgICAgIE1BWF9NQUNBRERSX0xFTik7CQkJCVwKKwkJbmV0Lm51bV9yY3ZfYnVmcyA9CQkJCQlcCisJCQlyZWFkbCgmKChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MIF9faW9tZW0gKikJXAorCQkJCWNoYW5wdHIpLT52bmljLm51bV9yY3ZfYnVmcyk7CQlcCisJCW5ldC5tdHUgPSByZWFkbCgmKChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MIF9faW9tZW0gKikgXAorCQkJCSAgY2hhbnB0ciktPnZuaWMubXR1KTsJCQlcCisJCW1lbWNweV9mcm9taW8oJm5ldC56b25lR3VpZCwgXAorCQkJICAgICAgJigoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCBfX2lvbWVtICopCVwKKwkJCQljaGFucHRyKS0+dm5pYy56b25lR3VpZCwJCVwKKwkJCSAgICAgIHNpemVvZihHVUlEKSk7CQkJCVwKK30KKworLyogYWRkcyBhIHZuaWMKKyAqIHJldHVybnMgMCBmYWlsdXJlLCAxIHN1Y2Nlc3MsCisgKi8KK3N0YXRpYyBpbnQKK2FkZF92bmljKHN0cnVjdCBhZGRfdmlydF9ndWVzdHBhcnQgKmFkZHBhcmFtcykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbmV0X2FkYXBfaW5mbyBuZXQ7CisJc3RydWN0IGRldmljZSAqdmJ1czsKKwl1bnNpZ25lZCBjaGFyIGJ1c2lkW0JVU19JRF9TSVpFXTsKKworCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRU5UUllfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCWlmICghV0FJVF9GT1JfSU9fQ0hBTk5FTAorCSAgICAoKFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wgX19pb21lbSAqKSBhZGRwYXJhbXMtPmNoYW5wdHIpKSB7CisJCUxPR0VSUigiVGltZWQgb3V0LCBjaGFubmVsIG5vdCByZWFkeVxuIik7CisJCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRkFJTFVSRV9QQywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIDA7CisJfQorCisJR0VUX05FVEFEQVBJTkZPX0ZST01fQ0hBTlBUUihhZGRwYXJhbXMtPmNoYW5wdHIpOworCisJR0VUX0JVU19ERVYoYWRkcGFyYW1zLT5idXNObyk7CisKKwlMT0dJTkYoIkFkZGluZyB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggcmN2YnVmczolZCBtdHU6JWQgY2hhbnB0cjolcHslLTguOGx4LSUtNC40eC0lLTQuNHgtJS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4fVxuIiwKKwkgICAgIG5ldC5tYWNfYWRkclswXSwgbmV0Lm1hY19hZGRyWzFdLCBuZXQubWFjX2FkZHJbMl0sIG5ldC5tYWNfYWRkclszXSwKKwkgICAgIG5ldC5tYWNfYWRkcls0XSwgbmV0Lm1hY19hZGRyWzVdLCBuZXQubnVtX3Jjdl9idWZzLCBuZXQubXR1LAorCSAgICAgYWRkcGFyYW1zLT5jaGFucHRyLCAodWxvbmcpIG5ldC56b25lR3VpZC5kYXRhMSwgbmV0LnpvbmVHdWlkLmRhdGEyLAorCSAgICAgbmV0LnpvbmVHdWlkLmRhdGEzLCBuZXQuem9uZUd1aWQuZGF0YTRbMF0sIG5ldC56b25lR3VpZC5kYXRhNFsxXSwKKwkgICAgIG5ldC56b25lR3VpZC5kYXRhNFsyXSwgbmV0LnpvbmVHdWlkLmRhdGE0WzNdLAorCSAgICAgbmV0LnpvbmVHdWlkLmRhdGE0WzRdLCBuZXQuem9uZUd1aWQuZGF0YTRbNV0sCisJICAgICBuZXQuem9uZUd1aWQuZGF0YTRbNl0sIG5ldC56b25lR3VpZC5kYXRhNFs3XSk7CisJaSA9IHZpcnRwY2lfZGV2aWNlX2FkZCh2YnVzLCBWSVJUTklDX1RZUEUsIGFkZHBhcmFtcywgTlVMTCwgJm5ldCk7CisJaWYgKGkpIHsKKwkJTE9HSU5GKCJBZGRlZCB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSAgICAgICBuZXQubWFjX2FkZHJbMF0sIG5ldC5tYWNfYWRkclsxXSwgbmV0Lm1hY19hZGRyWzJdLAorCQkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSk7CisJCVBPU1RDT0RFX0xJTlVYXzMoVlBDSV9DUkVBVEVfRVhJVF9QQywgaSwKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogZGVsZXRlIHZidXMKKyAqIHJldHVybnMgMCBmYWlsdXJlLCAxIHN1Y2Nlc3MsCisgKi8KK3N0YXRpYyBpbnQKK2RlbGV0ZV92YnVzKHN0cnVjdCBkZWxfdmJ1c19ndWVzdHBhcnQgKmRlbHBhcmFtcykKK3sKKwlzdHJ1Y3QgZGV2aWNlICp2YnVzOworCXVuc2lnbmVkIGNoYXIgYnVzaWRbQlVTX0lEX1NJWkVdOworCisJR0VUX0JVU19ERVYoZGVscGFyYW1zLT5idXNObyk7CisJLyogZW5zdXJlIHRoYXQgYnVzIGhhcyBubyBkZXZpY2VzPyAtLSBUQkQgKi8KKwlMT0dJTkYoIkRlbGV0aW5nICVzXG4iLCBCVVNfSUQodmJ1cykpOworCWlmIChkZWxldGVfdmJ1c19kZXZpY2UodmJ1cywgTlVMTCkpCisJCXJldHVybiAwOwkvKiBmYWlsdXJlICovCisJTE9HSU5GKCJEZWxldGVkIHZidXMgJWRcbiIsIGRlbHBhcmFtcy0+YnVzTm8pOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitkZWxldGVfdmJ1c19kZXZpY2Uoc3RydWN0IGRldmljZSAqdmJ1cywgdm9pZCAqZGF0YSkKK3sKKwlpbnQgY2hlY2tmb3Jyb290ID0gKGRhdGEgIT0gTlVMTCk7CisJc3RydWN0IGRldmljZSAqcERldiA9ICZ2aXJ0cGNpX3Jvb3RidXNfZGV2aWNlOworCisJaWYgKChjaGVja2ZvcnJvb3QpICYmIG1hdGNoX2J1c2lkKHZidXMsICh2b2lkICopIEJVU19JRChwRGV2KSkpIHsKKwkJLyogc2tpcCBpdCAtIGRvbid0IGRlbGV0ZSByb290IGJ1cyAqLworCQlMT0dJTkYoInNraXBwaW5nIHJvb3QgYnVzXG4iKTsKKwkJcmV0dXJuIDA7CS8qIHByZXRlbmQgbm8gZXJyb3IgKi8KKwl9CisJTE9HSU5GKCJDYWxsaW5nIHVucmVnaXN0ZXIgZm9yICVzXG4iLCBCVVNfSUQodmJ1cykpOworCWRldmljZV91bnJlZ2lzdGVyKHZidXMpOworCWtmcmVlKHZidXMpOworCUxPR0lORigiVkJ1cyB1bnJlZ2lzdGVyIGFuZCBmcmVlZFxuIik7CisJcmV0dXJuIDA7CQkvKiBubyBlcnJvciAqLworfQorCisvKiBwYXVzZSB2aGJhCisqIHJldHVybnMgMCBmYWlsdXJlLCAxIHN1Y2Nlc3MsCisqLworc3RhdGljIGludCBwYXVzZV92aGJhKHN0cnVjdCBwYXVzZV92aXJ0X2d1ZXN0cGFydCAqcGF1c2VwYXJhbXMpCit7CisJaW50IGk7CisJc3RydWN0IHNjc2lfYWRhcF9pbmZvIHNjc2k7CisKKwlHRVRfU0NTSUFEQVBJTkZPX0ZST01fQ0hBTlBUUihwYXVzZXBhcmFtcy0+Y2hhbnB0cik7CisKKwlMT0dJTkYoIlBhdXNpbmcgdmhiYSB3d25uOiV4OiV4XG4iLCBzY3NpLnd3bm4ud3dubjEsIHNjc2kud3dubi53d25uMik7CisJaSA9IHZpcnRwY2lfZGV2aWNlX3NlcnZlcmRvd24oTlVMTCAvKm5vIHBhcmVudCBidXMgKi8gLCBWSVJUSEJBX1RZUEUsCisJCQkJICAgICAgJnNjc2kud3dubiwgTlVMTCk7CisJaWYgKGkpCisJCUxPR0lORigiUGF1c2VkIHZoYmEgd3dubjoleDoleFxuIiwgc2NzaS53d25uLnd3bm4xLAorCQkgICAgICAgc2NzaS53d25uLnd3bm4yKTsKKwlyZXR1cm4gaTsKK30KKworLyogcGF1c2Ugdm5pYworICogcmV0dXJucyAwIGZhaWx1cmUsIDEgc3VjY2VzcywKKyAqLworc3RhdGljIGludCBwYXVzZV92bmljKHN0cnVjdCBwYXVzZV92aXJ0X2d1ZXN0cGFydCAqcGF1c2VwYXJhbXMpCit7CisJaW50IGk7CisJc3RydWN0IG5ldF9hZGFwX2luZm8gbmV0OworCisJR0VUX05FVEFEQVBJTkZPX0ZST01fQ0hBTlBUUihwYXVzZXBhcmFtcy0+Y2hhbnB0cik7CisKKwlMT0dJTkYoIlBhdXNpbmcgdm5pYyBtYWNhZGRyOiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBuZXQubWFjX2FkZHJbMF0sIG5ldC5tYWNfYWRkclsxXSwgbmV0Lm1hY19hZGRyWzJdLAorCSAgICAgICBuZXQubWFjX2FkZHJbM10sIG5ldC5tYWNfYWRkcls0XSwgbmV0Lm1hY19hZGRyWzVdKTsKKwlpID0gdmlydHBjaV9kZXZpY2Vfc2VydmVyZG93bihOVUxMIC8qbm8gcGFyZW50IGJ1cyAqLyAsIFZJUlROSUNfVFlQRSwKKwkJCQkgICAgICBOVUxMLCBuZXQubWFjX2FkZHIpOworCWlmIChpKSB7CisJCUxPR0lORigiIFBhdXNlZCB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSAgICAgICBuZXQubWFjX2FkZHJbMF0sIG5ldC5tYWNfYWRkclsxXSwgbmV0Lm1hY19hZGRyWzJdLAorCQkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSk7CisJfQorCXJldHVybiBpOworfQorCisvKiByZXN1bWUgdmhiYQorICogcmV0dXJucyAwIGZhaWx1cmUsIDEgc3VjY2VzcywKKyAqLworc3RhdGljIGludCByZXN1bWVfdmhiYShzdHJ1Y3QgcmVzdW1lX3ZpcnRfZ3Vlc3RwYXJ0ICpyZXN1bWVwYXJhbXMpCit7CisJaW50IGk7CisJc3RydWN0IHNjc2lfYWRhcF9pbmZvIHNjc2k7CisKKwlHRVRfU0NTSUFEQVBJTkZPX0ZST01fQ0hBTlBUUihyZXN1bWVwYXJhbXMtPmNoYW5wdHIpOworCisJTE9HSU5GKCJSZXN1bWluZyB2aGJhIHd3bm46JXg6JXhcbiIsIHNjc2kud3dubi53d25uMSwgc2NzaS53d25uLnd3bm4yKTsKKwlpID0gdmlydHBjaV9kZXZpY2Vfc2VydmVydXAoTlVMTCAvKm5vIHBhcmVudCBidXMgKi8gLCBWSVJUSEJBX1RZUEUsCisJCQkJICAgICZzY3NpLnd3bm4sIE5VTEwpOworCWlmIChpKQorCQlMT0dJTkYoIlJlc3VtZWQgdmhiYSB3d25uOiV4OiV4XG4iLCBzY3NpLnd3bm4ud3dubjEsCisJCSAgICAgICBzY3NpLnd3bm4ud3dubjIpOworCXJldHVybiBpOworfQorCisvKiByZXN1bWUgdm5pYworKiByZXR1cm5zIDAgZmFpbHVyZSwgMSBzdWNjZXNzLAorKi8KK3N0YXRpYyBpbnQKK3Jlc3VtZV92bmljKHN0cnVjdCByZXN1bWVfdmlydF9ndWVzdHBhcnQgKnJlc3VtZXBhcmFtcykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbmV0X2FkYXBfaW5mbyBuZXQ7CisKKwlHRVRfTkVUQURBUElORk9fRlJPTV9DSEFOUFRSKHJlc3VtZXBhcmFtcy0+Y2hhbnB0cik7CisKKwlMT0dJTkYoIlJlc3VtaW5nIHZuaWMgbWFjYWRkcjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgbmV0Lm1hY19hZGRyWzBdLCBuZXQubWFjX2FkZHJbMV0sIG5ldC5tYWNfYWRkclsyXSwKKwkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSk7CisJaSA9IHZpcnRwY2lfZGV2aWNlX3NlcnZlcnVwKE5VTEwgLypubyBwYXJlbnQgYnVzICovICwgVklSVE5JQ19UWVBFLAorCQkJCSAgICBOVUxMLCBuZXQubWFjX2FkZHIpOworCWlmIChpKSB7CisJCUxPR0lORigiIFJlc3VtZWQgdm5pYyBtYWNhZGRyOiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkgICAgICAgbmV0Lm1hY19hZGRyWzBdLCBuZXQubWFjX2FkZHJbMV0sIG5ldC5tYWNfYWRkclsyXSwKKwkJICAgICAgIG5ldC5tYWNfYWRkclszXSwgbmV0Lm1hY19hZGRyWzRdLCBuZXQubWFjX2FkZHJbNV0pOworCX0KKwlyZXR1cm4gaTsKK30KKworLyogZGVsZXRlIHZoYmEKKyogcmV0dXJucyAwIGZhaWx1cmUsIDEgc3VjY2VzcywKKyovCitzdGF0aWMgaW50IGRlbGV0ZV92aGJhKHN0cnVjdCBkZWxfdmlydF9ndWVzdHBhcnQgKmRlbHBhcmFtcykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NzaV9hZGFwX2luZm8gc2NzaTsKKworCUdFVF9TQ1NJQURBUElORk9fRlJPTV9DSEFOUFRSKGRlbHBhcmFtcy0+Y2hhbnB0cik7CisKKwlMT0dJTkYoIkRlbGV0aW5nIHZoYmEgd3dubjoleDoleFxuIiwgc2NzaS53d25uLnd3bm4xLCBzY3NpLnd3bm4ud3dubjIpOworCWkgPSB2aXJ0cGNpX2RldmljZV9kZWwoTlVMTCAvKm5vIHBhcmVudCBidXMgKi8gLCBWSVJUSEJBX1RZUEUsCisJCQkgICAgICAgJnNjc2kud3dubiwgTlVMTCk7CisJaWYgKGkpIHsKKwkJTE9HSU5GKCJEZWxldGVkIHZoYmEgd3dubjoleDoleFxuIiwgc2NzaS53d25uLnd3bm4xLAorCQkgICAgICAgc2NzaS53d25uLnd3bm4yKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKiBkZWxldGVzIGEgdm5pYworICogcmV0dXJucyAwIGZhaWx1cmUsIDEgc3VjY2VzcywKKyAqLworc3RhdGljIGludCBkZWxldGVfdm5pYyhzdHJ1Y3QgZGVsX3ZpcnRfZ3Vlc3RwYXJ0ICpkZWxwYXJhbXMpCit7CisJaW50IGk7CisJc3RydWN0IG5ldF9hZGFwX2luZm8gbmV0OworCisJR0VUX05FVEFEQVBJTkZPX0ZST01fQ0hBTlBUUihkZWxwYXJhbXMtPmNoYW5wdHIpOworCisJTE9HSU5GKCJEZWxldGluZyB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJICAgICAgIG5ldC5tYWNfYWRkclswXSwgbmV0Lm1hY19hZGRyWzFdLCBuZXQubWFjX2FkZHJbMl0sCisJICAgICAgIG5ldC5tYWNfYWRkclszXSwgbmV0Lm1hY19hZGRyWzRdLCBuZXQubWFjX2FkZHJbNV0pOworCWkgPSB2aXJ0cGNpX2RldmljZV9kZWwoTlVMTCAvKm5vIHBhcmVudCBidXMgKi8gLCBWSVJUTklDX1RZUEUsIE5VTEwsCisJCQkgICAgICAgbmV0Lm1hY19hZGRyKTsKKwlpZiAoaSkgeworCQlMT0dJTkYoIkRlbGV0ZWQgdm5pYyBtYWNhZGRyOiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkgICAgICAgbmV0Lm1hY19hZGRyWzBdLCBuZXQubWFjX2FkZHJbMV0sIG5ldC5tYWNfYWRkclsyXSwKKwkJICAgICAgIG5ldC5tYWNfYWRkclszXSwgbmV0Lm1hY19hZGRyWzRdLCBuZXQubWFjX2FkZHJbNV0pOworCX0KKwlyZXR1cm4gaTsKK30KKworI2RlZmluZSBERUxFVEVfT05FX1ZQQ0lERVYodnBjaWRldikgeyBcCisJTE9HSU5GKCJjYWxsaW5nIGRldmljZV91bnJlZ2lzdGVyOiVwXG4iLCAmdnBjaWRldi0+Z2VuZXJpY19kZXYpOyBcCisJZGV2aWNlX3VucmVnaXN0ZXIoJnZwY2lkZXYtPmdlbmVyaWNfZGV2KTsgXAorCUxPR0lORigiRGVsZXRlZCAlcFxuIiwgdnBjaWRldik7IFwKKwlrZnJlZSh2cGNpZGV2KTsgXAorfQorCisvKiBkZWxldGVzIGFsbCB2aGJhcyBhbmQgdm5pY3MKKyAqIHJldHVybnMgMCBmYWlsdXJlLCAxIHN1Y2Nlc3MsCisgKi8KK3N0YXRpYyB2b2lkIGRlbGV0ZV9hbGwodm9pZCkKK3sKKwlpbnQgY291bnQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHZpcnRwY2lfZGV2ICp0bXB2cGNpZGV2LCAqbmV4dHZwY2lkZXY7CisKKwkvKiBkZWxldGUgdGhlIGVudGlyZSB2aGJhL3ZuaWMgbGlzdCBpbiBvbmUgc2hvdCAqLworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmVnBjaWRldkxpc3RMb2NrLCBmbGFncyk7CisJdG1wdnBjaWRldiA9IFZwY2lkZXZMaXN0SGVhZDsKKwlWcGNpZGV2TGlzdEhlYWQgPSBOVUxMOworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZWcGNpZGV2TGlzdExvY2ssIGZsYWdzKTsKKworCS8qIGRlbGV0ZSBvbmUgdmhiYS92bmljIGF0IGEgdGltZSAqLworCXdoaWxlICh0bXB2cGNpZGV2KSB7CisJCW5leHR2cGNpZGV2ID0gdG1wdnBjaWRldi0+bmV4dDsKKwkJLyogZGVsZXRlIHRoZSB2aGJhL3ZuaWMgYXQgdG1wdnBjaWRldiAqLworCQlERUxFVEVfT05FX1ZQQ0lERVYodG1wdnBjaWRldik7CisJCXRtcHZwY2lkZXYgPSBuZXh0dnBjaWRldjsKKwkJY291bnQrKzsKKwl9CisJTE9HSU5GKCJEZWxldGVkICVkIHZoYmFzL3ZuaWNzLlxuIiwgY291bnQpOworCisJLyogbm93IGRlbGV0ZSBlYWNoIHZidXMgKi8KKwlpZiAoYnVzX2Zvcl9lYWNoX2RldgorCSAgICAoJnZpcnRwY2lfYnVzX3R5cGUsIE5VTEwsICh2b2lkICopIDEsIGRlbGV0ZV92YnVzX2RldmljZSkpCisJCUxPR0VSUigiZGVsZXRlIG9mIGFsbCB2YnVzIGZhaWxlZFxuIik7Cit9CisKKy8qIGRlbGV0ZXMgYWxsIHZuaWNzIG9yIHZoYmFzCisgKiByZXR1cm5zIDAgZmFpbHVyZSwgMSBzdWNjZXNzLAorICovCitzdGF0aWMgaW50IGRlbGV0ZV9hbGxfdmlydChWSVJUUENJX0RFVl9UWVBFIGRldnR5cGUsIHN0cnVjdCBkZWxfdmJ1c19ndWVzdHBhcnQgKmRlbHBhcmFtcykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGJ1c2lkW0JVU19JRF9TSVpFXTsKKwlzdHJ1Y3QgZGV2aWNlICp2YnVzOworCisJR0VUX0JVU19ERVYoZGVscGFyYW1zLT5idXNObyk7CisKKwlpZiAoKGRldnR5cGUgIT0gVklSVEhCQV9UWVBFKSAmJiAoZGV2dHlwZSAhPSBWSVJUTklDX1RZUEUpKSB7CisJCUxPR0VSUigiKioqKiBGQUlMRUQgdG8gZGVsZXRlIGFsbCBkZXZpY2VzOyBkZXZ0eXBlOiVkIG5vdCB2aGJhOiVkIG9yIHZuaWM6JWRcbiIsCisJCSAgICAgZGV2dHlwZSwgVklSVEhCQV9UWVBFLCBWSVJUTklDX1RZUEUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlMT0dJTkYoIkRlbGV0aW5nIGFsbCAlcyBpbiB2YnVzICVzXG4iLAorCSAgICAgICBkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSA/ICJ2aGJhcyIgOiAidm5pY3MiLCBidXNpZCk7CisJLyogZGVsZXRlIGFsbCB2aGJhcy92bmljcyAqLworCWkgPSB2aXJ0cGNpX2RldmljZV9kZWwodmJ1cywgZGV2dHlwZSwgTlVMTCwgTlVMTCk7CisJaWYgKGkgPiAwKQorCQlMT0dJTkYoIkRlbGV0ZWQgJWQgJXNcbiIsIGksCisJCSAgICAgICBkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSA/ICJ2aGJhcyIgOiAidm5pY3MiKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB2aXJ0cGNpX2N0cmxjaGFuX2Z1bmMoc3RydWN0IGd1ZXN0X21zZ3MgKm1zZykKK3sKKwlzd2l0Y2ggKG1zZy0+bXNndHlwZSkgeworCWNhc2UgR1VFU1RfQUREX1ZCVVM6CisJCXJldHVybiBhZGRfdmJ1cygmbXNnLT5hZGRfdmJ1cyk7CisJY2FzZSBHVUVTVF9BRERfVkhCQToKKwkJcmV0dXJuIGFkZF92aGJhKCZtc2ctPmFkZF92aGJhKTsKKwljYXNlIEdVRVNUX0FERF9WTklDOgorCQlyZXR1cm4gYWRkX3ZuaWMoJm1zZy0+YWRkX3ZuaWMpOworCWNhc2UgR1VFU1RfREVMX1ZCVVM6CisJCXJldHVybiBkZWxldGVfdmJ1cygmbXNnLT5kZWxfdmJ1cyk7CisJY2FzZSBHVUVTVF9ERUxfVkhCQToKKwkJcmV0dXJuIGRlbGV0ZV92aGJhKCZtc2ctPmRlbF92aGJhKTsKKwljYXNlIEdVRVNUX0RFTF9WTklDOgorCQlyZXR1cm4gZGVsZXRlX3ZuaWMoJm1zZy0+ZGVsX3ZoYmEpOworCWNhc2UgR1VFU1RfREVMX0FMTF9WSEJBUzoKKwkJcmV0dXJuIGRlbGV0ZV9hbGxfdmlydChWSVJUSEJBX1RZUEUsICZtc2ctPmRlbF9hbGxfdmhiYXMpOworCWNhc2UgR1VFU1RfREVMX0FMTF9WTklDUzoKKwkJcmV0dXJuIGRlbGV0ZV9hbGxfdmlydChWSVJUTklDX1RZUEUsICZtc2ctPmRlbF9hbGxfdm5pY3MpOworCWNhc2UgR1VFU1RfREVMX0FMTF9WQlVTRVM6CisJCWRlbGV0ZV9hbGwoKTsKKwkJcmV0dXJuIDE7CisJY2FzZSBHVUVTVF9QQVVTRV9WSEJBOgorCQlyZXR1cm4gcGF1c2VfdmhiYSgmbXNnLT5wYXVzZV92aGJhKTsKKwljYXNlIEdVRVNUX1BBVVNFX1ZOSUM6CisJCXJldHVybiBwYXVzZV92bmljKCZtc2ctPnBhdXNlX3ZuaWMpOworCWNhc2UgR1VFU1RfUkVTVU1FX1ZIQkE6CisJCXJldHVybiByZXN1bWVfdmhiYSgmbXNnLT5yZXN1bWVfdmhiYSk7CisJY2FzZSBHVUVTVF9SRVNVTUVfVk5JQzoKKwkJcmV0dXJuIHJlc3VtZV92bmljKCZtc2ctPnJlc3VtZV92bmljKTsKKwlkZWZhdWx0OgorCQlMT0dFUlIoImludmFsaWQgbWVzc2FnZSB0eXBlICVkLlxuIiwgbXNnLT5tc2d0eXBlKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKiBzYW1lIGFzIGRyaXZlcl9oZWxwZXIgaW4gYnVzLmMgbGludXggKi8KK3N0YXRpYyBpbnQgbWF0Y2hfYnVzaWQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBkYXRhOworCisJaWYgKHN0cmNtcChuYW1lLCBCVVNfSUQoZGV2KSkgPT0gMCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBCdXMgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICoKK3ZpcnRwY2lfbWF0Y2hfZGV2aWNlKGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZHMsCisJCSAgICAgY29uc3Qgc3RydWN0IHZpcnRwY2lfZGV2ICpkZXYpCit7CisJd2hpbGUgKGlkcy0+dmVuZG9yIHx8IGlkcy0+c3VidmVuZG9yIHx8IGlkcy0+Y2xhc3NfbWFzaykgeworCQlEQkdJTkYoImlkcy0+dmVuZG9yOiV4IGRldi0+dmVuZG9yOiV4IGlkcy0+ZGV2aWNlOiV4IGRldi0+ZGV2aWNlOiV4XG4iLAorCQkgICAgIGlkcy0+dmVuZG9yLCBkZXYtPnZlbmRvciwgaWRzLT5kZXZpY2UsIGRldi0+ZGV2aWNlKTsKKworCQlpZiAoKGlkcy0+dmVuZG9yID09IGRldi0+dmVuZG9yKQorCQkgICAgJiYgKGlkcy0+ZGV2aWNlID09IGRldi0+ZGV2aWNlKSkKKwkJCXJldHVybiBpZHM7CisKKwkJaWRzKys7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBOT1RFOiAhISEhISEgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBuZXcgZGV2aWNlIGlzIGFkZGVkCisqIGZvciB0aGlzIGJ1cy4gIE9yLCBpdCBpcyBjYWxsZWQgZm9yIGV4aXN0aW5nIGRldmljZXMgd2hlbiBhIG5ldworKiBkcml2ZXIgaXMgYWRkZWQgZm9yIHRoaXMgYnVzLiAgSXQgcmV0dXJucyBub256ZXJvIGlmIGEgZ2l2ZW4gZGV2aWNlCisqIGNhbiBiZSBoYW5kbGVkIGJ5IHRoZSBnaXZlbiBkcml2ZXIuCisqLworc3RhdGljIGludCB2aXJ0cGNpX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJc3RydWN0IHZpcnRwY2lfZGV2ICp2aXJ0cGNpZGV2ID0gZGV2aWNlX3RvX3ZpcnRwY2lfZGV2KGRldik7CisJc3RydWN0IHZpcnRwY2lfZHJpdmVyICp2aXJ0cGNpZHJ2ID0gZHJpdmVyX3RvX3ZpcnRwY2lfZHJpdmVyKGRydik7CisJaW50IG1hdGNoID0gMDsKKworCURCR0lORigiSW4gdmlydHBjaV9idXNfbWF0Y2ggZGV2LT5idXNfaWQ6JXMgZHJ2LT5uYW1lOiVzXG4iLAorCSAgICAgICBkZXYtPmJ1c19pZCwgZHJ2LT5uYW1lKTsKKworCS8qIGNoZWNrIGlkcyBsaXN0IGZvciBhIG1hdGNoICovCisJaWYgKHZpcnRwY2lfbWF0Y2hfZGV2aWNlKHZpcnRwY2lkcnYtPmlkX3RhYmxlLCB2aXJ0cGNpZGV2KSkKKwkJbWF0Y2ggPSAxOworCisJREJHSU5GKCJyZXR1cm5pbmcgbWF0Y2g6JWRcbiIsIG1hdGNoKTsKKwlyZXR1cm4gbWF0Y2g7CQkvKiAwIC0gbm8gbWF0Y2g7IDEgLSB5ZXMgaXQgbWF0Y2hlcyAqLworfQorCitzdGF0aWMgaW50IHZpcnRwY2lfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQoreworCURCR0lORigiSW4gdmlydHBjaV9ob3RwbHVnXG4iKTsKKwkvKiBhZGQgdmFyaWFibGVzIHRvIHRoZSBlbnZpcm9ubWVudCBwcmlvciB0byB0aGUgZ2VuZXJhdGlvbiBvZgorCSAqIGhvdHBsdWcgZXZlbnRzIHRvIHVzZXIgc3BhY2UKKwkgKi8KKwlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiVklSVFBDSV9WRVJTSU9OPSVzIiwgVklSVFBDSV9WRVJTSU9OKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlEQkdJTkYoIkluIHZpcnRwY2lfZGV2aWNlX3N1c3BlbmQgLU5ZSSAqKioqXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aXJ0cGNpX2RldmljZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCURCR0lORigiSW4gdmlydHBjaV9kZXZpY2VfcmVzdW1lIC1OWUkgKioqKlxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIEZvciBhIGNoaWxkIGRldmljZSBqdXN0IGNyZWF0ZWQgb24gYSBjbGllbnQgYnVzLCBmaWxsIGluCisgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJpdmVyIHRoYXQgaXMgY29udHJvbGxpbmcgdGhpcyBkZXZpY2UgaW50bworICogdGhlIHRoZSBhcHByb3ByaWF0ZSBzbG90IHdpdGhpbiB0aGUgdmJ1cyBjaGFubmVsIG9mIHRoZSBidXMKKyAqIGluc3RhbmNlLgorICovCitzdGF0aWMgdm9pZCBmaXhfdmJ1c19kZXZJbmZvKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGRldk5vLCBpbnQgZGV2VHlwZSwKKwkJCSAgICAgc3RydWN0IHZpcnRwY2lfZHJpdmVyICp2aXJ0cGNpZHJ2KQoreworCXN0cnVjdCBkZXZpY2UgKnZidXM7CisJdm9pZCAqcENoYW47CisJVUxUUkFfVkJVU19ERVZJQ0VJTkZPIGRldkluZm87CisJY29uc3QgY2hhciAqc3R5cGU7CisKKwlpZiAoIWRldikgeworCQlMT0dFUlIoIiVzIGRldiBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWlmICghdmlydHBjaWRydikgeworCQlMT0dFUlIoIiVzIGRyaXZlciBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCXZidXMgPSBkZXYtPnBhcmVudDsKKwlpZiAoIXZidXMpIHsKKwkJTE9HRVJSKCIlcyBkZXYgaGFzIG5vIHBhcmVudCBidXMiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJcENoYW4gPSB2YnVzLT5wbGF0Zm9ybV9kYXRhOworCWlmICghcENoYW4pIHsKKwkJTE9HRVJSKCIlcyBkZXYgYnVzIGhhcyBubyBjaGFubmVsIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCXN3aXRjaCAoZGV2VHlwZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9WSVJUSEJBOgorCQlzdHlwZSA9ICJ2SEJBIjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1ZJUlROSUM6CisJCXN0eXBlID0gInZOSUMiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdHlwZSA9ICJ1bmtub3duIjsKKwkJYnJlYWs7CisJfQorCUJ1c0RldmljZUluZm9fSW5pdCgmZGV2SW5mbywgc3R5cGUsCisJCQkgICB2aXJ0cGNpZHJ2LT5uYW1lLAorCQkJICAgdmlydHBjaWRydi0+dmVyc2lvbiwKKwkJCSAgIHZpcnRwY2lkcnYtPnZlcnRhZywKKwkJCSAgIHZpcnRwY2lkcnYtPmJ1aWxkX2RhdGUsIHZpcnRwY2lkcnYtPmJ1aWxkX3RpbWUpOworCXdyaXRlX3ZidXNfZGV2SW5mbyhwQ2hhbiwgJmRldkluZm8sIGRldk5vKTsKKworCS8qIFJlLXdyaXRlIGJ1cytjaGlwc2V0IGluZm8sIGJlY2F1c2UgaXQgaXMgcG9zc2libGUgdGhhdCB0aGlzCisJKiB3YXMgcHJldmlvdXNseSB3cml0dGVuIGJ5IG91ciBnb29kIGNvdW50ZXJwYXJ0LCB2aXNvcmJ1cy4KKwkqLworCXdyaXRlX3ZidXNfY2hwSW5mbyhwQ2hhbiwgJkNoaXBzZXRfRHJpdmVySW5mbyk7CisJd3JpdGVfdmJ1c19idXNJbmZvKHBDaGFuLCAmQnVzX0RyaXZlckluZm8pOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBxdWVyeSB0aGUgZXhpc3RlbmNlIG9mIGEgc3BlY2lmaWMgZGV2aWNlCisqIGFuZCB3aGV0aGVyIHRoaXMgZHJpdmVyIGNhbiB3b3JrIHdpdGggaXQuICBJdCBzaG91bGQgcmV0dXJuIC1FTk9ERVYKKyogaW4gY2FzZSBvZiBmYWlsdXJlLgorKi8KK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2VfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB2aXJ0cGNpX2RldiAqdmlydHBjaWRldiA9IGRldmljZV90b192aXJ0cGNpX2RldihkZXYpOworCXN0cnVjdCB2aXJ0cGNpX2RyaXZlciAqdmlydHBjaWRydiA9CisJICAgIGRyaXZlcl90b192aXJ0cGNpX2RyaXZlcihkZXYtPmRyaXZlcik7CisJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkOworCWludCBlcnJvciA9IDA7CisKKwlMT0dJTkYoIkluIHZpcnRwY2lfZGV2aWNlX3Byb2JlIGRldjolcCB2aXJ0cGNpZGV2OiVwIHZpcnRwY2lkcnY6JXBcbiIsCisJICAgICAgIGRldiwgdmlydHBjaWRldiwgdmlydHBjaWRydik7CS8qIFZFUkJPU0UvREVCVUcgPyAqLworCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9QUk9CRV9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJLyogc3RhdGljIG1hdGNoIGFuZCBzdGF0aWMgcHJvYmUgdnMgZHluYW1pYyBtYXRjaCAmIGR5bmFtaWMKKwkgKiBwcm9iZSAtIGRvIHdlIGNhcmU/LgorCSAqLworCWlmICghdmlydHBjaWRydi0+aWRfdGFibGUpCisJCXJldHVybiAtRU5PREVWOworCisJaWQgPSB2aXJ0cGNpX21hdGNoX2RldmljZSh2aXJ0cGNpZHJ2LT5pZF90YWJsZSwgdmlydHBjaWRldik7CisJaWYgKCFpZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBpbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50ICovCisJZ2V0X2RldmljZShkZXYpOworCisJLyogaWYgdmlydHBjaWRldiBpcyBub3QgYWxyZWFkeSBjbGFpbWVkICYgcHJvYmUgZnVuY3Rpb24gaXMKKwkgKiB2YWxpZCwgcHJvYmUgaXQKKwkgKi8KKwlpZiAoIXZpcnRwY2lkZXYtPm15ZHJpdmVyICYmIHZpcnRwY2lkcnYtPnByb2JlKSB7CisJCS8qIGNhbGwgdGhlIHByb2JlIGZ1bmN0aW9uIC0gdmlydGhiYSBvciB2aXJ0bmljIHByb2JlCisJCSAqIGlzIHdoYXQgaXQgc2hvdWxkIGJlCisJCSAqLworCQllcnJvciA9IHZpcnRwY2lkcnYtPnByb2JlKHZpcnRwY2lkZXYsIGlkKTsKKwkJaWYgKCFlcnJvcikgeworCQkJZml4X3ZidXNfZGV2SW5mbyhkZXYsIHZpcnRwY2lkZXYtPmRldmljZU5vLAorCQkJCQkgdmlydHBjaWRldi0+ZGV2aWNlLCB2aXJ0cGNpZHJ2KTsKKwkJCXZpcnRwY2lkZXYtPm15ZHJpdmVyID0gdmlydHBjaWRydjsKKwkJCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9QUk9CRV9FWElUX1BDLAorCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJCX0gZWxzZQorCQkJcHV0X2RldmljZShkZXYpOworCX0KKwlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfUFJPQkVfRkFJTFVSRV9QQywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwlyZXR1cm4gZXJyb3I7CQkvKiAtRU5PREVWIGZvciBwcm9iZSBmYWlsdXJlICovCit9CisKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldl8pCit7CisJLyogZGV2XyBwYXNzZWQgaW4gaXMgdGhlIEhCQSBkZXZpY2Ugd2hpY2ggd2UgY2FsbGVkCisJKiBnZW5lcmljX2RldiBpbiBvdXIgdmlydHBjaWRldiBzdHJ1Y3QKKwkqLworCXN0cnVjdCB2aXJ0cGNpX2RldiAqdmlydHBjaWRldiA9IGRldmljZV90b192aXJ0cGNpX2RldihkZXZfKTsKKwlzdHJ1Y3QgdmlydHBjaV9kcml2ZXIgKnZpcnRwY2lkcnYgPSB2aXJ0cGNpZGV2LT5teWRyaXZlcjsKKwlMT0dJTkYoIkluIHZpcnRwY2lfZGV2aWNlX3JlbW92ZSBidXNfaWQ6JXMgZGV2XzolcCB2aXJ0cGNpZGV2OiVwIGRldi0+ZHJpdmVyOiVwIGRyaXZlcm5hbWU6JXNcbiIsCisJICAgICAgIEJVU19JRChkZXZfKSwgZGV2XywgdmlydHBjaWRldiwgZGV2Xy0+ZHJpdmVyLAorCSAgICAgICBkZXZfLT5kcml2ZXItPm5hbWUpOwkvKiBWRVJCT1NFL0RFQlVHICovCisJaWYgKHZpcnRwY2lkcnYpIHsKKwkJLyogVEVNUDogYXNzdW1pbmcgd2UgaGF2ZSBvbmx5IG9uZSBzdWNoIGRyaXZlciBmb3Igbm93ICovCisJCWlmICh2aXJ0cGNpZHJ2LT5yZW1vdmUpCisJCQl2aXJ0cGNpZHJ2LT5yZW1vdmUodmlydHBjaWRldik7CisJCXZpcnRwY2lkZXYtPm15ZHJpdmVyID0gTlVMTDsKKwl9CisKKwlEQkdJTkYoImNhbGxpbmcgcHV0ZGV2aWNlXG4iKTsKKwlwdXRfZGV2aWNlKGRldl8pOworCisJREJHSU5GKCJMZWF2aW5nXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQnVzIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCB2aXJ0cGNpX2J1c19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUKKwkgKiBkZXZpY2UgaXMgcmVtb3ZlZAorCSAqLworCURCR0lORigiSW4gdmlydHBjaV9idXNfcmVsZWFzZVxuIik7CisJLyogd2hhdCBlbHNlIGlzIHN1cHBvc2VkIHRvIGhhcHBlbiBoZXJlPyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBBZGFwdGVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2VfYWRkKHN0cnVjdCBkZXZpY2UgKnBhcmVudGJ1cywgaW50IGRldnR5cGUsCisJCQkgICAgICBzdHJ1Y3QgYWRkX3ZpcnRfZ3Vlc3RwYXJ0ICphZGRwYXJhbXMsCisJCQkgICAgICBzdHJ1Y3Qgc2NzaV9hZGFwX2luZm8gKnNjc2ksIC8qIE5VTEwgZm9yIFZOSUMgYWRkICovCisJCQkgICAgICBzdHJ1Y3QgbmV0X2FkYXBfaW5mbyAqbmV0CS8qIE5VTEwgZm9yIFZIQkEgYWRkICovKQoreworCXN0cnVjdCB2aXJ0cGNpX2RldiAqdmlydHBjaWRldiA9IE5VTEw7CisJc3RydWN0IHZpcnRwY2lfZGV2ICp0bXB2cGNpZGV2ID0gTlVMTCwgKnByZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCVVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wgX19pb21lbSAqcElvQ2hhbiA9IE5VTEw7CisJc3RydWN0IGRldmljZSAqcERldjsKKworCUxPR0lORigidmlydHBjaV9kZXZpY2VfYWRkIHBhcmVudGJ1czolcCBjaGFucHRyOiVwXG4iLCBwYXJlbnRidXMsCisJICAgICAgIGFkZHBhcmFtcy0+Y2hhbnB0cik7CisKKwlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCWlmICgoZGV2dHlwZSAhPSBWSVJUSEJBX1RZUEUpICYmIChkZXZ0eXBlICE9IFZJUlROSUNfVFlQRSkpIHsKKwkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBhZGQgZGV2aWNlOyBkZXZ0eXBlOiVkIG5vdCB2aGJhOiVkIG9yIHZuaWM6JWRcbiIsCisJCSAgICAgZGV2dHlwZSwgVklSVEhCQV9UWVBFLCBWSVJUTklDX1RZUEUpOworCQlQT1NUQ09ERV9MSU5VWF8zKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldnR5cGUsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiAwOworCX0KKworCS8qIGFkZCBhIFZpcnR1YWwgRGV2aWNlICovCisJdmlydHBjaWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2aXJ0cGNpX2RldiksIEdGUF9BVE9NSUMpOworCWlmICh2aXJ0cGNpZGV2ID09IE5VTEwpIHsKKwkJTE9HRVJSKCJjYW4ndCBhZGQgZGV2aWNlIC0gbWFsbG9jIEZBTExFRFxuIik7CisJCVBPU1RDT0RFX0xJTlVYXzIoTUFMTE9DX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiAwOworCX0KKworCS8qIGluaXRpYWxpemUgc3R1ZmYgdW5pcXVlIHRvIHZpcnRwY2lfZGV2IHN0cnVjdCAqLworCXZpcnRwY2lkZXYtPmRldnR5cGUgPSBkZXZ0eXBlOworCWlmIChkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSkgeworCQl2aXJ0cGNpZGV2LT5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX1ZJUlRIQkE7CisJCXZpcnRwY2lkZXYtPnNjc2kgPSAqc2NzaTsKKwl9IGVsc2UgeworCQl2aXJ0cGNpZGV2LT5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX1ZJUlROSUM7CisJCXZpcnRwY2lkZXYtPm5ldCA9ICpuZXQ7CisJfQorCXZpcnRwY2lkZXYtPnZlbmRvciA9IFBDSV9WRU5ET1JfSURfVU5JU1lTOworCXZpcnRwY2lkZXYtPmJ1c05vID0gYWRkcGFyYW1zLT5idXNObzsKKwl2aXJ0cGNpZGV2LT5kZXZpY2VObyA9IGFkZHBhcmFtcy0+ZGV2aWNlTm87CisKKwl2aXJ0cGNpZGV2LT5xdWV1ZWluZm8uY2hhbiA9IGFkZHBhcmFtcy0+Y2hhbnB0cjsKKwl2aXJ0cGNpZGV2LT5xdWV1ZWluZm8uc2VuZF9pbnRfaWZfbmVlZGVkID0gTlVMTDsKKworCS8qIFNldCB1cCBzYWZlIHF1ZXVlLi4uICovCisJcElvQ2hhbiA9IChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MIF9faW9tZW0gKikKKwkJdmlydHBjaWRldi0+cXVldWVpbmZvLmNoYW47CisKKwl2aXJ0cGNpZGV2LT5pbnRyID0gYWRkcGFyYW1zLT5pbnRyOworCisJLyogaW5pdGlhbGl6ZSBzdHVmZiBpbiB0aGUgZGV2aWNlIHBvcnRpb24gb2YgdGhlIHN0cnVjdCAqLworCXZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2LmJ1cyA9ICZ2aXJ0cGNpX2J1c190eXBlOworCXZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2LnBhcmVudCA9IHBhcmVudGJ1czsKKwl2aXJ0cGNpZGV2LT5nZW5lcmljX2Rldi5yZWxlYXNlID0gdmlydHBjaV9kZXZpY2VfcmVsZWFzZTsKKworCWRldl9zZXRfbmFtZSgmdmlydHBjaWRldi0+Z2VuZXJpY19kZXYsICIleDoleCIsCisJCSAgICAgYWRkcGFyYW1zLT5idXNObywgYWRkcGFyYW1zLT5kZXZpY2VObyk7CisKKwkvKiBhZGQgdGhlIHZoYmEvdm5pYyB0byB2aXJ0cGNpIGRldmljZSBsaXN0IC0gYnV0IGNoZWNrIGZvcgorCSAqIGR1cGxpY2F0ZSB3d25uL21hY2FkZHIgZmlyc3QKKwkgKi8KKwl3cml0ZV9sb2NrX2lycXNhdmUoJlZwY2lkZXZMaXN0TG9jaywgZmxhZ3MpOworCWZvciAodG1wdnBjaWRldiA9IFZwY2lkZXZMaXN0SGVhZDsgdG1wdnBjaWRldjsKKwkgICAgIHRtcHZwY2lkZXYgPSB0bXB2cGNpZGV2LT5uZXh0KSB7CisJCWlmIChkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSkgeworCQkJaWYgKCh0bXB2cGNpZGV2LT5zY3NpLnd3bm4ud3dubjEgPT0gc2NzaS0+d3dubi53d25uMSkgJiYKKwkJCSAgICAodG1wdnBjaWRldi0+c2NzaS53d25uLnd3bm4yID09IHNjc2ktPnd3bm4ud3dubjIpKSB7CisJCQkJLyogZHVwbGljYXRlIC0gYWxyZWFkeSBoYXZlIHZwY2lkZXYKKwkJCQkgICB3aXRoIHRoaXMgd3dubiAqLworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UKKwkJICAgIGlmIChtZW1jbXAKKwkJCSh0bXB2cGNpZGV2LT5uZXQubWFjX2FkZHIsIG5ldC0+bWFjX2FkZHIsCisJCQkgTUFYX01BQ0FERFJfTEVOKSA9PSAwKSB7CisJCQkvKiBkdXBsaWNhdGUgLSBhbHJlYWR5IGhhdmUgdm5pYyB3aXRoIHRoaXMgd3dubiAqLworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHRtcHZwY2lkZXYpIHsKKwkJLyogZm91bmQgYSB2aGJhL3ZuaWMgYWxyZWFkeSBpbiB0aGUgbGlzdCB3aXRoIHNhbWUKKwkJICogd3dubiBvciBtYWNhZGRyIC0gcmVqZWN0IGFkZAorCQkgKi8KKwkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJlZwY2lkZXZMaXN0TG9jaywgZmxhZ3MpOworCQlrZnJlZSh2aXJ0cGNpZGV2KTsKKwkJTE9HRVJSKCIqKioqIEZBSUxFRCB2aGJhL3ZuaWMgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGxpc3RcbiIpOworCQlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiAwOworCX0KKworCS8qIGFkZCBpdCBhdCB0aGUgaGVhZCAqLworCWlmICghVnBjaWRldkxpc3RIZWFkKQorCQlWcGNpZGV2TGlzdEhlYWQgPSB2aXJ0cGNpZGV2OworCWVsc2UgeworCQkvKiBpbnNlcnQgdmlydHBjaWRldiBhdCB0aGUgaGVhZCBvZiBvdXIgbGlua2VkIGxpc3Qgb2YKKwkJICogdnBjaWRldnMKKwkJICovCisJCXZpcnRwY2lkZXYtPm5leHQgPSBWcGNpZGV2TGlzdEhlYWQ7CisJCVZwY2lkZXZMaXN0SGVhZCA9IHZpcnRwY2lkZXY7CisJfQorCisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJlZwY2lkZXZMaXN0TG9jaywgZmxhZ3MpOworCisJLyogTXVzdCB0cmFuc2l0aW9uIGNoYW5uZWwgdG8gQVRUQUNIRUQgc3RhdGUgQkVGT1JFCisJICogcmVnaXN0ZXJpbmcgdGhlIGRldmljZSwgYmVjYXVzZSBwb2xsaW5nIG9mIHRoZSBjaGFubmVsCisJICogcXVldWVzIGNhbiBiZWdpbiBhdCBhbnkgdGltZSBhZnRlciBkZXZpY2VfcmVnaXN0ZXIoKS4KKwkgKi8KKwlwRGV2ID0gJnZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2OworCVVMVFJBX0NIQU5ORUxfQ0xJRU5UX1RSQU5TSVRJT04oYWRkcGFyYW1zLT5jaGFucHRyLAorCQkJCQlCVVNfSUQocERldiksCisJCQkJCUNIQU5ORUxDTElfQVRUQUNIRUQsIE5VTEwpOworCisJLyogZG9uJ3QgcmVnaXN0ZXIgdW50aWwgZGV2aWNlIGhhcyBiZWVuIGFkZGVkIHRvCisJKiBsaXN0LiBPdGhlcndpc2UsIGEgZGV2aWNlX3VucmVnaXN0ZXIgZnJvbSB0aGlzIGZ1bmN0aW9uIGNhbgorCSogY2F1c2UgYSAic2NoZWR1bGluZyB3aGlsZSBhdG9taWMiLgorCSovCisJREJHSU5GKCJyZWdpc3RlcmluZyBkZXZpY2U6JXAgd2l0aCBidXNfaWQ6JXNcbiIsCisJICAgICAgICZ2aXJ0cGNpZGV2LT5nZW5lcmljX2RldiwgdmlydHBjaWRldi0+Z2VuZXJpY19kZXYuYnVzX2lkKTsKKwlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJnZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2KTsKKwkvKiBOT1RFOiBUSElTIElTIENBTExJTkcgSE9UUExVRyB2aXJ0cGNpX2hvdHBsdWchISEKKwkgKiBUaGlzIGNhbGwgdG8gZGV2aWNlX3JlZ2lzdGVyIHJlc3VsdHMgaW4gdmlydHBjaV9idXNfbWF0Y2gKKwkgKiBiZWluZyBjYWxsZWQgISEhISEgIEFuZCwgaWYgbWF0Y2ggcmV0dXJucyBzdWNjZXNzLCB0aGVuCisJICogdmlydHBjaWRldi0+Z2VuZXJpY19kZXYuZHJpdmVyIGlzIHNldHVwIHRvIGNvcmVfZHJpdmVyLAorCSAqIGkuZS4sIHZpcnRwY2kgYW5kIHRoZSBwcm9iZSBmdW5jdGlvbgorCSAqIHZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2LmRyaXZlci0+cHJvYmUgaXMgY2FsbGVkIHdoaWNoCisJICogcmVzdWx0cyBpbiB2aXJ0cGNpX2RldmljZV9wcm9iZSBiZWluZyBjYWxsZWQuIEFuZCBpZgorCSAqIHZpcnRwY2lfZGV2aWNlX3Byb2JlIGlzIHN1Y2Nlc3NmdWwKKwkgKi8KKwlpZiAocmV0KSB7CisJCUxPR0VSUigiZGV2aWNlX3JlZ2lzdGVyIHJldHVybmVkICVkXG4iLCByZXQpOworCQlwRGV2ID0gJnZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2OworCQlVTFRSQV9DSEFOTkVMX0NMSUVOVF9UUkFOU0lUSU9OKGFkZHBhcmFtcy0+Y2hhbnB0ciwKKwkJCQkJCUJVU19JRChwRGV2KSwKKwkJCQkJCUNIQU5ORUxDTElfREVUQUNIRUQsIE5VTEwpOworCQkvKiByZW1vdmUgdmlydHBjaWRldiwgdGhlIG9uZSB3ZSBqdXN0IGFkZGVkLCBmcm9tIHRoZSBsaXN0ICovCisJCXdyaXRlX2xvY2tfaXJxc2F2ZSgmVnBjaWRldkxpc3RMb2NrLCBmbGFncyk7CisJCWZvciAodG1wdnBjaWRldiA9IFZwY2lkZXZMaXN0SGVhZCwgcHJldiA9IE5VTEw7CisJCSAgICAgdG1wdnBjaWRldjsKKwkJICAgICBwcmV2ID0gdG1wdnBjaWRldiwgdG1wdnBjaWRldiA9IHRtcHZwY2lkZXYtPm5leHQpIHsKKwkJCWlmICh0bXB2cGNpZGV2ID09IHZpcnRwY2lkZXYpIHsKKwkJCQlpZiAocHJldikKKwkJCQkJcHJldi0+bmV4dCA9IHRtcHZwY2lkZXYtPm5leHQ7CisJCQkJZWxzZQorCQkJCQlWcGNpZGV2TGlzdEhlYWQgPSB0bXB2cGNpZGV2LT5uZXh0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZWcGNpZGV2TGlzdExvY2ssIGZsYWdzKTsKKwkJa2ZyZWUodmlydHBjaWRldik7CisJCXJldHVybiAwOworCX0KKworCUxPR0lORigiQWRkZWQgJXM6JWQ6JWQgJnZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2OiVwXG4iLAorCSAgICAgICAoZGV2dHlwZSA9PSBWSVJUSEJBX1RZUEUpID8gInZpcnRoYmEiIDogInZpcnRuaWMiLAorCSAgICAgICBhZGRwYXJhbXMtPmJ1c05vLCBhZGRwYXJhbXMtPmRldmljZU5vLCAmdmlydHBjaWRldi0+Z2VuZXJpY19kZXYpOworCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2Vfc2VydmVyZG93bihzdHJ1Y3QgZGV2aWNlICpwYXJlbnRidXMsCisJCQkJICAgICBpbnQgZGV2dHlwZSwKKwkJCQkgICAgIHN0cnVjdCB2aGJhX3d3bm4gKnd3bm4sCisJCQkJICAgICB1bnNpZ25lZCBjaGFyIG1hY2FkZHJbXSkKK3sKKwlpbnQgcGF1c2V0aGlzb25lID0gMDsKKwlib29sIGZvdW5kID0gZmFsc2U7CisJc3RydWN0IHZpcnRwY2lfZGV2ICp0bXB2cGNpZGV2LCAqcHJldnZwY2lkZXY7CisJc3RydWN0IHZpcnRwY2lfZHJpdmVyICp2cGNpZHJpdmVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gMDsKKworCWlmICgoZGV2dHlwZSAhPSBWSVJUSEJBX1RZUEUpICYmIChkZXZ0eXBlICE9IFZJUlROSUNfVFlQRSkpIHsKKwkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBwYXVzZSBkZXZpY2U7IGRldnR5cGU6JWQgbm90IHZoYmE6JWQgb3Igdm5pYzolZFxuIiwKKwkJICAgICAgIGRldnR5cGUsIFZJUlRIQkFfVFlQRSwgVklSVE5JQ19UWVBFKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZmluZCB0aGUgdmhiYSBvciB2bmljIGluIHZpcnRwY2kgZGV2aWNlIGxpc3QgKi8KKwl3cml0ZV9sb2NrX2lycXNhdmUoJlZwY2lkZXZMaXN0TG9jaywgZmxhZ3MpOworCisJZm9yICh0bXB2cGNpZGV2ID0gVnBjaWRldkxpc3RIZWFkLCBwcmV2dnBjaWRldiA9IE5VTEw7CisJICAgICAodG1wdnBjaWRldiAmJiAhZm91bmQpOworCSAgICAgcHJldnZwY2lkZXYgPSB0bXB2cGNpZGV2LCB0bXB2cGNpZGV2ID0gdG1wdnBjaWRldi0+bmV4dCkgeworCQlpZiAodG1wdnBjaWRldi0+ZGV2dHlwZSAhPSBkZXZ0eXBlKQorCQkJY29udGludWU7CisKKwkJaWYgKGRldnR5cGUgPT0gVklSVEhCQV9UWVBFKSB7CisJCQlwYXVzZXRoaXNvbmUgPQorCQkJICAgICgodG1wdnBjaWRldi0+c2NzaS53d25uLnd3bm4xID09IHd3bm4tPnd3bm4xKSAmJgorCQkJICAgICAodG1wdnBjaWRldi0+c2NzaS53d25uLnd3bm4yID09IHd3bm4tPnd3bm4yKSk7CisJCQkvKiBkZXZ0eXBlIGlzIHZoYmEsIHdlJ3JlIHBhdXNpbmcgdmhiYSB3aG9zZQorCQkJKiB3d25uIG1hdGNoZXMgdGhlIGN1cnJlbnQgZGV2aWNlJ3Mgd3dubgorCQkJKi8KKwkJfSBlbHNlIHsJLyogVklSVE5JQ19UWVBFICovCisJCQlwYXVzZXRoaXNvbmUgPQorCQkJICAgIG1lbWNtcCh0bXB2cGNpZGV2LT5uZXQubWFjX2FkZHIsIG1hY2FkZHIsCisJCQkJICAgTUFYX01BQ0FERFJfTEVOKSA9PSAwOworCQkJLyogZGV2dHlwZSBpcyB2bmljLCB3ZSdyZSBwYXVzaW5nIHZuaWMgd2hvc2UKKwkJCSogbWFjYWRkciBtYXRjaGVzIHRoZSBjdXJyZW50IGRldmljZSdzIG1hY2FkZHIgKi8KKwkJfQorCisJCWlmICghcGF1c2V0aGlzb25lKQorCQkJY29udGludWU7CisKKwkJZm91bmQgPSB0cnVlOworCQl2cGNpZHJpdmVyID0gdG1wdnBjaWRldi0+bXlkcml2ZXI7CisJCXJjID0gdnBjaWRyaXZlci0+c3VzcGVuZCh0bXB2cGNpZGV2LCAwKTsKKwl9CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJlZwY2lkZXZMaXN0TG9jaywgZmxhZ3MpOworCisJaWYgKCFmb3VuZCkgeworCQlMT0dFUlIoIioqKiogRkFJTEVEIHRvIGZpbmQgdmhiYS92bmljIGluIHRoZSBsaXN0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHZpcnRwY2lfZGV2aWNlX3NlcnZlcnVwKHN0cnVjdCBkZXZpY2UgKnBhcmVudGJ1cywKKwkJCQkgICBpbnQgZGV2dHlwZSwKKwkJCQkgICBzdHJ1Y3QgdmhiYV93d25uICp3d25uLAorCQkJCSAgIHVuc2lnbmVkIGNoYXIgbWFjYWRkcltdKQoreworCWludCByZXN1bWV0aGlzb25lID0gMDsKKwlib29sIGZvdW5kID0gZmFsc2U7CisJc3RydWN0IHZpcnRwY2lfZGV2ICp0bXB2cGNpZGV2LCAqcHJldnZwY2lkZXY7CisJc3RydWN0IHZpcnRwY2lfZHJpdmVyICp2cGNpZHJpdmVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gMDsKKworCWlmICgoZGV2dHlwZSAhPSBWSVJUSEJBX1RZUEUpICYmIChkZXZ0eXBlICE9IFZJUlROSUNfVFlQRSkpIHsKKwkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byByZXN1bWUgZGV2aWNlOyBkZXZ0eXBlOiVkIG5vdCB2aGJhOiVkIG9yIHZuaWM6JWRcbiIsCisJCSAgICAgICBkZXZ0eXBlLCBWSVJUSEJBX1RZUEUsIFZJUlROSUNfVFlQRSk7CisJCXJldHVybiAwOworCX0KKworCS8qIGZpbmQgdGhlIHZoYmEgb3Igdm5pYyBpbiB2aXJ0cGNpIGRldmljZSBsaXN0ICovCisJd3JpdGVfbG9ja19pcnFzYXZlKCZWcGNpZGV2TGlzdExvY2ssIGZsYWdzKTsKKworCWZvciAodG1wdnBjaWRldiA9IFZwY2lkZXZMaXN0SGVhZCwgcHJldnZwY2lkZXYgPSBOVUxMOworCSAgICAgKHRtcHZwY2lkZXYgJiYgIWZvdW5kKTsKKwkgICAgIHByZXZ2cGNpZGV2ID0gdG1wdnBjaWRldiwgdG1wdnBjaWRldiA9IHRtcHZwY2lkZXYtPm5leHQpIHsKKwkJaWYgKHRtcHZwY2lkZXYtPmRldnR5cGUgIT0gZGV2dHlwZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSkgeworCQkJcmVzdW1ldGhpc29uZSA9CisJCQkgICAgKCh0bXB2cGNpZGV2LT5zY3NpLnd3bm4ud3dubjEgPT0gd3dubi0+d3dubjEpICYmCisJCQkgICAgICh0bXB2cGNpZGV2LT5zY3NpLnd3bm4ud3dubjIgPT0gd3dubi0+d3dubjIpKTsKKwkJCS8qIGRldnR5cGUgaXMgdmhiYSwgd2UncmUgcmVzdW1pbmcgdmhiYSB3aG9zZQorCQkJKiB3d25uIG1hdGNoZXMgdGhlIGN1cnJlbnQgZGV2aWNlJ3Mgd3dubiAqLworCQl9IGVsc2UgewkvKiBWSVJUTklDX1RZUEUgKi8KKwkJCXJlc3VtZXRoaXNvbmUgPQorCQkJICAgIG1lbWNtcCh0bXB2cGNpZGV2LT5uZXQubWFjX2FkZHIsIG1hY2FkZHIsCisJCQkJICAgTUFYX01BQ0FERFJfTEVOKSA9PSAwOworCQkJLyogZGV2dHlwZSBpcyB2bmljLCB3ZSdyZSByZXN1bWluZyB2bmljIHdob3NlCisJCQkqIG1hY2FkZHIgbWF0Y2hlcyB0aGUgY3VycmVudCBkZXZpY2UncyBtYWNhZGRyICovCisJCX0KKworCQlpZiAoIXJlc3VtZXRoaXNvbmUpCisJCQljb250aW51ZTsKKworCQlmb3VuZCA9IHRydWU7CisJCXZwY2lkcml2ZXIgPSB0bXB2cGNpZGV2LT5teWRyaXZlcjsKKwkJLyogVGhpcyBzaG91bGQgYmUgZG9uZSBhdCBCVVMgcmVzdW1lIHRpbWUsIGJ1dCBhbgorCQkqIGV4aXN0aW5nIHByb2JsZW0gcHJldmVudHMgdXMgZnJvbSBldmVyIGdldHRpbmcgYSBidXMKKwkJKiByZXN1bWUuLi4gIFRoaXMgaGFjayB3b3VsZCBmYWlsIHRvIHdvcmsgc2hvdWxkIHdlCisJCSogZXZlciBoYXZlIGEgYnVzIHRoYXQgY29udGFpbnMgTk8gZGV2aWNlcywgc2luY2Ugd2UKKwkJKiB3b3VsZCBuZXZlciBldmVuIGdldCBoZXJlIGluIHRoYXQgY2FzZS4KKwkJKi8KKwkJZml4X3ZidXNfZGV2SW5mbygmdG1wdnBjaWRldi0+Z2VuZXJpY19kZXYsIHRtcHZwY2lkZXYtPmRldmljZU5vLAorCQkJCSB0bXB2cGNpZGV2LT5kZXZpY2UsIHZwY2lkcml2ZXIpOworCQlyYyA9IHZwY2lkcml2ZXItPnJlc3VtZSh0bXB2cGNpZGV2KTsKKwl9CisKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmVnBjaWRldkxpc3RMb2NrLCBmbGFncyk7CisKKwlpZiAoIWZvdW5kKSB7CisJCUxPR0VSUigiKioqKiBGQUlMRUQgdG8gZmluZCB2aGJhL3ZuaWMgaW4gdGhlIGxpc3RcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2VfZGVsKHN0cnVjdCBkZXZpY2UgKnBhcmVudGJ1cywKKwkJCSAgICAgIGludCBkZXZ0eXBlLCBzdHJ1Y3QgdmhiYV93d25uICp3d25uLAorCQkJICAgICAgdW5zaWduZWQgY2hhciBtYWNhZGRyW10pCit7CisJaW50IGNvdW50ID0gMCwgYWxsID0gMCwgZGVsdGhpc29uZTsKKwlzdHJ1Y3QgdmlydHBjaV9kZXYgKnRtcHZwY2lkZXYsICpwcmV2dnBjaWRldiwgKmRlbGxpc3QgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNkZWZpbmUgREVMX0NPTlRJTlVFIHsgXAorCXByZXZ2cGNpZGV2ID0gdG1wdnBjaWRldjtcCisJdG1wdnBjaWRldiA9IHRtcHZwY2lkZXYtPm5leHQ7XAorCWNvbnRpbnVlOyBcCit9CisKKwlpZiAoKGRldnR5cGUgIT0gVklSVEhCQV9UWVBFKSAmJiAoZGV2dHlwZSAhPSBWSVJUTklDX1RZUEUpKSB7CisJCUxPR0VSUigiKioqKiBGQUlMRUQgdG8gZGVsZXRlIGRldmljZTsgZGV2dHlwZTolZCBub3QgdmhiYTolZCBvciB2bmljOiVkXG4iLAorCQkgICAgICAgZGV2dHlwZSwgVklSVEhCQV9UWVBFLCBWSVJUTklDX1RZUEUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBzZWUgaWYgd2UgYXJlIHRvIGRlbGV0ZSBhbGwgLSBOT1RFOiBhbGwgaW1wbGllcyB3ZSBoYXZlIGEKKwkgKiB2YWxpZCBwYXJlbnRidXMKKwkgKi8KKwlhbGwgPSAoKGRldnR5cGUgPT0gVklSVEhCQV9UWVBFKSAmJiAod3dubiA9PSBOVUxMKSkgfHwKKwkgICAgKChkZXZ0eXBlID09IFZJUlROSUNfVFlQRSkgJiYgKG1hY2FkZHIgPT0gTlVMTCkpOworCisJLyogZmluZCBhbGwgdGhlIHZoYmEgb3Igdm5pYyBvciBib3RoIGluIHZpcnRwY2kgZGV2aWNlIGxpc3QKKwkqIGtlZXAgbGlzdCBvZiBvbmVzIHdlIGFyZSBkZWxldGluZyBzbyB3ZSBjYW4gY2FsbAorCSogZGV2aWNlX3VucmVnaXN0ZXIgYWZ0ZXIgd2UgcmVsZWFzZSB0aGUgbG9jazsgb3RoZXJ3aXNlIHdlCisJKiBlbmNvdW50ZXIgInNjaGVkdWxlIHdoaWxlIGF0b21pYyIKKwkqLworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmVnBjaWRldkxpc3RMb2NrLCBmbGFncyk7CisJZm9yICh0bXB2cGNpZGV2ID0gVnBjaWRldkxpc3RIZWFkLCBwcmV2dnBjaWRldiA9IE5VTEw7IHRtcHZwY2lkZXY7KSB7CisJCWlmICh0bXB2cGNpZGV2LT5kZXZ0eXBlICE9IGRldnR5cGUpCisJCQlERUxfQ09OVElOVUU7CisKKwkJaWYgKGFsbCkgeworCQkJZGVsdGhpc29uZSA9CisJCQkgICAgKHRtcHZwY2lkZXYtPmdlbmVyaWNfZGV2LnBhcmVudCA9PSBwYXJlbnRidXMpOworCQkJLyogd2UncmUgZGVsZXRpbmcgYWxsIHZoYmFzIG9yIHZuaWNzIG9uIHRoZQorCQkJICogc3BlY2lmaWVkIHBhcmVudCBidXMKKwkJCSAqLworCQl9IGVsc2UgaWYgKGRldnR5cGUgPT0gVklSVEhCQV9UWVBFKSB7CisJCQlkZWx0aGlzb25lID0KKwkJCSAgICAoKHRtcHZwY2lkZXYtPnNjc2kud3dubi53d25uMSA9PSB3d25uLT53d25uMSkgJiYKKwkJCSAgICAgKHRtcHZwY2lkZXYtPnNjc2kud3dubi53d25uMiA9PSB3d25uLT53d25uMikpOworCQkJLyogZGV2dHlwZSBpcyB2aGJhLCB3ZSdyZSBkZWxldGluZyB2aGJhIHdob3NlCisJCQkgKiB3d25uIG1hdGNoZXMgdGhlIGN1cnJlbnQgZGV2aWNlJ3Mgd3dubgorCQkJICovCisJCX0gZWxzZSB7CS8qIFZJUlROSUNfVFlQRSAqLworCQkJZGVsdGhpc29uZSA9CisJCQkgICAgbWVtY21wKHRtcHZwY2lkZXYtPm5ldC5tYWNfYWRkciwgbWFjYWRkciwKKwkJCQkgICBNQVhfTUFDQUREUl9MRU4pID09IDA7CisJCQkvKiBkZXZ0eXBlIGlzIHZuaWMsIHdlJ3JlIGRlbGV0aW5nIHZuaWMgd2hvc2UKKwkJCSogbWFjYWRkciBtYXRjaGVzIHRoZSBjdXJyZW50IGRldmljZSdzIG1hY2FkZHIKKwkJCSovCisJCX0KKworCQlpZiAoIWRlbHRoaXNvbmUpCisJCQlERUxfQ09OVElOVUU7CisKKwkJLyogdGFrZSB2aGJhL3ZuaWMgb3V0IG9mIHRoZSBsaXN0ICovCisJCWlmIChwcmV2dnBjaWRldikKKwkJCS8qIG5vdCBhdCBoZWFkICovCisJCQlwcmV2dnBjaWRldi0+bmV4dCA9IHRtcHZwY2lkZXYtPm5leHQ7CisJCWVsc2UKKwkJCVZwY2lkZXZMaXN0SGVhZCA9IHRtcHZwY2lkZXYtPm5leHQ7CisKKwkJLyogYWRkIGl0IHRvIG91ciBkZWxldGVsaXN0ICovCisJCXRtcHZwY2lkZXYtPm5leHQgPSBkZWxsaXN0OworCQlkZWxsaXN0ID0gdG1wdnBjaWRldjsKKworCQljb3VudCsrOworCQlpZiAoIWFsbCkKKwkJCWJyZWFrOwkvKiBkb25lICovCisJCS8qIGdvaW5nIHRvIHRvcCBvZiBsb29wIGFnYWluIC0gc2V0IHRtcHZwY2lkZXYgdG8gbmV4dAorCQkgKiBvbmUgd2UncmUgdG8gcHJvY2VzcworCQkgKi8KKwkJaWYgKHByZXZ2cGNpZGV2KQorCQkJdG1wdnBjaWRldiA9IHByZXZ2cGNpZGV2LT5uZXh0OworCQllbHNlCisJCQl0bXB2cGNpZGV2ID0gVnBjaWRldkxpc3RIZWFkOworCX0KKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmVnBjaWRldkxpc3RMb2NrLCBmbGFncyk7CisKKwlpZiAoIWFsbCAmJiAoY291bnQgPT0gMCkpIHsKKwkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBmaW5kIHZoYmEvdm5pYyBpbiB0aGUgbGlzdFxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIG5vdyBkZWxldGUgZWFjaCBvbmUgZnJvbSBkZWxldGUgbGlzdCAqLworCXdoaWxlIChkZWxsaXN0KSB7CisJCS8qIHNhdmUgbmV4dCAqLworCQl0bXB2cGNpZGV2ID0gZGVsbGlzdC0+bmV4dDsKKwkJLyogZGVsZXRlIHRoZSB2aGJhL3ZuaWMgYXQgZGVsbGlzdCAqLworCQlERUxFVEVfT05FX1ZQQ0lERVYoZGVsbGlzdCk7CisJCS8qIGRvIG5leHQgKi8KKwkJZGVsbGlzdCA9IHRtcHZwY2lkZXY7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdm9pZCB2aXJ0cGNpX2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldl8pCit7CisJLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlCisJICogZGV2aWNlIGlzIHJlbW92ZWQKKwkgKi8KKwlMT0dJTkYoIkluIHZpcnRwY2lfZGV2aWNlX3JlbGVhc2U6JXAgLSBOT1QgWUVUIElNUExFTUVOVEVEXG4iLCBkZXZfKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRHJpdmVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGtvYmpfdG9fZGV2aWNlX2RyaXZlcihvYmopIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkZXZpY2VfZHJpdmVyLCBrb2JqKQorI2RlZmluZSBhdHRyaWJ1dGVfdG9fZHJpdmVyX2F0dHJpYnV0ZShvYmopIFwKKwljb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZHJpdmVyX2F0dHJpYnV0ZSwgYXR0cikKKworc3RhdGljIHNzaXplX3QgdmlydHBjaV9kcml2ZXJfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJCQljaGFyICpidWYpCit7CisJc3RydWN0IGRyaXZlcl9hdHRyaWJ1dGUgKmRhdHRyID0gYXR0cmlidXRlX3RvX2RyaXZlcl9hdHRyaWJ1dGUoYXR0cik7CisJc3NpemVfdCByZXQgPSAwOworCisJc3RydWN0IGRyaXZlcl9wcml2YXRlICpkcHJpdmF0ZSA9IHRvX2RyaXZlcihrb2JqKTsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyOworCWlmIChkcHJpdmF0ZSAhPSBOVUxMKQorCQlkcml2ZXIgPSBkcHJpdmF0ZS0+ZHJpdmVyOworCWVsc2UKKwkJZHJpdmVyID0gTlVMTDsKKworCURCR0lORigiSW4gdmlydHBjaV9kcml2ZXJfYXR0cl9zaG93IGRyaXZlci0+bmFtZTolc1xuIiwgZHJpdmVyLT5uYW1lKTsKKwlpZiAoZHJpdmVyKSB7CisJCWlmIChkYXR0ci0+c2hvdykKKwkJCXJldCA9IGRhdHRyLT5zaG93KGRyaXZlciwgYnVmKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgdmlydHBjaV9kcml2ZXJfYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZHJpdmVyX2F0dHJpYnV0ZSAqZGF0dHIgPSBhdHRyaWJ1dGVfdG9fZHJpdmVyX2F0dHJpYnV0ZShhdHRyKTsKKwlzc2l6ZV90IHJldCA9IDA7CisKKwlzdHJ1Y3QgZHJpdmVyX3ByaXZhdGUgKmRwcml2YXRlID0gdG9fZHJpdmVyKGtvYmopOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXI7CisJaWYgKGRwcml2YXRlICE9IE5VTEwpCisJCWRyaXZlciA9IGRwcml2YXRlLT5kcml2ZXI7CisJZWxzZQorCQlkcml2ZXIgPSBOVUxMOworCisJREJHSU5GKCJJbiB2aXJ0cGNpX2RyaXZlcl9hdHRyX3N0b3JlIGRyaXZlci0+bmFtZTolc1xuIiwgZHJpdmVyLT5uYW1lKTsKKworCWlmIChkcml2ZXIpIHsKKwkJaWYgKGRhdHRyLT5zdG9yZSkKKwkJCXJldCA9IGRhdHRyLT5zdG9yZShkcml2ZXIsIGJ1ZiwgY291bnQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiByZWdpc3RlciBhIG5ldyB2aXJ0cGNpIGRyaXZlciAqLworaW50IHZpcnRwY2lfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB2aXJ0cGNpX2RyaXZlciAqZHJ2KQoreworCWludCByZXN1bHQgPSAwOworCisJREJHSU5GKCJJbiB2aXJ0cGNpX3JlZ2lzdGVyX2RyaXZlclxuIik7CisKKwlpZiAoZHJ2LT5pZF90YWJsZSA9PSBOVUxMKSB7CisJCUxPR0VSUigiaWRfdGFibGUgbWlzc2luZ1xuIik7CisJCXJldHVybiAxOworCX0KKwkvKiBpbml0aWFsaXplIGNvcmUgZHJpdmVyIGZpZWxkcyBuZWVkZWQgdG8gY2FsbCBkcml2ZXJfcmVnaXN0ZXIgKi8KKwlkcnYtPmNvcmVfZHJpdmVyLm5hbWUgPSBkcnYtPm5hbWU7CS8qIG5hbWUgb2YgZHJpdmVyIGluIHN5c2ZzICovCisJZHJ2LT5jb3JlX2RyaXZlci5idXMgPSAmdmlydHBjaV9idXNfdHlwZTsJLyogdHlwZSBvZiBidXMgdGhpcworCQkJCQkJCSAqIGRyaXZlciB3b3JrcyB3aXRoICovCisJZHJ2LT5jb3JlX2RyaXZlci5wcm9iZSA9IHZpcnRwY2lfZGV2aWNlX3Byb2JlOwkvKiBjYWxsZWQgdG8gcXVlcnkgdGhlCisJCQkJCQkJICogZXhpc3RlbmNlIG9mIGEKKwkJCQkJCQkgKiBzcGVjaWZpYyBkZXZpY2UgYW5kCisJCQkJCQkJICogd2hldGhlciB0aGlzIGRyaXZlcgorCQkJCQkJCSAqY2FuIHdvcmsgd2l0aCBpdCAqLworCWRydi0+Y29yZV9kcml2ZXIucmVtb3ZlID0gdmlydHBjaV9kZXZpY2VfcmVtb3ZlOyAvKiBjYWxsZWQgd2hlbiB0aGUKKwkJCQkJCQkgICogZGV2aWNlIGlzIHJlbW92ZWQKKwkJCQkJCQkgICogZnJvbSB0aGUgc3lzdGVtICovCisJLyogcmVnaXN0ZXIgd2l0aCBjb3JlICovCisJcmVzdWx0ID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmNvcmVfZHJpdmVyKTsKKwkvKiBjYWxscyBidXNfYWRkX2RyaXZlciB3aGljaCBjYWxscyBkcml2ZXJfYXR0YWNoIGFuZAorCSAqIG1vZHVsZV9hZGRfZHJpdmVyCisJICovCisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsJLyogZmFpbGVkICovCisKKwlkcnYtPmNvcmVfZHJpdmVyLnAtPmtvYmoua3R5cGUgPSAmdmlydHBjaV9kcml2ZXJfa29ial90eXBlOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXJ0cGNpX3JlZ2lzdGVyX2RyaXZlcik7CisKK3ZvaWQgdmlydHBjaV91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdmlydHBjaV9kcml2ZXIgKmRydikKK3sKKwlEQkdJTkYoIkluIHZpcnRwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgZHJ2OiVwXG4iLCBkcnYpOworCWRyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmNvcmVfZHJpdmVyKTsKKwkvKiBkcml2ZXJfdW5yZWdpc3RlciBjYWxscyBidXNfcmVtb3ZlX2RyaXZlcgorCSAqIGJ1c19yZW1vdmVfZHJpdmVyIGNhbGxzIGRldmljZV9kZXRhY2gKKwkgKiBkZXZpY2VfZGV0YWNoIGNhbGxzIGRldmljZV9yZWxlYXNlX2RyaXZlciBmb3IgZWFjaCBvZiB0aGUKKwkgKiBkcml2ZXIncyBkZXZpY2VzCisJICogZGV2aWNlX3JlbGVhc2UgZHJpdmVyIGNhbGxzIGRydi0+cmVtb3ZlIHdoaWNoIGlzCisJICogdmlydHBjaV9kZXZpY2VfcmVtb3ZlCisJICogdmlydHBjaV9kZXZpY2VfcmVtb3ZlIGNhbGxzIHZpcnRoYmFfcmVtb3ZlCisJICovCisJREJHSU5GKCJMZWF2aW5nXG4iKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpcnRwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBwcm9jIGZpbGVzeXN0ZW0gZnVuY3Rpb25zCQkJCQkJICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgcHJpbnRfdmJ1c19pbmZvIHsKKwlpbnQgKmxlbmd0aDsKKwljaGFyICpidWY7Cit9OworCitzdGF0aWMgaW50IHByaW50X3ZidXMoc3RydWN0IGRldmljZSAqdmJ1cywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcHJpbnRfdmJ1c19pbmZvICpwID0gKHN0cnVjdCBwcmludF92YnVzX2luZm8gKikgZGF0YTsKKwlpbnQgbCA9ICoocC0+bGVuZ3RoKTsKKworCSoocC0+bGVuZ3RoKSA9IGwgKyBzcHJpbnRmKHAtPmJ1ZiArIGwsICJidXNfaWQ6JXNcbiIsIGRldl9uYW1lKHZidXMpKTsKKwlyZXR1cm4gMDsJCS8qIG5vIGVycm9yICovCit9CisKK3N0YXRpYyBzc2l6ZV90IGluZm9fcHJvY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCit7CisJaW50IGxlbmd0aCA9IDA7CisJc3RydWN0IHZpcnRwY2lfZGV2ICp0bXB2cGNpZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHByaW50X3ZidXNfaW5mbyBwcmludHBhcmFtOworCWNoYXIgKnZidWY7CisJbG9mZl90IHBvcyA9ICpvZmZzZXQ7CisKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocG9zID4gMCB8fCAhbGVuKQorCQlyZXR1cm4gMDsKKworCXZidWYgPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2YnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlbmd0aCArPSBzcHJpbnRmKHZidWYgKyBsZW5ndGgsICJDSEFOU09DSyBpcyBub3QgZGVmaW5lZC5cbiIpOworCisJbGVuZ3RoICs9IHNwcmludGYodmJ1ZiArIGxlbmd0aCwgIlxuIFZpcnR1YWwgUENJIEJ1cyBkZXZpY2VzXG4iKTsKKwlwcmludHBhcmFtLmxlbmd0aCA9ICZsZW5ndGg7CisJcHJpbnRwYXJhbS5idWYgPSB2YnVmOworCWlmIChidXNfZm9yX2VhY2hfZGV2KCZ2aXJ0cGNpX2J1c190eXBlLCBOVUxMLAorCQkJICAgICAodm9pZCAqKSAmcHJpbnRwYXJhbSwgcHJpbnRfdmJ1cykpCisJCUxPR0VSUigiZGVsZXRlIG9mIGFsbCB2YnVzIGZhaWxlZFxuIik7CisKKwlsZW5ndGggKz0gc3ByaW50Zih2YnVmICsgbGVuZ3RoLCAiXG4gVmlydHVhbCBQQ0kgZGV2aWNlc1xuIik7CisJcmVhZF9sb2NrX2lycXNhdmUoJlZwY2lkZXZMaXN0TG9jaywgZmxhZ3MpOworCXRtcHZwY2lkZXYgPSBWcGNpZGV2TGlzdEhlYWQ7CisJd2hpbGUgKHRtcHZwY2lkZXYpIHsKKwkJaWYgKHRtcHZwY2lkZXYtPmRldnR5cGUgPT0gVklSVEhCQV9UWVBFKSB7CisJCQlsZW5ndGggKz0gc3ByaW50Zih2YnVmICsgbGVuZ3RoLCAiWyVkOiVkXSBWSGJhOiUwOHg6JTA4eCBtYXgtY29uZmlnOiVkLSVkLSVkLSVkIiwKKwkJCQkgICAgdG1wdnBjaWRldi0+YnVzTm8sIHRtcHZwY2lkZXYtPmRldmljZU5vLAorCQkJCSAgICB0bXB2cGNpZGV2LT5zY3NpLnd3bm4ud3dubjEsCisJCQkJICAgIHRtcHZwY2lkZXYtPnNjc2kud3dubi53d25uMiwKKwkJCQkgICAgdG1wdnBjaWRldi0+c2NzaS5tYXgubWF4X2NoYW5uZWwsCisJCQkJICAgIHRtcHZwY2lkZXYtPnNjc2kubWF4Lm1heF9pZCwKKwkJCQkgICAgdG1wdnBjaWRldi0+c2NzaS5tYXgubWF4X2x1biwKKwkJCQkgICAgdG1wdnBjaWRldi0+c2NzaS5tYXguY21kX3Blcl9sdW4pOworCQl9IGVsc2UgeworCQkJbGVuZ3RoICs9IHNwcmludGYodmJ1ZiArIGxlbmd0aCwgIlslZDolZF0gVk5pYzolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBudW1fcmN2X2J1ZnM6JWQgbXR1OiVkIiwKKwkJCQkgICAgdG1wdnBjaWRldi0+YnVzTm8sIHRtcHZwY2lkZXYtPmRldmljZU5vLAorCQkJCSAgICB0bXB2cGNpZGV2LT5uZXQubWFjX2FkZHJbMF0sCisJCQkJICAgIHRtcHZwY2lkZXYtPm5ldC5tYWNfYWRkclsxXSwKKwkJCQkgICAgdG1wdnBjaWRldi0+bmV0Lm1hY19hZGRyWzJdLAorCQkJCSAgICB0bXB2cGNpZGV2LT5uZXQubWFjX2FkZHJbM10sCisJCQkJICAgIHRtcHZwY2lkZXYtPm5ldC5tYWNfYWRkcls0XSwKKwkJCQkgICAgdG1wdnBjaWRldi0+bmV0Lm1hY19hZGRyWzVdLAorCQkJCSAgICB0bXB2cGNpZGV2LT5uZXQubnVtX3Jjdl9idWZzLAorCQkJCSAgICB0bXB2cGNpZGV2LT5uZXQubXR1KTsKKwkJfQorCQlsZW5ndGggKz0KKwkJICAgIHNwcmludGYodmJ1ZiArIGxlbmd0aCwgIiBjaGFucHRyOiVwXG4iLAorCQkJICAgIHRtcHZwY2lkZXYtPnF1ZXVlaW5mby5jaGFuKTsKKwkJdG1wdnBjaWRldiA9IHRtcHZwY2lkZXYtPm5leHQ7CisJfQorCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJlZwY2lkZXZMaXN0TG9jaywgZmxhZ3MpOworCisJbGVuZ3RoICs9CisJICAgIHNwcmludGYodmJ1ZiArIGxlbmd0aCwgIlxuTW9kdWxlIGJ1aWxkOiBEYXRlOiVzIFRpbWU6JXNcbiIsIF9fREFURV9fLAorCQkgICAgX19USU1FX18pOworCisJbGVuZ3RoICs9IHNwcmludGYodmJ1ZiArIGxlbmd0aCwgIlxuIik7CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIHZidWYsIGxlbmd0aCkpIHsKKwkJa2ZyZWUodmJ1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWtmcmVlKHZidWYpOworCSpvZmZzZXQgKz0gbGVuZ3RoOworCXJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHZpcnRfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1ZlsxNl07CisJaW50IHR5cGUsIGksIGFjdGlvbiA9IDB4ZmZmZjsKKwl1bnNpZ25lZCBpbnQgYnVzbm8sIGRldmljZW5vOworCXZvaWQgX19pb21lbSAqY2hhbnB0cjsKKwlzdHJ1Y3QgYWRkX3ZidXNfZ3Vlc3RwYXJ0IGJ1c2FkZHBhcmFtczsKKwlzdHJ1Y3QgYWRkX3ZpcnRfZ3Vlc3RwYXJ0IGFkZHBhcmFtczsKKwlzdHJ1Y3QgZGVsX3ZidXNfZ3Vlc3RwYXJ0IGJ1c2RlbHBhcmFtczsKKwlzdHJ1Y3QgZGVsX3ZpcnRfZ3Vlc3RwYXJ0IGRlbHBhcmFtczsKKwlHVUlEIGR1bW15R3VpZCA9IEdVSUQwOworI2lmZGVmIFNUT1JBR0VfQ0hBTk5FTAorCVU2NCBzdG9yYWdlY2hhbm5lbDsKKyNlbmRpZgorCisjZGVmaW5lIFBSSU5UX1VTQUdFX1JFVFVSTiB7XAorCUxPR0VSUigidXNhZ2U6IDAtMC08Y2hhbnB0cj4JCQkJCT09PiBkZWxldGUgdmhiYVxuIik7IFwKKwlMT0dFUlIoInVzYWdlOiAwLTEtPGNoYW5wdHI+LTxidXNObz4tPGRldmljZU5vPgk9PT4gYWRkIHZoYmFcbiIpOyBcCisJTE9HRVJSKCJ1c2FnZTogMC1mLTxidXNObz4JCQkJCQk9PT4gZGVsZXRlIGFsbCB2aGJhc1xuIik7IFwKKwlMT0dFUlIoIlxuIik7IFwKKwlMT0dFUlIoInVzYWdlOiAxLTAtPGNoYW5wdHI+CQkJCQk9PT4gZGVsZXRlIHZuaWNcbiIpOyBcCisJTE9HRVJSKCJ1c2FnZTogMS0xLTxjaGFucHRyPi08YnVzTm8+LTxkZXZpY2VObz4JPT0+IGFkZCB2bmljXG4iKTsgXAorCUxPR0VSUigidXNhZ2U6IDEtZi08YnVzTm8+CQkJCQkJPT0+IGRlbGV0ZSBhbGwgdm5pY3NcbiIpOyBcCisJTE9HRVJSKCJcbiIpOyBcCisJTE9HRVJSKCJ1c2FnZTogNi0wLTxidXNObz4JCQkJCQk9PT4gZGVsZXRlIHZidXNcbiIpOyBcCisJTE9HRVJSKCJ1c2FnZTogNi0xLTxidXNObz4JCQkJCQk9PT4gYWRkIHZidXNcbiIpOyBcCisJTE9HRVJSKCJ1c2FnZTogNi1mCQkJCQkJCQk9PT4gZGVsZXRlIGFsbCB2YnVzZXNcbiIpOyBcCisJTE9HRVJSKCJ1c2FnZTogOTgtPGJ1c05vPi08ZGV2aWNlTm8+CQkJPT0+IElOSkVDVCBDbGllbnQgZGVsZXRlIHZuaWNcbiIpOyBcCisJTE9HRVJSKCJ1c2FnZTogOTktPGNoYW5wdHI+LTxidXNObz4tPGRldmljZU5vPgk9PT4gSU5KRUNUIENsaWVudCBhZGQgdm5pY1xuIik7IFwKKwlyZXR1cm4gLUVJTlZBTDsgXAorfQorCisJaWYgKGNvdW50ID49IEFSUkFZX1NJWkUoYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlMT0dFUlIoImNvcHlfZnJvbV91c2VyIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpID0gc3NjYW5mKGJ1ZiwgIiV4LSV4IiwgJnR5cGUsICZhY3Rpb24pOworCWlmIChpIDwgMikKKwkJUFJJTlRfVVNBR0VfUkVUVVJOOworCisJaWYgKHR5cGUgPT0gMHg5OCkgeworCQkvKiBjbGllbnQgaW5qZWN0IGRlbGV0ZSB2bmljICovCisJCWkgPSBzc2NhbmYoYnVmLCAiJXgtJWQtJWQiLCAmdHlwZSwgJmJ1c25vLCAmZGV2aWNlbm8pOworCQlpZiAoaSAhPSAzKQorCQkJUFJJTlRfVVNBR0VfUkVUVVJOOworCQl1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfdm5pYyhidXNubywgZGV2aWNlbm8pOworCQlyZXR1cm4gY291bnQ7CS8qIHN1Y2Nlc3MgKi8KKwl9IGVsc2UgaWYgKHR5cGUgPT0gMHg5OSkgeworCQkvKiBjbGllbnQgaW5qZWN0IGFkZCB2bmljICovCisJCWkgPSBzc2NhbmYoYnVmLCAiJXgtJXAtJWQtJWQiLCAmdHlwZSwgJmNoYW5wdHIsICZidXNubywKKwkJCSAgICZkZXZpY2Vubyk7CisJCWlmIChpICE9IDQpCisJCQlQUklOVF9VU0FHRV9SRVRVUk47CisJCWlmICghdWlzbGliX2NsaWVudF9pbmplY3RfYWRkX3ZuaWMoYnVzbm8sIGRldmljZW5vLAorCQkJCQkJICAgX19wYShjaGFucHRyKSwKKwkJCQkJCSAgIE1JTl9JT19DSEFOTkVMX1NJWkUsCisJCQkJCQkgICAxLCAvKiB0ZXN0IG1zZyAqLworCQkJCQkJICAgZHVtbXlHdWlkLCAvKiBpbnN0IGd1aWQgKi8KKwkJCQkJCSAgIE5VTEwpKSB7IC8qaW50ZXJydXB0IGluZm8gKi8KKwkJCUxPR0VSUigiRkFJTEVEIHRvIGluamVjdCBhZGQgdm5pY1xuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gY291bnQ7CS8qIHN1Y2Nlc3MgKi8KKwl9CisKKwlpZiAoKHR5cGUgIT0gVklSVEhCQV9UWVBFKSAmJiAodHlwZSAhPSBWSVJUTklDX1RZUEUpCisJICAgICYmICh0eXBlICE9IFZJUlRCVVNfVFlQRSkpCisJCVBSSU5UX1VTQUdFX1JFVFVSTjsKKworCWlmICh0eXBlID09IFZJUlRCVVNfVFlQRSkgeworCQlpID0gc3NjYW5mKGJ1ZiwgIiV4LSV4LSVkIiwgJnR5cGUsICZhY3Rpb24sICZidXNubyk7CisJCXN3aXRjaCAoYWN0aW9uKSB7CisJCWNhc2UgMDoKKwkJCS8qIGRlbGV0ZSB2YnVzICovCisJCQlpZiAoaSAhPSAzKQorCQkJCWJyZWFrOworCQkJYnVzZGVscGFyYW1zLmJ1c05vID0gYnVzbm87CisJCQlpZiAoZGVsZXRlX3ZidXMoJmJ1c2RlbHBhcmFtcykpCisJCQkJcmV0dXJuIGNvdW50OwkvKiBzdWNjZXNzICovCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQljYXNlIDE6CisJCQkvKiBhZGQgdmJ1cyAqLworCQkJaWYgKGkgIT0gMykKKwkJCQlicmVhazsKKwkJCWJ1c2FkZHBhcmFtcy5jaGFucHRyID0gTlVMTDsJLyogTk9UIFlFVCBVU0VEICovCisJCQlidXNhZGRwYXJhbXMuYnVzTm8gPSBidXNubzsKKwkJCWlmIChhZGRfdmJ1cygmYnVzYWRkcGFyYW1zKSkKKwkJCQlyZXR1cm4gY291bnQ7CS8qIHN1Y2Nlc3MgKi8KKwkJCXJldHVybiAtRUZBVUxUOworCisJCWNhc2UgMHhmOgorCQkJLyogZGVsZXRlIGFsbCB2YnVzZXMgYW5kIGFsbCB2aGJhcy92bmljcyBvbiB0aGUgYnVzZXMgKi8KKwkJCWlmIChpICE9IDIpCisJCQkJYnJlYWs7CisJCQlkZWxldGVfYWxsKCk7CisJCQlyZXR1cm4gY291bnQ7CS8qIHN1Y2Nlc3MgKi8KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCVBSSU5UX1VTQUdFX1JFVFVSTjsKKwl9CisKKwkvKiBpZiAodHlwZSA9PSBWSVJUTklDX1RZUEUpIG9yICAgICAgICAgaWYgKHR5cGUgPT0gVklSVEhCQV9UWVBFKSAqLworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSAwOgorCQkvKiBkZWxldGUgdmhiYS92bmljICovCisJCWkgPSBzc2NhbmYoYnVmLCAiJXgtJXgtJXAiLCAmdHlwZSwgJmFjdGlvbiwgJmNoYW5wdHIpOworCQlpZiAoaSAhPSAzKQorCQkJYnJlYWs7CisJCWRlbHBhcmFtcy5jaGFucHRyID0gY2hhbnB0cjsKKwkJaWYgKHR5cGUgPT0gVklSVEhCQV9UWVBFKSB7CisJCQlpZiAoZGVsZXRlX3ZoYmEoJmRlbHBhcmFtcykpCisJCQkJcmV0dXJuIGNvdW50OwkvKiBzdWNjZXNzICovCisJCX0gZWxzZSB7CisJCQlpZiAoZGVsZXRlX3ZuaWMoJmRlbHBhcmFtcykpCisJCQkJcmV0dXJuIGNvdW50OwkvKiBzdWNjZXNzICovCisJCX0KKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljYXNlIDE6CisJCS8qIGFkZCB2aGJhL3ZuaWMgKi8KKwkJaSA9IHNzY2FuZihidWYsICIleC0leC0lcC0lZC0lZCIsICZ0eXBlLCAmYWN0aW9uLCAmY2hhbnB0ciwKKwkJCSAgICZidXNubywgJmRldmljZW5vKTsKKwkJaWYgKGkgIT0gNSkKKwkJCWJyZWFrOworCQlhZGRwYXJhbXMuY2hhbnB0ciA9IGNoYW5wdHI7CisJCWFkZHBhcmFtcy5idXNObyA9IGJ1c25vOworCQlhZGRwYXJhbXMuZGV2aWNlTm8gPSBkZXZpY2VubzsKKwkJaWYgKHR5cGUgPT0gVklSVEhCQV9UWVBFKSB7CisJCQlpZiAoYWRkX3ZoYmEoJmFkZHBhcmFtcykpCisJCQkJcmV0dXJuIGNvdW50OwkvKiBzdWNjZXNzICovCisJCX0gZWxzZSB7CisJCQlpZiAoYWRkX3ZuaWMoJmFkZHBhcmFtcykpCisJCQkJcmV0dXJuIGNvdW50OwkvKiBzdWNjZXNzICovCisJCX0KKwkJcmV0dXJuIC1FRkFVTFQ7CisKKyNpZmRlZiBTVE9SQUdFX0NIQU5ORUwKKwljYXNlIDI6CisJCS8qIGFkZCB2aGJhICovCisJCWkgPSBzc2NhbmYoYnVmLCAiJXgtJXgtJWQtJWQiLCAmdHlwZSwgJmFjdGlvbiwgJmJ1c25vLAorCQkJICAgJmRldmljZW5vKTsKKwkJaWYgKGkgIT0gNCkKKwkJCWJyZWFrOworCQlzdG9yYWdlY2hhbm5lbCA9IHVpc2xpYl9zdG9yYWdlX2NoYW5uZWwoMCk7CS8qIEdldCBteSBzdG9yYWdlIGNoYW5uZWwgKi8KKwkJLyogaW9yZW1hcF9jYWNoZSBpdCBub3cgKi8KKwkJYWRkcGFyYW1zLmNoYW5wdHIgPQorCQkgICAgKHZvaWQgKikgaW9yZW1hcF9jYWNoZShzdG9yYWdlY2hhbm5lbCwgSU9fQ0hBTk5FTF9TSVpFKTsKKwkJaWYgKGFkZHBhcmFtcy5jaGFucHRyID09IE5VTEwpIHsKKwkJCUxPR0VSUigiRmFpbHVyZSB0byBnZXQgcmVtYXAgc3RvcmFnZSBjaGFubmVsLlxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlhZGRwYXJhbXMuYnVzTm8gPSBidXNubzsKKwkJYWRkcGFyYW1zLmRldmljZU5vID0gZGV2aWNlbm87CisJCWlmICh0eXBlID09IFZJUlRIQkFfVFlQRSkgeworCQkJaWYgKGFkZF92aGJhKCZhZGRwYXJhbXMpKQorCQkJCXJldHVybiBjb3VudDsJLyogc3VjY2VzcyAqLworCQl9CisJCXJldHVybiAtRUZBVUxUOworI2VuZGlmCisJY2FzZSAweGY6CisJCS8qIGRlbGV0ZSBhbGwgdmhiYXMvdm5pY3MgKi8KKwkJaSA9IHNzY2FuZihidWYsICIleC0leC0lZCIsICZ0eXBlLCAmYWN0aW9uLCAmYnVzbm8pOworCQlpZiAoaSAhPSAzKQorCQkJYnJlYWs7CisJCWJ1c2RlbHBhcmFtcy5idXNObyA9IGJ1c25vOworCQlkZWxldGVfYWxsX3ZpcnQodHlwZSwgJmJ1c2RlbHBhcmFtcyk7CisJCXJldHVybiBjb3VudDsJLyogc3VjY2VzcyAqLworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlQUklOVF9VU0FHRV9SRVRVUk47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1vZHVsZSBJbml0ICYgRXhpdCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBfX2luaXQgdmlydHBjaV9tb2RfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKworCUxPR0lORigiTW9kdWxlIGJ1aWxkOiBEYXRlOiVzIFRpbWU6JXMuLi5cbiIsIF9fREFURV9fLCBfX1RJTUVfXyk7CisKKwlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCXJldCA9IGJ1c19yZWdpc3RlcigmdmlydHBjaV9idXNfdHlwZSk7CisJLyogY3JlYXRlcyAvc3lzL2J1cy91aXN2aXJ0cGNpIHdoaWNoIGNvbnRhaW5zIGRldmljZXMgJgorCSAqIGRyaXZlcnMgZGlyZWN0b3J5CisJICovCisJaWYgKHJldCkgeworCQlMT0dFUlIoImJ1c19yZWdpc3RlciAqKioqRkFJTEVEOiVkXG4iLCByZXQpOworCQlQT1NUQ09ERV9MSU5VWF8zKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIHJldCwKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJREJHSU5GKCJidXNfcmVnaXN0ZXIgc3VjY2Vzc2Z1bFxuIik7CisJQnVzRGV2aWNlSW5mb19Jbml0KCZCdXNfRHJpdmVySW5mbywKKwkJCSAgICJjbGllbnRidXMiLCAidmlydHBjaSIsCisJCQkgICBWRVJTSU9OLCBOVUxMLCBfX0RBVEVfXywgX19USU1FX18pOworCisJLyogY3JlYXRlIGEgcm9vdCBidXMgdXNlZCB0byBwYXJlbnQgYWxsIHRoZSB2aXJ0cGNpIGJ1c2VzLiAqLworCXJldCA9IGRldmljZV9yZWdpc3RlcigmdmlydHBjaV9yb290YnVzX2RldmljZSk7CisJaWYgKHJldCkgeworCQlMT0dFUlIoImRldmljZV9yZWdpc3RlciBGQUlMRUQ6JWRcbiIsIHJldCk7CisJCWJ1c191bnJlZ2lzdGVyKCZ2aXJ0cGNpX2J1c190eXBlKTsKKwkJUE9TVENPREVfTElOVVhfMyhWUENJX0NSRUFURV9GQUlMVVJFX1BDLCByZXQsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiByZXQ7CisJfQorCURCR0lORigiZGV2aWNlX3JlZ2lzdGVyIHN1Y2Nlc3NmdWwgcmV0OiV4XG4iLCByZXQpOworCisJaWYgKCF1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyKDIsICh2b2lkICopICZ2aXJ0cGNpX2N0cmxjaGFuX2Z1bmMsCisJCQkJCSAgJkNoaXBzZXRfRHJpdmVySW5mbykpIHsKKwkJTE9HRVJSKCJ1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyICoqKipGQUlMRUQuXG4iKTsKKwkJUE9TVENPREVfTElOVVhfMihWUENJX0NSRUFURV9GQUlMVVJFX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlkZXZpY2VfdW5yZWdpc3RlcigmdmlydHBjaV9yb290YnVzX2RldmljZSk7CisJCWJ1c191bnJlZ2lzdGVyKCZ2aXJ0cGNpX2J1c190eXBlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCUxPR0lORigic3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQgdmlydHBjaV9jdHJsY2hhbl9mdW5jICgweCVwKSBhcyBjYWxsYmFjay5cbiIsCisJICAgICAodm9pZCAqKSAmdmlydHBjaV9jdHJsY2hhbl9mdW5jKTsKKwkvKiBjcmVhdGUgdGhlIHByb2MgZGlyZWN0b3JpZXMgKi8KKwl2aXJ0cGNpX3Byb2NfZGlyID0gcHJvY19ta2RpcihESVJfUFJPQ19FTlRSWSwgTlVMTCk7CisJdmlydF9wcm9jX2VudHJ5ID0gcHJvY19jcmVhdGUoVklSVF9QUk9DX0VOVFJZX0ZOLCAwLCB2aXJ0cGNpX3Byb2NfZGlyLAorCQkJCSAgICAgICZwcm9jX3ZpcnRfZm9wcyk7CisJaW5mb19wcm9jX2VudHJ5ID0gcHJvY19jcmVhdGUoSU5GT19QUk9DX0VOVFJZX0ZOLCAwLCB2aXJ0cGNpX3Byb2NfZGlyLAorCQkJCSAgICAgICZwcm9jX2luZm9fZm9wcyk7CisJTE9HSU5GKCJMZWF2aW5nXG4iKTsKKwlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0VYSVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdmlydHBjaV9tb2RfZXhpdCh2b2lkKQoreworCUxPR0lORigidmlydHBjaV9tb2RfZXhpdC4uLlxuIik7CisKKwkvKiB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLworCWlmICghdWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcigyLCBOVUxMLCBOVUxMKSkKKwkJTE9HRVJSKCJ1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyICoqKipGQUlMRUQuXG4iKTsKKworCWRldmljZV91bnJlZ2lzdGVyKCZ2aXJ0cGNpX3Jvb3RidXNfZGV2aWNlKTsKKwlidXNfdW5yZWdpc3RlcigmdmlydHBjaV9idXNfdHlwZSk7CisKKwlpZiAodmlydF9wcm9jX2VudHJ5KQorCQlyZW1vdmVfcHJvY19lbnRyeShWSVJUX1BST0NfRU5UUllfRk4sIHZpcnRwY2lfcHJvY19kaXIpOworCisJaWYgKGluZm9fcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoSU5GT19QUk9DX0VOVFJZX0ZOLCB2aXJ0cGNpX3Byb2NfZGlyKTsKKworCWlmICh2aXJ0cGNpX3Byb2NfZGlyKQorCQlyZW1vdmVfcHJvY19lbnRyeShESVJfUFJPQ19FTlRSWSwgTlVMTCk7CisKKwlMT0dJTkYoIkxlYXZpbmdcbiIpOworCit9CisKK21vZHVsZV9pbml0KHZpcnRwY2lfbW9kX2luaXQpOworbW9kdWxlX2V4aXQodmlydHBjaV9tb2RfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJVc2hhIFNyaW5pdmFzYW4iKTsKK01PRFVMRV9BTElBUygidWlzdmlydHBjaSIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRwY2kvdmlydHBjaS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL3ZpcnRwY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGZkMDdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL3ZpcnRwY2kuaApAQCAtMCwwICsxLDEwNCBAQAorLyogdmlydHBjaS5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKgorICogVW5pc3lzIFZpcnR1YWwgUENJIGRyaXZlciBoZWFkZXIKKyAqLworCisjaWZuZGVmIF9fVklSVFBDSV9IX18KKyNkZWZpbmUgX19WSVJUUENJX0hfXworCisjaW5jbHVkZSAidWlzcXVldWUuaCIKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSVJUSEJBIDB4QUEwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJUlROSUMgMHhBQjAwCisKK3N0cnVjdCBzY3NpX2FkYXBfaW5mbyB7CisJdm9pZCAqc2NzaWhvc3Q7CQkvKiBzY3NpIGhvc3QgaWYgdGhpcyBkZXZpY2UgaXMgYSBzY3NpIGhiYSAqLworCXN0cnVjdCB2aGJhX3d3bm4gd3dubjsJLyogdGhlIHdvcmxkIHdpZGUgbm9kZSBuYW1lIG9mIHZoYmEgKi8KKwlzdHJ1Y3QgdmhiYV9jb25maWdfbWF4IG1heDsJLyogdmFyaW91cyBtYXggc3BlY2lmaWNhdGlvbnMgdXNlZAorCQkJCQkgKiB0byBjb25maWcgdmhiYSAqLworfTsKKworc3RydWN0IG5ldF9hZGFwX2luZm8geworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CS8qIG5ldHdvcmsgZGV2aWNlIGlmIHRoaXMKKwkJCQkJICogZGV2aWNlIGlzIGEgTklDICovCisJdTggbWFjX2FkZHJbTUFYX01BQ0FERFJfTEVOXTsKKwlpbnQgbnVtX3Jjdl9idWZzOworCXVuc2lnbmVkIG10dTsKKwlHVUlEIHpvbmVHdWlkOworfTsKKwordHlwZWRlZiBlbnVtIHsKKwlWSVJUSEJBX1RZUEUgPSAwLAorCVZJUlROSUNfVFlQRSA9IDEsCisJVklSVEJVU19UWVBFID0gNiwKK30gVklSVFBDSV9ERVZfVFlQRTsKKworc3RydWN0IHZpcnRwY2lfZGV2IHsKKwlWSVJUUENJX0RFVl9UWVBFIGRldnR5cGU7CS8qIGluZGljYXRlcyB0eXBlIG9mIHRoZQorCQkJCQkgKiB2aXJ0dWFsIHBjaSBkZXZpY2UgKi8KKwlzdHJ1Y3QgdmlydHBjaV9kcml2ZXIgKm15ZHJpdmVyOwkvKiB3aGljaCBkcml2ZXIgaGFzIGFsbG9jYXRlZAorCQkJCQkJICogdGhpcyBkZXZpY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCB2ZW5kb3I7CS8qIHZlbmRvciBpZCBmb3IgZGV2aWNlICovCisJdW5zaWduZWQgc2hvcnQgZGV2aWNlOwkvKiBkZXZpY2UgaWQgZm9yIGRldmljZSAqLworCVUzMiBidXNObzsJCS8qIG51bWJlciBvZiBidXMgb24gd2hpY2ggZGV2aWNlIGV4aXN0cyAqLworCVUzMiBkZXZpY2VObzsJCS8qIGRldmljZSdzIG51bWJlciBvbiB0aGUgYnVzICovCisJc3RydWN0IEludGVycnVwdEluZm8gaW50cjsJLyogaW50ZXJydXB0IGluZm8gKi8KKwlzdHJ1Y3QgZGV2aWNlIGdlbmVyaWNfZGV2OwkvKiBnZW5lcmljIGRldmljZSAqLworCXVuaW9uIHsKKwkJc3RydWN0IHNjc2lfYWRhcF9pbmZvIHNjc2k7CisJCXN0cnVjdCBuZXRfYWRhcF9pbmZvIG5ldDsKKwl9OworCisJc3RydWN0IHVpc3F1ZXVlX2luZm8gcXVldWVpbmZvOwkvKiBob2xkcyBwdHIgdG8gY2hhbm5lbCB3aGVyZSBjbWRzICYKKwkJCQkJICogcnNwcyBhcmUgcXVldWVkICYgcmV0cmlldmVkICovCisJc3RydWN0IHZpcnRwY2lfZGV2ICpuZXh0OwkvKiBwb2ludHMgdG8gbmV4dCB2aXJ0cGNpIGRldmljZSAqLworfTsKKworc3RydWN0IHZpcnRwY2lfZHJpdmVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJY29uc3QgY2hhciAqbmFtZTsJLyogdGhlIG5hbWUgb2YgdGhlIGRyaXZlciBpbiBzeXNmcyAqLworCWNvbnN0IGNoYXIgKnZlcnNpb247CisJY29uc3QgY2hhciAqdmVydGFnOworCWNvbnN0IGNoYXIgKmJ1aWxkX2RhdGU7CisJY29uc3QgY2hhciAqYnVpbGRfdGltZTsKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWRfdGFibGU7CS8qIG11c3QgYmUgbm9uLU5VTEwgZm9yIHByb2JlCisJCQkJCQkgKiB0byBiZSBjYWxsZWQgKi8KKwlpbnQgKCpwcm9iZSkoc3RydWN0IHZpcnRwY2lfZGV2ICpkZXYsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCk7IC8qIGRldmljZSBpbnNlcnRlZCAqLworCXZvaWQgKCpyZW1vdmUpKHN0cnVjdCB2aXJ0cGNpX2RldiAqZGV2KTsgLyogRGV2aWNlIHJlbW92ZWQgKE5VTEwgaWYKKwkJCQkJCSAgICAqIG5vdCBhIGhvdC1wbHVnIGNhcGFibGUKKwkJCQkJCSAgICAqIGRyaXZlcikgKi8KKwlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgdmlydHBjaV9kZXYgKmRldiwKKwkJCXUzMiBzdGF0ZSk7CQkgICAvKiBEZXZpY2Ugc3VzcGVuZGVkICovCisJaW50ICgqcmVzdW1lKShzdHJ1Y3QgdmlydHBjaV9kZXYgKmRldik7CS8qIERldmljZSB3b2tlbiB1cCAqLworCWludCAoKmVuYWJsZV93YWtlKShzdHJ1Y3QgdmlydHBjaV9kZXYgKmRldiwKKwkJCSAgICB1MzIgc3RhdGUsIGludCBlbmFibGUpOwkvKiBFbmFibGUgd2FrZSBldmVudCAqLworCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGNvcmVfZHJpdmVyOwkvKiBWSVJUUENJIGNvcmUgZmlsbHMgdGhpcyBpbiAqLworfTsKKworI2RlZmluZQlkcml2ZXJfdG9fdmlydHBjaV9kcml2ZXIoaW5fZHJ2KSBcCisJY29udGFpbmVyX29mKGluX2Rydiwgc3RydWN0IHZpcnRwY2lfZHJpdmVyLCBjb3JlX2RyaXZlcikKKyNkZWZpbmUgZGV2aWNlX3RvX3ZpcnRwY2lfZGV2KGluX2RldikgXAorCWNvbnRhaW5lcl9vZihpbl9kZXYsIHN0cnVjdCB2aXJ0cGNpX2RldiwgZ2VuZXJpY19kZXYpCisKK2ludCB2aXJ0cGNpX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdmlydHBjaV9kcml2ZXIgKik7Cit2b2lkIHZpcnRwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHZpcnRwY2lfZHJpdmVyICopOworCisjZW5kaWYgLyogX19WSVJUUENJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFjM2I0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL0tjb25maWcKQEAgLTAsMCArMSwxMCBAQAorIworIyBVbmlzeXMgdmlzb3JjaGFubmVsIGNvbmZpZ3VyYXRpb24KKyMKKworY29uZmlnIFVOSVNZU19WSVNPUkNIQU5ORUwKKwl0cmlzdGF0ZSAiVW5pc3lzIHZpc29yY2hhbm5lbCBkcml2ZXIiCisJZGVwZW5kcyBvbiBVTklTWVNTUEFSICYmIFVOSVNZU19WSVNPUlVUSUwKKwktLS1oZWxwLS0tCisJSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGVuYWJsZSB0aGUgVW5pc3lzIHZpc29yY2hhbm5lbCBkcml2ZXIuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwNjBiZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIFVuaXN5cyB2aXNvcmNoYW5uZWwKKyMKKworb2JqLSQoQ09ORklHX1VOSVNZU19WSVNPUkNIQU5ORUwpCSs9IHZpc29yY2hhbm5lbC5vCisKK3Zpc29yY2hhbm5lbC15IDo9IHZpc29yY2hhbm5lbF9tYWluLm8gdmlzb3JjaGFubmVsX2Z1bmNzLm8KKworY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscworY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwKK2NjZmxhZ3MteSArPSAtRENPTkZJR19TUEFSX0dVRVNUIC1ER1VFU1REUklWRVJCVUlMRCAtRE5PQVVUT1ZFUlNJT04KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvZ2xvYmFscy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvZ2xvYmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OGY4MzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC9nbG9iYWxzLmgKQEAgLTAsMCArMSwyOSBAQAorLyogZ2xvYmFscy5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fVklTT1JDSEFOTkVMX0dMT0JBTFNfSF9fCisjZGVmaW5lIF9fVklTT1JDSEFOTkVMX0dMT0JBTFNfSF9fCisKKyNpbmNsdWRlICJ1bmlrbG9nLmgiCisjaW5jbHVkZSAidGltc2ttb2QuaCIKKyNpbmNsdWRlICJtZW1yZWdpb24uaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKyNkZWZpbmUgTVlEUlZOQU1FICJ2aXNvcmNoYW5uZWwiCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL3Zpc29yY2hhbm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDI5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWwuaApAQCAtMCwwICsxLDEwNiBAQAorLyogdmlzb3JjaGFubmVsLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19WSVNPUkNIQU5ORUxfSF9fCisjZGVmaW5lIF9fVklTT1JDSEFOTkVMX0hfXworCisjaW5jbHVkZSAiY29tbW9udHlwZXMuaCIKKyNpbmNsdWRlICJtZW1yZWdpb24uaCIKKyNpbmNsdWRlICJjaGFubmVsLmgiCisjaWZuZGVmIEhPU1RBRERSRVNTCisjZGVmaW5lIEhPU1RBRERSRVNTIFU2NAorI2VuZGlmCisjaWZuZGVmIEJPT0wKKyNkZWZpbmUgQk9PTCBpbnQKKyNlbmRpZgorCisvKiBWSVNPUkNIQU5ORUwgaXMgYW4gb3BhcXVlIHN0cnVjdHVyZSB0byB1c2Vycy4KKyAqIEZpZWxkcyBhcmUgZGVjbGFyZWQgb25seSBpbiB0aGUgaW1wbGVtZW50YXRpb24gLmMgZmlsZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IFZJU09SQ0hBTk5FTF9UYWcgVklTT1JDSEFOTkVMOworCisvKiBOb3RlIHRoYXQgZm9yIHZpc29yY2hhbm5lbF9jcmVhdGUoKSBhbmQgdmlzb3JjaGFubmVsX2NyZWF0ZV9vdmVybGFwcGVkKCksCisgKiA8Y2hhbm5lbEJ5dGVzPiBhbmQgPGd1aWQ+IGFyZ3VtZW50cyBtYXkgYmUgMCBpZiB3ZSBhcmUgYSBjaGFubmVsIENMSUVOVC4KKyAqIEluIHRoaXMgY2FzZSwgdGhlIHZhbHVlcyBjYW4gc2ltcGx5IGJlIHJlYWQgZnJvbSB0aGUgY2hhbm5lbCBoZWFkZXIuCisgKi8KK1ZJU09SQ0hBTk5FTCAqdmlzb3JjaGFubmVsX2NyZWF0ZShIT1NUQUREUkVTUyBwaHlzYWRkciwKKwkJCQkgIHVsb25nIGNoYW5uZWxCeXRlcywgR1VJRCBndWlkKTsKK1ZJU09SQ0hBTk5FTCAqdmlzb3JjaGFubmVsX2NyZWF0ZV9vdmVybGFwcGVkKHVsb25nIGNoYW5uZWxCeXRlcywKKwkJCQkJICAgICBWSVNPUkNIQU5ORUwgKnBhcmVudCwgdWxvbmcgb2ZmLAorCQkJCQkgICAgIEdVSUQgZ3VpZCk7CitWSVNPUkNIQU5ORUwgKnZpc29yY2hhbm5lbF9jcmVhdGVfd2l0aF9sb2NrKEhPU1RBRERSRVNTIHBoeXNhZGRyLAorCQkJCQkgICAgdWxvbmcgY2hhbm5lbEJ5dGVzLCBHVUlEIGd1aWQpOworVklTT1JDSEFOTkVMICp2aXNvcmNoYW5uZWxfY3JlYXRlX292ZXJsYXBwZWRfd2l0aF9sb2NrKHVsb25nIGNoYW5uZWxCeXRlcywKKwkJCQkJCSAgICAgICBWSVNPUkNIQU5ORUwgKnBhcmVudCwKKwkJCQkJCSAgICAgICB1bG9uZyBvZmYsIEdVSUQgZ3VpZCk7Cit2b2lkIHZpc29yY2hhbm5lbF9kZXN0cm95KFZJU09SQ0hBTk5FTCAqY2hhbm5lbCk7CitpbnQgdmlzb3JjaGFubmVsX3JlYWQoVklTT1JDSEFOTkVMICpjaGFubmVsLCB1bG9uZyBvZmZzZXQsCisJCSAgICAgIHZvaWQgKmxvY2FsLCB1bG9uZyBuYnl0ZXMpOworaW50IHZpc29yY2hhbm5lbF93cml0ZShWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwKKwkJICAgICAgIHZvaWQgKmxvY2FsLCB1bG9uZyBuYnl0ZXMpOworaW50IHZpc29yY2hhbm5lbF9jbGVhcihWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwKKwkJICAgICAgIFU4IGNoLCB1bG9uZyBuYnl0ZXMpOworQk9PTCB2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlLCB2b2lkICptc2cpOworQk9PTCB2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlLCB2b2lkICptc2cpOworaW50IHZpc29yY2hhbm5lbF9zaWduYWxxdWV1ZV9zbG90c19hdmFpbChWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIFUzMiBxdWV1ZSk7CitpbnQgdmlzb3JjaGFubmVsX3NpZ25hbHF1ZXVlX21heF9zbG90cyhWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIFUzMiBxdWV1ZSk7CisKK0hPU1RBRERSRVNTIHZpc29yY2hhbm5lbF9nZXRfcGh5c2FkZHIoVklTT1JDSEFOTkVMICpjaGFubmVsKTsKK3Vsb25nIHZpc29yY2hhbm5lbF9nZXRfbmJ5dGVzKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCk7CitjaGFyICp2aXNvcmNoYW5uZWxfaWQoVklTT1JDSEFOTkVMICpjaGFubmVsLCBjaGFyICpzKTsKK2NoYXIgKnZpc29yY2hhbm5lbF96b25laWQoVklTT1JDSEFOTkVMICpjaGFubmVsLCBjaGFyICpzKTsKK1U2NCB2aXNvcmNoYW5uZWxfZ2V0X2NsaWVudHBhcnRpdGlvbihWSVNPUkNIQU5ORUwgKmNoYW5uZWwpOworR1VJRCB2aXNvcmNoYW5uZWxfZ2V0X0dVSUQoVklTT1JDSEFOTkVMICpjaGFubmVsKTsKK01FTVJFR0lPTiAqdmlzb3JjaGFubmVsX2dldF9tZW1yZWdpb24oVklTT1JDSEFOTkVMICpjaGFubmVsKTsKK2NoYXIgKnZpc29yY2hhbm5lbF9HVUlEX2lkKEdVSUQgKmd1aWQsIGNoYXIgKnMpOwordm9pZCB2aXNvcmNoYW5uZWxfZGVidWcoVklTT1JDSEFOTkVMICpjaGFubmVsLCBpbnQgblF1ZXVlcywKKwkJCXN0cnVjdCBzZXFfZmlsZSAqc2VxLCBVMzIgb2ZmKTsKK3ZvaWQgdmlzb3JjaGFubmVsX2R1bXBfc2VjdGlvbihWSVNPUkNIQU5ORUwgKmNoYW4sIGNoYXIgKnMsCisJCQkgICAgICAgaW50IG9mZiwgaW50IGxlbiwgc3RydWN0IHNlcV9maWxlICpzZXEpOwordm9pZCAqdmlzb3JjaGFubmVsX2dldF9oZWFkZXIoVklTT1JDSEFOTkVMICpjaGFubmVsKTsKKworI2RlZmluZQlWSVNPUkNIQU5ORUxfQ0hBTkdFX1NFUlZFUl9TVEFURShjaGFuLCBjaGFuSWQsIG5ld3N0YXRlKQlcCisJZG8gewkJCQkJCQkJXAorCQlVOCAqcCA9IChVOCAqKXZpc29yY2hhbm5lbF9nZXRfaGVhZGVyKGNoYW4pOwkJXAorCQlpZiAocCkgewkJCQkJCVwKKwkJCVVMVFJBX0NIQU5ORUxfU0VSVkVSX1RSQU5TSVRJT04ocCwgY2hhbklkLCBTcnZTdGF0ZSwgXAorCQkJCQkJCW5ld3N0YXRlLCBsb2dDdHgpOyBcCisJCQl2aXNvcmNoYW5uZWxfd3JpdGUJCQkJXAorCQkJCShjaGFuLAkJCQkJXAorCQkJCSBvZmZzZXRvZihVTFRSQV9DSEFOTkVMX1BST1RPQ09MLCBTcnZTdGF0ZSksIFwKKwkJCQkgcCArCQkJCQlcCisJCQkJIG9mZnNldG9mKFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wsIFNydlN0YXRlKSwgXAorCQkJCSBzaXplb2YoVTMyKSk7CQkJCVwKKwkJfQkJCQkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZQlWSVNPUkNIQU5ORUxfQ0hBTkdFX0NMSUVOVF9TVEFURShjaGFuLCBjaGFuSWQsIG5ld3N0YXRlKQlcCisJZG8gewkJCQkJCQkJXAorCQlVOCAqcCA9IChVOCAqKXZpc29yY2hhbm5lbF9nZXRfaGVhZGVyKGNoYW4pOwkJXAorCQlpZiAocCkgewkJCQkJCVwKKwkJCVVMVFJBX0NIQU5ORUxfQ0xJRU5UX1RSQU5TSVRJT04ocCwgY2hhbklkLAlcCisJCQkJCQkJbmV3c3RhdGUsIGxvZ0N0eCk7IFwKKwkJCXZpc29yY2hhbm5lbF93cml0ZQkJCQlcCisJCQkJKGNoYW4sCQkJCQlcCisJCQkJIG9mZnNldG9mKFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wsIENsaVN0YXRlT1MpLCBcCisJCQkJIHAgKwkJCQkJXAorCQkJCSBvZmZzZXRvZihVTFRSQV9DSEFOTkVMX1BST1RPQ09MLCBDbGlTdGF0ZU9TKSwgXAorCQkJCSBzaXplb2YoVTMyKSk7CQkJCVwKKwkJfQkJCQkJCQlcCisJfSB3aGlsZSAoMCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWxfZnVuY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL3Zpc29yY2hhbm5lbF9mdW5jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MzY4MTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWxfZnVuY3MuYwpAQCAtMCwwICsxLDY3NCBAQAorLyogdmlzb3JjaGFubmVsX2Z1bmNzLmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qCisgKiAgVGhpcyBwcm92aWRlcyBTdXBlcnZpc29yIGNoYW5uZWwgY29tbXVuaWNhdGlvbiBwcmltaXRpdmVzLCB3aGljaCBhcmUKKyAqICBpbmRlcGVuZGVudCBvZiB0aGUgbWVjaGFuaXNtIHVzZWQgdG8gYWNjZXNzIHRoZSBjaGFubmVsIGRhdGEuICBBbGwgY2hhbm5lbAorICogIGRhdGEgaXMgYWNjZXNzZWQgdXNpbmcgdGhlIG1lbXJlZ2lvbiBhYnN0cmFjdGlvbi4gIChtZW1yZWdpb24gaGFzIGJvdGgKKyAqICBhIENNMiBpbXBsZW1lbnRhdGlvbiBhbmQgYSBkaXJlY3QgbWVtb3J5IGltcGxlbWVudGF0aW9uLikKKyAqLworCisjaW5jbHVkZSAiZ2xvYmFscy5oIgorI2luY2x1ZGUgInZpc29yY2hhbm5lbC5oIgorI2luY2x1ZGUgImd1aWR1dGlscy5oIgorCisjZGVmaW5lIE1ZRFJWTkFNRSAidmlzb3JjaGFubmVsIgorCitzdHJ1Y3QgVklTT1JDSEFOTkVMX1RhZyB7CisJTUVNUkVHSU9OICptZW1yZWdpb247CS8qIGZyb20gdmlzb3JfbWVtcmVnaW9uX2NyZWF0ZSgpICovCisJQ0hBTk5FTF9IRUFERVIgY2hhbl9oZHI7CisJR1VJRCBndWlkOworCXVsb25nIHNpemU7CisJQk9PTCBuZWVkc19sb2NrOworCXNwaW5sb2NrX3QgaW5zZXJ0X2xvY2s7CisJc3BpbmxvY2tfdCByZW1vdmVfbG9jazsKKworCXN0cnVjdCB7CisJCVNJR05BTF9RVUVVRV9IRUFERVIgcmVxX3F1ZXVlOworCQlTSUdOQUxfUVVFVUVfSEVBREVSIHJzcF9xdWV1ZTsKKwkJU0lHTkFMX1FVRVVFX0hFQURFUiBldmVudF9xdWV1ZTsKKwkJU0lHTkFMX1FVRVVFX0hFQURFUiBhY2tfcXVldWU7CisJfSBzYWZlX3Vpc19xdWV1ZTsKK307CisKKy8qIENyZWF0ZXMgdGhlIFZJU09SQ0hBTk5FTCBhYnN0cmFjdGlvbiBmb3IgYSBkYXRhIGFyZWEgaW4gbWVtb3J5LCBidXQgZG9lcworICogTk9UIG1vZGlmeSB0aGlzIGRhdGEgYXJlYS4KKyAqLworc3RhdGljIFZJU09SQ0hBTk5FTCAqCit2aXNvcmNoYW5uZWxfY3JlYXRlX2d1dHMoSE9TVEFERFJFU1MgcGh5c2FkZHIsIHVsb25nIGNoYW5uZWxCeXRlcywKKwkJCSBWSVNPUkNIQU5ORUwgKnBhcmVudCwgdWxvbmcgb2ZmLCBHVUlEIGd1aWQsCisJCQkgQk9PTCBuZWVkc19sb2NrKQoreworCVZJU09SQ0hBTk5FTCAqcCA9IE5VTEw7CisJdm9pZCAqcmMgPSBOVUxMOworCisJcCA9IGttYWxsb2Moc2l6ZW9mKFZJU09SQ0hBTk5FTCksIEdGUF9LRVJORUx8X19HRlBfTk9SRVRSWSk7CisJaWYgKHAgPT0gTlVMTCkgeworCQlFUlJEUlYoImFsbG9jYXRpb24gZmFpbGVkOiAoc3RhdHVzPTApXG4iKTsKKwkJcmMgPSBOVUxMOworCQlnb3RvIEF3YXk7CisJfQorCXAtPm1lbXJlZ2lvbiA9IE5VTEw7CisJcC0+bmVlZHNfbG9jayA9IG5lZWRzX2xvY2s7CisJc3Bpbl9sb2NrX2luaXQoJnAtPmluc2VydF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcC0+cmVtb3ZlX2xvY2spOworCisJLyogcHJlcGFyZSBjaGFuX2hkciAoYWJzdHJhY3Rpb24gdG8gcmVhZC93cml0ZSBjaGFubmVsIG1lbW9yeSkgKi8KKwlpZiAocGFyZW50ID09IE5VTEwpCisJCXAtPm1lbXJlZ2lvbiA9CisJCSAgICB2aXNvcl9tZW1yZWdpb25fY3JlYXRlKHBoeXNhZGRyLCBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKTsKKwllbHNlCisJCXAtPm1lbXJlZ2lvbiA9CisJCSAgICB2aXNvcl9tZW1yZWdpb25fY3JlYXRlX292ZXJsYXBwZWQocGFyZW50LT5tZW1yZWdpb24sCisJCQkJCQkgICAgICBvZmYsCisJCQkJCQkgICAgICBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKTsKKwlpZiAocC0+bWVtcmVnaW9uID09IE5VTEwpIHsKKwkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fY3JlYXRlIGZhaWxlZCBmYWlsZWQ6IChzdGF0dXM9MClcbiIpOworCQlyYyA9IE5VTEw7CisJCWdvdG8gQXdheTsKKwl9CisJaWYgKHZpc29yX21lbXJlZ2lvbl9yZWFkKHAtPm1lbXJlZ2lvbiwgMCwgJnAtPmNoYW5faGRyLAorCQkJCSBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKSA8IDApIHsKKwkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fcmVhZCBmYWlsZWQ6IChzdGF0dXM9MClcbiIpOworCQlyYyA9IE5VTEw7CisJCWdvdG8gQXdheTsKKwl9CisJaWYgKGNoYW5uZWxCeXRlcyA9PSAwKQorCQkvKiB3ZSBoYWQgYmV0dGVyIGJlIGEgQ0xJRU5UIG9mIHRoaXMgY2hhbm5lbCAqLworCQljaGFubmVsQnl0ZXMgPSAodWxvbmcpIHAtPmNoYW5faGRyLlNpemU7CisJaWYgKFNUUlVDVFNFUVVBTChndWlkLCBHdWlkMCkpCisJCS8qIHdlIGhhZCBiZXR0ZXIgYmUgYSBDTElFTlQgb2YgdGhpcyBjaGFubmVsICovCisJCWd1aWQgPSBwLT5jaGFuX2hkci5UeXBlOworCWlmICh2aXNvcl9tZW1yZWdpb25fcmVzaXplKHAtPm1lbXJlZ2lvbiwgY2hhbm5lbEJ5dGVzKSA8IDApIHsKKwkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fcmVzaXplIGZhaWxlZDogKHN0YXR1cz0wKVxuIik7CisJCXJjID0gTlVMTDsKKwkJZ290byBBd2F5OworCX0KKwlwLT5zaXplID0gY2hhbm5lbEJ5dGVzOworCXAtPmd1aWQgPSBndWlkOworCisJcmMgPSBwOworQXdheToKKworCWlmIChyYyA9PSBOVUxMKSB7CisJCWlmIChwICE9IE5VTEwpIHsKKwkJCXZpc29yY2hhbm5lbF9kZXN0cm95KHApOworCQkJcCA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCitWSVNPUkNIQU5ORUwgKgordmlzb3JjaGFubmVsX2NyZWF0ZShIT1NUQUREUkVTUyBwaHlzYWRkciwgdWxvbmcgY2hhbm5lbEJ5dGVzLCBHVUlEIGd1aWQpCit7CisJcmV0dXJuIHZpc29yY2hhbm5lbF9jcmVhdGVfZ3V0cyhwaHlzYWRkciwgY2hhbm5lbEJ5dGVzLCBOVUxMLCAwLCBndWlkLAorCQkJCQlGQUxTRSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfY3JlYXRlKTsKKworVklTT1JDSEFOTkVMICoKK3Zpc29yY2hhbm5lbF9jcmVhdGVfd2l0aF9sb2NrKEhPU1RBRERSRVNTIHBoeXNhZGRyLCB1bG9uZyBjaGFubmVsQnl0ZXMsCisJCQkgICAgICBHVUlEIGd1aWQpCit7CisJcmV0dXJuIHZpc29yY2hhbm5lbF9jcmVhdGVfZ3V0cyhwaHlzYWRkciwgY2hhbm5lbEJ5dGVzLCBOVUxMLCAwLCBndWlkLAorCQkJCQlUUlVFKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9jcmVhdGVfd2l0aF9sb2NrKTsKKworVklTT1JDSEFOTkVMICoKK3Zpc29yY2hhbm5lbF9jcmVhdGVfb3ZlcmxhcHBlZCh1bG9uZyBjaGFubmVsQnl0ZXMsCisJCQkgICAgICAgVklTT1JDSEFOTkVMICpwYXJlbnQsIHVsb25nIG9mZiwgR1VJRCBndWlkKQoreworCXJldHVybiB2aXNvcmNoYW5uZWxfY3JlYXRlX2d1dHMoMCwgY2hhbm5lbEJ5dGVzLCBwYXJlbnQsIG9mZiwgZ3VpZCwKKwkJCQkJRkFMU0UpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2NyZWF0ZV9vdmVybGFwcGVkKTsKKworVklTT1JDSEFOTkVMICoKK3Zpc29yY2hhbm5lbF9jcmVhdGVfb3ZlcmxhcHBlZF93aXRoX2xvY2sodWxvbmcgY2hhbm5lbEJ5dGVzLAorCQkJCQkgVklTT1JDSEFOTkVMICpwYXJlbnQsIHVsb25nIG9mZiwKKwkJCQkJIEdVSUQgZ3VpZCkKK3sKKwlyZXR1cm4gdmlzb3JjaGFubmVsX2NyZWF0ZV9ndXRzKDAsIGNoYW5uZWxCeXRlcywgcGFyZW50LCBvZmYsIGd1aWQsCisJCQkJCVRSVUUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2NyZWF0ZV9vdmVybGFwcGVkX3dpdGhfbG9jayk7CisKK3ZvaWQKK3Zpc29yY2hhbm5lbF9kZXN0cm95KFZJU09SQ0hBTk5FTCAqY2hhbm5lbCkKK3sKKwlpZiAoY2hhbm5lbCA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKGNoYW5uZWwtPm1lbXJlZ2lvbiAhPSBOVUxMKSB7CisJCXZpc29yX21lbXJlZ2lvbl9kZXN0cm95KGNoYW5uZWwtPm1lbXJlZ2lvbik7CisJCWNoYW5uZWwtPm1lbXJlZ2lvbiA9IE5VTEw7CisJfQorCWtmcmVlKGNoYW5uZWwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2Rlc3Ryb3kpOworCitIT1NUQUREUkVTUwordmlzb3JjaGFubmVsX2dldF9waHlzYWRkcihWSVNPUkNIQU5ORUwgKmNoYW5uZWwpCit7CisJcmV0dXJuIHZpc29yX21lbXJlZ2lvbl9nZXRfcGh5c2FkZHIoY2hhbm5lbC0+bWVtcmVnaW9uKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9nZXRfcGh5c2FkZHIpOworCit1bG9uZwordmlzb3JjaGFubmVsX2dldF9uYnl0ZXMoVklTT1JDSEFOTkVMICpjaGFubmVsKQoreworCXJldHVybiBjaGFubmVsLT5zaXplOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2dldF9uYnl0ZXMpOworCitjaGFyICoKK3Zpc29yY2hhbm5lbF9HVUlEX2lkKEdVSUQgKmd1aWQsIGNoYXIgKnMpCit7CisJcmV0dXJuIEdVSURfZm9ybWF0MShndWlkLCBzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9HVUlEX2lkKTsKKworY2hhciAqCit2aXNvcmNoYW5uZWxfaWQoVklTT1JDSEFOTkVMICpjaGFubmVsLCBjaGFyICpzKQoreworCXJldHVybiB2aXNvcmNoYW5uZWxfR1VJRF9pZCgmY2hhbm5lbC0+Z3VpZCwgcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfaWQpOworCitjaGFyICoKK3Zpc29yY2hhbm5lbF96b25laWQoVklTT1JDSEFOTkVMICpjaGFubmVsLCBjaGFyICpzKQoreworCXJldHVybiB2aXNvcmNoYW5uZWxfR1VJRF9pZCgmY2hhbm5lbC0+Y2hhbl9oZHIuWm9uZUd1aWQsIHMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX3pvbmVpZCk7CisKK0hPU1RBRERSRVNTCit2aXNvcmNoYW5uZWxfZ2V0X2NsaWVudHBhcnRpdGlvbihWSVNPUkNIQU5ORUwgKmNoYW5uZWwpCit7CisJcmV0dXJuIGNoYW5uZWwtPmNoYW5faGRyLlBhcnRpdGlvbkhhbmRsZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9nZXRfY2xpZW50cGFydGl0aW9uKTsKKworR1VJRAordmlzb3JjaGFubmVsX2dldF9HVUlEKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCkKK3sKKwlyZXR1cm4gY2hhbm5lbC0+Z3VpZDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9nZXRfR1VJRCk7CisKK01FTVJFR0lPTiAqCit2aXNvcmNoYW5uZWxfZ2V0X21lbXJlZ2lvbihWSVNPUkNIQU5ORUwgKmNoYW5uZWwpCit7CisJcmV0dXJuIGNoYW5uZWwtPm1lbXJlZ2lvbjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9nZXRfbWVtcmVnaW9uKTsKKworaW50Cit2aXNvcmNoYW5uZWxfcmVhZChWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwKKwkJICB2b2lkICpsb2NhbCwgdWxvbmcgbmJ5dGVzKQoreworCWludCByYyA9IHZpc29yX21lbXJlZ2lvbl9yZWFkKGNoYW5uZWwtPm1lbXJlZ2lvbiwgb2Zmc2V0LAorCQkJCSAgICAgIGxvY2FsLCBuYnl0ZXMpOworCWlmICgocmMgPj0gMCkgJiYgKG9mZnNldCA9PSAwKSAmJiAobmJ5dGVzID49IHNpemVvZihDSEFOTkVMX0hFQURFUikpKQorCQltZW1jcHkoJmNoYW5uZWwtPmNoYW5faGRyLCBsb2NhbCwgc2l6ZW9mKENIQU5ORUxfSEVBREVSKSk7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX3JlYWQpOworCitpbnQKK3Zpc29yY2hhbm5lbF93cml0ZShWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwKKwkJICAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcykKK3sKKwlpZiAob2Zmc2V0ID09IDAgJiYgbmJ5dGVzID49IHNpemVvZihDSEFOTkVMX0hFQURFUikpCisJCW1lbWNweSgmY2hhbm5lbC0+Y2hhbl9oZHIsIGxvY2FsLCBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKTsKKwlyZXR1cm4gdmlzb3JfbWVtcmVnaW9uX3dyaXRlKGNoYW5uZWwtPm1lbXJlZ2lvbiwgb2Zmc2V0LCBsb2NhbCwgbmJ5dGVzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF93cml0ZSk7CisKK2ludAordmlzb3JjaGFubmVsX2NsZWFyKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LCBVOCBjaCwgdWxvbmcgbmJ5dGVzKQoreworCWludCByYyA9IC0xOworCWludCBidWZzaXplID0gNjU1MzY7CisJaW50IHdyaXR0ZW4gPSAwOworCVU4ICpidWYgPSB2bWFsbG9jKGJ1ZnNpemUpOworCisJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCUVSUkRSVigiJXMgZmFpbGVkIG1lbW9yeSBhbGxvY2F0aW9uIiwgX19mdW5jX18pOworCQlnb3RvIEF3YXk7CisJfQorCW1lbXNldChidWYsIGNoLCBidWZzaXplKTsKKwl3aGlsZSAobmJ5dGVzID4gMCkgeworCQl1bG9uZyB0aGlzYnl0ZXMgPSBidWZzaXplOworCQlpbnQgeCA9IC0xOworCQlpZiAobmJ5dGVzIDwgdGhpc2J5dGVzKQorCQkJdGhpc2J5dGVzID0gbmJ5dGVzOworCQl4ID0gdmlzb3JfbWVtcmVnaW9uX3dyaXRlKGNoYW5uZWwtPm1lbXJlZ2lvbiwgb2Zmc2V0ICsgd3JpdHRlbiwKKwkJCQkJICBidWYsIHRoaXNieXRlcyk7CisJCWlmICh4IDwgMCkgeworCQkJcmMgPSB4OworCQkJZ290byBBd2F5OworCQl9CisJCXdyaXR0ZW4gKz0gdGhpc2J5dGVzOworCQluYnl0ZXMgLT0gdGhpc2J5dGVzOworCX0KKwlyYyA9IDA7CisKK0F3YXk6CisJaWYgKGJ1ZiAhPSBOVUxMKSB7CisJCXZmcmVlKGJ1Zik7CisJCWJ1ZiA9IE5VTEw7CisJfQorCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9jbGVhcik7CisKK3ZvaWQgKgordmlzb3JjaGFubmVsX2dldF9oZWFkZXIoVklTT1JDSEFOTkVMICpjaGFubmVsKQoreworCXJldHVybiAodm9pZCAqKSAmKGNoYW5uZWwtPmNoYW5faGRyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9nZXRfaGVhZGVyKTsKKworLyoqIFJldHVybiBvZmZzZXQgb2YgYSBzcGVjaWZpYyBTSUdOQUxfUVVFVUVfSEVBREVSIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhCisgKiAgY2hhbm5lbCBoZWFkZXIKKyAqLworI2RlZmluZSBTSUdfUVVFVUVfT0ZGU0VUKGNoYW5faGRyLCBxKSBcCisJKChjaGFuX2hkciktPm9DaGFubmVsU3BhY2UgKyAoKHEpICogc2l6ZW9mKFNJR05BTF9RVUVVRV9IRUFERVIpKSkKKworLyoqIFJldHVybiBvZmZzZXQgb2YgYSBzcGVjaWZpYyBxdWV1ZSBlbnRyeSAoZGF0YSkgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGEKKyAqICBjaGFubmVsIGhlYWRlcgorICovCisjZGVmaW5lIFNJR19EQVRBX09GRlNFVChjaGFuX2hkciwgcSwgc2lnX2hkciwgc2xvdCkgXAorCShTSUdfUVVFVUVfT0ZGU0VUKGNoYW5faGRyLCBxKSArIChzaWdfaGRyKS0+b1NpZ25hbEJhc2UgKyBcCisJICAgICgoc2xvdCkgKiAoc2lnX2hkciktPlNpZ25hbFNpemUpKQorCisvKiogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIGEgc3BlY2lmaWMgZmllbGQgd2l0aGluIGEgU0lHTkFMX1FVRVVFX0hFQURFUiBiYWNrCisgKiAgaW50byBob3N0IG1lbW9yeQorICovCisjZGVmaW5lIFNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgc2lnX2hkciwgRklFTEQpCQkJXAorCSh2aXNvcl9tZW1yZWdpb25fd3JpdGUoY2hhbm5lbC0+bWVtcmVnaW9uLAkJCVwKKwkJCSAgICAgICBTSUdfUVVFVUVfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUpKyBcCisJCQkgICAgICAgb2Zmc2V0b2YoU0lHTkFMX1FVRVVFX0hFQURFUiwgRklFTEQpLAlcCisJCQkgICAgICAgJigoc2lnX2hkciktPkZJRUxEKSwJCQlcCisJCQkgICAgICAgc2l6ZW9mKChzaWdfaGRyKS0+RklFTEQpKSA+PSAwKQorCitzdGF0aWMgQk9PTAorc2lnX3JlYWRfaGVhZGVyKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlLAorCQlTSUdOQUxfUVVFVUVfSEVBREVSICpzaWdfaGRyKQoreworCUJPT0wgcmMgPSBGQUxTRTsKKworCWlmIChjaGFubmVsLT5jaGFuX2hkci5vQ2hhbm5lbFNwYWNlIDwgc2l6ZW9mKENIQU5ORUxfSEVBREVSKSkgeworCQlFUlJEUlYoIm9DaGFubmVsU3BhY2UgdG9vIHNtYWxsOiAoc3RhdHVzPSVkKVxuIiwgcmMpOworCQlnb3RvIEF3YXk7CisJfQorCisJLyogUmVhZCB0aGUgYXBwcm9wcmlhdGUgU0lHTkFMX1FVRVVFX0hFQURFUiBpbnRvIGxvY2FsIG1lbW9yeS4gKi8KKworCWlmICh2aXNvcl9tZW1yZWdpb25fcmVhZChjaGFubmVsLT5tZW1yZWdpb24sCisJCQkJIFNJR19RVUVVRV9PRkZTRVQoJmNoYW5uZWwtPmNoYW5faGRyLCBxdWV1ZSksCisJCQkJIHNpZ19oZHIsIHNpemVvZihTSUdOQUxfUVVFVUVfSEVBREVSKSkgPCAwKSB7CisJCUVSUkRSVigicXVldWU9JWQgU0lHX1FVRVVFX09GRlNFVD0lZCIsCisJCSAgICAgICBxdWV1ZSwgKGludClTSUdfUVVFVUVfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUpKTsKKwkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fcmVhZCBvZiBzaWduYWwgcXVldWUgZmFpbGVkOiAoc3RhdHVzPSVkKVxuIiwgcmMpOworCQlnb3RvIEF3YXk7CisJfQorCXJjID0gVFJVRTsKK0F3YXk6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgQk9PTAorc2lnX2RvX2RhdGEoVklTT1JDSEFOTkVMICpjaGFubmVsLCBVMzIgcXVldWUsCisJICAgIFNJR05BTF9RVUVVRV9IRUFERVIgKnNpZ19oZHIsIFUzMiBzbG90LCB2b2lkICpkYXRhLCBCT09MIGlzX3dyaXRlKQoreworCUJPT0wgcmMgPSBGQUxTRTsKKwlpbnQgc2lnbmFsX2RhdGFfb2Zmc2V0ID0gU0lHX0RBVEFfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUsCisJCQkJCQkgc2lnX2hkciwgc2xvdCk7CisJaWYgKGlzX3dyaXRlKSB7CisJCWlmICh2aXNvcl9tZW1yZWdpb25fd3JpdGUoY2hhbm5lbC0+bWVtcmVnaW9uLAorCQkJCQkgIHNpZ25hbF9kYXRhX29mZnNldCwKKwkJCQkJICBkYXRhLCBzaWdfaGRyLT5TaWduYWxTaXplKSA8IDApIHsKKwkJCUVSUkRSVigidmlzb3JfbWVtcmVnaW9uX3dyaXRlIG9mIHNpZ25hbCBkYXRhIGZhaWxlZDogKHN0YXR1cz0lZClcbiIsIHJjKTsKKwkJCWdvdG8gQXdheTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh2aXNvcl9tZW1yZWdpb25fcmVhZChjaGFubmVsLT5tZW1yZWdpb24sIHNpZ25hbF9kYXRhX29mZnNldCwKKwkJCQkJIGRhdGEsIHNpZ19oZHItPlNpZ25hbFNpemUpIDwgMCkgeworCQkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fcmVhZCBvZiBzaWduYWwgZGF0YSBmYWlsZWQ6IChzdGF0dXM9JWQpXG4iLCByYyk7CisJCQlnb3RvIEF3YXk7CisJCX0KKwl9CisJcmMgPSBUUlVFOworQXdheToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgQk9PTAorc2lnX3JlYWRfZGF0YShWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIFUzMiBxdWV1ZSwKKwkgICAgICBTSUdOQUxfUVVFVUVfSEVBREVSICpzaWdfaGRyLCBVMzIgc2xvdCwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gc2lnX2RvX2RhdGEoY2hhbm5lbCwgcXVldWUsIHNpZ19oZHIsIHNsb3QsIGRhdGEsIEZBTFNFKTsKK30KKworc3RhdGljIGlubGluZSBCT09MCitzaWdfd3JpdGVfZGF0YShWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIFUzMiBxdWV1ZSwKKwkgICAgICAgU0lHTkFMX1FVRVVFX0hFQURFUiAqc2lnX2hkciwgVTMyIHNsb3QsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHNpZ19kb19kYXRhKGNoYW5uZWwsIHF1ZXVlLCBzaWdfaGRyLCBzbG90LCBkYXRhLCBUUlVFKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyCitzYWZlX3NpZ19xdWV1ZV92YWxpZGF0ZShwU0lHTkFMX1FVRVVFX0hFQURFUiBwc2FmZV9zcWgsCisJCQlwU0lHTkFMX1FVRVVFX0hFQURFUiBwdW5zYWZlX3NxaCwKKwkJCVUzMiAqcGhlYWQsIFUzMiAqcHRhaWwpCit7CisJaWYgKCgqcGhlYWQgPj0gcHNhZmVfc3FoLT5NYXhTaWduYWxTbG90cykKKwkgICAgfHwgKCpwdGFpbCA+PSBwc2FmZV9zcWgtPk1heFNpZ25hbFNsb3RzKSkgeworCQkvKiBDaG9vc2UgMCBvciBtYXgsIG1heWJlIGJhc2VkIG9uIGN1cnJlbnQgdGFpbCB2YWx1ZSAqLworCQkqcGhlYWQgPSAwOworCQkqcHRhaWwgPSAwOworCisJCS8qIFN5bmMgd2l0aCBjbGllbnQgYXMgbmVjZXNzYXJ5ICovCisJCXB1bnNhZmVfc3FoLT5IZWFkID0gKnBoZWFkOworCQlwdW5zYWZlX3NxaC0+VGFpbCA9ICpwdGFpbDsKKworCQlFUlJEUlYoInNhZmVfc2lnX3F1ZXVlX3ZhbGlkYXRlOiBoZWFkID0gMHgleCwgdGFpbCA9IDB4JXgsIE1heFNsb3RzID0gMHgleCIsCisJCSAgICAgKnBoZWFkLCAqcHRhaWwsIHBzYWZlX3NxaC0+TWF4U2lnbmFsU2xvdHMpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CQkJCS8qIGVuZCBzYWZlX3NpZ19xdWV1ZV92YWxpZGF0ZSAqLworCitCT09MCit2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlLCB2b2lkICptc2cpCit7CisJQk9PTCByYyA9IEZBTFNFOworCVNJR05BTF9RVUVVRV9IRUFERVIgc2lnX2hkcjsKKworCWlmIChjaGFubmVsLT5uZWVkc19sb2NrKQorCQlzcGluX2xvY2soJmNoYW5uZWwtPnJlbW92ZV9sb2NrKTsKKworCWlmICghc2lnX3JlYWRfaGVhZGVyKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkcikpIHsKKwkJcmMgPSBGQUxTRTsKKwkJZ290byBBd2F5OworCX0KKwlpZiAoc2lnX2hkci5IZWFkID09IHNpZ19oZHIuVGFpbCkgeworCQlyYyA9IEZBTFNFOwkvKiBubyBzaWduYWxzIHRvIHJlbW92ZSAqLworCQlnb3RvIEF3YXk7CisJfQorCXNpZ19oZHIuVGFpbCA9IChzaWdfaGRyLlRhaWwgKyAxKSAlIHNpZ19oZHIuTWF4U2lnbmFsU2xvdHM7CisJaWYgKCFzaWdfcmVhZF9kYXRhKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgc2lnX2hkci5UYWlsLCBtc2cpKSB7CisJCUVSUkRSVigic2lnX3JlYWRfZGF0YSBmYWlsZWQ6IChzdGF0dXM9JWQpXG4iLCByYyk7CisJCWdvdG8gQXdheTsKKwl9CisJc2lnX2hkci5OdW1TaWduYWxzUmVjZWl2ZWQrKzsKKworCS8qIEZvciBlYWNoIGRhdGEgZmllbGQgaW4gU0lHTkFMX1FVRVVFX0hFQURFUiB0aGF0IHdhcyBtb2RpZmllZCwKKwkgKiB1cGRhdGUgaG9zdCBtZW1vcnkuCisJICovCisJTUVNT1JZQkFSUklFUjsKKwlpZiAoIVNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIFRhaWwpKSB7CisJCUVSUkRSVigidmlzb3JfbWVtcmVnaW9uX3dyaXRlIG9mIFRhaWwgZmFpbGVkOiAoc3RhdHVzPSVkKVxuIiwKKwkJICAgICAgIHJjKTsKKwkJZ290byBBd2F5OworCX0KKwlpZiAoIVNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIE51bVNpZ25hbHNSZWNlaXZlZCkpIHsKKwkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fd3JpdGUgb2YgTnVtU2lnbmFsc1JlY2VpdmVkIGZhaWxlZDogKHN0YXR1cz0lZClcbiIsIHJjKTsKKwkJZ290byBBd2F5OworCX0KKwlyYyA9IFRSVUU7CitBd2F5OgorCWlmIChjaGFubmVsLT5uZWVkc19sb2NrKQorCQlzcGluX3VubG9jaygmY2hhbm5lbC0+cmVtb3ZlX2xvY2spOworCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZSk7CisKK0JPT0wKK3Zpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoVklTT1JDSEFOTkVMICpjaGFubmVsLCBVMzIgcXVldWUsIHZvaWQgKm1zZykKK3sKKwlCT09MIHJjID0gRkFMU0U7CisJU0lHTkFMX1FVRVVFX0hFQURFUiBzaWdfaGRyOworCisJaWYgKGNoYW5uZWwtPm5lZWRzX2xvY2spCisJCXNwaW5fbG9jaygmY2hhbm5lbC0+aW5zZXJ0X2xvY2spOworCisJaWYgKCFzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKSkgeworCQlyYyA9IEZBTFNFOworCQlnb3RvIEF3YXk7CisJfQorCisJc2lnX2hkci5IZWFkID0gKChzaWdfaGRyLkhlYWQgKyAxKSAlIHNpZ19oZHIuTWF4U2lnbmFsU2xvdHMpOworCWlmIChzaWdfaGRyLkhlYWQgPT0gc2lnX2hkci5UYWlsKSB7CisJCXNpZ19oZHIuTnVtT3ZlcmZsb3dzKys7CisJCWlmICghU0lHX1dSSVRFX0ZJRUxEKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgTnVtT3ZlcmZsb3dzKSkgeworCQkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fd3JpdGUgb2YgTnVtT3ZlcmZsb3dzIGZhaWxlZDogKHN0YXR1cz0lZClcbiIsIHJjKTsKKwkJCWdvdG8gQXdheTsKKwkJfQorCQlyYyA9IEZBTFNFOworCQlnb3RvIEF3YXk7CisJfQorCisJaWYgKCFzaWdfd3JpdGVfZGF0YShjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIHNpZ19oZHIuSGVhZCwgbXNnKSkgeworCQlFUlJEUlYoInNpZ193cml0ZV9kYXRhIGZhaWxlZDogKHN0YXR1cz0lZClcbiIsIHJjKTsKKwkJZ290byBBd2F5OworCX0KKwlzaWdfaGRyLk51bVNpZ25hbHNTZW50Kys7CisKKwkvKiBGb3IgZWFjaCBkYXRhIGZpZWxkIGluIFNJR05BTF9RVUVVRV9IRUFERVIgdGhhdCB3YXMgbW9kaWZpZWQsCisJICogdXBkYXRlIGhvc3QgbWVtb3J5LgorCSAqLworCU1FTU9SWUJBUlJJRVI7CisJaWYgKCFTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBIZWFkKSkgeworCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl93cml0ZSBvZiBIZWFkIGZhaWxlZDogKHN0YXR1cz0lZClcbiIsCisJCSAgICAgICByYyk7CisJCWdvdG8gQXdheTsKKwl9CisJaWYgKCFTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBOdW1TaWduYWxzU2VudCkpIHsKKwkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fd3JpdGUgb2YgTnVtU2lnbmFsc1NlbnQgZmFpbGVkOiAoc3RhdHVzPSVkKVxuIiwgcmMpOworCQlnb3RvIEF3YXk7CisJfQorCXJjID0gVFJVRTsKK0F3YXk6CisJaWYgKGNoYW5uZWwtPm5lZWRzX2xvY2spCisJCXNwaW5fdW5sb2NrKCZjaGFubmVsLT5pbnNlcnRfbG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KTsKKworCitpbnQKK3Zpc29yY2hhbm5lbF9zaWduYWxxdWV1ZV9zbG90c19hdmFpbChWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIFUzMiBxdWV1ZSkKK3sKKwlTSUdOQUxfUVVFVUVfSEVBREVSIHNpZ19oZHI7CisJVTMyIHNsb3RzX2F2YWlsLCBzbG90c191c2VkOworCVUzMiBoZWFkLCB0YWlsOworCisJaWYgKCFzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKSkKKwkJcmV0dXJuIDA7CisJaGVhZCA9IHNpZ19oZHIuSGVhZDsKKwl0YWlsID0gc2lnX2hkci5UYWlsOworCWlmIChoZWFkIDwgdGFpbCkKKwkJaGVhZCA9IGhlYWQgKyBzaWdfaGRyLk1heFNpZ25hbFNsb3RzOworCXNsb3RzX3VzZWQgPSAoaGVhZCAtIHRhaWwpOworCXNsb3RzX2F2YWlsID0gc2lnX2hkci5NYXhTaWduYWxzIC0gc2xvdHNfdXNlZDsKKwlyZXR1cm4gKGludCkgc2xvdHNfYXZhaWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfc2lnbmFscXVldWVfc2xvdHNfYXZhaWwpOworCitpbnQKK3Zpc29yY2hhbm5lbF9zaWduYWxxdWV1ZV9tYXhfc2xvdHMoVklTT1JDSEFOTkVMICpjaGFubmVsLCBVMzIgcXVldWUpCit7CisJU0lHTkFMX1FVRVVFX0hFQURFUiBzaWdfaGRyOworCWlmICghc2lnX3JlYWRfaGVhZGVyKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkcikpCisJCXJldHVybiAwOworCXJldHVybiAoaW50KSBzaWdfaGRyLk1heFNpZ25hbHM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfc2lnbmFscXVldWVfbWF4X3Nsb3RzKTsKKworc3RhdGljIHZvaWQKK3NpZ3F1ZXVlX2RlYnVnKFNJR05BTF9RVUVVRV9IRUFERVIgKnEsIGludCB3aGljaCwgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc2VxX3ByaW50ZihzZXEsICJTaWduYWwgUXVldWUgIyVkXG4iLCB3aGljaCk7CisJc2VxX3ByaW50ZihzZXEsICIgICBWZXJzaW9uSWQgICAgICAgICAgPSAlbHVcbiIsICh1bG9uZykgcS0+VmVyc2lvbklkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIFR5cGUgICAgICAgICAgICAgICA9ICVsdVxuIiwgKHVsb25nKSBxLT5UeXBlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIG9TaWduYWxCYXNlICAgICAgICA9ICVsbHVcbiIsCisJCSAgIChsb25nIGxvbmcpIHEtPm9TaWduYWxCYXNlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIFNpZ25hbFNpemUgICAgICAgICA9ICVsdVxuIiwgKHVsb25nKSBxLT5TaWduYWxTaXplKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIE1heFNpZ25hbFNsb3RzICAgICA9ICVsdVxuIiwKKwkJICAgKHVsb25nKSBxLT5NYXhTaWduYWxTbG90cyk7CisJc2VxX3ByaW50ZihzZXEsICIgICBNYXhTaWduYWxzICAgICAgICAgPSAlbHVcbiIsICh1bG9uZykgcS0+TWF4U2lnbmFscyk7CisJc2VxX3ByaW50ZihzZXEsICIgICBGZWF0dXJlRmxhZ3MgICAgICAgPSAlLTE2LjE2THhcbiIsCisJCSAgIChsb25nIGxvbmcpIHEtPkZlYXR1cmVGbGFncyk7CisJc2VxX3ByaW50ZihzZXEsICIgICBOdW1TaWduYWxzU2VudCAgICAgPSAlbGx1XG4iLAorCQkgICAobG9uZyBsb25nKSBxLT5OdW1TaWduYWxzU2VudCk7CisJc2VxX3ByaW50ZihzZXEsICIgICBOdW1TaWduYWxzUmVjZWl2ZWQgPSAlbGx1XG4iLAorCQkgICAobG9uZyBsb25nKSBxLT5OdW1TaWduYWxzUmVjZWl2ZWQpOworCXNlcV9wcmludGYoc2VxLCAiICAgTnVtT3ZlcmZsb3dzICAgICAgID0gJWxsdVxuIiwKKwkJICAgKGxvbmcgbG9uZykgcS0+TnVtT3ZlcmZsb3dzKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIEhlYWQgICAgICAgICAgICAgICA9ICVsdVxuIiwgKHVsb25nKSBxLT5IZWFkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIFRhaWwgICAgICAgICAgICAgICA9ICVsdVxuIiwgKHVsb25nKSBxLT5UYWlsKTsKK30KKwordm9pZAordmlzb3JjaGFubmVsX2RlYnVnKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgaW50IG5RdWV1ZXMsCisJCSAgIHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBVMzIgb2ZmKQoreworCUhPU1RBRERSRVNTIGFkZHIgPSAwOworCXVsb25nIG5ieXRlcyA9IDAsIG5ieXRlc19yZWdpb24gPSAwOworCU1FTVJFR0lPTiAqbWVtcmVnaW9uID0gTlVMTDsKKwlDSEFOTkVMX0hFQURFUiBoZHI7CisJQ0hBTk5FTF9IRUFERVIgKnBoZHIgPSAmaGRyOworCWNoYXIgc1s5OV07CisJaW50IGkgPSAwOworCWludCBlcnJjb2RlID0gMDsKKworCWlmIChjaGFubmVsID09IE5VTEwpIHsKKwkJRVJSRFJWKCIlcyBubyBjaGFubmVsIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCW1lbXJlZ2lvbiA9IGNoYW5uZWwtPm1lbXJlZ2lvbjsKKwlpZiAobWVtcmVnaW9uID09IE5VTEwpIHsKKwkJRVJSRFJWKCIlcyBubyBtZW1yZWdpb24iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJYWRkciA9IHZpc29yX21lbXJlZ2lvbl9nZXRfcGh5c2FkZHIobWVtcmVnaW9uKTsKKwluYnl0ZXNfcmVnaW9uID0gdmlzb3JfbWVtcmVnaW9uX2dldF9uYnl0ZXMobWVtcmVnaW9uKTsKKwllcnJjb2RlID0gdmlzb3JjaGFubmVsX3JlYWQoY2hhbm5lbCwgb2ZmLAorCQkJCSAgICBwaGRyLCBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKTsKKwlpZiAoZXJyY29kZSA8IDApIHsKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAiUmVhZCBvZiBjaGFubmVsIGhlYWRlciBmYWlsZWQgd2l0aCBlcnJjb2RlPSVkKVxuIiwKKwkJCSAgIGVycmNvZGUpOworCQlpZiAob2ZmID09IDApIHsKKwkJCXBoZHIgPSAmY2hhbm5lbC0+Y2hhbl9oZHI7CisJCQlzZXFfcHV0cyhzZXEsICIoZm9sbG93aW5nIGRhdGEgbWF5IGJlIHN0YWxlKVxuIik7CisJCX0gZWxzZQorCQkJcmV0dXJuOworCX0KKwluYnl0ZXMgPSAodWxvbmcpIChwaGRyLT5TaXplKTsKKwlzZXFfcHJpbnRmKHNlcSwgIi0tLSBCZWdpbiBjaGFubmVsIEAweCUtMTYuMTZMeCBmb3IgMHglbHggYnl0ZXMgKHJlZ2lvbj0weCVseCBieXRlcykgLS0tXG4iLAorCQkgICBhZGRyICsgb2ZmLCBuYnl0ZXMsIG5ieXRlc19yZWdpb24pOworCXNlcV9wcmludGYoc2VxLCAiVHlwZSAgICAgICAgICAgID0gJXNcbiIsIEdVSURfZm9ybWF0MigmcGhkci0+VHlwZSwgcykpOworCXNlcV9wcmludGYoc2VxLCAiWm9uZUd1aWQgICAgICAgID0gJXNcbiIsCisJCSAgIEdVSURfZm9ybWF0MigmcGhkci0+Wm9uZUd1aWQsIHMpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlNpZ25hdHVyZSAgICAgICA9IDB4JS0xNi4xNkx4XG4iLAorCQkgICAobG9uZyBsb25nKSBwaGRyLT5TaWduYXR1cmUpOworCXNlcV9wcmludGYoc2VxLCAiTGVnYWN5U3RhdGUgICAgID0gJWx1XG4iLCAodWxvbmcpIHBoZHItPkxlZ2FjeVN0YXRlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlNydlN0YXRlICAgICAgICA9ICVsdVxuIiwgKHVsb25nKSBwaGRyLT5TcnZTdGF0ZSk7CisJc2VxX3ByaW50ZihzZXEsICJDbGlTdGF0ZUJvb3QgICAgPSAlbHVcbiIsICh1bG9uZykgcGhkci0+Q2xpU3RhdGVCb290KTsKKwlzZXFfcHJpbnRmKHNlcSwgIkNsaVN0YXRlT1MgICAgICA9ICVsdVxuIiwgKHVsb25nKSBwaGRyLT5DbGlTdGF0ZU9TKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkhlYWRlclNpemUgICAgICA9ICVsdVxuIiwgKHVsb25nKSBwaGRyLT5IZWFkZXJTaXplKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlNpemUgICAgICAgICAgICA9ICVsbHVcbiIsIChsb25nIGxvbmcpIHBoZHItPlNpemUpOworCXNlcV9wcmludGYoc2VxLCAiRmVhdHVyZXMgICAgICAgID0gMHglLTE2LjE2bGx4XG4iLAorCQkgICAobG9uZyBsb25nKSBwaGRyLT5GZWF0dXJlcyk7CisJc2VxX3ByaW50ZihzZXEsICJQYXJ0aXRpb25IYW5kbGUgPSAweCUtMTYuMTZsbHhcbiIsCisJCSAgIChsb25nIGxvbmcpIHBoZHItPlBhcnRpdGlvbkhhbmRsZSk7CisJc2VxX3ByaW50ZihzZXEsICJIYW5kbGUgICAgICAgICAgPSAweCUtMTYuMTZsbHhcbiIsCisJCSAgIChsb25nIGxvbmcpIHBoZHItPkhhbmRsZSk7CisJc2VxX3ByaW50ZihzZXEsICJWZXJzaW9uSWQgICAgICAgPSAlbHVcbiIsICh1bG9uZykgcGhkci0+VmVyc2lvbklkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIm9DaGFubmVsU3BhY2UgICA9ICVsbHVcbiIsCisJCSAgIChsb25nIGxvbmcpIHBoZHItPm9DaGFubmVsU3BhY2UpOworCWlmICgocGhkci0+b0NoYW5uZWxTcGFjZSA9PSAwKSB8fCAoZXJyY29kZSA8IDApKQorCQk7CisJZWxzZQorCQlmb3IgKGkgPSAwOyBpIDwgblF1ZXVlczsgaSsrKSB7CisJCQlTSUdOQUxfUVVFVUVfSEVBREVSIHE7CisJCQllcnJjb2RlID0gdmlzb3JjaGFubmVsX3JlYWQoY2hhbm5lbCwKKwkJCQkJCSAgICBvZmYgKyBwaGRyLT5vQ2hhbm5lbFNwYWNlICsKKwkJCQkJCSAgICAoaSAqIHNpemVvZihxKSksCisJCQkJCQkgICAgJnEsIHNpemVvZihxKSk7CisJCQlpZiAoZXJyY29kZSA8IDApIHsKKwkJCQlzZXFfcHJpbnRmKHNlcSwKKwkJCQkJICAgImZhaWxlZCB0byByZWFkIHNpZ25hbCBxdWV1ZSAjJWQgZnJvbSBjaGFubmVsIEAweCUtMTYuMTZMeCBlcnJjb2RlPSVkXG4iLAorCQkJCQkgICBpLCBhZGRyLCBlcnJjb2RlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXNpZ3F1ZXVlX2RlYnVnKCZxLCBpLCBzZXEpOworCQl9CisJc2VxX3ByaW50ZihzZXEsICItLS0gRW5kICAgY2hhbm5lbCBAMHglLTE2LjE2THggZm9yIDB4JWx4IGJ5dGVzIC0tLVxuIiwKKwkJICAgYWRkciArIG9mZiwgbmJ5dGVzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9kZWJ1Zyk7CisKK3ZvaWQKK3Zpc29yY2hhbm5lbF9kdW1wX3NlY3Rpb24oVklTT1JDSEFOTkVMICpjaGFuLCBjaGFyICpzLAorCQkJICBpbnQgb2ZmLCBpbnQgbGVuLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwljaGFyICpidWYsICp0YnVmLCAqZm10YnVmOworCWludCBmbXRidWZzaXplID0gMDsKKwlpbnQgaTsKKwlpbnQgZXJyY29kZSA9IDA7CisKKwlmbXRidWZzaXplID0gMTAwICogQ09WUShsZW4sIDE2KTsKKwlidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTHxfX0dGUF9OT1JFVFJZKTsKKwlmbXRidWYgPSBrbWFsbG9jKGZtdGJ1ZnNpemUsIEdGUF9LRVJORUx8X19HRlBfTk9SRVRSWSk7CisJaWYgKGJ1ZiA9PSBOVUxMIHx8IGZtdGJ1ZiA9PSBOVUxMKQorCQlnb3RvIEF3YXk7CisKKwllcnJjb2RlID0gdmlzb3JjaGFubmVsX3JlYWQoY2hhbiwgb2ZmLCBidWYsIGxlbik7CisJaWYgKGVycmNvZGUgPCAwKSB7CisJCUVSUkRSVigiJXMgZmFpbGVkIHRvIHJlYWQgJXMgZnJvbSBjaGFubmVsIGVycmNvZGU9JWQiLAorCQkgICAgICAgcywgX19mdW5jX18sIGVycmNvZGUpOworCQlnb3RvIEF3YXk7CisJfQorCXNlcV9wcmludGYoc2VxLCAiY2hhbm5lbCAlczpcbiIsIHMpOworCXRidWYgPSBidWY7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJaSA9IChsZW4gPCAxNikgPyBsZW4gOiAxNjsKKwkJaGV4X2R1bXBfdG9fYnVmZmVyKHRidWYsIGksIDE2LCAxLCBmbXRidWYsIGZtdGJ1ZnNpemUsIFRSVUUpOworCQlzZXFfcHJpbnRmKHNlcSwgIiVzXG4iLCBmbXRidWYpOworCQl0YnVmICs9IDE2OworCQlsZW4gLT0gMTY7CisJfQorCitBd2F5OgorCWlmIChidWYgIT0gTlVMTCkgeworCQlrZnJlZShidWYpOworCQlidWYgPSBOVUxMOworCX0KKwlpZiAoZm10YnVmICE9IE5VTEwpIHsKKwkJa2ZyZWUoZm10YnVmKTsKKwkJZm10YnVmID0gTlVMTDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfZHVtcF9zZWN0aW9uKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL3Zpc29yY2hhbm5lbF9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWxfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MmVlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWxfbWFpbi5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qIHZpc29yY2hhbm5lbF9tYWluLmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qCisgKiAgVGhpcyBpcyBhIG1vZHVsZSAid3JhcHBlciIgYXJvdW5kIHZpc29yY2hhbm5lbF9mdW5jcy4KKyAqLworCisjaW5jbHVkZSAiZ2xvYmFscy5oIgorI2luY2x1ZGUgImNoYW5uZWwuaCIKKyNpbmNsdWRlICJ2aXNvcmNoYW5uZWwuaCIKKyNpbmNsdWRlICJndWlkdXRpbHMuaCIKKworI2RlZmluZSBNWURSVk5BTUUgInZpc29yY2hhbm5lbCIKKworc3RhdGljIGludCBfX2luaXQKK3Zpc29yY2hhbm5lbF9pbml0KHZvaWQpCit7CisJSU5GT0RSVigiZHJpdmVyIHZlcnNpb24gJXMgbG9hZGVkIiwgVkVSU0lPTik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit2aXNvcmNoYW5uZWxfZXhpdCh2b2lkKQoreworCUlORk9EUlYoImRyaXZlciB1bmxvYWRlZCIpOworfQorCittb2R1bGVfaW5pdCh2aXNvcmNoYW5uZWxfaW5pdCk7Cittb2R1bGVfZXhpdCh2aXNvcmNoYW5uZWxfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlVuaXN5cyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBlcnZpc29yIGNoYW5uZWwgZHJpdmVyIGZvciBzZXJ2aWNlIHBhcnRpdGlvbjogdmVyICIKKwkJICAgVkVSU0lPTik7CitNT0RVTEVfVkVSU0lPTihWRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYTJmYmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgVW5pc3lzIHZpc29yY2hpcHNldCBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBVTklTWVNfVklTT1JDSElQU0VUCisJdHJpc3RhdGUgIlVuaXN5cyB2aXNvcmNoaXBzZXQgZHJpdmVyIgorCWRlcGVuZHMgb24gVU5JU1lTU1BBUiAmJiBVTklTWVNfVklTT1JVVElMICYmIFVOSVNZU19WSVNPUkNIQU5ORUwKKwktLS1oZWxwLS0tCisJSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGVuYWJsZSB0aGUgVW5pc3lzIHZpc29yY2hpcHNldCBkcml2ZXIuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlODY1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L01ha2VmaWxlCkBAIC0wLDAgKzEsMTggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIFVuaXN5cyB2aXNvcmNoaXBzZXQKKyMKKworb2JqLSQoQ09ORklHX1VOSVNZU19WSVNPUkNISVBTRVQpCSs9IHZpc29yY2hpcHNldC5vCisKK3Zpc29yY2hpcHNldC15IDo9IHZpc29yY2hpcHNldF9tYWluLm8gY29udHJvbHZtX2RpcmVjdC5vIGZpbGUubyBmaWxleGZlci5vIFwKKwkJCXBhcnNlci5vCisKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscworY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwKK2NjZmxhZ3MteSArPSAtSWluY2x1ZGUvZ2VuZXJhdGVkCitjY2ZsYWdzLXkgKz0gLURDT05GSUdfU1BBUl9HVUVTVCAtREdVRVNURFJJVkVSQlVJTEQgLUROT0FVVE9WRVJTSU9OCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2NvbnRyb2x2bS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvY29udHJvbHZtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczZmExMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2NvbnRyb2x2bS5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qIGNvbnRyb2x2bS5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQ09OVFJPTFZNX0hfXworI2RlZmluZSBfX0NPTlRST0xWTV9IX18KKworI2luY2x1ZGUgInRpbXNrbW9kLmgiCisKK2ludCAgICAgICAgIGNvbnRyb2x2bV9pbml0KHZvaWQpOwordm9pZCAgICAgICAgY29udHJvbHZtX2RlaW5pdCh2b2lkKTsKK0hPU1RBRERSRVNTIGNvbnRyb2x2bV9nZXRfY2hhbm5lbF9hZGRyZXNzKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2NvbnRyb2x2bV9kaXJlY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2NvbnRyb2x2bV9kaXJlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTExZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvY29udHJvbHZtX2RpcmVjdC5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIGNvbnRyb2x2bV9kaXJlY3QuYworICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyogVGhpcyBpcyBhIGNvbnRyb2x2bS1yZWxhdGVkIGNvZGUgdGhhdCBpcyBkZXBlbmRlbnQgdXBvbiBmaXJtd2FyZSBydW5uaW5nCisgKiBvbiBhIHZpcnR1YWwgcGFydGl0aW9uLgorICovCisKKyNpbmNsdWRlICJnbG9iYWxzLmgiCisjaW5jbHVkZSAidWlzdXRpbHMuaCIKKyNpbmNsdWRlICJjb250cm9sdm0uaCIKKyNkZWZpbmUgQ1VSUkVOVF9GSUxFX1BDIFZJU09SX0NISVBTRVRfUENfY29udHJvbHZtX2RpcmVjdF9jCisKKworLyogV2UgY2FuIGZpbGwgaW4gdGhpcyBjb2RlIHdoZW4gd2UgbGVhcm4gaG93IHRvIG1ha2Ugdm1jYWxscy4uLiAqLworCisKKworaW50IGNvbnRyb2x2bV9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKworCit2b2lkIGNvbnRyb2x2bV9kZWluaXQodm9pZCkKK3sKK30KKworCisKK0hPU1RBRERSRVNTIGNvbnRyb2x2bV9nZXRfY2hhbm5lbF9hZGRyZXNzKHZvaWQpCit7CisJc3RhdGljIEJPT0wgd2FybmVkID0gRkFMU0U7CisJVTY0IGFkZHIgPSAwOworCisJVTMyIHNpemUgPSAwOworCisJaWYgKCFWTUNBTExfU1VDQ0VTU0ZVTChJc3N1ZV9WTUNBTExfSU9fQ09OVFJPTFZNX0FERFIoJmFkZHIsICZzaXplKSkpIHsKKwkJaWYgKCF3YXJuZWQpIHsKKwkJCUVSUkRSVigiJXMgLSB2bWNhbGwgdG8gZGV0ZXJtaW5lIGNvbnRyb2x2bSBjaGFubmVsIGFkZHIgZmFpbGVkIiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQl3YXJuZWQgPSBUUlVFOworCQl9CisJCXJldHVybiAwOworCX0KKwlJTkZPRFJWKCJjb250cm9sdm0gYWRkcj0lTHgiLCBhZGRyKTsKKwlyZXR1cm4gYWRkcjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjE0YTExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZS5jCkBAIC0wLDAgKzEsMjI2IEBACisvKiBmaWxlLmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qIFRoaXMgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIHRoYXQgYWxsb3dzIGEgdXNlcm1vZGUgcHJvZ3JhbSB0bworICogY29tbXVuaWNhdGUgd2l0aCB0aGUgdmlzb3JjaGlwc2V0IGRyaXZlciB1c2luZyBhIGRldmljZS9maWxlIGludGVyZmFjZS4KKyAqLworCisjaW5jbHVkZSAiZ2xvYmFscy5oIgorI2luY2x1ZGUgInZpc29yY2hhbm5lbC5oIgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlICJ1aXN1dGlscy5oIgorI2luY2x1ZGUgImZpbGUuaCIKKworI2RlZmluZSBDVVJSRU5UX0ZJTEVfUEMgVklTT1JfQ0hJUFNFVF9QQ19maWxlX2MKKworc3RhdGljIHN0cnVjdCBjZGV2IENkZXY7CitzdGF0aWMgVklTT1JDSEFOTkVMICoqUENvbnRyb2xWbV9jaGFubmVsOworc3RhdGljIGRldl90IE1ham9yRGV2ID0gLTE7IC8qKjwgaW5kaWNhdGVzIG1ham9yIG51bSBmb3IgZGV2aWNlICovCitzdGF0aWMgQk9PTCBSZWdpc3RlcmVkID0gRkFMU0U7CisKK3N0YXRpYyBpbnQgdmlzb3JjaGlwc2V0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCB2aXNvcmNoaXBzZXRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IHZpc29yY2hpcHNldF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisjaWZkZWYgSEFWRV9VTkxPQ0tFRF9JT0NUTAorbG9uZyB2aXNvcmNoaXBzZXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKyNlbHNlCitpbnQgdmlzb3JjaGlwc2V0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZpc29yY2hpcHNldF9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gdmlzb3JjaGlwc2V0X29wZW4sCisJLnJlYWQgPSBOVUxMLAorCS53cml0ZSA9IE5VTEwsCisjaWZkZWYgSEFWRV9VTkxPQ0tFRF9JT0NUTAorCS51bmxvY2tlZF9pb2N0bCA9IHZpc29yY2hpcHNldF9pb2N0bCwKKyNlbHNlCisJLmlvY3RsID0gdmlzb3JjaGlwc2V0X2lvY3RsLAorI2VuZGlmCisJLnJlbGVhc2UgPSB2aXNvcmNoaXBzZXRfcmVsZWFzZSwKKwkubW1hcCA9IHZpc29yY2hpcHNldF9tbWFwLAorfTsKKworaW50Cit2aXNvcmNoaXBzZXRfZmlsZV9pbml0KGRldl90IG1ham9yRGV2LCBWSVNPUkNIQU5ORUwgKipwQ29udHJvbFZtX2NoYW5uZWwpCit7CisJaW50IHJjID0gLTE7CisKKwlQQ29udHJvbFZtX2NoYW5uZWwgPSBwQ29udHJvbFZtX2NoYW5uZWw7CisJTWFqb3JEZXYgPSBtYWpvckRldjsKKwljZGV2X2luaXQoJkNkZXYsICZ2aXNvcmNoaXBzZXRfZm9wcyk7CisJQ2Rldi5vd25lciA9IFRISVNfTU9EVUxFOworCWlmIChNQUpPUihNYWpvckRldikgPT0gMCkgeworCQkvKiBkeW5hbWljIG1ham9yIGRldmljZSBudW1iZXIgcmVnaXN0cmF0aW9uIHJlcXVpcmVkICovCisJCWlmIChhbGxvY19jaHJkZXZfcmVnaW9uKCZNYWpvckRldiwgMCwgMSwgTVlEUlZOQU1FKSA8IDApIHsKKwkJCUVSUkRSVigiVW5hYmxlIHRvIGFsbG9jYXRlK3JlZ2lzdGVyIGNoYXIgZGV2aWNlICVzIiwKKwkJCSAgICAgICBNWURSVk5BTUUpOworCQkJZ290byBBd2F5OworCQl9CisJCVJlZ2lzdGVyZWQgPSBUUlVFOworCQlJTkZPRFJWKCJOZXcgbWFqb3IgbnVtYmVyICVkIHJlZ2lzdGVyZWRcbiIsIE1BSk9SKE1ham9yRGV2KSk7CisJfSBlbHNlIHsKKwkJLyogc3RhdGljIG1ham9yIGRldmljZSBudW1iZXIgcmVnaXN0cmF0aW9uIHJlcXVpcmVkICovCisJCWlmIChyZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1ham9yRGV2LCAxLCBNWURSVk5BTUUpIDwgMCkgeworCQkJRVJSRFJWKCJVbmFibGUgdG8gcmVnaXN0ZXIgY2hhciBkZXZpY2UgJXMiLCBNWURSVk5BTUUpOworCQkJZ290byBBd2F5OworCQl9CisJCVJlZ2lzdGVyZWQgPSBUUlVFOworCQlJTkZPRFJWKCJTdGF0aWMgbWFqb3IgbnVtYmVyICVkIHJlZ2lzdGVyZWRcbiIsIE1BSk9SKE1ham9yRGV2KSk7CisJfQorCWlmIChjZGV2X2FkZCgmQ2RldiwgTUtERVYoTUFKT1IoTWFqb3JEZXYpLCAwKSwgMSkgPCAwKSB7CisJCUVSUkRSVigiZmFpbGVkIHRvIGNyZWF0ZSBjaGFyIGRldmljZTogKHN0YXR1cz0lZClcbiIsIHJjKTsKKwkJZ290byBBd2F5OworCX0KKwlJTkZPRFJWKCJSZWdpc3RlcmVkIGNoYXIgZGV2aWNlIGZvciAlcyAobWFqb3I9JWQpIiwKKwkJTVlEUlZOQU1FLCBNQUpPUihNYWpvckRldikpOworCXJjID0gMDsKK0F3YXk6CisJcmV0dXJuIHJjOworfQorCit2b2lkCit2aXNvcmNoaXBzZXRfZmlsZV9jbGVhbnVwKHZvaWQpCit7CisJaWYgKENkZXYub3BzICE9IE5VTEwpCisJCWNkZXZfZGVsKCZDZGV2KTsKKwlDZGV2Lm9wcyA9IE5VTEw7CisJaWYgKFJlZ2lzdGVyZWQpIHsKKwkJaWYgKE1BSk9SKE1ham9yRGV2KSA+PSAwKSB7CisJCQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTWFqb3JEZXYsIDEpOworCQkJTWFqb3JEZXYgPSBNS0RFVigwLCAwKTsKKwkJfQorCQlSZWdpc3RlcmVkID0gRkFMU0U7CisJfQorfQorCitzdGF0aWMgaW50Cit2aXNvcmNoaXBzZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBtaW5vcl9udW1iZXIgPSBpbWlub3IoaW5vZGUpOworCWludCByYyA9IC1FTk9ERVY7CisKKwlERUJVR0RSVigiJXMiLCBfX2Z1bmNfXyk7CisJaWYgKG1pbm9yX251bWJlciAhPSAwKQorCQlnb3RvIEF3YXk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlyYyA9IDA7CitBd2F5OgorCWlmIChyYyA8IDApCisJCUVSUkRSVigiJXMgbWlub3I9JWQgZmFpbGVkIiwgX19mdW5jX18sIG1pbm9yX251bWJlcik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50Cit2aXNvcmNoaXBzZXRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlERUJVR0RSVigiJXMiLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Zpc29yY2hpcHNldF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwl1bG9uZyBwaHlzQWRkciA9IDA7CisJdWxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCUdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgYWRkciA9IDA7CisKKwkvKiBzdl9lbmFibGVfZGZwKCk7ICovCisJREVCVUdEUlYoIiVzIiwgX19mdW5jX18pOworCWlmIChvZmZzZXQgJiAoUEFHRV9TSVpFIC0gMSkpIHsKKwkJRVJSRFJWKCIlcyB2aXJ0dWFsIGFkZHJlc3MgTk9UIHBhZ2UtYWxpZ25lZCEiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5YSU87CS8qIG5lZWQgYWxpZ25lZCBvZmZzZXRzICovCisJfQorCXN3aXRjaCAob2Zmc2V0KSB7CisJY2FzZSBWSVNPUkNISVBTRVRfTU1BUF9DT05UUk9MQ0hBTk9GRlNFVDoKKwkJdm1hLT52bV9mbGFncyB8PSBWTV9JTzsKKwkJaWYgKCpQQ29udHJvbFZtX2NoYW5uZWwgPT0gTlVMTCkgeworCQkJRVJSRFJWKCIlcyBubyBjb250cm9sdm0gY2hhbm5lbCB5ZXQiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCXZpc29yY2hhbm5lbF9yZWFkKCpQQ29udHJvbFZtX2NoYW5uZWwsCisJCQkJICBvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwKKwkJCQkJICAgZ3BDb250cm9sQ2hhbm5lbCksICZhZGRyLAorCQkJCSAgc2l6ZW9mKGFkZHIpKTsKKwkJaWYgKGFkZHIgPT0gMCkgeworCQkJRVJSRFJWKCIlcyBjb250cm9sIGNoYW5uZWwgYWRkcmVzcyBpcyAwIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCQlwaHlzQWRkciA9ICh1bG9uZykgKGFkZHIpOworCQlERUJVR0RSVigibWFwcGluZyBwaHlzaWNhbCBhZGRyZXNzID0gMHglbHgiLCBwaHlzQWRkcik7CisJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJCSAgICBwaHlzQWRkciA+PiBQQUdFX1NISUZULAorCQkJCSAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkJICAgIC8qcGdwcm90X25vbmNhY2hlZCAqLworCQkJCSAgICAodm1hLT52bV9wYWdlX3Byb3QpKSkgeworCQkJRVJSRFJWKCIlcyByZW1hcF9wZm5fcmFuZ2UgZmFpbGVkIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCURFQlVHRFJWKCIlcyBzdWNjZXNzISIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEhBVkVfVU5MT0NLRURfSU9DVEwKK2xvbmcKK3Zpc29yY2hpcHNldF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCisjZWxzZQoraW50Cit2aXNvcmNoaXBzZXRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorI2VuZGlmCit7CisJaW50IHJjID0gU1VDQ0VTUzsKKwlTNjQgYWRqdXN0bWVudDsKKwlTNjQgdnJ0Y19vZmZzZXQ7CisJREJHSU5GKCJlbnRlcmVkIHZpc29yY2hpcHNldF9pb2N0bCwgY21kPSVkIiwgY21kKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVk1DQUxMX1FVRVJZX0dVRVNUX1ZJUlRVQUxfVElNRV9PRkZTRVQ6CisJCS8qIGdldCB0aGUgcGh5c2ljYWwgcnRjIG9mZnNldCAqLworCQl2cnRjX29mZnNldCA9IElzc3VlX1ZNQ0FMTF9RVUVSWV9HVUVTVF9WSVJUVUFMX1RJTUVfT0ZGU0VUKCk7CisJCWlmIChjb3B5X3RvX3VzZXIKKwkJICAgICgodm9pZCBfX3VzZXIgKilhcmcsICZ2cnRjX29mZnNldCwgc2l6ZW9mKHZydGNfb2Zmc2V0KSkpIHsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWdvdG8gQXdheTsKKwkJfQorCQlEQkdJTkYoImluc2RlIHZpc29yY2hpcHNldF9pb2N0bCwgY21kPSVkLCB2cnRjX29mZnNldD0lbGxkIiwKKwkJICAgICAgIGNtZCwgdnJ0Y19vZmZzZXQpOworCQlicmVhazsKKwljYXNlIFZNQ0FMTF9VUERBVEVfUEhZU0lDQUxfVElNRToKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCSAgICAoJmFkanVzdG1lbnQsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGFkanVzdG1lbnQpKSkgeworCQkJcmMgPSAtRUZBVUxUOworCQkJZ290byBBd2F5OworCQl9CisJCURCR0lORigiaW5zZGUgdmlzb3JjaGlwc2V0X2lvY3RsLCBjbWQ9JWQsIGFkanVzdG1lbnQ9JWxsZCIsIGNtZCwKKwkJICAgICAgIGFkanVzdG1lbnQpOworCQlyYyA9IElzc3VlX1ZNQ0FMTF9VUERBVEVfUEhZU0lDQUxfVElNRShhZGp1c3RtZW50KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HRVJSKCJ2aXNvcmNoaXBzZXRfaW9jdGwgcmVjZWl2ZWQgaW52YWxpZCBjb21tYW5kIik7CisJCXJjID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJfQorQXdheToKKwlEQkdJTkYoImV4aXRpbmcgJWQhIiwgcmMpOworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGUuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTcyODJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIGZpbGUuaAorICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0ZJTEVfSF9fCisjZGVmaW5lIF9fRklMRV9IX18KKworI2luY2x1ZGUgImdsb2JhbHMuaCIKKworaW50IHZpc29yY2hpcHNldF9maWxlX2luaXQoZGV2X3QgbWFqb3JEZXYsIFZJU09SQ0hBTk5FTCAqKnBDb250cm9sVm1fY2hhbm5lbCk7Cit2b2lkIHZpc29yY2hpcHNldF9maWxlX2NsZWFudXAodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZXhmZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGV4ZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMxY2ZmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGV4ZmVyLmMKQEAgLTAsMCArMSw1MDYgQEAKKy8qIGZpbGV4ZmVyLmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEzIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qIENvZGUgaGVyZS1pbiBpcyB0aGUgImdsdWUiIHRoYXQgY29ubmVjdHMgY29udHJvbHZtIG1lc3NhZ2VzIHdpdGggdGhlCisgKiBzcGFyZmlsZXhmZXIgZHJpdmVyLCB3aGljaCBpcyB1c2VkIHRvIHRyYW5zZmVyIGZpbGUgY29udGVudHMgYXMgcGF5bG9hZAorICogYWNyb3NzIHRoZSBjb250cm9sdm0gY2hhbm5lbC4KKyAqLworCisjaW5jbHVkZSAiZ2xvYmFscy5oIgorI2luY2x1ZGUgImNvbnRyb2x2bS5oIgorI2luY2x1ZGUgInZpc29yY2hpcHNldC5oIgorI2luY2x1ZGUgImZpbGV4ZmVyLmgiCisKKyNpZmRlZiBFTkFCTEVfU1BBUkZJTEVYRkVSIC8qIHNwYXJmaWxleGZlciBrZXJuZWwgbW9kdWxlIGVuYWJsZWQgaW4gYnVpbGQgKi8KKyNpbmNsdWRlICJzcGFyZmlsZXhmZXIuaCIKKworLyogRHJpdmVyLWdsb2JhbCBtZW1vcnkgKi8KK3N0YXRpYyBMSVNUX0hFQUQoUmVxdWVzdF9saXN0KTsJLyogbGlzdCBvZiBzdHJ1Y3QgYW55X3JlcXVlc3QgKiwgdmlhCisJCQkJICogcmVxX2xpc3QgbWVtYiAqLworCisvKiBsb2NrIGZvciBhYm92ZSBwb29sIGZvciBhbGxvY2F0aW9uIG9mIGFueV9yZXF1ZXN0IHN0cnVjdHMsIGFuZCBwb29sCisqIG5hbWU7IG5vdGUgdGhhdCBrbWVtX2NhY2hlX2NyZWF0ZSByZXF1aXJlcyB0aGF0IHdlIGtlZXAgdGhlIHN0b3JhZ2UKKyogZm9yIHRoZSBwb29sIG5hbWUgZm9yIHRoZSBsaWZlIG9mIHRoZSBwb29sCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soUmVxdWVzdF9saXN0X2xvY2spOworCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKlJlcXVlc3RfbWVtb3J5X3Bvb2w7CitzdGF0aWMgY29uc3QgY2hhciBSZXF1ZXN0X21lbW9yeV9wb29sX25hbWVbXSA9ICJmaWxleGZlcl9yZXF1ZXN0X3Bvb2wiOworc2l6ZV90IENhbGxlcl9yZXFfY29udGV4dF9ieXRlcyA9IDA7CS8qIHBhc3NlZCB0byBmaWxleGZlcl9jb25zdHJ1Y3RvcigpICovCisKKy8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBzaW5nbGUgY29udHJvbHZtIEdFVEZJTEUgY29udmVyc2F0aW9uLCB3aGljaAorICogY29uc2lzdHMgb2YgYSBzaW5nbGUgY29udHJvbHZtIHJlcXVlc3QgbWVzc2FnZSBhbmQgMSBvciBtb3JlIGNvbnRyb2x2bQorICogcmVzcG9uc2UgbWVzc2FnZXMuCisgKi8KK3N0cnVjdCBnZXRmaWxlX3JlcXVlc3QgeworCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBjb250cm9sdm1faGVhZGVyOworCWF0b21pY190IGJ1ZmZlcnNfaW5fdXNlOworCUdFVF9DT05USUdVT1VTX0NPTlRST0xWTV9QQVlMT0FEX0ZVTkMgZ2V0X2NvbnRpZ3VvdXNfY29udHJvbHZtX3BheWxvYWQ7CisJQ09OVFJPTFZNX1JFU1BPTkRfV0lUSF9QQVlMT0FEX0ZVTkMgY29udHJvbHZtX3Jlc3BvbmRfd2l0aF9wYXlsb2FkOworfTsKKworLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIHNpbmdsZSBjb250cm9sdm0gUFVURklMRSBjb252ZXJzYXRpb24sIHdoaWNoCisgKiBjb25zaXN0cyBvZiBhIHNpbmdsZSBjb250cm9sdm0gcmVxdWVzdCB3aXRoIGEgZmlsZW5hbWUsIGFuZCBhZGRpdGlvbmFsCisgKiBjb250cm9sdm0gbWVzc2FnZXMgd2l0aCBmaWxlIGRhdGEuCisgKi8KK3N0cnVjdCBwdXRmaWxlX3JlcXVlc3QgeworCUdFVF9DT05UUk9MVk1fRklMRURBVEFfRlVOQyBnZXRfY29udHJvbHZtX2ZpbGVkYXRhOworCUNPTlRST0xWTV9SRVNQT05EX0ZVTkMgY29udHJvbHZtX2VuZF9wdXRGaWxlOworfTsKKworLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIHNpbmdsZSBmaWxlIHRyYW5zZmVyIG9wZXJhdGlvbiwgd2hpY2ggY2FuIGVpdGhlcgorICogYmUgYSBHRVRGSUxFIG9yIFBVVEZJTEUuCisgKi8KK3N0cnVjdCBhbnlfcmVxdWVzdCB7CisJc3RydWN0IGxpc3RfaGVhZCByZXFfbGlzdDsKKwl1bG9uZzIgZmlsZV9yZXF1ZXN0X251bWJlcjsKKwl1bG9uZzIgZGF0YV9zZXF1ZW5jZV9udW1iZXI7CisJVFJBTlNNSVRGSUxFX0RVTVBfRlVOQyBkdW1wX2Z1bmM7CisJQk9PTCBpc19nZXQ7CisJdW5pb24geworCQlzdHJ1Y3QgZ2V0ZmlsZV9yZXF1ZXN0IGdldDsKKwkJc3RydWN0IHB1dGZpbGVfcmVxdWVzdCBwdXQ7CisJfTsKKwkvKiBTaXplIG9mIGNhbGxlcl9jb250ZXh0X2RhdGEgd2lsbCBiZQorCSAqIDxDYWxsZXJfcmVxX2NvbnRleHRfYnl0ZXM+IGJ5dGVzLiAgSSBhbGlnbmVkIHRoaXMgYmVjYXVzZSBJCisJICogYW0gcGFyYW5vaWQgYWJvdXQgd2hhdCBoYXBwZW5zIHdoZW4gYW4gYXJiaXRyYXJ5IGRhdGEKKwkgKiBzdHJ1Y3R1cmUgd2l0aCB1bmtub3duIGFsaWdubWVudCByZXF1aXJlbWVudHMgZ2V0cyBjb3BpZWQKKwkgKiBoZXJlLiAgSSB3YW50IGNhbGxlcl9jb250ZXh0X2RhdGEgdG8gYmUgYWxpZ25lZCB0byB0aGUKKwkgKiBjb2Fyc2VzdCBwb3NzaWJsZSBhbGlnbm1lbnQgYm91bmRhcnkgdGhhdCBjb3VsZCBiZSByZXF1aXJlZAorCSAqIGZvciBhbnkgdXNlciBkYXRhIHN0cnVjdHVyZS4KKwkgKi8KKwl1OCBjYWxsZXJfY29udGV4dF9kYXRhWzFdIF9fYWxpZ25lZChzaXplb2YodWxvbmcyKTsKK307CisKKy8qCisgKiBMaW5rcyB0aGUgYW55X3JlcXVlc3QgaW50byB0aGUgZ2xvYmFsIGxpc3Qgb2YgYWxsb2NhdGVkIHJlcXVlc3RzCisgKiAoPFJlcXVlc3RfbGlzdD4pLgorICovCitzdGF0aWMgdm9pZAordW5pdF90cmFja2luZ19jcmVhdGUoc3RydWN0IGxpc3RfaGVhZCAqZGV2X2xpc3RfbGluaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZSZXF1ZXN0X2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKGRldl9saXN0X2xpbmssICZSZXF1ZXN0X2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlJlcXVlc3RfbGlzdF9sb2NrLCBmbGFncyk7Cit9CisKKy8qIFVubGlua3MgYSBhbnlfcmVxdWVzdCBmcm9tIHRoZSBnbG9iYWwgbGlzdCAoPFJlcXVlc3RfbGlzdD4pLgorICovCitzdGF0aWMgdm9pZAordW5pdF90cmFja2luZ19kZXN0cm95KHN0cnVjdCBsaXN0X2hlYWQgKmRldl9saXN0X2xpbmspCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmUmVxdWVzdF9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbChkZXZfbGlzdF9saW5rKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZSZXF1ZXN0X2xpc3RfbG9jaywgZmxhZ3MpOworfQorCisvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFuZCByZXR1cm4gYSBuZXcgYW55X3JlcXVlc3Qgc3RydWN0LCBhbmQKKyAqIGxpbmsgaXQgdG8gdGhlIGdsb2JhbCBsaXN0IG9mIG91dHN0YW5kaW5nIHJlcXVlc3RzLgorICovCitzdGF0aWMgc3RydWN0IGFueV9yZXF1ZXN0ICoKK2FsbG9jX3JlcXVlc3QoY2hhciAqZm4sIGludCBsbikKK3sKKwlzdHJ1Y3QgYW55X3JlcXVlc3QgKnJlcSA9IChzdHJ1Y3QgYW55X3JlcXVlc3QgKikKKwkgICAgKHZpc29yY2hpcHNldF9jYWNoZV9hbGxvYyhSZXF1ZXN0X21lbW9yeV9wb29sLAorCQkJCSAgICAgIEZBTFNFLAorCQkJCSAgICAgIGZuLCBsbikpOworCWlmICghcmVxKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQocmVxLCAwLCBzaXplb2Yoc3RydWN0IGFueV9yZXF1ZXN0KSArIENhbGxlcl9yZXFfY29udGV4dF9ieXRlcyk7CisJdW5pdF90cmFja2luZ19jcmVhdGUoJnJlcS0+cmVxX2xpc3QpOworCXJldHVybiByZXE7Cit9CisKKy8qIEJvb2stZW5kIGZvciBhbGxvY19yZXF1ZXN0KCkuCisgKi8KK3N0YXRpYyB2b2lkCitmcmVlX3JlcXVlc3Qoc3RydWN0IGFueV9yZXF1ZXN0ICpyZXEsIGNoYXIgKmZuLCBpbnQgbG4pCit7CisJdW5pdF90cmFja2luZ19kZXN0cm95KCZyZXEtPnJlcV9saXN0KTsKKwl2aXNvcmNoaXBzZXRfY2FjaGVfZnJlZShSZXF1ZXN0X21lbW9yeV9wb29sLCByZXEsIGZuLCBsbik7Cit9CisKKy8qIENvbnN0cnVjdG9yIGZvciBmaWxleGZlci5vLgorICovCitpbnQKK2ZpbGV4ZmVyX2NvbnN0cnVjdG9yKHNpemVfdCByZXFfY29udGV4dF9ieXRlcykKK3sKKwlpbnQgcmMgPSAtMTsKKworCUNhbGxlcl9yZXFfY29udGV4dF9ieXRlcyA9IHJlcV9jb250ZXh0X2J5dGVzOworCVJlcXVlc3RfbWVtb3J5X3Bvb2wgPQorCSAgICBrbWVtX2NhY2hlX2NyZWF0ZShSZXF1ZXN0X21lbW9yeV9wb29sX25hbWUsCisJCQkgICAgICBzaXplb2Yoc3RydWN0IGFueV9yZXF1ZXN0KSArCisJCQkgICAgICBDYWxsZXJfcmVxX2NvbnRleHRfYnl0ZXMsCisJCQkgICAgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOworCWlmICghUmVxdWVzdF9tZW1vcnlfcG9vbCkgeworCQlMT0dFUlIoImZhaWxlZCB0byBhbGxvYyBSZXF1ZXN0X21lbW9yeV9wb29sIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBBd2F5OworCX0KKwlyYyA9IDA7CitBd2F5OgorCWlmIChyYyA8IDApIHsKKwkJaWYgKFJlcXVlc3RfbWVtb3J5X3Bvb2wpIHsKKwkJCWttZW1fY2FjaGVfZGVzdHJveShSZXF1ZXN0X21lbW9yeV9wb29sKTsKKwkJCVJlcXVlc3RfbWVtb3J5X3Bvb2wgPSBOVUxMOworCQl9CisJfQorCXJldHVybiByYzsKK30KKworLyogRGVzdHJ1Y3RvciBmb3IgZmlsZXhmZXIuby4KKyAqLwordm9pZAorZmlsZXhmZXJfZGVzdHJ1Y3Rvcih2b2lkKQoreworCWlmIChSZXF1ZXN0X21lbW9yeV9wb29sKSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShSZXF1ZXN0X21lbW9yeV9wb29sKTsKKwkJUmVxdWVzdF9tZW1vcnlfcG9vbCA9IE5VTEw7CisJfQorfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgb2J0YWluIGFuIGF2YWlsYWJsZSBjaHVuayBmcm9tIHRoZSBjb250cm9sdm0gcGF5bG9hZCBhcmVhLAorICogc3RvcmUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGNodW5rIGluIDxhY3R1YWxfc2l6ZT4sIGFuZCByZXR1cm4gYSBwb2ludGVyCisgKiB0byB0aGUgY2h1bmsuICBUaGUgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHRoZSBzcGFyZmlsZXhmZXIgZHJpdmVyLCB3aGljaCBjYWxscworICogaXQgd2hlbmV2ZXIgcGF5bG9hZCBzcGFjZSBpcyByZXF1aXJlZCB0byBjb3B5IGZpbGUgZGF0YSBpbnRvLgorICovCitzdGF0aWMgdm9pZCAqCitnZXRfZW1wdHlfYnVja2V0X2Zvcl9nZXRmaWxlX2RhdGEodm9pZCAqY29udGV4dCwKKwkJCQkgIHVsb25nIG1pbl9zaXplLCB1bG9uZyBtYXhfc2l6ZSwKKwkJCQkgIHVsb25nICphY3R1YWxfc2l6ZSkKK3sKKwl2b2lkICpidWNrZXQ7CisJc3RydWN0IGFueV9yZXF1ZXN0ICpyZXEgPSAoc3RydWN0IGFueV9yZXF1ZXN0ICopIGNvbnRleHQ7CisKKwlpZiAoIXJlcS0+aXNfZ2V0KSB7CisJCUxPR0VSUigiJXMgLSB1bmV4cGVjdGVkIGNhbGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKwlidWNrZXQgPSAoKnJlcS0+Z2V0LmdldF9jb250aWd1b3VzX2NvbnRyb2x2bV9wYXlsb2FkKQorCSAgICAobWluX3NpemUsIG1heF9zaXplLCBhY3R1YWxfc2l6ZSk7CisJaWYgKGJ1Y2tldCAhPSBOVUxMKSB7CisJCWF0b21pY19pbmMoJnJlcS0+Z2V0LmJ1ZmZlcnNfaW5fdXNlKTsKKwkJREJHSU5GKCIlcyAtIHNlbnQgJWx1LWJ5dGUgYnVmZmVyIiwgX19mdW5jX18sICphY3R1YWxfc2l6ZSk7CisJfQorCXJldHVybiBidWNrZXQ7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBzZW5kIGEgY29udHJvbHZtIHJlc3BvbnNlIHdpdGggZGF0YSBpbiB0aGUgcGF5bG9hZAorICogKHdob3NlIHNwYWNlIHdhcyBvYnRhaW5lZCB3aXRoIGdldF9lbXB0eV9idWNrZXRfZm9yX2dldGZpbGVfZGF0YSkuICBUaGUKKyAqIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byB0aGUgc3BhcmZpbGV4ZmVyIGRyaXZlciwgd2hpY2ggY2FsbHMgaXQgd2hlbmV2ZXIgaXQKKyAqIHdhbnRzIHRvIHNlbmQgZmlsZSBkYXRhIGJhY2sgYWNyb3NzIHRoZSBjb250cm9sdm0gY2hhbm5lbC4KKyAqLworc3RhdGljIGludAorc2VuZF9mdWxsX2dldGZpbGVfZGF0YV9idWNrZXQodm9pZCAqY29udGV4dCwgdm9pZCAqYnVja2V0LAorCQkJICAgICAgdWxvbmcgYnVja2V0X2FjdHVhbF9zaXplLCB1bG9uZyBidWNrZXRfdXNlZF9zaXplKQoreworCXN0cnVjdCBhbnlfcmVxdWVzdCAqcmVxID0gKHN0cnVjdCBhbnlfcmVxdWVzdCAqKSBjb250ZXh0OworCisJaWYgKCFyZXEtPmlzX2dldCkgeworCQlMT0dFUlIoIiVzIC0gdW5leHBlY3RlZCBjYWxsIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJREJHSU5GKCJzZW5kaW5nIGJ1ZmZlciBmb3IgJWx1LyVsdSIsCisJICAgICAgIGJ1Y2tldF91c2VkX3NpemUsIGJ1Y2tldF9hY3R1YWxfc2l6ZSk7CisJaWYgKCEoKnJlcS0+Z2V0LmNvbnRyb2x2bV9yZXNwb25kX3dpdGhfcGF5bG9hZCkKKwkgICAgKCZyZXEtPmdldC5jb250cm9sdm1faGVhZGVyLAorCSAgICAgcmVxLT5maWxlX3JlcXVlc3RfbnVtYmVyLAorCSAgICAgcmVxLT5kYXRhX3NlcXVlbmNlX251bWJlcisrLAorCSAgICAgMCwgYnVja2V0LCBidWNrZXRfYWN0dWFsX3NpemUsIGJ1Y2tldF91c2VkX3NpemUsIFRSVUUpKQorCQlhdG9taWNfZGVjKCZyZXEtPmdldC5idWZmZXJzX2luX3VzZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBzZW5kIGEgY29udHJvbHZtIHJlc3BvbnNlIGluZGljYXRpbmcgdGhlIGVuZCBvZiBhCisgKiBHRVRGSUxFIHRyYW5zZmVyLiAgVGhlIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byB0aGUgc3BhcmZpbGV4ZmVyIGRyaXZlci4KKyAqLworc3RhdGljIHZvaWQKK3NlbmRfZW5kX29mX2dldGZpbGVfZGF0YSh2b2lkICpjb250ZXh0LCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBhbnlfcmVxdWVzdCAqcmVxID0gKHN0cnVjdCBhbnlfcmVxdWVzdCAqKSBjb250ZXh0OworCWlmICghcmVxLT5pc19nZXQpIHsKKwkJTE9HRVJSKCIlcyAtIHVuZXhwZWN0ZWQgY2FsbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlMT0dJTkYoInN0YXR1cz0lZCIsIHN0YXR1cyk7CisJKCpyZXEtPmdldC5jb250cm9sdm1fcmVzcG9uZF93aXRoX3BheWxvYWQpCisJICAgICgmcmVxLT5nZXQuY29udHJvbHZtX2hlYWRlciwKKwkgICAgIHJlcS0+ZmlsZV9yZXF1ZXN0X251bWJlciwKKwkgICAgIHJlcS0+ZGF0YV9zZXF1ZW5jZV9udW1iZXIrKywgc3RhdHVzLCBOVUxMLCAwLCAwLCBGQUxTRSk7CisJZnJlZV9yZXF1ZXN0KHJlcSwgX19GSUxFX18sIF9fTElORV9fKTsKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBzdXBwbGllcyBkYXRhIGZvciBhIFBVVEZJTEUgdHJhbnNmZXIuCisgKiBUaGUgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHRoZSBzcGFyZmlsZXhmZXIgZHJpdmVyLgorICovCitzdGF0aWMgaW50CitnZXRfcHV0ZmlsZV9kYXRhKHZvaWQgKmNvbnRleHQsIHZvaWQgKnBidWYsIHNpemVfdCBidWZzaXplLAorCQkgQk9PTCBidWZfaXNfdXNlcnNwYWNlLCBzaXplX3QgKmJ5dGVzX3RyYW5zZmVycmVkKQoreworCXN0cnVjdCBhbnlfcmVxdWVzdCAqcmVxID0gKHN0cnVjdCBhbnlfcmVxdWVzdCAqKSBjb250ZXh0OworCWlmIChyZXEtPmlzX2dldCkgeworCQlMT0dFUlIoIiVzIC0gdW5leHBlY3RlZCBjYWxsIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAoKnJlcS0+cHV0LmdldF9jb250cm9sdm1fZmlsZWRhdGEpICgmcmVxLT5jYWxsZXJfY29udGV4dF9kYXRhWzBdLAorCQkJCQkJICAgcGJ1ZiwgYnVmc2l6ZSwKKwkJCQkJCSAgIGJ1Zl9pc191c2Vyc3BhY2UsCisJCQkJCQkgICBieXRlc190cmFuc2ZlcnJlZCk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgYSBQVVRGSUxFIHRyYW5zZmVyLgorICogVGhlIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byB0aGUgc3BhcmZpbGV4ZmVyIGRyaXZlci4KKyAqLworc3RhdGljIHZvaWQKK2VuZF9wdXRmaWxlKHZvaWQgKmNvbnRleHQsIGludCBzdGF0dXMpCit7CisJc3RydWN0IGFueV9yZXF1ZXN0ICpyZXEgPSAoc3RydWN0IGFueV9yZXF1ZXN0ICopIGNvbnRleHQ7CisJaWYgKHJlcS0+aXNfZ2V0KSB7CisJCUxPR0VSUigiJXMgLSB1bmV4cGVjdGVkIGNhbGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJKCpyZXEtPnB1dC5jb250cm9sdm1fZW5kX3B1dEZpbGUpICgmcmVxLT5jYWxsZXJfY29udGV4dF9kYXRhWzBdLAorCQkJCQkgICBzdGF0dXMpOworCWZyZWVfcmVxdWVzdChyZXEsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Cit9CisKKy8qIFJlZmVyIHRvIGZpbGV4ZmVyLmggZm9yIGRlc2NyaXB0aW9uLiAqLworQk9PTAorZmlsZXhmZXJfZ2V0RmlsZShDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwKKwkJIHVsb25nMiBmaWxlX3JlcXVlc3RfbnVtYmVyLAorCQkgdWludCB1cGxpbmtfaW5kZXgsCisJCSB1aW50IGRpc2tfaW5kZXgsCisJCSBjaGFyICpmaWxlX25hbWUsCisJCSBHRVRfQ09OVElHVU9VU19DT05UUk9MVk1fUEFZTE9BRF9GVU5DCisJCSBnZXRfY29udGlndW91c19jb250cm9sdm1fcGF5bG9hZCwKKwkJIENPTlRST0xWTV9SRVNQT05EX1dJVEhfUEFZTE9BRF9GVU5DCisJCSBjb250cm9sdm1fcmVzcG9uZF93aXRoX3BheWxvYWQsCisJCSBUUkFOU01JVEZJTEVfRFVNUF9GVU5DIGR1bXBfZnVuYykKK3sKKwlCT09MIHVzZV9jb3VudF91cCA9IEZBTFNFOworCUJPT0wgZmFpbGVkID0gVFJVRTsKKwlzdHJ1Y3QgYW55X3JlcXVlc3QgKnJlcSA9IGFsbG9jX3JlcXVlc3QoX19GSUxFX18sIF9fTElORV9fKTsKKworCWlmICghcmVxKSB7CisJCUxPR0VSUigiYWxsb2NhdGlvbiBvZiBhbnlfcmVxdWVzdCBmYWlsZWQiKTsKKwkJZ290byBBd2F5OworCX0KKwkvKiBXZSBuZWVkIHRvIGluY3JlbWVudCB0aGlzIG1vZHVsZSdzIHVzZSBjb3VudCBiZWNhdXNlIHdlJ3JlIGhhbmRpbmcKKwkgKiBvZmYgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHdpdGhpbiB0aGlzIG1vZHVsZSB0byBiZSB1c2VkIGJ5CisJICogYW5vdGhlciBtb2R1bGUuCisJICovCisJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwl1c2VfY291bnRfdXAgPSBUUlVFOworCXJlcS0+aXNfZ2V0ID0gVFJVRTsKKwlyZXEtPmZpbGVfcmVxdWVzdF9udW1iZXIgPSBmaWxlX3JlcXVlc3RfbnVtYmVyOworCXJlcS0+ZGF0YV9zZXF1ZW5jZV9udW1iZXIgPSAwOworCXJlcS0+ZHVtcF9mdW5jID0gZHVtcF9mdW5jOworCXJlcS0+Z2V0LmNvbnRyb2x2bV9oZWFkZXIgPSAqbXNnSGRyOworCWF0b21pY19zZXQoJnJlcS0+Z2V0LmJ1ZmZlcnNfaW5fdXNlLCAwKTsKKwlyZXEtPmdldC5nZXRfY29udGlndW91c19jb250cm9sdm1fcGF5bG9hZCA9CisJICAgIGdldF9jb250aWd1b3VzX2NvbnRyb2x2bV9wYXlsb2FkOworCXJlcS0+Z2V0LmNvbnRyb2x2bV9yZXNwb25kX3dpdGhfcGF5bG9hZCA9CisJICAgIGNvbnRyb2x2bV9yZXNwb25kX3dpdGhfcGF5bG9hZDsKKwlpZiAoc3BhcmZpbGV4ZmVyX2xvY2FsMnJlbW90ZShyZXEsCS8qIGNvbnRleHQsIHBhc3NlZCB0bworCQkJCQkJICogY2FsbGJhY2sgZnVuY3MgKi8KKwkJCQkgICAgICBmaWxlX25hbWUsCisJCQkJICAgICAgZmlsZV9yZXF1ZXN0X251bWJlciwKKwkJCQkgICAgICB1cGxpbmtfaW5kZXgsCisJCQkJICAgICAgZGlza19pbmRleCwKKwkJCQkgICAgICBnZXRfZW1wdHlfYnVja2V0X2Zvcl9nZXRmaWxlX2RhdGEsCisJCQkJICAgICAgc2VuZF9mdWxsX2dldGZpbGVfZGF0YV9idWNrZXQsCisJCQkJICAgICAgc2VuZF9lbmRfb2ZfZ2V0ZmlsZV9kYXRhKSA8IDApIHsKKwkJTE9HRVJSKCJzcGFyZmlsZXhmZXJfbG9jYWwycmVtb3RlIGZhaWxlZCIpOworCQlnb3RvIEF3YXk7CisJfQorCWZhaWxlZCA9IEZBTFNFOworQXdheToKKwlpZiAoZmFpbGVkKSB7CisJCWlmICh1c2VfY291bnRfdXApIHsKKwkJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQkJdXNlX2NvdW50X3VwID0gRkFMU0U7CisJCX0KKwkJaWYgKHJlcSkgeworCQkJZnJlZV9yZXF1ZXN0KHJlcSwgX19GSUxFX18sIF9fTElORV9fKTsKKwkJCXJlcSA9IE5VTEw7CisJCX0KKwkJcmV0dXJuIEZBTFNFOworCX0gZWxzZSB7CisJCXJldHVybiBUUlVFOworCQkvKiBzdWNjZXNzOyBzZW5kIGNhbGxiYWNrcyB3aWxsIGJlIGNhbGxlZCBmb3IgcmVzcG9uc2VzICovCisJfQorfQorCisvKiBSZWZlciB0byBmaWxleGZlci5oIGZvciBkZXNjcmlwdGlvbi4gKi8KK3ZvaWQgKgorZmlsZXhmZXJfcHV0RmlsZShDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwKKwkJIHVsb25nMiBmaWxlX3JlcXVlc3RfbnVtYmVyLAorCQkgdWludCB1cGxpbmtfaW5kZXgsCisJCSB1aW50IGRpc2tfaW5kZXgsCisJCSBjaGFyICpmaWxlX25hbWUsCisJCSBUUkFOU01JVEZJTEVfSU5JVF9DT05URVhUX0ZVTkMgaW5pdF9jb250ZXh0LAorCQkgR0VUX0NPTlRST0xWTV9GSUxFREFUQV9GVU5DIGdldF9jb250cm9sdm1fZmlsZWRhdGEsCisJCSBDT05UUk9MVk1fUkVTUE9ORF9GVU5DIGNvbnRyb2x2bV9lbmRfcHV0RmlsZSwKKwkJIFRSQU5TTUlURklMRV9EVU1QX0ZVTkMgZHVtcF9mdW5jKQoreworCUJPT0wgdXNlX2NvdW50X3VwID0gRkFMU0U7CisJQk9PTCBmYWlsZWQgPSBUUlVFOworCXN0cnVjdCBhbnlfcmVxdWVzdCAqcmVxID0gYWxsb2NfcmVxdWVzdChfX0ZJTEVfXywgX19MSU5FX18pOworCXZvaWQgKmNhbGxlcl9jdHggPSBOVUxMOworCisJaWYgKCFyZXEpIHsKKwkJTE9HRVJSKCJhbGxvY2F0aW9uIG9mIGFueV9yZXF1ZXN0IGZhaWxlZCIpOworCQlnb3RvIEF3YXk7CisJfQorCWNhbGxlcl9jdHggPSAodm9pZCAqKSAoJihyZXEtPmNhbGxlcl9jb250ZXh0X2RhdGFbMF0pKTsKKwkvKiBXZSBuZWVkIHRvIGluY3JlbWVudCB0aGlzIG1vZHVsZSdzIHVzZSBjb3VudCBiZWNhdXNlIHdlJ3JlIGhhbmRpbmcKKwkgKiBvZmYgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHdpdGhpbiB0aGlzIG1vZHVsZSB0byBiZSB1c2VkIGJ5CisJICogYW5vdGhlciBtb2R1bGUuCisJICovCisJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwl1c2VfY291bnRfdXAgPSBUUlVFOworCXJlcS0+aXNfZ2V0ID0gRkFMU0U7CisJcmVxLT5maWxlX3JlcXVlc3RfbnVtYmVyID0gZmlsZV9yZXF1ZXN0X251bWJlcjsKKwlyZXEtPmRhdGFfc2VxdWVuY2VfbnVtYmVyID0gMDsKKwlyZXEtPmR1bXBfZnVuYyA9IGR1bXBfZnVuYzsKKwlyZXEtPnB1dC5nZXRfY29udHJvbHZtX2ZpbGVkYXRhID0gZ2V0X2NvbnRyb2x2bV9maWxlZGF0YTsKKwlyZXEtPnB1dC5jb250cm9sdm1fZW5kX3B1dEZpbGUgPSBjb250cm9sdm1fZW5kX3B1dEZpbGU7CisJKCppbml0X2NvbnRleHQpIChjYWxsZXJfY3R4LCBtc2dIZHIsIGZpbGVfcmVxdWVzdF9udW1iZXIpOworCWlmIChzcGFyZmlsZXhmZXJfcmVtb3RlMmxvY2FsKHJlcSwJLyogY29udGV4dCwgcGFzc2VkIHRvCisJCQkJCQkgKiBjYWxsYmFjayBmdW5jcyAqLworCQkJCSAgICAgIGZpbGVfbmFtZSwKKwkJCQkgICAgICBmaWxlX3JlcXVlc3RfbnVtYmVyLAorCQkJCSAgICAgIHVwbGlua19pbmRleCwKKwkJCQkgICAgICBkaXNrX2luZGV4LAorCQkJCSAgICAgIGdldF9wdXRmaWxlX2RhdGEsIGVuZF9wdXRmaWxlKSA8IDApIHsKKwkJTE9HRVJSKCJzcGFyZmlsZXhmZXJfcmVtb3RlMmxvY2FsIGZhaWxlZCIpOworCQlnb3RvIEF3YXk7CisJfQorCWZhaWxlZCA9IEZBTFNFOworQXdheToKKwlpZiAoZmFpbGVkKSB7CisJCWlmICh1c2VfY291bnRfdXApIHsKKwkJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQkJdXNlX2NvdW50X3VwID0gRkFMU0U7CisJCX0KKwkJaWYgKHJlcSkgeworCQkJZnJlZV9yZXF1ZXN0KHJlcSwgX19GSUxFX18sIF9fTElORV9fKTsKKwkJCXJlcSA9IE5VTEw7CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGNhbGxlcl9jdHg7CisJCS8qIHN1Y2Nlc3M7IGNhbGxiYWNrcyB3aWxsIGJlIGNhbGxlZCBmb3IgcmVzcG9uc2VzICovCisJfQorfQorCitzdGF0aWMgdm9pZAorZHVtcF9nZXRfcmVxdWVzdChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHN0cnVjdCBnZXRmaWxlX3JlcXVlc3QgKmdldHJlcSkKK3sKKwlzZXFfcHJpbnRmKGYsICIgIGJ1ZmZlcnNfaW5fdXNlPSVkXG4iLAorCQkgICBhdG9taWNfcmVhZCgmZ2V0cmVxLT5idWZmZXJzX2luX3VzZSkpOworfQorCitzdGF0aWMgdm9pZAorZHVtcF9wdXRfcmVxdWVzdChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHN0cnVjdCBwdXRmaWxlX3JlcXVlc3QgKnB1dHJlcSkKK3sKK30KKworc3RhdGljIHZvaWQKK2R1bXBfcmVxdWVzdChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHN0cnVjdCBhbnlfcmVxdWVzdCAqcmVxKQoreworCXNlcV9wcmludGYoZiwgIiogJXMgaWQ9JWxsdSBzZXE9JWxsdVxuIiwKKwkJICAgKChyZXEtPmlzX2dldCkgPyAiR2V0IiA6ICJQdXQiKSwKKwkJICAgcmVxLT5maWxlX3JlcXVlc3RfbnVtYmVyLCByZXEtPmRhdGFfc2VxdWVuY2VfbnVtYmVyKTsKKwlpZiAocmVxLT5pc19nZXQpCisJCWR1bXBfZ2V0X3JlcXVlc3QoZiwgJnJlcS0+Z2V0KTsKKwllbHNlCisJCWR1bXBfcHV0X3JlcXVlc3QoZiwgJnJlcS0+cHV0KTsKKwlpZiAocmVxLT5kdW1wX2Z1bmMpCisJCSgqcmVxLT5kdW1wX2Z1bmMpIChmLCAmKHJlcS0+Y2FsbGVyX2NvbnRleHRfZGF0YVswXSksICIgICIpOworfQorCit2b2lkCitmaWxleGZlcl9kdW1wKHN0cnVjdCBzZXFfZmlsZSAqZikKK3sKKwl1bG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKworCXNlcV9wdXRzKGYsICJPdXRzdGFuZGluZyBUUkFOU01JVF9GSUxFIHJlcXVlc3RzOlxuIik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJlJlcXVlc3RfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJlJlcXVlc3RfbGlzdCkgeworCQlzdHJ1Y3QgYW55X3JlcXVlc3QgKnJlcTsKKwkJcmVxID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGFueV9yZXF1ZXN0LCByZXFfbGlzdCk7CisJCWR1bXBfcmVxdWVzdChmLCByZXEpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZSZXF1ZXN0X2xpc3RfbG9jaywgZmxhZ3MpOworfQorCisjZWxzZQkJCQkvKiBpZmRlZiBFTkFCTEVfU1BBUkZJTEVYRkVSICovCitpbnQKK2ZpbGV4ZmVyX2NvbnN0cnVjdG9yKHNpemVfdCByZXFfY29udGV4dF9ieXRlcykKK3sKKwlyZXR1cm4gMDsJCS8qIHN1Y2Nlc3MgKi8KK30KKwordm9pZAorZmlsZXhmZXJfZGVzdHJ1Y3Rvcih2b2lkKQoreworfQorCitCT09MCitmaWxleGZlcl9nZXRGaWxlKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyLAorCQkgdTY0IGZpbGVfcmVxdWVzdF9udW1iZXIsCisJCSB1aW50IHVwbGlua19pbmRleCwKKwkJIHVpbnQgZGlza19pbmRleCwKKwkJIGNoYXIgKmZpbGVfbmFtZSwKKwkJIEdFVF9DT05USUdVT1VTX0NPTlRST0xWTV9QQVlMT0FEX0ZVTkMKKwkJIGdldF9jb250aWd1b3VzX2NvbnRyb2x2bV9wYXlsb2FkLAorCQkgQ09OVFJPTFZNX1JFU1BPTkRfV0lUSF9QQVlMT0FEX0ZVTkMKKwkJIGNvbnRyb2x2bV9yZXNwb25kX3dpdGhfcGF5bG9hZCwKKwkJIFRSQU5TTUlURklMRV9EVU1QX0ZVTkMgZHVtcF9mdW5jKQoreworCS8qIHNpbmNlIG5vIHNwYXJmaWxleGZlciBtb2R1bGUgZXhpc3RzIHRvIGNhbGwsIHdlIGp1c3QgZmFpbCAqLworCXJldHVybiBGQUxTRTsKK30KKwordm9pZCAqCitmaWxleGZlcl9wdXRGaWxlKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyLAorCQkgdTY0IGZpbGVfcmVxdWVzdF9udW1iZXIsCisJCSB1aW50IHVwbGlua19pbmRleCwKKwkJIHVpbnQgZGlza19pbmRleCwKKwkJIGNoYXIgKmZpbGVfbmFtZSwKKwkJIFRSQU5TTUlURklMRV9JTklUX0NPTlRFWFRfRlVOQyBpbml0X2NvbnRleHQsCisJCSBHRVRfQ09OVFJPTFZNX0ZJTEVEQVRBX0ZVTkMgZ2V0X2NvbnRyb2x2bV9maWxlZGF0YSwKKwkJIENPTlRST0xWTV9SRVNQT05EX0ZVTkMgY29udHJvbHZtX2VuZF9wdXRGaWxlLAorCQkgVFJBTlNNSVRGSUxFX0RVTVBfRlVOQyBkdW1wX2Z1bmMpCit7CisJLyogc2luY2Ugbm8gc3BhcmZpbGV4ZmVyIG1vZHVsZSBleGlzdHMgdG8gY2FsbCwgd2UganVzdCBmYWlsICovCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK2ZpbGV4ZmVyX2R1bXAoc3RydWN0IHNlcV9maWxlICpmKQoreworfQorCisjZW5kaWYJCQkJLyogaWZkZWYgRU5BQkxFX1NQQVJGSUxFWEZFUiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZXhmZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGV4ZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiZmNhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGV4ZmVyLmgKQEAgLTAsMCArMSwxNDcgQEAKKy8qIGZpbGV4ZmVyLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEzIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHRoYXQgZmlsZXhmZXIuYyBwcm92aWRlcyB0byBvdGhlcgorICogY29kZSBpbiB0aGUgdmlzb3JjaGlwc2V0IGRyaXZlci4KKyAqLworCisjaWZuZGVmIF9fRklMRVhGRVJfSF9fCisjZGVmaW5lIF9fRklMRVhGRVJfSF9fCisKKyNpbmNsdWRlICJnbG9iYWxzLmgiCisjaW5jbHVkZSAiY29udHJvbHZtY2hhbm5lbC5oIgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKK3R5cGVkZWYgdm9pZCAqKCpHRVRfQ09OVElHVU9VU19DT05UUk9MVk1fUEFZTE9BRF9GVU5DKSAodWxvbmcgbWluX3NpemUsCisJCQkJCQkJdWxvbmcgbWF4X3NpemUsCisJCQkJCQkJdWxvbmcgKmFjdHVhbF9zaXplKTsKKwordHlwZWRlZiBCT09MCisoKkNPTlRST0xWTV9SRVNQT05EX1dJVEhfUEFZTE9BRF9GVU5DKSAoQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSICptc2dIZHIsCisJCQkJCXU2NCBmaWxlUmVxdWVzdE51bWJlciwKKwkJCQkJdTY0IGRhdGFTZXF1ZW5jZU51bWJlciwKKwkJCQkJaW50IHJlc3BvbnNlLAorCQkJCQl2b2lkICpidWNrZXQsIHVsb25nIHBheWxvYWRDaHVua1NpemUsCisJCQkJCXVsb25nIHBheWxvYWRVc2VkQnl0ZXMsIEJPT0wgcGFydGlhbCk7CisKK3R5cGVkZWYgdm9pZAorKCpUUkFOU01JVEZJTEVfSU5JVF9DT05URVhUX0ZVTkMpKHZvaWQgKmN0eCwKKwkJCQkgIGNvbnN0IENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqaGRyLAorCQkJCSAgdTY0IGZpbGVfcmVxdWVzdF9udW1iZXIpOwordHlwZWRlZiB2b2lkICgqVFJBTlNNSVRGSUxFX0RVTVBfRlVOQykgKHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqY3R4LAorCQkJCQljb25zdCBjaGFyICpwZngpOwordHlwZWRlZiBpbnQgKCpHRVRfQ09OVFJPTFZNX0ZJTEVEQVRBX0ZVTkMpICh2b2lkICpjdHgsCisJCQkJCSAgICB2b2lkICpidWYsIHNpemVfdCBidWZzaXplLAorCQkJCQkgICAgQk9PTCBidWZfaXNfdXNlcnNwYWNlLAorCQkJCQkgICAgc2l6ZV90ICpieXRlc190cmFuc2ZlcnJlZCk7Cit0eXBlZGVmIHZvaWQgKCpDT05UUk9MVk1fUkVTUE9ORF9GVU5DKSAodm9pZCAqY3R4LCBpbnQgcmVzcG9uc2UpOworCisvKiBDYWxsIG9uY2UgdG8gaW5pdGlhbGl6ZSBmaWxleGZlci5vLgorICogcmVxX2NvbnRleHRfYnl0ZXMgbnVtYmVyIG9mIGJ5dGVzIHRoZSBjYWxsZXIgbmVlZHMgdG8ga2VlcCB0cmFjayBvZiBlYWNoIGZpbGUKKyAqIHRyYW5zZmVyIGNvbnZlcnNhdGlvbi4gIFRoZSA8Y3R4X2luaXRfdmFsdWU+IHBhc3NlZCB0byBmaWxleGZlcl9wdXRGaWxlKCkgaXMKKyAqIGFzc3VtZWQgdG8gYmUgdGhpcyBtYW55IGJ5dGVzIGluIHNpemUuICBDb2RlIHdpdGhpbiBmaWxleGZlci5vIHdpbGwgY29weSB0aGlzCisgKiBpbnRvIGEgZHluYW1pY2FsbHktYWxsb2NhdGVkIGFyZWEsIGFuZCBwYXNzIGJhY2sgYSBwb2ludGVyIHRvIHRoYXQgYXJlYSBpbgorICogY2FsbGJhY2sgZnVuY3Rpb25zLgorICovCitpbnQgZmlsZXhmZXJfY29uc3RydWN0b3Ioc2l6ZV90IHJlcV9jb250ZXh0X2J5dGVzKTsKKworLyogQ2FsbCBvbmNlIHRvIGNsZWFuIHVwIGZpbGV4ZmVyLm8gKi8KK3ZvaWQgZmlsZXhmZXJfZGVzdHJ1Y3Rvcih2b2lkKTsKKworLyogQ2FsbCB0aGlzIHRvIGR1bXAgZGlhZ25vc3RpYyBpbmZvIGFib3V0IGFsbCBvdXRzdGFuZGluZyBnZXRGaWxlcy9wdXRGaWxlcyAqLwordm9pZCBmaWxleGZlcl9kdW1wKHN0cnVjdCBzZXFfZmlsZSAqZik7CisKKy8qIENhbGwgdG8gdHJhbnNmZXIgYSBmaWxlIGZyb20gdGhlIGxvY2FsIGZpbGVzeXN0ZW0gKGkuZS4sIGZyb20gdGhlIGVudmlyb25tZW50CisgKiB3aGVyZSB0aGlzIGRyaXZlciBpcyBydW5uaW5nKSBhY3Jvc3MgdGhlIGNvbnRyb2x2bSBjaGFubmVsIHRvIGEgcmVtb3RlCisgKiBlbnZpcm9ubWVudC4gIDEgb3IgbW9yZSBjb250cm9sdm0gcmVzcG9uc2VzIHdpbGwgYmUgc2VudCBhcyBhIHJlc3VsdCwgZWFjaAorICogb2Ygd2hpY2ggd2hvc2UgcGF5bG9hZCBjb250YWlucyBmaWxlIGRhdGEuICBPbmx5IHRoZSBsYXN0IGNvbnRyb2x2bSBtZXNzYWdlCisgKiB3aWxsIGhhdmUgRmxhZ3MucGFydGlhbENvbXBsZXRpb249PTAuCisgKgorICogICBtc2dIZHIgICAgICB0aGUgY29udHJvbHZtIG1lc3NhZ2UgaGVhZGVyIG9mIHRoZSBHRVRGSUxFIHJlcXVlc3Qgd2hpY2gKKyAqICAgICAgICAgICAgICAgd2UganVzdCByZWNlaXZlZAorICogICBmaWxlX3JlcXVlc3RfbnVtYmVyICB0aGlzIGlzIGFsbCBkYXRhIGZyb20gdGhlIEdFVEZJTEUgcmVxdWVzdCB0aGF0CisgKiAgIHVwbGlua19pbmRleCAgICAgICAgIGRlZmluZSB3aGljaCBmaWxlIGlzIHRvIGJlIHRyYW5zZmVycmVkCisgKiAgIGRpc2tfaW5kZXgKKyAqICAgZmlsZV9uYW1lCisgKiAgIGdldF9jb250aWd1b3VzX2NvbnRyb2x2bV9wYXlsb2FkICBmdW5jdGlvbiB0byBjYWxsIHdoZW4gc3BhY2UgaXMgbmVlZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcGF5bG9hZCBhcmVhCisgKiAgIGNvbnRyb2x2bV9yZXNwb25kX3dpdGhfcGF5bG9hZCAgICBmdW5jdGlvbiB0byBjYWxsIHRvIHNlbmQgZWFjaCBjb250cm9sdm0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlIGNvbnRhaW5pbmcgZmlsZSBkYXRhIGFzIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDsgcmV0dXJucyBGQUxTRSBvbmx5IGlmIHRoZQorICoJCQkJICAgICAgIHBheWxvYWQgYnVmZmVyIHdhcyBmcmVlZCBpbmxpbmUKKyAqICAgZHVtcF9mdW5jICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRvIGR1bXAgY29udGV4dCBkYXRhIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodW1hbi1yZWFkYWJsZSBmb3JtYXQKKyAqCisgKiAgUmV0dXJucyBUUlVFIGlmZiB0aGUgZmlsZSB0cmFuc2ZlciByZXF1ZXN0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBpbml0aWF0ZWQsCisgKiAgb3IgRkFMU0UgdG8gaW5kaWNhdGUgZmFpbHVyZS4KKyAqLworQk9PTAorZmlsZXhmZXJfZ2V0RmlsZShDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwKKwkJIHU2NCBmaWxlX3JlcXVlc3RfbnVtYmVyLAorCQkgdWludCB1cGxpbmtfaW5kZXgsCisJCSB1aW50IGRpc2tfaW5kZXgsCisJCSBjaGFyICpmaWxlX25hbWUsCisJCSBHRVRfQ09OVElHVU9VU19DT05UUk9MVk1fUEFZTE9BRF9GVU5DCisJCSBnZXRfY29udGlndW91c19jb250cm9sdm1fcGF5bG9hZCwKKwkJIENPTlRST0xWTV9SRVNQT05EX1dJVEhfUEFZTE9BRF9GVU5DCisJCSBjb250cm9sdm1fcmVzcG9uZF93aXRoX3BheWxvYWQsCisJCSBUUkFOU01JVEZJTEVfRFVNUF9GVU5DIGR1bXBfZnVuYyk7CisKKy8qIENhbGwgdG8gY3JlYXRlIGEgZmlsZSBpbiB0aGUgbG9jYWwgZmlsZXN5c3RlbSAoaS5lLiwgaW4gdGhlIGVudmlyb25tZW50CisgKiB3aGVyZSB0aGlzIGRyaXZlciBpcyBydW5uaW5nKSBmcm9tIGRhdGEgcmVjZWl2ZWQgYXMgcGF5bG9hZCBpbgorICogY29udHJvbHZtIGNoYW5uZWwgbWVzc2FnZXMgZnJvbSBhIHJlbW90ZSBlbnZpcm9ubWVudC4gIDEgb3IgbW9yZSBjb250cm9sdm0KKyAqIG1lc3NhZ2VzIHdpbGwgYmUgcmVjZWl2ZWQgZm9yIHRoaXMgdHJhbnNmZXIsIGFuZCBvbmx5IHRoZSBsYXN0IHdpbGwgaGF2ZQorICogRmxhZ3MucGFydGlhbENvbXBsZXRpb249PTAuCisgKgorICogICBtc2dIZHIgICAgICB0aGUgY29udHJvbHZtIG1lc3NhZ2UgaGVhZGVyIG9mIHRoZSBQVVRGSUxFIHJlcXVlc3Qgd2hpY2gKKyAqICAgICAgICAgICAgICAgd2UganVzdCByZWNlaXZlZAorICogICBmaWxlX3JlcXVlc3RfbnVtYmVyICB0aGlzIGlzIGFsbCBkYXRhIGZyb20gdGhlIFBVVEZJTEUgcmVxdWVzdCB0aGF0CisgKiAgIHVwbGlua19pbmRleCAgICAgICAgIGRlZmluZSB3aGljaCBmaWxlIGlzIHRvIGJlIGNyZWF0ZWQgaW4gdGhlIGxvY2FsCisgKiAgIGRpc2tfaW5kZXggICAgICAgICAgIGZpbGVzeXN0ZW0KKyAqICAgZmlsZV9uYW1lCisgKiAgIGluaXRfY29udGV4dCAgICAgICAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gaW5pdGlhbGl6ZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgPHJlcV9jb250ZXh0X2J5dGVzPi1zaXplZCBzdG9yYWdlIGFyZWEgcmV0dXJuZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmdW5jOyBub3RlIHRoYXQgaXQgd291bGQgTk9UIGJlIHN1ZmZpY2llbnQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3cgdGhlIGNhbGxlciB0byBpbml0aWFsaXplIHRoaXMgdXBvbiByZXR1cm4sIGFzCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0aGUgb3RoZXIgdXNlci1zdXBwbGllZCBjYWxsYmFja3MgbWlnaHQgaGF2ZQorICogICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gY2FsbGVkIGJ5IHRoZW4KKyAqICAgZ2V0X2NvbnRyb2x2bV9maWxlZGF0YSAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gb2J0YWluIG1vcmUgZGF0YSBmb3IgdGhlIGZpbGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHdyaXR0ZW47IHJlZmVyIHRvIGdldF9jb250cm9sdm1fZmlsZWRhdGEoKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdmlzb3JjaGlwc2V0X21haW4uYyBmb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgcGFyYW1ldGVycworICogICBjb250cm9sdm1fZW5kX3B1dEZpbGUgICAgZnVuY3Rpb24gdG8gY2FsbCB0byBpbmRpY2F0ZSB0aGF0IGNyZWF0aW9uIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwgZmlsZSBoYXMgY29tcGxldGVkOyAgc2V0IDxyZXNwb25zZT4gdG8gYQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmUgdmFsdWUgdG8gaW5kaWNhdGUgYW4gZXJyb3IKKyAqICAgZHVtcF9mdW5jICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRvIGR1bXAgY29udGV4dCBkYXRhIGluIGh1bWFuLXJlYWRhYmxlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQKKyAqCisgKiAgUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBkeW5hbWljYWxseS1hbGxvY2F0ZWQgc3RvcmFnZSBhcmVhIG9mIHNpemUKKyAqICA8cmVxX2NvbnRleHRfYnl0ZXM+IHdoaWNoIHRoZSBjYWxsZXIgY2FuIHVzZSwgb3IgTlVMTCBmb3IgZXJyb3IuICBUaGUKKyAqICBjYWxsZXIgc2hvdWxkIE5FVkVSIGZyZWUgdGhlIHJldHVybmVkIHBvaW50ZXIsIGJ1dCBzaG91bGQgZXhwZWN0IHRvIHJlY2VpdmUKKyAqICBpdCBhcyB0aGUgPGN0eD4gYXJndW1lbnQgd2hlbiBjYWxsYmFjayBmdW5jdGlvbnMgYXJlIGNhbGxlZC4KKyAqLwordm9pZCAqZmlsZXhmZXJfcHV0RmlsZShDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwKKwkJICAgICAgIHU2NCBmaWxlX3JlcXVlc3RfbnVtYmVyLAorCQkgICAgICAgdWludCB1cGxpbmtfaW5kZXgsCisJCSAgICAgICB1aW50IGRpc2tfaW5kZXgsCisJCSAgICAgICBjaGFyICpmaWxlX25hbWUsCisJCSAgICAgICBUUkFOU01JVEZJTEVfSU5JVF9DT05URVhUX0ZVTkMgaW5pdF9jb250ZXh0LAorCQkgICAgICAgR0VUX0NPTlRST0xWTV9GSUxFREFUQV9GVU5DIGdldF9jb250cm9sdm1fZmlsZWRhdGEsCisJCSAgICAgICBDT05UUk9MVk1fUkVTUE9ORF9GVU5DIGNvbnRyb2x2bV9lbmRfcHV0RmlsZSwKKwkJICAgICAgIFRSQU5TTUlURklMRV9EVU1QX0ZVTkMgZHVtcF9mdW5jKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9nbG9iYWxzLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9nbG9iYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlNmQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2dsb2JhbHMuaApAQCAtMCwwICsxLDQ1IEBACisvKiBnbG9iYWxzLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKworI2lmbmRlZiBfX1ZJU09SQ0hJUFNFVF9HTE9CQUxTX0hfXworI2RlZmluZSBfX1ZJU09SQ0hJUFNFVF9HTE9CQUxTX0hfXworCisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgImRpYWdub3N0aWNzL2FwcG9zX3N1YnN5c3RlbXMuaCIKKyNpbmNsdWRlICJ0aW1za21vZC5oIgorI2luY2x1ZGUgInZpc29yY2hpcHNldC5oIgorI2luY2x1ZGUgInZpc29yY2hpcHNldF91bW9kZS5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworI2RlZmluZSBNWURSVk5BTUUgInZpc29yY2hpcHNldCIKKworCisvKiBtb2R1bGUgcGFyYW1ldGVycyAqLworCitleHRlcm4gaW50IHZpc29yY2hpcHNldF90ZXN0dm5pYzsKK2V4dGVybiBpbnQgdmlzb3JjaGlwc2V0X3Rlc3R2bmljY2xpZW50OworZXh0ZXJuIGludCB2aXNvcmNoaXBzZXRfdGVzdG1zZzsKK2V4dGVybiBpbnQgdmlzb3JjaGlwc2V0X21ham9yOworZXh0ZXJuIGludCB2aXNvcmNoaXBzZXRfc2VydmVycmVnd2FpdDsKK2V4dGVybiBpbnQgdmlzb3JjaGlwc2V0X2NsaWVudHJlZ3dhaXQ7CitleHRlcm4gaW50IHZpc29yY2hpcHNldF90ZXN0dGVhcmRvd247CitleHRlcm4gaW50IHZpc29yY2hpcHNldF9kaXNhYmxlX2NvbnRyb2x2bTsKK2V4dGVybiBpbnQgdmlzb3JjaGlwc2V0X2NyYXNoX2tlcm5lbDsKK2V4dGVybiBpbnQgdmlzb3JjaGlwc2V0X2hvbGRjaGlwc2V0cmVhZHk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvcGFyc2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDA4ZDQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvcGFyc2VyLmMKQEAgLTAsMCArMSw0NzQgQEAKKy8qIHBhcnNlci5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSAicGFyc2VyLmgiCisjaW5jbHVkZSAibWVtcmVnaW9uLmgiCisjaW5jbHVkZSAiY29udHJvbHZtY2hhbm5lbC5oIgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2RlZmluZSBNWURSVk5BTUUgInZpc29yY2hpcHNldF9wYXJzZXIiCisjZGVmaW5lIENVUlJFTlRfRklMRV9QQyBWSVNPUl9DSElQU0VUX1BDX3BhcnNlcl9jCisKKy8qIFdlIHdpbGwgcmVmdXNlIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiB0aGlzIG1hbnkgYnl0ZXMgdG8gY29weSBkYXRhIGZyb20KKyAqIGluY29taW5nIHBheWxvYWRzLiAgVGhpcyBzZXJ2ZXMgYXMgYSB0aHJvdHRsaW5nIG1lY2hhbmlzbS4KKyAqLworI2RlZmluZSBNQVhfQ09OVFJPTFZNX1BBWUxPQURfQllURVMgKDEwMjQqMTI4KQorc3RhdGljIHVsb25nIENvbnRyb2x2bV9QYXlsb2FkX0J5dGVzX0J1ZmZlcmVkOworCitzdHJ1Y3QgUEFSU0VSX0NPTlRFWFRfVGFnIHsKKwl1bG9uZyBhbGxvY2J5dGVzOworCXVsb25nIHBhcmFtX2J5dGVzOworCXU4ICpjdXJyOworCXVsb25nIGJ5dGVzX3JlbWFpbmluZzsKKwlCT09MIGJ5dGVfc3RyZWFtOworCWNoYXIgZGF0YVswXTsKK307CisKK3N0YXRpYyBQQVJTRVJfQ09OVEVYVCAqCitwYXJzZXJfaW5pdF9ndXRzKFU2NCBhZGRyLCBVMzIgYnl0ZXMsIEJPT0wgaXNMb2NhbCwKKwkJIEJPT0wgaGFzU3RhbmRhcmRQYXlsb2FkSGVhZGVyLCBCT09MICp0cnlBZ2FpbikKK3sKKwlpbnQgYWxsb2NieXRlcyA9IHNpemVvZihQQVJTRVJfQ09OVEVYVCkgKyBieXRlczsKKwlQQVJTRVJfQ09OVEVYVCAqcmMgPSBOVUxMOworCVBBUlNFUl9DT05URVhUICpjdHggPSBOVUxMOworCU1FTVJFR0lPTiAqcmduID0gTlVMTDsKKwlVTFRSQV9DT05UUk9MVk1fUEFSQU1FVEVSU19IRUFERVIgKnBoZHIgPSBOVUxMOworCisJaWYgKHRyeUFnYWluKQorCQkqdHJ5QWdhaW4gPSBGQUxTRTsKKwlpZiAoIWhhc1N0YW5kYXJkUGF5bG9hZEhlYWRlcikKKwkJLyogYWxsb2MgYW5kIDAgZXh0cmEgYnl0ZSB0byBlbnN1cmUgcGF5bG9hZCBpcworCQkgKiAnXDAnLXRlcm1pbmF0ZWQKKwkJICovCisJCWFsbG9jYnl0ZXMrKzsKKwlpZiAoKENvbnRyb2x2bV9QYXlsb2FkX0J5dGVzX0J1ZmZlcmVkICsgYnl0ZXMpCisJICAgID4gTUFYX0NPTlRST0xWTV9QQVlMT0FEX0JZVEVTKSB7CisJCUVSUkRSVigiJXMgKCVzOiVkKSAtIHByZXZlbnRlZCBhbGxvY2F0aW9uIG9mICVkIGJ5dGVzIHRvIHByZXZlbnQgZXhjZWVkaW5nIHRocm90dGxpbmcgbWF4ICglZCkiLAorCQkgICAgICAgX19mdW5jX18sIF9fRklMRV9fLCBfX0xJTkVfXywgYWxsb2NieXRlcywKKwkJICAgICAgIE1BWF9DT05UUk9MVk1fUEFZTE9BRF9CWVRFUyk7CisJCWlmICh0cnlBZ2FpbikKKwkJCSp0cnlBZ2FpbiA9IFRSVUU7CisJCXJjID0gTlVMTDsKKwkJZ290byBBd2F5OworCX0KKwljdHggPSBremFsbG9jKGFsbG9jYnl0ZXMsIEdGUF9LRVJORUx8X19HRlBfTk9SRVRSWSk7CisJaWYgKGN0eCA9PSBOVUxMKSB7CisJCUVSUkRSVigiJXMgKCVzOiVkKSAtIGZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyIsCisJCSAgICAgICBfX2Z1bmNfXywgX19GSUxFX18sIF9fTElORV9fLCBhbGxvY2J5dGVzKTsKKwkJaWYgKHRyeUFnYWluKQorCQkJKnRyeUFnYWluID0gVFJVRTsKKwkJcmMgPSBOVUxMOworCQlnb3RvIEF3YXk7CisJfQorCisJY3R4LT5hbGxvY2J5dGVzID0gYWxsb2NieXRlczsKKwljdHgtPnBhcmFtX2J5dGVzID0gYnl0ZXM7CisJY3R4LT5jdXJyID0gTlVMTDsKKwljdHgtPmJ5dGVzX3JlbWFpbmluZyA9IDA7CisJY3R4LT5ieXRlX3N0cmVhbSA9IEZBTFNFOworCWlmIChpc0xvY2FsKSB7CisJCXZvaWQgKnA7CisJCWlmIChhZGRyID4gdmlydF90b19waHlzKGhpZ2hfbWVtb3J5IC0gMSkpIHsKKwkJCUVSUkRSVigiJXMgLSBiYWQgbG9jYWwgYWRkcmVzcyAoMHglLTE2LjE2THggZm9yICVsdSkiLAorCQkJICAgICAgIF9fZnVuY19fLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGFkZHIsICh1bG9uZykgYnl0ZXMpOworCQkJcmMgPSBOVUxMOworCQkJZ290byBBd2F5OworCQl9CisJCXAgPSBfX3ZhKCh1bG9uZykgKGFkZHIpKTsKKwkJbWVtY3B5KGN0eC0+ZGF0YSwgcCwgYnl0ZXMpOworCX0gZWxzZSB7CisJCXJnbiA9IHZpc29yX21lbXJlZ2lvbl9jcmVhdGUoYWRkciwgYnl0ZXMpOworCQlpZiAoIXJnbikgeworCQkJcmMgPSBOVUxMOworCQkJZ290byBBd2F5OworCQl9CisJCWlmICh2aXNvcl9tZW1yZWdpb25fcmVhZChyZ24sIDAsIGN0eC0+ZGF0YSwgYnl0ZXMpIDwgMCkgeworCQkJcmMgPSBOVUxMOworCQkJZ290byBBd2F5OworCQl9CisJfQorCWlmICghaGFzU3RhbmRhcmRQYXlsb2FkSGVhZGVyKSB7CisJCWN0eC0+Ynl0ZV9zdHJlYW0gPSBUUlVFOworCQlyYyA9IGN0eDsKKwkJZ290byBBd2F5OworCX0KKwlwaGRyID0gKFVMVFJBX0NPTlRST0xWTV9QQVJBTUVURVJTX0hFQURFUiAqKSAoY3R4LT5kYXRhKTsKKwlpZiAocGhkci0+VG90YWxMZW5ndGggIT0gYnl0ZXMpIHsKKwkJRVJSRFJWKCIlcyAtIGJhZCB0b3RhbCBsZW5ndGggJWx1IChzaG91bGQgYmUgJWx1KSIsCisJCSAgICAgICBfX2Z1bmNfXywKKwkJICAgICAgICh1bG9uZykgKHBoZHItPlRvdGFsTGVuZ3RoKSwgKHVsb25nKSAoYnl0ZXMpKTsKKwkJcmMgPSBOVUxMOworCQlnb3RvIEF3YXk7CisJfQorCWlmIChwaGRyLT5Ub3RhbExlbmd0aCA8IHBoZHItPkhlYWRlckxlbmd0aCkgeworCQlFUlJEUlYoIiVzIC0gdG90YWwgbGVuZ3RoIDwgaGVhZGVyIGxlbmd0aCAoJWx1IDwgJWx1KSIsCisJCSAgICAgICBfX2Z1bmNfXywKKwkJICAgICAgICh1bG9uZykgKHBoZHItPlRvdGFsTGVuZ3RoKSwKKwkJICAgICAgICh1bG9uZykgKHBoZHItPkhlYWRlckxlbmd0aCkpOworCQlyYyA9IE5VTEw7CisJCWdvdG8gQXdheTsKKwl9CisJaWYgKHBoZHItPkhlYWRlckxlbmd0aCA8IHNpemVvZihVTFRSQV9DT05UUk9MVk1fUEFSQU1FVEVSU19IRUFERVIpKSB7CisJCUVSUkRSVigiJXMgLSBoZWFkZXIgaXMgdG9vIHNtYWxsICglbHUgPCAlbHUpIiwKKwkJICAgICAgIF9fZnVuY19fLAorCQkgICAgICAgKHVsb25nKSAocGhkci0+SGVhZGVyTGVuZ3RoKSwKKwkJICAgICAgICh1bG9uZykgKHNpemVvZihVTFRSQV9DT05UUk9MVk1fUEFSQU1FVEVSU19IRUFERVIpKSk7CisJCXJjID0gTlVMTDsKKwkJZ290byBBd2F5OworCX0KKworCXJjID0gY3R4OworQXdheToKKwlpZiAocmduKSB7CisJCXZpc29yX21lbXJlZ2lvbl9kZXN0cm95KHJnbik7CisJCXJnbiA9IE5VTEw7CisJfQorCWlmIChyYykKKwkJQ29udHJvbHZtX1BheWxvYWRfQnl0ZXNfQnVmZmVyZWQgKz0gY3R4LT5wYXJhbV9ieXRlczsKKwllbHNlIHsKKwkJaWYgKGN0eCkgeworCQkJcGFyc2VyX2RvbmUoY3R4KTsKKwkJCWN0eCA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCitQQVJTRVJfQ09OVEVYVCAqCitwYXJzZXJfaW5pdChVNjQgYWRkciwgVTMyIGJ5dGVzLCBCT09MIGlzTG9jYWwsIEJPT0wgKnRyeUFnYWluKQoreworCXJldHVybiBwYXJzZXJfaW5pdF9ndXRzKGFkZHIsIGJ5dGVzLCBpc0xvY2FsLCBUUlVFLCB0cnlBZ2Fpbik7Cit9CisKKy8qIENhbGwgdGhpcyBpbnN0ZWFkIG9mIHBhcnNlcl9pbml0KCkgaWYgdGhlIHBheWxvYWQgYXJlYSBjb25zaXN0cyBvZiBqdXN0CisgKiBhIHNlcXVlbmNlIG9mIGJ5dGVzLCByYXRoZXIgdGhhbiBhIFVMVFJBX0NPTlRST0xWTV9QQVJBTUVURVJTX0hFQURFUgorICogc3RydWN0dXJlcy4gIEFmdGVyd2FyZHMsIHlvdSBjYW4gY2FsbCBwYXJzZXJfc2ltcGxlU3RyaW5nX2dldCgpIG9yCisgKiBwYXJzZXJfYnl0ZVN0cmVhbV9nZXQoKSB0byBvYnRhaW4gdGhlIGRhdGEuCisgKi8KK1BBUlNFUl9DT05URVhUICoKK3BhcnNlcl9pbml0X2J5dGVTdHJlYW0oVTY0IGFkZHIsIFUzMiBieXRlcywgQk9PTCBpc0xvY2FsLCBCT09MICp0cnlBZ2FpbikKK3sKKwlyZXR1cm4gcGFyc2VyX2luaXRfZ3V0cyhhZGRyLCBieXRlcywgaXNMb2NhbCwgRkFMU0UsIHRyeUFnYWluKTsKK30KKworLyogT2J0YWluICdcMCctdGVybWluYXRlZCBjb3B5IG9mIHN0cmluZyBpbiBwYXlsb2FkIGFyZWEuCisgKi8KK2NoYXIgKgorcGFyc2VyX3NpbXBsZVN0cmluZ19nZXQoUEFSU0VSX0NPTlRFWFQgKmN0eCkKK3sKKwlpZiAoIWN0eC0+Ynl0ZV9zdHJlYW0pCisJCXJldHVybiBOVUxMOworCXJldHVybiBjdHgtPmRhdGE7CS8qIG5vdGUgdGhpcyBJUyAnXDAnLXRlcm1pbmF0ZWQsIGJlY2F1c2Ugb2YKKwkJCQkgKiB0aGUgbnVtIG9mIGJ5dGVzIHdlIGFsbG9jK2NsZWFyIGluCisJCQkJICogcGFyc2VyX2luaXRfYnl0ZVN0cmVhbSgpICovCit9CisKKy8qIE9idGFpbiBhIGNvcHkgb2YgdGhlIGJ1ZmZlciBpbiB0aGUgcGF5bG9hZCBhcmVhLgorICovCit2b2lkICoKK3BhcnNlcl9ieXRlU3RyZWFtX2dldChQQVJTRVJfQ09OVEVYVCAqY3R4LCB1bG9uZyAqbmJ5dGVzKQoreworCWlmICghY3R4LT5ieXRlX3N0cmVhbSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG5ieXRlcykKKwkJKm5ieXRlcyA9IGN0eC0+cGFyYW1fYnl0ZXM7CisJcmV0dXJuICh2b2lkICopIGN0eC0+ZGF0YTsKK30KKworR1VJRAorcGFyc2VyX2lkX2dldChQQVJTRVJfQ09OVEVYVCAqY3R4KQoreworCVVMVFJBX0NPTlRST0xWTV9QQVJBTUVURVJTX0hFQURFUiAqcGhkciA9IE5VTEw7CisKKwlpZiAoY3R4ID09IE5VTEwpIHsKKwkJRVJSRFJWKCIlcyAoJXM6JWQpIC0gbm8gY29udGV4dCIsCisJCSAgICAgICBfX2Z1bmNfXywgX19GSUxFX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIEd1aWQwOworCX0KKwlwaGRyID0gKFVMVFJBX0NPTlRST0xWTV9QQVJBTUVURVJTX0hFQURFUiAqKSAoY3R4LT5kYXRhKTsKKwlyZXR1cm4gcGhkci0+SWQ7Cit9CisKK3ZvaWQKK3BhcnNlcl9wYXJhbV9zdGFydChQQVJTRVJfQ09OVEVYVCAqY3R4LCBQQVJTRVJfV0hJQ0hfU1RSSU5HIHdoaWNoX3N0cmluZykKK3sKKwlVTFRSQV9DT05UUk9MVk1fUEFSQU1FVEVSU19IRUFERVIgKnBoZHIgPSBOVUxMOworCisJaWYgKGN0eCA9PSBOVUxMKSB7CisJCUVSUkRSVigiJXMgKCVzOiVkKSAtIG5vIGNvbnRleHQiLAorCQkgICAgICAgX19mdW5jX18sIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJCWdvdG8gQXdheTsKKwl9CisJcGhkciA9IChVTFRSQV9DT05UUk9MVk1fUEFSQU1FVEVSU19IRUFERVIgKikgKGN0eC0+ZGF0YSk7CisJc3dpdGNoICh3aGljaF9zdHJpbmcpIHsKKwljYXNlIFBBUlNFUlNUUklOR19JTklUSUFUT1I6CisJCWN0eC0+Y3VyciA9IGN0eC0+ZGF0YSArIHBoZHItPkluaXRpYXRvck9mZnNldDsKKwkJY3R4LT5ieXRlc19yZW1haW5pbmcgPSBwaGRyLT5Jbml0aWF0b3JMZW5ndGg7CisJCWJyZWFrOworCWNhc2UgUEFSU0VSU1RSSU5HX1RBUkdFVDoKKwkJY3R4LT5jdXJyID0gY3R4LT5kYXRhICsgcGhkci0+VGFyZ2V0T2Zmc2V0OworCQljdHgtPmJ5dGVzX3JlbWFpbmluZyA9IHBoZHItPlRhcmdldExlbmd0aDsKKwkJYnJlYWs7CisJY2FzZSBQQVJTRVJTVFJJTkdfQ09OTkVDVElPTjoKKwkJY3R4LT5jdXJyID0gY3R4LT5kYXRhICsgcGhkci0+Q29ubmVjdGlvbk9mZnNldDsKKwkJY3R4LT5ieXRlc19yZW1haW5pbmcgPSBwaGRyLT5Db25uZWN0aW9uTGVuZ3RoOworCQlicmVhazsKKwljYXNlIFBBUlNFUlNUUklOR19OQU1FOgorCQljdHgtPmN1cnIgPSBjdHgtPmRhdGEgKyBwaGRyLT5OYW1lT2Zmc2V0OworCQljdHgtPmJ5dGVzX3JlbWFpbmluZyA9IHBoZHItPk5hbWVMZW5ndGg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUVSUkRSVigiJXMgLSBiYWQgd2hpY2hfc3RyaW5nICVkIiwgX19mdW5jX18sIHdoaWNoX3N0cmluZyk7CisJCWJyZWFrOworCX0KKworQXdheToKKwlyZXR1cm47Cit9CisKK3ZvaWQKK3BhcnNlcl9kb25lKFBBUlNFUl9DT05URVhUICpjdHgpCit7CisJaWYgKCFjdHgpCisJCXJldHVybjsKKwlDb250cm9sdm1fUGF5bG9hZF9CeXRlc19CdWZmZXJlZCAtPSBjdHgtPnBhcmFtX2J5dGVzOworCWtmcmVlKGN0eCk7Cit9CisKKy8qKiBSZXR1cm4gbGVuZ3RoIG9mIHN0cmluZyBub3QgY291bnRpbmcgdHJhaWxpbmcgc3BhY2VzLiAqLworc3RhdGljIGludAorc3RyaW5nX2xlbmd0aF9ub190cmFpbChjaGFyICpzLCBpbnQgbGVuKQoreworCWludCBpID0gbGVuIC0gMTsKKwl3aGlsZSAoaSA+PSAwKSB7CisJCWlmICghaXNzcGFjZShzW2ldKSkKKwkJCXJldHVybiBpICsgMTsKKwkJaS0tOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqIEdyYWIgdGhlIG5leHQgbmFtZSBhbmQgdmFsdWUgb3V0IG9mIHRoZSBwYXJhbWV0ZXIgYnVmZmVyLgorICogIFRoZSBlbnRpcmUgcGFyYW1ldGVyIGJ1ZmZlciBsb29rcyBsaWtlIHRoaXM6CisgKiAgICAgIDxuYW1lPj08dmFsdWU+XDAKKyAqICAgICAgPG5hbWU+PTx2YWx1ZT5cMAorICogICAgICAuLi4KKyAqICAgICAgXDAKKyAqICBJZiBzdWNjZXNzZnVsLCB0aGUgbmV4dCA8bmFtZT4gdmFsdWUgaXMgcmV0dXJuZWQgd2l0aGluIHRoZSBzdXBwbGllZAorICogIDxuYW0+IGJ1ZmZlciAodGhlIHZhbHVlIGlzIGFsd2F5cyB1cHBlci1jYXNlZCksIGFuZCB0aGUgY29ycmVzcG9uZGluZworICogIDx2YWx1ZT4gaXMgcmV0dXJuZWQgd2l0aGluIGEga21hbGxvYygpZWQgYnVmZmVyLCB3aG9zZSBwb2ludGVyIGlzCisgKiAgcHJvdmlkZWQgYXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uLgorICogIChUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBpcyBzdHJsZW4oPHZhbHVlPikrMS4pCisgKgorICogIE5VTEwgaXMgcmV0dXJuZWQgdG8gaW5kaWNhdGUgZmFpbHVyZSwgd2hpY2ggY2FuIG9jY3VyIGZvciBzZXZlcmFsIHJlYXNvbnM6CisgKiAgLSBhbGwgPG5hbWU+PTx2YWx1ZT4gcGFpcnMgaGF2ZSBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkCisgKiAgLSBiYWQgcGFyYW1ldGVyCisgKiAgLSBwYXJhbWV0ZXIgYnVmZmVyIGVuZHMgcHJlbWF0dXJlbHkgKGNvdWxkbid0IGZpbmQgYW4gJz0nIG9yICdcMCcgd2l0aGluCisgKiAgICB0aGUgY29uZmluZXMgb2YgdGhlIHBhcmFtZXRlciBidWZmZXIpCisgKiAgLSB0aGUgPG5hbT4gYnVmZmVyIGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgPG5hbWU+IG9mIHRoZSBuZXh0CisgKiAgICBwYXJhbWV0ZXIKKyAqLwordm9pZCAqCitwYXJzZXJfcGFyYW1fZ2V0KFBBUlNFUl9DT05URVhUICpjdHgsIGNoYXIgKm5hbSwgaW50IG5hbWVzaXplKQoreworCXU4ICpwc2NhbiwgKnBuYW0gPSBuYW07CisJdWxvbmcgbnNjYW47CisJaW50IHZhbHVlX2xlbmd0aCA9IC0xLCBvcmlnX3ZhbHVlX2xlbmd0aCA9IC0xOworCXZvaWQgKnZhbHVlID0gTlVMTDsKKwlpbnQgaTsKKwlpbnQgY2xvc2luZ19xdW90ZSA9IDA7CisKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIE5VTEw7CisJcHNjYW4gPSBjdHgtPmN1cnI7CisJbnNjYW4gPSBjdHgtPmJ5dGVzX3JlbWFpbmluZzsKKwlpZiAobnNjYW4gPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpwc2NhbiA9PSAnXDAnKQorCQkvKiAgVGhpcyBpcyB0aGUgbm9ybWFsIHJldHVybiBwb2ludCBhZnRlciB5b3UgaGF2ZSBwcm9jZXNzZWQKKwkJICogIGFsbCBvZiB0aGUgPG5hbWU+PTx2YWx1ZT4gcGFpcnMgaW4gYSBzeW50YWN0aWNhbGx5LXZhbGlkCisJCSAqICBwYXJhbWV0ZXIgYnVmZmVyLgorCQkgKi8KKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBza2lwIHdoaXRlc3BhY2UgKi8KKwl3aGlsZSAoaXNzcGFjZSgqcHNjYW4pKSB7CisJCXBzY2FuKys7CisJCW5zY2FuLS07CisJCWlmIChuc2NhbiA9PSAwKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJd2hpbGUgKCpwc2NhbiAhPSAnOicpIHsKKwkJaWYgKG5hbWVzaXplIDw9IDApIHsKKwkJCUVSUkRSVigiJXMgLSBuYW1lIHRvbyBiaWciLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkqcG5hbSA9IHRvdXBwZXIoKnBzY2FuKTsKKwkJcG5hbSsrOworCQluYW1lc2l6ZS0tOworCQlwc2NhbisrOworCQluc2Nhbi0tOworCQlpZiAobnNjYW4gPT0gMCkgeworCQkJRVJSRFJWKCIlcyAtIHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IHBhcnNpbmcgbmFtZSIsCisJCQkgICAgICAgX19mdW5jX18pOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJaWYgKG5hbWVzaXplIDw9IDApIHsKKwkJRVJSRFJWKCIlcyAtIG5hbWUgdG9vIGJpZyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCSpwbmFtID0gJ1wwJzsKKwluYW1bc3RyaW5nX2xlbmd0aF9ub190cmFpbChuYW0sIHN0cmxlbihuYW0pKV0gPSAnXDAnOworCisJLyogcG9pbnQgdG8gY2hhciBpbW1lZGlhdGVseSBhZnRlciAiOiIgaW4gIjxuYW1lPjo8dmFsdWU+IiAqLworCXBzY2FuKys7CisJbnNjYW4tLTsKKwkvKiBza2lwIHdoaXRlc3BhY2UgKi8KKwl3aGlsZSAoaXNzcGFjZSgqcHNjYW4pKSB7CisJCXBzY2FuKys7CisJCW5zY2FuLS07CisJCWlmIChuc2NhbiA9PSAwKSB7CisJCQlFUlJEUlYoIiVzIC0gdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgbG9va2luZyBmb3IgdmFsdWUiLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCWlmIChuc2NhbiA9PSAwKSB7CisJCUVSUkRSVigiJXMgLSB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBsb29raW5nIGZvciB2YWx1ZSIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoKnBzY2FuID09ICdcJycgfHwgKnBzY2FuID09ICciJykgeworCQljbG9zaW5nX3F1b3RlID0gKnBzY2FuOworCQlwc2NhbisrOworCQluc2Nhbi0tOworCQlpZiAobnNjYW4gPT0gMCkgeworCQkJRVJSRFJWKCIlcyAtIHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IGFmdGVyICVjIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgY2xvc2luZ19xdW90ZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCS8qIGxvb2sgZm9yIGEgc2VwYXJhdG9yIGNoYXJhY3RlciwgdGVybWluYXRvciBjaGFyYWN0ZXIsIG9yCisJICogZW5kIG9mIGRhdGEKKwkgKi8KKwlmb3IgKGkgPSAwLCB2YWx1ZV9sZW5ndGggPSAtMTsgaSA8IG5zY2FuOyBpKyspIHsKKwkJaWYgKGNsb3NpbmdfcXVvdGUpIHsKKwkJCWlmIChwc2NhbltpXSA9PSAnXDAnKSB7CisJCQkJRVJSRFJWKCIlcyAtIHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IHBhcnNpbmcgcXVvdGVkIHZhbHVlIiwgX19mdW5jX18pOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJaWYgKHBzY2FuW2ldID09IGNsb3NpbmdfcXVvdGUpIHsKKwkJCQl2YWx1ZV9sZW5ndGggPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UKKwkJICAgIGlmIChwc2NhbltpXSA9PSAnLCcgfHwgcHNjYW5baV0gPT0gJzsnCisJCQl8fCBwc2NhbltpXSA9PSAnXDAnKSB7CisJCQl2YWx1ZV9sZW5ndGggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHZhbHVlX2xlbmd0aCA8IDApIHsKKwkJaWYgKGNsb3NpbmdfcXVvdGUpIHsKKwkJCUVSUkRSVigiJXMgLSB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBwYXJzaW5nIHF1b3RlZCB2YWx1ZSIsIF9fZnVuY19fKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXZhbHVlX2xlbmd0aCA9IG5zY2FuOworCX0KKwlvcmlnX3ZhbHVlX2xlbmd0aCA9IHZhbHVlX2xlbmd0aDsKKwlpZiAoY2xvc2luZ19xdW90ZSA9PSAwKQorCQl2YWx1ZV9sZW5ndGggPSBzdHJpbmdfbGVuZ3RoX25vX3RyYWlsKHBzY2FuLCBvcmlnX3ZhbHVlX2xlbmd0aCk7CisJdmFsdWUgPSBrbWFsbG9jKHZhbHVlX2xlbmd0aCArIDEsIEdGUF9LRVJORUx8X19HRlBfTk9SRVRSWSk7CisJaWYgKHZhbHVlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCW1lbWNweSh2YWx1ZSwgcHNjYW4sIHZhbHVlX2xlbmd0aCk7CisJKCh1OCAqKSAodmFsdWUpKVt2YWx1ZV9sZW5ndGhdID0gJ1wwJzsKKworCXBzY2FuICs9IG9yaWdfdmFsdWVfbGVuZ3RoOworCW5zY2FuIC09IG9yaWdfdmFsdWVfbGVuZ3RoOworCisJLyogc2tpcCBwYXN0IHNlcGFyYXRvciBvciBjbG9zaW5nIHF1b3RlICovCisJaWYgKG5zY2FuID4gMCkgeworCQlpZiAoKnBzY2FuICE9ICdcMCcpIHsKKwkJCXBzY2FuKys7CisJCQluc2Nhbi0tOworCQl9CisJfQorCisJaWYgKGNsb3NpbmdfcXVvdGUgJiYgKG5zY2FuID4gMCkpIHsKKwkJLyogd2Ugc3RpbGwgbmVlZCB0byBza2lwIGFyb3VuZCB0aGUgcmVhbCBzZXBhcmF0b3IgaWYgcHJlc2VudCAqLworCQkvKiBmaXJzdCwgc2tpcCB3aGl0ZXNwYWNlICovCisJCXdoaWxlIChpc3NwYWNlKCpwc2NhbikpIHsKKwkJCXBzY2FuKys7CisJCQluc2Nhbi0tOworCQkJaWYgKG5zY2FuID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKG5zY2FuID4gMCkgeworCQkJaWYgKCpwc2NhbiA9PSAnLCcgfHwgKnBzY2FuID09ICc7JykgeworCQkJCXBzY2FuKys7CisJCQkJbnNjYW4tLTsKKwkJCX0gZWxzZSBpZiAoKnBzY2FuICE9ICdcMCcpIHsKKwkJCQlFUlJEUlYoIiVzIC0gbWlzc2luZyBzZXBhcmF0b3IgYWZ0ZXIgcXVvdGVkIHN0cmluZyIsIF9fZnVuY19fKTsKKwkJCQlrZnJlZSh2YWx1ZSk7CisJCQkJdmFsdWUgPSBOVUxMOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJfQorCWN0eC0+Y3VyciA9IHBzY2FuOworCWN0eC0+Ynl0ZXNfcmVtYWluaW5nID0gbnNjYW47CisJcmV0dXJuIHZhbHVlOworfQorCit2b2lkICoKK3BhcnNlcl9zdHJpbmdfZ2V0KFBBUlNFUl9DT05URVhUICpjdHgpCit7CisJdTggKnBzY2FuOworCXVsb25nIG5zY2FuOworCWludCB2YWx1ZV9sZW5ndGggPSAtMTsKKwl2b2lkICp2YWx1ZSA9IE5VTEw7CisJaW50IGk7CisKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIE5VTEw7CisJcHNjYW4gPSBjdHgtPmN1cnI7CisJbnNjYW4gPSBjdHgtPmJ5dGVzX3JlbWFpbmluZzsKKwlpZiAobnNjYW4gPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCFwc2NhbikKKwkJcmV0dXJuIE5VTEw7CisJZm9yIChpID0gMCwgdmFsdWVfbGVuZ3RoID0gLTE7IGkgPCBuc2NhbjsgaSsrKQorCQlpZiAocHNjYW5baV0gPT0gJ1wwJykgeworCQkJdmFsdWVfbGVuZ3RoID0gaTsKKwkJCWJyZWFrOworCQl9CisJaWYgKHZhbHVlX2xlbmd0aCA8IDApCS8qICdcMCcgd2FzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbGVuZ3RoICovCisJCXZhbHVlX2xlbmd0aCA9IG5zY2FuOworCXZhbHVlID0ga21hbGxvYyh2YWx1ZV9sZW5ndGggKyAxLCBHRlBfS0VSTkVMfF9fR0ZQX05PUkVUUlkpOworCWlmICh2YWx1ZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAodmFsdWVfbGVuZ3RoID4gMCkKKwkJbWVtY3B5KHZhbHVlLCBwc2NhbiwgdmFsdWVfbGVuZ3RoKTsKKwkoKHU4ICopICh2YWx1ZSkpW3ZhbHVlX2xlbmd0aF0gPSAnXDAnOworCXJldHVybiB2YWx1ZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3BhcnNlci5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBjYzUwYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3BhcnNlci5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qIHBhcnNlci5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fUEFSU0VSX0hfXworI2RlZmluZSBfX1BBUlNFUl9IX18KKworI2luY2x1ZGUgInVuaWtsb2cuaCIKKyNpbmNsdWRlICJ0aW1za21vZC5oIgorI2luY2x1ZGUgImNoYW5uZWwuaCIKKwordHlwZWRlZiBlbnVtIHsKKwlQQVJTRVJTVFJJTkdfSU5JVElBVE9SLAorCVBBUlNFUlNUUklOR19UQVJHRVQsCisJUEFSU0VSU1RSSU5HX0NPTk5FQ1RJT04sCisJUEFSU0VSU1RSSU5HX05BTUUsCit9IFBBUlNFUl9XSElDSF9TVFJJTkc7CisKK3R5cGVkZWYgc3RydWN0IFBBUlNFUl9DT05URVhUX1RhZyBQQVJTRVJfQ09OVEVYVDsKKworUEFSU0VSX0NPTlRFWFQgKnBhcnNlcl9pbml0KFU2NCBhZGRyLCBVMzIgYnl0ZXMsIEJPT0wgaXNMb2NhbCwgQk9PTCAqdHJ5QWdhaW4pOworUEFSU0VSX0NPTlRFWFQgKnBhcnNlcl9pbml0X2J5dGVTdHJlYW0oVTY0IGFkZHIsIFUzMiBieXRlcywgQk9PTCBpc0xvY2FsLAorCQkJCSAgICAgICBCT09MICp0cnlBZ2Fpbik7Cit2b2lkIHBhcnNlcl9wYXJhbV9zdGFydChQQVJTRVJfQ09OVEVYVCAqY3R4LCBQQVJTRVJfV0hJQ0hfU1RSSU5HIHdoaWNoX3N0cmluZyk7Cit2b2lkICpwYXJzZXJfcGFyYW1fZ2V0KFBBUlNFUl9DT05URVhUICpjdHgsIGNoYXIgKm5hbSwgaW50IG5hbWVzaXplKTsKK3ZvaWQgKnBhcnNlcl9zdHJpbmdfZ2V0KFBBUlNFUl9DT05URVhUICpjdHgpOworR1VJRCBwYXJzZXJfaWRfZ2V0KFBBUlNFUl9DT05URVhUICpjdHgpOworY2hhciAqcGFyc2VyX3NpbXBsZVN0cmluZ19nZXQoUEFSU0VSX0NPTlRFWFQgKmN0eCk7Cit2b2lkICpwYXJzZXJfYnl0ZVN0cmVhbV9nZXQoUEFSU0VSX0NPTlRFWFQgKmN0eCwgdWxvbmcgKm5ieXRlcyk7Cit2b2lkIHBhcnNlcl9kb25lKFBBUlNFUl9DT05URVhUICpjdHgpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Rlc3RpbmcuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Rlc3RpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDRmNTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvdGVzdGluZy5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIHRlc3RpbmcuaAorICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1ZJU09SQ0hJUFNFVF9URVNUSU5HX0hfXworI2RlZmluZSBfX1ZJU09SQ0hJUFNFVF9URVNUSU5HX0hfXworCisjZGVmaW5lIFZJU09SQ0hJUFNFVF9URVNUX1BST0MKKyNpbmNsdWRlICJnbG9iYWxzLmgiCisjaW5jbHVkZSAiY29udHJvbHZtY2hhbm5lbC5oIgorCit2b2lkIHRlc3RfcHJvZHVjZV90ZXN0X21lc3NhZ2UoQ09OVFJPTFZNX01FU1NBR0UgKm1zZywgaW50IGlzTG9jYWxUZXN0QWRkcik7CitCT09MIHRlc3RfY29uc3VtZV90ZXN0X21lc3NhZ2UoQ09OVFJPTFZNX01FU1NBR0UgKm1zZyk7Cit2b2lkIHRlc3RfbWFudWZhY3R1cmVfdm5pY19jbGllbnRfYWRkKHZvaWQgKnApOwordm9pZCB0ZXN0X21hbnVmYWN0dXJlX3ZuaWNfY2xpZW50X2FkZF9waHlzKEhPU1RBRERSRVNTIGFkZHIpOwordm9pZCB0ZXN0X21hbnVmYWN0dXJlX3ByZWFtYmxlX21lc3NhZ2VzKHZvaWQpOwordm9pZCB0ZXN0X21hbnVmYWN0dXJlX2RldmljZV9hdHRhY2godWxvbmcgYnVzTm8sIHVsb25nIGRldk5vKTsKK3ZvaWQgdGVzdF9tYW51ZmFjdHVyZV9kZXZpY2VfYWRkKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgR1VJRCBkYXRhVHlwZUd1aWQsCisJCQkJIHZvaWQgKnBDaGFubmVsKTsKK3ZvaWQgdGVzdF9tYW51ZmFjdHVyZV9hZGRfYnVzKHVsb25nIGJ1c05vLCB1bG9uZyBtYXhEZXZpY2VzLAorCQkJICAgICAgR1VJRCBpZCwgdTggKm5hbWUsIEJPT0wgaXNTZXJ2ZXIpOwordm9pZCB0ZXN0X21hbnVmYWN0dXJlX2RldmljZV9kZXN0cm95KHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObyk7Cit2b2lkIHRlc3RfbWFudWZhY3R1cmVfYnVzX2Rlc3Ryb3kodWxvbmcgYnVzTm8pOwordm9pZCB0ZXN0X21hbnVmYWN0dXJlX2RldGFjaF9leHRlcm5hbFBvcnQodWxvbmcgc3dpdGNoTm8sIHVsb25nIGV4dGVybmFsUG9ydE5vKTsKK3ZvaWQgdGVzdF9tYW51ZmFjdHVyZV9kZXRhY2hfaW50ZXJuYWxQb3J0KHVsb25nIHN3aXRjaE5vLCB1bG9uZyBpbnRlcm5hbFBvcnRObyk7Cit2b2lkIHRlc3RfY2xlYW51cCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC92aXNvcmNoaXBzZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YmYyMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC92aXNvcmNoaXBzZXQuaApAQCAtMCwwICsxLDMwNyBAQAorLyogdmlzb3JjaGlwc2V0LmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19WSVNPUkNISVBTRVRfSF9fCisjZGVmaW5lIF9fVklTT1JDSElQU0VUX0hfXworCisjaW5jbHVkZSAidGltc2ttb2QuaCIKKyNpbmNsdWRlICJjaGFubmVsLmgiCisjaW5jbHVkZSAiY29udHJvbHZtY2hhbm5lbC5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgInByb2NvYmplY3R0cmVlLmgiCisjaW5jbHVkZSAidmJ1c2RldmljZWluZm8uaCIKKyNpbmNsdWRlICJ2YnVzaGVscGVyLmgiCisKKy8qKiBEZXNjcmliZXMgdGhlIHN0YXRlIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHdoaWNoIGNvbnRyb2x2bSBtZXNzYWdlcyBoYXZlCisgKiAgYmVlbiByZWNlaXZlZCBmb3IgYSBidXMgb3IgZGV2aWNlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJVTMyIGNyZWF0ZWQ6MTsKKwlVMzIgYXR0YWNoZWQ6MTsKKwlVMzIgY29uZmlndXJlZDoxOworCVUzMiBydW5uaW5nOjE7CisJLyogQWRkIG5ldyBmaWVsZHMgYWJvdmUuICovCisJLyogUmVtYWluaW5nIGJpdHMgaW4gdGhpcyAzMi1iaXQgd29yZCBhcmUgdW51c2VkLiAqLworfSBWSVNPUkNISVBTRVRfU1RBVEU7CisKK3R5cGVkZWYgZW51bSB7CisJLyoqIGFkZHJlc3MgaXMgZ3Vlc3QgcGh5c2ljYWwsIGJ1dCBvdXRzaWRlIG9mIHRoZSBwaHlzaWNhbCBtZW1vcnkKKwkgKiAgcmVnaW9uIHRoYXQgaXMgY29udHJvbGxlZCBieSB0aGUgcnVubmluZyBPUyAodGhpcyBpcyB0aGUgbm9ybWFsCisJICogIGFkZHJlc3MgdHlwZSBmb3IgU3VwZXJ2aXNvciBjaGFubmVscykKKwkgKi8KKwlBRERSVFlQRV9sb2NhbFBoeXNpY2FsLAorCisJLyoqIGFkZHJlc3MgaXMgZ3Vlc3QgcGh5c2ljYWwsIGFuZCB3aXRoSU4gdGhlIGNvbmZpbmVzIG9mIHRoZQorCSAqICBwaHlzaWNhbCBtZW1vcnkgY29udHJvbGxlZCBieSB0aGUgcnVubmluZyBPUy4KKwkgKi8KKwlBRERSVFlQRV9sb2NhbFRlc3QsCit9IFZJU09SQ0hJUFNFVF9BRERSRVNTVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKwlDUkFTSF9kZXYsCisJQ1JBU0hfYnVzLAorfSBDUkFTSF9PQkpfVFlQRTsKKworLyoqIEF0dHJpYnV0ZXMgZm9yIGEgcGFydGljdWxhciBTdXBlcnZpc29yIGNoYW5uZWwuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlWSVNPUkNISVBTRVRfQUREUkVTU1RZUEUgYWRkclR5cGU7CisJSE9TVEFERFJFU1MgY2hhbm5lbEFkZHI7CisJc3RydWN0IEludGVycnVwdEluZm8gaW50cjsKKwlVNjQgbkNoYW5uZWxCeXRlczsKKwlHVUlEIGNoYW5uZWxUeXBlR3VpZDsKKwlHVUlEIGNoYW5uZWxJbnN0R3VpZDsKKworfSBWSVNPUkNISVBTRVRfQ0hBTk5FTF9JTkZPOworCisvKiogQXR0cmlidXRlcyBmb3IgYSBwYXJ0aWN1bGFyIFN1cGVydmlzb3IgZGV2aWNlLgorICogIEFueSB2aXNvcmNoaXBzZXQgY2xpZW50IGNhbiBxdWVyeSB0aGVzZSBhdHRyaWJ1dGVzIHVzaW5nCisgKiAgdmlzb3JjaGlwc2V0X2dldF9jbGllbnRfZGV2aWNlX2luZm8oKSBvcgorICogIHZpc29yY2hpcHNldF9nZXRfc2VydmVyX2RldmljZV9pbmZvKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCVUzMiBidXNObzsKKwlVMzIgZGV2Tm87CisJR1VJRCBkZXZJbnN0R3VpZDsKKwlWSVNPUkNISVBTRVRfU1RBVEUgc3RhdGU7CisJVklTT1JDSElQU0VUX0NIQU5ORUxfSU5GTyBjaGFuSW5mbzsKKwlVMzIgUmVzZXJ2ZWQxOwkJLyogQ09OVFJPTFZNX0lEICovCisJVTY0IFJlc2VydmVkMjsKKwlVMzIgc3dpdGNoTm87CQkvKiB3aGVuIGRldlN0YXRlLmF0dGFjaGVkPT0xICovCisJVTMyIGludGVybmFsUG9ydE5vOwkvKiB3aGVuIGRldlN0YXRlLmF0dGFjaGVkPT0xICovCisJQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIHBlbmRpbmdNc2dIZHI7CS8qIENPTlRST0xWTV9NRVNTQUdFICovCisJLyoqIEZvciBwcml2YXRlIHVzZSBieSB0aGUgYnVzIGRyaXZlciAqLworCXZvaWQgKmJ1c19kcml2ZXJfY29udGV4dDsKKworfSBWSVNPUkNISVBTRVRfREVWSUNFX0lORk87CisKK3N0YXRpYyBpbmxpbmUgVklTT1JDSElQU0VUX0RFVklDRV9JTkZPICoKK2ZpbmRkZXZpY2Uoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgVTMyIGJ1c05vLCBVMzIgZGV2Tm8pCit7CisJVklTT1JDSElQU0VUX0RFVklDRV9JTkZPICpwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCBsaXN0LCBlbnRyeSkgeworCQlpZiAocC0+YnVzTm8gPT0gYnVzTm8gJiYgcC0+ZGV2Tm8gPT0gZGV2Tm8pCisJCQlyZXR1cm4gcDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxidXNkZXZpY2VzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIFUzMiBidXNObykKK3sKKwlWSVNPUkNISVBTRVRfREVWSUNFX0lORk8gKnA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsIGxpc3QsIGVudHJ5KSB7CisJCWlmIChwLT5idXNObyA9PSBidXNObykgeworCQkJbGlzdF9kZWwoJnAtPmVudHJ5KTsKKwkJCWtmcmVlKHApOworCQl9CisJfQorfQorCisvKiogQXR0cmlidXRlcyBmb3IgYSBwYXJ0aWN1bGFyIFN1cGVydmlzb3IgYnVzLgorICogIChGb3IgYSBzZXJ2aWNlIHBhcnRpdGlvbiBhY3RpbmcgYXMgdGhlIHNlcnZlciBmb3IgYnVzZXMvZGV2aWNlcywgdGhlcmUKKyAqICBpcyBhIDEtdG8tMSByZWxhdGlvbnNoaXAgYmV0d2VlbiBidXNzZXMgYW5kIGd1ZXN0IHBhcnRpdGlvbnMuKQorICogIEFueSB2aXNvcmNoaXBzZXQgY2xpZW50IGNhbiBxdWVyeSB0aGVzZSBhdHRyaWJ1dGVzIHVzaW5nCisgKiAgdmlzb3JjaGlwc2V0X2dldF9jbGllbnRfYnVzX2luZm8oKSBvciB2aXNvcmNoaXBzZXRfZ2V0X2J1c19pbmZvKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCVUzMiBidXNObzsKKwlWSVNPUkNISVBTRVRfU1RBVEUgc3RhdGU7CisJVklTT1JDSElQU0VUX0NIQU5ORUxfSU5GTyBjaGFuSW5mbzsKKwlHVUlEIHBhcnRpdGlvbkd1aWQ7CisJVTY0IHBhcnRpdGlvbkhhbmRsZTsKKwlVOCAqbmFtZTsJCS8qIFVURjggKi8KKwlVOCAqZGVzY3JpcHRpb247CS8qIFVURjggKi8KKwlVNjQgUmVzZXJ2ZWQxOworCVUzMiBSZXNlcnZlZDI7CisJTVlQUk9DT0JKRUNUICpwcm9jT2JqZWN0OworCXN0cnVjdCB7CisJCVUzMiBzZXJ2ZXI6MTsKKwkJLyogQWRkIG5ldyBmaWVsZHMgYWJvdmUuICovCisJCS8qIFJlbWFpbmluZyBiaXRzIGluIHRoaXMgMzItYml0IHdvcmQgYXJlIHVudXNlZC4gKi8KKwl9IGZsYWdzOworCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBwZW5kaW5nTXNnSGRyOwkvKiBDT05UUk9MVk0gTXNnSGRyICovCisJLyoqIEZvciBwcml2YXRlIHVzZSBieSB0aGUgYnVzIGRyaXZlciAqLworCXZvaWQgKmJ1c19kcml2ZXJfY29udGV4dDsKKwlVNjQgZGV2Tm87CisKK30gVklTT1JDSElQU0VUX0JVU19JTkZPOworCitzdGF0aWMgaW5saW5lIFZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqCitmaW5kYnVzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIFUzMiBidXNObykKK3sKKwlWSVNPUkNISVBTRVRfQlVTX0lORk8gKnA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsIGxpc3QsIGVudHJ5KSB7CisJCWlmIChwLT5idXNObyA9PSBidXNObykKKwkJCXJldHVybiBwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqIEF0dHJpYnV0ZXMgZm9yIGEgcGFydGljdWxhciBTdXBlcnZpc29yIHN3aXRjaC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCVUzMiBzd2l0Y2hObzsKKwlWSVNPUkNISVBTRVRfU1RBVEUgc3RhdGU7CisJR1VJRCBzd2l0Y2hUeXBlR3VpZDsKKwlVOCAqYXV0aFNlcnZpY2UxOworCVU4ICphdXRoU2VydmljZTI7CisJVTggKmF1dGhTZXJ2aWNlMzsKKwlVOCAqc2VjdXJpdHlDb250ZXh0OworCVU2NCBSZXNlcnZlZDsKKwlVMzIgUmVzZXJ2ZWQyOwkJLyogQ09OVFJPTFZNX0lEICovCisJc3RydWN0IGRldmljZSBkZXY7CisJQk9PTCBkZXZfZXhpc3RzOworCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBwZW5kaW5nTXNnSGRyOworCit9IFZJU09SQ0hJUFNFVF9TV0lUQ0hfSU5GTzsKKworLyoqIEF0dHJpYnV0ZXMgZm9yIGEgcGFydGljdWxhciBTdXBlcnZpc29yIGV4dGVybmFsIHBvcnQsIHdoaWNoIGlzIGNvbm5lY3RlZAorICogIHRvIGEgc3BlY2lmaWMgc3dpdGNoLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJVTMyIHN3aXRjaE5vOworCVUzMiBleHRlcm5hbFBvcnRObzsKKwlWSVNPUkNISVBTRVRfU1RBVEUgc3RhdGU7CisJR1VJRCBuZXR3b3JrWm9uZUd1aWQ7CisJaW50IHBkUG9ydDsKKwlVOCAqaXA7CisJVTggKmlwTmV0bWFzazsKKwlVOCAqaXBCcm9hZGNhc3Q7CisJVTggKmlwTmV0d29yazsKKwlVOCAqaXBHYXRld2F5OworCVU4ICppcEROUzsKKwlVNjQgUmVzZXJ2ZWQxOworCVUzMiBSZXNlcnZlZDI7CQkvKiBDT05UUk9MVk1fSUQgKi8KKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlCT09MIGRldl9leGlzdHM7CisJQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIHBlbmRpbmdNc2dIZHI7CisKK30gVklTT1JDSElQU0VUX0VYVEVSTkFMUE9SVF9JTkZPOworCisvKiogQXR0cmlidXRlcyBmb3IgYSBwYXJ0aWN1bGFyIFN1cGVydmlzb3IgaW50ZXJuYWwgcG9ydCwgd2hpY2ggaXMgaG93IGEKKyAqICBkZXZpY2UgY29ubmVjdHMgdG8gYSBwYXJ0aWN1bGFyIHN3aXRjaC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCVUzMiBzd2l0Y2hObzsKKwlVMzIgaW50ZXJuYWxQb3J0Tm87CisJVklTT1JDSElQU0VUX1NUQVRFIHN0YXRlOworCVUzMiBidXNObzsJCS8qIHZhbGlkIG9ubHkgd2hlbiBzdGF0ZS5hdHRhY2hlZCA9PSAxICovCisJVTMyIGRldk5vOwkJLyogdmFsaWQgb25seSB3aGVuIHN0YXRlLmF0dGFjaGVkID09IDEgKi8KKwlVNjQgUmVzZXJ2ZWQxOworCVUzMiBSZXNlcnZlZDI7CQkvKiBDT05UUk9MVk1fSUQgKi8KKwlDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgcGVuZGluZ01zZ0hkcjsKKwlNWVBST0NPQkpFQ1QgKnByb2NPYmplY3Q7CisKK30gVklTT1JDSElQU0VUX0lOVEVSTkFMUE9SVF9JTkZPOworCisvKiAgVGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgY2FsbGVkIGZyb20gd2l0aGluIHZpc29yY2hpcHNldCB3aGVuIGNlcnRhaW4KKyAqICBldmVudHMgaGFwcGVuLiAgKFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBmdW5jdGlvbnMgaXMgb3V0c2lkZSBvZgorICogIHZpc29yY2hpcHNldC4pCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl2b2lkICgqYnVzX2NyZWF0ZSkodWxvbmcgYnVzTm8pOworCXZvaWQgKCpidXNfZGVzdHJveSkodWxvbmcgYnVzTm8pOworCXZvaWQgKCpkZXZpY2VfY3JlYXRlKSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8pOworCXZvaWQgKCpkZXZpY2VfZGVzdHJveSkodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vKTsKKwl2b2lkICgqZGV2aWNlX3BhdXNlKSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8pOworCXZvaWQgKCpkZXZpY2VfcmVzdW1lKSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8pOworCWludCAoKmdldF9jaGFubmVsX2luZm8pKEdVSUQgdHlwZUd1aWQsIHVsb25nICptaW5TaXplLAorCQkJCSB1bG9uZyAqbWF4U2l6ZSk7Cit9IFZJU09SQ0hJUFNFVF9CVVNERVZfTk9USUZJRVJTOworCisvKiAgVGhlc2UgZnVuY3Rpb25zIGxpdmUgaW5zaWRlIHZpc29yY2hpcHNldCwgYW5kIHdpbGwgYmUgY2FsbGVkIHRvIGluZGljYXRlCisgKiAgcmVzcG9uc2VzIHRvIHNwZWNpZmljIGV2ZW50cyAoYnkgY29kZSBvdXRzaWRlIG9mIHZpc29yY2hpcHNldCkuCisgKiAgRm9yIG5vdywgdGhlIHZhbHVlIGZvciBlYWNoIHJlc3BvbnNlIGlzIHNpbXBseSBlaXRoZXI6CisgKiAgICAgICAwID0gaXQgd29ya2VkCisgKiAgICAgIC0xID0gaXQgZmFpbGVkCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl2b2lkICgqYnVzX2NyZWF0ZSkodWxvbmcgYnVzTm8sIGludCByZXNwb25zZSk7CisJdm9pZCAoKmJ1c19kZXN0cm95KSh1bG9uZyBidXNObywgaW50IHJlc3BvbnNlKTsKKwl2b2lkICgqZGV2aWNlX2NyZWF0ZSkodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpOworCXZvaWQgKCpkZXZpY2VfZGVzdHJveSkodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpOworCXZvaWQgKCpkZXZpY2VfcGF1c2UpKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKTsKKwl2b2lkICgqZGV2aWNlX3Jlc3VtZSkodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpOworfSBWSVNPUkNISVBTRVRfQlVTREVWX1JFU1BPTkRFUlM7CisKKy8qKiBSZWdpc3RlciBmdW5jdGlvbnMgKGluIHRoZSBidXMgZHJpdmVyKSB0byBnZXQgY2FsbGVkIGJ5IHZpc29yY2hpcHNldAorICogIHdoZW5ldmVyIGEgYnVzIG9yIGRldmljZSBhcHBlYXJzIGZvciB3aGljaCB0aGlzIHNlcnZpY2UgcGFydGl0aW9uIGlzCisgKiAgdG8gYmUgdGhlIHNlcnZlciBmb3IuICB2aXNvcmNoaXBzZXQgd2lsbCBmaWxsIGluIDxyZXNwb25kZXJzPiwgdG8KKyAqICBpbmRpY2F0ZSBmdW5jdGlvbnMgdGhlIGJ1cyBkcml2ZXIgc2hvdWxkIGNhbGwgdG8gaW5kaWNhdGUgbWVzc2FnZQorICogIHJlc3BvbnNlcy4KKyAqLwordm9pZAordmlzb3JjaGlwc2V0X3JlZ2lzdGVyX2J1c2Rldl9jbGllbnQoVklTT1JDSElQU0VUX0JVU0RFVl9OT1RJRklFUlMgKm5vdGlmaWVycywKKwkJCQkgICAgVklTT1JDSElQU0VUX0JVU0RFVl9SRVNQT05ERVJTICpyZXNwb25kZXJzLAorCQkJCSAgICBVTFRSQV9WQlVTX0RFVklDRUlORk8gKmRyaXZlckluZm8pOworCisvKiogUmVnaXN0ZXIgZnVuY3Rpb25zIChpbiB0aGUgYnVzIGRyaXZlcikgdG8gZ2V0IGNhbGxlZCBieSB2aXNvcmNoaXBzZXQKKyAqICB3aGVuZXZlciBhIGJ1cyBvciBkZXZpY2UgYXBwZWFycyBmb3Igd2hpY2ggdGhpcyBzZXJ2aWNlIHBhcnRpdGlvbiBpcworICogIHRvIGJlIHRoZSBjbGllbnQgZm9yLiAgdmlzb3JjaGlwc2V0IHdpbGwgZmlsbCBpbiA8cmVzcG9uZGVycz4sIHRvCisgKiAgaW5kaWNhdGUgZnVuY3Rpb25zIHRoZSBidXMgZHJpdmVyIHNob3VsZCBjYWxsIHRvIGluZGljYXRlIG1lc3NhZ2UKKyAqICByZXNwb25zZXMuCisgKi8KK3ZvaWQKK3Zpc29yY2hpcHNldF9yZWdpc3Rlcl9idXNkZXZfc2VydmVyKFZJU09SQ0hJUFNFVF9CVVNERVZfTk9USUZJRVJTICpub3RpZmllcnMsCisJCQkJICAgIFZJU09SQ0hJUFNFVF9CVVNERVZfUkVTUE9OREVSUyAqcmVzcG9uZGVycywKKwkJCQkgICAgVUxUUkFfVkJVU19ERVZJQ0VJTkZPICpkcml2ZXJJbmZvKTsKKwordHlwZWRlZiB2b2lkICgqU1BBUlJFUE9SVEVWRU5UX0NPTVBMRVRFX0ZVTkMpIChDT05UUk9MVk1fTUVTU0FHRSAqbXNnLAorCQkJCQkgICAgICAgaW50IHN0YXR1cyk7CisKK3ZvaWQgdmlzb3JjaGlwc2V0X2RldmljZV9wYXVzZV9yZXNwb25zZSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sIGludCByZXNwb25zZSk7CisKK0JPT0wgdmlzb3JjaGlwc2V0X2dldF9idXNfaW5mbyh1bG9uZyBidXNObywgVklTT1JDSElQU0VUX0JVU19JTkZPICpidXNJbmZvKTsKK0JPT0wgdmlzb3JjaGlwc2V0X2dldF9kZXZpY2VfaW5mbyh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sCisJCQkJICBWSVNPUkNISVBTRVRfREVWSUNFX0lORk8gKmRldkluZm8pOworQk9PTCB2aXNvcmNoaXBzZXRfZ2V0X3N3aXRjaF9pbmZvKHVsb25nIHN3aXRjaE5vLAorCQkJCSAgVklTT1JDSElQU0VUX1NXSVRDSF9JTkZPICpzd2l0Y2hJbmZvKTsKK0JPT0wgdmlzb3JjaGlwc2V0X2dldF9leHRlcm5hbHBvcnRfaW5mbyh1bG9uZyBzd2l0Y2hObywgdWxvbmcgZXh0ZXJuYWxQb3J0Tm8sCisJCQkJCVZJU09SQ0hJUFNFVF9FWFRFUk5BTFBPUlRfSU5GTworCQkJCQkqZXh0ZXJuYWxQb3J0SW5mbyk7CitCT09MIHZpc29yY2hpcHNldF9zZXRfYnVzX2NvbnRleHQodWxvbmcgYnVzTm8sIHZvaWQgKmNvbnRleHQpOworQk9PTCB2aXNvcmNoaXBzZXRfc2V0X2RldmljZV9jb250ZXh0KHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgdm9pZCAqY29udGV4dCk7CitpbnQgdmlzb3JjaGlwc2V0X2NoaXBzZXRfcmVhZHkodm9pZCk7CitpbnQgdmlzb3JjaGlwc2V0X2NoaXBzZXRfc2VsZnRlc3Qodm9pZCk7CitpbnQgdmlzb3JjaGlwc2V0X2NoaXBzZXRfbm90cmVhZHkodm9pZCk7Cit2b2lkIHZpc29yY2hpcHNldF9jb250cm9sdm1fcmVzcG9uZF9yZXBvcnRFdmVudChDT05UUk9MVk1fTUVTU0FHRSAqbXNnLAorCQkJCQkJdm9pZCAqcGF5bG9hZCk7Cit2b2lkIHZpc29yY2hpcHNldF9zYXZlX21lc3NhZ2UoQ09OVFJPTFZNX01FU1NBR0UgKm1zZywgQ1JBU0hfT0JKX1RZUEUgdHlwZSk7Cit2b2lkICp2aXNvcmNoaXBzZXRfY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKnBvb2wsCisJCQkgICAgICAgQk9PTCBva190b19ibG9jaywgY2hhciAqZm4sIGludCBsbik7Cit2b2lkIHZpc29yY2hpcHNldF9jYWNoZV9mcmVlKHN0cnVjdCBrbWVtX2NhY2hlICpwb29sLCB2b2lkICpwLAorCQkJICAgICBjaGFyICpmbiwgaW50IGxuKTsKKworI2lmIGRlZmluZWQoVFJBTlNNSVRGSUxFX0RFQlVHKSB8fCBkZWZpbmVkKERFQlVHKQorI2RlZmluZSBEQkdfR0VURklMRV9QQVlMT0FEKG1zZywgY29udHJvbHZtX2hlYWRlcikgICAgICBcCisJTE9HSU5GKG1zZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAodWxvbmcpY29udHJvbHZtX2hlYWRlci5QYXlsb2FkVm1PZmZzZXQsIFwKKwkgICAgICAgKHVsb25nKWNvbnRyb2x2bV9oZWFkZXIuUGF5bG9hZE1heEJ5dGVzKQorI2RlZmluZSBEQkdfR0VURklMRShmbXQsIC4uLikgIExPR0lORihmbXQsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIERCR19QVVRGSUxFKGZtdCwgLi4uKSAgTE9HSU5GKGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIERCR19HRVRGSUxFX1BBWUxPQUQobXNnLCBjb250cm9sdm1faGVhZGVyKQorI2RlZmluZSBEQkdfR0VURklMRShmbXQsIC4uLikKKyNkZWZpbmUgREJHX1BVVEZJTEUoZm10LCAuLi4pCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC92aXNvcmNoaXBzZXRfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvdmlzb3JjaGlwc2V0X21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjUyY2ExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvdmlzb3JjaGlwc2V0X21haW4uYwpAQCAtMCwwICsxLDI5NDUgQEAKKy8qIHZpc29yY2hpcHNldF9tYWluLmMKKyAqCisgKiBDb3B5cmlnaHQg77+9IDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgImdsb2JhbHMuaCIKKyNpbmNsdWRlICJjb250cm9sdm0uaCIKKyNpbmNsdWRlICJ2aXNvcmNoaXBzZXQuaCIKKyNpbmNsdWRlICJwcm9jb2JqZWN0dHJlZS5oIgorI2luY2x1ZGUgInZpc29yY2hhbm5lbC5oIgorI2luY2x1ZGUgInBlcmlvZGljX3dvcmsuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nLmgiCisjaW5jbHVkZSAiZmlsZS5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgInVuaWtsb2cuaCIKKyNpbmNsdWRlICJ1aXN1dGlscy5oIgorI2luY2x1ZGUgImd1aWR1dGlscy5oIgorI2luY2x1ZGUgImNvbnRyb2x2bWNvbXBsZXRpb25zdGF0dXMuaCIKKyNpbmNsdWRlICJndWVzdGxpbnV4ZGVidWcuaCIKKyNpbmNsdWRlICJmaWxleGZlci5oIgorCisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNkZWZpbmUgQ1VSUkVOVF9GSUxFX1BDIFZJU09SX0NISVBTRVRfUENfdmlzb3JjaGlwc2V0X21haW5fYworI2RlZmluZSBURVNUX1ZOSUNfUEhZU0lURiAiZXRoMCIJLyogcGh5c2ljYWwgbmV0d29yayBpdGYgZm9yCisJCQkJCSAqIHZuaWMgbG9vcGJhY2sgdGVzdCAqLworI2RlZmluZSBURVNUX1ZOSUNfU1dJVENITk8gMQorI2RlZmluZSBURVNUX1ZOSUNfQlVTTk8gOQorCisjZGVmaW5lIE1BWF9OQU1FX1NJWkUgMTI4CisjZGVmaW5lIE1BWF9JUF9TSVpFICAgNTAKKyNkZWZpbmUgTUFYT1VUU1RBTkRJTkdDSEFOTkVMQ09NTUFORCAyNTYKKyNkZWZpbmUgUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9GQVNUICAgMQorI2RlZmluZSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX1NMT1cgMTAwCisKKy8qIFdoZW4gdGhlIGNvbnRyb2x2bSBjaGFubmVsIGlzIGlkbGUgZm9yIGF0IGxlYXN0IE1JTl9JRExFX1NFQ09ORFMsCisqIHdlIHN3aXRjaCB0byBzbG93IHBvbGxpbmcgbW9kZS4gIEFzIHNvb24gYXMgd2UgZ2V0IGEgY29udHJvbHZtCisqIG1lc3NhZ2UsIHdlIHN3aXRjaCBiYWNrIHRvIGZhc3QgcG9sbGluZyBtb2RlLgorKi8KKyNkZWZpbmUgTUlOX0lETEVfU0VDT05EUyAxMAorc3RhdGljIHVsb25nIFBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVDsKK3N0YXRpYyB1bG9uZyBNb3N0X3JlY2VudF9tZXNzYWdlX2ppZmZpZXM7CS8qIHdoZW4gd2UgZ290IG91ciBsYXN0CisJCQkJCQkgKiBjb250cm9sdm0gbWVzc2FnZSAqLworc3RhdGljIGlubGluZSBjaGFyICoKK05PTlVMTFNUUihjaGFyICpzKQoreworCWlmIChzKQorCQlyZXR1cm4gczsKKwllbHNlCisJCXJldHVybiAiIjsKK30KKworc3RhdGljIGludCBzZXJ2ZXJyZWdpc3RlcmVkOworc3RhdGljIGludCBjbGllbnRyZWdpc3RlcmVkOworCisjZGVmaW5lIE1BWF9DSElQU0VUX0VWRU5UUyAyCitzdGF0aWMgVTggY2hpcHNldF9ldmVudHNbTUFYX0NISVBTRVRfRVZFTlRTXSA9IHsgMCwgMCB9OworCitzdGF0aWMgc3RydWN0IGRlbGF5ZWRfd29yayBQZXJpb2RpY19jb250cm9sdm1fd29yazsKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZTsKK3N0YXRpYyBERUZJTkVfU0VNQVBIT1JFKE5vdGlmaWVyTG9jayk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlDT05UUk9MVk1fTUVTU0FHRSBtZXNzYWdlOworCXVuc2lnbmVkIGludCBjcmM7Cit9IE1FU1NBR0VfRU5WRUxPUEU7CisKK3N0YXRpYyBDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgZ19EaWFnTXNnSGRyOworc3RhdGljIENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBnX0NoaXBTZXRNc2dIZHI7CitzdGF0aWMgQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIGdfRGVsRHVtcE1zZ0hkcjsKK3N0YXRpYyBjb25zdCBHVUlEIFVsdHJhRGlhZ1Bvb2xDaGFubmVsUHJvdG9jb2xHdWlkID0KKwlVTFRSQV9ESUFHX1BPT0xfQ0hBTk5FTF9QUk9UT0NPTF9HVUlEOworLyogMHhmZmZmZmYgaXMgYW4gaW52YWxpZCBCdXMvRGV2aWNlIG51bWJlciAqLworc3RhdGljIHVsb25nIGdfZGlhZ3Bvb2xCdXNObyA9IDB4ZmZmZmZmOworc3RhdGljIHVsb25nIGdfZGlhZ3Bvb2xEZXZObyA9IDB4ZmZmZmZmOworc3RhdGljIENPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVCBnX0RldmljZUNoYW5nZVN0YXRlUGFja2V0OworCisvKiBPbmx5IFZOSUMgYW5kIFZIQkEgY2hhbm5lbHMgYXJlIHNlbnQgdG8gdmlzb3JjbGllbnRidXMgKGFrYQorICogInZpc29yaGFja2J1cyIpCisgKi8KKyNkZWZpbmUgRk9SX1ZJU09SSEFDS0JVUyhjaGFubmVsX3R5cGVfZ3VpZCkgXAorCSgobWVtY21wKCZjaGFubmVsX3R5cGVfZ3VpZCwgJlVsdHJhVm5pY0NoYW5uZWxQcm90b2NvbEd1aWQsIFwKKwkJIHNpemVvZihHVUlEKSkgPT0gMCkgfHwJCQkJICAgIFwKKwkgKG1lbWNtcCgmY2hhbm5lbF90eXBlX2d1aWQsICZVbHRyYVZoYmFDaGFubmVsUHJvdG9jb2xHdWlkLCBcCisJCSBzaXplb2YoR1VJRCkpID09IDApKQorI2RlZmluZSBGT1JfVklTT1JCVVMoY2hhbm5lbF90eXBlX2d1aWQpICghKEZPUl9WSVNPUkhBQ0tCVVMoY2hhbm5lbF90eXBlX2d1aWQpKSkKKworI2RlZmluZSBpc19kaWFncG9vbF9jaGFubmVsKGNoYW5uZWxfdHlwZV9ndWlkKSBcCisJIChtZW1jbXAoJmNoYW5uZWxfdHlwZV9ndWlkLCBcCisJCSAmVWx0cmFEaWFnUG9vbENoYW5uZWxQcm90b2NvbEd1aWQsIHNpemVvZihHVUlEKSkgPT0gMCkKKwordHlwZWRlZiBlbnVtIHsKKwlQQVJUUFJPUF9pbnZhbGlkLAorCVBBUlRQUk9QX25hbWUsCisJUEFSVFBST1BfZGVzY3JpcHRpb24sCisJUEFSVFBST1BfaGFuZGxlLAorCVBBUlRQUk9QX2J1c051bWJlciwKKwkvKiBhZGQgbmV3IHByb3BlcnRpZXMgYWJvdmUsIGJ1dCBkb24ndCBmb3JnZXQgdG8gY2hhbmdlCisJICogSW5pdFBhcnRpdGlvblByb3BlcnRpZXMoKSBhbmQgc2hvd19wYXJ0aXRpb25fcHJvcGVydHkoKSBhbHNvLi4uCisJICovCisJUEFSVFBST1BfbGFzdAorfSBQQVJUSVRJT05fcHJvcGVydHk7CitzdGF0aWMgY29uc3QgY2hhciAqUGFydGl0aW9uVHlwZU5hbWVzW10gPSB7ICJwYXJ0aXRpb24iLCBOVUxMIH07CisKK3N0YXRpYyBjaGFyICpQYXJ0aXRpb25Qcm9wZXJ0eU5hbWVzW1BBUlRQUk9QX2xhc3QgKyAxXTsKK3N0YXRpYyB2b2lkCitJbml0UGFydGl0aW9uUHJvcGVydGllcyh2b2lkKQoreworCWNoYXIgKipwID0gUGFydGl0aW9uUHJvcGVydHlOYW1lczsKKwlwW1BBUlRQUk9QX2ludmFsaWRdID0gIiI7CisJcFtQQVJUUFJPUF9uYW1lXSA9ICJuYW1lIjsKKwlwW1BBUlRQUk9QX2Rlc2NyaXB0aW9uXSA9ICJkZXNjcmlwdGlvbiI7CisJcFtQQVJUUFJPUF9oYW5kbGVdID0gImhhbmRsZSI7CisJcFtQQVJUUFJPUF9idXNOdW1iZXJdID0gImJ1c051bWJlciI7CisJcFtQQVJUUFJPUF9sYXN0XSA9IE5VTEw7Cit9CisKK3R5cGVkZWYgZW51bSB7CisJQ1RMVk1QUk9QX2ludmFsaWQsCisJQ1RMVk1QUk9QX3BoeXNBZGRyLAorCUNUTFZNUFJPUF9jb250cm9sQ2hhbm5lbEFkZHIsCisJQ1RMVk1QUk9QX2NvbnRyb2xDaGFubmVsQnl0ZXMsCisJQ1RMVk1QUk9QX3NwYXJCb290UGFydCwKKwlDVExWTVBST1Bfc3BhclN0b3JhZ2VQYXJ0LAorCUNUTFZNUFJPUF9saXZlZHVtcExlbmd0aCwKKwlDVExWTVBST1BfbGl2ZWR1bXBDcmMzMiwKKwkvKiBhZGQgbmV3IHByb3BlcnRpZXMgYWJvdmUsIGJ1dCBkb24ndCBmb3JnZXQgdG8gY2hhbmdlCisJICogSW5pdENvbnRyb2xWbVByb3BlcnRpZXMoKSBzaG93X2NvbnRyb2x2bV9wcm9wZXJ0eSgpIGFsc28uLi4KKwkgKi8KKwlDVExWTVBST1BfbGFzdAorfSBDT05UUk9MVk1fcHJvcGVydHk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpDb250cm9sVm1UeXBlTmFtZXNbXSA9IHsgImNvbnRyb2x2bSIsIE5VTEwgfTsKKworc3RhdGljIGNoYXIgKkNvbnRyb2xWbVByb3BlcnR5TmFtZXNbQ1RMVk1QUk9QX2xhc3QgKyAxXTsKK3N0YXRpYyB2b2lkCitJbml0Q29udHJvbFZtUHJvcGVydGllcyh2b2lkKQoreworCWNoYXIgKipwID0gQ29udHJvbFZtUHJvcGVydHlOYW1lczsKKwlwW0NUTFZNUFJPUF9pbnZhbGlkXSA9ICIiOworCXBbQ1RMVk1QUk9QX3BoeXNBZGRyXSA9ICJwaHlzQWRkciI7CisJcFtDVExWTVBST1BfY29udHJvbENoYW5uZWxBZGRyXSA9ICJjb250cm9sQ2hhbm5lbEFkZHIiOworCXBbQ1RMVk1QUk9QX2NvbnRyb2xDaGFubmVsQnl0ZXNdID0gImNvbnRyb2xDaGFubmVsQnl0ZXMiOworCXBbQ1RMVk1QUk9QX3NwYXJCb290UGFydF0gPSAic3Bhcl9ib290X3BhcnQiOworCXBbQ1RMVk1QUk9QX3NwYXJTdG9yYWdlUGFydF0gPSAic3Bhcl9zdG9yYWdlX3BhcnQiOworCXBbQ1RMVk1QUk9QX2xpdmVkdW1wTGVuZ3RoXSA9ICJsaXZlZHVtcExlbmd0aCI7CisJcFtDVExWTVBST1BfbGl2ZWR1bXBDcmMzMl0gPSAibGl2ZWR1bXBDcmMzMiI7CisJcFtDVExWTVBST1BfbGFzdF0gPSBOVUxMOworfQorCitzdGF0aWMgTVlQUk9DT0JKRUNUICpDb250cm9sVm1PYmplY3Q7CitzdGF0aWMgTVlQUk9DVFlQRSAqUGFydGl0aW9uVHlwZTsKK3N0YXRpYyBNWVBST0NUWVBFICpDb250cm9sVm1UeXBlOworCisjZGVmaW5lIFZJU09SQ0hJUFNFVF9ESUFHX1BST0NfRU5UUllfRk4gImRpYWdkdW1wIgorc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlhZ19wcm9jX2RpcjsKKworI2RlZmluZSBWSVNPUkNISVBTRVRfQ0hJUFNFVF9QUk9DX0VOVFJZX0ZOICJjaGlwc2V0cmVhZHkiCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpjaGlwc2V0X3Byb2NfZGlyOworCisjZGVmaW5lIFZJU09SQ0hJUFNFVF9QQVJBSE9UUExVR19QUk9DX0VOVFJZX0ZOICJwYXJhaG90cGx1ZyIKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcmFob3RwbHVnX3Byb2NfZGlyOworCitzdGF0aWMgTElTVF9IRUFEKEJ1c0luZm9MaXN0KTsKK3N0YXRpYyBMSVNUX0hFQUQoRGV2SW5mb0xpc3QpOworCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpQcm9jRGlyOworc3RhdGljIFZJU09SQ0hBTk5FTCAqQ29udHJvbFZtX2NoYW5uZWw7CisKK3N0YXRpYyBzc2l6ZV90IHZpc29yY2hpcHNldF9wcm9jX3JlYWRfd3JpdGVvbmx5KHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkJY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkJCXNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KTsKK3N0YXRpYyBzc2l6ZV90IHByb2NfcmVhZF9pbnN0YWxsZXIoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpOworc3RhdGljIHNzaXplX3QgcHJvY193cml0ZV9pbnN0YWxsZXIoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBzc2l6ZV90IHByb2NfcmVhZF90b29sYWN0aW9uKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCk7CitzdGF0aWMgc3NpemVfdCBwcm9jX3dyaXRlX3Rvb2xhY3Rpb24oc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHNzaXplX3QgcHJvY19yZWFkX2Jvb3RUb1Rvb2woc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KTsKK3N0YXRpYyBzc2l6ZV90IHByb2Nfd3JpdGVfYm9vdFRvVG9vbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2luc3RhbGxlcl9mb3BzID0geworCS5yZWFkID0gcHJvY19yZWFkX2luc3RhbGxlciwKKwkud3JpdGUgPSBwcm9jX3dyaXRlX2luc3RhbGxlciwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfdG9vbGFjdGlvbl9mb3BzID0geworCS5yZWFkID0gcHJvY19yZWFkX3Rvb2xhY3Rpb24sCisJLndyaXRlID0gcHJvY193cml0ZV90b29sYWN0aW9uLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19ib290VG9Ub29sX2ZvcHMgPSB7CisJLnJlYWQgPSBwcm9jX3JlYWRfYm9vdFRvVG9vbCwKKwkud3JpdGUgPSBwcm9jX3dyaXRlX2Jvb3RUb1Rvb2wsCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJVTggX19pb21lbSAqcHRyOwkvKiBwb2ludGVyIHRvIGJhc2UgYWRkcmVzcyBvZiBwYXlsb2FkIHBvb2wgKi8KKwlVNjQgb2Zmc2V0OwkJLyogb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIGNvbnRyb2x2bQorCQkJCSAqIGNoYW5uZWwgdG8gYmVnaW5uaW5nIG9mIHBheWxvYWQgKiBwb29sICovCisJVTMyIGJ5dGVzOwkJLyogbnVtYmVyIG9mIGJ5dGVzIGluIHBheWxvYWQgcG9vbCAqLworfSBDT05UUk9MVk1fUEFZTE9BRF9JTkZPOworCisvKiBNYW5hZ2VzIHRoZSByZXF1ZXN0IHBheWxvYWQgaW4gdGhlIGNvbnRyb2x2bSBjaGFubmVsICovCitzdGF0aWMgQ09OVFJPTFZNX1BBWUxPQURfSU5GTyBDb250cm9sVm1fcGF5bG9hZF9pbmZvOworCitzdGF0aWMgcENIQU5ORUxfSEVBREVSIFRlc3RfVm5pY19jaGFubmVsOworCit0eXBlZGVmIHN0cnVjdCB7CisJQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIER1bXBjYXB0dXJlX2hlYWRlcjsKKwlDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgR2V0dGV4dGR1bXBfaGVhZGVyOworCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBEdW1wY29tcGxldGVfaGVhZGVyOworCUJPT0wgR2V0dGV4dGR1bXBfb3V0c3RhbmRpbmc7CisJdTMyIGNyYzMyOworCXVsb25nIGxlbmd0aDsKKwlhdG9taWNfdCBidWZmZXJzX2luX3VzZTsKKwl1bG9uZyBkZXN0aW5hdGlvbjsKK30gTElWRURVTVBfSU5GTzsKKy8qIE1hbmFnZXMgdGhlIGluZm8gZm9yIGEgQ09OVFJPTFZNX0RVTVBfQ0FQVFVSRVNUQVRFIC8KKyAqIENPTlRST0xWTV9EVU1QX0dFVFRFWFREVU1QIC8gQ09OVFJPTFZNX0RVTVBfQ09NUExFVEUgY29udmVyc2F0aW9uLgorICovCitzdGF0aWMgTElWRURVTVBfSU5GTyBMaXZlRHVtcF9pbmZvOworCisvKiBUaGUgZm9sbG93aW5nIGdsb2JhbHMgYXJlIHVzZWQgdG8gaGFuZGxlIHRoZSBzY2VuYXJpbyB3aGVyZSB3ZSBhcmUgdW5hYmxlIHRvCisgKiBvZmZsb2FkIHRoZSBwYXlsb2FkIGZyb20gYSBjb250cm9sdm0gbWVzc2FnZSBkdWUgdG8gbWVtb3J5IHJlcXVpcmVtZW50cy4gIEluCisgKiB0aGlzIHNjZW5hcmlvLCB3ZSBzaW1wbHkgc3Rhc2ggdGhlIGNvbnRyb2x2bSBtZXNzYWdlLCB0aGVuIGF0dGVtcHQgdG8KKyAqIHByb2Nlc3MgaXQgYWdhaW4gdGhlIG5leHQgdGltZSBjb250cm9sdm1fcGVyaW9kaWNfd29yaygpIHJ1bnMuCisgKi8KK3N0YXRpYyBDT05UUk9MVk1fTUVTU0FHRSBDb250cm9sVm1fUGVuZGluZ19Nc2c7CitzdGF0aWMgQk9PTCBDb250cm9sVm1fUGVuZGluZ19Nc2dfVmFsaWQgPSBGQUxTRTsKKworLyogUG9vbCBvZiBzdHJ1Y3QgcHV0ZmlsZV9idWZmZXJfZW50cnksIGZvciBrZWVwaW5nIHRyYWNrIG9mIHBlbmRpbmcgKGluY29taW5nKQorICogVFJBTlNNSVRfRklMRSBQdXRGaWxlIHBheWxvYWRzLgorICovCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKlB1dGZpbGVfYnVmZmVyX2xpc3RfcG9vbDsKK3N0YXRpYyBjb25zdCBjaGFyIFB1dGZpbGVfYnVmZmVyX2xpc3RfcG9vbF9uYW1lW10gPQorCSJjb250cm9sdm1fcHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sIjsKKworLyogVGhpcyBpZGVudGlmaWVzIGEgZGF0YSBidWZmZXIgdGhhdCBoYXMgYmVlbiByZWNlaXZlZCB2aWEgYSBjb250cm9sdm0gbWVzc2FnZXMKKyAqIGluIGEgcmVtb3RlIC0tPiBsb2NhbCBDT05UUk9MVk1fVFJBTlNNSVRfRklMRSBjb252ZXJzYXRpb24uCisgKi8KK3N0cnVjdCBwdXRmaWxlX2J1ZmZlcl9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCBuZXh0OwkvKiBwdXRmaWxlX2J1ZmZlcl9lbnRyeSBsaXN0ICovCisJUEFSU0VSX0NPTlRFWFQgKnBhcnNlcl9jdHg7IC8qIHBvaW50cyB0byBidWZmZXIgY29udGFpbmluZyBpbnB1dCBkYXRhICovCit9OworCisvKiBMaXN0IG9mIHN0cnVjdCBwdXRmaWxlX3JlcXVlc3QgKiwgdmlhIG5leHRfcHV0ZmlsZV9yZXF1ZXN0IG1lbWJlci4KKyAqIEVhY2ggZW50cnkgaW4gdGhpcyBsaXN0IGlkZW50aWZpZXMgYW4gb3V0c3RhbmRpbmcgVFJBTlNNSVRfRklMRQorICogY29udmVyc2F0aW9uLgorICovCitzdGF0aWMgTElTVF9IRUFEKFB1dGZpbGVfcmVxdWVzdF9saXN0KTsKKworLyogVGhpcyBkZXNjcmliZXMgYSBidWZmZXIgYW5kIGl0cyBjdXJyZW50IHN0YXRlIG9mIHRyYW5zZmVyIChlLmcuLCBob3cgbWFueQorICogYnl0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc3VwcGxpZWQgYXMgcHV0ZmlsZSBkYXRhLCBhbmQgaG93IG1hbnkgYnl0ZXMgYXJlCisgKiByZW1haW5pbmcpIGZvciBhIHB1dGZpbGVfcmVxdWVzdC4KKyAqLworc3RydWN0IHB1dGZpbGVfYWN0aXZlX2J1ZmZlciB7CisJLyogYSBwYXlsb2FkIGZyb20gYSBjb250cm9sdm0gbWVzc2FnZSwgY29udGFpbmluZyBhIGZpbGUgZGF0YSBidWZmZXIgKi8KKwlQQVJTRVJfQ09OVEVYVCAqcGFyc2VyX2N0eDsKKwkvKiBwb2ludHMgd2l0aGluIGRhdGEgYXJlYSBvZiBwYXJzZXJfY3R4IHRvIG5leHQgYnl0ZSBvZiBkYXRhICovCisJdTggKnBuZXh0OworCS8qICMgYnl0ZXMgbGVmdCBmcm9tIDxwbmV4dD4gdG8gdGhlIGVuZCBvZiB0aGlzIGRhdGEgYnVmZmVyICovCisJc2l6ZV90IGJ5dGVzX3JlbWFpbmluZzsKK307CisKKyNkZWZpbmUgUFVURklMRV9SRVFVRVNUX1NJRyAweDA5MDYxMDEzMDIyODEyMTEKKy8qIFRoaXMgaWRlbnRpZmllcyBhIHNpbmdsZSByZW1vdGUgLS0+IGxvY2FsIENPTlRST0xWTV9UUkFOU01JVF9GSUxFCisgKiBjb252ZXJzYXRpb24uICBTdHJ1Y3RzIG9mIHRoaXMgdHlwZSBhcmUgZHluYW1pY2FsbHkgbGlua2VkIGludG8KKyAqIDxQdXRmaWxlX3JlcXVlc3RfbGlzdD4uCisgKi8KK3N0cnVjdCBwdXRmaWxlX3JlcXVlc3QgeworCXU2NCBzaWc7CQkvKiBQVVRGSUxFX1JFUVVFU1RfU0lHICovCisKKwkvKiBoZWFkZXIgZnJvbSBvcmlnaW5hbCBUcmFuc21pdEZpbGUgcmVxdWVzdCAqLworCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBjb250cm9sdm1faGVhZGVyOworCXU2NCBmaWxlX3JlcXVlc3RfbnVtYmVyOwkvKiBmcm9tIG9yaWdpbmFsIFRyYW5zbWl0RmlsZSByZXF1ZXN0ICovCisKKwkvKiBsaW5rIHRvIG5leHQgc3RydWN0IHB1dGZpbGVfcmVxdWVzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbmV4dF9wdXRmaWxlX3JlcXVlc3Q7CisKKwkvKiBtb3N0LXJlY2VudCBzZXF1ZW5jZSBudW1iZXIgc3VwcGxpZWQgdmlhIGEgY29udHJvbHZtIG1lc3NhZ2UgKi8KKwl1NjQgZGF0YV9zZXF1ZW5jZV9udW1iZXI7CisKKwkvKiBoZWFkIG9mIHB1dGZpbGVfYnVmZmVyX2VudHJ5IGxpc3QsIHdoaWNoIGRlc2NyaWJlcyB0aGUgZGF0YSB0byBiZQorCSAqIHN1cHBsaWVkIGFzIHB1dGZpbGUgZGF0YTsKKwkgKiAtIHRoaXMgbGlzdCBpcyBhZGRlZCB0byB3aGVuIGNvbnRyb2x2bSBtZXNzYWdlcyBjb21lIGluIHRoYXQgc3VwcGx5CisJICogZmlsZSBkYXRhCisJICogLSB0aGlzIGxpc3QgaXMgcmVtb3ZlZCBmcm9tIHZpYSB0aGUgaG90cGx1ZyBwcm9ncmFtIHRoYXQgaXMgYWN0dWFsbHkKKwkgKiBjb25zdW1pbmcgdGhlc2UgYnVmZmVycyB0byB3cml0ZSBhcyBmaWxlIGRhdGEgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGlucHV0X2J1ZmZlcl9saXN0OworCXNwaW5sb2NrX3QgcmVxX2xpc3RfbG9jazsJLyogbG9jayBmb3IgaW5wdXRfYnVmZmVyX2xpc3QgKi8KKworCS8qIHdhaXRlcnMgZm9yIGlucHV0X2J1ZmZlcl9saXN0IHRvIGdvIG5vbi1lbXB0eSAqLworCXdhaXRfcXVldWVfaGVhZF90IGlucHV0X2J1ZmZlcl93cTsKKworCS8qIGRhdGEgbm90IHlldCByZWFkIHdpdGhpbiBjdXJyZW50IHB1dGZpbGVfYnVmZmVyX2VudHJ5ICovCisJc3RydWN0IHB1dGZpbGVfYWN0aXZlX2J1ZmZlciBhY3RpdmVfYnVmOworCisJLyogPDAgPSBmYWlsZWQsIDAgPSBpbi1wcm9ncmVzcywgPjAgPSBzdWNjZXNzZnVsOyAqLworCS8qIG5vdGUgdGhhdCB0aGlzIG11c3QgYmUgc2V0IHdpdGggcmVxX2xpc3RfbG9jaywgYW5kIGlmIHlvdSBzZXQgPDAsICovCisJLyogaXQgaXMgeW91ciByZXNwb25zaWJpbGl0eSB0byBhbHNvIGZyZWUgdXAgYWxsIG9mIHRoZSBvdGhlciBvYmplY3RzICovCisJLyogaW4gdGhpcyBzdHJ1Y3QgKGxpa2UgaW5wdXRfYnVmZmVyX2xpc3QsIGFjdGl2ZV9idWYucGFyc2VyX2N0eCkgKi8KKwkvKiBiZWZvcmUgcmVsZWFzaW5nIHRoZSBsb2NrICovCisJaW50IGNvbXBsZXRpb25fc3RhdHVzOworfTsKKworc3RhdGljIGF0b21pY190IFZpc29yY2hpcHNldF9jYWNoZV9idWZmZXJzX2luX3VzZSA9IEFUT01JQ19JTklUKDApOworCitzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWludCBpZDsKKwl1bnNpZ25lZCBsb25nIGV4cGlyYXRpb247CisJQ09OVFJPTFZNX01FU1NBR0UgbXNnOworfTsKKworc3RhdGljIExJU1RfSEVBRChQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CS8qIGxvY2sgZm9yIGFib3ZlICovCitzdGF0aWMgdm9pZCBwYXJhaG90cGx1Z19wcm9jZXNzX2xpc3Qodm9pZCk7CisKKy8qIE1hbmFnZXMgdGhlIGluZm8gZm9yIGEgQ09OVFJPTFZNX0RVTVBfQ0FQVFVSRVNUQVRFIC8KKyAqIENPTlRST0xWTV9SRVBPUlRFVkVOVC4KKyAqLworc3RhdGljIFZJU09SQ0hJUFNFVF9CVVNERVZfTk9USUZJRVJTIEJ1c0Rldl9TZXJ2ZXJfTm90aWZpZXJzOworc3RhdGljIFZJU09SQ0hJUFNFVF9CVVNERVZfTk9USUZJRVJTIEJ1c0Rldl9DbGllbnRfTm90aWZpZXJzOworCitzdGF0aWMgdm9pZCBidXNfY3JlYXRlX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCBpbnQgcmVzcG9uc2UpOworc3RhdGljIHZvaWQgYnVzX2Rlc3Ryb3lfcmVzcG9uc2UodWxvbmcgYnVzTm8sIGludCByZXNwb25zZSk7CitzdGF0aWMgdm9pZCBkZXZpY2VfY3JlYXRlX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKTsKK3N0YXRpYyB2b2lkIGRldmljZV9kZXN0cm95X3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKTsKK3N0YXRpYyB2b2lkIGRldmljZV9yZXN1bWVfcmVzcG9uc2UodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpOworCitzdGF0aWMgVklTT1JDSElQU0VUX0JVU0RFVl9SRVNQT05ERVJTIEJ1c0Rldl9SZXNwb25kZXJzID0geworCS5idXNfY3JlYXRlID0gYnVzX2NyZWF0ZV9yZXNwb25zZSwKKwkuYnVzX2Rlc3Ryb3kgPSBidXNfZGVzdHJveV9yZXNwb25zZSwKKwkuZGV2aWNlX2NyZWF0ZSA9IGRldmljZV9jcmVhdGVfcmVzcG9uc2UsCisJLmRldmljZV9kZXN0cm95ID0gZGV2aWNlX2Rlc3Ryb3lfcmVzcG9uc2UsCisJLmRldmljZV9wYXVzZSA9IHZpc29yY2hpcHNldF9kZXZpY2VfcGF1c2VfcmVzcG9uc2UsCisJLmRldmljZV9yZXN1bWUgPSBkZXZpY2VfcmVzdW1lX3Jlc3BvbnNlLAorfTsKKworLyogaW5mbyBmb3IgL2Rldi92aXNvcmNoaXBzZXQgKi8KK3N0YXRpYyBkZXZfdCBNYWpvckRldiA9IC0xOyAvKio8IGluZGljYXRlcyBtYWpvciBudW0gZm9yIGRldmljZSAqLworCisvKiAvc3lzL2RldmljZXMvcGxhdGZvcm0vdmlzb3JjaGlwc2V0ICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBWaXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlID0geworCS5uYW1lID0gInZpc29yY2hpcHNldCIsCisJLmlkID0gLTEsCit9OworCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCitzdGF0aWMgdm9pZCBjb250cm9sdm1fcmVzcG9uZChDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwgaW50IHJlc3BvbnNlKTsKK3N0YXRpYyB2b2lkIGNvbnRyb2x2bV9yZXNwb25kX2NoaXBzZXRfaW5pdChDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwKKwkJCQkJICAgaW50IHJlc3BvbnNlLAorCQkJCQkgICBVTFRSQV9DSElQU0VUX0ZFQVRVUkUgZmVhdHVyZXMpOworc3RhdGljIHZvaWQgY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZShDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKgorCQkJCQkJICBtc2dIZHIsIGludCByZXNwb25zZSwKKwkJCQkJCSAgVUxUUkFfU0VHTUVOVF9TVEFURSBzdGF0ZSk7CisKK3N0YXRpYyB2b2lkCitzaG93X3BhcnRpdGlvbl9wcm9wZXJ0eShzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKmN0eCwgaW50IHByb3BlcnR5KQoreworCVZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqaW5mbyA9IChWSVNPUkNISVBTRVRfQlVTX0lORk8gKikgKGN0eCk7CisKKwlzd2l0Y2ggKHByb3BlcnR5KSB7CisJY2FzZSBQQVJUUFJPUF9uYW1lOgorCQlzZXFfcHJpbnRmKGYsICIlc1xuIiwgTk9OVUxMU1RSKGluZm8tPm5hbWUpKTsKKwkJYnJlYWs7CisJY2FzZSBQQVJUUFJPUF9kZXNjcmlwdGlvbjoKKwkJc2VxX3ByaW50ZihmLCAiJXNcbiIsIE5PTlVMTFNUUihpbmZvLT5kZXNjcmlwdGlvbikpOworCQlicmVhazsKKwljYXNlIFBBUlRQUk9QX2hhbmRsZToKKwkJc2VxX3ByaW50ZihmLCAiMHglLTE2LjE2THhcbiIsIGluZm8tPnBhcnRpdGlvbkhhbmRsZSk7CisJCWJyZWFrOworCWNhc2UgUEFSVFBST1BfYnVzTnVtYmVyOgorCQlzZXFfcHJpbnRmKGYsICIlZFxuIiwgaW5mby0+YnVzTm8pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZXFfcHJpbnRmKGYsICIoJWQ/PylcbiIsIHByb3BlcnR5KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAorc2hvd19jb250cm9sdm1fcHJvcGVydHkoc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICpjdHgsIGludCBwcm9wZXJ0eSkKK3sKKwkvKiBOb3RlOiBjdHggaXMgbm90IG5lZWRlZCBzaW5jZSB3ZSBvbmx5IGhhdmUgMSBjb250cm9sdm0gY2hhbm5lbCAqLworCXN3aXRjaCAocHJvcGVydHkpIHsKKwljYXNlIENUTFZNUFJPUF9waHlzQWRkcjoKKwkJaWYgKENvbnRyb2xWbV9jaGFubmVsID09IE5VTEwpCisJCQlzZXFfcHV0cyhmLCAiMHgwXG4iKTsKKwkJZWxzZQorCQkJc2VxX3ByaW50ZihmLCAiMHglLTE2LjE2THhcbiIsCisJCQkJICAgdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcgorCQkJCSAgIChDb250cm9sVm1fY2hhbm5lbCkpOworCQlicmVhazsKKwljYXNlIENUTFZNUFJPUF9jb250cm9sQ2hhbm5lbEFkZHI6CisJCWlmIChDb250cm9sVm1fY2hhbm5lbCA9PSBOVUxMKQorCQkJc2VxX3B1dHMoZiwgIjB4MFxuIik7CisJCWVsc2UgeworCQkJR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBhZGRyID0gMDsKKwkJCXZpc29yY2hhbm5lbF9yZWFkKENvbnRyb2xWbV9jaGFubmVsLAorCQkJCQkgIG9mZnNldG9mCisJCQkJCSAgKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCQkgICBncENvbnRyb2xDaGFubmVsKSwgJmFkZHIsCisJCQkJCSAgc2l6ZW9mKGFkZHIpKTsKKwkJCXNlcV9wcmludGYoZiwgIjB4JS0xNi4xNkx4XG4iLCAodTY0KSAoYWRkcikpOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1RMVk1QUk9QX2NvbnRyb2xDaGFubmVsQnl0ZXM6CisJCWlmIChDb250cm9sVm1fY2hhbm5lbCA9PSBOVUxMKQorCQkJc2VxX3B1dHMoZiwgIjB4MFxuIik7CisJCWVsc2UgeworCQkJVTMyIGJ5dGVzID0gMDsKKwkJCXZpc29yY2hhbm5lbF9yZWFkKENvbnRyb2xWbV9jaGFubmVsLAorCQkJCQkgIG9mZnNldG9mCisJCQkJCSAgKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCQkgICBDb250cm9sQ2hhbm5lbEJ5dGVzKSwgJmJ5dGVzLAorCQkJCQkgIHNpemVvZihieXRlcykpOworCQkJc2VxX3ByaW50ZihmLCAiJWx1XG4iLCAodWxvbmcpIChieXRlcykpOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1RMVk1QUk9QX3NwYXJCb290UGFydDoKKwkJc2VxX3B1dHMoZiwgIjA6MDowOjAvMVxuIik7CisJCWJyZWFrOworCWNhc2UgQ1RMVk1QUk9QX3NwYXJTdG9yYWdlUGFydDoKKwkJc2VxX3B1dHMoZiwgIjA6MDowOjAvMlxuIik7CisJCWJyZWFrOworCWNhc2UgQ1RMVk1QUk9QX2xpdmVkdW1wTGVuZ3RoOgorCQlzZXFfcHJpbnRmKGYsICIlbHVcbiIsIExpdmVEdW1wX2luZm8ubGVuZ3RoKTsKKwkJYnJlYWs7CisJY2FzZSBDVExWTVBST1BfbGl2ZWR1bXBDcmMzMjoKKwkJc2VxX3ByaW50ZihmLCAiJWx1XG4iLCAodWxvbmcpIExpdmVEdW1wX2luZm8uY3JjMzIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZXFfcHJpbnRmKGYsICIoJWQ/PylcbiIsIHByb3BlcnR5KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJvY19Jbml0KHZvaWQpCit7CisJaWYgKFByb2NEaXIgPT0gTlVMTCkgeworCQlQcm9jRGlyID0gcHJvY19ta2RpcihNWURSVk5BTUUsIE5VTEwpOworCQlpZiAoUHJvY0RpciA9PSBOVUxMKSB7CisJCQlMT0dFUlIoImZhaWxlZCB0byBjcmVhdGUgL3Byb2MgZGlyZWN0b3J5ICVzIiwKKwkJCSAgICAgICBNWURSVk5BTUUpOworCQkJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRkFJTFVSRV9QQywKKwkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jX0RlSW5pdCh2b2lkKQoreworCWlmIChQcm9jRGlyICE9IE5VTEwpCisJCXJlbW92ZV9wcm9jX2VudHJ5KE1ZRFJWTkFNRSwgTlVMTCk7CisJUHJvY0RpciA9IE5VTEw7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAordGVzdFVuaWNvZGUodm9pZCkKK3sKKwl3Y2hhcl90IHVuaWNvZGVTdHJpbmdbXSA9IHsgJ2EnLCAnYicsICdjJywgMCB9OworCWNoYXIgc1tzaXplb2YodW5pY29kZVN0cmluZykgKiBOTFNfTUFYX0NIQVJTRVRfU0laRV07CisJd2NoYXJfdCB1bmljb2RlMls5OV07CisKKwkvKiBOT1RFOiBFaXRoZXIgZHVlIHRvIGEgYnVnLCBvciBmZWF0dXJlIEkgZG9uJ3QgdW5kZXJzdGFuZCwgdGhlCisJICogICAgICAga2VybmVsIHV0ZjhfbWJzdG93Y3MoKSBhbmQgdXRmX3djc3RvbWJzKCkgZG8gTk9UIGNvcHkgdGhlCisJICogICAgICAgdHJhaWxlZCBOVUwgYnl0ZSEhICAgUkVBTExZISEhISEgICAgQXJycnJnZ2dnaGhoaGgKKwkgKi8KKworCUxPR0lORigic2l6ZW9mKHdjaGFyX3QpID0gJWQiLCBzaXplb2Yod2NoYXJfdCkpOworCUxPR0lORigidXRmOF93Y3N0b21icz0lZCIsCisJICAgICAgIGNocnMgPSB1dGY4X3djc3RvbWJzKHMsIHVuaWNvZGVTdHJpbmcsIHNpemVvZihzKSkpOworCWlmIChjaHJzID49IDApCisJCXNbY2hyc10gPSAnXDAnOwkvKiBHUlJSUlJSUlIgKi8KKwlMT0dJTkYoInM9JyVzJyIsIHMpOworCUxPR0lORigidXRmOF9tYnN0b3djcz0lZCIsIGNocnMgPSB1dGY4X21ic3Rvd2NzKHVuaWNvZGUyLCBzLCAxMDApKTsKKwlpZiAoY2hycyA+PSAwKQorCQl1bmljb2RlMltjaHJzXSA9IDA7CS8qIEdSUlJSUlJSUiAqLworCWlmIChtZW1jbXAodW5pY29kZVN0cmluZywgdW5pY29kZTIsIHNpemVvZih1bmljb2RlU3RyaW5nKSkgPT0gMCkKKwkJTE9HSU5GKCJzdHJpbmdzIG1hdGNoLi4uIGdvb2QiKTsKKwllbHNlCisJCUxPR0lORigic3RyaW5ncyBkaWQgbm90IG1hdGNoISEiKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorYnVzSW5mb19jbGVhcih2b2lkICp2KQoreworCVZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqcCA9IChWSVNPUkNISVBTRVRfQlVTX0lORk8gKikgKHYpOworCisJaWYgKHAtPnByb2NPYmplY3QpIHsKKwkJdmlzb3JfcHJvY19EZXN0cm95T2JqZWN0KHAtPnByb2NPYmplY3QpOworCQlwLT5wcm9jT2JqZWN0ID0gTlVMTDsKKwl9CisJa2ZyZWUocC0+bmFtZSk7CisJcC0+bmFtZSA9IE5VTEw7CisKKwlrZnJlZShwLT5kZXNjcmlwdGlvbik7CisJcC0+ZGVzY3JpcHRpb24gPSBOVUxMOworCisJcC0+c3RhdGUuY3JlYXRlZCA9IDA7CisJbWVtc2V0KHAsIDAsIHNpemVvZihWSVNPUkNISVBTRVRfQlVTX0lORk8pKTsKK30KKworc3RhdGljIHZvaWQKK2RldkluZm9fY2xlYXIodm9pZCAqdikKK3sKKwlWSVNPUkNISVBTRVRfREVWSUNFX0lORk8gKnAgPSAoVklTT1JDSElQU0VUX0RFVklDRV9JTkZPICopICh2KTsKKwlwLT5zdGF0ZS5jcmVhdGVkID0gMDsKKwltZW1zZXQocCwgMCwgc2l6ZW9mKFZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTykpOworfQorCitzdGF0aWMgVTgKK2NoZWNrX2NoaXBzZXRfZXZlbnRzKHZvaWQpCit7CisJaW50IGk7CisJVTggc2VuZF9tc2cgPSAxOworCS8qIENoZWNrIGV2ZW50cyB0byBkZXRlcm1pbmUgaWYgcmVzcG9uc2Ugc2hvdWxkIGJlIHNlbnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NISVBTRVRfRVZFTlRTOyBpKyspCisJCXNlbmRfbXNnICY9IGNoaXBzZXRfZXZlbnRzW2ldOworCXJldHVybiBzZW5kX21zZzsKK30KKworc3RhdGljIHZvaWQKK2NsZWFyX2NoaXBzZXRfZXZlbnRzKHZvaWQpCit7CisJaW50IGk7CisJLyogQ2xlYXIgY2hpcHNldF9ldmVudHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NISVBTRVRfRVZFTlRTOyBpKyspCisJCWNoaXBzZXRfZXZlbnRzW2ldID0gMDsKK30KKwordm9pZAordmlzb3JjaGlwc2V0X3JlZ2lzdGVyX2J1c2Rldl9zZXJ2ZXIoVklTT1JDSElQU0VUX0JVU0RFVl9OT1RJRklFUlMgKm5vdGlmaWVycywKKwkJCQkgICAgVklTT1JDSElQU0VUX0JVU0RFVl9SRVNQT05ERVJTICpyZXNwb25kZXJzLAorCQkJCSAgICBVTFRSQV9WQlVTX0RFVklDRUlORk8gKmRyaXZlckluZm8pCit7CisJTE9DS1NFTV9VTklOVEVSUlVQVElCTEUoJk5vdGlmaWVyTG9jayk7CisJaWYgKG5vdGlmaWVycyA9PSBOVUxMKSB7CisJCW1lbXNldCgmQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMsIDAsCisJCSAgICAgICBzaXplb2YoQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMpKTsKKwkJc2VydmVycmVnaXN0ZXJlZCA9IDA7CS8qIGNsZWFyIGZsYWcgKi8KKwl9IGVsc2UgeworCQlCdXNEZXZfU2VydmVyX05vdGlmaWVycyA9ICpub3RpZmllcnM7CisJCXNlcnZlcnJlZ2lzdGVyZWQgPSAxOwkvKiBzZXQgZmxhZyAqLworCX0KKwlpZiAocmVzcG9uZGVycykKKwkJKnJlc3BvbmRlcnMgPSBCdXNEZXZfUmVzcG9uZGVyczsKKwlpZiAoZHJpdmVySW5mbykKKwkJQnVzRGV2aWNlSW5mb19Jbml0KGRyaXZlckluZm8sICJjaGlwc2V0IiwgInZpc29yY2hpcHNldCIsCisJCQkJICAgVkVSU0lPTiwgTlVMTCwgX19EQVRFX18sIF9fVElNRV9fKTsKKworCVVOTE9DS1NFTSgmTm90aWZpZXJMb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hpcHNldF9yZWdpc3Rlcl9idXNkZXZfc2VydmVyKTsKKwordm9pZAordmlzb3JjaGlwc2V0X3JlZ2lzdGVyX2J1c2Rldl9jbGllbnQoVklTT1JDSElQU0VUX0JVU0RFVl9OT1RJRklFUlMgKm5vdGlmaWVycywKKwkJCQkgICAgVklTT1JDSElQU0VUX0JVU0RFVl9SRVNQT05ERVJTICpyZXNwb25kZXJzLAorCQkJCSAgICBVTFRSQV9WQlVTX0RFVklDRUlORk8gKmRyaXZlckluZm8pCit7CisJTE9DS1NFTV9VTklOVEVSUlVQVElCTEUoJk5vdGlmaWVyTG9jayk7CisJaWYgKG5vdGlmaWVycyA9PSBOVUxMKSB7CisJCW1lbXNldCgmQnVzRGV2X0NsaWVudF9Ob3RpZmllcnMsIDAsCisJCSAgICAgICBzaXplb2YoQnVzRGV2X0NsaWVudF9Ob3RpZmllcnMpKTsKKwkJY2xpZW50cmVnaXN0ZXJlZCA9IDA7CS8qIGNsZWFyIGZsYWcgKi8KKwl9IGVsc2UgeworCQlCdXNEZXZfQ2xpZW50X05vdGlmaWVycyA9ICpub3RpZmllcnM7CisJCWNsaWVudHJlZ2lzdGVyZWQgPSAxOwkvKiBzZXQgZmxhZyAqLworCX0KKwlpZiAocmVzcG9uZGVycykKKwkJKnJlc3BvbmRlcnMgPSBCdXNEZXZfUmVzcG9uZGVyczsKKwlpZiAoZHJpdmVySW5mbykKKwkJQnVzRGV2aWNlSW5mb19Jbml0KGRyaXZlckluZm8sICJjaGlwc2V0KGJvbHRzKSIsICJ2aXNvcmNoaXBzZXQiLAorCQkJCSAgIFZFUlNJT04sIE5VTEwsIF9fREFURV9fLCBfX1RJTUVfXyk7CisJVU5MT0NLU0VNKCZOb3RpZmllckxvY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X3JlZ2lzdGVyX2J1c2Rldl9jbGllbnQpOworCitzdGF0aWMgdm9pZAorY2xlYW51cF9jb250cm9sdm1fc3RydWN0dXJlcyh2b2lkKQoreworCVZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqYmk7CisJVklTT1JDSElQU0VUX0RFVklDRV9JTkZPICpkaTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmksICZCdXNJbmZvTGlzdCwgZW50cnkpIHsKKwkJYnVzSW5mb19jbGVhcihiaSk7CisJCWxpc3RfZGVsKCZiaS0+ZW50cnkpOworCQlrZnJlZShiaSk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkaSwgJkRldkluZm9MaXN0LCBlbnRyeSkgeworCQlkZXZJbmZvX2NsZWFyKGRpKTsKKwkJbGlzdF9kZWwoJmRpLT5lbnRyeSk7CisJCWtmcmVlKGRpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjaGlwc2V0X2luaXQoQ09OVFJPTFZNX01FU1NBR0UgKmlubXNnKQoreworCXN0YXRpYyBpbnQgY2hpcHNldF9pbml0ZWQ7CisJVUxUUkFfQ0hJUFNFVF9GRUFUVVJFIGZlYXR1cmVzID0gMDsKKwlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworCisJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRU5UUllfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCWlmIChjaGlwc2V0X2luaXRlZCkgeworCQlMT0dFUlIoIkNPTlRST0xWTV9DSElQU0VUX0lOSVQgRmFpbGVkOiBBbHJlYWR5IERvbmUuIik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKKwkJZ290byBBd2F5OworCX0KKwljaGlwc2V0X2luaXRlZCA9IDE7CisJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisKKwkvKiBTZXQgZmVhdHVyZXMgdG8gaW5kaWNhdGUgd2Ugc3VwcG9ydCBwYXJhaG90cGx1ZyAoaWYgQ29tbWFuZAorCSAqIGFsc28gc3VwcG9ydHMgaXQpLiAqLworCWZlYXR1cmVzID0KKwkgICAgaW5tc2ctPmNtZC5pbml0Q2hpcHNldC4KKwkgICAgZmVhdHVyZXMgJiBVTFRSQV9DSElQU0VUX0ZFQVRVUkVfUEFSQV9IT1RQTFVHOworCisJLyogU2V0IHRoZSAicmVwbHkiIGJpdCBzbyBDb21tYW5kIGtub3dzIHRoaXMgaXMgYQorCSAqIGZlYXR1cmVzLWF3YXJlIGRyaXZlci4gKi8KKwlmZWF0dXJlcyB8PSBVTFRSQV9DSElQU0VUX0ZFQVRVUkVfUkVQTFk7CisKK0F3YXk6CisJaWYgKHJjIDwgMCkKKwkJY2xlYW51cF9jb250cm9sdm1fc3RydWN0dXJlcygpOworCWlmIChpbm1zZy0+aGRyLkZsYWdzLnJlc3BvbnNlRXhwZWN0ZWQpCisJCWNvbnRyb2x2bV9yZXNwb25kX2NoaXBzZXRfaW5pdCgmaW5tc2ctPmhkciwgcmMsIGZlYXR1cmVzKTsKK30KKworc3RhdGljIHZvaWQKK2NvbnRyb2x2bV9pbml0X3Jlc3BvbnNlKENPTlRST0xWTV9NRVNTQUdFICptc2csCisJCQlDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwgaW50IHJlc3BvbnNlKQoreworCW1lbXNldChtc2csIDAsIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRSkpOworCW1lbWNweSgmbXNnLT5oZHIsIG1zZ0hkciwgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUikpOworCW1zZy0+aGRyLlBheWxvYWRCeXRlcyA9IDA7CisJbXNnLT5oZHIuUGF5bG9hZFZtT2Zmc2V0ID0gMDsKKwltc2ctPmhkci5QYXlsb2FkTWF4Qnl0ZXMgPSAwOworCWlmIChyZXNwb25zZSA8IDApIHsKKwkJbXNnLT5oZHIuRmxhZ3MuZmFpbGVkID0gMTsKKwkJbXNnLT5oZHIuQ29tcGxldGlvblN0YXR1cyA9IChVMzIpICgtcmVzcG9uc2UpOworCX0KK30KKworc3RhdGljIHZvaWQKK2NvbnRyb2x2bV9yZXNwb25kKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyLCBpbnQgcmVzcG9uc2UpCit7CisJQ09OVFJPTFZNX01FU1NBR0Ugb3V0bXNnOworCWlmICghQ29udHJvbFZtX2NoYW5uZWwpCisJCXJldHVybjsKKwljb250cm9sdm1faW5pdF9yZXNwb25zZSgmb3V0bXNnLCBtc2dIZHIsIHJlc3BvbnNlKTsKKwkvKiBGb3IgRGlhZ1Bvb2wgY2hhbm5lbCBERVZJQ0VfQ0hBTkdFU1RBVEUsIHdlIG5lZWQgdG8gc2VuZAorCSogYmFjayB0aGUgZGV2aWNlQ2hhbmdlU3RhdGUgc3RydWN0dXJlIGluIHRoZSBwYWNrZXQuICovCisJaWYgKG1zZ0hkci0+SWQgPT0gQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURQorCSAgICAmJiBnX0RldmljZUNoYW5nZVN0YXRlUGFja2V0LmRldmljZUNoYW5nZVN0YXRlLmJ1c05vID09CisJICAgIGdfZGlhZ3Bvb2xCdXNObworCSAgICAmJiBnX0RldmljZUNoYW5nZVN0YXRlUGFja2V0LmRldmljZUNoYW5nZVN0YXRlLmRldk5vID09CisJICAgIGdfZGlhZ3Bvb2xEZXZObykKKwkJb3V0bXNnLmNtZCA9IGdfRGV2aWNlQ2hhbmdlU3RhdGVQYWNrZXQ7CisJaWYgKG91dG1zZy5oZHIuRmxhZ3MudGVzdE1lc3NhZ2UgPT0gMSkgeworCQlMT0dJTkYoIiVzIGNvbnRyb2x2bV9tc2c9MHgleCByZXNwb25zZT0lZCBmb3IgdGVzdCBtZXNzYWdlIiwKKwkJICAgICAgIF9fZnVuY19fLCBvdXRtc2cuaGRyLklkLCByZXNwb25zZSk7CisJCXJldHVybjsKKwl9CisJaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KENvbnRyb2xWbV9jaGFubmVsLAorCQkJCSAgICAgICBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVCwgJm91dG1zZykpIHsKKwkJTE9HRVJSKCJzaWduYWxpbnNlcnQgZmFpbGVkISIpOworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgdm9pZAorY29udHJvbHZtX3Jlc3BvbmRfY2hpcHNldF9pbml0KENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyLCBpbnQgcmVzcG9uc2UsCisJCQkgICAgICAgVUxUUkFfQ0hJUFNFVF9GRUFUVVJFIGZlYXR1cmVzKQoreworCUNPTlRST0xWTV9NRVNTQUdFIG91dG1zZzsKKwlpZiAoIUNvbnRyb2xWbV9jaGFubmVsKQorCQlyZXR1cm47CisJY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJm91dG1zZywgbXNnSGRyLCByZXNwb25zZSk7CisJb3V0bXNnLmNtZC5pbml0Q2hpcHNldC5mZWF0dXJlcyA9IGZlYXR1cmVzOworCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChDb250cm9sVm1fY2hhbm5lbCwKKwkJCQkgICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKSB7CisJCUxPR0VSUigic2lnbmFsaW5zZXJ0IGZhaWxlZCEiKTsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQKK2NvbnRyb2x2bV9yZXNwb25kX3BoeXNkZXZfY2hhbmdlc3RhdGUoQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSICptc2dIZHIsCisJCQkJICAgICAgaW50IHJlc3BvbnNlLCBVTFRSQV9TRUdNRU5UX1NUQVRFIHN0YXRlKQoreworCUNPTlRST0xWTV9NRVNTQUdFIG91dG1zZzsKKwlpZiAoIUNvbnRyb2xWbV9jaGFubmVsKQorCQlyZXR1cm47CisJY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJm91dG1zZywgbXNnSGRyLCByZXNwb25zZSk7CisJb3V0bXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5zdGF0ZSA9IHN0YXRlOworCW91dG1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuZmxhZ3MucGh5c2ljYWxEZXZpY2UgPSAxOworCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChDb250cm9sVm1fY2hhbm5lbCwKKwkJCQkgICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKSB7CisJCUxPR0VSUigic2lnbmFsaW5zZXJ0IGZhaWxlZCEiKTsKKwkJcmV0dXJuOworCX0KK30KKwordm9pZAordmlzb3JjaGlwc2V0X3NhdmVfbWVzc2FnZShDT05UUk9MVk1fTUVTU0FHRSAqbXNnLCBDUkFTSF9PQkpfVFlQRSB0eXBlKQoreworCVUzMiBsb2NhbFNhdmVkQ3Jhc2hNc2dPZmZzZXQ7CisJVTE2IGxvY2FsU2F2ZWRDcmFzaE1zZ0NvdW50OworCisJLyogZ2V0IHNhdmVkIG1lc3NhZ2UgY291bnQgKi8KKwlpZiAodmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgICAgICBvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwKKwkJCQkgICAgICAgU2F2ZWRDcmFzaE1zZ0NvdW50KSwKKwkJCSAgICAgICZsb2NhbFNhdmVkQ3Jhc2hNc2dDb3VudCwgc2l6ZW9mKFUxNikpIDwgMCkgeworCQlMT0dFUlIoImZhaWxlZCB0byBnZXQgU2F2ZWQgTWVzc2FnZSBDb3VudCIpOworCQlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9DVFJMX1JEX0ZBSUxVUkVfUEMsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisKKwlpZiAobG9jYWxTYXZlZENyYXNoTXNnQ291bnQgIT0gQ09OVFJPTFZNX0NSQVNITVNHX01BWCkgeworCQlMT0dFUlIoIlNhdmVkIE1lc3NhZ2UgQ291bnQgaW5jb3JyZWN0ICVkIiwKKwkJICAgICAgIGxvY2FsU2F2ZWRDcmFzaE1zZ0NvdW50KTsKKwkJUE9TVENPREVfTElOVVhfMyhDUkFTSF9ERVZfQ09VTlRfRkFJTFVSRV9QQywKKwkJCQkgbG9jYWxTYXZlZENyYXNoTXNnQ291bnQsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisKKwkvKiBnZXQgc2F2ZWQgY3Jhc2ggbWVzc2FnZSBvZmZzZXQgKi8KKwlpZiAodmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgICAgICBvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwKKwkJCQkgICAgICAgU2F2ZWRDcmFzaE1zZ09mZnNldCksCisJCQkgICAgICAmbG9jYWxTYXZlZENyYXNoTXNnT2Zmc2V0LCBzaXplb2YoVTMyKSkgPCAwKSB7CisJCUxPR0VSUigiZmFpbGVkIHRvIGdldCBTYXZlZCBNZXNzYWdlIE9mZnNldCIpOworCQlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9DVFJMX1JEX0ZBSUxVUkVfUEMsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisKKwlpZiAodHlwZSA9PSBDUkFTSF9idXMpIHsKKwkJaWYgKHZpc29yY2hhbm5lbF93cml0ZShDb250cm9sVm1fY2hhbm5lbCwKKwkJCQkgICAgICAgbG9jYWxTYXZlZENyYXNoTXNnT2Zmc2V0LAorCQkJCSAgICAgICBtc2csIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRSkpIDwgMCkgeworCQkJTE9HRVJSKCJTQVZFX01TR19CVVNfRkFJTFVSRTogRmFpbGVkIHRvIHdyaXRlIENyYXNoQ3JlYXRlQnVzTXNnISIpOworCQkJUE9TVENPREVfTElOVVhfMihTQVZFX01TR19CVVNfRkFJTFVSRV9QQywKKwkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQlpZiAodmlzb3JjaGFubmVsX3dyaXRlKENvbnRyb2xWbV9jaGFubmVsLAorCQkJCSAgICAgICBsb2NhbFNhdmVkQ3Jhc2hNc2dPZmZzZXQgKworCQkJCSAgICAgICBzaXplb2YoQ09OVFJPTFZNX01FU1NBR0UpLCBtc2csCisJCQkJICAgICAgIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRSkpIDwgMCkgeworCQkJTE9HRVJSKCJTQVZFX01TR19ERVZfRkFJTFVSRTogRmFpbGVkIHRvIHdyaXRlIENyYXNoQ3JlYXRlRGV2TXNnISIpOworCQkJUE9TVENPREVfTElOVVhfMihTQVZFX01TR19ERVZfRkFJTFVSRV9QQywKKwkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoaXBzZXRfc2F2ZV9tZXNzYWdlKTsKKworc3RhdGljIHZvaWQKK2J1c19yZXNwb25kZXIoQ09OVFJPTFZNX0lEIGNtZElkLCB1bG9uZyBidXNObywgaW50IHJlc3BvbnNlKQoreworCVZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqcCA9IE5VTEw7CisJQk9PTCBuZWVkX2NsZWFyID0gRkFMU0U7CisKKwlwID0gZmluZGJ1cygmQnVzSW5mb0xpc3QsIGJ1c05vKTsKKwlpZiAoIXApIHsKKwkJTE9HRVJSKCJpbnRlcm5hbCBlcnJvciBidXNObz0lbHUiLCBidXNObyk7CisJCXJldHVybjsKKwl9CisJaWYgKHJlc3BvbnNlIDwgMCkgeworCQlpZiAoKGNtZElkID09IENPTlRST0xWTV9CVVNfQ1JFQVRFKSAmJgorCQkgICAgKHJlc3BvbnNlICE9ICgtQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FKSkpCisJCQkvKiB1bmRvIHRoZSByb3cgd2UganVzdCBjcmVhdGVkLi4uICovCisJCQlkZWxidXNkZXZpY2VzKCZEZXZJbmZvTGlzdCwgYnVzTm8pOworCX0gZWxzZSB7CisJCWlmIChjbWRJZCA9PSBDT05UUk9MVk1fQlVTX0NSRUFURSkKKwkJCXAtPnN0YXRlLmNyZWF0ZWQgPSAxOworCQlpZiAoY21kSWQgPT0gQ09OVFJPTFZNX0JVU19ERVNUUk9ZKQorCQkJbmVlZF9jbGVhciA9IFRSVUU7CisJfQorCisJaWYgKHAtPnBlbmRpbmdNc2dIZHIuSWQgPT0gQ09OVFJPTFZNX0lOVkFMSUQpIHsKKwkJTE9HRVJSKCJidXNfcmVzcG9uZGVyIG5vIHBlbmRpbmcgbXNnIik7CisJCXJldHVybjsJCS8qIG5vIGNvbnRyb2x2bSByZXNwb25zZSBuZWVkZWQgKi8KKwl9CisJaWYgKHAtPnBlbmRpbmdNc2dIZHIuSWQgIT0gKFUzMikgY21kSWQpIHsKKwkJTE9HRVJSKCJleHBlY3RlZD0lZCwgZm91bmQ9JWQiLCBjbWRJZCwgcC0+cGVuZGluZ01zZ0hkci5JZCk7CisJCXJldHVybjsKKwl9CisJY29udHJvbHZtX3Jlc3BvbmQoJnAtPnBlbmRpbmdNc2dIZHIsIHJlc3BvbnNlKTsKKwlwLT5wZW5kaW5nTXNnSGRyLklkID0gQ09OVFJPTFZNX0lOVkFMSUQ7CisJaWYgKG5lZWRfY2xlYXIpIHsKKwkJYnVzSW5mb19jbGVhcihwKTsKKwkJZGVsYnVzZGV2aWNlcygmRGV2SW5mb0xpc3QsIGJ1c05vKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitkZXZpY2VfY2hhbmdlc3RhdGVfcmVzcG9uZGVyKENPTlRST0xWTV9JRCBjbWRJZCwKKwkJCSAgICAgdWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UsCisJCQkgICAgIFVMVFJBX1NFR01FTlRfU1RBVEUgcmVzcG9uc2VTdGF0ZSkKK3sKKwlWSVNPUkNISVBTRVRfREVWSUNFX0lORk8gKnAgPSBOVUxMOworCUNPTlRST0xWTV9NRVNTQUdFIG91dG1zZzsKKworCWlmICghQ29udHJvbFZtX2NoYW5uZWwpCisJCXJldHVybjsKKworCXAgPSBmaW5kZGV2aWNlKCZEZXZJbmZvTGlzdCwgYnVzTm8sIGRldk5vKTsKKwlpZiAoIXApIHsKKwkJTE9HRVJSKCJpbnRlcm5hbCBlcnJvcjsgYnVzTm89JWx1LCBkZXZObz0lbHUiLCBidXNObywgZGV2Tm8pOworCQlyZXR1cm47CisJfQorCWlmIChwLT5wZW5kaW5nTXNnSGRyLklkID09IENPTlRST0xWTV9JTlZBTElEKSB7CisJCUxPR0VSUigiZGV2aWNlX3Jlc3BvbmRlciBubyBwZW5kaW5nIG1zZyIpOworCQlyZXR1cm47CQkvKiBubyBjb250cm9sdm0gcmVzcG9uc2UgbmVlZGVkICovCisJfQorCWlmIChwLT5wZW5kaW5nTXNnSGRyLklkICE9IGNtZElkKSB7CisJCUxPR0VSUigiZXhwZWN0ZWQ9JWQsIGZvdW5kPSVkIiwgY21kSWQsIHAtPnBlbmRpbmdNc2dIZHIuSWQpOworCQlyZXR1cm47CisJfQorCisJY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJm91dG1zZywgJnAtPnBlbmRpbmdNc2dIZHIsIHJlc3BvbnNlKTsKKworCW91dG1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuYnVzTm8gPSBidXNObzsKKwlvdXRtc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLmRldk5vID0gZGV2Tm87CisJb3V0bXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5zdGF0ZSA9IHJlc3BvbnNlU3RhdGU7CisKKwlpZiAoIXZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkJICAgICAgIENPTlRST0xWTV9RVUVVRV9SRVFVRVNULCAmb3V0bXNnKSkgeworCQlMT0dFUlIoInNpZ25hbGluc2VydCBmYWlsZWQhIik7CisJCXJldHVybjsKKwl9CisKKwlwLT5wZW5kaW5nTXNnSGRyLklkID0gQ09OVFJPTFZNX0lOVkFMSUQ7Cit9CisKK3N0YXRpYyB2b2lkCitkZXZpY2VfcmVzcG9uZGVyKENPTlRST0xWTV9JRCBjbWRJZCwgdWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpCit7CisJVklTT1JDSElQU0VUX0RFVklDRV9JTkZPICpwID0gTlVMTDsKKwlCT09MIG5lZWRfY2xlYXIgPSBGQUxTRTsKKworCXAgPSBmaW5kZGV2aWNlKCZEZXZJbmZvTGlzdCwgYnVzTm8sIGRldk5vKTsKKwlpZiAoIXApIHsKKwkJTE9HRVJSKCJpbnRlcm5hbCBlcnJvcjsgYnVzTm89JWx1LCBkZXZObz0lbHUiLCBidXNObywgZGV2Tm8pOworCQlyZXR1cm47CisJfQorCWlmIChyZXNwb25zZSA+PSAwKSB7CisJCWlmIChjbWRJZCA9PSBDT05UUk9MVk1fREVWSUNFX0NSRUFURSkKKwkJCXAtPnN0YXRlLmNyZWF0ZWQgPSAxOworCQlpZiAoY21kSWQgPT0gQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZKQorCQkJbmVlZF9jbGVhciA9IFRSVUU7CisJfQorCisJaWYgKHAtPnBlbmRpbmdNc2dIZHIuSWQgPT0gQ09OVFJPTFZNX0lOVkFMSUQpIHsKKwkJTE9HRVJSKCJkZXZpY2VfcmVzcG9uZGVyIG5vIHBlbmRpbmcgbXNnIik7CisJCXJldHVybjsJCS8qIG5vIGNvbnRyb2x2bSByZXNwb25zZSBuZWVkZWQgKi8KKwl9CisJaWYgKHAtPnBlbmRpbmdNc2dIZHIuSWQgIT0gKFUzMikgY21kSWQpIHsKKwkJTE9HRVJSKCJleHBlY3RlZD0lZCwgZm91bmQ9JWQiLCBjbWRJZCwgcC0+cGVuZGluZ01zZ0hkci5JZCk7CisJCXJldHVybjsKKwl9CisJY29udHJvbHZtX3Jlc3BvbmQoJnAtPnBlbmRpbmdNc2dIZHIsIHJlc3BvbnNlKTsKKwlwLT5wZW5kaW5nTXNnSGRyLklkID0gQ09OVFJPTFZNX0lOVkFMSUQ7CisJaWYgKG5lZWRfY2xlYXIpCisJCWRldkluZm9fY2xlYXIocCk7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfZXBpbG9nKFUzMiBidXNObywKKwkgICBVMzIgY21kLCBDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwKKwkgICBpbnQgcmVzcG9uc2UsIEJPT0wgbmVlZFJlc3BvbnNlKQoreworCUJPT0wgbm90aWZpZWQgPSBGQUxTRTsKKworCVZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqcEJ1c0luZm8gPSBmaW5kYnVzKCZCdXNJbmZvTGlzdCwgYnVzTm8pOworCisJaWYgKCFwQnVzSW5mbykgeworCQlMT0dFUlIoIkhVSD8gYmFkIGJ1c05vPSVkIiwgYnVzTm8pOworCQlyZXR1cm47CisJfQorCWlmIChuZWVkUmVzcG9uc2UpIHsKKwkJbWVtY3B5KCZwQnVzSW5mby0+cGVuZGluZ01zZ0hkciwgbXNnSGRyLAorCQkgICAgICAgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUikpOworCX0gZWxzZQorCQlwQnVzSW5mby0+cGVuZGluZ01zZ0hkci5JZCA9IENPTlRST0xWTV9JTlZBTElEOworCisJTE9DS1NFTV9VTklOVEVSUlVQVElCTEUoJk5vdGlmaWVyTG9jayk7CisJaWYgKHJlc3BvbnNlID09IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBDT05UUk9MVk1fQlVTX0NSRUFURToKKwkJCS8qIFdlIGNhbid0IHRlbGwgZnJvbSB0aGUgYnVzX2NyZWF0ZQorCQkJKiBpbmZvcm1hdGlvbiB3aGljaCBvZiBvdXIgMiBidXMgZmxhdm9ycyB0aGUKKwkJCSogZGV2aWNlcyBvbiB0aGlzIGJ1cyB3aWxsIHVsdGltYXRlbHkgZW5kIHVwLgorCQkJKiBGT1JUVU5BVEVMWSwgaXQgdHVybnMgb3V0IGl0IGlzIGhhcm1sZXNzIHRvCisJCQkqIHNlbmQgdGhlIGJ1c19jcmVhdGUgdG8gYm90aCBvZiB0aGVtLiAgV2UgY2FuCisJCQkqIG5hcnJvdyB0aGluZ3MgZG93biBhIGxpdHRsZSBiaXQsIHRob3VnaCwKKwkJCSogYmVjYXVzZSB3ZSBrbm93OiAtIEJ1c0Rldl9TZXJ2ZXIgY2FuIGhhbmRsZQorCQkJKiBlaXRoZXIgc2VydmVyIG9yIGNsaWVudCBkZXZpY2VzCisJCQkqIC0gQnVzRGV2X0NsaWVudCBjYW4gaGFuZGxlIE9OTFkgY2xpZW50CisJCQkqIGRldmljZXMgKi8KKwkJCWlmIChCdXNEZXZfU2VydmVyX05vdGlmaWVycy5idXNfY3JlYXRlKSB7CisJCQkJKCpCdXNEZXZfU2VydmVyX05vdGlmaWVycy5idXNfY3JlYXRlKSAoYnVzTm8pOworCQkJCW5vdGlmaWVkID0gVFJVRTsKKwkJCX0KKwkJCWlmICgoIXBCdXNJbmZvLT5mbGFncy5zZXJ2ZXIpIC8qY2xpZW50ICovICYmCisJCQkgICAgQnVzRGV2X0NsaWVudF9Ob3RpZmllcnMuYnVzX2NyZWF0ZSkgeworCQkJCSgqQnVzRGV2X0NsaWVudF9Ob3RpZmllcnMuYnVzX2NyZWF0ZSkgKGJ1c05vKTsKKwkJCQlub3RpZmllZCA9IFRSVUU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MVk1fQlVTX0RFU1RST1k6CisJCQlpZiAoQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMuYnVzX2Rlc3Ryb3kpIHsKKwkJCQkoKkJ1c0Rldl9TZXJ2ZXJfTm90aWZpZXJzLmJ1c19kZXN0cm95KSAoYnVzTm8pOworCQkJCW5vdGlmaWVkID0gVFJVRTsKKwkJCX0KKwkJCWlmICgoIXBCdXNJbmZvLT5mbGFncy5zZXJ2ZXIpIC8qY2xpZW50ICovICYmCisJCQkgICAgQnVzRGV2X0NsaWVudF9Ob3RpZmllcnMuYnVzX2Rlc3Ryb3kpIHsKKwkJCQkoKkJ1c0Rldl9DbGllbnRfTm90aWZpZXJzLmJ1c19kZXN0cm95KSAoYnVzTm8pOworCQkJCW5vdGlmaWVkID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChub3RpZmllZCkKKwkJLyogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGp1c3QgY2FsbGVkIGFib3ZlIGlzIHJlc3BvbnNpYmxlCisJCSAqIGZvciBjYWxsaW5nIHRoZSBhcHByb3ByaWF0ZSBWSVNPUkNISVBTRVRfQlVTREVWX1JFU1BPTkRFUlMKKwkJICogZnVuY3Rpb24sIHdoaWNoIHdpbGwgY2FsbCBidXNfcmVzcG9uZGVyKCkKKwkJICovCisJCTsKKwllbHNlCisJCWJ1c19yZXNwb25kZXIoY21kLCBidXNObywgcmVzcG9uc2UpOworCVVOTE9DS1NFTSgmTm90aWZpZXJMb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2RldmljZV9lcGlsb2coVTMyIGJ1c05vLCBVMzIgZGV2Tm8sIFVMVFJBX1NFR01FTlRfU1RBVEUgc3RhdGUsIFUzMiBjbWQsCisJICAgICAgQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSICptc2dIZHIsIGludCByZXNwb25zZSwKKwkgICAgICBCT09MIG5lZWRSZXNwb25zZSwgQk9PTCBmb3Jfdmlzb3JidXMpCit7CisJVklTT1JDSElQU0VUX0JVU0RFVl9OT1RJRklFUlMgKm5vdGlmaWVycyA9IE5VTEw7CisJQk9PTCBub3RpZmllZCA9IEZBTFNFOworCisJVklTT1JDSElQU0VUX0RFVklDRV9JTkZPICpwRGV2SW5mbyA9CisJCWZpbmRkZXZpY2UoJkRldkluZm9MaXN0LCBidXNObywgZGV2Tm8pOworCWNoYXIgKmVudnBbXSA9IHsKKwkJIlNQQVJTUF9ESUFHUE9PTF9QQVVTRURfU1RBVEUgPSAxIiwKKwkJTlVMTAorCX07CisKKwlpZiAoIXBEZXZJbmZvKSB7CisJCUxPR0VSUigiSFVIPyBiYWQgYnVzTm89JWQsIGRldk5vPSVkIiwgYnVzTm8sIGRldk5vKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZm9yX3Zpc29yYnVzKQorCQlub3RpZmllcnMgPSAmQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnM7CisJZWxzZQorCQlub3RpZmllcnMgPSAmQnVzRGV2X0NsaWVudF9Ob3RpZmllcnM7CisJaWYgKG5lZWRSZXNwb25zZSkgeworCQltZW1jcHkoJnBEZXZJbmZvLT5wZW5kaW5nTXNnSGRyLCBtc2dIZHIsCisJCSAgICAgICBzaXplb2YoQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSKSk7CisJfSBlbHNlCisJCXBEZXZJbmZvLT5wZW5kaW5nTXNnSGRyLklkID0gQ09OVFJPTFZNX0lOVkFMSUQ7CisKKwlMT0NLU0VNX1VOSU5URVJSVVBUSUJMRSgmTm90aWZpZXJMb2NrKTsKKwlpZiAocmVzcG9uc2UgPj0gMCkgeworCQlzd2l0Y2ggKGNtZCkgeworCQljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFOgorCQkJaWYgKG5vdGlmaWVycy0+ZGV2aWNlX2NyZWF0ZSkgeworCQkJCSgqbm90aWZpZXJzLT5kZXZpY2VfY3JlYXRlKSAoYnVzTm8sIGRldk5vKTsKKwkJCQlub3RpZmllZCA9IFRSVUU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFOgorCQkJLyogU2VydmVyUmVhZHkgLyBTZXJ2ZXJSdW5uaW5nIC8gU2VnbWVudFN0YXRlUnVubmluZyAqLworCQkJaWYgKHN0YXRlLkFsaXZlID09IFNlZ21lbnRTdGF0ZVJ1bm5pbmcuQWxpdmUgJiYKKwkJCSAgICBzdGF0ZS5PcGVyYXRpbmcgPT0gU2VnbWVudFN0YXRlUnVubmluZy5PcGVyYXRpbmcpIHsKKwkJCQlpZiAobm90aWZpZXJzLT5kZXZpY2VfcmVzdW1lKSB7CisJCQkJCSgqbm90aWZpZXJzLT5kZXZpY2VfcmVzdW1lKSAoYnVzTm8sCisJCQkJCQkJCSAgICAgZGV2Tm8pOworCQkJCQlub3RpZmllZCA9IFRSVUU7CisJCQkJfQorCQkJfQorCQkJLyogU2VydmVyTm90UmVhZHkgLyBTZXJ2ZXJMb3N0IC8gU2VnbWVudFN0YXRlU3RhbmRieSAqLworCQkJZWxzZSBpZiAoc3RhdGUuQWxpdmUgPT0gU2VnbWVudFN0YXRlU3RhbmRieS5BbGl2ZSAmJgorCQkJCSBzdGF0ZS5PcGVyYXRpbmcgPT0KKwkJCQkgU2VnbWVudFN0YXRlU3RhbmRieS5PcGVyYXRpbmcpIHsKKwkJCQkvKiB0ZWNobmljYWxseSB0aGlzIGlzIHN0YW5kYnkgY2FzZQorCQkJCSAqIHdoZXJlIHNlcnZlciBpcyBsb3N0CisJCQkJICovCisJCQkJaWYgKG5vdGlmaWVycy0+ZGV2aWNlX3BhdXNlKSB7CisJCQkJCSgqbm90aWZpZXJzLT5kZXZpY2VfcGF1c2UpIChidXNObywKKwkJCQkJCQkJICAgIGRldk5vKTsKKwkJCQkJbm90aWZpZWQgPSBUUlVFOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoc3RhdGUuQWxpdmUgPT0gU2VnbWVudFN0YXRlUGF1c2VkLkFsaXZlICYmCisJCQkJICAgc3RhdGUuT3BlcmF0aW5nID09CisJCQkJICAgU2VnbWVudFN0YXRlUGF1c2VkLk9wZXJhdGluZykgeworCQkJCS8qIHRoaXMgaXMgbGl0ZSBwYXVzZSB3aGVyZSBjaGFubmVsIGlzCisJCQkJICogc3RpbGwgdmFsaWQganVzdCAncGF1c2UnIG9mIGl0CisJCQkJICovCisJCQkJaWYgKGJ1c05vID09IGdfZGlhZ3Bvb2xCdXNObworCQkJCSAgICAmJiBkZXZObyA9PSBnX2RpYWdwb29sRGV2Tm8pIHsKKwkJCQkJTE9HSU5GKCJERVZJQ0VfQ0hBTkdFU1RBVEUoRGlhZ3Bvb2xDaGFubmVsIGJ1c05vPSVkIGRldk5vPSVkIGlzIHBhdXNpbmcuLi4pIiwKKwkJCQkJICAgICBidXNObywgZGV2Tm8pOworCQkJCQkvKiB0aGlzIHdpbGwgdHJpZ2dlciB0aGUKKwkJCQkJICogZGlhZ19zaHV0ZG93bi5zaCBzY3JpcHQgaW4KKwkJCQkJICogdGhlIHZpc29yY2hpcHNldCBob3RwbHVnICovCisJCQkJCWtvYmplY3RfdWV2ZW50X2VudgorCQkJCQkgICAgKCZWaXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi4KKwkJCQkJICAgICBrb2JqLCBLT0JKX09OTElORSwgZW52cCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZOgorCQkJaWYgKG5vdGlmaWVycy0+ZGV2aWNlX2Rlc3Ryb3kpIHsKKwkJCQkoKm5vdGlmaWVycy0+ZGV2aWNlX2Rlc3Ryb3kpIChidXNObywgZGV2Tm8pOworCQkJCW5vdGlmaWVkID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChub3RpZmllZCkKKwkJLyogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGp1c3QgY2FsbGVkIGFib3ZlIGlzIHJlc3BvbnNpYmxlCisJCSAqIGZvciBjYWxsaW5nIHRoZSBhcHByb3ByaWF0ZSBWSVNPUkNISVBTRVRfQlVTREVWX1JFU1BPTkRFUlMKKwkJICogZnVuY3Rpb24sIHdoaWNoIHdpbGwgY2FsbCBkZXZpY2VfcmVzcG9uZGVyKCkKKwkJICovCisJCTsKKwllbHNlCisJCWRldmljZV9yZXNwb25kZXIoY21kLCBidXNObywgZGV2Tm8sIHJlc3BvbnNlKTsKKwlVTkxPQ0tTRU0oJk5vdGlmaWVyTG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfY3JlYXRlKENPTlRST0xWTV9NRVNTQUdFICppbm1zZykKK3sKKwlDT05UUk9MVk1fTUVTU0FHRV9QQUNLRVQgKmNtZCA9ICZpbm1zZy0+Y21kOworCXVsb25nIGJ1c05vID0gY21kLT5jcmVhdGVCdXMuYnVzTm87CisJaW50IHJjID0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKKwlWSVNPUkNISVBTRVRfQlVTX0lORk8gKnBCdXNJbmZvID0gTlVMTDsKKworCisJcEJ1c0luZm8gPSBmaW5kYnVzKCZCdXNJbmZvTGlzdCwgYnVzTm8pOworCWlmIChwQnVzSW5mbyAmJiAocEJ1c0luZm8tPnN0YXRlLmNyZWF0ZWQgPT0gMSkpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWQ6IGJ1cyAlbHUgYWxyZWFkeSBleGlzdHMiLAorCQkgICAgICAgYnVzTm8pOworCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRkFJTFVSRV9QQywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKKwkJZ290byBBd2F5OworCX0KKwlwQnVzSW5mbyA9IGt6YWxsb2Moc2l6ZW9mKFZJU09SQ0hJUFNFVF9CVVNfSU5GTyksIEdGUF9LRVJORUwpOworCWlmIChwQnVzSW5mbyA9PSBOVUxMKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DUkVBVEUgRmFpbGVkOiBidXMgJWx1IGt6YWxsb2MgZmFpbGVkIiwKKwkJICAgICAgIGJ1c05vKTsKKwkJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGJ1c05vLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9LTUFMTE9DX0ZBSUxFRDsKKwkJZ290byBBd2F5OworCX0KKworCUlOSVRfTElTVF9IRUFEKCZwQnVzSW5mby0+ZW50cnkpOworCXBCdXNJbmZvLT5idXNObyA9IGJ1c05vOworCXBCdXNJbmZvLT5kZXZObyA9IGNtZC0+Y3JlYXRlQnVzLmRldmljZUNvdW50OworCisJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0VOVFJZX1BDLCBidXNObywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisKKwlpZiAoaW5tc2ctPmhkci5GbGFncy50ZXN0TWVzc2FnZSA9PSAxKQorCQlwQnVzSW5mby0+Y2hhbkluZm8uYWRkclR5cGUgPSBBRERSVFlQRV9sb2NhbFRlc3Q7CisJZWxzZQorCQlwQnVzSW5mby0+Y2hhbkluZm8uYWRkclR5cGUgPSBBRERSVFlQRV9sb2NhbFBoeXNpY2FsOworCisJcEJ1c0luZm8tPmZsYWdzLnNlcnZlciA9IGlubXNnLT5oZHIuRmxhZ3Muc2VydmVyOworCXBCdXNJbmZvLT5jaGFuSW5mby5jaGFubmVsQWRkciA9IGNtZC0+Y3JlYXRlQnVzLmNoYW5uZWxBZGRyOworCXBCdXNJbmZvLT5jaGFuSW5mby5uQ2hhbm5lbEJ5dGVzID0gY21kLT5jcmVhdGVCdXMuY2hhbm5lbEJ5dGVzOworCXBCdXNJbmZvLT5jaGFuSW5mby5jaGFubmVsVHlwZUd1aWQgPSBjbWQtPmNyZWF0ZUJ1cy5idXNEYXRhVHlwZUd1aWQ7CisJcEJ1c0luZm8tPmNoYW5JbmZvLmNoYW5uZWxJbnN0R3VpZCA9IGNtZC0+Y3JlYXRlQnVzLmJ1c0luc3RHdWlkOworCisJbGlzdF9hZGQoJnBCdXNJbmZvLT5lbnRyeSwgJkJ1c0luZm9MaXN0KTsKKworCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9FWElUX1BDLCBidXNObywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisKK0F3YXk6CisJYnVzX2VwaWxvZyhidXNObywgQ09OVFJPTFZNX0JVU19DUkVBVEUsICZpbm1zZy0+aGRyLAorCQkgICByYywgaW5tc2ctPmhkci5GbGFncy5yZXNwb25zZUV4cGVjdGVkID09IDEpOworfQorCitzdGF0aWMgdm9pZAorYnVzX2Rlc3Ryb3koQ09OVFJPTFZNX01FU1NBR0UgKmlubXNnKQoreworCUNPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVCAqY21kID0gJmlubXNnLT5jbWQ7CisJdWxvbmcgYnVzTm8gPSBjbWQtPmRlc3Ryb3lCdXMuYnVzTm87CisJVklTT1JDSElQU0VUX0JVU19JTkZPICpwQnVzSW5mbzsKKwlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworCisJcEJ1c0luZm8gPSBmaW5kYnVzKCZCdXNJbmZvTGlzdCwgYnVzTm8pOworCWlmICghcEJ1c0luZm8pIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0RFU1RST1kgRmFpbGVkOiBidXMgJWx1IGludmFsaWQiLCBidXNObyk7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOworCQlnb3RvIEF3YXk7CisJfQorCWlmIChwQnVzSW5mby0+c3RhdGUuY3JlYXRlZCA9PSAwKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0JVU19ERVNUUk9ZIEZhaWxlZDogYnVzICVsdSBhbHJlYWR5IGRlc3Ryb3llZCIsCisJCSAgICAgYnVzTm8pOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkU7CisJCWdvdG8gQXdheTsKKwl9CisKK0F3YXk6CisJYnVzX2VwaWxvZyhidXNObywgQ09OVFJPTFZNX0JVU19ERVNUUk9ZLCAmaW5tc2ctPmhkciwKKwkJICAgcmMsIGlubXNnLT5oZHIuRmxhZ3MucmVzcG9uc2VFeHBlY3RlZCA9PSAxKTsKK30KKworc3RhdGljIHZvaWQKK2J1c19jb25maWd1cmUoQ09OVFJPTFZNX01FU1NBR0UgKmlubXNnLCBQQVJTRVJfQ09OVEVYVCAqcGFyc2VyX2N0eCkKK3sKKwlDT05UUk9MVk1fTUVTU0FHRV9QQUNLRVQgKmNtZCA9ICZpbm1zZy0+Y21kOworCXVsb25nIGJ1c05vID0gY21kLT5jb25maWd1cmVCdXMuYnVzTm87CisJVklTT1JDSElQU0VUX0JVU19JTkZPICpwQnVzSW5mbyA9IE5VTEw7CisJaW50IHJjID0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKKwljaGFyIHNbOTldOworCisJYnVzTm8gPSBjbWQtPmNvbmZpZ3VyZUJ1cy5idXNObzsKKwlQT1NUQ09ERV9MSU5VWF8zKEJVU19DT05GSUdVUkVfRU5UUllfUEMsIGJ1c05vLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCXBCdXNJbmZvID0gZmluZGJ1cygmQnVzSW5mb0xpc3QsIGJ1c05vKTsKKwlpZiAoIXBCdXNJbmZvKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DT05GSUdVUkUgRmFpbGVkOiBidXMgJWx1IGludmFsaWQiLAorCQkgICAgICAgYnVzTm8pOworCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DT05GSUdVUkVfRkFJTFVSRV9QQywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOworCQlnb3RvIEF3YXk7CisJfQorCWlmIChwQnVzSW5mby0+c3RhdGUuY3JlYXRlZCA9PSAwKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DT05GSUdVUkUgRmFpbGVkOiBJbnZhbGlkIGJ1cyAlbHUgLSBub3QgY3JlYXRlZCB5ZXQiLAorCQkgICAgIGJ1c05vKTsKKwkJUE9TVENPREVfTElOVVhfMyhCVVNfQ09ORklHVVJFX0ZBSUxVUkVfUEMsIGJ1c05vLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfSU5WQUxJRDsKKwkJZ290byBBd2F5OworCX0KKwkvKiBUQkQgLSBhZGQgdGhpcyBjaGVjayB0byBvdGhlciBjb21tYW5kcyBhbHNvLi4uICovCisJaWYgKHBCdXNJbmZvLT5wZW5kaW5nTXNnSGRyLklkICE9IENPTlRST0xWTV9JTlZBTElEKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DT05GSUdVUkUgRmFpbGVkOiBidXMgJWx1IE1zZ0lkPSV1IG91dHN0YW5kaW5nIiwKKwkJICAgICBidXNObywgKHVpbnQpIHBCdXNJbmZvLT5wZW5kaW5nTXNnSGRyLklkKTsKKwkJUE9TVENPREVfTElOVVhfMyhCVVNfQ09ORklHVVJFX0ZBSUxVUkVfUEMsIGJ1c05vLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9NRVNTQUdFX0lEX0lOVkFMSURfRk9SX0NMSUVOVDsKKwkJZ290byBBd2F5OworCX0KKworCXBCdXNJbmZvLT5wYXJ0aXRpb25IYW5kbGUgPSBjbWQtPmNvbmZpZ3VyZUJ1cy5ndWVzdEhhbmRsZTsKKwlwQnVzSW5mby0+cGFydGl0aW9uR3VpZCA9IHBhcnNlcl9pZF9nZXQocGFyc2VyX2N0eCk7CisJcGFyc2VyX3BhcmFtX3N0YXJ0KHBhcnNlcl9jdHgsIFBBUlNFUlNUUklOR19OQU1FKTsKKwlwQnVzSW5mby0+bmFtZSA9IHBhcnNlcl9zdHJpbmdfZ2V0KHBhcnNlcl9jdHgpOworCisJdmlzb3JjaGFubmVsX0dVSURfaWQoJnBCdXNJbmZvLT5wYXJ0aXRpb25HdWlkLCBzKTsKKwlwQnVzSW5mby0+cHJvY09iamVjdCA9CisJICAgIHZpc29yX3Byb2NfQ3JlYXRlT2JqZWN0KFBhcnRpdGlvblR5cGUsIHMsICh2b2lkICopIChwQnVzSW5mbykpOworCWlmIChwQnVzSW5mby0+cHJvY09iamVjdCA9PSBOVUxMKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DT05GSUdVUkUgRmFpbGVkOiBidXNObz0lbHUgZmFpbGVkIHRvIGNyZWF0ZSAvcHJvYyBlbnRyeSIsCisJCSAgICAgYnVzTm8pOworCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DT05GSUdVUkVfRkFJTFVSRV9QQywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0tNQUxMT0NfRkFJTEVEOworCQlnb3RvIEF3YXk7CisJfQorCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NPTkZJR1VSRV9FWElUX1BDLCBidXNObywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CitBd2F5OgorCWJ1c19lcGlsb2coYnVzTm8sIENPTlRST0xWTV9CVVNfQ09ORklHVVJFLCAmaW5tc2ctPmhkciwKKwkJICAgcmMsIGlubXNnLT5oZHIuRmxhZ3MucmVzcG9uc2VFeHBlY3RlZCA9PSAxKTsKK30KKworc3RhdGljIHZvaWQKK215X2RldmljZV9jcmVhdGUoQ09OVFJPTFZNX01FU1NBR0UgKmlubXNnKQoreworCUNPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVCAqY21kID0gJmlubXNnLT5jbWQ7CisJdWxvbmcgYnVzTm8gPSBjbWQtPmNyZWF0ZURldmljZS5idXNObzsKKwl1bG9uZyBkZXZObyA9IGNtZC0+Y3JlYXRlRGV2aWNlLmRldk5vOworCVZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTyAqcERldkluZm8gPSBOVUxMOworCVZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqcEJ1c0luZm8gPSBOVUxMOworCWludCByYyA9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CisKKwlwRGV2SW5mbyA9IGZpbmRkZXZpY2UoJkRldkluZm9MaXN0LCBidXNObywgZGV2Tm8pOworCWlmIChwRGV2SW5mbyAmJiAocERldkluZm8tPnN0YXRlLmNyZWF0ZWQgPT0gMSkpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IGJ1c05vPSVsdSwgZGV2Tm89JWx1IGFscmVhZHkgZXhpc3RzIiwKKwkJICAgICBidXNObywgZGV2Tm8pOworCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2Tm8sIGJ1c05vLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkU7CisJCWdvdG8gQXdheTsKKwl9CisJcEJ1c0luZm8gPSBmaW5kYnVzKCZCdXNJbmZvTGlzdCwgYnVzTm8pOworCWlmICghcEJ1c0luZm8pIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IEludmFsaWQgYnVzICVsdSAtIG91dCBvZiByYW5nZSIsCisJCSAgICAgYnVzTm8pOworCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2Tm8sIGJ1c05vLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfSU5WQUxJRDsKKwkJZ290byBBd2F5OworCX0KKwlpZiAocEJ1c0luZm8tPnN0YXRlLmNyZWF0ZWQgPT0gMCkgeworCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogSW52YWxpZCBidXMgJWx1IC0gbm90IGNyZWF0ZWQgeWV0IiwKKwkJICAgICBidXNObyk7CisJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOworCQlnb3RvIEF3YXk7CisJfQorCXBEZXZJbmZvID0ga3phbGxvYyhzaXplb2YoVklTT1JDSElQU0VUX0RFVklDRV9JTkZPKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBEZXZJbmZvID09IE5VTEwpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IGJ1c05vPSVsdSwgZGV2Tm89JWx1IGttYWxvYyBmYWlsZWQiLAorCQkgICAgIGJ1c05vLCBkZXZObyk7CisJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0tNQUxMT0NfRkFJTEVEOworCQlnb3RvIEF3YXk7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJnBEZXZJbmZvLT5lbnRyeSk7CisJcERldkluZm8tPmJ1c05vID0gYnVzTm87CisJcERldkluZm8tPmRldk5vID0gZGV2Tm87CisJcERldkluZm8tPmRldkluc3RHdWlkID0gY21kLT5jcmVhdGVEZXZpY2UuZGV2SW5zdEd1aWQ7CisJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0VOVFJZX1BDLCBkZXZObywgYnVzTm8sCisJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisKKwlpZiAoaW5tc2ctPmhkci5GbGFncy50ZXN0TWVzc2FnZSA9PSAxKQorCQlwRGV2SW5mby0+Y2hhbkluZm8uYWRkclR5cGUgPSBBRERSVFlQRV9sb2NhbFRlc3Q7CisJZWxzZQorCQlwRGV2SW5mby0+Y2hhbkluZm8uYWRkclR5cGUgPSBBRERSVFlQRV9sb2NhbFBoeXNpY2FsOworCXBEZXZJbmZvLT5jaGFuSW5mby5jaGFubmVsQWRkciA9IGNtZC0+Y3JlYXRlRGV2aWNlLmNoYW5uZWxBZGRyOworCXBEZXZJbmZvLT5jaGFuSW5mby5uQ2hhbm5lbEJ5dGVzID0gY21kLT5jcmVhdGVEZXZpY2UuY2hhbm5lbEJ5dGVzOworCXBEZXZJbmZvLT5jaGFuSW5mby5jaGFubmVsVHlwZUd1aWQgPSBjbWQtPmNyZWF0ZURldmljZS5kYXRhVHlwZUd1aWQ7CisJcERldkluZm8tPmNoYW5JbmZvLmludHIgPSBjbWQtPmNyZWF0ZURldmljZS5pbnRyOworCWxpc3RfYWRkKCZwRGV2SW5mby0+ZW50cnksICZEZXZJbmZvTGlzdCk7CisJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0VYSVRfUEMsIGRldk5vLCBidXNObywKKwkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKK0F3YXk6CisJLyogZ2V0IHRoZSBidXMgYW5kIGRldk5vIGZvciBEaWFnUG9vbCBjaGFubmVsICovCisJaWYgKGlzX2RpYWdwb29sX2NoYW5uZWwocERldkluZm8tPmNoYW5JbmZvLmNoYW5uZWxUeXBlR3VpZCkpIHsKKwkJZ19kaWFncG9vbEJ1c05vID0gYnVzTm87CisJCWdfZGlhZ3Bvb2xEZXZObyA9IGRldk5vOworCQlMT0dJTkYoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIGZvciBEaWFnUG9vbCBjaGFubmVsOiBidXNObz0lbHUsIGRldk5vPSVsdSIsCisJCSAgICAgZ19kaWFncG9vbEJ1c05vLCBnX2RpYWdwb29sRGV2Tm8pOworCX0KKwlkZXZpY2VfZXBpbG9nKGJ1c05vLCBkZXZObywgU2VnbWVudFN0YXRlUnVubmluZywKKwkJICAgICAgQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUsICZpbm1zZy0+aGRyLCByYywKKwkJICAgICAgaW5tc2ctPmhkci5GbGFncy5yZXNwb25zZUV4cGVjdGVkID09IDEsCisJCSAgICAgIEZPUl9WSVNPUkJVUyhwRGV2SW5mby0+Y2hhbkluZm8uY2hhbm5lbFR5cGVHdWlkKSk7Cit9CisKK3N0YXRpYyB2b2lkCitteV9kZXZpY2VfY2hhbmdlc3RhdGUoQ09OVFJPTFZNX01FU1NBR0UgKmlubXNnKQoreworCUNPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVCAqY21kID0gJmlubXNnLT5jbWQ7CisJdWxvbmcgYnVzTm8gPSBjbWQtPmRldmljZUNoYW5nZVN0YXRlLmJ1c05vOworCXVsb25nIGRldk5vID0gY21kLT5kZXZpY2VDaGFuZ2VTdGF0ZS5kZXZObzsKKwlVTFRSQV9TRUdNRU5UX1NUQVRFIHN0YXRlID0gY21kLT5kZXZpY2VDaGFuZ2VTdGF0ZS5zdGF0ZTsKKwlWSVNPUkNISVBTRVRfREVWSUNFX0lORk8gKnBEZXZJbmZvID0gTlVMTDsKKwlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworCisJcERldkluZm8gPSBmaW5kZGV2aWNlKCZEZXZJbmZvTGlzdCwgYnVzTm8sIGRldk5vKTsKKwlpZiAoIXBEZXZJbmZvKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSBGYWlsZWQ6IGJ1c05vPSVsdSwgZGV2Tm89JWx1IGludmFsaWQgKGRvZXNuJ3QgZXhpc3QpIiwKKwkJICAgICBidXNObywgZGV2Tm8pOworCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DSEFOR0VTVEFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9JTlZBTElEOworCQlnb3RvIEF3YXk7CisJfQorCWlmIChwRGV2SW5mby0+c3RhdGUuY3JlYXRlZCA9PSAwKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSBGYWlsZWQ6IGJ1c05vPSVsdSwgZGV2Tm89JWx1IGludmFsaWQgKG5vdCBjcmVhdGVkKSIsCisJCSAgICAgYnVzTm8sIGRldk5vKTsKKwkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ0hBTkdFU1RBVEVfRkFJTFVSRV9QQywgZGV2Tm8sIGJ1c05vLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9ERVZJQ0VfSU5WQUxJRDsKKwl9CitBd2F5OgorCWlmICgocmMgPj0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgJiYgcERldkluZm8pCisJCWRldmljZV9lcGlsb2coYnVzTm8sIGRldk5vLCBzdGF0ZSwgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSwKKwkJCSAgICAgICZpbm1zZy0+aGRyLCByYywKKwkJCSAgICAgIGlubXNnLT5oZHIuRmxhZ3MucmVzcG9uc2VFeHBlY3RlZCA9PSAxLAorCQkJICAgICAgRk9SX1ZJU09SQlVTKHBEZXZJbmZvLT5jaGFuSW5mby5jaGFubmVsVHlwZUd1aWQpKTsKK30KKworc3RhdGljIHZvaWQKK215X2RldmljZV9kZXN0cm95KENPTlRST0xWTV9NRVNTQUdFICppbm1zZykKK3sKKwlDT05UUk9MVk1fTUVTU0FHRV9QQUNLRVQgKmNtZCA9ICZpbm1zZy0+Y21kOworCXVsb25nIGJ1c05vID0gY21kLT5kZXN0cm95RGV2aWNlLmJ1c05vOworCXVsb25nIGRldk5vID0gY21kLT5kZXN0cm95RGV2aWNlLmRldk5vOworCVZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTyAqcERldkluZm8gPSBOVUxMOworCWludCByYyA9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CisKKwlwRGV2SW5mbyA9IGZpbmRkZXZpY2UoJkRldkluZm9MaXN0LCBidXNObywgZGV2Tm8pOworCWlmICghcERldkluZm8pIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0RFU1RST1kgRmFpbGVkOiBidXNObz0lbHUsIGRldk5vPSVsdSBpbnZhbGlkIiwKKwkJICAgICBidXNObywgZGV2Tm8pOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9ERVZJQ0VfSU5WQUxJRDsKKwkJZ290byBBd2F5OworCX0KKwlpZiAocERldkluZm8tPnN0YXRlLmNyZWF0ZWQgPT0gMCkgeworCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSBGYWlsZWQ6IGJ1c05vPSVsdSwgZGV2Tm89JWx1IGFscmVhZHkgZGVzdHJveWVkIiwKKwkJICAgICBidXNObywgZGV2Tm8pOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkU7CisJfQorCitBd2F5OgorCWlmICgocmMgPj0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgJiYgcERldkluZm8pCisJCWRldmljZV9lcGlsb2coYnVzTm8sIGRldk5vLCBTZWdtZW50U3RhdGVSdW5uaW5nLAorCQkJICAgICAgQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZLCAmaW5tc2ctPmhkciwgcmMsCisJCQkgICAgICBpbm1zZy0+aGRyLkZsYWdzLnJlc3BvbnNlRXhwZWN0ZWQgPT0gMSwKKwkJCSAgICAgIEZPUl9WSVNPUkJVUyhwRGV2SW5mby0+Y2hhbkluZm8uY2hhbm5lbFR5cGVHdWlkKSk7Cit9CisKKy8qIFdoZW4gcHJvdmlkZWQgd2l0aCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY29udHJvbHZtIGNoYW5uZWwKKyAqIChwaHlzX2FkZHIpLCB0aGUgb2Zmc2V0IHRvIHRoZSBwYXlsb2FkIGFyZWEgd2UgbmVlZCB0byBtYW5hZ2UKKyAqIChvZmZzZXQpLCBhbmQgdGhlIHNpemUgb2YgdGhpcyBwYXlsb2FkIGFyZWEgKGJ5dGVzKSwgZmlsbHMgaW4gdGhlCisgKiBDT05UUk9MVk1fUEFZTE9BRF9JTkZPIHN0cnVjdC4gIFJldHVybnMgVFJVRSBmb3Igc3VjY2VzcyBvciBGQUxTRQorICogZm9yIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQKK2luaXRpYWxpemVfY29udHJvbHZtX3BheWxvYWRfaW5mbyhIT1NUQUREUkVTUyBwaHlzX2FkZHIsIFU2NCBvZmZzZXQsIFUzMiBieXRlcywKKwkJCQkgIENPTlRST0xWTV9QQVlMT0FEX0lORk8gKmluZm8pCit7CisJVTggX19pb21lbSAqcGF5bG9hZCA9IE5VTEw7CisJaW50IHJjID0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKKworCWlmIChpbmZvID09IE5VTEwpIHsKKwkJTE9HRVJSKCJIVUggPyBDT05UUk9MVk1fUEFZTE9BRF9JTklUIEZhaWxlZCA6IFByb2dyYW1tZXIgY2hlY2sgYXQgJXM6JWQiLAorCQkgICAgIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX1BBWUxPQURfSU5WQUxJRDsKKwkJZ290byBBd2F5OworCX0KKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKENPTlRST0xWTV9QQVlMT0FEX0lORk8pKTsKKwlpZiAoKG9mZnNldCA9PSAwKSB8fCAoYnl0ZXMgPT0gMCkpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fUEFZTE9BRF9JTklUIEZhaWxlZDogUmVxdWVzdFBheWxvYWRPZmZzZXQ9JWxsdSBSZXF1ZXN0UGF5bG9hZEJ5dGVzPSVsbHUhIiwKKwkJICAgICAodTY0KSBvZmZzZXQsICh1NjQpIGJ5dGVzKTsKKwkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfUEFZTE9BRF9JTlZBTElEOworCQlnb3RvIEF3YXk7CisJfQorCXBheWxvYWQgPSBpb3JlbWFwX2NhY2hlKHBoeXNfYWRkciArIG9mZnNldCwgYnl0ZXMpOworCWlmIChwYXlsb2FkID09IE5VTEwpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fUEFZTE9BRF9JTklUIEZhaWxlZDogaW9yZW1hcF9jYWNoZSAlbGx1IGZvciAlbGx1IGJ5dGVzIGZhaWxlZCIsCisJCSAgICAgKHU2NCkgb2Zmc2V0LCAodTY0KSBieXRlcyk7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0lPUkVNQVBfRkFJTEVEOworCQlnb3RvIEF3YXk7CisJfQorCisJaW5mby0+b2Zmc2V0ID0gb2Zmc2V0OworCWluZm8tPmJ5dGVzID0gYnl0ZXM7CisJaW5mby0+cHRyID0gcGF5bG9hZDsKKwlMT0dJTkYoIm9mZnNldD0lbGx1LCBieXRlcz0lbHUsIHB0cj0lcCIsCisJICAgICAgICh1NjQpIChpbmZvLT5vZmZzZXQpLCAodWxvbmcpIChpbmZvLT5ieXRlcyksIGluZm8tPnB0cik7CisKK0F3YXk6CisJaWYgKHJjIDwgMCkgeworCQlpZiAocGF5bG9hZCAhPSBOVUxMKSB7CisJCQlpb3VubWFwKHBheWxvYWQpOworCQkJcGF5bG9hZCA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZAorZGVzdHJveV9jb250cm9sdm1fcGF5bG9hZF9pbmZvKENPTlRST0xWTV9QQVlMT0FEX0lORk8gKmluZm8pCit7CisJaWYgKGluZm8tPnB0ciAhPSBOVUxMKSB7CisJCWlvdW5tYXAoaW5mby0+cHRyKTsKKwkJaW5mby0+cHRyID0gTlVMTDsKKwl9CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZihDT05UUk9MVk1fUEFZTE9BRF9JTkZPKSk7Cit9CisKK3N0YXRpYyB2b2lkCitpbml0aWFsaXplX2NvbnRyb2x2bV9wYXlsb2FkKHZvaWQpCit7CisJSE9TVEFERFJFU1MgcGh5c19hZGRyID0gdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcihDb250cm9sVm1fY2hhbm5lbCk7CisJVTY0IHBheWxvYWRPZmZzZXQgPSAwOworCVUzMiBwYXlsb2FkQnl0ZXMgPSAwOworCWlmICh2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwKKwkJCSAgICAgIG9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCSAgICAgICBSZXF1ZXN0UGF5bG9hZE9mZnNldCksCisJCQkgICAgICAmcGF5bG9hZE9mZnNldCwgc2l6ZW9mKHBheWxvYWRPZmZzZXQpKSA8IDApIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fUEFZTE9BRF9JTklUIEZhaWxlZCB0byByZWFkIGNvbnRyb2x2bSBjaGFubmVsISIpOworCQlQT1NUQ09ERV9MSU5VWF8yKENPTlRST0xWTV9JTklUX0ZBSUxVUkVfUEMsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisJaWYgKHZpc29yY2hhbm5lbF9yZWFkKENvbnRyb2xWbV9jaGFubmVsLAorCQkJICAgICAgb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsCisJCQkJICAgICAgIFJlcXVlc3RQYXlsb2FkQnl0ZXMpLAorCQkJICAgICAgJnBheWxvYWRCeXRlcywgc2l6ZW9mKHBheWxvYWRCeXRlcykpIDwgMCkgeworCQlMT0dFUlIoIkNPTlRST0xWTV9QQVlMT0FEX0lOSVQgRmFpbGVkIHRvIHJlYWQgY29udHJvbHZtIGNoYW5uZWwhIik7CisJCVBPU1RDT0RFX0xJTlVYXzIoQ09OVFJPTFZNX0lOSVRfRkFJTFVSRV9QQywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuOworCX0KKwlpbml0aWFsaXplX2NvbnRyb2x2bV9wYXlsb2FkX2luZm8ocGh5c19hZGRyLAorCQkJCQkgIHBheWxvYWRPZmZzZXQsIHBheWxvYWRCeXRlcywKKwkJCQkJICAmQ29udHJvbFZtX3BheWxvYWRfaW5mbyk7Cit9CisKKy8qICBTZW5kIEFDVElPTj1vbmxpbmUgZm9yIERFVlBBVEg9L3N5cy9kZXZpY2VzL3BsYXRmb3JtL3Zpc29yY2hpcHNldC4KKyAqICBSZXR1cm5zIENPTlRST0xWTV9SRVNQX3h4eCBjb2RlLgorICovCitpbnQKK3Zpc29yY2hpcHNldF9jaGlwc2V0X3JlYWR5KHZvaWQpCit7CisJa29iamVjdF91ZXZlbnQoJlZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UuZGV2LmtvYmosIEtPQkpfT05MSU5FKTsKKwlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hpcHNldF9jaGlwc2V0X3JlYWR5KTsKKworaW50Cit2aXNvcmNoaXBzZXRfY2hpcHNldF9zZWxmdGVzdCh2b2lkKQoreworCWNoYXIgZW52X3NlbGZ0ZXN0WzIwXTsKKwljaGFyICplbnZwW10gPSB7IGVudl9zZWxmdGVzdCwgTlVMTCB9OworCXNwcmludGYoZW52X3NlbGZ0ZXN0LCAiU1BBUlNQX1NFTEZURVNUPSVkIiwgMSk7CisJa29iamVjdF91ZXZlbnRfZW52KCZWaXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi5rb2JqLCBLT0JKX0NIQU5HRSwKKwkJCSAgIGVudnApOworCXJldHVybiBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X2NoaXBzZXRfc2VsZnRlc3QpOworCisvKiAgU2VuZCBBQ1RJT049b2ZmbGluZSBmb3IgREVWUEFUSD0vc3lzL2RldmljZXMvcGxhdGZvcm0vdmlzb3JjaGlwc2V0LgorICogIFJldHVybnMgQ09OVFJPTFZNX1JFU1BfeHh4IGNvZGUuCisgKi8KK2ludAordmlzb3JjaGlwc2V0X2NoaXBzZXRfbm90cmVhZHkodm9pZCkKK3sKKwlrb2JqZWN0X3VldmVudCgmVmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZS5kZXYua29iaiwgS09CSl9PRkZMSU5FKTsKKwlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hpcHNldF9jaGlwc2V0X25vdHJlYWR5KTsKKworc3RhdGljIHZvaWQKK2NoaXBzZXRfcmVhZHkoQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSICptc2dIZHIpCit7CisJaW50IHJjID0gdmlzb3JjaGlwc2V0X2NoaXBzZXRfcmVhZHkoKTsKKwlpZiAocmMgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKKwkJcmMgPSAtcmM7CisJaWYgKG1zZ0hkci0+RmxhZ3MucmVzcG9uc2VFeHBlY3RlZCAmJiAhdmlzb3JjaGlwc2V0X2hvbGRjaGlwc2V0cmVhZHkpCisJCWNvbnRyb2x2bV9yZXNwb25kKG1zZ0hkciwgcmMpOworCWlmIChtc2dIZHItPkZsYWdzLnJlc3BvbnNlRXhwZWN0ZWQgJiYgdmlzb3JjaGlwc2V0X2hvbGRjaGlwc2V0cmVhZHkpIHsKKwkJLyogU2VuZCBDSElQU0VUX1JFQURZIHJlc3BvbnNlIHdoZW4gYWxsIG1vZHVsZXMgaGF2ZSBiZWVuIGxvYWRlZAorCQkgKiBhbmQgZGlza3MgbW91bnRlZCBmb3IgdGhlIHBhcnRpdGlvbgorCQkgKi8KKwkJZ19DaGlwU2V0TXNnSGRyID0gKm1zZ0hkcjsKKwkJTE9HSU5GKCJIb2xkaW5nIENISVBTRVRfUkVBRFkgcmVzcG9uc2UiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjaGlwc2V0X3NlbGZ0ZXN0KENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyKQoreworCWludCByYyA9IHZpc29yY2hpcHNldF9jaGlwc2V0X3NlbGZ0ZXN0KCk7CisJaWYgKHJjICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpCisJCXJjID0gLXJjOworCWlmIChtc2dIZHItPkZsYWdzLnJlc3BvbnNlRXhwZWN0ZWQpCisJCWNvbnRyb2x2bV9yZXNwb25kKG1zZ0hkciwgcmMpOworfQorCitzdGF0aWMgdm9pZAorY2hpcHNldF9ub3RyZWFkeShDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkcikKK3sKKwlpbnQgcmMgPSB2aXNvcmNoaXBzZXRfY2hpcHNldF9ub3RyZWFkeSgpOworCWlmIChyYyAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKQorCQlyYyA9IC1yYzsKKwlpZiAobXNnSGRyLT5GbGFncy5yZXNwb25zZUV4cGVjdGVkKQorCQljb250cm9sdm1fcmVzcG9uZChtc2dIZHIsIHJjKTsKK30KKworLyogVGhpcyBpcyB5b3VyICJvbmUtc3RvcCIgc2hvcCBmb3IgZ3JhYmJpbmcgdGhlIG5leHQgbWVzc2FnZSBmcm9tIHRoZQorICogQ09OVFJPTFZNX1FVRVVFX0VWRU5UIHF1ZXVlIGluIHRoZSBjb250cm9sdm0gY2hhbm5lbC4KKyAqLworc3RhdGljIEJPT0wKK3JlYWRfY29udHJvbHZtX2V2ZW50KENPTlRST0xWTV9NRVNTQUdFICptc2cpCit7CisJaWYgKHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkJICAgICAgQ09OVFJPTFZNX1FVRVVFX0VWRU5ULCBtc2cpKSB7CisJCS8qIGdvdCBhIG1lc3NhZ2UgKi8KKwkJaWYgKG1zZy0+aGRyLkZsYWdzLnRlc3RNZXNzYWdlID09IDEpIHsKKwkJCUxPR0VSUigiaWdub3JpbmcgYmFkIENPTlRST0xWTV9RVUVVRV9FVkVOVCBtc2cgd2l0aCBjb250cm9sdm1fbXNnX2lkPTB4JXggYmVjYXVzZSBGbGFncy50ZXN0TWVzc2FnZSBpcyBub25zZW5zaWNhbCAoPTEpIiwgbXNnLT5oZHIuSWQpOworCQkJcmV0dXJuIEZBTFNFOworCQl9IGVsc2UKKwkJCXJldHVybiBUUlVFOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBUaGUgZ2VuZXJhbCBwYXJhaG90cGx1ZyBmbG93IHdvcmtzIGFzIGZvbGxvd3MuICBUaGUgdmlzb3JjaGlwc2V0CisgKiBkcml2ZXIgcmVjZWl2ZXMgYSBERVZJQ0VfQ0hBTkdFU1RBVEUgbWVzc2FnZSBmcm9tIENvbW1hbmQKKyAqIHNwZWNpZnlpbmcgYSBwaHlzaWNhbCBkZXZpY2UgdG8gZW5hYmxlIG9yIGRpc2FibGUuICBUaGUgQ09OVFJPTFZNCisgKiBtZXNzYWdlIGhhbmRsZXIgY2FsbHMgcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlLCB3aGljaCB0aGVuIGFkZHMKKyAqIHRoZSBtZXNzYWdlIHRvIGEgZ2xvYmFsIGxpc3QgYW5kIGtpY2tzIG9mZiBhIHVkZXYgZXZlbnQgd2hpY2gKKyAqIGNhdXNlcyBhIHVzZXIgbGV2ZWwgc2NyaXB0IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzcGVjaWZpZWQKKyAqIGRldmljZS4gIFRoZSB1ZGV2IHNjcmlwdCB0aGVuIHdyaXRlcyB0bworICogL3Byb2Mvdmlzb3JjaGlwc2V0L3BhcmFob3RwbHVnLCB3aGljaCBjYXVzZXMgcGFyYWhvdHBsdWdfcHJvY193cml0ZQorICogdG8gZ2V0IGNhbGxlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIGFwcHJvcHJpYXRlIENPTlRST0xWTSBtZXNzYWdlIGlzCisgKiByZXRyaWV2ZWQgZnJvbSB0aGUgbGlzdCBhbmQgcmVzcG9uZGVkIHRvLgorICovCisKKyNkZWZpbmUgUEFSQUhPVFBMVUdfVElNRU9VVF9NUyAyMDAwCisKKy8qCisgKiBHZW5lcmF0ZSB1bmlxdWUgaW50IHRvIG1hdGNoIGFuIG91dHN0YW5kaW5nIENPTlRST0xWTSBtZXNzYWdlIHdpdGggYQorICogdWRldiBzY3JpcHQgL3Byb2MgcmVzcG9uc2UKKyAqLworc3RhdGljIGludAorcGFyYWhvdHBsdWdfbmV4dF9pZCh2b2lkKQoreworCXN0YXRpYyBhdG9taWNfdCBpZCA9IEFUT01JQ19JTklUKDApOworCXJldHVybiBhdG9taWNfaW5jX3JldHVybigmaWQpOworfQorCisvKgorICogUmV0dXJucyB0aGUgdGltZSAoaW4gamlmZmllcykgd2hlbiBhIENPTlRST0xWTSBtZXNzYWdlIG9uIHRoZSBsaXN0CisgKiBzaG91bGQgZXhwaXJlIC0tIFBBUkFIT1RQTFVHX1RJTUVPVVRfTVMgaW4gdGhlIGZ1dHVyZQorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZworcGFyYWhvdHBsdWdfbmV4dF9leHBpcmF0aW9uKHZvaWQpCit7CisJcmV0dXJuIGppZmZpZXMgKyBQQVJBSE9UUExVR19USU1FT1VUX01TICogSFogLyAxMDAwOworfQorCisvKgorICogQ3JlYXRlIGEgcGFyYWhvdHBsdWdfcmVxdWVzdCwgd2hpY2ggaXMgYmFzaWNhbGx5IGEgd3JhcHBlciBmb3IgYQorICogQ09OVFJPTFZNX01FU1NBR0UgdGhhdCB3ZSBjYW4gc3RpY2sgb24gYSBsaXN0CisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqCitwYXJhaG90cGx1Z19yZXF1ZXN0X2NyZWF0ZShDT05UUk9MVk1fTUVTU0FHRSAqbXNnKQoreworCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXEgPQorCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCksCisJCSAgICBHRlBfS0VSTkVMfF9fR0ZQX05PUkVUUlkpOworCWlmIChyZXEgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXEtPmlkID0gcGFyYWhvdHBsdWdfbmV4dF9pZCgpOworCXJlcS0+ZXhwaXJhdGlvbiA9IHBhcmFob3RwbHVnX25leHRfZXhwaXJhdGlvbigpOworCXJlcS0+bXNnID0gKm1zZzsKKworCXJldHVybiByZXE7Cit9CisKKy8qCisgKiBGcmVlIGEgcGFyYWhvdHBsdWdfcmVxdWVzdC4KKyAqLworc3RhdGljIHZvaWQKK3BhcmFob3RwbHVnX3JlcXVlc3RfZGVzdHJveShzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxKQoreworCWtmcmVlKHJlcSk7Cit9CisKKy8qCisgKiBDYXVzZSB1ZXZlbnQgdG8gcnVuIHRoZSB1c2VyIGxldmVsIHNjcmlwdCB0byBkbyB0aGUgZGlzYWJsZS9lbmFibGUKKyAqIHNwZWNpZmllZCBpbiAodGhlIENPTlRST0xWTSBtZXNzYWdlIGluKSB0aGUgc3BlY2lmaWVkCisgKiBwYXJhaG90cGx1Z19yZXF1ZXN0CisgKi8KK3N0YXRpYyB2b2lkCitwYXJhaG90cGx1Z19yZXF1ZXN0X2tpY2tvZmYoc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QgKnJlcSkKK3sKKwlDT05UUk9MVk1fTUVTU0FHRV9QQUNLRVQgKmNtZCA9ICZyZXEtPm1zZy5jbWQ7CisJY2hhciBlbnZfY21kWzQwXSwgZW52X2lkWzQwXSwgZW52X3N0YXRlWzQwXSwgZW52X2J1c1s0MF0sIGVudl9kZXZbNDBdLAorCSAgICBlbnZfZnVuY1s0MF07CisJY2hhciAqZW52cFtdID0geworCQllbnZfY21kLCBlbnZfaWQsIGVudl9zdGF0ZSwgZW52X2J1cywgZW52X2RldiwgZW52X2Z1bmMsIE5VTEwKKwl9OworCisJc3ByaW50ZihlbnZfY21kLCAiU1BBUl9QQVJBSE9UUExVRz0xIik7CisJc3ByaW50ZihlbnZfaWQsICJTUEFSX1BBUkFIT1RQTFVHX0lEPSVkIiwgcmVxLT5pZCk7CisJc3ByaW50ZihlbnZfc3RhdGUsICJTUEFSX1BBUkFIT1RQTFVHX1NUQVRFPSVkIiwKKwkJY21kLT5kZXZpY2VDaGFuZ2VTdGF0ZS5zdGF0ZS5BY3RpdmUpOworCXNwcmludGYoZW52X2J1cywgIlNQQVJfUEFSQUhPVFBMVUdfQlVTPSVkIiwKKwkJY21kLT5kZXZpY2VDaGFuZ2VTdGF0ZS5idXNObyk7CisJc3ByaW50ZihlbnZfZGV2LCAiU1BBUl9QQVJBSE9UUExVR19ERVZJQ0U9JWQiLAorCQljbWQtPmRldmljZUNoYW5nZVN0YXRlLmRldk5vID4+IDMpOworCXNwcmludGYoZW52X2Z1bmMsICJTUEFSX1BBUkFIT1RQTFVHX0ZVTkNUSU9OPSVkIiwKKwkJY21kLT5kZXZpY2VDaGFuZ2VTdGF0ZS5kZXZObyAmIDB4Nyk7CisKKwlMT0dJTkYoInBhcmFob3RwbHVnX3JlcXVlc3Rfa2lja29mZjogc3RhdGU9JWQsIGJkZj0lZC8lZC8lZCwgaWQ9JXVcbiIsCisJICAgICAgIGNtZC0+ZGV2aWNlQ2hhbmdlU3RhdGUuc3RhdGUuQWN0aXZlLAorCSAgICAgICBjbWQtPmRldmljZUNoYW5nZVN0YXRlLmJ1c05vLCBjbWQtPmRldmljZUNoYW5nZVN0YXRlLmRldk5vID4+IDMsCisJICAgICAgIGNtZC0+ZGV2aWNlQ2hhbmdlU3RhdGUuZGV2Tm8gJiA3LCByZXEtPmlkKTsKKworCWtvYmplY3RfdWV2ZW50X2VudigmVmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZS5kZXYua29iaiwgS09CSl9DSEFOR0UsCisJCQkgICBlbnZwKTsKK30KKworLyoKKyAqIFJlbW92ZSBhbnkgcmVxdWVzdCBmcm9tIHRoZSBsaXN0IHRoYXQncyBiZWVuIG9uIHRoZXJlIHRvbyBsb25nIGFuZAorICogcmVzcG9uZCB3aXRoIGFuIGVycm9yLgorICovCitzdGF0aWMgdm9pZAorcGFyYWhvdHBsdWdfcHJvY2Vzc19saXN0KHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0bXAsICZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3QpIHsKKwkJc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QgKnJlcSA9CisJCSAgICBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QsIGxpc3QpOworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCByZXEtPmV4cGlyYXRpb24pKSB7CisJCQlsaXN0X2RlbChwb3MpOworCQkJaWYgKHJlcS0+bXNnLmhkci5GbGFncy5yZXNwb25zZUV4cGVjdGVkKQorCQkJCWNvbnRyb2x2bV9yZXNwb25kX3BoeXNkZXZfY2hhbmdlc3RhdGUoCisJCQkJCSZyZXEtPm1zZy5oZHIsCisJCQkJCUNPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9VREVWX1RJTUVPVVQsCisJCQkJCXJlcS0+bXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5zdGF0ZSk7CisJCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2Rlc3Ryb3kocmVxKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSB0aGUgL3Byb2MgaGFuZGxlciwgd2hpY2ggbWVhbnMgdGhlIHVzZXIgc2NyaXB0IGhhcworICogZmluaXNoZWQgdGhlIGVuYWJsZS9kaXNhYmxlLiAgRmluZCB0aGUgbWF0Y2hpbmcgaWRlbnRpZmllciwgYW5kCisgKiByZXNwb25kIHRvIHRoZSBDT05UUk9MVk0gbWVzc2FnZSB3aXRoIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK3BhcmFob3RwbHVnX3JlcXVlc3RfY29tcGxldGUoaW50IGlkLCBVMTYgYWN0aXZlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcyA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wID0gTlVMTDsKKworCXNwaW5fbG9jaygmUGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworCisJLyogTG9vayBmb3IgYSByZXF1ZXN0IG1hdGNoaW5nICJpZCIuICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmUGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0KSB7CisJCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXEgPQorCQkgICAgbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0LCBsaXN0KTsKKwkJaWYgKHJlcS0+aWQgPT0gaWQpIHsKKwkJCS8qIEZvdW5kIGEgbWF0Y2guICBSZW1vdmUgaXQgZnJvbSB0aGUgbGlzdCBhbmQKKwkJCSAqIHJlc3BvbmQuCisJCQkgKi8KKwkJCWxpc3RfZGVsKHBvcyk7CisJCQlzcGluX3VubG9jaygmUGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworCQkJcmVxLT5tc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLnN0YXRlLkFjdGl2ZSA9IGFjdGl2ZTsKKwkJCWlmIChyZXEtPm1zZy5oZHIuRmxhZ3MucmVzcG9uc2VFeHBlY3RlZCkKKwkJCQljb250cm9sdm1fcmVzcG9uZF9waHlzZGV2X2NoYW5nZXN0YXRlKAorCQkJCQkmcmVxLT5tc2cuaGRyLCBDT05UUk9MVk1fUkVTUF9TVUNDRVNTLAorCQkJCQlyZXEtPm1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuc3RhdGUpOworCQkJcGFyYWhvdHBsdWdfcmVxdWVzdF9kZXN0cm95KHJlcSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisJcmV0dXJuIC0xOworfQorCisvKgorICogRW5hYmxlcyBvciBkaXNhYmxlcyBhIFBDSSBkZXZpY2UgYnkga2lja2luZyBvZmYgYSB1ZGV2IHNjcmlwdAorICovCitzdGF0aWMgdm9pZAorcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlKENPTlRST0xWTV9NRVNTQUdFICppbm1zZykKK3sKKwlzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxOworCisJcmVxID0gcGFyYWhvdHBsdWdfcmVxdWVzdF9jcmVhdGUoaW5tc2cpOworCisJaWYgKHJlcSA9PSBOVUxMKSB7CisJCUxPR0VSUigicGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlOiBjb3VsZG4ndCBhbGxvY2F0ZSByZXF1ZXN0Iik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW5tc2ctPmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5zdGF0ZS5BY3RpdmUpIHsKKwkJLyogRm9yIGVuYWJsZSBtZXNzYWdlcywganVzdCByZXNwb25kIHdpdGggc3VjY2VzcworCQkqIHJpZ2h0IGF3YXkuICBUaGlzIGlzIGEgYml0IG9mIGEgaGFjaywgYnV0IHRoZXJlIGFyZQorCQkqIGlzc3VlcyB3aXRoIHRoZSBlYXJseSBlbmFibGUgbWVzc2FnZXMgd2UgZ2V0ICh3aXRoCisJCSogZWl0aGVyIHRoZSB1ZGV2IHNjcmlwdCBub3QgZGV0ZWN0aW5nIHRoYXQgdGhlIGRldmljZQorCQkqIGlzIHVwLCBvciBub3QgZ2V0dGluZyBjYWxsZWQgYXQgYWxsKS4gIEZvcnR1bmF0ZWx5CisJCSogdGhlIG1lc3NhZ2VzIHRoYXQgZ2V0IGxvc3QgZG9uJ3QgbWF0dGVyIGFueXdheSwgYXMKKwkJKiBkZXZpY2VzIGFyZSBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgYXQKKwkJKiBpbml0aWFsaXphdGlvbi4KKwkJKi8KKwkJcGFyYWhvdHBsdWdfcmVxdWVzdF9raWNrb2ZmKHJlcSk7CisJCWNvbnRyb2x2bV9yZXNwb25kX3BoeXNkZXZfY2hhbmdlc3RhdGUoJmlubXNnLT5oZHIsCisJCQkJCQkgICAgICBDT05UUk9MVk1fUkVTUF9TVUNDRVNTLAorCQkJCQkJICAgICAgaW5tc2ctPmNtZC4KKwkJCQkJCSAgICAgIGRldmljZUNoYW5nZVN0YXRlLnN0YXRlKTsKKwkJcGFyYWhvdHBsdWdfcmVxdWVzdF9kZXN0cm95KHJlcSk7CisJfSBlbHNlIHsKKwkJLyogRm9yIGRpc2FibGUgbWVzc2FnZXMsIGFkZCB0aGUgcmVxdWVzdCB0byB0aGUKKwkJKiByZXF1ZXN0IGxpc3QgYmVmb3JlIGtpY2tpbmcgb2ZmIHRoZSB1ZGV2IHNjcmlwdC4gIEl0CisJCSogd29uJ3QgZ2V0IHJlc3BvbmRlZCB0byB1bnRpbCB0aGUgc2NyaXB0IGhhcworCQkqIGluZGljYXRlZCBpdCdzIGRvbmUuCisJCSovCisJCXNwaW5fbG9jaygmUGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworCQlsaXN0X2FkZF90YWlsKCYocmVxLT5saXN0KSwgJlBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCk7CisJCXNwaW5fdW5sb2NrKCZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisKKwkJcGFyYWhvdHBsdWdfcmVxdWVzdF9raWNrb2ZmKHJlcSk7CisJfQorfQorCisvKgorICogR2V0cyBjYWxsZWQgd2hlbiB0aGUgdWRldiBzY3JpcHQgd3JpdGVzIHRvCisgKiAvcHJvYy92aXNvcmNoaXBzZXQvcGFyYWhvdHBsdWcuICBFeHBlY3RzIGlucHV0IGluIHRoZSBmb3JtIG9mICI8aWQ+CisgKiA8YWN0aXZlPiIgd2hlcmUgPGlkPiBpcyB0aGUgaWRlbnRpZmllciBwYXNzZWQgdG8gdGhlIHNjcmlwdCB0aGF0CisgKiBtYXRjaGVzIGEgcmVxdWVzdCBvbiB0aGUgcmVxdWVzdCBsaXN0LCBhbmQgPGFjdGl2ZT4gaXMgMCBvciAxCisgKiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGRldmljZSBpcyBub3cgZW5hYmxlZCBvciBub3QuCisgKi8KK3N0YXRpYyBzc2l6ZV90CitwYXJhaG90cGx1Z19wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZbNjRdOworCXVpbnQgaWQ7CisJdXNob3J0IGFjdGl2ZTsKKworCWlmIChjb3VudCA+IHNpemVvZihidWYpIC0gMSkgeworCQlMT0dFUlIoInBhcmFob3RwbHVnX3Byb2Nfd3JpdGU6IGNvdW50ICglZCkgZXhjZWVkcyBzaXplIG9mIGJ1ZmZlciAoJWQpIiwKKwkJICAgICAoaW50KSBjb3VudCwgKGludCkgc2l6ZW9mKGJ1ZikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCkpIHsKKwkJTE9HRVJSKCJwYXJhaG90cGx1Z19wcm9jX3dyaXRlOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWJ1Zltjb3VudF0gPSAnXDAnOworCisJaWYgKHNzY2FuZihidWYsICIldSAlaHUiLCAmaWQsICZhY3RpdmUpICE9IDIpIHsKKwkJaWQgPSAwOworCQlhY3RpdmUgPSAwOworCX0KKworCWlmIChhY3RpdmUgIT0gMSAmJiBhY3RpdmUgIT0gMCkgeworCQlMT0dFUlIoInBhcmFob3RwbHVnX3Byb2Nfd3JpdGU6IGludmFsaWQgYWN0aXZlIGZpZWxkIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBhcmFob3RwbHVnX3JlcXVlc3RfY29tcGxldGUoKGludCkgaWQsIChVMTYpIGFjdGl2ZSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBhcmFob3RwbHVnX3Byb2NfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucmVhZCA9IHZpc29yY2hpcHNldF9wcm9jX3JlYWRfd3JpdGVvbmx5LAorCS53cml0ZSA9IHBhcmFob3RwbHVnX3Byb2Nfd3JpdGUsCit9OworCisvKiBQcm9jZXNzIGEgY29udHJvbHZtIG1lc3NhZ2UuCisgKiBSZXR1cm4gcmVzdWx0OgorICogICAgRkFMU0UgLSB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIEZBTFNFIG9ubHkgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlCisgKiAgICAgICAgICAgIGNvbnRyb2x2bSBtZXNzYWdlIHdhcyBOT1QgcHJvY2Vzc2VkLCBidXQgcHJvY2Vzc2luZyBtdXN0IGJlCisgKiAgICAgICAgICAgIHJldHJpZWQgYmVmb3JlIHJlYWRpbmcgdGhlIG5leHQgY29udHJvbHZtIG1lc3NhZ2U7IGEKKyAqICAgICAgICAgICAgc2NlbmFyaW8gd2hlcmUgdGhpcyBjYW4gb2NjdXIgaXMgd2hlbiB3ZSBuZWVkIHRvIHRocm90dGxlCisgKiAgICAgICAgICAgIHRoZSBhbGxvY2F0aW9uIG9mIG1lbW9yeSBpbiB3aGljaCB0byBjb3B5IG91dCBjb250cm9sdm0KKyAqICAgICAgICAgICAgcGF5bG9hZCBkYXRhCisgKiAgICBUUlVFICAtIHByb2Nlc3Npbmcgb2YgdGhlIGNvbnRyb2x2bSBtZXNzYWdlIGNvbXBsZXRlZCwKKyAqICAgICAgICAgICAgZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGFuIGVycm9yLgorICovCitzdGF0aWMgQk9PTAoraGFuZGxlX2NvbW1hbmQoQ09OVFJPTFZNX01FU1NBR0UgaW5tc2csIEhPU1RBRERSRVNTIGNoYW5uZWxfYWRkcikKK3sKKwlDT05UUk9MVk1fTUVTU0FHRV9QQUNLRVQgKmNtZCA9ICZpbm1zZy5jbWQ7CisJVTY0IHBhcmFtZXRlcnNBZGRyID0gMDsKKwlVMzIgcGFyYW1ldGVyc0J5dGVzID0gMDsKKwlQQVJTRVJfQ09OVEVYVCAqcGFyc2VyX2N0eCA9IE5VTEw7CisJQk9PTCBpc0xvY2FsQWRkciA9IEZBTFNFOworCUNPTlRST0xWTV9NRVNTQUdFIGFja21zZzsKKworCS8qIGNyZWF0ZSBwYXJzaW5nIGNvbnRleHQgaWYgbmVjZXNzYXJ5ICovCisJaXNMb2NhbEFkZHIgPSAoaW5tc2cuaGRyLkZsYWdzLnRlc3RNZXNzYWdlID09IDEpOworCWlmIChjaGFubmVsX2FkZHIgPT0gMCkgeworCQlMT0dFUlIoIkhVSD8gY2hhbm5lbF9hZGRyIGlzIDAhIik7CisJCXJldHVybiBUUlVFOworCX0KKwlwYXJhbWV0ZXJzQWRkciA9IGNoYW5uZWxfYWRkciArIGlubXNnLmhkci5QYXlsb2FkVm1PZmZzZXQ7CisJcGFyYW1ldGVyc0J5dGVzID0gaW5tc2cuaGRyLlBheWxvYWRCeXRlczsKKworCS8qIFBhcmFtZXRlciBhbmQgY2hhbm5lbCBhZGRyZXNzZXMgd2l0aGluIHRlc3QgbWVzc2FnZXMgYWN0dWFsbHkgbGllCisJICogd2l0aGluIG91ciBPUy1jb250cm9sbGVkIG1lbW9yeS4gIFdlIG5lZWQgdG8ga25vdyB0aGF0LCBiZWNhdXNlIGl0CisJICogbWFrZXMgYSBkaWZmZXJlbmNlIGluIGhvdyB3ZSBjb21wdXRlIHRoZSB2aXJ0dWFsIGFkZHJlc3MuCisJICovCisJaWYgKHBhcmFtZXRlcnNBZGRyICE9IDAgJiYgcGFyYW1ldGVyc0J5dGVzICE9IDApIHsKKwkJQk9PTCByZXRyeSA9IEZBTFNFOworCQlwYXJzZXJfY3R4ID0KKwkJICAgIHBhcnNlcl9pbml0X2J5dGVTdHJlYW0ocGFyYW1ldGVyc0FkZHIsIHBhcmFtZXRlcnNCeXRlcywKKwkJCQkJICAgaXNMb2NhbEFkZHIsICZyZXRyeSk7CisJCWlmICghcGFyc2VyX2N0eCkgeworCQkJaWYgKHJldHJ5KSB7CisJCQkJTE9HV1JOKCJ0aHJvdHRsaW5nIHRvIGNvcHkgcGF5bG9hZCIpOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCUxPR1dSTigicGFyc2luZyBmYWlsZWQiKTsKKwkJCUxPR1dSTigiaW5tc2cuaGRyLklkPTB4JWx4IiwgKHVsb25nKSBpbm1zZy5oZHIuSWQpOworCQkJTE9HV1JOKCJwYXJhbWV0ZXJzQWRkcj0weCVsbHgiLCAodTY0KSBwYXJhbWV0ZXJzQWRkcik7CisJCQlMT0dXUk4oInBhcmFtZXRlcnNCeXRlcz0lbHUiLCAodWxvbmcpIHBhcmFtZXRlcnNCeXRlcyk7CisJCQlMT0dXUk4oImlzTG9jYWxBZGRyPSVkIiwgaXNMb2NhbEFkZHIpOworCQl9CisJfQorCisJaWYgKCFpc0xvY2FsQWRkcikgeworCQljb250cm9sdm1faW5pdF9yZXNwb25zZSgmYWNrbXNnLCAmaW5tc2cuaGRyLAorCQkJCQlDT05UUk9MVk1fUkVTUF9TVUNDRVNTKTsKKwkJaWYgKChDb250cm9sVm1fY2hhbm5lbCkKKwkJICAgICYmCisJCSAgICAoIXZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQKKwkJICAgICAoQ29udHJvbFZtX2NoYW5uZWwsIENPTlRST0xWTV9RVUVVRV9BQ0ssICZhY2ttc2cpKSkKKwkJCUxPR1dSTigiZmFpbGVkIHRvIHNlbmQgQUNLIGZhaWxlZCIpOworCX0KKwlzd2l0Y2ggKGlubXNnLmhkci5JZCkgeworCWNhc2UgQ09OVFJPTFZNX0NISVBTRVRfSU5JVDoKKwkJTE9HSU5GKCJDSElQU0VUX0lOSVQoI2J1c3Nlcz0lbHUsI3N3aXRjaGVzPSVsdSkiLAorCQkgICAgICAgKHVsb25nKSBpbm1zZy5jbWQuaW5pdENoaXBzZXQuYnVzQ291bnQsCisJCSAgICAgICAodWxvbmcpIGlubXNnLmNtZC5pbml0Q2hpcHNldC5zd2l0Y2hDb3VudCk7CisJCWNoaXBzZXRfaW5pdCgmaW5tc2cpOworCQlicmVhazsKKwljYXNlIENPTlRST0xWTV9CVVNfQ1JFQVRFOgorCQlMT0dJTkYoIkJVU19DUkVBVEUoJWx1LCNkZXZzPSVsdSkiLAorCQkgICAgICAgKHVsb25nKSBjbWQtPmNyZWF0ZUJ1cy5idXNObywKKwkJICAgICAgICh1bG9uZykgY21kLT5jcmVhdGVCdXMuZGV2aWNlQ291bnQpOworCQlidXNfY3JlYXRlKCZpbm1zZyk7CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0JVU19ERVNUUk9ZOgorCQlMT0dJTkYoIkJVU19ERVNUUk9ZKCVsdSkiLCAodWxvbmcpIGNtZC0+ZGVzdHJveUJ1cy5idXNObyk7CisJCWJ1c19kZXN0cm95KCZpbm1zZyk7CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0JVU19DT05GSUdVUkU6CisJCUxPR0lORigiQlVTX0NPTkZJR1VSRSglbHUpIiwgKHVsb25nKSBjbWQtPmNvbmZpZ3VyZUJ1cy5idXNObyk7CisJCWJ1c19jb25maWd1cmUoJmlubXNnLCBwYXJzZXJfY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fREVWSUNFX0NSRUFURToKKwkJTE9HSU5GKCJERVZJQ0VfQ1JFQVRFKCVsdSwlbHUpIiwKKwkJICAgICAgICh1bG9uZykgY21kLT5jcmVhdGVEZXZpY2UuYnVzTm8sCisJCSAgICAgICAodWxvbmcpIGNtZC0+Y3JlYXRlRGV2aWNlLmRldk5vKTsKKwkJbXlfZGV2aWNlX2NyZWF0ZSgmaW5tc2cpOworCQlicmVhazsKKwljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6CisJCWlmIChjbWQtPmRldmljZUNoYW5nZVN0YXRlLmZsYWdzLnBoeXNpY2FsRGV2aWNlKSB7CisJCQlMT0dJTkYoIkRFVklDRV9DSEFOR0VTVEFURSBmb3IgcGh5c2ljYWwgZGV2aWNlICglbHUsJWx1LCBhY3RpdmU9JWx1KSIsCisJCQkgICAgICh1bG9uZykgY21kLT5kZXZpY2VDaGFuZ2VTdGF0ZS5idXNObywKKwkJCSAgICAgKHVsb25nKSBjbWQtPmRldmljZUNoYW5nZVN0YXRlLmRldk5vLAorCQkJICAgICAodWxvbmcpIGNtZC0+ZGV2aWNlQ2hhbmdlU3RhdGUuc3RhdGUuQWN0aXZlKTsKKwkJCXBhcmFob3RwbHVnX3Byb2Nlc3NfbWVzc2FnZSgmaW5tc2cpOworCQl9IGVsc2UgeworCQkJTE9HSU5GKCJERVZJQ0VfQ0hBTkdFU1RBVEUgZm9yIHZpcnR1YWwgZGV2aWNlICglbHUsJWx1LCBzdGF0ZS5BbGl2ZT0weCVseCkiLAorCQkJICAgICAodWxvbmcpIGNtZC0+ZGV2aWNlQ2hhbmdlU3RhdGUuYnVzTm8sCisJCQkgICAgICh1bG9uZykgY21kLT5kZXZpY2VDaGFuZ2VTdGF0ZS5kZXZObywKKwkJCSAgICAgKHVsb25nKSBjbWQtPmRldmljZUNoYW5nZVN0YXRlLnN0YXRlLkFsaXZlKTsKKwkJCS8qIHNhdmUgdGhlIGhkciBhbmQgY21kIHN0cnVjdHVyZXMgZm9yIGxhdGVyIHVzZSAqLworCQkJLyogd2hlbiBzZW5kaW5nIGJhY2sgdGhlIHJlc3BvbnNlIHRvIENvbW1hbmQgKi8KKwkJCW15X2RldmljZV9jaGFuZ2VzdGF0ZSgmaW5tc2cpOworCQkJZ19EaWFnTXNnSGRyID0gaW5tc2cuaGRyOworCQkJZ19EZXZpY2VDaGFuZ2VTdGF0ZVBhY2tldCA9IGlubXNnLmNtZDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZOgorCQlMT0dJTkYoIkRFVklDRV9ERVNUUk9ZKCVsdSwlbHUpIiwKKwkJICAgICAgICh1bG9uZykgY21kLT5kZXN0cm95RGV2aWNlLmJ1c05vLAorCQkgICAgICAgKHVsb25nKSBjbWQtPmRlc3Ryb3lEZXZpY2UuZGV2Tm8pOworCQlteV9kZXZpY2VfZGVzdHJveSgmaW5tc2cpOworCQlicmVhazsKKwljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ09ORklHVVJFOgorCQlMT0dJTkYoIkRFVklDRV9DT05GSUdVUkUoJWx1LCVsdSkiLAorCQkgICAgICAgKHVsb25nKSBjbWQtPmNvbmZpZ3VyZURldmljZS5idXNObywKKwkJICAgICAgICh1bG9uZykgY21kLT5jb25maWd1cmVEZXZpY2UuZGV2Tm8pOworCQkvKiBubyBvcCBmb3Igbm93LCBqdXN0IHNlbmQgYSByZXNwb25kIHRoYXQgd2UgcGFzc2VkICovCisJCWlmIChpbm1zZy5oZHIuRmxhZ3MucmVzcG9uc2VFeHBlY3RlZCkKKwkJCWNvbnRyb2x2bV9yZXNwb25kKCZpbm1zZy5oZHIsIENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpOworCQlicmVhazsKKwljYXNlIENPTlRST0xWTV9DSElQU0VUX1JFQURZOgorCQlMT0dJTkYoIkNISVBTRVRfUkVBRFkiKTsKKwkJY2hpcHNldF9yZWFkeSgmaW5tc2cuaGRyKTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9TRUxGVEVTVDoKKwkJTE9HSU5GKCJDSElQU0VUX1NFTEZURVNUIik7CisJCWNoaXBzZXRfc2VsZnRlc3QoJmlubXNnLmhkcik7CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0NISVBTRVRfU1RPUDoKKwkJTE9HSU5GKCJDSElQU0VUX1NUT1AiKTsKKwkJY2hpcHNldF9ub3RyZWFkeSgmaW5tc2cuaGRyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HRVJSKCJ1bnJlY29nbml6ZWQgY29udHJvbHZtIGNtZD0lZCIsIChpbnQpIGlubXNnLmhkci5JZCk7CisJCWlmIChpbm1zZy5oZHIuRmxhZ3MucmVzcG9uc2VFeHBlY3RlZCkKKwkJCWNvbnRyb2x2bV9yZXNwb25kKCZpbm1zZy5oZHIsCisJCQkJCSAgLUNPTlRST0xWTV9SRVNQX0VSUk9SX01FU1NBR0VfSURfVU5LTk9XTik7CisJCWJyZWFrOworCX0KKworCWlmIChwYXJzZXJfY3R4ICE9IE5VTEwpIHsKKwkJcGFyc2VyX2RvbmUocGFyc2VyX2N0eCk7CisJCXBhcnNlcl9jdHggPSBOVUxMOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2NvbnRyb2x2bV9wZXJpb2RpY193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlWSVNPUkNISVBTRVRfQ0hBTk5FTF9JTkZPIGNoYW5JbmZvOworCUNPTlRST0xWTV9NRVNTQUdFIGlubXNnOworCWNoYXIgc1s5OV07CisJQk9PTCBnb3RBQ29tbWFuZCA9IEZBTFNFOworCUJPT0wgaGFuZGxlX2NvbW1hbmRfZmFpbGVkID0gRkFMU0U7CisJc3RhdGljIFU2NCBQb2xsX0NvdW50OworCisJLyogbWFrZSBzdXJlIHZpc29yYnVzIHNlcnZlciBpcyByZWdpc3RlcmVkIGZvciBjb250cm9sdm0gY2FsbGJhY2tzICovCisJaWYgKHZpc29yY2hpcHNldF9zZXJ2ZXJyZWd3YWl0ICYmICFzZXJ2ZXJyZWdpc3RlcmVkKQorCQlnb3RvIEF3YXk7CisJLyogbWFrZSBzdXJlIHZpc29yY2xpZW50YnVzIHNlcnZlciBpcyByZWdzaXRlcmVkIGZvciBjb250cm9sdm0KKwkgKiBjYWxsYmFja3MKKwkgKi8KKwlpZiAodmlzb3JjaGlwc2V0X2NsaWVudHJlZ3dhaXQgJiYgIWNsaWVudHJlZ2lzdGVyZWQpCisJCWdvdG8gQXdheTsKKworCW1lbXNldCgmY2hhbkluZm8sIDAsIHNpemVvZihWSVNPUkNISVBTRVRfQ0hBTk5FTF9JTkZPKSk7CisJaWYgKCFDb250cm9sVm1fY2hhbm5lbCkgeworCQlIT1NUQUREUkVTUyBhZGRyID0gY29udHJvbHZtX2dldF9jaGFubmVsX2FkZHJlc3MoKTsKKwkJaWYgKGFkZHIgIT0gMCkgeworCQkJQ29udHJvbFZtX2NoYW5uZWwgPQorCQkJICAgIHZpc29yY2hhbm5lbF9jcmVhdGVfd2l0aF9sb2NrCisJCQkgICAgKGFkZHIsCisJCQkgICAgIHNpemVvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCksCisJCQkgICAgIFVsdHJhQ29udHJvbHZtQ2hhbm5lbFByb3RvY29sR3VpZCk7CisJCQlpZiAoQ29udHJvbFZtX2NoYW5uZWwgPT0gTlVMTCkKKwkJCQlMT0dFUlIoImZhaWxlZCB0byBjcmVhdGUgY29udHJvbHZtIGNoYW5uZWwiKTsKKwkJCWVsc2UgaWYgKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX09LX0NMSUVOVAorCQkJCSAodmlzb3JjaGFubmVsX2dldF9oZWFkZXIoQ29udHJvbFZtX2NoYW5uZWwpLAorCQkJCSAgTlVMTCkpIHsKKwkJCQlMT0dJTkYoIkNoYW5uZWwgJXMgKENvbnRyb2xWbSkgZGlzY292ZXJlZCIsCisJCQkJICAgICAgIHZpc29yY2hhbm5lbF9pZChDb250cm9sVm1fY2hhbm5lbCwgcykpOworCQkJCWluaXRpYWxpemVfY29udHJvbHZtX3BheWxvYWQoKTsKKwkJCX0gZWxzZSB7CisJCQkJTE9HRVJSKCJjb250cm9sdm0gY2hhbm5lbCBpcyBpbnZhbGlkIik7CisJCQkJdmlzb3JjaGFubmVsX2Rlc3Ryb3koQ29udHJvbFZtX2NoYW5uZWwpOworCQkJCUNvbnRyb2xWbV9jaGFubmVsID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCVBvbGxfQ291bnQrKzsKKwlpZiAoKENvbnRyb2xWbV9jaGFubmVsICE9IE5VTEwpIHx8IChQb2xsX0NvdW50ID49IDI1MCkpCisJCTsJLyoga2VlcCBnb2luZyAqLworCWVsc2UKKwkJZ290byBBd2F5OworCisJLyogQ2hlY2sgZXZlbnRzIHRvIGRldGVybWluZSBpZiByZXNwb25zZSB0byBDSElQU0VUX1JFQURZCisJICogc2hvdWxkIGJlIHNlbnQKKwkgKi8KKwlpZiAodmlzb3JjaGlwc2V0X2hvbGRjaGlwc2V0cmVhZHkKKwkgICAgJiYgKGdfQ2hpcFNldE1zZ0hkci5JZCAhPSBDT05UUk9MVk1fSU5WQUxJRCkpIHsKKwkJaWYgKGNoZWNrX2NoaXBzZXRfZXZlbnRzKCkgPT0gMSkgeworCQkJTE9HSU5GKCJTZW5kaW5nIENISVBTRVRfUkVBRFkgcmVzcG9uc2UiKTsKKwkJCWNvbnRyb2x2bV9yZXNwb25kKCZnX0NoaXBTZXRNc2dIZHIsIDApOworCQkJY2xlYXJfY2hpcHNldF9ldmVudHMoKTsKKwkJCW1lbXNldCgmZ19DaGlwU2V0TXNnSGRyLCAwLAorCQkJICAgICAgIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIpKTsKKwkJfQorCX0KKworCWlmIChDb250cm9sVm1fY2hhbm5lbCkgeworCQl3aGlsZSAodmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShDb250cm9sVm1fY2hhbm5lbCwKKwkJCQkJCSBDT05UUk9MVk1fUVVFVUVfUkVTUE9OU0UsCisJCQkJCQkgJmlubXNnKSkgeworCQkJaWYgKGlubXNnLmhkci5QYXlsb2FkTWF4Qnl0ZXMgIT0gMCkgeworCQkJCUxPR0VSUigiUGF5bG9hZCBvZiBzaXplICVsdSByZXR1cm5lZCBAJWx1IHdpdGggdW5leHBlY3RlZCBtZXNzYWdlIGlkICVkLiIsCisJCQkJICAgICAodWxvbmcpIGlubXNnLmhkci5QYXlsb2FkTWF4Qnl0ZXMsCisJCQkJICAgICAodWxvbmcpIGlubXNnLmhkci5QYXlsb2FkVm1PZmZzZXQsCisJCQkJICAgICBpbm1zZy5oZHIuSWQpOworCQkJfQorCQl9CisJCWlmICghZ290QUNvbW1hbmQpIHsKKwkJCWlmIChDb250cm9sVm1fUGVuZGluZ19Nc2dfVmFsaWQpIHsKKwkJCQkvKiB3ZSB0aHJvdHRsZWQgcHJvY2Vzc2luZyBvZiBhIHByaW9yCisJCQkJKiBtc2csIHNvIHRyeSB0byBwcm9jZXNzIGl0IGFnYWluCisJCQkJKiByYXRoZXIgdGhhbiByZWFkaW5nIGEgbmV3IG9uZQorCQkJCSovCisJCQkJaW5tc2cgPSBDb250cm9sVm1fUGVuZGluZ19Nc2c7CisJCQkJQ29udHJvbFZtX1BlbmRpbmdfTXNnX1ZhbGlkID0gRkFMU0U7CisJCQkJZ290QUNvbW1hbmQgPSBUUlVFOworCQkJfSBlbHNlCisJCQkJZ290QUNvbW1hbmQgPSByZWFkX2NvbnRyb2x2bV9ldmVudCgmaW5tc2cpOworCQl9CisJfQorCisJaGFuZGxlX2NvbW1hbmRfZmFpbGVkID0gRkFMU0U7CisJd2hpbGUgKGdvdEFDb21tYW5kICYmICghaGFuZGxlX2NvbW1hbmRfZmFpbGVkKSkgeworCQlNb3N0X3JlY2VudF9tZXNzYWdlX2ppZmZpZXMgPSBqaWZmaWVzOworCQlpZiAoQ29udHJvbFZtX2NoYW5uZWwpIHsKKwkJCWlmIChoYW5kbGVfY29tbWFuZChpbm1zZywKKwkJCQkJICAgdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcgorCQkJCQkgICAoQ29udHJvbFZtX2NoYW5uZWwpKSkKKwkJCQlnb3RBQ29tbWFuZCA9IHJlYWRfY29udHJvbHZtX2V2ZW50KCZpbm1zZyk7CisJCQllbHNlIHsKKwkJCQkvKiB0aGlzIGlzIGEgc2NlbmFyaW8gd2hlcmUgdGhyb3R0bGluZworCQkJCSogaXMgcmVxdWlyZWQsIGJ1dCBwcm9iYWJseSBOT1QgYW4KKwkJCQkqIGVycm9yLi4uOyB3ZSBzdGFzaCB0aGUgY3VycmVudAorCQkJCSogY29udHJvbHZtIG1zZyBzbyB3ZSB3aWxsIGF0dGVtcHQgdG8KKwkJCQkqIHJlcHJvY2VzcyBpdCBvbiBvdXIgbmV4dCBsb29wCisJCQkJKi8KKwkJCQloYW5kbGVfY29tbWFuZF9mYWlsZWQgPSBUUlVFOworCQkJCUNvbnRyb2xWbV9QZW5kaW5nX01zZyA9IGlubXNnOworCQkJCUNvbnRyb2xWbV9QZW5kaW5nX01zZ19WYWxpZCA9IFRSVUU7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCWhhbmRsZV9jb21tYW5kKGlubXNnLCAwKTsKKwkJCWdvdEFDb21tYW5kID0gRkFMU0U7CisJCX0KKwl9CisKKwkvKiBwYXJhaG90cGx1Z193b3JrZXIgKi8KKwlwYXJhaG90cGx1Z19wcm9jZXNzX2xpc3QoKTsKKworQXdheToKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsCisJCSAgICAgICBNb3N0X3JlY2VudF9tZXNzYWdlX2ppZmZpZXMgKyAoSFogKiBNSU5fSURMRV9TRUNPTkRTKSkpIHsKKwkJLyogaXQncyBiZWVuIGxvbmdlciB0aGFuIE1JTl9JRExFX1NFQ09ORFMgc2luY2Ugd2UKKwkJKiBwcm9jZXNzZWQgb3VyIGxhc3QgY29udHJvbHZtIG1lc3NhZ2U7IHNsb3cgZG93biB0aGUKKwkJKiBwb2xsaW5nCisJCSovCisJCWlmIChQb2xsX2ppZmZpZXMgIT0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9TTE9XKSB7CisJCQlMT0dJTkYoInN3aXRjaGVkIHRvIHNsb3cgY29udHJvbHZtIHBvbGxpbmciKTsKKwkJCVBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfU0xPVzsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChQb2xsX2ppZmZpZXMgIT0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9GQVNUKSB7CisJCQlQb2xsX2ppZmZpZXMgPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX0ZBU1Q7CisJCQlMT0dJTkYoInN3aXRjaGVkIHRvIGZhc3QgY29udHJvbHZtIHBvbGxpbmciKTsKKwkJfQorCX0KKworCXF1ZXVlX2RlbGF5ZWRfd29yayhQZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlLAorCQkJICAgJlBlcmlvZGljX2NvbnRyb2x2bV93b3JrLCBQb2xsX2ppZmZpZXMpOworfQorCitzdGF0aWMgdm9pZAorc2V0dXBfY3Jhc2hfZGV2aWNlc193b3JrX3F1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKworCUNPTlRST0xWTV9NRVNTQUdFIGxvY2FsQ3Jhc2hDcmVhdGVCdXNNc2c7CisJQ09OVFJPTFZNX01FU1NBR0UgbG9jYWxDcmFzaENyZWF0ZURldk1zZzsKKwlDT05UUk9MVk1fTUVTU0FHRSBtc2c7CisJSE9TVEFERFJFU1MgaG9zdF9hZGRyOworCVUzMiBsb2NhbFNhdmVkQ3Jhc2hNc2dPZmZzZXQ7CisJVTE2IGxvY2FsU2F2ZWRDcmFzaE1zZ0NvdW50OworCisJLyogbWFrZSBzdXJlIHZpc29yYnVzIHNlcnZlciBpcyByZWdpc3RlcmVkIGZvciBjb250cm9sdm0gY2FsbGJhY2tzICovCisJaWYgKHZpc29yY2hpcHNldF9zZXJ2ZXJyZWd3YWl0ICYmICFzZXJ2ZXJyZWdpc3RlcmVkKQorCQlnb3RvIEF3YXk7CisKKwkvKiBtYWtlIHN1cmUgdmlzb3JjbGllbnRidXMgc2VydmVyIGlzIHJlZ3NpdGVyZWQgZm9yIGNvbnRyb2x2bQorCSAqIGNhbGxiYWNrcworCSAqLworCWlmICh2aXNvcmNoaXBzZXRfY2xpZW50cmVnd2FpdCAmJiAhY2xpZW50cmVnaXN0ZXJlZCkKKwkJZ290byBBd2F5OworCisJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfRU5UUllfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCisJLyogc2VuZCBpbml0IGNoaXBzZXQgbXNnICovCisJbXNnLmhkci5JZCA9IENPTlRST0xWTV9DSElQU0VUX0lOSVQ7CisJbXNnLmNtZC5pbml0Q2hpcHNldC5idXNDb3VudCA9IDIzOworCW1zZy5jbWQuaW5pdENoaXBzZXQuc3dpdGNoQ291bnQgPSAwOworCisJY2hpcHNldF9pbml0KCZtc2cpOworCisJaG9zdF9hZGRyID0gY29udHJvbHZtX2dldF9jaGFubmVsX2FkZHJlc3MoKTsKKwlpZiAoIWhvc3RfYWRkcikgeworCQlMT0dFUlIoIkh1aD8gIEhvc3QgYWRkcmVzcyBpcyBOVUxMIik7CisJCVBPU1RDT0RFX0xJTlVYXzIoQ1JBU0hfREVWX0hBRERSX05VTEwsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisKKwlDb250cm9sVm1fY2hhbm5lbCA9CisJICAgIHZpc29yY2hhbm5lbF9jcmVhdGVfd2l0aF9sb2NrCisJICAgIChob3N0X2FkZHIsCisJICAgICBzaXplb2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wpLAorCSAgICAgVWx0cmFDb250cm9sdm1DaGFubmVsUHJvdG9jb2xHdWlkKTsKKworCWlmIChDb250cm9sVm1fY2hhbm5lbCA9PSBOVUxMKSB7CisJCUxPR0VSUigiZmFpbGVkIHRvIGNyZWF0ZSBjb250cm9sdm0gY2hhbm5lbCIpOworCQlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9DT05UUk9MVk1fTlVMTCwKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGdldCBzYXZlZCBtZXNzYWdlIGNvdW50ICovCisJaWYgKHZpc29yY2hhbm5lbF9yZWFkKENvbnRyb2xWbV9jaGFubmVsLAorCQkJICAgICAgb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsCisJCQkJICAgICAgIFNhdmVkQ3Jhc2hNc2dDb3VudCksCisJCQkgICAgICAmbG9jYWxTYXZlZENyYXNoTXNnQ291bnQsIHNpemVvZihVMTYpKSA8IDApIHsKKwkJTE9HRVJSKCJmYWlsZWQgdG8gZ2V0IFNhdmVkIE1lc3NhZ2UgQ291bnQiKTsKKwkJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfQ1RSTF9SRF9GQUlMVVJFX1BDLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGxvY2FsU2F2ZWRDcmFzaE1zZ0NvdW50ICE9IENPTlRST0xWTV9DUkFTSE1TR19NQVgpIHsKKwkJTE9HRVJSKCJTYXZlZCBNZXNzYWdlIENvdW50IGluY29ycmVjdCAlZCIsCisJCSAgICAgICBsb2NhbFNhdmVkQ3Jhc2hNc2dDb3VudCk7CisJCVBPU1RDT0RFX0xJTlVYXzMoQ1JBU0hfREVWX0NPVU5UX0ZBSUxVUkVfUEMsCisJCQkJIGxvY2FsU2F2ZWRDcmFzaE1zZ0NvdW50LAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyZXR1cm47CisJfQorCisJLyogZ2V0IHNhdmVkIGNyYXNoIG1lc3NhZ2Ugb2Zmc2V0ICovCisJaWYgKHZpc29yY2hhbm5lbF9yZWFkKENvbnRyb2xWbV9jaGFubmVsLAorCQkJICAgICAgb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsCisJCQkJICAgICAgIFNhdmVkQ3Jhc2hNc2dPZmZzZXQpLAorCQkJICAgICAgJmxvY2FsU2F2ZWRDcmFzaE1zZ09mZnNldCwgc2l6ZW9mKFUzMikpIDwgMCkgeworCQlMT0dFUlIoImZhaWxlZCB0byBnZXQgU2F2ZWQgTWVzc2FnZSBPZmZzZXQiKTsKKwkJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfQ1RSTF9SRF9GQUlMVVJFX1BDLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyZXR1cm47CisJfQorCisJLyogcmVhZCBjcmVhdGUgZGV2aWNlIG1lc3NhZ2UgZm9yIHN0b3JhZ2UgYnVzIG9mZnNldCAqLworCWlmICh2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwKKwkJCSAgICAgIGxvY2FsU2F2ZWRDcmFzaE1zZ09mZnNldCwKKwkJCSAgICAgICZsb2NhbENyYXNoQ3JlYXRlQnVzTXNnLAorCQkJICAgICAgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFKSkgPCAwKSB7CisJCUxPR0VSUigiQ1JBU0hfREVWX1JEX0JVU19GQUlVTFJFOiBGYWlsZWQgdG8gcmVhZCBDcmFzaENyZWF0ZUJ1c01zZyEiKTsKKwkJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfUkRfQlVTX0ZBSVVMUkVfUEMsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisKKwkvKiByZWFkIGNyZWF0ZSBkZXZpY2UgbWVzc2FnZSBmb3Igc3RvcmFnZSBkZXZpY2UgKi8KKwlpZiAodmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgICAgICBsb2NhbFNhdmVkQ3Jhc2hNc2dPZmZzZXQgKworCQkJICAgICAgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFKSwKKwkJCSAgICAgICZsb2NhbENyYXNoQ3JlYXRlRGV2TXNnLAorCQkJICAgICAgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFKSkgPCAwKSB7CisJCUxPR0VSUigiQ1JBU0hfREVWX1JEX0RFVl9GQUlVTFJFOiBGYWlsZWQgdG8gcmVhZCBDcmFzaENyZWF0ZURldk1zZyEiKTsKKwkJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfUkRfREVWX0ZBSVVMUkVfUEMsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisKKwkvKiByZXVzZSBJT1ZNIGNyZWF0ZSBidXMgbWVzc2FnZSAqLworCWlmIChsb2NhbENyYXNoQ3JlYXRlQnVzTXNnLmNtZC5jcmVhdGVCdXMuY2hhbm5lbEFkZHIgIT0gMCkKKwkJYnVzX2NyZWF0ZSgmbG9jYWxDcmFzaENyZWF0ZUJ1c01zZyk7CisJZWxzZSB7CisJCUxPR0VSUigiQ3Jhc2hDcmVhdGVCdXNNc2cgaXMgbnVsbCwgbm8gZHVtcCB3aWxsIGJlIHRha2VuIik7CisJCVBPU1RDT0RFX0xJTlVYXzIoQ1JBU0hfREVWX0JVU19OVUxMX0ZBSUxVUkVfUEMsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisKKwkvKiByZXVzZSBjcmVhdGUgZGV2aWNlIG1lc3NhZ2UgZm9yIHN0b3JhZ2UgZGV2aWNlICovCisJaWYgKGxvY2FsQ3Jhc2hDcmVhdGVEZXZNc2cuY21kLmNyZWF0ZURldmljZS5jaGFubmVsQWRkciAhPSAwKQorCQlteV9kZXZpY2VfY3JlYXRlKCZsb2NhbENyYXNoQ3JlYXRlRGV2TXNnKTsKKwllbHNlIHsKKwkJTE9HRVJSKCJDcmFzaENyZWF0ZURldk1zZyBpcyBudWxsLCBubyBkdW1wIHdpbGwgYmUgdGFrZW4iKTsKKwkJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfREVWX05VTExfRkFJTFVSRV9QQywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuOworCX0KKwlMT0dJTkYoIkJ1cyBhbmQgZGV2aWNlIHJlYWR5IGZvciBkdW1waW5nIik7CisJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJcmV0dXJuOworCitBd2F5OgorCisJUG9sbF9qaWZmaWVzID0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9TTE9XOworCisJcXVldWVfZGVsYXllZF93b3JrKFBlcmlvZGljX2NvbnRyb2x2bV93b3JrcXVldWUsCisJCQkgICAmUGVyaW9kaWNfY29udHJvbHZtX3dvcmssIFBvbGxfamlmZmllcyk7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfY3JlYXRlX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCBpbnQgcmVzcG9uc2UpCit7CisJYnVzX3Jlc3BvbmRlcihDT05UUk9MVk1fQlVTX0NSRUFURSwgYnVzTm8sIHJlc3BvbnNlKTsKK30KKworc3RhdGljIHZvaWQKK2J1c19kZXN0cm95X3Jlc3BvbnNlKHVsb25nIGJ1c05vLCBpbnQgcmVzcG9uc2UpCit7CisJYnVzX3Jlc3BvbmRlcihDT05UUk9MVk1fQlVTX0RFU1RST1ksIGJ1c05vLCByZXNwb25zZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZXZpY2VfY3JlYXRlX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKQoreworCWRldmljZV9yZXNwb25kZXIoQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUsIGJ1c05vLCBkZXZObywgcmVzcG9uc2UpOworfQorCitzdGF0aWMgdm9pZAorZGV2aWNlX2Rlc3Ryb3lfcmVzcG9uc2UodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpCit7CisJZGV2aWNlX3Jlc3BvbmRlcihDT05UUk9MVk1fREVWSUNFX0RFU1RST1ksIGJ1c05vLCBkZXZObywgcmVzcG9uc2UpOworfQorCit2b2lkCit2aXNvcmNoaXBzZXRfZGV2aWNlX3BhdXNlX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKQoreworCisJZGV2aWNlX2NoYW5nZXN0YXRlX3Jlc3BvbmRlcihDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFLAorCQkJCSAgICAgYnVzTm8sIGRldk5vLCByZXNwb25zZSwKKwkJCQkgICAgIFNlZ21lbnRTdGF0ZVN0YW5kYnkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X2RldmljZV9wYXVzZV9yZXNwb25zZSk7CisKK3N0YXRpYyB2b2lkCitkZXZpY2VfcmVzdW1lX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKQoreworCWRldmljZV9jaGFuZ2VzdGF0ZV9yZXNwb25kZXIoQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSwKKwkJCQkgICAgIGJ1c05vLCBkZXZObywgcmVzcG9uc2UsCisJCQkJICAgICBTZWdtZW50U3RhdGVSdW5uaW5nKTsKK30KKworQk9PTAordmlzb3JjaGlwc2V0X2dldF9idXNfaW5mbyh1bG9uZyBidXNObywgVklTT1JDSElQU0VUX0JVU19JTkZPICpidXNJbmZvKQoreworCXZvaWQgKnAgPSBmaW5kYnVzKCZCdXNJbmZvTGlzdCwgYnVzTm8pOworCWlmICghcCkgeworCQlMT0dFUlIoIiglbHUpIGZhaWxlZCIsIGJ1c05vKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwltZW1jcHkoYnVzSW5mbywgcCwgc2l6ZW9mKFZJU09SQ0hJUFNFVF9CVVNfSU5GTykpOworCXJldHVybiBUUlVFOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X2dldF9idXNfaW5mbyk7CisKK0JPT0wKK3Zpc29yY2hpcHNldF9zZXRfYnVzX2NvbnRleHQodWxvbmcgYnVzTm8sIHZvaWQgKmNvbnRleHQpCit7CisJVklTT1JDSElQU0VUX0JVU19JTkZPICpwID0gZmluZGJ1cygmQnVzSW5mb0xpc3QsIGJ1c05vKTsKKwlpZiAoIXApIHsKKwkJTE9HRVJSKCIoJWx1KSBmYWlsZWQiLCBidXNObyk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJcC0+YnVzX2RyaXZlcl9jb250ZXh0ID0gY29udGV4dDsKKwlyZXR1cm4gVFJVRTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hpcHNldF9zZXRfYnVzX2NvbnRleHQpOworCitCT09MCit2aXNvcmNoaXBzZXRfZ2V0X2RldmljZV9pbmZvKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywKKwkJCSAgICAgVklTT1JDSElQU0VUX0RFVklDRV9JTkZPICpkZXZJbmZvKQoreworCXZvaWQgKnAgPSBmaW5kZGV2aWNlKCZEZXZJbmZvTGlzdCwgYnVzTm8sIGRldk5vKTsKKwlpZiAoIXApIHsKKwkJTE9HRVJSKCIoJWx1LCVsdSkgZmFpbGVkIiwgYnVzTm8sIGRldk5vKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwltZW1jcHkoZGV2SW5mbywgcCwgc2l6ZW9mKFZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTykpOworCXJldHVybiBUUlVFOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X2dldF9kZXZpY2VfaW5mbyk7CisKK0JPT0wKK3Zpc29yY2hpcHNldF9zZXRfZGV2aWNlX2NvbnRleHQodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCB2b2lkICpjb250ZXh0KQoreworCVZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTyAqcCA9IGZpbmRkZXZpY2UoJkRldkluZm9MaXN0LCBidXNObywgZGV2Tm8pOworCWlmICghcCkgeworCQlMT0dFUlIoIiglbHUsJWx1KSBmYWlsZWQiLCBidXNObywgZGV2Tm8pOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXAtPmJ1c19kcml2ZXJfY29udGV4dCA9IGNvbnRleHQ7CisJcmV0dXJuIFRSVUU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoaXBzZXRfc2V0X2RldmljZV9jb250ZXh0KTsKKworLyogR2VuZXJpYyB3cmFwcGVyIGZ1bmN0aW9uIGZvciBhbGxvY2F0aW5nIG1lbW9yeSBmcm9tIGEga21lbV9jYWNoZSBwb29sLgorICovCit2b2lkICoKK3Zpc29yY2hpcHNldF9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqcG9vbCwgQk9PTCBva190b19ibG9jaywKKwkJCSBjaGFyICpmbiwgaW50IGxuKQoreworCWdmcF90IGdmcDsKKwl2b2lkICpwOworCisJaWYgKG9rX3RvX2Jsb2NrKQorCQlnZnAgPSBHRlBfS0VSTkVMOworCWVsc2UKKwkJZ2ZwID0gR0ZQX0FUT01JQzsKKwkvKiBfX0dGUF9OT1JFVFJZIG1lYW5zICJvayB0byBmYWlsIiwgbWVhbmluZworCSAqIGttZW1fY2FjaGVfYWxsb2MoKSBjYW4gcmV0dXJuIE5VTEwsIGltcGx5aW5nIHRoZSBjYWxsZXIgQ0FOCisJICogY29wZSB3aXRoIGZhaWx1cmUuICBJZiB5b3UgZG8gTk9UIHNwZWNpZnkgX19HRlBfTk9SRVRSWSwKKwkgKiBMaW51eCB3aWxsIGdvIHRvIGV4dHJlbWUgbWVhc3VyZXMgdG8gZ2V0IG1lbW9yeSBmb3IgeW91CisJICogKGxpa2UsIGludm9rZSBvb20ga2lsbGVyKSwgd2hpY2ggd2lsbCBwcm9iYWJseSBjcmlwcGxlIHRoZQorCSAqIHN5c3RlbS4KKwkgKi8KKwlnZnAgfD0gX19HRlBfTk9SRVRSWTsKKwlwID0ga21lbV9jYWNoZV9hbGxvYyhwb29sLCBnZnApOworCWlmICghcCkgeworCQlMT0dFUlIoImttZW1fY2FjaGVfYWxsb2MgZmFpbGVkIGVhcmx5IEAlczolZFxuIiwgZm4sIGxuKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWF0b21pY19pbmMoJlZpc29yY2hpcHNldF9jYWNoZV9idWZmZXJzX2luX3VzZSk7CisJcmV0dXJuIHA7Cit9CisKKy8qIEdlbmVyaWMgd3JhcHBlciBmdW5jdGlvbiBmb3IgZnJlZWluZyBtZW1vcnkgZnJvbSBhIGttZW1fY2FjaGUgcG9vbC4KKyAqLwordm9pZAordmlzb3JjaGlwc2V0X2NhY2hlX2ZyZWUoc3RydWN0IGttZW1fY2FjaGUgKnBvb2wsIHZvaWQgKnAsIGNoYXIgKmZuLCBpbnQgbG4pCit7CisJaWYgKCFwKSB7CisJCUxPR0VSUigiTlVMTCBwb2ludGVyIEAlczolZFxuIiwgZm4sIGxuKTsKKwkJcmV0dXJuOworCX0KKwlhdG9taWNfZGVjKCZWaXNvcmNoaXBzZXRfY2FjaGVfYnVmZmVyc19pbl91c2UpOworCWttZW1fY2FjaGVfZnJlZShwb29sLCBwKTsKK30KKworI2RlZmluZSBnZXR0b2tlbihidWZwKSBzdHJzZXAoYnVmcCwgIiAtXHRcbiIpCisKK3N0YXRpYyBzc2l6ZV90CitjaGlwc2V0X3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgYnVmWzUxMl07CisJY2hhciAqdG9rZW4sICpwOworCisJaWYgKGNvdW50ID4gc2l6ZW9mKGJ1ZikgLSAxKSB7CisJCUxPR0VSUigiY2hpcHNldF9wcm9jX3dyaXRlOiBjb3VudCAoJWQpIGV4Y2VlZHMgc2l6ZSBvZiBidWZmZXIgKCVkKSIsCisJCSAgICAgKGludCkgY291bnQsIChpbnQpIHNpemVvZihidWZmZXIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCUxPR0VSUigiY2hpcHNldF9wcm9jX3dyaXRlOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWJ1Zltjb3VudF0gPSAnXDAnOworCisJcCA9IGJ1ZjsKKwl0b2tlbiA9IGdldHRva2VuKCZwKTsKKworCWlmIChzdHJjbXAodG9rZW4sICJDQUxMSE9NRURJU0tfTU9VTlRFRCIpID09IDApIHsKKwkJdG9rZW4gPSBnZXR0b2tlbigmcCk7CisJCS8qIFRoZSBDYWxsIEhvbWUgRGlzayBoYXMgYmVlbiBtb3VudGVkICovCisJCWlmIChzdHJjbXAodG9rZW4sICIwIikgPT0gMCkKKwkJCWNoaXBzZXRfZXZlbnRzWzBdID0gMTsKKwl9IGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1PRFVMRVNfTE9BREVEIikgPT0gMCkgeworCQl0b2tlbiA9IGdldHRva2VuKCZwKTsKKwkJLyogQWxsIG1vZHVsZXMgZm9yIHRoZSBwYXJ0aXRpb24gaGF2ZSBiZWVuIGxvYWRlZCAqLworCQlpZiAoc3RyY21wKHRva2VuLCAiMCIpID09IDApCisJCQljaGlwc2V0X2V2ZW50c1sxXSA9IDE7CisJfSBlbHNlIGlmICh0b2tlbiA9PSBOVUxMKSB7CisJCS8qIE5vIGV2ZW50IHNwZWNpZmllZCAqLworCQlMT0dFUlIoIk5vIGV2ZW50IHdhcyBzcGVjaWZpZWQgdG8gc2VuZCBDSElQU0VUX1JFQURZIHJlc3BvbnNlIik7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQkvKiBVbnN1cHBvcnRlZCBldmVudCBzcGVjaWZpZWQgKi8KKwkJTE9HRVJSKCIlcyBpcyBhbiBpbnZhbGlkIGV2ZW50IGZvciBzZW5kaW5nIENISVBTRVRfUkVBRFkgcmVzcG9uc2UiLAkJICAgICB0b2tlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit2aXNvcmNoaXBzZXRfcHJvY19yZWFkX3dyaXRlb25seShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVhZHMgdGhlIEluc3RhbGxhdGlvbkVycm9yLCBJbnN0YWxsYXRpb25UZXh0SWQsCisgKiBJbnN0YWxsYXRpb25SZW1haW5pbmdTdGVwcyBmaWVsZHMgb2YgQ29udHJvbFZNQ2hhbm5lbC4KKyAqLworc3RhdGljIHNzaXplX3QKK3Byb2NfcmVhZF9pbnN0YWxsZXIoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCSAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCkKK3sKKwlpbnQgbGVuZ3RoID0gMDsKKwlVMTYgcmVtYWluaW5nU3RlcHM7CisJVTMyIGVycm9yLCB0ZXh0SWQ7CisJY2hhciAqdmJ1ZjsKKwlsb2ZmX3QgcG9zID0gKm9mZnNldDsKKworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwb3MgPiAwIHx8ICFsZW4pCisJCXJldHVybiAwOworCisJdmJ1ZiA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJdmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCSAgIEluc3RhbGxhdGlvblJlbWFpbmluZ1N0ZXBzKSwgJnJlbWFpbmluZ1N0ZXBzLAorCQkJICBzaXplb2YoVTE2KSk7CisJdmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCSAgIEluc3RhbGxhdGlvbkVycm9yKSwgJmVycm9yLCBzaXplb2YoVTMyKSk7CisJdmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCSAgIEluc3RhbGxhdGlvblRleHRJZCksICZ0ZXh0SWQsIHNpemVvZihVMzIpKTsKKworCWxlbmd0aCA9IHNwcmludGYodmJ1ZiwgIiV1ICV1ICV1XG4iLCByZW1haW5pbmdTdGVwcywgZXJyb3IsIHRleHRJZCk7CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIHZidWYsIGxlbmd0aCkpIHsKKwkJa2ZyZWUodmJ1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWtmcmVlKHZidWYpOworCSpvZmZzZXQgKz0gbGVuZ3RoOworCXJldHVybiBsZW5ndGg7Cit9CisKKy8qKgorICogV3JpdGVzIHRvIHRoZSBJbnN0YWxsYXRpb25FcnJvciwgSW5zdGFsbGF0aW9uVGV4dElkLAorICogSW5zdGFsbGF0aW9uUmVtYWluaW5nU3RlcHMgZmllbGRzIG9mCisgKiBDb250cm9sVk1DaGFubmVsLgorICogSW5wdXQ6IFJlbWFpbmluZ1N0ZXBzIEVycm9yIFRleHRJZAorICogTGltaXQgMzIgY2hhcmFjdGVycyBpbnB1dAorICovCisjZGVmaW5lIFVJTlQxNl9NQVgJCSg2NTUzNVUpCisjZGVmaW5lIFVJTlQzMl9NQVgJCSg0Mjk0OTY3Mjk1VSkKK3N0YXRpYyBzc2l6ZV90Citwcm9jX3dyaXRlX2luc3RhbGxlcihzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1ZlszMl07CisJVTE2IHJlbWFpbmluZ1N0ZXBzOworCVUzMiBlcnJvciwgdGV4dElkOworCisJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGJ1ZmZlciBvdmVyZmxvdyAqLworCWlmIChjb3VudCA+IChzaXplb2YoYnVmKSAtIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCVdBUk4oMSwgIkVycm9yIGNvcHlpbmcgZnJvbSB1c2VyIHNwYWNlXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHNzY2FuZihidWYsICIlaHUgJWkgJWkiLCAmcmVtYWluaW5nU3RlcHMsICZlcnJvciwgJnRleHRJZCkgIT0gMykgeworCQlyZW1haW5pbmdTdGVwcyA9IFVJTlQxNl9NQVg7CisJCWVycm9yID0gVUlOVDMyX01BWDsKKwkJdGV4dElkID0gVUlOVDMyX01BWDsKKwl9CisKKwlpZiAocmVtYWluaW5nU3RlcHMgIT0gVUlOVDE2X01BWCkgeworCQlpZiAodmlzb3JjaGFubmVsX3dyaXRlCisJCSAgICAoQ29udHJvbFZtX2NoYW5uZWwsCisJCSAgICAgb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsCisJCQkgICAgICBJbnN0YWxsYXRpb25SZW1haW5pbmdTdGVwcyksICZyZW1haW5pbmdTdGVwcywKKwkJICAgICBzaXplb2YoVTE2KSkgPCAwKQorCQkJV0FSTigxLCAiSW5zdGFsbGF0aW9uIFN0YXR1cyBXcml0ZSBGYWlsZWQgLSBXcml0ZSBmdW5jdGlvbiBlcnJvciAtIFJlbWFpbmluZ1N0ZXBzID0gJWRcbiIsCisJCQkgICAgIHJlbWFpbmluZ1N0ZXBzKTsKKwl9CisKKwlpZiAoZXJyb3IgIT0gVUlOVDMyX01BWCkgeworCQlpZiAodmlzb3JjaGFubmVsX3dyaXRlCisJCSAgICAoQ29udHJvbFZtX2NoYW5uZWwsCisJCSAgICAgb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsCisJCQkgICAgICBJbnN0YWxsYXRpb25FcnJvciksICZlcnJvciwgc2l6ZW9mKFUzMikpIDwgMCkKKwkJCVdBUk4oMSwgIkluc3RhbGxhdGlvbiBTdGF0dXMgV3JpdGUgRmFpbGVkIC0gV3JpdGUgZnVuY3Rpb24gZXJyb3IgLSBFcnJvciA9ICVkXG4iLAorCQkJICAgICBlcnJvcik7CisJfQorCisJaWYgKHRleHRJZCAhPSBVSU5UMzJfTUFYKSB7CisJCWlmICh2aXNvcmNoYW5uZWxfd3JpdGUKKwkJICAgIChDb250cm9sVm1fY2hhbm5lbCwKKwkJICAgICBvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwKKwkJCSAgICAgIEluc3RhbGxhdGlvblRleHRJZCksICZ0ZXh0SWQsIHNpemVvZihVMzIpKSA8IDApCisJCQlXQVJOKDEsICJJbnN0YWxsYXRpb24gU3RhdHVzIFdyaXRlIEZhaWxlZCAtIFdyaXRlIGZ1bmN0aW9uIGVycm9yIC0gVGV4dElkID0gJWRcbiIsCisJCQkgICAgIHRleHRJZCk7CisJfQorCisJLyogU28gdGhpcyBmdW5jdGlvbiBpc24ndCBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIG11c3QgcmV0dXJuCisJICogc2l6ZSBvZiBidWZmZXIKKwkgKi8KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICogUmVhZHMgdGhlIFRvb2xBY3Rpb24gZmllbGQgb2YgQ29udHJvbFZNQ2hhbm5lbC4KKyAqLworc3RhdGljIHNzaXplX3QKK3Byb2NfcmVhZF90b29sYWN0aW9uKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KQoreworCWludCBsZW5ndGggPSAwOworCVU4IHRvb2xBY3Rpb247CisJY2hhciAqdmJ1ZjsKKwlsb2ZmX3QgcG9zID0gKm9mZnNldDsKKworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwb3MgPiAwIHx8ICFsZW4pCisJCXJldHVybiAwOworCisJdmJ1ZiA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJdmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCSAgIFRvb2xBY3Rpb24pLCAmdG9vbEFjdGlvbiwgc2l6ZW9mKFU4KSk7CisKKwlsZW5ndGggPSBzcHJpbnRmKHZidWYsICIldVxuIiwgdG9vbEFjdGlvbik7CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIHZidWYsIGxlbmd0aCkpIHsKKwkJa2ZyZWUodmJ1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWtmcmVlKHZidWYpOworCSpvZmZzZXQgKz0gbGVuZ3RoOworCXJldHVybiBsZW5ndGg7Cit9CisKKy8qKgorICogV3JpdGVzIHRvIHRoZSBUb29sQWN0aW9uIGZpZWxkIG9mIENvbnRyb2xWTUNoYW5uZWwuCisgKiBJbnB1dDogVG9vbEFjdGlvbgorICogTGltaXQgMyBjaGFyYWN0ZXJzIGlucHV0CisgKi8KKyNkZWZpbmUgVUlOVDhfTUFYICgyNTVVKQorc3RhdGljIHNzaXplX3QKK3Byb2Nfd3JpdGVfdG9vbGFjdGlvbihzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZbM107CisJVTggdG9vbEFjdGlvbjsKKworCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBidWZmZXIgb3ZlcmZsb3cgKi8KKwlpZiAoY291bnQgPiAoc2l6ZW9mKGJ1ZikgLSAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlXQVJOKDEsICJFcnJvciBjb3B5aW5nIGZyb20gdXNlciBzcGFjZVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChzc2NhbmYoYnVmLCAiJWhoZCIsICZ0b29sQWN0aW9uKSAhPSAxKQorCQl0b29sQWN0aW9uID0gVUlOVDhfTUFYOworCisJaWYgKHRvb2xBY3Rpb24gIT0gVUlOVDhfTUFYKSB7CisJCWlmICh2aXNvcmNoYW5uZWxfd3JpdGUKKwkJICAgIChDb250cm9sVm1fY2hhbm5lbCwKKwkJICAgICBvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwgVG9vbEFjdGlvbiksCisJCSAgICAgJnRvb2xBY3Rpb24sIHNpemVvZihVOCkpIDwgMCkKKwkJCVdBUk4oMSwgIkluc3RhbGxhdGlvbiBUb29sQWN0aW9uIFdyaXRlIEZhaWxlZCAtIFRvb2xBY3Rpb24gPSAlZFxuIiwKKwkJCSAgICAgdG9vbEFjdGlvbik7CisJfQorCisJLyogU28gdGhpcyBmdW5jdGlvbiBpc24ndCBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIG11c3QgcmV0dXJuCisJICogc2l6ZSBvZiBidWZmZXIKKwkgKi8KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICogUmVhZHMgdGhlIEVmaVNwYXJJbmRpY2F0aW9uLkJvb3RUb1Rvb2wgZmllbGQgb2YgQ29udHJvbFZNQ2hhbm5lbC4KKyAqLworc3RhdGljIHNzaXplX3QKK3Byb2NfcmVhZF9ib290VG9Ub29sKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KQoreworCWludCBsZW5ndGggPSAwOworCVVMVFJBX0VGSV9TUEFSX0lORElDQVRJT04gZWZpU3BhckluZGljYXRpb247CisJY2hhciAqdmJ1ZjsKKwlsb2ZmX3QgcG9zID0gKm9mZnNldDsKKworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwb3MgPiAwIHx8ICFsZW4pCisJCXJldHVybiAwOworCisJdmJ1ZiA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJdmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCSAgIEVmaVNwYXJJbmRpY2F0aW9uKSwgJmVmaVNwYXJJbmRpY2F0aW9uLAorCQkJICBzaXplb2YoVUxUUkFfRUZJX1NQQVJfSU5ESUNBVElPTikpOworCisJbGVuZ3RoID0gc3ByaW50Zih2YnVmLCAiJWRcbiIsIChpbnQpIGVmaVNwYXJJbmRpY2F0aW9uLkJvb3RUb1Rvb2wpOworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCB2YnVmLCBsZW5ndGgpKSB7CisJCWtmcmVlKHZidWYpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlrZnJlZSh2YnVmKTsKKwkqb2Zmc2V0ICs9IGxlbmd0aDsKKwlyZXR1cm4gbGVuZ3RoOworfQorCisvKioKKyAqIFdyaXRlcyB0byB0aGUgRWZpU3BhckluZGljYXRpb24uQm9vdFRvVG9vbCBmaWVsZCBvZiBDb250cm9sVk1DaGFubmVsLgorICogSW5wdXQ6IDEgb3IgMCAoMSBiZWluZyBvbiwgMCBiZWluZyBvZmYpCisgKi8KK3N0YXRpYyBzc2l6ZV90Citwcm9jX3dyaXRlX2Jvb3RUb1Rvb2woc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgYnVmWzNdOworCWludCBpbnB1dFZhbDsKKwlVTFRSQV9FRklfU1BBUl9JTkRJQ0FUSU9OIGVmaVNwYXJJbmRpY2F0aW9uOworCisJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGJ1ZmZlciBvdmVyZmxvdyAqLworCWlmIChjb3VudCA+IChzaXplb2YoYnVmKSAtIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCVdBUk4oMSwgIkVycm9yIGNvcHlpbmcgZnJvbSB1c2VyIHNwYWNlXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHNzY2FuZihidWYsICIlaSIsICZpbnB1dFZhbCkgIT0gMSkKKwkJaW5wdXRWYWwgPSAwOworCisJZWZpU3BhckluZGljYXRpb24uQm9vdFRvVG9vbCA9IChpbnB1dFZhbCA9PSAxID8gMSA6IDApOworCisJaWYgKHZpc29yY2hhbm5lbF93cml0ZQorCSAgICAoQ29udHJvbFZtX2NoYW5uZWwsCisJICAgICBvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwgRWZpU3BhckluZGljYXRpb24pLAorCSAgICAgJmVmaVNwYXJJbmRpY2F0aW9uLCBzaXplb2YoVUxUUkFfRUZJX1NQQVJfSU5ESUNBVElPTikpIDwgMCkKKwkJcHJpbnRrCisJCSAgICAoIkluc3RhbGxhdGlvbiBCb290VG9Ub29sIFdyaXRlIEZhaWxlZCAtIEJvb3RUb1Rvb2wgPSAlZFxuIiwKKwkJICAgICAoaW50KSBlZmlTcGFySW5kaWNhdGlvbi5Cb290VG9Ub29sKTsKKworCS8qIFNvIHRoaXMgZnVuY3Rpb24gaXNuJ3QgY2FsbGVkIG11bHRpcGxlIHRpbWVzLCBtdXN0IHJldHVybgorCSAqIHNpemUgb2YgYnVmZmVyCisJICovCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjaGlwc2V0X3Byb2NfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucmVhZCA9IHZpc29yY2hpcHNldF9wcm9jX3JlYWRfd3JpdGVvbmx5LAorCS53cml0ZSA9IGNoaXBzZXRfcHJvY193cml0ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0Cit2aXNvcmNoaXBzZXRfaW5pdCh2b2lkKQoreworCWludCByYyA9IDAsIHggPSAwOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaW5zdGFsbGVyX2ZpbGU7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICp0b29sYWN0aW9uX2ZpbGU7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpib290VG9Ub29sX2ZpbGU7CisKKwlMT0dJTkYoImNoaXBzZXQgZHJpdmVyIHZlcnNpb24gJXMgbG9hZGVkIiwgVkVSU0lPTik7CisJLyogcHJvY2VzcyBtb2R1bGUgb3B0aW9ucyAqLworCVBPU1RDT0RFX0xJTlVYXzIoRFJJVkVSX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCUxPR0lORigib3B0aW9uIC0gdGVzdHZuaWM9JWQiLCB2aXNvcmNoaXBzZXRfdGVzdHZuaWMpOworCUxPR0lORigib3B0aW9uIC0gdGVzdHZuaWNjbGllbnQ9JWQiLCB2aXNvcmNoaXBzZXRfdGVzdHZuaWNjbGllbnQpOworCUxPR0lORigib3B0aW9uIC0gdGVzdG1zZz0lZCIsIHZpc29yY2hpcHNldF90ZXN0bXNnKTsKKwlMT0dJTkYoIm9wdGlvbiAtIHRlc3R0ZWFyZG93bj0lZCIsIHZpc29yY2hpcHNldF90ZXN0dGVhcmRvd24pOworCUxPR0lORigib3B0aW9uIC0gbWFqb3I9JWQiLCB2aXNvcmNoaXBzZXRfbWFqb3IpOworCUxPR0lORigib3B0aW9uIC0gc2VydmVycmVnd2FpdD0lZCIsIHZpc29yY2hpcHNldF9zZXJ2ZXJyZWd3YWl0KTsKKwlMT0dJTkYoIm9wdGlvbiAtIGNsaWVudHJlZ3dhaXQ9JWQiLCB2aXNvcmNoaXBzZXRfY2xpZW50cmVnd2FpdCk7CisJTE9HSU5GKCJvcHRpb24gLSBob2xkY2hpcHNldHJlYWR5PSVkIiwgdmlzb3JjaGlwc2V0X2hvbGRjaGlwc2V0cmVhZHkpOworCisJbWVtc2V0KCZCdXNEZXZfU2VydmVyX05vdGlmaWVycywgMCwgc2l6ZW9mKEJ1c0Rldl9TZXJ2ZXJfTm90aWZpZXJzKSk7CisJbWVtc2V0KCZCdXNEZXZfQ2xpZW50X05vdGlmaWVycywgMCwgc2l6ZW9mKEJ1c0Rldl9DbGllbnRfTm90aWZpZXJzKSk7CisJbWVtc2V0KCZDb250cm9sVm1fcGF5bG9hZF9pbmZvLCAwLCBzaXplb2YoQ29udHJvbFZtX3BheWxvYWRfaW5mbykpOworCW1lbXNldCgmTGl2ZUR1bXBfaW5mbywgMCwgc2l6ZW9mKExpdmVEdW1wX2luZm8pKTsKKwlhdG9taWNfc2V0KCZMaXZlRHVtcF9pbmZvLmJ1ZmZlcnNfaW5fdXNlLCAwKTsKKworCWlmICh2aXNvcmNoaXBzZXRfdGVzdHZuaWMpIHsKKwkJRVJSRFJWKCJ0ZXN0dm5pYyBvcHRpb24gbm8gbG9uZ2VyIHN1cHBvcnRlZDogKHN0YXR1cyA9ICVkKVxuIiwKKwkJICAgICAgIHgpOworCQlQT1NUQ09ERV9MSU5VWF8zKENISVBTRVRfSU5JVF9GQUlMVVJFX1BDLCB4LCBESUFHX1NFVkVSSVRZX0VSUik7CisJCXJjID0geDsKKwkJZ290byBBd2F5OworCX0KKworCWNvbnRyb2x2bV9pbml0KCk7CisJTWFqb3JEZXYgPSBNS0RFVih2aXNvcmNoaXBzZXRfbWFqb3IsIDApOworCXJjID0gdmlzb3JjaGlwc2V0X2ZpbGVfaW5pdChNYWpvckRldiwgJkNvbnRyb2xWbV9jaGFubmVsKTsKKwlpZiAocmMgPCAwKSB7CisJCUVSUkRSVigidmlzb3JjaGlwc2V0X2ZpbGVfaW5pdChNYWpvckRldiwgJkNvbnRyb2xWbV9jaGFubmVsKTogZXJyb3IgKHN0YXR1cz0lZClcbiIsIHJjKTsKKwkJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRkFJTFVSRV9QQywgRElBR19TRVZFUklUWV9FUlIpOworCQlnb3RvIEF3YXk7CisJfQorCisJcHJvY19Jbml0KCk7CisJbWVtc2V0KFBhcnRpdGlvblByb3BlcnR5TmFtZXMsIDAsIHNpemVvZihQYXJ0aXRpb25Qcm9wZXJ0eU5hbWVzKSk7CisJbWVtc2V0KENvbnRyb2xWbVByb3BlcnR5TmFtZXMsIDAsIHNpemVvZihDb250cm9sVm1Qcm9wZXJ0eU5hbWVzKSk7CisJSW5pdFBhcnRpdGlvblByb3BlcnRpZXMoKTsKKwlJbml0Q29udHJvbFZtUHJvcGVydGllcygpOworCisJUGFydGl0aW9uVHlwZSA9IHZpc29yX3Byb2NfQ3JlYXRlVHlwZShQcm9jRGlyLCBQYXJ0aXRpb25UeXBlTmFtZXMsCisJCQkJCSAgICAgIChjb25zdCBjaGFyICoqKQorCQkJCQkgICAgICBQYXJ0aXRpb25Qcm9wZXJ0eU5hbWVzLAorCQkJCQkgICAgICAmc2hvd19wYXJ0aXRpb25fcHJvcGVydHkpOworCUNvbnRyb2xWbVR5cGUgPQorCSAgICB2aXNvcl9wcm9jX0NyZWF0ZVR5cGUoUHJvY0RpciwgQ29udHJvbFZtVHlwZU5hbWVzLAorCQkJCSAgKGNvbnN0IGNoYXIgKiopIENvbnRyb2xWbVByb3BlcnR5TmFtZXMsCisJCQkJICAmc2hvd19jb250cm9sdm1fcHJvcGVydHkpOworCisJQ29udHJvbFZtT2JqZWN0ID0gdmlzb3JfcHJvY19DcmVhdGVPYmplY3QoQ29udHJvbFZtVHlwZSwgTlVMTCwgTlVMTCk7CisKKwkvKiBTZXR1cCBJbnN0YWxsYXRpb24gZmllbGRzICovCisJaW5zdGFsbGVyX2ZpbGUgPSBwcm9jX2NyZWF0ZSgiaW5zdGFsbGVyIiwgMDY0NCwgUHJvY0RpciwKKwkJCQkgICAgICZwcm9jX2luc3RhbGxlcl9mb3BzKTsKKwkvKiBTZXR1cCB0aGUgVG9vbEFjdGlvbiBmaWVsZCAqLworCXRvb2xhY3Rpb25fZmlsZSA9IHByb2NfY3JlYXRlKCJ0b29sYWN0aW9uIiwgMDY0NCwgUHJvY0RpciwKKwkJCQkgICAgICAmcHJvY190b29sYWN0aW9uX2ZvcHMpOworCS8qIFNldHVwIHRoZSBCb290VG9Ub29sIGZpZWxkICovCisJYm9vdFRvVG9vbF9maWxlID0gcHJvY19jcmVhdGUoImJvb3R0b3Rvb2wiLCAwNjQ0LCBQcm9jRGlyLAorCQkJCSAgICAgICZwcm9jX2Jvb3RUb1Rvb2xfZm9wcyk7CisKKwltZW1zZXQoJmdfRGlhZ01zZ0hkciwgMCwgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUikpOworCisJY2hpcHNldF9wcm9jX2RpciA9IHByb2NfY3JlYXRlKFZJU09SQ0hJUFNFVF9DSElQU0VUX1BST0NfRU5UUllfRk4sCisJCQkJICAgICAgIDA2NDQsIFByb2NEaXIsICZjaGlwc2V0X3Byb2NfZm9wcyk7CisJbWVtc2V0KCZnX0NoaXBTZXRNc2dIZHIsIDAsIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIpKTsKKworCXBhcmFob3RwbHVnX3Byb2NfZGlyID0KKwkgICAgcHJvY19jcmVhdGUoVklTT1JDSElQU0VUX1BBUkFIT1RQTFVHX1BST0NfRU5UUllfRk4sIDAyMDAsCisJCQlQcm9jRGlyLCAmcGFyYWhvdHBsdWdfcHJvY19mb3BzKTsKKwltZW1zZXQoJmdfRGVsRHVtcE1zZ0hkciwgMCwgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUikpOworCisJaWYgKGZpbGV4ZmVyX2NvbnN0cnVjdG9yKHNpemVvZihzdHJ1Y3QgcHV0ZmlsZV9yZXF1ZXN0KSkgPCAwKSB7CisJCUVSUkRSVigiZmlsZXhmZXJfY29uc3RydWN0b3IgZmFpbGVkOiAoc3RhdHVzPS0xKVxuIik7CisJCVBPU1RDT0RFX0xJTlVYXzIoQ0hJUFNFVF9JTklUX0ZBSUxVUkVfUEMsIERJQUdfU0VWRVJJVFlfRVJSKTsKKwkJcmMgPSAtMTsKKwkJZ290byBBd2F5OworCX0KKwlQdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2wgPQorCSAgICBrbWVtX2NhY2hlX2NyZWF0ZShQdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2xfbmFtZSwKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3QgcHV0ZmlsZV9idWZmZXJfZW50cnkpLAorCQkJICAgICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKKwlpZiAoIVB1dGZpbGVfYnVmZmVyX2xpc3RfcG9vbCkgeworCQlFUlJEUlYoImZhaWxlZCB0byBhbGxvYyBQdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2w6IChzdGF0dXM9LTEpXG4iKTsKKwkJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRkFJTFVSRV9QQywgRElBR19TRVZFUklUWV9FUlIpOworCQlyYyA9IC0xOworCQlnb3RvIEF3YXk7CisJfQorCWlmICh2aXNvcmNoaXBzZXRfZGlzYWJsZV9jb250cm9sdm0pIHsKKwkJTE9HSU5GKCJ2aXNvcmNoaXBzZXRfaW5pdDpjb250cm9sdm0gZGlzYWJsZWQiKTsKKwl9IGVsc2UgeworCQkvKiBpZiBib290aW5nIGluIGEgY3Jhc2gga2VybmVsICovCisJCWlmICh2aXNvcmNoaXBzZXRfY3Jhc2hfa2VybmVsKQorCQkJSU5JVF9ERUxBWUVEX1dPUksoJlBlcmlvZGljX2NvbnRyb2x2bV93b3JrLAorCQkJCQkgIHNldHVwX2NyYXNoX2RldmljZXNfd29ya19xdWV1ZSk7CisJCWVsc2UKKwkJCUlOSVRfREVMQVlFRF9XT1JLKCZQZXJpb2RpY19jb250cm9sdm1fd29yaywKKwkJCQkJICBjb250cm9sdm1fcGVyaW9kaWNfd29yayk7CisJCVBlcmlvZGljX2NvbnRyb2x2bV93b3JrcXVldWUgPQorCQkgICAgY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInZpc29yY2hpcHNldF9jb250cm9sdm0iKTsKKworCQlpZiAoUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSA9PSBOVUxMKSB7CisJCQlFUlJEUlYoImNhbm5vdCBjcmVhdGUgY29udHJvbHZtIHdvcmtxdWV1ZTogKHN0YXR1cz0lZClcbiIsCisJCQkgICAgICAgLUVOT01FTSk7CisJCQlQT1NUQ09ERV9MSU5VWF8yKENSRUFURV9XT1JLUVVFVUVfRkFJTEVEX1BDLAorCQkJCQkgRElBR19TRVZFUklUWV9FUlIpOworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBBd2F5OworCQl9CisJCU1vc3RfcmVjZW50X21lc3NhZ2VfamlmZmllcyA9IGppZmZpZXM7CisJCVBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVDsKKwkJcmMgPSBxdWV1ZV9kZWxheWVkX3dvcmsoUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSwKKwkJCQkJJlBlcmlvZGljX2NvbnRyb2x2bV93b3JrLCBQb2xsX2ppZmZpZXMpOworCQlpZiAocmMgPCAwKSB7CisJCQlFUlJEUlYoInF1ZXVlX2RlbGF5ZWRfd29yayhQZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlLCAmUGVyaW9kaWNfY29udHJvbHZtX3dvcmssIFBvbGxfamlmZmllcyk6IGVycm9yIChzdGF0dXM9JWQpXG4iLCByYyk7CisJCQlQT1NUQ09ERV9MSU5VWF8yKFFVRVVFX0RFTEFZRURfV09SS19QQywKKwkJCQkJIERJQUdfU0VWRVJJVFlfRVJSKTsKKwkJCWdvdG8gQXdheTsKKwkJfQorCisJfQorCisJVmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZS5kZXYuZGV2dCA9IE1ham9yRGV2OworCWlmIChwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJlZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UpIDwgMCkgeworCQlFUlJEUlYoInBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcih2aXNvcmNoaXBzZXQpIGZhaWxlZDogKHN0YXR1cz0tMSlcbiIpOworCQlQT1NUQ09ERV9MSU5VWF8yKERFVklDRV9SRUdJU1RFUl9GQUlMVVJFX1BDLCBESUFHX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLTE7CisJCWdvdG8gQXdheTsKKwl9CisJTE9HSU5GKCJ2aXNvcmNoaXBzZXQgZGV2aWNlIGNyZWF0ZWQiKTsKKwlQT1NUQ09ERV9MSU5VWF8yKENISVBTRVRfSU5JVF9TVUNDRVNTX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwlyYyA9IDA7CitBd2F5OgorCWlmIChyYykgeworCQlMT0dFUlIoInZpc29yY2hpcHNldF9pbml0IGZhaWxlZCIpOworCQlQT1NUQ09ERV9MSU5VWF8zKENISVBTRVRfSU5JVF9GQUlMVVJFX1BDLCByYywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZAordmlzb3JjaGlwc2V0X2V4aXQodm9pZCkKK3sKKwljaGFyIHNbOTldOworCVBPU1RDT0RFX0xJTlVYXzIoRFJJVkVSX0VYSVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCisJaWYgKHZpc29yY2hpcHNldF9kaXNhYmxlX2NvbnRyb2x2bSkgeworCQk7CisJfSBlbHNlIHsKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmUGVyaW9kaWNfY29udHJvbHZtX3dvcmspOworCQlmbHVzaF93b3JrcXVldWUoUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSk7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKFBlcmlvZGljX2NvbnRyb2x2bV93b3JrcXVldWUpOworCQlQZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlID0gTlVMTDsKKwkJZGVzdHJveV9jb250cm9sdm1fcGF5bG9hZF9pbmZvKCZDb250cm9sVm1fcGF5bG9hZF9pbmZvKTsKKwl9CisJVGVzdF9WbmljX2NoYW5uZWwgPSBOVUxMOworCWlmIChQdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2wpIHsKKwkJa21lbV9jYWNoZV9kZXN0cm95KFB1dGZpbGVfYnVmZmVyX2xpc3RfcG9vbCk7CisJCVB1dGZpbGVfYnVmZmVyX2xpc3RfcG9vbCA9IE5VTEw7CisJfQorCWZpbGV4ZmVyX2Rlc3RydWN0b3IoKTsKKwlpZiAoQ29udHJvbFZtT2JqZWN0KSB7CisJCXZpc29yX3Byb2NfRGVzdHJveU9iamVjdChDb250cm9sVm1PYmplY3QpOworCQlDb250cm9sVm1PYmplY3QgPSBOVUxMOworCX0KKwljbGVhbnVwX2NvbnRyb2x2bV9zdHJ1Y3R1cmVzKCk7CisKKwlpZiAoQ29udHJvbFZtVHlwZSkgeworCQl2aXNvcl9wcm9jX0Rlc3Ryb3lUeXBlKENvbnRyb2xWbVR5cGUpOworCQlDb250cm9sVm1UeXBlID0gTlVMTDsKKwl9CisJaWYgKFBhcnRpdGlvblR5cGUpIHsKKwkJdmlzb3JfcHJvY19EZXN0cm95VHlwZShQYXJ0aXRpb25UeXBlKTsKKwkJUGFydGl0aW9uVHlwZSA9IE5VTEw7CisJfQorCWlmIChkaWFnX3Byb2NfZGlyKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KFZJU09SQ0hJUFNFVF9ESUFHX1BST0NfRU5UUllfRk4sIFByb2NEaXIpOworCQlkaWFnX3Byb2NfZGlyID0gTlVMTDsKKwl9CisJbWVtc2V0KCZnX0RpYWdNc2dIZHIsIDAsIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIpKTsKKworCWlmIChjaGlwc2V0X3Byb2NfZGlyKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KFZJU09SQ0hJUFNFVF9DSElQU0VUX1BST0NfRU5UUllfRk4sIFByb2NEaXIpOworCQljaGlwc2V0X3Byb2NfZGlyID0gTlVMTDsKKwl9CisJbWVtc2V0KCZnX0NoaXBTZXRNc2dIZHIsIDAsIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIpKTsKKworCWlmIChwYXJhaG90cGx1Z19wcm9jX2RpcikgeworCQlyZW1vdmVfcHJvY19lbnRyeShWSVNPUkNISVBTRVRfUEFSQUhPVFBMVUdfUFJPQ19FTlRSWV9GTiwKKwkJCQkgIFByb2NEaXIpOworCQlwYXJhaG90cGx1Z19wcm9jX2RpciA9IE5VTEw7CisJfQorCisJbWVtc2V0KCZnX0RlbER1bXBNc2dIZHIsIDAsIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIpKTsKKworCXByb2NfRGVJbml0KCk7CisJaWYgKENvbnRyb2xWbV9jaGFubmVsICE9IE5VTEwpIHsKKwkJTE9HSU5GKCJDaGFubmVsICVzIChDb250cm9sVm0pIGRpc2Nvbm5lY3RlZCIsCisJCSAgICAgICB2aXNvcmNoYW5uZWxfaWQoQ29udHJvbFZtX2NoYW5uZWwsIHMpKTsKKwkJdmlzb3JjaGFubmVsX2Rlc3Ryb3koQ29udHJvbFZtX2NoYW5uZWwpOworCQlDb250cm9sVm1fY2hhbm5lbCA9IE5VTEw7CisJfQorCWNvbnRyb2x2bV9kZWluaXQoKTsKKwl2aXNvcmNoaXBzZXRfZmlsZV9jbGVhbnVwKCk7CisJUE9TVENPREVfTElOVVhfMihEUklWRVJfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJTE9HSU5GKCJjaGlwc2V0IGRyaXZlciB1bmxvYWRlZCIpOworfQorCittb2R1bGVfcGFyYW1fbmFtZWQodGVzdHZuaWMsIHZpc29yY2hpcHNldF90ZXN0dm5pYywgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Modmlzb3JjaGlwc2V0X3Rlc3R2bmljLCAiMSB0byB0ZXN0IHZuaWMsIHVzaW5nIGR1bW15IFZOSUMgY29ubmVjdGVkIHZpYSBhIGxvb3BiYWNrIHRvIGEgcGh5c2ljYWwgZXRoZXJuZXQiKTsKK2ludCB2aXNvcmNoaXBzZXRfdGVzdHZuaWMgPSAwOworCittb2R1bGVfcGFyYW1fbmFtZWQodGVzdHZuaWNjbGllbnQsIHZpc29yY2hpcHNldF90ZXN0dm5pY2NsaWVudCwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Modmlzb3JjaGlwc2V0X3Rlc3R2bmljY2xpZW50LCAiMSB0byB0ZXN0IHZuaWMsIHVzaW5nIHJlYWwgVk5JQyBjaGFubmVsIGF0dGFjaGVkIHRvIGEgc2VwYXJhdGUgSU9WTSBndWVzdCIpOworaW50IHZpc29yY2hpcHNldF90ZXN0dm5pY2NsaWVudCA9IDA7CisKK21vZHVsZV9wYXJhbV9uYW1lZCh0ZXN0bXNnLCB2aXNvcmNoaXBzZXRfdGVzdG1zZywgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Modmlzb3JjaGlwc2V0X3Rlc3Rtc2csCisJCSAiMSB0byBtYW51ZmFjdHVyZSB0aGUgY2hpcHNldCwgYnVzLCBhbmQgc3dpdGNoIG1lc3NhZ2VzIik7CitpbnQgdmlzb3JjaGlwc2V0X3Rlc3Rtc2cgPSAwOworCittb2R1bGVfcGFyYW1fbmFtZWQobWFqb3IsIHZpc29yY2hpcHNldF9tYWpvciwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Modmlzb3JjaGlwc2V0X21ham9yLCAibWFqb3IgZGV2aWNlIG51bWJlciB0byB1c2UgZm9yIHRoZSBkZXZpY2Ugbm9kZSIpOworaW50IHZpc29yY2hpcHNldF9tYWpvciA9IDA7CisKK21vZHVsZV9wYXJhbV9uYW1lZChzZXJ2ZXJyZWd3YWl0LCB2aXNvcmNoaXBzZXRfc2VydmVycmVnd2FpdCwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Modmlzb3JjaGlwc2V0X3NlcnZlcnJlcXdhaXQsCisJCSAiMSB0byBoYXZlIHRoZSBtb2R1bGUgd2FpdCBmb3IgdGhlIHZpc29yIGJ1cyB0byByZWdpc3RlciIpOworaW50IHZpc29yY2hpcHNldF9zZXJ2ZXJyZWd3YWl0ID0gMDsJLyogZGVmYXVsdCBpcyBvZmYgKi8KK21vZHVsZV9wYXJhbV9uYW1lZChjbGllbnRyZWd3YWl0LCB2aXNvcmNoaXBzZXRfY2xpZW50cmVnd2FpdCwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Modmlzb3JjaGlwc2V0X2NsaWVudHJlZ3dhaXQsICIxIHRvIGhhdmUgdGhlIG1vZHVsZSB3YWl0IGZvciB0aGUgdmlzb3JjbGllbnRidXMgdG8gcmVnaXN0ZXIiKTsKK2ludCB2aXNvcmNoaXBzZXRfY2xpZW50cmVnd2FpdCA9IDE7CS8qIGRlZmF1bHQgaXMgb24gKi8KK21vZHVsZV9wYXJhbV9uYW1lZCh0ZXN0dGVhcmRvd24sIHZpc29yY2hpcHNldF90ZXN0dGVhcmRvd24sIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHZpc29yY2hpcHNldF90ZXN0dGVhcmRvd24sCisJCSAiMSB0byB0ZXN0IHRlYXJkb3duIG9mIHRoZSBjaGlwc2V0LCBidXMsIGFuZCBzd2l0Y2giKTsKK2ludCB2aXNvcmNoaXBzZXRfdGVzdHRlYXJkb3duID0gMDsJLyogZGVmYXVsdCBpcyBvZmYgKi8KK21vZHVsZV9wYXJhbV9uYW1lZChkaXNhYmxlX2NvbnRyb2x2bSwgdmlzb3JjaGlwc2V0X2Rpc2FibGVfY29udHJvbHZtLCBpbnQsCisJCSAgIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyh2aXNvcmNoaXBzZXRfZGlzYWJsZV9jb250cm9sdm0sCisJCSAiMSB0byBkaXNhYmxlIHBvbGxpbmcgb2YgY29udHJvbFZtIGNoYW5uZWwiKTsKK2ludCB2aXNvcmNoaXBzZXRfZGlzYWJsZV9jb250cm9sdm0gPSAwOwkvKiBkZWZhdWx0IGlzIG9mZiAqLworbW9kdWxlX3BhcmFtX25hbWVkKGNyYXNoX2tlcm5lbCwgdmlzb3JjaGlwc2V0X2NyYXNoX2tlcm5lbCwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Modmlzb3JjaGlwc2V0X2NyYXNoX2tlcm5lbCwKKwkJICIxIG1lYW5zIHdlIGFyZSBydW5uaW5nIGluIGNyYXNoIGtlcm5lbCIpOworaW50IHZpc29yY2hpcHNldF9jcmFzaF9rZXJuZWwgPSAwOyAvKiBkZWZhdWx0IGlzIHJ1bm5pbmcgaW4gbm9uLWNyYXNoIGtlcm5lbCAqLworbW9kdWxlX3BhcmFtX25hbWVkKGhvbGRjaGlwc2V0cmVhZHksIHZpc29yY2hpcHNldF9ob2xkY2hpcHNldHJlYWR5LAorCQkgICBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyh2aXNvcmNoaXBzZXRfaG9sZGNoaXBzZXRyZWFkeSwKKwkJICIxIHRvIGhvbGQgcmVzcG9uc2UgdG8gQ0hJUFNFVF9SRUFEWSIpOworaW50IHZpc29yY2hpcHNldF9ob2xkY2hpcHNldHJlYWR5ID0gMDsgLyogZGVmYXVsdCBpcyB0byBzZW5kIENISVBTRVRfUkVBRFkKKwkJCQkgICAgICAqIHJlc3BvbnNlIGltbWVkaWF0ZWx5ICovCittb2R1bGVfaW5pdCh2aXNvcmNoaXBzZXRfaW5pdCk7Cittb2R1bGVfZXhpdCh2aXNvcmNoaXBzZXRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlVuaXN5cyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBlcnZpc29yIGNoaXBzZXQgZHJpdmVyIGZvciBzZXJ2aWNlIHBhcnRpdGlvbjogdmVyICIKKwkJICAgVkVSU0lPTik7CitNT0RVTEVfVkVSU0lPTihWRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldF91bW9kZS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvdmlzb3JjaGlwc2V0X3Vtb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU5ZTg0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldF91bW9kZS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIHZpc29yY2hpcHNldF91bW9kZS5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKiogQGZpbGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFRoaXMgZGVzY3JpYmVzIHN0cnVjdHVyZXMgbmVlZGVkIGZvciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlCisgKiAgdmlzb3JjaGlwc2V0IGRyaXZlciBhbmQgYSB1c2VyLW1vZGUgY29tcG9uZW50IHRoYXQgb3BlbnMgdGhlIGRldmljZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX1ZJU09SQ0hJUFNFVF9VTU9ERV9ICisjZGVmaW5lIF9fVklTT1JDSElQU0VUX1VNT0RFX0gKKworCisKKy8qKiBUaGUgdXNlci1tb2RlIHByb2dyYW0gY2FuIGFjY2VzcyB0aGUgY29udHJvbCBjaGFubmVsIGJ1ZmZlciBkaXJlY3RseQorICogIHZpYSB0aGlzIG1lbW9yeSBtYXAuCisgKi8KKyNkZWZpbmUgVklTT1JDSElQU0VUX01NQVBfQ09OVFJPTENIQU5PRkZTRVQgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIFZJU09SQ0hJUFNFVF9NTUFQX0NPTlRST0xDSEFOU0laRSAgICAgICgweDAwNDAwMDAwKSAgLyogNE1CICovCisKKyNlbmRpZiAvKiBfX1ZJU09SQ0hJUFNFVF9VTU9ERV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmY2MWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvS2NvbmZpZwpAQCAtMCwwICsxLDEwIEBACisjCisjIFVuaXN5cyB0aW1za21vZCBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBVTklTWVNfVklTT1JVVElMCisJdHJpc3RhdGUgIlVuaXN5cyB2aXNvcnV0aWwgZHJpdmVyIgorCWRlcGVuZHMgb24gVU5JU1lTU1BBUgorCS0tLWhlbHAtLS0KKwlJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgZW5hYmxlIHRoZSBVbmlzeXMgdmlzb3J1dGlsIGRyaXZlci4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjQ2Mzg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorIworIyBNYWtlZmlsZSBmb3IgVW5pc3lzIHRpbXNrbW9kCisjCisKK29iai0kKENPTkZJR19VTklTWVNfVklTT1JVVElMKQkrPSB2aXNvcnV0aWwubworCit2aXNvcnV0aWwteSA6PSBjaGFycXVldWUubyAgZWFzeXByb2MubyAgcGVyaW9kaWNfd29yay5vICBwcm9jb2JqZWN0dHJlZS5vICBcCisJCW1lbXJlZ2lvbl9kaXJlY3QubyB2aXNvcmttb2R1dGlscy5vCisKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZQorY2NmbGFncy15ICs9IC1EQ09ORklHX1NQQVJfR1VFU1QgLURHVUVTVERSSVZFUkJVSUxEIC1ETk9BVVRPVkVSU0lPTgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9jaGFycXVldWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2VlZGUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qIGNoYXJxdWV1ZS5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKgorICogIFNpbXBsZSBjaGFyYWN0ZXIgcXVldWUgaW1wbGVtZW50YXRpb24gZm9yIExpbnV4IGtlcm5lbCBtb2RlLgorICovCisKKyNpbmNsdWRlICJjaGFycXVldWUuaCIKKworI2RlZmluZSBNWURSVk5BTUUgImNoYXJxdWV1ZSIKKworI2RlZmluZSBJU19FTVBUWShjaGFycXVldWUpIChjaGFycXVldWUtPmhlYWQgPT0gY2hhcnF1ZXVlLT50YWlsKQorCisKKworc3RydWN0IENIQVJRVUVVRV9UYWcgeworCWludCBhbGxvY19zaXplOworCWludCBuc2xvdHM7CisJc3BpbmxvY2tfdCBsb2NrOworCWludCBoZWFkLCB0YWlsOworCXVuc2lnbmVkIGNoYXIgYnVmWzBdOworfTsKKworCisKK0NIQVJRVUVVRSAqdmlzb3JfY2hhcnF1ZXVlX2NyZWF0ZSh1bG9uZyBuc2xvdHMpCit7CisJaW50IGFsbG9jX3NpemUgPSBzaXplb2YoQ0hBUlFVRVVFKSArIG5zbG90cyArIDE7CisJQ0hBUlFVRVVFICpjcSA9IGttYWxsb2MoYWxsb2Nfc2l6ZSwgR0ZQX0tFUk5FTHxfX0dGUF9OT1JFVFJZKTsKKwlpZiAoY3EgPT0gTlVMTCkgeworCQlFUlJEUlYoInZpc29yX2NoYXJxdWV1ZV9jcmVhdGUgYWxsb2NhdGlvbiBmYWlsZWQgKGFsbG9jX3NpemU9JWQpIiwKKwkJICAgICAgIGFsbG9jX3NpemUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJY3EtPmFsbG9jX3NpemUgPSBhbGxvY19zaXplOworCWNxLT5uc2xvdHMgPSBuc2xvdHM7CisJY3EtPmhlYWQgPSBjcS0+dGFpbCA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmNxLT5sb2NrKTsKKwlyZXR1cm4gY3E7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9jaGFycXVldWVfY3JlYXRlKTsKKworCisKK3ZvaWQgdmlzb3JfY2hhcnF1ZXVlX2VucXVldWUoQ0hBUlFVRVVFICpjaGFycXVldWUsIHVuc2lnbmVkIGNoYXIgYykKK3sKKwlpbnQgYWxsb2Nfc2xvdHMgPSBjaGFycXVldWUtPm5zbG90cysxOyAgLyogMSBzbG90IGlzIGFsd2F5cyBlbXB0eSAqLworCisJc3Bpbl9sb2NrKCZjaGFycXVldWUtPmxvY2spOworCWNoYXJxdWV1ZS0+aGVhZCA9IChjaGFycXVldWUtPmhlYWQrMSkgJSBhbGxvY19zbG90czsKKwlpZiAoY2hhcnF1ZXVlLT5oZWFkID09IGNoYXJxdWV1ZS0+dGFpbCkKKwkJLyogb3ZlcmZsb3c7IG92ZXJ3cml0ZSB0aGUgb2xkZXN0IGVudHJ5ICovCisJCWNoYXJxdWV1ZS0+dGFpbCA9IChjaGFycXVldWUtPnRhaWwrMSkgJSBhbGxvY19zbG90czsKKwljaGFycXVldWUtPmJ1ZltjaGFycXVldWUtPmhlYWRdID0gYzsKKwlzcGluX3VubG9jaygmY2hhcnF1ZXVlLT5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX2NoYXJxdWV1ZV9lbnF1ZXVlKTsKKworCisKK0JPT0wgdmlzb3JfY2hhcnF1ZXVlX2lzX2VtcHR5KENIQVJRVUVVRSAqY2hhcnF1ZXVlKQoreworCUJPT0wgYjsKKwlzcGluX2xvY2soJmNoYXJxdWV1ZS0+bG9jayk7CisJYiA9IElTX0VNUFRZKGNoYXJxdWV1ZSk7CisJc3Bpbl91bmxvY2soJmNoYXJxdWV1ZS0+bG9jayk7CisJcmV0dXJuIGI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9jaGFycXVldWVfaXNfZW1wdHkpOworCisKKworc3RhdGljIGludCBjaGFycXVldWVfZGVxdWV1ZV8xKENIQVJRVUVVRSAqY2hhcnF1ZXVlKQoreworCWludCBhbGxvY19zbG90cyA9IGNoYXJxdWV1ZS0+bnNsb3RzICsgMTsgIC8qIDEgc2xvdCBpcyBhbHdheXMgZW1wdHkgKi8KKworCWlmIChJU19FTVBUWShjaGFycXVldWUpKQorCQlyZXR1cm4gLTE7CisJY2hhcnF1ZXVlLT50YWlsID0gKGNoYXJxdWV1ZS0+dGFpbCsxKSAlIGFsbG9jX3Nsb3RzOworCXJldHVybiBjaGFycXVldWUtPmJ1ZltjaGFycXVldWUtPnRhaWxdOworfQorCisKKworaW50IGNoYXJxdWV1ZV9kZXF1ZXVlKENIQVJRVUVVRSAqY2hhcnF1ZXVlKQoreworCWludCByYzsKKworCXNwaW5fbG9jaygmY2hhcnF1ZXVlLT5sb2NrKTsKKwlyYyA9IGNoYXJxdWV1ZV9kZXF1ZXVlXzEoY2hhcnF1ZXVlKTsKKwlzcGluX3VubG9jaygmY2hhcnF1ZXVlLT5sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKKworCitpbnQgdmlzb3JfY2hhcnF1ZXVlX2RlcXVldWVfbihDSEFSUVVFVUUgKmNoYXJxdWV1ZSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbikKK3sKKwlpbnQgcmMsIGNvdW50ZXIgPSAwLCBjOworCisJc3Bpbl9sb2NrKCZjaGFycXVldWUtPmxvY2spOworCWZvciAoOzspIHsKKwkJaWYgKG4gPD0gMCkKKwkJCWJyZWFrOyAgLyogbm8gbW9yZSBidWZmZXIgc3BhY2UgKi8KKwkJYyA9IGNoYXJxdWV1ZV9kZXF1ZXVlXzEoY2hhcnF1ZXVlKTsKKwkJaWYgKGMgPCAwKQorCQkJYnJlYWs7ICAvKiBubyBtb3JlIGlucHV0ICovCisJCSpidWYgPSAodW5zaWduZWQgY2hhcikoYyk7CisJCWJ1ZisrOworCQluLS07CisJCWNvdW50ZXIrKzsKKwl9CisJcmMgPSBjb3VudGVyOworCXNwaW5fdW5sb2NrKCZjaGFycXVldWUtPmxvY2spOworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX2NoYXJxdWV1ZV9kZXF1ZXVlX24pOworCisKKwordm9pZCB2aXNvcl9jaGFycXVldWVfZGVzdHJveShDSEFSUVVFVUUgKmNoYXJxdWV1ZSkKK3sKKwlpZiAoY2hhcnF1ZXVlID09IE5VTEwpCisJCXJldHVybjsKKwlrZnJlZShjaGFycXVldWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfY2hhcnF1ZXVlX2Rlc3Ryb3kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9jaGFycXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODJhZTBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmgKQEAgLTAsMCArMSwzNyBAQAorLyogY2hhcnF1ZXVlLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19DSEFSUVVFVUVfSF9fCisjZGVmaW5lIF9fQ0hBUlFVRVVFX0hfXworCisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgInRpbXNrbW9kLmgiCisKKy8qIENIQVJRVUVVRSBpcyBhbiBvcGFxdWUgc3RydWN0dXJlIHRvIHVzZXJzLgorICogRmllbGRzIGFyZSBkZWNsYXJlZCBvbmx5IGluIHRoZSBpbXBsZW1lbnRhdGlvbiAuYyBmaWxlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ0hBUlFVRVVFX1RhZyBDSEFSUVVFVUU7CisKK0NIQVJRVUVVRSAqdmlzb3JfY2hhcnF1ZXVlX2NyZWF0ZSh1bG9uZyBuc2xvdHMpOwordm9pZCB2aXNvcl9jaGFycXVldWVfZW5xdWV1ZShDSEFSUVVFVUUgKmNoYXJxdWV1ZSwgdW5zaWduZWQgY2hhciBjKTsKK2ludCBjaGFycXVldWVfZGVxdWV1ZShDSEFSUVVFVUUgKmNoYXJxdWV1ZSk7CitpbnQgdmlzb3JfY2hhcnF1ZXVlX2RlcXVldWVfbihDSEFSUVVFVUUgKmNoYXJxdWV1ZSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbik7CitCT09MIHZpc29yX2NoYXJxdWV1ZV9pc19lbXB0eShDSEFSUVVFVUUgKmNoYXJxdWV1ZSk7Cit2b2lkIHZpc29yX2NoYXJxdWV1ZV9kZXN0cm95KENIQVJRVUVVRSAqY2hhcnF1ZXVlKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL2Vhc3lwcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9lYXN5cHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYjZiODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9lYXN5cHJvYy5jCkBAIC0wLDAgKzEsMzcxIEBACisvKiBDb3B5cmlnaHQgwqkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKiogQGZpbGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEhhbmRsZSBwcm9jZnMtc3BlY2lmaWMgdGFza3MuCisgKiAgTm90ZSB0aGF0IHRoaXMgZmlsZSBkb2VzIG5vdCBrbm93IGFib3V0IGFueSBtb2R1bGUtc3BlY2lmaWMgdGhpbmdzLCBub3IKKyAqICBkb2VzIGl0IGtub3cgYW55dGhpbmcgYWJvdXQgd2hhdCBpbmZvcm1hdGlvbiB0byByZXZlYWwgYXMgcGFydCBvZiB0aGUgcHJvYworICogIGVudHJpZXMuICBUaGUgMiBmdW5jdGlvbnMgdGhhdCB0YWtlIGNhcmUgb2YgZGlzcGxheWluZyBkZXZpY2UgYW5kCisgKiAgZHJpdmVyIHNwZWNpZmljIGluZm9ybWF0aW9uIGFyZSBwYXNzZWQgYXMgcGFyYW1ldGVycyB0bworICogIHZpc29yX2Vhc3lwcm9jX0luaXREcml2ZXIoKS4KKyAqCisgKiAgICAgIHZvaWQgc2hvd19kZXZpY2VfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqcCk7CisgKiAgICAgIHZvaWQgc2hvd19kcml2ZXJfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSk7CisgKgorICogIFRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIHNob3dfZGV2aWNlX2luZm8gaXMgYWN0dWFsbHkgYSBwb2ludGVyIHRvIHRoZQorICogIGRldmljZS1zcGVjaWZpYyBpbmZvIHRvIHNob3cuICBJdCBpcyB0aGUgY29udGV4dCB0aGF0IHdhcyBvcmlnaW5hbGx5CisgKiAgcGFzc2VkIHRvIHZpc29yX2Vhc3lwcm9jX0luaXREZXZpY2UoKS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworI2luY2x1ZGUgInVuaWtsb2cuaCIKKyNpbmNsdWRlICJ0aW1za21vZC5oIgorI2luY2x1ZGUgImVhc3lwcm9jLmgiCisKKyNkZWZpbmUgTVlEUlZOQU1FICJlYXN5cHJvYyIKKworCisKKy8qCisgKiAgIC9wcm9jLzxQcm9jSWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY0RpcgorICogICAvcHJvYy88UHJvY0lkPi9kcml2ZXIgICAgICAgICAgICAgICAgICAgICAgIFByb2NEcml2ZXJEaXIKKyAqICAgL3Byb2MvPFByb2NJZD4vZHJpdmVyL2RpYWcgICAgICAgICAgICAgICAgICBQcm9jRHJpdmVyRGlhZ0ZpbGUKKyAqICAgL3Byb2MvPFByb2NJZD4vZGV2aWNlICAgICAgICAgICAgICAgICAgICAgICBQcm9jRGV2aWNlRGlyCisgKiAgIC9wcm9jLzxQcm9jSWQ+L2RldmljZS8wICAgICAgICAgICAgICAgICAgICAgcHJvY0RldmljZXhEaXIKKyAqICAgL3Byb2MvPFByb2NJZD4vZGV2aWNlLzAvZGlhZyAgICAgICAgICAgICAgICBwcm9jRGV2aWNleERpYWdGaWxlCisgKi8KKworCitzdGF0aWMgc3NpemVfdCBwcm9jX3dyaXRlX2RldmljZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHNzaXplX3QgcHJvY193cml0ZV9kcml2ZXIoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqCisJY3JlYXRlUHJvY0RpcihjaGFyICpuYW1lLCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnAgPSBwcm9jX21rZGlyX21vZGUobmFtZSwgU19JRkRJUiwgcGFyZW50KTsKKwlpZiAocCA9PSBOVUxMKQorCQlFUlJEUlYoImZhaWxlZCB0byBjcmVhdGUgL3Byb2MgZGlyZWN0b3J5ICVzIiwgbmFtZSk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbnQgc2VxX3Nob3dfZHJpdmVyKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOworc3RhdGljIGludCBwcm9jX29wZW5fZHJpdmVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzZXFfc2hvd19kcml2ZXIsIFBERV9EQVRBKGlub2RlKSk7Cit9CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2ZvcHNfZHJpdmVyID0geworCS5vcGVuID0gcHJvY19vcGVuX2RyaXZlciwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS53cml0ZSA9IHByb2Nfd3JpdGVfZHJpdmVyLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgc2VxX3Nob3dfZGV2aWNlKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOworc3RhdGljIGludCBzZXFfc2hvd19kZXZpY2VfcHJvcGVydHkoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CitzdGF0aWMgaW50IHByb2Nfb3Blbl9kZXZpY2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNlcV9zaG93X2RldmljZSwgUERFX0RBVEEoaW5vZGUpKTsKK30KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfZm9wc19kZXZpY2UgPSB7CisJLm9wZW4gPSBwcm9jX29wZW5fZGV2aWNlLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLndyaXRlID0gcHJvY193cml0ZV9kZXZpY2UsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKK3N0YXRpYyBpbnQgcHJvY19vcGVuX2RldmljZV9wcm9wZXJ0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc2VxX3Nob3dfZGV2aWNlX3Byb3BlcnR5LCBQREVfREFUQShpbm9kZSkpOworfQorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19mb3BzX2RldmljZV9wcm9wZXJ0eSA9IHsKKwkub3BlbiA9IHByb2Nfb3Blbl9kZXZpY2VfcHJvcGVydHksCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCisKKwordm9pZCB2aXNvcl9lYXN5cHJvY19Jbml0RHJpdmVyKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlciwKKwkJCSAgICAgICBjaGFyICpwcm9jSWQsCisJCQkgICAgICAgdm9pZCAoKnNob3dfZHJpdmVyX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqKSwKKwkJCSAgICAgICB2b2lkICgqc2hvd19kZXZpY2VfaW5mbykoc3RydWN0IHNlcV9maWxlICosCisJCQkJCQkJdm9pZCAqKSkKK3sKKwltZW1zZXQocGRyaXZlciwgMCwgc2l6ZW9mKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbykpOworCXBkcml2ZXItPlByb2NJZCA9IHByb2NJZDsKKwlpZiAocGRyaXZlci0+UHJvY0lkID09IE5VTEwpCisJCUVSUkRSVigiUHJvY0lkIGNhbm5vdCBiZSBOVUxMICh0cm91YmxlIGFoZWFkKSEiKTsKKwlwZHJpdmVyLT5TaG93X2RyaXZlcl9pbmZvID0gc2hvd19kcml2ZXJfaW5mbzsKKwlwZHJpdmVyLT5TaG93X2RldmljZV9pbmZvID0gc2hvd19kZXZpY2VfaW5mbzsKKwlpZiAocGRyaXZlci0+UHJvY0RpciA9PSBOVUxMKQorCQlwZHJpdmVyLT5Qcm9jRGlyID0gY3JlYXRlUHJvY0RpcihwZHJpdmVyLT5Qcm9jSWQsIE5VTEwpOworCWlmICgocGRyaXZlci0+UHJvY0RpciAhPSBOVUxMKSAmJiAocGRyaXZlci0+UHJvY0RyaXZlckRpciA9PSBOVUxMKSkKKwkJcGRyaXZlci0+UHJvY0RyaXZlckRpciA9IGNyZWF0ZVByb2NEaXIoImRyaXZlciIsCisJCQkJCQkgICAgICAgcGRyaXZlci0+UHJvY0Rpcik7CisJaWYgKChwZHJpdmVyLT5Qcm9jRGlyICE9IE5VTEwpICYmIChwZHJpdmVyLT5Qcm9jRGV2aWNlRGlyID09IE5VTEwpKQorCQlwZHJpdmVyLT5Qcm9jRGV2aWNlRGlyID0gY3JlYXRlUHJvY0RpcigiZGV2aWNlIiwKKwkJCQkJCSAgICAgICBwZHJpdmVyLT5Qcm9jRGlyKTsKKwlpZiAoKHBkcml2ZXItPlByb2NEcml2ZXJEaXIgIT0gTlVMTCkgJiYKKwkgICAgKHBkcml2ZXItPlByb2NEcml2ZXJEaWFnRmlsZSA9PSBOVUxMKSkgeworCQlwZHJpdmVyLT5Qcm9jRHJpdmVyRGlhZ0ZpbGUgPQorCQkJcHJvY19jcmVhdGVfZGF0YSgiZGlhZyIsIDAsCisJCQkJCSBwZHJpdmVyLT5Qcm9jRHJpdmVyRGlyLAorCQkJCQkgJnByb2NfZm9wc19kcml2ZXIsIHBkcml2ZXIpOworCQlpZiAocGRyaXZlci0+UHJvY0RyaXZlckRpYWdGaWxlID09IE5VTEwpCisJCQlFUlJEUlYoImZhaWxlZCB0byByZWdpc3RlciAvcHJvYy8lcy9kcml2ZXIvZGlhZyBlbnRyeSIsCisJCQkgICAgICAgcGRyaXZlci0+UHJvY0lkKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9lYXN5cHJvY19Jbml0RHJpdmVyKTsKKworCisKK3ZvaWQgdmlzb3JfZWFzeXByb2NfSW5pdERyaXZlckV4KHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlciwKKwkJCQkgY2hhciAqcHJvY0lkLAorCQkJCSB2b2lkICgqc2hvd19kcml2ZXJfaW5mbykoc3RydWN0IHNlcV9maWxlICopLAorCQkJCSB2b2lkICgqc2hvd19kZXZpY2VfaW5mbykoc3RydWN0IHNlcV9maWxlICosCisJCQkJCQkJICB2b2lkICopLAorCQkJCSB2b2lkICgqd3JpdGVfZHJpdmVyX2luZm8pKGNoYXIgKmJ1ZiwKKwkJCQkJCQkgICBzaXplX3QgY291bnQsCisJCQkJCQkJICAgbG9mZl90ICpwcG9zKSwKKwkJCQkgdm9pZCAoKndyaXRlX2RldmljZV9pbmZvKShjaGFyICpidWYsCisJCQkJCQkJICAgc2l6ZV90IGNvdW50LAorCQkJCQkJCSAgIGxvZmZfdCAqcHBvcywKKwkJCQkJCQkgICB2b2lkICpwKSkKK3sKKwl2aXNvcl9lYXN5cHJvY19Jbml0RHJpdmVyKHBkcml2ZXIsIHByb2NJZCwKKwkJCQkgIHNob3dfZHJpdmVyX2luZm8sIHNob3dfZGV2aWNlX2luZm8pOworCXBkcml2ZXItPldyaXRlX2RyaXZlcl9pbmZvID0gd3JpdGVfZHJpdmVyX2luZm87CisJcGRyaXZlci0+V3JpdGVfZGV2aWNlX2luZm8gPSB3cml0ZV9kZXZpY2VfaW5mbzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX2Vhc3lwcm9jX0luaXREcml2ZXJFeCk7CisKKworCit2b2lkIHZpc29yX2Vhc3lwcm9jX0RlSW5pdERyaXZlcihzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXIpCit7CisJaWYgKHBkcml2ZXItPlByb2NEcml2ZXJEaWFnRmlsZSAhPSBOVUxMKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJkaWFnIiwgcGRyaXZlci0+UHJvY0RyaXZlckRpcik7CisJCXBkcml2ZXItPlByb2NEcml2ZXJEaWFnRmlsZSA9IE5VTEw7CisJfQorCWlmIChwZHJpdmVyLT5Qcm9jRHJpdmVyRGlyICE9IE5VTEwpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlciIsIHBkcml2ZXItPlByb2NEaXIpOworCQlwZHJpdmVyLT5Qcm9jRHJpdmVyRGlyID0gTlVMTDsKKwl9CisJaWYgKHBkcml2ZXItPlByb2NEZXZpY2VEaXIgIT0gTlVMTCkgeworCQlyZW1vdmVfcHJvY19lbnRyeSgiZGV2aWNlIiwgcGRyaXZlci0+UHJvY0Rpcik7CisJCXBkcml2ZXItPlByb2NEZXZpY2VEaXIgPSBOVUxMOworCX0KKwlpZiAocGRyaXZlci0+UHJvY0RpciAhPSBOVUxMKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KHBkcml2ZXItPlByb2NJZCwgTlVMTCk7CisJCXBkcml2ZXItPlByb2NEaXIgPSBOVUxMOworCX0KKwlwZHJpdmVyLT5Qcm9jSWQgPSBOVUxMOworCXBkcml2ZXItPlNob3dfZHJpdmVyX2luZm8gPSBOVUxMOworCXBkcml2ZXItPlNob3dfZGV2aWNlX2luZm8gPSBOVUxMOworCXBkcml2ZXItPldyaXRlX2RyaXZlcl9pbmZvID0gTlVMTDsKKwlwZHJpdmVyLT5Xcml0ZV9kZXZpY2VfaW5mbyA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9lYXN5cHJvY19EZUluaXREcml2ZXIpOworCisKKwordm9pZCB2aXNvcl9lYXN5cHJvY19Jbml0RGV2aWNlKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlciwKKwkJCSAgICAgICBzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX2luZm8gKnAsIGludCBkZXZubywKKwkJCSAgICAgICB2b2lkICpkZXZkYXRhKQoreworCWlmICgocGRyaXZlci0+UHJvY0RldmljZURpciAhPSBOVUxMKSAmJiAocC0+cHJvY0RldmljZXhEaXIgPT0gTlVMTCkpIHsKKwkJY2hhciBzWzI5XTsKKwkJc3ByaW50ZihzLCAiJWQiLCBkZXZubyk7CisJCXAtPnByb2NEZXZpY2V4RGlyID0gY3JlYXRlUHJvY0RpcihzLCBwZHJpdmVyLT5Qcm9jRGV2aWNlRGlyKTsKKwkJcC0+ZGV2bm8gPSBkZXZubzsKKwl9CisJcC0+ZGV2ZGF0YSA9IGRldmRhdGE7CisJcC0+cGRyaXZlciA9IHBkcml2ZXI7CisJcC0+ZGV2bm8gPSBkZXZubzsKKwlpZiAoKHAtPnByb2NEZXZpY2V4RGlyICE9IE5VTEwpICYmIChwLT5wcm9jRGV2aWNleERpYWdGaWxlID09IE5VTEwpKSB7CisJCXAtPnByb2NEZXZpY2V4RGlhZ0ZpbGUgPQorCQkJcHJvY19jcmVhdGVfZGF0YSgiZGlhZyIsIDAsIHAtPnByb2NEZXZpY2V4RGlyLAorCQkJCQkgJnByb2NfZm9wc19kZXZpY2UsIHApOworCQlpZiAocC0+cHJvY0RldmljZXhEaWFnRmlsZSA9PSBOVUxMKQorCQkJRVJSREVWWChkZXZubywgImZhaWxlZCB0byByZWdpc3RlciAvcHJvYy8lcy9kZXZpY2UvJWQvZGlhZyBlbnRyeSIsCisJCQkJcGRyaXZlci0+UHJvY0lkLCBkZXZubworCQkJICAgICAgICk7CisJfQorCW1lbXNldCgmKHAtPmRldmljZV9wcm9wZXJ0eV9pbmZvWzBdKSwgMCwKKwkgICAgICAgc2l6ZW9mKHAtPmRldmljZV9wcm9wZXJ0eV9pbmZvKSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9lYXN5cHJvY19Jbml0RGV2aWNlKTsKKworCisKK3ZvaWQgdmlzb3JfZWFzeXByb2NfQ3JlYXRlRGV2aWNlUHJvcGVydHkoc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwLAorCQkJCQkgdm9pZCAoKnNob3dfcHJvcGVydHlfaW5mbykKKwkJCQkJIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKSwKKwkJCQkJIGNoYXIgKnByb3BlcnR5X25hbWUpCit7CisJc2l6ZV90IGk7CisJc3RydWN0IGVhc3lwcm9jX2RldmljZV9wcm9wZXJ0eV9pbmZvICpweCA9IE5VTEw7CisKKwlpZiAocC0+cHJvY0RldmljZXhEaXIgPT0gTlVMTCkgeworCQlFUlJEUlYoInN0YXRlIGVycm9yIik7CisJCXJldHVybjsKKwl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocC0+ZGV2aWNlX3Byb3BlcnR5X2luZm8pOyBpKyspIHsKKwkJaWYgKHAtPmRldmljZV9wcm9wZXJ0eV9pbmZvW2ldLnByb2NFbnRyeSA9PSBOVUxMKSB7CisJCQlweCA9ICYocC0+ZGV2aWNlX3Byb3BlcnR5X2luZm9baV0pOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFweCkgeworCQlFUlJERVZYKHAtPmRldm5vLCAidG9vIG1hbnkgZGV2aWNlIHByb3BlcnRpZXMiKTsKKwkJcmV0dXJuOworCX0KKwlweC0+ZGV2ZGF0YSA9IHAtPmRldmRhdGE7CisJcHgtPnBkcml2ZXIgPSBwLT5wZHJpdmVyOworCXB4LT5wcm9jRW50cnkgPSBwcm9jX2NyZWF0ZV9kYXRhKHByb3BlcnR5X25hbWUsIDAsIHAtPnByb2NEZXZpY2V4RGlyLAorCQkJCQkgJnByb2NfZm9wc19kZXZpY2VfcHJvcGVydHksIHB4KTsKKwlpZiAoc3RybGVuKHByb3BlcnR5X25hbWUpKzEgPiBzaXplb2YocHgtPnByb3BlcnR5X25hbWUpKSB7CisJCUVSUkRFVlgocC0+ZGV2bm8sICJkZXZpY2UgcHJvcGVydHkgbmFtZSAlcyB0b28gbG9uZyIsCisJCQlwcm9wZXJ0eV9uYW1lKTsKKwkJcmV0dXJuOworCX0KKwlzdHJjcHkocHgtPnByb3BlcnR5X25hbWUsIHByb3BlcnR5X25hbWUpOworCWlmIChweC0+cHJvY0VudHJ5ID09IE5VTEwpIHsKKwkJRVJSREVWWChwLT5kZXZubywgImZhaWxlZCB0byByZWdpc3RlciAvcHJvYy8lcy9kZXZpY2UvJWQvJXMgZW50cnkiLAorCQkJcC0+cGRyaXZlci0+UHJvY0lkLCBwLT5kZXZubywgcHJvcGVydHlfbmFtZQorCQkgICAgICAgKTsKKwkJcmV0dXJuOworCX0KKwlweC0+c2hvd19kZXZpY2VfcHJvcGVydHlfaW5mbyA9IHNob3dfcHJvcGVydHlfaW5mbzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX2Vhc3lwcm9jX0NyZWF0ZURldmljZVByb3BlcnR5KTsKKworCisKK3ZvaWQgdmlzb3JfZWFzeXByb2NfRGVJbml0RGV2aWNlKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlciwKKwkJCQkgc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwLCBpbnQgZGV2bm8pCit7CisJc2l6ZV90IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocC0+ZGV2aWNlX3Byb3BlcnR5X2luZm8pOyBpKyspIHsKKwkJaWYgKHAtPmRldmljZV9wcm9wZXJ0eV9pbmZvW2ldLnByb2NFbnRyeSAhPSBOVUxMKSB7CisJCQlzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX3Byb3BlcnR5X2luZm8gKnB4ID0KKwkJCQkmKHAtPmRldmljZV9wcm9wZXJ0eV9pbmZvW2ldKTsKKwkJCXJlbW92ZV9wcm9jX2VudHJ5KHB4LT5wcm9wZXJ0eV9uYW1lLCBwLT5wcm9jRGV2aWNleERpcik7CisJCQlweC0+cHJvY0VudHJ5ID0gTlVMTDsKKwkJfQorCX0KKwlpZiAocC0+cHJvY0RldmljZXhEaWFnRmlsZSAhPSBOVUxMKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJkaWFnIiwgcC0+cHJvY0RldmljZXhEaXIpOworCQlwLT5wcm9jRGV2aWNleERpYWdGaWxlID0gTlVMTDsKKwl9CisJaWYgKHAtPnByb2NEZXZpY2V4RGlyICE9IE5VTEwpIHsKKwkJY2hhciBzWzI5XTsKKwkJc3ByaW50ZihzLCAiJWQiLCBkZXZubyk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KHMsIHBkcml2ZXItPlByb2NEZXZpY2VEaXIpOworCQlwLT5wcm9jRGV2aWNleERpciA9IE5VTEw7CisJfQorCXAtPmRldmRhdGEgPSBOVUxMOworCXAtPnBkcml2ZXIgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfZWFzeXByb2NfRGVJbml0RGV2aWNlKTsKKworCisKK3N0YXRpYyBpbnQgc2VxX3Nob3dfZHJpdmVyKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwID0KKwkJKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqKShzZXEtPnByaXZhdGUpOworCWlmICghcCkKKwkJcmV0dXJuIDA7CisJKCoocC0+U2hvd19kcml2ZXJfaW5mbykpKHNlcSk7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IHNlcV9zaG93X2RldmljZShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQoreworCXN0cnVjdCBlYXN5cHJvY19kZXZpY2VfaW5mbyAqcCA9CisJCShzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX2luZm8gKikoc2VxLT5wcml2YXRlKTsKKwlpZiAoKCFwKSB8fCAoIShwLT5wZHJpdmVyKSkpCisJCXJldHVybiAwOworCSgqKHAtPnBkcml2ZXItPlNob3dfZGV2aWNlX2luZm8pKShzZXEsIHAtPmRldmRhdGEpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBzZXFfc2hvd19kZXZpY2VfcHJvcGVydHkoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX3Byb3BlcnR5X2luZm8gKnAgPQorCQkoc3RydWN0IGVhc3lwcm9jX2RldmljZV9wcm9wZXJ0eV9pbmZvICopKHNlcS0+cHJpdmF0ZSk7CisJaWYgKCghcCkgfHwgKCEocC0+c2hvd19kZXZpY2VfcHJvcGVydHlfaW5mbykpKQorCQlyZXR1cm4gMDsKKwkoKihwLT5zaG93X2RldmljZV9wcm9wZXJ0eV9pbmZvKSkoc2VxLCBwLT5kZXZkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBzc2l6ZV90IHByb2Nfd3JpdGVfZHJpdmVyKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwID0gTlVMTDsKKwljaGFyIGxvY2FsX2J1ZlsyNTZdOworCWlmIChzZXEgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcCA9IChzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKikoc2VxLT5wcml2YXRlKTsKKwlpZiAoKCFwKSB8fCAoIShwLT5Xcml0ZV9kcml2ZXJfaW5mbykpKQorCQlyZXR1cm4gMDsKKwlpZiAoY291bnQgPj0gc2l6ZW9mKGxvY2FsX2J1ZikpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChjb3B5X2Zyb21fdXNlcihsb2NhbF9idWYsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlsb2NhbF9idWZbY291bnRdID0gJ1wwJzsgIC8qIGJlIGZyaWVuZGx5ICovCisJKCoocC0+V3JpdGVfZHJpdmVyX2luZm8pKShsb2NhbF9idWYsIGNvdW50LCBwcG9zKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKworCitzdGF0aWMgc3NpemVfdCBwcm9jX3dyaXRlX2RldmljZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXEgPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBlYXN5cHJvY19kZXZpY2VfaW5mbyAqcCA9IE5VTEw7CisJY2hhciBsb2NhbF9idWZbMjU2XTsKKwlpZiAoc2VxID09IE5VTEwpCisJCXJldHVybiAwOworCXAgPSAoc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICopKHNlcS0+cHJpdmF0ZSk7CisJaWYgKCghcCkgfHwgKCEocC0+cGRyaXZlcikpIHx8ICghKHAtPnBkcml2ZXItPldyaXRlX2RldmljZV9pbmZvKSkpCisJCXJldHVybiAwOworCWlmIChjb3VudCA+PSBzaXplb2YobG9jYWxfYnVmKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGNvcHlfZnJvbV91c2VyKGxvY2FsX2J1ZiwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWxvY2FsX2J1Zltjb3VudF0gPSAnXDAnOyAgLyogYmUgZnJpZW5kbHkgKi8KKwkoKihwLT5wZHJpdmVyLT5Xcml0ZV9kZXZpY2VfaW5mbykpKGxvY2FsX2J1ZiwgY291bnQsIHBwb3MsIHAtPmRldmRhdGEpOworCXJldHVybiBjb3VudDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL2Vhc3lwcm9jLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9lYXN5cHJvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZWYxZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9lYXN5cHJvYy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qIGVhc3lwcm9jLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qKiBAZmlsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgVGhpcyBkZXNjcmliZXMgdGhlIGludGVyZmFjZXMgbmVjZXNzYXJ5IGZvciBhIHNpbXBsZSAvcHJvYyBmaWxlCisgKiAgaW1wbGVtZW50YXRpb24gZm9yIGEgZHJpdmVyLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9fRUFTWVBST0NfSF9fCisjZGVmaW5lIF9fRUFTWVBST0NfSF9fCisKKyNpbmNsdWRlICJ0aW1za21vZC5oIgorCisKK3N0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyB7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpQcm9jRGlyOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqUHJvY0RyaXZlckRpcjsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKlByb2NEcml2ZXJEaWFnRmlsZTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKlByb2NEZXZpY2VEaXI7CisJY2hhciAqUHJvY0lkOworCXZvaWQgKCpTaG93X2RldmljZV9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqcCk7CisJdm9pZCAoKlNob3dfZHJpdmVyX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqc2VxKTsKKwl2b2lkICgqV3JpdGVfZGV2aWNlX2luZm8pKGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJCSAgbG9mZl90ICpwcG9zLCB2b2lkICpwKTsKKwl2b2lkICgqV3JpdGVfZHJpdmVyX2luZm8pKGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworfTsKKworLyogcHJvcGVydHkgaXMgYSBmaWxlIHVuZGVyIC9wcm9jLzx4Pi9kZXZpY2UvPHg+Lzxwcm9wZXJ0eV9uYW1lPiAqLworc3RydWN0IGVhc3lwcm9jX2RldmljZV9wcm9wZXJ0eV9pbmZvIHsKKwljaGFyIHByb3BlcnR5X25hbWVbMjVdOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY0VudHJ5OworCXN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlcjsKKwl2b2lkICpkZXZkYXRhOworCXZvaWQgKCpzaG93X2RldmljZV9wcm9wZXJ0eV9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqcCk7Cit9OworCitzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX2luZm8geworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY0RldmljZXhEaXI7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jRGV2aWNleERpYWdGaWxlOworCXN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlcjsKKwl2b2lkICpkZXZkYXRhOworCWludCBkZXZubzsKKwkvKiAgYWxsb3cgZm9yIGEgbnVtYmVyIG9mIGN1c3RvbSBwcm9wZXJ0aWVzIGZvciBlYWNoIGRldmljZTogKi8KKwlzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX3Byb3BlcnR5X2luZm8gZGV2aWNlX3Byb3BlcnR5X2luZm9bMTBdOworfTsKKwordm9pZCB2aXNvcl9lYXN5cHJvY19Jbml0RGV2aWNlKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlciwKKwkJCSAgICAgICBzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX2luZm8gKnAsIGludCBkZXZubywKKwkJCSAgICAgICB2b2lkICpkZXZkYXRhKTsKK3ZvaWQgdmlzb3JfZWFzeXByb2NfRGVJbml0RGV2aWNlKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlciwKKwkJCQkgc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwLCBpbnQgZGV2bm8pOwordm9pZCB2aXNvcl9lYXN5cHJvY19Jbml0RHJpdmVyKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlciwKKwkJCSAgICAgICBjaGFyICpwcm9jSWQsCisJCQkgICAgICAgdm9pZCAoKnNob3dfZHJpdmVyX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqKSwKKwkJCSAgICAgICB2b2lkICgqc2hvd19kZXZpY2VfaW5mbykoc3RydWN0IHNlcV9maWxlICosCisJCQkJCQkJdm9pZCAqKSk7Cit2b2lkIHZpc29yX2Vhc3lwcm9jX0luaXREcml2ZXJFeChzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXIsCisJCQkJIGNoYXIgKnByb2NJZCwKKwkJCQkgdm9pZCAoKnNob3dfZHJpdmVyX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqKSwKKwkJCQkgdm9pZCAoKnNob3dfZGV2aWNlX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqLAorCQkJCQkJCSAgdm9pZCAqKSwKKwkJCQkgdm9pZCAoKldyaXRlX2RyaXZlcl9pbmZvKShjaGFyICpidWYsCisJCQkJCQkJICAgc2l6ZV90IGNvdW50LAorCQkJCQkJCSAgIGxvZmZfdCAqcHBvcyksCisJCQkJIHZvaWQgKCpXcml0ZV9kZXZpY2VfaW5mbykoY2hhciAqYnVmLAorCQkJCQkJCSAgIHNpemVfdCBjb3VudCwKKwkJCQkJCQkgICBsb2ZmX3QgKnBwb3MsCisJCQkJCQkJICAgdm9pZCAqcCkpOwordm9pZCB2aXNvcl9lYXN5cHJvY19EZUluaXREcml2ZXIoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyKTsKK3ZvaWQgdmlzb3JfZWFzeXByb2NfQ3JlYXRlRGV2aWNlUHJvcGVydHkoc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwLAorCQkJCQkgdm9pZCAoKnNob3dfcHJvcGVydHlfaW5mbykKKwkJCQkJIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKSwKKwkJCQkJIGNoYXIgKnByb3BlcnR5X25hbWUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL21lbXJlZ2lvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvbWVtcmVnaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxMjJkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL21lbXJlZ2lvbi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIG1lbXJlZ2lvbi5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fTUVNUkVHSU9OX0hfXworI2RlZmluZSBfX01FTVJFR0lPTl9IX18KKworI2luY2x1ZGUgInRpbXNrbW9kLmgiCisKKy8qIE1FTVJFR0lPTiBpcyBhbiBvcGFxdWUgc3RydWN0dXJlIHRvIHVzZXJzLgorICogRmllbGRzIGFyZSBkZWNsYXJlZCBvbmx5IGluIHRoZSBpbXBsZW1lbnRhdGlvbiAuYyBmaWxlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTUVNUkVHSU9OX1RhZyBNRU1SRUdJT047CisKK01FTVJFR0lPTiAqdmlzb3JfbWVtcmVnaW9uX2NyZWF0ZShIT1NUQUREUkVTUyBwaHlzYWRkciwgdWxvbmcgbmJ5dGVzKTsKK01FTVJFR0lPTiAqdmlzb3JfbWVtcmVnaW9uX2NyZWF0ZV9vdmVybGFwcGVkKE1FTVJFR0lPTiAqcGFyZW50LAorCQkJCQkgICAgIHVsb25nIG9mZnNldCwgdWxvbmcgbmJ5dGVzKTsKK2ludCB2aXNvcl9tZW1yZWdpb25fcmVzaXplKE1FTVJFR0lPTiAqbWVtcmVnaW9uLCB1bG9uZyBuZXdzaXplKTsKK2ludCB2aXNvcl9tZW1yZWdpb25fcmVhZChNRU1SRUdJT04gKm1lbXJlZ2lvbiwKKwkJICAgdWxvbmcgb2Zmc2V0LCB2b2lkICpkZXN0LCB1bG9uZyBuYnl0ZXMpOworaW50IHZpc29yX21lbXJlZ2lvbl93cml0ZShNRU1SRUdJT04gKm1lbXJlZ2lvbiwKKwkJCSAgdWxvbmcgb2Zmc2V0LCB2b2lkICpzcmMsIHVsb25nIG5ieXRlcyk7Cit2b2lkIHZpc29yX21lbXJlZ2lvbl9kZXN0cm95KE1FTVJFR0lPTiAqbWVtcmVnaW9uKTsKK0hPU1RBRERSRVNTIHZpc29yX21lbXJlZ2lvbl9nZXRfcGh5c2FkZHIoTUVNUkVHSU9OICptZW1yZWdpb24pOwordWxvbmcgdmlzb3JfbWVtcmVnaW9uX2dldF9uYnl0ZXMoTUVNUkVHSU9OICptZW1yZWdpb24pOwordm9pZCBtZW1yZWdpb25fZHVtcChNRU1SRUdJT04gKm1lbXJlZ2lvbiwgY2hhciAqcywKKwkJICAgIHVsb25nIG9mZiwgdWxvbmcgbGVuLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSk7Cit2b2lkICp2aXNvcl9tZW1yZWdpb25fZ2V0X3BvaW50ZXIoTUVNUkVHSU9OICptZW1yZWdpb24pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL21lbXJlZ2lvbl9kaXJlY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL21lbXJlZ2lvbl9kaXJlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzEwNjFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvbWVtcmVnaW9uX2RpcmVjdC5jCkBAIC0wLDAgKzEsMjIzIEBACisvKiBtZW1yZWdpb25fZGlyZWN0LmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qCisgKiAgVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBtZW1vcnkgcmVnaW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlYWQvd3JpdGUKKyAqICBjaGFubmVsIG1lbW9yeSAoaW4gbWFpbiBtZW1vcnkgb2YgdGhlIGhvc3Qgc3lzdGVtKSBmcm9tIGNvZGUgcnVubmluZyBpbgorICogIGEgdmlydHVhbCBwYXJ0aXRpb24uCisgKi8KKyNpbmNsdWRlICJ1bmlrbG9nLmgiCisjaW5jbHVkZSAidGltc2ttb2QuaCIKKyNpbmNsdWRlICJtZW1yZWdpb24uaCIKKworI2RlZmluZSBNWURSVk5BTUUgIm1lbXJlZ2lvbiIKKworc3RydWN0IE1FTVJFR0lPTl9UYWcgeworCUhPU1RBRERSRVNTIHBoeXNhZGRyOworCXVsb25nIG5ieXRlczsKKwl2b2lkICptYXBwZWQ7CisJQk9PTCByZXF1ZXN0ZWQ7CisJQk9PTCBvdmVybGFwcGVkOworfTsKKworc3RhdGljIEJPT0wgbWFwaXQoTUVNUkVHSU9OICptZW1yZWdpb24pOworc3RhdGljIHZvaWQgdW5tYXBpdChNRU1SRUdJT04gKm1lbXJlZ2lvbik7CisKK01FTVJFR0lPTiAqCit2aXNvcl9tZW1yZWdpb25fY3JlYXRlKEhPU1RBRERSRVNTIHBoeXNhZGRyLCB1bG9uZyBuYnl0ZXMpCit7CisJTUVNUkVHSU9OICpyYyA9IE5VTEw7CisJTUVNUkVHSU9OICptZW1yZWdpb24gPSBremFsbG9jKHNpemVvZihNRU1SRUdJT04pLAorCQkJCSAgICAgICBHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSk7CisJaWYgKG1lbXJlZ2lvbiA9PSBOVUxMKSB7CisJCUVSUkRSVigidmlzb3JfbWVtcmVnaW9uX2NyZWF0ZSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtcmVnaW9uLT5waHlzYWRkciA9IHBoeXNhZGRyOworCW1lbXJlZ2lvbi0+bmJ5dGVzID0gbmJ5dGVzOworCW1lbXJlZ2lvbi0+b3ZlcmxhcHBlZCA9IEZBTFNFOworCWlmICghbWFwaXQobWVtcmVnaW9uKSkgeworCQlyYyA9IE5VTEw7CisJCWdvdG8gQXdheTsKKwl9CisJcmMgPSBtZW1yZWdpb247CitBd2F5OgorCWlmIChyYyA9PSBOVUxMKSB7CisJCWlmIChtZW1yZWdpb24gIT0gTlVMTCkgeworCQkJdmlzb3JfbWVtcmVnaW9uX2Rlc3Ryb3kobWVtcmVnaW9uKTsKKwkJCW1lbXJlZ2lvbiA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfbWVtcmVnaW9uX2NyZWF0ZSk7CisKK01FTVJFR0lPTiAqCit2aXNvcl9tZW1yZWdpb25fY3JlYXRlX292ZXJsYXBwZWQoTUVNUkVHSU9OICpwYXJlbnQsIHVsb25nIG9mZnNldCwgdWxvbmcgbmJ5dGVzKQoreworCU1FTVJFR0lPTiAqbWVtcmVnaW9uID0gTlVMTDsKKworCWlmIChwYXJlbnQgPT0gTlVMTCkgeworCQlFUlJEUlYoIiVzIHBhcmVudCBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHBhcmVudC0+bWFwcGVkID09IE5VTEwpIHsKKwkJRVJSRFJWKCIlcyBwYXJlbnQgaXMgbm90IG1hcHBlZCEiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoKG9mZnNldCA+PSBwYXJlbnQtPm5ieXRlcykgfHwKKwkgICAgKChvZmZzZXQgKyBuYnl0ZXMpID49IHBhcmVudC0+bmJ5dGVzKSkgeworCQlFUlJEUlYoIiVzIHJhbmdlICglbHUsJWx1KSBvdXQgb2YgcGFyZW50IHJhbmdlIiwKKwkJICAgICAgIF9fZnVuY19fLCBvZmZzZXQsIG5ieXRlcyk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1yZWdpb24gPSBremFsbG9jKHNpemVvZihNRU1SRUdJT04pLCBHRlBfS0VSTkVMfF9fR0ZQX05PUkVUUlkpOworCWlmIChtZW1yZWdpb24gPT0gTlVMTCkgeworCQlFUlJEUlYoIiVzIGFsbG9jYXRpb24gZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1yZWdpb24tPnBoeXNhZGRyID0gcGFyZW50LT5waHlzYWRkciArIG9mZnNldDsKKwltZW1yZWdpb24tPm5ieXRlcyA9IG5ieXRlczsKKwltZW1yZWdpb24tPm1hcHBlZCA9ICgodTggKikgKHBhcmVudC0+bWFwcGVkKSkgKyBvZmZzZXQ7CisJbWVtcmVnaW9uLT5yZXF1ZXN0ZWQgPSBGQUxTRTsKKwltZW1yZWdpb24tPm92ZXJsYXBwZWQgPSBUUlVFOworCXJldHVybiBtZW1yZWdpb247Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9tZW1yZWdpb25fY3JlYXRlX292ZXJsYXBwZWQpOworCisKK3N0YXRpYyBCT09MCittYXBpdChNRU1SRUdJT04gKm1lbXJlZ2lvbikKK3sKKwl1bG9uZyBwaHlzYWRkciA9ICh1bG9uZykgKG1lbXJlZ2lvbi0+cGh5c2FkZHIpOworCXVsb25nIG5ieXRlcyA9IG1lbXJlZ2lvbi0+bmJ5dGVzOworCisJbWVtcmVnaW9uLT5yZXF1ZXN0ZWQgPSBGQUxTRTsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwaHlzYWRkciwgbmJ5dGVzLCBNWURSVk5BTUUpKQorCQlFUlJEUlYoImNhbm5vdCByZXNlcnZlIGNoYW5uZWwgbWVtb3J5IEAweCVseCBmb3IgMHglbHgtLSBubyBiaWcgZGVhbCIsIHBoeXNhZGRyLCBuYnl0ZXMpOworCWVsc2UKKwkJbWVtcmVnaW9uLT5yZXF1ZXN0ZWQgPSBUUlVFOworCW1lbXJlZ2lvbi0+bWFwcGVkID0gaW9yZW1hcF9jYWNoZShwaHlzYWRkciwgbmJ5dGVzKTsKKwlpZiAobWVtcmVnaW9uLT5tYXBwZWQgPT0gTlVMTCkgeworCQlFUlJEUlYoImNhbm5vdCBpb3JlbWFwX2NhY2hlIGNoYW5uZWwgbWVtb3J5IEAweCVseCBmb3IgMHglbHgiLAorCQkgICAgICAgcGh5c2FkZHIsIG5ieXRlcyk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCit1bm1hcGl0KE1FTVJFR0lPTiAqbWVtcmVnaW9uKQoreworCWlmIChtZW1yZWdpb24tPm1hcHBlZCAhPSBOVUxMKSB7CisJCWlvdW5tYXAobWVtcmVnaW9uLT5tYXBwZWQpOworCQltZW1yZWdpb24tPm1hcHBlZCA9IE5VTEw7CisJfQorCWlmIChtZW1yZWdpb24tPnJlcXVlc3RlZCkgeworCQlyZWxlYXNlX21lbV9yZWdpb24oKHVsb25nKSAobWVtcmVnaW9uLT5waHlzYWRkciksCisJCQkJICAgbWVtcmVnaW9uLT5uYnl0ZXMpOworCQltZW1yZWdpb24tPnJlcXVlc3RlZCA9IEZBTFNFOworCX0KK30KKworSE9TVEFERFJFU1MKK3Zpc29yX21lbXJlZ2lvbl9nZXRfcGh5c2FkZHIoTUVNUkVHSU9OICptZW1yZWdpb24pCit7CisJcmV0dXJuIG1lbXJlZ2lvbi0+cGh5c2FkZHI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9tZW1yZWdpb25fZ2V0X3BoeXNhZGRyKTsKKwordWxvbmcKK3Zpc29yX21lbXJlZ2lvbl9nZXRfbmJ5dGVzKE1FTVJFR0lPTiAqbWVtcmVnaW9uKQoreworCXJldHVybiBtZW1yZWdpb24tPm5ieXRlczsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX21lbXJlZ2lvbl9nZXRfbmJ5dGVzKTsKKwordm9pZCAqCit2aXNvcl9tZW1yZWdpb25fZ2V0X3BvaW50ZXIoTUVNUkVHSU9OICptZW1yZWdpb24pCit7CisJcmV0dXJuIG1lbXJlZ2lvbi0+bWFwcGVkOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfbWVtcmVnaW9uX2dldF9wb2ludGVyKTsKKworaW50Cit2aXNvcl9tZW1yZWdpb25fcmVzaXplKE1FTVJFR0lPTiAqbWVtcmVnaW9uLCB1bG9uZyBuZXdzaXplKQoreworCWlmIChuZXdzaXplID09IG1lbXJlZ2lvbi0+bmJ5dGVzKQorCQlyZXR1cm4gMDsKKwlpZiAobWVtcmVnaW9uLT5vdmVybGFwcGVkKQorCQkvKiBubyBlcnJvciBjaGVjayBoZXJlIC0gd2Ugbm8gbG9uZ2VyIGtub3cgdGhlCisJCSAqIHBhcmVudCdzIHJhbmdlIQorCQkgKi8KKwkJbWVtcmVnaW9uLT5uYnl0ZXMgPSBuZXdzaXplOworCWVsc2UgeworCQl1bm1hcGl0KG1lbXJlZ2lvbik7CisJCW1lbXJlZ2lvbi0+bmJ5dGVzID0gbmV3c2l6ZTsKKwkJaWYgKCFtYXBpdChtZW1yZWdpb24pKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX21lbXJlZ2lvbl9yZXNpemUpOworCisKK3N0YXRpYyBpbnQKK21lbXJlZ2lvbl9yZWFkd3JpdGUoQk9PTCBpc193cml0ZSwKKwkJICAgIE1FTVJFR0lPTiAqbWVtcmVnaW9uLCB1bG9uZyBvZmZzZXQsCisJCSAgICB2b2lkICpsb2NhbCwgdWxvbmcgbmJ5dGVzKQoreworCWlmIChvZmZzZXQgKyBuYnl0ZXMgPiBtZW1yZWdpb24tPm5ieXRlcykgeworCQlFUlJEUlYoIm1lbXJlZ2lvbl9yZWFkd3JpdGUgb2Zmc2V0IG91dCBvZiByYW5nZSEhIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlpZiAoaXNfd3JpdGUpCisJCW1lbWNweV90b2lvKG1lbXJlZ2lvbi0+bWFwcGVkICsgb2Zmc2V0LCBsb2NhbCwgbmJ5dGVzKTsKKwllbHNlCisJCW1lbWNweV9mcm9taW8obG9jYWwsIG1lbXJlZ2lvbi0+bWFwcGVkICsgb2Zmc2V0LCBuYnl0ZXMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAordmlzb3JfbWVtcmVnaW9uX3JlYWQoTUVNUkVHSU9OICptZW1yZWdpb24sIHVsb25nIG9mZnNldCwgdm9pZCAqZGVzdCwKKwkJICAgICB1bG9uZyBuYnl0ZXMpCit7CisJcmV0dXJuIG1lbXJlZ2lvbl9yZWFkd3JpdGUoRkFMU0UsIG1lbXJlZ2lvbiwgb2Zmc2V0LCBkZXN0LCBuYnl0ZXMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfbWVtcmVnaW9uX3JlYWQpOworCitpbnQKK3Zpc29yX21lbXJlZ2lvbl93cml0ZShNRU1SRUdJT04gKm1lbXJlZ2lvbiwgdWxvbmcgb2Zmc2V0LCB2b2lkICpzcmMsCisJCSAgICAgIHVsb25nIG5ieXRlcykKK3sKKwlyZXR1cm4gbWVtcmVnaW9uX3JlYWR3cml0ZShUUlVFLCBtZW1yZWdpb24sIG9mZnNldCwgc3JjLCBuYnl0ZXMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfbWVtcmVnaW9uX3dyaXRlKTsKKwordm9pZAordmlzb3JfbWVtcmVnaW9uX2Rlc3Ryb3koTUVNUkVHSU9OICptZW1yZWdpb24pCit7CisJaWYgKG1lbXJlZ2lvbiA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKCFtZW1yZWdpb24tPm92ZXJsYXBwZWQpCisJCXVubWFwaXQobWVtcmVnaW9uKTsKKwlrZnJlZShtZW1yZWdpb24pOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfbWVtcmVnaW9uX2Rlc3Ryb3kpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9wZXJpb2RpY193b3JrLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9wZXJpb2RpY193b3JrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3MGEzMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL3BlcmlvZGljX3dvcmsuYwpAQCAtMCwwICsxLDIzNiBAQAorLyogcGVyaW9kaWNfd29yay5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKgorICogIEhlbHBlciBmdW5jdGlvbnMgdG8gc2NoZWR1bGUgcGVyaW9kaWMgd29yayBpbiBMaW51eCBrZXJuZWwgbW9kZS4KKyAqLworCisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgInRpbXNrbW9kLmgiCisjaW5jbHVkZSAicGVyaW9kaWNfd29yay5oIgorCisjZGVmaW5lIE1ZRFJWTkFNRSAicGVyaW9kaWNfd29yayIKKworCisKK3N0cnVjdCBQRVJJT0RJQ19XT1JLX1RhZyB7CisJcndsb2NrX3QgbG9jazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CisJdm9pZCAoKndvcmtmdW5jKSh2b2lkICopOworCXZvaWQgKndvcmtmdW5jYXJnOworCUJPT0wgaXNfc2NoZWR1bGVkOworCUJPT0wgd2FudF90b19zdG9wOworCXVsb25nIGppZmZ5X2ludGVydmFsOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrcXVldWU7CisJY29uc3QgY2hhciAqZGV2bmFtOworfTsKKworCisKK3N0YXRpYyB2b2lkIHBlcmlvZGljX3dvcmtfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJUEVSSU9ESUNfV09SSyAqcGVyaW9kaWNfd29yayA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgUEVSSU9ESUNfV09SS19UYWcsIHdvcmsud29yayk7CisJKCpwZXJpb2RpY193b3JrLT53b3JrZnVuYykocGVyaW9kaWNfd29yay0+d29ya2Z1bmNhcmcpOworfQorCisKKworUEVSSU9ESUNfV09SSyAqdmlzb3JfcGVyaW9kaWNfd29ya19jcmVhdGUodWxvbmcgamlmZnlfaW50ZXJ2YWwsCisJCQkJCSAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZSwKKwkJCQkJICB2b2lkICgqd29ya2Z1bmMpKHZvaWQgKiksCisJCQkJCSAgdm9pZCAqd29ya2Z1bmNhcmcsCisJCQkJCSAgY29uc3QgY2hhciAqZGV2bmFtKQoreworCVBFUklPRElDX1dPUksgKnBlcmlvZGljX3dvcmsgPSBremFsbG9jKHNpemVvZihQRVJJT0RJQ19XT1JLKSwKKwkJCQkJICAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAocGVyaW9kaWNfd29yayA9PSBOVUxMKSB7CisJCUVSUkRSVigicGVyaW9kaWNfd29yayBhbGxvY2F0aW9uIGZhaWxlZCAiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJ3bG9ja19pbml0KCZwZXJpb2RpY193b3JrLT5sb2NrKTsKKwlwZXJpb2RpY193b3JrLT5qaWZmeV9pbnRlcnZhbCA9IGppZmZ5X2ludGVydmFsOworCXBlcmlvZGljX3dvcmstPndvcmtxdWV1ZSA9IHdvcmtxdWV1ZTsKKwlwZXJpb2RpY193b3JrLT53b3JrZnVuYyA9IHdvcmtmdW5jOworCXBlcmlvZGljX3dvcmstPndvcmtmdW5jYXJnID0gd29ya2Z1bmNhcmc7CisJcGVyaW9kaWNfd29yay0+ZGV2bmFtID0gZGV2bmFtOworCXJldHVybiBwZXJpb2RpY193b3JrOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfcGVyaW9kaWNfd29ya19jcmVhdGUpOworCisKKwordm9pZCB2aXNvcl9wZXJpb2RpY193b3JrX2Rlc3Ryb3koUEVSSU9ESUNfV09SSyAqcGVyaW9kaWNfd29yaykKK3sKKwlpZiAocGVyaW9kaWNfd29yayA9PSBOVUxMKQorCQlyZXR1cm47CisJa2ZyZWUocGVyaW9kaWNfd29yayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wZXJpb2RpY193b3JrX2Rlc3Ryb3kpOworCisKKworLyoqIENhbGwgdGhpcyBmcm9tIHlvdXIgcGVyaW9kaWMgd29yayB3b3JrZXIgZnVuY3Rpb24gdG8gc2NoZWR1bGUgdGhlIG5leHQKKyAqICBjYWxsLgorICogIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBGQUxTRSwgdGhlcmUgd2FzIGEgZmFpbHVyZSBhbmQgdGhlCisgKiAgcGVyaW9kaWMgd29yayBpcyBubyBsb25nZXIgc2NoZWR1bGVkCisgKi8KK0JPT0wgdmlzb3JfcGVyaW9kaWNfd29ya19uZXh0cGVyaW9kKFBFUklPRElDX1dPUksgKnBlcmlvZGljX3dvcmspCit7CisJQk9PTCByYyA9IEZBTFNFOworCXdyaXRlX2xvY2soJnBlcmlvZGljX3dvcmstPmxvY2spOworCWlmIChwZXJpb2RpY193b3JrLT53YW50X3RvX3N0b3ApIHsKKwkJcGVyaW9kaWNfd29yay0+aXNfc2NoZWR1bGVkID0gRkFMU0U7CisJCXBlcmlvZGljX3dvcmstPndhbnRfdG9fc3RvcCA9IEZBTFNFOworCQlyYyA9IFRSVUU7ICAvKiB5ZXMsIFRSVUU7IHNlZSB2aXNvcl9wZXJpb2RpY193b3JrX3N0b3AoKSAqLworCQlnb3RvIEF3YXk7CisJfSBlbHNlIGlmIChxdWV1ZV9kZWxheWVkX3dvcmsocGVyaW9kaWNfd29yay0+d29ya3F1ZXVlLAorCQkJCSAgICAgICZwZXJpb2RpY193b3JrLT53b3JrLAorCQkJCSAgICAgIHBlcmlvZGljX3dvcmstPmppZmZ5X2ludGVydmFsKSA8IDApIHsKKwkJRVJSREVWKHBlcmlvZGljX3dvcmstPmRldm5hbSwgInF1ZXVlX2RlbGF5ZWRfd29yayBmYWlsZWQhIik7CisJCXBlcmlvZGljX3dvcmstPmlzX3NjaGVkdWxlZCA9IEZBTFNFOworCQlyYyA9IEZBTFNFOworCQlnb3RvIEF3YXk7CisJfQorCXJjID0gVFJVRTsKK0F3YXk6CisJd3JpdGVfdW5sb2NrKCZwZXJpb2RpY193b3JrLT5sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wZXJpb2RpY193b3JrX25leHRwZXJpb2QpOworCisKKworLyoqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBUUlVFIGlmZiBuZXcgcGVyaW9kaWMgd29yayB3YXMgYWN0dWFsbHkgc3RhcnRlZC4KKyAqICBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgRkFMU0UsIHRoZW4gbm8gd29yayB3YXMgc3RhcnRlZAorICogIChlaXRoZXIgYmVjYXVzZSBpdCB3YXMgYWxyZWFkeSBzdGFydGVkLCBvciBiZWNhdXNlIG9mIGEgZmFpbHVyZSkuCisgKi8KK0JPT0wgdmlzb3JfcGVyaW9kaWNfd29ya19zdGFydChQRVJJT0RJQ19XT1JLICpwZXJpb2RpY193b3JrKQoreworCUJPT0wgcmMgPSBGQUxTRTsKKworCXdyaXRlX2xvY2soJnBlcmlvZGljX3dvcmstPmxvY2spOworCWlmIChwZXJpb2RpY193b3JrLT5pc19zY2hlZHVsZWQpIHsKKwkJcmMgPSBGQUxTRTsKKwkJZ290byBBd2F5OworCX0KKwlpZiAocGVyaW9kaWNfd29yay0+d2FudF90b19zdG9wKSB7CisJCUVSUkRFVihwZXJpb2RpY193b3JrLT5kZXZuYW0sCisJCSAgICAgICAiZGV2X3N0YXJ0X3BlcmlvZGljX3dvcmsgZmFpbGVkISIpOworCQlyYyA9IEZBTFNFOworCQlnb3RvIEF3YXk7CisJfQorCUlOSVRfREVMQVlFRF9XT1JLKCZwZXJpb2RpY193b3JrLT53b3JrLCAmcGVyaW9kaWNfd29ya19mdW5jKTsKKwlpZiAocXVldWVfZGVsYXllZF93b3JrKHBlcmlvZGljX3dvcmstPndvcmtxdWV1ZSwKKwkJCSAgICAgICAmcGVyaW9kaWNfd29yay0+d29yaywKKwkJCSAgICAgICBwZXJpb2RpY193b3JrLT5qaWZmeV9pbnRlcnZhbCkgPCAwKSB7CisJCUVSUkRFVihwZXJpb2RpY193b3JrLT5kZXZuYW0sCisJCSAgICAgICAiJXMgcXVldWVfZGVsYXllZF93b3JrIGZhaWxlZCEiLCBfX2Z1bmNfXyk7CisJCXJjID0gRkFMU0U7CisJCWdvdG8gQXdheTsKKwl9CisJcGVyaW9kaWNfd29yay0+aXNfc2NoZWR1bGVkID0gVFJVRTsKKwlyYyA9IFRSVUU7CitBd2F5OgorCXdyaXRlX3VubG9jaygmcGVyaW9kaWNfd29yay0+bG9jayk7CisJcmV0dXJuIHJjOworCit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wZXJpb2RpY193b3JrX3N0YXJ0KTsKKworCisKKworLyoqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBUUlVFIGlmZiB5b3VyIGNhbGwgYWN0dWFsbHkgc3RvcHBlZCB0aGUgcGVyaW9kaWMKKyAqICB3b3JrLgorICoKKyAqICAtLSBQQVkgQVRURU5USU9OLi4uIHRoaXMgaXMgaW1wb3J0YW50IC0tCisgKgorICogIE5PIE5PICMxCisgKgorICogICAgIERvIE5PVCBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBzb21lIGZ1bmN0aW9uIHRoYXQgaXMgcnVubmluZyBvbiB0aGUKKyAqICAgICBzYW1lIHdvcmtxdWV1ZSBhcyB0aGUgd29yayB5b3UgYXJlIHRyeWluZyB0byBzdG9wIG1pZ2h0IGJlIHJ1bm5pbmcKKyAqICAgICBvbiEgIElmIHlvdSB2aW9sYXRlIHRoaXMgcnVsZSwgdmlzb3JfcGVyaW9kaWNfd29ya19zdG9wKCkgTUlHSFQgd29yaywKKyAqICAgICBidXQgaXQgYWxzbyBNSUdIVCBnZXQgaHVuZyB1cCBpbiBhbiBpbmZpbml0ZSBsb29wIHNheWluZworICogICAgICJ3YWl0aW5nIGZvciBkZWxheWVkIHdvcmsuLi4iLiAgVGhpcyB3aWxsIGhhcHBlbiBpZiB0aGUgZGVsYXllZCB3b3JrCisgKiAgICAgeW91IGFyZSB0cnlpbmcgdG8gY2FuY2VsIGhhcyBiZWVuIHB1dCBpbiB0aGUgd29ya3F1ZXVlIGxpc3QsIGJ1dCBjYW4ndAorICogICAgIHJ1biB5ZXQgYmVjYXVzZSB3ZSBhcmUgcnVubmluZyB0aGF0IHNhbWUgd29ya3F1ZXVlIHRocmVhZCByaWdodCBub3cuCisgKgorICogICAgIEJvdHRvbSBsaW5lOiBJZiB5b3UgbmVlZCB0byBjYWxsIHZpc29yX3BlcmlvZGljX3dvcmtfc3RvcCgpIGZyb20gYQorICogICAgIHdvcmtpdGVtLCBiZSBzdXJlIHRoZSB3b3JraXRlbSBpcyBvbiBhIERJRkZFUkVOVCB3b3JrcXVldWUgdGhhbiB0aGUKKyAqICAgICB3b3JraXRlbSB0aGF0IHlvdSBhcmUgdHJ5aW5nIHRvIGNhbmNlbC4KKyAqCisgKiAgICAgSWYgSSBjb3VsZCBmaWd1cmUgb3V0IHNvbWUgd2F5IHRvIGNoZWNrIGZvciB0aGlzICJubyBubyIgY29uZGl0aW9uIGluCisgKiAgICAgdGhlIGNvZGUsIEkgd291bGQuICBJdCB3b3VsZCBoYXZlIHNhdmVkIG1lIHRoZSB0cm91YmxlIG9mIHdyaXRpbmcgdGhpcworICogICAgIGxvbmcgY29tbWVudC4gIEFuZCBhbHNvLCBkb24ndCB0aGluayB0aGlzIGlzIHNvbWUgInRoZW9yZXRpY2FsIiByYWNlCisgKiAgICAgY29uZGl0aW9uLiAgSXQgaXMgUkVBTCwgYXMgSSBoYXZlIHNwZW50IHRoZSBkYXkgY2hhc2luZyBpdC4KKyAqCisgKiAgTk8gTk8gIzIKKyAqCisgKiAgICAgVGFrZSBjbG9zZSBub3RlIG9mIHRoZSBsb2NrcyB0aGF0IHlvdSBvd24gd2hlbiB5b3UgY2FsbCB0aGlzIGZ1bmN0aW9uLgorICogICAgIFlvdSBtdXN0IE5PVCBvd24gYW55IGxvY2tzIHRoYXQgYXJlIG5lZWRlZCBieSB0aGUgcGVyaW9kaWMgd29yaworICogICAgIGZ1bmN0aW9uIHRoYXQgaXMgY3VycmVudGx5IGluc3RhbGxlZC4gIElmIHlvdSBETywgYSBkZWFkbG9jayBtYXkgcmVzdWx0LAorICogICAgIGJlY2F1c2Ugc3RvcHBpbmcgdGhlIHBlcmlvZGljIHdvcmsgb2Z0ZW4gaW52b2x2ZXMgd2FpdGluZyBmb3IgdGhlIGxhc3QKKyAqICAgICBpdGVyYXRpb24gb2YgdGhlIHBlcmlvZGljIHdvcmsgZnVuY3Rpb24gdG8gY29tcGxldGUuICBBZ2FpbiwgaWYgeW91IGhpdAorICogICAgIHRoaXMgZGVhZGxvY2ssIHlvdSB3aWxsIGdldCBodW5nIHVwIGluIGFuIGluZmluaXRlIGxvb3Agc2F5aW5nCisgKiAgICAgIndhaXRpbmcgZm9yIGRlbGF5ZWQgd29yay4uLiIuCisgKi8KK0JPT0wgdmlzb3JfcGVyaW9kaWNfd29ya19zdG9wKFBFUklPRElDX1dPUksgKnBlcmlvZGljX3dvcmspCit7CisJQk9PTCBzdG9wcGVkX3NvbWV0aGluZyA9IEZBTFNFOworCisJd3JpdGVfbG9jaygmcGVyaW9kaWNfd29yay0+bG9jayk7CisJc3RvcHBlZF9zb21ldGhpbmcgPSBwZXJpb2RpY193b3JrLT5pc19zY2hlZHVsZWQgJiYKKwkJKCFwZXJpb2RpY193b3JrLT53YW50X3RvX3N0b3ApOworCXdoaWxlIChwZXJpb2RpY193b3JrLT5pc19zY2hlZHVsZWQpIHsKKwkJcGVyaW9kaWNfd29yay0+d2FudF90b19zdG9wID0gVFJVRTsKKwkJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmsoJnBlcmlvZGljX3dvcmstPndvcmspKSB7CisJCQkvKiBXZSBnZXQgaGVyZSBpZiB0aGUgZGVsYXllZCB3b3JrIHdhcyBwZW5kaW5nIGFzCisJCQkgKiBkZWxheWVkIHdvcmssIGJ1dCB3YXMgTk9UIHJ1bi4KKwkJCSAqLworCQkJQVNTRVJUKHBlcmlvZGljX3dvcmstPmlzX3NjaGVkdWxlZCk7CisJCQlwZXJpb2RpY193b3JrLT5pc19zY2hlZHVsZWQgPSBGQUxTRTsKKwkJfSBlbHNlIHsKKwkJCS8qIElmIHdlIGdldCBoZXJlLCBlaXRoZXIgdGhlIGRlbGF5ZWQgd29yazoKKwkJCSAqIC0gd2FzIHJ1biwgT1IsCisJCQkgKiAtIGlzIHJ1bm5pbmcgUklHSFQgTk9XIG9uIGFub3RoZXIgcHJvY2Vzc29yLCBPUiwKKwkJCSAqIC0gd2Fzbid0IGV2ZW4gc2NoZWR1bGVkICh0aGVyZSBpcyBhIG1pbmlzY3VsZQorCQkJICogICB0aW1pbmcgd2luZG93IHdoZXJlIHRoaXMgY291bGQgYmUgdGhlIGNhc2UpCisJCQkgKiBmbHVzaF93b3JrcXVldWUoKSB3b3VsZCBtYWtlIHN1cmUgaXQgaXMgZmluaXNoZWQKKwkJCSAqIGV4ZWN1dGluZywgYnV0IHRoYXQgc3RpbGwgaXNuJ3QgdmVyeSB1c2VmdWwsIHdoaWNoCisJCQkgKiBleHBsYWlucyB0aGUgbG9vcC4uLgorCQkJICovCisJCX0KKwkJaWYgKHBlcmlvZGljX3dvcmstPmlzX3NjaGVkdWxlZCkgeworCQkJd3JpdGVfdW5sb2NrKCZwZXJpb2RpY193b3JrLT5sb2NrKTsKKwkJCVdBUk5ERVYocGVyaW9kaWNfd29yay0+ZGV2bmFtLAorCQkJCSJ3YWl0aW5nIGZvciBkZWxheWVkIHdvcmsuLi4iKTsKKwkJCS8qIFdlIHJlbHkgb24gdGhlIGRlbGF5ZWQgd29yayBmdW5jdGlvbiBydW5uaW5nIGhlcmUsCisJCQkgKiBhbmQgZXZlbnR1YWxseSBjYWxsaW5nCisJCQkgKiB2aXNvcl9wZXJpb2RpY193b3JrX25leHRwZXJpb2QoKSwKKwkJCSAqIHdoaWNoIHdpbGwgc2VlIHRoYXQgd2FudF90b19zdG9wIGlzIHNldCwgYW5kCisJCQkgKiBzdWJzZXF1ZW50bHkgY2xlYXIgaXNfc2NoZWR1bGVkLgorCQkJICovCisJCQlTTEVFUEpJRkZJRVMoMTApOworCQkJd3JpdGVfbG9jaygmcGVyaW9kaWNfd29yay0+bG9jayk7CisJCX0gZWxzZQorCQkJcGVyaW9kaWNfd29yay0+d2FudF90b19zdG9wID0gRkFMU0U7CisJfQorCXdyaXRlX3VubG9jaygmcGVyaW9kaWNfd29yay0+bG9jayk7CisJcmV0dXJuIHN0b3BwZWRfc29tZXRoaW5nOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfcGVyaW9kaWNfd29ya19zdG9wKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL3Byb2NvYmplY3R0cmVlLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9wcm9jb2JqZWN0dHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YTE5ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9wcm9jb2JqZWN0dHJlZS5jCkBAIC0wLDAgKzEsMzQ4IEBACisvKiBwcm9jb2JqZWN0dHJlZS5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSAicHJvY29iamVjdHRyZWUuaCIKKworI2RlZmluZSBNWURSVk5BTUUgInByb2NvYmplY3R0cmVlIgorCisKKworLyoqIFRoaXMgaXMgY29udGV4dCBpbmZvIHRoYXQgd2Ugc3Rhc2ggaW4gZWFjaCAvcHJvYyBmaWxlIGVudHJ5LCB3aGljaCB3ZQorICogIG5lZWQgaW4gb3JkZXIgdG8gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBzdXBwbGllcyB0aGUgL3Byb2MgcmVhZAorICogIGluZm8gZm9yIHRoYXQgZmlsZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQgKCpzaG93X3Byb3BlcnR5KShzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqLCBpbnQpOworCU1ZUFJPQ09CSkVDVCAqcHJvY09iamVjdDsKKwlpbnQgcHJvcGVydHlJbmRleDsKKworfSBQUk9DRElSRU5UUllDT05URVhUOworCisvKiogVGhpcyBkZXNjcmliZXMgdGhlIGF0dHJpYnV0ZXMgb2YgYSB0cmVlIHJvb3RlZCBhdAorICogIDxwcm9jRGlyUm9vdD4vPG5hbWVbMF0+LzxuYW1lWzFdPi8uLi4KKyAqICBQcm9wZXJ0aWVzIGZvciBlYWNoIG9iamVjdCBvZiB0aGlzIHR5cGUgd2lsbCBiZSBsb2NhdGVkIHVuZGVyCisgKiAgPHByb2NEaXJSb290Pi88bmFtZVswXT4vPG5hbWVbMV0+Ly4uLi88b2JqZWN0TmFtZT4vPHByb3BlcnR5TmFtZT4uCisgKi8KK3N0cnVjdCBNWVBST0NUWVBFX1RhZyB7CisJY29uc3QgY2hhciAqKm5hbWU7ICAvKio8IG5vZGUgbmFtZXMgZm9yIHRoaXMgdHlwZSwgZW5kaW5nIHdpdGggTlVMTCAqLworCWludCBuTmFtZXM7ICAgICAgICAgLyoqPCBudW0gb2Ygbm9kZSBuYW1lcyBpbiA8bmFtZT4gKi8KKworCS8qKiByb290IGRpciBmb3IgdGhpcyB0eXBlIHRyZWUgaW4gL3Byb2MgKi8KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NEaXJSb290OworCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICoqcHJvY0RpcnM7ICAvKio8IGZvciBlYWNoIG5vZGUgaW4gPG5hbWU+ICovCisKKwkvKiogYm90dG9tIGRpciB3aGVyZSBvYmplY3RzIHdpbGwgYmUgcm9vdGVkOyBpLmUuLCB0aGlzIGlzCisJICogIDxwcm9jRGlyUm9vdD4vPG5hbWVbMF0+LzxuYW1lWzFdPi8uLi4vLCB3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUKKwkgKiAgbGFzdCBlbnRyeSBpbiB0aGUgPHByb2NEaXJzPiBhcnJheS4gKi8KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NEaXI7CisKKwkvKiogbmFtZSBmb3IgZWFjaCBwcm9wZXJ0eSB0aGF0IG9iamVjdHMgb2YgdGhpcyB0eXBlIGNhbiBoYXZlICovCisJY29uc3QgY2hhciAqKnByb3BlcnR5TmFtZXM7CisKKwlpbnQgblByb3BlcnRpZXM7ICAgICAgIC8qKjwgbnVtIG9mIG5hbWVzIGluIDxwcm9wZXJ0eU5hbWVzPiAqLworCisJLyoqIENhbGwgdGhpcywgcGFzc2luZyBNWVBST0NPQkpFQ1QuY29udGV4dCBhbmQgdGhlIHByb3BlcnR5IGluZGV4CisJICogIHdoZW5ldmVyIHNvbWVvbmUgcmVhZHMgdGhlIHByb2MgZW50cnkgKi8KKwl2b2lkICgqc2hvd19wcm9wZXJ0eSkoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKiwgaW50KTsKK307CisKKworCitzdHJ1Y3QgTVlQUk9DT0JKRUNUX1RhZyB7CisJTVlQUk9DVFlQRSAqdHlwZTsKKworCS8qKiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBkaXIgbm9kZSBpbiAvcHJvYyB1bmRlciB3aGljaCB0aGUKKwkgKiAgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdCB3aWxsIGFwcGVhciBhcyBmaWxlcy4gKi8KKwljaGFyICpuYW1lOworCisJaW50IG5hbWVzaXplOyAgIC8qKjwgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBmb3IgbmFtZSAqLworCXZvaWQgKmNvbnRleHQ7ICAvKio8IHBhc3NlZCB0byBNWVBST0NUWVBFLnNob3dfcHJvcGVydHkgKi8KKworCS8qKiA8dHlwZS5wcm9jRGlyUm9vdD4vPHR5cGUubmFtZVswXT4vPHR5cGUubmFtZVsxXT4vLi4uLzxuYW1lPiAqLworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY0RpcjsKKworCS8qKiBhIHByb2MgZGlyIGVudHJ5IGZvciBlYWNoIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3Q7CisJICogIHByb3BlcnRpZXMgYXJlIGlkZW50aWZpZWQgaW4gTVlQUk9DVFlQRS5wcm9wZXJ0eU5hbWVzLCBzbyBlYWNoIG9mCisJICogIHRoZSA8cHJvY0RpclByb3BlcnRpZXM+IGRlc2NyaWJlcyBhIHNpbmdsZSBmaWxlIGxpa2UKKwkgKiAgPHR5cGUucHJvY0RpclJvb3Q+Lzx0eXBlLm5hbWVbMF0+Lzx0eXBlLm5hbWVbMV0+Ly4uLgorCSAqICAgICAgICAgICAvPG5hbWU+Lzxwcm9wZXJ0eU5hbWU+CisJICovCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICoqcHJvY0RpclByb3BlcnRpZXM7CisKKwkvKiogdGhpcyBpcyBhIGhvbGRpbmcgYXJlYSBmb3IgdGhlIGNvbnRleHQgaW5mb3JtYXRpb24gdGhhdCBpcyBuZWVkZWQKKwkgKiAgdG8gcnVuIHRoZSAvcHJvYyBjYWxsYmFjayBmdW5jdGlvbiAqLworCVBST0NESVJFTlRSWUNPTlRFWFQgKnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzOworfTsKKworCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKgorY3JlYXRlUHJvY0Rpcihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnAgPSBwcm9jX21rZGlyX21vZGUobmFtZSwgU19JRkRJUiwgcGFyZW50KTsKKwlpZiAocCA9PSBOVUxMKQorCQlFUlJEUlYoImZhaWxlZCB0byBjcmVhdGUgL3Byb2MgZGlyZWN0b3J5ICVzIiwgbmFtZSk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKgorY3JlYXRlUHJvY0ZpbGUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQsCisJICAgICAgIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwID0gcHJvY19jcmVhdGVfZGF0YShuYW1lLCAwLCBwYXJlbnQsCisJCQkJCQkgICAgZm9wcywgZGF0YSk7CisJaWYgKHAgPT0gTlVMTCkKKwkJRVJSRFJWKCJmYWlsZWQgdG8gY3JlYXRlIC9wcm9jIGZpbGUgJXMiLCBuYW1lKTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGludCBzZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKK3N0YXRpYyBpbnQgcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzZXFfc2hvdywgUERFX0RBVEEoaW5vZGUpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19mb3BzID0geworCS5vcGVuID0gcHJvY19vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworCisKK01ZUFJPQ1RZUEUgKnZpc29yX3Byb2NfQ3JlYXRlVHlwZShzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NEaXJSb290LAorCQkJCSAgY29uc3QgY2hhciAqKm5hbWUsCisJCQkJICBjb25zdCBjaGFyICoqcHJvcGVydHlOYW1lcywKKwkJCQkgIHZvaWQgKCpzaG93X3Byb3BlcnR5KShzdHJ1Y3Qgc2VxX2ZpbGUgKiwKKwkJCQkJCQl2b2lkICosIGludCkpCit7CisJaW50IGkgPSAwOworCU1ZUFJPQ1RZUEUgKnJjID0gTlVMTCwgKnR5cGUgPSBOVUxMOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyZW50ID0gTlVMTDsKKworCWlmIChwcm9jRGlyUm9vdCA9PSBOVUxMKSB7CisJCUVSUkRSVigicHJvY0RpclJvb3QgY2Fubm90IGJlIE5VTEwhXG4iKTsKKwkJZ290byBBd2F5OworCX0KKwlpZiAobmFtZSA9PSBOVUxMIHx8IG5hbWVbMF0gPT0gTlVMTCkgeworCQlFUlJEUlYoIm5hbWUgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgbm9kZSBuYW1lIVxuIik7CisJCWdvdG8gQXdheTsKKwl9CisJdHlwZSA9IGt6YWxsb2Moc2l6ZW9mKE1ZUFJPQ1RZUEUpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSk7CisJaWYgKHR5cGUgPT0gTlVMTCkgeworCQlFUlJEUlYoIm91dCBvZiBtZW1vcnlcbiIpOworCQlnb3RvIEF3YXk7CisJfQorCXR5cGUtPm5hbWUgPSBuYW1lOworCXR5cGUtPnByb3BlcnR5TmFtZXMgPSBwcm9wZXJ0eU5hbWVzOworCXR5cGUtPm5Qcm9wZXJ0aWVzID0gMDsKKwl0eXBlLT5uTmFtZXMgPSAwOworCXR5cGUtPnNob3dfcHJvcGVydHkgPSBzaG93X3Byb3BlcnR5OworCXR5cGUtPnByb2NEaXJSb290ID0gcHJvY0RpclJvb3Q7CisJaWYgKHR5cGUtPnByb3BlcnR5TmFtZXMgIT0gTlVMTCkKKwkJd2hpbGUgKHR5cGUtPnByb3BlcnR5TmFtZXNbdHlwZS0+blByb3BlcnRpZXNdICE9IE5VTEwpCisJCQl0eXBlLT5uUHJvcGVydGllcysrOworCXdoaWxlICh0eXBlLT5uYW1lW3R5cGUtPm5OYW1lc10gIT0gTlVMTCkKKwkJdHlwZS0+bk5hbWVzKys7CisJdHlwZS0+cHJvY0RpcnMgPSBremFsbG9jKCh0eXBlLT5uTmFtZXMgKyAxKSAqCisJCQkJIHNpemVvZihzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiksCisJCQkJIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAodHlwZS0+cHJvY0RpcnMgPT0gTlVMTCkgeworCQlFUlJEUlYoIm91dCBvZiBtZW1vcnlcbiIpOworCQlnb3RvIEF3YXk7CisJfQorCXBhcmVudCA9IHByb2NEaXJSb290OworCWZvciAoaSA9IDA7IGkgPCB0eXBlLT5uTmFtZXM7IGkrKykgeworCQl0eXBlLT5wcm9jRGlyc1tpXSA9IGNyZWF0ZVByb2NEaXIodHlwZS0+bmFtZVtpXSwgcGFyZW50KTsKKwkJaWYgKHR5cGUtPnByb2NEaXJzW2ldID09IE5VTEwpIHsKKwkJCXJjID0gTlVMTDsKKwkJCWdvdG8gQXdheTsKKwkJfQorCQlwYXJlbnQgPSB0eXBlLT5wcm9jRGlyc1tpXTsKKwl9CisJdHlwZS0+cHJvY0RpciA9IHR5cGUtPnByb2NEaXJzW3R5cGUtPm5OYW1lcy0xXTsKKwlyYyA9IHR5cGU7CitBd2F5OgorCWlmIChyYyA9PSBOVUxMKSB7CisJCWlmICh0eXBlICE9IE5VTEwpIHsKKwkJCXZpc29yX3Byb2NfRGVzdHJveVR5cGUodHlwZSk7CisJCQl0eXBlID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wcm9jX0NyZWF0ZVR5cGUpOworCisKKwordm9pZCB2aXNvcl9wcm9jX0Rlc3Ryb3lUeXBlKE1ZUFJPQ1RZUEUgKnR5cGUpCit7CisJaWYgKHR5cGUgPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmICh0eXBlLT5wcm9jRGlycyAhPSBOVUxMKSB7CisJCWludCBpID0gdHlwZS0+bk5hbWVzLTE7CisJCXdoaWxlIChpID49IDApIHsKKwkJCWlmICh0eXBlLT5wcm9jRGlyc1tpXSAhPSBOVUxMKSB7CisJCQkJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQgPSBOVUxMOworCQkJCWlmIChpID09IDApCisJCQkJCXBhcmVudCA9IHR5cGUtPnByb2NEaXJSb290OworCQkJCWVsc2UKKwkJCQkJcGFyZW50ID0gdHlwZS0+cHJvY0RpcnNbaS0xXTsKKwkJCQlyZW1vdmVfcHJvY19lbnRyeSh0eXBlLT5uYW1lW2ldLCBwYXJlbnQpOworCQkJfQorCQkJaS0tOworCQl9CisJCWtmcmVlKHR5cGUtPnByb2NEaXJzKTsKKwkJdHlwZS0+cHJvY0RpcnMgPSBOVUxMOworCX0KKwlrZnJlZSh0eXBlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3Byb2NfRGVzdHJveVR5cGUpOworCisKKworTVlQUk9DT0JKRUNUICp2aXNvcl9wcm9jX0NyZWF0ZU9iamVjdChNWVBST0NUWVBFICp0eXBlLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmNvbnRleHQpCit7CisJTVlQUk9DT0JKRUNUICpvYmogPSBOVUxMLCAqcmMgPSBOVUxMOworCWludCBpID0gMDsKKworCWlmICh0eXBlID09IE5VTEwpIHsKKwkJRVJSRFJWKCJ0eXBlIGNhbm5vdCBiZSBOVUxMXG4iKTsKKwkJZ290byBBd2F5OworCX0KKwlvYmogPSBremFsbG9jKHNpemVvZihNWVBST0NPQkpFQ1QpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSk7CisJaWYgKG9iaiA9PSBOVUxMKSB7CisJCUVSUkRSVigib3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gQXdheTsKKwl9CisJb2JqLT50eXBlID0gdHlwZTsKKwlvYmotPmNvbnRleHQgPSBjb250ZXh0OworCWlmIChuYW1lID09IE5VTEwpIHsKKwkJb2JqLT5uYW1lID0gTlVMTDsKKwkJb2JqLT5wcm9jRGlyID0gdHlwZS0+cHJvY0RpcjsKKwl9IGVsc2UgeworCQlvYmotPm5hbWVzaXplID0gc3RybGVuKG5hbWUpKzE7CisJCW9iai0+bmFtZSA9IGttYWxsb2Mob2JqLT5uYW1lc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOworCQlpZiAob2JqLT5uYW1lID09IE5VTEwpIHsKKwkJCW9iai0+bmFtZXNpemUgPSAwOworCQkJRVJSRFJWKCJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJCWdvdG8gQXdheTsKKwkJfQorCQlzdHJjcHkob2JqLT5uYW1lLCBuYW1lKTsKKwkJb2JqLT5wcm9jRGlyID0gY3JlYXRlUHJvY0RpcihvYmotPm5hbWUsIHR5cGUtPnByb2NEaXIpOworCQlpZiAob2JqLT5wcm9jRGlyID09IE5VTEwpIHsKKwkJCWdvdG8gQXdheTsKKwkJfQorCX0KKwlvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzID0KKwkJa3phbGxvYygodHlwZS0+blByb3BlcnRpZXMgKyAxKSAqIHNpemVvZihQUk9DRElSRU5UUllDT05URVhUKSwKKwkJCUdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAob2JqLT5wcm9jRGlyUHJvcGVydHlDb250ZXh0cyA9PSBOVUxMKSB7CisJCUVSUkRSVigib3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gQXdheTsKKwl9CisJb2JqLT5wcm9jRGlyUHJvcGVydGllcyA9CisJCWt6YWxsb2MoKHR5cGUtPm5Qcm9wZXJ0aWVzICsgMSkgKiBzaXplb2Yoc3RydWN0IHByb2NfZGlyX2VudHJ5ICopLAorCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOworCWlmIChvYmotPnByb2NEaXJQcm9wZXJ0aWVzID09IE5VTEwpIHsKKwkJRVJSRFJWKCJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBBd2F5OworCX0KKwlmb3IgKGkgPSAwOyBpIDwgdHlwZS0+blByb3BlcnRpZXM7IGkrKykgeworCQlvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzW2ldLnByb2NPYmplY3QgPSBvYmo7CisJCW9iai0+cHJvY0RpclByb3BlcnR5Q29udGV4dHNbaV0ucHJvcGVydHlJbmRleCA9IGk7CisJCW9iai0+cHJvY0RpclByb3BlcnR5Q29udGV4dHNbaV0uc2hvd19wcm9wZXJ0eSA9CisJCQl0eXBlLT5zaG93X3Byb3BlcnR5OworCQlpZiAodHlwZS0+cHJvcGVydHlOYW1lc1tpXVswXSAhPSAnXDAnKSB7CisJCQkvKiBvbmx5IGNyZWF0ZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBuYW1lcyAqLworCQkJb2JqLT5wcm9jRGlyUHJvcGVydGllc1tpXSA9CisJCQkJY3JlYXRlUHJvY0ZpbGUodHlwZS0+cHJvcGVydHlOYW1lc1tpXSwKKwkJCQkJICAgICAgIG9iai0+cHJvY0RpciwgJnByb2NfZm9wcywKKwkJCQkJICAgICAgICZvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzW2ldKTsKKwkJCWlmIChvYmotPnByb2NEaXJQcm9wZXJ0aWVzW2ldID09IE5VTEwpIHsKKwkJCQlyYyA9IE5VTEw7CisJCQkJZ290byBBd2F5OworCQkJfQorCQl9CisJfQorCXJjID0gb2JqOworQXdheToKKwlpZiAocmMgPT0gTlVMTCkgeworCQlpZiAob2JqICE9IE5VTEwpIHsKKwkJCXZpc29yX3Byb2NfRGVzdHJveU9iamVjdChvYmopOworCQkJb2JqID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wcm9jX0NyZWF0ZU9iamVjdCk7CisKKworCit2b2lkIHZpc29yX3Byb2NfRGVzdHJveU9iamVjdChNWVBST0NPQkpFQ1QgKm9iaikKK3sKKwlNWVBST0NUWVBFICp0eXBlID0gTlVMTDsKKwlpZiAob2JqID09IE5VTEwpCisJCXJldHVybjsKKwl0eXBlID0gb2JqLT50eXBlOworCWlmICh0eXBlID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAob2JqLT5wcm9jRGlyUHJvcGVydGllcyAhPSBOVUxMKSB7CisJCWludCBpID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IHR5cGUtPm5Qcm9wZXJ0aWVzOyBpKyspIHsKKwkJCWlmIChvYmotPnByb2NEaXJQcm9wZXJ0aWVzW2ldICE9IE5VTEwpIHsKKwkJCQlyZW1vdmVfcHJvY19lbnRyeSh0eXBlLT5wcm9wZXJ0eU5hbWVzW2ldLAorCQkJCQkJICBvYmotPnByb2NEaXIpOworCQkJCW9iai0+cHJvY0RpclByb3BlcnRpZXNbaV0gPSBOVUxMOworCQkJfQorCQl9CisJCWtmcmVlKG9iai0+cHJvY0RpclByb3BlcnRpZXMpOworCQlvYmotPnByb2NEaXJQcm9wZXJ0aWVzID0gTlVMTDsKKwl9CisJaWYgKG9iai0+cHJvY0RpclByb3BlcnR5Q29udGV4dHMgIT0gTlVMTCkgeworCQlrZnJlZShvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzKTsKKwkJb2JqLT5wcm9jRGlyUHJvcGVydHlDb250ZXh0cyA9IE5VTEw7CisJfQorCWlmIChvYmotPnByb2NEaXIgIT0gTlVMTCkgeworCQlpZiAob2JqLT5uYW1lICE9IE5VTEwpCisJCQlyZW1vdmVfcHJvY19lbnRyeShvYmotPm5hbWUsIHR5cGUtPnByb2NEaXIpOworCQlvYmotPnByb2NEaXIgPSBOVUxMOworCX0KKwlpZiAob2JqLT5uYW1lICE9IE5VTEwpIHsKKwkJa2ZyZWUob2JqLT5uYW1lKTsKKwkJb2JqLT5uYW1lID0gTlVMTDsKKwl9CisJa2ZyZWUob2JqKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3Byb2NfRGVzdHJveU9iamVjdCk7CisKKworCitzdGF0aWMgaW50IHNlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJUFJPQ0RJUkVOVFJZQ09OVEVYVCAqY3R4ID0gKFBST0NESVJFTlRSWUNPTlRFWFQgKikoc2VxLT5wcml2YXRlKTsKKwlpZiAoY3R4ID09IE5VTEwpIHsKKwkJRVJSRFJWKCJJIGRvbid0IGhhdmUgYSBmcmVha2luJyBjbHVlLi4uIik7CisJCXJldHVybiAwOworCX0KKwkoKmN0eC0+c2hvd19wcm9wZXJ0eSkoc2VxLCBjdHgtPnByb2NPYmplY3QtPmNvbnRleHQsCisJCQkgICAgICBjdHgtPnByb3BlcnR5SW5kZXgpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvdmlzb3JrbW9kdXRpbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL3Zpc29ya21vZHV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdkMWU5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL3Zpc29ya21vZHV0aWxzLmMKQEAgLTAsMCArMSw3MSBAQAorLyogdGltc2ttb2R1dGlscy5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgInRpbXNrbW9kLmgiCisKKyNkZWZpbmUgTVlEUlZOQU1FICJ0aW1za21vZHV0aWxzIgorCisvKiogQ2FsbGVycyB0byBpbnRlcmZhY2VzIHRoYXQgc2V0IF9fR0ZQX05PUkVUUlkgZmxhZyBiZWxvdworICogIG11c3QgY2hlY2sgZm9yIGEgTlVMTCAoZXJyb3IpIHJlc3VsdCBhcyB3ZSBhcmUgdGVsbGluZyB0aGUKKyAqICBrZXJuZWwgaW50ZXJmYWNlIHRoYXQgaXQgaXMgb2theSB0byBmYWlsLgorICovCisKK3ZvaWQgKmttYWxsb2Nfa2VybmVsKHNpemVfdCBzaXopCit7CisJcmV0dXJuIGttYWxsb2Moc2l6LCBHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSk7Cit9CisKKy8qICBVc2UgdGhlc2UgaGFuZHktZGFuZHkgc2VxX2ZpbGVfeHh4IGZ1bmN0aW9ucyBpZiB5b3Ugd2FudCB0byBjYWxsIHNvbWUKKyAqICBmdW5jdGlvbnMgdGhhdCB3cml0ZSBzdHVmZiBpbnRvIGEgc2VxX2ZpbGUsIGJ1dCB5b3UgYWN0dWFsbHkganVzdCB3YW50CisgKiAgdG8gZHVtcCB0aGF0IG91dHB1dCBpbnRvIGEgYnVmZmVyLiAgVXNlIHRoZW0gYXMgZm9sbG93czoKKyAqICAtIGNhbGwgdmlzb3Jfc2VxX2ZpbGVfbmV3X2J1ZmZlciB0byBjcmVhdGUgdGhlIHNlcV9maWxlICh5b3Ugc3VwcGx5IHRoZSBidWYpCisgKiAgLSBjYWxsIHdoYXRldmVyIGZ1bmN0aW9ucyB5b3Ugd2FudCB0aGF0IHRha2UgYSBzZXFfZmlsZSBhcyBhbiBhcmd1bWVudAorICogICAgKHRoZSBidWYgeW91IHN1cHBsaWVkIHdpbGwgZ2V0IHRoZSBvdXRwdXQgZGF0YSkKKyAqICAtIGNhbGwgdmlzb3Jfc2VxX2ZpbGVfZG9uZV9idWZmZXIgdG8gZGlzcG9zZSBvZiB5b3VyIHNlcV9maWxlCisgKi8KK3N0cnVjdCBzZXFfZmlsZSAqdmlzb3Jfc2VxX2ZpbGVfbmV3X2J1ZmZlcih2b2lkICpidWYsIHNpemVfdCBidWZfc2l6ZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnJjID0gTlVMTDsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBrbWFsbG9jX2tlcm5lbChzaXplb2Yoc3RydWN0IHNlcV9maWxlKSk7CisKKwlpZiAobSA9PSBOVUxMKSB7CisJCXJjID0gTlVMTDsKKwkJZ290byBBd2F5OworCX0KKwltZW1zZXQobSwgMCwgc2l6ZW9mKHN0cnVjdCBzZXFfZmlsZSkpOworCW0tPmJ1ZiA9IGJ1ZjsKKwltLT5zaXplID0gYnVmX3NpemU7CisJcmMgPSBtOworQXdheToKKwlpZiAocmMgPT0gTlVMTCkgeworCQl2aXNvcl9zZXFfZmlsZV9kb25lX2J1ZmZlcihtKTsKKwkJbSA9IE5VTEw7CisJfQorCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3NlcV9maWxlX25ld19idWZmZXIpOworCisKKwordm9pZCB2aXNvcl9zZXFfZmlsZV9kb25lX2J1ZmZlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit7CisJaWYgKCFtKQorCQlyZXR1cm47CisJa2ZyZWUobSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9zZXFfZmlsZV9kb25lX2J1ZmZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yi5oIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWIuaAppbmRleCBhNzNlNDM3Li4yNjZlMmIwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yi5oCkBAIC04Niw2ICs4Niw3IEBACiAJY2hhciBzdGF0dXM7CiAJaW50IGludGVyZl9jb3VudDsKIAlzdHJ1Y3Qgc3R1Yl9kZXZpY2UgKnNkZXY7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAJY2hhciBzaHV0ZG93bl9idXNpZDsKIH07CiAKQEAgLTkzLDcgKzk0LDcgQEAKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqc3R1Yl9wcml2X2NhY2hlOwogCiAvKiBzdHViX2Rldi5jICovCi1leHRlcm4gc3RydWN0IHVzYl9kcml2ZXIgc3R1Yl9kcml2ZXI7CitleHRlcm4gc3RydWN0IHVzYl9kZXZpY2VfZHJpdmVyIHN0dWJfZHJpdmVyOwogCiAvKiBzdHViX21haW4uYyAqLwogc3RydWN0IGJ1c19pZF9wcml2ICpnZXRfYnVzaWRfcHJpdihjb25zdCBjaGFyICpidXNpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX2Rldi5jCmluZGV4IDc2YTFmZjAuLjc3M2Q4Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX2Rldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX2Rldi5jCkBAIC04NywxMyArODcsMTYgQEAKIAlpbnQgc29ja2ZkID0gMDsKIAlzdHJ1Y3Qgc29ja2V0ICpzb2NrZXQ7CiAJc3NpemVfdCBlcnIgPSAtRUlOVkFMOworCWludCBydjsKIAogCWlmICghc2RldikgewogCQlkZXZfZXJyKGRldiwgInNkZXYgaXMgbnVsbFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXNzY2FuZihidWYsICIlZCIsICZzb2NrZmQpOworCXJ2ID0gc3NjYW5mKGJ1ZiwgIiVkIiwgJnNvY2tmZCk7CisJaWYgKHJ2ICE9IDEpCisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKHNvY2tmZCAhPSAtMSkgewogCQlkZXZfaW5mbyhkZXYsICJzdHViIHVwXG4iKTsKQEAgLTI3OSwyMSArMjgyLDE5IEBACiAgKgogICogQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBhIG5ldyBzdHViX2RldmljZSBzdHJ1Y3QuCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc3R1Yl9kZXZpY2UgKnN0dWJfZGV2aWNlX2FsbG9jKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAotCQkJCQkgICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCitzdGF0aWMgc3RydWN0IHN0dWJfZGV2aWNlICpzdHViX2RldmljZV9hbGxvYyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKIAlzdHJ1Y3Qgc3R1Yl9kZXZpY2UgKnNkZXY7Ci0JaW50IGJ1c251bSA9IGludGVyZmFjZV90b19idXNudW0oaW50ZXJmYWNlKTsKLQlpbnQgZGV2bnVtID0gaW50ZXJmYWNlX3RvX2Rldm51bShpbnRlcmZhY2UpOworCWludCBidXNudW0gPSB1ZGV2LT5idXMtPmJ1c251bTsKKwlpbnQgZGV2bnVtID0gdWRldi0+ZGV2bnVtOwogCi0JZGV2X2RiZygmaW50ZXJmYWNlLT5kZXYsICJhbGxvY2F0aW5nIHN0dWIgZGV2aWNlIik7CisJZGV2X2RiZygmdWRldi0+ZGV2LCAiYWxsb2NhdGluZyBzdHViIGRldmljZSIpOwogCiAJLyogeWVzLCBpdCdzIGEgbmV3IGRldmljZSAqLwogCXNkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3R1Yl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNkZXYpCiAJCXJldHVybiBOVUxMOwogCi0Jc2Rldi0+aW50ZXJmYWNlID0gdXNiX2dldF9pbnRmKGludGVyZmFjZSk7CiAJc2Rldi0+dWRldiA9IHVzYl9nZXRfZGV2KHVkZXYpOwogCiAJLyoKQEAgLTMyMiw3ICszMjMsNyBAQAogCiAJdXNiaXBfc3RhcnRfZWgoJnNkZXYtPnVkKTsKIAotCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAicmVnaXN0ZXIgbmV3IGludGVyZmFjZVxuIik7CisJZGV2X2RiZygmdWRldi0+ZGV2LCAicmVnaXN0ZXIgbmV3IGRldmljZVxuIik7CiAKIAlyZXR1cm4gc2RldjsKIH0KQEAgLTMzMiwzMiArMzMzLDIxIEBACiAJa2ZyZWUoc2Rldik7CiB9CiAKLS8qCi0gKiBJZiBhIHVzYiBkZXZpY2UgaGFzIG11bHRpcGxlIGFjdGl2ZSBpbnRlcmZhY2VzLCB0aGlzIGRyaXZlciBpcyBib3VuZCB0byBhbGwKLSAqIHRoZSBhY3RpdmUgaW50ZXJmYWNlcy4gSG93ZXZlciwgdXNiaXAgZXhwb3J0cyAqYSogdXNiIGRldmljZSAoaS5lLiwgbm90ICphbioKLSAqIGFjdGl2ZSBpbnRlcmZhY2UpLiBDdXJyZW50bHksIGEgdXNlcmxhbmQgcHJvZ3JhbSBtdXN0IGVuc3VyZSB0aGF0IGl0Ci0gKiBsb29rcyBhdCB0aGUgdXNiaXAncyBzeXNmcyBlbnRyaWVzIG9mIG9ubHkgdGhlIGZpcnN0IGFjdGl2ZSBpbnRlcmZhY2UuCi0gKgotICogVE9ETzogdXNlICJzdHJ1Y3QgdXNiX2RldmljZV9kcml2ZXIiIHRvIGJpbmQgYSB1c2IgZGV2aWNlLgotICogSG93ZXZlciwgaXQgc2VlbXMgaXQgaXMgbm90IGZ1bGx5IHN1cHBvcnRlZCBpbiBtYWlubGluZSBrZXJuZWwgeWV0Ci0gKiAoMi42LjE5LjIpLgotICovCi1zdGF0aWMgaW50IHN0dWJfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKLQkJICAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQorc3RhdGljIGludCBzdHViX3Byb2JlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOwogCXN0cnVjdCBzdHViX2RldmljZSAqc2RldiA9IE5VTEw7Ci0JY29uc3QgY2hhciAqdWRldl9idXNpZCA9IGRldl9uYW1lKGludGVyZmFjZS0+ZGV2LnBhcmVudCk7CisJY29uc3QgY2hhciAqdWRldl9idXNpZCA9IGRldl9uYW1lKCZ1ZGV2LT5kZXYpOwogCWludCBlcnIgPSAwOwogCXN0cnVjdCBidXNfaWRfcHJpdiAqYnVzaWRfcHJpdjsKKwlpbnQgcmM7CiAKLQlkZXZfZGJnKCZpbnRlcmZhY2UtPmRldiwgIkVudGVyXG4iKTsKKwlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJFbnRlclxuIik7CiAKIAkvKiBjaGVjayB3ZSBzaG91bGQgY2xhaW0gb3Igbm90IGJ5IGJ1c2lkX3RhYmxlICovCiAJYnVzaWRfcHJpdiA9IGdldF9idXNpZF9wcml2KHVkZXZfYnVzaWQpOwogCWlmICghYnVzaWRfcHJpdiB8fCAoYnVzaWRfcHJpdi0+c3RhdHVzID09IFNUVUJfQlVTSURfUkVNT1YpIHx8CiAJICAgIChidXNpZF9wcml2LT5zdGF0dXMgPT0gU1RVQl9CVVNJRF9PVEhFUikpIHsKLQkJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LAorCQlkZXZfaW5mbygmdWRldi0+ZGV2LAogCQkJIiVzIGlzIG5vdCBpbiBtYXRjaF9idXNpZCB0YWJsZS4uLiBza2lwIVxuIiwKIAkJCXVkZXZfYnVzaWQpOwogCkBAIC0zODMsNjAgKzM3Myw0MSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoYnVzaWRfcHJpdi0+c3RhdHVzID09IFNUVUJfQlVTSURfQUxMT0MpIHsKLQkJc2RldiA9IGJ1c2lkX3ByaXYtPnNkZXY7Ci0JCWlmICghc2RldikKLQkJCXJldHVybiAtRU5PREVWOwotCi0JCWJ1c2lkX3ByaXYtPmludGVyZl9jb3VudCsrOwotCQlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsCi0JCQkidXNiaXAtaG9zdDogcmVnaXN0ZXIgbmV3IGludGVyZmFjZSAoYnVzICV1IGRldiAldSBpZm4gJXUpXG4iLAotCQkJdWRldi0+YnVzLT5idXNudW0sIHVkZXYtPmRldm51bSwKLQkJCWludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcik7Ci0KLQkJLyogc2V0IHByaXZhdGUgZGF0YSB0byB1c2JfaW50ZXJmYWNlICovCi0JCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBzZGV2KTsKLQotCQllcnIgPSBzdHViX2FkZF9maWxlcygmaW50ZXJmYWNlLT5kZXYpOwotCQlpZiAoZXJyKSB7Ci0JCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgInN0dWJfYWRkX2ZpbGVzIGZvciAlc1xuIiwKLQkJCQl1ZGV2X2J1c2lkKTsKLQkJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKLQkJCWJ1c2lkX3ByaXYtPmludGVyZl9jb3VudC0tOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCi0JCXVzYl9nZXRfaW50ZihpbnRlcmZhY2UpOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAkvKiBvaywgdGhpcyBpcyBteSBkZXZpY2UgKi8KLQlzZGV2ID0gc3R1Yl9kZXZpY2VfYWxsb2ModWRldiwgaW50ZXJmYWNlKTsKKwlzZGV2ID0gc3R1Yl9kZXZpY2VfYWxsb2ModWRldik7CiAJaWYgKCFzZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwKLQkJInVzYmlwLWhvc3Q6IHJlZ2lzdGVyIG5ldyBkZXZpY2UgKGJ1cyAldSBkZXYgJXUgaWZuICV1KVxuIiwKLQkJdWRldi0+YnVzLT5idXNudW0sIHVkZXYtPmRldm51bSwKLQkJaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKKwlkZXZfaW5mbygmdWRldi0+ZGV2LAorCQkidXNiaXAtaG9zdDogcmVnaXN0ZXIgbmV3IGRldmljZSAoYnVzICV1IGRldiAldSlcbiIsCisJCXVkZXYtPmJ1cy0+YnVzbnVtLCB1ZGV2LT5kZXZudW0pOwogCi0JYnVzaWRfcHJpdi0+aW50ZXJmX2NvdW50ID0gMDsKIAlidXNpZF9wcml2LT5zaHV0ZG93bl9idXNpZCA9IDA7CiAKLQkvKiBzZXQgcHJpdmF0ZSBkYXRhIHRvIHVzYl9pbnRlcmZhY2UgKi8KLQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgc2Rldik7Ci0JYnVzaWRfcHJpdi0+aW50ZXJmX2NvdW50Kys7CisJLyogc2V0IHByaXZhdGUgZGF0YSB0byB1c2JfZGV2aWNlICovCisJZGV2X3NldF9kcnZkYXRhKCZ1ZGV2LT5kZXYsIHNkZXYpOwogCWJ1c2lkX3ByaXYtPnNkZXYgPSBzZGV2OworCWJ1c2lkX3ByaXYtPnVkZXYgPSB1ZGV2OwogCi0JZXJyID0gc3R1Yl9hZGRfZmlsZXMoJmludGVyZmFjZS0+ZGV2KTsKKwkvKgorCSAqIENsYWltIHRoaXMgaHViIHBvcnQuCisJICogSXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB2YWx1ZSB3ZSBwYXNzIGFzIG93bmVyCisJICogKHN0cnVjdCBkZXZfc3RhdGUpIGFzIGxvbmcgYXMgaXQgaXMgdW5pcXVlLgorCSAqLworCXJjID0gdXNiX2h1Yl9jbGFpbV9wb3J0KHVkZXYtPnBhcmVudCwgdWRldi0+cG9ydG51bSwKKwkJCShzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqKSB1ZGV2KTsKKwlpZiAocmMpIHsKKwkJZGV2X2RiZygmdWRldi0+ZGV2LCAidW5hYmxlIHRvIGNsYWltIHBvcnRcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJZXJyID0gc3R1Yl9hZGRfZmlsZXMoJnVkZXYtPmRldik7CiAJaWYgKGVycikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgInN0dWJfYWRkX2ZpbGVzIGZvciAlc1xuIiwgdWRldl9idXNpZCk7Ci0JCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKLQkJdXNiX3B1dF9pbnRmKGludGVyZmFjZSk7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgInN0dWJfYWRkX2ZpbGVzIGZvciAlc1xuIiwgdWRldl9idXNpZCk7CisJCWRldl9zZXRfZHJ2ZGF0YSgmdWRldi0+ZGV2LCBOVUxMKTsKIAkJdXNiX3B1dF9kZXYodWRldik7CiAJCWt0aHJlYWRfc3RvcF9wdXQoc2Rldi0+dWQuZWgpOwogCi0JCWJ1c2lkX3ByaXYtPmludGVyZl9jb3VudCA9IDA7CiAJCWJ1c2lkX3ByaXYtPnNkZXYgPSBOVUxMOwogCQlzdHViX2RldmljZV9mcmVlKHNkZXYpOwogCQlyZXR1cm4gZXJyOwpAQCAtNDYxLDEzICs0MzIsMTQgQEAKICAqIGNhbGxlZCBpbiB1c2JfZGlzY29ubmVjdCgpIG9yIHVzYl9kZXJlZ2lzdGVyKCkKICAqIGJ1dCBvbmx5IGlmIGFjdGNvbmZpZyhhY3RpdmUgY29uZmlndXJhdGlvbikgZXhpc3RzCiAgKi8KLXN0YXRpYyB2b2lkIHN0dWJfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQorc3RhdGljIHZvaWQgc3R1Yl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewogCXN0cnVjdCBzdHViX2RldmljZSAqc2RldjsKLQljb25zdCBjaGFyICp1ZGV2X2J1c2lkID0gZGV2X25hbWUoaW50ZXJmYWNlLT5kZXYucGFyZW50KTsKKwljb25zdCBjaGFyICp1ZGV2X2J1c2lkID0gZGV2X25hbWUoJnVkZXYtPmRldik7CiAJc3RydWN0IGJ1c19pZF9wcml2ICpidXNpZF9wcml2OworCWludCByYzsKIAotCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAiRW50ZXJcbiIpOworCWRldl9kYmcoJnVkZXYtPmRldiwgIkVudGVyXG4iKTsKIAogCWJ1c2lkX3ByaXYgPSBnZXRfYnVzaWRfcHJpdih1ZGV2X2J1c2lkKTsKIAlpZiAoIWJ1c2lkX3ByaXYpIHsKQEAgLTQ3NSw0MSArNDQ3LDM3IEBACiAJCXJldHVybjsKIAl9CiAKLQlzZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCXNkZXYgPSBkZXZfZ2V0X2RydmRhdGEoJnVkZXYtPmRldik7CiAKIAkvKiBnZXQgc3R1Yl9kZXZpY2UgKi8KIAlpZiAoIXNkZXYpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJjb3VsZCBub3QgZ2V0IGRldmljZSIpOworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJjb3VsZCBub3QgZ2V0IGRldmljZSIpOwogCQlyZXR1cm47CiAJfQogCi0JdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCWRldl9zZXRfZHJ2ZGF0YSgmdWRldi0+ZGV2LCBOVUxMKTsKIAogCS8qCiAJICogTk9URTogcngvdHggdGhyZWFkcyBhcmUgaW52b2tlZCBmb3IgZWFjaCB1c2JfZGV2aWNlLgogCSAqLwotCXN0dWJfcmVtb3ZlX2ZpbGVzKCZpbnRlcmZhY2UtPmRldik7CisJc3R1Yl9yZW1vdmVfZmlsZXMoJnVkZXYtPmRldik7CisKKwkvKiByZWxlYXNlIHBvcnQgKi8KKwlyYyA9IHVzYl9odWJfcmVsZWFzZV9wb3J0KHVkZXYtPnBhcmVudCwgdWRldi0+cG9ydG51bSwKKwkJCQkgIChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqKSB1ZGV2KTsKKwlpZiAocmMpIHsKKwkJZGV2X2RiZygmdWRldi0+ZGV2LCAidW5hYmxlIHRvIHJlbGVhc2UgcG9ydFxuIik7CisJCXJldHVybjsKKwl9CiAKIAkvKiBJZiB1c2IgcmVzZXQgaXMgY2FsbGVkIGZyb20gZXZlbnQgaGFuZGxlciAqLwotCWlmIChidXNpZF9wcml2LT5zZGV2LT51ZC5laCA9PSBjdXJyZW50KSB7Ci0JCWJ1c2lkX3ByaXYtPmludGVyZl9jb3VudC0tOworCWlmIChidXNpZF9wcml2LT5zZGV2LT51ZC5laCA9PSBjdXJyZW50KQogCQlyZXR1cm47Ci0JfQotCi0JaWYgKGJ1c2lkX3ByaXYtPmludGVyZl9jb3VudCA+IDEpIHsKLQkJYnVzaWRfcHJpdi0+aW50ZXJmX2NvdW50LS07Ci0JCXNodXRkb3duX2J1c2lkKGJ1c2lkX3ByaXYpOwotCQl1c2JfcHV0X2ludGYoaW50ZXJmYWNlKTsKLQkJcmV0dXJuOwotCX0KLQotCWJ1c2lkX3ByaXYtPmludGVyZl9jb3VudCA9IDA7CiAKIAkvKiBzaHV0ZG93biB0aGUgY3VycmVudCBjb25uZWN0aW9uICovCiAJc2h1dGRvd25fYnVzaWQoYnVzaWRfcHJpdik7CiAKIAl1c2JfcHV0X2RldihzZGV2LT51ZGV2KTsKLQl1c2JfcHV0X2ludGYoaW50ZXJmYWNlKTsKIAogCS8qIGZyZWUgc2RldiAqLwogCWJ1c2lkX3ByaXYtPnNkZXYgPSBOVUxMOwpAQCAtNTIzLDI4ICs0OTEsMzQgQEAKIAl9CiB9CiAKLS8qCi0gKiBQcmVzZW5jZSBvZiBwcmVfcmVzZXQgYW5kIHBvc3RfcmVzZXQgcHJldmVudHMgdGhlIGRyaXZlciBmcm9tIGJlaW5nIHVuYm91bmQKLSAqIHdoZW4gdGhlIGRldmljZSBpcyBiZWluZyByZXNldAotICovCisjaWZkZWYgQ09ORklHX1BNCiAKLXN0YXRpYyBpbnQgc3R1Yl9wcmVfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKKy8qIFRoZXNlIGZ1bmN0aW9ucyBuZWVkIHVzYl9wb3J0X3N1c3BlbmQgYW5kIHVzYl9wb3J0X3Jlc3VtZSwKKyAqIHdoaWNoIHJlc2lkZSBpbiBkcml2ZXJzL3VzYi9jb3JlL3VzYi5oLiBTa2lwIGZvciBub3cuICovCisKK3N0YXRpYyBpbnQgc3R1Yl9zdXNwZW5kKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKIHsKLQlkZXZfZGJnKCZpbnRlcmZhY2UtPmRldiwgInByZV9yZXNldFxuIik7CisJZGV2X2RiZygmdWRldi0+ZGV2LCAic3R1Yl9zdXNwZW5kXG4iKTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHN0dWJfcG9zdF9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQorc3RhdGljIGludCBzdHViX3Jlc3VtZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCiB7Ci0JZGV2X2RiZygmaW50ZXJmYWNlLT5kZXYsICJwb3N0X3Jlc2V0XG4iKTsKKwlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJzdHViX3Jlc3VtZVxuIik7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IHVzYl9kcml2ZXIgc3R1Yl9kcml2ZXIgPSB7CisjZW5kaWYJLyogQ09ORklHX1BNICovCisKK3N0cnVjdCB1c2JfZGV2aWNlX2RyaXZlciBzdHViX2RyaXZlciA9IHsKIAkubmFtZQkJPSAidXNiaXAtaG9zdCIsCiAJLnByb2JlCQk9IHN0dWJfcHJvYmUsCiAJLmRpc2Nvbm5lY3QJPSBzdHViX2Rpc2Nvbm5lY3QsCi0JLmlkX3RhYmxlCT0gc3R1Yl90YWJsZSwKLQkucHJlX3Jlc2V0CT0gc3R1Yl9wcmVfcmVzZXQsCi0JLnBvc3RfcmVzZXQJPSBzdHViX3Bvc3RfcmVzZXQsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBzdHViX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzdHViX3Jlc3VtZSwKKyNlbmRpZgorCS5zdXBwb3J0c19hdXRvc3VzcGVuZAk9CTAsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfbWFpbi5jCmluZGV4IGJhZjg1N2YuLjljNTgzMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9tYWluLmMKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCiAjaW5jbHVkZSAidXNiaXBfY29tbW9uLmgiCiAjaW5jbHVkZSAic3R1Yi5oIgpAQCAtMTg3LDYgKzE4OCwzNCBAQAogc3RhdGljIERSSVZFUl9BVFRSKG1hdGNoX2J1c2lkLCBTX0lSVVNSIHwgU19JV1VTUiwgc2hvd19tYXRjaF9idXNpZCwKIAkJICAgc3RvcmVfbWF0Y2hfYnVzaWQpOwogCitzdGF0aWMgc3NpemVfdCByZWJpbmRfc3RvcmUoc3RydWN0IGRldmljZV9kcml2ZXIgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQkJCSBzaXplX3QgY291bnQpCit7CisJaW50IHJldDsKKwlpbnQgbGVuOworCXN0cnVjdCBidXNfaWRfcHJpdiAqYmlkOworCisJLyogYnVmIGxlbmd0aCBzaG91bGQgYmUgbGVzcyB0aGF0IEJVU0lEX1NJWkUgKi8KKwlsZW4gPSBzdHJubGVuKGJ1ZiwgQlVTSURfU0laRSk7CisKKwlpZiAoIShsZW4gPCBCVVNJRF9TSVpFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliaWQgPSBnZXRfYnVzaWRfcHJpdihidWYpOworCWlmICghYmlkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IGRldmljZV9hdHRhY2goJmJpZC0+dWRldi0+ZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZiaWQtPnVkZXYtPmRldiwgInJlYmluZCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERSSVZFUl9BVFRSX1dPKHJlYmluZCk7CisKIHN0YXRpYyBzdHJ1Y3Qgc3R1Yl9wcml2ICpzdHViX3ByaXZfcG9wX2Zyb21fbGlzdGhlYWQoc3RydWN0IGxpc3RfaGVhZCAqbGlzdGhlYWQpCiB7CiAJc3RydWN0IHN0dWJfcHJpdiAqcHJpdiwgKnRtcDsKQEAgLTI1NCw3ICsyODMsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlyZXQgPSB1c2JfcmVnaXN0ZXIoJnN0dWJfZHJpdmVyKTsKKwlyZXQgPSB1c2JfcmVnaXN0ZXJfZGV2aWNlX2RyaXZlcigmc3R1Yl9kcml2ZXIsIFRISVNfTU9EVUxFKTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigidXNiX3JlZ2lzdGVyIGZhaWxlZCAlZFxuIiwgcmV0KTsKIAkJZ290byBlcnJfdXNiX3JlZ2lzdGVyOwpAQCAtMjY3LDExICsyOTYsMTggQEAKIAkJZ290byBlcnJfY3JlYXRlX2ZpbGU7CiAJfQogCisJcmV0ID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZzdHViX2RyaXZlci5kcnZ3cmFwLmRyaXZlciwKKwkJCQkgJmRyaXZlcl9hdHRyX3JlYmluZCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoImRyaXZlcl9jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9jcmVhdGVfZmlsZTsKKwl9CisKIAlwcl9pbmZvKERSSVZFUl9ERVNDICIgdiIgVVNCSVBfVkVSU0lPTiAiXG4iKTsKIAlyZXR1cm4gcmV0OwogCiBlcnJfY3JlYXRlX2ZpbGU6Ci0JdXNiX2RlcmVnaXN0ZXIoJnN0dWJfZHJpdmVyKTsKKwl1c2JfZGVyZWdpc3Rlcl9kZXZpY2VfZHJpdmVyKCZzdHViX2RyaXZlcik7CiBlcnJfdXNiX3JlZ2lzdGVyOgogCWttZW1fY2FjaGVfZGVzdHJveShzdHViX3ByaXZfY2FjaGUpOwogCXJldHVybiByZXQ7CkBAIC0yODIsMTEgKzMxOCwxNCBAQAogCWRyaXZlcl9yZW1vdmVfZmlsZSgmc3R1Yl9kcml2ZXIuZHJ2d3JhcC5kcml2ZXIsCiAJCQkgICAmZHJpdmVyX2F0dHJfbWF0Y2hfYnVzaWQpOwogCisJZHJpdmVyX3JlbW92ZV9maWxlKCZzdHViX2RyaXZlci5kcnZ3cmFwLmRyaXZlciwKKwkJCSAgICZkcml2ZXJfYXR0cl9yZWJpbmQpOworCiAJLyoKIAkgKiBkZXJlZ2lzdGVyKCkgY2FsbHMgc3R1Yl9kaXNjb25uZWN0KCkgZm9yIGFsbCBkZXZpY2VzLiBEZXZpY2UKIAkgKiBzcGVjaWZpYyBkYXRhIGlzIGNsZWFyZWQgaW4gc3R1Yl9kaXNjb25uZWN0KCkuCiAJICovCi0JdXNiX2RlcmVnaXN0ZXIoJnN0dWJfZHJpdmVyKTsKKwl1c2JfZGVyZWdpc3Rlcl9kZXZpY2VfZHJpdmVyKCZzdHViX2RyaXZlcik7CiAKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koc3R1Yl9wcml2X2NhY2hlKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3J4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9yeC5jCmluZGV4IDVkMWQ0YTEuLmUwYjZkNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3J4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfcnguYwpAQCAtMTQyLDMxICsxNDIsMTkgQEAKIAogc3RhdGljIGludCB0d2Vha19zZXRfY29uZmlndXJhdGlvbl9jbWQoc3RydWN0IHVyYiAqdXJiKQogeworCXN0cnVjdCBzdHViX3ByaXYgKnByaXYgPSAoc3RydWN0IHN0dWJfcHJpdiAqKSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHN0dWJfZGV2aWNlICpzZGV2ID0gcHJpdi0+c2RldjsKIAlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpyZXE7CiAJX191MTYgY29uZmlnOworCWludCBlcnI7CiAKIAlyZXEgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKSB1cmItPnNldHVwX3BhY2tldDsKIAljb25maWcgPSBsZTE2X3RvX2NwdShyZXEtPndWYWx1ZSk7CiAKLQkvKgotCSAqIEkgaGF2ZSBuZXZlciBzZWVuIGEgbXVsdGktY29uZmlnIGRldmljZS4gVmVyeSByYXJlLgotCSAqIEZvciBtb3N0IGRldmljZXMsIHRoaXMgd2lsbCBiZSBjYWxsZWQgdG8gY2hvb3NlIGEgZGVmYXVsdAotCSAqIGNvbmZpZ3VyYXRpb24gb25seSBvbmNlIGluIGFuIGluaXRpYWxpemF0aW9uIHBoYXNlLgotCSAqCi0JICogc2V0X2NvbmZpZ3VyYXRpb24gbWF5IGNoYW5nZSBhIGRldmljZSBjb25maWd1cmF0aW9uIGFuZCBpdHMgZGV2aWNlCi0JICogZHJpdmVycyB3aWxsIGJlIHVuYm91bmQgYW5kIGFzc2lnbmVkIGZvciBhIG5ldyBkZXZpY2UgY29uZmlndXJhdGlvbi4KLQkgKiBUaGlzIG1lYW5zIHRoaXMgdXNiaXAgZHJpdmVyIHdpbGwgYmUgYWxzbyB1bmJvdW5kIHdoZW4gY2FsbGVkLCB0aGVuCi0JICogZXZlbnR1YWxseSByZWFzc2lnbmVkIHRvIHRoZSBkZXZpY2UgYXMgZmFyIGFzIGRyaXZlciBtYXRjaGluZwotCSAqIGNvbmRpdGlvbiBpcyBrZXB0LgotCSAqCi0JICogVW5mb3J0dW5hdGVseSwgYW4gZXhpc3RpbmcgdXNiaXAgY29ubmVjdGlvbiB3aWxsIGJlIGRyb3BwZWQKLQkgKiBkdWUgdG8gdGhpcyBkcml2ZXIgdW5iaW5kaW5nLiBTbywgc2tpcCBoZXJlLgotCSAqIEEgdXNlciBtYXkgbmVlZCB0byBzZXQgYSBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gdmFsdWUgYmVmb3JlCi0JICogZXhwb3J0aW5nIHRoZSBkZXZpY2UuCi0JICovCi0JZGV2X2luZm8oJnVyYi0+ZGV2LT5kZXYsICJ1c2Jfc2V0X2NvbmZpZ3VyYXRpb24gJWQgdG8gJXMuLi4gc2tpcCFcbiIsCi0JCSBjb25maWcsIGRldl9uYW1lKCZ1cmItPmRldi0+ZGV2KSk7Ci0KKwllcnIgPSB1c2Jfc2V0X2NvbmZpZ3VyYXRpb24oc2Rldi0+dWRldiwgY29uZmlnKTsKKwlpZiAoZXJyICYmIGVyciAhPSAtRU5PREVWKQorCQlkZXZfZXJyKCZzZGV2LT51ZGV2LT5kZXYsICJjYW4ndCBzZXQgY29uZmlnICMlZCwgZXJyb3IgJWRcbiIsCisJCQljb25maWcsIGVycik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU1MCw3ICs1MzgsNyBAQAogCWludCByZXQ7CiAJc3RydWN0IHVzYmlwX2hlYWRlciBwZHU7CiAJc3RydWN0IHN0dWJfZGV2aWNlICpzZGV2ID0gY29udGFpbmVyX29mKHVkLCBzdHJ1Y3Qgc3R1Yl9kZXZpY2UsIHVkKTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc2Rldi0+aW50ZXJmYWNlLT5kZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnNkZXYtPnVkZXYtPmRldjsKIAogCXVzYmlwX2RiZ19zdHViX3J4KCJFbnRlclxuIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3R4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl90eC5jCmluZGV4IGNkNTMyNmEuLjE2MjI1NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3R4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfdHguYwpAQCAtNzQsMTIgKzc0LDEyIEBACiAJCS8qIE9LICovCiAJCWJyZWFrOwogCWNhc2UgLUVOT0VOVDoKLQkJZGV2X2luZm8oJnVyYi0+ZGV2LT5kZXYsICJzdG9wcGVkIGJ5IGEgY2FsbCB0byB1c2Jfa2lsbF91cmIoKSAiCi0JCQkgImJlY2F1c2Ugb2YgY2xlYW5pbmcgdXAgYSB2aXJ0dWFsIGNvbm5lY3Rpb25cbiIpOworCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwKKwkJCSAic3RvcHBlZCBieSBhIGNhbGwgdG8gdXNiX2tpbGxfdXJiKCkgYmVjYXVzZSBvZiBjbGVhbmluZyB1cCBhIHZpcnR1YWwgY29ubmVjdGlvblxuIik7CiAJCXJldHVybjsKIAljYXNlIC1FQ09OTlJFU0VUOgotCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwgInVubGlua2VkIGJ5IGEgY2FsbCB0byAiCi0JCQkgInVzYl91bmxpbmtfdXJiKClcbiIpOworCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwKKwkJCSAidW5saW5rZWQgYnkgYSBjYWxsIHRvIHVzYl91bmxpbmtfdXJiKClcbiIpOwogCQlicmVhazsKIAljYXNlIC1FUElQRToKIAkJZGV2X2luZm8oJnVyYi0+ZGV2LT5kZXYsICJlbmRwb2ludCAlZCBpcyBzdGFsbGVkXG4iLApAQCAtODksOCArODksOSBAQAogCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwgImRldmljZSByZW1vdmVkP1xuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9pbmZvKCZ1cmItPmRldi0+ZGV2LCAidXJiIGNvbXBsZXRpb24gd2l0aCBub24temVybyBzdGF0dXMgIgotCQkJICIlZFxuIiwgdXJiLT5zdGF0dXMpOworCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwKKwkJCSAidXJiIGNvbXBsZXRpb24gd2l0aCBub24temVybyBzdGF0dXMgJWRcbiIsCisJCQkgdXJiLT5zdGF0dXMpOwogCQlicmVhazsKIAl9CiAKQEAgLTIyOCw4ICsyMjksNyBAQAogCiAJCQlpZiAodHhzaXplICE9IHNpemVvZihwZHVfaGVhZGVyKSArIHVyYi0+YWN0dWFsX2xlbmd0aCkgewogCQkJCWRldl9lcnIoJnNkZXYtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkiYWN0dWFsIGxlbmd0aCBvZiB1cmIgJWQgZG9lcyBub3QgIgotCQkJCQkibWF0Y2ggaXNvIHBhY2tldCBzaXplcyAlenVcbiIsCisJCQkJCSJhY3R1YWwgbGVuZ3RoIG9mIHVyYiAlZCBkb2VzIG5vdCBtYXRjaCBpc28gcGFja2V0IHNpemVzICV6dVxuIiwKIAkJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoLAogCQkJCQl0eHNpemUtc2l6ZW9mKHBkdV9oZWFkZXIpKTsKIAkJCQlrZnJlZShpb3YpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VhcGkvdXNiaXAuaCBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91YXBpL3VzYmlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1ZGIzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91YXBpL3VzYmlwLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqCXVzYmlwLmgKKyAqCisgKglVU0JJUCB1YXBpIGRlZmluZXMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMgZXRjLgorKi8KKworI2lmbmRlZiBfVUFQSV9MSU5VWF9VU0JJUF9ICisjZGVmaW5lIF9VQVBJX0xJTlVYX1VTQklQX0gKKworLyogdXNiaXAgZGV2aWNlIHN0YXR1cyAtIGV4cG9ydGVkIGluIHVzYmlwIGRldmljZSBzeXNmcyBzdGF0dXMgKi8KK2VudW0gdXNiaXBfZGV2aWNlX3N0YXR1cyB7CisJLyogc2RldiBpcyBhdmFpbGFibGUuICovCisJU0RFVl9TVF9BVkFJTEFCTEUgPSAweDAxLAorCS8qIHNkZXYgaXMgbm93IHVzZWQuICovCisJU0RFVl9TVF9VU0VELAorCS8qIHNkZXYgaXMgdW51c2FibGUgYmVjYXVzZSBvZiBhIGZhdGFsIGVycm9yLiAqLworCVNERVZfU1RfRVJST1IsCisKKwkvKiB2ZGV2IGRvZXMgbm90IGNvbm5lY3QgYSByZW1vdGUgZGV2aWNlLiAqLworCVZERVZfU1RfTlVMTCwKKwkvKiB2ZGV2IGlzIHVzZWQsIGJ1dCB0aGUgVVNCIGFkZHJlc3MgaXMgbm90IGFzc2lnbmVkIHlldCAqLworCVZERVZfU1RfTk9UQVNTSUdORUQsCisJVkRFVl9TVF9VU0VELAorCVZERVZfU1RfRVJST1IKK307CisjZW5kaWYgLyogX1VBUElfTElOVVhfVVNCSVBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzYmlwX2NvbW1vbi5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzYmlwX2NvbW1vbi5jCmluZGV4IDk2NTUyZTMuLjE4NGZhNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2JpcF9jb21tb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfY29tbW9uLmMKQEAgLTU1LDcgKzU1LDggQEAKIAkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJCQkgc2l6ZV90IGNvdW50KQogewotCXNzY2FuZihidWYsICIlbHgiLCAmdXNiaXBfZGVidWdfZmxhZyk7CisJaWYgKHNzY2FuZihidWYsICIlbHgiLCAmdXNiaXBfZGVidWdfZmxhZykgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIGNvdW50OwogfQogREVWSUNFX0FUVFJfUlcodXNiaXBfZGVidWcpOwpAQCAtOTksMjYgKzEwMCw4IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnVkZXYtPmRldjsKIAlpbnQgaTsKIAotCWRldl9kYmcoZGV2LCAiICAgICAgIGRldm51bSglZCkgZGV2cGF0aCglcykgIiwKLQkJdWRldi0+ZGV2bnVtLCB1ZGV2LT5kZXZwYXRoKTsKLQotCXN3aXRjaCAodWRldi0+c3BlZWQpIHsKLQljYXNlIFVTQl9TUEVFRF9ISUdIOgotCQlwcl9kZWJ1ZygiU1BEX0hJR0ggIik7Ci0JCWJyZWFrOwotCWNhc2UgVVNCX1NQRUVEX0ZVTEw6Ci0JCXByX2RlYnVnKCJTUERfRlVMTCAiKTsKLQkJYnJlYWs7Ci0JY2FzZSBVU0JfU1BFRURfTE9XOgotCQlwcl9kZWJ1ZygiU1BEX0xPVyAiKTsKLQkJYnJlYWs7Ci0JY2FzZSBVU0JfU1BFRURfVU5LTk9XTjoKLQkJcHJfZGVidWcoIlNQRF9VTktOT1dOICIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9kZWJ1ZygiU1BEX0VSUk9SICIpOwotCQlicmVhazsKLQl9CisJZGV2X2RiZyhkZXYsICIgICAgICAgZGV2bnVtKCVkKSBkZXZwYXRoKCVzKSB1c2Igc3BlZWQoJXMpIiwKKwkJdWRldi0+ZGV2bnVtLCB1ZGV2LT5kZXZwYXRoLCB1c2Jfc3BlZWRfc3RyaW5nKHVkZXYtPnNwZWVkKSk7CiAKIAlwcl9kZWJ1ZygidHQgJXAsIHR0cG9ydCAlZFxuIiwgdWRldi0+dHQsIHVkZXYtPnR0cG9ydCk7CiAKQEAgLTE5NSw4ICsxNzgsOCBAQAogCX0KIAogCXByX2RlYnVnKCIgICAgICAgIik7Ci0JcHJfZGVidWcoImJSZXF1ZXN0VHlwZSglMDJYKSBiUmVxdWVzdCglMDJYKSB3VmFsdWUoJTA0WCkgd0luZGV4KCUwNFgpICIKLQkJICJ3TGVuZ3RoKCUwNFgpICIsIGNtZC0+YlJlcXVlc3RUeXBlLCBjbWQtPmJSZXF1ZXN0LAorCXByX2RlYnVnKCJiUmVxdWVzdFR5cGUoJTAyWCkgYlJlcXVlc3QoJTAyWCkgd1ZhbHVlKCUwNFgpIHdJbmRleCglMDRYKSB3TGVuZ3RoKCUwNFgpICIsCisJCSBjbWQtPmJSZXF1ZXN0VHlwZSwgY21kLT5iUmVxdWVzdCwKIAkJIGNtZC0+d1ZhbHVlLCBjbWQtPndJbmRleCwgY21kLT53TGVuZ3RoKTsKIAlwcl9kZWJ1ZygiXG4gICAgICAgIik7CiAKQEAgLTMwNyw4ICsyOTAsNyBAQAogCiAJc3dpdGNoIChwZHUtPmJhc2UuY29tbWFuZCkgewogCWNhc2UgVVNCSVBfQ01EX1NVQk1JVDoKLQkJcHJfZGVidWcoIlVTQklQX0NNRF9TVUJNSVQ6ICIKLQkJCSAieF9mbGFncyAldSB4X2xlbiAldSBzZiAldSAjcCAlZCBpdiAlZFxuIiwKKwkJcHJfZGVidWcoIlVTQklQX0NNRF9TVUJNSVQ6IHhfZmxhZ3MgJXUgeF9sZW4gJXUgc2YgJXUgI3AgJWQgaXYgJWRcbiIsCiAJCQkgcGR1LT51LmNtZF9zdWJtaXQudHJhbnNmZXJfZmxhZ3MsCiAJCQkgcGR1LT51LmNtZF9zdWJtaXQudHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKIAkJCSBwZHUtPnUuY21kX3N1Ym1pdC5zdGFydF9mcmFtZSwKQEAgLTcwNSw4ICs2ODcsNyBAQAogCiAJaWYgKHRvdGFsX2xlbmd0aCAhPSB1cmItPmFjdHVhbF9sZW5ndGgpIHsKIAkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKLQkJCSJ0b3RhbCBsZW5ndGggb2YgaXNvIHBhY2tldHMgJWQgbm90IGVxdWFsIHRvIGFjdHVhbCAiCi0JCQkibGVuZ3RoIG9mIGJ1ZmZlciAlZFxuIiwKKwkJCSJ0b3RhbCBsZW5ndGggb2YgaXNvIHBhY2tldHMgJWQgbm90IGVxdWFsIHRvIGFjdHVhbCBsZW5ndGggb2YgYnVmZmVyICVkXG4iLAogCQkJdG90YWxfbGVuZ3RoLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCiAJCWlmICh1ZC0+c2lkZSA9PSBVU0JJUF9TVFVCKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzYmlwX2NvbW1vbi5oIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzYmlwX2NvbW1vbi5oCmluZGV4IDdlNmM1NDMuLjczMmZiNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2JpcF9jb21tb24uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfY29tbW9uLmgKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlICJ1YXBpL3VzYmlwLmgiCiAKICNkZWZpbmUgVVNCSVBfVkVSU0lPTiAiMS4wLjAiCiAKQEAgLTIzNSwyMiArMjM2LDYgQEAKIAlVU0JJUF9TVFVCLAogfTsKIAotZW51bSB1c2JpcF9zdGF0dXMgewotCS8qIHNkZXYgaXMgYXZhaWxhYmxlLiAqLwotCVNERVZfU1RfQVZBSUxBQkxFID0gMHgwMSwKLQkvKiBzZGV2IGlzIG5vdyB1c2VkLiAqLwotCVNERVZfU1RfVVNFRCwKLQkvKiBzZGV2IGlzIHVudXNhYmxlIGJlY2F1c2Ugb2YgYSBmYXRhbCBlcnJvci4gKi8KLQlTREVWX1NUX0VSUk9SLAotCi0JLyogdmRldiBkb2VzIG5vdCBjb25uZWN0IGEgcmVtb3RlIGRldmljZS4gKi8KLQlWREVWX1NUX05VTEwsCi0JLyogdmRldiBpcyB1c2VkLCBidXQgdGhlIFVTQiBhZGRyZXNzIGlzIG5vdCBhc3NpZ25lZCB5ZXQgKi8KLQlWREVWX1NUX05PVEFTU0lHTkVELAotCVZERVZfU1RfVVNFRCwKLQlWREVWX1NUX0VSUk9SCi19OwotCiAvKiBldmVudCBoYW5kbGVyICovCiAjZGVmaW5lIFVTQklQX0VIX1NIVVRET1dOCSgxIDw8IDApCiAjZGVmaW5lIFVTQklQX0VIX0JZRQkJKDEgPDwgMSkKQEAgLTI3MSw3ICsyNTYsNyBAQAogLyogYSBjb21tb24gc3RydWN0dXJlIGZvciBzdHViX2RldmljZSBhbmQgdmhjaV9kZXZpY2UgKi8KIHN0cnVjdCB1c2JpcF9kZXZpY2UgewogCWVudW0gdXNiaXBfc2lkZSBzaWRlOwotCWVudW0gdXNiaXBfc3RhdHVzIHN0YXR1czsKKwllbnVtIHVzYmlwX2RldmljZV9zdGF0dXMgc3RhdHVzOwogCiAJLyogbG9jayBmb3Igc3RhdHVzICovCiAJc3BpbmxvY2tfdCBsb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL1JFQURNRQppbmRleCAwMGExNjU4Li5mNTI4YmE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL1JFQURNRQorKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL1JFQURNRQpAQCAtOSw4ICs5LDggQEAKICAgICAtIFVTQi9JUCBkZXZpY2UgZHJpdmVycwogCUZvdW5kIGluIHRoZSBzdGFnaW5nIGRpcmVjdG9yeSBvZiB0aGUgTGludXgga2VybmVsLgogCi0gICAgLSBzeXNmc3V0aWxzID49IDIuMC4wCi0Jc3lzZnN1dGlscyBsaWJyYXJ5CisgICAgLSBsaWJ1ZGV2ID49IDIuMAorCWxpYnVkZXYgbGlicmFyeQogCiAgICAgLSBsaWJ3cmFwMC1kZXYKIAl0Y3Agd3JhcHBlciBsaWJyYXJ5CkBAIC0xOSw2ICsxOSwxMCBAQAogCiAgICAgLSBsaWJ0b29sLCBhdXRvbWFrZSA+PSAxLjksIGF1dG9jb25mID49IDIuNS4wLCBwa2ctY29uZmlnCiAKK1tPcHRpb25hbF0KKyAgICAtIGh3ZGF0YQorICAgICAgICBDb250YWlucyBVU0IgZGV2aWNlIGlkZW50aWZpY2F0aW9uIGRhdGEuCisKIAogW0luc3RhbGxdCiAgICAgMC4gR2VuZXJhdGUgY29uZmlndXJhdGlvbiBzY3JpcHRzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9jb25maWd1cmUuYWMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2NvbmZpZ3VyZS5hYwppbmRleCAwZWU1ZDkyLi42MDdkMDVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2NvbmZpZ3VyZS5hYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2NvbmZpZ3VyZS5hYwpAQCAtMSw3ICsxLDcgQEAKIGRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgogCiBBQ19QUkVSRVEoMi41OSkKLUFDX0lOSVQoW3VzYmlwLXV0aWxzXSwgWzEuMS4xXSwgW2xpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmddKQorQUNfSU5JVChbdXNiaXAtdXRpbHNdLCBbMi4wXSwgW2xpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmddKQogQUNfREVGSU5FKFtVU0JJUF9WRVJTSU9OXSwgWzB4MDAwMDAxMTFdLCBbYmluYXJ5LWNvZGVkIGRlY2ltYWwgdmVyc2lvbiBudW1iZXJdKQogCiBDVVJSRU5UPTAKQEAgLTQ0LDExICs0NCwxMSBAQAogQUNfQ0hFQ0tfRlVOQ1MoW21lbXNldCBta2RpciByZWdjb21wIHNvY2tldCBzdHJjaHIgc3RyZXJyb3Igc3Ryc3RyIGRubAogCQlzdHJ0b3VsXSkKIAotQUNfQ0hFQ0tfSEVBREVSKFtzeXNmcy9saWJzeXNmcy5oXSwKLQkJW0FDX0NIRUNLX0xJQihbc3lzZnNdLCBbc3lzZnNfb3Blbl9kaXJlY3RvcnlfbGlzdF0sCi0JCQkgICAgICBbTElCUz0iJExJQlMgLWxzeXNmcyJdLAotCQkJICAgICAgW0FDX01TR19FUlJPUihbTWlzc2luZyBzeXNmczIgbGlicmFyeSFdKV0pXSwKLQkJW0FDX01TR19FUlJPUihbTWlzc2luZyAvdXNyL2luY2x1ZGUvc3lzZnMvbGlic3lzZnMuaF0pXSkKK0FDX0NIRUNLX0hFQURFUihbbGlidWRldi5oXSwKKwkJW0FDX0NIRUNLX0xJQihbdWRldl0sIFt1ZGV2X25ld10sCisJCQkgICAgICBbTElCUz0iJExJQlMgLWx1ZGV2Il0sCisJCQkgICAgICBbQUNfTVNHX0VSUk9SKFtNaXNzaW5nIHVkZXYgbGlicmFyeSFdKV0pXSwKKwkJW0FDX01TR19FUlJPUihbTWlzc2luZyAvdXNyL2luY2x1ZGUvbGlidWRldi5oXSldKQogCiAjIENoZWNrcyBmb3IgbGlid3JhcCBsaWJyYXJ5LgogQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIHVzZSB0aGUgbGlid3JhcCAoVENQIHdyYXBwZXJzKSBsaWJyYXJ5XSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL01ha2VmaWxlLmFtIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvTWFrZWZpbGUuYW0KaW5kZXggNDkyMTE4OS4uN2M4ZjhhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvTWFrZWZpbGUuYW0KKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvTWFrZWZpbGUuYW0KQEAgLTQsNCArNCw1IEBACiAKIGxpYl9MVExJQlJBUklFUyA6PSBsaWJ1c2JpcC5sYQogbGlidXNiaXBfbGFfU09VUkNFUyA6PSBuYW1lcy5jIG5hbWVzLmggdXNiaXBfaG9zdF9kcml2ZXIuYyB1c2JpcF9ob3N0X2RyaXZlci5oIFwKLQkJICAgICAgIHVzYmlwX2NvbW1vbi5jIHVzYmlwX2NvbW1vbi5oIHZoY2lfZHJpdmVyLmMgdmhjaV9kcml2ZXIuaAorCQkgICAgICAgdXNiaXBfY29tbW9uLmMgdXNiaXBfY29tbW9uLmggdmhjaV9kcml2ZXIuYyB2aGNpX2RyaXZlci5oIFwKKwkJICAgICAgIHN5c2ZzX3V0aWxzLmMgc3lzZnNfdXRpbHMuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvbGlzdC5oIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMGM5MzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy9saXN0LmgKQEAgLTAsMCArMSwxMzYgQEAKKyNpZm5kZWYgX0xJU1RfSAorI2RlZmluZSBfTElTVF9ICisKKy8qIFN0cmlwcGVkIGRvd24gaW1wbGVtZW50YXRpb24gb2YgbGlua2VkIGxpc3QgdGFrZW4KKyAqIGZyb20gdGhlIExpbnV4IEtlcm5lbC4KKyAqLworCisvKgorICogU2ltcGxlIGRvdWJseSBsaW5rZWQgbGlzdCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBTb21lIG9mIHRoZSBpbnRlcm5hbCBmdW5jdGlvbnMgKCJfX3h4eCIpIGFyZSB1c2VmdWwgd2hlbgorICogbWFuaXB1bGF0aW5nIHdob2xlIGxpc3RzIHJhdGhlciB0aGFuIHNpbmdsZSBlbnRyaWVzLCBhcworICogc29tZXRpbWVzIHdlIGFscmVhZHkga25vdyB0aGUgbmV4dC9wcmV2IGVudHJpZXMgYW5kIHdlIGNhbgorICogZ2VuZXJhdGUgYmV0dGVyIGNvZGUgYnkgdXNpbmcgdGhlbSBkaXJlY3RseSByYXRoZXIgdGhhbgorICogdXNpbmcgdGhlIGdlbmVyaWMgc2luZ2xlLWVudHJ5IHJvdXRpbmVzLgorICovCisKK3N0cnVjdCBsaXN0X2hlYWQgeworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQsICpwcmV2OworfTsKKworI2RlZmluZSBMSVNUX0hFQURfSU5JVChuYW1lKSB7ICYobmFtZSksICYobmFtZSkgfQorCisjZGVmaW5lIExJU1RfSEVBRChuYW1lKSBcCisJc3RydWN0IGxpc3RfaGVhZCBuYW1lID0gTElTVF9IRUFEX0lOSVQobmFtZSkKKworc3RhdGljIGlubGluZSB2b2lkIElOSVRfTElTVF9IRUFEKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisJbGlzdC0+bmV4dCA9IGxpc3Q7CisJbGlzdC0+cHJldiA9IGxpc3Q7Cit9CisKKy8qCisgKiBJbnNlcnQgYSBuZXcgZW50cnkgYmV0d2VlbiB0d28ga25vd24gY29uc2VjdXRpdmUgZW50cmllcy4KKyAqCisgKiBUaGlzIGlzIG9ubHkgZm9yIGludGVybmFsIGxpc3QgbWFuaXB1bGF0aW9uIHdoZXJlIHdlIGtub3cKKyAqIHRoZSBwcmV2L25leHQgZW50cmllcyBhbHJlYWR5IQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19saXN0X2FkZChzdHJ1Y3QgbGlzdF9oZWFkICpuZXcsCisJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpwcmV2LAorCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbmV4dCkKK3sKKwluZXh0LT5wcmV2ID0gbmV3OworCW5ldy0+bmV4dCA9IG5leHQ7CisJbmV3LT5wcmV2ID0gcHJldjsKKwlwcmV2LT5uZXh0ID0gbmV3OworfQorCisvKioKKyAqIGxpc3RfYWRkIC0gYWRkIGEgbmV3IGVudHJ5CisgKiBAbmV3OiBuZXcgZW50cnkgdG8gYmUgYWRkZWQKKyAqIEBoZWFkOiBsaXN0IGhlYWQgdG8gYWRkIGl0IGFmdGVyCisgKgorICogSW5zZXJ0IGEgbmV3IGVudHJ5IGFmdGVyIHRoZSBzcGVjaWZpZWQgaGVhZC4KKyAqIFRoaXMgaXMgZ29vZCBmb3IgaW1wbGVtZW50aW5nIHN0YWNrcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfYWRkKHN0cnVjdCBsaXN0X2hlYWQgKm5ldywgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlfX2xpc3RfYWRkKG5ldywgaGVhZCwgaGVhZC0+bmV4dCk7Cit9CisKKy8qCisgKiBEZWxldGUgYSBsaXN0IGVudHJ5IGJ5IG1ha2luZyB0aGUgcHJldi9uZXh0IGVudHJpZXMKKyAqIHBvaW50IHRvIGVhY2ggb3RoZXIuCisgKgorICogVGhpcyBpcyBvbmx5IGZvciBpbnRlcm5hbCBsaXN0IG1hbmlwdWxhdGlvbiB3aGVyZSB3ZSBrbm93CisgKiB0aGUgcHJldi9uZXh0IGVudHJpZXMgYWxyZWFkeSEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fbGlzdF9kZWwoc3RydWN0IGxpc3RfaGVhZCAqIHByZXYsIHN0cnVjdCBsaXN0X2hlYWQgKiBuZXh0KQoreworCW5leHQtPnByZXYgPSBwcmV2OworCXByZXYtPm5leHQgPSBuZXh0OworfQorCisjZGVmaW5lIFBPSVNPTl9QT0lOVEVSX0RFTFRBIDAKKyNkZWZpbmUgTElTVF9QT0lTT04xICAoKHZvaWQgKikgMHgwMDEwMDEwMCArIFBPSVNPTl9QT0lOVEVSX0RFTFRBKQorI2RlZmluZSBMSVNUX1BPSVNPTjIgICgodm9pZCAqKSAweDAwMjAwMjAwICsgUE9JU09OX1BPSU5URVJfREVMVEEpCisKKy8qKgorICogbGlzdF9kZWwgLSBkZWxldGVzIGVudHJ5IGZyb20gbGlzdC4KKyAqIEBlbnRyeTogdGhlIGVsZW1lbnQgdG8gZGVsZXRlIGZyb20gdGhlIGxpc3QuCisgKiBOb3RlOiBsaXN0X2VtcHR5KCkgb24gZW50cnkgZG9lcyBub3QgcmV0dXJuIHRydWUgYWZ0ZXIgdGhpcywgdGhlIGVudHJ5IGlzCisgKiBpbiBhbiB1bmRlZmluZWQgc3RhdGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2xpc3RfZGVsX2VudHJ5KHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5KQoreworCV9fbGlzdF9kZWwoZW50cnktPnByZXYsIGVudHJ5LT5uZXh0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfZGVsKHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5KQoreworCV9fbGlzdF9kZWwoZW50cnktPnByZXYsIGVudHJ5LT5uZXh0KTsKKwllbnRyeS0+bmV4dCA9IExJU1RfUE9JU09OMTsKKwllbnRyeS0+cHJldiA9IExJU1RfUE9JU09OMjsKK30KKworLyoqCisgKiBsaXN0X2VudHJ5IC0gZ2V0IHRoZSBzdHJ1Y3QgZm9yIHRoaXMgZW50cnkKKyAqIEBwdHI6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCBwb2ludGVyLgorICogQHR5cGU6CXRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3QgdGhpcyBpcyBlbWJlZGRlZCBpbi4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqLworI2RlZmluZSBsaXN0X2VudHJ5KHB0ciwgdHlwZSwgbWVtYmVyKSBcCisJY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKQorLyoqCisgKiBsaXN0X2Zvcl9lYWNoCS0JaXRlcmF0ZSBvdmVyIGEgbGlzdAorICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaChwb3MsIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+bmV4dDsgcG9zICE9IChoZWFkKTsgcG9zID0gcG9zLT5uZXh0KQorCisvKioKKyAqIGxpc3RfZm9yX2VhY2hfc2FmZSAtIGl0ZXJhdGUgb3ZlciBhIGxpc3Qgc2FmZSBhZ2FpbnN0IHJlbW92YWwgb2YgbGlzdCBlbnRyeQorICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQG46CQlhbm90aGVyICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbiwgaGVhZCkgXAorCWZvciAocG9zID0gKGhlYWQpLT5uZXh0LCBuID0gcG9zLT5uZXh0OyBwb3MgIT0gKGhlYWQpOyBcCisJCXBvcyA9IG4sIG4gPSBwb3MtPm5leHQpCisKKyNkZWZpbmUgb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKSAoKHNpemVfdCkgJigoVFlQRSAqKTApLT5NRU1CRVIpCisKKy8qKgorICogY29udGFpbmVyX29mIC0gY2FzdCBhIG1lbWJlciBvZiBhIHN0cnVjdHVyZSBvdXQgdG8gdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlCisgKiBAcHRyOgl0aGUgcG9pbnRlciB0byB0aGUgbWVtYmVyLgorICogQHR5cGU6CXRoZSB0eXBlIG9mIHRoZSBjb250YWluZXIgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbWVtYmVyIHdpdGhpbiB0aGUgc3RydWN0LgorICoKKyAqLworI2RlZmluZSBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpICh7CQkJXAorCWNvbnN0IHR5cGVvZiggKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAocHRyKTsJXAorCSh0eXBlICopKCAoY2hhciAqKV9fbXB0ciAtIG9mZnNldG9mKHR5cGUsbWVtYmVyKSApO30pCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvc3lzZnNfdXRpbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3N5c2ZzX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhYzg4ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3N5c2ZzX3V0aWxzLmMKQEAgLTAsMCArMSwzMSBAQAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAic3lzZnNfdXRpbHMuaCIKKyNpbmNsdWRlICJ1c2JpcF9jb21tb24uaCIKKworaW50IHdyaXRlX3N5c2ZzX2F0dHJpYnV0ZShjb25zdCBjaGFyICphdHRyX3BhdGgsIGNvbnN0IGNoYXIgKm5ld192YWx1ZSwKKwkJCSAgc2l6ZV90IGxlbikKK3sKKwlpbnQgZmQ7CisJaW50IGxlbmd0aDsKKworCWZkID0gb3BlbihhdHRyX3BhdGgsIE9fV1JPTkxZKTsKKwlpZiAoZmQgPCAwKSB7CisJCWRiZygiZXJyb3Igb3BlbmluZyBhdHRyaWJ1dGUgJXMiLCBhdHRyX3BhdGgpOworCQlyZXR1cm4gLTE7CisJfQorCisJbGVuZ3RoID0gd3JpdGUoZmQsIG5ld192YWx1ZSwgbGVuKTsKKwlpZiAobGVuZ3RoIDwgMCkgeworCQlkYmcoImVycm9yIHdyaXRpbmcgdG8gYXR0cmlidXRlICVzIiwgYXR0cl9wYXRoKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gLTE7CisJfQorCisJY2xvc2UoZmQpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy9zeXNmc191dGlscy5oIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvc3lzZnNfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmFjMWQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvc3lzZnNfdXRpbHMuaApAQCAtMCwwICsxLDggQEAKKworI2lmbmRlZiBfX1NZU0ZTX1VUSUxTX0gKKyNkZWZpbmUgX19TWVNGU19VVElMU19ICisKK2ludCB3cml0ZV9zeXNmc19hdHRyaWJ1dGUoY29uc3QgY2hhciAqYXR0cl9wYXRoLCBjb25zdCBjaGFyICpuZXdfdmFsdWUsCisJCQkgIHNpemVfdCBsZW4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3VzYmlwX2NvbW1vbi5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfY29tbW9uLmMKaW5kZXggNjZmMDNjYy4uMjM4YmY1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfY29tbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfY29tbW9uLmMKQEAgLTIsNiArMiw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBUYWthaGlybyBIaXJvZnVjaGkKICAqLwogCisjaW5jbHVkZSA8bGlidWRldi5oPgogI2luY2x1ZGUgInVzYmlwX2NvbW1vbi5oIgogI2luY2x1ZGUgIm5hbWVzLmgiCiAKQEAgLTEyLDYgKzEzLDggQEAKIGludCB1c2JpcF91c2Vfc3RkZXJyOwogaW50IHVzYmlwX3VzZV9kZWJ1ZzsKIAorZXh0ZXJuIHN0cnVjdCB1ZGV2ICp1ZGV2X2NvbnRleHQ7CisKIHN0cnVjdCBzcGVlZF9zdHJpbmcgewogCWludCBudW07CiAJY2hhciAqc3BlZWQ7CkBAIC0yMyw2ICsyNiw4IEBACiAJeyBVU0JfU1BFRURfTE9XLCAgIjEuNSIsICJMb3cgU3BlZWQoMS41TWJwcykiICB9LAogCXsgVVNCX1NQRUVEX0ZVTEwsICIxMiIsICAiRnVsbCBTcGVlZCgxMk1icHMpIiB9LAogCXsgVVNCX1NQRUVEX0hJR0gsICI0ODAiLCAiSGlnaCBTcGVlZCg0ODBNYnBzKSIgfSwKKwl7IFVTQl9TUEVFRF9XSVJFTEVTUywgIjUzLjMtNDgwIiwgIldpcmVsZXNzIn0sCisJeyBVU0JfU1BFRURfU1VQRVIsICI1MDAwIiwgIlN1cGVyIFNwZWVkKDUwMDBNYnBzKSIgfSwKIAl7IDAsIE5VTEwsIE5VTEwgfQogfTsKIApAQCAtMTA5LDc1ICsxMTQsNjEgQEAKIH0KIAogCi1pbnQgcmVhZF9hdHRyX3ZhbHVlKHN0cnVjdCBzeXNmc19kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSwKK2ludCByZWFkX2F0dHJfdmFsdWUoc3RydWN0IHVkZXZfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCSAgICBjb25zdCBjaGFyICpmb3JtYXQpCiB7Ci0JY2hhciBhdHRycGF0aFtTWVNGU19QQVRIX01BWF07Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYXR0cjsKKwljb25zdCBjaGFyICphdHRyOwogCWludCBudW0gPSAwOwogCWludCByZXQ7CiAKLQlzbnByaW50ZihhdHRycGF0aCwgc2l6ZW9mKGF0dHJwYXRoKSwgIiVzLyVzIiwgZGV2LT5wYXRoLCBuYW1lKTsKLQotCWF0dHIgPSBzeXNmc19vcGVuX2F0dHJpYnV0ZShhdHRycGF0aCk7CisJYXR0ciA9IHVkZXZfZGV2aWNlX2dldF9zeXNhdHRyX3ZhbHVlKGRldiwgbmFtZSk7CiAJaWYgKCFhdHRyKSB7Ci0JCWRiZygic3lzZnNfb3Blbl9hdHRyaWJ1dGUgZmFpbGVkOiAlcyIsIGF0dHJwYXRoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0ID0gc3lzZnNfcmVhZF9hdHRyaWJ1dGUoYXR0cik7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGJnKCJzeXNmc19yZWFkX2F0dHJpYnV0ZSBmYWlsZWQiKTsKKwkJZXJyKCJ1ZGV2X2RldmljZV9nZXRfc3lzYXR0cl92YWx1ZSBmYWlsZWQiKTsKIAkJZ290byBlcnI7CiAJfQogCi0JcmV0ID0gc3NjYW5mKGF0dHItPnZhbHVlLCBmb3JtYXQsICZudW0pOworCS8qIFRoZSBjbGllbnQgY2hvb3NlcyB0aGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKwkgKiB3aGVuIGF0dGFjaGluZyBpdCBzbyByaWdodCBhZnRlciBiZWluZyBib3VuZAorCSAqIHRvIHVzYmlwLWhvc3Qgb24gdGhlIHNlcnZlciB0aGUgZGV2aWNlIHdpbGwKKwkgKiBoYXZlIG5vIGNvbmZpZ3VyYXRpb24uCisJICogVGhlcmVmb3JlLCBhdHRyaWJ1dGVzIHN1Y2ggYXMgYkNvbmZpZ3VyYXRpb25WYWx1ZQorCSAqIGFuZCBiTnVtSW50ZXJmYWNlcyB3aWxsIG5vdCBleGlzdCBhbmQgc3NjYW5mIHdpbGwKKwkgKiBmYWlsLiBDaGVjayBmb3IgdGhlc2UgY2FzZXMgYW5kIGRvbid0IHRyZWF0IHRoZW0KKwkgKiBhcyBlcnJvcnMuCisJICovCisKKwlyZXQgPSBzc2NhbmYoYXR0ciwgZm9ybWF0LCAmbnVtKTsKIAlpZiAocmV0IDwgMSkgewotCQlkYmcoInNzY2FuZiBmYWlsZWQiKTsKLQkJZ290byBlcnI7CisJCWlmIChzdHJjbXAobmFtZSwgImJDb25maWd1cmF0aW9uVmFsdWUiKSAmJgorCQkJCXN0cmNtcChuYW1lLCAiYk51bUludGVyZmFjZXMiKSkgeworCQkJZXJyKCJzc2NhbmYgZmFpbGVkIGZvciBhdHRyaWJ1dGUgJXMiLCBuYW1lKTsKKwkJCWdvdG8gZXJyOworCQl9CiAJfQogCiBlcnI6Ci0Jc3lzZnNfY2xvc2VfYXR0cmlidXRlKGF0dHIpOwogCiAJcmV0dXJuIG51bTsKIH0KIAogCi1pbnQgcmVhZF9hdHRyX3NwZWVkKHN0cnVjdCBzeXNmc19kZXZpY2UgKmRldikKK2ludCByZWFkX2F0dHJfc3BlZWQoc3RydWN0IHVkZXZfZGV2aWNlICpkZXYpCiB7Ci0JY2hhciBhdHRycGF0aFtTWVNGU19QQVRIX01BWF07Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYXR0cjsKLQljaGFyIHNwZWVkWzEwMF07Ci0JaW50IHJldDsKKwljb25zdCBjaGFyICpzcGVlZDsKIAotCXNucHJpbnRmKGF0dHJwYXRoLCBzaXplb2YoYXR0cnBhdGgpLCAiJXMvJXMiLCBkZXYtPnBhdGgsICJzcGVlZCIpOwotCi0JYXR0ciA9IHN5c2ZzX29wZW5fYXR0cmlidXRlKGF0dHJwYXRoKTsKLQlpZiAoIWF0dHIpIHsKLQkJZGJnKCJzeXNmc19vcGVuX2F0dHJpYnV0ZSBmYWlsZWQ6ICVzIiwgYXR0cnBhdGgpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXQgPSBzeXNmc19yZWFkX2F0dHJpYnV0ZShhdHRyKTsKLQlpZiAocmV0IDwgMCkgewotCQlkYmcoInN5c2ZzX3JlYWRfYXR0cmlidXRlIGZhaWxlZCIpOworCXNwZWVkID0gdWRldl9kZXZpY2VfZ2V0X3N5c2F0dHJfdmFsdWUoZGV2LCAic3BlZWQiKTsKKwlpZiAoIXNwZWVkKSB7CisJCWVycigidWRldl9kZXZpY2VfZ2V0X3N5c2F0dHJfdmFsdWUgZmFpbGVkIik7CiAJCWdvdG8gZXJyOwogCX0KIAotCXJldCA9IHNzY2FuZihhdHRyLT52YWx1ZSwgIiU5OXNcbiIsIHNwZWVkKTsKLQlpZiAocmV0IDwgMSkgewotCQlkYmcoInNzY2FuZiBmYWlsZWQiKTsKLQkJZ290byBlcnI7Ci0JfQotZXJyOgotCXN5c2ZzX2Nsb3NlX2F0dHJpYnV0ZShhdHRyKTsKLQogCWZvciAoaW50IGkgPSAwOyBzcGVlZF9zdHJpbmdzW2ldLnNwZWVkICE9IE5VTEw7IGkrKykgewogCQlpZiAoIXN0cmNtcChzcGVlZCwgc3BlZWRfc3RyaW5nc1tpXS5zcGVlZCkpCiAJCQlyZXR1cm4gc3BlZWRfc3RyaW5nc1tpXS5udW07CiAJfQogCitlcnI6CisKIAlyZXR1cm4gVVNCX1NQRUVEX1VOS05PV047CiB9CiAKQEAgLTE4OCw5ICsxNzksMTAgQEAKIAl9IHdoaWxlICgwKQogCiAKLWludCByZWFkX3VzYl9kZXZpY2Uoc3RydWN0IHN5c2ZzX2RldmljZSAqc2Rldiwgc3RydWN0IHVzYmlwX3VzYl9kZXZpY2UgKnVkZXYpCitpbnQgcmVhZF91c2JfZGV2aWNlKHN0cnVjdCB1ZGV2X2RldmljZSAqc2Rldiwgc3RydWN0IHVzYmlwX3VzYl9kZXZpY2UgKnVkZXYpCiB7CiAJdWludDMyX3QgYnVzbnVtLCBkZXZudW07CisJY29uc3QgY2hhciAqcGF0aCwgKm5hbWU7CiAKIAlSRUFEX0FUVFIodWRldiwgdWludDhfdCwgIHNkZXYsIGJEZXZpY2VDbGFzcywJCSIlMDJ4XG4iKTsKIAlSRUFEX0FUVFIodWRldiwgdWludDhfdCwgIHNkZXYsIGJEZXZpY2VTdWJDbGFzcywJIiUwMnhcbiIpOwpAQCAtMjA3LDEwICsxOTksMTMgQEAKIAlSRUFEX0FUVFIodWRldiwgdWludDhfdCwgIHNkZXYsIGRldm51bSwJCQkiJWRcbiIpOwogCXVkZXYtPnNwZWVkID0gcmVhZF9hdHRyX3NwZWVkKHNkZXYpOwogCi0Jc3RybmNweSh1ZGV2LT5wYXRoLCAgc2Rldi0+cGF0aCwgIFNZU0ZTX1BBVEhfTUFYKTsKLQlzdHJuY3B5KHVkZXYtPmJ1c2lkLCBzZGV2LT5uYW1lLCBTWVNGU19CVVNfSURfU0laRSk7CisJcGF0aCA9IHVkZXZfZGV2aWNlX2dldF9zeXNwYXRoKHNkZXYpOworCW5hbWUgPSB1ZGV2X2RldmljZV9nZXRfc3lzbmFtZShzZGV2KTsKIAotCXNzY2FuZihzZGV2LT5uYW1lLCAiJXUtJXUiLCAmYnVzbnVtLCAmZGV2bnVtKTsKKwlzdHJuY3B5KHVkZXYtPnBhdGgsICBwYXRoLCAgU1lTRlNfUEFUSF9NQVgpOworCXN0cm5jcHkodWRldi0+YnVzaWQsIG5hbWUsIFNZU0ZTX0JVU19JRF9TSVpFKTsKKworCXNzY2FuZihuYW1lLCAiJXUtJXUiLCAmYnVzbnVtLCAmZGV2bnVtKTsKIAl1ZGV2LT5idXNudW0gPSBidXNudW07CiAKIAlyZXR1cm4gMDsKQEAgLTIyMCwxMyArMjE1LDEzIEBACiAJCSAgICAgICBzdHJ1Y3QgdXNiaXBfdXNiX2ludGVyZmFjZSAqdWluZikKIHsKIAljaGFyIGJ1c2lkW1NZU0ZTX0JVU19JRF9TSVpFXTsKLQlzdHJ1Y3Qgc3lzZnNfZGV2aWNlICpzaWY7CisJc3RydWN0IHVkZXZfZGV2aWNlICpzaWY7CiAKIAlzcHJpbnRmKGJ1c2lkLCAiJXM6JWQuJWQiLCB1ZGV2LT5idXNpZCwgdWRldi0+YkNvbmZpZ3VyYXRpb25WYWx1ZSwgaSk7CiAKLQlzaWYgPSBzeXNmc19vcGVuX2RldmljZSgidXNiIiwgYnVzaWQpOworCXNpZiA9IHVkZXZfZGV2aWNlX25ld19mcm9tX3N1YnN5c3RlbV9zeXNuYW1lKHVkZXZfY29udGV4dCwgInVzYiIsIGJ1c2lkKTsKIAlpZiAoIXNpZikgewotCQlkYmcoInN5c2ZzX29wZW5fZGV2aWNlKFwidXNiXCIsIFwiJXNcIikgZmFpbGVkIiwgYnVzaWQpOworCQllcnIoInVkZXZfZGV2aWNlX25ld19mcm9tX3N1YnN5c3RlbV9zeXNuYW1lICVzIGZhaWxlZCIsIGJ1c2lkKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMjM0LDggKzIyOSw2IEBACiAJUkVBRF9BVFRSKHVpbmYsIHVpbnQ4X3QsICBzaWYsIGJJbnRlcmZhY2VTdWJDbGFzcywJIiUwMnhcbiIpOwogCVJFQURfQVRUUih1aW5mLCB1aW50OF90LCAgc2lmLCBiSW50ZXJmYWNlUHJvdG9jb2wsCSIlMDJ4XG4iKTsKIAotCXN5c2ZzX2Nsb3NlX2RldmljZShzaWYpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3VzYmlwX2NvbW1vbi5oIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfY29tbW9uLmgKaW5kZXggOTM4YWQxYy4uMjNiZTg0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfY29tbW9uLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfY29tbW9uLmgKQEAgLTUsNyArNSw3IEBACiAjaWZuZGVmIF9fVVNCSVBfQ09NTU9OX0gKICNkZWZpbmUgX19VU0JJUF9DT01NT05fSAogCi0jaW5jbHVkZSA8c3lzZnMvbGlic3lzZnMuaD4KKyNpbmNsdWRlIDxsaWJ1ZGV2Lmg+CiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtMTQsNiArMTQsOCBAQAogCiAjaW5jbHVkZSA8c3lzbG9nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorI2luY2x1ZGUgIi4uLy4uL3VhcGkvdXNiaXAuaCIKIAogI2lmbmRlZiBVU0JJRFNfRklMRQogI2RlZmluZSBVU0JJRFNfRklMRSAiL3Vzci9zaGFyZS9od2RhdGEvdXNiLmlkcyIKQEAgLTI4LDYgKzMwLDE1IEBACiAjZGVmaW5lIFVTQklQX0hPU1RfRFJWX05BTUUJInVzYmlwLWhvc3QiCiAjZGVmaW5lIFVTQklQX1ZIQ0lfRFJWX05BTUUJInZoY2lfaGNkIgogCisvKiBzeXNmcyBjb25zdGFudHMgKi8KKyNkZWZpbmUgU1lTRlNfTU5UX1BBVEggICAgICAgICAiL3N5cyIKKyNkZWZpbmUgU1lTRlNfQlVTX05BTUUgICAgICAgICAiYnVzIgorI2RlZmluZSBTWVNGU19CVVNfVFlQRSAgICAgICAgICJ1c2IiCisjZGVmaW5lIFNZU0ZTX0RSSVZFUlNfTkFNRSAgICAgImRyaXZlcnMiCisKKyNkZWZpbmUgU1lTRlNfUEFUSF9NQVgJCTI1NgorI2RlZmluZSBTWVNGU19CVVNfSURfU0laRQkzMgorCiBleHRlcm4gaW50IHVzYmlwX3VzZV9zeXNsb2c7CiBleHRlcm4gaW50IHVzYmlwX3VzZV9zdGRlcnI7CiBleHRlcm4gaW50IHVzYmlwX3VzZV9kZWJ1ZyA7CkBAIC03NiwzMCArODcsNiBAQAogCQlhYm9ydCgpOwkJCQlcCiAJfSB3aGlsZSAoMCkKIAotZW51bSB1c2JfZGV2aWNlX3NwZWVkIHsKLQlVU0JfU1BFRURfVU5LTk9XTiA9IDAsICAgICAgICAgICAgICAgICAgLyogZW51bWVyYXRpbmcgKi8KLQlVU0JfU1BFRURfTE9XLCBVU0JfU1BFRURfRlVMTCwgICAgICAgICAgLyogdXNiIDEuMSAqLwotCVVTQl9TUEVFRF9ISUdILCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2IgMi4wICovCi0JVVNCX1NQRUVEX1ZBUklBQkxFICAgICAgICAgICAgICAgICAgICAgIC8qIHdpcmVsZXNzICh1c2IgMi41KSAqLwotfTsKLQotLyogRklYTUU6IGhvdyB0byBzeW5jIHdpdGggZHJpdmVycy91c2JpcF9jb21tb24uaCA/ICovCi1lbnVtIHVzYmlwX2RldmljZV9zdGF0dXMgewotCS8qIHNkZXYgaXMgYXZhaWxhYmxlLiAqLwotCVNERVZfU1RfQVZBSUxBQkxFID0gMHgwMSwKLQkvKiBzZGV2IGlzIG5vdyB1c2VkLiAqLwotCVNERVZfU1RfVVNFRCwKLQkvKiBzZGV2IGlzIHVudXNhYmxlIGJlY2F1c2Ugb2YgYSBmYXRhbCBlcnJvci4gKi8KLQlTREVWX1NUX0VSUk9SLAotCi0JLyogdmRldiBkb2VzIG5vdCBjb25uZWN0IGEgcmVtb3RlIGRldmljZS4gKi8KLQlWREVWX1NUX05VTEwsCi0JLyogdmRldiBpcyB1c2VkLCBidXQgdGhlIFVTQiBhZGRyZXNzIGlzIG5vdCBhc3NpZ25lZCB5ZXQgKi8KLQlWREVWX1NUX05PVEFTU0lHTkVELAotCVZERVZfU1RfVVNFRCwKLQlWREVWX1NUX0VSUk9SCi19OwotCiBzdHJ1Y3QgdXNiaXBfdXNiX2ludGVyZmFjZSB7CiAJdWludDhfdCBiSW50ZXJmYWNlQ2xhc3M7CiAJdWludDhfdCBiSW50ZXJmYWNlU3ViQ2xhc3M7CkBAIC0xMzEsOCArMTE4LDggQEAKIAogdm9pZCBkdW1wX3VzYl9pbnRlcmZhY2Uoc3RydWN0IHVzYmlwX3VzYl9pbnRlcmZhY2UgKik7CiB2b2lkIGR1bXBfdXNiX2RldmljZShzdHJ1Y3QgdXNiaXBfdXNiX2RldmljZSAqKTsKLWludCByZWFkX3VzYl9kZXZpY2Uoc3RydWN0IHN5c2ZzX2RldmljZSAqc2Rldiwgc3RydWN0IHVzYmlwX3VzYl9kZXZpY2UgKnVkZXYpOwotaW50IHJlYWRfYXR0cl92YWx1ZShzdHJ1Y3Qgc3lzZnNfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCitpbnQgcmVhZF91c2JfZGV2aWNlKHN0cnVjdCB1ZGV2X2RldmljZSAqc2Rldiwgc3RydWN0IHVzYmlwX3VzYl9kZXZpY2UgKnVkZXYpOworaW50IHJlYWRfYXR0cl92YWx1ZShzdHJ1Y3QgdWRldl9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSwKIAkJICAgIGNvbnN0IGNoYXIgKmZvcm1hdCk7CiBpbnQgcmVhZF91c2JfaW50ZXJmYWNlKHN0cnVjdCB1c2JpcF91c2JfZGV2aWNlICp1ZGV2LCBpbnQgaSwKIAkJICAgICAgIHN0cnVjdCB1c2JpcF91c2JfaW50ZXJmYWNlICp1aW5mKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3VzYmlwX2hvc3RfZHJpdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy91c2JpcF9ob3N0X2RyaXZlci5jCmluZGV4IDcxYTQ0OWMuLmM1YmY2MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3VzYmlwX2hvc3RfZHJpdmVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfaG9zdF9kcml2ZXIuYwpAQCAtMTgsMTAyICsxOCw2NSBAQAogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgogCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAorI2luY2x1ZGUgPGxpYnVkZXYuaD4KKwogI2luY2x1ZGUgInVzYmlwX2NvbW1vbi5oIgogI2luY2x1ZGUgInVzYmlwX2hvc3RfZHJpdmVyLmgiCisjaW5jbHVkZSAibGlzdC5oIgorI2luY2x1ZGUgInN5c2ZzX3V0aWxzLmgiCiAKICN1bmRlZiAgUFJPR05BTUUKICNkZWZpbmUgUFJPR05BTUUgImxpYnVzYmlwIgogCiBzdHJ1Y3QgdXNiaXBfaG9zdF9kcml2ZXIgKmhvc3RfZHJpdmVyOworc3RydWN0IHVkZXYgKnVkZXZfY29udGV4dDsKIAotI2RlZmluZSBTWVNGU19PUEVOX1JFVFJJRVMgMTAwCi0KLS8qIG9ubHkgdGhlIGZpcnN0IGludGVyZmFjZSB2YWx1ZSBpcyB0cnVlISAqLwogc3RhdGljIGludDMyX3QgcmVhZF9hdHRyX3VzYmlwX3N0YXR1cyhzdHJ1Y3QgdXNiaXBfdXNiX2RldmljZSAqdWRldikKIHsKLQljaGFyIGF0dHJwYXRoW1NZU0ZTX1BBVEhfTUFYXTsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICphdHRyOworCWNoYXIgc3RhdHVzX2F0dHJfcGF0aFtTWVNGU19QQVRIX01BWF07CisJaW50IGZkOworCWludCBsZW5ndGg7CisJY2hhciBzdGF0dXM7CiAJaW50IHZhbHVlID0gMDsKLQlpbnQgcmM7Ci0Jc3RydWN0IHN0YXQgczsKLQlpbnQgcmV0cmllcyA9IFNZU0ZTX09QRU5fUkVUUklFUzsKIAotCS8qIFRoaXMgYWNjZXNzIGlzIHJhY3khCi0JICoKLQkgKiBKdXN0IGFmdGVyIGRldGFjaCwgb3VyIGRyaXZlciByZW1vdmVzIHRoZSBzeXNmcwotCSAqIGZpbGVzIGFuZCByZWNyZWF0ZXMgdGhlbS4KLQkgKgotCSAqIFdlIG1heSB0cnkgYW5kIGZhaWwgdG8gb3BlbiB0aGUgdXNiaXBfc3RhdHVzIG9mCi0JICogYW4gZXhwb3J0ZWQgZGV2aWNlIGluIHRoZSAoc2hvcnQpIHdpbmRvdyB3aGVyZQotCSAqIGl0IGhhcyBiZWVuIHJlbW92ZWQgYW5kIG5vdCB5ZXQgcmVjcmVhdGVkLgotCSAqCi0JICogVGhpcyBpcyBhIGJ1ZyBpbiB0aGUgaW50ZXJmYWNlLiBOb3RoaW5nIHdlIGNhbiBkbwotCSAqIGV4Y2VwdCB3b3JrIGFyb3VuZCBpdCBoZXJlIGJ5IHBvbGxpbmcgZm9yIHRoZSBzeXNmcwotCSAqIHVzYmlwX3N0YXR1cyB0byByZWFwcGVhci4KLQkgKi8KKwlzbnByaW50ZihzdGF0dXNfYXR0cl9wYXRoLCBTWVNGU19QQVRIX01BWCwgIiVzL3VzYmlwX3N0YXR1cyIsCisJCSB1ZGV2LT5wYXRoKTsKIAotCXNucHJpbnRmKGF0dHJwYXRoLCBTWVNGU19QQVRIX01BWCwgIiVzLyVzOiVkLiVkL3VzYmlwX3N0YXR1cyIsCi0JCSB1ZGV2LT5wYXRoLCB1ZGV2LT5idXNpZCwgdWRldi0+YkNvbmZpZ3VyYXRpb25WYWx1ZSwgMCk7Ci0KLQl3aGlsZSAocmV0cmllcyA+IDApIHsKLQkJaWYgKHN0YXQoYXR0cnBhdGgsICZzKSA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKGVycm5vICE9IEVOT0VOVCkgewotCQkJZGJnKCJzdGF0IGZhaWxlZDogJXMiLCBhdHRycGF0aCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQl1c2xlZXAoMTAwMDApOyAvKiAxMG1zICovCi0JCXJldHJpZXMtLTsKLQl9Ci0KLQlpZiAocmV0cmllcyA9PSAwKQotCQlkYmcoInVzYmlwX3N0YXR1cyBub3QgcmVhZHkgYWZ0ZXIgJWQgcmV0cmllcyIsCi0JCSAgICBTWVNGU19PUEVOX1JFVFJJRVMpOwotCWVsc2UgaWYgKHJldHJpZXMgPCBTWVNGU19PUEVOX1JFVFJJRVMpCi0JCWRiZygid2FybmluZzogdXNiaXBfc3RhdHVzIHJlYWR5IGFmdGVyICVkIHJldHJpZXMiLAotCQkgICAgU1lTRlNfT1BFTl9SRVRSSUVTIC0gcmV0cmllcyk7Ci0KLQlhdHRyID0gc3lzZnNfb3Blbl9hdHRyaWJ1dGUoYXR0cnBhdGgpOwotCWlmICghYXR0cikgewotCQlkYmcoInN5c2ZzX29wZW5fYXR0cmlidXRlIGZhaWxlZDogJXMiLCBhdHRycGF0aCk7CisJaWYgKChmZCA9IG9wZW4oc3RhdHVzX2F0dHJfcGF0aCwgT19SRE9OTFkpKSA8IDApIHsKKwkJZXJyKCJlcnJvciBvcGVuaW5nIGF0dHJpYnV0ZSAlcyIsIHN0YXR1c19hdHRyX3BhdGgpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JcmMgPSBzeXNmc19yZWFkX2F0dHJpYnV0ZShhdHRyKTsKLQlpZiAocmMpIHsKLQkJZGJnKCJzeXNmc19yZWFkX2F0dHJpYnV0ZSBmYWlsZWQ6ICVzIiwgYXR0cnBhdGgpOwotCQlzeXNmc19jbG9zZV9hdHRyaWJ1dGUoYXR0cik7CisJbGVuZ3RoID0gcmVhZChmZCwgJnN0YXR1cywgMSk7CisJaWYgKGxlbmd0aCA8IDApIHsKKwkJZXJyKCJlcnJvciByZWFkaW5nIGF0dHJpYnV0ZSAlcyIsIHN0YXR1c19hdHRyX3BhdGgpOworCQljbG9zZShmZCk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQl2YWx1ZSA9IGF0b2koYXR0ci0+dmFsdWUpOwotCi0Jc3lzZnNfY2xvc2VfYXR0cmlidXRlKGF0dHIpOworCXZhbHVlID0gYXRvaSgmc3RhdHVzKTsKIAogCXJldHVybiB2YWx1ZTsKIH0KIAotc3RhdGljIHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UgKnVzYmlwX2V4cG9ydGVkX2RldmljZV9uZXcoY2hhciAqc2RldnBhdGgpCitzdGF0aWMKK3N0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UgKnVzYmlwX2V4cG9ydGVkX2RldmljZV9uZXcoY29uc3QgY2hhciAqc2RldnBhdGgpCiB7CiAJc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSAqZWRldiA9IE5VTEw7CisJc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSAqZWRldl9vbGQ7CiAJc2l6ZV90IHNpemU7CiAJaW50IGk7CiAKLQllZGV2ID0gY2FsbG9jKDEsIHNpemVvZigqZWRldikpOwotCWlmICghZWRldikgewotCQlkYmcoImNhbGxvYyBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorCWVkZXYgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UpKTsKIAotCWVkZXYtPnN1ZGV2ID0gc3lzZnNfb3Blbl9kZXZpY2VfcGF0aChzZGV2cGF0aCk7CisJZWRldi0+c3VkZXYgPSB1ZGV2X2RldmljZV9uZXdfZnJvbV9zeXNwYXRoKHVkZXZfY29udGV4dCwgc2RldnBhdGgpOwogCWlmICghZWRldi0+c3VkZXYpIHsKLQkJZGJnKCJzeXNmc19vcGVuX2RldmljZV9wYXRoIGZhaWxlZDogJXMiLCBzZGV2cGF0aCk7CisJCWVycigidWRldl9kZXZpY2VfbmV3X2Zyb21fc3lzcGF0aDogJXMiLCBzZGV2cGF0aCk7CiAJCWdvdG8gZXJyOwogCX0KIApAQCAtMTI0LDExICs4NywxMyBAQAogCQlnb3RvIGVycjsKIAogCS8qIHJlYWxsb2NhdGUgYnVmZmVyIHRvIGluY2x1ZGUgdXNiIGludGVyZmFjZSBkYXRhICovCi0Jc2l6ZSA9IHNpemVvZigqZWRldikgKyBlZGV2LT51ZGV2LmJOdW1JbnRlcmZhY2VzICoKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UpICsgZWRldi0+dWRldi5iTnVtSW50ZXJmYWNlcyAqCiAJCXNpemVvZihzdHJ1Y3QgdXNiaXBfdXNiX2ludGVyZmFjZSk7CiAKKwllZGV2X29sZCA9IGVkZXY7CiAJZWRldiA9IHJlYWxsb2MoZWRldiwgc2l6ZSk7CiAJaWYgKCFlZGV2KSB7CisJCWVkZXYgPSBlZGV2X29sZDsKIAkJZGJnKCJyZWFsbG9jIGZhaWxlZCIpOwogCQlnb3RvIGVycjsKIAl9CkBAIC0xMzgsMTYwICsxMDMsODggQEAKIAogCXJldHVybiBlZGV2OwogZXJyOgotCWlmIChlZGV2ICYmIGVkZXYtPnN1ZGV2KQotCQlzeXNmc19jbG9zZV9kZXZpY2UoZWRldi0+c3VkZXYpOworCWlmIChlZGV2LT5zdWRldikKKwkJdWRldl9kZXZpY2VfdW5yZWYoZWRldi0+c3VkZXYpOwogCWlmIChlZGV2KQogCQlmcmVlKGVkZXYpOwogCiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfbmV3KHN0cnVjdCBkbGlzdCAqZGxpc3QsIHN0cnVjdCBzeXNmc19kZXZpY2UgKnRhcmdldCkKLXsKLQlzdHJ1Y3Qgc3lzZnNfZGV2aWNlICpkZXY7Ci0KLQlkbGlzdF9mb3JfZWFjaF9kYXRhKGRsaXN0LCBkZXYsIHN0cnVjdCBzeXNmc19kZXZpY2UpIHsKLQkJaWYgKCFzdHJuY21wKGRldi0+YnVzX2lkLCB0YXJnZXQtPmJ1c19pZCwgU1lTRlNfQlVTX0lEX1NJWkUpKQotCQkJLyogZGV2aWNlIGZvdW5kIGFuZCBpcyBub3QgbmV3ICovCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlbGV0ZV9ub3RoaW5nKHZvaWQgKnVudXNlZF9kYXRhKQotewotCS8qCi0JICogTk9URTogRG8gbm90IGRlbGV0ZSBhbnl0aGluZywgYnV0IHRoZSBjb250YWluZXIgd2lsbCBiZSBkZWxldGVkLgotCSAqLwotCSh2b2lkKSB1bnVzZWRfZGF0YTsKLX0KLQogc3RhdGljIGludCByZWZyZXNoX2V4cG9ydGVkX2RldmljZXModm9pZCkKIHsKLQkvKiBzeXNmc19kZXZpY2Ugb2YgdXNiX2ludGVyZmFjZSAqLwotCXN0cnVjdCBzeXNmc19kZXZpY2UJKnN1aW50ZjsKLQlzdHJ1Y3QgZGxpc3QJCSpzdWludGZfbGlzdDsKLQkvKiBzeXNmc19kZXZpY2Ugb2YgdXNiX2RldmljZSAqLwotCXN0cnVjdCBzeXNmc19kZXZpY2UJKnN1ZGV2OwotCXN0cnVjdCBkbGlzdAkJKnN1ZGV2X2xpc3Q7CiAJc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSAqZWRldjsKKwlzdHJ1Y3QgdWRldl9lbnVtZXJhdGUgKmVudW1lcmF0ZTsKKwlzdHJ1Y3QgdWRldl9saXN0X2VudHJ5ICpkZXZpY2VzLCAqZGV2X2xpc3RfZW50cnk7CisJc3RydWN0IHVkZXZfZGV2aWNlICpkZXY7CisJY29uc3QgY2hhciAqcGF0aDsKIAotCXN1ZGV2X2xpc3QgPSBkbGlzdF9uZXdfd2l0aF9kZWxldGUoc2l6ZW9mKHN0cnVjdCBzeXNmc19kZXZpY2UpLAotCQkJCQkgICBkZWxldGVfbm90aGluZyk7CisJZW51bWVyYXRlID0gdWRldl9lbnVtZXJhdGVfbmV3KHVkZXZfY29udGV4dCk7CisJdWRldl9lbnVtZXJhdGVfYWRkX21hdGNoX3N1YnN5c3RlbShlbnVtZXJhdGUsICJ1c2IiKTsKKwl1ZGV2X2VudW1lcmF0ZV9zY2FuX2RldmljZXMoZW51bWVyYXRlKTsKIAotCXN1aW50Zl9saXN0ID0gc3lzZnNfZ2V0X2RyaXZlcl9kZXZpY2VzKGhvc3RfZHJpdmVyLT5zeXNmc19kcml2ZXIpOwotCWlmICghc3VpbnRmX2xpc3QpIHsKLQkJLyoKLQkJICogTm90IGFuIGVycm9yIGNvbmRpdGlvbi4gVGhlcmUgYXJlIHNpbXBseSBubyBkZXZpY2VzIGJvdW5kIHRvCi0JCSAqIHRoZSBkcml2ZXIgeWV0LgotCQkgKi8KLQkJZGJnKCJiaW5kICIgVVNCSVBfSE9TVF9EUlZfTkFNRSAiLmtvIHRvIGEgdXNiIGRldmljZSB0byBiZSAiCi0JCSAgICAiZXhwb3J0YWJsZSEiKTsKLQkJcmV0dXJuIDA7Ci0JfQorCWRldmljZXMgPSB1ZGV2X2VudW1lcmF0ZV9nZXRfbGlzdF9lbnRyeShlbnVtZXJhdGUpOwogCi0JLyogY29sbGVjdCB1bmlxdWUgVVNCIGRldmljZXMgKG5vdCBpbnRlcmZhY2VzKSAqLwotCWRsaXN0X2Zvcl9lYWNoX2RhdGEoc3VpbnRmX2xpc3QsIHN1aW50Ziwgc3RydWN0IHN5c2ZzX2RldmljZSkgewotCQkvKiBnZXQgdXNiIGRldmljZSBvZiB0aGlzIHVzYiBpbnRlcmZhY2UgKi8KLQkJc3VkZXYgPSBzeXNmc19nZXRfZGV2aWNlX3BhcmVudChzdWludGYpOwotCQlpZiAoIXN1ZGV2KSB7Ci0JCQlkYmcoInN5c2ZzX2dldF9kZXZpY2VfcGFyZW50IGZhaWxlZDogJXMiLCBzdWludGYtPm5hbWUpOwotCQkJY29udGludWU7Ci0JCX0KKwl1ZGV2X2xpc3RfZW50cnlfZm9yZWFjaChkZXZfbGlzdF9lbnRyeSwgZGV2aWNlcykgeworCQlwYXRoID0gdWRldl9saXN0X2VudHJ5X2dldF9uYW1lKGRldl9saXN0X2VudHJ5KTsKKwkJZGV2ID0gdWRldl9kZXZpY2VfbmV3X2Zyb21fc3lzcGF0aCh1ZGV2X2NvbnRleHQsIHBhdGgpOwogCi0JCWlmIChjaGVja19uZXcoc3VkZXZfbGlzdCwgc3VkZXYpKSB7Ci0JCQkvKiBpbnNlcnQgaXRlbSBhdCBoZWFkIG9mIGxpc3QgKi8KLQkJCWRsaXN0X3Vuc2hpZnQoc3VkZXZfbGlzdCwgc3VkZXYpOworCQkvKiBDaGVjayB3aGV0aGVyIGRldmljZSB1c2VzIHVzYmlwLWhvc3QgZHJpdmVyLiAqLworCQlpZiAoIXN0cmNtcCh1ZGV2X2RldmljZV9nZXRfZHJpdmVyKGRldiksCisJCQkgICAgVVNCSVBfSE9TVF9EUlZfTkFNRSkpIHsKKwkJCWVkZXYgPSB1c2JpcF9leHBvcnRlZF9kZXZpY2VfbmV3KHBhdGgpOworCQkJaWYgKCFlZGV2KSB7CisJCQkJZGJnKCJ1c2JpcF9leHBvcnRlZF9kZXZpY2VfbmV3IGZhaWxlZCIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlsaXN0X2FkZCgmZWRldi0+bm9kZSwgJmhvc3RfZHJpdmVyLT5lZGV2X2xpc3QpOworCQkJaG9zdF9kcml2ZXItPm5kZXZzKys7CiAJCX0KIAl9CiAKLQlkbGlzdF9mb3JfZWFjaF9kYXRhKHN1ZGV2X2xpc3QsIHN1ZGV2LCBzdHJ1Y3Qgc3lzZnNfZGV2aWNlKSB7Ci0JCWVkZXYgPSB1c2JpcF9leHBvcnRlZF9kZXZpY2VfbmV3KHN1ZGV2LT5wYXRoKTsKLQkJaWYgKCFlZGV2KSB7Ci0JCQlkYmcoInVzYmlwX2V4cG9ydGVkX2RldmljZV9uZXcgZmFpbGVkIik7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWRsaXN0X3Vuc2hpZnQoaG9zdF9kcml2ZXItPmVkZXZfbGlzdCwgZWRldik7Ci0JCWhvc3RfZHJpdmVyLT5uZGV2cysrOwotCX0KLQotCWRsaXN0X2Rlc3Ryb3koc3VkZXZfbGlzdCk7Ci0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzeXNmc19kcml2ZXIgKm9wZW5fc3lzZnNfaG9zdF9kcml2ZXIodm9pZCkKK3N0YXRpYyB2b2lkIHVzYmlwX2V4cG9ydGVkX2RldmljZV9kZXN0cm95KHZvaWQpCiB7Ci0JY2hhciBidXNfdHlwZVtdID0gInVzYiI7Ci0JY2hhciBzeXNmc19tbnRwYXRoW1NZU0ZTX1BBVEhfTUFYXTsKLQljaGFyIGhvc3RfZHJ2X3BhdGhbU1lTRlNfUEFUSF9NQVhdOwotCXN0cnVjdCBzeXNmc19kcml2ZXIgKmhvc3RfZHJ2OwotCWludCByYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICppLCAqdG1wOworCXN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UgKmVkZXY7CiAKLQlyYyA9IHN5c2ZzX2dldF9tbnRfcGF0aChzeXNmc19tbnRwYXRoLCBTWVNGU19QQVRIX01BWCk7Ci0JaWYgKHJjIDwgMCkgewotCQlkYmcoInN5c2ZzX2dldF9tbnRfcGF0aCBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGksIHRtcCwgJmhvc3RfZHJpdmVyLT5lZGV2X2xpc3QpIHsKKwkJZWRldiA9IGxpc3RfZW50cnkoaSwgc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSwgbm9kZSk7CisJCWxpc3RfZGVsKGkpOworCQlmcmVlKGVkZXYpOwogCX0KLQotCXNucHJpbnRmKGhvc3RfZHJ2X3BhdGgsIFNZU0ZTX1BBVEhfTUFYLCAiJXMvJXMvJXMvJXMvJXMiLAotCQkgc3lzZnNfbW50cGF0aCwgU1lTRlNfQlVTX05BTUUsIGJ1c190eXBlLCBTWVNGU19EUklWRVJTX05BTUUsCi0JCSBVU0JJUF9IT1NUX0RSVl9OQU1FKTsKLQotCWhvc3RfZHJ2ID0gc3lzZnNfb3Blbl9kcml2ZXJfcGF0aChob3N0X2Rydl9wYXRoKTsKLQlpZiAoIWhvc3RfZHJ2KSB7Ci0JCWRiZygic3lzZnNfb3Blbl9kcml2ZXJfcGF0aCBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0dXJuIGhvc3RfZHJ2OwotfQotCi1zdGF0aWMgdm9pZCB1c2JpcF9leHBvcnRlZF9kZXZpY2VfZGVsZXRlKHZvaWQgKmRldikKLXsKLQlzdHJ1Y3QgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlICplZGV2ID0gZGV2OwotCXN5c2ZzX2Nsb3NlX2RldmljZShlZGV2LT5zdWRldik7Ci0JZnJlZShkZXYpOwogfQogCiBpbnQgdXNiaXBfaG9zdF9kcml2ZXJfb3Blbih2b2lkKQogewogCWludCByYzsKIAotCWhvc3RfZHJpdmVyID0gY2FsbG9jKDEsIHNpemVvZigqaG9zdF9kcml2ZXIpKTsKLQlpZiAoIWhvc3RfZHJpdmVyKSB7Ci0JCWRiZygiY2FsbG9jIGZhaWxlZCIpOworCXVkZXZfY29udGV4dCA9IHVkZXZfbmV3KCk7CisJaWYgKCF1ZGV2X2NvbnRleHQpIHsKKwkJZXJyKCJ1ZGV2X25ldyBmYWlsZWQiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWhvc3RfZHJpdmVyLT5uZGV2cyA9IDA7Ci0JaG9zdF9kcml2ZXItPmVkZXZfbGlzdCA9Ci0JCWRsaXN0X25ld193aXRoX2RlbGV0ZShzaXplb2Yoc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSksCi0JCQkJICAgICAgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlX2RlbGV0ZSk7Ci0JaWYgKCFob3N0X2RyaXZlci0+ZWRldl9saXN0KSB7Ci0JCWRiZygiZGxpc3RfbmV3X3dpdGhfZGVsZXRlIGZhaWxlZCIpOwotCQlnb3RvIGVycl9mcmVlX2hvc3RfZHJpdmVyOwotCX0KKwlob3N0X2RyaXZlciA9IGNhbGxvYygxLCBzaXplb2YoKmhvc3RfZHJpdmVyKSk7CiAKLQlob3N0X2RyaXZlci0+c3lzZnNfZHJpdmVyID0gb3Blbl9zeXNmc19ob3N0X2RyaXZlcigpOwotCWlmICghaG9zdF9kcml2ZXItPnN5c2ZzX2RyaXZlcikKLQkJZ290byBlcnJfZGVzdHJveV9lZGV2X2xpc3Q7CisJaG9zdF9kcml2ZXItPm5kZXZzID0gMDsKKwlJTklUX0xJU1RfSEVBRCgmaG9zdF9kcml2ZXItPmVkZXZfbGlzdCk7CiAKIAlyYyA9IHJlZnJlc2hfZXhwb3J0ZWRfZGV2aWNlcygpOwogCWlmIChyYyA8IDApCi0JCWdvdG8gZXJyX2Nsb3NlX3N5c2ZzX2RyaXZlcjsKKwkJZ290byBlcnJfZnJlZV9ob3N0X2RyaXZlcjsKIAogCXJldHVybiAwOwogCi1lcnJfY2xvc2Vfc3lzZnNfZHJpdmVyOgotCXN5c2ZzX2Nsb3NlX2RyaXZlcihob3N0X2RyaXZlci0+c3lzZnNfZHJpdmVyKTsKLWVycl9kZXN0cm95X2VkZXZfbGlzdDoKLQlkbGlzdF9kZXN0cm95KGhvc3RfZHJpdmVyLT5lZGV2X2xpc3QpOwogZXJyX2ZyZWVfaG9zdF9kcml2ZXI6CiAJZnJlZShob3N0X2RyaXZlcik7CiAJaG9zdF9kcml2ZXIgPSBOVUxMOwogCisJdWRldl91bnJlZih1ZGV2X2NvbnRleHQpOworCiAJcmV0dXJuIC0xOwogfQogCkBAIC0zMDAsMzAgKzE5MywyMiBAQAogCWlmICghaG9zdF9kcml2ZXIpCiAJCXJldHVybjsKIAotCWlmIChob3N0X2RyaXZlci0+ZWRldl9saXN0KQotCQlkbGlzdF9kZXN0cm95KGhvc3RfZHJpdmVyLT5lZGV2X2xpc3QpOwotCWlmIChob3N0X2RyaXZlci0+c3lzZnNfZHJpdmVyKQotCQlzeXNmc19jbG9zZV9kcml2ZXIoaG9zdF9kcml2ZXItPnN5c2ZzX2RyaXZlcik7CisJdXNiaXBfZXhwb3J0ZWRfZGV2aWNlX2Rlc3Ryb3koKTsKIAogCWZyZWUoaG9zdF9kcml2ZXIpOwogCWhvc3RfZHJpdmVyID0gTlVMTDsKKworCXVkZXZfdW5yZWYodWRldl9jb250ZXh0KTsKIH0KIAogaW50IHVzYmlwX2hvc3RfcmVmcmVzaF9kZXZpY2VfbGlzdCh2b2lkKQogewogCWludCByYzsKIAotCWlmIChob3N0X2RyaXZlci0+ZWRldl9saXN0KQotCQlkbGlzdF9kZXN0cm95KGhvc3RfZHJpdmVyLT5lZGV2X2xpc3QpOworCXVzYmlwX2V4cG9ydGVkX2RldmljZV9kZXN0cm95KCk7CiAKIAlob3N0X2RyaXZlci0+bmRldnMgPSAwOwotCWhvc3RfZHJpdmVyLT5lZGV2X2xpc3QgPQotCQlkbGlzdF9uZXdfd2l0aF9kZWxldGUoc2l6ZW9mKHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UpLAotCQkJCSAgICAgIHVzYmlwX2V4cG9ydGVkX2RldmljZV9kZWxldGUpOwotCWlmICghaG9zdF9kcml2ZXItPmVkZXZfbGlzdCkgewotCQlkYmcoImRsaXN0X25ld193aXRoX2RlbGV0ZSBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KKwlJTklUX0xJU1RfSEVBRCgmaG9zdF9kcml2ZXItPmVkZXZfbGlzdCk7CiAKIAlyYyA9IHJlZnJlc2hfZXhwb3J0ZWRfZGV2aWNlcygpOwogCWlmIChyYyA8IDApCkBAIC0zMzUsOCArMjIwLDcgQEAKIGludCB1c2JpcF9ob3N0X2V4cG9ydF9kZXZpY2Uoc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSAqZWRldiwgaW50IHNvY2tmZCkKIHsKIAljaGFyIGF0dHJfbmFtZVtdID0gInVzYmlwX3NvY2tmZCI7Ci0JY2hhciBhdHRyX3BhdGhbU1lTRlNfUEFUSF9NQVhdOwotCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKmF0dHI7CisJY2hhciBzb2NrZmRfYXR0cl9wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKIAljaGFyIHNvY2tmZF9idWZmWzMwXTsKIAlpbnQgcmV0OwogCkBAIC0zNTYsNDEgKzI0MCwzMiBAQAogCX0KIAogCS8qIG9ubHkgdGhlIGZpcnN0IGludGVyZmFjZSBpcyB0cnVlICovCi0Jc25wcmludGYoYXR0cl9wYXRoLCBzaXplb2YoYXR0cl9wYXRoKSwgIiVzLyVzOiVkLiVkLyVzIiwKLQkJIGVkZXYtPnVkZXYucGF0aCwgZWRldi0+dWRldi5idXNpZCwKLQkJIGVkZXYtPnVkZXYuYkNvbmZpZ3VyYXRpb25WYWx1ZSwgMCwgYXR0cl9uYW1lKTsKLQotCWF0dHIgPSBzeXNmc19vcGVuX2F0dHJpYnV0ZShhdHRyX3BhdGgpOwotCWlmICghYXR0cikgewotCQlkYmcoInN5c2ZzX29wZW5fYXR0cmlidXRlIGZhaWxlZDogJXMiLCBhdHRyX3BhdGgpOwotCQlyZXR1cm4gLTE7Ci0JfQorCXNucHJpbnRmKHNvY2tmZF9hdHRyX3BhdGgsIHNpemVvZihzb2NrZmRfYXR0cl9wYXRoKSwgIiVzLyVzIiwKKwkJIGVkZXYtPnVkZXYucGF0aCwgYXR0cl9uYW1lKTsKIAogCXNucHJpbnRmKHNvY2tmZF9idWZmLCBzaXplb2Yoc29ja2ZkX2J1ZmYpLCAiJWRcbiIsIHNvY2tmZCk7Ci0JZGJnKCJ3cml0ZTogJXMiLCBzb2NrZmRfYnVmZik7CiAKLQlyZXQgPSBzeXNmc193cml0ZV9hdHRyaWJ1dGUoYXR0ciwgc29ja2ZkX2J1ZmYsIHN0cmxlbihzb2NrZmRfYnVmZikpOworCXJldCA9IHdyaXRlX3N5c2ZzX2F0dHJpYnV0ZShzb2NrZmRfYXR0cl9wYXRoLCBzb2NrZmRfYnVmZiwKKwkJCQkgICAgc3RybGVuKHNvY2tmZF9idWZmKSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGJnKCJzeXNmc193cml0ZV9hdHRyaWJ1dGUgZmFpbGVkOiBzb2NrZmQgJXMgdG8gJXMiLAotCQkgICAgc29ja2ZkX2J1ZmYsIGF0dHJfcGF0aCk7Ci0JCWdvdG8gZXJyX3dyaXRlX3NvY2tmZDsKKwkJZXJyKCJ3cml0ZV9zeXNmc19hdHRyaWJ1dGUgZmFpbGVkOiBzb2NrZmQgJXMgdG8gJXMiLAorCQkgICAgc29ja2ZkX2J1ZmYsIHNvY2tmZF9hdHRyX3BhdGgpOworCQlyZXR1cm4gcmV0OwogCX0KIAotCWRiZygiY29ubmVjdDogJXMiLCBlZGV2LT51ZGV2LmJ1c2lkKTsKLQotZXJyX3dyaXRlX3NvY2tmZDoKLQlzeXNmc19jbG9zZV9hdHRyaWJ1dGUoYXR0cik7CisJaW5mbygiY29ubmVjdDogJXMiLCBlZGV2LT51ZGV2LmJ1c2lkKTsKIAogCXJldHVybiByZXQ7CiB9CiAKIHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UgKnVzYmlwX2hvc3RfZ2V0X2RldmljZShpbnQgbnVtKQogeworCXN0cnVjdCBsaXN0X2hlYWQgKmk7CiAJc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSAqZWRldjsKLQlzdHJ1Y3QgZGxpc3QgKmRsaXN0ID0gaG9zdF9kcml2ZXItPmVkZXZfbGlzdDsKIAlpbnQgY250ID0gMDsKIAotCWRsaXN0X2Zvcl9lYWNoX2RhdGEoZGxpc3QsIGVkZXYsIHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UpIHsKKwlsaXN0X2Zvcl9lYWNoKGksICZob3N0X2RyaXZlci0+ZWRldl9saXN0KSB7CisJCWVkZXYgPSBsaXN0X2VudHJ5KGksIHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UsIG5vZGUpOwogCQlpZiAobnVtID09IGNudCkKIAkJCXJldHVybiBlZGV2OwogCQllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy91c2JpcF9ob3N0X2RyaXZlci5oIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfaG9zdF9kcml2ZXIuaAppbmRleCAzNGZkMTRjLi4yYTMxZjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy91c2JpcF9ob3N0X2RyaXZlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3VzYmlwX2hvc3RfZHJpdmVyLmgKQEAgLTIxLDE4ICsyMSwxOSBAQAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSAidXNiaXBfY29tbW9uLmgiCisjaW5jbHVkZSAibGlzdC5oIgogCiBzdHJ1Y3QgdXNiaXBfaG9zdF9kcml2ZXIgewogCWludCBuZGV2czsKLQlzdHJ1Y3Qgc3lzZnNfZHJpdmVyICpzeXNmc19kcml2ZXI7CiAJLyogbGlzdCBvZiBleHBvcnRlZCBkZXZpY2UgKi8KLQlzdHJ1Y3QgZGxpc3QgKmVkZXZfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVkZXZfbGlzdDsKIH07CiAKIHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UgewotCXN0cnVjdCBzeXNmc19kZXZpY2UgKnN1ZGV2OworCXN0cnVjdCB1ZGV2X2RldmljZSAqc3VkZXY7CiAJaW50MzJfdCBzdGF0dXM7CiAJc3RydWN0IHVzYmlwX3VzYl9kZXZpY2UgdWRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CiAJc3RydWN0IHVzYmlwX3VzYl9pbnRlcmZhY2UgdWluZltdOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdmhjaV9kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3ZoY2lfZHJpdmVyLmMKaW5kZXggMjA5ZGY5Yi4uODkwMWZjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdmhjaV9kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy92aGNpX2RyaXZlci5jCkBAIC02LDQ0ICs2LDI4IEBACiAjaW5jbHVkZSAidmhjaV9kcml2ZXIuaCIKICNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPGxpYnVkZXYuaD4KKyNpbmNsdWRlICJzeXNmc191dGlscy5oIgogCiAjdW5kZWYgIFBST0dOQU1FCiAjZGVmaW5lIFBST0dOQU1FICJsaWJ1c2JpcCIKIAogc3RydWN0IHVzYmlwX3ZoY2lfZHJpdmVyICp2aGNpX2RyaXZlcjsKK3N0cnVjdCB1ZGV2ICp1ZGV2X2NvbnRleHQ7CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiaXBfaW1wb3J0ZWRfZGV2aWNlICoKIGltcG9ydGVkX2RldmljZV9pbml0KHN0cnVjdCB1c2JpcF9pbXBvcnRlZF9kZXZpY2UgKmlkZXYsIGNoYXIgKmJ1c2lkKQogewotCXN0cnVjdCBzeXNmc19kZXZpY2UgKnN1ZGV2OworCXN0cnVjdCB1ZGV2X2RldmljZSAqc3VkZXY7CiAKLQlzdWRldiA9IHN5c2ZzX29wZW5fZGV2aWNlKCJ1c2IiLCBidXNpZCk7CisJc3VkZXYgPSB1ZGV2X2RldmljZV9uZXdfZnJvbV9zdWJzeXN0ZW1fc3lzbmFtZSh1ZGV2X2NvbnRleHQsCisJCQkJCQkgICAgICAgInVzYiIsIGJ1c2lkKTsKIAlpZiAoIXN1ZGV2KSB7Ci0JCWRiZygic3lzZnNfb3Blbl9kZXZpY2UgZmFpbGVkOiAlcyIsIGJ1c2lkKTsKKwkJZGJnKCJ1ZGV2X2RldmljZV9uZXdfZnJvbV9zdWJzeXN0ZW1fc3lzbmFtZSBmYWlsZWQ6ICVzIiwgYnVzaWQpOwogCQlnb3RvIGVycjsKIAl9CiAJcmVhZF91c2JfZGV2aWNlKHN1ZGV2LCAmaWRldi0+dWRldik7Ci0Jc3lzZnNfY2xvc2VfZGV2aWNlKHN1ZGV2KTsKLQotCS8qIGFkZCBjbGFzcyBkZXZpY2VzIG9mIHRoaXMgaW1wb3J0ZWQgZGV2aWNlICovCi0Jc3RydWN0IHVzYmlwX2NsYXNzX2RldmljZSAqY2RldjsKLQlkbGlzdF9mb3JfZWFjaF9kYXRhKHZoY2lfZHJpdmVyLT5jZGV2X2xpc3QsIGNkZXYsCi0JCQkgICAgc3RydWN0IHVzYmlwX2NsYXNzX2RldmljZSkgewotCQlpZiAoIXN0cm5jbXAoY2Rldi0+ZGV2X3BhdGgsIGlkZXYtPnVkZXYucGF0aCwKLQkJCSAgICAgc3RybGVuKGlkZXYtPnVkZXYucGF0aCkpKSB7Ci0JCQlzdHJ1Y3QgdXNiaXBfY2xhc3NfZGV2aWNlICpuZXdfY2RldjsKLQkJCS8qCi0JCQkgKiBhbGxvYyBhbmQgY29weSBiZWNhdXNlIGRsaXN0IGlzIGxpbmtlZAotCQkJICogZnJvbSBvbmx5IG9uZSBsaXN0Ci0JCQkgKi8KLQkJCW5ld19jZGV2ID0gY2FsbG9jKDEsIHNpemVvZigqbmV3X2NkZXYpKTsKLQkJCWlmICghbmV3X2NkZXYpCi0JCQkJZ290byBlcnI7Ci0KLQkJCW1lbWNweShuZXdfY2RldiwgY2Rldiwgc2l6ZW9mKCpuZXdfY2RldikpOwotCQkJZGxpc3RfdW5zaGlmdChpZGV2LT5jZGV2X2xpc3QsICh2b2lkICopIG5ld19jZGV2KTsKLQkJfQotCX0KKwl1ZGV2X2RldmljZV91bnJlZihzdWRldik7CiAKIAlyZXR1cm4gaWRldjsKIApAQCAtNTMsNyArMzcsNyBAQAogCiAKIAotc3RhdGljIGludCBwYXJzZV9zdGF0dXMoY2hhciAqdmFsdWUpCitzdGF0aWMgaW50IHBhcnNlX3N0YXR1cyhjb25zdCBjaGFyICp2YWx1ZSkKIHsKIAlpbnQgcmV0ID0gMDsKIAljaGFyICpjOwpAQCAtMTAwLDEyICs4NCw2IEBACiAJCQlpZGV2LT5idXNudW0JPSAoZGV2aWQgPj4gMTYpOwogCQkJaWRldi0+ZGV2bnVtCT0gKGRldmlkICYgMHgwMDAwZmZmZik7CiAKLQkJCWlkZXYtPmNkZXZfbGlzdCA9IGRsaXN0X25ldyhzaXplb2Yoc3RydWN0IHVzYmlwX2NsYXNzX2RldmljZSkpOwotCQkJaWYgKCFpZGV2LT5jZGV2X2xpc3QpIHsKLQkJCQlkYmcoImRsaXN0X25ldyBmYWlsZWQiKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0KIAkJCWlmIChpZGV2LT5zdGF0dXMgIT0gVkRFVl9TVF9OVUxMCiAJCQkgICAgJiYgaWRldi0+c3RhdHVzICE9IFZERVZfU1RfTk9UQVNTSUdORUQpIHsKIAkJCQlpZGV2ID0gaW1wb3J0ZWRfZGV2aWNlX2luaXQoaWRldiwgbGJ1c2lkKTsKQEAgLTEyOSwxNTYgKzEwNywzNSBAQAogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbnQgY2hlY2tfdXNiaXBfZGV2aWNlKHN0cnVjdCBzeXNmc19jbGFzc19kZXZpY2UgKmNkZXYpCi17Ci0JLyogL3N5cy9jbGFzcy92aWRlbzRsaW51eC92aWRlbzAvZGV2aWNlICovCi0JY2hhciBjbGFzc19wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKLQkvKiAvc3lzL2RldmljZXMvcGxhdGZvcm0vdmhjaV9oY2QvdXNiNi82LTE6MS4xICovCi0JY2hhciBkZXZfcGF0aFtTWVNGU19QQVRIX01BWF07Ci0JaW50IHJldDsKLQlzdHJ1Y3QgdXNiaXBfY2xhc3NfZGV2aWNlICp1c2JpcF9jZGV2OwotCi0Jc25wcmludGYoY2xhc3NfcGF0aCwgc2l6ZW9mKGNsYXNzX3BhdGgpLCAiJXMvZGV2aWNlIiwgY2Rldi0+cGF0aCk7Ci0KLQlyZXQgPSBzeXNmc19nZXRfbGluayhjbGFzc19wYXRoLCBkZXZfcGF0aCwgc2l6ZW9mKGRldl9wYXRoKSk7Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCWlmICghc3RybmNtcChkZXZfcGF0aCwgdmhjaV9kcml2ZXItPmhjX2RldmljZS0+cGF0aCwKLQkJCSAgICAgc3RybGVuKHZoY2lfZHJpdmVyLT5oY19kZXZpY2UtPnBhdGgpKSkgewotCQkJLyogZm91bmQgdXNiaXAgZGV2aWNlICovCi0JCQl1c2JpcF9jZGV2ID0gY2FsbG9jKDEsIHNpemVvZigqdXNiaXBfY2RldikpOwotCQkJaWYgKCF1c2JpcF9jZGV2KSB7Ci0JCQkJZGJnKCJjYWxsb2MgZmFpbGVkIik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZGxpc3RfdW5zaGlmdCh2aGNpX2RyaXZlci0+Y2Rldl9saXN0LCB1c2JpcF9jZGV2KTsKLQkJCXN0cm5jcHkodXNiaXBfY2Rldi0+Y2xhc3NfcGF0aCwgY2xhc3NfcGF0aCwKLQkJCQlzaXplb2YodXNiaXBfY2Rldi0+Y2xhc3NfcGF0aCkpOwotCQkJc3RybmNweSh1c2JpcF9jZGV2LT5kZXZfcGF0aCwgZGV2X3BhdGgsCi0JCQkJc2l6ZW9mKHVzYmlwX2NkZXYtPmRldl9wYXRoKSk7Ci0JCQlkYmcoImZvdW5kOiAlcyAlcyIsIGNsYXNzX3BhdGgsIGRldl9wYXRoKTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgc2VhcmNoX2NsYXNzX2Zvcl91c2JpcF9kZXZpY2UoY2hhciAqY25hbWUpCi17Ci0Jc3RydWN0IHN5c2ZzX2NsYXNzICpjbGFzczsKLQlzdHJ1Y3QgZGxpc3QgKmNkZXZfbGlzdDsKLQlzdHJ1Y3Qgc3lzZnNfY2xhc3NfZGV2aWNlICpjZGV2OwotCWludCByZXQgPSAwOwotCi0JY2xhc3MgPSBzeXNmc19vcGVuX2NsYXNzKGNuYW1lKTsKLQlpZiAoIWNsYXNzKSB7Ci0JCWRiZygic3lzZnNfb3Blbl9jbGFzcyBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWRiZygiY2xhc3M6ICVzIiwgY2xhc3MtPm5hbWUpOwotCi0JY2Rldl9saXN0ID0gc3lzZnNfZ2V0X2NsYXNzX2RldmljZXMoY2xhc3MpOwotCWlmICghY2Rldl9saXN0KQotCQkvKiBub3RoaW5nICovCi0JCWdvdG8gb3V0OwotCi0JZGxpc3RfZm9yX2VhY2hfZGF0YShjZGV2X2xpc3QsIGNkZXYsIHN0cnVjdCBzeXNmc19jbGFzc19kZXZpY2UpIHsKLQkJZGJnKCJjZGV2OiAlcyIsIGNkZXYtPm5hbWUpOwotCQlyZXQgPSBjaGVja191c2JpcF9kZXZpY2UoY2Rldik7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXQ7Ci0JfQotCi1vdXQ6Ci0Jc3lzZnNfY2xvc2VfY2xhc3MoY2xhc3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaW50IHJlZnJlc2hfY2xhc3NfZGV2aWNlX2xpc3Qodm9pZCkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBkbGlzdCAqY25hbWVfbGlzdDsKLQljaGFyICpjbmFtZTsKLQljaGFyIHN5c2ZzX21udHBhdGhbU1lTRlNfUEFUSF9NQVhdOwotCWNoYXIgY2xhc3NfcGF0aFtTWVNGU19QQVRIX01BWF07Ci0KLQlyZXQgPSBzeXNmc19nZXRfbW50X3BhdGgoc3lzZnNfbW50cGF0aCwgU1lTRlNfUEFUSF9NQVgpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRiZygic3lzZnNfZ2V0X21udF9wYXRoIGZhaWxlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc25wcmludGYoY2xhc3NfcGF0aCwgc2l6ZW9mKGNsYXNzX3BhdGgpLCAiJXMvJXMiLCBzeXNmc19tbnRwYXRoLAotCQkgU1lTRlNfQ0xBU1NfTkFNRSk7Ci0KLQkvKiBzZWFyY2ggdW5kZXIgL3N5cy9jbGFzcyAqLwotCWNuYW1lX2xpc3QgPSBzeXNmc19vcGVuX2RpcmVjdG9yeV9saXN0KGNsYXNzX3BhdGgpOwotCWlmICghY25hbWVfbGlzdCkgewotCQlkYmcoInN5c2ZzX29wZW5fZGlyZWN0b3J5IGZhaWxlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZGxpc3RfZm9yX2VhY2hfZGF0YShjbmFtZV9saXN0LCBjbmFtZSwgY2hhcikgewotCQlyZXQgPSBzZWFyY2hfY2xhc3NfZm9yX3VzYmlwX2RldmljZShjbmFtZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlzeXNmc19jbG9zZV9saXN0KGNuYW1lX2xpc3QpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0Jc3lzZnNfY2xvc2VfbGlzdChjbmFtZV9saXN0KTsKLQotCS8qIHNlYXJjaCB1bmRlciAvc3lzL2Jsb2NrICovCi0JcmV0ID0gc2VhcmNoX2NsYXNzX2Zvcl91c2JpcF9kZXZpY2UoU1lTRlNfQkxPQ0tfTkFNRSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiAtMTsKLQotCXJldHVybiAwOwotfQotCi0KIHN0YXRpYyBpbnQgcmVmcmVzaF9pbXBvcnRlZF9kZXZpY2VfbGlzdCh2b2lkKQogewotCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKmF0dHJfc3RhdHVzOworCWNvbnN0IGNoYXIgKmF0dHJfc3RhdHVzOwogCi0KLQlhdHRyX3N0YXR1cyA9IHN5c2ZzX2dldF9kZXZpY2VfYXR0cih2aGNpX2RyaXZlci0+aGNfZGV2aWNlLCAic3RhdHVzIik7CisJYXR0cl9zdGF0dXMgPSB1ZGV2X2RldmljZV9nZXRfc3lzYXR0cl92YWx1ZSh2aGNpX2RyaXZlci0+aGNfZGV2aWNlLAorCQkJCQkgICAgICAgInN0YXR1cyIpOwogCWlmICghYXR0cl9zdGF0dXMpIHsKLQkJZGJnKCJzeXNmc19nZXRfZGV2aWNlX2F0dHIoXCJzdGF0dXNcIikgZmFpbGVkOiAlcyIsCi0JCSAgICB2aGNpX2RyaXZlci0+aGNfZGV2aWNlLT5uYW1lKTsKKwkJZXJyKCJ1ZGV2X2RldmljZV9nZXRfc3lzYXR0cl92YWx1ZSBmYWlsZWQiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWRiZygibmFtZTogJXMgIHBhdGg6ICVzICBsZW46ICVkICBtZXRob2Q6ICVkICB2YWx1ZTogJXMiLAotCSAgICBhdHRyX3N0YXR1cy0+bmFtZSwgYXR0cl9zdGF0dXMtPnBhdGgsIGF0dHJfc3RhdHVzLT5sZW4sCi0JICAgIGF0dHJfc3RhdHVzLT5tZXRob2QsIGF0dHJfc3RhdHVzLT52YWx1ZSk7Ci0KLQlyZXR1cm4gcGFyc2Vfc3RhdHVzKGF0dHJfc3RhdHVzLT52YWx1ZSk7CisJcmV0dXJuIHBhcnNlX3N0YXR1cyhhdHRyX3N0YXR1cyk7CiB9CiAKIHN0YXRpYyBpbnQgZ2V0X25wb3J0cyh2b2lkKQogewogCWNoYXIgKmM7CiAJaW50IG5wb3J0cyA9IDA7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYXR0cl9zdGF0dXM7CisJY29uc3QgY2hhciAqYXR0cl9zdGF0dXM7CiAKLQlhdHRyX3N0YXR1cyA9IHN5c2ZzX2dldF9kZXZpY2VfYXR0cih2aGNpX2RyaXZlci0+aGNfZGV2aWNlLCAic3RhdHVzIik7CisJYXR0cl9zdGF0dXMgPSB1ZGV2X2RldmljZV9nZXRfc3lzYXR0cl92YWx1ZSh2aGNpX2RyaXZlci0+aGNfZGV2aWNlLAorCQkJCQkgICAgICAgInN0YXR1cyIpOwogCWlmICghYXR0cl9zdGF0dXMpIHsKLQkJZGJnKCJzeXNmc19nZXRfZGV2aWNlX2F0dHIoXCJzdGF0dXNcIikgZmFpbGVkOiAlcyIsCi0JCSAgICB2aGNpX2RyaXZlci0+aGNfZGV2aWNlLT5uYW1lKTsKKwkJZXJyKCJ1ZGV2X2RldmljZV9nZXRfc3lzYXR0cl92YWx1ZSBmYWlsZWQiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWRiZygibmFtZTogJXMgIHBhdGg6ICVzICBsZW46ICVkICBtZXRob2Q6ICVkICB2YWx1ZTogJXMiLAotCSAgICBhdHRyX3N0YXR1cy0+bmFtZSwgYXR0cl9zdGF0dXMtPnBhdGgsIGF0dHJfc3RhdHVzLT5sZW4sCi0JICAgIGF0dHJfc3RhdHVzLT5tZXRob2QsIGF0dHJfc3RhdHVzLT52YWx1ZSk7Ci0KIAkvKiBza2lwIGEgaGVhZGVyIGxpbmUgKi8KLQljID0gc3RyY2hyKGF0dHJfc3RhdHVzLT52YWx1ZSwgJ1xuJyk7CisJYyA9IHN0cmNocihhdHRyX3N0YXR1cywgJ1xuJyk7CiAJaWYgKCFjKQogCQlyZXR1cm4gMDsKIAljKys7CkBAIC0yOTUsNzEgKzE1Miw2NiBAQAogCXJldHVybiBucG9ydHM7CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X2hjX2J1c2lkKGNoYXIgKnN5c2ZzX21udHBhdGgsIGNoYXIgKmhjX2J1c2lkKQorLyoKKyAqIFJlYWQgdGhlIGdpdmVuIHBvcnQncyByZWNvcmQuCisgKgorICogVG8gYXZvaWQgYnVmZmVyIG92ZXJmbG93IHdlIHdpbGwgcmVhZCB0aGUgZW50aXJlIGxpbmUgYW5kCisgKiB2YWxpZGF0ZSBlYWNoIHBhcnQncyBzaXplLiBUaGUgaW5pdGlhbCBidWZmZXIgaXMgcGFkZGVkIGJ5IDQgdG8KKyAqIGFjY29tbW9kYXRlIHRoZSAyIHNwYWNlcywgMSBuZXdsaW5lIGFuZCBhbiBhZGRpdGlvbmFsIGNoYXJhY3RlcgorICogd2hpY2ggaXMgbmVlZGVkIHRvIHByb3Blcmx5IHZhbGlkYXRlIHRoZSAzcmQgcGFydCB3aXRob3V0IGl0IGJlaW5nCisgKiB0cnVuY2F0ZWQgdG8gYW4gYWNjZXB0YWJsZSBsZW5ndGguCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9yZWNvcmQoaW50IHJocG9ydCwgY2hhciAqaG9zdCwgdW5zaWduZWQgbG9uZyBob3N0X2xlbiwKKwkJY2hhciAqcG9ydCwgdW5zaWduZWQgbG9uZyBwb3J0X2xlbiwgY2hhciAqYnVzaWQpCiB7Ci0Jc3RydWN0IHN5c2ZzX2RyaXZlciAqc2RyaXZlcjsKLQljaGFyIHNkcml2ZXJfcGF0aFtTWVNGU19QQVRIX01BWF07Ci0KLQlzdHJ1Y3Qgc3lzZnNfZGV2aWNlICpoY19kZXY7Ci0Jc3RydWN0IGRsaXN0ICpoY19kZXZzOwotCi0JaW50IGZvdW5kID0gMDsKLQotCXNucHJpbnRmKHNkcml2ZXJfcGF0aCwgU1lTRlNfUEFUSF9NQVgsICIlcy8lcy8lcy8lcy8lcyIsIHN5c2ZzX21udHBhdGgsCi0JU1lTRlNfQlVTX05BTUUsIFVTQklQX1ZIQ0lfQlVTX1RZUEUsIFNZU0ZTX0RSSVZFUlNfTkFNRSwKLQlVU0JJUF9WSENJX0RSVl9OQU1FKTsKLQotCXNkcml2ZXIgPSBzeXNmc19vcGVuX2RyaXZlcl9wYXRoKHNkcml2ZXJfcGF0aCk7Ci0JaWYgKCFzZHJpdmVyKSB7Ci0JCWRiZygic3lzZnNfb3Blbl9kcml2ZXJfcGF0aCBmYWlsZWQ6ICVzIiwgc2RyaXZlcl9wYXRoKTsKLQkJZGJnKCJtYWtlIHN1cmUgIiBVU0JJUF9DT1JFX01PRF9OQU1FICIua28gYW5kICIKLQkJICAgIFVTQklQX1ZIQ0lfRFJWX05BTUUgIi5rbyBhcmUgbG9hZGVkISIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaGNfZGV2cyA9IHN5c2ZzX2dldF9kcml2ZXJfZGV2aWNlcyhzZHJpdmVyKTsKLQlpZiAoIWhjX2RldnMpIHsKLQkJZGJnKCJzeXNmc19nZXRfZHJpdmVyIGZhaWxlZCIpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQkvKiBhc3N1bWUgb25seSBvbmUgdmhjaV9oY2QgKi8KLQlkbGlzdF9mb3JfZWFjaF9kYXRhKGhjX2RldnMsIGhjX2Rldiwgc3RydWN0IHN5c2ZzX2RldmljZSkgewotCQlzdHJuY3B5KGhjX2J1c2lkLCBoY19kZXYtPmJ1c19pZCwgU1lTRlNfQlVTX0lEX1NJWkUpOwotCQlmb3VuZCA9IDE7Ci0JfQotCi1lcnI6Ci0Jc3lzZnNfY2xvc2VfZHJpdmVyKHNkcml2ZXIpOwotCi0JaWYgKGZvdW5kKQotCQlyZXR1cm4gMDsKLQotCWRiZygiJXMgbm90IGZvdW5kIiwgaGNfYnVzaWQpOwotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCByZWFkX3JlY29yZChpbnQgcmhwb3J0LCBjaGFyICpob3N0LCBjaGFyICpwb3J0LCBjaGFyICpidXNpZCkKLXsKKwlpbnQgcGFydDsKIAlGSUxFICpmaWxlOwogCWNoYXIgcGF0aFtQQVRIX01BWCsxXTsKKwljaGFyICpidWZmZXIsICpzdGFydCwgKmVuZDsKKwljaGFyIGRlbGltW10gPSB7JyAnLCAnICcsICdcbid9OworCWludCBtYXhfbGVuW10gPSB7KGludClob3N0X2xlbiwgKGludClwb3J0X2xlbiwgU1lTRlNfQlVTX0lEX1NJWkV9OworCXNpemVfdCBidWZmZXJfbGVuID0gaG9zdF9sZW4gKyBwb3J0X2xlbiArIFNZU0ZTX0JVU19JRF9TSVpFICsgNDsKKworCWJ1ZmZlciA9IG1hbGxvYyhidWZmZXJfbGVuKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIC0xOwogCiAJc25wcmludGYocGF0aCwgUEFUSF9NQVgsIFZIQ0lfU1RBVEVfUEFUSCIvcG9ydCVkIiwgcmhwb3J0KTsKIAogCWZpbGUgPSBmb3BlbihwYXRoLCAiciIpOwogCWlmICghZmlsZSkgewogCQllcnIoImZvcGVuIik7CisJCWZyZWUoYnVmZmVyKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWlmIChmc2NhbmYoZmlsZSwgIiVzICVzICVzXG4iLCBob3N0LCBwb3J0LCBidXNpZCkgIT0gMykgewotCQllcnIoImZzY2FuZiIpOworCWlmIChmZ2V0cyhidWZmZXIsIGJ1ZmZlcl9sZW4sIGZpbGUpID09IE5VTEwpIHsKKwkJZXJyKCJmZ2V0cyIpOworCQlmcmVlKGJ1ZmZlcik7CiAJCWZjbG9zZShmaWxlKTsKIAkJcmV0dXJuIC0xOwogCX0KLQogCWZjbG9zZShmaWxlKTsKIAorCS8qIHZhbGlkYXRlIHRoZSBsZW5ndGggb2YgZWFjaCBvZiB0aGUgMyBwYXJ0cyAqLworCXN0YXJ0ID0gYnVmZmVyOworCWZvciAocGFydCA9IDA7IHBhcnQgPCAzOyBwYXJ0KyspIHsKKwkJZW5kID0gc3RyY2hyKHN0YXJ0LCBkZWxpbVtwYXJ0XSk7CisJCWlmIChlbmQgPT0gTlVMTCB8fCAoZW5kIC0gc3RhcnQpID4gbWF4X2xlbltwYXJ0XSkgeworCQkJZnJlZShidWZmZXIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXN0YXJ0ID0gZW5kICsgMTsKKwl9CisKKwlpZiAoc3NjYW5mKGJ1ZmZlciwgIiVzICVzICVzXG4iLCBob3N0LCBwb3J0LCBidXNpZCkgIT0gMykgeworCQllcnIoInNzY2FuZiIpOworCQlmcmVlKGJ1ZmZlcik7CisJCXJldHVybiAtMTsKKwl9CisKKwlmcmVlKGJ1ZmZlcik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzY3LDMwICsyMTksMjEgQEAKIAogaW50IHVzYmlwX3ZoY2lfZHJpdmVyX29wZW4odm9pZCkKIHsKLQlpbnQgcmV0OwotCWNoYXIgaGNfYnVzaWRbU1lTRlNfQlVTX0lEX1NJWkVdOwotCi0JdmhjaV9kcml2ZXIgPSAoc3RydWN0IHVzYmlwX3ZoY2lfZHJpdmVyICopIGNhbGxvYygxLCBzaXplb2YoKnZoY2lfZHJpdmVyKSk7Ci0JaWYgKCF2aGNpX2RyaXZlcikgewotCQlkYmcoImNhbGxvYyBmYWlsZWQiKTsKKwl1ZGV2X2NvbnRleHQgPSB1ZGV2X25ldygpOworCWlmICghdWRldl9jb250ZXh0KSB7CisJCWVycigidWRldl9uZXcgZmFpbGVkIik7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlyZXQgPSBzeXNmc19nZXRfbW50X3BhdGgodmhjaV9kcml2ZXItPnN5c2ZzX21udHBhdGgsIFNZU0ZTX1BBVEhfTUFYKTsKLQlpZiAocmV0IDwgMCkgewotCQlkYmcoInN5c2ZzX2dldF9tbnRfcGF0aCBmYWlsZWQiKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmV0ID0gZ2V0X2hjX2J1c2lkKHZoY2lfZHJpdmVyLT5zeXNmc19tbnRwYXRoLCBoY19idXNpZCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyOworCXZoY2lfZHJpdmVyID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgdXNiaXBfdmhjaV9kcml2ZXIpKTsKIAogCS8qIHdpbGwgYmUgZnJlZWQgaW4gdXNiaXBfZHJpdmVyX2Nsb3NlKCkgKi8KLQl2aGNpX2RyaXZlci0+aGNfZGV2aWNlID0gc3lzZnNfb3Blbl9kZXZpY2UoVVNCSVBfVkhDSV9CVVNfVFlQRSwKLQkJCQkJCSAgIGhjX2J1c2lkKTsKKwl2aGNpX2RyaXZlci0+aGNfZGV2aWNlID0KKwkJdWRldl9kZXZpY2VfbmV3X2Zyb21fc3Vic3lzdGVtX3N5c25hbWUodWRldl9jb250ZXh0LAorCQkJCQkJICAgICAgIFVTQklQX1ZIQ0lfQlVTX1RZUEUsCisJCQkJCQkgICAgICAgVVNCSVBfVkhDSV9EUlZfTkFNRSk7CiAJaWYgKCF2aGNpX2RyaXZlci0+aGNfZGV2aWNlKSB7Ci0JCWRiZygic3lzZnNfb3Blbl9kZXZpY2UgZmFpbGVkIik7CisJCWVycigidWRldl9kZXZpY2VfbmV3X2Zyb21fc3Vic3lzdGVtX3N5c25hbWUgZmFpbGVkIik7CiAJCWdvdG8gZXJyOwogCX0KIApAQCAtMzk4LDI5ICsyNDEsMjEgQEAKIAogCWRiZygiYXZhaWxhYmxlIHBvcnRzOiAlZCIsIHZoY2lfZHJpdmVyLT5ucG9ydHMpOwogCi0JdmhjaV9kcml2ZXItPmNkZXZfbGlzdCA9IGRsaXN0X25ldyhzaXplb2Yoc3RydWN0IHVzYmlwX2NsYXNzX2RldmljZSkpOwotCWlmICghdmhjaV9kcml2ZXItPmNkZXZfbGlzdCkKLQkJZ290byBlcnI7Ci0KLQlpZiAocmVmcmVzaF9jbGFzc19kZXZpY2VfbGlzdCgpKQotCQlnb3RvIGVycjsKLQogCWlmIChyZWZyZXNoX2ltcG9ydGVkX2RldmljZV9saXN0KCkpCiAJCWdvdG8gZXJyOwogCi0KIAlyZXR1cm4gMDsKIAotCiBlcnI6Ci0JaWYgKHZoY2lfZHJpdmVyLT5jZGV2X2xpc3QpCi0JCWRsaXN0X2Rlc3Ryb3kodmhjaV9kcml2ZXItPmNkZXZfbGlzdCk7Ci0JaWYgKHZoY2lfZHJpdmVyLT5oY19kZXZpY2UpCi0JCXN5c2ZzX2Nsb3NlX2RldmljZSh2aGNpX2RyaXZlci0+aGNfZGV2aWNlKTsKKwl1ZGV2X2RldmljZV91bnJlZih2aGNpX2RyaXZlci0+aGNfZGV2aWNlKTsKKwogCWlmICh2aGNpX2RyaXZlcikKIAkJZnJlZSh2aGNpX2RyaXZlcik7CiAKIAl2aGNpX2RyaXZlciA9IE5VTEw7CisKKwl1ZGV2X3VucmVmKHVkZXZfY29udGV4dCk7CisKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTQzMCw1MyArMjY1LDI0IEBACiAJaWYgKCF2aGNpX2RyaXZlcikKIAkJcmV0dXJuOwogCi0JaWYgKHZoY2lfZHJpdmVyLT5jZGV2X2xpc3QpCi0JCWRsaXN0X2Rlc3Ryb3kodmhjaV9kcml2ZXItPmNkZXZfbGlzdCk7CisJdWRldl9kZXZpY2VfdW5yZWYodmhjaV9kcml2ZXItPmhjX2RldmljZSk7CiAKLQlmb3IgKGludCBpID0gMDsgaSA8IHZoY2lfZHJpdmVyLT5ucG9ydHM7IGkrKykgewotCQlpZiAodmhjaV9kcml2ZXItPmlkZXZbaV0uY2Rldl9saXN0KQotCQkJZGxpc3RfZGVzdHJveSh2aGNpX2RyaXZlci0+aWRldltpXS5jZGV2X2xpc3QpOwotCX0KLQotCWlmICh2aGNpX2RyaXZlci0+aGNfZGV2aWNlKQotCQlzeXNmc19jbG9zZV9kZXZpY2UodmhjaV9kcml2ZXItPmhjX2RldmljZSk7CiAJZnJlZSh2aGNpX2RyaXZlcik7CiAKIAl2aGNpX2RyaXZlciA9IE5VTEw7CisKKwl1ZGV2X3VucmVmKHVkZXZfY29udGV4dCk7CiB9CiAKIAogaW50IHVzYmlwX3ZoY2lfcmVmcmVzaF9kZXZpY2VfbGlzdCh2b2lkKQogewotCWlmICh2aGNpX2RyaXZlci0+Y2Rldl9saXN0KQotCQlkbGlzdF9kZXN0cm95KHZoY2lfZHJpdmVyLT5jZGV2X2xpc3QpOwotCi0KLQlmb3IgKGludCBpID0gMDsgaSA8IHZoY2lfZHJpdmVyLT5ucG9ydHM7IGkrKykgewotCQlpZiAodmhjaV9kcml2ZXItPmlkZXZbaV0uY2Rldl9saXN0KQotCQkJZGxpc3RfZGVzdHJveSh2aGNpX2RyaXZlci0+aWRldltpXS5jZGV2X2xpc3QpOwotCX0KLQotCXZoY2lfZHJpdmVyLT5jZGV2X2xpc3QgPSBkbGlzdF9uZXcoc2l6ZW9mKHN0cnVjdCB1c2JpcF9jbGFzc19kZXZpY2UpKTsKLQlpZiAoIXZoY2lfZHJpdmVyLT5jZGV2X2xpc3QpCi0JCWdvdG8gZXJyOwotCi0JaWYgKHJlZnJlc2hfY2xhc3NfZGV2aWNlX2xpc3QoKSkKLQkJZ290byBlcnI7CiAKIAlpZiAocmVmcmVzaF9pbXBvcnRlZF9kZXZpY2VfbGlzdCgpKQogCQlnb3RvIGVycjsKIAogCXJldHVybiAwOwogZXJyOgotCWlmICh2aGNpX2RyaXZlci0+Y2Rldl9saXN0KQotCQlkbGlzdF9kZXN0cm95KHZoY2lfZHJpdmVyLT5jZGV2X2xpc3QpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB2aGNpX2RyaXZlci0+bnBvcnRzOyBpKyspIHsKLQkJaWYgKHZoY2lfZHJpdmVyLT5pZGV2W2ldLmNkZXZfbGlzdCkKLQkJCWRsaXN0X2Rlc3Ryb3kodmhjaV9kcml2ZXItPmlkZXZbaV0uY2Rldl9saXN0KTsKLQl9Ci0KIAlkYmcoImZhaWxlZCB0byByZWZyZXNoIGRldmljZSBsaXN0Iik7CiAJcmV0dXJuIC0xOwogfQpAQCAtNDk0LDI0ICszMDAsMjQgQEAKIAogaW50IHVzYmlwX3ZoY2lfYXR0YWNoX2RldmljZTIodWludDhfdCBwb3J0LCBpbnQgc29ja2ZkLCB1aW50MzJfdCBkZXZpZCwKIAkJdWludDMyX3Qgc3BlZWQpIHsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICphdHRyX2F0dGFjaDsKIAljaGFyIGJ1ZmZbMjAwXTsgLyogd2hhdCBzaXplIHNob3VsZCBiZSA/ICovCisJY2hhciBhdHRhY2hfYXR0cl9wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKKwljaGFyIGF0dHJfYXR0YWNoW10gPSAiYXR0YWNoIjsKKwljb25zdCBjaGFyICpwYXRoOwogCWludCByZXQ7CiAKLQlhdHRyX2F0dGFjaCA9IHN5c2ZzX2dldF9kZXZpY2VfYXR0cih2aGNpX2RyaXZlci0+aGNfZGV2aWNlLCAiYXR0YWNoIik7Ci0JaWYgKCFhdHRyX2F0dGFjaCkgewotCQlkYmcoInN5c2ZzX2dldF9kZXZpY2VfYXR0cihcImF0dGFjaFwiKSBmYWlsZWQ6ICVzIiwKLQkJICAgIHZoY2lfZHJpdmVyLT5oY19kZXZpY2UtPm5hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc25wcmludGYoYnVmZiwgc2l6ZW9mKGJ1ZmYpLCAiJXUgJXUgJXUgJXUiLAorCXNucHJpbnRmKGJ1ZmYsIHNpemVvZihidWZmKSwgIiV1ICVkICV1ICV1IiwKIAkJCXBvcnQsIHNvY2tmZCwgZGV2aWQsIHNwZWVkKTsKIAlkYmcoIndyaXRpbmc6ICVzIiwgYnVmZik7CiAKLQlyZXQgPSBzeXNmc193cml0ZV9hdHRyaWJ1dGUoYXR0cl9hdHRhY2gsIGJ1ZmYsIHN0cmxlbihidWZmKSk7CisJcGF0aCA9IHVkZXZfZGV2aWNlX2dldF9zeXNwYXRoKHZoY2lfZHJpdmVyLT5oY19kZXZpY2UpOworCXNucHJpbnRmKGF0dGFjaF9hdHRyX3BhdGgsIHNpemVvZihhdHRhY2hfYXR0cl9wYXRoKSwgIiVzLyVzIiwKKwkJIHBhdGgsIGF0dHJfYXR0YWNoKTsKKwlkYmcoImF0dGFjaCBhdHRyaWJ1dGUgcGF0aDogJXMiLCBhdHRhY2hfYXR0cl9wYXRoKTsKKworCXJldCA9IHdyaXRlX3N5c2ZzX2F0dHJpYnV0ZShhdHRhY2hfYXR0cl9wYXRoLCBidWZmLCBzdHJsZW4oYnVmZikpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRiZygic3lzZnNfd3JpdGVfYXR0cmlidXRlIGZhaWxlZCIpOworCQlkYmcoIndyaXRlX3N5c2ZzX2F0dHJpYnV0ZSBmYWlsZWQiKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNTM2LDIzICszNDIsMjMgQEAKIAogaW50IHVzYmlwX3ZoY2lfZGV0YWNoX2RldmljZSh1aW50OF90IHBvcnQpCiB7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAgKmF0dHJfZGV0YWNoOworCWNoYXIgZGV0YWNoX2F0dHJfcGF0aFtTWVNGU19QQVRIX01BWF07CisJY2hhciBhdHRyX2RldGFjaFtdID0gImRldGFjaCI7CiAJY2hhciBidWZmWzIwMF07IC8qIHdoYXQgc2l6ZSBzaG91bGQgYmUgPyAqLworCWNvbnN0IGNoYXIgKnBhdGg7CiAJaW50IHJldDsKIAotCWF0dHJfZGV0YWNoID0gc3lzZnNfZ2V0X2RldmljZV9hdHRyKHZoY2lfZHJpdmVyLT5oY19kZXZpY2UsICJkZXRhY2giKTsKLQlpZiAoIWF0dHJfZGV0YWNoKSB7Ci0JCWRiZygic3lzZnNfZ2V0X2RldmljZV9hdHRyKFwiZGV0YWNoXCIpIGZhaWxlZDogJXMiLAotCQkgICAgdmhjaV9kcml2ZXItPmhjX2RldmljZS0+bmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KIAlzbnByaW50ZihidWZmLCBzaXplb2YoYnVmZiksICIldSIsIHBvcnQpOwogCWRiZygid3JpdGluZzogJXMiLCBidWZmKTsKIAotCXJldCA9IHN5c2ZzX3dyaXRlX2F0dHJpYnV0ZShhdHRyX2RldGFjaCwgYnVmZiwgc3RybGVuKGJ1ZmYpKTsKKwlwYXRoID0gdWRldl9kZXZpY2VfZ2V0X3N5c3BhdGgodmhjaV9kcml2ZXItPmhjX2RldmljZSk7CisJc25wcmludGYoZGV0YWNoX2F0dHJfcGF0aCwgc2l6ZW9mKGRldGFjaF9hdHRyX3BhdGgpLCAiJXMvJXMiLAorCQkgcGF0aCwgYXR0cl9kZXRhY2gpOworCWRiZygiZGV0YWNoIGF0dHJpYnV0ZSBwYXRoOiAlcyIsIGRldGFjaF9hdHRyX3BhdGgpOworCisJcmV0ID0gd3JpdGVfc3lzZnNfYXR0cmlidXRlKGRldGFjaF9hdHRyX3BhdGgsIGJ1ZmYsIHN0cmxlbihidWZmKSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGJnKCJzeXNmc193cml0ZV9hdHRyaWJ1dGUgZmFpbGVkIik7CisJCWRiZygid3JpdGVfc3lzZnNfYXR0cmlidXRlIGZhaWxlZCIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC01NzMsNyArMzc5LDggQEAKIAlpZiAoaWRldi0+c3RhdHVzID09IFZERVZfU1RfTlVMTCB8fCBpZGV2LT5zdGF0dXMgPT0gVkRFVl9TVF9OT1RBU1NJR05FRCkKIAkJcmV0dXJuIDA7CiAKLQlyZXQgPSByZWFkX3JlY29yZChpZGV2LT5wb3J0LCBob3N0LCBzZXJ2LCByZW1vdGVfYnVzaWQpOworCXJldCA9IHJlYWRfcmVjb3JkKGlkZXYtPnBvcnQsIGhvc3QsIHNpemVvZihob3N0KSwgc2Vydiwgc2l6ZW9mKHNlcnYpLAorCQkJICByZW1vdGVfYnVzaWQpOwogCWlmIChyZXQpIHsKIAkJZXJyKCJyZWFkX3JlY29yZCIpOwogCQlyZWFkX3JlY29yZF9lcnJvciA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy92aGNpX2RyaXZlci5oIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdmhjaV9kcml2ZXIuaAppbmRleCBlMDcxZjgwLi5mYTIzMTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy92aGNpX2RyaXZlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3ZoY2lfZHJpdmVyLmgKQEAgLTUsNyArNSw3IEBACiAjaWZuZGVmIF9fVkhDSV9EUklWRVJfSAogI2RlZmluZSBfX1ZIQ0lfRFJJVkVSX0gKIAotI2luY2x1ZGUgPHN5c2ZzL2xpYnN5c2ZzLmg+CisjaW5jbHVkZSA8bGlidWRldi5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaW5jbHVkZSAidXNiaXBfY29tbW9uLmgiCkBAIC0xMywxMSArMTMsNiBAQAogI2RlZmluZSBVU0JJUF9WSENJX0JVU19UWVBFICJwbGF0Zm9ybSIKICNkZWZpbmUgTUFYTlBPUlQgMTI4CiAKLXN0cnVjdCB1c2JpcF9jbGFzc19kZXZpY2UgewotCWNoYXIgY2xhc3NfcGF0aFtTWVNGU19QQVRIX01BWF07Ci0JY2hhciBkZXZfcGF0aFtTWVNGU19QQVRIX01BWF07Ci19OwotCiBzdHJ1Y3QgdXNiaXBfaW1wb3J0ZWRfZGV2aWNlIHsKIAl1aW50OF90IHBvcnQ7CiAJdWludDMyX3Qgc3RhdHVzOwpAQCAtMjgsMTggKzIzLDEzIEBACiAJdWludDhfdCBkZXZudW07CiAKIAkvKiB1c2JpcF9jbGFzc19kZXZpY2UgbGlzdCAqLwotCXN0cnVjdCBkbGlzdCAqY2Rldl9saXN0OwogCXN0cnVjdCB1c2JpcF91c2JfZGV2aWNlIHVkZXY7CiB9OwogCiBzdHJ1Y3QgdXNiaXBfdmhjaV9kcml2ZXIgewotCWNoYXIgc3lzZnNfbW50cGF0aFtTWVNGU19QQVRIX01BWF07CiAKIAkvKiAvc3lzL2RldmljZXMvcGxhdGZvcm0vdmhjaV9oY2QgKi8KLQlzdHJ1Y3Qgc3lzZnNfZGV2aWNlICpoY19kZXZpY2U7Ci0KLQkvKiB1c2JpcF9jbGFzc19kZXZpY2UgbGlzdCAqLwotCXN0cnVjdCBkbGlzdCAqY2Rldl9saXN0OworCXN0cnVjdCB1ZGV2X2RldmljZSAqaGNfZGV2aWNlOwogCiAJaW50IG5wb3J0czsKIAlzdHJ1Y3QgdXNiaXBfaW1wb3J0ZWRfZGV2aWNlIGlkZXZbTUFYTlBPUlRdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvTWFrZWZpbGUuYW0gYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy9NYWtlZmlsZS5hbQppbmRleCBiNGY4YzRiMC4uZTgxYTRlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvTWFrZWZpbGUuYW0KKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvTWFrZWZpbGUuYW0KQEAgLTgsNSArOCw0IEBACiAJCSB1c2JpcF9hdHRhY2guYyB1c2JpcF9kZXRhY2guYyB1c2JpcF9saXN0LmMgXAogCQkgdXNiaXBfYmluZC5jIHVzYmlwX3VuYmluZC5jIHVzYmlwX3BvcnQuYwogCi0KIHVzYmlwZF9TT1VSQ0VTIDo9IHVzYmlwX25ldHdvcmsuaCB1c2JpcGQuYyB1c2JpcF9uZXR3b3JrLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2F0dGFjaC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfYXR0YWNoLmMKaW5kZXggMDg1ODQxMS4uNzE2YTc5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfYXR0YWNoLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfYXR0YWNoLmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXNmcy9saWJzeXNmcy5oPgogCiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF9iaW5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF9iaW5kLmMKaW5kZXggOWVjYWY2ZS4uZmE0NjE0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfYmluZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2JpbmQuYwpAQCAtMTYsNyArMTYsNyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCi0jaW5jbHVkZSA8c3lzZnMvbGlic3lzZnMuaD4KKyNpbmNsdWRlIDxsaWJ1ZGV2Lmg+CiAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSAidXNiaXBfY29tbW9uLmgiCiAjaW5jbHVkZSAidXRpbHMuaCIKICNpbmNsdWRlICJ1c2JpcC5oIgorI2luY2x1ZGUgInN5c2ZzX3V0aWxzLmgiCiAKIGVudW0gdW5iaW5kX3N0YXR1cyB7CiAJVU5CSU5EX1NUX09LLApAQCAtNDgsMTY3ICs0OSw5MiBAQAogLyogY2FsbCBhdCB1bmJvdW5kIHN0YXRlICovCiBzdGF0aWMgaW50IGJpbmRfdXNiaXAoY2hhciAqYnVzaWQpCiB7Ci0JY2hhciBidXNfdHlwZVtdID0gInVzYiI7CiAJY2hhciBhdHRyX25hbWVbXSA9ICJiaW5kIjsKLQljaGFyIHN5c2ZzX21udHBhdGhbU1lTRlNfUEFUSF9NQVhdOwogCWNoYXIgYmluZF9hdHRyX3BhdGhbU1lTRlNfUEFUSF9NQVhdOwotCWNoYXIgaW50Zl9idXNpZFtTWVNGU19CVVNfSURfU0laRV07Ci0Jc3RydWN0IHN5c2ZzX2RldmljZSAqYnVzaWRfZGV2OwotCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKmJpbmRfYXR0cjsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICpiQ29uZlZhbHVlOwotCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKmJOdW1JbnRmczsKLQlpbnQgaSwgZmFpbGVkID0gMDsKLQlpbnQgcmMsIHJldCA9IC0xOwotCi0JcmMgPSBzeXNmc19nZXRfbW50X3BhdGgoc3lzZnNfbW50cGF0aCwgU1lTRlNfUEFUSF9NQVgpOwotCWlmIChyYyA8IDApIHsKLQkJZXJyKCJzeXNmcyBtdXN0IGJlIG1vdW50ZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KKwlpbnQgcmMgPSAtMTsKIAogCXNucHJpbnRmKGJpbmRfYXR0cl9wYXRoLCBzaXplb2YoYmluZF9hdHRyX3BhdGgpLCAiJXMvJXMvJXMvJXMvJXMvJXMiLAotCQkgc3lzZnNfbW50cGF0aCwgU1lTRlNfQlVTX05BTUUsIGJ1c190eXBlLCBTWVNGU19EUklWRVJTX05BTUUsCi0JCSBVU0JJUF9IT1NUX0RSVl9OQU1FLCBhdHRyX25hbWUpOworCQkgU1lTRlNfTU5UX1BBVEgsIFNZU0ZTX0JVU19OQU1FLCBTWVNGU19CVVNfVFlQRSwKKwkJIFNZU0ZTX0RSSVZFUlNfTkFNRSwgVVNCSVBfSE9TVF9EUlZfTkFNRSwgYXR0cl9uYW1lKTsKIAotCWJpbmRfYXR0ciA9IHN5c2ZzX29wZW5fYXR0cmlidXRlKGJpbmRfYXR0cl9wYXRoKTsKLQlpZiAoIWJpbmRfYXR0cikgewotCQlkYmcoInByb2JsZW0gZ2V0dGluZyBiaW5kIGF0dHJpYnV0ZTogJXMiLCBzdHJlcnJvcihlcnJubykpOworCXJjID0gd3JpdGVfc3lzZnNfYXR0cmlidXRlKGJpbmRfYXR0cl9wYXRoLCBidXNpZCwgc3RybGVuKGJ1c2lkKSk7CisJaWYgKHJjIDwgMCkgeworCQllcnIoImVycm9yIGJpbmRpbmcgZGV2aWNlICVzIHRvIGRyaXZlcjogJXMiLCBidXNpZCwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlidXNpZF9kZXYgPSBzeXNmc19vcGVuX2RldmljZShidXNfdHlwZSwgYnVzaWQpOwotCWlmICghYnVzaWRfZGV2KSB7Ci0JCWRiZygic3lzZnNfb3Blbl9kZXZpY2UgJXMgZmFpbGVkOiAlcyIsIGJ1c2lkLCBzdHJlcnJvcihlcnJubykpOwotCQlnb3RvIGVycl9jbG9zZV9iaW5kX2F0dHI7Ci0JfQotCi0JYkNvbmZWYWx1ZSA9IHN5c2ZzX2dldF9kZXZpY2VfYXR0cihidXNpZF9kZXYsICJiQ29uZmlndXJhdGlvblZhbHVlIik7Ci0JYk51bUludGZzICA9IHN5c2ZzX2dldF9kZXZpY2VfYXR0cihidXNpZF9kZXYsICJiTnVtSW50ZXJmYWNlcyIpOwotCi0JaWYgKCFiQ29uZlZhbHVlIHx8ICFiTnVtSW50ZnMpIHsKLQkJZGJnKCJwcm9ibGVtIGdldHRpbmcgZGV2aWNlIGF0dHJpYnV0ZXM6ICVzIiwKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCWdvdG8gZXJyX2Nsb3NlX2J1c2lkX2RldjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYXRvaShiTnVtSW50ZnMtPnZhbHVlKTsgaSsrKSB7Ci0JCXNucHJpbnRmKGludGZfYnVzaWQsIFNZU0ZTX0JVU19JRF9TSVpFLCAiJXM6JS4xcy4lZCIsIGJ1c2lkLAotCQkJIGJDb25mVmFsdWUtPnZhbHVlLCBpKTsKLQotCQlyYyA9IHN5c2ZzX3dyaXRlX2F0dHJpYnV0ZShiaW5kX2F0dHIsIGludGZfYnVzaWQsCi0JCQkJCSAgIFNZU0ZTX0JVU19JRF9TSVpFKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJZGJnKCJiaW5kIGRyaXZlciBhdCAlcyBmYWlsZWQiLCBpbnRmX2J1c2lkKTsKLQkJCWZhaWxlZCA9IDE7Ci0JCX0KLQl9Ci0KLQlpZiAoIWZhaWxlZCkKLQkJcmV0ID0gMDsKLQotZXJyX2Nsb3NlX2J1c2lkX2RldjoKLQlzeXNmc19jbG9zZV9kZXZpY2UoYnVzaWRfZGV2KTsKLWVycl9jbG9zZV9iaW5kX2F0dHI6Ci0Jc3lzZnNfY2xvc2VfYXR0cmlidXRlKGJpbmRfYXR0cik7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiAvKiBidWdneSBkcml2ZXIgbWF5IGNhdXNlIGRlYWQgbG9jayAqLwogc3RhdGljIGludCB1bmJpbmRfb3RoZXIoY2hhciAqYnVzaWQpCiB7Ci0JY2hhciBidXNfdHlwZVtdID0gInVzYiI7Ci0JY2hhciBpbnRmX2J1c2lkW1NZU0ZTX0JVU19JRF9TSVpFXTsKLQlzdHJ1Y3Qgc3lzZnNfZGV2aWNlICpidXNpZF9kZXY7Ci0Jc3RydWN0IHN5c2ZzX2RldmljZSAqaW50Zl9kZXY7Ci0Jc3RydWN0IHN5c2ZzX2RyaXZlciAqaW50Zl9kcnY7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqdW5iaW5kX2F0dHI7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYkNvbmZWYWx1ZTsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICpiRGV2Q2xhc3M7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYk51bUludGZzOwotCWludCBpLCByYzsKIAllbnVtIHVuYmluZF9zdGF0dXMgc3RhdHVzID0gVU5CSU5EX1NUX09LOwogCi0JYnVzaWRfZGV2ID0gc3lzZnNfb3Blbl9kZXZpY2UoYnVzX3R5cGUsIGJ1c2lkKTsKLQlpZiAoIWJ1c2lkX2RldikgewotCQlkYmcoInN5c2ZzX29wZW5fZGV2aWNlICVzIGZhaWxlZDogJXMiLCBidXNpZCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KKwljaGFyIGF0dHJfbmFtZVtdID0gInVuYmluZCI7CisJY2hhciB1bmJpbmRfYXR0cl9wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKKwlpbnQgcmMgPSAtMTsKIAotCWJDb25mVmFsdWUgPSBzeXNmc19nZXRfZGV2aWNlX2F0dHIoYnVzaWRfZGV2LCAiYkNvbmZpZ3VyYXRpb25WYWx1ZSIpOwotCWJEZXZDbGFzcyAgPSBzeXNmc19nZXRfZGV2aWNlX2F0dHIoYnVzaWRfZGV2LCAiYkRldmljZUNsYXNzIik7Ci0JYk51bUludGZzICA9IHN5c2ZzX2dldF9kZXZpY2VfYXR0cihidXNpZF9kZXYsICJiTnVtSW50ZXJmYWNlcyIpOwotCWlmICghYkNvbmZWYWx1ZSB8fCAhYkRldkNsYXNzIHx8ICFiTnVtSW50ZnMpIHsKLQkJZGJnKCJwcm9ibGVtIGdldHRpbmcgZGV2aWNlIGF0dHJpYnV0ZXM6ICVzIiwKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJc3RydWN0IHVkZXYgKnVkZXY7CisJc3RydWN0IHVkZXZfZGV2aWNlICpkZXY7CisJY29uc3QgY2hhciAqZHJpdmVyOworCWNvbnN0IGNoYXIgKmJEZXZDbGFzczsKKworCS8qIENyZWF0ZSBsaWJ1ZGV2IGNvbnRleHQuICovCisJdWRldiA9IHVkZXZfbmV3KCk7CisKKwkvKiBHZXQgdGhlIGRldmljZS4gKi8KKwlkZXYgPSB1ZGV2X2RldmljZV9uZXdfZnJvbV9zdWJzeXN0ZW1fc3lzbmFtZSh1ZGV2LCAidXNiIiwgYnVzaWQpOworCWlmICghZGV2KSB7CisJCWRiZygidW5hYmxlIHRvIGZpbmQgZGV2aWNlIHdpdGggYnVzIElEICVzIiwgYnVzaWQpOwogCQlnb3RvIGVycl9jbG9zZV9idXNpZF9kZXY7CiAJfQogCi0JaWYgKCFzdHJuY21wKGJEZXZDbGFzcy0+dmFsdWUsICIwOSIsIGJEZXZDbGFzcy0+bGVuKSkgeworCS8qIENoZWNrIHdoYXQga2luZCBvZiBkZXZpY2UgaXQgaXMuICovCisJYkRldkNsYXNzICA9IHVkZXZfZGV2aWNlX2dldF9zeXNhdHRyX3ZhbHVlKGRldiwgImJEZXZpY2VDbGFzcyIpOworCWlmICghYkRldkNsYXNzKSB7CisJCWRiZygidW5hYmxlIHRvIGdldCBiRGV2Q2xhc3MgZGV2aWNlIGF0dHJpYnV0ZSIpOworCQlnb3RvIGVycl9jbG9zZV9idXNpZF9kZXY7CisJfQorCisJaWYgKCFzdHJuY21wKGJEZXZDbGFzcywgIjA5Iiwgc3RybGVuKGJEZXZDbGFzcykpKSB7CiAJCWRiZygic2tpcCB1bmJpbmRpbmcgb2YgaHViIik7CiAJCWdvdG8gZXJyX2Nsb3NlX2J1c2lkX2RldjsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgYXRvaShiTnVtSW50ZnMtPnZhbHVlKTsgaSsrKSB7Ci0JCXNucHJpbnRmKGludGZfYnVzaWQsIFNZU0ZTX0JVU19JRF9TSVpFLCAiJXM6JS4xcy4lZCIsIGJ1c2lkLAotCQkJIGJDb25mVmFsdWUtPnZhbHVlLCBpKTsKLQkJaW50Zl9kZXYgPSBzeXNmc19vcGVuX2RldmljZShidXNfdHlwZSwgaW50Zl9idXNpZCk7Ci0JCWlmICghaW50Zl9kZXYpIHsKLQkJCWRiZygiY291bGQgbm90IG9wZW4gaW50ZXJmYWNlIGRldmljZTogJXMiLAotCQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCQlnb3RvIGVycl9jbG9zZV9idXNpZF9kZXY7Ci0JCX0KKwkvKiBHZXQgdGhlIGRldmljZSBkcml2ZXIuICovCisJZHJpdmVyID0gdWRldl9kZXZpY2VfZ2V0X2RyaXZlcihkZXYpOworCWlmICghZHJpdmVyKSB7CisJCS8qIE5vIGRyaXZlciBib3VuZCB0byB0aGlzIGRldmljZS4gKi8KKwkJZ290byBvdXQ7CisJfQogCi0JCWRiZygiJXMgLT4gJXMiLCBpbnRmX2Rldi0+bmFtZSwgIGludGZfZGV2LT5kcml2ZXJfbmFtZSk7CisJaWYgKCFzdHJuY21wKFVTQklQX0hPU1RfRFJWX05BTUUsIGRyaXZlciwKKwkJCQlzdHJsZW4oVVNCSVBfSE9TVF9EUlZfTkFNRSkpKSB7CisJCS8qIEFscmVhZHkgYm91bmQgdG8gdXNiaXAtaG9zdC4gKi8KKwkJc3RhdHVzID0gVU5CSU5EX1NUX1VTQklQX0hPU1Q7CisJCWdvdG8gb3V0OworCX0KIAotCQlpZiAoIXN0cm5jbXAoInVua25vd24iLCBpbnRmX2Rldi0+ZHJpdmVyX25hbWUsIFNZU0ZTX05BTUVfTEVOKSkKLQkJCS8qIHVuYm91bmQgaW50ZXJmYWNlICovCi0JCQljb250aW51ZTsKKwkvKiBVbmJpbmQgZGV2aWNlIGZyb20gZHJpdmVyLiAqLworCXNucHJpbnRmKHVuYmluZF9hdHRyX3BhdGgsIHNpemVvZih1bmJpbmRfYXR0cl9wYXRoKSwgIiVzLyVzLyVzLyVzLyVzLyVzIiwKKwkJIFNZU0ZTX01OVF9QQVRILCBTWVNGU19CVVNfTkFNRSwgU1lTRlNfQlVTX1RZUEUsCisJCSBTWVNGU19EUklWRVJTX05BTUUsIGRyaXZlciwgYXR0cl9uYW1lKTsKIAotCQlpZiAoIXN0cm5jbXAoVVNCSVBfSE9TVF9EUlZfTkFNRSwgaW50Zl9kZXYtPmRyaXZlcl9uYW1lLAotCQkJICAgICBTWVNGU19OQU1FX0xFTikpIHsKLQkJCS8qIGFscmVhZHkgYm91bmQgdG8gdXNiaXAtaG9zdCAqLwotCQkJc3RhdHVzID0gVU5CSU5EX1NUX1VTQklQX0hPU1Q7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIHVuYmluZGluZyAqLwotCQlpbnRmX2RydiA9IHN5c2ZzX29wZW5fZHJpdmVyKGJ1c190eXBlLCBpbnRmX2Rldi0+ZHJpdmVyX25hbWUpOwotCQlpZiAoIWludGZfZHJ2KSB7Ci0JCQlkYmcoImNvdWxkIG5vdCBvcGVuIGludGVyZmFjZSBkcml2ZXIgb24gJXM6ICVzIiwKLQkJCSAgICBpbnRmX2Rldi0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCWdvdG8gZXJyX2Nsb3NlX2ludGZfZGV2OwotCQl9Ci0KLQkJdW5iaW5kX2F0dHIgPSBzeXNmc19nZXRfZHJpdmVyX2F0dHIoaW50Zl9kcnYsICJ1bmJpbmQiKTsKLQkJaWYgKCF1bmJpbmRfYXR0cikgewotCQkJZGJnKCJwcm9ibGVtIGdldHRpbmcgaW50ZXJmYWNlIGRyaXZlciBhdHRyaWJ1dGU6ICVzIiwKLQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQkJZ290byBlcnJfY2xvc2VfaW50Zl9kcnY7Ci0JCX0KLQotCQlyYyA9IHN5c2ZzX3dyaXRlX2F0dHJpYnV0ZSh1bmJpbmRfYXR0ciwgaW50Zl9kZXYtPmJ1c19pZCwKLQkJCQkJICAgU1lTRlNfQlVTX0lEX1NJWkUpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQkvKiBOT1RFOiB3aHkga2VlcCB1bmJpbmRpbmcgb3RoZXIgaW50ZXJmYWNlcz8gKi8KLQkJCWRiZygidW5iaW5kIGRyaXZlciBhdCAlcyBmYWlsZWQiLCBpbnRmX2Rldi0+YnVzX2lkKTsKLQkJCXN0YXR1cyA9IFVOQklORF9TVF9GQUlMRUQ7Ci0JCX0KLQotCQlzeXNmc19jbG9zZV9kcml2ZXIoaW50Zl9kcnYpOwotCQlzeXNmc19jbG9zZV9kZXZpY2UoaW50Zl9kZXYpOworCXJjID0gd3JpdGVfc3lzZnNfYXR0cmlidXRlKHVuYmluZF9hdHRyX3BhdGgsIGJ1c2lkLCBzdHJsZW4oYnVzaWQpKTsKKwlpZiAocmMgPCAwKSB7CisJCWVycigiZXJyb3IgdW5iaW5kaW5nIGRldmljZSAlcyBmcm9tIGRyaXZlciIsIGJ1c2lkKTsKKwkJZ290byBlcnJfY2xvc2VfYnVzaWRfZGV2OwogCX0KIAogCWdvdG8gb3V0OwogCi1lcnJfY2xvc2VfaW50Zl9kcnY6Ci0Jc3lzZnNfY2xvc2VfZHJpdmVyKGludGZfZHJ2KTsKLWVycl9jbG9zZV9pbnRmX2RldjoKLQlzeXNmc19jbG9zZV9kZXZpY2UoaW50Zl9kZXYpOwogZXJyX2Nsb3NlX2J1c2lkX2RldjoKIAlzdGF0dXMgPSBVTkJJTkRfU1RfRkFJTEVEOwogb3V0OgotCXN5c2ZzX2Nsb3NlX2RldmljZShidXNpZF9kZXYpOworCXVkZXZfZGV2aWNlX3VucmVmKGRldik7CisJdWRldl91bnJlZih1ZGV2KTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0yMTYsNiArMTQyLDE3IEBACiBzdGF0aWMgaW50IGJpbmRfZGV2aWNlKGNoYXIgKmJ1c2lkKQogewogCWludCByYzsKKwlzdHJ1Y3QgdWRldiAqdWRldjsKKwlzdHJ1Y3QgdWRldl9kZXZpY2UgKmRldjsKKworCS8qIENoZWNrIHdoZXRoZXIgdGhlIGRldmljZSB3aXRoIHRoaXMgYnVzIElEIGV4aXN0cy4gKi8KKwl1ZGV2ID0gdWRldl9uZXcoKTsKKwlkZXYgPSB1ZGV2X2RldmljZV9uZXdfZnJvbV9zdWJzeXN0ZW1fc3lzbmFtZSh1ZGV2LCAidXNiIiwgYnVzaWQpOworCWlmICghZGV2KSB7CisJCWVycigiZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBidXMgSUQgZG9lcyBub3QgZXhpc3QiKTsKKwkJcmV0dXJuIC0xOworCX0KKwl1ZGV2X3VucmVmKHVkZXYpOwogCiAJcmMgPSB1bmJpbmRfb3RoZXIoYnVzaWQpOwogCWlmIChyYyA9PSBVTkJJTkRfU1RfRkFJTEVEKSB7CkBAIC0yNDAsNyArMTc3LDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCXByaW50ZigiYmluZCBkZXZpY2Ugb24gYnVzaWQgJXM6IGNvbXBsZXRlXG4iLCBidXNpZCk7CisJaW5mbygiYmluZCBkZXZpY2Ugb24gYnVzaWQgJXM6IGNvbXBsZXRlIiwgYnVzaWQpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF9kZXRhY2guYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2RldGFjaC5jCmluZGV4IDEzMzA4ZGYuLjA1YzZkMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2RldGFjaC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2RldGFjaC5jCkBAIC0xNiw4ICsxNiw2IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCiAKLSNpbmNsdWRlIDxzeXNmcy9saWJzeXNmcy5oPgotCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2xpc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2xpc3QuYwppbmRleCAyMzdlMDk5Li5kNWNlMzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF9saXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfbGlzdC5jCkBAIC0xNyw3ICsxNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5c2ZzL2xpYnN5c2ZzLmg+CisjaW5jbHVkZSA8bGlidWRldi5oPgogCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdGRib29sLmg+CkBAIC01NCw3ICs1NCw3IEBACiAJc3RydWN0IHVzYmlwX3VzYl9kZXZpY2UgdWRldjsKIAlzdHJ1Y3QgdXNiaXBfdXNiX2ludGVyZmFjZSB1aW50ZjsKIAl1bnNpZ25lZCBpbnQgaTsKLQlpbnQgaiwgcmM7CisJaW50IHJjLCBqOwogCiAJcmMgPSB1c2JpcF9uZXRfc2VuZF9vcF9jb21tb24oc29ja2ZkLCBPUF9SRVFfREVWTElTVCwgMCk7CiAJaWYgKHJjIDwgMCkgewpAQCAtMTA3LDE5ICsxMDcsMjAgQEAKIAkJZm9yIChqID0gMDsgaiA8IHVkZXYuYk51bUludGVyZmFjZXM7IGorKykgewogCQkJcmMgPSB1c2JpcF9uZXRfcmVjdihzb2NrZmQsICZ1aW50Ziwgc2l6ZW9mKHVpbnRmKSk7CiAJCQlpZiAocmMgPCAwKSB7Ci0JCQkJZGJnKCJ1c2JpcF9uZXRfcmVjdiBmYWlsZWQ6IHVzYmlwX3VzYl9pbnRmWyVkXSIsCi0JCQkJICAgIGopOworCQkJCWVycigidXNiaXBfbmV0X3JlY3YgZmFpbGVkOiB1c2JpcF91c2JfaW50ZlslZF0iLAorCQkJCQkJaik7CiAKIAkJCQlyZXR1cm4gLTE7CiAJCQl9CiAJCQl1c2JpcF9uZXRfcGFja191c2JfaW50ZXJmYWNlKDAsICZ1aW50Zik7CiAKIAkJCXVzYmlwX25hbWVzX2dldF9jbGFzcyhjbGFzc19uYW1lLCBzaXplb2YoY2xhc3NfbmFtZSksCi0JCQkJCSAgICAgIHVpbnRmLmJJbnRlcmZhY2VDbGFzcywKLQkJCQkJICAgICAgdWludGYuYkludGVyZmFjZVN1YkNsYXNzLAotCQkJCQkgICAgICB1aW50Zi5iSW50ZXJmYWNlUHJvdG9jb2wpOworCQkJCQl1aW50Zi5iSW50ZXJmYWNlQ2xhc3MsCisJCQkJCXVpbnRmLmJJbnRlcmZhY2VTdWJDbGFzcywKKwkJCQkJdWludGYuYkludGVyZmFjZVByb3RvY29sKTsKIAkJCXByaW50ZigiJTExczogJTJkIC0gJXNcbiIsICIiLCBqLCBjbGFzc19uYW1lKTsKIAkJfQorCiAJCXByaW50ZigiXG4iKTsKIAl9CiAKQEAgLTE1MCw4ICsxNTEsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBwcmludF9kZXZpY2UoY2hhciAqYnVzaWQsIGNoYXIgKnZlbmRvciwgY2hhciAqcHJvZHVjdCwKLQkJCSBib29sIHBhcnNhYmxlKQorc3RhdGljIHZvaWQgcHJpbnRfZGV2aWNlKGNvbnN0IGNoYXIgKmJ1c2lkLCBjb25zdCBjaGFyICp2ZW5kb3IsCisJCQkgY29uc3QgY2hhciAqcHJvZHVjdCwgYm9vbCBwYXJzYWJsZSkKIHsKIAlpZiAocGFyc2FibGUpCiAJCXByaW50ZigiYnVzaWQ9JXMjdXNiaWQ9JS40czolLjRzIyIsIGJ1c2lkLCB2ZW5kb3IsIHByb2R1Y3QpOwpAQCAtMTY1LDEwNiArMTY2LDczIEBACiAJCXByaW50ZigiICAgJXNcbiIsIHByb2R1Y3RfbmFtZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X2ludGVyZmFjZShjaGFyICpidXNpZCwgY2hhciAqZHJpdmVyLCBib29sIHBhcnNhYmxlKQotewotCWlmIChwYXJzYWJsZSkKLQkJcHJpbnRmKCIlcz0lcyMiLCBidXNpZCwgZHJpdmVyKTsKLQllbHNlCi0JCXByaW50ZigiJTlzJXMgLT4gJXNcbiIsICIiLCBidXNpZCwgZHJpdmVyKTsKLX0KLQotc3RhdGljIGludCBpc19kZXZpY2Uodm9pZCAqeCkKLXsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICpkZXZwYXRoOwotCXN0cnVjdCBzeXNmc19kZXZpY2UgKmRldiA9IHg7Ci0JaW50IHJldCA9IDA7Ci0KLQlkZXZwYXRoID0gc3lzZnNfZ2V0X2RldmljZV9hdHRyKGRldiwgImRldnBhdGgiKTsKLQlpZiAoZGV2cGF0aCAmJiAqZGV2cGF0aC0+dmFsdWUgIT0gJzAnKQotCQlyZXQgPSAxOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBkZXZjbXAodm9pZCAqYSwgdm9pZCAqYikKLXsKLQlyZXR1cm4gc3RyY21wKGEsIGIpOwotfQotCiBzdGF0aWMgaW50IGxpc3RfZGV2aWNlcyhib29sIHBhcnNhYmxlKQogewotCWNoYXIgYnVzX3R5cGVbXSA9ICJ1c2IiOwotCWNoYXIgYnVzaWRbU1lTRlNfQlVTX0lEX1NJWkVdOworCXN0cnVjdCB1ZGV2ICp1ZGV2OworCXN0cnVjdCB1ZGV2X2VudW1lcmF0ZSAqZW51bWVyYXRlOworCXN0cnVjdCB1ZGV2X2xpc3RfZW50cnkgKmRldmljZXMsICpkZXZfbGlzdF9lbnRyeTsKKwlzdHJ1Y3QgdWRldl9kZXZpY2UgKmRldjsKKwljb25zdCBjaGFyICpwYXRoOworCWNvbnN0IGNoYXIgKmlkVmVuZG9yOworCWNvbnN0IGNoYXIgKmlkUHJvZHVjdDsKKwljb25zdCBjaGFyICpiQ29uZlZhbHVlOworCWNvbnN0IGNoYXIgKmJOdW1JbnRmczsKKwljb25zdCBjaGFyICpidXNpZDsKIAljaGFyIHByb2R1Y3RfbmFtZVsxMjhdOwotCXN0cnVjdCBzeXNmc19idXMgKnVidXM7Ci0Jc3RydWN0IHN5c2ZzX2RldmljZSAqZGV2OwotCXN0cnVjdCBzeXNmc19kZXZpY2UgKmludGY7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqaWRWZW5kb3I7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqaWRQcm9kdWN0OwotCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKmJDb25mVmFsdWU7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYk51bUludGZzOwotCXN0cnVjdCBkbGlzdCAqZGV2bGlzdDsKLQlpbnQgaTsKIAlpbnQgcmV0ID0gLTE7CiAKLQl1YnVzID0gc3lzZnNfb3Blbl9idXMoYnVzX3R5cGUpOwotCWlmICghdWJ1cykgewotCQllcnIoImNvdWxkIG5vdCBvcGVuICVzIGJ1czogJXMiLCBidXNfdHlwZSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KKwkvKiBDcmVhdGUgbGlidWRldiBjb250ZXh0LiAqLworCXVkZXYgPSB1ZGV2X25ldygpOwogCi0JZGV2bGlzdCA9IHN5c2ZzX2dldF9idXNfZGV2aWNlcyh1YnVzKTsKLQlpZiAoIWRldmxpc3QpIHsKLQkJZXJyKCJjb3VsZCBub3QgZ2V0ICVzIGJ1cyBkZXZpY2VzOiAlcyIsIGJ1c190eXBlLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJZ290byBlcnJfb3V0OwotCX0KKwkvKiBDcmVhdGUgbGlidWRldiBkZXZpY2UgZW51bWVyYXRpb24uICovCisJZW51bWVyYXRlID0gdWRldl9lbnVtZXJhdGVfbmV3KHVkZXYpOwogCi0JLyogcmVtb3ZlIGludGVyZmFjZXMgYW5kIHJvb3QgaHVicyBmcm9tIGRldmljZSBsaXN0ICovCi0JZGxpc3RfZmlsdGVyX3NvcnQoZGV2bGlzdCwgaXNfZGV2aWNlLCBkZXZjbXApOworCS8qIFRha2Ugb25seSBVU0IgZGV2aWNlcyB0aGF0IGFyZSBub3QgaHVicyBhbmQgZG8gbm90IGhhdmUKKwkgKiB0aGUgYkludGVyZmFjZU51bWJlciBhdHRyaWJ1dGUsIGkuZS4gYXJlIG5vdCBpbnRlcmZhY2VzLgorCSAqLworCXVkZXZfZW51bWVyYXRlX2FkZF9tYXRjaF9zdWJzeXN0ZW0oZW51bWVyYXRlLCAidXNiIik7CisJdWRldl9lbnVtZXJhdGVfYWRkX25vbWF0Y2hfc3lzYXR0cihlbnVtZXJhdGUsICJiRGV2aWNlQ2xhc3MiLCAiMDkiKTsKKwl1ZGV2X2VudW1lcmF0ZV9hZGRfbm9tYXRjaF9zeXNhdHRyKGVudW1lcmF0ZSwgImJJbnRlcmZhY2VOdW1iZXIiLCBOVUxMKTsKKwl1ZGV2X2VudW1lcmF0ZV9zY2FuX2RldmljZXMoZW51bWVyYXRlKTsKIAotCWlmICghcGFyc2FibGUpIHsKLQkJcHJpbnRmKCJMb2NhbCBVU0IgZGV2aWNlc1xuIik7Ci0JCXByaW50ZigiPT09PT09PT09PT09PT09PT1cbiIpOwotCX0KLQlkbGlzdF9mb3JfZWFjaF9kYXRhKGRldmxpc3QsIGRldiwgc3RydWN0IHN5c2ZzX2RldmljZSkgewotCQlpZFZlbmRvciAgID0gc3lzZnNfZ2V0X2RldmljZV9hdHRyKGRldiwgImlkVmVuZG9yIik7Ci0JCWlkUHJvZHVjdCAgPSBzeXNmc19nZXRfZGV2aWNlX2F0dHIoZGV2LCAiaWRQcm9kdWN0Iik7Ci0JCWJDb25mVmFsdWUgPSBzeXNmc19nZXRfZGV2aWNlX2F0dHIoZGV2LCAiYkNvbmZpZ3VyYXRpb25WYWx1ZSIpOwotCQliTnVtSW50ZnMgID0gc3lzZnNfZ2V0X2RldmljZV9hdHRyKGRldiwgImJOdW1JbnRlcmZhY2VzIik7CisJZGV2aWNlcyA9IHVkZXZfZW51bWVyYXRlX2dldF9saXN0X2VudHJ5KGVudW1lcmF0ZSk7CisKKwkvKiBTaG93IGluZm9ybWF0aW9uIGFib3V0IGVhY2ggZGV2aWNlLiAqLworCXVkZXZfbGlzdF9lbnRyeV9mb3JlYWNoKGRldl9saXN0X2VudHJ5LCBkZXZpY2VzKSB7CisJCXBhdGggPSB1ZGV2X2xpc3RfZW50cnlfZ2V0X25hbWUoZGV2X2xpc3RfZW50cnkpOworCQlkZXYgPSB1ZGV2X2RldmljZV9uZXdfZnJvbV9zeXNwYXRoKHVkZXYsIHBhdGgpOworCisJCS8qIEdldCBkZXZpY2UgaW5mb3JtYXRpb24uICovCisJCWlkVmVuZG9yID0gdWRldl9kZXZpY2VfZ2V0X3N5c2F0dHJfdmFsdWUoZGV2LCAiaWRWZW5kb3IiKTsKKwkJaWRQcm9kdWN0ID0gdWRldl9kZXZpY2VfZ2V0X3N5c2F0dHJfdmFsdWUoZGV2LCAiaWRQcm9kdWN0Iik7CisJCWJDb25mVmFsdWUgPSB1ZGV2X2RldmljZV9nZXRfc3lzYXR0cl92YWx1ZShkZXYsICJiQ29uZmlndXJhdGlvblZhbHVlIik7CisJCWJOdW1JbnRmcyA9IHVkZXZfZGV2aWNlX2dldF9zeXNhdHRyX3ZhbHVlKGRldiwgImJOdW1JbnRlcmZhY2VzIik7CisJCWJ1c2lkID0gdWRldl9kZXZpY2VfZ2V0X3N5c25hbWUoZGV2KTsKIAkJaWYgKCFpZFZlbmRvciB8fCAhaWRQcm9kdWN0IHx8ICFiQ29uZlZhbHVlIHx8ICFiTnVtSW50ZnMpIHsKIAkJCWVycigicHJvYmxlbSBnZXR0aW5nIGRldmljZSBhdHRyaWJ1dGVzOiAlcyIsCiAJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKIAkJCWdvdG8gZXJyX291dDsKIAkJfQogCi0JCS8qIGdldCBwcm9kdWN0IG5hbWUgKi8KKwkJLyogR2V0IHByb2R1Y3QgbmFtZS4gKi8KIAkJdXNiaXBfbmFtZXNfZ2V0X3Byb2R1Y3QocHJvZHVjdF9uYW1lLCBzaXplb2YocHJvZHVjdF9uYW1lKSwKLQkJCQkJc3RydG9sKGlkVmVuZG9yLT52YWx1ZSwgTlVMTCwgMTYpLAotCQkJCQlzdHJ0b2woaWRQcm9kdWN0LT52YWx1ZSwgTlVMTCwgMTYpKTsKLQkJcHJpbnRfZGV2aWNlKGRldi0+YnVzX2lkLCBpZFZlbmRvci0+dmFsdWUsIGlkUHJvZHVjdC0+dmFsdWUsCi0JCQkgICAgIHBhcnNhYmxlKTsKKwkJCQkJc3RydG9sKGlkVmVuZG9yLCBOVUxMLCAxNiksCisJCQkJCXN0cnRvbChpZFByb2R1Y3QsIE5VTEwsIDE2KSk7CisKKwkJLyogUHJpbnQgaW5mb3JtYXRpb24uICovCisJCXByaW50X2RldmljZShidXNpZCwgaWRWZW5kb3IsIGlkUHJvZHVjdCwgcGFyc2FibGUpOwogCQlwcmludF9wcm9kdWN0X25hbWUocHJvZHVjdF9uYW1lLCBwYXJzYWJsZSk7CiAKLQkJZm9yIChpID0gMDsgaSA8IGF0b2koYk51bUludGZzLT52YWx1ZSk7IGkrKykgewotCQkJc25wcmludGYoYnVzaWQsIHNpemVvZihidXNpZCksICIlczolLjFzLiVkIiwKLQkJCQkgZGV2LT5idXNfaWQsIGJDb25mVmFsdWUtPnZhbHVlLCBpKTsKLQkJCWludGYgPSBzeXNmc19vcGVuX2RldmljZShidXNfdHlwZSwgYnVzaWQpOwotCQkJaWYgKCFpbnRmKSB7Ci0JCQkJZXJyKCJjb3VsZCBub3Qgb3BlbiBkZXZpY2UgaW50ZXJmYWNlOiAlcyIsCi0JCQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCQkJZ290byBlcnJfb3V0OwotCQkJfQotCQkJcHJpbnRfaW50ZXJmYWNlKGJ1c2lkLCBpbnRmLT5kcml2ZXJfbmFtZSwgcGFyc2FibGUpOwotCQkJc3lzZnNfY2xvc2VfZGV2aWNlKGludGYpOwotCQl9CiAJCXByaW50ZigiXG4iKTsKKworCQl1ZGV2X2RldmljZV91bnJlZihkZXYpOwogCX0KIAogCXJldCA9IDA7CiAKIGVycl9vdXQ6Ci0Jc3lzZnNfY2xvc2VfYnVzKHVidXMpOworCXVkZXZfZW51bWVyYXRlX3VucmVmKGVudW1lcmF0ZSk7CisJdWRldl91bnJlZih1ZGV2KTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF9uZXR3b3JrLmggYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF9uZXR3b3JrLmgKaW5kZXggZjE5YWUxOS4uYzFlODc1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfbmV0d29yay5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX25ldHdvcmsuaApAQCAtMTAsNyArMTAsNiBAQAogI2VuZGlmCiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXNmcy9saWJzeXNmcy5oPgogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX3VuYmluZC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfdW5iaW5kLmMKaW5kZXggZDVhOWFiNi4uYTRhNDk2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfdW5iaW5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfdW5iaW5kLmMKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAgKi8KIAotI2luY2x1ZGUgPHN5c2ZzL2xpYnN5c2ZzLmg+CisjaW5jbHVkZSA8bGlidWRldi5oPgogCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgInVzYmlwX2NvbW1vbi5oIgogI2luY2x1ZGUgInV0aWxzLmgiCiAjaW5jbHVkZSAidXNiaXAuaCIKKyNpbmNsdWRlICJzeXNmc191dGlscy5oIgogCiBzdGF0aWMgY29uc3QgY2hhciB1c2JpcF91bmJpbmRfdXNhZ2Vfc3RyaW5nW10gPQogCSJ1c2JpcCB1bmJpbmQgPGFyZ3M+XG4iCkBAIC00MSwxMTUgKzQyLDY5IEBACiBzdGF0aWMgaW50IHVuYmluZF9kZXZpY2UoY2hhciAqYnVzaWQpCiB7CiAJY2hhciBidXNfdHlwZVtdID0gInVzYiI7Ci0Jc3RydWN0IHN5c2ZzX2RyaXZlciAqdXNiaXBfaG9zdF9kcnY7Ci0Jc3RydWN0IHN5c2ZzX2RldmljZSAqZGV2OwotCXN0cnVjdCBkbGlzdCAqZGV2bGlzdDsKLQlpbnQgdmVyaWZpZWQgPSAwOwogCWludCByYywgcmV0ID0gLTE7CiAKLQljaGFyIGF0dHJfbmFtZVtdID0gImJDb25maWd1cmF0aW9uVmFsdWUiOwotCWNoYXIgc3lzZnNfbW50cGF0aFtTWVNGU19QQVRIX01BWF07Ci0JY2hhciBidXNpZF9hdHRyX3BhdGhbU1lTRlNfUEFUSF9NQVhdOwotCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKmJ1c2lkX2F0dHI7Ci0JY2hhciAqdmFsID0gTlVMTDsKLQlpbnQgbGVuOworCWNoYXIgdW5iaW5kX2F0dHJfbmFtZVtdID0gInVuYmluZCI7CisJY2hhciB1bmJpbmRfYXR0cl9wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKKwljaGFyIHJlYmluZF9hdHRyX25hbWVbXSA9ICJyZWJpbmQiOworCWNoYXIgcmViaW5kX2F0dHJfcGF0aFtTWVNGU19QQVRIX01BWF07CiAKLQkvKiB2ZXJpZnkgdGhlIGJ1c2lkIGRldmljZSBpcyB1c2luZyB1c2JpcC1ob3N0ICovCi0JdXNiaXBfaG9zdF9kcnYgPSBzeXNmc19vcGVuX2RyaXZlcihidXNfdHlwZSwgVVNCSVBfSE9TVF9EUlZfTkFNRSk7Ci0JaWYgKCF1c2JpcF9ob3N0X2RydikgewotCQllcnIoImNvdWxkIG5vdCBvcGVuICVzIGRyaXZlcjogJXMiLCBVU0JJUF9IT1NUX0RSVl9OQU1FLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOworCXN0cnVjdCB1ZGV2ICp1ZGV2OworCXN0cnVjdCB1ZGV2X2RldmljZSAqZGV2OworCWNvbnN0IGNoYXIgKmRyaXZlcjsKKworCS8qIENyZWF0ZSBsaWJ1ZGV2IGNvbnRleHQuICovCisJdWRldiA9IHVkZXZfbmV3KCk7CisKKwkvKiBDaGVjayB3aGV0aGVyIHRoZSBkZXZpY2Ugd2l0aCB0aGlzIGJ1cyBJRCBleGlzdHMuICovCisJZGV2ID0gdWRldl9kZXZpY2VfbmV3X2Zyb21fc3Vic3lzdGVtX3N5c25hbWUodWRldiwgInVzYiIsIGJ1c2lkKTsKKwlpZiAoIWRldikgeworCQllcnIoImRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgYnVzIElEIGRvZXMgbm90IGV4aXN0Iik7CisJCWdvdG8gZXJyX2Nsb3NlX3VkZXY7CiAJfQogCi0JZGV2bGlzdCA9IHN5c2ZzX2dldF9kcml2ZXJfZGV2aWNlcyh1c2JpcF9ob3N0X2Rydik7Ci0JaWYgKCFkZXZsaXN0KSB7Ci0JCWVycigiJXMgaXMgbm90IGluIHVzZSBieSBhbnkgZGV2aWNlcyIsIFVTQklQX0hPU1RfRFJWX05BTUUpOwotCQlnb3RvIGVycl9jbG9zZV91c2JpcF9ob3N0X2RydjsKKwkvKiBDaGVjayB3aGV0aGVyIHRoZSBkZXZpY2UgaXMgdXNpbmcgdXNiaXAtaG9zdCBkcml2ZXIuICovCisJZHJpdmVyID0gdWRldl9kZXZpY2VfZ2V0X2RyaXZlcihkZXYpOworCWlmICghZHJpdmVyIHx8IHN0cmNtcChkcml2ZXIsICJ1c2JpcC1ob3N0IikpIHsKKwkJZXJyKCJkZXZpY2UgaXMgbm90IGJvdW5kIHRvIHVzYmlwLWhvc3QgZHJpdmVyIik7CisJCWdvdG8gZXJyX2Nsb3NlX3VkZXY7CiAJfQogCi0JZGxpc3RfZm9yX2VhY2hfZGF0YShkZXZsaXN0LCBkZXYsIHN0cnVjdCBzeXNmc19kZXZpY2UpIHsKLQkJaWYgKCFzdHJuY21wKGJ1c2lkLCBkZXYtPm5hbWUsIHN0cmxlbihidXNpZCkpICYmCi0JCSAgICAhc3RybmNtcChkZXYtPmRyaXZlcl9uYW1lLCBVU0JJUF9IT1NUX0RSVl9OQU1FLAotCQkJICAgICBzdHJsZW4oVVNCSVBfSE9TVF9EUlZfTkFNRSkpKSB7Ci0JCQl2ZXJpZmllZCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCX0KKwkvKiBVbmJpbmQgZGV2aWNlIGZyb20gZHJpdmVyLiAqLworCXNucHJpbnRmKHVuYmluZF9hdHRyX3BhdGgsIHNpemVvZih1bmJpbmRfYXR0cl9wYXRoKSwgIiVzLyVzLyVzLyVzLyVzLyVzIiwKKwkJIFNZU0ZTX01OVF9QQVRILCBTWVNGU19CVVNfTkFNRSwgYnVzX3R5cGUsIFNZU0ZTX0RSSVZFUlNfTkFNRSwKKwkJIFVTQklQX0hPU1RfRFJWX05BTUUsIHVuYmluZF9hdHRyX25hbWUpOwogCi0JaWYgKCF2ZXJpZmllZCkgewotCQllcnIoImRldmljZSBvbiBidXNpZCAlcyBpcyBub3QgdXNpbmcgJXMiLCBidXNpZCwKLQkJICAgIFVTQklQX0hPU1RfRFJWX05BTUUpOwotCQlnb3RvIGVycl9jbG9zZV91c2JpcF9ob3N0X2RydjsKLQl9Ci0KLQkvKgotCSAqIE5PVEU6IEEgcmVhZCBhbmQgd3JpdGUgb2YgYW4gYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBkZXZpY2UgYnVzaWQKLQkgKiByZWZlcnMgdG8gbXVzdCBiZSBkb25lIHRvIHN0YXJ0IHByb2JpbmcuIFRoYXQgd2F5IGEgcmViaW5kIG9mIHRoZQotCSAqIGRlZmF1bHQgZHJpdmVyIGZvciB0aGUgZGV2aWNlIG9jY3Vycy4KLQkgKgotCSAqIFRoaXMgc2VlbXMgdmVyeSBoYWNraXNoIGFuZCBhZGRzIGEgbG90IG9mIHBvaW50bGVzcyBjb2RlLiBJIHRoaW5rIGl0Ci0JICogc2hvdWxkIGJlIGRvbmUgaW4gdGhlIGtlcm5lbCBieSB0aGUgZHJpdmVyIGFmdGVyIGRlbF9tYXRjaF9idXNpZCBpcwotCSAqIGZpbmlzaGVkIQotCSAqLwotCi0JcmMgPSBzeXNmc19nZXRfbW50X3BhdGgoc3lzZnNfbW50cGF0aCwgU1lTRlNfUEFUSF9NQVgpOworCXJjID0gd3JpdGVfc3lzZnNfYXR0cmlidXRlKHVuYmluZF9hdHRyX3BhdGgsIGJ1c2lkLCBzdHJsZW4oYnVzaWQpKTsKIAlpZiAocmMgPCAwKSB7Ci0JCWVycigic3lzZnMgbXVzdCBiZSBtb3VudGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAtMTsKKwkJZXJyKCJlcnJvciB1bmJpbmRpbmcgZGV2aWNlICVzIGZyb20gZHJpdmVyIiwgYnVzaWQpOworCQlnb3RvIGVycl9jbG9zZV91ZGV2OwogCX0KIAotCXNucHJpbnRmKGJ1c2lkX2F0dHJfcGF0aCwgc2l6ZW9mKGJ1c2lkX2F0dHJfcGF0aCksICIlcy8lcy8lcy8lcy8lcy8lcyIsCi0JCSBzeXNmc19tbnRwYXRoLCBTWVNGU19CVVNfTkFNRSwgYnVzX3R5cGUsIFNZU0ZTX0RFVklDRVNfTkFNRSwKLQkJIGJ1c2lkLCBhdHRyX25hbWUpOwotCi0JLyogcmVhZCBhIGRldmljZSBhdHRyaWJ1dGUgKi8KLQlidXNpZF9hdHRyID0gc3lzZnNfb3Blbl9hdHRyaWJ1dGUoYnVzaWRfYXR0cl9wYXRoKTsKLQlpZiAoIWJ1c2lkX2F0dHIpIHsKLQkJZXJyKCJjb3VsZCBub3Qgb3BlbiAlcy8lczogJXMiLCBidXNpZCwgYXR0cl9uYW1lLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChzeXNmc19yZWFkX2F0dHJpYnV0ZShidXNpZF9hdHRyKSA8IDApIHsKLQkJZXJyKCJwcm9ibGVtIHJlYWRpbmcgYXR0cmlidXRlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQlsZW4gPSBidXNpZF9hdHRyLT5sZW47Ci0JdmFsID0gbWFsbG9jKGxlbik7Ci0JKnZhbCA9ICpidXNpZF9hdHRyLT52YWx1ZTsKLQlzeXNmc19jbG9zZV9hdHRyaWJ1dGUoYnVzaWRfYXR0cik7Ci0KLQkvKiBub3RpZnkgZHJpdmVyIG9mIHVuYmluZCAqLworCS8qIE5vdGlmeSBkcml2ZXIgb2YgdW5iaW5kLiAqLwogCXJjID0gbW9kaWZ5X21hdGNoX2J1c2lkKGJ1c2lkLCAwKTsKIAlpZiAocmMgPCAwKSB7CiAJCWVycigidW5hYmxlIHRvIHVuYmluZCBkZXZpY2Ugb24gJXMiLCBidXNpZCk7Ci0JCWdvdG8gZXJyX291dDsKKwkJZ290byBlcnJfY2xvc2VfdWRldjsKIAl9CiAKLQkvKiB3cml0ZSB0aGUgZGV2aWNlIGF0dHJpYnV0ZSAqLwotCWJ1c2lkX2F0dHIgPSBzeXNmc19vcGVuX2F0dHJpYnV0ZShidXNpZF9hdHRyX3BhdGgpOwotCWlmICghYnVzaWRfYXR0cikgewotCQllcnIoImNvdWxkIG5vdCBvcGVuICVzLyVzOiAlcyIsIGJ1c2lkLCBhdHRyX25hbWUsCi0JCSAgICBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQorCS8qIFRyaWdnZXIgbmV3IHByb2JpbmcuICovCisJc25wcmludGYocmViaW5kX2F0dHJfcGF0aCwgc2l6ZW9mKHVuYmluZF9hdHRyX3BhdGgpLCAiJXMvJXMvJXMvJXMvJXMvJXMiLAorCQkJU1lTRlNfTU5UX1BBVEgsIFNZU0ZTX0JVU19OQU1FLCBidXNfdHlwZSwgU1lTRlNfRFJJVkVSU19OQU1FLAorCQkJVVNCSVBfSE9TVF9EUlZfTkFNRSwgcmViaW5kX2F0dHJfbmFtZSk7CiAKLQlyYyA9IHN5c2ZzX3dyaXRlX2F0dHJpYnV0ZShidXNpZF9hdHRyLCB2YWwsIGxlbik7CisJcmMgPSB3cml0ZV9zeXNmc19hdHRyaWJ1dGUocmViaW5kX2F0dHJfcGF0aCwgYnVzaWQsIHN0cmxlbihidXNpZCkpOwogCWlmIChyYyA8IDApIHsKLQkJZXJyKCJwcm9ibGVtIHdyaXRpbmcgYXR0cmlidXRlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCWdvdG8gZXJyX291dDsKKwkJZXJyKCJlcnJvciByZWJpbmRpbmciKTsKKwkJZ290byBlcnJfY2xvc2VfdWRldjsKIAl9Ci0Jc3lzZnNfY2xvc2VfYXR0cmlidXRlKGJ1c2lkX2F0dHIpOwogCiAJcmV0ID0gMDsKLQlwcmludGYoInVuYmluZCBkZXZpY2Ugb24gYnVzaWQgJXM6IGNvbXBsZXRlXG4iLCBidXNpZCk7CisJaW5mbygidW5iaW5kIGRldmljZSBvbiBidXNpZCAlczogY29tcGxldGUiLCBidXNpZCk7CiAKLWVycl9vdXQ6Ci0JZnJlZSh2YWwpOwotZXJyX2Nsb3NlX3VzYmlwX2hvc3RfZHJ2OgotCXN5c2ZzX2Nsb3NlX2RyaXZlcih1c2JpcF9ob3N0X2Rydik7CitlcnJfY2xvc2VfdWRldjoKKwl1ZGV2X2RldmljZV91bnJlZihkZXYpOworCXVkZXZfdW5yZWYodWRldik7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBkLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcGQuYwppbmRleCA3OTgwZjhiLi4yY2FlNGNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcGQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcGQuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgInVzYmlwX2hvc3RfZHJpdmVyLmgiCiAjaW5jbHVkZSAidXNiaXBfY29tbW9uLmgiCiAjaW5jbHVkZSAidXNiaXBfbmV0d29yay5oIgorI2luY2x1ZGUgImxpc3QuaCIKIAogI3VuZGVmICBQUk9HTkFNRQogI2RlZmluZSBQUk9HTkFNRSAidXNiaXBkIgpAQCAtOTMsNiArOTQsNyBAQAogCXN0cnVjdCBvcF9jb21tb24gcmVwbHk7CiAJc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSAqZWRldjsKIAlzdHJ1Y3QgdXNiaXBfdXNiX2RldmljZSBwZHVfdWRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICppOwogCWludCBmb3VuZCA9IDA7CiAJaW50IGVycm9yID0gMDsKIAlpbnQgcmM7CkBAIC0xMDcsOCArMTA5LDggQEAKIAl9CiAJUEFDS19PUF9JTVBPUlRfUkVRVUVTVCgwLCAmcmVxKTsKIAotCWRsaXN0X2Zvcl9lYWNoX2RhdGEoaG9zdF9kcml2ZXItPmVkZXZfbGlzdCwgZWRldiwKLQkJCSAgICBzdHJ1Y3QgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlKSB7CisJbGlzdF9mb3JfZWFjaChpLCAmaG9zdF9kcml2ZXItPmVkZXZfbGlzdCkgeworCQllZGV2ID0gbGlzdF9lbnRyeShpLCBzdHJ1Y3QgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlLCBub2RlKTsKIAkJaWYgKCFzdHJuY21wKHJlcS5idXNpZCwgZWRldi0+dWRldi5idXNpZCwgU1lTRlNfQlVTX0lEX1NJWkUpKSB7CiAJCQlpbmZvKCJmb3VuZCByZXF1ZXN0ZWQgZGV2aWNlOiAlcyIsIHJlcS5idXNpZCk7CiAJCQlmb3VuZCA9IDE7CkBAIC0xNjEsMTMgKzE2MywxMiBAQAogCXN0cnVjdCB1c2JpcF91c2JfZGV2aWNlIHBkdV91ZGV2OwogCXN0cnVjdCB1c2JpcF91c2JfaW50ZXJmYWNlIHBkdV91aW5mOwogCXN0cnVjdCBvcF9kZXZsaXN0X3JlcGx5IHJlcGx5OwotCWludCBpOwotCWludCByYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpqOworCWludCByYywgaTsKIAogCXJlcGx5Lm5kZXYgPSAwOwogCS8qIG51bWJlciBvZiBleHBvcnRlZCBkZXZpY2VzICovCi0JZGxpc3RfZm9yX2VhY2hfZGF0YShob3N0X2RyaXZlci0+ZWRldl9saXN0LCBlZGV2LAotCQkJICAgIHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UpIHsKKwlsaXN0X2Zvcl9lYWNoKGosICZob3N0X2RyaXZlci0+ZWRldl9saXN0KSB7CiAJCXJlcGx5Lm5kZXYgKz0gMTsKIAl9CiAJaW5mbygiZXhwb3J0YWJsZSBkZXZpY2VzOiAlZCIsIHJlcGx5Lm5kZXYpOwpAQCAtMTg1LDggKzE4Niw4IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlkbGlzdF9mb3JfZWFjaF9kYXRhKGhvc3RfZHJpdmVyLT5lZGV2X2xpc3QsIGVkZXYsCi0JCQkgICAgc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSkgeworCWxpc3RfZm9yX2VhY2goaiwgJmhvc3RfZHJpdmVyLT5lZGV2X2xpc3QpIHsKKwkJZWRldiA9IGxpc3RfZW50cnkoaiwgc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSwgbm9kZSk7CiAJCWR1bXBfdXNiX2RldmljZSgmZWRldi0+dWRldik7CiAJCW1lbWNweSgmcGR1X3VkZXYsICZlZGV2LT51ZGV2LCBzaXplb2YocGR1X3VkZXYpKTsKIAkJdXNiaXBfbmV0X3BhY2tfdXNiX2RldmljZSgxLCAmcGR1X3VkZXYpOwpAQCAtMjAzLDkgKzIwNCw5IEBACiAJCQl1c2JpcF9uZXRfcGFja191c2JfaW50ZXJmYWNlKDEsICZwZHVfdWluZik7CiAKIAkJCXJjID0gdXNiaXBfbmV0X3NlbmQoY29ubmZkLCAmcGR1X3VpbmYsCi0JCQkJCSAgICBzaXplb2YocGR1X3VpbmYpKTsKKwkJCQkJc2l6ZW9mKHBkdV91aW5mKSk7CiAJCQlpZiAocmMgPCAwKSB7Ci0JCQkJZGJnKCJ1c2JpcF9uZXRfc2VuZCBmYWlsZWQ6IHBkdV91aW5mIik7CisJCQkJZXJyKCJ1c2JpcF9uZXRfc2VuZCBmYWlsZWQ6IHBkdV91aW5mIik7CiAJCQkJcmV0dXJuIC0xOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91dGlscy5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXRpbHMuYwppbmRleCAyZDQ5NjZlLi4yYjNkNmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91dGlscy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3V0aWxzLmMKQEAgLTE2LDYxICsxNiwzNyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCi0jaW5jbHVkZSA8c3lzZnMvbGlic3lzZnMuaD4KLQogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgInVzYmlwX2NvbW1vbi5oIgogI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAic3lzZnNfdXRpbHMuaCIKIAogaW50IG1vZGlmeV9tYXRjaF9idXNpZChjaGFyICpidXNpZCwgaW50IGFkZCkKIHsKLQljaGFyIGJ1c190eXBlW10gPSAidXNiIjsKIAljaGFyIGF0dHJfbmFtZVtdID0gIm1hdGNoX2J1c2lkIjsKLQljaGFyIGJ1ZmZbU1lTRlNfQlVTX0lEX1NJWkUgKyA0XTsKLQljaGFyIHN5c2ZzX21udHBhdGhbU1lTRlNfUEFUSF9NQVhdOworCWNoYXIgY29tbWFuZFtTWVNGU19CVVNfSURfU0laRSArIDRdOwogCWNoYXIgbWF0Y2hfYnVzaWRfYXR0cl9wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICptYXRjaF9idXNpZF9hdHRyOwotCWludCByYywgcmV0ID0gMDsKLQotCWlmIChzdHJubGVuKGJ1c2lkLCBTWVNGU19CVVNfSURfU0laRSkgPiBTWVNGU19CVVNfSURfU0laRSAtIDEpIHsKLQkJZGJnKCJidXNpZCBpcyB0b28gbG9uZyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmMgPSBzeXNmc19nZXRfbW50X3BhdGgoc3lzZnNfbW50cGF0aCwgU1lTRlNfUEFUSF9NQVgpOwotCWlmIChyYyA8IDApIHsKLQkJZXJyKCJzeXNmcyBtdXN0IGJlIG1vdW50ZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KKwlpbnQgcmM7CiAKIAlzbnByaW50ZihtYXRjaF9idXNpZF9hdHRyX3BhdGgsIHNpemVvZihtYXRjaF9idXNpZF9hdHRyX3BhdGgpLAotCQkgIiVzLyVzLyVzLyVzLyVzLyVzIiwgc3lzZnNfbW50cGF0aCwgU1lTRlNfQlVTX05BTUUsIGJ1c190eXBlLAotCQkgU1lTRlNfRFJJVkVSU19OQU1FLCBVU0JJUF9IT1NUX0RSVl9OQU1FLCBhdHRyX25hbWUpOworCQkgIiVzLyVzLyVzLyVzLyVzLyVzIiwgU1lTRlNfTU5UX1BBVEgsIFNZU0ZTX0JVU19OQU1FLAorCQkgU1lTRlNfQlVTX1RZUEUsIFNZU0ZTX0RSSVZFUlNfTkFNRSwgVVNCSVBfSE9TVF9EUlZfTkFNRSwKKwkJIGF0dHJfbmFtZSk7CiAKLQltYXRjaF9idXNpZF9hdHRyID0gc3lzZnNfb3Blbl9hdHRyaWJ1dGUobWF0Y2hfYnVzaWRfYXR0cl9wYXRoKTsKLQlpZiAoIW1hdGNoX2J1c2lkX2F0dHIpIHsKLQkJZGJnKCJwcm9ibGVtIGdldHRpbmcgbWF0Y2hfYnVzaWQgYXR0cmlidXRlOiAlcyIsCi0JCSAgICBzdHJlcnJvcihlcnJubykpOworCWlmIChhZGQpCisJCXNucHJpbnRmKGNvbW1hbmQsIFNZU0ZTX0JVU19JRF9TSVpFICsgNCwgImFkZCAlcyIsIGJ1c2lkKTsKKwllbHNlCisJCXNucHJpbnRmKGNvbW1hbmQsIFNZU0ZTX0JVU19JRF9TSVpFICsgNCwgImRlbCAlcyIsIGJ1c2lkKTsKKworCXJjID0gd3JpdGVfc3lzZnNfYXR0cmlidXRlKG1hdGNoX2J1c2lkX2F0dHJfcGF0aCwgY29tbWFuZCwKKwkJCQkgICBzaXplb2YoY29tbWFuZCkpOworCWlmIChyYyA8IDApIHsKKwkJZGJnKCJmYWlsZWQgdG8gd3JpdGUgbWF0Y2hfYnVzaWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWlmIChhZGQpCi0JCXNucHJpbnRmKGJ1ZmYsIFNZU0ZTX0JVU19JRF9TSVpFICsgNCwgImFkZCAlcyIsIGJ1c2lkKTsKLQllbHNlCi0JCXNucHJpbnRmKGJ1ZmYsIFNZU0ZTX0JVU19JRF9TSVpFICsgNCwgImRlbCAlcyIsIGJ1c2lkKTsKLQotCWRiZygid3JpdGUgXCIlc1wiIHRvICVzIiwgYnVmZiwgbWF0Y2hfYnVzaWRfYXR0ci0+cGF0aCk7Ci0KLQlyYyA9IHN5c2ZzX3dyaXRlX2F0dHJpYnV0ZShtYXRjaF9idXNpZF9hdHRyLCBidWZmLCBzaXplb2YoYnVmZikpOwotCWlmIChyYyA8IDApIHsKLQkJZGJnKCJmYWlsZWQgdG8gd3JpdGUgbWF0Y2hfYnVzaWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0ID0gLTE7Ci0JfQotCi0Jc3lzZnNfY2xvc2VfYXR0cmlidXRlKG1hdGNoX2J1c2lkX2F0dHIpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX2hjZC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMKaW5kZXggNzIzOTFlZi4uMWU4NDU3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMKQEAgLTIwNSw4ICsyMDUsNiBAQAogCQl9CiAJfQogCi0JcHJfaW5mbygiY2hhbmdlZCAlZFxuIiwgY2hhbmdlZCk7Ci0KIAlpZiAoKGhjZC0+c3RhdGUgPT0gSENfU1RBVEVfU1VTUEVOREVEKSAmJiAoY2hhbmdlZCA9PSAxKSkKIAkJdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIoaGNkKTsKIApAQCAtMjczLDE0ICsyNzEsMTQgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFVTQl9QT1JUX0ZFQVRfUE9XRVI6Ci0JCQl1c2JpcF9kYmdfdmhjaV9yaCgiIENsZWFyUG9ydEZlYXR1cmU6ICIKLQkJCQkJICAiVVNCX1BPUlRfRkVBVF9QT1dFUlxuIik7CisJCQl1c2JpcF9kYmdfdmhjaV9yaCgKKwkJCQkiIENsZWFyUG9ydEZlYXR1cmU6IFVTQl9QT1JUX0ZFQVRfUE9XRVJcbiIpOwogCQkJZHVtLT5wb3J0X3N0YXR1c1tyaHBvcnRdID0gMDsKIAkJCWR1bS0+cmVzdW1pbmcgPSAwOwogCQkJYnJlYWs7CiAJCWNhc2UgVVNCX1BPUlRfRkVBVF9DX1JFU0VUOgotCQkJdXNiaXBfZGJnX3ZoY2lfcmgoIiBDbGVhclBvcnRGZWF0dXJlOiAiCi0JCQkJCSAgIlVTQl9QT1JUX0ZFQVRfQ19SRVNFVFxuIik7CisJCQl1c2JpcF9kYmdfdmhjaV9yaCgKKwkJCQkiIENsZWFyUG9ydEZlYXR1cmU6IFVTQl9QT1JUX0ZFQVRfQ19SRVNFVFxuIik7CiAJCQlzd2l0Y2ggKGR1bS0+dmRldltyaHBvcnRdLnNwZWVkKSB7CiAJCQljYXNlIFVTQl9TUEVFRF9ISUdIOgogCQkJCWR1bS0+cG9ydF9zdGF0dXNbcmhwb3J0XSB8PQpAQCAtMzM5LDE2ICszMzcsMTcgQEAKIAogCQkJaWYgKGR1bS0+dmRldltyaHBvcnRdLnVkLnN0YXR1cyA9PQogCQkJICAgIFZERVZfU1RfTk9UQVNTSUdORUQpIHsKLQkJCQl1c2JpcF9kYmdfdmhjaV9yaCgiIGVuYWJsZSByaHBvcnQgJWQgIgotCQkJCQkJICAiKHN0YXR1cyAldSlcbiIsCi0JCQkJCQkgIHJocG9ydCwKLQkJCQkJCSAgZHVtLT52ZGV2W3JocG9ydF0udWQuc3RhdHVzKTsKKwkJCQl1c2JpcF9kYmdfdmhjaV9yaCgKKwkJCQkJIiBlbmFibGUgcmhwb3J0ICVkIChzdGF0dXMgJXUpXG4iLAorCQkJCQlyaHBvcnQsCisJCQkJCWR1bS0+dmRldltyaHBvcnRdLnVkLnN0YXR1cyk7CiAJCQkJZHVtLT5wb3J0X3N0YXR1c1tyaHBvcnRdIHw9CiAJCQkJCVVTQl9QT1JUX1NUQVRfRU5BQkxFOwogCQkJfQogCQl9CiAJCSgoX19sZTE2ICopIGJ1ZilbMF0gPSBjcHVfdG9fbGUxNihkdW0tPnBvcnRfc3RhdHVzW3JocG9ydF0pOwotCQkoKF9fbGUxNiAqKSBidWYpWzFdID0gY3B1X3RvX2xlMTYoZHVtLT5wb3J0X3N0YXR1c1tyaHBvcnRdID4+IDE2KTsKKwkJKChfX2xlMTYgKikgYnVmKVsxXSA9CisJCQljcHVfdG9fbGUxNihkdW0tPnBvcnRfc3RhdHVzW3JocG9ydF0gPj4gMTYpOwogCiAJCXVzYmlwX2RiZ192aGNpX3JoKCIgR2V0UG9ydFN0YXR1cyBieWUgJXggJXhcbiIsICgodTE2ICopYnVmKVswXSwKIAkJCQkgICgodTE2ICopYnVmKVsxXSk7CkBAIC0zNjAsMTIgKzM1OSwxMiBAQAogCWNhc2UgU2V0UG9ydEZlYXR1cmU6CiAJCXN3aXRjaCAod1ZhbHVlKSB7CiAJCWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgotCQkJdXNiaXBfZGJnX3ZoY2lfcmgoIiBTZXRQb3J0RmVhdHVyZTogIgotCQkJCQkgICJVU0JfUE9SVF9GRUFUX1NVU1BFTkRcbiIpOworCQkJdXNiaXBfZGJnX3ZoY2lfcmgoCisJCQkJIiBTZXRQb3J0RmVhdHVyZTogVVNCX1BPUlRfRkVBVF9TVVNQRU5EXG4iKTsKIAkJCWJyZWFrOwogCQljYXNlIFVTQl9QT1JUX0ZFQVRfUkVTRVQ6Ci0JCQl1c2JpcF9kYmdfdmhjaV9yaCgiIFNldFBvcnRGZWF0dXJlOiAiCi0JCQkJCSAgIlVTQl9QT1JUX0ZFQVRfUkVTRVRcbiIpOworCQkJdXNiaXBfZGJnX3ZoY2lfcmgoCisJCQkJIiBTZXRQb3J0RmVhdHVyZTogVVNCX1BPUlRfRkVBVF9SRVNFVFxuIik7CiAJCQkvKiBpZiBpdCdzIGFscmVhZHkgcnVubmluZywgZGlzY29ubmVjdCBmaXJzdCAqLwogCQkJaWYgKGR1bS0+cG9ydF9zdGF0dXNbcmhwb3J0XSAmIFVTQl9QT1JUX1NUQVRfRU5BQkxFKSB7CiAJCQkJZHVtLT5wb3J0X3N0YXR1c1tyaHBvcnRdICY9CkBAIC01MzcsOSArNTM2LDggQEAKIAogCQljYXNlIFVTQl9SRVFfR0VUX0RFU0NSSVBUT1I6CiAJCQlpZiAoY3RybHJlcS0+d1ZhbHVlID09IGNwdV90b19sZTE2KFVTQl9EVF9ERVZJQ0UgPDwgOCkpCi0JCQkJdXNiaXBfZGJnX3ZoY2lfaGMoIk5vdCB5ZXQ/OiAiCi0JCQkJCQkgICJHZXRfRGVzY3JpcHRvciB0byBkZXZpY2UgMCAiCi0JCQkJCQkgICIoZ2V0IG1heCBwaXBlIHNpemUpXG4iKTsKKwkJCQl1c2JpcF9kYmdfdmhjaV9oYygKKwkJCQkJIk5vdCB5ZXQ/OkdldF9EZXNjcmlwdG9yIHRvIGRldmljZSAwIChnZXQgbWF4IHBpcGUgc2l6ZSlcbiIpOwogCiAJCQlpZiAodmRldi0+dWRldikKIAkJCQl1c2JfcHV0X2Rldih2ZGV2LT51ZGV2KTsKQEAgLTU0OCw4ICs1NDYsOSBAQAogCiAJCWRlZmF1bHQ6CiAJCQkvKiBOT1QgUkVBQ0hFRCAqLwotCQkJZGV2X2VycihkZXYsICJpbnZhbGlkIHJlcXVlc3QgdG8gZGV2bnVtIDAgYlJlcXVlc3QgJXUsICIKLQkJCQkid1ZhbHVlICV1XG4iLCBjdHJscmVxLT5iUmVxdWVzdCwKKwkJCWRldl9lcnIoZGV2LAorCQkJCSJpbnZhbGlkIHJlcXVlc3QgdG8gZGV2bnVtIDAgYlJlcXVlc3QgJXUsIHdWYWx1ZSAldVxuIiwKKwkJCQljdHJscmVxLT5iUmVxdWVzdCwKIAkJCQljdHJscmVxLT53VmFsdWUpOwogCQkJcmV0ID0gIC1FSU5WQUw7CiAJCQlnb3RvIG5vX25lZWRfeG1pdDsKQEAgLTEwNzAsOCArMTA2OSw5IEBACiAJc3Bpbl91bmxvY2soJnRoZV9jb250cm9sbGVyLT5sb2NrKTsKIAogCWlmIChjb25uZWN0ZWQgPiAwKSB7Ci0JCWRldl9pbmZvKCZwZGV2LT5kZXYsICJXZSBoYXZlICVkIGFjdGl2ZSBjb25uZWN0aW9uJXMuIERvIG5vdCAiCi0JCQkgInN1c3BlbmQuXG4iLCBjb25uZWN0ZWQsIChjb25uZWN0ZWQgPT0gMSA/ICIiIDogInMiKSk7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkgIldlIGhhdmUgJWQgYWN0aXZlIGNvbm5lY3Rpb24lcy4gRG8gbm90IHN1c3BlbmQuXG4iLAorCQkJIGNvbm5lY3RlZCwgKGNvbm5lY3RlZCA9PSAxID8gIiIgOiAicyIpKTsKIAkJcmV0ID0gIC1FQlVTWTsKIAl9IGVsc2UgewogCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAic3VzcGVuZCB2aGNpX2hjZCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfc3lzZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX3N5c2ZzLmMKaW5kZXggMDE0MWJjMy4uZTA5ODAzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfc3lzZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9zeXNmcy5jCkBAIC00Nyw4ICs0Nyw4IEBACiAJICogdXAgL3Byb2MvbmV0L3t0Y3AsdGNwNn0uIEFsc28sIGEgdXNlcmxhbmQgcHJvZ3JhbSBtYXkgcmVtZW1iZXIgYQogCSAqIHBvcnQgbnVtYmVyIGFuZCBpdHMgcGVlciBJUCBhZGRyZXNzLgogCSAqLwotCW91dCArPSBzcHJpbnRmKG91dCwgInBydCBzdGEgc3BkIGJ1cyBkZXYgc29ja2V0ICAgICAgICAgICAiCi0JCSAgICAgICAibG9jYWxfYnVzaWRcbiIpOworCW91dCArPSBzcHJpbnRmKG91dCwKKwkJICAgICAgICJwcnQgc3RhIHNwZCBidXMgZGV2IHNvY2tldCAgICAgICAgICAgbG9jYWxfYnVzaWRcbiIpOwogCiAJZm9yIChpID0gMDsgaSA8IFZIQ0lfTlBPUlRTOyBpKyspIHsKIAkJc3RydWN0IHZoY2lfZGV2aWNlICp2ZGV2ID0gcG9ydF90b192ZGV2KGkpOwpAQCAtMTE0LDcgKzExNCw4IEBACiAJaW50IGVycjsKIAlfX3UzMiByaHBvcnQgPSAwOwogCi0Jc3NjYW5mKGJ1ZiwgIiV1IiwgJnJocG9ydCk7CisJaWYgKHNzY2FuZihidWYsICIldSIsICZyaHBvcnQpICE9IDEpCisJCXJldHVybiAtRUlOVkFMOwogCiAJLyogY2hlY2sgcmhwb3J0ICovCiAJaWYgKHJocG9ydCA+PSBWSENJX05QT1JUUykgewpAQCAtMTgyLDcgKzE4Myw4IEBACiAJICogQGRldmlkOiB1bmlxdWUgZGV2aWNlIGlkZW50aWZpZXIgaW4gYSByZW1vdGUgaG9zdAogCSAqIEBzcGVlZDogdXNiIGRldmljZSBzcGVlZCBpbiBhIHJlbW90ZSBob3N0CiAJICovCi0Jc3NjYW5mKGJ1ZiwgIiV1ICV1ICV1ICV1IiwgJnJocG9ydCwgJnNvY2tmZCwgJmRldmlkLCAmc3BlZWQpOworCWlmIChzc2NhbmYoYnVmLCAiJXUgJXUgJXUgJXUiLCAmcmhwb3J0LCAmc29ja2ZkLCAmZGV2aWQsICZzcGVlZCkgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAl1c2JpcF9kYmdfdmhjaV9zeXNmcygicmhwb3J0KCV1KSBzb2NrZmQoJXUpIGRldmlkKCV1KSBzcGVlZCgldSlcbiIsCiAJCQkgICAgIHJocG9ydCwgc29ja2ZkLCBkZXZpZCwgc3BlZWQpOwpAQCAtMjE1LDggKzIxNyw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWRldl9pbmZvKGRldiwgInJocG9ydCgldSkgc29ja2ZkKCVkKSBkZXZpZCgldSkgc3BlZWQoJXUpXG4iLAotCQkgcmhwb3J0LCBzb2NrZmQsIGRldmlkLCBzcGVlZCk7CisJZGV2X2luZm8oZGV2LAorCQkgInJocG9ydCgldSkgc29ja2ZkKCVkKSBkZXZpZCgldSkgc3BlZWQoJXUpIHNwZWVkX3N0ciglcylcbiIsCisJCSByaHBvcnQsIHNvY2tmZCwgZGV2aWQsIHNwZWVkLCB1c2Jfc3BlZWRfc3RyaW5nKHNwZWVkKSk7CiAKIAl2ZGV2LT5kZXZpZCAgICAgICAgID0gZGV2aWQ7CiAJdmRldi0+c3BlZWQgICAgICAgICA9IHNwZWVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS84MDIxMW1nci5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS84MDIxMW1nci5jCmluZGV4IDc5NDlkNTguLjlhYTJlNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvODAyMTFtZ3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1LzgwMjExbWdyLmMKQEAgLTkxLDEyICs5MSwxNSBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wcXdUaW1lc3RhbXAgPSAoUFFXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJKyBXTEFOX0JFQUNPTl9PRkZfVFMpOwotCXBGcmFtZS0+cHdCZWFjb25JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICAgICsgV0xBTl9CRUFDT05fT0ZGX0JDTl9JTlQpOwotCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICAgKyBXTEFOX0JFQUNPTl9PRkZfQ0FQSU5GTyk7CisJcEZyYW1lLT5wcXdUaW1lc3RhbXAgPSAoUFFXT1JEKQorCQkJCShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCSBXTEFOX0JFQUNPTl9PRkZfVFMpOworCXBGcmFtZS0+cHdCZWFjb25JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJCShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCSBXTEFOX0JFQUNPTl9PRkZfQkNOX0lOVCk7CisJcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgV0xBTl9CRUFDT05fT0ZGX0NBUElORk8pOwogCiAJcEZyYW1lLT5sZW4gPSBXTEFOX0hEUl9BRERSM19MRU4gKyBXTEFOX0JFQUNPTl9PRkZfU1NJRDsKIApAQCAtMTI0LDE2ICsxMjcsMjAgQEAKIAlwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogCS8qIEZpeGVkIEZpZWxkcyAqLwotCXBGcmFtZS0+cHF3VGltZXN0YW1wID0gKFBRV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSsgV0xBTl9CRUFDT05fT0ZGX1RTKTsKLQlwRnJhbWUtPnB3QmVhY29uSW50ZXJ2YWwgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCQkgICAgICArIFdMQU5fQkVBQ09OX09GRl9CQ05fSU5UKTsKLQlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgICsgV0xBTl9CRUFDT05fT0ZGX0NBUElORk8pOworCXBGcmFtZS0+cHF3VGltZXN0YW1wID0gKFBRV09SRCkKKwkJCQkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCQkgV0xBTl9CRUFDT05fT0ZGX1RTKTsKKwlwRnJhbWUtPnB3QmVhY29uSW50ZXJ2YWwgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCQkgICAgV0xBTl9CRUFDT05fT0ZGX0JDTl9JTlQpOworCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgIFdMQU5fQkVBQ09OX09GRl9DQVBJTkZPKTsKIAogCS8qIEluZm9ybWF0aW9uIGVsZW1lbnRzICovCi0JcEl0ZW0gPSAoUFdMQU5fSUUpKCh1bnNpZ25lZCBjaGFyICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSkKLQkJCSAgICsgV0xBTl9CRUFDT05fT0ZGX1NTSUQpOworCXBJdGVtID0gKFBXTEFOX0lFKSgodW5zaWduZWQgY2hhciAqKQorCQkJICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSkgKworCQkJICAgIFdMQU5fQkVBQ09OX09GRl9TU0lEKTsKIAl3aGlsZSAoKCh1bnNpZ25lZCBjaGFyICopcEl0ZW0pIDwgKHBGcmFtZS0+cEJ1ZiArIHBGcmFtZS0+bGVuKSkgewogCQlzd2l0Y2ggKHBJdGVtLT5ieUVsZW1lbnRJRCkgewogCQljYXNlIFdMQU5fRUlEX1NTSUQ6CkBAIC0xNzEsNyArMTc4LDggQEAKIAkJY2FzZSBXTEFOX0VJRF9SU05fV1BBOgogCQkJaWYgKHBGcmFtZS0+cFJTTldQQSA9PSBOVUxMKSB7CiAJCQkJaWYgKFdQQWJfSXNfUlNOKChQV0xBTl9JRV9SU05fRVhUKXBJdGVtKSA9PSB0cnVlKQotCQkJCQlwRnJhbWUtPnBSU05XUEEgPSAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKKwkJCQkJcEZyYW1lLT5wUlNOV1BBID0KKwkJCQkJCSAgICAgICAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKIAkJCX0KIAkJCWJyZWFrOwogCkBAIC0xODEsNyArMTg5LDggQEAKIAkJCWJyZWFrOwogCQljYXNlIFdMQU5fRUlEX0VYVFNVUFBfUkFURVM6CiAJCQlpZiAocEZyYW1lLT5wRXh0U3VwcFJhdGVzID09IE5VTEwpCi0JCQkJcEZyYW1lLT5wRXh0U3VwcFJhdGVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpcEl0ZW07CisJCQkJcEZyYW1lLT5wRXh0U3VwcFJhdGVzID0KKwkJCQkJCSAgICAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgV0xBTl9FSURfQ09VTlRSWTogICAgICAvKiA3ICovCkBAIC0xOTEsNyArMjAwLDggQEAKIAogCQljYXNlIFdMQU5fRUlEX1BXUl9DT05TVFJBSU5UOiAgIC8qIDMyICovCiAJCQlpZiAocEZyYW1lLT5wSUVfUG93ZXJDb25zdHJhaW50ID09IE5VTEwpCi0JCQkJcEZyYW1lLT5wSUVfUG93ZXJDb25zdHJhaW50ID0gKFBXTEFOX0lFX1BXX0NPTlNUKXBJdGVtOworCQkJCXBGcmFtZS0+cElFX1Bvd2VyQ29uc3RyYWludCA9CisJCQkJCQkgICAgICAoUFdMQU5fSUVfUFdfQ09OU1QpcEl0ZW07CiAJCQlicmVhazsKIAogCQljYXNlIFdMQU5fRUlEX0NIX1NXSVRDSDogICAgLyogMzcgKi8KQEAgLTIxMCw3ICsyMjAsOSBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlVucmVjb2duaXplZCBFSUQ9JWRkIGluIGJlYWNvbiBkZWNvZGUuXG4iLCBwSXRlbS0+YnlFbGVtZW50SUQpOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsCisJCQkJS0VSTl9JTkZPICJVbnJlY29nbml6ZWQgRUlEPSVkZCBpbiBiZWFjb24gZGVjb2RlLlxuIiwKKwkJCQlwSXRlbS0+YnlFbGVtZW50SUQpOwogCQkJYnJlYWs7CiAKIAkJfQpAQCAtMjgyLDkgKzI5NCwxMSBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wd1JlYXNvbiA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgKyBXTEFOX0RJU0FTU09DX09GRl9SRUFTT04pOwotCXBGcmFtZS0+bGVuID0gV0xBTl9IRFJfQUREUjNfTEVOICsgV0xBTl9ESVNBU1NPQ19PRkZfUkVBU09OICsgc2l6ZW9mKCoocEZyYW1lLT5wd1JlYXNvbikpOworCXBGcmFtZS0+cHdSZWFzb24gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgIFdMQU5fRElTQVNTT0NfT0ZGX1JFQVNPTik7CisJcEZyYW1lLT5sZW4gPSBXTEFOX0hEUl9BRERSM19MRU4gKyBXTEFOX0RJU0FTU09DX09GRl9SRUFTT04gKworCQkgICAgICBzaXplb2YoKihwRnJhbWUtPnB3UmVhc29uKSk7CiAKIAlyZXR1cm47CiB9CkBAIC0zMDgsOCArMzIyLDkgQEAKIAlwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogCS8qIEZpeGVkIEZpZWxkcyAqLwotCXBGcmFtZS0+cHdSZWFzb24gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICsgV0xBTl9ESVNBU1NPQ19PRkZfUkVBU09OKTsKKwlwRnJhbWUtPnB3UmVhc29uID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICBXTEFOX0RJU0FTU09DX09GRl9SRUFTT04pOwogCiAJcmV0dXJuOwogfQpAQCAtMzMyLDExICszNDcsMTQgQEAKIHsKIAlwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgICsgV0xBTl9BU1NPQ1JFUV9PRkZfQ0FQX0lORk8pOwotCXBGcmFtZS0+cHdMaXN0ZW5JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICAgICsgV0xBTl9BU1NPQ1JFUV9PRkZfTElTVEVOX0lOVCk7Ci0JcEZyYW1lLT5sZW4gPSBXTEFOX0hEUl9BRERSM19MRU4gKyBXTEFOX0FTU09DUkVRX09GRl9MSVNURU5fSU5UICsgc2l6ZW9mKCoocEZyYW1lLT5wd0xpc3RlbkludGVydmFsKSk7CisJcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgV0xBTl9BU1NPQ1JFUV9PRkZfQ0FQX0lORk8pOworCXBGcmFtZS0+cHdMaXN0ZW5JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJCSAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCSAgICBXTEFOX0FTU09DUkVRX09GRl9MSVNURU5fSU5UKTsKKwlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fQVNTT0NSRVFfT0ZGX0xJU1RFTl9JTlQgKworCQkgICAgICBzaXplb2YoKihwRnJhbWUtPnB3TGlzdGVuSW50ZXJ2YWwpKTsKIAlyZXR1cm47CiB9CiAKQEAgLTM2MCwxMCArMzc4LDEyIEBACiAKIAlwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgICsgV0xBTl9BU1NPQ1JFUV9PRkZfQ0FQX0lORk8pOwotCXBGcmFtZS0+cHdMaXN0ZW5JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICAgICsgV0xBTl9BU1NPQ1JFUV9PRkZfTElTVEVOX0lOVCk7CisJcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgV0xBTl9BU1NPQ1JFUV9PRkZfQ0FQX0lORk8pOworCXBGcmFtZS0+cHdMaXN0ZW5JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJCSAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCSAgICBXTEFOX0FTU09DUkVRX09GRl9MSVNURU5fSU5UKTsKIAogCS8qIEluZm9ybWF0aW9uIGVsZW1lbnRzICovCiAJcEl0ZW0gPSAoUFdMQU5fSUUpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQpAQCAtMzc3LDcgKzM5Nyw4IEBACiAJCQlicmVhazsKIAkJY2FzZSBXTEFOX0VJRF9TVVBQX1JBVEVTOgogCQkJaWYgKHBGcmFtZS0+cFN1cHBSYXRlcyA9PSBOVUxMKQotCQkJCXBGcmFtZS0+cFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOworCQkJCXBGcmFtZS0+cFN1cHBSYXRlcyA9CisJCQkJCQkgICAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgV0xBTl9FSURfUlNOOgpAQCAtMzg3LDE2ICs0MDgsMTkgQEAKIAkJY2FzZSBXTEFOX0VJRF9SU05fV1BBOgogCQkJaWYgKHBGcmFtZS0+cFJTTldQQSA9PSBOVUxMKSB7CiAJCQkJaWYgKFdQQWJfSXNfUlNOKChQV0xBTl9JRV9SU05fRVhUKXBJdGVtKSA9PSB0cnVlKQotCQkJCQlwRnJhbWUtPnBSU05XUEEgPSAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKKwkJCQkJcEZyYW1lLT5wUlNOV1BBID0KKwkJCQkJCSAgICAgICAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFdMQU5fRUlEX0VYVFNVUFBfUkFURVM6CiAJCQlpZiAocEZyYW1lLT5wRXh0U3VwcFJhdGVzID09IE5VTEwpCi0JCQkJcEZyYW1lLT5wRXh0U3VwcFJhdGVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpcEl0ZW07CisJCQkJcEZyYW1lLT5wRXh0U3VwcFJhdGVzID0KKwkJCQkJCSAgICAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJVbnJlY29nbml6ZWQgRUlEPSVkZCBpbiBhc3NvY3JlcSBkZWNvZGUuXG4iLAorCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsCisJCQkJS0VSTl9JTkZPICJVbnJlY29nbml6ZWQgRUlEPSVkZCBpbiBhc3NvY3JlcSBkZWNvZGUuXG4iLAogCQkJCXBJdGVtLT5ieUVsZW1lbnRJRCk7CiAJCQlicmVhazsKIAkJfQpAQCAtNDI0LDE0ICs0NDgsMTcgQEAKIAlwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogCS8qIEZpeGVkIEZpZWxkcyAqLwotCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICAgKyBXTEFOX0FTU09DUkVTUF9PRkZfQ0FQX0lORk8pOwotCXBGcmFtZS0+cHdTdGF0dXMgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICsgV0xBTl9BU1NPQ1JFU1BfT0ZGX1NUQVRVUyk7Ci0JcEZyYW1lLT5wd0FpZCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgKyBXTEFOX0FTU09DUkVTUF9PRkZfQUlEKTsKLQlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fQVNTT0NSRVNQX09GRl9BSUQKLQkJKyBzaXplb2YoKihwRnJhbWUtPnB3QWlkKSk7CisJcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgV0xBTl9BU1NPQ1JFU1BfT0ZGX0NBUF9JTkZPKTsKKwlwRnJhbWUtPnB3U3RhdHVzID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICBXTEFOX0FTU09DUkVTUF9PRkZfU1RBVFVTKTsKKwlwRnJhbWUtPnB3QWlkID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSBXTEFOX0FTU09DUkVTUF9PRkZfQUlEKTsKKwlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fQVNTT0NSRVNQX09GRl9BSUQgKworCQkgICAgICBzaXplb2YoKihwRnJhbWUtPnB3QWlkKSk7CiAKIAlyZXR1cm47CiB9CkBAIC00NTcsMTYgKzQ4NCwyMCBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICArIFdMQU5fQVNTT0NSRVNQX09GRl9DQVBfSU5GTyk7Ci0JcEZyYW1lLT5wd1N0YXR1cyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgKyBXTEFOX0FTU09DUkVTUF9PRkZfU1RBVFVTKTsKLQlwRnJhbWUtPnB3QWlkID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICArIFdMQU5fQVNTT0NSRVNQX09GRl9BSUQpOworCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgIFdMQU5fQVNTT0NSRVNQX09GRl9DQVBfSU5GTyk7CisJcEZyYW1lLT5wd1N0YXR1cyA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgV0xBTl9BU1NPQ1JFU1BfT0ZGX1NUQVRVUyk7CisJcEZyYW1lLT5wd0FpZCA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgV0xBTl9BU1NPQ1JFU1BfT0ZGX0FJRCk7CiAKIAkvKiBJbmZvcm1hdGlvbiBlbGVtZW50cyAqLwotCXBGcmFtZS0+cFN1cHBSYXRlcyAgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUykoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCQkgICAgKyBXTEFOX0FTU09DUkVTUF9PRkZfU1VQUF9SQVRFUyk7CisJcEZyYW1lLT5wU3VwcFJhdGVzICA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKQorCQkJICAgICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgICAgV0xBTl9BU1NPQ1JFU1BfT0ZGX1NVUFBfUkFURVMpOwogCiAJcEl0ZW0gPSAoUFdMQU5fSUUpKHBGcmFtZS0+cFN1cHBSYXRlcyk7CiAJcEl0ZW0gPSAoUFdMQU5fSUUpKCgodW5zaWduZWQgY2hhciAqKXBJdGVtKSArIDIgKyBwSXRlbS0+bGVuKTsKQEAgLTQ3NCw3ICs1MDUsOSBAQAogCWlmICgoKCh1bnNpZ25lZCBjaGFyICopcEl0ZW0pIDwgKHBGcmFtZS0+cEJ1ZiArIHBGcmFtZS0+bGVuKSkgJiYKIAkgICAgKHBJdGVtLT5ieUVsZW1lbnRJRCA9PSBXTEFOX0VJRF9FWFRTVVBQX1JBVEVTKSkgewogCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKLQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAicEZyYW1lLT5wRXh0U3VwcFJhdGVzPVslcF0uXG4iLCBwSXRlbSk7CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLAorCQkJS0VSTl9JTkZPICJwRnJhbWUtPnBFeHRTdXBwUmF0ZXM9WyVwXS5cbiIsCisJCQlwSXRlbSk7CiAJfSBlbHNlIHsKIAkJcEZyYW1lLT5wRXh0U3VwcFJhdGVzID0gTlVMTDsKIAl9CkBAIC01MDAsMTMgKzUzMywxNyBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICArIFdMQU5fUkVBU1NPQ1JFUV9PRkZfQ0FQX0lORk8pOwotCXBGcmFtZS0+cHdMaXN0ZW5JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICAgICsgV0xBTl9SRUFTU09DUkVRX09GRl9MSVNURU5fSU5UKTsKLQlwRnJhbWUtPnBBZGRyQ3VyckFQID0gKFBJRUVFX0FERFIpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICArIFdMQU5fUkVBU1NPQ1JFUV9PRkZfQ1VSUl9BUCk7Ci0JcEZyYW1lLT5sZW4gPSBXTEFOX0hEUl9BRERSM19MRU4gKyBXTEFOX1JFQVNTT0NSRVFfT0ZGX0NVUlJfQVAgKyBzaXplb2YoKihwRnJhbWUtPnBBZGRyQ3VyckFQKSk7CisJcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgV0xBTl9SRUFTU09DUkVRX09GRl9DQVBfSU5GTyk7CisJcEZyYW1lLT5wd0xpc3RlbkludGVydmFsID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkJICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkJICAgIFdMQU5fUkVBU1NPQ1JFUV9PRkZfTElTVEVOX0lOVCk7CisJcEZyYW1lLT5wQWRkckN1cnJBUCA9IChQSUVFRV9BRERSKQorCQkJICAgICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgICAgV0xBTl9SRUFTU09DUkVRX09GRl9DVVJSX0FQKTsKKwlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fUkVBU1NPQ1JFUV9PRkZfQ1VSUl9BUCArCisJCSAgICAgIHNpemVvZigqKHBGcmFtZS0+cEFkZHJDdXJyQVApKTsKIAogCXJldHVybjsKIH0KQEAgLTUzMSwxMiArNTY4LDE1IEBACiAJcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgICsgV0xBTl9SRUFTU09DUkVRX09GRl9DQVBfSU5GTyk7Ci0JcEZyYW1lLT5wd0xpc3RlbkludGVydmFsID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkJICAgICAgKyBXTEFOX1JFQVNTT0NSRVFfT0ZGX0xJU1RFTl9JTlQpOwotCXBGcmFtZS0+cEFkZHJDdXJyQVAgPSAoUElFRUVfQUREUikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICsgV0xBTl9SRUFTU09DUkVRX09GRl9DVVJSX0FQKTsKKwlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJICAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgICBXTEFOX1JFQVNTT0NSRVFfT0ZGX0NBUF9JTkZPKTsKKwlwRnJhbWUtPnB3TGlzdGVuSW50ZXJ2YWwgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCQkgICAgV0xBTl9SRUFTU09DUkVRX09GRl9MSVNURU5fSU5UKTsKKwlwRnJhbWUtPnBBZGRyQ3VyckFQID0gKFBJRUVFX0FERFIpCisJCQkgICAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgICBXTEFOX1JFQVNTT0NSRVFfT0ZGX0NVUlJfQVApOwogCiAJLyogSW5mb3JtYXRpb24gZWxlbWVudHMgKi8KIAlwSXRlbSA9IChQV0xBTl9JRSkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCkBAIC01NTAsNyArNTkwLDggQEAKIAkJCWJyZWFrOwogCQljYXNlIFdMQU5fRUlEX1NVUFBfUkFURVM6CiAJCQlpZiAocEZyYW1lLT5wU3VwcFJhdGVzID09IE5VTEwpCi0JCQkJcEZyYW1lLT5wU3VwcFJhdGVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpcEl0ZW07CisJCQkJcEZyYW1lLT5wU3VwcFJhdGVzID0KKwkJCQkJCSAgICAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgV0xBTl9FSURfUlNOOgpAQCAtNTYwLDE2ICs2MDEsMTkgQEAKIAkJY2FzZSBXTEFOX0VJRF9SU05fV1BBOgogCQkJaWYgKHBGcmFtZS0+cFJTTldQQSA9PSBOVUxMKSB7CiAJCQkJaWYgKFdQQWJfSXNfUlNOKChQV0xBTl9JRV9SU05fRVhUKXBJdGVtKSA9PSB0cnVlKQotCQkJCQlwRnJhbWUtPnBSU05XUEEgPSAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKKwkJCQkJcEZyYW1lLT5wUlNOV1BBID0KKwkJCQkJCSAgICAgICAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKIAkJCX0KIAkJCWJyZWFrOwogCiAJCWNhc2UgV0xBTl9FSURfRVhUU1VQUF9SQVRFUzoKIAkJCWlmIChwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPT0gTlVMTCkKLQkJCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKKwkJCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPQorCQkJCQkJICAgIChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJVbnJlY29nbml6ZWQgRUlEPSVkZCBpbiByZWFzc29jcmVxIGRlY29kZS5cbiIsCisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywKKwkJCQlLRVJOX0lORk8gIlVucmVjb2duaXplZCBFSUQ9JWRkIGluIHJlYXNzb2NyZXEgZGVjb2RlLlxuIiwKIAkJCQlwSXRlbS0+YnlFbGVtZW50SUQpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTYzMSwxNiArNjc1LDIwIEBACiAKIAkJY2FzZSBXTEFOX0VJRF9TVVBQX1JBVEVTOgogCQkJaWYgKHBGcmFtZS0+cFN1cHBSYXRlcyA9PSBOVUxMKQotCQkJCXBGcmFtZS0+cFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOworCQkJCXBGcmFtZS0+cFN1cHBSYXRlcyA9CisJCQkJCQkgICAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgV0xBTl9FSURfRVhUU1VQUF9SQVRFUzoKIAkJCWlmIChwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPT0gTlVMTCkKLQkJCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKKwkJCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPQorCQkJCQkJICAgIChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkJhZCBFSUQ9JWRkIGluIHByb2JlcmVxXG4iLCBwSXRlbS0+YnlFbGVtZW50SUQpOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsCisJCQkJS0VSTl9JTkZPICJCYWQgRUlEPSVkZCBpbiBwcm9iZXJlcVxuIiwKKwkJCQlwSXRlbS0+YnlFbGVtZW50SUQpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNjY4LDE1ICs3MTYsMTggQEAKIAlwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogCS8qIEZpeGVkIEZpZWxkcyAqLwotCXBGcmFtZS0+cHF3VGltZXN0YW1wID0gKFBRV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSsgV0xBTl9QUk9CRVJFU1BfT0ZGX1RTKTsKLQlwRnJhbWUtPnB3QmVhY29uSW50ZXJ2YWwgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCQkgICAgICArIFdMQU5fUFJPQkVSRVNQX09GRl9CQ05fSU5UKTsKLQlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgICsgV0xBTl9QUk9CRVJFU1BfT0ZGX0NBUF9JTkZPKTsKKwlwRnJhbWUtPnBxd1RpbWVzdGFtcCA9IChQUVdPUkQpCisJCQkgICAgICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkJV0xBTl9QUk9CRVJFU1BfT0ZGX1RTKTsKKwlwRnJhbWUtPnB3QmVhY29uSW50ZXJ2YWwgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCQkgICAgV0xBTl9QUk9CRVJFU1BfT0ZGX0JDTl9JTlQpOworCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgIFdMQU5fUFJPQkVSRVNQX09GRl9DQVBfSU5GTyk7CiAKIAlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fUFJPQkVSRVNQX09GRl9DQVBfSU5GTyArCi0JCXNpemVvZigqKHBGcmFtZS0+cHdDYXBJbmZvKSk7CisJCSAgICAgIHNpemVvZigqKHBGcmFtZS0+cHdDYXBJbmZvKSk7CiAKIAlyZXR1cm47CiB9CkBAIC03MDIsMTIgKzc1MywxNSBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wcXdUaW1lc3RhbXAgPSAoUFFXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJKyBXTEFOX1BST0JFUkVTUF9PRkZfVFMpOwotCXBGcmFtZS0+cHdCZWFjb25JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICAgICsgV0xBTl9QUk9CRVJFU1BfT0ZGX0JDTl9JTlQpOwotCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICAgKyBXTEFOX1BST0JFUkVTUF9PRkZfQ0FQX0lORk8pOworCXBGcmFtZS0+cHF3VGltZXN0YW1wID0gKFBRV09SRCkKKwkJCSAgICAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCQlXTEFOX1BST0JFUkVTUF9PRkZfVFMpOworCXBGcmFtZS0+cHdCZWFjb25JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJCSAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCSAgICBXTEFOX1BST0JFUkVTUF9PRkZfQkNOX0lOVCk7CisJcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgV0xBTl9QUk9CRVJFU1BfT0ZGX0NBUF9JTkZPKTsKIAogCS8qIEluZm9ybWF0aW9uIGVsZW1lbnRzICovCiAJcEl0ZW0gPSAoUFdMQU5fSUUpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQpAQCAtNzIxLDcgKzc3NSw4IEBACiAJCQlicmVhazsKIAkJY2FzZSBXTEFOX0VJRF9TVVBQX1JBVEVTOgogCQkJaWYgKHBGcmFtZS0+cFN1cHBSYXRlcyA9PSBOVUxMKQotCQkJCXBGcmFtZS0+cFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOworCQkJCXBGcmFtZS0+cFN1cHBSYXRlcyA9CisJCQkJCQkgICAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKIAkJCWJyZWFrOwogCQljYXNlIFdMQU5fRUlEX0ZIX1BBUk1TOgogCQkJYnJlYWs7CkBAIC03MzUsNyArNzkwLDggQEAKIAkJCWJyZWFrOwogCQljYXNlIFdMQU5fRUlEX0lCU1NfUEFSTVM6CiAJCQlpZiAocEZyYW1lLT5wSUJTU1Bhcm1zID09IE5VTEwpCi0JCQkJcEZyYW1lLT5wSUJTU1Bhcm1zID0gKFBXTEFOX0lFX0lCU1NfUEFSTVMpcEl0ZW07CisJCQkJcEZyYW1lLT5wSUJTU1Bhcm1zID0KKwkJCQkJCSAgIChQV0xBTl9JRV9JQlNTX1BBUk1TKXBJdGVtOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBXTEFOX0VJRF9SU046CkBAIC03NDUsNyArODAxLDggQEAKIAkJY2FzZSBXTEFOX0VJRF9SU05fV1BBOgogCQkJaWYgKHBGcmFtZS0+cFJTTldQQSA9PSBOVUxMKSB7CiAJCQkJaWYgKFdQQWJfSXNfUlNOKChQV0xBTl9JRV9SU05fRVhUKXBJdGVtKSA9PSB0cnVlKQotCQkJCQlwRnJhbWUtPnBSU05XUEEgPSAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKKwkJCQkJcEZyYW1lLT5wUlNOV1BBID0KKwkJCQkJCSAgICAgICAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFdMQU5fRUlEX0VSUDoKQEAgLTc1NCw3ICs4MTEsOCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgV0xBTl9FSURfRVhUU1VQUF9SQVRFUzoKIAkJCWlmIChwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPT0gTlVMTCkKLQkJCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKKwkJCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPQorCQkJCQkJICAgIChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBXTEFOX0VJRF9DT1VOVFJZOiAgICAgIC8qIDcgKi8KQEAgLTc2NCw3ICs4MjIsOCBAQAogCiAJCWNhc2UgV0xBTl9FSURfUFdSX0NPTlNUUkFJTlQ6ICAgLyogMzIgKi8KIAkJCWlmIChwRnJhbWUtPnBJRV9Qb3dlckNvbnN0cmFpbnQgPT0gTlVMTCkKLQkJCQlwRnJhbWUtPnBJRV9Qb3dlckNvbnN0cmFpbnQgPSAoUFdMQU5fSUVfUFdfQ09OU1QpcEl0ZW07CisJCQkJcEZyYW1lLT5wSUVfUG93ZXJDb25zdHJhaW50ID0KKwkJCQkJCSAgICAgIChQV0xBTl9JRV9QV19DT05TVClwSXRlbTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgV0xBTl9FSURfQ0hfU1dJVENIOiAgICAvKiAzNyAqLwpAQCAtNzgzLDcgKzg0Miw5IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiQmFkIEVJRD0lZGQgaW4gcHJvYmVyZXNwXG4iLCBwSXRlbS0+YnlFbGVtZW50SUQpOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsCisJCQkJS0VSTl9JTkZPICJCYWQgRUlEPSVkZCBpbiBwcm9iZXJlc3BcbiIsCisJCQkJcEl0ZW0tPmJ5RWxlbWVudElEKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTgxMSwxMyArODcyLDE3IEBACiAJcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnB3QXV0aEFsZ29yaXRobSA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICAgKyBXTEFOX0FVVEhFTl9PRkZfQVVUSF9BTEcpOwotCXBGcmFtZS0+cHdBdXRoU2VxdWVuY2UgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCQkgICAgKyBXTEFOX0FVVEhFTl9PRkZfQVVUSF9TRVEpOwotCXBGcmFtZS0+cHdTdGF0dXMgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICsgV0xBTl9BVVRIRU5fT0ZGX1NUQVRVUyk7Ci0JcEZyYW1lLT5sZW4gPSBXTEFOX0hEUl9BRERSM19MRU4gKyBXTEFOX0FVVEhFTl9PRkZfU1RBVFVTICsgc2l6ZW9mKCoocEZyYW1lLT5wd1N0YXR1cykpOworCXBGcmFtZS0+cHdBdXRoQWxnb3JpdGhtID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkJICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCQkgICBXTEFOX0FVVEhFTl9PRkZfQVVUSF9BTEcpOworCXBGcmFtZS0+cHdBdXRoU2VxdWVuY2UgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCQkgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkJICBXTEFOX0FVVEhFTl9PRkZfQVVUSF9TRVEpOworCXBGcmFtZS0+cHdTdGF0dXMgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgIFdMQU5fQVVUSEVOX09GRl9TVEFUVVMpOworCXBGcmFtZS0+bGVuID0gV0xBTl9IRFJfQUREUjNfTEVOICsgV0xBTl9BVVRIRU5fT0ZGX1NUQVRVUyArCisJCSAgICAgIHNpemVvZigqKHBGcmFtZS0+cHdTdGF0dXMpKTsKIAogCXJldHVybjsKIH0KQEAgLTg0MywxMiArOTA4LDE1IEBACiAJcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnB3QXV0aEFsZ29yaXRobSA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICAgKyBXTEFOX0FVVEhFTl9PRkZfQVVUSF9BTEcpOwotCXBGcmFtZS0+cHdBdXRoU2VxdWVuY2UgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCQkgICAgKyBXTEFOX0FVVEhFTl9PRkZfQVVUSF9TRVEpOwotCXBGcmFtZS0+cHdTdGF0dXMgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICsgV0xBTl9BVVRIRU5fT0ZGX1NUQVRVUyk7CisJcEZyYW1lLT5wd0F1dGhBbGdvcml0aG0gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCQkgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCSAgIFdMQU5fQVVUSEVOX09GRl9BVVRIX0FMRyk7CisJcEZyYW1lLT5wd0F1dGhTZXF1ZW5jZSA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJCSAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCQkgIFdMQU5fQVVUSEVOX09GRl9BVVRIX1NFUSk7CisJcEZyYW1lLT5wd1N0YXR1cyA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgV0xBTl9BVVRIRU5fT0ZGX1NUQVRVUyk7CiAKIAkvKiBJbmZvcm1hdGlvbiBlbGVtZW50cyAqLwogCXBJdGVtID0gKFBXTEFOX0lFKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKQEAgLTg4MCw5ICs5NDgsMTEgQEAKIAlwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogCS8qIEZpeGVkIEZpZWxkcyAqLwotCXBGcmFtZS0+cHdSZWFzb24gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICsgV0xBTl9ERUFVVEhFTl9PRkZfUkVBU09OKTsKLQlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fREVBVVRIRU5fT0ZGX1JFQVNPTiArIHNpemVvZigqKHBGcmFtZS0+cHdSZWFzb24pKTsKKwlwRnJhbWUtPnB3UmVhc29uID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICBXTEFOX0RFQVVUSEVOX09GRl9SRUFTT04pOworCXBGcmFtZS0+bGVuID0gV0xBTl9IRFJfQUREUjNfTEVOICsgV0xBTl9ERUFVVEhFTl9PRkZfUkVBU09OICsKKwkJICAgICAgc2l6ZW9mKCoocEZyYW1lLT5wd1JlYXNvbikpOwogCiAJcmV0dXJuOwogfQpAQCAtOTA2LDggKzk3Niw5IEBACiAJcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnB3UmVhc29uID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICArIFdMQU5fREVBVVRIRU5fT0ZGX1JFQVNPTik7CisJcEZyYW1lLT5wd1JlYXNvbiA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgV0xBTl9ERUFVVEhFTl9PRkZfUkVBU09OKTsKIAogCXJldHVybjsKIH0KQEAgLTkzMSwxNCArMTAwMiwxOCBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0NBUF9JTkZPKTsKLQlwRnJhbWUtPnB3U3RhdHVzID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX1NUQVRVUyk7Ci0JcEZyYW1lLT5wd0FpZCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgKyBXTEFOX1JFQVNTT0NSRVNQX09GRl9BSUQpOworCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0NBUF9JTkZPKTsKKwlwRnJhbWUtPnB3U3RhdHVzID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICBXTEFOX1JFQVNTT0NSRVNQX09GRl9TVEFUVVMpOworCXBGcmFtZS0+cHdBaWQgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0FJRCk7CiAKLQlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0FJRCArIHNpemVvZigqKHBGcmFtZS0+cHdBaWQpKTsKKwlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0FJRCArCisJCSAgICAgIHNpemVvZigqKHBGcmFtZS0+cHdBaWQpKTsKIAogCXJldHVybjsKIH0KQEAgLTk2NCwxNiArMTAzOSwyMCBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0NBUF9JTkZPKTsKLQlwRnJhbWUtPnB3U3RhdHVzID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX1NUQVRVUyk7Ci0JcEZyYW1lLT5wd0FpZCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgKyBXTEFOX1JFQVNTT0NSRVNQX09GRl9BSUQpOworCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0NBUF9JTkZPKTsKKwlwRnJhbWUtPnB3U3RhdHVzID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICBXTEFOX1JFQVNTT0NSRVNQX09GRl9TVEFUVVMpOworCXBGcmFtZS0+cHdBaWQgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0FJRCk7CiAKIAkvKiBJbmZvcm1hdGlvbiBlbGVtZW50cyAqLwotCXBGcmFtZS0+cFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICsgV0xBTl9SRUFTU09DUkVTUF9PRkZfU1VQUF9SQVRFUyk7CisJcEZyYW1lLT5wU3VwcFJhdGVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpCisJCQkgICAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgICAgV0xBTl9SRUFTU09DUkVTUF9PRkZfU1VQUF9SQVRFUyk7CiAKIAlwSXRlbSA9IChQV0xBTl9JRSkocEZyYW1lLT5wU3VwcFJhdGVzKTsKIAlwSXRlbSA9IChQV0xBTl9JRSkoKCh1bnNpZ25lZCBjaGFyICopcEl0ZW0pICsgMiArIHBJdGVtLT5sZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9hZXNfY2NtcC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9hZXNfY2NtcC5jCmluZGV4IDgyYjBiZDEuLjRjY2ZlMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYWVzX2NjbXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Flc19jY21wLmMKQEAgLTQ2LDggKzQ2LDcgQEAKICAqIFNCT1ggVGFibGUKICAqLwogCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzYm94X3RhYmxlWzI1Nl0gPQoteworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2JveF90YWJsZVsyNTZdID0gewogCTB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUsIDB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsCiAJMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwgMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCwKIAkweGI3LCAweGZkLCAweDkzLCAweDI2LCAweDM2LCAweDNmLCAweGY3LCAweGNjLCAweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4LCAweDMxLCAweDE1LApAQCAtMTUzLDkgKzE1Miw4IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQogCQlvdXRbaV0gPSBzYm94X3RhYmxlW2luW2ldXTsKLQl9CiB9CiAKIHN0YXRpYyB2b2lkIFNoaWZ0Um93cyh1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0KQpAQCAtMjA1LDggKzIwMyw3IEBACiAJCQlTdWJCeXRlcyhjaXBoZXJ0ZXh0LCBUbXBkYXRhQSk7CiAJCQlTaGlmdFJvd3MoVG1wZGF0YUEsIFRtcGRhdGFCKTsKIAkJCXhvcl8xMjgoVG1wZGF0YUIsIGFieVJvdW5kS2V5LCBjaXBoZXJ0ZXh0KTsKLQkJfSBlbHNlIC8qIHJvdW5kIDEgfiA5ICovCi0JCXsKKwkJfSBlbHNlIC8qIHJvdW5kIDEgfiA5ICovewogCQkJU3ViQnl0ZXMoY2lwaGVydGV4dCwgVG1wZGF0YUEpOwogCQkJU2hpZnRSb3dzKFRtcGRhdGFBLCBUbXBkYXRhQik7CiAJCQlNaXhDb2x1bW5zKCZUbXBkYXRhQlswXSwgJlRtcGRhdGFBWzBdKTsKQEAgLTMxMSwxMyArMzA4LDExIEBACiAKIAkvKiBDQ01QICovCiAJQUVTdjEyOChwYnlSeEtleSwgTUlDX0lWLCBhYnlNSUMpOwotCWZvciAoa2sgPSAwOyBrayA8IDE2OyBraysrKSB7CisJZm9yIChrayA9IDA7IGtrIDwgMTY7IGtrKyspCiAJCWFieVRtcFtra10gPSBNSUNfSERSMVtra10gXiBhYnlNSUNba2tdOwotCX0KIAlBRVN2MTI4KHBieVJ4S2V5LCBhYnlUbXAsIGFieU1JQyk7Ci0JZm9yIChrayA9IDA7IGtrIDwgMTY7IGtrKyspIHsKKwlmb3IgKGtrID0gMDsga2sgPCAxNjsga2srKykKIAkJYWJ5VG1wW2trXSA9IE1JQ19IRFIyW2trXSBeIGFieU1JQ1tra107Ci0JfQogCUFFU3YxMjgocGJ5UnhLZXksIGFieVRtcCwgYWJ5TUlDKTsKIAogCXdDbnQgPSAxOwpAQCAtMzMwLDEyICszMjUsMTAgQEAKIAogCQlBRVN2MTI4KHBieVJ4S2V5LCBhYnlDVFJQTEQsIGFieVRtcCk7CiAKLQkJZm9yIChrayA9IDA7IGtrIDwgMTY7IGtrKyspIHsKKwkJZm9yIChrayA9IDA7IGtrIDwgMTY7IGtrKyspCiAJCQlhYnlQbGFpblRleHRba2tdID0gYWJ5VG1wW2trXSBeIHBieVBheWxvYWRba2tdOwotCQl9Ci0JCWZvciAoa2sgPSAwOyBrayA8IDE2OyBraysrKSB7CisJCWZvciAoa2sgPSAwOyBrayA8IDE2OyBraysrKQogCQkJYWJ5VG1wW2trXSA9IGFieU1JQ1tra10gXiBhYnlQbGFpblRleHRba2tdOwotCQl9CiAJCUFFU3YxMjgocGJ5UnhLZXksIGFieVRtcCwgYWJ5TUlDKTsKIAogCQltZW1jcHkocGJ5UGF5bG9hZCwgYWJ5UGxhaW5UZXh0LCAxNik7CkBAIC0zNDUsMjcgKzMzOCwyMyBAQAogCiAJLyogbGFzdCBwYXlsb2FkICovCiAJbWVtY3B5KCYoYWJ5TGFzdENpcGhlclswXSksIHBieVBheWxvYWQsIGpqKTsKLQlmb3IgKGlpID0gamo7IGlpIDwgMTY7IGlpKyspIHsKKwlmb3IgKGlpID0gamo7IGlpIDwgMTY7IGlpKyspCiAJCWFieUxhc3RDaXBoZXJbaWldID0gMHgwMDsKLQl9CiAKIAlhYnlDVFJQTERbMTRdID0gKHVuc2lnbmVkIGNoYXIpKHdDbnQgPj4gOCk7CiAJYWJ5Q1RSUExEWzE1XSA9ICh1bnNpZ25lZCBjaGFyKSh3Q250ICYgMHhmZik7CiAKIAlBRVN2MTI4KHBieVJ4S2V5LCBhYnlDVFJQTEQsIGFieVRtcCk7Ci0JZm9yIChrayA9IDA7IGtrIDwgMTY7IGtrKyspIHsKKwlmb3IgKGtrID0gMDsga2sgPCAxNjsga2srKykKIAkJYWJ5UGxhaW5UZXh0W2trXSA9IGFieVRtcFtra10gXiBhYnlMYXN0Q2lwaGVyW2trXTsKLQl9CiAJbWVtY3B5KHBieVBheWxvYWQsIGFieVBsYWluVGV4dCwgamopOwogCXBieVBheWxvYWQgKz0gamo7CiAKIAkvKiBmb3IgTUlDIGNhbGN1bGF0aW9uICovCi0JZm9yIChpaSA9IGpqOyBpaSA8IDE2OyBpaSsrKSB7CisJZm9yIChpaSA9IGpqOyBpaSA8IDE2OyBpaSsrKQogCQlhYnlQbGFpblRleHRbaWldID0gMHgwMDsKLQl9Ci0JZm9yIChrayA9IDA7IGtrIDwgMTY7IGtrKyspIHsKKwlmb3IgKGtrID0gMDsga2sgPCAxNjsga2srKykKIAkJYWJ5VG1wW2trXSA9IGFieU1JQ1tra10gXiBhYnlQbGFpblRleHRba2tdOwotCX0KIAlBRVN2MTI4KHBieVJ4S2V5LCBhYnlUbXAsIGFieU1JQyk7CiAKIAkvKiA9PmFib3ZlIGlzIHRoZSBjYWxjdWxhdGUgTUlDICovCkBAIC0zNzUsOSArMzY0LDggQEAKIAlhYnlDVFJQTERbMTRdID0gKHVuc2lnbmVkIGNoYXIpKHdDbnQgPj4gOCk7CiAJYWJ5Q1RSUExEWzE1XSA9ICh1bnNpZ25lZCBjaGFyKSh3Q250ICYgMHhmZik7CiAJQUVTdjEyOChwYnlSeEtleSwgYWJ5Q1RSUExELCBhYnlUbXApOwotCWZvciAoa2sgPSAwOyBrayA8IDg7IGtrKyspIHsKKwlmb3IgKGtrID0gMDsga2sgPCA4OyBraysrKQogCQlhYnlUbXBba2tdID0gYWJ5VG1wW2trXSBeIHBieVBheWxvYWRba2tdOwotCX0KIAkvKiA9PmFib3ZlIGlzIHRoZSBkZWMtTUlDIGZyb20gcGFja2V0ICovCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXNjLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Rlc2MuaAppbmRleCAzMmQ4MDhlLi5mOGU0MTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Rlc2MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Rlc2MuaApAQCAtMjc2LDkgKzI3Niw4IEBACiAJdm9sYXRpbGUgU1JERVMxIG1fcmQxUkQxOwogCXZvbGF0aWxlIHUzMiAgICBidWZmX2FkZHI7CiAJdm9sYXRpbGUgdTMyICAgIG5leHRfZGVzYzsKLQlzdHJ1Y3QgdGFnU1J4RGVzYyAgICpuZXh0Oy8vNCBieXRlcwotCXZvbGF0aWxlIFBERVZJQ0VfUkRfSU5GTyAgICBwUkRJbmZvOy8vNCBieXRlcwotCXZvbGF0aWxlIHUzMiAgICBSZXNlcnZlZFsyXTsvLzggYnl0ZXMKKwlzdHJ1Y3QgdGFnU1J4RGVzYyAqbmV4dCBfX2FsaWduZWQoOCk7CisJdm9sYXRpbGUgUERFVklDRV9SRF9JTkZPIHBSREluZm8gX19hbGlnbmVkKDgpOwogfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTUnhEZXNjLCAqUFNSeERlc2M7CiB0eXBlZGVmIGNvbnN0IFNSeERlc2MgKlBDU1J4RGVzYzsKQEAgLTM2MSw5ICszNjAsOCBAQAogCXZvbGF0aWxlICAgIFNUREVTMSAgbV90ZDFURDE7CiAJdm9sYXRpbGUgICAgdTMyICAgIGJ1ZmZfYWRkcjsKIAl2b2xhdGlsZSAgICB1MzIgICAgbmV4dF9kZXNjOwotCXN0cnVjdCB0YWdTVHhEZXNjICpuZXh0OyAvLzQgYnl0ZXMKLQl2b2xhdGlsZSAgICBQREVWSUNFX1REX0lORk8gcFRESW5mbzsvLzQgYnl0ZXMKLQl2b2xhdGlsZSAgICB1MzIgICAgUmVzZXJ2ZWRbMl07Ly84IGJ5dGVzCisJc3RydWN0IHRhZ1NUeERlc2MgKm5leHQgX19hbGlnbmVkKDgpOworCXZvbGF0aWxlICAgIFBERVZJQ0VfVERfSU5GTyBwVERJbmZvIF9fYWxpZ25lZCg4KTsKIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogU1R4RGVzYywgKlBTVHhEZXNjOwogdHlwZWRlZiBjb25zdCBTVHhEZXNjICpQQ1NUeERlc2M7CkBAIC0zNzUsOSArMzczLDggQEAKIAl2b2xhdGlsZSAgICB1MzIgbmV4dF9kZXNjOyAvLyBwb2ludGVyIHRvIG5leHQgbG9naWNhbCBkZXNjcmlwdG9yCiAJdm9sYXRpbGUgICAgdW5zaWduZWQgc2hvcnQgbV93RklGT0N0bDsKIAl2b2xhdGlsZSAgICB1bnNpZ25lZCBzaG9ydCBtX3dUaW1lU3RhbXA7Ci0Jc3RydWN0IHRhZ1NUeFN5bmNEZXNjICpuZXh0OyAvLzQgYnl0ZXMKLQl2b2xhdGlsZSAgICBQREVWSUNFX1REX0lORk8gcFRESW5mbzsvLzQgYnl0ZXMKLQl2b2xhdGlsZSAgICB1MzIgbV9kd1Jlc2VydmVkMjsKKwlzdHJ1Y3QgdGFnU1R4U3luY0Rlc2MgKm5leHQgX19hbGlnbmVkKDgpOworCXZvbGF0aWxlICAgIFBERVZJQ0VfVERfSU5GTyBwVERJbmZvIF9fYWxpZ25lZCg4KTsKIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogU1R4U3luY0Rlc2MsICpQU1R4U3luY0Rlc2M7CiB0eXBlZGVmIGNvbnN0IFNUeFN5bmNEZXNjICpQQ1NUeFN5bmNEZXNjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kcGMuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZHBjLmMKaW5kZXggMGEyOWM5MC4uNzcxYmYzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kcGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RwYy5jCkBAIC03MjksMjcgKzcyOSwyNyBAQAogCS8vIFNvZnQgTUlDCiAJaWYgKChwS2V5ICE9IE5VTEwpICYmIChwS2V5LT5ieUNpcGhlclN1aXRlID09IEtFWV9DVExfVEtJUCkpIHsKIAkJaWYgKGJJc1dFUCkgewotCQkJdW5zaWduZWQgbG9uZyAqcGR3TUlDX0w7Ci0JCQl1bnNpZ25lZCBsb25nICpwZHdNSUNfUjsKLQkJCXVuc2lnbmVkIGxvbmcgZHdNSUNfUHJpb3JpdHk7Ci0JCQl1bnNpZ25lZCBsb25nIGR3TUlDS2V5MCA9IDAsIGR3TUlDS2V5MSA9IDA7Ci0JCQl1bnNpZ25lZCBsb25nIGR3TG9jYWxNSUNfTCA9IDA7Ci0JCQl1bnNpZ25lZCBsb25nIGR3TG9jYWxNSUNfUiA9IDA7CisJCQlfX2xlMzIgKnBkd01JQ19MOworCQkJX19sZTMyICpwZHdNSUNfUjsKKwkJCV9fbGUzMiBkd01JQ19Qcmlvcml0eTsKKwkJCV9fbGUzMiBkd01JQ0tleTAgPSAwLCBkd01JQ0tleTEgPSAwOworCQkJdTMyIGR3TG9jYWxNSUNfTCA9IDA7CisJCQl1MzIgZHdMb2NhbE1JQ19SID0gMDsKIAkJCXZpYXdnZXRfd3BhX2hlYWRlciAqd3BhaGRyOwogCiAJCQlpZiAocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfRVNTX0FQKSB7Ci0JCQkJZHdNSUNLZXkwID0gY3B1X3RvX2xlMzIoKih1bnNpZ25lZCBsb25nICopKCZwS2V5LT5hYnlLZXlbMjRdKSk7Ci0JCQkJZHdNSUNLZXkxID0gY3B1X3RvX2xlMzIoKih1bnNpZ25lZCBsb25nICopKCZwS2V5LT5hYnlLZXlbMjhdKSk7CisJCQkJZHdNSUNLZXkwID0gY3B1X3RvX2xlMzIoKih1MzIgKikoJnBLZXktPmFieUtleVsyNF0pKTsKKwkJCQlkd01JQ0tleTEgPSBjcHVfdG9fbGUzMigqKHUzMiAqKSgmcEtleS0+YWJ5S2V5WzI4XSkpOwogCQkJfSBlbHNlIHsKIAkJCQlpZiAocERldmljZS0+cE1nbXQtPmVBdXRoZW5Nb2RlID09IFdNQUNfQVVUSF9XUEFOT05FKSB7Ci0JCQkJCWR3TUlDS2V5MCA9IGNwdV90b19sZTMyKCoodW5zaWduZWQgbG9uZyAqKSgmcEtleS0+YWJ5S2V5WzE2XSkpOwotCQkJCQlkd01JQ0tleTEgPSBjcHVfdG9fbGUzMigqKHVuc2lnbmVkIGxvbmcgKikoJnBLZXktPmFieUtleVsyMF0pKTsKKwkJCQkJZHdNSUNLZXkwID0gY3B1X3RvX2xlMzIoKih1MzIgKikoJnBLZXktPmFieUtleVsxNl0pKTsKKwkJCQkJZHdNSUNLZXkxID0gY3B1X3RvX2xlMzIoKih1MzIgKikoJnBLZXktPmFieUtleVsyMF0pKTsKIAkJCQl9IGVsc2UgaWYgKChwS2V5LT5kd0tleUluZGV4ICYgQklUMjgpID09IDApIHsKLQkJCQkJZHdNSUNLZXkwID0gY3B1X3RvX2xlMzIoKih1bnNpZ25lZCBsb25nICopKCZwS2V5LT5hYnlLZXlbMTZdKSk7Ci0JCQkJCWR3TUlDS2V5MSA9IGNwdV90b19sZTMyKCoodW5zaWduZWQgbG9uZyAqKSgmcEtleS0+YWJ5S2V5WzIwXSkpOworCQkJCQlkd01JQ0tleTAgPSBjcHVfdG9fbGUzMigqKHUzMiAqKSgmcEtleS0+YWJ5S2V5WzE2XSkpOworCQkJCQlkd01JQ0tleTEgPSBjcHVfdG9fbGUzMigqKHUzMiAqKSgmcEtleS0+YWJ5S2V5WzIwXSkpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCWR3TUlDS2V5MCA9IGNwdV90b19sZTMyKCoodW5zaWduZWQgbG9uZyAqKSgmcEtleS0+YWJ5S2V5WzI0XSkpOwotCQkJCQlkd01JQ0tleTEgPSBjcHVfdG9fbGUzMigqKHVuc2lnbmVkIGxvbmcgKikoJnBLZXktPmFieUtleVsyOF0pKTsKKwkJCQkJZHdNSUNLZXkwID0gY3B1X3RvX2xlMzIoKih1MzIgKikoJnBLZXktPmFieUtleVsyNF0pKTsKKwkJCQkJZHdNSUNLZXkxID0gY3B1X3RvX2xlMzIoKih1MzIgKikoJnBLZXktPmFieUtleVsyOF0pKTsKIAkJCQl9CiAJCQl9CiAKQEAgLTc2MywxNCArNzYzLDE0IEBACiAJCQlNSUNfdkdldE1JQygmZHdMb2NhbE1JQ19MLCAmZHdMb2NhbE1JQ19SKTsKIAkJCU1JQ192VW5Jbml0KCk7CiAKLQkJCXBkd01JQ19MID0gKHVuc2lnbmVkIGxvbmcgKikoc2tiLT5kYXRhICsgNCArIEZyYW1lU2l6ZSk7Ci0JCQlwZHdNSUNfUiA9ICh1bnNpZ25lZCBsb25nICopKHNrYi0+ZGF0YSArIDQgKyBGcmFtZVNpemUgKyA0KTsKKwkJCXBkd01JQ19MID0gKF9fbGUzMiAqKShza2ItPmRhdGEgKyA0ICsgRnJhbWVTaXplKTsKKwkJCXBkd01JQ19SID0gKF9fbGUzMiAqKShza2ItPmRhdGEgKyA0ICsgRnJhbWVTaXplICsgNCk7CiAJCQkvL0RCR19QUk5fR1JQMTIoKCJSeEw6ICVseCwgUnhSOiAlbHhcbiIsICpwZHdNSUNfTCwgKnBkd01JQ19SKSk7CiAJCQkvL0RCR19QUk5fR1JQMTIoKCJMb2NhbEw6ICVseCwgTG9jYWxSOiAlbHhcbiIsIGR3TG9jYWxNSUNfTCwgZHdMb2NhbE1JQ19SKSk7CiAJCQkvL0RCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gImR3TUlDS2V5MD0gJWx4LGR3TUlDS2V5MT0gJWx4IFxuIiwgZHdNSUNLZXkwLCBkd01JQ0tleTEpOwogCi0JCQlpZiAoKGNwdV90b19sZTMyKCpwZHdNSUNfTCkgIT0gZHdMb2NhbE1JQ19MKSB8fAotCQkJICAgIChjcHVfdG9fbGUzMigqcGR3TUlDX1IpICE9IGR3TG9jYWxNSUNfUikgfHwKKwkJCWlmICgobGUzMl90b19jcHUoKnBkd01JQ19MKSAhPSBkd0xvY2FsTUlDX0wpIHx8CisJCQkgICAgKGxlMzJfdG9fY3B1KCpwZHdNSUNfUikgIT0gZHdMb2NhbE1JQ19SKSB8fAogCQkJICAgIHBEZXZpY2UtPmJSeE1JQ0ZhaWwpIHsKIAkJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJNSUMgY29tcGFyaXNvbiBpcyBmYWlsIVxuIik7CiAJCQkJcERldmljZS0+YlJ4TUlDRmFpbCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rZXkuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2V5LmMKaW5kZXggZWFiM2I0MS4uNzhiNTgwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rZXkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2tleS5jCkBAIC0yNDIsNyArMjQyLDcgQEAKIAkJCQlpZiAodUtleUxlbmd0aCA9PSBXTEFOX1dFUDEwNF9LRVlMRU4pCiAJCQkJCXBLZXktPmFieUtleVsxNV0gfD0gMHg4MDsKIAkJCX0KLQkJCU1BQ3ZTZXRLZXlFbnRyeShkd0lvQmFzZSwgcFRhYmxlLT5LZXlUYWJsZVtpXS53S2V5Q3RsLCBpLCB1S2V5SWR4LCBwYnlCU1NJRCwgKHVuc2lnbmVkIGxvbmcgKilwS2V5LT5hYnlLZXksIGJ5TG9jYWxJRCk7CisJCQlNQUN2U2V0S2V5RW50cnkoZHdJb0Jhc2UsIHBUYWJsZS0+S2V5VGFibGVbaV0ud0tleUN0bCwgaSwgdUtleUlkeCwgcGJ5QlNTSUQsICh1MzIgKilwS2V5LT5hYnlLZXksIGJ5TG9jYWxJRCk7CiAKIAkJCWlmICgoZHdLZXlJbmRleCAmIFVTRV9LRVlSU0MpID09IDApIHsKIAkJCQkvLyBSU0Mgc2V0IGJ5IE5JQwpAQCAtMzA2LDcgKzMwNiw3IEBACiAJCQlpZiAodUtleUxlbmd0aCA9PSBXTEFOX1dFUDEwNF9LRVlMRU4pCiAJCQkJcEtleS0+YWJ5S2V5WzE1XSB8PSAweDgwOwogCQl9Ci0JCU1BQ3ZTZXRLZXlFbnRyeShkd0lvQmFzZSwgcFRhYmxlLT5LZXlUYWJsZVtqXS53S2V5Q3RsLCBqLCB1S2V5SWR4LCBwYnlCU1NJRCwgKHVuc2lnbmVkIGxvbmcgKilwS2V5LT5hYnlLZXksIGJ5TG9jYWxJRCk7CisJCU1BQ3ZTZXRLZXlFbnRyeShkd0lvQmFzZSwgcFRhYmxlLT5LZXlUYWJsZVtqXS53S2V5Q3RsLCBqLCB1S2V5SWR4LCBwYnlCU1NJRCwgKHUzMiAqKXBLZXktPmFieUtleSwgYnlMb2NhbElEKTsKIAogCQlpZiAoKGR3S2V5SW5kZXggJiBVU0VfS0VZUlNDKSA9PSAwKSB7CiAJCQkvLyBSU0Mgc2V0IGJ5IE5JQwpAQCAtNjcwLDcgKzY3MCw3IEBACiAJCWlmICh1S2V5TGVuZ3RoID09IFdMQU5fV0VQMTA0X0tFWUxFTikKIAkJCXBLZXktPmFieUtleVsxNV0gfD0gMHg4MDsKIAl9Ci0JTUFDdlNldEtleUVudHJ5KGR3SW9CYXNlLCBwVGFibGUtPktleVRhYmxlW01BWF9LRVlfVEFCTEUtMV0ud0tleUN0bCwgTUFYX0tFWV9UQUJMRS0xLCB1S2V5SWR4LCBwVGFibGUtPktleVRhYmxlW01BWF9LRVlfVEFCTEUtMV0uYWJ5QlNTSUQsICh1bnNpZ25lZCBsb25nICopcEtleS0+YWJ5S2V5LCBieUxvY2FsSUQpOworCU1BQ3ZTZXRLZXlFbnRyeShkd0lvQmFzZSwgcFRhYmxlLT5LZXlUYWJsZVtNQVhfS0VZX1RBQkxFLTFdLndLZXlDdGwsIE1BWF9LRVlfVEFCTEUtMSwgdUtleUlkeCwgcFRhYmxlLT5LZXlUYWJsZVtNQVhfS0VZX1RBQkxFLTFdLmFieUJTU0lELCAodTMyICopcEtleS0+YWJ5S2V5LCBieUxvY2FsSUQpOwogCiAJaWYgKChkd0tleUluZGV4ICYgVVNFX0tFWVJTQykgPT0gMCkgewogCQkvLyBSU0Mgc2V0IGJ5IE5JQwpAQCAtNzY2LDcgKzc2Niw3IEBACiAJCQkJaWYgKHVLZXlMZW5ndGggPT0gV0xBTl9XRVAxMDRfS0VZTEVOKQogCQkJCQlwS2V5LT5hYnlLZXlbMTVdIHw9IDB4ODA7CiAJCQl9Ci0JCQlNQUN2U2V0S2V5RW50cnkoZHdJb0Jhc2UsIHBUYWJsZS0+S2V5VGFibGVbaV0ud0tleUN0bCwgaSwgdUtleUlkeCwgcFRhYmxlLT5LZXlUYWJsZVtpXS5hYnlCU1NJRCwgKHVuc2lnbmVkIGxvbmcgKilwS2V5LT5hYnlLZXksIGJ5TG9jYWxJRCk7CisJCQlNQUN2U2V0S2V5RW50cnkoZHdJb0Jhc2UsIHBUYWJsZS0+S2V5VGFibGVbaV0ud0tleUN0bCwgaSwgdUtleUlkeCwgcFRhYmxlLT5LZXlUYWJsZVtpXS5hYnlCU1NJRCwgKHUzMiAqKXBLZXktPmFieUtleSwgYnlMb2NhbElEKTsKIAogCQkJaWYgKChkd0tleUluZGV4ICYgVVNFX0tFWVJTQykgPT0gMCkgewogCQkJCS8vIFJTQyBzZXQgYnkgTklDCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9tYWMuYwppbmRleCAyMWJkOGExLi4wZWMwNzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21hYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWFjLmMKQEAgLTE0MjgsMTAgKzE0MjgsMTAgQEAKICAqLwogCiB2b2lkIE1BQ3ZTZXRLZXlFbnRyeSh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBzaG9ydCB3S2V5Q3RsLCB1bnNpZ25lZCBpbnQgdUVudHJ5SWR4LAotCQkgICAgIHVuc2lnbmVkIGludCB1S2V5SWR4LCB1bnNpZ25lZCBjaGFyICpwYnlBZGRyLCB1bnNpZ25lZCBsb25nICpwZHdLZXksIHVuc2lnbmVkIGNoYXIgYnlMb2NhbElEKQorCQkgICAgIHVuc2lnbmVkIGludCB1S2V5SWR4LCB1bnNpZ25lZCBjaGFyICpwYnlBZGRyLCB1MzIgKnBkd0tleSwgdW5zaWduZWQgY2hhciBieUxvY2FsSUQpCiB7CiAJdW5zaWduZWQgc2hvcnQgd09mZnNldDsKLQl1bnNpZ25lZCBsb25nIGR3RGF0YTsKKwl1MzIgZHdEYXRhOwogCWludCAgICAgaWk7CiAKIAlpZiAoYnlMb2NhbElEIDw9IDEpCkBAIC0xNDQ1LDcgKzE0NDUsNyBAQAogCWR3RGF0YSB8PSB3S2V5Q3RsOwogCWR3RGF0YSA8PD0gMTY7CiAJZHdEYXRhIHw9IE1BS0VXT1JEKCoocGJ5QWRkcis0KSwgKihwYnlBZGRyKzUpKTsKLQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICIxLiB3T2Zmc2V0OiAlZCwgRGF0YTogJWxYLCBLZXlDdGw6JVhcbiIsIHdPZmZzZXQsIGR3RGF0YSwgd0tleUN0bCk7CisJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiMS4gd09mZnNldDogJWQsIERhdGE6ICVYLCBLZXlDdGw6JVhcbiIsIHdPZmZzZXQsIGR3RGF0YSwgd0tleUN0bCk7CiAKIAlWTlN2T3V0UG9ydFcoZHdJb0Jhc2UgKyBNQUNfUkVHX01JU0NGRk5ERVgsIHdPZmZzZXQpOwogCVZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfTUlTQ0ZGREFUQSwgZHdEYXRhKTsKQEAgLTE0NjAsNyArMTQ2MCw3IEBACiAJZHdEYXRhIHw9ICoocGJ5QWRkcisxKTsKIAlkd0RhdGEgPDw9IDg7CiAJZHdEYXRhIHw9ICoocGJ5QWRkciswKTsKLQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICIyLiB3T2Zmc2V0OiAlZCwgRGF0YTogJWxYXG4iLCB3T2Zmc2V0LCBkd0RhdGEpOworCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIjIuIHdPZmZzZXQ6ICVkLCBEYXRhOiAlWFxuIiwgd09mZnNldCwgZHdEYXRhKTsKIAogCVZOU3ZPdXRQb3J0Vyhkd0lvQmFzZSArIE1BQ19SRUdfTUlTQ0ZGTkRFWCwgd09mZnNldCk7CiAJVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19NSVNDRkZEQVRBLCBkd0RhdGEpOwpAQCAtMTQ3MCw3ICsxNDcwLDcgQEAKIAl3T2Zmc2V0ICs9ICh1S2V5SWR4ICogNCk7CiAJZm9yIChpaSA9IDA7IGlpIDwgNDsgaWkrKykgewogCQkvLyBhbHdheXMgcHVzaCAxMjggYml0cwotCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICIzLiglZCkgd09mZnNldDogJWQsIERhdGE6ICVsWFxuIiwgaWksIHdPZmZzZXQraWksICpwZHdLZXkpOworCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICIzLiglZCkgd09mZnNldDogJWQsIERhdGE6ICVYXG4iLCBpaSwgd09mZnNldCtpaSwgKnBkd0tleSk7CiAJCVZOU3ZPdXRQb3J0Vyhkd0lvQmFzZSArIE1BQ19SRUdfTUlTQ0ZGTkRFWCwgd09mZnNldCtpaSk7CiAJCVZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfTUlTQ0ZGREFUQSwgKnBkd0tleSsrKTsKIAkJVk5Tdk91dFBvcnRXKGR3SW9CYXNlICsgTUFDX1JFR19NSVNDRkZDVEwsIE1JU0NGRkNUTF9XUklURSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21hYy5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9tYWMuaAppbmRleCAzZjE3N2Y3Li40NjE1ZGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21hYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWFjLmgKQEAgLTEwMzgsNyArMTAzOCw3IEBACiBib29sIE1BQ2JQU1dha2V1cCh1bnNpZ25lZCBsb25nIGR3SW9CYXNlKTsKIAogdm9pZCBNQUN2U2V0S2V5RW50cnkodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgc2hvcnQgd0tleUN0bCwgdW5zaWduZWQgaW50IHVFbnRyeUlkeCwKLQkJICAgICB1bnNpZ25lZCBpbnQgdUtleUlkeCwgdW5zaWduZWQgY2hhciAqcGJ5QWRkciwgdW5zaWduZWQgbG9uZyAqcGR3S2V5LCB1bnNpZ25lZCBjaGFyIGJ5TG9jYWxJRCk7CisJCSAgICAgdW5zaWduZWQgaW50IHVLZXlJZHgsIHVuc2lnbmVkIGNoYXIgKnBieUFkZHIsIHUzMiAqcGR3S2V5LCB1bnNpZ25lZCBjaGFyIGJ5TG9jYWxJRCk7CiB2b2lkIE1BQ3ZEaXNhYmxlS2V5RW50cnkodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgaW50IHVFbnRyeUlkeCk7CiB2b2lkIE1BQ3ZTZXREZWZhdWx0S2V5RW50cnkodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgaW50IHVLZXlMZW4sCiAJCQkgICAgdW5zaWduZWQgaW50IHVLZXlJZHgsIHVuc2lnbmVkIGxvbmcgKnBkd0tleSwgdW5zaWduZWQgY2hhciBieUxvY2FsSUQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWNoYWVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pY2hhZWwuYwppbmRleCA3ZWE1ZjdmLi5hZGU0Yzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pY2hhZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pY2hhZWwuYwpAQCAtNTMsMTQgKzUzLDE0IEBACiAqLwogc3RhdGljIHZvaWQgc192Q2xlYXIodm9pZCk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgaW50ZXJuYWwgbWVzc2FnZSwKIC8vIHJlc2V0cyB0aGUgb2JqZWN0IHRvIHRoZSBzdGF0ZSBqdXN0IGFmdGVyIGNvbnN0cnVjdGlvbi4KLXN0YXRpYyB2b2lkIHNfdlNldEtleSh1bnNpZ25lZCBsb25nIGR3SzAsIHVuc2lnbmVkIGxvbmcgZHdLMSk7CitzdGF0aWMgdm9pZCBzX3ZTZXRLZXkodTMyICBkd0swLCB1MzIgIGR3SzEpOwogc3RhdGljIHZvaWQgc192QXBwZW5kQnl0ZSh1bnNpZ25lZCBjaGFyIGIpOyAgICAgICAgICAgIC8vIEFkZCBhIHNpbmdsZSBieXRlIHRvIHRoZSBpbnRlcm5hbCBtZXNzYWdlCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgVmFyaWFibGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBMLCBSOyAgICAgICAgICAgLy8gQ3VycmVudCBzdGF0ZQorc3RhdGljIHUzMiBMLCBSOwkvKiBDdXJyZW50IHN0YXRlICovCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIEswLCBLMTsgICAgICAgICAvLyBLZXkKLXN0YXRpYyB1bnNpZ25lZCBsb25nIE07ICAgICAgICAgICAgICAvLyBNZXNzYWdlIGFjY3VtdWxhdG9yIChzaW5nbGUgd29yZCkKK3N0YXRpYyB1MzIgSzAsIEsxOwkvKiBLZXkgKi8KK3N0YXRpYyB1MzIgTTsJCS8qIE1lc3NhZ2UgYWNjdW11bGF0b3IgKHNpbmdsZSB3b3JkKSAqLwogc3RhdGljIHVuc2lnbmVkIGludCBuQnl0ZXNJbk07ICAgICAgLy8gIyBieXRlcyBpbiBNCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC05OCw3ICs5OCw3IEBACiAJTSA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNfdlNldEtleSh1bnNpZ25lZCBsb25nIGR3SzAsIHVuc2lnbmVkIGxvbmcgZHdLMSkKK3N0YXRpYyB2b2lkIHNfdlNldEtleSh1MzIgZHdLMCwgdTMyIGR3SzEpCiB7CiAJLy8gU2V0IHRoZSBrZXkKIAlLMCA9IGR3SzA7CkBAIC0xMjksNyArMTI5LDcgQEAKIAl9CiB9CiAKLXZvaWQgTUlDX3ZJbml0KHVuc2lnbmVkIGxvbmcgZHdLMCwgdW5zaWduZWQgbG9uZyBkd0sxKQordm9pZCBNSUNfdkluaXQodTMyIGR3SzAsIHUzMiBkd0sxKQogewogCS8vIFNldCB0aGUga2V5CiAJc192U2V0S2V5KGR3SzAsIGR3SzEpOwpAQCAtMTU1LDcgKzE1NSw3IEBACiAJfQogfQogCi12b2lkIE1JQ192R2V0TUlDKHVuc2lnbmVkIGxvbmcgKnBkd0wsIHVuc2lnbmVkIGxvbmcgKnBkd1IpCit2b2lkIE1JQ192R2V0TUlDKHUzMiAqcGR3TCwgdTMyICpwZHdSKQogewogCS8vIEFwcGVuZCB0aGUgbWluaW11bSBwYWRkaW5nCiAJc192QXBwZW5kQnl0ZSgweDVhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWljaGFlbC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWNoYWVsLmgKaW5kZXggMzg3ZDIwNi4uZjZjMmMxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWNoYWVsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWNoYWVsLmgKQEAgLTMxLDExICszMSwxMyBAQAogI2lmbmRlZiBfX01JQ0hBRUxfSF9fCiAjZGVmaW5lIF9fTUlDSEFFTF9IX18KIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgRGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgVHlwZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXZvaWQgTUlDX3ZJbml0KHVuc2lnbmVkIGxvbmcgZHdLMCwgdW5zaWduZWQgbG9uZyBkd0sxKTsKK3ZvaWQgTUlDX3ZJbml0KHUzMiBkd0swLCB1MzIgZHdLMSk7CiAKIHZvaWQgTUlDX3ZVbkluaXQodm9pZCk7CiAKQEAgLTQ0LDcgKzQ2LDcgQEAKIAogLyogR2V0IHRoZSBNSUMgcmVzdWx0LiBEZXN0aW5hdGlvbiBzaG91bGQgYWNjZXB0IDggYnl0ZXMgb2YgcmVzdWx0LiAqLwogLyogVGhpcyBhbHNvIHJlc2V0cyB0aGUgbWVzc2FnZSB0byBlbXB0eS4gKi8KLXZvaWQgTUlDX3ZHZXRNSUModW5zaWduZWQgbG9uZyAqcGR3TCwgdW5zaWduZWQgbG9uZyAqcGR3Uik7Cit2b2lkIE1JQ192R2V0TUlDKHUzMiAqcGR3TCwgdTMyICpwZHdSKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBNYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yeHR4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguYwppbmRleCA2YWZmZDZlLi5jMjY1M2ViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguYwpAQCAtMTI1NywxMSArMTI1NywxMSBAQAogLy8gICAgdW5zaWduZWQgY2hhciBhYnlUbXBbOF07CiAvLyAgICB1bnNpZ25lZCBsb25nIGR3Q1JDOwogCXVuc2lnbmVkIGludCBjYk1JQ0hEUiA9IDA7Ci0JdW5zaWduZWQgbG9uZyBkd01JQ0tleTAsIGR3TUlDS2V5MTsKLQl1bnNpZ25lZCBsb25nIGR3TUlDX1ByaW9yaXR5OwotCXVuc2lnbmVkIGxvbmcgKnBkd01JQ19MOwotCXVuc2lnbmVkIGxvbmcgKnBkd01JQ19SOwotCXVuc2lnbmVkIGxvbmcgZHdTYWZlTUlDX0wsIGR3U2FmZU1JQ19SOyAvL0ZpeCAiTGFzdCBGcmFnIFNpemUiIDwgIk1JQyBsZW5ndGgiLgorCXUzMiBkd01JQ0tleTAsIGR3TUlDS2V5MTsKKwl1MzIgZHdNSUNfUHJpb3JpdHk7CisJdTMyICpwZHdNSUNfTDsKKwl1MzIgKnBkd01JQ19SOworCXUzMiBkd1NhZmVNSUNfTCwgZHdTYWZlTUlDX1I7IC8qIEZpeCAiTGFzdCBGcmFnIFNpemUiIDwgIk1JQyBsZW5ndGgiLiAqLwogCWJvb2wgYk1JQzJGcmFnID0gZmFsc2U7CiAJdW5zaWduZWQgaW50IHVNSUNGcmFnTGVuID0gMDsKIAl1bnNpZ25lZCBpbnQgdU1BQ2ZyYWdOdW0gPSAxOwpAQCAtMTQzNCwyMSArMTQzNCwyMSBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAJaWYgKChiTmVlZEVuY3J5cHQgPT0gdHJ1ZSkgJiYgKHBUcmFuc21pdEtleSAhPSBOVUxMKSAmJiAocFRyYW5zbWl0S2V5LT5ieUNpcGhlclN1aXRlID09IEtFWV9DVExfVEtJUCkpIHsKIAkJaWYgKHBEZXZpY2UtPnBNZ210LT5lQXV0aGVuTW9kZSA9PSBXTUFDX0FVVEhfV1BBTk9ORSkgewotCQkJZHdNSUNLZXkwID0gKih1bnNpZ25lZCBsb25nICopKCZwVHJhbnNtaXRLZXktPmFieUtleVsxNl0pOwotCQkJZHdNSUNLZXkxID0gKih1bnNpZ25lZCBsb25nICopKCZwVHJhbnNtaXRLZXktPmFieUtleVsyMF0pOworCQkJZHdNSUNLZXkwID0gKih1MzIgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzE2XSk7CisJCQlkd01JQ0tleTEgPSAqKHUzMiAqKSgmcFRyYW5zbWl0S2V5LT5hYnlLZXlbMjBdKTsKIAkJfSBlbHNlIGlmICgocFRyYW5zbWl0S2V5LT5kd0tleUluZGV4ICYgQVVUSEVOVElDQVRPUl9LRVkpICE9IDApIHsKLQkJCWR3TUlDS2V5MCA9ICoodW5zaWduZWQgbG9uZyAqKSgmcFRyYW5zbWl0S2V5LT5hYnlLZXlbMTZdKTsKLQkJCWR3TUlDS2V5MSA9ICoodW5zaWduZWQgbG9uZyAqKSgmcFRyYW5zbWl0S2V5LT5hYnlLZXlbMjBdKTsKKwkJCWR3TUlDS2V5MCA9ICoodTMyICopKCZwVHJhbnNtaXRLZXktPmFieUtleVsxNl0pOworCQkJZHdNSUNLZXkxID0gKih1MzIgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzIwXSk7CiAJCX0gZWxzZSB7Ci0JCQlkd01JQ0tleTAgPSAqKHVuc2lnbmVkIGxvbmcgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzI0XSk7Ci0JCQlkd01JQ0tleTEgPSAqKHVuc2lnbmVkIGxvbmcgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzI4XSk7CisJCQlkd01JQ0tleTAgPSAqKHUzMiAqKSgmcFRyYW5zbWl0S2V5LT5hYnlLZXlbMjRdKTsKKwkJCWR3TUlDS2V5MSA9ICoodTMyICopKCZwVHJhbnNtaXRLZXktPmFieUtleVsyOF0pOwogCQl9CiAJCS8vIERPIFNvZnR3YXJlIE1pY2hhZWwKIAkJTUlDX3ZJbml0KGR3TUlDS2V5MCwgZHdNSUNLZXkxKTsKIAkJTUlDX3ZBcHBlbmQoKHVuc2lnbmVkIGNoYXIgKikmKHBzRXRoSGVhZGVyLT5hYnlEc3RBZGRyWzBdKSwgMTIpOwogCQlkd01JQ19Qcmlvcml0eSA9IDA7CiAJCU1JQ192QXBwZW5kKCh1bnNpZ25lZCBjaGFyICopJmR3TUlDX1ByaW9yaXR5LCA0KTsKLQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiTUlDIEtFWTogJWxYLCAlbFhcbiIsIGR3TUlDS2V5MCwgZHdNSUNLZXkxKTsKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiTUlDIEtFWTogJVgsICVYXG4iLCBkd01JQ0tleTAsIGR3TUlDS2V5MSk7CiAJfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xNjI0LDEwICsxNjI0LDEwIEBACiAJCQkJCWlmIChiTUlDMkZyYWcgPT0gZmFsc2UpIHsKIAkJCQkJCWlmICh1VG1wTGVuICE9IDApCiAJCQkJCQkJTUlDX3ZBcHBlbmQoKHBieUJ1ZmZlciArIHVMZW5ndGgpLCB1VG1wTGVuKTsKLQkJCQkJCXBkd01JQ19MID0gKHVuc2lnbmVkIGxvbmcgKikocGJ5QnVmZmVyICsgdUxlbmd0aCArIHVUbXBMZW4pOwotCQkJCQkJcGR3TUlDX1IgPSAodW5zaWduZWQgbG9uZyAqKShwYnlCdWZmZXIgKyB1TGVuZ3RoICsgdVRtcExlbiArIDQpOworCQkJCQkJcGR3TUlDX0wgPSAodTMyICopKHBieUJ1ZmZlciArIHVMZW5ndGggKyB1VG1wTGVuKTsKKwkJCQkJCXBkd01JQ19SID0gKHUzMiAqKShwYnlCdWZmZXIgKyB1TGVuZ3RoICsgdVRtcExlbiArIDQpOwogCQkJCQkJTUlDX3ZHZXRNSUMocGR3TUlDX0wsIHBkd01JQ19SKTsKLQkJCQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkxhc3QgTUlDOiVsWCwgJWxYXG4iLCAqcGR3TUlDX0wsICpwZHdNSUNfUik7CisJCQkJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJMYXN0IE1JQzolWCwgJVhcbiIsICpwZHdNSUNfTCwgKnBkd01JQ19SKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWlmICh1TUlDRnJhZ0xlbiA+PSA0KSB7CiAJCQkJCQkJbWVtY3B5KChwYnlCdWZmZXIgKyB1TGVuZ3RoKSwgKCh1bnNpZ25lZCBjaGFyICopJmR3U2FmZU1JQ19SICsgKHVNSUNGcmFnTGVuIC0gNCkpLApAQCAtMTc0NCw4ICsxNzQ0LDggQEAKIAkJCQkJCXVNSUNGcmFnTGVuID0gY2JGcmFnUGF5bG9hZFNpemUgLSB1VG1wTGVuOwogCQkJCQkJQVNTRVJUKHVNSUNGcmFnTGVuIDwgY2JNSUNsZW4pOwogCi0JCQkJCQlwZHdNSUNfTCA9ICh1bnNpZ25lZCBsb25nICopKHBieUJ1ZmZlciArIHVMZW5ndGggKyB1VG1wTGVuKTsKLQkJCQkJCXBkd01JQ19SID0gKHVuc2lnbmVkIGxvbmcgKikocGJ5QnVmZmVyICsgdUxlbmd0aCArIHVUbXBMZW4gKyA0KTsKKwkJCQkJCXBkd01JQ19MID0gKHUzMiAqKShwYnlCdWZmZXIgKyB1TGVuZ3RoICsgdVRtcExlbik7CisJCQkJCQlwZHdNSUNfUiA9ICh1MzIgKikocGJ5QnVmZmVyICsgdUxlbmd0aCArIHVUbXBMZW4gKyA0KTsKIAkJCQkJCU1JQ192R2V0TUlDKHBkd01JQ19MLCBwZHdNSUNfUik7CiAJCQkJCQlkd1NhZmVNSUNfTCA9ICpwZHdNSUNfTDsKIAkJCQkJCWR3U2FmZU1JQ19SID0gKnBkd01JQ19SOwpAQCAtMTc1OSw3ICsxNzU5LDcgQEAKIAkJCQkJCSAgfQogCQkJCQkJICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJcbiIpOwogCQkJCQkJKi8KLQkJCQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkdldCBNSUM6JWxYLCAlbFhcbiIsICpwZHdNSUNfTCwgKnBkd01JQ19SKTsKKwkJCQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkdldCBNSUM6JVgsICVYXG4iLCAqcGR3TUlDX0wsICpwZHdNSUNfUik7CiAJCQkJCX0KIAkJCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiTWlkZGxlIGZyYWcgbGVuOiAlZFxuIiwgdVRtcExlbik7CiAJCQkJCS8qCkBAIC0xODczLDggKzE4NzMsOCBAQAogCiAJCQlNSUNfdkFwcGVuZCgocGJ5QnVmZmVyICsgdUxlbmd0aCAtIGNiODAyXzFfSF9sZW4pLCBjYkZyYW1lQm9keVNpemUpOwogCi0JCQlwZHdNSUNfTCA9ICh1bnNpZ25lZCBsb25nICopKHBieUJ1ZmZlciArIHVMZW5ndGggLSBjYjgwMl8xX0hfbGVuICsgY2JGcmFtZUJvZHlTaXplKTsKLQkJCXBkd01JQ19SID0gKHVuc2lnbmVkIGxvbmcgKikocGJ5QnVmZmVyICsgdUxlbmd0aCAtIGNiODAyXzFfSF9sZW4gKyBjYkZyYW1lQm9keVNpemUgKyA0KTsKKwkJCXBkd01JQ19MID0gKHUzMiAqKShwYnlCdWZmZXIgKyB1TGVuZ3RoIC0gY2I4MDJfMV9IX2xlbiArIGNiRnJhbWVCb2R5U2l6ZSk7CisJCQlwZHdNSUNfUiA9ICh1MzIgKikocGJ5QnVmZmVyICsgdUxlbmd0aCAtIGNiODAyXzFfSF9sZW4gKyBjYkZyYW1lQm9keVNpemUgKyA0KTsKIAogCQkJTUlDX3ZHZXRNSUMocGR3TUlDX0wsIHBkd01JQ19SKTsKIAkJCU1JQ192VW5Jbml0KCk7CkBAIC0xODg3LDcgKzE4ODcsNyBAQAogCiAJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJ1TGVuZ3RoOiAlZCwgJWRcbiIsIHVMZW5ndGgsIGNiRnJhbWVCb2R5U2l6ZSk7CiAJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJjYlJlcUNvdW50OiVkLCAlZCwgJWQsICVkXG4iLCBjYlJlcUNvdW50LCBjYkhlYWRlckxlbmd0aCwgdVBhZGRpbmcsIGNiSVZsZW4pOwotCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiTUlDOiVseCwgJWx4XG4iLCAqcGR3TUlDX0wsICpwZHdNSUNfUik7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJNSUM6JXgsICV4XG4iLCAqcGR3TUlDX0wsICpwZHdNSUNfUik7CiAvKgogICBmb3IgKGlpID0gMDsgaWkgPCA4OyBpaSsrKSB7CiAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIiUwMnggIiwgKigoKHVuc2lnbmVkIGNoYXIgKikocGR3TUlDX0wpICsgaWkpKSk7CkBAIC0yNTkyLDEwICsyNTkyLDEwIEBACiAJdW5zaWduZWQgaW50IHVQYWRkaW5nID0gMDsKIAl1bnNpZ25lZCBpbnQgY2JNSUNIRFIgPSAwOwogCXVuc2lnbmVkIGludCB1TGVuZ3RoID0gMDsKLQl1bnNpZ25lZCBsb25nIGR3TUlDS2V5MCwgZHdNSUNLZXkxOwotCXVuc2lnbmVkIGxvbmcgZHdNSUNfUHJpb3JpdHk7Ci0JdW5zaWduZWQgbG9uZyAqcGR3TUlDX0w7Ci0JdW5zaWduZWQgbG9uZyAqcGR3TUlDX1I7CisJdTMyIGR3TUlDS2V5MCwgZHdNSUNLZXkxOworCXUzMiBkd01JQ19Qcmlvcml0eTsKKwl1MzIgKnBkd01JQ19MOworCXUzMiAqcGR3TUlDX1I7CiAJdW5zaWduZWQgc2hvcnQgd1R4QnVmU2l6ZTsKIAl1bnNpZ25lZCBpbnQgY2JNYWNIZExlbjsKIAlTRXRoZXJuZXRIZWFkZXIgc0V0aEhlYWRlcjsKQEAgLTI4NDEsMjIgKzI4NDEsMjIgQEAKIAkJfQogCiAJCWlmICgocFRyYW5zbWl0S2V5ICE9IE5VTEwpICYmIChwVHJhbnNtaXRLZXktPmJ5Q2lwaGVyU3VpdGUgPT0gS0VZX0NUTF9US0lQKSkgewotCQkJZHdNSUNLZXkwID0gKih1bnNpZ25lZCBsb25nICopKCZwVHJhbnNtaXRLZXktPmFieUtleVsxNl0pOwotCQkJZHdNSUNLZXkxID0gKih1bnNpZ25lZCBsb25nICopKCZwVHJhbnNtaXRLZXktPmFieUtleVsyMF0pOworCQkJZHdNSUNLZXkwID0gKih1MzIgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzE2XSk7CisJCQlkd01JQ0tleTEgPSAqKHUzMiAqKSgmcFRyYW5zbWl0S2V5LT5hYnlLZXlbMjBdKTsKIAogCQkJLy8gRE8gU29mdHdhcmUgTWljaGFlbAogCQkJTUlDX3ZJbml0KGR3TUlDS2V5MCwgZHdNSUNLZXkxKTsKIAkJCU1JQ192QXBwZW5kKCh1bnNpZ25lZCBjaGFyICopJihzRXRoSGVhZGVyLmFieURzdEFkZHJbMF0pLCAxMik7CiAJCQlkd01JQ19Qcmlvcml0eSA9IDA7CiAJCQlNSUNfdkFwcGVuZCgodW5zaWduZWQgY2hhciAqKSZkd01JQ19Qcmlvcml0eSwgNCk7Ci0JCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJETUEwX3R4XzgwMjE6TUlDIEtFWTogJWxYLCAlbFhcbiIsIGR3TUlDS2V5MCwgZHdNSUNLZXkxKTsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkRNQTBfdHhfODAyMTpNSUMgS0VZOiAlWCwgJVhcbiIsIGR3TUlDS2V5MCwgZHdNSUNLZXkxKTsKIAogCQkJdUxlbmd0aCA9IGNiSGVhZGVyU2l6ZSArIGNiTWFjSGRMZW4gKyB1UGFkZGluZyArIGNiSVZsZW47CiAKIAkJCU1JQ192QXBwZW5kKChwYnlUeEJ1ZmZlckFkZHIgKyB1TGVuZ3RoKSwgY2JGcmFtZUJvZHlTaXplKTsKIAotCQkJcGR3TUlDX0wgPSAodW5zaWduZWQgbG9uZyAqKShwYnlUeEJ1ZmZlckFkZHIgKyB1TGVuZ3RoICsgY2JGcmFtZUJvZHlTaXplKTsKLQkJCXBkd01JQ19SID0gKHVuc2lnbmVkIGxvbmcgKikocGJ5VHhCdWZmZXJBZGRyICsgdUxlbmd0aCArIGNiRnJhbWVCb2R5U2l6ZSArIDQpOworCQkJcGR3TUlDX0wgPSAodTMyICopKHBieVR4QnVmZmVyQWRkciArIHVMZW5ndGggKyBjYkZyYW1lQm9keVNpemUpOworCQkJcGR3TUlDX1IgPSAodTMyICopKHBieVR4QnVmZmVyQWRkciArIHVMZW5ndGggKyBjYkZyYW1lQm9keVNpemUgKyA0KTsKIAogCQkJTUlDX3ZHZXRNSUMocGR3TUlDX0wsIHBkd01JQ19SKTsKIAkJCU1JQ192VW5Jbml0KCk7CkBAIC0yODY5LDcgKzI4NjksNyBAQAogCiAJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJ1TGVuZ3RoOiAlZCwgJWRcbiIsIHVMZW5ndGgsIGNiRnJhbWVCb2R5U2l6ZSk7CiAJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJjYlJlcUNvdW50OiVkLCAlZCwgJWQsICVkXG4iLCBjYlJlcUNvdW50LCBjYkhlYWRlclNpemUsIHVQYWRkaW5nLCBjYklWbGVuKTsKLQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIk1JQzolbHgsICVseFxuIiwgKnBkd01JQ19MLCAqcGR3TUlDX1IpOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiTUlDOiV4LCAleFxuIiwgKnBkd01JQ19MLCAqcGR3TUlDX1IpOwogCiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93bWdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dtZ3IuYwppbmRleCA1MjAwYTJhLi5iNjczYmM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dtZ3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dtZ3IuYwpAQCAtOTY3LDEwICs5NjcsMTAgQEAKIAkJc0ZyYW1lLnBCdWYgPSAodW5zaWduZWQgY2hhciAqKXBSeFBhY2tldC0+cDgwMjExSGVhZGVyOwogCQkvLyBkZWNvZGUgdGhlIGZyYW1lCiAJCXZNZ3JEZWNvZGVBc3NvY1Jlc3BvbnNlKCZzRnJhbWUpOwotCQlpZiAoKHNGcmFtZS5wd0NhcEluZm8gPT0gMCkgfHwKLQkJICAgIChzRnJhbWUucHdTdGF0dXMgPT0gMCkgfHwKLQkJICAgIChzRnJhbWUucHdBaWQgPT0gMCkgfHwKLQkJICAgIChzRnJhbWUucFN1cHBSYXRlcyA9PSAwKSkgeworCQlpZiAoKHNGcmFtZS5wd0NhcEluZm8gPT0gTlVMTCkgfHwKKwkJICAgIChzRnJhbWUucHdTdGF0dXMgPT0gTlVMTCkgfHwKKwkJICAgIChzRnJhbWUucHdBaWQgPT0gTlVMTCkgfHwKKwkJICAgIChzRnJhbWUucFN1cHBSYXRlcyA9PSBOVUxMKSkgewogCQkJREJHX1BPUlQ4MCgweENDKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMTgxMiwxMCArMTgxMiwxMCBAQAogCS8vIGRlY29kZSB0aGUgYmVhY29uIGZyYW1lCiAJdk1nckRlY29kZUJlYWNvbigmc0ZyYW1lKTsKIAotCWlmICgoc0ZyYW1lLnB3QmVhY29uSW50ZXJ2YWwgPT0gMCkgfHwKLQkgICAgKHNGcmFtZS5wd0NhcEluZm8gPT0gMCkgfHwKLQkgICAgKHNGcmFtZS5wU1NJRCA9PSAwKSB8fAotCSAgICAoc0ZyYW1lLnBTdXBwUmF0ZXMgPT0gMCkpIHsKKwlpZiAoKHNGcmFtZS5wd0JlYWNvbkludGVydmFsID09IE5VTEwpIHx8CisJICAgIChzRnJhbWUucHdDYXBJbmZvID09IE5VTEwpIHx8CisJICAgIChzRnJhbWUucFNTSUQgPT0gTlVMTCkgfHwKKwkgICAgKHNGcmFtZS5wU3VwcFJhdGVzID09IE5VTEwpKSB7CiAJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlJ4IGJlYWNvbiBmcmFtZSBlcnJvclxuIik7CiAJCXJldHVybjsKIAl9CkBAIC0yMDcyLDcgKzIwNzIsNyBAQAogCQlpZiAoYlRTRkxhcmdlRGlmZikKIAkJCWJVcGRhdGVUU0YgPSB0cnVlOwogCi0JCWlmIChwRGV2aWNlLT5iRW5hYmxlUFNNb2RlICYmIChzRnJhbWUucFRJTSAhPSAwKSkgeworCQlpZiAocERldmljZS0+YkVuYWJsZVBTTW9kZSAmJiAoc0ZyYW1lLnBUSU0gIT0gTlVMTCkpIHsKIAkJCS8vIGRlYWwgd2l0aCBEVElNLCBhbmFseXNpcyBUSU0KIAkJCXBNZ210LT5iTXVsdGljYXN0VElNID0gV0xBTl9NR01UX0lTX01VTFRJQ0FTVF9USU0oc0ZyYW1lLnBUSU0tPmJ5Qml0TWFwQ3RsKSA/IHRydWUgOiBmYWxzZTsKIAkJCXBNZ210LT5ieURUSU1Db3VudCA9IHNGcmFtZS5wVElNLT5ieURUSU1Db3VudDsKQEAgLTQxMDcsMTEgKzQxMDcsMTEgQEAKIAlzRnJhbWUucEJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopcFJ4UGFja2V0LT5wODAyMTFIZWFkZXI7CiAJdk1nckRlY29kZVByb2JlUmVzcG9uc2UoJnNGcmFtZSk7CiAKLQlpZiAoKHNGcmFtZS5wcXdUaW1lc3RhbXAgPT0gMCkgfHwKLQkgICAgKHNGcmFtZS5wd0JlYWNvbkludGVydmFsID09IDApIHx8Ci0JICAgIChzRnJhbWUucHdDYXBJbmZvID09IDApIHx8Ci0JICAgIChzRnJhbWUucFNTSUQgPT0gMCkgfHwKLQkgICAgKHNGcmFtZS5wU3VwcFJhdGVzID09IDApKSB7CisJaWYgKChzRnJhbWUucHF3VGltZXN0YW1wID09IE5VTEwpIHx8CisJICAgIChzRnJhbWUucHdCZWFjb25JbnRlcnZhbCA9PSBOVUxMKSB8fAorCSAgICAoc0ZyYW1lLnB3Q2FwSW5mbyA9PSBOVUxMKSB8fAorCSAgICAoc0ZyYW1lLnBTU0lEID09IE5VTEwpIHx8CisJICAgIChzRnJhbWUucFN1cHBSYXRlcyA9PSBOVUxMKSkgewogCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJQcm9iZSByZXNwOkZhaWwgYWRkcjpbJXBdIFxuIiwgcFJ4UGFja2V0LT5wODAyMTFIZWFkZXIpOwogCQlEQkdfUE9SVDgwKDB4Q0MpOwogCQlyZXR1cm47CkBAIC00MTIwLDcgKzQxMjAsNyBAQAogCWlmIChzRnJhbWUucFNTSUQtPmxlbiA9PSAwKQogCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJSeCBQcm9iZSByZXNwOiBTU0lEIGxlbiA9IDAgXG4iKTsKIAotCWlmIChzRnJhbWUucERTUGFybXMgIT0gMCkgeworCWlmIChzRnJhbWUucERTUGFybXMgIT0gTlVMTCkgewogCQlpZiAoYnlDdXJyQ2hhbm5lbCA+IENCX01BWF9DSEFOTkVMXzI0RykgewogCQkJLy8gY2hhbm5lbCByZW1hcHBpbmcgdG8KIAkJCWJ5SUVDaGFubmVsID0gZ2V0X2NoYW5uZWxfbWFwcGluZyhwTWdtdC0+cEFkYXB0ZXIsIHNGcmFtZS5wRFNQYXJtcy0+YnlDdXJyQ2hhbm5lbCwgUEhZX1RZUEVfMTFBKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvODAyMTFoZHIuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvODAyMTFoZHIuaAppbmRleCAwMDAzMDRmLi4xZTc3OGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2LzgwMjExaGRyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni84MDIxMWhkci5oCkBAIC0xNTEsNyArMTUxLDcgQEAKICNpZmRlZiBfX0JJR19FTkRJQU4KIAogLyogR0VUICYgU0VUIEZyYW1lIENvbnRyb2wgYml0ICovCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX1BSVkVSKG4pICAgICgoKCh1MTYpKG4pID4+IDgpICYgKEJJVDAgfCBCSVQxKSkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfUFJWRVIobikgICAgKCgodTE2KShuKSA+PiA4KSAmIChCSVQwIHwgQklUMSkpCiAjZGVmaW5lIFdMQU5fR0VUX0ZDX0ZUWVBFKG4pICAgICgoKCh1MTYpKG4pID4+IDgpICYgKEJJVDIgfCBCSVQzKSkgPj4gMikKICNkZWZpbmUgV0xBTl9HRVRfRkNfRlNUWVBFKG4pICAgKCgoKHUxNikobikgPj4gOCkgXAogCQkJCSAgJiAoQklUNHxCSVQ1fEJJVDZ8QklUNykpID4+IDQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Flc19jY21wLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Flc19jY21wLmMKaW5kZXggNjFiOWY3Yi4uZTJiZmE4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9hZXNfY2NtcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYWVzX2NjbXAuYwpAQCAtMjY5LDkgKzI2OSw5IEBACiAJLyogTUlDX0hEUjEgKi8KIAlNSUNfSERSMVswXSA9ICh1OCkod0hMZW4gPj4gOCk7CiAJTUlDX0hEUjFbMV0gPSAodTgpKHdITGVuICYgMHhmZik7Ci0JYnlUbXAgPSAodTgpKHBNQUNIZWFkZXItPmZyYW1lX2NvbnRyb2wgJiAweGZmKTsKKwlieVRtcCA9ICh1OCkobGUxNl90b19jcHUocE1BQ0hlYWRlci0+ZnJhbWVfY29udHJvbCkgPj4gOCk7CiAJTUlDX0hEUjFbMl0gPSBieVRtcCAmIDB4OGY7Ci0JYnlUbXAgPSAodTgpKHBNQUNIZWFkZXItPmZyYW1lX2NvbnRyb2wgPj4gOCk7CisJYnlUbXAgPSAodTgpKGxlMTZfdG9fY3B1KHBNQUNIZWFkZXItPmZyYW1lX2NvbnRyb2wpICYgMHhmZik7CiAJYnlUbXAgJj0gMHg4NzsKIAlNSUNfSERSMVszXSA9IGJ5VG1wIHwgMHg0MDsKIAltZW1jcHkoJihNSUNfSERSMVs0XSksIHBNQUNIZWFkZXItPmFkZHIxLCBFVEhfQUxFTik7CkBAIC0yNzksNyArMjc5LDcgQEAKIAogCS8qIE1JQ19IRFIyICovCiAJbWVtY3B5KCYoTUlDX0hEUjJbMF0pLCBwTUFDSGVhZGVyLT5hZGRyMywgRVRIX0FMRU4pOwotCWJ5VG1wID0gKHU4KShwTUFDSGVhZGVyLT5zZXFfY3RybCAmIDB4ZmYpOworCWJ5VG1wID0gKHU4KShsZTE2X3RvX2NwdShwTUFDSGVhZGVyLT5zZXFfY3RybCkgPj4gOCk7CiAJTUlDX0hEUjJbNl0gPSBieVRtcCAmIDB4MGY7CiAJTUlDX0hEUjJbN10gPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NhcmQuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5oCmluZGV4IGMzMDE3YTcuLmY4NDNlNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5oCkBAIC0zOSwxMyArMzksNiBAQAogICAgIFBIWV9UWVBFXzExQQogfSBDQVJEX1BIWV9UWVBFLCAqUENBUkRfUEhZX1RZUEU7CiAKLXR5cGVkZWYgZW51bSBfQ0FSRF9PUF9NT0RFIHsKLSAgICBPUF9NT0RFX0lORlJBU1RSVUNUVVJFID0gMCwKLSAgICBPUF9NT0RFX0FESE9DLAotICAgIE9QX01PREVfQVAsCi0gICAgT1BfTU9ERV9VTktOT1dOCi19IENBUkRfT1BfTU9ERSwgKlBDQVJEX09QX01PREU7Ci0KICNkZWZpbmUgQ0JfTUFYX0NIQU5ORUxfMjRHICAxNAogI2RlZmluZSBDQl9NQVhfQ0hBTk5FTF81RyAgICAgICA0MiAvKiBhZGQgY2hhbm5lbDkoNTA0NU1IeiksIDQxPT0+NDIgKi8KICNkZWZpbmUgQ0JfTUFYX0NIQU5ORUwgICAgICAoQ0JfTUFYX0NIQU5ORUxfMjRHK0NCX01BWF9DSEFOTkVMXzVHKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZGV2aWNlLmgKaW5kZXggMWY0MjI1Ny4uZTJhYmUzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kZXZpY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RldmljZS5oCkBAIC0xNTgsMTAgKzE1OCwxMCBAQAogLyoKICAqIEVudW0gb2YgY29udGV4dCB0eXBlcyBmb3IgU2VuZFBhY2tldAogICovCi10eXBlZGVmIGVudW0gX0NPTlRFWFRfVFlQRSB7Ci0gICAgQ09OVEVYVF9EQVRBX1BBQ0tFVCA9IDEsCi0gICAgQ09OVEVYVF9NR01UX1BBQ0tFVAotfSBDT05URVhUX1RZUEU7CitlbnVtIHsKKwlDT05URVhUX0RBVEFfUEFDS0VUID0gMSwKKwlDT05URVhUX01HTVRfUEFDS0VUCit9OwogCiAvKiBSQ0IgKFJlY2VpdmUgQ29udHJvbCBCbG9jaykgKi8KIHN0cnVjdCB2bnRfcmNiIHsKQEAgLTE4MCw5ICsxODAsNyBAQAogCXN0cnVjdCBza19idWZmICpwUGFja2V0OwogCXN0cnVjdCB1cmIgKnBVcmI7CiAJdW5zaWduZWQgaW50IHVCdWZMZW47Ci0JQ09OVEVYVF9UWVBFIFR5cGU7Ci0Jc3RydWN0IGV0aGhkciBzRXRoSGVhZGVyOwotCXZvaWQgKk5leHQ7CisJdTggdHlwZTsKIAlib29sIGJCb29sSW5Vc2U7CiAJdW5zaWduZWQgY2hhciBEYXRhW01BWF9UT1RBTF9TSVpFX1dJVEhfQUxMX0hFQURFUlNdOwogfTsKQEAgLTIwNiwyOSArMjA0LDEwIEBACiAvKgogICogU3RydWN0dXJlIHRvIGtlZXAgdHJhY2sgb2YgVVNCIGludGVycnVwdCBwYWNrZXRzCiAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICB1RGF0YUxlbjsKLSAgICB1OCAqICAgICAgICAgICBwRGF0YUJ1ZjsKLSAgLyogc3RydWN0IHVyYiAqcFVyYjsgKi8KLSAgICBib29sICAgICAgICAgICAgYkluVXNlOwotfSBJTlRfQlVGRkVSLCAqUElOVF9CVUZGRVI7Ci0KLS8qIDA6MTFBIDE6MTFCIDI6MTFHICovCi10eXBlZGVmIGVudW0gX1ZJQV9CQl9UWVBFCi17Ci0gICAgQkJfVFlQRV8xMUEgPSAwLAotICAgIEJCX1RZUEVfMTFCLAotICAgIEJCX1RZUEVfMTFHCi19IFZJQV9CQl9UWVBFLCAqUFZJQV9CQl9UWVBFOwotCi0vKiAwOjExYSwgMToxMWIsIDI6MTFnYiAob25seSBDQ0sgaW4gQmFzaWNSYXRlKSwgMzoxMWdhKE9GRE0gaW4gQmFzaWNSYXRlKSAqLwotdHlwZWRlZiBlbnVtIF9WSUFfUEtUX1RZUEUKLXsKLSAgICBQS19UWVBFXzExQSA9IDAsCi0gICAgUEtfVFlQRV8xMUIsCi0gICAgUEtfVFlQRV8xMUdCLAotICAgIFBLX1RZUEVfMTFHQQotfSBWSUFfUEtUX1RZUEUsICpQVklBX1BLVF9UWVBFOworc3RydWN0IHZudF9pbnRlcnJ1cHRfYnVmZmVyIHsKKwl1OCAqZGF0YV9idWY7CisJYm9vbCBpbl91c2U7Cit9OwogCiAvKisrIE5ESVMgcmVsYXRlZCAqLwogCkBAIC0yOTcsMTYgKzI3Niw2IEBACiAgICAgUE1LSURfQ0FORElEQVRFIENhbmRpZGF0ZUxpc3RbTUFYX1BNS0lETElTVF07CiB9IFNQTUtJRENhbmRpZGF0ZUV2ZW50LCAqUFNQTUtJRENhbmRpZGF0ZUV2ZW50OwogCi0vKisrIDgwMi4xMWggcmVsYXRlZCAqLwotI2RlZmluZSBNQVhfUVVJRVRfQ09VTlQgICAgIDgKLQotdHlwZWRlZiBzdHJ1Y3QgdGFnU1F1aWV0Q29udHJvbCB7Ci0gICAgYm9vbCAgICAgICAgYkVuYWJsZTsKLSAgICB1MzIgICAgICAgZHdTdGFydFRpbWU7Ci0gICAgdTggICAgICAgIGJ5UGVyaW9kOwotICAgIHUxNiAgICAgICAgd0R1cmF0aW9uOwotfSBTUXVpZXRDb250cm9sLCAqUFNRdWlldENvbnRyb2w7Ci0KIC8qIFRoZSByZWNlaXZlIGR1cGxpY2F0ZSBkZXRlY3Rpb24gY2FjaGUgZW50cnkgKi8KIHR5cGVkZWYgc3RydWN0IHRhZ1NDYWNoZUVudHJ5ewogICAgIHUxNiAgICAgICAgd0ZtU2VxdWVuY2U7CkBAIC0zODYsOCArMzU1LDYgQEAKIAogCU9QVElPTlMgc09wdHM7CiAKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgQ21kV29ya0l0ZW07Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IEV2ZW50V29ya0l0ZW07CiAJc3RydWN0IHdvcmtfc3RydWN0IHJlYWRfd29ya19pdGVtOwogCXN0cnVjdCB3b3JrX3N0cnVjdCByeF9tbmdfd29ya19pdGVtOwogCkBAIC00MzcsMjkgKzQwNCwxMSBAQAogCXN0cnVjdCB2bnRfdHhfcGt0X2luZm8gcGt0X2luZm9bMTZdOwogCiAJLyogVmFyaWFibGVzIHRvIHRyYWNrIHJlc291cmNlcyBmb3IgdGhlIEludGVycnVwdCBJbiBQaXBlICovCi0JSU5UX0JVRkZFUiBpbnRCdWY7Ci0JaW50IGZLaWxsRXZlbnRQb2xsaW5nVGhyZWFkOwotCWludCBiRXZlbnRBdmFpbGFibGU7CisJc3RydWN0IHZudF9pbnRlcnJ1cHRfYnVmZmVyIGludF9idWY7CiAKIAkvKiBkZWZhdWx0IGNvbmZpZyBmcm9tIGZpbGUgYnkgdXNlciBzZXR0aW5nICovCiAJREVGQVVMVF9DT05GSUcgY29uZmlnX2ZpbGU7CiAKLQkvKiBTdGF0aXN0aWMgZm9yIFVTQiAqLwotCXVuc2lnbmVkIGxvbmcgdWxCdWxrSW5Qb3N0ZWQ7Ci0JdW5zaWduZWQgbG9uZyB1bEJ1bGtJbkVycm9yOwotCXVuc2lnbmVkIGxvbmcgdWxCdWxrSW5Db250Q1JDRXJyb3I7Ci0JdW5zaWduZWQgbG9uZyB1bEJ1bGtJbkJ5dGVzUmVhZDsKLQotCXVuc2lnbmVkIGxvbmcgdWxCdWxrT3V0UG9zdGVkOwotCXVuc2lnbmVkIGxvbmcgdWxCdWxrT3V0RXJyb3I7Ci0JdW5zaWduZWQgbG9uZyB1bEJ1bGtPdXRDb250Q1JDRXJyb3I7Ci0JdW5zaWduZWQgbG9uZyB1bEJ1bGtPdXRCeXRlc1dyaXRlOwotCi0JdW5zaWduZWQgbG9uZyB1bEludEluUG9zdGVkOwotCXVuc2lnbmVkIGxvbmcgdWxJbnRJbkVycm9yOwotCXVuc2lnbmVkIGxvbmcgdWxJbnRJbkNvbnRDUkNFcnJvcjsKLQl1bnNpZ25lZCBsb25nIHVsSW50SW5CeXRlc1JlYWQ7Ci0KIAkvKiBWZXJzaW9uIGNvbnRyb2wgKi8KIAl1MTYgd0Zpcm13YXJlVmVyc2lvbjsKIAl1OCBieUxvY2FsSUQ7CkBAIC00ODAsMTEgKzQyOSw2IEBACiAJaW50IGJFeGlzdFNXTmV0QWRkcjsKIAogCS8qIE1haW50YWluIHN0YXRpc3RpY2FsIGRlYnVnIGluZm8uICovCi0JdW5zaWduZWQgbG9uZyBwYWNrZXRzUmVjZWl2ZWQ7Ci0JdW5zaWduZWQgbG9uZyBwYWNrZXRzUmVjZWl2ZWREcm9wcGVkOwotCXVuc2lnbmVkIGxvbmcgcGFja2V0c1JlY2VpdmVkT3ZlcmZsb3c7Ci0JdW5zaWduZWQgbG9uZyBwYWNrZXRzU2VudDsKLQl1bnNpZ25lZCBsb25nIHBhY2tldHNTZW50RHJvcHBlZDsKIAl1bnNpZ25lZCBsb25nIFNlbmRDb250ZXh0c0luVXNlOwogCXVuc2lnbmVkIGxvbmcgUmN2QnVmZmVyc0luVXNlOwogCkBAIC01NDksOCArNDkzLDggQEAKIAl1OCAgYnlDV01heE1pbjsKIAogCS8qIFJhdGUgKi8KLQlWSUFfQkJfVFlQRSBieUJCVHlwZTsgLyogMDogMTFBLCAxOjExQiwgMjoxMUcgKi8KLQlWSUFfUEtUX1RZUEUgYnlQYWNrZXRUeXBlOyAvKiAwOjExYSAxOjExYiAyOjExZ2IgMzoxMWdhICovCisJdTggYnlCQlR5cGU7IC8qIDA6IDExQSwgMToxMUIsIDI6MTFHICovCisJdTggYnlQYWNrZXRUeXBlOyAvKiAwOjExYSAxOjExYiAyOjExZ2IgMzoxMWdhICovCiAJdTE2IHdCYXNpY1JhdGU7CiAJdTggYnlBQ0tSYXRlOwogCXU4IGJ5VG9wT0ZETUJhc2ljUmF0ZTsKQEAgLTU4OCw3ICs1MzIsOSBAQAogCXUxNiB3RnJhZ21lbnRhdGlvblRocmVzaG9sZDsKIAl1OCBieVNob3J0UmV0cnlMaW1pdDsKIAl1OCBieUxvbmdSZXRyeUxpbWl0OwotCUNBUkRfT1BfTU9ERSBlT1BNb2RlOworCisJZW51bSBubDgwMjExX2lmdHlwZSBvcF9tb2RlOworCiAJaW50IGJCU1NJREZpbHRlcjsKIAl1MTYgd01heFRyYW5zbWl0TVNEVUxpZmV0aW1lOwogCXU4IGFieUJTU0lEW0VUSF9BTEVOXTsKQEAgLTgwNyw1ICs3NTMsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZNUF9ESVNDT05ORUNURUQgfCBmTVBfUkVTRVRfSU5fUFJPR1JFU1MgfCBmTVBfSEFMVF9JTl9QUk9HUkVTUyB8IGZNUF9JTklUX0lOX1BST0dSRVNTIHwgZk1QX1NVUlBSSVNFX1JFTU9WRUQpKSA9PSAwKQogCiBpbnQgZGV2aWNlX2FsbG9jX2ZyYWdfYnVmKHN0cnVjdCB2bnRfcHJpdmF0ZSAqLCBQU0RlRnJhZ0NvbnRyb2xCbG9jayBwRGVGKTsKK3ZvaWQgdm50X2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IHZudF9wcml2YXRlICopOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZHBjLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5jCmluZGV4IGVjYTA0YzAuLjRjY2FhN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZHBjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kcGMuYwpAQCAtNjI3LDcgKzYyNyw3IEBACiAKICAgICAvLyBOb3cgaXQgb25seSBzdXBwb3J0cyA4MDIuMTFnIEluZnJhc3RydWN0dXJlIE1vZGUsIGFuZCBzdXBwb3J0IHJhdGUgbXVzdCB1cCB0byA1NCBNYnBzCiAgICAgaWYgKHBEZXZpY2UtPmJEaXZlcnNpdHlFbmFibGUgJiYgKEZyYW1lU2l6ZT41MCkgJiYKLSAgICAgICAocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0lORlJBU1RSVUNUVVJFKSAmJgorCXBEZXZpY2UtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgogICAgICAgIChwRGV2aWNlLT5iTGlua1Bhc3MgPT0gdHJ1ZSkpIHsKICAgICAgICAgQkJ2QW50ZW5uYURpdmVyc2l0eShwRGV2aWNlLCBzX2J5R2V0UmF0ZUlkeCgqcGJ5UnhSYXRlKSwgMCk7CiAgICAgfQpAQCAtMTIyNywxNCArMTIyNywxMyBAQAogICAgIGlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcigodTggKikoc2tiLT5kYXRhK2NiSGVhZGVyT2Zmc2V0KSkpIHsKICAgICAgICBpZiAocE1nbXQtPnNOb2RlREJUYWJsZVswXS5iUFNFbmFibGUpIHsKIAotICAgICAgICAgICBza2JjcHkgPSBkZXZfYWxsb2Nfc2tiKChpbnQpcERldmljZS0+cnhfYnVmX3N6KTsKKwkgICAgc2tiY3B5ID0gbmV0ZGV2X2FsbG9jX3NrYihwRGV2aWNlLT5kZXYsIHBEZXZpY2UtPnJ4X2J1Zl9zeik7CiAKICAgICAgICAgLy8gaWYgYW55IG5vZGUgaW4gUFMgbW9kZSwgYnVmZmVyIHBhY2tldCB1bnRpbCBEVElNLgogICAgICAgICAgICBpZiAoc2tiY3B5ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX05PVElDRSwgS0VSTl9JTkZPICJyZWxheSBtdWx0aWNhc3Qgbm8gc2tiIGF2YWlsYWJsZSBcbiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgc2tiY3B5LT5kZXYgPSBwRGV2aWNlLT5kZXY7CiAgICAgICAgICAgICAgICBza2JjcHktPmxlbiA9IEZyYW1lU2l6ZTsKICAgICAgICAgICAgICAgIG1lbWNweShza2JjcHktPmRhdGEsIHNrYi0+ZGF0YStjYkhlYWRlck9mZnNldCwgRnJhbWVTaXplKTsKICAgICAgICAgICAgICAgIHNrYl9xdWV1ZV90YWlsKCYocE1nbXQtPnNOb2RlREJUYWJsZVswXS5zVHhQU1F1ZXVlKSwgc2tiY3B5KTsKQEAgLTEyOTUsNjMgKzEyOTQsNjYgQEAKIAogdm9pZCBSWHZXb3JrSXRlbShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlID0KKwlzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHZudF9wcml2YXRlLCByZWFkX3dvcmtfaXRlbSk7Ci0JaW50IG50U3RhdHVzOwotCXN0cnVjdCB2bnRfcmNiICpwUkNCID0gTlVMTDsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCB2bnRfcmNiICpyY2IgPSBOVUxMOwogCi0JaWYgKHBEZXZpY2UtPkZsYWdzICYgZk1QX0RJU0NPTk5FQ1RFRCkKKwlpZiAocHJpdi0+RmxhZ3MgJiBmTVBfRElTQ09OTkVDVEVEKQogCQlyZXR1cm47CiAKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIi0tLS0+UnggUG9sbGluZyBUaHJlYWRcbiIpOwotICAgIHNwaW5fbG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOworCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5SeCBQb2xsaW5nIFRocmVhZFxuIik7CiAKLSAgICB3aGlsZSAoKHBEZXZpY2UtPkZsYWdzICYgZk1QX1BPU1RfUkVBRFMpICYmCi0gICAgICAgICAgICBNUF9JU19SRUFEWShwRGV2aWNlKSAmJgotICAgICAgICAgICAgKHBEZXZpY2UtPk51bVJlY3ZGcmVlTGlzdCAhPSAwKSApIHsKLSAgICAgICAgcFJDQiA9IHBEZXZpY2UtPkZpcnN0UmVjdkZyZWVMaXN0OwotICAgICAgICBwRGV2aWNlLT5OdW1SZWN2RnJlZUxpc3QtLTsKLSAgICAgICAgRGVxdWV1ZVJDQihwRGV2aWNlLT5GaXJzdFJlY3ZGcmVlTGlzdCwgcERldmljZS0+TGFzdFJlY3ZGcmVlTGlzdCk7Ci0gICAgICAgIG50U3RhdHVzID0gUElQRW5zQnVsa0luVXNiUmVhZChwRGV2aWNlLCBwUkNCKTsKLSAgICB9Ci0gICAgcERldmljZS0+YklzUnhXb3JrSXRlbVF1ZXVlZCA9IGZhbHNlOwotICAgIHNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7CisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CiAKLX0KKwl3aGlsZSAoKHByaXYtPkZsYWdzICYgZk1QX1BPU1RfUkVBRFMpICYmIE1QX0lTX1JFQURZKHByaXYpICYmCisJCQkocHJpdi0+TnVtUmVjdkZyZWVMaXN0ICE9IDApKSB7CisJCXJjYiA9IHByaXYtPkZpcnN0UmVjdkZyZWVMaXN0OwogCi12b2lkIFJYdkZyZWVSQ0Ioc3RydWN0IHZudF9yY2IgKnBSQ0IsIGludCBiUmVBbGxvY1NrYikKLXsKLQlzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UgPSBwUkNCLT5wRGV2aWNlOworCQlwcml2LT5OdW1SZWN2RnJlZUxpc3QtLTsKIAotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5SWHZGcmVlUkNCXG4iKTsKKwkJRGVxdWV1ZVJDQihwcml2LT5GaXJzdFJlY3ZGcmVlTGlzdCwgcHJpdi0+TGFzdFJlY3ZGcmVlTGlzdCk7CiAKLQlpZiAoYlJlQWxsb2NTa2IgPT0gZmFsc2UpIHsKLQkJa2ZyZWVfc2tiKHBSQ0ItPnNrYik7Ci0JCWJSZUFsbG9jU2tiID0gdHJ1ZTsKKwkJc3RhdHVzID0gUElQRW5zQnVsa0luVXNiUmVhZChwcml2LCByY2IpOwogCX0KIAotICAgIGlmIChiUmVBbGxvY1NrYiA9PSB0cnVlKSB7Ci0gICAgICAgIHBSQ0ItPnNrYiA9IGRldl9hbGxvY19za2IoKGludClwRGV2aWNlLT5yeF9idWZfc3opOwotICAgICAgICAvLyB0b2RvIGVycm9yIGhhbmRsaW5nCi0gICAgICAgIGlmIChwUkNCLT5za2IgPT0gTlVMTCkgewotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfRVJSLEtFUk5fRVJSIiBGYWlsZWQgdG8gcmUtYWxsb2Mgcnggc2tiXG4iKTsKLSAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgcFJDQi0+c2tiLT5kZXYgPSBwRGV2aWNlLT5kZXY7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8KLSAgICAvLyBJbnNlcnQgdGhlIFJDQiBiYWNrIGluIHRoZSBSZWN2IGZyZWUgbGlzdAotICAgIC8vCi0gICAgRW5xdWV1ZVJDQihwRGV2aWNlLT5GaXJzdFJlY3ZGcmVlTGlzdCwgcERldmljZS0+TGFzdFJlY3ZGcmVlTGlzdCwgcFJDQik7Ci0gICAgcERldmljZS0+TnVtUmVjdkZyZWVMaXN0Kys7CisJcHJpdi0+YklzUnhXb3JrSXRlbVF1ZXVlZCA9IGZhbHNlOwogCi0gICAgaWYgKChwRGV2aWNlLT5GbGFncyAmIGZNUF9QT1NUX1JFQURTKSAmJiBNUF9JU19SRUFEWShwRGV2aWNlKSAmJgotICAgICAgICAocERldmljZS0+YklzUnhXb3JrSXRlbVF1ZXVlZCA9PSBmYWxzZSkgKSB7CisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKK30KIAotICAgICAgICBwRGV2aWNlLT5iSXNSeFdvcmtJdGVtUXVldWVkID0gdHJ1ZTsKLQlzY2hlZHVsZV93b3JrKCZwRGV2aWNlLT5yZWFkX3dvcmtfaXRlbSk7Ci0gICAgfQotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iPC0tLS1SWEZyZWVSQ0IgJWQgJWRcbiIscERldmljZS0+TnVtUmVjdkZyZWVMaXN0LCBwRGV2aWNlLT5OdW1SZWN2TW5nTGlzdCk7Cit2b2lkIFJYdkZyZWVSQ0Ioc3RydWN0IHZudF9yY2IgKnJjYiwgaW50IHJlX2FsbG9jX3NrYikKK3sKKwlzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYgPSByY2ItPnBEZXZpY2U7CisKKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIi0tLS0+Ulh2RnJlZVJDQlxuIik7CisKKwlpZiAocmVfYWxsb2Nfc2tiID09IGZhbHNlKSB7CisJCWtmcmVlX3NrYihyY2ItPnNrYik7CisJCXJlX2FsbG9jX3NrYiA9IHRydWU7CisJfQorCisJaWYgKHJlX2FsbG9jX3NrYiA9PSB0cnVlKSB7CisJCXJjYi0+c2tiID0gbmV0ZGV2X2FsbG9jX3NrYihwcml2LT5kZXYsIHByaXYtPnJ4X2J1Zl9zeik7CisJCS8qIFRPRE8gZXJyb3IgaGFuZGxpbmcgKi8KKwkJaWYgKCFyY2ItPnNrYikgeworCQkJREJHX1BSVChNU0dfTEVWRUxfRVJSLCBLRVJOX0VSUgorCQkJCSIgRmFpbGVkIHRvIHJlLWFsbG9jIHJ4IHNrYlxuIik7CisJCX0KKwl9CisKKwkvKiBJbnNlcnQgdGhlIFJDQiBiYWNrIGluIHRoZSBSZWN2IGZyZWUgbGlzdCAqLworCUVucXVldWVSQ0IocHJpdi0+Rmlyc3RSZWN2RnJlZUxpc3QsIHByaXYtPkxhc3RSZWN2RnJlZUxpc3QsIHJjYik7CisJcHJpdi0+TnVtUmVjdkZyZWVMaXN0Kys7CisKKwlpZiAoKHByaXYtPkZsYWdzICYgZk1QX1BPU1RfUkVBRFMpICYmIE1QX0lTX1JFQURZKHByaXYpICYmCisJCQkocHJpdi0+YklzUnhXb3JrSXRlbVF1ZXVlZCA9PSBmYWxzZSkpIHsKKwkJcHJpdi0+YklzUnhXb3JrSXRlbVF1ZXVlZCA9IHRydWU7CisJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlYWRfd29ya19pdGVtKTsKKwl9CisKKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIjwtLS0tUlhGcmVlUkNCICVkICVkXG4iLAorCQkJcHJpdi0+TnVtUmVjdkZyZWVMaXN0LCBwcml2LT5OdW1SZWN2TW5nTGlzdCk7CiB9CiAKIHZvaWQgUlh2TW5nV29ya0l0ZW0oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaW50LmMKaW5kZXggZTBlOTM4Ni4uY2NhNTZiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2ludC5jCkBAIC03MCwxMTkgKzcwLDExNyBAQAogCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5JbnRlcnJ1cHQgUG9sbGluZyBUaHJlYWRcbiIpOwogCiAJc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0JaWYgKHBEZXZpY2UtPmZLaWxsRXZlbnRQb2xsaW5nVGhyZWFkICE9IHRydWUpCi0JCW50U3RhdHVzID0gUElQRW5zSW50ZXJydXB0UmVhZChwRGV2aWNlKTsKKworCW50U3RhdHVzID0gUElQRW5zSW50ZXJydXB0UmVhZChwRGV2aWNlKTsKKwogCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7CiB9CiAKLXZvaWQgSU5UbnNQcm9jZXNzRGF0YShzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UpCit2b2lkIElOVG5zUHJvY2Vzc0RhdGEoc3RydWN0IHZudF9wcml2YXRlICpwcml2KQogewotCVBTSU5URGF0YSBwSU5URGF0YTsKLQlzdHJ1Y3Qgdm50X21hbmFnZXIgKnBNZ210ID0gJnBEZXZpY2UtPnZudF9tZ210OwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwU3RhdHMgPSAmcERldmljZS0+c3RhdHM7CisJc3RydWN0IHZudF9pbnRlcnJ1cHRfZGF0YSAqaW50X2RhdGE7CisJc3RydWN0IHZudF9tYW5hZ2VyICptZ210ID0gJnByaXYtPnZudF9tZ210OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5zdGF0czsKIAogCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5zX25zSW50ZXJydXB0UHJvY2Vzc0RhdGFcbiIpOwogCi0JcElOVERhdGEgPSAoUFNJTlREYXRhKSBwRGV2aWNlLT5pbnRCdWYucERhdGFCdWY7Ci0JaWYgKHBJTlREYXRhLT5ieVRTUjAgJiBUU1JfVkFMSUQpIHsKLQkJaWYgKHBJTlREYXRhLT5ieVRTUjAgJiAoVFNSX1RNTyB8IFRTUl9SRVRSWVRNTykpCi0JCQlwRGV2aWNlLT53c3RhdHMuZGlzY2FyZC5yZXRyaWVzKys7CisJaW50X2RhdGEgPSAoc3RydWN0IHZudF9pbnRlcnJ1cHRfZGF0YSAqKXByaXYtPmludF9idWYuZGF0YV9idWY7CisKKwlpZiAoaW50X2RhdGEtPnRzcjAgJiBUU1JfVkFMSUQpIHsKKwkJaWYgKGludF9kYXRhLT50c3IwICYgKFRTUl9UTU8gfCBUU1JfUkVUUllUTU8pKQorCQkJcHJpdi0+d3N0YXRzLmRpc2NhcmQucmV0cmllcysrOwogCQllbHNlCi0JCQlwU3RhdHMtPnR4X3BhY2tldHMrKzsKKwkJCXN0YXRzLT50eF9wYWNrZXRzKys7CiAKLQkJQlNTdlVwZGF0ZU5vZGVUeENvdW50ZXIocERldmljZSwKLQkJCQkJcElOVERhdGEtPmJ5VFNSMCwKLQkJCQkJcElOVERhdGEtPmJ5UGt0MCk7Ci0JCS8qREJHX1BSTl9HUlAwMSgoIlRTUjAgJTAyeFxuIiwgcElOVERhdGEtPmJ5VFNSMCkpOyovCisJCUJTU3ZVcGRhdGVOb2RlVHhDb3VudGVyKHByaXYsCisJCQkJCWludF9kYXRhLT50c3IwLAorCQkJCQlpbnRfZGF0YS0+cGt0MCk7CiAJfQotCWlmIChwSU5URGF0YS0+YnlUU1IxICYgVFNSX1ZBTElEKSB7Ci0JCWlmIChwSU5URGF0YS0+YnlUU1IxICYgKFRTUl9UTU8gfCBUU1JfUkVUUllUTU8pKQotCQkJcERldmljZS0+d3N0YXRzLmRpc2NhcmQucmV0cmllcysrOworCisJaWYgKGludF9kYXRhLT50c3IxICYgVFNSX1ZBTElEKSB7CisJCWlmIChpbnRfZGF0YS0+dHNyMSAmIChUU1JfVE1PIHwgVFNSX1JFVFJZVE1PKSkKKwkJCXByaXYtPndzdGF0cy5kaXNjYXJkLnJldHJpZXMrKzsKIAkJZWxzZQotCQkJcFN0YXRzLT50eF9wYWNrZXRzKys7CisJCQlzdGF0cy0+dHhfcGFja2V0cysrOwogCiAKLQkJQlNTdlVwZGF0ZU5vZGVUeENvdW50ZXIocERldmljZSwKLQkJCQkJcElOVERhdGEtPmJ5VFNSMSwKLQkJCQkJcElOVERhdGEtPmJ5UGt0MSk7Ci0JCS8qREJHX1BSTl9HUlAwMSgoIlRTUjEgJTAyeFxuIiwgcElOVERhdGEtPmJ5VFNSMSkpOyovCisJCUJTU3ZVcGRhdGVOb2RlVHhDb3VudGVyKHByaXYsCisJCQkJCWludF9kYXRhLT50c3IxLAorCQkJCQlpbnRfZGF0YS0+cGt0MSk7CiAJfQotCWlmIChwSU5URGF0YS0+YnlUU1IyICYgVFNSX1ZBTElEKSB7Ci0JCWlmIChwSU5URGF0YS0+YnlUU1IyICYgKFRTUl9UTU8gfCBUU1JfUkVUUllUTU8pKQotCQkJcERldmljZS0+d3N0YXRzLmRpc2NhcmQucmV0cmllcysrOworCisJaWYgKGludF9kYXRhLT50c3IyICYgVFNSX1ZBTElEKSB7CisJCWlmIChpbnRfZGF0YS0+dHNyMiAmIChUU1JfVE1PIHwgVFNSX1JFVFJZVE1PKSkKKwkJCXByaXYtPndzdGF0cy5kaXNjYXJkLnJldHJpZXMrKzsKIAkJZWxzZQotCQkJcFN0YXRzLT50eF9wYWNrZXRzKys7CisJCQlzdGF0cy0+dHhfcGFja2V0cysrOwogCi0JCUJTU3ZVcGRhdGVOb2RlVHhDb3VudGVyKHBEZXZpY2UsCi0JCQkJCXBJTlREYXRhLT5ieVRTUjIsCi0JCQkJCXBJTlREYXRhLT5ieVBrdDIpOwotCQkvKkRCR19QUk5fR1JQMDEoKCJUU1IyICUwMnhcbiIsIHBJTlREYXRhLT5ieVRTUjIpKTsqLworCQlCU1N2VXBkYXRlTm9kZVR4Q291bnRlcihwcml2LAorCQkJCQlpbnRfZGF0YS0+dHNyMiwKKwkJCQkJaW50X2RhdGEtPnBrdDIpOwogCX0KLQlpZiAocElOVERhdGEtPmJ5VFNSMyAmIFRTUl9WQUxJRCkgewotCQlpZiAocElOVERhdGEtPmJ5VFNSMyAmIChUU1JfVE1PIHwgVFNSX1JFVFJZVE1PKSkKLQkJCXBEZXZpY2UtPndzdGF0cy5kaXNjYXJkLnJldHJpZXMrKzsKKworCWlmIChpbnRfZGF0YS0+dHNyMyAmIFRTUl9WQUxJRCkgeworCQlpZiAoaW50X2RhdGEtPnRzcjMgJiAoVFNSX1RNTyB8IFRTUl9SRVRSWVRNTykpCisJCQlwcml2LT53c3RhdHMuZGlzY2FyZC5yZXRyaWVzKys7CiAJCWVsc2UKLQkJCXBTdGF0cy0+dHhfcGFja2V0cysrOworCQkJc3RhdHMtPnR4X3BhY2tldHMrKzsKIAotCQlCU1N2VXBkYXRlTm9kZVR4Q291bnRlcihwRGV2aWNlLAotCQkJCQlwSU5URGF0YS0+YnlUU1IzLAotCQkJCQlwSU5URGF0YS0+YnlQa3QzKTsKLQkJLypEQkdfUFJOX0dSUDAxKCgiVFNSMyAlMDJ4XG4iLCBwSU5URGF0YS0+YnlUU1IzKSk7Ki8KKwkJQlNTdlVwZGF0ZU5vZGVUeENvdW50ZXIocHJpdiwKKwkJCQkJaW50X2RhdGEtPnRzcjMsCisJCQkJCWludF9kYXRhLT5wa3QzKTsKIAl9Ci0JaWYgKHBJTlREYXRhLT5ieUlTUjAgIT0gMCkgewotCQlpZiAocElOVERhdGEtPmJ5SVNSMCAmIElTUl9CTlRYKSB7Ci0JCQlpZiAocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0FQKSB7Ci0JCQkJaWYgKHBNZ210LT5ieURUSU1Db3VudCA+IDApIHsKLQkJCQkJcE1nbXQtPmJ5RFRJTUNvdW50LS07Ci0JCQkJCXBNZ210LT5zTm9kZURCVGFibGVbMF0uYlJ4UFNQb2xsID0KKworCWlmIChpbnRfZGF0YS0+aXNyMCAhPSAwKSB7CisJCWlmIChpbnRfZGF0YS0+aXNyMCAmIElTUl9CTlRYKSB7CisJCQlpZiAocHJpdi0+b3BfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgeworCQkJCWlmIChtZ210LT5ieURUSU1Db3VudCA+IDApIHsKKwkJCQkJbWdtdC0+YnlEVElNQ291bnQtLTsKKwkJCQkJbWdtdC0+c05vZGVEQlRhYmxlWzBdLmJSeFBTUG9sbCA9CiAJCQkJCQlmYWxzZTsKLQkJCQl9IGVsc2UgaWYgKHBNZ210LT5ieURUSU1Db3VudCA9PSAwKSB7CisJCQkJfSBlbHNlIGlmIChtZ210LT5ieURUSU1Db3VudCA9PSAwKSB7CiAJCQkJCS8qIGNoZWNrIGlmIG11bHRpY2FzdCB0eCBidWZmZXJpbmcgKi8KLQkJCQkJcE1nbXQtPmJ5RFRJTUNvdW50ID0KLQkJCQkJCXBNZ210LT5ieURUSU1QZXJpb2QtMTsKLQkJCQkJcE1nbXQtPnNOb2RlREJUYWJsZVswXS5iUnhQU1BvbGwgPSB0cnVlOwotCQkJCQlpZiAocE1nbXQtPnNOb2RlREJUYWJsZVswXS5iUFNFbmFibGUpCi0JCQkJCQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHBEZXZpY2UsCisJCQkJCW1nbXQtPmJ5RFRJTUNvdW50ID0KKwkJCQkJCW1nbXQtPmJ5RFRJTVBlcmlvZC0xOworCQkJCQltZ210LT5zTm9kZURCVGFibGVbMF0uYlJ4UFNQb2xsID0gdHJ1ZTsKKwkJCQkJaWYgKG1nbXQtPnNOb2RlREJUYWJsZVswXS5iUFNFbmFibGUpCisJCQkJCQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHByaXYsCiAJCQkJCQkJCSBXTEFOX0NNRF9SWF9QU1BPTEwsCiAJCQkJCQkJCSBOVUxMKTsKIAkJCQl9Ci0JCQkJYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKSBwRGV2aWNlLAorCQkJCWJTY2hlZHVsZUNvbW1hbmQoKHZvaWQgKikgcHJpdiwKIAkJCQkJCVdMQU5fQ01EX0JFQ09OX1NFTkQsCiAJCQkJCQlOVUxMKTsKLQkJCX0gLyogaWYgKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9BUCkgKi8KLQkJcERldmljZS0+YkJlYWNvblNlbnQgPSB0cnVlOworCQkJfQorCQkJcHJpdi0+YkJlYWNvblNlbnQgPSB0cnVlOwogCQl9IGVsc2UgewotCQkJcERldmljZS0+YkJlYWNvblNlbnQgPSBmYWxzZTsKKwkJCXByaXYtPmJCZWFjb25TZW50ID0gZmFsc2U7CiAJCX0KLQkJaWYgKHBJTlREYXRhLT5ieUlTUjAgJiBJU1JfVEJUVCkgewotCQkJaWYgKHBEZXZpY2UtPmJFbmFibGVQU01vZGUpCi0JCQkJYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKSBwRGV2aWNlLAorCisJCWlmIChpbnRfZGF0YS0+aXNyMCAmIElTUl9UQlRUKSB7CisJCQlpZiAocHJpdi0+YkVuYWJsZVBTTW9kZSkKKwkJCQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHByaXYsCiAJCQkJCQlXTEFOX0NNRF9UQlRUX1dBS0VVUCwKIAkJCQkJCU5VTEwpOwotCQkJaWYgKHBEZXZpY2UtPmJDaGFubmVsU3dpdGNoKSB7Ci0JCQkJcERldmljZS0+YnlDaGFubmVsU3dpdGNoQ291bnQtLTsKLQkJCQlpZiAocERldmljZS0+YnlDaGFubmVsU3dpdGNoQ291bnQgPT0gMCkKLQkJCQkJYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKSBwRGV2aWNlLAorCQkJaWYgKHByaXYtPmJDaGFubmVsU3dpdGNoKSB7CisJCQkJcHJpdi0+YnlDaGFubmVsU3dpdGNoQ291bnQtLTsKKwkJCQlpZiAocHJpdi0+YnlDaGFubmVsU3dpdGNoQ291bnQgPT0gMCkKKwkJCQkJYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKSBwcml2LAogCQkJCQkJCVdMQU5fQ01EXzExSF9DSFNXLAogCQkJCQkJCU5VTEwpOwogCQkJfQogCQl9Ci0JCXBEZXZpY2UtPnF3Q3VyclRTRiA9IGNwdV90b19sZTY0KHBJTlREYXRhLT5xd1RTRik7Ci0JCS8qREJHX1BSTl9HUlAwMSgoIklTUjAgPSAlMDJ4ICwKLQkJICBMb1RzZiA9ICAlMDh4LAotCQkgIEhpVHNmID0gICUwOHhcbiIsCi0JCSAgcElOVERhdGEtPmJ5SVNSMCwKLQkJICBwSU5URGF0YS0+ZHdMb1RTRiwKLQkJICBwSU5URGF0YS0+ZHdIaVRTRikpOyAqLworCQlwcml2LT5xd0N1cnJUU0YgPSBsZTY0X3RvX2NwdShpbnRfZGF0YS0+dHNmKTsKIAl9Ci0JaWYgKHBJTlREYXRhLT5ieUlTUjEgIT0gMCkKLQkJaWYgKHBJTlREYXRhLT5ieUlTUjEgJiBJU1JfR1BJTzMpCi0JCQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHBEZXZpY2UsCisKKwlpZiAoaW50X2RhdGEtPmlzcjEgIT0gMCkKKwkJaWYgKGludF9kYXRhLT5pc3IxICYgSVNSX0dQSU8zKQorCQkJYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKSBwcml2LAogCQkJCQlXTEFOX0NNRF9SQURJTywKIAkJCQkJTlVMTCk7Ci0JcERldmljZS0+aW50QnVmLnVEYXRhTGVuID0gMDsKLQlwRGV2aWNlLT5pbnRCdWYuYkluVXNlID0gZmFsc2U7CiAKLQlwU3RhdHMtPnR4X2Vycm9ycyA9IHBEZXZpY2UtPndzdGF0cy5kaXNjYXJkLnJldHJpZXM7Ci0JcFN0YXRzLT50eF9kcm9wcGVkID0gcERldmljZS0+d3N0YXRzLmRpc2NhcmQucmV0cmllczsKKwlwcml2LT5pbnRfYnVmLmluX3VzZSA9IGZhbHNlOworCisJc3RhdHMtPnR4X2Vycm9ycyA9IHByaXYtPndzdGF0cy5kaXNjYXJkLnJldHJpZXM7CisJc3RhdHMtPnR4X2Ryb3BwZWQgPSBwcml2LT53c3RhdHMuZGlzY2FyZC5yZXRyaWVzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pbnQuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaW50LmgKaW5kZXggOGU2ZTIxNy4uMDhkYjg2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pbnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2ludC5oCkBAIC0zMiwyOSArMzIsMjggQEAKIAogI2luY2x1ZGUgImRldmljZS5oIgogCi10eXBlZGVmIHN0cnVjdCB0YWdTSU5URGF0YSB7Ci0JdTggYnlUU1IwOwotCXU4IGJ5UGt0MDsKLQl1MTYgd1RpbWUwOwotCXU4IGJ5VFNSMTsKLQl1OCBieVBrdDE7Ci0JdTE2IHdUaW1lMTsKLQl1OCBieVRTUjI7Ci0JdTggYnlQa3QyOwotCXUxNiB3VGltZTI7Ci0JdTggYnlUU1IzOwotCXU4IGJ5UGt0MzsKLQl1MTYgd1RpbWUzOwotCXU2NCBxd1RTRjsKLQl1OCBieUlTUjA7Ci0JdTggYnlJU1IxOwotCXU4IGJ5UlRTU3VjY2VzczsKLQl1OCBieVJUU0ZhaWw7Ci0JdTggYnlBQ0tGYWlsOwotCXU4IGJ5RkNTRXJyOwotCXU4IGFieVNXWzJdOwotfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCi1TSU5URGF0YSwgKlBTSU5URGF0YTsKK3N0cnVjdCB2bnRfaW50ZXJydXB0X2RhdGEgeworCXU4IHRzcjA7CisJdTggcGt0MDsKKwl1MTYgdGltZTA7CisJdTggdHNyMTsKKwl1OCBwa3QxOworCXUxNiB0aW1lMTsKKwl1OCB0c3IyOworCXU4IHBrdDI7CisJdTE2IHRpbWUyOworCXU4IHRzcjM7CisJdTggcGt0MzsKKwl1MTYgdGltZTM7CisJX19sZTY0IHRzZjsKKwl1OCBpc3IwOworCXU4IGlzcjE7CisJdTggcnRzX3N1Y2Nlc3M7CisJdTggcnRzX2ZhaWw7CisJdTggYWNrX2ZhaWw7CisJdTggZmNzX2VycjsKKwl1OCBzd1syXTsKK30gX19wYWNrZWQ7CiAKIHZvaWQgSU5UdldvcmtJdGVtKHN0cnVjdCB2bnRfcHJpdmF0ZSAqKTsKIHZvaWQgSU5UbnNQcm9jZXNzRGF0YShzdHJ1Y3Qgdm50X3ByaXZhdGUgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2l3Y3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2l3Y3RsLmMKaW5kZXggM2E2OGRmYS4uY2Y0YzA2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pd2N0bC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaXdjdGwuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgIndwYWN0bC5oIgogI2luY2x1ZGUgImNvbnRyb2wuaCIKICNpbmNsdWRlICJybmRpcy5oIgorI2luY2x1ZGUgImJhc2ViYW5kLmgiCiAKIHN0YXRpYyBjb25zdCBsb25nIGZyZXF1ZW5jeV9saXN0W10gPSB7CiAJMjQxMiwgMjQxNywgMjQyMiwgMjQyNywgMjQzMiwgMjQzNywgMjQ0MiwgMjQ0NywgMjQ1MiwgMjQ1NywgMjQ2MiwgMjQ2NywgMjQ3MiwgMjQ4NCwKQEAgLTU3LDcgKzU4LDcgQEAKIAlzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UgPSBuZXRkZXZfcHJpdihkZXYpOwogCWxvbmcgbGRCbTsKIAotCXBEZXZpY2UtPndzdGF0cy5zdGF0dXMgPSBwRGV2aWNlLT5lT1BNb2RlOworCXBEZXZpY2UtPndzdGF0cy5zdGF0dXMgPSBwRGV2aWNlLT5vcF9tb2RlOwogCVJGdlJTU0lUb2RCbShwRGV2aWNlLCAodTgpKHBEZXZpY2UtPnVDdXJyUlNTSSksICZsZEJtKTsKIAlwRGV2aWNlLT53c3RhdHMucXVhbC5sZXZlbCA9IGxkQm07CiAJcERldmljZS0+d3N0YXRzLnF1YWwubm9pc2UgPSAwOwpAQCAtNzI0LDEwICs3MjUsMTAgQEAKIAlpZiAoIXdycS0+cG9pbnRlcikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzb2NrID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyKSAqIElXX01BWF9BUCwgR0ZQX0tFUk5FTCk7CisJc29jayA9IGtjYWxsb2MoSVdfTUFYX0FQLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNvY2sgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JcXVhbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSAqIElXX01BWF9BUCwgR0ZQX0tFUk5FTCk7CisJcXVhbCA9IGtjYWxsb2MoSVdfTUFYX0FQLCBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpLCBHRlBfS0VSTkVMKTsKIAlpZiAocXVhbCA9PSBOVUxMKSB7CiAJCWtmcmVlKHNvY2spOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTEzOTQsNyArMTM5NSw4IEBACiAJaWYgKHBNZ210ID09IE5VTEwpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKCh3cnEtPmRpc2FibGVkID0gKG1vZGUgPT0gV01BQ19QT1dFUl9DQU0pKSkKKwl3cnEtPmRpc2FibGVkID0gKG1vZGUgPT0gV01BQ19QT1dFUl9DQU0pOworCWlmICh3cnEtPmRpc2FibGVkKQogCQlyZXR1cm4gMDsKIAogCWlmICgod3JxLT5mbGFncyAmIElXX1BPV0VSX1RZUEUpID09IElXX1BPV0VSX1RJTUVPVVQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21hYy5jCmluZGV4IDU0NDE0ZWQyNy4uM2NlMTlkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21hYy5jCkBAIC00NywyNSArNDcsMTkgQEAKICAqCiAgKiBQYXJhbWV0ZXJzOgogICogIEluOgotICogICAgICB1Qnl0ZWlkeCAgICAtIEluZGV4IG9mIE1hc2sKLSAqICAgICAgYnlEYXRhICAgICAgLSBNYXNrIFZhbHVlIHRvIHdyaXRlCisgKgltY19maWx0ZXIgKG1hYyBmaWx0ZXIpCiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi12b2lkIE1BQ3ZXcml0ZU11bHRpQWRkcihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsIHUzMiB1Qnl0ZUlkeCwgdTggYnlEYXRhKQordm9pZCBNQUN2V3JpdGVNdWx0aUFkZHIoc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLCB1NjQgbWNfZmlsdGVyKQogewotCXU4IGJ5RGF0YTE7CisJX19sZTY0IGxlX21jID0gY3B1X3RvX2xlNjQobWNfZmlsdGVyKTsKIAotICAgIGJ5RGF0YTEgPSBieURhdGE7Ci0gICAgQ09OVFJPTG5zUmVxdWVzdE91dChwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgTUVTU0FHRV9UWVBFX1dSSVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgKHUxNikgKE1BQ19SRUdfTUFSMCArIHVCeXRlSWR4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1FU1NBR0VfUkVRVUVTVF9NQUNSRUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJmJ5RGF0YTEpOworCUNPTlRST0xuc1JlcXVlc3RPdXQocERldmljZSwgTUVTU0FHRV9UWVBFX1dSSVRFLCBNQUNfUkVHX01BUjAsCisJCU1FU1NBR0VfUkVRVUVTVF9NQUNSRUcsIHNpemVvZihsZV9tYyksICh1OCAqKSZsZV9tYyk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21hYy5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWMuaAppbmRleCAwZGIxYmU1Li40MDUzZTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21hYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFjLmgKQEAgLTQwMyw3ICs0MDMsNyBAQAogI2RlZmluZSBNQUNfUkVWSVNJT05fQTAgICAgIDB4MDAKICNkZWZpbmUgTUFDX1JFVklTSU9OX0ExICAgICAweDAxCiAKLXZvaWQgTUFDdldyaXRlTXVsdGlBZGRyKHN0cnVjdCB2bnRfcHJpdmF0ZSAqLCB1MzIsIHU4KTsKK3ZvaWQgTUFDdldyaXRlTXVsdGlBZGRyKHN0cnVjdCB2bnRfcHJpdmF0ZSAqLCB1NjQpOwogdm9pZCBNQUNiU2h1dGRvd24oc3RydWN0IHZudF9wcml2YXRlICopOwogdm9pZCBNQUN2U2V0QkJUeXBlKHN0cnVjdCB2bnRfcHJpdmF0ZSAqLCB1OCk7CiB2b2lkIE1BQ3ZEaXNhYmxlS2V5RW50cnkoc3RydWN0IHZudF9wcml2YXRlICosIHUzMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMKaW5kZXggNThlZGNhZS4uM2M5MzIzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWluX3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYwpAQCAtMjU2LDcgKzI1Niw3IEBACiAgICAgcERldmljZS0+YnlTaG9ydFByZWFtYmxlID0gUFJFQU1CTEVfVFlQRV9ERUY7CiAgICAgcERldmljZS0+ZVBTTW9kZSA9IFBTX01PREVfREVGOwogICAgIHBEZXZpY2UtPmIxMWhFbmFibGUgPSBYODAyMTFoX01PREVfREVGOwotICAgIHBEZXZpY2UtPmVPUE1vZGUgPSBPUF9NT0RFX0RFRjsKKyAgICBwRGV2aWNlLT5vcF9tb2RlID0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ7CiAgICAgcERldmljZS0+dUNvbm5lY3Rpb25SYXRlID0gREFUQV9SQVRFX0RFRjsKICAgICBpZiAocERldmljZS0+dUNvbm5lY3Rpb25SYXRlIDwgUkFURV9BVVRPKSBwRGV2aWNlLT5iRml4UmF0ZSA9IHRydWU7CiAgICAgcERldmljZS0+YnlCQlR5cGUgPSBCQlBfVFlQRV9ERUY7CkBAIC00MDksNyArNDA5LDcgQEAKIAogCQlpZiAocERldmljZS0+YWJ5Q0NLUHdyVGJsW2lpXSA9PSAwKQogCQkJcERldmljZS0+YWJ5Q0NLUHdyVGJsW2lpXSA9IHBEZXZpY2UtPmJ5Q0NLUHdyOwotCQkJcERldmljZS0+YWJ5T0ZETVB3clRibFtpaV0gPQorCQlwRGV2aWNlLT5hYnlPRkRNUHdyVGJsW2lpXSA9CiAJCQkJcERldmljZS0+YWJ5RUVQUk9NW2lpICsgRUVQX09GU19PRkRNX1BXUl9UQkxdOwogCQlpZiAocERldmljZS0+YWJ5T0ZETVB3clRibFtpaV0gPT0gMCkKIAkJCXBEZXZpY2UtPmFieU9GRE1Qd3JUYmxbaWldID0gcERldmljZS0+YnlPRkRNUHdyRzsKQEAgLTc0OSw0NCArNzQ5LDQ3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBkZXZpY2VfZnJlZV90eF9idWZzKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSkKK3N0YXRpYyB2b2lkIGRldmljZV9mcmVlX3R4X2J1ZnMoc3RydWN0IHZudF9wcml2YXRlICpwcml2KQogewotCXN0cnVjdCB2bnRfdXNiX3NlbmRfY29udGV4dCAqcFR4Q29udGV4dDsKLSAgICBpbnQgaWk7Ci0KLSAgICBmb3IgKGlpID0gMDsgaWkgPCBwRGV2aWNlLT5jYlREOyBpaSsrKSB7Ci0KLSAgICAgICAgcFR4Q29udGV4dCA9IHBEZXZpY2UtPmFwVERbaWldOwotCS8qIGRlYWxsb2NhdGUgVVJCcyAqLwotICAgICAgICBpZiAocFR4Q29udGV4dC0+cFVyYikgewotICAgICAgICAgICAgdXNiX2tpbGxfdXJiKHBUeENvbnRleHQtPnBVcmIpOwotICAgICAgICAgICAgdXNiX2ZyZWVfdXJiKHBUeENvbnRleHQtPnBVcmIpOwotICAgICAgICB9Ci0gICAgICAgIGtmcmVlKHBUeENvbnRleHQpOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGRldmljZV9mcmVlX3J4X2J1ZnMoc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlKQotewotCXN0cnVjdCB2bnRfcmNiICpwUkNCOworCXN0cnVjdCB2bnRfdXNiX3NlbmRfY29udGV4dCAqdHhfY29udGV4dDsKIAlpbnQgaWk7CiAKLSAgICBmb3IgKGlpID0gMDsgaWkgPCBwRGV2aWNlLT5jYlJEOyBpaSsrKSB7CisJZm9yIChpaSA9IDA7IGlpIDwgcHJpdi0+Y2JURDsgaWkrKykgeworCQl0eF9jb250ZXh0ID0gcHJpdi0+YXBURFtpaV07CisJCS8qIGRlYWxsb2NhdGUgVVJCcyAqLworCQlpZiAodHhfY29udGV4dC0+cFVyYikgeworCQkJdXNiX2tpbGxfdXJiKHR4X2NvbnRleHQtPnBVcmIpOworCQkJdXNiX2ZyZWVfdXJiKHR4X2NvbnRleHQtPnBVcmIpOworCQl9CiAKLSAgICAgICAgcFJDQiA9IHBEZXZpY2UtPmFwUkNCW2lpXTsKLQkvKiBkZWFsbG9jYXRlIFVSQnMgKi8KLSAgICAgICAgaWYgKHBSQ0ItPnBVcmIpIHsKLSAgICAgICAgICAgIHVzYl9raWxsX3VyYihwUkNCLT5wVXJiKTsKLSAgICAgICAgICAgIHVzYl9mcmVlX3VyYihwUkNCLT5wVXJiKTsKLSAgICAgICAgfQotCS8qIGRlYWxsb2NhdGUgc2tiICovCi0gICAgICAgIGlmIChwUkNCLT5za2IpCi0gICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKHBSQ0ItPnNrYik7Ci0gICAgfQotICAgIGtmcmVlKHBEZXZpY2UtPnBSQ0JNZW0pOworCQlrZnJlZSh0eF9jb250ZXh0KTsKKwl9CiAKLSAgICByZXR1cm47CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBkZXZpY2VfZnJlZV9yeF9idWZzKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3Qgdm50X3JjYiAqcmNiOworCWludCBpaTsKKworCWZvciAoaWkgPSAwOyBpaSA8IHByaXYtPmNiUkQ7IGlpKyspIHsKKwkJcmNiID0gcHJpdi0+YXBSQ0JbaWldOworCisJCS8qIGRlYWxsb2NhdGUgVVJCcyAqLworCQlpZiAocmNiLT5wVXJiKSB7CisJCQl1c2Jfa2lsbF91cmIocmNiLT5wVXJiKTsKKwkJCXVzYl9mcmVlX3VyYihyY2ItPnBVcmIpOworCQl9CisKKwkJLyogZGVhbGxvY2F0ZSBza2IgKi8KKwkJaWYgKHJjYi0+c2tiKQorCQkJZGV2X2tmcmVlX3NrYihyY2ItPnNrYik7CisJfQorCisJa2ZyZWUocHJpdi0+cFJDQk1lbSk7CisKKwlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIHVzYl9kZXZpY2VfcmVzZXQoc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlKQpAQCAtNzk4LDk1ICs4MDEsMTA5IEBACiAJcmV0dXJuIDsKIH0KIAotc3RhdGljIHZvaWQgZGV2aWNlX2ZyZWVfaW50X2J1ZnMoc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlKQorc3RhdGljIHZvaWQgZGV2aWNlX2ZyZWVfaW50X2J1ZnMoc3RydWN0IHZudF9wcml2YXRlICpwcml2KQogewotICAgIGtmcmVlKHBEZXZpY2UtPmludEJ1Zi5wRGF0YUJ1Zik7Ci0gICAgcmV0dXJuOworCWtmcmVlKHByaXYtPmludF9idWYuZGF0YV9idWYpOworCisJcmV0dXJuOwogfQogCi1zdGF0aWMgYm9vbCBkZXZpY2VfYWxsb2NfYnVmcyhzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UpCitzdGF0aWMgYm9vbCBkZXZpY2VfYWxsb2NfYnVmcyhzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYpCiB7Ci0Jc3RydWN0IHZudF91c2Jfc2VuZF9jb250ZXh0ICpwVHhDb250ZXh0OwotCXN0cnVjdCB2bnRfcmNiICpwUkNCOworCXN0cnVjdCB2bnRfdXNiX3NlbmRfY29udGV4dCAqdHhfY29udGV4dDsKKwlzdHJ1Y3Qgdm50X3JjYiAqcmNiOwogCWludCBpaTsKIAotICAgIGZvciAoaWkgPSAwOyBpaSA8IHBEZXZpY2UtPmNiVEQ7IGlpKyspIHsKLQotCXBUeENvbnRleHQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdm50X3VzYl9zZW5kX2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKLSAgICAgICAgaWYgKHBUeENvbnRleHQgPT0gTlVMTCkgewotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfRVJSLEtFUk5fRVJSICIlcyA6IGFsbG9jYXRlIHR4IHVzYiBjb250ZXh0IGZhaWxlZFxuIiwgcERldmljZS0+ZGV2LT5uYW1lKTsKLSAgICAgICAgICAgIGdvdG8gZnJlZV90eDsKLSAgICAgICAgfQotICAgICAgICBwRGV2aWNlLT5hcFREW2lpXSA9IHBUeENvbnRleHQ7Ci0JcFR4Q29udGV4dC0+cERldmljZSA9ICh2b2lkICopIHBEZXZpY2U7Ci0JLyogYWxsb2NhdGUgVVJCcyAqLwotICAgICAgICBwVHhDb250ZXh0LT5wVXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKLSAgICAgICAgaWYgKHBUeENvbnRleHQtPnBVcmIgPT0gTlVMTCkgewotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfRVJSLEtFUk5fRVJSICJhbGxvYyB0eCB1cmIgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgIGdvdG8gZnJlZV90eDsKLSAgICAgICAgfQotICAgICAgICBwVHhDb250ZXh0LT5iQm9vbEluVXNlID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogYWxsb2NhdGUgUkNCIG1lbSAqLwotCXBEZXZpY2UtPnBSQ0JNZW0gPSBremFsbG9jKChzaXplb2Yoc3RydWN0IHZudF9yY2IpICogcERldmljZS0+Y2JSRCksCisJZm9yIChpaSA9IDA7IGlpIDwgcHJpdi0+Y2JURDsgaWkrKykgeworCQl0eF9jb250ZXh0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZudF91c2Jfc2VuZF9jb250ZXh0KSwKIAkJCQkJCQkJR0ZQX0tFUk5FTCk7Ci0gICAgaWYgKHBEZXZpY2UtPnBSQ0JNZW0gPT0gTlVMTCkgewotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9FUlIsS0VSTl9FUlIgIiVzIDogYWxsb2MgcnggdXNiIGNvbnRleHQgZmFpbGVkXG4iLCBwRGV2aWNlLT5kZXYtPm5hbWUpOwotICAgICAgICBnb3RvIGZyZWVfdHg7Ci0gICAgfQorCQlpZiAodHhfY29udGV4dCA9PSBOVUxMKSB7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9FUlIsIEtFUk5fRVJSCisJCQkJIiVzIDogYWxsb2NhdGUgdHggdXNiIGNvbnRleHQgZmFpbGVkXG4iLAorCQkJCQlwcml2LT5kZXYtPm5hbWUpOworCQkJZ290byBmcmVlX3R4OworCQl9CiAKLSAgICBwRGV2aWNlLT5GaXJzdFJlY3ZGcmVlTGlzdCA9IE5VTEw7Ci0gICAgcERldmljZS0+TGFzdFJlY3ZGcmVlTGlzdCA9IE5VTEw7Ci0gICAgcERldmljZS0+Rmlyc3RSZWN2TW5nTGlzdCA9IE5VTEw7Ci0gICAgcERldmljZS0+TGFzdFJlY3ZNbmdMaXN0ID0gTlVMTDsKLSAgICBwRGV2aWNlLT5OdW1SZWN2RnJlZUxpc3QgPSAwOworCQlwcml2LT5hcFREW2lpXSA9IHR4X2NvbnRleHQ7CisJCXR4X2NvbnRleHQtPnBEZXZpY2UgPSBwcml2OwogCi0JcFJDQiA9IChzdHJ1Y3Qgdm50X3JjYiAqKXBEZXZpY2UtPnBSQ0JNZW07CisJCS8qIGFsbG9jYXRlIFVSQnMgKi8KKwkJdHhfY29udGV4dC0+cFVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJCWlmICh0eF9jb250ZXh0LT5wVXJiID09IE5VTEwpIHsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0VSUiwKKwkJCQlLRVJOX0VSUiAiYWxsb2MgdHggdXJiIGZhaWxlZFxuIik7CisJCQlnb3RvIGZyZWVfdHg7CisJCX0KIAotICAgIGZvciAoaWkgPSAwOyBpaSA8IHBEZXZpY2UtPmNiUkQ7IGlpKyspIHsKLQotICAgICAgICBwRGV2aWNlLT5hcFJDQltpaV0gPSBwUkNCOwotCXBSQ0ItPnBEZXZpY2UgPSAodm9pZCAqKSBwRGV2aWNlOwotCS8qIGFsbG9jYXRlIFVSQnMgKi8KLSAgICAgICAgcFJDQi0+cFVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7Ci0KLSAgICAgICAgaWYgKHBSQ0ItPnBVcmIgPT0gTlVMTCkgewotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfRVJSLEtFUk5fRVJSIiBGYWlsZWQgdG8gYWxsb2MgcnggdXJiXG4iKTsKLSAgICAgICAgICAgIGdvdG8gZnJlZV9yeF90eDsKLSAgICAgICAgfQotICAgICAgICBwUkNCLT5za2IgPSBkZXZfYWxsb2Nfc2tiKChpbnQpcERldmljZS0+cnhfYnVmX3N6KTsKLSAgICAgICAgaWYgKHBSQ0ItPnNrYiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9FUlIsS0VSTl9FUlIiIEZhaWxlZCB0byBhbGxvYyByeCBza2JcbiIpOwotICAgICAgICAgICAgZ290byBmcmVlX3J4X3R4OwotICAgICAgICB9Ci0gICAgICAgIHBSQ0ItPnNrYi0+ZGV2ID0gcERldmljZS0+ZGV2OwotICAgICAgICBwUkNCLT5iQm9vbEluVXNlID0gZmFsc2U7Ci0gICAgICAgIEVucXVldWVSQ0IocERldmljZS0+Rmlyc3RSZWN2RnJlZUxpc3QsIHBEZXZpY2UtPkxhc3RSZWN2RnJlZUxpc3QsIHBSQ0IpOwotICAgICAgICBwRGV2aWNlLT5OdW1SZWN2RnJlZUxpc3QrKzsKLSAgICAgICAgcFJDQisrOwotICAgIH0KLQotCXBEZXZpY2UtPnBJbnRlcnJ1cHRVUkIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwotCWlmIChwRGV2aWNlLT5wSW50ZXJydXB0VVJCID09IE5VTEwpIHsKLQkgICAgREJHX1BSVChNU0dfTEVWRUxfRVJSLEtFUk5fRVJSIkZhaWxlZCB0byBhbGxvYyBpbnQgdXJiXG4iKTsKLQkgICAgZ290byBmcmVlX3J4X3R4OworCQl0eF9jb250ZXh0LT5iQm9vbEluVXNlID0gZmFsc2U7CiAJfQogCi0gICAgcERldmljZS0+aW50QnVmLnBEYXRhQnVmID0ga21hbGxvYyhNQVhfSU5URVJSVVBUX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmIChwRGV2aWNlLT5pbnRCdWYucERhdGFCdWYgPT0gTlVMTCkgewotCSAgICBEQkdfUFJUKE1TR19MRVZFTF9FUlIsS0VSTl9FUlIiRmFpbGVkIHRvIGFsbG9jIGludCBidWZcbiIpOwotCSAgICB1c2JfZnJlZV91cmIocERldmljZS0+cEludGVycnVwdFVSQik7Ci0JICAgIGdvdG8gZnJlZV9yeF90eDsKKwkvKiBhbGxvY2F0ZSBSQ0IgbWVtICovCisJcHJpdi0+cFJDQk1lbSA9IGt6YWxsb2MoKHNpemVvZihzdHJ1Y3Qgdm50X3JjYikgKiBwcml2LT5jYlJEKSwKKwkJCQkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYtPnBSQ0JNZW0gPT0gTlVMTCkgeworCQlEQkdfUFJUKE1TR19MRVZFTF9FUlIsIEtFUk5fRVJSCisJCQkiJXMgOiBhbGxvYyByeCB1c2IgY29udGV4dCBmYWlsZWRcbiIsCisJCQkJcHJpdi0+ZGV2LT5uYW1lKTsKKwkJZ290byBmcmVlX3R4OwogCX0KIAotICAgIHJldHVybiB0cnVlOworCXByaXYtPkZpcnN0UmVjdkZyZWVMaXN0ID0gTlVMTDsKKwlwcml2LT5MYXN0UmVjdkZyZWVMaXN0ID0gTlVMTDsKKwlwcml2LT5GaXJzdFJlY3ZNbmdMaXN0ID0gTlVMTDsKKwlwcml2LT5MYXN0UmVjdk1uZ0xpc3QgPSBOVUxMOworCXByaXYtPk51bVJlY3ZGcmVlTGlzdCA9IDA7CisKKwlyY2IgPSAoc3RydWN0IHZudF9yY2IgKilwcml2LT5wUkNCTWVtOworCisJZm9yIChpaSA9IDA7IGlpIDwgcHJpdi0+Y2JSRDsgaWkrKykgeworCQlwcml2LT5hcFJDQltpaV0gPSByY2I7CisJCXJjYi0+cERldmljZSA9IHByaXY7CisKKwkJLyogYWxsb2NhdGUgVVJCcyAqLworCQlyY2ItPnBVcmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCQlpZiAocmNiLT5wVXJiID09IE5VTEwpIHsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0VSUiwgS0VSTl9FUlIKKwkJCQkiIEZhaWxlZCB0byBhbGxvYyByeCB1cmJcbiIpOworCQkJZ290byBmcmVlX3J4X3R4OworCQl9CisKKwkJcmNiLT5za2IgPSBuZXRkZXZfYWxsb2Nfc2tiKHByaXYtPmRldiwgcHJpdi0+cnhfYnVmX3N6KTsKKwkJaWYgKHJjYi0+c2tiID09IE5VTEwpIHsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0VSUiwgS0VSTl9FUlIKKwkJCQkJCSIgRmFpbGVkIHRvIGFsbG9jIHJ4IHNrYlxuIik7CisJCQlnb3RvIGZyZWVfcnhfdHg7CisJCX0KKworCQlyY2ItPmJCb29sSW5Vc2UgPSBmYWxzZTsKKworCQlFbnF1ZXVlUkNCKHByaXYtPkZpcnN0UmVjdkZyZWVMaXN0LAorCQkJCQkJcHJpdi0+TGFzdFJlY3ZGcmVlTGlzdCwgcmNiKTsKKworCQlwcml2LT5OdW1SZWN2RnJlZUxpc3QrKzsKKwkJcmNiKys7CisJfQorCisJcHJpdi0+cEludGVycnVwdFVSQiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJaWYgKHByaXYtPnBJbnRlcnJ1cHRVUkIgPT0gTlVMTCkgeworCQlEQkdfUFJUKE1TR19MRVZFTF9FUlIsIEtFUk5fRVJSIkZhaWxlZCB0byBhbGxvYyBpbnQgdXJiXG4iKTsKKwkJZ290byBmcmVlX3J4X3R4OworCX0KKworCXByaXYtPmludF9idWYuZGF0YV9idWYgPSBrbWFsbG9jKE1BWF9JTlRFUlJVUFRfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYtPmludF9idWYuZGF0YV9idWYgPT0gTlVMTCkgeworCQlEQkdfUFJUKE1TR19MRVZFTF9FUlIsIEtFUk5fRVJSIkZhaWxlZCB0byBhbGxvYyBpbnQgYnVmXG4iKTsKKwkJdXNiX2ZyZWVfdXJiKHByaXYtPnBJbnRlcnJ1cHRVUkIpOworCQlnb3RvIGZyZWVfcnhfdHg7CisJfQorCisJcmV0dXJuIHRydWU7CiAKIGZyZWVfcnhfdHg6Ci0gICAgZGV2aWNlX2ZyZWVfcnhfYnVmcyhwRGV2aWNlKTsKKwlkZXZpY2VfZnJlZV9yeF9idWZzKHByaXYpOwogCiBmcmVlX3R4OgotICAgIGRldmljZV9mcmVlX3R4X2J1ZnMocERldmljZSk7CisJZGV2aWNlX2ZyZWVfdHhfYnVmcyhwcml2KTsKIAogCXJldHVybiBmYWxzZTsKIH0KQEAgLTkzMSwxMyArOTQ4LDExIEBACiBpbnQgZGV2aWNlX2FsbG9jX2ZyYWdfYnVmKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSwKIAkJUFNEZUZyYWdDb250cm9sQmxvY2sgcERlRikKIHsKKwlwRGVGLT5za2IgPSBuZXRkZXZfYWxsb2Nfc2tiKHBEZXZpY2UtPmRldiwgcERldmljZS0+cnhfYnVmX3N6KTsKKwlpZiAoIXBEZUYtPnNrYikKKwkJcmV0dXJuIGZhbHNlOwogCi0gICAgcERlRi0+c2tiID0gZGV2X2FsbG9jX3NrYigoaW50KXBEZXZpY2UtPnJ4X2J1Zl9zeik7Ci0gICAgaWYgKHBEZUYtPnNrYiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcERlRi0+c2tiLT5kZXYgPSBwRGV2aWNlLT5kZXY7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIGludCAgZGV2aWNlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTk3NCw4ICs5ODksNiBAQAogCQlnb3RvIGZyZWVfYWxsOwogCX0KIAotICAgIGRldmljZV9zZXRfbXVsdGkocERldmljZS0+ZGV2KTsKLQogICAgIC8qIGluaXQgZm9yIGtleSBtYW5hZ2VtZW50ICovCiAgICAgS2V5dkluaXRUYWJsZShwRGV2aWNlLCZwRGV2aWNlLT5zS2V5KTsKIAltZW1jcHkocERldmljZS0+dm50X21nbXQuYWJ5TUFDQWRkciwKQEAgLTk5MiwxNiArMTAwNSwxMiBAQAogCiAgICAgdk1nck9iamVjdEluaXQocERldmljZSk7CiAKLSAgICB0YXNrbGV0X2luaXQoJnBEZXZpY2UtPkV2ZW50V29ya0l0ZW0sICh2b2lkICopSU5UdldvcmtJdGVtLCAodW5zaWduZWQgbG9uZylwRGV2aWNlKTsKLQogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcERldmljZS0+c2Vjb25kX2NhbGxiYWNrX3dvcmssIEhaKTsKIAotCXBEZXZpY2UtPmludF9pbnRlcnZhbCA9IDEwMDsgIC8qIG1heCAxMDAgbWljcm9mcmFtZXMgKi8KKwlwRGV2aWNlLT5pbnRfaW50ZXJ2YWwgPSAxOyAgLyogYkludGVydmFsIGlzIHNldCB0byAxICovCiAgICAgcERldmljZS0+ZUVuY3J5cHRpb25TdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOwogCiAgICAgcERldmljZS0+YklzUnhXb3JrSXRlbVF1ZXVlZCA9IHRydWU7Ci0gICAgcERldmljZS0+ZktpbGxFdmVudFBvbGxpbmdUaHJlYWQgPSBmYWxzZTsKLSAgICBwRGV2aWNlLT5iRXZlbnRBdmFpbGFibGUgPSBmYWxzZTsKIAogICAgcERldmljZS0+YldQQURFVlVwID0gZmFsc2U7CiAgICAgIHBEZXZpY2UtPmJ3ZXh0c3RlcDAgPSBmYWxzZTsKQEAgLTEwODQsNyArMTA5Myw2IEBACiAgICAgTVBfU0VUX0ZMQUcocERldmljZSwgZk1QX0RJU0NPTk5FQ1RFRCk7CiAgICAgTVBfQ0xFQVJfRkxBRyhwRGV2aWNlLCBmTVBfUE9TVF9XUklURVMpOwogICAgIE1QX0NMRUFSX0ZMQUcocERldmljZSwgZk1QX1BPU1RfUkVBRFMpOwotICAgIHBEZXZpY2UtPmZLaWxsRXZlbnRQb2xsaW5nVGhyZWFkID0gdHJ1ZTsKIAogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcERldmljZS0+cnVuX2NvbW1hbmRfd29yayk7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwRGV2aWNlLT5zZWNvbmRfY2FsbGJhY2tfd29yayk7CkBAIC0xMDk4LDggKzExMDYsNiBAQAogCWNhbmNlbF93b3JrX3N5bmMoJnBEZXZpY2UtPnJ4X21uZ193b3JrX2l0ZW0pOwogCWNhbmNlbF93b3JrX3N5bmMoJnBEZXZpY2UtPnJlYWRfd29ya19pdGVtKTsKIAotICAgIHRhc2tsZXRfa2lsbCgmcERldmljZS0+RXZlbnRXb3JrSXRlbSk7Ci0KICAgIHBEZXZpY2UtPmJSb2FtaW5nID0gZmFsc2U7CiAgICBwRGV2aWNlLT5iSXNSb2FtaW5nID0gZmFsc2U7CiAgICBwRGV2aWNlLT5iRW5hYmxlUm9hbWluZyA9IGZhbHNlOwpAQCAtMTM1MCw2OSArMTM1Niw3MyBAQAogCiBzdGF0aWMgdm9pZCBkZXZpY2Vfc2V0X211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3Qgdm50X21hbmFnZXIgKnBNZ210ID0gJnBEZXZpY2UtPnZudF9tZ210OworCXN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChwcml2LT5mbGFncyAmIERFVklDRV9GTEFHU19PUEVORUQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCQliU2NoZWR1bGVDb21tYW5kKHByaXYsIFdMQU5fQ01EX0NPTkZJR1VSRV9GSUxURVIsIE5VTEwpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKK3ZvaWQgdm50X2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IHZudF9wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5kZXY7CisJc3RydWN0IHZudF9tYW5hZ2VyICptZ210ID0gJnByaXYtPnZudF9tZ210OwogCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7Ci0JdTMyIG1jX2ZpbHRlclsyXTsKLQlpbnQgaWk7Ci0JdTggcGJ5RGF0YVs4XSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKLQl1OCBieVRtcE1vZGUgPSAwOworCXU2NCBtY19maWx0ZXIgPSAwOworCXU4IHRtcCA9IDA7CiAJaW50IHJjOwogCi0Jc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0gICAgcmMgPSBDT05UUk9MbnNSZXF1ZXN0SW4ocERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVNTQUdFX1RZUEVfUkVBRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUNfUkVHX1JDUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5VG1wTW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgaWYgKHJjID09IDApIHBEZXZpY2UtPmJ5UnhNb2RlID0gYnlUbXBNb2RlOworCXJjID0gQ09OVFJPTG5zUmVxdWVzdEluKHByaXYsIE1FU1NBR0VfVFlQRV9SRUFELAorCQlNQUNfUkVHX1JDUiwgTUVTU0FHRV9SRVFVRVNUX01BQ1JFRywgMSwgJnRtcCk7CisJaWYgKHJjID09IDApCisJCXByaXYtPmJ5UnhNb2RlID0gdG1wOwogCi0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAicERldmljZS0+YnlSeE1vZGUgaW49ICV4XG4iLCBwRGV2aWNlLT5ieVJ4TW9kZSk7CisJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAicHJpdi0+YnlSeE1vZGUgaW49ICV4XG4iLAorCQkJCQkJCXByaXYtPmJ5UnhNb2RlKTsKIAotICAgIGlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsgLyogc2V0IHByb21pc2N1b3VzIG1vZGUgKi8KLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfRVJSLEtFUk5fTk9USUNFICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKLQkvKiB1bmNvbmRpdGlvbmFsbHkgbG9nIG5ldCB0YXBzICovCi0gICAgICAgIHBEZXZpY2UtPmJ5UnhNb2RlIHw9IChSQ1JfTVVMVElDQVNUfFJDUl9CUk9BRENBU1R8UkNSX1VOSUNBU1QpOwotICAgIH0KLSAgICBlbHNlIGlmICgobmV0ZGV2X21jX2NvdW50KGRldikgPiBwRGV2aWNlLT5tdWx0aWNhc3RfbGltaXQpIHx8Ci0JICAgICAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKLSAgICAgICAgQ09OVFJPTG5zUmVxdWVzdE91dChwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FU1NBR0VfVFlQRV9XUklURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUNfUkVHX01BUjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVTU0FHRV9SRVFVRVNUX01BQ1JFRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBieURhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICBwRGV2aWNlLT5ieVJ4TW9kZSB8PSAoUkNSX01VTFRJQ0FTVHxSQ1JfQlJPQURDQVNUKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIG1lbXNldChtY19maWx0ZXIsIDAsIHNpemVvZihtY19maWx0ZXIpKTsKLQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7Ci0gICAgICAgICAgICBpbnQgYml0X25yID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBoYS0+YWRkcikgPj4gMjY7Ci0gICAgICAgICAgICBtY19maWx0ZXJbYml0X25yID4+IDVdIHw9IGNwdV90b19sZTMyKDEgPDwgKGJpdF9uciAmIDMxKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgNDsgaWkrKykgewotICAgICAgICAgICAgIE1BQ3ZXcml0ZU11bHRpQWRkcihwRGV2aWNlLCBpaSwgKigodTggKikmbWNfZmlsdGVyWzBdICsgaWkpKTsKLSAgICAgICAgICAgICBNQUN2V3JpdGVNdWx0aUFkZHIocERldmljZSwgaWkrIDQsICooKHU4ICopJm1jX2ZpbHRlclsxXSArIGlpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcERldmljZS0+YnlSeE1vZGUgJj0gfihSQ1JfVU5JQ0FTVCk7Ci0gICAgICAgIHBEZXZpY2UtPmJ5UnhNb2RlIHw9IChSQ1JfTVVMVElDQVNUfFJDUl9CUk9BRENBU1QpOwotICAgIH0KKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7IC8qIHNldCBwcm9taXNjdW91cyBtb2RlICovCisJCURCR19QUlQoTVNHX0xFVkVMX0VSUiwgS0VSTl9OT1RJQ0UKKwkJCSIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJLyogdW5jb25kaXRpb25hbGx5IGxvZyBuZXQgdGFwcyAqLworCQlwcml2LT5ieVJ4TW9kZSB8PSAoUkNSX01VTFRJQ0FTVHxSQ1JfQlJPQURDQVNUfFJDUl9VTklDQVNUKTsKKwl9IGVsc2UgaWYgKChuZXRkZXZfbWNfY291bnQoZGV2KSA+IHByaXYtPm11bHRpY2FzdF9saW1pdCkgfHwKKwkJCShkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQltY19maWx0ZXIgPSB+MHgwOworCQlNQUN2V3JpdGVNdWx0aUFkZHIocHJpdiwgbWNfZmlsdGVyKTsKIAotICAgIGlmIChwTWdtdC0+ZUNvbmZpZ01vZGUgPT0gV01BQ19DT05GSUdfQVApIHsKLQkvKgotCSAqIElmIEFQIG1vZGUsIGRvbid0IGVuYWJsZSBSQ1JfVU5JQ0FTVCBzaW5jZSBIVyBvbmx5IGNvbXBhcmVzCi0JICogYWRkcjEgd2l0aCBsb2NhbCBNQUMKLQkgKi8KLSAgICAgICAgcERldmljZS0+YnlSeE1vZGUgfD0gKFJDUl9NVUxUSUNBU1R8UkNSX0JST0FEQ0FTVCk7Ci0gICAgICAgIHBEZXZpY2UtPmJ5UnhNb2RlICY9IH4oUkNSX1VOSUNBU1QpOwotICAgIH0KLSAgICBDb250cm9sdldyaXRlQnl0ZShwRGV2aWNlLCBNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLCBNQUNfUkVHX1JDUiwgcERldmljZS0+YnlSeE1vZGUpOwotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gInBEZXZpY2UtPmJ5UnhNb2RlIG91dD0gJXhcbiIsIHBEZXZpY2UtPmJ5UnhNb2RlKTsKLQlzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOworCQlwcml2LT5ieVJ4TW9kZSB8PSAoUkNSX01VTFRJQ0FTVHxSQ1JfQlJPQURDQVNUKTsKKwl9IGVsc2UgeworCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7CisJCQlpbnQgYml0X25yID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBoYS0+YWRkcikgPj4gMjY7CiAKKwkJCW1jX2ZpbHRlciB8PSAxVUxMIDw8IChiaXRfbnIgJiAweDNmKTsKKwkJfQorCisJCU1BQ3ZXcml0ZU11bHRpQWRkcihwcml2LCBtY19maWx0ZXIpOworCisJCXByaXYtPmJ5UnhNb2RlICY9IH4oUkNSX1VOSUNBU1QpOworCQlwcml2LT5ieVJ4TW9kZSB8PSAoUkNSX01VTFRJQ0FTVHxSQ1JfQlJPQURDQVNUKTsKKwl9CisKKwlpZiAobWdtdC0+ZUNvbmZpZ01vZGUgPT0gV01BQ19DT05GSUdfQVApIHsKKwkJLyoKKwkJICogSWYgQVAgbW9kZSwgZG9uJ3QgZW5hYmxlIFJDUl9VTklDQVNUIHNpbmNlIEhXIG9ubHkgY29tcGFyZXMKKwkJICogYWRkcjEgd2l0aCBsb2NhbCBNQUMKKwkJICovCisJCXByaXYtPmJ5UnhNb2RlIHw9IChSQ1JfTVVMVElDQVNUfFJDUl9CUk9BRENBU1QpOworCQlwcml2LT5ieVJ4TW9kZSAmPSB+KFJDUl9VTklDQVNUKTsKKwl9CisKKwlDb250cm9sdldyaXRlQnl0ZShwcml2LCBNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLAorCQkJCQlNQUNfUkVHX1JDUiwgcHJpdi0+YnlSeE1vZGUpOworCisJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTworCQkJCSJwcml2LT5ieVJ4TW9kZSBvdXQ9ICV4XG4iLCBwcml2LT5ieVJ4TW9kZSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZGV2aWNlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9wb3dlci5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9wb3dlci5jCmluZGV4IGU3ZDU0ODcuLjQzZGE1ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcG93ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3Bvd2VyLmMKQEAgLTY3LDIyICs2NywyMyBAQAogCS8qIHNldCBwZXJpb2Qgb2YgcG93ZXIgdXAgYmVmb3JlIFRCVFQgKi8KIAlNQUN2V3JpdGVXb3JkKHBEZXZpY2UsIE1BQ19SRUdfUFdCVCwgQ19QV0JUKTsKIAotCWlmIChwRGV2aWNlLT5lT1BNb2RlICE9IE9QX01PREVfQURIT0MpIHsKKwlpZiAocERldmljZS0+b3BfbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQkvKiBzZXQgQUlEICovCiAJCU1BQ3ZXcml0ZVdvcmQocERldmljZSwgTUFDX1JFR19BSURBVElNLCB3QUlEKTsKLQl9IGVsc2UgewotCQkvKiBzZXQgQVRJTSBXaW5kb3cgKi8KLQkJLyogTUFDdldyaXRlQVRJTVcocERldmljZS0+UG9ydE9mZnNldCwgcE1nbXQtPndDdXJyQVRJTVdpbmRvdyk7ICovCiAJfQogCi0JLyogV2FycmVuOjA2LTE4LTIwMDQsdGhlIHNlcXVlbmNlIG11c3QgZm9sbG93IFBTRU4tPkFVVE9TTEVFUC0+R08yRE9aRSAqLworCS8qIFdhcnJlbjowNi0xOC0yMDA0LHRoZSBzZXF1ZW5jZSBtdXN0IGZvbGxvdworCSAqIFBTRU4tPkFVVE9TTEVFUC0+R08yRE9aRQorCSAqLwogCS8qIGVuYWJsZSBwb3dlciBzYXZpbmcgaHcgZnVuY3Rpb24gKi8KIAlNQUN2UmVnQml0c09uKHBEZXZpY2UsIE1BQ19SRUdfUFNDVEwsIFBTQ1RMX1BTRU4pOwogCiAJLyogU2V0IEF1dG9TbGVlcCAqLwogCU1BQ3ZSZWdCaXRzT24ocERldmljZSwgTUFDX1JFR19QU0NGRywgUFNDRkdfQVVUT1NMRUVQKTsKIAotCS8qIFdhcnJlbjpNVVNUIHR1cm4gb24gdGhpcyBvbmNlIGJlZm9yZSB0dXJuIG9uIEFVVE9TTEVFUCAsb3IgdGhlIEFVVE9TTEVFUCBkb2Vzbid0IHdvcmsgKi8KKwkvKiBXYXJyZW46TVVTVCB0dXJuIG9uIHRoaXMgb25jZSBiZWZvcmUgdHVybiBvbiBBVVRPU0xFRVAgLG9yIHRoZQorCSAqIEFVVE9TTEVFUCBkb2Vzbid0IHdvcmsKKwkgKi8KIAlNQUN2UmVnQml0c09uKHBEZXZpY2UsIE1BQ19SRUdfUFNDVEwsIFBTQ1RMX0dPMkRPWkUpOwogCiAJaWYgKHdMaXN0ZW5JbnRlcnZhbCA+PSAyKSB7CkBAIC0xMDUsOCArMTA2LDEwIEBACiAKIAlwRGV2aWNlLT5iRW5hYmxlUFNNb2RlID0gdHJ1ZTsKIAotCS8qIFdlIGRvbid0IHNlbmQgbnVsbCBwa3QgaW4gYWQgaG9jIG1vZGUgc2luY2UgYmVhY29uIHdpbGwgaGFuZGxlIHRoaXMuICovCi0JaWYgKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9JTkZSQVNUUlVDVFVSRSkKKwkvKiBXZSBkb24ndCBzZW5kIG51bGwgcGt0IGluIGFkIGhvYyBtb2RlCisJICogc2luY2UgYmVhY29uIHdpbGwgaGFuZGxlIHRoaXMuCisJICovCisJaWYgKHBEZXZpY2UtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKIAkJUFNiU2VuZE51bGxQYWNrZXQocERldmljZSk7CiAKIAlwRGV2aWNlLT5iUFdCaXRPbiA9IHRydWU7CkBAIC0xMzcsNyArMTQwLDcgQEAKIAlNQUN2UmVnQml0c09uKHBEZXZpY2UsIE1BQ19SRUdfUFNDVEwsIFBTQ1RMX0FMQkNOKTsKIAlwRGV2aWNlLT5iRW5hYmxlUFNNb2RlID0gZmFsc2U7CiAKLQlpZiAocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0lORlJBU1RSVUNUVVJFKQorCWlmIChwRGV2aWNlLT5vcF9tb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCVBTYlNlbmROdWxsUGFja2V0KHBEZXZpY2UpOwogCiAJcERldmljZS0+YlBXQml0T24gPSBmYWxzZTsKQEAgLTIyNiwxNSArMjI5LDE5IEBACiAJCQlXTEFOX1NFVF9GQ19QV1JNR1QoMCkKIAkJKSk7CiAKLQlwVHhQYWNrZXQtPnA4MDIxMUhlYWRlci0+c0EyLndEdXJhdGlvbklEID0gcE1nbXQtPndDdXJyQUlEIHwgQklUMTQgfCBCSVQxNTsKLQltZW1jcHkocFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMi5hYnlBZGRyMSwgcE1nbXQtPmFieUN1cnJCU1NJRCwgV0xBTl9BRERSX0xFTik7Ci0JbWVtY3B5KHBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTIuYWJ5QWRkcjIsIHBNZ210LT5hYnlNQUNBZGRyLCBXTEFOX0FERFJfTEVOKTsKKwlwVHhQYWNrZXQtPnA4MDIxMUhlYWRlci0+c0EyLndEdXJhdGlvbklEID0KKwkJcE1nbXQtPndDdXJyQUlEIHwgQklUMTQgfCBCSVQxNTsKKwltZW1jcHkocFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMi5hYnlBZGRyMSwgcE1nbXQtPmFieUN1cnJCU1NJRCwKKwkJV0xBTl9BRERSX0xFTik7CisJbWVtY3B5KHBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTIuYWJ5QWRkcjIsIHBNZ210LT5hYnlNQUNBZGRyLAorCQlXTEFOX0FERFJfTEVOKTsKIAlwVHhQYWNrZXQtPmNiTVBEVUxlbiA9IFdMQU5fSERSX0FERFIyX0xFTjsKIAlwVHhQYWNrZXQtPmNiUGF5bG9hZExlbiA9IDA7CiAKIAkvKiBsb2cgZmFpbHVyZSBpZiBzZW5kaW5nIGZhaWxlZCAqLwogCWlmIChjc01nbXRfeG1pdChwRGV2aWNlLCBwVHhQYWNrZXQpICE9IENNRF9TVEFUVVNfUEVORElORykKLQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiU2VuZCBQUy1Qb2xsIHBhY2tldCBmYWlsZWQuLlxuIik7CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLAorCQkJS0VSTl9JTkZPICJTZW5kIFBTLVBvbGwgcGFja2V0IGZhaWxlZC4uXG4iKTsKIH0KIAogLyoKQEAgLTI3NiwxNiArMjgzLDIxIEBACiAJcFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMy53RnJhbWVDdGwgPSBjcHVfdG9fbGUxNihmbGFncyk7CiAKIAlpZiAocE1nbXQtPmVDdXJyTW9kZSAhPSBXTUFDX01PREVfSUJTU19TVEEpCi0JCXBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTMud0ZyYW1lQ3RsIHw9IGNwdV90b19sZTE2KCh1MTYpV0xBTl9TRVRfRkNfVE9EUygxKSk7CisJCXBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTMud0ZyYW1lQ3RsIHw9CisJCQljcHVfdG9fbGUxNigodTE2KVdMQU5fU0VUX0ZDX1RPRFMoMSkpOwogCi0JbWVtY3B5KHBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTMuYWJ5QWRkcjEsIHBNZ210LT5hYnlDdXJyQlNTSUQsIFdMQU5fQUREUl9MRU4pOwotCW1lbWNweShwVHhQYWNrZXQtPnA4MDIxMUhlYWRlci0+c0EzLmFieUFkZHIyLCBwTWdtdC0+YWJ5TUFDQWRkciwgV0xBTl9BRERSX0xFTik7Ci0JbWVtY3B5KHBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTMuYWJ5QWRkcjMsIHBNZ210LT5hYnlDdXJyQlNTSUQsIFdMQU5fQlNTSURfTEVOKTsKKwltZW1jcHkocFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMy5hYnlBZGRyMSwgcE1nbXQtPmFieUN1cnJCU1NJRCwKKwkJV0xBTl9BRERSX0xFTik7CisJbWVtY3B5KHBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTMuYWJ5QWRkcjIsIHBNZ210LT5hYnlNQUNBZGRyLAorCQlXTEFOX0FERFJfTEVOKTsKKwltZW1jcHkocFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMy5hYnlBZGRyMywgcE1nbXQtPmFieUN1cnJCU1NJRCwKKwkJV0xBTl9CU1NJRF9MRU4pOwogCXBUeFBhY2tldC0+Y2JNUERVTGVuID0gV0xBTl9IRFJfQUREUjNfTEVOOwogCXBUeFBhY2tldC0+Y2JQYXlsb2FkTGVuID0gMDsKIAkvKiBsb2cgZXJyb3IgaWYgc2VuZGluZyBmYWlsZWQgKi8KIAlpZiAoY3NNZ210X3htaXQocERldmljZSwgcFR4UGFja2V0KSAhPSBDTURfU1RBVFVTX1BFTkRJTkcpIHsKLQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiU2VuZCBOdWxsIFBhY2tldCBmYWlsZWQgIVxuIik7CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLAorCQkJS0VSTl9JTkZPICJTZW5kIE51bGwgUGFja2V0IGZhaWxlZCAhXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAlyZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmMKaW5kZXggNTFmZmY4OS4uMzg0MDMyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmMKQEAgLTExOCw3ICsxMTgsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBzX3VHZXRUeFJzdlRpbWUoc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLCB1OCBieVBrdFR5cGUsCiAJdTMyIGNiRnJhbWVMZW5ndGgsIHUxNiB3UmF0ZSwgaW50IGJOZWVkQWNrKTsKIAotc3RhdGljIHUxNiBzX3VHZXRSVFNDVFNSc3ZUaW1lKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwKK3N0YXRpYyBfX2xlMTYgc191R2V0UlRTQ1RTUnN2VGltZShzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsCiAJdTggcnN2X3R5cGUsIHU4IHBrdF90eXBlLCB1MzIgZnJhbWVfbGVuZ2h0LCB1MTYgY3VycmVudF9yYXRlKTsKIAogc3RhdGljIHUxNiBzX3ZGaWxsQ1RTSGVhZChzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsIHUzMiB1RE1BSWR4LApAQCAtMTI5LDEwICsxMjksMTAgQEAKIAl1bmlvbiB2bnRfdHhfZGF0YV9oZWFkICpoZWFkLCB1MzIgY2JGcmFtZUxlbmd0aCwgaW50IGJOZWVkQWNrLAogCXN0cnVjdCBldGhoZHIgKnBzRXRoSGVhZGVyLCB1MTYgd0N1cnJlbnRSYXRlLCB1OCBieUZCT3B0aW9uKTsKIAotc3RhdGljIHUxNiBzX3VHZXREYXRhRHVyYXRpb24oc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLAorc3RhdGljIF9fbGUxNiBzX3VHZXREYXRhRHVyYXRpb24oc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLAogCXU4IGJ5UGt0VHlwZSwgaW50IGJOZWVkQWNrKTsKIAotc3RhdGljIHUxNiBzX3VHZXRSVFNDVFNEdXJhdGlvbihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsCitzdGF0aWMgX19sZTE2IHNfdUdldFJUU0NUU0R1cmF0aW9uKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSwKIAl1OCBieUR1clR5cGUsIHUzMiBjYkZyYW1lTGVuZ3RoLCB1OCBieVBrdFR5cGUsIHUxNiB3UmF0ZSwKIAlpbnQgYk5lZWRBY2ssIHU4IGJ5RkJPcHRpb24pOwogCkBAIC0zMjcsNyArMzI3LDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB1MTYgdm50X3RpbWVfc3RhbXBfb2ZmKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwgdTE2IHJhdGUpCitzdGF0aWMgX19sZTE2IHZudF90aW1lX3N0YW1wX29mZihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsIHUxNiByYXRlKQogewogCXJldHVybiBjcHVfdG9fbGUxNih3VGltZVN0YW1wT2ZmW3ByaXYtPmJ5UHJlYW1ibGVUeXBlICUgMl0KIAkJCQkJCQlbcmF0ZSAlIE1BWF9SQVRFXSk7CkBAIC0zNTksNyArMzU5LDcgQEAKIAlyZXR1cm4gZGF0YV90aW1lOwogfQogCi1zdGF0aWMgdTE2IHZudF9yeHR4X3JzdnRpbWVfbGUxNihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsIHU4IHBrdF90eXBlLAorc3RhdGljIF9fbGUxNiB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYoc3RydWN0IHZudF9wcml2YXRlICpwcml2LCB1OCBwa3RfdHlwZSwKIAl1MzIgZnJhbWVfbGVuZ3RoLCB1MTYgcmF0ZSwgaW50IG5lZWRfYWNrKQogewogCXJldHVybiBjcHVfdG9fbGUxNigodTE2KXNfdUdldFR4UnN2VGltZShwcml2LCBwa3RfdHlwZSwKQEAgLTM2Nyw3ICszNjcsNyBAQAogfQogCiAvL2J5RnJlcVR5cGU6IDA9PjVHSFogMT0+Mi40R0haCi1zdGF0aWMgdTE2IHNfdUdldFJUU0NUU1JzdlRpbWUoc3RydWN0IHZudF9wcml2YXRlICpwcml2LAorc3RhdGljIF9fbGUxNiBzX3VHZXRSVFNDVFNSc3ZUaW1lKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwKIAl1OCByc3ZfdHlwZSwgdTggcGt0X3R5cGUsIHUzMiBmcmFtZV9sZW5naHQsIHUxNiBjdXJyZW50X3JhdGUpCiB7CiAJdTMyIHJydl90aW1lLCBydHNfdGltZSwgY3RzX3RpbWUsIGFja190aW1lLCBkYXRhX3RpbWU7CkBAIC00MDIsNyArNDAyLDcgQEAKIAogCQlycnZfdGltZSA9IGN0c190aW1lICsgYWNrX3RpbWUgKyBkYXRhX3RpbWUgKyAyICogcHJpdi0+dVNJRlM7CiAKLQkJcmV0dXJuIHJydl90aW1lOworCQlyZXR1cm4gY3B1X3RvX2xlMTYoKHUxNilycnZfdGltZSk7CiAJfQogCiAJcnJ2X3RpbWUgPSBydHNfdGltZSArIGN0c190aW1lICsgYWNrX3RpbWUgKyBkYXRhX3RpbWUgKyAzICogcHJpdi0+dVNJRlM7CkBAIC00MTEsNyArNDExLDcgQEAKIH0KIAogLy9ieUZyZXFUeXBlIDA6IDVHSHosIDE6Mi40R2h6Ci1zdGF0aWMgdTE2IHNfdUdldERhdGFEdXJhdGlvbihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsCitzdGF0aWMgX19sZTE2IHNfdUdldERhdGFEdXJhdGlvbihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsCiAJCQkJCXU4IGJ5UGt0VHlwZSwgaW50IGJOZWVkQWNrKQogewogCXUzMiB1QWNrVGltZSA9IDA7CkBAIC00MzAsNyArNDMwLDcgQEAKIH0KIAogLy9ieUZyZXFUeXBlOiAwPT41R0haIDE9PjIuNEdIWgotc3RhdGljIHUxNiBzX3VHZXRSVFNDVFNEdXJhdGlvbihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsIHU4IGJ5RHVyVHlwZSwKK3N0YXRpYyBfX2xlMTYgc191R2V0UlRTQ1RTRHVyYXRpb24oc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLCB1OCBieUR1clR5cGUsCiAJdTMyIGNiRnJhbWVMZW5ndGgsIHU4IGJ5UGt0VHlwZSwgdTE2IHdSYXRlLCBpbnQgYk5lZWRBY2ssCiAJdTggYnlGQk9wdGlvbikKIHsKQEAgLTQ4MSwxNCArNDgxLDE0IEBACiAJCQkJCQkJUEtfVFlQRV8xMUIsICZidWYtPmIpOwogCiAJLyogR2V0IER1cmF0aW9uIGFuZCBUaW1lU3RhbXAgKi8KLQlidWYtPndEdXJhdGlvbl9hID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIHBrdF90eXBlLCBuZWVkX2Fjayk7Ci0JYnVmLT53RHVyYXRpb25fYiA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBQS19UWVBFXzExQiwgbmVlZF9hY2spOworCWJ1Zi0+ZHVyYXRpb25fYSA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBwa3RfdHlwZSwgbmVlZF9hY2spOworCWJ1Zi0+ZHVyYXRpb25fYiA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBQS19UWVBFXzExQiwgbmVlZF9hY2spOwogCi0JYnVmLT53VGltZVN0YW1wT2ZmX2EgPSB2bnRfdGltZV9zdGFtcF9vZmYocHJpdiwgcmF0ZSk7Ci0JYnVmLT53VGltZVN0YW1wT2ZmX2IgPSB2bnRfdGltZV9zdGFtcF9vZmYocHJpdiwKKwlidWYtPnRpbWVfc3RhbXBfb2ZmX2EgPSB2bnRfdGltZV9zdGFtcF9vZmYocHJpdiwgcmF0ZSk7CisJYnVmLT50aW1lX3N0YW1wX29mZl9iID0gdm50X3RpbWVfc3RhbXBfb2ZmKHByaXYsCiAJCQkJCXByaXYtPmJ5VG9wQ0NLQmFzaWNSYXRlKTsKIAotCXJldHVybiBidWYtPndEdXJhdGlvbl9hOworCXJldHVybiBsZTE2X3RvX2NwdShidWYtPmR1cmF0aW9uX2EpOwogfQogCiBzdGF0aWMgdTE2IHZudF9yeHR4X2RhdGFoZWFkX2dfZmIoc3RydWN0IHZudF9wcml2YXRlICpwcml2LCB1OCBwa3RfdHlwZSwKQEAgLTUwMiwxNyArNTAyLDE3IEBACiAJCQkJCQlQS19UWVBFXzExQiwgJmJ1Zi0+Yik7CiAKIAkvKiBHZXQgRHVyYXRpb24gYW5kIFRpbWVTdGFtcCAqLwotCWJ1Zi0+d0R1cmF0aW9uX2EgPSBzX3VHZXREYXRhRHVyYXRpb24ocHJpdiwgcGt0X3R5cGUsIG5lZWRfYWNrKTsKLQlidWYtPndEdXJhdGlvbl9iID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIFBLX1RZUEVfMTFCLCBuZWVkX2Fjayk7CisJYnVmLT5kdXJhdGlvbl9hID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIHBrdF90eXBlLCBuZWVkX2Fjayk7CisJYnVmLT5kdXJhdGlvbl9iID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIFBLX1RZUEVfMTFCLCBuZWVkX2Fjayk7CiAKLQlidWYtPndEdXJhdGlvbl9hX2YwID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIHBrdF90eXBlLCBuZWVkX2Fjayk7Ci0JYnVmLT53RHVyYXRpb25fYV9mMSA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBwa3RfdHlwZSwgbmVlZF9hY2spOworCWJ1Zi0+ZHVyYXRpb25fYV9mMCA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBwa3RfdHlwZSwgbmVlZF9hY2spOworCWJ1Zi0+ZHVyYXRpb25fYV9mMSA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBwa3RfdHlwZSwgbmVlZF9hY2spOwogCi0JYnVmLT53VGltZVN0YW1wT2ZmX2EgPSB2bnRfdGltZV9zdGFtcF9vZmYocHJpdiwgcmF0ZSk7Ci0JYnVmLT53VGltZVN0YW1wT2ZmX2IgPSB2bnRfdGltZV9zdGFtcF9vZmYocHJpdiwKKwlidWYtPnRpbWVfc3RhbXBfb2ZmX2EgPSB2bnRfdGltZV9zdGFtcF9vZmYocHJpdiwgcmF0ZSk7CisJYnVmLT50aW1lX3N0YW1wX29mZl9iID0gdm50X3RpbWVfc3RhbXBfb2ZmKHByaXYsCiAJCQkJCQlwcml2LT5ieVRvcENDS0Jhc2ljUmF0ZSk7CiAKLQlyZXR1cm4gYnVmLT53RHVyYXRpb25fYTsKKwlyZXR1cm4gbGUxNl90b19jcHUoYnVmLT5kdXJhdGlvbl9hKTsKIH0KIAogc3RhdGljIHUxNiB2bnRfcnh0eF9kYXRhaGVhZF9hX2ZiKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwgdTggcGt0X3R5cGUsCkBAIC01MjIsMTQgKzUyMiwxNCBAQAogCS8qIEdldCBTaWduYWxGaWVsZCxTZXJ2aWNlRmllbGQsTGVuZ3RoICovCiAJQkJ2Q2FsY3VsYXRlUGFyYW1ldGVyKHByaXYsIGZyYW1lX2xlbiwgcmF0ZSwgcGt0X3R5cGUsICZidWYtPmEpOwogCS8qIEdldCBEdXJhdGlvbiBhbmQgVGltZVN0YW1wT2ZmICovCi0JYnVmLT53RHVyYXRpb24gPSBzX3VHZXREYXRhRHVyYXRpb24ocHJpdiwgcGt0X3R5cGUsIG5lZWRfYWNrKTsKKwlidWYtPmR1cmF0aW9uID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIHBrdF90eXBlLCBuZWVkX2Fjayk7CiAKLQlidWYtPndEdXJhdGlvbl9mMCA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBwa3RfdHlwZSwgbmVlZF9hY2spOwotCWJ1Zi0+d0R1cmF0aW9uX2YxID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIHBrdF90eXBlLCBuZWVkX2Fjayk7CisJYnVmLT5kdXJhdGlvbl9mMCA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBwa3RfdHlwZSwgbmVlZF9hY2spOworCWJ1Zi0+ZHVyYXRpb25fZjEgPSBzX3VHZXREYXRhRHVyYXRpb24ocHJpdiwgcGt0X3R5cGUsIG5lZWRfYWNrKTsKIAotCWJ1Zi0+d1RpbWVTdGFtcE9mZiA9IHZudF90aW1lX3N0YW1wX29mZihwcml2LCByYXRlKTsKKwlidWYtPnRpbWVfc3RhbXBfb2ZmID0gdm50X3RpbWVfc3RhbXBfb2ZmKHByaXYsIHJhdGUpOwogCi0JcmV0dXJuIGJ1Zi0+d0R1cmF0aW9uOworCXJldHVybiBsZTE2X3RvX2NwdShidWYtPmR1cmF0aW9uKTsKIH0KIAogc3RhdGljIHUxNiB2bnRfcnh0eF9kYXRhaGVhZF9hYihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsIHU4IHBrdF90eXBlLApAQCAtNTM5LDI2ICs1MzksMjcgQEAKIAkvKiBHZXQgU2lnbmFsRmllbGQsU2VydmljZUZpZWxkLExlbmd0aCAqLwogCUJCdkNhbGN1bGF0ZVBhcmFtZXRlcihwcml2LCBmcmFtZV9sZW4sIHJhdGUsIHBrdF90eXBlLCAmYnVmLT5hYik7CiAJLyogR2V0IER1cmF0aW9uIGFuZCBUaW1lU3RhbXBPZmYgKi8KLQlidWYtPndEdXJhdGlvbiA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBwa3RfdHlwZSwgbmVlZF9hY2spOworCWJ1Zi0+ZHVyYXRpb24gPSBzX3VHZXREYXRhRHVyYXRpb24ocHJpdiwgcGt0X3R5cGUsIG5lZWRfYWNrKTsKIAotCWJ1Zi0+d1RpbWVTdGFtcE9mZiA9IHZudF90aW1lX3N0YW1wX29mZihwcml2LCByYXRlKTsKKwlidWYtPnRpbWVfc3RhbXBfb2ZmID0gdm50X3RpbWVfc3RhbXBfb2ZmKHByaXYsIHJhdGUpOwogCi0JcmV0dXJuIGJ1Zi0+d0R1cmF0aW9uOworCXJldHVybiBsZTE2X3RvX2NwdShidWYtPmR1cmF0aW9uKTsKIH0KIAogc3RhdGljIGludCB2bnRfZmlsbF9pZWVlODAyMTFfcnRzKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwKIAlzdHJ1Y3QgaWVlZTgwMjExX3J0cyAqcnRzLCBzdHJ1Y3QgZXRoaGRyICpldGhfaGRyLAotCQl1MTYgZHVyYXRpb24pCisJCV9fbGUxNiBkdXJhdGlvbikKIHsKIAlydHMtPmR1cmF0aW9uID0gZHVyYXRpb247CiAJcnRzLT5mcmFtZV9jb250cm9sID0gVFlQRV9DVExfUlRTOwogCi0JaWYgKHByaXYtPmVPUE1vZGUgPT0gT1BfTU9ERV9BREhPQyB8fCBwcml2LT5lT1BNb2RlID09IE9QX01PREVfQVApCisJaWYgKHByaXYtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgfHwKKwkJCQlwcml2LT5vcF9tb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKQogCQltZW1jcHkocnRzLT5yYSwgZXRoX2hkci0+aF9kZXN0LCBFVEhfQUxFTik7CiAJZWxzZQogCQltZW1jcHkocnRzLT5yYSwgcHJpdi0+YWJ5QlNTSUQsIEVUSF9BTEVOKTsKIAotCWlmIChwcml2LT5lT1BNb2RlID09IE9QX01PREVfQVApCisJaWYgKHByaXYtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCiAJCW1lbWNweShydHMtPnRhLCBwcml2LT5hYnlCU1NJRCwgRVRIX0FMRU4pOwogCWVsc2UKIAkJbWVtY3B5KHJ0cy0+dGEsIGV0aF9oZHItPmhfc291cmNlLCBFVEhfQUxFTik7CkBAIC01NzgsMTQgKzU3OSwxNCBAQAogCUJCdkNhbGN1bGF0ZVBhcmFtZXRlcihwcml2LCBydHNfZnJhbWVfbGVuLAogCQlwcml2LT5ieVRvcE9GRE1CYXNpY1JhdGUsIHBrdF90eXBlLCAmYnVmLT5hKTsKIAotCWJ1Zi0+d0R1cmF0aW9uX2JiID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0JCLCBmcmFtZV9sZW4sCisJYnVmLT5kdXJhdGlvbl9iYiA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9CQiwgZnJhbWVfbGVuLAogCQlQS19UWVBFXzExQiwgcHJpdi0+YnlUb3BDQ0tCYXNpY1JhdGUsIG5lZWRfYWNrLCBmYl9vcHRpb24pOwotCWJ1Zi0+d0R1cmF0aW9uX2FhID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBLCBmcmFtZV9sZW4sCisJYnVmLT5kdXJhdGlvbl9hYSA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9BQSwgZnJhbWVfbGVuLAogCQlwa3RfdHlwZSwgY3VycmVudF9yYXRlLCBuZWVkX2FjaywgZmJfb3B0aW9uKTsKLQlidWYtPndEdXJhdGlvbl9iYSA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9CQSwgZnJhbWVfbGVuLAorCWJ1Zi0+ZHVyYXRpb25fYmEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQkEsIGZyYW1lX2xlbiwKIAkJcGt0X3R5cGUsIGN1cnJlbnRfcmF0ZSwgbmVlZF9hY2ssIGZiX29wdGlvbik7CiAKLQl2bnRfZmlsbF9pZWVlODAyMTFfcnRzKHByaXYsICZidWYtPmRhdGEsIGV0aF9oZHIsIGJ1Zi0+d0R1cmF0aW9uX2FhKTsKKwl2bnRfZmlsbF9pZWVlODAyMTFfcnRzKHByaXYsICZidWYtPmRhdGEsIGV0aF9oZHIsIGJ1Zi0+ZHVyYXRpb25fYWEpOwogCiAJcmV0dXJuIHZudF9yeHR4X2RhdGFoZWFkX2cocHJpdiwgcGt0X3R5cGUsIGN1cnJlbnRfcmF0ZSwKIAkJCSZidWYtPmRhdGFfaGVhZCwgZnJhbWVfbGVuLCBuZWVkX2Fjayk7CkBAIC02MDQsMjQgKzYwNSwyNCBAQAogCQlwcml2LT5ieVRvcE9GRE1CYXNpY1JhdGUsIHBrdF90eXBlLCAmYnVmLT5hKTsKIAogCi0JYnVmLT53RHVyYXRpb25fYmIgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQkIsIGZyYW1lX2xlbiwKKwlidWYtPmR1cmF0aW9uX2JiID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0JCLCBmcmFtZV9sZW4sCiAJCVBLX1RZUEVfMTFCLCBwcml2LT5ieVRvcENDS0Jhc2ljUmF0ZSwgbmVlZF9hY2ssIGZiX29wdGlvbik7Ci0JYnVmLT53RHVyYXRpb25fYWEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQUEsIGZyYW1lX2xlbiwKKwlidWYtPmR1cmF0aW9uX2FhID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBLCBmcmFtZV9sZW4sCiAJCXBrdF90eXBlLCBjdXJyZW50X3JhdGUsIG5lZWRfYWNrLCBmYl9vcHRpb24pOwotCWJ1Zi0+d0R1cmF0aW9uX2JhID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0JBLCBmcmFtZV9sZW4sCisJYnVmLT5kdXJhdGlvbl9iYSA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9CQSwgZnJhbWVfbGVuLAogCQlwa3RfdHlwZSwgY3VycmVudF9yYXRlLCBuZWVkX2FjaywgZmJfb3B0aW9uKTsKIAogCi0JYnVmLT53UlRTRHVyYXRpb25fYmFfZjAgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQkFfRjAsCisJYnVmLT5ydHNfZHVyYXRpb25fYmFfZjAgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQkFfRjAsCiAJCWZyYW1lX2xlbiwgcGt0X3R5cGUsIHByaXYtPnR4X3JhdGVfZmIwLCBuZWVkX2FjaywgZmJfb3B0aW9uKTsKLQlidWYtPndSVFNEdXJhdGlvbl9hYV9mMCA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9BQV9GMCwKKwlidWYtPnJ0c19kdXJhdGlvbl9hYV9mMCA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9BQV9GMCwKIAkJZnJhbWVfbGVuLCBwa3RfdHlwZSwgcHJpdi0+dHhfcmF0ZV9mYjAsIG5lZWRfYWNrLCBmYl9vcHRpb24pOwotCWJ1Zi0+d1JUU0R1cmF0aW9uX2JhX2YxID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0JBX0YxLAorCWJ1Zi0+cnRzX2R1cmF0aW9uX2JhX2YxID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0JBX0YxLAogCQlmcmFtZV9sZW4sIHBrdF90eXBlLCBwcml2LT50eF9yYXRlX2ZiMSwgbmVlZF9hY2ssIGZiX29wdGlvbik7Ci0JYnVmLT53UlRTRHVyYXRpb25fYWFfZjEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQUFfRjEsCisJYnVmLT5ydHNfZHVyYXRpb25fYWFfZjEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQUFfRjEsCiAJCWZyYW1lX2xlbiwgcGt0X3R5cGUsIHByaXYtPnR4X3JhdGVfZmIxLCBuZWVkX2FjaywgZmJfb3B0aW9uKTsKIAotCXZudF9maWxsX2llZWU4MDIxMV9ydHMocHJpdiwgJmJ1Zi0+ZGF0YSwgZXRoX2hkciwgYnVmLT53RHVyYXRpb25fYWEpOworCXZudF9maWxsX2llZWU4MDIxMV9ydHMocHJpdiwgJmJ1Zi0+ZGF0YSwgZXRoX2hkciwgYnVmLT5kdXJhdGlvbl9hYSk7CiAKIAlyZXR1cm4gdm50X3J4dHhfZGF0YWhlYWRfZ19mYihwcml2LCBwa3RfdHlwZSwgY3VycmVudF9yYXRlLAogCQkJJmJ1Zi0+ZGF0YV9oZWFkLCBmcmFtZV9sZW4sIG5lZWRfYWNrKTsKQEAgLTYzNywxMCArNjM4LDEwIEBACiAJQkJ2Q2FsY3VsYXRlUGFyYW1ldGVyKHByaXYsIHJ0c19mcmFtZV9sZW4sCiAJCXByaXYtPmJ5VG9wT0ZETUJhc2ljUmF0ZSwgcGt0X3R5cGUsICZidWYtPmFiKTsKIAotCWJ1Zi0+d0R1cmF0aW9uID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBLCBmcmFtZV9sZW4sCisJYnVmLT5kdXJhdGlvbiA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9BQSwgZnJhbWVfbGVuLAogCQlwa3RfdHlwZSwgY3VycmVudF9yYXRlLCBuZWVkX2FjaywgZmJfb3B0aW9uKTsKIAotCXZudF9maWxsX2llZWU4MDIxMV9ydHMocHJpdiwgJmJ1Zi0+ZGF0YSwgZXRoX2hkciwgYnVmLT53RHVyYXRpb24pOworCXZudF9maWxsX2llZWU4MDIxMV9ydHMocHJpdiwgJmJ1Zi0+ZGF0YSwgZXRoX2hkciwgYnVmLT5kdXJhdGlvbik7CiAKIAlyZXR1cm4gdm50X3J4dHhfZGF0YWhlYWRfYWIocHJpdiwgcGt0X3R5cGUsIGN1cnJlbnRfcmF0ZSwKIAkJCSZidWYtPmRhdGFfaGVhZCwgZnJhbWVfbGVuLCBuZWVkX2Fjayk7CkBAIC02NTYsMTYgKzY1NywxNiBAQAogCUJCdkNhbGN1bGF0ZVBhcmFtZXRlcihwcml2LCBydHNfZnJhbWVfbGVuLAogCQlwcml2LT5ieVRvcE9GRE1CYXNpY1JhdGUsIHBrdF90eXBlLCAmYnVmLT5hKTsKIAotCWJ1Zi0+d0R1cmF0aW9uID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBLCBmcmFtZV9sZW4sCisJYnVmLT5kdXJhdGlvbiA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9BQSwgZnJhbWVfbGVuLAogCQlwa3RfdHlwZSwgY3VycmVudF9yYXRlLCBuZWVkX2FjaywgZmJfb3B0aW9uKTsKIAotCWJ1Zi0+d1JUU0R1cmF0aW9uX2YwID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBX0YwLAorCWJ1Zi0+cnRzX2R1cmF0aW9uX2YwID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBX0YwLAogCQlmcmFtZV9sZW4sIHBrdF90eXBlLCBwcml2LT50eF9yYXRlX2ZiMCwgbmVlZF9hY2ssIGZiX29wdGlvbik7CiAKLQlidWYtPndSVFNEdXJhdGlvbl9mMSA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9BQV9GMSwKKwlidWYtPnJ0c19kdXJhdGlvbl9mMSA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9BQV9GMSwKIAkJZnJhbWVfbGVuLCBwa3RfdHlwZSwgcHJpdi0+dHhfcmF0ZV9mYjEsIG5lZWRfYWNrLCBmYl9vcHRpb24pOwogCi0Jdm50X2ZpbGxfaWVlZTgwMjExX3J0cyhwcml2LCAmYnVmLT5kYXRhLCBldGhfaGRyLCBidWYtPndEdXJhdGlvbik7CisJdm50X2ZpbGxfaWVlZTgwMjExX3J0cyhwcml2LCAmYnVmLT5kYXRhLCBldGhfaGRyLCBidWYtPmR1cmF0aW9uKTsKIAogCXJldHVybiB2bnRfcnh0eF9kYXRhaGVhZF9hX2ZiKHByaXYsIHBrdF90eXBlLCBjdXJyZW50X3JhdGUsCiAJCQkmYnVmLT5kYXRhX2hlYWQsIGZyYW1lX2xlbiwgbmVlZF9hY2spOwpAQCAtNzI3LDE5ICs3MjgsMTkgQEAKIAkJLyogR2V0IFNpZ25hbEZpZWxkLFNlcnZpY2VGaWVsZCxMZW5ndGggKi8KIAkJQkJ2Q2FsY3VsYXRlUGFyYW1ldGVyKHBEZXZpY2UsIHVDVFNGcmFtZUxlbiwKIAkJCXBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlLCBQS19UWVBFXzExQiwgJnBCdWYtPmIpOwotCQlwQnVmLT53RHVyYXRpb25fYmEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLCBDVFNEVVJfQkEsCisJCXBCdWYtPmR1cmF0aW9uX2JhID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwgQ1RTRFVSX0JBLAogCQkJY2JGcmFtZUxlbmd0aCwgYnlQa3RUeXBlLAogCQkJd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgYnlGQk9wdGlvbik7CiAJCS8qIEdldCBDVFNEdXJhdGlvbl9iYV9mMCAqLwotCQlwQnVmLT53Q1RTRHVyYXRpb25fYmFfZjAgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLAorCQlwQnVmLT5jdHNfZHVyYXRpb25fYmFfZjAgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLAogCQkJQ1RTRFVSX0JBX0YwLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsCiAJCQlwRGV2aWNlLT50eF9yYXRlX2ZiMCwgYk5lZWRBY2ssIGJ5RkJPcHRpb24pOwogCQkvKiBHZXQgQ1RTRHVyYXRpb25fYmFfZjEgKi8KLQkJcEJ1Zi0+d0NUU0R1cmF0aW9uX2JhX2YxID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwKKwkJcEJ1Zi0+Y3RzX2R1cmF0aW9uX2JhX2YxID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwKIAkJCUNUU0RVUl9CQV9GMSwgY2JGcmFtZUxlbmd0aCwgYnlQa3RUeXBlLAogCQkJcERldmljZS0+dHhfcmF0ZV9mYjEsIGJOZWVkQWNrLCBieUZCT3B0aW9uKTsKIAkJLyogR2V0IENUUyBGcmFtZSBib2R5ICovCi0JCXBCdWYtPmRhdGEuZHVyYXRpb24gPSBwQnVmLT53RHVyYXRpb25fYmE7CisJCXBCdWYtPmRhdGEuZHVyYXRpb24gPSBwQnVmLT5kdXJhdGlvbl9iYTsKIAkJcEJ1Zi0+ZGF0YS5mcmFtZV9jb250cm9sID0gVFlQRV9DVExfQ1RTOwogCQltZW1jcHkocEJ1Zi0+ZGF0YS5yYSwgcERldmljZS0+YWJ5Q3VycmVudE5ldEFkZHIsIEVUSF9BTEVOKTsKIApAQCAtNzUxLDExICs3NTIsMTEgQEAKIAkJQkJ2Q2FsY3VsYXRlUGFyYW1ldGVyKHBEZXZpY2UsIHVDVFNGcmFtZUxlbiwKIAkJCXBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlLCBQS19UWVBFXzExQiwgJnBCdWYtPmIpOwogCQkvKiBHZXQgQ1RTRHVyYXRpb25fYmEgKi8KLQkJcEJ1Zi0+d0R1cmF0aW9uX2JhID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwKKwkJcEJ1Zi0+ZHVyYXRpb25fYmEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLAogCQkJQ1RTRFVSX0JBLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsCiAJCQl3Q3VycmVudFJhdGUsIGJOZWVkQWNrLCBieUZCT3B0aW9uKTsKIAkJLypHZXQgQ1RTIEZyYW1lIGJvZHkqLwotCQlwQnVmLT5kYXRhLmR1cmF0aW9uID0gcEJ1Zi0+d0R1cmF0aW9uX2JhOworCQlwQnVmLT5kYXRhLmR1cmF0aW9uID0gcEJ1Zi0+ZHVyYXRpb25fYmE7CiAJCXBCdWYtPmRhdGEuZnJhbWVfY29udHJvbCA9IFRZUEVfQ1RMX0NUUzsKIAkJbWVtY3B5KHBCdWYtPmRhdGEucmEsIHBEZXZpY2UtPmFieUN1cnJlbnROZXRBZGRyLCBFVEhfQUxFTik7CiAKQEAgLTgxNSwxNiArODE2LDE2IEBACiAJCQlzdHJ1Y3Qgdm50X3Jydl90aW1lX3J0cyAqcEJ1ZiA9CiAJCQkJCSZ0eF9idWZmZXItPnR4X2hlYWQudHhfcnRzLnJ0czsKIAotCQkJcEJ1Zi0+d1JUU1R4UnJ2VGltZV9hYSA9IHNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMiwKKwkJCXBCdWYtPnJ0c19ycnZfdGltZV9hYSA9IHNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMiwKIAkJCQkJYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlKTsKLQkJCXBCdWYtPndSVFNUeFJydlRpbWVfYmEgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDEsCisJCQlwQnVmLT5ydHNfcnJ2X3RpbWVfYmEgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDEsCiAJCQkJCWJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSk7Ci0JCQlwQnVmLT53UlRTVHhScnZUaW1lX2JiID0gc191R2V0UlRTQ1RTUnN2VGltZShwRGV2aWNlLCAwLAorCQkJcEJ1Zi0+cnRzX3Jydl90aW1lX2JiID0gc191R2V0UlRTQ1RTUnN2VGltZShwRGV2aWNlLCAwLAogCQkJCWJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSk7CiAKLQkJCXBCdWYtPndUeFJydlRpbWVfYSA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLAorCQkJcEJ1Zi0+cnJ2X3RpbWVfYSA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLAogCQkJCWJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBQ0spOwotCQkJcEJ1Zi0+d1R4UnJ2VGltZV9iID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsCisJCQlwQnVmLT5ycnZfdGltZV9iID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsCiAJCQkJCVBLX1RZUEVfMTFCLCBjYkZyYW1lU2l6ZSwKIAkJCQkJcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUsIGJOZWVkQUNLKTsKIApAQCAtODQ1LDEzICs4NDYsMTMgQEAKIAkJCXN0cnVjdCB2bnRfcnJ2X3RpbWVfY3RzICpwQnVmID0gJnR4X2J1ZmZlci0+CiAJCQkJCQkJdHhfaGVhZC50eF9jdHMuY3RzOwogCi0JCQlwQnVmLT53VHhScnZUaW1lX2EgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwKKwkJCXBCdWYtPnJydl90aW1lX2EgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwKIAkJCQlieVBrdFR5cGUsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUsIGJOZWVkQUNLKTsKLQkJCXBCdWYtPndUeFJydlRpbWVfYiA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLAorCQkJcEJ1Zi0+cnJ2X3RpbWVfYiA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLAogCQkJCVBLX1RZUEVfMTFCLCBjYkZyYW1lU2l6ZSwKIAkJCQkJcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUsIGJOZWVkQUNLKTsKIAotCQkJcEJ1Zi0+d0NUU1R4UnJ2VGltZV9iYSA9IHNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMywKKwkJCXBCdWYtPmN0c19ycnZfdGltZV9iYSA9IHNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMywKIAkJCQkJYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlKTsKIAogCQkJaWYgKG5lZWRfbWljKSB7CkBAIC04NzksMTAgKzg4MCwxMCBAQAogCQkJc3RydWN0IHZudF9ycnZfdGltZV9hYiAqcEJ1ZiA9ICZ0eF9idWZmZXItPgogCQkJCQkJCXR4X2hlYWQudHhfYWIuYWI7CiAKLQkJCXBCdWYtPndSVFNUeFJydlRpbWUgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDIsCisJCQlwQnVmLT5ydHNfcnJ2X3RpbWUgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDIsCiAJCQkJYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlKTsKIAotCQkJcEJ1Zi0+d1R4UnJ2VGltZSA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLAorCQkJcEJ1Zi0+cnJ2X3RpbWUgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwKIAkJCQlieVBrdFR5cGUsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUsIGJOZWVkQUNLKTsKIAogCQkJLyogRmlsbCBSVFMgKi8KQEAgLTg5Myw3ICs4OTQsNyBAQAogCQkJc3RydWN0IHZudF9ycnZfdGltZV9hYiAqcEJ1ZiA9ICZ0eF9idWZmZXItPgogCQkJCQkJCXR4X2hlYWQudHhfYWIuYWI7CiAKLQkJCXBCdWYtPndUeFJydlRpbWUgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwKKwkJCXBCdWYtPnJydl90aW1lID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsCiAJCQkJUEtfVFlQRV8xMUEsIGNiRnJhbWVTaXplLAogCQkJCQl3Q3VycmVudFJhdGUsIGJOZWVkQUNLKTsKIApAQCAtOTEzLDEwICs5MTQsMTAgQEAKIAkJCXN0cnVjdCB2bnRfcnJ2X3RpbWVfYWIgKnBCdWYgPSAmdHhfYnVmZmVyLT4KIAkJCQkJCQl0eF9oZWFkLnR4X2FiLmFiOwogCi0JCQlwQnVmLT53UlRTVHhScnZUaW1lID0gc191R2V0UlRTQ1RTUnN2VGltZShwRGV2aWNlLCAwLAorCQkJcEJ1Zi0+cnRzX3Jydl90aW1lID0gc191R2V0UlRTQ1RTUnN2VGltZShwRGV2aWNlLCAwLAogCQkJCWJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSk7CiAKLQkJCXBCdWYtPndUeFJydlRpbWUgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwKKwkJCXBCdWYtPnJydl90aW1lID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsCiAJCQkJUEtfVFlQRV8xMUIsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUsCiAJCQkJCQkJCWJOZWVkQUNLKTsKIApAQCAtOTI4LDcgKzkyOSw3IEBACiAJCQlzdHJ1Y3Qgdm50X3Jydl90aW1lX2FiICpwQnVmID0gJnR4X2J1ZmZlci0+CiAJCQkJCQkJdHhfaGVhZC50eF9hYi5hYjsKIAotCQkJcEJ1Zi0+d1R4UnJ2VGltZSA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLAorCQkJcEJ1Zi0+cnJ2X3RpbWUgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwKIAkJCQlQS19UWVBFXzExQiwgY2JGcmFtZVNpemUsCiAJCQkJCXdDdXJyZW50UmF0ZSwgYk5lZWRBQ0spOwogCkBAIC05OTEsOCArOTkyLDggQEAKICAgICAvL1NldCBwYWNrZXQgdHlwZQogICAgIHBUeEJ1ZkhlYWQtPndGSUZPQ3RsIHw9ICh1MTYpKGJ5UGt0VHlwZTw8OCk7CiAKLQlpZiAoKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9BREhPQykgfHwKLQkJCShwRGV2aWNlLT5lT1BNb2RlID09IE9QX01PREVfQVApKSB7CisJaWYgKHBEZXZpY2UtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgfHwKKwkJCXBEZXZpY2UtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKIAkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBzRXRoSGVhZGVyLT5oX2Rlc3QpKSB7CiAJCQliTmVlZEFDSyA9IGZhbHNlOwogCQkJcFR4QnVmSGVhZC0+d0ZJRk9DdGwgPQpAQCAtMTI5Miw3ICsxMjkzLDcgQEAKIAogCXBNQUNIZWFkZXItPmZyYW1lX2NvbnRyb2wgPSBUWVBFXzgwMl8xMV9EQVRBOwogCi0gICAgaWYgKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9BUCkgeworICAgIGlmIChwRGV2aWNlLT5vcF9tb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKSB7CiAJbWVtY3B5KCYocE1BQ0hlYWRlci0+YWRkcjFbMF0pLAogCSAgICAgICAmKHBzRXRoSGVhZGVyLT5oX2Rlc3RbMF0pLAogCSAgICAgICBFVEhfQUxFTik7CkBAIC0xMzAyLDcgKzEzMDMsNyBAQAogCSAgICAgICBFVEhfQUxFTik7CiAgICAgICAgIHBNQUNIZWFkZXItPmZyYW1lX2NvbnRyb2wgfD0gRkNfRlJPTURTOwogICAgIH0gZWxzZSB7Ci0JaWYgKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9BREhPQykgeworCWlmIChwRGV2aWNlLT5vcF9tb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CiAJCW1lbWNweSgmKHBNQUNIZWFkZXItPmFkZHIxWzBdKSwKIAkJICAgICAgICYocHNFdGhIZWFkZXItPmhfZGVzdFswXSksCiAJCSAgICAgICBFVEhfQUxFTik7CkBAIC0xNTQxLDggKzE1NDIsOCBAQAogICAgICAgICBwYnlJVkhlYWQgPSAodTggKikocGJ5VHhCdWZmZXJBZGRyICsgY2JIZWFkZXJTaXplICsgY2JNYWNIZExlbiArIHVQYWRkaW5nKTsKICAgICAgICAgcGJ5UGF5bG9hZEhlYWQgPSAodTggKikocGJ5VHhCdWZmZXJBZGRyICsgY2JIZWFkZXJTaXplICsgY2JNYWNIZExlbiArIHVQYWRkaW5nICsgY2JJVmxlbik7CiAgICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmICgocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0lORlJBU1RSVUNUVVJFKSAmJgotICAgICAgICAgICAgICAgIChwRGV2aWNlLT5iTGlua1Bhc3MgPT0gdHJ1ZSkpIHsKKwkgICAgaWYgKHBEZXZpY2UtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgorCQkJCQlwRGV2aWNlLT5iTGlua1Bhc3MgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgIHBieUJTU0lEID0gcERldmljZS0+YWJ5QlNTSUQ7CiAgICAgICAgICAgICAgICAgLy8gZ2V0IHBhaXJ3aXNlIGtleQogICAgICAgICAgICAgICAgIGlmIChLZXliR2V0VHJhbnNtaXRLZXkoJihwRGV2aWNlLT5zS2V5KSwgcGJ5QlNTSUQsIFBBSVJXSVNFX0tFWSwgJnBUcmFuc21pdEtleSkgPT0gZmFsc2UpIHsKQEAgLTE1NjAsNyArMTU2MSw3IEBACiAgICAgICAgICAgICBwYnlCU1NJRCA9IHBEZXZpY2UtPmFieUJyb2FkY2FzdEFkZHI7CiAgICAgICAgICAgICBpZihLZXliR2V0VHJhbnNtaXRLZXkoJihwRGV2aWNlLT5zS2V5KSwgcGJ5QlNTSUQsIEdST1VQX0tFWSwgJnBUcmFuc21pdEtleSkgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICBwVHJhbnNtaXRLZXkgPSBOVUxMOwotICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iS0VZIGlzIE5VTEwuIE9QIE1vZGVbJWRdXG4iLCBwRGV2aWNlLT5lT1BNb2RlKTsKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJLRVkgaXMgTlVMTC4gT1AgTW9kZVslZF1cbiIsIHBEZXZpY2UtPm9wX21vZGUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIkdldCBHVEsuXG4iKTsKICAgICAgICAgICAgIH0KQEAgLTE1OTIsMTQgKzE1OTMsMTQgQEAKIAlpZiAoYnlQa3RUeXBlID09IFBLX1RZUEVfMTFHQiB8fCBieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdBKSB7CiAJCXN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfZyAqZGF0YV9oZWFkID0gJnBUWF9CdWZmZXItPnR4X2hlYWQuCiAJCQkJCQl0eF9jdHMudHguaGVhZC5jdHNfZy5kYXRhX2hlYWQ7Ci0JCWRhdGFfaGVhZC0+d0R1cmF0aW9uX2EgPQorCQlkYXRhX2hlYWQtPmR1cmF0aW9uX2EgPQogCQkJY3B1X3RvX2xlMTYocFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTIud0R1cmF0aW9uSUQpOwotCQlkYXRhX2hlYWQtPndEdXJhdGlvbl9iID0KKwkJZGF0YV9oZWFkLT5kdXJhdGlvbl9iID0KIAkJCWNwdV90b19sZTE2KHBQYWNrZXQtPnA4MDIxMUhlYWRlci0+c0EyLndEdXJhdGlvbklEKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3Qgdm50X3R4X2RhdGFoZWFkX2FiICpkYXRhX2hlYWQgPSAmcFRYX0J1ZmZlci0+dHhfaGVhZC4KIAkJCQkJdHhfYWIudHguaGVhZC5kYXRhX2hlYWRfYWI7Ci0JCWRhdGFfaGVhZC0+d0R1cmF0aW9uID0KKwkJZGF0YV9oZWFkLT5kdXJhdGlvbiA9CiAJCQljcHVfdG9fbGUxNihwUGFja2V0LT5wODAyMTFIZWFkZXItPnNBMi53RHVyYXRpb25JRCk7CiAJfQogICAgIH0KQEAgLTE2MDksNyArMTYxMCw3IEBACiAgICAgcFRYX0J1ZmZlci0+YnlUeXBlID0gMHgwMDsKIAogICAgIHBDb250ZXh0LT5wUGFja2V0ID0gTlVMTDsKLSAgICBwQ29udGV4dC0+VHlwZSA9IENPTlRFWFRfTUdNVF9QQUNLRVQ7CisgICAgcENvbnRleHQtPnR5cGUgPSBDT05URVhUX01HTVRfUEFDS0VUOwogICAgIHBDb250ZXh0LT51QnVmTGVuID0gKHUxNiljYlJlcUNvdW50ICsgNDsgIC8vVVNCIGhlYWRlcgogCiAgICAgaWYgKFdMQU5fR0VUX0ZDX1RPRFMocE1BQ0hlYWRlci0+ZnJhbWVfY29udHJvbCkgPT0gMCkgewpAQCAtMTcwMSw3ICsxNzAyLDcgQEAKICAgICBwVFhfQnVmZmVyLT5ieVR5cGUgPSAweDAxOwogCiAgICAgcENvbnRleHQtPnBQYWNrZXQgPSBOVUxMOwotICAgIHBDb250ZXh0LT5UeXBlID0gQ09OVEVYVF9NR01UX1BBQ0tFVDsKKyAgICBwQ29udGV4dC0+dHlwZSA9IENPTlRFWFRfTUdNVF9QQUNLRVQ7CiAgICAgcENvbnRleHQtPnVCdWZMZW4gPSAodTE2KWNiUmVxQ291bnQgKyA0OyAgLy9VU0IgaGVhZGVyCiAKICAgICBQSVBFbnNTZW5kQnVsa091dChwRGV2aWNlLHBDb250ZXh0KTsKQEAgLTIwMzIsMTQgKzIwMzMsMTQgQEAKIAlpZiAoYnlQa3RUeXBlID09IFBLX1RZUEVfMTFHQiB8fCBieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdBKSB7CiAJCXN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfZyAqZGF0YV9oZWFkID0gJnBUWF9CdWZmZXItPnR4X2hlYWQuCiAJCQkJCQl0eF9jdHMudHguaGVhZC5jdHNfZy5kYXRhX2hlYWQ7Ci0JCWRhdGFfaGVhZC0+d0R1cmF0aW9uX2EgPQorCQlkYXRhX2hlYWQtPmR1cmF0aW9uX2EgPQogCQkJY3B1X3RvX2xlMTYocDgwMjExSGVhZGVyLT5zQTIud0R1cmF0aW9uSUQpOwotCQlkYXRhX2hlYWQtPndEdXJhdGlvbl9iID0KKwkJZGF0YV9oZWFkLT5kdXJhdGlvbl9iID0KIAkJCWNwdV90b19sZTE2KHA4MDIxMUhlYWRlci0+c0EyLndEdXJhdGlvbklEKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3Qgdm50X3R4X2RhdGFoZWFkX2FiICpkYXRhX2hlYWQgPSAmcFRYX0J1ZmZlci0+dHhfaGVhZC4KIAkJCQkJdHhfYWIudHguaGVhZC5kYXRhX2hlYWRfYWI7Ci0JCWRhdGFfaGVhZC0+d0R1cmF0aW9uID0KKwkJZGF0YV9oZWFkLT5kdXJhdGlvbiA9CiAJCQljcHVfdG9fbGUxNihwODAyMTFIZWFkZXItPnNBMi53RHVyYXRpb25JRCk7CiAJfQogICAgIH0KQEAgLTIwNDksNyArMjA1MCw3IEBACiAgICAgcFRYX0J1ZmZlci0+YnlUeXBlID0gMHgwMDsKIAogICAgIHBDb250ZXh0LT5wUGFja2V0ID0gc2tiOwotICAgIHBDb250ZXh0LT5UeXBlID0gQ09OVEVYVF9NR01UX1BBQ0tFVDsKKyAgICBwQ29udGV4dC0+dHlwZSA9IENPTlRFWFRfTUdNVF9QQUNLRVQ7CiAgICAgcENvbnRleHQtPnVCdWZMZW4gPSAodTE2KWNiUmVxQ291bnQgKyA0OyAgLy9VU0IgaGVhZGVyCiAKICAgICBpZiAoV0xBTl9HRVRfRkNfVE9EUyhwTUFDSGVhZGVyLT5mcmFtZV9jb250cm9sKSA9PSAwKSB7CkBAIC0yMzA1LDcgKzIzMDYsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBpZiAocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0FESE9DKSB7CisJaWYgKHBEZXZpY2UtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKICAgICAgICAgICAgIC8vIEFkaG9jIFR4IHJhdGUgZGVjaWRlZCBmcm9tIG5vZGUgREIKIAkgICAgaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBEZXZpY2UtPnNUeEV0aEhlYWRlci5oX2Rlc3QpKSB7CiAgICAgICAgICAgICAgICAgLy8gTXVsdGljYXN0IHVzZSBoaWdoZXN0IGRhdGEgcmF0ZQpAQCAtMjMzNiw3ICsyMzM3LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9JTkZSQVNUUlVDVFVSRSkgeworCWlmIChwRGV2aWNlLT5vcF9tb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKICAgICAgICAgICAgIC8vIEluZnJhIFNUQSByYXRlIGRlY2lkZWQgZnJvbSBBUCBOb2RlLCBpbmRleCA9IDAKICAgICAgICAgICAgIHBEZXZpY2UtPndDdXJyZW50UmF0ZSA9IHBNZ210LT5zTm9kZURCVGFibGVbMF0ud1R4RGF0YVJhdGU7CiAgICAgICAgIH0KQEAgLTI0MzksMTEgKzI0NDAsMTEgQEAKICAgICBwVFhfQnVmZmVyLT53VHhCeXRlQ291bnQgPSAodTE2KUJ5dGVzVG9Xcml0ZTsKIAogICAgIHBDb250ZXh0LT5wUGFja2V0ID0gc2tiOwotICAgIHBDb250ZXh0LT5UeXBlID0gQ09OVEVYVF9EQVRBX1BBQ0tFVDsKKyAgICBwQ29udGV4dC0+dHlwZSA9IENPTlRFWFRfREFUQV9QQUNLRVQ7CiAgICAgcENvbnRleHQtPnVCdWZMZW4gPSAodTE2KUJ5dGVzVG9Xcml0ZSArIDQgOyAvL1VTQiBoZWFkZXIKIAogICAgIHNfdlNhdmVUeFBrdEluZm8ocERldmljZSwgKHU4KShwVFhfQnVmZmVyLT5ieVBLVE5PICYgMHgwRiksCi0JCQkmcENvbnRleHQtPnNFdGhIZWFkZXIuaF9kZXN0WzBdLAorCQkJJnBEZXZpY2UtPnNUeEV0aEhlYWRlci5oX2Rlc3RbMF0sCiAJCQkodTE2KShCeXRlc1RvV3JpdGUtdUhlYWRlckxlbiksCiAJCQlwVFhfQnVmZmVyLT5maWZvX2hlYWQud0ZJRk9DdGwpOwogCkBAIC0yNTkzLDExICsyNTk0LDExIEBACiAgICAgcFRYX0J1ZmZlci0+d1R4Qnl0ZUNvdW50ID0gKHUxNilCeXRlc1RvV3JpdGU7CiAKICAgICBwQ29udGV4dC0+cFBhY2tldCA9IE5VTEw7Ci0gICAgcENvbnRleHQtPlR5cGUgPSBDT05URVhUX0RBVEFfUEFDS0VUOworICAgIHBDb250ZXh0LT50eXBlID0gQ09OVEVYVF9EQVRBX1BBQ0tFVDsKICAgICBwQ29udGV4dC0+dUJ1ZkxlbiA9ICh1MTYpQnl0ZXNUb1dyaXRlICsgNCA7IC8vVVNCIGhlYWRlcgogCiAgICAgc192U2F2ZVR4UGt0SW5mbyhwRGV2aWNlLCAodTgpKHBUWF9CdWZmZXItPmJ5UEtUTk8gJiAweDBGKSwKLQkJJnBDb250ZXh0LT5zRXRoSGVhZGVyLmhfZGVzdFswXSwKKwkJJnBEZXZpY2UtPnNUeEV0aEhlYWRlci5oX2Rlc3RbMF0sCiAJCSh1MTYpKEJ5dGVzVG9Xcml0ZSAtIHVIZWFkZXJMZW4pLAogCQlwVFhfQnVmZmVyLT5maWZvX2hlYWQud0ZJRk9DdGwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5oCmluZGV4IGIzZWU2ZDAuLjZkNjUzOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5oCkBAIC01Myw2OCArNTMsNjggQEAKIAogLyogUnN2VGltZSBidWZmZXIgaGVhZGVyICovCiBzdHJ1Y3Qgdm50X3Jydl90aW1lX3J0cyB7Ci0JdTE2IHdSVFNUeFJydlRpbWVfYmE7Ci0JdTE2IHdSVFNUeFJydlRpbWVfYWE7Ci0JdTE2IHdSVFNUeFJydlRpbWVfYmI7CisJX19sZTE2IHJ0c19ycnZfdGltZV9iYTsKKwlfX2xlMTYgcnRzX3Jydl90aW1lX2FhOworCV9fbGUxNiBydHNfcnJ2X3RpbWVfYmI7CiAJdTE2IHdSZXNlcnZlZDsKLQl1MTYgd1R4UnJ2VGltZV9iOwotCXUxNiB3VHhScnZUaW1lX2E7CisJX19sZTE2IHJydl90aW1lX2I7CisJX19sZTE2IHJydl90aW1lX2E7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgdm50X3Jydl90aW1lX2N0cyB7Ci0JdTE2IHdDVFNUeFJydlRpbWVfYmE7CisJX19sZTE2IGN0c19ycnZfdGltZV9iYTsKIAl1MTYgd1Jlc2VydmVkOwotCXUxNiB3VHhScnZUaW1lX2I7Ci0JdTE2IHdUeFJydlRpbWVfYTsKKwlfX2xlMTYgcnJ2X3RpbWVfYjsKKwlfX2xlMTYgcnJ2X3RpbWVfYTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCB2bnRfcnJ2X3RpbWVfYWIgewotCXUxNiB3UlRTVHhScnZUaW1lOwotCXUxNiB3VHhScnZUaW1lOworCV9fbGUxNiBydHNfcnJ2X3RpbWU7CisJX19sZTE2IHJydl90aW1lOwogfSBfX3BhY2tlZDsKIAogLyogVFggZGF0YSBoZWFkZXIgKi8KIHN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfZyB7CiAJc3RydWN0IHZudF9waHlfZmllbGQgYjsKIAlzdHJ1Y3Qgdm50X3BoeV9maWVsZCBhOwotCXUxNiB3RHVyYXRpb25fYjsKLQl1MTYgd0R1cmF0aW9uX2E7Ci0JdTE2IHdUaW1lU3RhbXBPZmZfYjsKLQl1MTYgd1RpbWVTdGFtcE9mZl9hOworCV9fbGUxNiBkdXJhdGlvbl9iOworCV9fbGUxNiBkdXJhdGlvbl9hOworCV9fbGUxNiB0aW1lX3N0YW1wX29mZl9iOworCV9fbGUxNiB0aW1lX3N0YW1wX29mZl9hOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHZudF90eF9kYXRhaGVhZF9nX2ZiIHsKIAlzdHJ1Y3Qgdm50X3BoeV9maWVsZCBiOwogCXN0cnVjdCB2bnRfcGh5X2ZpZWxkIGE7Ci0JdTE2IHdEdXJhdGlvbl9iOwotCXUxNiB3RHVyYXRpb25fYTsKLQl1MTYgd0R1cmF0aW9uX2FfZjA7Ci0JdTE2IHdEdXJhdGlvbl9hX2YxOwotCXUxNiB3VGltZVN0YW1wT2ZmX2I7Ci0JdTE2IHdUaW1lU3RhbXBPZmZfYTsKKwlfX2xlMTYgZHVyYXRpb25fYjsKKwlfX2xlMTYgZHVyYXRpb25fYTsKKwlfX2xlMTYgZHVyYXRpb25fYV9mMDsKKwlfX2xlMTYgZHVyYXRpb25fYV9mMTsKKwlfX2xlMTYgdGltZV9zdGFtcF9vZmZfYjsKKwlfX2xlMTYgdGltZV9zdGFtcF9vZmZfYTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfYWIgewogCXN0cnVjdCB2bnRfcGh5X2ZpZWxkIGFiOwotCXUxNiB3RHVyYXRpb247Ci0JdTE2IHdUaW1lU3RhbXBPZmY7CisJX19sZTE2IGR1cmF0aW9uOworCV9fbGUxNiB0aW1lX3N0YW1wX29mZjsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfYV9mYiB7CiAJc3RydWN0IHZudF9waHlfZmllbGQgYTsKLQl1MTYgd0R1cmF0aW9uOwotCXUxNiB3VGltZVN0YW1wT2ZmOwotCXUxNiB3RHVyYXRpb25fZjA7Ci0JdTE2IHdEdXJhdGlvbl9mMTsKKwlfX2xlMTYgZHVyYXRpb247CisJX19sZTE2IHRpbWVfc3RhbXBfb2ZmOworCV9fbGUxNiBkdXJhdGlvbl9mMDsKKwlfX2xlMTYgZHVyYXRpb25fZjE7CiB9IF9fcGFja2VkOwogCiAvKiBSVFMgYnVmZmVyIGhlYWRlciAqLwogc3RydWN0IHZudF9ydHNfZyB7CiAJc3RydWN0IHZudF9waHlfZmllbGQgYjsKIAlzdHJ1Y3Qgdm50X3BoeV9maWVsZCBhOwotCXUxNiB3RHVyYXRpb25fYmE7Ci0JdTE2IHdEdXJhdGlvbl9hYTsKLQl1MTYgd0R1cmF0aW9uX2JiOworCV9fbGUxNiBkdXJhdGlvbl9iYTsKKwlfX2xlMTYgZHVyYXRpb25fYWE7CisJX19sZTE2IGR1cmF0aW9uX2JiOwogCXUxNiB3UmVzZXJ2ZWQ7CiAJc3RydWN0IGllZWU4MDIxMV9ydHMgZGF0YTsKIAlzdHJ1Y3Qgdm50X3R4X2RhdGFoZWFkX2cgZGF0YV9oZWFkOwpAQCAtMTIzLDIxICsxMjMsMjEgQEAKIHN0cnVjdCB2bnRfcnRzX2dfZmIgewogCXN0cnVjdCB2bnRfcGh5X2ZpZWxkIGI7CiAJc3RydWN0IHZudF9waHlfZmllbGQgYTsKLQl1MTYgd0R1cmF0aW9uX2JhOwotCXUxNiB3RHVyYXRpb25fYWE7Ci0JdTE2IHdEdXJhdGlvbl9iYjsKKwlfX2xlMTYgZHVyYXRpb25fYmE7CisJX19sZTE2IGR1cmF0aW9uX2FhOworCV9fbGUxNiBkdXJhdGlvbl9iYjsKIAl1MTYgd1Jlc2VydmVkOwotCXUxNiB3UlRTRHVyYXRpb25fYmFfZjA7Ci0JdTE2IHdSVFNEdXJhdGlvbl9hYV9mMDsKLQl1MTYgd1JUU0R1cmF0aW9uX2JhX2YxOwotCXUxNiB3UlRTRHVyYXRpb25fYWFfZjE7CisJX19sZTE2IHJ0c19kdXJhdGlvbl9iYV9mMDsKKwlfX2xlMTYgcnRzX2R1cmF0aW9uX2FhX2YwOworCV9fbGUxNiBydHNfZHVyYXRpb25fYmFfZjE7CisJX19sZTE2IHJ0c19kdXJhdGlvbl9hYV9mMTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J0cyBkYXRhOwogCXN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfZ19mYiBkYXRhX2hlYWQ7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgdm50X3J0c19hYiB7CiAJc3RydWN0IHZudF9waHlfZmllbGQgYWI7Ci0JdTE2IHdEdXJhdGlvbjsKKwlfX2xlMTYgZHVyYXRpb247CiAJdTE2IHdSZXNlcnZlZDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J0cyBkYXRhOwogCXN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfYWIgZGF0YV9oZWFkOwpAQCAtMTQ1LDEwICsxNDUsMTAgQEAKIAogc3RydWN0IHZudF9ydHNfYV9mYiB7CiAJc3RydWN0IHZudF9waHlfZmllbGQgYTsKLQl1MTYgd0R1cmF0aW9uOworCV9fbGUxNiBkdXJhdGlvbjsKIAl1MTYgd1Jlc2VydmVkOwotCXUxNiB3UlRTRHVyYXRpb25fZjA7Ci0JdTE2IHdSVFNEdXJhdGlvbl9mMTsKKwlfX2xlMTYgcnRzX2R1cmF0aW9uX2YwOworCV9fbGUxNiBydHNfZHVyYXRpb25fZjE7CiAJc3RydWN0IGllZWU4MDIxMV9ydHMgZGF0YTsKIAlzdHJ1Y3Qgdm50X3R4X2RhdGFoZWFkX2FfZmIgZGF0YV9oZWFkOwogfSBfX3BhY2tlZDsKQEAgLTE1Niw3ICsxNTYsNyBAQAogLyogQ1RTIGJ1ZmZlciBoZWFkZXIgKi8KIHN0cnVjdCB2bnRfY3RzIHsKIAlzdHJ1Y3Qgdm50X3BoeV9maWVsZCBiOwotCXUxNiB3RHVyYXRpb25fYmE7CisJX19sZTE2IGR1cmF0aW9uX2JhOwogCXUxNiB3UmVzZXJ2ZWQ7CiAJc3RydWN0IGllZWU4MDIxMV9jdHMgZGF0YTsKIAl1MTYgcmVzZXJ2ZWQyOwpAQCAtMTY1LDEwICsxNjUsMTAgQEAKIAogc3RydWN0IHZudF9jdHNfZmIgewogCXN0cnVjdCB2bnRfcGh5X2ZpZWxkIGI7Ci0JdTE2IHdEdXJhdGlvbl9iYTsKKwlfX2xlMTYgZHVyYXRpb25fYmE7CiAJdTE2IHdSZXNlcnZlZDsKLQl1MTYgd0NUU0R1cmF0aW9uX2JhX2YwOwotCXUxNiB3Q1RTRHVyYXRpb25fYmFfZjE7CisJX19sZTE2IGN0c19kdXJhdGlvbl9iYV9mMDsKKwlfX2xlMTYgY3RzX2R1cmF0aW9uX2JhX2YxOwogCXN0cnVjdCBpZWVlODAyMTFfY3RzIGRhdGE7CiAJdTE2IHJlc2VydmVkMjsKIAlzdHJ1Y3Qgdm50X3R4X2RhdGFoZWFkX2dfZmIgZGF0YV9oZWFkOwpAQCAtMjM0LDggKzIzNCw4IEBACiAJdTE2IGZpZm9fY3RsOwogCXUxNiB0aW1lX3N0YW1wOwogCXN0cnVjdCB2bnRfcGh5X2ZpZWxkIGFiOwotCXUxNiBkdXJhdGlvbjsKLQl1MTYgdGltZV9zdGFtcF9vZmY7CisJX19sZTE2IGR1cmF0aW9uOworCV9fbGUxNiB0aW1lX3N0YW1wX29mZjsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCB2bnRfYmVhY29uX2J1ZmZlciB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3VzYnBpcGUuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvdXNicGlwZS5jCmluZGV4IDAxY2YwOTkuLmM1ODM4ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvdXNicGlwZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvdXNicGlwZS5jCkBAIC0xMDUsNiArMTA1LDggQEAKIAogaW50IFBJUEVuc0NvbnRyb2xPdXQoc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLCB1OCBieVJlcXVlc3QsIHUxNiB3VmFsdWUsCiAJCXUxNiB3SW5kZXgsIHUxNiB3TGVuZ3RoLCB1OCAqcGJ5QnVmZmVyKQorCQlfX3JlbGVhc2VzKCZwRGV2aWNlLT5sb2NrKQorCQlfX2FjcXVpcmVzKCZwRGV2aWNlLT5sb2NrKQogewogCWludCBudFN0YXR1cyA9IDA7CiAJaW50IGlpOwpAQCAtMTY3LDYgKzE2OSw4IEBACiAKIGludCBQSVBFbnNDb250cm9sSW4oc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLCB1OCBieVJlcXVlc3QsIHUxNiB3VmFsdWUsCiAJdTE2IHdJbmRleCwgdTE2IHdMZW5ndGgsICB1OCAqcGJ5QnVmZmVyKQorCV9fcmVsZWFzZXMoJnBEZXZpY2UtPmxvY2spCisJX19hY3F1aXJlcygmcERldmljZS0+bG9jaykKIHsKIAlpbnQgbnRTdGF0dXMgPSAwOwogCWludCBpaTsKQEAgLTI5NSw0MCArMjk5LDM4IEBACiAgKgogICovCiAKLWludCBQSVBFbnNJbnRlcnJ1cHRSZWFkKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSkKK2ludCBQSVBFbnNJbnRlcnJ1cHRSZWFkKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdikKIHsKLQlpbnQgbnRTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKwlpbnQgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIi0tLS0+c19uc1N0YXJ0SW50ZXJydXB0VXNiUmVhZCgpXG4iKTsKKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPCisJCQkiLS0tLT5zX25zU3RhcnRJbnRlcnJ1cHRVc2JSZWFkKClcbiIpOwogCi0gICAgaWYocERldmljZS0+aW50QnVmLmJJblVzZSA9PSB0cnVlKXsKLSAgICAgICAgcmV0dXJuIChTVEFUVVNfRkFJTFVSRSk7Ci0gICAgfQotICAgIHBEZXZpY2UtPmludEJ1Zi5iSW5Vc2UgPSB0cnVlOwotLy8gICAgcERldmljZS0+YkV2ZW50QXZhaWxhYmxlID0gZmFsc2U7Ci0gICAgcERldmljZS0+dWxJbnRJblBvc3RlZCsrOworCWlmIChwcml2LT5pbnRfYnVmLmluX3VzZSA9PSB0cnVlKQorCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CiAKLSAgICAvLwotICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgY3JlYXRlZCB0aGUgdXJiLCB3ZSB3aWxsIHNlbmQgYQotICAgIC8vIHJlcXVlc3QgdG8gdGhlIFVTQiBkZXZpY2Ugb2JqZWN0LgotICAgIC8vCi0gICAgcERldmljZS0+cEludGVycnVwdFVSQi0+aW50ZXJ2YWwgPSBwRGV2aWNlLT5pbnRfaW50ZXJ2YWw7CisJcHJpdi0+aW50X2J1Zi5pbl91c2UgPSB0cnVlOwogCi11c2JfZmlsbF9idWxrX3VyYihwRGV2aWNlLT5wSW50ZXJydXB0VVJCLAotCQlwRGV2aWNlLT51c2IsCi0JCXVzYl9yY3ZidWxrcGlwZShwRGV2aWNlLT51c2IsIDEpLAotCQkodm9pZCAqKSBwRGV2aWNlLT5pbnRCdWYucERhdGFCdWYsCisJdXNiX2ZpbGxfaW50X3VyYihwcml2LT5wSW50ZXJydXB0VVJCLAorCQlwcml2LT51c2IsCisJCXVzYl9yY3ZpbnRwaXBlKHByaXYtPnVzYiwgMSksCisJCXByaXYtPmludF9idWYuZGF0YV9idWYsCiAJCU1BWF9JTlRFUlJVUFRfU0laRSwKIAkJc19uc0ludGVycnVwdFVzYklvQ29tcGxldGVSZWFkLAotCQlwRGV2aWNlKTsKKwkJcHJpdiwKKwkJcHJpdi0+aW50X2ludGVydmFsKTsKIAotCW50U3RhdHVzID0gdXNiX3N1Ym1pdF91cmIocERldmljZS0+cEludGVycnVwdFVSQiwgR0ZQX0FUT01JQyk7Ci0JaWYgKG50U3RhdHVzICE9IDApIHsKLQkgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJTdWJtaXQgaW50IFVSQiBmYWlsZWQgJWRcbiIsIG50U3RhdHVzKTsKLSAgICB9CisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIocHJpdi0+cEludGVycnVwdFVSQiwgR0ZQX0FUT01JQyk7CisJaWYgKHN0YXR1cykgeworCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPCisJCQkiU3VibWl0IGludCBVUkIgZmFpbGVkICVkXG4iLCBzdGF0dXMpOworCQlwcml2LT5pbnRfYnVmLmluX3VzZSA9IGZhbHNlOworCX0KIAotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iPC0tLS1zX25zU3RhcnRJbnRlcnJ1cHRVc2JSZWFkIFJldHVybigleClcbiIsbnRTdGF0dXMpOwotICAgIHJldHVybiBudFN0YXR1czsKKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPCisJCSI8LS0tLXNfbnNTdGFydEludGVycnVwdFVzYlJlYWQgUmV0dXJuKCV4KVxuIiwgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCkBAIC0zNDgsNjcgKzM1MCw0OCBAQAogCiBzdGF0aWMgdm9pZCBzX25zSW50ZXJydXB0VXNiSW9Db21wbGV0ZVJlYWQoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSA9IChzdHJ1Y3Qgdm50X3ByaXZhdGUgKil1cmItPmNvbnRleHQ7Ci0JaW50IG50U3RhdHVzOworCXN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiA9IHVyYi0+Y29udGV4dDsKKwlpbnQgc3RhdHVzOwogCi0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyItLS0tPnNfbnNJbnRlcnJ1cHRVc2JJb0NvbXBsZXRlUmVhZFxuIik7Ci0gICAgLy8KLSAgICAvLyBUaGUgY29udGV4dCBnaXZlbiB0byBJb1NldENvbXBsZXRpb25Sb3V0aW5lIGlzIHRoZSByZWNlaXZlIGJ1ZmZlciBvYmplY3QKLSAgICAvLworCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8KKwkJCSItLS0tPnNfbnNJbnRlcnJ1cHRVc2JJb0NvbXBsZXRlUmVhZFxuIik7CiAKLSAgICAvLwotICAgIC8vIFdlIGhhdmUgYSBudW1iZXIgb2YgY2FzZXM6Ci0gICAgLy8gICAgICAxKSBUaGUgVVNCIHJlYWQgdGltZWQgb3V0IGFuZCB3ZSByZWNlaXZlZCBubyBkYXRhLgotICAgIC8vICAgICAgMikgVGhlIFVTQiByZWFkIHRpbWVkIG91dCBhbmQgd2UgcmVjZWl2ZWQgc29tZSBkYXRhLgotICAgIC8vICAgICAgMykgVGhlIFVTQiByZWFkIHdhcyBzdWNjZXNzZnVsIGFuZCBmdWxseSBmaWxsZWQgb3VyIGlycCBidWZmZXIuCi0gICAgLy8gICAgICA0KSBUaGUgaXJwIHdhcyBjYW5jZWxsZWQuCi0gICAgLy8gICAgICA1KSBTb21lIG90aGVyIGZhaWx1cmUgZnJvbSB0aGUgVVNCIGRldmljZSBvYmplY3QuCi0gICAgLy8KLSAgICBudFN0YXR1cyA9IHVyYi0+c3RhdHVzOworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJY2FzZSAtRVRJTUVET1VUOgorCQlicmVhazsKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCXByaXYtPmludF9idWYuaW5fdXNlID0gZmFsc2U7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiAKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPInNfbnNJbnRlcnJ1cHRVc2JJb0NvbXBsZXRlUmVhZCBTdGF0dXMgJWRcbiIsIG50U3RhdHVzKTsKKwlzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotICAgIC8vIGlmIHdlIHdlcmUgbm90IHN1Y2Nlc3NmdWwsIHdlIG5lZWQgdG8gZnJlZSB0aGUgaW50IGJ1ZmZlciBmb3IgZnV0dXJlIHVzZSByaWdodCBoZXJlCi0gICAgLy8gb3RoZXJ3aXNlIGludGVycnVwdCBkYXRhIGhhbmRsZXIgd2lsbCBmcmVlIGludCBidWZmZXIgYWZ0ZXIgaXQgaGFuZGxlIGl0LgotICAgIGlmICgoIG50U3RhdHVzICE9IFNUQVRVU19TVUNDRVNTICkpIHsKLSAgICAgICAgcERldmljZS0+dWxCdWxrSW5FcnJvcisrOwotICAgICAgICBwRGV2aWNlLT5pbnRCdWYuYkluVXNlID0gZmFsc2U7CisJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTworCQkic19uc0ludGVycnVwdFVzYklvQ29tcGxldGVSZWFkIFN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKIAotLy8gICAgICAgIGlmIChudFN0YXR1cyA9PSBVU0JEX1NUQVRVU19DUkMpIHsKLS8vICAgICAgICAgICAgcERldmljZS0+dWxJbnRJbkNvbnRDUkNFcnJvcisrOwotLy8gICAgICAgIH0KKwlpZiAoc3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXByaXYtPmludF9idWYuaW5fdXNlID0gZmFsc2U7CiAKLS8vICAgICAgICBpZiAobnRTdGF0dXMgPT0gU1RBVFVTX05PVF9DT05ORUNURUQgKQotLy8gICAgICAgIHsKLSAgICAgICAgICAgIHBEZXZpY2UtPmZLaWxsRXZlbnRQb2xsaW5nVGhyZWFkID0gdHJ1ZTsKLS8vICAgICAgICB9Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iSW50VVNCSW9Db21wbGV0ZUNvbnRyb2wgU1RBVFVTID0gJWRcbiIsIG50U3RhdHVzICk7Ci0gICAgfSBlbHNlIHsKLQkgICAgcERldmljZS0+dWxJbnRJbkJ5dGVzUmVhZCArPSAodW5zaWduZWQgbG9uZykgdXJiLT5hY3R1YWxfbGVuZ3RoOwotCSAgICBwRGV2aWNlLT51bEludEluQ29udENSQ0Vycm9yID0gMDsKLQkgICAgcERldmljZS0+YkV2ZW50QXZhaWxhYmxlID0gdHJ1ZTsKLQkgICAgSU5UbnNQcm9jZXNzRGF0YShwRGV2aWNlKTsKLSAgICB9CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8KKwkJCSJJbnRVU0JJb0NvbXBsZXRlQ29udHJvbCBTVEFUVVMgPSAlZFxuIiwgc3RhdHVzKTsKKwl9IGVsc2UgeworCQlJTlRuc1Byb2Nlc3NEYXRhKHByaXYpOworCX0KIAotICAgIGlmIChwRGV2aWNlLT5mS2lsbEV2ZW50UG9sbGluZ1RocmVhZCAhPSB0cnVlKSB7Ci0gICAgICAgdXNiX2ZpbGxfYnVsa191cmIocERldmljZS0+cEludGVycnVwdFVSQiwKLQkJICAgICAgcERldmljZS0+dXNiLAotCQkgICAgICB1c2JfcmN2YnVsa3BpcGUocERldmljZS0+dXNiLCAxKSwKLQkJICAgICAodm9pZCAqKSBwRGV2aWNlLT5pbnRCdWYucERhdGFCdWYsCi0JCSAgICAgTUFYX0lOVEVSUlVQVF9TSVpFLAotCQkgICAgIHNfbnNJbnRlcnJ1cHRVc2JJb0NvbXBsZXRlUmVhZCwKLQkJICAgICBwRGV2aWNlKTsKKwlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihwcml2LT5wSW50ZXJydXB0VVJCLCBHRlBfQVRPTUlDKTsKKwlpZiAoc3RhdHVzKSB7CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8KKwkJCSJTdWJtaXQgaW50IFVSQiBmYWlsZWQgJWRcbiIsIHN0YXR1cyk7CisJfSBlbHNlIHsKKwkJcHJpdi0+aW50X2J1Zi5pbl91c2UgPSB0cnVlOworCX0KIAotCW50U3RhdHVzID0gdXNiX3N1Ym1pdF91cmIocERldmljZS0+cEludGVycnVwdFVSQiwgR0ZQX0FUT01JQyk7Ci0JaWYgKG50U3RhdHVzICE9IDApIHsKLQkgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJTdWJtaXQgaW50IFVSQiBmYWlsZWQgJWRcbiIsIG50U3RhdHVzKTsKLSAgICAgICAgICAgfQotICAgIH0KLSAgICAvLwotICAgIC8vIFdlIHJldHVybiBTVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVEIHNvIHRoYXQgdGhlIGNvbXBsZXRpb24KLSAgICAvLyByb3V0aW5lIChJb2ZDb21wbGV0ZVJlcXVlc3QpIHdpbGwgc3RvcCB3b3JraW5nIG9uIHRoZSBpcnAuCi0gICAgLy8KLSAgICByZXR1cm4gOworCXJldHVybjsKIH0KIAogLyoKQEAgLTQyNSw0NSArNDA4LDQxIEBACiAgKgogICovCiAKLWludCBQSVBFbnNCdWxrSW5Vc2JSZWFkKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSwgc3RydWN0IHZudF9yY2IgKnBSQ0IpCitpbnQgUElQRW5zQnVsa0luVXNiUmVhZChzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsIHN0cnVjdCB2bnRfcmNiICpyY2IpCiB7Ci0JaW50IG50U3RhdHVzID0gMDsKLQlzdHJ1Y3QgdXJiICpwVXJiOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCB1cmIgKnVyYjsKIAotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5zX25zU3RhcnRCdWxrSW5Vc2JSZWFkXG4iKTsKKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIi0tLS0+c19uc1N0YXJ0QnVsa0luVXNiUmVhZFxuIik7CiAKLSAgICBpZiAocERldmljZS0+RmxhZ3MgJiBmTVBfRElTQ09OTkVDVEVEKQotICAgICAgICByZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CisJaWYgKHByaXYtPkZsYWdzICYgZk1QX0RJU0NPTk5FQ1RFRCkKKwkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwogCi0gICAgcERldmljZS0+dWxCdWxrSW5Qb3N0ZWQrKzsKKwl1cmIgPSByY2ItPnBVcmI7CisJaWYgKHJjYi0+c2tiID09IE5VTEwpIHsKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJyY2ItPnNrYiBpcyBudWxsXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CiAKLQlwVXJiID0gcFJDQi0+cFVyYjsKLSAgICAvLwotICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgY3JlYXRlZCB0aGUgdXJiLCB3ZSB3aWxsIHNlbmQgYQotICAgIC8vIHJlcXVlc3QgdG8gdGhlIFVTQiBkZXZpY2Ugb2JqZWN0LgotICAgIC8vCi0gICAgaWYgKHBSQ0ItPnNrYiA9PSBOVUxMKSB7Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8icFJDQi0+c2tiIGlzIG51bGwgXG4iKTsKLSAgICAgICAgcmV0dXJuIG50U3RhdHVzOwotICAgIH0KLQotCXVzYl9maWxsX2J1bGtfdXJiKHBVcmIsCi0JCXBEZXZpY2UtPnVzYiwKLQkJdXNiX3JjdmJ1bGtwaXBlKHBEZXZpY2UtPnVzYiwgMiksCi0JCSh2b2lkICopIChwUkNCLT5za2ItPmRhdGEpLAorCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwKKwkJcHJpdi0+dXNiLAorCQl1c2JfcmN2YnVsa3BpcGUocHJpdi0+dXNiLCAyKSwKKwkJKHZvaWQgKikgKHJjYi0+c2tiLT5kYXRhKSwKIAkJTUFYX1RPVEFMX1NJWkVfV0lUSF9BTExfSEVBREVSUywKIAkJc19uc0J1bGtJblVzYklvQ29tcGxldGVSZWFkLAotCQlwUkNCKTsKKwkJcmNiKTsKIAotCW50U3RhdHVzID0gdXNiX3N1Ym1pdF91cmIocFVyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKG50U3RhdHVzICE9IDApIHsKLQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJTdWJtaXQgUnggVVJCIGZhaWxlZCAlZFxuIiwgbnRTdGF0dXMpOworCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8KKwkJCQkiU3VibWl0IFJ4IFVSQiBmYWlsZWQgJWRcbiIsIHN0YXR1cyk7CiAJCXJldHVybiBTVEFUVVNfRkFJTFVSRSA7CiAJfQotICAgIHBSQ0ItPlJlZiA9IDE7Ci0gICAgcFJDQi0+YkJvb2xJblVzZT0gdHJ1ZTsKIAotICAgIHJldHVybiBudFN0YXR1czsKKwlyY2ItPlJlZiA9IDE7CisJcmNiLT5iQm9vbEluVXNlID0gdHJ1ZTsKKworCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCkBAIC00ODMsNTEgKzQ2Miw0NyBAQAogCiBzdGF0aWMgdm9pZCBzX25zQnVsa0luVXNiSW9Db21wbGV0ZVJlYWQoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB2bnRfcmNiICpwUkNCID0gKHN0cnVjdCB2bnRfcmNiICopdXJiLT5jb250ZXh0OwotCXN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSA9IHBSQ0ItPnBEZXZpY2U7Ci0JdW5zaWduZWQgbG9uZyAgIGJ5dGVzUmVhZDsKLQlpbnQgYkluZGljYXRlUmVjZWl2ZSA9IGZhbHNlOwotCWludCBiUmVBbGxvY1NrYiA9IGZhbHNlOwotCWludCBzdGF0dXM7CisJc3RydWN0IHZudF9yY2IgKnJjYiA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYgPSByY2ItPnBEZXZpY2U7CisJaW50IHJlX2FsbG9jX3NrYiA9IGZhbHNlOwogCi0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyItLS0tPnNfbnNCdWxrSW5Vc2JJb0NvbXBsZXRlUmVhZFxuIik7Ci0gICAgc3RhdHVzID0gdXJiLT5zdGF0dXM7Ci0gICAgYnl0ZXNSZWFkID0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5zX25zQnVsa0luVXNiSW9Db21wbGV0ZVJlYWRcbiIpOwogCi0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBwRGV2aWNlLT51bEJ1bGtJbkVycm9yKys7Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iQlVMSyBJbiBmYWlsZWQgJWRcbiIsIHN0YXR1cyk7Ci0vL3RvZG8uLi54eHh4eHgKLS8vICAgICAgICBpZiAoc3RhdHVzID09IFVTQkRfU1RBVFVTX0NSQykgewotLy8gICAgICAgICAgICBwRGV2aWNlLT51bEJ1bGtJbkNvbnRDUkNFcnJvcisrOwotLy8gICAgICAgIH0KLS8vICAgICAgICBpZiAoc3RhdHVzID09IFNUQVRVU19ERVZJQ0VfTk9UX0NPTk5FQ1RFRCApCi0vLyAgICAgICAgewotLy8gICAgICAgICAgICBNUF9TRVRfRkxBRyhwRGV2aWNlLCBmTVBfRElTQ09OTkVDVEVEKTsKLS8vICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLQlpZiAoYnl0ZXNSZWFkKQotCQliSW5kaWNhdGVSZWNlaXZlID0gdHJ1ZTsKLSAgICAgICAgcERldmljZS0+dWxCdWxrSW5Db250Q1JDRXJyb3IgPSAwOwotICAgICAgICBwRGV2aWNlLT51bEJ1bGtJbkJ5dGVzUmVhZCArPSBieXRlc1JlYWQ7Ci0gICAgfQorCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJcmV0dXJuOworCWNhc2UgLUVUSU1FRE9VVDoKKwlkZWZhdWx0OgorCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPCisJCQkJIkJVTEsgSW4gZmFpbGVkICVkXG4iLCB1cmItPnN0YXR1cyk7CisJCWJyZWFrOworCX0KIAotICAgIGlmIChiSW5kaWNhdGVSZWNlaXZlKSB7Ci0gICAgICAgIHNwaW5fbG9jaygmcERldmljZS0+bG9jayk7Ci0gICAgICAgIGlmIChSWGJCdWxrSW5Qcm9jZXNzRGF0YShwRGV2aWNlLCBwUkNCLCBieXRlc1JlYWQpID09IHRydWUpCi0gICAgICAgICAgICBiUmVBbGxvY1NrYiA9IHRydWU7Ci0gICAgICAgIHNwaW5fdW5sb2NrKCZwRGV2aWNlLT5sb2NrKTsKLSAgICB9Ci0gICAgcFJDQi0+UmVmLS07Ci0gICAgaWYgKHBSQ0ItPlJlZiA9PSAwKQotICAgIHsKLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJSeHZGcmVlTm9ybWFsICVkIFxuIixwRGV2aWNlLT5OdW1SZWN2RnJlZUxpc3QpOwotICAgICAgICBzcGluX2xvY2soJnBEZXZpY2UtPmxvY2spOwotICAgICAgICBSWHZGcmVlUkNCKHBSQ0IsIGJSZUFsbG9jU2tiKTsKLSAgICAgICAgc3Bpbl91bmxvY2soJnBEZXZpY2UtPmxvY2spOwotICAgIH0KKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoKSB7CisJCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CiAKLSAgICByZXR1cm47CisJCWlmIChSWGJCdWxrSW5Qcm9jZXNzRGF0YShwcml2LCByY2IsIHVyYi0+YWN0dWFsX2xlbmd0aCkgPT0gdHJ1ZSkKKwkJCXJlX2FsbG9jX3NrYiA9IHRydWU7CisKKwkJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCX0KKworCXJjYi0+UmVmLS07CisJaWYgKHJjYi0+UmVmID09IDApIHsKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJSeHZGcmVlTm9ybWFsICVkXG4iLAorCQkJCQkJCXByaXYtPk51bVJlY3ZGcmVlTGlzdCk7CisJCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisKKwkJUlh2RnJlZVJDQihyY2IsIHJlX2FsbG9jX3NrYik7CisKKwkJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCX0KKworCXJldHVybjsKIH0KIAogLyoKQEAgLTU0NCw1MyArNTE5LDQwIEBACiAgKgogICovCiAKLWludCBQSVBFbnNTZW5kQnVsa091dChzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsCi0JCQkJc3RydWN0IHZudF91c2Jfc2VuZF9jb250ZXh0ICpwQ29udGV4dCkKK2ludCBQSVBFbnNTZW5kQnVsa091dChzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsCisJCQkJc3RydWN0IHZudF91c2Jfc2VuZF9jb250ZXh0ICpjb250ZXh0KQogewogCWludCBzdGF0dXM7Ci0Jc3RydWN0IHVyYiAgICAgICAgICAqcFVyYjsKKwlzdHJ1Y3QgdXJiICp1cmI7CiAKLSAgICBwRGV2aWNlLT5iUFdCaXRPbiA9IGZhbHNlOworCXByaXYtPmJQV0JpdE9uID0gZmFsc2U7CiAKLS8qCi0gICAgaWYgKHBEZXZpY2UtPnBQZW5kaW5nQnVsa091dENvbnRleHQgIT0gTlVMTCkgewotICAgICAgICBwRGV2aWNlLT5OdW1Db250ZXh0c1F1ZXVlZCsrOwotICAgICAgICBFbnF1ZXVlQ29udGV4dChwRGV2aWNlLT5GaXJzdFR4Q29udGV4dFF1ZXVlLCBwRGV2aWNlLT5MYXN0VHhDb250ZXh0UXVldWUsIHBDb250ZXh0KTsKLSAgICAgICAgc3RhdHVzID0gU1RBVFVTX1BFTkRJTkc7Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iU2VuZCBwZW5kaW5nIVxuIik7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotKi8KKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPInNfbnNTZW5kQnVsa091dFxuIik7CiAKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPInNfbnNTZW5kQnVsa091dFxuIik7CisJaWYgKCEoTVBfSVNfUkVBRFkocHJpdikgJiYgcHJpdi0+RmxhZ3MgJiBmTVBfUE9TVF9XUklURVMpKSB7CisJCWNvbnRleHQtPmJCb29sSW5Vc2UgPSBmYWxzZTsKKwkJcmV0dXJuIFNUQVRVU19SRVNPVVJDRVM7CisJfQogCi0gICAgaWYgKE1QX0lTX1JFQURZKHBEZXZpY2UpICYmIChwRGV2aWNlLT5GbGFncyAmIGZNUF9QT1NUX1dSSVRFUykpIHsKKwl1cmIgPSBjb250ZXh0LT5wVXJiOwogCi0gICAgICAgIHBVcmIgPSBwQ29udGV4dC0+cFVyYjsKLSAgICAgICAgcERldmljZS0+dWxCdWxrT3V0UG9zdGVkKys7Ci0vLyAgICAgICAgcERldmljZS0+cFBlbmRpbmdCdWxrT3V0Q29udGV4dCA9IHBDb250ZXh0OwotICAgICAgICB1c2JfZmlsbF9idWxrX3VyYigKLSAgICAgICAgCSAgICBwVXJiLAotICAgICAgICAJCXBEZXZpY2UtPnVzYiwKLQkJICAgIHVzYl9zbmRidWxrcGlwZShwRGV2aWNlLT51c2IsIDMpLAotCQkgICAgKHZvaWQgKikgJihwQ29udGV4dC0+RGF0YVswXSksCi0gICAgICAgIAkJcENvbnRleHQtPnVCdWZMZW4sCi0gICAgICAgIAkJc19uc0J1bGtPdXRJb0NvbXBsZXRlV3JpdGUsCi0gICAgICAgIAkJcENvbnRleHQpOworCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwKKwkJCXByaXYtPnVzYiwKKwkJCXVzYl9zbmRidWxrcGlwZShwcml2LT51c2IsIDMpLAorCQkJY29udGV4dC0+RGF0YSwKKwkJCWNvbnRleHQtPnVCdWZMZW4sCisJCQlzX25zQnVsa091dElvQ29tcGxldGVXcml0ZSwKKwkJCWNvbnRleHQpOwogCi0gICAgCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHBVcmIsIEdGUF9BVE9NSUMpOwotICAgIAlpZiAoc3RhdHVzICE9IDApCi0gICAgCXsKLSAgICAJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsIHN0YXR1cyk7Ci0JCXBDb250ZXh0LT5iQm9vbEluVXNlID0gZmFsc2U7Ci0gICAgCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0gICAgCX0KLSAgICAgICAgcmV0dXJuIFNUQVRVU19QRU5ESU5HOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcENvbnRleHQtPmJCb29sSW5Vc2UgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19SRVNPVVJDRVM7Ci0gICAgfQorCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8KKwkJCQkiU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsIHN0YXR1cyk7CisJCWNvbnRleHQtPmJCb29sSW5Vc2UgPSBmYWxzZTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCX0KKworCXJldHVybiBTVEFUVVNfUEVORElORzsKIH0KIAogLyoKQEAgLTYyMyw2OCArNTg1LDQ5IEBACiAKIHN0YXRpYyB2b2lkIHNfbnNCdWxrT3V0SW9Db21wbGV0ZVdyaXRlKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2U7Ci0JaW50IHN0YXR1czsKLQlDT05URVhUX1RZUEUgQ29udGV4dFR5cGU7Ci0JdW5zaWduZWQgbG9uZyB1bEJ1ZkxlbjsKLQlzdHJ1Y3Qgdm50X3VzYl9zZW5kX2NvbnRleHQgKnBDb250ZXh0OworCXN0cnVjdCB2bnRfdXNiX3NlbmRfY29udGV4dCAqY29udGV4dCA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYgPSBjb250ZXh0LT5wRGV2aWNlOworCXU4IGNvbnRleHRfdHlwZSA9IGNvbnRleHQtPnR5cGU7CiAKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIi0tLS0+c19uc0J1bGtPdXRJb0NvbXBsZXRlV3JpdGVcbiIpOwotICAgIC8vCi0gICAgLy8gVGhlIGNvbnRleHQgZ2l2ZW4gdG8gSW9TZXRDb21wbGV0aW9uUm91dGluZSBpcyBhbiBVU0JfQ09OVEVYVCBzdHJ1Y3QKLSAgICAvLwotCXBDb250ZXh0ID0gKHN0cnVjdCB2bnRfdXNiX3NlbmRfY29udGV4dCAqKXVyYi0+Y29udGV4dDsKKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIi0tLS0+c19uc0J1bGtPdXRJb0NvbXBsZXRlV3JpdGVcbiIpOwogCi0gICAgcERldmljZSA9IHBDb250ZXh0LT5wRGV2aWNlOwotICAgIENvbnRleHRUeXBlID0gcENvbnRleHQtPlR5cGU7Ci0gICAgdWxCdWZMZW4gPSBwQ29udGV4dC0+dUJ1ZkxlbjsKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPCisJCQkiV3JpdGUgJWQgYnl0ZXNcbiIsIGNvbnRleHQtPnVCdWZMZW4pOworCQlicmVhazsKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCWNvbnRleHQtPmJCb29sSW5Vc2UgPSBmYWxzZTsKKwkJcmV0dXJuOworCWNhc2UgLUVUSU1FRE9VVDoKKwlkZWZhdWx0OgorCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPCisJCQkJIkJVTEsgT3V0IGZhaWxlZCAlZFxuIiwgdXJiLT5zdGF0dXMpOworCQlicmVhazsKKwl9CiAKLSAgICBpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KHBEZXZpY2UtPmRldikpCi0JICAgIHJldHVybjsKKwlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KHByaXYtPmRldikpCisJCXJldHVybjsKIAotICAgLy8KLSAgICAvLyBQZXJmb3JtIHZhcmlvdXMgSVJQLCBVUkIsIGFuZCBidWZmZXIgJ3Nhbml0eSBjaGVja3MnCi0gICAgLy8KKwlpZiAoQ09OVEVYVF9EQVRBX1BBQ0tFVCA9PSBjb250ZXh0X3R5cGUpIHsKKwkJaWYgKGNvbnRleHQtPnBQYWNrZXQgIT0gTlVMTCkgeworCQkJZGV2X2tmcmVlX3NrYl9pcnEoY29udGV4dC0+cFBhY2tldCk7CisJCQljb250ZXh0LT5wUGFja2V0ID0gTlVMTDsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8KKwkJCQkidHggICVkIGJ5dGVzXG4iLCBjb250ZXh0LT51QnVmTGVuKTsKKwkJfQogCi0gICAgc3RhdHVzID0gdXJiLT5zdGF0dXM7CisJCXByaXYtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCX0KIAotICAgIGlmKHN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgewotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIldyaXRlICVkIGJ5dGVzXG4iLChpbnQpdWxCdWZMZW4pOwotICAgICAgICBwRGV2aWNlLT51bEJ1bGtPdXRCeXRlc1dyaXRlICs9IHVsQnVmTGVuOwotICAgICAgICBwRGV2aWNlLT51bEJ1bGtPdXRDb250Q1JDRXJyb3IgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iQlVMSyBPdXQgZmFpbGVkICVkXG4iLCBzdGF0dXMpOwotICAgICAgICBwRGV2aWNlLT51bEJ1bGtPdXRFcnJvcisrOwotICAgIH0KKwlpZiAocHJpdi0+YkxpbmtQYXNzID09IHRydWUpIHsKKwkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQocHJpdi0+ZGV2KSkKKwkJCW5ldGlmX3dha2VfcXVldWUocHJpdi0+ZGV2KTsKKwl9CiAKLS8vICAgIHBEZXZpY2UtPnVsQ2hlY2tGb3JIYW5nQ291bnQgPSAwOwotLy8gICAgcERldmljZS0+cFBlbmRpbmdCdWxrT3V0Q29udGV4dCA9IE5VTEw7CisJY29udGV4dC0+YkJvb2xJblVzZSA9IGZhbHNlOwogCi0gICAgaWYgKCBDT05URVhUX0RBVEFfUEFDS0VUID09IENvbnRleHRUeXBlICkgewotICAgICAgICAvLyBJbmRpY2F0ZSB0byB0aGUgcHJvdG9jb2wgdGhlIHN0YXR1cyBvZiB0aGUgc2VudCBwYWNrZXQgYW5kIHJldHVybgotICAgICAgICAvLyBvd25lcnNoaXAgb2YgdGhlIHBhY2tldC4KLQkgICAgaWYgKHBDb250ZXh0LT5wUGFja2V0ICE9IE5VTEwpIHsKLQkgICAgICAgIGRldl9rZnJlZV9za2JfaXJxKHBDb250ZXh0LT5wUGFja2V0KTsKLQkgICAgICAgIHBDb250ZXh0LT5wUGFja2V0ID0gTlVMTDsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8idHggICVkIGJ5dGVzXG4iLChpbnQpdWxCdWZMZW4pOwotCSAgICB9Ci0KLSAgICAgICAgcERldmljZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgewotICAgICAgICAgICAgcERldmljZS0+cGFja2V0c1NlbnQrKzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iU2VuZCBVU0IgZXJyb3IhIFslMDh4aF1cbiIsIHN0YXR1cyk7Ci0gICAgICAgICAgICBwRGV2aWNlLT5wYWNrZXRzU2VudERyb3BwZWQrKzsKLSAgICAgICAgfQotCi0gICAgfQotICAgIGlmIChwRGV2aWNlLT5iTGlua1Bhc3MgPT0gdHJ1ZSkgewotICAgICAgICBpZiAobmV0aWZfcXVldWVfc3RvcHBlZChwRGV2aWNlLT5kZXYpKQotICAgICAgICAgICAgbmV0aWZfd2FrZV9xdWV1ZShwRGV2aWNlLT5kZXYpOwotICAgIH0KLSAgICBwQ29udGV4dC0+YkJvb2xJblVzZSA9IGZhbHNlOwotCi0gICAgcmV0dXJuOworCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd2NtZC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmMKaW5kZXggNmI5NTIyOS4uM2NmM2YyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmMKQEAgLTI5MywxNyArMjkzLDExIEBACiAJY2FzZSBXTEFOX0NNRF9TQ0FOX1NUQVJUOgogCiAJCXBEZXZpY2UtPmJ5UmVBc3NvY0NvdW50ID0gMDsKLQkJaWYgKHBEZXZpY2UtPmJSYWRpb09mZiA9PSB0cnVlKSB7Ci0JCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7Ci0JCQlzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotCQkJcmV0dXJuOwotCQl9CisJCWlmIChwRGV2aWNlLT5iUmFkaW9PZmYgPT0gdHJ1ZSkKKwkJCWJyZWFrOwogCi0JCWlmIChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9FU1NfQVApIHsKLQkJCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0JCQlyZXR1cm47Ci0JCX0KKwkJaWYgKHBNZ210LT5lQ3Vyck1vZGUgPT0gV01BQ19NT0RFX0VTU19BUCkKKwkJCWJyZWFrOwogCiAJCXBJdGVtU1NJRCA9IChQV0xBTl9JRV9TU0lEKXBNZ210LT5hYnlTY2FuU1NJRDsKIApAQCAtMzExLDE2ICszMDUsMTIgQEAKIAkJCXBNZ210LT51U2NhbkNoYW5uZWwgPSBwRGV2aWNlLT5ieU1pbkNoYW5uZWw7CiAJCWlmIChwTWdtdC0+dVNjYW5DaGFubmVsID4gcERldmljZS0+YnlNYXhDaGFubmVsKSB7CiAJCQlwRGV2aWNlLT5lQ29tbWFuZFN0YXRlID0gV0xBTl9DTURfU0NBTl9FTkQ7Ci0JCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7Ci0JCQlzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotCQkJcmV0dXJuOworCQkJYnJlYWs7CiAJCX0gZWxzZSB7CiAJCQlpZiAoIUNoYW5uZWxWYWxpZChwRGV2aWNlLT5ieVpvbmVUeXBlLCBwTWdtdC0+dVNjYW5DaGFubmVsKSkgewogCQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkludmFsaWQgY2hhbm5lbCBwTWdtdC0+dVNjYW5DaGFubmVsID0gJWRcbiIsIHBNZ210LT51U2NhbkNoYW5uZWwpOwogCQkJCXBNZ210LT51U2NhbkNoYW5uZWwrKzsKLQkJCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLQkJCQlyZXR1cm47CisJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAocE1nbXQtPnVTY2FuQ2hhbm5lbCA9PSBwRGV2aWNlLT5ieU1pbkNoYW5uZWwpIHsKIAkJCQkvLyBwTWdtdC0+ZVNjYW5UeXBlID0gV01BQ19TQ0FOX0FDVElWRTsgICAgICAgICAgLy9taWtlIG1hcmsKQEAgLTQyMCwxNiArNDEwLDEzIEBACiAJCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKIAkJd2lyZWxlc3Nfc2VuZF9ldmVudChwRGV2aWNlLT5kZXYsIFNJT0NHSVdTQ0FOLCAmd3JxdSwgTlVMTCk7CiAKLQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwogCQlicmVhazsKIAogCWNhc2UgV0xBTl9DTURfRElTQVNTT0NJQVRFX1NUQVJUOgogCQlwRGV2aWNlLT5ieVJlQXNzb2NDb3VudCA9IDA7CiAJCWlmICgocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfRVNTX1NUQSkgJiYKIAkJICAgIChwTWdtdC0+ZUN1cnJTdGF0ZSAhPSBXTUFDX1NUQVRFX0FTU09DKSkgewotCQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwotCQkJc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLQkJCXJldHVybjsKKwkJCWJyZWFrOwogCQl9IGVsc2UgewogCQkJcERldmljZS0+YndleHRzdGVwMCA9IGZhbHNlOwogCQkJcERldmljZS0+YndleHRzdGVwMSA9IGZhbHNlOwpAQCAtNDU4LDE3ICs0NDUsMTQgQEAKIAkJbmV0aWZfc3RvcF9xdWV1ZShwRGV2aWNlLT5kZXYpOwogCQlpZiAocERldmljZS0+Yk5lZWRSYWRpb09GRiA9PSB0cnVlKQogCQkJQ0FSRGJSYWRpb1Bvd2VyT2ZmKHBEZXZpY2UpOwotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CisKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fQ01EX1NTSURfU1RBUlQ6CiAKIAkJcERldmljZS0+YnlSZUFzc29jQ291bnQgPSAwOwotCQlpZiAocERldmljZS0+YlJhZGlvT2ZmID09IHRydWUpIHsKLQkJCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0JCQlyZXR1cm47Ci0JCX0KKwkJaWYgKHBEZXZpY2UtPmJSYWRpb09mZiA9PSB0cnVlKQorCQkJYnJlYWs7CiAKIAkJbWVtY3B5KHBNZ210LT5hYnlBZEhvY1NTSUQsIHBNZ210LT5hYnlEZXNpcmVTU0lELAogCQkgICAgICAgKChQV0xBTl9JRV9TU0lEKXBNZ210LT5hYnlEZXNpcmVTU0lEKS0+bGVuICsgV0xBTl9JRUhEUl9MRU4pOwpAQCAtNDg5LDExICs0NzMsOSBAQAogCQlpZiAoKHBNZ210LT5lQ3VyclN0YXRlID09IFdNQUNfU1RBVEVfQVNTT0MpIHx8CiAJCSAgICAoKHBNZ210LT5lQ3Vyck1vZGUgPT0gV01BQ19NT0RFX0lCU1NfU1RBKSAmJiAocE1nbXQtPmVDdXJyU3RhdGUgPT0gV01BQ19TVEFURV9KT0lOVEVEKSkpIHsKIAkJCWlmIChwSXRlbVNTSUQtPmxlbiA9PSBwSXRlbVNTSURDdXJyLT5sZW4pIHsKLQkJCQlpZiAobWVtY21wKHBJdGVtU1NJRC0+YWJ5U1NJRCwgcEl0ZW1TU0lEQ3Vyci0+YWJ5U1NJRCwgcEl0ZW1TU0lELT5sZW4pID09IDApIHsKLQkJCQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwotCQkJCQlzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotCQkJCQlyZXR1cm47Ci0JCQkJfQorCQkJCWlmICghbWVtY21wKHBJdGVtU1NJRC0+YWJ5U1NJRCwKKwkJCQkJcEl0ZW1TU0lEQ3Vyci0+YWJ5U1NJRCwgcEl0ZW1TU0lELT5sZW4pKQorCQkJCQlicmVhazsKIAkJCX0KIAkJCW5ldGlmX3N0b3BfcXVldWUocERldmljZS0+ZGV2KTsKIAkJCXBEZXZpY2UtPmJMaW5rUGFzcyA9IGZhbHNlOwpAQCAtNTgyLDcgKzU2NCw2IEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fQVVUSEVOVElDQVRFX1dBSVQ6CkBAIC02MTIsNyArNTkzLDYgQEAKIAkJfQogCQlwRGV2aWNlLT5ieUxpbmtXYWl0Q291bnQgPSAwOwogCi0JCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fQVNTT0NJQVRFX1dBSVQ6CkBAIC02NDcsNyArNjI3LDYgQEAKIAkJCXJldHVybjsKIAkJfQogCi0JCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fQ01EX0FQX01PREVfU1RBUlQ6CkBAIC02ODMsNyArNjYyLDYgQEAKIAkJCUNvbnRyb2x2TWFza0J5dGUocERldmljZSwgTUVTU0FHRV9SRVFVRVNUX01BQ1JFRywgTUFDX1JFR19QQVBFREVMQVksIExFRFNUU19TVFMsIExFRFNUU19JTlRFUik7CiAJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBEZXZpY2UtPnNlY29uZF9jYWxsYmFja193b3JrLCBIWik7CiAJCX0KLQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwogCQlicmVhazsKIAogCWNhc2UgV0xBTl9DTURfVFhfUFNQQUNLRVRfU1RBUlQ6CkBAIC03MzgsOCArNzE2LDYgQEAKIAkJCQlwTWdtdC0+c05vZGVEQlRhYmxlW2lpXS5iUnhQU1BvbGwgPSBmYWxzZTsKIAkJCX0KIAkJfQotCi0JCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fQ01EX1JBRElPX1NUQVJUOgpAQCAtNzYwLDExICs3MzYsOCBAQAogCQkJCQkxLAogCQkJCQkmYnlUbXApOwogCi0JCQlpZiAobnRTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLQkJCQlyZXR1cm47Ci0JCQl9CisJCQlpZiAobnRTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJYnJlYWs7CiAJCQlpZiAoKGJ5VG1wICYgR1BJTzNfREFUQSkgPT0gMCkgewogCQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIFdMQU5fQ01EX1JBRElPX1NUQVJUX09GRi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuIik7CiAJCQkJLy8gT2xkIGNvbW1hbmRzIGFyZSB1c2VsZXNzLgpAQCAtODMzLDcgKzgwNiw2IEBACiAJCQl9CiAJCX0KIAotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTEFOX0NNRF9DSEFOR0VfQkJTRU5TSVRJVklUWV9TVEFSVDoKQEAgLTg0MywyNCArODE1LDIwIEBACiAJCUJCdlNldFZHQUdhaW5PZmZzZXQocERldmljZSwgcERldmljZS0+YnlCQlZHQUN1cnJlbnQpOwogCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIkNoYW5nZSBzZW5zaXRpdml0eSBwRGV2aWNlLT5ieUJCVkdBQ3VycmVudCA9ICV4XG4iLCBwRGV2aWNlLT5ieUJCVkdBQ3VycmVudCk7CiAJCXBEZXZpY2UtPmJTdG9wRGF0YVBrdCA9IGZhbHNlOwotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTEFOX0NNRF9UQlRUX1dBS0VVUF9TVEFSVDoKIAkJUFNiSXNOZXh0VEJUVFdha2VVcChwRGV2aWNlKTsKLQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwogCQlicmVhazsKIAogCWNhc2UgV0xBTl9DTURfQkVDT05fU0VORF9TVEFSVDoKIAkJYk1nclByZXBhcmVCZWFjb25Ub1NlbmQocERldmljZSwgcE1nbXQpOwotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTEFOX0NNRF9TRVRQT1dFUl9TVEFSVDoKIAogCQlSRmJTZXRQb3dlcihwRGV2aWNlLCBwRGV2aWNlLT53Q3VycmVudFJhdGUsIHBNZ210LT51Q3VyckNoYW5uZWwpOwogCi0JCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fQ01EX0NIQU5HRV9BTlRFTk5BX1NUQVJUOgpAQCAtODc4LDEyICs4NDYsMTAgQEAKIAkJCWVsc2UKIAkJCQlCQnZTZXRBbnRlbm5hTW9kZShwRGV2aWNlLCBBTlRfUlhBKTsKIAkJfQotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTEFOX0NNRF9SRU1PVkVfQUxMS0VZX1NUQVJUOgogCQlLZXliUmVtb3ZlQWxsS2V5KHBEZXZpY2UsICYocERldmljZS0+c0tleSksIHBEZXZpY2UtPmFieUJTU0lEKTsKLQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwogCQlicmVhazsKIAogCWNhc2UgV0xBTl9DTURfTUFDX0RJU1BPV0VSU0FWSU5HX1NUQVJUOgpAQCAtODk4LDcgKzg2NCw2IEBACiAJCQkJCU5VTEwKIAkJCQkJKTsKIAkJfQotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTEFOX0NNRF8xMUhfQ0hTV19TVEFSVDoKQEAgLTkwNiwxNCArODcxLDE3IEBACiAJCXBEZXZpY2UtPmJDaGFubmVsU3dpdGNoID0gZmFsc2U7CiAJCXBNZ210LT51Q3VyckNoYW5uZWwgPSBwRGV2aWNlLT5ieU5ld0NoYW5uZWw7CiAJCXBEZXZpY2UtPmJTdG9wRGF0YVBrdCA9IGZhbHNlOwotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAJCWJyZWFrOwogCisJY2FzZSBXTEFOX0NNRF9DT05GSUdVUkVfRklMVEVSX1NUQVJUOgorCQl2bnRfY29uZmlndXJlX2ZpbHRlcihwRGV2aWNlKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwogCQlicmVhazsKIAl9IC8vc3dpdGNoCiAKKwlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CisKIAlzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwogCXJldHVybjsKIH0KQEAgLTEwMDksNiArOTc3LDExIEBACiAJCQlwRGV2aWNlLT5lQ29tbWFuZFN0YXRlID0gV0xBTl9DTURfMTFIX0NIU1dfU1RBUlQ7CiAJCQlicmVhazsKIAorCQljYXNlIFdMQU5fQ01EX0NPTkZJR1VSRV9GSUxURVI6CisJCQlwRGV2aWNlLT5lQ29tbWFuZFN0YXRlID0KKwkJCQkJCVdMQU5fQ01EX0NPTkZJR1VSRV9GSUxURVJfU1RBUlQ7CisJCQlicmVhazsKKwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd2NtZC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmgKaW5kZXggY2FmMjY4NC4uNzM2NTcyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmgKQEAgLTUxLDcgKzUxLDggQEAKICAgICBXTEFOX0NNRF9SRU1PVkVfQUxMS0VZLAogICAgIFdMQU5fQ01EX01BQ19ESVNQT1dFUlNBVklORywKICAgICBXTEFOX0NNRF8xMUhfQ0hTVywKLSAgICBXTEFOX0NNRF9SVU5fQVAKKyAgICBXTEFOX0NNRF9SVU5fQVAsCisgICAgV0xBTl9DTURfQ09ORklHVVJFX0ZJTFRFUgogfSBDTURfQ09ERSwgKlBDTURfQ09ERTsKIAogI2RlZmluZSBDTURfUV9TSVpFICAgICAgICAgICAgICAzMgpAQCAtOTYsNiArOTcsNyBAQAogICAgIFdMQU5fQ01EX1JFTU9WRV9BTExLRVlfU1RBUlQsCiAgICAgV0xBTl9DTURfTUFDX0RJU1BPV0VSU0FWSU5HX1NUQVJULAogICAgIFdMQU5fQ01EXzExSF9DSFNXX1NUQVJULAorICAgIFdMQU5fQ01EX0NPTkZJR1VSRV9GSUxURVJfU1RBUlQsCiAgICAgV0xBTl9DTURfSURMRQogfSBDTURfU1RBVEUsICpQQ01EX1NUQVRFOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dtZ3IuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd21nci5jCmluZGV4IGQ3NGIwZTcuLjBkNjk3MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd21nci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd21nci5jCkBAIC0yMTY0LDEyICsyMTY0LDEyIEBACiAgICAgICAgIHBNZ210LT53Q3VyckNhcEluZm8gfD0gV0xBTl9TRVRfQ0FQX0lORk9fRVNTKDEpOwogICAgICAgICBwTWdtdC0+YnlEVElNUGVyaW9kID0gREVGQVVMVF9EVElNX1BFUklPRDsKICAgICAgICAgcE1nbXQtPmJ5RFRJTUNvdW50ID0gcE1nbXQtPmJ5RFRJTVBlcmlvZCAtIDE7Ci0gICAgICAgIHBEZXZpY2UtPmVPUE1vZGUgPSBPUF9NT0RFX0FQOworCXBEZXZpY2UtPm9wX21vZGUgPSBOTDgwMjExX0lGVFlQRV9BUDsKICAgICB9CiAKICAgICBpZiAocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfSUJTU19TVEEpIHsKICAgICAgICAgcE1nbXQtPndDdXJyQ2FwSW5mbyB8PSBXTEFOX1NFVF9DQVBfSU5GT19JQlNTKDEpOwotICAgICAgICBwRGV2aWNlLT5lT1BNb2RlID0gT1BfTU9ERV9BREhPQzsKKwlwRGV2aWNlLT5vcF9tb2RlID0gTkw4MDIxMV9JRlRZUEVfQURIT0M7CiAgICAgfQogCiAgICAgaWYgKHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlKSB7CkBAIC0yMzU5LDcgKzIzNTksNyBAQAogCiAgICAgICAgICAgICBwTWdtdC0+ZUN1cnJTdGF0ZSA9IFdNQUNfU1RBVEVfSk9JTlRFRDsKICAgICAgICAgICAgIC8vIEFkb3B0IEJTUyBzdGF0ZSBpbiBBZGFwdGVyIERldmljZSBPYmplY3QKLSAgICAgICAgICAgIHBEZXZpY2UtPmVPUE1vZGUgPSBPUF9NT0RFX0lORlJBU1RSVUNUVVJFOworCSAgICBwRGV2aWNlLT5vcF9tb2RlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKICAgICAgICAgICAgIG1lbWNweShwRGV2aWNlLT5hYnlCU1NJRCwgcEN1cnItPmFieUJTU0lELCBXTEFOX0JTU0lEX0xFTik7CiAKICAgICAgICAgICAgIC8vIEFkZCBjdXJyZW50IEJTUyB0byBDYW5kaWRhdGUgbGlzdApAQCAtMjUwMCw3ICsyNTAwLDcgQEAKICAgICAgICAgICAgIHBNZ210LT5lQ3Vyck1vZGUgPSBXTUFDX01PREVfSUJTU19TVEE7CiAgICAgICAgICAgICBwTWdtdC0+ZUN1cnJTdGF0ZSA9IFdNQUNfU1RBVEVfU1RBUlRFRDsKICAgICAgICAgICAgIC8vIEFkb3B0IEJTUyBzdGF0ZSBpbiBBZGFwdGVyIERldmljZSBPYmplY3QKLSAgICAgICAgICAgIHBEZXZpY2UtPmVPUE1vZGUgPSBPUF9NT0RFX0FESE9DOworCSAgICBwRGV2aWNlLT5vcF9tb2RlID0gTkw4MDIxMV9JRlRZUEVfQURIT0M7CiAgICAgICAgICAgICBwRGV2aWNlLT5iTGlua1Bhc3MgPSB0cnVlOwogICAgICAgICAgICAgQ29udHJvbHZNYXNrQnl0ZShwRGV2aWNlLE1FU1NBR0VfUkVRVUVTVF9NQUNSRUcsTUFDX1JFR19QQVBFREVMQVksTEVEU1RTX1NUUyxMRURTVFNfSU5URVIpOwogICAgICAgICAgICAgbWVtY3B5KHBEZXZpY2UtPmFieUJTU0lELCBwQ3Vyci0+YWJ5QlNTSUQsIFdMQU5fQlNTSURfTEVOKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xvY2FscGFyYS5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbG9jYWxwYXJhLmgKaW5kZXggODRlZmZjNC4uOGNhODBkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbG9jYWxwYXJhLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbG9jYWxwYXJhLmgKQEAgLTU4LDkgKzU4LDEzIEBACiAjZGVmaW5lIExPQ0FMXzExQl9CQVNJQ19SQVRFX0JJVE1BUAkJMHg4MjYKICNkZWZpbmUgTE9DQUxfMTFCX09QRVJBVElPTl9SQVRFX0JJVE1BUAkJMHg4MjYKICNkZWZpbmUgTE9DQUxfMTFHX0JBU0lDX1JBVEVfQklUTUFQCQkweDgyNgkgICAvKiAxLCAyLCA1LjUsIDExICovCi0jZGVmaW5lIExPQ0FMXzExR19PUEVSQVRJT05fUkFURV9CSVRNQVAJCTB4MTMwYzEyNDAgLyogNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NCAqLworI2RlZmluZSBMT0NBTF8xMUdfT1BFUkFUSU9OX1JBVEVfQklUTUFQCQkweDEzMGMxMjQwIC8qIDYsIDksIDEyLCAxOCwKKwkJCQkJCQkJICAgICogMjQsIDM2LCA0OCwgNTQKKwkJCQkJCQkJICAgICovCiAjZGVmaW5lIExPQ0FMXzExQV9CQVNJQ19SQVRFX0JJVE1BUAkJMHgwMTAwMTA0MCAvKiA2LCAxMiwgMjQgKi8KLSNkZWZpbmUgTE9DQUxfMTFBX09QRVJBVElPTl9SQVRFX0JJVE1BUAkJMHgxMjBjMDIwMCAvKiA5LCAxOCwgMzYsIDQ4LCA1NCAqLworI2RlZmluZSBMT0NBTF8xMUFfT1BFUkFUSU9OX1JBVEVfQklUTUFQCQkweDEyMGMwMjAwIC8qIDksIDE4LCAzNiwKKwkJCQkJCQkJICAgICogNDgsIDU0CisJCQkJCQkJCSAgICAqLwogCiAKICNkZWZpbmUgUFdSX0FDVElWRQkJCQkwCkBAIC0xNDAsNyArMTQ0LDkgQEAKIAkvKiBVbml0IHRpbWUgY291bnQgZm9yIHRoZSBkZWNpc2lvbiB0byBlbnRlciBQUyBtb2RlICovCiAJdTE2CUNoZWNrQ291bnRGb3JQUzsKIAl1OAlib0hhc1R4QWN0aXZpdHk7LyogdHggYWN0aXZpdHkgaGFzIG9jY3VycmVkICovCi0JdTgJYm9NYWNQc1ZhbGlkOwkvKiBQb3dlciBzYXZlIG1vZGUgb2J0YWluZWQgZnJvbSBIL1cgaXMgdmFsaWQgb3Igbm90ICovCisJdTgJYm9NYWNQc1ZhbGlkOwkvKiBQb3dlciBzYXZlIG1vZGUgb2J0YWluZWQKKwkJCQkgKiBmcm9tIEgvVyBpcyB2YWxpZCBvciBub3QKKwkJCQkgKi8KIAogCS8qIFJhdGUgKi8KIAl1OAlUeFJhdGVNb2RlOyAvKgpAQCAtMTYyLDM1ICsxNjgsNTcgQEAKIAogCXU4CU51bU9mQlJhdGU7CiAJdTgJTnVtT2ZTUmF0ZTsKLQl1OAlOdW1PZkRzc3NSYXRlSW5TUmF0ZTsJLyogbnVtYmVyIG9mIERTU1MgcmF0ZXMgaW4gc3VwcG9ydGVkIHJhdGUgc2V0ICovCisJdTgJTnVtT2ZEc3NzUmF0ZUluU1JhdGU7CS8qIG51bWJlciBvZiBEU1NTIHJhdGVzIGluCisJCQkJCSAqIHN1cHBvcnRlZCByYXRlIHNldAorCQkJCQkgKi8KIAl1OAlyZXNlcnZlZDE7CiAKIAl1MzIJZHdCYXNpY1JhdGVCaXRtYXA7CS8qIGJpdCBtYXAgb2YgYmFzaWMgcmF0ZXMgKi8KIAotCXUzMglkd1N1cHBvcnRSYXRlQml0bWFwOwkvKiBiaXQgbWFwIG9mIGFsbCBzdXBwb3J0IHJhdGVzIGluY2x1ZGluZyBiYXNpYyBhbmQgb3BlcmF0aW9uYWwgcmF0ZXMgKi8KKwl1MzIJZHdTdXBwb3J0UmF0ZUJpdG1hcDsJLyogYml0IG1hcCBvZiBhbGwgc3VwcG9ydCByYXRlcworCQkJCQkgKiBpbmNsdWRpbmcgYmFzaWMgYW5kIG9wZXJhdGlvbmFsCisJCQkJCSAqIHJhdGVzCisJCQkJCSAqLwogCiAKIAkvKiBGb3IgU01FL01MTUUgaGFuZGxlciAqLwogCi0JdTE2CXdPbGRTVEFpbmRleDsJCS8qIHZhbGlkIHdoZW4gYm9IYW5kb3Zlcj1UUlVFLCBzdG9yZSBvbGQgY29ubmVjdGVkIFNUQSBpbmRleCAqLwotCXUxNgl3Q29ubmVjdGVkU1RBaW5kZXg7CS8qIEluZGV4IG9mIHBlZXJseSBjb25uZWN0ZWQgQVAgb3IgSUJTUyBpbiB0aGUgZGVzY3JpcHRpb25zZXQuICovCi0JdTE2CUFzc29jaWF0aW9uX0lEOwkJLyogVGhlIEFzc29jaWF0aW9uIElEIGluIHRoZSAoUmUpQXNzb2NpYXRpb24gUmVzcG9uc2UgZnJhbWUuICovCi0JdTE2CUxpc3RlbkludGVydmFsOwkJLyogVGhlIGxpc3RlbiBpbnRlcnZhbCB3aGVuIFNNRSBpbnZva2luZyBNTE1FXyAoUmUpQXNzb2NpYXRlX1JlcXVlc3QoKS4gKi8KKwl1MTYJd09sZFNUQWluZGV4OwkJLyogdmFsaWQgd2hlbiBib0hhbmRvdmVyPVRSVUUsCisJCQkJCSAqIHN0b3JlIG9sZCBjb25uZWN0ZWQgU1RBIGluZGV4CisJCQkJCSAqLworCXUxNgl3Q29ubmVjdGVkU1RBaW5kZXg7CS8qIEluZGV4IG9mIHBlZXJseSBjb25uZWN0ZWQgQVAgb3IKKwkJCQkJICogSUJTUyBpbiB0aGUgZGVzY3JpcHRpb25zZXQuCisJCQkJCSAqLworCXUxNglBc3NvY2lhdGlvbl9JRDsJCS8qIFRoZSBBc3NvY2lhdGlvbiBJRCBpbiB0aGUKKwkJCQkJICogKFJlKUFzc29jaWF0aW9uIFJlc3BvbnNlIGZyYW1lLgorCQkJCQkgKi8KKwl1MTYJTGlzdGVuSW50ZXJ2YWw7CQkvKiBUaGUgbGlzdGVuIGludGVydmFsIHdoZW4gU01FIGludm9raW5nCisJCQkJCSAqIE1MTUVfIChSZSlBc3NvY2lhdGVfUmVxdWVzdCgpLgorCQkJCQkgKi8KIAogCXN0cnVjdAlyYWRpb19vZmYgUmFkaW9PZmZTdGF0dXM7CiAJdTgJUmVzZXJ2ZWQwWzJdOwotCXU4CWJvTXNSYWRpb09mZjsJCS8qIE5kaXMgZGVtYW5kcyB0byBiZSB0cnVlIHdoZW4gc2V0IERpc2Fzc29jLiBPSUQgYW5kIGJlIGZhbHNlIHdoZW4gc2V0IFNTSUQgT0lELiAqLworCXU4CWJvTXNSYWRpb09mZjsJCS8qIE5kaXMgZGVtYW5kcyB0byBiZSB0cnVlIHdoZW4gc2V0CisJCQkJCSAqIERpc2Fzc29jLiBPSUQgYW5kIGJlIGZhbHNlIHdoZW4KKwkJCQkJICogc2V0IFNTSUQgT0lELgorCQkJCQkgKi8KIAl1OAliQW50ZW5uYU5vOwkJLyogd2hpY2ggYW50ZW5uYSAqLwotCXU4CWJDb25uZWN0RmxhZzsJCS8qIHRoZSBjb25uZWN0IHN0YXR1cyBmbGFnIGZvciByb2FtaW5nIHRhc2sgKi8KKwl1OAliQ29ubmVjdEZsYWc7CQkvKiB0aGUgY29ubmVjdCBzdGF0dXMgZmxhZyBmb3IKKwkJCQkJICogcm9hbWluZyB0YXNrCisJCQkJCSAqLwogCiAJdTgJUm9hbVN0YXR1czsKIAl1OAlyZXNlcnZlZDdbM107CiAKLQlzdHJ1Y3QJY2hhbl9pbmZvIEN1cnJlbnRDaGFuOwkvKiBDdXJyZW50IGNoYW5uZWwgbm8uIGFuZCBjaGFubmVsIGJhbmQuIEl0IG1heSBiZSBjaGFuZ2VkIGJ5IHNjYW5uaW5nLiAqLworCXN0cnVjdAljaGFuX2luZm8gQ3VycmVudENoYW47CS8qIEN1cnJlbnQgY2hhbm5lbCBuby4gYW5kIGNoYW5uZWwgYmFuZC4KKwkJCQkJICogSXQgbWF5IGJlIGNoYW5nZWQgYnkgc2Nhbm5pbmcuCisJCQkJCSAqLwogCXU4CWJvSGFuZG92ZXI7CQkvKiBSb2FtaW5nLCBIYW5kb3ZlciB0byBvdGhlciBBUC4gKi8KIAl1OAlib0NDQWJ1c3k7CiAKLQl1MTYJQ1dNYXg7CQkJLyogSXQgbWF5IG5vdCBiZSB0aGUgcmVhbCB2YWx1ZSB0aGF0IEgvVyB1c2VkICovCisJdTE2CUNXTWF4OwkJCS8qIEl0IG1heSBub3QgYmUgdGhlIHJlYWwgdmFsdWUKKwkJCQkJICogdGhhdCBIL1cgdXNlZAorCQkJCQkgKi8KIAl1OAlDV01pbjsJCQkvKiAyNTU6IHNldCBhY2NvcmRpbmcgdG8gODAyLjExIHNwZWMuICovCiAJdTgJcmVzZXJ2ZWQyOwogCkBAIC0yMDAsNyArMjI4LDkgQEAKIAl1OAliUHJlYW1ibGVNb2RlOwkJLyogQVVUTywgczMyICovCiAJdTgJYm9Ob25FUlBwcmVzZW50OwogCi0JdTgJYm9Qcm90ZWN0TWVjaGFuaXNtOwkvKiBIL1cgd2lsbCB0YWtlIHRoZSBuZWNlc3NhcnkgYWN0aW9uIGJhc2VkIG9uIHRoaXMgdmFyaWFibGUgKi8KKwl1OAlib1Byb3RlY3RNZWNoYW5pc207CS8qIEgvVyB3aWxsIHRha2UgdGhlIG5lY2Vzc2FyeSBhY3Rpb24KKwkJCQkJICogYmFzZWQgb24gdGhpcyB2YXJpYWJsZQorCQkJCQkgKi8KIAl1OAlib1Nob3J0UHJlYW1ibGU7CS8qIFNhbWUgaGVyZSAqLwogCXU4CWJvU2hvcnRTbG90VGltZTsJLyogU2FtZSBoZXJlICovCiAJdTgJcmVzZXJ2ZWRfMzsKQEAgLTIxMyw4ICsyNDMsMTIgQEAKIAl1MzIJSHdCc3NpZFZhbGlkOwogCiAJLyogRm9yIHNjYW4gbGlzdCAqLwotCXU4CUJzc0xpc3RDb3VudDsJCS8qIFRvdGFsIGNvdW50IG9mIHZhbGlkIGRlc2NyaXB0b3IgaW5kZXhlcyAqLwotCXU4CWJvUmVjZWl2ZVVuY29ycmVjdEluZm87CS8qIGltcG9ydGFudCBzZXR0aW5ncyBpbiBiZWFjb24vcHJvYmUgcmVzcC4gaGF2ZSBiZWVuIGNoYW5nZWQgKi8KKwl1OAlCc3NMaXN0Q291bnQ7CQkvKiBUb3RhbCBjb3VudCBvZiB2YWxpZAorCQkJCQkgKiBkZXNjcmlwdG9yIGluZGV4ZXMKKwkJCQkJICovCisJdTgJYm9SZWNlaXZlVW5jb3JyZWN0SW5mbzsJLyogaW1wb3J0YW50IHNldHRpbmdzIGluIGJlYWNvbi9wcm9iZQorCQkJCQkgKiByZXNwLiBoYXZlIGJlZW4gY2hhbmdlZAorCQkJCQkgKi8KIAl1OAlOb09mSm9pbmVySW5JYnNzOwogCXU4CXJlc2VydmVkXzQ7CiAKQEAgLTIyOCw3ICsyNjIsOSBAQAogCSAqLwogCXU4CUpvaW5lckluSWJzc1soTUFYX0JTU19ERVNDUklQVF9FTEVNRU5UICsgMykgJiB+MHgwM107CiAKLQkvKiBHZW5lcmFsIFN0YXRpc3RpY3MsIGNvdW50IGF0IFJ4X2hhbmRsZXIgb3IgVHhfY2FsbGJhY2sgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwkvKiBHZW5lcmFsIFN0YXRpc3RpY3MsIGNvdW50IGF0IFJ4X2hhbmRsZXIgb3IKKwkgKiBUeF9jYWxsYmFjayBpbnRlcnJ1cHQgaGFuZGxlcgorCSAqLwogCXU2NAlHU19YTUlUX09LOwkJLyogR29vZCBGcmFtZXMgVHJhbnNtaXR0ZWQgKi8KIAl1NjQJR1NfUkNWX09LOwkJLyogR29vZCBGcmFtZXMgUmVjZWl2ZWQgKi8KIAl1MzIJR1NfUkNWX0VSUk9SOwkJLyogRnJhbWVzIHJlY2VpdmVkIHdpdGggY3JjIGVycm9yICovCkBAIC0yNDgsMTAgKzI4NCwxOCBAQAogCXUzMglfZG90MTFXRVBVbmRlY3J5cHRhYmxlQ291bnQ7CiAJdTMyCV9kb3QxMUZyYW1lRHVwbGljYXRlQ291bnQ7CiAKLQlzdHJ1Y3QJY2hhbl9pbmZvIElic3NDaGFuU2V0dGluZzsJLyogMkIuIFN0YXJ0IElCU1MgQ2hhbm5lbCBzZXR0aW5nIGJ5IHJlZ2lzdHJ5IG9yIFdXVS4gKi8KLQl1OAlyZXNlcnZlZF81WzJdOwkJLyogSXQgbWF5IG5vdCBiZSB1c2VkIGFmdGVyIGNvbnNpZGVyaW5nIFJGIHR5cGUsIHJlZ2lvbiBhbmQgbW9kdWxhdGlvbiB0eXBlLiAqLworCXN0cnVjdAljaGFuX2luZm8gSWJzc0NoYW5TZXR0aW5nOwkvKiAyQi4gU3RhcnQgSUJTUyBDaGFubmVsCisJCQkJCQkgKiBzZXR0aW5nIGJ5IHJlZ2lzdHJ5IG9yCisJCQkJCQkgKiBXV1UuCisJCQkJCQkgKi8KKwl1OAlyZXNlcnZlZF81WzJdOwkJLyogSXQgbWF5IG5vdCBiZSB1c2VkIGFmdGVyCisJCQkJCSAqIGNvbnNpZGVyaW5nIFJGIHR5cGUsIHJlZ2lvbgorCQkJCQkgKiBhbmQgbW9kdWxhdGlvbiB0eXBlLgorCQkJCQkgKi8KIAotCXU4CXJlc2VydmVkXzZbMl07CQkvKiB0d28gdmFyaWFibGVzIGFyZSBmb3Igd2VwIGtleSBlcnJvciBkZXRlY3Rpb24gKi8KKwl1OAlyZXNlcnZlZF82WzJdOwkJLyogdHdvIHZhcmlhYmxlcyBhcmUgZm9yIHdlcAorCQkJCQkgKiBrZXkgZXJyb3IgZGV0ZWN0aW9uCisJCQkJCSAqLwogCXUzMgliV2VwS2V5RXJyb3I7CiAJdTMyCWJUb1NlbGZQYWNrZXRSZWNlaXZlZDsKIAl1MzIJV2VwS2V5RGV0ZWN0VGltZXJDb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWcuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWcuYwppbmRleCBhNWUyNTViLi5iYmM1ZGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZy5jCkBAIC03Niw0MSArNzYsMTExIEBACiB7CiAJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOwogCXN3aXRjaCAoUmVnaXN0ZXJObykgewotCWNhc2UgMHgzYjA6IHJlZy0+VTFCMCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgzYmM6IHJlZy0+VTFCQ19MRURDb25maWd1cmUgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4NDAwOiByZWctPkQwMF9EbWFDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgwMDogcmVnLT5NMDBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4MDQ6IHJlZy0+TTA0X011bHRpY2FzdEFkZHJlc3MxID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgwODogcmVnLT5NMDhfTXVsdGljYXN0QWRkcmVzczIgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODI0OiByZWctPk0yNF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgyODogcmVnLT5NMjhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4MmM6IHJlZy0+TTJDX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODM4OiByZWctPk0zOF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg0MDogcmVnLT5NNDBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4NDQ6IHJlZy0+TTQ0X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODQ4OiByZWctPk00OF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg0YzogcmVnLT5NNENfTWFjU3RhdHVzID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg2MDogcmVnLT5NNjBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4Njg6IHJlZy0+TTY4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODcwOiByZWctPk03MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg3NDogcmVnLT5NNzRfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4Nzg6IHJlZy0+TTc4X0VSUEluZm9ybWF0aW9uID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg3QzogcmVnLT5NN0NfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4ODA6IHJlZy0+TTgwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODg0OiByZWctPk04NF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg4ODogcmVnLT5NODhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4OTg6IHJlZy0+TTk4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTAwYzogcmVnLT5CQjBDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwMmM6IHJlZy0+QkIyQyA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDMwOiByZWctPkJCMzAgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTAzYzogcmVnLT5CQjNDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNDg6IHJlZy0+QkI0OCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDRjOiByZWctPkJCNEMgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTA1MDogcmVnLT5CQjUwID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNTQ6IHJlZy0+QkI1NCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDU4OiByZWctPkJCNTggPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTA1YzogcmVnLT5CQjVDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNjA6IHJlZy0+QkI2MCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHgzYjA6CisJCXJlZy0+VTFCMCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHgzYmM6CisJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4NDAwOgorCQlyZWctPkQwMF9EbWFDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDgwMDoKKwkJcmVnLT5NMDBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4MDQ6CisJCXJlZy0+TTA0X011bHRpY2FzdEFkZHJlc3MxID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDgwODoKKwkJcmVnLT5NMDhfTXVsdGljYXN0QWRkcmVzczIgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODI0OgorCQlyZWctPk0yNF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDgyODoKKwkJcmVnLT5NMjhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4MmM6CisJCXJlZy0+TTJDX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODM4OgorCQlyZWctPk0zOF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDg0MDoKKwkJcmVnLT5NNDBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4NDQ6CisJCXJlZy0+TTQ0X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODQ4OgorCQlyZWctPk00OF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDg0YzoKKwkJcmVnLT5NNENfTWFjU3RhdHVzID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDg2MDoKKwkJcmVnLT5NNjBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4Njg6CisJCXJlZy0+TTY4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODcwOgorCQlyZWctPk03MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDg3NDoKKwkJcmVnLT5NNzRfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4Nzg6CisJCXJlZy0+TTc4X0VSUEluZm9ybWF0aW9uID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDg3QzoKKwkJcmVnLT5NN0NfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4ODA6CisJCXJlZy0+TTgwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODg0OgorCQlyZWctPk04NF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDg4ODoKKwkJcmVnLT5NODhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4OTg6CisJCXJlZy0+TTk4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4MTAwYzoKKwkJcmVnLT5CQjBDID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDEwMmM6CisJCXJlZy0+QkIyQyA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHgxMDMwOgorCQlyZWctPkJCMzAgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4MTAzYzoKKwkJcmVnLT5CQjNDID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDEwNDg6CisJCXJlZy0+QkI0OCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHgxMDRjOgorCQlyZWctPkJCNEMgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4MTA1MDoKKwkJcmVnLT5CQjUwID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDEwNTQ6CisJCXJlZy0+QkI1NCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHgxMDU4OgorCQlyZWctPkJCNTggPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4MTA1YzoKKwkJcmVnLT5CQjVDID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDEwNjA6CisJCXJlZy0+QkI2MCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnguYwppbmRleCA4ZDcxYmMyLi5mMDA2YjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnguYwpAQCAtMTYsNyArMTYsOCBAQAogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJ3YjM1cnhfZi5oIgogCi1zdGF0aWMgdm9pZCBwYWNrZXRfY2FtZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgY2hhciAqcFJ4QnVmZmVyQWRkcmVzcywgaW50IFBhY2tldFNpemUpCitzdGF0aWMgdm9pZCBwYWNrZXRfY2FtZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgY2hhciAqcFJ4QnVmZmVyQWRkcmVzcywKKwlpbnQgUGFja2V0U2l6ZSkKIHsKIAlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXYgPSBody0+cHJpdjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtNjQsNyArNjUsOCBAQAogCX0gZWxzZSBpZiAoRGVjcnlwdGlvbk1ldGhvZCkgeyAvKiBGb3IgVEtJUCBhbmQgQ0NNUCAqLwogCQlmb3IgKGkgPSA3OyBpID4gMTsgaS0tKQogCQkJcFJ4QnVmZmVyQWRkcmVzc1tpXSA9IHBSeEJ1ZmZlckFkZHJlc3NbaSAtIDJdOwotCQlwUnhEZXMtPmJ1ZmZlcl9hZGRyZXNzWzBdID0gcFJ4QnVmZmVyQWRkcmVzcyArIDI7IC8qIFVwZGF0ZSB0aGUgZGVzY3JpcHRvciwgc2hpZnQgOCBieXRlICovCisJCS8qIFVwZGF0ZSB0aGUgZGVzY3JpcHRvciwgc2hpZnQgOCBieXRlICovCisJCXBSeERlcy0+YnVmZmVyX2FkZHJlc3NbMF0gPSBwUnhCdWZmZXJBZGRyZXNzICsgMjsKIAkJQnVmZmVyU2l6ZSAtPSA4OyAvKiA4IGJ5dGUgZm9yIElWICsgSUNWICovCiAJfQogCXBSeERlcy0+YnVmZmVyX3NpemVbMF0gPSBCdWZmZXJTaXplOwpAQCAtOTUsNyArOTcsOSBAQAogCiAJCS8qIFBhcnNlIHRoZSBidWxraW4gYnVmZmVyICovCiAJCXdoaWxlIChCdWZmZXJTaXplID49IDQpIHsKLQkJCWlmICgoY3B1X3RvX2xlMzIoKih1MzIgKilwUnhCdWZmZXJBZGRyZXNzKSAmIDB4MGZmZmZmZmYpID09IFJYX0VORF9UQUcpIC8qIElzIGVuZGluZz8gKi8KKwkJCS8qIElzIGVuZGluZz8gKi8KKwkJCWlmICgoY3B1X3RvX2xlMzIoKih1MzIgKilwUnhCdWZmZXJBZGRyZXNzKSAmIDB4MGZmZmZmZmYpID09CisJCQkJUlhfRU5EX1RBRykKIAkJCQlicmVhazsKIAogCQkJLyogR2V0IHRoZSBSMDAgUjAxIGZpcnN0ICovCkBAIC0xMDgsNyArMTEyLDggQEAKIAogCQkJLyogQmFzaWMgY2hlY2sgZm9yIFJ4IGxlbmd0aC4gSXMgbGVuZ3RoIHZhbGlkPyAqLwogCQkJaWYgKFBhY2tldFNpemUgPiBNQVhfUEFDS0VUX1NJWkUpIHsKLQkJCQlwcl9kZWJ1ZygiU2VyaW91cyBFUlJPUiA6IFJ4IGRhdGEgc2l6ZSB0b28gbG9uZywgc2l6ZSA9JWRcbiIsIFBhY2tldFNpemUpOworCQkJCXByX2RlYnVnKCJTZXJpb3VzIEVSUk9SIDogUnggZGF0YSBzaXplIHRvbyBsb25nLCBzaXplID0lZFxuIiwKKwkJCQkJUGFja2V0U2l6ZSk7CiAJCQkJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOwogCQkJCXBXYjM1UngtPkVwM0Vycm9yQ291bnQyKys7CiAJCQkJYnJlYWs7CkBAIC0xMTgsNyArMTIzLDggQEAKIAkJCSAqIFdiMzVSeF9pbmRpY2F0ZSgpIGlzIGNhbGxlZCBzeW5jaHJvbm91c2x5IHNvIGl0IGlzbid0CiAJCQkgKiBuZWNlc3NhcnkgdG8gc2V0ICJSeERlcy5EZXNjdHJpcHRvcl9JRCA9IFJ4QnVmZmVySUQ7IgogCQkJICovCi0JCQlCdWZmZXJTaXplIC09IDg7IC8qIHN1YnRyYWN0IDggYnl0ZSBmb3IgMzUncyBVU0IgaGVhZGVyIGxlbmd0aCAqLworCQkJLyogc3VidHJhY3QgOCBieXRlIGZvciAzNSdzIFVTQiBoZWFkZXIgbGVuZ3RoICovCisJCQlCdWZmZXJTaXplIC09IDg7CiAJCQlwUnhCdWZmZXJBZGRyZXNzICs9IDg7CiAKIAkJCVJ4RGVzLmJ1ZmZlcl9hZGRyZXNzWzBdID0gcFJ4QnVmZmVyQWRkcmVzczsKQEAgLTI1NSw3ICsyNjEsNyBAQAogCiAJcFdiMzVSeC0+cERSeCA9IGt6YWxsb2MoTUFYX1VTQl9SWF9CVUZGRVIsIEdGUF9BVE9NSUMpOwogCWlmICghcFdiMzVSeC0+cERSeCkgewotCQlwcmludGsoInczNXVuZDogUnggbWVtb3J5IGFsbG9jIGZhaWxlZFxuIik7CisJCWRldl9pbmZvKCZody0+d2lwaHktPmRldiwgInczNXVuZDogUnggbWVtb3J5IGFsbG9jIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCXBSeEJ1ZmZlckFkZHJlc3MgPSBwV2IzNVJ4LT5wRFJ4OwpAQCAtMjcwLDcgKzI3Niw3IEBACiAJcmV0diA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAKIAlpZiAocmV0diAhPSAwKSB7Ci0JCXByaW50aygiUnggVVJCIHNlbmRpbmcgZXJyb3JcbiIpOworCQlkZXZfaW5mbygmaHctPndpcGh5LT5kZXYsICJSeCBVUkIgc2VuZGluZyBlcnJvclxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCXJldHVybjsKQEAgLTMwNiw3ICszMTIsOSBAQAogCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKIAlwV2IzNVJ4LT5yeF9oYWx0ID0gMDsKIAotCS8qIEluaXRpYWwgdGhlIFF1ZXVlLiBUaGUgbGFzdCBidWZmZXIgaXMgcmVzZXJ2ZWQgZm9yIHVzZWQgaWYgdGhlIFJ4IHJlc291cmNlIGlzIHVuYXZhaWxhYmxlLiAqLworCS8qIEluaXRpYWwgdGhlIFF1ZXVlLiBUaGUgbGFzdCBidWZmZXIgaXMgcmVzZXJ2ZWQgZm9yIHVzZWQKKwkgKiBpZiB0aGUgUnggcmVzb3VyY2UgaXMgdW5hdmFpbGFibGUuCisJICovCiAJZm9yIChpID0gMDsgaSA8IE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUjsgaSsrKQogCQlwV2IzNVJ4LT5SeE93bmVyW2ldID0gMTsKIH0KQEAgLTMyOCw3ICszMzYsOCBAQAogCiAJLyogQ2FuY2VsaW5nIHRoZSBJcnAgaWYgYWxyZWFkeSBzZW5kcyBpdCBvdXQuICovCiAJaWYgKHBXYjM1UngtPkVQM3ZtX3N0YXRlID09IFZNX1JVTk5JTkcpIHsKLQkJdXNiX3VubGlua191cmIocFdiMzVSeC0+UnhVcmIpOyAvKiBPbmx5IHVzZSB1bmxpbmssIGxldCBXYjM1UnhfZGVzdHJveSB0byBmcmVlIHRoZW0gKi8KKwkJLyogT25seSB1c2UgdW5saW5rLCBsZXQgV2IzNVJ4X2Rlc3Ryb3kgdG8gZnJlZSB0aGVtICovCisJCXVzYl91bmxpbmtfdXJiKHBXYjM1UngtPlJ4VXJiKTsKIAkJcHJfZGVidWcoIkVQMyBSeCBzdG9wXG4iKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9kaGYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZi5jCmluZGV4IDEzZDM2MGYuLjQ4Nzc0NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZi5jCkBAIC0xMDYsNyArMTA2LDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyogICAgICAgICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0ICovCi1jaGFyIHNpZ25hdHVyZVsxNF0gPSAiRlVQVTdEMzdkaGZ3Y2kiOworc3RhdGljIGNoYXIgc2lnbmF0dXJlWzE0XSA9ICJGVVBVN0QzN2RoZndjaSI7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCkBAIC0xMjMsOCArMTIzLDggQEAKICNkZWZpbmUgRExfU0laRSAyMDAwCiAKIC8qIENGR19JREVOVElUWV9TVFJDVCAgIAlwcmlfaWRlbnRpdHkJPSB7IExPRihDRkdfSURFTlRJVFlfU1RSQ1QpLCBDRkdfUFJJX0lERU5USVRZIH07ICovCi1DRkdfU1VQX1JBTkdFX1NUUkNUIAltZmlfc3VwICAgICAgICAJPSB7IExPRihDRkdfU1VQX1JBTkdFX1NUUkNUKSwgQ0ZHX05JQ19NRklfU1VQX1JBTkdFIH07Ci1DRkdfU1VQX1JBTkdFX1NUUkNUIAljZmlfc3VwICAgICAgICAJPSB7IExPRihDRkdfU1VQX1JBTkdFX1NUUkNUKSwgQ0ZHX05JQ19DRklfU1VQX1JBTkdFIH07CitzdGF0aWMgQ0ZHX1NVUF9SQU5HRV9TVFJDVCAJbWZpX3N1cCAgICAgICAgCT0geyBMT0YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCksIENGR19OSUNfTUZJX1NVUF9SQU5HRSB9Oworc3RhdGljIENGR19TVVBfUkFOR0VfU1RSQ1QgCWNmaV9zdXAgICAgICAgIAk9IHsgTE9GKENGR19TVVBfUkFOR0VfU1RSQ1QpLCBDRkdfTklDX0NGSV9TVVBfUkFOR0UgfTsKIC8qIE5vdGU6IGNvdWxkIGJlIHVzZWQgcmF0aGVyIHRoYW4gdGhlIGFib3ZlIGV4cGxhaW5lZCBhbmQgZGVmaW5lZCBETF9TSVpFIGlmIG5lZWQgYXJpc2VzCiAgKiBDRkdfRExfQlVGX1NUUkNUICAgIAlkbF9idWYgICAgICAgICAJPSB7IExPRihDRkdfRExfQlVGX1NUUkNUKSwgQ0ZHX0RMX0JVRiB9OwogKi8KQEAgLTEzOSw3ICsxMzksNyBAQAogICogVGhpcyBpcyBvbmx5IHJlbGV2YW50IGlmIHRoZSBESEYgdXNlZCB3aXRob3V0IHJlbG9hZGluZyB0aGUgZHJpdmVyL3V0aWxpdHkuCiAgKi8KIAotTFRWX0lORk9fU1RSVUNUIGx0dl9pbmZvW10gPSB7CitzdGF0aWMgTFRWX0lORk9fU1RSVUNUIGx0dl9pbmZvW10gPSB7CiAJeyAoTFRWUCkmbWZpX3N1cCwJCQlMT0YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkgfSAsCiAJeyAoTFRWUCkmY2ZpX3N1cCwJCQlMT0YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkgfSAsCiAJeyAoTFRWUCkgTlVMTCwgCQkJCTAgfQpAQCAtMTY5LDcgKzE2OSw3IEBACiAqICAgc3RhdGlvbiBmaXJtd2FyZSBpbWFnZSB0byBiZSBkb3dubG9hZGVkIGlzIGNvbXBhdGlibGUuCiAqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAorc3RhdGljIGludAogY2hlY2tfY29tcF9mdyhtZW1pbWFnZSAqZncpCiB7CiBDRkdfUkFOR0UyMF9TVFJDVCAgCQkqcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmLmMKaW5kZXggNGFhYzI2ZC4uZjQ0ZDg4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmLmMKQEAgLTI1MCw3ICsyNTAsNyBAQAogI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQogCiAjaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECi1DRkdfSURFTlRJVFlfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9pZGVudGl0eSA9IHsKK3N0YXRpYyBDRkdfSURFTlRJVFlfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9pZGVudGl0eSA9IHsKIAlzaXplb2YoY2ZnX2Rydl9pZGVudGl0eSkvc2l6ZW9mKGhjZl8xNikgLSAxLCAgICAvL2xlbmd0aCBvZiBSSUQKIAlDRkdfRFJWX0lERU5USVRZLCAgICAgICAgICAgLy8gKDB4MDgyNikKIAlNU0ZfQ09NUE9ORU5UX0lELApAQCAtMjU5LDcgKzI1OSw3IEBACiAJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIKIH0gOwogCi1DRkdfUkFOR0VTX1NUUkNUIEJBU0VEIGNmZ19kcnZfc3VwX3JhbmdlID0geworc3RhdGljIENGR19SQU5HRVNfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9zdXBfcmFuZ2UgPSB7CiAJc2l6ZW9mKGNmZ19kcnZfc3VwX3JhbmdlKS9zaXplb2YoaGNmXzE2KSAtIDEsICAgLy9sZW5ndGggb2YgUklECiAJQ0ZHX0RSVl9TVVBfUkFOR0UsICAgICAgICAgIC8vICgweDA4MjcpCiAKQEAgLTI3MSw3ICsyNzEsNyBAQAogCX19CiB9IDsKIAotc3RydWN0IENGR19SQU5HRTNfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX3ByaSA9IHsKK3N0YXRpYyBzdHJ1Y3QgQ0ZHX1JBTkdFM19TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfcHJpID0gewogCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfcHJpKS9zaXplb2YoaGNmXzE2KSAtIDEsICAvL2xlbmd0aCBvZiBSSUQKIAlDRkdfRFJWX0FDVF9SQU5HRVNfUFJJLCAgICAgLy8gKDB4MDgyOCkKIApAQCAtMjg4LDcgKzI4OCw3IEBACiB9IDsKIAogCi1zdHJ1Y3QgQ0ZHX1JBTkdFNF9TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhID0geworc3RhdGljIHN0cnVjdCBDRkdfUkFOR0U0X1NUUkNUIEJBU0VEIGNmZ19kcnZfYWN0X3Jhbmdlc19zdGEgPSB7CiAJc2l6ZW9mKGNmZ19kcnZfYWN0X3Jhbmdlc19zdGEpL3NpemVvZihoY2ZfMTYpIC0gMSwgIC8vbGVuZ3RoIG9mIFJJRAogCUNGR19EUlZfQUNUX1JBTkdFU19TVEEsICAgICAvLyAoMHgwODI5KQogCkBAIC0zMzMsNyArMzMzLDcgQEAKIH0gOwogCiAKLXN0cnVjdCBDRkdfUkFOR0U2X1NUUkNUIEJBU0VEIGNmZ19kcnZfYWN0X3Jhbmdlc19oc2kgPSB7CitzdGF0aWMgc3RydWN0IENGR19SQU5HRTZfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX2hzaSA9IHsKIAlzaXplb2YoY2ZnX2Rydl9hY3RfcmFuZ2VzX2hzaSkvc2l6ZW9mKGhjZl8xNikgLSAxLCAgLy9sZW5ndGggb2YgUklECiAJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSSwgICAgIC8vICgweDA4MkEpCiAJQ09NUF9ST0xFX0FDVCwKQEAgLTM3MCw3ICszNzAsNyBAQAogfSA7CiAKIAotQ0ZHX1JBTkdFNF9TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfYXBmID0geworc3RhdGljIENGR19SQU5HRTRfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX2FwZiA9IHsKIAlzaXplb2YoY2ZnX2Rydl9hY3RfcmFuZ2VzX2FwZikvc2l6ZW9mKGhjZl8xNikgLSAxLCAgLy9sZW5ndGggb2YgUklECiAJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRiwgICAgIC8vICgweDA4MkIpCiAKQEAgLTMwOTksNyArMzA5OSw3IEBACiAjZGVmaW5lIEwgICAqcAogI2RlZmluZSBSICAgKihwKzEpCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBjYWxjX21pYyggaGNmXzMyKiBwLCBoY2ZfMzIgbSApCiB7CiAjaWYgSENGX0JJR19FTkRJQU4KQEAgLTM0MTUsNyArMzQxNSw3IEBACiAgKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50CitzdGF0aWMgaW50CiBjaGVja19taWMoIElGQlAgaWZicCApCiB7CiAJaW50ICAgICByYyA9IEhDRl9TVUNDRVNTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvc3RhX2gyLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9zdGFfaDIuYwppbmRleCAyNWFjNzZmLi4wYmE4ZGVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9zdGFfaDIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9zdGFfaDIuYwpAQCAtNDQzNSw3ICs0NDM1LDcgQEAKIAkJMDAwMCwKIAkweDAwMEYzNjhFLAkvKiBTdGFydCBleGVjdXRpb24gYWRkcmVzcyAqLwogCX0sCi0JeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwMDAwMCwgMDAwMCwgMDAwMDAwMDB9CisJeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwMDAwMCwgMDAwMCwgTlVMTH0KIH07CiAKIHN0YXRpYyBjb25zdCBDRkdfUkFOR0UyMF9TVFJDVCBmd19pbWFnZV9pbmZvY29tcGF0W10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9tYWluLmMKaW5kZXggNjUwZGVmOC4uZmM5OGI2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbWFpbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX21haW4uYwpAQCAtNzYsMzggKzc2LDIzIEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLS8vI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L3RxdWV1ZS5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLS8vICNpbmNsdWRlIDxhc20vaW8uaD4KLS8vIC8vICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogCiAjZGVmaW5lIEJJTl9ETCAwCiAjaWYgQklOX0RMCiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2VuZGlmIC8vIEJJTl9ETAorI2VuZGlmIC8qIEJJTl9ETCAqLwogCiAKICNpbmNsdWRlIDxkZWJ1Zy5oPgogCiAjaW5jbHVkZSA8aGNmLmg+CiAjaW5jbHVkZSA8ZGhmLmg+Ci0vL2luIG9yZGVyIHRvIGdldCBhcm91bmQ6OiB3bF9tYWluLmM6MjIyOTogYEhSRUdfRVZfUkRNQUQnIHVuZGVjbGFyZWQgKGZpcnN0IHVzZSBpbiB0aGlzIGZ1bmN0aW9uKQorLyogaW4gb3JkZXIgdG8gZ2V0IGFyb3VuZDo6IHdsX21haW4uYzoyMjI5OiBgSFJFR19FVl9SRE1BRCcgdW5kZWNsYXJlZCAoZmlyc3QgdXNlIGluIHRoaXMgZnVuY3Rpb24pICovCiAjaW5jbHVkZSA8aGNmZGVmLmg+CiAKICNpbmNsdWRlIDx3bF9pZi5oPgpAQCAtMTMzLDggKzExOCw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBWQUxJRF9QQVJBTShDKSBcCiAJeyBcCi0JCWlmICghKEMpKSBcCi0JCXsgXAorCQlpZiAoIShDKSkgeyBcCiAJCQlwcmludGsoS0VSTl9JTkZPICJXaXJlbGVzcywgcGFyYW1ldGVyIGVycm9yOiBcIiVzXCJcbiIsICNDKTsgXAogCQkJZ290byBmYWlsZWQ7IFwKIAkJfSBcCkBAIC0xNDIsNyArMTI2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKglsb2NhbCBmdW5jdGlvbnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHdsX2lzcl9oYW5kbGVyKCB1bnNpZ25lZCBsb25nIHAgKTsKK3ZvaWQgd2xfaXNyX2hhbmRsZXIodW5zaWduZWQgbG9uZyBwKTsKIAogI2lmIDAgLy9TQ1VMTF9VU0VfUFJPQyAvKiBkb24ndCB3YXN0ZSBzcGFjZSBpZiB1bnVzZWQgKi8KIHN0YXRpYyBpbnQgc2N1bGxfcmVhZF9wcm9jbWVtKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdik7CkBAIC0xNjgsNyArMTUyLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBtb2R1bGUgcGFyYW1ldGVyIGRlZmluaXRpb25zIC0gc2V0IHdpdGggJ2luc21vZCcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgcF91MTYgICAgaXJxX21hc2sgICAgICAgICAgICAgICAgPSAweGRlYjg7IC8vIElSUTMsNCw1LDcsOSwxMCwxMSwxMiwxNCwxNQorc3RhdGljIHBfdTE2ICAgIGlycV9tYXNrICAgICAgICAgICAgICAgID0gMHhkZWI4OyAvKiBJUlEzLDQsNSw3LDksMTAsMTEsMTIsMTQsMTUgKi8KIHN0YXRpYyBwX3M4ICAgICBpcnFfbGlzdFs0XSAgICAgICAgICAgICA9IHsgLTEgfTsKIAogI2lmIDAKQEAgLTE4Myw3ICsxNjcsNyBAQAogc3RhdGljIHBfdTE2ICAgIFBBUk1fQlJTQ18yR0haICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9CUlNDXzJHSFo7CiBzdGF0aWMgcF91MTYgICAgUEFSTV9CUlNDXzVHSFogICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX0JSU0NfNUdIWjsKIHN0YXRpYyBwX3UxNiAgICBQQVJNX0NPRVhJU1RFTkNFICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfQ09FWElTVEVOQ0U7Ci1zdGF0aWMgcF91MTYgICAgUEFSTV9DT05ORUNUSU9OX0NPTlRST0wgICAgCT0gUEFSTV9ERUZBVUxUX0NPTk5FQ1RJT05fQ09OVFJPTDsgIC8vOz9yZW5hbWUgYW5kIG1vdmUKK3N0YXRpYyBwX3UxNiAgICBQQVJNX0NPTk5FQ1RJT05fQ09OVFJPTCAgIAk9IFBBUk1fREVGQVVMVF9DT05ORUNUSU9OX0NPTlRST0w7ICAvKiA7P3JlbmFtZSBhbmQgbW92ZSAqLwogc3RhdGljIHBfY2hhciAgKlBBUk1fQ1JFQVRFX0lCU1MgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9DUkVBVEVfSUJTU19TVFI7CiBzdGF0aWMgcF9jaGFyICAqUEFSTV9ERVNJUkVEX1NTSUQgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1NTSUQ7CiBzdGF0aWMgcF9jaGFyICAqUEFSTV9ET1dOTE9BRF9GSVJNV0FSRSAgICAgID0gIiI7CkBAIC0yMjAsNyArMjA0LDcgQEAKIHN0YXRpYyBwX3UxNiAgICBQQVJNX1JUU19USFJFU0hPTEQ0ICAgICAgICAJPSBQQVJNX0RFRkFVTFRfUlRTX1RIUkVTSE9MRDsKIHN0YXRpYyBwX3UxNiAgICBQQVJNX1JUU19USFJFU0hPTEQ1ICAgICAgICAJPSBQQVJNX0RFRkFVTFRfUlRTX1RIUkVTSE9MRDsKIHN0YXRpYyBwX3UxNiAgICBQQVJNX1JUU19USFJFU0hPTEQ2ICAgICAgICAJPSBQQVJNX0RFRkFVTFRfUlRTX1RIUkVTSE9MRDsKLSNlbmRpZiAvLyBVU0VfV0RTCisjZW5kaWYgLyogVVNFX1dEUyAqLwogc3RhdGljIHBfdTE2ICAgIFBBUk1fUlRTX1RIUkVTSE9MRCAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9SVFNfVEhSRVNIT0xEOwogc3RhdGljIHBfdTE2ICAgIFBBUk1fU1JTQ18yR0haICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9TUlNDXzJHSFo7CiBzdGF0aWMgcF91MTYgICAgUEFSTV9TUlNDXzVHSFogICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1NSU0NfNUdIWjsKQEAgLTIzNCw3ICsyMTgsNyBAQAogc3RhdGljIHBfdTE2ICAgIFBBUk1fVFhfUkFURTQgICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9UWF9SQVRFXzJHSFo7CiBzdGF0aWMgcF91MTYgICAgUEFSTV9UWF9SQVRFNSAgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1RYX1JBVEVfMkdIWjsKIHN0YXRpYyBwX3UxNiAgICBQQVJNX1RYX1JBVEU2ICAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfVFhfUkFURV8yR0haOwotI2VuZGlmIC8vIFVTRV9XRFMKKyNlbmRpZiAvKiBVU0VfV0RTICovCiBzdGF0aWMgcF91MTYgICAgUEFSTV9UWF9SQVRFICAgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1RYX1JBVEVfMkdIWjsKICNpZmRlZiBVU0VfV0RTCiBzdGF0aWMgcF91OCAgICAgUEFSTV9XRFNfQUREUkVTUzFbRVRIX0FMRU5dCT0gUEFSTV9ERUZBVUxUX05FVFdPUktfQUREUjsKQEAgLTI0Myw3ICsyMjcsNyBAQAogc3RhdGljIHBfdTggICAgIFBBUk1fV0RTX0FERFJFU1M0W0VUSF9BTEVOXQk9IFBBUk1fREVGQVVMVF9ORVRXT1JLX0FERFI7CiBzdGF0aWMgcF91OCAgICAgUEFSTV9XRFNfQUREUkVTUzVbRVRIX0FMRU5dCT0gUEFSTV9ERUZBVUxUX05FVFdPUktfQUREUjsKIHN0YXRpYyBwX3U4ICAgICBQQVJNX1dEU19BRERSRVNTNltFVEhfQUxFTl0JPSBQQVJNX0RFRkFVTFRfTkVUV09SS19BRERSOwotI2VuZGlmIC8vIFVTRV9XRFMKKyNlbmRpZiAvKiBVU0VfV0RTICovCiAKIAogI2lmIDAKQEAgLTI5OSwzOSArMjgzLDQxIEBACiBNT0RVTEVfUEFSTV9ERVNDKFBBUk1fQlJTQ18yR0haLCAgICAgICAgICAgICAgICAiQmFzaWMgUmF0ZSBTZXQgQ29udHJvbCAyLjQgR0h6Iik7CiBNT0RVTEVfUEFSTShQQVJNX0JSU0NfNUdIWiwgICAgICAgICAgICAgImIiKTsKIE1PRFVMRV9QQVJNX0RFU0MoUEFSTV9CUlNDXzVHSFosICAgICAgICAgICAgICAgICJCYXNpYyBSYXRlIFNldCBDb250cm9sIDUuMCBHSHoiKTsKLSNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQotLy87P3NlZW1zIHJlYXNvbmFibGUgdGhhdCBldmVuIGFuIEFQLW9ubHkgZHJpdmVyIGNvdWxkIGFmZm9yZCB0aGlzIHNtYWxsIGFkZGl0aW9uYWwgZm9vdHByaW50CisjaWYgMSAvKiAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBICovCisvKiA7P3NlZW1zIHJlYXNvbmFibGUgdGhhdCBldmVuIGFuIEFQLW9ubHkgZHJpdmVyIGNvdWxkIGFmZm9yZCB0aGlzIHNtYWxsIGFkZGl0aW9uYWwgZm9vdHByaW50ICovCiBNT0RVTEVfUEFSTShQQVJNX1BNX0VOQUJMRUQsICAgICAgICAgICAgImgiKTsKIE1PRFVMRV9QQVJNX0RFU0MoUEFSTV9QTV9FTkFCTEVELCAgICAgICAgICAgICAgICJQb3dlciBNYW5hZ2VtZW50IFN0YXRlICgwIC0gMiwgODAwMSAtIDgwMDIpIFswXSIpOwogTU9EVUxFX1BBUk0oUEFSTV9QT1JUX1RZUEUsICAgICAgICAgICAgICJiIik7CiBNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUE9SVF9UWVBFLCAgICAgICAgICAgICAgICAiUG9ydCBUeXBlICgxIC0gMykgWzFdIik7Ci0vLzs/TU9EVUxFX1BBUk0oUEFSTV9DUkVBVEVfSUJTUywgICAgICAgICAgICJzIik7Ci0vLzs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX0NSRUFURV9JQlNTLCAgICAgICAgICAgICAgIkNyZWF0ZSBJQlNTICg8c3RyaW5nPiBOIG9yIFkpIFtOXSIpOwotLy87P01PRFVMRV9QQVJNKFBBUk1fTVVMVElDQVNUX1JYLCAgICAgICAgICAicyIpOwotLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9NVUxUSUNBU1RfUlgsICAgICAgICAgICAgICJNdWx0aWNhc3QgUmVjZWl2ZSBFbmFibGUgKDxzdHJpbmc+IE4gb3IgWSkgW1ldIik7Ci0vLzs/TU9EVUxFX1BBUk0oUEFSTV9NQVhfU0xFRVAsICAgICAgICAgICAgICJoIik7Ci0vLzs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX01BWF9TTEVFUCwgICAgICAgICAgICAgICAgIk1heGltdW0gUG93ZXIgTWFuYWdlbWVudCBTbGVlcCBEdXJhdGlvbiAoMCAtIDY1NTM1KSBbMTAwXSIpOwotLy87P01PRFVMRV9QQVJNKFBBUk1fTkVUV09SS19BRERSLCAgICAgICAgICAiNmIiKTsKLS8vOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fTkVUV09SS19BRERSLCAgICAgICAgICAgICAiSGFyZHdhcmUgRXRoZXJuZXQgQWRkcmVzcyAoWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0pIFs8ZmFjdG9yeSB2YWx1ZT5dIik7Ci0vLzs/TU9EVUxFX1BBUk0oUEFSTV9BVVRIRU5USUNBVElPTiwgICAgICAgICJiIik7Ci0vLwotLy90cmFja2VyIDEyNDQ4Ci0vLzs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX0FVVEhFTlRJQ0FUSU9OLCAgICAgICAgICAgIkF1dGhlbnRpY2F0aW9uIFR5cGUgKDAtMikgWzBdIDA9T3BlbiAxPVNoYXJlZEtleSAyPUxFQVAiKTsKLS8vOz9NT0RVTEVfUEFSTV9ERVNDKGF1dGhlbnRpY2F0aW9uLCAgICAgICAgICJBdXRoZW50aWNhdGlvbiBUeXBlICgxLTIpIFsxXSAxPU9wZW4gMj1TaGFyZWRLZXkiKTsKLS8vdHJhY2tlciAxMjQ0OAotLy8KLS8vOz9NT0RVTEVfUEFSTShQQVJNX09XTl9BVElNX1dJTkRPVywgICAgICAgImIiKTsKLS8vOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fT1dOX0FUSU1fV0lORE9XLCAgICAgICAgICAiQVRJTSBXaW5kb3cgdGltZSBpbiBUVSBmb3IgSUJTUyBjcmVhdGlvbiAoMC0xMDApIFswXSIpOwotLy87P01PRFVMRV9QQVJNKFBBUk1fUE1fSE9MRE9WRVJfRFVSQVRJT04sICAiYiIpOwotLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9QTV9IT0xET1ZFUl9EVVJBVElPTiwgICAgICJUaW1lIHN0YXRpb24gcmVtYWlucyBhd2FrZSBhZnRlciBNQUMgZnJhbWUgdHJhbnNmZXIgd2hlbiBQTSBpcyBvbiAoMC02NTUzNSkgWzEwMF0iKTsKLS8vOz9NT0RVTEVfUEFSTShQQVJNX1BST01JU0NVT1VTX01PREUsICAgICAgInMiKTsKLS8vOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fUFJPTUlTQ1VPVVNfTU9ERSwgICAgICAgICAiUHJvbWlzY3VvdXMgTW9kZSBFbmFibGUgKDxzdHJpbmc+IFkgb3IgTiApIFtOXSIgKTsKLS8vOz8KKy8qCisgKiA7P01PRFVMRV9QQVJNKFBBUk1fQ1JFQVRFX0lCU1MsICAgICAgICAgICAicyIpOworICo7P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9DUkVBVEVfSUJTUywgICAgICAgICAgICAgICJDcmVhdGUgSUJTUyAoPHN0cmluZz4gTiBvciBZKSBbTl0iKTsKKyAqOz9NT0RVTEVfUEFSTShQQVJNX01VTFRJQ0FTVF9SWCwgICAgICAgICAgInMiKTsKKyAqOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fTVVMVElDQVNUX1JYLCAgICAgICAgICAgICAiTXVsdGljYXN0IFJlY2VpdmUgRW5hYmxlICg8c3RyaW5nPiBOIG9yIFkpIFtZXSIpOworICo7P01PRFVMRV9QQVJNKFBBUk1fTUFYX1NMRUVQLCAgICAgICAgICAgICAiaCIpOworICo7P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9NQVhfU0xFRVAsICAgICAgICAgICAgICAgICJNYXhpbXVtIFBvd2VyIE1hbmFnZW1lbnQgU2xlZXAgRHVyYXRpb24gKDAgLSA2NTUzNSkgWzEwMF0iKTsKKyAqOz9NT0RVTEVfUEFSTShQQVJNX05FVFdPUktfQUREUiwgICAgICAgICAgIjZiIik7CisgKjs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX05FVFdPUktfQUREUiwgICAgICAgICAgICAgIkhhcmR3YXJlIEV0aGVybmV0IEFkZHJlc3MgKFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdKSBbPGZhY3RvcnkgdmFsdWU+XSIpOworICo7P01PRFVMRV9QQVJNKFBBUk1fQVVUSEVOVElDQVRJT04sICAgICAgICAiYiIpOworICoKKyAqdHJhY2tlciAxMjQ0OAorICo7P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9BVVRIRU5USUNBVElPTiwgICAgICAgICAgICJBdXRoZW50aWNhdGlvbiBUeXBlICgwLTIpIFswXSAwPU9wZW4gMT1TaGFyZWRLZXkgMj1MRUFQIik7CisgKjs/TU9EVUxFX1BBUk1fREVTQyhhdXRoZW50aWNhdGlvbiwgICAgICAgICAiQXV0aGVudGljYXRpb24gVHlwZSAoMS0yKSBbMV0gMT1PcGVuIDI9U2hhcmVkS2V5Iik7CisgKnRyYWNrZXIgMTI0NDgKKyAqCisgKjs/TU9EVUxFX1BBUk0oUEFSTV9PV05fQVRJTV9XSU5ET1csICAgICAgICJiIik7CisgKjs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX09XTl9BVElNX1dJTkRPVywgICAgICAgICAgIkFUSU0gV2luZG93IHRpbWUgaW4gVFUgZm9yIElCU1MgY3JlYXRpb24gKDAtMTAwKSBbMF0iKTsKKyAqOz9NT0RVTEVfUEFSTShQQVJNX1BNX0hPTERPVkVSX0RVUkFUSU9OLCAgImIiKTsKKyAqOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fUE1fSE9MRE9WRVJfRFVSQVRJT04sICAgICAiVGltZSBzdGF0aW9uIHJlbWFpbnMgYXdha2UgYWZ0ZXIgTUFDIGZyYW1lIHRyYW5zZmVyIHdoZW4gUE0gaXMgb24gKDAtNjU1MzUpIFsxMDBdIik7CisgKjs/TU9EVUxFX1BBUk0oUEFSTV9QUk9NSVNDVU9VU19NT0RFLCAgICAgICJzIik7CisgKjs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX1BST01JU0NVT1VTX01PREUsICAgICAgICAgIlByb21pc2N1b3VzIE1vZGUgRW5hYmxlICg8c3RyaW5nPiBZIG9yIE4gKSBbTl0iICk7CisgKjs/CisgKi8KIE1PRFVMRV9QQVJNKFBBUk1fQ09OTkVDVElPTl9DT05UUk9MLCAgICAiYiIpOwogTU9EVUxFX1BBUk1fREVTQyhQQVJNX0NPTk5FQ1RJT05fQ09OVFJPTCwgICAgICAgIkNvbm5lY3Rpb24gQ29udHJvbCAoMCAtIDMpIFsyXSIpOwogI2VuZGlmIC8qIEhDRl9TVEEgKi8KLSNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCi0JCQkJCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAorI2lmIDEgLyogOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQICovCisJCQkJCS8qIDs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQgKi8KIE1PRFVMRV9QQVJNKFBBUk1fT1dOX0RUSU1fUEVSSU9ELCAgICAgICAiYiIpOwogTU9EVUxFX1BBUk1fREVTQyhQQVJNX09XTl9EVElNX1BFUklPRCwgICAgICAgICAgIkRUSU0gUGVyaW9kICgwIC0gMjU1KSBbMV0iKTsKIE1PRFVMRV9QQVJNKFBBUk1fUkVKRUNUX0FOWSwgICAgICAgICAgICAicyIpOwpAQCAtMzk0LDExICszODAsMTIgQEAKICNpZiBEQkcKIAogc3RhdGljIHBfdTMyICAgIHBjX2RlYnVnID0gREJHX0xWTDsKLS8vTU9EVUxFX1BBUk0ocGNfZGVidWcsICJpIik7Ci0vKnN0YXRpYyA7P2NvbmZsaWN0cyB3aXRoIG15IHVuZGVyc3RhbmRpbmcgb2YgQ0wgcGFyYW1ldGVycyBhbmQgYnJlYWtzIG5vdyBJIG1vdmVkCisvKgorICogTU9EVUxFX1BBUk0ocGNfZGVidWcsICJpIik7CisgKnN0YXRpYyA7P2NvbmZsaWN0cyB3aXRoIG15IHVuZGVyc3RhbmRpbmcgb2YgQ0wgcGFyYW1ldGVycyBhbmQgYnJlYWtzIG5vdyBJIG1vdmVkCiAgKiB0aGUgY29ycmVzcG9uZGlnIGxvZ2ljIHRvIHdsX3Byb2ZpbGUKLSAqLyBwX3UzMiAgICBEZWJ1Z0ZsYWcgPSB+MDsgLy9yZWNvZ25pemFibGUgInVuZGVmaW5lZCB2YWx1ZSIgcmF0aGVyIHRoZW4gREJHX0RFRkFVTFRTOwotLy9NT0RVTEVfUEFSTShEZWJ1Z0ZsYWcsICJsIik7CisgKi8gcF91MzIgICAgRGVidWdGbGFnID0gfjA7IC8qIHJlY29nbml6YWJsZSAidW5kZWZpbmVkIHZhbHVlIiByYXRoZXIgdGhlbiBEQkdfREVGQVVMVFM7ICovCisvKiBNT0RVTEVfUEFSTShEZWJ1Z0ZsYWcsICJsIik7ICovCiAKIHN0YXRpYyBzdHJ1Y3QgZGJnX2luZm8gd2xfaW5mbyA9IHsgS0JVSUxEX01PRE5BTUUsIDAsIDAgfTsKIHN0cnVjdCBkYmdfaW5mbyAqRGJnSW5mbyA9ICZ3bF9pbmZvOwpAQCAtNDA3LDggKzM5NCw4IEBACiAjaWZkZWYgVVNFX1JUUwogCiBzdGF0aWMgcF9jaGFyICAqdXNlUlRTID0gIk4iOwotTU9EVUxFX1BBUk0oIHVzZVJUUywgInMiICk7Ci1NT0RVTEVfUEFSTV9ERVNDKCB1c2VSVFMsICJVc2UgUlRTIHRlc3QgaW50ZXJmYWNlICg8c3RyaW5nPiBOIG9yIFkpIFtOXSIgKTsKK01PRFVMRV9QQVJNKHVzZVJUUywgInMiKTsKK01PRFVMRV9QQVJNX0RFU0ModXNlUlRTLCAiVXNlIFJUUyB0ZXN0IGludGVyZmFjZSAoPHN0cmluZz4gTiBvciBZKSBbTl0iKTsKIAogI2VuZGlmICAvKiBVU0VfUlRTICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDI3LDcgKzQxNCw3IEBACiAjZW5kaWYgLyogSENGX1NUQSAqLwogCiAKLWludCB3bF9pbnNlcnQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoraW50IHdsX2luc2VydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWludCAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgaGNmX3N0YXR1cyA9IEhDRl9TVUNDRVNTOwpAQCAtNDM2LDEwICs0MjMsMTAgQEAKIAlzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSB3bF9wcml2KGRldik7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBhZGFwdGVyIGhhcmR3YXJlLiAqLwotCW1lbXNldCggJiggbHAtPmhjZkN0eCApLCAwLCBzaXplb2YoIElGQl9TVFJDVCApKTsKKwltZW1zZXQoJihscC0+aGNmQ3R4KSwgMCwgc2l6ZW9mKElGQl9TVFJDVCkpOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgYWRhcHRlciBwYXJhbWV0ZXJzLiAqLwotCXNwaW5fbG9ja19pbml0KCAmKCBscC0+c2xvY2sgKSk7CisJc3Bpbl9sb2NrX2luaXQoJihscC0+c2xvY2spKTsKIAogCS8qIEluaXRpYWxpemUgc3RhdGVzICovCiAJLy9scC0+bG9ja2NvdW50ID0gMDsgLy9QRTFETk4KQEAgLTQ0OCwzMSArNDM1LDMxIEBACiAKIAlscC0+ZGV2ID0gZGV2OwogCi0JREJHX1BBUkFNKCBEYmdJbmZvLCAiaXJxX21hc2siLCAiMHglMDR4IiwgaXJxX21hc2sgJiAweDBGRkZGICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCAiaXJxX2xpc3QiLCAiMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4IiwKKwlEQkdfUEFSQU0oRGJnSW5mbywgImlycV9tYXNrIiwgIjB4JTA0eCIsIGlycV9tYXNrICYgMHgwRkZGRik7CisJREJHX1BBUkFNKERiZ0luZm8sICJpcnFfbGlzdCIsICIweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMngiLAogCQkJICAgaXJxX2xpc3RbMF0gJiAweDBGRiwgaXJxX2xpc3RbMV0gJiAweDBGRiwKLQkJCSAgIGlycV9saXN0WzJdICYgMHgwRkYsIGlycV9saXN0WzNdICYgMHgwRkYgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9ERVNJUkVEX1NTSUQsICJcIiVzXCIiLCBQQVJNX0RFU0lSRURfU1NJRCApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX09XTl9TU0lELCAiXCIlc1wiIiwgUEFSTV9PV05fU1NJRCApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX09XTl9DSEFOTkVMLCAiJWQiLCBQQVJNX09XTl9DSEFOTkVMKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9TWVNURU1fU0NBTEUsICIlZCIsIFBBUk1fU1lTVEVNX1NDQUxFICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURSwgIiVkIiwgUEFSTV9UWF9SQVRFICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRCwgIiVkIiwgUEFSTV9SVFNfVEhSRVNIT0xEICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfTUlDUk9XQVZFX1JPQlVTVE5FU1MsICJcIiVzXCIiLCBQQVJNX01JQ1JPV0FWRV9ST0JVU1RORVNTICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfT1dOX05BTUUsICJcIiVzXCIiLCBQQVJNX09XTl9OQU1FICk7CisJCQkgICBpcnFfbGlzdFsyXSAmIDB4MEZGLCBpcnFfbGlzdFszXSAmIDB4MEZGKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX0RFU0lSRURfU1NJRCwgIlwiJXNcIiIsIFBBUk1fREVTSVJFRF9TU0lEKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX09XTl9TU0lELCAiXCIlc1wiIiwgUEFSTV9PV05fU1NJRCk7CisJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9PV05fQ0hBTk5FTCwgIiVkIiwgUEFSTV9PV05fQ0hBTk5FTCk7CisJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9TWVNURU1fU0NBTEUsICIlZCIsIFBBUk1fU1lTVEVNX1NDQUxFKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEUsICIlZCIsIFBBUk1fVFhfUkFURSk7CisJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xELCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfTUlDUk9XQVZFX1JPQlVTVE5FU1MsICJcIiVzXCIiLCBQQVJNX01JQ1JPV0FWRV9ST0JVU1RORVNTKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX09XTl9OQU1FLCAiXCIlc1wiIiwgUEFSTV9PV05fTkFNRSk7CiAvLzs/CQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9FTkFCTEVfRU5DUllQVElPTiwgIlwiJXNcIiIsIFBBUk1fRU5BQkxFX0VOQ1JZUFRJT04gKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9LRVkxLCAiXCIlc1wiIiwgUEFSTV9LRVkxICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfS0VZMiwgIlwiJXNcIiIsIFBBUk1fS0VZMiApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0tFWTMsICJcIiVzXCIiLCBQQVJNX0tFWTMgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9LRVk0LCAiXCIlc1wiIiwgUEFSTV9LRVk0ICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfS0VZLCAiJWQiLCBQQVJNX1RYX0tFWSApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX01VTFRJQ0FTVF9SQVRFLCAiJWQiLCBQQVJNX01VTFRJQ0FTVF9SQVRFICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfRE9XTkxPQURfRklSTVdBUkUsICJcIiVzXCIiLCBQQVJNX0RPV05MT0FEX0ZJUk1XQVJFICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfQVVUSF9LRVlfTUdNVF9TVUlURSwgIiVkIiwgUEFSTV9BVVRIX0tFWV9NR01UX1NVSVRFICk7CisJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9LRVkxLCAiXCIlc1wiIiwgUEFSTV9LRVkxKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX0tFWTIsICJcIiVzXCIiLCBQQVJNX0tFWTIpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfS0VZMywgIlwiJXNcIiIsIFBBUk1fS0VZMyk7CisJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9LRVk0LCAiXCIlc1wiIiwgUEFSTV9LRVk0KTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1RYX0tFWSwgIiVkIiwgUEFSTV9UWF9LRVkpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfTVVMVElDQVNUX1JBVEUsICIlZCIsIFBBUk1fTVVMVElDQVNUX1JBVEUpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfRE9XTkxPQURfRklSTVdBUkUsICJcIiVzXCIiLCBQQVJNX0RPV05MT0FEX0ZJUk1XQVJFKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX0FVVEhfS0VZX01HTVRfU1VJVEUsICIlZCIsIFBBUk1fQVVUSF9LRVlfTUdNVF9TVUlURSk7CiAvLzs/I2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEKIAkJCQkJLy87P3Nob3VsZCB3ZSBtYWtlIHRoaXMgY29kZSBjb25kaXRpb25hbCBkZXBlbmRpbmcgb24gaW4gU1RBIG1vZGUKIC8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1BPUlRfVFlQRSwgIiVkIiwgUEFSTV9QT1JUX1RZUEUgKTsKLQkJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUE1fRU5BQkxFRCwgIiUwNHgiLCBQQVJNX1BNX0VOQUJMRUQgKTsKKwkJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9QTV9FTkFCTEVELCAiJTA0eCIsIFBBUk1fUE1fRU5BQkxFRCk7CiAvLzs/ICAgICAgICBEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9DUkVBVEVfSUJTUywgIlwiJXNcIiIsIFBBUk1fQ1JFQVRFX0lCU1MgKTsKIC8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX01VTFRJQ0FTVF9SWCwgIlwiJXNcIiIsIFBBUk1fTVVMVElDQVNUX1JYICk7CiAvLzs/ICAgICAgICBEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9NQVhfU0xFRVAsICIlZCIsIFBBUk1fTUFYX1NMRUVQICk7CkBAIC00ODgsMjQgKzQ3NSwyNCBAQAogI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKIAkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CiAJCS8vOz9JIGd1ZXNzOiBubywgc2luY2UgdGhpcyBpcyBEZWJ1ZyBtb2RlIG9ubHkKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9PV05fRFRJTV9QRVJJT0QsICIlZCIsIFBBUk1fT1dOX0RUSU1fUEVSSU9EICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUkVKRUNUX0FOWSwgIlwiJXNcIiIsIFBBUk1fUkVKRUNUX0FOWSApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0VYQ0xVREVfVU5FTkNSWVBURUQsICJcIiVzXCIiLCBQQVJNX0VYQ0xVREVfVU5FTkNSWVBURUQgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HLCAiXCIlc1wiIiwgUEFSTV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfSU5UUkFfQlNTX1JFTEFZLCAiXCIlc1wiIiwgUEFSTV9JTlRSQV9CU1NfUkVMQVkgKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX09XTl9EVElNX1BFUklPRCwgIiVkIiwgUEFSTV9PV05fRFRJTV9QRVJJT0QpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfUkVKRUNUX0FOWSwgIlwiJXNcIiIsIFBBUk1fUkVKRUNUX0FOWSk7CisJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9FWENMVURFX1VORU5DUllQVEVELCAiXCIlc1wiIiwgUEFSTV9FWENMVURFX1VORU5DUllQVEVEKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcsICJcIiVzXCIiLCBQQVJNX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfSU5UUkFfQlNTX1JFTEFZLCAiXCIlc1wiIiwgUEFSTV9JTlRSQV9CU1NfUkVMQVkpOwogI2lmZGVmIFVTRV9XRFMKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMSwgIiVkIiwgUEFSTV9SVFNfVEhSRVNIT0xEMSApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQyLCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQyICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDMsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDMgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENCwgIiVkIiwgUEFSTV9SVFNfVEhSRVNIT0xENCApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ1LCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQ1ICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDYsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDYgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9SQVRFMSwgIiVkIiwgUEFSTV9UWF9SQVRFMSApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEUyLCAiJWQiLCBQQVJNX1RYX1JBVEUyICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTMsICIlZCIsIFBBUk1fVFhfUkFURTMgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9SQVRFNCwgIiVkIiwgUEFSTV9UWF9SQVRFNCApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEU1LCAiJWQiLCBQQVJNX1RYX1JBVEU1ICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTYsICIlZCIsIFBBUk1fVFhfUkFURTYgKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQxLCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQxKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQyLCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQyKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQzLCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQzKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ0LCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQ0KTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ1LCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQ1KTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ2LCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQ2KTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEUxLCAiJWQiLCBQQVJNX1RYX1JBVEUxKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEUyLCAiJWQiLCBQQVJNX1RYX1JBVEUyKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEUzLCAiJWQiLCBQQVJNX1RYX1JBVEUzKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEU0LCAiJWQiLCBQQVJNX1RYX1JBVEU0KTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEU1LCAiJWQiLCBQQVJNX1RYX1JBVEU1KTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEU2LCAiJWQiLCBQQVJNX1RYX1JBVEU2KTsKIAlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1dEU19BRERSRVNTMSwgIlwiJXBNXCIiLAogCQkJUEFSTV9XRFNfQUREUkVTUzEpOwogCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfV0RTX0FERFJFU1MyLCAiXCIlcE1cIiIsCkBAIC01MjEsMjggKzUwOCwyOCBAQAogI2VuZGlmIC8qIFVTRV9XRFMgKi8KICNlbmRpZiAvKiBIQ0ZfQVAgKi8KIAotCVZBTElEX1BBUkFNKCAhUEFSTV9ERVNJUkVEX1NTSUQgfHwgKCBzdHJsZW4oIFBBUk1fREVTSVJFRF9TU0lEICkgPD0gUEFSTV9NQVhfTkFNRV9MRU4gKSk7Ci0JVkFMSURfUEFSQU0oICFQQVJNX09XTl9TU0lEIHx8ICggc3RybGVuKCBQQVJNX09XTl9TU0lEICkgPD0gUEFSTV9NQVhfTkFNRV9MRU4gKSk7Ci0JVkFMSURfUEFSQU0oKCBQQVJNX09XTl9DSEFOTkVMIDw9IFBBUk1fTUFYX09XTl9DSEFOTkVMICkpOwotCVZBTElEX1BBUkFNKCggUEFSTV9TWVNURU1fU0NBTEUgPj0gUEFSTV9NSU5fU1lTVEVNX1NDQUxFICkgJiYgKCBQQVJNX1NZU1RFTV9TQ0FMRSA8PSBQQVJNX01BWF9TWVNURU1fU0NBTEUgKSk7Ci0JVkFMSURfUEFSQU0oKCBQQVJNX1RYX1JBVEUgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggUEFSTV9UWF9SQVRFIDw9IFBBUk1fTUFYX1RYX1JBVEUgKSk7Ci0JVkFMSURfUEFSQU0oKCBQQVJNX1JUU19USFJFU0hPTEQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKTsKLQlWQUxJRF9QQVJBTSggIVBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1MgfHwgc3RyY2hyKCAiTm5ZeSIsIFBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1NbMF0gKSAhPSBOVUxMICk7Ci0JVkFMSURfUEFSQU0oICFQQVJNX09XTl9OQU1FIHx8ICggc3RybGVuKCBQQVJNX05BTUVfT1dOX05BTUUgKSA8PSBQQVJNX01BWF9OQU1FX0xFTiApKTsKLQlWQUxJRF9QQVJBTSgoIFBBUk1fRU5BQkxFX0VOQ1JZUFRJT04gPD0gUEFSTV9NQVhfRU5BQkxFX0VOQ1JZUFRJT04gKSk7Ci0JVkFMSURfUEFSQU0oIGlzX3ZhbGlkX2tleV9zdHJpbmcoIFBBUk1fS0VZMSApKTsKLQlWQUxJRF9QQVJBTSggaXNfdmFsaWRfa2V5X3N0cmluZyggUEFSTV9LRVkyICkpOwotCVZBTElEX1BBUkFNKCBpc192YWxpZF9rZXlfc3RyaW5nKCBQQVJNX0tFWTMgKSk7Ci0JVkFMSURfUEFSQU0oIGlzX3ZhbGlkX2tleV9zdHJpbmcoIFBBUk1fS0VZNCApKTsKLQlWQUxJRF9QQVJBTSgoIFBBUk1fVFhfS0VZID49IFBBUk1fTUlOX1RYX0tFWSApICYmICggUEFSTV9UWF9LRVkgPD0gUEFSTV9NQVhfVFhfS0VZICkpOworCVZBTElEX1BBUkFNKCFQQVJNX0RFU0lSRURfU1NJRCB8fCAoc3RybGVuKFBBUk1fREVTSVJFRF9TU0lEKSA8PSBQQVJNX01BWF9OQU1FX0xFTikpOworCVZBTElEX1BBUkFNKCFQQVJNX09XTl9TU0lEIHx8IChzdHJsZW4oUEFSTV9PV05fU1NJRCkgPD0gUEFSTV9NQVhfTkFNRV9MRU4pKTsKKwlWQUxJRF9QQVJBTSgoUEFSTV9PV05fQ0hBTk5FTCA8PSBQQVJNX01BWF9PV05fQ0hBTk5FTCkpOworCVZBTElEX1BBUkFNKChQQVJNX1NZU1RFTV9TQ0FMRSA+PSBQQVJNX01JTl9TWVNURU1fU0NBTEUpICYmIChQQVJNX1NZU1RFTV9TQ0FMRSA8PSBQQVJNX01BWF9TWVNURU1fU0NBTEUpKTsKKwlWQUxJRF9QQVJBTSgoUEFSTV9UWF9SQVRFID49IFBBUk1fTUlOX1RYX1JBVEUpICYmIChQQVJNX1RYX1JBVEUgPD0gUEFSTV9NQVhfVFhfUkFURSkpOworCVZBTElEX1BBUkFNKChQQVJNX1JUU19USFJFU0hPTEQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCkpOworCVZBTElEX1BBUkFNKCFQQVJNX01JQ1JPV0FWRV9ST0JVU1RORVNTIHx8IHN0cmNocigiTm5ZeSIsIFBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1NbMF0pICE9IE5VTEwpOworCVZBTElEX1BBUkFNKCFQQVJNX09XTl9OQU1FIHx8IChzdHJsZW4oUEFSTV9OQU1FX09XTl9OQU1FKSA8PSBQQVJNX01BWF9OQU1FX0xFTikpOworCVZBTElEX1BBUkFNKChQQVJNX0VOQUJMRV9FTkNSWVBUSU9OIDw9IFBBUk1fTUFYX0VOQUJMRV9FTkNSWVBUSU9OKSk7CisJVkFMSURfUEFSQU0oaXNfdmFsaWRfa2V5X3N0cmluZyhQQVJNX0tFWTEpKTsKKwlWQUxJRF9QQVJBTShpc192YWxpZF9rZXlfc3RyaW5nKFBBUk1fS0VZMikpOworCVZBTElEX1BBUkFNKGlzX3ZhbGlkX2tleV9zdHJpbmcoUEFSTV9LRVkzKSk7CisJVkFMSURfUEFSQU0oaXNfdmFsaWRfa2V5X3N0cmluZyhQQVJNX0tFWTQpKTsKKwlWQUxJRF9QQVJBTSgoUEFSTV9UWF9LRVkgPj0gUEFSTV9NSU5fVFhfS0VZKSAmJiAoUEFSTV9UWF9LRVkgPD0gUEFSTV9NQVhfVFhfS0VZKSk7CiAKLQlWQUxJRF9QQVJBTSgoIFBBUk1fTVVMVElDQVNUX1JBVEUgPj0gUEFSTV9NSU5fTVVMVElDQVNUX1JBVEUgKSAmJgotCQkJCQkoIFBBUk1fTVVMVElDQVNUX1JBVEUgPD0gUEFSTV9NQVhfTVVMVElDQVNUX1JBVEUgKSk7CisJVkFMSURfUEFSQU0oKFBBUk1fTVVMVElDQVNUX1JBVEUgPj0gUEFSTV9NSU5fTVVMVElDQVNUX1JBVEUpICYmCisJCQkJCShQQVJNX01VTFRJQ0FTVF9SQVRFIDw9IFBBUk1fTUFYX01VTFRJQ0FTVF9SQVRFKSk7CiAKLQlWQUxJRF9QQVJBTSggIVBBUk1fRE9XTkxPQURfRklSTVdBUkUgfHwgKCBzdHJsZW4oIFBBUk1fRE9XTkxPQURfRklSTVdBUkUgKSA8PSAyNTUgLyo7PyovICkpOwotCVZBTElEX1BBUkFNKCggUEFSTV9BVVRIX0tFWV9NR01UX1NVSVRFIDwgUEFSTV9NQVhfQVVUSF9LRVlfTUdNVF9TVUlURSApKTsKKwlWQUxJRF9QQVJBTSghUEFSTV9ET1dOTE9BRF9GSVJNV0FSRSB8fCAoc3RybGVuKFBBUk1fRE9XTkxPQURfRklSTVdBUkUpIDw9IDI1NSAvKjs/Ki8pKTsKKwlWQUxJRF9QQVJBTSgoUEFSTV9BVVRIX0tFWV9NR01UX1NVSVRFIDwgUEFSTV9NQVhfQVVUSF9LRVlfTUdNVF9TVUlURSkpOwogCi0JVkFMSURfUEFSQU0oICFQQVJNX0xPQURfQkFMQU5DSU5HIHx8IHN0cmNociggIk5uWXkiLCBQQVJNX0xPQURfQkFMQU5DSU5HWzBdICkgIT0gTlVMTCApOworCVZBTElEX1BBUkFNKCFQQVJNX0xPQURfQkFMQU5DSU5HIHx8IHN0cmNocigiTm5ZeSIsIFBBUk1fTE9BRF9CQUxBTkNJTkdbMF0pICE9IE5VTEwpOwogCVZBTElEX1BBUkFNKCAhUEFSTV9NRURJVU1fRElTVFJJQlVUSU9OIHx8IHN0cmNociggIk5uWXkiLCBQQVJNX01FRElVTV9ESVNUUklCVVRJT05bMF0gKSAhPSBOVUxMICk7CiAJVkFMSURfUEFSQU0oKCBQQVJNX1RYX1BPV19MRVZFTCA8PSBQQVJNX01BWF9UWF9QT1dfTEVWRUwgKSk7CiAKQEAgLTYwMSwzMyArNTg4LDI1IEBACiAJbHAtPk11bHRpY2FzdFJhdGVbMF0gICAgPSBQQVJNX0RFRkFVTFRfTVVMVElDQVNUX1JBVEVfMkdIWjsKIAlscC0+TXVsdGljYXN0UmF0ZVsxXSAgICA9IFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUkFURV81R0haOwogCi0JaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1NbMF0gKSAhPSBOVUxMICkgeworCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX01JQ1JPV0FWRV9ST0JVU1RORVNTWzBdICkgIT0gTlVMTCApCiAJCWxwLT5NaWNyb3dhdmVSb2J1c3RuZXNzID0gMTsKLQl9IGVsc2UgeworCWVsc2UKIAkJbHAtPk1pY3Jvd2F2ZVJvYnVzdG5lc3MgPSAwOwotCX0KLQlpZiAoIFBBUk1fREVTSVJFRF9TU0lEICYmICggc3RybGVuKCBQQVJNX0RFU0lSRURfU1NJRCApIDw9IEhDRl9NQVhfTkFNRV9MRU4gKSkgeworCWlmICggUEFSTV9ERVNJUkVEX1NTSUQgJiYgKCBzdHJsZW4oIFBBUk1fREVTSVJFRF9TU0lEICkgPD0gSENGX01BWF9OQU1FX0xFTiApKQogCQlzdHJjcHkoIGxwLT5OZXR3b3JrTmFtZSwgUEFSTV9ERVNJUkVEX1NTSUQgKTsKLQl9Ci0JaWYgKCBQQVJNX09XTl9TU0lEICYmICggc3RybGVuKCBQQVJNX09XTl9TU0lEICkgPD0gSENGX01BWF9OQU1FX0xFTiApKSB7CisJaWYgKCBQQVJNX09XTl9TU0lEICYmICggc3RybGVuKCBQQVJNX09XTl9TU0lEICkgPD0gSENGX01BWF9OQU1FX0xFTiApKQogCQlzdHJjcHkoIGxwLT5OZXR3b3JrTmFtZSwgUEFSTV9PV05fU1NJRCApOwotCX0KLQlpZiAoIFBBUk1fT1dOX05BTUUgJiYgKCBzdHJsZW4oIFBBUk1fT1dOX05BTUUgKSA8PSBIQ0ZfTUFYX05BTUVfTEVOICkpIHsKKwlpZiAoIFBBUk1fT1dOX05BTUUgJiYgKCBzdHJsZW4oIFBBUk1fT1dOX05BTUUgKSA8PSBIQ0ZfTUFYX05BTUVfTEVOICkpCiAJCXN0cmNweSggbHAtPlN0YXRpb25OYW1lLCBQQVJNX09XTl9OQU1FICk7Ci0JfQogCWxwLT5FbmFibGVFbmNyeXB0aW9uID0gUEFSTV9FTkFCTEVfRU5DUllQVElPTjsKLQlpZiAoIFBBUk1fS0VZMSAmJiAoIHN0cmxlbiggUEFSTV9LRVkxICkgPD0gTUFYX0tFWV9MRU4gKSkgeworCWlmICggUEFSTV9LRVkxICYmICggc3RybGVuKCBQQVJNX0tFWTEgKSA8PSBNQVhfS0VZX0xFTiApKQogCQlzdHJjcHkoIGxwLT5LZXkxLCBQQVJNX0tFWTEgKTsKLQl9Ci0JaWYgKCBQQVJNX0tFWTIgJiYgKCBzdHJsZW4oIFBBUk1fS0VZMiApIDw9IE1BWF9LRVlfTEVOICkpIHsKKwlpZiAoIFBBUk1fS0VZMiAmJiAoIHN0cmxlbiggUEFSTV9LRVkyICkgPD0gTUFYX0tFWV9MRU4gKSkKIAkJc3RyY3B5KCBscC0+S2V5MiwgUEFSTV9LRVkyICk7Ci0JfQotCWlmICggUEFSTV9LRVkzICYmICggc3RybGVuKCBQQVJNX0tFWTMgKSA8PSBNQVhfS0VZX0xFTiApKSB7CisJaWYgKCBQQVJNX0tFWTMgJiYgKCBzdHJsZW4oIFBBUk1fS0VZMyApIDw9IE1BWF9LRVlfTEVOICkpCiAJCXN0cmNweSggbHAtPktleTMsIFBBUk1fS0VZMyApOwotCX0KLQlpZiAoIFBBUk1fS0VZNCAmJiAoIHN0cmxlbiggUEFSTV9LRVk0ICkgPD0gTUFYX0tFWV9MRU4gKSkgeworCWlmICggUEFSTV9LRVk0ICYmICggc3RybGVuKCBQQVJNX0tFWTQgKSA8PSBNQVhfS0VZX0xFTiApKQogCQlzdHJjcHkoIGxwLT5LZXk0LCBQQVJNX0tFWTQgKTsKLQl9CiAKIAlscC0+VHJhbnNtaXRLZXlJRCA9IFBBUk1fVFhfS0VZOwogCkBAIC02MzksMTcgKzYxOCwxNSBAQAogCWxwLT5Eb3dubG9hZEZpcm13YXJlID0gMSA7IC8vOz90byBiZSB1cGdyYWRlZCBQQVJNX0RPV05MT0FEX0ZJUk1XQVJFOwogCWxwLT5BdXRoS2V5TWdtdFN1aXRlID0gUEFSTV9BVVRIX0tFWV9NR01UX1NVSVRFOwogCi0JaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fTE9BRF9CQUxBTkNJTkdbMF0gKSAhPSBOVUxMICkgeworCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX0xPQURfQkFMQU5DSU5HWzBdICkgIT0gTlVMTCApCiAJCWxwLT5sb2FkQmFsYW5jaW5nID0gMTsKLQl9IGVsc2UgeworCWVsc2UKIAkJbHAtPmxvYWRCYWxhbmNpbmcgPSAwOwotCX0KIAotCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX01FRElVTV9ESVNUUklCVVRJT05bMF0gKSAhPSBOVUxMICkgeworCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX01FRElVTV9ESVNUUklCVVRJT05bMF0gKSAhPSBOVUxMICkKIAkJbHAtPm1lZGl1bURpc3RyaWJ1dGlvbiA9IDE7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCWxwLT5tZWRpdW1EaXN0cmlidXRpb24gPSAwOwotCX0KIAogCWxwLT50eFBvd0xldmVsID0gUEFSTV9UWF9QT1dfTEVWRUw7CiAKQEAgLTY2NSwyNCArNjQyLDIwIEBACiAJbHAtPmF0aW1XaW5kb3cgICAgICAgICAgPSBQQVJNX09XTl9BVElNX1dJTkRPVzsKIAlscC0+aG9sZG92ZXJEdXJhdGlvbiAgICA9IFBBUk1fUE1fSE9MRE9WRVJfRFVSQVRJT047CiAJbHAtPlBNRW5hYmxlZCAgICAgICAgICAgPSBQQVJNX1BNX0VOQUJMRUQ7ICAvLzs/Ci0JaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fQ1JFQVRFX0lCU1NbMF0gKSAhPSBOVUxMICkgeworCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX0NSRUFURV9JQlNTWzBdICkgIT0gTlVMTCApCiAJCWxwLT5DcmVhdGVJQlNTID0gMTsKLQl9IGVsc2UgeworCWVsc2UKIAkJbHAtPkNyZWF0ZUlCU1MgPSAwOwotCX0KLQlpZiAoIHN0cmNociggIk5uIiwgUEFSTV9NVUxUSUNBU1RfUlhbMF0gKSAhPSBOVUxMICkgeworCWlmICggc3RyY2hyKCAiTm4iLCBQQVJNX01VTFRJQ0FTVF9SWFswXSApICE9IE5VTEwgKQogCQlscC0+TXVsdGljYXN0UmVjZWl2ZSA9IDA7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCWxwLT5NdWx0aWNhc3RSZWNlaXZlID0gMTsKLQl9Ci0JaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fUFJPTUlTQ1VPVVNfTU9ERVswXSApICE9IE5VTEwgKSB7CisJaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fUFJPTUlTQ1VPVVNfTU9ERVswXSApICE9IE5VTEwgKQogCQlscC0+cHJvbWlzY3VvdXNNb2RlID0gMTsKLQl9IGVsc2UgeworCWVsc2UKIAkJbHAtPnByb21pc2N1b3VzTW9kZSA9IDA7Ci0JfQotCWZvciggaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrICkgewotCSAgIGxwLT5NQUNBZGRyZXNzW2ldID0gUEFSTV9ORVRXT1JLX0FERFJbaV07Ci0JfQorCWZvciggaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrICkKKwkJbHAtPk1BQ0FkZHJlc3NbaV0gPSBQQVJNX05FVFdPUktfQUREUltpXTsKIAogCWxwLT5jb25uZWN0aW9uQ29udHJvbCA9IFBBUk1fQ09OTkVDVElPTl9DT05UUk9MOwogCkBAIC02OTEsMjYgKzY2NCwyMiBAQAogCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAogCWxwLT5EVElNUGVyaW9kID0gUEFSTV9PV05fRFRJTV9QRVJJT0Q7CiAKLQlpZiAoIHN0cmNociggIll5IiwgUEFSTV9SRUpFQ1RfQU5ZWzBdICkgIT0gTlVMTCApIHsKKwlpZiAoIHN0cmNociggIll5IiwgUEFSTV9SRUpFQ1RfQU5ZWzBdICkgIT0gTlVMTCApCiAJCWxwLT5SZWplY3RBbnkgPSAxOwotCX0gZWxzZSB7CisJZWxzZQogCQlscC0+UmVqZWN0QW55ID0gMDsKLQl9Ci0JaWYgKCBzdHJjaHIoICJObiIsIFBBUk1fRVhDTFVERV9VTkVOQ1JZUFRFRFswXSApICE9IE5VTEwgKSB7CisJaWYgKCBzdHJjaHIoICJObiIsIFBBUk1fRVhDTFVERV9VTkVOQ1JZUFRFRFswXSApICE9IE5VTEwgKQogCQlscC0+RXhjbHVkZVVuZW5jcnlwdGVkID0gMDsKLQl9IGVsc2UgeworCWVsc2UKIAkJbHAtPkV4Y2x1ZGVVbmVuY3J5cHRlZCA9IDE7Ci0JfQotCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkdbMF0gKSAhPSBOVUxMICkgeworCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkdbMF0gKSAhPSBOVUxMICkKIAkJbHAtPm11bHRpY2FzdFBNQnVmZmVyaW5nID0gMTsKLQl9IGVsc2UgeworCWVsc2UKIAkJbHAtPm11bHRpY2FzdFBNQnVmZmVyaW5nID0gMDsKLQl9Ci0JaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fSU5UUkFfQlNTX1JFTEFZWzBdICkgIT0gTlVMTCApIHsKKwlpZiAoIHN0cmNociggIll5IiwgUEFSTV9JTlRSQV9CU1NfUkVMQVlbMF0gKSAhPSBOVUxMICkKIAkJbHAtPmludHJhQlNTUmVsYXkgPSAxOwotCX0gZWxzZSB7CisJZWxzZQogCQlscC0+aW50cmFCU1NSZWxheSA9IDA7Ci0JfQogCiAJbHAtPm93bkJlYWNvbkludGVydmFsID0gUEFSTV9PV05fQkVBQ09OX0lOVEVSVkFMOwogCWxwLT5jb2V4aXN0ZW5jZSAgICAgICA9IFBBUk1fQ09FWElTVEVOQ0U7CkBAIC03NTAsMTEgKzcxOSwxMCBAQAogI2VuZGlmICAvKiBVU0VfV0RTICovCiAjZW5kaWYgIC8qIEhDRl9BUCAqLwogI2lmZGVmIFVTRV9SVFMKLQlpZiAoIHN0cmNociggIll5IiwgdXNlUlRTWzBdICkgIT0gTlVMTCApIHsKKwlpZiAoIHN0cmNociggIll5IiwgdXNlUlRTWzBdICkgIT0gTlVMTCApCiAJCWxwLT51c2VSVFMgPSAxOwotCX0gZWxzZSB7CisJZWxzZQogCQlscC0+dXNlUlRTID0gMDsKLQl9CiAjZW5kaWYgIC8qIFVTRV9SVFMgKi8KIAogCkBAIC0xNTYwLDcgKzE1MjgsOCBAQAogCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwogCiAJLyogT3duIE5hbWUgKFN0YXRpb24gTmlja25hbWUpICovCi0JaWYgKCggbGVuID0gKCBzdHJsZW4oIGxwLT5TdGF0aW9uTmFtZSApICsgMSApICYgfjB4MDEgKSAhPSAwICkgeworCWxlbiA9IChzdHJsZW4obHAtPlN0YXRpb25OYW1lKSArIDEpICYgfjB4MDE7CisJaWYgKGxlbiAhPSAwKSB7CiAJCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0NORl9PV05fTkFNRSAgICAgICAgICAgICAgICAgIDogJXNcbiIsCiAJCS8vICAgICAgICAgICBscC0+U3RhdGlvbk5hbWUgKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbmV0ZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9uZXRkZXYuYwppbmRleCA5NjViMWMwLi43N2U0YmUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9uZXRkZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9uZXRkZXYuYwpAQCAtNjgsMzEgKzY4LDE0IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLS8vICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLS8vICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLS8vICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLS8vI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvaW4uaD4KLS8vICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotLy8gI2luY2x1ZGUgPGFzbS9pby5oPgotLy8gLy8gI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KLQogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogCiAjaW5jbHVkZSA8ZGVidWcuaD4KIAogI2luY2x1ZGUgPGhjZi5oPgogI2luY2x1ZGUgPGRoZi5oPgotLy8gI2luY2x1ZGUgPGhjZmRlZi5oPgogCiAjaW5jbHVkZSA8d2xfaWYuaD4KICNpbmNsdWRlIDx3bF9pbnRlcm5hbC5oPgpAQCAtMTA0LDE2ICs4NywxNSBAQAogCiAjaWZkZWYgVVNFX1BST0ZJTEUKICNpbmNsdWRlIDx3bF9wcm9maWxlLmg+Ci0jZW5kaWYgIC8qIFVTRV9QUk9GSUxFICovCisjZW5kaWYgLyogVVNFX1BST0ZJTEUgKi8KIAogI2lmZGVmIEJVU19QQ01DSUEKICNpbmNsdWRlIDx3bF9jcy5oPgotI2VuZGlmICAvKiBCVVNfUENNQ0lBICovCisjZW5kaWYgLyogQlVTX1BDTUNJQSAqLwogCiAjaWZkZWYgQlVTX1BDSQogI2luY2x1ZGUgPHdsX3BjaS5oPgotI2VuZGlmICAvKiBCVVNfUENJICovCi0KKyNlbmRpZiAvKiBCVVNfUENJICovCiAKICNpZiBIQ0ZfRU5DQVAKICNkZWZpbmUgTVRVX01BWCAoSENGX01BWF9NU0cgLSBFVEhfSExFTiAtIDgpCkBAIC0xMjEsMTcgKzEwMywxNSBAQAogI2RlZmluZSBNVFVfTUFYIChIQ0ZfTUFYX01TRyAtIEVUSF9ITEVOKQogI2VuZGlmCiAKLS8vc3RhdGljIGludCBtdHUgPSBNVFVfTUFYOwotLy9NT0RVTEVfUEFSTShtdHUsICJpIik7Ci0vL01PRFVMRV9QQVJNX0RFU0MobXR1LCAiTVRVIik7Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBtYWNyb3MKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIEJMT0NLX0lOUFVUKGJ1ZiwgbGVuKSBcCi0gICAgZGVzYy0+YnVmX2FkZHIgPSBidWY7IFwKLSAgICBkZXNjLT5CVUZfU0laRSA9IGxlbjsgXAotICAgIHN0YXR1cyA9IGhjZl9yY3ZfbXNnKCYobHAtPmhjZkN0eCksIGRlc2MsIDApCisJZG8geyBcCisJCWRlc2MtPmJ1Zl9hZGRyID0gYnVmOyBcCisJCWRlc2MtPkJVRl9TSVpFID0gbGVuOyBcCisJCXN0YXR1cyA9IGhjZl9yY3ZfbXNnKCYobHAtPmhjZkN0eCksIGRlc2MsIDApOyBcCisJfSB3aGlsZSAoMCkKIAogI2RlZmluZSBCTE9DS19JTlBVVF9ETUEoYnVmLCBsZW4pIG1lbWNweSggYnVmLCBkZXNjX25leHQtPmJ1Zl9hZGRyLCBwa3RsZW4gKQogCkBAIC0xNTgsMjAgKzEzOCwxMiBAQAogICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHdsX2luaXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoraW50IHdsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLS8vICAgIHVuc2lnbmVkIGxvbmcgICAgICAgZmxhZ3M7Ci0vLyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IHdsX3ByaXYoZGV2KTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CisJcmV0dXJuIDA7Cit9CQkJCS8qIHdsX2luaXQgKi8KIAotICAgIERCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOwotCi0gICAgLyogTm90aGluZyB0byBkbywgYnV0IGdyYWIgdGhlIHNwaW5sb2NrIGFueXdheSBqdXN0IGluIGNhc2Ugd2UgZXZlciBuZWVkCi0gICAgICAgdGhpcyByb3V0aW5lICovCi0vLyAgd2xfbG9jayggbHAsICZmbGFncyApOwotLy8gIHdsX3VubG9jayggbHAsICZmbGFncyApOwotCi0gICAgcmV0dXJuIDA7Ci19IC8vIHdsX2luaXQKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xOTMsMTcgKzE2NSwyMCBAQAogICogICAgICBlcnJubyBvdGhlcndpc2UKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHdsX2NvbmZpZyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXAgKQoraW50IHdsX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCkKIHsKLSAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKLSAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJtYXAiLCAiMHglcCIsIG1hcCApOworCURCR19QQVJBTShEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2KTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgIm1hcCIsICIweCVwIiwgbWFwKTsKIAotICAgIC8qIFRoZSBvbmx5IHRoaW5nIHdlIGNhcmUgYWJvdXQgaGVyZSBpcyBhIHBvcnQgY2hhbmdlLiBTaW5jZSB0aGlzIG5vdCBuZWVkZWQsCi0gICAgICAgaWdub3JlIHRoZSByZXF1ZXN0LiAqLwotICAgIERCR19UUkFDRShEYmdJbmZvLCAiJXM6ICVzIGNhbGxlZC5cbiIsIGRldi0+bmFtZSwgX19mdW5jX18pOworCS8qCisJICogVGhlIG9ubHkgdGhpbmcgd2UgY2FyZSBhYm91dCBoZXJlIGlzIGEgcG9ydCBjaGFuZ2UuCisJICogU2luY2UgdGhpcyBub3QgbmVlZGVkLCBpZ25vcmUgdGhlIHJlcXVlc3QuIAorCSAqLworCURCR19UUkFDRShEYmdJbmZvLCAiJXM6ICVzIGNhbGxlZC5cbiIsIGRldi0+bmFtZSwgX19mdW5jX18pOwogCi0gICAgcmV0dXJuIDA7Ci19IC8vIHdsX2NvbmZpZworCXJldHVybiAwOworfQkJCQkvKiB3bF9jb25maWcgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIyNCw0OCArMTk5LDQ3IEBACiAgKiAgICAgIHN0YXRpc3RpY3MuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp3bF9zdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqd2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKICNpZmRlZiBVU0VfV0RTCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OwotI2VuZGlmICAvKiBVU0VfV0RTICovCi0gICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgIGZsYWdzOwotICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICAgICAqcFN0YXRzOwotICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICAgICAqbHAgPSB3bF9wcml2KGRldik7CisJaW50IGNvdW50OworI2VuZGlmIC8qIFVTRV9XRFMgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwU3RhdHM7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOwogCi0gICAgLy9EQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKKwkvKkRCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOyAqLwogCi0gICAgcFN0YXRzID0gTlVMTDsKKwlwU3RhdHMgPSBOVUxMOwogCi0gICAgd2xfbG9jayggbHAsICZmbGFncyApOworCXdsX2xvY2sobHAsICZmbGFncyk7CiAKICNpZmRlZiBVU0VfUlRTCi0gICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKLQl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KKwlpZiAobHAtPnVzZVJUUyA9PSAxKSB7CisJCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorI2VuZGlmIC8qIFVTRV9SVFMgKi8KIAotICAgIC8qIFJldHVybiB0aGUgc3RhdGlzdGljcyBmb3IgdGhlIGFwcHJvcHJpYXRlIGRldmljZSAqLworCS8qIFJldHVybiB0aGUgc3RhdGlzdGljcyBmb3IgdGhlIGFwcHJvcHJpYXRlIGRldmljZSAqLwogI2lmZGVmIFVTRV9XRFMKIAotICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7Ci0JaWYoIGRldiA9PSBscC0+d2RzX3BvcnRbY291bnRdLmRldiApIHsKLQkgICAgcFN0YXRzID0gJiggbHAtPndkc19wb3J0W2NvdW50XS5zdGF0cyApOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KyspIHsKKwkJaWYgKGRldiA9PSBscC0+d2RzX3BvcnRbY291bnRdLmRldikKKwkJCXBTdGF0cyA9ICYobHAtPndkc19wb3J0W2NvdW50XS5zdGF0cyk7CiAJfQotICAgIH0KIAotI2VuZGlmICAvKiBVU0VfV0RTICovCisjZW5kaWYgLyogVVNFX1dEUyAqLwogCi0gICAgLyogSWYgcFN0YXRzIGlzIHN0aWxsIE5VTEwsIHRoZW4gdGhlIGRldmljZSBpcyBub3QgYSBXRFMgcG9ydCAqLwotICAgIGlmKCBwU3RhdHMgPT0gTlVMTCApIHsKLSAgICAgICAgcFN0YXRzID0gJiggbHAtPnN0YXRzICk7Ci0gICAgfQorCS8qIElmIHBTdGF0cyBpcyBzdGlsbCBOVUxMLCB0aGVuIHRoZSBkZXZpY2UgaXMgbm90IGEgV0RTIHBvcnQgKi8KKwlpZiAocFN0YXRzID09IE5VTEwpCisJCXBTdGF0cyA9ICYobHAtPnN0YXRzKTsKIAotICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKIAotICAgIHJldHVybiBwU3RhdHM7Ci19IC8vIHdsX3N0YXRzCisJcmV0dXJuIHBTdGF0czsKK30JCQkJLyogd2xfc3RhdHMgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI4OCw3NSArMjYyLDc3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50IHdsX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEhDRl9TVUNDRVNTOwotICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOwotICAgIHVuc2lnbmVkIGxvbmcgICAgICAgZmxhZ3M7CisJaW50IHN0YXR1cyA9IEhDRl9TVUNDRVNTOworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0gICAgd2xfbG9jayggbHAsICZmbGFncyApOworCXdsX2xvY2sobHAsICZmbGFncyk7CiAKICNpZmRlZiBVU0VfUlRTCi0gICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKLQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTa2lwcGluZyBkZXZpY2Ugb3BlbiwgaW4gUlRTIG1vZGVcbiIgKTsKLQl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKLQlyZXR1cm4gLUVJTzsKLSAgICB9Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KKwlpZiAobHAtPnVzZVJUUyA9PSAxKSB7CisJCURCR19UUkFDRShEYmdJbmZvLCAiU2tpcHBpbmcgZGV2aWNlIG9wZW4sIGluIFJUUyBtb2RlXG4iKTsKKwkJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCQlyZXR1cm4gLUVJTzsKKwl9CisjZW5kaWYgLyogVVNFX1JUUyAqLwogCiAjaWZkZWYgVVNFX1BST0ZJTEUKLSAgICBwYXJzZV9jb25maWcoIGRldiApOworCXBhcnNlX2NvbmZpZyhkZXYpOwogI2VuZGlmCiAKLSAgICBpZiggbHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEICkgewotCURCR19UUkFDRSggRGJnSW5mbywgIkVuYWJsaW5nIFBvcnQgMFxuIiApOwotCXN0YXR1cyA9IHdsX2VuYWJsZSggbHAgKTsKKwlpZiAobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCURCR19UUkFDRShEYmdJbmZvLCAiRW5hYmxpbmcgUG9ydCAwXG4iKTsKKwkJc3RhdHVzID0gd2xfZW5hYmxlKGxwKTsKIAotICAgICAgICBpZiggc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgewotICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiRW5hYmxlIHBvcnQgMCBmYWlsZWQ6IDB4JXhcbiIsIHN0YXR1cyApOwotICAgICAgICB9Ci0gICAgfQorCQlpZiAoc3RhdHVzICE9IEhDRl9TVUNDRVNTKSB7CisJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIkVuYWJsZSBwb3J0IDAgZmFpbGVkOiAweCV4XG4iLAorCQkJCSAgc3RhdHVzKTsKKwkJfQorCX0KIAotICAgIC8vIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzCi0gICAgd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOwotICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKwkvKiBIb2xkaW5nIHRoZSBsb2NrIHRvbyBsb25nLCBtYWtlIGEgZ2FwIHRvIGFsbG93IG90aGVyIHByb2Nlc3NlcyAqLworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwl3bF9sb2NrKGxwLCAmZmxhZ3MpOwogCi0gICAgaWYgKCBzdHJsZW4oIGxwLT5md19pbWFnZV9maWxlbmFtZSApICkgewotCURCR19UUkFDRSggRGJnSW5mbywgIjs/Pz8/IEtsdWRneSB3YXkgdG8gZm9yY2UgYSBkb3dubG9hZFxuIiApOwotCXN0YXR1cyA9IHdsX2dvKCBscCApOwotICAgIH0gZWxzZSB7Ci0Jc3RhdHVzID0gd2xfYXBwbHkoIGxwICk7Ci0gICAgfQorCWlmIChzdHJsZW4obHAtPmZ3X2ltYWdlX2ZpbGVuYW1lKSkgeworCQlEQkdfVFJBQ0UoRGJnSW5mbywgIjs/Pz8/IEtsdWRneSB3YXkgdG8gZm9yY2UgYSBkb3dubG9hZFxuIik7CisJCXN0YXR1cyA9IHdsX2dvKGxwKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSB3bF9hcHBseShscCk7CisJfQogCi0gICAgLy8gSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMKLSAgICB3bF91bmxvY2sobHAsICZmbGFncyk7Ci0gICAgd2xfbG9jayggbHAsICZmbGFncyApOworCS8qIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzICovCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCXdsX2xvY2sobHAsICZmbGFncyk7CiAKLSAgICBpZiggc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgewotCS8vIFVuc3VjY2Vzc2Z1bCwgdHJ5IHJlc2V0IG9mIHRoZSBjYXJkIHRvIHJlY292ZXIKLQlzdGF0dXMgPSB3bF9yZXNldCggZGV2ICk7Ci0gICAgfQorCS8qIFVuc3VjY2Vzc2Z1bCwgdHJ5IHJlc2V0IG9mIHRoZSBjYXJkIHRvIHJlY292ZXIgKi8KKwlpZiAoc3RhdHVzICE9IEhDRl9TVUNDRVNTKQorCQlzdGF0dXMgPSB3bF9yZXNldChkZXYpOwogCi0gICAgLy8gSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMKLSAgICB3bF91bmxvY2sobHAsICZmbGFncyk7Ci0gICAgd2xfbG9jayggbHAsICZmbGFncyApOworCS8qIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzICovCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCXdsX2xvY2sobHAsICZmbGFncyk7CiAKLSAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgewotCW5ldGlmX2NhcnJpZXJfb24oIGRldiApOwotCVdMX1dEU19ORVRJRl9DQVJSSUVSX09OKCBscCApOworCWlmIChzdGF0dXMgPT0gSENGX1NVQ0NFU1MpIHsKKwkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQlXTF9XRFNfTkVUSUZfQ0FSUklFUl9PTihscCk7CiAKLQlscC0+aXNfaGFuZGxpbmdfaW50ID0gV0xfSEFORExJTkdfSU5UOyAvLyBTdGFydCBoYW5kbGluZyBpbnRlcnJ1cHRzCi0gICAgICAgIHdsX2FjdF9pbnRfb24oIGxwICk7CisJCS8qIFN0YXJ0IGhhbmRsaW5nIGludGVycnVwdHMgKi8KKwkJbHAtPmlzX2hhbmRsaW5nX2ludCA9IFdMX0hBTkRMSU5HX0lOVDsKKwkJd2xfYWN0X2ludF9vbihscCk7CiAKLQluZXRpZl9zdGFydF9xdWV1ZSggZGV2ICk7Ci0JV0xfV0RTX05FVElGX1NUQVJUX1FVRVVFKCBscCApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHdsX2hjZl9lcnJvciggZGV2LCBzdGF0dXMgKTsJCS8qIFJlcG9ydCB0aGUgZXJyb3IgKi8KLSAgICAgICAgbmV0aWZfZGV2aWNlX2RldGFjaCggZGV2ICk7CQkvKiBTdG9wIHRoZSBkZXZpY2UgYW5kIHF1ZXVlICovCi0gICAgfQorCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlXTF9XRFNfTkVUSUZfU1RBUlRfUVVFVUUobHApOworCX0gZWxzZSB7CisJCXdsX2hjZl9lcnJvcihkZXYsIHN0YXR1cyk7CS8qIFJlcG9ydCB0aGUgZXJyb3IgKi8KKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOwkvKiBTdG9wIHRoZSBkZXZpY2UgYW5kIHF1ZXVlICovCisJfQogCi0gICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOwogCi0gICAgcmV0dXJuIHN0YXR1czsKLX0gLy8gd2xfb3BlbgorCXJldHVybiBzdGF0dXM7Cit9CQkJCS8qIHdsX29wZW4gKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM3Nyw3MyArMzUzLDcwIEBACiAgKiAgICAgIGVycm5vIG90aGVyd2lzZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgd2xfY2xvc2UoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoraW50IHdsX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSB3bF9wcml2KGRldik7Ci0gICAgdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0gICAgREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOworCURCR19QQVJBTShEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2KTsKIAotICAgIC8qIE1hcmsgdGhlIGFkYXB0ZXIgYXMgYnVzeSAqLwotICAgIG5ldGlmX3N0b3BfcXVldWUoIGRldiApOwotICAgIFdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBscCApOworCS8qIE1hcmsgdGhlIGFkYXB0ZXIgYXMgYnVzeSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlXTF9XRFNfTkVUSUZfU1RPUF9RVUVVRShscCk7CiAKLSAgICBuZXRpZl9jYXJyaWVyX29mZiggZGV2ICk7Ci0gICAgV0xfV0RTX05FVElGX0NBUlJJRVJfT0ZGKCBscCApOworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJV0xfV0RTX05FVElGX0NBUlJJRVJfT0ZGKGxwKTsKIAotICAgIC8qIFNodXRkb3duIHRoZSBhZGFwdGVyOgotICAgICAgICAgICAgRGlzYWJsZSBhZGFwdGVyIGludGVycnVwdHMKLSAgICAgICAgICAgIFN0b3AgVHgvUngKLSAgICAgICAgICAgIFVwZGF0ZSBzdGF0aXN0aWNzCi0gICAgICAgICAgICBTZXQgbG93IHBvd2VyIG1vZGUKLSAgICAqLworCS8qCisJICogU2h1dGRvd24gdGhlIGFkYXB0ZXI6CisJICogRGlzYWJsZSBhZGFwdGVyIGludGVycnVwdHMKKwkgKiBTdG9wIFR4L1J4CisJICogVXBkYXRlIHN0YXRpc3RpY3MKKwkgKiBTZXQgbG93IHBvd2VyIG1vZGUKKwkgKi8KIAotICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKwl3bF9sb2NrKGxwLCAmZmxhZ3MpOwogCi0gICAgd2xfYWN0X2ludF9vZmYoIGxwICk7Ci0gICAgbHAtPmlzX2hhbmRsaW5nX2ludCA9IFdMX05PVF9IQU5ETElOR19JTlQ7IC8vIFN0b3AgaGFuZGxpbmcgaW50ZXJydXB0cworCXdsX2FjdF9pbnRfb2ZmKGxwKTsKKwkvKiBTdG9wIGhhbmRsaW5nIGludGVycnVwdHMgKi8KKwlscC0+aXNfaGFuZGxpbmdfaW50ID0gV0xfTk9UX0hBTkRMSU5HX0lOVDsKIAogI2lmZGVmIFVTRV9SVFMKLSAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgewotCURCR19UUkFDRSggRGJnSW5mbywgIlNraXBwaW5nIGRldmljZSBjbG9zZSwgaW4gUlRTIG1vZGVcbiIgKTsKLQl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKLQlyZXR1cm4gLUVJTzsKLSAgICB9Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KKwlpZiAobHAtPnVzZVJUUyA9PSAxKSB7CisJCURCR19UUkFDRShEYmdJbmZvLCAiU2tpcHBpbmcgZGV2aWNlIGNsb3NlLCBpbiBSVFMgbW9kZVxuIik7CisJCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorI2VuZGlmIC8qIFVTRV9SVFMgKi8KIAotICAgIC8qIERpc2FibGUgdGhlIHBvcnRzICovCi0gICAgd2xfZGlzYWJsZSggbHAgKTsKKwkvKiBEaXNhYmxlIHRoZSBwb3J0cyAqLworCXdsX2Rpc2FibGUobHApOwogCi0gICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOwogCi0gICAgcmV0dXJuIDA7Ci19IC8vIHdsX2Nsb3NlCisJcmV0dXJuIDA7Cit9CQkJCS8qIHdsX2Nsb3NlICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIHN0YXRpYyB2b2lkIHdsX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7Ci0gICAgc3RybGNweShpbmZvLT5kcml2ZXIsIERSSVZFUl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7Ci0gICAgc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTl9TVFIsIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7Ci0vLwlzdHJsY3B5KGluZm8uZndfdmVyc2lvbiwgcHJpdi0+ZndfbmFtZSwKLS8vCXNpemVvZihpbmZvLmZ3X3ZlcnNpb24pKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJJVkVSX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OX1NUUiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKIAotICAgIGlmIChkZXYtPmRldi5wYXJlbnQpIHsKLSAgICAJZGV2X3NldF9uYW1lKGRldi0+ZGV2LnBhcmVudCwgIiVzIiwgaW5mby0+YnVzX2luZm8pOwotCS8vc3RybGNweShpbmZvLT5idXNfaW5mbywgZGV2LT5kZXYucGFyZW50LT5idXNfaWQsCi0JLy8Jc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7Ci0gICAgfSBlbHNlIHsKLQlzbnByaW50ZihpbmZvLT5idXNfaW5mbywgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSwKLQkJIlBDTUNJQSBGSVhNRSIpOwotLy8JCSAgICAiUENNQ0lBIDB4JWx4IiwgcHJpdi0+aHcuaW9iYXNlKTsKLSAgICB9Ci19IC8vIHdsX2dldF9kcnZpbmZvCisJaWYgKGRldi0+ZGV2LnBhcmVudCkgeworCQlkZXZfc2V0X25hbWUoZGV2LT5kZXYucGFyZW50LCAiJXMiLCBpbmZvLT5idXNfaW5mbyk7CisJfSBlbHNlIHsKKwkJc25wcmludGYoaW5mby0+YnVzX2luZm8sIHNpemVvZihpbmZvLT5idXNfaW5mbyksCisJCQkgIlBDTUNJQSBGSVhNRSIpOworCX0KK30JCQkJLyogd2xfZ2V0X2RydmluZm8gKi8KIAogc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB3bF9ldGh0b29sX29wcyA9IHsKLSAgICAuZ2V0X2RydmluZm8gPSB3bF9nZXRfZHJ2aW5mbywKLSAgICAuZ2V0X2xpbmsgPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfZHJ2aW5mbyA9IHdsX2dldF9kcnZpbmZvLAorCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCiB9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgl3bF9pb2N0bCgpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDY0LDgxICs0MzcsODYgQEAKICAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB3bF9pb2N0bCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCApCitpbnQgd2xfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKIHsKLSAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgKmxwID0gd2xfcHJpdihkZXYpOwotICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGZsYWdzOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIHJldCA9IDA7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CiAKLSAgICBEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7Ci0gICAgREJHX1BBUkFNKERiZ0luZm8sICJycSIsICIweCVwIiwgcnEpOwotICAgIERCR19QQVJBTShEYmdJbmZvLCAiY21kIiwgIjB4JTA0eCIsIGNtZCk7CisJREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOworCURCR19QQVJBTShEYmdJbmZvLCAicnEiLCAiMHglcCIsIHJxKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgImNtZCIsICIweCUwNHgiLCBjbWQpOwogCi0gICAgd2xfbG9jayggbHAsICZmbGFncyApOworCXdsX2xvY2sobHAsICZmbGFncyk7CiAKLSAgICB3bF9hY3RfaW50X29mZiggbHAgKTsKKwl3bF9hY3RfaW50X29mZihscCk7CiAKICNpZmRlZiBVU0VfUlRTCi0gICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKLQkvKiBIYW5kbGUgYW55IFJUUyBJT0NUTCBoZXJlICovCi0JaWYoIGNtZCA9PSBXTF9JT0NUTF9SVFMgKSB7Ci0JICAgIERCR19UUkFDRSggRGJnSW5mbywgIklPQ1RMOiBXTF9JT0NUTF9SVFNcbiIgKTsKLQkgICAgcmV0ID0gd3ZsYW5fcnRzKCAoc3RydWN0IHJ0c3JlcSAqKXJxLCBkZXYtPmJhc2VfYWRkciApOwotCX0gZWxzZSB7Ci0JICAgIERCR19UUkFDRSggRGJnSW5mbywgIklPQ1RMIG5vdCBzdXBwb3J0ZWQgaW4gUlRTIG1vZGU6IDB4JVhcbiIsIGNtZCApOwotCSAgICByZXQgPSAtRU9QTk9UU1VQUDsKKwlpZiAobHAtPnVzZVJUUyA9PSAxKSB7CisJCS8qIEhhbmRsZSBhbnkgUlRTIElPQ1RMIGhlcmUgKi8KKwkJaWYgKGNtZCA9PSBXTF9JT0NUTF9SVFMpIHsKKwkJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdMX0lPQ1RMX1JUU1xuIik7CisJCQlyZXQgPSB3dmxhbl9ydHMoKHN0cnVjdCBydHNyZXEgKilycSwgZGV2LT5iYXNlX2FkZHIpOworCQl9IGVsc2UgeworCQkJREJHX1RSQUNFKERiZ0luZm8sCisJCQkJICAiSU9DVEwgbm90IHN1cHBvcnRlZCBpbiBSVFMgbW9kZTogMHglWFxuIiwKKwkJCQkgIGNtZCk7CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJfQorCisJCWdvdG8gb3V0X2FjdF9pbnRfb25fdW5sb2NrOwogCX0KKyNlbmRpZiAvKiBVU0VfUlRTICovCiAKLQlnb3RvIG91dF9hY3RfaW50X29uX3VubG9jazsKLSAgICB9Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KLQotICAgIC8qIE9ubHkgaGFuZGxlIFVJTCBJT0NUTCByZXF1ZXN0cyB3aGVuIHRoZSBVSUwgaGFzIHRoZSBzeXN0ZW0gYmxvY2tlZC4gKi8KLSAgICBpZiggISgoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApICYmICggY21kICE9IFdWTEFOMl9JT0NUTF9VSUwgKSkpIHsKKwkvKiBPbmx5IGhhbmRsZSBVSUwgSU9DVEwgcmVxdWVzdHMgd2hlbiB0aGUgVUlMIGhhcyB0aGUgc3lzdGVtIGJsb2NrZWQuICovCisJaWYgKCEoKGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSkgJiYgKGNtZCAhPSBXVkxBTjJfSU9DVExfVUlMKSkpIHsKICNpZmRlZiBVU0VfVUlMCi0Jc3RydWN0IHVpbHJlcSAgKnVycSA9IChzdHJ1Y3QgdWlscmVxICopcnE7CisJCXN0cnVjdCB1aWxyZXEgKnVycSA9IChzdHJ1Y3QgdWlscmVxICopcnE7CiAjZW5kaWYgLyogVVNFX1VJTCAqLwogCi0Jc3dpdGNoKCBjbWQgKSB7Ci0JCS8vID09PT09PT09PT09PT09PT09PSBQcml2YXRlIElPQ1RMcyAodXAgdG8gMTYpID09PT09PT09PT09PT09PT09PQorCQlzd2l0Y2ggKGNtZCkgeworCQkJLyogPT09PT09PT09PT09PT09PT09IFByaXZhdGUgSU9DVExzICh1cCB0byAxNikgPT09PT09PT09PT09PT09PT09ICovCiAjaWZkZWYgVVNFX1VJTAotCWNhc2UgV1ZMQU4yX0lPQ1RMX1VJTDoKLQkgICAgIERCR19UUkFDRSggRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfVUlMXG4iICk7Ci0JICAgICByZXQgPSB3dmxhbl91aWwoIHVycSwgbHAgKTsKLQkgICAgIGJyZWFrOwotI2VuZGlmICAvKiBVU0VfVUlMICovCisJCWNhc2UgV1ZMQU4yX0lPQ1RMX1VJTDoKKwkJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9VSUxcbiIpOworCQkJcmV0ID0gd3ZsYW5fdWlsKHVycSwgbHApOworCQkJYnJlYWs7CisjZW5kaWYgLyogVVNFX1VJTCAqLwogCi0JZGVmYXVsdDoKLQkgICAgIERCR19UUkFDRShEYmdJbmZvLCAiSU9DVEwgQ09ERSBOT1QgU1VQUE9SVEVEOiAweCVYXG4iLCBjbWQgKTsKLQkgICAgIHJldCA9IC1FT1BOT1RTVVBQOwotCSAgICAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIklPQ1RMIENPREUgTk9UIFNVUFBPUlRFRDogMHglWFxuIiwKKwkJCQkgIGNtZCk7CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJREJHX1dBUk5JTkcoRGJnSW5mbywKKwkJCSAgICAiREVWSUNFIElTIEJVU1ksIENBTk5PVCBQUk9DRVNTIFJFUVVFU1RcbiIpOworCQlyZXQgPSAtRUJVU1k7CiAJfQotICAgIH0gZWxzZSB7Ci0JREJHX1dBUk5JTkcoIERiZ0luZm8sICJERVZJQ0UgSVMgQlVTWSwgQ0FOTk9UIFBST0NFU1MgUkVRVUVTVFxuIiApOwotCXJldCA9IC1FQlVTWTsKLSAgICB9CiAKICNpZmRlZiBVU0VfUlRTCiBvdXRfYWN0X2ludF9vbl91bmxvY2s6Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KLSAgICB3bF9hY3RfaW50X29uKCBscCApOworI2VuZGlmIC8qIFVTRV9SVFMgKi8KKwl3bF9hY3RfaW50X29uKGxwKTsKIAotICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKIAotICAgIHJldHVybiByZXQ7Ci19IC8vIHdsX2lvY3RsCisJcmV0dXJuIHJldDsKK30JCQkJLyogd2xfaW9jdGwgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi12b2lkIHdsX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHdsX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7Ci0gICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgICBzdHJ1Y3QgcHRfcmVncyByZWdzOworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CiAKLSAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7Ci0gICAgd2xfaXNyKGRldi0+aXJxLCBkZXYsICZyZWdzKTsKLSAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKwl3bF9sb2NrKGxwLCAmZmxhZ3MpOworCXdsX2lzcihkZXYtPmlycSwgZGV2LCAmcmVncyk7CisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOwogfQogI2VuZGlmCiAKQEAgLTU1OSw1MyArNTM3LDU0IEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHdsX3R4X3RpbWVvdXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQordm9pZCB3bF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAjaWZkZWYgVVNFX1dEUwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIGNvdW50OwotI2VuZGlmICAvKiBVU0VfV0RTICovCi0gICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgZmxhZ3M7Ci0gICAgc3RydWN0IHdsX3ByaXZhdGUgICAgICAgKmxwID0gd2xfcHJpdihkZXYpOwotICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwU3RhdHMgPSBOVUxMOworCWludCBjb3VudDsKKyNlbmRpZiAvKiBVU0VfV0RTICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnBTdGF0cyA9IE5VTEw7CiAKLSAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzOiBUcmFuc21pdCB0aW1lb3V0LlxuIiwgZGV2LT5uYW1lICk7CisJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzOiBUcmFuc21pdCB0aW1lb3V0LlxuIiwgZGV2LT5uYW1lKTsKIAotICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKwl3bF9sb2NrKGxwLCAmZmxhZ3MpOwogCiAjaWZkZWYgVVNFX1JUUwotICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7Ci0JREJHX1RSQUNFKCBEYmdJbmZvLCAiU2tpcHBpbmcgdHhfdGltZW91dCBoYW5kbGVyLCBpbiBSVFMgbW9kZVxuIiApOwotCXdsX3VubG9jayggbHAsICZmbGFncyApOwotCXJldHVybjsKLSAgICB9Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KKwlpZiAobHAtPnVzZVJUUyA9PSAxKSB7CisJCURCR19UUkFDRShEYmdJbmZvLAorCQkJICAiU2tpcHBpbmcgdHhfdGltZW91dCBoYW5kbGVyLCBpbiBSVFMgbW9kZVxuIik7CisJCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAvKiBVU0VfUlRTICovCiAKLSAgICAvKiBGaWd1cmUgb3V0IHdoaWNoIGRldmljZSAodGhlICJyb290IiBkZXZpY2Ugb3IgV0RTIHBvcnQpIHRoaXMgdGltZW91dAotICAgICAgIGlzIGZvciAqLworCS8qIEZpZ3VyZSBvdXQgd2hpY2ggZGV2aWNlICh0aGUgInJvb3QiIGRldmljZSBvciBXRFMgcG9ydCkgdGhpcyB0aW1lb3V0CisJICAgaXMgZm9yICovCiAjaWZkZWYgVVNFX1dEUwogCi0gICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKLQlpZiggZGV2ID09IGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICkgewotCSAgICBwU3RhdHMgPSAmKCBscC0+d2RzX3BvcnRbY291bnRdLnN0YXRzICk7CisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKykgeworCQlpZiAoZGV2ID09IGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2KSB7CisJCQlwU3RhdHMgPSAmKGxwLT53ZHNfcG9ydFtjb3VudF0uc3RhdHMpOwogCi0JICAgIC8qIEJyZWFrIHRoZSBsb29wIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGUgY291bnRlciB0byBhY2Nlc3MgV0RTCi0JICAgICAgIGluZm9ybWF0aW9uIGluIHRoZSBwcml2YXRlIHN0cnVjdHVyZSAqLwotCSAgICBicmVhazsKKwkJCS8qIEJyZWFrIHRoZSBsb29wIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGUgY291bnRlciB0byBhY2Nlc3MgV0RTCisJCQkgICBpbmZvcm1hdGlvbiBpbiB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KKwkJCWJyZWFrOworCQl9CiAJfQotICAgIH0KIAotI2VuZGlmICAvKiBVU0VfV0RTICovCisjZW5kaWYgLyogVVNFX1dEUyAqLwogCi0gICAgLyogSWYgcFN0YXRzIGlzIHN0aWxsIE5VTEwsIHRoZW4gdGhlIGRldmljZSBpcyBub3QgYSBXRFMgcG9ydCAqLwotICAgIGlmKCBwU3RhdHMgPT0gTlVMTCApIHsKLQlwU3RhdHMgPSAmKCBscC0+c3RhdHMgKTsKLSAgICB9CisJLyogSWYgcFN0YXRzIGlzIHN0aWxsIE5VTEwsIHRoZW4gdGhlIGRldmljZSBpcyBub3QgYSBXRFMgcG9ydCAqLworCWlmIChwU3RhdHMgPT0gTlVMTCkKKwkJcFN0YXRzID0gJihscC0+c3RhdHMpOwogCi0gICAgLyogQWNjdW11bGF0ZSB0aGUgdGltZW91dCBlcnJvciAqLwotICAgIHBTdGF0cy0+dHhfZXJyb3JzKys7CisJLyogQWNjdW11bGF0ZSB0aGUgdGltZW91dCBlcnJvciAqLworCXBTdGF0cy0+dHhfZXJyb3JzKys7CiAKLSAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKLX0gLy8gd2xfdHhfdGltZW91dAorCXdsX3VubG9jayhscCwgJmZsYWdzKTsKK30JCQkJLyogd2xfdHhfdGltZW91dCAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjI2LDEwMyArNjA1LDEwNSBAQAogICogICAgICAxIG9uIGVycm9yCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB3bF9zZW5kKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoraW50IHdsX3NlbmQoc3RydWN0IHdsX3ByaXZhdGUgKmxwKQogewogCi0gICAgaW50ICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0gICAgREVTQ19TVFJDVCAgICAgICAgICAqZGVzYzsKLSAgICBXVkxBTl9MRlJBTUUgICAgICAgICp0eEYgPSBOVUxMOwotICAgIHN0cnVjdCBsaXN0X2hlYWQgICAgKmVsZW1lbnQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBsZW47CisJaW50IHN0YXR1czsKKwlERVNDX1NUUkNUICpkZXNjOworCVdWTEFOX0xGUkFNRSAqdHhGID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OworCWludCBsZW47CiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0gICAgaWYoIGxwID09IE5VTEwgKSB7Ci0gICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlByaXZhdGUgYWRhcHRlciBzdHJ1Y3QgaXMgTlVMTFxuIiApOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmKCBscC0+ZGV2ID09IE5VTEwgKSB7Ci0gICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIm5ldF9kZXZpY2Ugc3RydWN0IGluIHdsX3ByaXZhdGUgaXMgTlVMTFxuIiApOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorCWlmIChscCA9PSBOVUxMKSB7CisJCURCR19FUlJPUihEYmdJbmZvLCAiUHJpdmF0ZSBhZGFwdGVyIHN0cnVjdCBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZiAobHAtPmRldiA9PSBOVUxMKSB7CisJCURCR19FUlJPUihEYmdJbmZvLCAibmV0X2RldmljZSBzdHJ1Y3QgaW4gd2xfcHJpdmF0ZSBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KIAotICAgIC8qIENoZWNrIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIEZJRHM7IGlmIG5vbmUgYXJlIGF2YWlsYWJsZSwgZG9uJ3QgdGFrZSBhbnkKLSAgICAgICBmcmFtZXMgb2ZmIHRoZSB0eFEgKi8KLSAgICBpZiggbHAtPmhjZkN0eC5JRkJfUnNjSW5kID09IDAgKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisJLyoKKwkgKiBDaGVjayBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBGSURzOyBpZiBub25lIGFyZSBhdmFpbGFibGUsCisJICogZG9uJ3QgdGFrZSBhbnkgZnJhbWVzIG9mZiB0aGUgdHhRCisJICovCisJaWYgKGxwLT5oY2ZDdHguSUZCX1JzY0luZCA9PSAwKQorCQlyZXR1cm4gRkFMU0U7CiAKLSAgICAvKiBSZWNsYWltIHRoZSBUeFEgRWxlbWVudHMgYW5kIHBsYWNlIHRoZW0gYmFjayBvbiB0aGUgZnJlZSBxdWV1ZSAqLwotICAgIGlmKCAhbGlzdF9lbXB0eSggJiggbHAtPnR4UVswXSApKSkgewotICAgICAgICBlbGVtZW50ID0gbHAtPnR4UVswXS5uZXh0OworCS8qIFJlY2xhaW0gdGhlIFR4USBFbGVtZW50cyBhbmQgcGxhY2UgdGhlbSBiYWNrIG9uIHRoZSBmcmVlIHF1ZXVlICovCisJaWYgKCFsaXN0X2VtcHR5KCYobHAtPnR4UVswXSkpKSB7CisJCWVsZW1lbnQgPSBscC0+dHhRWzBdLm5leHQ7CiAKLSAgICAgICAgdHhGID0gKFdWTEFOX0xGUkFNRSAqIClsaXN0X2VudHJ5KCBlbGVtZW50LCBXVkxBTl9MRlJBTUUsIG5vZGUgKTsKLSAgICAgICAgaWYoIHR4RiAhPSBOVUxMICkgewotICAgICAgICAgICAgbHAtPnR4Ri5za2IgID0gdHhGLT5mcmFtZS5za2I7Ci0gICAgICAgICAgICBscC0+dHhGLnBvcnQgPSB0eEYtPmZyYW1lLnBvcnQ7CisJCXR4RiA9IChXVkxBTl9MRlJBTUUgKikgbGlzdF9lbnRyeShlbGVtZW50LCBXVkxBTl9MRlJBTUUsIG5vZGUpOworCQlpZiAodHhGICE9IE5VTEwpIHsKKwkJCWxwLT50eEYuc2tiID0gdHhGLT5mcmFtZS5za2I7CisJCQlscC0+dHhGLnBvcnQgPSB0eEYtPmZyYW1lLnBvcnQ7CiAKLSAgICAgICAgICAgIHR4Ri0+ZnJhbWUuc2tiICA9IE5VTEw7Ci0gICAgICAgICAgICB0eEYtPmZyYW1lLnBvcnQgPSAwOworCQkJdHhGLT5mcmFtZS5za2IgPSBOVUxMOworCQkJdHhGLT5mcmFtZS5wb3J0ID0gMDsKIAotICAgICAgICAgICAgbGlzdF9kZWwoICYoIHR4Ri0+bm9kZSApKTsKLSAgICAgICAgICAgIGxpc3RfYWRkKCBlbGVtZW50LCAmKCBscC0+dHhGcmVlICkpOworCQkJbGlzdF9kZWwoJih0eEYtPm5vZGUpKTsKKwkJCWxpc3RfYWRkKGVsZW1lbnQsICYobHAtPnR4RnJlZSkpOwogCi0gICAgICAgICAgICBscC0+dHhRX2NvdW50LS07CisJCQlscC0+dHhRX2NvdW50LS07CiAKLSAgICAgICAgICAgIGlmKCBscC0+dHhRX2NvdW50IDwgVFhfUV9MT1dfV0FURVJfTUFSSyApIHsKLSAgICAgICAgICAgICAgICBpZiggbHAtPm5ldGlmX3F1ZXVlX29uID09IEZBTFNFICkgewotICAgICAgICAgICAgICAgICAgICBEQkdfVFgoIERiZ0luZm8sICJLaWNrc3RhcnRpbmcgUTogJWRcbiIsIGxwLT50eFFfY291bnQgKTsKLSAgICAgICAgICAgICAgICAgICAgbmV0aWZfd2FrZV9xdWV1ZSggbHAtPmRldiApOwotICAgICAgICAgICAgICAgICAgICBXTF9XRFNfTkVUSUZfV0FLRV9RVUVVRSggbHAgKTsKLSAgICAgICAgICAgICAgICAgICAgbHAtPm5ldGlmX3F1ZXVlX29uID0gVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisJCQlpZiAobHAtPnR4UV9jb3VudCA8IFRYX1FfTE9XX1dBVEVSX01BUkspIHsKKwkJCQlpZiAobHAtPm5ldGlmX3F1ZXVlX29uID09IEZBTFNFKSB7CisJCQkJCURCR19UWChEYmdJbmZvLCAiS2lja3N0YXJ0aW5nIFE6ICVkXG4iLAorCQkJCQkgICAgICAgbHAtPnR4UV9jb3VudCk7CisJCQkJCW5ldGlmX3dha2VfcXVldWUobHAtPmRldik7CisJCQkJCVdMX1dEU19ORVRJRl9XQUtFX1FVRVVFKGxwKTsKKwkJCQkJbHAtPm5ldGlmX3F1ZXVlX29uID0gVFJVRTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CiAKLSAgICBpZiggbHAtPnR4Ri5za2IgPT0gTlVMTCApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKwlpZiAobHAtPnR4Ri5za2IgPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOwogCi0gICAgLyogSWYgdGhlIGRldmljZSBoYXMgcmVzb3VyY2VzIChGSURzKSBhdmFpbGFibGUsIHRoZW4gVHggdGhlIHBhY2tldCAqLwotICAgIC8qIEZvcm1hdCB0aGUgVHhSZXF1ZXN0IGFuZCBzZW5kIGl0IHRvIHRoZSBhZGFwdGVyICovCi0gICAgbGVuID0gbHAtPnR4Ri5za2ItPmxlbiA8IEVUSF9aTEVOID8gRVRIX1pMRU4gOiBscC0+dHhGLnNrYi0+bGVuOworCS8qIElmIHRoZSBkZXZpY2UgaGFzIHJlc291cmNlcyAoRklEcykgYXZhaWxhYmxlLCB0aGVuIFR4IHRoZSBwYWNrZXQgKi8KKwkvKiBGb3JtYXQgdGhlIFR4UmVxdWVzdCBhbmQgc2VuZCBpdCB0byB0aGUgYWRhcHRlciAqLworCWxlbiA9IGxwLT50eEYuc2tiLT5sZW4gPCBFVEhfWkxFTiA/IEVUSF9aTEVOIDogbHAtPnR4Ri5za2ItPmxlbjsKIAotICAgIGRlc2MgICAgICAgICAgICAgICAgICAgID0gJiggbHAtPmRlc2NfdHggKTsKLSAgICBkZXNjLT5idWZfYWRkciAgICAgICAgICA9IGxwLT50eEYuc2tiLT5kYXRhOwotICAgIGRlc2MtPkJVRl9DTlQgICAgICAgICAgID0gbGVuOwotICAgIGRlc2MtPm5leHRfZGVzY19hZGRyICAgID0gTlVMTDsKKwlkZXNjID0gJihscC0+ZGVzY190eCk7CisJZGVzYy0+YnVmX2FkZHIgPSBscC0+dHhGLnNrYi0+ZGF0YTsKKwlkZXNjLT5CVUZfQ05UID0gbGVuOworCWRlc2MtPm5leHRfZGVzY19hZGRyID0gTlVMTDsKIAotICAgIHN0YXR1cyA9IGhjZl9zZW5kX21zZyggJiggbHAtPmhjZkN0eCApLCBkZXNjLCBscC0+dHhGLnBvcnQgKTsKKwlzdGF0dXMgPSBoY2Zfc2VuZF9tc2coJihscC0+aGNmQ3R4KSwgZGVzYywgbHAtPnR4Ri5wb3J0KTsKIAotICAgIGlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7Ci0gICAgICAgIGxwLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlpZiAoc3RhdHVzID09IEhDRl9TVUNDRVNTKSB7CisJCWxwLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIAotICAgICAgICBEQkdfVFgoIERiZ0luZm8sICJUcmFuc21pdC4uLlxuIiApOworCQlEQkdfVFgoRGJnSW5mbywgIlRyYW5zbWl0Li4uXG4iKTsKIAotICAgICAgICBpZiggbHAtPnR4Ri5wb3J0ID09IEhDRl9QT1JUXzAgKSB7Ci0gICAgICAgICAgICBscC0+c3RhdHMudHhfcGFja2V0cysrOwotICAgICAgICAgICAgbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxwLT50eEYuc2tiLT5sZW47Ci0gICAgICAgIH0KLQorCQlpZiAobHAtPnR4Ri5wb3J0ID09IEhDRl9QT1JUXzApIHsKKwkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlscC0+c3RhdHMudHhfYnl0ZXMgKz0gbHAtPnR4Ri5za2ItPmxlbjsKKwkJfQogI2lmZGVmIFVTRV9XRFMKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBscC0+d2RzX3BvcnRbKCggbHAtPnR4Ri5wb3J0ID4+IDggKSAtIDEpXS5zdGF0cy50eF9wYWNrZXRzKys7Ci0gICAgICAgICAgICBscC0+d2RzX3BvcnRbKCggbHAtPnR4Ri5wb3J0ID4+IDggKSAtIDEpXS5zdGF0cy50eF9ieXRlcyArPSBscC0+dHhGLnNrYi0+bGVuOwotICAgICAgICB9CisJCWVsc2UgeworCQkJbHAtPndkc19wb3J0WygobHAtPnR4Ri5wb3J0ID4+IDgpIC0KKwkJCQkgICAgICAxKV0uc3RhdHMudHhfcGFja2V0cysrOworCQkJbHAtPndkc19wb3J0WygobHAtPnR4Ri5wb3J0ID4+IDgpIC0KKwkJCQkgICAgICAxKV0uc3RhdHMudHhfYnl0ZXMgKz0gbHAtPnR4Ri5za2ItPmxlbjsKKwkJfQogCi0jZW5kaWYgIC8qIFVTRV9XRFMgKi8KKyNlbmRpZiAvKiBVU0VfV0RTICovCiAKLSAgICAgICAgLyogRnJlZSB0aGUgc2tiIGFuZCBwZXJmb3JtIHF1ZXVlIGNsZWFudXAsIGFzIHRoZSBidWZmZXIgd2FzCi0gICAgICAgICAgICB0cmFuc21pdHRlZCBzdWNjZXNzZnVsbHkgKi8KLSAgICAgICAgZGV2X2tmcmVlX3NrYiggbHAtPnR4Ri5za2IgKTsKKwkJLyogRnJlZSB0aGUgc2tiIGFuZCBwZXJmb3JtIHF1ZXVlIGNsZWFudXAsIGFzIHRoZSBidWZmZXIgd2FzCisJCSAgIHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseSAqLworCQlkZXZfa2ZyZWVfc2tiKGxwLT50eEYuc2tiKTsKIAotICAgICAgICBscC0+dHhGLnNrYiA9IE5VTEw7Ci0gICAgICAgIGxwLT50eEYucG9ydCA9IDA7Ci0gICAgfQorCQlscC0+dHhGLnNrYiA9IE5VTEw7CisJCWxwLT50eEYucG9ydCA9IDA7CisJfQogCi0gICAgcmV0dXJuIFRSVUU7Ci19IC8vIHdsX3NlbmQKKwlyZXR1cm4gVFJVRTsKK30JCQkJLyogd2xfc2VuZCAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNzQ0LDc1ICs3MjUsNzQgQEAKICAqICAgICAgMSBvbiBlcnJvcgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgd2xfdHgoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwb3J0ICkKK2ludCB3bF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcG9ydCkKIHsKLSAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBmbGFnczsKLSAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSB3bF9wcml2KGRldik7Ci0gICAgV1ZMQU5fTEZSQU1FICAgICAgICAgICAgKnR4RiA9IE5VTEw7Ci0gICAgc3RydWN0IGxpc3RfaGVhZCAgICAgICAgKmVsZW1lbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJV1ZMQU5fTEZSQU1FICp0eEYgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7CiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0gICAgLyogR3JhYiB0aGUgc3BpbmxvY2sgKi8KLSAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisJLyogR3JhYiB0aGUgc3BpbmxvY2sgKi8KKwl3bF9sb2NrKGxwLCAmZmxhZ3MpOwogCi0gICAgaWYoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApIHsKLSAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJVSUwgaGFzIGRldmljZSBibG9ja2VkXG4iICk7Ci0gICAgICAgIC8qIFN0YXJ0IGRyb3BwaW5nIHBhY2tldHMgaGVyZT8/PyAqLwotCXdsX3VubG9jayggbHAsICZmbGFncyApOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KKwlpZiAobHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZKSB7CisJCURCR19XQVJOSU5HKERiZ0luZm8sICJVSUwgaGFzIGRldmljZSBibG9ja2VkXG4iKTsKKwkJLyogU3RhcnQgZHJvcHBpbmcgcGFja2V0cyBoZXJlPz8/ICovCisJCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQogI2lmZGVmIFVTRV9SVFMKLSAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgewotICAgICAgICBEQkdfUFJJTlQoICJSVFM6IHdlJ3JlIGdldHRpbmcgYSBUeC4uLlxuIiApOwotCXdsX3VubG9jayggbHAsICZmbGFncyApOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KKwlpZiAobHAtPnVzZVJUUyA9PSAxKSB7CisJCURCR19QUklOVCgiUlRTOiB3ZSdyZSBnZXR0aW5nIGEgVHguLi5cbiIpOworCQl3bF91bmxvY2sobHAsICZmbGFncyk7CisJCXJldHVybiAxOworCX0KKyNlbmRpZiAvKiBVU0VfUlRTICovCiAKLSAgICBpZiggIWxwLT51c2VfZG1hICkgewotICAgICAgICAvKiBHZXQgYW4gZWxlbWVudCBmcm9tIHRoZSBxdWV1ZSAqLwotICAgICAgICBlbGVtZW50ID0gbHAtPnR4RnJlZS5uZXh0OwotICAgICAgICB0eEYgPSAoV1ZMQU5fTEZSQU1FICopbGlzdF9lbnRyeSggZWxlbWVudCwgV1ZMQU5fTEZSQU1FLCBub2RlICk7Ci0gICAgICAgIGlmKCB0eEYgPT0gTlVMTCApIHsKLSAgICAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlByb2JsZW0gd2l0aCBsaXN0X2VudHJ5XG4iICk7Ci0JICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRmlsbCBvdXQgdGhlIGZyYW1lICovCi0gICAgICAgIHR4Ri0+ZnJhbWUuc2tiID0gc2tiOwotICAgICAgICB0eEYtPmZyYW1lLnBvcnQgPSBwb3J0OwotICAgICAgICAvKiBNb3ZlIHRoZSBmcmFtZSB0byB0aGUgdHhRICovCi0gICAgICAgIC8qIE5PVEU6IEhlcmUncyB3aGVyZSB3ZSB3b3VsZCBkbyBwcmlvcml0eSBxdWV1ZWluZyAqLwotICAgICAgICBsaXN0X21vdmUoJih0eEYtPm5vZGUpLCAmKGxwLT50eFFbMF0pKTsKKwlpZiAoIWxwLT51c2VfZG1hKSB7CisJCS8qIEdldCBhbiBlbGVtZW50IGZyb20gdGhlIHF1ZXVlICovCisJCWVsZW1lbnQgPSBscC0+dHhGcmVlLm5leHQ7CisJCXR4RiA9IChXVkxBTl9MRlJBTUUgKikgbGlzdF9lbnRyeShlbGVtZW50LCBXVkxBTl9MRlJBTUUsIG5vZGUpOworCQlpZiAodHhGID09IE5VTEwpIHsKKwkJCURCR19FUlJPUihEYmdJbmZvLCAiUHJvYmxlbSB3aXRoIGxpc3RfZW50cnlcbiIpOworCQkJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJLyogRmlsbCBvdXQgdGhlIGZyYW1lICovCisJCXR4Ri0+ZnJhbWUuc2tiID0gc2tiOworCQl0eEYtPmZyYW1lLnBvcnQgPSBwb3J0OworCQkvKiBNb3ZlIHRoZSBmcmFtZSB0byB0aGUgdHhRICovCisJCS8qIE5PVEU6IEhlcmUncyB3aGVyZSB3ZSB3b3VsZCBkbyBwcmlvcml0eSBxdWV1ZWluZyAqLworCQlsaXN0X21vdmUoJih0eEYtPm5vZGUpLCAmKGxwLT50eFFbMF0pKTsKIAotICAgICAgICBscC0+dHhRX2NvdW50Kys7Ci0gICAgICAgIGlmKCBscC0+dHhRX2NvdW50ID49IERFRkFVTFRfTlVNX1RYX0ZSQU1FUyApIHsKLSAgICAgICAgICAgIERCR19UWCggRGJnSW5mbywgIlEgRnVsbDogJWRcbiIsIGxwLT50eFFfY291bnQgKTsKLSAgICAgICAgICAgIGlmKCBscC0+bmV0aWZfcXVldWVfb24gPT0gVFJVRSApIHsKLSAgICAgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKCBscC0+ZGV2ICk7Ci0gICAgICAgICAgICAgICAgV0xfV0RTX05FVElGX1NUT1BfUVVFVUUoIGxwICk7Ci0gICAgICAgICAgICAgICAgbHAtPm5ldGlmX3F1ZXVlX29uID0gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgd2xfYWN0X2ludF9vZmYoIGxwICk7IC8qIERpc2FibGUgSW50ZXJydXB0cyAqLworCQlscC0+dHhRX2NvdW50Kys7CisJCWlmIChscC0+dHhRX2NvdW50ID49IERFRkFVTFRfTlVNX1RYX0ZSQU1FUykgeworCQkJREJHX1RYKERiZ0luZm8sICJRIEZ1bGw6ICVkXG4iLCBscC0+dHhRX2NvdW50KTsKKwkJCWlmIChscC0+bmV0aWZfcXVldWVfb24gPT0gVFJVRSkgeworCQkJCW5ldGlmX3N0b3BfcXVldWUobHAtPmRldik7CisJCQkJV0xfV0RTX05FVElGX1NUT1BfUVVFVUUobHApOworCQkJCWxwLT5uZXRpZl9xdWV1ZV9vbiA9IEZBTFNFOworCQkJfQorCQl9CisJfQorCXdsX2FjdF9pbnRfb2ZmKGxwKTsJLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCiAKLSAgICAvKiBTZW5kIHRoZSBkYXRhIHRvIHRoZSBoYXJkd2FyZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kICovCisJLyogU2VuZCB0aGUgZGF0YSB0byB0aGUgaGFyZHdhcmUgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCAqLwogI2lmZGVmIEVOQUJMRV9ETUEKLSAgICBpZiggbHAtPnVzZV9kbWEgKSB7Ci0gICAgICAgIHdsX3NlbmRfZG1hKCBscCwgc2tiLCBwb3J0ICk7Ci0gICAgfQotICAgIGVsc2UKKwlpZiAobHAtPnVzZV9kbWEpIHsKKwkJd2xfc2VuZF9kbWEobHAsIHNrYiwgcG9ydCk7CisJfSBlbHNlCiAjZW5kaWYKLSAgICB7Ci0gICAgICAgIHdsX3NlbmQoIGxwICk7Ci0gICAgfQotICAgIC8qIFJlLWVuYWJsZSBJbnRlcnJ1cHRzLCByZWxlYXNlIHRoZSBzcGlubG9jayBhbmQgcmV0dXJuICovCi0gICAgd2xfYWN0X2ludF9vbiggbHAgKTsKLSAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKLSAgICByZXR1cm4gMDsKLX0gLy8gd2xfdHgKKwl7CisJCXdsX3NlbmQobHApOworCX0KKwkvKiBSZS1lbmFibGUgSW50ZXJydXB0cywgcmVsZWFzZSB0aGUgc3BpbmxvY2sgYW5kIHJldHVybiAqLworCXdsX2FjdF9pbnRfb24obHApOworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwlyZXR1cm4gMDsKK30JCQkJLyogd2xfdHggKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTgzNSw2NyArODE1LDY4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50IHdsX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgcG9ydDsKLSAgICBzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqc2tiOwotICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0gICAgaGNmXzE2ICAgICAgICAgICAgICAgICAgcGt0bGVuOwotICAgIGhjZl8xNiAgICAgICAgICAgICAgICAgIGhmc19zdGF0OwotICAgIERFU0NfU1RSQ1QgICAgICAgICAgICAgICpkZXNjOworCWludCBwb3J0OworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCWludCBzdGF0dXM7CisJaGNmXzE2IHBrdGxlbjsKKwloY2ZfMTYgaGZzX3N0YXQ7CisJREVTQ19TVFJDVCAqZGVzYzsKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSAgICBEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CisJREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOwogCi0gICAgaWYoISggbHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZICkpIHsKKwlpZiAoIShscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kpKSB7CiAKICNpZmRlZiBVU0VfUlRTCi0gICAgICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7Ci0gICAgICAgICAgICBEQkdfUFJJTlQoICJSVFM6IFdlJ3JlIGdldHRpbmcgYW4gUnguLi5cbiIgKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlPOwotICAgICAgICB9Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KKwkJaWYgKGxwLT51c2VSVFMgPT0gMSkgeworCQkJREJHX1BSSU5UKCJSVFM6IFdlJ3JlIGdldHRpbmcgYW4gUnguLi5cbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKyNlbmRpZiAvKiBVU0VfUlRTICovCiAKLSAgICAgICAgLyogUmVhZCB0aGUgSEZTX1NUQVQgcmVnaXN0ZXIgZnJvbSB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLwotICAgICAgICBoZnNfc3RhdCA9IChoY2ZfMTYpKCggbHAtPmxvb2tBaGVhZEJ1ZltIRlNfU1RBVF0gKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUICsgMV0gPDwgOCApKTsKKwkJLyogUmVhZCB0aGUgSEZTX1NUQVQgcmVnaXN0ZXIgZnJvbSB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLworCQloZnNfc3RhdCA9IChoY2ZfMTYpICgobHAtPmxvb2tBaGVhZEJ1ZltIRlNfU1RBVF0pIHwKKwkJCQkgICAgIChscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUICsgMV0gPDwgOCkpOwogCi0gICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgZnJhbWUgaXNuJ3QgYmFkICovCi0gICAgICAgIGlmKCggaGZzX3N0YXQgJiBIRlNfU1RBVF9FUlIgKSAhPSBIQ0ZfU1VDQ0VTUyApIHsKLSAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiSEZTX1NUQVRfRVJST1IgKDB4JXgpIGluIFJ4IFBhY2tldFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUXSApOwotICAgICAgICAgICAgcmV0dXJuIC1FSU87Ci0gICAgICAgIH0KKwkJLyogTWFrZSBzdXJlIHRoZSBmcmFtZSBpc24ndCBiYWQgKi8KKwkJaWYgKChoZnNfc3RhdCAmIEhGU19TVEFUX0VSUikgIT0gSENGX1NVQ0NFU1MpIHsKKwkJCURCR19XQVJOSU5HKERiZ0luZm8sCisJCQkJICAgICJIRlNfU1RBVF9FUlJPUiAoMHgleCkgaW4gUnggUGFja2V0XG4iLAorCQkJCSAgICBscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUXSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQogCi0gICAgICAgIC8qIERldGVybWluZSB3aGF0IHBvcnQgdGhpcyBwYWNrZXQgaXMgZm9yICovCi0gICAgICAgIHBvcnQgPSAoIGhmc19zdGF0ID4+IDggKSAmIDB4MDAwNzsKLSAgICAgICAgREJHX1JYKCBEYmdJbmZvLCAiUnggZnJhbWUgZm9yIHBvcnQgJWRcbiIsIHBvcnQgKTsKKwkJLyogRGV0ZXJtaW5lIHdoYXQgcG9ydCB0aGlzIHBhY2tldCBpcyBmb3IgKi8KKwkJcG9ydCA9IChoZnNfc3RhdCA+PiA4KSAmIDB4MDAwNzsKKwkJREJHX1JYKERiZ0luZm8sICJSeCBmcmFtZSBmb3IgcG9ydCAlZFxuIiwgcG9ydCk7CiAKLSAgICAgICAgcGt0bGVuID0gbHAtPmhjZkN0eC5JRkJfUnhMZW47Ci0gICAgICAgIGlmIChwa3RsZW4gIT0gMCkgewotICAgICAgICAgICAgc2tiID0gQUxMT0NfU0tCKHBrdGxlbik7Ci0gICAgICAgICAgICBpZiAoc2tiICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIG5ldGRldiBiYXNlZCBvbiB0aGUgcG9ydCAqLwotICAgICAgICAgICAgICAgIHN3aXRjaCggcG9ydCApIHsKKwkJcGt0bGVuID0gbHAtPmhjZkN0eC5JRkJfUnhMZW47CisJCWlmIChwa3RsZW4gIT0gMCkgeworCQkJc2tiID0gQUxMT0NfU0tCKHBrdGxlbik7CisJCQlpZiAoc2tiICE9IE5VTEwpIHsKKwkJCQkvKiBTZXQgdGhlIG5ldGRldiBiYXNlZCBvbiB0aGUgcG9ydCAqLworCQkJCXN3aXRjaCAocG9ydCkgewogI2lmZGVmIFVTRV9XRFMKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBscC0+d2RzX3BvcnRbcG9ydC0xXS5kZXY7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmICAvKiBVU0VfV0RTICovCisJCQkJY2FzZSAxOgorCQkJCWNhc2UgMjoKKwkJCQljYXNlIDM6CisJCQkJY2FzZSA0OgorCQkJCWNhc2UgNToKKwkJCQljYXNlIDY6CisJCQkJCXNrYi0+ZGV2ID0gbHAtPndkc19wb3J0W3BvcnQgLSAxXS5kZXY7CisJCQkJCWJyZWFrOworI2VuZGlmIC8qIFVTRV9XRFMgKi8KIAotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBza2ItPmRldiA9IGRldjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQorCQkJCWNhc2UgMDoKKwkJCQlkZWZhdWx0OgorCQkJCQlza2ItPmRldiA9IGRldjsKKwkJCQkJYnJlYWs7CisJCQkJfQogCi0gICAgICAgICAgICAgICAgZGVzYyA9ICYoIGxwLT5kZXNjX3J4ICk7CisJCQkJZGVzYyA9ICYobHAtPmRlc2NfcngpOwogCi0gICAgICAgICAgICAgICAgZGVzYy0+bmV4dF9kZXNjX2FkZHIgPSBOVUxMOworCQkJCWRlc2MtPm5leHRfZGVzY19hZGRyID0gTlVMTDsKIAogLyoKICNkZWZpbmUgQkxPQ0tfSU5QVVQoYnVmLCBsZW4pIFwKQEAgLTkwNCw2NyArODg1LDczIEBACiAgICAgc3RhdHVzID0gaGNmX3Jjdl9tc2coJihscC0+aGNmQ3R4KSwgZGVzYywgMCkKICovCiAKLSAgICAgICAgICAgICAgICBHRVRfUEFDS0VUKCBza2ItPmRldiwgc2tiLCBwa3RsZW4gKTsKKwkJCQlHRVRfUEFDS0VUKHNrYi0+ZGV2LCBza2IsIHBrdGxlbik7CiAKLSAgICAgICAgICAgICAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgewotICAgICAgICAgICAgICAgICAgICBuZXRpZl9yeCggc2tiICk7CisJCQkJaWYgKHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUykgeworCQkJCQluZXRpZl9yeChza2IpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwb3J0ID09IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfcGFja2V0cysrOwotICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdGxlbjsKLSAgICAgICAgICAgICAgICAgICAgfQorCQkJCQlpZiAocG9ydCA9PSAwKSB7CisJCQkJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdGxlbjsKKwkJCQkJfQogI2lmZGVmIFVTRV9XRFMKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9wYWNrZXRzKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZiAgLyogVVNFX1dEUyAqLworCQkJCQllbHNlIHsKKwkJCQkJCWxwLT53ZHNfcG9ydFtwb3J0IC0KKwkJCQkJCQkgICAgIDFdLnN0YXRzLgorCQkJCQkJICAgIHJ4X3BhY2tldHMrKzsKKwkJCQkJCWxwLT53ZHNfcG9ydFtwb3J0IC0KKwkJCQkJCQkgICAgIDFdLnN0YXRzLgorCQkJCQkJICAgIHJ4X2J5dGVzICs9IHBrdGxlbjsKKwkJCQkJfQorI2VuZGlmIC8qIFVTRV9XRFMgKi8KIAotICAgICAgICAgICAgICAgICAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCiAjaWZkZWYgV0lSRUxFU1NfRVhUCiAjaWZkZWYgV0lSRUxFU1NfU1BZCi0gICAgICAgICAgICAgICAgICAgIGlmKCBscC0+c3B5ZGF0YS5zcHlfbnVtYmVyID4gMCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnNyY2FkZHIgPSBza2ItPm1hYy5yYXcgKyBNQUNfQUREUl9TSVpFOworCQkJCQlpZiAobHAtPnNweWRhdGEuc3B5X251bWJlciA+IDApIHsKKwkJCQkJCWNoYXIgKnNyY2FkZHIgPQorCQkJCQkJICAgIHNrYi0+bWFjLnJhdyArCisJCQkJCQkgICAgTUFDX0FERFJfU0laRTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgd2xfc3B5X2dhdGhlciggZGV2LCBzcmNhZGRyICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJCXdsX3NweV9nYXRoZXIoZGV2LCBzcmNhZGRyKTsKKwkJCQkJfQogI2VuZGlmIC8qIFdJUkVMRVNTX1NQWSAqLwogI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCAqLwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlJ4IHJlcXVlc3QgdG8gY2FyZCBGQUlMRURcbiIgKTsKKwkJCQl9IGVsc2UgeworCQkJCQlEQkdfRVJST1IoRGJnSW5mbywKKwkJCQkJCSAgIlJ4IHJlcXVlc3QgdG8gY2FyZCBGQUlMRURcbiIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwb3J0ID09IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfZHJvcHBlZCsrOwotICAgICAgICAgICAgICAgICAgICB9CisJCQkJCWlmIChwb3J0ID09IDApCisJCQkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOwogI2lmZGVmIFVTRV9XRFMKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9kcm9wcGVkKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZiAgLyogVVNFX1dEUyAqLworCQkJCQllbHNlIHsKKwkJCQkJCWxwLT53ZHNfcG9ydFtwb3J0IC0KKwkJCQkJCQkgICAgIDFdLnN0YXRzLgorCQkJCQkJICAgIHJ4X2Ryb3BwZWQrKzsKKwkJCQkJfQorI2VuZGlmIC8qIFVTRV9XRFMgKi8KIAotICAgICAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKCBza2IgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCBhbGxvYyBza2JcbiIgKTsKKwkJCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJREJHX0VSUk9SKERiZ0luZm8sICJDb3VsZCBub3QgYWxsb2Mgc2tiXG4iKTsKIAotICAgICAgICAgICAgICAgIGlmKCBwb3J0ID09IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9kcm9wcGVkKys7Ci0gICAgICAgICAgICAgICAgfQorCQkJCWlmIChwb3J0ID09IDApCisJCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAjaWZkZWYgVVNFX1dEUwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X2Ryb3BwZWQrKzsKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYgIC8qIFVTRV9XRFMgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KKwkJCQllbHNlIHsKKwkJCQkJbHAtPndkc19wb3J0W3BvcnQgLQorCQkJCQkJICAgICAxXS5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJfQorI2VuZGlmIC8qIFVTRV9XRFMgKi8KKwkJCX0KKwkJfQorCX0KIAotICAgIHJldHVybiAwOwotfSAvLyB3bF9yeAorCXJldHVybiAwOworfQkJCQkvKiB3bF9yeCAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTg2LDE0MiArOTczLDE1OSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBORVdfTVVMVElDQVNUCiAKLXZvaWQgd2xfbXVsdGljYXN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3ZvaWQgd2xfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0jaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEgLy87P3Nob3VsZCB3ZSByZXR1cm4gYW4gZXJyb3Igc3RhdHVzIGluIEFQIG1vZGUKLS8vOz9zZWVtcyByZWFzb25hYmxlIHRoYXQgZXZlbiBhbiBBUC1vbmx5IGRyaXZlciBjb3VsZCBhZmZvcmQgdGhpcyBzbWFsbCBhZGRpdGlvbmFsIGZvb3RwcmludAorI2lmIDEJCQkJLyogKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQSAqLworCS8qCisJICogc2hvdWxkIHdlIHJldHVybiBhbiBlcnJvciBzdGF0dXMgaW4gQVAgbW9kZSA/CisJICogc2VlbXMgcmVhc29uYWJsZSB0aGF0IGV2ZW4gYW4gQVAtb25seSBkcml2ZXIKKwkgKiBjb3VsZCBhZmZvcmQgdGhpcyBzbWFsbCBhZGRpdGlvbmFsIGZvb3RwcmludAorCSAqLwogCi0gICAgaW50ICAgICAgICAgICAgICAgICB4OwotICAgIHN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7Ci0gICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSB3bF9wcml2KGRldik7Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgICBmbGFnczsKKwlpbnQgeDsKKwlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0gICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CisJREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOwogCi0gICAgaWYoICF3bF9hZGFwdGVyX2lzX29wZW4oIGRldiApKQotICAgICAgICByZXR1cm47CisJaWYgKCF3bF9hZGFwdGVyX2lzX29wZW4oZGV2KSkKKwkJcmV0dXJuOwogCiAjaWYgREJHCi0gICAgaWYoIERCR19GTEFHUyggRGJnSW5mbyApICYgREJHX1BBUkFNX09OICkgewotICAgICAgICBEQkdfUFJJTlQoIiAgZmxhZ3M6ICVzJXMlc1xuIiwKLSAgICAgICAgICAgICggZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDICkgPyAiUHJvbWlzY3VvdXMgIiA6ICIiLAotICAgICAgICAgICAgKCBkZXYtPmZsYWdzICYgSUZGX01VTFRJQ0FTVCApID8gIk11bHRpY2FzdCAiIDogIiIsCi0gICAgICAgICAgICAoIGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgKSA/ICJBbGwtTXVsdGljYXN0IiA6ICIiICk7CisJaWYgKERCR19GTEFHUyhEYmdJbmZvKSAmIERCR19QQVJBTV9PTikgeworCQlEQkdfUFJJTlQoIiAgZmxhZ3M6ICVzJXMlc1xuIiwKKwkJCSAgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgPyAiUHJvbWlzY3VvdXMgIiA6ICIiLAorCQkJICAoZGV2LT5mbGFncyAmIElGRl9NVUxUSUNBU1QpID8gIk11bHRpY2FzdCAiIDogIiIsCisJCQkgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSA/ICJBbGwtTXVsdGljYXN0IiA6ICIiKTsKIAotICAgICAgICBEQkdfUFJJTlQoICIgIG1jX2NvdW50OiAlZFxuIiwgbmV0ZGV2X21jX2NvdW50KGRldikpOworCQlEQkdfUFJJTlQoIiAgbWNfY291bnQ6ICVkXG4iLCBuZXRkZXZfbWNfY291bnQoZGV2KSk7CiAKLQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KQotCURCR19QUklOVCgiICAgICVwTSAoJWQpXG4iLCBoYS0+YWRkciwgZGV2LT5hZGRyX2xlbik7Ci0gICAgfQorCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KQorCQkgICAgREJHX1BSSU5UKCIgICAgJXBNICglZClcbiIsIGhhLT5hZGRyLCBkZXYtPmFkZHJfbGVuKTsKKwl9CiAjZW5kaWYgLyogREJHICovCiAKLSAgICBpZighKCBscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kgKSkgeworCWlmICghKGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSkpIHsKIAogI2lmZGVmIFVTRV9SVFMKLSAgICAgICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKLSAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlNraXBwaW5nIG11bHRpY2FzdCwgaW4gUlRTIG1vZGVcbiIgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotI2VuZGlmICAvKiBVU0VfUlRTICovCisJCWlmIChscC0+dXNlUlRTID09IDEpIHsKKwkJCURCR19UUkFDRShEYmdJbmZvLCAiU2tpcHBpbmcgbXVsdGljYXN0LCBpbiBSVFMgbW9kZVxuIik7CisJCQlyZXR1cm47CisJCX0KKyNlbmRpZiAvKiBVU0VfUlRTICovCiAKLSAgICAgICAgd2xfbG9jayggbHAsICZmbGFncyApOwotICAgICAgICB3bF9hY3RfaW50X29mZiggbHAgKTsKKwkJd2xfbG9jayhscCwgJmZsYWdzKTsKKwkJd2xfYWN0X2ludF9vZmYobHApOwogCi0JCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfU1RBICApIHsKLSAgICAgICAgICAgIGlmKCBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MgKSB7Ci0gICAgICAgICAgICAgICAgLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KLSAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7Ci0gICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUFJPTUlTQ1VPVVNfTU9ERTsKLSAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAxICk7Ci0gICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiRW5hYmxpbmcgUHJvbWlzY3VvdXMgbW9kZSAoSUZGX1BST01JU0MpXG4iICk7Ci0gICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgobmV0ZGV2X21jX2NvdW50KGRldikgPiBIQ0ZfTUFYX01VTFRJQ0FTVCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKCBkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJICkpIHsKLSAgICAgICAgICAgICAgICAvKiBTaHV0dGluZyBvZmYgdGhpcyBmaWx0ZXIgd2lsbCBlbmFibGUgYWxsIG11bHRpY2FzdCBmcmFtZXMgdG8KLSAgICAgICAgICAgICAgICAgICBiZSBzZW50IHVwIGZyb20gdGhlIGRldmljZTsgaG93ZXZlciwgdGhpcyBpcyBhIHN0YXRpYyBSSUQsIHNvCi0gICAgICAgICAgICAgICAgICAgYSBjYWxsIHRvIHdsX2FwcGx5KCkgaXMgbmVlZGVkICovCi0gICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9SWF9BTExfR1JPVVBfQUREUjsKLSAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAwICk7Ci0gICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiRW5hYmxpbmcgYWxsIG11bHRpY2FzdCBtb2RlIChJRkZfQUxMTVVMVEkpXG4iICk7Ci0gICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7Ci0gICAgICAgICAgICAgICAgd2xfYXBwbHkoIGxwICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghbmV0ZGV2X21jX2VtcHR5KGRldikpIHsKLSAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KLSAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiA9ICggbmV0ZGV2X21jX2NvdW50KGRldikgKiAzICkgKyAxOwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0dST1VQX0FERFI7CisJCWlmIChDTlZfSU5UX1RPX0xJVFRMRShscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQpID09CisJCSAgICBDT01QX0lEX0ZXX1NUQSkgeworCQkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkJCS8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCQkJbHAtPmx0dlJlY29yZC5sZW4gPSAyOworCQkJCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX1BST01JU0NVT1VTX01PREU7CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKDEpOworCQkJCURCR19QUklOVAorCQkJCSAgICAoIkVuYWJsaW5nIFByb21pc2N1b3VzIG1vZGUgKElGRl9QUk9NSVNDKVxuIik7CisJCQkJaGNmX3B1dF9pbmZvKCYobHAtPmhjZkN0eCksCisJCQkJCSAgICAgKExUVlApICYgKGxwLT5sdHZSZWNvcmQpKTsKKwkJCX0gZWxzZSBpZiAoKG5ldGRldl9tY19jb3VudChkZXYpID4gSENGX01BWF9NVUxUSUNBU1QpCisJCQkJICAgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCQkJLyogU2h1dHRpbmcgb2ZmIHRoaXMgZmlsdGVyIHdpbGwgZW5hYmxlIGFsbCBtdWx0aWNhc3QgZnJhbWVzIHRvCisJCQkJICAgYmUgc2VudCB1cCBmcm9tIHRoZSBkZXZpY2U7IGhvd2V2ZXIsIHRoaXMgaXMgYSBzdGF0aWMgUklELCBzbworCQkJCSAgIGEgY2FsbCB0byB3bF9hcHBseSgpIGlzIG5lZWRlZCAqLworCQkJCWxwLT5sdHZSZWNvcmQubGVuID0gMjsKKwkJCQlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DTkZfUlhfQUxMX0dST1VQX0FERFI7CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKDApOworCQkJCURCR19QUklOVAorCQkJCSAgICAoIkVuYWJsaW5nIGFsbCBtdWx0aWNhc3QgbW9kZSAoSUZGX0FMTE1VTFRJKVxuIik7CisJCQkJaGNmX3B1dF9pbmZvKCYobHAtPmhjZkN0eCksCisJCQkJCSAgICAgKExUVlApICYgKGxwLT5sdHZSZWNvcmQpKTsKKwkJCQl3bF9hcHBseShscCk7CisJCQl9IGVsc2UgaWYgKCFuZXRkZXZfbWNfZW1wdHkoZGV2KSkgeworCQkJCS8qIFNldCB0aGUgbXVsdGljYXN0IGFkZHJlc3NlcyAqLworCQkJCWxwLT5sdHZSZWNvcmQubGVuID0KKwkJCQkgICAgKG5ldGRldl9tY19jb3VudChkZXYpICogMykgKyAxOworCQkJCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0dST1VQX0FERFI7CiAKLQkJeCA9IDA7Ci0JCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgmKGxwLT5sdHZSZWNvcmQudS51OFt4KysgKiBFVEhfQUxFTl0pLAotCQkJICAgaGEtPmFkZHIsIEVUSF9BTEVOKTsKLSAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJTZXR0aW5nIG11bHRpY2FzdCBsaXN0XG4iICk7Ci0gICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSAqLwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKLSAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19QUk9NSVNDVU9VU19NT0RFOwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDAgKTsKLSAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJEaXNhYmxpbmcgUHJvbWlzY3VvdXMgbW9kZVxuIiApOwotICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCQkJCXggPSAwOworCQkJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpCisJCQkJICAgIG1lbWNweSgmCisJCQkJCSAgIChscC0+bHR2UmVjb3JkLnUudThbeCsrICogRVRIX0FMRU5dKSwKKwkJCQkJICAgaGEtPmFkZHIsIEVUSF9BTEVOKTsKKwkJCQlEQkdfUFJJTlQoIlNldHRpbmcgbXVsdGljYXN0IGxpc3RcbiIpOworCQkJCWhjZl9wdXRfaW5mbygmKGxwLT5oY2ZDdHgpLAorCQkJCQkgICAgIChMVFZQKSAmIChscC0+bHR2UmVjb3JkKSk7CisJCQl9IGVsc2UgeworCQkJCS8qIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCQkJCWxwLT5sdHZSZWNvcmQubGVuID0gMjsKKwkJCQlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19QUk9NSVNDVU9VU19NT0RFOworCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSgwKTsKKwkJCQlEQkdfUFJJTlQoIkRpc2FibGluZyBQcm9taXNjdW91cyBtb2RlXG4iKTsKKwkJCQloY2ZfcHV0X2luZm8oJihscC0+aGNmQ3R4KSwKKwkJCQkJICAgICAoTFRWUCkgJiAobHAtPmx0dlJlY29yZCkpOwogCi0gICAgICAgICAgICAgICAgLyogRGlzYWJsZSBtdWx0aWNhc3QgbW9kZSAqLwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuID0gMjsKLSAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCA9IENGR19HUk9VUF9BRERSOwotICAgICAgICAgICAgICAgIERCR19QUklOVCggIkRpc2FibGluZyBNdWx0aWNhc3QgbW9kZVxuIiApOwotICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCQkJCS8qIERpc2FibGUgbXVsdGljYXN0IG1vZGUgKi8KKwkJCQlscC0+bHR2UmVjb3JkLmxlbiA9IDI7CisJCQkJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfR1JPVVBfQUREUjsKKwkJCQlEQkdfUFJJTlQoIkRpc2FibGluZyBNdWx0aWNhc3QgbW9kZVxuIik7CisJCQkJaGNmX3B1dF9pbmZvKCYobHAtPmhjZkN0eCksCisJCQkJCSAgICAgKExUVlApICYgKGxwLT5sdHZSZWNvcmQpKTsKIAotICAgICAgICAgICAgICAgIC8qIFR1cm5pbmcgb24gdGhpcyBmaWx0ZXIgd2lsbCBwcmV2ZW50IGFsbCBtdWx0aWNhc3QgZnJhbWVzIGZyb20KLSAgICAgICAgICAgICAgICAgICBiZWluZyBzZW50IHVwIGZyb20gdGhlIGRldmljZTsgaG93ZXZlciwgdGhpcyBpcyBhIHN0YXRpYyBSSUQsCi0gICAgICAgICAgICAgICAgICAgc28gYSBjYWxsIHRvIHdsX2FwcGx5KCkgaXMgbmVlZGVkICovCi0gICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9SWF9BTExfR1JPVVBfQUREUjsKLSAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAxICk7Ci0gICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiRGlzYWJsaW5nIGFsbCBtdWx0aWNhc3QgbW9kZSAoSUZGX0FMTE1VTFRJKVxuIiApOwotICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwotICAgICAgICAgICAgICAgIHdsX2FwcGx5KCBscCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdsX2FjdF9pbnRfb24oIGxwICk7Ci0Jd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7Ci0gICAgfQorCQkJCS8qCisJCQkJICogVHVybmluZyBvbiB0aGlzIGZpbHRlciB3aWxsIHByZXZlbnQgYWxsIG11bHRpY2FzdCBmcmFtZXMgZnJvbQorCQkJCSAqIGJlaW5nIHNlbnQgdXAgZnJvbSB0aGUgZGV2aWNlOyBob3dldmVyLCB0aGlzIGlzIGEgc3RhdGljIFJJRCwKKwkJCQkgKiBzbyBhIGNhbGwgdG8gd2xfYXBwbHkoKSBpcyBuZWVkZWQKKwkJCQkgKi8KKwkJCQlscC0+bHR2UmVjb3JkLmxlbiA9IDI7CisJCQkJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ05GX1JYX0FMTF9HUk9VUF9BRERSOworCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSgxKTsKKwkJCQlEQkdfUFJJTlQKKwkJCQkgICAgKCJEaXNhYmxpbmcgYWxsIG11bHRpY2FzdCBtb2RlIChJRkZfQUxMTVVMVEkpXG4iKTsKKwkJCQloY2ZfcHV0X2luZm8oJihscC0+aGNmQ3R4KSwKKwkJCQkJICAgICAoTFRWUCkgJiAobHAtPmx0dlJlY29yZCkpOworCQkJCXdsX2FwcGx5KGxwKTsKKwkJCX0KKwkJfQorCQl3bF9hY3RfaW50X29uKGxwKTsKKwkJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCX0KICNlbmRpZiAvKiBIQ0ZfU1RBICovCi19IC8vIHdsX211bHRpY2FzdAorfQkJCQkvKiB3bF9tdWx0aWNhc3QgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogI2Vsc2UgLyogTkVXX01VTFRJQ0FTVCAqLwogCi12b2lkIHdsX211bHRpY2FzdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG51bV9hZGRycywgdm9pZCAqYWRkcnMgKQordm9pZCB3bF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG51bV9hZGRycywgdm9pZCAqYWRkcnMpCiB7Ci0gICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7Ci0gICAgREJHX1BBUkFNKCBEYmdJbmZvLCAibnVtX2FkZHJzIiwgIiVkIiwgbnVtX2FkZHJzICk7Ci0gICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiYWRkcnMiLCAiMHglcCIsIGFkZHJzICk7CisJREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOworCURCR19QQVJBTShEYmdJbmZvLCAibnVtX2FkZHJzIiwgIiVkIiwgbnVtX2FkZHJzKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgImFkZHJzIiwgIjB4JXAiLCBhZGRycyk7CiAKICNlcnJvciBPYnNvbGV0ZSBzZXQgbXVsdGljYXN0IGludGVyZmFjZSEKLX0gLy8gd2xfbXVsdGljYXN0Cit9CQkJCS8qIHdsX211bHRpY2FzdCAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAjZW5kaWYgLyogTkVXX01VTFRJQ0FTVCAqLwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHdsX25ldGRldl9vcHMgPQotewotICAgIC5uZG9fc3RhcnRfeG1pdCAgICAgICAgID0gJndsX3R4X3BvcnQwLAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB3bF9uZXRkZXZfb3BzID0geworCS5uZG9fc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0MCwKIAotICAgIC5uZG9fc2V0X2NvbmZpZyAgICAgICAgID0gJndsX2NvbmZpZywKLSAgICAubmRvX2dldF9zdGF0cyAgICAgICAgICA9ICZ3bF9zdGF0cywKLSAgICAubmRvX3NldF9yeF9tb2RlICAgICAgICA9ICZ3bF9tdWx0aWNhc3QsCisJLm5kb19zZXRfY29uZmlnID0gJndsX2NvbmZpZywKKwkubmRvX2dldF9zdGF0cyA9ICZ3bF9zdGF0cywKKwkubmRvX3NldF9yeF9tb2RlID0gJndsX211bHRpY2FzdCwKIAotICAgIC5uZG9faW5pdCAgICAgICAgICAgICAgID0gJndsX2luc2VydCwKLSAgICAubmRvX29wZW4gICAgICAgICAgICAgICA9ICZ3bF9hZGFwdGVyX29wZW4sCi0gICAgLm5kb19zdG9wICAgICAgICAgICAgICAgPSAmd2xfYWRhcHRlcl9jbG9zZSwKLSAgICAubmRvX2RvX2lvY3RsICAgICAgICAgICA9ICZ3bF9pb2N0bCwKKwkubmRvX2luaXQgPSAmd2xfaW5zZXJ0LAorCS5uZG9fb3BlbiA9ICZ3bF9hZGFwdGVyX29wZW4sCisJLm5kb19zdG9wID0gJndsX2FkYXB0ZXJfY2xvc2UsCisJLm5kb19kb19pb2N0bCA9ICZ3bF9pb2N0bCwKIAotICAgIC5uZG9fdHhfdGltZW91dCAgICAgICAgID0gJndsX3R4X3RpbWVvdXQsCisJLm5kb190eF90aW1lb3V0ID0gJndsX3R4X3RpbWVvdXQsCiAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotICAgIC5uZG9fcG9sbF9jb250cm9sbGVyICAgID0gd2xfcG9sbCwKKwkubmRvX3BvbGxfY29udHJvbGxlciA9IHdsX3BvbGwsCiAjZW5kaWYKIH07CiAKQEAgLTExNDQsNDggKzExNDgsNTEgQEAKICAqICAgICAgZGV2aWNlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgbmV0X2RldmljZSAqIHdsX2RldmljZV9hbGxvYyggdm9pZCApCitzdHJ1Y3QgbmV0X2RldmljZSAqd2xfZGV2aWNlX2FsbG9jKHZvaWQpCiB7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2ID0gTlVMTDsKLSAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gTlVMTDsKIAotICAgIC8qIEFsbG9jIGEgbmV0X2RldmljZSBzdHJ1Y3QgKi8KLSAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHdsX3ByaXZhdGUpKTsKLSAgICBpZiAoIWRldikKLSAgICAgICAgcmV0dXJuIE5VTEw7CisJLyogQWxsb2MgYSBuZXRfZGV2aWNlIHN0cnVjdCAqLworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgd2xfcHJpdmF0ZSkpOworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKIAotICAgIC8qIEluaXRpYWxpemUgdGhlICduZXh0JyBwb2ludGVyIGluIHRoZSBzdHJ1Y3QuIEN1cnJlbnRseSBvbmx5IHVzZWQgZm9yIFBDSSwKLSAgICAgICBidXQgZG8gaXQgaGVyZSBqdXN0IGluIGNhc2UgaXQncyB1c2VkIGZvciBvdGhlciBidXNlcyBpbiB0aGUgZnV0dXJlICovCi0gICAgbHAgPSB3bF9wcml2KGRldik7CisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSAnbmV4dCcgcG9pbnRlciBpbiB0aGUgc3RydWN0LgorCSAqIEN1cnJlbnRseSBvbmx5IHVzZWQgZm9yIFBDSSwKKwkgKiBidXQgZG8gaXQgaGVyZSBqdXN0IGluIGNhc2UgaXQncyB1c2VkCisJICogZm9yIG90aGVyIGJ1c2VzIGluIHRoZSBmdXR1cmUKKwkgKi8KKwlscCA9IHdsX3ByaXYoZGV2KTsKIAorCS8qIENoZWNrIE1UVSAqLworCWlmIChkZXYtPm10dSA+IE1UVV9NQVgpIHsKKwkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzOiBNVFUgc2V0IHRvbyBoaWdoLCBsaW1pdGluZyB0byAlZC5cbiIsCisJCQkgICAgZGV2LT5uYW1lLCBNVFVfTUFYKTsKKwkJZGV2LT5tdHUgPSBNVFVfTUFYOworCX0KIAotICAgIC8qIENoZWNrIE1UVSAqLwotICAgIGlmKCBkZXYtPm10dSA+IE1UVV9NQVggKQotICAgIHsKLQkgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICIlczogTVRVIHNldCB0b28gaGlnaCwgbGltaXRpbmcgdG8gJWQuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBNVFVfTUFYICk7Ci0gICAgCWRldi0+bXR1ID0gTVRVX01BWDsKLSAgICB9CisJLyogU2V0dXAgdGhlIGZ1bmN0aW9uIHRhYmxlIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwogCi0gICAgLyogU2V0dXAgdGhlIGZ1bmN0aW9uIHRhYmxlIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJndsX2l3X2hhbmRsZXJfZGVmOworCWxwLT53aXJlbGVzc19kYXRhLnNweV9kYXRhID0gJmxwLT5zcHlfZGF0YTsKKwlkZXYtPndpcmVsZXNzX2RhdGEgPSAmbHAtPndpcmVsZXNzX2RhdGE7CiAKLSAgICBkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZ3bF9pd19oYW5kbGVyX2RlZjsKLSAgICBscC0+d2lyZWxlc3NfZGF0YS5zcHlfZGF0YSA9ICZscC0+c3B5X2RhdGE7Ci0gICAgZGV2LT53aXJlbGVzc19kYXRhID0gJmxwLT53aXJlbGVzc19kYXRhOworCWRldi0+bmV0ZGV2X29wcyA9ICZ3bF9uZXRkZXZfb3BzOwogCi0gICAgZGV2LT5uZXRkZXZfb3BzID0gJndsX25ldGRldl9vcHM7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CiAKLSAgICBkZXYtPndhdGNoZG9nX3RpbWVvICAgICA9IFRYX1RJTUVPVVQ7CisJZGV2LT5ldGh0b29sX29wcyA9ICZ3bF9ldGh0b29sX29wczsKIAotICAgIGRldi0+ZXRodG9vbF9vcHMJICAgID0gJndsX2V0aHRvb2xfb3BzOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAotICAgIG5ldGlmX3N0b3BfcXVldWUoIGRldiApOworCS8qIEFsbG9jYXRlIHZpcnR1YWwgZGV2aWNlcyBmb3IgV0RTIHN1cHBvcnQgaWYgbmVlZGVkICovCisJV0xfV0RTX0RFVklDRV9BTExPQyhscCk7CiAKLSAgICAvKiBBbGxvY2F0ZSB2aXJ0dWFsIGRldmljZXMgZm9yIFdEUyBzdXBwb3J0IGlmIG5lZWRlZCAqLwotICAgIFdMX1dEU19ERVZJQ0VfQUxMT0MoIGxwICk7CisJcmV0dXJuIGRldjsKK30JCQkJLyogd2xfZGV2aWNlX2FsbG9jICovCiAKLSAgICByZXR1cm4gZGV2OwotfSAvLyB3bF9kZXZpY2VfYWxsb2MKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMjA2LDE1ICsxMjEzLDE0IEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHdsX2RldmljZV9kZWFsbG9jKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3ZvaWQgd2xfZGV2aWNlX2RlYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLS8vICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOworCS8qIERlYWxsb2MgdGhlIFdEUyBwb3J0cyAqLworCVdMX1dEU19ERVZJQ0VfREVBTExPQyhscCk7CiAKLSAgICAvKiBEZWFsbG9jIHRoZSBXRFMgcG9ydHMgKi8KLSAgICBXTF9XRFNfREVWSUNFX0RFQUxMT0MoIGxwICk7CisJZnJlZV9uZXRkZXYoZGV2KTsKK30JCQkJLyogd2xfZGV2aWNlX2RlYWxsb2MgKi8KIAotICAgIGZyZWVfbmV0ZGV2KCBkZXYgKTsKLX0gLy8gd2xfZGV2aWNlX2RlYWxsb2MKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMjM1LDE1ICsxMjQxLDE2IEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgd2xfdHhfcG9ydDAoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoraW50IHdsX3R4X3BvcnQwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCAwXG4iICk7CisJREJHX1RYKERiZ0luZm8sICJUeCBvbiBQb3J0IDBcbiIpOwogCi0gICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfMCApOworCXJldHVybiB3bF90eChza2IsIGRldiwgSENGX1BPUlRfMCk7CiAjaWZkZWYgRU5BQkxFX0RNQQotICAgIHJldHVybiB3bF90eF9kbWEoIHNrYiwgZGV2LCBIQ0ZfUE9SVF8wICk7CisJcmV0dXJuIHdsX3R4X2RtYShza2IsIGRldiwgSENGX1BPUlRfMCk7CiAjZW5kaWYKLX0gLy8gd2xfdHhfcG9ydDAKK30JCQkJLyogd2xfdHhfcG9ydDBpICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKICNpZmRlZiBVU0VfV0RTCkBAIC0xMjY2LDExICsxMjczLDEyIEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgd2xfdHhfcG9ydDEoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoraW50IHdsX3R4X3BvcnQxKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCAxXG4iICk7Ci0gICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfMSApOwotfSAvLyB3bF90eF9wb3J0MQorCURCR19UWChEYmdJbmZvLCAiVHggb24gUG9ydCAxXG4iKTsKKwlyZXR1cm4gd2xfdHgoc2tiLCBkZXYsIEhDRl9QT1JUXzEpOworfQkJCQkvKiB3bF90eF9wb3J0MSAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTI5MSwxMSArMTI5OSwxMiBAQAogICogICAgICBOL0EKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHdsX3R4X3BvcnQyKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK2ludCB3bF90eF9wb3J0MihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgMlxuIiApOwotICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzIgKTsKLX0gLy8gd2xfdHhfcG9ydDIKKwlEQkdfVFgoRGJnSW5mbywgIlR4IG9uIFBvcnQgMlxuIik7CisJcmV0dXJuIHdsX3R4KHNrYiwgZGV2LCBIQ0ZfUE9SVF8yKTsKK30JCQkJLyogd2xfdHhfcG9ydDIgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEzMTYsMTEgKzEzMjUsMTIgQEAKICAqICAgICAgTi9BCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB3bF90eF9wb3J0Myggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCitpbnQgd2xfdHhfcG9ydDMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDNcbiIgKTsKLSAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF8zICk7Ci19IC8vIHdsX3R4X3BvcnQzCisJREJHX1RYKERiZ0luZm8sICJUeCBvbiBQb3J0IDNcbiIpOworCXJldHVybiB3bF90eChza2IsIGRldiwgSENGX1BPUlRfMyk7Cit9CQkJCS8qIHdsX3R4X3BvcnQzICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMzQxLDExICsxMzUxLDEyIEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgd2xfdHhfcG9ydDQoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoraW50IHdsX3R4X3BvcnQ0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCA0XG4iICk7Ci0gICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfNCApOwotfSAvLyB3bF90eF9wb3J0NAorCURCR19UWChEYmdJbmZvLCAiVHggb24gUG9ydCA0XG4iKTsKKwlyZXR1cm4gd2xfdHgoc2tiLCBkZXYsIEhDRl9QT1JUXzQpOworfQkJCQkvKiB3bF90eF9wb3J0NCAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTM2NiwxMSArMTM3NywxMiBAQAogICogICAgICBOL0EKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHdsX3R4X3BvcnQ1KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK2ludCB3bF90eF9wb3J0NShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgNVxuIiApOwotICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzUgKTsKLX0gLy8gd2xfdHhfcG9ydDUKKwlEQkdfVFgoRGJnSW5mbywgIlR4IG9uIFBvcnQgNVxuIik7CisJcmV0dXJuIHdsX3R4KHNrYiwgZGV2LCBIQ0ZfUE9SVF81KTsKK30JCQkJLyogd2xfdHhfcG9ydDUgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEzOTEsMTEgKzE0MDMsMTIgQEAKICAqICAgICAgTi9BCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB3bF90eF9wb3J0Niggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCitpbnQgd2xfdHhfcG9ydDYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDZcbiIgKTsKLSAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF82ICk7Ci19IC8vIHdsX3R4X3BvcnQ2CisJREJHX1RYKERiZ0luZm8sICJUeCBvbiBQb3J0IDZcbiIpOworCXJldHVybiB3bF90eChza2IsIGRldiwgSENGX1BPUlRfNik7Cit9CQkJCS8qIHdsX3R4X3BvcnQ2ICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNDE3LDUwICsxNDMwLDUyIEBACiAgKiAgICAgIHN0cnVjdHMgaW4gdGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgd2xfd2RzX2RldmljZV9hbGxvYyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3ZvaWQgd2xfd2RzX2RldmljZV9hbGxvYyhzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHApCiB7Ci0gICAgaW50IGNvdW50OworCWludCBjb3VudDsKIAotICAgIC8qIFdEUyBzdXBwb3J0IHJlcXVpcmVzIGFkZGl0aW9uYWwgbmV0X2RldmljZSBzdHJ1Y3RzIHRvIGJlIGFsbG9jYXRlZCwKLSAgICAgICBzbyB0aGF0IHVzZXIgc3BhY2UgYXBwcyBjYW4gdXNlIHRoZXNlIHZpcnR1YWwgZGV2aWNlcyB0byBzcGVjaWZ5IHRoZQotICAgICAgIHBvcnQgb24gd2hpY2ggdG8gVHgvUnggKi8KLSAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgewotICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X3dkcyA9IE5VTEw7CisJLyogV0RTIHN1cHBvcnQgcmVxdWlyZXMgYWRkaXRpb25hbCBuZXRfZGV2aWNlIHN0cnVjdHMgdG8gYmUgYWxsb2NhdGVkLAorCSAgIHNvIHRoYXQgdXNlciBzcGFjZSBhcHBzIGNhbiB1c2UgdGhlc2UgdmlydHVhbCBkZXZpY2VzIHRvIHNwZWNpZnkgdGhlCisJICAgcG9ydCBvbiB3aGljaCB0byBUeC9SeCAqLworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldl93ZHMgPSBOVUxMOwogCi0JZGV2X3dkcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXZfd2RzKQotCQlyZXR1cm47CisJCWRldl93ZHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZSksIEdGUF9LRVJORUwpOworCQlpZiAoIWRldl93ZHMpCisJCQlyZXR1cm47CiAKLSAgICAgICAgZXRoZXJfc2V0dXAoIGRldl93ZHMgKTsKKwkJZXRoZXJfc2V0dXAoZGV2X3dkcyk7CiAKLSAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYgPSBkZXZfd2RzOworCQlscC0+d2RzX3BvcnRbY291bnRdLmRldiA9IGRldl93ZHM7CiAKLSAgICAgICAgLyogUmUtdXNlIHdsX2luaXQgZm9yIGFsbCB0aGUgZGV2aWNlcywgYXMgaXQgY3VycmVudGx5IGRvZXMgbm90aGluZywgYnV0Ci0gICAgICAgICAgIGlzIHJlcXVpcmVkLiBSZS11c2UgdGhlIHN0YXRzL3R4X3RpbWVvdXQgaGFuZGxlciBmb3IgYWxsIGFzIHdlbGw7IHRoZQotICAgICAgICAgICBXRFMgcG9ydCB3aGljaCBpcyByZXF1ZXN0aW5nIHRoZXNlIG9wZXJhdGlvbnMgY2FuIGJlIGRldGVybWluZWQgYnkKLSAgICAgICAgICAgdGhlIG5ldF9kZXZpY2UgcG9pbnRlci4gU2V0IHRoZSBwcml2YXRlIG1lbWJlciBvZiBhbGwgZGV2aWNlcyB0byBwb2ludAotICAgICAgICAgICB0byB0aGUgc2FtZSBuZXRfZGV2aWNlIHN0cnVjdDsgdGhhdCB3YXksIGFsbCBpbmZvcm1hdGlvbiBnZXRzCi0gICAgICAgICAgIGZ1bm5lbGxlZCB0aHJvdWdoIHRoZSBvbmUgInJlYWwiIG5ldF9kZXZpY2UuIE5hbWUgdGhlIFdEUyBwb3J0cwotICAgICAgICAgICAid2RzPG4+IiAqLwotICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+aW5pdCAgICAgICAgICAgPSAmd2xfaW5pdDsKLSAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPmdldF9zdGF0cyAgICAgID0gJndsX3N0YXRzOwotICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+dHhfdGltZW91dCAgICAgPSAmd2xfdHhfdGltZW91dDsKLSAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKLSAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPnByaXYgICAgICAgICAgID0gbHA7CisJCS8qIFJlLXVzZSB3bF9pbml0IGZvciBhbGwgdGhlIGRldmljZXMsIGFzIGl0IGN1cnJlbnRseSBkb2VzIG5vdGhpbmcsIGJ1dAorCQkgKiBpcyByZXF1aXJlZC4gUmUtdXNlIHRoZSBzdGF0cy90eF90aW1lb3V0IGhhbmRsZXIgZm9yIGFsbCBhcyB3ZWxsOyB0aGUKKwkJICogV0RTIHBvcnQgd2hpY2ggaXMgcmVxdWVzdGluZyB0aGVzZSBvcGVyYXRpb25zIGNhbiBiZSBkZXRlcm1pbmVkIGJ5CisJCSAqIHRoZSBuZXRfZGV2aWNlIHBvaW50ZXIuIFNldCB0aGUgcHJpdmF0ZSBtZW1iZXIgb2YgYWxsIGRldmljZXMgdG8gcG9pbnQKKwkJICogdG8gdGhlIHNhbWUgbmV0X2RldmljZSBzdHJ1Y3Q7IHRoYXQgd2F5LCBhbGwgaW5mb3JtYXRpb24gZ2V0cworCQkgKiBmdW5uZWxsZWQgdGhyb3VnaCB0aGUgb25lICJyZWFsIiBuZXRfZGV2aWNlLiBOYW1lIHRoZSBXRFMgcG9ydHMKKwkJICogIndkczxuPiIKKwkJICogKi8KKwkJbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPmluaXQgPSAmd2xfaW5pdDsKKwkJbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPmdldF9zdGF0cyA9ICZ3bF9zdGF0czsKKwkJbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPnR4X3RpbWVvdXQgPSAmd2xfdHhfdGltZW91dDsKKwkJbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKwkJbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPnByaXYgPSBscDsKIAotICAgICAgICBzcHJpbnRmKCBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+bmFtZSwgIndkcyVkIiwgY291bnQgKTsKLSAgICB9CisJCXNwcmludGYobHAtPndkc19wb3J0W2NvdW50XS5kZXYtPm5hbWUsICJ3ZHMlZCIsIGNvdW50KTsKKwl9CiAKLSAgICAvKiBSZWdpc3RlciB0aGUgVHggaGFuZGxlcnMgKi8KLSAgICBscC0+d2RzX3BvcnRbMF0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDE7Ci0gICAgbHAtPndkc19wb3J0WzFdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQyOwotICAgIGxwLT53ZHNfcG9ydFsyXS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0MzsKLSAgICBscC0+d2RzX3BvcnRbM10uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDQ7Ci0gICAgbHAtPndkc19wb3J0WzRdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQ1OwotICAgIGxwLT53ZHNfcG9ydFs1XS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0NjsKKwkvKiBSZWdpc3RlciB0aGUgVHggaGFuZGxlcnMgKi8KKwlscC0+d2RzX3BvcnRbMF0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDE7CisJbHAtPndkc19wb3J0WzFdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQyOworCWxwLT53ZHNfcG9ydFsyXS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0MzsKKwlscC0+d2RzX3BvcnRbM10uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDQ7CisJbHAtPndkc19wb3J0WzRdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQ1OworCWxwLT53ZHNfcG9ydFs1XS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0NjsKIAotICAgIFdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBscCApOwotfSAvLyB3bF93ZHNfZGV2aWNlX2FsbG9jCisJV0xfV0RTX05FVElGX1NUT1BfUVVFVUUobHApOworfQkJCQkvKiB3bF93ZHNfZGV2aWNlX2FsbG9jICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNDgwLDI2ICsxNDk1LDI3IEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHdsX3dkc19kZXZpY2VfZGVhbGxvYyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3ZvaWQgd2xfd2RzX2RldmljZV9kZWFsbG9jKHN0cnVjdCB3bF9wcml2YXRlICpscCkKIHsKLSAgICBpbnQgY291bnQ7CisJaW50IGNvdW50OwogCi0gICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKLSAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldl93ZHMgPSBOVUxMOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldl93ZHMgPSBOVUxMOwogCi0gICAgICAgIGRldl93ZHMgPSBscC0+d2RzX3BvcnRbY291bnRdLmRldjsKKwkJZGV2X3dkcyA9IGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2OwogCi0gICAgICAgIGlmKCBkZXZfd2RzICE9IE5VTEwgKSB7Ci0gICAgICAgICAgICBpZiggZGV2X3dkcy0+ZmxhZ3MgJiBJRkZfVVAgKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2Nsb3NlKCBkZXZfd2RzICk7Ci0gICAgICAgICAgICAgICAgZGV2X3dkcy0+ZmxhZ3MgJj0gfiggSUZGX1VQIHwgSUZGX1JVTk5JTkcgKTsKLSAgICAgICAgICAgIH0KKwkJaWYgKGRldl93ZHMgIT0gTlVMTCkgeworCQkJaWYgKGRldl93ZHMtPmZsYWdzICYgSUZGX1VQKSB7CisJCQkJZGV2X2Nsb3NlKGRldl93ZHMpOworCQkJCWRldl93ZHMtPmZsYWdzICY9IH4oSUZGX1VQIHwgSUZGX1JVTk5JTkcpOworCQkJfQogCi0gICAgICAgICAgICBmcmVlX25ldGRldihkZXZfd2RzKTsKLSAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLX0gLy8gd2xfd2RzX2RldmljZV9kZWFsbG9jCisJCQlmcmVlX25ldGRldihkZXZfd2RzKTsKKwkJCWxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ID0gTlVMTDsKKwkJfQorCX0KK30JCQkJLyogd2xfd2RzX2RldmljZV9kZWFsbG9jICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNTIwLDIxICsxNTM2LDIyIEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHdsX3dkc19uZXRpZl9zdGFydF9xdWV1ZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3ZvaWQgd2xfd2RzX25ldGlmX3N0YXJ0X3F1ZXVlKHN0cnVjdCB3bF9wcml2YXRlICpscCkKIHsKLSAgICBpbnQgY291bnQ7CisJaW50IGNvdW50OwogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotICAgIGlmKCBscCAhPSBOVUxMICkgewotICAgICAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgewotICAgICAgICAgICAgaWYoIGxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCAmJgotICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPT0gRkFMU0UgKSB7Ci0gICAgICAgICAgICAgICAgbmV0aWZfc3RhcnRfcXVldWUoIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICk7Ci0gICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19IC8vIHdsX3dkc19uZXRpZl9zdGFydF9xdWV1ZQorCWlmIChscCAhPSBOVUxMKSB7CisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KyspIHsKKwkJCWlmIChscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgJiYKKwkJCSAgICBscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID09IEZBTFNFKSB7CisJCQkJbmV0aWZfc3RhcnRfcXVldWUobHAtPndkc19wb3J0W2NvdW50XS5kZXYpOworCQkJCWxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPSBUUlVFOworCQkJfQorCQl9CisJfQorfQkJCQkvKiB3bF93ZHNfbmV0aWZfc3RhcnRfcXVldWUgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE1NTUsMjEgKzE1NzIsMjIgQEAKICAqICAgICAgTi9BCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgd2xfd2RzX25ldGlmX3N0b3BfcXVldWUoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit2b2lkIHdsX3dkc19uZXRpZl9zdG9wX3F1ZXVlKHN0cnVjdCB3bF9wcml2YXRlICpscCkKIHsKLSAgICBpbnQgY291bnQ7CisJaW50IGNvdW50OwogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotICAgIGlmKCBscCAhPSBOVUxMICkgewotICAgICAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgewotICAgICAgICAgICAgaWYoIGxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCAmJgotICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPT0gVFJVRSApIHsKLSAgICAgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKCBscC0+d2RzX3BvcnRbY291bnRdLmRldiApOwotICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0gLy8gd2xfd2RzX25ldGlmX3N0b3BfcXVldWUKKwlpZiAobHAgIT0gTlVMTCkgeworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrKSB7CisJCQlpZiAobHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkICYmCisJCQkgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9PSBUUlVFKSB7CisJCQkJbmV0aWZfc3RvcF9xdWV1ZShscC0+d2RzX3BvcnRbY291bnRdLmRldik7CisJCQkJbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9IEZBTFNFOworCQkJfQorCQl9CisJfQorfQkJCQkvKiB3bF93ZHNfbmV0aWZfc3RvcF9xdWV1ZSAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTU5MCwyMSArMTYwOCwyMiBAQAogICogICAgICBOL0EKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB3bF93ZHNfbmV0aWZfd2FrZV9xdWV1ZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3ZvaWQgd2xfd2RzX25ldGlmX3dha2VfcXVldWUoc3RydWN0IHdsX3ByaXZhdGUgKmxwKQogewotICAgIGludCBjb3VudDsKKwlpbnQgY291bnQ7CiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0gICAgaWYoIGxwICE9IE5VTEwgKSB7Ci0gICAgICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7Ci0gICAgICAgICAgICBpZiggbHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkICYmCi0gICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9PSBGQUxTRSApIHsKLSAgICAgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKCBscC0+d2RzX3BvcnRbY291bnRdLmRldiApOwotICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfSAvLyB3bF93ZHNfbmV0aWZfd2FrZV9xdWV1ZQorCWlmIChscCAhPSBOVUxMKSB7CisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KyspIHsKKwkJCWlmIChscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgJiYKKwkJCSAgICBscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID09IEZBTFNFKSB7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShscC0+d2RzX3BvcnRbY291bnRdLmRldik7CisJCQkJbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9IFRSVUU7CisJCQl9CisJCX0KKwl9Cit9CQkJCS8qIHdsX3dkc19uZXRpZl93YWtlX3F1ZXVlICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNjI1LDE5ICsxNjQ0LDE5IEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHdsX3dkc19uZXRpZl9jYXJyaWVyX29uKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQordm9pZCB3bF93ZHNfbmV0aWZfY2Fycmllcl9vbihzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHApCiB7Ci0gICAgaW50IGNvdW50OworCWludCBjb3VudDsKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSAgICBpZiggbHAgIT0gTlVMTCApIHsKLSAgICAgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKLSAgICAgICAgICAgIGlmKCBscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgKSB7Ci0gICAgICAgICAgICAgICAgbmV0aWZfY2Fycmllcl9vbiggbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0gLy8gd2xfd2RzX25ldGlmX2NhcnJpZXJfb24KKwlpZiAobHAgIT0gTlVMTCkgeworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrKSB7CisJCQlpZiAobHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkKQorCQkJCW5ldGlmX2NhcnJpZXJfb24obHAtPndkc19wb3J0W2NvdW50XS5kZXYpOworCQl9CisJfQorfQkJCQkvKiB3bF93ZHNfbmV0aWZfY2Fycmllcl9vbiAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTY1OCwyMSArMTY3NywyMiBAQAogICogICAgICBOL0EKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB3bF93ZHNfbmV0aWZfY2Fycmllcl9vZmYoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit2b2lkIHdsX3dkc19uZXRpZl9jYXJyaWVyX29mZihzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHApCiB7CiAJaW50IGNvdW50OwogCi0JaWYobHAgIT0gTlVMTCkgewotCQlmb3IoY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KyspIHsKLQkJCWlmKGxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCkKKwlpZiAobHAgIT0gTlVMTCkgeworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrKSB7CisJCQlpZiAobHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkKQogCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2KTsKIAkJfQogCX0KIAotfSAvLyB3bF93ZHNfbmV0aWZfY2Fycmllcl9vZmYKK30JCQkJLyogd2xfd2RzX25ldGlmX2NhcnJpZXJfb2ZmICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKLSNlbmRpZiAgLyogVVNFX1dEUyAqLworI2VuZGlmIC8qIFVTRV9XRFMgKi8KIAogI2lmZGVmIEVOQUJMRV9ETUEKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNjk1LDcwICsxNzE1LDcxIEBACiAgKiAgICAgIDEgb24gZXJyb3IKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHdsX3NlbmRfZG1hKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsIHN0cnVjdCBza19idWZmICpza2IsIGludCBwb3J0ICkKK2ludCB3bF9zZW5kX2RtYShzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsIHN0cnVjdCBza19idWZmICpza2IsIGludCBwb3J0KQogewotICAgIGludCAgICAgICAgIGxlbjsKLSAgICBERVNDX1NUUkNUICpkZXNjID0gTlVMTDsKLSAgICBERVNDX1NUUkNUICpkZXNjX25leHQgPSBOVUxMOworCWludCBsZW47CisJREVTQ19TVFJDVCAqZGVzYyA9IE5VTEw7CisJREVTQ19TVFJDVCAqZGVzY19uZXh0ID0gTlVMTDsKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSAgICBpZiggbHAgPT0gTlVMTCApIHsKLSAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiUHJpdmF0ZSBhZGFwdGVyIHN0cnVjdCBpcyBOVUxMXG4iICk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisJaWYgKGxwID09IE5VTEwpIHsKKwkJREJHX0VSUk9SKERiZ0luZm8sICJQcml2YXRlIGFkYXB0ZXIgc3RydWN0IGlzIE5VTExcbiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQogCi0gICAgaWYoIGxwLT5kZXYgPT0gTlVMTCApIHsKLSAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAibmV0X2RldmljZSBzdHJ1Y3QgaW4gd2xfcHJpdmF0ZSBpcyBOVUxMXG4iICk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisJaWYgKGxwLT5kZXYgPT0gTlVMTCkgeworCQlEQkdfRVJST1IoRGJnSW5mbywgIm5ldF9kZXZpY2Ugc3RydWN0IGluIHdsX3ByaXZhdGUgaXMgTlVMTFxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CiAKLSAgICAvKiBBR0FJTiwgQUxMIFRIRSBRVUVVRUlORyBET05FIEhFUkUgSU4gSS9PIE1PREUgSVMgTk9UIFBFUkZPUk1FRCAqLworCS8qIEFHQUlOLCBBTEwgVEhFIFFVRVVFSU5HIERPTkUgSEVSRSBJTiBJL08gTU9ERSBJUyBOT1QgUEVSRk9STUVEICovCiAKLSAgICBpZiggc2tiID09IE5VTEwgKSB7Ci0gICAgICAgIERCR19XQVJOSU5HIChEYmdJbmZvLCAiTm90aGluZyB0byBzZW5kLlxuIik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCURCR19XQVJOSU5HKERiZ0luZm8sICJOb3RoaW5nIHRvIHNlbmQuXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KIAotICAgIGxlbiA9IHNrYi0+bGVuOworCWxlbiA9IHNrYi0+bGVuOwogCi0gICAgLyogR2V0IGEgZnJlZSBkZXNjcmlwdG9yICovCi0gICAgZGVzYyA9IHdsX3BjaV9kbWFfZ2V0X3R4X3BhY2tldCggbHAgKTsKKwkvKiBHZXQgYSBmcmVlIGRlc2NyaXB0b3IgKi8KKwlkZXNjID0gd2xfcGNpX2RtYV9nZXRfdHhfcGFja2V0KGxwKTsKIAotICAgIGlmKCBkZXNjID09IE5VTEwgKSB7Ci0gICAgICAgIGlmKCBscC0+bmV0aWZfcXVldWVfb24gPT0gVFJVRSApIHsKLSAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoIGxwLT5kZXYgKTsKLSAgICAgICAgICAgIFdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBscCApOwotICAgICAgICAgICAgbHAtPm5ldGlmX3F1ZXVlX29uID0gRkFMU0U7CisJaWYgKGRlc2MgPT0gTlVMTCkgeworCQlpZiAobHAtPm5ldGlmX3F1ZXVlX29uID09IFRSVUUpIHsKKwkJCW5ldGlmX3N0b3BfcXVldWUobHAtPmRldik7CisJCQlXTF9XRFNfTkVUSUZfU1RPUF9RVUVVRShscCk7CisJCQlscC0+bmV0aWZfcXVldWVfb24gPSBGQUxTRTsKIAotICAgICAgICAgICAgZGV2X2tmcmVlX3NrYiggc2tiICk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQogCi0gICAgU0VUX0JVRl9DTlQoIGRlc2MsIC8qSENGX0RNQV9GRF9DTlQqL0hGU19BRERSX0RFU1QgKTsKLSAgICBTRVRfQlVGX1NJWkUoIGRlc2MsIEhDRl9ETUFfVFhfQlVGMV9TSVpFICk7CisJU0VUX0JVRl9DTlQoZGVzYywgLypIQ0ZfRE1BX0ZEX0NOVCAqLyBIRlNfQUREUl9ERVNUKTsKKwlTRVRfQlVGX1NJWkUoZGVzYywgSENGX0RNQV9UWF9CVUYxX1NJWkUpOwogCi0gICAgZGVzY19uZXh0ID0gZGVzYy0+bmV4dF9kZXNjX2FkZHI7CisJZGVzY19uZXh0ID0gZGVzYy0+bmV4dF9kZXNjX2FkZHI7CiAKLSAgICBpZiggZGVzY19uZXh0LT5idWZfYWRkciA9PSBOVUxMICkgewotICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJETUEgZGVzY3JpcHRvciBidWZfYWRkciBpcyBOVUxMXG4iICk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisJaWYgKGRlc2NfbmV4dC0+YnVmX2FkZHIgPT0gTlVMTCkgeworCQlEQkdfRVJST1IoRGJnSW5mbywgIkRNQSBkZXNjcmlwdG9yIGJ1Zl9hZGRyIGlzIE5VTExcbiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQogCi0gICAgLyogQ29weSB0aGUgcGF5bG9hZCBpbnRvIHRoZSBETUEgcGFja2V0ICovCi0gICAgbWVtY3B5KCBkZXNjX25leHQtPmJ1Zl9hZGRyLCBza2ItPmRhdGEsIGxlbiApOworCS8qIENvcHkgdGhlIHBheWxvYWQgaW50byB0aGUgRE1BIHBhY2tldCAqLworCW1lbWNweShkZXNjX25leHQtPmJ1Zl9hZGRyLCBza2ItPmRhdGEsIGxlbik7CiAKLSAgICBTRVRfQlVGX0NOVCggZGVzY19uZXh0LCBsZW4gKTsKLSAgICBTRVRfQlVGX1NJWkUoIGRlc2NfbmV4dCwgSENGX01BWF9QQUNLRVRfU0laRSApOworCVNFVF9CVUZfQ05UKGRlc2NfbmV4dCwgbGVuKTsKKwlTRVRfQlVGX1NJWkUoZGVzY19uZXh0LCBIQ0ZfTUFYX1BBQ0tFVF9TSVpFKTsKIAotICAgIGhjZl9kbWFfdHhfcHV0KCAmKCBscC0+aGNmQ3R4ICksIGRlc2MsIDAgKTsKKwloY2ZfZG1hX3R4X3B1dCgmKGxwLT5oY2ZDdHgpLCBkZXNjLCAwKTsKIAotICAgIC8qIEZyZWUgdGhlIHNrYiBhbmQgcGVyZm9ybSBxdWV1ZSBjbGVhbnVwLCBhcyB0aGUgYnVmZmVyIHdhcwotICAgICAgICAgICAgdHJhbnNtaXR0ZWQgc3VjY2Vzc2Z1bGx5ICovCi0gICAgZGV2X2tmcmVlX3NrYiggc2tiICk7CisJLyogRnJlZSB0aGUgc2tiIGFuZCBwZXJmb3JtIHF1ZXVlIGNsZWFudXAsIGFzIHRoZSBidWZmZXIgd2FzCisJICAgdHJhbnNtaXR0ZWQgc3VjY2Vzc2Z1bGx5ICovCisJZGV2X2tmcmVlX3NrYihza2IpOwogCi0gICAgcmV0dXJuIFRSVUU7Ci19IC8vIHdsX3NlbmRfZG1hCisJcmV0dXJuIFRSVUU7Cit9CQkJCS8qIHdsX3NlbmRfZG1hICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNzc5LDE0NyArMTgwMCwxNTIgQEAKICAqICAgICAgMSBvbiBlcnJvcgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgd2xfcnhfZG1hKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK2ludCB3bF9yeF9kbWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgcG9ydDsKLSAgICBoY2ZfMTYgICAgICAgICAgICAgICAgICAgcGt0bGVuOwotICAgIGhjZl8xNiAgICAgICAgICAgICAgICAgICBoZnNfc3RhdDsKLSAgICBzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqc2tiOwotICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IE5VTEw7Ci0gICAgREVTQ19TVFJDVCAgICAgICAgICAgICAgKmRlc2MsICpkZXNjX25leHQ7Ci0gICAgLy9DRkdfTUJfSU5GT19SQU5HRTJfU1RSQ1QgeDsKKwlpbnQgcG9ydDsKKwloY2ZfMTYgcGt0bGVuOworCWhjZl8xNiBoZnNfc3RhdDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IE5VTEw7CisJREVTQ19TVFJDVCAqZGVzYywgKmRlc2NfbmV4dDsKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSAgICBEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CisJREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOwogCi0gICAgaWYoKCggbHAgPSBkZXYtPnByaXYgKSAhPSBOVUxMICkgJiYKLQkhKCBscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kgKSkgeworCWxwID0gZGV2LT5wcml2OworCWlmICgobHAgIT0gTlVMTCkgJiYgIShscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kpKSB7CiAKICNpZmRlZiBVU0VfUlRTCi0gICAgICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7Ci0gICAgICAgICAgICBEQkdfUFJJTlQoICJSVFM6IFdlJ3JlIGdldHRpbmcgYW4gUnguLi5cbiIgKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlPOwotICAgICAgICB9Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KKwkJaWYgKGxwLT51c2VSVFMgPT0gMSkgeworCQkJREJHX1BSSU5UKCJSVFM6IFdlJ3JlIGdldHRpbmcgYW4gUnguLi5cbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKyNlbmRpZiAvKiBVU0VfUlRTICovCiAKLSAgICAgICAgLy9pZiggbHAtPmRtYS5zdGF0dXMgPT0gMCApCi0gICAgICAgIC8vewotICAgICAgICAgICAgZGVzYyA9IGhjZl9kbWFfcnhfZ2V0KCAmKCBscC0+aGNmQ3R4ICkpOworCQkvKgorCQkgKmlmKCBscC0+ZG1hLnN0YXR1cyA9PSAwICkKKwkJICp7CisJCSAqLworCQlkZXNjID0gaGNmX2RtYV9yeF9nZXQoJihscC0+aGNmQ3R4KSk7CiAKLSAgICAgICAgICAgIGlmKCBkZXNjICE9IE5VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIENoZWNrIGFuZCBzZWUgaWYgd2UgcmN2ZC4gYSBXTVAgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgIGlmKCgoICooaGNmXzggKikmZGVzYy0+YnVmX2FkZHJbSEZTX1NUQVRdICkgJgotICAgICAgICAgICAgICAgICAgICAoIEhGU19TVEFUX01TR19UWVBFIHwgSEZTX1NUQVRfRVJSICkpID09IEhGU19TVEFUX1dNUF9NU0cgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiR290IGEgV01QIGZyYW1lXG4iICk7CisJCWlmIChkZXNjICE9IE5VTEwpIHsKKwkJCS8qIENoZWNrIGFuZCBzZWUgaWYgd2UgcmN2ZC4gYSBXTVAgZnJhbWUgKi8KKwkJCS8qCisJCQkgICBpZigoKCAqKGhjZl84ICopJmRlc2MtPmJ1Zl9hZGRyW0hGU19TVEFUXSApICYKKwkJCSAgICggSEZTX1NUQVRfTVNHX1RZUEUgfCBIRlNfU1RBVF9FUlIgKSkgPT0gSEZTX1NUQVRfV01QX01TRyApCisJCQkgICB7CisJCQkgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJHb3QgYSBXTVAgZnJhbWVcbiIgKTsKIAotICAgICAgICAgICAgICAgICAgICB4LmxlbiA9IHNpemVvZiggQ0ZHX01CX0lORk9fUkFOR0UyX1NUUkNUICkgLyBzaXplb2YoIGhjZl8xNiApOwotCQkJCSAgICB4LnR5cCA9IENGR19NQl9JTkZPOwotCQkJCSAgICB4LmJhc2VfdHlwID0gQ0ZHX1dNUDsKLQkJCQkgICAgeC5mcmFnX2NudCA9IDI7Ci0JCQkJICAgIHguZnJhZ19idWZbMF0uZnJhZ19sZW4gID0gR0VUX0JVRl9DTlQoIGRlc2NwICkgLyBzaXplb2YoIGhjZl8xNiApOwotCQkJCSAgICB4LmZyYWdfYnVmWzBdLmZyYWdfYWRkciA9IChoY2ZfOCAqKSBkZXNjcC0+YnVmX2FkZHIgOwotCQkJCSAgICB4LmZyYWdfYnVmWzFdLmZyYWdfbGVuICA9ICggR0VUX0JVRl9DTlQoIGRlc2NwLT5uZXh0X2Rlc2NfYWRkciApICsgMSApIC8gc2l6ZW9mKCBoY2ZfMTYgKTsKLQkJCQkgICAgeC5mcmFnX2J1ZlsxXS5mcmFnX2FkZHIgPSAoaGNmXzggKikgZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfYWRkciA7CisJCQkgICB4LmxlbiA9IHNpemVvZiggQ0ZHX01CX0lORk9fUkFOR0UyX1NUUkNUICkgLyBzaXplb2YoIGhjZl8xNiApOworCQkJICAgeC50eXAgPSBDRkdfTUJfSU5GTzsKKwkJCSAgIHguYmFzZV90eXAgPSBDRkdfV01QOworCQkJICAgeC5mcmFnX2NudCA9IDI7CisJCQkgICB4LmZyYWdfYnVmWzBdLmZyYWdfbGVuICA9IEdFVF9CVUZfQ05UKCBkZXNjcCApIC8gc2l6ZW9mKCBoY2ZfMTYgKTsKKwkJCSAgIHguZnJhZ19idWZbMF0uZnJhZ19hZGRyID0gKGhjZl84ICopIGRlc2NwLT5idWZfYWRkciA7CisJCQkgICB4LmZyYWdfYnVmWzFdLmZyYWdfbGVuICA9ICggR0VUX0JVRl9DTlQoIGRlc2NwLT5uZXh0X2Rlc2NfYWRkciApICsgMSApIC8gc2l6ZW9mKCBoY2ZfMTYgKTsKKwkJCSAgIHguZnJhZ19idWZbMV0uZnJhZ19hZGRyID0gKGhjZl84ICopIGRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX2FkZHIgOwogCi0gICAgICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmeCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqLworCQkJICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSZ4ICk7CisJCQkgICB9CisJCQkgKi8KIAotICAgICAgICAgICAgICAgIGRlc2NfbmV4dCA9IGRlc2MtPm5leHRfZGVzY19hZGRyOworCQkJZGVzY19uZXh0ID0gZGVzYy0+bmV4dF9kZXNjX2FkZHI7CiAKLSAgICAgICAgICAgICAgICAvKiBNYWtlIHN1cmUgdGhlIGJ1ZmZlciBpc24ndCBlbXB0eSAqLwotICAgICAgICAgICAgICAgIGlmKCBHRVRfQlVGX0NOVCggZGVzYyApID09IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiQnVmZmVyIGlzIGVtcHR5IVxuIiApOworCQkJLyogTWFrZSBzdXJlIHRoZSBidWZmZXIgaXNuJ3QgZW1wdHkgKi8KKwkJCWlmIChHRVRfQlVGX0NOVChkZXNjKSA9PSAwKSB7CisJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIkJ1ZmZlciBpcyBlbXB0eSFcbiIpOwogCi0gICAgICAgICAgICAgICAgICAgIC8qIEdpdmUgdGhlIGRlc2NyaXB0b3IgYmFjayB0byB0aGUgSENGICovCi0gICAgICAgICAgICAgICAgICAgIGhjZl9kbWFfcnhfcHV0KCAmKCBscC0+aGNmQ3R4ICksIGRlc2MgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU87Ci0gICAgICAgICAgICAgICAgfQorCQkJCS8qIEdpdmUgdGhlIGRlc2NyaXB0b3IgYmFjayB0byB0aGUgSENGICovCisJCQkJaGNmX2RtYV9yeF9wdXQoJihscC0+aGNmQ3R4KSwgZGVzYyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CiAKLSAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSBIRlNfU1RBVCByZWdpc3RlciBmcm9tIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgaGZzX3N0YXQgPSAoaGNmXzE2KSggZGVzYy0+YnVmX2FkZHJbSEZTX1NUQVQvMl0gKTsKKwkJCS8qIFJlYWQgdGhlIEhGU19TVEFUIHJlZ2lzdGVyIGZyb20gdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KKwkJCWhmc19zdGF0ID0gKGhjZl8xNikgKGRlc2MtPmJ1Zl9hZGRyW0hGU19TVEFUIC8gMl0pOwogCi0gICAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBmcmFtZSBpc24ndCBiYWQgKi8KLSAgICAgICAgICAgICAgICBpZigoIGhmc19zdGF0ICYgSEZTX1NUQVRfRVJSICkgIT0gSENGX1NVQ0NFU1MgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJIRlNfU1RBVF9FUlJPUiAoMHgleCkgaW4gUnggUGFja2V0XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5idWZfYWRkcltIRlNfU1RBVC8yXSApOworCQkJLyogTWFrZSBzdXJlIHRoZSBmcmFtZSBpc24ndCBiYWQgKi8KKwkJCWlmICgoaGZzX3N0YXQgJiBIRlNfU1RBVF9FUlIpICE9IEhDRl9TVUNDRVNTKSB7CisJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywKKwkJCQkJICAgICJIRlNfU1RBVF9FUlJPUiAoMHgleCkgaW4gUnggUGFja2V0XG4iLAorCQkJCQkgICAgZGVzYy0+YnVmX2FkZHJbSEZTX1NUQVQgLyAyXSk7CiAKLSAgICAgICAgICAgICAgICAgICAgLyogR2l2ZSB0aGUgZGVzY3JpcHRvciBiYWNrIHRvIHRoZSBIQ0YgKi8KLSAgICAgICAgICAgICAgICAgICAgaGNmX2RtYV9yeF9wdXQoICYoIGxwLT5oY2ZDdHggKSwgZGVzYyApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKLSAgICAgICAgICAgICAgICB9CisJCQkJLyogR2l2ZSB0aGUgZGVzY3JpcHRvciBiYWNrIHRvIHRoZSBIQ0YgKi8KKwkJCQloY2ZfZG1hX3J4X3B1dCgmKGxwLT5oY2ZDdHgpLCBkZXNjKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KIAotICAgICAgICAgICAgICAgIC8qIERldGVybWluZSB3aGF0IHBvcnQgdGhpcyBwYWNrZXQgaXMgZm9yICovCi0gICAgICAgICAgICAgICAgcG9ydCA9ICggaGZzX3N0YXQgPj4gOCApICYgMHgwMDA3OwotICAgICAgICAgICAgICAgIERCR19SWCggRGJnSW5mbywgIlJ4IGZyYW1lIGZvciBwb3J0ICVkXG4iLCBwb3J0ICk7CisJCQkvKiBEZXRlcm1pbmUgd2hhdCBwb3J0IHRoaXMgcGFja2V0IGlzIGZvciAqLworCQkJcG9ydCA9IChoZnNfc3RhdCA+PiA4KSAmIDB4MDAwNzsKKwkJCURCR19SWChEYmdJbmZvLCAiUnggZnJhbWUgZm9yIHBvcnQgJWRcbiIsIHBvcnQpOwogCi0gICAgICAgICAgICAgICAgcGt0bGVuID0gR0VUX0JVRl9DTlQoZGVzY19uZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAocGt0bGVuICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2tiID0gQUxMT0NfU0tCKHBrdGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChza2IgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCBwb3J0ICkgeworCQkJcGt0bGVuID0gR0VUX0JVRl9DTlQoZGVzY19uZXh0KTsKKwkJCWlmIChwa3RsZW4gIT0gMCkgeworCQkJCXNrYiA9IEFMTE9DX1NLQihwa3RsZW4pOworCQkJCWlmIChza2IgIT0gTlVMTCkgeworCQkJCQlzd2l0Y2ggKHBvcnQpIHsKICNpZmRlZiBVU0VfV0RTCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBscC0+d2RzX3BvcnRbcG9ydC0xXS5kZXY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYgIC8qIFVTRV9XRFMgKi8KKwkJCQkJY2FzZSAxOgorCQkJCQljYXNlIDI6CisJCQkJCWNhc2UgMzoKKwkJCQkJY2FzZSA0OgorCQkJCQljYXNlIDU6CisJCQkJCWNhc2UgNjoKKwkJCQkJCXNrYi0+ZGV2ID0KKwkJCQkJCSAgICBscC0+d2RzX3BvcnRbcG9ydCAtIDFdLmRldjsKKwkJCQkJCWJyZWFrOworI2VuZGlmIC8qIFVTRV9XRFMgKi8KIAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2ItPmRldiA9IGRldjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJY2FzZSAwOgorCQkJCQlkZWZhdWx0OgorCQkJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJCQlicmVhazsKKwkJCQkJfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBHRVRfUEFDS0VUX0RNQSggc2tiLT5kZXYsIHNrYiwgcGt0bGVuICk7CisJCQkJCUdFVF9QQUNLRVRfRE1BKHNrYi0+ZGV2LCBza2IsIHBrdGxlbik7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdpdmUgdGhlIGRlc2NyaXB0b3IgYmFjayB0byB0aGUgSENGICovCi0gICAgICAgICAgICAgICAgICAgICAgICBoY2ZfZG1hX3J4X3B1dCggJiggbHAtPmhjZkN0eCApLCBkZXNjICk7CisJCQkJCS8qIEdpdmUgdGhlIGRlc2NyaXB0b3IgYmFjayB0byB0aGUgSENGICovCisJCQkJCWhjZl9kbWFfcnhfcHV0KCYobHAtPmhjZkN0eCksIGRlc2MpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRpZl9yeCggc2tiICk7CisJCQkJCW5ldGlmX3J4KHNrYik7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwb3J0ID09IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJCQlpZiAocG9ydCA9PSAwKSB7CisJCQkJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdGxlbjsKKwkJCQkJfQogI2lmZGVmIFVTRV9XRFMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9wYWNrZXRzKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmICAvKiBVU0VfV0RTICovCisJCQkJCWVsc2UgeworCQkJCQkJbHAtPndkc19wb3J0W3BvcnQgLQorCQkJCQkJCSAgICAgMV0uc3RhdHMuCisJCQkJCQkgICAgcnhfcGFja2V0cysrOworCQkJCQkJbHAtPndkc19wb3J0W3BvcnQgLQorCQkJCQkJCSAgICAgMV0uc3RhdHMuCisJCQkJCQkgICAgcnhfYnl0ZXMgKz0gcGt0bGVuOworCQkJCQl9CisjZW5kaWYgLyogVVNFX1dEUyAqLwogCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJDb3VsZCBub3QgYWxsb2Mgc2tiXG4iICk7CisJCQkJfSBlbHNlIHsKKwkJCQkJREJHX0VSUk9SKERiZ0luZm8sCisJCQkJCQkgICJDb3VsZCBub3QgYWxsb2Mgc2tiXG4iKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApCi0JICAgICAgICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKLQkgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJaWYgKHBvcnQgPT0gMCkKKwkJCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAjaWZkZWYgVVNFX1dEUwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X2Ryb3BwZWQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZiAgLyogVVNFX1dEUyAqLwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvL30KLSAgICB9CisJCQkJCWVsc2UgeworCQkJCQkJbHAtPndkc19wb3J0W3BvcnQgLQorCQkJCQkJCSAgICAgMV0uc3RhdHMuCisJCQkJCQkgICAgcnhfZHJvcHBlZCsrOworCQkJCQl9CisjZW5kaWYgLyogVVNFX1dEUyAqLworCQkJCX0KKwkJCX0KKwkJfQorCQkvKn0qLworCX0KIAotICAgIHJldHVybiAwOwotfSAvLyB3bF9yeF9kbWEKKwlyZXR1cm4gMDsKK30JCQkJLyogd2xfcnhfZG1hICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0jZW5kaWYgIC8vIEVOQUJMRV9ETUEKKyNlbmRpZiAvKiBFTkFCTEVfRE1BICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF91dGlsLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF91dGlsLmMKaW5kZXggNGNhNmU0Mi4uNzUwMTljMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfdXRpbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3V0aWwuYwpAQCAtMTYxLDQzICsxNjEsNiBAQAogCiAKIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJcGVyY2VudCgpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBERVNDUklQVElPTjoKLSAqCi0gKiAgICAgIFJldHVybiBhIHZhbHVlIGFzIGEgcGVyY2VudGFnZSBvZiBtaW4gdG8gbWF4LgotICoKLSAqICBQQVJBTUVURVJTOgotICoKLSAqICAgICAgdmFsdWUgICAtIHRoZSB2YWx1ZSBpbiBxdWVzdGlvbgotICogICAgICBtaW4gICAgIC0gdGhlIG1pbmltdW0gcmFuZ2UgdmFsdWUKLSAqICAgICAgbWF4ICAgICAtIHRoZSBtYXhpbXVtIHJhbmdlIHZhbHVlCi0gKgotICogIFJFVFVSTlM6Ci0gKgotICogICAgICB0aGUgcGVyY2VudGFnZSB2YWx1ZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgcGVyY2VudCggaW50IHZhbHVlLCBpbnQgbWluLCBpbnQgbWF4ICkKLXsKLSAgICAvKiBUcnVuY2F0ZSB0aGUgdmFsdWUgdG8gYmUgYmV0d2VlbiBtaW4gYW5kIG1heC4gKi8KLSAgICBpZiggdmFsdWUgPCBtaW4gKQotICAgICAgICB2YWx1ZSA9IG1pbjsKLQotICAgIGlmKCB2YWx1ZSA+IG1heCApCi0gICAgICAgIHZhbHVlID0gbWF4OwotCi0gICAgLyogUmV0dXJuIHRoZSB2YWx1ZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgbWluIHRvIG1heC4gKi8KLSAgICByZXR1cm4gKCgoIHZhbHVlIC0gbWluICkgKiAxMDAgKSAvICggbWF4IC0gbWluICkpOwotfSAvLyBwZXJjZW50Ci0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJaXNfdmFsaWRfa2V5X3N0cmluZygpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfd2V4dC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfd2V4dC5jCmluZGV4IDE4N2ZjMDYuLjQ5ZWVlYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3dleHQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF93ZXh0LmMKQEAgLTMzNTQsNyArMzM1NCw3IEBACiAJICAgdGhlIGNhbGwgdG8gd2lyZWxlc3Nfc2VuZF9ldmVudCgpIG11c3QgYWxzbyBwb2ludCB0byB3aGVyZSB0aGUgRVNTSUQKIAkgICBsaXZlcyAqLwogCXdycXUuZXNzaWQubGVuZ3RoICA9IHN0cmxlbiggbHAtPk5ldHdvcmtOYW1lICk7Ci0Jd3JxdS5lc3NpZC5wb2ludGVyID0gKGNhZGRyX3QpbHAtPk5ldHdvcmtOYW1lOworCXdycXUuZXNzaWQucG9pbnRlciA9ICh2b2lkIF9fdXNlciAqKWxwLT5OZXR3b3JrTmFtZTsKIAl3cnF1LmVzc2lkLmZsYWdzICAgPSAxOwogCiAJd2lyZWxlc3Nfc2VuZF9ldmVudCggZGV2LCBTSU9DU0lXRVNTSUQsICZ3cnF1LCBscC0+TmV0d29ya05hbWUgKTsKQEAgLTM0MTksNyArMzQxOSw3IEBACiAKIAkJLyogT25seSBwcm92aWRlIHRoZSBrZXkgaWYgcGVybWlzc2lvbnMgYWxsb3cgKi8KIAkJaWYoIGNhcGFibGUoIENBUF9ORVRfQURNSU4gKSkgewotCQkJd3JxdS5lbmNvZGluZy5wb2ludGVyID0gKGNhZGRyX3QpbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ua2V5OworCQkJd3JxdS5lbmNvZGluZy5wb2ludGVyID0gKHZvaWQgX191c2VyICopbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ua2V5OwogCQkJd3JxdS5lbmNvZGluZy5sZW5ndGggID0gbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ubGVuOwogCQl9IGVsc2UgewogCQkJd3JxdS5lbmNvZGluZy5mbGFncyB8PSBJV19FTkNPREVfTk9LRVk7CkBAIC0zNzc4LDcgKzM3NzgsNyBAQAogI2VuZGlmCiB9OwogCi1zdHJ1Y3QgaXdfcHJpdl9hcmdzIHdsX3ByaXZfYXJnc1tdID0geworc3RhdGljIHN0cnVjdCBpd19wcml2X2FyZ3Mgd2xfcHJpdl9hcmdzW10gPSB7CiAgICAgICAgIHtTSU9DU0lXTkVUTkFNRSwgICAgSVdfUFJJVl9UWVBFX0NIQVIgfCBIQ0ZfTUFYX05BTUVfTEVOLCAwLCAic25ldHdvcmtfbmFtZSIgfSwKICAgICAgICAge1NJT0NHSVdORVROQU1FLCAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IEhDRl9NQVhfTkFNRV9MRU4sICAgICJnbmV0d29ya19uYW1lIiB9LAogICAgICAgICB7U0lPQ1NJV1NUQU5BTUUsICAgIElXX1BSSVZfVFlQRV9DSEFSIHwgSENGX01BWF9OQU1FX0xFTiwgMCwgInNzdGF0aW9uX25hbWUiIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9jZmc4MDIxMS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvY2ZnODAyMTEuYwppbmRleCBhN2QyNGM5Li5mNzZmOTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2NmZzgwMjExLmMKQEAgLTQwMCw2ICs0MDAsOCBAQAogCW51bWJzcyA9IG1zZzEubnVtYnNzLmRhdGE7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtYnNzOyBpKyspIHsKKwkJaW50IGZyZXE7CisKIAkJbWVtc2V0KCZtc2cyLCAwLCBzaXplb2YobXNnMikpOwogCQltc2cyLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfc2Nhbl9yZXN1bHRzOwogCQltc2cyLmJzc2luZGV4LmRhdGEgPSBpOwpAQCAtNDE0LDkgKzQxNiwxMCBAQAogCQlpZV9idWZbMV0gPSBtc2cyLnNzaWQuZGF0YS5sZW47CiAJCWllX2xlbiA9IGllX2J1ZlsxXSArIDI7CiAJCW1lbWNweSgmaWVfYnVmWzJdLCAmKG1zZzIuc3NpZC5kYXRhLmRhdGEpLCBtc2cyLnNzaWQuZGF0YS5sZW4pOworCQlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KG1zZzIuZHNjaGFubmVsLmRhdGEsCisJCQkJCQkgICAgICBJRUVFODAyMTFfQkFORF8yR0haKTsKIAkJYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzcyh3aXBoeSwKLQkJCWllZWU4MDIxMV9nZXRfY2hhbm5lbCh3aXBoeSwKLQkJCSAgICAgIGllZWU4MDIxMV9kc3NzX2NoYW5fdG9fZnJlcShtc2cyLmRzY2hhbm5lbC5kYXRhKSksCisJCQlpZWVlODAyMTFfZ2V0X2NoYW5uZWwod2lwaHksIGZyZXEpLAogCQkJKGNvbnN0IHU4ICopICYobXNnMi5ic3NpZC5kYXRhLmRhdGEpLAogCQkJbXNnMi50aW1lc3RhbXAuZGF0YSwgbXNnMi5jYXBpbmZvLmRhdGEsCiAJCQltc2cyLmJlYWNvbnBlcmlvZC5kYXRhLApAQCAtNzQ2LDcgKzc0OSw3IEBACiAKIAogLyogRnVuY3Rpb25zIHRvIGNyZWF0ZS9mcmVlIHdpcGh5IGludGVyZmFjZSAqLwotc3RydWN0IHdpcGh5ICp3bGFuX2NyZWF0ZV93aXBoeShzdHJ1Y3QgZGV2aWNlICpkZXYsIHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3N0YXRpYyBzdHJ1Y3Qgd2lwaHkgKndsYW5fY3JlYXRlX3dpcGh5KHN0cnVjdCBkZXZpY2UgKmRldiwgd2xhbmRldmljZV90ICp3bGFuZGV2KQogewogCXN0cnVjdCB3aXBoeSAqd2lwaHk7CiAJc3RydWN0IHByaXNtMl93aXBoeV9wcml2YXRlICpwcml2OwpAQCAtNzgzLDcgKzc4Niw3IEBACiB9CiAKIAotdm9pZCB3bGFuX2ZyZWVfd2lwaHkoc3RydWN0IHdpcGh5ICp3aXBoeSkKK3N0YXRpYyB2b2lkIHdsYW5fZnJlZV93aXBoeShzdHJ1Y3Qgd2lwaHkgKndpcGh5KQogewogCXdpcGh5X3VucmVnaXN0ZXIod2lwaHkpOwogCXdpcGh5X2ZyZWUod2lwaHkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oCmluZGV4IDMzM2EyZjYuLjFmMmM3OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmgKQEAgLTUzMSwxNCArNTMxLDE0IEBACiAJdTE2IHJlc2VydmVkMjsKIAogCS8qLS0gODAyLjExIEhlYWRlciBJbmZvcm1hdGlvbiAoODAyLjExIGJ5dGUgb3JkZXIpIC0tKi8KLQl1MTYgZnJhbWVfY29udHJvbDsKKwlfX2xlMTYgZnJhbWVfY29udHJvbDsKIAl1MTYgZHVyYXRpb25faWQ7CiAJdTggYWRkcmVzczFbNl07CiAJdTggYWRkcmVzczJbNl07CiAJdTggYWRkcmVzczNbNl07CiAJdTE2IHNlcXVlbmNlX2NvbnRyb2w7CiAJdTggYWRkcmVzczRbNl07Ci0JdTE2IGRhdGFfbGVuOwkJLyogaGZhMzg0eCAobGl0dGxlIGVuZGlhbikgZm9ybWF0ICovCisJX19sZTE2IGRhdGFfbGVuOwkJLyogaGZhMzg0eCAobGl0dGxlIGVuZGlhbikgZm9ybWF0ICovCiAKIAkvKi0tIDgwMi4zIEhlYWRlciBJbmZvcm1hdGlvbiAtLSovCiAJdTggZGVzdF9hZGRyWzZdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWdtdC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWdtdC5oCmluZGV4IDI2MTA4MjQuLjNkZDA2NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1nbXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZ210LmgKQEAgLTkxLDcgKzkxLDcgQEAKICogICAgZmFsbCBhdCB0aGUgZW5kIG9mIHRoZWlyIHJlc3BlY3RpdmUgZnJhbWVzKS4KICogNWEpIFRoZSBsZW5ndGggZmllbGQgaXMgc2V0IHRvIGluY2x1ZGUgdGhlIGxhc3Qgb2YgdGhlIGZpeGVkIGFuZCBmaXhlZAogKiAgICAgbGVuZ3RoIGZpZWxkcy4gIEl0IG1heSBoYXZlIHRvIGJlIHVwZGF0ZWQgZm9yIG9wdGlvbmFsIG9yIHZhcmlhYmxlCi0qIAlsZW5ndGggaW5mb3JtYXRpb24gZWxlbWVudHMuCisqCWxlbmd0aCBpbmZvcm1hdGlvbiBlbGVtZW50cy4KICogNikgT3B0aW9uYWwgYW5kIHZhcmlhYmxlIGxlbmd0aCBpbmZvcm1hdGlvbiBlbGVtZW50cyBhcmUgc3BlY2lhbCBjYXNlcwogKiAgICBhbmQgbXVzdCBiZSBoYW5kbGVkIGluZGl2aWR1YWxseSBieSB0aGUgY2xpZW50IGNvZGUuCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMTksODIgKzIxOSw4MiBAQAogLyotLSBJbmZvcm1hdGlvbiBFbGVtZW50IFR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIHByb3RvdHlwZSBzdHJ1Y3R1cmUsIGFsbCBJRXMgc3RhcnQgd2l0aCB0aGVzZSBtZW1iZXJzICovCiAKLXR5cGVkZWYgc3RydWN0IHdsYW5faWUgeworc3RydWN0IHdsYW5faWUgewogCXU4IGVpZDsKIAl1OCBsZW47Ci19IF9fcGFja2VkIHdsYW5faWVfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gU2VydmljZSBTZXQgSWRlbnRpdHkgKFNTSUQpICAtLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2llX3NzaWQgeworc3RydWN0IHdsYW5faWVfc3NpZCB7CiAJdTggZWlkOwogCXU4IGxlbjsKIAl1OCBzc2lkWzFdOwkJLyogbWF5IGJlIHplcm8sIHB0cnMgbWF5IG92ZXJsYXAgKi8KLX0gX19wYWNrZWQgd2xhbl9pZV9zc2lkX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tIFN1cHBvcnRlZCBSYXRlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV9zdXBwX3JhdGVzIHsKK3N0cnVjdCB3bGFuX2llX3N1cHBfcmF0ZXMgewogCXU4IGVpZDsKIAl1OCBsZW47CiAJdTggcmF0ZXNbMV07CQkvKiBoYWQgYmV0dGVyIGJlIGF0IExFQVNUIG9uZSEgKi8KLX0gX19wYWNrZWQgd2xhbl9pZV9zdXBwX3JhdGVzX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tIEZIIFBhcmFtZXRlciBTZXQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV9maF9wYXJtcyB7CitzdHJ1Y3Qgd2xhbl9pZV9maF9wYXJtcyB7CiAJdTggZWlkOwogCXU4IGxlbjsKIAl1MTYgZHdlbGw7CiAJdTggaG9wc2V0OwogCXU4IGhvcHBhdHRlcm47CiAJdTggaG9waW5kZXg7Ci19IF9fcGFja2VkIHdsYW5faWVfZmhfcGFybXNfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gRFMgUGFyYW1ldGVyIFNldCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2llX2RzX3Bhcm1zIHsKK3N0cnVjdCB3bGFuX2llX2RzX3Bhcm1zIHsKIAl1OCBlaWQ7CiAJdTggbGVuOwogCXU4IGN1cnJfY2g7Ci19IF9fcGFja2VkIHdsYW5faWVfZHNfcGFybXNfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gQ0YgUGFyYW1ldGVyIFNldCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXR5cGVkZWYgc3RydWN0IHdsYW5faWVfY2ZfcGFybXMgeworc3RydWN0IHdsYW5faWVfY2ZfcGFybXMgewogCXU4IGVpZDsKIAl1OCBsZW47CiAJdTggY2ZwX2NudDsKIAl1OCBjZnBfcGVyaW9kOwogCXUxNiBjZnBfbWF4ZHVyOwogCXUxNiBjZnBfZHVycmVtYWluaW5nOwotfSBfX3BhY2tlZCB3bGFuX2llX2NmX3Bhcm1zX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tIFRJTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV90aW0geworc3RydWN0IHdsYW5faWVfdGltIHsKIAl1OCBlaWQ7CiAJdTggbGVuOwogCXU4IGR0aW1fY250OwogCXU4IGR0aW1fcGVyaW9kOwogCXU4IGJpdG1hcF9jdGw7CiAJdTggdmlydF9ibVsxXTsKLX0gX19wYWNrZWQgd2xhbl9pZV90aW1fdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gSUJTUyBQYXJhbWV0ZXIgU2V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2llX2lic3NfcGFybXMgeworc3RydWN0IHdsYW5faWVfaWJzc19wYXJtcyB7CiAJdTggZWlkOwogCXU4IGxlbjsKIAl1MTYgYXRpbV93aW47Ci19IF9fcGFja2VkIHdsYW5faWVfaWJzc19wYXJtc190OworfSBfX3BhY2tlZDsKIAogLyotLSBDaGFsbGVuZ2UgVGV4dCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5faWVfY2hhbGxlbmdlIHsKK3N0cnVjdCB3bGFuX2llX2NoYWxsZW5nZSB7CiAJdTggZWlkOwogCXU4IGxlbjsKIAl1OCBjaGFsbGVuZ2VbMV07Ci19IF9fcGFja2VkIHdsYW5faWVfY2hhbGxlbmdlX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogIEZyYW1lIFR5cGVzICAqLwogCiAvKiBwcm90b3R5cGUgc3RydWN0dXJlLCBhbGwgbWdtdCBmcmFtZSB0eXBlcyB3aWxsIHN0YXJ0IHdpdGggdGhlc2UgbWVtYmVycyAqLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9tZ210IHsKK3N0cnVjdCB3bGFuX2ZyX21nbXQgewogCXUxNiB0eXBlOwogCXUxNiBsZW47CQkvKiBET0VTIE5PVCBpbmNsdWRlIENSQyAhISEhICovCiAJdTggKmJ1ZjsKQEAgLTMwMywxMCArMzAzLDEwIEBACiAJdm9pZCAqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwotfSB3bGFuX2ZyX21nbXRfdDsKK307CiAKIC8qLS0gQmVhY29uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX2JlYWNvbiB7CitzdHJ1Y3Qgd2xhbl9mcl9iZWFjb24gewogCXUxNiB0eXBlOwogCXUxNiBsZW47CiAJdTggKmJ1ZjsKQEAgLTMxOCwxOCArMzE4LDE4IEBACiAJdTE2ICpiY25faW50OwogCXUxNiAqY2FwX2luZm87CiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwotCXdsYW5faWVfc3NpZF90ICpzc2lkOwotCXdsYW5faWVfc3VwcF9yYXRlc190ICpzdXBwX3JhdGVzOwotCXdsYW5faWVfZmhfcGFybXNfdCAqZmhfcGFybXM7Ci0Jd2xhbl9pZV9kc19wYXJtc190ICpkc19wYXJtczsKLQl3bGFuX2llX2NmX3Bhcm1zX3QgKmNmX3Bhcm1zOwotCXdsYW5faWVfaWJzc19wYXJtc190ICppYnNzX3Bhcm1zOwotCXdsYW5faWVfdGltX3QgKnRpbTsKKwlzdHJ1Y3Qgd2xhbl9pZV9zc2lkICpzc2lkOworCXN0cnVjdCB3bGFuX2llX3N1cHBfcmF0ZXMgKnN1cHBfcmF0ZXM7CisJc3RydWN0IHdsYW5faWVfZmhfcGFybXMgKmZoX3Bhcm1zOworCXN0cnVjdCB3bGFuX2llX2RzX3Bhcm1zICpkc19wYXJtczsKKwlzdHJ1Y3Qgd2xhbl9pZV9jZl9wYXJtcyAqY2ZfcGFybXM7CisJc3RydWN0IHdsYW5faWVfaWJzc19wYXJtcyAqaWJzc19wYXJtczsKKwlzdHJ1Y3Qgd2xhbl9pZV90aW0gKnRpbTsKIAotfSB3bGFuX2ZyX2JlYWNvbl90OworfTsKIAogLyotLSBJQlNTIEFUSU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5fZnJfaWJzc2F0aW0geworc3RydWN0IHdsYW5fZnJfaWJzc2F0aW0gewogCXUxNiB0eXBlOwogCXUxNiBsZW47CiAJdTggKmJ1ZjsKQEAgLTM0MiwxMCArMzQyLDEwIEBACiAKIAkvKiB0aGlzIGZyYW1lIHR5cGUgaGFzIGEgbnVsbCBib2R5ICovCiAKLX0gd2xhbl9mcl9pYnNzYXRpbV90OworfTsKIAogLyotLSBEaXNhc3NvY2lhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5fZnJfZGlzYXNzb2Mgeworc3RydWN0IHdsYW5fZnJfZGlzYXNzb2MgewogCXUxNiB0eXBlOwogCXUxNiBsZW47CiAJdTggKmJ1ZjsKQEAgLTM1NywxMCArMzU3LDEwIEBACiAKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCiAKLX0gd2xhbl9mcl9kaXNhc3NvY190OworfTsKIAogLyotLSBBc3NvY2lhdGlvbiBSZXF1ZXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5fZnJfYXNzb2NyZXEgeworc3RydWN0IHdsYW5fZnJfYXNzb2NyZXEgewogCXUxNiB0eXBlOwogCXUxNiBsZW47CiAJdTggKmJ1ZjsKQEAgLTM3MSwxMyArMzcxLDEzIEBACiAJdTE2ICpjYXBfaW5mbzsKIAl1MTYgKmxpc3Rlbl9pbnQ7CiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwotCXdsYW5faWVfc3NpZF90ICpzc2lkOwotCXdsYW5faWVfc3VwcF9yYXRlc190ICpzdXBwX3JhdGVzOworCXN0cnVjdCB3bGFuX2llX3NzaWQgKnNzaWQ7CisJc3RydWN0IHdsYW5faWVfc3VwcF9yYXRlcyAqc3VwcF9yYXRlczsKIAotfSB3bGFuX2ZyX2Fzc29jcmVxX3Q7Cit9OwogCiAvKi0tIEFzc29jaWF0aW9uIFJlc3BvbnNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9hc3NvY3Jlc3Ageworc3RydWN0IHdsYW5fZnJfYXNzb2NyZXNwIHsKIAl1MTYgdHlwZTsKIAl1MTYgbGVuOwogCXU4ICpidWY7CkBAIC0zODksMTIgKzM4OSwxMiBAQAogCXUxNiAqc3RhdHVzOwogCXUxNiAqYWlkOwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KLQl3bGFuX2llX3N1cHBfcmF0ZXNfdCAqc3VwcF9yYXRlczsKKwlzdHJ1Y3Qgd2xhbl9pZV9zdXBwX3JhdGVzICpzdXBwX3JhdGVzOwogCi19IHdsYW5fZnJfYXNzb2NyZXNwX3Q7Cit9OwogCiAvKi0tIFJlYXNzb2NpYXRpb24gUmVxdWVzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9yZWFzc29jcmVxIHsKK3N0cnVjdCB3bGFuX2ZyX3JlYXNzb2NyZXEgewogCXUxNiB0eXBlOwogCXUxNiBsZW47CiAJdTggKmJ1ZjsKQEAgLTQwNiwxMyArNDA2LDEzIEBACiAJdTE2ICpsaXN0ZW5faW50OwogCXU4ICpjdXJyX2FwOwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KLQl3bGFuX2llX3NzaWRfdCAqc3NpZDsKLQl3bGFuX2llX3N1cHBfcmF0ZXNfdCAqc3VwcF9yYXRlczsKKwlzdHJ1Y3Qgd2xhbl9pZV9zc2lkICpzc2lkOworCXN0cnVjdCB3bGFuX2llX3N1cHBfcmF0ZXMgKnN1cHBfcmF0ZXM7CiAKLX0gd2xhbl9mcl9yZWFzc29jcmVxX3Q7Cit9OwogCiAvKi0tIFJlYXNzb2NpYXRpb24gUmVzcG9uc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9yZWFzc29jcmVzcCB7CitzdHJ1Y3Qgd2xhbl9mcl9yZWFzc29jcmVzcCB7CiAJdTE2IHR5cGU7CiAJdTE2IGxlbjsKIAl1OCAqYnVmOwpAQCAtNDI0LDEyICs0MjQsMTIgQEAKIAl1MTYgKnN0YXR1czsKIAl1MTYgKmFpZDsKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCi0Jd2xhbl9pZV9zdXBwX3JhdGVzX3QgKnN1cHBfcmF0ZXM7CisJc3RydWN0IHdsYW5faWVfc3VwcF9yYXRlcyAqc3VwcF9yYXRlczsKIAotfSB3bGFuX2ZyX3JlYXNzb2NyZXNwX3Q7Cit9OwogCiAvKi0tIFByb2JlIFJlcXVlc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9wcm9iZXJlcSB7CitzdHJ1Y3Qgd2xhbl9mcl9wcm9iZXJlcSB7CiAJdTE2IHR5cGU7CiAJdTE2IGxlbjsKIAl1OCAqYnVmOwpAQCAtNDM4LDEzICs0MzgsMTMgQEAKIAl2b2lkICpwcml2OwogCS8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCi0Jd2xhbl9pZV9zc2lkX3QgKnNzaWQ7Ci0Jd2xhbl9pZV9zdXBwX3JhdGVzX3QgKnN1cHBfcmF0ZXM7CisJc3RydWN0IHdsYW5faWVfc3NpZCAqc3NpZDsKKwlzdHJ1Y3Qgd2xhbl9pZV9zdXBwX3JhdGVzICpzdXBwX3JhdGVzOwogCi19IHdsYW5fZnJfcHJvYmVyZXFfdDsKK307CiAKIC8qLS0gUHJvYmUgUmVzcG9uc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX3Byb2JlcmVzcCB7CitzdHJ1Y3Qgd2xhbl9mcl9wcm9iZXJlc3AgewogCXUxNiB0eXBlOwogCXUxNiBsZW47CiAJdTggKmJ1ZjsKQEAgLTQ1NiwxNiArNDU2LDE2IEBACiAJdTE2ICpiY25faW50OwogCXUxNiAqY2FwX2luZm87CiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwotCXdsYW5faWVfc3NpZF90ICpzc2lkOwotCXdsYW5faWVfc3VwcF9yYXRlc190ICpzdXBwX3JhdGVzOwotCXdsYW5faWVfZmhfcGFybXNfdCAqZmhfcGFybXM7Ci0Jd2xhbl9pZV9kc19wYXJtc190ICpkc19wYXJtczsKLQl3bGFuX2llX2NmX3Bhcm1zX3QgKmNmX3Bhcm1zOwotCXdsYW5faWVfaWJzc19wYXJtc190ICppYnNzX3Bhcm1zOwotfSB3bGFuX2ZyX3Byb2JlcmVzcF90OworCXN0cnVjdCB3bGFuX2llX3NzaWQgKnNzaWQ7CisJc3RydWN0IHdsYW5faWVfc3VwcF9yYXRlcyAqc3VwcF9yYXRlczsKKwlzdHJ1Y3Qgd2xhbl9pZV9maF9wYXJtcyAqZmhfcGFybXM7CisJc3RydWN0IHdsYW5faWVfZHNfcGFybXMgKmRzX3Bhcm1zOworCXN0cnVjdCB3bGFuX2llX2NmX3Bhcm1zICpjZl9wYXJtczsKKwlzdHJ1Y3Qgd2xhbl9pZV9pYnNzX3Bhcm1zICppYnNzX3Bhcm1zOworfTsKIAogLyotLSBBdXRoZW50aWNhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5fZnJfYXV0aGVuIHsKK3N0cnVjdCB3bGFuX2ZyX2F1dGhlbiB7CiAJdTE2IHR5cGU7CiAJdTE2IGxlbjsKIAl1OCAqYnVmOwpAQCAtNDc3LDEyICs0NzcsMTIgQEAKIAl1MTYgKmF1dGhfc2VxOwogCXUxNiAqc3RhdHVzOwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KLQl3bGFuX2llX2NoYWxsZW5nZV90ICpjaGFsbGVuZ2U7CisJc3RydWN0IHdsYW5faWVfY2hhbGxlbmdlICpjaGFsbGVuZ2U7CiAKLX0gd2xhbl9mcl9hdXRoZW5fdDsKK307CiAKIC8qLS0gRGVhdXRoZW5pY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5fZnJfZGVhdXRoZW4geworc3RydWN0IHdsYW5fZnJfZGVhdXRoZW4gewogCXUxNiB0eXBlOwogCXUxNiBsZW47CiAJdTggKmJ1ZjsKQEAgLTQ5NCwyNyArNDk0LDI3IEBACiAKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCiAKLX0gd2xhbl9mcl9kZWF1dGhlbl90OworfTsKIAotdm9pZCB3bGFuX21nbXRfZW5jb2RlX2JlYWNvbih3bGFuX2ZyX2JlYWNvbl90ICpmKTsKLXZvaWQgd2xhbl9tZ210X2RlY29kZV9iZWFjb24od2xhbl9mcl9iZWFjb25fdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9lbmNvZGVfZGlzYXNzb2Mod2xhbl9mcl9kaXNhc3NvY190ICpmKTsKLXZvaWQgd2xhbl9tZ210X2RlY29kZV9kaXNhc3NvYyh3bGFuX2ZyX2Rpc2Fzc29jX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZW5jb2RlX2Fzc29jcmVxKHdsYW5fZnJfYXNzb2NyZXFfdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9kZWNvZGVfYXNzb2NyZXEod2xhbl9mcl9hc3NvY3JlcV90ICpmKTsKLXZvaWQgd2xhbl9tZ210X2VuY29kZV9hc3NvY3Jlc3Aod2xhbl9mcl9hc3NvY3Jlc3BfdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9kZWNvZGVfYXNzb2NyZXNwKHdsYW5fZnJfYXNzb2NyZXNwX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZW5jb2RlX3JlYXNzb2NyZXEod2xhbl9mcl9yZWFzc29jcmVxX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZGVjb2RlX3JlYXNzb2NyZXEod2xhbl9mcl9yZWFzc29jcmVxX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZW5jb2RlX3JlYXNzb2NyZXNwKHdsYW5fZnJfcmVhc3NvY3Jlc3BfdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9kZWNvZGVfcmVhc3NvY3Jlc3Aod2xhbl9mcl9yZWFzc29jcmVzcF90ICpmKTsKLXZvaWQgd2xhbl9tZ210X2VuY29kZV9wcm9iZXJlcSh3bGFuX2ZyX3Byb2JlcmVxX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZGVjb2RlX3Byb2JlcmVxKHdsYW5fZnJfcHJvYmVyZXFfdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9lbmNvZGVfcHJvYmVyZXNwKHdsYW5fZnJfcHJvYmVyZXNwX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZGVjb2RlX3Byb2JlcmVzcCh3bGFuX2ZyX3Byb2JlcmVzcF90ICpmKTsKLXZvaWQgd2xhbl9tZ210X2VuY29kZV9hdXRoZW4od2xhbl9mcl9hdXRoZW5fdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9kZWNvZGVfYXV0aGVuKHdsYW5fZnJfYXV0aGVuX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZW5jb2RlX2RlYXV0aGVuKHdsYW5fZnJfZGVhdXRoZW5fdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9kZWNvZGVfZGVhdXRoZW4od2xhbl9mcl9kZWF1dGhlbl90ICpmKTsKK3ZvaWQgd2xhbl9tZ210X2VuY29kZV9iZWFjb24oc3RydWN0IHdsYW5fZnJfYmVhY29uICpmKTsKK3ZvaWQgd2xhbl9tZ210X2RlY29kZV9iZWFjb24oc3RydWN0IHdsYW5fZnJfYmVhY29uICpmKTsKK3ZvaWQgd2xhbl9tZ210X2VuY29kZV9kaXNhc3NvYyhzdHJ1Y3Qgd2xhbl9mcl9kaXNhc3NvYyAqZik7Cit2b2lkIHdsYW5fbWdtdF9kZWNvZGVfZGlzYXNzb2Moc3RydWN0IHdsYW5fZnJfZGlzYXNzb2MgKmYpOwordm9pZCB3bGFuX21nbXRfZW5jb2RlX2Fzc29jcmVxKHN0cnVjdCB3bGFuX2ZyX2Fzc29jcmVxICpmKTsKK3ZvaWQgd2xhbl9tZ210X2RlY29kZV9hc3NvY3JlcShzdHJ1Y3Qgd2xhbl9mcl9hc3NvY3JlcSAqZik7Cit2b2lkIHdsYW5fbWdtdF9lbmNvZGVfYXNzb2NyZXNwKHN0cnVjdCB3bGFuX2ZyX2Fzc29jcmVzcCAqZik7Cit2b2lkIHdsYW5fbWdtdF9kZWNvZGVfYXNzb2NyZXNwKHN0cnVjdCB3bGFuX2ZyX2Fzc29jcmVzcCAqZik7Cit2b2lkIHdsYW5fbWdtdF9lbmNvZGVfcmVhc3NvY3JlcShzdHJ1Y3Qgd2xhbl9mcl9yZWFzc29jcmVxICpmKTsKK3ZvaWQgd2xhbl9tZ210X2RlY29kZV9yZWFzc29jcmVxKHN0cnVjdCB3bGFuX2ZyX3JlYXNzb2NyZXEgKmYpOwordm9pZCB3bGFuX21nbXRfZW5jb2RlX3JlYXNzb2NyZXNwKHN0cnVjdCB3bGFuX2ZyX3JlYXNzb2NyZXNwICpmKTsKK3ZvaWQgd2xhbl9tZ210X2RlY29kZV9yZWFzc29jcmVzcChzdHJ1Y3Qgd2xhbl9mcl9yZWFzc29jcmVzcCAqZik7Cit2b2lkIHdsYW5fbWdtdF9lbmNvZGVfcHJvYmVyZXEoc3RydWN0IHdsYW5fZnJfcHJvYmVyZXEgKmYpOwordm9pZCB3bGFuX21nbXRfZGVjb2RlX3Byb2JlcmVxKHN0cnVjdCB3bGFuX2ZyX3Byb2JlcmVxICpmKTsKK3ZvaWQgd2xhbl9tZ210X2VuY29kZV9wcm9iZXJlc3Aoc3RydWN0IHdsYW5fZnJfcHJvYmVyZXNwICpmKTsKK3ZvaWQgd2xhbl9tZ210X2RlY29kZV9wcm9iZXJlc3Aoc3RydWN0IHdsYW5fZnJfcHJvYmVyZXNwICpmKTsKK3ZvaWQgd2xhbl9tZ210X2VuY29kZV9hdXRoZW4oc3RydWN0IHdsYW5fZnJfYXV0aGVuICpmKTsKK3ZvaWQgd2xhbl9tZ210X2RlY29kZV9hdXRoZW4oc3RydWN0IHdsYW5fZnJfYXV0aGVuICpmKTsKK3ZvaWQgd2xhbl9tZ210X2VuY29kZV9kZWF1dGhlbihzdHJ1Y3Qgd2xhbl9mcl9kZWF1dGhlbiAqZik7Cit2b2lkIHdsYW5fbWdtdF9kZWNvZGVfZGVhdXRoZW4oc3RydWN0IHdsYW5fZnJfZGVhdXRoZW4gKmYpOwogCiAjZW5kaWYgLyogX1A4MDIxMU1HTVRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYwppbmRleCAwMDM5ZTA4Li5lM2FlODAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYwpAQCAtMjYyLDcgKzI2Miw2IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAJbmV0ZGV2aWNlX3QgKmRldiA9IHdsYW5kZXYtPm5ldGRldjsKIAlzdHJ1Y3QgcDgwMjExX2hkcl9hMyAqaGRyOwotCXUxNiBmYzsKIAogCS8qIExldCdzIGVtcHR5IG91ciBvdXIgcXVldWUgKi8KIAl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZ3bGFuZGV2LT5uc2RfcnhxKSkpIHsKQEAgLTI4Niw4ICsyODUsNyBAQAogCQkJCWNvbnRpbnVlOwogCQkJfSBlbHNlIHsKIAkJCQloZHIgPSAoc3RydWN0IHA4MDIxMV9oZHJfYTMgKikgc2tiLT5kYXRhOwotCQkJCWZjID0gbGUxNl90b19jcHUoaGRyLT5mYyk7Ci0JCQkJaWYgKHA4MDIxMV9yeF90eXBlZHJvcCh3bGFuZGV2LCBmYykpIHsKKwkJCQlpZiAocDgwMjExX3J4X3R5cGVkcm9wKHdsYW5kZXYsIGhkci0+ZmMpKSB7CiAJCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yZncuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMmZ3LmMKaW5kZXggMGRmZDJhNC4uMmIwYzIzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yZncuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJmdy5jCkBAIC0yMDEsNyArMjAxLDcgQEAKICoJMAktIHN1Y2Nlc3MKICoJfjAJLSBmYWlsdXJlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJfZnd0cnkoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3N0YXRpYyBpbnQgcHJpc20yX2Z3dHJ5KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCB3bGFuZGV2aWNlX3QgKndsYW5kZXYpCiB7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeSA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnN0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKaW5kZXggMjE5OWY1YS4uZjljY2YyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKQEAgLTQ1NCw5ICs0NTQsOCBAQAogCQkJICovCiAJCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc3RhcnQoaHcpOwogCQkJaWYgKHJlc3VsdCkgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSAgICAgICAiaGZhMzg0eF9kcnZyX3N0YXJ0KCkgZmFpbGVkLCIKLQkJCQkgICAgICAgInJlc3VsdD0lZFxuIiwgKGludClyZXN1bHQpOworCQkJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LAorCQkJCSAgICAgICAiaGZhMzg0eF9kcnZyX3N0YXJ0KCkgZmFpbGVkLHJlc3VsdD0lZFxuIiwgKGludClyZXN1bHQpOwogCQkJCXJlc3VsdCA9CiAJCQkJIFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbXBsZW1lbnRhdGlvbl9mYWlsdXJlOwogCQkJCXdsYW5kZXYtPm1zZHN0YXRlID0gV0xBTl9NU0RfSFdQUkVTRU5UOwpAQCAtNDk5LDkgKzQ5OCw4IEBACiAJCQkgKi8KIAkJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zdGFydChodyk7CiAJCQlpZiAocmVzdWx0KSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJoZmEzODR4X2RydnJfc3RhcnQoKSBmYWlsZWQsIgotCQkJCSAgICAgICAicmVzdWx0PSVkXG4iLCAoaW50KXJlc3VsdCk7CisJCQkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsCisJCQkJICAgICAgICJoZmEzODR4X2RydnJfc3RhcnQoKSBmYWlsZWQscmVzdWx0PSVkXG4iLCAoaW50KXJlc3VsdCk7CiAJCQkJcmVzdWx0ID0KIAkJCQkgIFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbXBsZW1lbnRhdGlvbl9mYWlsdXJlOwogCQkJCXdsYW5kZXYtPm1zZHN0YXRlID0gV0xBTl9NU0RfSFdQUkVTRU5UOwpAQCAtNTEwLDkgKzUwOCw4IEBACiAKIAkJCXJlc3VsdCA9IHByaXNtMnN0YV9nZXRjYXJkaW5mbyh3bGFuZGV2KTsKIAkJCWlmIChyZXN1bHQpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkgICAgICAgInByaXNtMnN0YV9nZXRjYXJkaW5mbygpIGZhaWxlZCwiCi0JCQkJICAgICAgICJyZXN1bHQ9JWRcbiIsIChpbnQpcmVzdWx0KTsKKwkJCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwKKwkJCQkgICAgICAgInByaXNtMnN0YV9nZXRjYXJkaW5mbygpIGZhaWxlZCxyZXN1bHQ9JWRcbiIsIChpbnQpcmVzdWx0KTsKIAkJCQlyZXN1bHQgPQogCQkJCSAgUDgwMjExRU5VTV9yZXN1bHRjb2RlX2ltcGxlbWVudGF0aW9uX2ZhaWx1cmU7CiAJCQkJaGZhMzg0eF9kcnZyX3N0b3AoaHcpOwpAQCAtNTIxLDkgKzUxOCw4IEBACiAJCQl9CiAJCQlyZXN1bHQgPSBwcmlzbTJzdGFfZ2xvYmFsc2V0dXAod2xhbmRldik7CiAJCQlpZiAocmVzdWx0KSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJwcmlzbTJzdGFfZ2xvYmFsc2V0dXAoKSBmYWlsZWQsIgotCQkJCSAgICAgICAicmVzdWx0PSVkXG4iLCAoaW50KXJlc3VsdCk7CisJCQkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsCisJCQkJICAgICAgICJwcmlzbTJzdGFfZ2xvYmFsc2V0dXAoKSBmYWlsZWQscmVzdWx0PSVkXG4iLCAoaW50KXJlc3VsdCk7CiAJCQkJcmVzdWx0ID0KIAkJCQkgIFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbXBsZW1lbnRhdGlvbl9mYWlsdXJlOwogCQkJCWhmYTM4NHhfZHJ2cl9zdG9wKGh3KTsKQEAgLTYyMyw3ICs2MTksNyBAQAogCQkJCQkmaHctPmlkZW50X25pYywKIAkJCQkJc2l6ZW9mKGhmYTM4NHhfY29tcGlkZW50X3QpKTsKIAlpZiAocmVzdWx0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJldHJpZXZlIE5JQ0lERU5USVRZXG4iKTsKKwkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgTklDSURFTlRJVFlcbiIpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTYzMyw3ICs2MjksNyBAQAogCWh3LT5pZGVudF9uaWMubWFqb3IgPSBsZTE2X3RvX2NwdShody0+aWRlbnRfbmljLm1ham9yKTsKIAlody0+aWRlbnRfbmljLm1pbm9yID0gbGUxNl90b19jcHUoaHctPmlkZW50X25pYy5taW5vcik7CiAKLQlwcmludGsoS0VSTl9JTkZPICJpZGVudDogbmljIGgvdzogaWQ9MHglMDJ4ICVkLiVkLiVkXG4iLAorCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwgImlkZW50OiBuaWMgaC93OiBpZD0weCUwMnggJWQuJWQuJWRcbiIsCiAJICAgICAgIGh3LT5pZGVudF9uaWMuaWQsIGh3LT5pZGVudF9uaWMubWFqb3IsCiAJICAgICAgIGh3LT5pZGVudF9uaWMubWlub3IsIGh3LT5pZGVudF9uaWMudmFyaWFudCk7CiAKQEAgLTY0Miw3ICs2MzgsNyBAQAogCQkJCQkmaHctPmlkZW50X3ByaV9mdywKIAkJCQkJc2l6ZW9mKGhmYTM4NHhfY29tcGlkZW50X3QpKTsKIAlpZiAocmVzdWx0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJldHJpZXZlIFBSSUlERU5USVRZXG4iKTsKKwkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgUFJJSURFTlRJVFlcbiIpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTY1Miw3ICs2NDgsNyBAQAogCWh3LT5pZGVudF9wcmlfZncubWFqb3IgPSBsZTE2X3RvX2NwdShody0+aWRlbnRfcHJpX2Z3Lm1ham9yKTsKIAlody0+aWRlbnRfcHJpX2Z3Lm1pbm9yID0gbGUxNl90b19jcHUoaHctPmlkZW50X3ByaV9mdy5taW5vcik7CiAKLQlwcmludGsoS0VSTl9JTkZPICJpZGVudDogcHJpIGYvdzogaWQ9MHglMDJ4ICVkLiVkLiVkXG4iLAorCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwgImlkZW50OiBwcmkgZi93OiBpZD0weCUwMnggJWQuJWQuJWRcbiIsCiAJICAgICAgIGh3LT5pZGVudF9wcmlfZncuaWQsIGh3LT5pZGVudF9wcmlfZncubWFqb3IsCiAJICAgICAgIGh3LT5pZGVudF9wcmlfZncubWlub3IsIGh3LT5pZGVudF9wcmlfZncudmFyaWFudCk7CiAKQEAgLTY2MSwxMiArNjU3LDEyIEBACiAJCQkJCSZody0+aWRlbnRfc3RhX2Z3LAogCQkJCQlzaXplb2YoaGZhMzg0eF9jb21waWRlbnRfdCkpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmV0cmlldmUgU1RBSURFTlRJVFlcbiIpOworCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBTVEFJREVOVElUWVxuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAogCWlmIChody0+aWRlbnRfbmljLmlkIDwgMHg4MDAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUgorCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwKIAkJICAgICAgICJGQVRBTDogQ2FyZCBpcyBub3QgYW4gSW50ZXJzaWwgUHJpc20yLzIuNS8zXG4iKTsKIAkJcmVzdWx0ID0gLTE7CiAJCWdvdG8gZmFpbGVkOwpAQCAtNjgzLDE2ICs2NzksMTYgQEAKIAlody0+aWRlbnRfc3RhX2Z3LnZhcmlhbnQgJj0gfigodTE2KSAoQklUKDE0KSB8IEJJVCgxNSkpKTsKIAogCWlmIChody0+aWRlbnRfc3RhX2Z3LmlkID09IDB4MWYpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTworCQluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsCiAJCSAgICAgICAiaWRlbnQ6IHN0YSBmL3c6IGlkPTB4JTAyeCAlZC4lZC4lZFxuIiwKIAkJICAgICAgIGh3LT5pZGVudF9zdGFfZncuaWQsIGh3LT5pZGVudF9zdGFfZncubWFqb3IsCiAJCSAgICAgICBody0+aWRlbnRfc3RhX2Z3Lm1pbm9yLCBody0+aWRlbnRfc3RhX2Z3LnZhcmlhbnQpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0lORk8KKwkJbmV0ZGV2X2luZm8od2xhbmRldi0+bmV0ZGV2LAogCQkgICAgICAgImlkZW50OiAgYXAgZi93OiBpZD0weCUwMnggJWQuJWQuJWRcbiIsCiAJCSAgICAgICBody0+aWRlbnRfc3RhX2Z3LmlkLCBody0+aWRlbnRfc3RhX2Z3Lm1ham9yLAogCQkgICAgICAgaHctPmlkZW50X3N0YV9mdy5taW5vciwgaHctPmlkZW50X3N0YV9mdy52YXJpYW50KTsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbnN1cHBvcnRlZCBUZXJ0aWFyeSBBUCBmaXJtZWFyZSBsb2FkZWQhXG4iKTsKKwkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJVbnN1cHBvcnRlZCBUZXJ0aWFyeSBBUCBmaXJtZWFyZSBsb2FkZWQhXG4iKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC03MDEsNyArNjk3LDcgQEAKIAkJCQkJJmh3LT5jYXBfc3VwX21maSwKIAkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmV0cmlldmUgTUZJU1VQUkFOR0VcbiIpOworCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBNRklTVVBSQU5HRVxuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtNzEzLDcgKzcwOSw3IEBACiAJaHctPmNhcF9zdXBfbWZpLmJvdHRvbSA9IGxlMTZfdG9fY3B1KGh3LT5jYXBfc3VwX21maS5ib3R0b20pOwogCWh3LT5jYXBfc3VwX21maS50b3AgPSBsZTE2X3RvX2NwdShody0+Y2FwX3N1cF9tZmkudG9wKTsKIAotCXByaW50ayhLRVJOX0lORk8KKwluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsCiAJICAgICAgICJNRkk6U1VQOnJvbGU9MHglMDJ4OmlkPTB4JTAyeDp2YXI9MHglMDJ4OmIvdD0lZC8lZFxuIiwKIAkgICAgICAgaHctPmNhcF9zdXBfbWZpLnJvbGUsIGh3LT5jYXBfc3VwX21maS5pZCwKIAkgICAgICAgaHctPmNhcF9zdXBfbWZpLnZhcmlhbnQsIGh3LT5jYXBfc3VwX21maS5ib3R0b20sCkBAIC03MjQsNyArNzIwLDcgQEAKIAkJCQkJJmh3LT5jYXBfc3VwX2NmaSwKIAkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmV0cmlldmUgQ0ZJU1VQUkFOR0VcbiIpOworCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBDRklTVVBSQU5HRVxuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtNzM2LDcgKzczMiw3IEBACiAJaHctPmNhcF9zdXBfY2ZpLmJvdHRvbSA9IGxlMTZfdG9fY3B1KGh3LT5jYXBfc3VwX2NmaS5ib3R0b20pOwogCWh3LT5jYXBfc3VwX2NmaS50b3AgPSBsZTE2X3RvX2NwdShody0+Y2FwX3N1cF9jZmkudG9wKTsKIAotCXByaW50ayhLRVJOX0lORk8KKwluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsCiAJICAgICAgICJDRkk6U1VQOnJvbGU9MHglMDJ4OmlkPTB4JTAyeDp2YXI9MHglMDJ4OmIvdD0lZC8lZFxuIiwKIAkgICAgICAgaHctPmNhcF9zdXBfY2ZpLnJvbGUsIGh3LT5jYXBfc3VwX2NmaS5pZCwKIAkgICAgICAgaHctPmNhcF9zdXBfY2ZpLnZhcmlhbnQsIGh3LT5jYXBfc3VwX2NmaS5ib3R0b20sCkBAIC03NDcsNyArNzQzLDcgQEAKIAkJCQkJJmh3LT5jYXBfc3VwX3ByaSwKIAkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmV0cmlldmUgUFJJU1VQUkFOR0VcbiIpOworCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBQUklTVVBSQU5HRVxuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtNzU5LDcgKzc1NSw3IEBACiAJaHctPmNhcF9zdXBfcHJpLmJvdHRvbSA9IGxlMTZfdG9fY3B1KGh3LT5jYXBfc3VwX3ByaS5ib3R0b20pOwogCWh3LT5jYXBfc3VwX3ByaS50b3AgPSBsZTE2X3RvX2NwdShody0+Y2FwX3N1cF9wcmkudG9wKTsKIAotCXByaW50ayhLRVJOX0lORk8KKwluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsCiAJICAgICAgICJQUkk6U1VQOnJvbGU9MHglMDJ4OmlkPTB4JTAyeDp2YXI9MHglMDJ4OmIvdD0lZC8lZFxuIiwKIAkgICAgICAgaHctPmNhcF9zdXBfcHJpLnJvbGUsIGh3LT5jYXBfc3VwX3ByaS5pZCwKIAkgICAgICAgaHctPmNhcF9zdXBfcHJpLnZhcmlhbnQsIGh3LT5jYXBfc3VwX3ByaS5ib3R0b20sCkBAIC03NzAsNyArNzY2LDcgQEAKIAkJCQkJJmh3LT5jYXBfc3VwX3N0YSwKIAkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmV0cmlldmUgU1RBU1VQUkFOR0VcbiIpOworCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBTVEFTVVBSQU5HRVxuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtNzgzLDEzICs3NzksMTMgQEAKIAlody0+Y2FwX3N1cF9zdGEudG9wID0gbGUxNl90b19jcHUoaHctPmNhcF9zdXBfc3RhLnRvcCk7CiAKIAlpZiAoaHctPmNhcF9zdXBfc3RhLmlkID09IDB4MDQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTworCQluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsCiAJCSAgICAgICAiU1RBOlNVUDpyb2xlPTB4JTAyeDppZD0weCUwMng6dmFyPTB4JTAyeDpiL3Q9JWQvJWRcbiIsCiAJCSAgICAgICBody0+Y2FwX3N1cF9zdGEucm9sZSwgaHctPmNhcF9zdXBfc3RhLmlkLAogCQkgICAgICAgaHctPmNhcF9zdXBfc3RhLnZhcmlhbnQsIGh3LT5jYXBfc3VwX3N0YS5ib3R0b20sCiAJCSAgICAgICBody0+Y2FwX3N1cF9zdGEudG9wKTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9JTkZPCisJCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwKIAkJICAgICAgICJBUDpTVVA6cm9sZT0weCUwMng6aWQ9MHglMDJ4OnZhcj0weCUwMng6Yi90PSVkLyVkXG4iLAogCQkgICAgICAgaHctPmNhcF9zdXBfc3RhLnJvbGUsIGh3LT5jYXBfc3VwX3N0YS5pZCwKIAkJICAgICAgIGh3LT5jYXBfc3VwX3N0YS52YXJpYW50LCBody0+Y2FwX3N1cF9zdGEuYm90dG9tLApAQCAtODAxLDcgKzc5Nyw3IEBACiAJCQkJCSZody0+Y2FwX2FjdF9wcmlfY2ZpLAogCQkJCQlzaXplb2YoaGZhMzg0eF9jYXBsZXZlbF90KSk7CiAJaWYgKHJlc3VsdCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZXRyaWV2ZSBQUklfQ0ZJQUNUUkFOR0VTXG4iKTsKKwkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgUFJJX0NGSUFDVFJBTkdFU1xuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtODEzLDcgKzgwOSw3IEBACiAJaHctPmNhcF9hY3RfcHJpX2NmaS5ib3R0b20gPSBsZTE2X3RvX2NwdShody0+Y2FwX2FjdF9wcmlfY2ZpLmJvdHRvbSk7CiAJaHctPmNhcF9hY3RfcHJpX2NmaS50b3AgPSBsZTE2X3RvX2NwdShody0+Y2FwX2FjdF9wcmlfY2ZpLnRvcCk7CiAKLQlwcmludGsoS0VSTl9JTkZPCisJbmV0ZGV2X2luZm8od2xhbmRldi0+bmV0ZGV2LAogCSAgICAgICAiUFJJLUNGSTpBQ1Q6cm9sZT0weCUwMng6aWQ9MHglMDJ4OnZhcj0weCUwMng6Yi90PSVkLyVkXG4iLAogCSAgICAgICBody0+Y2FwX2FjdF9wcmlfY2ZpLnJvbGUsIGh3LT5jYXBfYWN0X3ByaV9jZmkuaWQsCiAJICAgICAgIGh3LT5jYXBfYWN0X3ByaV9jZmkudmFyaWFudCwgaHctPmNhcF9hY3RfcHJpX2NmaS5ib3R0b20sCkBAIC04MjQsNyArODIwLDcgQEAKIAkJCQkJJmh3LT5jYXBfYWN0X3N0YV9jZmksCiAJCQkJCXNpemVvZihoZmEzODR4X2NhcGxldmVsX3QpKTsKIAlpZiAocmVzdWx0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJldHJpZXZlIFNUQV9DRklBQ1RSQU5HRVNcbiIpOworCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBTVEFfQ0ZJQUNUUkFOR0VTXG4iKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC04MzYsNyArODMyLDcgQEAKIAlody0+Y2FwX2FjdF9zdGFfY2ZpLmJvdHRvbSA9IGxlMTZfdG9fY3B1KGh3LT5jYXBfYWN0X3N0YV9jZmkuYm90dG9tKTsKIAlody0+Y2FwX2FjdF9zdGFfY2ZpLnRvcCA9IGxlMTZfdG9fY3B1KGh3LT5jYXBfYWN0X3N0YV9jZmkudG9wKTsKIAotCXByaW50ayhLRVJOX0lORk8KKwluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsCiAJICAgICAgICJTVEEtQ0ZJOkFDVDpyb2xlPTB4JTAyeDppZD0weCUwMng6dmFyPTB4JTAyeDpiL3Q9JWQvJWRcbiIsCiAJICAgICAgIGh3LT5jYXBfYWN0X3N0YV9jZmkucm9sZSwgaHctPmNhcF9hY3Rfc3RhX2NmaS5pZCwKIAkgICAgICAgaHctPmNhcF9hY3Rfc3RhX2NmaS52YXJpYW50LCBody0+Y2FwX2FjdF9zdGFfY2ZpLmJvdHRvbSwKQEAgLTg0Nyw3ICs4NDMsNyBAQAogCQkJCQkmaHctPmNhcF9hY3Rfc3RhX21maSwKIAkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmV0cmlldmUgU1RBX01GSUFDVFJBTkdFU1xuIik7CisJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIFNUQV9NRklBQ1RSQU5HRVNcbiIpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTg1OSw3ICs4NTUsNyBAQAogCWh3LT5jYXBfYWN0X3N0YV9tZmkuYm90dG9tID0gbGUxNl90b19jcHUoaHctPmNhcF9hY3Rfc3RhX21maS5ib3R0b20pOwogCWh3LT5jYXBfYWN0X3N0YV9tZmkudG9wID0gbGUxNl90b19jcHUoaHctPmNhcF9hY3Rfc3RhX21maS50b3ApOwogCi0JcHJpbnRrKEtFUk5fSU5GTworCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwKIAkgICAgICAgIlNUQS1NRkk6QUNUOnJvbGU9MHglMDJ4OmlkPTB4JTAyeDp2YXI9MHglMDJ4OmIvdD0lZC8lZFxuIiwKIAkgICAgICAgaHctPmNhcF9hY3Rfc3RhX21maS5yb2xlLCBody0+Y2FwX2FjdF9zdGFfbWZpLmlkLAogCSAgICAgICBody0+Y2FwX2FjdF9zdGFfbWZpLnZhcmlhbnQsIGh3LT5jYXBfYWN0X3N0YV9tZmkuYm90dG9tLApAQCAtODcxLDkgKzg2Nyw5IEBACiAJaWYgKCFyZXN1bHQpIHsKIAkJd2xhbl9ta3ByaW50c3RyKHNudW0sIEhGQTM4NHhfUklEX05JQ1NFUklBTE5VTUJFUl9MRU4sCiAJCQkJcHN0ciwgc2l6ZW9mKHBzdHIpKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUHJpc20yIGNhcmQgU046ICVzXG4iLCBwc3RyKTsKKwkJbmV0ZGV2X2luZm8od2xhbmRldi0+bmV0ZGV2LCAiUHJpc20yIGNhcmQgU046ICVzXG4iLCBwc3RyKTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZXRyaWV2ZSBQcmlzbTIgQ2FyZCBTTlxuIik7CisJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIFByaXNtMiBDYXJkIFNOXG4iKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC04ODEsNyArODc3LDcgQEAKIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9DTkZPV05NQUNBRERSLAogCQkJCQl3bGFuZGV2LT5uZXRkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJldHJpZXZlIG1hYyBhZGRyZXNzXG4iKTsKKwkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgbWFjIGFkZHJlc3NcbiIpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTkwOSw3ICs5MDUsNyBAQAogCiAJZ290byBkb25lOwogZmFpbGVkOgotCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkLCByZXN1bHQ9JWRcbiIsIHJlc3VsdCk7CisJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQsIHJlc3VsdD0lZFxuIiwgcmVzdWx0KTsKIGRvbmU6CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTEwODUsNyArMTA4MSw3IEBACiAJCQkJCUhGQTM4NHhfUklEX0pPSU5SRVFVRVNULAogCQkJCQkmam9pbnJlcSwgSEZBMzg0eF9SSURfSk9JTlJFUVVFU1RfTEVOKTsKIAlpZiAocmVzdWx0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic2V0Y29uZmlnKGpvaW5yZXEpIGZhaWxlZCwgcmVzdWx0PSVkXG4iLAorCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgInNldGNvbmZpZyhqb2lucmVxKSBmYWlsZWQsIHJlc3VsdD0lZFxuIiwKIAkJICAgICAgIHJlc3VsdCk7CiAJfQogfQpAQCAtMTIyNiw3ICsxMjIyLDcgQEAKIAkJICovCiAJCW5ldGlmX2NhcnJpZXJfb2ZmKHdsYW5kZXYtPm5ldGRldik7CiAKLQkJcHJpbnRrKEtFUk5fSU5GTyAibGlua3N0YXR1cz1OT1RDT05ORUNURUQgKHVuaGFuZGxlZClcbiIpOworCQluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsICJsaW5rc3RhdHVzPU5PVENPTk5FQ1RFRCAodW5oYW5kbGVkKVxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBIRkEzODR4X0xJTktfQ09OTkVDVEVEOgpAQCAtMTI1Myw3ICsxMjQ5LDcgQEAKIAkJaWYgKHdsYW5kZXYtPm5ldGRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIpIHsKIAkJCXUxNiBwb3J0c3RhdHVzOwogCi0JCQlwcmludGsoS0VSTl9JTkZPICJsaW5rc3RhdHVzPUNPTk5FQ1RFRFxuIik7CisJCQluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsICJsaW5rc3RhdHVzPUNPTk5FQ1RFRFxuIik7CiAKIAkJCS8qIEZvciBub24tdXNiIGRldmljZXMsIHdlIGNhbiB1c2UgdGhlIHN5bmMgdmVyc2lvbnMgKi8KIAkJCS8qIENvbGxlY3QgdGhlIEJTU0lELCBhbmQgc2V0IHN0YXRlIHRvIGFsbG93IHR4ICovCkBAIC0xMzE1LDcgKzEzMTEsNyBAQAogCQkgKiBCbG9jayBUcmFuc21pdHMsIElnbm9yZSByZWNlaXZlcyBvZiBkYXRhIGZyYW1lcwogCQkgKi8KIAkJaWYgKHdsYW5kZXYtPm5ldGRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIpCi0JCQlwcmludGsoS0VSTl9JTkZPCisJCQluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsCiAJCQkgICAgICAgImxpbmtzdGF0dXM9RElTQ09OTkVDVEVEICh1bmhhbmRsZWQpXG4iKTsKIAkJd2xhbmRldi0+bWFjbW9kZSA9IFdMQU5fTUFDTU9ERV9OT05FOwogCkBAIC0xMzQxLDcgKzEzMzcsNyBAQAogCQkgKiBJbmRpY2F0ZSBSZWFzc29jaWF0aW9uCiAJCSAqIEVuYWJsZSBUcmFuc21pdHMsIFJlY2VpdmVzIGFuZCBwYXNzIHVwIGRhdGEgZnJhbWVzCiAJCSAqLwotCQlwcmludGsoS0VSTl9JTkZPICJsaW5rc3RhdHVzPUFQX0NIQU5HRVxuIik7CisJCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwgImxpbmtzdGF0dXM9QVBfQ0hBTkdFXG4iKTsKIAogCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LAogCQkJCQkJSEZBMzg0eF9SSURfQ1VSUkVOVEJTU0lELApAQCAtMTM4Myw3ICsxMzc5LDcgQEAKIAkJICogUmVzcG9uc2U6CiAJCSAqIEJsb2NrIFRyYW5zbWl0cywgSWdub3JlIHJlY2VpdmVzIG9mIGRhdGEgZnJhbWVzCiAJCSAqLwotCQlwcmludGsoS0VSTl9JTkZPICJsaW5rc3RhdHVzPUFQX09VVE9GUkFOR0UgKHVuaGFuZGxlZClcbiIpOworCQluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsICJsaW5rc3RhdHVzPUFQX09VVE9GUkFOR0UgKHVuaGFuZGxlZClcbiIpOwogCiAJCW5ldGlmX2NhcnJpZXJfb2ZmKHdsYW5kZXYtPm5ldGRldik7CiAKQEAgLTEzOTYsNyArMTM5Miw3IEBACiAJCSAqIFJlc3BvbnNlOgogCQkgKiBFbmFibGUgVHJhbnNtaXRzLCBSZWNlaXZlcyBhbmQgcGFzcyB1cCBkYXRhIGZyYW1lcwogCQkgKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyAibGlua3N0YXR1cz1BUF9JTlJBTkdFXG4iKTsKKwkJbmV0ZGV2X2luZm8od2xhbmRldi0+bmV0ZGV2LCAibGlua3N0YXR1cz1BUF9JTlJBTkdFXG4iKTsKIAogCQlody0+bGlua19zdGF0dXMgPSBIRkEzODR4X0xJTktfQ09OTkVDVEVEOwogCQluZXRpZl9jYXJyaWVyX29uKHdsYW5kZXYtPm5ldGRldik7CkBAIC0xNDIwLDEwICsxNDE2LDEwIEBACiAJCQkJCSAgICAgICBIRkEzODR4X1JJRF9KT0lOUkVRVUVTVCwKIAkJCQkJICAgICAgICZqb2lucmVxLAogCQkJCQkgICAgICAgSEZBMzg0eF9SSURfSk9JTlJFUVVFU1RfTEVOKTsKLQkJCXByaW50ayhLRVJOX0lORk8KKwkJCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwKIAkJCSAgICAgICAibGlua3N0YXR1cz1BU1NPQ0ZBSUwgKHJlLXN1Ym1pdHRpbmcgam9pbilcbiIpOwogCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAibGlua3N0YXR1cz1BU1NPQ0ZBSUwgKHVuaGFuZGxlZClcbiIpOworCQkJbmV0ZGV2X2luZm8od2xhbmRldi0+bmV0ZGV2LCAibGlua3N0YXR1cz1BU1NPQ0ZBSUwgKHVuaGFuZGxlZClcbiIpOwogCQl9CiAKIAkJbmV0aWZfY2Fycmllcl9vZmYod2xhbmRldi0+bmV0ZGV2KTsKQEAgLTE3MTMsNyArMTcwOSw3IEBACiAJaWYgKHJlc3VsdCkgewogCQlpZiAoYWRkZWQpCiAJCQlody0+YXV0aGxpc3QuY250LS07Ci0JCXByaW50ayhLRVJOX0VSUgorCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwKIAkJICAgICAgICJzZXRjb25maWcoYXV0aGVudGljYXRlc3RhdGlvbikgZmFpbGVkLCByZXN1bHQ9JWRcbiIsCiAJCSAgICAgICByZXN1bHQpOwogCX0KQEAgLTE5MjgsNyArMTkyNCw3IEBACiAJaHcgPSBremFsbG9jKHNpemVvZihoZmEzODR4X3QpLCBHRlBfS0VSTkVMKTsKIAogCWlmICghd2xhbmRldiB8fCAhaHcpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS5cbiIsIGRldl9pbmZvKTsKKwkJcHJfZXJyKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS5cbiIsIGRldl9pbmZvKTsKIAkJa2ZyZWUod2xhbmRldik7CiAJCWtmcmVlKGh3KTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0xOTgwLDcgKzE5NzYsNyBAQAogCQkJCSZody0+cXVhbCwgSEZBMzg0eF9SSURfREJNQ09NTVNRVUFMSVRZX0xFTik7CiAKIAkJaWYgKHJlc3VsdCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJlcnJvciBmZXRjaGluZyBjb21tc3F1YWxcbiIpOworCQkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJlcnJvciBmZXRjaGluZyBjb21tc3F1YWxcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfbWFpbl8yNi5jIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMKaW5kZXggYjNmZjYwMy4uNDY2ODA0NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfbWFpbl8yNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfbWFpbl8yNi5jCkBAIC0xNzU0LDggKzE3NTQsNyBAQAogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgcmVxdWVzdCBtZW1vcnkgc2l6ZSAleFxuIiwKIAkJICAgICAgIHhnaWZiX2luZm8tPnZpZGVvX3NpemUpOwogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiRmF0YWwgZXJyb3I6IFVuYWJsZSB0byByZXNlcnZlIGZyYW1lIGJ1ZmZlciBtZW1vcnkuICIKLQkJCSJJcyB0aGVyZSBhbm90aGVyIGZyYW1lYnVmZmVyIGRyaXZlciBhY3RpdmU/XG4iKTsKKwkJCSJGYXRhbCBlcnJvcjogVW5hYmxlIHRvIHJlc2VydmUgZnJhbWUgYnVmZmVyIG1lbW9yeS4gSXMgdGhlcmUgYW5vdGhlciBmcmFtZWJ1ZmZlciBkcml2ZXIgYWN0aXZlP1xuIik7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyb3JfZGlzYWJsZTsKIAl9CkBAIC0yMDg3LDIzICsyMDg2LDE5IEBACiAKIG1vZHVsZV9wYXJhbShtb2RlLCBjaGFycCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1vZGUsCi0JIlNlbGVjdHMgdGhlIGRlc2lyZWQgZGVmYXVsdCBkaXNwbGF5IG1vZGUgaW4gdGhlIGZvcm1hdCBYeFl4RGVwdGggIgotCSIoZWcuIDEwMjR4NzY4eDE2KS4iKTsKKwkiU2VsZWN0cyB0aGUgZGVzaXJlZCBkZWZhdWx0IGRpc3BsYXkgbW9kZSBpbiB0aGUgZm9ybWF0IFh4WXhEZXB0aCAoZWcuIDEwMjR4NzY4eDE2KS4iKTsKIAogbW9kdWxlX3BhcmFtKGZvcmNlY3J0MnR5cGUsIGNoYXJwLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZm9yY2VjcnQydHlwZSwKLQkiRm9yY2UgdGhlIHNlY29uZCBkaXNwbGF5IG91dHB1dCB0eXBlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIE5PTkUsICIKLQkiTENELCBUViwgVkdBLCBTVklERU8gb3IgQ09NUE9TSVRFLiIpOworCSJGb3JjZSB0aGUgc2Vjb25kIGRpc3BsYXkgb3V0cHV0IHR5cGUuIFBvc3NpYmxlIHZhbHVlcyBhcmUgTk9ORSwgTENELCBUViwgVkdBLCBTVklERU8gb3IgQ09NUE9TSVRFLiIpOwogCiBtb2R1bGVfcGFyYW0odmVzYSwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0ModmVzYSwKLQkiU2VsZWN0cyB0aGUgZGVzaXJlZCBkZWZhdWx0IGRpc3BsYXkgbW9kZSBieSBWRVNBIG1vZGUgbnVtYmVyICIKLQkiKGVnLiAweDExNykuIik7CisJIlNlbGVjdHMgdGhlIGRlc2lyZWQgZGVmYXVsdCBkaXNwbGF5IG1vZGUgYnkgVkVTQSBtb2RlIG51bWJlciAoZWcuIDB4MTE3KS4iKTsKIAogbW9kdWxlX3BhcmFtKGZpbHRlciwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZmlsdGVyLAotCSJTZWxlY3RzIFRWIGZsaWNrZXIgZmlsdGVyIHR5cGUgKG9ubHkgZm9yIHN5c3RlbXMgd2l0aCBhIFNpUzMwMSB2aWRlbyBicmlkZ2UpLiAiCi0JIlBvc3NpYmxlIHZhbHVlcyAwLTcuIERlZmF1bHQ6IFtubyBmaWx0ZXJdKS4iKTsKKwkiU2VsZWN0cyBUViBmbGlja2VyIGZpbHRlciB0eXBlIChvbmx5IGZvciBzeXN0ZW1zIHdpdGggYSBTaVMzMDEgdmlkZW8gYnJpZGdlKS4gUG9zc2libGUgdmFsdWVzIDAtNy4gRGVmYXVsdDogW25vIGZpbHRlcl0pLiIpOwogCiBzdGF0aWMgaW50IF9faW5pdCB4Z2lmYl9pbml0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcveGlsbHlidXMvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy94aWxseWJ1cy9LY29uZmlnCmluZGV4IDc1YzM4YzguLmI1M2JkZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94aWxseWJ1cy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94aWxseWJ1cy9LY29uZmlnCkBAIC01LDYgKzUsNyBAQAogY29uZmlnIFhJTExZQlVTCiAJdHJpc3RhdGUgIlhpbGx5YnVzIGdlbmVyaWMgRlBHQSBpbnRlcmZhY2UiCiAJZGVwZW5kcyBvbiBQQ0kgfHwgKE9GX0FERFJFU1MgJiYgT0ZfSVJRKQorCXNlbGVjdCBDUkMzMgogCWhlbHAKIAkgIFhpbGx5YnVzIGlzIGEgZ2VuZXJpYyBpbnRlcmZhY2UgZm9yIHBlcmlwaGVyYWxzIGRlc2lnbmVkIG9uCiAJICBwcm9ncmFtbWFibGUgbG9naWMgKEZQR0EpLiBUaGUgZHJpdmVyIHByb2JlcyB0aGUgaGFyZHdhcmUgZm9yCkBAIC0xNiw3ICsxNyw3IEBACiAKIGNvbmZpZyBYSUxMWUJVU19QQ0lFCiAJdHJpc3RhdGUgIlhpbGx5YnVzIG92ZXIgUENJZSIKLQlkZXBlbmRzIG9uIFBDSQorCWRlcGVuZHMgb24gUENJX01TSQogCWhlbHAKIAkgIFNldCB0byBNIGlmIHlvdSB3YW50IFhpbGx5YnVzIHRvIHVzZSBQQ0kgRXhwcmVzcyBmb3IgY29tbXVuaWNhdGluZwogCSAgd2l0aCB0aGUgRlBHQS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy94aWxseWJ1cy94aWxseWJ1c19jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcveGlsbHlidXMveGlsbHlidXNfY29yZS5jCmluZGV4IDJlYmFmMTYuLmIwYTY2OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94aWxseWJ1cy94aWxseWJ1c19jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3hpbGx5YnVzL3hpbGx5YnVzX2NvcmUuYwpAQCAtMjMxOCw4ICsyMzE4LDEyIEBACiAJfQogCiAJeGlsbHlidXNfd3EgPSBhbGxvY193b3JrcXVldWUoeGlsbHluYW1lLCAwLCAwKTsKKwlpZiAoIXhpbGx5YnVzX3dxKSB7CisJCWNsYXNzX2Rlc3Ryb3koeGlsbHlidXNfY2xhc3MpOworCQlyYyA9IC1FTk9NRU07CisJfQogCi0JcmV0dXJuIDA7IC8qIFN1Y2Nlc3MgKi8KKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB4aWxseWJ1c19leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9odmMvaHZjX2NvbnNvbGUuYyBiL2RyaXZlcnMvdHR5L2h2Yy9odmNfY29uc29sZS5jCmluZGV4IDUwYjQ2ODguLjk0ZjllM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L2h2Yy9odmNfY29uc29sZS5jCisrKyBiL2RyaXZlcnMvdHR5L2h2Yy9odmNfY29uc29sZS5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgpAQCAtNzAsNiArNzEsOSBAQAogLyogUGlja3MgdXAgbGF0ZSBraWNrcyBhZnRlciBsaXN0IHdhbGsgYnV0IGJlZm9yZSBzY2hlZHVsZSgpICovCiBzdGF0aWMgaW50IGh2Y19raWNrZWQ7CiAKKy8qIGh2Y19pbml0IGlzIHRyaWdnZXJlZCBmcm9tIGh2Y19hbGxvYywgaS5lLiBvbmx5IHdoZW4gYWN0dWFsbHkgdXNlZCAqLworc3RhdGljIGF0b21pY190IGh2Y19uZWVkc19pbml0IF9fcmVhZF9tb3N0bHkgPSBBVE9NSUNfSU5JVCgtMSk7CisKIHN0YXRpYyBpbnQgaHZjX2luaXQodm9pZCk7CiAKICNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKQEAgLTg1MSw3ICs4NTUsNyBAQAogCWludCBpOwogCiAJLyogV2Ugd2FpdCB1bnRpbCBhIGRyaXZlciBhY3R1YWxseSBjb21lcyBhbG9uZyAqLwotCWlmICghaHZjX2RyaXZlcikgeworCWlmIChhdG9taWNfaW5jX25vdF96ZXJvKCZodmNfbmVlZHNfaW5pdCkpIHsKIAkJaW50IGVyciA9IGh2Y19pbml0KCk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gRVJSX1BUUihlcnIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvaXB3aXJlbGVzcy90dHkuYyBiL2RyaXZlcnMvdHR5L2lwd2lyZWxlc3MvdHR5LmMKaW5kZXggZWJkNWJmZi4uMTdlZTNiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvaXB3aXJlbGVzcy90dHkuYworKysgYi9kcml2ZXJzL3R0eS9pcHdpcmVsZXNzL3R0eS5jCkBAIC0xNzYsOSArMTc2LDYgQEAKIAkJCQkiOiAlZCBjaGFycyBub3QgaW5zZXJ0ZWQgdG8gZmxpcCBidWZmZXIhXG4iLAogCQkJCWxlbmd0aCAtIHdvcmspOwogCi0JLyoKLQkgKiBUaGlzIG1heSBzbGVlcCBpZiAtPmxvd19sYXRlbmN5IGlzIHNldAotCSAqLwogCWlmICh3b3JrKQogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCgmdHR5LT5wb3J0KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L25fdHR5LmMgYi9kcml2ZXJzL3R0eS9uX3R0eS5jCmluZGV4IGQxNTYyNGMuLjQxZmU4YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L25fdHR5LmMKKysrIGIvZHJpdmVycy90dHkvbl90dHkuYwpAQCAtMTkwMCwxMyArMTkwMCwxMCBAQAogCXN0cnVjdCBuX3R0eV9kYXRhICpsZGF0YSA9IHR0eS0+ZGlzY19kYXRhOwogCWludCBhbXQgPSBwb2xsICYmICFUSU1FX0NIQVIodHR5KSAmJiBNSU5fQ0hBUih0dHkpID8gTUlOX0NIQVIodHR5KSA6IDE7CiAKLQlpZiAobGRhdGEtPmljYW5vbiAmJiAhTF9FWFRQUk9DKHR0eSkpIHsKLQkJaWYgKGxkYXRhLT5jYW5vbl9oZWFkICE9IGxkYXRhLT5yZWFkX3RhaWwpCi0JCQlyZXR1cm4gMTsKLQl9IGVsc2UgaWYgKHJlYWRfY250KGxkYXRhKSA+PSBhbXQpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIDA7CisJaWYgKGxkYXRhLT5pY2Fub24gJiYgIUxfRVhUUFJPQyh0dHkpKQorCQlyZXR1cm4gbGRhdGEtPmNhbm9uX2hlYWQgIT0gbGRhdGEtPnJlYWRfdGFpbDsKKwllbHNlCisJCXJldHVybiByZWFkX2NudChsZGF0YSkgPj0gYW10OwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfY29yZS5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9jb3JlLmMKaW5kZXggNjk5MzJiNy4uODFmOTA5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9jb3JlLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9jb3JlLmMKQEAgLTE2OTQsNiArMTY5NCwxMCBAQAogCiBzdGF0aWMgdm9pZCBzZXJpYWxfdW5saW5rX2lycV9jaGFpbihzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwKQogeworCS8qCisJICogeWVzLCBzb21lIGJyb2tlbiBnY2MgZW1pdCAid2FybmluZzogJ2knIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQiCisJICogYnV0IG5vLCB3ZSBhcmUgbm90IGdvaW5nIHRvIHRha2UgYSBwYXRjaCB0aGF0IGFzc2lnbnMgTlVMTCBiZWxvdy4KKwkgKi8KIAlzdHJ1Y3QgaXJxX2luZm8gKmk7CiAJc3RydWN0IGhsaXN0X25vZGUgKm47CiAJc3RydWN0IGhsaXN0X2hlYWQgKmg7CkBAIC0yODgyLDE0ICsyODg2LDEwIEBACiAKIAl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAocG9ydC0+c3lzcnEpIHsKLQkJLyogc2VyaWFsODI1MF9oYW5kbGVfaXJxKCkgYWxyZWFkeSB0b29rIHRoZSBsb2NrICovCi0JCWxvY2tlZCA9IDA7Ci0JfSBlbHNlIGlmIChvb3BzX2luX3Byb2dyZXNzKSB7Ci0JCWxvY2tlZCA9IHNwaW5fdHJ5bG9jaygmcG9ydC0+bG9jayk7Ci0JfSBlbHNlCi0JCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CisJaWYgKHBvcnQtPnN5c3JxIHx8IG9vcHNfaW5fcHJvZ3Jlc3MpCisJCWxvY2tlZCA9IHNwaW5fdHJ5bG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJZWxzZQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCiAJLyoKIAkgKglGaXJzdCBzYXZlIHRoZSBJRVIgdGhlbiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHRzCkBAIC0yOTIxLDggKzI5MjEsNyBAQAogCQlzZXJpYWw4MjUwX21vZGVtX3N0YXR1cyh1cCk7CiAKIAlpZiAobG9ja2VkKQotCQlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHNlcmlhbDgyNTBfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX3BjaS5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9wY2kuYwppbmRleCAwZmYzZTM2Li5iMTRiY2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX3BjaS5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfcGNpLmMKQEAgLTEzNjYsMjMgKzEzNjYsNDQgQEAKIAkJc3RydWN0IGt0ZXJtaW9zICpvbGQpCiB7CiAJdW5zaWduZWQgaW50IGJhdWQgPSB0dHlfdGVybWlvc19iYXVkX3JhdGUodGVybWlvcyk7Ci0JdW5zaWduZWQgaW50IG0gPSA2OTEyOwotCXVuc2lnbmVkIGludCBuID0gMTU2MjU7CisJdW5zaWduZWQgaW50IG0sIG47CiAJdTMyIHJlZzsKIAotCS8qIEZvciBiYXVkIHJhdGVzIDFNLCAyTSwgM00gYW5kIDRNIHRoZSBkaXZpZGVycyBtdXN0IGJlIGFkanVzdGVkLiAqLwotCWlmIChiYXVkID09IDEwMDAwMDAgfHwgYmF1ZCA9PSAyMDAwMDAwIHx8IGJhdWQgPT0gNDAwMDAwMCkgeworCS8qCisJICogRm9yIGJhdWQgcmF0ZXMgMC41TSwgMU0sIDEuNU0sIDJNLCAyLjVNLCAzTSwgMy41TSBhbmQgNE0gdGhlCisJICogZGl2aWRlcnMgbXVzdCBiZSBhZGp1c3RlZC4KKwkgKgorCSAqIHVhcnRjbGsgPSAobSAvIG4pICogMTAwIE1Ieiwgd2hlcmUgbSA8PSBuCisJICovCisJc3dpdGNoIChiYXVkKSB7CisJY2FzZSA1MDAwMDA6CisJY2FzZSAxMDAwMDAwOgorCWNhc2UgMjAwMDAwMDoKKwljYXNlIDQwMDAwMDA6CiAJCW0gPSA2NDsKIAkJbiA9IDEwMDsKLQogCQlwLT51YXJ0Y2xrID0gNjQwMDAwMDA7Ci0JfSBlbHNlIGlmIChiYXVkID09IDMwMDAwMDApIHsKKwkJYnJlYWs7CisJY2FzZSAzNTAwMDAwOgorCQltID0gNTY7CisJCW4gPSAxMDA7CisJCXAtPnVhcnRjbGsgPSA1NjAwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSAxNTAwMDAwOgorCWNhc2UgMzAwMDAwMDoKIAkJbSA9IDQ4OwogCQluID0gMTAwOwotCiAJCXAtPnVhcnRjbGsgPSA0ODAwMDAwMDsKLQl9IGVsc2UgewotCQlwLT51YXJ0Y2xrID0gNDQyMzY4MDA7CisJCWJyZWFrOworCWNhc2UgMjUwMDAwMDoKKwkJbSA9IDQwOworCQluID0gMTAwOworCQlwLT51YXJ0Y2xrID0gNDAwMDAwMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW0gPSAyMzA0OworCQluID0gMzEyNTsKKwkJcC0+dWFydGNsayA9IDczNzI4MDAwOwogCX0KIAogCS8qIFJlc2V0IHRoZSBjbG9jayAqLwpAQCAtMzQ0OSw2ICszNDcwLDEwIEBACiAJCS5iYXNlX2JhdWQJPSA5MjE2MDAsCiAJCS5yZWdfc2hpZnQgICAgICA9IDIsCiAJfSwKKwkvKgorCSAqIEludGVsIEJheVRyYWlsIEhTVUFSVCByZWZlcmVuY2UgY2xvY2sgaXMgNDQuMjM2OCBNSHogYXQgcG93ZXItb24sCisJICogYnV0IGlzIG92ZXJyaWRkZW4gYnkgYnl0X3NldF90ZXJtaW9zLgorCSAqLwogCVtwYm5fYnl0XSA9IHsKIAkJLmZsYWdzCQk9IEZMX0JBU0UwLAogCQkubnVtX3BvcnRzCT0gMSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9LY29uZmlnIGIvZHJpdmVycy90dHkvc2VyaWFsL0tjb25maWcKaW5kZXggYTM4MTVlYS4uMjU3N2Q2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL0tjb25maWcKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL0tjb25maWcKQEAgLTI4OSw3ICsyODksNyBAQAogCSAgTUFYMzEwMCBjaGlwIHN1cHBvcnQKIAogY29uZmlnIFNFUklBTF9NQVgzMTBYCi0JYm9vbCAiTUFYMzEwWCBzdXBwb3J0IgorCXRyaXN0YXRlICJNQVgzMTBYIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTUElfTUFTVEVSCiAJc2VsZWN0IFNFUklBTF9DT1JFCiAJc2VsZWN0IFJFR01BUF9TUEkgaWYgU1BJX01BU1RFUgpAQCAtNzA4LDcgKzcwOCw3IEBACiAKIGNvbmZpZyBTRVJJQUxfU0hfU0NJCiAJdHJpc3RhdGUgIlN1cGVySCBTQ0koRikgc2VyaWFsIHBvcnQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEhBVkVfQ0xLICYmIChTVVBFUkggfHwgQVJNIHx8IENPTVBJTEVfVEVTVCkKKwlkZXBlbmRzIG9uIFNVUEVSSCB8fCBBUkNIX1NITU9CSUxFIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBTRVJJQUxfQ09SRQogCiBjb25maWcgU0VSSUFMX1NIX1NDSV9OUl9VQVJUUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2FtYmEtcGwwMTEuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hbWJhLXBsMDExLmMKaW5kZXggZDU4NzgzZC4uZDRlZGEyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2FtYmEtcGwwMTEuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYW1iYS1wbDAxMS5jCkBAIC0yMTU0LDkgKzIxNTQsMTkgQEAKIAlhbWJhX3BvcnRzW2ldID0gdWFwOwogCiAJYW1iYV9zZXRfZHJ2ZGF0YShkZXYsIHVhcCk7CisKKwlpZiAoIWFtYmFfcmVnLnN0YXRlKSB7CisJCXJldCA9IHVhcnRfcmVnaXN0ZXJfZHJpdmVyKCZhbWJhX3JlZyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBBTUJBLVBMMDExIGRyaXZlclxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCiAJcmV0ID0gdWFydF9hZGRfb25lX3BvcnQoJmFtYmFfcmVnLCAmdWFwLT5wb3J0KTsKIAlpZiAocmV0KSB7CiAJCWFtYmFfcG9ydHNbaV0gPSBOVUxMOworCQl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZhbWJhX3JlZyk7CiAJCXBsMDExX2RtYV9yZW1vdmUodWFwKTsKIAl9CiAgb3V0OgpAQCAtMjE3NSw2ICsyMTg1LDcgQEAKIAkJCWFtYmFfcG9ydHNbaV0gPSBOVUxMOwogCiAJcGwwMTFfZG1hX3JlbW92ZSh1YXApOworCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJmFtYmFfcmVnKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjIzMCwyMiArMjI0MSwxNCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwbDAxMV9pbml0KHZvaWQpCiB7Ci0JaW50IHJldDsKIAlwcmludGsoS0VSTl9JTkZPICJTZXJpYWw6IEFNQkEgUEwwMTEgVUFSVCBkcml2ZXJcbiIpOwogCi0JcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJmFtYmFfcmVnKTsKLQlpZiAocmV0ID09IDApIHsKLQkJcmV0ID0gYW1iYV9kcml2ZXJfcmVnaXN0ZXIoJnBsMDExX2RyaXZlcik7Ci0JCWlmIChyZXQpCi0JCQl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZhbWJhX3JlZyk7Ci0JfQotCXJldHVybiByZXQ7CisJcmV0dXJuIGFtYmFfZHJpdmVyX3JlZ2lzdGVyKCZwbDAxMV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcGwwMTFfZXhpdCh2b2lkKQogewogCWFtYmFfZHJpdmVyX3VucmVnaXN0ZXIoJnBsMDExX2RyaXZlcik7Ci0JdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmYW1iYV9yZWcpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2F0bWVsX3NlcmlhbC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCmluZGV4IGE0OWYxMGQuLmIwNjAzZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hdG1lbF9zZXJpYWwuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKQEAgLTExNSw5ICsxMTUsNiBAQAogI2RlZmluZSBVQVJUX1BVVF9UQ1IocG9ydCx2KQlfX3Jhd193cml0ZWwodiwgKHBvcnQpLT5tZW1iYXNlICsgQVRNRUxfUERDX1RDUikKICNkZWZpbmUgVUFSVF9HRVRfVENSKHBvcnQpCV9fcmF3X3JlYWRsKChwb3J0KS0+bWVtYmFzZSArIEFUTUVMX1BEQ19UQ1IpCiAKLXN0YXRpYyBpbnQgKCphdG1lbF9vcGVuX2hvb2spKHN0cnVjdCB1YXJ0X3BvcnQgKik7Ci1zdGF0aWMgdm9pZCAoKmF0bWVsX2Nsb3NlX2hvb2spKHN0cnVjdCB1YXJ0X3BvcnQgKik7Ci0KIHN0cnVjdCBhdG1lbF9kbWFfYnVmZmVyIHsKIAl1bnNpZ25lZCBjaGFyCSpidWY7CiAJZG1hX2FkZHJfdAlkbWFfYWRkcjsKQEAgLTE1NTUsNyArMTU1Miw3IEBACiAJcmV0dmFsID0gcmVxdWVzdF9pcnEocG9ydC0+aXJxLCBhdG1lbF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJdHR5ID8gdHR5LT5uYW1lIDogImF0bWVsX3NlcmlhbCIsIHBvcnQpOwogCWlmIChyZXR2YWwpIHsKLQkJcHJpbnRrKCJhdG1lbF9zZXJpYWw6IGF0bWVsX3N0YXJ0dXAgLSBDYW4ndCBnZXQgaXJxXG4iKTsKKwkJZGV2X2Vycihwb3J0LT5kZXYsICJhdG1lbF9zdGFydHVwIC0gQ2FuJ3QgZ2V0IGlycVxuIik7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCkBAIC0xNTc1LDE3ICsxNTcyLDYgQEAKIAkJaWYgKHJldHZhbCA8IDApCiAJCQlhdG1lbF9zZXRfb3BzKHBvcnQpOwogCX0KLQkvKgotCSAqIElmIHRoZXJlIGlzIGEgc3BlY2lmaWMgIm9wZW4iIGZ1bmN0aW9uICh0byByZWdpc3RlcgotCSAqIGNvbnRyb2wgbGluZSBpbnRlcnJ1cHRzKQotCSAqLwotCWlmIChhdG1lbF9vcGVuX2hvb2spIHsKLQkJcmV0dmFsID0gYXRtZWxfb3Blbl9ob29rKHBvcnQpOwotCQlpZiAocmV0dmFsKSB7Ci0JCQlmcmVlX2lycShwb3J0LT5pcnEsIHBvcnQpOwotCQkJcmV0dXJuIHJldHZhbDsKLQkJfQotCX0KIAogCS8qIFNhdmUgY3VycmVudCBDU1IgZm9yIGNvbXBhcmlzb24gaW4gYXRtZWxfdGFza2xldF9mdW5jKCkgKi8KIAlhdG1lbF9wb3J0LT5pcnFfc3RhdHVzX3ByZXYgPSBVQVJUX0dFVF9DU1IocG9ydCk7CkBAIC0xNjg0LDEzICsxNjcwLDYgQEAKIAkgKiBGcmVlIHRoZSBpbnRlcnJ1cHQKIAkgKi8KIAlmcmVlX2lycShwb3J0LT5pcnEsIHBvcnQpOwotCi0JLyoKLQkgKiBJZiB0aGVyZSBpcyBhIHNwZWNpZmljICJjbG9zZSIgZnVuY3Rpb24gKHRvIHVucmVnaXN0ZXIKLQkgKiBjb250cm9sIGxpbmUgaW50ZXJydXB0cykKLQkgKi8KLQlpZiAoYXRtZWxfY2xvc2VfaG9vaykKLQkJYXRtZWxfY2xvc2VfaG9vayhwb3J0KTsKIH0KIAogLyoKQEAgLTE3MzgsNyArMTcxNyw3IEBACiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShhdG1lbF9wb3J0LT5jbGspOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgImF0bWVsX3NlcmlhbDogdW5rbm93biBwbSAlZFxuIiwgc3RhdGUpOworCQlkZXZfZXJyKHBvcnQtPmRldiwgImF0bWVsX3NlcmlhbDogdW5rbm93biBwbSAlZFxuIiwgc3RhdGUpOwogCX0KIH0KIApAQCAtMTg1MywxMyArMTgzMiwxMCBAQAogCW1vZGUgJj0gfkFUTUVMX1VTX1VTTU9ERTsKIAogCWlmIChhdG1lbF9wb3J0LT5yczQ4NS5mbGFncyAmIFNFUl9SUzQ4NV9FTkFCTEVEKSB7Ci0JCWRldl9kYmcocG9ydC0+ZGV2LCAiU2V0dGluZyBVQVJUIHRvIFJTNDg1XG4iKTsKIAkJaWYgKChhdG1lbF9wb3J0LT5yczQ4NS5kZWxheV9ydHNfYWZ0ZXJfc2VuZCkgPiAwKQogCQkJVUFSVF9QVVRfVFRHUihwb3J0LAogCQkJCQlhdG1lbF9wb3J0LT5yczQ4NS5kZWxheV9ydHNfYWZ0ZXJfc2VuZCk7CiAJCW1vZGUgfD0gQVRNRUxfVVNfVVNNT0RFX1JTNDg1OwotCX0gZWxzZSB7Ci0JCWRldl9kYmcocG9ydC0+ZGV2LCAiU2V0dGluZyBVQVJUIHRvIFJTMjMyXG4iKTsKIAl9CiAKIAkvKiBzZXQgdGhlIHBhcml0eSwgc3RvcCBiaXRzIGFuZCBkYXRhIHNpemUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9iY202M3h4X3VhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9iY202M3h4X3VhcnQuYwppbmRleCA3OGU4MmIwLi5hNDc0MjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvYmNtNjN4eF91YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2JjbTYzeHhfdWFydC5jCkBAIC0zMCw2ICszMCw4IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfYmNtNjN4eC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KIAogI2RlZmluZSBCQ002M1hYX05SX1VBUlRTCTIKIApAQCAtNTg4LDcgKzU5MCw3IEBACiB7CiAJdW5zaWduZWQgaW50IHNpemU7CiAKLQlzaXplID0gUlNFVF9VQVJUX1NJWkU7CisJc2l6ZSA9IFVBUlRfUkVHX1NJWkU7CiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocG9ydC0+bWFwYmFzZSwgc2l6ZSwgImJjbTYzeHgiKSkgewogCQlkZXZfZXJyKHBvcnQtPmRldiwgIk1lbW9yeSByZWdpb24gYnVzeVxuIik7CiAJCXJldHVybiAtRUJVU1k7CkBAIC02MDgsNyArNjEwLDcgQEAKICAqLwogc3RhdGljIHZvaWQgYmNtX3VhcnRfcmVsZWFzZV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHBvcnQtPm1hcGJhc2UsIFJTRVRfVUFSVF9TSVpFKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocG9ydC0+bWFwYmFzZSwgVUFSVF9SRUdfU0laRSk7CiAJaW91bm1hcChwb3J0LT5tZW1iYXNlKTsKIH0KIApAQCAtODA1LDYgKzgwNyw5IEBACiAJc3RydWN0IGNsayAqY2xrOwogCWludCByZXQ7CiAKKwlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCisJCXBkZXYtPmlkID0gb2ZfYWxpYXNfZ2V0X2lkKHBkZXYtPmRldi5vZl9ub2RlLCAidWFydCIpOworCiAJaWYgKHBkZXYtPmlkIDwgMCB8fCBwZGV2LT5pZCA+PSBCQ002M1hYX05SX1VBUlRTKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtODU2LDYgKzg2MSwxMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBiY202M3h4X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJicmNtLGJjbTYzNDUtdWFydCIgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBiY202M3h4X29mX21hdGNoKTsKKwogLyoKICAqIHBsYXRmb3JtIGRyaXZlciBzdHVmZgogICovCkBAIC04NjUsNiArODc2LDcgQEAKIAkuZHJpdmVyCT0gewogCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAkJLm5hbWUgID0gImJjbTYzeHhfdWFydCIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGJjbTYzeHhfb2ZfbWF0Y2gsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9jbHBzNzExeC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2NscHM3MTF4LmMKaW5kZXggYjBlYWNiOC4uNWU2ZmRiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2NscHM3MTF4LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2NscHM3MTF4LmMKQEAgLTM2OCwxMSArMzY4LDE2IEBACiBzdGF0aWMgdm9pZCB1YXJ0X2NscHM3MTF4X2NvbnNvbGVfcHV0Y2hhcihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgY2gpCiB7CiAJc3RydWN0IGNscHM3MTF4X3BvcnQgKnMgPSBkZXZfZ2V0X2RydmRhdGEocG9ydC0+ZGV2KTsKLQl1MzIgc3lzZmxnID0gMDsKIAotCWRvIHsKKwkvKiBXYWl0IGZvciBGSUZPIGlzIG5vdCBmdWxsICovCisJd2hpbGUgKDEpIHsKKwkJdTMyIHN5c2ZsZyA9IDA7CisKIAkJcmVnbWFwX3JlYWQocy0+c3lzY29uLCBTWVNGTEdfT0ZGU0VULCAmc3lzZmxnKTsKLQl9IHdoaWxlIChzeXNmbGcgJiBTWVNGTEdfVVRYRkYpOworCQlpZiAoIShzeXNmbGcgJiBTWVNGTEdfVVRYRkYpKQorCQkJYnJlYWs7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KIAogCXdyaXRldyhjaCwgcG9ydC0+bWVtYmFzZSArIFVBUlREUl9PRkZTRVQpOwogfQpAQCAtMzgyLDE0ICszODcsMTggQEAKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gY2xwczcxMXhfdWFydC5zdGF0ZVtjby0+aW5kZXhdLnVhcnRfcG9ydDsKIAlzdHJ1Y3QgY2xwczcxMXhfcG9ydCAqcyA9IGRldl9nZXRfZHJ2ZGF0YShwb3J0LT5kZXYpOwotCXUzMiBzeXNmbGcgPSAwOwogCiAJdWFydF9jb25zb2xlX3dyaXRlKHBvcnQsIGMsIG4sIHVhcnRfY2xwczcxMXhfY29uc29sZV9wdXRjaGFyKTsKIAogCS8qIFdhaXQgZm9yIHRyYW5zbWl0dGVyIHRvIGJlY29tZSBlbXB0eSAqLwotCWRvIHsKKwl3aGlsZSAoMSkgeworCQl1MzIgc3lzZmxnID0gMDsKKwogCQlyZWdtYXBfcmVhZChzLT5zeXNjb24sIFNZU0ZMR19PRkZTRVQsICZzeXNmbGcpOwotCX0gd2hpbGUgKHN5c2ZsZyAmIFNZU0ZMR19VQlVTWSk7CisJCWlmICghKHN5c2ZsZyAmIFNZU0ZMR19VQlVTWSkpCisJCQlicmVhazsKKwkJY29uZF9yZXNjaGVkKCk7CisJfQogfQogCiBzdGF0aWMgaW50IHVhcnRfY2xwczcxMXhfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvY3Jpc3YxMC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2NyaXN2MTAuYwppbmRleCA2OTBiZGVhLi5kNTY3YWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvY3Jpc3YxMC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9jcmlzdjEwLmMKQEAgLTI4Niw3ICsyODYsNiBAQAogI2VuZGlmCiAKIH0sICAvKiB0dHlTMCAqLwotI2lmbmRlZiBDT05GSUdfU1ZJTlRPX1NJTQogCXsgLmJhdWQgICAgICAgID0gREVGX0JBVUQsCiAJICAuaW9wb3J0ICAgICAgICA9ICh1bnNpZ25lZCBjaGFyICopUl9TRVJJQUwxX0NUUkwsCiAJICAuaXJxICAgICAgICAgPSAxVSA8PCAxNiwgLyogdXNlcyBETUEgOCBhbmQgOSAqLwpAQCAtNDQ3LDcgKzQ0Niw2IEBACiAJICAuZG1hX2luX2VuYWJsZWQgPSAwCiAjZW5kaWYKICB9ICAgLyogdHR5UzMgKi8KLSNlbmRpZgogfTsKIAogCkBAIC0xMDM1LDcgKzEwMzMsNiBAQAogc3RhdGljIGlubGluZSB2b2lkCiBlMTAwX2R0cihzdHJ1Y3QgZTEwMF9zZXJpYWwgKmluZm8sIGludCBzZXQpCiB7Ci0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAJdW5zaWduZWQgY2hhciBtYXNrID0gZTEwMF9tb2RlbV9waW5zW2luZm8tPmxpbmVdLmR0cl9tYXNrOwogCiAjaWZkZWYgU0VSSUFMX0RFQlVHX0lPCkBAIC0xMDYwLDcgKzEwNTcsNiBAQAogCSAgICAgICBpbmZvLT5saW5lLCAqZTEwMF9tb2RlbV9waW5zW2luZm8tPmxpbmVdLmR0cl9zaGFkb3csCiAJICAgICAgIEUxMDBfRFRSX0dFVChpbmZvKSk7CiAjZW5kaWYKLSNlbmRpZgogfQogCiAvKiBzZXQgPSAwIG1lYW5zIDMuM1Ygb24gdGhlIHBpbiwgYml0dmFsdWU6IDA9YWN0aXZlLCAxPWluYWN0aXZlCkBAIC0xMDY5LDcgKzEwNjUsNiBAQAogc3RhdGljIGlubGluZSB2b2lkCiBlMTAwX3J0cyhzdHJ1Y3QgZTEwMF9zZXJpYWwgKmluZm8sIGludCBzZXQpCiB7Ci0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJaW5mby0+cnhfY3RybCAmPSB+RTEwMF9SVFNfTUFTSzsKQEAgLTEwNzksNyArMTA3NCw2IEBACiAjaWZkZWYgU0VSSUFMX0RFQlVHX0lPCiAJcHJpbnRrKCJzZXIlaSBydHMgJWlcbiIsIGluZm8tPmxpbmUsIHNldCk7CiAjZW5kaWYKLSNlbmRpZgogfQogCiAKQEAgLTEwODcsNyArMTA4MSw2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIGUxMDBfcmlfb3V0KHN0cnVjdCBlMTAwX3NlcmlhbCAqaW5mbywgaW50IHNldCkKIHsKLSNpZm5kZWYgQ09ORklHX1NWSU5UT19TSU0KIAkvKiBSSSBpcyBhY3RpdmUgbG93ICovCiAJewogCQl1bnNpZ25lZCBjaGFyIG1hc2sgPSBlMTAwX21vZGVtX3BpbnNbaW5mby0+bGluZV0ucmlfbWFzazsKQEAgLTEwOTksMTIgKzEwOTIsMTAgQEAKIAkJKmUxMDBfbW9kZW1fcGluc1tpbmZvLT5saW5lXS5yaV9wb3J0ID0gKmUxMDBfbW9kZW1fcGluc1tpbmZvLT5saW5lXS5yaV9zaGFkb3c7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9Ci0jZW5kaWYKIH0KIHN0YXRpYyBpbmxpbmUgdm9pZAogZTEwMF9jZF9vdXQoc3RydWN0IGUxMDBfc2VyaWFsICppbmZvLCBpbnQgc2V0KQogewotI2lmbmRlZiBDT05GSUdfU1ZJTlRPX1NJTQogCS8qIENEIGlzIGFjdGl2ZSBsb3cgKi8KIAl7CiAJCXVuc2lnbmVkIGNoYXIgbWFzayA9IGUxMDBfbW9kZW1fcGluc1tpbmZvLT5saW5lXS5jZF9tYXNrOwpAQCAtMTExNiwyNyArMTEwNywyMiBAQAogCQkqZTEwMF9tb2RlbV9waW5zW2luZm8tPmxpbmVdLmNkX3BvcnQgPSAqZTEwMF9tb2RlbV9waW5zW2luZm8tPmxpbmVdLmNkX3NoYWRvdzsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KLSNlbmRpZgogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKIGUxMDBfZGlzYWJsZV9yeChzdHJ1Y3QgZTEwMF9zZXJpYWwgKmluZm8pCiB7Ci0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAJLyogZGlzYWJsZSB0aGUgcmVjZWl2ZXIgKi8KIAlpbmZvLT5pb3BvcnRbUkVHX1JFQ19DVFJMXSA9CiAJCShpbmZvLT5yeF9jdHJsICY9IH5JT19NQVNLKFJfU0VSSUFMMF9SRUNfQ1RSTCwgcmVjX2VuYWJsZSkpOwotI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogZTEwMF9lbmFibGVfcngoc3RydWN0IGUxMDBfc2VyaWFsICppbmZvKQogewotI2lmbmRlZiBDT05GSUdfU1ZJTlRPX1NJTQogCS8qIGVuYWJsZSB0aGUgcmVjZWl2ZXIgKi8KIAlpbmZvLT5pb3BvcnRbUkVHX1JFQ19DVFJMXSA9CiAJCShpbmZvLT5yeF9jdHJsIHw9IElPX01BU0soUl9TRVJJQUwwX1JFQ19DVFJMLCByZWNfZW5hYmxlKSk7Ci0jZW5kaWYKIH0KIAogLyogdGhlIHJ4IERNQSB1c2VzIGJvdGggdGhlIGRtYV9kZXNjciBhbmQgdGhlIGRtYV9lb3AgaW50ZXJydXB0cyAqLwpAQCAtMTU1NCwyNCArMTU0MCw2IEBACiAJdW5zaWduZWQgaW50IGMsIHNlbnRsOwogCXN0cnVjdCBldHJheF9kbWFfZGVzY3IgKmRlc2NyOwogCi0jaWZkZWYgQ09ORklHX1NWSU5UT19TSU0KLQkvKiBUaGlzIHdpbGwgb3V0cHV0IHRvbyBsaXR0bGUgaWYgdGFpbCBpcyBub3QgMCBhbHdheXMgc2luY2UKLQkgKiB3ZSBkb24ndCByZWxvb3AgdG8gc2VuZCB0aGUgb3RoZXIgcGFydC4gQW55d2F5IHRoaXMgU0hPVUxEIGJlIGEKLQkgKiBuby1vcCAtIHRyYW5zbWl0X2NoYXJzX2RtYSB3b3VsZCBuZXZlciByZWFsbHkgYmUgY2FsbGVkIGR1cmluZyBzaW0KLQkgKiBzaW5jZSByc193cml0ZSBkb2VzIG5vdCB3cml0ZSBpbnRvIHRoZSB4bWl0IGJ1ZmZlciB0aGVuLgotCSAqLwotCWlmIChpbmZvLT54bWl0LnRhaWwpCi0JCXByaW50aygiRXJyb3IgaW4gc2VyaWFsLmM6dHJhbnNtaXRfY2hhcnMtZG1hKCksIHRhaWwhPTBcbiIpOwotCWlmIChpbmZvLT54bWl0LmhlYWQgIT0gaW5mby0+eG1pdC50YWlsKSB7Ci0JCVNJTUNPVVQoaW5mby0+eG1pdC5idWYgKyBpbmZvLT54bWl0LnRhaWwsCi0JCQlDSVJDX0NOVChpbmZvLT54bWl0LmhlYWQsCi0JCQkJIGluZm8tPnhtaXQudGFpbCwKLQkJCQkgU0VSSUFMX1hNSVRfU0laRSkpOwotCQlpbmZvLT54bWl0LmhlYWQgPSBpbmZvLT54bWl0LnRhaWw7ICAvKiBtb3ZlIGJhY2sgaGVhZCAqLwotCQlpbmZvLT50cl9ydW5uaW5nID0gMDsKLQl9Ci0JcmV0dXJuOwotI2VuZGlmCiAJLyogYWNrbm93bGVkZ2UgYm90aCBkbWFfZGVzY3IgYW5kIGRtYV9lb3AgaXJxIGluIFJfRE1BX0NIeF9DTFJfSU5UUiAqLwogCSppbmZvLT5vY2xyaW50cmFkciA9CiAJCUlPX1NUQVRFKFJfRE1BX0NINl9DTFJfSU5UUiwgY2xyX2Rlc2NyLCBkbykgfApAQCAtMTg0MiwxMyArMTgxMCw2IEBACiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBjaGFyIHJzdGF0OwogCi0jaWZkZWYgQ09ORklHX1NWSU5UT19TSU0KLQkvKiBObyByZWNlaXZlIGluIHRoZSBzaW11bGF0b3IuICBXaWxsIHByb2JhYmx5IGJlIHdoZW4gdGhlIHJlc3Qgb2YKLQkgKiB0aGUgc2VyaWFsIGludGVyZmFjZSB3b3JrcywgYW5kIHRoaXMgcGllY2Ugd2lsbCBqdXN0IGJlIHJlbW92ZWQuCi0JICovCi0JcmV0dXJuOwotI2VuZGlmCi0KIAkvKiBBY2tub3dsZWRnZSBib3RoIGRtYV9kZXNjciBhbmQgZG1hX2VvcCBpcnEgaW4gUl9ETUFfQ0h4X0NMUl9JTlRSICovCiAJKmluZm8tPmljbHJpbnRyYWRyID0KIAkJSU9fU1RBVEUoUl9ETUFfQ0g2X0NMUl9JTlRSLCBjbHJfZGVzY3IsIGRvKSB8CkBAIC0xOTM0LDEyICsxODk1LDYgQEAKIHN0YXRpYyB2b2lkCiBzdGFydF9yZWNlaXZlKHN0cnVjdCBlMTAwX3NlcmlhbCAqaW5mbykKIHsKLSNpZmRlZiBDT05GSUdfU1ZJTlRPX1NJTQotCS8qIE5vIHJlY2VpdmUgaW4gdGhlIHNpbXVsYXRvci4gIFdpbGwgcHJvYmFibHkgYmUgd2hlbiB0aGUgcmVzdCBvZgotCSAqIHRoZSBzZXJpYWwgaW50ZXJmYWNlIHdvcmtzLCBhbmQgdGhpcyBwaWVjZSB3aWxsIGp1c3QgYmUgcmVtb3ZlZC4KLQkgKi8KLQlyZXR1cm47Ci0jZW5kaWYKIAlpZiAoaW5mby0+dXNlc19kbWFfaW4pIHsKIAkJLyogcmVzZXQgdGhlIGlucHV0IGRtYSBjaGFubmVsIHRvIGJlIHN1cmUgaXQgd29ya3MgKi8KIApAQCAtMTk3MiwxNyArMTkyNyw2IEBACiAJaW50IGk7CiAJaW50IGhhbmRsZWQgPSAwOwogCi0jaWZkZWYgQ09ORklHX1NWSU5UT19TSU0KLQkvKiBObyByZWNlaXZlIGluIHRoZSBzaW11bGF0b3IuICBXaWxsIHByb2JhYmx5IGJlIHdoZW4gdGhlIHJlc3Qgb2YKLQkgKiB0aGUgc2VyaWFsIGludGVyZmFjZSB3b3JrcywgYW5kIHRoaXMgcGllY2Ugd2lsbCBqdXN0IGJlIHJlbW92ZWQuCi0JICovCi0JewotCQljb25zdCBjaGFyICpzID0gIldoYXQ/IHRyX2ludGVycnVwdCBpbiBzaW11bGF0b3I/P1xuIjsKLQkJU0lNQ09VVChzLHN0cmxlbihzKSk7Ci0JfQotCXJldHVybiBJUlFfSEFORExFRDsKLSNlbmRpZgotCiAJLyogZmluZCBvdXQgdGhlIGxpbmUgdGhhdCBjYXVzZWQgdGhpcyBpcnEgYW5kIGdldCBpdCBmcm9tIHJzX3RhYmxlICovCiAKIAlpcmVnID0gKlJfSVJRX01BU0syX1JEOyAgLyogZ2V0IHRoZSBhY3RpdmUgaXJxIGJpdHMgZm9yIHRoZSBkbWEgY2hhbm5lbHMgKi8KQEAgLTIwMjEsMTcgKzE5NjUsNiBAQAogCWludCBpOwogCWludCBoYW5kbGVkID0gMDsKIAotI2lmZGVmIENPTkZJR19TVklOVE9fU0lNCi0JLyogTm8gcmVjZWl2ZSBpbiB0aGUgc2ltdWxhdG9yLiAgV2lsbCBwcm9iYWJseSBiZSB3aGVuIHRoZSByZXN0IG9mCi0JICogdGhlIHNlcmlhbCBpbnRlcmZhY2Ugd29ya3MsIGFuZCB0aGlzIHBpZWNlIHdpbGwganVzdCBiZSByZW1vdmVkLgotCSAqLwotCXsKLQkJY29uc3QgY2hhciAqcyA9ICJXaGF0PyByZWNfaW50ZXJydXB0IGluIHNpbXVsYXRvcj8/XG4iOwotCQlTSU1DT1VUKHMsc3RybGVuKHMpKTsKLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotI2VuZGlmCi0KIAkvKiBmaW5kIG91dCB0aGUgbGluZSB0aGF0IGNhdXNlZCB0aGlzIGlycSBhbmQgZ2V0IGl0IGZyb20gcnNfdGFibGUgKi8KIAogCWlyZWcgPSAqUl9JUlFfTUFTSzJfUkQ7ICAvKiBnZXQgdGhlIGFjdGl2ZSBpcnEgYml0cyBmb3IgdGhlIGRtYSBjaGFubmVscyAqLwpAQCAtMjE3MywxMCArMjEwNiw2IEBACiAJc3RydWN0IGUxMDBfc2VyaWFsICppbmZvOwogCWludCBpOwogCi0jaWZkZWYgQ09ORklHX1NWSU5UT19TSU0KLQlyZXR1cm47Ci0jZW5kaWYKLQogCWZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CiAJCWluZm8gPSByc190YWJsZSArIGk7CiAJCWlmIChpbmZvLT51c2VzX2RtYV9pbikKQEAgLTI3MjksMjUgKzI2NTgsNiBAQAogCXByaW50aygic3RhcnRpbmcgdXAgdHR5UyVkICh4bWl0X2J1ZiAweCVwKS4uLlxuIiwgaW5mby0+bGluZSwgaW5mby0+eG1pdC5idWYpOwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU1ZJTlRPX1NJTQotCS8qIEJpdHMgYW5kIHBpZWNlcyBjb2xsZWN0ZWQgZnJvbSBiZWxvdy4gIEJldHRlciB0byBoYXZlIHRoZW0KLQkgICBpbiBvbmUgaWZkZWY6ZWQgY2xhdXNlIHRoYW4gdG8gbWl4IGluIGEgbG90IG9mIGlmZGVmcywKLQkgICByaWdodD8gKi8KLQlpZiAoaW5mby0+cG9ydC50dHkpCi0JCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT5wb3J0LnR0eS0+ZmxhZ3MpOwotCi0JaW5mby0+eG1pdC5oZWFkID0gaW5mby0+eG1pdC50YWlsID0gMDsKLQlpbmZvLT5maXJzdF9yZWN2X2J1ZmZlciA9IGluZm8tPmxhc3RfcmVjdl9idWZmZXIgPSBOVUxMOwotCWluZm8tPnJlY3ZfY250ID0gaW5mby0+bWF4X3JlY3ZfY250ID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBTRVJJQUxfUkVDVl9ERVNDUklQVE9SUzsgaSsrKQotCQlpbmZvLT5yZWNfZGVzY3JbaV0uYnVmID0gTlVMTDsKLQotCS8qIE5vIHJlYWwgYWN0aW9uIGluIHRoZSBzaW11bGF0b3IsIGJ1dCBtYXkgc2V0IGluZm8gaW1wb3J0YW50Ci0JICAgdG8gaW9jdGwuICovCi0JY2hhbmdlX3NwZWVkKGluZm8pOwotI2Vsc2UKLQogCS8qCiAJICogQ2xlYXIgdGhlIEZJRk8gYnVmZmVycyBhbmQgZGlzYWJsZSB0aGVtCiAJICogKHRoZXkgd2lsbCBiZSByZWVuYWJsZWQgaW4gY2hhbmdlX3NwZWVkKCkpCkBAIC0yODM3LDggKzI3NDcsNiBAQAogCWUxMDBfcnRzKGluZm8sIDEpOwogCWUxMDBfZHRyKGluZm8sIDEpOwogCi0jZW5kaWYgLyogQ09ORklHX1NWSU5UT19TSU0gKi8KLQogCWluZm8tPnBvcnQuZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CiAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CkBAIC0yODU3LDcgKzI3NjUsNiBAQAogCXN0cnVjdCBldHJheF9yZWN2X2J1ZmZlciAqYnVmZmVyOwogCWludCBpOwogCi0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAJLyogc2h1dCBkb3duIHRoZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIgKi8KIAlERkxPVyhERUJVR19MT0coaW5mby0+bGluZSwgInNodXRkb3duICVpXG4iLCBpbmZvLT5saW5lKSk7CiAJZTEwMF9kaXNhYmxlX3J4KGluZm8pOwpAQCAtMjg4Miw4ICsyNzg5LDYgQEAKIAkJaW5mby0+dHJfcnVubmluZyA9IDA7CiAJfQogCi0jZW5kaWYgLyogQ09ORklHX1NWSU5UT19TSU0gKi8KLQogCWlmICghKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCiAJCXJldHVybjsKIApAQCAtMjk5NSwxNyArMjkwMCwxMiBAQAogCQkJSU9fU1RBVEUoUl9BTFRfU0VSX0JBVURSQVRFLCBzZXIwX3RyLCBub3JtYWwpOwogCQlyX2FsdF9zZXJfYmF1ZHJhdGVfc2hhZG93ICY9IH5tYXNrOwogCQlyX2FsdF9zZXJfYmF1ZHJhdGVfc2hhZG93IHw9IChhbHRfc291cmNlIDw8IChpbmZvLT5saW5lKjgpKTsKLSNpZm5kZWYgQ09ORklHX1NWSU5UT19TSU0KIAkJKlJfQUxUX1NFUl9CQVVEUkFURSA9IHJfYWx0X3Nlcl9iYXVkcmF0ZV9zaGFkb3c7Ci0jZW5kaWYgLyogQ09ORklHX1NWSU5UT19TSU0gKi8KIAogCQlpbmZvLT5iYXVkID0gY2ZsYWdfdG9fYmF1ZChjZmxhZyk7Ci0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAJCWluZm8tPmlvcG9ydFtSRUdfQkFVRF0gPSBjZmxhZ190b19ldHJheF9iYXVkKGNmbGFnKTsKLSNlbmRpZiAvKiBDT05GSUdfU1ZJTlRPX1NJTSAqLwogCX0KIAotI2lmbmRlZiBDT05GSUdfU1ZJTlRPX1NJTQogCS8qIHN0YXJ0IHdpdGggZGVmYXVsdCBzZXR0aW5ncyBhbmQgdGhlbiBmaWxsIGluIGNoYW5nZXMgKi8KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJLyogOCBiaXQsIG5vL2V2ZW4gcGFyaXR5ICovCkBAIC0zMDczLDcgKzI5NzMsNiBAQAogCiAJKigodW5zaWduZWQgbG9uZyAqKSZpbmZvLT5pb3BvcnRbUkVHX1hPRkZdKSA9IHhvZmY7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotI2VuZGlmIC8qICFDT05GSUdfU1ZJTlRPX1NJTSAqLwogCiAJdXBkYXRlX2NoYXJfdGltZShpbmZvKTsKIApAQCAtMzEyMiwxMSArMzAyMSw2IEBACiAJCSAgICAgICBjb3VudCwgaW5mby0+aW9wb3J0W1JFR19TVEFUVVNdKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NWSU5UT19TSU0KLQkvKiBSZWFsbHkgc2ltcGxlLiAgVGhlIG91dHB1dCBpcyBoZXJlIGFuZCBub3cuICovCi0JU0lNQ09VVChidWYsIGNvdW50KTsKLQlyZXR1cm4gY291bnQ7Ci0jZW5kaWYKIAlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKIAlERkxPVyhERUJVR19MT0coaW5mby0+bGluZSwgIndyaXRlIGNvdW50ICVpICIsIGNvdW50KSk7CiAJREZMT1coREVCVUdfTE9HKGluZm8tPmxpbmUsICJsZGlzYyAlaVxuIiwgdHR5LT5sZGlzYy5jaGFyc19pbl9idWZmZXIodHR5KSkpOwpAQCAtMzQ2Myw3ICszMzU3LDYgQEAKIGdldF9sc3JfaW5mbyhzdHJ1Y3QgZTEwMF9zZXJpYWwgKiBpbmZvLCB1bnNpZ25lZCBpbnQgKnZhbHVlKQogewogCXVuc2lnbmVkIGludCByZXN1bHQgPSBUSU9DU0VSX1RFTVQ7Ci0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAJdW5zaWduZWQgbG9uZyBjdXJyX3RpbWUgPSBqaWZmaWVzOwogCXVuc2lnbmVkIGxvbmcgY3Vycl90aW1lX3VzZWMgPSBHRVRfSklGRklFU19VU0VDKCk7CiAJdW5zaWduZWQgbG9uZyBlbGFwc2VkX3VzZWMgPQpAQCAtMzQ3NCw3ICszMzY3LDYgQEAKIAkgICAgZWxhcHNlZF91c2VjIDwgMippbmZvLT5jaGFyX3RpbWVfdXNlYykgewogCQlyZXN1bHQgPSAwOwogCX0KLSNlbmRpZgogCiAJaWYgKGNvcHlfdG9fdXNlcih2YWx1ZSwgJnJlc3VsdCwgc2l6ZW9mKGludCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTM4MDQsNyArMzY5Niw2IEBACiAJZTEwMF9kaXNhYmxlX3NlcmlhbF9kYXRhX2lycShpbmZvKTsKICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAJZTEwMF9kaXNhYmxlX3J4KGluZm8pOwogCWUxMDBfZGlzYWJsZV9yeF9pcnEoaW5mbyk7CiAKQEAgLTM4MTYsNyArMzcwNyw2IEBACiAJCSAqLwogCQlyc193YWl0X3VudGlsX3NlbnQodHR5LCBIWik7CiAJfQotI2VuZGlmCiAKIAlzaHV0ZG93bihpbmZvKTsKIAlyc19mbHVzaF9idWZmZXIodHR5KTsKQEAgLTQ0NzksNyArNDM2OSw2IEBACiAJZmFzdF90aW1lcl9pbml0KCk7CiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfU1ZJTlRPX1NJTQogI2lmbmRlZiBDT05GSUdfRVRSQVhfS0dEQgogCS8qIE5vdCBuZWVkZWQgaW4gc2ltdWxhdG9yLiAgTWF5IG9ubHkgY29tcGxpY2F0ZSBzdHVmZi4gKi8KIAkvKiBob29rIHRoZSBpcnEncyBmb3IgRE1BIGNoYW5uZWwgNiBhbmQgNywgc2VyaWFsIG91dHB1dCBhbmQgaW5wdXQsIGFuZCBzb21lIG1vcmUuLi4gKi8KQEAgLTQ0ODksNyArNDM3OCw2IEBACiAJCXBhbmljKCIlczogRmFpbGVkIHRvIHJlcXVlc3QgaXJxOCIsIF9fZnVuY19fKTsKIAogI2VuZGlmCi0jZW5kaWYgLyogQ09ORklHX1NWSU5UT19TSU0gKi8KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2VmbTMyLXVhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9lZm0zMi11YXJ0LmMKaW5kZXggMGViNWI1Ni4uMDI4NTgyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2VmbTMyLXVhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvZWZtMzItdWFydC5jCkBAIC02NzEsNyArNjcxLDEwIEBACiAJaWYgKCFucCkKIAkJcmV0dXJuIDE7CiAKLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImxvY2F0aW9uIiwgJmxvY2F0aW9uKTsKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImVmbTMyLGxvY2F0aW9uIiwgJmxvY2F0aW9uKTsKKwlpZiAocmV0KQorCQkvKiBmYWxsIGJhY2sgdG8gb2xkIGFuZCAod3JvbmdseSkgZ2VuZXJpYyBwcm9wZXJ0eSAibG9jYXRpb24iICovCisJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibG9jYXRpb24iLCAmbG9jYXRpb24pOwogCWlmICghcmV0KSB7CiAJCWlmIChsb2NhdGlvbiA+IDUpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgImludmFsaWQgbG9jYXRpb25cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2ZzbF9scHVhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9mc2xfbHB1YXJ0LmMKaW5kZXggODk3OGRjOWEuLmM1ZWI4OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9mc2xfbHB1YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2ZzbF9scHVhcnQuYwpAQCAtMTMsMTQgKzEzLDE5IEBACiAjZGVmaW5lIFNVUFBPUlRfU1lTUlEKICNlbmRpZgogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvZG1hcG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZG1hLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KIAogLyogQWxsIHJlZ2lzdGVycyBhcmUgOC1iaXQgd2lkdGggKi8KQEAgLTExMiw2ICsxMTcsMTAgQEAKICNkZWZpbmUgVUFSVFNGSUZPX1RYT0YJCTB4MDIKICNkZWZpbmUgVUFSVFNGSUZPX1JYVUYJCTB4MDEKIAorI2RlZmluZSBETUFfTUFYQlVSU1QJCTE2CisjZGVmaW5lIERNQV9NQVhCVVJTVF9NQVNLCShETUFfTUFYQlVSU1QgLSAxKQorI2RlZmluZSBGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUJNjQKKwogI2RlZmluZSBEUklWRVJfTkFNRQkiZnNsLWxwdWFydCIKICNkZWZpbmUgREVWX05BTUUJInR0eUxQIgogI2RlZmluZSBVQVJUX05SCQk2CkBAIC0xMjEsNiArMTMwLDI0IEBACiAJc3RydWN0IGNsawkJKmNsazsKIAl1bnNpZ25lZCBpbnQJCXR4Zmlmb19zaXplOwogCXVuc2lnbmVkIGludAkJcnhmaWZvX3NpemU7CisKKwlib29sCQkJbHB1YXJ0X2RtYV91c2U7CisJc3RydWN0IGRtYV9jaGFuCQkqZG1hX3R4X2NoYW47CisJc3RydWN0IGRtYV9jaGFuCQkqZG1hX3J4X2NoYW47CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICAqZG1hX3R4X2Rlc2M7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICAqZG1hX3J4X2Rlc2M7CisJZG1hX2FkZHJfdAkJZG1hX3R4X2J1Zl9idXM7CisJZG1hX2FkZHJfdAkJZG1hX3J4X2J1Zl9idXM7CisJZG1hX2Nvb2tpZV90CQlkbWFfdHhfY29va2llOworCWRtYV9jb29raWVfdAkJZG1hX3J4X2Nvb2tpZTsKKwl1bnNpZ25lZCBjaGFyCQkqZG1hX3R4X2J1Zl92aXJ0OworCXVuc2lnbmVkIGNoYXIJCSpkbWFfcnhfYnVmX3ZpcnQ7CisJdW5zaWduZWQgaW50CQlkbWFfdHhfYnl0ZXM7CisJdW5zaWduZWQgaW50CQlkbWFfcnhfYnl0ZXM7CisJaW50CQkJZG1hX3R4X2luX3Byb2dyZXNzOworCWludAkJCWRtYV9yeF9pbl9wcm9ncmVzczsKKwl1bnNpZ25lZCBpbnQJCWRtYV9yeF90aW1lb3V0OworCXN0cnVjdCB0aW1lcl9saXN0CWxwdWFydF90aW1lcjsKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGxwdWFydF9kdF9pZHNbXSA9IHsKQEAgLTEzMSw2ICsxNTgsMTAgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBscHVhcnRfZHRfaWRzKTsKIAorLyogRm9yd2FyZCBkZWNsYXJlIHRoaXMgZm9yIHRoZSBkbWEgY2FsbGJhY2tzKi8KK3N0YXRpYyB2b2lkIGxwdWFydF9kbWFfdHhfY29tcGxldGUodm9pZCAqYXJnKTsKK3N0YXRpYyB2b2lkIGxwdWFydF9kbWFfcnhfY29tcGxldGUodm9pZCAqYXJnKTsKKwogc3RhdGljIHZvaWQgbHB1YXJ0X3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAl1bnNpZ25lZCBjaGFyIHRlbXA7CkBAIC0xNTIsNiArMTgzLDIxMCBAQAogewogfQogCitzdGF0aWMgdm9pZCBscHVhcnRfY29weV9yeF90b190dHkoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCwKKwkJc3RydWN0IHR0eV9wb3J0ICp0dHksIGludCBjb3VudCkKK3sKKwlpbnQgY29waWVkOworCisJc3BvcnQtPnBvcnQuaWNvdW50LnJ4ICs9IGNvdW50OworCisJaWYgKCF0dHkpIHsKKwkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJObyB0dHkgcG9ydFxuIik7CisJCXJldHVybjsKKwl9CisKKwlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShzcG9ydC0+cG9ydC5kZXYsIHNwb3J0LT5kbWFfcnhfYnVmX2J1cywKKwkJCUZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwljb3BpZWQgPSB0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwKKwkJCSgodW5zaWduZWQgY2hhciAqKShzcG9ydC0+ZG1hX3J4X2J1Zl92aXJ0KSksIGNvdW50KTsKKworCWlmIChjb3BpZWQgIT0gY291bnQpIHsKKwkJV0FSTl9PTigxKTsKKwkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJSeERhdGEgY29weSB0byB0dHkgbGF5ZXIgZmFpbGVkXG4iKTsKKwl9CisKKwlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzcG9ydC0+cG9ydC5kZXYsIHNwb3J0LT5kbWFfcnhfYnVmX2J1cywKKwkJCUZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSwgRE1BX1RPX0RFVklDRSk7Cit9CisKK3N0YXRpYyB2b2lkIGxwdWFydF9waW9fdHgoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCkKK3sKKwlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoIXVhcnRfY2lyY19lbXB0eSh4bWl0KSAmJgorCQlyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVFRDRklGTykgPCBzcG9ydC0+dHhmaWZvX3NpemUpIHsKKwkJd3JpdGViKHhtaXQtPmJ1Zlt4bWl0LT50YWlsXSwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlREUik7CisJCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIDEpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7CisJCXNwb3J0LT5wb3J0Lmljb3VudC50eCsrOworCX0KKworCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh4bWl0KSA8IFdBS0VVUF9DSEFSUykKKwkJdWFydF93cml0ZV93YWtldXAoJnNwb3J0LT5wb3J0KTsKKworCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCisJCXdyaXRlYihyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSkgfCBVQVJUQ1I1X1RETUFTLAorCQkJc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGxwdWFydF9kbWFfdHgoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQ7CisJZG1hX2FkZHJfdCB0eF9idXNfYWRkcjsKKworCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNwb3J0LT5wb3J0LmRldiwgc3BvcnQtPmRtYV90eF9idWZfYnVzLAorCQkJCVVBUlRfWE1JVF9TSVpFLCBETUFfVE9fREVWSUNFKTsKKwlzcG9ydC0+ZG1hX3R4X2J5dGVzID0gY291bnQgJiB+KERNQV9NQVhCVVJTVF9NQVNLKTsKKwl0eF9idXNfYWRkciA9IHNwb3J0LT5kbWFfdHhfYnVmX2J1cyArIHhtaXQtPnRhaWw7CisJc3BvcnQtPmRtYV90eF9kZXNjID0gZG1hZW5naW5lX3ByZXBfc2xhdmVfc2luZ2xlKHNwb3J0LT5kbWFfdHhfY2hhbiwKKwkJCQkJdHhfYnVzX2FkZHIsIHNwb3J0LT5kbWFfdHhfYnl0ZXMsCisJCQkJCURNQV9NRU1fVE9fREVWLCBETUFfUFJFUF9JTlRFUlJVUFQpOworCisJaWYgKCFzcG9ydC0+ZG1hX3R4X2Rlc2MpIHsKKwkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJOb3QgYWJsZSB0byBnZXQgZGVzYyBmb3IgdHhcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzcG9ydC0+ZG1hX3R4X2Rlc2MtPmNhbGxiYWNrID0gbHB1YXJ0X2RtYV90eF9jb21wbGV0ZTsKKwlzcG9ydC0+ZG1hX3R4X2Rlc2MtPmNhbGxiYWNrX3BhcmFtID0gc3BvcnQ7CisJc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcyA9IDE7CisJc3BvcnQtPmRtYV90eF9jb29raWUgPSBkbWFlbmdpbmVfc3VibWl0KHNwb3J0LT5kbWFfdHhfZGVzYyk7CisJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoc3BvcnQtPmRtYV90eF9jaGFuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBscHVhcnRfcHJlcGFyZV90eChzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0KQoreworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZzcG9ydC0+cG9ydC5zdGF0ZS0+eG1pdDsKKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gIENJUkNfQ05UX1RPX0VORCh4bWl0LT5oZWFkLAorCQkJCQl4bWl0LT50YWlsLCBVQVJUX1hNSVRfU0laRSk7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm47CisKKwlpZiAoY291bnQgPCBETUFfTUFYQlVSU1QpCisJCXdyaXRlYihyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSkgJiB+VUFSVENSNV9URE1BUywKKwkJCQlzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7CisJZWxzZSB7CisJCXdyaXRlYihyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSkgfCBVQVJUQ1I1X1RETUFTLAorCQkJCXNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KTsKKwkJbHB1YXJ0X2RtYV90eChzcG9ydCwgY291bnQpOworCX0KK30KKworc3RhdGljIHZvaWQgbHB1YXJ0X2RtYV90eF9jb21wbGV0ZSh2b2lkICphcmcpCit7CisJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGFyZzsKKwlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWFzeW5jX3R4X2FjayhzcG9ydC0+ZG1hX3R4X2Rlc2MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKKworCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIHNwb3J0LT5kbWFfdHhfYnl0ZXMpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7CisJc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcyA9IDA7CisKKwlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBXQUtFVVBfQ0hBUlMpCisJCXVhcnRfd3JpdGVfd2FrZXVwKCZzcG9ydC0+cG9ydCk7CisKKwlscHVhcnRfcHJlcGFyZV90eChzcG9ydCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbHB1YXJ0X2RtYV9yeChzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0KQoreworCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNwb3J0LT5wb3J0LmRldiwgc3BvcnQtPmRtYV9yeF9idWZfYnVzLAorCQkJRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFLCBETUFfVE9fREVWSUNFKTsKKwlzcG9ydC0+ZG1hX3J4X2Rlc2MgPSBkbWFlbmdpbmVfcHJlcF9zbGF2ZV9zaW5nbGUoc3BvcnQtPmRtYV9yeF9jaGFuLAorCQkJc3BvcnQtPmRtYV9yeF9idWZfYnVzLCBGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUsCisJCQlETUFfREVWX1RPX01FTSwgRE1BX1BSRVBfSU5URVJSVVBUKTsKKworCWlmICghc3BvcnQtPmRtYV9yeF9kZXNjKSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiTm90IGFibGUgdG8gZ2V0IGRlc2MgZm9yIHJ4XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc3BvcnQtPmRtYV9yeF9kZXNjLT5jYWxsYmFjayA9IGxwdWFydF9kbWFfcnhfY29tcGxldGU7CisJc3BvcnQtPmRtYV9yeF9kZXNjLT5jYWxsYmFja19wYXJhbSA9IHNwb3J0OworCXNwb3J0LT5kbWFfcnhfaW5fcHJvZ3Jlc3MgPSAxOworCXNwb3J0LT5kbWFfcnhfY29va2llID0gZG1hZW5naW5lX3N1Ym1pdChzcG9ydC0+ZG1hX3J4X2Rlc2MpOworCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKHNwb3J0LT5kbWFfcnhfY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbHB1YXJ0X2RtYV9yeF9jb21wbGV0ZSh2b2lkICphcmcpCit7CisJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGFyZzsKKwlzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnBvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWFzeW5jX3R4X2FjayhzcG9ydC0+ZG1hX3J4X2Rlc2MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKKworCXNwb3J0LT5kbWFfcnhfaW5fcHJvZ3Jlc3MgPSAwOworCWxwdWFydF9jb3B5X3J4X3RvX3R0eShzcG9ydCwgcG9ydCwgRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFKTsKKwl0dHlfZmxpcF9idWZmZXJfcHVzaChwb3J0KTsKKwlscHVhcnRfZG1hX3J4KHNwb3J0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbHB1YXJ0X3RpbWVyX2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSAoc3RydWN0IGxwdWFydF9wb3J0ICopZGF0YTsKKwlzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnBvcnQ7CisJc3RydWN0IGRtYV90eF9zdGF0ZSBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgdGVtcDsKKwlpbnQgY291bnQ7CisKKwlkZWxfdGltZXIoJnNwb3J0LT5scHVhcnRfdGltZXIpOworCWRtYWVuZ2luZV9wYXVzZShzcG9ydC0+ZG1hX3J4X2NoYW4pOworCWRtYWVuZ2luZV90eF9zdGF0dXMoc3BvcnQtPmRtYV9yeF9jaGFuLCBzcG9ydC0+ZG1hX3J4X2Nvb2tpZSwgJnN0YXRlKTsKKwlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChzcG9ydC0+ZG1hX3J4X2NoYW4pOworCWNvdW50ID0gRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFIC0gc3RhdGUucmVzaWR1ZTsKKwlhc3luY190eF9hY2soc3BvcnQtPmRtYV9yeF9kZXNjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CisKKwlzcG9ydC0+ZG1hX3J4X2luX3Byb2dyZXNzID0gMDsKKwlscHVhcnRfY29weV9yeF90b190dHkoc3BvcnQsIHBvcnQsIGNvdW50KTsKKwl0dHlfZmxpcF9idWZmZXJfcHVzaChwb3J0KTsKKwl0ZW1wID0gcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpOworCXdyaXRlYih0ZW1wICYgflVBUlRDUjVfUkRNQVMsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxwdWFydF9wcmVwYXJlX3J4KHN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIHRlbXA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOworCisJaW5pdF90aW1lcigmc3BvcnQtPmxwdWFydF90aW1lcik7CisJc3BvcnQtPmxwdWFydF90aW1lci5mdW5jdGlvbiA9IGxwdWFydF90aW1lcl9mdW5jOworCXNwb3J0LT5scHVhcnRfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNwb3J0OworCXNwb3J0LT5scHVhcnRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBzcG9ydC0+ZG1hX3J4X3RpbWVvdXQ7CisJYWRkX3RpbWVyKCZzcG9ydC0+bHB1YXJ0X3RpbWVyKTsKKworCWxwdWFydF9kbWFfcngoc3BvcnQpOworCXRlbXAgPSByZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7CisJd3JpdGViKHRlbXAgfCBVQVJUQ1I1X1JETUFTLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBscHVhcnRfdHJhbnNtaXRfYnVmZmVyKHN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQpCiB7CiAJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnNwb3J0LT5wb3J0LnN0YXRlLT54bWl0OwpAQCAtMTcyLDE0ICs0MDcsMjEgQEAKIAogc3RhdGljIHZvaWQgbHB1YXJ0X3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgbHB1YXJ0X3BvcnQsIHBvcnQpOworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKKwkJCXN0cnVjdCBscHVhcnRfcG9ydCwgcG9ydCk7CisJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnNwb3J0LT5wb3J0LnN0YXRlLT54bWl0OwogCXVuc2lnbmVkIGNoYXIgdGVtcDsKIAogCXRlbXAgPSByZWFkYihwb3J0LT5tZW1iYXNlICsgVUFSVENSMik7CiAJd3JpdGViKHRlbXAgfCBVQVJUQ1IyX1RJRSwgcG9ydC0+bWVtYmFzZSArIFVBUlRDUjIpOwogCi0JaWYgKHJlYWRiKHBvcnQtPm1lbWJhc2UgKyBVQVJUU1IxKSAmIFVBUlRTUjFfVERSRSkKLQkJbHB1YXJ0X3RyYW5zbWl0X2J1ZmZlcihzcG9ydCk7CisJaWYgKHNwb3J0LT5scHVhcnRfZG1hX3VzZSkgeworCQlpZiAoIXVhcnRfY2lyY19lbXB0eSh4bWl0KSAmJiAhc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcykKKwkJCWxwdWFydF9wcmVwYXJlX3R4KHNwb3J0KTsKKwl9IGVsc2UgeworCQlpZiAocmVhZGIocG9ydC0+bWVtYmFzZSArIFVBUlRTUjEpICYgVUFSVFNSMV9URFJFKQorCQkJbHB1YXJ0X3RyYW5zbWl0X2J1ZmZlcihzcG9ydCk7CisJfQogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgbHB1YXJ0X3R4aW50KGludCBpcnEsIHZvaWQgKmRldl9pZCkKQEAgLTI3OSwxMiArNTIxLDE5IEBACiAKIAlzdHMgPSByZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVFNSMSk7CiAKLQlpZiAoc3RzICYgVUFSVFNSMV9SRFJGKQotCQlscHVhcnRfcnhpbnQoaXJxLCBkZXZfaWQpOwotCisJaWYgKHN0cyAmIFVBUlRTUjFfUkRSRikgeworCQlpZiAoc3BvcnQtPmxwdWFydF9kbWFfdXNlKQorCQkJbHB1YXJ0X3ByZXBhcmVfcngoc3BvcnQpOworCQllbHNlCisJCQlscHVhcnRfcnhpbnQoaXJxLCBkZXZfaWQpOworCX0KIAlpZiAoc3RzICYgVUFSVFNSMV9URFJFICYmCi0JCSEocmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpICYgVUFSVENSNV9URE1BUykpCi0JCWxwdWFydF90eGludChpcnEsIGRldl9pZCk7CisJCSEocmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpICYgVUFSVENSNV9URE1BUykpIHsKKwkJaWYgKHNwb3J0LT5scHVhcnRfZG1hX3VzZSkKKwkJCWxwdWFydF9waW9fdHgoc3BvcnQpOworCQllbHNlCisJCQlscHVhcnRfdHhpbnQoaXJxLCBkZXZfaWQpOworCX0KIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTM2NiwxMyArNjE1LDE1NiBAQAogCXdyaXRlYihVQVJUQ0ZJRk9fVFhGTFVTSCB8IFVBUlRDRklGT19SWEZMVVNILAogCQkJc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDRklGTyk7CiAKLQl3cml0ZWIoMiwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRUV0ZJRk8pOworCXdyaXRlYigwLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVFRXRklGTyk7CiAJd3JpdGViKDEsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUUldGSUZPKTsKIAogCS8qIFJlc3RvcmUgY3IyICovCiAJd3JpdGViKGNyMl9zYXZlZCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjIpOwogfQogCitzdGF0aWMgaW50IGxwdWFydF9kbWFfdHhfcmVxdWVzdChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKKwkJCQkJc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKnR4X2NoYW47CisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgZG1hX3R4X3Njb25maWc7CisJZG1hX2FkZHJfdCBkbWFfYnVzOworCXVuc2lnbmVkIGNoYXIgKmRtYV9idWY7CisJaW50IHJldDsKKworCXR4X2NoYW4gID0gZG1hX3JlcXVlc3Rfc2xhdmVfY2hhbm5lbChzcG9ydC0+cG9ydC5kZXYsICJ0eCIpOworCisJaWYgKCF0eF9jaGFuKSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiRG1hIHR4IGNoYW5uZWwgcmVxdWVzdCBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZG1hX2J1cyA9IGRtYV9tYXBfc2luZ2xlKHR4X2NoYW4tPmRldmljZS0+ZGV2LAorCQkJCXNwb3J0LT5wb3J0LnN0YXRlLT54bWl0LmJ1ZiwKKwkJCQlVQVJUX1hNSVRfU0laRSwgRE1BX1RPX0RFVklDRSk7CisKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IodHhfY2hhbi0+ZGV2aWNlLT5kZXYsIGRtYV9idXMpKSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiZG1hX21hcF9zaW5nbGUgdHggZmFpbGVkXG4iKTsKKwkJZG1hX3JlbGVhc2VfY2hhbm5lbCh0eF9jaGFuKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZG1hX2J1ZiA9IHNwb3J0LT5wb3J0LnN0YXRlLT54bWl0LmJ1ZjsKKwlkbWFfdHhfc2NvbmZpZy5kc3RfYWRkciA9IHNwb3J0LT5wb3J0Lm1hcGJhc2UgKyBVQVJURFI7CisJZG1hX3R4X3Njb25maWcuZHN0X2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFOworCWRtYV90eF9zY29uZmlnLmRzdF9tYXhidXJzdCA9IERNQV9NQVhCVVJTVDsKKwlkbWFfdHhfc2NvbmZpZy5kaXJlY3Rpb24gPSBETUFfTUVNX1RPX0RFVjsKKwlyZXQgPSBkbWFlbmdpbmVfc2xhdmVfY29uZmlnKHR4X2NoYW4sICZkbWFfdHhfc2NvbmZpZyk7CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwKKwkJCQkiRG1hIHNsYXZlIGNvbmZpZyBmYWlsZWQsIGVyciA9ICVkXG4iLCByZXQpOworCQlkbWFfcmVsZWFzZV9jaGFubmVsKHR4X2NoYW4pOworCQlyZXR1cm4gcmV0OworCX0KKworCXNwb3J0LT5kbWFfdHhfY2hhbiA9IHR4X2NoYW47CisJc3BvcnQtPmRtYV90eF9idWZfdmlydCA9IGRtYV9idWY7CisJc3BvcnQtPmRtYV90eF9idWZfYnVzID0gZG1hX2J1czsKKwlzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxwdWFydF9kbWFfcnhfcmVxdWVzdChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKKwkJCQkJc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKnJ4X2NoYW47CisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgZG1hX3J4X3Njb25maWc7CisJZG1hX2FkZHJfdCBkbWFfYnVzOworCXVuc2lnbmVkIGNoYXIgKmRtYV9idWY7CisJaW50IHJldDsKKworCXJ4X2NoYW4gID0gZG1hX3JlcXVlc3Rfc2xhdmVfY2hhbm5lbChzcG9ydC0+cG9ydC5kZXYsICJyeCIpOworCisJaWYgKCFyeF9jaGFuKSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiRG1hIHJ4IGNoYW5uZWwgcmVxdWVzdCBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZG1hX2J1ZiA9IGRldm1fa3phbGxvYyhzcG9ydC0+cG9ydC5kZXYsCisJCQkJRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKKworCWlmICghZG1hX2J1ZikgeworCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgIkRtYSByeCBhbGxvYyBmYWlsZWRcbiIpOworCQlkbWFfcmVsZWFzZV9jaGFubmVsKHJ4X2NoYW4pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkbWFfYnVzID0gZG1hX21hcF9zaW5nbGUocnhfY2hhbi0+ZGV2aWNlLT5kZXYsIGRtYV9idWYsCisJCQkJRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHJ4X2NoYW4tPmRldmljZS0+ZGV2LCBkbWFfYnVzKSkgeworCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgImRtYV9tYXBfc2luZ2xlIHJ4IGZhaWxlZFxuIik7CisJCWRtYV9yZWxlYXNlX2NoYW5uZWwocnhfY2hhbik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRtYV9yeF9zY29uZmlnLnNyY19hZGRyID0gc3BvcnQtPnBvcnQubWFwYmFzZSArIFVBUlREUjsKKwlkbWFfcnhfc2NvbmZpZy5zcmNfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU7CisJZG1hX3J4X3Njb25maWcuc3JjX21heGJ1cnN0ID0gMTsKKwlkbWFfcnhfc2NvbmZpZy5kaXJlY3Rpb24gPSBETUFfREVWX1RPX01FTTsKKwlyZXQgPSBkbWFlbmdpbmVfc2xhdmVfY29uZmlnKHJ4X2NoYW4sICZkbWFfcnhfc2NvbmZpZyk7CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwKKwkJCQkiRG1hIHNsYXZlIGNvbmZpZyBmYWlsZWQsIGVyciA9ICVkXG4iLCByZXQpOworCQlkbWFfcmVsZWFzZV9jaGFubmVsKHJ4X2NoYW4pOworCQlyZXR1cm4gcmV0OworCX0KKworCXNwb3J0LT5kbWFfcnhfY2hhbiA9IHJ4X2NoYW47CisJc3BvcnQtPmRtYV9yeF9idWZfdmlydCA9IGRtYV9idWY7CisJc3BvcnQtPmRtYV9yeF9idWZfYnVzID0gZG1hX2J1czsKKwlzcG9ydC0+ZG1hX3J4X2luX3Byb2dyZXNzID0gMDsKKworCXNwb3J0LT5kbWFfcnhfdGltZW91dCA9IChzcG9ydC0+cG9ydC50aW1lb3V0IC0gSFogLyA1MCkgKgorCQkJCUZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSAqIDMgLworCQkJCXNwb3J0LT5yeGZpZm9fc2l6ZSAvIDI7CisKKwlpZiAoc3BvcnQtPmRtYV9yeF90aW1lb3V0IDwgbXNlY3NfdG9famlmZmllcygyMCkpCisJCXNwb3J0LT5kbWFfcnhfdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoMjApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxwdWFydF9kbWFfdHhfZnJlZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKKwkJCQkJc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmRtYV9jaGFuOworCisJZG1hX3VubWFwX3NpbmdsZShzcG9ydC0+cG9ydC5kZXYsIHNwb3J0LT5kbWFfdHhfYnVmX2J1cywKKwkJCVVBUlRfWE1JVF9TSVpFLCBETUFfVE9fREVWSUNFKTsKKwlkbWFfY2hhbiA9IHNwb3J0LT5kbWFfdHhfY2hhbjsKKwlzcG9ydC0+ZG1hX3R4X2NoYW4gPSBOVUxMOworCXNwb3J0LT5kbWFfdHhfYnVmX2J1cyA9IDA7CisJc3BvcnQtPmRtYV90eF9idWZfdmlydCA9IE5VTEw7CisJZG1hX3JlbGVhc2VfY2hhbm5lbChkbWFfY2hhbik7Cit9CisKK3N0YXRpYyB2b2lkIGxwdWFydF9kbWFfcnhfZnJlZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKKwkJCQkJc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmRtYV9jaGFuOworCisJZG1hX3VubWFwX3NpbmdsZShzcG9ydC0+cG9ydC5kZXYsIHNwb3J0LT5kbWFfcnhfYnVmX2J1cywKKwkJCUZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKworCWRtYV9jaGFuID0gc3BvcnQtPmRtYV9yeF9jaGFuOworCXNwb3J0LT5kbWFfcnhfY2hhbiA9IE5VTEw7CisJc3BvcnQtPmRtYV9yeF9idWZfYnVzID0gMDsKKwlzcG9ydC0+ZG1hX3J4X2J1Zl92aXJ0ID0gTlVMTDsKKwlkbWFfcmVsZWFzZV9jaGFubmVsKGRtYV9jaGFuKTsKK30KKwogc3RhdGljIGludCBscHVhcnRfc3RhcnR1cChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKQEAgLTM4MCw2ICs3NzIsMTUgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGNoYXIgdGVtcDsKIAorCS8qd2hldGhlciB1c2UgZG1hIHN1cHBvcnQgYnkgZG1hIHJlcXVlc3QgcmVzdWx0cyovCisJaWYgKGxwdWFydF9kbWFfdHhfcmVxdWVzdChwb3J0KSB8fCBscHVhcnRfZG1hX3J4X3JlcXVlc3QocG9ydCkpIHsKKwkJc3BvcnQtPmxwdWFydF9kbWFfdXNlID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJc3BvcnQtPmxwdWFydF9kbWFfdXNlID0gdHJ1ZTsKKwkJdGVtcCA9IHJlYWRiKHBvcnQtPm1lbWJhc2UgKyBVQVJUQ1I1KTsKKwkJd3JpdGViKHRlbXAgfCBVQVJUQ1I1X1RETUFTLCBwb3J0LT5tZW1iYXNlICsgVUFSVENSNSk7CisJfQorCiAJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShwb3J0LT5kZXYsIHBvcnQtPmlycSwgbHB1YXJ0X2ludCwgMCwKIAkJCQlEUklWRVJfTkFNRSwgc3BvcnQpOwogCWlmIChyZXQpCkBAIC00MTQsNiArODE1LDExIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCiAJZGV2bV9mcmVlX2lycShwb3J0LT5kZXYsIHBvcnQtPmlycSwgc3BvcnQpOworCisJaWYgKHNwb3J0LT5scHVhcnRfZG1hX3VzZSkgeworCQlscHVhcnRfZG1hX3R4X2ZyZWUocG9ydCk7CisJCWxwdWFydF9kbWFfcnhfZnJlZShwb3J0KTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvaW14LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvaW14LmMKaW5kZXggZDc5OTE0MC4uM2I2YzFhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2lteC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9pbXguYwpAQCAtNDk2LDggKzQ5Niw3IEBACiAKIAlkZXZfZGJnKHNwb3J0LT5wb3J0LmRldiwgIndlIGZpbmlzaCB0aGUgVFggRE1BLlxuIik7CiAKLQlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBXQUtFVVBfQ0hBUlMpCi0JCXVhcnRfd3JpdGVfd2FrZXVwKCZzcG9ydC0+cG9ydCk7CisJdWFydF93cml0ZV93YWtldXAoJnNwb3J0LT5wb3J0KTsKIAogCWlmICh3YWl0cXVldWVfYWN0aXZlKCZzcG9ydC0+ZG1hX3dhaXQpKSB7CiAJCXdha2VfdXAoJnNwb3J0LT5kbWFfd2FpdCk7CkBAIC0xMTE3LDI1ICsxMTE2LDI1IEBACiAJICovCiAJaWYgKHNwb3J0LT50eGlycSA+IDApIHsKIAkJcmV0dmFsID0gcmVxdWVzdF9pcnEoc3BvcnQtPnJ4aXJxLCBpbXhfcnhpbnQsIDAsCi0JCQkJRFJJVkVSX05BTUUsIHNwb3J0KTsKKwkJCQkgICAgIGRldl9uYW1lKHBvcnQtPmRldiksIHNwb3J0KTsKIAkJaWYgKHJldHZhbCkKIAkJCWdvdG8gZXJyb3Jfb3V0MTsKIAogCQlyZXR2YWwgPSByZXF1ZXN0X2lycShzcG9ydC0+dHhpcnEsIGlteF90eGludCwgMCwKLQkJCQlEUklWRVJfTkFNRSwgc3BvcnQpOworCQkJCSAgICAgZGV2X25hbWUocG9ydC0+ZGV2KSwgc3BvcnQpOwogCQlpZiAocmV0dmFsKQogCQkJZ290byBlcnJvcl9vdXQyOwogCiAJCS8qIGRvIG5vdCB1c2UgUlRTIElSUSBvbiBJckRBICovCiAJCWlmICghVVNFX0lSREEoc3BvcnQpKSB7CiAJCQlyZXR2YWwgPSByZXF1ZXN0X2lycShzcG9ydC0+cnRzaXJxLCBpbXhfcnRzaW50LCAwLAotCQkJCQlEUklWRVJfTkFNRSwgc3BvcnQpOworCQkJCQkgICAgIGRldl9uYW1lKHBvcnQtPmRldiksIHNwb3J0KTsKIAkJCWlmIChyZXR2YWwpCiAJCQkJZ290byBlcnJvcl9vdXQzOwogCQl9CiAJfSBlbHNlIHsKIAkJcmV0dmFsID0gcmVxdWVzdF9pcnEoc3BvcnQtPnBvcnQuaXJxLCBpbXhfaW50LCAwLAotCQkJCURSSVZFUl9OQU1FLCBzcG9ydCk7CisJCQkJICAgICBkZXZfbmFtZShwb3J0LT5kZXYpLCBzcG9ydCk7CiAJCWlmIChyZXR2YWwpIHsKIAkJCWZyZWVfaXJxKHNwb3J0LT5wb3J0LmlycSwgc3BvcnQpOwogCQkJZ290byBlcnJvcl9vdXQxOwpAQCAtMTQ3MCw0NCArMTQ2OSwxMyBAQAogfQogCiAvKgotICogUmVsZWFzZSB0aGUgbWVtb3J5IHJlZ2lvbihzKSBiZWluZyB1c2VkIGJ5ICdwb3J0Jy4KLSAqLwotc3RhdGljIHZvaWQgaW14X3JlbGVhc2VfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UocG9ydC0+ZGV2KTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKm1tcmVzOwotCi0JbW1yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihtbXJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUobW1yZXMpKTsKLX0KLQotLyoKLSAqIFJlcXVlc3QgdGhlIG1lbW9yeSByZWdpb24ocykgYmVpbmcgdXNlZCBieSAncG9ydCcuCi0gKi8KLXN0YXRpYyBpbnQgaW14X3JlcXVlc3RfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UocG9ydC0+ZGV2KTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKm1tcmVzOwotCXZvaWQgKnJldDsKLQotCW1tcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIW1tcmVzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJldCA9IHJlcXVlc3RfbWVtX3JlZ2lvbihtbXJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUobW1yZXMpLCAiaW14LXVhcnQiKTsKLQotCXJldHVybiAgcmV0ID8gMCA6IC1FQlVTWTsKLX0KLQotLyoKICAqIENvbmZpZ3VyZS9hdXRvY29uZmlndXJlIHRoZSBwb3J0LgogICovCiBzdGF0aWMgdm9pZCBpbXhfY29uZmlnX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGZsYWdzKQogewogCXN0cnVjdCBpbXhfcG9ydCAqc3BvcnQgPSAoc3RydWN0IGlteF9wb3J0ICopcG9ydDsKIAotCWlmIChmbGFncyAmIFVBUlRfQ09ORklHX1RZUEUgJiYKLQkgICAgaW14X3JlcXVlc3RfcG9ydCgmc3BvcnQtPnBvcnQpID09IDApCisJaWYgKGZsYWdzICYgVUFSVF9DT05GSUdfVFlQRSkKIAkJc3BvcnQtPnBvcnQudHlwZSA9IFBPUlRfSU1YOwogfQogCkBAIC0xNjE3LDggKzE1ODUsNiBAQAogCS5mbHVzaF9idWZmZXIJPSBpbXhfZmx1c2hfYnVmZmVyLAogCS5zZXRfdGVybWlvcwk9IGlteF9zZXRfdGVybWlvcywKIAkudHlwZQkJPSBpbXhfdHlwZSwKLQkucmVsZWFzZV9wb3J0CT0gaW14X3JlbGVhc2VfcG9ydCwKLQkucmVxdWVzdF9wb3J0CT0gaW14X3JlcXVlc3RfcG9ydCwKIAkuY29uZmlnX3BvcnQJPSBpbXhfY29uZmlnX3BvcnQsCiAJLnZlcmlmeV9wb3J0CT0gaW14X3ZlcmlmeV9wb3J0LAogI2lmIGRlZmluZWQoQ09ORklHX0NPTlNPTEVfUE9MTCkKQEAgLTE5MzUsNyArMTkwMSw2IEBACiBzdGF0aWMgaW50IHNlcmlhbF9pbXhfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0OwotCXN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCXZvaWQgX19pb21lbSAqYmFzZTsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKQEAgLTE5NTEsMTIgKzE5MTYsOSBAQAogCQlyZXR1cm4gcmV0OwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIXJlcykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQliYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsIFBBR0VfU0laRSk7Ci0JaWYgKCFiYXNlKQotCQlyZXR1cm4gLUVOT01FTTsKKwliYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihiYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoYmFzZSk7CiAKIAlzcG9ydC0+cG9ydC5kZXYgPSAmcGRldi0+ZGV2OwogCXNwb3J0LT5wb3J0Lm1hcGJhc2UgPSByZXMtPnN0YXJ0OwpAQCAtMTk5MiwzOCArMTk1NCwxNiBAQAogCiAJaW14X3BvcnRzW3Nwb3J0LT5wb3J0LmxpbmVdID0gc3BvcnQ7CiAKLQlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7Ci0JaWYgKHBkYXRhICYmIHBkYXRhLT5pbml0KSB7Ci0JCXJldCA9IHBkYXRhLT5pbml0KHBkZXYpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSB1YXJ0X2FkZF9vbmVfcG9ydCgmaW14X3JlZywgJnNwb3J0LT5wb3J0KTsKLQlpZiAocmV0KQotCQlnb3RvIGRlaW5pdDsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzcG9ydCk7CiAKLQlyZXR1cm4gMDsKLWRlaW5pdDoKLQlpZiAocGRhdGEgJiYgcGRhdGEtPmV4aXQpCi0JCXBkYXRhLT5leGl0KHBkZXYpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIHVhcnRfYWRkX29uZV9wb3J0KCZpbXhfcmVnLCAmc3BvcnQtPnBvcnQpOwogfQogCiBzdGF0aWMgaW50IHNlcmlhbF9pbXhfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IGlteF9wb3J0ICpzcG9ydCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwotCi0JdWFydF9yZW1vdmVfb25lX3BvcnQoJmlteF9yZWcsICZzcG9ydC0+cG9ydCk7Ci0KLQlpZiAocGRhdGEgJiYgcGRhdGEtPmV4aXQpCi0JCXBkYXRhLT5leGl0KHBkZXYpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHVhcnRfcmVtb3ZlX29uZV9wb3J0KCZpbXhfcmVnLCAmc3BvcnQtPnBvcnQpOwogfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzZXJpYWxfaW14X2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTB4LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEweC5jCmluZGV4IDhkNzFlNDAuLjJhOTlkMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTB4LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL21heDMxMHguYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgTWF4aW0gKERhbGxhcykgTUFYMzEwNy84LzksIE1BWDE0ODMwIHNlcmlhbCBkcml2ZXIKICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgQWxleGFuZGVyIFNoaXlhbiA8c2hjX3dvcmtAbWFpbC5ydT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNCBBbGV4YW5kZXIgU2hpeWFuIDxzaGNfd29ya0BtYWlsLnJ1PgogICoKICAqICBCYXNlZCBvbiBtYXgzMTAwLmMsIGJ5IENocmlzdGlhbiBQZWxsZWdyaW4gPGNocmlwZWxsQGV2b2x3YXJlLm9yZz4KICAqICBCYXNlZCBvbiBtYXgzMTEwLmMsIGJ5IEZlbmcgVGFuZyA8ZmVuZy50YW5nQGludGVsLmNvbT4KQEAgLTEzLDE5ICsxMywyMSBAQAogICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL21heDMxMHguaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKICNkZWZpbmUgTUFYMzEwWF9OQU1FCQkJIm1heDMxMHgiCiAjZGVmaW5lIE1BWDMxMFhfTUFKT1IJCQkyMDQKQEAgLTE2MSwxMCArMTYzLDYgQEAKIC8qIElSREEgcmVnaXN0ZXIgYml0cyAqLwogI2RlZmluZSBNQVgzMTBYX0lSREFfSVJEQUVOX0JJVAkJKDEgPDwgMCkgLyogSVJEQSBtb2RlIGVuYWJsZSAqLwogI2RlZmluZSBNQVgzMTBYX0lSREFfU0lSX0JJVAkJKDEgPDwgMSkgLyogU0lSIG1vZGUgZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfSVJEQV9TSE9SVElSX0JJVAkoMSA8PCAyKSAvKiBTaG9ydCBTSVIgbW9kZSBlbmFibGUgKi8KLSNkZWZpbmUgTUFYMzEwWF9JUkRBX01JUl9CSVQJCSgxIDw8IDMpIC8qIE1JUiBtb2RlIGVuYWJsZSAqLwotI2RlZmluZSBNQVgzMTBYX0lSREFfUlhJTlZfQklUCQkoMSA8PCA0KSAvKiBSWCBsb2dpYyBpbnZlcnNpb24gZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfSVJEQV9UWElOVl9CSVQJCSgxIDw8IDUpIC8qIFRYIGxvZ2ljIGludmVyc2lvbiBlbmFibGUgKi8KIAogLyogRmxvdyBjb250cm9sIHRyaWdnZXIgbGV2ZWwgcmVnaXN0ZXIgbWFza3MgKi8KICNkZWZpbmUgTUFYMzEwWF9GTE9XTFZMX0hBTFRfTUFTSwkoMHgwMDBmKSAvKiBGbG93IGNvbnRyb2wgaGFsdCBsZXZlbCAqLwpAQCAtMjIwLDI2ICsyMTgsNiBAQAogCQkJCQkJICAqICAgICAgIFhPRkYyCiAJCQkJCQkgICovCiAKLS8qIEdQSU8gY29uZmlndXJhdGlvbiByZWdpc3RlciBiaXRzICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0NGR19HUDBPVVRfQklUCSgxIDw8IDApIC8qIEdQSU8gMCBvdXRwdXQgZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0NGR19HUDFPVVRfQklUCSgxIDw8IDEpIC8qIEdQSU8gMSBvdXRwdXQgZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0NGR19HUDJPVVRfQklUCSgxIDw8IDIpIC8qIEdQSU8gMiBvdXRwdXQgZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0NGR19HUDNPVVRfQklUCSgxIDw8IDMpIC8qIEdQSU8gMyBvdXRwdXQgZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0NGR19HUDBPRF9CSVQJKDEgPDwgNCkgLyogR1BJTyAwIG9wZW4tZHJhaW4gZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0NGR19HUDFPRF9CSVQJKDEgPDwgNSkgLyogR1BJTyAxIG9wZW4tZHJhaW4gZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0NGR19HUDJPRF9CSVQJKDEgPDwgNikgLyogR1BJTyAyIG9wZW4tZHJhaW4gZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0NGR19HUDNPRF9CSVQJKDEgPDwgNykgLyogR1BJTyAzIG9wZW4tZHJhaW4gZW5hYmxlICovCi0KLS8qIEdQSU8gREFUQSByZWdpc3RlciBiaXRzICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0RBVEFfR1AwT1VUX0JJVAkoMSA8PCAwKSAvKiBHUElPIDAgb3V0cHV0IHZhbHVlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0RBVEFfR1AxT1VUX0JJVAkoMSA8PCAxKSAvKiBHUElPIDEgb3V0cHV0IHZhbHVlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0RBVEFfR1AyT1VUX0JJVAkoMSA8PCAyKSAvKiBHUElPIDIgb3V0cHV0IHZhbHVlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0RBVEFfR1AzT1VUX0JJVAkoMSA8PCAzKSAvKiBHUElPIDMgb3V0cHV0IHZhbHVlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0RBVEFfR1AwSU5fQklUCSgxIDw8IDQpIC8qIEdQSU8gMCBpbnB1dCB2YWx1ZSAqLwotI2RlZmluZSBNQVgzMTBYX0dQSU9EQVRBX0dQMUlOX0JJVAkoMSA8PCA1KSAvKiBHUElPIDEgaW5wdXQgdmFsdWUgKi8KLSNkZWZpbmUgTUFYMzEwWF9HUElPREFUQV9HUDJJTl9CSVQJKDEgPDwgNikgLyogR1BJTyAyIGlucHV0IHZhbHVlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0RBVEFfR1AzSU5fQklUCSgxIDw8IDcpIC8qIEdQSU8gMyBpbnB1dCB2YWx1ZSAqLwotCiAvKiBQTEwgY29uZmlndXJhdGlvbiByZWdpc3RlciBtYXNrcyAqLwogI2RlZmluZSBNQVgzMTBYX1BMTENGR19QUkVESVZfTUFTSwkoMHgzZikgLyogUExMIHByZWRpdmlzaW9uIHZhbHVlICovCiAjZGVmaW5lIE1BWDMxMFhfUExMQ0ZHX1BMTEZBQ1RPUl9NQVNLCSgweGMwKSAvKiBQTEwgbXVsdGlwbGljYXRpb24gZmFjdG9yICovCkBAIC0yODMsMTYgKzI2MSwxNSBAQAogc3RydWN0IG1heDMxMHhfb25lIHsKIAlzdHJ1Y3QgdWFydF9wb3J0CXBvcnQ7CiAJc3RydWN0IHdvcmtfc3RydWN0CXR4X3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0CW1kX3dvcms7CiB9OwogCiBzdHJ1Y3QgbWF4MzEweF9wb3J0IHsKIAlzdHJ1Y3QgdWFydF9kcml2ZXIJdWFydDsKIAlzdHJ1Y3QgbWF4MzEweF9kZXZ0eXBlCSpkZXZ0eXBlOwogCXN0cnVjdCByZWdtYXAJCSpyZWdtYXA7Ci0Jc3RydWN0IHJlZ21hcF9jb25maWcJcmVnY2ZnOwogCXN0cnVjdCBtdXRleAkJbXV0ZXg7Ci0Jc3RydWN0IG1heDMxMHhfcGRhdGEJKnBkYXRhOwotCWludAkJCWdwaW9fdXNlZDsKKwlzdHJ1Y3QgY2xrCQkqY2xrOwogI2lmZGVmIENPTkZJR19HUElPTElCCiAJc3RydWN0IGdwaW9fY2hpcAlncGlvOwogI2VuZGlmCkBAIC01MDQsMjUgKzQ4MSwzMyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIHZvaWQgbWF4MzEweF9zZXRfYmF1ZChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgYmF1ZCkKK3N0YXRpYyBpbnQgbWF4MzEweF9zZXRfYmF1ZChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgYmF1ZCkKIHsKLQl1bnNpZ25lZCBpbnQgbW9kZSA9IDAsIGRpdiA9IHBvcnQtPnVhcnRjbGsgLyBiYXVkOworCXVuc2lnbmVkIGludCBtb2RlID0gMCwgY2xrID0gcG9ydC0+dWFydGNsaywgZGl2ID0gY2xrIC8gYmF1ZDsKIAotCWlmICghKGRpdiAvIDE2KSkgeworCS8qIENoZWNrIGZvciBtaW5pbWFsIHZhbHVlIGZvciBkaXZpZGVyICovCisJaWYgKGRpdiA8IDE2KQorCQlkaXYgPSAxNjsKKworCWlmIChjbGsgJSBiYXVkICYmIChkaXYgLyAxNikgPCAweDgwMDApIHsKIAkJLyogTW9kZSB4MiAqLwogCQltb2RlID0gTUFYMzEwWF9CUkdDRkdfMlhNT0RFX0JJVDsKLQkJZGl2ID0gKHBvcnQtPnVhcnRjbGsgKiAyKSAvIGJhdWQ7Ci0JfQorCQljbGsgPSBwb3J0LT51YXJ0Y2xrICogMjsKKwkJZGl2ID0gY2xrIC8gYmF1ZDsKIAotCWlmICghKGRpdiAvIDE2KSkgewotCQkvKiBNb2RlIHg0ICovCi0JCW1vZGUgPSBNQVgzMTBYX0JSR0NGR180WE1PREVfQklUOwotCQlkaXYgPSAocG9ydC0+dWFydGNsayAqIDQpIC8gYmF1ZDsKKwkJaWYgKGNsayAlIGJhdWQgJiYgKGRpdiAvIDE2KSA8IDB4ODAwMCkgeworCQkJLyogTW9kZSB4NCAqLworCQkJbW9kZSA9IE1BWDMxMFhfQlJHQ0ZHXzRYTU9ERV9CSVQ7CisJCQljbGsgPSBwb3J0LT51YXJ0Y2xrICogNDsKKwkJCWRpdiA9IGNsayAvIGJhdWQ7CisJCX0KIAl9CiAKIAltYXgzMTB4X3BvcnRfd3JpdGUocG9ydCwgTUFYMzEwWF9CUkdESVZNU0JfUkVHLCAoZGl2IC8gMTYpID4+IDgpOwogCW1heDMxMHhfcG9ydF93cml0ZShwb3J0LCBNQVgzMTBYX0JSR0RJVkxTQl9SRUcsIGRpdiAvIDE2KTsKIAltYXgzMTB4X3BvcnRfd3JpdGUocG9ydCwgTUFYMzEwWF9CUkdDRkdfUkVHLCAoZGl2ICUgMTYpIHwgbW9kZSk7CisKKwlyZXR1cm4gRElWX1JPVU5EX0NMT1NFU1QoY2xrLCBkaXYpOwogfQogCiBzdGF0aWMgaW50IG1heDMxMHhfdXBkYXRlX2Jlc3RfZXJyKHVuc2lnbmVkIGxvbmcgZiwgbG9uZyAqYmVzdGVycikKQEAgLTUzOCwxOCArNTIzLDE5IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgbWF4MzEweF9zZXRfcmVmX2NsayhzdHJ1Y3QgbWF4MzEweF9wb3J0ICpzKQorc3RhdGljIGludCBtYXgzMTB4X3NldF9yZWZfY2xrKHN0cnVjdCBtYXgzMTB4X3BvcnQgKnMsIHVuc2lnbmVkIGxvbmcgZnJlcSwKKwkJCSAgICAgICBib29sIHh0YWwpCiB7CiAJdW5zaWduZWQgaW50IGRpdiwgY2xrc3JjLCBwbGxjZmcgPSAwOwogCWxvbmcgYmVzdGVyciA9IC0xOwotCXVuc2lnbmVkIGxvbmcgZmRpdiwgZm11bCwgYmVzdGZyZXEgPSBzLT5wZGF0YS0+ZnJlcXVlbmN5OworCXVuc2lnbmVkIGxvbmcgZmRpdiwgZm11bCwgYmVzdGZyZXEgPSBmcmVxOwogCiAJLyogRmlyc3QsIHVwZGF0ZSBlcnJvciB3aXRob3V0IFBMTCAqLwotCW1heDMxMHhfdXBkYXRlX2Jlc3RfZXJyKHMtPnBkYXRhLT5mcmVxdWVuY3ksICZiZXN0ZXJyKTsKKwltYXgzMTB4X3VwZGF0ZV9iZXN0X2VycihmcmVxLCAmYmVzdGVycik7CiAKIAkvKiBUcnkgYWxsIHBvc3NpYmxlIFBMTCBkaXZpZGVycyAqLwogCWZvciAoZGl2ID0gMTsgKGRpdiA8PSA2MykgJiYgYmVzdGVycjsgZGl2KyspIHsKLQkJZmRpdiA9IERJVl9ST1VORF9DTE9TRVNUKHMtPnBkYXRhLT5mcmVxdWVuY3ksIGRpdik7CisJCWZkaXYgPSBESVZfUk9VTkRfQ0xPU0VTVChmcmVxLCBkaXYpOwogCiAJCS8qIFRyeSBtdWx0aXBsaWVyIDYgKi8KIAkJZm11bCA9IGZkaXYgKiA2OwpAQCAtNTgyLDEwICs1NjgsNyBAQAogCX0KIAogCS8qIENvbmZpZ3VyZSBjbG9jayBzb3VyY2UgKi8KLQlpZiAocy0+cGRhdGEtPmRyaXZlcl9mbGFncyAmIE1BWDMxMFhfRVhUX0NMSykKLQkJY2xrc3JjID0gTUFYMzEwWF9DTEtTUkNfRVhUQ0xLX0JJVDsKLQllbHNlCi0JCWNsa3NyYyA9IE1BWDMxMFhfQ0xLU1JDX0NSWVNUX0JJVDsKKwljbGtzcmMgPSB4dGFsID8gTUFYMzEwWF9DTEtTUkNfQ1JZU1RfQklUIDogTUFYMzEwWF9DTEtTUkNfRVhUQ0xLX0JJVDsKIAogCS8qIENvbmZpZ3VyZSBQTEwgKi8KIAlpZiAocGxsY2ZnKSB7CkBAIC01OTcsNyArNTgwLDcgQEAKIAlyZWdtYXBfd3JpdGUocy0+cmVnbWFwLCBNQVgzMTBYX0NMS1NSQ19SRUcsIGNsa3NyYyk7CiAKIAkvKiBXYWl0IGZvciBjcnlzdGFsICovCi0JaWYgKHBsbGNmZyAmJiAhKHMtPnBkYXRhLT5kcml2ZXJfZmxhZ3MgJiBNQVgzMTBYX0VYVF9DTEspKQorCWlmIChwbGxjZmcgJiYgeHRhbCkKIAkJbXNsZWVwKDEwKTsKIAogCXJldHVybiAoaW50KWJlc3RmcmVxOwpAQCAtNzgyLDExICs3NjUsMjEgQEAKIAlyZXR1cm4gVElPQ01fRFNSIHwgVElPQ01fQ0FSOwogfQogCitzdGF0aWMgdm9pZCBtYXgzMTB4X21kX3Byb2Moc3RydWN0IHdvcmtfc3RydWN0ICp3cykKK3sKKwlzdHJ1Y3QgbWF4MzEweF9vbmUgKm9uZSA9IGNvbnRhaW5lcl9vZih3cywgc3RydWN0IG1heDMxMHhfb25lLCBtZF93b3JrKTsKKworCW1heDMxMHhfcG9ydF91cGRhdGUoJm9uZS0+cG9ydCwgTUFYMzEwWF9NT0RFMl9SRUcsCisJCQkgICAgTUFYMzEwWF9NT0RFMl9MT09QQkFDS19CSVQsCisJCQkgICAgKG9uZS0+cG9ydC5tY3RybCAmIFRJT0NNX0xPT1ApID8KKwkJCSAgICBNQVgzMTBYX01PREUyX0xPT1BCQUNLX0JJVCA6IDApOworfQorCiBzdGF0aWMgdm9pZCBtYXgzMTB4X3NldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgbWN0cmwpCiB7Ci0JLyogRENEIGFuZCBEU1IgYXJlIG5vdCB3aXJlZCBhbmQgQ1RTL1JUUyBpcyBoYWRubGVkIGF1dG9tYXRpY2FsbHkKLQkgKiBzbyBkbyBub3RoaW5nCi0JICovCisJc3RydWN0IG1heDMxMHhfb25lICpvbmUgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IG1heDMxMHhfb25lLCBwb3J0KTsKKworCXNjaGVkdWxlX3dvcmsoJm9uZS0+bWRfd29yayk7CiB9CiAKIHN0YXRpYyB2b2lkIG1heDMxMHhfYnJlYWtfY3RsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSkKQEAgLTg3NSw0MCArODY4LDc2IEBACiAJCQkJICBwb3J0LT51YXJ0Y2xrIC8gNCk7CiAKIAkvKiBTZXR1cCBiYXVkcmF0ZSBnZW5lcmF0b3IgKi8KLQltYXgzMTB4X3NldF9iYXVkKHBvcnQsIGJhdWQpOworCWJhdWQgPSBtYXgzMTB4X3NldF9iYXVkKHBvcnQsIGJhdWQpOwogCiAJLyogVXBkYXRlIHRpbWVvdXQgYWNjb3JkaW5nIHRvIG5ldyBiYXVkIHJhdGUgKi8KIAl1YXJ0X3VwZGF0ZV90aW1lb3V0KHBvcnQsIHRlcm1pb3MtPmNfY2ZsYWcsIGJhdWQpOwogfQogCitzdGF0aWMgaW50IG1heDMxMHhfaW9jdGwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyNpZiBkZWZpbmVkKFRJT0NTUlM0ODUpICYmIGRlZmluZWQoVElPQ0dSUzQ4NSkKKwlzdHJ1Y3Qgc2VyaWFsX3JzNDg1IHJzNDg1OworCXVuc2lnbmVkIGludCB2YWw7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVElPQ1NSUzQ4NToKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZyczQ4NSwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YocnM0ODUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAocnM0ODUuZGVsYXlfcnRzX2JlZm9yZV9zZW5kID4gMHgwZiB8fAorCQkgICAgcnM0ODUuZGVsYXlfcnRzX2FmdGVyX3NlbmQgPiAweDBmKQorCQkJcmV0dXJuIC1FUkFOR0U7CisJCXZhbCA9IChyczQ4NS5kZWxheV9ydHNfYmVmb3JlX3NlbmQgPDwgNCkgfAorCQkgICAgICByczQ4NS5kZWxheV9ydHNfYWZ0ZXJfc2VuZDsKKwkJbWF4MzEweF9wb3J0X3dyaXRlKHBvcnQsIE1BWDMxMFhfSERQSVhERUxBWV9SRUcsIHZhbCk7CisJCWlmIChyczQ4NS5mbGFncyAmIFNFUl9SUzQ4NV9FTkFCTEVEKSB7CisJCQltYXgzMTB4X3BvcnRfdXBkYXRlKHBvcnQsIE1BWDMxMFhfTU9ERTFfUkVHLAorCQkJCQkgICAgTUFYMzEwWF9NT0RFMV9UUk5TQ1ZDVFJMX0JJVCwKKwkJCQkJICAgIE1BWDMxMFhfTU9ERTFfVFJOU0NWQ1RSTF9CSVQpOworCQkJbWF4MzEweF9wb3J0X3VwZGF0ZShwb3J0LCBNQVgzMTBYX01PREUyX1JFRywKKwkJCQkJICAgIE1BWDMxMFhfTU9ERTJfRUNIT1NVUFJfQklULAorCQkJCQkgICAgTUFYMzEwWF9NT0RFMl9FQ0hPU1VQUl9CSVQpOworCQl9IGVsc2UgeworCQkJbWF4MzEweF9wb3J0X3VwZGF0ZShwb3J0LCBNQVgzMTBYX01PREUxX1JFRywKKwkJCQkJICAgIE1BWDMxMFhfTU9ERTFfVFJOU0NWQ1RSTF9CSVQsIDApOworCQkJbWF4MzEweF9wb3J0X3VwZGF0ZShwb3J0LCBNQVgzMTBYX01PREUyX1JFRywKKwkJCQkJICAgIE1BWDMxMFhfTU9ERTJfRUNIT1NVUFJfQklULCAwKTsKKwkJfQorCQlyZXR1cm4gMDsKKwljYXNlIFRJT0NHUlM0ODU6CisJCW1lbXNldCgmcnM0ODUsIDAsIHNpemVvZihyczQ4NSkpOworCQl2YWwgPSBtYXgzMTB4X3BvcnRfcmVhZChwb3J0LCBNQVgzMTBYX01PREUxX1JFRyk7CisJCXJzNDg1LmZsYWdzID0gKHZhbCAmIE1BWDMxMFhfTU9ERTFfVFJOU0NWQ1RSTF9CSVQpID8KKwkJCSAgICAgIFNFUl9SUzQ4NV9FTkFCTEVEIDogMDsKKwkJcnM0ODUuZmxhZ3MgfD0gU0VSX1JTNDg1X1JUU19PTl9TRU5EOworCQl2YWwgPSBtYXgzMTB4X3BvcnRfcmVhZChwb3J0LCBNQVgzMTBYX0hEUElYREVMQVlfUkVHKTsKKwkJcnM0ODUuZGVsYXlfcnRzX2JlZm9yZV9zZW5kID0gdmFsID4+IDQ7CisJCXJzNDg1LmRlbGF5X3J0c19hZnRlcl9zZW5kID0gdmFsICYgMHgwZjsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZyczQ4NSwgc2l6ZW9mKHJzNDg1KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorCiBzdGF0aWMgaW50IG1heDMxMHhfc3RhcnR1cChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewotCXVuc2lnbmVkIGludCB2YWwsIGxpbmUgPSBwb3J0LT5saW5lOwogCXN0cnVjdCBtYXgzMTB4X3BvcnQgKnMgPSBkZXZfZ2V0X2RydmRhdGEocG9ydC0+ZGV2KTsKKwl1bnNpZ25lZCBpbnQgdmFsOwogCiAJcy0+ZGV2dHlwZS0+cG93ZXIocG9ydCwgMSk7CiAKLQkvKiBDb25maWd1cmUgYmF1ZCByYXRlLCA5NjAwIGFzIGRlZmF1bHQgKi8KLQltYXgzMTB4X3NldF9iYXVkKHBvcnQsIDk2MDApOwotCi0JLyogQ29uZmlndXJlIExDUiByZWdpc3RlciwgOE4xIG1vZGUgYnkgZGVmYXVsdCAqLwotCW1heDMxMHhfcG9ydF93cml0ZShwb3J0LCBNQVgzMTBYX0xDUl9SRUcsIE1BWDMxMFhfTENSX1dPUkRfTEVOXzgpOwotCiAJLyogQ29uZmlndXJlIE1PREUxIHJlZ2lzdGVyICovCiAJbWF4MzEweF9wb3J0X3VwZGF0ZShwb3J0LCBNQVgzMTBYX01PREUxX1JFRywKLQkJCSAgICBNQVgzMTBYX01PREUxX1RSTlNDVkNUUkxfQklULAotCQkJICAgIChzLT5wZGF0YS0+dWFydF9mbGFnc1tsaW5lXSAmIE1BWDMxMFhfQVVUT19ESVJfQ1RSTCkKLQkJCSAgICA/IE1BWDMxMFhfTU9ERTFfVFJOU0NWQ1RSTF9CSVQgOiAwKTsKKwkJCSAgICBNQVgzMTBYX01PREUxX1RSTlNDVkNUUkxfQklULCAwKTsKIAotCS8qIENvbmZpZ3VyZSBNT0RFMiByZWdpc3RlciAqLwotCXZhbCA9IE1BWDMxMFhfTU9ERTJfUlhFTVBUSU5WX0JJVDsKLQlpZiAocy0+cGRhdGEtPnVhcnRfZmxhZ3NbbGluZV0gJiBNQVgzMTBYX0xPT1BCQUNLKQotCQl2YWwgfD0gTUFYMzEwWF9NT0RFMl9MT09QQkFDS19CSVQ7Ci0JaWYgKHMtPnBkYXRhLT51YXJ0X2ZsYWdzW2xpbmVdICYgTUFYMzEwWF9FQ0hPX1NVUFJFU1MpCi0JCXZhbCB8PSBNQVgzMTBYX01PREUyX0VDSE9TVVBSX0JJVDsKLQotCS8qIFJlc2V0IEZJRk9zICovCi0JdmFsIHw9IE1BWDMxMFhfTU9ERTJfRklGT1JTVF9CSVQ7CisJLyogQ29uZmlndXJlIE1PREUyIHJlZ2lzdGVyICYgUmVzZXQgRklGT3MqLworCXZhbCA9IE1BWDMxMFhfTU9ERTJfUlhFTVBUSU5WX0JJVCB8IE1BWDMxMFhfTU9ERTJfRklGT1JTVF9CSVQ7CiAJbWF4MzEweF9wb3J0X3dyaXRlKHBvcnQsIE1BWDMxMFhfTU9ERTJfUkVHLCB2YWwpOwogCW1heDMxMHhfcG9ydF91cGRhdGUocG9ydCwgTUFYMzEwWF9NT0RFMl9SRUcsCiAJCQkgICAgTUFYMzEwWF9NT0RFMl9GSUZPUlNUX0JJVCwgMCk7CkBAIC05ODksNiArMTAxOCw3IEBACiAJLnJlbGVhc2VfcG9ydAk9IG1heDMxMHhfbnVsbF92b2lkLAogCS5jb25maWdfcG9ydAk9IG1heDMxMHhfY29uZmlnX3BvcnQsCiAJLnZlcmlmeV9wb3J0CT0gbWF4MzEweF92ZXJpZnlfcG9ydCwKKwkuaW9jdGwJCT0gbWF4MzEweF9pb2N0bCwKIH07CiAKIHN0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgbWF4MzEweF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTEwMTcsNiArMTA0Nyw4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhtYXgzMTB4X3BtX29wcywgbWF4MzEweF9zdXNwZW5kLCBtYXgzMTB4X3Jlc3VtZSk7CisKICNpZmRlZiBDT05GSUdfR1BJT0xJQgogc3RhdGljIGludCBtYXgzMTB4X2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKIHsKQEAgLTEwNjMsMjMgKzEwOTUsMTYgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IG1heDMxMHhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaXNfc3BpLAotCQkJIHN0cnVjdCBtYXgzMTB4X2RldnR5cGUgKmRldnR5cGUsIGludCBpcnEpCitzdGF0aWMgaW50IG1heDMxMHhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgbWF4MzEweF9kZXZ0eXBlICpkZXZ0eXBlLAorCQkJIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgaW50IGlycSwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKKwlpbnQgaSwgcmV0LCBmbWluLCBmbWF4LCBmcmVxLCB1YXJ0Y2xrOworCXN0cnVjdCBjbGsgKmNsa19vc2MsICpjbGtfeHRhbDsKIAlzdHJ1Y3QgbWF4MzEweF9wb3J0ICpzOwotCXN0cnVjdCBtYXgzMTB4X3BkYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKLQlpbnQgaSwgcmV0LCB1YXJ0Y2xrOworCWJvb2wgeHRhbCA9IGZhbHNlOwogCi0JLyogQ2hlY2sgZm9yIElSUSAqLwotCWlmIChpcnEgPD0gMCkgewotCQlkZXZfZXJyKGRldiwgIk5vIElSUSBzcGVjaWZpZWRcbiIpOwotCQlyZXR1cm4gLUVOT1RTVVBQOwotCX0KLQotCWlmICghcGRhdGEpIHsKLQkJZGV2X2VycihkZXYsICJObyBwbGF0Zm9ybSBkYXRhIHN1cHBsaWVkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCWlmIChJU19FUlIocmVnbWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKIAogCS8qIEFsbG9jIHBvcnQgc3RydWN0dXJlICovCiAJcyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcykgKwpAQCAtMTA4OSw1MiArMTExNCw0NCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQkvKiBDaGVjayBpbnB1dCBmcmVxdWVuY3kgKi8KLQlpZiAoKHBkYXRhLT5kcml2ZXJfZmxhZ3MgJiBNQVgzMTBYX0VYVF9DTEspICYmCi0JICAgKChwZGF0YS0+ZnJlcXVlbmN5IDwgNTAwMDAwKSB8fCAocGRhdGEtPmZyZXF1ZW5jeSA+IDM1MDAwMDAwKSkpCi0JCWdvdG8gZXJyX2ZyZXE7Ci0JLyogQ2hlY2sgZnJlcXVlbmN5IGZvciBxdWFydHogKi8KLQlpZiAoIShwZGF0YS0+ZHJpdmVyX2ZsYWdzICYgTUFYMzEwWF9FWFRfQ0xLKSAmJgotCSAgICgocGRhdGEtPmZyZXF1ZW5jeSA8IDEwMDAwMDApIHx8IChwZGF0YS0+ZnJlcXVlbmN5ID4gNDAwMDAwMCkpKQotCQlnb3RvIGVycl9mcmVxOwotCi0Jcy0+cGRhdGEgPSBwZGF0YTsKLQlzLT5kZXZ0eXBlID0gZGV2dHlwZTsKLQlkZXZfc2V0X2RydmRhdGEoZGV2LCBzKTsKLQotCW11dGV4X2luaXQoJnMtPm11dGV4KTsKLQotCS8qIFNldHVwIHJlZ21hcCAqLwotCXMtPnJlZ2NmZy5yZWdfYml0cwkJPSA4OwotCXMtPnJlZ2NmZy52YWxfYml0cwkJPSA4OwotCXMtPnJlZ2NmZy5yZWFkX2ZsYWdfbWFzawk9IDB4MDA7Ci0Jcy0+cmVnY2ZnLndyaXRlX2ZsYWdfbWFzawk9IDB4ODA7Ci0Jcy0+cmVnY2ZnLmNhY2hlX3R5cGUJCT0gUkVHQ0FDSEVfUkJUUkVFOwotCXMtPnJlZ2NmZy53cml0ZWFibGVfcmVnCQk9IG1heDMxMHhfcmVnX3dyaXRlYWJsZTsKLQlzLT5yZWdjZmcudm9sYXRpbGVfcmVnCQk9IG1heDMxMHhfcmVnX3ZvbGF0aWxlOwotCXMtPnJlZ2NmZy5wcmVjaW91c19yZWcJCT0gbWF4MzEweF9yZWdfcHJlY2lvdXM7Ci0Jcy0+cmVnY2ZnLm1heF9yZWdpc3RlcgkJPSBkZXZ0eXBlLT5uciAqIDB4MjAgLSAxOwotCi0JaWYgKElTX0VOQUJMRUQoQ09ORklHX1NQSV9NQVNURVIpICYmIGlzX3NwaSkgewotCQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwotCi0JCXMtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfc3BpKHNwaSwgJnMtPnJlZ2NmZyk7Ci0JfSBlbHNlCi0JCXJldHVybiAtRU5PVFNVUFA7Ci0KLQlpZiAoSVNfRVJSKHMtPnJlZ21hcCkpIHsKLQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSByZWdpc3RlciBtYXBcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihzLT5yZWdtYXApOworCWNsa19vc2MgPSBkZXZtX2Nsa19nZXQoZGV2LCAib3NjIik7CisJY2xrX3h0YWwgPSBkZXZtX2Nsa19nZXQoZGV2LCAieHRhbCIpOworCWlmICghSVNfRVJSKGNsa19vc2MpKSB7CisJCXMtPmNsayA9IGNsa19vc2M7CisJCWZtaW4gPSA1MDAwMDA7CisJCWZtYXggPSAzNTAwMDAwMDsKKwl9IGVsc2UgaWYgKCFJU19FUlIoY2xrX3h0YWwpKSB7CisJCXMtPmNsayA9IGNsa194dGFsOworCQlmbWluID0gMTAwMDAwMDsKKwkJZm1heCA9IDQwMDAwMDA7CisJCXh0YWwgPSB0cnVlOworCX0gZWxzZSBpZiAoUFRSX0VSUihjbGtfb3NjKSA9PSAtRVBST0JFX0RFRkVSIHx8CisJCSAgIFBUUl9FUlIoY2xrX3h0YWwpID09IC1FUFJPQkVfREVGRVIpIHsKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJfSBlbHNlIHsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgZ2V0IGNsb2NrXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLyogQm9hcmQgc3BlY2lmaWMgY29uZmlndXJlICovCi0JaWYgKHMtPnBkYXRhLT5pbml0KQotCQlzLT5wZGF0YS0+aW5pdCgpOworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShzLT5jbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmcmVxID0gY2xrX2dldF9yYXRlKHMtPmNsayk7CisJLyogQ2hlY2sgZnJlcXVlbmN5IGxpbWl0cyAqLworCWlmIChmcmVxIDwgZm1pbiB8fCBmcmVxID4gZm1heCkgeworCQlyZXQgPSAtRVJBTkdFOworCQlnb3RvIG91dF9jbGs7CisJfQorCisJcy0+cmVnbWFwID0gcmVnbWFwOworCXMtPmRldnR5cGUgPSBkZXZ0eXBlOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHMpOwogCiAJLyogQ2hlY2sgZGV2aWNlIHRvIGVuc3VyZSB3ZSBhcmUgdGFsa2luZyB0byB3aGF0IHdlIGV4cGVjdCAqLwogCXJldCA9IGRldnR5cGUtPmRldGVjdChkZXYpOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0X2NsazsKIAogCWZvciAoaSA9IDA7IGkgPCBkZXZ0eXBlLT5ucjsgaSsrKSB7CiAJCXVuc2lnbmVkIGludCBvZmZzID0gaSA8PCA1OwpAQCAtMTE1Niw3ICsxMTczLDcgQEAKIAkJCQkgICBNQVgzMTBYX01PREUxX0FVVE9TTEVFUF9CSVQpOwogCX0KIAotCXVhcnRjbGsgPSBtYXgzMTB4X3NldF9yZWZfY2xrKHMpOworCXVhcnRjbGsgPSBtYXgzMTB4X3NldF9yZWZfY2xrKHMsIGZyZXEsIHh0YWwpOwogCWRldl9kYmcoZGV2LCAiUmVmZXJlbmNlIGNsb2NrIHNldCB0byAlaSBIelxuIiwgdWFydGNsayk7CiAKIAkvKiBSZWdpc3RlciBVQVJUIGRyaXZlciAqLwpAQCAtMTE2OCw5ICsxMTg1LDI4IEBACiAJcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJnMtPnVhcnQpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihkZXYsICJSZWdpc3RlcmluZyBVQVJUIGRyaXZlciBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIG91dF9jbGs7CiAJfQogCisjaWZkZWYgQ09ORklHX0dQSU9MSUIKKwkvKiBTZXR1cCBHUElPIGNvdHJvbGxlciAqLworCXMtPmdwaW8ub3duZXIJCT0gVEhJU19NT0RVTEU7CisJcy0+Z3Bpby5kZXYJCT0gZGV2OworCXMtPmdwaW8ubGFiZWwJCT0gZGV2X25hbWUoZGV2KTsKKwlzLT5ncGlvLmRpcmVjdGlvbl9pbnB1dAk9IG1heDMxMHhfZ3Bpb19kaXJlY3Rpb25faW5wdXQ7CisJcy0+Z3Bpby5nZXQJCT0gbWF4MzEweF9ncGlvX2dldDsKKwlzLT5ncGlvLmRpcmVjdGlvbl9vdXRwdXQ9IG1heDMxMHhfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OworCXMtPmdwaW8uc2V0CQk9IG1heDMxMHhfZ3Bpb19zZXQ7CisJcy0+Z3Bpby5iYXNlCQk9IC0xOworCXMtPmdwaW8ubmdwaW8JCT0gZGV2dHlwZS0+bnIgKiA0OworCXMtPmdwaW8uY2FuX3NsZWVwCT0gMTsKKwlyZXQgPSBncGlvY2hpcF9hZGQoJnMtPmdwaW8pOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VhcnQ7CisjZW5kaWYKKworCW11dGV4X2luaXQoJnMtPm11dGV4KTsKKwogCWZvciAoaSA9IDA7IGkgPCBkZXZ0eXBlLT5ucjsgaSsrKSB7CiAJCS8qIEluaXRpYWxpemUgcG9ydCBkYXRhICovCiAJCXMtPnBbaV0ucG9ydC5saW5lCT0gaTsKQEAgLTExNzgsOCArMTIxNCw3IEBACiAJCXMtPnBbaV0ucG9ydC5pcnEJPSBpcnE7CiAJCXMtPnBbaV0ucG9ydC50eXBlCT0gUE9SVF9NQVgzMTBYOwogCQlzLT5wW2ldLnBvcnQuZmlmb3NpemUJPSBNQVgzMTBYX0ZJRk9fU0laRTsKLQkJcy0+cFtpXS5wb3J0LmZsYWdzCT0gVVBGX1NLSVBfVEVTVCB8IFVQRl9GSVhFRF9UWVBFIHwKLQkJCQkJICBVUEZfTE9XX0xBVEVOQ1k7CisJCXMtPnBbaV0ucG9ydC5mbGFncwk9IFVQRl9GSVhFRF9UWVBFIHwgVVBGX0xPV19MQVRFTkNZOwogCQlzLT5wW2ldLnBvcnQuaW90eXBlCT0gVVBJT19QT1JUOwogCQlzLT5wW2ldLnBvcnQuaW9iYXNlCT0gaSAqIDB4MjA7CiAJCXMtPnBbaV0ucG9ydC5tZW1iYXNlCT0gKHZvaWQgX19pb21lbSAqKX4wOwpAQCAtMTE5NSw0OCArMTIzMCwzNSBAQAogCQkJCSAgICBNQVgzMTBYX01PREUxX0lSUVNFTF9CSVQpOwogCQkvKiBJbml0aWFsaXplIHF1ZXVlIGZvciBzdGFydCBUWCAqLwogCQlJTklUX1dPUksoJnMtPnBbaV0udHhfd29yaywgbWF4MzEweF93cV9wcm9jKTsKKwkJLyogSW5pdGlhbGl6ZSBxdWV1ZSBmb3IgY2hhbmdpbmcgbW9kZSAqLworCQlJTklUX1dPUksoJnMtPnBbaV0ubWRfd29yaywgbWF4MzEweF9tZF9wcm9jKTsKIAkJLyogUmVnaXN0ZXIgcG9ydCAqLwogCQl1YXJ0X2FkZF9vbmVfcG9ydCgmcy0+dWFydCwgJnMtPnBbaV0ucG9ydCk7CiAJCS8qIEdvIHRvIHN1c3BlbmQgbW9kZSAqLwogCQlkZXZ0eXBlLT5wb3dlcigmcy0+cFtpXS5wb3J0LCAwKTsKIAl9CiAKLSNpZmRlZiBDT05GSUdfR1BJT0xJQgotCS8qIFNldHVwIEdQSU8gY290cm9sbGVyICovCi0JaWYgKHMtPnBkYXRhLT5ncGlvX2Jhc2UpIHsKLQkJcy0+Z3Bpby5vd25lcgkJPSBUSElTX01PRFVMRTsKLQkJcy0+Z3Bpby5kZXYJCT0gZGV2OwotCQlzLT5ncGlvLmxhYmVsCQk9IGRldl9uYW1lKGRldik7Ci0JCXMtPmdwaW8uZGlyZWN0aW9uX2lucHV0CT0gbWF4MzEweF9ncGlvX2RpcmVjdGlvbl9pbnB1dDsKLQkJcy0+Z3Bpby5nZXQJCT0gbWF4MzEweF9ncGlvX2dldDsKLQkJcy0+Z3Bpby5kaXJlY3Rpb25fb3V0cHV0PSBtYXgzMTB4X2dwaW9fZGlyZWN0aW9uX291dHB1dDsKLQkJcy0+Z3Bpby5zZXQJCT0gbWF4MzEweF9ncGlvX3NldDsKLQkJcy0+Z3Bpby5iYXNlCQk9IHMtPnBkYXRhLT5ncGlvX2Jhc2U7Ci0JCXMtPmdwaW8ubmdwaW8JCT0gZGV2dHlwZS0+bnIgKiA0OwotCQlzLT5ncGlvLmNhbl9zbGVlcAk9IDE7Ci0JCWlmICghZ3Bpb2NoaXBfYWRkKCZzLT5ncGlvKSkKLQkJCXMtPmdwaW9fdXNlZCA9IDE7Ci0JfSBlbHNlCi0JCWRldl9pbmZvKGRldiwgIkdQSU8gc3VwcG9ydCBub3QgZW5hYmxlZFxuIik7Ci0jZW5kaWYKLQogCS8qIFNldHVwIGludGVycnVwdCAqLwogCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoZGV2LCBpcnEsIE5VTEwsIG1heDMxMHhfaXN0LAotCQkJCQlJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfT05FU0hPVCwKLQkJCQkJZGV2X25hbWUoZGV2KSwgcyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byByZWd1ZXN0IElSUSAlaVxuIiwgaXJxKTsKKwkJCQkJSVJRRl9PTkVTSE9UIHwgZmxhZ3MsIGRldl9uYW1lKGRldiksIHMpOworCWlmICghcmV0KQorCQlyZXR1cm4gMDsKKworCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIHJlZ3Vlc3QgSVJRICVpXG4iLCBpcnEpOworCisJbXV0ZXhfZGVzdHJveSgmcy0+bXV0ZXgpOworCiAjaWZkZWYgQ09ORklHX0dQSU9MSUIKLQkJaWYgKHMtPmdwaW9fdXNlZCkKLQkJCVdBUk5fT04oZ3Bpb2NoaXBfcmVtb3ZlKCZzLT5ncGlvKSk7CisJV0FSTl9PTihncGlvY2hpcF9yZW1vdmUoJnMtPmdwaW8pKTsKKworb3V0X3VhcnQ6CiAjZW5kaWYKLQl9CisJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmcy0+dWFydCk7CisKK291dF9jbGs6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHMtPmNsayk7CiAKIAlyZXR1cm4gcmV0OwotCi1lcnJfZnJlcToKLQlkZXZfZXJyKGRldiwgIkZyZXF1ZW5jeSBwYXJhbWV0ZXIgaW5jb3JyZWN0XG4iKTsKLQlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCBtYXgzMTB4X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC0xMjQ0LDMwICsxMjY2LDUxIEBACiAJc3RydWN0IG1heDMxMHhfcG9ydCAqcyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBpLCByZXQgPSAwOwogCisjaWZkZWYgQ09ORklHX0dQSU9MSUIKKwlyZXQgPSBncGlvY2hpcF9yZW1vdmUoJnMtPmdwaW8pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisjZW5kaWYKKwogCWZvciAoaSA9IDA7IGkgPCBzLT51YXJ0Lm5yOyBpKyspIHsKIAkJY2FuY2VsX3dvcmtfc3luYygmcy0+cFtpXS50eF93b3JrKTsKKwkJY2FuY2VsX3dvcmtfc3luYygmcy0+cFtpXS5tZF93b3JrKTsKIAkJdWFydF9yZW1vdmVfb25lX3BvcnQoJnMtPnVhcnQsICZzLT5wW2ldLnBvcnQpOwogCQlzLT5kZXZ0eXBlLT5wb3dlcigmcy0+cFtpXS5wb3J0LCAwKTsKIAl9CiAKKwltdXRleF9kZXN0cm95KCZzLT5tdXRleCk7CiAJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmcy0+dWFydCk7Ci0KLSNpZmRlZiBDT05GSUdfR1BJT0xJQgotCWlmIChzLT5ncGlvX3VzZWQpCi0JCXJldCA9IGdwaW9jaGlwX3JlbW92ZSgmcy0+Z3Bpbyk7Ci0jZW5kaWYKLQotCWlmIChzLT5wZGF0YS0+ZXhpdCkKLQkJcy0+cGRhdGEtPmV4aXQoKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocy0+Y2xrKTsKIAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9fbWF5YmVfdW51c2VkIG1heDMxMHhfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJtYXhpbSxtYXgzMTA3IiwJLmRhdGEgPSAmbWF4MzEwN19kZXZ0eXBlLCB9LAorCXsgLmNvbXBhdGlibGUgPSAibWF4aW0sbWF4MzEwOCIsCS5kYXRhID0gJm1heDMxMDhfZGV2dHlwZSwgfSwKKwl7IC5jb21wYXRpYmxlID0gIm1heGltLG1heDMxMDkiLAkuZGF0YSA9ICZtYXgzMTA5X2RldnR5cGUsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJtYXhpbSxtYXgxNDgzMCIsCS5kYXRhID0gJm1heDE0ODMwX2RldnR5cGUgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtYXgzMTB4X2R0X2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyByZWdjZmcgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSA4LAorCS53cml0ZV9mbGFnX21hc2sgPSAweDgwLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS53cml0ZWFibGVfcmVnID0gbWF4MzEweF9yZWdfd3JpdGVhYmxlLAorCS52b2xhdGlsZV9yZWcgPSBtYXgzMTB4X3JlZ192b2xhdGlsZSwKKwkucHJlY2lvdXNfcmVnID0gbWF4MzEweF9yZWdfcHJlY2lvdXMsCit9OworCiAjaWZkZWYgQ09ORklHX1NQSV9NQVNURVIKIHN0YXRpYyBpbnQgbWF4MzEweF9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlzdHJ1Y3QgbWF4MzEweF9kZXZ0eXBlICpkZXZ0eXBlID0KLQkJKHN0cnVjdCBtYXgzMTB4X2RldnR5cGUgKilzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgbWF4MzEweF9kZXZ0eXBlICpkZXZ0eXBlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAlpbnQgcmV0OwogCiAJLyogU2V0dXAgU1BJIGJ1cyAqLwpAQCAtMTI3NSwxMiArMTMxOCwyNSBAQAogCXNwaS0+bW9kZQkJPSBzcGktPm1vZGUgPyA6IFNQSV9NT0RFXzA7CiAJc3BpLT5tYXhfc3BlZWRfaHoJPSBzcGktPm1heF9zcGVlZF9oeiA/IDogMjYwMDAwMDA7CiAJcmV0ID0gc3BpX3NldHVwKHNwaSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgIlNQSSBzZXR1cCBmYWlsZWRcbiIpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CisKKwlpZiAoc3BpLT5kZXYub2Zfbm9kZSkgeworCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZCA9CisJCQlvZl9tYXRjaF9kZXZpY2UobWF4MzEweF9kdF9pZHMsICZzcGktPmRldik7CisKKwkJZGV2dHlwZSA9IChzdHJ1Y3QgbWF4MzEweF9kZXZ0eXBlICopb2ZfaWQtPmRhdGE7CisJfSBlbHNlIHsKKwkJY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgKmlkX2VudHJ5ID0gc3BpX2dldF9kZXZpY2VfaWQoc3BpKTsKKworCQlkZXZ0eXBlID0gKHN0cnVjdCBtYXgzMTB4X2RldnR5cGUgKilpZF9lbnRyeS0+ZHJpdmVyX2RhdGE7CisJCWZsYWdzID0gSVJRRl9UUklHR0VSX0ZBTExJTkc7CiAJfQogCi0JcmV0dXJuIG1heDMxMHhfcHJvYmUoJnNwaS0+ZGV2LCAxLCBkZXZ0eXBlLCBzcGktPmlycSk7CisJcmVnY2ZnLm1heF9yZWdpc3RlciA9IGRldnR5cGUtPm5yICogMHgyMCAtIDE7CisJcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9zcGkoc3BpLCAmcmVnY2ZnKTsKKworCXJldHVybiBtYXgzMTB4X3Byb2JlKCZzcGktPmRldiwgZGV2dHlwZSwgcmVnbWFwLCBzcGktPmlycSwgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IG1heDMxMHhfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQpAQCAtMTI4OCw4ICsxMzQ0LDYgQEAKIAlyZXR1cm4gbWF4MzEweF9yZW1vdmUoJnNwaS0+ZGV2KTsKIH0KIAotc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKG1heDMxMHhfcG1fb3BzLCBtYXgzMTB4X3N1c3BlbmQsIG1heDMxMHhfcmVzdW1lKTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIG1heDMxMHhfaWRfdGFibGVbXSA9IHsKIAl7ICJtYXgzMTA3IiwJKGtlcm5lbF91bG9uZ190KSZtYXgzMTA3X2RldnR5cGUsIH0sCiAJeyAibWF4MzEwOCIsCShrZXJuZWxfdWxvbmdfdCkmbWF4MzEwOF9kZXZ0eXBlLCB9LApAQCAtMTMwMSw5ICsxMzU1LDEwIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBtYXgzMTB4X3VhcnRfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gTUFYMzEwWF9OQU1FLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQkJLnBtCT0gJm1heDMxMHhfcG1fb3BzLAorCQkubmFtZQkJPSBNQVgzMTBYX05BTUUsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlCT0gb2ZfbWF0Y2hfcHRyKG1heDMxMHhfZHRfaWRzKSwKKwkJLnBtCQk9ICZtYXgzMTB4X3BtX29wcywKIAl9LAogCS5wcm9iZQkJPSBtYXgzMTB4X3NwaV9wcm9iZSwKIAkucmVtb3ZlCQk9IG1heDMxMHhfc3BpX3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tc21fc2VyaWFsLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbXNtX3NlcmlhbC5jCmluZGV4IGI1ZDc3OWMuLjA1M2I5OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tc21fc2VyaWFsLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL21zbV9zZXJpYWwuYwpAQCAtMzksNiArMzksMTMgQEAKIAogI2luY2x1ZGUgIm1zbV9zZXJpYWwuaCIKIAorZW51bSB7CisJVUFSVERNXzFQMSA9IDEsCisJVUFSVERNXzFQMiwKKwlVQVJURE1fMVAzLAorCVVBUlRETV8xUDQsCit9OworCiBzdHJ1Y3QgbXNtX3BvcnQgewogCXN0cnVjdCB1YXJ0X3BvcnQJdWFydDsKIAljaGFyCQkJbmFtZVsxNl07CkBAIC0zMDksNiArMzE2LDggQEAKIAogc3RhdGljIHZvaWQgbXNtX3Jlc2V0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CisJc3RydWN0IG1zbV9wb3J0ICptc21fcG9ydCA9IFVBUlRfVE9fTVNNKHBvcnQpOworCiAJLyogcmVzZXQgZXZlcnl0aGluZyAqLwogCW1zbV93cml0ZShwb3J0LCBVQVJUX0NSX0NNRF9SRVNFVF9SWCwgVUFSVF9DUik7CiAJbXNtX3dyaXRlKHBvcnQsIFVBUlRfQ1JfQ01EX1JFU0VUX1RYLCBVQVJUX0NSKTsKQEAgLTMxNiw2ICszMjUsMTAgQEAKIAltc21fd3JpdGUocG9ydCwgVUFSVF9DUl9DTURfUkVTRVRfQlJFQUtfSU5ULCBVQVJUX0NSKTsKIAltc21fd3JpdGUocG9ydCwgVUFSVF9DUl9DTURfUkVTRVRfQ1RTLCBVQVJUX0NSKTsKIAltc21fd3JpdGUocG9ydCwgVUFSVF9DUl9DTURfU0VUX1JGUiwgVUFSVF9DUik7CisKKwkvKiBEaXNhYmxlIERNIG1vZGVzICovCisJaWYgKG1zbV9wb3J0LT5pc191YXJ0ZG0pCisJCW1zbV93cml0ZShwb3J0LCAwLCBVQVJURE1fRE1FTik7CiB9CiAKIHN0YXRpYyB2b2lkIG1zbV9zZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IG1jdHJsKQpAQCAtNzExLDYgKzcyNCwxMTcgQEAKIAl9CiB9CiAKKyNpZmRlZiBDT05GSUdfQ09OU09MRV9QT0xMCitzdGF0aWMgaW50IG1zbV9wb2xsX2luaXQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbXNtX3BvcnQgKm1zbV9wb3J0ID0gVUFSVF9UT19NU00ocG9ydCk7CisKKwkvKiBFbmFibGUgc2luZ2xlIGNoYXJhY3RlciBtb2RlIG9uIFJYIEZJRk8gKi8KKwlpZiAobXNtX3BvcnQtPmlzX3VhcnRkbSA+PSBVQVJURE1fMVA0KQorCQltc21fd3JpdGUocG9ydCwgVUFSVERNX0RNRU5fUlhfU0NfRU5BQkxFLCBVQVJURE1fRE1FTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcG9sbF9nZXRfY2hhcl9zaW5nbGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbXNtX3BvcnQgKm1zbV9wb3J0ID0gVUFSVF9UT19NU00ocG9ydCk7CisJdW5zaWduZWQgaW50IHJmX3JlZyA9IG1zbV9wb3J0LT5pc191YXJ0ZG0gPyBVQVJURE1fUkYgOiBVQVJUX1JGOworCisJaWYgKCEobXNtX3JlYWQocG9ydCwgVUFSVF9TUikgJiBVQVJUX1NSX1JYX1JFQURZKSkKKwkJcmV0dXJuIE5PX1BPTExfQ0hBUjsKKwllbHNlCisJCXJldHVybiBtc21fcmVhZChwb3J0LCByZl9yZWcpICYgMHhmZjsKK30KKworc3RhdGljIGludCBtc21fcG9sbF9nZXRfY2hhcl9kbV8xcDMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlpbnQgYzsKKwlzdGF0aWMgdTMyIHNsb3A7CisJc3RhdGljIGludCBjb3VudDsKKwl1bnNpZ25lZCBjaGFyICpzcCA9ICh1bnNpZ25lZCBjaGFyICopJnNsb3A7CisKKwkvKiBDaGVjayBpZiBhIHByZXZpb3VzIHJlYWQgaGFkIG1vcmUgdGhhbiBvbmUgY2hhciAqLworCWlmIChjb3VudCkgeworCQljID0gc3Bbc2l6ZW9mKHNsb3ApIC0gY291bnRdOworCQljb3VudC0tOworCS8qIE9yIGlmIEZJRk8gaXMgZW1wdHkgKi8KKwl9IGVsc2UgaWYgKCEobXNtX3JlYWQocG9ydCwgVUFSVF9TUikgJiBVQVJUX1NSX1JYX1JFQURZKSkgeworCQkvKgorCQkgKiBJZiBSWCBwYWNraW5nIGJ1ZmZlciBoYXMgbGVzcyB0aGFuIGEgd29yZCwgZm9yY2Ugc3RhbGUgdG8KKwkJICogcHVzaCBjb250ZW50cyBpbnRvIFJYIEZJRk8KKwkJICovCisJCWNvdW50ID0gbXNtX3JlYWQocG9ydCwgVUFSVERNX1JYRlMpOworCQljb3VudCA9IChjb3VudCA+PiBVQVJURE1fUlhGU19CVUZfU0hJRlQpICYgVUFSVERNX1JYRlNfQlVGX01BU0s7CisJCWlmIChjb3VudCkgeworCQkJbXNtX3dyaXRlKHBvcnQsIFVBUlRfQ1JfQ01EX0ZPUkNFX1NUQUxFLCBVQVJUX0NSKTsKKwkJCXNsb3AgPSBtc21fcmVhZChwb3J0LCBVQVJURE1fUkYpOworCQkJYyA9IHNwWzBdOworCQkJY291bnQtLTsKKwkJfSBlbHNlIHsKKwkJCWMgPSBOT19QT0xMX0NIQVI7CisJCX0KKwkvKiBGSUZPIGhhcyBhIHdvcmQgKi8KKwl9IGVsc2UgeworCQlzbG9wID0gbXNtX3JlYWQocG9ydCwgVUFSVERNX1JGKTsKKwkJYyA9IHNwWzBdOworCQljb3VudCA9IHNpemVvZihzbG9wKSAtIDE7CisJfQorCisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BvbGxfZ2V0X2NoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwl1MzIgaW1yOworCWludCBjOworCXN0cnVjdCBtc21fcG9ydCAqbXNtX3BvcnQgPSBVQVJUX1RPX01TTShwb3J0KTsKKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlpbXIgPSBtc21fcmVhZChwb3J0LCBVQVJUX0lNUik7CisJbXNtX3dyaXRlKHBvcnQsIDAsIFVBUlRfSU1SKTsKKworCWlmIChtc21fcG9ydC0+aXNfdWFydGRtID09IFVBUlRETV8xUDMpCisJCWMgPSBtc21fcG9sbF9nZXRfY2hhcl9kbV8xcDMocG9ydCk7CisJZWxzZQorCQljID0gbXNtX3BvbGxfZ2V0X2NoYXJfc2luZ2xlKHBvcnQpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgKi8KKwltc21fd3JpdGUocG9ydCwgaW1yLCBVQVJUX0lNUik7CisKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIHZvaWQgbXNtX3BvbGxfcHV0X2NoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgY2hhciBjKQoreworCXUzMiBpbXI7CisJc3RydWN0IG1zbV9wb3J0ICptc21fcG9ydCA9IFVBUlRfVE9fTVNNKHBvcnQpOworCisJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCWltciA9IG1zbV9yZWFkKHBvcnQsIFVBUlRfSU1SKTsKKwltc21fd3JpdGUocG9ydCwgMCwgVUFSVF9JTVIpOworCisJaWYgKG1zbV9wb3J0LT5pc191YXJ0ZG0pCisJCXJlc2V0X2RtX2NvdW50KHBvcnQsIDEpOworCisJLyogV2FpdCB1bnRpbCBGSUZPIGlzIGVtcHR5ICovCisJd2hpbGUgKCEobXNtX3JlYWQocG9ydCwgVUFSVF9TUikgJiBVQVJUX1NSX1RYX1JFQURZKSkKKwkJY3B1X3JlbGF4KCk7CisKKwkvKiBXcml0ZSBhIGNoYXJhY3RlciAqLworCW1zbV93cml0ZShwb3J0LCBjLCBtc21fcG9ydC0+aXNfdWFydGRtID8gVUFSVERNX1RGIDogVUFSVF9URik7CisKKwkvKiBXYWl0IHVudGlsIEZJRk8gaXMgZW1wdHkgKi8KKwl3aGlsZSAoIShtc21fcmVhZChwb3J0LCBVQVJUX1NSKSAmIFVBUlRfU1JfVFhfUkVBRFkpKQorCQljcHVfcmVsYXgoKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisJbXNtX3dyaXRlKHBvcnQsIGltciwgVUFSVF9JTVIpOworCisJcmV0dXJuOworfQorI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgbXNtX3VhcnRfcG9wcyA9IHsKIAkudHhfZW1wdHkgPSBtc21fdHhfZW1wdHksCiAJLnNldF9tY3RybCA9IG1zbV9zZXRfbWN0cmwsCkBAIC03MjksNiArODUzLDExIEBACiAJLmNvbmZpZ19wb3J0ID0gbXNtX2NvbmZpZ19wb3J0LAogCS52ZXJpZnlfcG9ydCA9IG1zbV92ZXJpZnlfcG9ydCwKIAkucG0gPSBtc21fcG93ZXIsCisjaWZkZWYgQ09ORklHX0NPTlNPTEVfUE9MTAorCS5wb2xsX2luaXQgPSBtc21fcG9sbF9pbml0LAorCS5wb2xsX2dldF9jaGFyCT0gbXNtX3BvbGxfZ2V0X2NoYXIsCisJLnBvbGxfcHV0X2NoYXIJPSBtc21fcG9sbF9wdXRfY2hhciwKKyNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCBtc21fcG9ydCBtc21fdWFydF9wb3J0c1tdID0gewpAQCAtOTAwLDcgKzEwMjksMTAgQEAKIHN0YXRpYyBhdG9taWNfdCBtc21fdWFydF9uZXh0X2lkID0gQVRPTUlDX0lOSVQoMCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV91YXJ0ZG1fdGFibGVbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLXVhcnRkbSIgfSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLXVhcnRkbS12MS4xIiwgLmRhdGEgPSAodm9pZCAqKVVBUlRETV8xUDEgfSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLXVhcnRkbS12MS4yIiwgLmRhdGEgPSAodm9pZCAqKVVBUlRETV8xUDIgfSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLXVhcnRkbS12MS4zIiwgLmRhdGEgPSAodm9pZCAqKVVBUlRETV8xUDMgfSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLXVhcnRkbS12MS40IiwgLmRhdGEgPSAodm9pZCAqKVVBUlRETV8xUDQgfSwKIAl7IH0KIH07CiAKQEAgLTkwOSw2ICsxMDQxLDcgQEAKIAlzdHJ1Y3QgbXNtX3BvcnQgKm1zbV9wb3J0OwogCXN0cnVjdCByZXNvdXJjZSAqcmVzb3VyY2U7CiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydDsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZDsKIAlpbnQgaXJxOwogCiAJaWYgKHBkZXYtPmlkID09IC0xKQpAQCAtOTIzLDggKzEwNTYsOSBAQAogCXBvcnQtPmRldiA9ICZwZGV2LT5kZXY7CiAJbXNtX3BvcnQgPSBVQVJUX1RPX01TTShwb3J0KTsKIAotCWlmIChvZl9tYXRjaF9kZXZpY2UobXNtX3VhcnRkbV90YWJsZSwgJnBkZXYtPmRldikpCi0JCW1zbV9wb3J0LT5pc191YXJ0ZG0gPSAxOworCWlkID0gb2ZfbWF0Y2hfZGV2aWNlKG1zbV91YXJ0ZG1fdGFibGUsICZwZGV2LT5kZXYpOworCWlmIChpZCkKKwkJbXNtX3BvcnQtPmlzX3VhcnRkbSA9ICh1bnNpZ25lZCBsb25nKWlkLT5kYXRhOwogCWVsc2UKIAkJbXNtX3BvcnQtPmlzX3VhcnRkbSA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tc21fc2VyaWFsLmggYi9kcml2ZXJzL3R0eS9zZXJpYWwvbXNtX3NlcmlhbC5oCmluZGV4IDQ2OWZkYTUuLjFlOWI2OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tc21fc2VyaWFsLmgKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL21zbV9zZXJpYWwuaApAQCAtNTksNiArNTksNyBAQAogI2RlZmluZSBVQVJUX0NSX0NNRF9SRVNFVF9SRlIJCSgxNCA8PCA0KQogI2RlZmluZSBVQVJUX0NSX0NNRF9QUk9URUNUSU9OX0VOCSgxNiA8PCA0KQogI2RlZmluZSBVQVJUX0NSX0NNRF9TVEFMRV9FVkVOVF9FTkFCTEUJKDgwIDw8IDQpCisjZGVmaW5lIFVBUlRfQ1JfQ01EX0ZPUkNFX1NUQUxFCQkoNCA8PCA4KQogI2RlZmluZSBVQVJUX0NSX0NNRF9SRVNFVF9UWF9SRUFEWQkoMyA8PCA4KQogI2RlZmluZSBVQVJUX0NSX1RYX0RJU0FCTEUJCSgxIDw8IDMpCiAjZGVmaW5lIFVBUlRfQ1JfVFhfRU5BQkxFCQkoMSA8PCAyKQpAQCAtMTEzLDYgKzExNCwxNCBAQAogI2RlZmluZSBHU0JJX1BST1RPQ09MX1VBUlQJMHg0MAogI2RlZmluZSBHU0JJX1BST1RPQ09MX0lETEUJMHgwCiAKKyNkZWZpbmUgVUFSVERNX1JYRlMJCTB4NTAKKyNkZWZpbmUgVUFSVERNX1JYRlNfQlVGX1NISUZUCTB4NworI2RlZmluZSBVQVJURE1fUlhGU19CVUZfTUFTSwkweDcKKworI2RlZmluZSBVQVJURE1fRE1FTgkJMHgzQworI2RlZmluZSBVQVJURE1fRE1FTl9SWF9TQ19FTkFCTEUgQklUKDUpCisjZGVmaW5lIFVBUlRETV9ETUVOX1RYX1NDX0VOQUJMRSBCSVQoNCkKKwogI2RlZmluZSBVQVJURE1fRE1SWAkJMHgzNAogI2RlZmluZSBVQVJURE1fTkNGX1RYCQkweDQwCiAjZGVmaW5lIFVBUlRETV9SWF9UT1RBTF9TTkFQCTB4MzgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9vbWFwLXNlcmlhbC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL29tYXAtc2VyaWFsLmMKaW5kZXggNzdmMDM1MS4uZGQ4YjFhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL29tYXAtc2VyaWFsLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL29tYXAtc2VyaWFsLmMKQEAgLTM0Miw3ICszNDIsMTQgQEAKIAogCWlmICgodXAtPnJzNDg1LmZsYWdzICYgU0VSX1JTNDg1X0VOQUJMRUQpICYmCiAJICAgICEodXAtPnJzNDg1LmZsYWdzICYgU0VSX1JTNDg1X1JYX0RVUklOR19UWCkpIHsKLQkJdXAtPmllciA9IFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREk7CisJCS8qCisJCSAqIEVtcHR5IHRoZSBSWCBGSUZPLCB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gYW55dGhpbmcKKwkJICogcmVjZWl2ZWQgZHVyaW5nIHRoZSBoYWxmLWR1cGxleCB0cmFuc21pc3Npb24uCisJCSAqLworCQlzZXJpYWxfb3V0KHVwLCBVQVJUX0ZDUiwgdXAtPmZjciB8IFVBUlRfRkNSX0NMRUFSX1JDVlIpOworCQkvKiBSZS1lbmFibGUgUlggaW50ZXJydXB0cyAqLworCQl1cC0+aWVyIHw9IFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREk7CisJCXVwLT5wb3J0LnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfRFI7CiAJCXNlcmlhbF9vdXQodXAsIFVBUlRfSUVSLCB1cC0+aWVyKTsKIAl9CiAKQEAgLTM1NSw3ICszNjIsNyBAQAogCXN0cnVjdCB1YXJ0X29tYXBfcG9ydCAqdXAgPSB0b191YXJ0X29tYXBfcG9ydChwb3J0KTsKIAogCXBtX3J1bnRpbWVfZ2V0X3N5bmModXAtPmRldik7Ci0JdXAtPmllciAmPSB+VUFSVF9JRVJfUkxTSTsKKwl1cC0+aWVyICY9IH4oVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESSk7CiAJdXAtPnBvcnQucmVhZF9zdGF0dXNfbWFzayAmPSB+VUFSVF9MU1JfRFI7CiAJc2VyaWFsX291dCh1cCwgVUFSVF9JRVIsIHVwLT5pZXIpOwogCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kodXAtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvcGNoX3VhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9wY2hfdWFydC5jCmluZGV4IDhmYTExMzQuLjA5MzFiM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9wY2hfdWFydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9wY2hfdWFydC5jCkBAIC0xNzYyLDcgKzE3NjIsOSBAQAogCWludCBmaWZvc2l6ZTsKIAlpbnQgcG9ydF90eXBlOwogCXN0cnVjdCBwY2hfdWFydF9kcml2ZXJfZGF0YSAqYm9hcmQ7CisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCiAJY2hhciBuYW1lWzMyXTsJLyogZm9yIGRlYnVnZnMgZmlsZSBuYW1lICovCisjZW5kaWYKIAogCWJvYXJkID0gJmRydl9kYXRbaWQtPmRyaXZlcl9kYXRhXTsKIAlwb3J0X3R5cGUgPSBib2FyZC0+cG9ydF90eXBlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3NhbXN1bmcuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zYW1zdW5nLmMKaW5kZXggOWNkNzA2ZC4uMjNmNDU5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3NhbXN1bmcuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2Ftc3VuZy5jCkBAIC0xMjgyLDYgKzEyODIsMTQgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBwcm9iZV9lcnI7CiAKKwlpZiAoIXMzYzI0eHhfdWFydF9kcnYuc3RhdGUpIHsKKwkJcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJnMzYzI0eHhfdWFydF9kcnYpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgU2Ftc3VuZyBVQVJUIGRyaXZlclxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCiAJZGJnKCIlczogYWRkaW5nIHBvcnRcbiIsIF9fZnVuY19fKTsKIAl1YXJ0X2FkZF9vbmVfcG9ydCgmczNjMjR4eF91YXJ0X2RydiwgJm91cnBvcnQtPnBvcnQpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsICZvdXJwb3J0LT5wb3J0KTsKQEAgLTEzMjEsNiArMTMyOSw4IEBACiAJCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZzM2MyNHh4X3VhcnRfZHJ2LCBwb3J0KTsKIAl9CiAKKwl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZzM2MyNHh4X3VhcnRfZHJ2KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xODIwLDM1ICsxODMwLDcgQEAKIAl9LAogfTsKIAotLyogbW9kdWxlIGluaXRpYWxpc2F0aW9uIGNvZGUgKi8KLQotc3RhdGljIGludCBfX2luaXQgczNjMjR4eF9zZXJpYWxfbW9kaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmczNjMjR4eF91YXJ0X2Rydik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgU2Ftc3VuZyBVQVJUIGRyaXZlclxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzYW1zdW5nX3NlcmlhbF9kcml2ZXIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiRmFpbGVkIHRvIHJlZ2lzdGVyIHBsYXRmb3JtIGRyaXZlclxuIik7Ci0JCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnMzYzI0eHhfdWFydF9kcnYpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzM2MyNHh4X3NlcmlhbF9tb2RleGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNhbXN1bmdfc2VyaWFsX2RyaXZlcik7Ci0JdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmczNjMjR4eF91YXJ0X2Rydik7Ci19Ci0KLW1vZHVsZV9pbml0KHMzYzI0eHhfc2VyaWFsX21vZGluaXQpOwotbW9kdWxlX2V4aXQoczNjMjR4eF9zZXJpYWxfbW9kZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHNhbXN1bmdfc2VyaWFsX2RyaXZlcik7CiAKIE1PRFVMRV9BTElBUygicGxhdGZvcm06c2Ftc3VuZy11YXJ0Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgU29DIFNlcmlhbCBwb3J0IGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3NlcmlhbF9jb3JlLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2VyaWFsX2NvcmUuYwppbmRleCBlY2UyMDQ5Li4yY2Y1NjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2VyaWFsX2NvcmUuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2VyaWFsX2NvcmUuYwpAQCAtMTMxOSw5ICsxMzE5LDkgQEAKIAl1cG9ydCA9IHN0YXRlLT51YXJ0X3BvcnQ7CiAJcG9ydCA9ICZzdGF0ZS0+cG9ydDsKIAotCXByX2RlYnVnKCJ1YXJ0X2Nsb3NlKCVkKSBjYWxsZWRcbiIsIHVwb3J0LT5saW5lKTsKKwlwcl9kZWJ1ZygidWFydF9jbG9zZSglZCkgY2FsbGVkXG4iLCB1cG9ydCA/IHVwb3J0LT5saW5lIDogLTEpOwogCi0JaWYgKHR0eV9wb3J0X2Nsb3NlX3N0YXJ0KHBvcnQsIHR0eSwgZmlscCkgPT0gMCkKKwlpZiAoIXBvcnQtPmNvdW50IHx8IHR0eV9wb3J0X2Nsb3NlX3N0YXJ0KHBvcnQsIHR0eSwgZmlscCkgPT0gMCkKIAkJcmV0dXJuOwogCiAJLyoKQEAgLTE3NjIsNyArMTc2Miw3IEBACiB9CiAKIC8qKgotICoJdWFydF9wYXJzZV9vcHRpb25zIC0gUGFyc2Ugc2VyaWFsIHBvcnQgYmF1ZC9wYXJpdHkvYml0cy9mbG93IGNvbnRyby4KKyAqCXVhcnRfcGFyc2Vfb3B0aW9ucyAtIFBhcnNlIHNlcmlhbCBwb3J0IGJhdWQvcGFyaXR5L2JpdHMvZmxvdyBjb250cm9sLgogICoJQG9wdGlvbnM6IHBvaW50ZXIgdG8gb3B0aW9uIHN0cmluZwogICoJQGJhdWQ6IHBvaW50ZXIgdG8gYW4gJ2ludCcgdmFyaWFibGUgZm9yIHRoZSBiYXVkIHJhdGUuCiAgKglAcGFyaXR5OiBwb2ludGVyIHRvIGFuICdpbnQnIHZhcmlhYmxlIGZvciB0aGUgcGFyaXR5LgpAQCAtMjYwOSw3ICsyNjA5LDcgQEAKIAogCS8qCiAJICogUmVnaXN0ZXIgdGhlIHBvcnQgd2hldGhlciBpdCdzIGRldGVjdGVkIG9yIG5vdC4gIFRoaXMgYWxsb3dzCi0JICogc2V0c2VyaWFsIHRvIGJlIHVzZWQgdG8gYWx0ZXIgdGhpcyBwb3J0cyBwYXJhbWV0ZXJzLgorCSAqIHNldHNlcmlhbCB0byBiZSB1c2VkIHRvIGFsdGVyIHRoaXMgcG9ydCdzIHBhcmFtZXRlcnMuCiAJICovCiAJdHR5X2RldiA9IHR0eV9wb3J0X3JlZ2lzdGVyX2RldmljZV9hdHRyKHBvcnQsIGRydi0+dHR5X2RyaXZlciwKIAkJCXVwb3J0LT5saW5lLCB1cG9ydC0+ZGV2LCBwb3J0LCB0dHlfZGV2X2F0dHJfZ3JvdXBzKTsKQEAgLTI2NDUsNiArMjY0NSw3IEBACiB7CiAJc3RydWN0IHVhcnRfc3RhdGUgKnN0YXRlID0gZHJ2LT5zdGF0ZSArIHVwb3J0LT5saW5lOwogCXN0cnVjdCB0dHlfcG9ydCAqcG9ydCA9ICZzdGF0ZS0+cG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWludCByZXQgPSAwOwogCiAJQlVHX09OKGluX2ludGVycnVwdCgpKTsKQEAgLTI2NzMsOCArMjY3NCwxNyBAQAogCSAqLwogCXR0eV91bnJlZ2lzdGVyX2RldmljZShkcnYtPnR0eV9kcml2ZXIsIHVwb3J0LT5saW5lKTsKIAotCWlmIChwb3J0LT50dHkpCisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldChwb3J0KTsKKwlpZiAodHR5KSB7CiAJCXR0eV92aGFuZ3VwKHBvcnQtPnR0eSk7CisJCXR0eV9rcmVmX3B1dCh0dHkpOworCX0KKworCS8qCisJICogSWYgdGhlIHBvcnQgaXMgdXNlZCBhcyBhIGNvbnNvbGUsIHVucmVnaXN0ZXIgaXQKKwkgKi8KKwlpZiAodWFydF9jb25zb2xlKHVwb3J0KSkKKwkJdW5yZWdpc3Rlcl9jb25zb2xlKHVwb3J0LT5jb25zKTsKIAogCS8qCiAJICogRnJlZSB0aGUgcG9ydCBJTyBhbmQgbWVtb3J5IHJlc291cmNlcywgaWYgYW55LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3NoLXNjaS5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3NoLXNjaS5jCmluZGV4IGJlMzNkMmIuLjg4MjM2ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zaC1zY2kuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2gtc2NpLmMKQEAgLTQyOCw3ICs0MjgsNyBAQAogCQljZmctPnJlZ3R5cGUgPSBTQ0l4X0hTQ0lGX1JFR1RZUEU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgcHJvYmUgcmVnaXN0ZXIgbWFwIGZvciBnaXZlbiBwb3J0XG4iKTsKKwkJcHJfZXJyKCJDYW4ndCBwcm9iZSByZWdpc3RlciBtYXAgZm9yIGdpdmVuIHBvcnRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTc4OCw3ICs3ODgsNyBAQAogCQlpZiAodHR5X2luc2VydF9mbGlwX2NoYXIodHBvcnQsIDAsIFRUWV9PVkVSUlVOKSkKIAkJCWNvcGllZCsrOwogCi0JCWRldl9ub3RpY2UocG9ydC0+ZGV2LCAib3ZlcnJ1biBlcnJvciIpOworCQlkZXZfbm90aWNlKHBvcnQtPmRldiwgIm92ZXJydW4gZXJyb3JcbiIpOwogCX0KIAogCWlmIChzdGF0dXMgJiBTQ3hTUl9GRVIocG9ydCkpIHsKQEAgLTgzMCw3ICs4MzAsNyBAQAogCQlpZiAodHR5X2luc2VydF9mbGlwX2NoYXIodHBvcnQsIDAsIFRUWV9QQVJJVFkpKQogCQkJY29waWVkKys7CiAKLQkJZGV2X25vdGljZShwb3J0LT5kZXYsICJwYXJpdHkgZXJyb3IiKTsKKwkJZGV2X25vdGljZShwb3J0LT5kZXYsICJwYXJpdHkgZXJyb3JcbiIpOwogCX0KIAogCWlmIChjb3BpZWQpCkBAIC05MTEsNyArOTExLDcgQEAKIAkJLyogRGlzYWJsZSBmdXR1cmUgUnggaW50ZXJydXB0cyAqLwogCQlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZBIHx8IHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGQikgewogCQkJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7Ci0JCQlzY3IgfD0gMHg0MDAwOworCQkJc2NyIHw9IFNDU0NSX1JEUlFFOwogCQl9IGVsc2UgewogCQkJc2NyICY9IH5TQ1NDUl9SSUU7CiAJCX0KQEAgLTEwNDEsOCArMTA0MSw3IEBACiAKIAlzY2lfcG9ydCA9IGNvbnRhaW5lcl9vZihzZWxmLCBzdHJ1Y3Qgc2NpX3BvcnQsIGZyZXFfdHJhbnNpdGlvbik7CiAKLQlpZiAoKHBoYXNlID09IENQVUZSRVFfUE9TVENIQU5HRSkgfHwKLQkgICAgKHBoYXNlID09IENQVUZSRVFfUkVTVU1FQ0hBTkdFKSkgeworCWlmIChwaGFzZSA9PSBDUFVGUkVRX1BPU1RDSEFOR0UpIHsKIAkJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZzY2lfcG9ydC0+cG9ydDsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwpAQCAtMTIwMCw3ICsxMTk5LDkgQEAKIAkJICovCiAJCXJlZyA9IHNjaV9nZXRyZWcocG9ydCwgU0NGQ1IpOwogCQlpZiAocmVnLT5zaXplKQotCQkJc2VyaWFsX3BvcnRfb3V0KHBvcnQsIFNDRkNSLCBzZXJpYWxfcG9ydF9pbihwb3J0LCBTQ0ZDUikgfCAxKTsKKwkJCXNlcmlhbF9wb3J0X291dChwb3J0LCBTQ0ZDUiwKKwkJCQkJc2VyaWFsX3BvcnRfaW4ocG9ydCwgU0NGQ1IpIHwKKwkJCQkJU0NGQ1JfTE9PUCk7CiAJfQogfQogCkBAIC0xMjkwLDcgKzEyOTEsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGNvdW50OwogCi0JZGV2X2RiZyhwb3J0LT5kZXYsICIlcyglZCkgYWN0aXZlICMlZFxuIiwgX19mdW5jX18sIHBvcnQtPmxpbmUsIHMtPmFjdGl2ZV9yeCk7CisJZGV2X2RiZyhwb3J0LT5kZXYsICIlcyglZCkgYWN0aXZlICMlZFxuIiwKKwkJX19mdW5jX18sIHBvcnQtPmxpbmUsIHMtPmFjdGl2ZV9yeCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCkBAIC0xMzY2LDggKzEzNjgsOCBAQAogCQkJc2NpX3J4X2RtYV9yZWxlYXNlKHMsIHRydWUpOwogCQkJcmV0dXJuOwogCQl9Ci0JCWRldl9kYmcocy0+cG9ydC5kZXYsICIlcygpOiBjb29raWUgJWQgdG8gIyVkXG4iLCBfX2Z1bmNfXywKLQkJCXMtPmNvb2tpZV9yeFtpXSwgaSk7CisJCWRldl9kYmcocy0+cG9ydC5kZXYsICIlcygpOiBjb29raWUgJWQgdG8gIyVkXG4iLAorCQkJX19mdW5jX18sIHMtPmNvb2tpZV9yeFtpXSwgaSk7CiAJfQogCiAJcy0+YWN0aXZlX3J4ID0gcy0+Y29va2llX3J4WzBdOwpAQCAtMTQyNiw4ICsxNDI4LDggQEAKIAogCXMtPmFjdGl2ZV9yeCA9IHMtPmNvb2tpZV9yeFshbmV3XTsKIAotCWRldl9kYmcocG9ydC0+ZGV2LCAiJXM6IGNvb2tpZSAlZCAjJWQsIG5ldyBhY3RpdmUgIyVkXG4iLCBfX2Z1bmNfXywKLQkJcy0+Y29va2llX3J4W25ld10sIG5ldywgcy0+YWN0aXZlX3J4KTsKKwlkZXZfZGJnKHBvcnQtPmRldiwgIiVzOiBjb29raWUgJWQgIyVkLCBuZXcgYWN0aXZlICMlZFxuIiwKKwkJX19mdW5jX18sIHMtPmNvb2tpZV9yeFtuZXddLCBuZXcsIHMtPmFjdGl2ZV9yeCk7CiB9CiAKIHN0YXRpYyB2b2lkIHdvcmtfZm5fdHgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtMTQ4MCw4ICsxNDgyLDggQEAKIAkJcmV0dXJuOwogCX0KIAotCWRldl9kYmcocG9ydC0+ZGV2LCAiJXM6ICVwOiAlZC4uLiVkLCBjb29raWUgJWRcbiIsIF9fZnVuY19fLAotCQl4bWl0LT5idWYsIHhtaXQtPnRhaWwsIHhtaXQtPmhlYWQsIHMtPmNvb2tpZV90eCk7CisJZGV2X2RiZyhwb3J0LT5kZXYsICIlczogJXA6ICVkLi4uJWQsIGNvb2tpZSAlZFxuIiwKKwkJX19mdW5jX18sIHhtaXQtPmJ1ZiwgeG1pdC0+dGFpbCwgeG1pdC0+aGVhZCwgcy0+Y29va2llX3R4KTsKIAogCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKGNoYW4pOwogfQpAQCAtMTQ5Niw5ICsxNDk4LDkgQEAKIAlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZBIHx8IHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGQikgewogCQl1MTYgbmV3LCBzY3IgPSBzZXJpYWxfcG9ydF9pbihwb3J0LCBTQ1NDUik7CiAJCWlmIChzLT5jaGFuX3R4KQotCQkJbmV3ID0gc2NyIHwgMHg4MDAwOworCQkJbmV3ID0gc2NyIHwgU0NTQ1JfVERSUUU7CiAJCWVsc2UKLQkJCW5ldyA9IHNjciAmIH4weDgwMDA7CisJCQluZXcgPSBzY3IgJiB+U0NTQ1JfVERSUUU7CiAJCWlmIChuZXcgIT0gc2NyKQogCQkJc2VyaWFsX3BvcnRfb3V0KHBvcnQsIFNDU0NSLCBuZXcpOwogCX0KQEAgLTE1MjUsNyArMTUyNyw3IEBACiAJY3RybCA9IHNlcmlhbF9wb3J0X2luKHBvcnQsIFNDU0NSKTsKIAogCWlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJRkEgfHwgcG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZCKQotCQljdHJsICY9IH4weDgwMDA7CisJCWN0cmwgJj0gflNDU0NSX1REUlFFOwogCiAJY3RybCAmPSB+U0NTQ1JfVElFOwogCkBAIC0xNTM5LDcgKzE1NDEsNyBAQAogCWN0cmwgPSBzZXJpYWxfcG9ydF9pbihwb3J0LCBTQ1NDUikgfCBwb3J0X3J4X2lycV9tYXNrKHBvcnQpOwogCiAJaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGQSB8fCBwb3J0LT50eXBlID09IFBPUlRfU0NJRkIpCi0JCWN0cmwgJj0gfjB4NDAwMDsKKwkJY3RybCAmPSB+U0NTQ1JfUkRSUUU7CiAKIAlzZXJpYWxfcG9ydF9vdXQocG9ydCwgU0NTQ1IsIGN0cmwpOwogfQpAQCAtMTU1MSw3ICsxNTUzLDcgQEAKIAljdHJsID0gc2VyaWFsX3BvcnRfaW4ocG9ydCwgU0NTQ1IpOwogCiAJaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGQSB8fCBwb3J0LT50eXBlID09IFBPUlRfU0NJRkIpCi0JCWN0cmwgJj0gfjB4NDAwMDsKKwkJY3RybCAmPSB+U0NTQ1JfUkRSUUU7CiAKIAljdHJsICY9IH5wb3J0X3J4X2lycV9tYXNrKHBvcnQpOwogCkBAIC0xNjAwLDggKzE2MDIsOCBAQAogewogCXN0cnVjdCBzaF9kbWFlX3NsYXZlICpwYXJhbSA9IHNsYXZlOwogCi0JZGV2X2RiZyhjaGFuLT5kZXZpY2UtPmRldiwgIiVzOiBzbGF2ZSBJRCAlZFxuIiwgX19mdW5jX18sCi0JCXBhcmFtLT5zaGRtYV9zbGF2ZS5zbGF2ZV9pZCk7CisJZGV2X2RiZyhjaGFuLT5kZXZpY2UtPmRldiwgIiVzOiBzbGF2ZSBJRCAlZFxuIiwKKwkJX19mdW5jX18sIHBhcmFtLT5zaGRtYV9zbGF2ZS5zbGF2ZV9pZCk7CiAKIAljaGFuLT5wcml2YXRlID0gJnBhcmFtLT5zaGRtYV9zbGF2ZTsKIAlyZXR1cm4gdHJ1ZTsKQEAgLTE2MTQsNyArMTYxNiw3IEBACiAJdTE2IHNjciA9IHNlcmlhbF9wb3J0X2luKHBvcnQsIFNDU0NSKTsKIAogCWlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJRkEgfHwgcG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZCKSB7Ci0JCXNjciAmPSB+MHg0MDAwOworCQlzY3IgJj0gflNDU0NSX1JEUlFFOwogCQllbmFibGVfaXJxKHMtPmlycXNbU0NJeF9SWElfSVJRXSk7CiAJfQogCXNlcmlhbF9wb3J0X291dChwb3J0LCBTQ1NDUiwgc2NyIHwgU0NTQ1JfUklFKTsKQEAgLTE2MzAsOCArMTYzMiw3IEBACiAJZG1hX2NhcF9tYXNrX3QgbWFzazsKIAlpbnQgbmVudDsKIAotCWRldl9kYmcocG9ydC0+ZGV2LCAiJXM6IHBvcnQgJWRcbiIsIF9fZnVuY19fLAotCQlwb3J0LT5saW5lKTsKKwlkZXZfZGJnKHBvcnQtPmRldiwgIiVzOiBwb3J0ICVkXG4iLCBfX2Z1bmNfXywgcG9ydC0+bGluZSk7CiAKIAlpZiAocy0+Y2ZnLT5kbWFfc2xhdmVfdHggPD0gMCB8fCBzLT5jZmctPmRtYV9zbGF2ZV9yeCA8PSAwKQogCQlyZXR1cm47CkBAIC0xNjU5LDcgKzE2NjAsOCBAQAogCQlpZiAoIW5lbnQpCiAJCQlzY2lfdHhfZG1hX3JlbGVhc2UocywgZmFsc2UpOwogCQllbHNlCi0JCQlkZXZfZGJnKHBvcnQtPmRldiwgIiVzOiBtYXBwZWQgJWRAJXAgdG8gJXBhZFxuIiwgX19mdW5jX18sCisJCQlkZXZfZGJnKHBvcnQtPmRldiwgIiVzOiBtYXBwZWQgJWRAJXAgdG8gJXBhZFxuIiwKKwkJCQlfX2Z1bmNfXywKIAkJCQlzZ19kbWFfbGVuKCZzLT5zZ190eCksIHBvcnQtPnN0YXRlLT54bWl0LmJ1ZiwKIAkJCQkmc2dfZG1hX2FkZHJlc3MoJnMtPnNnX3R4KSk7CiAKQEAgLTE4NzEsMTMgKzE4NzMsMTMgQEAKIAlzbXJfdmFsID0gc2VyaWFsX3BvcnRfaW4ocG9ydCwgU0NTTVIpICYgMzsKIAogCWlmICgodGVybWlvcy0+Y19jZmxhZyAmIENTSVpFKSA9PSBDUzcpCi0JCXNtcl92YWwgfD0gMHg0MDsKKwkJc21yX3ZhbCB8PSBTQ1NNUl9DSFI7CiAJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJFTkIpCi0JCXNtcl92YWwgfD0gMHgyMDsKKwkJc21yX3ZhbCB8PSBTQ1NNUl9QRTsKIAlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUk9ERCkKLQkJc21yX3ZhbCB8PSAweDMwOworCQlzbXJfdmFsIHw9IFNDU01SX1BFIHwgU0NTTVJfT0REOwogCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NUT1BCKQotCQlzbXJfdmFsIHw9IDB4MDg7CisJCXNtcl92YWwgfD0gU0NTTVJfU1RPUDsKIAogCXVhcnRfdXBkYXRlX3RpbWVvdXQocG9ydCwgdGVybWlvcy0+Y19jZmxhZywgYmF1ZCk7CiAKQEAgLTE4ODUsNyArMTg4Nyw3IEBACiAJCV9fZnVuY19fLCBzbXJfdmFsLCBja3MsIHQsIHMtPmNmZy0+c2NzY3IpOwogCiAJaWYgKHQgPj0gMCkgewotCQlzZXJpYWxfcG9ydF9vdXQocG9ydCwgU0NTTVIsIChzbXJfdmFsICYgfjMpIHwgY2tzKTsKKwkJc2VyaWFsX3BvcnRfb3V0KHBvcnQsIFNDU01SLCAoc21yX3ZhbCAmIH5TQ1NNUl9DS1MpIHwgY2tzKTsKIAkJc2VyaWFsX3BvcnRfb3V0KHBvcnQsIFNDQlJSLCB0KTsKIAkJcmVnID0gc2NpX2dldHJlZyhwb3J0LCBIU1NSUik7CiAJCWlmIChyZWctPnNpemUpCkBAIC0xOTMzLDggKzE5MzUsNyBAQAogCWlmIChzLT5jaGFuX3J4KSB7CiAJCXMtPnJ4X3RpbWVvdXQgPSAocG9ydC0+dGltZW91dCAtIEhaIC8gNTApICogcy0+YnVmX2xlbl9yeCAqIDMgLwogCQkJcG9ydC0+Zmlmb3NpemUgLyAyOwotCQlkZXZfZGJnKHBvcnQtPmRldiwKLQkJCSJETUEgUnggdC1vdXQgJXVtcywgdHR5IHQtb3V0ICV1IGppZmZpZXNcbiIsCisJCWRldl9kYmcocG9ydC0+ZGV2LCAiRE1BIFJ4IHQtb3V0ICV1bXMsIHR0eSB0LW91dCAldSBqaWZmaWVzXG4iLAogCQkJcy0+cnhfdGltZW91dCAqIDEwMDAgLyBIWiwgcG9ydC0+dGltZW91dCk7CiAJCWlmIChzLT5yeF90aW1lb3V0IDwgbXNlY3NfdG9famlmZmllcygyMCkpCiAJCQlzLT5yeF90aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcygyMCk7CkBAIC0xOTUzLDcgKzE5NTQsNyBAQAogCXN0cnVjdCBzY2lfcG9ydCAqc2NpX3BvcnQgPSB0b19zY2lfcG9ydChwb3J0KTsKIAogCXN3aXRjaCAoc3RhdGUpIHsKLQljYXNlIDM6CisJY2FzZSBVQVJUX1BNX1NUQVRFX09GRjoKIAkJc2NpX3BvcnRfZGlzYWJsZShzY2lfcG9ydCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0yMDE4LDcgKzIwMTksNyBAQAogCQkgKiBuZWVkIHRvIGRvIGFueSByZW1hcHBpbmcsIGp1c3QgY2FzdCB0aGUgY29va2llCiAJCSAqIGRpcmVjdGx5LgogCQkgKi8KLQkJcG9ydC0+bWVtYmFzZSA9ICh2b2lkIF9faW9tZW0gKilwb3J0LT5tYXBiYXNlOworCQlwb3J0LT5tZW1iYXNlID0gKHZvaWQgX19pb21lbSAqKSh1aW50cHRyX3QpcG9ydC0+bWFwYmFzZTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTIzODksOCArMjM5MCw3IEBACiAKICNlbmRpZiAvKiBDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFICovCiAKLXN0YXRpYyBjaGFyIGJhbm5lcltdIF9faW5pdGRhdGEgPQotCUtFUk5fSU5GTyAiU3VwZXJIIChIKVNDSShGKSBkcml2ZXIgaW5pdGlhbGl6ZWRcbiI7CitzdGF0aWMgY29uc3QgY2hhciBiYW5uZXJbXSBfX2luaXRjb25zdCA9ICJTdXBlckggKEgpU0NJKEYpIGRyaXZlciBpbml0aWFsaXplZCI7CiAKIHN0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgc2NpX3VhcnRfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKQEAgLTI0MjQsMjUgKzI0MjQsMjUgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX3NjaV9tYXRjaFtdID0gewogCXsKIAkJLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzY2lmIiwKLQkJLmRhdGEgPSAodm9pZCAqKSYoY29uc3Qgc3RydWN0IHNjaV9wb3J0X2luZm8pIHsKKwkJLmRhdGEgPSAmKGNvbnN0IHN0cnVjdCBzY2lfcG9ydF9pbmZvKSB7CiAJCQkudHlwZSA9IFBPUlRfU0NJRiwKIAkJCS5yZWd0eXBlID0gU0NJeF9TSDRfU0NJRl9SRUdUWVBFLAogCQl9LAogCX0sIHsKIAkJLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzY2lmYSIsCi0JCS5kYXRhID0gKHZvaWQgKikmKGNvbnN0IHN0cnVjdCBzY2lfcG9ydF9pbmZvKSB7CisJCS5kYXRhID0gJihjb25zdCBzdHJ1Y3Qgc2NpX3BvcnRfaW5mbykgewogCQkJLnR5cGUgPSBQT1JUX1NDSUZBLAogCQkJLnJlZ3R5cGUgPSBTQ0l4X1NDSUZBX1JFR1RZUEUsCiAJCX0sCiAJfSwgewogCQkuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHNjaWZiIiwKLQkJLmRhdGEgPSAodm9pZCAqKSYoY29uc3Qgc3RydWN0IHNjaV9wb3J0X2luZm8pIHsKKwkJLmRhdGEgPSAmKGNvbnN0IHN0cnVjdCBzY2lfcG9ydF9pbmZvKSB7CiAJCQkudHlwZSA9IFBPUlRfU0NJRkIsCiAJCQkucmVndHlwZSA9IFNDSXhfU0NJRkJfUkVHVFlQRSwKIAkJfSwKIAl9LCB7CiAJCS5jb21wYXRpYmxlID0gInJlbmVzYXMsaHNjaWYiLAotCQkuZGF0YSA9ICh2b2lkICopJihjb25zdCBzdHJ1Y3Qgc2NpX3BvcnRfaW5mbykgeworCQkuZGF0YSA9ICYoY29uc3Qgc3RydWN0IHNjaV9wb3J0X2luZm8pIHsKIAkJCS50eXBlID0gUE9SVF9IU0NJRiwKIAkJCS5yZWd0eXBlID0gU0NJeF9IU0NJRl9SRUdUWVBFLAogCQl9LApAQCAtMjUwMiwxMSArMjUwMiw5IEBACiAKIAkvKiBTYW5pdHkgY2hlY2sgKi8KIAlpZiAodW5saWtlbHkoaW5kZXggPj0gU0NJX05QT1JUUykpIHsKLQkJZGV2X25vdGljZSgmZGV2LT5kZXYsICJBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIHBvcnQgIgotCQkJICAgIiVkIHdoZW4gb25seSAlZCBhcmUgYXZhaWxhYmxlLlxuIiwKKwkJZGV2X25vdGljZSgmZGV2LT5kZXYsICJBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIHBvcnQgJWQgd2hlbiBvbmx5ICVkIGFyZSBhdmFpbGFibGVcbiIsCiAJCQkgICBpbmRleCsxLCBTQ0lfTlBPUlRTKTsKLQkJZGV2X25vdGljZSgmZGV2LT5kZXYsICJDb25zaWRlciBidW1waW5nICIKLQkJCSAgICJDT05GSUdfU0VSSUFMX1NIX1NDSV9OUl9VQVJUUyFcbiIpOworCQlkZXZfbm90aWNlKCZkZXYtPmRldiwgIkNvbnNpZGVyIGJ1bXBpbmcgQ09ORklHX1NFUklBTF9TSF9TQ0lfTlJfVUFSVFMhXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNTY0LDYgKzI1NjIsNyBAQAogCXJldCA9IGNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJnNwLT5mcmVxX3RyYW5zaXRpb24sCiAJCQkJCUNQVUZSRVFfVFJBTlNJVElPTl9OT1RJRklFUik7CiAJaWYgKHVubGlrZWx5KHJldCA8IDApKSB7CisJCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZzY2lfdWFydF9kcml2ZXIsICZzcC0+cG9ydCk7CiAJCXNjaV9jbGVhbnVwX3NpbmdsZShzcCk7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtMjYxNSw3ICsyNjE0LDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JcHJpbnRrKGJhbm5lcik7CisJcHJfaW5mbygiJXNcbiIsIGJhbm5lcik7CiAKIAlyZXQgPSB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmc2NpX3VhcnRfZHJpdmVyKTsKIAlpZiAobGlrZWx5KHJldCA9PSAwKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3NpcmZzb2NfdWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3NpcmZzb2NfdWFydC5jCmluZGV4IGI3YmZlMjQuLjY4YjBmZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zaXJmc29jX3VhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2lyZnNvY191YXJ0LmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtZGlyZWN0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9zaXJmc29jX2RtYS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIApAQCAtMTczLDcgKzE3Miw3IEBACiAJc3RydWN0IHNpcmZzb2NfcmVnaXN0ZXIgKnVyZWcgPSAmc2lyZnBvcnQtPnVhcnRfcmVnLT51YXJ0X3JlZzsKIAlzdHJ1Y3Qgc2lyZnNvY19pbnRfZW4gKnVpbnRfZW4gPSAmc2lyZnBvcnQtPnVhcnRfcmVnLT51YXJ0X2ludF9lbjsKIAotCWlmIChJU19ETUFfQ0hBTl9WQUxJRChzaXJmcG9ydC0+dHhfZG1hX25vKSkgeworCWlmIChzaXJmcG9ydC0+dHhfZG1hX2NoYW4pIHsKIAkJaWYgKHNpcmZwb3J0LT50eF9kbWFfc3RhdGUgPT0gVFhfRE1BX1JVTk5JTkcpIHsKIAkJCWRtYWVuZ2luZV9wYXVzZShzaXJmcG9ydC0+dHhfZG1hX2NoYW4pOwogCQkJc2lyZnBvcnQtPnR4X2RtYV9zdGF0ZSA9IFRYX0RNQV9QQVVTRTsKQEAgLTI4OCw3ICsyODcsNyBAQAogCXN0cnVjdCBzaXJmc29jX3VhcnRfcG9ydCAqc2lyZnBvcnQgPSB0b19zaXJmcG9ydChwb3J0KTsKIAlzdHJ1Y3Qgc2lyZnNvY19yZWdpc3RlciAqdXJlZyA9ICZzaXJmcG9ydC0+dWFydF9yZWctPnVhcnRfcmVnOwogCXN0cnVjdCBzaXJmc29jX2ludF9lbiAqdWludF9lbiA9ICZzaXJmcG9ydC0+dWFydF9yZWctPnVhcnRfaW50X2VuOwotCWlmIChJU19ETUFfQ0hBTl9WQUxJRChzaXJmcG9ydC0+dHhfZG1hX25vKSkKKwlpZiAoc2lyZnBvcnQtPnR4X2RtYV9jaGFuKQogCQlzaXJmc29jX3VhcnRfdHhfd2l0aF9kbWEoc2lyZnBvcnQpOwogCWVsc2UgewogCQlzaXJmc29jX3VhcnRfcGlvX3R4X2NoYXJzKHNpcmZwb3J0LCAxKTsKQEAgLTMxMCw3ICszMDksNyBAQAogCXN0cnVjdCBzaXJmc29jX2ludF9lbiAqdWludF9lbiA9ICZzaXJmcG9ydC0+dWFydF9yZWctPnVhcnRfaW50X2VuOwogCiAJd3JfcmVnbChwb3J0LCB1cmVnLT5zaXJmc29jX3J4X2ZpZm9fb3AsIDApOwotCWlmIChJU19ETUFfQ0hBTl9WQUxJRChzaXJmcG9ydC0+cnhfZG1hX25vKSkgeworCWlmIChzaXJmcG9ydC0+cnhfZG1hX2NoYW4pIHsKIAkJaWYgKCFzaXJmcG9ydC0+aXNfbWFyY28pCiAJCQl3cl9yZWdsKHBvcnQsIHVyZWctPnNpcmZzb2NfaW50X2VuX3JlZywKIAkJCQlyZF9yZWdsKHBvcnQsIHVyZWctPnNpcmZzb2NfaW50X2VuX3JlZykgJgpAQCAtNjc1LDcgKzY3NCw3IEBACiAJCXVhcnRfaGFuZGxlX2N0c19jaGFuZ2UocG9ydCwgY3RzX3N0YXR1cyk7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc3RhdGUtPnBvcnQuZGVsdGFfbXNyX3dhaXQpOwogCX0KLQlpZiAoSVNfRE1BX0NIQU5fVkFMSUQoc2lyZnBvcnQtPnJ4X2RtYV9ubykpIHsKKwlpZiAoc2lyZnBvcnQtPnJ4X2RtYV9jaGFuKSB7CiAJCWlmIChpbnRyX3N0YXR1cyAmIHVpbnRfc3QtPnNpcmZzb2NfcnhfdGltZW91dCkKIAkJCXNpcmZzb2NfdWFydF9oYW5kbGVfcnhfdG1vKHNpcmZwb3J0KTsKIAkJaWYgKGludHJfc3RhdHVzICYgdWludF9zdC0+c2lyZnNvY19yeF9kb25lKQpAQCAtNjg2LDcgKzY4NSw3IEBACiAJCQkJCVNJUkZTT0NfVUFSVF9JT19SWF9NQVhfQ05UKTsKIAl9CiAJaWYgKGludHJfc3RhdHVzICYgdWludF9zdC0+c2lyZnNvY190eGZpZm9fZW1wdHkpIHsKLQkJaWYgKElTX0RNQV9DSEFOX1ZBTElEKHNpcmZwb3J0LT50eF9kbWFfbm8pKQorCQlpZiAoc2lyZnBvcnQtPnR4X2RtYV9jaGFuKQogCQkJc2lyZnNvY191YXJ0X3R4X3dpdGhfZG1hKHNpcmZwb3J0KTsKIAkJZWxzZSB7CiAJCQlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpIHx8IHVhcnRfdHhfc3RvcHBlZChwb3J0KSkgewpAQCAtNzc4LDcgKzc3Nyw3IEBACiAJd3JfcmVnbChwb3J0LCB1cmVnLT5zaXJmc29jX3J4X2ZpZm9fb3AsIFNJUkZVQVJUX0ZJRk9fUkVTRVQpOwogCXdyX3JlZ2wocG9ydCwgdXJlZy0+c2lyZnNvY19yeF9maWZvX29wLCAwKTsKIAl3cl9yZWdsKHBvcnQsIHVyZWctPnNpcmZzb2NfcnhfZmlmb19vcCwgU0lSRlVBUlRfRklGT19TVEFSVCk7Ci0JaWYgKElTX0RNQV9DSEFOX1ZBTElEKHNpcmZwb3J0LT5yeF9kbWFfbm8pKQorCWlmIChzaXJmcG9ydC0+cnhfZG1hX2NoYW4pCiAJCXNpcmZzb2NfdWFydF9zdGFydF9uZXh0X3J4X2RtYShwb3J0KTsKIAllbHNlIHsKIAkJaWYgKCFzaXJmcG9ydC0+aXNfbWFyY28pCkBAIC0xMDE0LDExICsxMDEzLDExIEBACiAJCQkoc2FtcGxlX2Rpdl9yZWcgJiBTSVJGU09DX1VTUF9BU1lOQ19ESVYyX01BU0spIDw8CiAJCQlTSVJGU09DX1VTUF9BU1lOQ19ESVYyX09GRlNFVCk7CiAJfQotCWlmIChJU19ETUFfQ0hBTl9WQUxJRChzaXJmcG9ydC0+dHhfZG1hX25vKSkKKwlpZiAoc2lyZnBvcnQtPnR4X2RtYV9jaGFuKQogCQl3cl9yZWdsKHBvcnQsIHVyZWctPnNpcmZzb2NfdHhfZG1hX2lvX2N0cmwsIFNJUkZVQVJUX0RNQV9NT0RFKTsKIAllbHNlCiAJCXdyX3JlZ2wocG9ydCwgdXJlZy0+c2lyZnNvY190eF9kbWFfaW9fY3RybCwgU0lSRlVBUlRfSU9fTU9ERSk7Ci0JaWYgKElTX0RNQV9DSEFOX1ZBTElEKHNpcmZwb3J0LT5yeF9kbWFfbm8pKQorCWlmIChzaXJmcG9ydC0+cnhfZG1hX2NoYW4pCiAJCXdyX3JlZ2wocG9ydCwgdXJlZy0+c2lyZnNvY19yeF9kbWFfaW9fY3RybCwgU0lSRlVBUlRfRE1BX01PREUpOwogCWVsc2UKIAkJd3JfcmVnbChwb3J0LCB1cmVnLT5zaXJmc29jX3J4X2RtYV9pb19jdHJsLCBTSVJGVUFSVF9JT19NT0RFKTsKQEAgLTEwNDksOTMgKzEwNDgsNiBAQAogCQljbGtfZGlzYWJsZV91bnByZXBhcmUoc2lyZnBvcnQtPmNsayk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2lyZnNvY191YXJ0X2luaXRfdHhfZG1hKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IHNpcmZzb2NfdWFydF9wb3J0ICpzaXJmcG9ydCA9IHRvX3NpcmZwb3J0KHBvcnQpOwotCWRtYV9jYXBfbWFza190IGRtYV9tYXNrOwotCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIHR4X3Nsdl9jZmcgPSB7Ci0JCS5kc3RfbWF4YnVyc3QgPSAyLAotCX07Ci0KLQlkbWFfY2FwX3plcm8oZG1hX21hc2spOwotCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgZG1hX21hc2spOwotCXNpcmZwb3J0LT50eF9kbWFfY2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwoZG1hX21hc2ssCi0JCShkbWFfZmlsdGVyX2ZuKXNpcmZzb2NfZG1hX2ZpbHRlcl9pZCwKLQkJKHZvaWQgKilzaXJmcG9ydC0+dHhfZG1hX25vKTsKLQlpZiAoIXNpcmZwb3J0LT50eF9kbWFfY2hhbikgewotCQlkZXZfZXJyKHBvcnQtPmRldiwgIlVhcnQgUmVxdWVzdCBEbWEgQ2hhbm5lbCBGYWlsICVkXG4iLAotCQkJCQlzaXJmcG9ydC0+dHhfZG1hX25vKTsKLQkJcmV0dXJuICAtRVBST0JFX0RFRkVSOwotCX0KLQlkbWFlbmdpbmVfc2xhdmVfY29uZmlnKHNpcmZwb3J0LT50eF9kbWFfY2hhbiwgJnR4X3Nsdl9jZmcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2lyZnNvY191YXJ0X2luaXRfcnhfZG1hKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IHNpcmZzb2NfdWFydF9wb3J0ICpzaXJmcG9ydCA9IHRvX3NpcmZwb3J0KHBvcnQpOwotCWRtYV9jYXBfbWFza190IGRtYV9tYXNrOwotCWludCByZXQ7Ci0JaW50IGksIGo7Ci0Jc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgc2x2X2NmZyA9IHsKLQkJLnNyY19tYXhidXJzdCA9IDIsCi0JfTsKLQotCWRtYV9jYXBfemVybyhkbWFfbWFzayk7Ci0JZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBkbWFfbWFzayk7Ci0Jc2lyZnBvcnQtPnJ4X2RtYV9jaGFuID0gZG1hX3JlcXVlc3RfY2hhbm5lbChkbWFfbWFzaywKLQkJCQkJKGRtYV9maWx0ZXJfZm4pc2lyZnNvY19kbWFfZmlsdGVyX2lkLAotCQkJCQkodm9pZCAqKXNpcmZwb3J0LT5yeF9kbWFfbm8pOwotCWlmICghc2lyZnBvcnQtPnJ4X2RtYV9jaGFuKSB7Ci0JCWRldl9lcnIocG9ydC0+ZGV2LCAiVWFydCBSZXF1ZXN0IERtYSBDaGFubmVsIEZhaWwgJWRcbiIsCi0JCQkJc2lyZnBvcnQtPnJ4X2RtYV9ubyk7Ci0JCXJldCA9IC1FUFJPQkVfREVGRVI7Ci0JCWdvdG8gcmVxdWVzdF9lcnI7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBTSVJGU09DX1JYX0xPT1BfQlVGX0NOVDsgaSsrKSB7Ci0JCXNpcmZwb3J0LT5yeF9kbWFfaXRlbXNbaV0ueG1pdC5idWYgPQotCQkJZG1hX2FsbG9jX2NvaGVyZW50KHBvcnQtPmRldiwgU0lSRlNPQ19SWF9ETUFfQlVGX1NJWkUsCi0JCQkmc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tpXS5kbWFfYWRkciwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tpXS54bWl0LmJ1ZikgewotCQkJZGV2X2Vycihwb3J0LT5kZXYsICJVYXJ0IGFsbG9jIGJ1ZmEgZmFpbGVkXG4iKTsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGFsbG9jX2NvaGVyZW50X2VycjsKLQkJfQotCQlzaXJmcG9ydC0+cnhfZG1hX2l0ZW1zW2ldLnhtaXQuaGVhZCA9Ci0JCQlzaXJmcG9ydC0+cnhfZG1hX2l0ZW1zW2ldLnhtaXQudGFpbCA9IDA7Ci0JfQotCWRtYWVuZ2luZV9zbGF2ZV9jb25maWcoc2lyZnBvcnQtPnJ4X2RtYV9jaGFuLCAmc2x2X2NmZyk7Ci0KLQlyZXR1cm4gMDsKLWFsbG9jX2NvaGVyZW50X2VycjoKLQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotCQlkbWFfZnJlZV9jb2hlcmVudChwb3J0LT5kZXYsIFNJUkZTT0NfUlhfRE1BX0JVRl9TSVpFLAotCQkJCXNpcmZwb3J0LT5yeF9kbWFfaXRlbXNbal0ueG1pdC5idWYsCi0JCQkJc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tqXS5kbWFfYWRkcik7Ci0JZG1hX3JlbGVhc2VfY2hhbm5lbChzaXJmcG9ydC0+cnhfZG1hX2NoYW4pOwotcmVxdWVzdF9lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgc2lyZnNvY191YXJ0X3VuaW5pdF90eF9kbWEoc3RydWN0IHNpcmZzb2NfdWFydF9wb3J0ICpzaXJmcG9ydCkKLXsKLQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChzaXJmcG9ydC0+dHhfZG1hX2NoYW4pOwotCWRtYV9yZWxlYXNlX2NoYW5uZWwoc2lyZnBvcnQtPnR4X2RtYV9jaGFuKTsKLX0KLQotc3RhdGljIHZvaWQgc2lyZnNvY191YXJ0X3VuaW5pdF9yeF9kbWEoc3RydWN0IHNpcmZzb2NfdWFydF9wb3J0ICpzaXJmcG9ydCkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJnNpcmZwb3J0LT5wb3J0OwotCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHNpcmZwb3J0LT5yeF9kbWFfY2hhbik7Ci0JZG1hX3JlbGVhc2VfY2hhbm5lbChzaXJmcG9ydC0+cnhfZG1hX2NoYW4pOwotCWZvciAoaSA9IDA7IGkgPCBTSVJGU09DX1JYX0xPT1BfQlVGX0NOVDsgaSsrKQotCQlkbWFfZnJlZV9jb2hlcmVudChwb3J0LT5kZXYsIFNJUkZTT0NfUlhfRE1BX0JVRl9TSVpFLAotCQkJCXNpcmZwb3J0LT5yeF9kbWFfaXRlbXNbaV0ueG1pdC5idWYsCi0JCQkJc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tpXS5kbWFfYWRkcik7Ci19Ci0KIHN0YXRpYyBpbnQgc2lyZnNvY191YXJ0X3N0YXJ0dXAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3Qgc2lyZnNvY191YXJ0X3BvcnQgKnNpcmZwb3J0CT0gdG9fc2lyZnBvcnQocG9ydCk7CkBAIC0xMTc0LDE4ICsxMDg2LDEyIEBACiAJd3JfcmVnbChwb3J0LCB1cmVnLT5zaXJmc29jX3J4X2ZpZm9fb3AsIDApOwogCXdyX3JlZ2wocG9ydCwgdXJlZy0+c2lyZnNvY190eF9maWZvX2N0cmwsIFNJUkZVQVJUX0ZJRk9fVEhEKHBvcnQpKTsKIAl3cl9yZWdsKHBvcnQsIHVyZWctPnNpcmZzb2NfcnhfZmlmb19jdHJsLCBTSVJGVUFSVF9GSUZPX1RIRChwb3J0KSk7Ci0KLQlpZiAoSVNfRE1BX0NIQU5fVkFMSUQoc2lyZnBvcnQtPnJ4X2RtYV9ubykpIHsKLQkJcmV0ID0gc2lyZnNvY191YXJ0X2luaXRfcnhfZG1hKHBvcnQpOwotCQlpZiAocmV0KQotCQkJZ290byBpbml0X3J4X2VycjsKKwlpZiAoc2lyZnBvcnQtPnJ4X2RtYV9jaGFuKQogCQl3cl9yZWdsKHBvcnQsIHVyZWctPnNpcmZzb2NfcnhfZmlmb19sZXZlbF9jaGssCi0JCQkJU0lSRlVBUlRfUlhfRklGT19DSEtfU0MocG9ydC0+bGluZSwgMHg0KSB8Ci0JCQkJU0lSRlVBUlRfUlhfRklGT19DSEtfTEMocG9ydC0+bGluZSwgMHhlKSB8Ci0JCQkJU0lSRlVBUlRfUlhfRklGT19DSEtfSEMocG9ydC0+bGluZSwgMHgxYikpOwotCX0KLQlpZiAoSVNfRE1BX0NIQU5fVkFMSUQoc2lyZnBvcnQtPnR4X2RtYV9ubykpIHsKLQkJc2lyZnNvY191YXJ0X2luaXRfdHhfZG1hKHBvcnQpOworCQkJU0lSRlVBUlRfUlhfRklGT19DSEtfU0MocG9ydC0+bGluZSwgMHg0KSB8CisJCQlTSVJGVUFSVF9SWF9GSUZPX0NIS19MQyhwb3J0LT5saW5lLCAweGUpIHwKKwkJCVNJUkZVQVJUX1JYX0ZJRk9fQ0hLX0hDKHBvcnQtPmxpbmUsIDB4MWIpKTsKKwlpZiAoc2lyZnBvcnQtPnR4X2RtYV9jaGFuKSB7CiAJCXNpcmZwb3J0LT50eF9kbWFfc3RhdGUgPSBUWF9ETUFfSURMRTsKIAkJd3JfcmVnbChwb3J0LCB1cmVnLT5zaXJmc29jX3R4X2ZpZm9fbGV2ZWxfY2hrLAogCQkJCVNJUkZVQVJUX1RYX0ZJRk9fQ0hLX1NDKHBvcnQtPmxpbmUsIDB4MWIpIHwKQEAgLTEyMzIsMTIgKzExMzgsOCBAQAogCQlncGlvX3NldF92YWx1ZShzaXJmcG9ydC0+cnRzX2dwaW8sIDEpOwogCQlmcmVlX2lycShncGlvX3RvX2lycShzaXJmcG9ydC0+Y3RzX2dwaW8pLCBzaXJmcG9ydCk7CiAJfQotCWlmIChJU19ETUFfQ0hBTl9WQUxJRChzaXJmcG9ydC0+cnhfZG1hX25vKSkKLQkJc2lyZnNvY191YXJ0X3VuaW5pdF9yeF9kbWEoc2lyZnBvcnQpOwotCWlmIChJU19ETUFfQ0hBTl9WQUxJRChzaXJmcG9ydC0+dHhfZG1hX25vKSkgewotCQlzaXJmc29jX3VhcnRfdW5pbml0X3R4X2RtYShzaXJmcG9ydCk7CisJaWYgKHNpcmZwb3J0LT50eF9kbWFfY2hhbikKIAkJc2lyZnBvcnQtPnR4X2RtYV9zdGF0ZSA9IFRYX0RNQV9JRExFOwotCX0KIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKnNpcmZzb2NfdWFydF90eXBlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCkBAIC0xMzEzLDggKzEyMTUsOCBAQAogCXBvcnQtPmNvbnMgPSBjbzsKIAogCS8qIGRlZmF1bHQgY29uc29sZSB0eC9yeCB0cmFuc2ZlciB1c2luZyBpbyBtb2RlICovCi0Jc2lyZnBvcnQtPnJ4X2RtYV9ubyA9IFVOVkFMSURfRE1BX0NIQU47Ci0Jc2lyZnBvcnQtPnR4X2RtYV9ubyA9IFVOVkFMSURfRE1BX0NIQU47CisJc2lyZnBvcnQtPnJ4X2RtYV9jaGFuID0gTlVMTDsKKwlzaXJmcG9ydC0+dHhfZG1hX2NoYW4gPSBOVUxMOwogCXJldHVybiB1YXJ0X3NldF9vcHRpb25zKHBvcnQsIGNvLCBiYXVkLCBwYXJpdHksIGJpdHMsIGZsb3cpOwogfQogCkBAIC0xMzgyLDYgKzEyODQsMTMgQEAKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0OwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWludCByZXQ7CisJaW50IGksIGo7CisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgc2x2X2NmZyA9IHsKKwkJLnNyY19tYXhidXJzdCA9IDIsCisJfTsKKwlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyB0eF9zbHZfY2ZnID0geworCQkuZHN0X21heGJ1cnN0ID0gMiwKKwl9OwogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCiAJbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKHNpcmZzb2NfdWFydF9pZHMsIHBkZXYtPmRldi5vZl9ub2RlKTsKQEAgLTE0MDIsMjcgKzEzMTEsMTAgQEAKIAogCXNpcmZwb3J0LT5od19mbG93X2N0cmwgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2Lm9mX25vZGUsCiAJCSJzaXJmLHVhcnQtaGFzLXJ0c2N0cyIpOwotCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwZGV2LT5kZXYub2Zfbm9kZSwgInNpcmYscHJpbWEyLXVhcnQiKSkgeworCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwZGV2LT5kZXYub2Zfbm9kZSwgInNpcmYscHJpbWEyLXVhcnQiKSkKIAkJc2lyZnBvcnQtPnVhcnRfcmVnLT51YXJ0X3R5cGUgPSBTSVJGX1JFQUxfVUFSVDsKLQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCSJzaXJmLHVhcnQtZG1hLXJ4LWNoYW5uZWwiLAotCQkJCSZzaXJmcG9ydC0+cnhfZG1hX25vKSkKLQkJCXNpcmZwb3J0LT5yeF9kbWFfbm8gPSBVTlZBTElEX0RNQV9DSEFOOwotCQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJInNpcmYsdWFydC1kbWEtdHgtY2hhbm5lbCIsCi0JCQkJJnNpcmZwb3J0LT50eF9kbWFfbm8pKQotCQkJc2lyZnBvcnQtPnR4X2RtYV9ubyA9IFVOVkFMSURfRE1BX0NIQU47Ci0JfQogCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwZGV2LT5kZXYub2Zfbm9kZSwgInNpcmYscHJpbWEyLXVzcC11YXJ0IikpIHsKIAkJc2lyZnBvcnQtPnVhcnRfcmVnLT51YXJ0X3R5cGUgPQlTSVJGX1VTUF9VQVJUOwotCQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJInNpcmYsdXNwLWRtYS1yeC1jaGFubmVsIiwKLQkJCQkmc2lyZnBvcnQtPnJ4X2RtYV9ubykpCi0JCQlzaXJmcG9ydC0+cnhfZG1hX25vID0gVU5WQUxJRF9ETUFfQ0hBTjsKLQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCSJzaXJmLHVzcC1kbWEtdHgtY2hhbm5lbCIsCi0JCQkJJnNpcmZwb3J0LT50eF9kbWFfbm8pKQotCQkJc2lyZnBvcnQtPnR4X2RtYV9ubyA9IFVOVkFMSURfRE1BX0NIQU47CiAJCWlmICghc2lyZnBvcnQtPmh3X2Zsb3dfY3RybCkKIAkJCWdvdG8gdXNwX25vX2Zsb3dfY29udHJvbDsKIAkJaWYgKG9mX2ZpbmRfcHJvcGVydHkocGRldi0+ZGV2Lm9mX25vZGUsICJjdHMtZ3Bpb3MiLCBOVUxMKSkKQEAgLTE1MTUsOCArMTQwNywzMiBAQAogCQlnb3RvIHBvcnRfZXJyOwogCX0KIAotCXJldHVybiAwOworCXNpcmZwb3J0LT5yeF9kbWFfY2hhbiA9IGRtYV9yZXF1ZXN0X3NsYXZlX2NoYW5uZWwocG9ydC0+ZGV2LCAicngiKTsKKwlmb3IgKGkgPSAwOyBzaXJmcG9ydC0+cnhfZG1hX2NoYW4gJiYgaSA8IFNJUkZTT0NfUlhfTE9PUF9CVUZfQ05UOyBpKyspIHsKKwkJc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tpXS54bWl0LmJ1ZiA9CisJCQlkbWFfYWxsb2NfY29oZXJlbnQocG9ydC0+ZGV2LCBTSVJGU09DX1JYX0RNQV9CVUZfU0laRSwKKwkJCSZzaXJmcG9ydC0+cnhfZG1hX2l0ZW1zW2ldLmRtYV9hZGRyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzaXJmcG9ydC0+cnhfZG1hX2l0ZW1zW2ldLnhtaXQuYnVmKSB7CisJCQlkZXZfZXJyKHBvcnQtPmRldiwgIlVhcnQgYWxsb2MgYnVmYSBmYWlsZWRcbiIpOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gYWxsb2NfY29oZXJlbnRfZXJyOworCQl9CisJCXNpcmZwb3J0LT5yeF9kbWFfaXRlbXNbaV0ueG1pdC5oZWFkID0KKwkJCXNpcmZwb3J0LT5yeF9kbWFfaXRlbXNbaV0ueG1pdC50YWlsID0gMDsKKwl9CisJaWYgKHNpcmZwb3J0LT5yeF9kbWFfY2hhbikKKwkJZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhzaXJmcG9ydC0+cnhfZG1hX2NoYW4sICZzbHZfY2ZnKTsKKwlzaXJmcG9ydC0+dHhfZG1hX2NoYW4gPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsKHBvcnQtPmRldiwgInR4Iik7CisJaWYgKHNpcmZwb3J0LT50eF9kbWFfY2hhbikKKwkJZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhzaXJmcG9ydC0+dHhfZG1hX2NoYW4sICZ0eF9zbHZfY2ZnKTsKIAorCXJldHVybiAwOworYWxsb2NfY29oZXJlbnRfZXJyOgorCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCWRtYV9mcmVlX2NvaGVyZW50KHBvcnQtPmRldiwgU0lSRlNPQ19SWF9ETUFfQlVGX1NJWkUsCisJCQkJc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tqXS54bWl0LmJ1ZiwKKwkJCQlzaXJmcG9ydC0+cnhfZG1hX2l0ZW1zW2pdLmRtYV9hZGRyKTsKKwlkbWFfcmVsZWFzZV9jaGFubmVsKHNpcmZwb3J0LT5yeF9kbWFfY2hhbik7CiBwb3J0X2VycjoKIAljbGtfcHV0KHNpcmZwb3J0LT5jbGspOwogZXJyOgpAQCAtMTUyOSw2ICsxNDQ1LDE5IEBACiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZzaXJmcG9ydC0+cG9ydDsKIAljbGtfcHV0KHNpcmZwb3J0LT5jbGspOwogCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZzaXJmc29jX3VhcnRfZHJ2LCBwb3J0KTsKKwlpZiAoc2lyZnBvcnQtPnJ4X2RtYV9jaGFuKSB7CisJCWludCBpOworCQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChzaXJmcG9ydC0+cnhfZG1hX2NoYW4pOworCQlkbWFfcmVsZWFzZV9jaGFubmVsKHNpcmZwb3J0LT5yeF9kbWFfY2hhbik7CisJCWZvciAoaSA9IDA7IGkgPCBTSVJGU09DX1JYX0xPT1BfQlVGX0NOVDsgaSsrKQorCQkJZG1hX2ZyZWVfY29oZXJlbnQocG9ydC0+ZGV2LCBTSVJGU09DX1JYX0RNQV9CVUZfU0laRSwKKwkJCQkJc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tpXS54bWl0LmJ1ZiwKKwkJCQkJc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tpXS5kbWFfYWRkcik7CisJfQorCWlmIChzaXJmcG9ydC0+dHhfZG1hX2NoYW4pIHsKKwkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoc2lyZnBvcnQtPnR4X2RtYV9jaGFuKTsKKwkJZG1hX3JlbGVhc2VfY2hhbm5lbChzaXJmcG9ydC0+dHhfZG1hX2NoYW4pOworCX0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3NpcmZzb2NfdWFydC5oIGIvZHJpdmVycy90dHkvc2VyaWFsL3NpcmZzb2NfdWFydC5oCmluZGV4IGI3ZDY3OWMuLjhhNmVkZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zaXJmc29jX3VhcnQuaAorKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2lyZnNvY191YXJ0LmgKQEAgLTM5Miw5ICszOTIsNiBAQAogLyogSW5kaWNhdGUgaG93IG1hbnkgYnVmZmVycyB1c2VkICovCiAjZGVmaW5lIFNJUkZTT0NfUlhfTE9PUF9CVUZfQ05UCQkyCiAKLS8qIEluZGljYXRlIGlmIERNQSBjaGFubmVsIHZhbGlkICovCi0jZGVmaW5lIElTX0RNQV9DSEFOX1ZBTElEKHgpCSgoeCkgIT0gLTEpCi0jZGVmaW5lIFVOVkFMSURfRE1BX0NIQU4JLTEKIC8qIEZvciBGYXN0IEJhdWQgUmF0ZSBDYWxjdWxhdGlvbiAqLwogc3RydWN0IHNpcmZzb2NfYmF1ZHJhdGVfdG9fcmVndiB7CiAJdW5zaWduZWQgaW50IGJhdWRfcmF0ZTsKQEAgLTQyMyw4ICs0MjAsNiBAQAogCS8qIGZvciBTaVJGbWFyY28sIHRoZXJlIGFyZSBTRVQvQ0xSIGZvciBVQVJUX0lOVF9FTiAqLwogCWJvb2wJCQkJaXNfbWFyY287CiAJc3RydWN0IHNpcmZzb2NfdWFydF9yZWdpc3RlcgkqdWFydF9yZWc7Ci0JaW50CQkJCXJ4X2RtYV9ubzsKLQlpbnQJCQkJdHhfZG1hX25vOwogCXN0cnVjdCBkbWFfY2hhbgkJCSpyeF9kbWFfY2hhbjsKIAlzdHJ1Y3QgZG1hX2NoYW4JCQkqdHhfZG1hX2NoYW47CiAJZG1hX2FkZHJfdAkJCXR4X2RtYV9hZGRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc3luY2xpbmsuYyBiL2RyaXZlcnMvdHR5L3N5bmNsaW5rLmMKaW5kZXggNWFlMTRiNC4uZDQ4ZTA0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc3luY2xpbmsuYworKysgYi9kcml2ZXJzL3R0eS9zeW5jbGluay5jCkBAIC03ODY2LDYgKzc4NjYsNyBAQAogCQkJCQkgICAgICBIRExDX0ZMQUdfVFhDX1RYQ1BJTiB8IEhETENfRkxBR19UWENfRFBMTCB8CiAJCQkJCSAgICAgIEhETENfRkxBR19UWENfQlJHICAgIHwgSERMQ19GTEFHX1RYQ19SWENQSU4pOwogCisJCW1lbXNldCgmbmV3X2xpbmUsIDAsIHNpemVvZihuZXdfbGluZSkpOwogCQlzd2l0Y2ggKGZsYWdzKXsKIAkJY2FzZSAoSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX1RYQ1BJTik6IG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19FWFQ7IGJyZWFrOwogCQljYXNlIChIRExDX0ZMQUdfUlhDX0JSRyAgICB8IEhETENfRkxBR19UWENfQlJHKTogICAgbmV3X2xpbmUuY2xvY2tfdHlwZSA9IENMT0NLX0lOVDsgYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zeW5jbGlua21wLmMgYi9kcml2ZXJzL3R0eS9zeW5jbGlua21wLmMKaW5kZXggMTQ0MjAyZS4uNTNiYTg1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc3luY2xpbmttcC5jCisrKyBiL2RyaXZlcnMvdHR5L3N5bmNsaW5rbXAuYwpAQCAtMTc2Niw2ICsxNzY2LDcgQEAKIAkJCQkJICAgICAgSERMQ19GTEFHX1RYQ19UWENQSU4gfCBIRExDX0ZMQUdfVFhDX0RQTEwgfAogCQkJCQkgICAgICBIRExDX0ZMQUdfVFhDX0JSRyAgICB8IEhETENfRkxBR19UWENfUlhDUElOKTsKIAorCQltZW1zZXQoJm5ld19saW5lLCAwLCBzaXplb2YobmV3X2xpbmUpKTsKIAkJc3dpdGNoIChmbGFncyl7CiAJCWNhc2UgKEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19UWENQSU4pOiBuZXdfbGluZS5jbG9ja190eXBlID0gQ0xPQ0tfRVhUOyBicmVhazsKIAkJY2FzZSAoSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX0JSRyk6ICAgIG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19JTlQ7IGJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvdHR5X2J1ZmZlci5jIGIvZHJpdmVycy90dHkvdHR5X2J1ZmZlci5jCmluZGV4IDc2NTEyNWQuLjhlYmQ5ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3R0eV9idWZmZXIuYworKysgYi9kcml2ZXJzL3R0eS90dHlfYnVmZmVyLmMKQEAgLTM1MSwxNCArMzUxLDExIEBACiAgKglUYWtlcyBhbnkgcGVuZGluZyBidWZmZXJzIGFuZCB0cmFuc2ZlcnMgdGhlaXIgb3duZXJzaGlwIHRvIHRoZQogICoJbGRpc2Mgc2lkZSBvZiB0aGUgcXVldWUuIEl0IHRoZW4gc2NoZWR1bGVzIHRob3NlIGNoYXJhY3RlcnMgZm9yCiAgKglwcm9jZXNzaW5nIGJ5IHRoZSBsaW5lIGRpc2NpcGxpbmUuCi0gKglOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIHdoZW4gdGhlIGxvd19sYXRlbmN5IGZsYWcKLSAqCWlzIHVuc2V0LiBPdGhlcndpc2UgdGhlIHdvcmtxdWV1ZSB3b24ndCBiZSBmbHVzaGVkLgogICovCiAKIHZvaWQgdHR5X3NjaGVkdWxlX2ZsaXAoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB0dHlfYnVmaGVhZCAqYnVmID0gJnBvcnQtPmJ1ZjsKLQlXQVJOX09OKHBvcnQtPmxvd19sYXRlbmN5KTsKIAogCWJ1Zi0+dGFpbC0+Y29tbWl0ID0gYnVmLT50YWlsLT51c2VkOwogCXNjaGVkdWxlX3dvcmsoJmJ1Zi0+d29yayk7CkBAIC00ODIsMTcgKzQ3OSwxNSBAQAogICovCiB2b2lkIHR0eV9mbHVzaF90b19sZGlzYyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCWlmICghdHR5LT5wb3J0LT5sb3dfbGF0ZW5jeSkKLQkJZmx1c2hfd29yaygmdHR5LT5wb3J0LT5idWYud29yayk7CisJZmx1c2hfd29yaygmdHR5LT5wb3J0LT5idWYud29yayk7CiB9CiAKIC8qKgogICoJdHR5X2ZsaXBfYnVmZmVyX3B1c2gJLQl0ZXJtaW5hbAogICoJQHBvcnQ6IHR0eSBwb3J0IHRvIHB1c2gKICAqCi0gKglRdWV1ZSBhIHB1c2ggb2YgdGhlIHRlcm1pbmFsIGZsaXAgYnVmZmVycyB0byB0aGUgbGluZSBkaXNjaXBsaW5lLiBUaGlzCi0gKglmdW5jdGlvbiBtdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSBJUlEgY29udGV4dCBpZiBwb3J0LT5sb3dfbGF0ZW5jeSBpcwotICoJc2V0LgorICoJUXVldWUgYSBwdXNoIG9mIHRoZSB0ZXJtaW5hbCBmbGlwIGJ1ZmZlcnMgdG8gdGhlIGxpbmUgZGlzY2lwbGluZS4KKyAqCUNhbiBiZSBjYWxsZWQgZnJvbSBJUlEvYXRvbWljIGNvbnRleHQuCiAgKgogICoJSW4gdGhlIGV2ZW50IG9mIHRoZSBxdWV1ZSBiZWluZyBidXN5IGZvciBmbGlwcGluZyB0aGUgd29yayB3aWxsIGJlCiAgKgloZWxkIG9mZiBhbmQgcmV0cmllZCBsYXRlci4KQEAgLTUwMCwxNCArNDk1LDcgQEAKIAogdm9pZCB0dHlfZmxpcF9idWZmZXJfcHVzaChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IHR0eV9idWZoZWFkICpidWYgPSAmcG9ydC0+YnVmOwotCi0JYnVmLT50YWlsLT5jb21taXQgPSBidWYtPnRhaWwtPnVzZWQ7Ci0KLQlpZiAocG9ydC0+bG93X2xhdGVuY3kpCi0JCWZsdXNoX3RvX2xkaXNjKCZidWYtPndvcmspOwotCWVsc2UKLQkJc2NoZWR1bGVfd29yaygmYnVmLT53b3JrKTsKKwl0dHlfc2NoZWR1bGVfZmxpcChwb3J0KTsKIH0KIEVYUE9SVF9TWU1CT0wodHR5X2ZsaXBfYnVmZmVyX3B1c2gpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS90dHlfaW8uYyBiL2RyaXZlcnMvdHR5L3R0eV9pby5jCmluZGV4IGM3NGEwMGEuLmQzNDQ4YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3R0eV9pby5jCisrKyBiL2RyaXZlcnMvdHR5L3R0eV9pby5jCkBAIC0xMjcxLDEyICsxMjcxLDEzIEBACiAgKgogICoJTG9ja2luZzogTm9uZQogICovCi1zdGF0aWMgdm9pZCB0dHlfbGluZV9uYW1lKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIGludCBpbmRleCwgY2hhciAqcCkKK3N0YXRpYyBzc2l6ZV90IHR0eV9saW5lX25hbWUoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwgaW50IGluZGV4LCBjaGFyICpwKQogewogCWlmIChkcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9VTk5VTUJFUkVEX05PREUpCi0JCXN0cmNweShwLCBkcml2ZXItPm5hbWUpOworCQlyZXR1cm4gc3ByaW50ZihwLCAiJXMiLCBkcml2ZXItPm5hbWUpOwogCWVsc2UKLQkJc3ByaW50ZihwLCAiJXMlZCIsIGRyaXZlci0+bmFtZSwgaW5kZXggKyBkcml2ZXItPm5hbWVfYmFzZSk7CisJCXJldHVybiBzcHJpbnRmKHAsICIlcyVkIiwgZHJpdmVyLT5uYW1lLAorCQkJICAgICAgIGluZGV4ICsgZHJpdmVyLT5uYW1lX2Jhc2UpOwogfQogCiAvKioKQEAgLTM1NDUsOSArMzU0NiwxOSBAQAogCQlpZiAoaSA+PSBBUlJBWV9TSVpFKGNzKSkKIAkJCWJyZWFrOwogCX0KLQl3aGlsZSAoaS0tKQotCQljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAiJXMlZCVjIiwKLQkJCQkgY3NbaV0tPm5hbWUsIGNzW2ldLT5pbmRleCwgaSA/ICcgJzonXG4nKTsKKwl3aGlsZSAoaS0tKSB7CisJCWludCBpbmRleCA9IGNzW2ldLT5pbmRleDsKKwkJc3RydWN0IHR0eV9kcml2ZXIgKmRydiA9IGNzW2ldLT5kZXZpY2UoY3NbaV0sICZpbmRleCk7CisKKwkJLyogZG9uJ3QgcmVzb2x2ZSB0dHkwIGFzIHNvbWUgcHJvZ3JhbXMgZGVwZW5kIG9uIGl0ICovCisJCWlmIChkcnYgJiYgKGNzW2ldLT5pbmRleCA+IDAgfHwgZHJ2LT5tYWpvciAhPSBUVFlfTUFKT1IpKQorCQkJY291bnQgKz0gdHR5X2xpbmVfbmFtZShkcnYsIGluZGV4LCBidWYgKyBjb3VudCk7CisJCWVsc2UKKwkJCWNvdW50ICs9IHNwcmludGYoYnVmICsgY291bnQsICIlcyVkIiwKKwkJCQkJIGNzW2ldLT5uYW1lLCBjc1tpXS0+aW5kZXgpOworCisJCWNvdW50ICs9IHNwcmludGYoYnVmICsgY291bnQsICIlYyIsIGkgPyAnICc6J1xuJyk7CisJfQogCWNvbnNvbGVfdW5sb2NrKCk7CiAKIAlyZXR1cm4gY291bnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS92dC92dC5jIGIvZHJpdmVycy90dHkvdnQvdnQuYwppbmRleCAyM2I1ZDMyLi4zYWQwYjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS92dC92dC5jCisrKyBiL2RyaXZlcnMvdHR5L3Z0L3Z0LmMKQEAgLTE1OTAsOSArMTU5MCw5IEBACiAJdmMtPnZjX25lZWRfd3JhcCA9IDA7CiB9CiAKLWVudW0geyBFU25vcm1hbCwgRVNlc2MsIEVTc3F1YXJlLCBFU2dldHBhcnMsIEVTZ290cGFycywgRVNmdW5ja2V5LAorZW51bSB7IEVTbm9ybWFsLCBFU2VzYywgRVNzcXVhcmUsIEVTZ2V0cGFycywgRVNmdW5ja2V5LAogCUVTaGFzaCwgRVNzZXRHMCwgRVNzZXRHMSwgRVNwZXJjZW50LCBFU2lnbm9yZSwgRVNub25zdGQsCi0JRVNwYWxldHRlIH07CisJRVNwYWxldHRlLCBFU29zYyB9OwogCiAvKiBjb25zb2xlX2xvY2sgaXMgaGVsZCAoZXhjZXB0IHZpYSB2Y19pbml0KCkpICovCiBzdGF0aWMgdm9pZCByZXNldF90ZXJtaW5hbChzdHJ1Y3QgdmNfZGF0YSAqdmMsIGludCBkb19jbGVhcikKQEAgLTE2NTIsMTEgKzE2NTIsMTUgQEAKIAkgKiAgQ29udHJvbCBjaGFyYWN0ZXJzIGNhbiBiZSB1c2VkIGluIHRoZSBfbWlkZGxlXwogCSAqICBvZiBhbiBlc2NhcGUgc2VxdWVuY2UuCiAJICovCisJaWYgKHZjLT52Y19zdGF0ZSA9PSBFU29zYyAmJiBjPj04ICYmIGM8PTEzKSAvKiAuLi4gZXhjZXB0IGZvciBPU0MgKi8KKwkJcmV0dXJuOwogCXN3aXRjaCAoYykgewogCWNhc2UgMDoKIAkJcmV0dXJuOwogCWNhc2UgNzoKLQkJaWYgKHZjLT52Y19iZWxsX2R1cmF0aW9uKQorCQlpZiAodmMtPnZjX3N0YXRlID09IEVTb3NjKQorCQkJdmMtPnZjX3N0YXRlID0gRVNub3JtYWw7CisJCWVsc2UgaWYgKHZjLT52Y19iZWxsX2R1cmF0aW9uKQogCQkJa2RfbWtzb3VuZCh2Yy0+dmNfYmVsbF9waXRjaCwgdmMtPnZjX2JlbGxfZHVyYXRpb24pOwogCQlyZXR1cm47CiAJY2FzZSA4OgpAQCAtMTc2Nyw3ICsxNzcxLDkgQEAKIAkJfSBlbHNlIGlmIChjPT0nUicpIHsgICAvKiByZXNldCBwYWxldHRlICovCiAJCQlyZXNldF9wYWxldHRlKHZjKTsKIAkJCXZjLT52Y19zdGF0ZSA9IEVTbm9ybWFsOwotCQl9IGVsc2UKKwkJfSBlbHNlIGlmIChjPj0nMCcgJiYgYzw9JzknKQorCQkJdmMtPnZjX3N0YXRlID0gRVNvc2M7CisJCWVsc2UKIAkJCXZjLT52Y19zdGF0ZSA9IEVTbm9ybWFsOwogCQlyZXR1cm47CiAJY2FzZSBFU3BhbGV0dGU6CkBAIC0xODA3LDkgKzE4MTMsNyBAQAogCQkJdmMtPnZjX3Bhclt2Yy0+dmNfbnBhcl0gKj0gMTA7CiAJCQl2Yy0+dmNfcGFyW3ZjLT52Y19ucGFyXSArPSBjIC0gJzAnOwogCQkJcmV0dXJuOwotCQl9IGVsc2UKLQkJCXZjLT52Y19zdGF0ZSA9IEVTZ290cGFyczsKLQljYXNlIEVTZ290cGFyczoKKwkJfQogCQl2Yy0+dmNfc3RhdGUgPSBFU25vcm1hbDsKIAkJc3dpdGNoKGMpIHsKIAkJY2FzZSAnaCc6CkBAIC0yMDIzLDYgKzIwMjcsOCBAQAogCQkJdmMtPnZjX3RyYW5zbGF0ZSA9IHNldF90cmFuc2xhdGUodmMtPnZjX0cxX2NoYXJzZXQsIHZjKTsKIAkJdmMtPnZjX3N0YXRlID0gRVNub3JtYWw7CiAJCXJldHVybjsKKwljYXNlIEVTb3NjOgorCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJdmMtPnZjX3N0YXRlID0gRVNub3JtYWw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL0tjb25maWcKaW5kZXggMmU2YjgzMi4uZTBjYWQ0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9LY29uZmlnCkBAIC0yLDEwICsyLDYgQEAKICMgVVNCIGRldmljZSBjb25maWd1cmF0aW9uCiAjCiAKLSMgVGhlc2UgYXJlIHVudXNlZCBub3csIHJlbW92ZSB0aGVtIG9uY2UgdGhleSBhcmUgbm8gbG9uZ2VyIHNlbGVjdGVkCi1jb25maWcgVVNCX0FSQ0hfSEFTX09IQ0kKLQlib29sCi0KIGNvbmZpZyBVU0JfT0hDSV9CSUdfRU5ESUFOX0RFU0MKIAlib29sCiAKQEAgLTE3LDE4ICsxMywxMiBAQAogCWRlZmF1bHQgbiBpZiBTVEIwM3h4eCB8fCBQUENfTVBDNTJ4eAogCWRlZmF1bHQgeQogCi1jb25maWcgVVNCX0FSQ0hfSEFTX0VIQ0kKLQlib29sCi0KIGNvbmZpZyBVU0JfRUhDSV9CSUdfRU5ESUFOX01NSU8KIAlib29sCiAKIGNvbmZpZyBVU0JfRUhDSV9CSUdfRU5ESUFOX0RFU0MKIAlib29sCiAKLWNvbmZpZyBVU0JfQVJDSF9IQVNfWEhDSQotCWJvb2wKLQogbWVudWNvbmZpZyBVU0JfU1VQUE9SVAogCWJvb2wgIlVTQiBzdXBwb3J0IgogCWRlcGVuZHMgb24gSEFTX0lPTUVNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL01ha2VmaWxlCmluZGV4IDczNDVkMjEuLjQ4MGJkNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL01ha2VmaWxlCkBAIC0xMCw2ICsxMCw3IEBACiAjIEdsdWUvQnJpZGdlIGxheWVycyBnbyBoZXJlCiAKIG9iai0kKENPTkZJR19VU0JfQ0hJUElERUEpCSs9IGNpX2hkcmNfbXNtLm8KK29iai0kKENPTkZJR19VU0JfQ0hJUElERUEpCSs9IGNpX2hkcmNfemV2aW8ubwogCiAjIFBDSSBkb2Vzbid0IHByb3ZpZGUgc3R1YnMsIG5lZWQgdG8gY2hlY2sKIGlmbmVxICgkKENPTkZJR19QQ0kpLCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2JpdHMuaCBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2JpdHMuaAppbmRleCBhODU3MTMxLi44M2QwNmMxNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2JpdHMuaAorKysgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9iaXRzLmgKQEAgLTUwLDEyICs1MCwxNCBAQAogI2RlZmluZSBQT1JUU0NfUFRDICAgICAgICAgICAgKDB4MEZVTCA8PCAxNikKICNkZWZpbmUgUE9SVFNDX1BIQ0QoZCkJICAgICAgKChkKSA/IEJJVCgyMikgOiBCSVQoMjMpKQogLyogUFRTIGFuZCBQVFcgZm9yIG5vbiBscG0gdmVyc2lvbiBvbmx5ICovCisjZGVmaW5lIFBPUlRTQ19QRlNDICAgICAgICAgICBCSVQoMjQpCiAjZGVmaW5lIFBPUlRTQ19QVFMoZCkJCQkJCQlcCiAJKHUzMikoKCgoZCkgJiAweDMpIDw8IDMwKSB8ICgoKGQpICYgMHg0KSA/IEJJVCgyNSkgOiAwKSkKICNkZWZpbmUgUE9SVFNDX1BUVyAgICAgICAgICAgIEJJVCgyOCkKICNkZWZpbmUgUE9SVFNDX1NUUyAgICAgICAgICAgIEJJVCgyOSkKIAogLyogREVWTEMgKi8KKyNkZWZpbmUgREVWTENfUEZTQyAgICAgICAgICAgIEJJVCgyMykKICNkZWZpbmUgREVWTENfUFNQRCAgICAgICAgICAgICgweDAzVUwgPDwgMjUpCiAjZGVmaW5lIERFVkxDX1BTUERfSFMgICAgICAgICAoMHgwMlVMIDw8IDI1KQogI2RlZmluZSBERVZMQ19QVFcgICAgICAgICAgICAgQklUKDI3KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2hpcGlkZWEvY2kuaCBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpLmgKaW5kZXggODhiODBmNy4uZTIwNjQwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2hpcGlkZWEvY2kuaAorKysgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaS5oCkBAIC0xOTYsOCArMTk2LDYgQEAKIAogCXN0cnVjdCBjaV9oZHJjX3BsYXRmb3JtX2RhdGEJKnBsYXRkYXRhOwogCWludAkJCQl2YnVzX2FjdGl2ZTsKLQkvKiBGSVhNRTogc29tZSBkYXksIHdlJ2xsIG5vdCB1c2UgZ2xvYmFsIHBoeSAqLwotCWJvb2wJCQkJZ2xvYmFsX3BoeTsKIAlzdHJ1Y3QgdXNiX3BoeQkJCSp0cmFuc2NlaXZlcjsKIAlzdHJ1Y3QgdXNiX2hjZAkJCSpoY2Q7CiAJc3RydWN0IGRlbnRyeQkJCSpkZWJ1Z2ZzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2hpcGlkZWEvY2lfaGRyY19pbXguYyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfaW14LmMKaW5kZXggYzAwZjc3Mi4uMmU1OGY4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2hpcGlkZWEvY2lfaGRyY19pbXguYworKysgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX2lteC5jCkBAIC05Niw3ICs5Niw3IEBACiB7CiAJc3RydWN0IGNpX2hkcmNfaW14X2RhdGEgKmRhdGE7CiAJc3RydWN0IGNpX2hkcmNfcGxhdGZvcm1fZGF0YSBwZGF0YSA9IHsKLQkJLm5hbWUJCT0gImNpX2hkcmNfaW14IiwKKwkJLm5hbWUJCT0gZGV2X25hbWUoJnBkZXYtPmRldiksCiAJCS5jYXBvZmZzZXQJPSBERUZfQ0FQT0ZGU0VULAogCQkuZmxhZ3MJCT0gQ0lfSERSQ19SRVFVSVJFX1RSQU5TQ0VJVkVSIHwKIAkJCQkgIENJX0hEUkNfRElTQUJMRV9TVFJFQU1JTkcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX3pldmlvLmMgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX3pldmlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JmNjQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfemV2aW8uYwpAQCAtMCwwICsxLDcyIEBACisvKgorICoJQ29weXJpZ2h0IChDKSAyMDEzIERhbmllbCBUYW5nIDx0YW5ncnNAdGFuZ3JzLmlkLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEJhc2VkIG9mZiBkcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX21zbS5jCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2NoaXBpZGVhLmg+CisKKyNpbmNsdWRlICJjaS5oIgorCitzdGF0aWMgc3RydWN0IGNpX2hkcmNfcGxhdGZvcm1fZGF0YSBjaV9oZHJjX3pldmlvX3BsYXRkYXRhID0geworCS5uYW1lCQkJPSAiY2lfaGRyY196ZXZpbyIsCisJLmZsYWdzCQkJPSBDSV9IRFJDX1JFR1NfU0hBUkVELAorCS5jYXBvZmZzZXQJCT0gREVGX0NBUE9GRlNFVCwKK307CisKK3N0YXRpYyBpbnQgY2lfaGRyY196ZXZpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNpX3BkZXY7CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJjaV9oZHJjX3pldmlvX3Byb2JlXG4iKTsKKworCWNpX3BkZXYgPSBjaV9oZHJjX2FkZF9kZXZpY2UoJnBkZXYtPmRldiwKKwkJCQlwZGV2LT5yZXNvdXJjZSwgcGRldi0+bnVtX3Jlc291cmNlcywKKwkJCQkmY2lfaGRyY196ZXZpb19wbGF0ZGF0YSk7CisKKwlpZiAoSVNfRVJSKGNpX3BkZXYpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNpX2hkcmNfYWRkX2RldmljZSBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoY2lfcGRldik7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2lfcGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaV9oZHJjX3pldmlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNpX3BkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWNpX2hkcmNfcmVtb3ZlX2RldmljZShjaV9wZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjaV9oZHJjX3pldmlvX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAibHNpLHpldmlvLXVzYiIsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjaV9oZHJjX3pldmlvX2RyaXZlciA9IHsKKwkucHJvYmUgPSBjaV9oZHJjX3pldmlvX3Byb2JlLAorCS5yZW1vdmUgPSBjaV9oZHJjX3pldmlvX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ6ZXZpb191c2IiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gY2lfaGRyY196ZXZpb19kdF9pZHMsCisJfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGNpX2hkcmNfemV2aW9fZHRfaWRzKTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoY2lfaGRyY196ZXZpb19kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jb3JlLmMgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jb3JlLmMKaW5kZXggMzNmMjJiYy4uY2E2ODMxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2hpcGlkZWEvY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NvcmUuYwpAQCAtNjQsNiArNjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvY2hpcGlkZWEuaD4KICNpbmNsdWRlIDxsaW51eC91c2Ivb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogCkBAIC0yOTgsNiArMjk5LDEzIEBACiAJaWYgKGNpLT5wbGF0ZGF0YS0+ZmxhZ3MgJiBDSV9IRFJDX0RJU0FCTEVfU1RSRUFNSU5HKQogCQlod193cml0ZShjaSwgT1BfVVNCTU9ERSwgVVNCTU9ERV9DSV9TRElTLCBVU0JNT0RFX0NJX1NESVMpOwogCisJaWYgKGNpLT5wbGF0ZGF0YS0+ZmxhZ3MgJiBDSV9IRFJDX0ZPUkNFX0ZVTExTUEVFRCkgeworCQlpZiAoY2ktPmh3X2JhbmsubHBtKQorCQkJaHdfd3JpdGUoY2ksIE9QX0RFVkxDLCBERVZMQ19QRlNDLCBERVZMQ19QRlNDKTsKKwkJZWxzZQorCQkJaHdfd3JpdGUoY2ksIE9QX1BPUlRTQywgUE9SVFNDX1BGU0MsIFBPUlRTQ19QRlNDKTsKKwl9CisKIAkvKiBVU0JNT0RFIHNob3VsZCBiZSBjb25maWd1cmVkIHN0ZXAgYnkgc3RlcCAqLwogCWh3X3dyaXRlKGNpLCBPUF9VU0JNT0RFLCBVU0JNT0RFX0NNLCBVU0JNT0RFX0NNX0lETEUpOwogCWh3X3dyaXRlKGNpLCBPUF9VU0JNT0RFLCBVU0JNT0RFX0NNLCBtb2RlKTsKQEAgLTQxMiw2ICs0MjAsOSBAQAogCQl9CiAJfQogCisJaWYgKG9mX3VzYl9nZXRfbWF4aW11bV9zcGVlZChkZXYtPm9mX25vZGUpID09IFVTQl9TUEVFRF9GVUxMKQorCQlwbGF0ZGF0YS0+ZmxhZ3MgfD0gQ0lfSERSQ19GT1JDRV9GVUxMU1BFRUQ7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDk2LDMzICs1MDcsNiBAQAogCX0KIH0KIAotc3RhdGljIGludCBjaV91c2JfcGh5X2luaXQoc3RydWN0IGNpX2hkcmMgKmNpKQotewotCWlmIChjaS0+cGxhdGRhdGEtPnBoeSkgewotCQljaS0+dHJhbnNjZWl2ZXIgPSBjaS0+cGxhdGRhdGEtPnBoeTsKLQkJcmV0dXJuIHVzYl9waHlfaW5pdChjaS0+dHJhbnNjZWl2ZXIpOwotCX0gZWxzZSB7Ci0JCWNpLT5nbG9iYWxfcGh5ID0gdHJ1ZTsKLQkJY2ktPnRyYW5zY2VpdmVyID0gdXNiX2dldF9waHkoVVNCX1BIWV9UWVBFX1VTQjIpOwotCQlpZiAoSVNfRVJSKGNpLT50cmFuc2NlaXZlcikpCi0JCQljaS0+dHJhbnNjZWl2ZXIgPSBOVUxMOwotCi0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIHZvaWQgY2lfdXNiX3BoeV9kZXN0cm95KHN0cnVjdCBjaV9oZHJjICpjaSkKLXsKLQlpZiAoIWNpLT50cmFuc2NlaXZlcikKLQkJcmV0dXJuOwotCi0Jb3RnX3NldF9wZXJpcGhlcmFsKGNpLT50cmFuc2NlaXZlci0+b3RnLCBOVUxMKTsKLQlpZiAoY2ktPmdsb2JhbF9waHkpCi0JCXVzYl9wdXRfcGh5KGNpLT50cmFuc2NlaXZlcik7Ci0JZWxzZQotCQl1c2JfcGh5X3NodXRkb3duKGNpLT50cmFuc2NlaXZlcik7Ci19Ci0KIHN0YXRpYyBpbnQgY2lfaGRyY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkZXZpY2UJKmRldiA9ICZwZGV2LT5kZXY7CkBAIC01MzIsNyArNTE2LDcgQEAKIAlpbnQJCXJldDsKIAllbnVtIHVzYl9kcl9tb2RlIGRyX21vZGU7CiAKLQlpZiAoIWRldi0+cGxhdGZvcm1fZGF0YSkgeworCWlmICghZGV2X2dldF9wbGF0ZGF0YShkZXYpKSB7CiAJCWRldl9lcnIoZGV2LCAicGxhdGZvcm0gZGF0YSBtaXNzaW5nXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtNTQ5LDcgKzUzMyw3IEBACiAJfQogCiAJY2ktPmRldiA9IGRldjsKLQljaS0+cGxhdGRhdGEgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJY2ktPnBsYXRkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOwogCWNpLT5pbXgyOF93cml0ZV9maXggPSAhIShjaS0+cGxhdGRhdGEtPmZsYWdzICYKIAkJQ0lfSERSQ19JTVgyOF9XUklURV9GSVgpOwogCkBAIC01NjEsNyArNTQ1LDI2IEBACiAKIAlod19waHltb2RlX2NvbmZpZ3VyZShjaSk7CiAKLQlyZXQgPSBjaV91c2JfcGh5X2luaXQoY2kpOworCWlmIChjaS0+cGxhdGRhdGEtPnBoeSkKKwkJY2ktPnRyYW5zY2VpdmVyID0gY2ktPnBsYXRkYXRhLT5waHk7CisJZWxzZQorCQljaS0+dHJhbnNjZWl2ZXIgPSBkZXZtX3VzYl9nZXRfcGh5KGRldiwgVVNCX1BIWV9UWVBFX1VTQjIpOworCisJaWYgKElTX0VSUihjaS0+dHJhbnNjZWl2ZXIpKSB7CisJCXJldCA9IFBUUl9FUlIoY2ktPnRyYW5zY2VpdmVyKTsKKwkJLyoKKwkJICogaWYgLUVOWElPIGlzIHJldHVybmVkLCBpdCBtZWFucyBQSFkgbGF5ZXIgd2Fzbid0CisJCSAqIGVuYWJsZWQsIHNvIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHJldHVybiAtRVBST0JFX0RFRkVSCisJCSAqIGluIHRoYXQgY2FzZSwgc2luY2Ugbm8gUEhZIGRyaXZlciB3aWxsIGV2ZXIgcHJvYmUuCisJCSAqLworCQlpZiAocmV0ID09IC1FTlhJTykKKwkJCXJldHVybiByZXQ7CisKKwkJZGV2X2VycihkZXYsICJubyB1c2IyIHBoeSBjb25maWd1cmVkXG4iKTsKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJfQorCisJcmV0ID0gdXNiX3BoeV9pbml0KGNpLT50cmFuc2NlaXZlcik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBpbml0IHBoeTogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CkBAIC01NzIsOCArNTc1LDggQEAKIAljaS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAoY2ktPmlycSA8IDApIHsKIAkJZGV2X2VycihkZXYsICJtaXNzaW5nIElSUVxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZGVzdHJveV9waHk7CisJCXJldCA9IGNpLT5pcnE7CisJCWdvdG8gZGVpbml0X3BoeTsKIAl9CiAKIAljaV9nZXRfb3RnX2NhcGFibGUoY2kpOwpAQCAtNTkwLDIzICs1OTMsMTIgQEAKIAkJcmV0ID0gY2lfaGRyY19nYWRnZXRfaW5pdChjaSk7CiAJCWlmIChyZXQpCiAJCQlkZXZfaW5mbyhkZXYsICJkb2Vzbid0IHN1cHBvcnQgZ2FkZ2V0XG4iKTsKLQkJaWYgKCFyZXQgJiYgY2ktPnRyYW5zY2VpdmVyKSB7Ci0JCQlyZXQgPSBvdGdfc2V0X3BlcmlwaGVyYWwoY2ktPnRyYW5zY2VpdmVyLT5vdGcsCi0JCQkJCQkJJmNpLT5nYWRnZXQpOwotCQkJLyoKLQkJCSAqIElmIHdlIGltcGxlbWVudCBhbGwgVVNCIGZ1bmN0aW9ucyB1c2luZyBjaGlwaWRlYSBkcml2ZXJzLAotCQkJICogaXQgZG9lc24ndCBuZWVkIHRvIGNhbGwgYWJvdmUgQVBJLCBtZWFud2hpbGUsIGlmIHdlIG9ubHkKLQkJCSAqIHVzZSBnYWRnZXQgZnVuY3Rpb24sIGNhbGxpbmcgYWJvdmUgQVBJIGlzIHVzZWxlc3MuCi0JCQkgKi8KLQkJCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9UU1VQUCkKLQkJCQlnb3RvIGRlc3Ryb3lfcGh5OwotCQl9CiAJfQogCiAJaWYgKCFjaS0+cm9sZXNbQ0lfUk9MRV9IT1NUXSAmJiAhY2ktPnJvbGVzW0NJX1JPTEVfR0FER0VUXSkgewogCQlkZXZfZXJyKGRldiwgIm5vIHN1cHBvcnRlZCByb2xlc1xuIik7CiAJCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZGVzdHJveV9waHk7CisJCWdvdG8gZGVpbml0X3BoeTsKIAl9CiAKIAlpZiAoY2ktPmlzX290ZykgewpAQCAtNjYzLDggKzY1NSw4IEBACiAJZnJlZV9pcnEoY2ktPmlycSwgY2kpOwogc3RvcDoKIAljaV9yb2xlX2Rlc3Ryb3koY2kpOwotZGVzdHJveV9waHk6Ci0JY2lfdXNiX3BoeV9kZXN0cm95KGNpKTsKK2RlaW5pdF9waHk6CisJdXNiX3BoeV9zaHV0ZG93bihjaS0+dHJhbnNjZWl2ZXIpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTY3Nyw3ICs2NjksOCBAQAogCWZyZWVfaXJxKGNpLT5pcnEsIGNpKTsKIAljaV9yb2xlX2Rlc3Ryb3koY2kpOwogCWNpX2hkcmNfZW50ZXJfbHBtKGNpLCB0cnVlKTsKLQljaV91c2JfcGh5X2Rlc3Ryb3koY2kpOworCXVzYl9waHlfc2h1dGRvd24oY2ktPnRyYW5zY2VpdmVyKTsKKwlrZnJlZShjaS0+aHdfYmFuay5yZWdtYXApOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS91ZGMuYyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL3VkYy5jCmluZGV4IDRhYjJjYjYuLjc3MzljNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL3VkYy5jCkBAIC0xNzgsMTkgKzE3OCw2IEBACiB9CiAKIC8qKgotICogaHdfdGVzdF9hbmRfY2xlYXJfc2V0dXBfc3RhdHVzOiB0ZXN0ICYgY2xlYXIgc2V0dXAgc3RhdHVzIChleGVjdXRlIHdpdGhvdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uKQotICogQG46IGVuZHBvaW50IG51bWJlcgotICoKLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBzZXR1cCBzdGF0dXMKLSAqLwotc3RhdGljIGludCBod190ZXN0X2FuZF9jbGVhcl9zZXR1cF9zdGF0dXMoc3RydWN0IGNpX2hkcmMgKmNpLCBpbnQgbikKLXsKLQluID0gZXBfdG9fYml0KGNpLCBuKTsKLQlyZXR1cm4gaHdfdGVzdF9hbmRfY2xlYXIoY2ksIE9QX0VORFBUU0VUVVBTVEFULCBCSVQobikpOwotfQotCi0vKioKICAqIGh3X2VwX3ByaW1lOiBwcmltZXMgZW5kcG9pbnQgKGV4ZWN1dGUgd2l0aG91dCBpbnRlcnJ1cHRpb24pCiAgKiBAbnVtOiAgICAgZW5kcG9pbnQgbnVtYmVyCiAgKiBAZGlyOiAgICAgZW5kcG9pbnQgZGlyZWN0aW9uCkBAIC05NjIsNiArOTQ5LDE1NiBAQAogfQogCiAvKioKKyAqIGlzcl9zZXR1cF9wYWNrZXRfaGFuZGxlcjogc2V0dXAgcGFja2V0IGhhbmRsZXIKKyAqIEBjaTogVURDIGRlc2NyaXB0b3IKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgc2V0dXAgcGFja2V0IAorICovCitzdGF0aWMgdm9pZCBpc3Jfc2V0dXBfcGFja2V0X2hhbmRsZXIoc3RydWN0IGNpX2hkcmMgKmNpKQorX19yZWxlYXNlcyhjaS0+bG9jaykKK19fYWNxdWlyZXMoY2ktPmxvY2spCit7CisJc3RydWN0IGNpX2h3X2VwICpod2VwID0gJmNpLT5jaV9od19lcFswXTsKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IHJlcTsKKwlpbnQgdHlwZSwgbnVtLCBkaXIsIGVyciA9IC1FSU5WQUw7CisJdTggdG1vZGUgPSAwOworCisJLyoKKwkgKiBGbHVzaCBkYXRhIGFuZCBoYW5kc2hha2UgdHJhbnNhY3Rpb25zIG9mIHByZXZpb3VzCisJICogc2V0dXAgcGFja2V0LgorCSAqLworCV9lcF9udWtlKGNpLT5lcDBvdXQpOworCV9lcF9udWtlKGNpLT5lcDBpbik7CisKKwkvKiByZWFkX3NldHVwX3BhY2tldCAqLworCWRvIHsKKwkJaHdfdGVzdF9hbmRfc2V0X3NldHVwX2d1YXJkKGNpKTsKKwkJbWVtY3B5KCZyZXEsICZod2VwLT5xaC5wdHItPnNldHVwLCBzaXplb2YocmVxKSk7CisJfSB3aGlsZSAoIWh3X3Rlc3RfYW5kX2NsZWFyX3NldHVwX2d1YXJkKGNpKSk7CisKKwl0eXBlID0gcmVxLmJSZXF1ZXN0VHlwZTsKKworCWNpLT5lcDBfZGlyID0gKHR5cGUgJiBVU0JfRElSX0lOKSA/IFRYIDogUlg7CisKKwlzd2l0Y2ggKHJlcS5iUmVxdWVzdCkgeworCWNhc2UgVVNCX1JFUV9DTEVBUl9GRUFUVVJFOgorCQlpZiAodHlwZSA9PSAoVVNCX0RJUl9PVVR8VVNCX1JFQ0lQX0VORFBPSU5UKSAmJgorCQkJCWxlMTZfdG9fY3B1KHJlcS53VmFsdWUpID09CisJCQkJVVNCX0VORFBPSU5UX0hBTFQpIHsKKwkJCWlmIChyZXEud0xlbmd0aCAhPSAwKQorCQkJCWJyZWFrOworCQkJbnVtICA9IGxlMTZfdG9fY3B1KHJlcS53SW5kZXgpOworCQkJZGlyID0gbnVtICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLOworCQkJbnVtICY9IFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKKwkJCWlmIChkaXIpIC8qIFRYICovCisJCQkJbnVtICs9IGNpLT5od19lcF9tYXggLyAyOworCQkJaWYgKCFjaS0+Y2lfaHdfZXBbbnVtXS53ZWRnZSkgeworCQkJCXNwaW5fdW5sb2NrKCZjaS0+bG9jayk7CisJCQkJZXJyID0gdXNiX2VwX2NsZWFyX2hhbHQoCisJCQkJCSZjaS0+Y2lfaHdfZXBbbnVtXS5lcCk7CisJCQkJc3Bpbl9sb2NrKCZjaS0+bG9jayk7CisJCQkJaWYgKGVycikKKwkJCQkJYnJlYWs7CisJCQl9CisJCQllcnIgPSBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKGNpKTsKKwkJfSBlbHNlIGlmICh0eXBlID09IChVU0JfRElSX09VVHxVU0JfUkVDSVBfREVWSUNFKSAmJgorCQkJCWxlMTZfdG9fY3B1KHJlcS53VmFsdWUpID09CisJCQkJVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQKSB7CisJCQlpZiAocmVxLndMZW5ndGggIT0gMCkKKwkJCQlicmVhazsKKwkJCWNpLT5yZW1vdGVfd2FrZXVwID0gMDsKKwkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UoY2kpOworCQl9IGVsc2UgeworCQkJZ290byBkZWxlZ2F0ZTsKKwkJfQorCQlicmVhazsKKwljYXNlIFVTQl9SRVFfR0VUX1NUQVRVUzoKKwkJaWYgKHR5cGUgIT0gKFVTQl9ESVJfSU58VVNCX1JFQ0lQX0RFVklDRSkgICAmJgorCQkgICAgdHlwZSAhPSAoVVNCX0RJUl9JTnxVU0JfUkVDSVBfRU5EUE9JTlQpICYmCisJCSAgICB0eXBlICE9IChVU0JfRElSX0lOfFVTQl9SRUNJUF9JTlRFUkZBQ0UpKQorCQkJZ290byBkZWxlZ2F0ZTsKKwkJaWYgKGxlMTZfdG9fY3B1KHJlcS53TGVuZ3RoKSAhPSAyIHx8CisJCSAgICBsZTE2X3RvX2NwdShyZXEud1ZhbHVlKSAgIT0gMCkKKwkJCWJyZWFrOworCQllcnIgPSBpc3JfZ2V0X3N0YXR1c19yZXNwb25zZShjaSwgJnJlcSk7CisJCWJyZWFrOworCWNhc2UgVVNCX1JFUV9TRVRfQUREUkVTUzoKKwkJaWYgKHR5cGUgIT0gKFVTQl9ESVJfT1VUfFVTQl9SRUNJUF9ERVZJQ0UpKQorCQkJZ290byBkZWxlZ2F0ZTsKKwkJaWYgKGxlMTZfdG9fY3B1KHJlcS53TGVuZ3RoKSAhPSAwIHx8CisJCSAgICBsZTE2X3RvX2NwdShyZXEud0luZGV4KSAgIT0gMCkKKwkJCWJyZWFrOworCQljaS0+YWRkcmVzcyA9ICh1OClsZTE2X3RvX2NwdShyZXEud1ZhbHVlKTsKKwkJY2ktPnNldGFkZHIgPSB0cnVlOworCQllcnIgPSBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKGNpKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfUkVRX1NFVF9GRUFUVVJFOgorCQlpZiAodHlwZSA9PSAoVVNCX0RJUl9PVVR8VVNCX1JFQ0lQX0VORFBPSU5UKSAmJgorCQkJCWxlMTZfdG9fY3B1KHJlcS53VmFsdWUpID09CisJCQkJVVNCX0VORFBPSU5UX0hBTFQpIHsKKwkJCWlmIChyZXEud0xlbmd0aCAhPSAwKQorCQkJCWJyZWFrOworCQkJbnVtICA9IGxlMTZfdG9fY3B1KHJlcS53SW5kZXgpOworCQkJZGlyID0gbnVtICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLOworCQkJbnVtICY9IFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKKwkJCWlmIChkaXIpIC8qIFRYICovCisJCQkJbnVtICs9IGNpLT5od19lcF9tYXggLyAyOworCisJCQlzcGluX3VubG9jaygmY2ktPmxvY2spOworCQkJZXJyID0gdXNiX2VwX3NldF9oYWx0KCZjaS0+Y2lfaHdfZXBbbnVtXS5lcCk7CisJCQlzcGluX2xvY2soJmNpLT5sb2NrKTsKKwkJCWlmICghZXJyKQorCQkJCWlzcl9zZXR1cF9zdGF0dXNfcGhhc2UoY2kpOworCQl9IGVsc2UgaWYgKHR5cGUgPT0gKFVTQl9ESVJfT1VUfFVTQl9SRUNJUF9ERVZJQ0UpKSB7CisJCQlpZiAocmVxLndMZW5ndGggIT0gMCkKKwkJCQlicmVhazsKKwkJCXN3aXRjaCAobGUxNl90b19jcHUocmVxLndWYWx1ZSkpIHsKKwkJCWNhc2UgVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQOgorCQkJCWNpLT5yZW1vdGVfd2FrZXVwID0gMTsKKwkJCQllcnIgPSBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKGNpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVVNCX0RFVklDRV9URVNUX01PREU6CisJCQkJdG1vZGUgPSBsZTE2X3RvX2NwdShyZXEud0luZGV4KSA+PiA4OworCQkJCXN3aXRjaCAodG1vZGUpIHsKKwkJCQljYXNlIFRFU1RfSjoKKwkJCQljYXNlIFRFU1RfSzoKKwkJCQljYXNlIFRFU1RfU0UwX05BSzoKKwkJCQljYXNlIFRFU1RfUEFDS0VUOgorCQkJCWNhc2UgVEVTVF9GT1JDRV9FTjoKKwkJCQkJY2ktPnRlc3RfbW9kZSA9IHRtb2RlOworCQkJCQllcnIgPSBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKAorCQkJCQkJCWNpKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJZGVmYXVsdDoKKwkJCQlnb3RvIGRlbGVnYXRlOworCQkJfQorCQl9IGVsc2UgeworCQkJZ290byBkZWxlZ2F0ZTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorZGVsZWdhdGU6CisJCWlmIChyZXEud0xlbmd0aCA9PSAwKSAgIC8qIG5vIGRhdGEgcGhhc2UgKi8KKwkJCWNpLT5lcDBfZGlyID0gVFg7CisKKwkJc3Bpbl91bmxvY2soJmNpLT5sb2NrKTsKKwkJZXJyID0gY2ktPmRyaXZlci0+c2V0dXAoJmNpLT5nYWRnZXQsICZyZXEpOworCQlzcGluX2xvY2soJmNpLT5sb2NrKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGVyciA8IDApIHsKKwkJc3Bpbl91bmxvY2soJmNpLT5sb2NrKTsKKwkJaWYgKHVzYl9lcF9zZXRfaGFsdCgmaHdlcC0+ZXApKQorCQkJZGV2X2VycihjaS0+ZGV2LCAiZXJyb3I6IGVwX3NldF9oYWx0XG4iKTsKKwkJc3Bpbl9sb2NrKCZjaS0+bG9jayk7CisJfQorfQorCisvKioKICAqIGlzcl90cl9jb21wbGV0ZV9oYW5kbGVyOiB0cmFuc2FjdGlvbiBjb21wbGV0ZSBpbnRlcnJ1cHQgaGFuZGxlcgogICogQGNpOiBVREMgZGVzY3JpcHRvcgogICoKQEAgLTk3MiwxMiArMTEwOSwxMCBAQAogX19hY3F1aXJlcyhjaS0+bG9jaykKIHsKIAl1bnNpZ25lZCBpOwotCXU4IHRtb2RlID0gMDsKKwlpbnQgZXJyOwogCiAJZm9yIChpID0gMDsgaSA8IGNpLT5od19lcF9tYXg7IGkrKykgewogCQlzdHJ1Y3QgY2lfaHdfZXAgKmh3ZXAgID0gJmNpLT5jaV9od19lcFtpXTsKLQkJaW50IHR5cGUsIG51bSwgZGlyLCBlcnIgPSAtRUlOVkFMOwotCQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IHJlcTsKIAogCQlpZiAoaHdlcC0+ZXAuZGVzYyA9PSBOVUxMKQogCQkJY29udGludWU7ICAgLyogbm90IGNvbmZpZ3VyZWQgKi8KQEAgLTk5NywxNDggKzExMzIsMTAgQEAKIAkJCX0KIAkJfQogCi0JCWlmIChod2VwLT50eXBlICE9IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wgfHwKLQkJICAgICFod190ZXN0X2FuZF9jbGVhcl9zZXR1cF9zdGF0dXMoY2ksIGkpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGkgIT0gMCkgewotCQkJZGV2X3dhcm4oY2ktPmRldiwgImN0cmwgdHJhZmZpYyBhdCBlbmRwb2ludCAlZFxuIiwgaSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qCi0JCSAqIEZsdXNoIGRhdGEgYW5kIGhhbmRzaGFrZSB0cmFuc2FjdGlvbnMgb2YgcHJldmlvdXMKLQkJICogc2V0dXAgcGFja2V0LgotCQkgKi8KLQkJX2VwX251a2UoY2ktPmVwMG91dCk7Ci0JCV9lcF9udWtlKGNpLT5lcDBpbik7Ci0KLQkJLyogcmVhZF9zZXR1cF9wYWNrZXQgKi8KLQkJZG8gewotCQkJaHdfdGVzdF9hbmRfc2V0X3NldHVwX2d1YXJkKGNpKTsKLQkJCW1lbWNweSgmcmVxLCAmaHdlcC0+cWgucHRyLT5zZXR1cCwgc2l6ZW9mKHJlcSkpOwotCQl9IHdoaWxlICghaHdfdGVzdF9hbmRfY2xlYXJfc2V0dXBfZ3VhcmQoY2kpKTsKLQotCQl0eXBlID0gcmVxLmJSZXF1ZXN0VHlwZTsKLQotCQljaS0+ZXAwX2RpciA9ICh0eXBlICYgVVNCX0RJUl9JTikgPyBUWCA6IFJYOwotCi0JCXN3aXRjaCAocmVxLmJSZXF1ZXN0KSB7Ci0JCWNhc2UgVVNCX1JFUV9DTEVBUl9GRUFUVVJFOgotCQkJaWYgKHR5cGUgPT0gKFVTQl9ESVJfT1VUfFVTQl9SRUNJUF9FTkRQT0lOVCkgJiYKLQkJCQkJbGUxNl90b19jcHUocmVxLndWYWx1ZSkgPT0KLQkJCQkJVVNCX0VORFBPSU5UX0hBTFQpIHsKLQkJCQlpZiAocmVxLndMZW5ndGggIT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQkJbnVtICA9IGxlMTZfdG9fY3B1KHJlcS53SW5kZXgpOwotCQkJCWRpciA9IG51bSAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSzsKLQkJCQludW0gJj0gVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOwotCQkJCWlmIChkaXIpIC8qIFRYICovCi0JCQkJCW51bSArPSBjaS0+aHdfZXBfbWF4LzI7Ci0JCQkJaWYgKCFjaS0+Y2lfaHdfZXBbbnVtXS53ZWRnZSkgewotCQkJCQlzcGluX3VubG9jaygmY2ktPmxvY2spOwotCQkJCQllcnIgPSB1c2JfZXBfY2xlYXJfaGFsdCgKLQkJCQkJCSZjaS0+Y2lfaHdfZXBbbnVtXS5lcCk7Ci0JCQkJCXNwaW5fbG9jaygmY2ktPmxvY2spOwotCQkJCQlpZiAoZXJyKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UoY2kpOwotCQkJfSBlbHNlIGlmICh0eXBlID09IChVU0JfRElSX09VVHxVU0JfUkVDSVBfREVWSUNFKSAmJgotCQkJCQlsZTE2X3RvX2NwdShyZXEud1ZhbHVlKSA9PQotCQkJCQlVU0JfREVWSUNFX1JFTU9URV9XQUtFVVApIHsKLQkJCQlpZiAocmVxLndMZW5ndGggIT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQkJY2ktPnJlbW90ZV93YWtldXAgPSAwOwotCQkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UoY2kpOwotCQkJfSBlbHNlIHsKLQkJCQlnb3RvIGRlbGVnYXRlOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgVVNCX1JFUV9HRVRfU1RBVFVTOgotCQkJaWYgKHR5cGUgIT0gKFVTQl9ESVJfSU58VVNCX1JFQ0lQX0RFVklDRSkgICAmJgotCQkJICAgIHR5cGUgIT0gKFVTQl9ESVJfSU58VVNCX1JFQ0lQX0VORFBPSU5UKSAmJgotCQkJICAgIHR5cGUgIT0gKFVTQl9ESVJfSU58VVNCX1JFQ0lQX0lOVEVSRkFDRSkpCi0JCQkJZ290byBkZWxlZ2F0ZTsKLQkJCWlmIChsZTE2X3RvX2NwdShyZXEud0xlbmd0aCkgIT0gMiB8fAotCQkJICAgIGxlMTZfdG9fY3B1KHJlcS53VmFsdWUpICAhPSAwKQotCQkJCWJyZWFrOwotCQkJZXJyID0gaXNyX2dldF9zdGF0dXNfcmVzcG9uc2UoY2ksICZyZXEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVVNCX1JFUV9TRVRfQUREUkVTUzoKLQkJCWlmICh0eXBlICE9IChVU0JfRElSX09VVHxVU0JfUkVDSVBfREVWSUNFKSkKLQkJCQlnb3RvIGRlbGVnYXRlOwotCQkJaWYgKGxlMTZfdG9fY3B1KHJlcS53TGVuZ3RoKSAhPSAwIHx8Ci0JCQkgICAgbGUxNl90b19jcHUocmVxLndJbmRleCkgICE9IDApCi0JCQkJYnJlYWs7Ci0JCQljaS0+YWRkcmVzcyA9ICh1OClsZTE2X3RvX2NwdShyZXEud1ZhbHVlKTsKLQkJCWNpLT5zZXRhZGRyID0gdHJ1ZTsKLQkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UoY2kpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVVNCX1JFUV9TRVRfRkVBVFVSRToKLQkJCWlmICh0eXBlID09IChVU0JfRElSX09VVHxVU0JfUkVDSVBfRU5EUE9JTlQpICYmCi0JCQkJCWxlMTZfdG9fY3B1KHJlcS53VmFsdWUpID09Ci0JCQkJCVVTQl9FTkRQT0lOVF9IQUxUKSB7Ci0JCQkJaWYgKHJlcS53TGVuZ3RoICE9IDApCi0JCQkJCWJyZWFrOwotCQkJCW51bSAgPSBsZTE2X3RvX2NwdShyZXEud0luZGV4KTsKLQkJCQlkaXIgPSBudW0gJiBVU0JfRU5EUE9JTlRfRElSX01BU0s7Ci0JCQkJbnVtICY9IFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKLQkJCQlpZiAoZGlyKSAvKiBUWCAqLwotCQkJCQludW0gKz0gY2ktPmh3X2VwX21heC8yOwotCi0JCQkJc3Bpbl91bmxvY2soJmNpLT5sb2NrKTsKLQkJCQllcnIgPSB1c2JfZXBfc2V0X2hhbHQoJmNpLT5jaV9od19lcFtudW1dLmVwKTsKLQkJCQlzcGluX2xvY2soJmNpLT5sb2NrKTsKLQkJCQlpZiAoIWVycikKLQkJCQkJaXNyX3NldHVwX3N0YXR1c19waGFzZShjaSk7Ci0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gKFVTQl9ESVJfT1VUfFVTQl9SRUNJUF9ERVZJQ0UpKSB7Ci0JCQkJaWYgKHJlcS53TGVuZ3RoICE9IDApCi0JCQkJCWJyZWFrOwotCQkJCXN3aXRjaCAobGUxNl90b19jcHUocmVxLndWYWx1ZSkpIHsKLQkJCQljYXNlIFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUDoKLQkJCQkJY2ktPnJlbW90ZV93YWtldXAgPSAxOwotCQkJCQllcnIgPSBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKGNpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBVU0JfREVWSUNFX1RFU1RfTU9ERToKLQkJCQkJdG1vZGUgPSBsZTE2X3RvX2NwdShyZXEud0luZGV4KSA+PiA4OwotCQkJCQlzd2l0Y2ggKHRtb2RlKSB7Ci0JCQkJCWNhc2UgVEVTVF9KOgotCQkJCQljYXNlIFRFU1RfSzoKLQkJCQkJY2FzZSBURVNUX1NFMF9OQUs6Ci0JCQkJCWNhc2UgVEVTVF9QQUNLRVQ6Ci0JCQkJCWNhc2UgVEVTVF9GT1JDRV9FTjoKLQkJCQkJCWNpLT50ZXN0X21vZGUgPSB0bW9kZTsKLQkJCQkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UoCi0JCQkJCQkJCWNpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQlkZWZhdWx0OgotCQkJCQlnb3RvIGRlbGVnYXRlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZ290byBkZWxlZ2F0ZTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotZGVsZWdhdGU6Ci0JCQlpZiAocmVxLndMZW5ndGggPT0gMCkgICAvKiBubyBkYXRhIHBoYXNlICovCi0JCQkJY2ktPmVwMF9kaXIgPSBUWDsKLQotCQkJc3Bpbl91bmxvY2soJmNpLT5sb2NrKTsKLQkJCWVyciA9IGNpLT5kcml2ZXItPnNldHVwKCZjaS0+Z2FkZ2V0LCAmcmVxKTsKLQkJCXNwaW5fbG9jaygmY2ktPmxvY2spOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoZXJyIDwgMCkgewotCQkJc3Bpbl91bmxvY2soJmNpLT5sb2NrKTsKLQkJCWlmICh1c2JfZXBfc2V0X2hhbHQoJmh3ZXAtPmVwKSkKLQkJCQlkZXZfZXJyKGNpLT5kZXYsICJlcnJvcjogZXBfc2V0X2hhbHRcbiIpOwotCQkJc3Bpbl9sb2NrKCZjaS0+bG9jayk7Ci0JCX0KKwkJLyogT25seSBoYW5kbGUgc2V0dXAgcGFja2V0IGJlbG93ICovCisJCWlmIChpID09IDAgJiYKKwkJCWh3X3Rlc3RfYW5kX2NsZWFyKGNpLCBPUF9FTkRQVFNFVFVQU1RBVCwgQklUKDApKSkKKwkJCWlzcl9zZXR1cF9wYWNrZXRfaGFuZGxlcihjaSk7CiAJfQogfQogCkBAIC0xMTkzLDYgKzExOTAsMTEgQEAKIAogCWh3ZXAtPnFoLnB0ci0+dGQubmV4dCB8PSBjcHVfdG9fbGUzMihURF9URVJNSU5BVEUpOyAgIC8qIG5lZWRlZD8gKi8KIAorCWlmIChod2VwLT5udW0gIT0gMCAmJiBod2VwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpIHsKKwkJZGV2X2Vycihod2VwLT5jaS0+ZGV2LCAiU2V0IGNvbnRyb2wgeGZlciBhdCBub24tZXAwXG4iKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwl9CisKIAkvKgogCSAqIEVuYWJsZSBlbmRwb2ludHMgaW4gdGhlIEhXIG90aGVyIHRoYW4gZXAwIGFzIGVwMAogCSAqIGlzIGFsd2F5cyBlbmFibGVkCkBAIC0xODM3LDEyICsxODM5LDYgQEAKIAogCWRtYV9wb29sX2Rlc3Ryb3koY2ktPnRkX3Bvb2wpOwogCWRtYV9wb29sX2Rlc3Ryb3koY2ktPnFoX3Bvb2wpOwotCi0JaWYgKGNpLT50cmFuc2NlaXZlcikgewotCQlvdGdfc2V0X3BlcmlwaGVyYWwoY2ktPnRyYW5zY2VpdmVyLT5vdGcsIE5VTEwpOwotCQlpZiAoY2ktPmdsb2JhbF9waHkpCi0JCQl1c2JfcHV0X3BoeShjaS0+dHJhbnNjZWl2ZXIpOwotCX0KIH0KIAogc3RhdGljIGludCB1ZGNfaWRfc3dpdGNoX2Zvcl9kZXZpY2Uoc3RydWN0IGNpX2hkcmMgKmNpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9jb25maWcuYyBiL2RyaXZlcnMvdXNiL2NvcmUvY29uZmlnLmMKaW5kZXggMDYyOTY3Yy4uMWFiNGRmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9jb25maWcuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2NvbmZpZy5jCkBAIC0xMCw3ICsxMCw2IEBACiAKIAogI2RlZmluZSBVU0JfTUFYQUxUU0VUVElORwkJMTI4CS8qIEhhcmQgbGltaXQgKi8KLSNkZWZpbmUgVVNCX01BWEVORFBPSU5UUwkJMzAJLyogSGFyZCBsaW1pdCAqLwogCiAjZGVmaW5lIFVTQl9NQVhDT05GSUcJCQk4CS8qIEFyYml0cmFyeSBsaW1pdCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKaW5kZXggOTBlMThmNi4uMjU3ODc2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwpAQCAtNjIsNyArNjIsNyBAQAogLyogTXV0dWFsIGV4Y2x1c2lvbiBmb3IgcmVtb3ZhbCwgb3BlbiwgYW5kIHJlbGVhc2UgKi8KIERFRklORV9NVVRFWCh1c2Jmc19tdXRleCk7CiAKLXN0cnVjdCBkZXZfc3RhdGUgeworc3RydWN0IHVzYl9kZXZfc3RhdGUgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgICAgICAvKiBzdGF0ZSBsaXN0ICovCiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKQEAgLTgxLDcgKzgxLDcgQEAKIAogc3RydWN0IGFzeW5jIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGFzeW5jbGlzdDsKLQlzdHJ1Y3QgZGV2X3N0YXRlICpwczsKKwlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHM7CiAJc3RydWN0IHBpZCAqcGlkOwogCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkOwogCXVuc2lnbmVkIGludCBzaWducjsKQEAgLTE1MSw3ICsxNTEsNyBAQAogCWF0b21pY19zdWIoYW1vdW50LCAmdXNiZnNfbWVtb3J5X3VzYWdlKTsKIH0KIAotc3RhdGljIGludCBjb25uZWN0ZWQoc3RydWN0IGRldl9zdGF0ZSAqcHMpCitzdGF0aWMgaW50IGNvbm5lY3RlZChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMpCiB7CiAJcmV0dXJuICghbGlzdF9lbXB0eSgmcHMtPmxpc3QpICYmCiAJCQlwcy0+ZGV2LT5zdGF0ZSAhPSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpOwpAQCAtMTg0LDcgKzE4NCw3IEBACiBzdGF0aWMgc3NpemVfdCB1c2JkZXZfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywKIAkJCSAgIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgZGV2X3N0YXRlICpwcyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHBzLT5kZXY7CiAJc3NpemVfdCByZXQgPSAwOwogCXVuc2lnbmVkIGxlbjsKQEAgLTMwNyw3ICszMDcsNyBAQAogCiBzdGF0aWMgdm9pZCBhc3luY19uZXdwZW5kaW5nKHN0cnVjdCBhc3luYyAqYXMpCiB7Ci0Jc3RydWN0IGRldl9zdGF0ZSAqcHMgPSBhcy0+cHM7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzID0gYXMtPnBzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHMtPmxvY2ssIGZsYWdzKTsKQEAgLTMxNyw3ICszMTcsNyBAQAogCiBzdGF0aWMgdm9pZCBhc3luY19yZW1vdmVwZW5kaW5nKHN0cnVjdCBhc3luYyAqYXMpCiB7Ci0Jc3RydWN0IGRldl9zdGF0ZSAqcHMgPSBhcy0+cHM7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzID0gYXMtPnBzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHMtPmxvY2ssIGZsYWdzKTsKQEAgLTMyNSw3ICszMjUsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYXN5bmMgKmFzeW5jX2dldGNvbXBsZXRlZChzdHJ1Y3QgZGV2X3N0YXRlICpwcykKK3N0YXRpYyBzdHJ1Y3QgYXN5bmMgKmFzeW5jX2dldGNvbXBsZXRlZChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgYXN5bmMgKmFzID0gTlVMTDsKQEAgLTM0MCw3ICszNDAsNyBAQAogCXJldHVybiBhczsKIH0KIAotc3RhdGljIHN0cnVjdCBhc3luYyAqYXN5bmNfZ2V0cGVuZGluZyhzdHJ1Y3QgZGV2X3N0YXRlICpwcywKK3N0YXRpYyBzdHJ1Y3QgYXN5bmMgKmFzeW5jX2dldHBlbmRpbmcoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLAogCQkJCQkgICAgIHZvaWQgX191c2VyICp1c2VydXJiKQogewogCXN0cnVjdCBhc3luYyAqYXM7CkBAIC00NDgsNyArNDQ4LDcgQEAKICNkZWZpbmUgQVNfQ09OVElOVUFUSU9OCTEKICNkZWZpbmUgQVNfVU5MSU5LCTIKIAotc3RhdGljIHZvaWQgY2FuY2VsX2J1bGtfdXJicyhzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdW5zaWduZWQgYnVsa19hZGRyKQorc3RhdGljIHZvaWQgY2FuY2VsX2J1bGtfdXJicyhzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHVuc2lnbmVkIGJ1bGtfYWRkcikKIF9fcmVsZWFzZXMocHMtPmxvY2spCiBfX2FjcXVpcmVzKHBzLT5sb2NrKQogewpAQCAtNDg5LDcgKzQ4OSw3IEBACiBzdGF0aWMgdm9pZCBhc3luY19jb21wbGV0ZWQoc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCBhc3luYyAqYXMgPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IGRldl9zdGF0ZSAqcHMgPSBhcy0+cHM7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzID0gYXMtPnBzOwogCXN0cnVjdCBzaWdpbmZvIHNpbmZvOwogCXN0cnVjdCBwaWQgKnBpZCA9IE5VTEw7CiAJdTMyIHNlY2lkID0gMDsKQEAgLTUyOSw3ICs1MjksNyBAQAogCXdha2VfdXAoJnBzLT53YWl0KTsKIH0KIAotc3RhdGljIHZvaWQgZGVzdHJveV9hc3luYyhzdHJ1Y3QgZGV2X3N0YXRlICpwcywgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfYXN5bmMoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQogewogCXN0cnVjdCB1cmIgKnVyYjsKIAlzdHJ1Y3QgYXN5bmMgKmFzOwpAQCAtNTUxLDcgKzU1MSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHMtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgZGVzdHJveV9hc3luY19vbl9pbnRlcmZhY2Uoc3RydWN0IGRldl9zdGF0ZSAqcHMsCitzdGF0aWMgdm9pZCBkZXN0cm95X2FzeW5jX29uX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsCiAJCQkJICAgICAgIHVuc2lnbmVkIGludCBpZm51bSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqcSwgaGl0bGlzdDsKQEAgLTU2Niw3ICs1NjYsNyBAQAogCWRlc3Ryb3lfYXN5bmMocHMsICZoaXRsaXN0KTsKIH0KIAotc3RhdGljIHZvaWQgZGVzdHJveV9hbGxfYXN5bmMoc3RydWN0IGRldl9zdGF0ZSAqcHMpCitzdGF0aWMgdm9pZCBkZXN0cm95X2FsbF9hc3luYyhzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMpCiB7CiAJZGVzdHJveV9hc3luYyhwcywgJnBzLT5hc3luY19wZW5kaW5nKTsKIH0KQEAgLTU4NSw3ICs1ODUsNyBAQAogCiBzdGF0aWMgdm9pZCBkcml2ZXJfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKLQlzdHJ1Y3QgZGV2X3N0YXRlICpwcyA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAl1bnNpZ25lZCBpbnQgaWZudW0gPSBpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CiAKIAlpZiAoIXBzKQpAQCAtNjI4LDcgKzYyOCw3IEBACiAJLnJlc3VtZSA9CWRyaXZlcl9yZXN1bWUsCiB9OwogCi1zdGF0aWMgaW50IGNsYWltaW50ZihzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdW5zaWduZWQgaW50IGlmbnVtKQorc3RhdGljIGludCBjbGFpbWludGYoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB1bnNpZ25lZCBpbnQgaWZudW0pCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHBzLT5kZXY7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CkBAIC02NTAsNyArNjUwLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHJlbGVhc2VpbnRmKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB1bnNpZ25lZCBpbnQgaWZudW0pCitzdGF0aWMgaW50IHJlbGVhc2VpbnRmKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdW5zaWduZWQgaW50IGlmbnVtKQogewogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CkBAIC02NzAsNyArNjcwLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGNoZWNraW50ZihzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdW5zaWduZWQgaW50IGlmbnVtKQorc3RhdGljIGludCBjaGVja2ludGYoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB1bnNpZ25lZCBpbnQgaWZudW0pCiB7CiAJaWYgKHBzLT5kZXYtPnN0YXRlICE9IFVTQl9TVEFURV9DT05GSUdVUkVEKQogCQlyZXR1cm4gLUVIT1NUVU5SRUFDSDsKQEAgLTcxMCw3ICs3MTAsNyBAQAogCXJldHVybiAtRU5PRU5UOwogfQogCi1zdGF0aWMgaW50IGNoZWNrX2N0cmxyZWNpcChzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdW5zaWduZWQgaW50IHJlcXVlc3R0eXBlLAorc3RhdGljIGludCBjaGVja19jdHJscmVjaXAoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB1bnNpZ25lZCBpbnQgcmVxdWVzdHR5cGUsCiAJCQkgICB1bnNpZ25lZCBpbnQgcmVxdWVzdCwgdW5zaWduZWQgaW50IGluZGV4KQogewogCWludCByZXQgPSAwOwpAQCAtNzY5LDYgKzc2OSw4OCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwX3RvX2hvc3RfZW5kcG9pbnQoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwkJCQkJCSAgICAgdW5zaWduZWQgY2hhciBlcCkKK3sKKwlpZiAoZXAgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spCisJCXJldHVybiBkZXYtPmVwX2luW2VwICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLXTsKKwllbHNlCisJCXJldHVybiBkZXYtPmVwX291dFtlcCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTS107Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdXNiZGV2ZnNfc3RyZWFtcyhzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsCisJCQkJICBzdHJ1Y3QgdXNiZGV2ZnNfc3RyZWFtcyBfX3VzZXIgKnN0cmVhbXMsCisJCQkJICB1bnNpZ25lZCBpbnQgKm51bV9zdHJlYW1zX3JldCwKKwkJCQkgIHVuc2lnbmVkIGludCAqbnVtX2Vwc19yZXQsCisJCQkJICBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKioqZXBzX3JldCwKKwkJCQkgIHN0cnVjdCB1c2JfaW50ZXJmYWNlICoqaW50Zl9yZXQpCit7CisJdW5zaWduZWQgaW50IGksIG51bV9zdHJlYW1zLCBudW1fZXBzOworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqKmVwczsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IE5VTEw7CisJdW5zaWduZWQgY2hhciBlcDsKKwlpbnQgaWZudW0sIHJldDsKKworCWlmIChnZXRfdXNlcihudW1fc3RyZWFtcywgJnN0cmVhbXMtPm51bV9zdHJlYW1zKSB8fAorCSAgICBnZXRfdXNlcihudW1fZXBzLCAmc3RyZWFtcy0+bnVtX2VwcykpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKG51bV9lcHMgPCAxIHx8IG51bV9lcHMgPiBVU0JfTUFYRU5EUE9JTlRTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRoZSBYSENJIGNvbnRyb2xsZXIgYWxsb3dzIG1heCAyIF4gMTYgc3RyZWFtcyAqLworCWlmIChudW1fc3RyZWFtc19yZXQgJiYgKG51bV9zdHJlYW1zIDwgMiB8fCBudW1fc3RyZWFtcyA+IDY1NTM2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcHMgPSBrbWFsbG9jKG51bV9lcHMgKiBzaXplb2YoKmVwcyksIEdGUF9LRVJORUwpOworCWlmICghZXBzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fZXBzOyBpKyspIHsKKwkJaWYgKGdldF91c2VyKGVwLCAmc3RyZWFtcy0+ZXBzW2ldKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZXBzW2ldID0gZXBfdG9faG9zdF9lbmRwb2ludChwcy0+ZGV2LCBlcCk7CisJCWlmICghZXBzW2ldKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCS8qIHVzYl9hbGxvYy9mcmVlX3N0cmVhbXMgb3BlcmF0ZSBvbiBhbiB1c2JfaW50ZXJmYWNlICovCisJCWlmbnVtID0gZmluZGludGZlcChwcy0+ZGV2LCBlcCk7CisJCWlmIChpZm51bSA8IDApIHsKKwkJCXJldCA9IGlmbnVtOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWlmIChpID09IDApIHsKKwkJCXJldCA9IGNoZWNraW50ZihwcywgaWZudW0pOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCWludGYgPSB1c2JfaWZudW1fdG9faWYocHMtPmRldiwgaWZudW0pOworCQl9IGVsc2UgeworCQkJLyogVmVyaWZ5IGFsbCBlcHMgYmVsb25nIHRvIHRoZSBzYW1lIGludGVyZmFjZSAqLworCQkJaWYgKGlmbnVtICE9IGludGYtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcikgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfQorCX0KKworCWlmIChudW1fc3RyZWFtc19yZXQpCisJCSpudW1fc3RyZWFtc19yZXQgPSBudW1fc3RyZWFtczsKKwkqbnVtX2Vwc19yZXQgPSBudW1fZXBzOworCSplcHNfcmV0ID0gZXBzOworCSppbnRmX3JldCA9IGludGY7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJa2ZyZWUoZXBzKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG1hdGNoX2RldnQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewogCXJldHVybiBkZXYtPmRldnQgPT0gKGRldl90KSAodW5zaWduZWQgbG9uZykgZGF0YTsKQEAgLTc5MSwxMSArODczLDExIEBACiBzdGF0aWMgaW50IHVzYmRldl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBOVUxMOwotCXN0cnVjdCBkZXZfc3RhdGUgKnBzOworCXN0cnVjdCB1c2JfZGV2X3N0YXRlICpwczsKIAlpbnQgcmV0OwogCiAJcmV0ID0gLUVOT01FTTsKLQlwcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlwcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JfZGV2X3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcykKIAkJZ290byBvdXRfZnJlZV9wczsKIApAQCAtODUyLDcgKzkzNCw3IEBACiAKIHN0YXRpYyBpbnQgdXNiZGV2X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGRldl9zdGF0ZSAqcHMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBwcy0+ZGV2OwogCXVuc2lnbmVkIGludCBpZm51bTsKIAlzdHJ1Y3QgYXN5bmMgKmFzOwpAQCAtODgzLDcgKzk2NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19jb250cm9sKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX2NvbnRyb2woc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBwcy0+ZGV2OwogCXN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIgY3RybDsKQEAgLTk3MCw3ICsxMDUyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHByb2NfYnVsayhzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19idWxrKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gcHMtPmRldjsKIAlzdHJ1Y3QgdXNiZGV2ZnNfYnVsa3RyYW5zZmVyIGJ1bGs7CkBAIC0xMDQzLDcgKzExMjUsMjEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHByb2NfcmVzZXRlcChzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyB2b2lkIGNoZWNrX3Jlc2V0X29mX2FjdGl2ZV9lcChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKKwkJdW5zaWduZWQgaW50IGVwbnVtLCBjaGFyICppb2N0bF9uYW1lKQoreworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqKmVwczsKKwlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwOworCisJZXBzID0gKGVwbnVtICYgVVNCX0RJUl9JTikgPyB1ZGV2LT5lcF9pbiA6IHVkZXYtPmVwX291dDsKKwllcCA9IGVwc1tlcG51bSAmIDB4MGZdOworCWlmIChlcCAmJiAhbGlzdF9lbXB0eSgmZXAtPnVyYl9saXN0KSkKKwkJZGV2X3dhcm4oJnVkZXYtPmRldiwgIlByb2Nlc3MgJWQgKCVzKSBjYWxsZWQgVVNCREVWRlNfJXMgZm9yIGFjdGl2ZSBlbmRwb2ludCAweCUwMnhcbiIsCisJCQkJdGFza19waWRfbnIoY3VycmVudCksIGN1cnJlbnQtPmNvbW0sCisJCQkJaW9jdGxfbmFtZSwgZXBudW0pOworfQorCitzdGF0aWMgaW50IHByb2NfcmVzZXRlcChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJdW5zaWduZWQgaW50IGVwOwogCWludCByZXQ7CkBAIC0xMDU2LDExICsxMTUyLDEyIEBACiAJcmV0ID0gY2hlY2tpbnRmKHBzLCByZXQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CisJY2hlY2tfcmVzZXRfb2ZfYWN0aXZlX2VwKHBzLT5kZXYsIGVwLCAiUkVTRVRFUCIpOwogCXVzYl9yZXNldF9lbmRwb2ludChwcy0+ZGV2LCBlcCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19jbGVhcmhhbHQoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfY2xlYXJoYWx0KHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAl1bnNpZ25lZCBpbnQgZXA7CiAJaW50IHBpcGU7CkBAIC0xMDc0LDYgKzExNzEsNyBAQAogCXJldCA9IGNoZWNraW50ZihwcywgcmV0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OworCWNoZWNrX3Jlc2V0X29mX2FjdGl2ZV9lcChwcy0+ZGV2LCBlcCwgIkNMRUFSX0hBTFQiKTsKIAlpZiAoZXAgJiBVU0JfRElSX0lOKQogCQlwaXBlID0gdXNiX3JjdmJ1bGtwaXBlKHBzLT5kZXYsIGVwICYgMHg3Zik7CiAJZWxzZQpAQCAtMTA4Miw3ICsxMTgwLDcgQEAKIAlyZXR1cm4gdXNiX2NsZWFyX2hhbHQocHMtPmRldiwgcGlwZSk7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19nZXRkcml2ZXIoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfZ2V0ZHJpdmVyKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgdXNiZGV2ZnNfZ2V0ZHJpdmVyIGdkOwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOwpAQCAtMTEwMSw3ICsxMTk5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHByb2NfY29ubmVjdGluZm8oc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfY29ubmVjdGluZm8oc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCB1c2JkZXZmc19jb25uZWN0aW5mbyBjaSA9IHsKIAkJLmRldm51bSA9IHBzLT5kZXYtPmRldm51bSwKQEAgLTExMTMsMTIgKzEyMTEsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwcm9jX3Jlc2V0ZGV2aWNlKHN0cnVjdCBkZXZfc3RhdGUgKnBzKQorc3RhdGljIGludCBwcm9jX3Jlc2V0ZGV2aWNlKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcykKIHsKIAlyZXR1cm4gdXNiX3Jlc2V0X2RldmljZShwcy0+ZGV2KTsKIH0KIAotc3RhdGljIGludCBwcm9jX3NldGludGYoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2Nfc2V0aW50ZihzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc3RydWN0IHVzYmRldmZzX3NldGludGVyZmFjZSBzZXRpbnRmOwogCWludCByZXQ7CkBAIC0xMTI3LDExICsxMjI1LDE0IEBACiAJCXJldHVybiAtRUZBVUxUOwogCWlmICgocmV0ID0gY2hlY2tpbnRmKHBzLCBzZXRpbnRmLmludGVyZmFjZSkpKQogCQlyZXR1cm4gcmV0OworCisJZGVzdHJveV9hc3luY19vbl9pbnRlcmZhY2UocHMsIHNldGludGYuaW50ZXJmYWNlKTsKKwogCXJldHVybiB1c2Jfc2V0X2ludGVyZmFjZShwcy0+ZGV2LCBzZXRpbnRmLmludGVyZmFjZSwKIAkJCXNldGludGYuYWx0c2V0dGluZyk7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19zZXRjb25maWcoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2Nfc2V0Y29uZmlnKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlpbnQgdTsKIAlpbnQgc3RhdHVzID0gMDsKQEAgLTExNzksNyArMTI4MCw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBwcm9jX2RvX3N1Ym1pdHVyYihzdHJ1Y3QgZGV2X3N0YXRlICpwcywgc3RydWN0IHVzYmRldmZzX3VyYiAqdXVyYiwKK3N0YXRpYyBpbnQgcHJvY19kb19zdWJtaXR1cmIoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCBzdHJ1Y3QgdXNiZGV2ZnNfdXJiICp1dXJiLAogCQkJc3RydWN0IHVzYmRldmZzX2lzb19wYWNrZXRfZGVzYyBfX3VzZXIgKmlzb19mcmFtZV9kZXNjLAogCQkJdm9pZCBfX3VzZXIgKmFyZykKIHsKQEAgLTExODksNiArMTI5MCw4IEBACiAJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqZHIgPSBOVUxMOwogCXVuc2lnbmVkIGludCB1LCB0b3RsZW4sIGlzb2ZybWxlbjsKIAlpbnQgaSwgcmV0LCBpc19pbiwgbnVtX3NncyA9IDAsIGlmbnVtID0gLTE7CisJaW50IG51bWJlcl9vZl9wYWNrZXRzID0gMDsKKwl1bnNpZ25lZCBpbnQgc3RyZWFtX2lkID0gMDsKIAl2b2lkICpidWY7CiAKIAlpZiAodXVyYi0+ZmxhZ3MgJiB+KFVTQkRFVkZTX1VSQl9JU09fQVNBUCB8CkBAIC0xMjA5LDE1ICsxMzEyLDEwIEBACiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KLQlpZiAoKHV1cmItPmVuZHBvaW50ICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSAhPSAwKSB7Ci0JCWlzX2luID0gMTsKLQkJZXAgPSBwcy0+ZGV2LT5lcF9pblt1dXJiLT5lbmRwb2ludCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTS107Ci0JfSBlbHNlIHsKLQkJaXNfaW4gPSAwOwotCQllcCA9IHBzLT5kZXYtPmVwX291dFt1dXJiLT5lbmRwb2ludCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTS107Ci0JfQorCWVwID0gZXBfdG9faG9zdF9lbmRwb2ludChwcy0+ZGV2LCB1dXJiLT5lbmRwb2ludCk7CiAJaWYgKCFlcCkKIAkJcmV0dXJuIC1FTk9FTlQ7CisJaXNfaW4gPSAodXVyYi0+ZW5kcG9pbnQgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spICE9IDA7CiAKIAl1ID0gMDsKIAlzd2l0Y2godXVyYi0+dHlwZSkgewpAQCAtMTI0Miw3ICsxMzQwLDYgQEAKIAkJCQkgICAgICBsZTE2X3RvX2NwdXAoJmRyLT53SW5kZXgpKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3I7Ci0JCXV1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gMDsKIAkJdXVyYi0+YnVmZmVyX2xlbmd0aCA9IGxlMTZfdG9fY3B1cCgmZHItPndMZW5ndGgpOwogCQl1dXJiLT5idWZmZXIgKz0gODsKIAkJaWYgKChkci0+YlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikgJiYgdXVyYi0+YnVmZmVyX2xlbmd0aCkgewpAQCAtMTI3MiwxNyArMTM2OSwxNyBAQAogCQkJdXVyYi0+dHlwZSA9IFVTQkRFVkZTX1VSQl9UWVBFX0lOVEVSUlVQVDsKIAkJCWdvdG8gaW50ZXJydXB0X3VyYjsKIAkJfQotCQl1dXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IDA7CiAJCW51bV9zZ3MgPSBESVZfUk9VTkRfVVAodXVyYi0+YnVmZmVyX2xlbmd0aCwgVVNCX1NHX1NJWkUpOwogCQlpZiAobnVtX3NncyA9PSAxIHx8IG51bV9zZ3MgPiBwcy0+ZGV2LT5idXMtPnNnX3RhYmxlc2l6ZSkKIAkJCW51bV9zZ3MgPSAwOworCQlpZiAoZXAtPnN0cmVhbXMpCisJCQlzdHJlYW1faWQgPSB1dXJiLT5zdHJlYW1faWQ7CiAJCWJyZWFrOwogCiAJY2FzZSBVU0JERVZGU19VUkJfVFlQRV9JTlRFUlJVUFQ6CiAJCWlmICghdXNiX2VuZHBvaW50X3hmZXJfaW50KCZlcC0+ZGVzYykpCiAJCQlyZXR1cm4gLUVJTlZBTDsKICBpbnRlcnJ1cHRfdXJiOgotCQl1dXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSBVU0JERVZGU19VUkJfVFlQRV9JU086CkBAIC0xMjkyLDE1ICsxMzg5LDE2IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKCF1c2JfZW5kcG9pbnRfeGZlcl9pc29jKCZlcC0+ZGVzYykpCiAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbnVtYmVyX29mX3BhY2tldHMgPSB1dXJiLT5udW1iZXJfb2ZfcGFja2V0czsKIAkJaXNvZnJtbGVuID0gc2l6ZW9mKHN0cnVjdCB1c2JkZXZmc19pc29fcGFja2V0X2Rlc2MpICoKLQkJCQkgICB1dXJiLT5udW1iZXJfb2ZfcGFja2V0czsKKwkJCQkgICBudW1iZXJfb2ZfcGFja2V0czsKIAkJaWYgKCEoaXNvcGt0ID0ga21hbGxvYyhpc29mcm1sZW4sIEdGUF9LRVJORUwpKSkKIAkJCXJldHVybiAtRU5PTUVNOwogCQlpZiAoY29weV9mcm9tX3VzZXIoaXNvcGt0LCBpc29fZnJhbWVfZGVzYywgaXNvZnJtbGVuKSkgewogCQkJcmV0ID0gLUVGQVVMVDsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KLQkJZm9yICh0b3RsZW4gPSB1ID0gMDsgdSA8IHV1cmItPm51bWJlcl9vZl9wYWNrZXRzOyB1KyspIHsKKwkJZm9yICh0b3RsZW4gPSB1ID0gMDsgdSA8IG51bWJlcl9vZl9wYWNrZXRzOyB1KyspIHsKIAkJCS8qCiAJCQkgKiBhcmJpdHJhcnkgbGltaXQgbmVlZCBmb3IgVVNCIDMuMAogCQkJICogYk1heEJ1cnN0ICgwfjE1IGFsbG93ZWQsIDF+MTYgcGFja2V0cykKQEAgLTEzMzEsNyArMTQyOSw3IEBACiAJCXJldCA9IC1FRkFVTFQ7CiAJCWdvdG8gZXJyb3I7CiAJfQotCWFzID0gYWxsb2NfYXN5bmModXVyYi0+bnVtYmVyX29mX3BhY2tldHMpOworCWFzID0gYWxsb2NfYXN5bmMobnVtYmVyX29mX3BhY2tldHMpOwogCWlmICghYXMpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcjsKQEAgLTE0MjUsNyArMTUyMyw4IEBACiAJYXMtPnVyYi0+c2V0dXBfcGFja2V0ID0gKHVuc2lnbmVkIGNoYXIgKilkcjsKIAlkciA9IE5VTEw7CiAJYXMtPnVyYi0+c3RhcnRfZnJhbWUgPSB1dXJiLT5zdGFydF9mcmFtZTsKLQlhcy0+dXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IHV1cmItPm51bWJlcl9vZl9wYWNrZXRzOworCWFzLT51cmItPm51bWJlcl9vZl9wYWNrZXRzID0gbnVtYmVyX29mX3BhY2tldHM7CisJYXMtPnVyYi0+c3RyZWFtX2lkID0gc3RyZWFtX2lkOwogCWlmICh1dXJiLT50eXBlID09IFVTQkRFVkZTX1VSQl9UWVBFX0lTTyB8fAogCQkJcHMtPmRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCiAJCWFzLT51cmItPmludGVydmFsID0gMSA8PCBtaW4oMTUsIGVwLT5kZXNjLmJJbnRlcnZhbCAtIDEpOwpAQCAtMTQzMyw3ICsxNTMyLDcgQEAKIAkJYXMtPnVyYi0+aW50ZXJ2YWwgPSBlcC0+ZGVzYy5iSW50ZXJ2YWw7CiAJYXMtPnVyYi0+Y29udGV4dCA9IGFzOwogCWFzLT51cmItPmNvbXBsZXRlID0gYXN5bmNfY29tcGxldGVkOwotCWZvciAodG90bGVuID0gdSA9IDA7IHUgPCB1dXJiLT5udW1iZXJfb2ZfcGFja2V0czsgdSsrKSB7CisJZm9yICh0b3RsZW4gPSB1ID0gMDsgdSA8IG51bWJlcl9vZl9wYWNrZXRzOyB1KyspIHsKIAkJYXMtPnVyYi0+aXNvX2ZyYW1lX2Rlc2NbdV0ub2Zmc2V0ID0gdG90bGVuOwogCQlhcy0+dXJiLT5pc29fZnJhbWVfZGVzY1t1XS5sZW5ndGggPSBpc29wa3RbdV0ubGVuZ3RoOwogCQl0b3RsZW4gKz0gaXNvcGt0W3VdLmxlbmd0aDsKQEAgLTE1MDgsNyArMTYwNyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBwcm9jX3N1Ym1pdHVyYihzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19zdWJtaXR1cmIoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCB1c2JkZXZmc191cmIgdXVyYjsKIApAQCAtMTUyMCw3ICsxNjE5LDcgQEAKIAkJCWFyZyk7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY191bmxpbmt1cmIoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfdW5saW5rdXJiKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgdXJiICp1cmI7CiAJc3RydWN0IGFzeW5jICphczsKQEAgLTE1ODAsNyArMTY3OSw3IEBACiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYXN5bmMgKnJlYXBfYXMoc3RydWN0IGRldl9zdGF0ZSAqcHMpCitzdGF0aWMgc3RydWN0IGFzeW5jICpyZWFwX2FzKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcykKIHsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAlzdHJ1Y3QgYXN5bmMgKmFzID0gTlVMTDsKQEAgLTE2MDMsNyArMTcwMiw3IEBACiAJcmV0dXJuIGFzOwogfQogCi1zdGF0aWMgaW50IHByb2NfcmVhcHVyYihzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19yZWFwdXJiKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgYXN5bmMgKmFzID0gcmVhcF9hcyhwcyk7CiAJaWYgKGFzKSB7CkBAIC0xNjE2LDcgKzE3MTUsNyBAQAogCXJldHVybiAtRUlPOwogfQogCi1zdGF0aWMgaW50IHByb2NfcmVhcHVyYm5vbmJsb2NrKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX3JlYXB1cmJub25ibG9jayhzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJaW50IHJldHZhbDsKIAlzdHJ1Y3QgYXN5bmMgKmFzOwpAQCAtMTYzMSw3ICsxNzMwLDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19DT01QQVQKLXN0YXRpYyBpbnQgcHJvY19jb250cm9sX2NvbXBhdChzdHJ1Y3QgZGV2X3N0YXRlICpwcywKK3N0YXRpYyBpbnQgcHJvY19jb250cm9sX2NvbXBhdChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsCiAJCQkJc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlcjMyIF9fdXNlciAqcDMyKQogewogCXN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIgX191c2VyICpwOwpAQCAtMTY0NCw3ICsxNzQzLDcgQEAKIAlyZXR1cm4gcHJvY19jb250cm9sKHBzLCBwKTsKIH0KIAotc3RhdGljIGludCBwcm9jX2J1bGtfY29tcGF0KHN0cnVjdCBkZXZfc3RhdGUgKnBzLAorc3RhdGljIGludCBwcm9jX2J1bGtfY29tcGF0KHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywKIAkJCXN0cnVjdCB1c2JkZXZmc19idWxrdHJhbnNmZXIzMiBfX3VzZXIgKnAzMikKIHsKIAlzdHJ1Y3QgdXNiZGV2ZnNfYnVsa3RyYW5zZmVyIF9fdXNlciAqcDsKQEAgLTE2NjEsNyArMTc2MCw3IEBACiAKIAlyZXR1cm4gcHJvY19idWxrKHBzLCBwKTsKIH0KLXN0YXRpYyBpbnQgcHJvY19kaXNjb25uZWN0c2lnbmFsX2NvbXBhdChzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19kaXNjb25uZWN0c2lnbmFsX2NvbXBhdChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc3RydWN0IHVzYmRldmZzX2Rpc2Nvbm5lY3RzaWduYWwzMiBkczsKIApAQCAtMTY5OSw3ICsxNzk4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwcm9jX3N1Ym1pdHVyYl9jb21wYXQoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2Nfc3VibWl0dXJiX2NvbXBhdChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc3RydWN0IHVzYmRldmZzX3VyYiB1dXJiOwogCkBAIC0xNzQ1LDcgKzE4NDQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHByb2NfcmVhcHVyYl9jb21wYXQoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfcmVhcHVyYl9jb21wYXQoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCBhc3luYyAqYXMgPSByZWFwX2FzKHBzKTsKIAlpZiAoYXMpIHsKQEAgLTE3NTgsNyArMTg1Nyw3IEBACiAJcmV0dXJuIC1FSU87CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19yZWFwdXJibm9uYmxvY2tfY29tcGF0KHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX3JlYXB1cmJub25ibG9ja19jb21wYXQoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCWludCByZXR2YWw7CiAJc3RydWN0IGFzeW5jICphczsKQEAgLTE3NzUsNyArMTg3NCw3IEBACiAKICNlbmRpZgogCi1zdGF0aWMgaW50IHByb2NfZGlzY29ubmVjdHNpZ25hbChzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19kaXNjb25uZWN0c2lnbmFsKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgdXNiZGV2ZnNfZGlzY29ubmVjdHNpZ25hbCBkczsKIApAQCAtMTc4Niw3ICsxODg1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwcm9jX2NsYWltaW50ZXJmYWNlKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX2NsYWltaW50ZXJmYWNlKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAl1bnNpZ25lZCBpbnQgaWZudW07CiAKQEAgLTE3OTUsNyArMTg5NCw3IEBACiAJcmV0dXJuIGNsYWltaW50ZihwcywgaWZudW0pOwogfQogCi1zdGF0aWMgaW50IHByb2NfcmVsZWFzZWludGVyZmFjZShzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19yZWxlYXNlaW50ZXJmYWNlKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAl1bnNpZ25lZCBpbnQgaWZudW07CiAJaW50IHJldDsKQEAgLTE4MDgsNyArMTkwNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19pb2N0bChzdHJ1Y3QgZGV2X3N0YXRlICpwcywgc3RydWN0IHVzYmRldmZzX2lvY3RsICpjdGwpCitzdGF0aWMgaW50IHByb2NfaW9jdGwoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCBzdHJ1Y3QgdXNiZGV2ZnNfaW9jdGwgKmN0bCkKIHsKIAlpbnQJCQlzaXplOwogCXZvaWQJCQkqYnVmID0gTlVMTDsKQEAgLTE4ODQsNyArMTk4Myw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGludCBwcm9jX2lvY3RsX2RlZmF1bHQoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfaW9jdGxfZGVmYXVsdChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc3RydWN0IHVzYmRldmZzX2lvY3RsCWN0cmw7CiAKQEAgLTE4OTQsNyArMTk5Myw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCi1zdGF0aWMgaW50IHByb2NfaW9jdGxfY29tcGF0KHN0cnVjdCBkZXZfc3RhdGUgKnBzLCBjb21wYXRfdXB0cl90IGFyZykKK3N0YXRpYyBpbnQgcHJvY19pb2N0bF9jb21wYXQoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCBjb21wYXRfdXB0cl90IGFyZykKIHsKIAlzdHJ1Y3QgdXNiZGV2ZnNfaW9jdGwzMiBfX3VzZXIgKnVpb2M7CiAJc3RydWN0IHVzYmRldmZzX2lvY3RsIGN0cmw7CkBAIC0xOTEyLDcgKzIwMTEsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgcHJvY19jbGFpbV9wb3J0KHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX2NsYWltX3BvcnQoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXVuc2lnbmVkIHBvcnRudW07CiAJaW50IHJjOwpAQCAtMTkyNiw3ICsyMDI1LDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19yZWxlYXNlX3BvcnQoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfcmVsZWFzZV9wb3J0KHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAl1bnNpZ25lZCBwb3J0bnVtOwogCkBAIC0xOTM1LDcgKzIwMzQsNyBAQAogCXJldHVybiB1c2JfaHViX3JlbGVhc2VfcG9ydChwcy0+ZGV2LCBwb3J0bnVtLCBwcyk7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19nZXRfY2FwYWJpbGl0aWVzKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX2dldF9jYXBhYmlsaXRpZXMoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCV9fdTMyIGNhcHM7CiAKQEAgLTE5NTEsNyArMjA1MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19kaXNjb25uZWN0X2NsYWltKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX2Rpc2Nvbm5lY3RfY2xhaW0oc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCB1c2JkZXZmc19kaXNjb25uZWN0X2NsYWltIGRjOwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOwpAQCAtMTk4Myw2ICsyMDgyLDQ1IEBACiAJcmV0dXJuIGNsYWltaW50ZihwcywgZGMuaW50ZXJmYWNlKTsKIH0KIAorc3RhdGljIGludCBwcm9jX2FsbG9jX3N0cmVhbXMoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXVuc2lnbmVkIG51bV9zdHJlYW1zLCBudW1fZXBzOworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqKmVwczsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKKwlpbnQgcjsKKworCXIgPSBwYXJzZV91c2JkZXZmc19zdHJlYW1zKHBzLCBhcmcsICZudW1fc3RyZWFtcywgJm51bV9lcHMsCisJCQkJICAgJmVwcywgJmludGYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWRlc3Ryb3lfYXN5bmNfb25faW50ZXJmYWNlKHBzLAorCQkJCSAgIGludGYtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKKworCXIgPSB1c2JfYWxsb2Nfc3RyZWFtcyhpbnRmLCBlcHMsIG51bV9lcHMsIG51bV9zdHJlYW1zLCBHRlBfS0VSTkVMKTsKKwlrZnJlZShlcHMpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHByb2NfZnJlZV9zdHJlYW1zKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwl1bnNpZ25lZCBudW1fZXBzOworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqKmVwczsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKKwlpbnQgcjsKKworCXIgPSBwYXJzZV91c2JkZXZmc19zdHJlYW1zKHBzLCBhcmcsIE5VTEwsICZudW1fZXBzLCAmZXBzLCAmaW50Zik7CisJaWYgKHIpCisJCXJldHVybiByOworCisJZGVzdHJveV9hc3luY19vbl9pbnRlcmZhY2UocHMsCisJCQkJICAgaW50Zi0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOworCisJciA9IHVzYl9mcmVlX3N0cmVhbXMoaW50ZiwgZXBzLCBudW1fZXBzLCBHRlBfS0VSTkVMKTsKKwlrZnJlZShlcHMpOworCXJldHVybiByOworfQorCiAvKgogICogTk9URTogIEFsbCByZXF1ZXN0cyBoZXJlIHRoYXQgaGF2ZSBpbnRlcmZhY2UgbnVtYmVycyBhcyBwYXJhbWV0ZXJzCiAgKiBhcmUgYXNzdW1pbmcgdGhhdCBzb21laG93IHRoZSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIHByZXZlbnRlZCBmcm9tCkBAIC0xOTkxLDcgKzIxMjksNyBAQAogc3RhdGljIGxvbmcgdXNiZGV2X2RvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJCXZvaWQgX191c2VyICpwKQogewotCXN0cnVjdCBkZXZfc3RhdGUgKnBzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gcHMtPmRldjsKIAlpbnQgcmV0ID0gLUVOT1RUWTsKQEAgLTIxNTksNiArMjI5NywxMiBAQAogCWNhc2UgVVNCREVWRlNfRElTQ09OTkVDVF9DTEFJTToKIAkJcmV0ID0gcHJvY19kaXNjb25uZWN0X2NsYWltKHBzLCBwKTsKIAkJYnJlYWs7CisJY2FzZSBVU0JERVZGU19BTExPQ19TVFJFQU1TOgorCQlyZXQgPSBwcm9jX2FsbG9jX3N0cmVhbXMocHMsIHApOworCQlicmVhazsKKwljYXNlIFVTQkRFVkZTX0ZSRUVfU1RSRUFNUzoKKwkJcmV0ID0gcHJvY19mcmVlX3N0cmVhbXMocHMsIHApOworCQlicmVhazsKIAl9CiAJdXNiX3VubG9ja19kZXZpY2UoZGV2KTsKIAlpZiAocmV0ID49IDApCkBAIC0yMTkyLDcgKzIzMzYsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCB1c2JkZXZfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCQlzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCiB7Ci0Jc3RydWN0IGRldl9zdGF0ZSAqcHMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKIAogCXBvbGxfd2FpdChmaWxlLCAmcHMtPndhaXQsIHdhaXQpOwpAQCAtMjIxOCwxMSArMjM2MiwxMSBAQAogCiBzdGF0aWMgdm9pZCB1c2JkZXZfcmVtb3ZlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewotCXN0cnVjdCBkZXZfc3RhdGUgKnBzOworCXN0cnVjdCB1c2JfZGV2X3N0YXRlICpwczsKIAlzdHJ1Y3Qgc2lnaW5mbyBzaW5mbzsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmdWRldi0+ZmlsZWxpc3QpKSB7Ci0JCXBzID0gbGlzdF9lbnRyeSh1ZGV2LT5maWxlbGlzdC5uZXh0LCBzdHJ1Y3QgZGV2X3N0YXRlLCBsaXN0KTsKKwkJcHMgPSBsaXN0X2VudHJ5KHVkZXYtPmZpbGVsaXN0Lm5leHQsIHN0cnVjdCB1c2JfZGV2X3N0YXRlLCBsaXN0KTsKIAkJZGVzdHJveV9hbGxfYXN5bmMocHMpOwogCQl3YWtlX3VwX2FsbCgmcHMtPndhaXQpOwogCQlsaXN0X2RlbF9pbml0KCZwcy0+bGlzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwppbmRleCBhYjkwYTAxLi44ODg4ODFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKQEAgLTMxMiw5ICszMTIsOSBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogCi0JaWQgPSB1c2JfbWF0Y2hfaWQoaW50ZiwgZHJpdmVyLT5pZF90YWJsZSk7CisJaWQgPSB1c2JfbWF0Y2hfZHluYW1pY19pZChpbnRmLCBkcml2ZXIpOwogCWlmICghaWQpCi0JCWlkID0gdXNiX21hdGNoX2R5bmFtaWNfaWQoaW50ZiwgZHJpdmVyKTsKKwkJaWQgPSB1c2JfbWF0Y2hfaWQoaW50ZiwgZHJpdmVyLT5pZF90YWJsZSk7CiAJaWYgKCFpZCkKIAkJcmV0dXJuIGVycm9yOwogCkBAIC00MDAsOCArNDAwLDkgQEAKIHsKIAlzdHJ1Y3QgdXNiX2RyaXZlciAqZHJpdmVyID0gdG9fdXNiX2RyaXZlcihkZXYtPmRyaXZlcik7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCwgKiplcHMgPSBOVUxMOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwotCWludCBlcnJvciwgciwgbHBtX2Rpc2FibGVfZXJyb3I7CisJaW50IGksIGosIGVycm9yLCByLCBscG1fZGlzYWJsZV9lcnJvcjsKIAogCWludGYtPmNvbmRpdGlvbiA9IFVTQl9JTlRFUkZBQ0VfVU5CSU5ESU5HOwogCkBAIC00MjUsNiArNDI2LDI2IEBACiAJZHJpdmVyLT5kaXNjb25uZWN0KGludGYpOwogCXVzYl9jYW5jZWxfcXVldWVkX3Jlc2V0KGludGYpOwogCisJLyogRnJlZSBzdHJlYW1zICovCisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBpKyspIHsKKwkJZXAgPSAmaW50Zi0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50W2ldOworCQlpZiAoZXAtPnN0cmVhbXMgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoaiA9PSAwKSB7CisJCQllcHMgPSBrbWFsbG9jKFVTQl9NQVhFTkRQT0lOVFMgKiBzaXplb2Yodm9pZCAqKSwKKwkJCQkgICAgICBHRlBfS0VSTkVMKTsKKwkJCWlmICghZXBzKSB7CisJCQkJZGV2X3dhcm4oZGV2LCAib29tLCBsZWFraW5nIHN0cmVhbXNcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWVwc1tqKytdID0gZXA7CisJfQorCWlmIChqKSB7CisJCXVzYl9mcmVlX3N0cmVhbXMoaW50ZiwgZXBzLCBqLCBHRlBfS0VSTkVMKTsKKwkJa2ZyZWUoZXBzKTsKKwl9CisKIAkvKiBSZXNldCBvdGhlciBpbnRlcmZhY2Ugc3RhdGUuCiAJICogV2UgY2Fubm90IGRvIGEgU2V0LUludGVyZmFjZSBpZiB0aGUgZGV2aWNlIGlzIHN1c3BlbmRlZCBvcgogCSAqIGlmIGl0IGlzIHByZXBhcmVkIGZvciBhIHN5c3RlbSBzbGVlcCAoc2luY2UgaW5zdGFsbGluZyBhIG5ldwpAQCAtOTkwLDggKzEwMTEsNyBAQAogICogaXQgZG9lc24ndCBzdXBwb3J0IHByZV9yZXNldC9wb3N0X3Jlc2V0L3Jlc2V0X3Jlc3VtZSBvcgogICogYmVjYXVzZSBpdCBkb2Vzbid0IHN1cHBvcnQgc3VzcGVuZC9yZXN1bWUuCiAgKgotICogVGhlIGNhbGxlciBtdXN0IGhvbGQgQGludGYncyBkZXZpY2UncyBsb2NrLCBidXQgbm90IGl0cyBwbV9tdXRleAotICogYW5kIG5vdCBAaW50Zi0+ZGV2LnNlbS4KKyAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIEBpbnRmJ3MgZGV2aWNlJ3MgbG9jaywgYnV0IG5vdCBAaW50ZidzIGxvY2suCiAgKi8KIHZvaWQgdXNiX2ZvcmNlZF91bmJpbmRfaW50ZihzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKQEAgLTEwMDQsMTYgKzEwMjQsMzcgQEAKIAlpbnRmLT5uZWVkc19iaW5kaW5nID0gMTsKIH0KIAorLyoKKyAqIFVuYmluZCBkcml2ZXJzIGZvciBAdWRldidzIG1hcmtlZCBpbnRlcmZhY2VzLiAgVGhlc2UgaW50ZXJmYWNlcyBoYXZlCisgKiB0aGUgbmVlZHNfYmluZGluZyBmbGFnIHNldCwgZm9yIGV4YW1wbGUgYnkgdXNiX3Jlc3VtZV9pbnRlcmZhY2UoKS4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBAdWRldidzIGRldmljZSBsb2NrLgorICovCitzdGF0aWMgdm9pZCB1bmJpbmRfbWFya2VkX2ludGVyZmFjZXMoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCit7CisJc3RydWN0IHVzYl9ob3N0X2NvbmZpZwkqY29uZmlnOworCWludAkJCWk7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UJKmludGY7CisKKwljb25maWcgPSB1ZGV2LT5hY3Rjb25maWc7CisJaWYgKGNvbmZpZykgeworCQlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzOyArK2kpIHsKKwkJCWludGYgPSBjb25maWctPmludGVyZmFjZVtpXTsKKwkJCWlmIChpbnRmLT5kZXYuZHJpdmVyICYmIGludGYtPm5lZWRzX2JpbmRpbmcpCisJCQkJdXNiX2ZvcmNlZF91bmJpbmRfaW50ZihpbnRmKTsKKwkJfQorCX0KK30KKwogLyogRGVsYXllZCBmb3JjZWQgdW5iaW5kaW5nIG9mIGEgVVNCIGludGVyZmFjZSBkcml2ZXIgYW5kIHNjYW4KICAqIGZvciByZWJpbmRpbmcuCiAgKgotICogVGhlIGNhbGxlciBtdXN0IGhvbGQgQGludGYncyBkZXZpY2UncyBsb2NrLCBidXQgbm90IGl0cyBwbV9tdXRleAotICogYW5kIG5vdCBAaW50Zi0+ZGV2LnNlbS4KKyAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIEBpbnRmJ3MgZGV2aWNlJ3MgbG9jaywgYnV0IG5vdCBAaW50ZidzIGxvY2suCiAgKgogICogTm90ZTogUmViaW5kcyB3aWxsIGJlIHNraXBwZWQgaWYgYSBzeXN0ZW0gc2xlZXAgdHJhbnNpdGlvbiBpcyBpbgogICogcHJvZ3Jlc3MgYW5kIHRoZSBQTSAiY29tcGxldGUiIGNhbGxiYWNrIGhhc24ndCBvY2N1cnJlZCB5ZXQuCiAgKi8KLXZvaWQgdXNiX3JlYmluZF9pbnRmKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIHZvaWQgdXNiX3JlYmluZF9pbnRmKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCWludCByYzsKIApAQCAtMTAzMCw2ICsxMDcxLDQxIEBACiAJfQogfQogCisvKgorICogUmViaW5kIGRyaXZlcnMgdG8gQHVkZXYncyBtYXJrZWQgaW50ZXJmYWNlcy4gIFRoZXNlIGludGVyZmFjZXMgaGF2ZQorICogdGhlIG5lZWRzX2JpbmRpbmcgZmxhZyBzZXQuCisgKgorICogVGhlIGNhbGxlciBtdXN0IGhvbGQgQHVkZXYncyBkZXZpY2UgbG9jay4KKyAqLworc3RhdGljIHZvaWQgcmViaW5kX21hcmtlZF9pbnRlcmZhY2VzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoreworCXN0cnVjdCB1c2JfaG9zdF9jb25maWcJKmNvbmZpZzsKKwlpbnQJCQlpOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlCSppbnRmOworCisJY29uZmlnID0gdWRldi0+YWN0Y29uZmlnOworCWlmIChjb25maWcpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgKytpKSB7CisJCQlpbnRmID0gY29uZmlnLT5pbnRlcmZhY2VbaV07CisJCQlpZiAoaW50Zi0+bmVlZHNfYmluZGluZykKKwkJCQl1c2JfcmViaW5kX2ludGYoaW50Zik7CisJCX0KKwl9Cit9CisKKy8qCisgKiBVbmJpbmQgYWxsIG9mIEB1ZGV2J3MgbWFya2VkIGludGVyZmFjZXMgYW5kIHRoZW4gcmViaW5kIGFsbCBvZiB0aGVtLgorICogVGhpcyBvcmRlcmluZyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIGRyaXZlcnMgY2xhaW0gc2V2ZXJhbCBpbnRlcmZhY2VzCisgKiB3aGVuIHRoZXkgYXJlIGZpcnN0IHByb2JlZC4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBAdWRldidzIGRldmljZSBsb2NrLgorICovCit2b2lkIHVzYl91bmJpbmRfYW5kX3JlYmluZF9tYXJrZWRfaW50ZXJmYWNlcyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3sKKwl1bmJpbmRfbWFya2VkX2ludGVyZmFjZXModWRldik7CisJcmViaW5kX21hcmtlZF9pbnRlcmZhY2VzKHVkZXYpOworfQorCiAjaWZkZWYgQ09ORklHX1BNCiAKIC8qIFVuYmluZCBkcml2ZXJzIGZvciBAdWRldidzIGludGVyZmFjZXMgdGhhdCBkb24ndCBzdXBwb3J0IHN1c3BlbmQvcmVzdW1lCkBAIC0xMDU5LDQzICsxMTM1LDYgQEAKIAl9CiB9CiAKLS8qIFVuYmluZCBkcml2ZXJzIGZvciBAdWRldidzIGludGVyZmFjZXMgdGhhdCBmYWlsZWQgdG8gc3VwcG9ydCByZXNldC1yZXN1bWUuCi0gKiBUaGVzZSBpbnRlcmZhY2VzIGhhdmUgdGhlIG5lZWRzX2JpbmRpbmcgZmxhZyBzZXQgYnkgdXNiX3Jlc3VtZV9pbnRlcmZhY2UoKS4KLSAqCi0gKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBAdWRldidzIGRldmljZSBsb2NrLgotICovCi1zdGF0aWMgdm9pZCB1bmJpbmRfbm9fcmVzZXRfcmVzdW1lX2RyaXZlcnNfaW50ZXJmYWNlcyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKLXsKLQlzdHJ1Y3QgdXNiX2hvc3RfY29uZmlnCSpjb25maWc7Ci0JaW50CQkJaTsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZQkqaW50ZjsKLQotCWNvbmZpZyA9IHVkZXYtPmFjdGNvbmZpZzsKLQlpZiAoY29uZmlnKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7ICsraSkgewotCQkJaW50ZiA9IGNvbmZpZy0+aW50ZXJmYWNlW2ldOwotCQkJaWYgKGludGYtPmRldi5kcml2ZXIgJiYgaW50Zi0+bmVlZHNfYmluZGluZykKLQkJCQl1c2JfZm9yY2VkX3VuYmluZF9pbnRmKGludGYpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBkb19yZWJpbmRfaW50ZXJmYWNlcyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKLXsKLQlzdHJ1Y3QgdXNiX2hvc3RfY29uZmlnCSpjb25maWc7Ci0JaW50CQkJaTsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZQkqaW50ZjsKLQotCWNvbmZpZyA9IHVkZXYtPmFjdGNvbmZpZzsKLQlpZiAoY29uZmlnKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7ICsraSkgewotCQkJaW50ZiA9IGNvbmZpZy0+aW50ZXJmYWNlW2ldOwotCQkJaWYgKGludGYtPm5lZWRzX2JpbmRpbmcpCi0JCQkJdXNiX3JlYmluZF9pbnRmKGludGYpOwotCQl9Ci0JfQotfQotCiBzdGF0aWMgaW50IHVzYl9zdXNwZW5kX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZV9kcml2ZXIJKnVkcml2ZXI7CkBAIC0xNDIwLDcgKzE0NTksNyBAQAogCSAqIHdob3NlIG5lZWRzX2JpbmRpbmcgZmxhZyBpcyBzZXQKIAkgKi8KIAlpZiAodWRldi0+c3RhdGUgIT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKQotCQlkb19yZWJpbmRfaW50ZXJmYWNlcyh1ZGV2KTsKKwkJcmViaW5kX21hcmtlZF9pbnRlcmZhY2VzKHVkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0xNDQyLDcgKzE0ODEsNyBAQAogCQlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKIAkJcG1fcnVudGltZV9zZXRfYWN0aXZlKGRldik7CiAJCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7Ci0JCXVuYmluZF9ub19yZXNldF9yZXN1bWVfZHJpdmVyc19pbnRlcmZhY2VzKHVkZXYpOworCQl1bmJpbmRfbWFya2VkX2ludGVyZmFjZXModWRldik7CiAJfQogCiAJLyogQXZvaWQgUE0gZXJyb3IgbWVzc2FnZXMgZm9yIGRldmljZXMgZGlzY29ubmVjdGVkIHdoaWxlIHN1c3BlbmRlZApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9nZW5lcmljLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2dlbmVyaWMuYwppbmRleCBhY2JmZWIwLi4zNThjYThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2dlbmVyaWMuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2dlbmVyaWMuYwpAQCAtMTU1LDYgKzE1NSw3IEBACiAJfQogCXJldHVybiBpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiX2Nob29zZV9jb25maWd1cmF0aW9uKTsKIAogc3RhdGljIGludCBnZW5lcmljX3Byb2JlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKaW5kZXggMjUxOGMzMi4uOWM0ZTI5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCkBAIC0yMDQ5LDcgKzIwNDksNyBAQAogewogCXN0cnVjdCB1c2JfaGNkICpoY2Q7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKLQlpbnQgaTsKKwlpbnQgaSwgcmV0OwogCiAJZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOwogCWhjZCA9IGJ1c190b19oY2QoZGV2LT5idXMpOwpAQCAtMjA1OCwxMyArMjA1OCwyNCBAQAogCWlmIChkZXYtPnNwZWVkICE9IFVTQl9TUEVFRF9TVVBFUikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBTdHJlYW1zIG9ubHkgYXBwbHkgdG8gYnVsayBlbmRwb2ludHMuICovCi0JZm9yIChpID0gMDsgaSA8IG51bV9lcHM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VwczsgaSsrKSB7CisJCS8qIFN0cmVhbXMgb25seSBhcHBseSB0byBidWxrIGVuZHBvaW50cy4gKi8KIAkJaWYgKCF1c2JfZW5kcG9pbnRfeGZlcl9idWxrKCZlcHNbaV0tPmRlc2MpKQogCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qIFJlLWFsbG9jIGlzIG5vdCBhbGxvd2VkICovCisJCWlmIChlcHNbaV0tPnN0cmVhbXMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKLQlyZXR1cm4gaGNkLT5kcml2ZXItPmFsbG9jX3N0cmVhbXMoaGNkLCBkZXYsIGVwcywgbnVtX2VwcywKKwlyZXQgPSBoY2QtPmRyaXZlci0+YWxsb2Nfc3RyZWFtcyhoY2QsIGRldiwgZXBzLCBudW1fZXBzLAogCQkJbnVtX3N0cmVhbXMsIG1lbV9mbGFncyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VwczsgaSsrKQorCQllcHNbaV0tPnN0cmVhbXMgPSByZXQ7CisKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2FsbG9jX3N0cmVhbXMpOwogCkBAIC0yMDc4LDggKzIwODksNyBAQAogICogUmV2ZXJ0cyBhIGdyb3VwIG9mIGJ1bGsgZW5kcG9pbnRzIGJhY2sgdG8gbm90IHVzaW5nIHN0cmVhbSBJRHMuCiAgKiBDYW4gZmFpbCBpZiB3ZSBhcmUgZ2l2ZW4gYmFkIGFyZ3VtZW50cywgb3IgSENEIGlzIGJyb2tlbi4KICAqCi0gKiBSZXR1cm46IE9uIHN1Y2Nlc3MsIHRoZSBudW1iZXIgb2YgYWxsb2NhdGVkIHN0cmVhbXMuIE9uIGZhaWx1cmUsIGEgbmVnYXRpdmUKLSAqIGVycm9yIGNvZGUuCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4gT24gZmFpbHVyZSwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgogICovCiBpbnQgdXNiX2ZyZWVfc3RyZWFtcyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAogCQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKiplcHMsIHVuc2lnbmVkIGludCBudW1fZXBzLApAQCAtMjA4NywxOSArMjA5NywyNiBAQAogewogCXN0cnVjdCB1c2JfaGNkICpoY2Q7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKLQlpbnQgaTsKKwlpbnQgaSwgcmV0OwogCiAJZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOwogCWhjZCA9IGJ1c190b19oY2QoZGV2LT5idXMpOwogCWlmIChkZXYtPnNwZWVkICE9IFVTQl9TUEVFRF9TVVBFUikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBTdHJlYW1zIG9ubHkgYXBwbHkgdG8gYnVsayBlbmRwb2ludHMuICovCisJLyogRG91YmxlLWZyZWUgaXMgbm90IGFsbG93ZWQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2VwczsgaSsrKQotCQlpZiAoIWVwc1tpXSB8fCAhdXNiX2VuZHBvaW50X3hmZXJfYnVsaygmZXBzW2ldLT5kZXNjKSkKKwkJaWYgKCFlcHNbaV0gfHwgIWVwc1tpXS0+c3RyZWFtcykKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIGhjZC0+ZHJpdmVyLT5mcmVlX3N0cmVhbXMoaGNkLCBkZXYsIGVwcywgbnVtX2VwcywgbWVtX2ZsYWdzKTsKKwlyZXQgPSBoY2QtPmRyaXZlci0+ZnJlZV9zdHJlYW1zKGhjZCwgZGV2LCBlcHMsIG51bV9lcHMsIG1lbV9mbGFncyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VwczsgaSsrKQorCQllcHNbaV0tPnN0cmVhbXMgPSAwOworCisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9mcmVlX3N0cmVhbXMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwppbmRleCA1Y2JmNzhkLi4wOTA0NjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKQEAgLTE0MSwxOSArMTQxLDI3IEBACiAJCXJldHVybiAwOwogCX0KIAotCS8qIEFsbCBVU0IgMy4wIG11c3Qgc3VwcG9ydCBMUE0sIGJ1dCB3ZSBuZWVkIHRoZWlyIG1heCBleGl0IGxhdGVuY3kKLQkgKiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBTdXBlclNwZWVkIEV4dGVuZGVkIENhcGFiaWxpdGllcyBCT1MgZGVzY3JpcHRvci4KKwkvKgorCSAqIEFjY29yZGluZyB0byB0aGUgVVNCIDMuMCBzcGVjLCBhbGwgVVNCIDMuMCBkZXZpY2VzIG11c3Qgc3VwcG9ydCBMUE0uCisJICogSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgdGhhdCBkb24ndCwgYW5kIHRoZXkgc2V0IHRoZSBVMS9VMiBleGl0CisJICogbGF0ZW5jaWVzIHRvIHplcm8uCiAJICovCiAJaWYgKCF1ZGV2LT5ib3MtPnNzX2NhcCkgewotCQlkZXZfd2FybigmdWRldi0+ZGV2LCAiTm8gTFBNIGV4aXQgbGF0ZW5jeSBpbmZvIGZvdW5kLiAgIgotCQkJCSJQb3dlciBtYW5hZ2VtZW50IHdpbGwgYmUgaW1wYWN0ZWQuXG4iKTsKKwkJZGV2X2luZm8oJnVkZXYtPmRldiwgIk5vIExQTSBleGl0IGxhdGVuY3kgaW5mbyBmb3VuZCwgZGlzYWJsaW5nIExQTS5cbiIpOwogCQlyZXR1cm4gMDsKIAl9Ci0JaWYgKHVkZXYtPnBhcmVudC0+bHBtX2NhcGFibGUpCi0JCXJldHVybiAxOwogCi0JZGV2X3dhcm4oJnVkZXYtPmRldiwgIlBhcmVudCBodWIgbWlzc2luZyBMUE0gZXhpdCBsYXRlbmN5IGluZm8uICAiCi0JCQkiUG93ZXIgbWFuYWdlbWVudCB3aWxsIGJlIGltcGFjdGVkLlxuIik7CisJaWYgKHVkZXYtPmJvcy0+c3NfY2FwLT5iVTFkZXZFeGl0TGF0ID09IDAgJiYKKwkJCXVkZXYtPmJvcy0+c3NfY2FwLT5iVTJEZXZFeGl0TGF0ID09IDApIHsKKwkJaWYgKHVkZXYtPnBhcmVudCkKKwkJCWRldl9pbmZvKCZ1ZGV2LT5kZXYsICJMUE0gZXhpdCBsYXRlbmN5IGlzIHplcm9lZCwgZGlzYWJsaW5nIExQTS5cbiIpOworCQllbHNlCisJCQlkZXZfaW5mbygmdWRldi0+ZGV2LCAiV2UgZG9uJ3Qga25vdyB0aGUgYWxnb3JpdGhtcyBmb3IgTFBNIGZvciB0aGlzIGhvc3QsIGRpc2FibGluZyBMUE0uXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCF1ZGV2LT5wYXJlbnQgfHwgdWRldi0+cGFyZW50LT5scG1fY2FwYWJsZSkKKwkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ5OSw3ICs1MDcsOCBAQAogCQljaGFuZ2VkKys7CiAJfQogCWlmIChjaGFuZ2VkKQotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmh1Yi0+bGVkcywgTEVEX0NZQ0xFX1BFUklPRCk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLAorCQkJCSZodWItPmxlZHMsIExFRF9DWUNMRV9QRVJJT0QpOwogfQogCiAvKiB1c2UgYSBzaG9ydCB0aW1lb3V0IGZvciBodWIvcG9ydCBzdGF0dXMgZmV0Y2hlcyAqLwpAQCAtMTA0MSw3ICsxMDUwLDggQEAKIAkJaWYgKHR5cGUgPT0gSFVCX0lOSVQpIHsKIAkJCWRlbGF5ID0gaHViX3Bvd2VyX29uKGh1YiwgZmFsc2UpOwogCQkJSU5JVF9ERUxBWUVEX1dPUksoJmh1Yi0+aW5pdF93b3JrLCBodWJfaW5pdF9mdW5jMik7Ci0JCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmh1Yi0+aW5pdF93b3JrLAorCQkJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsCisJCQkJCSZodWItPmluaXRfd29yaywKIAkJCQkJbXNlY3NfdG9famlmZmllcyhkZWxheSkpOwogCiAJCQkvKiBTdXBwcmVzcyBhdXRvc3VzcGVuZCB1bnRpbCBpbml0IGlzIGRvbmUgKi8KQEAgLTExOTUsNyArMTIwNSw4IEBACiAJCS8qIERvbid0IGRvIGEgbG9uZyBzbGVlcCBpbnNpZGUgYSB3b3JrcXVldWUgcm91dGluZSAqLwogCQlpZiAodHlwZSA9PSBIVUJfSU5JVDIpIHsKIAkJCUlOSVRfREVMQVlFRF9XT1JLKCZodWItPmluaXRfd29yaywgaHViX2luaXRfZnVuYzMpOwotCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZodWItPmluaXRfd29yaywKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLAorCQkJCQkmaHViLT5pbml0X3dvcmssCiAJCQkJCW1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpKTsKIAkJCXJldHVybjsJCS8qIENvbnRpbnVlcyBhdCBpbml0MzogYmVsb3cgKi8KIAkJfSBlbHNlIHsKQEAgLTEyMDksNyArMTIyMCw4IEBACiAJaWYgKHN0YXR1cyA8IDApCiAJCWRldl9lcnIoaHViLT5pbnRmZGV2LCAiYWN0aXZhdGUgLS0+ICVkXG4iLCBzdGF0dXMpOwogCWlmIChodWItPmhhc19pbmRpY2F0b3JzICYmIGJsaW5rZW5saWdodHMpCi0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaHViLT5sZWRzLCBMRURfQ1lDTEVfUEVSSU9EKTsKKwkJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsCisJCQkJJmh1Yi0+bGVkcywgTEVEX0NZQ0xFX1BFUklPRCk7CiAKIAkvKiBTY2FuIGFsbCBwb3J0cyB0aGF0IG5lZWQgYXR0ZW50aW9uICovCiAJa2lja19raHViZChodWIpOwpAQCAtMTc4OCw3ICsxODAwLDcgQEAKICAqIHRvIG9uZSBvZiB0aGVzZSAiY2xhaW1lZCIgcG9ydHMsIHRoZSBwcm9ncmFtIHdpbGwgIm93biIgdGhlIGRldmljZS4KICAqLwogc3RhdGljIGludCBmaW5kX3BvcnRfb3duZXIoc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYsIHVuc2lnbmVkIHBvcnQxLAotCQlzdHJ1Y3QgZGV2X3N0YXRlICoqKnBwb3duZXIpCisJCXN0cnVjdCB1c2JfZGV2X3N0YXRlICoqKnBwb3duZXIpCiB7CiAJc3RydWN0IHVzYl9odWIgKmh1YiA9IHVzYl9odWJfdG9fc3RydWN0X2h1YihoZGV2KTsKIApAQCAtMTgwNiwxMCArMTgxOCwxMCBAQAogCiAvKiBJbiB0aGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucywgdGhlIGNhbGxlciBtdXN0IGhvbGQgaGRldidzIGxvY2sgKi8KIGludCB1c2JfaHViX2NsYWltX3BvcnQoc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYsIHVuc2lnbmVkIHBvcnQxLAotCQkgICAgICAgc3RydWN0IGRldl9zdGF0ZSAqb3duZXIpCisJCSAgICAgICBzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqb3duZXIpCiB7CiAJaW50IHJjOwotCXN0cnVjdCBkZXZfc3RhdGUgKipwb3duZXI7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKipwb3duZXI7CiAKIAlyYyA9IGZpbmRfcG9ydF9vd25lcihoZGV2LCBwb3J0MSwgJnBvd25lcik7CiAJaWYgKHJjKQpAQCAtMTgxOSwxMiArMTgzMSwxMyBAQAogCSpwb3duZXIgPSBvd25lcjsKIAlyZXR1cm4gcmM7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfaHViX2NsYWltX3BvcnQpOwogCiBpbnQgdXNiX2h1Yl9yZWxlYXNlX3BvcnQoc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYsIHVuc2lnbmVkIHBvcnQxLAotCQkJIHN0cnVjdCBkZXZfc3RhdGUgKm93bmVyKQorCQkJIHN0cnVjdCB1c2JfZGV2X3N0YXRlICpvd25lcikKIHsKIAlpbnQgcmM7Ci0Jc3RydWN0IGRldl9zdGF0ZSAqKnBvd25lcjsKKwlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqKnBvd25lcjsKIAogCXJjID0gZmluZF9wb3J0X293bmVyKGhkZXYsIHBvcnQxLCAmcG93bmVyKTsKIAlpZiAocmMpCkBAIC0xODM0LDggKzE4NDcsOSBAQAogCSpwb3duZXIgPSBOVUxMOwogCXJldHVybiByYzsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9odWJfcmVsZWFzZV9wb3J0KTsKIAotdm9pZCB1c2JfaHViX3JlbGVhc2VfYWxsX3BvcnRzKHN0cnVjdCB1c2JfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgZGV2X3N0YXRlICpvd25lcikKK3ZvaWQgdXNiX2h1Yl9yZWxlYXNlX2FsbF9wb3J0cyhzdHJ1Y3QgdXNiX2RldmljZSAqaGRldiwgc3RydWN0IHVzYl9kZXZfc3RhdGUgKm93bmVyKQogewogCXN0cnVjdCB1c2JfaHViICpodWIgPSB1c2JfaHViX3RvX3N0cnVjdF9odWIoaGRldik7CiAJaW50IG47CkBAIC0zMDkzLDkgKzMxMDcsMTkgQEAKIAkgKiBvcGVyYXRpb24gaXMgY2FycmllZCBvdXQgaGVyZSwgYWZ0ZXIgdGhlIHBvcnQgaGFzIGJlZW4KIAkgKiByZXN1bWVkLgogCSAqLwotCWlmICh1ZGV2LT5yZXNldF9yZXN1bWUpCisJaWYgKHVkZXYtPnJlc2V0X3Jlc3VtZSkgeworCQkvKgorCQkgKiBJZiB0aGUgZGV2aWNlIG1vcnBocyBvciBzd2l0Y2hlcyBtb2RlcyB3aGVuIGl0IGlzIHJlc2V0LAorCQkgKiB3ZSBkb24ndCB3YW50IHRvIHBlcmZvcm0gYSByZXNldC1yZXN1bWUuICBXZSdsbCBmYWlsIHRoZQorCQkgKiByZXN1bWUsIHdoaWNoIHdpbGwgY2F1c2UgYSBsb2dpY2FsIGRpc2Nvbm5lY3QsIGFuZCB0aGVuCisJCSAqIHRoZSBkZXZpY2Ugd2lsbCBiZSByZWRpc2NvdmVyZWQuCisJCSAqLwogIHJldHJ5X3Jlc2V0X3Jlc3VtZToKLQkJc3RhdHVzID0gdXNiX3Jlc2V0X2FuZF92ZXJpZnlfZGV2aWNlKHVkZXYpOworCQlpZiAodWRldi0+cXVpcmtzICYgVVNCX1FVSVJLX1JFU0VUKQorCQkJc3RhdHVzID0gLUVOT0RFVjsKKwkJZWxzZQorCQkJc3RhdHVzID0gdXNiX3Jlc2V0X2FuZF92ZXJpZnlfZGV2aWNlKHVkZXYpOworCX0KIAogCS8qIDEwLjUuNC41IHNheXMgYmUgc3VyZSBkZXZpY2VzIGluIHRoZSB0cmVlIGFyZSBzdGlsbCB0aGVyZS4KIAkgKiBGb3Igbm93IGxldCdzIGFzc3VtZSB0aGUgZGV2aWNlIGRpZG4ndCBnbyBjcmF6eSBvbiByZXN1bWUsCkBAIC0zOTU4LDcgKzM5ODIsNyBAQAogCWNvbm5lY3RfdHlwZSA9IHVzYl9nZXRfaHViX3BvcnRfY29ubmVjdF90eXBlKHVkZXYtPnBhcmVudCwKIAkJCXVkZXYtPnBvcnRudW0pOwogCi0JaWYgKCh1ZGV2LT5ib3MtPmV4dF9jYXAtPmJtQXR0cmlidXRlcyAmIFVTQl9CRVNMX1NVUFBPUlQpIHx8CisJaWYgKCh1ZGV2LT5ib3MtPmV4dF9jYXAtPmJtQXR0cmlidXRlcyAmIGNwdV90b19sZTMyKFVTQl9CRVNMX1NVUFBPUlQpKSB8fAogCQkJY29ubmVjdF90eXBlID09IFVTQl9QT1JUX0NPTk5FQ1RfVFlQRV9IQVJEX1dJUkVEKSB7CiAJCXVkZXYtPnVzYjJfaHdfbHBtX2FsbG93ZWQgPSAxOwogCQl1c2Jfc2V0X3VzYjJfaGFyZHdhcmVfbHBtKHVkZXYsIDEpOwpAQCAtNDEwNyw4ICs0MTMxLDEyIEBACiAKIAkJCWRpZF9uZXdfc2NoZW1lID0gdHJ1ZTsKIAkJCXJldHZhbCA9IGh1Yl9lbmFibGVfZGV2aWNlKHVkZXYpOwotCQkJaWYgKHJldHZhbCA8IDApCisJCQlpZiAocmV0dmFsIDwgMCkgeworCQkJCWRldl9lcnIoJnVkZXYtPmRldiwKKwkJCQkJImh1YiBmYWlsZWQgdG8gZW5hYmxlIGRldmljZSwgZXJyb3IgJWRcbiIsCisJCQkJCXJldHZhbCk7CiAJCQkJZ290byBmYWlsOworCQkJfQogCiAjZGVmaW5lIEdFVF9ERVNDUklQVE9SX0JVRlNJWkUJNjQKIAkJCWJ1ZiA9IGttYWxsb2MoR0VUX0RFU0NSSVBUT1JfQlVGU0laRSwgR0ZQX05PSU8pOwpAQCAtNDMxMSw3ICs0MzM5LDggQEAKIAkJLyogaHViIExFRHMgYXJlIHByb2JhYmx5IGhhcmRlciB0byBtaXNzIHRoYW4gc3lzbG9nICovCiAJCWlmIChodWItPmhhc19pbmRpY2F0b3JzKSB7CiAJCQlodWItPmluZGljYXRvcltwb3J0MS0xXSA9IElORElDQVRPUl9HUkVFTl9CTElOSzsKLQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yayAoJmh1Yi0+bGVkcywgMCk7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwKKwkJCQkJJmh1Yi0+bGVkcywgMCk7CiAJCX0KIAl9CiAJa2ZyZWUocXVhbCk7CkBAIC00NTQwLDcgKzQ1NjksOSBAQAogCQkJCWlmIChodWItPmhhc19pbmRpY2F0b3JzKSB7CiAJCQkJCWh1Yi0+aW5kaWNhdG9yW3BvcnQxLTFdID0KIAkJCQkJCUlORElDQVRPUl9BTUJFUl9CTElOSzsKLQkJCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrICgmaHViLT5sZWRzLCAwKTsKKwkJCQkJcXVldWVfZGVsYXllZF93b3JrKAorCQkJCQkJc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwKKwkJCQkJCSZodWItPmxlZHMsIDApOwogCQkJCX0KIAkJCQlzdGF0dXMgPSAtRU5PVENPTk47CS8qIERvbid0IHJldHJ5ICovCiAJCQkJZ290byBsb29wX2Rpc2FibGU7CkBAIC00NzM5LDYgKzQ3NzAsOCBAQAogCiAJCS8qIGRlYWwgd2l0aCBwb3J0IHN0YXR1cyBjaGFuZ2VzICovCiAJCWZvciAoaSA9IDE7IGkgPD0gaGRldi0+bWF4Y2hpbGQ7IGkrKykgeworCQkJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBodWItPnBvcnRzW2kgLSAxXS0+Y2hpbGQ7CisKIAkJCWlmICh0ZXN0X2JpdChpLCBodWItPmJ1c3lfYml0cykpCiAJCQkJY29udGludWU7CiAJCQljb25uZWN0X2NoYW5nZSA9IHRlc3RfYml0KGksIGh1Yi0+Y2hhbmdlX2JpdHMpOwpAQCAtNDgzNyw4ICs0ODcwLDYgQEAKIAkJCSAqLwogCQkJaWYgKGh1Yl9wb3J0X3dhcm1fcmVzZXRfcmVxdWlyZWQoaHViLCBwb3J0c3RhdHVzKSkgewogCQkJCWludCBzdGF0dXM7Ci0JCQkJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPQotCQkJCQlodWItPnBvcnRzW2kgLSAxXS0+Y2hpbGQ7CiAKIAkJCQlkZXZfZGJnKGh1Yl9kZXYsICJ3YXJtIHJlc2V0IHBvcnQgJWRcbiIsIGkpOwogCQkJCWlmICghdWRldiB8fApAQCAtNDg1NSw2ICs0ODg2LDI0IEBACiAJCQkJCXVzYl91bmxvY2tfZGV2aWNlKHVkZXYpOwogCQkJCQljb25uZWN0X2NoYW5nZSA9IDA7CiAJCQkJfQorCQkJLyoKKwkJCSAqIE9uIGRpc2Nvbm5lY3QgVVNCMyBwcm90b2NvbCBwb3J0cyB0cmFuc2l0IGZyb20gVTAgdG8KKwkJCSAqIFNTLkluYWN0aXZlIHRvIFJ4LkRldGVjdC4gSWYgdGhpcyBoYXBwZW5zIGEgd2FybS0KKwkJCSAqIHJlc2V0IGlzIG5vdCBuZWVkZWQsIGJ1dCBhIChyZSljb25uZWN0IG1heSBoYXBwZW4KKwkJCSAqIGJlZm9yZSBraHViZCBydW5zIGFuZCBzZWVzIHRoZSBkaXNjb25uZWN0LCBhbmQgdGhlCisJCQkgKiBkZXZpY2UgbWF5IGJlIGFuIHVua25vd24gc3RhdGUuCisJCQkgKgorCQkJICogSWYgdGhlIHBvcnQgd2VudCB0aHJvdWdoIFNTLkluYWN0aXZlIHdpdGhvdXQga2h1YmQKKwkJCSAqIHNlZWluZyBpdCB0aGUgQ19MSU5LX1NUQVRFIGNoYW5nZSBmbGFnIHdpbGwgYmUgc2V0LAorCQkJICogYW5kIHdlIHJlc2V0IHRoZSBkZXYgdG8gcHV0IGl0IGluIGEga25vd24gc3RhdGUuCisJCQkgKi8KKwkJCX0gZWxzZSBpZiAodWRldiAmJiBodWJfaXNfc3VwZXJzcGVlZChodWItPmhkZXYpICYmCisJCQkJICAgKHBvcnRjaGFuZ2UgJiBVU0JfUE9SVF9TVEFUX0NfTElOS19TVEFURSkgJiYKKwkJCQkgICAocG9ydHN0YXR1cyAmIFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTikpIHsKKwkJCQl1c2JfbG9ja19kZXZpY2UodWRldik7CisJCQkJdXNiX3Jlc2V0X2RldmljZSh1ZGV2KTsKKwkJCQl1c2JfdW5sb2NrX2RldmljZSh1ZGV2KTsKKwkJCQljb25uZWN0X2NoYW5nZSA9IDA7CiAJCQl9CiAKIAkJCWlmIChjb25uZWN0X2NoYW5nZSkKQEAgLTUxMTIsNyArNTE2MSw3IEBACiAJc3RydWN0IHVzYl9oY2QJCQkqaGNkID0gYnVzX3RvX2hjZCh1ZGV2LT5idXMpOwogCXN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IJZGVzY3JpcHRvciA9IHVkZXYtPmRlc2NyaXB0b3I7CiAJc3RydWN0IHVzYl9ob3N0X2JvcwkJKmJvczsKLQlpbnQgCQkJCWksIHJldCA9IDA7CisJaW50CQkJCWksIGosIHJldCA9IDA7CiAJaW50CQkJCXBvcnQxID0gdWRldi0+cG9ydG51bTsKIAogCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQgfHwKQEAgLTUyMzgsNiArNTI4Nyw5IEBACiAJCQkJcmV0KTsKIAkJCWdvdG8gcmVfZW51bWVyYXRlOwogCQl9CisJCS8qIFJlc2V0dGluZyBhbHNvIGZyZWVzIGFueSBhbGxvY2F0ZWQgc3RyZWFtcyAqLworCQlmb3IgKGogPSAwOyBqIDwgaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYk51bUVuZHBvaW50czsgaisrKQorCQkJaW50Zi0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50W2pdLnN0cmVhbXMgPSAwOwogCX0KIAogZG9uZToKQEAgLTUzNDAsMTAgKzUzOTIsMTEgQEAKIAkJCQllbHNlIGlmIChjaW50Zi0+Y29uZGl0aW9uID09CiAJCQkJCQlVU0JfSU5URVJGQUNFX0JPVU5EKQogCQkJCQlyZWJpbmQgPSAxOworCQkJCWlmIChyZWJpbmQpCisJCQkJCWNpbnRmLT5uZWVkc19iaW5kaW5nID0gMTsKIAkJCX0KLQkJCWlmIChyZXQgPT0gMCAmJiByZWJpbmQpCi0JCQkJdXNiX3JlYmluZF9pbnRmKGNpbnRmKTsKIAkJfQorCQl1c2JfdW5iaW5kX2FuZF9yZWJpbmRfbWFya2VkX2ludGVyZmFjZXModWRldik7CiAJfQogCiAJdXNiX2F1dG9zdXNwZW5kX2RldmljZSh1ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmggYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5oCmluZGV4IGRmNjI5YTMuLjMzYmNiMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmgKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuaApAQCAtODksNyArODksNyBAQAogc3RydWN0IHVzYl9wb3J0IHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqY2hpbGQ7CiAJc3RydWN0IGRldmljZSBkZXY7Ci0Jc3RydWN0IGRldl9zdGF0ZSAqcG9ydF9vd25lcjsKKwlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcG9ydF9vd25lcjsKIAllbnVtIHVzYl9wb3J0X2Nvbm5lY3RfdHlwZSBjb25uZWN0X3R5cGU7CiAJdTggcG9ydG51bTsKIAl1bnNpZ25lZCBwb3dlcl9pc19vbjoxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMgYi9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYwppbmRleCBmODI5YTFhLi4zY2RjZDBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYwpAQCAtMTI5Myw4ICsxMjkzLDcgQEAKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2U7CiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0OwogCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBidXNfdG9faGNkKGRldi0+YnVzKTsKLQlpbnQgcmV0OwotCWludCBtYW51YWwgPSAwOworCWludCBpLCByZXQsIG1hbnVhbCA9IDA7CiAJdW5zaWduZWQgaW50IGVwYWRkcjsKIAl1bnNpZ25lZCBpbnQgcGlwZTsKIApAQCAtMTMyOSw2ICsxMzI4LDEwIEBACiAJCW11dGV4X3VubG9jayhoY2QtPmJhbmR3aWR0aF9tdXRleCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KKwkvKiBDaGFuZ2luZyBhbHQtc2V0dGluZyBhbHNvIGZyZWVzIGFueSBhbGxvY2F0ZWQgc3RyZWFtcyAqLworCWZvciAoaSA9IDA7IGkgPCBpZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYk51bUVuZHBvaW50czsgaSsrKQorCQlpZmFjZS0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50W2ldLnN0cmVhbXMgPSAwOworCiAJcmV0ID0gdXNiX2hjZF9hbGxvY19iYW5kd2lkdGgoZGV2LCBOVUxMLCBpZmFjZS0+Y3VyX2FsdHNldHRpbmcsIGFsdCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2luZm8oJmRldi0+ZGV2LCAiTm90IGVub3VnaCBiYW5kd2lkdGggZm9yIGFsdHNldHRpbmcgJWRcbiIsCkBAIC0xOTIwLDYgKzE5MjMsNyBAQAogCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9zZXRfY29uZmlndXJhdGlvbik7CiAKIHN0YXRpYyBMSVNUX0hFQUQoc2V0X2NvbmZpZ19saXN0KTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2V0X2NvbmZpZ19sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmggYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oCmluZGV4IDgyMzg1NzcuLjc1YmY2NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmgKKysrIGIvZHJpdmVycy91c2IvY29yZS91c2IuaApAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAKIHN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3I7Ci1zdHJ1Y3QgZGV2X3N0YXRlOworc3RydWN0IHVzYl9kZXZfc3RhdGU7CiAKIC8qIEZ1bmN0aW9ucyBsb2NhbCB0byBkcml2ZXJzL3VzYi9jb3JlLyAqLwogCkBAIC01NSwxNCArNTUsMTAgQEAKIGV4dGVybiBpbnQgdXNiX21hdGNoX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAogCQkJICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CiBleHRlcm4gdm9pZCB1c2JfZm9yY2VkX3VuYmluZF9pbnRmKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKLWV4dGVybiB2b2lkIHVzYl9yZWJpbmRfaW50ZihzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CitleHRlcm4gdm9pZCB1c2JfdW5iaW5kX2FuZF9yZWJpbmRfbWFya2VkX2ludGVyZmFjZXMoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOwogCi1leHRlcm4gaW50IHVzYl9odWJfY2xhaW1fcG9ydChzdHJ1Y3QgdXNiX2RldmljZSAqaGRldiwgdW5zaWduZWQgcG9ydCwKLQkJc3RydWN0IGRldl9zdGF0ZSAqb3duZXIpOwotZXh0ZXJuIGludCB1c2JfaHViX3JlbGVhc2VfcG9ydChzdHJ1Y3QgdXNiX2RldmljZSAqaGRldiwgdW5zaWduZWQgcG9ydCwKLQkJc3RydWN0IGRldl9zdGF0ZSAqb3duZXIpOwogZXh0ZXJuIHZvaWQgdXNiX2h1Yl9yZWxlYXNlX2FsbF9wb3J0cyhzdHJ1Y3QgdXNiX2RldmljZSAqaGRldiwKLQkJc3RydWN0IGRldl9zdGF0ZSAqb3duZXIpOworCQlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqb3duZXIpOwogZXh0ZXJuIGJvb2wgdXNiX2RldmljZV9pc19vd25lZChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldik7CiAKIGV4dGVybiBpbnQgIHVzYl9odWJfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzIvY29yZV9pbnRyLmMgYi9kcml2ZXJzL3VzYi9kd2MyL2NvcmVfaW50ci5jCmluZGV4IDgyMDU3OTkuLmM5MzkxOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzIvY29yZV9pbnRyLmMKKysrIGIvZHJpdmVycy91c2IvZHdjMi9jb3JlX2ludHIuYwpAQCAtNzIsNiArNzIsMjYgQEAKIH0KIAogLyoqCisgKiBkd2MyX2hhbmRsZV91c2JfcG9ydF9pbnRyIC0gaGFuZGxlcyBPVEcgUFJUSU5UIGludGVycnVwdHMuCisgKiBXaGVuIHRoZSBQUlRJTlQgaW50ZXJydXB0IGZpcmVzLCB0aGVyZSBhcmUgY2VydGFpbiBzdGF0dXMgYml0cyBpbiB0aGUgSG9zdAorICogUG9ydCB0aGF0IG5lZWRzIHRvIGdldCBjbGVhcmVkLgorICoKKyAqIEBoc290ZzogUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIKKyAqLworc3RhdGljIHZvaWQgZHdjMl9oYW5kbGVfdXNiX3BvcnRfaW50cihzdHJ1Y3QgZHdjMl9oc290ZyAqaHNvdGcpCit7CisJdTMyIGhwcnQwID0gcmVhZGwoaHNvdGctPnJlZ3MgKyBIUFJUMCk7CisKKwlpZiAoaHBydDAgJiBIUFJUMF9FTkFDSEcpIHsKKwkJaHBydDAgJj0gfkhQUlQwX0VOQTsKKwkJd3JpdGVsKGhwcnQwLCBoc290Zy0+cmVncyArIEhQUlQwKTsKKwl9CisKKwkvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKwl3cml0ZWwoR0lOVFNUU19QUlRJTlQsIGhzb3RnLT5yZWdzICsgR0lOVFNUUyk7Cit9CisKKy8qKgogICogZHdjMl9oYW5kbGVfbW9kZV9taXNtYXRjaF9pbnRyKCkgLSBMb2dzIGEgbW9kZSBtaXNtYXRjaCB3YXJuaW5nIG1lc3NhZ2UKICAqCiAgKiBAaHNvdGc6IFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyCkBAIC00NzksOSArNDk5LDggQEAKIAkJaWYgKGR3YzJfaXNfZGV2aWNlX21vZGUoaHNvdGcpKSB7CiAJCQlkZXZfZGJnKGhzb3RnLT5kZXYsCiAJCQkJIiAtLVBvcnQgaW50ZXJydXB0IHJlY2VpdmVkIGluIERldmljZSBtb2RlLS1cbiIpOwotCQkJZ2ludHN0cyA9IEdJTlRTVFNfUFJUSU5UOwotCQkJd3JpdGVsKGdpbnRzdHMsIGhzb3RnLT5yZWdzICsgR0lOVFNUUyk7Ci0JCQlyZXR2YWwgPSAxOworCQkJZHdjMl9oYW5kbGVfdXNiX3BvcnRfaW50cihoc290Zyk7CisJCQlyZXR2YWwgPSBJUlFfSEFORExFRDsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMi9oY2RfaW50ci5jIGIvZHJpdmVycy91c2IvZHdjMi9oY2RfaW50ci5jCmluZGV4IDAxMmYxN2UuLjQ3YjllYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzIvaGNkX2ludHIuYworKysgYi9kcml2ZXJzL3VzYi9kd2MyL2hjZF9pbnRyLmMKQEAgLTk3NSw4ICs5NzUsOCBAQAogCQkJCSAgc3RydWN0IGR3YzJfcXRkICpxdGQpCiB7CiAJc3RydWN0IGR3YzJfaGNkX3VyYiAqdXJiID0gcXRkLT51cmI7Ci0JaW50IHBpcGVfdHlwZSA9IGR3YzJfaGNkX2dldF9waXBlX3R5cGUoJnVyYi0+cGlwZV9pbmZvKTsKIAllbnVtIGR3YzJfaGFsdF9zdGF0dXMgaGFsdF9zdGF0dXMgPSBEV0MyX0hDX1hGRVJfQ09NUExFVEU7CisJaW50IHBpcGVfdHlwZTsKIAlpbnQgdXJiX3hmZXJfZG9uZTsKIAogCWlmIChkYmdfaGMoY2hhbikpCkBAIC05ODQsNiArOTg0LDExIEBACiAJCQkgIi0tSG9zdCBDaGFubmVsICVkIEludGVycnVwdDogVHJhbnNmZXIgQ29tcGxldGUtLVxuIiwKIAkJCSBjaG51bSk7CiAKKwlpZiAoIXVyYikKKwkJZ290byBoYW5kbGVfeGZlcmNvbXBfZG9uZTsKKworCXBpcGVfdHlwZSA9IGR3YzJfaGNkX2dldF9waXBlX3R5cGUoJnVyYi0+cGlwZV9pbmZvKTsKKwogCWlmIChoc290Zy0+Y29yZV9wYXJhbXMtPmRtYV9kZXNjX2VuYWJsZSA+IDApIHsKIAkJZHdjMl9oY2RfY29tcGxldGVfeGZlcl9kZG1hKGhzb3RnLCBjaGFuLCBjaG51bSwgaGFsdF9zdGF0dXMpOwogCQlpZiAocGlwZV90eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpCkBAIC0xMDA1LDkgKzEwMTAsNiBAQAogCQl9CiAJfQogCi0JaWYgKCF1cmIpCi0JCWdvdG8gaGFuZGxlX3hmZXJjb21wX2RvbmU7Ci0KIAkvKiBVcGRhdGUgdGhlIFFURCBhbmQgVVJCIHN0YXRlcyAqLwogCXN3aXRjaCAocGlwZV90eXBlKSB7CiAJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MOgpAQCAtMTEwNSw3ICsxMTA3LDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgZHdjMl9xdGQgKnF0ZCkKIHsKIAlzdHJ1Y3QgZHdjMl9oY2RfdXJiICp1cmIgPSBxdGQtPnVyYjsKLQlpbnQgcGlwZV90eXBlID0gZHdjMl9oY2RfZ2V0X3BpcGVfdHlwZSgmdXJiLT5waXBlX2luZm8pOworCWludCBwaXBlX3R5cGU7CiAKIAlkZXZfZGJnKGhzb3RnLT5kZXYsICItLUhvc3QgQ2hhbm5lbCAlZCBJbnRlcnJ1cHQ6IFNUQUxMIFJlY2VpdmVkLS1cbiIsCiAJCWNobnVtKTsKQEAgLTExMTksNiArMTEyMSw4IEBACiAJaWYgKCF1cmIpCiAJCWdvdG8gaGFuZGxlX3N0YWxsX2hhbHQ7CiAKKwlwaXBlX3R5cGUgPSBkd2MyX2hjZF9nZXRfcGlwZV90eXBlKCZ1cmItPnBpcGVfaW5mbyk7CisKIAlpZiAocGlwZV90eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpCiAJCWR3YzJfaG9zdF9jb21wbGV0ZShoc290ZywgcXRkLCAtRVBJUEUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuYyBiL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5jCmluZGV4IGE0OTIxN2EuLmQwMDE0MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5jCkBAIC02MSw5ICs2MSwxMCBAQAogICogZHdjM19jb3JlX3NvZnRfcmVzZXQgLSBJc3N1ZXMgY29yZSBzb2Z0IHJlc2V0IGFuZCBQSFkgcmVzZXQKICAqIEBkd2M6IHBvaW50ZXIgdG8gb3VyIGNvbnRleHQgc3RydWN0dXJlCiAgKi8KLXN0YXRpYyB2b2lkIGR3YzNfY29yZV9zb2Z0X3Jlc2V0KHN0cnVjdCBkd2MzICpkd2MpCitzdGF0aWMgaW50IGR3YzNfY29yZV9zb2Z0X3Jlc2V0KHN0cnVjdCBkd2MzICpkd2MpCiB7CiAJdTMyCQlyZWc7CisJaW50CQlyZXQ7CiAKIAkvKiBCZWZvcmUgUmVzZXR0aW5nIFBIWSwgcHV0IENvcmUgaW4gUmVzZXQgKi8KIAlyZWcgPSBkd2MzX3JlYWRsKGR3Yy0+cmVncywgRFdDM19HQ1RMKTsKQEAgLTgyLDYgKzgzLDE1IEBACiAKIAl1c2JfcGh5X2luaXQoZHdjLT51c2IyX3BoeSk7CiAJdXNiX3BoeV9pbml0KGR3Yy0+dXNiM19waHkpOworCXJldCA9IHBoeV9pbml0KGR3Yy0+dXNiMl9nZW5lcmljX3BoeSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBwaHlfaW5pdChkd2MtPnVzYjNfZ2VuZXJpY19waHkpOworCWlmIChyZXQgPCAwKSB7CisJCXBoeV9leGl0KGR3Yy0+dXNiMl9nZW5lcmljX3BoeSk7CisJCXJldHVybiByZXQ7CisJfQogCW1kZWxheSgxMDApOwogCiAJLyogQ2xlYXIgVVNCMyBQSFkgcmVzZXQgKi8KQEAgLTEwMCw2ICsxMTAsOCBAQAogCXJlZyA9IGR3YzNfcmVhZGwoZHdjLT5yZWdzLCBEV0MzX0dDVEwpOwogCXJlZyAmPSB+RFdDM19HQ1RMX0NPUkVTT0ZUUkVTRVQ7CiAJZHdjM193cml0ZWwoZHdjLT5yZWdzLCBEV0MzX0dDVEwsIHJlZyk7CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0yNDIsNiArMjU0LDkwIEBACiAJfQogfQogCitzdGF0aWMgaW50IGR3YzNfYWxsb2Nfc2NyYXRjaF9idWZmZXJzKHN0cnVjdCBkd2MzICpkd2MpCit7CisJaWYgKCFkd2MtPmhhc19oaWJlcm5hdGlvbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWR3Yy0+bnJfc2NyYXRjaCkKKwkJcmV0dXJuIDA7CisKKwlkd2MtPnNjcmF0Y2hidWYgPSBrbWFsbG9jX2FycmF5KGR3Yy0+bnJfc2NyYXRjaCwKKwkJCURXQzNfU0NSQVRDSEJVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWR3Yy0+c2NyYXRjaGJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkd2MzX3NldHVwX3NjcmF0Y2hfYnVmZmVycyhzdHJ1Y3QgZHdjMyAqZHdjKQoreworCWRtYV9hZGRyX3Qgc2NyYXRjaF9hZGRyOworCXUzMiBwYXJhbTsKKwlpbnQgcmV0OworCisJaWYgKCFkd2MtPmhhc19oaWJlcm5hdGlvbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWR3Yy0+bnJfc2NyYXRjaCkKKwkJcmV0dXJuIDA7CisKKwkgLyogc2hvdWxkIG5ldmVyIGZhbGwgaGVyZSAqLworCWlmICghV0FSTl9PTihkd2MtPnNjcmF0Y2hidWYpKQorCQlyZXR1cm4gMDsKKworCXNjcmF0Y2hfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGR3Yy0+ZGV2LCBkd2MtPnNjcmF0Y2hidWYsCisJCQlkd2MtPm5yX3NjcmF0Y2ggKiBEV0MzX1NDUkFUQ0hCVUZfU0laRSwKKwkJCURNQV9CSURJUkVDVElPTkFMKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZHdjLT5kZXYsIHNjcmF0Y2hfYWRkcikpIHsKKwkJZGV2X2Vycihkd2MtPmRldiwgImZhaWxlZCB0byBtYXAgc2NyYXRjaCBidWZmZXJcbiIpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycjA7CisJfQorCisJZHdjLT5zY3JhdGNoX2FkZHIgPSBzY3JhdGNoX2FkZHI7CisKKwlwYXJhbSA9IGxvd2VyXzMyX2JpdHMoc2NyYXRjaF9hZGRyKTsKKworCXJldCA9IGR3YzNfc2VuZF9nYWRnZXRfZ2VuZXJpY19jb21tYW5kKGR3YywKKwkJCURXQzNfREdDTURfU0VUX1NDUkFUQ0hQQURfQUREUl9MTywgcGFyYW0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjE7CisKKwlwYXJhbSA9IHVwcGVyXzMyX2JpdHMoc2NyYXRjaF9hZGRyKTsKKworCXJldCA9IGR3YzNfc2VuZF9nYWRnZXRfZ2VuZXJpY19jb21tYW5kKGR3YywKKwkJCURXQzNfREdDTURfU0VUX1NDUkFUQ0hQQURfQUREUl9ISSwgcGFyYW0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjE7CisKKwlyZXR1cm4gMDsKKworZXJyMToKKwlkbWFfdW5tYXBfc2luZ2xlKGR3Yy0+ZGV2LCBkd2MtPnNjcmF0Y2hfYWRkciwgZHdjLT5ucl9zY3JhdGNoICoKKwkJCURXQzNfU0NSQVRDSEJVRl9TSVpFLCBETUFfQklESVJFQ1RJT05BTCk7CisKK2VycjA6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZHdjM19mcmVlX3NjcmF0Y2hfYnVmZmVycyhzdHJ1Y3QgZHdjMyAqZHdjKQoreworCWlmICghZHdjLT5oYXNfaGliZXJuYXRpb24pCisJCXJldHVybjsKKworCWlmICghZHdjLT5ucl9zY3JhdGNoKQorCQlyZXR1cm47CisKKwkgLyogc2hvdWxkIG5ldmVyIGZhbGwgaGVyZSAqLworCWlmICghV0FSTl9PTihkd2MtPnNjcmF0Y2hidWYpKQorCQlyZXR1cm47CisKKwlkbWFfdW5tYXBfc2luZ2xlKGR3Yy0+ZGV2LCBkd2MtPnNjcmF0Y2hfYWRkciwgZHdjLT5ucl9zY3JhdGNoICoKKwkJCURXQzNfU0NSQVRDSEJVRl9TSVpFLCBETUFfQklESVJFQ1RJT05BTCk7CisJa2ZyZWUoZHdjLT5zY3JhdGNoYnVmKTsKK30KKwogc3RhdGljIHZvaWQgZHdjM19jb3JlX251bV9lcHMoc3RydWN0IGR3YzMgKmR3YykKIHsKIAlzdHJ1Y3QgZHdjM19od3BhcmFtcwkqcGFybXMgPSAmZHdjLT5od3BhcmFtczsKQEAgLTI3Nyw2ICszNzMsNyBAQAogc3RhdGljIGludCBkd2MzX2NvcmVfaW5pdChzdHJ1Y3QgZHdjMyAqZHdjKQogewogCXVuc2lnbmVkIGxvbmcJCXRpbWVvdXQ7CisJdTMyCQkJaHdwYXJhbXM0ID0gZHdjLT5od3BhcmFtcy5od3BhcmFtczQ7CiAJdTMyCQkJcmVnOwogCWludAkJCXJldDsKIApAQCAtMzA2LDcgKzQwMyw5IEBACiAJCWNwdV9yZWxheCgpOwogCX0gd2hpbGUgKHRydWUpOwogCi0JZHdjM19jb3JlX3NvZnRfcmVzZXQoZHdjKTsKKwlyZXQgPSBkd2MzX2NvcmVfc29mdF9yZXNldChkd2MpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMDsKIAogCXJlZyA9IGR3YzNfcmVhZGwoZHdjLT5yZWdzLCBEV0MzX0dDVEwpOwogCXJlZyAmPSB+RFdDM19HQ1RMX1NDQUxFRE9XTl9NQVNLOwpAQCAtMzE0LDcgKzQxMywyOSBAQAogCiAJc3dpdGNoIChEV0MzX0dIV1BBUkFNUzFfRU5fUFdST1BUKGR3Yy0+aHdwYXJhbXMuaHdwYXJhbXMxKSkgewogCWNhc2UgRFdDM19HSFdQQVJBTVMxX0VOX1BXUk9QVF9DTEs6Ci0JCXJlZyAmPSB+RFdDM19HQ1RMX0RTQkxDTEtHVE5HOworCQkvKioKKwkJICogV09SS0FST1VORDogRFdDMyByZXZpc2lvbnMgYmV0d2VlbiAyLjEwYSBhbmQgMi41MGEgaGF2ZSBhbgorCQkgKiBpc3N1ZSB3aGljaCB3b3VsZCBjYXVzZSB4SENJIGNvbXBsaWFuY2UgdGVzdHMgdG8gZmFpbC4KKwkJICoKKwkJICogQmVjYXVzZSBvZiB0aGF0IHdlIGNhbm5vdCBlbmFibGUgY2xvY2sgZ2F0aW5nIG9uIHN1Y2gKKwkJICogY29uZmlndXJhdGlvbnMuCisJCSAqCisJCSAqIFJlZmVycyB0bzoKKwkJICoKKwkJICogU1RBUiM5MDAwNTg4Mzc1OiBDbG9jayBHYXRpbmcsIFNPRiBJc3N1ZXMgd2hlbiByZWZfY2xrLUJhc2VkCisJCSAqIFNPRi9JVFAgTW9kZSBVc2VkCisJCSAqLworCQlpZiAoKGR3Yy0+ZHJfbW9kZSA9PSBVU0JfRFJfTU9ERV9IT1NUIHx8CisJCQkJZHdjLT5kcl9tb2RlID09IFVTQl9EUl9NT0RFX09URykgJiYKKwkJCQkoZHdjLT5yZXZpc2lvbiA+PSBEV0MzX1JFVklTSU9OXzIxMEEgJiYKKwkJCQlkd2MtPnJldmlzaW9uIDw9IERXQzNfUkVWSVNJT05fMjUwQSkpCisJCQlyZWcgfD0gRFdDM19HQ1RMX0RTQkxDTEtHVE5HIHwgRFdDM19HQ1RMX1NPRklUUFNZTkM7CisJCWVsc2UKKwkJCXJlZyAmPSB+RFdDM19HQ1RMX0RTQkxDTEtHVE5HOworCQlicmVhazsKKwljYXNlIERXQzNfR0hXUEFSQU1TMV9FTl9QV1JPUFRfSElCOgorCQkvKiBlbmFibGUgaGliZXJuYXRpb24gaGVyZSAqLworCQlkd2MtPm5yX3NjcmF0Y2ggPSBEV0MzX0dIV1BBUkFNUzRfSElCRVJfU0NSQVRDSEJVRlMoaHdwYXJhbXM0KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2RiZyhkd2MtPmRldiwgIk5vIHBvd2VyIG9wdGltaXphdGlvbiBhdmFpbGFibGVcbiIpOwpAQCAtMzMzLDE2ICs0NTQsMzYgQEAKIAogCWR3YzNfd3JpdGVsKGR3Yy0+cmVncywgRFdDM19HQ1RMLCByZWcpOwogCisJcmV0ID0gZHdjM19hbGxvY19zY3JhdGNoX2J1ZmZlcnMoZHdjKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjE7CisKKwlyZXQgPSBkd2MzX3NldHVwX3NjcmF0Y2hfYnVmZmVycyhkd2MpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMjsKKwogCXJldHVybiAwOwogCitlcnIyOgorCWR3YzNfZnJlZV9zY3JhdGNoX2J1ZmZlcnMoZHdjKTsKKworZXJyMToKKwl1c2JfcGh5X3NodXRkb3duKGR3Yy0+dXNiMl9waHkpOworCXVzYl9waHlfc2h1dGRvd24oZHdjLT51c2IzX3BoeSk7CisJcGh5X2V4aXQoZHdjLT51c2IyX2dlbmVyaWNfcGh5KTsKKwlwaHlfZXhpdChkd2MtPnVzYjNfZ2VuZXJpY19waHkpOworCiBlcnIwOgogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGR3YzNfY29yZV9leGl0KHN0cnVjdCBkd2MzICpkd2MpCiB7CisJZHdjM19mcmVlX3NjcmF0Y2hfYnVmZmVycyhkd2MpOwogCXVzYl9waHlfc2h1dGRvd24oZHdjLT51c2IyX3BoeSk7CiAJdXNiX3BoeV9zaHV0ZG93bihkd2MtPnVzYjNfcGh5KTsKKwlwaHlfZXhpdChkd2MtPnVzYjJfZ2VuZXJpY19waHkpOworCXBoeV9leGl0KGR3Yy0+dXNiM19nZW5lcmljX3BoeSk7CiB9CiAKICNkZWZpbmUgRFdDM19BTElHTl9NQVNLCQkoMTYgLSAxKQpAQCAtNDExLDMyICs1NTIsNTIgQEAKIAogCWlmIChJU19FUlIoZHdjLT51c2IyX3BoeSkpIHsKIAkJcmV0ID0gUFRSX0VSUihkd2MtPnVzYjJfcGh5KTsKLQotCQkvKgotCQkgKiBpZiAtRU5YSU8gaXMgcmV0dXJuZWQsIGl0IG1lYW5zIFBIWSBsYXllciB3YXNuJ3QKLQkJICogZW5hYmxlZCwgc28gaXQgbWFrZXMgbm8gc2Vuc2UgdG8gcmV0dXJuIC1FUFJPQkVfREVGRVIKLQkJICogaW4gdGhhdCBjYXNlLCBzaW5jZSBubyBQSFkgZHJpdmVyIHdpbGwgZXZlciBwcm9iZS4KLQkJICovCi0JCWlmIChyZXQgPT0gLUVOWElPKQorCQlpZiAocmV0ID09IC1FTlhJTyB8fCByZXQgPT0gLUVOT0RFVikgeworCQkJZHdjLT51c2IyX3BoeSA9IE5VTEw7CisJCX0gZWxzZSBpZiAocmV0ID09IC1FUFJPQkVfREVGRVIpIHsKIAkJCXJldHVybiByZXQ7Ci0KLQkJZGV2X2VycihkZXYsICJubyB1c2IyIHBoeSBjb25maWd1cmVkXG4iKTsKLQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKGRldiwgIm5vIHVzYjIgcGh5IGNvbmZpZ3VyZWRcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQogCX0KIAogCWlmIChJU19FUlIoZHdjLT51c2IzX3BoeSkpIHsKIAkJcmV0ID0gUFRSX0VSUihkd2MtPnVzYjNfcGh5KTsKLQotCQkvKgotCQkgKiBpZiAtRU5YSU8gaXMgcmV0dXJuZWQsIGl0IG1lYW5zIFBIWSBsYXllciB3YXNuJ3QKLQkJICogZW5hYmxlZCwgc28gaXQgbWFrZXMgbm8gc2Vuc2UgdG8gcmV0dXJuIC1FUFJPQkVfREVGRVIKLQkJICogaW4gdGhhdCBjYXNlLCBzaW5jZSBubyBQSFkgZHJpdmVyIHdpbGwgZXZlciBwcm9iZS4KLQkJICovCi0JCWlmIChyZXQgPT0gLUVOWElPKQorCQlpZiAocmV0ID09IC1FTlhJTyB8fCByZXQgPT0gLUVOT0RFVikgeworCQkJZHdjLT51c2IzX3BoeSA9IE5VTEw7CisJCX0gZWxzZSBpZiAocmV0ID09IC1FUFJPQkVfREVGRVIpIHsKIAkJCXJldHVybiByZXQ7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKGRldiwgIm5vIHVzYjMgcGh5IGNvbmZpZ3VyZWRcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KIAotCQlkZXZfZXJyKGRldiwgIm5vIHVzYjMgcGh5IGNvbmZpZ3VyZWRcbiIpOwotCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwlkd2MtPnVzYjJfZ2VuZXJpY19waHkgPSBkZXZtX3BoeV9nZXQoZGV2LCAidXNiMi1waHkiKTsKKwlpZiAoSVNfRVJSKGR3Yy0+dXNiMl9nZW5lcmljX3BoeSkpIHsKKwkJcmV0ID0gUFRSX0VSUihkd2MtPnVzYjJfZ2VuZXJpY19waHkpOworCQlpZiAocmV0ID09IC1FTk9TWVMgfHwgcmV0ID09IC1FTk9ERVYpIHsKKwkJCWR3Yy0+dXNiMl9nZW5lcmljX3BoeSA9IE5VTEw7CisJCX0gZWxzZSBpZiAocmV0ID09IC1FUFJPQkVfREVGRVIpIHsKKwkJCXJldHVybiByZXQ7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKGRldiwgIm5vIHVzYjIgcGh5IGNvbmZpZ3VyZWRcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWR3Yy0+dXNiM19nZW5lcmljX3BoeSA9IGRldm1fcGh5X2dldChkZXYsICJ1c2IzLXBoeSIpOworCWlmIChJU19FUlIoZHdjLT51c2IzX2dlbmVyaWNfcGh5KSkgeworCQlyZXQgPSBQVFJfRVJSKGR3Yy0+dXNiM19nZW5lcmljX3BoeSk7CisJCWlmIChyZXQgPT0gLUVOT1NZUyB8fCByZXQgPT0gLUVOT0RFVikgeworCQkJZHdjLT51c2IzX2dlbmVyaWNfcGh5ID0gTlVMTDsKKwkJfSBlbHNlIGlmIChyZXQgPT0gLUVQUk9CRV9ERUZFUikgeworCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoZGV2LCAibm8gdXNiMyBwaHkgY29uZmlndXJlZFxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfQogCiAJZHdjLT54aGNpX3Jlc291cmNlc1swXS5zdGFydCA9IHJlcy0+c3RhcnQ7CkBAIC00NzksNiArNjQwLDE0IEBACiAJCWdvdG8gZXJyMDsKIAl9CiAKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfVVNCX0RXQzNfSE9TVCkpCisJCWR3Yy0+ZHJfbW9kZSA9IFVTQl9EUl9NT0RFX0hPU1Q7CisJZWxzZSBpZiAoSVNfRU5BQkxFRChDT05GSUdfVVNCX0RXQzNfR0FER0VUKSkKKwkJZHdjLT5kcl9tb2RlID0gVVNCX0RSX01PREVfUEVSSVBIRVJBTDsKKworCWlmIChkd2MtPmRyX21vZGUgPT0gVVNCX0RSX01PREVfVU5LTk9XTikKKwkJZHdjLT5kcl9tb2RlID0gVVNCX0RSX01PREVfT1RHOworCiAJcmV0ID0gZHdjM19jb3JlX2luaXQoZHdjKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgY29yZVxuIik7CkBAIC00ODcsMjEgKzY1NiwyMCBAQAogCiAJdXNiX3BoeV9zZXRfc3VzcGVuZChkd2MtPnVzYjJfcGh5LCAwKTsKIAl1c2JfcGh5X3NldF9zdXNwZW5kKGR3Yy0+dXNiM19waHksIDApOworCXJldCA9IHBoeV9wb3dlcl9vbihkd2MtPnVzYjJfZ2VuZXJpY19waHkpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjE7CisKKwlyZXQgPSBwaHlfcG93ZXJfb24oZHdjLT51c2IzX2dlbmVyaWNfcGh5KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfdXNiMnBoeV9wb3dlcjsKIAogCXJldCA9IGR3YzNfZXZlbnRfYnVmZmVyc19zZXR1cChkd2MpOwogCWlmIChyZXQpIHsKIAkJZGV2X2Vycihkd2MtPmRldiwgImZhaWxlZCB0byBzZXR1cCBldmVudCBidWZmZXJzXG4iKTsKLQkJZ290byBlcnIxOworCQlnb3RvIGVycl91c2IzcGh5X3Bvd2VyOwogCX0KIAotCWlmIChJU19FTkFCTEVEKENPTkZJR19VU0JfRFdDM19IT1NUKSkKLQkJZHdjLT5kcl9tb2RlID0gVVNCX0RSX01PREVfSE9TVDsKLQllbHNlIGlmIChJU19FTkFCTEVEKENPTkZJR19VU0JfRFdDM19HQURHRVQpKQotCQlkd2MtPmRyX21vZGUgPSBVU0JfRFJfTU9ERV9QRVJJUEhFUkFMOwotCi0JaWYgKGR3Yy0+ZHJfbW9kZSA9PSBVU0JfRFJfTU9ERV9VTktOT1dOKQotCQlkd2MtPmRyX21vZGUgPSBVU0JfRFJfTU9ERV9PVEc7Ci0KIAlzd2l0Y2ggKGR3Yy0+ZHJfbW9kZSkgewogCWNhc2UgVVNCX0RSX01PREVfUEVSSVBIRVJBTDoKIAkJZHdjM19zZXRfbW9kZShkd2MsIERXQzNfR0NUTF9QUlRDQVBfREVWSUNFKTsKQEAgLTU2OCw2ICs3MzYsMTIgQEAKIGVycjI6CiAJZHdjM19ldmVudF9idWZmZXJzX2NsZWFudXAoZHdjKTsKIAorZXJyX3VzYjNwaHlfcG93ZXI6CisJcGh5X3Bvd2VyX29mZihkd2MtPnVzYjNfZ2VuZXJpY19waHkpOworCitlcnJfdXNiMnBoeV9wb3dlcjoKKwlwaHlfcG93ZXJfb2ZmKGR3Yy0+dXNiMl9nZW5lcmljX3BoeSk7CisKIGVycjE6CiAJdXNiX3BoeV9zZXRfc3VzcGVuZChkd2MtPnVzYjJfcGh5LCAxKTsKIAl1c2JfcGh5X3NldF9zdXNwZW5kKGR3Yy0+dXNiM19waHksIDEpOwpAQCAtNTg1LDYgKzc1OSw4IEBACiAKIAl1c2JfcGh5X3NldF9zdXNwZW5kKGR3Yy0+dXNiMl9waHksIDEpOwogCXVzYl9waHlfc2V0X3N1c3BlbmQoZHdjLT51c2IzX3BoeSwgMSk7CisJcGh5X3Bvd2VyX29mZihkd2MtPnVzYjJfZ2VuZXJpY19waHkpOworCXBoeV9wb3dlcl9vZmYoZHdjLT51c2IzX2dlbmVyaWNfcGh5KTsKIAogCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwpAQCAtNjgyLDYgKzg1OCw4IEBACiAKIAl1c2JfcGh5X3NodXRkb3duKGR3Yy0+dXNiM19waHkpOwogCXVzYl9waHlfc2h1dGRvd24oZHdjLT51c2IyX3BoeSk7CisJcGh5X2V4aXQoZHdjLT51c2IyX2dlbmVyaWNfcGh5KTsKKwlwaHlfZXhpdChkd2MtPnVzYjNfZ2VuZXJpY19waHkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02OTAsOSArODY4LDE3IEBACiB7CiAJc3RydWN0IGR3YzMJKmR3YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJaW50CQlyZXQ7CiAKIAl1c2JfcGh5X2luaXQoZHdjLT51c2IzX3BoeSk7CiAJdXNiX3BoeV9pbml0KGR3Yy0+dXNiMl9waHkpOworCXJldCA9IHBoeV9pbml0KGR3Yy0+dXNiMl9nZW5lcmljX3BoeSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBwaHlfaW5pdChkd2MtPnVzYjNfZ2VuZXJpY19waHkpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl91c2IycGh5X2luaXQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZHdjLT5sb2NrLCBmbGFncyk7CiAKQEAgLTcxNiw2ICs5MDIsMTEgQEAKIAlwbV9ydW50aW1lX2VuYWJsZShkZXYpOwogCiAJcmV0dXJuIDA7CisKK2Vycl91c2IycGh5X2luaXQ6CisJcGh5X2V4aXQoZHdjLT51c2IyX2dlbmVyaWNfcGh5KTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBkd2MzX2Rldl9wbV9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuaCBiL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5oCmluZGV4IGY4YWY4ZDQuLjU3MzMyZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5oCisrKyBiL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5oCkBAIC0zMSwxMSArMzEsMTQgQEAKICNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgogCisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorCiAvKiBHbG9iYWwgY29uc3RhbnRzICovCiAjZGVmaW5lIERXQzNfRVAwX0JPVU5DRV9TSVpFCTUxMgogI2RlZmluZSBEV0MzX0VORFBPSU5UU19OVU0JMzIKICNkZWZpbmUgRFdDM19YSENJX1JFU09VUkNFU19OVU0JMgogCisjZGVmaW5lIERXQzNfU0NSQVRDSEJVRl9TSVpFCTQwOTYJLyogZWFjaCBidWZmZXIgaXMgYXNzdW1lZCB0byBiZSA0S2lCICovCiAjZGVmaW5lIERXQzNfRVZFTlRfU0laRQkJNAkvKiBieXRlcyAqLwogI2RlZmluZSBEV0MzX0VWRU5UX01BWF9OVU0JNjQJLyogMiBldmVudHMvZW5kcG9pbnQgKi8KICNkZWZpbmUgRFdDM19FVkVOVF9CVUZGRVJTX1NJWkUJKERXQzNfRVZFTlRfU0laRSAqIERXQzNfRVZFTlRfTUFYX05VTSkKQEAgLTE1Nyw2ICsxNjAsNyBAQAogI2RlZmluZSBEV0MzX0dDVExfUFJUQ0FQX09URwkzCiAKICNkZWZpbmUgRFdDM19HQ1RMX0NPUkVTT0ZUUkVTRVQJCSgxIDw8IDExKQorI2RlZmluZSBEV0MzX0dDVExfU09GSVRQU1lOQwkJKDEgPDwgMTApCiAjZGVmaW5lIERXQzNfR0NUTF9TQ0FMRURPV04obikJCSgobikgPDwgNCkKICNkZWZpbmUgRFdDM19HQ1RMX1NDQUxFRE9XTl9NQVNLCURXQzNfR0NUTF9TQ0FMRURPV04oMykKICNkZWZpbmUgRFdDM19HQ1RMX0RJU1NDUkFNQkxFCQkoMSA8PCAzKQpAQCAtMzE4LDcgKzMyMiw3IEBACiAvKiBEZXZpY2UgRW5kcG9pbnQgQ29tbWFuZCBSZWdpc3RlciAqLwogI2RlZmluZSBEV0MzX0RFUENNRF9QQVJBTV9TSElGVAkJMTYKICNkZWZpbmUgRFdDM19ERVBDTURfUEFSQU0oeCkJCSgoeCkgPDwgRFdDM19ERVBDTURfUEFSQU1fU0hJRlQpCi0jZGVmaW5lIERXQzNfREVQQ01EX0dFVF9SU0NfSURYKHgpICAgICAoKCh4KSA+PiBEV0MzX0RFUENNRF9QQVJBTV9TSElGVCkgJiAweDdmKQorI2RlZmluZSBEV0MzX0RFUENNRF9HRVRfUlNDX0lEWCh4KQkoKCh4KSA+PiBEV0MzX0RFUENNRF9QQVJBTV9TSElGVCkgJiAweDdmKQogI2RlZmluZSBEV0MzX0RFUENNRF9TVEFUVVMoeCkJCSgoKHgpID4+IDE1KSAmIDEpCiAjZGVmaW5lIERXQzNfREVQQ01EX0hJUFJJX0ZPUkNFUk0JKDEgPDwgMTEpCiAjZGVmaW5lIERXQzNfREVQQ01EX0NNREFDVAkJKDEgPDwgMTApCkBAIC0zOTMsNiArMzk3LDcgQEAKICAqIEBidXN5X3Nsb3Q6IGZpcnN0IHNsb3Qgd2hpY2ggaXMgb3duZWQgYnkgSFcKICAqIEBkZXNjOiB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBwb2ludGVyCiAgKiBAZHdjOiBwb2ludGVyIHRvIERXQyBjb250cm9sbGVyCisgKiBAc2F2ZWRfc3RhdGU6IGVwIHN0YXRlIHNhdmVkIGR1cmluZyBoaWJlcm5hdGlvbgogICogQGZsYWdzOiBlbmRwb2ludCBmbGFncyAod2VkZ2VkLCBzdGFsbGVkLCAuLi4pCiAgKiBAY3VycmVudF90cmI6IGluZGV4IG9mIGN1cnJlbnQgdXNlZCB0cmIKICAqIEBudW1iZXI6IGVuZHBvaW50IG51bWJlciAoMSAtIDE1KQpAQCAtNDE1LDYgKzQyMCw3IEBACiAJY29uc3Qgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3IgKmNvbXBfZGVzYzsKIAlzdHJ1Y3QgZHdjMwkJKmR3YzsKIAorCXUzMgkJCXNhdmVkX3N0YXRlOwogCXVuc2lnbmVkCQlmbGFnczsKICNkZWZpbmUgRFdDM19FUF9FTkFCTEVECQkoMSA8PCAwKQogI2RlZmluZSBEV0MzX0VQX1NUQUxMCQkoMSA8PCAxKQpAQCAtNTk4LDYgKzYwNCw3IEBACiAgKiBAZXAwX3RyYjogZG1hIGFkZHJlc3Mgb2YgZXAwX3RyYgogICogQGVwMF91c2JfcmVxOiBkdW1teSByZXEgdXNlZCB3aGlsZSBoYW5kbGluZyBTVEQgVVNCIHJlcXVlc3RzCiAgKiBAZXAwX2JvdW5jZV9hZGRyOiBkbWEgYWRkcmVzcyBvZiBlcDBfYm91bmNlCisgKiBAc2NyYXRjaF9hZGRyOiBkbWEgYWRkcmVzcyBvZiBzY3JhdGNoYnVmCiAgKiBAbG9jazogZm9yIHN5bmNocm9uaXppbmcKICAqIEBkZXY6IHBvaW50ZXIgdG8gb3VyIHN0cnVjdCBkZXZpY2UKICAqIEB4aGNpOiBwb2ludGVyIHRvIG91ciB4SENJIGNoaWxkCkBAIC02MDYsNiArNjEzLDcgQEAKICAqIEBnYWRnZXRfZHJpdmVyOiBwb2ludGVyIHRvIHRoZSBnYWRnZXQgZHJpdmVyCiAgKiBAcmVnczogYmFzZSBhZGRyZXNzIGZvciBvdXIgcmVnaXN0ZXJzCiAgKiBAcmVnc19zaXplOiBhZGRyZXNzIHNwYWNlIHNpemUKKyAqIEBucl9zY3JhdGNoOiBudW1iZXIgb2Ygc2NyYXRjaCBidWZmZXJzCiAgKiBAbnVtX2V2ZW50X2J1ZmZlcnM6IGNhbGN1bGF0ZWQgbnVtYmVyIG9mIGV2ZW50IGJ1ZmZlcnMKICAqIEB1MXUyOiBvbmx5IHVzZWQgb24gcmV2aXNpb25zIDwxLjgzYSBmb3Igd29ya2Fyb3VuZAogICogQG1heGltdW1fc3BlZWQ6IG1heGltdW0gc3BlZWQgcmVxdWVzdGVkIChtYWlubHkgZm9yIHRlc3RpbmcgcHVycG9zZXMpCkBAIC02MTMsMTYgKzYyMSwxMCBAQAogICogQGRyX21vZGU6IHJlcXVlc3RlZCBtb2RlIG9mIG9wZXJhdGlvbgogICogQHVzYjJfcGh5OiBwb2ludGVyIHRvIFVTQjIgUEhZCiAgKiBAdXNiM19waHk6IHBvaW50ZXIgdG8gVVNCMyBQSFkKKyAqIEB1c2IyX2dlbmVyaWNfcGh5OiBwb2ludGVyIHRvIFVTQjIgUEhZCisgKiBAdXNiM19nZW5lcmljX3BoeTogcG9pbnRlciB0byBVU0IzIFBIWQogICogQGRjZmc6IHNhdmVkIGNvbnRlbnRzIG9mIERDRkcgcmVnaXN0ZXIKICAqIEBnY3RsOiBzYXZlZCBjb250ZW50cyBvZiBHQ1RMIHJlZ2lzdGVyCi0gKiBAaXNfc2VsZnBvd2VyZWQ6IHRydWUgd2hlbiB3ZSBhcmUgc2VsZnBvd2VyZWQKLSAqIEB0aHJlZV9zdGFnZV9zZXR1cDogc2V0IGlmIHdlIHBlcmZvcm0gYSB0aHJlZSBwaGFzZSBzZXR1cAotICogQGVwMF9ib3VuY2VkOiB0cnVlIHdoZW4gd2UgdXNlZCBib3VuY2UgYnVmZmVyCi0gKiBAZXAwX2V4cGVjdF9pbjogdHJ1ZSB3aGVuIHdlIGV4cGVjdCBhIERBVEEgSU4gdHJhbnNmZXIKLSAqIEBzdGFydF9jb25maWdfaXNzdWVkOiB0cnVlIHdoZW4gU3RhcnRDb25maWcgY29tbWFuZCBoYXMgYmVlbiBpc3N1ZWQKLSAqIEBzZXR1cF9wYWNrZXRfcGVuZGluZzogdHJ1ZSB3aGVuIHRoZXJlJ3MgYSBTZXR1cCBQYWNrZXQgaW4gRklGTy4gV29ya2Fyb3VuZAotICogQG5lZWRzX2ZpZm9fcmVzaXplOiBub3QgYWxsIHVzZXJzIG1pZ2h0IHdhbnQgZmlmbyByZXNpemluZywgZmxhZyBpdAotICogQHJlc2l6ZV9maWZvczogdGVsbHMgdXMgaXQncyBvayB0byByZWNvbmZpZ3VyZSBvdXIgVHhGSUZPIHNpemVzLgogICogQGlzb2NoX2RlbGF5OiB3VmFsdWUgZnJvbSBTZXQgSXNvY2hyb25vdXMgRGVsYXkgcmVxdWVzdDsKICAqIEB1MnNlbDogcGFyYW1ldGVyIGZyb20gU2V0IFNFTCByZXF1ZXN0LgogICogQHUycGVsOiBwYXJhbWV0ZXIgZnJvbSBTZXQgU0VMIHJlcXVlc3QuCkBAIC02MzcsMTUgKzYzOSwzMSBAQAogICogQG1lbTogcG9pbnRzIHRvIHN0YXJ0IG9mIG1lbW9yeSB3aGljaCBpcyB1c2VkIGZvciB0aGlzIHN0cnVjdC4KICAqIEBod3BhcmFtczogY29weSBvZiBod3BhcmFtcyByZWdpc3RlcnMKICAqIEByb290OiBkZWJ1Z2ZzIHJvb3QgZm9sZGVyIHBvaW50ZXIKKyAqIEByZWdzZXQ6IGRlYnVnZnMgcG9pbnRlciB0byByZWdkdW1wIGZpbGUKKyAqIEB0ZXN0X21vZGU6IHRydWUgd2hlbiB3ZSdyZSBlbnRlcmluZyBhIFVTQiB0ZXN0IG1vZGUKKyAqIEB0ZXN0X21vZGVfbnI6IHRlc3QgZmVhdHVyZSBzZWxlY3RvcgorICogQGRlbGF5ZWRfc3RhdHVzOiB0cnVlIHdoZW4gZ2FkZ2V0IGRyaXZlciBhc2tzIGZvciBkZWxheWVkIHN0YXR1cworICogQGVwMF9ib3VuY2VkOiB0cnVlIHdoZW4gd2UgdXNlZCBib3VuY2UgYnVmZmVyCisgKiBAZXAwX2V4cGVjdF9pbjogdHJ1ZSB3aGVuIHdlIGV4cGVjdCBhIERBVEEgSU4gdHJhbnNmZXIKKyAqIEBoYXNfaGliZXJuYXRpb246IHRydWUgd2hlbiBkd2MzIHdhcyBjb25maWd1cmVkIHdpdGggSGliZXJuYXRpb24KKyAqIEBpc19zZWxmcG93ZXJlZDogdHJ1ZSB3aGVuIHdlIGFyZSBzZWxmcG93ZXJlZAorICogQG5lZWRzX2ZpZm9fcmVzaXplOiBub3QgYWxsIHVzZXJzIG1pZ2h0IHdhbnQgZmlmbyByZXNpemluZywgZmxhZyBpdAorICogQHB1bGx1cHNfY29ubmVjdGVkOiB0cnVlIHdoZW4gUnVuL1N0b3AgYml0IGlzIHNldAorICogQHJlc2l6ZV9maWZvczogdGVsbHMgdXMgaXQncyBvayB0byByZWNvbmZpZ3VyZSBvdXIgVHhGSUZPIHNpemVzLgorICogQHNldHVwX3BhY2tldF9wZW5kaW5nOiB0cnVlIHdoZW4gdGhlcmUncyBhIFNldHVwIFBhY2tldCBpbiBGSUZPLiBXb3JrYXJvdW5kCisgKiBAc3RhcnRfY29uZmlnX2lzc3VlZDogdHJ1ZSB3aGVuIFN0YXJ0Q29uZmlnIGNvbW1hbmQgaGFzIGJlZW4gaXNzdWVkCisgKiBAdGhyZWVfc3RhZ2Vfc2V0dXA6IHNldCBpZiB3ZSBwZXJmb3JtIGEgdGhyZWUgcGhhc2Ugc2V0dXAKICAqLwogc3RydWN0IGR3YzMgewogCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QJKmN0cmxfcmVxOwogCXN0cnVjdCBkd2MzX3RyYgkJKmVwMF90cmI7CiAJdm9pZAkJCSplcDBfYm91bmNlOworCXZvaWQJCQkqc2NyYXRjaGJ1ZjsKIAl1OAkJCSpzZXR1cF9idWY7CiAJZG1hX2FkZHJfdAkJY3RybF9yZXFfYWRkcjsKIAlkbWFfYWRkcl90CQllcDBfdHJiX2FkZHI7CiAJZG1hX2FkZHJfdAkJZXAwX2JvdW5jZV9hZGRyOworCWRtYV9hZGRyX3QJCXNjcmF0Y2hfYWRkcjsKIAlzdHJ1Y3QgZHdjM19yZXF1ZXN0CWVwMF91c2JfcmVxOwogCiAJLyogZGV2aWNlIGxvY2sgKi8KQEAgLTY2NSw2ICs2ODMsOSBAQAogCXN0cnVjdCB1c2JfcGh5CQkqdXNiMl9waHk7CiAJc3RydWN0IHVzYl9waHkJCSp1c2IzX3BoeTsKIAorCXN0cnVjdCBwaHkJCSp1c2IyX2dlbmVyaWNfcGh5OworCXN0cnVjdCBwaHkJCSp1c2IzX2dlbmVyaWNfcGh5OworCiAJdm9pZCBfX2lvbWVtCQkqcmVnczsKIAlzaXplX3QJCQlyZWdzX3NpemU7CiAKQEAgLTY3NCw2ICs2OTUsNyBAQAogCXUzMgkJCWRjZmc7CiAJdTMyCQkJZ2N0bDsKIAorCXUzMgkJCW5yX3NjcmF0Y2g7CiAJdTMyCQkJbnVtX2V2ZW50X2J1ZmZlcnM7CiAJdTMyCQkJdTF1MjsKIAl1MzIJCQltYXhpbXVtX3NwZWVkOwpAQCAtNjk1LDE3ICs3MTcsOSBAQAogI2RlZmluZSBEV0MzX1JFVklTSU9OXzIzMEEJMHg1NTMzMjMwYQogI2RlZmluZSBEV0MzX1JFVklTSU9OXzI0MEEJMHg1NTMzMjQwYQogI2RlZmluZSBEV0MzX1JFVklTSU9OXzI1MEEJMHg1NTMzMjUwYQotCi0JdW5zaWduZWQJCWlzX3NlbGZwb3dlcmVkOjE7Ci0JdW5zaWduZWQJCXRocmVlX3N0YWdlX3NldHVwOjE7Ci0JdW5zaWduZWQJCWVwMF9ib3VuY2VkOjE7Ci0JdW5zaWduZWQJCWVwMF9leHBlY3RfaW46MTsKLQl1bnNpZ25lZAkJc3RhcnRfY29uZmlnX2lzc3VlZDoxOwotCXVuc2lnbmVkCQlzZXR1cF9wYWNrZXRfcGVuZGluZzoxOwotCXVuc2lnbmVkCQlkZWxheWVkX3N0YXR1czoxOwotCXVuc2lnbmVkCQluZWVkc19maWZvX3Jlc2l6ZToxOwotCXVuc2lnbmVkCQlyZXNpemVfZmlmb3M6MTsKLQl1bnNpZ25lZAkJcHVsbHVwc19jb25uZWN0ZWQ6MTsKKyNkZWZpbmUgRFdDM19SRVZJU0lPTl8yNjBBCTB4NTUzMzI2MGEKKyNkZWZpbmUgRFdDM19SRVZJU0lPTl8yNzBBCTB4NTUzMzI3MGEKKyNkZWZpbmUgRFdDM19SRVZJU0lPTl8yODBBCTB4NTUzMzI4MGEKIAogCWVudW0gZHdjM19lcDBfbmV4dAllcDBfbmV4dF9ldmVudDsKIAllbnVtIGR3YzNfZXAwX3N0YXRlCWVwMHN0YXRlOwpAQCAtNzMwLDYgKzc0NCwxOCBAQAogCiAJdTgJCQl0ZXN0X21vZGU7CiAJdTgJCQl0ZXN0X21vZGVfbnI7CisKKwl1bnNpZ25lZAkJZGVsYXllZF9zdGF0dXM6MTsKKwl1bnNpZ25lZAkJZXAwX2JvdW5jZWQ6MTsKKwl1bnNpZ25lZAkJZXAwX2V4cGVjdF9pbjoxOworCXVuc2lnbmVkCQloYXNfaGliZXJuYXRpb246MTsKKwl1bnNpZ25lZAkJaXNfc2VsZnBvd2VyZWQ6MTsKKwl1bnNpZ25lZAkJbmVlZHNfZmlmb19yZXNpemU6MTsKKwl1bnNpZ25lZAkJcHVsbHVwc19jb25uZWN0ZWQ6MTsKKwl1bnNpZ25lZAkJcmVzaXplX2ZpZm9zOjE7CisJdW5zaWduZWQJCXNldHVwX3BhY2tldF9wZW5kaW5nOjE7CisJdW5zaWduZWQJCXN0YXJ0X2NvbmZpZ19pc3N1ZWQ6MTsKKwl1bnNpZ25lZAkJdGhyZWVfc3RhZ2Vfc2V0dXA6MTsKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC04MTUsMTUgKzg0MSwxNSBAQAogICoJMTIJLSBWbmRyRGV2VHN0UmN2ZWQKICAqIEByZXNlcnZlZDE1XzEyOiBSZXNlcnZlZCwgbm90IHVzZWQKICAqIEBldmVudF9pbmZvOiBJbmZvcm1hdGlvbiBhYm91dCB0aGlzIGV2ZW50Ci0gKiBAcmVzZXJ2ZWQzMV8yNDogUmVzZXJ2ZWQsIG5vdCB1c2VkCisgKiBAcmVzZXJ2ZWQzMV8yNTogUmVzZXJ2ZWQsIG5vdCB1c2VkCiAgKi8KIHN0cnVjdCBkd2MzX2V2ZW50X2RldnQgewogCXUzMglvbmVfYml0OjE7CiAJdTMyCWRldmljZV9ldmVudDo3OwogCXUzMgl0eXBlOjQ7CiAJdTMyCXJlc2VydmVkMTVfMTI6NDsKLQl1MzIJZXZlbnRfaW5mbzo4OwotCXUzMglyZXNlcnZlZDMxXzI0Ojg7CisJdTMyCWV2ZW50X2luZm86OTsKKwl1MzIJcmVzZXJ2ZWQzMV8yNTo3OwogfSBfX3BhY2tlZDsKIAogLyoqCkBAIC04NTYsNiArODgyLDE5IEBACiAJc3RydWN0IGR3YzNfZXZlbnRfZ2V2dAkJZ2V2dDsKIH07CiAKKy8qKgorICogc3RydWN0IGR3YzNfZ2FkZ2V0X2VwX2NtZF9wYXJhbXMgLSByZXByZXNlbnRhdGlvbiBvZiBlbmRwb2ludCBjb21tYW5kCisgKiBwYXJhbWV0ZXJzCisgKiBAcGFyYW0yOiB0aGlyZCBwYXJhbWV0ZXIKKyAqIEBwYXJhbTE6IHNlY29uZCBwYXJhbWV0ZXIKKyAqIEBwYXJhbTA6IGZpcnN0IHBhcmFtZXRlcgorICovCitzdHJ1Y3QgZHdjM19nYWRnZXRfZXBfY21kX3BhcmFtcyB7CisJdTMyCXBhcmFtMjsKKwl1MzIJcGFyYW0xOworCXUzMglwYXJhbTA7Cit9OworCiAvKgogICogRFdDMyBGZWF0dXJlcyB0byBiZSB1c2VkIGFzIERyaXZlciBEYXRhCiAgKi8KQEAgLTg4MSwxMSArOTIwLDMxIEBACiAjaWYgSVNfRU5BQkxFRChDT05GSUdfVVNCX0RXQzNfR0FER0VUKSB8fCBJU19FTkFCTEVEKENPTkZJR19VU0JfRFdDM19EVUFMX1JPTEUpCiBpbnQgZHdjM19nYWRnZXRfaW5pdChzdHJ1Y3QgZHdjMyAqZHdjKTsKIHZvaWQgZHdjM19nYWRnZXRfZXhpdChzdHJ1Y3QgZHdjMyAqZHdjKTsKK2ludCBkd2MzX2dhZGdldF9zZXRfdGVzdF9tb2RlKHN0cnVjdCBkd2MzICpkd2MsIGludCBtb2RlKTsKK2ludCBkd2MzX2dhZGdldF9nZXRfbGlua19zdGF0ZShzdHJ1Y3QgZHdjMyAqZHdjKTsKK2ludCBkd2MzX2dhZGdldF9zZXRfbGlua19zdGF0ZShzdHJ1Y3QgZHdjMyAqZHdjLCBlbnVtIGR3YzNfbGlua19zdGF0ZSBzdGF0ZSk7CitpbnQgZHdjM19zZW5kX2dhZGdldF9lcF9jbWQoc3RydWN0IGR3YzMgKmR3YywgdW5zaWduZWQgZXAsCisJCXVuc2lnbmVkIGNtZCwgc3RydWN0IGR3YzNfZ2FkZ2V0X2VwX2NtZF9wYXJhbXMgKnBhcmFtcyk7CitpbnQgZHdjM19zZW5kX2dhZGdldF9nZW5lcmljX2NvbW1hbmQoc3RydWN0IGR3YzMgKmR3YywgaW50IGNtZCwgdTMyIHBhcmFtKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBkd2MzX2dhZGdldF9pbml0KHN0cnVjdCBkd2MzICpkd2MpCiB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgZHdjM19nYWRnZXRfZXhpdChzdHJ1Y3QgZHdjMyAqZHdjKQogeyB9CitzdGF0aWMgaW5saW5lIGludCBkd2MzX2dhZGdldF9zZXRfdGVzdF9tb2RlKHN0cnVjdCBkd2MzICpkd2MsIGludCBtb2RlKQoreyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgZHdjM19nYWRnZXRfZ2V0X2xpbmtfc3RhdGUoc3RydWN0IGR3YzMgKmR3YykKK3sgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGR3YzNfZ2FkZ2V0X3NldF9saW5rX3N0YXRlKHN0cnVjdCBkd2MzICpkd2MsCisJCWVudW0gZHdjM19saW5rX3N0YXRlIHN0YXRlKQoreyByZXR1cm4gMDsgfQorCitzdGF0aWMgaW5saW5lIGludCBkd2MzX3NlbmRfZ2FkZ2V0X2VwX2NtZChzdHJ1Y3QgZHdjMyAqZHdjLCB1bnNpZ25lZCBlcCwKKwkJdW5zaWduZWQgY21kLCBzdHJ1Y3QgZHdjM19nYWRnZXRfZXBfY21kX3BhcmFtcyAqcGFyYW1zKQoreyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgZHdjM19zZW5kX2dhZGdldF9nZW5lcmljX2NvbW1hbmQoc3RydWN0IGR3YzMgKmR3YywKKwkJaW50IGNtZCwgdTMyIHBhcmFtKQoreyByZXR1cm4gMDsgfQogI2VuZGlmCiAKIC8qIHBvd2VyIG1hbmFnZW1lbnQgaW50ZXJmYWNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtb21hcC5jIGIvZHJpdmVycy91c2IvZHdjMy9kd2MzLW9tYXAuYwppbmRleCBiMjY5ZGJkLi4xMTYwZmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtb21hcC5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1vbWFwLmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvZXh0Y29uLmg+Ci0jaW5jbHVkZSA8bGludXgvZXh0Y29uL29mX2V4dGNvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogCiAjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgpAQCAtNDI0LDExICs0MjMsNiBAQAogCX0KIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyZXMpIHsKLQkJZGV2X2VycihkZXYsICJtaXNzaW5nIG1lbW9yeSBiYXNlIHJlc291cmNlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CiAJaWYgKElTX0VSUihiYXNlKSkKIAkJcmV0dXJuIFBUUl9FUlIoYmFzZSk7CkBAIC01MjIsNyArNTE2LDcgQEAKIAlkd2MzX29tYXBfZW5hYmxlX2lycXMob21hcCk7CiAKIAlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5vZGUsICJleHRjb24iKSkgewotCQllZGV2ID0gb2ZfZXh0Y29uX2dldF9leHRjb25fZGV2KGRldiwgMCk7CisJCWVkZXYgPSBleHRjb25fZ2V0X2VkZXZfYnlfcGhhbmRsZShkZXYsIDApOwogCQlpZiAoSVNfRVJSKGVkZXYpKSB7CiAJCQlkZXZfdmRiZyhkZXYsICJjb3VsZG4ndCBnZXQgZXh0Y29uIGRldmljZVxuIik7CiAJCQlyZXQgPSAtRVBST0JFX0RFRkVSOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9nYWRnZXQuYyBiL2RyaXZlcnMvdXNiL2R3YzMvZ2FkZ2V0LmMKaW5kZXggMmRhMGE1YS4uYTc0MGVhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMy9nYWRnZXQuYworKysgYi9kcml2ZXJzL3VzYi9kd2MzL2dhZGdldC5jCkBAIC02OCw2ICs2OCwyMiBAQAogfQogCiAvKioKKyAqIGR3YzNfZ2FkZ2V0X2dldF9saW5rX3N0YXRlIC0gR2V0cyBjdXJyZW50IHN0YXRlIG9mIFVTQiBMaW5rCisgKiBAZHdjOiBwb2ludGVyIHRvIG91ciBjb250ZXh0IHN0cnVjdHVyZQorICoKKyAqIENhbGxlciBzaG91bGQgdGFrZSBjYXJlIG9mIGxvY2tpbmcuIFRoaXMgZnVuY3Rpb24gd2lsbAorICogcmV0dXJuIHRoZSBsaW5rIHN0YXRlIG9uIHN1Y2Nlc3MgKD49IDApIG9yIC1FVElNRURPVVQuCisgKi8KK2ludCBkd2MzX2dhZGdldF9nZXRfbGlua19zdGF0ZShzdHJ1Y3QgZHdjMyAqZHdjKQoreworCXUzMgkJcmVnOworCisJcmVnID0gZHdjM19yZWFkbChkd2MtPnJlZ3MsIERXQzNfRFNUUyk7CisKKwlyZXR1cm4gRFdDM19EU1RTX1VTQkxOS1NUKHJlZyk7Cit9CisKKy8qKgogICogZHdjM19nYWRnZXRfc2V0X2xpbmtfc3RhdGUgLSBTZXRzIFVTQiBMaW5rIHRvIGEgcGFydGljdWxhciBTdGF0ZQogICogQGR3YzogcG9pbnRlciB0byBvdXIgY29udGV4dCBzdHJ1Y3R1cmUKICAqIEBzdGF0ZTogdGhlIHN0YXRlIHRvIHB1dCBsaW5rIGludG8KQEAgLTQxNyw3ICs0MzMsNyBAQAogc3RhdGljIGludCBkd2MzX2dhZGdldF9zZXRfZXBfY29uZmlnKHN0cnVjdCBkd2MzICpkd2MsIHN0cnVjdCBkd2MzX2VwICpkZXAsCiAJCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYywKIAkJY29uc3Qgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3IgKmNvbXBfZGVzYywKLQkJYm9vbCBpZ25vcmUpCisJCWJvb2wgaWdub3JlLCBib29sIHJlc3RvcmUpCiB7CiAJc3RydWN0IGR3YzNfZ2FkZ2V0X2VwX2NtZF9wYXJhbXMgcGFyYW1zOwogCkBAIC00MzYsNiArNDUyLDExIEBACiAJaWYgKGlnbm9yZSkKIAkJcGFyYW1zLnBhcmFtMCB8PSBEV0MzX0RFUENGR19JR05fU0VRX05VTTsKIAorCWlmIChyZXN0b3JlKSB7CisJCXBhcmFtcy5wYXJhbTAgfD0gRFdDM19ERVBDRkdfQUNUSU9OX1JFU1RPUkU7CisJCXBhcmFtcy5wYXJhbTIgfD0gZGVwLT5zYXZlZF9zdGF0ZTsKKwl9CisKIAlwYXJhbXMucGFyYW0xID0gRFdDM19ERVBDRkdfWEZFUl9DT01QTEVURV9FTgogCQl8IERXQzNfREVQQ0ZHX1hGRVJfTk9UX1JFQURZX0VOOwogCkBAIC00OTQsNyArNTE1LDcgQEAKIHN0YXRpYyBpbnQgX19kd2MzX2dhZGdldF9lcF9lbmFibGUoc3RydWN0IGR3YzNfZXAgKmRlcCwKIAkJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjLAogCQljb25zdCBzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciAqY29tcF9kZXNjLAotCQlib29sIGlnbm9yZSkKKwkJYm9vbCBpZ25vcmUsIGJvb2wgcmVzdG9yZSkKIHsKIAlzdHJ1Y3QgZHdjMwkJKmR3YyA9IGRlcC0+ZHdjOwogCXUzMgkJCXJlZzsKQEAgLTUwOCw3ICs1MjksOCBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBkd2MzX2dhZGdldF9zZXRfZXBfY29uZmlnKGR3YywgZGVwLCBkZXNjLCBjb21wX2Rlc2MsIGlnbm9yZSk7CisJcmV0ID0gZHdjM19nYWRnZXRfc2V0X2VwX2NvbmZpZyhkd2MsIGRlcCwgZGVzYywgY29tcF9kZXNjLCBpZ25vcmUsCisJCQlyZXN0b3JlKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC01NDgsMTMgKzU3MCwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBkd2MzX3N0b3BfYWN0aXZlX3RyYW5zZmVyKHN0cnVjdCBkd2MzICpkd2MsIHUzMiBlcG51bSk7CitzdGF0aWMgdm9pZCBkd2MzX3N0b3BfYWN0aXZlX3RyYW5zZmVyKHN0cnVjdCBkd2MzICpkd2MsIHUzMiBlcG51bSwgYm9vbCBmb3JjZSk7CiBzdGF0aWMgdm9pZCBkd2MzX3JlbW92ZV9yZXF1ZXN0cyhzdHJ1Y3QgZHdjMyAqZHdjLCBzdHJ1Y3QgZHdjM19lcCAqZGVwKQogewogCXN0cnVjdCBkd2MzX3JlcXVlc3QJCSpyZXE7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJmRlcC0+cmVxX3F1ZXVlZCkpIHsKLQkJZHdjM19zdG9wX2FjdGl2ZV90cmFuc2Zlcihkd2MsIGRlcC0+bnVtYmVyKTsKKwkJZHdjM19zdG9wX2FjdGl2ZV90cmFuc2Zlcihkd2MsIGRlcC0+bnVtYmVyLCB0cnVlKTsKIAogCQkvKiAtIGdpdmViYWNrIGFsbCByZXF1ZXN0cyB0byBnYWRnZXQgZHJpdmVyICovCiAJCXdoaWxlICghbGlzdF9lbXB0eSgmZGVwLT5yZXFfcXVldWVkKSkgewpAQCAtNjU5LDcgKzY4MSw3IEBACiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmR3Yy0+bG9jaywgZmxhZ3MpOwotCXJldCA9IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKGRlcCwgZGVzYywgZXAtPmNvbXBfZGVzYywgZmFsc2UpOworCXJldCA9IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKGRlcCwgZGVzYywgZXAtPmNvbXBfZGVzYywgZmFsc2UsIGZhbHNlKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkd2MtPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CkBAIC03NzEsOSArNzkzLDYgQEAKIAkJCXRyYi0+Y3RybCA9IERXQzNfVFJCQ1RMX0lTT0NIUk9OT1VTX0ZJUlNUOwogCQllbHNlCiAJCQl0cmItPmN0cmwgPSBEV0MzX1RSQkNUTF9JU09DSFJPTk9VUzsKLQotCQlpZiAoIXJlcS0+cmVxdWVzdC5ub19pbnRlcnJ1cHQgJiYgIWNoYWluKQotCQkJdHJiLT5jdHJsIHw9IERXQzNfVFJCX0NUUkxfSU9DOwogCQlicmVhazsKIAogCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfQlVMSzoKQEAgLTc4OCw2ICs4MDcsOSBAQAogCQlCVUcoKTsKIAl9CiAKKwlpZiAoIXJlcS0+cmVxdWVzdC5ub19pbnRlcnJ1cHQgJiYgIWNoYWluKQorCQl0cmItPmN0cmwgfD0gRFdDM19UUkJfQ1RSTF9JT0M7CisKIAlpZiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXAtPmVuZHBvaW50LmRlc2MpKSB7CiAJCXRyYi0+Y3RybCB8PSBEV0MzX1RSQl9DVFJMX0lTUF9JTUk7CiAJCXRyYi0+Y3RybCB8PSBEV0MzX1RSQl9DVFJMX0NTUDsKQEAgLTEwNzcsNyArMTA5OSw3IEBACiAJCSAqLwogCQlpZiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXAtPmVuZHBvaW50LmRlc2MpKSB7CiAJCQlpZiAobGlzdF9lbXB0eSgmZGVwLT5yZXFfcXVldWVkKSkgewotCQkJCWR3YzNfc3RvcF9hY3RpdmVfdHJhbnNmZXIoZHdjLCBkZXAtPm51bWJlcik7CisJCQkJZHdjM19zdG9wX2FjdGl2ZV90cmFuc2Zlcihkd2MsIGRlcC0+bnVtYmVyLCB0cnVlKTsKIAkJCQlkZXAtPmZsYWdzID0gRFdDM19FUF9FTkFCTEVEOwogCQkJfQogCQkJcmV0dXJuIDA7CkBAIC0xMTA3LDYgKzExMjksMjMgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKKwkvKgorCSAqIDQuIFN0cmVhbSBDYXBhYmxlIEJ1bGsgRW5kcG9pbnRzLiBXZSBuZWVkIHRvIHN0YXJ0IHRoZSB0cmFuc2ZlcgorCSAqIHJpZ2h0IGF3YXksIG90aGVyd2lzZSBob3N0IHdpbGwgbm90IGtub3cgd2UgaGF2ZSBzdHJlYW1zIHRvIGJlCisJICogaGFuZGxlZC4KKwkgKi8KKwlpZiAoZGVwLT5zdHJlYW1fY2FwYWJsZSkgeworCQlpbnQJcmV0OworCisJCXJldCA9IF9fZHdjM19nYWRnZXRfa2lja190cmFuc2ZlcihkZXAsIDAsIHRydWUpOworCQlpZiAocmV0ICYmIHJldCAhPSAtRUJVU1kpIHsKKwkJCXN0cnVjdCBkd2MzCSpkd2MgPSBkZXAtPmR3YzsKKworCQkJZGV2X2RiZyhkd2MtPmRldiwgIiVzOiBmYWlsZWQgdG8ga2ljayB0cmFuc2ZlcnNcbiIsCisJCQkJCWRlcC0+bmFtZSk7CisJCX0KKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE2Myw3ICsxMjAyLDcgQEAKIAkJfQogCQlpZiAociA9PSByZXEpIHsKIAkJCS8qIHdhaXQgdW50aWwgaXQgaXMgcHJvY2Vzc2VkICovCi0JCQlkd2MzX3N0b3BfYWN0aXZlX3RyYW5zZmVyKGR3YywgZGVwLT5udW1iZXIpOworCQkJZHdjM19zdG9wX2FjdGl2ZV90cmFuc2Zlcihkd2MsIGRlcC0+bnVtYmVyLCB0cnVlKTsKIAkJCWdvdG8gb3V0MTsKIAkJfQogCQlkZXZfZXJyKGR3Yy0+ZGV2LCAicmVxdWVzdCAlcCB3YXMgbm90IHF1ZXVlZCB0byAlc1xuIiwKQEAgLTExOTQsOCArMTIzMyw3IEBACiAJCXJldCA9IGR3YzNfc2VuZF9nYWRnZXRfZXBfY21kKGR3YywgZGVwLT5udW1iZXIsCiAJCQlEV0MzX0RFUENNRF9TRVRTVEFMTCwgJnBhcmFtcyk7CiAJCWlmIChyZXQpCi0JCQlkZXZfZXJyKGR3Yy0+ZGV2LCAiZmFpbGVkIHRvICVzIFNUQUxMIG9uICVzXG4iLAotCQkJCQl2YWx1ZSA/ICJzZXQiIDogImNsZWFyIiwKKwkJCWRldl9lcnIoZHdjLT5kZXYsICJmYWlsZWQgdG8gc2V0IFNUQUxMIG9uICVzXG4iLAogCQkJCQlkZXAtPm5hbWUpOwogCQllbHNlCiAJCQlkZXAtPmZsYWdzIHw9IERXQzNfRVBfU1RBTEw7CkBAIC0xMjAzLDggKzEyNDEsNyBAQAogCQlyZXQgPSBkd2MzX3NlbmRfZ2FkZ2V0X2VwX2NtZChkd2MsIGRlcC0+bnVtYmVyLAogCQkJRFdDM19ERVBDTURfQ0xFQVJTVEFMTCwgJnBhcmFtcyk7CiAJCWlmIChyZXQpCi0JCQlkZXZfZXJyKGR3Yy0+ZGV2LCAiZmFpbGVkIHRvICVzIFNUQUxMIG9uICVzXG4iLAotCQkJCQl2YWx1ZSA/ICJzZXQiIDogImNsZWFyIiwKKwkJCWRldl9lcnIoZHdjLT5kZXYsICJmYWlsZWQgdG8gY2xlYXIgU1RBTEwgb24gJXNcbiIsCiAJCQkJCWRlcC0+bmFtZSk7CiAJCWVsc2UKIAkJCWRlcC0+ZmxhZ3MgJj0gfihEV0MzX0VQX1NUQUxMIHwgRFdDM19FUF9XRURHRSk7CkBAIC0xMzg3LDcgKzE0MjQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGR3YzNfZ2FkZ2V0X3J1bl9zdG9wKHN0cnVjdCBkd2MzICpkd2MsIGludCBpc19vbikKK3N0YXRpYyBpbnQgZHdjM19nYWRnZXRfcnVuX3N0b3Aoc3RydWN0IGR3YzMgKmR3YywgaW50IGlzX29uLCBpbnQgc3VzcGVuZCkKIHsKIAl1MzIJCQlyZWc7CiAJdTMyCQkJdGltZW91dCA9IDUwMDsKQEAgLTE0MDIsOSArMTQzOSwxNyBAQAogCQlpZiAoZHdjLT5yZXZpc2lvbiA+PSBEV0MzX1JFVklTSU9OXzE5NEEpCiAJCQlyZWcgJj0gfkRXQzNfRENUTF9LRUVQX0NPTk5FQ1Q7CiAJCXJlZyB8PSBEV0MzX0RDVExfUlVOX1NUT1A7CisKKwkJaWYgKGR3Yy0+aGFzX2hpYmVybmF0aW9uKQorCQkJcmVnIHw9IERXQzNfRENUTF9LRUVQX0NPTk5FQ1Q7CisKIAkJZHdjLT5wdWxsdXBzX2Nvbm5lY3RlZCA9IHRydWU7CiAJfSBlbHNlIHsKIAkJcmVnICY9IH5EV0MzX0RDVExfUlVOX1NUT1A7CisKKwkJaWYgKGR3Yy0+aGFzX2hpYmVybmF0aW9uICYmICFzdXNwZW5kKQorCQkJcmVnICY9IH5EV0MzX0RDVExfS0VFUF9DT05ORUNUOworCiAJCWR3Yy0+cHVsbHVwc19jb25uZWN0ZWQgPSBmYWxzZTsKIAl9CiAKQEAgLTE0NDIsNyArMTQ4Nyw3IEBACiAJaXNfb24gPSAhIWlzX29uOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmR3Yy0+bG9jaywgZmxhZ3MpOwotCXJldCA9IGR3YzNfZ2FkZ2V0X3J1bl9zdG9wKGR3YywgaXNfb24pOworCXJldCA9IGR3YzNfZ2FkZ2V0X3J1bl9zdG9wKGR3YywgaXNfb24sIGZhbHNlKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkd2MtPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CkBAIC0xNTQ5LDE0ICsxNTk0LDE2IEBACiAJZHdjM19nYWRnZXRfZXAwX2Rlc2Mud01heFBhY2tldFNpemUgPSBjcHVfdG9fbGUxNig1MTIpOwogCiAJZGVwID0gZHdjLT5lcHNbMF07Ci0JcmV0ID0gX19kd2MzX2dhZGdldF9lcF9lbmFibGUoZGVwLCAmZHdjM19nYWRnZXRfZXAwX2Rlc2MsIE5VTEwsIGZhbHNlKTsKKwlyZXQgPSBfX2R3YzNfZ2FkZ2V0X2VwX2VuYWJsZShkZXAsICZkd2MzX2dhZGdldF9lcDBfZGVzYywgTlVMTCwgZmFsc2UsCisJCQlmYWxzZSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGR3Yy0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSAlc1xuIiwgZGVwLT5uYW1lKTsKIAkJZ290byBlcnIyOwogCX0KIAogCWRlcCA9IGR3Yy0+ZXBzWzFdOwotCXJldCA9IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKGRlcCwgJmR3YzNfZ2FkZ2V0X2VwMF9kZXNjLCBOVUxMLCBmYWxzZSk7CisJcmV0ID0gX19kd2MzX2dhZGdldF9lcF9lbmFibGUoZGVwLCAmZHdjM19nYWRnZXRfZXAwX2Rlc2MsIE5VTEwsIGZhbHNlLAorCQkJZmFsc2UpOwogCWlmIChyZXQpIHsKIAkJZGV2X2Vycihkd2MtPmRldiwgImZhaWxlZCB0byBlbmFibGUgJXNcbiIsIGRlcC0+bmFtZSk7CiAJCWdvdG8gZXJyMzsKQEAgLTE4NDksMTUgKzE4OTYsMTIgQEAKIAkJCSAqLwogCQkJZGVwLT5mbGFncyA9IERXQzNfRVBfUEVORElOR19SRVFVRVNUOwogCQl9IGVsc2UgewotCQkJZHdjM19zdG9wX2FjdGl2ZV90cmFuc2Zlcihkd2MsIGRlcC0+bnVtYmVyKTsKKwkJCWR3YzNfc3RvcF9hY3RpdmVfdHJhbnNmZXIoZHdjLCBkZXAtPm51bWJlciwgdHJ1ZSk7CiAJCQlkZXAtPmZsYWdzID0gRFdDM19FUF9FTkFCTEVEOwogCQl9CiAJCXJldHVybiAxOwogCX0KIAotCWlmICgoZXZlbnQtPnN0YXR1cyAmIERFUEVWVF9TVEFUVVNfSU9DKSAmJgotCQkJKHRyYi0+Y3RybCAmIERXQzNfVFJCX0NUUkxfSU9DKSkKLQkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTE5OTksNyArMjA0MywyNSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgZHdjM19zdG9wX2FjdGl2ZV90cmFuc2ZlcihzdHJ1Y3QgZHdjMyAqZHdjLCB1MzIgZXBudW0pCitzdGF0aWMgdm9pZCBkd2MzX3N1c3BlbmRfZ2FkZ2V0KHN0cnVjdCBkd2MzICpkd2MpCit7CisJaWYgKGR3Yy0+Z2FkZ2V0X2RyaXZlciAmJiBkd2MtPmdhZGdldF9kcml2ZXItPnN1c3BlbmQpIHsKKwkJc3Bpbl91bmxvY2soJmR3Yy0+bG9jayk7CisJCWR3Yy0+Z2FkZ2V0X2RyaXZlci0+c3VzcGVuZCgmZHdjLT5nYWRnZXQpOworCQlzcGluX2xvY2soJmR3Yy0+bG9jayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkd2MzX3Jlc3VtZV9nYWRnZXQoc3RydWN0IGR3YzMgKmR3YykKK3sKKwlpZiAoZHdjLT5nYWRnZXRfZHJpdmVyICYmIGR3Yy0+Z2FkZ2V0X2RyaXZlci0+cmVzdW1lKSB7CisJCXNwaW5fdW5sb2NrKCZkd2MtPmxvY2spOworCQlkd2MtPmdhZGdldF9kcml2ZXItPnJlc3VtZSgmZHdjLT5nYWRnZXQpOworCQlzcGluX2xvY2soJmR3Yy0+bG9jayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkd2MzX3N0b3BfYWN0aXZlX3RyYW5zZmVyKHN0cnVjdCBkd2MzICpkd2MsIHUzMiBlcG51bSwgYm9vbCBmb3JjZSkKIHsKIAlzdHJ1Y3QgZHdjM19lcCAqZGVwOwogCXN0cnVjdCBkd2MzX2dhZGdldF9lcF9jbWRfcGFyYW1zIHBhcmFtczsKQEAgLTIwMzEsNyArMjA5Myw4IEBACiAJICovCiAKIAljbWQgPSBEV0MzX0RFUENNRF9FTkRUUkFOU0ZFUjsKLQljbWQgfD0gRFdDM19ERVBDTURfSElQUklfRk9SQ0VSTSB8IERXQzNfREVQQ01EX0NNRElPQzsKKwljbWQgfD0gZm9yY2UgPyBEV0MzX0RFUENNRF9ISVBSSV9GT1JDRVJNIDogMDsKKwljbWQgfD0gRFdDM19ERVBDTURfQ01ESU9DOwogCWNtZCB8PSBEV0MzX0RFUENNRF9QQVJBTShkZXAtPnJlc291cmNlX2luZGV4KTsKIAltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOwogCXJldCA9IGR3YzNfc2VuZF9nYWRnZXRfZXBfY21kKGR3YywgZGVwLT5udW1iZXIsIGNtZCwgJnBhcmFtcyk7CkBAIC0yMjYwLDE3ICsyMzIzLDIzIEBACiAJCXJlZyB8PSBEV0MzX0RDVExfSElSRF9USFJFUygxMik7CiAKIAkJZHdjM193cml0ZWwoZHdjLT5yZWdzLCBEV0MzX0RDVEwsIHJlZyk7CisJfSBlbHNlIHsKKwkJcmVnID0gZHdjM19yZWFkbChkd2MtPnJlZ3MsIERXQzNfRENUTCk7CisJCXJlZyAmPSB+RFdDM19EQ1RMX0hJUkRfVEhSRVNfTUFTSzsKKwkJZHdjM193cml0ZWwoZHdjLT5yZWdzLCBEV0MzX0RDVEwsIHJlZyk7CiAJfQogCiAJZGVwID0gZHdjLT5lcHNbMF07Ci0JcmV0ID0gX19kd2MzX2dhZGdldF9lcF9lbmFibGUoZGVwLCAmZHdjM19nYWRnZXRfZXAwX2Rlc2MsIE5VTEwsIHRydWUpOworCXJldCA9IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKGRlcCwgJmR3YzNfZ2FkZ2V0X2VwMF9kZXNjLCBOVUxMLCB0cnVlLAorCQkJZmFsc2UpOwogCWlmIChyZXQpIHsKIAkJZGV2X2Vycihkd2MtPmRldiwgImZhaWxlZCB0byBlbmFibGUgJXNcbiIsIGRlcC0+bmFtZSk7CiAJCXJldHVybjsKIAl9CiAKIAlkZXAgPSBkd2MtPmVwc1sxXTsKLQlyZXQgPSBfX2R3YzNfZ2FkZ2V0X2VwX2VuYWJsZShkZXAsICZkd2MzX2dhZGdldF9lcDBfZGVzYywgTlVMTCwgdHJ1ZSk7CisJcmV0ID0gX19kd2MzX2dhZGdldF9lcF9lbmFibGUoZGVwLCAmZHdjM19nYWRnZXRfZXAwX2Rlc2MsIE5VTEwsIHRydWUsCisJCQlmYWxzZSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGR3Yy0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSAlc1xuIiwgZGVwLT5uYW1lKTsKIAkJcmV0dXJuOwpAQCAtMjM3OCw5ICsyNDQ3LDUwIEBACiAKIAlkd2MtPmxpbmtfc3RhdGUgPSBuZXh0OwogCisJc3dpdGNoIChuZXh0KSB7CisJY2FzZSBEV0MzX0xJTktfU1RBVEVfVTE6CisJCWlmIChkd2MtPnNwZWVkID09IFVTQl9TUEVFRF9TVVBFUikKKwkJCWR3YzNfc3VzcGVuZF9nYWRnZXQoZHdjKTsKKwkJYnJlYWs7CisJY2FzZSBEV0MzX0xJTktfU1RBVEVfVTI6CisJY2FzZSBEV0MzX0xJTktfU1RBVEVfVTM6CisJCWR3YzNfc3VzcGVuZF9nYWRnZXQoZHdjKTsKKwkJYnJlYWs7CisJY2FzZSBEV0MzX0xJTktfU1RBVEVfUkVTVU1FOgorCQlkd2MzX3Jlc3VtZV9nYWRnZXQoZHdjKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogZG8gbm90aGluZyAqLworCQlicmVhazsKKwl9CisKIAlkZXZfdmRiZyhkd2MtPmRldiwgIiVzIGxpbmsgJWRcbiIsIF9fZnVuY19fLCBkd2MtPmxpbmtfc3RhdGUpOwogfQogCitzdGF0aWMgdm9pZCBkd2MzX2dhZGdldF9oaWJlcm5hdGlvbl9pbnRlcnJ1cHQoc3RydWN0IGR3YzMgKmR3YywKKwkJdW5zaWduZWQgaW50IGV2dGluZm8pCit7CisJdW5zaWduZWQgaW50IGlzX3NzID0gZXZ0aW5mbyAmIEJJVCg0KTsKKworCS8qKgorCSAqIFdPUktBUk9VTkQ6IERXQzMgcmV2aXNvbiAyLjIwYSB3aXRoIGhpYmVybmF0aW9uIHN1cHBvcnQKKwkgKiBoYXZlIGEga25vd24gaXNzdWUgd2hpY2ggY2FuIGNhdXNlIFVTQiBDViBURC45LjIzIHRvIGZhaWwKKwkgKiByYW5kb21seS4KKwkgKgorCSAqIEJlY2F1c2Ugb2YgdGhpcyBpc3N1ZSwgY29yZSBjb3VsZCBnZW5lcmF0ZSBib2d1cyBoaWJlcm5hdGlvbgorCSAqIGV2ZW50cyB3aGljaCBTVyBuZWVkcyB0byBpZ25vcmUuCisJICoKKwkgKiBSZWZlcnMgdG86CisJICoKKwkgKiBTVEFSIzkwMDA1NDY1NzY6IERldmljZSBNb2RlIEhpYmVybmF0aW9uOiBJc3N1ZSBpbiBVU0IgMi4wCisJICogRGV2aWNlIEZhbGxiYWNrIGZyb20gU3VwZXJTcGVlZAorCSAqLworCWlmIChpc19zcyBeIChkd2MtPnNwZWVkID09IFVTQl9TUEVFRF9TVVBFUikpCisJCXJldHVybjsKKworCS8qIGVudGVyIGhpYmVybmF0aW9uIGhlcmUgKi8KK30KKwogc3RhdGljIHZvaWQgZHdjM19nYWRnZXRfaW50ZXJydXB0KHN0cnVjdCBkd2MzICpkd2MsCiAJCWNvbnN0IHN0cnVjdCBkd2MzX2V2ZW50X2RldnQgKmV2ZW50KQogewpAQCAtMjM5Nyw2ICsyNTA3LDEzIEBACiAJY2FzZSBEV0MzX0RFVklDRV9FVkVOVF9XQUtFVVA6CiAJCWR3YzNfZ2FkZ2V0X3dha2V1cF9pbnRlcnJ1cHQoZHdjKTsKIAkJYnJlYWs7CisJY2FzZSBEV0MzX0RFVklDRV9FVkVOVF9ISUJFUl9SRVE6CisJCWlmIChkZXZfV0FSTl9PTkNFKGR3Yy0+ZGV2LCAhZHdjLT5oYXNfaGliZXJuYXRpb24sCisJCQkJCSJ1bmV4cGVjdGVkIGhpYmVybmF0aW9uIGV2ZW50XG4iKSkKKwkJCWJyZWFrOworCisJCWR3YzNfZ2FkZ2V0X2hpYmVybmF0aW9uX2ludGVycnVwdChkd2MsIGV2ZW50LT5ldmVudF9pbmZvKTsKKwkJYnJlYWs7CiAJY2FzZSBEV0MzX0RFVklDRV9FVkVOVF9MSU5LX1NUQVRVU19DSEFOR0U6CiAJCWR3YzNfZ2FkZ2V0X2xpbmtzdHNfY2hhbmdlX2ludGVycnVwdChkd2MsIGV2ZW50LT5ldmVudF9pbmZvKTsKIAkJYnJlYWs7CkBAIC0yNjYxLDggKzI3NzgsMTAgQEAKIAogaW50IGR3YzNfZ2FkZ2V0X3ByZXBhcmUoc3RydWN0IGR3YzMgKmR3YykKIHsKLQlpZiAoZHdjLT5wdWxsdXBzX2Nvbm5lY3RlZCkKKwlpZiAoZHdjLT5wdWxsdXBzX2Nvbm5lY3RlZCkgewogCQlkd2MzX2dhZGdldF9kaXNhYmxlX2lycShkd2MpOworCQlkd2MzX2dhZGdldF9ydW5fc3RvcChkd2MsIHRydWUsIHRydWUpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMjY3MSw3ICsyNzkwLDcgQEAKIHsKIAlpZiAoZHdjLT5wdWxsdXBzX2Nvbm5lY3RlZCkgewogCQlkd2MzX2dhZGdldF9lbmFibGVfaXJxKGR3Yyk7Ci0JCWR3YzNfZ2FkZ2V0X3J1bl9zdG9wKGR3YywgdHJ1ZSk7CisJCWR3YzNfZ2FkZ2V0X3J1bl9zdG9wKGR3YywgdHJ1ZSwgZmFsc2UpOwogCX0KIH0KIApAQCAtMjY5NCwxMiArMjgxMywxNCBAQAogCWR3YzNfZ2FkZ2V0X2VwMF9kZXNjLndNYXhQYWNrZXRTaXplID0gY3B1X3RvX2xlMTYoNTEyKTsKIAogCWRlcCA9IGR3Yy0+ZXBzWzBdOwotCXJldCA9IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKGRlcCwgJmR3YzNfZ2FkZ2V0X2VwMF9kZXNjLCBOVUxMLCBmYWxzZSk7CisJcmV0ID0gX19kd2MzX2dhZGdldF9lcF9lbmFibGUoZGVwLCAmZHdjM19nYWRnZXRfZXAwX2Rlc2MsIE5VTEwsIGZhbHNlLAorCQkJZmFsc2UpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyMDsKIAogCWRlcCA9IGR3Yy0+ZXBzWzFdOwotCXJldCA9IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKGRlcCwgJmR3YzNfZ2FkZ2V0X2VwMF9kZXNjLCBOVUxMLCBmYWxzZSk7CisJcmV0ID0gX19kd2MzX2dhZGdldF9lcF9lbmFibGUoZGVwLCAmZHdjM19nYWRnZXRfZXAwX2Rlc2MsIE5VTEwsIGZhbHNlLAorCQkJZmFsc2UpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9nYWRnZXQuaCBiL2RyaXZlcnMvdXNiL2R3YzMvZ2FkZ2V0LmgKaW5kZXggZmViZTFhYS4uYTBlZTc1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMy9nYWRnZXQuaAorKysgYi9kcml2ZXJzL3VzYi9kd2MzL2dhZGdldC5oCkBAIC01NiwxMiArNTYsNiBAQAogLyogREVQWEZFUkNGRyBwYXJhbWV0ZXIgMCAqLwogI2RlZmluZSBEV0MzX0RFUFhGRVJDRkdfTlVNX1hGRVJfUkVTKG4pCSgobikgJiAweGZmZmYpCiAKLXN0cnVjdCBkd2MzX2dhZGdldF9lcF9jbWRfcGFyYW1zIHsKLQl1MzIJcGFyYW0yOwotCXUzMglwYXJhbTE7Ci0JdTMyCXBhcmFtMDsKLX07Ci0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKICNkZWZpbmUgdG9fZHdjM19yZXF1ZXN0KHIpCShjb250YWluZXJfb2Yociwgc3RydWN0IGR3YzNfcmVxdWVzdCwgcmVxdWVzdCkpCkBAIC04NSw5ICs3OSw2IEBACiB2b2lkIGR3YzNfZ2FkZ2V0X2dpdmViYWNrKHN0cnVjdCBkd2MzX2VwICpkZXAsIHN0cnVjdCBkd2MzX3JlcXVlc3QgKnJlcSwKIAkJaW50IHN0YXR1cyk7CiAKLWludCBkd2MzX2dhZGdldF9zZXRfdGVzdF9tb2RlKHN0cnVjdCBkd2MzICpkd2MsIGludCBtb2RlKTsKLWludCBkd2MzX2dhZGdldF9zZXRfbGlua19zdGF0ZShzdHJ1Y3QgZHdjMyAqZHdjLCBlbnVtIGR3YzNfbGlua19zdGF0ZSBzdGF0ZSk7Ci0KIHZvaWQgZHdjM19lcDBfaW50ZXJydXB0KHN0cnVjdCBkd2MzICpkd2MsCiAJCWNvbnN0IHN0cnVjdCBkd2MzX2V2ZW50X2RlcGV2dCAqZXZlbnQpOwogdm9pZCBkd2MzX2VwMF9vdXRfc3RhcnQoc3RydWN0IGR3YzMgKmR3Yyk7CkBAIC05NSw5ICs4Niw2IEBACiBpbnQgZHdjM19nYWRnZXRfZXAwX3F1ZXVlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcXVlc3QsCiAJCWdmcF90IGdmcF9mbGFncyk7CiBpbnQgX19kd2MzX2dhZGdldF9lcF9zZXRfaGFsdChzdHJ1Y3QgZHdjM19lcCAqZGVwLCBpbnQgdmFsdWUpOwotaW50IGR3YzNfc2VuZF9nYWRnZXRfZXBfY21kKHN0cnVjdCBkd2MzICpkd2MsIHVuc2lnbmVkIGVwLAotCQl1bnNpZ25lZCBjbWQsIHN0cnVjdCBkd2MzX2dhZGdldF9lcF9jbWRfcGFyYW1zICpwYXJhbXMpOwotaW50IGR3YzNfc2VuZF9nYWRnZXRfZ2VuZXJpY19jb21tYW5kKHN0cnVjdCBkd2MzICpkd2MsIGludCBjbWQsIHUzMiBwYXJhbSk7CiAKIC8qKgogICogZHdjM19nYWRnZXRfZXBfZ2V0X3RyYW5zZmVyX2luZGV4IC0gR2V0cyB0cmFuc2ZlciBpbmRleCBmcm9tIEhXCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCmluZGV4IDgxNTQxNjUuLjM1NTdjN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCkBAIC0yMjYsNyArMjI2LDcgQEAKIGNvbmZpZyBVU0JfT01BUAogCXRyaXN0YXRlICJPTUFQIFVTQiBEZXZpY2UgQ29udHJvbGxlciIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUDEKLQlzZWxlY3QgSVNQMTMwMV9PTUFQIGlmIE1BQ0hfT01BUF9IMiB8fCBNQUNIX09NQVBfSDMgfHwgTUFDSF9PTUFQX0g0X09URworCXNlbGVjdCBJU1AxMzAxX09NQVAgaWYgTUFDSF9PTUFQX0gyIHx8IE1BQ0hfT01BUF9IMwogCWhlbHAKIAkgICBNYW55IFRleGFzIEluc3RydW1lbnRzIE9NQVAgcHJvY2Vzc29ycyBoYXZlIGZsZXhpYmxlIGZ1bGwKIAkgICBzcGVlZCBVU0IgZGV2aWNlIGNvbnRyb2xsZXJzLCB3aXRoIHN1cHBvcnQgZm9yIHVwIHRvIDMwCkBAIC0zMDEsNyArMzAxLDYgQEAKIAkgICBnYWRnZXQgZHJpdmVycyB0byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KIAogY29uZmlnIFVTQl9TM0NfSFNPVEcKLQlkZXBlbmRzIG9uIEFSTQogCXRyaXN0YXRlICJEZXNpZ253YXJlL1MzQyBIUy9PdEcgVVNCIERldmljZSBjb250cm9sbGVyIgogCWhlbHAKIAkgIFRoZSBEZXNpZ253YXJlIFVTQjIuMCBoaWdoLXNwZWVkIGdhZGdldCBjb250cm9sbGVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCmluZGV4IGNlYThjMjAuLmY2MDVhZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCkBAIC0xNzU4LDE1ICsxNzU4LDE1IEBACiAKIAkvKiBuZXdlciBjaGlwcyBoYXZlIG1vcmUgRklGTyBtZW1vcnkgdGhhbiBybTkyMDAgKi8KIAlpZiAoY3B1X2lzX2F0OTFzYW05MjYwKCkgfHwgY3B1X2lzX2F0OTFzYW05ZzIwKCkpIHsKLQkJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQoJnVkYy0+ZXBbMF0uZXAsIDY0KTsKLQkJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQoJnVkYy0+ZXBbM10uZXAsIDY0KTsKLQkJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQoJnVkYy0+ZXBbNF0uZXAsIDUxMik7Ci0JCXVzYl9lcF9zZXRfbWF4cGFja2V0X2xpbWl0KCZ1ZGMtPmVwWzVdLmVwLCA1MTIpOworCQl1ZGMtPmVwWzBdLm1heHBhY2tldCA9IDY0OworCQl1ZGMtPmVwWzNdLm1heHBhY2tldCA9IDY0OworCQl1ZGMtPmVwWzRdLm1heHBhY2tldCA9IDUxMjsKKwkJdWRjLT5lcFs1XS5tYXhwYWNrZXQgPSA1MTI7CiAJfSBlbHNlIGlmIChjcHVfaXNfYXQ5MXNhbTkyNjEoKSB8fCBjcHVfaXNfYXQ5MXNhbTlnMTAoKSkgewotCQl1c2JfZXBfc2V0X21heHBhY2tldF9saW1pdCgmdWRjLT5lcFszXS5lcCwgNjQpOworCQl1ZGMtPmVwWzNdLm1heHBhY2tldCA9IDY0OwogCX0gZWxzZSBpZiAoY3B1X2lzX2F0OTFzYW05MjYzKCkpIHsKLQkJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQoJnVkYy0+ZXBbMF0uZXAsIDY0KTsKLQkJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQoJnVkYy0+ZXBbM10uZXAsIDY0KTsKKwkJdWRjLT5lcFswXS5tYXhwYWNrZXQgPSA2NDsKKwkJdWRjLT5lcFszXS5tYXhwYWNrZXQgPSA2NDsKIAl9CiAKIAl1ZGMtPnVkcF9iYXNlYWRkciA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0bWVsX3VzYmFfdWRjLmMKaW5kZXggNTI3NzFkNC4uOWY2NTMyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F0bWVsX3VzYmFfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0bWVsX3VzYmFfdWRjLmMKQEAgLTE2NjEsNyArMTY2MSw3IEBACiAJaWYgKGRtYV9zdGF0dXMpIHsKIAkJaW50IGk7CiAKLQkJZm9yIChpID0gMTsgaSA8IFVTQkFfTlJfRU5EUE9JTlRTOyBpKyspCisJCWZvciAoaSA9IDE7IGkgPCBVU0JBX05SX0RNQVM7IGkrKykKIAkJCWlmIChkbWFfc3RhdHVzICYgKDEgPDwgaSkpCiAJCQkJdXNiYV9kbWFfaXJxKHVkYywgJnVkYy0+dXNiYV9lcFtpXSk7CiAJfQpAQCAtMTY3MCw3ICsxNjcwLDcgQEAKIAlpZiAoZXBfc3RhdHVzKSB7CiAJCWludCBpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBVU0JBX05SX0VORFBPSU5UUzsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgdWRjLT5udW1fZXA7IGkrKykKIAkJCWlmIChlcF9zdGF0dXMgJiAoMSA8PCBpKSkgewogCQkJCWlmIChlcF9pc19jb250cm9sKCZ1ZGMtPnVzYmFfZXBbaV0pKQogCQkJCQl1c2JhX2NvbnRyb2xfaXJxKHVkYywgJnVkYy0+dXNiYV9lcFtpXSk7CkBAIC0xODI3LDEyICsxODI3LDEyIEBACiAJdG9nZ2xlX2JpYXMoMCk7CiAJdXNiYV93cml0ZWwodWRjLCBDVFJMLCBVU0JBX0RJU0FCTEVfTUFTSyk7CiAKLQl1ZGMtPmRyaXZlciA9IE5VTEw7Ci0KIAljbGtfZGlzYWJsZV91bnByZXBhcmUodWRjLT5oY2xrKTsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUodWRjLT5wY2xrKTsKIAotCURCRyhEQkdfR0FER0VULCAidW5yZWdpc3RlcmVkIGRyaXZlciBgJXMnXG4iLCBkcml2ZXItPmRyaXZlci5uYW1lKTsKKwlEQkcoREJHX0dBREdFVCwgInVucmVnaXN0ZXJlZCBkcml2ZXIgYCVzJ1xuIiwgdWRjLT5kcml2ZXItPmRyaXZlci5uYW1lKTsKKworCXVkYy0+ZHJpdmVyID0gTlVMTDsKIAogCXJldHVybiAwOwogfQpAQCAtMTkxNCw2ICsxOTE0LDEyIEBACiAJCWkrKzsKIAl9CiAKKwlpZiAoaSA9PSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm9mX3Byb2JlOiBubyBlbmRwb2ludCBzcGVjaWZpZWRcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKIAlyZXR1cm4gZXBzOwogZXJyOgogCXJldHVybiBFUlJfUFRSKHJldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXRtZWxfdXNiYV91ZGMuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5oCmluZGV4IDI5MjJkYjUuLmE3MDcwNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5oCkBAIC0yMTAsNyArMjEwLDcgQEAKICNkZWZpbmUgVVNCQV9GSUZPX0JBU0UoeCkJKCh4KSA8PCAxNikKIAogLyogU3ludGggcGFyYW1ldGVycyAqLwotI2RlZmluZSBVU0JBX05SX0VORFBPSU5UUwk3CisjZGVmaW5lIFVTQkFfTlJfRE1BUwkJNwogCiAjZGVmaW5lIEVQMF9GSUZPX1NJWkUJCTY0CiAjZGVmaW5lIEVQMF9FUFRfU0laRQkJVVNCQV9FUFRfU0laRV82NApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jCmluZGV4IGQ3NDJiZWQuLmZhYjkwNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvY29tcG9zaXRlLmMKQEAgLTExMzksNyArMTEzOSw3IEBACiAKIAl1YyA9IGNvcHlfZ2FkZ2V0X3N0cmluZ3Moc3AsIG5fZ3N0cmluZ3MsIG5fc3RyaW5ncyk7CiAJaWYgKElTX0VSUih1YykpCi0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIodWMpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKHVjKTsKIAogCW5fZ3MgPSBnZXRfY29udGFpbmVyc19ncyh1Yyk7CiAJcmV0ID0gdXNiX3N0cmluZ19pZHNfdGFiKGNkZXYsIG5fZ3NbMF0tPnN0cmluZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfZnMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2ZzLmMKaW5kZXggMmI0MzM0My4uMmUxNjRkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfZnMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9mcy5jCkBAIC0yOCw2ICsyOCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi9jb21wb3NpdGUuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvZnVuY3Rpb25mcy5oPgogCisjaW5jbHVkZSA8bGludXgvYWlvLmg+CisjaW5jbHVkZSA8bGludXgvbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisKICNpbmNsdWRlICJ1X2ZzLmgiCiAjaW5jbHVkZSAiY29uZmlnZnMuaCIKIApAQCAtOTksNiArMTAzLDE0IEBACiB9CiAKIAorc3RhdGljIGlubGluZSBlbnVtIGZmc19zZXR1cF9zdGF0ZQorZmZzX3NldHVwX3N0YXRlX2NsZWFyX2NhbmNlbGxlZChzdHJ1Y3QgZmZzX2RhdGEgKmZmcykKK3sKKwlyZXR1cm4gKGVudW0gZmZzX3NldHVwX3N0YXRlKQorCQljbXB4Y2hnKCZmZnMtPnNldHVwX3N0YXRlLCBGRlNfU0VUVVBfQ0FOQ0VMTEVELCBGRlNfTk9fU0VUVVApOworfQorCisKIHN0YXRpYyB2b2lkIGZmc19mdW5jX2Vwc19kaXNhYmxlKHN0cnVjdCBmZnNfZnVuY3Rpb24gKmZ1bmMpOwogc3RhdGljIGludCBfX211c3RfY2hlY2sgZmZzX2Z1bmNfZXBzX2VuYWJsZShzdHJ1Y3QgZmZzX2Z1bmN0aW9uICpmdW5jKTsKIApAQCAtMTIyLDggKzEzNCw4IEBACiAJc3RydWN0IHVzYl9lcAkJCSplcDsJLyogUDogZmZzLT5lcHNfbG9jayAqLwogCXN0cnVjdCB1c2JfcmVxdWVzdAkJKnJlcTsJLyogUDogZXBmaWxlLT5tdXRleCAqLwogCi0JLyogWzBdOiBmdWxsIHNwZWVkLCBbMV06IGhpZ2ggc3BlZWQgKi8KLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKmRlc2NzWzJdOworCS8qIFswXTogZnVsbCBzcGVlZCwgWzFdOiBoaWdoIHNwZWVkLCBbMl06IHN1cGVyIHNwZWVkICovCisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSpkZXNjc1szXTsKIAogCXU4CQkJCW51bTsKIApAQCAtMTQ4LDYgKzE2MCwyNSBAQAogCXVuc2lnbmVkIGNoYXIJCQlfcGFkOwogfTsKIAorLyogIGZmc19pb19kYXRhIHN0cnVjdHVyZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBmZnNfaW9fZGF0YSB7CisJYm9vbCBhaW87CisJYm9vbCByZWFkOworCisJc3RydWN0IGtpb2NiICpraW9jYjsKKwljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdmVjOworCXVuc2lnbmVkIGxvbmcgbnJfc2VnczsKKwljaGFyIF9fdXNlciAqYnVmOworCXNpemVfdCBsZW47CisKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKworCXN0cnVjdCB1c2JfZXAgKmVwOworCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxOworfTsKKwogc3RhdGljIGludCAgX19tdXN0X2NoZWNrIGZmc19lcGZpbGVzX2NyZWF0ZShzdHJ1Y3QgZmZzX2RhdGEgKmZmcyk7CiBzdGF0aWMgdm9pZCBmZnNfZXBmaWxlc19kZXN0cm95KHN0cnVjdCBmZnNfZXBmaWxlICplcGZpbGVzLCB1bnNpZ25lZCBjb3VudCk7CiAKQEAgLTE2MSw4ICsxOTIsMTAgQEAKIERFRklORV9NVVRFWChmZnNfbG9jayk7CiBFWFBPUlRfU1lNQk9MKGZmc19sb2NrKTsKIAotc3RhdGljIHN0cnVjdCBmZnNfZGV2ICpmZnNfZmluZF9kZXYoY29uc3QgY2hhciAqbmFtZSk7CitzdGF0aWMgc3RydWN0IGZmc19kZXYgKl9mZnNfZmluZF9kZXYoY29uc3QgY2hhciAqbmFtZSk7CitzdGF0aWMgc3RydWN0IGZmc19kZXYgKl9mZnNfYWxsb2NfZGV2KHZvaWQpOwogc3RhdGljIGludCBfZmZzX25hbWVfZGV2KHN0cnVjdCBmZnNfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpOworc3RhdGljIHZvaWQgX2Zmc19mcmVlX2RldihzdHJ1Y3QgZmZzX2RldiAqZGV2KTsKIHN0YXRpYyB2b2lkICpmZnNfYWNxdWlyZV9kZXYoY29uc3QgY2hhciAqZGV2X25hbWUpOwogc3RhdGljIHZvaWQgZmZzX3JlbGVhc2VfZGV2KHN0cnVjdCBmZnNfZGF0YSAqZmZzX2RhdGEpOwogc3RhdGljIGludCBmZnNfcmVhZHkoc3RydWN0IGZmc19kYXRhICpmZnMpOwpAQCAtMjE4LDcgKzI1MSw3IEBACiAJfQogCiAJZmZzLT5zZXR1cF9zdGF0ZSA9IEZGU19OT19TRVRVUDsKLQlyZXR1cm4gZmZzLT5lcDByZXFfc3RhdHVzOworCXJldHVybiByZXEtPnN0YXR1cyA/IHJlcS0+c3RhdHVzIDogcmVxLT5hY3R1YWw7CiB9CiAKIHN0YXRpYyBpbnQgX19mZnNfZXAwX3N0YWxsKHN0cnVjdCBmZnNfZGF0YSAqZmZzKQpAQCAtMjQ0LDcgKzI3Nyw3IEBACiAJRU5URVIoKTsKIAogCS8qIEZhc3QgY2hlY2sgaWYgc2V0dXAgd2FzIGNhbmNlbGVkICovCi0JaWYgKEZGU19TRVRVUF9TVEFURShmZnMpID09IEZGU19TRVRVUF9DQU5DRUxFRCkKKwlpZiAoZmZzX3NldHVwX3N0YXRlX2NsZWFyX2NhbmNlbGxlZChmZnMpID09IEZGU19TRVRVUF9DQU5DRUxMRUQpCiAJCXJldHVybiAtRUlEUk07CiAKIAkvKiBBY3F1aXJlIG11dGV4ICovCkBAIC0zMTAsOCArMzQzLDggQEAKIAkJICogcmF0aGVyIHRoZW4gX2lycXNhdmUKIAkJICovCiAJCXNwaW5fbG9ja19pcnEoJmZmcy0+ZXYud2FpdHEubG9jayk7Ci0JCXN3aXRjaCAoRkZTX1NFVFVQX1NUQVRFKGZmcykpIHsKLQkJY2FzZSBGRlNfU0VUVVBfQ0FOQ0VMRUQ6CisJCXN3aXRjaCAoZmZzX3NldHVwX3N0YXRlX2NsZWFyX2NhbmNlbGxlZChmZnMpKSB7CisJCWNhc2UgRkZTX1NFVFVQX0NBTkNFTExFRDoKIAkJCXJldCA9IC1FSURSTTsKIAkJCWdvdG8gZG9uZV9zcGluOwogCkBAIC0zNDYsNyArMzc5LDcgQEAKIAkJLyoKIAkJICogV2UgYXJlIGd1YXJhbnRlZWQgdG8gYmUgc3RpbGwgaW4gRkZTX0FDVElWRSBzdGF0ZQogCQkgKiBidXQgdGhlIHN0YXRlIG9mIHNldHVwIGNvdWxkIGhhdmUgY2hhbmdlZCBmcm9tCi0JCSAqIEZGU19TRVRVUF9QRU5ESU5HIHRvIEZGU19TRVRVUF9DQU5DRUxFRCBzbyB3ZSBuZWVkCisJCSAqIEZGU19TRVRVUF9QRU5ESU5HIHRvIEZGU19TRVRVUF9DQU5DRUxMRUQgc28gd2UgbmVlZAogCQkgKiB0byBjaGVjayBmb3IgdGhhdC4gIElmIHRoYXQgaGFwcGVuZWQgd2UgY29waWVkIGRhdGEKIAkJICogZnJvbSB1c2VyIHNwYWNlIGluIHZhaW4gYnV0IGl0J3MgdW5saWtlbHkuCiAJCSAqCkBAIC0zNTUsNyArMzg4LDggQEAKIAkJICogdHJhbnNpdGlvbiBjYW4gYmUgcGVyZm9ybWVkIGFuZCBpdCdzIHByb3RlY3RlZCBieQogCQkgKiBtdXRleC4KIAkJICovCi0JCWlmIChGRlNfU0VUVVBfU1RBVEUoZmZzKSA9PSBGRlNfU0VUVVBfQ0FOQ0VMRUQpIHsKKwkJaWYgKGZmc19zZXR1cF9zdGF0ZV9jbGVhcl9jYW5jZWxsZWQoZmZzKSA9PQorCQkgICAgRkZTX1NFVFVQX0NBTkNFTExFRCkgewogCQkJcmV0ID0gLUVJRFJNOwogZG9uZV9zcGluOgogCQkJc3Bpbl91bmxvY2tfaXJxKCZmZnMtPmV2LndhaXRxLmxvY2spOwpAQCAtNDIxLDcgKzQ1NSw3IEBACiAJRU5URVIoKTsKIAogCS8qIEZhc3QgY2hlY2sgaWYgc2V0dXAgd2FzIGNhbmNlbGVkICovCi0JaWYgKEZGU19TRVRVUF9TVEFURShmZnMpID09IEZGU19TRVRVUF9DQU5DRUxFRCkKKwlpZiAoZmZzX3NldHVwX3N0YXRlX2NsZWFyX2NhbmNlbGxlZChmZnMpID09IEZGU19TRVRVUF9DQU5DRUxMRUQpCiAJCXJldHVybiAtRUlEUk07CiAKIAkvKiBBY3F1aXJlIG11dGV4ICovCkBAIC00NDEsOCArNDc1LDggQEAKIAkgKi8KIAlzcGluX2xvY2tfaXJxKCZmZnMtPmV2LndhaXRxLmxvY2spOwogCi0Jc3dpdGNoIChGRlNfU0VUVVBfU1RBVEUoZmZzKSkgewotCWNhc2UgRkZTX1NFVFVQX0NBTkNFTEVEOgorCXN3aXRjaCAoZmZzX3NldHVwX3N0YXRlX2NsZWFyX2NhbmNlbGxlZChmZnMpKSB7CisJY2FzZSBGRlNfU0VUVVBfQ0FOQ0VMTEVEOgogCQlyZXQgPSAtRUlEUk07CiAJCWJyZWFrOwogCkBAIC00ODksNyArNTIzLDggQEAKIAkJc3Bpbl9sb2NrX2lycSgmZmZzLT5ldi53YWl0cS5sb2NrKTsKIAogCQkvKiBTZWUgZmZzX2VwMF93cml0ZSgpICovCi0JCWlmIChGRlNfU0VUVVBfU1RBVEUoZmZzKSA9PSBGRlNfU0VUVVBfQ0FOQ0VMRUQpIHsKKwkJaWYgKGZmc19zZXR1cF9zdGF0ZV9jbGVhcl9jYW5jZWxsZWQoZmZzKSA9PQorCQkgICAgRkZTX1NFVFVQX0NBTkNFTExFRCkgewogCQkJcmV0ID0gLUVJRFJNOwogCQkJYnJlYWs7CiAJCX0KQEAgLTU1OCw2ICs1OTMsNDUgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdW5zaWduZWQgaW50IGZmc19lcDBfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgZmZzX2RhdGEgKmZmcyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IFBPTExXUk5PUk07CisJaW50IHJldDsKKworCXBvbGxfd2FpdChmaWxlLCAmZmZzLT5ldi53YWl0cSwgd2FpdCk7CisKKwlyZXQgPSBmZnNfbXV0ZXhfbG9jaygmZmZzLT5tdXRleCwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWlmICh1bmxpa2VseShyZXQgPCAwKSkKKwkJcmV0dXJuIG1hc2s7CisKKwlzd2l0Y2ggKGZmcy0+c3RhdGUpIHsKKwljYXNlIEZGU19SRUFEX0RFU0NSSVBUT1JTOgorCWNhc2UgRkZTX1JFQURfU1RSSU5HUzoKKwkJbWFzayB8PSBQT0xMT1VUOworCQlicmVhazsKKworCWNhc2UgRkZTX0FDVElWRToKKwkJc3dpdGNoIChmZnMtPnNldHVwX3N0YXRlKSB7CisJCWNhc2UgRkZTX05PX1NFVFVQOgorCQkJaWYgKGZmcy0+ZXYuY291bnQpCisJCQkJbWFzayB8PSBQT0xMSU47CisJCQlicmVhazsKKworCQljYXNlIEZGU19TRVRVUF9QRU5ESU5HOgorCQljYXNlIEZGU19TRVRVUF9DQU5DRUxMRUQ6CisJCQltYXNrIHw9IChQT0xMSU4gfCBQT0xMT1VUKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBGRlNfQ0xPU0lORzoKKwkJYnJlYWs7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZmZnMtPm11dGV4KTsKKworCXJldHVybiBtYXNrOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmZnNfZXAwX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlayA9CW5vX2xsc2VlaywKIApAQCAtNTY2LDYgKzY0MCw3IEBACiAJLnJlYWQgPQkJZmZzX2VwMF9yZWFkLAogCS5yZWxlYXNlID0JZmZzX2VwMF9yZWxlYXNlLAogCS51bmxvY2tlZF9pb2N0bCA9CWZmc19lcDBfaW9jdGwsCisJLnBvbGwgPQkJZmZzX2VwMF9wb2xsLAogfTsKIAogCkBAIC01ODEsOCArNjU2LDUyIEBACiAJfQogfQogCi1zdGF0aWMgc3NpemVfdCBmZnNfZXBmaWxlX2lvKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBpbnQgcmVhZCkKK3N0YXRpYyB2b2lkIGZmc191c2VyX2NvcHlfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZmZzX2lvX2RhdGEgKmlvX2RhdGEgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGZmc19pb19kYXRhLAorCQkJCQkJICAgd29yayk7CisJaW50IHJldCA9IGlvX2RhdGEtPnJlcS0+c3RhdHVzID8gaW9fZGF0YS0+cmVxLT5zdGF0dXMgOgorCQkJCQkgaW9fZGF0YS0+cmVxLT5hY3R1YWw7CisKKwlpZiAoaW9fZGF0YS0+cmVhZCAmJiByZXQgPiAwKSB7CisJCWludCBpOworCQlzaXplX3QgcG9zID0gMDsKKwkJdXNlX21tKGlvX2RhdGEtPm1tKTsKKwkJZm9yIChpID0gMDsgaSA8IGlvX2RhdGEtPm5yX3NlZ3M7IGkrKykgeworCQkJaWYgKHVubGlrZWx5KGNvcHlfdG9fdXNlcihpb19kYXRhLT5pb3ZlY1tpXS5pb3ZfYmFzZSwKKwkJCQkJCSAmaW9fZGF0YS0+YnVmW3Bvc10sCisJCQkJCQkgaW9fZGF0YS0+aW92ZWNbaV0uaW92X2xlbikpKSB7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXBvcyArPSBpb19kYXRhLT5pb3ZlY1tpXS5pb3ZfbGVuOworCQl9CisJCXVudXNlX21tKGlvX2RhdGEtPm1tKTsKKwl9CisKKwlhaW9fY29tcGxldGUoaW9fZGF0YS0+a2lvY2IsIHJldCwgcmV0KTsKKworCXVzYl9lcF9mcmVlX3JlcXVlc3QoaW9fZGF0YS0+ZXAsIGlvX2RhdGEtPnJlcSk7CisKKwlpb19kYXRhLT5raW9jYi0+cHJpdmF0ZSA9IE5VTEw7CisJaWYgKGlvX2RhdGEtPnJlYWQpCisJCWtmcmVlKGlvX2RhdGEtPmlvdmVjKTsKKwlrZnJlZShpb19kYXRhLT5idWYpOworCWtmcmVlKGlvX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCBmZnNfZXBmaWxlX2FzeW5jX2lvX2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAgKl9lcCwKKwkJCQkJIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBmZnNfaW9fZGF0YSAqaW9fZGF0YSA9IHJlcS0+Y29udGV4dDsKKworCUVOVEVSKCk7CisKKwlJTklUX1dPUksoJmlvX2RhdGEtPndvcmssIGZmc191c2VyX2NvcHlfd29ya2VyKTsKKwlzY2hlZHVsZV93b3JrKCZpb19kYXRhLT53b3JrKTsKK30KKworc3RhdGljIHNzaXplX3QgZmZzX2VwZmlsZV9pbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZmc19pb19kYXRhICppb19kYXRhKQogewogCXN0cnVjdCBmZnNfZXBmaWxlICplcGZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGZmc19lcCAqZXA7CkBAIC02MTIsNyArNzMxLDcgQEAKIAl9CiAKIAkvKiBEbyB3ZSBoYWx0PyAqLwotCWhhbHQgPSAhcmVhZCA9PSAhZXBmaWxlLT5pbjsKKwloYWx0ID0gKCFpb19kYXRhLT5yZWFkID09ICFlcGZpbGUtPmluKTsKIAlpZiAoaGFsdCAmJiBlcGZpbGUtPmlzb2MpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnJvcjsKQEAgLTYzMCwxNSArNzQ5LDMyIEBACiAJCSAqIENvbnRyb2xsZXIgbWF5IHJlcXVpcmUgYnVmZmVyIHNpemUgdG8gYmUgYWxpZ25lZCB0bwogCQkgKiBtYXhwYWNrZXRzaXplIG9mIGFuIG91dCBlbmRwb2ludC4KIAkJICovCi0JCWRhdGFfbGVuID0gcmVhZCA/IHVzYl9lcF9hbGlnbl9tYXliZShnYWRnZXQsIGVwLT5lcCwgbGVuKSA6IGxlbjsKKwkJZGF0YV9sZW4gPSBpb19kYXRhLT5yZWFkID8KKwkJCSAgIHVzYl9lcF9hbGlnbl9tYXliZShnYWRnZXQsIGVwLT5lcCwgaW9fZGF0YS0+bGVuKSA6CisJCQkgICBpb19kYXRhLT5sZW47CiAKIAkJZGF0YSA9IGttYWxsb2MoZGF0YV9sZW4sIEdGUF9LRVJORUwpOwogCQlpZiAodW5saWtlbHkoIWRhdGEpKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJaWYgKCFyZWFkICYmIHVubGlrZWx5KGNvcHlfZnJvbV91c2VyKGRhdGEsIGJ1ZiwgbGVuKSkpIHsKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGVycm9yOworCQlpZiAoaW9fZGF0YS0+YWlvICYmICFpb19kYXRhLT5yZWFkKSB7CisJCQlpbnQgaTsKKwkJCXNpemVfdCBwb3MgPSAwOworCQkJZm9yIChpID0gMDsgaSA8IGlvX2RhdGEtPm5yX3NlZ3M7IGkrKykgeworCQkJCWlmICh1bmxpa2VseShjb3B5X2Zyb21fdXNlcigmZGF0YVtwb3NdLAorCQkJCQkgICAgIGlvX2RhdGEtPmlvdmVjW2ldLmlvdl9iYXNlLAorCQkJCQkgICAgIGlvX2RhdGEtPmlvdmVjW2ldLmlvdl9sZW4pKSkgeworCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKwkJCQlwb3MgKz0gaW9fZGF0YS0+aW92ZWNbaV0uaW92X2xlbjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghaW9fZGF0YS0+cmVhZCAmJgorCQkJICAgIHVubGlrZWx5KF9fY29weV9mcm9tX3VzZXIoZGF0YSwgaW9fZGF0YS0+YnVmLAorCQkJCQkJICAgICAgaW9fZGF0YS0+bGVuKSkpIHsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTY2MSw0MCArNzk3LDc4IEBACiAJCXJldCA9IC1FQkFETVNHOwogCX0gZWxzZSB7CiAJCS8qIEZpcmUgdGhlIHJlcXVlc3QgKi8KLQkJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soZG9uZSk7CisJCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxOwogCi0JCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxID0gZXAtPnJlcTsKLQkJcmVxLT5jb250ZXh0ICA9ICZkb25lOwotCQlyZXEtPmNvbXBsZXRlID0gZmZzX2VwZmlsZV9pb19jb21wbGV0ZTsKLQkJcmVxLT5idWYgICAgICA9IGRhdGE7Ci0JCXJlcS0+bGVuZ3RoICAgPSBkYXRhX2xlbjsKKwkJaWYgKGlvX2RhdGEtPmFpbykgeworCQkJcmVxID0gdXNiX2VwX2FsbG9jX3JlcXVlc3QoZXAtPmVwLCBHRlBfS0VSTkVMKTsKKwkJCWlmICh1bmxpa2VseSghcmVxKSkKKwkJCQlnb3RvIGVycm9yX2xvY2s7CiAKLQkJcmV0ID0gdXNiX2VwX3F1ZXVlKGVwLT5lcCwgcmVxLCBHRlBfQVRPTUlDKTsKKwkJCXJlcS0+YnVmICAgICAgPSBkYXRhOworCQkJcmVxLT5sZW5ndGggICA9IGlvX2RhdGEtPmxlbjsKIAotCQlzcGluX3VubG9ja19pcnEoJmVwZmlsZS0+ZmZzLT5lcHNfbG9jayk7CisJCQlpb19kYXRhLT5idWYgPSBkYXRhOworCQkJaW9fZGF0YS0+ZXAgPSBlcC0+ZXA7CisJCQlpb19kYXRhLT5yZXEgPSByZXE7CiAKLQkJaWYgKHVubGlrZWx5KHJldCA8IDApKSB7Ci0JCQkvKiBub3AgKi8KLQkJfSBlbHNlIGlmICh1bmxpa2VseSh3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmRvbmUpKSkgewotCQkJcmV0ID0gLUVJTlRSOwotCQkJdXNiX2VwX2RlcXVldWUoZXAtPmVwLCByZXEpOworCQkJcmVxLT5jb250ZXh0ICA9IGlvX2RhdGE7CisJCQlyZXEtPmNvbXBsZXRlID0gZmZzX2VwZmlsZV9hc3luY19pb19jb21wbGV0ZTsKKworCQkJcmV0ID0gdXNiX2VwX3F1ZXVlKGVwLT5lcCwgcmVxLCBHRlBfQVRPTUlDKTsKKwkJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQkJdXNiX2VwX2ZyZWVfcmVxdWVzdChlcC0+ZXAsIHJlcSk7CisJCQkJZ290byBlcnJvcl9sb2NrOworCQkJfQorCQkJcmV0ID0gLUVJT0NCUVVFVUVEOworCisJCQlzcGluX3VubG9ja19pcnEoJmVwZmlsZS0+ZmZzLT5lcHNfbG9jayk7CiAJCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogWFhYIFdlIG1heSBlbmQgdXAgc2lsZW50bHkgZHJvcGluZyBkYXRhIGhlcmUuCi0JCQkgKiBTaW5jZSBkYXRhX2xlbiAoaS5lLiByZXEtPmxlbmd0aCkgbWF5IGJlIGJpZ2dlcgotCQkJICogdGhhbiBsZW4gKGFmdGVyIGJlaW5nIHJvdW5kZWQgdXAgdG8gbWF4cGFja2V0c2l6ZSksCi0JCQkgKiB3ZSBtYXkgZW5kIHVwIHdpdGggbW9yZSBkYXRhIHRoZW4gdXNlciBzcGFjZSBoYXMKLQkJCSAqIHNwYWNlIGZvci4KLQkJCSAqLwotCQkJcmV0ID0gZXAtPnN0YXR1czsKLQkJCWlmIChyZWFkICYmIHJldCA+IDAgJiYKLQkJCSAgICB1bmxpa2VseShjb3B5X3RvX3VzZXIoYnVmLCBkYXRhLAotCQkJCQkJICBtaW5fdChzaXplX3QsIHJldCwgbGVuKSkpKQotCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyhkb25lKTsKKworCQkJcmVxID0gZXAtPnJlcTsKKwkJCXJlcS0+YnVmICAgICAgPSBkYXRhOworCQkJcmVxLT5sZW5ndGggICA9IGlvX2RhdGEtPmxlbjsKKworCQkJcmVxLT5jb250ZXh0ICA9ICZkb25lOworCQkJcmVxLT5jb21wbGV0ZSA9IGZmc19lcGZpbGVfaW9fY29tcGxldGU7CisKKwkJCXJldCA9IHVzYl9lcF9xdWV1ZShlcC0+ZXAsIHJlcSwgR0ZQX0FUT01JQyk7CisKKwkJCXNwaW5fdW5sb2NrX2lycSgmZXBmaWxlLT5mZnMtPmVwc19sb2NrKTsKKworCQkJaWYgKHVubGlrZWx5KHJldCA8IDApKSB7CisJCQkJLyogbm9wICovCisJCQl9IGVsc2UgaWYgKHVubGlrZWx5KAorCQkJCSAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmZG9uZSkpKSB7CisJCQkJcmV0ID0gLUVJTlRSOworCQkJCXVzYl9lcF9kZXF1ZXVlKGVwLT5lcCwgcmVxKTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBYWFggV2UgbWF5IGVuZCB1cCBzaWxlbnRseSBkcm9waW5nIGRhdGEKKwkJCQkgKiBoZXJlLiAgU2luY2UgZGF0YV9sZW4gKGkuZS4gcmVxLT5sZW5ndGgpIG1heQorCQkJCSAqIGJlIGJpZ2dlciB0aGFuIGxlbiAoYWZ0ZXIgYmVpbmcgcm91bmRlZCB1cAorCQkJCSAqIHRvIG1heHBhY2tldHNpemUpLCB3ZSBtYXkgZW5kIHVwIHdpdGggbW9yZQorCQkJCSAqIGRhdGEgdGhlbiB1c2VyIHNwYWNlIGhhcyBzcGFjZSBmb3IuCisJCQkJICovCisJCQkJcmV0ID0gZXAtPnN0YXR1czsKKwkJCQlpZiAoaW9fZGF0YS0+cmVhZCAmJiByZXQgPiAwKSB7CisJCQkJCXJldCA9IG1pbl90KHNpemVfdCwgcmV0LCBpb19kYXRhLT5sZW4pOworCisJCQkJCWlmICh1bmxpa2VseShjb3B5X3RvX3VzZXIoaW9fZGF0YS0+YnVmLAorCQkJCQkJZGF0YSwgcmV0KSkpCisJCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCX0KKwkJCX0KKwkJCWtmcmVlKGRhdGEpOwogCQl9CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZlcGZpbGUtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworCitlcnJvcl9sb2NrOgorCXNwaW5fdW5sb2NrX2lycSgmZXBmaWxlLT5mZnMtPmVwc19sb2NrKTsKKwltdXRleF91bmxvY2soJmVwZmlsZS0+bXV0ZXgpOwogZXJyb3I6CiAJa2ZyZWUoZGF0YSk7CiAJcmV0dXJuIHJldDsKQEAgLTcwNCwxNyArODc4LDMxIEBACiBmZnNfZXBmaWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLAogCQkgbG9mZl90ICpwdHIpCiB7CisJc3RydWN0IGZmc19pb19kYXRhIGlvX2RhdGE7CisKIAlFTlRFUigpOwogCi0JcmV0dXJuIGZmc19lcGZpbGVfaW8oZmlsZSwgKGNoYXIgX191c2VyICopYnVmLCBsZW4sIDApOworCWlvX2RhdGEuYWlvID0gZmFsc2U7CisJaW9fZGF0YS5yZWFkID0gZmFsc2U7CisJaW9fZGF0YS5idWYgPSAoY2hhciAqIF9fdXNlcilidWY7CisJaW9fZGF0YS5sZW4gPSBsZW47CisKKwlyZXR1cm4gZmZzX2VwZmlsZV9pbyhmaWxlLCAmaW9fZGF0YSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90CiBmZnNfZXBmaWxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHRyKQogeworCXN0cnVjdCBmZnNfaW9fZGF0YSBpb19kYXRhOworCiAJRU5URVIoKTsKIAotCXJldHVybiBmZnNfZXBmaWxlX2lvKGZpbGUsIGJ1ZiwgbGVuLCAxKTsKKwlpb19kYXRhLmFpbyA9IGZhbHNlOworCWlvX2RhdGEucmVhZCA9IHRydWU7CisJaW9fZGF0YS5idWYgPSBidWY7CisJaW9fZGF0YS5sZW4gPSBsZW47CisKKwlyZXR1cm4gZmZzX2VwZmlsZV9pbyhmaWxlLCAmaW9fZGF0YSk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTczMyw2ICs5MjEsODkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBmZnNfYWlvX2NhbmNlbChzdHJ1Y3Qga2lvY2IgKmtpb2NiKQoreworCXN0cnVjdCBmZnNfaW9fZGF0YSAqaW9fZGF0YSA9IGtpb2NiLT5wcml2YXRlOworCXN0cnVjdCBmZnNfZXBmaWxlICplcGZpbGUgPSBraW9jYi0+a2lfZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCB2YWx1ZTsKKworCUVOVEVSKCk7CisKKwlzcGluX2xvY2tfaXJxKCZlcGZpbGUtPmZmcy0+ZXBzX2xvY2spOworCisJaWYgKGxpa2VseShpb19kYXRhICYmIGlvX2RhdGEtPmVwICYmIGlvX2RhdGEtPnJlcSkpCisJCXZhbHVlID0gdXNiX2VwX2RlcXVldWUoaW9fZGF0YS0+ZXAsIGlvX2RhdGEtPnJlcSk7CisJZWxzZQorCQl2YWx1ZSA9IC1FSU5WQUw7CisKKwlzcGluX3VubG9ja19pcnEoJmVwZmlsZS0+ZmZzLT5lcHNfbG9jayk7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZmc19lcGZpbGVfYWlvX3dyaXRlKHN0cnVjdCBraW9jYiAqa2lvY2IsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92ZWMsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IGxvZmYpCit7CisJc3RydWN0IGZmc19pb19kYXRhICppb19kYXRhOworCisJRU5URVIoKTsKKworCWlvX2RhdGEgPSBrbWFsbG9jKHNpemVvZigqaW9fZGF0YSksIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghaW9fZGF0YSkpCisJCXJldHVybiAtRU5PTUVNOworCisJaW9fZGF0YS0+YWlvID0gdHJ1ZTsKKwlpb19kYXRhLT5yZWFkID0gZmFsc2U7CisJaW9fZGF0YS0+a2lvY2IgPSBraW9jYjsKKwlpb19kYXRhLT5pb3ZlYyA9IGlvdmVjOworCWlvX2RhdGEtPm5yX3NlZ3MgPSBucl9zZWdzOworCWlvX2RhdGEtPmxlbiA9IGtpb2NiLT5raV9uYnl0ZXM7CisJaW9fZGF0YS0+bW0gPSBjdXJyZW50LT5tbTsKKworCWtpb2NiLT5wcml2YXRlID0gaW9fZGF0YTsKKworCWtpb2NiX3NldF9jYW5jZWxfZm4oa2lvY2IsIGZmc19haW9fY2FuY2VsKTsKKworCXJldHVybiBmZnNfZXBmaWxlX2lvKGtpb2NiLT5raV9maWxwLCBpb19kYXRhKTsKK30KKworc3RhdGljIHNzaXplX3QgZmZzX2VwZmlsZV9haW9fcmVhZChzdHJ1Y3Qga2lvY2IgKmtpb2NiLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92ZWMsCisJCQkJICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgbG9mZikKK3sKKwlzdHJ1Y3QgZmZzX2lvX2RhdGEgKmlvX2RhdGE7CisJc3RydWN0IGlvdmVjICppb3ZlY19jb3B5OworCisJRU5URVIoKTsKKworCWlvdmVjX2NvcHkgPSBrbWFsbG9jX2FycmF5KG5yX3NlZ3MsIHNpemVvZigqaW92ZWNfY29weSksIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghaW92ZWNfY29weSkpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtY3B5KGlvdmVjX2NvcHksIGlvdmVjLCBzaXplb2Yoc3RydWN0IGlvdmVjKSpucl9zZWdzKTsKKworCWlvX2RhdGEgPSBrbWFsbG9jKHNpemVvZigqaW9fZGF0YSksIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghaW9fZGF0YSkpIHsKKwkJa2ZyZWUoaW92ZWNfY29weSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlvX2RhdGEtPmFpbyA9IHRydWU7CisJaW9fZGF0YS0+cmVhZCA9IHRydWU7CisJaW9fZGF0YS0+a2lvY2IgPSBraW9jYjsKKwlpb19kYXRhLT5pb3ZlYyA9IGlvdmVjX2NvcHk7CisJaW9fZGF0YS0+bnJfc2VncyA9IG5yX3NlZ3M7CisJaW9fZGF0YS0+bGVuID0ga2lvY2ItPmtpX25ieXRlczsKKwlpb19kYXRhLT5tbSA9IGN1cnJlbnQtPm1tOworCisJa2lvY2ItPnByaXZhdGUgPSBpb19kYXRhOworCisJa2lvY2Jfc2V0X2NhbmNlbF9mbihraW9jYiwgZmZzX2Fpb19jYW5jZWwpOworCisJcmV0dXJuIGZmc19lcGZpbGVfaW8oa2lvY2ItPmtpX2ZpbHAsIGlvX2RhdGEpOworfQorCiBzdGF0aWMgaW50CiBmZnNfZXBmaWxlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CkBAIC03ODksNiArMTA2MCw4IEBACiAJLm9wZW4gPQkJZmZzX2VwZmlsZV9vcGVuLAogCS53cml0ZSA9CWZmc19lcGZpbGVfd3JpdGUsCiAJLnJlYWQgPQkJZmZzX2VwZmlsZV9yZWFkLAorCS5haW9fd3JpdGUgPQlmZnNfZXBmaWxlX2Fpb193cml0ZSwKKwkuYWlvX3JlYWQgPQlmZnNfZXBmaWxlX2Fpb19yZWFkLAogCS5yZWxlYXNlID0JZmZzX2VwZmlsZV9yZWxlYXNlLAogCS51bmxvY2tlZF9pb2N0bCA9CWZmc19lcGZpbGVfaW9jdGwsCiB9OwpAQCAtMTE3Miw3ICsxNDQ1LDcgQEAKIAlpZiAoZmZzLT5lcGZpbGVzKQogCQlmZnNfZXBmaWxlc19kZXN0cm95KGZmcy0+ZXBmaWxlcywgZmZzLT5lcHNfY291bnQpOwogCi0Ja2ZyZWUoZmZzLT5yYXdfZGVzY3MpOworCWtmcmVlKGZmcy0+cmF3X2Rlc2NzX2RhdGEpOwogCWtmcmVlKGZmcy0+cmF3X3N0cmluZ3MpOwogCWtmcmVlKGZmcy0+c3RyaW5ndGFicyk7CiB9CkBAIC0xMTg0LDE0ICsxNDU3LDE1IEBACiAJZmZzX2RhdGFfY2xlYXIoZmZzKTsKIAogCWZmcy0+ZXBmaWxlcyA9IE5VTEw7CisJZmZzLT5yYXdfZGVzY3NfZGF0YSA9IE5VTEw7CiAJZmZzLT5yYXdfZGVzY3MgPSBOVUxMOwogCWZmcy0+cmF3X3N0cmluZ3MgPSBOVUxMOwogCWZmcy0+c3RyaW5ndGFicyA9IE5VTEw7CiAKIAlmZnMtPnJhd19kZXNjc19sZW5ndGggPSAwOwotCWZmcy0+cmF3X2ZzX2Rlc2NzX2xlbmd0aCA9IDA7CiAJZmZzLT5mc19kZXNjc19jb3VudCA9IDA7CiAJZmZzLT5oc19kZXNjc19jb3VudCA9IDA7CisJZmZzLT5zc19kZXNjc19jb3VudCA9IDA7CiAKIAlmZnMtPnN0cmluZ3NfY291bnQgPSAwOwogCWZmcy0+aW50ZXJmYWNlc19jb3VudCA9IDA7CkBAIC0xMzM0LDcgKzE2MDgsMjQgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZnVuYy0+ZmZzLT5lcHNfbG9jaywgZmxhZ3MpOwogCWRvIHsKIAkJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkczsKLQkJZHMgPSBlcC0+ZGVzY3NbZXAtPmRlc2NzWzFdID8gMSA6IDBdOworCQlpbnQgZGVzY19pZHg7CisKKwkJaWYgKGZmcy0+Z2FkZ2V0LT5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIpCisJCQlkZXNjX2lkeCA9IDI7CisJCWVsc2UgaWYgKGZmcy0+Z2FkZ2V0LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKKwkJCWRlc2NfaWR4ID0gMTsKKwkJZWxzZQorCQkJZGVzY19pZHggPSAwOworCisJCS8qIGZhbGwtYmFjayB0byBsb3dlciBzcGVlZCBpZiBkZXNjIG1pc3NpbmcgZm9yIGN1cnJlbnQgc3BlZWQgKi8KKwkJZG8geworCQkJZHMgPSBlcC0+ZGVzY3NbZGVzY19pZHhdOworCQl9IHdoaWxlICghZHMgJiYgLS1kZXNjX2lkeCA+PSAwKTsKKworCQlpZiAoIWRzKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KIAogCQllcC0+ZXAtPmRyaXZlcl9kYXRhID0gZXA7CiAJCWVwLT5lcC0+ZGVzYyA9IGRzOwpAQCAtMTQ2OSw2ICsxNzYwLDEyIEBACiAJfQogCQlicmVhazsKIAorCWNhc2UgVVNCX0RUX1NTX0VORFBPSU5UX0NPTVA6CisJCXByX3ZkZWJ1ZygiRVAgU1MgY29tcGFuaW9uIGRlc2NyaXB0b3JcbiIpOworCQlpZiAobGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvcikpCisJCQlnb3RvIGludl9sZW5ndGg7CisJCWJyZWFrOworCiAJY2FzZSBVU0JfRFRfT1RIRVJfU1BFRURfQ09ORklHOgogCWNhc2UgVVNCX0RUX0lOVEVSRkFDRV9QT1dFUjoKIAljYXNlIFVTQl9EVF9ERUJVRzoKQEAgLTE1NzksNjAgKzE4NzYsNzYgQEAKIHN0YXRpYyBpbnQgX19mZnNfZGF0YV9nb3RfZGVzY3Moc3RydWN0IGZmc19kYXRhICpmZnMsCiAJCQkJY2hhciAqY29uc3QgX2RhdGEsIHNpemVfdCBsZW4pCiB7Ci0JdW5zaWduZWQgZnNfY291bnQsIGhzX2NvdW50OwotCWludCBmc19sZW4sIHJldCA9IC1FSU5WQUw7Ci0JY2hhciAqZGF0YSA9IF9kYXRhOworCWNoYXIgKmRhdGEgPSBfZGF0YSwgKnJhd19kZXNjczsKKwl1bnNpZ25lZCBjb3VudHNbM10sIGZsYWdzOworCWludCByZXQgPSAtRUlOVkFMLCBpOwogCiAJRU5URVIoKTsKIAotCWlmICh1bmxpa2VseShnZXRfdW5hbGlnbmVkX2xlMzIoZGF0YSkgIT0gRlVOQ1RJT05GU19ERVNDUklQVE9SU19NQUdJQyB8fAotCQkgICAgIGdldF91bmFsaWduZWRfbGUzMihkYXRhICsgNCkgIT0gbGVuKSkKKwlpZiAoZ2V0X3VuYWxpZ25lZF9sZTMyKGRhdGEgKyA0KSAhPSBsZW4pCiAJCWdvdG8gZXJyb3I7Ci0JZnNfY291bnQgPSBnZXRfdW5hbGlnbmVkX2xlMzIoZGF0YSArICA4KTsKLQloc19jb3VudCA9IGdldF91bmFsaWduZWRfbGUzMihkYXRhICsgMTIpOwogCi0JaWYgKCFmc19jb3VudCAmJiAhaHNfY291bnQpCi0JCWdvdG8gZWludmFsOwotCi0JZGF0YSArPSAxNjsKLQlsZW4gIC09IDE2OwotCi0JaWYgKGxpa2VseShmc19jb3VudCkpIHsKLQkJZnNfbGVuID0gZmZzX2RvX2Rlc2NzKGZzX2NvdW50LCBkYXRhLCBsZW4sCi0JCQkJICAgICAgX19mZnNfZGF0YV9kb19lbnRpdHksIGZmcyk7Ci0JCWlmICh1bmxpa2VseShmc19sZW4gPCAwKSkgewotCQkJcmV0ID0gZnNfbGVuOworCXN3aXRjaCAoZ2V0X3VuYWxpZ25lZF9sZTMyKGRhdGEpKSB7CisJY2FzZSBGVU5DVElPTkZTX0RFU0NSSVBUT1JTX01BR0lDOgorCQlmbGFncyA9IEZVTkNUSU9ORlNfSEFTX0ZTX0RFU0MgfCBGVU5DVElPTkZTX0hBU19IU19ERVNDOworCQlkYXRhICs9IDg7CisJCWxlbiAgLT0gODsKKwkJYnJlYWs7CisJY2FzZSBGVU5DVElPTkZTX0RFU0NSSVBUT1JTX01BR0lDX1YyOgorCQlmbGFncyA9IGdldF91bmFsaWduZWRfbGUzMihkYXRhICsgOCk7CisJCWlmIChmbGFncyAmIH4oRlVOQ1RJT05GU19IQVNfRlNfREVTQyB8CisJCQkgICAgICBGVU5DVElPTkZTX0hBU19IU19ERVNDIHwKKwkJCSAgICAgIEZVTkNUSU9ORlNfSEFTX1NTX0RFU0MpKSB7CisJCQlyZXQgPSAtRU5PU1lTOwogCQkJZ290byBlcnJvcjsKIAkJfQotCi0JCWRhdGEgKz0gZnNfbGVuOwotCQlsZW4gIC09IGZzX2xlbjsKLQl9IGVsc2UgewotCQlmc19sZW4gPSAwOworCQlkYXRhICs9IDEyOworCQlsZW4gIC09IDEyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIGVycm9yOwogCX0KIAotCWlmIChsaWtlbHkoaHNfY291bnQpKSB7Ci0JCXJldCA9IGZmc19kb19kZXNjcyhoc19jb3VudCwgZGF0YSwgbGVuLAotCQkJCSAgIF9fZmZzX2RhdGFfZG9fZW50aXR5LCBmZnMpOwotCQlpZiAodW5saWtlbHkocmV0IDwgMCkpCisJLyogUmVhZCBmc19jb3VudCwgaHNfY291bnQgYW5kIHNzX2NvdW50IChpZiBwcmVzZW50KSAqLworCWZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKKwkJaWYgKCEoZmxhZ3MgJiAoMSA8PCBpKSkpIHsKKwkJCWNvdW50c1tpXSA9IDA7CisJCX0gZWxzZSBpZiAobGVuIDwgNCkgewogCQkJZ290byBlcnJvcjsKLQl9IGVsc2UgewotCQlyZXQgPSAwOworCQl9IGVsc2UgeworCQkJY291bnRzW2ldID0gZ2V0X3VuYWxpZ25lZF9sZTMyKGRhdGEpOworCQkJZGF0YSArPSA0OworCQkJbGVuICAtPSA0OworCQl9CiAJfQogCi0JaWYgKHVubGlrZWx5KGxlbiAhPSByZXQpKQotCQlnb3RvIGVpbnZhbDsKKwkvKiBSZWFkIGRlc2NyaXB0b3JzICovCisJcmF3X2Rlc2NzID0gZGF0YTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7CisJCWlmICghY291bnRzW2ldKQorCQkJY29udGludWU7CisJCXJldCA9IGZmc19kb19kZXNjcyhjb3VudHNbaV0sIGRhdGEsIGxlbiwKKwkJCQkgICBfX2Zmc19kYXRhX2RvX2VudGl0eSwgZmZzKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yOworCQlkYXRhICs9IHJldDsKKwkJbGVuICAtPSByZXQ7CisJfQogCi0JZmZzLT5yYXdfZnNfZGVzY3NfbGVuZ3RoID0gZnNfbGVuOwotCWZmcy0+cmF3X2Rlc2NzX2xlbmd0aCAgICA9IGZzX2xlbiArIHJldDsKLQlmZnMtPnJhd19kZXNjcyAgICAgICAgICAgPSBfZGF0YTsKLQlmZnMtPmZzX2Rlc2NzX2NvdW50ICAgICAgPSBmc19jb3VudDsKLQlmZnMtPmhzX2Rlc2NzX2NvdW50ICAgICAgPSBoc19jb3VudDsKKwlpZiAocmF3X2Rlc2NzID09IGRhdGEgfHwgbGVuKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZmZzLT5yYXdfZGVzY3NfZGF0YQk9IF9kYXRhOworCWZmcy0+cmF3X2Rlc2NzCQk9IHJhd19kZXNjczsKKwlmZnMtPnJhd19kZXNjc19sZW5ndGgJPSBkYXRhIC0gcmF3X2Rlc2NzOworCWZmcy0+ZnNfZGVzY3NfY291bnQJPSBjb3VudHNbMF07CisJZmZzLT5oc19kZXNjc19jb3VudAk9IGNvdW50c1sxXTsKKwlmZnMtPnNzX2Rlc2NzX2NvdW50CT0gY291bnRzWzJdOwogCiAJcmV0dXJuIDA7CiAKLWVpbnZhbDoKLQlyZXQgPSAtRUlOVkFMOwogZXJyb3I6CiAJa2ZyZWUoX2RhdGEpOwogCXJldHVybiByZXQ7CkBAIC0xNzg5LDcgKzIxMDIsNyBAQAogCSAqIHRoZSBzb3VyY2UgZG9lcyBub3RoaW5nLgogCSAqLwogCWlmIChmZnMtPnNldHVwX3N0YXRlID09IEZGU19TRVRVUF9QRU5ESU5HKQotCQlmZnMtPnNldHVwX3N0YXRlID0gRkZTX1NFVFVQX0NBTkNFTEVEOworCQlmZnMtPnNldHVwX3N0YXRlID0gRkZTX1NFVFVQX0NBTkNFTExFRDsKIAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgRlVOQ1RJT05GU19SRVNVTUU6CkBAIC0xODUwLDIxICsyMTYzLDI4IEBACiAJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkcyA9ICh2b2lkICopZGVzYzsKIAlzdHJ1Y3QgZmZzX2Z1bmN0aW9uICpmdW5jID0gcHJpdjsKIAlzdHJ1Y3QgZmZzX2VwICpmZnNfZXA7Ci0KLQkvKgotCSAqIElmIGhzX2Rlc2NyaXB0b3JzIGlzIG5vdCBOVUxMIHRoZW4gd2UgYXJlIHJlYWRpbmcgaHMKLQkgKiBkZXNjcmlwdG9ycyBub3cKLQkgKi8KLQljb25zdCBpbnQgaXNIUyA9IGZ1bmMtPmZ1bmN0aW9uLmhzX2Rlc2NyaXB0b3JzICE9IE5VTEw7Ci0JdW5zaWduZWQgaWR4OworCXVuc2lnbmVkIGVwX2Rlc2NfaWQsIGlkeDsKKwlzdGF0aWMgY29uc3QgY2hhciAqc3BlZWRfbmFtZXNbXSA9IHsgImZ1bGwiLCAiaGlnaCIsICJzdXBlciIgfTsKIAogCWlmICh0eXBlICE9IEZGU19ERVNDUklQVE9SKQogCQlyZXR1cm4gMDsKIAotCWlmIChpc0hTKQorCS8qCisJICogSWYgc3NfZGVzY3JpcHRvcnMgaXMgbm90IE5VTEwsIHdlIGFyZSByZWFkaW5nIHN1cGVyIHNwZWVkCisJICogZGVzY3JpcHRvcnM7IGlmIGhzX2Rlc2NyaXB0b3JzIGlzIG5vdCBOVUxMLCB3ZSBhcmUgcmVhZGluZyBoaWdoCisJICogc3BlZWQgZGVzY3JpcHRvcnM7IG90aGVyd2lzZSwgd2UgYXJlIHJlYWRpbmcgZnVsbCBzcGVlZAorCSAqIGRlc2NyaXB0b3JzLgorCSAqLworCWlmIChmdW5jLT5mdW5jdGlvbi5zc19kZXNjcmlwdG9ycykgeworCQllcF9kZXNjX2lkID0gMjsKKwkJZnVuYy0+ZnVuY3Rpb24uc3NfZGVzY3JpcHRvcnNbKGxvbmcpdmFsdWVwXSA9IGRlc2M7CisJfSBlbHNlIGlmIChmdW5jLT5mdW5jdGlvbi5oc19kZXNjcmlwdG9ycykgeworCQllcF9kZXNjX2lkID0gMTsKIAkJZnVuYy0+ZnVuY3Rpb24uaHNfZGVzY3JpcHRvcnNbKGxvbmcpdmFsdWVwXSA9IGRlc2M7Ci0JZWxzZQorCX0gZWxzZSB7CisJCWVwX2Rlc2NfaWQgPSAwOwogCQlmdW5jLT5mdW5jdGlvbi5mc19kZXNjcmlwdG9yc1sobG9uZyl2YWx1ZXBdICAgID0gZGVzYzsKKwl9CiAKIAlpZiAoIWRlc2MgfHwgZGVzYy0+YkRlc2NyaXB0b3JUeXBlICE9IFVTQl9EVF9FTkRQT0lOVCkKIAkJcmV0dXJuIDA7CkBAIC0xODcyLDEzICsyMTkyLDEzIEBACiAJaWR4ID0gKGRzLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKSAtIDE7CiAJZmZzX2VwID0gZnVuYy0+ZXBzICsgaWR4OwogCi0JaWYgKHVubGlrZWx5KGZmc19lcC0+ZGVzY3NbaXNIU10pKSB7Ci0JCXByX3ZkZWJ1ZygidHdvICVzc3BlZWQgZGVzY3JpcHRvcnMgZm9yIEVQICVkXG4iLAotCQkJICBpc0hTID8gImhpZ2giIDogImZ1bGwiLAorCWlmICh1bmxpa2VseShmZnNfZXAtPmRlc2NzW2VwX2Rlc2NfaWRdKSkgeworCQlwcl9lcnIoInR3byAlc3NwZWVkIGRlc2NyaXB0b3JzIGZvciBFUCAlZFxuIiwKKwkJCSAgc3BlZWRfbmFtZXNbZXBfZGVzY19pZF0sCiAJCQkgIGRzLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWZmc19lcC0+ZGVzY3NbaXNIU10gPSBkczsKKwlmZnNfZXAtPmRlc2NzW2VwX2Rlc2NfaWRdID0gZHM7CiAKIAlmZnNfZHVtcF9tZW0oIjogT3JpZ2luYWwgIGVwIGRlc2MiLCBkcywgZHMtPmJMZW5ndGgpOwogCWlmIChmZnNfZXAtPmVwKSB7CkBAIC0yMDIyLDggKzIzNDIsMTAgQEAKIAljb25zdCBpbnQgZnVsbCA9ICEhZnVuYy0+ZmZzLT5mc19kZXNjc19jb3VudDsKIAljb25zdCBpbnQgaGlnaCA9IGdhZGdldF9pc19kdWFsc3BlZWQoZnVuYy0+Z2FkZ2V0KSAmJgogCQlmdW5jLT5mZnMtPmhzX2Rlc2NzX2NvdW50OworCWNvbnN0IGludCBzdXBlciA9IGdhZGdldF9pc19zdXBlcnNwZWVkKGZ1bmMtPmdhZGdldCkgJiYKKwkJZnVuYy0+ZmZzLT5zc19kZXNjc19jb3VudDsKIAotCWludCByZXQ7CisJaW50IGZzX2xlbiwgaHNfbGVuLCByZXQ7CiAKIAkvKiBNYWtlIGl0IGEgc2luZ2xlIGNodW5rLCBsZXNzIG1hbmFnZW1lbnQgbGF0ZXIgb24gKi8KIAl2bGFfZ3JvdXAoZCk7CkBAIC0yMDMyLDE1ICsyMzU0LDE2IEBACiAJCWZ1bGwgPyBmZnMtPmZzX2Rlc2NzX2NvdW50ICsgMSA6IDApOwogCXZsYV9pdGVtX3dpdGhfc3ooZCwgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqLCBoc19kZXNjcywKIAkJaGlnaCA/IGZmcy0+aHNfZGVzY3NfY291bnQgKyAxIDogMCk7CisJdmxhX2l0ZW1fd2l0aF9zeihkLCBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICosIHNzX2Rlc2NzLAorCQlzdXBlciA/IGZmcy0+c3NfZGVzY3NfY291bnQgKyAxIDogMCk7CiAJdmxhX2l0ZW1fd2l0aF9zeihkLCBzaG9ydCwgaW51bXMsIGZmcy0+aW50ZXJmYWNlc19jb3VudCk7Ci0JdmxhX2l0ZW1fd2l0aF9zeihkLCBjaGFyLCByYXdfZGVzY3MsCi0JCWhpZ2ggPyBmZnMtPnJhd19kZXNjc19sZW5ndGggOiBmZnMtPnJhd19mc19kZXNjc19sZW5ndGgpOworCXZsYV9pdGVtX3dpdGhfc3ooZCwgY2hhciwgcmF3X2Rlc2NzLCBmZnMtPnJhd19kZXNjc19sZW5ndGgpOwogCWNoYXIgKnZsYWJ1ZjsKIAogCUVOVEVSKCk7CiAKLQkvKiBPbmx5IGhpZ2ggc3BlZWQgYnV0IG5vdCBzdXBwb3J0ZWQgYnkgZ2FkZ2V0PyAqLwotCWlmICh1bmxpa2VseSghKGZ1bGwgfCBoaWdoKSkpCisJLyogSGFzIGRlc2NyaXB0b3JzIG9ubHkgZm9yIHNwZWVkcyBnYWRnZXQgZG9lcyBub3Qgc3VwcG9ydCAqLworCWlmICh1bmxpa2VseSghKGZ1bGwgfCBoaWdoIHwgc3VwZXIpKSkKIAkJcmV0dXJuIC1FTk9UU1VQUDsKIAogCS8qIEFsbG9jYXRlIGEgc2luZ2xlIGNodW5rLCBsZXNzIG1hbmFnZW1lbnQgbGF0ZXIgb24gKi8KQEAgLTIwNTAsOCArMjM3MywxMCBAQAogCiAJLyogWmVybyAqLwogCW1lbXNldCh2bGFfcHRyKHZsYWJ1ZiwgZCwgZXBzKSwgMCwgZF9lcHNfX3N6KTsKLQltZW1jcHkodmxhX3B0cih2bGFidWYsIGQsIHJhd19kZXNjcyksIGZmcy0+cmF3X2Rlc2NzICsgMTYsCi0JICAgICAgIGRfcmF3X2Rlc2NzX19zeik7CisJLyogQ29weSBkZXNjcmlwdG9ycyAgKi8KKwltZW1jcHkodmxhX3B0cih2bGFidWYsIGQsIHJhd19kZXNjcyksIGZmcy0+cmF3X2Rlc2NzLAorCSAgICAgICBmZnMtPnJhd19kZXNjc19sZW5ndGgpOworCiAJbWVtc2V0KHZsYV9wdHIodmxhYnVmLCBkLCBpbnVtcyksIDB4ZmYsIGRfaW51bXNfX3N6KTsKIAlmb3IgKHJldCA9IGZmcy0+ZXBzX2NvdW50OyByZXQ7IC0tcmV0KSB7CiAJCXN0cnVjdCBmZnNfZXAgKnB0cjsKQEAgLTIwNzMsMjIgKzIzOTgsMzggQEAKIAkgKi8KIAlpZiAobGlrZWx5KGZ1bGwpKSB7CiAJCWZ1bmMtPmZ1bmN0aW9uLmZzX2Rlc2NyaXB0b3JzID0gdmxhX3B0cih2bGFidWYsIGQsIGZzX2Rlc2NzKTsKLQkJcmV0ID0gZmZzX2RvX2Rlc2NzKGZmcy0+ZnNfZGVzY3NfY291bnQsCi0JCQkJICAgdmxhX3B0cih2bGFidWYsIGQsIHJhd19kZXNjcyksCi0JCQkJICAgZF9yYXdfZGVzY3NfX3N6LAotCQkJCSAgIF9fZmZzX2Z1bmNfYmluZF9kb19kZXNjcywgZnVuYyk7Ci0JCWlmICh1bmxpa2VseShyZXQgPCAwKSkKKwkJZnNfbGVuID0gZmZzX2RvX2Rlc2NzKGZmcy0+ZnNfZGVzY3NfY291bnQsCisJCQkJICAgICAgdmxhX3B0cih2bGFidWYsIGQsIHJhd19kZXNjcyksCisJCQkJICAgICAgZF9yYXdfZGVzY3NfX3N6LAorCQkJCSAgICAgIF9fZmZzX2Z1bmNfYmluZF9kb19kZXNjcywgZnVuYyk7CisJCWlmICh1bmxpa2VseShmc19sZW4gPCAwKSkgeworCQkJcmV0ID0gZnNfbGVuOwogCQkJZ290byBlcnJvcjsKKwkJfQogCX0gZWxzZSB7Ci0JCXJldCA9IDA7CisJCWZzX2xlbiA9IDA7CiAJfQogCiAJaWYgKGxpa2VseShoaWdoKSkgewogCQlmdW5jLT5mdW5jdGlvbi5oc19kZXNjcmlwdG9ycyA9IHZsYV9wdHIodmxhYnVmLCBkLCBoc19kZXNjcyk7Ci0JCXJldCA9IGZmc19kb19kZXNjcyhmZnMtPmhzX2Rlc2NzX2NvdW50LAotCQkJCSAgIHZsYV9wdHIodmxhYnVmLCBkLCByYXdfZGVzY3MpICsgcmV0LAotCQkJCSAgIGRfcmF3X2Rlc2NzX19zeiAtIHJldCwKLQkJCQkgICBfX2Zmc19mdW5jX2JpbmRfZG9fZGVzY3MsIGZ1bmMpOworCQloc19sZW4gPSBmZnNfZG9fZGVzY3MoZmZzLT5oc19kZXNjc19jb3VudCwKKwkJCQkgICAgICB2bGFfcHRyKHZsYWJ1ZiwgZCwgcmF3X2Rlc2NzKSArIGZzX2xlbiwKKwkJCQkgICAgICBkX3Jhd19kZXNjc19fc3ogLSBmc19sZW4sCisJCQkJICAgICAgX19mZnNfZnVuY19iaW5kX2RvX2Rlc2NzLCBmdW5jKTsKKwkJaWYgKHVubGlrZWx5KGhzX2xlbiA8IDApKSB7CisJCQlyZXQgPSBoc19sZW47CisJCQlnb3RvIGVycm9yOworCQl9CisJfSBlbHNlIHsKKwkJaHNfbGVuID0gMDsKKwl9CisKKwlpZiAobGlrZWx5KHN1cGVyKSkgeworCQlmdW5jLT5mdW5jdGlvbi5zc19kZXNjcmlwdG9ycyA9IHZsYV9wdHIodmxhYnVmLCBkLCBzc19kZXNjcyk7CisJCXJldCA9IGZmc19kb19kZXNjcyhmZnMtPnNzX2Rlc2NzX2NvdW50LAorCQkJCXZsYV9wdHIodmxhYnVmLCBkLCByYXdfZGVzY3MpICsgZnNfbGVuICsgaHNfbGVuLAorCQkJCWRfcmF3X2Rlc2NzX19zeiAtIGZzX2xlbiAtIGhzX2xlbiwKKwkJCQlfX2Zmc19mdW5jX2JpbmRfZG9fZGVzY3MsIGZ1bmMpOwogCQlpZiAodW5saWtlbHkocmV0IDwgMCkpCiAJCQlnb3RvIGVycm9yOwogCX0KQEAgLTIwOTksNyArMjQ0MCw4IEBACiAJICogbm93LgogCSAqLwogCXJldCA9IGZmc19kb19kZXNjcyhmZnMtPmZzX2Rlc2NzX2NvdW50ICsKLQkJCSAgIChoaWdoID8gZmZzLT5oc19kZXNjc19jb3VudCA6IDApLAorCQkJICAgKGhpZ2ggPyBmZnMtPmhzX2Rlc2NzX2NvdW50IDogMCkgKworCQkJICAgKHN1cGVyID8gZmZzLT5zc19kZXNjc19jb3VudCA6IDApLAogCQkJICAgdmxhX3B0cih2bGFidWYsIGQsIHJhd19kZXNjcyksIGRfcmF3X2Rlc2NzX19zeiwKIAkJCSAgIF9fZmZzX2Z1bmNfYmluZF9kb19udW1zLCBmdW5jKTsKIAlpZiAodW5saWtlbHkocmV0IDwgMCkpCkBAIC0yMjU4LDcgKzI2MDAsNyBAQAogCiBzdGF0aWMgTElTVF9IRUFEKGZmc19kZXZpY2VzKTsKIAotc3RhdGljIHN0cnVjdCBmZnNfZGV2ICpfZmZzX2ZpbmRfZGV2KGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgc3RydWN0IGZmc19kZXYgKl9mZnNfZG9fZmluZF9kZXYoY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgZmZzX2RldiAqZGV2OwogCkBAIC0yMjc1LDcgKzI2MTcsNyBAQAogLyoKICAqIGZmc19sb2NrIG11c3QgYmUgdGFrZW4gYnkgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZmZzX2RldiAqZmZzX2dldF9zaW5nbGVfZGV2KHZvaWQpCitzdGF0aWMgc3RydWN0IGZmc19kZXYgKl9mZnNfZ2V0X3NpbmdsZV9kZXYodm9pZCkKIHsKIAlzdHJ1Y3QgZmZzX2RldiAqZGV2OwogCkBAIC0yMjkxLDE1ICsyNjMzLDE1IEBACiAvKgogICogZmZzX2xvY2sgbXVzdCBiZSB0YWtlbiBieSB0aGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24KICAqLwotc3RhdGljIHN0cnVjdCBmZnNfZGV2ICpmZnNfZmluZF9kZXYoY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyBzdHJ1Y3QgZmZzX2RldiAqX2Zmc19maW5kX2Rldihjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBmZnNfZGV2ICpkZXY7CiAKLQlkZXYgPSBmZnNfZ2V0X3NpbmdsZV9kZXYoKTsKKwlkZXYgPSBfZmZzX2dldF9zaW5nbGVfZGV2KCk7CiAJaWYgKGRldikKIAkJcmV0dXJuIGRldjsKIAotCXJldHVybiBfZmZzX2ZpbmRfZGV2KG5hbWUpOworCXJldHVybiBfZmZzX2RvX2ZpbmRfZGV2KG5hbWUpOwogfQogCiAvKiBDb25maWdmcyBzdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIzMzUsNyArMjY3Nyw3IEBACiAKIAlvcHRzID0gdG9fZl9mc19vcHRzKGYpOwogCWZmc19kZXZfbG9jaygpOwotCWZmc19mcmVlX2RldihvcHRzLT5kZXYpOworCV9mZnNfZnJlZV9kZXYob3B0cy0+ZGV2KTsKIAlmZnNfZGV2X3VubG9jaygpOwogCWtmcmVlKG9wdHMpOwogfQpAQCAtMjM5MCw3ICsyNzMyLDcgQEAKIAlvcHRzLT5mdW5jX2luc3Quc2V0X2luc3RfbmFtZSA9IGZmc19zZXRfaW5zdF9uYW1lOwogCW9wdHMtPmZ1bmNfaW5zdC5mcmVlX2Z1bmNfaW5zdCA9IGZmc19mcmVlX2luc3Q7CiAJZmZzX2Rldl9sb2NrKCk7Ci0JZGV2ID0gZmZzX2FsbG9jX2RldigpOworCWRldiA9IF9mZnNfYWxsb2NfZGV2KCk7CiAJZmZzX2Rldl91bmxvY2soKTsKIAlpZiAoSVNfRVJSKGRldikpIHsKIAkJa2ZyZWUob3B0cyk7CkBAIC0yNDQ2LDYgKzI3ODgsNyBAQAogCSAqLwogCWZ1bmMtPmZ1bmN0aW9uLmZzX2Rlc2NyaXB0b3JzID0gTlVMTDsKIAlmdW5jLT5mdW5jdGlvbi5oc19kZXNjcmlwdG9ycyA9IE5VTEw7CisJZnVuYy0+ZnVuY3Rpb24uc3NfZGVzY3JpcHRvcnMgPSBOVUxMOwogCWZ1bmMtPmludGVyZmFjZXNfbnVtcyA9IE5VTEw7CiAKIAlmZnNfZXZlbnRfYWRkKGZmcywgRlVOQ1RJT05GU19VTkJJTkQpOwpAQCAtMjQ3OCwxMiArMjgyMSwxMiBAQAogLyoKICAqIGZmc19sb2NrIG11c3QgYmUgdGFrZW4gYnkgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uCiAgKi8KLXN0cnVjdCBmZnNfZGV2ICpmZnNfYWxsb2NfZGV2KHZvaWQpCitzdGF0aWMgc3RydWN0IGZmc19kZXYgKl9mZnNfYWxsb2NfZGV2KHZvaWQpCiB7CiAJc3RydWN0IGZmc19kZXYgKmRldjsKIAlpbnQgcmV0OwogCi0JaWYgKGZmc19nZXRfc2luZ2xlX2RldigpKQorCWlmIChfZmZzX2dldF9zaW5nbGVfZGV2KCkpCiAJCQlyZXR1cm4gRVJSX1BUUigtRUJVU1kpOwogCiAJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwpAQCAtMjUxMSwxMCArMjg1NCwxMCBAQAogewogCXN0cnVjdCBmZnNfZGV2ICpleGlzdGluZzsKIAotCWV4aXN0aW5nID0gX2Zmc19maW5kX2RldihuYW1lKTsKKwlleGlzdGluZyA9IF9mZnNfZG9fZmluZF9kZXYobmFtZSk7CiAJaWYgKGV4aXN0aW5nKQogCQlyZXR1cm4gLUVCVVNZOwotCQorCiAJZGV2LT5uYW1lID0gbmFtZTsKIAogCXJldHVybiAwOwpAQCAtMjU1NSw3ICsyODk4LDcgQEAKIC8qCiAgKiBmZnNfbG9jayBtdXN0IGJlIHRha2VuIGJ5IHRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbgogICovCi12b2lkIGZmc19mcmVlX2RldihzdHJ1Y3QgZmZzX2RldiAqZGV2KQorc3RhdGljIHZvaWQgX2Zmc19mcmVlX2RldihzdHJ1Y3QgZmZzX2RldiAqZGV2KQogewogCWxpc3RfZGVsKCZkZXYtPmVudHJ5KTsKIAlpZiAoZGV2LT5uYW1lX2FsbG9jYXRlZCkKQEAgLTI1NzIsNyArMjkxNSw3IEBACiAJRU5URVIoKTsKIAlmZnNfZGV2X2xvY2soKTsKIAotCWZmc19kZXYgPSBmZnNfZmluZF9kZXYoZGV2X25hbWUpOworCWZmc19kZXYgPSBfZmZzX2ZpbmRfZGV2KGRldl9uYW1lKTsKIAlpZiAoIWZmc19kZXYpCiAJCWZmc19kZXYgPSBFUlJfUFRSKC1FTk9ERVYpOwogCWVsc2UgaWYgKGZmc19kZXYtPm1vdW50ZWQpCkBAIC0yNTk1LDExICsyOTM4LDEyIEBACiAJZmZzX2Rldl9sb2NrKCk7CiAKIAlmZnNfZGV2ID0gZmZzX2RhdGEtPnByaXZhdGVfZGF0YTsKLQlpZiAoZmZzX2RldikKKwlpZiAoZmZzX2RldikgewogCQlmZnNfZGV2LT5tb3VudGVkID0gZmFsc2U7Ci0JCi0JaWYgKGZmc19kZXYtPmZmc19yZWxlYXNlX2Rldl9jYWxsYmFjaykKLQkJZmZzX2Rldi0+ZmZzX3JlbGVhc2VfZGV2X2NhbGxiYWNrKGZmc19kZXYpOworCisJCWlmIChmZnNfZGV2LT5mZnNfcmVsZWFzZV9kZXZfY2FsbGJhY2spCisJCQlmZnNfZGV2LT5mZnNfcmVsZWFzZV9kZXZfY2FsbGJhY2soZmZzX2Rldik7CisJfQogCiAJZmZzX2Rldl91bmxvY2soKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX21pZGkuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX21pZGkuYwppbmRleCAzNmQ0YmIyLi44MDdiMzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9taWRpLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbWlkaS5jCkBAIC02NjQsOSArNjY0LDEwIEBACiAJCS5kZXZfZnJlZSA9IGZfbWlkaV9zbmRfZnJlZSwKIAl9OwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKG1pZGktPmluZGV4LCBtaWRpLT5pZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJm1pZGktPmdhZGdldC0+ZGV2LCBtaWRpLT5pbmRleCwgbWlkaS0+aWQsCisJCQkgICBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKSB7Ci0JCUVSUk9SKG1pZGksICJzbmRfY2FyZF9jcmVhdGUoKSBmYWlsZWRcbiIpOworCQlFUlJPUihtaWRpLCAic25kX2NhcmRfbmV3KCkgZmFpbGVkXG4iKTsKIAkJZ290byBmYWlsOwogCX0KIAltaWRpLT5jYXJkID0gY2FyZDsKQEAgLTcwMyw4ICs3MDQsNiBAQAogCXNuZF9yYXdtaWRpX3NldF9vcHMocm1pZGksIFNORFJWX1JBV01JRElfU1RSRUFNX09VVFBVVCwgJmdtaWRpX2luX29wcyk7CiAJc25kX3Jhd21pZGlfc2V0X29wcyhybWlkaSwgU05EUlZfUkFXTUlESV9TVFJFQU1fSU5QVVQsICZnbWlkaV9vdXRfb3BzKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJm1pZGktPmdhZGdldC0+ZGV2KTsKLQogCS8qIHJlZ2lzdGVyIGl0IC0gd2UncmUgcmVhZHkgdG8gZ28gKi8KIAllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfc3Vic2V0LmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9zdWJzZXQuYwppbmRleCBmMWE1OTE5Li5kZjRhMGRjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfc3Vic2V0LmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfc3Vic2V0LmMKQEAgLTI3Niw3ICsyNzYsNyBAQAogCX0KIAogCW5ldCA9IGdldGhlcl9jb25uZWN0KCZnZXRoLT5wb3J0KTsKLQlyZXR1cm4gSVNfRVJSKG5ldCkgPyBQVFJfRVJSKG5ldCkgOiAwOworCXJldHVybiBQVFJfUkVUKG5ldCk7CiB9CiAKIHN0YXRpYyB2b2lkIGdldGhfZGlzYWJsZShzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfdWFjMi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfdWFjMi5jCmluZGV4IDJmMjM1NjYuLmJjMjMwNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX3VhYzIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl91YWMyLmMKQEAgLTM5NCw3ICszOTQsNyBAQAogCWludCBlcnI7CiAKIAkvKiBDaG9vc2UgYW55IHNsb3QsIHdpdGggbm8gaWQgKi8KLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoLTEsIE5VTEwsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwZGV2LT5kZXYsIC0xLCBOVUxMLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC00MjEsOCArNDIxLDYgQEAKIAlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiVUFDMl9HYWRnZXQiKTsKIAlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiVUFDMl9HYWRnZXQgJWkiLCBwZGV2LT5pZCk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOwotCiAJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0NPTlRJTlVPVVMsCiAJCXNuZF9kbWFfY29udGludW91c19kYXRhKEdGUF9LRVJORUwpLCAwLCBCVUZGX1NJWkVfTUFYKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2dyX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2dyX3VkYy5jCmluZGV4IDkxNGNiZDguLmY5ODRlZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9ncl91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ3JfdWRjLmMKQEAgLTIyNSwxNCArMjI1LDggQEAKIAljb25zdCBjaGFyICpuYW1lID0gImdyX3VkY19zdGF0ZSI7CiAKIAlkZXYtPmRmc19yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKGRldl9uYW1lKGRldi0+ZGV2KSwgTlVMTCk7Ci0JaWYgKElTX0VSUihkZXYtPmRmc19yb290KSkgewotCQlkZXZfZXJyKGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGRpcmVjdG9yeVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JZGV2LT5kZnNfc3RhdGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIDA0NDQsIGRldi0+ZGZzX3Jvb3QsCi0JCQkJCSAgICAgZGV2LCAmZ3JfZGZzX2ZvcHMpOwotCWlmIChJU19FUlIoZGV2LT5kZnNfc3RhdGUpKQotCQlkZXZfZXJyKGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGZpbGUgJXNcbiIsIG5hbWUpOworCWRldi0+ZGZzX3N0YXRlID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCAwNDQ0LCBkZXYtPmRmc19yb290LCBkZXYsCisJCQkJCSAgICAgJmdyX2Rmc19mb3BzKTsKIH0KIAogc3RhdGljIHZvaWQgZ3JfZGZzX2RlbGV0ZShzdHJ1Y3QgZ3JfdWRjICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCmluZGV4IGI5NGMwNDkuLmI1YmU2ZjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYwpAQCAtNDM5LDExICs0MzksOSBAQAogCS8qIEZJWE1FIHdyaXRlYmVoaW5kIGZvciBPX05PTkJMT0NLIGFuZCBwb2xsKCksIHFsZW4gPSAxICovCiAKIAl2YWx1ZSA9IC1FTk9NRU07Ci0Ja2J1ZiA9IGttYWxsb2MgKGxlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFrYnVmKQotCQlnb3RvIGZyZWUxOwotCWlmIChjb3B5X2Zyb21fdXNlciAoa2J1ZiwgYnVmLCBsZW4pKSB7Ci0JCXZhbHVlID0gLUVGQVVMVDsKKwlrYnVmID0gbWVtZHVwX3VzZXIoYnVmLCBsZW4pOworCWlmICgha2J1ZikgeworCQl2YWx1ZSA9IFBUUl9FUlIoa2J1Zik7CiAJCWdvdG8gZnJlZTE7CiAJfQogCkBAIC00NTIsNyArNDUwLDYgQEAKIAkJZGF0YS0+bmFtZSwgbGVuLCAoaW50KSB2YWx1ZSk7CiBmcmVlMToKIAltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOwotCWtmcmVlIChrYnVmKTsKIAlyZXR1cm4gdmFsdWU7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9scGMzMnh4X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2xwYzMyeHhfdWRjLmMKaW5kZXggMDQ5ZWJhYi4uYTEzOTg5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2xwYzMyeHhfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2xwYzMyeHhfdWRjLmMKQEAgLTMyOTUsOSArMzI5NSw5IEBACiBwbGxfc2V0X2ZhaWw6CiAJY2xrX2Rpc2FibGUodWRjLT51c2JfcGxsX2Nsayk7CiBwbGxfZW5hYmxlX2ZhaWw6Ci0JY2xrX3B1dCh1ZGMtPnVzYl9zbHZfY2xrKTsKLXVzYl9vdGdfY2xrX2dldF9mYWlsOgogCWNsa19wdXQodWRjLT51c2Jfb3RnX2Nsayk7Cit1c2Jfb3RnX2Nsa19nZXRfZmFpbDoKKwljbGtfcHV0KHVkYy0+dXNiX3Nsdl9jbGspOwogdXNiX2Nsa19nZXRfZmFpbDoKIAljbGtfcHV0KHVkYy0+dXNiX3BsbF9jbGspOwogcGxsX2dldF9mYWlsOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3ByaW50ZXIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9wcmludGVyLmMKaW5kZXggNjliNzZlZi4uNjQ3NDA4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3ByaW50ZXIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHJpbnRlci5jCkBAIC00MjcsMTIgKzQyNywxNyBAQAogCQlyZXEtPmxlbmd0aCA9IFVTQl9CVUZTSVpFOwogCQlyZXEtPmNvbXBsZXRlID0gcnhfY29tcGxldGU7CiAKKwkJLyogaGVyZSwgd2UgdW5sb2NrLCBhbmQgb25seSB1bmxvY2ssIHRvIGF2b2lkIGRlYWRsb2NrLiAqLworCQlzcGluX3VubG9jaygmZGV2LT5sb2NrKTsKIAkJZXJyb3IgPSB1c2JfZXBfcXVldWUoZGV2LT5vdXRfZXAsIHJlcSwgR0ZQX0FUT01JQyk7CisJCXNwaW5fbG9jaygmZGV2LT5sb2NrKTsKIAkJaWYgKGVycm9yKSB7CiAJCQlEQkcoZGV2LCAicnggc3VibWl0IC0tPiAlZFxuIiwgZXJyb3IpOwogCQkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+cnhfcmVxcyk7CiAJCQlicmVhazsKLQkJfSBlbHNlIHsKKwkJfQorCQkvKiBpZiB0aGUgcmVxIGlzIGVtcHR5LCB0aGVuIGFkZCBpdCBpbnRvIGRldi0+cnhfcmVxc19hY3RpdmUuICovCisJCWVsc2UgaWYgKGxpc3RfZW1wdHkoJnJlcS0+bGlzdCkpIHsKIAkJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXNfYWN0aXZlKTsKIAkJfQogCX0KQEAgLTExMzMsNiArMTEzOCw3IEBACiAJCQkJICBOVUxMLCAiZ19wcmludGVyIik7CiAJaWYgKElTX0VSUihkZXYtPnBkZXYpKSB7CiAJCUVSUk9SKGRldiwgIkZhaWxlZCB0byBjcmVhdGUgZGV2aWNlOiBnX3ByaW50ZXJcbiIpOworCQlzdGF0dXMgPSBQVFJfRVJSKGRldi0+cGRldik7CiAJCWdvdG8gZmFpbDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MtaHNvdGcuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MtaHNvdGcuYwppbmRleCAxMTcyZWFlLi4yYTljYjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvczNjLWhzb3RnLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYy1oc290Zy5jCkBAIC02MTcsNyArNjE3LDcgQEAKIAl0b193cml0ZSA9IERJVl9ST1VORF9VUCh0b193cml0ZSwgNCk7CiAJZGF0YSA9IGhzX3JlcS0+cmVxLmJ1ZiArIGJ1Zl9wb3M7CiAKLQl3cml0ZXNsKGhzb3RnLT5yZWdzICsgRVBGSUZPKGhzX2VwLT5pbmRleCksIGRhdGEsIHRvX3dyaXRlKTsKKwlpb3dyaXRlMzJfcmVwKGhzb3RnLT5yZWdzICsgRVBGSUZPKGhzX2VwLT5pbmRleCksIGRhdGEsIHRvX3dyaXRlKTsKIAogCXJldHVybiAodG9fd3JpdGUgPj0gY2FuX3dyaXRlKSA/IC1FTk9TUEMgOiAwOwogfQpAQCAtNzIwLDggKzcyMCw4IEBACiAJCXVyZXEtPmxlbmd0aCwgdXJlcS0+YWN0dWFsKTsKIAlpZiAoMCkKIAkJZGV2X2RiZyhoc290Zy0+ZGV2LAotCQkJIlJFUSBidWYgJXAgbGVuICVkIGRtYSAweCUwOHggbm9pPSVkIHpwPSVkIHNub2s9JWRcbiIsCi0JCQl1cmVxLT5idWYsIGxlbmd0aCwgdXJlcS0+ZG1hLAorCQkJIlJFUSBidWYgJXAgbGVuICVkIGRtYSAweCVwYWQgbm9pPSVkIHpwPSVkIHNub2s9JWRcbiIsCisJCQl1cmVxLT5idWYsIGxlbmd0aCwgJnVyZXEtPmRtYSwKIAkJCXVyZXEtPm5vX2ludGVycnVwdCwgdXJlcS0+emVybywgdXJlcS0+c2hvcnRfbm90X29rKTsKIAogCW1heHJlcSA9IGdldF9lcF9saW1pdChoc19lcCk7CkBAIC03ODksOCArNzg5LDggQEAKIAkJZG1hX3JlZyA9IGRpcl9pbiA/IERJRVBETUEoaW5kZXgpIDogRE9FUERNQShpbmRleCk7CiAJCXdyaXRlbCh1cmVxLT5kbWEsIGhzb3RnLT5yZWdzICsgZG1hX3JlZyk7CiAKLQkJZGV2X2RiZyhoc290Zy0+ZGV2LCAiJXM6IDB4JTA4eCA9PiAweCUwOHhcbiIsCi0JCQlfX2Z1bmNfXywgdXJlcS0+ZG1hLCBkbWFfcmVnKTsKKwkJZGV2X2RiZyhoc290Zy0+ZGV2LCAiJXM6IDB4JXBhZCA9PiAweCUwOHhcbiIsCisJCQlfX2Z1bmNfXywgJnVyZXEtPmRtYSwgZG1hX3JlZyk7CiAJfQogCiAJY3RybCB8PSBEeEVQQ1RMX0VQRW5hOwkvKiBlbnN1cmUgZXAgZW5hYmxlZCAqLwpAQCAtMTE4Niw2ICsxMTg2LDQxIEBACiBzdGF0aWMgdm9pZCBzM2NfaHNvdGdfZGlzY29ubmVjdChzdHJ1Y3QgczNjX2hzb3RnICpoc290Zyk7CiAKIC8qKgorICogczNjX2hzb3RnX3N0YWxsX2VwMCAtIHN0YWxsIGVwMAorICogQGhzb3RnOiBUaGUgZGV2aWNlIHN0YXRlCisgKgorICogU2V0IHN0YWxsIGZvciBlcDAgYXMgcmVzcG9uc2UgZm9yIHNldHVwIHJlcXVlc3QuCisgKi8KK3N0YXRpYyB2b2lkIHMzY19oc290Z19zdGFsbF9lcDAoc3RydWN0IHMzY19oc290ZyAqaHNvdGcpIHsKKwlzdHJ1Y3QgczNjX2hzb3RnX2VwICplcDAgPSAmaHNvdGctPmVwc1swXTsKKwl1MzIgcmVnOworCXUzMiBjdHJsOworCisJZGV2X2RiZyhoc290Zy0+ZGV2LCAiZXAwIHN0YWxsIChkaXI9JWQpXG4iLCBlcDAtPmRpcl9pbik7CisJcmVnID0gKGVwMC0+ZGlyX2luKSA/IERJRVBDVEwwIDogRE9FUENUTDA7CisKKwkvKgorCSAqIER4RVBDVExfU3RhbGwgd2lsbCBiZSBjbGVhcmVkIGJ5IEVQIG9uY2UgaXQgaGFzCisJICogdGFrZW4gZWZmZWN0LCBzbyBubyBuZWVkIHRvIGNsZWFyIGxhdGVyLgorCSAqLworCisJY3RybCA9IHJlYWRsKGhzb3RnLT5yZWdzICsgcmVnKTsKKwljdHJsIHw9IER4RVBDVExfU3RhbGw7CisJY3RybCB8PSBEeEVQQ1RMX0NOQUs7CisJd3JpdGVsKGN0cmwsIGhzb3RnLT5yZWdzICsgcmVnKTsKKworCWRldl9kYmcoaHNvdGctPmRldiwKKwkJIndyaXR0ZW4gRHhFUENUTD0weCUwOHggdG8gJTA4eCAoRHhFUENUTD0weCUwOHgpXG4iLAorCQljdHJsLCByZWcsIHJlYWRsKGhzb3RnLT5yZWdzICsgcmVnKSk7CisKKwkgLyoKKwkgICogY29tcGxldGUgd29uJ3QgYmUgY2FsbGVkLCBzbyB3ZSBlbnF1ZXVlCisJICAqIHNldHVwIHJlcXVlc3QgaGVyZQorCSAgKi8KKwkgczNjX2hzb3RnX2VucXVldWVfc2V0dXAoaHNvdGcpOworfQorCisvKioKICAqIHMzY19oc290Z19wcm9jZXNzX2NvbnRyb2wgLSBwcm9jZXNzIGEgY29udHJvbCByZXF1ZXN0CiAgKiBAaHNvdGc6IFRoZSBkZXZpY2Ugc3RhdGUKICAqIEBjdHJsOiBUaGUgY29udHJvbCByZXF1ZXN0IHJlY2VpdmVkCkBAIC0xMjYyLDM4ICsxMjk3LDggQEAKIAkgKiBzbyByZXNwb25kIHdpdGggYSBTVEFMTCBmb3IgdGhlIHN0YXR1cyBzdGFnZSB0byBpbmRpY2F0ZSBmYWlsdXJlLgogCSAqLwogCi0JaWYgKHJldCA8IDApIHsKLQkJdTMyIHJlZzsKLQkJdTMyIGN0cmw7Ci0KLQkJZGV2X2RiZyhoc290Zy0+ZGV2LCAiZXAwIHN0YWxsIChkaXI9JWQpXG4iLCBlcDAtPmRpcl9pbik7Ci0JCXJlZyA9IChlcDAtPmRpcl9pbikgPyBESUVQQ1RMMCA6IERPRVBDVEwwOwotCi0JCS8qCi0JCSAqIER4RVBDVExfU3RhbGwgd2lsbCBiZSBjbGVhcmVkIGJ5IEVQIG9uY2UgaXQgaGFzCi0JCSAqIHRha2VuIGVmZmVjdCwgc28gbm8gbmVlZCB0byBjbGVhciBsYXRlci4KLQkJICovCi0KLQkJY3RybCA9IHJlYWRsKGhzb3RnLT5yZWdzICsgcmVnKTsKLQkJY3RybCB8PSBEeEVQQ1RMX1N0YWxsOwotCQljdHJsIHw9IER4RVBDVExfQ05BSzsKLQkJd3JpdGVsKGN0cmwsIGhzb3RnLT5yZWdzICsgcmVnKTsKLQotCQlkZXZfZGJnKGhzb3RnLT5kZXYsCi0JCQkid3JpdHRlbiBEeEVQQ1RMPTB4JTA4eCB0byAlMDh4IChEeEVQQ1RMPTB4JTA4eClcbiIsCi0JCQljdHJsLCByZWcsIHJlYWRsKGhzb3RnLT5yZWdzICsgcmVnKSk7Ci0KLQkJLyoKLQkJICogZG9uJ3QgYmVsaWV2ZSB3ZSBuZWVkIHRvIGFueXRoaW5nIG1vcmUgdG8gZ2V0IHRoZSBFUAotCQkgKiB0byByZXBseSB3aXRoIGEgU1RBTEwgcGFja2V0Ci0JCSAqLwotCi0JCSAvKgotCQkgICogY29tcGxldGUgd29uJ3QgYmUgY2FsbGVkLCBzbyB3ZSBlbnF1ZXVlCi0JCSAgKiBzZXR1cCByZXF1ZXN0IGhlcmUKLQkJICAqLwotCQkgczNjX2hzb3RnX2VucXVldWVfc2V0dXAoaHNvdGcpOwotCX0KKwlpZiAocmV0IDwgMCkKKwkJczNjX2hzb3RnX3N0YWxsX2VwMChoc290Zyk7CiB9CiAKIC8qKgpAQCAtMTQ4OCw3ICsxNDkzLDcgQEAKIAkgKiBub3RlLCB3ZSBtaWdodCBvdmVyLXdyaXRlIHRoZSBidWZmZXIgZW5kIGJ5IDMgYnl0ZXMgZGVwZW5kaW5nIG9uCiAJICogYWxpZ25tZW50IG9mIHRoZSBkYXRhLgogCSAqLwotCXJlYWRzbChmaWZvLCBoc19yZXEtPnJlcS5idWYgKyByZWFkX3B0ciwgdG9fcmVhZCk7CisJaW9yZWFkMzJfcmVwKGZpZm8sIGhzX3JlcS0+cmVxLmJ1ZiArIHJlYWRfcHRyLCB0b19yZWFkKTsKIH0KIAogLyoqCkBAIC0yODMyLDYgKzI4MzcsMTUgQEAKIAogCWRldl9pbmZvKGhzLT5kZXYsICIlcyhlcCAlcCAlcywgJWQpXG4iLCBfX2Z1bmNfXywgZXAsIGVwLT5uYW1lLCB2YWx1ZSk7CiAKKwlpZiAoaW5kZXggPT0gMCkgeworCQlpZiAodmFsdWUpCisJCQlzM2NfaHNvdGdfc3RhbGxfZXAwKGhzKTsKKwkJZWxzZQorCQkJZGV2X3dhcm4oaHMtPmRldiwKKwkJCQkgIiVzOiBjYW4ndCBjbGVhciBoYWx0IG9uIGVwMFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKIAkvKiB3cml0ZSBib3RoIElOIGFuZCBPVVQgY29udHJvbCByZWdpc3RlcnMgKi8KIAogCWVwcmVnID0gRElFUENUTChpbmRleCk7CkBAIC0zNzYwLDEwICszNzc0LDU1IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiAxCi0jZGVmaW5lIHMzY19oc290Z19zdXNwZW5kIE5VTEwKLSNkZWZpbmUgczNjX2hzb3RnX3Jlc3VtZSBOVUxMCi0jZW5kaWYKK3N0YXRpYyBpbnQgczNjX2hzb3RnX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBzM2NfaHNvdGcgKmhzb3RnID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChoc290Zy0+ZHJpdmVyKQorCQlkZXZfaW5mbyhoc290Zy0+ZGV2LCAic3VzcGVuZGluZyB1c2IgZ2FkZ2V0ICVzXG4iLAorCQkJIGhzb3RnLT5kcml2ZXItPmRyaXZlci5uYW1lKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoc290Zy0+bG9jaywgZmxhZ3MpOworCXMzY19oc290Z19kaXNjb25uZWN0KGhzb3RnKTsKKwlzM2NfaHNvdGdfcGh5X2Rpc2FibGUoaHNvdGcpOworCWhzb3RnLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoc290Zy0+bG9jaywgZmxhZ3MpOworCisJaWYgKGhzb3RnLT5kcml2ZXIpIHsKKwkJaW50IGVwOworCQlmb3IgKGVwID0gMDsgZXAgPCBoc290Zy0+bnVtX29mX2VwczsgZXArKykKKwkJCXMzY19oc290Z19lcF9kaXNhYmxlKCZoc290Zy0+ZXBzW2VwXS5lcCk7CisKKwkJcmV0ID0gcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGhzb3RnLT5zdXBwbGllcyksCisJCQkJCSAgICAgaHNvdGctPnN1cHBsaWVzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHMzY19oc290Z19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgczNjX2hzb3RnICpoc290ZyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlpZiAoaHNvdGctPmRyaXZlcikgeworCQlkZXZfaW5mbyhoc290Zy0+ZGV2LCAicmVzdW1pbmcgdXNiIGdhZGdldCAlc1xuIiwKKwkJCSBoc290Zy0+ZHJpdmVyLT5kcml2ZXIubmFtZSk7CisJCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKGhzb3RnLT5zdXBwbGllcyksCisJCQkJICAgICAgaHNvdGctPnN1cHBsaWVzKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHNvdGctPmxvY2ssIGZsYWdzKTsKKwloc290Zy0+bGFzdF9yc3QgPSBqaWZmaWVzOworCXMzY19oc290Z19waHlfZW5hYmxlKGhzb3RnKTsKKwlzM2NfaHNvdGdfY29yZV9pbml0KGhzb3RnKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoc290Zy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KIAogI2lmZGVmIENPTkZJR19PRgogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgczNjX2hzb3RnX29mX2lkc1tdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYy1oc3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYy1oc3VkYy5jCmluZGV4IGVhNGJiZmUuLjEwYzZhMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MtaHN1ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvczNjLWhzdWRjLmMKQEAgLTEzNDQsNyArMTM0NCw2IEBACiAKIAlyZXR1cm4gMDsKIGVycl9hZGRfdWRjOgotZXJyX2FkZF9kZXZpY2U6CiAJY2xrX2Rpc2FibGUoaHN1ZGMtPnVjbGspOwogZXJyX3JlczoKIAlpZiAoIUlTX0VSUl9PUl9OVUxMKGhzdWRjLT50cmFuc2NlaXZlcikpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdGNtX3VzYl9nYWRnZXQuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC90Y21fdXNiX2dhZGdldC5jCmluZGV4IDBmOGFhZDcuLjQ2MGMyNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC90Y21fdXNiX2dhZGdldC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC90Y21fdXNiX2dhZGdldC5jCkBAIC0xNjEzLDcgKzE2MTMsNyBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAJdHBvcnQtPnRwb3J0X3d3cG4gPSB3d3BuOwotCXNucHJpbnRmKHRwb3J0LT50cG9ydF9uYW1lLCBzaXplb2YodHBvcnQtPnRwb3J0X25hbWUpLCB3bm5fbmFtZSk7CisJc25wcmludGYodHBvcnQtPnRwb3J0X25hbWUsIHNpemVvZih0cG9ydC0+dHBvcnRfbmFtZSksICIlcyIsIHdubl9uYW1lKTsKIAlyZXR1cm4gJnRwb3J0LT50cG9ydF93d247CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91X2V0aGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5jCmluZGV4IGI3ZDRmODIuLjUwZDA5YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91X2V0aGVyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZXRoZXIuYwpAQCAtNDgsNiArNDgsOCBAQAogCiAjZGVmaW5lIFVFVEhfX1ZFUlNJT04JIjI5LU1heS0yMDA4IgogCisjZGVmaW5lIEdFVEhFUl9OQVBJX1dFSUdIVAkzMgorCiBzdHJ1Y3QgZXRoX2RldiB7CiAJLyogbG9jayBpcyBoZWxkIHdoaWxlIGFjY2Vzc2luZyBwb3J0X3VzYgogCSAqLwpAQCAtNzIsNiArNzQsNyBAQAogCQkJCQkJc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCk7CiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QJcnhfbmFwaTsKIAogCXVuc2lnbmVkIGxvbmcJCXRvZG87CiAjZGVmaW5lCVdPUktfUlhfTUVNT1JZCQkwCkBAIC0yNTMsMTggKzI1NiwxNiBAQAogCQlEQkcoZGV2LCAicnggc3VibWl0IC0tPiAlZFxuIiwgcmV0dmFsKTsKIAkJaWYgKHNrYikKIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnJlcV9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXMpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnJlcV9sb2NrLCBmbGFncyk7CiAJfQogCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB2b2lkIHJ4X2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZgkqc2tiID0gcmVxLT5jb250ZXh0LCAqc2tiMjsKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiID0gcmVxLT5jb250ZXh0OwogCXN0cnVjdCBldGhfZGV2CSpkZXYgPSBlcC0+ZHJpdmVyX2RhdGE7CiAJaW50CQlzdGF0dXMgPSByZXEtPnN0YXR1czsKKwlib29sCQlyeF9xdWV1ZSA9IDA7CiAKIAlzd2l0Y2ggKHN0YXR1cykgewogCkBAIC0yODgsMzAgKzI4OSw4IEBACiAJCX0gZWxzZSB7CiAJCQlza2JfcXVldWVfdGFpbCgmZGV2LT5yeF9mcmFtZXMsIHNrYik7CiAJCX0KLQkJc2tiID0gTlVMTDsKLQotCQlza2IyID0gc2tiX2RlcXVldWUoJmRldi0+cnhfZnJhbWVzKTsKLQkJd2hpbGUgKHNrYjIpIHsKLQkJCWlmIChzdGF0dXMgPCAwCi0JCQkJCXx8IEVUSF9ITEVOID4gc2tiMi0+bGVuCi0JCQkJCXx8IHNrYjItPmxlbiA+IFZMQU5fRVRIX0ZSQU1FX0xFTikgewotCQkJCWRldi0+bmV0LT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJCQlkZXYtPm5ldC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwotCQkJCURCRyhkZXYsICJyeCBsZW5ndGggJWRcbiIsIHNrYjItPmxlbik7Ci0JCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiMik7Ci0JCQkJZ290byBuZXh0X2ZyYW1lOwotCQkJfQotCQkJc2tiMi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IyLCBkZXYtPm5ldCk7Ci0JCQlkZXYtPm5ldC0+c3RhdHMucnhfcGFja2V0cysrOwotCQkJZGV2LT5uZXQtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYjItPmxlbjsKLQotCQkJLyogbm8gYnVmZmVyIGNvcGllcyBuZWVkZWQsIHVubGVzcyBoYXJkd2FyZSBjYW4ndAotCQkJICogdXNlIHNrYiBidWZmZXJzLgotCQkJICovCi0JCQlzdGF0dXMgPSBuZXRpZl9yeChza2IyKTsKLW5leHRfZnJhbWU6Ci0JCQlza2IyID0gc2tiX2RlcXVldWUoJmRldi0+cnhfZnJhbWVzKTsKLQkJfQorCQlpZiAoIXN0YXR1cykKKwkJCXJ4X3F1ZXVlID0gMTsKIAkJYnJlYWs7CiAKIAkvKiBzb2Z0d2FyZS1kcml2ZW4gaW50ZXJmYWNlIHNodXRkb3duICovCkBAIC0zMzQsMjIgKzMxMywyMCBAQAogCQkvKiBGQUxMVEhST1VHSCAqLwogCiAJZGVmYXVsdDoKKwkJcnhfcXVldWUgPSAxOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQlkZXYtPm5ldC0+c3RhdHMucnhfZXJyb3JzKys7CiAJCURCRyhkZXYsICJyeCBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CiAJCWJyZWFrOwogCX0KIAotCWlmIChza2IpCi0JCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JaWYgKCFuZXRpZl9ydW5uaW5nKGRldi0+bmV0KSkgewogY2xlYW46CiAJCXNwaW5fbG9jaygmZGV2LT5yZXFfbG9jayk7CiAJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXMpOwogCQlzcGluX3VubG9jaygmZGV2LT5yZXFfbG9jayk7Ci0JCXJlcSA9IE5VTEw7Ci0JfQotCWlmIChyZXEpCi0JCXJ4X3N1Ym1pdChkZXYsIHJlcSwgR0ZQX0FUT01JQyk7CisKKwlpZiAocnhfcXVldWUgJiYgbGlrZWx5KG5hcGlfc2NoZWR1bGVfcHJlcCgmZGV2LT5yeF9uYXBpKSkpCisJCV9fbmFwaV9zY2hlZHVsZSgmZGV2LT5yeF9uYXBpKTsKIH0KIAogc3RhdGljIGludCBwcmVhbGxvYyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBzdHJ1Y3QgdXNiX2VwICplcCwgdW5zaWduZWQgbikKQEAgLTQxNCwxNiArMzkxLDI0IEBACiB7CiAJc3RydWN0IHVzYl9yZXF1ZXN0CSpyZXE7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJaW50CQkJcnhfY291bnRzID0gMDsKIAogCS8qIGZpbGwgdW51c2VkIHJ4cSBzbG90cyB3aXRoIHNvbWUgc2tiICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cmVxX2xvY2ssIGZsYWdzKTsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmRldi0+cnhfcmVxcykpIHsKKworCQlpZiAoKytyeF9jb3VudHMgPiBxbGVuKGRldi0+Z2FkZ2V0LCBkZXYtPnFtdWx0KSkKKwkJCWJyZWFrOworCiAJCXJlcSA9IGNvbnRhaW5lcl9vZihkZXYtPnJ4X3JlcXMubmV4dCwKIAkJCQlzdHJ1Y3QgdXNiX3JlcXVlc3QsIGxpc3QpOwogCQlsaXN0X2RlbF9pbml0KCZyZXEtPmxpc3QpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnJlcV9sb2NrLCBmbGFncyk7CiAKIAkJaWYgKHJ4X3N1Ym1pdChkZXYsIHJlcSwgZ2ZwX2ZsYWdzKSA8IDApIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnJlcV9sb2NrLCBmbGFncyk7CisJCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT5yeF9yZXFzKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cmVxX2xvY2ssIGZsYWdzKTsKIAkJCWRlZmVyX2tldmVudChkZXYsIFdPUktfUlhfTUVNT1JZKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtNDMzLDYgKzQxOCw0MSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cmVxX2xvY2ssIGZsYWdzKTsKIH0KIAorc3RhdGljIGludCBnZXRoZXJfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCit7CisJc3RydWN0IGV0aF9kZXYgICpkZXYgPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IGV0aF9kZXYsIHJ4X25hcGkpOworCXN0cnVjdCBza19idWZmCSpza2I7CisJdW5zaWduZWQgaW50CXdvcmtfZG9uZSA9IDA7CisJaW50CQlzdGF0dXMgPSAwOworCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmZGV2LT5yeF9mcmFtZXMpKSkgeworCQlpZiAoc3RhdHVzIDwgMAorCQkJCXx8IEVUSF9ITEVOID4gc2tiLT5sZW4KKwkJCQl8fCBza2ItPmxlbiA+IFZMQU5fRVRIX0ZSQU1FX0xFTikgeworCQkJZGV2LT5uZXQtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJZGV2LT5uZXQtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCURCRyhkZXYsICJyeCBsZW5ndGggJWRcbiIsIHNrYi0+bGVuKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQljb250aW51ZTsKKwkJfQorCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYtPm5ldCk7CisJCWRldi0+bmV0LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCWRldi0+bmV0LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKworCQlzdGF0dXMgPSBuZXRpZl9yeF9uaShza2IpOworCX0KKworCWlmIChuZXRpZl9ydW5uaW5nKGRldi0+bmV0KSkgeworCQlyeF9maWxsKGRldiwgR0ZQX0tFUk5FTCk7CisJCXdvcmtfZG9uZSsrOworCX0KKworCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpCisJCW5hcGlfY29tcGxldGUoJmRldi0+cnhfbmFwaSk7CisKKwlyZXR1cm4gd29ya19kb25lOworfQorCiBzdGF0aWMgdm9pZCBldGhfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGV0aF9kZXYJKmRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZXRoX2Rldiwgd29yayk7CkBAIC02MjUsNiArNjQ1LDcgQEAKIAkvKiBhbmQgb3BlbiB0aGUgdHggZmxvb2RnYXRlcyAqLwogCWF0b21pY19zZXQoJmRldi0+dHhfcWxlbiwgMCk7CiAJbmV0aWZfd2FrZV9xdWV1ZShkZXYtPm5ldCk7CisJbmFwaV9lbmFibGUoJmRldi0+cnhfbmFwaSk7CiB9CiAKIHN0YXRpYyBpbnQgZXRoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKQEAgLTY1MSw2ICs2NzIsNyBAQAogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAKIAlWREJHKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJbmFwaV9kaXNhYmxlKCZkZXYtPnJ4X25hcGkpOwogCW5ldGlmX3N0b3BfcXVldWUobmV0KTsKIAogCURCRyhkZXYsICJzdG9wIHN0YXRzOiByeC90eCAlbGQvJWxkLCBlcnJzICVsZC8lbGRcbiIsCkBAIC03NjgsNiArNzkwLDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCW5ldGlmX25hcGlfYWRkKG5ldCwgJmRldi0+cnhfbmFwaSwgZ2V0aGVyX3BvbGwsIEdFVEhFUl9OQVBJX1dFSUdIVCk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+bG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+cmVxX2xvY2spOwogCUlOSVRfV09SSygmZGV2LT53b3JrLCBldGhfd29yayk7CkBAIC04MzAsNiArODUzLDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCW5ldGlmX25hcGlfYWRkKG5ldCwgJmRldi0+cnhfbmFwaSwgZ2V0aGVyX3BvbGwsIEdFVEhFUl9OQVBJX1dFSUdIVCk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+bG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+cmVxX2xvY2spOwogCUlOSVRfV09SSygmZGV2LT53b3JrLCBldGhfd29yayk7CkBAIC0xMTEzLDYgKzExMzcsNyBAQAogewogCXN0cnVjdCBldGhfZGV2CQkqZGV2ID0gbGluay0+aW9wb3J0OwogCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxOworCXN0cnVjdCBza19idWZmCQkqc2tiOwogCiAJV0FSTl9PTighZGV2KTsKIAlpZiAoIWRldikKQEAgLTExMzksNiArMTE2NCwxMiBAQAogCQlzcGluX2xvY2soJmRldi0+cmVxX2xvY2spOwogCX0KIAlzcGluX3VubG9jaygmZGV2LT5yZXFfbG9jayk7CisKKwlzcGluX2xvY2soJmRldi0+cnhfZnJhbWVzLmxvY2spOworCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmZGV2LT5yeF9mcmFtZXMpKSkKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlzcGluX3VubG9jaygmZGV2LT5yeF9mcmFtZXMubG9jayk7CisKIAlsaW5rLT5pbl9lcC0+ZHJpdmVyX2RhdGEgPSBOVUxMOwogCWxpbmstPmluX2VwLT5kZXNjID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZnMuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC91X2ZzLmgKaW5kZXggYmMyZDM3MS4uYmYwYmEzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZnMuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9mcy5oCkBAIC02NSwxMCArNjUsOCBAQAogCW11dGV4X3VubG9jaygmZmZzX2xvY2spOwogfQogCi1zdHJ1Y3QgZmZzX2RldiAqZmZzX2FsbG9jX2Rldih2b2lkKTsKIGludCBmZnNfbmFtZV9kZXYoc3RydWN0IGZmc19kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSk7CiBpbnQgZmZzX3NpbmdsZV9kZXYoc3RydWN0IGZmc19kZXYgKmRldik7Ci12b2lkIGZmc19mcmVlX2RldihzdHJ1Y3QgZmZzX2RldiAqZGV2KTsKIAogc3RydWN0IGZmc19lcGZpbGU7CiBzdHJ1Y3QgZmZzX2Z1bmN0aW9uOwpAQCAtMTI1LDcgKzEyMyw3IEBACiAJICogc2V0dXAuICBJZiB0aGlzIHN0YXRlIGlzIHNldCByZWFkL3dyaXRlIG9uIGVwMCByZXR1cm4KIAkgKiAtRUlEUk0uICBUaGlzIHN0YXRlIGlzIG9ubHkgc2V0IHdoZW4gYWRkaW5nIGV2ZW50LgogCSAqLwotCUZGU19TRVRVUF9DQU5DRUxFRAorCUZGU19TRVRVUF9DQU5DRUxMRUQKIH07CiAKIHN0cnVjdCBmZnNfZGF0YSB7CkBAIC0xNTYsNyArMTU0LDYgQEAKIAkgKi8KIAlzdHJ1Y3QgdXNiX3JlcXVlc3QJCSplcDByZXE7CQkvKiBQOiBtdXRleCAqLwogCXN0cnVjdCBjb21wbGV0aW9uCQllcDByZXFfY29tcGxldGlvbjsJLyogUDogbXV0ZXggKi8KLQlpbnQJCQkJZXAwcmVxX3N0YXR1czsJCS8qIFA6IG11dGV4ICovCiAKIAkvKiByZWZlcmVuY2UgY291bnRlciAqLwogCWF0b21pY190CQkJcmVmOwpAQCAtMTY4LDE5ICsxNjUsMTggQEAKIAogCS8qCiAJICogUG9zc2libGUgdHJhbnNpdGlvbnM6Ci0JICogKyBGRlNfTk9fU0VUVVAgICAgICAgLT4gRkZTX1NFVFVQX1BFTkRJTkcgIC0tIFA6IGV2LndhaXRxLmxvY2sKKwkgKiArIEZGU19OT19TRVRVUCAgICAgICAgLT4gRkZTX1NFVFVQX1BFTkRJTkcgIC0tIFA6IGV2LndhaXRxLmxvY2sKIAkgKiAgICAgICAgICAgICAgIGhhcHBlbnMgb25seSBpbiBlcDAgcmVhZCB3aGljaCBpcyBQOiBtdXRleAotCSAqICsgRkZTX1NFVFVQX1BFTkRJTkcgIC0+IEZGU19OT19TRVRVUCAgICAgICAtLSBQOiBldi53YWl0cS5sb2NrCisJICogKyBGRlNfU0VUVVBfUEVORElORyAgIC0+IEZGU19OT19TRVRVUCAgICAgICAtLSBQOiBldi53YWl0cS5sb2NrCiAJICogICAgICAgICAgICAgICBoYXBwZW5zIG9ubHkgaW4gZXAwIGkvbyAgd2hpY2ggaXMgUDogbXV0ZXgKLQkgKiArIEZGU19TRVRVUF9QRU5ESU5HICAtPiBGRlNfU0VUVVBfQ0FOQ0VMRUQgLS0gUDogZXYud2FpdHEubG9jawotCSAqICsgRkZTX1NFVFVQX0NBTkNFTEVEIC0+IEZGU19OT19TRVRVUCAgICAgICAtLSBjbXB4Y2hnCisJICogKyBGRlNfU0VUVVBfUEVORElORyAgIC0+IEZGU19TRVRVUF9DQU5DRUxMRUQgLS0gUDogZXYud2FpdHEubG9jaworCSAqICsgRkZTX1NFVFVQX0NBTkNFTExFRCAtPiBGRlNfTk9fU0VUVVAgICAgICAgIC0tIGNtcHhjaGcKKwkgKgorCSAqIFRoaXMgZmllbGQgc2hvdWxkIG5ldmVyIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGFuZCBpbnN0ZWFkCisJICogZmZzX3NldHVwX3N0YXRlX2NsZWFyX2NhbmNlbGxlZCBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZC4KIAkgKi8KIAllbnVtIGZmc19zZXR1cF9zdGF0ZQkJc2V0dXBfc3RhdGU7CiAKLSNkZWZpbmUgRkZTX1NFVFVQX1NUQVRFKGZmcykJCQkJCVwKLQkoKGVudW0gZmZzX3NldHVwX3N0YXRlKWNtcHhjaGcoJihmZnMpLT5zZXR1cF9zdGF0ZSwJXAotCQkJCSAgICAgICBGRlNfU0VUVVBfQ0FOQ0VMRUQsIEZGU19OT19TRVRVUCkpCi0KIAkvKiBFdmVudHMgJiBzdWNoLiAqLwogCXN0cnVjdCB7CiAJCXU4CQkJCXR5cGVzWzRdOwpAQCAtMjEwLDE2ICsyMDYsMTYgQEAKIAogCS8qIGZpbGxlZCBieSBfX2Zmc19kYXRhX2dvdF9kZXNjcygpICovCiAJLyoKLQkgKiBSZWFsIGRlc2NyaXB0b3JzIGFyZSAxNiBieXRlcyBhZnRlciByYXdfZGVzY3MgKHNvIHlvdSBuZWVkCi0JICogdG8gc2tpcCAxNiBieXRlcyAoaWUuIGZmcy0+cmF3X2Rlc2NzICsgMTYpIHRvIGdldCB0byB0aGUKLQkgKiBmaXJzdCBmdWxsIHNwZWVkIGRlc2NyaXB0b3IpLiAgcmF3X2Rlc2NzX2xlbmd0aCBhbmQKLQkgKiByYXdfZnNfZGVzY3NfbGVuZ3RoIGRvIG5vdCBoYXZlIHRob3NlIDE2IGJ5dGVzIGFkZGVkLgorCSAqIHJhd19kZXNjcyBpcyB3aGF0IHlvdSBrZnJlZSwgcmVhbF9kZXNjcyBwb2ludHMgaW5zaWRlIG9mIHJhd19kZXNjcywKKwkgKiB3aGVyZSBmdWxsIHNwZWVkLCBoaWdoIHNwZWVkIGFuZCBzdXBlciBzcGVlZCBkZXNjcmlwdG9ycyBzdGFydC4KKwkgKiByZWFsX2Rlc2NzX2xlbmd0aCBpcyB0aGUgbGVuZ3RoIG9mIGFsbCB0aG9zZSBkZXNjcmlwdG9ycy4KIAkgKi8KKwljb25zdCB2b2lkCQkJKnJhd19kZXNjc19kYXRhOwogCWNvbnN0IHZvaWQJCQkqcmF3X2Rlc2NzOwogCXVuc2lnbmVkCQkJcmF3X2Rlc2NzX2xlbmd0aDsKLQl1bnNpZ25lZAkJCXJhd19mc19kZXNjc19sZW5ndGg7CiAJdW5zaWduZWQJCQlmc19kZXNjc19jb3VudDsKIAl1bnNpZ25lZAkJCWhzX2Rlc2NzX2NvdW50OworCXVuc2lnbmVkCQkJc3NfZGVzY3NfY291bnQ7CiAKIAl1bnNpZ25lZCBzaG9ydAkJCXN0cmluZ3NfY291bnQ7CiAJdW5zaWduZWQgc2hvcnQJCQlpbnRlcmZhY2VzX2NvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3Vfc2VyaWFsLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9zZXJpYWwuYwppbmRleCBiMzY5MjkyLi5hZDBhY2E4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9zZXJpYWwuYwpAQCAtNTQ5LDggKzU0OSw4IEBACiAJCXBvcnQtPnJlYWRfc3RhcnRlZC0tOwogCX0KIAotCS8qIFB1c2ggZnJvbSB0dHkgdG8gbGRpc2M7IHdpdGhvdXQgbG93X2xhdGVuY3kgc2V0IHRoaXMgaXMgaGFuZGxlZCBieQotCSAqIGEgd29ya3F1ZXVlLCBzbyB3ZSB3b24ndCBnZXQgY2FsbGJhY2tzIGFuZCBjYW4gaG9sZCBwb3J0X2xvY2sKKwkvKiBQdXNoIGZyb20gdHR5IHRvIGxkaXNjOyB0aGlzIGlzIGhhbmRsZWQgYnkgYSB3b3JrcXVldWUsCisJICogc28gd2Ugd29uJ3QgZ2V0IGNhbGxiYWNrcyBhbmQgY2FuIGhvbGQgcG9ydF9sb2NrCiAJICovCiAJaWYgKGRvX3B1c2gpCiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKCZwb3J0LT5wb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZwppbmRleCBhOTcwN2RhLi5lMjJiODI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCkBAIC01ODQsNyArNTg0LDYgQEAKIGNvbmZpZyBVU0JfVTEzMl9IQ0QKIAl0cmlzdGF0ZSAiRWxhbiBVMTMyIEFkYXB0ZXIgSG9zdCBDb250cm9sbGVyIgogCWRlcGVuZHMgb24gVVNCX0ZURElfRUxBTgotCWRlZmF1bHQgTQogCWhlbHAKIAkgIFRoZSBVMTMyIGFkYXB0ZXIgaXMgYSBVU0IgdG8gQ2FyZEJ1cyBhZGFwdGVyIHNwZWNpZmljYWxseSBkZXNpZ25lZAogCSAgZm9yIFBDIGNhcmRzIHRoYXQgY29udGFpbiBhbiBPSENJIGhvc3QgY29udHJvbGxlci4gVHlwaWNhbCBQQyBjYXJkcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBsYXRmb3JtLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcGxhdGZvcm0uYwppbmRleCAwMTUzNmNmLi5iM2EwZTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcGxhdGZvcm0uYwpAQCAtMyw2ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgMjAwNyBTdGV2ZW4gQnJvd24gPHNicm93bkBjb3J0bGFuZC5jb20+CiAgKiBDb3B5cmlnaHQgMjAxMC0yMDEyIEhhdWtlIE1laHJ0ZW5zIDxoYXVrZUBoYXVrZS1tLmRlPgorICogQ29weXJpZ2h0IDIwMTQgSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KICAqCiAgKiBEZXJpdmVkIGZyb20gdGhlIG9oY2ktc3NiIGRyaXZlcgogICogQ29weXJpZ2h0IDIwMDcgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KQEAgLTE4LDYgKzE5LDcgQEAKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR05VL0dQTC4gU2VlIENPUFlJTkcgZm9yIGRldGFpbHMuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMjUsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2hjZC5oPgpAQCAtMzMsNiArMzYsMTMgQEAKICNpbmNsdWRlICJlaGNpLmgiCiAKICNkZWZpbmUgRFJJVkVSX0RFU0MgIkVIQ0kgZ2VuZXJpYyBwbGF0Zm9ybSBkcml2ZXIiCisjZGVmaW5lIEVIQ0lfTUFYX0NMS1MgMworI2RlZmluZSBoY2RfdG9fZWhjaV9wcml2KGgpICgoc3RydWN0IGVoY2lfcGxhdGZvcm1fcHJpdiAqKWhjZF90b19laGNpKGgpLT5wcml2KQorCitzdHJ1Y3QgZWhjaV9wbGF0Zm9ybV9wcml2IHsKKwlzdHJ1Y3QgY2xrICpjbGtzW0VIQ0lfTUFYX0NMS1NdOworCXN0cnVjdCBwaHkgKnBoeTsKK307CiAKIHN0YXRpYyBjb25zdCBjaGFyIGhjZF9uYW1lW10gPSAiZWhjaS1wbGF0Zm9ybSI7CiAKQEAgLTQ1LDggKzU1LDYgQEAKIAogCWhjZC0+aGFzX3R0ID0gcGRhdGEtPmhhc190dDsKIAllaGNpLT5oYXNfc3lub3BzeXNfaGNfYnVnID0gcGRhdGEtPmhhc19zeW5vcHN5c19oY19idWc7Ci0JZWhjaS0+YmlnX2VuZGlhbl9kZXNjID0gcGRhdGEtPmJpZ19lbmRpYW5fZGVzYzsKLQllaGNpLT5iaWdfZW5kaWFuX21taW8gPSBwZGF0YS0+YmlnX2VuZGlhbl9tbWlvOwogCiAJaWYgKHBkYXRhLT5wcmVfc2V0dXApIHsKIAkJcmV0dmFsID0gcGRhdGEtPnByZV9zZXR1cChoY2QpOwpAQCAtNjQsMzggKzcyLDkxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZWhjaV9wbGF0Zm9ybV9wb3dlcl9vbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGVoY2lfcGxhdGZvcm1fcHJpdiAqcHJpdiA9IGhjZF90b19laGNpX3ByaXYoaGNkKTsKKwlpbnQgY2xrLCByZXQ7CisKKwlmb3IgKGNsayA9IDA7IGNsayA8IEVIQ0lfTUFYX0NMS1MgJiYgcHJpdi0+Y2xrc1tjbGtdOyBjbGsrKykgeworCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocHJpdi0+Y2xrc1tjbGtdKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2Rpc2FibGVfY2xrczsKKwl9CisKKwlpZiAocHJpdi0+cGh5KSB7CisJCXJldCA9IHBoeV9pbml0KHByaXYtPnBoeSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9kaXNhYmxlX2Nsa3M7CisKKwkJcmV0ID0gcGh5X3Bvd2VyX29uKHByaXYtPnBoeSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9leGl0X3BoeTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2V4aXRfcGh5OgorCXBoeV9leGl0KHByaXYtPnBoeSk7CitlcnJfZGlzYWJsZV9jbGtzOgorCXdoaWxlICgtLWNsayA+PSAwKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+Y2xrc1tjbGtdKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGVoY2lfcGxhdGZvcm1fcG93ZXJfb2ZmKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgZWhjaV9wbGF0Zm9ybV9wcml2ICpwcml2ID0gaGNkX3RvX2VoY2lfcHJpdihoY2QpOworCWludCBjbGs7CisKKwlpZiAocHJpdi0+cGh5KSB7CisJCXBoeV9wb3dlcl9vZmYocHJpdi0+cGh5KTsKKwkJcGh5X2V4aXQocHJpdi0+cGh5KTsKKwl9CisKKwlmb3IgKGNsayA9IEVIQ0lfTUFYX0NMS1MgLSAxOyBjbGsgPj0gMDsgY2xrLS0pCisJCWlmIChwcml2LT5jbGtzW2Nsa10pCisJCQljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+Y2xrc1tjbGtdKTsKK30KKwogc3RhdGljIHN0cnVjdCBoY19kcml2ZXIgX19yZWFkX21vc3RseSBlaGNpX3BsYXRmb3JtX2hjX2RyaXZlcjsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBlaGNpX2RyaXZlcl9vdmVycmlkZXMgcGxhdGZvcm1fb3ZlcnJpZGVzIF9faW5pdGNvbnN0ID0gewotCS5yZXNldCA9CWVoY2lfcGxhdGZvcm1fcmVzZXQsCisJLnJlc2V0ID0JCWVoY2lfcGxhdGZvcm1fcmVzZXQsCisJLmV4dHJhX3ByaXZfc2l6ZSA9CXNpemVvZihzdHJ1Y3QgZWhjaV9wbGF0Zm9ybV9wcml2KSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VoY2lfcGRhdGEgZWhjaV9wbGF0Zm9ybV9kZWZhdWx0czsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VoY2lfcGRhdGEgZWhjaV9wbGF0Zm9ybV9kZWZhdWx0cyA9IHsKKwkucG93ZXJfb24gPQkJZWhjaV9wbGF0Zm9ybV9wb3dlcl9vbiwKKwkucG93ZXJfc3VzcGVuZCA9CWVoY2lfcGxhdGZvcm1fcG93ZXJfb2ZmLAorCS5wb3dlcl9vZmYgPQkJZWhjaV9wbGF0Zm9ybV9wb3dlcl9vZmYsCit9OwogCiBzdGF0aWMgaW50IGVoY2lfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCB1c2JfaGNkICpoY2Q7CiAJc3RydWN0IHJlc291cmNlICpyZXNfbWVtOwotCXN0cnVjdCB1c2JfZWhjaV9wZGF0YSAqcGRhdGE7Ci0JaW50IGlycTsKLQlpbnQgZXJyOworCXN0cnVjdCB1c2JfZWhjaV9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZkZXYtPmRldik7CisJc3RydWN0IGVoY2lfcGxhdGZvcm1fcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgZWhjaV9oY2QgKmVoY2k7CisJaW50IGVyciwgaXJxLCBjbGsgPSAwOwogCiAJaWYgKHVzYl9kaXNhYmxlZCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qCi0JICogdXNlIHJlYXNvbmFibGUgZGVmYXVsdHMgc28gcGxhdGZvcm1zIGRvbid0IGhhdmUgdG8gcHJvdmlkZSB0aGVzZS4KLQkgKiB3aXRoIERUIHByb2Jpbmcgb24gQVJNLCBub25lIG9mIHRoZXNlIGFyZSBzZXQuCisJICogVXNlIHJlYXNvbmFibGUgZGVmYXVsdHMgc28gcGxhdGZvcm1zIGRvbid0IGhhdmUgdG8gcHJvdmlkZSB0aGVzZQorCSAqIHdpdGggRFQgcHJvYmluZyBvbiBBUk0uCiAJICovCi0JaWYgKCFkZXZfZ2V0X3BsYXRkYXRhKCZkZXYtPmRldikpCi0JCWRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSAmZWhjaV9wbGF0Zm9ybV9kZWZhdWx0czsKKwlpZiAoIXBkYXRhKQorCQlwZGF0YSA9ICZlaGNpX3BsYXRmb3JtX2RlZmF1bHRzOwogCiAJZXJyID0gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudCgmZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMikpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJmRldi0+ZGV2KTsKLQogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEoZGV2LCAwKTsKIAlpZiAoaXJxIDwgMCkgewogCQlkZXZfZXJyKCZkZXYtPmRldiwgIm5vIGlycSBwcm92aWRlZCIpOwpAQCAtMTA3LDE3ICsxNjgsNzIgQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKKwloY2QgPSB1c2JfY3JlYXRlX2hjZCgmZWhjaV9wbGF0Zm9ybV9oY19kcml2ZXIsICZkZXYtPmRldiwKKwkJCSAgICAgZGV2X25hbWUoJmRldi0+ZGV2KSk7CisJaWYgKCFoY2QpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBoY2QpOworCWRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKKwlwcml2ID0gaGNkX3RvX2VoY2lfcHJpdihoY2QpOworCWVoY2kgPSBoY2RfdG9fZWhjaShoY2QpOworCisJaWYgKHBkYXRhID09ICZlaGNpX3BsYXRmb3JtX2RlZmF1bHRzICYmIGRldi0+ZGV2Lm9mX25vZGUpIHsKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPmRldi5vZl9ub2RlLCAiYmlnLWVuZGlhbi1yZWdzIikpCisJCQllaGNpLT5iaWdfZW5kaWFuX21taW8gPSAxOworCisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5kZXYub2Zfbm9kZSwgImJpZy1lbmRpYW4tZGVzYyIpKQorCQkJZWhjaS0+YmlnX2VuZGlhbl9kZXNjID0gMTsKKworCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+ZGV2Lm9mX25vZGUsICJiaWctZW5kaWFuIikpCisJCQllaGNpLT5iaWdfZW5kaWFuX21taW8gPSBlaGNpLT5iaWdfZW5kaWFuX2Rlc2MgPSAxOworCisJCXByaXYtPnBoeSA9IGRldm1fcGh5X2dldCgmZGV2LT5kZXYsICJ1c2IiKTsKKwkJaWYgKElTX0VSUihwcml2LT5waHkpKSB7CisJCQllcnIgPSBQVFJfRVJSKHByaXYtPnBoeSk7CisJCQlpZiAoZXJyID09IC1FUFJPQkVfREVGRVIpCisJCQkJZ290byBlcnJfcHV0X2hjZDsKKwkJCXByaXYtPnBoeSA9IE5VTEw7CisJCX0KKworCQlmb3IgKGNsayA9IDA7IGNsayA8IEVIQ0lfTUFYX0NMS1M7IGNsaysrKSB7CisJCQlwcml2LT5jbGtzW2Nsa10gPSBvZl9jbGtfZ2V0KGRldi0+ZGV2Lm9mX25vZGUsIGNsayk7CisJCQlpZiAoSVNfRVJSKHByaXYtPmNsa3NbY2xrXSkpIHsKKwkJCQllcnIgPSBQVFJfRVJSKHByaXYtPmNsa3NbY2xrXSk7CisJCQkJaWYgKGVyciA9PSAtRVBST0JFX0RFRkVSKQorCQkJCQlnb3RvIGVycl9wdXRfY2xrczsKKwkJCQlwcml2LT5jbGtzW2Nsa10gPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKHBkYXRhLT5iaWdfZW5kaWFuX2Rlc2MpCisJCWVoY2ktPmJpZ19lbmRpYW5fZGVzYyA9IDE7CisJaWYgKHBkYXRhLT5iaWdfZW5kaWFuX21taW8pCisJCWVoY2ktPmJpZ19lbmRpYW5fbW1pbyA9IDE7CisKKyNpZm5kZWYgQ09ORklHX1VTQl9FSENJX0JJR19FTkRJQU5fTU1JTworCWlmIChlaGNpLT5iaWdfZW5kaWFuX21taW8pIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkiRXJyb3I6IENPTkZJR19VU0JfRUhDSV9CSUdfRU5ESUFOX01NSU8gbm90IHNldFxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3B1dF9jbGtzOworCX0KKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfVVNCX0VIQ0lfQklHX0VORElBTl9ERVNDCisJaWYgKGVoY2ktPmJpZ19lbmRpYW5fZGVzYykgeworCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCSJFcnJvcjogQ09ORklHX1VTQl9FSENJX0JJR19FTkRJQU5fREVTQyBub3Qgc2V0XG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcHV0X2Nsa3M7CisJfQorI2VuZGlmCisKIAlpZiAocGRhdGEtPnBvd2VyX29uKSB7CiAJCWVyciA9IHBkYXRhLT5wb3dlcl9vbihkZXYpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JaGNkID0gdXNiX2NyZWF0ZV9oY2QoJmVoY2lfcGxhdGZvcm1faGNfZHJpdmVyLCAmZGV2LT5kZXYsCi0JCQkgICAgIGRldl9uYW1lKCZkZXYtPmRldikpOwotCWlmICghaGNkKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3Bvd2VyOworCQkJZ290byBlcnJfcHV0X2Nsa3M7CiAJfQogCiAJaGNkLT5yc3JjX3N0YXJ0ID0gcmVzX21lbS0+c3RhcnQ7CkBAIC0xMjYsMjIgKzI0MiwyOCBAQAogCWhjZC0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmZGV2LT5kZXYsIHJlc19tZW0pOwogCWlmIChJU19FUlIoaGNkLT5yZWdzKSkgewogCQllcnIgPSBQVFJfRVJSKGhjZC0+cmVncyk7Ci0JCWdvdG8gZXJyX3B1dF9oY2Q7CisJCWdvdG8gZXJyX3Bvd2VyOwogCX0KIAllcnIgPSB1c2JfYWRkX2hjZChoY2QsIGlycSwgSVJRRl9TSEFSRUQpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyX3B1dF9oY2Q7CisJCWdvdG8gZXJyX3Bvd2VyOwogCiAJZGV2aWNlX3dha2V1cF9lbmFibGUoaGNkLT5zZWxmLmNvbnRyb2xsZXIpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgaGNkKTsKIAogCXJldHVybiBlcnI7CiAKLWVycl9wdXRfaGNkOgotCXVzYl9wdXRfaGNkKGhjZCk7CiBlcnJfcG93ZXI6CiAJaWYgKHBkYXRhLT5wb3dlcl9vZmYpCiAJCXBkYXRhLT5wb3dlcl9vZmYoZGV2KTsKK2Vycl9wdXRfY2xrczoKKwl3aGlsZSAoLS1jbGsgPj0gMCkKKwkJY2xrX3B1dChwcml2LT5jbGtzW2Nsa10pOworZXJyX3B1dF9oY2Q6CisJaWYgKHBkYXRhID09ICZlaGNpX3BsYXRmb3JtX2RlZmF1bHRzKQorCQlkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gTlVMTDsKKworCXVzYl9wdXRfaGNkKGhjZCk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTUwLDEzICsyNzIsMTkgQEAKIHsKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgdXNiX2VoY2lfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmZGV2LT5kZXYpOworCXN0cnVjdCBlaGNpX3BsYXRmb3JtX3ByaXYgKnByaXYgPSBoY2RfdG9fZWhjaV9wcml2KGhjZCk7CisJaW50IGNsazsKIAogCXVzYl9yZW1vdmVfaGNkKGhjZCk7Ci0JdXNiX3B1dF9oY2QoaGNkKTsKIAogCWlmIChwZGF0YS0+cG93ZXJfb2ZmKQogCQlwZGF0YS0+cG93ZXJfb2ZmKGRldik7CiAKKwlmb3IgKGNsayA9IDA7IGNsayA8IEVIQ0lfTUFYX0NMS1MgJiYgcHJpdi0+Y2xrc1tjbGtdOyBjbGsrKykKKwkJY2xrX3B1dChwcml2LT5jbGtzW2Nsa10pOworCisJdXNiX3B1dF9oY2QoaGNkKTsKKwogCWlmIChwZGF0YSA9PSAmZWhjaV9wbGF0Zm9ybV9kZWZhdWx0cykKIAkJZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IE5VTEw7CiAKQEAgLTIwNyw4ICszMzUsMTAgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHZ0ODUwMF9laGNpX2lkc1tdID0gewogCXsgLmNvbXBhdGlibGUgPSAidmlhLHZ0ODUwMC1laGNpIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gIndtLHByaXptLWVoY2kiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZ2VuZXJpYy1laGNpIiwgfSwKIAl7fQogfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHZ0ODUwMF9laGNpX2lkcyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIGVoY2lfcGxhdGZvcm1fdGFibGVbXSA9IHsKIAl7ICJlaGNpLXBsYXRmb3JtIiwgMCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXRlZ3JhLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktdGVncmEuYwppbmRleCBhZjI4Yjc0Li4yN2FjNmFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktdGVncmEuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktdGVncmEuYwpAQCAtMzgsMTAgKzM4LDYgQEAKIAogI2luY2x1ZGUgImVoY2kuaCIKIAotI2RlZmluZSBURUdSQV9VU0JfQkFTRQkJCTB4QzUwMDAwMDAKLSNkZWZpbmUgVEVHUkFfVVNCMl9CQVNFCQkJMHhDNTAwNDAwMAotI2RlZmluZSBURUdSQV9VU0IzX0JBU0UJCQkweEM1MDA4MDAwCi0KICNkZWZpbmUgUE9SVF9XQUtFX0JJVFMgKFBPUlRfV0tPQ19FfFBPUlRfV0tESVNDX0V8UE9SVF9XS0NPTk5fRSkKIAogI2RlZmluZSBURUdSQV9VU0JfRE1BX0FMSUdOIDMyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2h3YS1oYy5jIGIvZHJpdmVycy91c2IvaG9zdC9od2EtaGMuYwppbmRleCBlMDc2Njk5Li5kMGQ4ZmFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2h3YS1oYy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvaHdhLWhjLmMKQEAgLTI2MSw4ICsyNjEsNDQgQEAKIAkJZGV2X2VycihkZXYsICJjYW5ub3QgbGlzdGVuIHRvIG5vdGlmaWNhdGlvbnM6ICVkXG4iLCByZXN1bHQpOwogCQlnb3RvIGVycm9yX3N0b3A7CiAJfQorCS8qCisJICogSWYgV1VTQl9RVUlSS19BTEVSRU9OX0hXQV9ESVNBQkxFX1hGRVJfTk9USUZJQ0FUSU9OUyBpcyBzZXQsCisJICogIGRpc2FibGUgdHJhbnNmZXIgbm90aWZpY2F0aW9ucy4KKwkgKi8KKwlpZiAoaHdhaGMtPndhLnF1aXJrcyAmCisJCVdVU0JfUVVJUktfQUxFUkVPTl9IV0FfRElTQUJMRV9YRkVSX05PVElGSUNBVElPTlMpIHsKKwkJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqY3VyX2FsdHNldHRpbmcgPQorCQkJaHdhaGMtPndhLnVzYl9pZmFjZS0+Y3VyX2FsdHNldHRpbmc7CisKKwkJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKGh3YWhjLT53YS51c2JfZGV2LAorCQkJCXVzYl9zbmRjdHJscGlwZShod2FoYy0+d2EudXNiX2RldiwgMCksCisJCQkJV0FfUkVRX0FMRVJFT05fRElTQUJMRV9YRkVSX05PVElGSUNBVElPTlMsCisJCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfAorCQkJCQlVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkJCVdBX1JFUV9BTEVSRU9OX0ZFQVRVUkVfU0VULAorCQkJCWN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsCisJCQkJTlVMTCwgMCwKKwkJCQlVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisJCS8qCisJCSAqIElmIHdlIHN1Y2Nlc3NmdWxseSBzZW50IHRoZSBjb250cm9sIG1lc3NhZ2UsIHN0YXJ0IERUSSBoZXJlCisJCSAqIGJlY2F1c2Ugbm8gdHJhbnNmZXIgbm90aWZpY2F0aW9ucyB3aWxsIGJlIHJlY2VpdmVkIHdoaWNoIGlzCisJCSAqIHdoZXJlIERUSSBpcyBub3JtYWxseSBzdGFydGVkLgorCQkgKi8KKwkJaWYgKHJlc3VsdCA9PSAwKQorCQkJcmVzdWx0ID0gd2FfZHRpX3N0YXJ0KCZod2FoYy0+d2EpOworCQllbHNlCisJCQlyZXN1bHQgPSAwOwkvKiBPSy4gIENvbnRpbnVlIG5vcm1hbGx5LiAqLworCisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgImNhbm5vdCBzdGFydCBEVEk6ICVkXG4iLCByZXN1bHQpOworCQkJZ290byBlcnJvcl9kdGlfc3RhcnQ7CisJCX0KKwl9CisKIAlyZXR1cm4gcmVzdWx0OwogCitlcnJvcl9kdGlfc3RhcnQ6CisJd2FfbmVwX2Rpc2FybSgmaHdhaGMtPndhKTsKIGVycm9yX3N0b3A6CiAJX193YV9jbGVhcl9mZWF0dXJlKCZod2FoYy0+d2EsIFdBX0VOQUJMRSk7CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTgyNywxMCArODYzLDEyIEBACiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaHdhaGNfaWRfdGFibGVbXSA9IHsKIAkvKiBBbGVyZW9uIDUzMTAgKi8KIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MTNkYywgMHg1MzEwLCAweGUwLCAweDAyLCAweDAxKSwKLQkgIC5kcml2ZXJfaW5mbyA9IFdVU0JfUVVJUktfQUxFUkVPTl9IV0FfQ09OQ0FUX0lTT0MgfSwKKwkgIC5kcml2ZXJfaW5mbyA9IFdVU0JfUVVJUktfQUxFUkVPTl9IV0FfQ09OQ0FUX0lTT0MgfAorCQlXVVNCX1FVSVJLX0FMRVJFT05fSFdBX0RJU0FCTEVfWEZFUl9OT1RJRklDQVRJT05TIH0sCiAJLyogQWxlcmVvbiA1NjExICovCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDEzZGMsIDB4NTYxMSwgMHhlMCwgMHgwMiwgMHgwMSksCi0JICAuZHJpdmVyX2luZm8gPSBXVVNCX1FVSVJLX0FMRVJFT05fSFdBX0NPTkNBVF9JU09DIH0sCisJICAuZHJpdmVyX2luZm8gPSBXVVNCX1FVSVJLX0FMRVJFT05fSFdBX0NPTkNBVF9JU09DIHwKKwkJV1VTQl9RVUlSS19BTEVSRU9OX0hXQV9ESVNBQkxFX1hGRVJfTk9USUZJQ0FUSU9OUyB9LAogCS8qIEZJWE1FOiB1c2UgY2xhc3MgbGFiZWxzIGZvciB0aGlzICovCiAJeyBVU0JfSU5URVJGQUNFX0lORk8oMHhlMCwgMHgwMiwgMHgwMSksIH0sCiAJe30sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcGxhdGZvcm0uYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbGF0Zm9ybS5jCmluZGV4IDY4ZjY3NGMuLmI2MDAyYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbGF0Zm9ybS5jCkBAIC0zLDYgKzMsNyBAQAogICoKICAqIENvcHlyaWdodCAyMDA3IE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAgKiBDb3B5cmlnaHQgMjAxMS0yMDEyIEhhdWtlIE1laHJ0ZW5zIDxoYXVrZUBoYXVrZS1tLmRlPgorICogQ29weXJpZ2h0IDIwMTQgSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KICAqCiAgKiBEZXJpdmVkIGZyb20gdGhlIE9DSEktU1NCIGRyaXZlcgogICogRGVyaXZlZCBmcm9tIHRoZSBPSENJLVBDSSBkcml2ZXIKQEAgLTE0LDExICsxNSwxNCBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdOVS9HUEwuIFNlZSBDT1BZSU5HIGZvciBkZXRhaWxzLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC91c2Ivb2hjaV9wZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CkBAIC0yNyw2ICszMSwxMyBAQAogI2luY2x1ZGUgIm9oY2kuaCIKIAogI2RlZmluZSBEUklWRVJfREVTQyAiT0hDSSBnZW5lcmljIHBsYXRmb3JtIGRyaXZlciIKKyNkZWZpbmUgT0hDSV9NQVhfQ0xLUyAzCisjZGVmaW5lIGhjZF90b19vaGNpX3ByaXYoaCkgKChzdHJ1Y3Qgb2hjaV9wbGF0Zm9ybV9wcml2ICopaGNkX3RvX29oY2koaCktPnByaXYpCisKK3N0cnVjdCBvaGNpX3BsYXRmb3JtX3ByaXYgeworCXN0cnVjdCBjbGsgKmNsa3NbT0hDSV9NQVhfQ0xLU107CisJc3RydWN0IHBoeSAqcGh5OworfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgaGNkX25hbWVbXSA9ICJvaGNpLXBsYXRmb3JtIjsKIApAQCAtMzYsMTAgKzQ3LDYgQEAKIAlzdHJ1Y3QgdXNiX29oY2lfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKIAlzdHJ1Y3Qgb2hjaV9oY2QgKm9oY2kgPSBoY2RfdG9fb2hjaShoY2QpOwogCi0JaWYgKHBkYXRhLT5iaWdfZW5kaWFuX2Rlc2MpCi0JCW9oY2ktPmZsYWdzIHw9IE9IQ0lfUVVJUktfQkVfREVTQzsKLQlpZiAocGRhdGEtPmJpZ19lbmRpYW5fbW1pbykKLQkJb2hjaS0+ZmxhZ3MgfD0gT0hDSV9RVUlSS19CRV9NTUlPOwogCWlmIChwZGF0YS0+bm9fYmlnX2ZyYW1lX25vKQogCQlvaGNpLT5mbGFncyB8PSBPSENJX1FVSVJLX0ZSQU1FX05POwogCWlmIChwZGF0YS0+bnVtX3BvcnRzKQpAQCAtNDgsMTEgKzU1LDY3IEBACiAJcmV0dXJuIG9oY2lfc2V0dXAoaGNkKTsKIH0KIAorc3RhdGljIGludCBvaGNpX3BsYXRmb3JtX3Bvd2VyX29uKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgb2hjaV9wbGF0Zm9ybV9wcml2ICpwcml2ID0gaGNkX3RvX29oY2lfcHJpdihoY2QpOworCWludCBjbGssIHJldDsKKworCWZvciAoY2xrID0gMDsgY2xrIDwgT0hDSV9NQVhfQ0xLUyAmJiBwcml2LT5jbGtzW2Nsa107IGNsaysrKSB7CisJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShwcml2LT5jbGtzW2Nsa10pOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfZGlzYWJsZV9jbGtzOworCX0KKworCWlmIChwcml2LT5waHkpIHsKKwkJcmV0ID0gcGh5X2luaXQocHJpdi0+cGh5KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2Rpc2FibGVfY2xrczsKKworCQlyZXQgPSBwaHlfcG93ZXJfb24ocHJpdi0+cGh5KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2V4aXRfcGh5OworCX0KKworCXJldHVybiAwOworCitlcnJfZXhpdF9waHk6CisJcGh5X2V4aXQocHJpdi0+cGh5KTsKK2Vycl9kaXNhYmxlX2Nsa3M6CisJd2hpbGUgKC0tY2xrID49IDApCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcml2LT5jbGtzW2Nsa10pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgb2hjaV9wbGF0Zm9ybV9wb3dlcl9vZmYoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBvaGNpX3BsYXRmb3JtX3ByaXYgKnByaXYgPSBoY2RfdG9fb2hjaV9wcml2KGhjZCk7CisJaW50IGNsazsKKworCWlmIChwcml2LT5waHkpIHsKKwkJcGh5X3Bvd2VyX29mZihwcml2LT5waHkpOworCQlwaHlfZXhpdChwcml2LT5waHkpOworCX0KKworCWZvciAoY2xrID0gT0hDSV9NQVhfQ0xLUyAtIDE7IGNsayA+PSAwOyBjbGstLSkKKwkJaWYgKHByaXYtPmNsa3NbY2xrXSkKKwkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcml2LT5jbGtzW2Nsa10pOworfQorCiBzdGF0aWMgc3RydWN0IGhjX2RyaXZlciBfX3JlYWRfbW9zdGx5IG9oY2lfcGxhdGZvcm1faGNfZHJpdmVyOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9oY2lfZHJpdmVyX292ZXJyaWRlcyBwbGF0Zm9ybV9vdmVycmlkZXMgX19pbml0Y29uc3QgPSB7Ci0JLnByb2R1Y3RfZGVzYyA9CSJHZW5lcmljIFBsYXRmb3JtIE9IQ0kgY29udHJvbGxlciIsCi0JLnJlc2V0ID0Jb2hjaV9wbGF0Zm9ybV9yZXNldCwKKwkucHJvZHVjdF9kZXNjID0JCSJHZW5lcmljIFBsYXRmb3JtIE9IQ0kgY29udHJvbGxlciIsCisJLnJlc2V0ID0JCW9oY2lfcGxhdGZvcm1fcmVzZXQsCisJLmV4dHJhX3ByaXZfc2l6ZSA9CXNpemVvZihzdHJ1Y3Qgb2hjaV9wbGF0Zm9ybV9wcml2KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX29oY2lfcGRhdGEgb2hjaV9wbGF0Zm9ybV9kZWZhdWx0cyA9IHsKKwkucG93ZXJfb24gPQkJb2hjaV9wbGF0Zm9ybV9wb3dlcl9vbiwKKwkucG93ZXJfc3VzcGVuZCA9CW9oY2lfcGxhdGZvcm1fcG93ZXJfb2ZmLAorCS5wb3dlcl9vZmYgPQkJb2hjaV9wbGF0Zm9ybV9wb3dlcl9vZmYsCiB9OwogCiBzdGF0aWMgaW50IG9oY2lfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQpAQCAtNjAsMTcgKzEyMywyNCBAQAogCXN0cnVjdCB1c2JfaGNkICpoY2Q7CiAJc3RydWN0IHJlc291cmNlICpyZXNfbWVtOwogCXN0cnVjdCB1c2Jfb2hjaV9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZkZXYtPmRldik7Ci0JaW50IGlycTsKLQlpbnQgZXJyID0gLUVOT01FTTsKLQotCWlmICghcGRhdGEpIHsKLQkJV0FSTl9PTigxKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCXN0cnVjdCBvaGNpX3BsYXRmb3JtX3ByaXYgKnByaXY7CisJc3RydWN0IG9oY2lfaGNkICpvaGNpOworCWludCBlcnIsIGlycSwgY2xrID0gMDsKIAogCWlmICh1c2JfZGlzYWJsZWQoKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwkvKgorCSAqIFVzZSByZWFzb25hYmxlIGRlZmF1bHRzIHNvIHBsYXRmb3JtcyBkb24ndCBoYXZlIHRvIHByb3ZpZGUgdGhlc2UKKwkgKiB3aXRoIERUIHByb2Jpbmcgb24gQVJNLgorCSAqLworCWlmICghcGRhdGEpCisJCXBkYXRhID0gJm9oY2lfcGxhdGZvcm1fZGVmYXVsdHM7CisKKwllcnIgPSBkbWFfY29lcmNlX21hc2tfYW5kX2NvaGVyZW50KCZkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEoZGV2LCAwKTsKIAlpZiAoaXJxIDwgMCkgewogCQlkZXZfZXJyKCZkZXYtPmRldiwgIm5vIGlycSBwcm92aWRlZCIpOwpAQCAtODMsMTcgKzE1Myw3MiBAQAogCQlyZXR1cm4gLUVOWElPOwogCX0KIAorCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZvaGNpX3BsYXRmb3JtX2hjX2RyaXZlciwgJmRldi0+ZGV2LAorCQkJZGV2X25hbWUoJmRldi0+ZGV2KSk7CisJaWYgKCFoY2QpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBoY2QpOworCWRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKKwlwcml2ID0gaGNkX3RvX29oY2lfcHJpdihoY2QpOworCW9oY2kgPSBoY2RfdG9fb2hjaShoY2QpOworCisJaWYgKHBkYXRhID09ICZvaGNpX3BsYXRmb3JtX2RlZmF1bHRzICYmIGRldi0+ZGV2Lm9mX25vZGUpIHsKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPmRldi5vZl9ub2RlLCAiYmlnLWVuZGlhbi1yZWdzIikpCisJCQlvaGNpLT5mbGFncyB8PSBPSENJX1FVSVJLX0JFX01NSU87CisKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPmRldi5vZl9ub2RlLCAiYmlnLWVuZGlhbi1kZXNjIikpCisJCQlvaGNpLT5mbGFncyB8PSBPSENJX1FVSVJLX0JFX0RFU0M7CisKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPmRldi5vZl9ub2RlLCAiYmlnLWVuZGlhbiIpKQorCQkJb2hjaS0+ZmxhZ3MgfD0gT0hDSV9RVUlSS19CRV9NTUlPIHwgT0hDSV9RVUlSS19CRV9ERVNDOworCisJCXByaXYtPnBoeSA9IGRldm1fcGh5X2dldCgmZGV2LT5kZXYsICJ1c2IiKTsKKwkJaWYgKElTX0VSUihwcml2LT5waHkpKSB7CisJCQllcnIgPSBQVFJfRVJSKHByaXYtPnBoeSk7CisJCQlpZiAoZXJyID09IC1FUFJPQkVfREVGRVIpCisJCQkJZ290byBlcnJfcHV0X2hjZDsKKwkJCXByaXYtPnBoeSA9IE5VTEw7CisJCX0KKworCQlmb3IgKGNsayA9IDA7IGNsayA8IE9IQ0lfTUFYX0NMS1M7IGNsaysrKSB7CisJCQlwcml2LT5jbGtzW2Nsa10gPSBvZl9jbGtfZ2V0KGRldi0+ZGV2Lm9mX25vZGUsIGNsayk7CisJCQlpZiAoSVNfRVJSKHByaXYtPmNsa3NbY2xrXSkpIHsKKwkJCQllcnIgPSBQVFJfRVJSKHByaXYtPmNsa3NbY2xrXSk7CisJCQkJaWYgKGVyciA9PSAtRVBST0JFX0RFRkVSKQorCQkJCQlnb3RvIGVycl9wdXRfY2xrczsKKwkJCQlwcml2LT5jbGtzW2Nsa10gPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKHBkYXRhLT5iaWdfZW5kaWFuX2Rlc2MpCisJCW9oY2ktPmZsYWdzIHw9IE9IQ0lfUVVJUktfQkVfREVTQzsKKwlpZiAocGRhdGEtPmJpZ19lbmRpYW5fbW1pbykKKwkJb2hjaS0+ZmxhZ3MgfD0gT0hDSV9RVUlSS19CRV9NTUlPOworCisjaWZuZGVmIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8KKwlpZiAob2hjaS0+ZmxhZ3MgJiBPSENJX1FVSVJLX0JFX01NSU8pIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkiRXJyb3I6IENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8gbm90IHNldFxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3B1dF9jbGtzOworCX0KKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9ERVNDCisJaWYgKG9oY2ktPmZsYWdzICYgT0hDSV9RVUlSS19CRV9ERVNDKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJIkVycm9yOiBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9ERVNDIG5vdCBzZXRcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycl9wdXRfY2xrczsKKwl9CisjZW5kaWYKKwogCWlmIChwZGF0YS0+cG93ZXJfb24pIHsKIAkJZXJyID0gcGRhdGEtPnBvd2VyX29uKGRldik7CiAJCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQloY2QgPSB1c2JfY3JlYXRlX2hjZCgmb2hjaV9wbGF0Zm9ybV9oY19kcml2ZXIsICZkZXYtPmRldiwKLQkJCWRldl9uYW1lKCZkZXYtPmRldikpOwotCWlmICghaGNkKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3Bvd2VyOworCQkJZ290byBlcnJfcHV0X2Nsa3M7CiAJfQogCiAJaGNkLT5yc3JjX3N0YXJ0ID0gcmVzX21lbS0+c3RhcnQ7CkBAIC0xMDIsMTEgKzIyNywxMSBAQAogCWhjZC0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmZGV2LT5kZXYsIHJlc19tZW0pOwogCWlmIChJU19FUlIoaGNkLT5yZWdzKSkgewogCQllcnIgPSBQVFJfRVJSKGhjZC0+cmVncyk7Ci0JCWdvdG8gZXJyX3B1dF9oY2Q7CisJCWdvdG8gZXJyX3Bvd2VyOwogCX0KIAllcnIgPSB1c2JfYWRkX2hjZChoY2QsIGlycSwgSVJRRl9TSEFSRUQpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyX3B1dF9oY2Q7CisJCWdvdG8gZXJyX3Bvd2VyOwogCiAJZGV2aWNlX3dha2V1cF9lbmFibGUoaGNkLT5zZWxmLmNvbnRyb2xsZXIpOwogCkBAIC0xMTQsMTEgKzIzOSwxNyBAQAogCiAJcmV0dXJuIGVycjsKIAotZXJyX3B1dF9oY2Q6Ci0JdXNiX3B1dF9oY2QoaGNkKTsKIGVycl9wb3dlcjoKIAlpZiAocGRhdGEtPnBvd2VyX29mZikKIAkJcGRhdGEtPnBvd2VyX29mZihkZXYpOworZXJyX3B1dF9jbGtzOgorCXdoaWxlICgtLWNsayA+PSAwKQorCQljbGtfcHV0KHByaXYtPmNsa3NbY2xrXSk7CitlcnJfcHV0X2hjZDoKKwlpZiAocGRhdGEgPT0gJm9oY2lfcGxhdGZvcm1fZGVmYXVsdHMpCisJCWRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBOVUxMOworCisJdXNiX3B1dF9oY2QoaGNkKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0xMjcsMTMgKzI1OCwyMiBAQAogewogCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCB1c2Jfb2hjaV9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZkZXYtPmRldik7CisJc3RydWN0IG9oY2lfcGxhdGZvcm1fcHJpdiAqcHJpdiA9IGhjZF90b19vaGNpX3ByaXYoaGNkKTsKKwlpbnQgY2xrOwogCiAJdXNiX3JlbW92ZV9oY2QoaGNkKTsKLQl1c2JfcHV0X2hjZChoY2QpOwogCiAJaWYgKHBkYXRhLT5wb3dlcl9vZmYpCiAJCXBkYXRhLT5wb3dlcl9vZmYoZGV2KTsKIAorCWZvciAoY2xrID0gMDsgY2xrIDwgT0hDSV9NQVhfQ0xLUyAmJiBwcml2LT5jbGtzW2Nsa107IGNsaysrKQorCQljbGtfcHV0KHByaXYtPmNsa3NbY2xrXSk7CisKKwl1c2JfcHV0X2hjZChoY2QpOworCisJaWYgKHBkYXRhID09ICZvaGNpX3BsYXRmb3JtX2RlZmF1bHRzKQorCQlkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gTlVMTDsKKwogCXJldHVybiAwOwogfQogCkBAIC0xODAsNiArMzIwLDEyIEBACiAjZGVmaW5lIG9oY2lfcGxhdGZvcm1fcmVzdW1lCU5VTEwKICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2hjaV9wbGF0Zm9ybV9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImdlbmVyaWMtb2hjaSIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb2hjaV9wbGF0Zm9ybV9pZHMpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBvaGNpX3BsYXRmb3JtX3RhYmxlW10gPSB7CiAJeyAib2hjaS1wbGF0Zm9ybSIsIDAgfSwKIAl7IH0KQEAgLTIwMCw2ICszNDYsNyBAQAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJPSAib2hjaS1wbGF0Zm9ybSIsCiAJCS5wbQk9ICZvaGNpX3BsYXRmb3JtX3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gb2hjaV9wbGF0Zm9ybV9pZHMsCiAJfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC91aGNpLXBsYXRmb3JtLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktcGxhdGZvcm0uYwppbmRleCA0NGU2YzlkLi4wMTgzM2FiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktcGxhdGZvcm0uYwpAQCAtMTQ4LDYgKzE0OCw3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBsYXRmb3JtX3VoY2lfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJnZW5lcmljLXVoY2kiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAicGxhdGZvcm0tdWhjaSIsIH0sCiAJe30KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktaHViLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktaHViLmMKaW5kZXggOTk5MmZiZi4uMWFkNmJjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLWh1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1odWIuYwpAQCAtNzMyLDkgKzczMiwxMSBAQAogCQkvKiBTZXQgdGhlIFUxIGFuZCBVMiBleGl0IGxhdGVuY2llcy4gKi8KIAkJbWVtY3B5KGJ1ZiwgJnVzYl9ib3NfZGVzY3JpcHRvciwKIAkJCQlVU0JfRFRfQk9TX1NJWkUgKyBVU0JfRFRfVVNCX1NTX0NBUF9TSVpFKTsKLQkJdGVtcCA9IHJlYWRsKCZ4aGNpLT5jYXBfcmVncy0+aGNzX3BhcmFtczMpOwotCQlidWZbMTJdID0gSENTX1UxX0xBVEVOQ1kodGVtcCk7Ci0JCXB1dF91bmFsaWduZWRfbGUxNihIQ1NfVTJfTEFURU5DWSh0ZW1wKSwgJmJ1ZlsxM10pOworCQlpZiAoKHhoY2ktPnF1aXJrcyAmIFhIQ0lfTFBNX1NVUFBPUlQpKSB7CisJCQl0ZW1wID0gcmVhZGwoJnhoY2ktPmNhcF9yZWdzLT5oY3NfcGFyYW1zMyk7CisJCQlidWZbMTJdID0gSENTX1UxX0xBVEVOQ1kodGVtcCk7CisJCQlwdXRfdW5hbGlnbmVkX2xlMTYoSENTX1UyX0xBVEVOQ1kodGVtcCksICZidWZbMTNdKTsKKwkJfQogCiAJCS8qIEluZGljYXRlIHdoZXRoZXIgdGhlIGhvc3QgaGFzIExUTSBzdXBwb3J0LiAqLwogCQl0ZW1wID0gcmVhZGwoJnhoY2ktPmNhcF9yZWdzLT5oY2NfcGFyYW1zKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1tZW0uYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1tZW0uYwppbmRleCBiY2U0MzkxLi5jMDg5NjY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktbWVtLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLW1lbS5jCkBAIC0xNDksMTQgKzE0OSwxNDAgQEAKIAl9CiB9CiAKKy8qCisgKiBXZSBuZWVkIGEgcmFkaXggdHJlZSBmb3IgbWFwcGluZyBwaHlzaWNhbCBhZGRyZXNzZXMgb2YgVFJCcyB0byB3aGljaCBzdHJlYW0KKyAqIElEIHRoZXkgYmVsb25nIHRvLiAgV2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UgdGhlIGhvc3QgY29udHJvbGxlciB3b24ndCB0ZWxsCisgKiB1cyB3aGljaCBzdHJlYW0gcmluZyB0aGUgVFJCIGNhbWUgZnJvbS4gIFdlIGNvdWxkIHN0b3JlIHRoZSBzdHJlYW0gSUQgaW4gYW4KKyAqIGV2ZW50IGRhdGEgVFJCLCBidXQgdGhhdCBkb2Vzbid0IGhlbHAgdXMgZm9yIHRoZSBjYW5jZWxsYXRpb24gY2FzZSwgc2luY2UgdGhlCisgKiBlbmRwb2ludCBtYXkgc3RvcCBiZWZvcmUgaXQgcmVhY2hlcyB0aGF0IGV2ZW50IGRhdGEgVFJCLgorICoKKyAqIFRoZSByYWRpeCB0cmVlIG1hcHMgdGhlIHVwcGVyIHBvcnRpb24gb2YgdGhlIFRSQiBETUEgYWRkcmVzcyB0byBhIHJpbmcKKyAqIHNlZ21lbnQgdGhhdCBoYXMgdGhlIHNhbWUgdXBwZXIgcG9ydGlvbiBvZiBETUEgYWRkcmVzc2VzLiAgRm9yIGV4YW1wbGUsIHNheSBJCisgKiBoYXZlIHNlZ21lbnRzIG9mIHNpemUgMUtCLCB0aGF0IGFyZSBhbHdheXMgMUtCIGFsaWduZWQuICBBIHNlZ21lbnQgbWF5CisgKiBzdGFydCBhdCAweDEwYzkxMDAwIGFuZCBlbmQgYXQgMHgxMGM5MTNmMC4gIElmIEkgdXNlIHRoZSB1cHBlciAxMCBiaXRzLCB0aGUKKyAqIGtleSB0byB0aGUgc3RyZWFtIElEIGlzIDB4NDMyNDQuICBJIGNhbiB1c2UgdGhlIERNQSBhZGRyZXNzIG9mIHRoZSBUUkIgdG8KKyAqIHBhc3MgdGhlIHJhZGl4IHRyZWUgYSBrZXkgdG8gZ2V0IHRoZSByaWdodCBzdHJlYW0gSUQ6CisgKgorICoJMHgxMGM5MGZmZiA+PiAxMCA9IDB4NDMyNDMKKyAqCTB4MTBjOTEyYzAgPj4gMTAgPSAweDQzMjQ0CisgKgkweDEwYzkxNDAwID4+IDEwID0gMHg0MzI0NQorICoKKyAqIE9idmlvdXNseSwgb25seSB0aG9zZSBUUkJzIHdpdGggRE1BIGFkZHJlc3NlcyB0aGF0IGFyZSB3aXRoaW4gdGhlIHNlZ21lbnQKKyAqIHdpbGwgbWFrZSB0aGUgcmFkaXggdHJlZSByZXR1cm4gdGhlIHN0cmVhbSBJRCBmb3IgdGhhdCByaW5nLgorICoKKyAqIENhdmVhdHMgZm9yIHRoZSByYWRpeCB0cmVlOgorICoKKyAqIFRoZSByYWRpeCB0cmVlIHVzZXMgYW4gdW5zaWduZWQgbG9uZyBhcyBhIGtleSBwYWlyLiAgT24gMzItYml0IHN5c3RlbXMsIGFuCisgKiB1bnNpZ25lZCBsb25nIHdpbGwgYmUgMzItYml0czsgb24gYSA2NC1iaXQgc3lzdGVtIGFuIHVuc2lnbmVkIGxvbmcgd2lsbCBiZQorICogNjQtYml0cy4gIFNpbmNlIHdlIG9ubHkgcmVxdWVzdCAzMi1iaXQgRE1BIGFkZHJlc3Nlcywgd2UgY2FuIHVzZSB0aGF0IGFzIHRoZQorICoga2V5IG9uIDMyLWJpdCBvciA2NC1iaXQgc3lzdGVtcyAoaXQgd291bGQgYWxzbyBiZSBmaW5lIGlmIHdlIGFza2VkIGZvciA2NC1iaXQKKyAqIFBDSSBETUEgYWRkcmVzc2VzIG9uIGEgNjQtYml0IHN5c3RlbSkuICBUaGVyZSBtaWdodCBiZSBhIHByb2JsZW0gb24gMzItYml0CisgKiBleHRlbmRlZCBzeXN0ZW1zICh3aGVyZSB0aGUgRE1BIGFkZHJlc3MgY2FuIGJlIGJpZ2dlciB0aGFuIDMyLWJpdHMpLAorICogaWYgd2UgYWxsb3cgdGhlIFBDSSBkbWEgbWFzayB0byBiZSBiaWdnZXIgdGhhbiAzMi1iaXRzLiAgU28gZG9uJ3QgZG8gdGhhdC4KKyAqLworc3RhdGljIGludCB4aGNpX2luc2VydF9zZWdtZW50X21hcHBpbmcoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqdHJiX2FkZHJlc3NfbWFwLAorCQlzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nLAorCQlzdHJ1Y3QgeGhjaV9zZWdtZW50ICpzZWcsCisJCWdmcF90IG1lbV9mbGFncykKK3sKKwl1bnNpZ25lZCBsb25nIGtleTsKKwlpbnQgcmV0OworCisJa2V5ID0gKHVuc2lnbmVkIGxvbmcpKHNlZy0+ZG1hID4+IFRSQl9TRUdNRU5UX1NISUZUKTsKKwkvKiBTa2lwIGFueSBzZWdtZW50cyB0aGF0IHdlcmUgYWxyZWFkeSBhZGRlZC4gKi8KKwlpZiAocmFkaXhfdHJlZV9sb29rdXAodHJiX2FkZHJlc3NfbWFwLCBrZXkpKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHJhZGl4X3RyZWVfbWF5YmVfcHJlbG9hZChtZW1fZmxhZ3MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gcmFkaXhfdHJlZV9pbnNlcnQodHJiX2FkZHJlc3NfbWFwLAorCQkJa2V5LCByaW5nKTsKKwlyYWRpeF90cmVlX3ByZWxvYWRfZW5kKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgeGhjaV9yZW1vdmVfc2VnbWVudF9tYXBwaW5nKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnRyYl9hZGRyZXNzX21hcCwKKwkJc3RydWN0IHhoY2lfc2VnbWVudCAqc2VnKQoreworCXVuc2lnbmVkIGxvbmcga2V5OworCisJa2V5ID0gKHVuc2lnbmVkIGxvbmcpKHNlZy0+ZG1hID4+IFRSQl9TRUdNRU5UX1NISUZUKTsKKwlpZiAocmFkaXhfdHJlZV9sb29rdXAodHJiX2FkZHJlc3NfbWFwLCBrZXkpKQorCQlyYWRpeF90cmVlX2RlbGV0ZSh0cmJfYWRkcmVzc19tYXAsIGtleSk7Cit9CisKK3N0YXRpYyBpbnQgeGhjaV91cGRhdGVfc3RyZWFtX3NlZ21lbnRfbWFwcGluZygKKwkJc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqdHJiX2FkZHJlc3NfbWFwLAorCQlzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nLAorCQlzdHJ1Y3QgeGhjaV9zZWdtZW50ICpmaXJzdF9zZWcsCisJCXN0cnVjdCB4aGNpX3NlZ21lbnQgKmxhc3Rfc2VnLAorCQlnZnBfdCBtZW1fZmxhZ3MpCit7CisJc3RydWN0IHhoY2lfc2VnbWVudCAqc2VnOworCXN0cnVjdCB4aGNpX3NlZ21lbnQgKmZhaWxlZF9zZWc7CisJaW50IHJldDsKKworCWlmIChXQVJOX09OX09OQ0UodHJiX2FkZHJlc3NfbWFwID09IE5VTEwpKQorCQlyZXR1cm4gMDsKKworCXNlZyA9IGZpcnN0X3NlZzsKKwlkbyB7CisJCXJldCA9IHhoY2lfaW5zZXJ0X3NlZ21lbnRfbWFwcGluZyh0cmJfYWRkcmVzc19tYXAsCisJCQkJcmluZywgc2VnLCBtZW1fZmxhZ3MpOworCQlpZiAocmV0KQorCQkJZ290byByZW1vdmVfc3RyZWFtczsKKwkJaWYgKHNlZyA9PSBsYXN0X3NlZykKKwkJCXJldHVybiAwOworCQlzZWcgPSBzZWctPm5leHQ7CisJfSB3aGlsZSAoc2VnICE9IGZpcnN0X3NlZyk7CisKKwlyZXR1cm4gMDsKKworcmVtb3ZlX3N0cmVhbXM6CisJZmFpbGVkX3NlZyA9IHNlZzsKKwlzZWcgPSBmaXJzdF9zZWc7CisJZG8geworCQl4aGNpX3JlbW92ZV9zZWdtZW50X21hcHBpbmcodHJiX2FkZHJlc3NfbWFwLCBzZWcpOworCQlpZiAoc2VnID09IGZhaWxlZF9zZWcpCisJCQlyZXR1cm4gcmV0OworCQlzZWcgPSBzZWctPm5leHQ7CisJfSB3aGlsZSAoc2VnICE9IGZpcnN0X3NlZyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB4aGNpX3JlbW92ZV9zdHJlYW1fbWFwcGluZyhzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nKQoreworCXN0cnVjdCB4aGNpX3NlZ21lbnQgKnNlZzsKKworCWlmIChXQVJOX09OX09OQ0UocmluZy0+dHJiX2FkZHJlc3NfbWFwID09IE5VTEwpKQorCQlyZXR1cm47CisKKwlzZWcgPSByaW5nLT5maXJzdF9zZWc7CisJZG8geworCQl4aGNpX3JlbW92ZV9zZWdtZW50X21hcHBpbmcocmluZy0+dHJiX2FkZHJlc3NfbWFwLCBzZWcpOworCQlzZWcgPSBzZWctPm5leHQ7CisJfSB3aGlsZSAoc2VnICE9IHJpbmctPmZpcnN0X3NlZyk7Cit9CisKK3N0YXRpYyBpbnQgeGhjaV91cGRhdGVfc3RyZWFtX21hcHBpbmcoc3RydWN0IHhoY2lfcmluZyAqcmluZywgZ2ZwX3QgbWVtX2ZsYWdzKQoreworCXJldHVybiB4aGNpX3VwZGF0ZV9zdHJlYW1fc2VnbWVudF9tYXBwaW5nKHJpbmctPnRyYl9hZGRyZXNzX21hcCwgcmluZywKKwkJCXJpbmctPmZpcnN0X3NlZywgcmluZy0+bGFzdF9zZWcsIG1lbV9mbGFncyk7Cit9CisKIC8qIFhYWDogRG8gd2UgbmVlZCB0aGUgaGNkIHN0cnVjdHVyZSBpbiBhbGwgdGhlc2UgZnVuY3Rpb25zPyAqLwogdm9pZCB4aGNpX3JpbmdfZnJlZShzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksIHN0cnVjdCB4aGNpX3JpbmcgKnJpbmcpCiB7CiAJaWYgKCFyaW5nKQogCQlyZXR1cm47CiAKLQlpZiAocmluZy0+Zmlyc3Rfc2VnKQorCWlmIChyaW5nLT5maXJzdF9zZWcpIHsKKwkJaWYgKHJpbmctPnR5cGUgPT0gVFlQRV9TVFJFQU0pCisJCQl4aGNpX3JlbW92ZV9zdHJlYW1fbWFwcGluZyhyaW5nKTsKIAkJeGhjaV9mcmVlX3NlZ21lbnRzX2Zvcl9yaW5nKHhoY2ksIHJpbmctPmZpcnN0X3NlZyk7CisJfQogCiAJa2ZyZWUocmluZyk7CiB9CkBAIC0zNDksNiArNDc1LDIxIEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlpZiAocmluZy0+dHlwZSA9PSBUWVBFX1NUUkVBTSkKKwkJcmV0ID0geGhjaV91cGRhdGVfc3RyZWFtX3NlZ21lbnRfbWFwcGluZyhyaW5nLT50cmJfYWRkcmVzc19tYXAsCisJCQkJCQlyaW5nLCBmaXJzdCwgbGFzdCwgZmxhZ3MpOworCWlmIChyZXQpIHsKKwkJc3RydWN0IHhoY2lfc2VnbWVudCAqbmV4dDsKKwkJZG8geworCQkJbmV4dCA9IGZpcnN0LT5uZXh0OworCQkJeGhjaV9zZWdtZW50X2ZyZWUoeGhjaSwgZmlyc3QpOworCQkJaWYgKGZpcnN0ID09IGxhc3QpCisJCQkJYnJlYWs7CisJCQlmaXJzdCA9IG5leHQ7CisJCX0gd2hpbGUgKHRydWUpOworCQlyZXR1cm4gcmV0OworCX0KKwogCXhoY2lfbGlua19yaW5ncyh4aGNpLCByaW5nLCBmaXJzdCwgbGFzdCwgbnVtX3NlZ3MpOwogCXhoY2lfZGJnX3RyYWNlKHhoY2ksIHRyYWNlX3hoY2lfZGJnX3JpbmdfZXhwYW5zaW9uLAogCQkJInJpbmcgZXhwYW5zaW9uIHN1Y2NlZWQsIG5vdyBoYXMgJWQgc2VnbWVudHMiLApAQCAtNDM0LDEyICs1NzUsMTIgQEAKIAkJc3RydWN0IHhoY2lfc3RyZWFtX2N0eCAqc3RyZWFtX2N0eCwgZG1hX2FkZHJfdCBkbWEpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0geGhjaV90b19oY2QoeGhjaSktPnNlbGYuY29udHJvbGxlcjsKKwlzaXplX3Qgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgeGhjaV9zdHJlYW1fY3R4KSAqIG51bV9zdHJlYW1fY3R4czsKIAotCWlmIChudW1fc3RyZWFtX2N0eHMgPiBNRURJVU1fU1RSRUFNX0FSUkFZX1NJWkUpCi0JCWRtYV9mcmVlX2NvaGVyZW50KGRldiwKLQkJCQlzaXplb2Yoc3RydWN0IHhoY2lfc3RyZWFtX2N0eCkqbnVtX3N0cmVhbV9jdHhzLAorCWlmIChzaXplID4gTUVESVVNX1NUUkVBTV9BUlJBWV9TSVpFKQorCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIHNpemUsCiAJCQkJc3RyZWFtX2N0eCwgZG1hKTsKLQllbHNlIGlmIChudW1fc3RyZWFtX2N0eHMgPD0gU01BTExfU1RSRUFNX0FSUkFZX1NJWkUpCisJZWxzZSBpZiAoc2l6ZSA8PSBTTUFMTF9TVFJFQU1fQVJSQVlfU0laRSkKIAkJcmV0dXJuIGRtYV9wb29sX2ZyZWUoeGhjaS0+c21hbGxfc3RyZWFtc19wb29sLAogCQkJCXN0cmVhbV9jdHgsIGRtYSk7CiAJZWxzZQpAQCAtNDYyLDEyICs2MDMsMTIgQEAKIAkJZ2ZwX3QgbWVtX2ZsYWdzKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHhoY2lfdG9faGNkKHhoY2kpLT5zZWxmLmNvbnRyb2xsZXI7CisJc2l6ZV90IHNpemUgPSBzaXplb2Yoc3RydWN0IHhoY2lfc3RyZWFtX2N0eCkgKiBudW1fc3RyZWFtX2N0eHM7CiAKLQlpZiAobnVtX3N0cmVhbV9jdHhzID4gTUVESVVNX1NUUkVBTV9BUlJBWV9TSVpFKQotCQlyZXR1cm4gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwKLQkJCQlzaXplb2Yoc3RydWN0IHhoY2lfc3RyZWFtX2N0eCkqbnVtX3N0cmVhbV9jdHhzLAorCWlmIChzaXplID4gTUVESVVNX1NUUkVBTV9BUlJBWV9TSVpFKQorCQlyZXR1cm4gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSwKIAkJCQlkbWEsIG1lbV9mbGFncyk7Ci0JZWxzZSBpZiAobnVtX3N0cmVhbV9jdHhzIDw9IFNNQUxMX1NUUkVBTV9BUlJBWV9TSVpFKQorCWVsc2UgaWYgKHNpemUgPD0gU01BTExfU1RSRUFNX0FSUkFZX1NJWkUpCiAJCXJldHVybiBkbWFfcG9vbF9hbGxvYyh4aGNpLT5zbWFsbF9zdHJlYW1zX3Bvb2wsCiAJCQkJbWVtX2ZsYWdzLCBkbWEpOwogCWVsc2UKQEAgLTUxMCwzNiArNjUxLDYgQEAKICAqIFRoZSBudW1iZXIgb2Ygc3RyZWFtIGNvbnRleHRzIGluIHRoZSBzdHJlYW0gY29udGV4dCBhcnJheSBtYXkgYmUgYmlnZ2VyIHRoYW4KICAqIHRoZSBudW1iZXIgb2Ygc3RyZWFtcyB0aGUgZHJpdmVyIHdhbnRzIHRvIHVzZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgbnVtYmVyIG9mCiAgKiBzdHJlYW0gY29udGV4dCBhcnJheSBlbnRyaWVzIG11c3QgYmUgYSBwb3dlciBvZiB0d28uCi0gKgotICogV2UgbmVlZCBhIHJhZGl4IHRyZWUgZm9yIG1hcHBpbmcgcGh5c2ljYWwgYWRkcmVzc2VzIG9mIFRSQnMgdG8gd2hpY2ggc3RyZWFtCi0gKiBJRCB0aGV5IGJlbG9uZyB0by4gIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIHRoZSBob3N0IGNvbnRyb2xsZXIgd29uJ3QgdGVsbAotICogdXMgd2hpY2ggc3RyZWFtIHJpbmcgdGhlIFRSQiBjYW1lIGZyb20uICBXZSBjb3VsZCBzdG9yZSB0aGUgc3RyZWFtIElEIGluIGFuCi0gKiBldmVudCBkYXRhIFRSQiwgYnV0IHRoYXQgZG9lc24ndCBoZWxwIHVzIGZvciB0aGUgY2FuY2VsbGF0aW9uIGNhc2UsIHNpbmNlIHRoZQotICogZW5kcG9pbnQgbWF5IHN0b3AgYmVmb3JlIGl0IHJlYWNoZXMgdGhhdCBldmVudCBkYXRhIFRSQi4KLSAqCi0gKiBUaGUgcmFkaXggdHJlZSBtYXBzIHRoZSB1cHBlciBwb3J0aW9uIG9mIHRoZSBUUkIgRE1BIGFkZHJlc3MgdG8gYSByaW5nCi0gKiBzZWdtZW50IHRoYXQgaGFzIHRoZSBzYW1lIHVwcGVyIHBvcnRpb24gb2YgRE1BIGFkZHJlc3Nlcy4gIEZvciBleGFtcGxlLCBzYXkgSQotICogaGF2ZSBzZWdtZW50cyBvZiBzaXplIDFLQiwgdGhhdCBhcmUgYWx3YXlzIDY0LWJ5dGUgYWxpZ25lZC4gIEEgc2VnbWVudCBtYXkKLSAqIHN0YXJ0IGF0IDB4MTBjOTEwMDAgYW5kIGVuZCBhdCAweDEwYzkxM2YwLiAgSWYgSSB1c2UgdGhlIHVwcGVyIDEwIGJpdHMsIHRoZQotICoga2V5IHRvIHRoZSBzdHJlYW0gSUQgaXMgMHg0MzI0NC4gIEkgY2FuIHVzZSB0aGUgRE1BIGFkZHJlc3Mgb2YgdGhlIFRSQiB0bwotICogcGFzcyB0aGUgcmFkaXggdHJlZSBhIGtleSB0byBnZXQgdGhlIHJpZ2h0IHN0cmVhbSBJRDoKLSAqCi0gKiAJMHgxMGM5MGZmZiA+PiAxMCA9IDB4NDMyNDMKLSAqIAkweDEwYzkxMmMwID4+IDEwID0gMHg0MzI0NAotICogCTB4MTBjOTE0MDAgPj4gMTAgPSAweDQzMjQ1Ci0gKgotICogT2J2aW91c2x5LCBvbmx5IHRob3NlIFRSQnMgd2l0aCBETUEgYWRkcmVzc2VzIHRoYXQgYXJlIHdpdGhpbiB0aGUgc2VnbWVudAotICogd2lsbCBtYWtlIHRoZSByYWRpeCB0cmVlIHJldHVybiB0aGUgc3RyZWFtIElEIGZvciB0aGF0IHJpbmcuCi0gKgotICogQ2F2ZWF0cyBmb3IgdGhlIHJhZGl4IHRyZWU6Ci0gKgotICogVGhlIHJhZGl4IHRyZWUgdXNlcyBhbiB1bnNpZ25lZCBsb25nIGFzIGEga2V5IHBhaXIuICBPbiAzMi1iaXQgc3lzdGVtcywgYW4KLSAqIHVuc2lnbmVkIGxvbmcgd2lsbCBiZSAzMi1iaXRzOyBvbiBhIDY0LWJpdCBzeXN0ZW0gYW4gdW5zaWduZWQgbG9uZyB3aWxsIGJlCi0gKiA2NC1iaXRzLiAgU2luY2Ugd2Ugb25seSByZXF1ZXN0IDMyLWJpdCBETUEgYWRkcmVzc2VzLCB3ZSBjYW4gdXNlIHRoYXQgYXMgdGhlCi0gKiBrZXkgb24gMzItYml0IG9yIDY0LWJpdCBzeXN0ZW1zIChpdCB3b3VsZCBhbHNvIGJlIGZpbmUgaWYgd2UgYXNrZWQgZm9yIDY0LWJpdAotICogUENJIERNQSBhZGRyZXNzZXMgb24gYSA2NC1iaXQgc3lzdGVtKS4gIFRoZXJlIG1pZ2h0IGJlIGEgcHJvYmxlbSBvbiAzMi1iaXQKLSAqIGV4dGVuZGVkIHN5c3RlbXMgKHdoZXJlIHRoZSBETUEgYWRkcmVzcyBjYW4gYmUgYmlnZ2VyIHRoYW4gMzItYml0cyksCi0gKiBpZiB3ZSBhbGxvdyB0aGUgUENJIGRtYSBtYXNrIHRvIGJlIGJpZ2dlciB0aGFuIDMyLWJpdHMuICBTbyBkb24ndCBkbyB0aGF0LgogICovCiBzdHJ1Y3QgeGhjaV9zdHJlYW1faW5mbyAqeGhjaV9hbGxvY19zdHJlYW1faW5mbyhzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksCiAJCXVuc2lnbmVkIGludCBudW1fc3RyZWFtX2N0eHMsCkBAIC01NDgsNyArNjU5LDYgQEAKIAlzdHJ1Y3QgeGhjaV9zdHJlYW1faW5mbyAqc3RyZWFtX2luZm87CiAJdTMyIGN1cl9zdHJlYW07CiAJc3RydWN0IHhoY2lfcmluZyAqY3VyX3Jpbmc7Ci0JdW5zaWduZWQgbG9uZyBrZXk7CiAJdTY0IGFkZHI7CiAJaW50IHJldDsKIApAQCAtNjAzLDYgKzcxMyw3IEBACiAJCWlmICghY3VyX3JpbmcpCiAJCQlnb3RvIGNsZWFudXBfcmluZ3M7CiAJCWN1cl9yaW5nLT5zdHJlYW1faWQgPSBjdXJfc3RyZWFtOworCQljdXJfcmluZy0+dHJiX2FkZHJlc3NfbWFwID0gJnN0cmVhbV9pbmZvLT50cmJfYWRkcmVzc19tYXA7CiAJCS8qIFNldCBkZXEgcHRyLCBjeWNsZSBiaXQsIGFuZCBzdHJlYW0gY29udGV4dCB0eXBlICovCiAJCWFkZHIgPSBjdXJfcmluZy0+Zmlyc3Rfc2VnLT5kbWEgfAogCQkJU0NUX0ZPUl9DVFgoU0NUX1BSSV9UUikgfApAQCAtNjEyLDEwICs3MjMsNyBAQAogCQl4aGNpX2RiZyh4aGNpLCAiU2V0dGluZyBzdHJlYW0gJWQgcmluZyBwdHIgdG8gMHglMDhsbHhcbiIsCiAJCQkJY3VyX3N0cmVhbSwgKHVuc2lnbmVkIGxvbmcgbG9uZykgYWRkcik7CiAKLQkJa2V5ID0gKHVuc2lnbmVkIGxvbmcpCi0JCQkoY3VyX3JpbmctPmZpcnN0X3NlZy0+ZG1hID4+IFRSQl9TRUdNRU5UX1NISUZUKTsKLQkJcmV0ID0gcmFkaXhfdHJlZV9pbnNlcnQoJnN0cmVhbV9pbmZvLT50cmJfYWRkcmVzc19tYXAsCi0JCQkJa2V5LCBjdXJfcmluZyk7CisJCXJldCA9IHhoY2lfdXBkYXRlX3N0cmVhbV9tYXBwaW5nKGN1cl9yaW5nLCBtZW1fZmxhZ3MpOwogCQlpZiAocmV0KSB7CiAJCQl4aGNpX3JpbmdfZnJlZSh4aGNpLCBjdXJfcmluZyk7CiAJCQlzdHJlYW1faW5mby0+c3RyZWFtX3JpbmdzW2N1cl9zdHJlYW1dID0gTlVMTDsKQEAgLTYzNSw5ICs3NDMsNiBAQAogCWZvciAoY3VyX3N0cmVhbSA9IDE7IGN1cl9zdHJlYW0gPCBudW1fc3RyZWFtczsgY3VyX3N0cmVhbSsrKSB7CiAJCWN1cl9yaW5nID0gc3RyZWFtX2luZm8tPnN0cmVhbV9yaW5nc1tjdXJfc3RyZWFtXTsKIAkJaWYgKGN1cl9yaW5nKSB7Ci0JCQlhZGRyID0gY3VyX3JpbmctPmZpcnN0X3NlZy0+ZG1hOwotCQkJcmFkaXhfdHJlZV9kZWxldGUoJnN0cmVhbV9pbmZvLT50cmJfYWRkcmVzc19tYXAsCi0JCQkJCWFkZHIgPj4gVFJCX1NFR01FTlRfU0hJRlQpOwogCQkJeGhjaV9yaW5nX2ZyZWUoeGhjaSwgY3VyX3JpbmcpOwogCQkJc3RyZWFtX2luZm8tPnN0cmVhbV9yaW5nc1tjdXJfc3RyZWFtXSA9IE5VTEw7CiAJCX0KQEAgLTY5OCw3ICs4MDMsNiBAQAogewogCWludCBjdXJfc3RyZWFtOwogCXN0cnVjdCB4aGNpX3JpbmcgKmN1cl9yaW5nOwotCWRtYV9hZGRyX3QgYWRkcjsKIAogCWlmICghc3RyZWFtX2luZm8pCiAJCXJldHVybjsKQEAgLTcwNyw5ICs4MTEsNiBAQAogCQkJY3VyX3N0cmVhbSsrKSB7CiAJCWN1cl9yaW5nID0gc3RyZWFtX2luZm8tPnN0cmVhbV9yaW5nc1tjdXJfc3RyZWFtXTsKIAkJaWYgKGN1cl9yaW5nKSB7Ci0JCQlhZGRyID0gY3VyX3JpbmctPmZpcnN0X3NlZy0+ZG1hOwotCQkJcmFkaXhfdHJlZV9kZWxldGUoJnN0cmVhbV9pbmZvLT50cmJfYWRkcmVzc19tYXAsCi0JCQkJCWFkZHIgPj4gVFJCX1NFR01FTlRfU0hJRlQpOwogCQkJeGhjaV9yaW5nX2ZyZWUoeGhjaSwgY3VyX3JpbmcpOwogCQkJc3RyZWFtX2luZm8tPnN0cmVhbV9yaW5nc1tjdXJfc3RyZWFtXSA9IE5VTEw7CiAJCX0KQEAgLTE3MTEsNyArMTgxMiw2IEBACiAKIAlpZiAoeGhjaS0+bHBtX2NvbW1hbmQpCiAJCXhoY2lfZnJlZV9jb21tYW5kKHhoY2ksIHhoY2ktPmxwbV9jb21tYW5kKTsKLQl4aGNpLT5jbWRfcmluZ19yZXNlcnZlZF90cmJzID0gMDsKIAlpZiAoeGhjaS0+Y21kX3JpbmcpCiAJCXhoY2lfcmluZ19mcmVlKHhoY2ksIHhoY2ktPmNtZF9yaW5nKTsKIAl4aGNpLT5jbWRfcmluZyA9IE5VTEw7CkBAIC0xNzc2LDYgKzE4NzYsNyBAQAogCX0KIAogbm9fYnc6CisJeGhjaS0+Y21kX3JpbmdfcmVzZXJ2ZWRfdHJicyA9IDA7CiAJeGhjaS0+bnVtX3VzYjJfcG9ydHMgPSAwOwogCXhoY2ktPm51bV91c2IzX3BvcnRzID0gMDsKIAl4aGNpLT5udW1fYWN0aXZlX2VwcyA9IDA7CkBAIC0yMjc0LDExICsyMzc1LDEyIEBACiAJLyoKIAkgKiBJbml0aWFsaXplIHRoZSByaW5nIHNlZ21lbnQgcG9vbC4gIFRoZSByaW5nIG11c3QgYmUgYSBjb250aWd1b3VzCiAJICogc3RydWN0dXJlIGNvbXByaXNlZCBvZiBUUkJzLiAgVGhlIFRSQnMgbXVzdCBiZSAxNiBieXRlIGFsaWduZWQsCi0JICogaG93ZXZlciwgdGhlIGNvbW1hbmQgcmluZyBzZWdtZW50IG5lZWRzIDY0LWJ5dGUgYWxpZ25lZCBzZWdtZW50cywKLQkgKiBzbyB3ZSBwaWNrIHRoZSBncmVhdGVyIGFsaWdubWVudCBuZWVkLgorCSAqIGhvd2V2ZXIsIHRoZSBjb21tYW5kIHJpbmcgc2VnbWVudCBuZWVkcyA2NC1ieXRlIGFsaWduZWQgc2VnbWVudHMKKwkgKiBhbmQgb3VyIHVzZSBvZiBkbWEgYWRkcmVzc2VzIGluIHRoZSB0cmJfYWRkcmVzc19tYXAgcmFkaXggdHJlZSBuZWVkcworCSAqIFRSQl9TRUdNRU5UX1NJWkUgYWxpZ25tZW50LCBzbyB3ZSBwaWNrIHRoZSBncmVhdGVyIGFsaWdubWVudCBuZWVkLgogCSAqLwogCXhoY2ktPnNlZ21lbnRfcG9vbCA9IGRtYV9wb29sX2NyZWF0ZSgieEhDSSByaW5nIHNlZ21lbnRzIiwgZGV2LAotCQkJVFJCX1NFR01FTlRfU0laRSwgNjQsIHhoY2ktPnBhZ2Vfc2l6ZSk7CisJCQlUUkJfU0VHTUVOVF9TSVpFLCBUUkJfU0VHTUVOVF9TSVpFLCB4aGNpLT5wYWdlX3NpemUpOwogCiAJLyogU2VlIFRhYmxlIDQ2IGFuZCBOb3RlIG9uIEZpZ3VyZSA1NSAqLwogCXhoY2ktPmRldmljZV9wb29sID0gZG1hX3Bvb2xfY3JlYXRlKCJ4SENJIGlucHV0L291dHB1dCBjb250ZXh0cyIsIGRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYwppbmRleCAwNGY5ODZkLi40NzM5MGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCkBAIC0xOTAsNiArMTkwLDEwIEBACiAJc3RydWN0IHVzYl9oY2QgKmhjZDsKIAogCWRyaXZlciA9IChzdHJ1Y3QgaGNfZHJpdmVyICopaWQtPmRyaXZlcl9kYXRhOworCisJLyogUHJldmVudCBydW50aW1lIHN1c3BlbmRpbmcgYmV0d2VlbiBVU0ItMiBhbmQgVVNCLTMgaW5pdGlhbGl6YXRpb24gKi8KKwlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZSgmZGV2LT5kZXYpOworCiAJLyogUmVnaXN0ZXIgdGhlIFVTQiAyLjAgcm9vdGh1Yi4KIAkgKiBGSVhNRTogVVNCIGNvcmUgbXVzdCBrbm93IHRvIHJlZ2lzdGVyIHRoZSBVU0IgMi4wIHJvb3RodWIgZmlyc3QuCiAJICogVGhpcyBpcyBzb3J0IG9mIHNpbGx5LCBiZWNhdXNlIHdlIGNvdWxkIGp1c3Qgc2V0IHRoZSBIQ0QgZHJpdmVyIGZsYWdzCkBAIC0xOTksNyArMjAzLDcgQEAKIAlyZXR2YWwgPSB1c2JfaGNkX3BjaV9wcm9iZShkZXYsIGlkKTsKIAogCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7CisJCWdvdG8gcHV0X3J1bnRpbWVfcG07CiAKIAkvKiBVU0IgMi4wIHJvb3RodWIgaXMgc3RvcmVkIGluIHRoZSBQQ0kgZGV2aWNlIG5vdy4gKi8KIAloY2QgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKQEAgLTIyMiwxMSArMjI2LDExIEBACiAJCWdvdG8gcHV0X3VzYjNfaGNkOwogCS8qIFJvb3RodWIgYWxyZWFkeSBtYXJrZWQgYXMgVVNCIDMuMCBzcGVlZCAqLwogCi0JLyogV2Uga25vdyB0aGUgTFBNIHRpbWVvdXQgYWxnb3JpdGhtcyBmb3IgdGhpcyBob3N0LCBsZXQgdGhlIFVTQiBjb3JlCi0JICogZW5hYmxlIGFuZCBkaXNhYmxlIExQTSBmb3IgZGV2aWNlcyB1bmRlciB0aGUgVVNCIDMuMCByb290aHViLgotCSAqLwotCWlmICh4aGNpLT5xdWlya3MgJiBYSENJX0xQTV9TVVBQT1JUKQotCQloY2RfdG9fYnVzKHhoY2ktPnNoYXJlZF9oY2QpLT5yb290X2h1Yi0+bHBtX2NhcGFibGUgPSAxOworCWlmIChIQ0NfTUFYX1BTQSh4aGNpLT5oY2NfcGFyYW1zKSA+PSA0KQorCQl4aGNpLT5zaGFyZWRfaGNkLT5jYW5fZG9fc3RyZWFtcyA9IDE7CisKKwkvKiBVU0ItMiBhbmQgVVNCLTMgcm9vdGh1YnMgaW5pdGlhbGl6ZWQsIGFsbG93IHJ1bnRpbWUgcG0gc3VzcGVuZCAqLworCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmZGV2LT5kZXYpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTIzNCw2ICsyMzgsOCBAQAogCXVzYl9wdXRfaGNkKHhoY2ktPnNoYXJlZF9oY2QpOwogZGVhbGxvY191c2IyX2hjZDoKIAl1c2JfaGNkX3BjaV9yZW1vdmUoZGV2KTsKK3B1dF9ydW50aW1lX3BtOgorCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmZGV2LT5kZXYpOwogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wbGF0LmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGxhdC5jCmluZGV4IDhhYmRhNWMuLjE1MTkwMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wbGF0LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXBsYXQuYwpAQCAtMTU4LDYgKzE1OCw5IEBACiAJICovCiAJKigoc3RydWN0IHhoY2lfaGNkICoqKSB4aGNpLT5zaGFyZWRfaGNkLT5oY2RfcHJpdikgPSB4aGNpOwogCisJaWYgKEhDQ19NQVhfUFNBKHhoY2ktPmhjY19wYXJhbXMpID49IDQpCisJCXhoY2ktPnNoYXJlZF9oY2QtPmNhbl9kb19zdHJlYW1zID0gMTsKKwogCXJldCA9IHVzYl9hZGRfaGNkKHhoY2ktPnNoYXJlZF9oY2QsIGlycSwgSVJRRl9TSEFSRUQpOwogCWlmIChyZXQpCiAJCWdvdG8gcHV0X3VzYjNfaGNkOwpAQCAtMjI2LDYgKzIyOSw3IEBACiAKICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHVzYl94aGNpX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJnZW5lcmljLXhoY2kiIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJ4aGNpLXBsYXRmb3JtIiB9LAogCXsgfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXJpbmcuYwppbmRleCAwZWQ2NGViLi41ZjkyNmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMKQEAgLTU0Niw5ICs1NDYsOSBAQAogCQlzdHJ1Y3QgeGhjaV9kZXF1ZXVlX3N0YXRlICpzdGF0ZSkKIHsKIAlzdHJ1Y3QgeGhjaV92aXJ0X2RldmljZSAqZGV2ID0geGhjaS0+ZGV2c1tzbG90X2lkXTsKKwlzdHJ1Y3QgeGhjaV92aXJ0X2VwICplcCA9ICZkZXYtPmVwc1tlcF9pbmRleF07CiAJc3RydWN0IHhoY2lfcmluZyAqZXBfcmluZzsKIAlzdHJ1Y3QgeGhjaV9nZW5lcmljX3RyYiAqdHJiOwotCXN0cnVjdCB4aGNpX2VwX2N0eCAqZXBfY3R4OwogCWRtYV9hZGRyX3QgYWRkcjsKIAogCWVwX3JpbmcgPSB4aGNpX3RyaWFkX3RvX3RyYW5zZmVyX3JpbmcoeGhjaSwgc2xvdF9pZCwKQEAgLTU3Myw4ICs1NzMsMTYgQEAKIAkvKiBEaWcgb3V0IHRoZSBjeWNsZSBzdGF0ZSBzYXZlZCBieSB0aGUgeEhDIGR1cmluZyB0aGUgc3RvcCBlcCBjbWQgKi8KIAl4aGNpX2RiZ190cmFjZSh4aGNpLCB0cmFjZV94aGNpX2RiZ19jYW5jZWxfdXJiLAogCQkJIkZpbmRpbmcgZW5kcG9pbnQgY29udGV4dCIpOwotCWVwX2N0eCA9IHhoY2lfZ2V0X2VwX2N0eCh4aGNpLCBkZXYtPm91dF9jdHgsIGVwX2luZGV4KTsKLQlzdGF0ZS0+bmV3X2N5Y2xlX3N0YXRlID0gMHgxICYgbGU2NF90b19jcHUoZXBfY3R4LT5kZXEpOworCS8qIDQuNi45IHRoZSBjc3MgZmxhZyBpcyB3cml0dGVuIHRvIHRoZSBzdHJlYW0gY29udGV4dCBmb3Igc3RyZWFtcyAqLworCWlmIChlcC0+ZXBfc3RhdGUgJiBFUF9IQVNfU1RSRUFNUykgeworCQlzdHJ1Y3QgeGhjaV9zdHJlYW1fY3R4ICpjdHggPQorCQkJJmVwLT5zdHJlYW1faW5mby0+c3RyZWFtX2N0eF9hcnJheVtzdHJlYW1faWRdOworCQlzdGF0ZS0+bmV3X2N5Y2xlX3N0YXRlID0gMHgxICYgbGU2NF90b19jcHUoY3R4LT5zdHJlYW1fcmluZyk7CisJfSBlbHNlIHsKKwkJc3RydWN0IHhoY2lfZXBfY3R4ICplcF9jdHgKKwkJCT0geGhjaV9nZXRfZXBfY3R4KHhoY2ksIGRldi0+b3V0X2N0eCwgZXBfaW5kZXgpOworCQlzdGF0ZS0+bmV3X2N5Y2xlX3N0YXRlID0gMHgxICYgbGU2NF90b19jcHUoZXBfY3R4LT5kZXEpOworCX0KIAogCXN0YXRlLT5uZXdfZGVxX3B0ciA9IGN1cl90ZC0+bGFzdF90cmI7CiAJeGhjaV9kYmdfdHJhY2UoeGhjaSwgdHJhY2VfeGhjaV9kYmdfY2FuY2VsX3VyYiwKQEAgLTg5Miw2ICs5MDAsNTcgQEAKIAkvKiBSZXR1cm4gdG8gdGhlIGV2ZW50IGhhbmRsZXIgd2l0aCB4aGNpLT5sb2NrIHJlLWFjcXVpcmVkICovCiB9CiAKK3N0YXRpYyB2b2lkIHhoY2lfa2lsbF9yaW5nX3VyYnMoc3RydWN0IHhoY2lfaGNkICp4aGNpLCBzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nKQoreworCXN0cnVjdCB4aGNpX3RkICpjdXJfdGQ7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnJpbmctPnRkX2xpc3QpKSB7CisJCWN1cl90ZCA9IGxpc3RfZmlyc3RfZW50cnkoJnJpbmctPnRkX2xpc3QsCisJCQkJc3RydWN0IHhoY2lfdGQsIHRkX2xpc3QpOworCQlsaXN0X2RlbF9pbml0KCZjdXJfdGQtPnRkX2xpc3QpOworCQlpZiAoIWxpc3RfZW1wdHkoJmN1cl90ZC0+Y2FuY2VsbGVkX3RkX2xpc3QpKQorCQkJbGlzdF9kZWxfaW5pdCgmY3VyX3RkLT5jYW5jZWxsZWRfdGRfbGlzdCk7CisJCXhoY2lfZ2l2ZWJhY2tfdXJiX2luX2lycSh4aGNpLCBjdXJfdGQsIC1FU0hVVERPV04pOworCX0KK30KKworc3RhdGljIHZvaWQgeGhjaV9raWxsX2VuZHBvaW50X3VyYnMoc3RydWN0IHhoY2lfaGNkICp4aGNpLAorCQlpbnQgc2xvdF9pZCwgaW50IGVwX2luZGV4KQoreworCXN0cnVjdCB4aGNpX3RkICpjdXJfdGQ7CisJc3RydWN0IHhoY2lfdmlydF9lcCAqZXA7CisJc3RydWN0IHhoY2lfcmluZyAqcmluZzsKKworCWVwID0gJnhoY2ktPmRldnNbc2xvdF9pZF0tPmVwc1tlcF9pbmRleF07CisJaWYgKChlcC0+ZXBfc3RhdGUgJiBFUF9IQVNfU1RSRUFNUykgfHwKKwkJCShlcC0+ZXBfc3RhdGUgJiBFUF9HRVRUSU5HX05PX1NUUkVBTVMpKSB7CisJCWludCBzdHJlYW1faWQ7CisKKwkJZm9yIChzdHJlYW1faWQgPSAwOyBzdHJlYW1faWQgPCBlcC0+c3RyZWFtX2luZm8tPm51bV9zdHJlYW1zOworCQkJCXN0cmVhbV9pZCsrKSB7CisJCQl4aGNpX2RiZ190cmFjZSh4aGNpLCB0cmFjZV94aGNpX2RiZ19jYW5jZWxfdXJiLAorCQkJCQkiS2lsbGluZyBVUkJzIGZvciBzbG90IElEICV1LCBlcCBpbmRleCAldSwgc3RyZWFtICV1IiwKKwkJCQkJc2xvdF9pZCwgZXBfaW5kZXgsIHN0cmVhbV9pZCArIDEpOworCQkJeGhjaV9raWxsX3JpbmdfdXJicyh4aGNpLAorCQkJCQllcC0+c3RyZWFtX2luZm8tPnN0cmVhbV9yaW5nc1tzdHJlYW1faWRdKTsKKwkJfQorCX0gZWxzZSB7CisJCXJpbmcgPSBlcC0+cmluZzsKKwkJaWYgKCFyaW5nKQorCQkJcmV0dXJuOworCQl4aGNpX2RiZ190cmFjZSh4aGNpLCB0cmFjZV94aGNpX2RiZ19jYW5jZWxfdXJiLAorCQkJCSJLaWxsaW5nIFVSQnMgZm9yIHNsb3QgSUQgJXUsIGVwIGluZGV4ICV1IiwKKwkJCQlzbG90X2lkLCBlcF9pbmRleCk7CisJCXhoY2lfa2lsbF9yaW5nX3VyYnMoeGhjaSwgcmluZyk7CisJfQorCXdoaWxlICghbGlzdF9lbXB0eSgmZXAtPmNhbmNlbGxlZF90ZF9saXN0KSkgeworCQljdXJfdGQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZlcC0+Y2FuY2VsbGVkX3RkX2xpc3QsCisJCQkJc3RydWN0IHhoY2lfdGQsIGNhbmNlbGxlZF90ZF9saXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmY3VyX3RkLT5jYW5jZWxsZWRfdGRfbGlzdCk7CisJCXhoY2lfZ2l2ZWJhY2tfdXJiX2luX2lycSh4aGNpLCBjdXJfdGQsIC1FU0hVVERPV04pOworCX0KK30KKwogLyogV2F0Y2hkb2cgdGltZXIgZnVuY3Rpb24gZm9yIHdoZW4gYSBzdG9wIGVuZHBvaW50IGNvbW1hbmQgZmFpbHMgdG8gY29tcGxldGUuCiAgKiBJbiB0aGlzIGNhc2UsIHdlIGFzc3VtZSB0aGUgaG9zdCBjb250cm9sbGVyIGlzIGJyb2tlbiBvciBkeWluZyBvciBkZWFkLiAgVGhlCiAgKiBob3N0IG1heSBzdGlsbCBiZSBjb21wbGV0aW5nIHNvbWUgb3RoZXIgZXZlbnRzLCBzbyB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwgdG8KQEAgLTkxNSw5ICs5NzQsNiBAQAogewogCXN0cnVjdCB4aGNpX2hjZCAqeGhjaTsKIAlzdHJ1Y3QgeGhjaV92aXJ0X2VwICplcDsKLQlzdHJ1Y3QgeGhjaV92aXJ0X2VwICp0ZW1wX2VwOwotCXN0cnVjdCB4aGNpX3JpbmcgKnJpbmc7Ci0Jc3RydWN0IHhoY2lfdGQgKmN1cl90ZDsKIAlpbnQgcmV0LCBpLCBqOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTk3NCwzNCArMTAzMCw4IEBACiAJZm9yIChpID0gMDsgaSA8IE1BWF9IQ19TTE9UUzsgaSsrKSB7CiAJCWlmICgheGhjaS0+ZGV2c1tpXSkKIAkJCWNvbnRpbnVlOwotCQlmb3IgKGogPSAwOyBqIDwgMzE7IGorKykgewotCQkJdGVtcF9lcCA9ICZ4aGNpLT5kZXZzW2ldLT5lcHNbal07Ci0JCQlyaW5nID0gdGVtcF9lcC0+cmluZzsKLQkJCWlmICghcmluZykKLQkJCQljb250aW51ZTsKLQkJCXhoY2lfZGJnX3RyYWNlKHhoY2ksIHRyYWNlX3hoY2lfZGJnX2NhbmNlbF91cmIsCi0JCQkJCSJLaWxsaW5nIFVSQnMgZm9yIHNsb3QgSUQgJXUsICIKLQkJCQkJImVwIGluZGV4ICV1IiwgaSwgaik7Ci0JCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnJpbmctPnRkX2xpc3QpKSB7Ci0JCQkJY3VyX3RkID0gbGlzdF9maXJzdF9lbnRyeSgmcmluZy0+dGRfbGlzdCwKLQkJCQkJCXN0cnVjdCB4aGNpX3RkLAotCQkJCQkJdGRfbGlzdCk7Ci0JCQkJbGlzdF9kZWxfaW5pdCgmY3VyX3RkLT50ZF9saXN0KTsKLQkJCQlpZiAoIWxpc3RfZW1wdHkoJmN1cl90ZC0+Y2FuY2VsbGVkX3RkX2xpc3QpKQotCQkJCQlsaXN0X2RlbF9pbml0KCZjdXJfdGQtPmNhbmNlbGxlZF90ZF9saXN0KTsKLQkJCQl4aGNpX2dpdmViYWNrX3VyYl9pbl9pcnEoeGhjaSwgY3VyX3RkLAotCQkJCQkJLUVTSFVURE9XTik7Ci0JCQl9Ci0JCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnRlbXBfZXAtPmNhbmNlbGxlZF90ZF9saXN0KSkgewotCQkJCWN1cl90ZCA9IGxpc3RfZmlyc3RfZW50cnkoCi0JCQkJCQkmdGVtcF9lcC0+Y2FuY2VsbGVkX3RkX2xpc3QsCi0JCQkJCQlzdHJ1Y3QgeGhjaV90ZCwKLQkJCQkJCWNhbmNlbGxlZF90ZF9saXN0KTsKLQkJCQlsaXN0X2RlbF9pbml0KCZjdXJfdGQtPmNhbmNlbGxlZF90ZF9saXN0KTsKLQkJCQl4aGNpX2dpdmViYWNrX3VyYl9pbl9pcnEoeGhjaSwgY3VyX3RkLAotCQkJCQkJLUVTSFVURE9XTik7Ci0JCQl9Ci0JCX0KKwkJZm9yIChqID0gMDsgaiA8IDMxOyBqKyspCisJCQl4aGNpX2tpbGxfZW5kcG9pbnRfdXJicyh4aGNpLCBpLCBqKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGhjaS0+bG9jaywgZmxhZ3MpOwogCXhoY2lfZGJnX3RyYWNlKHhoY2ksIHRyYWNlX3hoY2lfZGJnX2NhbmNlbF91cmIsCkBAIC0xMDczLDE3ICsxMTAzLDE4IEBACiAJdW5zaWduZWQgaW50IHN0cmVhbV9pZDsKIAlzdHJ1Y3QgeGhjaV9yaW5nICplcF9yaW5nOwogCXN0cnVjdCB4aGNpX3ZpcnRfZGV2aWNlICpkZXY7CisJc3RydWN0IHhoY2lfdmlydF9lcCAqZXA7CiAJc3RydWN0IHhoY2lfZXBfY3R4ICplcF9jdHg7CiAJc3RydWN0IHhoY2lfc2xvdF9jdHggKnNsb3RfY3R4OwogCiAJZXBfaW5kZXggPSBUUkJfVE9fRVBfSU5ERVgobGUzMl90b19jcHUodHJiLT5nZW5lcmljLmZpZWxkWzNdKSk7CiAJc3RyZWFtX2lkID0gVFJCX1RPX1NUUkVBTV9JRChsZTMyX3RvX2NwdSh0cmItPmdlbmVyaWMuZmllbGRbMl0pKTsKIAlkZXYgPSB4aGNpLT5kZXZzW3Nsb3RfaWRdOworCWVwID0gJmRldi0+ZXBzW2VwX2luZGV4XTsKIAogCWVwX3JpbmcgPSB4aGNpX3N0cmVhbV9pZF90b19yaW5nKGRldiwgZXBfaW5kZXgsIHN0cmVhbV9pZCk7CiAJaWYgKCFlcF9yaW5nKSB7Ci0JCXhoY2lfd2Fybih4aGNpLCAiV0FSTiBTZXQgVFIgZGVxIHB0ciBjb21tYW5kIGZvciAiCi0JCQkJImZyZWVkIHN0cmVhbSBJRCAldVxuIiwKKwkJeGhjaV93YXJuKHhoY2ksICJXQVJOIFNldCBUUiBkZXEgcHRyIGNvbW1hbmQgZm9yIGZyZWVkIHN0cmVhbSBJRCAldVxuIiwKIAkJCQlzdHJlYW1faWQpOwogCQkvKiBYWFg6IEhhcm1sZXNzPz8/ICovCiAJCWRldi0+ZXBzW2VwX2luZGV4XS5lcF9zdGF0ZSAmPSB+U0VUX0RFUV9QRU5ESU5HOwpAQCAtMTA5OSwxMiArMTEzMCwxMCBAQAogCiAJCXN3aXRjaCAoY21kX2NvbXBfY29kZSkgewogCQljYXNlIENPTVBfVFJCX0VSUjoKLQkJCXhoY2lfd2Fybih4aGNpLCAiV0FSTiBTZXQgVFIgRGVxIFB0ciBjbWQgaW52YWxpZCBiZWNhdXNlICIKLQkJCQkJIm9mIHN0cmVhbSBJRCBjb25maWd1cmF0aW9uXG4iKTsKKwkJCXhoY2lfd2Fybih4aGNpLCAiV0FSTiBTZXQgVFIgRGVxIFB0ciBjbWQgaW52YWxpZCBiZWNhdXNlIG9mIHN0cmVhbSBJRCBjb25maWd1cmF0aW9uXG4iKTsKIAkJCWJyZWFrOwogCQljYXNlIENPTVBfQ1RYX1NUQVRFOgotCQkJeGhjaV93YXJuKHhoY2ksICJXQVJOIFNldCBUUiBEZXEgUHRyIGNtZCBmYWlsZWQgZHVlICIKLQkJCQkJInRvIGluY29ycmVjdCBzbG90IG9yIGVwIHN0YXRlLlxuIik7CisJCQl4aGNpX3dhcm4oeGhjaSwgIldBUk4gU2V0IFRSIERlcSBQdHIgY21kIGZhaWxlZCBkdWUgdG8gaW5jb3JyZWN0IHNsb3Qgb3IgZXAgc3RhdGUuXG4iKTsKIAkJCWVwX3N0YXRlID0gbGUzMl90b19jcHUoZXBfY3R4LT5lcF9pbmZvKTsKIAkJCWVwX3N0YXRlICY9IEVQX1NUQVRFX01BU0s7CiAJCQlzbG90X3N0YXRlID0gbGUzMl90b19jcHUoc2xvdF9jdHgtPmRldl9zdGF0ZSk7CkBAIC0xMTE0LDEzICsxMTQzLDEyIEBACiAJCQkJCXNsb3Rfc3RhdGUsIGVwX3N0YXRlKTsKIAkJCWJyZWFrOwogCQljYXNlIENPTVBfRUJBRFNMVDoKLQkJCXhoY2lfd2Fybih4aGNpLCAiV0FSTiBTZXQgVFIgRGVxIFB0ciBjbWQgZmFpbGVkIGJlY2F1c2UgIgotCQkJCQkic2xvdCAldSB3YXMgbm90IGVuYWJsZWQuXG4iLCBzbG90X2lkKTsKKwkJCXhoY2lfd2Fybih4aGNpLCAiV0FSTiBTZXQgVFIgRGVxIFB0ciBjbWQgZmFpbGVkIGJlY2F1c2Ugc2xvdCAldSB3YXMgbm90IGVuYWJsZWQuXG4iLAorCQkJCQlzbG90X2lkKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJeGhjaV93YXJuKHhoY2ksICJXQVJOIFNldCBUUiBEZXEgUHRyIGNtZCB3aXRoIHVua25vd24gIgotCQkJCQkiY29tcGxldGlvbiBjb2RlIG9mICV1LlxuIiwKLQkJCQkgIGNtZF9jb21wX2NvZGUpOworCQkJeGhjaV93YXJuKHhoY2ksICJXQVJOIFNldCBUUiBEZXEgUHRyIGNtZCB3aXRoIHVua25vd24gY29tcGxldGlvbiBjb2RlIG9mICV1LlxuIiwKKwkJCQkJY21kX2NvbXBfY29kZSk7CiAJCQlicmVhazsKIAkJfQogCQkvKiBPSyB3aGF0IGRvIHdlIGRvIG5vdz8gIFRoZSBlbmRwb2ludCBzdGF0ZSBpcyBob3NlZCwgYW5kIHdlCkBAIC0xMTMwLDIzICsxMTU4LDI4IEBACiAJCSAqIGNhbmNlbGxpbmcgVVJCcywgd2hpY2ggbWlnaHQgbm90IGJlIGFuIGVycm9yLi4uCiAJCSAqLwogCX0gZWxzZSB7CisJCXU2NCBkZXE7CisJCS8qIDQuNi4xMCBkZXEgcHRyIGlzIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbSBjdHggZm9yIHN0cmVhbXMgKi8KKwkJaWYgKGVwLT5lcF9zdGF0ZSAmIEVQX0hBU19TVFJFQU1TKSB7CisJCQlzdHJ1Y3QgeGhjaV9zdHJlYW1fY3R4ICpjdHggPQorCQkJCSZlcC0+c3RyZWFtX2luZm8tPnN0cmVhbV9jdHhfYXJyYXlbc3RyZWFtX2lkXTsKKwkJCWRlcSA9IGxlNjRfdG9fY3B1KGN0eC0+c3RyZWFtX3JpbmcpICYgU0NUWF9ERVFfTUFTSzsKKwkJfSBlbHNlIHsKKwkJCWRlcSA9IGxlNjRfdG9fY3B1KGVwX2N0eC0+ZGVxKSAmIH5FUF9DVFhfQ1lDTEVfTUFTSzsKKwkJfQogCQl4aGNpX2RiZ190cmFjZSh4aGNpLCB0cmFjZV94aGNpX2RiZ19jYW5jZWxfdXJiLAotCQkJIlN1Y2Nlc3NmdWwgU2V0IFRSIERlcSBQdHIgY21kLCBkZXEgPSBAJTA4bGx4IiwKLQkJCSBsZTY0X3RvX2NwdShlcF9jdHgtPmRlcSkpOwotCQlpZiAoeGhjaV90cmJfdmlydF90b19kbWEoZGV2LT5lcHNbZXBfaW5kZXhdLnF1ZXVlZF9kZXFfc2VnLAotCQkJCQkgZGV2LT5lcHNbZXBfaW5kZXhdLnF1ZXVlZF9kZXFfcHRyKSA9PQotCQkgICAgKGxlNjRfdG9fY3B1KGVwX2N0eC0+ZGVxKSAmIH4oRVBfQ1RYX0NZQ0xFX01BU0spKSkgeworCQkJIlN1Y2Nlc3NmdWwgU2V0IFRSIERlcSBQdHIgY21kLCBkZXEgPSBAJTA4bGx4IiwgZGVxKTsKKwkJaWYgKHhoY2lfdHJiX3ZpcnRfdG9fZG1hKGVwLT5xdWV1ZWRfZGVxX3NlZywKKwkJCQkJIGVwLT5xdWV1ZWRfZGVxX3B0cikgPT0gZGVxKSB7CiAJCQkvKiBVcGRhdGUgdGhlIHJpbmcncyBkZXF1ZXVlIHNlZ21lbnQgYW5kIGRlcXVldWUgcG9pbnRlcgogCQkJICogdG8gcmVmbGVjdCB0aGUgbmV3IHBvc2l0aW9uLgogCQkJICovCiAJCQl1cGRhdGVfcmluZ19mb3Jfc2V0X2RlcV9jb21wbGV0aW9uKHhoY2ksIGRldiwKIAkJCQllcF9yaW5nLCBlcF9pbmRleCk7CiAJCX0gZWxzZSB7Ci0JCQl4aGNpX3dhcm4oeGhjaSwgIk1pc21hdGNoIGJldHdlZW4gY29tcGxldGVkIFNldCBUUiBEZXEgIgotCQkJCQkiUHRyIGNvbW1hbmQgJiB4SENJIGludGVybmFsIHN0YXRlLlxuIik7CisJCQl4aGNpX3dhcm4oeGhjaSwgIk1pc21hdGNoIGJldHdlZW4gY29tcGxldGVkIFNldCBUUiBEZXEgUHRyIGNvbW1hbmQgJiB4SENJIGludGVybmFsIHN0YXRlLlxuIik7CiAJCQl4aGNpX3dhcm4oeGhjaSwgImVwIGRlcSBzZWcgPSAlcCwgZGVxIHB0ciA9ICVwXG4iLAotCQkJCQlkZXYtPmVwc1tlcF9pbmRleF0ucXVldWVkX2RlcV9zZWcsCi0JCQkJCWRldi0+ZXBzW2VwX2luZGV4XS5xdWV1ZWRfZGVxX3B0cik7CisJCQkJICBlcC0+cXVldWVkX2RlcV9zZWcsIGVwLT5xdWV1ZWRfZGVxX3B0cik7CiAJCX0KIAl9CiAKQEAgLTQwNzAsNiArNDEwMyw3IEBACiAJdTMyIHRyYl9zbG90X2lkID0gU0xPVF9JRF9GT1JfVFJCKHNsb3RfaWQpOwogCXUzMiB0cmJfZXBfaW5kZXggPSBFUF9JRF9GT1JfVFJCKGVwX2luZGV4KTsKIAl1MzIgdHJiX3N0cmVhbV9pZCA9IFNUUkVBTV9JRF9GT1JfVFJCKHN0cmVhbV9pZCk7CisJdTMyIHRyYl9zY3QgPSAwOwogCXUzMiB0eXBlID0gVFJCX1RZUEUoVFJCX1NFVF9ERVEpOwogCXN0cnVjdCB4aGNpX3ZpcnRfZXAgKmVwOwogCkBAIC00MDg4LDcgKzQxMjIsOSBAQAogCX0KIAllcC0+cXVldWVkX2RlcV9zZWcgPSBkZXFfc2VnOwogCWVwLT5xdWV1ZWRfZGVxX3B0ciA9IGRlcV9wdHI7Ci0JcmV0dXJuIHF1ZXVlX2NvbW1hbmQoeGhjaSwgbG93ZXJfMzJfYml0cyhhZGRyKSB8IGN5Y2xlX3N0YXRlLAorCWlmIChzdHJlYW1faWQpCisJCXRyYl9zY3QgPSBTQ1RfRk9SX1RSQihTQ1RfUFJJX1RSKTsKKwlyZXR1cm4gcXVldWVfY29tbWFuZCh4aGNpLCBsb3dlcl8zMl9iaXRzKGFkZHIpIHwgdHJiX3NjdCB8IGN5Y2xlX3N0YXRlLAogCQkJdXBwZXJfMzJfYml0cyhhZGRyKSwgdHJiX3N0cmVhbV9pZCwKIAkJCXRyYl9zbG90X2lkIHwgdHJiX2VwX2luZGV4IHwgdHlwZSwgZmFsc2UpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYwppbmRleCA5MjRhNmNjLi44ZmU0ZTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYwpAQCAtMzkwLDYgKzM5MCwxMCBAQAogCX0KIAogIGxlZ2FjeV9pcnE6CisJaWYgKCFzdHJsZW4oaGNkLT5pcnFfZGVzY3IpKQorCQlzbnByaW50ZihoY2QtPmlycV9kZXNjciwgc2l6ZW9mKGhjZC0+aXJxX2Rlc2NyKSwgIiVzOnVzYiVkIiwKKwkJCSBoY2QtPmRyaXZlci0+ZGVzY3JpcHRpb24sIGhjZC0+c2VsZi5idXNudW0pOworCiAJLyogZmFsbCBiYWNrIHRvIGxlZ2FjeSBpbnRlcnJ1cHQqLwogCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgJnVzYl9oY2RfaXJxLCBJUlFGX1NIQVJFRCwKIAkJCWhjZC0+aXJxX2Rlc2NyLCBoY2QpOwpAQCAtMjY3OCw2ICsyNjgyLDIwIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgeGhjaV9jaGVja19id19kcm9wX2VwX3N0cmVhbXMoc3RydWN0IHhoY2lfaGNkICp4aGNpLAorCXN0cnVjdCB4aGNpX3ZpcnRfZGV2aWNlICp2ZGV2LCBpbnQgaSkKK3sKKwlzdHJ1Y3QgeGhjaV92aXJ0X2VwICplcCA9ICZ2ZGV2LT5lcHNbaV07CisKKwlpZiAoZXAtPmVwX3N0YXRlICYgRVBfSEFTX1NUUkVBTVMpIHsKKwkJeGhjaV93YXJuKHhoY2ksICJXQVJOOiBlbmRwb2ludCAweCUwMnggaGFzIHN0cmVhbXMgb24gc2V0X2ludGVyZmFjZSwgZnJlZWluZyBzdHJlYW1zLlxuIiwKKwkJCQl4aGNpX2dldF9lbmRwb2ludF9hZGRyZXNzKGkpKTsKKwkJeGhjaV9mcmVlX3N0cmVhbV9pbmZvKHhoY2ksIGVwLT5zdHJlYW1faW5mbyk7CisJCWVwLT5zdHJlYW1faW5mbyA9IE5VTEw7CisJCWVwLT5lcF9zdGF0ZSAmPSB+RVBfSEFTX1NUUkVBTVM7CisJfQorfQorCiAvKiBDYWxsZWQgYWZ0ZXIgb25lIG9yIG1vcmUgY2FsbHMgdG8geGhjaV9hZGRfZW5kcG9pbnQoKSBvcgogICogeGhjaV9kcm9wX2VuZHBvaW50KCkuICBJZiB0aGlzIGNhbGwgZmFpbHMsIHRoZSBVU0IgY29yZSBpcyBleHBlY3RlZAogICogdG8gY2FsbCB4aGNpX3Jlc2V0X2JhbmR3aWR0aCgpLgpAQCAtMjc0Miw4ICsyNzYwLDEwIEBACiAJLyogRnJlZSBhbnkgcmluZ3MgdGhhdCB3ZXJlIGRyb3BwZWQsIGJ1dCBub3QgY2hhbmdlZC4gKi8KIAlmb3IgKGkgPSAxOyBpIDwgMzE7ICsraSkgewogCQlpZiAoKGxlMzJfdG9fY3B1KGN0cmxfY3R4LT5kcm9wX2ZsYWdzKSAmICgxIDw8IChpICsgMSkpKSAmJgotCQkgICAgIShsZTMyX3RvX2NwdShjdHJsX2N0eC0+YWRkX2ZsYWdzKSAmICgxIDw8IChpICsgMSkpKSkKKwkJICAgICEobGUzMl90b19jcHUoY3RybF9jdHgtPmFkZF9mbGFncykgJiAoMSA8PCAoaSArIDEpKSkpIHsKIAkJCXhoY2lfZnJlZV9vcl9jYWNoZV9lbmRwb2ludF9yaW5nKHhoY2ksIHZpcnRfZGV2LCBpKTsKKwkJCXhoY2lfY2hlY2tfYndfZHJvcF9lcF9zdHJlYW1zKHhoY2ksIHZpcnRfZGV2LCBpKTsKKwkJfQogCX0KIAl4aGNpX3plcm9faW5fY3R4KHhoY2ksIHZpcnRfZGV2KTsKIAkvKgpAQCAtMjc1OSw2ICsyNzc5LDcgQEAKIAkJaWYgKHZpcnRfZGV2LT5lcHNbaV0ucmluZykgewogCQkJeGhjaV9mcmVlX29yX2NhY2hlX2VuZHBvaW50X3JpbmcoeGhjaSwgdmlydF9kZXYsIGkpOwogCQl9CisJCXhoY2lfY2hlY2tfYndfZHJvcF9lcF9zdHJlYW1zKHhoY2ksIHZpcnRfZGV2LCBpKTsKIAkJdmlydF9kZXYtPmVwc1tpXS5yaW5nID0gdmlydF9kZXYtPmVwc1tpXS5uZXdfcmluZzsKIAkJdmlydF9kZXYtPmVwc1tpXS5uZXdfcmluZyA9IE5VTEw7CiAJfQpAQCAtMjk1NCw3ICsyOTc1LDcgQEAKIAlyZXQgPSB4aGNpX2NoZWNrX2FyZ3MoeGhjaV90b19oY2QoeGhjaSksIHVkZXYsIGVwLCAxLCB0cnVlLCBfX2Z1bmNfXyk7CiAJaWYgKHJldCA8PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoZXAtPnNzX2VwX2NvbXAuYm1BdHRyaWJ1dGVzID09IDApIHsKKwlpZiAodXNiX3NzX21heF9zdHJlYW1zKCZlcC0+c3NfZXBfY29tcCkgPT0gMCkgewogCQl4aGNpX3dhcm4oeGhjaSwgIldBUk46IFN1cGVyU3BlZWQgRW5kcG9pbnQgQ29tcGFuaW9uIgogCQkJCSIgZGVzY3JpcHRvciBmb3IgZXAgMHgleCBkb2VzIG5vdCBzdXBwb3J0IHN0cmVhbXNcbiIsCiAJCQkJZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7CkBAIC0zMTIxLDYgKzMxNDIsMTIgQEAKIAl4aGNpX2RiZyh4aGNpLCAiRHJpdmVyIHdhbnRzICV1IHN0cmVhbSBJRHMgKGluY2x1ZGluZyBzdHJlYW0gMCkuXG4iLAogCQkJbnVtX3N0cmVhbXMpOwogCisJLyogTWF4UFNBU2l6ZSB2YWx1ZSAwICgyIHN0cmVhbXMpIG1lYW5zIHN0cmVhbXMgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KKwlpZiAoSENDX01BWF9QU0EoeGhjaS0+aGNjX3BhcmFtcykgPCA0KSB7CisJCXhoY2lfZGJnKHhoY2ksICJ4SENJIGNvbnRyb2xsZXIgZG9lcyBub3Qgc3VwcG9ydCBzdHJlYW1zLlxuIik7CisJCXJldHVybiAtRU5PU1lTOworCX0KKwogCWNvbmZpZ19jbWQgPSB4aGNpX2FsbG9jX2NvbW1hbmQoeGhjaSwgdHJ1ZSwgdHJ1ZSwgbWVtX2ZsYWdzKTsKIAlpZiAoIWNvbmZpZ19jbWQpIHsKIAkJeGhjaV9kYmcoeGhjaSwgIkNvdWxkIG5vdCBhbGxvY2F0ZSB4SENJIGNvbW1hbmQgc3RydWN0dXJlLlxuIik7CkBAIC0zNTE5LDYgKzM1NDYsOCBAQAogCQlzdHJ1Y3QgeGhjaV92aXJ0X2VwICplcCA9ICZ2aXJ0X2Rldi0+ZXBzW2ldOwogCiAJCWlmIChlcC0+ZXBfc3RhdGUgJiBFUF9IQVNfU1RSRUFNUykgeworCQkJeGhjaV93YXJuKHhoY2ksICJXQVJOOiBlbmRwb2ludCAweCUwMnggaGFzIHN0cmVhbXMgb24gZGV2aWNlIHJlc2V0LCBmcmVlaW5nIHN0cmVhbXMuXG4iLAorCQkJCQl4aGNpX2dldF9lbmRwb2ludF9hZGRyZXNzKGkpKTsKIAkJCXhoY2lfZnJlZV9zdHJlYW1faW5mbyh4aGNpLCBlcC0+c3RyZWFtX2luZm8pOwogCQkJZXAtPnN0cmVhbV9pbmZvID0gTlVMTDsKIAkJCWVwLT5lcF9zdGF0ZSAmPSB+RVBfSEFTX1NUUkVBTVM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuaCBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oCmluZGV4IDU4ZWQ5ZDAuLmQyODBlOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oCkBAIC03MDMsNiArNzAzLDcgQEAKIAogLyogZGVxIGJpdG1hc2tzICovCiAjZGVmaW5lIEVQX0NUWF9DWUNMRV9NQVNLCQkoMSA8PCAwKQorI2RlZmluZSBTQ1RYX0RFUV9NQVNLCQkJKH4weGZMKQogCiAKIC8qKgpAQCAtMTExOCw5ICsxMTE5LDEwIEBACiAjZGVmaW5lIFRSQl9UT19TVVNQRU5EX1BPUlQocCkJCSgoKHApICYgKDEgPDwgMjMpKSA+PiAyMykKICNkZWZpbmUgTEFTVF9FUF9JTkRFWAkJCTMwCiAKLS8qIFNldCBUUiBEZXF1ZXVlIFBvaW50ZXIgY29tbWFuZCBUUkIgZmllbGRzICovCisvKiBTZXQgVFIgRGVxdWV1ZSBQb2ludGVyIGNvbW1hbmQgVFJCIGZpZWxkcywgNi40LjMuOSAqLwogI2RlZmluZSBUUkJfVE9fU1RSRUFNX0lEKHApCQkoKCgocCkgJiAoMHhmZmZmIDw8IDE2KSkgPj4gMTYpKQogI2RlZmluZSBTVFJFQU1fSURfRk9SX1RSQihwKQkJKCgoKHApKSAmIDB4ZmZmZikgPDwgMTYpCisjZGVmaW5lIFNDVF9GT1JfVFJCKHApCQkJKCgocCkgPDwgMSkgJiAweDcpCiAKIAogLyogUG9ydCBTdGF0dXMgQ2hhbmdlIEV2ZW50IFRSQiBmaWVsZHMgKi8KQEAgLTEzNDEsNiArMTM0Myw3IEBACiAJdW5zaWduZWQgaW50CQludW1fdHJic19mcmVlX3RlbXA7CiAJZW51bSB4aGNpX3JpbmdfdHlwZQl0eXBlOwogCWJvb2wJCQlsYXN0X3RkX3dhc19zaG9ydDsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9yb290CSp0cmJfYWRkcmVzc19tYXA7CiB9OwogCiBzdHJ1Y3QgeGhjaV9lcnN0X2VudHJ5IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZwppbmRleCBiYTVmNzBmLi4xYmNhMjc0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZwpAQCAtMTI4LDcgKzEyOCw2IEBACiAKIGNvbmZpZyBVU0JfRlRESV9FTEFOCiAJdHJpc3RhdGUgIkVsYW4gUENNQ0lBIENhcmRCdXMgQWRhcHRlciBVU0IgQ2xpZW50IgotCWRlZmF1bHQgTQogCWhlbHAKIAkgIEVMQU4ncyBVeHh4IHNlcmllcyBvZiBhZGFwdGVycyBhcmUgVVNCIHRvIFBDTUNJQSBDYXJkQnVzIGFkYXB0ZXJzLgogCSAgQ3VycmVudGx5IG9ubHkgdGhlIFUxMzIgYWRhcHRlciBpcyBhdmFpbGFibGUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3Npc3VzYnZnYS9zaXN1c2IuYyBiL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jCmluZGV4IGRlOTg5MDYuLjA2YjVkNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jCkBAIC0yMTIzLDggKzIxMjMsOCBAQAogCXU4IHRtcDgsIHRtcDgyLCByYW10eXBlOwogCWludCBidyA9IDA7CiAJY2hhciAqcmFtdHlwZXRleHQxID0gTlVMTDsKLQljb25zdCBjaGFyICpyYW10eXBldGV4dDJbXSA9IHsJIlNEUiBTRFJBTSIsICJTRFIgU0dSQU0iLAotCQkJCQkiRERSIFNEUkFNIiwgIkREUiBTR1JBTSIgfTsKKwlzdGF0aWMgY29uc3QgY2hhciByYW1fZGF0YXJhdGVbNF0gPSB7J1MnLCAnUycsICdEJywgJ0QnfTsKKwlzdGF0aWMgY29uc3QgY2hhciByYW1fZHluYW1pY3R5cGVbNF0gPSB7J0QnLCAnRycsICdEJywgJ0cnfTsKIAlzdGF0aWMgY29uc3QgaW50IGJ1c1NEUls0XSAgPSB7NjQsIDY0LCAxMjgsIDEyOH07CiAJc3RhdGljIGNvbnN0IGludCBidXNERFJbNF0gID0gezMyLCAzMiwgIDY0LCAgNjR9OwogCXN0YXRpYyBjb25zdCBpbnQgYnVzRERSQVs0XSA9IHs2NCszMiwgNjQrMzIgLCAoNjQrMzIpKjIsICg2NCszMikqMn07CkBAIC0yMTU2LDggKzIxNTYsMTAgQEAKIAkJYnJlYWs7CiAJfQogCi0JZGV2X2luZm8oJnNpc3VzYi0+c2lzdXNiX2Rldi0+ZGV2LCAiJWRNQiAlcyAlcywgYnVzIHdpZHRoICVkXG4iLCAoc2lzdXNiLT52cmFtc2l6ZSA+PiAyMCksIHJhbXR5cGV0ZXh0MSwKLQkJCXJhbXR5cGV0ZXh0MltyYW10eXBlXSwgYncpOworCisJZGV2X2luZm8oJnNpc3VzYi0+c2lzdXNiX2Rldi0+ZGV2LCAiJWRNQiAlcyAlY0RSIFMlY1JBTSwgYnVzIHdpZHRoICVkXG4iLAorCQkgc2lzdXNiLT52cmFtc2l6ZSA+PiAyMCwgcmFtdHlwZXRleHQxLAorCQkgcmFtX2RhdGFyYXRlW3JhbXR5cGVdLCByYW1fZHluYW1pY3R5cGVbcmFtdHlwZV0sIGJ3KTsKIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy91c2JsZWQuYyBiL2RyaXZlcnMvdXNiL21pc2MvdXNibGVkLmMKaW5kZXggNzhlYjRmZi4uYmRlZjBkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy91c2JsZWQuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3VzYmxlZC5jCkBAIC0yMiw4ICsyMiwyNyBAQAogZW51bSBsZWRfdHlwZSB7CiAJREVMQ09NX1ZJU1VBTF9TSUdOQUxfSU5ESUNBVE9SLAogCURSRUFNX0NIRUVLWV9XRUJNQUlMX05PVElGSUVSLAorCVJJU09fS0FHQUtVX0xFRAogfTsKIAorLyogdGhlIFdlYm1haWwgTEVEIG1hZGUgYnkgUklTTyBLQUdBS1UgQ09SUC4gZGVjb2RlcyBhIGNvbG9yIGluZGV4CisgICBpbnRlcm5hbGx5LCB3ZSB3YW50IHRvIGtlZXAgdGhlIHJlZCtncmVlbitibHVlIHN5c2ZzIGFwaSwgc28gd2UgZGVjb2RlCisgICBmcm9tIDEtYml0IFJHQiB0byB0aGUgcmlzbyBrYWdha3UgY29sb3IgaW5kZXggYWNjb3JkaW5nIHRvIHRoaXMgdGFibGUuLi4gKi8KKworc3RhdGljIHVuc2lnbmVkIGNvbnN0IGNoYXIgcmlzb19rYWdha3VfdGJsW10gPSB7CisvKiBSKzJHKzRCIC0+IHJpc28ga2FnYWt1IGNvbG9yIGluZGV4ICovCisJWzBdID0gMCwgLyogYmxhY2sgICAqLworCVsxXSA9IDIsIC8qIHJlZCAgICAgKi8KKwlbMl0gPSAxLCAvKiBncmVlbiAgICovCisJWzNdID0gNSwgLyogeWVsbG93ICAqLworCVs0XSA9IDMsIC8qIGJsdWUgICAgKi8KKwlbNV0gPSA2LCAvKiBtYWdlbnRhICovCisJWzZdID0gNCwgLyogY3lhbiAgICAqLworCVs3XSA9IDcgIC8qIHdoaXRlICAgKi8KK307CisKKyNkZWZpbmUgUklTT19LQUdBS1VfSVgocixnLGIpIHJpc29fa2FnYWt1X3RibFsoKHIpPzE6MCkrKChnKT8yOjApKygoYik/NDowKV0KKwogLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlW10gPSB7CiAJeyBVU0JfREVWSUNFKDB4MGZjNSwgMHgxMjIzKSwKQEAgLTMyLDYgKzUxLDggQEAKIAkJCS5kcml2ZXJfaW5mbyA9IERSRUFNX0NIRUVLWV9XRUJNQUlMX05PVElGSUVSIH0sCiAJeyBVU0JfREVWSUNFKDB4MWQzNCwgMHgwMDBhKSwKIAkJCS5kcml2ZXJfaW5mbyA9IERSRUFNX0NIRUVLWV9XRUJNQUlMX05PVElGSUVSIH0sCisJeyBVU0JfREVWSUNFKDB4MTI5NCwgMHgxMzIwKSwKKwkJCS5kcml2ZXJfaW5mbyA9IFJJU09fS0FHQUtVX0xFRCB9LAogCXsgfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgaWRfdGFibGUpOwpAQCAtNDgsNiArNjksNyBAQAogewogCWludCByZXR2YWwgPSAwOwogCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKwlpbnQgYWN0bGVuZ3RoOwogCiAJYnVmZmVyID0ga21hbGxvYyg4LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZmZlcikgewpAQCAtMTA0LDYgKzEyNiwxOCBAQAogCQkJCQkyMDAwKTsKIAkJYnJlYWs7CiAKKwljYXNlIFJJU09fS0FHQUtVX0xFRDoKKwkJYnVmZmVyWzBdID0gUklTT19LQUdBS1VfSVgobGVkLT5yZWQsIGxlZC0+Z3JlZW4sIGxlZC0+Ymx1ZSk7CisJCWJ1ZmZlclsxXSA9IDA7CisJCWJ1ZmZlclsyXSA9IDA7CisJCWJ1ZmZlclszXSA9IDA7CisJCWJ1ZmZlcls0XSA9IDA7CisKKwkJcmV0dmFsID0gdXNiX2ludGVycnVwdF9tc2cobGVkLT51ZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKGxlZC0+dWRldiwgMiksCisJCQlidWZmZXIsIDUsICZhY3RsZW5ndGgsIDEwMDAgLyptcyB0aW1lb3V0Ki8pOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoJmxlZC0+dWRldi0+ZGV2LCAidW5rbm93biBkZXZpY2UgdHlwZSAlZFxuIiwgbGVkLT50eXBlKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcgYi9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKaW5kZXggNjg4ZGM4Yi4uOGI3ODk3OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKQEAgLTQzLDYgKzQzLDcgQEAKIGNvbmZpZyBVU0JfTVVTQl9HQURHRVQKIAlib29sICJHYWRnZXQgb25seSBtb2RlIgogCWRlcGVuZHMgb24gVVNCX0dBREdFVD15IHx8IFVTQl9HQURHRVQ9VVNCX01VU0JfSERSQworCWRlcGVuZHMgb24gSEFTX0RNQQogCWhlbHAKIAkgIFNlbGVjdCB0aGlzIHdoZW4geW91IHdhbnQgdG8gdXNlIE1VU0IgaW4gZ2FkZ2V0IG1vZGUgb25seSwKIAkgIHRoZXJlYnkgdGhlIGhvc3QgZmVhdHVyZSB3aWxsIGJlIHJlZ3Jlc3NlZC4KQEAgLTUwLDYgKzUxLDcgQEAKIGNvbmZpZyBVU0JfTVVTQl9EVUFMX1JPTEUKIAlib29sICJEdWFsIFJvbGUgbW9kZSIKIAlkZXBlbmRzIG9uICgoVVNCPXkgfHwgVVNCPVVTQl9NVVNCX0hEUkMpICYmIChVU0JfR0FER0VUPXkgfHwgVVNCX0dBREdFVD1VU0JfTVVTQl9IRFJDKSkKKwlkZXBlbmRzIG9uIEhBU19ETUEKIAloZWxwCiAJICBUaGlzIGlzIHRoZSBkZWZhdWx0IG1vZGUgb2Ygd29ya2luZyBvZiBNVVNCIGNvbnRyb2xsZXIgd2hlcmUKIAkgIGJvdGggaG9zdCBhbmQgZ2FkZ2V0IGZlYXR1cmVzIGFyZSBlbmFibGVkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKaW5kZXggMjM5YWQwYi4uMDc1NzY5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCkBAIC00MzgsNyArNDM4LDYgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBtdXNiX3N0YWdlMF9pcnEoc3RydWN0IG11c2IgKm11c2IsIHU4IGludF91c2IsCiAJCQkJdTggZGV2Y3RsKQogewotCXN0cnVjdCB1c2Jfb3RnICpvdGcgPSBtdXNiLT54Y2Vpdi0+b3RnOwogCWlycXJldHVybl90IGhhbmRsZWQgPSBJUlFfTk9ORTsKIAogCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIjw9PSBEZXZDdGw9JTAyeCwgaW50X3VzYj0weCV4XG4iLCBkZXZjdGwsCkBAIC02NTYsNyArNjU1LDcgQEAKIAkJCQlicmVhazsKIAkJY2FzZSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMOgogCQkJbXVzYl9nX3N1c3BlbmQobXVzYik7Ci0JCQltdXNiLT5pc19hY3RpdmUgPSBvdGctPmdhZGdldC0+Yl9obnBfZW5hYmxlOworCQkJbXVzYi0+aXNfYWN0aXZlID0gbXVzYi0+Zy5iX2hucF9lbmFibGU7CiAJCQlpZiAobXVzYi0+aXNfYWN0aXZlKSB7CiAJCQkJbXVzYi0+eGNlaXYtPnN0YXRlID0gT1RHX1NUQVRFX0JfV0FJVF9BQ09OOwogCQkJCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIkhOUDogU2V0dGluZyB0aW1lciBmb3IgYl9hc2UwX2Jyc3RcbiIpOwpAQCAtNjcyLDcgKzY3MSw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBPVEdfU1RBVEVfQV9IT1NUOgogCQkJbXVzYi0+eGNlaXYtPnN0YXRlID0gT1RHX1NUQVRFX0FfU1VTUEVORDsKLQkJCW11c2ItPmlzX2FjdGl2ZSA9IG90Zy0+aG9zdC0+Yl9obnBfZW5hYmxlOworCQkJbXVzYi0+aXNfYWN0aXZlID0gbXVzYi0+aGNkLT5zZWxmLmJfaG5wX2VuYWJsZTsKIAkJCWJyZWFrOwogCQljYXNlIE9UR19TVEFURV9CX0hPU1Q6CiAJCQkvKiBUcmFuc2l0aW9uIHRvIEJfUEVSSVBIRVJBTCwgc2VlIDYuOC4yLjYgcCA0NCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NwcGk0MS5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NwcGk0MS5jCmluZGV4IGY4ODkyOTYuLjdiOGJiZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jcHBpNDEuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY3BwaTQxLmMKQEAgLTM5LDYgKzM5LDcgQEAKIAl1MzIgdHJhbnNmZXJyZWQ7CiAJdTMyIHBhY2tldF9zejsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHR4X2NoZWNrOworCXN0cnVjdCB3b3JrX3N0cnVjdCBkbWFfY29tcGxldGlvbjsKIH07CiAKICNkZWZpbmUgTVVTQl9ETUFfTlVNX0NIQU5ORUxTIDE1CkBAIC0xMTIsNiArMTEzLDE4IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBib29sIGlzX2lzb2Moc3RydWN0IG11c2JfaHdfZXAgKmh3X2VwLCBib29sIGluKQoreworCWlmIChpbiAmJiBod19lcC0+aW5fcWgpIHsKKwkJaWYgKGh3X2VwLT5pbl9xaC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DKQorCQkJcmV0dXJuIHRydWU7CisJfSBlbHNlIGlmIChod19lcC0+b3V0X3FoKSB7CisJCWlmIChod19lcC0+b3V0X3FoLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCiBzdGF0aWMgdm9pZCBjcHBpNDFfZG1hX2NhbGxiYWNrKHZvaWQgKnByaXZhdGVfZGF0YSk7CiAKIHN0YXRpYyB2b2lkIGNwcGk0MV90cmFuc19kb25lKHN0cnVjdCBjcHBpNDFfZG1hX2NoYW5uZWwgKmNwcGk0MV9jaGFubmVsKQpAQCAtMTE5LDcgKzEzMiw4IEBACiAJc3RydWN0IG11c2JfaHdfZXAgKmh3X2VwID0gY3BwaTQxX2NoYW5uZWwtPmh3X2VwOwogCXN0cnVjdCBtdXNiICptdXNiID0gaHdfZXAtPm11c2I7CiAKLQlpZiAoIWNwcGk0MV9jaGFubmVsLT5wcm9nX2xlbikgeworCWlmICghY3BwaTQxX2NoYW5uZWwtPnByb2dfbGVuIHx8CisJICAgIChjcHBpNDFfY2hhbm5lbC0+Y2hhbm5lbC5zdGF0dXMgPT0gTVVTQl9ETUFfU1RBVFVTX0ZSRUUpKSB7CiAKIAkJLyogZG9uZSwgY29tcGxldGUgKi8KIAkJY3BwaTQxX2NoYW5uZWwtPmNoYW5uZWwuYWN0dWFsX2xlbiA9CkBAIC0xNjUsNiArMTc5LDMyIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBjcHBpX3RyYW5zX2RvbmVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgY3BwaTQxX2RtYV9jaGFubmVsICpjcHBpNDFfY2hhbm5lbCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY3BwaTQxX2RtYV9jaGFubmVsLCBkbWFfY29tcGxldGlvbik7CisJc3RydWN0IGNwcGk0MV9kbWFfY29udHJvbGxlciAqY29udHJvbGxlciA9IGNwcGk0MV9jaGFubmVsLT5jb250cm9sbGVyOworCXN0cnVjdCBtdXNiICptdXNiID0gY29udHJvbGxlci0+bXVzYjsKKwlzdHJ1Y3QgbXVzYl9od19lcCAqaHdfZXAgPSBjcHBpNDFfY2hhbm5lbC0+aHdfZXA7CisJYm9vbCBlbXB0eTsKKworCWlmICghY3BwaTQxX2NoYW5uZWwtPmlzX3R4ICYmIGlzX2lzb2MoaHdfZXAsIDEpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZtdXNiLT5sb2NrLCBmbGFncyk7CisJCWNwcGk0MV90cmFuc19kb25lKGNwcGk0MV9jaGFubmVsKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXVzYi0+bG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCWVtcHR5ID0gbXVzYl9pc190eF9maWZvX2VtcHR5KGh3X2VwKTsKKwkJaWYgKGVtcHR5KSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXVzYi0+bG9jaywgZmxhZ3MpOworCQkJY3BwaTQxX3RyYW5zX2RvbmUoY3BwaTQxX2NoYW5uZWwpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXVzYi0+bG9jaywgZmxhZ3MpOworCQl9IGVsc2UgeworCQkJc2NoZWR1bGVfd29yaygmY3BwaTQxX2NoYW5uZWwtPmRtYV9jb21wbGV0aW9uKTsKKwkJfQorCX0KK30KKwogc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGNwcGk0MV9yZWNoZWNrX3R4X3JlcShzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCiB7CiAJc3RydWN0IGNwcGk0MV9kbWFfY29udHJvbGxlciAqY29udHJvbGxlcjsKQEAgLTIyOCw2ICsyNjgsMTQgQEAKIAkJCXRyYW5zZmVycmVkIDwgY3BwaTQxX2NoYW5uZWwtPnBhY2tldF9zeikKIAkJY3BwaTQxX2NoYW5uZWwtPnByb2dfbGVuID0gMDsKIAorCWlmICghY3BwaTQxX2NoYW5uZWwtPmlzX3R4KSB7CisJCWlmIChpc19pc29jKGh3X2VwLCAxKSkKKwkJCXNjaGVkdWxlX3dvcmsoJmNwcGk0MV9jaGFubmVsLT5kbWFfY29tcGxldGlvbik7CisJCWVsc2UKKwkJCWNwcGk0MV90cmFuc19kb25lKGNwcGk0MV9jaGFubmVsKTsKKwkJZ290byBvdXQ7CisJfQorCiAJZW1wdHkgPSBtdXNiX2lzX3R4X2ZpZm9fZW1wdHkoaHdfZXApOwogCWlmIChlbXB0eSkgewogCQljcHBpNDFfdHJhbnNfZG9uZShjcHBpNDFfY2hhbm5lbCk7CkBAIC0yNjQsNiArMzEyLDEwIEBACiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCX0KKwkJaWYgKGlzX2lzb2MoaHdfZXAsIDApKSB7CisJCQlzY2hlZHVsZV93b3JrKCZjcHBpNDFfY2hhbm5lbC0+ZG1hX2NvbXBsZXRpb24pOworCQkJZ290byBvdXQ7CisJCX0KIAkJbGlzdF9hZGRfdGFpbCgmY3BwaTQxX2NoYW5uZWwtPnR4X2NoZWNrLAogCQkJCSZjb250cm9sbGVyLT5lYXJseV90eF9saXN0KTsKIAkJaWYgKCFocnRpbWVyX2FjdGl2ZSgmY29udHJvbGxlci0+ZWFybHlfdHgpKSB7CkBAIC00NDgsMTIgKzUwMCwyNSBAQAogCQkJCWRtYV9hZGRyX3QgZG1hX2FkZHIsIHUzMiBsZW4pCiB7CiAJaW50IHJldDsKKwlzdHJ1Y3QgY3BwaTQxX2RtYV9jaGFubmVsICpjcHBpNDFfY2hhbm5lbCA9IGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlpbnQgaGJfbXVsdCA9IDA7CiAKIAlCVUdfT04oY2hhbm5lbC0+c3RhdHVzID09IE1VU0JfRE1BX1NUQVRVU19VTktOT1dOIHx8CiAJCWNoYW5uZWwtPnN0YXR1cyA9PSBNVVNCX0RNQV9TVEFUVVNfQlVTWSk7CiAKKwlpZiAoaXNfaG9zdF9hY3RpdmUoY3BwaTQxX2NoYW5uZWwtPmNvbnRyb2xsZXItPm11c2IpKSB7CisJCWlmIChjcHBpNDFfY2hhbm5lbC0+aXNfdHgpCisJCQloYl9tdWx0ID0gY3BwaTQxX2NoYW5uZWwtPmh3X2VwLT5vdXRfcWgtPmhiX211bHQ7CisJCWVsc2UKKwkJCWhiX211bHQgPSBjcHBpNDFfY2hhbm5lbC0+aHdfZXAtPmluX3FoLT5oYl9tdWx0OworCX0KKwogCWNoYW5uZWwtPnN0YXR1cyA9IE1VU0JfRE1BX1NUQVRVU19CVVNZOwogCWNoYW5uZWwtPmFjdHVhbF9sZW4gPSAwOworCisJaWYgKGhiX211bHQpCisJCXBhY2tldF9zeiA9IGhiX211bHQgKiAocGFja2V0X3N6ICYgMHg3RkYpOworCiAJcmV0ID0gY3BwaTQxX2NvbmZpZ3VyZV9jaGFubmVsKGNoYW5uZWwsIHBhY2tldF9zeiwgbW9kZSwgZG1hX2FkZHIsIGxlbik7CiAJaWYgKCFyZXQpCiAJCWNoYW5uZWwtPnN0YXR1cyA9IE1VU0JfRE1BX1NUQVRVU19GUkVFOwpAQCAtNjA3LDYgKzY3Miw4IEBACiAJCWNwcGk0MV9jaGFubmVsLT5wb3J0X251bSA9IHBvcnQ7CiAJCWNwcGk0MV9jaGFubmVsLT5pc190eCA9IGlzX3R4OwogCQlJTklUX0xJU1RfSEVBRCgmY3BwaTQxX2NoYW5uZWwtPnR4X2NoZWNrKTsKKwkJSU5JVF9XT1JLKCZjcHBpNDFfY2hhbm5lbC0+ZG1hX2NvbXBsZXRpb24sCisJCQkgIGNwcGlfdHJhbnNfZG9uZV93b3JrKTsKIAogCQltdXNiX2RtYSA9ICZjcHBpNDFfY2hhbm5lbC0+Y2hhbm5lbDsKIAkJbXVzYl9kbWEtPnByaXZhdGVfZGF0YSA9IGNwcGk0MV9jaGFubmVsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2RzcHMuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kc3BzLmMKaW5kZXggN2ExMDllYS4uMzM3MmRlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2RzcHMuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZHNwcy5jCkBAIC00NSw2ICs0NSw4IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL29mLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisKICNpbmNsdWRlICJtdXNiX2NvcmUuaCIKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXVzYl9kc3BzX29mX21hdGNoW107CkBAIC0xMzYsNiArMTM4LDI2IEBACiAJdW5zaWduZWQgbG9uZyBsYXN0X3RpbWVyOyAgICAvKiBsYXN0IHRpbWVyIGRhdGEgZm9yIGVhY2ggaW5zdGFuY2UgKi8KIAogCXN0cnVjdCBkc3BzX2NvbnRleHQgY29udGV4dDsKKwlzdHJ1Y3QgZGVidWdmc19yZWdzZXQzMiByZWdzZXQ7CisJc3RydWN0IGRlbnRyeSAqZGJnZnNfcm9vdDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGVidWdmc19yZWczMiBkc3BzX211c2JfcmVnc1tdID0geworCXsgInJldmlzaW9uIiwJCTB4MDAgfSwKKwl7ICJjb250cm9sIiwJCTB4MTQgfSwKKwl7ICJzdGF0dXMiLAkJMHgxOCB9LAorCXsgImVvaSIsCQkweDI0IH0sCisJeyAiaW50cjBfc3RhdCIsCQkweDMwIH0sCisJeyAiaW50cjFfc3RhdCIsCQkweDM0IH0sCisJeyAiaW50cjBfc2V0IiwJCTB4MzggfSwKKwl7ICJpbnRyMV9zZXQiLAkJMHgzYyB9LAorCXsgInR4bW9kZSIsCQkweDcwIH0sCisJeyAicnhtb2RlIiwJCTB4NzQgfSwKKwl7ICJhdXRvcmVxIiwJCTB4ZDAgfSwKKwl7ICJzcnBmaXh0aW1lIiwJCTB4ZDQgfSwKKwl7ICJ0ZG93biIsCQkweGQ4IH0sCisJeyAicGh5X3V0bWkiLAkJMHhlMCB9LAorCXsgIm1vZGUiLAkJMHhlOCB9LAogfTsKIAogc3RhdGljIHZvaWQgZHNwc19tdXNiX3RyeV9pZGxlKHN0cnVjdCBtdXNiICptdXNiLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCkBAIC0zNjgsNiArMzkwLDMwIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBkc3BzX211c2JfZGJnX2luaXQoc3RydWN0IG11c2IgKm11c2IsIHN0cnVjdCBkc3BzX2dsdWUgKmdsdWUpCit7CisJc3RydWN0IGRlbnRyeSAqcm9vdDsKKwlzdHJ1Y3QgZGVudHJ5ICpmaWxlOworCWNoYXIgYnVmWzEyOF07CisKKwlzcHJpbnRmKGJ1ZiwgIiVzLmRzcHMiLCBkZXZfbmFtZShtdXNiLT5jb250cm9sbGVyKSk7CisJcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcihidWYsIE5VTEwpOworCWlmICghcm9vdCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZ2x1ZS0+ZGJnZnNfcm9vdCA9IHJvb3Q7CisKKwlnbHVlLT5yZWdzZXQucmVncyA9IGRzcHNfbXVzYl9yZWdzOworCWdsdWUtPnJlZ3NldC5ucmVncyA9IEFSUkFZX1NJWkUoZHNwc19tdXNiX3JlZ3MpOworCWdsdWUtPnJlZ3NldC5iYXNlID0gbXVzYi0+Y3RybF9iYXNlOworCisJZmlsZSA9IGRlYnVnZnNfY3JlYXRlX3JlZ3NldDMyKCJyZWdkdW1wIiwgU19JUlVHTywgcm9vdCwgJmdsdWUtPnJlZ3NldCk7CisJaWYgKCFmaWxlKSB7CisJCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShyb290KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGRzcHNfbXVzYl9pbml0KHN0cnVjdCBtdXNiICptdXNiKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IG11c2ItPmNvbnRyb2xsZXI7CkBAIC0zNzcsNiArNDIzLDcgQEAKIAl2b2lkIF9faW9tZW0gKnJlZ19iYXNlOwogCXN0cnVjdCByZXNvdXJjZSAqcjsKIAl1MzIgcmV2LCB2YWw7CisJaW50IHJldDsKIAogCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBhcmVudCwgSU9SRVNPVVJDRV9NRU0sICJjb250cm9sIik7CiAJaWYgKCFyKQpAQCAtNDEwLDYgKzQ1NywxMCBAQAogCXZhbCAmPSB+KDEgPDwgd3JwLT5vdGdfZGlzYWJsZSk7CiAJZHNwc193cml0ZWwobXVzYi0+Y3RybF9iYXNlLCB3cnAtPnBoeV91dG1pLCB2YWwpOwogCisJcmV0ID0gZHNwc19tdXNiX2RiZ19pbml0KG11c2IsIGdsdWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjE2LDcgKzY2Nyw3IEBACiAJd3JwID0gbWF0Y2gtPmRhdGE7CiAKIAkvKiBhbGxvY2F0ZSBnbHVlICovCi0JZ2x1ZSA9IGt6YWxsb2Moc2l6ZW9mKCpnbHVlKSwgR0ZQX0tFUk5FTCk7CisJZ2x1ZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmdsdWUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdsdWUpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIGdsdWUgbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC02NDQsNyArNjk1LDYgQEAKIAlwbV9ydW50aW1lX3B1dCgmcGRldi0+ZGV2KTsKIGVycjI6CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwotCWtmcmVlKGdsdWUpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY1Nyw3ICs3MDcsOSBAQAogCS8qIGRpc2FibGUgdXNic3MgY2xvY2tzICovCiAJcG1fcnVudGltZV9wdXQoJnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwotCWtmcmVlKGdsdWUpOworCisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGdsdWUtPmRiZ2ZzX3Jvb3QpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5jCmluZGV4IGFiYjM4YzMuLmViMDYyOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuYwpAQCAtMTY5NCw3ICsxNjk0LDggQEAKIAkJCXwgTVVTQl9SWENTUl9SWFBLVFJEWSk7CiAJCW11c2Jfd3JpdGV3KGh3X2VwLT5yZWdzLCBNVVNCX1JYQ1NSLCB2YWwpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfVVNCX0lOVkVOVFJBX0RNQSkgfHwgZGVmaW5lZChDT05GSUdfVVNCX1VYNTAwX0RNQSkKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfSU5WRU5UUkFfRE1BKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfVVg1MDBfRE1BKSB8fCBcCisJZGVmaW5lZChDT05GSUdfVVNCX1RJX0NQUEk0MV9ETUEpCiAJCWlmICh1c2JfcGlwZWlzb2MocGlwZSkpIHsKIAkJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpkOwogCkBAIC0xNzA3LDEwICsxNzA4LDMwIEBACiAJCQlpZiAoZC0+c3RhdHVzICE9IC1FSUxTRVEgJiYgZC0+c3RhdHVzICE9IC1FT1ZFUkZMT1cpCiAJCQkJZC0+c3RhdHVzID0gMDsKIAotCQkJaWYgKCsrcWgtPmlzb19pZHggPj0gdXJiLT5udW1iZXJfb2ZfcGFja2V0cykKKwkJCWlmICgrK3FoLT5pc29faWR4ID49IHVyYi0+bnVtYmVyX29mX3BhY2tldHMpIHsKIAkJCQlkb25lID0gdHJ1ZTsKLQkJCWVsc2UKKwkJCX0gZWxzZSB7CisjaWYgZGVmaW5lZChDT05GSUdfVVNCX1RJX0NQUEk0MV9ETUEpCisJCQkJc3RydWN0IGRtYV9jb250cm9sbGVyICAgKmM7CisJCQkJZG1hX2FkZHJfdCAqYnVmOworCQkJCXUzMiBsZW5ndGgsIHJldDsKKworCQkJCWMgPSBtdXNiLT5kbWFfY29udHJvbGxlcjsKKwkJCQlidWYgPSAodm9pZCAqKQorCQkJCQl1cmItPmlzb19mcmFtZV9kZXNjW3FoLT5pc29faWR4XS5vZmZzZXQKKwkJCQkJKyAodTMyKXVyYi0+dHJhbnNmZXJfZG1hOworCisJCQkJbGVuZ3RoID0KKwkJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1txaC0+aXNvX2lkeF0ubGVuZ3RoOworCisJCQkJdmFsIHw9IE1VU0JfUlhDU1JfRE1BRU5BQjsKKwkJCQltdXNiX3dyaXRldyhod19lcC0+cmVncywgTVVTQl9SWENTUiwgdmFsKTsKKworCQkJCXJldCA9IGMtPmNoYW5uZWxfcHJvZ3JhbShkbWEsIHFoLT5tYXhwYWNrZXQsCisJCQkJCQkwLCAodTMyKSBidWYsIGxlbmd0aCk7CisjZW5kaWYKIAkJCQlkb25lID0gZmFsc2U7CisJCQl9CiAKIAkJfSBlbHNlICB7CiAJCS8qIGRvbmUgaWYgdXJiIGJ1ZmZlciBpcyBmdWxsIG9yIHNob3J0IHBhY2tldCBpcyByZWNkICovCkBAIC0xNzUwLDcgKzE3NzEsOCBAQAogCQl9CiAKIAkJLyogd2UgYXJlIGV4cGVjdGluZyBJTiBwYWNrZXRzICovCi0jaWYgZGVmaW5lZChDT05GSUdfVVNCX0lOVkVOVFJBX0RNQSkgfHwgZGVmaW5lZChDT05GSUdfVVNCX1VYNTAwX0RNQSkKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfSU5WRU5UUkFfRE1BKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfVVg1MDBfRE1BKSB8fCBcCisJZGVmaW5lZChDT05GSUdfVVNCX1RJX0NQUEk0MV9ETUEpCiAJCWlmIChkbWEpIHsKIAkJCXN0cnVjdCBkbWFfY29udHJvbGxlcgkqYzsKIAkJCXUxNgkJCXJ4X2NvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5jIGIvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5jCmluZGV4IDhhYTU5YTIuLmQzNDFjMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2Ivb21hcDI0MzAuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9tdXNiLW9tYXAuaD4KLSNpbmNsdWRlIDxsaW51eC91c2Ivb21hcF9jb250cm9sX3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9vbWFwX2NvbnRyb2xfcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KIAogI2luY2x1ZGUgIm11c2JfY29yZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcGh5L0tjb25maWcgYi9kcml2ZXJzL3VzYi9waHkvS2NvbmZpZwppbmRleCA3ZDE0NTFkLi40MTZlMGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9waHkvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9waHkvS2NvbmZpZwpAQCAtNzUsMjcgKzc1LDYgQEAKIAkgIGJ1aWx0LWluIHdpdGggdXNiIGlwIG9yIHdoaWNoIGFyZSBhdXRvbm9tb3VzIGFuZCBkb2Vzbid0IHJlcXVpcmUgYW55CiAJICBwaHkgcHJvZ3JhbW1pbmcgc3VjaCBhcyBJU1AxeDA0IGV0Yy4KIAotY29uZmlnIE9NQVBfQ09OVFJPTF9VU0IKLQl0cmlzdGF0ZSAiT01BUCBDT05UUk9MIFVTQiBEcml2ZXIiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAyUExVUyB8fCBDT01QSUxFX1RFU1QKLQloZWxwCi0JICBFbmFibGUgdGhpcyB0byBhZGQgc3VwcG9ydCBmb3IgdGhlIFVTQiBwYXJ0IHByZXNlbnQgaW4gdGhlIGNvbnRyb2wKLQkgIG1vZHVsZS4gVGhpcyBkcml2ZXIgaGFzIEFQSSB0byBwb3dlciBvbiB0aGUgVVNCMiBQSFkgYW5kIHRvIHdyaXRlIHRvCi0JICB0aGUgbWFpbGJveC4gVGhlIG1haWxib3ggaXMgcHJlc2VudCBvbmx5IGluIG9tYXA0IGFuZCB0aGUgcmVnaXN0ZXIgdG8KLQkgIHBvd2VyIG9uIHRoZSBVU0IyIFBIWSBpcyBwcmVzZW50IGluIE9NQVA0IGFuZCBPTUFQNS4gT01BUDUgaGFzIGFuCi0JICBhZGRpdGlvbmFsIHJlZ2lzdGVyIHRvIHBvd2VyIG9uIFVTQjMgUEhZLgotCi1jb25maWcgT01BUF9VU0IzCi0JdHJpc3RhdGUgIk9NQVAgVVNCMyBQSFkgRHJpdmVyIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQMlBMVVMgfHwgQ09NUElMRV9URVNUCi0Jc2VsZWN0IE9NQVBfQ09OVFJPTF9VU0IKLQlzZWxlY3QgVVNCX1BIWQotCWhlbHAKLQkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgdGhlIFVTQjMgUEhZIHRoYXQgaXMgcGFydCBvZiBTT0MuIFRoaXMKLQkgIGRyaXZlciB0YWtlcyBjYXJlIG9mIGFsbCB0aGUgUEhZIGZ1bmN0aW9uYWxpdHkgYXBhcnQgZnJvbSBjb21wYXJhdG9yLgotCSAgVGhpcyBkcml2ZXIgaW50ZXJhY3RzIHdpdGggdGhlICJPTUFQIENvbnRyb2wgVVNCIERyaXZlciIgdG8gcG93ZXIKLQkgIG9uL29mZiB0aGUgUEhZLgotCiBjb25maWcgQU0zMzVYX0NPTlRST0xfVVNCCiAJdHJpc3RhdGUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcGh5L01ha2VmaWxlIGIvZHJpdmVycy91c2IvcGh5L01ha2VmaWxlCmluZGV4IGJlNThhZGEuLmY4ZmE3MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BoeS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9waHkvTWFrZWZpbGUKQEAgLTEzLDExICsxMyw5IEBACiBvYmotJChDT05GSUdfTVZfVTNEX1BIWSkJCSs9IHBoeS1tdi11M2QtdXNiLm8KIG9iai0kKENPTkZJR19OT1BfVVNCX1hDRUlWKQkJKz0gcGh5LWdlbmVyaWMubwogb2JqLSQoQ09ORklHX1RBSFZPX1VTQikJCQkrPSBwaHktdGFodm8ubwotb2JqLSQoQ09ORklHX09NQVBfQ09OVFJPTF9VU0IpCQkrPSBwaHktb21hcC1jb250cm9sLm8KIG9iai0kKENPTkZJR19BTTMzNVhfQ09OVFJPTF9VU0IpCSs9IHBoeS1hbTMzNXgtY29udHJvbC5vCiBvYmotJChDT05GSUdfQU0zMzVYX1BIWV9VU0IpCQkrPSBwaHktYW0zMzV4Lm8KIG9iai0kKENPTkZJR19PTUFQX09URykJCQkrPSBwaHktb21hcC1vdGcubwotb2JqLSQoQ09ORklHX09NQVBfVVNCMykJCQkrPSBwaHktb21hcC11c2IzLm8KIG9iai0kKENPTkZJR19TQU1TVU5HX1VTQlBIWSkJCSs9IHBoeS1zYW1zdW5nLXVzYi5vCiBvYmotJChDT05GSUdfU0FNU1VOR19VU0IyUEhZKQkJKz0gcGh5LXNhbXN1bmctdXNiMi5vCiBvYmotJChDT05GSUdfU0FNU1VOR19VU0IzUEhZKQkJKz0gcGh5LXNhbXN1bmctdXNiMy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9waHkvcGh5LWZzbS11c2IuYyBiL2RyaXZlcnMvdXNiL3BoeS9waHktZnNtLXVzYi5jCmluZGV4IDdhYTMxNGUuLmM0N2U1YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHktZnNtLXVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3BoeS9waHktZnNtLXVzYi5jCkBAIC0zMTcsMTAgKzMxNywxMiBAQAogCQkJb3RnX3NldF9zdGF0ZShmc20sIE9UR19TVEFURV9BX1dBSVRfVkZBTEwpOwogCQlicmVhazsKIAljYXNlIE9UR19TVEFURV9BX0hPU1Q6Ci0JCWlmICgoIWZzbS0+YV9idXNfcmVxIHx8IGZzbS0+YV9zdXNwZW5kX3JlcV9pbmYpICYmCisJCWlmIChmc20tPmlkIHx8IGZzbS0+YV9idXNfZHJvcCkKKwkJCW90Z19zZXRfc3RhdGUoZnNtLCBPVEdfU1RBVEVfQV9XQUlUX1ZGQUxMKTsKKwkJZWxzZSBpZiAoKCFmc20tPmFfYnVzX3JlcSB8fCBmc20tPmFfc3VzcGVuZF9yZXFfaW5mKSAmJgogCQkJCWZzbS0+b3RnLT5ob3N0LT5iX2hucF9lbmFibGUpCiAJCQlvdGdfc2V0X3N0YXRlKGZzbSwgT1RHX1NUQVRFX0FfU1VTUEVORCk7Ci0JCWVsc2UgaWYgKGZzbS0+aWQgfHwgIWZzbS0+Yl9jb25uIHx8IGZzbS0+YV9idXNfZHJvcCkKKwkJZWxzZSBpZiAoIWZzbS0+Yl9jb25uKQogCQkJb3RnX3NldF9zdGF0ZShmc20sIE9UR19TVEFURV9BX1dBSVRfQkNPTik7CiAJCWVsc2UgaWYgKCFmc20tPmFfdmJ1c192bGQpCiAJCQlvdGdfc2V0X3N0YXRlKGZzbSwgT1RHX1NUQVRFX0FfVkJVU19FUlIpOwpAQCAtMzQ2LDggKzM0OCw3IEBACiAJCQlvdGdfc2V0X3N0YXRlKGZzbSwgT1RHX1NUQVRFX0FfVkJVU19FUlIpOwogCQlicmVhazsKIAljYXNlIE9UR19TVEFURV9BX1dBSVRfVkZBTEw6Ci0JCWlmIChmc20tPmFfd2FpdF92ZmFsbF90bW91dCB8fCBmc20tPmlkIHx8IGZzbS0+YV9idXNfcmVxIHx8Ci0JCQkJKCFmc20tPmFfc2Vzc192bGQgJiYgIWZzbS0+Yl9jb25uKSkKKwkJaWYgKGZzbS0+YV93YWl0X3ZmYWxsX3Rtb3V0KQogCQkJb3RnX3NldF9zdGF0ZShmc20sIE9UR19TVEFURV9BX0lETEUpOwogCQlicmVhazsKIAljYXNlIE9UR19TVEFURV9BX1ZCVVNfRVJSOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcGh5L3BoeS1tc20tdXNiLmMgYi9kcml2ZXJzL3VzYi9waHkvcGh5LW1zbS11c2IuYwppbmRleCBkMjA0Zjc0Li41YjM3YjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9waHkvcGh5LW1zbS11c2IuYworKysgYi9kcml2ZXJzL3VzYi9waHkvcGh5LW1zbS11c2IuYwpAQCAtMTQyOCw3ICsxNDI4LDggQEAKIAltb3RnLT5waHkub3RnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYl9vdGcpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1vdGctPnBoeS5vdGcpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIG1zbV9vdGdcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmcmVlX21vdGc7CiAJfQogCiAJbW90Zy0+cGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcGh5L3BoeS1teHMtdXNiLmMgYi9kcml2ZXJzL3VzYi9waHkvcGh5LW14cy11c2IuYwppbmRleCBiNDI4OTdiLi5jNDJiZGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9waHkvcGh5LW14cy11c2IuYworKysgYi9kcml2ZXJzL3VzYi9waHkvcGh5LW14cy11c2IuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAxMiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTItMjAxMyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDEyIE1hcmVrIFZhc3V0IDxtYXJleEBkZW54LmRlPgogICogb24gYmVoYWxmIG9mIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgR21iSAogICoKQEAgLTIwLDYgKzIwLDkgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJteHNfcGh5IgogCkBAIC0yOCwxOCArMzEsMTM0IEBACiAjZGVmaW5lIEhXX1VTQlBIWV9DVFJMX1NFVAkJCTB4MzQKICNkZWZpbmUgSFdfVVNCUEhZX0NUUkxfQ0xSCQkJMHgzOAogCisjZGVmaW5lIEhXX1VTQlBIWV9ERUJVR19TRVQJCQkweDU0CisjZGVmaW5lIEhXX1VTQlBIWV9ERUJVR19DTFIJCQkweDU4CisKKyNkZWZpbmUgSFdfVVNCUEhZX0lQCQkJCTB4OTAKKyNkZWZpbmUgSFdfVVNCUEhZX0lQX1NFVAkJCTB4OTQKKyNkZWZpbmUgSFdfVVNCUEhZX0lQX0NMUgkJCTB4OTgKKwogI2RlZmluZSBCTV9VU0JQSFlfQ1RSTF9TRlRSU1QJCQlCSVQoMzEpCiAjZGVmaW5lIEJNX1VTQlBIWV9DVFJMX0NMS0dBVEUJCQlCSVQoMzApCisjZGVmaW5lIEJNX1VTQlBIWV9DVFJMX0VOQVVUT1NFVF9VU0JDTEtTCUJJVCgyNikKKyNkZWZpbmUgQk1fVVNCUEhZX0NUUkxfRU5BVVRPQ0xSX1VTQkNMS0dBVEUJQklUKDI1KQorI2RlZmluZSBCTV9VU0JQSFlfQ1RSTF9FTlZCVVNDSEdfV0tVUAkJQklUKDIzKQorI2RlZmluZSBCTV9VU0JQSFlfQ1RSTF9FTklEQ0hHX1dLVVAJCUJJVCgyMikKKyNkZWZpbmUgQk1fVVNCUEhZX0NUUkxfRU5EUERNQ0hHX1dLVVAJCUJJVCgyMSkKKyNkZWZpbmUgQk1fVVNCUEhZX0NUUkxfRU5BVVRPQ0xSX1BIWV9QV0QJQklUKDIwKQorI2RlZmluZSBCTV9VU0JQSFlfQ1RSTF9FTkFVVE9DTFJfQ0xLR0FURQlCSVQoMTkpCisjZGVmaW5lIEJNX1VTQlBIWV9DVFJMX0VOQVVUT19QV1JPTl9QTEwJCUJJVCgxOCkKICNkZWZpbmUgQk1fVVNCUEhZX0NUUkxfRU5VVE1JTEVWRUwzCQlCSVQoMTUpCiAjZGVmaW5lIEJNX1VTQlBIWV9DVFJMX0VOVVRNSUxFVkVMMgkJQklUKDE0KQogI2RlZmluZSBCTV9VU0JQSFlfQ1RSTF9FTkhPU1RESVNDT05ERVRFQ1QJQklUKDEpCiAKKyNkZWZpbmUgQk1fVVNCUEhZX0lQX0ZJWCAgICAgICAgICAgICAgICAgICAgICAgKEJJVCgxNykgfCBCSVQoMTgpKQorCisjZGVmaW5lIEJNX1VTQlBIWV9ERUJVR19DTEtHQVRFCQkJQklUKDMwKQorCisvKiBBbmF0b3AgUmVnaXN0ZXJzICovCisjZGVmaW5lIEFOQURJR19BTkFfTUlTQzAJCQkweDE1MAorI2RlZmluZSBBTkFESUdfQU5BX01JU0MwX1NFVAkJCTB4MTU0CisjZGVmaW5lIEFOQURJR19BTkFfTUlTQzBfQ0xSCQkJMHgxNTgKKworI2RlZmluZSBBTkFESUdfVVNCMV9WQlVTX0RFVF9TVEFUCQkweDFjMAorI2RlZmluZSBBTkFESUdfVVNCMl9WQlVTX0RFVF9TVEFUCQkweDIyMAorCisjZGVmaW5lIEFOQURJR19VU0IxX0xPT1BCQUNLX1NFVAkJMHgxZTQKKyNkZWZpbmUgQU5BRElHX1VTQjFfTE9PUEJBQ0tfQ0xSCQkweDFlOAorI2RlZmluZSBBTkFESUdfVVNCMl9MT09QQkFDS19TRVQJCTB4MjQ0CisjZGVmaW5lIEFOQURJR19VU0IyX0xPT1BCQUNLX0NMUgkJMHgyNDgKKworI2RlZmluZSBCTV9BTkFESUdfQU5BX01JU0MwX1NUT1BfTU9ERV9DT05GSUcJQklUKDEyKQorI2RlZmluZSBCTV9BTkFESUdfQU5BX01JU0MwX1NUT1BfTU9ERV9DT05GSUdfU0wgQklUKDExKQorCisjZGVmaW5lIEJNX0FOQURJR19VU0IxX1ZCVVNfREVUX1NUQVRfVkJVU19WQUxJRAlCSVQoMykKKyNkZWZpbmUgQk1fQU5BRElHX1VTQjJfVkJVU19ERVRfU1RBVF9WQlVTX1ZBTElECUJJVCgzKQorCisjZGVmaW5lIEJNX0FOQURJR19VU0IxX0xPT1BCQUNLX1VUTUlfRElHX1RTVDEJQklUKDIpCisjZGVmaW5lIEJNX0FOQURJR19VU0IxX0xPT1BCQUNLX1RTVElfVFhfRU4JQklUKDUpCisjZGVmaW5lIEJNX0FOQURJR19VU0IyX0xPT1BCQUNLX1VUTUlfRElHX1RTVDEJQklUKDIpCisjZGVmaW5lIEJNX0FOQURJR19VU0IyX0xPT1BCQUNLX1RTVElfVFhfRU4JQklUKDUpCisKKyNkZWZpbmUgdG9fbXhzX3BoeShwKSBjb250YWluZXJfb2YoKHApLCBzdHJ1Y3QgbXhzX3BoeSwgcGh5KQorCisvKiBEbyBkaXNjb25uZWN0aW9uIGJldHdlZW4gUEhZIGFuZCBjb250cm9sbGVyIHdpdGhvdXQgdmJ1cyAqLworI2RlZmluZSBNWFNfUEhZX0RJU0NPTk5FQ1RfTElORV9XSVRIT1VUX1ZCVVMJQklUKDApCisKKy8qCisgKiBUaGUgUEhZIHdpbGwgYmUgaW4gbWVzc3kgaWYgdGhlcmUgaXMgYSB3YWtldXAgYWZ0ZXIgcHV0dGluZworICogYnVzIHRvIHN1c3BlbmQgKHNldCBwb3J0c2Muc3VzcGVuZE0pIGJ1dCBiZWZvcmUgc2V0dGluZyBQSFkgdG8gbG93CisgKiBwb3dlciBtb2RlIChzZXQgcG9ydHNjLnBoY2QpLgorICovCisjZGVmaW5lIE1YU19QSFlfQUJOT1JNQUxfSU5fU1VTUEVORAkJQklUKDEpCisKKy8qCisgKiBUaGUgU09GIHNlbmRzIHRvbyBmYXN0IGFmdGVyIHJlc3VtaW5nLCBpdCB3aWxsIGNhdXNlIGRpc2Nvbm5lY3Rpb24KKyAqIGJldHdlZW4gaG9zdCBhbmQgaGlnaCBzcGVlZCBkZXZpY2UuCisgKi8KKyNkZWZpbmUgTVhTX1BIWV9TRU5ESU5HX1NPRl9UT09fRkFTVAkJQklUKDIpCisKKy8qCisgKiBJQyBoYXMgYnVnIGZpeGVzIGxvZ2ljLCB0aGV5IGluY2x1ZGUKKyAqIE1YU19QSFlfQUJOT1JNQUxfSU5fU1VTUEVORCBhbmQgTVhTX1BIWV9TRU5ESU5HX1NPRl9UT09fRkFTVAorICogd2hpY2ggYXJlIGRlc2NyaWJlZCBhdCBhYm92ZSBmbGFncywgdGhlIFJUTCB3aWxsIGhhbmRsZSBpdAorICogYWNjb3JkaW5nIHRvIGRpZmZlcmVudCB2ZXJzaW9ucy4KKyAqLworI2RlZmluZSBNWFNfUEhZX05FRURfSVBfRklYCQkJQklUKDMpCisKK3N0cnVjdCBteHNfcGh5X2RhdGEgeworCXVuc2lnbmVkIGludCBmbGFnczsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhzX3BoeV9kYXRhIGlteDIzX3BoeV9kYXRhID0geworCS5mbGFncyA9IE1YU19QSFlfQUJOT1JNQUxfSU5fU1VTUEVORCB8IE1YU19QSFlfU0VORElOR19TT0ZfVE9PX0ZBU1QsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG14c19waHlfZGF0YSBpbXg2cV9waHlfZGF0YSA9IHsKKwkuZmxhZ3MgPSBNWFNfUEhZX1NFTkRJTkdfU09GX1RPT19GQVNUIHwKKwkJTVhTX1BIWV9ESVNDT05ORUNUX0xJTkVfV0lUSE9VVF9WQlVTIHwKKwkJTVhTX1BIWV9ORUVEX0lQX0ZJWCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhzX3BoeV9kYXRhIGlteDZzbF9waHlfZGF0YSA9IHsKKwkuZmxhZ3MgPSBNWFNfUEhZX0RJU0NPTk5FQ1RfTElORV9XSVRIT1VUX1ZCVVMgfAorCQlNWFNfUEhZX05FRURfSVBfRklYLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXhzX3BoeV9kdF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg2c2wtdXNicGh5IiwgLmRhdGEgPSAmaW14NnNsX3BoeV9kYXRhLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDZxLXVzYnBoeSIsIC5kYXRhID0gJmlteDZxX3BoeV9kYXRhLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDIzLXVzYnBoeSIsIC5kYXRhID0gJmlteDIzX3BoeV9kYXRhLCB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG14c19waHlfZHRfaWRzKTsKKwogc3RydWN0IG14c19waHkgewogCXN0cnVjdCB1c2JfcGh5IHBoeTsKIAlzdHJ1Y3QgY2xrICpjbGs7CisJY29uc3Qgc3RydWN0IG14c19waHlfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfYW5hdG9wOworCWludCBwb3J0X2lkOwogfTsKIAotI2RlZmluZSB0b19teHNfcGh5KHApIGNvbnRhaW5lcl9vZigocCksIHN0cnVjdCBteHNfcGh5LCBwaHkpCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfaW14NnFfcGh5KHN0cnVjdCBteHNfcGh5ICpteHNfcGh5KQoreworCXJldHVybiBteHNfcGh5LT5kYXRhID09ICZpbXg2cV9waHlfZGF0YTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzX2lteDZzbF9waHkoc3RydWN0IG14c19waHkgKm14c19waHkpCit7CisJcmV0dXJuIG14c19waHktPmRhdGEgPT0gJmlteDZzbF9waHlfZGF0YTsKK30KKworLyoKKyAqIFBIWSBuZWVkcyBzb21lIDMySyBjeWNsZXMgdG8gc3dpdGNoIGZyb20gMzJLIGNsb2NrIHRvCisgKiBidXMgKHN1Y2ggYXMgQUhCL0FYSSwgZXRjKSBjbG9jay4KKyAqLworc3RhdGljIHZvaWQgbXhzX3BoeV9jbG9ja19zd2l0Y2hfZGVsYXkodm9pZCkKK3sKKwl1c2xlZXBfcmFuZ2UoMzAwLCA0MDApOworfQogCiBzdGF0aWMgaW50IG14c19waHlfaHdfaW5pdChzdHJ1Y3QgbXhzX3BoeSAqbXhzX3BoeSkKIHsKQEAgLTUzLDE5ICsxNzIsMTA1IEBACiAJLyogUG93ZXIgdXAgdGhlIFBIWSAqLwogCXdyaXRlbCgwLCBiYXNlICsgSFdfVVNCUEhZX1BXRCk7CiAKLQkvKiBlbmFibGUgRlMvTFMgZGV2aWNlICovCi0Jd3JpdGVsKEJNX1VTQlBIWV9DVFJMX0VOVVRNSUxFVkVMMiB8Ci0JICAgICAgIEJNX1VTQlBIWV9DVFJMX0VOVVRNSUxFVkVMMywKKwkvKgorCSAqIFVTQiBQSFkgQ3RybCBTZXR0aW5nCisJICogLSBBdXRvIGNsb2NrL3Bvd2VyIG9uCisJICogLSBFbmFibGUgZnVsbC9sb3cgc3BlZWQgc3VwcG9ydAorCSAqLworCXdyaXRlbChCTV9VU0JQSFlfQ1RSTF9FTkFVVE9TRVRfVVNCQ0xLUyB8CisJCUJNX1VTQlBIWV9DVFJMX0VOQVVUT0NMUl9VU0JDTEtHQVRFIHwKKwkJQk1fVVNCUEhZX0NUUkxfRU5BVVRPQ0xSX1BIWV9QV0QgfAorCQlCTV9VU0JQSFlfQ1RSTF9FTkFVVE9DTFJfQ0xLR0FURSB8CisJCUJNX1VTQlBIWV9DVFJMX0VOQVVUT19QV1JPTl9QTEwgfAorCQlCTV9VU0JQSFlfQ1RSTF9FTlVUTUlMRVZFTDIgfAorCQlCTV9VU0JQSFlfQ1RSTF9FTlVUTUlMRVZFTDMsCiAJICAgICAgIGJhc2UgKyBIV19VU0JQSFlfQ1RSTF9TRVQpOwogCisJaWYgKG14c19waHktPmRhdGEtPmZsYWdzICYgTVhTX1BIWV9ORUVEX0lQX0ZJWCkKKwkJd3JpdGVsKEJNX1VTQlBIWV9JUF9GSVgsIGJhc2UgKyBIV19VU0JQSFlfSVBfU0VUKTsKKwogCXJldHVybiAwOwogfQogCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmJ1cyBpcyB0aGVyZSAqLworc3RhdGljIGJvb2wgbXhzX3BoeV9nZXRfdmJ1c19zdGF0dXMoc3RydWN0IG14c19waHkgKm14c19waHkpCit7CisJdW5zaWduZWQgaW50IHZidXNfdmFsdWU7CisKKwlpZiAobXhzX3BoeS0+cG9ydF9pZCA9PSAwKQorCQlyZWdtYXBfcmVhZChteHNfcGh5LT5yZWdtYXBfYW5hdG9wLAorCQkJQU5BRElHX1VTQjFfVkJVU19ERVRfU1RBVCwKKwkJCSZ2YnVzX3ZhbHVlKTsKKwllbHNlIGlmIChteHNfcGh5LT5wb3J0X2lkID09IDEpCisJCXJlZ21hcF9yZWFkKG14c19waHktPnJlZ21hcF9hbmF0b3AsCisJCQlBTkFESUdfVVNCMl9WQlVTX0RFVF9TVEFULAorCQkJJnZidXNfdmFsdWUpOworCisJaWYgKHZidXNfdmFsdWUgJiBCTV9BTkFESUdfVVNCMV9WQlVTX0RFVF9TVEFUX1ZCVVNfVkFMSUQpCisJCXJldHVybiB0cnVlOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBfX214c19waHlfZGlzY29ubmVjdF9saW5lKHN0cnVjdCBteHNfcGh5ICpteHNfcGh5LCBib29sIGRpc2Nvbm5lY3QpCit7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gbXhzX3BoeS0+cGh5LmlvX3ByaXY7CisJdTMyIHJlZzsKKworCWlmIChkaXNjb25uZWN0KQorCQl3cml0ZWxfcmVsYXhlZChCTV9VU0JQSFlfREVCVUdfQ0xLR0FURSwKKwkJCWJhc2UgKyBIV19VU0JQSFlfREVCVUdfQ0xSKTsKKworCWlmIChteHNfcGh5LT5wb3J0X2lkID09IDApIHsKKwkJcmVnID0gZGlzY29ubmVjdCA/IEFOQURJR19VU0IxX0xPT1BCQUNLX1NFVAorCQkJOiBBTkFESUdfVVNCMV9MT09QQkFDS19DTFI7CisJCXJlZ21hcF93cml0ZShteHNfcGh5LT5yZWdtYXBfYW5hdG9wLCByZWcsCisJCQlCTV9BTkFESUdfVVNCMV9MT09QQkFDS19VVE1JX0RJR19UU1QxIHwKKwkJCUJNX0FOQURJR19VU0IxX0xPT1BCQUNLX1RTVElfVFhfRU4pOworCX0gZWxzZSBpZiAobXhzX3BoeS0+cG9ydF9pZCA9PSAxKSB7CisJCXJlZyA9IGRpc2Nvbm5lY3QgPyBBTkFESUdfVVNCMl9MT09QQkFDS19TRVQKKwkJCTogQU5BRElHX1VTQjJfTE9PUEJBQ0tfQ0xSOworCQlyZWdtYXBfd3JpdGUobXhzX3BoeS0+cmVnbWFwX2FuYXRvcCwgcmVnLAorCQkJQk1fQU5BRElHX1VTQjJfTE9PUEJBQ0tfVVRNSV9ESUdfVFNUMSB8CisJCQlCTV9BTkFESUdfVVNCMl9MT09QQkFDS19UU1RJX1RYX0VOKTsKKwl9CisKKwlpZiAoIWRpc2Nvbm5lY3QpCisJCXdyaXRlbF9yZWxheGVkKEJNX1VTQlBIWV9ERUJVR19DTEtHQVRFLAorCQkJYmFzZSArIEhXX1VTQlBIWV9ERUJVR19TRVQpOworCisJLyogRGVsYXkgc29tZSB0aW1lLCBhbmQgbGV0IExpbmVzdGF0ZSBiZSBTRTAgZm9yIGNvbnRyb2xsZXIgKi8KKwlpZiAoZGlzY29ubmVjdCkKKwkJdXNsZWVwX3JhbmdlKDUwMCwgMTAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIG14c19waHlfZGlzY29ubmVjdF9saW5lKHN0cnVjdCBteHNfcGh5ICpteHNfcGh5LCBib29sIG9uKQoreworCWJvb2wgdmJ1c19pc19vbiA9IGZhbHNlOworCisJLyogSWYgdGhlIFNvQ3MgZG9uJ3QgbmVlZCB0byBkaXNjb25uZWN0IGxpbmUgd2l0aG91dCB2YnVzLCBxdWl0ICovCisJaWYgKCEobXhzX3BoeS0+ZGF0YS0+ZmxhZ3MgJiBNWFNfUEhZX0RJU0NPTk5FQ1RfTElORV9XSVRIT1VUX1ZCVVMpKQorCQlyZXR1cm47CisKKwkvKiBJZiB0aGUgU29DcyBkb24ndCBoYXZlIGFuYXRvcCwgcXVpdCAqLworCWlmICghbXhzX3BoeS0+cmVnbWFwX2FuYXRvcCkKKwkJcmV0dXJuOworCisJdmJ1c19pc19vbiA9IG14c19waHlfZ2V0X3ZidXNfc3RhdHVzKG14c19waHkpOworCisJaWYgKG9uICYmICF2YnVzX2lzX29uKQorCQlfX214c19waHlfZGlzY29ubmVjdF9saW5lKG14c19waHksIHRydWUpOworCWVsc2UKKwkJX19teHNfcGh5X2Rpc2Nvbm5lY3RfbGluZShteHNfcGh5LCBmYWxzZSk7CisKK30KKwogc3RhdGljIGludCBteHNfcGh5X2luaXQoc3RydWN0IHVzYl9waHkgKnBoeSkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBteHNfcGh5ICpteHNfcGh5ID0gdG9fbXhzX3BoeShwaHkpOwogCisJbXhzX3BoeV9jbG9ja19zd2l0Y2hfZGVsYXkoKTsKIAlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUobXhzX3BoeS0+Y2xrKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtOTQsNiArMjk5LDcgQEAKIAkJICAgICAgIHgtPmlvX3ByaXYgKyBIV19VU0JQSFlfQ1RSTF9TRVQpOwogCQljbGtfZGlzYWJsZV91bnByZXBhcmUobXhzX3BoeS0+Y2xrKTsKIAl9IGVsc2UgeworCQlteHNfcGh5X2Nsb2NrX3N3aXRjaF9kZWxheSgpOwogCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUobXhzX3BoeS0+Y2xrKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CkBAIC0xMDUsMTEgKzMxMSwyOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG14c19waHlfc2V0X3dha2V1cChzdHJ1Y3QgdXNiX3BoeSAqeCwgYm9vbCBlbmFibGVkKQoreworCXN0cnVjdCBteHNfcGh5ICpteHNfcGh5ID0gdG9fbXhzX3BoeSh4KTsKKwl1MzIgdmFsdWUgPSBCTV9VU0JQSFlfQ1RSTF9FTlZCVVNDSEdfV0tVUCB8CisJCQlCTV9VU0JQSFlfQ1RSTF9FTkRQRE1DSEdfV0tVUCB8CisJCQkJQk1fVVNCUEhZX0NUUkxfRU5JRENIR19XS1VQOworCWlmIChlbmFibGVkKSB7CisJCW14c19waHlfZGlzY29ubmVjdF9saW5lKG14c19waHksIHRydWUpOworCQl3cml0ZWxfcmVsYXhlZCh2YWx1ZSwgeC0+aW9fcHJpdiArIEhXX1VTQlBIWV9DVFJMX1NFVCk7CisJfSBlbHNlIHsKKwkJd3JpdGVsX3JlbGF4ZWQodmFsdWUsIHgtPmlvX3ByaXYgKyBIV19VU0JQSFlfQ1RSTF9DTFIpOworCQlteHNfcGh5X2Rpc2Nvbm5lY3RfbGluZShteHNfcGh5LCBmYWxzZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbXhzX3BoeV9vbl9jb25uZWN0KHN0cnVjdCB1c2JfcGh5ICpwaHksCiAJCWVudW0gdXNiX2RldmljZV9zcGVlZCBzcGVlZCkKIHsKLQlkZXZfZGJnKHBoeS0+ZGV2LCAiJXMgc3BlZWQgZGV2aWNlIGhhcyBjb25uZWN0ZWRcbiIsCi0JCShzcGVlZCA9PSBVU0JfU1BFRURfSElHSCkgPyAiaGlnaCIgOiAibm9uLWhpZ2giKTsKKwlkZXZfZGJnKHBoeS0+ZGV2LCAiJXMgZGV2aWNlIGhhcyBjb25uZWN0ZWRcbiIsCisJCShzcGVlZCA9PSBVU0JfU1BFRURfSElHSCkgPyAiSFMiIDogIkZTL0xTIik7CiAKIAlpZiAoc3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCiAJCXdyaXRlbChCTV9VU0JQSFlfQ1RSTF9FTkhPU1RESVNDT05ERVRFQ1QsCkBAIC0xMjEsOCArMzQ0LDggQEAKIHN0YXRpYyBpbnQgbXhzX3BoeV9vbl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfcGh5ICpwaHksCiAJCWVudW0gdXNiX2RldmljZV9zcGVlZCBzcGVlZCkKIHsKLQlkZXZfZGJnKHBoeS0+ZGV2LCAiJXMgc3BlZWQgZGV2aWNlIGhhcyBkaXNjb25uZWN0ZWRcbiIsCi0JCShzcGVlZCA9PSBVU0JfU1BFRURfSElHSCkgPyAiaGlnaCIgOiAibm9uLWhpZ2giKTsKKwlkZXZfZGJnKHBoeS0+ZGV2LCAiJXMgZGV2aWNlIGhhcyBkaXNjb25uZWN0ZWRcbiIsCisJCShzcGVlZCA9PSBVU0JfU1BFRURfSElHSCkgPyAiSFMiIDogIkZTL0xTIik7CiAKIAlpZiAoc3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCiAJCXdyaXRlbChCTV9VU0JQSFlfQ1RSTF9FTkhPU1RESVNDT05ERVRFQ1QsCkBAIC0xMzgsNiArMzYxLDkgQEAKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IG14c19waHkgKm14c19waHk7CiAJaW50IHJldDsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZCA9CisJCQlvZl9tYXRjaF9kZXZpY2UobXhzX3BoeV9kdF9pZHMsICZwZGV2LT5kZXYpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwpAQCAtMTU3LDYgKzM4MywyMiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwkvKiBTb21lIFNvQ3MgZG9uJ3QgaGF2ZSBhbmF0b3AgcmVnaXN0ZXJzICovCisJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImZzbCxhbmF0b3AiLCBOVUxMKSkgeworCQlteHNfcGh5LT5yZWdtYXBfYW5hdG9wID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfcGhhbmRsZQorCQkJKG5wLCAiZnNsLGFuYXRvcCIpOworCQlpZiAoSVNfRVJSKG14c19waHktPnJlZ21hcF9hbmF0b3ApKSB7CisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsCisJCQkJImZhaWxlZCB0byBmaW5kIHJlZ21hcCBmb3IgYW5hdG9wXG4iKTsKKwkJCXJldHVybiBQVFJfRVJSKG14c19waHktPnJlZ21hcF9hbmF0b3ApOworCQl9CisJfQorCisJcmV0ID0gb2ZfYWxpYXNfZ2V0X2lkKG5wLCAidXNicGh5Iik7CisJaWYgKHJldCA8IDApCisJCWRldl9kYmcoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgYWxpYXMgaWQsIGVycm5vICVkXG4iLCByZXQpOworCW14c19waHktPnBvcnRfaWQgPSByZXQ7CisKIAlteHNfcGh5LT5waHkuaW9fcHJpdgkJPSBiYXNlOwogCW14c19waHktPnBoeS5kZXYJCT0gJnBkZXYtPmRldjsKIAlteHNfcGh5LT5waHkubGFiZWwJCT0gRFJJVkVSX05BTUU7CkBAIC0xNjYsMTEgKzQwOCwxNSBAQAogCW14c19waHktPnBoeS5ub3RpZnlfY29ubmVjdAk9IG14c19waHlfb25fY29ubmVjdDsKIAlteHNfcGh5LT5waHkubm90aWZ5X2Rpc2Nvbm5lY3QJPSBteHNfcGh5X29uX2Rpc2Nvbm5lY3Q7CiAJbXhzX3BoeS0+cGh5LnR5cGUJCT0gVVNCX1BIWV9UWVBFX1VTQjI7CisJbXhzX3BoeS0+cGh5LnNldF93YWtldXAJCT0gbXhzX3BoeV9zZXRfd2FrZXVwOwogCiAJbXhzX3BoeS0+Y2xrID0gY2xrOworCW14c19waHktPmRhdGEgPSBvZl9pZC0+ZGF0YTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG14c19waHkpOwogCisJZGV2aWNlX3NldF93YWtldXBfY2FwYWJsZSgmcGRldi0+ZGV2LCB0cnVlKTsKKwogCXJldCA9IHVzYl9hZGRfcGh5X2RldigmbXhzX3BoeS0+cGh5KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtMTg3LDExICs0MzMsNDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXhzX3BoeV9kdF9pZHNbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgyMy11c2JwaHkiLCB9LAotCXsgLyogc2VudGluZWwgKi8gfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG14c19waHlfZHRfaWRzKTsKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyB2b2lkIG14c19waHlfZW5hYmxlX2xkb19pbl9zdXNwZW5kKHN0cnVjdCBteHNfcGh5ICpteHNfcGh5LCBib29sIG9uKQoreworCXVuc2lnbmVkIGludCByZWcgPSBvbiA/IEFOQURJR19BTkFfTUlTQzBfU0VUIDogQU5BRElHX0FOQV9NSVNDMF9DTFI7CisKKwkvKiBJZiB0aGUgU29DcyBkb24ndCBoYXZlIGFuYXRvcCwgcXVpdCAqLworCWlmICghbXhzX3BoeS0+cmVnbWFwX2FuYXRvcCkKKwkJcmV0dXJuOworCisJaWYgKGlzX2lteDZxX3BoeShteHNfcGh5KSkKKwkJcmVnbWFwX3dyaXRlKG14c19waHktPnJlZ21hcF9hbmF0b3AsIHJlZywKKwkJCUJNX0FOQURJR19BTkFfTUlTQzBfU1RPUF9NT0RFX0NPTkZJRyk7CisJZWxzZSBpZiAoaXNfaW14NnNsX3BoeShteHNfcGh5KSkKKwkJcmVnbWFwX3dyaXRlKG14c19waHktPnJlZ21hcF9hbmF0b3AsCisJCQlyZWcsIEJNX0FOQURJR19BTkFfTUlTQzBfU1RPUF9NT0RFX0NPTkZJR19TTCk7Cit9CisKK3N0YXRpYyBpbnQgbXhzX3BoeV9zeXN0ZW1fc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG14c19waHkgKm14c19waHkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQlteHNfcGh5X2VuYWJsZV9sZG9faW5fc3VzcGVuZChteHNfcGh5LCB0cnVlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14c19waHlfc3lzdGVtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG14c19waHkgKm14c19waHkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQlteHNfcGh5X2VuYWJsZV9sZG9faW5fc3VzcGVuZChteHNfcGh5LCBmYWxzZSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKG14c19waHlfcG0sIG14c19waHlfc3lzdGVtX3N1c3BlbmQsCisJCW14c19waHlfc3lzdGVtX3Jlc3VtZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG14c19waHlfZHJpdmVyID0gewogCS5wcm9iZSA9IG14c19waHlfcHJvYmUsCkBAIC0yMDAsNiArNDgxLDcgQEAKIAkJLm5hbWUgPSBEUklWRVJfTkFNRSwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJCS5vZl9tYXRjaF90YWJsZSA9IG14c19waHlfZHRfaWRzLAorCQkucG0gPSAmbXhzX3BoeV9wbSwKIAkgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9waHktb21hcC1jb250cm9sLmMgYi9kcml2ZXJzL3VzYi9waHkvcGh5LW9tYXAtY29udHJvbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzI1MzE4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHktb21hcC1jb250cm9sLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoKLSAqIG9tYXAtY29udHJvbC11c2IuYyAtIFRoZSBVU0IgcGFydCBvZiBjb250cm9sIG1vZHVsZS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20KLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogQXV0aG9yOiBLaXNob24gVmlqYXkgQWJyYWhhbSBJIDxraXNob25AdGkuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9vbWFwX2NvbnRyb2xfdXNiLmg+Ci0KLS8qKgotICogb21hcF9jb250cm9sX3VzYl9waHlfcG93ZXIgLSBwb3dlciBvbi9vZmYgdGhlIHBoeSB1c2luZyBjb250cm9sIG1vZHVsZSByZWcKLSAqIEBkZXY6IHRoZSBjb250cm9sIG1vZHVsZSBkZXZpY2UKLSAqIEBvbjogMCBvciAxLCBiYXNlZCBvbiBwb3dlcmluZyBvbiBvciBvZmYgdGhlIFBIWQotICovCi12b2lkIG9tYXBfY29udHJvbF91c2JfcGh5X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG9uKQotewotCXUzMiB2YWw7Ci0JdW5zaWduZWQgbG9uZyByYXRlOwotCXN0cnVjdCBvbWFwX2NvbnRyb2xfdXNiCSpjb250cm9sX3VzYjsKLQotCWlmIChJU19FUlIoZGV2KSB8fCAhZGV2KSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQljb250cm9sX3VzYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWlmICghY29udHJvbF91c2IpIHsKLQkJZGV2X2VycihkZXYsICIlczogaW52YWxpZCBjb250cm9sIHVzYiBkZXZpY2VcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChjb250cm9sX3VzYi0+dHlwZSA9PSBPTUFQX0NUUkxfVFlQRV9PVEdIUykKLQkJcmV0dXJuOwotCi0JdmFsID0gcmVhZGwoY29udHJvbF91c2ItPnBvd2VyKTsKLQotCXN3aXRjaCAoY29udHJvbF91c2ItPnR5cGUpIHsKLQljYXNlIE9NQVBfQ1RSTF9UWVBFX1VTQjI6Ci0JCWlmIChvbikKLQkJCXZhbCAmPSB+T01BUF9DVFJMX0RFVl9QSFlfUEQ7Ci0JCWVsc2UKLQkJCXZhbCB8PSBPTUFQX0NUUkxfREVWX1BIWV9QRDsKLQkJYnJlYWs7Ci0KLQljYXNlIE9NQVBfQ1RSTF9UWVBFX1BJUEUzOgotCQlyYXRlID0gY2xrX2dldF9yYXRlKGNvbnRyb2xfdXNiLT5zeXNfY2xrKTsKLQkJcmF0ZSA9IHJhdGUvMTAwMDAwMDsKLQotCQlpZiAob24pIHsKLQkJCXZhbCAmPSB+KE9NQVBfQ1RSTF9VU0JfUFdSQ1RMX0NMS19DTURfTUFTSyB8Ci0JCQkJCU9NQVBfQ1RSTF9VU0JfUFdSQ1RMX0NMS19GUkVRX01BU0spOwotCQkJdmFsIHw9IE9NQVBfQ1RSTF9VU0IzX1BIWV9UWF9SWF9QT1dFUk9OIDw8Ci0JCQkJT01BUF9DVFJMX1VTQl9QV1JDVExfQ0xLX0NNRF9TSElGVDsKLQkJCXZhbCB8PSByYXRlIDw8IE9NQVBfQ1RSTF9VU0JfUFdSQ1RMX0NMS19GUkVRX1NISUZUOwotCQl9IGVsc2UgewotCQkJdmFsICY9IH5PTUFQX0NUUkxfVVNCX1BXUkNUTF9DTEtfQ01EX01BU0s7Ci0JCQl2YWwgfD0gT01BUF9DVFJMX1VTQjNfUEhZX1RYX1JYX1BPV0VST0ZGIDw8Ci0JCQkJT01BUF9DVFJMX1VTQl9QV1JDVExfQ0xLX0NNRF9TSElGVDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgT01BUF9DVFJMX1RZUEVfRFJBN1VTQjI6Ci0JCWlmIChvbikKLQkJCXZhbCAmPSB+T01BUF9DVFJMX1VTQjJfUEhZX1BEOwotCQllbHNlCi0JCQl2YWwgfD0gT01BUF9DVFJMX1VTQjJfUEhZX1BEOwotCQlicmVhazsKLQotCWNhc2UgT01BUF9DVFJMX1RZUEVfQU00MzdVU0IyOgotCQlpZiAob24pIHsKLQkJCXZhbCAmPSB+KEFNNDM3WF9DVFJMX1VTQjJfUEhZX1BEIHwKLQkJCQkJQU00MzdYX0NUUkxfVVNCMl9PVEdfUEQpOwotCQkJdmFsIHw9IChBTTQzN1hfQ1RSTF9VU0IyX09UR1ZERVRfRU4gfAotCQkJCQlBTTQzN1hfQ1RSTF9VU0IyX09UR1NFU1NFTkRfRU4pOwotCQl9IGVsc2UgewotCQkJdmFsICY9IH4oQU00MzdYX0NUUkxfVVNCMl9PVEdWREVUX0VOIHwKLQkJCQkJQU00MzdYX0NUUkxfVVNCMl9PVEdTRVNTRU5EX0VOKTsKLQkJCXZhbCB8PSAoQU00MzdYX0NUUkxfVVNCMl9QSFlfUEQgfAotCQkJCQkgQU00MzdYX0NUUkxfVVNCMl9PVEdfUEQpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHR5cGUgJWQgbm90IHJlY29nbml6ZWRcbiIsCi0JCQkJCV9fZnVuY19fLCBjb250cm9sX3VzYi0+dHlwZSk7Ci0JCWJyZWFrOwotCX0KLQotCXdyaXRlbCh2YWwsIGNvbnRyb2xfdXNiLT5wb3dlcik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChvbWFwX2NvbnRyb2xfdXNiX3BoeV9wb3dlcik7Ci0KLS8qKgotICogb21hcF9jb250cm9sX3VzYl9ob3N0X21vZGUgLSBzZXQgQVZBTElELCBWQlVTVkFMSUQgYW5kIElEIHBpbiBpbiBncm91bmRlZAotICogQGN0cmxfdXNiOiBzdHJ1Y3Qgb21hcF9jb250cm9sX3VzYiAqCi0gKgotICogV3JpdGVzIHRvIHRoZSBtYWlsYm94IHJlZ2lzdGVyIHRvIG5vdGlmeSB0aGUgdXNiIGNvcmUgdGhhdCBhIHVzYgotICogZGV2aWNlIGhhcyBiZWVuIGNvbm5lY3RlZC4KLSAqLwotc3RhdGljIHZvaWQgb21hcF9jb250cm9sX3VzYl9ob3N0X21vZGUoc3RydWN0IG9tYXBfY29udHJvbF91c2IgKmN0cmxfdXNiKQotewotCXUzMiB2YWw7Ci0KLQl2YWwgPSByZWFkbChjdHJsX3VzYi0+b3RnaHNfY29udHJvbCk7Ci0JdmFsICY9IH4oT01BUF9DVFJMX0RFVl9JRERJRyB8IE9NQVBfQ1RSTF9ERVZfU0VTU0VORCk7Ci0JdmFsIHw9IE9NQVBfQ1RSTF9ERVZfQVZBTElEIHwgT01BUF9DVFJMX0RFVl9WQlVTVkFMSUQ7Ci0Jd3JpdGVsKHZhbCwgY3RybF91c2ItPm90Z2hzX2NvbnRyb2wpOwotfQotCi0vKioKLSAqIG9tYXBfY29udHJvbF91c2JfZGV2aWNlX21vZGUgLSBzZXQgQVZBTElELCBWQlVTVkFMSUQgYW5kIElEIHBpbiBpbiBoaWdoCi0gKiBpbXBlZGFuY2UKLSAqIEBjdHJsX3VzYjogc3RydWN0IG9tYXBfY29udHJvbF91c2IgKgotICoKLSAqIFdyaXRlcyB0byB0aGUgbWFpbGJveCByZWdpc3RlciB0byBub3RpZnkgdGhlIHVzYiBjb3JlIHRoYXQgaXQgaGFzIGJlZW4KLSAqIGNvbm5lY3RlZCB0byBhIHVzYiBob3N0LgotICovCi1zdGF0aWMgdm9pZCBvbWFwX2NvbnRyb2xfdXNiX2RldmljZV9tb2RlKHN0cnVjdCBvbWFwX2NvbnRyb2xfdXNiICpjdHJsX3VzYikKLXsKLQl1MzIgdmFsOwotCi0JdmFsID0gcmVhZGwoY3RybF91c2ItPm90Z2hzX2NvbnRyb2wpOwotCXZhbCAmPSB+T01BUF9DVFJMX0RFVl9TRVNTRU5EOwotCXZhbCB8PSBPTUFQX0NUUkxfREVWX0lERElHIHwgT01BUF9DVFJMX0RFVl9BVkFMSUQgfAotCQlPTUFQX0NUUkxfREVWX1ZCVVNWQUxJRDsKLQl3cml0ZWwodmFsLCBjdHJsX3VzYi0+b3RnaHNfY29udHJvbCk7Ci19Ci0KLS8qKgotICogb21hcF9jb250cm9sX3VzYl9zZXRfc2Vzc2lvbmVuZCAtIEVuYWJsZSBTRVNTSU9ORU5EIGFuZCBJRElHIHRvIGhpZ2gKLSAqIGltcGVkYW5jZQotICogQGN0cmxfdXNiOiBzdHJ1Y3Qgb21hcF9jb250cm9sX3VzYiAqCi0gKgotICogV3JpdGVzIHRvIHRoZSBtYWlsYm94IHJlZ2lzdGVyIHRvIG5vdGlmeSB0aGUgdXNiIGNvcmUgaXQncyBub3cgaW4KLSAqIGRpc2Nvbm5lY3RlZCBzdGF0ZS4KLSAqLwotc3RhdGljIHZvaWQgb21hcF9jb250cm9sX3VzYl9zZXRfc2Vzc2lvbmVuZChzdHJ1Y3Qgb21hcF9jb250cm9sX3VzYiAqY3RybF91c2IpCi17Ci0JdTMyIHZhbDsKLQotCXZhbCA9IHJlYWRsKGN0cmxfdXNiLT5vdGdoc19jb250cm9sKTsKLQl2YWwgJj0gfihPTUFQX0NUUkxfREVWX0FWQUxJRCB8IE9NQVBfQ1RSTF9ERVZfVkJVU1ZBTElEKTsKLQl2YWwgfD0gT01BUF9DVFJMX0RFVl9JRERJRyB8IE9NQVBfQ1RSTF9ERVZfU0VTU0VORDsKLQl3cml0ZWwodmFsLCBjdHJsX3VzYi0+b3RnaHNfY29udHJvbCk7Ci19Ci0KLS8qKgotICogb21hcF9jb250cm9sX3VzYl9zZXRfbW9kZSAtIENhbGxzIHRvIGZ1bmN0aW9ucyB0byBzZXQgVVNCIGluIG9uZSBvZiBob3N0IG1vZGUKLSAqIG9yIGRldmljZSBtb2RlIG9yIHRvIGRlbm90ZSBkaXNjb25uZWN0ZWQgc3RhdGUKLSAqIEBkZXY6IHRoZSBjb250cm9sIG1vZHVsZSBkZXZpY2UKLSAqIEBtb2RlOiBUaGUgbW9kZSB0byB3aGljaCB1c2Igc2hvdWxkIGJlIGNvbmZpZ3VyZWQKLSAqCi0gKiBUaGlzIGlzIGFuIEFQSSB0byB3cml0ZSB0byB0aGUgbWFpbGJveCByZWdpc3RlciB0byBub3RpZnkgdGhlIHVzYiBjb3JlIHRoYXQKLSAqIGEgdXNiIGRldmljZSBoYXMgYmVlbiBjb25uZWN0ZWQuCi0gKi8KLXZvaWQgb21hcF9jb250cm9sX3VzYl9zZXRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JZW51bSBvbWFwX2NvbnRyb2xfdXNiX21vZGUgbW9kZSkKLXsKLQlzdHJ1Y3Qgb21hcF9jb250cm9sX3VzYgkqY3RybF91c2I7Ci0KLQlpZiAoSVNfRVJSKGRldikgfHwgIWRldikKLQkJcmV0dXJuOwotCi0JY3RybF91c2IgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCWlmICghY3RybF91c2IpIHsKLQkJZGV2X2VycihkZXYsICJJbnZhbGlkIGNvbnRyb2wgdXNiIGRldmljZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoY3RybF91c2ItPnR5cGUgIT0gT01BUF9DVFJMX1RZUEVfT1RHSFMpCi0JCXJldHVybjsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgVVNCX01PREVfSE9TVDoKLQkJb21hcF9jb250cm9sX3VzYl9ob3N0X21vZGUoY3RybF91c2IpOwotCQlicmVhazsKLQljYXNlIFVTQl9NT0RFX0RFVklDRToKLQkJb21hcF9jb250cm9sX3VzYl9kZXZpY2VfbW9kZShjdHJsX3VzYik7Ci0JCWJyZWFrOwotCWNhc2UgVVNCX01PREVfRElTQ09OTkVDVDoKLQkJb21hcF9jb250cm9sX3VzYl9zZXRfc2Vzc2lvbmVuZChjdHJsX3VzYik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl92ZGJnKGRldiwgImludmFsaWQgb21hcCBjb250cm9sIHVzYiBtb2RlXG4iKTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChvbWFwX2NvbnRyb2xfdXNiX3NldF9tb2RlKTsKLQotI2lmZGVmIENPTkZJR19PRgotCi1zdGF0aWMgY29uc3QgZW51bSBvbWFwX2NvbnRyb2xfdXNiX3R5cGUgb3RnaHNfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX09UR0hTOwotc3RhdGljIGNvbnN0IGVudW0gb21hcF9jb250cm9sX3VzYl90eXBlIHVzYjJfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX1VTQjI7Ci1zdGF0aWMgY29uc3QgZW51bSBvbWFwX2NvbnRyb2xfdXNiX3R5cGUgcGlwZTNfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX1BJUEUzOwotc3RhdGljIGNvbnN0IGVudW0gb21hcF9jb250cm9sX3VzYl90eXBlIGRyYTd1c2IyX2RhdGEgPSBPTUFQX0NUUkxfVFlQRV9EUkE3VVNCMjsKLXN0YXRpYyBjb25zdCBlbnVtIG9tYXBfY29udHJvbF91c2JfdHlwZSBhbTQzN3VzYjJfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX0FNNDM3VVNCMjsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb21hcF9jb250cm9sX3VzYl9pZF90YWJsZVtdID0gewotCXsKLQkJLmNvbXBhdGlibGUgPSAidGksY29udHJvbC1waHktb3RnaHMiLAotCQkuZGF0YSA9ICZvdGdoc19kYXRhLAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJ0aSxjb250cm9sLXBoeS11c2IyIiwKLQkJLmRhdGEgPSAmdXNiMl9kYXRhLAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJ0aSxjb250cm9sLXBoeS1waXBlMyIsCi0JCS5kYXRhID0gJnBpcGUzX2RhdGEsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInRpLGNvbnRyb2wtcGh5LWRyYTd1c2IyIiwKLQkJLmRhdGEgPSAmZHJhN3VzYjJfZGF0YSwKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAidGksY29udHJvbC1waHktYW00Mzd1c2IyIiwKLQkJLmRhdGEgPSAmYW00Mzd1c2IyX2RhdGEsCi0JfSwKLQl7fSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvbWFwX2NvbnRyb2xfdXNiX2lkX3RhYmxlKTsKLSNlbmRpZgotCi0KLXN0YXRpYyBpbnQgb21hcF9jb250cm9sX3VzYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCByZXNvdXJjZQkqcmVzOwotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOwotCXN0cnVjdCBvbWFwX2NvbnRyb2xfdXNiICpjb250cm9sX3VzYjsKLQotCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKG9mX21hdGNoX3B0cihvbWFwX2NvbnRyb2xfdXNiX2lkX3RhYmxlKSwKLQkJCQkJCQkJJnBkZXYtPmRldik7Ci0JaWYgKCFvZl9pZCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljb250cm9sX3VzYiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmNvbnRyb2xfdXNiKSwKLQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjb250cm9sX3VzYikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBjb250cm9sIHVzYlxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWNvbnRyb2xfdXNiLT5kZXYgPSAmcGRldi0+ZGV2OwotCWNvbnRyb2xfdXNiLT50eXBlID0gKihlbnVtIG9tYXBfY29udHJvbF91c2JfdHlwZSAqKW9mX2lkLT5kYXRhOwotCi0JaWYgKGNvbnRyb2xfdXNiLT50eXBlID09IE9NQVBfQ1RSTF9UWVBFX09UR0hTKSB7Ci0JCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCi0JCQkib3RnaHNfY29udHJvbCIpOwotCQljb250cm9sX3VzYi0+b3RnaHNfY29udHJvbCA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgKLQkJCSZwZGV2LT5kZXYsIHJlcyk7Ci0JCWlmIChJU19FUlIoY29udHJvbF91c2ItPm90Z2hzX2NvbnRyb2wpKQotCQkJcmV0dXJuIFBUUl9FUlIoY29udHJvbF91c2ItPm90Z2hzX2NvbnRyb2wpOwotCX0gZWxzZSB7Ci0JCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCi0JCQkJInBvd2VyIik7Ci0JCWNvbnRyb2xfdXNiLT5wb3dlciA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwotCQlpZiAoSVNfRVJSKGNvbnRyb2xfdXNiLT5wb3dlcikpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkbid0IGdldCBwb3dlciByZWdpc3RlclxuIik7Ci0JCQlyZXR1cm4gUFRSX0VSUihjb250cm9sX3VzYi0+cG93ZXIpOwotCQl9Ci0JfQotCi0JaWYgKGNvbnRyb2xfdXNiLT50eXBlID09IE9NQVBfQ1RSTF9UWVBFX1BJUEUzKSB7Ci0JCWNvbnRyb2xfdXNiLT5zeXNfY2xrID0gZGV2bV9jbGtfZ2V0KGNvbnRyb2xfdXNiLT5kZXYsCi0JCQkic3lzX2Nsa2luIik7Ci0JCWlmIChJU19FUlIoY29udHJvbF91c2ItPnN5c19jbGspKSB7Ci0JCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gZ2V0IHN5c19jbGtpblxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQlkZXZfc2V0X2RydmRhdGEoY29udHJvbF91c2ItPmRldiwgY29udHJvbF91c2IpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXBfY29udHJvbF91c2JfZHJpdmVyID0gewotCS5wcm9iZQkJPSBvbWFwX2NvbnRyb2xfdXNiX3Byb2JlLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJvbWFwLWNvbnRyb2wtdXNiIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihvbWFwX2NvbnRyb2xfdXNiX2lkX3RhYmxlKSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgb21hcF9jb250cm9sX3VzYl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb21hcF9jb250cm9sX3VzYl9kcml2ZXIpOwotfQotc3Vic3lzX2luaXRjYWxsKG9tYXBfY29udHJvbF91c2JfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBvbWFwX2NvbnRyb2xfdXNiX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb21hcF9jb250cm9sX3VzYl9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQob21hcF9jb250cm9sX3VzYl9leGl0KTsKLQotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTogb21hcF9jb250cm9sX3VzYiIpOwotTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMgSW5jLiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJPTUFQIENvbnRyb2wgTW9kdWxlIFVTQiBEcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9waHktb21hcC11c2IzLmMgYi9kcml2ZXJzL3VzYi9waHkvcGh5LW9tYXAtdXNiMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzZiYTI5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHktb21hcC11c2IzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjEgKzAsMCBAQAotLyoKLSAqIG9tYXAtdXNiMyAtIFVTQiBQSFksIHRhbGtpbmcgdG8gZHdjMyBjb250cm9sbGVyIGluIE9NQVAuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEF1dGhvcjogS2lzaG9uIFZpamF5IEFicmFoYW0gSSA8a2lzaG9uQHRpLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9vbWFwX3VzYi5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiL29tYXBfY29udHJvbF91c2IuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotCi0jZGVmaW5lCVBMTF9TVEFUVVMJCTB4MDAwMDAwMDQKLSNkZWZpbmUJUExMX0dPCQkJMHgwMDAwMDAwOAotI2RlZmluZQlQTExfQ09ORklHVVJBVElPTjEJMHgwMDAwMDAwQwotI2RlZmluZQlQTExfQ09ORklHVVJBVElPTjIJMHgwMDAwMDAxMAotI2RlZmluZQlQTExfQ09ORklHVVJBVElPTjMJMHgwMDAwMDAxNAotI2RlZmluZQlQTExfQ09ORklHVVJBVElPTjQJMHgwMDAwMDAyMAotCi0jZGVmaW5lCVBMTF9SRUdNX01BU0sJCTB4MDAxRkZFMDAKLSNkZWZpbmUJUExMX1JFR01fU0hJRlQJCTB4OQotI2RlZmluZQlQTExfUkVHTV9GX01BU0sJCTB4MDAwM0ZGRkYKLSNkZWZpbmUJUExMX1JFR01fRl9TSElGVAkweDAKLSNkZWZpbmUJUExMX1JFR05fTUFTSwkJMHgwMDAwMDFGRQotI2RlZmluZQlQTExfUkVHTl9TSElGVAkJMHgxCi0jZGVmaW5lCVBMTF9TRUxGUkVRRENPX01BU0sJMHgwMDAwMDAwRQotI2RlZmluZQlQTExfU0VMRlJFUURDT19TSElGVAkweDEKLSNkZWZpbmUJUExMX1NEX01BU0sJCTB4MDAwM0ZDMDAKLSNkZWZpbmUJUExMX1NEX1NISUZUCQkweDkKLSNkZWZpbmUJU0VUX1BMTF9HTwkJMHgxCi0jZGVmaW5lCVBMTF9USUNPUFdETgkJMHgxMDAwMAotI2RlZmluZQlQTExfTE9DSwkJMHgyCi0jZGVmaW5lCVBMTF9JRExFCQkweDEKLQotLyoKLSAqIFRoaXMgaXMgYW4gRW1waXJpY2FsIHZhbHVlIHRoYXQgd29ya3MsIG5lZWQgdG8gY29uZmlybSB0aGUgYWN0dWFsCi0gKiB2YWx1ZSByZXF1aXJlZCBmb3IgdGhlIFVTQjNQSFlfUExMX0NPTkZJR1VSQVRJT04yLlBMTF9JRExFIHN0YXR1cwotICogdG8gYmUgY29ycmVjdGx5IHJlZmxlY3RlZCBpbiB0aGUgVVNCM1BIWV9QTExfU1RBVFVTIHJlZ2lzdGVyLgotICovCi0jIGRlZmluZSBQTExfSURMRV9USU1FICAxMDA7Ci0KLXN0cnVjdCB1c2JfZHBsbF9tYXAgewotCXVuc2lnbmVkIGxvbmcgcmF0ZTsKLQlzdHJ1Y3QgdXNiX2RwbGxfcGFyYW1zIHBhcmFtczsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RwbGxfbWFwIGRwbGxfbWFwW10gPSB7Ci0JezEyMDAwMDAwLCB7MTI1MCwgNSwgNCwgMjAsIDB9IH0sCS8qIDEyIE1IeiAqLwotCXsxNjgwMDAwMCwgezMxMjUsIDIwLCA0LCAyMCwgMH0gfSwJLyogMTYuOCBNSHogKi8KLQl7MTkyMDAwMDAsIHsxMTcyLCA4LCA0LCAyMCwgNjU1Mzd9IH0sCS8qIDE5LjIgTUh6ICovCi0JezIwMDAwMDAwLCB7MTAwMCwgNywgNCwgMTAsIDB9IH0sCS8qIDIwIE1IeiAqLwotCXsyNjAwMDAwMCwgezEyNTAsIDEyLCA0LCAyMCwgMH0gfSwJLyogMjYgTUh6ICovCi0JezM4NDAwMDAwLCB7MzEyNSwgNDcsIDQsIDIwLCA5Mjg0M30gfSwJLyogMzguNCBNSHogKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RwbGxfcGFyYW1zICpvbWFwX3VzYjNfZ2V0X2RwbGxfcGFyYW1zKHVuc2lnbmVkIGxvbmcgcmF0ZSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRwbGxfbWFwKTsgaSsrKSB7Ci0JCWlmIChyYXRlID09IGRwbGxfbWFwW2ldLnJhdGUpCi0JCQlyZXR1cm4gJmRwbGxfbWFwW2ldLnBhcmFtczsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBvbWFwX3VzYjNfc3VzcGVuZChzdHJ1Y3QgdXNiX3BoeSAqeCwgaW50IHN1c3BlbmQpCi17Ci0Jc3RydWN0IG9tYXBfdXNiICpwaHkgPSBwaHlfdG9fb21hcHVzYih4KTsKLQlpbnQJdmFsOwotCWludCB0aW1lb3V0ID0gUExMX0lETEVfVElNRTsKLQotCWlmIChzdXNwZW5kICYmICFwaHktPmlzX3N1c3BlbmRlZCkgewotCQl2YWwgPSBvbWFwX3VzYl9yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMik7Ci0JCXZhbCB8PSBQTExfSURMRTsKLQkJb21hcF91c2Jfd3JpdGVsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04yLCB2YWwpOwotCi0JCWRvIHsKLQkJCXZhbCA9IG9tYXBfdXNiX3JlYWRsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX1NUQVRVUyk7Ci0JCQlpZiAodmFsICYgUExMX1RJQ09QV0ROKQotCQkJCWJyZWFrOwotCQkJdWRlbGF5KDEpOwotCQl9IHdoaWxlICgtLXRpbWVvdXQpOwotCi0JCW9tYXBfY29udHJvbF91c2JfcGh5X3Bvd2VyKHBoeS0+Y29udHJvbF9kZXYsIDApOwotCi0JCXBoeS0+aXNfc3VzcGVuZGVkCT0gMTsKLQl9IGVsc2UgaWYgKCFzdXNwZW5kICYmIHBoeS0+aXNfc3VzcGVuZGVkKSB7Ci0JCXBoeS0+aXNfc3VzcGVuZGVkCT0gMDsKLQotCQl2YWwgPSBvbWFwX3VzYl9yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMik7Ci0JCXZhbCAmPSB+UExMX0lETEU7Ci0JCW9tYXBfdXNiX3dyaXRlbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMiwgdmFsKTsKLQotCQlkbyB7Ci0JCQl2YWwgPSBvbWFwX3VzYl9yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9TVEFUVVMpOwotCQkJaWYgKCEodmFsICYgUExMX1RJQ09QV0ROKSkKLQkJCQlicmVhazsKLQkJCXVkZWxheSgxKTsKLQkJfSB3aGlsZSAoLS10aW1lb3V0KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgb21hcF91c2JfZHBsbF9yZWxvY2soc3RydWN0IG9tYXBfdXNiICpwaHkpCi17Ci0JdTMyCQl2YWw7Ci0JdW5zaWduZWQgbG9uZwl0aW1lb3V0OwotCi0Jb21hcF91c2Jfd3JpdGVsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0dPLCBTRVRfUExMX0dPKTsKLQotCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMCk7Ci0JZG8gewotCQl2YWwgPSBvbWFwX3VzYl9yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9TVEFUVVMpOwotCQlpZiAodmFsICYgUExMX0xPQ0spCi0JCQlicmVhazsKLQl9IHdoaWxlICghV0FSTl9PTih0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSk7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcF91c2JfZHBsbF9sb2NrKHN0cnVjdCBvbWFwX3VzYiAqcGh5KQotewotCXUzMgkJCXZhbDsKLQl1bnNpZ25lZCBsb25nCQlyYXRlOwotCXN0cnVjdCB1c2JfZHBsbF9wYXJhbXMgKmRwbGxfcGFyYW1zOwotCi0JcmF0ZSA9IGNsa19nZXRfcmF0ZShwaHktPnN5c19jbGspOwotCWRwbGxfcGFyYW1zID0gb21hcF91c2IzX2dldF9kcGxsX3BhcmFtcyhyYXRlKTsKLQlpZiAoIWRwbGxfcGFyYW1zKSB7Ci0JCWRldl9lcnIocGh5LT5kZXYsCi0JCQkgICJObyBEUExMIGNvbmZpZ3VyYXRpb24gZm9yICVsdSBIeiBTWVMgQ0xLXG4iLCByYXRlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JdmFsID0gb21hcF91c2JfcmVhZGwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjEpOwotCXZhbCAmPSB+UExMX1JFR05fTUFTSzsKLQl2YWwgfD0gZHBsbF9wYXJhbXMtPm4gPDwgUExMX1JFR05fU0hJRlQ7Ci0Jb21hcF91c2Jfd3JpdGVsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04xLCB2YWwpOwotCi0JdmFsID0gb21hcF91c2JfcmVhZGwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjIpOwotCXZhbCAmPSB+UExMX1NFTEZSRVFEQ09fTUFTSzsKLQl2YWwgfD0gZHBsbF9wYXJhbXMtPmZyZXEgPDwgUExMX1NFTEZSRVFEQ09fU0hJRlQ7Ci0Jb21hcF91c2Jfd3JpdGVsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04yLCB2YWwpOwotCi0JdmFsID0gb21hcF91c2JfcmVhZGwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjEpOwotCXZhbCAmPSB+UExMX1JFR01fTUFTSzsKLQl2YWwgfD0gZHBsbF9wYXJhbXMtPm0gPDwgUExMX1JFR01fU0hJRlQ7Ci0Jb21hcF91c2Jfd3JpdGVsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04xLCB2YWwpOwotCi0JdmFsID0gb21hcF91c2JfcmVhZGwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjQpOwotCXZhbCAmPSB+UExMX1JFR01fRl9NQVNLOwotCXZhbCB8PSBkcGxsX3BhcmFtcy0+bWYgPDwgUExMX1JFR01fRl9TSElGVDsKLQlvbWFwX3VzYl93cml0ZWwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjQsIHZhbCk7Ci0KLQl2YWwgPSBvbWFwX3VzYl9yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMyk7Ci0JdmFsICY9IH5QTExfU0RfTUFTSzsKLQl2YWwgfD0gZHBsbF9wYXJhbXMtPnNkIDw8IFBMTF9TRF9TSElGVDsKLQlvbWFwX3VzYl93cml0ZWwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjMsIHZhbCk7Ci0KLQlvbWFwX3VzYl9kcGxsX3JlbG9jayhwaHkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcF91c2IzX2luaXQoc3RydWN0IHVzYl9waHkgKngpCi17Ci0Jc3RydWN0IG9tYXBfdXNiCSpwaHkgPSBwaHlfdG9fb21hcHVzYih4KTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gb21hcF91c2JfZHBsbF9sb2NrKHBoeSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCW9tYXBfY29udHJvbF91c2JfcGh5X3Bvd2VyKHBoeS0+Y29udHJvbF9kZXYsIDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcF91c2IzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG9tYXBfdXNiICpwaHk7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpjb250cm9sX25vZGU7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY29udHJvbF9wZGV2OwotCi0JaWYgKCFub2RlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBoeSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBoeSksIEdGUF9LRVJORUwpOwotCWlmICghcGh5KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBhbGxvYyBtZW0gZm9yIE9NQVAgVVNCMyBQSFlcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAicGxsX2N0cmwiKTsKLQlwaHktPnBsbF9jdHJsX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKLQlpZiAoSVNfRVJSKHBoeS0+cGxsX2N0cmxfYmFzZSkpCi0JCXJldHVybiBQVFJfRVJSKHBoeS0+cGxsX2N0cmxfYmFzZSk7Ci0KLQlwaHktPmRldgkJPSAmcGRldi0+ZGV2OwotCi0JcGh5LT5waHkuZGV2CQk9IHBoeS0+ZGV2OwotCXBoeS0+cGh5LmxhYmVsCQk9ICJvbWFwLXVzYjMiOwotCXBoeS0+cGh5LmluaXQJCT0gb21hcF91c2IzX2luaXQ7Ci0JcGh5LT5waHkuc2V0X3N1c3BlbmQJPSBvbWFwX3VzYjNfc3VzcGVuZDsKLQlwaHktPnBoeS50eXBlCQk9IFVTQl9QSFlfVFlQRV9VU0IzOwotCi0JcGh5LT5pc19zdXNwZW5kZWQJPSAxOwotCXBoeS0+d2t1cGNsayA9IGRldm1fY2xrX2dldChwaHktPmRldiwgInVzYl9waHlfY21fY2xrMzJrIik7Ci0JaWYgKElTX0VSUihwaHktPndrdXBjbGspKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgdXNiX3BoeV9jbV9jbGszMmtcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihwaHktPndrdXBjbGspOwotCX0KLQljbGtfcHJlcGFyZShwaHktPndrdXBjbGspOwotCi0JcGh5LT5vcHRjbGsgPSBkZXZtX2Nsa19nZXQocGh5LT5kZXYsICJ1c2Jfb3RnX3NzX3JlZmNsazk2MG0iKTsKLQlpZiAoSVNfRVJSKHBoeS0+b3B0Y2xrKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gZ2V0IHVzYl9vdGdfc3NfcmVmY2xrOTYwbVxuIik7Ci0JCXJldHVybiBQVFJfRVJSKHBoeS0+b3B0Y2xrKTsKLQl9Ci0JY2xrX3ByZXBhcmUocGh5LT5vcHRjbGspOwotCi0JcGh5LT5zeXNfY2xrID0gZGV2bV9jbGtfZ2V0KHBoeS0+ZGV2LCAic3lzX2Nsa2luIik7Ci0JaWYgKElTX0VSUihwaHktPnN5c19jbGspKSB7Ci0JCXByX2VycigiJXM6IHVuYWJsZSB0byBnZXQgc3lzX2Nsa2luXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNvbnRyb2xfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobm9kZSwgImN0cmwtbW9kdWxlIiwgMCk7Ci0JaWYgKCFjb250cm9sX25vZGUpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBjb250cm9sIGRldmljZSBwaGFuZGxlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWNvbnRyb2xfcGRldiA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUoY29udHJvbF9ub2RlKTsKLQlpZiAoIWNvbnRyb2xfcGRldikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGNvbnRyb2wgZGV2aWNlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcGh5LT5jb250cm9sX2RldiA9ICZjb250cm9sX3BkZXYtPmRldjsKLQotCW9tYXBfY29udHJvbF91c2JfcGh5X3Bvd2VyKHBoeS0+Y29udHJvbF9kZXYsIDApOwotCXVzYl9hZGRfcGh5X2RldigmcGh5LT5waHkpOwotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGh5KTsKLQotCXBtX3J1bnRpbWVfZW5hYmxlKHBoeS0+ZGV2KTsKLQlwbV9ydW50aW1lX2dldCgmcGRldi0+ZGV2KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9tYXBfdXNiM19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgb21hcF91c2IgKnBoeSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JY2xrX3VucHJlcGFyZShwaHktPndrdXBjbGspOwotCWNsa191bnByZXBhcmUocGh5LT5vcHRjbGspOwotCXVzYl9yZW1vdmVfcGh5KCZwaHktPnBoeSk7Ci0JaWYgKCFwbV9ydW50aW1lX3N1c3BlbmRlZCgmcGRldi0+ZGV2KSkKLQkJcG1fcnVudGltZV9wdXQoJnBkZXYtPmRldik7Ci0JcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQotCi1zdGF0aWMgaW50IG9tYXBfdXNiM19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3Qgb21hcF91c2IJKnBoeSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JY2xrX2Rpc2FibGUocGh5LT53a3VwY2xrKTsKLQljbGtfZGlzYWJsZShwaHktPm9wdGNsayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvbWFwX3VzYjNfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXUzMiByZXQgPSAwOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3Qgb21hcF91c2IJKnBoeSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JcmV0ID0gY2xrX2VuYWJsZShwaHktPm9wdGNsayk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKHBoeS0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBvcHRjbGsgJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyMTsKLQl9Ci0KLQlyZXQgPSBjbGtfZW5hYmxlKHBoeS0+d2t1cGNsayk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKHBoeS0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSB3a3VwY2xrICVkXG4iLCByZXQpOwotCQlnb3RvIGVycjI7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycjI6Ci0JY2xrX2Rpc2FibGUocGh5LT5vcHRjbGspOwotCi1lcnIxOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBvbWFwX3VzYjNfcG1fb3BzID0gewotCVNFVF9SVU5USU1FX1BNX09QUyhvbWFwX3VzYjNfcnVudGltZV9zdXNwZW5kLCBvbWFwX3VzYjNfcnVudGltZV9yZXN1bWUsCi0JCU5VTEwpCi19OwotCi0jZGVmaW5lIERFVl9QTV9PUFMgICAgICgmb21hcF91c2IzX3BtX29wcykKLSNlbHNlCi0jZGVmaW5lIERFVl9QTV9PUFMgICAgIE5VTEwKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX09GCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvbWFwX3VzYjNfaWRfdGFibGVbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInRpLG9tYXAtdXNiMyIgfSwKLQl7fQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9tYXBfdXNiM19pZF90YWJsZSk7Ci0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcF91c2IzX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gb21hcF91c2IzX3Byb2JlLAotCS5yZW1vdmUJCT0gb21hcF91c2IzX3JlbW92ZSwKLQkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSAib21hcC11c2IzIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JCS5wbQk9IERFVl9QTV9PUFMsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihvbWFwX3VzYjNfaWRfdGFibGUpLAotCX0sCi19OwotCi1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG9tYXBfdXNiM19kcml2ZXIpOwotCi1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOiBvbWFwX3VzYjMiKTsKLU1PRFVMRV9BVVRIT1IoIlRleGFzIEluc3RydW1lbnRzIEluYy4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiT01BUCBVU0IzIHBoeSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9waHktcmNhci1nZW4yLXVzYi5jIGIvZHJpdmVycy91c2IvcGh5L3BoeS1yY2FyLWdlbjItdXNiLmMKaW5kZXggNTUxZTBhNi4uMzg4ZDg5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcGh5L3BoeS1yY2FyLWdlbjItdXNiLmMKKysrIGIvZHJpdmVycy91c2IvcGh5L3BoeS1yY2FyLWdlbjItdXNiLmMKQEAgLTE3NywxNSArMTc3LDE1IEBACiAJc3RydWN0IGNsayAqY2xrOwogCWludCByZXR2YWw7CiAKLQlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7CiAJaWYgKCFwZGF0YSkgewogCQlkZXZfZXJyKGRldiwgIk5vIHBsYXRmb3JtIGRhdGFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQljbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInVzYmhzIik7CisJY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgInVzYmhzIik7CiAJaWYgKElTX0VSUihjbGspKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCB0aGUgY2xvY2tcbiIpOworCQlkZXZfZXJyKGRldiwgIkNhbid0IGdldCB0aGUgY2xvY2tcbiIpOwogCQlyZXR1cm4gUFRSX0VSUihjbGspOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcGh5L3BoeS10d2w2MDMwLXVzYi5jIGIvZHJpdmVycy91c2IvcGh5L3BoeS10d2w2MDMwLXVzYi5jCmluZGV4IDIxNDE3MmIuLjA0Nzc4Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHktdHdsNjAzMC11c2IuYworKysgYi9kcml2ZXJzL3VzYi9waHkvcGh5LXR3bDYwMzAtdXNiLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9tdXNiLW9tYXAuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvcGh5X2NvbXBhbmlvbi5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9vbWFwX3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9vbWFwX3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9waHktdWxwaS5jIGIvZHJpdmVycy91c2IvcGh5L3BoeS11bHBpLmMKaW5kZXggMjE3MzM5ZC4uMTdlYTNmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcGh5L3BoeS11bHBpLmMKKysrIGIvZHJpdmVycy91c2IvcGh5L3BoeS11bHBpLmMKQEAgLTQ3LDYgKzQ3LDggQEAKIHN0YXRpYyBzdHJ1Y3QgdWxwaV9pbmZvIHVscGlfaWRzW10gPSB7CiAJVUxQSV9JTkZPKFVMUElfSUQoMHgwNGNjLCAweDE1MDQpLCAiTlhQIElTUDE1MDQiKSwKIAlVTFBJX0lORk8oVUxQSV9JRCgweDA0MjQsIDB4MDAwNiksICJTTVNDIFVTQjMzMXgiKSwKKwlVTFBJX0lORk8oVUxQSV9JRCgweDA0MjQsIDB4MDAwNyksICJTTVNDIFVTQjMzMjAiKSwKKwlVTFBJX0lORk8oVUxQSV9JRCgweDA0NTEsIDB4MTUwNyksICJUSSBUVVNCMTIxMCIpLAogfTsKIAogc3RhdGljIGludCB1bHBpX3NldF9vdGdfZmxhZ3Moc3RydWN0IHVzYl9waHkgKnBoeSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jaDM0MS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NoMzQxLmMKaW5kZXggODIzNzFmNi4uMmQ3MmFhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2NoMzQxLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NoMzQxLmMKQEAgLTMyMywxMSArMzIzLDExIEBACiAJaWYgKHIpCiAJCWdvdG8gb3V0OwogCi0JZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBzdWJtaXR0aW5nIGludGVycnVwdCB1cmIiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBzdWJtaXR0aW5nIGludGVycnVwdCB1cmJcbiIsIF9fZnVuY19fKTsKIAlyID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHIpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiLCIKLQkJCSIgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgdG8gc3VibWl0IGludGVycnVwdCB1cmI6ICVkXG4iLAorCQkJX19mdW5jX18sIHIpOwogCQljaDM0MV9jbG9zZShwb3J0KTsKIAkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2N5YmVyamFjay5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5YmVyamFjay5jCmluZGV4IDBhYzNiM2IuLjI5MTZkZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeWJlcmphY2suYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3liZXJqYWNrLmMKQEAgLTIyMCw3ICsyMjAsNyBAQAogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAocmVzdWx0KSB7CiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsCi0JCQkJIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsCisJCQkJIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZFxuIiwKIAkJCQlfX2Z1bmNfXywgcmVzdWx0KTsKIAkJCS8qIFRocm93IGF3YXkgZGF0YS4gTm8gYmV0dGVyIGlkZWEgd2hhdCB0byBkbyB3aXRoIGl0LiAqLwogCQkJcHJpdi0+d3JmaWxsZWQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMKaW5kZXggYmNjYjEyMjMuLjAxYmY1MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYwpAQCAtMjc5LDcgKzI3OSw3IEBACiAJCQkgKiB0aGUgZ2VuZXJpYyBmaXJtd2FyZSwgYnV0IGFyZSBub3QgdXNlZCB3aXRoCiAJCQkgKiBOTUVBIGFuZCBTaVJGIHByb3RvY29scyAqLwogCQkJZGV2X2RiZygmcG9ydC0+ZGV2LAotCQkJCSIlcyAtIGZhaWxlZCBzZXR0aW5nIGJhdWQgcmF0ZSwgdW5zdXBwb3J0ZWQgc3BlZWQgb2YgJWQgb24gRWFydGhtYXRlIEdQUyIsCisJCQkJIiVzIC0gZmFpbGVkIHNldHRpbmcgYmF1ZCByYXRlLCB1bnN1cHBvcnRlZCBzcGVlZCBvZiAlZCBvbiBFYXJ0aG1hdGUgR1BTXG4iLAogCQkJCV9fZnVuY19fLCBuZXdfcmF0ZSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KQEAgLTEyMjQsNyArMTIyNCw2IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgY3lwcmVzc19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ1cmItPmRldi0+ZGV2OwotCWludCByZXN1bHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCiAJc3dpdGNoIChzdGF0dXMpIHsKQEAgLTEyMzksMjEgKzEyMzgsOSBAQAogCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCXByaXYtPndyaXRlX3VyYl9pbl91c2UgPSAwOwogCQlyZXR1cm47Ci0JY2FzZSAtRVBJUEU6IC8qIG5vIGJyZWFrIG5lZWRlZDsgY2xlYXIgaGFsdCBhbmQgcmVzdWJtaXQgKi8KLQkJaWYgKCFwcml2LT5jb21tX2lzX29rKQotCQkJYnJlYWs7Ci0JCXVzYl9jbGVhcl9oYWx0KHBvcnQtPnNlcmlhbC0+ZGV2LCAweDAyKTsKLQkJLyogZXJyb3IgaW4gdGhlIHVyYiwgc28gd2UgaGF2ZSB0byByZXN1Ym1pdCBpdCAqLwotCQlkZXZfZGJnKGRldiwgIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCi0JCQlfX2Z1bmNfXywgc3RhdHVzKTsKLQkJcG9ydC0+aW50ZXJydXB0X291dF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAxOwotCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfb3V0X3VyYiwgR0ZQX0FUT01JQyk7Ci0JCWlmICghcmVzdWx0KQotCQkJcmV0dXJuOwotCQlkZXZfZXJyKGRldiwgIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkXG4iLAotCQkJX19mdW5jX18sIHJlc3VsdCk7Ci0JCWN5cHJlc3Nfc2V0X2RlYWQocG9ydCk7Ci0JCWJyZWFrOworCWNhc2UgLUVQSVBFOgorCQkvKiBDYW5ub3QgY2FsbCB1c2JfY2xlYXJfaGFsdCB3aGlsZSBpbl9pbnRlcnJ1cHQgKi8KKwkJLyogRkFMTFRIUk9VR0ggKi8KIAlkZWZhdWx0OgogCQlkZXZfZXJyKGRldiwgIiVzIC0gdW5leHBlY3RlZCBub256ZXJvIHdyaXRlIHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCiAJCQlfX2Z1bmNfXywgc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nZW5lcmljLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZ2VuZXJpYy5jCmluZGV4IGI2M2NlMDIuLjFiZDE5MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nZW5lcmljLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dlbmVyaWMuYwpAQCAtMzMyLDkgKzMzMiw5IEBACiAJICogc3R1ZmYgbGlrZSAzRyBtb2RlbXMsIHNvIHNob3J0Y2lyY3VpdCBpdCBpbiB0aGUgOTkuOTk5OTk5OSUgb2YKIAkgKiBjYXNlcyB3aGVyZSB0aGUgVVNCIHNlcmlhbCBpcyBub3QgYSBjb25zb2xlIGFueXdheS4KIAkgKi8KLQlpZiAoIXBvcnQtPnBvcnQuY29uc29sZSB8fCAhcG9ydC0+c3lzcnEpCisJaWYgKCFwb3J0LT5wb3J0LmNvbnNvbGUgfHwgIXBvcnQtPnN5c3JxKSB7CiAJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcoJnBvcnQtPnBvcnQsIGNoLCB1cmItPmFjdHVhbF9sZW5ndGgpOwotCWVsc2UgeworCX0gZWxzZSB7CiAJCWZvciAoaSA9IDA7IGkgPCB1cmItPmFjdHVhbF9sZW5ndGg7IGkrKywgY2grKykgewogCQkJaWYgKCF1c2Jfc2VyaWFsX2hhbmRsZV9zeXNycV9jaGFyKHBvcnQsICpjaCkpCiAJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIoJnBvcnQtPnBvcnQsICpjaCwgVFRZX05PUk1BTCk7CkBAIC0zNTksMjQgKzM1OSwzOCBAQAogCiAJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSB1cmIgJWQsIGxlbiAlZFxuIiwgX19mdW5jX18sIGksCiAJCQkJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQotCWlmICh1cmItPnN0YXR1cykgewotCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIG5vbi16ZXJvIHVyYiBzdGF0dXM6ICVkXG4iLAotCQkJX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FU0hVVERPV046CisJCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gdXJiIHN0b3BwZWQ6ICVkXG4iLAorCQkJCQkJCV9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAJCXJldHVybjsKKwljYXNlIC1FUElQRToKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSB1cmIgc3RvcHBlZDogJWRcbiIsCisJCQkJCQkJX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzOiAlZFxuIiwKKwkJCQkJCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQlnb3RvIHJlc3VibWl0OwogCX0KIAogCXVzYl9zZXJpYWxfZGVidWdfZGF0YSgmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAlwb3J0LT5zZXJpYWwtPnR5cGUtPnByb2Nlc3NfcmVhZF91cmIodXJiKTsKIAorcmVzdWJtaXQ6CiAJLyogVGhyb3R0bGUgdGhlIGRldmljZSBpZiByZXF1ZXN0ZWQgYnkgdHR5ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAlwb3J0LT50aHJvdHRsZWQgPSBwb3J0LT50aHJvdHRsZV9yZXE7CiAJaWYgKCFwb3J0LT50aHJvdHRsZWQpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCQl1c2Jfc2VyaWFsX2dlbmVyaWNfc3VibWl0X3JlYWRfdXJiKHBvcnQsIGksIEdGUF9BVE9NSUMpOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwl9CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2Jfc2VyaWFsX2dlbmVyaWNfcmVhZF9idWxrX2NhbGxiYWNrKTsKIApAQCAtMzg0LDI5ICszOTgsMzggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7Ci0JaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG9ydC0+d3JpdGVfdXJicyk7ICsraSkKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwb3J0LT53cml0ZV91cmJzKTsgKytpKSB7CiAJCWlmIChwb3J0LT53cml0ZV91cmJzW2ldID09IHVyYikKIAkJCWJyZWFrOwotCisJfQogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAJcG9ydC0+dHhfYnl0ZXMgLT0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOwogCXNldF9iaXQoaSwgJnBvcnQtPndyaXRlX3VyYnNfZnJlZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKHN0YXR1cykgewotCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIG5vbi16ZXJvIHVyYiBzdGF0dXM6ICVkXG4iLAotCQkJX19mdW5jX18sIHN0YXR1cyk7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJa2ZpZm9fcmVzZXRfb3V0KCZwb3J0LT53cml0ZV9maWZvKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCX0gZWxzZSB7Ci0JCXVzYl9zZXJpYWxfZ2VuZXJpY193cml0ZV9zdGFydChwb3J0LCBHRlBfQVRPTUlDKTsKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FU0hVVERPV046CisJCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gdXJiIHN0b3BwZWQ6ICVkXG4iLAorCQkJCQkJCV9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJCXJldHVybjsKKwljYXNlIC1FUElQRToKKwkJZGV2X2Vycl9jb25zb2xlKHBvcnQsICIlcyAtIHVyYiBzdG9wcGVkOiAlZFxuIiwKKwkJCQkJCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJZGV2X2Vycl9jb25zb2xlKHBvcnQsICIlcyAtIG5vbnplcm8gdXJiIHN0YXR1czogJWRcbiIsCisJCQkJCQkJX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJZ290byByZXN1Ym1pdDsKIAl9CiAKK3Jlc3VibWl0OgorCXVzYl9zZXJpYWxfZ2VuZXJpY193cml0ZV9zdGFydChwb3J0LCBHRlBfQVRPTUlDKTsKIAl1c2Jfc2VyaWFsX3BvcnRfc29mdGludChwb3J0KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9zZXJpYWxfZ2VuZXJpY193cml0ZV9idWxrX2NhbGxiYWNrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pdXVfcGhvZW5peC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKaW5kZXggZDAwZGFlMS4uNWFkNGEwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKQEAgLTExNTEsNyArMTE1MSw3IEBACiAJCWdvdG8gZmFpbF9zdG9yZV92Y2NfbW9kZTsKIAl9CiAKLQlkZXZfZGJnKGRldiwgIiVzOiBzZXR0aW5nIHZjY19tb2RlID0gJWxkIiwgX19mdW5jX18sIHYpOworCWRldl9kYmcoZGV2LCAiJXM6IHNldHRpbmcgdmNjX21vZGUgPSAlbGRcbiIsIF9fZnVuY19fLCB2KTsKIAogCWlmICgodiAhPSAzKSAmJiAodiAhPSA1KSkgewogCQlkZXZfZXJyKGRldiwgIiVzIC0gdmNjX21vZGUgJWxkIGlzIGludmFsaWRcbiIsIF9fZnVuY19fLCB2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5jCmluZGV4IDI2NWM2NzcuLmQzYWNhZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uYwpAQCAtMzk3LDE3ICszOTcsNiBAQAogCiAJbXNnID0gKHN0cnVjdCBrZXlzcGFuX3VzYTI2X3BvcnRTdGF0dXNNZXNzYWdlICopZGF0YTsKIAotI2lmIDAKLQlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LAotCQkiJXMgLSBwb3J0IHN0YXR1czogcG9ydCAlZCBjdHMgJWQgZGNkICVkIGRzciAlZCByaSAlZCB0b2ZmICVkIHR4b2ZmICVkIHJ4ZW4gJWQgY3IgJWQiLAotCQlfX2Z1bmNfXywgbXNnLT5wb3J0LCBtc2ctPmhza2lhX2N0cywgbXNnLT5ncGlhX2RjZCwgbXNnLT5kc3IsCi0JCW1zZy0+cmksIG1zZy0+X3R4T2ZmLCBtc2ctPl90eFhvZmYsIG1zZy0+cnhFbmFibGVkLAotCQltc2ctPmNvbnRyb2xSZXNwb25zZSk7Ci0jZW5kaWYKLQotCS8qIE5vdyBkbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggdGhlIGRhdGEgKi8KLQotCiAJLyogQ2hlY2sgcG9ydCBudW1iZXIgZnJvbSBtZXNzYWdlIGFuZCByZXRyaWV2ZSBwcml2YXRlIGRhdGEgKi8KIAlpZiAobXNnLT5wb3J0ID49IHNlcmlhbC0+bnVtX3BvcnRzKSB7CiAJCWRldl9kYmcoJnVyYi0+ZGV2LT5kZXYsICIlcyAtIFVuZXhwZWN0ZWQgcG9ydCBudW1iZXIgJWRcbiIsIF9fZnVuY19fLCBtc2ctPnBvcnQpOwpAQCAtNTIzLDkgKzUxMiw2IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQkvKmRldl9kYmcoJnVyYi0+ZGV2LT5kZXYsICIlcyAlMTJwaCIsIF9fZnVuY19fLCBkYXRhKTsqLwotCi0JLyogTm93IGRvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCB0aGUgZGF0YSAqLwogCW1zZyA9IChzdHJ1Y3Qga2V5c3Bhbl91c2EyOF9wb3J0U3RhdHVzTWVzc2FnZSAqKWRhdGE7CiAKIAkvKiBDaGVjayBwb3J0IG51bWJlciBmcm9tIG1lc3NhZ2UgYW5kIHJldHJpZXZlIHByaXZhdGUgZGF0YSAqLwpAQCAtNjA1LDkgKzU5MSw2IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQkvKmRldl9kYmcoJnVyYi0+ZGV2LT5kZXYsICIlczogJTExcGgiLCBfX2Z1bmNfXywgZGF0YSk7Ki8KLQotCS8qIE5vdyBkbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggdGhlIGRhdGEgKi8KIAltc2cgPSAoc3RydWN0IGtleXNwYW5fdXNhNDlfcG9ydFN0YXR1c01lc3NhZ2UgKilkYXRhOwogCiAJLyogQ2hlY2sgcG9ydCBudW1iZXIgZnJvbSBtZXNzYWdlIGFuZCByZXRyaWV2ZSBwcml2YXRlIGRhdGEgKi8KQEAgLTE3OTMsMTIgKzE3NzYsNiBAQAogCWVyciA9IHVzYl9zdWJtaXRfdXJiKHRoaXNfdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoZXJyICE9IDApCiAJCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gdXNiX3N1Ym1pdF91cmIoc2V0dXApIGZhaWxlZFxuIiwgX19mdW5jX18pOwotI2lmIDAKLQllbHNlIHsKLQkJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSB1c2Jfc3VibWl0X3VyYihzZXR1cCkgT0sgJWQgYnl0ZXNcbiIsIF9fZnVuY19fLAotCQkgICAgdGhpc191cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOwotCX0KLSNlbmRpZgogCiAJcmV0dXJuIDA7CiB9CkBAIC0xOTc2LDEzICsxOTUzLDYgQEAKIAllcnIgPSB1c2Jfc3VibWl0X3VyYih0aGlzX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKGVyciAhPSAwKQogCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIHVzYl9zdWJtaXRfdXJiKHNldHVwKSBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIGVycik7Ci0jaWYgMAotCWVsc2UgewotCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIHVzYl9zdWJtaXRfdXJiKCVkKSBPSyAlZCBieXRlcyAoZW5kICVkKVxuIiwgX19mdW5jX18sCi0JCQlvdXRjb250X3VyYiwgdGhpc191cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCi0JCQl1c2JfcGlwZWVuZHBvaW50KHRoaXNfdXJiLT5waXBlKSk7Ci0JfQotI2VuZGlmCiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuX3BkYS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKaW5kZXggZTk3MjQxMi4uNzQyZDgyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKQEAgLTE4OSw3ICsxODksNyBAQAogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldHZhbCkKIAkJZGV2X2VycigmcG9ydC0+ZGV2LAotCQkJIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKKwkJCSIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZFxuIiwKIAkJCV9fZnVuY19fLCByZXR2YWwpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tsNWt1c2IxMDUuYwppbmRleCBjODhjYzQ5Li5kNzQ0MGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rbDVrdXNiMTA1LmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCWVsc2UgewogCQlzdGF0dXMgPSBnZXRfdW5hbGlnbmVkX2xlMTYoc3RhdHVzX2J1Zik7CiAKLQkJZGV2X2luZm8oJnBvcnQtPnNlcmlhbC0+ZGV2LT5kZXYsICJyZWFkIHN0YXR1cyAleCAleCIsCisJCWRldl9pbmZvKCZwb3J0LT5zZXJpYWwtPmRldi0+ZGV2LCAicmVhZCBzdGF0dXMgJXggJXhcbiIsCiAJCQkgc3RhdHVzX2J1ZlswXSwgc3RhdHVzX2J1ZlsxXSk7CiAKIAkJKmxpbmVfc3RhdGVfcCA9IGtsc2lfMTA1X3N0YXR1czJsaW5lc3RhdGUoc3RhdHVzKTsKQEAgLTQ2NCw3ICs0NjQsNyBAQAogCQlwcml2LT5jZmcuYmF1ZHJhdGUgPSBrbDVrdXNiMTA1YV9zaW9fYjExNTIwMDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2RiZyhkZXYsICJLTFNJIFVTQi0+U2VyaWFsIGNvbnZlcnRlcjogdW5zdXBwb3J0ZWQgYmF1ZHJhdGUgcmVxdWVzdCwgdXNpbmcgZGVmYXVsdCBvZiA5NjAwIik7CisJCWRldl9kYmcoZGV2LCAidW5zdXBwb3J0ZWQgYmF1ZHJhdGUsIHVzaW5nIDk2MDBcbiIpOwogCQlwcml2LT5jZmcuYmF1ZHJhdGUgPSBrbDVrdXNiMTA1YV9zaW9fYjk2MDA7CiAJCWJhdWQgPSA5NjAwOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rb2JpbF9zY3QuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rb2JpbF9zY3QuYwppbmRleCA2MThjMWMxLi5mZWUyNDIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva29iaWxfc2N0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tvYmlsX3NjdC5jCkBAIC01NTcsNyArNTU3LDggQEAKIAkJCSk7CiAKIAkJZGV2X2RiZygmcG9ydC0+ZGV2LAotCQkJIiVzIC0gU2VuZCByZXNldF9hbGxfcXVldWVzIChGTFVTSCkgVVJCIHJldHVybnM6ICVpIiwgX19mdW5jX18sIHJlc3VsdCk7CisJCQkiJXMgLSBTZW5kIHJlc2V0X2FsbF9xdWV1ZXMgKEZMVVNIKSBVUkIgcmV0dXJuczogJWlcbiIsCisJCQlfX2Z1bmNfXywgcmVzdWx0KTsKIAkJa2ZyZWUodHJhbnNmZXJfYnVmZmVyKTsKIAkJcmV0dXJuIChyZXN1bHQgPCAwKSA/IC1FSU86IDA7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3NzIwLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzcyMC5jCmluZGV4IDRlYjI3NzIuLmRmZDcyOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3NzIwLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc3MjAuYwpAQCAtMjA5LDcgKzIwOSw3IEBACiAJCQkJICAgICBpbmRleCwgTlVMTCwgMCwgTU9TX1dEUl9USU1FT1VUKTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJZGV2X2VycigmdXNiZGV2LT5kZXYsCi0JCQkibW9zNzcyMDogdXNiX2NvbnRyb2xfbXNnKCkgZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisJCQkibW9zNzcyMDogdXNiX2NvbnRyb2xfbXNnKCkgZmFpbGVkOiAlZFxuIiwgc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0yNDAsNyArMjQwLDcgQEAKIAkJKmRhdGEgPSAqYnVmOwogCWVsc2UgaWYgKHN0YXR1cyA8IDApCiAJCWRldl9lcnIoJnVzYmRldi0+ZGV2LAotCQkJIm1vczc3MjA6IHVzYl9jb250cm9sX21zZygpIGZhaWxlZDogJWQiLCBzdGF0dXMpOworCQkJIm1vczc3MjA6IHVzYl9jb250cm9sX21zZygpIGZhaWxlZDogJWRcbiIsIHN0YXR1cyk7CiAJa2ZyZWUoYnVmKTsKIAogCXJldHVybiBzdGF0dXM7CkBAIC0zOTksNyArMzk5LDcgQEAKIAkJCSAgICAgICZtb3NfcGFycG9ydC0+ZGVmZXJyZWRfdXJicyk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1vc19wYXJwb3J0LT5saXN0bG9jaywgZmxhZ3MpOwogCQl0YXNrbGV0X3NjaGVkdWxlKCZtb3NfcGFycG9ydC0+dXJiX3Rhc2tsZXQpOwotCQlkZXZfZGJnKCZ1c2JkZXYtPmRldiwgInRhc2tsZXQgc2NoZWR1bGVkIik7CisJCWRldl9kYmcoJnVzYmRldi0+ZGV2LCAidGFza2xldCBzY2hlZHVsZWRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTQxOCw3ICs0MTgsNyBAQAogCW11dGV4X3VubG9jaygmc2VyaWFsLT5kaXNjX211dGV4KTsKIAlpZiAocmV0X3ZhbCkgewogCQlkZXZfZXJyKCZ1c2JkZXYtPmRldiwKLQkJCSIlczogc3VibWl0X3VyYigpIGZhaWxlZDogJWQiLCBfX2Z1bmNfXywgcmV0X3ZhbCk7CisJCQkiJXM6IHN1Ym1pdF91cmIoKSBmYWlsZWQ6ICVkXG4iLCBfX2Z1bmNfXywgcmV0X3ZhbCk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZtb3NfcGFycG9ydC0+bGlzdGxvY2ssIGZsYWdzKTsKIAkJbGlzdF9kZWwoJnVyYnRyYWNrLT51cmJsaXN0X2VudHJ5KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW9zX3BhcnBvcnQtPmxpc3Rsb2NrLCBmbGFncyk7CkBAIC02NTYsNyArNjU2LDcgQEAKIAlwYXJwb3J0X2VwaWxvZ3VlKHBwKTsKIAlpZiAocmV0dmFsKSB7CiAJCWRldl9lcnIoJm1vc19wYXJwb3J0LT5zZXJpYWwtPmRldi0+ZGV2LAotCQkJIm1vczc3MjA6IHVzYl9idWxrX21zZygpIGZhaWxlZDogJWQiLCByZXR2YWwpOworCQkJIm1vczc3MjA6IHVzYl9idWxrX21zZygpIGZhaWxlZDogJWRcbiIsIHJldHZhbCk7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gYWN0dWFsX2xlbjsKQEAgLTg3NSw3ICs4NzUsNyBAQAogCWlmICghKGlpciAmIDB4MDEpKSB7CS8qIHNlcmlhbCBwb3J0IGludGVycnVwdCBwZW5kaW5nICovCiAJCXN3aXRjaCAoaWlyICYgMHgwZikgewogCQljYXNlIFNFUklBTF9JSVJfUkxTOgotCQkJZGV2X2RiZyhkZXYsICJTZXJpYWwgUG9ydDogUmVjZWl2ZXIgc3RhdHVzIGVycm9yIG9yIGFkZHJlc3MgYml0IGRldGVjdGVkIGluIDktYml0IG1vZGVcblxuIik7CisJCQlkZXZfZGJnKGRldiwgIlNlcmlhbCBQb3J0OiBSZWNlaXZlciBzdGF0dXMgZXJyb3Igb3IgYWRkcmVzcyBiaXQgZGV0ZWN0ZWQgaW4gOS1iaXQgbW9kZVxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBTRVJJQUxfSUlSX0NUSToKIAkJCWRldl9kYmcoZGV2LCAiU2VyaWFsIFBvcnQ6IFJlY2VpdmVyIHRpbWUgb3V0XG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCmluZGV4IGU5ZDk2N2YuLjM5M2JlNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYwpAQCAtNTIyLDExICs1MjIsMTEgQEAKIAljYXNlIC1FTk9FTlQ6CiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiBUaGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwotCQlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAorCQlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSB1cmIgc2h1dHRpbmcgZG93bjogJWRcbiIsCiAJCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJZGV2X2RiZygmdXJiLT5kZXYtPmRldiwgIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzOiAlZFxuIiwKIAkJCV9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3F1YXRlY2gyLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcXVhdGVjaDIuYwppbmRleCA3NzI1ZWQyLi41MDRmNWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvcXVhdGVjaDIuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcXVhdGVjaDIuYwpAQCAtMzcyLDcgKzM3Miw3IEBACiAJCQkJIGRldmljZV9wb3J0LCBkYXRhLCAyLCBRVDJfVVNCX1RJTUVPVVQpOwogCiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvcGVuIHBvcnQgZmFpbGVkICVpIiwgX19mdW5jX18sCisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gb3BlbiBwb3J0IGZhaWxlZCAlaVxuIiwgX19mdW5jX18sCiAJCQlzdGF0dXMpOwogCQlrZnJlZShkYXRhKTsKIAkJcmV0dXJuIHN0YXR1czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9zcGNwOHg1LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc3BjcDh4NS5jCmluZGV4IDRlYzA0ZjcuLmVmMGRiZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9zcGNwOHg1LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NwY3A4eDUuYwpAQCAtMjIwLDkgKzIyMCw5IEBACiAJCQkgICAgICBHRVRfVUFSVF9TVEFUVVMsIEdFVF9VQVJUX1NUQVRVU19UWVBFLAogCQkJICAgICAgMCwgR0VUX1VBUlRfU1RBVFVTX01TUiwgYnVmLCAxLCAxMDApOwogCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1vZGVtIHN0YXR1czogJWQiLCByZXQpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1vZGVtIHN0YXR1czogJWRcbiIsIHJldCk7CiAKLQlkZXZfZGJnKCZwb3J0LT5kZXYsICIweGMwOjB4MjI6MDo2ICAlZCAtIDB4MDIleCIsIHJldCwgKmJ1Zik7CisJZGV2X2RiZygmcG9ydC0+ZGV2LCAiMHhjMDoweDIyOjA6NiAgJWQgLSAweDAyJXhcbiIsIHJldCwgKmJ1Zik7CiAJKnN0YXR1cyA9ICpidWY7CiAJa2ZyZWUoYnVmKTsKIApAQCAtMzQyLDggKzM0Miw3IEBACiAJY2FzZSAxMDAwMDAwOgogCQkJYnVmWzBdID0gMHgwYjsJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAic3BjcDgyNSBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgIgotCQkJImJhdWRyYXRlIHJlcXVlc3RlZCwgdXNpbmcgZGVmYXVsdCBvZiA5NjAwLlxuIik7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgInVuc3VwcG9ydGVkIGJhdWRyYXRlLCB1c2luZyA5NjAwXG4iKTsKIAl9CiAKIAkvKiBTZXQgRGF0YSBMZW5ndGggOiAwMDo1Yml0LCAwMTo2Yml0LCAxMDo3Yml0LCAxMTo4Yml0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvc3ltYm9sc2VyaWFsLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc3ltYm9sc2VyaWFsLmMKaW5kZXggOWZhN2RkNC4uOGZjZWVjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3N5bWJvbHNlcmlhbC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zeW1ib2xzZXJpYWwuYwpAQCAtNzQsOSArNzQsNyBAQAogCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKCZwb3J0LT5wb3J0LCAmZGF0YVsxXSwgZGF0YV9sZW5ndGgpOwogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCgmcG9ydC0+cG9ydCk7CiAJfSBlbHNlIHsKLQkJZGV2X2RiZygmcG9ydC0+ZGV2LAotCQkJIkltcHJvcGVyIGFtb3VudCBvZiBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZSwgIgotCQkJIiVkIGJ5dGVzIiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBzaG9ydCBwYWNrZXRcbiIsIF9fZnVuY19fKTsKIAl9CiAKIGV4aXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYwppbmRleCBlYzdjZWE1Li4zZGQzZmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMKQEAgLTI5Myw3ICsyOTMsNyBAQAogCWludCBzdGF0dXM7CiAKIAlkZXZfZGJnKCZkZXYtPmRldiwKLQkJIiVzIC0gcHJvZHVjdCAweCU0WCwgbnVtIGNvbmZpZ3VyYXRpb25zICVkLCBjb25maWd1cmF0aW9uIHZhbHVlICVkIiwKKwkJIiVzIC0gcHJvZHVjdCAweCU0WCwgbnVtIGNvbmZpZ3VyYXRpb25zICVkLCBjb25maWd1cmF0aW9uIHZhbHVlICVkXG4iLAogCQlfX2Z1bmNfXywgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCksCiAJCWRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMsCiAJCWRldi0+YWN0Y29uZmlnLT5kZXNjLmJDb25maWd1cmF0aW9uVmFsdWUpOwpAQCAtODAzLDcgKzgwMyw3IEBACiAJCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKHR0eSwgYmF1ZCwgYmF1ZCk7CiAKIAlkZXZfZGJnKCZwb3J0LT5kZXYsCi0JCSIlcyAtIEJhdWRSYXRlPSVkLCB3QmF1ZFJhdGU9JWQsIHdGbGFncz0weCUwNFgsIGJEYXRhQml0cz0lZCwgYlBhcml0eT0lZCwgYlN0b3BCaXRzPSVkLCBjWG9uPSVkLCBjWG9mZj0lZCwgYlVhcnRNb2RlPSVkIiwKKwkJIiVzIC0gQmF1ZFJhdGU9JWQsIHdCYXVkUmF0ZT0lZCwgd0ZsYWdzPTB4JTA0WCwgYkRhdGFCaXRzPSVkLCBiUGFyaXR5PSVkLCBiU3RvcEJpdHM9JWQsIGNYb249JWQsIGNYb2ZmPSVkLCBiVWFydE1vZGU9JWRcbiIsCiAJCV9fZnVuY19fLCBiYXVkLCBjb25maWctPndCYXVkUmF0ZSwgY29uZmlnLT53RmxhZ3MsCiAJCWNvbmZpZy0+YkRhdGFCaXRzLCBjb25maWctPmJQYXJpdHksIGNvbmZpZy0+YlN0b3BCaXRzLAogCQljb25maWctPmNYb24sIGNvbmZpZy0+Y1hvZmYsIGNvbmZpZy0+YlVhcnRNb2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCmluZGV4IDdjOWRjMjguLjgxZmMwZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYwpAQCAtODY4LDcgKzg2OCw3IEBACiAJbWF4X2VuZHBvaW50cyA9IG1heChtYXhfZW5kcG9pbnRzLCAoaW50KXNlcmlhbC0+bnVtX3BvcnRzKTsKIAlzZXJpYWwtPm51bV9wb3J0X3BvaW50ZXJzID0gbWF4X2VuZHBvaW50czsKIAotCWRldl9kYmcoZGRldiwgInNldHRpbmcgdXAgJWQgcG9ydCBzdHJ1Y3R1cmVzIGZvciB0aGlzIGRldmljZSIsIG1heF9lbmRwb2ludHMpOworCWRldl9kYmcoZGRldiwgInNldHRpbmcgdXAgJWQgcG9ydCBzdHJ1Y3R1cmUocylcbiIsIG1heF9lbmRwb2ludHMpOwogCWZvciAoaSA9IDA7IGkgPCBtYXhfZW5kcG9pbnRzOyArK2kpIHsKIAkJcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFwb3J0KQpAQCAtOTIzLDkgKzkyMyw4IEBACiAJCXBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CiAJCWlmIChrZmlmb19hbGxvYygmcG9ydC0+d3JpdGVfZmlmbywgUEFHRV9TSVpFLCBHRlBfS0VSTkVMKSkKIAkJCWdvdG8gcHJvYmVfZXJyb3I7Ci0JCWJ1ZmZlcl9zaXplID0gc2VyaWFsLT50eXBlLT5idWxrX291dF9zaXplOwotCQlpZiAoIWJ1ZmZlcl9zaXplKQotCQkJYnVmZmVyX3NpemUgPSB1c2JfZW5kcG9pbnRfbWF4cChlbmRwb2ludCk7CisJCWJ1ZmZlcl9zaXplID0gbWF4X3QoaW50LCBzZXJpYWwtPnR5cGUtPmJ1bGtfb3V0X3NpemUsCisJCQkJCQl1c2JfZW5kcG9pbnRfbWF4cChlbmRwb2ludCkpOwogCQlwb3J0LT5idWxrX291dF9zaXplID0gYnVmZmVyX3NpemU7CiAJCXBvcnQtPmJ1bGtfb3V0X2VuZHBvaW50QWRkcmVzcyA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwogCkBAIC0xMDM0LDcgKzEwMzMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBudW1fcG9ydHM7ICsraSkgewogCQlwb3J0ID0gc2VyaWFsLT5wb3J0W2ldOwogCQlkZXZfc2V0X25hbWUoJnBvcnQtPmRldiwgInR0eVVTQiVkIiwgcG9ydC0+bWlub3IpOwotCQlkZXZfZGJnKGRkZXYsICJyZWdpc3RlcmluZyAlcyIsIGRldl9uYW1lKCZwb3J0LT5kZXYpKTsKKwkJZGV2X2RiZyhkZGV2LCAicmVnaXN0ZXJpbmcgJXNcbiIsIGRldl9uYW1lKCZwb3J0LT5kZXYpKTsKIAkJZGV2aWNlX2VuYWJsZV9hc3luY19zdXNwZW5kKCZwb3J0LT5kZXYpOwogCiAJCXJldHZhbCA9IGRldmljZV9hZGQoJnBvcnQtPmRldik7CkBAIC0xMTYxLDkgKzExNjAsOSBAQAogCXVzYl9zZXJpYWxfdW5wb2lzb25fcG9ydF91cmJzKHNlcmlhbCk7CiAKIAlzZXJpYWwtPnN1c3BlbmRpbmcgPSAwOwotCWlmIChzZXJpYWwtPnR5cGUtPnJlc2V0X3Jlc3VtZSkKKwlpZiAoc2VyaWFsLT50eXBlLT5yZXNldF9yZXN1bWUpIHsKIAkJcnYgPSBzZXJpYWwtPnR5cGUtPnJlc2V0X3Jlc3VtZShzZXJpYWwpOwotCWVsc2UgeworCX0gZWxzZSB7CiAJCXJ2ID0gLUVPUE5PVFNVUFA7CiAJCWludGYtPm5lZWRzX2JpbmRpbmcgPSAxOwogCX0KQEAgLTEzMzgsOSArMTMzNyw5IEBACiAJaWYgKHJldHZhbCkgewogCQlwcl9lcnIoInByb2JsZW0gJWQgd2hlbiByZWdpc3RlcmluZyBkcml2ZXIgJXNcbiIsIHJldHZhbCwgZHJpdmVyLT5kZXNjcmlwdGlvbik7CiAJCWxpc3RfZGVsKCZkcml2ZXItPmRyaXZlcl9saXN0KTsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQlwcl9pbmZvKCJVU0IgU2VyaWFsIHN1cHBvcnQgcmVnaXN0ZXJlZCBmb3IgJXNcbiIsIGRyaXZlci0+ZGVzY3JpcHRpb24pOwotCisJfQogCW11dGV4X3VubG9jaygmdGFibGVfbG9jayk7CiAJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZwppbmRleCAxZGQwNjA0Li4xM2I1YmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL0tjb25maWcKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9LY29uZmlnCkBAIC0yMDQsNyArMjA0LDcgQEAKIAogY29uZmlnIFVTQl9VQVMKIAl0cmlzdGF0ZSAiVVNCIEF0dGFjaGVkIFNDU0kiCi0JZGVwZW5kcyBvbiBTQ1NJICYmIEJST0tFTgorCWRlcGVuZHMgb24gU0NTSSAmJiBVU0JfU1RPUkFHRQogCWhlbHAKIAkgIFRoZSBVU0IgQXR0YWNoZWQgU0NTSSBwcm90b2NvbCBpcyBzdXBwb3J0ZWQgYnkgc29tZSBVU0IKIAkgIHN0b3JhZ2UgZGV2aWNlcy4gIEl0IHBlcm1pdHMgaGlnaGVyIHBlcmZvcm1hbmNlIGJ5IHN1cHBvcnRpbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdWFzLWRldGVjdC5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91YXMtZGV0ZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwNWI5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdWFzLWRldGVjdC5oCkBAIC0wLDAgKzEsOTYgQEAKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvaGNkLmg+CisjaW5jbHVkZSAidXNiLmgiCisKK3N0YXRpYyBpbnQgdWFzX2lzX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRmKQoreworCXJldHVybiAoaW50Zi0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MgPT0gVVNCX0NMQVNTX01BU1NfU1RPUkFHRSAmJgorCQlpbnRmLT5kZXNjLmJJbnRlcmZhY2VTdWJDbGFzcyA9PSBVU0JfU0NfU0NTSSAmJgorCQlpbnRmLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9PSBVU0JfUFJfVUFTKTsKK30KKworc3RhdGljIGludCB1YXNfaXNudF9zdXBwb3J0ZWQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCit7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGJ1c190b19oY2QodWRldi0+YnVzKTsKKworCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJUaGUgZHJpdmVyIGZvciB0aGUgVVNCIGNvbnRyb2xsZXIgJXMgZG9lcyBub3QgIgorCQkJInN1cHBvcnQgc2NhdHRlci1nYXRoZXIgd2hpY2ggaXNcbiIsCisJCQloY2QtPmRyaXZlci0+ZGVzY3JpcHRpb24pOworCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJyZXF1aXJlZCBieSB0aGUgVUFTIGRyaXZlci4gUGxlYXNlIHRyeSBhbiIKKwkJCSJhbHRlcm5hdGl2ZSBVU0IgY29udHJvbGxlciBpZiB5b3Ugd2lzaCB0byB1c2UgVUFTLlxuIik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgdWFzX2ZpbmRfdWFzX2FsdF9zZXR0aW5nKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCWludCBpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlpbnQgc2dfc3VwcG9ydGVkID0gdWRldi0+YnVzLT5zZ190YWJsZXNpemUgIT0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBpbnRmLT5udW1fYWx0c2V0dGluZzsgaSsrKSB7CisJCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdCA9ICZpbnRmLT5hbHRzZXR0aW5nW2ldOworCisJCWlmICh1YXNfaXNfaW50ZXJmYWNlKGFsdCkpIHsKKwkJCWlmICghc2dfc3VwcG9ydGVkKQorCQkJCXJldHVybiB1YXNfaXNudF9zdXBwb3J0ZWQodWRldik7CisJCQlyZXR1cm4gYWx0LT5kZXNjLmJBbHRlcm5hdGVTZXR0aW5nOworCQl9CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgdWFzX2ZpbmRfZW5kcG9pbnRzKHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdCwKKwkJCSAgICAgIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXBzW10pCit7CisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplbmRwb2ludCA9IGFsdC0+ZW5kcG9pbnQ7CisJdW5zaWduZWQgaSwgbl9lbmRwb2ludHMgPSBhbHQtPmRlc2MuYk51bUVuZHBvaW50czsKKworCWZvciAoaSA9IDA7IGkgPCBuX2VuZHBvaW50czsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgKmV4dHJhID0gZW5kcG9pbnRbaV0uZXh0cmE7CisJCWludCBsZW4gPSBlbmRwb2ludFtpXS5leHRyYWxlbjsKKwkJd2hpbGUgKGxlbiA+PSAzKSB7CisJCQlpZiAoZXh0cmFbMV0gPT0gVVNCX0RUX1BJUEVfVVNBR0UpIHsKKwkJCQl1bnNpZ25lZCBwaXBlX2lkID0gZXh0cmFbMl07CisJCQkJaWYgKHBpcGVfaWQgPiAwICYmIHBpcGVfaWQgPCA1KQorCQkJCQllcHNbcGlwZV9pZCAtIDFdID0gJmVuZHBvaW50W2ldOworCQkJCWJyZWFrOworCQkJfQorCQkJbGVuIC09IGV4dHJhWzBdOworCQkJZXh0cmEgKz0gZXh0cmFbMF07CisJCX0KKwl9CisKKwlpZiAoIWVwc1swXSB8fCAhZXBzWzFdIHx8ICFlcHNbMl0gfHwgIWVwc1szXSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1YXNfdXNlX3Vhc19kcml2ZXIoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcHNbNF0gPSB7IH07CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBidXNfdG9faGNkKHVkZXYtPmJ1cyk7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IGlkLT5kcml2ZXJfaW5mbzsKKwlpbnQgciwgYWx0OworCisJdXNiX3N0b3JfYWRqdXN0X3F1aXJrcyh1ZGV2LCAmZmxhZ3MpOworCisJaWYgKGZsYWdzICYgVVNfRkxfSUdOT1JFX1VBUykKKwkJcmV0dXJuIDA7CisKKwlpZiAodWRldi0+c3BlZWQgPj0gVVNCX1NQRUVEX1NVUEVSICYmICFoY2QtPmNhbl9kb19zdHJlYW1zKQorCQlyZXR1cm4gMDsKKworCWFsdCA9IHVhc19maW5kX3Vhc19hbHRfc2V0dGluZyhpbnRmKTsKKwlpZiAoYWx0IDwgMCkKKwkJcmV0dXJuIDA7CisKKwlyID0gdWFzX2ZpbmRfZW5kcG9pbnRzKCZpbnRmLT5hbHRzZXR0aW5nW2FsdF0sIGVwcyk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91YXMuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdWFzLmMKaW5kZXggZDk2NmI1OS4uYTdhYzk3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91YXMuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Vhcy5jCkBAIC0yLDYgKzIsNyBAQAogICogVVNCIEF0dGFjaGVkIFNDU0kKICAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgVVNCIE1hc3MgU3RvcmFnZSBkcml2ZXIKICAqCisgKiBDb3B5cmlnaHQgSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4gZm9yIFJlZCBIYXQsIEluYy4gMjAxMwogICogQ29weXJpZ2h0IE1hdHRoZXcgV2lsY294IGZvciBJbnRlbCBDb3JwLCAyMDEwCiAgKiBDb3B5cmlnaHQgU2FyYWggU2hhcnAgZm9yIEludGVsIENvcnAsIDIwMTAKICAqCkBAIC0xMywxNyArMTQsMjEgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYl91c3VhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9oY2QuaD4KICNpbmNsdWRlIDxsaW51eC91c2Ivc3RvcmFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi91YXMuaD4KIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KIAorI2luY2x1ZGUgInVhcy1kZXRlY3QuaCIKKwogLyoKICAqIFRoZSByMDAtcjAxYyBzcGVjcyBkZWZpbmUgdGhpcyB2ZXJzaW9uIG9mIHRoZSBTRU5TRSBJVSBkYXRhIHN0cnVjdHVyZS4KICAqIEl0J3Mgc3RpbGwgaW4gdXNlIGJ5IHNldmVyYWwgZGlmZmVyZW50IGZpcm13YXJlIHJlbGVhc2VzLgpAQCAtNDUsMTIgKzUwLDE3IEBACiAJc3RydWN0IHVzYl9hbmNob3Igc2Vuc2VfdXJiczsKIAlzdHJ1Y3QgdXNiX2FuY2hvciBkYXRhX3VyYnM7CiAJaW50IHFkZXB0aCwgcmVzZXR0aW5nOwotCXN0cnVjdCByZXNwb25zZV91aSByZXNwb25zZTsKKwlzdHJ1Y3QgcmVzcG9uc2VfaXUgcmVzcG9uc2U7CiAJdW5zaWduZWQgY21kX3BpcGUsIHN0YXR1c19waXBlLCBkYXRhX2luX3BpcGUsIGRhdGFfb3V0X3BpcGU7CiAJdW5zaWduZWQgdXNlX3N0cmVhbXM6MTsKIAl1bnNpZ25lZCB1YXNfc2Vuc2Vfb2xkOjE7CisJdW5zaWduZWQgcnVubmluZ190YXNrOjE7CisJdW5zaWduZWQgc2h1dGRvd246MTsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kOwogCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGluZmxpZ2h0X2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBkZWFkX2xpc3Q7CiB9OwogCiBlbnVtIHsKQEAgLTg1LDEwMyArOTUsMTE3IEBACiAJCQkJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbywgZ2ZwX3QgZ2ZwKTsKIHN0YXRpYyB2b2lkIHVhc19kb193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBzdGF0aWMgaW50IHVhc190cnlfY29tcGxldGUoc3RydWN0IHNjc2lfY21uZCAqY21uZCwgY29uc3QgY2hhciAqY2FsbGVyKTsKK3N0YXRpYyB2b2lkIHVhc19mcmVlX3N0cmVhbXMoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyk7CitzdGF0aWMgdm9pZCB1YXNfbG9nX2NtZF9zdGF0ZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kLCBjb25zdCBjaGFyICpjYWxsZXIpOwogCi1zdGF0aWMgREVDTEFSRV9XT1JLKHVhc193b3JrLCB1YXNfZG9fd29yayk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHVhc193b3JrX2xvY2spOwotc3RhdGljIExJU1RfSEVBRCh1YXNfd29ya19saXN0KTsKLQorLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBkZXZpbmZvLT5sb2NrIGhlbGQsIHdpbGwgdGVtcG9yYXJ5IHVubG9jayB0aGUgbG9jayAqLwogc3RhdGljIHZvaWQgdWFzX3VubGlua19kYXRhX3VyYnMoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbywKLQkJCQkgc3RydWN0IHVhc19jbWRfaW5mbyAqY21kaW5mbykKKwkJCQkgc3RydWN0IHVhc19jbWRfaW5mbyAqY21kaW5mbywKKwkJCQkgdW5zaWduZWQgbG9uZyAqbG9ja19mbGFncykKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJLyoKIAkgKiBUaGUgVU5MSU5LX0RBVEFfVVJCUyBmbGFnIG1ha2VzIHN1cmUgdWFzX3RyeV9jb21wbGV0ZQogCSAqIChjYWxsZWQgYnkgdXJiIGNvbXBsZXRpb24pIGRvZXNuJ3QgcmVsZWFzZSBjbWRpbmZvCiAJICogdW5kZXJuZWF0aCB1cy4KIAkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwogCWNtZGluZm8tPnN0YXRlIHw9IFVOTElOS19EQVRBX1VSQlM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmluZm8tPmxvY2ssICpsb2NrX2ZsYWdzKTsKIAogCWlmIChjbWRpbmZvLT5kYXRhX2luX3VyYikKIAkJdXNiX3VubGlua191cmIoY21kaW5mby0+ZGF0YV9pbl91cmIpOwogCWlmIChjbWRpbmZvLT5kYXRhX291dF91cmIpCiAJCXVzYl91bmxpbmtfdXJiKGNtZGluZm8tPmRhdGFfb3V0X3VyYik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpbmZvLT5sb2NrLCAqbG9ja19mbGFncyk7CiAJY21kaW5mby0+c3RhdGUgJj0gflVOTElOS19EQVRBX1VSQlM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCB1YXNfZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdWFzX2Rldl9pbmZvLCB3b3JrKTsKIAlzdHJ1Y3QgdWFzX2NtZF9pbmZvICpjbWRpbmZvOwotCXN0cnVjdCB1YXNfY21kX2luZm8gKnRlbXA7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVycjsKIAotCXNwaW5fbG9ja19pcnEoJnVhc193b3JrX2xvY2spOwotCWxpc3RfcmVwbGFjZV9pbml0KCZ1YXNfd29ya19saXN0LCAmbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ1YXNfd29ya19sb2NrKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbWRpbmZvLCB0ZW1wLCAmbGlzdCwgbGlzdCkgeworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbWRpbmZvLCAmZGV2aW5mby0+aW5mbGlnaHRfbGlzdCwgbGlzdCkgewogCQlzdHJ1Y3Qgc2NzaV9wb2ludGVyICpzY3AgPSAodm9pZCAqKWNtZGluZm87Ci0JCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSBjb250YWluZXJfb2Yoc2NwLAotCQkJCQkJCXN0cnVjdCBzY3NpX2NtbmQsIFNDcCk7Ci0JCXN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8gPSAodm9pZCAqKWNtbmQtPmRldmljZS0+aG9zdGRhdGE7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCWVyciA9IHVhc19zdWJtaXRfdXJicyhjbW5kLCBjbW5kLT5kZXZpY2UtPmhvc3RkYXRhLCBHRlBfQVRPTUlDKTsKKwkJc3RydWN0IHNjc2lfY21uZCAqY21uZCA9IGNvbnRhaW5lcl9vZihzY3AsIHN0cnVjdCBzY3NpX2NtbmQsCisJCQkJCQkgICAgICBTQ3ApOworCisJCWlmICghKGNtZGluZm8tPnN0YXRlICYgSVNfSU5fV09SS19MSVNUKSkKKwkJCWNvbnRpbnVlOworCisJCWVyciA9IHVhc19zdWJtaXRfdXJicyhjbW5kLCBjbW5kLT5kZXZpY2UtPmhvc3RkYXRhLCBHRlBfTk9JTyk7CiAJCWlmICghZXJyKQogCQkJY21kaW5mby0+c3RhdGUgJj0gfklTX0lOX1dPUktfTElTVDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwotCQlpZiAoZXJyKSB7Ci0JCQlsaXN0X2RlbCgmY21kaW5mby0+bGlzdCk7Ci0JCQlzcGluX2xvY2tfaXJxKCZ1YXNfd29ya19sb2NrKTsKLQkJCWxpc3RfYWRkX3RhaWwoJmNtZGluZm8tPmxpc3QsICZ1YXNfd29ya19saXN0KTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmdWFzX3dvcmtfbG9jayk7Ci0JCQlzY2hlZHVsZV93b3JrKCZ1YXNfd29yayk7Ci0JCX0KKwkJZWxzZQorCQkJc2NoZWR1bGVfd29yaygmZGV2aW5mby0+d29yayk7CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmluZm8tPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgdWFzX2Fib3J0X3dvcmsoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbykKK3N0YXRpYyB2b2lkIHVhc19tYXJrX2NtZF9kZWFkKHN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8sCisJCQkgICAgICBzdHJ1Y3QgdWFzX2NtZF9pbmZvICpjbWRpbmZvLAorCQkJICAgICAgaW50IHJlc3VsdCwgY29uc3QgY2hhciAqY2FsbGVyKQoreworCXN0cnVjdCBzY3NpX3BvaW50ZXIgKnNjcCA9ICh2b2lkICopY21kaW5mbzsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kID0gY29udGFpbmVyX29mKHNjcCwgc3RydWN0IHNjc2lfY21uZCwgU0NwKTsKKworCXVhc19sb2dfY21kX3N0YXRlKGNtbmQsIGNhbGxlcik7CisJV0FSTl9PTl9PTkNFKCFzcGluX2lzX2xvY2tlZCgmZGV2aW5mby0+bG9jaykpOworCVdBUk5fT05fT05DRShjbWRpbmZvLT5zdGF0ZSAmIENPTU1BTkRfQUJPUlRFRCk7CisJY21kaW5mby0+c3RhdGUgfD0gQ09NTUFORF9BQk9SVEVEOworCWNtZGluZm8tPnN0YXRlICY9IH5JU19JTl9XT1JLX0xJU1Q7CisJY21uZC0+cmVzdWx0ID0gcmVzdWx0IDw8IDE2OworCWxpc3RfbW92ZV90YWlsKCZjbWRpbmZvLT5saXN0LCAmZGV2aW5mby0+ZGVhZF9saXN0KTsKK30KKworc3RhdGljIHZvaWQgdWFzX2Fib3J0X2luZmxpZ2h0KHN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8sIGludCByZXN1bHQsCisJCQkgICAgICAgY29uc3QgY2hhciAqY2FsbGVyKQogewogCXN0cnVjdCB1YXNfY21kX2luZm8gKmNtZGluZm87CiAJc3RydWN0IHVhc19jbWRfaW5mbyAqdGVtcDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnEoJnVhc193b3JrX2xvY2spOwotCWxpc3RfcmVwbGFjZV9pbml0KCZ1YXNfd29ya19saXN0LCAmbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ1YXNfd29ya19sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbWRpbmZvLCB0ZW1wLCAmZGV2aW5mby0+aW5mbGlnaHRfbGlzdCwgbGlzdCkKKwkJdWFzX21hcmtfY21kX2RlYWQoZGV2aW5mbywgY21kaW5mbywgcmVzdWx0LCBjYWxsZXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgdWFzX2FkZF93b3JrKHN0cnVjdCB1YXNfY21kX2luZm8gKmNtZGluZm8pCit7CisJc3RydWN0IHNjc2lfcG9pbnRlciAqc2NwID0gKHZvaWQgKiljbWRpbmZvOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSBjb250YWluZXJfb2Yoc2NwLCBzdHJ1Y3Qgc2NzaV9jbW5kLCBTQ3ApOworCXN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8gPSBjbW5kLT5kZXZpY2UtPmhvc3RkYXRhOworCisJV0FSTl9PTl9PTkNFKCFzcGluX2lzX2xvY2tlZCgmZGV2aW5mby0+bG9jaykpOworCWNtZGluZm8tPnN0YXRlIHw9IElTX0lOX1dPUktfTElTVDsKKwlzY2hlZHVsZV93b3JrKCZkZXZpbmZvLT53b3JrKTsKK30KKworc3RhdGljIHZvaWQgdWFzX3phcF9kZWFkKHN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8pCit7CisJc3RydWN0IHVhc19jbWRfaW5mbyAqY21kaW5mbzsKKwlzdHJ1Y3QgdWFzX2NtZF9pbmZvICp0ZW1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbWRpbmZvLCB0ZW1wLCAmbGlzdCwgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbWRpbmZvLCB0ZW1wLCAmZGV2aW5mby0+ZGVhZF9saXN0LCBsaXN0KSB7CiAJCXN0cnVjdCBzY3NpX3BvaW50ZXIgKnNjcCA9ICh2b2lkICopY21kaW5mbzsKLQkJc3RydWN0IHNjc2lfY21uZCAqY21uZCA9IGNvbnRhaW5lcl9vZihzY3AsCi0JCQkJCQkJc3RydWN0IHNjc2lfY21uZCwgU0NwKTsKLQkJc3RydWN0IHVhc19kZXZfaW5mbyAqZGkgPSAodm9pZCAqKWNtbmQtPmRldmljZS0+aG9zdGRhdGE7Ci0KLQkJaWYgKGRpID09IGRldmluZm8pIHsKLQkJCWNtZGluZm8tPnN0YXRlIHw9IENPTU1BTkRfQUJPUlRFRDsKLQkJCWNtZGluZm8tPnN0YXRlICY9IH5JU19JTl9XT1JLX0xJU1Q7Ci0JCQlpZiAoZGV2aW5mby0+cmVzZXR0aW5nKSB7Ci0JCQkJLyogdWFzX3N0YXRfY21wbHQoKSB3aWxsIG5vdCBkbyB0aGF0Ci0JCQkJICogd2hlbiBhIGRldmljZSByZXNldCBpcyBpbgotCQkJCSAqIHByb2dyZXNzICovCi0JCQkJY21kaW5mby0+c3RhdGUgJj0gfkNPTU1BTkRfSU5GTElHSFQ7Ci0JCQl9Ci0JCQl1YXNfdHJ5X2NvbXBsZXRlKGNtbmQsIF9fZnVuY19fKTsKLQkJfSBlbHNlIHsKLQkJCS8qIG5vdCBvdXIgdWFzIGRldmljZSwgcmVsaW5rIGludG8gbGlzdCAqLwotCQkJbGlzdF9kZWwoJmNtZGluZm8tPmxpc3QpOwotCQkJc3Bpbl9sb2NrX2lycSgmdWFzX3dvcmtfbG9jayk7Ci0JCQlsaXN0X2FkZF90YWlsKCZjbWRpbmZvLT5saXN0LCAmdWFzX3dvcmtfbGlzdCk7Ci0JCQlzcGluX3VubG9ja19pcnEoJnVhc193b3JrX2xvY2spOwotCQl9CisJCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSBjb250YWluZXJfb2Yoc2NwLCBzdHJ1Y3Qgc2NzaV9jbW5kLAorCQkJCQkJICAgICAgU0NwKTsKKwkJdWFzX2xvZ19jbWRfc3RhdGUoY21uZCwgX19mdW5jX18pOworCQlXQVJOX09OX09OQ0UoIShjbWRpbmZvLT5zdGF0ZSAmIENPTU1BTkRfQUJPUlRFRCkpOworCQkvKiBhbGwgdXJicyBhcmUga2lsbGVkLCBjbGVhciBpbmZsaWdodCBiaXRzICovCisJCWNtZGluZm8tPnN0YXRlICY9IH4oQ09NTUFORF9JTkZMSUdIVCB8CisJCQkJICAgIERBVEFfSU5fVVJCX0lORkxJR0hUIHwKKwkJCQkgICAgREFUQV9PVVRfVVJCX0lORkxJR0hUKTsKKwkJdWFzX3RyeV9jb21wbGV0ZShjbW5kLCBfX2Z1bmNfXyk7CiAJfQorCWRldmluZm8tPnJ1bm5pbmdfdGFzayA9IDA7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwogfQogCkBAIC0yNTksMjAgKzI4MywxOSBAQAogCXN0cnVjdCB1YXNfY21kX2luZm8gKmNtZGluZm8gPSAodm9pZCAqKSZjbW5kLT5TQ3A7CiAJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9ICh2b2lkICopY21uZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKIAotCVdBUk5fT04oIXNwaW5faXNfbG9ja2VkKCZkZXZpbmZvLT5sb2NrKSk7CisJV0FSTl9PTl9PTkNFKCFzcGluX2lzX2xvY2tlZCgmZGV2aW5mby0+bG9jaykpOwogCWlmIChjbWRpbmZvLT5zdGF0ZSAmIChDT01NQU5EX0lORkxJR0hUIHwKIAkJCSAgICAgIERBVEFfSU5fVVJCX0lORkxJR0hUIHwKIAkJCSAgICAgIERBVEFfT1VUX1VSQl9JTkZMSUdIVCB8CiAJCQkgICAgICBVTkxJTktfREFUQV9VUkJTKSkKIAkJcmV0dXJuIC1FQlVTWTsKLQlCVUdfT04oY21kaW5mby0+c3RhdGUgJiBDT01NQU5EX0NPTVBMRVRFRCk7CisJV0FSTl9PTl9PTkNFKGNtZGluZm8tPnN0YXRlICYgQ09NTUFORF9DT01QTEVURUQpOwogCWNtZGluZm8tPnN0YXRlIHw9IENPTU1BTkRfQ09NUExFVEVEOwogCXVzYl9mcmVlX3VyYihjbWRpbmZvLT5kYXRhX2luX3VyYik7CiAJdXNiX2ZyZWVfdXJiKGNtZGluZm8tPmRhdGFfb3V0X3VyYik7Ci0JaWYgKGNtZGluZm8tPnN0YXRlICYgQ09NTUFORF9BQk9SVEVEKSB7CisJaWYgKGNtZGluZm8tPnN0YXRlICYgQ09NTUFORF9BQk9SVEVEKQogCQlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtbmQsICJhYm9ydCBjb21wbGV0ZWRcbiIpOwotCQljbW5kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7Ci0JfQorCWxpc3RfZGVsKCZjbWRpbmZvLT5saXN0KTsKIAljbW5kLT5zY3NpX2RvbmUoY21uZCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yODYsMTEgKzMwOSw3IEBACiAJY21kaW5mby0+c3RhdGUgfD0gZGlyZWN0aW9uIHwgU1VCTUlUX1NUQVRVU19VUkI7CiAJZXJyID0gdWFzX3N1Ym1pdF91cmJzKGNtbmQsIGNtbmQtPmRldmljZS0+aG9zdGRhdGEsIEdGUF9BVE9NSUMpOwogCWlmIChlcnIpIHsKLQkJc3Bpbl9sb2NrKCZ1YXNfd29ya19sb2NrKTsKLQkJbGlzdF9hZGRfdGFpbCgmY21kaW5mby0+bGlzdCwgJnVhc193b3JrX2xpc3QpOwotCQljbWRpbmZvLT5zdGF0ZSB8PSBJU19JTl9XT1JLX0xJU1Q7Ci0JCXNwaW5fdW5sb2NrKCZ1YXNfd29ya19sb2NrKTsKLQkJc2NoZWR1bGVfd29yaygmdWFzX3dvcmspOworCQl1YXNfYWRkX3dvcmsoY21kaW5mbyk7CiAJfQogfQogCkBAIC0yOTgsMTQgKzMxNywyMCBAQAogewogCXN0cnVjdCBpdSAqaXUgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHVyYi0+Y29udGV4dDsKLQlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvID0gKHZvaWQgKilzaG9zdC0+aG9zdGRhdGFbMF07CisJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9IChzdHJ1Y3QgdWFzX2Rldl9pbmZvICopc2hvc3QtPmhvc3RkYXRhOwogCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQ7CiAJc3RydWN0IHVhc19jbWRfaW5mbyAqY21kaW5mbzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUxNiB0YWc7CiAKIAlpZiAodXJiLT5zdGF0dXMpIHsKLQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIlVSQiBCQUQgU1RBVFVTICVkXG4iLCB1cmItPnN0YXR1cyk7CisJCWlmICh1cmItPnN0YXR1cyA9PSAtRU5PRU5UKSB7CisJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAic3RhdCB1cmI6IGtpbGxlZCwgc3RyZWFtICVkXG4iLAorCQkJCXVyYi0+c3RyZWFtX2lkKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICJzdGF0IHVyYjogc3RhdHVzICVkXG4iLAorCQkJCXVyYi0+c3RhdHVzKTsKKwkJfQogCQl1c2JfZnJlZV91cmIodXJiKTsKIAkJcmV0dXJuOwogCX0KQEAgLTMyNCw2ICszNDksOSBAQAogCiAJaWYgKCFjbW5kKSB7CiAJCWlmIChpdS0+aXVfaWQgPT0gSVVfSURfUkVTUE9OU0UpIHsKKwkJCWlmICghZGV2aW5mby0+cnVubmluZ190YXNrKQorCQkJCWRldl93YXJuKCZ1cmItPmRldi0+ZGV2LAorCQkJCSAgICAic3RhdCB1cmI6IHJlY3YgdW5leHBlY3RlZCByZXNwb25zZSBpdVxuIik7CiAJCQkvKiBzdG9yZSByZXN1bHRzIGZvciB1YXNfZWhfdGFza19tZ210KCkgKi8KIAkJCW1lbWNweSgmZGV2aW5mby0+cmVzcG9uc2UsIGl1LCBzaXplb2YoZGV2aW5mby0+cmVzcG9uc2UpKTsKIAkJfQpAQCAtMzQ2LDE3ICszNzQsMjUgQEAKIAkJCXVhc19zZW5zZSh1cmIsIGNtbmQpOwogCQlpZiAoY21uZC0+cmVzdWx0ICE9IDApIHsKIAkJCS8qIGNhbmNlbCBkYXRhIHRyYW5zZmVycyBvbiBlcnJvciAqLwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwotCQkJdWFzX3VubGlua19kYXRhX3VyYnMoZGV2aW5mbywgY21kaW5mbyk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCQkJdWFzX3VubGlua19kYXRhX3VyYnMoZGV2aW5mbywgY21kaW5mbywgJmZsYWdzKTsKIAkJfQogCQljbWRpbmZvLT5zdGF0ZSAmPSB+Q09NTUFORF9JTkZMSUdIVDsKIAkJdWFzX3RyeV9jb21wbGV0ZShjbW5kLCBfX2Z1bmNfXyk7CiAJCWJyZWFrOwogCWNhc2UgSVVfSURfUkVBRF9SRUFEWToKKwkJaWYgKCFjbWRpbmZvLT5kYXRhX2luX3VyYiB8fAorCQkJCShjbWRpbmZvLT5zdGF0ZSAmIERBVEFfSU5fVVJCX0lORkxJR0hUKSkgeworCQkJc2NtZF9wcmludGsoS0VSTl9FUlIsIGNtbmQsICJ1bmV4cGVjdGVkIHJlYWQgcmR5XG4iKTsKKwkJCWJyZWFrOworCQl9CiAJCXVhc194ZmVyX2RhdGEodXJiLCBjbW5kLCBTVUJNSVRfREFUQV9JTl9VUkIpOwogCQlicmVhazsKIAljYXNlIElVX0lEX1dSSVRFX1JFQURZOgorCQlpZiAoIWNtZGluZm8tPmRhdGFfb3V0X3VyYiB8fAorCQkJCShjbWRpbmZvLT5zdGF0ZSAmIERBVEFfT1VUX1VSQl9JTkZMSUdIVCkpIHsKKwkJCXNjbWRfcHJpbnRrKEtFUk5fRVJSLCBjbW5kLCAidW5leHBlY3RlZCB3cml0ZSByZHlcbiIpOworCQkJYnJlYWs7CisJCX0KIAkJdWFzX3hmZXJfZGF0YSh1cmIsIGNtbmQsIFNVQk1JVF9EQVRBX09VVF9VUkIpOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMzgzLDggKzQxOSwxNSBAQAogCQlzZGIgPSBzY3NpX291dChjbW5kKTsKIAkJY21kaW5mby0+c3RhdGUgJj0gfkRBVEFfT1VUX1VSQl9JTkZMSUdIVDsKIAl9Ci0JQlVHX09OKHNkYiA9PSBOVUxMKTsKLQlpZiAodXJiLT5zdGF0dXMpIHsKKwlpZiAoc2RiID09IE5VTEwpIHsKKwkJV0FSTl9PTl9PTkNFKDEpOworCX0gZWxzZSBpZiAodXJiLT5zdGF0dXMpIHsKKwkJaWYgKHVyYi0+c3RhdHVzICE9IC1FQ09OTlJFU0VUKSB7CisJCQl1YXNfbG9nX2NtZF9zdGF0ZShjbW5kLCBfX2Z1bmNfXyk7CisJCQlzY21kX3ByaW50ayhLRVJOX0VSUiwgY21uZCwKKwkJCQkiZGF0YSBjbXBsdCBlcnIgJWQgc3RyZWFtICVkXG4iLAorCQkJCXVyYi0+c3RhdHVzLCB1cmItPnN0cmVhbV9pZCk7CisJCX0KIAkJLyogZXJyb3I6IG5vIGRhdGEgdHJhbnNmZXJlZCAqLwogCQlzZGItPnJlc2lkID0gc2RiLT5sZW5ndGg7CiAJfSBlbHNlIHsKQEAgLTM5NCw2ICs0MzcsMTcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CiB9CiAKK3N0YXRpYyB2b2lkIHVhc19jbWRfY21wbHQoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSB1cmItPmNvbnRleHQ7CisKKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJdWFzX2xvZ19jbWRfc3RhdGUoY21uZCwgX19mdW5jX18pOworCQlzY21kX3ByaW50ayhLRVJOX0VSUiwgY21uZCwgImNtZCBjbXBsdCBlcnIgJWRcbiIsIHVyYi0+c3RhdHVzKTsKKwl9CisJdXNiX2ZyZWVfdXJiKHVyYik7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdXJiICp1YXNfYWxsb2NfZGF0YV91cmIoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbywgZ2ZwX3QgZ2ZwLAogCQkJCSAgICAgIHVuc2lnbmVkIGludCBwaXBlLCB1MTYgc3RyZWFtX2lkLAogCQkJCSAgICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtbmQsCkBAIC00MDgsOCArNDYyLDcgQEAKIAkJZ290byBvdXQ7CiAJdXNiX2ZpbGxfYnVsa191cmIodXJiLCB1ZGV2LCBwaXBlLCBOVUxMLCBzZGItPmxlbmd0aCwKIAkJCSAgdWFzX2RhdGFfY21wbHQsIGNtbmQpOwotCWlmIChkZXZpbmZvLT51c2Vfc3RyZWFtcykKLQkJdXJiLT5zdHJlYW1faWQgPSBzdHJlYW1faWQ7CisJdXJiLT5zdHJlYW1faWQgPSBzdHJlYW1faWQ7CiAJdXJiLT5udW1fc2dzID0gdWRldi0+YnVzLT5zZ190YWJsZXNpemUgPyBzZGItPnRhYmxlLm5lbnRzIDogMDsKIAl1cmItPnNnID0gc2RiLT50YWJsZS5zZ2w7CiAgb3V0OgpAQCAtNDQyLDcgKzQ5NSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXJiICp1YXNfYWxsb2NfY21kX3VyYihzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvLCBnZnBfdCBnZnAsCi0JCQkJCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQsIHUxNiBzdHJlYW1faWQpCisJCQkJCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBkZXZpbmZvLT51ZGV2OwogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IGNtbmQtPmRldmljZTsKQEAgLTQ3Miw3ICs1MjUsNyBAQAogCW1lbWNweShpdS0+Y2RiLCBjbW5kLT5jbW5kLCBjbW5kLT5jbWRfbGVuKTsKIAogCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgdWRldiwgZGV2aW5mby0+Y21kX3BpcGUsIGl1LCBzaXplb2YoKml1KSArIGxlbiwKLQkJCQkJCQl1c2JfZnJlZV91cmIsIE5VTEwpOworCQkJCQkJCXVhc19jbWRfY21wbHQsIGNtbmQpOwogCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0ZSRUVfQlVGRkVSOwogIG91dDoKIAlyZXR1cm4gdXJiOwpAQCAtNTEyLDEzICs1NjUsMTcgQEAKIAl9CiAKIAl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHVkZXYsIGRldmluZm8tPmNtZF9waXBlLCBpdSwgc2l6ZW9mKCppdSksCi0JCQkgIHVzYl9mcmVlX3VyYiwgTlVMTCk7CisJCQkgIHVhc19jbWRfY21wbHQsIGNtbmQpOwogCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0ZSRUVfQlVGRkVSOwogCi0JZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBnZnApOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyOwogCXVzYl9hbmNob3JfdXJiKHVyYiwgJmRldmluZm8tPmNtZF91cmJzKTsKKwllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIGdmcCk7CisJaWYgKGVycikgeworCQl1c2JfdW5hbmNob3JfdXJiKHVyYik7CisJCXVhc19sb2dfY21kX3N0YXRlKGNtbmQsIF9fZnVuY19fKTsKKwkJc2NtZF9wcmludGsoS0VSTl9FUlIsIGNtbmQsICJ0YXNrIHN1Ym1pc3Npb24gZXJyICVkXG4iLCBlcnIpOworCQlnb3RvIGVycjsKKwl9CiAKIAlyZXR1cm4gMDsKIApAQCAtNTMzLDM4ICs1OTAsNDMgQEAKICAqIGRhZnQgdG8gbWUuCiAgKi8KIAotc3RhdGljIGludCB1YXNfc3VibWl0X3NlbnNlX3VyYihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKLQkJCQlnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBzdHJlYW0pCitzdGF0aWMgc3RydWN0IHVyYiAqdWFzX3N1Ym1pdF9zZW5zZV91cmIoc3RydWN0IHNjc2lfY21uZCAqY21uZCwKKwkJCQkJZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgc3RyZWFtKQogewotCXN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8gPSAodm9pZCAqKXNob3N0LT5ob3N0ZGF0YVswXTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNtbmQtPmRldmljZS0+aG9zdDsKKwlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvID0gKHN0cnVjdCB1YXNfZGV2X2luZm8gKilzaG9zdC0+aG9zdGRhdGE7CiAJc3RydWN0IHVyYiAqdXJiOworCWludCBlcnI7CiAKIAl1cmIgPSB1YXNfYWxsb2Nfc2Vuc2VfdXJiKGRldmluZm8sIGdmcCwgc2hvc3QsIHN0cmVhbSk7CiAJaWYgKCF1cmIpCi0JCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7Ci0JaWYgKHVzYl9zdWJtaXRfdXJiKHVyYiwgZ2ZwKSkgewotCQlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBzaG9zdCwKLQkJCSAgICAgInNlbnNlIHVyYiBzdWJtaXNzaW9uIGZhaWx1cmVcbiIpOwotCQl1c2JfZnJlZV91cmIodXJiKTsKLQkJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKLQl9CisJCXJldHVybiBOVUxMOwogCXVzYl9hbmNob3JfdXJiKHVyYiwgJmRldmluZm8tPnNlbnNlX3VyYnMpOwotCXJldHVybiAwOworCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgZ2ZwKTsKKwlpZiAoZXJyKSB7CisJCXVzYl91bmFuY2hvcl91cmIodXJiKTsKKwkJdWFzX2xvZ19jbWRfc3RhdGUoY21uZCwgX19mdW5jX18pOworCQlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBzaG9zdCwKKwkJCSAgICAgInNlbnNlIHVyYiBzdWJtaXNzaW9uIGVycm9yICVkIHN0cmVhbSAlZFxuIiwKKwkJCSAgICAgZXJyLCBzdHJlYW0pOworCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiB1cmI7CiB9CiAKIHN0YXRpYyBpbnQgdWFzX3N1Ym1pdF91cmJzKHN0cnVjdCBzY3NpX2NtbmQgKmNtbmQsCiAJCQkgICBzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHVhc19jbWRfaW5mbyAqY21kaW5mbyA9ICh2b2lkICopJmNtbmQtPlNDcDsKKwlzdHJ1Y3QgdXJiICp1cmI7CiAJaW50IGVycjsKIAotCVdBUk5fT04oIXNwaW5faXNfbG9ja2VkKCZkZXZpbmZvLT5sb2NrKSk7CisJV0FSTl9PTl9PTkNFKCFzcGluX2lzX2xvY2tlZCgmZGV2aW5mby0+bG9jaykpOwogCWlmIChjbWRpbmZvLT5zdGF0ZSAmIFNVQk1JVF9TVEFUVVNfVVJCKSB7Ci0JCWVyciA9IHVhc19zdWJtaXRfc2Vuc2VfdXJiKGNtbmQtPmRldmljZS0+aG9zdCwgZ2ZwLAotCQkJCQkgICBjbWRpbmZvLT5zdHJlYW0pOwotCQlpZiAoZXJyKSB7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJCXVyYiA9IHVhc19zdWJtaXRfc2Vuc2VfdXJiKGNtbmQsIGdmcCwgY21kaW5mby0+c3RyZWFtKTsKKwkJaWYgKCF1cmIpCisJCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOwogCQljbWRpbmZvLT5zdGF0ZSAmPSB+U1VCTUlUX1NUQVRVU19VUkI7CiAJfQogCkBAIC01NzgsMTQgKzY0MCwxOCBAQAogCX0KIAogCWlmIChjbWRpbmZvLT5zdGF0ZSAmIFNVQk1JVF9EQVRBX0lOX1VSQikgewotCQlpZiAodXNiX3N1Ym1pdF91cmIoY21kaW5mby0+ZGF0YV9pbl91cmIsIGdmcCkpIHsKKwkJdXNiX2FuY2hvcl91cmIoY21kaW5mby0+ZGF0YV9pbl91cmIsICZkZXZpbmZvLT5kYXRhX3VyYnMpOworCQllcnIgPSB1c2Jfc3VibWl0X3VyYihjbWRpbmZvLT5kYXRhX2luX3VyYiwgZ2ZwKTsKKwkJaWYgKGVycikgeworCQkJdXNiX3VuYW5jaG9yX3VyYihjbWRpbmZvLT5kYXRhX2luX3VyYik7CisJCQl1YXNfbG9nX2NtZF9zdGF0ZShjbW5kLCBfX2Z1bmNfXyk7CiAJCQlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtbmQsCi0JCQkJCSJkYXRhIGluIHVyYiBzdWJtaXNzaW9uIGZhaWx1cmVcbiIpOworCQkJCSJkYXRhIGluIHVyYiBzdWJtaXNzaW9uIGVycm9yICVkIHN0cmVhbSAlZFxuIiwKKwkJCQllcnIsIGNtZGluZm8tPmRhdGFfaW5fdXJiLT5zdHJlYW1faWQpOwogCQkJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKIAkJfQogCQljbWRpbmZvLT5zdGF0ZSAmPSB+U1VCTUlUX0RBVEFfSU5fVVJCOwogCQljbWRpbmZvLT5zdGF0ZSB8PSBEQVRBX0lOX1VSQl9JTkZMSUdIVDsKLQkJdXNiX2FuY2hvcl91cmIoY21kaW5mby0+ZGF0YV9pbl91cmIsICZkZXZpbmZvLT5kYXRhX3VyYnMpOwogCX0KIAogCWlmIChjbWRpbmZvLT5zdGF0ZSAmIEFMTE9DX0RBVEFfT1VUX1VSQikgewpAQCAtNTk4LDMzICs2NjQsMzcgQEAKIAl9CiAKIAlpZiAoY21kaW5mby0+c3RhdGUgJiBTVUJNSVRfREFUQV9PVVRfVVJCKSB7Ci0JCWlmICh1c2Jfc3VibWl0X3VyYihjbWRpbmZvLT5kYXRhX291dF91cmIsIGdmcCkpIHsKKwkJdXNiX2FuY2hvcl91cmIoY21kaW5mby0+ZGF0YV9vdXRfdXJiLCAmZGV2aW5mby0+ZGF0YV91cmJzKTsKKwkJZXJyID0gdXNiX3N1Ym1pdF91cmIoY21kaW5mby0+ZGF0YV9vdXRfdXJiLCBnZnApOworCQlpZiAoZXJyKSB7CisJCQl1c2JfdW5hbmNob3JfdXJiKGNtZGluZm8tPmRhdGFfb3V0X3VyYik7CisJCQl1YXNfbG9nX2NtZF9zdGF0ZShjbW5kLCBfX2Z1bmNfXyk7CiAJCQlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtbmQsCi0JCQkJCSJkYXRhIG91dCB1cmIgc3VibWlzc2lvbiBmYWlsdXJlXG4iKTsKKwkJCQkiZGF0YSBvdXQgdXJiIHN1Ym1pc3Npb24gZXJyb3IgJWQgc3RyZWFtICVkXG4iLAorCQkJCWVyciwgY21kaW5mby0+ZGF0YV9vdXRfdXJiLT5zdHJlYW1faWQpOwogCQkJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKIAkJfQogCQljbWRpbmZvLT5zdGF0ZSAmPSB+U1VCTUlUX0RBVEFfT1VUX1VSQjsKIAkJY21kaW5mby0+c3RhdGUgfD0gREFUQV9PVVRfVVJCX0lORkxJR0hUOwotCQl1c2JfYW5jaG9yX3VyYihjbWRpbmZvLT5kYXRhX291dF91cmIsICZkZXZpbmZvLT5kYXRhX3VyYnMpOwogCX0KIAogCWlmIChjbWRpbmZvLT5zdGF0ZSAmIEFMTE9DX0NNRF9VUkIpIHsKLQkJY21kaW5mby0+Y21kX3VyYiA9IHVhc19hbGxvY19jbWRfdXJiKGRldmluZm8sIGdmcCwgY21uZCwKLQkJCQkJCSAgICAgY21kaW5mby0+c3RyZWFtKTsKKwkJY21kaW5mby0+Y21kX3VyYiA9IHVhc19hbGxvY19jbWRfdXJiKGRldmluZm8sIGdmcCwgY21uZCk7CiAJCWlmICghY21kaW5mby0+Y21kX3VyYikKIAkJCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7CiAJCWNtZGluZm8tPnN0YXRlICY9IH5BTExPQ19DTURfVVJCOwogCX0KIAogCWlmIChjbWRpbmZvLT5zdGF0ZSAmIFNVQk1JVF9DTURfVVJCKSB7Ci0JCXVzYl9nZXRfdXJiKGNtZGluZm8tPmNtZF91cmIpOwotCQlpZiAodXNiX3N1Ym1pdF91cmIoY21kaW5mby0+Y21kX3VyYiwgZ2ZwKSkgeworCQl1c2JfYW5jaG9yX3VyYihjbWRpbmZvLT5jbWRfdXJiLCAmZGV2aW5mby0+Y21kX3VyYnMpOworCQllcnIgPSB1c2Jfc3VibWl0X3VyYihjbWRpbmZvLT5jbWRfdXJiLCBnZnApOworCQlpZiAoZXJyKSB7CisJCQl1c2JfdW5hbmNob3JfdXJiKGNtZGluZm8tPmNtZF91cmIpOworCQkJdWFzX2xvZ19jbWRfc3RhdGUoY21uZCwgX19mdW5jX18pOwogCQkJc2NtZF9wcmludGsoS0VSTl9JTkZPLCBjbW5kLAotCQkJCQkiY21kIHVyYiBzdWJtaXNzaW9uIGZhaWx1cmVcbiIpOworCQkJCSAgICAiY21kIHVyYiBzdWJtaXNzaW9uIGVycm9yICVkXG4iLCBlcnIpOwogCQkJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKIAkJfQotCQl1c2JfYW5jaG9yX3VyYihjbWRpbmZvLT5jbWRfdXJiLCAmZGV2aW5mby0+Y21kX3VyYnMpOwotCQl1c2JfcHV0X3VyYihjbWRpbmZvLT5jbWRfdXJiKTsKIAkJY21kaW5mby0+Y21kX3VyYiA9IE5VTEw7CiAJCWNtZGluZm8tPnN0YXRlICY9IH5TVUJNSVRfQ01EX1VSQjsKIAkJY21kaW5mby0+c3RhdGUgfD0gQ09NTUFORF9JTkZMSUdIVDsKQEAgLTY0NCwxOCArNzE0LDIyIEBACiAKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCB1YXNfY21kX2luZm8pID4gc2l6ZW9mKHN0cnVjdCBzY3NpX3BvaW50ZXIpKTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CisKIAlpZiAoZGV2aW5mby0+cmVzZXR0aW5nKSB7CiAJCWNtbmQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKIAkJY21uZC0+c2NzaV9kb25lKGNtbmQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybiAwOwogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CiAJaWYgKGRldmluZm8tPmNtbmQpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOwogCX0KIAorCW1lbXNldChjbWRpbmZvLCAwLCBzaXplb2YoKmNtZGluZm8pKTsKKwogCWlmIChibGtfcnFfdGFnZ2VkKGNtbmQtPnJlcXVlc3QpKSB7CiAJCWNtZGluZm8tPnN0cmVhbSA9IGNtbmQtPnJlcXVlc3QtPnRhZyArIDI7CiAJfSBlbHNlIHsKQEAgLTY5MiwxMyArNzY2LDEwIEBACiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOwogCQl9Ci0JCXNwaW5fbG9jaygmdWFzX3dvcmtfbG9jayk7Ci0JCWxpc3RfYWRkX3RhaWwoJmNtZGluZm8tPmxpc3QsICZ1YXNfd29ya19saXN0KTsKLQkJY21kaW5mby0+c3RhdGUgfD0gSVNfSU5fV09SS19MSVNUOwotCQlzcGluX3VubG9jaygmdWFzX3dvcmtfbG9jayk7Ci0JCXNjaGVkdWxlX3dvcmsoJnVhc193b3JrKTsKKwkJdWFzX2FkZF93b3JrKGNtZGluZm8pOwogCX0KIAorCWxpc3RfYWRkX3RhaWwoJmNtZGluZm8tPmxpc3QsICZkZXZpbmZvLT5pbmZsaWdodF9saXN0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CkBAIC03MDksNDYgKzc4MCw3OCBAQAogCQkJICAgIGNvbnN0IGNoYXIgKmZuYW1lLCB1OCBmdW5jdGlvbikKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNtbmQtPmRldmljZS0+aG9zdDsKLQlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvID0gKHZvaWQgKilzaG9zdC0+aG9zdGRhdGFbMF07Ci0JdTE2IHRhZyA9IGRldmluZm8tPnFkZXB0aCAtIDE7CisJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9IChzdHJ1Y3QgdWFzX2Rldl9pbmZvICopc2hvc3QtPmhvc3RkYXRhOworCXUxNiB0YWcgPSBkZXZpbmZvLT5xZGVwdGg7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdXJiICpzZW5zZV91cmI7CisJaW50IHJlc3VsdCA9IFNVQ0NFU1M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwotCW1lbXNldCgmZGV2aW5mby0+cmVzcG9uc2UsIDAsIHNpemVvZihkZXZpbmZvLT5yZXNwb25zZSkpOwotCWlmICh1YXNfc3VibWl0X3NlbnNlX3VyYihzaG9zdCwgR0ZQX0FUT01JQywgdGFnKSkgeworCisJaWYgKGRldmluZm8tPnJlc2V0dGluZykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJaWYgKGRldmluZm8tPnJ1bm5pbmdfdGFzaykgewogCQlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBzaG9zdCwKLQkJCSAgICAgIiVzOiAlczogc3VibWl0IHNlbnNlIHVyYiBmYWlsZWRcbiIsCisJCQkgICAgICIlczogJXM6IGVycm9yIGFscmVhZHkgcnVubmluZyBhIHRhc2tcbiIsCiAJCQkgICAgIF9fZnVuY19fLCBmbmFtZSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmluZm8tPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9Ci0JaWYgKHVhc19zdWJtaXRfdGFza191cmIoY21uZCwgR0ZQX0FUT01JQywgZnVuY3Rpb24sIHRhZykpIHsKKworCWRldmluZm8tPnJ1bm5pbmdfdGFzayA9IDE7CisJbWVtc2V0KCZkZXZpbmZvLT5yZXNwb25zZSwgMCwgc2l6ZW9mKGRldmluZm8tPnJlc3BvbnNlKSk7CisJc2Vuc2VfdXJiID0gdWFzX3N1Ym1pdF9zZW5zZV91cmIoY21uZCwgR0ZQX05PSU8sCisJCQkJCSBkZXZpbmZvLT51c2Vfc3RyZWFtcyA/IHRhZyA6IDApOworCWlmICghc2Vuc2VfdXJiKSB7CisJCXNob3N0X3ByaW50ayhLRVJOX0lORk8sIHNob3N0LAorCQkJICAgICAiJXM6ICVzOiBzdWJtaXQgc2Vuc2UgdXJiIGZhaWxlZFxuIiwKKwkJCSAgICAgX19mdW5jX18sIGZuYW1lKTsKKwkJZGV2aW5mby0+cnVubmluZ190YXNrID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKwlpZiAodWFzX3N1Ym1pdF90YXNrX3VyYihjbW5kLCBHRlBfTk9JTywgZnVuY3Rpb24sIHRhZykpIHsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fSU5GTywgc2hvc3QsCiAJCQkgICAgICIlczogJXM6IHN1Ym1pdCB0YXNrIG1nbXQgdXJiIGZhaWxlZFxuIiwKIAkJCSAgICAgX19mdW5jX18sIGZuYW1lKTsKKwkJZGV2aW5mby0+cnVubmluZ190YXNrID0gMDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCQl1c2Jfa2lsbF91cmIoc2Vuc2VfdXJiKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKHVzYl93YWl0X2FuY2hvcl9lbXB0eV90aW1lb3V0KCZkZXZpbmZvLT5zZW5zZV91cmJzLCAzMDAwKSA9PSAwKSB7CisJCS8qCisJCSAqIE5vdGUgd2UgZGVsaWJlcmF0ZWx5IGRvIG5vdCBjbGVhciBydW5uaW5nX3Rhc2sgaGVyZS4gSWYgd2UKKwkJICogYWxsb3cgbmV3IHRhc2tzIHRvIGJlIHN1Ym1pdHRlZCwgdGhlcmUgaXMgbm8gd2F5IHRvIGZpZ3VyZQorCQkgKiBvdXQgaWYgYSByZWNlaXZlZCByZXNwb25zZV9pdSBpcyBmb3IgdGhlIGZhaWxlZCB0YXNrIG9yIGZvcgorCQkgKiB0aGUgbmV3IG9uZS4gQSBidXMtcmVzZXQgd2lsbCBldmVudHVhbGx5IGNsZWFyIHJ1bm5pbmdfdGFzay4KKwkJICovCiAJCXNob3N0X3ByaW50ayhLRVJOX0lORk8sIHNob3N0LAogCQkJICAgICAiJXM6ICVzIHRpbWVkIG91dFxuIiwgX19mdW5jX18sIGZuYW1lKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCWRldmluZm8tPnJ1bm5pbmdfdGFzayA9IDA7CiAJaWYgKGJlMTZfdG9fY3B1KGRldmluZm8tPnJlc3BvbnNlLnRhZykgIT0gdGFnKSB7CiAJCXNob3N0X3ByaW50ayhLRVJOX0lORk8sIHNob3N0LAogCQkJICAgICAiJXM6ICVzIGZhaWxlZCAod3JvbmcgdGFnICVkLyVkKVxuIiwgX19mdW5jX18sCiAJCQkgICAgIGZuYW1lLCBiZTE2X3RvX2NwdShkZXZpbmZvLT5yZXNwb25zZS50YWcpLCB0YWcpOwotCQlyZXR1cm4gRkFJTEVEOwotCX0KLQlpZiAoZGV2aW5mby0+cmVzcG9uc2UucmVzcG9uc2VfY29kZSAhPSBSQ19UTUZfQ09NUExFVEUpIHsKKwkJcmVzdWx0ID0gRkFJTEVEOworCX0gZWxzZSBpZiAoZGV2aW5mby0+cmVzcG9uc2UucmVzcG9uc2VfY29kZSAhPSBSQ19UTUZfQ09NUExFVEUpIHsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fSU5GTywgc2hvc3QsCiAJCQkgICAgICIlczogJXMgZmFpbGVkIChyYyAweCV4KVxuIiwgX19mdW5jX18sCiAJCQkgICAgIGZuYW1lLCBkZXZpbmZvLT5yZXNwb25zZS5yZXNwb25zZV9jb2RlKTsKLQkJcmV0dXJuIEZBSUxFRDsKKwkJcmVzdWx0ID0gRkFJTEVEOwogCX0KLQlyZXR1cm4gU1VDQ0VTUzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50IHVhc19laF9hYm9ydF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKmNtbmQpCkBAIC03NTgsMjIgKzg2MSwxOSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAotCXVhc19sb2dfY21kX3N0YXRlKGNtbmQsIF9fZnVuY19fKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwotCWNtZGluZm8tPnN0YXRlIHw9IENPTU1BTkRfQUJPUlRFRDsKLQlpZiAoY21kaW5mby0+c3RhdGUgJiBJU19JTl9XT1JLX0xJU1QpIHsKLQkJc3Bpbl9sb2NrKCZ1YXNfd29ya19sb2NrKTsKLQkJbGlzdF9kZWwoJmNtZGluZm8tPmxpc3QpOwotCQljbWRpbmZvLT5zdGF0ZSAmPSB+SVNfSU5fV09SS19MSVNUOwotCQlzcGluX3VubG9jaygmdWFzX3dvcmtfbG9jayk7CisKKwlpZiAoZGV2aW5mby0+cmVzZXR0aW5nKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIEZBSUxFRDsKIAl9CisKKwl1YXNfbWFya19jbWRfZGVhZChkZXZpbmZvLCBjbWRpbmZvLCBESURfQUJPUlQsIF9fZnVuY19fKTsKIAlpZiAoY21kaW5mby0+c3RhdGUgJiBDT01NQU5EX0lORkxJR0hUKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmluZm8tPmxvY2ssIGZsYWdzKTsKIAkJcmV0ID0gdWFzX2VoX3Rhc2tfbWdtdChjbW5kLCAiQUJPUlQgVEFTSyIsIFRNRl9BQk9SVF9UQVNLKTsKIAl9IGVsc2UgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCXVhc191bmxpbmtfZGF0YV91cmJzKGRldmluZm8sIGNtZGluZm8pOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCQl1YXNfdW5saW5rX2RhdGFfdXJicyhkZXZpbmZvLCBjbWRpbmZvLCAmZmxhZ3MpOwogCQl1YXNfdHJ5X2NvbXBsZXRlKGNtbmQsIF9fZnVuY19fKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwogCQlyZXQgPSBTVUNDRVNTOwpAQCAtNzk1LDE0ICs4OTUsMjUgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGRldmluZm8tPnVkZXY7CiAJaW50IGVycjsKIAorCWVyciA9IHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQodWRldiwgZGV2aW5mby0+aW50Zik7CisJaWYgKGVycikgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHNkZXYtPmhvc3QsCisJCQkgICAgICIlcyBGQUlMRUQgdG8gZ2V0IGxvY2sgZXJyICVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBzZGV2LT5ob3N0LCAiJXMgc3RhcnRcbiIsIF9fZnVuY19fKTsKIAlkZXZpbmZvLT5yZXNldHRpbmcgPSAxOwotCXVhc19hYm9ydF93b3JrKGRldmluZm8pOworCXVhc19hYm9ydF9pbmZsaWdodChkZXZpbmZvLCBESURfUkVTRVQsIF9fZnVuY19fKTsKIAl1c2Jfa2lsbF9hbmNob3JlZF91cmJzKCZkZXZpbmZvLT5jbWRfdXJicyk7CiAJdXNiX2tpbGxfYW5jaG9yZWRfdXJicygmZGV2aW5mby0+c2Vuc2VfdXJicyk7CiAJdXNiX2tpbGxfYW5jaG9yZWRfdXJicygmZGV2aW5mby0+ZGF0YV91cmJzKTsKKwl1YXNfemFwX2RlYWQoZGV2aW5mbyk7CiAJZXJyID0gdXNiX3Jlc2V0X2RldmljZSh1ZGV2KTsKIAlkZXZpbmZvLT5yZXNldHRpbmcgPSAwOwogCisJdXNiX3VubG9ja19kZXZpY2UodWRldik7CisKIAlpZiAoZXJyKSB7CiAJCXNob3N0X3ByaW50ayhLRVJOX0lORk8sIHNkZXYtPmhvc3QsICIlcyBGQUlMRURcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIEZBSUxFRDsKQEAgLTgxNCw3ICs5MjUsMjUgQEAKIAogc3RhdGljIGludCB1YXNfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewotCXNkZXYtPmhvc3RkYXRhID0gKHZvaWQgKilzZGV2LT5ob3N0LT5ob3N0ZGF0YVswXTsKKwlzZGV2LT5ob3N0ZGF0YSA9ICh2b2lkICopc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisKKwkvKiBVU0IgaGFzIHVudXN1YWwgRE1BLWFsaWdubWVudCByZXF1aXJlbWVudHM6IEFsdGhvdWdoIHRoZQorCSAqIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgZWFjaCBzY2F0dGVyLWdhdGhlciBlbGVtZW50IGRvZXNuJ3QgbWF0dGVyLAorCSAqIHRoZSBsZW5ndGggb2YgZWFjaCBlbGVtZW50IGV4Y2VwdCB0aGUgbGFzdCBtdXN0IGJlIGRpdmlzaWJsZQorCSAqIGJ5IHRoZSBCdWxrIG1heHBhY2tldCB2YWx1ZS4gIFRoZXJlJ3MgY3VycmVudGx5IG5vIHdheSB0bworCSAqIGV4cHJlc3MgdGhpcyBieSBibG9jay1sYXllciBjb25zdHJhaW50cywgc28gd2UnbGwgY29wIG91dAorCSAqIGFuZCBzaW1wbHkgcmVxdWlyZSBhZGRyZXNzZXMgdG8gYmUgYWxpZ25lZCBhdCA1MTItYnl0ZQorCSAqIGJvdW5kYXJpZXMuICBUaGlzIGlzIG9rYXkgc2luY2UgbW9zdCBibG9jayBJL08gaW52b2x2ZXMKKwkgKiBoYXJkd2FyZSBzZWN0b3JzIHRoYXQgYXJlIG11bHRpcGxlcyBvZiA1MTIgYnl0ZXMgaW4gbGVuZ3RoLAorCSAqIGFuZCBzaW5jZSBob3N0IGNvbnRyb2xsZXJzIHVwIHRocm91Z2ggVVNCIDIuMCBoYXZlIG1heHBhY2tldAorCSAqIHZhbHVlcyBubyBsYXJnZXIgdGhhbiA1MTIuCisJICoKKwkgKiBCdXQgaXQgZG9lc24ndCBzdWZmaWNlIGZvciBXaXJlbGVzcyBVU0IsIHdoZXJlIEJ1bGsgbWF4cGFja2V0CisJICogdmFsdWVzIGNhbiBiZSBhcyBsYXJnZSBhcyAyMDQ4LiAgVG8gbWFrZSB0aGF0IHdvcmsgcHJvcGVybHkKKwkgKiB3aWxsIHJlcXVpcmUgY2hhbmdlcyB0byB0aGUgYmxvY2sgbGF5ZXIuCisJICovCisJYmxrX3F1ZXVlX3VwZGF0ZV9kbWFfYWxpZ25tZW50KHNkZXYtPnJlcXVlc3RfcXVldWUsICg1MTIgLSAxKSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtODIyLDcgKzk1MSw3IEBACiB7CiAJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9IHNkZXYtPmhvc3RkYXRhOwogCXNjc2lfc2V0X3RhZ190eXBlKHNkZXYsIE1TR19PUkRFUkVEX1RBRyk7Ci0Jc2NzaV9hY3RpdmF0ZV90Y3Eoc2RldiwgZGV2aW5mby0+cWRlcHRoIC0gMyk7CisJc2NzaV9hY3RpdmF0ZV90Y3Eoc2RldiwgZGV2aW5mby0+cWRlcHRoIC0gMik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg0Myw3ICs5NzIsMTQgQEAKIAkub3JkZXJlZF90YWcgPSAxLAogfTsKIAorI2RlZmluZSBVTlVTVUFMX0RFVihpZF92ZW5kb3IsIGlkX3Byb2R1Y3QsIGJjZERldmljZU1pbiwgYmNkRGV2aWNlTWF4LCBcCisJCSAgICB2ZW5kb3JOYW1lLCBwcm9kdWN0TmFtZSwgdXNlUHJvdG9jb2wsIHVzZVRyYW5zcG9ydCwgXAorCQkgICAgaW5pdEZ1bmN0aW9uLCBmbGFncykgXAoreyBVU0JfREVWSUNFX1ZFUihpZF92ZW5kb3IsIGlkX3Byb2R1Y3QsIGJjZERldmljZU1pbiwgYmNkRGV2aWNlTWF4KSwgXAorCS5kcml2ZXJfaW5mbyA9IChmbGFncykgfQorCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdWFzX3VzYl9pZHNbXSA9IHsKKyMJaW5jbHVkZSAidW51c3VhbF91YXMuaCIKIAl7IFVTQl9JTlRFUkZBQ0VfSU5GTyhVU0JfQ0xBU1NfTUFTU19TVE9SQUdFLCBVU0JfU0NfU0NTSSwgVVNCX1BSX0JVTEspIH0sCiAJeyBVU0JfSU5URVJGQUNFX0lORk8oVVNCX0NMQVNTX01BU1NfU1RPUkFHRSwgVVNCX1NDX1NDU0ksIFVTQl9QUl9VQVMpIH0sCiAJLyogMHhhYSBpcyBhIHByb3RvdHlwZSBkZXZpY2UgSSBoYXBwZW4gdG8gaGF2ZSBhY2Nlc3MgdG8gKi8KQEAgLTg1MiwxMDUgKzk4OCw1NSBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB1YXNfdXNiX2lkcyk7CiAKLXN0YXRpYyBpbnQgdWFzX2lzX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRmKQotewotCXJldHVybiAoaW50Zi0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MgPT0gVVNCX0NMQVNTX01BU1NfU1RPUkFHRSAmJgotCQlpbnRmLT5kZXNjLmJJbnRlcmZhY2VTdWJDbGFzcyA9PSBVU0JfU0NfU0NTSSAmJgotCQlpbnRmLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9PSBVU0JfUFJfVUFTKTsKLX0KLQotc3RhdGljIGludCB1YXNfaXNudF9zdXBwb3J0ZWQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCi17Ci0Jc3RydWN0IHVzYl9oY2QgKmhjZCA9IGJ1c190b19oY2QodWRldi0+YnVzKTsKLQotCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJUaGUgZHJpdmVyIGZvciB0aGUgVVNCIGNvbnRyb2xsZXIgJXMgZG9lcyBub3QgIgotCQkJInN1cHBvcnQgc2NhdHRlci1nYXRoZXIgd2hpY2ggaXNcbiIsCi0JCQloY2QtPmRyaXZlci0+ZGVzY3JpcHRpb24pOwotCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJyZXF1aXJlZCBieSB0aGUgVUFTIGRyaXZlci4gUGxlYXNlIHRyeSBhbiIKLQkJCSJhbHRlcm5hdGl2ZSBVU0IgY29udHJvbGxlciBpZiB5b3Ugd2lzaCB0byB1c2UgVUFTLlxuIik7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19CisjdW5kZWYgVU5VU1VBTF9ERVYKIAogc3RhdGljIGludCB1YXNfc3dpdGNoX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKLQkJCQkJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorCQkJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCWludCBpOwotCWludCBzZ19zdXBwb3J0ZWQgPSB1ZGV2LT5idXMtPnNnX3RhYmxlc2l6ZSAhPSAwOworCWludCBhbHQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgaW50Zi0+bnVtX2FsdHNldHRpbmc7IGkrKykgewotCQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQgPSAmaW50Zi0+YWx0c2V0dGluZ1tpXTsKKwlhbHQgPSB1YXNfZmluZF91YXNfYWx0X3NldHRpbmcoaW50Zik7CisJaWYgKGFsdCA8IDApCisJCXJldHVybiBhbHQ7CiAKLQkJaWYgKHVhc19pc19pbnRlcmZhY2UoYWx0KSkgewotCQkJaWYgKCFzZ19zdXBwb3J0ZWQpCi0JCQkJcmV0dXJuIHVhc19pc250X3N1cHBvcnRlZCh1ZGV2KTsKLQkJCXJldHVybiB1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LAotCQkJCQkJYWx0LT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsCi0JCQkJCQlhbHQtPmRlc2MuYkFsdGVybmF0ZVNldHRpbmcpOwotCQl9Ci0JfQotCi0JcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIHVzYl9zZXRfaW50ZXJmYWNlKHVkZXYsCisJCQlpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlciwgYWx0KTsKIH0KIAotc3RhdGljIHZvaWQgdWFzX2NvbmZpZ3VyZV9lbmRwb2ludHMoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbykKK3N0YXRpYyBpbnQgdWFzX2NvbmZpZ3VyZV9lbmRwb2ludHMoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbykKIHsKIAlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwc1s0XSA9IHsgfTsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IGRldmluZm8tPmludGY7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBkZXZpbmZvLT51ZGV2OwotCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZW5kcG9pbnQgPSBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZW5kcG9pbnQ7Ci0JdW5zaWduZWQgaSwgbl9lbmRwb2ludHMgPSBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iTnVtRW5kcG9pbnRzOworCWludCByOwogCiAJZGV2aW5mby0+dWFzX3NlbnNlX29sZCA9IDA7CiAJZGV2aW5mby0+Y21uZCA9IE5VTEw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbl9lbmRwb2ludHM7IGkrKykgewotCQl1bnNpZ25lZCBjaGFyICpleHRyYSA9IGVuZHBvaW50W2ldLmV4dHJhOwotCQlpbnQgbGVuID0gZW5kcG9pbnRbaV0uZXh0cmFsZW47Ci0JCXdoaWxlIChsZW4gPiAxKSB7Ci0JCQlpZiAoZXh0cmFbMV0gPT0gVVNCX0RUX1BJUEVfVVNBR0UpIHsKLQkJCQl1bnNpZ25lZCBwaXBlX2lkID0gZXh0cmFbMl07Ci0JCQkJaWYgKHBpcGVfaWQgPiAwICYmIHBpcGVfaWQgPCA1KQotCQkJCQllcHNbcGlwZV9pZCAtIDFdID0gJmVuZHBvaW50W2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQkJbGVuIC09IGV4dHJhWzBdOwotCQkJZXh0cmEgKz0gZXh0cmFbMF07Ci0JCX0KLQl9CisJciA9IHVhc19maW5kX2VuZHBvaW50cyhkZXZpbmZvLT5pbnRmLT5jdXJfYWx0c2V0dGluZywgZXBzKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CiAKLQkvKgotCSAqIEFzc3VtZSB0aGF0IGlmIHdlIGRpZG4ndCBmaW5kIGEgY29udHJvbCBwaXBlIGRlc2NyaXB0b3IsIHdlJ3JlCi0JICogdXNpbmcgYSBkZXZpY2Ugd2l0aCBvbGQgZmlybXdhcmUgdGhhdCBoYXBwZW5zIHRvIGJlIHNldCB1cCBsaWtlCi0JICogdGhpcy4KLQkgKi8KLQlpZiAoIWVwc1swXSkgewotCQlkZXZpbmZvLT5jbWRfcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LCAxKTsKLQkJZGV2aW5mby0+c3RhdHVzX3BpcGUgPSB1c2JfcmN2YnVsa3BpcGUodWRldiwgMSk7Ci0JCWRldmluZm8tPmRhdGFfaW5fcGlwZSA9IHVzYl9yY3ZidWxrcGlwZSh1ZGV2LCAyKTsKLQkJZGV2aW5mby0+ZGF0YV9vdXRfcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LCAyKTsKKwlkZXZpbmZvLT5jbWRfcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LAorCQkJCQkgICAgdXNiX2VuZHBvaW50X251bSgmZXBzWzBdLT5kZXNjKSk7CisJZGV2aW5mby0+c3RhdHVzX3BpcGUgPSB1c2JfcmN2YnVsa3BpcGUodWRldiwKKwkJCQkJICAgIHVzYl9lbmRwb2ludF9udW0oJmVwc1sxXS0+ZGVzYykpOworCWRldmluZm8tPmRhdGFfaW5fcGlwZSA9IHVzYl9yY3ZidWxrcGlwZSh1ZGV2LAorCQkJCQkgICAgdXNiX2VuZHBvaW50X251bSgmZXBzWzJdLT5kZXNjKSk7CisJZGV2aW5mby0+ZGF0YV9vdXRfcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LAorCQkJCQkgICAgdXNiX2VuZHBvaW50X251bSgmZXBzWzNdLT5kZXNjKSk7CiAKLQkJZXBzWzFdID0gdXNiX3BpcGVfZW5kcG9pbnQodWRldiwgZGV2aW5mby0+c3RhdHVzX3BpcGUpOwotCQllcHNbMl0gPSB1c2JfcGlwZV9lbmRwb2ludCh1ZGV2LCBkZXZpbmZvLT5kYXRhX2luX3BpcGUpOwotCQllcHNbM10gPSB1c2JfcGlwZV9lbmRwb2ludCh1ZGV2LCBkZXZpbmZvLT5kYXRhX291dF9waXBlKTsKLQl9IGVsc2UgewotCQlkZXZpbmZvLT5jbWRfcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LAotCQkJCQkJZXBzWzBdLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOwotCQlkZXZpbmZvLT5zdGF0dXNfcGlwZSA9IHVzYl9yY3ZidWxrcGlwZSh1ZGV2LAotCQkJCQkJZXBzWzFdLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOwotCQlkZXZpbmZvLT5kYXRhX2luX3BpcGUgPSB1c2JfcmN2YnVsa3BpcGUodWRldiwKLQkJCQkJCWVwc1syXS0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzKTsKLQkJZGV2aW5mby0+ZGF0YV9vdXRfcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LAotCQkJCQkJZXBzWzNdLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOwotCX0KLQotCWRldmluZm8tPnFkZXB0aCA9IHVzYl9hbGxvY19zdHJlYW1zKGRldmluZm8tPmludGYsIGVwcyArIDEsIDMsIDI1NiwKLQkJCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKGRldmluZm8tPnFkZXB0aCA8IDApIHsKKwlpZiAodWRldi0+c3BlZWQgIT0gVVNCX1NQRUVEX1NVUEVSKSB7CiAJCWRldmluZm8tPnFkZXB0aCA9IDI1NjsKIAkJZGV2aW5mby0+dXNlX3N0cmVhbXMgPSAwOwogCX0gZWxzZSB7CisJCWRldmluZm8tPnFkZXB0aCA9IHVzYl9hbGxvY19zdHJlYW1zKGRldmluZm8tPmludGYsIGVwcyArIDEsCisJCQkJCQkgICAgMywgMjU2LCBHRlBfS0VSTkVMKTsKKwkJaWYgKGRldmluZm8tPnFkZXB0aCA8IDApCisJCQlyZXR1cm4gZGV2aW5mby0+cWRlcHRoOwogCQlkZXZpbmZvLT51c2Vfc3RyZWFtcyA9IDE7CiAJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHVhc19mcmVlX3N0cmVhbXMoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbykKQEAgLTk2NCwzMCArMTA1MCwyMyBAQAogCXVzYl9mcmVlX3N0cmVhbXMoZGV2aW5mby0+aW50ZiwgZXBzLCAzLCBHRlBfS0VSTkVMKTsKIH0KIAotLyoKLSAqIFhYWDogV2hhdCBJJ2QgbGlrZSB0byBkbyBoZXJlIGlzIHJlZ2lzdGVyIGEgU0NTSSBob3N0IGZvciBlYWNoIFVTQiBob3N0IGluCi0gKiB0aGUgc3lzdGVtLiAgRm9sbG93IHVzYi1zdG9yYWdlJ3MgZGVzaWduIG9mIHJlZ2lzdGVyaW5nIGEgU0NTSSBob3N0IGZvcgotICogZWFjaCBVU0IgZGV2aWNlIGZvciB0aGUgbW9tZW50LiAgQ2FuIGltcGxlbWVudCB0aGlzIGJ5IHdhbGtpbmcgdXAgdGhlCi0gKiBVU0IgaGllcmFyY2h5IHVudGlsIHdlIGZpbmQgYSBVU0IgaG9zdC4KLSAqLwogc3RhdGljIGludCB1YXNfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKLQlpbnQgcmVzdWx0OwotCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCWludCByZXN1bHQgPSAtRU5PTUVNOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gTlVMTDsKIAlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAorCWlmICghdWFzX3VzZV91YXNfZHJpdmVyKGludGYsIGlkKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlpZiAodWFzX3N3aXRjaF9pbnRlcmZhY2UodWRldiwgaW50ZikpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGV2aW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1YXNfZGV2X2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldmluZm8pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmVzdWx0ID0gLUVOT01FTTsKLQlzaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmdWFzX2hvc3RfdGVtcGxhdGUsIHNpemVvZih2b2lkICopKTsKKwlzaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmdWFzX2hvc3RfdGVtcGxhdGUsCisJCQkJc2l6ZW9mKHN0cnVjdCB1YXNfZGV2X2luZm8pKTsKIAlpZiAoIXNob3N0KQotCQlnb3RvIGZyZWU7CisJCWdvdG8gc2V0X2FsdDA7CiAKIAlzaG9zdC0+bWF4X2NtZF9sZW4gPSAxNiArIDI1MjsKIAlzaG9zdC0+bWF4X2lkID0gMTsKQEAgLTk5NSwzMyArMTA3NCw0MCBAQAogCXNob3N0LT5tYXhfY2hhbm5lbCA9IDA7CiAJc2hvc3QtPnNnX3RhYmxlc2l6ZSA9IHVkZXYtPmJ1cy0+c2dfdGFibGVzaXplOwogCisJZGV2aW5mbyA9IChzdHJ1Y3QgdWFzX2Rldl9pbmZvICopc2hvc3QtPmhvc3RkYXRhOwogCWRldmluZm8tPmludGYgPSBpbnRmOwogCWRldmluZm8tPnVkZXYgPSB1ZGV2OwogCWRldmluZm8tPnJlc2V0dGluZyA9IDA7CisJZGV2aW5mby0+cnVubmluZ190YXNrID0gMDsKKwlkZXZpbmZvLT5zaHV0ZG93biA9IDA7CiAJaW5pdF91c2JfYW5jaG9yKCZkZXZpbmZvLT5jbWRfdXJicyk7CiAJaW5pdF91c2JfYW5jaG9yKCZkZXZpbmZvLT5zZW5zZV91cmJzKTsKIAlpbml0X3VzYl9hbmNob3IoJmRldmluZm8tPmRhdGFfdXJicyk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldmluZm8tPmxvY2spOwotCXVhc19jb25maWd1cmVfZW5kcG9pbnRzKGRldmluZm8pOworCUlOSVRfV09SSygmZGV2aW5mby0+d29yaywgdWFzX2RvX3dvcmspOworCUlOSVRfTElTVF9IRUFEKCZkZXZpbmZvLT5pbmZsaWdodF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2aW5mby0+ZGVhZF9saXN0KTsKIAotCXJlc3VsdCA9IHNjc2lfaW5pdF9zaGFyZWRfdGFnX21hcChzaG9zdCwgZGV2aW5mby0+cWRlcHRoIC0gMyk7CisJcmVzdWx0ID0gdWFzX2NvbmZpZ3VyZV9lbmRwb2ludHMoZGV2aW5mbyk7CiAJaWYgKHJlc3VsdCkKLQkJZ290byBmcmVlOworCQlnb3RvIHNldF9hbHQwOworCisJcmVzdWx0ID0gc2NzaV9pbml0X3NoYXJlZF90YWdfbWFwKHNob3N0LCBkZXZpbmZvLT5xZGVwdGggLSAyKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZyZWVfc3RyZWFtczsKIAogCXJlc3VsdCA9IHNjc2lfYWRkX2hvc3Qoc2hvc3QsICZpbnRmLT5kZXYpOwogCWlmIChyZXN1bHQpCi0JCWdvdG8gZGVjb25maWdfZXBzOwotCi0Jc2hvc3QtPmhvc3RkYXRhWzBdID0gKHVuc2lnbmVkIGxvbmcpZGV2aW5mbzsKKwkJZ290byBmcmVlX3N0cmVhbXM7CiAKIAlzY3NpX3NjYW5faG9zdChzaG9zdCk7CiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBzaG9zdCk7CiAJcmV0dXJuIHJlc3VsdDsKIAotZGVjb25maWdfZXBzOgorZnJlZV9zdHJlYW1zOgogCXVhc19mcmVlX3N0cmVhbXMoZGV2aW5mbyk7Ci0gZnJlZToKLQlrZnJlZShkZXZpbmZvKTsKK3NldF9hbHQwOgorCXVzYl9zZXRfaW50ZXJmYWNlKHVkZXYsIGludGYtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCAwKTsKIAlpZiAoc2hvc3QpCiAJCXNjc2lfaG9zdF9wdXQoc2hvc3QpOwogCXJldHVybiByZXN1bHQ7CkBAIC0xMDI5LDQ1ICsxMTE1LDE0NiBAQAogCiBzdGF0aWMgaW50IHVhc19wcmVfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0vKiBYWFg6IE5lZWQgdG8gcmV0dXJuIDEgaWYgaXQncyBub3Qgb3VyIGRldmljZSBpbiBlcnJvciBoYW5kbGluZyAqLworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvID0gKHN0cnVjdCB1YXNfZGV2X2luZm8gKilzaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZXZpbmZvLT5zaHV0ZG93bikKKwkJcmV0dXJuIDA7CisKKwkvKiBCbG9jayBuZXcgcmVxdWVzdHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJc2NzaV9ibG9ja19yZXF1ZXN0cyhzaG9zdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkvKiBXYWl0IGZvciBhbnkgcGVuZGluZyByZXF1ZXN0cyB0byBjb21wbGV0ZSAqLworCWZsdXNoX3dvcmsoJmRldmluZm8tPndvcmspOworCWlmICh1c2Jfd2FpdF9hbmNob3JfZW1wdHlfdGltZW91dCgmZGV2aW5mby0+c2Vuc2VfdXJicywgNTAwMCkgPT0gMCkgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHNob3N0LCAiJXM6IHRpbWVkIG91dFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMTsKKwl9CisKKwl1YXNfZnJlZV9zdHJlYW1zKGRldmluZm8pOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdWFzX3Bvc3RfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0vKiBYWFg6IE5lZWQgdG8gcmV0dXJuIDEgaWYgaXQncyBub3Qgb3VyIGRldmljZSBpbiBlcnJvciBoYW5kbGluZyAqLworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvID0gKHN0cnVjdCB1YXNfZGV2X2luZm8gKilzaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZXZpbmZvLT5zaHV0ZG93bikKKwkJcmV0dXJuIDA7CisKKwlpZiAodWFzX2NvbmZpZ3VyZV9lbmRwb2ludHMoZGV2aW5mbykgIT0gMCkgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHNob3N0LAorCQkJICAgICAiJXM6IGFsbG9jIHN0cmVhbXMgZXJyb3IgYWZ0ZXIgcmVzZXQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAxOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlzY3NpX3JlcG9ydF9idXNfcmVzZXQoc2hvc3QsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJc2NzaV91bmJsb2NrX3JlcXVlc3RzKHNob3N0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVhc19zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9IChzdHJ1Y3QgdWFzX2Rldl9pbmZvICopc2hvc3QtPmhvc3RkYXRhOworCisJLyogV2FpdCBmb3IgYW55IHBlbmRpbmcgcmVxdWVzdHMgdG8gY29tcGxldGUgKi8KKwlmbHVzaF93b3JrKCZkZXZpbmZvLT53b3JrKTsKKwlpZiAodXNiX3dhaXRfYW5jaG9yX2VtcHR5X3RpbWVvdXQoJmRldmluZm8tPnNlbnNlX3VyYnMsIDUwMDApID09IDApIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBzaG9zdCwgIiVzOiB0aW1lZCBvdXRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FVElNRTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1YXNfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVhc19yZXNldF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8gPSAoc3RydWN0IHVhc19kZXZfaW5mbyAqKXNob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHVhc19jb25maWd1cmVfZW5kcG9pbnRzKGRldmluZm8pICE9IDApIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBzaG9zdCwKKwkJCSAgICAgIiVzOiBhbGxvYyBzdHJlYW1zIGVycm9yIGFmdGVyIHJlc2V0IiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJc2NzaV9yZXBvcnRfYnVzX3Jlc2V0KHNob3N0LCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCB1YXNfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7Ci0Jc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9ICh2b2lkICopc2hvc3QtPmhvc3RkYXRhWzBdOworCXN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8gPSAoc3RydWN0IHVhc19kZXZfaW5mbyAqKXNob3N0LT5ob3N0ZGF0YTsKIAogCWRldmluZm8tPnJlc2V0dGluZyA9IDE7Ci0JdWFzX2Fib3J0X3dvcmsoZGV2aW5mbyk7CisJY2FuY2VsX3dvcmtfc3luYygmZGV2aW5mby0+d29yayk7CisJdWFzX2Fib3J0X2luZmxpZ2h0KGRldmluZm8sIERJRF9OT19DT05ORUNULCBfX2Z1bmNfXyk7CiAJdXNiX2tpbGxfYW5jaG9yZWRfdXJicygmZGV2aW5mby0+Y21kX3VyYnMpOwogCXVzYl9raWxsX2FuY2hvcmVkX3VyYnMoJmRldmluZm8tPnNlbnNlX3VyYnMpOwogCXVzYl9raWxsX2FuY2hvcmVkX3VyYnMoJmRldmluZm8tPmRhdGFfdXJicyk7CisJdWFzX3phcF9kZWFkKGRldmluZm8pOwogCXNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpOwogCXVhc19mcmVlX3N0cmVhbXMoZGV2aW5mbyk7Ci0Ja2ZyZWUoZGV2aW5mbyk7CisJc2NzaV9ob3N0X3B1dChzaG9zdCk7CiB9CiAKIC8qCi0gKiBYWFg6IFNob3VsZCB0aGlzIHBsdWcgaW50byBsaWJ1c3VhbCBzbyB3ZSBjYW4gYXV0by11cGdyYWRlIGRldmljZXMgZnJvbQotICogQnVsay1Pbmx5IHRvIFVBUz8KKyAqIFB1dCB0aGUgZGV2aWNlIGJhY2sgaW4gdXNiLXN0b3JhZ2UgbW9kZSBvbiBzaHV0ZG93biwgYXMgc29tZSBCSU9TLWVzCisgKiBoYW5nIG9uIHJlYm9vdCB3aGVuIHRoZSBkZXZpY2UgaXMgc3RpbGwgaW4gdWFzIG1vZGUuIE5vdGUgdGhlIHJlc2V0IGlzCisgKiBuZWNlc3NhcnkgYXMgc29tZSBkZXZpY2VzIHdvbid0IHJldmVydCB0byB1c2Itc3RvcmFnZSBtb2RlIHdpdGhvdXQgaXQuCiAgKi8KK3N0YXRpYyB2b2lkIHVhc19zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvID0gKHN0cnVjdCB1YXNfZGV2X2luZm8gKilzaG9zdC0+aG9zdGRhdGE7CisKKwlpZiAoc3lzdGVtX3N0YXRlICE9IFNZU1RFTV9SRVNUQVJUKQorCQlyZXR1cm47CisKKwlkZXZpbmZvLT5zaHV0ZG93biA9IDE7CisJdWFzX2ZyZWVfc3RyZWFtcyhkZXZpbmZvKTsKKwl1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LCBpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlciwgMCk7CisJdXNiX3Jlc2V0X2RldmljZSh1ZGV2KTsKK30KKwogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVhc19kcml2ZXIgPSB7CiAJLm5hbWUgPSAidWFzIiwKIAkucHJvYmUgPSB1YXNfcHJvYmUsCiAJLmRpc2Nvbm5lY3QgPSB1YXNfZGlzY29ubmVjdCwKIAkucHJlX3Jlc2V0ID0gdWFzX3ByZV9yZXNldCwKIAkucG9zdF9yZXNldCA9IHVhc19wb3N0X3Jlc2V0LAorCS5zdXNwZW5kID0gdWFzX3N1c3BlbmQsCisJLnJlc3VtZSA9IHVhc19yZXN1bWUsCisJLnJlc2V0X3Jlc3VtZSA9IHVhc19yZXNldF9yZXN1bWUsCisJLmRydndyYXAuZHJpdmVyLnNodXRkb3duID0gdWFzX3NodXRkb3duLAogCS5pZF90YWJsZSA9IHVhc191c2JfaWRzLAogfTsKIAogbW9kdWxlX3VzYl9kcml2ZXIodWFzX2RyaXZlcik7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk1hdHRoZXcgV2lsY294IGFuZCBTYXJhaCBTaGFycCIpOworTU9EVUxFX0FVVEhPUigKKwkiSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4sIE1hdHRoZXcgV2lsY294IGFuZCBTYXJhaCBTaGFycCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKaW5kZXggYWRiZWIyNS4uZjRhODIyOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaApAQCAtMjA4Niw2ICsyMDg2LDExIEBACiAJCSJEaWdpdGFsIE1QMyBBdWRpbyBQbGF5ZXIiLAogCQlVU0JfU0NfREVWSUNFLCBVU0JfUFJfREVWSUNFLCBOVUxMLCBVU19GTF9OT1RfTE9DS0FCTEUgKSwKIAorLyogVW51c3VhbCB1YXMgZGV2aWNlcyAqLworI2lmIElTX0VOQUJMRUQoQ09ORklHX1VTQl9VQVMpCisjaW5jbHVkZSAidW51c3VhbF91YXMuaCIKKyNlbmRpZgorCiAvKiBDb250cm9sL0J1bGsgdHJhbnNwb3J0IGZvciBhbGwgU3ViQ2xhc3MgdmFsdWVzICovCiBVU1VBTF9ERVYoVVNCX1NDX1JCQywgVVNCX1BSX0NCKSwKIFVTVUFMX0RFVihVU0JfU0NfODAyMCwgVVNCX1BSX0NCKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF91YXMuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF91YXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjQ0NDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX3Vhcy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIERyaXZlciBmb3IgVVNCIEF0dGFjaGVkIFNDU0kgZGV2aWNlcyAtIFVudXN1YWwgRGV2aWNlcyBGaWxlCisgKgorICogICAoYykgMjAxMyBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgorICoKKyAqIEJhc2VkIG9uIHRoZSBzYW1lIGZpbGUgZm9yIHRoZSB1c2Itc3RvcmFnZSBkcml2ZXIsIHdoaWNoIGlzOgorICogICAoYykgMjAwMC0yMDAyIE1hdHRoZXcgRGhhcm0gKG1kaGFybS11c2JAb25lLWV5ZWQtYWxpZW4ubmV0KQorICogICAoYykgMjAwMCBBZGFtIEouIFJpY2h0ZXIgKGFkYW1AeWdnZHJhc2lsLmNvbSksIFlnZ2RyYXNpbCBDb21wdXRpbmcsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogSU1QT1JUQU5UIE5PVEU6IFRoaXMgZmlsZSBtdXN0IGJlIGluY2x1ZGVkIGluIGFub3RoZXIgZmlsZSB3aGljaCBkZWZpbmVzCisgKiBhIFVOVVNVQUxfREVWIG1hY3JvIGJlZm9yZSB0aGlzIGZpbGUgaXMgaW5jbHVkZWQuCisgKi8KKworLyoKKyAqIElmIHlvdSBlZGl0IHRoaXMgZmlsZSwgcGxlYXNlIHRyeSB0byBrZWVwIGl0IHNvcnRlZCBmaXJzdCBieSBWZW5kb3JJRCwKKyAqIHRoZW4gYnkgUHJvZHVjdElELgorICoKKyAqIElmIHlvdSB3YW50IHRvIGFkZCBhbiBlbnRyeSBmb3IgdGhpcyBmaWxlLCBiZSBzdXJlIHRvIGluY2x1ZGUgdGhlCisgKiBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisgKgktIGEgcGF0Y2ggdGhhdCBhZGRzIHRoZSBlbnRyeSBmb3IgeW91ciBkZXZpY2UsIGluY2x1ZGluZyB5b3VyCisgKgkgIGVtYWlsIGFkZHJlc3MgcmlnaHQgYWJvdmUgdGhlIGVudHJ5IChwbHVzIG1heWJlIGEgYnJpZWYKKyAqCSAgZXhwbGFuYXRpb24gb2YgdGhlIHJlYXNvbiBmb3IgdGhlIGVudHJ5KSwKKyAqCS0gbHN1c2IgLXYgb3V0cHV0IGZvciB0aGUgZGV2aWNlCisgKiBTZW5kIHlvdXIgc3VibWlzc2lvbiB0byBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgorICogYW5kIGRvbid0IGZvcmdldCB0byBDQzogdGhlIFVTQiBkZXZlbG9wbWVudCBsaXN0IDxsaW51eC11c2JAdmdlci5rZXJuZWwub3JnPgorICovCisKKy8qCisgKiBUaGlzIGlzIGFuIGV4YW1wbGUgZW50cnkgZm9yIHRoZSBVU19GTF9JR05PUkVfVUFTIGZsYWcuIE9uY2Ugd2UgaGF2ZSBhbgorICogYWN0dWFsIGVudHJ5IHVzaW5nIFVTX0ZMX0lHTk9SRV9VQVMgdGhpcyBlbnRyeSBzaG91bGQgYmUgcmVtb3ZlZC4KKyAqCisgKiBVTlVTVUFMX0RFViggIDB4YWJjZCwgMHgxMjM0LCAweDAxMDAsIDB4MDEwMCwKKyAqCQkiRXhhbXBsZSIsCisgKgkJIlN0b3JhZ2Ugd2l0aCBicm9rZW4gVUFTIiwKKyAqCQlVU0JfU0NfREVWSUNFLCBVU0JfUFJfREVWSUNFLCBOVUxMLAorICoJCVVTX0ZMX0lHTk9SRV9VQVMpLAorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwppbmRleCAxYzBiODlmMi4uZjFjOTYyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCkBAIC03Miw2ICs3MiwxMCBAQAogI2luY2x1ZGUgInNpZXJyYV9tcy5oIgogI2luY2x1ZGUgIm9wdGlvbl9tcy5oIgogCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVVNCX1VBUykKKyNpbmNsdWRlICJ1YXMtZGV0ZWN0LmgiCisjZW5kaWYKKwogLyogU29tZSBpbmZvcm1hdGlvbmFsIGRhdGEgKi8KIE1PRFVMRV9BVVRIT1IoIk1hdHRoZXcgRGhhcm0gPG1kaGFybS11c2JAb25lLWV5ZWQtYWxpZW4ubmV0PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJVU0IgTWFzcyBTdG9yYWdlIGRyaXZlciBmb3IgTGludXgiKTsKQEAgLTQ1OSwxNCArNDYzLDE0IEBACiAjZGVmaW5lIFRPTE9XRVIoeCkgKCh4KSB8IDB4MjApCiAKIC8qIEFkanVzdCBkZXZpY2UgZmxhZ3MgYmFzZWQgb24gdGhlICJxdWlya3M9IiBtb2R1bGUgcGFyYW1ldGVyICovCi1zdGF0aWMgdm9pZCBhZGp1c3RfcXVpcmtzKHN0cnVjdCB1c19kYXRhICp1cykKK3ZvaWQgdXNiX3N0b3JfYWRqdXN0X3F1aXJrcyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdW5zaWduZWQgbG9uZyAqZmZsYWdzKQogewogCWNoYXIgKnA7Ci0JdTE2IHZpZCA9IGxlMTZfdG9fY3B1KHVzLT5wdXNiX2Rldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7Ci0JdTE2IHBpZCA9IGxlMTZfdG9fY3B1KHVzLT5wdXNiX2Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCXUxNiB2aWQgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwl1MTYgcGlkID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOwogCXVuc2lnbmVkIGYgPSAwOwogCXVuc2lnbmVkIGludCBtYXNrID0gKFVTX0ZMX1NBTkVfU0VOU0UgfCBVU19GTF9CQURfU0VOU0UgfAotCQkJVVNfRkxfRklYX0NBUEFDSVRZIHwKKwkJCVVTX0ZMX0ZJWF9DQVBBQ0lUWSB8IFVTX0ZMX0lHTk9SRV9VQVMgfAogCQkJVVNfRkxfQ0FQQUNJVFlfSEVVUklTVElDUyB8IFVTX0ZMX0lHTk9SRV9ERVZJQ0UgfAogCQkJVVNfRkxfTk9UX0xPQ0tBQkxFIHwgVVNfRkxfTUFYX1NFQ1RPUlNfNjQgfAogCQkJVVNfRkxfQ0FQQUNJVFlfT0sgfCBVU19GTF9JR05PUkVfUkVTSURVRSB8CkBAIC01MzcsMTQgKzU0MSwxOCBAQAogCQljYXNlICdzJzoKIAkJCWYgfD0gVVNfRkxfU0lOR0xFX0xVTjsKIAkJCWJyZWFrOworCQljYXNlICd1JzoKKwkJCWYgfD0gVVNfRkxfSUdOT1JFX1VBUzsKKwkJCWJyZWFrOwogCQljYXNlICd3JzoKIAkJCWYgfD0gVVNfRkxfTk9fV1BfREVURUNUOwogCQkJYnJlYWs7CiAJCS8qIElnbm9yZSB1bnJlY29nbml6ZWQgZmxhZyBjaGFyYWN0ZXJzICovCiAJCX0KIAl9Ci0JdXMtPmZmbGFncyA9ICh1cy0+ZmZsYWdzICYgfm1hc2spIHwgZjsKKwkqZmZsYWdzID0gKCpmZmxhZ3MgJiB+bWFzaykgfCBmOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiX3N0b3JfYWRqdXN0X3F1aXJrcyk7CiAKIC8qIEdldCB0aGUgdW51c3VhbF9kZXZzIGVudHJpZXMgYW5kIHRoZSBzdHJpbmcgZGVzY3JpcHRvcnMgKi8KIHN0YXRpYyBpbnQgZ2V0X2RldmljZV9pbmZvKHN0cnVjdCB1c19kYXRhICp1cywgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkLApAQCAtNTY0LDcgKzU3Miw3IEBACiAJCQlpZGVzYy0+YkludGVyZmFjZVByb3RvY29sIDoKIAkJCXVudXN1YWxfZGV2LT51c2VUcmFuc3BvcnQ7CiAJdXMtPmZmbGFncyA9IGlkLT5kcml2ZXJfaW5mbzsKLQlhZGp1c3RfcXVpcmtzKHVzKTsKKwl1c2Jfc3Rvcl9hZGp1c3RfcXVpcmtzKHVzLT5wdXNiX2RldiwgJnVzLT5mZmxhZ3MpOwogCiAJaWYgKHVzLT5mZmxhZ3MgJiBVU19GTF9JR05PUkVfREVWSUNFKSB7CiAJCWRldl9pbmZvKHBkZXYsICJkZXZpY2UgaWdub3JlZFxuIik7CkBAIC0xMDM1LDYgKzEwNDMsMTIgQEAKIAlpbnQgcmVzdWx0OwogCWludCBzaXplOwogCisJLyogSWYgdWFzIGlzIGVuYWJsZWQgYW5kIHRoaXMgZGV2aWNlIGNhbiBkbyB1YXMgdGhlbiBpZ25vcmUgaXQuICovCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVVNCX1VBUykKKwlpZiAodWFzX3VzZV91YXNfZHJpdmVyKGludGYsIGlkKSkKKwkJcmV0dXJuIC1FTlhJTzsKKyNlbmRpZgorCiAJLyoKIAkgKiBJZiB0aGUgZGV2aWNlIGlzbid0IHN0YW5kYXJkIChpcyBoYW5kbGVkIGJ5IGEgc3ViZHJpdmVyCiAJICogbW9kdWxlKSB0aGVuIGRvbid0IGFjY2VwdCBpdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5oCmluZGV4IDc1ZjcwZjAuLjMwN2UzMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaApAQCAtMjAxLDQgKzIwMSw3IEBACiBleHRlcm4gaW50IHVzYl9zdG9yX3Byb2JlMihzdHJ1Y3QgdXNfZGF0YSAqdXMpOwogZXh0ZXJuIHZvaWQgdXNiX3N0b3JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiAKK2V4dGVybiB2b2lkIHVzYl9zdG9yX2FkanVzdF9xdWlya3Moc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwkJdW5zaWduZWQgbG9uZyAqZmZsYWdzKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS9kZXZjb25uZWN0LmMgYi9kcml2ZXJzL3VzYi93dXNiY29yZS9kZXZjb25uZWN0LmMKaW5kZXggM2I5NTllOC4uMDY3NzEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvZGV2Y29ubmVjdC5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2RldmNvbm5lY3QuYwpAQCAtMjg0LDcgKzI4NCw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gd3VzYmhjLT5kZXY7CiAJc3RydWN0IHd1c2JfZGV2ICp3dXNiX2RldjsKIAlzdHJ1Y3Qgd3VzYl9wb3J0ICpwb3J0OwotCXVuc2lnbmVkIGlkeCwgZGV2bnVtOworCXVuc2lnbmVkIGlkeDsKIAogCW11dGV4X2xvY2soJnd1c2JoYy0+bXV0ZXgpOwogCkBAIC0zMTIsOCArMzEyLDYgQEAKIAkJZ290byBlcnJvcl91bmxvY2s7CiAJfQogCi0JZGV2bnVtID0gaWR4ICsgMjsKLQogCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgdXNpbmcgbm8gY3J5cHRvIG9uIHRoYXQgInZpcnR1YWwgcG9ydCIgKi8KIAl3dXNiaGMtPnNldF9wdGsod3VzYmhjLCBpZHgsIDAsIE5VTEwsIDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1oYy5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EtaGMuYwppbmRleCAzNjgzNjBmLi4yNTJjN2JkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1oYy5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLWhjLmMKQEAgLTc1LDggKzc1LDYgQEAKIAlpZiAod2EtPmR0aV91cmIpIHsKIAkJdXNiX2tpbGxfdXJiKHdhLT5kdGlfdXJiKTsKIAkJdXNiX3B1dF91cmIod2EtPmR0aV91cmIpOwotCQl1c2Jfa2lsbF91cmIod2EtPmJ1Zl9pbl91cmIpOwotCQl1c2JfcHV0X3VyYih3YS0+YnVmX2luX3VyYik7CiAJfQogCWtmcmVlKHdhLT5kdGlfYnVmKTsKIAl3YV9uZXBfZGVzdHJveSh3YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1oYy5oIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EtaGMuaAppbmRleCBhMmVmODRiLi5mMmE4ZDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1oYy5oCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLWhjLmgKQEAgLTEyNSw3ICsxMjUsOCBAQAogCiBlbnVtIHdhX2R0aV9zdGF0ZSB7CiAJV0FfRFRJX1RSQU5TRkVSX1JFU1VMVF9QRU5ESU5HLAotCVdBX0RUSV9JU09DX1BBQ0tFVF9TVEFUVVNfUEVORElORworCVdBX0RUSV9JU09DX1BBQ0tFVF9TVEFUVVNfUEVORElORywKKwlXQV9EVElfQlVGX0lOX0RBVEFfUEVORElORwogfTsKIAogZW51bSB3YV9xdWlya3MgewpAQCAtMTM0LDggKzEzNSwyMCBAQAogCSAqIHJlcXVlc3RzIHRvIGJlIGNvbmNhdGVuYXRlZCBhbmQgbm90IHNlbnQgYXMgc2VwYXJhdGUgcGFja2V0cy4KIAkgKi8KIAlXVVNCX1FVSVJLX0FMRVJFT05fSFdBX0NPTkNBVF9JU09DCT0gMHgwMSwKKwkvKgorCSAqIFRoZSBBbGVyZW9uIEhXQSBjYW4gYmUgaW5zdHJ1Y3RlZCB0byBub3Qgc2VuZCB0cmFuc2ZlciBub3RpZmljYXRpb25zCisJICogYXMgYW4gb3B0aW1pemF0aW9uLgorCSAqLworCVdVU0JfUVVJUktfQUxFUkVPTl9IV0FfRElTQUJMRV9YRkVSX05PVElGSUNBVElPTlMJPSAweDAyLAogfTsKIAorZW51bSB3YV92ZW5kb3Jfc3BlY2lmaWNfcmVxdWVzdHMgeworCVdBX1JFUV9BTEVSRU9OX0RJU0FCTEVfWEZFUl9OT1RJRklDQVRJT05TID0gMHg0QywKKwlXQV9SRVFfQUxFUkVPTl9GRUFUVVJFX1NFVCA9IDB4MDEsCisJV0FfUkVRX0FMRVJFT05fRkVBVFVSRV9DTEVBUiA9IDB4MDAsCit9OworCisjZGVmaW5lIFdBX01BWF9CVUZfSU5fVVJCUwk0CiAvKioKICAqIEluc3RhbmNlIG9mIGEgSFdBIEhvc3QgQ29udHJvbGxlcgogICoKQEAgLTIwNiw3ICsyMTksOSBAQAogCXUzMiBkdGlfaXNvY194ZmVyX2luX3Byb2dyZXNzOwogCXU4ICBkdGlfaXNvY194ZmVyX3NlZzsKIAlzdHJ1Y3QgdXJiICpkdGlfdXJiOwkJLyogVVJCIGZvciByZWFkaW5nIHhmZXIgcmVzdWx0cyAqLwotCXN0cnVjdCB1cmIgKmJ1Zl9pbl91cmI7CQkvKiBVUkIgZm9yIHJlYWRpbmcgZGF0YSBpbiAqLworCQkJCQkvKiBVUkJzIGZvciByZWFkaW5nIGRhdGEgaW4gKi8KKwlzdHJ1Y3QgdXJiIGJ1Zl9pbl91cmJzW1dBX01BWF9CVUZfSU5fVVJCU107CisJaW50IGFjdGl2ZV9idWZfaW5fdXJiczsJCS8qIG51bWJlciBvZiBidWZfaW5fdXJicyBhY3RpdmUuICovCiAJc3RydWN0IGVkYyBkdGlfZWRjOwkJLyogRFRJIGVycm9yIGRlbnNpdHkgY291bnRlciAqLwogCXZvaWQgKmR0aV9idWY7CiAJc2l6ZV90IGR0aV9idWZfc2l6ZTsKQEAgLTIzNCw2ICsyNDksNyBAQAogZXh0ZXJuIGludCB3YV9jcmVhdGUoc3RydWN0IHdhaGMgKndhLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UsCiAJa2VybmVsX3Vsb25nX3QpOwogZXh0ZXJuIHZvaWQgX193YV9kZXN0cm95KHN0cnVjdCB3YWhjICp3YSk7CitleHRlcm4gaW50IHdhX2R0aV9zdGFydChzdHJ1Y3Qgd2FoYyAqd2EpOwogdm9pZCB3YV9yZXNldF9hbGwoc3RydWN0IHdhaGMgKndhKTsKIAogCkBAIC0yNzUsNiArMjkxLDggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHdhX2luaXQoc3RydWN0IHdhaGMgKndhKQogeworCWludCBpbmRleDsKKwogCWVkY19pbml0KCZ3YS0+bmVwX2VkYyk7CiAJYXRvbWljX3NldCgmd2EtPm5vdGlmc19xdWV1ZWQsIDApOwogCXdhLT5kdGlfc3RhdGUgPSBXQV9EVElfVFJBTlNGRVJfUkVTVUxUX1BFTkRJTkc7CkBAIC0yODgsNiArMzA2LDEwIEBACiAJSU5JVF9XT1JLKCZ3YS0+eGZlcl9lcnJvcl93b3JrLCB3YV9wcm9jZXNzX2Vycm9yZWRfdHJhbnNmZXJzX3J1bik7CiAJd2EtPmR0b19pbl91c2UgPSAwOwogCWF0b21pY19zZXQoJndhLT54ZmVyX2lkX2NvdW50LCAxKTsKKwkvKiBpbml0IHRoZSBidWYgaW4gVVJCcyAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFdBX01BWF9CVUZfSU5fVVJCUzsgKytpbmRleCkKKwkJdXNiX2luaXRfdXJiKCYod2EtPmJ1Zl9pbl91cmJzW2luZGV4XSkpOworCXdhLT5hY3RpdmVfYnVmX2luX3VyYnMgPSAwOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXJwaXBlLmMgYi9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1ycGlwZS5jCmluZGV4IDZjYTgwYTQuLjZkNmRhMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXJwaXBlLmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EtcnBpcGUuYwpAQCAtMjk4LDcgKzI5OCw3IEBACiAJCQlicmVhazsKIAkJfQogCQlpdHIgKz0gaGRyLT5iTGVuZ3RoOwotCQlpdHJfc2l6ZSAtPSBoZHItPmJEZXNjcmlwdG9yVHlwZTsKKwkJaXRyX3NpemUgLT0gaGRyLT5iTGVuZ3RoOwogCX0KIG91dDoKIAlyZXR1cm4gZXBjZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXhmZXIuYyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXhmZXIuYwppbmRleCAzY2Q5NmU5Li5jOGUyYTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS14ZmVyLmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EteGZlci5jCkBAIC0xNjcsNiArMTY3LDggQEAKIAogc3RhdGljIHZvaWQgX193YV9wb3B1bGF0ZV9kdG9fdXJiX2lzb2Moc3RydWN0IHdhX3hmZXIgKnhmZXIsCiAJc3RydWN0IHdhX3NlZyAqc2VnLCBpbnQgY3Vycl9pc29fZnJhbWUpOworc3RhdGljIHZvaWQgd2FfY29tcGxldGVfcmVtYWluaW5nX3hmZXJfc2VncyhzdHJ1Y3Qgd2FfeGZlciAqeGZlciwKKwkJaW50IHN0YXJ0aW5nX2luZGV4LCBlbnVtIHdhX3NlZ19zdGF0dXMgc3RhdHVzKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHdhX3hmZXJfaW5pdChzdHJ1Y3Qgd2FfeGZlciAqeGZlcikKIHsKQEAgLTM2NywxMyArMzY5LDEzIEBACiAJCQlicmVhazsKIAkJY2FzZSBXQV9TRUdfRVJST1I6CiAJCQl4ZmVyLT5yZXN1bHQgPSBzZWctPnJlc3VsdDsKLQkJCWRldl9kYmcoZGV2LCAieGZlciAlcCBJRCAlMDhYIyV1OiBFUlJPUiByZXN1bHQgJXp1KDB4JTA4elgpXG4iLAorCQkJZGV2X2RiZyhkZXYsICJ4ZmVyICVwIElEICUwOFgjJXU6IEVSUk9SIHJlc3VsdCAlemkoMHglMDh6WClcbiIsCiAJCQkJeGZlciwgd2FfeGZlcl9pZCh4ZmVyKSwgc2VnLT5pbmRleCwgc2VnLT5yZXN1bHQsCiAJCQkJc2VnLT5yZXN1bHQpOwogCQkJZ290byBvdXQ7CiAJCWNhc2UgV0FfU0VHX0FCT1JURUQ6CiAJCQl4ZmVyLT5yZXN1bHQgPSBzZWctPnJlc3VsdDsKLQkJCWRldl9kYmcoZGV2LCAieGZlciAlcCBJRCAlMDhYIyV1OiBBQk9SVEVEIHJlc3VsdCAlenUoMHglMDh6WClcbiIsCisJCQlkZXZfZGJnKGRldiwgInhmZXIgJXAgSUQgJTA4WCMldTogQUJPUlRFRCByZXN1bHQgJXppKDB4JTA4elgpXG4iLAogCQkJCXhmZXIsIHdhX3hmZXJfaWQoeGZlciksIHNlZy0+aW5kZXgsIHNlZy0+cmVzdWx0LAogCQkJCXNlZy0+cmVzdWx0KTsKIAkJCWdvdG8gb3V0OwpAQCAtMzkwLDYgKzM5MiwyNCBAQAogfQogCiAvKgorICogTWFyayB0aGUgZ2l2ZW4gc2VnbWVudCBhcyBkb25lLiAgUmV0dXJuIHRydWUgaWYgdGhpcyBjb21wbGV0ZXMgdGhlIHhmZXIuCisgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3Igc2VncyB0aGF0IGhhdmUgYmVlbiBzdWJtaXR0ZWQgdG8gYW4gUlBJUEUuCisgKiBEZWxheWVkIHNlZ3MgYXJlIG5vdCBtYXJrZWQgYXMgc3VibWl0dGVkIHNvIHRoZXkgZG8gbm90IG5lZWQgdG8gYmUgbWFya2VkCisgKiBhcyBkb25lIHdoZW4gY2xlYW5pbmcgdXAuCisgKgorICogeGZlci0+bG9jayBoYXMgdG8gYmUgbG9ja2VkCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBfX3dhX3hmZXJfbWFya19zZWdfYXNfZG9uZShzdHJ1Y3Qgd2FfeGZlciAqeGZlciwKKwlzdHJ1Y3Qgd2Ffc2VnICpzZWcsIGVudW0gd2Ffc2VnX3N0YXR1cyBzdGF0dXMpCit7CisJc2VnLT5zdGF0dXMgPSBzdGF0dXM7CisJeGZlci0+c2Vnc19kb25lKys7CisKKwkvKiBjaGVjayBmb3IgZG9uZS4gKi8KKwlyZXR1cm4gX193YV94ZmVyX2lzX2RvbmUoeGZlcik7Cit9CisKKy8qCiAgKiBTZWFyY2ggZm9yIGEgdHJhbnNmZXIgbGlzdCBJRCBvbiB0aGUgSENEJ3MgVVJCIGxpc3QKICAqCiAgKiBGb3IgMzIgYml0IGFyY2hpdGVjdHVyZXMsIHdlIHVzZSB0aGUgcG9pbnRlciBpdHNlbGY7IGZvciA2NCBiaXRzLCBhCkBAIC00MTYsMTIgKzQzNiw1MSBAQAogCiBzdHJ1Y3Qgd2FfeGZlcl9hYm9ydF9idWZmZXIgewogCXN0cnVjdCB1cmIgdXJiOworCXN0cnVjdCB3YWhjICp3YTsKIAlzdHJ1Y3Qgd2FfeGZlcl9hYm9ydCBjbWQ7CiB9OwogCiBzdGF0aWMgdm9pZCBfX3dhX3hmZXJfYWJvcnRfY2Ioc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCB3YV94ZmVyX2Fib3J0X2J1ZmZlciAqYiA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgd2FoYyAqd2EgPSBiLT53YTsKKworCS8qCisJICogSWYgdGhlIGFib3J0IHJlcXVlc3QgVVJCIGZhaWxlZCwgdGhlbiB0aGUgSFdBIGRpZCBub3QgZ2V0IHRoZSBhYm9ydAorCSAqIGNvbW1hbmQuICBGb3JjaWJseSBjbGVhbiB1cCB0aGUgeGZlciB3aXRob3V0IHdhaXRpbmcgZm9yIGEgVHJhbnNmZXIKKwkgKiBSZXN1bHQgZnJvbSB0aGUgSFdBLgorCSAqLworCWlmICh1cmItPnN0YXR1cyA8IDApIHsKKwkJc3RydWN0IHdhX3hmZXIgKnhmZXI7CisJCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ3YS0+dXNiX2lmYWNlLT5kZXY7CisKKwkJeGZlciA9IHdhX3hmZXJfZ2V0X2J5X2lkKHdhLCBsZTMyX3RvX2NwdShiLT5jbWQuZHdUcmFuc2ZlcklEKSk7CisJCWRldl9lcnIoZGV2LCAiJXM6IFRyYW5zZmVyIEFib3J0IHJlcXVlc3QgZmFpbGVkLiByZXN1bHQ6ICVkXG4iLAorCQkJX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJaWYgKHhmZXIpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQlpbnQgZG9uZTsKKwkJCXN0cnVjdCB3YV9ycGlwZSAqcnBpcGUgPSB4ZmVyLT5lcC0+aGNwcml2OworCisJCQlkZXZfZXJyKGRldiwgIiVzOiBjbGVhbmluZyB1cCB4ZmVyICVwIElEIDB4JTA4WC5cbiIsCisJCQkJX19mdW5jX18sIHhmZXIsIHdhX3hmZXJfaWQoeGZlcikpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnhmZXItPmxvY2ssIGZsYWdzKTsKKwkJCS8qIG1hcmsgYWxsIHNlZ3MgYXMgYWJvcnRlZC4gKi8KKwkJCXdhX2NvbXBsZXRlX3JlbWFpbmluZ194ZmVyX3NlZ3MoeGZlciwgMCwKKwkJCQlXQV9TRUdfQUJPUlRFRCk7CisJCQlkb25lID0gX193YV94ZmVyX2lzX2RvbmUoeGZlcik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoZG9uZSkKKwkJCQl3YV94ZmVyX2NvbXBsZXRpb24oeGZlcik7CisJCQl3YV94ZmVyX2RlbGF5ZWRfcnVuKHJwaXBlKTsKKwkJCXdhX3hmZXJfcHV0KHhmZXIpOworCQl9IGVsc2UgeworCQkJZGV2X2VycihkZXYsICIlczogeGZlciBJRCAweCUwOFggYWxyZWFkeSBnb25lLlxuIiwKKwkJCQkgX19mdW5jX18sIGxlMzJfdG9fY3B1KGItPmNtZC5kd1RyYW5zZmVySUQpKTsKKwkJfQorCX0KKworCXdhX3B1dCh3YSk7CS8qIHRha2VuIGluIF9fd2FfeGZlcl9hYm9ydCAqLwogCXVzYl9wdXRfdXJiKCZiLT51cmIpOwogfQogCkBAIC00NDksNiArNTA4LDcgQEAKIAliLT5jbWQuYlJlcXVlc3RUeXBlID0gV0FfWEZFUl9BQk9SVDsKIAliLT5jbWQud1JQaXBlID0gcnBpcGUtPmRlc2NyLndSUGlwZUluZGV4OwogCWItPmNtZC5kd1RyYW5zZmVySUQgPSB3YV94ZmVyX2lkX2xlMzIoeGZlcik7CisJYi0+d2EgPSB3YV9nZXQoeGZlci0+d2EpOwogCiAJdXNiX2luaXRfdXJiKCZiLT51cmIpOwogCXVzYl9maWxsX2J1bGtfdXJiKCZiLT51cmIsIHhmZXItPndhLT51c2JfZGV2LApAQCAtNDYyLDYgKzUyMiw3IEBACiAKIAogZXJyb3Jfc3VibWl0OgorCXdhX3B1dCh4ZmVyLT53YSk7CiAJaWYgKHByaW50a19yYXRlbGltaXQoKSkKIAkJZGV2X2VycihkZXYsICJ4ZmVyICVwOiBDYW4ndCBzdWJtaXQgYWJvcnQgcmVxdWVzdDogJWRcbiIsCiAJCQl4ZmVyLCByZXN1bHQpOwpAQCAtNzMzLDYgKzc5NCw4IEBACiAJCQkJc2VnLT5pc29jX2ZyYW1lX29mZnNldCArIHNlZy0+aXNvY19mcmFtZV9pbmRleCk7CiAKIAkJCS8qIHJlc3VibWl0IHRoZSBVUkIgd2l0aCB0aGUgbmV4dCBpc29jIGZyYW1lLiAqLworCQkJLyogdGFrZSBhIHJlZiBvbiByZXN1Ym1pdC4gKi8KKwkJCXdhX3hmZXJfZ2V0KHhmZXIpOwogCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIoc2VnLT5kdG9fdXJiLCBHRlBfQVRPTUlDKTsKIAkJCWlmIChyZXN1bHQgPCAwKSB7CiAJCQkJZGV2X2VycihkZXYsICJ4ZmVyIDB4JTA4WCMldTogRFRPIHN1Ym1pdCBmYWlsZWQ6ICVkXG4iLApAQCAtNzYwLDkgKzgyMywxMyBAQAogCQlnb3RvIGVycm9yX2RlZmF1bHQ7CiAJfQogCisJLyogdGFrZW4gd2hlbiB0aGlzIFVSQiB3YXMgc3VibWl0dGVkLiAqLworCXdhX3hmZXJfcHV0KHhmZXIpOwogCXJldHVybjsKIAogZXJyb3JfZHRvX3N1Ym1pdDoKKwkvKiB0YWtlbiBvbiByZXN1Ym1pdCBhdHRlbXB0LiAqLworCXdhX3hmZXJfcHV0KHhmZXIpOwogZXJyb3JfZGVmYXVsdDoKIAlzcGluX2xvY2tfaXJxc2F2ZSgmeGZlci0+bG9jaywgZmxhZ3MpOwogCXJwaXBlID0geGZlci0+ZXAtPmhjcHJpdjsKQEAgLTc3MiwxMiArODM5LDEwIEBACiAJCXdhX3Jlc2V0X2FsbCh3YSk7CiAJfQogCWlmIChzZWctPnN0YXR1cyAhPSBXQV9TRUdfRVJST1IpIHsKLQkJc2VnLT5zdGF0dXMgPSBXQV9TRUdfRVJST1I7CiAJCXNlZy0+cmVzdWx0ID0gdXJiLT5zdGF0dXM7Ci0JCXhmZXItPnNlZ3NfZG9uZSsrOwogCQlfX3dhX3hmZXJfYWJvcnQoeGZlcik7CiAJCXJwaXBlX3JlYWR5ID0gcnBpcGVfYXZhaWxfaW5jKHJwaXBlKTsKLQkJZG9uZSA9IF9fd2FfeGZlcl9pc19kb25lKHhmZXIpOworCQlkb25lID0gX193YV94ZmVyX21hcmtfc2VnX2FzX2RvbmUoeGZlciwgc2VnLCBXQV9TRUdfRVJST1IpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CiAJaWYgKGhvbGRpbmdfZHRvKSB7CkBAIC03ODgsNyArODUzLDggQEAKIAkJd2FfeGZlcl9jb21wbGV0aW9uKHhmZXIpOwogCWlmIChycGlwZV9yZWFkeSkKIAkJd2FfeGZlcl9kZWxheWVkX3J1bihycGlwZSk7Ci0KKwkvKiB0YWtlbiB3aGVuIHRoaXMgVVJCIHdhcyBzdWJtaXR0ZWQuICovCisJd2FfeGZlcl9wdXQoeGZlcik7CiB9CiAKIC8qCkBAIC04NDIsMTIgKzkwOCwxMSBAQAogCQl9CiAJCWlmIChzZWctPnN0YXR1cyAhPSBXQV9TRUdfRVJST1IpIHsKIAkJCXVzYl91bmxpbmtfdXJiKHNlZy0+ZHRvX3VyYik7Ci0JCQlzZWctPnN0YXR1cyA9IFdBX1NFR19FUlJPUjsKIAkJCXNlZy0+cmVzdWx0ID0gdXJiLT5zdGF0dXM7Ci0JCQl4ZmVyLT5zZWdzX2RvbmUrKzsKIAkJCV9fd2FfeGZlcl9hYm9ydCh4ZmVyKTsKIAkJCXJwaXBlX3JlYWR5ID0gcnBpcGVfYXZhaWxfaW5jKHJwaXBlKTsKLQkJCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKKwkJCWRvbmUgPSBfX3dhX3hmZXJfbWFya19zZWdfYXNfZG9uZSh4ZmVyLCBzZWcsCisJCQkJCVdBX1NFR19FUlJPUik7CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGZlci0+bG9jaywgZmxhZ3MpOwogCQlpZiAoZG9uZSkKQEAgLTg1NSw2ICs5MjAsOCBAQAogCQlpZiAocnBpcGVfcmVhZHkpCiAJCQl3YV94ZmVyX2RlbGF5ZWRfcnVuKHJwaXBlKTsKIAl9CisJLyogdGFrZW4gd2hlbiB0aGlzIFVSQiB3YXMgc3VibWl0dGVkLiAqLworCXdhX3hmZXJfcHV0KHhmZXIpOwogfQogCiAvKgpAQCAtOTE5LDE4ICs5ODYsMTggQEAKIAkJfQogCQl1c2JfdW5saW5rX3VyYihzZWctPmlzb2NfcGFja19kZXNjX3VyYik7CiAJCXVzYl91bmxpbmtfdXJiKHNlZy0+ZHRvX3VyYik7Ci0JCXNlZy0+c3RhdHVzID0gV0FfU0VHX0VSUk9SOwogCQlzZWctPnJlc3VsdCA9IHVyYi0+c3RhdHVzOwotCQl4ZmVyLT5zZWdzX2RvbmUrKzsKIAkJX193YV94ZmVyX2Fib3J0KHhmZXIpOwogCQlycGlwZV9yZWFkeSA9IHJwaXBlX2F2YWlsX2luYyhycGlwZSk7Ci0JCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKKwkJZG9uZSA9IF9fd2FfeGZlcl9tYXJrX3NlZ19hc19kb25lKHhmZXIsIHNlZywgV0FfU0VHX0VSUk9SKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGZlci0+bG9jaywgZmxhZ3MpOwogCQlpZiAoZG9uZSkKIAkJCXdhX3hmZXJfY29tcGxldGlvbih4ZmVyKTsKIAkJaWYgKHJwaXBlX3JlYWR5KQogCQkJd2FfeGZlcl9kZWxheWVkX3J1bihycGlwZSk7CiAJfQorCS8qIHRha2VuIHdoZW4gdGhpcyBVUkIgd2FzIHN1Ym1pdHRlZC4gKi8KKwl3YV94ZmVyX3B1dCh4ZmVyKTsKIH0KIAogLyoKQEAgLTk0MCw3ICsxMDA3LDcgQEAKICAqLwogc3RhdGljIHN0cnVjdCBzY2F0dGVybGlzdCAqd2FfeGZlcl9jcmVhdGVfc3Vic2V0X3NnKHN0cnVjdCBzY2F0dGVybGlzdCAqaW5fc2csCiAJY29uc3QgdW5zaWduZWQgaW50IGJ5dGVzX3RyYW5zZmVycmVkLAotCWNvbnN0IHVuc2lnbmVkIGludCBieXRlc190b190cmFuc2ZlciwgdW5zaWduZWQgaW50ICpvdXRfbnVtX3NncykKKwljb25zdCB1bnNpZ25lZCBpbnQgYnl0ZXNfdG9fdHJhbnNmZXIsIGludCAqb3V0X251bV9zZ3MpCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpvdXRfc2c7CiAJdW5zaWduZWQgaW50IGJ5dGVzX3Byb2Nlc3NlZCA9IDAsIG9mZnNldF9pbnRvX2N1cnJlbnRfcGFnZV9kYXRhID0gMCwKQEAgLTEwOTQsMTQgKzExNjEsMTMgQEAKICAqLwogc3RhdGljIGludCBfX3dhX3hmZXJfc2V0dXBfc2VncyhzdHJ1Y3Qgd2FfeGZlciAqeGZlciwgc2l6ZV90IHhmZXJfaGRyX3NpemUpCiB7Ci0JaW50IHJlc3VsdCwgY250LCBpc29fZnJhbWVfb2Zmc2V0OworCWludCByZXN1bHQsIGNudCwgaXNvY19mcmFtZV9vZmZzZXQgPSAwOwogCXNpemVfdCBhbGxvY19zaXplID0gc2l6ZW9mKCp4ZmVyLT5zZWdbMF0pCiAJCS0gc2l6ZW9mKHhmZXItPnNlZ1swXS0+eGZlcl9oZHIpICsgeGZlcl9oZHJfc2l6ZTsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IHhmZXItPndhLT51c2JfZGV2OwogCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZHRvX2VwZCA9IHhmZXItPndhLT5kdG9fZXBkOwogCXN0cnVjdCB3YV9zZWcgKnNlZzsKIAlzaXplX3QgYnVmX2l0ciwgYnVmX3NpemUsIGJ1Zl9pdHJfc2l6ZTsKLQlpbnQgaXNvY19mcmFtZV9vZmZzZXQgPSAwOwogCiAJcmVzdWx0ID0gLUVOT01FTTsKIAl4ZmVyLT5zZWcgPSBrY2FsbG9jKHhmZXItPnNlZ3MsIHNpemVvZih4ZmVyLT5zZWdbMF0pLCBHRlBfQVRPTUlDKTsKQEAgLTExMDksNyArMTE3NSw2IEBACiAJCWdvdG8gZXJyb3Jfc2Vnc19remFsbG9jOwogCWJ1Zl9pdHIgPSAwOwogCWJ1Zl9zaXplID0geGZlci0+dXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOwotCWlzb19mcmFtZV9vZmZzZXQgPSAwOwogCWZvciAoY250ID0gMDsgY250IDwgeGZlci0+c2VnczsgY250KyspIHsKIAkJc2l6ZV90IGlzb19wa3RfZGVzY3Jfc2l6ZSA9IDA7CiAJCWludCBzZWdfaXNvY19mcmFtZV9jb3VudCA9IDAsIHNlZ19pc29jX3NpemUgPSAwOwpAQCAtMTMxOCwzMCArMTM4Myw0MSBAQAogCS8qIGRlZmF1bHQgdG8gZG9uZSB1bmxlc3Mgd2UgZW5jb3VudGVyIGEgbXVsdGktZnJhbWUgaXNvYyBzZWdtZW50LiAqLwogCSpkdG9fZG9uZSA9IDE7CiAKKwkvKgorCSAqIFRha2UgYSByZWYgZm9yIGVhY2ggc2VnbWVudCB1cmIgc28gdGhlIHhmZXIgY2Fubm90IGRpc2FwcGVhciB1bnRpbAorCSAqIGFsbCBvZiB0aGUgY2FsbGJhY2tzIHJ1bi4KKwkgKi8KKwl3YV94ZmVyX2dldCh4ZmVyKTsKIAkvKiBzdWJtaXQgdGhlIHRyYW5zZmVyIHJlcXVlc3QuICovCisJc2VnLT5zdGF0dXMgPSBXQV9TRUdfU1VCTUlUVEVEOwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKCZzZWctPnRyX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCA8IDApIHsKIAkJcHJfZXJyKCIlczogeGZlciAlcCMldTogUkVRIHN1Ym1pdCBmYWlsZWQ6ICVkXG4iLAogCQkgICAgICAgX19mdW5jX18sIHhmZXIsIHNlZy0+aW5kZXgsIHJlc3VsdCk7Ci0JCWdvdG8gZXJyb3Jfc2VnX3N1Ym1pdDsKKwkJd2FfeGZlcl9wdXQoeGZlcik7CisJCWdvdG8gZXJyb3JfdHJfc3VibWl0OwogCX0KIAkvKiBzdWJtaXQgdGhlIGlzb2MgcGFja2V0IGRlc2NyaXB0b3IgaWYgcHJlc2VudC4gKi8KIAlpZiAoc2VnLT5pc29jX3BhY2tfZGVzY191cmIpIHsKKwkJd2FfeGZlcl9nZXQoeGZlcik7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHNlZy0+aXNvY19wYWNrX2Rlc2NfdXJiLCBHRlBfQVRPTUlDKTsKIAkJc2VnLT5pc29jX2ZyYW1lX2luZGV4ID0gMDsKIAkJaWYgKHJlc3VsdCA8IDApIHsKIAkJCXByX2VycigiJXM6IHhmZXIgJXAjJXU6IElTTyBwYWNrZXQgZGVzY3JpcHRvciBzdWJtaXQgZmFpbGVkOiAlZFxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXywgeGZlciwgc2VnLT5pbmRleCwgcmVzdWx0KTsKKwkJCXdhX3hmZXJfcHV0KHhmZXIpOwogCQkJZ290byBlcnJvcl9pc29fcGFja19kZXNjX3N1Ym1pdDsKIAkJfQogCX0KIAkvKiBzdWJtaXQgdGhlIG91dCBkYXRhIGlmIHRoaXMgaXMgYW4gb3V0IHJlcXVlc3QuICovCiAJaWYgKHNlZy0+ZHRvX3VyYikgewogCQlzdHJ1Y3Qgd2FoYyAqd2EgPSB4ZmVyLT53YTsKKwkJd2FfeGZlcl9nZXQoeGZlcik7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHNlZy0+ZHRvX3VyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyZXN1bHQgPCAwKSB7CiAJCQlwcl9lcnIoIiVzOiB4ZmVyICVwIyV1OiBEVE8gc3VibWl0IGZhaWxlZDogJWRcbiIsCiAJCQkgICAgICAgX19mdW5jX18sIHhmZXIsIHNlZy0+aW5kZXgsIHJlc3VsdCk7CisJCQl3YV94ZmVyX3B1dCh4ZmVyKTsKIAkJCWdvdG8gZXJyb3JfZHRvX3N1Ym1pdDsKIAkJfQogCQkvKgpAQCAtMTM1Myw3ICsxNDI5LDYgQEAKIAkJCSYmIChzZWctPmlzb2NfZnJhbWVfY291bnQgPiAxKSkKIAkJCSpkdG9fZG9uZSA9IDA7CiAJfQotCXNlZy0+c3RhdHVzID0gV0FfU0VHX1NVQk1JVFRFRDsKIAlycGlwZV9hdmFpbF9kZWMocnBpcGUpOwogCXJldHVybiAwOwogCkBAIC0xMzYxLDcgKzE0MzYsNyBAQAogCXVzYl91bmxpbmtfdXJiKHNlZy0+aXNvY19wYWNrX2Rlc2NfdXJiKTsKIGVycm9yX2lzb19wYWNrX2Rlc2Nfc3VibWl0OgogCXVzYl91bmxpbmtfdXJiKCZzZWctPnRyX3VyYik7Ci1lcnJvcl9zZWdfc3VibWl0OgorZXJyb3JfdHJfc3VibWl0OgogCXNlZy0+c3RhdHVzID0gV0FfU0VHX0VSUk9SOwogCXNlZy0+cmVzdWx0ID0gcmVzdWx0OwogCSpkdG9fZG9uZSA9IDE7CkBAIC0xMzkzLDYgKzE0NjgsMTIgQEAKIAkJCQkgbGlzdF9ub2RlKTsKIAkJbGlzdF9kZWwoJnNlZy0+bGlzdF9ub2RlKTsKIAkJeGZlciA9IHNlZy0+eGZlcjsKKwkJLyoKKwkJICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSB4ZmVyIGluIGNhc2UgdGhlIGNhbGxiYWNrcyBmb3IgdGhlCisJCSAqIFVSQnMgc3VibWl0dGVkIGJ5IF9fd2Ffc2VnX3N1Ym1pdCBhdHRlbXB0IHRvIGNvbXBsZXRlCisJCSAqIHRoZSB4ZmVyIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNvbXBsZXRlcy4KKwkJICovCisJCXdhX3hmZXJfZ2V0KHhmZXIpOwogCQlyZXN1bHQgPSBfX3dhX3NlZ19zdWJtaXQocnBpcGUsIHhmZXIsIHNlZywgJmR0b19kb25lKTsKIAkJLyogcmVsZWFzZSB0aGUgZHRvIHJlc291cmNlIGlmIHRoaXMgUlBJUEUgaXMgZG9uZSB3aXRoIGl0LiAqLwogCQlpZiAoZHRvX2RvbmUpCkBAIC0xNDAxLDEzICsxNDgyLDIzIEBACiAJCQl4ZmVyLCB3YV94ZmVyX2lkKHhmZXIpLCBzZWctPmluZGV4LAogCQkJYXRvbWljX3JlYWQoJnJwaXBlLT5zZWdzX2F2YWlsYWJsZSksIHJlc3VsdCk7CiAJCWlmICh1bmxpa2VseShyZXN1bHQgPCAwKSkgeworCQkJaW50IGRvbmU7CisKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwaXBlLT5zZWdfbG9jaywgZmxhZ3MpOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnhmZXItPmxvY2ssIGZsYWdzKTsKIAkJCV9fd2FfeGZlcl9hYm9ydCh4ZmVyKTsKKwkJCS8qCisJCQkgKiBUaGlzIHNlZyB3YXMgbWFya2VkIGFzIHN1Ym1pdHRlZCB3aGVuIGl0IHdhcyBwdXQgb24KKwkJCSAqIHRoZSBSUElQRSBzZWdfbGlzdC4gIE1hcmsgaXQgZG9uZS4KKwkJCSAqLwogCQkJeGZlci0+c2Vnc19kb25lKys7CisJCQlkb25lID0gX193YV94ZmVyX2lzX2RvbmUoeGZlcik7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoZG9uZSkKKwkJCQl3YV94ZmVyX2NvbXBsZXRpb24oeGZlcik7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnBpcGUtPnNlZ19sb2NrLCBmbGFncyk7CiAJCX0KKwkJd2FfeGZlcl9wdXQoeGZlcik7CiAJfQogCS8qCiAJICogTWFyayB0aGlzIFJQSVBFIGFzIHdhaXRpbmcgaWYgZHRvIHdhcyBub3QgYWNxdWlyZWQsIHRoZXJlIGFyZQpAQCAtMTU5MiwxMiArMTY4MywxOSBAQAogCQlkZXZfZXJyKCYodXJiLT5kZXYtPmRldiksICIlczogZXJyb3JfeGZlcl9zZXR1cFxuIiwgX19mdW5jX18pOwogCQlnb3RvIGVycm9yX3hmZXJfc2V0dXA7CiAJfQorCS8qCisJICogR2V0IGEgeGZlciByZWZlcmVuY2Ugc2luY2UgX193YV94ZmVyX3N1Ym1pdCBzdGFydHMgYXN5bmNocm9ub3VzCisJICogb3BlcmF0aW9ucyB0aGF0IG1heSB0cnkgdG8gY29tcGxldGUgdGhlIHhmZXIgYmVmb3JlIHRoaXMgZnVuY3Rpb24KKwkgKiBleGl0cy4KKwkgKi8KKwl3YV94ZmVyX2dldCh4ZmVyKTsKIAlyZXN1bHQgPSBfX3dhX3hmZXJfc3VibWl0KHhmZXIpOwogCWlmIChyZXN1bHQgPCAwKSB7CiAJCWRldl9lcnIoJih1cmItPmRldi0+ZGV2KSwgIiVzOiBlcnJvcl94ZmVyX3N1Ym1pdFxuIiwgX19mdW5jX18pOwogCQlnb3RvIGVycm9yX3hmZXJfc3VibWl0OwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CisJd2FfeGZlcl9wdXQoeGZlcik7CiAJcmV0dXJuIDA7CiAKIAkvKgpAQCAtMTYyMyw2ICsxNzIxLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CiAJaWYgKGRvbmUpCiAJCXdhX3hmZXJfY29tcGxldGlvbih4ZmVyKTsKKwl3YV94ZmVyX3B1dCh4ZmVyKTsKIAkvKiByZXR1cm4gc3VjY2VzcyBzaW5jZSB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdpbGwgcnVuLiAqLwogCXJldHVybiAwOwogfQpAQCAtMTgzMiwyMCArMTkzMSwyMCBAQAogCS8qIGNoZWNrIGlmIGl0IGlzIHNhZmUgdG8gdW5saW5rLiAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZ3YS0+eGZlcl9saXN0X2xvY2ssIGZsYWdzKTsKIAlyZXN1bHQgPSB1c2JfaGNkX2NoZWNrX3VubGlua191cmIoJih3YS0+d3VzYi0+dXNiX2hjZCksIHVyYiwgc3RhdHVzKTsKKwlpZiAoKHJlc3VsdCA9PSAwKSAmJiB1cmItPmhjcHJpdikgeworCQkvKgorCQkgKiBHZXQgYSB4ZmVyIHJlZiB0byBwcmV2ZW50IGEgcmFjZSB3aXRoIHdhX3hmZXJfZ2l2ZWJhY2sKKwkJICogY2xlYW5pbmcgdXAgdGhlIHhmZXIgd2hpbGUgd2UgYXJlIHdvcmtpbmcgd2l0aCBpdC4KKwkJICovCisJCXdhX3hmZXJfZ2V0KHVyYi0+aGNwcml2KTsKKwl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2EtPnhmZXJfbGlzdF9sb2NrLCBmbGFncyk7CiAJaWYgKHJlc3VsdCkKIAkJcmV0dXJuIHJlc3VsdDsKIAogCXhmZXIgPSB1cmItPmhjcHJpdjsKLQlpZiAoeGZlciA9PSBOVUxMKSB7Ci0JCS8qCi0JCSAqIE5vdGhpbmcgc2V0dXAgeWV0IGVucXVldWUgd2lsbCBzZWUgdXJiLT5zdGF0dXMgIT0KLQkJICogLUVJTlBST0dSRVNTIChieSBoY2QgbGF5ZXIpIGFuZCBiYWlsIG91dCB3aXRoCi0JCSAqIGVycm9yLCBubyBuZWVkIHRvIGRvIGNvbXBsZXRpb24KLQkJICovCi0JCUJVR19PTih1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKHhmZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnhmZXItPmxvY2ssIGZsYWdzKTsKIAlwcl9kZWJ1ZygiJXM6IERFUVVFVUUgeGZlciBpZCAweCUwOFhcbiIsIF9fZnVuY19fLCB3YV94ZmVyX2lkKHhmZXIpKTsKIAlycGlwZSA9IHhmZXItPmVwLT5oY3ByaXY7CkBAIC0xODU2LDYgKzE5NTUsMTYgQEAKIAkJcmVzdWx0ID0gLUVOT0VOVDsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KKwkvKgorCSAqIENoZWNrIGZvciBkb25lIHRvIGF2b2lkIHJhY2luZyB3aXRoIHdhX3hmZXJfZ2l2ZWJhY2sgYW5kIGNvbXBsZXRpbmcKKwkgKiB0d2ljZS4KKwkgKi8KKwlpZiAoX193YV94ZmVyX2lzX2RvbmUoeGZlcikpIHsKKwkJcHJfZGVidWcoIiVzOiB4ZmVyICVwIGlkIDB4JTA4WCBhbHJlYWR5IGRvbmUuXG4iLCBfX2Z1bmNfXywKKwkJCXhmZXIsIHdhX3hmZXJfaWQoeGZlcikpOworCQlyZXN1bHQgPSAtRU5PRU5UOworCQlnb3RvIG91dF91bmxvY2s7CisJfQogCS8qIENoZWNrIHRoZSBkZWxheWVkIGxpc3QgLT4gaWYgdGhlcmUsIHJlbGVhc2UgYW5kIGNvbXBsZXRlICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJndhLT54ZmVyX2xpc3RfbG9jaywgZmxhZ3MyKTsKIAlpZiAoIWxpc3RfZW1wdHkoJnhmZXItPmxpc3Rfbm9kZSkgJiYgeGZlci0+c2VnID09IE5VTEwpCkBAIC0xODY1LDYgKzE5NzQsMTEgQEAKIAkJZ290byBvdXRfdW5sb2NrOwkvKiBzZXR1cCgpLCBlbnF1ZXVlX2IoKSBjb21wbGV0ZXMgKi8KIAkvKiBPaywgdGhlIHhmZXIgaXMgaW4gZmxpZ2h0IGFscmVhZHksIGl0J3MgYmVlbiBzZXR1cCBhbmQgc3VibWl0dGVkLiovCiAJeGZlcl9hYm9ydF9wZW5kaW5nID0gX193YV94ZmVyX2Fib3J0KHhmZXIpID49IDA7CisJLyoKKwkgKiBncmFiIHRoZSBycGlwZS0+c2VnX2xvY2sgaGVyZSB0byBwcmV2ZW50IHJhY2luZyB3aXRoCisJICogX193YV94ZmVyX2RlbGF5ZWRfcnVuLgorCSAqLworCXNwaW5fbG9jaygmcnBpcGUtPnNlZ19sb2NrKTsKIAlmb3IgKGNudCA9IDA7IGNudCA8IHhmZXItPnNlZ3M7IGNudCsrKSB7CiAJCXNlZyA9IHhmZXItPnNlZ1tjbnRdOwogCQlwcl9kZWJ1ZygiJXM6IHhmZXIgaWQgMHglMDhYIyVkIHN0YXR1cyA9ICVkXG4iLApAQCAtMTg4NSwxNiArMTk5OSwyNCBAQAogCQkJICovCiAJCQlzZWctPnN0YXR1cyA9IFdBX1NFR19BQk9SVEVEOwogCQkJc2VnLT5yZXN1bHQgPSAtRU5PRU5UOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJwaXBlLT5zZWdfbG9jaywgZmxhZ3MyKTsKIAkJCWxpc3RfZGVsKCZzZWctPmxpc3Rfbm9kZSk7CiAJCQl4ZmVyLT5zZWdzX2RvbmUrKzsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwaXBlLT5zZWdfbG9jaywgZmxhZ3MyKTsKIAkJCWJyZWFrOwogCQljYXNlIFdBX1NFR19ET05FOgogCQljYXNlIFdBX1NFR19FUlJPUjoKIAkJY2FzZSBXQV9TRUdfQUJPUlRFRDoKIAkJCWJyZWFrOwogCQkJLyoKKwkJCSAqIFRoZSBidWZfaW4gZGF0YSBmb3IgYSBzZWdtZW50IGluIHRoZQorCQkJICogV0FfU0VHX0RUSV9QRU5ESU5HIHN0YXRlIGlzIGFjdGl2ZWx5IGJlaW5nIHJlYWQuCisJCQkgKiBMZXQgd2FfYnVmX2luX2NiIGhhbmRsZSBpdCBzaW5jZSBpdCB3aWxsIGJlIGNhbGxlZAorCQkJICogYW5kIHdpbGwgaW5jcmVtZW50IHhmZXItPnNlZ3NfZG9uZS4gIENsZWFuaW5nIHVwCisJCQkgKiBoZXJlIGNvdWxkIGNhdXNlIHdhX2J1Zl9pbl9jYiB0byBhY2Nlc3MgdGhlIHhmZXIKKwkJCSAqIGFmdGVyIGl0IGhhcyBiZWVuIGNvbXBsZXRlZC9mcmVlZC4KKwkJCSAqLworCQljYXNlIFdBX1NFR19EVElfUEVORElORzoKKwkJCWJyZWFrOworCQkJLyoKIAkJCSAqIEluIHRoZSBzdGF0ZXMgYmVsb3csIHRoZSBIV0EgZGV2aWNlIGFscmVhZHkga25vd3MKIAkJCSAqIGFib3V0IHRoZSB0cmFuc2Zlci4gIElmIGFuIGFib3J0IHJlcXVlc3Qgd2FzIHNlbnQsCiAJCQkgKiBhbGxvdyB0aGUgSFdBIHRvIHByb2Nlc3MgaXQgYW5kIHdhaXQgZm9yIHRoZQpAQCAtMTkwMyw3ICsyMDI1LDYgQEAKIAkJCSAqLwogCQljYXNlIFdBX1NFR19TVUJNSVRURUQ6CiAJCWNhc2UgV0FfU0VHX1BFTkRJTkc6Ci0JCWNhc2UgV0FfU0VHX0RUSV9QRU5ESU5HOgogCQkJLyoKIAkJCSAqIENoZWNrIGlmIHRoZSBhYm9ydCB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnQuICBUaGlzIGNvdWxkCiAJCQkgKiBiZSBmYWxzZSBpZiB0aGUgSFdBIGhhcyBiZWVuIHJlbW92ZWQgYnV0IHdlIGhhdmVuJ3QKQEAgLTE5MTcsNiArMjAzOCw3IEBACiAJCQlicmVhazsKIAkJfQogCX0KKwlzcGluX3VubG9jaygmcnBpcGUtPnNlZ19sb2NrKTsKIAl4ZmVyLT5yZXN1bHQgPSB1cmItPnN0YXR1czsJLyogLUVOT0VOVCBvciAtRUNPTk5SRVNFVCAqLwogCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CkBAIC0xOTI0LDExICsyMDQ2LDEyIEBACiAJCXdhX3hmZXJfY29tcGxldGlvbih4ZmVyKTsKIAlpZiAocnBpcGVfcmVhZHkpCiAJCXdhX3hmZXJfZGVsYXllZF9ydW4ocnBpcGUpOworCXdhX3hmZXJfcHV0KHhmZXIpOwogCXJldHVybiByZXN1bHQ7CiAKIG91dF91bmxvY2s6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGZlci0+bG9jaywgZmxhZ3MpOwotb3V0OgorCXdhX3hmZXJfcHV0KHhmZXIpOwogCXJldHVybiByZXN1bHQ7CiAKIGRlcXVldWVfZGVsYXllZDoKQEAgLTE5MzcsNiArMjA2MCw3IEBACiAJeGZlci0+cmVzdWx0ID0gdXJiLT5zdGF0dXM7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGZlci0+bG9jaywgZmxhZ3MpOwogCXdhX3hmZXJfZ2l2ZWJhY2soeGZlcik7CisJd2FfeGZlcl9wdXQoeGZlcik7CiAJdXNiX3B1dF91cmIodXJiKTsJCS8qIHdlIGdvdCBhIHJlZiBpbiBlbnF1ZXVlKCkgKi8KIAlyZXR1cm4gMDsKIH0KQEAgLTE5OTYsMTUgKzIxMjAsMTcgQEAKICAqIG5vIG90aGVyIHNlZ21lbnQgdHJhbnNmZXIgcmVzdWx0cyB3aWxsIGJlIHJldHVybmVkIGZyb20gdGhlIGRldmljZS4KICAqIE1hcmsgdGhlIHJlbWFpbmluZyBzdWJtaXR0ZWQgb3IgcGVuZGluZyB4ZmVycyBhcyBjb21wbGV0ZWQgc28gdGhhdAogICogdGhlIHhmZXIgd2lsbCBjb21wbGV0ZSBjbGVhbmx5LgorICoKKyAqIHhmZXItPmxvY2sgbXVzdCBiZSBoZWxkCisgKgogICovCiBzdGF0aWMgdm9pZCB3YV9jb21wbGV0ZV9yZW1haW5pbmdfeGZlcl9zZWdzKHN0cnVjdCB3YV94ZmVyICp4ZmVyLAotCQlzdHJ1Y3Qgd2Ffc2VnICppbmNvbWluZ19zZWcsIGVudW0gd2Ffc2VnX3N0YXR1cyBzdGF0dXMpCisJCWludCBzdGFydGluZ19pbmRleCwgZW51bSB3YV9zZWdfc3RhdHVzIHN0YXR1cykKIHsKIAlpbnQgaW5kZXg7CiAJc3RydWN0IHdhX3JwaXBlICpycGlwZSA9IHhmZXItPmVwLT5oY3ByaXY7CiAKLQlmb3IgKGluZGV4ID0gaW5jb21pbmdfc2VnLT5pbmRleCArIDE7IGluZGV4IDwgeGZlci0+c2Vnc19zdWJtaXR0ZWQ7Ci0JCWluZGV4KyspIHsKKwlmb3IgKGluZGV4ID0gc3RhcnRpbmdfaW5kZXg7IGluZGV4IDwgeGZlci0+c2Vnc19zdWJtaXR0ZWQ7IGluZGV4KyspIHsKIAkJc3RydWN0IHdhX3NlZyAqY3VycmVudF9zZWcgPSB4ZmVyLT5zZWdbaW5kZXhdOwogCiAJCUJVR19PTihjdXJyZW50X3NlZyA9PSBOVUxMKTsKQEAgLTIwMzMsNzMgKzIxNTksMTEwIEBACiAJfQogfQogCi0vKiBQb3B1bGF0ZSB0aGUgd2EtPmJ1Zl9pbl91cmIgYmFzZWQgb24gdGhlIGN1cnJlbnQgaXNvYyB0cmFuc2ZlciBzdGF0ZS4gKi8KLXN0YXRpYyB2b2lkIF9fd2FfcG9wdWxhdGVfYnVmX2luX3VyYl9pc29jKHN0cnVjdCB3YWhjICp3YSwgc3RydWN0IHdhX3hmZXIgKnhmZXIsCi0Jc3RydWN0IHdhX3NlZyAqc2VnLCBpbnQgY3Vycl9pc29fZnJhbWUpCisvKiBQb3B1bGF0ZSB0aGUgZ2l2ZW4gdXJiIGJhc2VkIG9uIHRoZSBjdXJyZW50IGlzb2MgdHJhbnNmZXIgc3RhdGUuICovCitzdGF0aWMgaW50IF9fd2FfcG9wdWxhdGVfYnVmX2luX3VyYl9pc29jKHN0cnVjdCB3YWhjICp3YSwKKwlzdHJ1Y3QgdXJiICpidWZfaW5fdXJiLCBzdHJ1Y3Qgd2FfeGZlciAqeGZlciwgc3RydWN0IHdhX3NlZyAqc2VnKQogewotCUJVR19PTih3YS0+YnVmX2luX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUyk7CisJaW50IHVyYl9zdGFydF9mcmFtZSA9IHNlZy0+aXNvY19mcmFtZV9pbmRleCArIHNlZy0+aXNvY19mcmFtZV9vZmZzZXQ7CisJaW50IHNlZ19pbmRleCwgdG90YWxfbGVuID0gMCwgdXJiX2ZyYW1lX2luZGV4ID0gdXJiX3N0YXJ0X2ZyYW1lOworCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICppc29fZnJhbWVfZGVzYyA9CisJCQkJCQl4ZmVyLT51cmItPmlzb19mcmFtZV9kZXNjOworCWNvbnN0IGludCBkdGlfcGFja2V0X3NpemUgPSB1c2JfZW5kcG9pbnRfbWF4cCh3YS0+ZHRpX2VwZCk7CisJaW50IG5leHRfZnJhbWVfY29udGlndW91czsKKwlzdHJ1Y3QgdXNiX2lzb19wYWNrZXRfZGVzY3JpcHRvciAqaXNvX2ZyYW1lOworCisJQlVHX09OKGJ1Zl9pbl91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpOworCisJLyoKKwkgKiBJZiB0aGUgY3VycmVudCBmcmFtZSBhY3R1YWxfbGVuZ3RoIGlzIGNvbnRpZ3VvdXMgd2l0aCB0aGUgbmV4dCBmcmFtZQorCSAqIGFuZCBhY3R1YWxfbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgdGhlIERUSSBlbmRwb2ludCBtYXggcGFja2V0IHNpemUsCisJICogY29tYmluZSB0aGUgY3VycmVudCBmcmFtZSB3aXRoIHRoZSBuZXh0IGZyYW1lIGluIGEgc2luZ2xlIFVSQi4gIFRoaXMKKwkgKiByZWR1Y2VzIHRoZSBudW1iZXIgb2YgVVJCcyB0aGF0IG11c3QgYmUgc3VibWl0dGVkIGluIHRoYXQgY2FzZS4KKwkgKi8KKwlzZWdfaW5kZXggPSBzZWctPmlzb2NfZnJhbWVfaW5kZXg7CisJZG8geworCQluZXh0X2ZyYW1lX2NvbnRpZ3VvdXMgPSAwOworCisJCWlzb19mcmFtZSA9ICZpc29fZnJhbWVfZGVzY1t1cmJfZnJhbWVfaW5kZXhdOworCQl0b3RhbF9sZW4gKz0gaXNvX2ZyYW1lLT5hY3R1YWxfbGVuZ3RoOworCQkrK3VyYl9mcmFtZV9pbmRleDsKKwkJKytzZWdfaW5kZXg7CisKKwkJaWYgKHNlZ19pbmRleCA8IHNlZy0+aXNvY19mcmFtZV9jb3VudCkgeworCQkJc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKm5leHRfaXNvX2ZyYW1lOworCisJCQluZXh0X2lzb19mcmFtZSA9ICZpc29fZnJhbWVfZGVzY1t1cmJfZnJhbWVfaW5kZXhdOworCisJCQlpZiAoKGlzb19mcmFtZS0+b2Zmc2V0ICsgaXNvX2ZyYW1lLT5hY3R1YWxfbGVuZ3RoKSA9PQorCQkJCW5leHRfaXNvX2ZyYW1lLT5vZmZzZXQpCisJCQkJbmV4dF9mcmFtZV9jb250aWd1b3VzID0gMTsKKwkJfQorCX0gd2hpbGUgKG5leHRfZnJhbWVfY29udGlndW91cworCQkJJiYgKChpc29fZnJhbWUtPmFjdHVhbF9sZW5ndGggJSBkdGlfcGFja2V0X3NpemUpID09IDApKTsKIAogCS8qIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSAwIGJlZm9yZSBhIHJlc3VibWl0LiAqLwotCXdhLT5idWZfaW5fdXJiLT5udW1fbWFwcGVkX3Nncwk9IDA7Ci0Jd2EtPmJ1Zl9pbl91cmItPnRyYW5zZmVyX2RtYSA9IHhmZXItPnVyYi0+dHJhbnNmZXJfZG1hICsKLQkJeGZlci0+dXJiLT5pc29fZnJhbWVfZGVzY1tjdXJyX2lzb19mcmFtZV0ub2Zmc2V0OwotCXdhLT5idWZfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0KLQkJeGZlci0+dXJiLT5pc29fZnJhbWVfZGVzY1tjdXJyX2lzb19mcmFtZV0ubGVuZ3RoOwotCXdhLT5idWZfaW5fdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKLQl3YS0+YnVmX2luX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKLQl3YS0+YnVmX2luX3VyYi0+c2cgPSBOVUxMOwotCXdhLT5idWZfaW5fdXJiLT5udW1fc2dzID0gMDsKLQl3YS0+YnVmX2luX3VyYi0+Y29udGV4dCA9IHNlZzsKKwlidWZfaW5fdXJiLT5udW1fbWFwcGVkX3Nncwk9IDA7CisJYnVmX2luX3VyYi0+dHJhbnNmZXJfZG1hID0geGZlci0+dXJiLT50cmFuc2Zlcl9kbWEgKworCQlpc29fZnJhbWVfZGVzY1t1cmJfc3RhcnRfZnJhbWVdLm9mZnNldDsKKwlidWZfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gdG90YWxfbGVuOworCWJ1Zl9pbl91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCWJ1Zl9pbl91cmItPnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CisJYnVmX2luX3VyYi0+c2cgPSBOVUxMOworCWJ1Zl9pbl91cmItPm51bV9zZ3MgPSAwOworCWJ1Zl9pbl91cmItPmNvbnRleHQgPSBzZWc7CisKKwkvKiByZXR1cm4gdGhlIG51bWJlciBvZiBmcmFtZXMgaW5jbHVkZWQgaW4gdGhpcyBVUkIuICovCisJcmV0dXJuIHNlZ19pbmRleCAtIHNlZy0+aXNvY19mcmFtZV9pbmRleDsKIH0KIAotLyogUG9wdWxhdGUgdGhlIHdhLT5idWZfaW5fdXJiIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRyYW5zZmVyIHN0YXRlLiAqLwotc3RhdGljIGludCB3YV9wb3B1bGF0ZV9idWZfaW5fdXJiKHN0cnVjdCB3YWhjICp3YSwgc3RydWN0IHdhX3hmZXIgKnhmZXIsCisvKiBQb3B1bGF0ZSB0aGUgZ2l2ZW4gdXJiIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRyYW5zZmVyIHN0YXRlLiAqLworc3RhdGljIGludCB3YV9wb3B1bGF0ZV9idWZfaW5fdXJiKHN0cnVjdCB1cmIgKmJ1Zl9pbl91cmIsIHN0cnVjdCB3YV94ZmVyICp4ZmVyLAogCXVuc2lnbmVkIGludCBzZWdfaWR4LCB1bnNpZ25lZCBpbnQgYnl0ZXNfdHJhbnNmZXJyZWQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IHdhX3NlZyAqc2VnID0geGZlci0+c2VnW3NlZ19pZHhdOwogCi0JQlVHX09OKHdhLT5idWZfaW5fdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKTsKKwlCVUdfT04oYnVmX2luX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUyk7CiAJLyogdGhpcyBzaG91bGQgYWx3YXlzIGJlIDAgYmVmb3JlIGEgcmVzdWJtaXQuICovCi0Jd2EtPmJ1Zl9pbl91cmItPm51bV9tYXBwZWRfc2dzCT0gMDsKKwlidWZfaW5fdXJiLT5udW1fbWFwcGVkX3Nncwk9IDA7CiAKIAlpZiAoeGZlci0+aXNfZG1hKSB7Ci0JCXdhLT5idWZfaW5fdXJiLT50cmFuc2Zlcl9kbWEgPSB4ZmVyLT51cmItPnRyYW5zZmVyX2RtYQorCQlidWZfaW5fdXJiLT50cmFuc2Zlcl9kbWEgPSB4ZmVyLT51cmItPnRyYW5zZmVyX2RtYQogCQkJKyAoc2VnX2lkeCAqIHhmZXItPnNlZ19zaXplKTsKLQkJd2EtPmJ1Zl9pbl91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwotCQl3YS0+YnVmX2luX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKLQkJd2EtPmJ1Zl9pbl91cmItPnNnID0gTlVMTDsKLQkJd2EtPmJ1Zl9pbl91cmItPm51bV9zZ3MgPSAwOworCQlidWZfaW5fdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJYnVmX2luX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKKwkJYnVmX2luX3VyYi0+c2cgPSBOVUxMOworCQlidWZfaW5fdXJiLT5udW1fc2dzID0gMDsKIAl9IGVsc2UgewogCQkvKiBkbyBidWZmZXIgb3IgU0cgcHJvY2Vzc2luZy4gKi8KLQkJd2EtPmJ1Zl9pbl91cmItPnRyYW5zZmVyX2ZsYWdzICY9IH5VUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJYnVmX2luX3VyYi0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwogCiAJCWlmICh4ZmVyLT51cmItPnRyYW5zZmVyX2J1ZmZlcikgewotCQkJd2EtPmJ1Zl9pbl91cmItPnRyYW5zZmVyX2J1ZmZlciA9CisJCQlidWZfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXIgPQogCQkJCXhmZXItPnVyYi0+dHJhbnNmZXJfYnVmZmVyCiAJCQkJKyAoc2VnX2lkeCAqIHhmZXItPnNlZ19zaXplKTsKLQkJCXdhLT5idWZfaW5fdXJiLT5zZyA9IE5VTEw7Ci0JCQl3YS0+YnVmX2luX3VyYi0+bnVtX3NncyA9IDA7CisJCQlidWZfaW5fdXJiLT5zZyA9IE5VTEw7CisJCQlidWZfaW5fdXJiLT5udW1fc2dzID0gMDsKIAkJfSBlbHNlIHsKIAkJCS8qIGFsbG9jYXRlIGFuIFNHIGxpc3QgdG8gc3RvcmUgc2VnX3NpemUgYnl0ZXMKIAkJCQlhbmQgY29weSB0aGUgc3Vic2V0IG9mIHRoZSB4ZmVyLT51cmItPnNnCiAJCQkJdGhhdCBtYXRjaGVzIHRoZSBidWZmZXIgc3Vic2V0IHdlIGFyZQogCQkJCWFib3V0IHRvIHJlYWQuICovCi0JCQl3YS0+YnVmX2luX3VyYi0+c2cgPSB3YV94ZmVyX2NyZWF0ZV9zdWJzZXRfc2coCisJCQlidWZfaW5fdXJiLT5zZyA9IHdhX3hmZXJfY3JlYXRlX3N1YnNldF9zZygKIAkJCQl4ZmVyLT51cmItPnNnLAogCQkJCXNlZ19pZHggKiB4ZmVyLT5zZWdfc2l6ZSwKIAkJCQlieXRlc190cmFuc2ZlcnJlZCwKLQkJCQkmKHdhLT5idWZfaW5fdXJiLT5udW1fc2dzKSk7CisJCQkJJihidWZfaW5fdXJiLT5udW1fc2dzKSk7CiAKLQkJCWlmICghKHdhLT5idWZfaW5fdXJiLT5zZykpIHsKLQkJCQl3YS0+YnVmX2luX3VyYi0+bnVtX3Nncwk9IDA7CisJCQlpZiAoIShidWZfaW5fdXJiLT5zZykpIHsKKwkJCQlidWZfaW5fdXJiLT5udW1fc2dzCT0gMDsKIAkJCQlyZXN1bHQgPSAtRU5PTUVNOwogCQkJfQotCQkJd2EtPmJ1Zl9pbl91cmItPnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CisJCQlidWZfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBOVUxMOwogCQl9CiAJfQotCXdhLT5idWZfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci0Jd2EtPmJ1Zl9pbl91cmItPmNvbnRleHQgPSBzZWc7CisJYnVmX2luX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IGJ5dGVzX3RyYW5zZmVycmVkOworCWJ1Zl9pbl91cmItPmNvbnRleHQgPSBzZWc7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMjEyNCw2ICsyMjg3LDcgQEAKIAl1OCB1c2Jfc3RhdHVzOwogCXVuc2lnbmVkIHJwaXBlX3JlYWR5ID0gMDsKIAl1bnNpZ25lZCBieXRlc190cmFuc2ZlcnJlZCA9IGxlMzJfdG9fY3B1KHhmZXJfcmVzdWx0LT5kd1RyYW5zZmVyTGVuZ3RoKTsKKwlzdHJ1Y3QgdXJiICpidWZfaW5fdXJiID0gJih3YS0+YnVmX2luX3VyYnNbMF0pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnhmZXItPmxvY2ssIGZsYWdzKTsKIAlzZWdfaWR4ID0geGZlcl9yZXN1bHQtPmJUcmFuc2ZlclNlZ21lbnQgJiAweDdmOwpAQCAtMjE0Nyw3ICsyMzExLDcgQEAKIAl9CiAJaWYgKHVzYl9zdGF0dXMgJiAweDgwKSB7CiAJCXNlZy0+cmVzdWx0ID0gd2FfeGZlcl9zdGF0dXNfdG9fZXJybm8odXNiX3N0YXR1cyk7Ci0JCWRldl9lcnIoZGV2LCAiRFRJOiB4ZmVyICVwIzolMDhYOiV1IGZhaWxlZCAoMHglMDJ4KVxuIiwKKwkJZGV2X2VycihkZXYsICJEVEk6IHhmZXIgJXAgMHglMDhYOiMldSBmYWlsZWQgKDB4JTAyeClcbiIsCiAJCQl4ZmVyLCB4ZmVyLT5pZCwgc2VnLT5pbmRleCwgdXNiX3N0YXR1cyk7CiAJCXNlZy0+c3RhdHVzID0gKCh1c2Jfc3RhdHVzICYgMHg3RikgPT0gV0FfWEZFUl9TVEFUVVNfQUJPUlRFRCkgPwogCQkJV0FfU0VHX0FCT1JURUQgOiBXQV9TRUdfRVJST1I7CkBAIC0yMTYyLDcgKzIzMjYsOCBAQAogCSAqIHRyYW5zZmVycyB3aXRoIGRhdGEgb3IgYmVsb3cgZm9yIG5vIGRhdGEsIHRoZSB4ZmVyIHdpbGwgY29tcGxldGUuCiAJICovCiAJaWYgKHhmZXJfcmVzdWx0LT5iVHJhbnNmZXJTZWdtZW50ICYgMHg4MCkKLQkJd2FfY29tcGxldGVfcmVtYWluaW5nX3hmZXJfc2Vncyh4ZmVyLCBzZWcsIFdBX1NFR19ET05FKTsKKwkJd2FfY29tcGxldGVfcmVtYWluaW5nX3hmZXJfc2Vncyh4ZmVyLCBzZWctPmluZGV4ICsgMSwKKwkJCVdBX1NFR19ET05FKTsKIAlpZiAodXNiX3BpcGVpc29jKHhmZXItPnVyYi0+cGlwZSkKIAkJJiYgKGxlMzJfdG9fY3B1KHhmZXJfcmVzdWx0LT5kd051bU9mUGFja2V0cykgPiAwKSkgewogCQkvKiBzZXQgdXAgV0Egc3RhdGUgdG8gcmVhZCB0aGUgaXNvYyBwYWNrZXQgc3RhdHVzIG5leHQuICovCkBAIC0yMTczLDIwICsyMzM4LDIxIEBACiAJCQkmJiAoYnl0ZXNfdHJhbnNmZXJyZWQgPiAwKSkgewogCQkvKiBJTiBkYXRhIHBoYXNlOiByZWFkIHRvIGJ1ZmZlciAqLwogCQlzZWctPnN0YXR1cyA9IFdBX1NFR19EVElfUEVORElORzsKLQkJcmVzdWx0ID0gd2FfcG9wdWxhdGVfYnVmX2luX3VyYih3YSwgeGZlciwgc2VnX2lkeCwKKwkJcmVzdWx0ID0gd2FfcG9wdWxhdGVfYnVmX2luX3VyYihidWZfaW5fdXJiLCB4ZmVyLCBzZWdfaWR4LAogCQkJYnl0ZXNfdHJhbnNmZXJyZWQpOwogCQlpZiAocmVzdWx0IDwgMCkKIAkJCWdvdG8gZXJyb3JfYnVmX2luX3BvcHVsYXRlOwotCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYih3YS0+YnVmX2luX3VyYiwgR0ZQX0FUT01JQyk7Ci0JCWlmIChyZXN1bHQgPCAwKQorCQkrKyh3YS0+YWN0aXZlX2J1Zl9pbl91cmJzKTsKKwkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIoYnVmX2luX3VyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQktLSh3YS0+YWN0aXZlX2J1Zl9pbl91cmJzKTsKIAkJCWdvdG8gZXJyb3Jfc3VibWl0X2J1Zl9pbjsKKwkJfQogCX0gZWxzZSB7CiAJCS8qIE9VVCBkYXRhIHBoYXNlIG9yIG5vIGRhdGEsIGNvbXBsZXRlIGl0IC0tICovCi0JCXNlZy0+c3RhdHVzID0gV0FfU0VHX0RPTkU7CiAJCXNlZy0+cmVzdWx0ID0gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci0JCXhmZXItPnNlZ3NfZG9uZSsrOwogCQlycGlwZV9yZWFkeSA9IHJwaXBlX2F2YWlsX2luYyhycGlwZSk7Ci0JCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKKwkJZG9uZSA9IF9fd2FfeGZlcl9tYXJrX3NlZ19hc19kb25lKHhmZXIsIHNlZywgV0FfU0VHX0RPTkUpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CiAJaWYgKGRvbmUpCkBAIC0yMjA1LDE1ICsyMzcxLDE1IEBACiAJCWRldl9lcnIoZGV2LCAieGZlciAlcCMldTogY2FuJ3Qgc3VibWl0IERUSSBkYXRhIHBoYXNlOiAlZFxuIiwKIAkJCXhmZXIsIHNlZ19pZHgsIHJlc3VsdCk7CiAJc2VnLT5yZXN1bHQgPSByZXN1bHQ7Ci0Ja2ZyZWUod2EtPmJ1Zl9pbl91cmItPnNnKTsKLQl3YS0+YnVmX2luX3VyYi0+c2cgPSBOVUxMOworCWtmcmVlKGJ1Zl9pbl91cmItPnNnKTsKKwlidWZfaW5fdXJiLT5zZyA9IE5VTEw7CiBlcnJvcl9idWZfaW5fcG9wdWxhdGU6CiAJX193YV94ZmVyX2Fib3J0KHhmZXIpOwogCXNlZy0+c3RhdHVzID0gV0FfU0VHX0VSUk9SOwogZXJyb3JfY29tcGxldGU6CiAJeGZlci0+c2Vnc19kb25lKys7CiAJcnBpcGVfcmVhZHkgPSBycGlwZV9hdmFpbF9pbmMocnBpcGUpOwotCXdhX2NvbXBsZXRlX3JlbWFpbmluZ194ZmVyX3NlZ3MoeGZlciwgc2VnLCBzZWctPnN0YXR1cyk7CisJd2FfY29tcGxldGVfcmVtYWluaW5nX3hmZXJfc2Vncyh4ZmVyLCBzZWctPmluZGV4ICsgMSwgc2VnLT5zdGF0dXMpOwogCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKIAkvKgogCSAqIHF1ZXVlIHdvcmsgaXRlbSB0byBjbGVhciBTVEFMTCBmb3IgY29udHJvbCBlbmRwb2ludHMuCkBAIC0yMzE1LDE2ICsyNDgxLDE2IEBACiAJZm9yIChzZWdfaW5kZXggPSAwOyBzZWdfaW5kZXggPCBzZWctPmlzb2NfZnJhbWVfY291bnQ7ICsrc2VnX2luZGV4KSB7CiAJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICppc29fZnJhbWVfZGVzYyA9CiAJCQl4ZmVyLT51cmItPmlzb19mcmFtZV9kZXNjOwotCQljb25zdCBpbnQgdXJiX2ZyYW1lX2luZGV4ID0KKwkJY29uc3QgaW50IHhmZXJfZnJhbWVfaW5kZXggPQogCQkJc2VnLT5pc29jX2ZyYW1lX29mZnNldCArIHNlZ19pbmRleDsKIAotCQlpc29fZnJhbWVfZGVzY1t1cmJfZnJhbWVfaW5kZXhdLnN0YXR1cyA9CisJCWlzb19mcmFtZV9kZXNjW3hmZXJfZnJhbWVfaW5kZXhdLnN0YXR1cyA9CiAJCQl3YV94ZmVyX3N0YXR1c190b19lcnJubygKIAkJCWxlMTZfdG9fY3B1KHN0YXR1c19hcnJheVtzZWdfaW5kZXhdLlBhY2tldFN0YXR1cykpOwotCQlpc29fZnJhbWVfZGVzY1t1cmJfZnJhbWVfaW5kZXhdLmFjdHVhbF9sZW5ndGggPQorCQlpc29fZnJhbWVfZGVzY1t4ZmVyX2ZyYW1lX2luZGV4XS5hY3R1YWxfbGVuZ3RoID0KIAkJCWxlMTZfdG9fY3B1KHN0YXR1c19hcnJheVtzZWdfaW5kZXhdLlBhY2tldExlbmd0aCk7CiAJCS8qIHRyYWNrIHRoZSBudW1iZXIgb2YgZnJhbWVzIHN1Y2Nlc3NmdWxseSB0cmFuc2ZlcnJlZC4gKi8KLQkJaWYgKGlzb19mcmFtZV9kZXNjW3VyYl9mcmFtZV9pbmRleF0uYWN0dWFsX2xlbmd0aCA+IDApIHsKKwkJaWYgKGlzb19mcmFtZV9kZXNjW3hmZXJfZnJhbWVfaW5kZXhdLmFjdHVhbF9sZW5ndGggPiAwKSB7CiAJCQkvKiBzYXZlIHRoZSBzdGFydGluZyBmcmFtZSBpbmRleCBmb3IgYnVmX2luX3VyYi4gKi8KIAkJCWlmICghZGF0YV9mcmFtZV9jb3VudCkKIAkJCQlmaXJzdF9mcmFtZV9pbmRleCA9IHNlZ19pbmRleDsKQEAgLTIzMzMsMzAgKzI0OTksNjQgQEAKIAl9CiAKIAlpZiAoeGZlci0+aXNfaW5ib3VuZCAmJiBkYXRhX2ZyYW1lX2NvdW50KSB7Ci0JCWludCByZXN1bHQ7CisJCWludCByZXN1bHQsIHRvdGFsX2ZyYW1lc19yZWFkID0gMCwgdXJiX2luZGV4ID0gMDsKKwkJc3RydWN0IHVyYiAqYnVmX2luX3VyYjsKIAorCQkvKiBJTiBkYXRhIHBoYXNlOiByZWFkIHRvIGJ1ZmZlciAqLworCQlzZWctPnN0YXR1cyA9IFdBX1NFR19EVElfUEVORElORzsKKworCQkvKiBzdGFydCB3aXRoIHRoZSBmaXJzdCBmcmFtZSB3aXRoIGRhdGEuICovCiAJCXNlZy0+aXNvY19mcmFtZV9pbmRleCA9IGZpcnN0X2ZyYW1lX2luZGV4OwotCQkvKiBzdWJtaXQgYSByZWFkIFVSQiBmb3IgdGhlIGZpcnN0IGZyYW1lIHdpdGggZGF0YS4gKi8KLQkJX193YV9wb3B1bGF0ZV9idWZfaW5fdXJiX2lzb2Mod2EsIHhmZXIsIHNlZywKLQkJCXNlZy0+aXNvY19mcmFtZV9pbmRleCArIHNlZy0+aXNvY19mcmFtZV9vZmZzZXQpOworCQkvKiBzdWJtaXQgdXAgdG8gV0FfTUFYX0JVRl9JTl9VUkJTIHJlYWQgVVJCcy4gKi8KKwkJZG8geworCQkJaW50IHVyYl9mcmFtZV9pbmRleCwgdXJiX2ZyYW1lX2NvdW50OworCQkJc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKmlzb19mcmFtZV9kZXNjOwogCi0JCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHdhLT5idWZfaW5fdXJiLCBHRlBfQVRPTUlDKTsKKwkJCWJ1Zl9pbl91cmIgPSAmKHdhLT5idWZfaW5fdXJic1t1cmJfaW5kZXhdKTsKKwkJCXVyYl9mcmFtZV9jb3VudCA9IF9fd2FfcG9wdWxhdGVfYnVmX2luX3VyYl9pc29jKHdhLAorCQkJCWJ1Zl9pbl91cmIsIHhmZXIsIHNlZyk7CisJCQkvKiBhZHZhbmNlIGZyYW1lIGluZGV4IHRvIHN0YXJ0IG9mIG5leHQgcmVhZCBVUkIuICovCisJCQlzZWctPmlzb2NfZnJhbWVfaW5kZXggKz0gdXJiX2ZyYW1lX2NvdW50OworCQkJdG90YWxfZnJhbWVzX3JlYWQgKz0gdXJiX2ZyYW1lX2NvdW50OworCisJCQkrKyh3YS0+YWN0aXZlX2J1Zl9pbl91cmJzKTsKKwkJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKGJ1Zl9pbl91cmIsIEdGUF9BVE9NSUMpOworCisJCQkvKiBza2lwIDAtYnl0ZSBmcmFtZXMuICovCisJCQl1cmJfZnJhbWVfaW5kZXggPQorCQkJCXNlZy0+aXNvY19mcmFtZV9vZmZzZXQgKyBzZWctPmlzb2NfZnJhbWVfaW5kZXg7CisJCQlpc29fZnJhbWVfZGVzYyA9CisJCQkJJih4ZmVyLT51cmItPmlzb19mcmFtZV9kZXNjW3VyYl9mcmFtZV9pbmRleF0pOworCQkJd2hpbGUgKChzZWctPmlzb2NfZnJhbWVfaW5kZXggPAorCQkJCQkJc2VnLT5pc29jX2ZyYW1lX2NvdW50KSAmJgorCQkJCSAoaXNvX2ZyYW1lX2Rlc2MtPmFjdHVhbF9sZW5ndGggPT0gMCkpIHsKKwkJCQkrKyhzZWctPmlzb2NfZnJhbWVfaW5kZXgpOworCQkJCSsraXNvX2ZyYW1lX2Rlc2M7CisJCQl9CisJCQkrK3VyYl9pbmRleDsKKworCQl9IHdoaWxlICgocmVzdWx0ID09IDApICYmICh1cmJfaW5kZXggPCBXQV9NQVhfQlVGX0lOX1VSQlMpCisJCQkJJiYgKHNlZy0+aXNvY19mcmFtZV9pbmRleCA8CisJCQkJCQlzZWctPmlzb2NfZnJhbWVfY291bnQpKTsKKwogCQlpZiAocmVzdWx0IDwgMCkgeworCQkJLS0od2EtPmFjdGl2ZV9idWZfaW5fdXJicyk7CiAJCQlkZXZfZXJyKGRldiwgIkRUSSBFcnJvcjogQ291bGQgbm90IHN1Ym1pdCBidWYgaW4gVVJCICglZCkiLAogCQkJCXJlc3VsdCk7CiAJCQl3YV9yZXNldF9hbGwod2EpOwotCQl9IGVsc2UgaWYgKGRhdGFfZnJhbWVfY291bnQgPiAxKQotCQkJLyogSWYgd2UgbmVlZCB0byByZWFkIG11bHRpcGxlIGZyYW1lcywgc2V0IERUSSBidXN5LiAqLworCQl9IGVsc2UgaWYgKGRhdGFfZnJhbWVfY291bnQgPiB0b3RhbF9mcmFtZXNfcmVhZCkKKwkJCS8qIElmIHdlIG5lZWQgdG8gcmVhZCBtb3JlIGZyYW1lcywgc2V0IERUSSBidXN5LiAqLwogCQkJZHRpX2J1c3kgPSAxOwogCX0gZWxzZSB7CiAJCS8qIE9VVCB0cmFuc2ZlciBvciBubyBtb3JlIElOIGRhdGEsIGNvbXBsZXRlIGl0IC0tICovCi0JCXNlZy0+c3RhdHVzID0gV0FfU0VHX0RPTkU7Ci0JCXhmZXItPnNlZ3NfZG9uZSsrOwogCQlycGlwZV9yZWFkeSA9IHJwaXBlX2F2YWlsX2luYyhycGlwZSk7Ci0JCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKKwkJZG9uZSA9IF9fd2FfeGZlcl9tYXJrX3NlZ19hc19kb25lKHhmZXIsIHNlZywgV0FfU0VHX0RPTkUpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7Ci0Jd2EtPmR0aV9zdGF0ZSA9IFdBX0RUSV9UUkFOU0ZFUl9SRVNVTFRfUEVORElORzsKKwlpZiAoZHRpX2J1c3kpCisJCXdhLT5kdGlfc3RhdGUgPSBXQV9EVElfQlVGX0lOX0RBVEFfUEVORElORzsKKwllbHNlCisJCXdhLT5kdGlfc3RhdGUgPSBXQV9EVElfVFJBTlNGRVJfUkVTVUxUX1BFTkRJTkc7CiAJaWYgKGRvbmUpCiAJCXdhX3hmZXJfY29tcGxldGlvbih4ZmVyKTsKIAlpZiAocnBpcGVfcmVhZHkpCkBAIC0yMzg4LDggKzI1ODgsOSBAQAogCXN0cnVjdCB3YWhjICp3YTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IHdhX3JwaXBlICpycGlwZTsKLQl1bnNpZ25lZCBycGlwZV9yZWFkeSA9IDAsIHNlZ19pbmRleCwgaXNvY19kYXRhX2ZyYW1lX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBycGlwZV9yZWFkeSA9IDAsIGlzb2NfZGF0YV9mcmFtZV9jb3VudCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVzdWJtaXRfZHRpID0gMCwgYWN0aXZlX2J1Zl9pbl91cmJzOwogCXU4IGRvbmUgPSAwOwogCiAJLyogZnJlZSB0aGUgc2cgaWYgaXQgd2FzIHVzZWQuICovCkBAIC0yMzk5LDE5ICsyNjAwLDIwIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnhmZXItPmxvY2ssIGZsYWdzKTsKIAl3YSA9IHhmZXItPndhOwogCWRldiA9ICZ3YS0+dXNiX2lmYWNlLT5kZXY7CisJLS0od2EtPmFjdGl2ZV9idWZfaW5fdXJicyk7CisJYWN0aXZlX2J1Zl9pbl91cmJzID0gd2EtPmFjdGl2ZV9idWZfaW5fdXJiczsKIAogCWlmICh1c2JfcGlwZWlzb2MoeGZlci0+dXJiLT5waXBlKSkgeworCQlzdHJ1Y3QgdXNiX2lzb19wYWNrZXRfZGVzY3JpcHRvciAqaXNvX2ZyYW1lX2Rlc2MgPQorCQkJeGZlci0+dXJiLT5pc29fZnJhbWVfZGVzYzsKKwkJaW50CXNlZ19pbmRleDsKKwogCQkvKgotCQkgKiBGaW5kIHRoZSBuZXh0IGlzb2MgZnJhbWUgd2l0aCBkYXRhLiAgQmFpbCBvdXQgYWZ0ZXIKLQkJICogaXNvY19kYXRhX2ZyYW1lX2NvdW50ID4gMSBzaW5jZSB0aGVyZSBpcyBubyBuZWVkIHRvIHdhbGsKLQkJICogdGhlIGVudGlyZSBmcmFtZSBhcnJheS4gIFdlIGp1c3QgbmVlZCB0byBrbm93IGlmCi0JCSAqIGlzb2NfZGF0YV9mcmFtZV9jb3VudCBpcyAwLCAxLCBvciA+MS4KKwkJICogRmluZCB0aGUgbmV4dCBpc29jIGZyYW1lIHdpdGggZGF0YSBhbmQgY291bnQgaG93IG1hbnkKKwkJICogZnJhbWVzIHdpdGggZGF0YSByZW1haW4uCiAJCSAqLwotCQlzZWdfaW5kZXggPSBzZWctPmlzb2NfZnJhbWVfaW5kZXggKyAxOwotCQl3aGlsZSAoKHNlZ19pbmRleCA8IHNlZy0+aXNvY19mcmFtZV9jb3VudCkKLQkJCSYmIChpc29jX2RhdGFfZnJhbWVfY291bnQgPD0gMSkpIHsKLQkJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICppc29fZnJhbWVfZGVzYyA9Ci0JCQkJeGZlci0+dXJiLT5pc29fZnJhbWVfZGVzYzsKKwkJc2VnX2luZGV4ID0gc2VnLT5pc29jX2ZyYW1lX2luZGV4OworCQl3aGlsZSAoc2VnX2luZGV4IDwgc2VnLT5pc29jX2ZyYW1lX2NvdW50KSB7CiAJCQljb25zdCBpbnQgdXJiX2ZyYW1lX2luZGV4ID0KIAkJCQlzZWctPmlzb2NfZnJhbWVfb2Zmc2V0ICsgc2VnX2luZGV4OwogCkBAIC0yNDMyLDI0ICsyNjM0LDM5IEBACiAKIAkJc2VnLT5yZXN1bHQgKz0gdXJiLT5hY3R1YWxfbGVuZ3RoOwogCQlpZiAoaXNvY19kYXRhX2ZyYW1lX2NvdW50ID4gMCkgewotCQkJaW50IHJlc3VsdDsKLQkJCS8qIHN1Ym1pdCBhIHJlYWQgVVJCIGZvciB0aGUgZmlyc3QgZnJhbWUgd2l0aCBkYXRhLiAqLwotCQkJX193YV9wb3B1bGF0ZV9idWZfaW5fdXJiX2lzb2Mod2EsIHhmZXIsIHNlZywKLQkJCQlzZWctPmlzb2NfZnJhbWVfaW5kZXggKyBzZWctPmlzb2NfZnJhbWVfb2Zmc2V0KTsKLQkJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHdhLT5idWZfaW5fdXJiLCBHRlBfQVRPTUlDKTsKKwkJCWludCByZXN1bHQsIHVyYl9mcmFtZV9jb3VudDsKKworCQkJLyogc3VibWl0IGEgcmVhZCBVUkIgZm9yIHRoZSBuZXh0IGZyYW1lIHdpdGggZGF0YS4gKi8KKwkJCXVyYl9mcmFtZV9jb3VudCA9IF9fd2FfcG9wdWxhdGVfYnVmX2luX3VyYl9pc29jKHdhLCB1cmIsCisJCQkJIHhmZXIsIHNlZyk7CisJCQkvKiBhZHZhbmNlIGluZGV4IHRvIHN0YXJ0IG9mIG5leHQgcmVhZCBVUkIuICovCisJCQlzZWctPmlzb2NfZnJhbWVfaW5kZXggKz0gdXJiX2ZyYW1lX2NvdW50OworCQkJKysod2EtPmFjdGl2ZV9idWZfaW5fdXJicyk7CisJCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCQktLSh3YS0+YWN0aXZlX2J1Zl9pbl91cmJzKTsKIAkJCQlkZXZfZXJyKGRldiwgIkRUSSBFcnJvcjogQ291bGQgbm90IHN1Ym1pdCBidWYgaW4gVVJCICglZCkiLAogCQkJCQlyZXN1bHQpOwogCQkJCXdhX3Jlc2V0X2FsbCh3YSk7CiAJCQl9Ci0JCX0gZWxzZSB7CisJCQkvKgorCQkJICogSWYgd2UgYXJlIGluIHRoaXMgY2FsbGJhY2sgYW5kCisJCQkgKiBpc29jX2RhdGFfZnJhbWVfY291bnQgPiAwLCBpdCBtZWFucyB0aGF0IHRoZSBkdGlfdXJiCisJCQkgKiBzdWJtaXNzaW9uIHdhcyBkZWxheWVkIGluIHdhX2R0aV9jYi4gIE9uY2UKKwkJCSAqIHdlIHN1Ym1pdCB0aGUgbGFzdCBidWZfaW5fdXJiLCB3ZSBjYW4gc3VibWl0IHRoZQorCQkJICogZGVsYXllZCBkdGlfdXJiLgorCQkJICovCisJCQkgIHJlc3VibWl0X2R0aSA9IChpc29jX2RhdGFfZnJhbWVfY291bnQgPT0KKwkJCQkJCQl1cmJfZnJhbWVfY291bnQpOworCQl9IGVsc2UgaWYgKGFjdGl2ZV9idWZfaW5fdXJicyA9PSAwKSB7CiAJCQlycGlwZSA9IHhmZXItPmVwLT5oY3ByaXY7Ci0JCQlzZWctPnN0YXR1cyA9IFdBX1NFR19ET05FOwotCQkJZGV2X2RiZyhkZXYsICJ4ZmVyICVwIyV1OiBkYXRhIGluIGRvbmUgKCV6dSBieXRlcylcbiIsCi0JCQkJeGZlciwgc2VnLT5pbmRleCwgc2VnLT5yZXN1bHQpOwotCQkJeGZlci0+c2Vnc19kb25lKys7CisJCQlkZXZfZGJnKGRldiwKKwkJCQkieGZlciAlcCAweCUwOFgjJXU6IGRhdGEgaW4gZG9uZSAoJXp1IGJ5dGVzKVxuIiwKKwkJCQl4ZmVyLCB3YV94ZmVyX2lkKHhmZXIpLCBzZWctPmluZGV4LAorCQkJCXNlZy0+cmVzdWx0KTsKIAkJCXJwaXBlX3JlYWR5ID0gcnBpcGVfYXZhaWxfaW5jKHJwaXBlKTsKLQkJCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKKwkJCWRvbmUgPSBfX3dhX3hmZXJfbWFya19zZWdfYXNfZG9uZSh4ZmVyLCBzZWcsCisJCQkJCVdBX1NFR19ET05FKTsKIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CiAJCWlmIChkb25lKQpAQCAtMjQ2MSwzNyArMjY3OCw0NCBAQAogCWNhc2UgLUVOT0VOVDoJCS8qIGFzIGl0IHdhcyBkb25lIGJ5IHRoZSB3aG8gdW5saW5rZWQgdXMgKi8KIAkJYnJlYWs7CiAJZGVmYXVsdDoJCS8qIE90aGVyIGVycm9ycyAuLi4gKi8KKwkJLyoKKwkJICogRXJyb3Igb24gZGF0YSBidWYgcmVhZC4gIE9ubHkgcmVzdWJtaXQgRFRJIGlmIGl0IGhhc24ndAorCQkgKiBhbHJlYWR5IGJlZW4gZG9uZSBieSBwcmV2aW91c2x5IGhpdHRpbmcgdGhpcyBlcnJvciBvciBieSBhCisJCSAqIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgcHJldmlvdXMgYnVmX2luX3VyYi4KKwkJICovCisJCXJlc3VibWl0X2R0aSA9IHdhLT5kdGlfc3RhdGUgIT0gV0FfRFRJX1RSQU5TRkVSX1JFU1VMVF9QRU5ESU5HOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmeGZlci0+bG9jaywgZmxhZ3MpOwogCQlycGlwZSA9IHhmZXItPmVwLT5oY3ByaXY7CiAJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlkZXZfZXJyKGRldiwgInhmZXIgJXAjJXU6IGRhdGEgaW4gZXJyb3IgJWRcbiIsCi0JCQkJeGZlciwgc2VnLT5pbmRleCwgdXJiLT5zdGF0dXMpOworCQkJZGV2X2VycihkZXYsICJ4ZmVyICVwIDB4JTA4WCMldTogZGF0YSBpbiBlcnJvciAlZFxuIiwKKwkJCQl4ZmVyLCB3YV94ZmVyX2lkKHhmZXIpLCBzZWctPmluZGV4LAorCQkJCXVyYi0+c3RhdHVzKTsKIAkJaWYgKGVkY19pbmMoJndhLT5uZXBfZWRjLCBFRENfTUFYX0VSUk9SUywKIAkJCSAgICBFRENfRVJST1JfVElNRUZSQU1FKSl7CiAJCQlkZXZfZXJyKGRldiwgIkRUTzogVVJCIG1heCBhY2NlcHRhYmxlIGVycm9ycyAiCiAJCQkJImV4Y2VlZGVkLCByZXNldHRpbmcgZGV2aWNlXG4iKTsKIAkJCXdhX3Jlc2V0X2FsbCh3YSk7CiAJCX0KLQkJc2VnLT5zdGF0dXMgPSBXQV9TRUdfRVJST1I7CiAJCXNlZy0+cmVzdWx0ID0gdXJiLT5zdGF0dXM7Ci0JCXhmZXItPnNlZ3NfZG9uZSsrOwogCQlycGlwZV9yZWFkeSA9IHJwaXBlX2F2YWlsX2luYyhycGlwZSk7Ci0JCV9fd2FfeGZlcl9hYm9ydCh4ZmVyKTsKLQkJZG9uZSA9IF9fd2FfeGZlcl9pc19kb25lKHhmZXIpOworCQlpZiAoYWN0aXZlX2J1Zl9pbl91cmJzID09IDApCisJCQlkb25lID0gX193YV94ZmVyX21hcmtfc2VnX2FzX2RvbmUoeGZlciwgc2VnLAorCQkJCVdBX1NFR19FUlJPUik7CisJCWVsc2UKKwkJCV9fd2FfeGZlcl9hYm9ydCh4ZmVyKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGZlci0+bG9jaywgZmxhZ3MpOwogCQlpZiAoZG9uZSkKIAkJCXdhX3hmZXJfY29tcGxldGlvbih4ZmVyKTsKIAkJaWYgKHJwaXBlX3JlYWR5KQogCQkJd2FfeGZlcl9kZWxheWVkX3J1bihycGlwZSk7CiAJfQotCS8qCi0JICogSWYgd2UgYXJlIGluIHRoaXMgY2FsbGJhY2sgYW5kIGlzb2NfZGF0YV9mcmFtZV9jb3VudCA+IDAsIGl0IG1lYW5zCi0JICogdGhhdCB0aGUgZHRpX3VyYiBzdWJtaXNzaW9uIHdhcyBkZWxheWVkIGluIHdhX2R0aV9jYi4gIE9uY2UKLQkgKiBpc29jX2RhdGFfZnJhbWVfY291bnQgZ2V0cyB0byAxLCB3ZSBjYW4gc3VibWl0IHRoZSBkZWZlcnJlZCBVUkIKLQkgKiBzaW5jZSB0aGUgbGFzdCBidWZfaW5fdXJiIHdhcyBqdXN0IHN1Ym1pdHRlZC4KLQkgKi8KLQlpZiAoaXNvY19kYXRhX2ZyYW1lX2NvdW50ID09IDEpIHsKLQkJaW50IHJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHdhLT5kdGlfdXJiLCBHRlBfQVRPTUlDKTsKKworCWlmIChyZXN1Ym1pdF9kdGkpIHsKKwkJaW50IHJlc3VsdDsKKworCQl3YS0+ZHRpX3N0YXRlID0gV0FfRFRJX1RSQU5TRkVSX1JFU1VMVF9QRU5ESU5HOworCisJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHdhLT5kdGlfdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJlc3VsdCA8IDApIHsKIAkJCWRldl9lcnIoZGV2LCAiRFRJIEVycm9yOiBDb3VsZCBub3Qgc3VibWl0IERUSSBVUkIgKCVkKVxuIiwKIAkJCQlyZXN1bHQpOwpAQCAtMjU2MSwxMSArMjc4NSwxNSBAQAogCQkJCQl4ZmVyX3Jlc3VsdC0+aGRyLmJOb3RpZnlUeXBlKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXVzYl9zdGF0dXMgPSB4ZmVyX3Jlc3VsdC0+YlRyYW5zZmVyU3RhdHVzICYgMHgzZjsKLQkJCWlmICh1c2Jfc3RhdHVzID09IFdBX1hGRVJfU1RBVFVTX05PVF9GT1VORCkKLQkJCQkvKiB0YWtlbiBjYXJlIG9mIGFscmVhZHkgKi8KLQkJCQlicmVhazsKIAkJCXhmZXJfaWQgPSBsZTMyX3RvX2NwdSh4ZmVyX3Jlc3VsdC0+ZHdUcmFuc2ZlcklEKTsKKwkJCXVzYl9zdGF0dXMgPSB4ZmVyX3Jlc3VsdC0+YlRyYW5zZmVyU3RhdHVzICYgMHgzZjsKKwkJCWlmICh1c2Jfc3RhdHVzID09IFdBX1hGRVJfU1RBVFVTX05PVF9GT1VORCkgeworCQkJCS8qIHRha2VuIGNhcmUgb2YgYWxyZWFkeSAqLworCQkJCWRldl9kYmcoZGV2LCAiJXM6IHhmZXIgMHglMDhYIyV1IG5vdCBmb3VuZC5cbiIsCisJCQkJCV9fZnVuY19fLCB4ZmVyX2lkLAorCQkJCQl4ZmVyX3Jlc3VsdC0+YlRyYW5zZmVyU2VnbWVudCAmIDB4N2YpOworCQkJCWJyZWFrOworCQkJfQogCQkJeGZlciA9IHdhX3hmZXJfZ2V0X2J5X2lkKHdhLCB4ZmVyX2lkKTsKIAkJCWlmICh4ZmVyID09IE5VTEwpIHsKIAkJCQkvKiBGSVhNRTogdHJhbnNhY3Rpb24gbm90IGZvdW5kLiAqLwpAQCAtMjYxNCw2ICsyODQyLDU0IEBACiB9CiAKIC8qCisgKiBJbml0aWFsaXplIHRoZSBEVEkgVVJCIGZvciByZWFkaW5nIHRyYW5zZmVyIHJlc3VsdCBub3RpZmljYXRpb25zIGFuZCBhbHNvCisgKiB0aGUgYnVmZmVyLWluIFVSQiwgZm9yIHJlYWRpbmcgYnVmZmVycy4gVGhlbiB3ZSBqdXN0IHN1Ym1pdCB0aGUgRFRJIFVSQi4KKyAqLworaW50IHdhX2R0aV9zdGFydChzdHJ1Y3Qgd2FoYyAqd2EpCit7CisJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkdGlfZXBkID0gd2EtPmR0aV9lcGQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJndhLT51c2JfaWZhY2UtPmRldjsKKwlpbnQgcmVzdWx0ID0gLUVOT01FTSwgaW5kZXg7CisKKwlpZiAod2EtPmR0aV91cmIgIT0gTlVMTCkJLyogRFRJIFVSQiBhbHJlYWR5IHN0YXJ0ZWQgKi8KKwkJZ290byBvdXQ7CisKKwl3YS0+ZHRpX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKHdhLT5kdGlfdXJiID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBhbGxvY2F0ZSBEVEkgVVJCXG4iKTsKKwkJZ290byBlcnJvcl9kdGlfdXJiX2FsbG9jOworCX0KKwl1c2JfZmlsbF9idWxrX3VyYigKKwkJd2EtPmR0aV91cmIsIHdhLT51c2JfZGV2LAorCQl1c2JfcmN2YnVsa3BpcGUod2EtPnVzYl9kZXYsIDB4ODAgfCBkdGlfZXBkLT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJd2EtPmR0aV9idWYsIHdhLT5kdGlfYnVmX3NpemUsCisJCXdhX2R0aV9jYiwgd2EpOworCisJLyogaW5pdCB0aGUgYnVmIGluIFVSQnMgKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBXQV9NQVhfQlVGX0lOX1VSQlM7ICsraW5kZXgpIHsKKwkJdXNiX2ZpbGxfYnVsa191cmIoCisJCQkmKHdhLT5idWZfaW5fdXJic1tpbmRleF0pLCB3YS0+dXNiX2RldiwKKwkJCXVzYl9yY3ZidWxrcGlwZSh3YS0+dXNiX2RldiwKKwkJCQkweDgwIHwgZHRpX2VwZC0+YkVuZHBvaW50QWRkcmVzcyksCisJCQlOVUxMLCAwLCB3YV9idWZfaW5fY2IsIHdhKTsKKwl9CisJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIod2EtPmR0aV91cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiRFRJIEVycm9yOiBDb3VsZCBub3Qgc3VibWl0IERUSSBVUkIgKCVkKSByZXNldHRpbmdcbiIsCisJCQlyZXN1bHQpOworCQlnb3RvIGVycm9yX2R0aV91cmJfc3VibWl0OworCX0KK291dDoKKwlyZXR1cm4gMDsKKworZXJyb3JfZHRpX3VyYl9zdWJtaXQ6CisJdXNiX3B1dF91cmIod2EtPmR0aV91cmIpOworCXdhLT5kdGlfdXJiID0gTlVMTDsKK2Vycm9yX2R0aV91cmJfYWxsb2M6CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdhX2R0aV9zdGFydCk7CisvKgogICogVHJhbnNmZXIgY29tcGxldGUgbm90aWZpY2F0aW9uCiAgKgogICogQ2FsbGVkIGZyb20gdGhlIG5vdGlmLmMgY29kZS4gV2UgZ2V0IGEgbm90aWZpY2F0aW9uIG9uIEVQMiBzYXlpbmcKQEAgLTI2MjcsMTUgKzI5MDMsMTAgQEAKICAqIEZvbGxvdyB1cCBpbiB3YV9kdGlfY2IoKSwgYXMgdGhhdCdzIHdoZXJlIHRoZSB3aG9sZSBzdGF0ZQogICogbWFjaGluZSBzdGFydHMuCiAgKgotICogU28gaGVyZSB3ZSBqdXN0IGluaXRpYWxpemUgdGhlIERUSSBVUkIgZm9yIHJlYWRpbmcgdHJhbnNmZXIgcmVzdWx0Ci0gKiBub3RpZmljYXRpb25zIGFuZCBhbHNvIHRoZSBidWZmZXItaW4gVVJCLCBmb3IgcmVhZGluZyBidWZmZXJzLiBUaGVuCi0gKiB3ZSBqdXN0IHN1Ym1pdCB0aGUgRFRJIFVSQi4KLSAqCiAgKiBAd2Egc2hhbGwgYmUgcmVmZXJlbmNlZAogICovCiB2b2lkIHdhX2hhbmRsZV9ub3RpZl94ZmVyKHN0cnVjdCB3YWhjICp3YSwgc3RydWN0IHdhX25vdGlmX2hkciAqbm90aWZfaGRyKQogewotCWludCByZXN1bHQ7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJndhLT51c2JfaWZhY2UtPmRldjsKIAlzdHJ1Y3Qgd2Ffbm90aWZfeGZlciAqbm90aWZfeGZlcjsKIAljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmR0aV9lcGQgPSB3YS0+ZHRpX2VwZDsKQEAgLTI2NDksNDUgKzI5MjAsMTMgQEAKIAkJCW5vdGlmX3hmZXItPmJFbmRwb2ludCwgZHRpX2VwZC0+YkVuZHBvaW50QWRkcmVzcyk7CiAJCWdvdG8gZXJyb3I7CiAJfQotCWlmICh3YS0+ZHRpX3VyYiAhPSBOVUxMKQkvKiBEVEkgVVJCIGFscmVhZHkgc3RhcnRlZCAqLwotCQlnb3RvIG91dDsKIAotCXdhLT5kdGlfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAod2EtPmR0aV91cmIgPT0gTlVMTCkgewotCQlkZXZfZXJyKGRldiwgIkNhbid0IGFsbG9jYXRlIERUSSBVUkJcbiIpOwotCQlnb3RvIGVycm9yX2R0aV91cmJfYWxsb2M7Ci0JfQotCXVzYl9maWxsX2J1bGtfdXJiKAotCQl3YS0+ZHRpX3VyYiwgd2EtPnVzYl9kZXYsCi0JCXVzYl9yY3ZidWxrcGlwZSh3YS0+dXNiX2RldiwgMHg4MCB8IG5vdGlmX3hmZXItPmJFbmRwb2ludCksCi0JCXdhLT5kdGlfYnVmLCB3YS0+ZHRpX2J1Zl9zaXplLAotCQl3YV9kdGlfY2IsIHdhKTsKKwkvKiBhdHRlbXB0IHRvIHN0YXJ0IHRoZSBEVEkgZXAgcHJvY2Vzc2luZy4gKi8KKwlpZiAod2FfZHRpX3N0YXJ0KHdhKSA8IDApCisJCWdvdG8gZXJyb3I7CiAKLQl3YS0+YnVmX2luX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHdhLT5idWZfaW5fdXJiID09IE5VTEwpIHsKLQkJZGV2X2VycihkZXYsICJDYW4ndCBhbGxvY2F0ZSBCVUYtSU4gVVJCXG4iKTsKLQkJZ290byBlcnJvcl9idWZfaW5fdXJiX2FsbG9jOwotCX0KLQl1c2JfZmlsbF9idWxrX3VyYigKLQkJd2EtPmJ1Zl9pbl91cmIsIHdhLT51c2JfZGV2LAotCQl1c2JfcmN2YnVsa3BpcGUod2EtPnVzYl9kZXYsIDB4ODAgfCBub3RpZl94ZmVyLT5iRW5kcG9pbnQpLAotCQlOVUxMLCAwLCB3YV9idWZfaW5fY2IsIHdhKTsKLQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYih3YS0+ZHRpX3VyYiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJEVEkgRXJyb3I6IENvdWxkIG5vdCBzdWJtaXQgRFRJIFVSQiAoJWQpIHJlc2V0dGluZ1xuIiwKLQkJCXJlc3VsdCk7Ci0JCWdvdG8gZXJyb3JfZHRpX3VyYl9zdWJtaXQ7Ci0JfQotb3V0OgogCXJldHVybjsKIAotZXJyb3JfZHRpX3VyYl9zdWJtaXQ6Ci0JdXNiX3B1dF91cmIod2EtPmJ1Zl9pbl91cmIpOwotCXdhLT5idWZfaW5fdXJiID0gTlVMTDsKLWVycm9yX2J1Zl9pbl91cmJfYWxsb2M6Ci0JdXNiX3B1dF91cmIod2EtPmR0aV91cmIpOwotCXdhLT5kdGlfdXJiID0gTlVMTDsKLWVycm9yX2R0aV91cmJfYWxsb2M6CiBlcnJvcjoKIAl3YV9yZXNldF9hbGwod2EpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9pbnRycy5jIGIvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9pbnRycy5jCmluZGV4IDIxMDM1NzYuLjlkZDQ5YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmZpby9wY2kvdmZpb19wY2lfaW50cnMuYworKysgYi9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX2ludHJzLmMKQEAgLTQ4MiwxNSArNDgyLDE5IEBACiAJCWZvciAoaSA9IDA7IGkgPCBudmVjOyBpKyspCiAJCQl2ZGV2LT5tc2l4W2ldLmVudHJ5ID0gaTsKIAotCQlyZXQgPSBwY2lfZW5hYmxlX21zaXgocGRldiwgdmRldi0+bXNpeCwgbnZlYyk7Ci0JCWlmIChyZXQpIHsKKwkJcmV0ID0gcGNpX2VuYWJsZV9tc2l4X3JhbmdlKHBkZXYsIHZkZXYtPm1zaXgsIDEsIG52ZWMpOworCQlpZiAocmV0IDwgbnZlYykgeworCQkJaWYgKHJldCA+IDApCisJCQkJcGNpX2Rpc2FibGVfbXNpeChwZGV2KTsKIAkJCWtmcmVlKHZkZXYtPm1zaXgpOwogCQkJa2ZyZWUodmRldi0+Y3R4KTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9IGVsc2UgewotCQlyZXQgPSBwY2lfZW5hYmxlX21zaV9ibG9jayhwZGV2LCBudmVjKTsKLQkJaWYgKHJldCkgeworCQlyZXQgPSBwY2lfZW5hYmxlX21zaV9yYW5nZShwZGV2LCAxLCBudmVjKTsKKwkJaWYgKHJldCA8IG52ZWMpIHsKKwkJCWlmIChyZXQgPiAwKQorCQkJCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKIAkJCWtmcmVlKHZkZXYtPmN0eCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKaW5kZXggZGFkZTViNy4uYjRiMjA5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwpAQCAtMjcsMTIgKzI3LDYgQEAKICAgICAgICB0cmlzdGF0ZQogICAgICAgIGRlZmF1bHQgbgogCi1jb25maWcgVklERU9fT1VUUFVUX0NPTlRST0wKLQl0cmlzdGF0ZSAiTG93bGV2ZWwgdmlkZW8gb3V0cHV0IHN3aXRjaCBjb250cm9scyIKLQloZWxwCi0JICBUaGlzIGZyYW1ld29yayBhZGRzIHN1cHBvcnQgZm9yIGxvdy1sZXZlbCBjb250cm9sIG9mIHRoZSB2aWRlbyAKLQkgIG91dHB1dCBzd2l0Y2guCi0KIGNvbmZpZyBWSURFT01PREVfSEVMUEVSUwogCWJvb2wKIApAQCAtODAyLDE4ICs3OTYsOSBAQAogCSAgQXMgdGhpcyBjYXJkIHRlY2hub2xvZ3kgaXMgYXQgbGVhc3QgMjUgeWVhcnMgb2xkLAogCSAgbW9zdCBwZW9wbGUgd2lsbCBhbnN3ZXIgTiBoZXJlLgogCi1jb25maWcgRkJfU0dJVlcKLQl0cmlzdGF0ZSAiU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbiBmcmFtZWJ1ZmZlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gRkIgJiYgWDg2X1ZJU1dTCi0Jc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAotCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKLQlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAotCWhlbHAKLQkgIFNHSSBWaXN1YWwgV29ya3N0YXRpb24gc3VwcG9ydCBmb3IgZnJhbWVidWZmZXIgZ3JhcGhpY3MuCi0KIGNvbmZpZyBGQl9HQkUKIAlib29sICJTR0kgR3JhcGhpY3MgQmFja2VuZCBmcmFtZSBidWZmZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIChGQiA9IHkpICYmIChTR0lfSVAzMiB8fCBYODZfVklTV1MpCisJZGVwZW5kcyBvbiAoRkIgPSB5KSAmJiBTR0lfSVAzMgogCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKIAlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCiAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCmluZGV4IGFlMTdkZGYuLjFiZTI2ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aWRlby9NYWtlZmlsZQpAQCAtNzUsNyArNzUsNiBAQAogb2JqLSQoQ09ORklHX0ZCX1A5MTAwKSAgICAgICAgICAgICs9IHA5MTAwLm8gc2J1c2xpYi5vCiBvYmotJChDT05GSUdfRkJfVENYKSAgICAgICAgICAgICAgKz0gdGN4Lm8gc2J1c2xpYi5vCiBvYmotJChDT05GSUdfRkJfTEVPKSAgICAgICAgICAgICAgKz0gbGVvLm8gc2J1c2xpYi5vCi1vYmotJChDT05GSUdfRkJfU0dJVlcpICAgICAgICAgICAgKz0gc2dpdndmYi5vCiBvYmotJChDT05GSUdfRkJfQUNPUk4pICAgICAgICAgICAgKz0gYWNvcm5mYi5vCiBvYmotJChDT05GSUdfRkJfQVRBUkkpICAgICAgICAgICAgKz0gYXRhZmIubyBjMnBfaXBsYW4yLm8gYXRhZmJfbWZiLm8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0YWZiX2lwbGFuMnAyLm8gYXRhZmJfaXBsYW4ycDQubyBhdGFmYl9pcGxhbjJwOC5vCkBAIC0xNzIsOCArMTcxLDYgQEAKICMgdGhlIHRlc3QgZnJhbWVidWZmZXIgaXMgbGFzdAogb2JqLSQoQ09ORklHX0ZCX1ZJUlRVQUwpICAgICAgICAgICs9IHZmYi5vCiAKLSN2aWRlbyBvdXRwdXQgc3dpdGNoIHN5c2ZzIGRyaXZlcgotb2JqLSQoQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MKSArPSBvdXRwdXQubwogb2JqLSQoQ09ORklHX1ZJREVPTU9ERV9IRUxQRVJTKSArPSBkaXNwbGF5X3RpbWluZy5vIHZpZGVvbW9kZS5vCiBpZmVxICgkKENPTkZJR19PRikseSkKIG9iai0kKENPTkZJR19WSURFT01PREVfSEVMUEVSUykgKz0gb2ZfZGlzcGxheV90aW1pbmcubyBvZl92aWRlb21vZGUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9nYmVmYi5jIGIvZHJpdmVycy92aWRlby9nYmVmYi5jCmluZGV4IDRjN2NiMzYuLjNlYzY1YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZ2JlZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2diZWZiLmMKQEAgLTQ1LDEwICs0NSw2IEBACiAjZGVmaW5lIEdCRV9CQVNFCTB4MTYwMDAwMDAgLyogU0dJIE8yICovCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19YODZfVklTV1MKLSNkZWZpbmUgR0JFX0JBU0UJMHhkMDAwMDAwMCAvKiBTR0kgVmlzdWFsIFdvcmtzdGF0aW9uICovCi0jZW5kaWYKLQogLyogbWFjcm8gZm9yIGZhc3Rlc3Qgd3JpdGUtdGhvdWdoIGFjY2VzcyB0byB0aGUgZnJhbWVidWZmZXIgKi8KICNpZmRlZiBDT05GSUdfTUlQUwogI2lmZGVmIENPTkZJR19DUFVfUjEwMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2h5cGVydl9mYi5jIGIvZHJpdmVycy92aWRlby9oeXBlcnZfZmIuYwppbmRleCAxMzA3MDhmLi5lMjMzOTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2h5cGVydl9mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaHlwZXJ2X2ZiLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2h5cGVydi5oPgogCkBAIC0yMTIsNiArMjEzLDcgQEAKIAogc3RydWN0IGh2ZmJfcGFyIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgcmVzb3VyY2UgbWVtOwogCWJvb2wgZmJfcmVhZHk7IC8qIGZiIGRldmljZSBpcyByZWFkeSAqLwogCXN0cnVjdCBjb21wbGV0aW9uIHdhaXQ7CiAJdTMyIHN5bnRodmlkX3ZlcnNpb247CkBAIC00NjAsMTMgKzQ2MiwxMyBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCWlmIChwYXItPnN5bnRodmlkX3ZlcnNpb24gPT0gU1lOVEhWSURfVkVSU0lPTl9XSU43KSB7CisJaWYgKHBhci0+c3ludGh2aWRfdmVyc2lvbiA9PSBTWU5USFZJRF9WRVJTSU9OX1dJTjcpCiAJCXNjcmVlbl9kZXB0aCA9IFNZTlRIVklEX0RFUFRIX1dJTjc7Ci0JCXNjcmVlbl9mYl9zaXplID0gU1lOVEhWSURfRkJfU0laRV9XSU43OwotCX0gZWxzZSB7CisJZWxzZQogCQlzY3JlZW5fZGVwdGggPSBTWU5USFZJRF9ERVBUSF9XSU44OwotCQlzY3JlZW5fZmJfc2l6ZSA9IFNZTlRIVklEX0ZCX1NJWkVfV0lOODsKLQl9CisKKwlzY3JlZW5fZmJfc2l6ZSA9IGhkZXYtPmNoYW5uZWwtPm9mZmVybXNnLm9mZmVyLgorCQkJCW1taW9fbWVnYWJ5dGVzICogMTAyNCAqIDEwMjQ7CiAKIAlyZXR1cm4gMDsKIApAQCAtNjI3LDI2ICs2MjksNDYgQEAKIC8qIEdldCBmcmFtZWJ1ZmZlciBtZW1vcnkgZnJvbSBIeXBlci1WIHZpZGVvIHBjaSBzcGFjZSAqLwogc3RhdGljIGludCBodmZiX2dldG1lbShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQl1bG9uZyBmYl9waHlzOworCXN0cnVjdCBodmZiX3BhciAqcGFyID0gaW5mby0+cGFyOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ICA9IE5VTEw7CiAJdm9pZCBfX2lvbWVtICpmYl92aXJ0OworCWludCBnZW4ydm0gPSBlZmlfZW5hYmxlZChFRklfQk9PVCk7CisJaW50IHJldDsKIAotCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX01JQ1JPU09GVCwKKwlwYXItPm1lbS5uYW1lID0gS0JVSUxEX01PRE5BTUU7CisJcGFyLT5tZW0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfQlVTWTsKKwlpZiAoZ2VuMnZtKSB7CisJCXJldCA9IGFsbG9jYXRlX3Jlc291cmNlKCZoeXBlcnZfbW1pbywgJnBhci0+bWVtLAorCQkJCQlzY3JlZW5fZmJfc2l6ZSwKKwkJCQkJMCwgLTEsCisJCQkJCXNjcmVlbl9mYl9zaXplLAorCQkJCQlOVUxMLCBOVUxMKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBmcmFtZWJ1ZmZlciBtZW1vcnlcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9IGVsc2UgeworCQlwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9NSUNST1NPRlQsCiAJCQkgICAgICBQQ0lfREVWSUNFX0lEX0hZUEVSVl9WSURFTywgTlVMTCk7Ci0JaWYgKCFwZGV2KSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGZpbmQgUENJIEh5cGVyLVYgdmlkZW9cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJaWYgKCFwZGV2KSB7CisJCQlwcl9lcnIoIlVuYWJsZSB0byBmaW5kIFBDSSBIeXBlci1WIHZpZGVvXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pIHx8CisJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApIDwgc2NyZWVuX2ZiX3NpemUpCisJCQlnb3RvIGVycjE7CisKKwkJcGFyLT5tZW0uZW5kID0gcGNpX3Jlc291cmNlX2VuZChwZGV2LCAwKTsKKwkJcGFyLT5tZW0uc3RhcnQgPSBwYXItPm1lbS5lbmQgLSBzY3JlZW5fZmJfc2l6ZSArIDE7CisJCXJldCA9IHJlcXVlc3RfcmVzb3VyY2UoJnBkZXYtPnJlc291cmNlWzBdLCAmcGFyLT5tZW0pOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXByX2VycigiVW5hYmxlIHRvIHJlcXVlc3QgZnJhbWVidWZmZXIgbWVtb3J5XG4iKTsKKwkJCWdvdG8gZXJyMTsKKwkJfQogCX0KIAotCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKSAmIElPUkVTT1VSQ0VfTUVNKSB8fAotCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApIDwgc2NyZWVuX2ZiX3NpemUpCi0JCWdvdG8gZXJyMTsKLQotCWZiX3BoeXMgPSBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIDApIC0gc2NyZWVuX2ZiX3NpemUgKyAxOwotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGZiX3BoeXMsIHNjcmVlbl9mYl9zaXplLCBLQlVJTERfTU9ETkFNRSkpCi0JCWdvdG8gZXJyMTsKLQotCWZiX3ZpcnQgPSBpb3JlbWFwKGZiX3BoeXMsIHNjcmVlbl9mYl9zaXplKTsKKwlmYl92aXJ0ID0gaW9yZW1hcChwYXItPm1lbS5zdGFydCwgc2NyZWVuX2ZiX3NpemUpOwogCWlmICghZmJfdmlydCkKIAkJZ290byBlcnIyOwogCkBAIC02NTQsMzAgKzY3Niw0NCBAQAogCWlmICghaW5mby0+YXBlcnR1cmVzKQogCQlnb3RvIGVycjM7CiAKLQlpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwotCWluZm8tPmFwZXJ0dXJlcy0+cmFuZ2VzWzBdLnNpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOwotCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gZmJfcGh5czsKKwlpZiAoZ2VuMnZtKSB7CisJCWluZm8tPmFwZXJ0dXJlcy0+cmFuZ2VzWzBdLmJhc2UgPSBzY3JlZW5faW5mby5sZmJfYmFzZTsKKwkJaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uc2l6ZSA9IHNjcmVlbl9pbmZvLmxmYl9zaXplOworCQlyZW1vdmVfY29uZmxpY3RpbmdfZnJhbWVidWZmZXJzKGluZm8tPmFwZXJ0dXJlcywKKwkJCQkJCUtCVUlMRF9NT0ROQU1FLCBmYWxzZSk7CisJfSBlbHNlIHsKKwkJaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwkJaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7CisJfQorCisJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBwYXItPm1lbS5zdGFydDsKIAlpbmZvLT5maXguc21lbV9sZW4gPSBzY3JlZW5fZmJfc2l6ZTsKIAlpbmZvLT5zY3JlZW5fYmFzZSA9IGZiX3ZpcnQ7CiAJaW5mby0+c2NyZWVuX3NpemUgPSBzY3JlZW5fZmJfc2l6ZTsKIAotCXBjaV9kZXZfcHV0KHBkZXYpOworCWlmICghZ2VuMnZtKQorCQlwY2lfZGV2X3B1dChwZGV2KTsKKwogCXJldHVybiAwOwogCiBlcnIzOgogCWlvdW5tYXAoZmJfdmlydCk7CiBlcnIyOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihmYl9waHlzLCBzY3JlZW5fZmJfc2l6ZSk7CisJcmVsZWFzZV9yZXNvdXJjZSgmcGFyLT5tZW0pOwogZXJyMToKLQlwY2lfZGV2X3B1dChwZGV2KTsKKwlpZiAoIWdlbjJ2bSkKKwkJcGNpX2Rldl9wdXQocGRldik7CisKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAogLyogUmVsZWFzZSB0aGUgZnJhbWVidWZmZXIgKi8KIHN0YXRpYyB2b2lkIGh2ZmJfcHV0bWVtKHN0cnVjdCBmYl9pbmZvICppbmZvKQogeworCXN0cnVjdCBodmZiX3BhciAqcGFyID0gaW5mby0+cGFyOworCiAJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPmZpeC5zbWVtX3N0YXJ0LCBzY3JlZW5fZmJfc2l6ZSk7CisJcmVsZWFzZV9yZXNvdXJjZSgmcGFyLT5tZW0pOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbG9nby9LY29uZmlnIGIvZHJpdmVycy92aWRlby9sb2dvL0tjb25maWcKaW5kZXggMzlhYzQ5ZS4uMDAzNzEwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9sb2dvL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9sb2dvL0tjb25maWcKQEAgLTU0LDcgKzU0LDcgQEAKIAogY29uZmlnIExPR09fU0dJX0NMVVQyMjQKIAlib29sICIyMjQtY29sb3IgU0dJIExpbnV4IGxvZ28iCi0JZGVwZW5kcyBvbiBTR0lfSVAyMiB8fCBTR0lfSVAyNyB8fCBTR0lfSVAzMiB8fCBYODZfVklTV1MKKwlkZXBlbmRzIG9uIFNHSV9JUDIyIHx8IFNHSV9JUDI3IHx8IFNHSV9JUDMyCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBMT0dPX1NVTl9DTFVUMjI0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2xvZ28vbG9nby5jIGIvZHJpdmVycy92aWRlby9sb2dvL2xvZ28uYwppbmRleCBiNjcwY2JkLi45NDBjZDE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2xvZ28vbG9nby5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbG9nby9sb2dvLmMKQEAgLTgxLDcgKzgxLDcgQEAKIAkJbG9nbyA9ICZsb2dvX3BhcmlzY19jbHV0MjI0OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0xPR09fU0dJX0NMVVQyMjQKLQkJLyogU0dJIExpbnV4IGxvZ28gb24gTUlQUy9NSVBTNjQgYW5kIFZJU1dTICovCisJCS8qIFNHSSBMaW51eCBsb2dvIG9uIE1JUFMvTUlQUzY0ICovCiAJCWxvZ28gPSAmbG9nb19zZ2lfY2x1dDIyNDsKICNlbmRpZgogI2lmZGVmIENPTkZJR19MT0dPX1NVTl9DTFVUMjI0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL291dHB1dC5jIGIvZHJpdmVycy92aWRlby9vdXRwdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0NmM0OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3ZpZGVvL291dHB1dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiAgb3V0cHV0LmMgLSBEaXNwbGF5IE91dHB1dCBTd2l0Y2ggZHJpdmVyCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNiBMdW1pbmcgWXUgPGx1bWluZy55dUBpbnRlbC5jb20+Ci0gKgotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgotICoKLSAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb19vdXRwdXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLQotCi1NT0RVTEVfREVTQ1JJUFRJT04oIkRpc3BsYXkgT3V0cHV0IFN3aXRjaGVyIExvd2xldmVsIENvbnRyb2wgQWJzdHJhY3Rpb24iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkx1bWluZyBZdSA8bHVtaW5nLnl1QGludGVsLmNvbT4iKTsKLQotc3RhdGljIHNzaXplX3Qgc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICBjaGFyICpidWYpCi17Ci0Jc3NpemVfdCByZXRfc2l6ZSA9IDA7Ci0Jc3RydWN0IG91dHB1dF9kZXZpY2UgKm9kID0gdG9fb3V0cHV0X2RldmljZShkZXYpOwotCWlmIChvZC0+cHJvcHMpCi0JCXJldF9zaXplID0gc3ByaW50ZihidWYsIiUuOHhcbiIsb2QtPnByb3BzLT5nZXRfc3RhdHVzKG9kKSk7Ci0JcmV0dXJuIHJldF9zaXplOwotfQotCi1zdGF0aWMgc3NpemVfdCBzdGF0ZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgY29uc3QgY2hhciAqYnVmLHNpemVfdCBjb3VudCkKLXsKLQljaGFyICplbmRwOwotCXN0cnVjdCBvdXRwdXRfZGV2aWNlICpvZCA9IHRvX291dHB1dF9kZXZpY2UoZGV2KTsKLQlpbnQgcmVxdWVzdF9zdGF0ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwmZW5kcCwwKTsKLQlzaXplX3Qgc2l6ZSA9IGVuZHAgLSBidWY7Ci0KLQlpZiAoaXNzcGFjZSgqZW5kcCkpCi0JCXNpemUrKzsKLQlpZiAoc2l6ZSAhPSBjb3VudCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAob2QtPnByb3BzKSB7Ci0JCW9kLT5yZXF1ZXN0X3N0YXRlID0gcmVxdWVzdF9zdGF0ZTsKLQkJb2QtPnByb3BzLT5zZXRfc3RhdGUob2QpOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFJfUlcoc3RhdGUpOwotCi1zdGF0aWMgdm9pZCB2aWRlb19vdXRwdXRfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG91dHB1dF9kZXZpY2UgKm9kID0gdG9fb3V0cHV0X2RldmljZShkZXYpOwotCWtmcmVlKG9kKTsKLX0KLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnZpZGVvX291dHB1dF9hdHRyc1tdID0gewotCSZkZXZfYXR0cl9zdGF0ZS5hdHRyLAotCU5VTEwsCi19OwotQVRUUklCVVRFX0dST1VQUyh2aWRlb19vdXRwdXQpOwotCi1zdGF0aWMgc3RydWN0IGNsYXNzIHZpZGVvX291dHB1dF9jbGFzcyA9IHsKLQkubmFtZSA9ICJ2aWRlb19vdXRwdXQiLAotCS5kZXZfcmVsZWFzZSA9IHZpZGVvX291dHB1dF9yZWxlYXNlLAotCS5kZXZfZ3JvdXBzID0gdmlkZW9fb3V0cHV0X2dyb3VwcywKLX07Ci0KLXN0cnVjdCBvdXRwdXRfZGV2aWNlICp2aWRlb19vdXRwdXRfcmVnaXN0ZXIoY29uc3QgY2hhciAqbmFtZSwKLQlzdHJ1Y3QgZGV2aWNlICpkZXYsCi0Jdm9pZCAqZGV2ZGF0YSwKLQlzdHJ1Y3Qgb3V0cHV0X3Byb3BlcnRpZXMgKm9wKQotewotCXN0cnVjdCBvdXRwdXRfZGV2aWNlICpuZXdfZGV2OwotCWludCByZXRfY29kZSA9IDA7Ci0KLQluZXdfZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG91dHB1dF9kZXZpY2UpLEdGUF9LRVJORUwpOwotCWlmICghbmV3X2RldikgewotCQlyZXRfY29kZSA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQluZXdfZGV2LT5wcm9wcyA9IG9wOwotCW5ld19kZXYtPmRldi5jbGFzcyA9ICZ2aWRlb19vdXRwdXRfY2xhc3M7Ci0JbmV3X2Rldi0+ZGV2LnBhcmVudCA9IGRldjsKLQlkZXZfc2V0X25hbWUoJm5ld19kZXYtPmRldiwgIiVzIiwgbmFtZSk7Ci0JZGV2X3NldF9kcnZkYXRhKCZuZXdfZGV2LT5kZXYsIGRldmRhdGEpOwotCXJldF9jb2RlID0gZGV2aWNlX3JlZ2lzdGVyKCZuZXdfZGV2LT5kZXYpOwotCWlmIChyZXRfY29kZSkgewotCQlrZnJlZShuZXdfZGV2KTsKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCXJldHVybiBuZXdfZGV2OwotCi1lcnJvcl9yZXR1cm46Ci0JcmV0dXJuIEVSUl9QVFIocmV0X2NvZGUpOwotfQotRVhQT1JUX1NZTUJPTCh2aWRlb19vdXRwdXRfcmVnaXN0ZXIpOwotCi12b2lkIHZpZGVvX291dHB1dF91bnJlZ2lzdGVyKHN0cnVjdCBvdXRwdXRfZGV2aWNlICpkZXYpCi17Ci0JaWYgKCFkZXYpCi0JCXJldHVybjsKLQlkZXZpY2VfdW5yZWdpc3RlcigmZGV2LT5kZXYpOwotfQotRVhQT1JUX1NZTUJPTCh2aWRlb19vdXRwdXRfdW5yZWdpc3Rlcik7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB2aWRlb19vdXRwdXRfY2xhc3NfZXhpdCh2b2lkKQotewotCWNsYXNzX3VucmVnaXN0ZXIoJnZpZGVvX291dHB1dF9jbGFzcyk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHZpZGVvX291dHB1dF9jbGFzc19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGNsYXNzX3JlZ2lzdGVyKCZ2aWRlb19vdXRwdXRfY2xhc3MpOwotfQotCi1wb3N0Y29yZV9pbml0Y2FsbCh2aWRlb19vdXRwdXRfY2xhc3NfaW5pdCk7Ci1tb2R1bGVfZXhpdCh2aWRlb19vdXRwdXRfY2xhc3NfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NnaXZ3ZmIuYyBiL2RyaXZlcnMvdmlkZW8vc2dpdndmYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzc0ZDA0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdmlkZW8vc2dpdndmYi5jCisrKyAvZGV2L251bGwKQEAgLTEsODg5ICswLDAgQEAKLS8qCi0gKiAgbGludXgvZHJpdmVycy92aWRlby9zZ2l2d2ZiLmMgLS0gU0dJIERCRSBmcmFtZSBidWZmZXIgZGV2aWNlCi0gKgotICoJQ29weXJpZ2h0IChDKSAxOTk5IFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqICAgICAgSmVmZnJleSBOZXdxdWlzdCwgbmV3cXVpc3RAZW5nci5zZ2kuc29tCi0gKgotICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgTGljZW5zZS4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKLSAqICBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL210cnIuaD4KLSNpbmNsdWRlIDxhc20vdmlzd3Mvc2dpdncuaD4KLQotI2RlZmluZSBJTkNMVURFX1RJTUlOR19UQUJMRV9EQVRBCi0jZGVmaW5lIERCRV9SRUdfQkFTRSBwYXItPnJlZ3MKLSNpbmNsdWRlIDx2aWRlby9zZ2l2dy5oPgotCi1zdHJ1Y3Qgc2dpdndfcGFyIHsKLQlzdHJ1Y3QgYXNyZWdzICpyZWdzOwotCXUzMiBjbWFwX2ZpZm87Ci0JdV9sb25nIHRpbWluZ19udW07Ci19OwotCi0jZGVmaW5lIEZMQVRQQU5FTF9TR0lfMTYwMFNXCTUKLQotLyoKLSAqICBSQU0gd2UgcmVzZXJ2ZSBmb3IgdGhlIGZyYW1lIGJ1ZmZlci4gVGhpcyBkZWZpbmVzIHRoZSBtYXhpbXVtIHNjcmVlbgotICogIHNpemUKLSAqCi0gKiAgVGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gaWYgdGhlIGRyaXZlciBpcyBjb21waWxlZCBhcyBhIG1vZHVsZQotICovCi0KLXN0YXRpYyBpbnQgeXBhbiA9IDA7Ci1zdGF0aWMgaW50IHl3cmFwID0gMDsKLQotc3RhdGljIGludCBmbGF0cGFuZWxfaWQgPSAtMTsKLQotc3RhdGljIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBzZ2l2d2ZiX2ZpeCA9IHsKLQkuaWQJCT0gIlNHSSBWaXMgV1MgRkIiLAotCS50eXBlCQk9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUywKLSAgICAgICAgLnZpc3VhbAkJPSBGQl9WSVNVQUxfUFNFVURPQ09MT1IsCi0JLm1taW9fc3RhcnQJPSBEQkVfUkVHX1BIWVMsCi0JLm1taW9fbGVuCT0gREJFX1JFR19TSVpFLAotICAgICAgICAuYWNjZWwJCT0gRkJfQUNDRUxfTk9ORSwKLQkubGluZV9sZW5ndGgJPSA2NDAsCi19OwotCi1zdGF0aWMgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHNnaXZ3ZmJfdmFyID0gewotCS8qIDY0MHg0ODAsIDggYnBwICovCi0JLnhyZXMJCT0gNjQwLAotCS55cmVzCQk9IDQ4MCwKLQkueHJlc192aXJ0dWFsCT0gNjQwLAotCS55cmVzX3ZpcnR1YWwJPSA0ODAsCi0JLmJpdHNfcGVyX3BpeGVsCT0gOCwKLQkucmVkCQk9IHsgMCwgOCwgMCB9LAotCS5ncmVlbgkJPSB7IDAsIDgsIDAgfSwKLQkuYmx1ZQkJPSB7IDAsIDgsIDAgfSwKLQkuaGVpZ2h0CQk9IC0xLAotCS53aWR0aAkJPSAtMSwKLQkucGl4Y2xvY2sJPSAyMDAwMCwKLQkubGVmdF9tYXJnaW4JPSA2NCwKLQkucmlnaHRfbWFyZ2luCT0gNjQsCi0JLnVwcGVyX21hcmdpbgk9IDMyLAotCS5sb3dlcl9tYXJnaW4JPSAzMiwKLQkuaHN5bmNfbGVuCT0gNjQsCi0JLnZzeW5jX2xlbgk9IDIsCi0JLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gc2dpdndmYl92YXIxNjAwc3cgPSB7Ci0JLyogMTYwMHgxMDI0LCA4IGJwcCAqLwotCS54cmVzCQk9IDE2MDAsCi0JLnlyZXMJCT0gMTAyNCwKLQkueHJlc192aXJ0dWFsCT0gMTYwMCwKLQkueXJlc192aXJ0dWFsCT0gMTAyNCwKLQkuYml0c19wZXJfcGl4ZWwJPSA4LAotCS5yZWQJCT0geyAwLCA4LCAwIH0sCi0JLmdyZWVuCQk9IHsgMCwgOCwgMCB9LAotCS5ibHVlCQk9IHsgMCwgOCwgMCB9LAotCS5oZWlnaHQJCT0gLTEsCi0JLndpZHRoCQk9IC0xLAotCS5waXhjbG9jawk9IDkzNTMsCi0JLmxlZnRfbWFyZ2luCT0gMjAsCi0JLnJpZ2h0X21hcmdpbgk9IDMwLAotCS51cHBlcl9tYXJnaW4JPSAzNywKLQkubG93ZXJfbWFyZ2luCT0gMywKLQkuaHN5bmNfbGVuCT0gMjAsCi0JLnZzeW5jX2xlbgk9IDMsCi0JLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKLX07Ci0KLS8qCi0gKiAgSW50ZXJmYWNlIHVzZWQgYnkgdGhlIHdvcmxkCi0gKi8KLWludCBzZ2l2d2ZiX2luaXQodm9pZCk7Ci0KLXN0YXRpYyBpbnQgc2dpdndmYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyBpbnQgc2dpdndmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyBpbnQgc2dpdndmYl9zZXRjb2xyZWcodV9pbnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sCi0JCQkgICAgIHVfaW50IGJsdWUsIHVfaW50IHRyYW5zcCwKLQkJCSAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCBzZ2l2d2ZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sCi0JCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHNnaXZ3ZmJfb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkuZmJfY2hlY2tfdmFyCT0gc2dpdndmYl9jaGVja192YXIsCi0JLmZiX3NldF9wYXIJPSBzZ2l2d2ZiX3NldF9wYXIsCi0JLmZiX3NldGNvbHJlZwk9IHNnaXZ3ZmJfc2V0Y29scmVnLAotCS5mYl9maWxscmVjdAk9IGNmYl9maWxscmVjdCwKLQkuZmJfY29weWFyZWEJPSBjZmJfY29weWFyZWEsCi0JLmZiX2ltYWdlYmxpdAk9IGNmYl9pbWFnZWJsaXQsCi0JLmZiX21tYXAJPSBzZ2l2d2ZiX21tYXAsCi19OwotCi0vKgotICogIEludGVybmFsIHJvdXRpbmVzCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGJ5dGVzX3Blcl9waXhlbChpbnQgYnBwKQotewotCXN3aXRjaCAoYnBwKSB7Ci0JCWNhc2UgODoKLQkJCXJldHVybiAxOwotCQljYXNlIDE2OgotCQkJcmV0dXJuIDI7Ci0JCWNhc2UgMzI6Ci0JCQlyZXR1cm4gNDsKLQkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0lORk8gInNnaXZ3ZmI6IHVuc3VwcG9ydGVkIGJwcCAlZFxuIiwgYnBwKTsKLQkJCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2xpbmVfbGVuZ3RoKGludCB4cmVzX3ZpcnR1YWwsIGludCBicHApCi17Ci0JcmV0dXJuICh4cmVzX3ZpcnR1YWwgKiBieXRlc19wZXJfcGl4ZWwoYnBwKSk7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjoJZGJlX1R1cm5PZmZEbWEKLSAqIFBhcmFtZXRlcnM6CShOb25lKQotICogRGVzY3JpcHRpb246CVRoaXMgc2hvdWxkIHR1cm4gb2ZmIHRoZSBtb25pdG9yIGFuZCBkYmUuICBUaGlzIGlzIHVzZWQKLSAqICAgICAgICAgICAgICB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIHRoZSBzZXJpYWwgY29uc29sZSBhbmQgdGhlIGdyYXBoaWNzCi0gKiAgICAgICAgICAgICAgY29uc29sZS4KLSAqLwotCi1zdGF0aWMgdm9pZCBkYmVfVHVybk9mZkRtYShzdHJ1Y3Qgc2dpdndfcGFyICpwYXIpCi17Ci0JdW5zaWduZWQgaW50IHJlYWRWYWw7Ci0JaW50IGk7Ci0KLQkvLyBDaGVjayB0byBzZWUgaWYgdGhpbmdzIGFyZSBhbHJlYWR5IHR1cm5lZCBvZmY6Ci0JLy8gMSkgQ2hlY2sgdG8gc2VlIGlmIGRiZSBpcyBub3QgdXNpbmcgdGhlIGludGVybmFsIGRvdGNsb2NrLgotCS8vIDIpIENoZWNrIHRvIHNlZSBpZiB0aGUgeHkgY291bnRlciBpbiBkYmUgaXMgYWxyZWFkeSBvZmYuCi0KLQlEQkVfR0VUUkVHKGN0cmxzdGF0LCByZWFkVmFsKTsKLQlpZiAoR0VUX0RCRV9GSUVMRChDVFJMU1RBVCwgUENMS1NFTCwgcmVhZFZhbCkgPCAyKQotCQlyZXR1cm47Ci0KLQlEQkVfR0VUUkVHKHZ0X3h5LCByZWFkVmFsKTsKLQlpZiAoR0VUX0RCRV9GSUVMRChWVF9YWSwgVlRfRlJFRVpFLCByZWFkVmFsKSA9PSAxKQotCQlyZXR1cm47Ci0KLQkvLyBPdGhlcndpc2UsIHR1cm4gb2ZmIGRiZQotCi0JREJFX0dFVFJFRyhvdnJfY29udHJvbCwgcmVhZFZhbCk7Ci0JU0VUX0RCRV9GSUVMRChPVlJfQ09OVFJPTCwgT1ZSX0RNQV9FTkFCTEUsIHJlYWRWYWwsIDApOwotCURCRV9TRVRSRUcob3ZyX2NvbnRyb2wsIHJlYWRWYWwpOwotCXVkZWxheSgxMDAwKTsKLQlEQkVfR0VUUkVHKGZybV9jb250cm9sLCByZWFkVmFsKTsKLQlTRVRfREJFX0ZJRUxEKEZSTV9DT05UUk9MLCBGUk1fRE1BX0VOQUJMRSwgcmVhZFZhbCwgMCk7Ci0JREJFX1NFVFJFRyhmcm1fY29udHJvbCwgcmVhZFZhbCk7Ci0JdWRlbGF5KDEwMDApOwotCURCRV9HRVRSRUcoZGlkX2NvbnRyb2wsIHJlYWRWYWwpOwotCVNFVF9EQkVfRklFTEQoRElEX0NPTlRST0wsIERJRF9ETUFfRU5BQkxFLCByZWFkVmFsLCAwKTsKLQlEQkVfU0VUUkVHKGRpZF9jb250cm9sLCByZWFkVmFsKTsKLQl1ZGVsYXkoMTAwMCk7Ci0KLQkvLyBYWFggSEFDSzoKLQkvLwotCS8vICAgIFRoaXMgd2FzIG5lY2Vzc2FyeSBmb3IgR0JFLS13ZSBoYWQgdG8gd2FpdCB0aHJvdWdoIHR3bwotCS8vICAgIHZlcnRpY2FsIHJldHJhY2UgcGVyaW9kcyBiZWZvcmUgdGhlIHBpeGVsIERNQSB3YXMKLQkvLyAgICB0dXJuZWQgb2ZmIGZvciBzdXJlLiAgSSd2ZSBsZWZ0IHRoaXMgaW4gZm9yIG5vdywgaW4KLQkvLyAgICBjYXNlIGRiZSBuZWVkcyBpdC4KLQotCWZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7Ci0JCURCRV9HRVRSRUcoZnJtX2luaHdjdHJsLCByZWFkVmFsKTsKLQkJaWYgKEdFVF9EQkVfRklFTEQoRlJNX0lOSFdDVFJMLCBGUk1fRE1BX0VOQUJMRSwgcmVhZFZhbCkgPT0KLQkJICAgIDApCi0JCQl1ZGVsYXkoMTApOwotCQllbHNlIHsKLQkJCURCRV9HRVRSRUcob3ZyX2luaHdjdHJsLCByZWFkVmFsKTsKLQkJCWlmIChHRVRfREJFX0ZJRUxECi0JCQkgICAgKE9WUl9JTkhXQ1RSTCwgT1ZSX0RNQV9FTkFCTEUsIHJlYWRWYWwpID09IDApCi0JCQkJdWRlbGF5KDEwKTsKLQkJCWVsc2UgewotCQkJCURCRV9HRVRSRUcoZGlkX2luaHdjdHJsLCByZWFkVmFsKTsKLQkJCQlpZiAoR0VUX0RCRV9GSUVMRAotCQkJCSAgICAoRElEX0lOSFdDVFJMLCBESURfRE1BX0VOQUJMRSwKLQkJCQkgICAgIHJlYWRWYWwpID09IDApCi0JCQkJCXVkZWxheSgxMCk7Ci0JCQkJZWxzZQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyoKLSAqICBTZXQgdGhlIFVzZXIgRGVmaW5lZCBQYXJ0IG9mIHRoZSBEaXNwbGF5LiBBZ2FpbiBpZiBwYXIgdXNlIGl0IHRvIGdldAotICogIHJlYWwgdmlkZW8gbW9kZS4KLSAqLwotc3RhdGljIGludCBzZ2l2d2ZiX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgCi0JCQkgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCXN0cnVjdCBzZ2l2d19wYXIgKnBhciA9IChzdHJ1Y3Qgc2dpdndfcGFyICopaW5mby0+cGFyOwotCXN0cnVjdCBkYmVfdGltaW5nX2luZm8gKnRpbWluZzsKLQl1X2xvbmcgbGluZV9sZW5ndGg7Ci0JdV9sb25nIG1pbl9tb2RlOwotCWludCByZXFfZG90OwotCWludCB0ZXN0X21vZGU7Ci0KLQkvKgotCSAqICBGQl9WTU9ERV9DT05VUERBVEUgYW5kIEZCX1ZNT0RFX1NNT09USF9YUEFOIGFyZSBlcXVhbCEKLQkgKiAgYXMgRkJfVk1PREVfU01PT1RIX1hQQU4gaXMgb25seSB1c2VkIGludGVybmFsbHkKLQkgKi8KLQotCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfQ09OVVBEQVRFKSB7Ci0JCXZhci0+dm1vZGUgfD0gRkJfVk1PREVfWVdSQVA7Ci0JCXZhci0+eG9mZnNldCA9IGluZm8tPnZhci54b2Zmc2V0OwotCQl2YXItPnlvZmZzZXQgPSBpbmZvLT52YXIueW9mZnNldDsKLQl9Ci0KLQkvKiBYWFggRklYTUUgLSBmb3JjaW5nIHZhcidzICovCi0JdmFyLT54b2Zmc2V0ID0gMDsKLQl2YXItPnlvZmZzZXQgPSAwOwotCi0JLyogTGltaXQgYnBwIHRvIDgsIDE2LCBhbmQgMzIgKi8KLQlpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA8PSA4KQotCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gODsKLQllbHNlIGlmICh2YXItPmJpdHNfcGVyX3BpeGVsIDw9IDE2KQotCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gMTY7Ci0JZWxzZSBpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA8PSAzMikKLQkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDMyOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl2YXItPmdyYXlzY2FsZSA9IDA7CS8qIE5vIGdyYXlzY2FsZSBmb3Igbm93ICovCi0KLQkvKiBkZXRlcm1pbmUgdmFsaWQgcmVzb2x1dGlvbiBhbmQgdGltaW5nICovCi0JZm9yIChtaW5fbW9kZSA9IDA7IG1pbl9tb2RlIDwgQVJSQVlfU0laRShkYmVWVGltaW5ncyk7IG1pbl9tb2RlKyspIHsKLQkJaWYgKGRiZVZUaW1pbmdzW21pbl9tb2RlXS53aWR0aCA+PSB2YXItPnhyZXMgJiYKLQkJICAgIGRiZVZUaW1pbmdzW21pbl9tb2RlXS5oZWlnaHQgPj0gdmFyLT55cmVzKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKG1pbl9tb2RlID09IEFSUkFZX1NJWkUoZGJlVlRpbWluZ3MpKQotCQlyZXR1cm4gLUVJTlZBTDsJLyogUmVzb2x1dGlvbiB0byBoaWdoICovCi0KLQkvKiBYWFggRklYTUUgLSBzaG91bGQgdHJ5IHRvIHBpY2sgYmVzdCByZWZyZXNoIHJhdGUgKi8KLQkvKiBmb3Igbm93LCBwaWNrIGNsb3Nlc3QgZG90LWNsb2NrIHdpdGhpbiAzTUh6ICovCi0JcmVxX2RvdCA9IFBJQ09TMktIWih2YXItPnBpeGNsb2NrKTsKLQlwcmludGsoS0VSTl9JTkZPICJzZ2l2d2ZiOiByZXF1ZXN0ZWQgcGl4Y2xvY2s9JWQgcHMgKCVkIEtIeilcbiIsCi0JICAgICAgIHZhci0+cGl4Y2xvY2ssIHJlcV9kb3QpOwotCXRlc3RfbW9kZSA9IG1pbl9tb2RlOwotCXdoaWxlIChkYmVWVGltaW5nc1ttaW5fbW9kZV0ud2lkdGggPT0gZGJlVlRpbWluZ3NbdGVzdF9tb2RlXS53aWR0aCkgewotCQlpZiAoZGJlVlRpbWluZ3NbdGVzdF9tb2RlXS5jZnJlcSArIDMwMDAgPiByZXFfZG90KQotCQkJYnJlYWs7Ci0JCXRlc3RfbW9kZSsrOwotCX0KLQlpZiAoZGJlVlRpbWluZ3NbbWluX21vZGVdLndpZHRoICE9IGRiZVZUaW1pbmdzW3Rlc3RfbW9kZV0ud2lkdGgpCi0JCXRlc3RfbW9kZS0tOwotCW1pbl9tb2RlID0gdGVzdF9tb2RlOwotCXRpbWluZyA9ICZkYmVWVGltaW5nc1ttaW5fbW9kZV07Ci0JcHJpbnRrKEtFUk5fSU5GTyAic2dpdndmYjogZ3JhbnRlZCBkb3QtY2xvY2s9JWQgS0h6XG4iLCB0aW1pbmctPmNmcmVxKTsKLQotCS8qIEFkanVzdCB2aXJ0dWFsIHJlc29sdXRpb24sIGlmIG5lY2Vzc2FyeSAqLwotCWlmICh2YXItPnhyZXMgPiB2YXItPnhyZXNfdmlydHVhbCB8fCAoIXl3cmFwICYmICF5cGFuKSkKLQkJdmFyLT54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXM7Ci0JaWYgKHZhci0+eXJlcyA+IHZhci0+eXJlc192aXJ0dWFsIHx8ICgheXdyYXAgJiYgIXlwYW4pKQotCQl2YXItPnlyZXNfdmlydHVhbCA9IHZhci0+eXJlczsKLQotCS8qCi0JICogIE1lbW9yeSBsaW1pdAotCSAqLwotCWxpbmVfbGVuZ3RoID0gZ2V0X2xpbmVfbGVuZ3RoKHZhci0+eHJlc192aXJ0dWFsLCB2YXItPmJpdHNfcGVyX3BpeGVsKTsKLQlpZiAobGluZV9sZW5ndGggKiB2YXItPnlyZXNfdmlydHVhbCA+IHNnaXZ3ZmJfbWVtX3NpemUpCi0JCXJldHVybiAtRU5PTUVNOwkvKiBWaXJ0dWFsIHJlc29sdXRpb24gdG8gaGlnaCAqLwotCi0JaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gbGluZV9sZW5ndGg7Ci0KLQlzd2l0Y2ggKHZhci0+Yml0c19wZXJfcGl4ZWwpIHsKLQljYXNlIDg6Ci0JCXZhci0+cmVkLm9mZnNldCA9IDA7Ci0JCXZhci0+cmVkLmxlbmd0aCA9IDg7Ci0JCXZhci0+Z3JlZW4ub2Zmc2V0ID0gMDsKLQkJdmFyLT5ncmVlbi5sZW5ndGggPSA4OwotCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKLQkJdmFyLT5ibHVlLmxlbmd0aCA9IDg7Ci0JCXZhci0+dHJhbnNwLm9mZnNldCA9IDA7Ci0JCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgMTY6CQkvKiBSR0JBIDU1NTEgKi8KLQkJdmFyLT5yZWQub2Zmc2V0ID0gMTE7Ci0JCXZhci0+cmVkLmxlbmd0aCA9IDU7Ci0JCXZhci0+Z3JlZW4ub2Zmc2V0ID0gNjsKLQkJdmFyLT5ncmVlbi5sZW5ndGggPSA1OwotCQl2YXItPmJsdWUub2Zmc2V0ID0gMTsKLQkJdmFyLT5ibHVlLmxlbmd0aCA9IDU7Ci0JCXZhci0+dHJhbnNwLm9mZnNldCA9IDA7Ci0JCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgMzI6CQkvKiBSR0IgODg4OCAqLwotCQl2YXItPnJlZC5vZmZzZXQgPSAwOwotCQl2YXItPnJlZC5sZW5ndGggPSA4OwotCQl2YXItPmdyZWVuLm9mZnNldCA9IDg7Ci0JCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKLQkJdmFyLT5ibHVlLm9mZnNldCA9IDE2OwotCQl2YXItPmJsdWUubGVuZ3RoID0gODsKLQkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMjQ7Ci0JCXZhci0+dHJhbnNwLmxlbmd0aCA9IDg7Ci0JCWJyZWFrOwotCX0KLQl2YXItPnJlZC5tc2JfcmlnaHQgPSAwOwotCXZhci0+Z3JlZW4ubXNiX3JpZ2h0ID0gMDsKLQl2YXItPmJsdWUubXNiX3JpZ2h0ID0gMDsKLQl2YXItPnRyYW5zcC5tc2JfcmlnaHQgPSAwOwotCi0JLyogc2V0IHZpZGVvIHRpbWluZyBpbmZvcm1hdGlvbiAqLwotCXZhci0+cGl4Y2xvY2sgPSBLSFoyUElDT1ModGltaW5nLT5jZnJlcSk7Ci0JdmFyLT5sZWZ0X21hcmdpbiA9IHRpbWluZy0+aHRvdGFsIC0gdGltaW5nLT5oc3luY19lbmQ7Ci0JdmFyLT5yaWdodF9tYXJnaW4gPSB0aW1pbmctPmhzeW5jX3N0YXJ0IC0gdGltaW5nLT53aWR0aDsKLQl2YXItPnVwcGVyX21hcmdpbiA9IHRpbWluZy0+dnRvdGFsIC0gdGltaW5nLT52c3luY19lbmQ7Ci0JdmFyLT5sb3dlcl9tYXJnaW4gPSB0aW1pbmctPnZzeW5jX3N0YXJ0IC0gdGltaW5nLT5oZWlnaHQ7Ci0JdmFyLT5oc3luY19sZW4gPSB0aW1pbmctPmhzeW5jX2VuZCAtIHRpbWluZy0+aHN5bmNfc3RhcnQ7Ci0JdmFyLT52c3luY19sZW4gPSB0aW1pbmctPnZzeW5jX2VuZCAtIHRpbWluZy0+dnN5bmNfc3RhcnQ7Ci0KLQkvKiBPdWNoLiBUaGlzIGJyZWFrcyB0aGUgcnVsZXMgYnV0IHRpbWluZ19udW0gaXMgb25seSBpbXBvcnRhbnQgaWYgeW91Ci0JKiBjaGFuZ2UgYSB2aWRlbyBtb2RlICovCi0JcGFyLT50aW1pbmdfbnVtID0gbWluX21vZGU7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJzZ2l2d2ZiOiBuZXcgdmlkZW8gbW9kZSB4cmVzPSVkIHlyZXM9JWQgYnBwPSVkXG4iLAotCQl2YXItPnhyZXMsIHZhci0+eXJlcywgdmFyLT5iaXRzX3Blcl9waXhlbCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICAgdnhyZXM9JWQgdnlyZXM9JWRcbiIsIHZhci0+eHJlc192aXJ0dWFsLAotCQl2YXItPnlyZXNfdmlydHVhbCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiAgU2V0dXAgZmxhdHBhbmVsIHJlbGF0ZWQgcmVnaXN0ZXJzLgotICovCi1zdGF0aWMgdm9pZCBzZ2l2d2ZiX3NldHVwX2ZsYXRwYW5lbChzdHJ1Y3Qgc2dpdndfcGFyICpwYXIsIHN0cnVjdCBkYmVfdGltaW5nX2luZm8gKmN1cnJlbnRUaW1pbmcpCi17Ci0JaW50IGZwX3dpZCwgZnBfaGd0LCBmcF92YnMsIGZwX3ZiZTsKLQl1MzIgb3V0cHV0VmFsID0gMDsKLQotCVNFVF9EQkVfRklFTEQoVlRfRkxBR1MsIEhEUlZfSU5WRVJULCBvdXRwdXRWYWwsIAotCQkoY3VycmVudFRpbWluZy0+ZmxhZ3MgJiBGQl9TWU5DX0hPUl9ISUdIX0FDVCkgPyAwIDogMSk7Ci0JU0VUX0RCRV9GSUVMRChWVF9GTEFHUywgVkRSVl9JTlZFUlQsIG91dHB1dFZhbCwgCi0JCShjdXJyZW50VGltaW5nLT5mbGFncyAmIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCkgPyAwIDogMSk7Ci0JREJFX1NFVFJFRyh2dF9mbGFncywgb3V0cHV0VmFsKTsKLQotCS8qIFR1cm4gb24gdGhlIGZsYXQgcGFuZWwgKi8KLQlzd2l0Y2ggKGZsYXRwYW5lbF9pZCkgewotCQljYXNlIEZMQVRQQU5FTF9TR0lfMTYwMFNXOgotCQkJZnBfd2lkID0gMTYwMDsKLQkJCWZwX2hndCA9IDEwMjQ7Ci0JCQlmcF92YnMgPSAwOwotCQkJZnBfdmJlID0gMTYwMDsKLQkJCWN1cnJlbnRUaW1pbmctPnBsbF9tID0gNDsKLQkJCWN1cnJlbnRUaW1pbmctPnBsbF9uID0gMTsKLQkJCWN1cnJlbnRUaW1pbmctPnBsbF9wID0gMDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotICAgICAgCQkJZnBfd2lkID0gZnBfaGd0ID0gZnBfdmJzID0gZnBfdmJlID0gMHhmZmY7Ci0gIAl9Ci0KLQlvdXRwdXRWYWwgPSAwOwotCVNFVF9EQkVfRklFTEQoRlBfREUsIEZQX0RFX09OLCBvdXRwdXRWYWwsIGZwX3Zicyk7Ci0JU0VUX0RCRV9GSUVMRChGUF9ERSwgRlBfREVfT0ZGLCBvdXRwdXRWYWwsIGZwX3ZiZSk7Ci0JREJFX1NFVFJFRyhmcF9kZSwgb3V0cHV0VmFsKTsKLQlvdXRwdXRWYWwgPSAwOwotCVNFVF9EQkVfRklFTEQoRlBfSERSViwgRlBfSERSVl9PRkYsIG91dHB1dFZhbCwgZnBfd2lkKTsKLQlEQkVfU0VUUkVHKGZwX2hkcnYsIG91dHB1dFZhbCk7Ci0Jb3V0cHV0VmFsID0gMDsKLQlTRVRfREJFX0ZJRUxEKEZQX1ZEUlYsIEZQX1ZEUlZfT04sIG91dHB1dFZhbCwgMSk7Ci0JU0VUX0RCRV9GSUVMRChGUF9WRFJWLCBGUF9WRFJWX09GRiwgb3V0cHV0VmFsLCBmcF9oZ3QgKyAxKTsKLQlEQkVfU0VUUkVHKGZwX3ZkcnYsIG91dHB1dFZhbCk7Ci19Ci0KLS8qCi0gKiAgU2V0IHRoZSBoYXJkd2FyZSBhY2NvcmRpbmcgdG8gJ3BhcicuCi0gKi8KLXN0YXRpYyBpbnQgc2dpdndmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCXN0cnVjdCBzZ2l2d19wYXIgKnBhciA9IGluZm8tPnBhcjsKLQlpbnQgaSwgaiwgaHRtcCwgdGVtcDsKLQl1MzIgcmVhZFZhbCwgb3V0cHV0VmFsOwotCWludCB3aG9sZVRpbGVzWCwgbWF4UGl4ZWxzUGVyVGlsZVg7Ci0JaW50IGZybVdyaXRlMSwgZnJtV3JpdGUyLCBmcm1Xcml0ZTNiOwotCXN0cnVjdCBkYmVfdGltaW5nX2luZm8gKmN1cnJlbnRUaW1pbmc7IC8qIEN1cnJlbnQgVmlkZW8gVGltaW5nICovCi0JaW50IHhwbWF4LCB5cG1heDsJLy8gTW9uaXRvciByZXNvbHV0aW9uCi0JaW50IGJ5dGVzUGVyUGl4ZWw7CS8vIEJ5dGVzIHBlciBwaXhlbAotCi0JY3VycmVudFRpbWluZyA9ICZkYmVWVGltaW5nc1twYXItPnRpbWluZ19udW1dOwotCWJ5dGVzUGVyUGl4ZWwgPSBieXRlc19wZXJfcGl4ZWwoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKTsKLQl4cG1heCA9IGN1cnJlbnRUaW1pbmctPndpZHRoOwotCXlwbWF4ID0gY3VycmVudFRpbWluZy0+aGVpZ2h0OwotCi0JLyogZGJlX0luaXRHcmFwaGljc0Jhc2UoKTsgKi8KLQkvKiBUdXJuIG9uIGRvdGNsb2NrIFBMTCAqLwotCURCRV9TRVRSRUcoY3RybHN0YXQsIDB4MjAwMDAwMDApOwotCi0JZGJlX1R1cm5PZmZEbWEocGFyKTsKLQotCS8qIGRiZV9DYWxjdWxhdGVTY3JlZW5QYXJhbXMoKTsgKi8KLQltYXhQaXhlbHNQZXJUaWxlWCA9IDUxMiAvIGJ5dGVzUGVyUGl4ZWw7Ci0Jd2hvbGVUaWxlc1ggPSB4cG1heCAvIG1heFBpeGVsc1BlclRpbGVYOwotCWlmICh3aG9sZVRpbGVzWCAqIG1heFBpeGVsc1BlclRpbGVYIDwgeHBtYXgpCi0JCXdob2xlVGlsZXNYKys7Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAic2dpdndmYjogcGl4UGVyVGlsZT0lZCB3aG9sZVRpbGVzWD0lZFxuIiwKLQkgICAgICAgbWF4UGl4ZWxzUGVyVGlsZVgsIHdob2xlVGlsZXNYKTsKLQotCS8qIGRiZV9Jbml0R2FtbWFNYXAoKTsgKi8KLQl1ZGVsYXkoMTApOwotCi0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JCURCRV9JU0VUUkVHKGdtYXAsIGksIChpIDw8IDI0KSB8IChpIDw8IDE2KSB8IChpIDw8IDgpKTsKLQl9Ci0KLQkvKiBkYmVfVHVybk9uKCk7ICovCi0JREJFX0dFVFJFRyh2dF94eSwgcmVhZFZhbCk7Ci0JaWYgKEdFVF9EQkVfRklFTEQoVlRfWFksIFZUX0ZSRUVaRSwgcmVhZFZhbCkgPT0gMSkgewotCQlEQkVfU0VUUkVHKHZ0X3h5LCAweDAwMDAwMDAwKTsKLQkJdWRlbGF5KDEpOwotCX0gZWxzZQotCQlkYmVfVHVybk9mZkRtYShwYXIpOwotCi0JLyogZGJlX0luaXRkYmUoKTsgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLQkJZm9yIChqID0gMDsgaiA8IDEwMDsgaisrKSB7Ci0JCQlEQkVfR0VUUkVHKGNtX2ZpZm8sIHJlYWRWYWwpOwotCQkJaWYgKHJlYWRWYWwgIT0gMHgwMDAwMDAwMCkKLQkJCQlicmVhazsKLQkJCWVsc2UKLQkJCQl1ZGVsYXkoMTApOwotCQl9Ci0KLQkJLy8gREJFX0lTRVRSRUcoY21hcCwgaSwgMHgwMDAwMDAwMCk7Ci0JCURCRV9JU0VUUkVHKGNtYXAsIGksIChpIDw8IDgpIHwgKGkgPDwgMTYpIHwgKGkgPDwgMjQpKTsKLQl9Ci0KLQkvKiBkYmVfSW5pdEZyYW1lYnVmZmVyKCk7ICovCi0JZnJtV3JpdGUxID0gMDsKLQlTRVRfREJFX0ZJRUxEKEZSTV9TSVpFX1RJTEUsIEZSTV9XSURUSF9USUxFLCBmcm1Xcml0ZTEsCi0JCSAgICAgIHdob2xlVGlsZXNYKTsKLQlTRVRfREJFX0ZJRUxEKEZSTV9TSVpFX1RJTEUsIEZSTV9SSFMsIGZybVdyaXRlMSwgMCk7Ci0KLQlzd2l0Y2ggKGJ5dGVzUGVyUGl4ZWwpIHsKLQljYXNlIDE6Ci0JCVNFVF9EQkVfRklFTEQoRlJNX1NJWkVfVElMRSwgRlJNX0RFUFRILCBmcm1Xcml0ZTEsCi0JCQkgICAgICBEQkVfRlJNX0RFUFRIXzgpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCVNFVF9EQkVfRklFTEQoRlJNX1NJWkVfVElMRSwgRlJNX0RFUFRILCBmcm1Xcml0ZTEsCi0JCQkgICAgICBEQkVfRlJNX0RFUFRIXzE2KTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlTRVRfREJFX0ZJRUxEKEZSTV9TSVpFX1RJTEUsIEZSTV9ERVBUSCwgZnJtV3JpdGUxLAotCQkJICAgICAgREJFX0ZSTV9ERVBUSF8zMik7Ci0JCWJyZWFrOwotCX0KLQotCWZybVdyaXRlMiA9IDA7Ci0JU0VUX0RCRV9GSUVMRChGUk1fU0laRV9QSVhFTCwgRkJfSEVJR0hUX1BJWCwgZnJtV3JpdGUyLCB5cG1heCk7Ci0KLQkvLyBUZWxsIGRiZSBhYm91dCB0aGUgZnJhbWVidWZmZXIgbG9jYXRpb24gYW5kIHR5cGUKLQkvLyBYWFggV2hhdCBmb3JtYXQgaXMgdGhlIEZSTV9USUxFX1BUUj8/ICA2NEsgYWxpZ25lZCBhZGRyZXNzPwotCWZybVdyaXRlM2IgPSAwOwotCVNFVF9EQkVfRklFTEQoRlJNX0NPTlRST0wsIEZSTV9USUxFX1BUUiwgZnJtV3JpdGUzYiwKLQkJICAgICAgc2dpdndmYl9tZW1fcGh5cyA+PiA5KTsKLQlTRVRfREJFX0ZJRUxEKEZSTV9DT05UUk9MLCBGUk1fRE1BX0VOQUJMRSwgZnJtV3JpdGUzYiwgMSk7Ci0JU0VUX0RCRV9GSUVMRChGUk1fQ09OVFJPTCwgRlJNX0xJTkVBUiwgZnJtV3JpdGUzYiwgMSk7Ci0KLQkvKiBJbml0aWFsaXplIERJRHMgKi8KLQotCW91dHB1dFZhbCA9IDA7Ci0Jc3dpdGNoIChieXRlc1BlclBpeGVsKSB7Ci0JY2FzZSAxOgotCQlTRVRfREJFX0ZJRUxEKFdJRCwgVFlQLCBvdXRwdXRWYWwsIERCRV9DTU9ERV9JOCk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJU0VUX0RCRV9GSUVMRChXSUQsIFRZUCwgb3V0cHV0VmFsLCBEQkVfQ01PREVfUkdCQTUpOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCVNFVF9EQkVfRklFTEQoV0lELCBUWVAsIG91dHB1dFZhbCwgREJFX0NNT0RFX1JHQjgpOwotCQlicmVhazsKLQl9Ci0JU0VUX0RCRV9GSUVMRChXSUQsIEJVRiwgb3V0cHV0VmFsLCBEQkVfQk1PREVfQk9USCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQlEQkVfSVNFVFJFRyhtb2RlX3JlZ3MsIGksIG91dHB1dFZhbCk7Ci0JfQotCi0JLyogZGJlX0luaXRUaW1pbmcoKTsgKi8KLQlEQkVfU0VUUkVHKHZ0X2ludHIwMSwgMHhmZmZmZmZmZik7Ci0JREJFX1NFVFJFRyh2dF9pbnRyMjMsIDB4ZmZmZmZmZmYpOwotCi0JREJFX0dFVFJFRyhkb3RjbG9jaywgcmVhZFZhbCk7Ci0JREJFX1NFVFJFRyhkb3RjbG9jaywgcmVhZFZhbCAmIDB4ZmZmZik7Ci0KLQlEQkVfU0VUUkVHKHZ0X3h5bWF4LCAweDAwMDAwMDAwKTsKLQlvdXRwdXRWYWwgPSAwOwotCVNFVF9EQkVfRklFTEQoVlRfVlNZTkMsIFZUX1ZTWU5DX09OLCBvdXRwdXRWYWwsCi0JCSAgICAgIGN1cnJlbnRUaW1pbmctPnZzeW5jX3N0YXJ0KTsKLQlTRVRfREJFX0ZJRUxEKFZUX1ZTWU5DLCBWVF9WU1lOQ19PRkYsIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+dnN5bmNfZW5kKTsKLQlEQkVfU0VUUkVHKHZ0X3ZzeW5jLCBvdXRwdXRWYWwpOwotCW91dHB1dFZhbCA9IDA7Ci0JU0VUX0RCRV9GSUVMRChWVF9IU1lOQywgVlRfSFNZTkNfT04sIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+aHN5bmNfc3RhcnQpOwotCVNFVF9EQkVfRklFTEQoVlRfSFNZTkMsIFZUX0hTWU5DX09GRiwgb3V0cHV0VmFsLAotCQkgICAgICBjdXJyZW50VGltaW5nLT5oc3luY19lbmQpOwotCURCRV9TRVRSRUcodnRfaHN5bmMsIG91dHB1dFZhbCk7Ci0Jb3V0cHV0VmFsID0gMDsKLQlTRVRfREJFX0ZJRUxEKFZUX1ZCTEFOSywgVlRfVkJMQU5LX09OLCBvdXRwdXRWYWwsCi0JCSAgICAgIGN1cnJlbnRUaW1pbmctPnZibGFua19zdGFydCk7Ci0JU0VUX0RCRV9GSUVMRChWVF9WQkxBTkssIFZUX1ZCTEFOS19PRkYsIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+dmJsYW5rX2VuZCk7Ci0JREJFX1NFVFJFRyh2dF92YmxhbmssIG91dHB1dFZhbCk7Ci0Jb3V0cHV0VmFsID0gMDsKLQlTRVRfREJFX0ZJRUxEKFZUX0hCTEFOSywgVlRfSEJMQU5LX09OLCBvdXRwdXRWYWwsCi0JCSAgICAgIGN1cnJlbnRUaW1pbmctPmhibGFua19zdGFydCk7Ci0JU0VUX0RCRV9GSUVMRChWVF9IQkxBTkssIFZUX0hCTEFOS19PRkYsIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+aGJsYW5rX2VuZCAtIDMpOwotCURCRV9TRVRSRUcodnRfaGJsYW5rLCBvdXRwdXRWYWwpOwotCW91dHB1dFZhbCA9IDA7Ci0JU0VUX0RCRV9GSUVMRChWVF9WQ01BUCwgVlRfVkNNQVBfT04sIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+dmJsYW5rX3N0YXJ0KTsKLQlTRVRfREJFX0ZJRUxEKFZUX1ZDTUFQLCBWVF9WQ01BUF9PRkYsIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+dmJsYW5rX2VuZCk7Ci0JREJFX1NFVFJFRyh2dF92Y21hcCwgb3V0cHV0VmFsKTsKLQlvdXRwdXRWYWwgPSAwOwotCVNFVF9EQkVfRklFTEQoVlRfSENNQVAsIFZUX0hDTUFQX09OLCBvdXRwdXRWYWwsCi0JCSAgICAgIGN1cnJlbnRUaW1pbmctPmhibGFua19zdGFydCk7Ci0JU0VUX0RCRV9GSUVMRChWVF9IQ01BUCwgVlRfSENNQVBfT0ZGLCBvdXRwdXRWYWwsCi0JCSAgICAgIGN1cnJlbnRUaW1pbmctPmhibGFua19lbmQgLSAzKTsKLQlEQkVfU0VUUkVHKHZ0X2hjbWFwLCBvdXRwdXRWYWwpOwotCi0JaWYgKGZsYXRwYW5lbF9pZCAhPSAtMSkKLQkJc2dpdndmYl9zZXR1cF9mbGF0cGFuZWwocGFyLCBjdXJyZW50VGltaW5nKTsKLQotCW91dHB1dFZhbCA9IDA7Ci0JdGVtcCA9IGN1cnJlbnRUaW1pbmctPnZibGFua19zdGFydCAtIGN1cnJlbnRUaW1pbmctPnZibGFua19lbmQgLSAxOwotCWlmICh0ZW1wID4gMCkKLQkJdGVtcCA9IC10ZW1wOwotCi0JU0VUX0RCRV9GSUVMRChESURfU1RBUlRfWFksIERJRF9TVEFSVFksIG91dHB1dFZhbCwgKHUzMikgdGVtcCk7Ci0JaWYgKGN1cnJlbnRUaW1pbmctPmhibGFua19lbmQgPj0gMjApCi0JCVNFVF9EQkVfRklFTEQoRElEX1NUQVJUX1hZLCBESURfU1RBUlRYLCBvdXRwdXRWYWwsCi0JCQkgICAgICBjdXJyZW50VGltaW5nLT5oYmxhbmtfZW5kIC0gMjApOwotCWVsc2UKLQkJU0VUX0RCRV9GSUVMRChESURfU1RBUlRfWFksIERJRF9TVEFSVFgsIG91dHB1dFZhbCwKLQkJCSAgICAgIGN1cnJlbnRUaW1pbmctPmh0b3RhbCAtICgyMCAtCi0JCQkJCQkgICAgICAgY3VycmVudFRpbWluZy0+Ci0JCQkJCQkgICAgICAgaGJsYW5rX2VuZCkpOwotCURCRV9TRVRSRUcoZGlkX3N0YXJ0X3h5LCBvdXRwdXRWYWwpOwotCi0Jb3V0cHV0VmFsID0gMDsKLQlTRVRfREJFX0ZJRUxEKENSU19TVEFSVF9YWSwgQ1JTX1NUQVJUWSwgb3V0cHV0VmFsLAotCQkgICAgICAodTMyKSAodGVtcCArIDEpKTsKLQlpZiAoY3VycmVudFRpbWluZy0+aGJsYW5rX2VuZCA+PSBEQkVfQ1JTX01BR0lDKQotCQlTRVRfREJFX0ZJRUxEKENSU19TVEFSVF9YWSwgQ1JTX1NUQVJUWCwgb3V0cHV0VmFsLAotCQkJICAgICAgY3VycmVudFRpbWluZy0+aGJsYW5rX2VuZCAtIERCRV9DUlNfTUFHSUMpOwotCWVsc2UKLQkJU0VUX0RCRV9GSUVMRChDUlNfU1RBUlRfWFksIENSU19TVEFSVFgsIG91dHB1dFZhbCwKLQkJCSAgICAgIGN1cnJlbnRUaW1pbmctPmh0b3RhbCAtIChEQkVfQ1JTX01BR0lDIC0KLQkJCQkJCSAgICAgICBjdXJyZW50VGltaW5nLT4KLQkJCQkJCSAgICAgICBoYmxhbmtfZW5kKSk7Ci0JREJFX1NFVFJFRyhjcnNfc3RhcnRfeHksIG91dHB1dFZhbCk7Ci0KLQlvdXRwdXRWYWwgPSAwOwotCVNFVF9EQkVfRklFTEQoVkNfU1RBUlRfWFksIFZDX1NUQVJUWSwgb3V0cHV0VmFsLCAodTMyKSB0ZW1wKTsKLQlTRVRfREJFX0ZJRUxEKFZDX1NUQVJUX1hZLCBWQ19TVEFSVFgsIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+aGJsYW5rX2VuZCAtIDQpOwotCURCRV9TRVRSRUcodmNfc3RhcnRfeHksIG91dHB1dFZhbCk7Ci0KLQlEQkVfU0VUUkVHKGZybV9zaXplX3RpbGUsIGZybVdyaXRlMSk7Ci0JREJFX1NFVFJFRyhmcm1fc2l6ZV9waXhlbCwgZnJtV3JpdGUyKTsKLQotCW91dHB1dFZhbCA9IDA7Ci0JU0VUX0RCRV9GSUVMRChET1RDTEssIE0sIG91dHB1dFZhbCwgY3VycmVudFRpbWluZy0+cGxsX20gLSAxKTsKLQlTRVRfREJFX0ZJRUxEKERPVENMSywgTiwgb3V0cHV0VmFsLCBjdXJyZW50VGltaW5nLT5wbGxfbiAtIDEpOwotCVNFVF9EQkVfRklFTEQoRE9UQ0xLLCBQLCBvdXRwdXRWYWwsIGN1cnJlbnRUaW1pbmctPnBsbF9wKTsKLQlTRVRfREJFX0ZJRUxEKERPVENMSywgUlVOLCBvdXRwdXRWYWwsIDEpOwotCURCRV9TRVRSRUcoZG90Y2xvY2ssIG91dHB1dFZhbCk7Ci0KLQl1ZGVsYXkoMTEgKiAxMDAwKTsKLQotCURCRV9TRVRSRUcodnRfdnBpeGVuLCAweGZmZmZmZik7Ci0JREJFX1NFVFJFRyh2dF9ocGl4ZW4sIDB4ZmZmZmZmKTsKLQotCW91dHB1dFZhbCA9IDA7Ci0JU0VUX0RCRV9GSUVMRChWVF9YWU1BWCwgVlRfTUFYWCwgb3V0cHV0VmFsLCBjdXJyZW50VGltaW5nLT5odG90YWwpOwotCVNFVF9EQkVfRklFTEQoVlRfWFlNQVgsIFZUX01BWFksIG91dHB1dFZhbCwgY3VycmVudFRpbWluZy0+dnRvdGFsKTsKLQlEQkVfU0VUUkVHKHZ0X3h5bWF4LCBvdXRwdXRWYWwpOwotCi0Jb3V0cHV0VmFsID0gZnJtV3JpdGUxOwotCVNFVF9EQkVfRklFTEQoRlJNX1NJWkVfVElMRSwgRlJNX0ZJRk9fUkVTRVQsIG91dHB1dFZhbCwgMSk7Ci0JREJFX1NFVFJFRyhmcm1fc2l6ZV90aWxlLCBvdXRwdXRWYWwpOwotCURCRV9TRVRSRUcoZnJtX3NpemVfdGlsZSwgZnJtV3JpdGUxKTsKLQotCW91dHB1dFZhbCA9IDA7Ci0JU0VUX0RCRV9GSUVMRChPVlJfV0lEVEhfVElMRSwgT1ZSX0ZJRk9fUkVTRVQsIG91dHB1dFZhbCwgMSk7Ci0JREJFX1NFVFJFRyhvdnJfd2lkdGhfdGlsZSwgb3V0cHV0VmFsKTsKLQlEQkVfU0VUUkVHKG92cl93aWR0aF90aWxlLCAwKTsKLQotCURCRV9TRVRSRUcoZnJtX2NvbnRyb2wsIGZybVdyaXRlM2IpOwotCURCRV9TRVRSRUcoZGlkX2NvbnRyb2wsIDApOwotCi0JLy8gV2FpdCBmb3IgZGJlIHRvIHRha2UgZnJhbWUgc2V0dGluZ3MKLQlmb3IgKGkgPSAwOyBpIDwgMTAwMDAwOyBpKyspIHsKLQkJREJFX0dFVFJFRyhmcm1faW5od2N0cmwsIHJlYWRWYWwpOwotCQlpZiAoR0VUX0RCRV9GSUVMRChGUk1fSU5IV0NUUkwsIEZSTV9ETUFfRU5BQkxFLCByZWFkVmFsKSAhPQotCQkgICAgMCkKLQkJCWJyZWFrOwotCQllbHNlCi0JCQl1ZGVsYXkoMSk7Ci0JfQotCi0JaWYgKGkgPT0gMTAwMDAwKQotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAic2dpdndmYjogdGltZW91dCB3YWl0aW5nIGZvciBmcmFtZSBETUEgZW5hYmxlLlxuIik7Ci0KLQlvdXRwdXRWYWwgPSAwOwotCWh0bXAgPSBjdXJyZW50VGltaW5nLT5oYmxhbmtfZW5kIC0gMTk7Ci0JaWYgKGh0bXAgPCAwKQotCQlodG1wICs9IGN1cnJlbnRUaW1pbmctPmh0b3RhbDsJLyogYWxsb3cgYmxhbmsgdG8gd3JhcCBhcm91bmQgKi8KLQlTRVRfREJFX0ZJRUxEKFZUX0hQSVhFTiwgVlRfSFBJWEVOX09OLCBvdXRwdXRWYWwsIGh0bXApOwotCVNFVF9EQkVfRklFTEQoVlRfSFBJWEVOLCBWVF9IUElYRU5fT0ZGLCBvdXRwdXRWYWwsCi0JCSAgICAgICgoaHRtcCArIGN1cnJlbnRUaW1pbmctPndpZHRoIC0KLQkJCTIpICUgY3VycmVudFRpbWluZy0+aHRvdGFsKSk7Ci0JREJFX1NFVFJFRyh2dF9ocGl4ZW4sIG91dHB1dFZhbCk7Ci0KLQlvdXRwdXRWYWwgPSAwOwotCVNFVF9EQkVfRklFTEQoVlRfVlBJWEVOLCBWVF9WUElYRU5fT0ZGLCBvdXRwdXRWYWwsCi0JCSAgICAgIGN1cnJlbnRUaW1pbmctPnZibGFua19zdGFydCk7Ci0JU0VUX0RCRV9GSUVMRChWVF9WUElYRU4sIFZUX1ZQSVhFTl9PTiwgb3V0cHV0VmFsLAotCQkgICAgICBjdXJyZW50VGltaW5nLT52YmxhbmtfZW5kKTsKLQlEQkVfU0VUUkVHKHZ0X3ZwaXhlbiwgb3V0cHV0VmFsKTsKLQotCS8vIFR1cm4gb2ZmIG1vdXNlIGN1cnNvcgotCXBhci0+cmVncy0+Y3JzX2N0bCA9IDA7Ci0KLQkvLyBYWFggV2hhdCdzIHRoaXMgc2VjdGlvbiBmb3I/PwotCURCRV9HRVRSRUcoY3RybHN0YXQsIHJlYWRWYWwpOwotCXJlYWRWYWwgJj0gMHgwMjAwMDAwMDsKLQotCWlmIChyZWFkVmFsICE9IDApIHsKLQkJREJFX1NFVFJFRyhjdHJsc3RhdCwgMHgzMDAwMDAwMCk7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKgotICogIFNldCBhIHNpbmdsZSBjb2xvciByZWdpc3Rlci4gVGhlIHZhbHVlcyBzdXBwbGllZCBhcmUgYWxyZWFkeQotICogIHJvdW5kZWQgZG93biB0byB0aGUgaGFyZHdhcmUncyBjYXBhYmlsaXRpZXMgKGFjY29yZGluZyB0byB0aGUKLSAqICBlbnRyaWVzIGluIHRoZSB2YXIgc3RydWN0dXJlKS4gUmV0dXJuICE9IDAgZm9yIGludmFsaWQgcmVnbm8uCi0gKi8KLQotc3RhdGljIGludCBzZ2l2d2ZiX3NldGNvbHJlZyh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwKLQkJCSAgICAgdV9pbnQgYmx1ZSwgdV9pbnQgdHJhbnNwLAotCQkJICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3Qgc2dpdndfcGFyICpwYXIgPSAoc3RydWN0IHNnaXZ3X3BhciAqKSBpbmZvLT5wYXI7Ci0KLQlpZiAocmVnbm8gPiAyNTUpCi0JCXJldHVybiAxOwotCXJlZCA+Pj0gODsKLQlncmVlbiA+Pj0gODsKLQlibHVlID4+PSA4OwotCi0JLyogd2FpdCBmb3IgdGhlIGNvbG9yIG1hcCBGSUZPIHRvIGhhdmUgYSBmcmVlIGVudHJ5ICovCi0Jd2hpbGUgKHBhci0+Y21hcF9maWZvID09IDApCi0JCXBhci0+Y21hcF9maWZvID0gcGFyLT5yZWdzLT5jbV9maWZvOwotCi0JcGFyLT5yZWdzLT5jbWFwW3JlZ25vXSA9IChyZWQgPDwgMjQpIHwgKGdyZWVuIDw8IDE2KSB8IChibHVlIDw8IDgpOwotCXBhci0+Y21hcF9maWZvLS07CS8qIGFzc3VtZSBGSUZPIGlzIGZpbGxpbmcgdXAgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzZ2l2d2ZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sCi0JCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlpbnQgcjsKLQotCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpID0KLQkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfCBfUEFHRV9QQ0Q7Ci0KLQlyID0gdm1faW9tYXBfbWVtb3J5KHZtYSwgc2dpdndmYl9tZW1fcGh5cywgc2dpdndmYl9tZW1fc2l6ZSk7Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAic2dpdndmYjogbW1hcCBmcmFtZWJ1ZmZlciBQKCVseCktPlYoJWx4KVxuIiwKLQkJc2dpdndmYl9tZW1fcGh5cyArICh2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQpLCB2bWEtPnZtX3N0YXJ0KTsKLQotCXJldHVybiByOwotfQotCi1pbnQgX19pbml0IHNnaXZ3ZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKLXsKLQljaGFyICp0aGlzX29wdDsKLQotCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCi0JCXJldHVybiAwOwotCi0Jd2hpbGUgKCh0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgewotCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJtb25pdG9yOiIsIDgpKSB7Ci0JCQlpZiAoIXN0cm5jbXAodGhpc19vcHQgKyA4LCAiY3J0IiwgMykpCi0JCQkJZmxhdHBhbmVsX2lkID0gLTE7Ci0JCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCArIDgsICIxNjAwc3ciLCA2KSkKLQkJCQlmbGF0cGFuZWxfaWQgPSBGTEFUUEFORUxfU0dJXzE2MDBTVzsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqICBJbml0aWFsaXNhdGlvbgotICovCi1zdGF0aWMgaW50IHNnaXZ3ZmJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBzZ2l2d19wYXIgKnBhcjsKLQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKLQljaGFyICptb25pdG9yOwotCi0JaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3Qgc2dpdndfcGFyKSArIHNpemVvZih1MzIpICogMTYsICZkZXYtPmRldik7Ci0JaWYgKCFpbmZvKQotCQlyZXR1cm4gLUVOT01FTTsKLQlwYXIgPSBpbmZvLT5wYXI7Ci0KLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihEQkVfUkVHX1BIWVMsIERCRV9SRUdfU0laRSwgInNnaXZ3ZmIiKSkgewotCQlwcmludGsoS0VSTl9FUlIgInNnaXZ3ZmI6IGNvdWxkbid0IHJlc2VydmUgbW1pbyByZWdpb25cbiIpOwotCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCXBhci0+cmVncyA9IChzdHJ1Y3QgYXNyZWdzICopIGlvcmVtYXBfbm9jYWNoZShEQkVfUkVHX1BIWVMsIERCRV9SRUdfU0laRSk7Ci0JaWYgKCFwYXItPnJlZ3MpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzZ2l2d2ZiOiBjb3VsZG4ndCBpb3JlbWFwIHJlZ2lzdGVyc1xuIik7Ci0JCWdvdG8gZmFpbF9pb3JlbWFwX3JlZ3M7Ci0JfQotCi0JbXRycl9hZGQoc2dpdndmYl9tZW1fcGh5cywgc2dpdndmYl9tZW1fc2l6ZSwgTVRSUl9UWVBFX1dSQ09NQiwgMSk7Ci0KLQlzZ2l2d2ZiX2ZpeC5zbWVtX3N0YXJ0ID0gc2dpdndmYl9tZW1fcGh5czsKLQlzZ2l2d2ZiX2ZpeC5zbWVtX2xlbiA9IHNnaXZ3ZmJfbWVtX3NpemU7Ci0Jc2dpdndmYl9maXgueXdyYXBzdGVwID0geXdyYXA7Ci0Jc2dpdndmYl9maXgueXBhbnN0ZXAgPSB5cGFuOwotCi0JaW5mby0+Zml4ID0gc2dpdndmYl9maXg7Ci0KLQlzd2l0Y2ggKGZsYXRwYW5lbF9pZCkgewotCQljYXNlIEZMQVRQQU5FTF9TR0lfMTYwMFNXOgotCQkJaW5mby0+dmFyID0gc2dpdndmYl92YXIxNjAwc3c7Ci0JCQltb25pdG9yID0gIlNHSSAxNjAwU1cgZmxhdHBhbmVsIjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaW5mby0+dmFyID0gc2dpdndmYl92YXI7Ci0JCQltb25pdG9yID0gIkNSVCI7Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAic2dpdndmYjogJXMgbW9uaXRvciBzZWxlY3RlZFxuIiwgbW9uaXRvcik7Ci0KLQlpbmZvLT5mYm9wcyA9ICZzZ2l2d2ZiX29wczsKLQlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9ICh2b2lkICopIChwYXIgKyAxKTsKLQlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUOwotCi0JaW5mby0+c2NyZWVuX2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUoKHVuc2lnbmVkIGxvbmcpIHNnaXZ3ZmJfbWVtX3BoeXMsIHNnaXZ3ZmJfbWVtX3NpemUpOwotCWlmICghaW5mby0+c2NyZWVuX2Jhc2UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzZ2l2d2ZiOiBjb3VsZG4ndCBpb3JlbWFwIHNjcmVlbl9iYXNlXG4iKTsKLQkJZ290byBmYWlsX2lvcmVtYXBfZmJtZW07Ci0JfQotCi0JaWYgKGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDI1NiwgMCkgPCAwKQotCQlnb3RvIGZhaWxfY29sb3JfbWFwOwotCi0JaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgInNnaXZ3ZmI6IGNvdWxkbid0IHJlZ2lzdGVyIGZyYW1lYnVmZmVyXG4iKTsKLQkJZ290byBmYWlsX3JlZ2lzdGVyX2ZyYW1lYnVmZmVyOwotCX0KLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgaW5mbyk7Ci0KLQlmYl9pbmZvKGluZm8sICJTR0kgREJFIGZyYW1lIGJ1ZmZlciBkZXZpY2UsIHVzaW5nICVsZEsgb2YgdmlkZW8gbWVtb3J5IGF0ICUjbHhcbiIsCi0JCXNnaXZ3ZmJfbWVtX3NpemUgPj4gMTAsIHNnaXZ3ZmJfbWVtX3BoeXMpOwotCXJldHVybiAwOwotCi1mYWlsX3JlZ2lzdGVyX2ZyYW1lYnVmZmVyOgotCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7Ci1mYWlsX2NvbG9yX21hcDoKLQlpb3VubWFwKChjaGFyICopIGluZm8tPnNjcmVlbl9iYXNlKTsKLWZhaWxfaW9yZW1hcF9mYm1lbToKLQlpb3VubWFwKHBhci0+cmVncyk7Ci1mYWlsX2lvcmVtYXBfcmVnczoKLQlyZWxlYXNlX21lbV9yZWdpb24oREJFX1JFR19QSFlTLCBEQkVfUkVHX1NJWkUpOwotCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7Ci0JcmV0dXJuIC1FTlhJTzsKLX0KLQotc3RhdGljIGludCBzZ2l2d2ZiX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGZiX2luZm8gKmluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JaWYgKGluZm8pIHsKLQkJc3RydWN0IHNnaXZ3X3BhciAqcGFyID0gaW5mby0+cGFyOwotCi0JCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7Ci0JCWRiZV9UdXJuT2ZmRG1hKHBhcik7Ci0JCWlvdW5tYXAocGFyLT5yZWdzKTsKLQkJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihEQkVfUkVHX1BIWVMsIERCRV9SRUdfU0laRSk7Ci0JCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7Ci0JCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzZ2l2d2ZiX2RyaXZlciA9IHsKLQkucHJvYmUJPSBzZ2l2d2ZiX3Byb2JlLAotCS5yZW1vdmUJPSBzZ2l2d2ZiX3JlbW92ZSwKLQkuZHJpdmVyCT0gewotCQkubmFtZQk9ICJzZ2l2d2ZiIiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNnaXZ3ZmJfZGV2aWNlOwotCi1pbnQgX19pbml0IHNnaXZ3ZmJfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLSNpZm5kZWYgTU9EVUxFCi0JY2hhciAqb3B0aW9uID0gTlVMTDsKLQotCWlmIChmYl9nZXRfb3B0aW9ucygic2dpdndmYiIsICZvcHRpb24pKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlzZ2l2d2ZiX3NldHVwKG9wdGlvbik7Ci0jZW5kaWYKLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNnaXZ3ZmJfZHJpdmVyKTsKLQlpZiAoIXJldCkgewotCQlzZ2l2d2ZiX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic2dpdndmYiIsIDApOwotCQlpZiAoc2dpdndmYl9kZXZpY2UpIHsKLQkJCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoc2dpdndmYl9kZXZpY2UpOwotCQl9IGVsc2UKLQkJCXJldCA9IC1FTk9NRU07Ci0JCWlmIChyZXQpIHsKLQkJCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzZ2l2d2ZiX2RyaXZlcik7Ci0JCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHNnaXZ3ZmJfZGV2aWNlKTsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1tb2R1bGVfaW5pdChzZ2l2d2ZiX2luaXQpOwotCi0jaWZkZWYgTU9EVUxFCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzZ2l2d2ZiX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihzZ2l2d2ZiX2RldmljZSk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNnaXZ3ZmJfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2V4aXQoc2dpdndmYl9leGl0KTsKLQotI2VuZGlmCQkJCS8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby91dmVzYWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3V2ZXNhZmIuYwppbmRleCAyNTZmYmE3Li4xZjM4NDQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3V2ZXNhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3V2ZXNhZmIuYwpAQCAtMTkwLDcgKzE5MCw3IEBACiAJdXZmYl90YXNrc1tzZXFdID0gdGFzazsKIAltdXRleF91bmxvY2soJnV2ZmJfbG9jayk7CiAKLQllcnIgPSBjbl9uZXRsaW5rX3NlbmQobSwgMCwgR0ZQX0tFUk5FTCk7CisJZXJyID0gY25fbmV0bGlua19zZW5kKG0sIDAsIDAsIEdGUF9LRVJORUwpOwogCWlmIChlcnIgPT0gLUVTUkNIKSB7CiAJCS8qCiAJCSAqIFRyeSB0byBzdGFydCB0aGUgdXNlcnNwYWNlIGhlbHBlciBpZiBzZW5kaW5nCkBAIC0yMDQsNyArMjA0LDcgQEAKIAkJCQkJImhlbHBlciBpcyBpbnN0YWxsZWQgYW5kIGV4ZWN1dGFibGVcbiIpOwogCQl9IGVsc2UgewogCQkJdjg2ZF9zdGFydGVkID0gMTsKLQkJCWVyciA9IGNuX25ldGxpbmtfc2VuZChtLCAwLCBnZnBfYW55KCkpOworCQkJZXJyID0gY25fbmV0bGlua19zZW5kKG0sIDAsIDAsIGdmcF9hbnkoKSk7CiAJCQlpZiAoZXJyID09IC1FTk9CVUZTKQogCQkJCWVyciA9IDA7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmMgYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5jCmluZGV4IDFiNWQ0OGMuLmJmYjJkM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmMKKysrIGIvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYwpAQCAtODY5LDE0ICs4NjksMTMgQEAKIAogCXNwaW5fbG9jaygmaW1hZ2UtPmxvY2spOwogCi0JLyogVGhlIGZvbGxvd2luZyBjb2RlIGhhbmRsZXMgVk1FIGFkZHJlc3MgYWxpZ25tZW50IHByb2JsZW0KLQkgKiBpbiBvcmRlciB0byBhc3N1cmUgdGhlIG1heGltYWwgZGF0YSB3aWR0aCBjeWNsZS4KLQkgKiBXZSBjYW5ub3QgdXNlIG1lbWNweV94eHggZGlyZWN0bHkgaGVyZSBiZWNhdXNlIGl0Ci0JICogbWF5IGN1dCBkYXRhIHRyYW5zZmVyIGluIDgtYml0cyBjeWNsZXMsIHRodXMgbWFraW5nCi0JICogRDE2IGN5Y2xlIGltcG9zc2libGUuCi0JICogRnJvbSB0aGUgb3RoZXIgaGFuZCwgdGhlIGJyaWRnZSBpdHNlbGYgYXNzdXJlcyB0aGF0Ci0JICogbWF4aW1hbCBjb25maWd1cmVkIGRhdGEgY3ljbGUgaXMgdXNlZCBhbmQgc3BsaXRzIGl0Ci0JICogYXV0b21hdGljYWxseSBmb3Igbm9uLWFsaWduZWQgYWRkcmVzc2VzLgorCS8qIFRoZSBmb2xsb3dpbmcgY29kZSBoYW5kbGVzIFZNRSBhZGRyZXNzIGFsaWdubWVudC4gV2UgY2Fubm90IHVzZQorCSAqIG1lbWNweV94eHggaGVyZSBiZWNhdXNlIGl0IG1heSBjdXQgZGF0YSB0cmFuc2ZlcnMgaW4gdG8gOC1iaXQKKwkgKiBjeWNsZXMgd2hlbiBEMTYgb3IgRDMyIGN5Y2xlcyBhcmUgcmVxdWlyZWQgb24gdGhlIFZNRSBidXMuCisJICogT24gdGhlIG90aGVyIGhhbmQsIHRoZSBicmlkZ2UgaXRzZWxmIGFzc3VyZXMgdGhhdCB0aGUgbWF4aW11bSBkYXRhCisJICogY3ljbGUgY29uZmlndXJlZCBmb3IgdGhlIHRyYW5zZmVyIGlzIHVzZWQgYW5kIHNwbGl0cyBpdAorCSAqIGF1dG9tYXRpY2FsbHkgZm9yIG5vbi1hbGlnbmVkIGFkZHJlc3Nlcywgc28gd2UgZG9uJ3Qgd2FudCB0aGUKKwkgKiBvdmVyaGVhZCBvZiBuZWVkbGVzc2x5IGZvcmNpbmcgc21hbGwgdHJhbnNmZXJzIGZvciB0aGUgZW50aXJlIGN5Y2xlLgogCSAqLwogCWlmICgodWludHB0cl90KWFkZHIgJiAweDEpIHsKIAkJKih1OCAqKWJ1ZiA9IGlvcmVhZDgoYWRkcik7CkBAIC04OTYsOSArODk1LDkgQEAKIAl9CiAKIAljb3VudDMyID0gKGNvdW50IC0gZG9uZSkgJiB+MHgzOwotCWlmIChjb3VudDMyID4gMCkgewotCQltZW1jcHlfZnJvbWlvKGJ1ZiArIGRvbmUsIGFkZHIgKyBkb25lLCAodW5zaWduZWQgaW50KWNvdW50KTsKLQkJZG9uZSArPSBjb3VudDMyOworCXdoaWxlIChkb25lIDwgY291bnQzMikgeworCQkqKHUzMiAqKShidWYgKyBkb25lKSA9IGlvcmVhZDMyKGFkZHIgKyBkb25lKTsKKwkJZG9uZSArPSA0OwogCX0KIAogCWlmICgoY291bnQgLSBkb25lKSAmIDB4MikgewpAQCAtOTMwLDcgKzkyOSw3IEBACiAJc3Bpbl9sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAkvKiBIZXJlIHdlIGFwcGx5IGZvciB0aGUgc2FtZSBzdHJhdGVneSB3ZSBkbyBpbiBtYXN0ZXJfcmVhZAotCSAqIGZ1bmN0aW9uIGluIG9yZGVyIHRvIGFzc3VyZSBEMTYgY3ljbGUgd2hlbiByZXF1aXJlZC4KKwkgKiBmdW5jdGlvbiBpbiBvcmRlciB0byBhc3N1cmUgdGhlIGNvcnJlY3QgY3ljbGVzLgogCSAqLwogCWlmICgodWludHB0cl90KWFkZHIgJiAweDEpIHsKIAkJaW93cml0ZTgoKih1OCAqKWJ1ZiwgYWRkcik7CkBAIC05NTAsOSArOTQ5LDkgQEAKIAl9CiAKIAljb3VudDMyID0gKGNvdW50IC0gZG9uZSkgJiB+MHgzOwotCWlmIChjb3VudDMyID4gMCkgewotCQltZW1jcHlfdG9pbyhhZGRyICsgZG9uZSwgYnVmICsgZG9uZSwgY291bnQzMik7Ci0JCWRvbmUgKz0gY291bnQzMjsKKwl3aGlsZSAoZG9uZSA8IGNvdW50MzIpIHsKKwkJaW93cml0ZTMyKCoodTMyICopKGJ1ZiArIGRvbmUpLCBhZGRyICsgZG9uZSk7CisJCWRvbmUgKz0gNDsKIAl9CiAKIAlpZiAoKGNvdW50IC0gZG9uZSkgJiAweDIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5jIGIvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMKaW5kZXggOTkxMWNkNS4uMDY5OTBjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMKKysrIGIvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMKQEAgLTEyNzYsOCArMTI3Niw4IEBACiAJc3Bpbl9sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAkvKiBUaGUgZm9sbG93aW5nIGNvZGUgaGFuZGxlcyBWTUUgYWRkcmVzcyBhbGlnbm1lbnQuIFdlIGNhbm5vdCB1c2UKLQkgKiBtZW1jcHlfeHh4IGRpcmVjdGx5IGhlcmUgYmVjYXVzZSBpdCBtYXkgY3V0IHNtYWxsIGRhdGEgdHJhbnNmZXJzIGluCi0JICogdG8gOC1iaXQgY3ljbGVzLCB0aHVzIG1ha2luZyBEMTYgY3ljbGUgaW1wb3NzaWJsZS4KKwkgKiBtZW1jcHlfeHh4IGhlcmUgYmVjYXVzZSBpdCBtYXkgY3V0IGRhdGEgdHJhbnNmZXJzIGluIHRvIDgtYml0CisJICogY3ljbGVzIHdoZW4gRDE2IG9yIEQzMiBjeWNsZXMgYXJlIHJlcXVpcmVkIG9uIHRoZSBWTUUgYnVzLgogCSAqIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgYnJpZGdlIGl0c2VsZiBhc3N1cmVzIHRoYXQgdGhlIG1heGltdW0gZGF0YQogCSAqIGN5Y2xlIGNvbmZpZ3VyZWQgZm9yIHRoZSB0cmFuc2ZlciBpcyB1c2VkIGFuZCBzcGxpdHMgaXQKIAkgKiBhdXRvbWF0aWNhbGx5IGZvciBub24tYWxpZ25lZCBhZGRyZXNzZXMsIHNvIHdlIGRvbid0IHdhbnQgdGhlCkBAIC0xMzAxLDkgKzEzMDEsOSBAQAogCX0KIAogCWNvdW50MzIgPSAoY291bnQgLSBkb25lKSAmIH4weDM7Ci0JaWYgKGNvdW50MzIgPiAwKSB7Ci0JCW1lbWNweV9mcm9taW8oYnVmICsgZG9uZSwgYWRkciArIGRvbmUsIGNvdW50MzIpOwotCQlkb25lICs9IGNvdW50MzI7CisJd2hpbGUgKGRvbmUgPCBjb3VudDMyKSB7CisJCSoodTMyICopKGJ1ZiArIGRvbmUpID0gaW9yZWFkMzIoYWRkciArIGRvbmUpOworCQlkb25lICs9IDQ7CiAJfQogCiAJaWYgKChjb3VudCAtIGRvbmUpICYgMHgyKSB7CkBAIC0xMzYzLDcgKzEzNjMsNyBAQAogCXNwaW5fbG9jaygmaW1hZ2UtPmxvY2spOwogCiAJLyogSGVyZSB3ZSBhcHBseSBmb3IgdGhlIHNhbWUgc3RyYXRlZ3kgd2UgZG8gaW4gbWFzdGVyX3JlYWQKLQkgKiBmdW5jdGlvbiBpbiBvcmRlciB0byBhc3N1cmUgRDE2IGN5Y2xlIHdoZW4gcmVxdWlyZWQuCisJICogZnVuY3Rpb24gaW4gb3JkZXIgdG8gYXNzdXJlIHRoZSBjb3JyZWN0IGN5Y2xlcy4KIAkgKi8KIAlpZiAoKHVpbnRwdHJfdClhZGRyICYgMHgxKSB7CiAJCWlvd3JpdGU4KCoodTggKilidWYsIGFkZHIpOwpAQCAtMTM4Myw5ICsxMzgzLDkgQEAKIAl9CiAKIAljb3VudDMyID0gKGNvdW50IC0gZG9uZSkgJiB+MHgzOwotCWlmIChjb3VudDMyID4gMCkgewotCQltZW1jcHlfdG9pbyhhZGRyICsgZG9uZSwgYnVmICsgZG9uZSwgY291bnQzMik7Ci0JCWRvbmUgKz0gY291bnQzMjsKKwl3aGlsZSAoZG9uZSA8IGNvdW50MzIpIHsKKwkJaW93cml0ZTMyKCoodTMyICopKGJ1ZiArIGRvbmUpLCBhZGRyICsgZG9uZSk7CisJCWRvbmUgKz0gNDsKIAl9CiAKIAlpZiAoKGNvdW50IC0gZG9uZSkgJiAweDIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvbWFzdGVycy9LY29uZmlnIGIvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcKaW5kZXggZWZjN2YwNy4uMTcwOGIyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcKKysrIGIvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcKQEAgLTM2LDEzICszNiwxMiBAQAogCiBjb25maWcgVzFfTUFTVEVSX01YQwogCXRyaXN0YXRlICJGcmVlc2NhbGUgTVhDIDEtd2lyZSBidXNtYXN0ZXIiCi0JZGVwZW5kcyBvbiBXMSAmJiBBUkNIX01YQworCWRlcGVuZHMgb24gQVJDSF9NWEMgfHwgQ09NUElMRV9URVNUCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgTVhDIDEtd2lyZSBob3N0CiAKIGNvbmZpZyBXMV9NQVNURVJfRFMxV00KIAl0cmlzdGF0ZSAiTWF4aW0gRFMxV00gMS13aXJlIGJ1c21hc3RlciIKLQlkZXBlbmRzIG9uIFcxCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIERTMVdNIDEtd2lyZSBkcml2ZXIsIHN1Y2ggYXMgdGhhdAogCSAgaW4gSFAgaVBBUSBkZXZpY2VzIGxpa2UgaDV4eHgsIGgyMjAwLCBhbmQgQVNJQzMtYmFzZWQgbGlrZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9tYXN0ZXJzL2RzMjQ5MC5jIGIvZHJpdmVycy93MS9tYXN0ZXJzL2RzMjQ5MC5jCmluZGV4IDRmN2UxZDcuLjc0MDRhZDMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL21hc3RlcnMvZHMyNDkwLmMKKysrIGIvZHJpdmVycy93MS9tYXN0ZXJzL2RzMjQ5MC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqCWRzY29yZS5jCisgKglkczI0OTAuYyAgVVNCIHRvIG9uZSB3aXJlIGJyaWRnZQogICoKICAqIENvcHlyaWdodCAoYykgMjAwNCBFdmdlbml5IFBvbHlha292IDx6YnJAaW9yZW1hcC5uZXQ+CiAgKgpAQCAtMjgsNiArMjgsMTAgQEAKICNpbmNsdWRlICIuLi93MV9pbnQuaCIKICNpbmNsdWRlICIuLi93MS5oIgogCisvKiBVU0IgU3RhbmRhcmQgKi8KKy8qIFVTQiBDb250cm9sIHJlcXVlc3QgdmVuZG9yIHR5cGUgKi8KKyNkZWZpbmUgVkVORE9SCQkJCTB4NDAKKwogLyogQ09NTUFORCBUWVBFIENPREVTICovCiAjZGVmaW5lIENPTlRST0xfQ01ECQkJMHgwMAogI2RlZmluZSBDT01NX0NNRAkJCTB4MDEKQEAgLTEwNyw2ICsxMTEsOCBAQAogI2RlZmluZSBTVF9IQUxUCQkJCTB4MTAgIC8qIERTMjQ5MCBpcyBjdXJyZW50bHkgaGFsdGVkICovCiAjZGVmaW5lIFNUX0lETEUJCQkJMHgyMCAgLyogRFMyNDkwIGlzIGN1cnJlbnRseSBpZGxlICovCiAjZGVmaW5lIFNUX0VQT0YJCQkJMHg4MAorLyogU3RhdHVzIHRyYW5zZmVyIHNpemUsIDE2IGJ5dGVzIHN0YXR1cywgMTYgYnl0ZSByZXN1bHQgZmxhZ3MgKi8KKyNkZWZpbmUgU1RfU0laRQkJCQkweDIwCiAKIC8qIFJlc3VsdCBSZWdpc3RlciBmbGFncyAqLwogI2RlZmluZSBSUl9ERVRFQ1QJCQkweEE1IC8qIE5ldyBkZXZpY2UgZGV0ZWN0ZWQgKi8KQEAgLTE5OCw3ICsyMDQsNyBAQAogCWludCBlcnI7CiAKIAllcnIgPSB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCBkZXYtPmVwW0VQX0NPTlRST0xdKSwKLQkJCUNPTlRST0xfQ01ELCAweDQwLCB2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIDEwMDApOworCQkJQ09OVFJPTF9DTUQsIFZFTkRPUiwgdmFsdWUsIGluZGV4LCBOVUxMLCAwLCAxMDAwKTsKIAlpZiAoZXJyIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBzZW5kIGNvbW1hbmQgY29udHJvbCBtZXNzYWdlICV4LiV4OiBlcnI9JWQuXG4iLAogCQkJCXZhbHVlLCBpbmRleCwgZXJyKTsKQEAgLTIxMyw3ICsyMTksNyBAQAogCWludCBlcnI7CiAKIAllcnIgPSB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCBkZXYtPmVwW0VQX0NPTlRST0xdKSwKLQkJCU1PREVfQ01ELCAweDQwLCB2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIDEwMDApOworCQkJTU9ERV9DTUQsIFZFTkRPUiwgdmFsdWUsIGluZGV4LCBOVUxMLCAwLCAxMDAwKTsKIAlpZiAoZXJyIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBzZW5kIG1vZGUgY29udHJvbCBtZXNzYWdlICV4LiV4OiBlcnI9JWQuXG4iLAogCQkJCXZhbHVlLCBpbmRleCwgZXJyKTsKQEAgLTIyOCw3ICsyMzQsNyBAQAogCWludCBlcnI7CiAKIAllcnIgPSB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCBkZXYtPmVwW0VQX0NPTlRST0xdKSwKLQkJCUNPTU1fQ01ELCAweDQwLCB2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIDEwMDApOworCQkJQ09NTV9DTUQsIFZFTkRPUiwgdmFsdWUsIGluZGV4LCBOVUxMLCAwLCAxMDAwKTsKIAlpZiAoZXJyIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBzZW5kIGNvbnRyb2wgbWVzc2FnZSAleC4leDogZXJyPSVkLlxuIiwKIAkJCQl2YWx1ZSwgaW5kZXgsIGVycik7CkBAIC0yNDYsNyArMjUyLDggQEAKIAltZW1zZXQoc3QsIDAsIHNpemVvZigqc3QpKTsKIAogCWNvdW50ID0gMDsKLQllcnIgPSB1c2JfYnVsa19tc2coZGV2LT51ZGV2LCB1c2JfcmN2YnVsa3BpcGUoZGV2LT51ZGV2LCBkZXYtPmVwW0VQX1NUQVRVU10pLCBidWYsIHNpemUsICZjb3VudCwgMTAwKTsKKwllcnIgPSB1c2JfaW50ZXJydXB0X21zZyhkZXYtPnVkZXYsIHVzYl9yY3ZpbnRwaXBlKGRldi0+dWRldiwKKwkJZGV2LT5lcFtFUF9TVEFUVVNdKSwgYnVmLCBzaXplLCAmY291bnQsIDEwMCk7CiAJaWYgKGVyciA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVhZCAxLXdpcmUgZGF0YSBmcm9tIDB4JXg6IGVycj0lZC5cbiIsIGRldi0+ZXBbRVBfU1RBVFVTXSwgZXJyKTsKIAkJcmV0dXJuIGVycjsKQEAgLTM1Myw3ICszNjAsNyBAQAogCWVyciA9IHVzYl9idWxrX21zZyhkZXYtPnVkZXYsIHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsIGRldi0+ZXBbRVBfREFUQV9JTl0pLAogCQkJCWJ1Ziwgc2l6ZSwgJmNvdW50LCAxMDAwKTsKIAlpZiAoZXJyIDwgMCkgewotCQl1OCBidWZbMHgyMF07CisJCXU4IGJ1ZltTVF9TSVpFXTsKIAkJaW50IGNvdW50OwogCiAJCXByaW50ayhLRVJOX0lORk8gIkNsZWFyaW5nIGVwMHgleC5cbiIsIGRldi0+ZXBbRVBfREFUQV9JTl0pOwpAQCAtMzk4LDcgKzQwNSw3IEBACiB7CiAJc3RydWN0IGRzX3N0YXR1cyBzdDsKIAlpbnQgY291bnQgPSAwLCBlcnIgPSAwOwotCXU4IGJ1ZlsweDIwXTsKKwl1OCBidWZbU1RfU0laRV07CiAKIAlkbyB7CiAJCWVyciA9IGRzX3NlbmRfY29udHJvbChkZXYsIENUTF9IQUxUX0VYRV9JRExFLCAwKTsKQEAgLTQ1MCwxMCArNDU3LDExIEBACiAKIHN0YXRpYyBpbnQgZHNfd2FpdF9zdGF0dXMoc3RydWN0IGRzX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHNfc3RhdHVzICpzdCkKIHsKLQl1OCBidWZbMHgyMF07CisJdTggYnVmW1NUX1NJWkVdOwogCWludCBlcnIsIGNvdW50ID0gMDsKIAogCWRvIHsKKwkJc3QtPnN0YXR1cyA9IDA7CiAJCWVyciA9IGRzX3JlY3Zfc3RhdHVzX25vZHVtcChkZXYsIHN0LCBidWYsIHNpemVvZihidWYpKTsKICNpZiAwCiAJCWlmIChlcnIgPj0gMCkgewpAQCAtNDY0LDcgKzQ3Miw3IEBACiAJCQlwcmludGsoIlxuIik7CiAJCX0KICNlbmRpZgotCX0gd2hpbGUgKCEoYnVmWzB4MDhdICYgU1RfSURMRSkgJiYgIShlcnIgPCAwKSAmJiArK2NvdW50IDwgMTAwKTsKKwl9IHdoaWxlICghKHN0LT5zdGF0dXMgJiBTVF9JRExFKSAmJiAhKGVyciA8IDApICYmICsrY291bnQgPCAxMDApOwogCiAJaWYgKGVyciA+PSAxNiAmJiBzdC0+c3RhdHVzICYgU1RfRVBPRikgewogCQlwcmludGsoS0VSTl9JTkZPICJSZXNldHRpbmcgZGV2aWNlIGFmdGVyIFNUX0VQT0YuXG4iKTsKQEAgLTY5MCwzNyArNjk4LDEwNiBAQAogCXJldHVybiAhKGVyciA9PSBsZW4pOwogfQogCi0jaWYgMAotCi1zdGF0aWMgaW50IGRzX3NlYXJjaChzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHU2NCBpbml0LCB1NjQgKmJ1ZiwgdTggaWRfbnVtYmVyLCBpbnQgY29uZGl0aW9uYWxfc2VhcmNoKQorc3RhdGljIHZvaWQgZHM5NDkwcl9zZWFyY2godm9pZCAqZGF0YSwgc3RydWN0IHcxX21hc3RlciAqbWFzdGVyLAorCXU4IHNlYXJjaF90eXBlLCB3MV9zbGF2ZV9mb3VuZF9jYWxsYmFjayBjYWxsYmFjaykKIHsKKwkvKiBXaGVuIHN0YXJ0aW5nIHdpdGggYW4gZXhpc3RpbmcgaWQsIHRoZSBmaXJzdCBpZCByZXR1cm5lZCB3aWxsCisJICogYmUgdGhhdCBkZXZpY2UgKGlmIGl0IGlzIHN0aWxsIG9uIHRoZSBidXMgbW9zdCBsaWtlbHkpLgorCSAqCisJICogSWYgdGhlIG51bWJlciBvZiBkZXZpY2VzIGZvdW5kIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUKKwkgKiBzZWFyY2hfbGltaXQsIHRoYXQgbnVtYmVyIG9mIElEcyB3aWxsIGJlIHJldHVybmVkLiAgSWYgdGhlcmUgYXJlCisJICogbW9yZSwgc2VhcmNoX2xpbWl0IElEcyB3aWxsIGJlIHJldHVybmVkIGZvbGxvd2VkIGJ5IGEgbm9uLXplcm8KKwkgKiBkaXNjcmVwZW5jeSB2YWx1ZS4KKwkgKi8KKwlzdHJ1Y3QgZHNfZGV2aWNlICpkZXYgPSBkYXRhOwogCWludCBlcnI7CiAJdTE2IHZhbHVlLCBpbmRleDsKIAlzdHJ1Y3QgZHNfc3RhdHVzIHN0OworCXU4IHN0X2J1ZltTVF9TSVpFXTsKKwlpbnQgc2VhcmNoX2xpbWl0OworCWludCBmb3VuZCA9IDA7CisJaW50IGk7CiAKLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJLyogRFMxOGIyMCBzcGVjLCAxMy4xNiBtcyBwZXIgZGV2aWNlLCA3NSBwZXIgc2Vjb25kLCBzbGVlcCBmb3IKKwkgKiBkaXNjb3ZlcmluZyA4IGRldmljZXMgKDEgYnVsayB0cmFuc2ZlciBhbmQgMS8yIEZJRk8gc2l6ZSkgYXQgYSB0aW1lLgorCSAqLworCWNvbnN0IHVuc2lnbmVkIGxvbmcganRpbWUgPSBtc2Vjc190b19qaWZmaWVzKDEwMDAqOC83NSk7CisJLyogRklGTyAxMjggYnl0ZXMsIGJ1bGsgcGFja2V0IHNpemUgNjQsIHJlYWQgYSBtdWx0aXBsZSBvZiB0aGUKKwkgKiBwYWNrZXQgc2l6ZS4KKwkgKi8KKwl1NjQgYnVmWzIqNjQvOF07CiAKLQllcnIgPSBkc19zZW5kX2RhdGEoZHNfZGV2LCAodW5zaWduZWQgY2hhciAqKSZpbml0LCA4KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCW11dGV4X2xvY2soJm1hc3Rlci0+YnVzX211dGV4KTsKIAotCWRzX3dhaXRfc3RhdHVzKGRzX2RldiwgJnN0KTsKKwkvKiBhZGRyZXNzIHRvIHN0YXJ0IHNlYXJjaGluZyBhdCAqLworCWlmIChkc19zZW5kX2RhdGEoZGV2LCAodTggKikmbWFzdGVyLT5zZWFyY2hfaWQsIDgpIDwgMCkKKwkJZ290byBzZWFyY2hfb3V0OworCW1hc3Rlci0+c2VhcmNoX2lkID0gMDsKIAotCXZhbHVlID0gQ09NTV9TRUFSQ0hfQUNDRVNTIHwgQ09NTV9JTSB8IENPTU1fU00gfCBDT01NX0YgfCBDT01NX1JUUzsKLQlpbmRleCA9IChjb25kaXRpb25hbF9zZWFyY2ggPyAweEVDIDogMHhGMCkgfCAoaWRfbnVtYmVyIDw8IDgpOwotCWVyciA9IGRzX3NlbmRfY29udHJvbChkc19kZXYsIHZhbHVlLCBpbmRleCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwl2YWx1ZSA9IENPTU1fU0VBUkNIX0FDQ0VTUyB8IENPTU1fSU0gfCBDT01NX1JTVCB8IENPTU1fU00gfCBDT01NX0YgfAorCQlDT01NX1JUUzsKKwlzZWFyY2hfbGltaXQgPSBtYXN0ZXItPm1heF9zbGF2ZV9jb3VudDsKKwlpZiAoc2VhcmNoX2xpbWl0ID4gMjU1KQorCQlzZWFyY2hfbGltaXQgPSAwOworCWluZGV4ID0gc2VhcmNoX3R5cGUgfCAoc2VhcmNoX2xpbWl0IDw8IDgpOworCWlmIChkc19zZW5kX2NvbnRyb2woZGV2LCB2YWx1ZSwgaW5kZXgpIDwgMCkKKwkJZ290byBzZWFyY2hfb3V0OwogCi0JZHNfd2FpdF9zdGF0dXMoZHNfZGV2LCAmc3QpOworCWRvIHsKKwkJc2NoZWR1bGVfdGltZW91dChqdGltZSk7CiAKLQllcnIgPSBkc19yZWN2X2RhdGEoZHNfZGV2LCAodW5zaWduZWQgY2hhciAqKWJ1ZiwgOCppZF9udW1iZXIpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOworCQlpZiAoZHNfcmVjdl9zdGF0dXNfbm9kdW1wKGRldiwgJnN0LCBzdF9idWYsIHNpemVvZihzdF9idWYpKSA8CisJCQlzaXplb2Yoc3QpKSB7CisJCQlicmVhazsKKwkJfQogCi0JcmV0dXJuIGVyci84OworCQlpZiAoc3QuZGF0YV9pbl9idWZmZXJfc3RhdHVzKSB7CisJCQkvKiBCdWxrIGluIGNhbiByZWNlaXZlIHBhcnRpYWwgaWRzLCBidXQgd2hlbiBpdCBkb2VzCisJCQkgKiB0aGV5IGZhaWwgY3JjIGFuZCB3aWxsIGJlIGRpc2NhcmRlZCBhbnl3YXkuCisJCQkgKiBUaGF0IGhhcyBvbmx5IGJlZW4gc2VlbiB3aGVuIHN0YXR1cyBpbiBidWZmZXIKKwkJCSAqIGlzIDAgYW5kIGJ1bGsgaXMgcmVhZCBhbnl3YXksIHNvIGRvbid0IHJlYWQKKwkJCSAqIGJ1bGsgd2l0aG91dCBmaXJzdCBjaGVja2luZyBpZiBzdGF0dXMgc2F5cyB0aGVyZQorCQkJICogaXMgZGF0YSB0byByZWFkLgorCQkJICovCisJCQllcnIgPSBkc19yZWN2X2RhdGEoZGV2LCAodTggKilidWYsIHNpemVvZihidWYpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWJyZWFrOworCQkJZm9yIChpID0gMDsgaSA8IGVyci84OyArK2kpIHsKKwkJCQkrK2ZvdW5kOworCQkJCWlmIChmb3VuZCA8PSBzZWFyY2hfbGltaXQpCisJCQkJCWNhbGxiYWNrKG1hc3RlciwgYnVmW2ldKTsKKwkJCQkvKiBjYW4ndCBrbm93IGlmIHRoZXJlIHdpbGwgYmUgYSBkaXNjcmVwYW5jeQorCQkJCSAqIHZhbHVlIGFmdGVyIHVudGlsIHRoZSBuZXh0IGlkICovCisJCQkJaWYgKGZvdW5kID09IHNlYXJjaF9saW1pdCkKKwkJCQkJbWFzdGVyLT5zZWFyY2hfaWQgPSBidWZbaV07CisJCQl9CisJCX0KKworCQlpZiAodGVzdF9iaXQoVzFfQUJPUlRfU0VBUkNILCAmbWFzdGVyLT5mbGFncykpCisJCQlicmVhazsKKwl9IHdoaWxlICghKHN0LnN0YXR1cyAmIChTVF9JRExFIHwgU1RfSEFMVCkpKTsKKworCS8qIG9ubHkgY29udGludWUgdGhlIHNlYXJjaCBpZiBzb21lIHdlcmVuJ3QgZm91bmQgKi8KKwlpZiAoZm91bmQgPD0gc2VhcmNoX2xpbWl0KSB7CisJCW1hc3Rlci0+c2VhcmNoX2lkID0gMDsKKwl9IGVsc2UgaWYgKCF0ZXN0X2JpdChXMV9XQVJOX01BWF9DT1VOVCwgJm1hc3Rlci0+ZmxhZ3MpKSB7CisJCS8qIE9ubHkgbWF4X3NsYXZlX2NvdW50IHdpbGwgYmUgc2Nhbm5lZCBpbiBhIHNlYXJjaCwKKwkJICogYnV0IGl0IHdpbGwgc3RhcnQgd2hlcmUgaXQgbGVmdCBvZmYgbmV4dCBzZWFyY2gKKwkJICogdW50aWwgYWxsIGlkcyBhcmUgaWRlbnRpZmllZCBhbmQgdGhlbiBpdCB3aWxsIHN0YXJ0CisJCSAqIG92ZXIuICBBIGNvbnRpbnVlZCBzZWFyY2ggd2lsbCByZXBvcnQgdGhlIHByZXZpb3VzCisJCSAqIGxhc3QgaWQgYXMgdGhlIGZpcnN0IGlkIChwcm92aWRlZCBpdCBpcyBzdGlsbCBvbiB0aGUKKwkJICogYnVzKS4KKwkJICovCisJCWRldl9pbmZvKCZkZXYtPnVkZXYtPmRldiwgIiVzOiBtYXhfc2xhdmVfY291bnQgJWQgcmVhY2hlZCwgIgorCQkJIndpbGwgY29udGludWUgbmV4dCBzZWFyY2guXG4iLCBfX2Z1bmNfXywKKwkJCW1hc3Rlci0+bWF4X3NsYXZlX2NvdW50KTsKKwkJc2V0X2JpdChXMV9XQVJOX01BWF9DT1VOVCwgJm1hc3Rlci0+ZmxhZ3MpOworCX0KK3NlYXJjaF9vdXQ6CisJbXV0ZXhfdW5sb2NrKCZtYXN0ZXItPmJ1c19tdXRleCk7CiB9CiAKKyNpZiAwCiBzdGF0aWMgaW50IGRzX21hdGNoX2FjY2VzcyhzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHU2NCBpbml0KQogewogCWludCBlcnI7CkBAIC04OTQsNiArOTcxLDcgQEAKIAlkZXYtPm1hc3Rlci53cml0ZV9ibG9jawk9ICZkczk0OTByX3dyaXRlX2Jsb2NrOwogCWRldi0+bWFzdGVyLnJlc2V0X2J1cwk9ICZkczk0OTByX3Jlc2V0OwogCWRldi0+bWFzdGVyLnNldF9wdWxsdXAJPSAmZHM5NDkwcl9zZXRfcHVsbHVwOworCWRldi0+bWFzdGVyLnNlYXJjaAk9ICZkczk0OTByX3NlYXJjaDsKIAogCXJldHVybiB3MV9hZGRfbWFzdGVyX2RldmljZSgmZGV2LT5tYXN0ZXIpOwogfQpAQCAtOTEwLDE1ICs5ODgsMTMgQEAKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OwogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2M7CiAJc3RydWN0IGRzX2RldmljZSAqZGV2OwotCWludCBpLCBlcnI7CisJaW50IGksIGVyciwgYWx0OwogCi0JZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRzX2RldmljZSksIEdGUF9LRVJORUwpOworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkc19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldikgewogCQlwcmludGsoS0VSTl9JTkZPICJGYWlsZWQgdG8gYWxsb2NhdGUgbmV3IERTOTQ5MFIgc3RydWN0dXJlLlxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlkZXYtPnNwdV9zbGVlcCA9IDA7Ci0JZGV2LT5zcHVfYml0ID0gMDsKIAlkZXYtPnVkZXYgPSB1c2JfZ2V0X2Rldih1ZGV2KTsKIAlpZiAoIWRldi0+dWRldikgewogCQllcnIgPSAtRU5PTUVNOwpAQCAtOTI4LDIwICsxMDA0LDI1IEBACiAKIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGRldik7CiAKLQllcnIgPSB1c2Jfc2V0X2ludGVyZmFjZShkZXYtPnVkZXYsIGludGYtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCAzKTsKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHNldCBhbHRlcm5hdGl2ZSBzZXR0aW5nIDMgZm9yICVkIGludGVyZmFjZTogZXJyPSVkLlxuIiwKLQkJCQlpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlciwgZXJyKTsKLQkJZ290byBlcnJfb3V0X2NsZWFyOwotCX0KLQogCWVyciA9IHVzYl9yZXNldF9jb25maWd1cmF0aW9uKGRldi0+dWRldik7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZXNldCBjb25maWd1cmF0aW9uOiBlcnI9JWQuXG4iLCBlcnIpOworCQlkZXZfZXJyKCZkZXYtPnVkZXYtPmRldiwKKwkJCSJGYWlsZWQgdG8gcmVzZXQgY29uZmlndXJhdGlvbjogZXJyPSVkLlxuIiwgZXJyKTsKIAkJZ290byBlcnJfb3V0X2NsZWFyOwogCX0KIAotCWlmYWNlX2Rlc2MgPSAmaW50Zi0+YWx0c2V0dGluZ1swXTsKKwkvKiBhbHRlcm5hdGl2ZSAzLCAxbXMgaW50ZXJydXB0IChncmVhdGx5IHNwZWVkcyBzZWFyY2gpLCA2NCBieXRlIGJ1bGsgKi8KKwlhbHQgPSAzOworCWVyciA9IHVzYl9zZXRfaW50ZXJmYWNlKGRldi0+dWRldiwKKwkJaW50Zi0+YWx0c2V0dGluZ1thbHRdLmRlc2MuYkludGVyZmFjZU51bWJlciwgYWx0KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJmRldi0+dWRldi0+ZGV2LCAiRmFpbGVkIHRvIHNldCBhbHRlcm5hdGl2ZSBzZXR0aW5nICVkICIKKwkJCSJmb3IgJWQgaW50ZXJmYWNlOiBlcnI9JWQuXG4iLCBhbHQsCisJCQlpbnRmLT5hbHRzZXR0aW5nW2FsdF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCBlcnIpOworCQlnb3RvIGVycl9vdXRfY2xlYXI7CisJfQorCisJaWZhY2VfZGVzYyA9ICZpbnRmLT5hbHRzZXR0aW5nW2FsdF07CiAJaWYgKGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50cyAhPSBOVU1fRVAtMSkgewogCQlwcmludGsoS0VSTl9JTkZPICJOdW0gZW5kcG9pbnRzPSVkLiBJdCBpcyBub3QgRFM5NDkwUi5cbiIsIGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50cyk7CiAJCWVyciA9IC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL21hc3RlcnMvbXhjX3cxLmMgYi9kcml2ZXJzL3cxL21hc3RlcnMvbXhjX3cxLmMKaW5kZXggMWU1ZDk0Yy4uNjdiMDY3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9tYXN0ZXJzL214Y193MS5jCisrKyBiL2RyaXZlcnMvdzEvbWFzdGVycy9teGNfdzEuYwpAQCAtMTAsMjQgKzEwLDE2IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KLSAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlICIuLi93MS5oIgogI2luY2x1ZGUgIi4uL3cxX2ludC5oIgotI2luY2x1ZGUgIi4uL3cxX2xvZy5oIgogCiAvKiBBY2NvcmRpbmcgdG8gdGhlIG14MjcgRGF0YXNoZWV0IHRoZSByZXNldCBwcm9jZWR1cmUgc2hvdWxkIHRha2UgdXAgdG8gYWJvdXQKICAqIDEzNTB1cy4gV2Ugc2V0IHRoZSB0aW1lb3V0IHRvIDUwMCoxMDB1cyA9IDUwbXMgZm9yIHN1cmUgKi8KQEAgLTM2LDEzICsyOCwxMyBAQAogLyoKICAqIE1YQyBXMSBSZWdpc3RlciBvZmZzZXRzCiAgKi8KLSNkZWZpbmUgTVhDX1cxX0NPTlRST0wgICAgICAgICAgMHgwMAotI2RlZmluZSBNWENfVzFfVElNRV9ESVZJREVSICAgICAweDAyCi0jZGVmaW5lIE1YQ19XMV9SRVNFVCAgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgTVhDX1cxX0NPTU1BTkQgICAgICAgICAgMHgwNgotI2RlZmluZSBNWENfVzFfVFhSWCAgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIE1YQ19XMV9JTlRFUlJVUFQgICAgICAgIDB4MEEKLSNkZWZpbmUgTVhDX1cxX0lOVEVSUlVQVF9FTiAgICAgMHgwQworI2RlZmluZSBNWENfVzFfQ09OVFJPTAkJMHgwMAorIyBkZWZpbmUgTVhDX1cxX0NPTlRST0xfUkRTVAlCSVQoMykKKyMgZGVmaW5lIE1YQ19XMV9DT05UUk9MX1dSKHgpCUJJVCg1IC0gKHgpKQorIyBkZWZpbmUgTVhDX1cxX0NPTlRST0xfUFNUCUJJVCg2KQorIyBkZWZpbmUgTVhDX1cxX0NPTlRST0xfUlBQCUJJVCg3KQorI2RlZmluZSBNWENfVzFfVElNRV9ESVZJREVSCTB4MDIKKyNkZWZpbmUgTVhDX1cxX1JFU0VUCQkweDA0CiAKIHN0cnVjdCBteGNfdzFfZGV2aWNlIHsKIAl2b2lkIF9faW9tZW0gKnJlZ3M7CkBAIC02MSwxMiArNTMsMTIgQEAKIAl1bnNpZ25lZCBpbnQgdGltZW91dF9jbnQgPSAwOwogCXN0cnVjdCBteGNfdzFfZGV2aWNlICpkZXYgPSBkYXRhOwogCi0JX19yYXdfd3JpdGViKDB4ODAsIChkZXYtPnJlZ3MgKyBNWENfVzFfQ09OVFJPTCkpOworCXdyaXRlYihNWENfVzFfQ09OVFJPTF9SUFAsIChkZXYtPnJlZ3MgKyBNWENfVzFfQ09OVFJPTCkpOwogCiAJd2hpbGUgKDEpIHsKLQkJcmVnX3ZhbCA9IF9fcmF3X3JlYWRiKGRldi0+cmVncyArIE1YQ19XMV9DT05UUk9MKTsKKwkJcmVnX3ZhbCA9IHJlYWRiKGRldi0+cmVncyArIE1YQ19XMV9DT05UUk9MKTsKIAotCQlpZiAoKChyZWdfdmFsID4+IDcpICYgMHgxKSA9PSAwIHx8CisJCWlmICghKHJlZ192YWwgJiBNWENfVzFfQ09OVFJPTF9SUFApIHx8CiAJCSAgICB0aW1lb3V0X2NudCA+IE1YQ19XMV9SRVNFVF9USU1FT1VUKQogCQkJYnJlYWs7CiAJCWVsc2UKQEAgLTc0LDcgKzY2LDcgQEAKIAogCQl1ZGVsYXkoMTAwKTsKIAl9Ci0JcmV0dXJuIChyZWdfdmFsID4+IDcpICYgMHgxOworCXJldHVybiAhIShyZWdfdmFsICYgTVhDX1cxX0NPTlRST0xfUFNUKTsKIH0KIAogLyoKQEAgLTkwLDE2ICs4MiwxNiBAQAogCQkJCQkgKiBkYXRhc2hlZXQuCiAJCQkJCSAqLwogCi0JX19yYXdfd3JpdGViKCgxIDw8ICg1IC0gYml0KSksIGN0cmxfYWRkcik7CisJd3JpdGViKE1YQ19XMV9DT05UUk9MX1dSKGJpdCksIGN0cmxfYWRkcik7CiAKIAl3aGlsZSAodGltZW91dF9jbnQtLSkgewotCQlpZiAoISgoX19yYXdfcmVhZGIoY3RybF9hZGRyKSA+PiAoNSAtIGJpdCkpICYgMHgxKSkKKwkJaWYgKCEocmVhZGIoY3RybF9hZGRyKSAmIE1YQ19XMV9DT05UUk9MX1dSKGJpdCkpKQogCQkJYnJlYWs7CiAKIAkJdWRlbGF5KDEpOwogCX0KIAotCXJldHVybiAoKF9fcmF3X3JlYWRiKGN0cmxfYWRkcikpID4+IDMpICYgMHgxOworCXJldHVybiAhIShyZWFkYihjdHJsX2FkZHIpICYgTVhDX1cxX0NPTlRST0xfUkRTVCk7CiB9CiAKIHN0YXRpYyBpbnQgbXhjX3cxX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0xMzksNyArMTMxLDcgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JX19yYXdfd3JpdGViKGNsa2RpdiAtIDEsIG1kZXYtPnJlZ3MgKyBNWENfVzFfVElNRV9ESVZJREVSKTsKKwl3cml0ZWIoY2xrZGl2IC0gMSwgbWRldi0+cmVncyArIE1YQ19XMV9USU1FX0RJVklERVIpOwogCiAJbWRldi0+YnVzX21hc3Rlci5kYXRhID0gbWRldjsKIAltZGV2LT5idXNfbWFzdGVyLnJlc2V0X2J1cyA9IG14Y193MV9kczJfcmVzZXRfYnVzOwpAQCAtMTc3LDYgKzE2OSw3IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBteGNfdzFfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gIm14Y193MSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBteGNfdzFfZHRfaWRzLAogCX0sCiAJLnByb2JlID0gbXhjX3cxX3Byb2JlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9tYXN0ZXJzL3cxLWdwaW8uYyBiL2RyaXZlcnMvdzEvbWFzdGVycy93MS1ncGlvLmMKaW5kZXggOTcwOWI4Yi4uMWQxMTFlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9tYXN0ZXJzL3cxLWdwaW8uYworKysgYi9kcml2ZXJzL3cxL21hc3RlcnMvdzEtZ3Bpby5jCkBAIC04OSwxMSArODksMjIgQEAKIAkJcGRhdGEtPmlzX29wZW5fZHJhaW4gPSAxOwogCiAJZ3BpbyA9IG9mX2dldF9ncGlvKG5wLCAwKTsKLQlpZiAoZ3BpbyA8IDApCisJaWYgKGdwaW8gPCAwKSB7CisJCWlmIChncGlvICE9IC1FUFJPQkVfREVGRVIpCisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJCSJGYWlsZWQgdG8gcGFyc2UgZ3BpbyBwcm9wZXJ0eSBmb3IgZGF0YSBwaW4gKCVkKVxuIiwKKwkJCQkJZ3Bpbyk7CisKIAkJcmV0dXJuIGdwaW87CisJfQogCXBkYXRhLT5waW4gPSBncGlvOwogCi0JcGRhdGEtPmV4dF9wdWxsdXBfZW5hYmxlX3BpbiA9IG9mX2dldF9ncGlvKG5wLCAxKTsKKwlncGlvID0gb2ZfZ2V0X2dwaW8obnAsIDEpOworCWlmIChncGlvID09IC1FUFJPQkVfREVGRVIpCisJCXJldHVybiBncGlvOworCS8qIGlnbm9yZSBvdGhlciBlcnJvcnMgYXMgdGhlIHB1bGx1cCBncGlvIGlzIG9wdGlvbmFsICovCisJcGRhdGEtPmV4dF9wdWxsdXBfZW5hYmxlX3BpbiA9IGdwaW87CisKIAlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOwogCiAJcmV0dXJuIDA7CkBAIC0xMDcsMTAgKzExOCw4IEBACiAKIAlpZiAob2ZfaGF2ZV9wb3B1bGF0ZWRfZHQoKSkgewogCQllcnIgPSB3MV9ncGlvX3Byb2JlX2R0KHBkZXYpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHBhcnNlIERUXG4iKTsKKwkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwotCQl9CiAJfQogCiAJcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9zbGF2ZXMvS2NvbmZpZyBiL2RyaXZlcnMvdzEvc2xhdmVzL0tjb25maWcKaW5kZXggNWU2YTNjOS4uMWNkY2U4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9zbGF2ZXMvS2NvbmZpZworKysgYi9kcml2ZXJzL3cxL3NsYXZlcy9LY29uZmlnCkBAIC03Miw3ICs3Miw2IEBACiAKIGNvbmZpZyBXMV9TTEFWRV9EUzI3NjAKIAl0cmlzdGF0ZSAiRGFsbGFzIDI3NjAgYmF0dGVyeSBtb25pdG9yIGNoaXAgKEhQIGlQQVEgJiBvdGhlcnMpIgotCWRlcGVuZHMgb24gVzEKIAloZWxwCiAJICBJZiB5b3UgZW5hYmxlIHRoaXMgeW91IHdpbGwgaGF2ZSB0aGUgRFMyNzYwIGJhdHRlcnkgbW9uaXRvcgogCSAgY2hpcCBzdXBwb3J0LgpAQCAtODUsNyArODQsNiBAQAogCiBjb25maWcgVzFfU0xBVkVfRFMyNzgwCiAJdHJpc3RhdGUgIkRhbGxhcyAyNzgwIGJhdHRlcnkgbW9uaXRvciBjaGlwIgotCWRlcGVuZHMgb24gVzEKIAloZWxwCiAJICBJZiB5b3UgZW5hYmxlIHRoaXMgeW91IHdpbGwgaGF2ZSB0aGUgRFMyNzgwIGJhdHRlcnkgbW9uaXRvcgogCSAgY2hpcCBzdXBwb3J0LgpAQCAtOTgsNyArOTYsNiBAQAogCiBjb25maWcgVzFfU0xBVkVfRFMyNzgxCiAJdHJpc3RhdGUgIkRhbGxhcyAyNzgxIGJhdHRlcnkgbW9uaXRvciBjaGlwIgotCWRlcGVuZHMgb24gVzEKIAloZWxwCiAJICBJZiB5b3UgZW5hYmxlIHRoaXMgeW91IHdpbGwgaGF2ZSB0aGUgRFMyNzgxIGJhdHRlcnkgbW9uaXRvcgogCSAgY2hpcCBzdXBwb3J0LgpAQCAtMTExLDcgKzEwOCw2IEBACiAKIGNvbmZpZyBXMV9TTEFWRV9EUzI4RTA0CiAJdHJpc3RhdGUgIjQwOTYtQml0IEFkZHJlc3NhYmxlIDEtV2lyZSBFRVBST00gd2l0aCBQSU8gKERTMjhFMDQtMTAwKSIKLQlkZXBlbmRzIG9uIFcxCiAJc2VsZWN0IENSQzE2CiAJaGVscAogCSAgSWYgeW91IGVuYWJsZSB0aGlzIHlvdSB3aWxsIGhhdmUgdGhlIERTMjhFMDQtMTAwCkBAIC0xMjQsNyArMTIwLDYgQEAKIAogY29uZmlnIFcxX1NMQVZFX0JRMjcwMDAKIAl0cmlzdGF0ZSAiQlEyNzAwMCBzbGF2ZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gVzEKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIGhkcQogCSAgYnEyNzAwMCBzbGF2ZSBzdXBwb3J0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9zbGF2ZXMvdzFfdGhlcm0uYyBiL2RyaXZlcnMvdzEvc2xhdmVzL3cxX3RoZXJtLmMKaW5kZXggOGI1ZmYzMy4uMWYxMWEyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9zbGF2ZXMvdzFfdGhlcm0uYworKysgYi9kcml2ZXJzL3cxL3NsYXZlcy93MV90aGVybS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSAiLi4vdzEuaCIKQEAgLTU4LDYgKzU5LDE5IEBACiBzdGF0aWMgaW50IHcxX3N0cm9uZ19wdWxsdXAgPSAxOwogbW9kdWxlX3BhcmFtX25hbWVkKHN0cm9uZ19wdWxsdXAsIHcxX3N0cm9uZ19wdWxsdXAsIGludCwgMCk7CiAKK3N0YXRpYyBpbnQgdzFfdGhlcm1fYWRkX3NsYXZlKHN0cnVjdCB3MV9zbGF2ZSAqc2wpCit7CisJc2wtPmZhbWlseV9kYXRhID0ga3phbGxvYyg5LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNsLT5mYW1pbHlfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHcxX3RoZXJtX3JlbW92ZV9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsKQoreworCWtmcmVlKHNsLT5mYW1pbHlfZGF0YSk7CisJc2wtPmZhbWlseV9kYXRhID0gTlVMTDsKK30KIAogc3RhdGljIHNzaXplX3QgdzFfc2xhdmVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CkBAIC03MSw2ICs4NSw4IEBACiBBVFRSSUJVVEVfR1JPVVBTKHcxX3RoZXJtKTsKIAogc3RhdGljIHN0cnVjdCB3MV9mYW1pbHlfb3BzIHcxX3RoZXJtX2ZvcHMgPSB7CisJLmFkZF9zbGF2ZQk9IHcxX3RoZXJtX2FkZF9zbGF2ZSwKKwkucmVtb3ZlX3NsYXZlCT0gdzFfdGhlcm1fcmVtb3ZlX3NsYXZlLAogCS5ncm91cHMJCT0gdzFfdGhlcm1fZ3JvdXBzLAogfTsKIApAQCAtMjUzLDEyICsyNjksMTMgQEAKIAljIC09IHNucHJpbnRmKGJ1ZiArIFBBR0VfU0laRSAtIGMsIGMsICI6IGNyYz0lMDJ4ICVzXG4iLAogCQkJICAgY3JjLCAodmVyZGljdCkgPyAiWUVTIiA6ICJOTyIpOwogCWlmICh2ZXJkaWN0KQotCQltZW1jcHkoc2wtPnJvbSwgcm9tLCBzaXplb2Yoc2wtPnJvbSkpOworCQltZW1jcHkoc2wtPmZhbWlseV9kYXRhLCByb20sIHNpemVvZihyb20pKTsKIAllbHNlCiAJCWRldl93YXJuKGRldmljZSwgIlJlYWQgZmFpbGVkIENSQyBjaGVja1xuIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgOTsgKytpKQotCQljIC09IHNucHJpbnRmKGJ1ZiArIFBBR0VfU0laRSAtIGMsIGMsICIlMDJ4ICIsIHNsLT5yb21baV0pOworCQljIC09IHNucHJpbnRmKGJ1ZiArIFBBR0VfU0laRSAtIGMsIGMsICIlMDJ4ICIsCisJCQkgICAgICAoKHU4ICopc2wtPmZhbWlseV9kYXRhKVtpXSk7CiAKIAljIC09IHNucHJpbnRmKGJ1ZiArIFBBR0VfU0laRSAtIGMsIGMsICJ0PSVkXG4iLAogCQl3MV9jb252ZXJ0X3RlbXAocm9tLCBzbC0+ZmFtaWx5LT5maWQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzEuYyBiL2RyaXZlcnMvdzEvdzEuYwppbmRleCA2NmVmYTk2Li5iOTZmNjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxLmMKKysrIGIvZHJpdmVycy93MS93MS5jCkBAIC00NiwxOCArNDYsMjkgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciAxLXdpcmUgRGFsbGFzIG5ldHdvcmsgcHJvdG9jb2wuIik7CiAKIHN0YXRpYyBpbnQgdzFfdGltZW91dCA9IDEwOwotaW50IHcxX21heF9zbGF2ZV9jb3VudCA9IDEwOworaW50IHcxX21heF9zbGF2ZV9jb3VudCA9IDY0OwogaW50IHcxX21heF9zbGF2ZV90dGwgPSAxMDsKIAogbW9kdWxlX3BhcmFtX25hbWVkKHRpbWVvdXQsIHcxX3RpbWVvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsICJ0aW1lIGluIHNlY29uZHMgYmV0d2VlbiBhdXRvbWF0aWMgc2xhdmUgc2VhcmNoZXMiKTsKKy8qIEEgc2VhcmNoIHN0b3BzIHdoZW4gdzFfbWF4X3NsYXZlX2NvdW50IGRldmljZXMgaGF2ZSBiZWVuIGZvdW5kIGluIHRoYXQKKyAqIHNlYXJjaC4gIFRoZSBuZXh0IHNlYXJjaCB3aWxsIHN0YXJ0IG92ZXIgYW5kIGRldGVjdCB0aGUgc2FtZSBzZXQgb2YgZGV2aWNlcworICogb24gYSBzdGF0aWMgMS13aXJlIGJ1cy4gIE1lbW9yeSBpcyBub3QgYWxsb2NhdGVkIGJhc2VkIG9uIHRoaXMgbnVtYmVyLCBqdXN0CisgKiBvbiB0aGUgbnVtYmVyIG9mIGRldmljZXMga25vd24gdG8gdGhlIGtlcm5lbC4gIEhhdmluZyBhIGhpZ2ggbnVtYmVyIGRvZXMgbm90CisgKiBjb25zdW1lIGFkZGl0aW9uYWwgcmVzb3VyY2VzLiAgQXMgYSBzcGVjaWFsIGNhc2UsIGlmIHRoZXJlIGlzIG9ubHkgb25lCisgKiBkZXZpY2Ugb24gdGhlIG5ldHdvcmsgYW5kIHcxX21heF9zbGF2ZV9jb3VudCBpcyBzZXQgdG8gMSwgdGhlIGRldmljZSBpZCBjYW4KKyAqIGJlIHJlYWQgZGlyZWN0bHkgc2tpcHBpbmcgdGhlIG5vcm1hbCBzbG93ZXIgc2VhcmNoIHByb2Nlc3MuCisgKi8KIG1vZHVsZV9wYXJhbV9uYW1lZChtYXhfc2xhdmVfY291bnQsIHcxX21heF9zbGF2ZV9jb3VudCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X3NsYXZlX2NvdW50LAorCSJtYXhpbXVtIG51bWJlciBvZiBzbGF2ZXMgZGV0ZWN0ZWQgaW4gYSBzZWFyY2giKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChzbGF2ZV90dGwsIHcxX21heF9zbGF2ZV90dGwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNsYXZlX3R0bCwKKwkiTnVtYmVyIG9mIHNlYXJjaGVzIG5vdCBzZWVpbmcgYSBzbGF2ZSBiZWZvcmUgaXQgd2lsbCBiZSByZW1vdmVkIik7CiAKIERFRklORV9NVVRFWCh3MV9tbG9jayk7CiBMSVNUX0hFQUQodzFfbWFzdGVycyk7CiAKLXN0YXRpYyBpbnQgdzFfYXR0YWNoX3NsYXZlX2RldmljZShzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHN0cnVjdCB3MV9yZWdfbnVtICpybik7Ci0KIHN0YXRpYyBpbnQgdzFfbWFzdGVyX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKIHsKIAlyZXR1cm4gMTsKQEAgLTgxLDE5ICs5MiwxMCBAQAogewogCXN0cnVjdCB3MV9zbGF2ZSAqc2wgPSBkZXZfdG9fdzFfc2xhdmUoZGV2KTsKIAotCWRldl9kYmcoZGV2LCAiJXM6IFJlbGVhc2luZyAlcy5cbiIsIF9fZnVuY19fLCBzbC0+bmFtZSk7Ci0KLQl3aGlsZSAoYXRvbWljX3JlYWQoJnNsLT5yZWZjbnQpKSB7Ci0JCWRldl9kYmcoZGV2LCAiV2FpdGluZyBmb3IgJXMgdG8gYmVjb21lIGZyZWU6IHJlZmNudD0lZC5cbiIsCi0JCQkJc2wtPm5hbWUsIGF0b21pY19yZWFkKCZzbC0+cmVmY250KSk7Ci0JCWlmIChtc2xlZXBfaW50ZXJydXB0aWJsZSgxMDAwKSkKLQkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7Ci0JfQorCWRldl9kYmcoZGV2LCAiJXM6IFJlbGVhc2luZyAlcyBbJXBdXG4iLCBfX2Z1bmNfXywgc2wtPm5hbWUsIHNsKTsKIAogCXcxX2ZhbWlseV9wdXQoc2wtPmZhbWlseSk7CiAJc2wtPm1hc3Rlci0+c2xhdmVfY291bnQtLTsKLQotCWNvbXBsZXRlKCZzbC0+cmVsZWFzZWQpOwogfQogCiBzdGF0aWMgc3NpemVfdCBuYW1lX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQpAQCAtMjQzLDcgKzI0NSw5IEBACiAJbXV0ZXhfbG9jaygmbWQtPm11dGV4KTsKIAltZC0+c2VhcmNoX2NvdW50ID0gdG1wOwogCW11dGV4X3VubG9jaygmbWQtPm11dGV4KTsKLQl3YWtlX3VwX3Byb2Nlc3MobWQtPnRocmVhZCk7CisJLyogT25seSB3YWtlIGlmIGl0IGlzIGdvaW5nIHRvIGJlIHNlYXJjaGluZy4gKi8KKwlpZiAodG1wKQorCQl3YWtlX3VwX3Byb2Nlc3MobWQtPnRocmVhZCk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0yNzcsNyArMjgxLDYgQEAKIAltdXRleF9sb2NrKCZtZC0+bXV0ZXgpOwogCW1kLT5lbmFibGVfcHVsbHVwID0gdG1wOwogCW11dGV4X3VubG9jaygmbWQtPm11dGV4KTsKLQl3YWtlX3VwX3Byb2Nlc3MobWQtPnRocmVhZCk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0zMTQsNiArMzE3LDI0IEBACiAJcmV0dXJuIGNvdW50OwogfQogCitzdGF0aWMgc3NpemVfdCB3MV9tYXN0ZXJfYXR0cmlidXRlX3N0b3JlX21heF9zbGF2ZV9jb3VudChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCB0bXA7CisJc3RydWN0IHcxX21hc3RlciAqbWQgPSBkZXZfdG9fdzFfbWFzdGVyKGRldik7CisKKwlpZiAoa3N0cnRvaW50KGJ1ZiwgMCwgJnRtcCkgPT0gLUVJTlZBTCB8fCB0bXAgPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJm1kLT5tdXRleCk7CisJbWQtPm1heF9zbGF2ZV9jb3VudCA9IHRtcDsKKwkvKiBhbGxvdyBlYWNoIHRpbWUgdGhlIG1heF9zbGF2ZV9jb3VudCBpcyB1cGRhdGVkICovCisJY2xlYXJfYml0KFcxX1dBUk5fTUFYX0NPVU5ULCAmbWQtPmZsYWdzKTsKKwltdXRleF91bmxvY2soJm1kLT5tdXRleCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHcxX21hc3Rlcl9hdHRyaWJ1dGVfc2hvd19tYXhfc2xhdmVfY291bnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gZGV2X3RvX3cxX21hc3RlcihkZXYpOwpAQCAtMzUyLDIzICszNzMsMjAgQEAKIHsKIAlzdHJ1Y3QgdzFfbWFzdGVyICptZCA9IGRldl90b193MV9tYXN0ZXIoZGV2KTsKIAlpbnQgYyA9IFBBR0VfU0laRTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnQsICpuOworCXN0cnVjdCB3MV9zbGF2ZSAqc2wgPSBOVUxMOwogCi0JbXV0ZXhfbG9jaygmbWQtPm11dGV4KTsKKwltdXRleF9sb2NrKCZtZC0+bGlzdF9tdXRleCk7CiAKLQlpZiAobWQtPnNsYXZlX2NvdW50ID09IDApCi0JCWMgLT0gc25wcmludGYoYnVmICsgUEFHRV9TSVpFIC0gYywgYywgIm5vdCBmb3VuZC5cbiIpOwotCWVsc2UgewotCQlzdHJ1Y3QgbGlzdF9oZWFkICplbnQsICpuOwotCQlzdHJ1Y3QgdzFfc2xhdmUgKnNsOworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnQsIG4sICZtZC0+c2xpc3QpIHsKKwkJc2wgPSBsaXN0X2VudHJ5KGVudCwgc3RydWN0IHcxX3NsYXZlLCB3MV9zbGF2ZV9lbnRyeSk7CiAKLQkJbGlzdF9mb3JfZWFjaF9zYWZlKGVudCwgbiwgJm1kLT5zbGlzdCkgewotCQkJc2wgPSBsaXN0X2VudHJ5KGVudCwgc3RydWN0IHcxX3NsYXZlLCB3MV9zbGF2ZV9lbnRyeSk7Ci0KLQkJCWMgLT0gc25wcmludGYoYnVmICsgUEFHRV9TSVpFIC0gYywgYywgIiVzXG4iLCBzbC0+bmFtZSk7Ci0JCX0KKwkJYyAtPSBzbnByaW50ZihidWYgKyBQQUdFX1NJWkUgLSBjLCBjLCAiJXNcbiIsIHNsLT5uYW1lKTsKIAl9CisJaWYgKCFzbCkKKwkJYyAtPSBzbnByaW50ZihidWYgKyBQQUdFX1NJWkUgLSBjLCBjLCAibm90IGZvdW5kLlxuIik7CiAKLQltdXRleF91bmxvY2soJm1kLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZtZC0+bGlzdF9tdXRleCk7CiAKIAlyZXR1cm4gUEFHRV9TSVpFIC0gYzsKIH0KQEAgLTQyMiwxOSArNDQwLDIyIEBACiB9CiAKIC8qIFNlYXJjaGVzIHRoZSBzbGF2ZXMgaW4gdGhlIHcxX21hc3RlciBhbmQgcmV0dXJucyBhIHBvaW50ZXIgb3IgTlVMTC4KLSAqIE5vdGU6IG11c3QgaG9sZCB0aGUgbXV0ZXgKKyAqIE5vdGU6IG11c3Qgbm90IGhvbGQgbGlzdF9tdXRleAogICovCi1zdGF0aWMgc3RydWN0IHcxX3NsYXZlICp3MV9zbGF2ZV9zZWFyY2hfZGV2aWNlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwKK3N0cnVjdCB3MV9zbGF2ZSAqdzFfc2xhdmVfc2VhcmNoX2RldmljZShzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsCiAJc3RydWN0IHcxX3JlZ19udW0gKnJuKQogewogCXN0cnVjdCB3MV9zbGF2ZSAqc2w7CisJbXV0ZXhfbG9jaygmZGV2LT5saXN0X211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNsLCAmZGV2LT5zbGlzdCwgdzFfc2xhdmVfZW50cnkpIHsKIAkJaWYgKHNsLT5yZWdfbnVtLmZhbWlseSA9PSBybi0+ZmFtaWx5ICYmCiAJCQkJc2wtPnJlZ19udW0uaWQgPT0gcm4tPmlkICYmCiAJCQkJc2wtPnJlZ19udW0uY3JjID09IHJuLT5jcmMpIHsKKwkJCW11dGV4X3VubG9jaygmZGV2LT5saXN0X211dGV4KTsKIAkJCXJldHVybiBzbDsKIAkJfQogCX0KKwltdXRleF91bmxvY2soJmRldi0+bGlzdF9tdXRleCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTQ5MSw3ICs1MTIsMTAgQEAKIAltdXRleF9sb2NrKCZtZC0+bXV0ZXgpOwogCXNsID0gdzFfc2xhdmVfc2VhcmNoX2RldmljZShtZCwgJnJuKTsKIAlpZiAoc2wpIHsKLQkJdzFfc2xhdmVfZGV0YWNoKHNsKTsKKwkJcmVzdWx0ID0gdzFfc2xhdmVfZGV0YWNoKHNsKTsKKwkJLyogcmVmY250IDAgbWVhbnMgaXQgd2FzIGRldGFjaGVkIGluIHRoZSBjYWxsICovCisJCWlmIChyZXN1bHQgPT0gMCkKKwkJCXJlc3VsdCA9IGNvdW50OwogCX0gZWxzZSB7CiAJCWRldl9pbmZvKGRldiwgIkRldmljZSAlMDJ4LSUwMTJsbHggZG9lc24ndCBleGlzdHNcbiIsIHJuLmZhbWlseSwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcm4uaWQpOwpAQCAtNTE2LDcgKzU0MCw3IEBACiBzdGF0aWMgVzFfTUFTVEVSX0FUVFJfUk8obmFtZSwgU19JUlVHTyk7CiBzdGF0aWMgVzFfTUFTVEVSX0FUVFJfUk8oc2xhdmVzLCBTX0lSVUdPKTsKIHN0YXRpYyBXMV9NQVNURVJfQVRUUl9STyhzbGF2ZV9jb3VudCwgU19JUlVHTyk7Ci1zdGF0aWMgVzFfTUFTVEVSX0FUVFJfUk8obWF4X3NsYXZlX2NvdW50LCBTX0lSVUdPKTsKK3N0YXRpYyBXMV9NQVNURVJfQVRUUl9SVyhtYXhfc2xhdmVfY291bnQsIFNfSVJVR08gfCBTX0lXVVNSIHwgU19JV0dSUCk7CiBzdGF0aWMgVzFfTUFTVEVSX0FUVFJfUk8oYXR0ZW1wdHMsIFNfSVJVR08pOwogc3RhdGljIFcxX01BU1RFUl9BVFRSX1JPKHRpbWVvdXQsIFNfSVJVR08pOwogc3RhdGljIFcxX01BU1RFUl9BVFRSX1JPKHBvaW50ZXIsIFNfSVJVR08pOwpAQCAtNjg2LDEyICs3MTAsMTQgQEAKIAlkZXZfc2V0X3VldmVudF9zdXBwcmVzcygmc2wtPmRldiwgZmFsc2UpOwogCWtvYmplY3RfdWV2ZW50KCZzbC0+ZGV2LmtvYmosIEtPQkpfQUREKTsKIAorCW11dGV4X2xvY2soJnNsLT5tYXN0ZXItPmxpc3RfbXV0ZXgpOwogCWxpc3RfYWRkX3RhaWwoJnNsLT53MV9zbGF2ZV9lbnRyeSwgJnNsLT5tYXN0ZXItPnNsaXN0KTsKKwltdXRleF91bmxvY2soJnNsLT5tYXN0ZXItPmxpc3RfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdzFfYXR0YWNoX3NsYXZlX2RldmljZShzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHN0cnVjdCB3MV9yZWdfbnVtICpybikKK2ludCB3MV9hdHRhY2hfc2xhdmVfZGV2aWNlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgc3RydWN0IHcxX3JlZ19udW0gKnJuKQogewogCXN0cnVjdCB3MV9zbGF2ZSAqc2w7CiAJc3RydWN0IHcxX2ZhbWlseSAqZjsKQEAgLTcxMyw4ICs3MzksOCBAQAogCiAJbWVtc2V0KCZtc2csIDAsIHNpemVvZihtc2cpKTsKIAltZW1jcHkoJnNsLT5yZWdfbnVtLCBybiwgc2l6ZW9mKHNsLT5yZWdfbnVtKSk7Ci0JYXRvbWljX3NldCgmc2wtPnJlZmNudCwgMCk7Ci0JaW5pdF9jb21wbGV0aW9uKCZzbC0+cmVsZWFzZWQpOworCWF0b21pY19zZXQoJnNsLT5yZWZjbnQsIDEpOworCWF0b21pY19pbmMoJnNsLT5tYXN0ZXItPnJlZmNudCk7CiAKIAkvKiBzbGF2ZSBtb2R1bGVzIG5lZWQgdG8gYmUgbG9hZGVkIGluIGEgY29udGV4dCB3aXRoIHVubG9ja2VkIG11dGV4ICovCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKQEAgLTc1NCwyMyArNzgwLDQ4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgdzFfc2xhdmVfZGV0YWNoKHN0cnVjdCB3MV9zbGF2ZSAqc2wpCitpbnQgdzFfdW5yZWZfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCkKIHsKLQlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgbXNnOworCXN0cnVjdCB3MV9tYXN0ZXIgKmRldiA9IHNsLT5tYXN0ZXI7CisJaW50IHJlZmNudDsKKwltdXRleF9sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOworCXJlZmNudCA9IGF0b21pY19zdWJfcmV0dXJuKDEsICZzbC0+cmVmY250KTsKKwlpZiAocmVmY250ID09IDApIHsKKwkJc3RydWN0IHcxX25ldGxpbmtfbXNnIG1zZzsKIAotCWRldl9kYmcoJnNsLT5kZXYsICIlczogZGV0YWNoaW5nICVzIFslcF0uXG4iLCBfX2Z1bmNfXywgc2wtPm5hbWUsIHNsKTsKKwkJZGV2X2RiZygmc2wtPmRldiwgIiVzOiBkZXRhY2hpbmcgJXMgWyVwXS5cbiIsIF9fZnVuY19fLAorCQkJc2wtPm5hbWUsIHNsKTsKIAotCWxpc3RfZGVsKCZzbC0+dzFfc2xhdmVfZW50cnkpOworCQlsaXN0X2RlbCgmc2wtPncxX3NsYXZlX2VudHJ5KTsKIAotCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7Ci0JbWVtY3B5KG1zZy5pZC5pZCwgJnNsLT5yZWdfbnVtLCBzaXplb2YobXNnLmlkKSk7Ci0JbXNnLnR5cGUgPSBXMV9TTEFWRV9SRU1PVkU7Ci0JdzFfbmV0bGlua19zZW5kKHNsLT5tYXN0ZXIsICZtc2cpOworCQltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworCQltZW1jcHkobXNnLmlkLmlkLCAmc2wtPnJlZ19udW0sIHNpemVvZihtc2cuaWQpKTsKKwkJbXNnLnR5cGUgPSBXMV9TTEFWRV9SRU1PVkU7CisJCXcxX25ldGxpbmtfc2VuZChzbC0+bWFzdGVyLCAmbXNnKTsKIAotCWRldmljZV91bnJlZ2lzdGVyKCZzbC0+ZGV2KTsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJnNsLT5kZXYpOworCQkjaWZkZWYgREVCVUcKKwkJbWVtc2V0KHNsLCAwLCBzaXplb2YoKnNsKSk7CisJCSNlbmRpZgorCQlrZnJlZShzbCk7CisJfQorCWF0b21pY19kZWMoJmRldi0+cmVmY250KTsKKwltdXRleF91bmxvY2soJmRldi0+bGlzdF9tdXRleCk7CisJcmV0dXJuIHJlZmNudDsKK30KIAotCXdhaXRfZm9yX2NvbXBsZXRpb24oJnNsLT5yZWxlYXNlZCk7Ci0Ja2ZyZWUoc2wpOworaW50IHcxX3NsYXZlX2RldGFjaChzdHJ1Y3QgdzFfc2xhdmUgKnNsKQoreworCS8qIE9ubHkgZGV0YWNoIGEgc2xhdmUgb25jZSBhcyBpdCBkZWNyZWFzZXMgdGhlIHJlZmNudCBlYWNoIHRpbWUuICovCisJaW50IGRlc3Ryb3lfbm93OworCW11dGV4X2xvY2soJnNsLT5tYXN0ZXItPmxpc3RfbXV0ZXgpOworCWRlc3Ryb3lfbm93ID0gIXRlc3RfYml0KFcxX1NMQVZFX0RFVEFDSCwgJnNsLT5mbGFncyk7CisJc2V0X2JpdChXMV9TTEFWRV9ERVRBQ0gsICZzbC0+ZmxhZ3MpOworCW11dGV4X3VubG9jaygmc2wtPm1hc3Rlci0+bGlzdF9tdXRleCk7CisKKwlpZiAoZGVzdHJveV9ub3cpCisJCWRlc3Ryb3lfbm93ID0gIXcxX3VucmVmX3NsYXZlKHNsKTsKKwlyZXR1cm4gZGVzdHJveV9ub3cgPyAwIDogLUVCVVNZOwogfQogCiBzdHJ1Y3QgdzFfbWFzdGVyICp3MV9zZWFyY2hfbWFzdGVyX2lkKHUzMiBpZCkKQEAgLTc5OSw3ICs4NTAsNyBAQAogCiAJbXV0ZXhfbG9jaygmdzFfbWxvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmdzFfbWFzdGVycywgdzFfbWFzdGVyX2VudHJ5KSB7Ci0JCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworCQltdXRleF9sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNsLCAmZGV2LT5zbGlzdCwgdzFfc2xhdmVfZW50cnkpIHsKIAkJCWlmIChzbC0+cmVnX251bS5mYW1pbHkgPT0gaWQtPmZhbWlseSAmJgogCQkJCQlzbC0+cmVnX251bS5pZCA9PSBpZC0+aWQgJiYKQEAgLTgxMCw3ICs4NjEsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJCW11dGV4X3VubG9jaygmZGV2LT5saXN0X211dGV4KTsKIAogCQlpZiAoZm91bmQpCiAJCQlicmVhazsKQEAgLTgzMCw2ICs4ODEsNyBAQAogCQlkZXZfZGJnKCZkZXYtPmRldiwgIlJlY29ubmVjdGluZyBzbGF2ZXMgaW4gZGV2aWNlICVzICIKIAkJCSJmb3IgZmFtaWx5ICUwMnguXG4iLCBkZXYtPm5hbWUsIGYtPmZpZCk7CiAJCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworCQltdXRleF9sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2wsIHNsbiwgJmRldi0+c2xpc3QsIHcxX3NsYXZlX2VudHJ5KSB7CiAJCQkvKiBJZiBpdCBpcyBhIG5ldyBmYW1pbHksIHNsYXZlcyB3aXRoIHRoZSBkZWZhdWx0CiAJCQkgKiBmYW1pbHkgZHJpdmVyIGFuZCBhcmUgdGhhdCBmYW1pbHkgd2lsbCBiZQpAQCAtODQxLDE0ICs4OTMsMTkgQEAKIAkJCQkoIWF0dGFjaCAmJiBzbC0+ZmFtaWx5LT5maWQgPT0gZi0+ZmlkKSkgewogCQkJCXN0cnVjdCB3MV9yZWdfbnVtIHJuOwogCisJCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOwogCQkJCW1lbWNweSgmcm4sICZzbC0+cmVnX251bSwgc2l6ZW9mKHJuKSk7Ci0JCQkJdzFfc2xhdmVfZGV0YWNoKHNsKTsKLQotCQkJCXcxX2F0dGFjaF9zbGF2ZV9kZXZpY2UoZGV2LCAmcm4pOworCQkJCS8qIElmIGl0IHdhcyBhbHJlYWR5IGluIHVzZSBsZXQgdGhlIGF1dG9tYXRpYworCQkJCSAqIHNjYW4gcGljayBpdCB1cCBhZ2FpbiBsYXRlci4KKwkJCQkgKi8KKwkJCQlpZiAoIXcxX3NsYXZlX2RldGFjaChzbCkpCisJCQkJCXcxX2F0dGFjaF9zbGF2ZV9kZXZpY2UoZGV2LCAmcm4pOworCQkJCW11dGV4X2xvY2soJmRldi0+bGlzdF9tdXRleCk7CiAJCQl9CiAJCX0KIAkJZGV2X2RiZygmZGV2LT5kZXYsICJSZWNvbm5lY3Rpbmcgc2xhdmVzIGluIGRldmljZSAlcyAiCiAJCQkiaGFzIGJlZW4gZmluaXNoZWQuXG4iLCBkZXYtPm5hbWUpOworCQltdXRleF91bmxvY2soJmRldi0+bGlzdF9tdXRleCk7CiAJCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CiAJfQogCW11dGV4X3VubG9jaygmdzFfbWxvY2spOwpAQCAtODc2LDcgKzkzMywxMiBAQAogfQogCiAvKioKLSAqIFBlcmZvcm1zIGEgUk9NIFNlYXJjaCAmIHJlZ2lzdGVycyBhbnkgZGV2aWNlcyBmb3VuZC4KKyAqIHcxX3NlYXJjaCgpIC0gUGVyZm9ybXMgYSBST00gU2VhcmNoICYgcmVnaXN0ZXJzIGFueSBkZXZpY2VzIGZvdW5kLgorICogQGRldjogVGhlIG1hc3RlciBkZXZpY2UgdG8gc2VhcmNoCisgKiBAc2VhcmNoX3R5cGU6IFcxX1NFQVJDSCB0byBzZWFyY2ggYWxsIGRldmljZXMsIG9yIFcxX0FMQVJNX1NFQVJDSAorICogdG8gcmV0dXJuIG9ubHkgZGV2aWNlcyBpbiB0aGUgYWxhcm1lZCBzdGF0ZQorICogQGNiOiBGdW5jdGlvbiB0byBjYWxsIHdoZW4gYSBkZXZpY2UgaXMgZm91bmQKKyAqCiAgKiBUaGUgMS13aXJlIHNlYXJjaCBpcyBhIHNpbXBsZSBiaW5hcnkgdHJlZSBzZWFyY2guCiAgKiBGb3IgZWFjaCBiaXQgb2YgdGhlIGFkZHJlc3MsIHdlIHJlYWQgdHdvIGJpdHMgYW5kIHdyaXRlIG9uZSBiaXQuCiAgKiBUaGUgYml0IHdyaXR0ZW4gd2lsbCBwdXQgdG8gc2xlZXAgYWxsIGRldmllcyB0aGF0IGRvbid0IG1hdGNoIHRoYXQgYml0LgpAQCAtODg2LDggKzk0OCw2IEBACiAgKgogICogU2VlICJBcHBsaWNhdGlvbiBub3RlIDE4NyAxLXdpcmUgc2VhcmNoIGFsZ29yaXRobSIgYXQgd3d3Lm1heGltLWljLmNvbQogICoKLSAqIEBkZXYgICAgICAgIFRoZSBtYXN0ZXIgZGV2aWNlIHRvIHNlYXJjaAotICogQGNiICAgICAgICAgRnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgZGV2aWNlIGlzIGZvdW5kCiAgKi8KIHZvaWQgdzFfc2VhcmNoKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgdTggc2VhcmNoX3R5cGUsIHcxX3NsYXZlX2ZvdW5kX2NhbGxiYWNrIGNiKQogewpAQCAtODk4LDcgKzk1OCw4IEBACiAJdTggIHRyaXBsZXRfcmV0ID0gMDsKIAogCXNlYXJjaF9iaXQgPSAwOwotCXJuID0gbGFzdF9ybiA9IDA7CisJcm4gPSBkZXYtPnNlYXJjaF9pZDsKKwlsYXN0X3JuID0gMDsKIAlsYXN0X2RldmljZSA9IDA7CiAJbGFzdF96ZXJvID0gLTE7CiAKQEAgLTk0NSw3ICsxMDA2LDcgQEAKIAkJCWVsc2UKIAkJCQlzZWFyY2hfYml0ID0gKChsYXN0X3JuID4+IGkpICYgMHgxKTsKIAotCQkJLyoqIFJlYWQgdHdvIGJpdHMgYW5kIHdyaXRlIG9uZSBiaXQgKi8KKwkJCS8qIFJlYWQgdHdvIGJpdHMgYW5kIHdyaXRlIG9uZSBiaXQgKi8KIAkJCXRyaXBsZXRfcmV0ID0gdzFfdHJpcGxldChkZXYsIHNlYXJjaF9iaXQpOwogCiAJCQkvKiBxdWl0IGlmIG5vIGRldmljZSByZXNwb25kZWQgKi8KQEAgLTk2MCw4ICsxMDIxLDcgQEAKIAkJCXRtcDY0ID0gKHRyaXBsZXRfcmV0ID4+IDIpOwogCQkJcm4gfD0gKHRtcDY0IDw8IGkpOwogCi0JCQkvKiBlbnN1cmUgd2UncmUgY2FsbGVkIGZyb20ga3RocmVhZCBhbmQgbm90IGJ5IG5ldGxpbmsgY2FsbGJhY2sgKi8KLQkJCWlmICghZGV2LT5wcml2ICYmIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQkJaWYgKHRlc3RfYml0KFcxX0FCT1JUX1NFQVJDSCwgJmRldi0+ZmxhZ3MpKSB7CiAJCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmJ1c19tdXRleCk7CiAJCQkJZGV2X2RiZygmZGV2LT5kZXYsICJBYm9ydCB3MV9zZWFyY2hcbiIpOwogCQkJCXJldHVybjsKQEAgLTk3MCwxMSArMTAzMCwzMCBAQAogCQltdXRleF91bmxvY2soJmRldi0+YnVzX211dGV4KTsKIAogCQlpZiAoICh0cmlwbGV0X3JldCAmIDB4MDMpICE9IDB4MDMgKSB7Ci0JCQlpZiAoIChkZXNjX2JpdCA9PSBsYXN0X3plcm8pIHx8IChsYXN0X3plcm8gPCAwKSkKKwkJCWlmICgoZGVzY19iaXQgPT0gbGFzdF96ZXJvKSB8fCAobGFzdF96ZXJvIDwgMCkpIHsKIAkJCQlsYXN0X2RldmljZSA9IDE7CisJCQkJZGV2LT5zZWFyY2hfaWQgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlkZXYtPnNlYXJjaF9pZCA9IHJuOworCQkJfQogCQkJZGVzY19iaXQgPSBsYXN0X3plcm87CiAJCQljYihkZXYsIHJuKTsKIAkJfQorCisJCWlmICghbGFzdF9kZXZpY2UgJiYgc2xhdmVfY291bnQgPT0gZGV2LT5tYXhfc2xhdmVfY291bnQgJiYKKwkJCSF0ZXN0X2JpdChXMV9XQVJOX01BWF9DT1VOVCwgJmRldi0+ZmxhZ3MpKSB7CisJCQkvKiBPbmx5IG1heF9zbGF2ZV9jb3VudCB3aWxsIGJlIHNjYW5uZWQgaW4gYSBzZWFyY2gsCisJCQkgKiBidXQgaXQgd2lsbCBzdGFydCB3aGVyZSBpdCBsZWZ0IG9mZiBuZXh0IHNlYXJjaAorCQkJICogdW50aWwgYWxsIGlkcyBhcmUgaWRlbnRpZmllZCBhbmQgdGhlbiBpdCB3aWxsIHN0YXJ0CisJCQkgKiBvdmVyLiAgQSBjb250aW51ZWQgc2VhcmNoIHdpbGwgcmVwb3J0IHRoZSBwcmV2aW91cworCQkJICogbGFzdCBpZCBhcyB0aGUgZmlyc3QgaWQgKHByb3ZpZGVkIGl0IGlzIHN0aWxsIG9uIHRoZQorCQkJICogYnVzKS4KKwkJCSAqLworCQkJZGV2X2luZm8oJmRldi0+ZGV2LCAiJXM6IG1heF9zbGF2ZV9jb3VudCAlZCByZWFjaGVkLCAiCisJCQkJIndpbGwgY29udGludWUgbmV4dCBzZWFyY2guXG4iLCBfX2Z1bmNfXywKKwkJCQlkZXYtPm1heF9zbGF2ZV9jb3VudCk7CisJCQlzZXRfYml0KFcxX1dBUk5fTUFYX0NPVU5ULCAmZGV2LT5mbGFncyk7CisJCX0KIAl9CiB9CiAKQEAgLTk4MywxNyArMTA2MiwyNCBAQAogewogCXN0cnVjdCB3MV9zbGF2ZSAqc2wsICpzbG47CiAKKwltdXRleF9sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoc2wsICZkZXYtPnNsaXN0LCB3MV9zbGF2ZV9lbnRyeSkKIAkJY2xlYXJfYml0KFcxX1NMQVZFX0FDVElWRSwgJnNsLT5mbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOwogCiAJdzFfc2VhcmNoX2RldmljZXMoZGV2LCBzZWFyY2hfdHlwZSwgY2IpOwogCisJbXV0ZXhfbG9jaygmZGV2LT5saXN0X211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2wsIHNsbiwgJmRldi0+c2xpc3QsIHcxX3NsYXZlX2VudHJ5KSB7Ci0JCWlmICghdGVzdF9iaXQoVzFfU0xBVkVfQUNUSVZFLCAmc2wtPmZsYWdzKSAmJiAhLS1zbC0+dHRsKQorCQlpZiAoIXRlc3RfYml0KFcxX1NMQVZFX0FDVElWRSwgJnNsLT5mbGFncykgJiYgIS0tc2wtPnR0bCkgeworCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOwogCQkJdzFfc2xhdmVfZGV0YWNoKHNsKTsKKwkJCW11dGV4X2xvY2soJmRldi0+bGlzdF9tdXRleCk7CisJCX0KIAkJZWxzZSBpZiAodGVzdF9iaXQoVzFfU0xBVkVfQUNUSVZFLCAmc2wtPmZsYWdzKSkKIAkJCXNsLT50dGwgPSBkZXYtPnNsYXZlX3R0bDsKIAl9CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOwogCiAJaWYgKGRldi0+c2VhcmNoX2NvdW50ID4gMCkKIAkJZGV2LT5zZWFyY2hfY291bnQtLTsKQEAgLTEwMDQsNiArMTA5MCwzMiBAQAogCXcxX3NlYXJjaF9wcm9jZXNzX2NiKGRldiwgc2VhcmNoX3R5cGUsIHcxX3NsYXZlX2ZvdW5kKTsKIH0KIAorLyoqCisgKiB3MV9wcm9jZXNzX2NhbGxiYWNrcygpIC0gZXhlY3V0ZSBlYWNoIGRldi0+YXN5bmNfbGlzdCBjYWxsYmFjayBlbnRyeQorICogQGRldjogdzFfbWFzdGVyIGRldmljZQorICoKKyAqIFJldHVybjogMSBpZiB0aGVyZSB3ZXJlIGNvbW1hbmRzIHRvIGV4ZWN1dGVkIDAgb3RoZXJ3aXNlCisgKi8KK2ludCB3MV9wcm9jZXNzX2NhbGxiYWNrcyhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHcxX2FzeW5jX2NtZCAqYXN5bmNfY21kLCAqYXN5bmNfbjsKKworCS8qIFRoZSBsaXN0IGNhbiBiZSBhZGRlZCB0byBpbiBhbm90aGVyIHRocmVhZCwgbG9vcCB1bnRpbCBpdCBpcyBlbXB0eSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmZGV2LT5hc3luY19saXN0KSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYXN5bmNfY21kLCBhc3luY19uLCAmZGV2LT5hc3luY19saXN0LAorCQkJYXN5bmNfZW50cnkpIHsKKwkJCS8qIGRyb3AgdGhlIGxvY2ssIGlmIGl0IGlzIGEgc2VhcmNoIGl0IGNhbiB0YWtlIGEgbG9uZworCQkJICogdGltZSAqLworCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOworCQkJYXN5bmNfY21kLT5jYihkZXYsIGFzeW5jX2NtZCk7CisJCQlyZXQgPSAxOworCQkJbXV0ZXhfbG9jaygmZGV2LT5saXN0X211dGV4KTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCiBpbnQgdzFfcHJvY2Vzcyh2b2lkICpkYXRhKQogewogCXN0cnVjdCB3MV9tYXN0ZXIgKmRldiA9IChzdHJ1Y3QgdzFfbWFzdGVyICopIGRhdGE7CkBAIC0xMDExLDIzICsxMTIzLDQ2IEBACiAJICogdGltZSBjYW4gYmUgY2FsY3VsYXRlZCBpbiBqaWZmaWVzIG9uY2UuCiAJICovCiAJY29uc3QgdW5zaWduZWQgbG9uZyBqdGltZSA9IG1zZWNzX3RvX2ppZmZpZXModzFfdGltZW91dCAqIDEwMDApOworCS8qIHJlbWFpbmRlciBpZiBpdCB3b2tlIHVwIGVhcmx5ICovCisJdW5zaWduZWQgbG9uZyBqcmVtYWluID0gMDsKIAotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCWlmIChkZXYtPnNlYXJjaF9jb3VudCkgeworCWZvciAoOzspIHsKKworCQlpZiAoIWpyZW1haW4gJiYgZGV2LT5zZWFyY2hfY291bnQpIHsKIAkJCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOwogCQkJdzFfc2VhcmNoX3Byb2Nlc3MoZGV2LCBXMV9TRUFSQ0gpOwogCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKIAkJfQogCisJCW11dGV4X2xvY2soJmRldi0+bGlzdF9tdXRleCk7CisJCS8qIE5vdGUsIHcxX3Byb2Nlc3NfY2FsbGJhY2sgZHJvcHMgdGhlIGxvY2sgd2hpbGUgcHJvY2Vzc2luZywKKwkJICogYnV0IGxvY2tzIGl0IGFnYWluIGJlZm9yZSByZXR1cm5pbmcuCisJCSAqLworCQlpZiAoIXcxX3Byb2Nlc3NfY2FsbGJhY2tzKGRldikgJiYganJlbWFpbikgeworCQkJLyogYSB3YWtlIHVwIGlzIGVpdGhlciB0byBzdG9wIHRoZSB0aHJlYWQsIHByb2Nlc3MKKwkJCSAqIGNhbGxiYWNrcywgb3Igc2VhcmNoLCBpdCBpc24ndCBwcm9jZXNzIGNhbGxiYWNrcywgc28KKwkJCSAqIHNjaGVkdWxlIGEgc2VhcmNoLgorCQkJICovCisJCQlqcmVtYWluID0gMTsKKwkJfQorCiAJCXRyeV90b19mcmVlemUoKTsKIAkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCisJCS8qIGhvbGQgbGlzdF9tdXRleCB1bnRpbCBhZnRlciBpbnRlcnJ1cHRpYmxlIHRvIHByZXZlbnQgbG9vc2luZworCQkgKiB0aGUgd2FrZXVwIHNpZ25hbCB3aGVuIGFzeW5jX2NtZCBpcyBhZGRlZC4KKwkJICovCisJCW11dGV4X3VubG9jaygmZGV2LT5saXN0X211dGV4KTsKKwogCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQogCQkJYnJlYWs7CiAKIAkJLyogT25seSBzbGVlcCB3aGVuIHRoZSBzZWFyY2ggaXMgYWN0aXZlLiAqLwotCQlpZiAoZGV2LT5zZWFyY2hfY291bnQpCi0JCQlzY2hlZHVsZV90aW1lb3V0KGp0aW1lKTsKKwkJaWYgKGRldi0+c2VhcmNoX2NvdW50KSB7CisJCQlpZiAoIWpyZW1haW4pCisJCQkJanJlbWFpbiA9IGp0aW1lOworCQkJanJlbWFpbiA9IHNjaGVkdWxlX3RpbWVvdXQoanJlbWFpbik7CisJCX0KIAkJZWxzZQogCQkJc2NoZWR1bGUoKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxLmggYi9kcml2ZXJzL3cxL3cxLmgKaW5kZXggY2E4MDgxYS4uNzM0ZGFiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MS5oCisrKyBiL2RyaXZlcnMvdzEvdzEuaApAQCAtMjIsNiArMjIsMTMgQEAKICNpZm5kZWYgX19XMV9ICiAjZGVmaW5lIF9fVzFfSAogCisvKioKKyAqIHN0cnVjdCB3MV9yZWdfbnVtIC0gYnJva2VuIG91dCBzbGF2ZSBkZXZpY2UgaWQKKyAqCisgKiBAZmFtaWx5OiBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGRldmljZQorICogQGlkOiBhbG9uZyB3aXRoIGZhbWlseSBpcyB0aGUgdW5pcXVlIGRldmljZSBpZAorICogQGNyYzogY2hlY2tzdW0gb2YgdGhlIG90aGVyIGJ5dGVzCisgKi8KIHN0cnVjdCB3MV9yZWdfbnVtCiB7CiAjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCkBAIC01OCw3ICs2NSwyNCBAQAogI2RlZmluZSBXMV9SRVNVTUVfQ01ECQkweEE1CiAKICNkZWZpbmUgVzFfU0xBVkVfQUNUSVZFCQkwCisjZGVmaW5lIFcxX1NMQVZFX0RFVEFDSAkJMQogCisvKioKKyAqIHN0cnVjdCB3MV9zbGF2ZSAtIGhvbGRzIGEgc2luZ2xlIHNsYXZlIGRldmljZSBvbiB0aGUgYnVzCisgKgorICogQG93bmVyOiBQb2ludHMgdG8gdGhlIG9uZSB3aXJlICJ3aXJlIiBrZXJuZWwgbW9kdWxlLgorICogQG5hbWU6IERldmljZSBpZCBpcyBhc2NpaS4KKyAqIEB3MV9zbGF2ZV9lbnRyeTogZGF0YSBmb3IgdGhlIGxpbmtlZCBsaXN0CisgKiBAcmVnX251bTogdGhlIHNsYXZlIGlkIGluIGJpbmFyeQorICogQHJlZmNudDogcmVmZXJlbmNlIGNvdW50LCBkZWxldGUgd2hlbiAwCisgKiBAZmxhZ3M6IGJpdCBmbGFncyBmb3IgVzFfU0xBVkVfQUNUSVZFIFcxX1NMQVZFX0RFVEFDSAorICogQHR0bDogZGVjcmVtZW50IHBlciBzZWFyY2ggdGhpcyBzbGF2ZSBpc24ndCBmb3VuZCwgZGVhdGNoIGF0IDAKKyAqIEBtYXN0ZXI6IGJ1cyB3aGljaCB0aGlzIHNsYXZlIGlzIG9uCisgKiBAZmFtaWx5OiBtb2R1bGUgZm9yIGRldmljZSBmYW1pbHkgdHlwZQorICogQGZhbWlseV9kYXRhOiBwb2ludGVyIGZvciB1c2UgYnkgdGhlIGZhbWlseSBtb2R1bGUKKyAqIEBkZXY6IGtlcm5lbCBkZXZpY2UgaWRlbnRpZmllcgorICoKKyAqLwogc3RydWN0IHcxX3NsYXZlCiB7CiAJc3RydWN0IG1vZHVsZQkJKm93bmVyOwpAQCAtNjYsNyArOTAsNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQJdzFfc2xhdmVfZW50cnk7CiAJc3RydWN0IHcxX3JlZ19udW0JcmVnX251bTsKIAlhdG9taWNfdAkJcmVmY250OwotCXU4CQkJcm9tWzldOwogCWludAkJCXR0bDsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIApAQCAtNzQsOTkgKzk3LDE0NiBAQAogCXN0cnVjdCB3MV9mYW1pbHkJKmZhbWlseTsKIAl2b2lkCQkJKmZhbWlseV9kYXRhOwogCXN0cnVjdCBkZXZpY2UJCWRldjsKLQlzdHJ1Y3QgY29tcGxldGlvbglyZWxlYXNlZDsKIH07CiAKIHR5cGVkZWYgdm9pZCAoKncxX3NsYXZlX2ZvdW5kX2NhbGxiYWNrKShzdHJ1Y3QgdzFfbWFzdGVyICosIHU2NCk7CiAKIAogLyoqCisgKiBzdHJ1Y3QgdzFfYnVzX21hc3RlciAtIG9wZXJhdGlvbnMgYXZhaWxhYmxlIG9uIGEgYnVzIG1hc3RlcgorICoKKyAqIEBkYXRhOiB0aGUgZmlyc3QgcGFyYW1ldGVyIGluIGFsbCB0aGUgZnVuY3Rpb25zIGJlbG93CisgKgorICogQHJlYWRfYml0OiBTYW1wbGUgdGhlIGxpbmUgbGV2ZWwgQHJldHVybiB0aGUgbGV2ZWwgcmVhZCAoMCBvciAxKQorICoKKyAqIEB3cml0ZV9iaXQ6IFNldHMgdGhlIGxpbmUgbGV2ZWwKKyAqCisgKiBAdG91Y2hfYml0OiB0aGUgbG93ZXN0LWxldmVsIGZ1bmN0aW9uIGZvciBkZXZpY2VzIHRoYXQgcmVhbGx5IHN1cHBvcnQgdGhlCisgKiAxLXdpcmUgcHJvdG9jb2wuCisgKiB0b3VjaF9iaXQoMCkgPSB3cml0ZS0wIGN5Y2xlCisgKiB0b3VjaF9iaXQoMSkgPSB3cml0ZS0xIC8gcmVhZCBjeWNsZQorICogQHJldHVybiB0aGUgYml0IHJlYWQgKDAgb3IgMSkKKyAqCisgKiBAcmVhZF9ieXRlOiBSZWFkcyBhIGJ5dGVzLiBTYW1lIGFzIDggdG91Y2hfYml0KDEpIGNhbGxzLgorICogQHJldHVybiB0aGUgYnl0ZSByZWFkCisgKgorICogQHdyaXRlX2J5dGU6IFdyaXRlcyBhIGJ5dGUuIFNhbWUgYXMgOCB0b3VjaF9iaXQoeCkgY2FsbHMuCisgKgorICogQHJlYWRfYmxvY2s6IFNhbWUgYXMgYSBzZXJpZXMgb2YgcmVhZF9ieXRlKCkgY2FsbHMKKyAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkCisgKgorICogQHdyaXRlX2Jsb2NrOiBTYW1lIGFzIGEgc2VyaWVzIG9mIHdyaXRlX2J5dGUoKSBjYWxscworICoKKyAqIEB0cmlwbGV0OiBDb21iaW5lcyB0d28gcmVhZHMgYW5kIGEgc21hcnQgd3JpdGUgZm9yIFJPTSBzZWFyY2hlcworICogQHJldHVybiBiaXQwPUlkIGJpdDE9Y29tcF9pZCBiaXQyPWRpcl90YWtlbgorICoKKyAqIEByZXNldF9idXM6IGxvbmcgd3JpdGUtMCB3aXRoIGEgcmVhZCBmb3IgdGhlIHByZXNlbmNlIHB1bHNlIGRldGVjdGlvbgorICogQHJldHVybiAtMT1FcnJvciwgMD1EZXZpY2UgcHJlc2VudCwgMT1ObyBkZXZpY2UgcHJlc2VudAorICoKKyAqIEBzZXRfcHVsbHVwOiBQdXQgb3V0IGEgc3Ryb25nIHB1bGwtdXAgcHVsc2Ugb2YgdGhlIHNwZWNpZmllZCBkdXJhdGlvbi4KKyAqIEByZXR1cm4gLTE9RXJyb3IsIDA9Y29tcGxldGVkCisgKgorICogQHNlYXJjaDogUmVhbGx5IG5pY2UgaGFyZHdhcmUgY2FuIGhhbmRsZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBST00gc2VhcmNoCisgKiB3MV9tYXN0ZXIqIGlzIHBhc3NlZCB0byB0aGUgc2xhdmUgZm91bmQgY2FsbGJhY2suCisgKiB1OCBpcyBzZWFyY2hfdHlwZSwgVzFfU0VBUkNIIG9yIFcxX0FMQVJNX1NFQVJDSAorICoKICAqIE5vdGU6IHJlYWRfYml0IGFuZCB3cml0ZV9iaXQgYXJlIHZlcnkgbG93IGxldmVsIGZ1bmN0aW9ucyBhbmQgc2hvdWxkIG9ubHkKICAqIGJlIHVzZWQgd2l0aCBoYXJkd2FyZSB0aGF0IGRvZXNuJ3QgcmVhbGx5IHN1cHBvcnQgMS13aXJlIG9wZXJhdGlvbnMsCiAgKiBsaWtlIGEgcGFyYWxsZWwvc2VyaWFsIHBvcnQuCiAgKiBFaXRoZXIgZGVmaW5lIHJlYWRfYml0IGFuZCB3cml0ZV9iaXQgT1IgZGVmaW5lLCBhdCBtaW5pbXVtLCB0b3VjaF9iaXQgYW5kCiAgKiByZXNldF9idXMuCisgKgogICovCiBzdHJ1Y3QgdzFfYnVzX21hc3RlcgogewotCS8qKiB0aGUgZmlyc3QgcGFyYW1ldGVyIGluIGFsbCB0aGUgZnVuY3Rpb25zIGJlbG93ICovCiAJdm9pZAkJKmRhdGE7CiAKLQkvKioKLQkgKiBTYW1wbGUgdGhlIGxpbmUgbGV2ZWwKLQkgKiBAcmV0dXJuIHRoZSBsZXZlbCByZWFkICgwIG9yIDEpCi0JICovCiAJdTgJCSgqcmVhZF9iaXQpKHZvaWQgKik7CiAKLQkvKiogU2V0cyB0aGUgbGluZSBsZXZlbCAqLwogCXZvaWQJCSgqd3JpdGVfYml0KSh2b2lkICosIHU4KTsKIAotCS8qKgotCSAqIHRvdWNoX2JpdCBpcyB0aGUgbG93ZXN0LWxldmVsIGZ1bmN0aW9uIGZvciBkZXZpY2VzIHRoYXQgcmVhbGx5Ci0JICogc3VwcG9ydCB0aGUgMS13aXJlIHByb3RvY29sLgotCSAqIHRvdWNoX2JpdCgwKSA9IHdyaXRlLTAgY3ljbGUKLQkgKiB0b3VjaF9iaXQoMSkgPSB3cml0ZS0xIC8gcmVhZCBjeWNsZQotCSAqIEByZXR1cm4gdGhlIGJpdCByZWFkICgwIG9yIDEpCi0JICovCiAJdTgJCSgqdG91Y2hfYml0KSh2b2lkICosIHU4KTsKIAotCS8qKgotCSAqIFJlYWRzIGEgYnl0ZXMuIFNhbWUgYXMgOCB0b3VjaF9iaXQoMSkgY2FsbHMuCi0JICogQHJldHVybiB0aGUgYnl0ZSByZWFkCi0JICovCiAJdTgJCSgqcmVhZF9ieXRlKSh2b2lkICopOwogCi0JLyoqCi0JICogV3JpdGVzIGEgYnl0ZS4gU2FtZSBhcyA4IHRvdWNoX2JpdCh4KSBjYWxscy4KLQkgKi8KIAl2b2lkCQkoKndyaXRlX2J5dGUpKHZvaWQgKiwgdTgpOwogCi0JLyoqCi0JICogU2FtZSBhcyBhIHNlcmllcyBvZiByZWFkX2J5dGUoKSBjYWxscwotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkCi0JICovCiAJdTgJCSgqcmVhZF9ibG9jaykodm9pZCAqLCB1OCAqLCBpbnQpOwogCi0JLyoqIFNhbWUgYXMgYSBzZXJpZXMgb2Ygd3JpdGVfYnl0ZSgpIGNhbGxzICovCiAJdm9pZAkJKCp3cml0ZV9ibG9jaykodm9pZCAqLCBjb25zdCB1OCAqLCBpbnQpOwogCi0JLyoqCi0JICogQ29tYmluZXMgdHdvIHJlYWRzIGFuZCBhIHNtYXJ0IHdyaXRlIGZvciBST00gc2VhcmNoZXMKLQkgKiBAcmV0dXJuIGJpdDA9SWQgYml0MT1jb21wX2lkIGJpdDI9ZGlyX3Rha2VuCi0JICovCiAJdTgJCSgqdHJpcGxldCkodm9pZCAqLCB1OCk7CiAKLQkvKioKLQkgKiBsb25nIHdyaXRlLTAgd2l0aCBhIHJlYWQgZm9yIHRoZSBwcmVzZW5jZSBwdWxzZSBkZXRlY3Rpb24KLQkgKiBAcmV0dXJuIC0xPUVycm9yLCAwPURldmljZSBwcmVzZW50LCAxPU5vIGRldmljZSBwcmVzZW50Ci0JICovCiAJdTgJCSgqcmVzZXRfYnVzKSh2b2lkICopOwogCi0JLyoqCi0JICogUHV0IG91dCBhIHN0cm9uZyBwdWxsLXVwIHB1bHNlIG9mIHRoZSBzcGVjaWZpZWQgZHVyYXRpb24uCi0JICogQHJldHVybiAtMT1FcnJvciwgMD1jb21wbGV0ZWQKLQkgKi8KIAl1OAkJKCpzZXRfcHVsbHVwKSh2b2lkICosIGludCk7CiAKLQkvKiogUmVhbGx5IG5pY2UgaGFyZHdhcmUgY2FuIGhhbmRsZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBST00gc2VhcmNoCi0JICogIHcxX21hc3RlciogaXMgcGFzc2VkIHRvIHRoZSBzbGF2ZSBmb3VuZCBjYWxsYmFjay4KLQkgKi8KIAl2b2lkCQkoKnNlYXJjaCkodm9pZCAqLCBzdHJ1Y3QgdzFfbWFzdGVyICosCiAJCXU4LCB3MV9zbGF2ZV9mb3VuZF9jYWxsYmFjayk7CiB9OwogCisvKioKKyAqIGVudW0gdzFfbWFzdGVyX2ZsYWdzIC0gYml0ZmllbGRzIHVzZWQgaW4gdzFfbWFzdGVyLmZsYWdzCisgKiBAVzFfQUJPUlRfU0VBUkNIOiBhYm9ydCBzZWFyY2hpbmcgZWFybHkgb24gc2h1dGRvd24KKyAqIEBXMV9XQVJOX01BWF9DT1VOVDogbGltaXQgd2FybmluZyB3aGVuIHRoZSBtYXhpbXVtIGNvdW50IGlzIHJlYWNoZWQKKyAqLworZW51bSB3MV9tYXN0ZXJfZmxhZ3MgeworCVcxX0FCT1JUX1NFQVJDSCA9IDAsCisJVzFfV0FSTl9NQVhfQ09VTlQgPSAxLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgdzFfbWFzdGVyIC0gb25lIHBlciBidXMgbWFzdGVyCisgKiBAdzFfbWFzdGVyX2VudHJ5OgltYXN0ZXIgbGlua2VkIGxpc3QKKyAqIEBvd25lcjoJCW1vZHVsZSBvd25lcgorICogQG5hbWU6CQlkeW5hbWljYWxseSBhbGxvY2F0ZSBidXMgbmFtZQorICogQGxpc3RfbXV0ZXg6CQlwcm90ZWN0IHNsaXN0IGFuZCBhc3luY19saXN0CisgKiBAc2xpc3Q6CQlsaW5rZWQgbGlzdCBvZiBzbGF2ZXMKKyAqIEBhc3luY19saXN0OgkJbGlua2VkIGxpc3Qgb2YgbmV0bGluayBjb21tYW5kcyB0byBleGVjdXRlCisgKiBAbWF4X3NsYXZlX2NvdW50OgltYXhpbXVtIG51bWJlciBvZiBzbGF2ZXMgdG8gc2VhcmNoIGZvciBhdCBhIHRpbWUKKyAqIEBzbGF2ZV9jb3VudDoJY3VycmVudCBudW1iZXIgb2Ygc2xhdmVzIGtub3duCisgKiBAYXR0ZW1wdHM6CQludW1iZXIgb2Ygc2VhcmNoZXMgcmFuCisgKiBAc2xhdmVfdHRsOgkJbnVtYmVyIG9mIHNlYXJjaGVzIGJlZm9yZSBhIHNsYXZlIGlzIHRpbWVkIG91dAorICogQGluaXRpYWxpemVkOglwcmV2ZW50IGluaXQvcmVtb3ZhbCByYWNlIGNvbmRpdGlvbnMKKyAqIEBpZDoJCQl3MSBidXMgbnVtYmVyCisgKiBAc2VhcmNoX2NvdW50OgludW1iZXIgb2YgYXV0b21hdGljIHNlYXJjaGVzIHRvIHJ1biwgLTEgdW5saW1pdGVkCisgKiBAc2VhcmNoX2lkOgkJYWxsb3dzIGNvbnRpbnVpbmcgYSBzZWFyY2gKKyAqIEByZWZjbnQ6CQlyZWZlcmVuY2UgY291bnQKKyAqIEBwcml2OgkJcHJpdmF0ZSBkYXRhIHN0b3JhZ2UKKyAqIEBwcml2X3NpemU6CQlzaXplIGFsbG9jYXRlZAorICogQGVuYWJsZV9wdWxsdXA6CWFsbG93cyBhIHN0cm9uZyBwdWxsdXAKKyAqIEBwdWxsdXBfZHVyYXRpb246CXRpbWUgZm9yIHRoZSBuZXh0IHN0cm9uZyBwdWxsdXAKKyAqIEBmbGFnczoJCW9uZSBvZiB3MV9tYXN0ZXJfZmxhZ3MKKyAqIEB0aHJlYWQ6CQl0aHJlYWQgZm9yIGJ1cyBzZWFyY2ggYW5kIG5ldGxpbmsgY29tbWFuZHMKKyAqIEBtdXRleDoJCXByb3RlY3QgbW9zdCBvZiB3MV9tYXN0ZXIKKyAqIEBidXNfbXV0ZXg6CQlwcmV0ZWN0IGNvbmN1cnJlbnQgYnVzIGFjY2VzcworICogQGRyaXZlcjoJCXN5c2ZzIGRyaXZlcgorICogQGRldjoJCXN5c2ZzIGRldmljZQorICogQGJ1c19tYXN0ZXI6CQlpbyBvcGVyYXRpb25zIGF2YWlsYWJsZQorICogQHNlcToJCXNlcXVlbmNlIG51bWJlciB1c2VkIGZvciBuZXRsaW5rIGJyb2FkY2FzdHMKKyAqIEBwb3J0aWQ6CQlkZXN0aW5hdGlvbiBmb3IgdGhlIGN1cnJlbnQgbmV0bGluayBjb21tYW5kCisgKi8KIHN0cnVjdCB3MV9tYXN0ZXIKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXcxX21hc3Rlcl9lbnRyeTsKIAlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CiAJdW5zaWduZWQgY2hhcgkJbmFtZVtXMV9NQVhOQU1FTEVOXTsKKwkvKiBsaXN0X211dGV4IHByb3RlY3RzIGp1c3Qgc2xpc3QgYW5kIGFzeW5jX2xpc3Qgc28gc2xhdmVzIGNhbiBiZQorCSAqIHNlYXJjaGVkIGZvciBhbmQgYXN5bmMgY29tbWFuZHMgYWRkZWQgd2hpbGUgdGhlIG1hc3RlciBoYXMKKwkgKiB3MV9tYXN0ZXIubXV0ZXggbG9ja2VkIGFuZCBpcyBvcGVyYXRpbmcgb24gdGhlIGJ1cy4KKwkgKiBsb2NrIG9yZGVyIHcxX21sb2NrLCB3MV9tYXN0ZXIubXV0ZXgsIHcxX21hc3Rlci5saXN0X211dGV4CisJICovCisJc3RydWN0IG11dGV4CQlsaXN0X211dGV4OwogCXN0cnVjdCBsaXN0X2hlYWQJc2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAlhc3luY19saXN0OwogCWludAkJCW1heF9zbGF2ZV9jb3VudCwgc2xhdmVfY291bnQ7CiAJdW5zaWduZWQgbG9uZwkJYXR0ZW1wdHM7CiAJaW50CQkJc2xhdmVfdHRsOwogCWludAkJCWluaXRpYWxpemVkOwogCXUzMgkJCWlkOwogCWludAkJCXNlYXJjaF9jb3VudDsKKwkvKiBpZCB0byBzdGFydCBzZWFyY2hpbmcgb24sIHRvIGNvbnRpbnVlIGEgc2VhcmNoIG9yIDAgdG8gcmVzdGFydCAqLworCXU2NAkJCXNlYXJjaF9pZDsKIAogCWF0b21pY190CQlyZWZjbnQ7CiAKQEAgLTE3OCw2ICsyNDgsOCBAQAogCS8qKiA1ViBzdHJvbmcgcHVsbHVwIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcywgemVybyBkaXNhYmxlZC4gKi8KIAlpbnQJCQlwdWxsdXBfZHVyYXRpb247CiAKKwlsb25nCQkJZmxhZ3M7CisKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRocmVhZDsKIAlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwogCXN0cnVjdCBtdXRleAkJYnVzX211dGV4OwpAQCAtMTg4LDE2ICsyNjAsNDEgQEAKIAlzdHJ1Y3QgdzFfYnVzX21hc3RlcgkqYnVzX21hc3RlcjsKIAogCXUzMgkJCXNlcTsKKwkvKiBwb3J0IGlkIHRvIHNlbmQgbmV0bGluayByZXNwb25zZXMgdG8uICBUaGUgdmFsdWUgaXMgdGVtcG9yYXJpbHkKKwkgKiBzdG9yZWQgaGVyZSB3aGlsZSBwcm9jZXNzaW5nIGEgbWVzc2FnZSwgc2V0IGFmdGVyIGxvY2tpbmcgdGhlCisJICogbXV0ZXgsIHplcm8gYmVmb3JlIHVubG9ja2luZyB0aGUgbXV0ZXguCisJICovCisJdTMyCQkJcG9ydGlkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdzFfYXN5bmNfY21kIC0gZXhlY3V0ZSBjYWxsYmFjayBmcm9tIHRoZSB3MV9wcm9jZXNzIGt0aHJlYWQKKyAqIEBhc3luY19lbnRyeTogbGluayBlbnRyeQorICogQGNiOiBjYWxsYmFjayBmdW5jdGlvbiwgbXVzdCBsaXN0X2RlbCBhbmQgZGVzdHJveSB0aGlzIGxpc3QgYmVmb3JlCisgKiByZXR1cm5pbmcKKyAqCisgKiBXaGVuIGluc2VydGVkIGludG8gdGhlIHcxX21hc3RlciBhc3luY19saXN0LCB3MV9wcm9jZXNzIHdpbGwgZXhlY3V0ZQorICogdGhlIGNhbGxiYWNrLiAgRW1iZWQgdGhpcyBpbnRvIHRoZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgY29tbWFuZCBkZXRhaWxzLgorICovCitzdHJ1Y3QgdzFfYXN5bmNfY21kIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWFzeW5jX2VudHJ5OworCXZvaWQgKCpjYikoc3RydWN0IHcxX21hc3RlciAqZGV2LCBzdHJ1Y3QgdzFfYXN5bmNfY21kICphc3luY19jbWQpOwogfTsKIAogaW50IHcxX2NyZWF0ZV9tYXN0ZXJfYXR0cmlidXRlcyhzdHJ1Y3QgdzFfbWFzdGVyICopOwogdm9pZCB3MV9kZXN0cm95X21hc3Rlcl9hdHRyaWJ1dGVzKHN0cnVjdCB3MV9tYXN0ZXIgKm1hc3Rlcik7CiB2b2lkIHcxX3NlYXJjaChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHU4IHNlYXJjaF90eXBlLCB3MV9zbGF2ZV9mb3VuZF9jYWxsYmFjayBjYik7CiB2b2lkIHcxX3NlYXJjaF9kZXZpY2VzKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgdTggc2VhcmNoX3R5cGUsIHcxX3NsYXZlX2ZvdW5kX2NhbGxiYWNrIGNiKTsKKy8qIGNhbGwgdzFfdW5yZWZfc2xhdmUgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50cyB3MV9zZWFyY2hfc2xhdmUgYWRkZWQgKi8KIHN0cnVjdCB3MV9zbGF2ZSAqdzFfc2VhcmNoX3NsYXZlKHN0cnVjdCB3MV9yZWdfbnVtICppZCk7CisvKiBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2Ugb24gc2wtPm1hc3RlciBhbmQgc2wsIGFuZCBjbGVhbnMgdXAgaWYgemVybworICogcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IGFmdGVyIGl0IGhhcyBiZWVuIGRlY3JlbWVudGVkICovCitpbnQgdzFfdW5yZWZfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCk7CiB2b2lkIHcxX3NsYXZlX2ZvdW5kKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgdTY0IHJuKTsKIHZvaWQgdzFfc2VhcmNoX3Byb2Nlc3NfY2Ioc3RydWN0IHcxX21hc3RlciAqZGV2LCB1OCBzZWFyY2hfdHlwZSwKIAl3MV9zbGF2ZV9mb3VuZF9jYWxsYmFjayBjYik7CitzdHJ1Y3QgdzFfc2xhdmUgKncxX3NsYXZlX3NlYXJjaF9kZXZpY2Uoc3RydWN0IHcxX21hc3RlciAqZGV2LAorCXN0cnVjdCB3MV9yZWdfbnVtICpybik7CiBzdHJ1Y3QgdzFfbWFzdGVyICp3MV9zZWFyY2hfbWFzdGVyX2lkKHUzMiBpZCk7CiAKIC8qIERpc2Nvbm5lY3QgYW5kIHJlY29ubmVjdCBkZXZpY2VzIGluIHRoZSBnaXZlbiBmYW1pbHkuICBVc2VkIGZvciBmaW5kaW5nCkBAIC0yMDYsNyArMzAzLDkgQEAKICAqIGhhcyBqdXN0IGJlZW4gcmVnaXN0ZXJlZCwgdG8gMCB3aGVuIGl0IGhhcyBiZWVuIHVucmVnaXN0ZXJlZC4KICAqLwogdm9pZCB3MV9yZWNvbm5lY3Rfc2xhdmVzKHN0cnVjdCB3MV9mYW1pbHkgKmYsIGludCBhdHRhY2gpOwotdm9pZCB3MV9zbGF2ZV9kZXRhY2goc3RydWN0IHcxX3NsYXZlICpzbCk7CitpbnQgdzFfYXR0YWNoX3NsYXZlX2RldmljZShzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHN0cnVjdCB3MV9yZWdfbnVtICpybik7CisvKiAwIHN1Y2Nlc3MsIG90aGVyd2lzZSBFQlVTWSAqLworaW50IHcxX3NsYXZlX2RldGFjaChzdHJ1Y3QgdzFfc2xhdmUgKnNsKTsKIAogdTggdzFfdHJpcGxldChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIGludCBiZGlyKTsKIHZvaWQgdzFfd3JpdGVfOChzdHJ1Y3QgdzFfbWFzdGVyICosIHU4KTsKQEAgLTI0Miw2ICszNDEsNyBAQAogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgdzFfbWFzdGVyczsKIGV4dGVybiBzdHJ1Y3QgbXV0ZXggdzFfbWxvY2s7CiAKK2V4dGVybiBpbnQgdzFfcHJvY2Vzc19jYWxsYmFja3Moc3RydWN0IHcxX21hc3RlciAqZGV2KTsKIGV4dGVybiBpbnQgdzFfcHJvY2Vzcyh2b2lkICopOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MV9mYW1pbHkuYyBiL2RyaXZlcnMvdzEvdzFfZmFtaWx5LmMKaW5kZXggZTkzMDk3NzguLjNiZmY2YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzFfZmFtaWx5LmMKKysrIGIvZHJpdmVycy93MS93MV9mYW1pbHkuYwpAQCAtMzEsNiArMzEsMTAgQEAKIERFRklORV9TUElOTE9DSyh3MV9mbG9jayk7CiBzdGF0aWMgTElTVF9IRUFEKHcxX2ZhbWlsaWVzKTsKIAorLyoqCisgKiB3MV9yZWdpc3Rlcl9mYW1pbHkoKSAtIHJlZ2lzdGVyIGEgZGV2aWNlIGZhbWlseSBkcml2ZXIKKyAqIEBuZXdmOglmYW1pbHkgdG8gcmVnaXN0ZXIKKyAqLwogaW50IHcxX3JlZ2lzdGVyX2ZhbWlseShzdHJ1Y3QgdzFfZmFtaWx5ICpuZXdmKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmVudCwgKm47CkBAIC01OSw2ICs2MywxMCBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qKgorICogdzFfdW5yZWdpc3Rlcl9mYW1pbHkoKSAtIHVucmVnaXN0ZXIgYSBkZXZpY2UgZmFtaWx5IGRyaXZlcgorICogQGZlbnQ6CWZhbWlseSB0byB1bnJlZ2lzdGVyCisgKi8KIHZvaWQgdzFfdW5yZWdpc3Rlcl9mYW1pbHkoc3RydWN0IHcxX2ZhbWlseSAqZmVudCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICplbnQsICpuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MV9mYW1pbHkuaCBiL2RyaXZlcnMvdzEvdzFfZmFtaWx5LmgKaW5kZXggNGFkMGU4MS4uMjZjYTEzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9mYW1pbHkuaAorKysgYi9kcml2ZXJzL3cxL3cxX2ZhbWlseS5oCkBAIC00OCw2ICs0OCwxMiBAQAogCiBzdHJ1Y3QgdzFfc2xhdmU7CiAKKy8qKgorICogc3RydWN0IHcxX2ZhbWlseV9vcHMgLSBvcGVyYXRpb25zIGZvciBhIGZhbWlseSB0eXBlCisgKiBAYWRkX3NsYXZlOiBhZGRfc2xhdmUKKyAqIEByZW1vdmVfc2xhdmU6IHJlbW92ZV9zbGF2ZQorICogQGdyb3Vwczogc3lzZnMgZ3JvdXAKKyAqLwogc3RydWN0IHcxX2ZhbWlseV9vcHMKIHsKIAlpbnQgICgqIGFkZF9zbGF2ZSkoc3RydWN0IHcxX3NsYXZlICopOwpAQCAtNTUsNiArNjEsMTMgQEAKIAljb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzOwogfTsKIAorLyoqCisgKiBzdHJ1Y3QgdzFfZmFtaWx5IC0gcmVmZXJlbmNlIGNvdW50ZWQgZmFtaWx5IHN0cnVjdHVyZS4KKyAqIEBmYW1pbHlfZW50cnk6CWZhbWlseSBsaW5rZWQgbGlzdAorICogQGZpZDoJCTggYml0IGZhbWlseSBpZGVudGlmaWVyCisgKiBAZm9wczoJCW9wZXJhdGlvbnMgZm9yIHRoaXMgZmFtaWx5CisgKiBAcmVmY250OgkJcmVmZXJlbmNlIGNvdW50ZXIKKyAqLwogc3RydWN0IHcxX2ZhbWlseQogewogCXN0cnVjdCBsaXN0X2hlYWQJZmFtaWx5X2VudHJ5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MV9pbnQuYyBiL2RyaXZlcnMvdzEvdzFfaW50LmMKaW5kZXggNTkwYmQ4YS4uOWIwODRkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9pbnQuYworKysgYi9kcml2ZXJzL3cxL3cxX2ludC5jCkBAIC03NSw4ICs3NSwxMCBAQAogCWF0b21pY19zZXQoJmRldi0+cmVmY250LCAyKTsKIAogCUlOSVRfTElTVF9IRUFEKCZkZXYtPnNsaXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5hc3luY19saXN0KTsKIAltdXRleF9pbml0KCZkZXYtPm11dGV4KTsKIAltdXRleF9pbml0KCZkZXYtPmJ1c19tdXRleCk7CisJbXV0ZXhfaW5pdCgmZGV2LT5saXN0X211dGV4KTsKIAogCW1lbWNweSgmZGV2LT5kZXYsIGRldmljZSwgc2l6ZW9mKHN0cnVjdCBkZXZpY2UpKTsKIAlkZXZfc2V0X25hbWUoJmRldi0+ZGV2LCAidzFfYnVzX21hc3RlciV1IiwgZGV2LT5pZCk7CkBAIC0xMDMsNiArMTA1LDEwIEBACiAJZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+ZGV2KTsKIH0KIAorLyoqCisgKiB3MV9hZGRfbWFzdGVyX2RldmljZSgpIC0gcmVnaXN0ZXJzIGEgbmV3IG1hc3RlciBkZXZpY2UKKyAqIEBtYXN0ZXI6CW1hc3RlciBidXMgZGV2aWNlIHRvIHJlZ2lzdGVyCisgKi8KIGludCB3MV9hZGRfbWFzdGVyX2RldmljZShzdHJ1Y3QgdzFfYnVzX21hc3RlciAqbWFzdGVyKQogewogCXN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgKmVudHJ5OwpAQCAtMTcyLDYgKzE3OCw3IEBACiAKICNpZiAwIC8qIFRocmVhZCBjbGVhbnVwIGNvZGUsIG5vdCByZXF1aXJlZCBjdXJyZW50bHkuICovCiBlcnJfb3V0X2tpbGxfdGhyZWFkOgorCXNldF9iaXQoVzFfQUJPUlRfU0VBUkNILCAmZGV2LT5mbGFncyk7CiAJa3RocmVhZF9zdG9wKGRldi0+dGhyZWFkKTsKICNlbmRpZgogZXJyX291dF9ybV9hdHRyOgpAQCAtMTg3LDE2ICsxOTQsMjIgQEAKIAlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgbXNnOwogCXN0cnVjdCB3MV9zbGF2ZSAqc2wsICpzbG47CiAKLQlrdGhyZWFkX3N0b3AoZGV2LT50aHJlYWQpOwotCiAJbXV0ZXhfbG9jaygmdzFfbWxvY2spOwogCWxpc3RfZGVsKCZkZXYtPncxX21hc3Rlcl9lbnRyeSk7CiAJbXV0ZXhfdW5sb2NrKCZ3MV9tbG9jayk7CiAKKwlzZXRfYml0KFcxX0FCT1JUX1NFQVJDSCwgJmRldi0+ZmxhZ3MpOworCWt0aHJlYWRfc3RvcChkZXYtPnRocmVhZCk7CisKIAltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2wsIHNsbiwgJmRldi0+c2xpc3QsIHcxX3NsYXZlX2VudHJ5KQorCW11dGV4X2xvY2soJmRldi0+bGlzdF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNsLCBzbG4sICZkZXYtPnNsaXN0LCB3MV9zbGF2ZV9lbnRyeSkgeworCQltdXRleF91bmxvY2soJmRldi0+bGlzdF9tdXRleCk7CiAJCXcxX3NsYXZlX2RldGFjaChzbCk7CisJCW11dGV4X2xvY2soJmRldi0+bGlzdF9tdXRleCk7CisJfQogCXcxX2Rlc3Ryb3lfbWFzdGVyX2F0dHJpYnV0ZXMoZGV2KTsKKwltdXRleF91bmxvY2soJmRldi0+bGlzdF9tdXRleCk7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKIAlhdG9taWNfZGVjKCZkZXYtPnJlZmNudCk7CiAKQEAgLTIwNiw3ICsyMTksOSBAQAogCiAJCWlmIChtc2xlZXBfaW50ZXJydXB0aWJsZSgxMDAwKSkKIAkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CisJCXcxX3Byb2Nlc3NfY2FsbGJhY2tzKGRldik7CiAJfQorCXcxX3Byb2Nlc3NfY2FsbGJhY2tzKGRldik7CiAKIAltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOwogCW1zZy5pZC5tc3QuaWQgPSBkZXYtPmlkOwpAQCAtMjE2LDYgKzIzMSwxMCBAQAogCXcxX2ZyZWVfZGV2KGRldik7CiB9CiAKKy8qKgorICogdzFfcmVtb3ZlX21hc3Rlcl9kZXZpY2UoKSAtIHVucmVnaXN0ZXIgYSBtYXN0ZXIgZGV2aWNlCisgKiBAYm06CW1hc3RlciBidXMgZGV2aWNlIHRvIHJlbW92ZQorICovCiB2b2lkIHcxX3JlbW92ZV9tYXN0ZXJfZGV2aWNlKHN0cnVjdCB3MV9idXNfbWFzdGVyICpibSkKIHsKIAlzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsICpmb3VuZCA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2lvLmMgYi9kcml2ZXJzL3cxL3cxX2lvLmMKaW5kZXggZTEwYWNjMi4uMjgyMDkyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9pby5jCisrKyBiL2RyaXZlcnMvdzEvdzFfaW8uYwpAQCAtNjIsNyArNjIsOSBAQAogc3RhdGljIHU4IHcxX3JlYWRfYml0KHN0cnVjdCB3MV9tYXN0ZXIgKmRldik7CiAKIC8qKgotICogR2VuZXJhdGVzIGEgd3JpdGUtMCBvciB3cml0ZS0xIGN5Y2xlIGFuZCBzYW1wbGVzIHRoZSBsZXZlbC4KKyAqIHcxX3RvdWNoX2JpdCgpIC0gR2VuZXJhdGVzIGEgd3JpdGUtMCBvciB3cml0ZS0xIGN5Y2xlIGFuZCBzYW1wbGVzIHRoZSBsZXZlbC4KKyAqIEBkZXY6CXRoZSBtYXN0ZXIgZGV2aWNlCisgKiBAYml0OgkwIC0gd3JpdGUgYSAwLCAxIC0gd3JpdGUgYSAwIHJlYWQgdGhlIGxldmVsCiAgKi8KIHN0YXRpYyB1OCB3MV90b3VjaF9iaXQoc3RydWN0IHcxX21hc3RlciAqZGV2LCBpbnQgYml0KQogewpAQCAtNzcsNyArNzksMTAgQEAKIH0KIAogLyoqCi0gKiBHZW5lcmF0ZXMgYSB3cml0ZS0wIG9yIHdyaXRlLTEgY3ljbGUuCisgKiB3MV93cml0ZV9iaXQoKSAtIEdlbmVyYXRlcyBhIHdyaXRlLTAgb3Igd3JpdGUtMSBjeWNsZS4KKyAqIEBkZXY6CXRoZSBtYXN0ZXIgZGV2aWNlCisgKiBAYml0OgliaXQgdG8gd3JpdGUKKyAqCiAgKiBPbmx5IGNhbGwgaWYgZGV2LT5idXNfbWFzdGVyLT50b3VjaF9iaXQgaXMgTlVMTAogICovCiBzdGF0aWMgdm9pZCB3MV93cml0ZV9iaXQoc3RydWN0IHcxX21hc3RlciAqZGV2LCBpbnQgYml0KQpAQCAtMTAyLDExICsxMDcsMTIgQEAKIH0KIAogLyoqCisgKiB3MV9wcmVfd3JpdGUoKSAtIHByZS13cml0ZSBvcGVyYXRpb25zCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQorICoKICAqIFByZS13cml0ZSBvcGVyYXRpb24sIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRpbmcgc3Ryb25nIHB1bGx1cHMuCiAgKiBQcm9ncmFtIHRoZSBoYXJkd2FyZSBmb3IgYSBzdHJvbmcgcHVsbHVwLCBpZiBvbmUgaGFzIGJlZW4gcmVxdWVzdGVkIGFuZAogICogdGhlIGhhcmR3YXJlIHN1cHBvcnRzIGl0LgotICoKLSAqIEBwYXJhbSBkZXYgICAgIHRoZSBtYXN0ZXIgZGV2aWNlCiAgKi8KIHN0YXRpYyB2b2lkIHcxX3ByZV93cml0ZShzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpCiB7CkBAIC0xMTgsMTEgKzEyNCwxMiBAQAogfQogCiAvKioKKyAqIHcxX3Bvc3Rfd3JpdGUoKSAtIHBvc3Qtd3JpdGUgb3B0aW9ucworICogQGRldjoJdGhlIG1hc3RlciBkZXZpY2UKKyAqCiAgKiBQb3N0LXdyaXRlIG9wZXJhdGlvbiwgY3VycmVudGx5IG9ubHkgc3VwcG9ydGluZyBzdHJvbmcgcHVsbHVwcy4KICAqIElmIGEgc3Ryb25nIHB1bGx1cCB3YXMgcmVxdWVzdGVkLCBjbGVhciBpdCBpZiB0aGUgaGFyZHdhcmUgc3VwcG9ydHMKICAqIHRoZW0sIG9yIGV4ZWN1dGUgdGhlIGRlbGF5IG90aGVyd2lzZSwgaW4gZWl0aGVyIGNhc2UgY2xlYXIgdGhlIHJlcXVlc3QuCi0gKgotICogQHBhcmFtIGRldiAgICAgdGhlIG1hc3RlciBkZXZpY2UKICAqLwogc3RhdGljIHZvaWQgdzFfcG9zdF93cml0ZShzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpCiB7CkBAIC0xMzYsMTAgKzE0Myw5IEBACiB9CiAKIC8qKgotICogV3JpdGVzIDggYml0cy4KLSAqCi0gKiBAcGFyYW0gZGV2ICAgICB0aGUgbWFzdGVyIGRldmljZQotICogQHBhcmFtIGJ5dGUgICAgdGhlIGJ5dGUgdG8gd3JpdGUKKyAqIHcxX3dyaXRlXzgoKSAtIFdyaXRlcyA4IGJpdHMuCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQorICogQGJ5dGU6CXRoZSBieXRlIHRvIHdyaXRlCiAgKi8KIHZvaWQgdzFfd3JpdGVfOChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHU4IGJ5dGUpCiB7CkBAIC0xNjEsNyArMTY3LDkgQEAKIAogCiAvKioKLSAqIEdlbmVyYXRlcyBhIHdyaXRlLTEgY3ljbGUgYW5kIHNhbXBsZXMgdGhlIGxldmVsLgorICogdzFfcmVhZF9iaXQoKSAtIEdlbmVyYXRlcyBhIHdyaXRlLTEgY3ljbGUgYW5kIHNhbXBsZXMgdGhlIGxldmVsLgorICogQGRldjoJdGhlIG1hc3RlciBkZXZpY2UKKyAqCiAgKiBPbmx5IGNhbGwgaWYgZGV2LT5idXNfbWFzdGVyLT50b3VjaF9iaXQgaXMgTlVMTAogICovCiBzdGF0aWMgdTggdzFfcmVhZF9iaXQoc3RydWN0IHcxX21hc3RlciAqZGV2KQpAQCAtMTg1LDE2ICsxOTMsMTcgQEAKIH0KIAogLyoqCi0gKiBEb2VzIGEgdHJpcGxldCAtIHVzZWQgZm9yIHNlYXJjaGluZyBST00gYWRkcmVzc2VzLgorICogdzFfdHJpcGxldCgpIC0gKiBEb2VzIGEgdHJpcGxldCAtIHVzZWQgZm9yIHNlYXJjaGluZyBST00gYWRkcmVzc2VzLgorICogQGRldjoJdGhlIG1hc3RlciBkZXZpY2UKKyAqIEBiZGlyOgl0aGUgYml0IHRvIHdyaXRlIGlmIGJvdGggaWRfYml0IGFuZCBjb21wX2JpdCBhcmUgMAorICoKICAqIFJldHVybiBiaXRzOgogICogIGJpdCAwID0gaWRfYml0CiAgKiAgYml0IDEgPSBjb21wX2JpdAogICogIGJpdCAyID0gZGlyX3Rha2VuCiAgKiBJZiBib3RoIGJpdHMgMCAmIDEgYXJlIHNldCwgdGhlIHNlYXJjaCBzaG91bGQgYmUgcmVzdGFydGVkLgogICoKLSAqIEBwYXJhbSBkZXYgICAgIHRoZSBtYXN0ZXIgZGV2aWNlCi0gKiBAcGFyYW0gYmRpciAgICB0aGUgYml0IHRvIHdyaXRlIGlmIGJvdGggaWRfYml0IGFuZCBjb21wX2JpdCBhcmUgMAotICogQHJldHVybiAgICAgICAgYml0IGZpZWxkcyAtIHNlZSBhYm92ZQorICogUmV0dXJuOiAgICAgICAgYml0IGZpZWxkcyAtIHNlZSBhYm92ZQogICovCiB1OCB3MV90cmlwbGV0KHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgaW50IGJkaXIpCiB7CkBAIC0yMjYsMTAgKzIzNSwxMCBAQAogfQogCiAvKioKLSAqIFJlYWRzIDggYml0cy4KKyAqIHcxX3JlYWRfOCgpIC0gUmVhZHMgOCBiaXRzLgorICogQGRldjoJdGhlIG1hc3RlciBkZXZpY2UKICAqCi0gKiBAcGFyYW0gZGV2ICAgICB0aGUgbWFzdGVyIGRldmljZQotICogQHJldHVybiAgICAgICAgdGhlIGJ5dGUgcmVhZAorICogUmV0dXJuOiAgICAgICAgdGhlIGJ5dGUgcmVhZAogICovCiB1OCB3MV9yZWFkXzgoc3RydWN0IHcxX21hc3RlciAqZGV2KQogewpAQCAtMjQ3LDExICsyNTYsMTAgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHcxX3JlYWRfOCk7CiAKIC8qKgotICogV3JpdGVzIGEgc2VyaWVzIG9mIGJ5dGVzLgotICoKLSAqIEBwYXJhbSBkZXYgICAgIHRoZSBtYXN0ZXIgZGV2aWNlCi0gKiBAcGFyYW0gYnVmICAgICBwb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlCi0gKiBAcGFyYW0gbGVuICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgKiB3MV93cml0ZV9ibG9jaygpIC0gV3JpdGVzIGEgc2VyaWVzIG9mIGJ5dGVzLgorICogQGRldjoJdGhlIG1hc3RlciBkZXZpY2UKKyAqIEBidWY6CXBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKKyAqIEBsZW46CXRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKICAqLwogdm9pZCB3MV93cml0ZV9ibG9jayhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIGNvbnN0IHU4ICpidWYsIGludCBsZW4pCiB7CkBAIC0yNjksMTEgKzI3NywxMCBAQAogRVhQT1JUX1NZTUJPTF9HUEwodzFfd3JpdGVfYmxvY2spOwogCiAvKioKLSAqIFRvdWNoZXMgYSBzZXJpZXMgb2YgYnl0ZXMuCi0gKgotICogQHBhcmFtIGRldiAgICAgdGhlIG1hc3RlciBkZXZpY2UKLSAqIEBwYXJhbSBidWYgICAgIHBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKLSAqIEBwYXJhbSBsZW4gICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAqIHcxX3RvdWNoX2Jsb2NrKCkgLSBUb3VjaGVzIGEgc2VyaWVzIG9mIGJ5dGVzLgorICogQGRldjoJdGhlIG1hc3RlciBkZXZpY2UKKyAqIEBidWY6CXBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKKyAqIEBsZW46CXRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKICAqLwogdm9pZCB3MV90b3VjaF9ibG9jayhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHU4ICpidWYsIGludCBsZW4pCiB7CkBAIC0yOTQsMTIgKzMwMSwxMSBAQAogRVhQT1JUX1NZTUJPTF9HUEwodzFfdG91Y2hfYmxvY2spOwogCiAvKioKLSAqIFJlYWRzIGEgc2VyaWVzIG9mIGJ5dGVzLgotICoKLSAqIEBwYXJhbSBkZXYgICAgIHRoZSBtYXN0ZXIgZGV2aWNlCi0gKiBAcGFyYW0gYnVmICAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gZmlsbAotICogQHBhcmFtIGxlbiAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkCi0gKiBAcmV0dXJuICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKKyAqIHcxX3JlYWRfYmxvY2soKSAtIFJlYWRzIGEgc2VyaWVzIG9mIGJ5dGVzLgorICogQGRldjoJdGhlIG1hc3RlciBkZXZpY2UKKyAqIEBidWY6CXBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBmaWxsCisgKiBAbGVuOgl0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqIFJldHVybjoJdGhlIG51bWJlciBvZiBieXRlcyByZWFkCiAgKi8KIHU4IHcxX3JlYWRfYmxvY2soc3RydWN0IHcxX21hc3RlciAqZGV2LCB1OCAqYnVmLCBpbnQgbGVuKQogewpAQCAtMzE5LDEwICszMjUsOSBAQAogRVhQT1JUX1NZTUJPTF9HUEwodzFfcmVhZF9ibG9jayk7CiAKIC8qKgotICogSXNzdWVzIGEgcmVzZXQgYnVzIHNlcXVlbmNlLgotICoKLSAqIEBwYXJhbSAgZGV2IFRoZSBidXMgbWFzdGVyIHBvaW50ZXIKLSAqIEByZXR1cm4gICAgIDA9RGV2aWNlIHByZXNlbnQsIDE9Tm8gZGV2aWNlIHByZXNlbnQgb3IgZXJyb3IKKyAqIHcxX3Jlc2V0X2J1cygpIC0gSXNzdWVzIGEgcmVzZXQgYnVzIHNlcXVlbmNlLgorICogQGRldjoJdGhlIG1hc3RlciBkZXZpY2UKKyAqIFJldHVybjoJMD1EZXZpY2UgcHJlc2VudCwgMT1ObyBkZXZpY2UgcHJlc2VudCBvciBlcnJvcgogICovCiBpbnQgdzFfcmVzZXRfYnVzKHN0cnVjdCB3MV9tYXN0ZXIgKmRldikKIHsKQEAgLTM4MywxMiArMzg4LDE1IEBACiB9CiAKIC8qKgorICogdzFfcmVzZXRfc2VsZWN0X3NsYXZlKCkgLSByZXNldCBhbmQgc2VsZWN0IGEgc2xhdmUKKyAqIEBzbDoJCXRoZSBzbGF2ZSB0byBzZWxlY3QKKyAqCiAgKiBSZXNldHMgdGhlIGJ1cyBhbmQgdGhlbiBzZWxlY3RzIHRoZSBzbGF2ZSBieSBzZW5kaW5nIGVpdGhlciBhIHNraXAgcm9tCi0gKiBvciBhIHJvbSBtYXRjaC4KKyAqIG9yIGEgcm9tIG1hdGNoLiAgQSBza2lwIHJvbSBpcyBpc3N1ZWQgaWYgdGhlcmUgaXMgb25seSBvbmUgZGV2aWNlCisgKiByZWdpc3RlcmVkIG9uIHRoZSBidXMuCiAgKiBUaGUgdzEgbWFzdGVyIGxvY2sgbXVzdCBiZSBoZWxkLgogICoKLSAqIEBwYXJhbSBzbAl0aGUgc2xhdmUgdG8gc2VsZWN0Ci0gKiBAcmV0dXJuIAkwPXN1Y2Nlc3MsIGFueXRoaW5nIGVsc2U9ZXJyb3IKKyAqIFJldHVybjoJMD1zdWNjZXNzLCBhbnl0aGluZyBlbHNlPWVycm9yCiAgKi8KIGludCB3MV9yZXNldF9zZWxlY3Rfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCkKIHsKQEAgLTQwOSw2ICs0MTcsOSBAQAogRVhQT1JUX1NZTUJPTF9HUEwodzFfcmVzZXRfc2VsZWN0X3NsYXZlKTsKIAogLyoqCisgKiB3MV9yZXNldF9yZXN1bWVfY29tbWFuZCgpIC0gcmVzdW1lIGluc3RlYWQgb2YgYW5vdGhlciBtYXRjaCBST00KKyAqIEBkZXY6CXRoZSBtYXN0ZXIgZGV2aWNlCisgKgogICogV2hlbiB0aGUgd29ya2Zsb3cgd2l0aCBhIHNsYXZlIGFtb25nc3QgbWFueSByZXF1aXJlcyBzZXZlcmFsCiAgKiBzdWNjZXNzaXZlIGNvbW1hbmRzIGEgcmVzZXQgYmV0d2VlbiBlYWNoLCB0aGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIKICAqIHRvIGRvaW5nIGEgcmVzZXQgdGhlbiBhIG1hdGNoIFJPTSBmb3IgdGhlIGxhc3QgbWF0Y2hlZCBST00uIFRoZQpAQCAtNDIwLDggKzQzMSw2IEBACiAgKiBkb2Vzbid0IHdvcmsgb2YgY291cnNlLCBidXQgdGhlIHJlc3VtZSBjb21tYW5kIGlzIHRoZSBuZXh0IGJlc3QgdGhpbmcuCiAgKgogICogVGhlIHcxIG1hc3RlciBsb2NrIG11c3QgYmUgaGVsZC4KLSAqCi0gKiBAcGFyYW0gZGV2ICAgICB0aGUgbWFzdGVyIGRldmljZQogICovCiBpbnQgdzFfcmVzZXRfcmVzdW1lX2NvbW1hbmQoc3RydWN0IHcxX21hc3RlciAqZGV2KQogewpAQCAtNDM1LDYgKzQ0NCwxMCBAQAogRVhQT1JUX1NZTUJPTF9HUEwodzFfcmVzZXRfcmVzdW1lX2NvbW1hbmQpOwogCiAvKioKKyAqIHcxX25leHRfcHVsbHVwKCkgLSByZWdpc3RlciBmb3IgYSBzdHJvbmcgcHVsbHVwCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQorICogQGRlbGF5Ogl0aW1lIGluIG1pbGxpc2Vjb25kcworICoKICAqIFB1dCBvdXQgYSBzdHJvbmcgcHVsbC11cCBvZiB0aGUgc3BlY2lmaWVkIGR1cmF0aW9uIGFmdGVyIHRoZSBuZXh0IHdyaXRlCiAgKiBvcGVyYXRpb24uICBOb3QgYWxsIGhhcmR3YXJlIHN1cHBvcnRzIHN0cm9uZyBwdWxsdXBzLiAgSGFyZHdhcmUgdGhhdAogICogZG9lc24ndCBzdXBwb3J0IHN0cm9uZyBwdWxsdXBzIHdpbGwgc2xlZXAgZm9yIHRoZSBnaXZlbiB0aW1lIGFmdGVyIHRoZQpAQCAtNDQyLDggKzQ1NSw3IEBACiAgKiB0aGUgbmV4dCB3cml0ZSwgc3BlY2lmeWluZyB6ZXJvIHdpbGwgY2xlYXIgYSBwcmV2aW91cyByZXF1ZXN0LgogICogVGhlIHcxIG1hc3RlciBsb2NrIG11c3QgYmUgaGVsZC4KICAqCi0gKiBAcGFyYW0gZGVsYXkJdGltZSBpbiBtaWxsaXNlY29uZHMKLSAqIEByZXR1cm4JMD1zdWNjZXNzLCBhbnl0aGluZyBlbHNlPWVycm9yCisgKiBSZXR1cm46CTA9c3VjY2VzcywgYW55dGhpbmcgZWxzZT1lcnJvcgogICovCiB2b2lkIHcxX25leHRfcHVsbHVwKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgaW50IGRlbGF5KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MV9uZXRsaW5rLmMgYi9kcml2ZXJzL3cxL3cxX25ldGxpbmsuYwppbmRleCA0MDc4OGM5Li41MjM0OTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX25ldGxpbmsuYworKysgYi9kcml2ZXJzL3cxL3cxX25ldGxpbmsuYwpAQCAtNDUsNyArNDUsNyBAQAogCiAJbWVtY3B5KHcsIG1zZywgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykpOwogCi0JY25fbmV0bGlua19zZW5kKG0sIDAsIEdGUF9LRVJORUwpOworCWNuX25ldGxpbmtfc2VuZChtLCBkZXYtPnBvcnRpZCwgMCwgR0ZQX0tFUk5FTCk7CiB9CiAKIHN0YXRpYyB2b2lkIHcxX3NlbmRfc2xhdmUoc3RydWN0IHcxX21hc3RlciAqZGV2LCB1NjQgcm4pCkBAIC01NCw1MyArNTQsOTUgQEAKIAlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKmhkciA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikobXNnICsgMSk7CiAJc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQgPSAoc3RydWN0IHcxX25ldGxpbmtfY21kICopKGhkciArIDEpOwogCWludCBhdmFpbDsKLQotCS8qIHVwZGF0ZSBrZXJuZWwgc2xhdmUgbGlzdCAqLwotCXcxX3NsYXZlX2ZvdW5kKGRldiwgcm4pOworCXU2NCAqZGF0YTsKIAogCWF2YWlsID0gZGV2LT5wcml2X3NpemUgLSBjbWQtPmxlbjsKIAotCWlmIChhdmFpbCA+IDgpIHsKLQkJdTY0ICpkYXRhID0gKHZvaWQgKikoY21kICsgMSkgKyBjbWQtPmxlbjsKKwlpZiAoYXZhaWwgPCA4KSB7CisJCW1zZy0+YWNrKys7CisJCWNuX25ldGxpbmtfc2VuZChtc2csIGRldi0+cG9ydGlkLCAwLCBHRlBfS0VSTkVMKTsKIAotCQkqZGF0YSA9IHJuOwotCQljbWQtPmxlbiArPSA4OwotCQloZHItPmxlbiArPSA4OwotCQltc2ctPmxlbiArPSA4OwotCQlyZXR1cm47CisJCW1zZy0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKworCQkJc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7CisJCWhkci0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7CisJCWNtZC0+bGVuID0gMDsKIAl9CiAKLQltc2ctPmFjaysrOwotCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIEdGUF9LRVJORUwpOworCWRhdGEgPSAodm9pZCAqKShjbWQgKyAxKSArIGNtZC0+bGVuOwogCi0JbXNnLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpOwotCWhkci0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7Ci0JY21kLT5sZW4gPSAwOworCSpkYXRhID0gcm47CisJY21kLT5sZW4gKz0gODsKKwloZHItPmxlbiArPSA4OworCW1zZy0+bGVuICs9IDg7CiB9CiAKLXN0YXRpYyBpbnQgdzFfcHJvY2Vzc19zZWFyY2hfY29tbWFuZChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHN0cnVjdCBjbl9tc2cgKm1zZywKLQkJdW5zaWduZWQgaW50IGF2YWlsKQorc3RhdGljIHZvaWQgdzFfZm91bmRfc2VuZF9zbGF2ZShzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHU2NCBybikKIHsKLQlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKmhkciA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikobXNnICsgMSk7Ci0Jc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQgPSAoc3RydWN0IHcxX25ldGxpbmtfY21kICopKGhkciArIDEpOwotCWludCBzZWFyY2hfdHlwZSA9IChjbWQtPmNtZCA9PSBXMV9DTURfQUxBUk1fU0VBUkNIKT9XMV9BTEFSTV9TRUFSQ0g6VzFfU0VBUkNIOworCS8qIHVwZGF0ZSBrZXJuZWwgc2xhdmUgbGlzdCAqLworCXcxX3NsYXZlX2ZvdW5kKGRldiwgcm4pOworCisJdzFfc2VuZF9zbGF2ZShkZXYsIHJuKTsKK30KKworLyogR2V0IHRoZSBjdXJyZW50IHNsYXZlIGxpc3QsIG9yIHNlYXJjaCAod2l0aCBvciB3aXRob3V0IGFsYXJtKSAqLworc3RhdGljIGludCB3MV9nZXRfc2xhdmVzKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwKKwkJc3RydWN0IGNuX21zZyAqcmVxX21zZywgc3RydWN0IHcxX25ldGxpbmtfbXNnICpyZXFfaGRyLAorCQlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKnJlcV9jbWQpCit7CisJc3RydWN0IGNuX21zZyAqbXNnOworCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqaGRyOworCXN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqY21kOworCXN0cnVjdCB3MV9zbGF2ZSAqc2w7CisKKwltc2cgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJbXNnLT5pZCA9IHJlcV9tc2ctPmlkOworCW1zZy0+c2VxID0gcmVxX21zZy0+c2VxOworCW1zZy0+YWNrID0gMDsKKwltc2ctPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpICsKKwkJc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7CisKKwloZHIgPSAoc3RydWN0IHcxX25ldGxpbmtfbXNnICopKG1zZyArIDEpOworCWNtZCA9IChzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKikoaGRyICsgMSk7CisKKwloZHItPnR5cGUgPSBXMV9NQVNURVJfQ01EOworCWhkci0+aWQgPSByZXFfaGRyLT5pZDsKKwloZHItPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpOworCisJY21kLT5jbWQgPSByZXFfY21kLT5jbWQ7CisJY21kLT5sZW4gPSAwOwogCiAJZGV2LT5wcml2ID0gbXNnOwotCWRldi0+cHJpdl9zaXplID0gYXZhaWw7CisJZGV2LT5wcml2X3NpemUgPSBQQUdFX1NJWkUgLSBtc2ctPmxlbiAtIHNpemVvZihzdHJ1Y3QgY25fbXNnKTsKIAotCXcxX3NlYXJjaF9wcm9jZXNzX2NiKGRldiwgc2VhcmNoX3R5cGUsIHcxX3NlbmRfc2xhdmUpOworCWlmIChyZXFfY21kLT5jbWQgPT0gVzFfQ01EX0xJU1RfU0xBVkVTKSB7CisJCV9fdTY0IHJuOworCQltdXRleF9sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNsLCAmZGV2LT5zbGlzdCwgdzFfc2xhdmVfZW50cnkpIHsKKwkJCW1lbWNweSgmcm4sICZzbC0+cmVnX251bSwgc2l6ZW9mKHJuKSk7CisJCQl3MV9zZW5kX3NsYXZlKGRldiwgcm4pOworCQl9CisJCW11dGV4X3VubG9jaygmZGV2LT5saXN0X211dGV4KTsKKwl9IGVsc2UgeworCQl3MV9zZWFyY2hfcHJvY2Vzc19jYihkZXYsIGNtZC0+Y21kID09IFcxX0NNRF9BTEFSTV9TRUFSQ0ggPworCQkJVzFfQUxBUk1fU0VBUkNIIDogVzFfU0VBUkNILCB3MV9mb3VuZF9zZW5kX3NsYXZlKTsKKwl9CiAKIAltc2ctPmFjayA9IDA7Ci0JY25fbmV0bGlua19zZW5kKG1zZywgMCwgR0ZQX0tFUk5FTCk7CisJY25fbmV0bGlua19zZW5kKG1zZywgZGV2LT5wb3J0aWQsIDAsIEdGUF9LRVJORUwpOwogCiAJZGV2LT5wcml2ID0gTlVMTDsKIAlkZXYtPnByaXZfc2l6ZSA9IDA7CiAKKwlrZnJlZShtc2cpOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdzFfc2VuZF9yZWFkX3JlcGx5KHN0cnVjdCBjbl9tc2cgKm1zZywgc3RydWN0IHcxX25ldGxpbmtfbXNnICpoZHIsCi0JCXN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqY21kKQorCQlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZCwgdTMyIHBvcnRpZCkKIHsKIAl2b2lkICpkYXRhOwogCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqaDsKQEAgLTEzMSw3ICsxNzMsNyBAQAogCiAJbWVtY3B5KGMtPmRhdGEsIGNtZC0+ZGF0YSwgYy0+bGVuKTsKIAotCWVyciA9IGNuX25ldGxpbmtfc2VuZChjbSwgMCwgR0ZQX0tFUk5FTCk7CisJZXJyID0gY25fbmV0bGlua19zZW5kKGNtLCBwb3J0aWQsIDAsIEdGUF9LRVJORUwpOwogCiAJa2ZyZWUoZGF0YSk7CiAKQEAgLTE0NiwxMSArMTg4LDExIEBACiAJc3dpdGNoIChjbWQtPmNtZCkgewogCWNhc2UgVzFfQ01EX1RPVUNIOgogCQl3MV90b3VjaF9ibG9jayhkZXYsIGNtZC0+ZGF0YSwgY21kLT5sZW4pOwotCQl3MV9zZW5kX3JlYWRfcmVwbHkobXNnLCBoZHIsIGNtZCk7CisJCXcxX3NlbmRfcmVhZF9yZXBseShtc2csIGhkciwgY21kLCBkZXYtPnBvcnRpZCk7CiAJCWJyZWFrOwogCWNhc2UgVzFfQ01EX1JFQUQ6CiAJCXcxX3JlYWRfYmxvY2soZGV2LCBjbWQtPmRhdGEsIGNtZC0+bGVuKTsKLQkJdzFfc2VuZF9yZWFkX3JlcGx5KG1zZywgaGRyLCBjbWQpOworCQl3MV9zZW5kX3JlYWRfcmVwbHkobXNnLCBoZHIsIGNtZCwgZGV2LT5wb3J0aWQpOwogCQlicmVhazsKIAljYXNlIFcxX0NNRF9XUklURToKIAkJdzFfd3JpdGVfYmxvY2soZGV2LCBjbWQtPmRhdGEsIGNtZC0+bGVuKTsKQEAgLTE2MywzOCArMjA1LDU3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCB3MV9wcm9jZXNzX2NvbW1hbmRfbWFzdGVyKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgc3RydWN0IGNuX21zZyAqcmVxX21zZywKLQkJc3RydWN0IHcxX25ldGxpbmtfbXNnICpyZXFfaGRyLCBzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKnJlcV9jbWQpCitzdGF0aWMgaW50IHcxX3Byb2Nlc3NfY29tbWFuZF9hZGRyZW1vdmUoc3RydWN0IHcxX21hc3RlciAqZGV2LAorCXN0cnVjdCBjbl9tc2cgKm1zZywgc3RydWN0IHcxX25ldGxpbmtfbXNnICpoZHIsCisJc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQpCit7CisJc3RydWN0IHcxX3NsYXZlICpzbDsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgdzFfcmVnX251bSAqaWQ7CisKKwlpZiAoY21kLT5sZW4gIT0gOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZCA9IChzdHJ1Y3QgdzFfcmVnX251bSAqKWNtZC0+ZGF0YTsKKworCXNsID0gdzFfc2xhdmVfc2VhcmNoX2RldmljZShkZXYsIGlkKTsKKwlzd2l0Y2ggKGNtZC0+Y21kKSB7CisJY2FzZSBXMV9DTURfU0xBVkVfQUREOgorCQlpZiAoc2wpCisJCQllcnIgPSAtRUlOVkFMOworCQllbHNlCisJCQllcnIgPSB3MV9hdHRhY2hfc2xhdmVfZGV2aWNlKGRldiwgaWQpOworCQlicmVhazsKKwljYXNlIFcxX0NNRF9TTEFWRV9SRU1PVkU6CisJCWlmIChzbCkKKwkJCXcxX3NsYXZlX2RldGFjaChzbCk7CisJCWVsc2UKKwkJCWVyciA9IC1FSU5WQUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdzFfcHJvY2Vzc19jb21tYW5kX21hc3RlcihzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsCisJc3RydWN0IGNuX21zZyAqcmVxX21zZywgc3RydWN0IHcxX25ldGxpbmtfbXNnICpyZXFfaGRyLAorCXN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqcmVxX2NtZCkKIHsKIAlpbnQgZXJyID0gLUVJTlZBTDsKLQlzdHJ1Y3QgY25fbXNnICptc2c7Ci0Jc3RydWN0IHcxX25ldGxpbmtfbXNnICpoZHI7Ci0Jc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQ7CiAKLQltc2cgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtc2cpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbXNnLT5pZCA9IHJlcV9tc2ctPmlkOwotCW1zZy0+c2VxID0gcmVxX21zZy0+c2VxOwotCW1zZy0+YWNrID0gMDsKLQltc2ctPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7Ci0KLQloZHIgPSAoc3RydWN0IHcxX25ldGxpbmtfbXNnICopKG1zZyArIDEpOwotCWNtZCA9IChzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKikoaGRyICsgMSk7Ci0KLQloZHItPnR5cGUgPSBXMV9NQVNURVJfQ01EOwotCWhkci0+aWQgPSByZXFfaGRyLT5pZDsKLQloZHItPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpOwotCi0JY21kLT5jbWQgPSByZXFfY21kLT5jbWQ7Ci0JY21kLT5sZW4gPSAwOwotCi0Jc3dpdGNoIChjbWQtPmNtZCkgeworCS8qIGRyb3AgYnVzX211dGV4IGZvciBzZWFyY2ggKGRvZXMgaXQncyBvd24gbG9ja2luZyksIGFuZCBhZGQvcmVtb3ZlCisJICogd2hpY2ggZG9lc24ndCB1c2UgdGhlIGJ1cworCSAqLworCXN3aXRjaCAocmVxX2NtZC0+Y21kKSB7CiAJY2FzZSBXMV9DTURfU0VBUkNIOgogCWNhc2UgVzFfQ01EX0FMQVJNX1NFQVJDSDoKLQkJZXJyID0gdzFfcHJvY2Vzc19zZWFyY2hfY29tbWFuZChkZXYsIG1zZywKLQkJCQlQQUdFX1NJWkUgLSBtc2ctPmxlbiAtIHNpemVvZihzdHJ1Y3QgY25fbXNnKSk7CisJY2FzZSBXMV9DTURfTElTVF9TTEFWRVM6CisJCW11dGV4X3VubG9jaygmZGV2LT5idXNfbXV0ZXgpOworCQllcnIgPSB3MV9nZXRfc2xhdmVzKGRldiwgcmVxX21zZywgcmVxX2hkciwgcmVxX2NtZCk7CisJCW11dGV4X2xvY2soJmRldi0+YnVzX211dGV4KTsKIAkJYnJlYWs7CiAJY2FzZSBXMV9DTURfUkVBRDoKIAljYXNlIFcxX0NNRF9XUklURToKQEAgLTIwNCwxMiArMjY1LDIwIEBACiAJY2FzZSBXMV9DTURfUkVTRVQ6CiAJCWVyciA9IHcxX3Jlc2V0X2J1cyhkZXYpOwogCQlicmVhazsKKwljYXNlIFcxX0NNRF9TTEFWRV9BREQ6CisJY2FzZSBXMV9DTURfU0xBVkVfUkVNT1ZFOgorCQltdXRleF91bmxvY2soJmRldi0+YnVzX211dGV4KTsKKwkJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisJCWVyciA9IHcxX3Byb2Nlc3NfY29tbWFuZF9hZGRyZW1vdmUoZGV2LCByZXFfbXNnLCByZXFfaGRyLAorCQkJcmVxX2NtZCk7CisJCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJCW11dGV4X2xvY2soJmRldi0+YnVzX211dGV4KTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZXJyID0gLUVJTlZBTDsKIAkJYnJlYWs7CiAJfQogCi0Ja2ZyZWUobXNnKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yMjMsNyArMjkyLDggQEAKIAlyZXR1cm4gdzFfcHJvY2Vzc19jb21tYW5kX2lvKHNsLT5tYXN0ZXIsIG1zZywgaGRyLCBjbWQpOwogfQogCi1zdGF0aWMgaW50IHcxX3Byb2Nlc3NfY29tbWFuZF9yb290KHN0cnVjdCBjbl9tc2cgKm1zZywgc3RydWN0IHcxX25ldGxpbmtfbXNnICptY21kKQorc3RhdGljIGludCB3MV9wcm9jZXNzX2NvbW1hbmRfcm9vdChzdHJ1Y3QgY25fbXNnICptc2csCisJc3RydWN0IHcxX25ldGxpbmtfbXNnICptY21kLCB1MzIgcG9ydGlkKQogewogCXN0cnVjdCB3MV9tYXN0ZXIgKm07CiAJc3RydWN0IGNuX21zZyAqY247CkBAIC0yNTYsNyArMzI2LDcgQEAKIAltdXRleF9sb2NrKCZ3MV9tbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShtLCAmdzFfbWFzdGVycywgdzFfbWFzdGVyX2VudHJ5KSB7CiAJCWlmIChjbi0+bGVuICsgc2l6ZW9mKCppZCkgPiBQQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IGNuX21zZykpIHsKLQkJCWNuX25ldGxpbmtfc2VuZChjbiwgMCwgR0ZQX0tFUk5FTCk7CisJCQljbl9uZXRsaW5rX3NlbmQoY24sIHBvcnRpZCwgMCwgR0ZQX0tFUk5FTCk7CiAJCQljbi0+YWNrKys7CiAJCQljbi0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZyk7CiAJCQl3LT5sZW4gPSAwOwpAQCAtMjY5LDcgKzMzOSw3IEBACiAJCWlkKys7CiAJfQogCWNuLT5hY2sgPSAwOwotCWNuX25ldGxpbmtfc2VuZChjbiwgMCwgR0ZQX0tFUk5FTCk7CisJY25fbmV0bGlua19zZW5kKGNuLCBwb3J0aWQsIDAsIEdGUF9LRVJORUwpOwogCW11dGV4X3VubG9jaygmdzFfbWxvY2spOwogCiAJa2ZyZWUoY24pOwpAQCAtMjc3LDcgKzM0Nyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgdzFfbmV0bGlua19zZW5kX2Vycm9yKHN0cnVjdCBjbl9tc2cgKnJjbXNnLCBzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKnJtc2csCi0JCXN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqcmNtZCwgaW50IGVycm9yKQorCQlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKnJjbWQsIGludCBwb3J0aWQsIGludCBlcnJvcikKIHsKIAlzdHJ1Y3QgY25fbXNnICpjbXNnOwogCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqbXNnOwpAQCAtMzA0LDM1ICszNzQsMTQ3IEBACiAJCWNtc2ctPmxlbiArPSBzaXplb2YoKmNtZCk7CiAJfQogCi0JZXJyb3IgPSBjbl9uZXRsaW5rX3NlbmQoY21zZywgMCwgR0ZQX0tFUk5FTCk7CisJZXJyb3IgPSBjbl9uZXRsaW5rX3NlbmQoY21zZywgcG9ydGlkLCAwLCBHRlBfS0VSTkVMKTsKIAlrZnJlZShjbXNnKTsKIAogCXJldHVybiBlcnJvcjsKIH0KIAorLyogQnVuZGxlIHRvZ2V0aGVyIGEgcmVmZXJlbmNlIGNvdW50LCB0aGUgZnVsbCBtZXNzYWdlLCBhbmQgYnJva2VuIG91dAorICogY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQgb24gZWFjaCB3MSBtYXN0ZXIga3RocmVhZCBpbiBvbmUgbWVtb3J5IGFsbG9jYXRpb24uCisgKi8KK3N0cnVjdCB3MV9jYl9ibG9jayB7CisJYXRvbWljX3QgcmVmY250OworCXUzMiBwb3J0aWQ7IC8qIFNlbmRpbmcgcHJvY2VzcyBwb3J0IElEICovCisJc3RydWN0IGNuX21zZyBtc2c7CisJLyogY25fbXNnIGRhdGEgKi8KKwkvKiBvbmUgb3IgbW9yZSB2YXJpYWJsZSBsZW5ndGggc3RydWN0IHcxX2NiX25vZGUgKi8KK307CitzdHJ1Y3QgdzFfY2Jfbm9kZSB7CisJc3RydWN0IHcxX2FzeW5jX2NtZCBhc3luYzsKKwkvKiBwb2ludGVycyB3aXRoaW4gdzFfY2JfYmxvY2sgYW5kIG1zZyBkYXRhICovCisJc3RydWN0IHcxX2NiX2Jsb2NrICpibG9jazsKKwlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKm07CisJc3RydWN0IHcxX3NsYXZlICpzbDsKKwlzdHJ1Y3QgdzFfbWFzdGVyICpkZXY7Cit9OworCitzdGF0aWMgdm9pZCB3MV9wcm9jZXNzX2NiKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgc3RydWN0IHcxX2FzeW5jX2NtZCAqYXN5bmNfY21kKQoreworCXN0cnVjdCB3MV9jYl9ub2RlICpub2RlID0gY29udGFpbmVyX29mKGFzeW5jX2NtZCwgc3RydWN0IHcxX2NiX25vZGUsCisJCWFzeW5jKTsKKwl1MTYgbWxlbiA9IG5vZGUtPm0tPmxlbjsKKwl1OCAqY21kX2RhdGEgPSBub2RlLT5tLT5kYXRhOworCWludCBlcnIgPSAwOworCXN0cnVjdCB3MV9zbGF2ZSAqc2wgPSBub2RlLT5zbDsKKwlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZCA9IE5VTEw7CisKKwltdXRleF9sb2NrKCZkZXYtPmJ1c19tdXRleCk7CisJZGV2LT5wb3J0aWQgPSBub2RlLT5ibG9jay0+cG9ydGlkOworCWlmIChzbCAmJiB3MV9yZXNldF9zZWxlY3Rfc2xhdmUoc2wpKQorCQllcnIgPSAtRU5PREVWOworCisJd2hpbGUgKG1sZW4gJiYgIWVycikgeworCQljbWQgPSAoc3RydWN0IHcxX25ldGxpbmtfY21kICopY21kX2RhdGE7CisKKwkJaWYgKGNtZC0+bGVuICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCkgPiBtbGVuKSB7CisJCQllcnIgPSAtRTJCSUc7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzbCkKKwkJCWVyciA9IHcxX3Byb2Nlc3NfY29tbWFuZF9zbGF2ZShzbCwgJm5vZGUtPmJsb2NrLT5tc2csCisJCQkJbm9kZS0+bSwgY21kKTsKKwkJZWxzZQorCQkJZXJyID0gdzFfcHJvY2Vzc19jb21tYW5kX21hc3RlcihkZXYsICZub2RlLT5ibG9jay0+bXNnLAorCQkJCW5vZGUtPm0sIGNtZCk7CisKKwkJdzFfbmV0bGlua19zZW5kX2Vycm9yKCZub2RlLT5ibG9jay0+bXNnLCBub2RlLT5tLCBjbWQsCisJCQlub2RlLT5ibG9jay0+cG9ydGlkLCBlcnIpOworCQllcnIgPSAwOworCisJCWNtZF9kYXRhICs9IGNtZC0+bGVuICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7CisJCW1sZW4gLT0gY21kLT5sZW4gKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKKwl9CisKKwlpZiAoIWNtZCB8fCBlcnIpCisJCXcxX25ldGxpbmtfc2VuZF9lcnJvcigmbm9kZS0+YmxvY2stPm1zZywgbm9kZS0+bSwgY21kLAorCQkJbm9kZS0+YmxvY2stPnBvcnRpZCwgZXJyKTsKKworCWlmIChzbCkKKwkJdzFfdW5yZWZfc2xhdmUoc2wpOworCWVsc2UKKwkJYXRvbWljX2RlYygmZGV2LT5yZWZjbnQpOworCWRldi0+cG9ydGlkID0gMDsKKwltdXRleF91bmxvY2soJmRldi0+YnVzX211dGV4KTsKKworCW11dGV4X2xvY2soJmRldi0+bGlzdF9tdXRleCk7CisJbGlzdF9kZWwoJmFzeW5jX2NtZC0+YXN5bmNfZW50cnkpOworCW11dGV4X3VubG9jaygmZGV2LT5saXN0X211dGV4KTsKKworCWlmIChhdG9taWNfc3ViX3JldHVybigxLCAmbm9kZS0+YmxvY2stPnJlZmNudCkgPT0gMCkKKwkJa2ZyZWUobm9kZS0+YmxvY2spOworfQorCiBzdGF0aWMgdm9pZCB3MV9jbl9jYWxsYmFjayhzdHJ1Y3QgY25fbXNnICptc2csIHN0cnVjdCBuZXRsaW5rX3NrYl9wYXJtcyAqbnNwKQogewogCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqbSA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikobXNnICsgMSk7Ci0Jc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQ7CiAJc3RydWN0IHcxX3NsYXZlICpzbDsKIAlzdHJ1Y3QgdzFfbWFzdGVyICpkZXY7CisJdTE2IG1zZ19sZW47CiAJaW50IGVyciA9IDA7CisJc3RydWN0IHcxX2NiX2Jsb2NrICpibG9jayA9IE5VTEw7CisJc3RydWN0IHcxX2NiX25vZGUgKm5vZGUgPSBOVUxMOworCWludCBub2RlX2NvdW50ID0gMDsKIAotCXdoaWxlIChtc2ctPmxlbiAmJiAhZXJyKSB7CisJLyogQ291bnQgdGhlIG51bWJlciBvZiBtYXN0ZXIgb3Igc2xhdmUgY29tbWFuZHMgdGhlcmUgYXJlIHRvIGFsbG9jYXRlCisJICogc3BhY2UgZm9yIG9uZSBjYl9ub2RlIGVhY2guCisJICovCisJbXNnX2xlbiA9IG1zZy0+bGVuOworCXdoaWxlIChtc2dfbGVuICYmICFlcnIpIHsKKwkJaWYgKG0tPmxlbiArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpID4gbXNnX2xlbikgeworCQkJZXJyID0gLUUyQklHOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAobS0+dHlwZSA9PSBXMV9NQVNURVJfQ01EIHx8IG0tPnR5cGUgPT0gVzFfU0xBVkVfQ01EKQorCQkJKytub2RlX2NvdW50OworCisJCW1zZ19sZW4gLT0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKyBtLT5sZW47CisJCW0gPSAoc3RydWN0IHcxX25ldGxpbmtfbXNnICopKCgodTggKiltKSArCisJCQlzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSArIG0tPmxlbik7CisJfQorCW0gPSAoc3RydWN0IHcxX25ldGxpbmtfbXNnICopKG1zZyArIDEpOworCWlmIChub2RlX2NvdW50KSB7CisJCS8qIG1zZy0+bGVuIGRvZXNuJ3QgaW5jbHVkZSBpdHNlbGYgKi8KKwkJbG9uZyBzaXplID0gc2l6ZW9mKHN0cnVjdCB3MV9jYl9ibG9jaykgKyBtc2ctPmxlbiArCisJCQlub2RlX2NvdW50KnNpemVvZihzdHJ1Y3QgdzFfY2Jfbm9kZSk7CisJCWJsb2NrID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFibG9jaykgeworCQkJdzFfbmV0bGlua19zZW5kX2Vycm9yKG1zZywgbSwgTlVMTCwgbnNwLT5wb3J0aWQsCisJCQkJLUVOT01FTSk7CisJCQlyZXR1cm47CisJCX0KKwkJYXRvbWljX3NldCgmYmxvY2stPnJlZmNudCwgMSk7CisJCWJsb2NrLT5wb3J0aWQgPSBuc3AtPnBvcnRpZDsKKwkJbWVtY3B5KCZibG9jay0+bXNnLCBtc2csIHNpemVvZigqbXNnKSArIG1zZy0+bGVuKTsKKwkJbm9kZSA9IChzdHJ1Y3QgdzFfY2Jfbm9kZSAqKSgodTggKilibG9jay0+bXNnLmRhdGEgKyBtc2ctPmxlbik7CisJfQorCisJbXNnX2xlbiA9IG1zZy0+bGVuOworCXdoaWxlIChtc2dfbGVuICYmICFlcnIpIHsKIAkJc3RydWN0IHcxX3JlZ19udW0gaWQ7CiAJCXUxNiBtbGVuID0gbS0+bGVuOwotCQl1OCAqY21kX2RhdGEgPSBtLT5kYXRhOwogCiAJCWRldiA9IE5VTEw7CiAJCXNsID0gTlVMTDsKLQkJY21kID0gTlVMTDsKIAogCQltZW1jcHkoJmlkLCBtLT5pZC5pZCwgc2l6ZW9mKGlkKSk7CiAjaWYgMAogCQlwcmludGsoIiVzOiAlMDJ4LiUwMTJsbHguJTAyeDogdHlwZT0lMDJ4LCBsZW49JXUuXG4iLAogCQkJCV9fZnVuY19fLCBpZC5mYW1pbHksICh1bnNpZ25lZCBsb25nIGxvbmcpaWQuaWQsIGlkLmNyYywgbS0+dHlwZSwgbS0+bGVuKTsKICNlbmRpZgotCQlpZiAobS0+bGVuICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgPiBtc2ctPmxlbikgeworCQlpZiAobS0+bGVuICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgPiBtc2dfbGVuKSB7CiAJCQllcnIgPSAtRTJCSUc7CiAJCQlicmVhazsKIAkJfQpAQCAtMzQ0LDcgKzUyNiw3IEBACiAJCQlpZiAoc2wpCiAJCQkJZGV2ID0gc2wtPm1hc3RlcjsKIAkJfSBlbHNlIHsKLQkJCWVyciA9IHcxX3Byb2Nlc3NfY29tbWFuZF9yb290KG1zZywgbSk7CisJCQllcnIgPSB3MV9wcm9jZXNzX2NvbW1hbmRfcm9vdChtc2csIG0sIG5zcC0+cG9ydGlkKTsKIAkJCWdvdG8gb3V0X2NvbnQ7CiAJCX0KIApAQCAtMzU3LDQxICs1MzksMjQgQEAKIAkJaWYgKCFtbGVuKQogCQkJZ290byBvdXRfY29udDsKIAotCQltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKwkJYXRvbWljX2luYygmYmxvY2stPnJlZmNudCk7CisJCW5vZGUtPmFzeW5jLmNiID0gdzFfcHJvY2Vzc19jYjsKKwkJbm9kZS0+YmxvY2sgPSBibG9jazsKKwkJbm9kZS0+bSA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikoKHU4ICopJmJsb2NrLT5tc2cgKworCQkJKHNpemVfdCkoKHU4ICopbSAtICh1OCAqKW1zZykpOworCQlub2RlLT5zbCA9IHNsOworCQlub2RlLT5kZXYgPSBkZXY7CiAKLQkJaWYgKHNsICYmIHcxX3Jlc2V0X3NlbGVjdF9zbGF2ZShzbCkpIHsKLQkJCWVyciA9IC1FTk9ERVY7Ci0JCQlnb3RvIG91dF91cDsKLQkJfQorCQltdXRleF9sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOworCQlsaXN0X2FkZF90YWlsKCZub2RlLT5hc3luYy5hc3luY19lbnRyeSwgJmRldi0+YXN5bmNfbGlzdCk7CisJCXdha2VfdXBfcHJvY2VzcyhkZXYtPnRocmVhZCk7CisJCW11dGV4X3VubG9jaygmZGV2LT5saXN0X211dGV4KTsKKwkJKytub2RlOwogCi0JCXdoaWxlIChtbGVuKSB7Ci0JCQljbWQgPSAoc3RydWN0IHcxX25ldGxpbmtfY21kICopY21kX2RhdGE7Ci0KLQkJCWlmIChjbWQtPmxlbiArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpID4gbWxlbikgewotCQkJCWVyciA9IC1FMkJJRzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKHNsKQotCQkJCWVyciA9IHcxX3Byb2Nlc3NfY29tbWFuZF9zbGF2ZShzbCwgbXNnLCBtLCBjbWQpOwotCQkJZWxzZQotCQkJCWVyciA9IHcxX3Byb2Nlc3NfY29tbWFuZF9tYXN0ZXIoZGV2LCBtc2csIG0sIGNtZCk7Ci0KLQkJCXcxX25ldGxpbmtfc2VuZF9lcnJvcihtc2csIG0sIGNtZCwgZXJyKTsKLQkJCWVyciA9IDA7Ci0KLQkJCWNtZF9kYXRhICs9IGNtZC0+bGVuICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7Ci0JCQltbGVuIC09IGNtZC0+bGVuICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7Ci0JCX0KLW91dF91cDoKLQkJYXRvbWljX2RlYygmZGV2LT5yZWZjbnQpOwotCQlpZiAoc2wpCi0JCQlhdG9taWNfZGVjKCZzbC0+cmVmY250KTsKLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKIG91dF9jb250OgotCQlpZiAoIWNtZCB8fCBlcnIpCi0JCQl3MV9uZXRsaW5rX3NlbmRfZXJyb3IobXNnLCBtLCBjbWQsIGVycik7Ci0JCW1zZy0+bGVuIC09IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpICsgbS0+bGVuOworCQlpZiAoZXJyKQorCQkJdzFfbmV0bGlua19zZW5kX2Vycm9yKG1zZywgbSwgTlVMTCwgbnNwLT5wb3J0aWQsIGVycik7CisJCW1zZ19sZW4gLT0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKyBtLT5sZW47CiAJCW0gPSAoc3RydWN0IHcxX25ldGxpbmtfbXNnICopKCgodTggKiltKSArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpICsgbS0+bGVuKTsKIAogCQkvKgpAQCAtNDAwLDYgKzU2NSw4IEBACiAJCWlmIChlcnIgPT0gLUVOT0RFVikKIAkJCWVyciA9IDA7CiAJfQorCWlmIChibG9jayAmJiBhdG9taWNfc3ViX3JldHVybigxLCAmYmxvY2stPnJlZmNudCkgPT0gMCkKKwkJa2ZyZWUoYmxvY2spOwogfQogCiBpbnQgdzFfaW5pdF9uZXRsaW5rKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX25ldGxpbmsuaCBiL2RyaXZlcnMvdzEvdzFfbmV0bGluay5oCmluZGV4IGIwOTIyZGMuLjFlOTUwNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzFfbmV0bGluay5oCisrKyBiL2RyaXZlcnMvdzEvdzFfbmV0bGluay5oCkBAIC0yNyw2ICsyNywxOCBAQAogCiAjaW5jbHVkZSAidzEuaCIKIAorLyoqCisgKiBlbnVtIHcxX25ldGxpbmtfbWVzc2FnZV90eXBlcyAtIG1lc3NhZ2UgdHlwZQorICoKKyAqIEBXMV9TTEFWRV9BREQ6IG5vdGlmaWNhdGlvbiB0aGF0IGEgc2xhdmUgZGV2aWNlIHdhcyBhZGRlZAorICogQFcxX1NMQVZFX1JFTU9WRTogbm90aWZpY2F0aW9uIHRoYXQgYSBzbGF2ZSBkZXZpY2Ugd2FzIHJlbW92ZWQKKyAqIEBXMV9NQVNURVJfQUREOiBub3RpZmljYXRpb24gdGhhdCBhIG5ldyBidXMgbWFzdGVyIHdhcyBhZGRlZAorICogQFcxX01BU1RFUl9SRU1PVkU6IG5vdGlmaWNhdGlvbiB0aGF0IGEgYnVzIG1hc3RlcndhcyByZW1vdmVkCisgKiBAVzFfTUFTVEVSX0NNRDogaW5pdGlhdGUgb3BlcmF0aW9ucyBvbiBhIHNwZWNpZmljIG1hc3RlcgorICogQFcxX1NMQVZFX0NNRDogc2VuZHMgcmVzZXQsIHNlbGVjdHMgdGhlIHNsYXZlLCB0aGVuIGRvZXMgYSByZWFkL3dyaXRlL3RvdWNoCisgKiBvcGVyYXRpb24KKyAqIEBXMV9MSVNUX01BU1RFUlM6IHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBidXMgbWFzdGVyIGlkZW50aWZpZXJzCisgKi8KIGVudW0gdzFfbmV0bGlua19tZXNzYWdlX3R5cGVzIHsKIAlXMV9TTEFWRV9BREQgPSAwLAogCVcxX1NMQVZFX1JFTU9WRSwKQEAgLTUyLDYgKzY0LDIyIEBACiAJX191OAkJCQlkYXRhWzBdOwogfTsKIAorLyoqCisgKiBlbnVtIHcxX2NvbW1hbmRzIC0gY29tbWFuZHMgYXZhaWxhYmxlIGZvciBtYXN0ZXIgb3Igc2xhdmUgb3BlcmF0aW9ucworICogQFcxX0NNRF9SRUFEOiByZWFkIGxlbiBieXRlcworICogQFcxX0NNRF9XUklURTogd3JpdGUgbGVuIGJ5dGVzCisgKiBAVzFfQ01EX1NFQVJDSDogaW5pdGlhdGUgYSBzdGFuZGFyZCBzZWFyY2gsIHJldHVybnMgb25seSB0aGUgc2xhdmUKKyAqIGRldmljZXMgZm91bmQgZHVyaW5nIHRoYXQgc2VhcmNoCisgKiBAVzFfQ01EX0FMQVJNX1NFQVJDSDogc2VhcmNoIGZvciBkZXZpY2VzIHRoYXQgYXJlIGN1cnJlbnRseSBhbGFybWluZworICogQFcxX0NNRF9UT1VDSDogVG91Y2hlcyBhIHNlcmllcyBvZiBieXRlcy4KKyAqIEBXMV9DTURfUkVTRVQ6IHNlbmRzIGEgYnVzIHJlc2V0IG9uIHRoZSBnaXZlbiBtYXN0ZXIKKyAqIEBXMV9DTURfU0xBVkVfQUREOiBhZGRzIGEgc2xhdmUgdG8gdGhlIGdpdmVuIG1hc3RlciwKKyAqIDggYnl0ZSBzbGF2ZSBpZCBhdCBkYXRhWzBdCisgKiBAVzFfQ01EX1NMQVZFX1JFTU9WRTogcmVtb3ZlcyBhIHNsYXZlIHRvIHRoZSBnaXZlbiBtYXN0ZXIsCisgKiA4IGJ5dGUgc2xhdmUgaWQgYXQgZGF0YVswXQorICogQFcxX0NNRF9MSVNUX1NMQVZFUzogbGlzdCBvZiBzbGF2ZXMgcmVnaXN0ZXJlZCBvbiB0aGlzIG1hc3RlcgorICogQFcxX0NNRF9NQVg6IG51bWJlciBvZiBhdmFpbGFibGUgY29tbWFuZHMKKyAqLwogZW51bSB3MV9jb21tYW5kcyB7CiAJVzFfQ01EX1JFQUQgPSAwLAogCVcxX0NNRF9XUklURSwKQEAgLTU5LDcgKzg3LDEwIEBACiAJVzFfQ01EX0FMQVJNX1NFQVJDSCwKIAlXMV9DTURfVE9VQ0gsCiAJVzFfQ01EX1JFU0VULAotCVcxX0NNRF9NQVgsCisJVzFfQ01EX1NMQVZFX0FERCwKKwlXMV9DTURfU0xBVkVfUkVNT1ZFLAorCVcxX0NNRF9MSVNUX1NMQVZFUywKKwlXMV9DTURfTUFYCiB9OwogCiBzdHJ1Y3QgdzFfbmV0bGlua19jbWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZyBiL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZwppbmRleCA3OWQyNTg5Li4wYzYwNDhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKKysrIGIvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCkBAIC0xMTEsNiArMTExLDE1IEBACiAJICBTdXBwb3J0IGZvciB0aGUgd2F0Y2hkb2cgaW4gdGhlIFdNODM1MCBBdWRpb1BsdXMgUE1JQy4gIFdoZW4KIAkgIHRoZSB3YXRjaGRvZyB0cmlnZ2VycyB0aGUgc3lzdGVtIHdpbGwgYmUgcmVzZXQuCiAKK2NvbmZpZyBYSUxJTlhfV0FUQ0hET0cKKwl0cmlzdGF0ZSAiWGlsaW54IFdhdGNoZG9nIHRpbWVyIgorCXNlbGVjdCBXQVRDSERPR19DT1JFCisJaGVscAorCSAgV2F0Y2hkb2cgZHJpdmVyIGZvciB0aGUgeHBzX3RpbWViYXNlX3dkdCBpcCBjb3JlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBvZl94aWxpbnhfd2R0LgorCiAjIEFMUEhBIEFyY2hpdGVjdHVyZQogCiAjIEFSTSBBcmNoaXRlY3R1cmUKQEAgLTI5Miw3ICszMDEsNyBAQAogCiBjb25maWcgT1JJT05fV0FUQ0hET0cKIAl0cmlzdGF0ZSAiT3Jpb24gd2F0Y2hkb2ciCi0JZGVwZW5kcyBvbiBBUkNIX09SSU9ONVggfHwgQVJDSF9LSVJLV09PRCB8fCBBUkNIX0RPVkUKKwlkZXBlbmRzIG9uIEFSQ0hfT1JJT041WCB8fCBBUkNIX0tJUktXT09EIHx8IEFSQ0hfRE9WRSB8fCBNQUNIX0RPVkUKIAlzZWxlY3QgV0FUQ0hET0dfQ09SRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgd2F0Y2hkb2cgdGltZXIKQEAgLTQyMSw2ICs0MzAsMTcgQEAKIAkgIFN1cHBvcnQgZm9yIENTUiBTaVJGcHJpbWFJSSBhbmQgU2lSRmF0bGFzVkkgd2F0Y2hkb2cuIFdoZW4KIAkgIHRoZSB3YXRjaGRvZyB0cmlnZ2VycyB0aGUgc3lzdGVtIHdpbGwgYmUgcmVzZXQuCiAKK2NvbmZpZyBURUdSQV9XQVRDSERPRworCXRyaXN0YXRlICJUZWdyYSB3YXRjaGRvZyIKKwlkZXBlbmRzIG9uIEFSQ0hfVEVHUkEgfHwgQ09NUElMRV9URVNUCisJc2VsZWN0IFdBVENIRE9HX0NPUkUKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIHdhdGNoZG9nIHRpbWVyCisJICBlbWJlZGRlZCBpbiBOVklESUEgVGVncmEgU29Dcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdGVncmFfd2R0LgorCiAjIEFWUjMyIEFyY2hpdGVjdHVyZQogCiBjb25maWcgQVQzMkFQNzAwWF9XRFQKQEAgLTUzMyw3ICs1NTMsNyBAQAogCiBjb25maWcgU0M1MjBfV0RUCiAJdHJpc3RhdGUgIkFNRCBFbGFuIFNDNTIwIHByb2Nlc3NvciBXYXRjaGRvZyIKLQlkZXBlbmRzIG9uIFg4NgorCWRlcGVuZHMgb24gTUVMQU4KIAloZWxwCiAJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBoYXJkd2FyZSB3YXRjaGRvZyBidWlsdCBpbiB0byB0aGUKIAkgIEFNRCAiRWxhbiIgU0M1MjAgbWljcm9jb21wdXRlciBjb21tb25seSB1c2VkIGluIGVtYmVkZGVkIHN5c3RlbXMuCkBAIC0xMDIzLDE4ICsxMDQzLDYgQEAKIAogIyBNaWNyb0JsYXplIEFyY2hpdGVjdHVyZQogCi1jb25maWcgWElMSU5YX1dBVENIRE9HCi0JdHJpc3RhdGUgIlhpbGlueCBXYXRjaGRvZyB0aW1lciIKLQlkZXBlbmRzIG9uIE1JQ1JPQkxBWkUKLQktLS1oZWxwLS0tCi0JICBXYXRjaGRvZyBkcml2ZXIgZm9yIHRoZSB4cHNfdGltZWJhc2Vfd2R0IGlwIGNvcmUuCi0KLQkgIElNUE9SVEFOVDogVGhlIHhwc190aW1lYmFzZV93ZHQgcGFyZW50IG11c3QgaGF2ZSB0aGUgcHJvcGVydHkKLQkgICJjbG9jay1mcmVxdWVuY3kiIGF0IGRldmljZSB0cmVlLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBvZl94aWxpbnhfd2R0LgotCiAjIE1JUFMgQXJjaGl0ZWN0dXJlCiAKIGNvbmZpZyBBVEg3OV9XRFQKQEAgLTExNjAsNyArMTE2OCw3IEBACiAKIGNvbmZpZyBCQ01fS09OQV9XRFQKIAl0cmlzdGF0ZSAiQkNNIEtvbmEgV2F0Y2hkb2ciCi0JZGVwZW5kcyBvbiBBUkNIX0JDTQorCWRlcGVuZHMgb24gQVJDSF9CQ01fTU9CSUxFCiAJc2VsZWN0IFdBVENIRE9HX0NPUkUKIAloZWxwCiAJICBTdXBwb3J0IGZvciB0aGUgd2F0Y2hkb2cgdGltZXIgb24gdGhlIGZvbGxvd2luZyBCcm9hZGNvbSBCQ00yODF4eApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZSBiL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUKaW5kZXggOTg1YTY2Yy4uMWI1ZjNkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlCkBAIC01OCw2ICs1OCw3IEBACiBvYmotJChDT05GSUdfTU9YQVJUX1dEVCkgKz0gbW94YXJ0X3dkdC5vCiBvYmotJChDT05GSUdfU0lSRlNPQ19XQVRDSERPRykgKz0gc2lyZnNvY193ZHQubwogb2JqLSQoQ09ORklHX0JDTV9LT05BX1dEVCkgKz0gYmNtX2tvbmFfd2R0Lm8KK29iai0kKENPTkZJR19URUdSQV9XQVRDSERPRykgKz0gdGVncmFfd2R0Lm8KIAogIyBBVlIzMiBBcmNoaXRlY3R1cmUKIG9iai0kKENPTkZJR19BVDMyQVA3MDBYX1dEVCkgKz0gYXQzMmFwNzAweF93ZHQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9hY3F1aXJld2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2FjcXVpcmV3ZHQuYwppbmRleCA1Y2YxNjIxLi41NjE0NDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2FjcXVpcmV3ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2FjcXVpcmV3ZHQuYwpAQCAtMjM5LDcgKzIzOSw3IEBACiAgKglJbml0ICYgZXhpdCByb3V0aW5lcwogICovCiAKLXN0YXRpYyBpbnQgYWNxX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IGFjcV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJaW50IHJldDsKIApAQCAtMjkxLDcgKzI5MSw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFjcXVpcmV3ZHRfZHJpdmVyID0gewotCS5wcm9iZQkJPSBhY3FfcHJvYmUsCiAJLnJlbW92ZQkJPSBhY3FfcmVtb3ZlLAogCS5zaHV0ZG93bgk9IGFjcV9zaHV0ZG93biwKIAkuZHJpdmVyCQk9IHsKQEAgLTMwNiwyMCArMzA1LDE4IEBACiAKIAlwcl9pbmZvKCJXRFQgZHJpdmVyIGZvciBBY3F1aXJlIHNpbmdsZSBib2FyZCBjb21wdXRlciBpbml0aWFsaXNpbmdcbiIpOwogCi0JZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhY3F1aXJld2R0X2RyaXZlcik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQogCWFjcV9wbGF0Zm9ybV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKERSVl9OQU1FLAogCQkJCQkJCQktMSwgTlVMTCwgMCk7Ci0JaWYgKElTX0VSUihhY3FfcGxhdGZvcm1fZGV2aWNlKSkgewotCQllcnIgPSBQVFJfRVJSKGFjcV9wbGF0Zm9ybV9kZXZpY2UpOwotCQlnb3RvIHVucmVnX3BsYXRmb3JtX2RyaXZlcjsKLQl9CisJaWYgKElTX0VSUihhY3FfcGxhdGZvcm1fZGV2aWNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoYWNxX3BsYXRmb3JtX2RldmljZSk7CisKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmFjcXVpcmV3ZHRfZHJpdmVyLCBhY3FfcHJvYmUpOworCWlmIChlcnIpCisJCWdvdG8gdW5yZWdfcGxhdGZvcm1fZGV2aWNlOwogCXJldHVybiAwOwogCi11bnJlZ19wbGF0Zm9ybV9kcml2ZXI6Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFjcXVpcmV3ZHRfZHJpdmVyKTsKK3VucmVnX3BsYXRmb3JtX2RldmljZToKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihhY3FfcGxhdGZvcm1fZGV2aWNlKTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2FkdmFudGVjaHdkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9hZHZhbnRlY2h3ZHQuYwppbmRleCBhODk2MWFkLi43Nzk2ZGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2FkdmFudGVjaHdkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvYWR2YW50ZWNod2R0LmMKQEAgLTIzOCw3ICsyMzgsNyBAQAogICoJSW5pdCAmIGV4aXQgcm91dGluZXMKICAqLwogCi1zdGF0aWMgaW50IGFkdndkdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9faW5pdCBhZHZ3ZHRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCWludCByZXQ7CiAKQEAgLTI5OSw3ICsyOTksNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhZHZ3ZHRfZHJpdmVyID0gewotCS5wcm9iZQkJPSBhZHZ3ZHRfcHJvYmUsCiAJLnJlbW92ZQkJPSBhZHZ3ZHRfcmVtb3ZlLAogCS5zaHV0ZG93bgk9IGFkdndkdF9zaHV0ZG93biwKIAkuZHJpdmVyCQk9IHsKQEAgLTMxNCwyMSArMzEzLDE5IEBACiAKIAlwcl9pbmZvKCJXRFQgZHJpdmVyIGZvciBBZHZhbnRlY2ggc2luZ2xlIGJvYXJkIGNvbXB1dGVyIGluaXRpYWxpc2luZ1xuIik7CiAKLQllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFkdndkdF9kcml2ZXIpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KIAlhZHZ3ZHRfcGxhdGZvcm1fZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShEUlZfTkFNRSwKIAkJCQkJCQkJLTEsIE5VTEwsIDApOwotCWlmIChJU19FUlIoYWR2d2R0X3BsYXRmb3JtX2RldmljZSkpIHsKLQkJZXJyID0gUFRSX0VSUihhZHZ3ZHRfcGxhdGZvcm1fZGV2aWNlKTsKLQkJZ290byB1bnJlZ19wbGF0Zm9ybV9kcml2ZXI7Ci0JfQorCWlmIChJU19FUlIoYWR2d2R0X3BsYXRmb3JtX2RldmljZSkpCisJCXJldHVybiBQVFJfRVJSKGFkdndkdF9wbGF0Zm9ybV9kZXZpY2UpOworCisJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZhZHZ3ZHRfZHJpdmVyLCBhZHZ3ZHRfcHJvYmUpOworCWlmIChlcnIpCisJCWdvdG8gdW5yZWdfcGxhdGZvcm1fZGV2aWNlOwogCiAJcmV0dXJuIDA7CiAKLXVucmVnX3BsYXRmb3JtX2RyaXZlcjoKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYWR2d2R0X2RyaXZlcik7Cit1bnJlZ19wbGF0Zm9ybV9kZXZpY2U6CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoYWR2d2R0X3BsYXRmb3JtX2RldmljZSk7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9hcjdfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2FyN193ZHQuYwppbmRleCAzYTk5NjU3Li5hZTZjMjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2FyN193ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2FyN193ZHQuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2F0MzJhcDcwMHhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2F0MzJhcDcwMHhfd2R0LmMKaW5kZXggYWZlN2QxNy4uMjViNWM2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9hdDMyYXA3MDB4X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvYXQzMmFwNzAweF93ZHQuYwpAQCAtMzIzLDEwICszMjMsOCBAQAogCiAJd2R0ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgd2R0X2F0MzJhcDcwMHgpLAogCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCF3ZHQpIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAibm8gbWVtb3J5IGZvciB3ZHQgc3RydWN0dXJlXG4iKTsKKwlpZiAoIXdkdCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJd2R0LT5yZWdzID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlZ3MtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlZ3MpKTsKIAlpZiAoIXdkdC0+cmVncykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9hdGg3OV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvYXRoNzlfd2R0LmMKaW5kZXggOWZhMWY2OS4uMzk5YzNmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9hdGg3OV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2F0aDc5X3dkdC5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvYmNtMjgzNV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvYmNtMjgzNV93ZHQuYwppbmRleCBjYWZhOTczLi44ZGY0NTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2JjbTI4MzVfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9iY20yODM1X3dkdC5jCkBAIC0xMTQsMTAgKzExNCw4IEBACiAJaW50IGVycjsKIAogCXdkdCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgYmNtMjgzNV93ZHQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXdkdCkgewotCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHdhdGNoZG9nIGRldmljZSIpOworCWlmICghd2R0KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgd2R0KTsKIAogCXNwaW5fbG9ja19pbml0KCZ3ZHQtPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9iY200N3h4X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9iY200N3h4X3dkdC5jCmluZGV4IGI0MDIxYTJiLi5iNjFmY2M1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2JjbTQ3eHhfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9iY200N3h4X3dkdC5jCkBAIC0xNiw3ICsxNiw2IEBACiAjaW5jbHVkZSA8bGludXgvYmNtNDd4eF93ZHQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9iY202M3h4X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9iY202M3h4X3dkdC5jCmluZGV4IDRlYjE4OGIuLjVhOGU4NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvYmNtNjN4eF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2JjbTYzeHhfd2R0LmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgpAQCAtNDUsNyArNDQsNiBAQAogc3RhdGljIHN0cnVjdCB7CiAJdm9pZCBfX2lvbWVtICpyZWdzOwogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwotCWludCBkZWZhdWx0X3RpY2tzOwogCXVuc2lnbmVkIGxvbmcgaW51c2U7CiAJYXRvbWljX3QgdGlja3M7CiB9IGJjbTYzeHhfd2R0X2RldmljZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvY3B1NXdkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9jcHU1d2R0LmMKaW5kZXggZjdhZTQ5ZS4uNmQwM2U4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9jcHU1d2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9jcHU1d2R0LmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvY3B3ZC5jIGIvZHJpdmVycy93YXRjaGRvZy9jcHdkLmMKaW5kZXggMjEzMjI1ZS4uZTU1ZWQ3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9jcHdkLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9jcHdkLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9kYTkwNTJfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2RhOTA1Ml93ZHQuYwppbmRleCBmMDljNTRlLi4yZTk1ODk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2RhOTA1Ml93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2RhOTA1Ml93ZHQuYwpAQCAtMTg1LDcgKzE4NSw2IEBACiAJZHJpdmVyX2RhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpkcml2ZXJfZGF0YSksCiAJCQkJICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkcml2ZXJfZGF0YSkgewotCQlkZXZfZXJyKGRhOTA1Mi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9hY2F0ZSB3YXRjaGRvZyBkZXZpY2VcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2RhOTA1NV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvZGE5MDU1X3dkdC5jCmluZGV4IDU3NWYzN2EuLjQ5NTA4OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvZGE5MDU1X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvZGE5MDU1X3dkdC5jCkBAIC0xNTEsMTAgKzE1MSw4IEBACiAKIAlkcml2ZXJfZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmRyaXZlcl9kYXRhKSwKIAkJCQkgICBHRlBfS0VSTkVMKTsKLQlpZiAoIWRyaXZlcl9kYXRhKSB7Ci0JCWRldl9lcnIoZGE5MDU1LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgd2F0Y2hkb2cgZGV2aWNlXG4iKTsKKwlpZiAoIWRyaXZlcl9kYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlkcml2ZXJfZGF0YS0+ZGE5MDU1ID0gZGE5MDU1OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2RhdmluY2lfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2RhdmluY2lfd2R0LmMKaW5kZXggYjFiYWUwMy4uZDA5YWQyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9kYXZpbmNpX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvZGF2aW5jaV93ZHQuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvZXA5M3h4X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9lcDkzeHhfd2R0LmMKaW5kZXggZDFkMDdmMi4uNWY1NGUxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9lcDkzeHhfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9lcDkzeHhfd2R0LmMKQEAgLTExOCwxNiArMTE4LDkgQEAKIAlpbnQgZXJyOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIXJlcykKLQkJcmV0dXJuIC1FTlhJTzsKLQotCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKLQkJCQkgICAgIHJlc291cmNlX3NpemUocmVzKSwgcGRldi0+bmFtZSkpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQltbWlvX2Jhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKLQlpZiAoIW1taW9fYmFzZSkKLQkJcmV0dXJuIC1FTlhJTzsKKwltbWlvX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKG1taW9fYmFzZSkpCisJCXJldHVybiBQVFJfRVJSKG1taW9fYmFzZSk7CiAKIAlpZiAodGltZW91dCA8IDEgfHwgdGltZW91dCA+IDM2MDApIHsKIAkJdGltZW91dCA9IFdEVF9USU1FT1VUOwpAQCAtMTcyLDkgKzE2NSw5IEBACiAKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoZXA5M3h4X3dkdF9kcml2ZXIpOwogCi1NT0RVTEVfQVVUSE9SKCJSYXkgTGVodGluaWVtaSA8cmF5bEBtYWlsLmNvbT4sIgotCQkiQWxlc3NhbmRybyBadW1tbyA8YS56dW1tb0B0b3dlcnRlY2guaXQ+LCIKLQkJIkggSGFydGxleSBTd2VldGVuIDxoc3dlZXRlbkB2aXNpb25lbmdyYXZlcnMuY29tPiIpOworTU9EVUxFX0FVVEhPUigiUmF5IExlaHRpbmllbWkgPHJheWxAbWFpbC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJBbGVzc2FuZHJvIFp1bW1vIDxhLnp1bW1vQHRvd2VydGVjaC5pdD4iKTsKK01PRFVMRV9BVVRIT1IoIkggSGFydGxleSBTd2VldGVuIDxoc3dlZXRlbkB2aXNpb25lbmdyYXZlcnMuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJFUDkzeHggV2F0Y2hkb2ciKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9WRVJTSU9OKFdEVF9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvZ2VvZGV3ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvZ2VvZGV3ZHQuYwppbmRleCA0YTZhZTg0Li40YzQzZTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2dlb2Rld2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9nZW9kZXdkdC5jCkBAIC0yMTUsNyArMjE1LDcgQEAKIAkuZm9wcyA9ICZnZW9kZXdkdF9mb3BzLAogfTsKIAotc3RhdGljIGludCBnZW9kZXdkdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9faW5pdCBnZW9kZXdkdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJaW50IHJldDsKIApAQCAtMjU1LDcgKzI1NSw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdlb2Rld2R0X2RyaXZlciA9IHsKLQkucHJvYmUJCT0gZ2VvZGV3ZHRfcHJvYmUsCiAJLnJlbW92ZQkJPSBnZW9kZXdkdF9yZW1vdmUsCiAJLnNodXRkb3duCT0gZ2VvZGV3ZHRfc2h1dGRvd24sCiAJLmRyaXZlcgkJPSB7CkBAIC0yNjgsMjAgKzI2NywxOCBAQAogewogCWludCByZXQ7CiAKLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmdlb2Rld2R0X2RyaXZlcik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCWdlb2Rld2R0X3BsYXRmb3JtX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoRFJWX05BTUUsCiAJCQkJCQkJCS0xLCBOVUxMLCAwKTsKLQlpZiAoSVNfRVJSKGdlb2Rld2R0X3BsYXRmb3JtX2RldmljZSkpIHsKLQkJcmV0ID0gUFRSX0VSUihnZW9kZXdkdF9wbGF0Zm9ybV9kZXZpY2UpOworCWlmIChJU19FUlIoZ2VvZGV3ZHRfcGxhdGZvcm1fZGV2aWNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoZ2VvZGV3ZHRfcGxhdGZvcm1fZGV2aWNlKTsKKworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZ2VvZGV3ZHRfZHJpdmVyLCBnZW9kZXdkdF9wcm9iZSk7CisJaWYgKHJldCkKIAkJZ290byBlcnI7Ci0JfQogCiAJcmV0dXJuIDA7CiBlcnI6Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmdlb2Rld2R0X2RyaXZlcik7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZ2VvZGV3ZHRfcGxhdGZvcm1fZGV2aWNlKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2hwd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2hwd2R0LmMKaW5kZXggMmI3NWU4Yi4uNzVkMjI0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9ocHdkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvaHB3ZHQuYwpAQCAtMTcsNyArMTcsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvaTYzMDBlc2IuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvaTYzMDBlc2IuYwppbmRleCAyNWEyYmZkLi5kN2JlZmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2k2MzAwZXNiLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9pNjMwMGVzYi5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9pVENPX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9pVENPX3dkdC5jCmluZGV4IDA0ZjhhZjYuLjBlNmMwMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaVRDT193ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2lUQ09fd2R0LmMKQEAgLTM0NywxNSArMzQ3LDE1IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHdhdGNoZG9nX29wcyBpVENPX3dkdF9vcHMgPSB7CiAJLm93bmVyID0JCVRISVNfTU9EVUxFLAogCS5zdGFydCA9CQlpVENPX3dkdF9zdGFydCwKLQkuc3RvcCA9IAkJaVRDT193ZHRfc3RvcCwKLQkucGluZyA9IAkJaVRDT193ZHRfcGluZywKKwkuc3RvcCA9CQkJaVRDT193ZHRfc3RvcCwKKwkucGluZyA9CQkJaVRDT193ZHRfcGluZywKIAkuc2V0X3RpbWVvdXQgPQkJaVRDT193ZHRfc2V0X3RpbWVvdXQsCiAJLmdldF90aW1lbGVmdCA9CQlpVENPX3dkdF9nZXRfdGltZWxlZnQsCiB9OwogCiBzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2RldmljZSBpVENPX3dkdF93YXRjaGRvZ19kZXYgPSB7CiAJLmluZm8gPQkJJmlkZW50LAotCS5vcHMgPSAJCSZpVENPX3dkdF9vcHMsCisJLm9wcyA9CQkmaVRDT193ZHRfb3BzLAogfTsKIAogLyoKQEAgLTQ4NSw3ICs0ODUsNyBAQAogCWlUQ09fd2R0X3dhdGNoZG9nX2Rldi5ib290c3RhdHVzID0gMDsKIAlpVENPX3dkdF93YXRjaGRvZ19kZXYudGltZW91dCA9IFdBVENIRE9HX1RJTUVPVVQ7CiAJd2F0Y2hkb2dfc2V0X25vd2F5b3V0KCZpVENPX3dkdF93YXRjaGRvZ19kZXYsIG5vd2F5b3V0KTsKLQlpVENPX3dkdF93YXRjaGRvZ19kZXYucGFyZW50ID0gZGV2LT5kZXYucGFyZW50OworCWlUQ09fd2R0X3dhdGNoZG9nX2Rldi5wYXJlbnQgPSAmZGV2LT5kZXY7CiAKIAkvKiBNYWtlIHN1cmUgdGhlIHdhdGNoZG9nIGlzIG5vdCBydW5uaW5nICovCiAJaVRDT193ZHRfc3RvcCgmaVRDT193ZHRfd2F0Y2hkb2dfZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvaWI3MDB3ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvaWI3MDB3ZHQuYwppbmRleCA3YWUzNjY5Li40MjQ3YzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2liNzAwd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9pYjcwMHdkdC5jCkBAIC0yNzcsNyArMjc3LDcgQEAKICAqCUluaXQgJiBleGl0IHJvdXRpbmVzCiAgKi8KIAotc3RhdGljIGludCBpYndkdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9faW5pdCBpYndkdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlczsKIApAQCAtMzM2LDcgKzMzNiw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlid2R0X2RyaXZlciA9IHsKLQkucHJvYmUJCT0gaWJ3ZHRfcHJvYmUsCiAJLnJlbW92ZQkJPSBpYndkdF9yZW1vdmUsCiAJLnNodXRkb3duCT0gaWJ3ZHRfc2h1dGRvd24sCiAJLmRyaXZlcgkJPSB7CkBAIC0zNTEsMjEgKzM1MCwxOSBAQAogCiAJcHJfaW5mbygiV0RUIGRyaXZlciBmb3IgSUI3MDAgc2luZ2xlIGJvYXJkIGNvbXB1dGVyIGluaXRpYWxpc2luZ1xuIik7CiAKLQllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmlid2R0X2RyaXZlcik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQogCWlid2R0X3BsYXRmb3JtX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoRFJWX05BTUUsCiAJCQkJCQkJCS0xLCBOVUxMLCAwKTsKLQlpZiAoSVNfRVJSKGlid2R0X3BsYXRmb3JtX2RldmljZSkpIHsKLQkJZXJyID0gUFRSX0VSUihpYndkdF9wbGF0Zm9ybV9kZXZpY2UpOwotCQlnb3RvIHVucmVnX3BsYXRmb3JtX2RyaXZlcjsKLQl9CisJaWYgKElTX0VSUihpYndkdF9wbGF0Zm9ybV9kZXZpY2UpKQorCQlyZXR1cm4gUFRSX0VSUihpYndkdF9wbGF0Zm9ybV9kZXZpY2UpOworCisJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZpYndkdF9kcml2ZXIsIGlid2R0X3Byb2JlKTsKKwlpZiAoZXJyKQorCQlnb3RvIHVucmVnX3BsYXRmb3JtX2RldmljZTsKIAogCXJldHVybiAwOwogCi11bnJlZ19wbGF0Zm9ybV9kcml2ZXI6Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmlid2R0X2RyaXZlcik7Cit1bnJlZ19wbGF0Zm9ybV9kZXZpY2U6CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoaWJ3ZHRfcGxhdGZvcm1fZGV2aWNlKTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2libWFzci5jIGIvZHJpdmVycy93YXRjaGRvZy9pYm1hc3IuYwppbmRleCBkYjBhMzQ0Ni4uMzY2YjA0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9pYm1hc3IuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2libWFzci5jCkBAIC0zNjAsNyArMzYwLDcgQEAKIAlpbnQgdHlwZTsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaWJtYXNyX2lkIF9faW5pdGRhdGEgaWJtYXNyX2lkX3RhYmxlW10gPSB7CitzdGF0aWMgc3RydWN0IGlibWFzcl9pZCBpYm1hc3JfaWRfdGFibGVbXSBfX2luaXRkYXRhID0gewogCXsgIklCTSBBdXRvbWF0aWMgU2VydmVyIFJlc3RhcnQgLSBlc2VydmVyIHhTZXJpZXMgMjIwIiwgQVNNVFlQRV9UT1BBWiB9LAogCXsgIklCTSBBdXRvbWF0aWMgU2VydmVyIFJlc3RhcnQgLSBNYWNoaW5lIFR5cGUgODY3MyIsIEFTTVRZUEVfUEVBUkwgfSwKIAl7ICJJQk0gQXV0b21hdGljIFNlcnZlciBSZXN0YXJ0IC0gTWFjaGluZSBUeXBlIDg0ODAiLCBBU01UWVBFX0pBU1BFUiB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9pbmR5ZG9nLmMgYi9kcml2ZXJzL3dhdGNoZG9nL2luZHlkb2cuYwppbmRleCAxYjVjMjVhLi41ZDIwY2RkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2luZHlkb2cuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2luZHlkb2cuYwpAQCAtNDEsMjQgKzQxLDE1IEBACiAKIHN0YXRpYyB2b2lkIGluZHlkb2dfc3RhcnQodm9pZCkKIHsKLQl1MzIgbWNfY3RybDA7Ci0KIAlzcGluX2xvY2soJmluZHlkb2dfbG9jayk7Ci0JbWNfY3RybDAgPSBzZ2ltYy0+Y3B1Y3RybDA7Ci0JbWNfY3RybDAgPSBzZ2ltYy0+Y3B1Y3RybDAgfCBTR0lNQ19DQ1RSTDBfV0RPRzsKLQlzZ2ltYy0+Y3B1Y3RybDAgPSBtY19jdHJsMDsKKwlzZ2ltYy0+Y3B1Y3RybDAgfD0gU0dJTUNfQ0NUUkwwX1dET0c7CiAJc3Bpbl91bmxvY2soJmluZHlkb2dfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIGluZHlkb2dfc3RvcCh2b2lkKQogewotCXUzMiBtY19jdHJsMDsKLQogCXNwaW5fbG9jaygmaW5keWRvZ19sb2NrKTsKLQotCW1jX2N0cmwwID0gc2dpbWMtPmNwdWN0cmwwOwotCW1jX2N0cmwwICY9IH5TR0lNQ19DQ1RSTDBfV0RPRzsKLQlzZ2ltYy0+Y3B1Y3RybDAgPSBtY19jdHJsMDsKKwlzZ2ltYy0+Y3B1Y3RybDAgJj0gflNHSU1DX0NDVFJMMF9XRE9HOwogCXNwaW5fdW5sb2NrKCZpbmR5ZG9nX2xvY2spOwogCiAJcHJfaW5mbygiU3RvcHBlZCB3YXRjaGRvZyB0aW1lclxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2ludGVsX3NjdV93YXRjaGRvZy5jIGIvZHJpdmVycy93YXRjaGRvZy9pbnRlbF9zY3Vfd2F0Y2hkb2cuYwppbmRleCBlMTNlNjVlLi4wY2FhYjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2ludGVsX3NjdV93YXRjaGRvZy5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvaW50ZWxfc2N1X3dhdGNoZG9nLmMKQEAgLTIxMSw3ICsyMTEsNiBAQAogCWludAkJCSBpcGNfcmV0OwogCWludAkJCSByZXRyeV9jb3VudDsKIAl1MzIJCQkgc29mdF92YWx1ZTsKLQl1MzIJCQkgaHdfcHJlX3ZhbHVlOwogCXUzMgkJCSBod192YWx1ZTsKIAogCXdhdGNoZG9nX2RldmljZS50aW1lcl9zZXQgPSB0OwpAQCAtMjczLDggKzI3Miw3IEBACiAJCQl3YXRjaGRvZ19kZXZpY2UudGltZXJfbG9hZF9jb3VudF9hZGRyKTsKIAogCQkvKiByZWFkIGNvdW50IHZhbHVlIGJlZm9yZSBzdGFydGluZyB0aW1lciAqLwotCQlod19wcmVfdmFsdWUgPSBpb3JlYWQzMih3YXRjaGRvZ19kZXZpY2UudGltZXJfbG9hZF9jb3VudF9hZGRyKTsKLQkJaHdfcHJlX3ZhbHVlID0gaHdfcHJlX3ZhbHVlICYgMHhGRkZGMDAwMDsKKwkJaW9yZWFkMzIod2F0Y2hkb2dfZGV2aWNlLnRpbWVyX2xvYWRfY291bnRfYWRkcik7CiAKIAkJLyogU3RhcnQgdGhlIHRpbWVyICovCiAJCWlvd3JpdGUzMigweDAwMDAwMDAzLCB3YXRjaGRvZ19kZXZpY2UudGltZXJfY29udHJvbF9hZGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvaXQ4N193ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvaXQ4N193ZHQuYwppbmRleCBlMmJiYTY4Li4wYjkzNzM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2l0ODdfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9pdDg3X3dkdC5jCkBAIC01NCw2ICs1NCw3IEBACiAKIC8qIERlZmF1bHRzIGZvciBNb2R1bGUgUGFyYW1ldGVyICovCiAjZGVmaW5lIERFRkFVTFRfTk9HQU1FUE9SVAkwCisjZGVmaW5lIERFRkFVTFRfTk9DSVIJCTAKICNkZWZpbmUgREVGQVVMVF9FWENMVVNJVkUJMQogI2RlZmluZSBERUZBVUxUX1RJTUVPVVQJCTYwCiAjZGVmaW5lIERFRkFVTFRfVEVTVE1PREUJMApAQCAtMTM2LDExICsxMzcsMTMgQEAKICNkZWZpbmUgV0RUU19MT0NLRUQJMwogI2RlZmluZSBXRFRTX1VTRV9HUAk0CiAjZGVmaW5lIFdEVFNfRVhQRUNURUQJNQorI2RlZmluZSBXRFRTX1VTRV9DSVIJNgogCiBzdGF0aWMJdW5zaWduZWQgaW50IGJhc2UsIGdwYWN0LCBjaXJhY3QsIG1heF91bml0cywgY2hpcF90eXBlOwogc3RhdGljCXVuc2lnbmVkIGxvbmcgd2R0X3N0YXR1czsKIAogc3RhdGljCWludCBub2dhbWVwb3J0ID0gREVGQVVMVF9OT0dBTUVQT1JUOworc3RhdGljIGludCBub2NpciAgICAgID0gREVGQVVMVF9OT0NJUjsKIHN0YXRpYwlpbnQgZXhjbHVzaXZlICA9IERFRkFVTFRfRVhDTFVTSVZFOwogc3RhdGljCWludCB0aW1lb3V0ICAgID0gREVGQVVMVF9USU1FT1VUOwogc3RhdGljCWludCB0ZXN0bW9kZSAgID0gREVGQVVMVF9URVNUTU9ERTsKQEAgLTE0OSw2ICsxNTIsOSBAQAogbW9kdWxlX3BhcmFtKG5vZ2FtZXBvcnQsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG5vZ2FtZXBvcnQsICJGb3JiaWQgdGhlIGFjdGl2YXRpb24gb2YgZ2FtZSBwb3J0LCBkZWZhdWx0PSIKIAkJX19NT0RVTEVfU1RSSU5HKERFRkFVTFRfTk9HQU1FUE9SVCkpOworbW9kdWxlX3BhcmFtKG5vY2lyLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub2NpciwgIkZvcmJpZCB0aGUgdXNlIG9mIENvbnN1bWVyIElSIGludGVycnVwdHMgdG8gcmVzZXQgdGltZXIsIGRlZmF1bHQ9IgorCQlfX01PRFVMRV9TVFJJTkcoREVGQVVMVF9OT0NJUikpOwogbW9kdWxlX3BhcmFtKGV4Y2x1c2l2ZSwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZXhjbHVzaXZlLCAiV2F0Y2hkb2cgZXhjbHVzaXZlIGRldmljZSBvcGVuLCBkZWZhdWx0PSIKIAkJX19NT0RVTEVfU1RSSU5HKERFRkFVTFRfRVhDTFVTSVZFKSk7CkBAIC0yNTgsOSArMjY0LDE3IEBACiB7CiAJaWYgKHRlc3RfYml0KFdEVFNfVVNFX0dQLCAmd2R0X3N0YXR1cykpCiAJCWluYihiYXNlKTsKLQllbHNlCisJZWxzZSBpZiAodGVzdF9iaXQoV0RUU19VU0VfQ0lSLCAmd2R0X3N0YXR1cykpCiAJCS8qIFRoZSB0aW1lciByZWxvYWRzIHdpdGggYXJvdW5kIDUgbXNlYyBkZWxheSAqLwogCQlvdXRiKDB4NTUsIENJUl9EUihiYXNlKSk7CisJZWxzZSB7CisJCWlmIChzdXBlcmlvX2VudGVyKCkpCisJCQlyZXR1cm47CisKKwkJc3VwZXJpb19zZWxlY3QoR1BJTyk7CisJCXdkdF91cGRhdGVfdGltZW91dCgpOworCQlzdXBlcmlvX2V4aXQoKTsKKwl9CiAJc2V0X2JpdChXRFRTX0tFRVBBTElWRSwgJndkdF9zdGF0dXMpOwogfQogCkBAIC0yNzMsNyArMjg3LDcgQEAKIAlzdXBlcmlvX3NlbGVjdChHUElPKTsKIAlpZiAodGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkKIAkJc3VwZXJpb19vdXRiKFdEVF9HQU1FUE9SVCwgV0RUQ1RSTCk7Ci0JZWxzZQorCWVsc2UgaWYgKHRlc3RfYml0KFdEVFNfVVNFX0NJUiwgJndkdF9zdGF0dXMpKQogCQlzdXBlcmlvX291dGIoV0RUX0NJUklOVCwgV0RUQ1RSTCk7CiAJd2R0X3VwZGF0ZV90aW1lb3V0KCk7CiAKQEAgLTY2MCw3ICs2NzQsNyBAQAogCX0KIAogCS8qIElmIHdlIGhhdmVuJ3QgR2FtZXBvcnQgc3VwcG9ydCwgdHJ5IHRvIGdldCBDSVIgc3VwcG9ydCAqLwotCWlmICghdGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkgeworCWlmICghbm9jaXIgJiYgIXRlc3RfYml0KFdEVFNfVVNFX0dQLCAmd2R0X3N0YXR1cykpIHsKIAkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihDSVJfQkFTRSwgOCwgV0FUQ0hET0dfTkFNRSkpIHsKIAkJCWlmIChncF9ycmVxX2ZhaWwpCiAJCQkJcHJfZXJyKCJJL08gQWRkcmVzcyAweCUwNHggYW5kIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwKQEAgLTY4Miw2ICs2OTYsNyBAQAogCQkJc3VwZXJpb19zZWxlY3QoR0FNRVBPUlQpOwogCQkJc3VwZXJpb19vdXRiKGdwYWN0LCBBQ1RSRUcpOwogCQl9CisJCXNldF9iaXQoV0RUU19VU0VfQ0lSLCAmd2R0X3N0YXR1cyk7CiAJfQogCiAJaWYgKHRpbWVvdXQgPCAxIHx8IHRpbWVvdXQgPiBtYXhfdW5pdHMgKiA2MCkgewpAQCAtNzA3LDcgKzcyMiw3IEBACiAJfQogCiAJLyogSW5pdGlhbGl6ZSBDSVIgdG8gdXNlIGl0IGFzIGtlZXBhbGl2ZSBzb3VyY2UgKi8KLQlpZiAoIXRlc3RfYml0KFdEVFNfVVNFX0dQLCAmd2R0X3N0YXR1cykpIHsKKwlpZiAodGVzdF9iaXQoV0RUU19VU0VfQ0lSLCAmd2R0X3N0YXR1cykpIHsKIAkJb3V0YigweDAwLCBDSVJfUkNSKGJhc2UpKTsKIAkJb3V0YigweGMwLCBDSVJfVENSMShiYXNlKSk7CiAJCW91dGIoMHg1YywgQ0lSX1RDUjIoYmFzZSkpOwpAQCAtNzE3LDkgKzczMiw5IEBACiAJCW91dGIoMHgwOSwgQ0lSX0lFUihiYXNlKSk7CiAJfQogCi0JcHJfaW5mbygiQ2hpcCBJVCUwNHggcmV2aXNpb24gJWQgaW5pdGlhbGl6ZWQuIHRpbWVvdXQ9JWQgc2VjIChub3dheW91dD0lZCB0ZXN0bW9kZT0lZCBleGNsdXNpdmU9JWQgbm9nYW1lcG9ydD0lZClcbiIsCisJcHJfaW5mbygiQ2hpcCBJVCUwNHggcmV2aXNpb24gJWQgaW5pdGlhbGl6ZWQuIHRpbWVvdXQ9JWQgc2VjIChub3dheW91dD0lZCB0ZXN0bW9kZT0lZCBleGNsdXNpdmU9JWQgbm9nYW1lcG9ydD0lZCBub2Npcj0lZClcbiIsCiAJCWNoaXBfdHlwZSwgY2hpcF9yZXYsIHRpbWVvdXQsCi0JCW5vd2F5b3V0LCB0ZXN0bW9kZSwgZXhjbHVzaXZlLCBub2dhbWVwb3J0KTsKKwkJbm93YXlvdXQsIHRlc3Rtb2RlLCBleGNsdXNpdmUsIG5vZ2FtZXBvcnQsIG5vY2lyKTsKIAogCXN1cGVyaW9fZXhpdCgpOwogCXJldHVybiAwOwpAQCAtNzI3LDggKzc0MiwxMCBAQAogZXJyX291dF9yZWJvb3Q6CiAJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CiBlcnJfb3V0X3JlZ2lvbjoKLQlyZWxlYXNlX3JlZ2lvbihiYXNlLCB0ZXN0X2JpdChXRFRTX1VTRV9HUCwgJndkdF9zdGF0dXMpID8gMSA6IDgpOwotCWlmICghdGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkgeworCWlmICh0ZXN0X2JpdChXRFRTX1VTRV9HUCwgJndkdF9zdGF0dXMpKQorCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCAxKTsKKwllbHNlIGlmICh0ZXN0X2JpdChXRFRTX1VTRV9DSVIsICZ3ZHRfc3RhdHVzKSkgeworCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCA4KTsKIAkJc3VwZXJpb19zZWxlY3QoQ0lSKTsKIAkJc3VwZXJpb19vdXRiKGNpcmFjdCwgQUNUUkVHKTsKIAl9CkBAIC03NTQsNyArNzcxLDcgQEAKIAkJaWYgKHRlc3RfYml0KFdEVFNfVVNFX0dQLCAmd2R0X3N0YXR1cykpIHsKIAkJCXN1cGVyaW9fc2VsZWN0KEdBTUVQT1JUKTsKIAkJCXN1cGVyaW9fb3V0YihncGFjdCwgQUNUUkVHKTsKLQkJfSBlbHNlIHsKKwkJfSBlbHNlIGlmICh0ZXN0X2JpdChXRFRTX1VTRV9DSVIsICZ3ZHRfc3RhdHVzKSkgewogCQkJc3VwZXJpb19zZWxlY3QoQ0lSKTsKIAkJCXN1cGVyaW9fb3V0YihjaXJhY3QsIEFDVFJFRyk7CiAJCX0KQEAgLTc2Myw3ICs3ODAsMTEgQEAKIAogCW1pc2NfZGVyZWdpc3Rlcigmd2R0X21pc2NkZXYpOwogCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOwotCXJlbGVhc2VfcmVnaW9uKGJhc2UsIHRlc3RfYml0KFdEVFNfVVNFX0dQLCAmd2R0X3N0YXR1cykgPyAxIDogOCk7CisKKwlpZiAodGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkKKwkJcmVsZWFzZV9yZWdpb24oYmFzZSwgMSk7CisJZWxzZSBpZiAodGVzdF9iaXQoV0RUU19VU0VfQ0lSLCAmd2R0X3N0YXR1cykpCisJCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDgpOwogfQogCiBtb2R1bGVfaW5pdChpdDg3X3dkdF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvano0NzQwX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9qejQ3NDBfd2R0LmMKaW5kZXggM2FhNTBjZi4uOTFlNDVjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9qejQ3NDBfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9qejQ3NDBfd2R0LmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL21heDYzeHhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL21heDYzeHhfd2R0LmMKaW5kZXggYmRiM2Y0YS4uMGU5Y2M2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9tYXg2M3h4X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvbWF4NjN4eF93ZHQuYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvbXBjOHh4eF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvbXBjOHh4eF93ZHQuYwppbmRleCBjMWY2NWI0Li43ODMxOTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL21wYzh4eHhfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9tcGM4eHh4X3dkdC5jCkBAIC0yMzcsNiArMjM3LDcgQEAKIAkJLmNvbXBhdGlibGUgPSAiZnNsLG1wYzgyMy13ZHQiLAogCQkuZGF0YSA9ICYoc3RydWN0IG1wYzh4eHhfd2R0X3R5cGUpIHsKIAkJCS5wcmVzY2FsZXIgPSAweDgwMCwKKwkJCS5od19lbmFibGVkID0gdHJ1ZSwKIAkJfSwKIAl9LAogCXt9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9tdHgtMV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvbXR4LTFfd2R0LmMKaW5kZXggZWRiMzFmZi4uZmYyN2M0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9tdHgtMV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL210eC0xX3dkdC5jCkBAIC00MCw3ICs0MCw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL251YzkwMF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvbnVjOTAwX3dkdC5jCmluZGV4IGEwZDg5M2IuLjcxMzU4MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvbnVjOTAwX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvbnVjOTAwX3dkdC5jCkBAIC0xMiw3ICsxMiw2IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9vZl94aWxpbnhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL29mX3hpbGlueF93ZHQuYwppbmRleCBmYjU3MTAzLi41N2NjYWU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL29mX3hpbGlueF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL29mX3hpbGlueF93ZHQuYwpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBXYXRjaGRvZyBEZXZpY2UgRHJpdmVyIGZvciBYaWxpbnggYXhpL3hwc190aW1lYmFzZV93ZHQKICAqCisgKiAoQykgQ29weXJpZ2h0IDIwMTMgLSAyMDE0IFhpbGlueCwgSW5jLgogICogKEMpIENvcHlyaWdodCAyMDExIChBbGVqYW5kcm8gQ2FicmVyYSA8YWxkYXlhQGdtYWlsLmNvbT4pCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtOSwxOCArMTAsMTMgQEAKICAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAotCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KQEAgLTQzLDEwMiArMzksMTAzIEBACiAjZGVmaW5lIFhXVF9USU1FUl9GQUlMRUQgICAgICAgICAgICAweEZGRkZGRkZGCiAKICNkZWZpbmUgV0FUQ0hET0dfTkFNRSAgICAgIlhpbGlueCBXYXRjaGRvZyIKLSNkZWZpbmUgUEZYIFdBVENIRE9HX05BTUUgIjogIgogCiBzdHJ1Y3QgeHdkdF9kZXZpY2UgewotCXN0cnVjdCByZXNvdXJjZSAgcmVzOwogCXZvaWQgX19pb21lbSAqYmFzZTsKLQl1MzIgbm93YXlvdXQ7CiAJdTMyIHdkdF9pbnRlcnZhbDsKLQl1MzIgYm9vdF9zdGF0dXM7CisJc3BpbmxvY2tfdCBzcGlubG9jazsKKwlzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlIHhpbGlueF93ZHRfd2RkOwogfTsKIAotc3RhdGljIHN0cnVjdCB4d2R0X2RldmljZSB4ZGV2OwotCi1zdGF0aWMgIHUzMiB0aW1lb3V0Owotc3RhdGljICB1MzIgY29udHJvbF9zdGF0dXNfcmVnOwotc3RhdGljICB1OCAgZXhwZWN0X2Nsb3NlOwotc3RhdGljICB1OCAgbm9fdGltZW91dDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRyaXZlcl9vcGVuOwotCi1zdGF0aWMgIERFRklORV9TUElOTE9DSyhzcGlubG9jayk7Ci0KLXN0YXRpYyB2b2lkIHh3ZHRfc3RhcnQodm9pZCkKK3N0YXRpYyBpbnQgeGlsaW54X3dkdF9zdGFydChzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQpCiB7Ci0Jc3Bpbl9sb2NrKCZzcGlubG9jayk7CisJdTMyIGNvbnRyb2xfc3RhdHVzX3JlZzsKKwlzdHJ1Y3QgeHdkdF9kZXZpY2UgKnhkZXYgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZGQpOworCisJc3Bpbl9sb2NrKCZ4ZGV2LT5zcGlubG9jayk7CiAKIAkvKiBDbGVhbiBwcmV2aW91cyBzdGF0dXMgYW5kIGVuYWJsZSB0aGUgd2F0Y2hkb2cgdGltZXIgKi8KLQljb250cm9sX3N0YXR1c19yZWcgPSBpb3JlYWQzMih4ZGV2LmJhc2UgKyBYV1RfVFdDU1IwX09GRlNFVCk7CisJY29udHJvbF9zdGF0dXNfcmVnID0gaW9yZWFkMzIoeGRldi0+YmFzZSArIFhXVF9UV0NTUjBfT0ZGU0VUKTsKIAljb250cm9sX3N0YXR1c19yZWcgfD0gKFhXVF9DU1IwX1dSU19NQVNLIHwgWFdUX0NTUjBfV0RTX01BU0spOwogCiAJaW93cml0ZTMyKChjb250cm9sX3N0YXR1c19yZWcgfCBYV1RfQ1NSMF9FV0RUMV9NQVNLKSwKLQkJCQl4ZGV2LmJhc2UgKyBYV1RfVFdDU1IwX09GRlNFVCk7CisJCSAgeGRldi0+YmFzZSArIFhXVF9UV0NTUjBfT0ZGU0VUKTsKIAotCWlvd3JpdGUzMihYV1RfQ1NSWF9FV0RUMl9NQVNLLCB4ZGV2LmJhc2UgKyBYV1RfVFdDU1IxX09GRlNFVCk7CisJaW93cml0ZTMyKFhXVF9DU1JYX0VXRFQyX01BU0ssIHhkZXYtPmJhc2UgKyBYV1RfVFdDU1IxX09GRlNFVCk7CiAKLQlzcGluX3VubG9jaygmc3BpbmxvY2spOworCXNwaW5fdW5sb2NrKCZ4ZGV2LT5zcGlubG9jayk7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgeHdkdF9zdG9wKHZvaWQpCitzdGF0aWMgaW50IHhpbGlueF93ZHRfc3RvcChzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQpCiB7Ci0Jc3Bpbl9sb2NrKCZzcGlubG9jayk7CisJdTMyIGNvbnRyb2xfc3RhdHVzX3JlZzsKKwlzdHJ1Y3QgeHdkdF9kZXZpY2UgKnhkZXYgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZGQpOwogCi0JY29udHJvbF9zdGF0dXNfcmVnID0gaW9yZWFkMzIoeGRldi5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOworCXNwaW5fbG9jaygmeGRldi0+c3BpbmxvY2spOworCisJY29udHJvbF9zdGF0dXNfcmVnID0gaW9yZWFkMzIoeGRldi0+YmFzZSArIFhXVF9UV0NTUjBfT0ZGU0VUKTsKIAogCWlvd3JpdGUzMigoY29udHJvbF9zdGF0dXNfcmVnICYgflhXVF9DU1IwX0VXRFQxX01BU0spLAotCQkJCXhkZXYuYmFzZSArIFhXVF9UV0NTUjBfT0ZGU0VUKTsKKwkJICB4ZGV2LT5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOwogCi0JaW93cml0ZTMyKDAsIHhkZXYuYmFzZSArIFhXVF9UV0NTUjFfT0ZGU0VUKTsKKwlpb3dyaXRlMzIoMCwgeGRldi0+YmFzZSArIFhXVF9UV0NTUjFfT0ZGU0VUKTsKIAotCXNwaW5fdW5sb2NrKCZzcGlubG9jayk7CisJc3Bpbl91bmxvY2soJnhkZXYtPnNwaW5sb2NrKTsKIAlwcl9pbmZvKCJTdG9wcGVkIVxuIik7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgeHdkdF9rZWVwYWxpdmUodm9pZCkKK3N0YXRpYyBpbnQgeGlsaW54X3dkdF9rZWVwYWxpdmUoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkKQogewotCXNwaW5fbG9jaygmc3BpbmxvY2spOworCXUzMiBjb250cm9sX3N0YXR1c19yZWc7CisJc3RydWN0IHh3ZHRfZGV2aWNlICp4ZGV2ID0gd2F0Y2hkb2dfZ2V0X2RydmRhdGEod2RkKTsKIAotCWNvbnRyb2xfc3RhdHVzX3JlZyA9IGlvcmVhZDMyKHhkZXYuYmFzZSArIFhXVF9UV0NTUjBfT0ZGU0VUKTsKKwlzcGluX2xvY2soJnhkZXYtPnNwaW5sb2NrKTsKKworCWNvbnRyb2xfc3RhdHVzX3JlZyA9IGlvcmVhZDMyKHhkZXYtPmJhc2UgKyBYV1RfVFdDU1IwX09GRlNFVCk7CiAJY29udHJvbF9zdGF0dXNfcmVnIHw9IChYV1RfQ1NSMF9XUlNfTUFTSyB8IFhXVF9DU1IwX1dEU19NQVNLKTsKLQlpb3dyaXRlMzIoY29udHJvbF9zdGF0dXNfcmVnLCB4ZGV2LmJhc2UgKyBYV1RfVFdDU1IwX09GRlNFVCk7CisJaW93cml0ZTMyKGNvbnRyb2xfc3RhdHVzX3JlZywgeGRldi0+YmFzZSArIFhXVF9UV0NTUjBfT0ZGU0VUKTsKIAotCXNwaW5fdW5sb2NrKCZzcGlubG9jayk7CisJc3Bpbl91bmxvY2soJnhkZXYtPnNwaW5sb2NrKTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB4d2R0X2dldF9zdGF0dXMoaW50ICpzdGF0dXMpCi17Ci0JaW50IG5ld19zdGF0dXM7CitzdGF0aWMgY29uc3Qgc3RydWN0IHdhdGNoZG9nX2luZm8geGlsaW54X3dkdF9pZGVudCA9IHsKKwkub3B0aW9ucyA9ICBXRElPRl9NQUdJQ0NMT1NFIHwKKwkJICAgIFdESU9GX0tFRVBBTElWRVBJTkcsCisJLmZpcm13YXJlX3ZlcnNpb24gPQkxLAorCS5pZGVudGl0eSA9CVdBVENIRE9HX05BTUUsCit9OwogCi0Jc3Bpbl9sb2NrKCZzcGlubG9jayk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHdhdGNoZG9nX29wcyB4aWxpbnhfd2R0X29wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuc3RhcnQgPSB4aWxpbnhfd2R0X3N0YXJ0LAorCS5zdG9wID0geGlsaW54X3dkdF9zdG9wLAorCS5waW5nID0geGlsaW54X3dkdF9rZWVwYWxpdmUsCit9OwogCi0JY29udHJvbF9zdGF0dXNfcmVnID0gaW9yZWFkMzIoeGRldi5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOwotCW5ld19zdGF0dXMgPSAoKGNvbnRyb2xfc3RhdHVzX3JlZyAmCi0JCQkoWFdUX0NTUjBfV1JTX01BU0sgfCBYV1RfQ1NSMF9XRFNfTUFTSykpICE9IDApOwotCXNwaW5fdW5sb2NrKCZzcGlubG9jayk7Ci0KLQkqc3RhdHVzID0gMDsKLQlpZiAobmV3X3N0YXR1cyAmIDEpCi0JCSpzdGF0dXMgfD0gV0RJT0ZfQ0FSRFJFU0VUOwotfQotCi1zdGF0aWMgdTMyIHh3ZHRfc2VsZnRlc3Qodm9pZCkKK3N0YXRpYyB1MzIgeHdkdF9zZWxmdGVzdChzdHJ1Y3QgeHdkdF9kZXZpY2UgKnhkZXYpCiB7CiAJaW50IGk7CiAJdTMyIHRpbWVyX3ZhbHVlMTsKIAl1MzIgdGltZXJfdmFsdWUyOwogCi0Jc3Bpbl9sb2NrKCZzcGlubG9jayk7CisJc3Bpbl9sb2NrKCZ4ZGV2LT5zcGlubG9jayk7CiAKLQl0aW1lcl92YWx1ZTEgPSBpb3JlYWQzMih4ZGV2LmJhc2UgKyBYV1RfVEJSX09GRlNFVCk7Ci0JdGltZXJfdmFsdWUyID0gaW9yZWFkMzIoeGRldi5iYXNlICsgWFdUX1RCUl9PRkZTRVQpOworCXRpbWVyX3ZhbHVlMSA9IGlvcmVhZDMyKHhkZXYtPmJhc2UgKyBYV1RfVEJSX09GRlNFVCk7CisJdGltZXJfdmFsdWUyID0gaW9yZWFkMzIoeGRldi0+YmFzZSArIFhXVF9UQlJfT0ZGU0VUKTsKIAogCWZvciAoaSA9IDA7CiAJCSgoaSA8PSBYV1RfTUFYX1NFTEZURVNUX0xPT1BfQ09VTlQpICYmCiAJCQkodGltZXJfdmFsdWUyID09IHRpbWVyX3ZhbHVlMSkpOyBpKyspIHsKLQkJdGltZXJfdmFsdWUyID0gaW9yZWFkMzIoeGRldi5iYXNlICsgWFdUX1RCUl9PRkZTRVQpOworCQl0aW1lcl92YWx1ZTIgPSBpb3JlYWQzMih4ZGV2LT5iYXNlICsgWFdUX1RCUl9PRkZTRVQpOwogCX0KIAotCXNwaW5fdW5sb2NrKCZzcGlubG9jayk7CisJc3Bpbl91bmxvY2soJnhkZXYtPnNwaW5sb2NrKTsKIAogCWlmICh0aW1lcl92YWx1ZTIgIT0gdGltZXJfdmFsdWUxKQogCQlyZXR1cm4gflhXVF9USU1FUl9GQUlMRUQ7CkBAIC0xNDYsMjM4ICsxNDMsODMgQEAKIAkJcmV0dXJuIFhXVF9USU1FUl9GQUlMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgeHdkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCS8qIE9ubHkgb25lIHByb2Nlc3MgY2FuIGhhbmRsZSB0aGUgd2R0IGF0IGEgdGltZSAqLwotCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZkcml2ZXJfb3BlbikpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgbW9kdWxlIGFyZSBhbHdheXMgbG9hZGVkLi4uKi8KLQlpZiAoeGRldi5ub3dheW91dCkKLQkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKLQotCXh3ZHRfc3RhcnQoKTsKLQlwcl9pbmZvKCJTdGFydGVkLi4uXG4iKTsKLQotCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKLX0KLQotc3RhdGljIGludCB4d2R0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaWYgKGV4cGVjdF9jbG9zZSA9PSA0MikgewotCQl4d2R0X3N0b3AoKTsKLQl9IGVsc2UgewotCQlwcl9jcml0KCJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgd2F0Y2hkb2chXG4iKTsKLQkJeHdkdF9rZWVwYWxpdmUoKTsKLQl9Ci0KLQljbGVhcl9iaXQoMCwgJmRyaXZlcl9vcGVuKTsKLQlleHBlY3RfY2xvc2UgPSAwOwotCXJldHVybiAwOwotfQotCi0vKgotICogICAgICB4d2R0X3dyaXRlOgotICogICAgICBAZmlsZTogZmlsZSBoYW5kbGUgdG8gdGhlIHdhdGNoZG9nCi0gKiAgICAgIEBidWY6IGJ1ZmZlciB0byB3cml0ZSAodW51c2VkIGFzIGRhdGEgZG9lcyBub3QgbWF0dGVyIGhlcmUKLSAqICAgICAgQGNvdW50OiBjb3VudCBvZiBieXRlcwotICogICAgICBAcHBvczogcG9pbnRlciB0byB0aGUgcG9zaXRpb24gdG8gd3JpdGUuIE5vIHNlZWtzIGFsbG93ZWQKLSAqCi0gKiAgICAgIEEgd3JpdGUgdG8gYSB3YXRjaGRvZyBkZXZpY2UgaXMgZGVmaW5lZCBhcyBhIGtlZXBhbGl2ZSBzaWduYWwuIEFueQotICogICAgICB3cml0ZSBvZiBkYXRhIHdpbGwgZG8sIGFzIHdlIGRvbid0IGRlZmluZSBjb250ZW50IG1lYW5pbmcuCi0gKi8KLXN0YXRpYyBzc2l6ZV90IHh3ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCi17Ci0JaWYgKGxlbikgewotCQlpZiAoIXhkZXYubm93YXlvdXQpIHsKLQkJCXNpemVfdCBpOwotCi0JCQkvKiBJbiBjYXNlIGl0IHdhcyBzZXQgbG9uZyBhZ28gKi8KLQkJCWV4cGVjdF9jbG9zZSA9IDA7Ci0KLQkJCWZvciAoaSA9IDA7IGkgIT0gbGVuOyBpKyspIHsKLQkJCQljaGFyIGM7Ci0KLQkJCQlpZiAoZ2V0X3VzZXIoYywgYnVmICsgaSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCWlmIChjID09ICdWJykKLQkJCQkJZXhwZWN0X2Nsb3NlID0gNDI7Ci0JCQl9Ci0JCX0KLQkJeHdkdF9rZWVwYWxpdmUoKTsKLQl9Ci0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0gewotCS5vcHRpb25zID0gIFdESU9GX01BR0lDQ0xPU0UgfAotCQkgICAgV0RJT0ZfS0VFUEFMSVZFUElORywKLQkuZmlybXdhcmVfdmVyc2lvbiA9CTEsCi0JLmlkZW50aXR5ID0JV0FUQ0hET0dfTkFNRSwKLX07Ci0KLS8qCi0gKiAgICAgIHh3ZHRfaW9jdGw6Ci0gKiAgICAgIEBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgZGV2aWNlCi0gKiAgICAgIEBjbWQ6IHdhdGNoZG9nIGNvbW1hbmQKLSAqICAgICAgQGFyZzogYXJndW1lbnQgcG9pbnRlcgotICoKLSAqICAgICAgVGhlIHdhdGNoZG9nIEFQSSBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBmdW5jdGlvbnMgZm9yIGFsbCB3YXRjaGRvZ3MKLSAqICAgICAgYWNjb3JkaW5nIHRvIHRoZWlyIGF2YWlsYWJsZSBmZWF0dXJlcy4KLSAqLwotc3RhdGljIGxvbmcgeHdkdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JaW50IHN0YXR1czsKLQotCXVuaW9uIHsKLQkJc3RydWN0IHdhdGNoZG9nX2luZm8gX191c2VyICppZGVudDsKLQkJaW50IF9fdXNlciAqaTsKLQl9IHVhcmc7Ci0KLQl1YXJnLmkgPSAoaW50IF9fdXNlciAqKWFyZzsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBXRElPQ19HRVRTVVBQT1JUOgotCQlyZXR1cm4gY29weV90b191c2VyKHVhcmcuaWRlbnQsICZpZGVudCwKLQkJCQkJc2l6ZW9mKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKLQotCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKLQkJcmV0dXJuIHB1dF91c2VyKHhkZXYuYm9vdF9zdGF0dXMsIHVhcmcuaSk7Ci0KLQljYXNlIFdESU9DX0dFVFNUQVRVUzoKLQkJeHdkdF9nZXRfc3RhdHVzKCZzdGF0dXMpOwotCQlyZXR1cm4gcHV0X3VzZXIoc3RhdHVzLCB1YXJnLmkpOwotCi0JY2FzZSBXRElPQ19LRUVQQUxJVkU6Ci0JCXh3ZHRfa2VlcGFsaXZlKCk7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBXRElPQ19HRVRUSU1FT1VUOgotCQlpZiAobm9fdGltZW91dCkKLQkJCXJldHVybiAtRU5PVFRZOwotCQllbHNlCi0JCQlyZXR1cm4gcHV0X3VzZXIodGltZW91dCwgdWFyZy5pKTsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PVFRZOwotCX0KLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeHdkdF9mb3BzID0gewotCS5vd25lciAgICAgID0gVEhJU19NT0RVTEUsCi0JLmxsc2VlayAgICAgPSBub19sbHNlZWssCi0JLndyaXRlICAgICAgPSB4d2R0X3dyaXRlLAotCS5vcGVuICAgICAgID0geHdkdF9vcGVuLAotCS5yZWxlYXNlICAgID0geHdkdF9yZWxlYXNlLAotCS51bmxvY2tlZF9pb2N0bCA9IHh3ZHRfaW9jdGwsCi19OwotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgeHdkdF9taXNjZGV2ID0gewotCS5taW5vciAgICAgID0gV0FUQ0hET0dfTUlOT1IsCi0JLm5hbWUgICAgICAgPSAid2F0Y2hkb2ciLAotCS5mb3BzICAgICAgID0gJnh3ZHRfZm9wcywKLX07Ci0KIHN0YXRpYyBpbnQgeHdkdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWludCByYzsKLQl1MzIgKnRtcHRyOwotCXUzMiAqcGZyZXE7CisJdTMyIHBmcmVxID0gMCwgZW5hYmxlX29uY2UgPSAwOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCB4d2R0X2RldmljZSAqeGRldjsKKwlzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp4aWxpbnhfd2R0X3dkZDsKIAotCW5vX3RpbWVvdXQgPSAwOworCXhkZXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCp4ZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF4ZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKIAotCXBmcmVxID0gKHUzMiAqKW9mX2dldF9wcm9wZXJ0eShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOworCXhpbGlueF93ZHRfd2RkID0gJnhkZXYtPnhpbGlueF93ZHRfd2RkOworCXhpbGlueF93ZHRfd2RkLT5pbmZvID0gJnhpbGlueF93ZHRfaWRlbnQ7CisJeGlsaW54X3dkdF93ZGQtPm9wcyA9ICZ4aWxpbnhfd2R0X29wczsKKwl4aWxpbnhfd2R0X3dkZC0+cGFyZW50ID0gJnBkZXYtPmRldjsKIAotCWlmIChwZnJlcSA9PSBOVUxMKSB7Ci0JCXByX3dhcm4oIlRoZSB3YXRjaGRvZyBjbG9jayBmcmVxdWVuY3kgY2Fubm90IGJlIG9idGFpbmVkIVxuIik7Ci0JCW5vX3RpbWVvdXQgPSAxOwotCX0KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXhkZXYtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHhkZXYtPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUih4ZGV2LT5iYXNlKTsKIAotCXJjID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShwZGV2LT5kZXYub2Zfbm9kZSwgMCwgJnhkZXYucmVzKTsKLQlpZiAocmMpIHsKLQkJcHJfd2FybigiaW52YWxpZCBhZGRyZXNzIVxuIik7CisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgImNsb2NrLWZyZXF1ZW5jeSIsICZwZnJlcSk7CisJaWYgKHJjKQorCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJICJUaGUgd2F0Y2hkb2cgY2xvY2sgZnJlcXVlbmN5IGNhbm5vdCBiZSBvYnRhaW5lZFxuIik7CisKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAieGxueCx3ZHQtaW50ZXJ2YWwiLAorCQkJCSAgJnhkZXYtPndkdF9pbnRlcnZhbCk7CisJaWYgKHJjKQorCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJICJQYXJhbWV0ZXIgXCJ4bG54LHdkdC1pbnRlcnZhbFwiIG5vdCBmb3VuZFxuIik7CisKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAieGxueCx3ZHQtZW5hYmxlLW9uY2UiLAorCQkJCSAgJmVuYWJsZV9vbmNlKTsKKwlpZiAocmMpCisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIlBhcmFtZXRlciBcInhsbngsd2R0LWVuYWJsZS1vbmNlXCIgbm90IGZvdW5kXG4iKTsKKworCXdhdGNoZG9nX3NldF9ub3dheW91dCh4aWxpbnhfd2R0X3dkZCwgZW5hYmxlX29uY2UpOworCisJLyoKKwkgKiBUd2ljZSBvZiB0aGUgMl53ZHRfaW50ZXJ2YWwgLyBmcmVxICBiZWNhdXNlIHRoZSBmaXJzdCB3ZHQgb3ZlcmZsb3cgaXMKKwkgKiBpZ25vcmVkIChpbnRlcnJ1cHQpLCByZXNldCBpcyBvbmx5IGdlbmVyYXRlZCBhdCBzZWNvbmQgd2R0IG92ZXJmbG93CisJICovCisJaWYgKHBmcmVxICYmIHhkZXYtPndkdF9pbnRlcnZhbCkKKwkJeGlsaW54X3dkdF93ZGQtPnRpbWVvdXQgPSAyICogKCgxIDw8IHhkZXYtPndkdF9pbnRlcnZhbCkgLworCQkJCQkgIHBmcmVxKTsKKworCXNwaW5fbG9ja19pbml0KCZ4ZGV2LT5zcGlubG9jayk7CisJd2F0Y2hkb2dfc2V0X2RydmRhdGEoeGlsaW54X3dkdF93ZGQsIHhkZXYpOworCisJcmMgPSB4d2R0X3NlbGZ0ZXN0KHhkZXYpOworCWlmIChyYyA9PSBYV1RfVElNRVJfRkFJTEVEKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlNlbGZUZXN0IHJvdXRpbmUgZXJyb3JcbiIpOwogCQlyZXR1cm4gcmM7CiAJfQogCi0JdG1wdHIgPSAodTMyICopb2ZfZ2V0X3Byb3BlcnR5KHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCQkieGxueCx3ZHQtaW50ZXJ2YWwiLCBOVUxMKTsKLQlpZiAodG1wdHIgPT0gTlVMTCkgewotCQlwcl93YXJuKCJQYXJhbWV0ZXIgXCJ4bG54LHdkdC1pbnRlcnZhbFwiIG5vdCBmb3VuZCBpbiBkZXZpY2UgdHJlZSFcbiIpOwotCQlub190aW1lb3V0ID0gMTsKLQl9IGVsc2UgewotCQl4ZGV2LndkdF9pbnRlcnZhbCA9ICp0bXB0cjsKLQl9Ci0KLQl0bXB0ciA9ICh1MzIgKilvZl9nZXRfcHJvcGVydHkocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJCSJ4bG54LHdkdC1lbmFibGUtb25jZSIsIE5VTEwpOwotCWlmICh0bXB0ciA9PSBOVUxMKSB7Ci0JCXByX3dhcm4oIlBhcmFtZXRlciBcInhsbngsd2R0LWVuYWJsZS1vbmNlXCIgbm90IGZvdW5kIGluIGRldmljZSB0cmVlIVxuIik7Ci0JCXhkZXYubm93YXlvdXQgPSBXQVRDSERPR19OT1dBWU9VVDsKLQl9Ci0KLS8qCi0gKiAgVHdpY2Ugb2YgdGhlIDJed2R0X2ludGVydmFsIC8gZnJlcSAgYmVjYXVzZSB0aGUgZmlyc3Qgd2R0IG92ZXJmbG93IGlzCi0gKiAgaWdub3JlZCAoaW50ZXJydXB0KSwgcmVzZXQgaXMgb25seSBnZW5lcmF0ZWQgYXQgc2Vjb25kIHdkdCBvdmVyZmxvdwotICovCi0JaWYgKCFub190aW1lb3V0KQotCQl0aW1lb3V0ID0gMiAqICgoMTw8eGRldi53ZHRfaW50ZXJ2YWwpIC8gKnBmcmVxKTsKLQotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHhkZXYucmVzLnN0YXJ0LAotCQkJeGRldi5yZXMuZW5kIC0geGRldi5yZXMuc3RhcnQgKyAxLCBXQVRDSERPR19OQU1FKSkgewotCQlyYyA9IC1FTlhJTzsKLQkJcHJfZXJyKCJtZW1vcnkgcmVxdWVzdCBmYWlsdXJlIVxuIik7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQl4ZGV2LmJhc2UgPSBpb3JlbWFwKHhkZXYucmVzLnN0YXJ0LCB4ZGV2LnJlcy5lbmQgLSB4ZGV2LnJlcy5zdGFydCArIDEpOwotCWlmICh4ZGV2LmJhc2UgPT0gTlVMTCkgewotCQlyYyA9IC1FTk9NRU07Ci0JCXByX2VycigiaW9yZW1hcCBmYWlsdXJlIVxuIik7Ci0JCWdvdG8gcmVsZWFzZV9tZW07Ci0JfQotCi0JcmMgPSB4d2R0X3NlbGZ0ZXN0KCk7Ci0JaWYgKHJjID09IFhXVF9USU1FUl9GQUlMRUQpIHsKLQkJcHJfZXJyKCJTZWxmVGVzdCByb3V0aW5lIGVycm9yIVxuIik7Ci0JCWdvdG8gdW5tYXBfaW87Ci0JfQotCi0JeHdkdF9nZXRfc3RhdHVzKCZ4ZGV2LmJvb3Rfc3RhdHVzKTsKLQotCXJjID0gbWlzY19yZWdpc3RlcigmeHdkdF9taXNjZGV2KTsKKwlyYyA9IHdhdGNoZG9nX3JlZ2lzdGVyX2RldmljZSh4aWxpbnhfd2R0X3dkZCk7CiAJaWYgKHJjKSB7Ci0JCXByX2VycigiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCi0JCSAgICAgICB4d2R0X21pc2NkZXYubWlub3IsIHJjKTsKLQkJZ290byB1bm1hcF9pbzsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHJlZ2lzdGVyIHdhdGNoZG9nIChlcnI9JWQpXG4iLCByYyk7CisJCXJldHVybiByYzsKIAl9CiAKLQlpZiAobm9fdGltZW91dCkKLQkJcHJfaW5mbygiZHJpdmVyIGxvYWRlZCAodGltZW91dD0/IHNlYywgbm93YXlvdXQ9JWQpXG4iLAotCQkJeGRldi5ub3dheW91dCk7Ci0JZWxzZQotCQlwcl9pbmZvKCJkcml2ZXIgbG9hZGVkICh0aW1lb3V0PSVkIHNlYywgbm93YXlvdXQ9JWQpXG4iLAotCQkJdGltZW91dCwgeGRldi5ub3dheW91dCk7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgIlhpbGlueCBXYXRjaGRvZyBUaW1lciBhdCAlcCB3aXRoIHRpbWVvdXQgJWRzXG4iLAorCQkgeGRldi0+YmFzZSwgeGlsaW54X3dkdF93ZGQtPnRpbWVvdXQpOwogCi0JZXhwZWN0X2Nsb3NlID0gMDsKLQljbGVhcl9iaXQoMCwgJmRyaXZlcl9vcGVuKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB4ZGV2KTsKIAogCXJldHVybiAwOwotCi11bm1hcF9pbzoKLQlpb3VubWFwKHhkZXYuYmFzZSk7Ci1yZWxlYXNlX21lbToKLQlyZWxlYXNlX21lbV9yZWdpb24oeGRldi5yZXMuc3RhcnQsIHJlc291cmNlX3NpemUoJnhkZXYucmVzKSk7Ci1lcnJfb3V0OgotCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCB4d2R0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHh3ZHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JbWlzY19kZXJlZ2lzdGVyKCZ4d2R0X21pc2NkZXYpOwotCWlvdW5tYXAoeGRldi5iYXNlKTsKLQlyZWxlYXNlX21lbV9yZWdpb24oeGRldi5yZXMuc3RhcnQsIHJlc291cmNlX3NpemUoJnhkZXYucmVzKSk7CisJc3RydWN0IHh3ZHRfZGV2aWNlICp4ZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwl3YXRjaGRvZ191bnJlZ2lzdGVyX2RldmljZSgmeGRldi0+eGlsaW54X3dkdF93ZGQpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL29tYXBfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL29tYXBfd2R0LmMKaW5kZXggMDljZjAxMy4uMzY5MWIxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9vbWFwX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvb21hcF93ZHQuYwpAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KQEAgLTU4LDcgKzU3LDYgQEAKIAl2b2lkIF9faW9tZW0gICAgKmJhc2U7ICAgICAgICAgIC8qIHBoeXNpY2FsICovCiAJc3RydWN0IGRldmljZSAgICpkZXY7CiAJYm9vbAkJb21hcF93ZHRfdXNlcnM7Ci0Jc3RydWN0IHJlc291cmNlICptZW07CiAJaW50CQl3ZHRfdHJncl9wYXR0ZXJuOwogCXN0cnVjdCBtdXRleAlsb2NrOwkJLyogdG8gYXZvaWQgcmFjZXMgd2l0aCBQTSAqLwogfTsKQEAgLTIwNyw3ICsyMDUsNyBAQAogewogCXN0cnVjdCBvbWFwX3dkX3RpbWVyX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKIAlzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICpvbWFwX3dkdDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgKm1lbTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3Qgb21hcF93ZHRfZGV2ICp3ZGV2OwogCXUzMiByczsKIAlpbnQgcmV0OwpAQCAtMjE2LDI5ICsyMTQsMjAgQEAKIAlpZiAoIW9tYXBfd2R0KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCS8qIHJlc2VydmUgc3RhdGljIHJlZ2lzdGVyIG1hcHBpbmdzICovCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIXJlcykKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQltZW0gPSBkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LAotCQkJCSAgICAgIHJlc291cmNlX3NpemUocmVzKSwgcGRldi0+bmFtZSk7Ci0JaWYgKCFtZW0pCi0JCXJldHVybiAtRUJVU1k7Ci0KIAl3ZGV2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqd2RldiksIEdGUF9LRVJORUwpOwogCWlmICghd2RldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAl3ZGV2LT5vbWFwX3dkdF91c2Vycwk9IGZhbHNlOwotCXdkZXYtPm1lbQkJPSBtZW07CiAJd2Rldi0+ZGV2CQk9ICZwZGV2LT5kZXY7CiAJd2Rldi0+d2R0X3RyZ3JfcGF0dGVybgk9IDB4MTIzNDsKIAltdXRleF9pbml0KCZ3ZGV2LT5sb2NrKTsKIAotCXdkZXYtPmJhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKLQlpZiAoIXdkZXYtPmJhc2UpCi0JCXJldHVybiAtRU5PTUVNOworCS8qIHJlc2VydmUgc3RhdGljIHJlZ2lzdGVyIG1hcHBpbmdzICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwl3ZGV2LT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUih3ZGV2LT5iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIod2Rldi0+YmFzZSk7CiAKIAlvbWFwX3dkdC0+aW5mbwkgICAgICA9ICZvbWFwX3dkdF9pbmZvOwogCW9tYXBfd2R0LT5vcHMJICAgICAgPSAmb21hcF93ZHRfb3BzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9vcmlvbl93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvb3Jpb25fd2R0LmMKaW5kZXggZjc3MjJhNC4uNDk4MTYzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9vcmlvbl93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL29yaW9uX3dkdC5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9wYzg3NDEzX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9wYzg3NDEzX3dkdC5jCmluZGV4IDUyMTFkNTYuLjlmMTVkZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvcGM4NzQxM193ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3BjODc0MTNfd2R0LmMKQEAgLTUxMiw5ICs1MTIsOCBAQAogCQlyZXR1cm4gLUVCVVNZOwogCiAJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZwYzg3NDEzX25vdGlmaWVyKTsKLQlpZiAocmV0ICE9IDApIHsKKwlpZiAocmV0ICE9IDApCiAJCXByX2VycigiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwgcmV0KTsKLQl9CiAKIAlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZwYzg3NDEzX21pc2NkZXYpOwogCWlmIChyZXQgIT0gMCkgewpAQCAtNTc1LDggKzU3NCw4IEBACiBtb2R1bGVfaW5pdChwYzg3NDEzX2luaXQpOwogbW9kdWxlX2V4aXQocGM4NzQxM19leGl0KTsKIAotTU9EVUxFX0FVVEhPUigiU3ZlbiBBbmRlcnMgPGFuZGVyc0BhbmR1cmFzLmRlPiwgIgotCQkiTWFyY3VzIEp1bmtlciA8anVua2VyQGFuZHVyYXMuZGU+LCIpOworTU9EVUxFX0FVVEhPUigiU3ZlbiBBbmRlcnMgPGFuZGVyc0BhbmR1cmFzLmRlPiIpOworTU9EVUxFX0FVVEhPUigiTWFyY3VzIEp1bmtlciA8anVua2VyQGFuZHVyYXMuZGU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlBDODc0MTMgV0RUIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3Bjd2RfdXNiLmMgYi9kcml2ZXJzL3dhdGNoZG9nL3Bjd2RfdXNiLmMKaW5kZXggZTU2MmUwNC4uMWExMWFlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9wY3dkX3VzYi5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvcGN3ZF91c2IuYwpAQCAtNjQ1LDEwICs2NDUsOCBAQAogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIGFuZCBpbml0aWFsaXplIGl0ICovCiAJdXNiX3Bjd2QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiX3Bjd2RfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwotCWlmICh1c2JfcGN3ZCA9PSBOVUxMKSB7Ci0JCXByX2VycigiT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKHVzYl9wY3dkID09IE5VTEwpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCiAJdXNiX3Bjd2RfZGV2aWNlID0gdXNiX3Bjd2Q7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvcG54NDAwOF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvcG54NDAwOF93ZHQuYwppbmRleCA1YmVjMjBmLi4xNWZiMzE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3BueDQwMDhfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9wbng0MDA4X3dkdC5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9yZGMzMjF4X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9yZGMzMjF4X3dkdC5jCmluZGV4IDA4MmQwNjIuLjI5Y2Y0ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvcmRjMzIxeF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3JkYzMyMXhfd2R0LmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvcmV0dV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvcmV0dV93ZHQuYwppbmRleCBmNTM2MTVkLi5hN2EwNjk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3JldHVfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9yZXR1X3dkdC5jCkBAIC0xNiw3ICsxNiw2IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3Jpb3dkLmMgYi9kcml2ZXJzL3dhdGNoZG9nL3Jpb3dkLmMKaW5kZXggM2RkOGVkMi4uY2ZlZDBmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9yaW93ZC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvcmlvd2QuYwpAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9zM2MyNDEwX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCmluZGV4IGFlYzk0NmQuLjdjNmNjZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CkBAIC01MjYsNyArNTI1LDExIEBACiAJCWdvdG8gZXJyOwogCX0KIAotCWNsa19wcmVwYXJlX2VuYWJsZSh3ZHQtPmNsb2NrKTsKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUod2R0LT5jbG9jayk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIGNsb2NrXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAlyZXQgPSBzM2MyNDEwd2R0X2NwdWZyZXFfcmVnaXN0ZXIod2R0KTsKIAlpZiAocmV0IDwgMCkgewpAQCAtNjA4LDcgKzYxMSw2IEBACiAKICBlcnJfY2xrOgogCWNsa19kaXNhYmxlX3VucHJlcGFyZSh3ZHQtPmNsb2NrKTsKLQl3ZHQtPmNsb2NrID0gTlVMTDsKIAogIGVycjoKIAlyZXR1cm4gcmV0OwpAQCAtNjI4LDcgKzYzMCw2IEBACiAJczNjMjQxMHdkdF9jcHVmcmVxX2RlcmVnaXN0ZXIod2R0KTsKIAogCWNsa19kaXNhYmxlX3VucHJlcGFyZSh3ZHQtPmNsb2NrKTsKLQl3ZHQtPmNsb2NrID0gTlVMTDsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9zYzUyMF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvc2M1MjBfd2R0LmMKaW5kZXggZjM1M2UxOC4uMWNmZDNmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9zYzUyMF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3NjNTIwX3dkdC5jCkBAIC0xNTgsMTIgKzE1OCwxMSBAQAogCiBzdGF0aWMgdm9pZCB3ZHRfY29uZmlnKGludCB3cml0ZXZhbCkKIHsKLQlfX3UxNiBkdW1teTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogYnV5IHNvbWUgdGltZSAocGluZykgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmd2R0X3NwaW5sb2NrLCBmbGFncyk7Ci0JZHVtbXkgPSByZWFkdyh3ZHRtcmN0bCk7CS8qIGVuc3VyZSB3cml0ZSBzeW5jaHJvbml6YXRpb24gKi8KKwlyZWFkdyh3ZHRtcmN0bCk7CS8qIGVuc3VyZSB3cml0ZSBzeW5jaHJvbml6YXRpb24gKi8KIAl3cml0ZXcoMHhBQUFBLCB3ZHRtcmN0bCk7CiAJd3JpdGV3KDB4NTU1NSwgd2R0bXJjdGwpOwogCS8qIHVubG9jayBXRFQgPSBtYWtlIFdEVCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHdyaXRhYmxlIG9uZSB0aW1lICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3Nod2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3Nod2R0LmMKaW5kZXggYWYzNTI4Zi4uZDA0ZDAyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9zaHdkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvc2h3ZHQuYwpAQCAtMjkzLDggKzI5Myw2IEBACiAKIHN0YXRpYyBpbnQgc2hfd2R0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBzaF93ZHQgKndkdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCiAJd2F0Y2hkb2dfdW5yZWdpc3Rlcl9kZXZpY2UoJnNoX3dkdF9kZXYpOwogCiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9zb2Z0ZG9nLmMgYi9kcml2ZXJzL3dhdGNoZG9nL3NvZnRkb2cuYwppbmRleCBjMDRhMWFhLi4wZGM1ZTMyM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvc29mdGRvZy5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvc29mdGRvZy5jCkBAIC02Miw3ICs2Miw3IEBACiAJCSJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9IgogCQkJCV9fTU9EVUxFX1NUUklORyhXQVRDSERPR19OT1dBWU9VVCkgIikiKTsKIAotc3RhdGljIGludCBzb2Z0X25vYm9vdCA9IDA7CitzdGF0aWMgaW50IHNvZnRfbm9ib290OwogbW9kdWxlX3BhcmFtKHNvZnRfbm9ib290LCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhzb2Z0X25vYm9vdCwKIAkiU29mdGRvZyBhY3Rpb24sIHNldCB0byAxIHRvIGlnbm9yZSByZWJvb3RzLCAwIHRvIHJlYm9vdCAoZGVmYXVsdD0wKSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9zcDgwNV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvc3A4MDVfd2R0LmMKaW5kZXggM2Y3ODZjZS4uNDc2MjlkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9zcDgwNV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3NwODA1X3dkdC5jCkBAIC0xNiw3ICsxNiw2IEBACiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTIwOSwyNyArMjA4LDE1IEBACiAJc3RydWN0IHNwODA1X3dkdCAqd2R0OwogCWludCByZXQgPSAwOwogCi0JaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmYWRldi0+ZGV2LCBhZGV2LT5yZXMuc3RhcnQsCi0JCQkJcmVzb3VyY2Vfc2l6ZSgmYWRldi0+cmVzKSwgInNwODA1X3dkdCIpKSB7Ci0JCWRldl93YXJuKCZhZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IG1lbW9yeSByZWdpb24gcmVzb3VyY2VcbiIpOwotCQlyZXQgPSAtRU5PRU5UOwotCQlnb3RvIGVycjsKLQl9Ci0KIAl3ZHQgPSBkZXZtX2t6YWxsb2MoJmFkZXYtPmRldiwgc2l6ZW9mKCp3ZHQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXdkdCkgewotCQlkZXZfd2FybigmYWRldi0+ZGV2LCAiS3phbGxvYyBmYWlsZWRcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycjsKIAl9CiAKLQl3ZHQtPmJhc2UgPSBkZXZtX2lvcmVtYXAoJmFkZXYtPmRldiwgYWRldi0+cmVzLnN0YXJ0LAotCQkJcmVzb3VyY2Vfc2l6ZSgmYWRldi0+cmVzKSk7Ci0JaWYgKCF3ZHQtPmJhc2UpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZGV2X3dhcm4oJmFkZXYtPmRldiwgImlvcmVtYXAgZmFpbFxuIik7Ci0JCWdvdG8gZXJyOwotCX0KKwl3ZHQtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJmFkZXYtPmRldiwgJmFkZXYtPnJlcyk7CisJaWYgKElTX0VSUih3ZHQtPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUih3ZHQtPmJhc2UpOwogCiAJd2R0LT5jbGsgPSBkZXZtX2Nsa19nZXQoJmFkZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUih3ZHQtPmNsaykpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvc3RtcDN4eHhfcnRjX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9zdG1wM3h4eF9ydGNfd2R0LmMKaW5kZXggYmI2NGFlMy4uMzgwNGQ1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9zdG1wM3h4eF9ydGNfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zdG1wM3h4eF9ydGNfd2R0LmMKQEAgLTksNyArOSw2IEBACiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvc3VueGlfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3N1bnhpX3dkdC5jCmluZGV4IDc2MzMyZDguLmNkMDBhNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvc3VueGlfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zdW54aV93ZHQuYwpAQCAtMjA1LDcgKzIwNSw3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bnhpX3dkdF9kdF9pZHNbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS13ZHQiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXdkdCIgfSwKIAl7IC8qIHNlbnRpbmVsICovIH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzdW54aV93ZHRfZHRfaWRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvdGVncmFfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3RlZ3JhX3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MGUyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3dhdGNoZG9nL3RlZ3JhX3dkdC5jCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBOVklESUEgQ09SUE9SQVRJT04uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisKKy8qIG1pbmltdW0gYW5kIG1heGltdW0gd2F0Y2hkb2cgdHJpZ2dlciB0aW1lb3V0LCBpbiBzZWNvbmRzICovCisjZGVmaW5lIE1JTl9XRFRfVElNRU9VVAkJCTEKKyNkZWZpbmUgTUFYX1dEVF9USU1FT1VUCQkJMjU1CisKKy8qCisgKiBCYXNlIG9mIHRoZSBXRFQgcmVnaXN0ZXJzLCBmcm9tIHRoZSB0aW1lciBiYXNlIGFkZHJlc3MuICBUaGVyZSBhcmUKKyAqIGFjdHVhbGx5IDUgd2F0Y2hkb2dzIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgKGJ5IHBhaXJpbmcgd2l0aCBhbiBhdmFpbGFibGUKKyAqIHRpbWVyKSwgYXQgYmFzZXMgMHgxMDAgKyAoV0RUIElEKSAqIDB4MjAsIHdoZXJlIFdEVCBJRCBpcyAwIHRocm91Z2ggNC4KKyAqIFRoaXMgZHJpdmVyIG9ubHkgY29uZmlndXJlcyB0aGUgZmlyc3Qgd2F0Y2hkb2cgKFdEVCBJRCAwKS4KKyAqLworI2RlZmluZSBXRFRfQkFTRQkJCTB4MTAwCisjZGVmaW5lIFdEVF9JRAkJCQkwCisKKy8qCisgKiBSZWdpc3RlciBiYXNlIG9mIHRoZSB0aW1lciB0aGF0J3Mgc2VsZWN0ZWQgZm9yIHBhaXJpbmcgd2l0aCB0aGUgd2F0Y2hkb2cuCisgKiBUaGlzIGRyaXZlciBhcmJpdHJhcmlseSB1c2VzIHRpbWVyIDUsIHdoaWNoIGlzIGN1cnJlbnRseSB1bnVzZWQgYnkKKyAqIG90aGVyIGRyaXZlcnMgKGluIHBhcnRpY3VsYXIsIHRoZSBUZWdyYSBjbG9ja3NvdXJjZSBkcml2ZXIpLiAgSWYgdGhpcworICogbmVlZHMgdG8gY2hhbmdlLCB0YWtlIGNhcmUgdGhhdCB0aGUgbmV3IHRpbWVyIGlzIG5vdCB1c2VkIGJ5IHRoZQorICogY2xvY2tzb3VyY2UgZHJpdmVyLgorICovCisjZGVmaW5lIFdEVF9USU1FUl9CQVNFCQkJMHg2MAorI2RlZmluZSBXRFRfVElNRVJfSUQJCQk1CisKKy8qIFdEVCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgV0RUX0NGRwkJCQkweDAKKyNkZWZpbmUgV0RUX0NGR19QRVJJT0RfU0hJRlQJCTQKKyNkZWZpbmUgV0RUX0NGR19QRVJJT0RfTUFTSwkJMHhmZgorI2RlZmluZSBXRFRfQ0ZHX0lOVF9FTgkJCSgxIDw8IDEyKQorI2RlZmluZSBXRFRfQ0ZHX1BNQzJDQVJfUlNUX0VOCQkoMSA8PCAxNSkKKyNkZWZpbmUgV0RUX1NUUwkJCQkweDQKKyNkZWZpbmUgV0RUX1NUU19DT1VOVF9TSElGVAkJNAorI2RlZmluZSBXRFRfU1RTX0NPVU5UX01BU0sJCTB4ZmYKKyNkZWZpbmUgV0RUX1NUU19FWFBfU0hJRlQJCTEyCisjZGVmaW5lIFdEVF9TVFNfRVhQX01BU0sJCTB4MworI2RlZmluZSBXRFRfQ01ECQkJCTB4OAorI2RlZmluZSBXRFRfQ01EX1NUQVJUX0NPVU5URVIJCSgxIDw8IDApCisjZGVmaW5lIFdEVF9DTURfRElTQUJMRV9DT1VOVEVSCQkoMSA8PCAxKQorI2RlZmluZSBXRFRfVU5MT0NLCQkJKDB4YykKKyNkZWZpbmUgV0RUX1VOTE9DS19QQVRURVJOCQkoMHhjNDVhIDw8IDApCisKKy8qIFRpbWVyIHJlZ2lzdGVycyAqLworI2RlZmluZSBUSU1FUl9QVFYJCQkweDAKKyNkZWZpbmUgVElNRVJfRU4JCQkoMSA8PCAzMSkKKyNkZWZpbmUgVElNRVJfUEVSSU9ESUMJCQkoMSA8PCAzMCkKKworc3RydWN0IHRlZ3JhX3dkdCB7CisJc3RydWN0IHdhdGNoZG9nX2RldmljZQl3ZGQ7CisJdm9pZCBfX2lvbWVtCQkqd2R0X3JlZ3M7CisJdm9pZCBfX2lvbWVtCQkqdG1yX3JlZ3M7Cit9OworCisjZGVmaW5lIFdEVF9IRUFSVEJFQVQgMTIwCitzdGF0aWMgaW50IGhlYXJ0YmVhdCA9IFdEVF9IRUFSVEJFQVQ7Cittb2R1bGVfcGFyYW0oaGVhcnRiZWF0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhoZWFydGJlYXQsCisJIldhdGNoZG9nIGhlYXJ0YmVhdHMgaW4gc2Vjb25kcy4gKGRlZmF1bHQgPSAiCisJX19NT0RVTEVfU1RSSU5HKFdEVF9IRUFSVEJFQVQpICIpIik7CisKK3N0YXRpYyBib29sIG5vd2F5b3V0ID0gV0FUQ0hET0dfTk9XQVlPVVQ7Cittb2R1bGVfcGFyYW0obm93YXlvdXQsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwKKwkiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PSIKKwlfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfTk9XQVlPVVQpICIpIik7CisKK3N0YXRpYyBpbnQgdGVncmFfd2R0X3N0YXJ0KHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKK3sKKwlzdHJ1Y3QgdGVncmFfd2R0ICp3ZHQgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZGQpOworCXUzMiB2YWw7CisKKwkvKgorCSAqIFRoaXMgdGhpbmcgaGFzIGEgZml4ZWQgMU1IeiBjbG9jay4gIE5vcm1hbGx5LCB3ZSB3b3VsZCBzZXQgdGhlCisJICogcGVyaW9kIHRvIDEgc2Vjb25kIGJ5IHdyaXRpbmcgMTAwMDAwMHVsLCBidXQgdGhlIHdhdGNoZG9nIHN5c3RlbQorCSAqIHJlc2V0IGFjdHVhbGx5IG9jY3VycyBvbiB0aGUgNHRoIGV4cGlyYXRpb24gb2YgdGhpcyBjb3VudGVyLAorCSAqIHNvIHdlIHNldCB0aGUgcGVyaW9kIHRvIDEvNCBvZiB0aGlzIGFtb3VudC4KKwkgKi8KKwl2YWwgPSAxMDAwMDAwdWwgLyA0OworCXZhbCB8PSAoVElNRVJfRU4gfCBUSU1FUl9QRVJJT0RJQyk7CisJd3JpdGVsKHZhbCwgd2R0LT50bXJfcmVncyArIFRJTUVSX1BUVik7CisKKwkvKgorCSAqIFNldCBudW1iZXIgb2YgcGVyaW9kcyBhbmQgc3RhcnQgY291bnRlci4KKwkgKgorCSAqIEludGVycnVwdCBoYW5kbGVyIGlzIG5vdCByZXF1aXJlZCBmb3IgdXNlciBzcGFjZQorCSAqIFdEVCBhY2Nlc3Nlcywgc2luY2UgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSB0byBwaW5nIHRoZQorCSAqIFdEVCB0byByZXNldCB0aGUgY291bnRlciBiZWZvcmUgZXhwaXJhdGlvbiwgdGhyb3VnaCBpb2N0bHMuCisJICovCisJdmFsID0gV0RUX1RJTUVSX0lEIHwKKwkgICAgICAod2RkLT50aW1lb3V0IDw8IFdEVF9DRkdfUEVSSU9EX1NISUZUKSB8CisJICAgICAgV0RUX0NGR19QTUMyQ0FSX1JTVF9FTjsKKwl3cml0ZWwodmFsLCB3ZHQtPndkdF9yZWdzICsgV0RUX0NGRyk7CisKKwl3cml0ZWwoV0RUX0NNRF9TVEFSVF9DT1VOVEVSLCB3ZHQtPndkdF9yZWdzICsgV0RUX0NNRCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZWdyYV93ZHRfc3RvcChzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQpCit7CisJc3RydWN0IHRlZ3JhX3dkdCAqd2R0ID0gd2F0Y2hkb2dfZ2V0X2RydmRhdGEod2RkKTsKKworCXdyaXRlbChXRFRfVU5MT0NLX1BBVFRFUk4sIHdkdC0+d2R0X3JlZ3MgKyBXRFRfVU5MT0NLKTsKKwl3cml0ZWwoV0RUX0NNRF9ESVNBQkxFX0NPVU5URVIsIHdkdC0+d2R0X3JlZ3MgKyBXRFRfQ01EKTsKKwl3cml0ZWwoMCwgd2R0LT50bXJfcmVncyArIFRJTUVSX1BUVik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZWdyYV93ZHRfcGluZyhzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQpCit7CisJc3RydWN0IHRlZ3JhX3dkdCAqd2R0ID0gd2F0Y2hkb2dfZ2V0X2RydmRhdGEod2RkKTsKKworCXdyaXRlbChXRFRfQ01EX1NUQVJUX0NPVU5URVIsIHdkdC0+d2R0X3JlZ3MgKyBXRFRfQ01EKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3dkdF9zZXRfdGltZW91dChzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQsCisJCQkJIHVuc2lnbmVkIGludCB0aW1lb3V0KQoreworCXdkZC0+dGltZW91dCA9IHRpbWVvdXQ7CisKKwlpZiAod2F0Y2hkb2dfYWN0aXZlKHdkZCkpCisJCXJldHVybiB0ZWdyYV93ZHRfc3RhcnQod2RkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHRlZ3JhX3dkdF9nZXRfdGltZWxlZnQoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkKQoreworCXN0cnVjdCB0ZWdyYV93ZHQgKndkdCA9IHdhdGNoZG9nX2dldF9kcnZkYXRhKHdkZCk7CisJdTMyIHZhbDsKKwlpbnQgY291bnQ7CisJaW50IGV4cDsKKworCXZhbCA9IHJlYWRsKHdkdC0+d2R0X3JlZ3MgKyBXRFRfU1RTKTsKKworCS8qIEN1cnJlbnQgY291bnRkb3duIChmcm9tIHRpbWVvdXQpICovCisJY291bnQgPSAodmFsID4+IFdEVF9TVFNfQ09VTlRfU0hJRlQpICYgV0RUX1NUU19DT1VOVF9NQVNLOworCisJLyogTnVtYmVyIG9mIGV4cGlyYXRpb25zICh3ZSBhcmUgd2FpdGluZyBmb3IgdGhlIDR0aCBleHBpcmF0aW9uKSAqLworCWV4cCA9ICh2YWwgPj4gV0RUX1NUU19FWFBfU0hJRlQpICYgV0RUX1NUU19FWFBfTUFTSzsKKworCS8qCisJICogVGhlIGVudGlyZSB0aGluZyBpcyBkaXZpZGVkIGJ5IDQgYmVjYXVzZSB3ZSBhcmUgdGlja2luZyBkb3duIDQgdGltZXMKKwkgKiBmYXN0ZXIgZHVlIHRvIG5lZWRpbmcgdG8gd2FpdCBmb3IgdGhlIDR0aCBleHBpcmF0aW9uLgorCSAqLworCXJldHVybiAoKCgzIC0gZXhwKSAqIHdkZC0+dGltZW91dCkgKyBjb3VudCkgLyA0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHdhdGNoZG9nX2luZm8gdGVncmFfd2R0X2luZm8gPSB7CisJLm9wdGlvbnMJPSBXRElPRl9TRVRUSU1FT1VUIHwKKwkJCSAgV0RJT0ZfTUFHSUNDTE9TRSB8CisJCQkgIFdESU9GX0tFRVBBTElWRVBJTkcsCisJLmZpcm13YXJlX3ZlcnNpb24gPSAwLAorCS5pZGVudGl0eQk9ICJUZWdyYSBXYXRjaGRvZyIsCit9OworCitzdGF0aWMgc3RydWN0IHdhdGNoZG9nX29wcyB0ZWdyYV93ZHRfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5zdGFydCA9IHRlZ3JhX3dkdF9zdGFydCwKKwkuc3RvcCA9IHRlZ3JhX3dkdF9zdG9wLAorCS5waW5nID0gdGVncmFfd2R0X3BpbmcsCisJLnNldF90aW1lb3V0ID0gdGVncmFfd2R0X3NldF90aW1lb3V0LAorCS5nZXRfdGltZWxlZnQgPSB0ZWdyYV93ZHRfZ2V0X3RpbWVsZWZ0LAorfTsKKworc3RhdGljIGludCB0ZWdyYV93ZHRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQ7CisJc3RydWN0IHRlZ3JhX3dkdCAqd2R0OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXZvaWQgX19pb21lbSAqcmVnczsKKwlpbnQgcmV0OworCisJLyogVGhpcyBpcyB0aGUgdGltZXIgYmFzZS4gKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHJlZ3MpKQorCQlyZXR1cm4gUFRSX0VSUihyZWdzKTsKKworCS8qCisJICogQWxsb2NhdGUgb3VyIHdhdGNoZG9nIGRyaXZlciBkYXRhLCB3aGljaCBoYXMgdGhlCisJICogc3RydWN0IHdhdGNoZG9nX2RldmljZSBuZXN0ZWQgd2l0aGluIGl0LgorCSAqLworCXdkdCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKndkdCksIEdGUF9LRVJORUwpOworCWlmICghd2R0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEluaXRpYWxpemUgc3RydWN0IHRlZ3JhX3dkdC4gKi8KKwl3ZHQtPndkdF9yZWdzID0gcmVncyArIFdEVF9CQVNFOworCXdkdC0+dG1yX3JlZ3MgPSByZWdzICsgV0RUX1RJTUVSX0JBU0U7CisKKwkvKiBJbml0aWFsaXplIHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UuICovCisJd2RkID0gJndkdC0+d2RkOworCXdkZC0+dGltZW91dCA9IGhlYXJ0YmVhdDsKKwl3ZGQtPmluZm8gPSAmdGVncmFfd2R0X2luZm87CisJd2RkLT5vcHMgPSAmdGVncmFfd2R0X29wczsKKwl3ZGQtPm1pbl90aW1lb3V0ID0gTUlOX1dEVF9USU1FT1VUOworCXdkZC0+bWF4X3RpbWVvdXQgPSBNQVhfV0RUX1RJTUVPVVQ7CisKKwl3YXRjaGRvZ19zZXRfZHJ2ZGF0YSh3ZGQsIHdkdCk7CisKKwl3YXRjaGRvZ19zZXRfbm93YXlvdXQod2RkLCBub3dheW91dCk7CisKKwlyZXQgPSB3YXRjaGRvZ19yZWdpc3Rlcl9kZXZpY2Uod2RkKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJmYWlsZWQgdG8gcmVnaXN0ZXIgd2F0Y2hkb2cgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB3ZHQpOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJICJpbml0aWFsaXplZCAoaGVhcnRiZWF0ID0gJWQgc2VjLCBub3dheW91dCA9ICVkKVxuIiwKKwkJIGhlYXJ0YmVhdCwgbm93YXlvdXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfd2R0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB0ZWdyYV93ZHQgKndkdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJdGVncmFfd2R0X3N0b3AoJndkdC0+d2RkKTsKKworCXdhdGNoZG9nX3VucmVnaXN0ZXJfZGV2aWNlKCZ3ZHQtPndkZCk7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAicmVtb3ZlZCB3ZHRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgdGVncmFfd2R0X3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRlZ3JhX3dkdCAqd2R0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAod2F0Y2hkb2dfYWN0aXZlKCZ3ZHQtPndkZCkpCisJCXRlZ3JhX3dkdF9zdG9wKCZ3ZHQtPndkZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZWdyYV93ZHRfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB0ZWdyYV93ZHQgKndkdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKHdhdGNoZG9nX2FjdGl2ZSgmd2R0LT53ZGQpKQorCQl0ZWdyYV93ZHRfc3RhcnQoJndkdC0+d2RkKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRlZ3JhX3dkdF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMzAtdGltZXIiLCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB0ZWdyYV93ZHRfb2ZfbWF0Y2gpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgdGVncmFfd2R0X3BtX29wcyA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyh0ZWdyYV93ZHRfcnVudGltZV9zdXNwZW5kLAorCQkJCXRlZ3JhX3dkdF9ydW50aW1lX3Jlc3VtZSkKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRlZ3JhX3dkdF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHRlZ3JhX3dkdF9wcm9iZSwKKwkucmVtb3ZlCQk9IHRlZ3JhX3dkdF9yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkubmFtZQk9ICJ0ZWdyYS13ZHQiLAorCQkucG0JPSAmdGVncmFfd2R0X3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gdGVncmFfd2R0X29mX21hdGNoLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0ZWdyYV93ZHRfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiTlZJRElBIENvcnBvcmF0aW9uIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRlZ3JhIFdhdGNoZG9nIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy90czcyeHhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3RzNzJ4eF93ZHQuYwppbmRleCAwOWQ0ODMxLi5hZmE5ZDZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3RzNzJ4eF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3RzNzJ4eF93ZHQuYwpAQCAtNjEsNyArNjEsNyBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiB9OwogCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp0czcyeHhfd2R0X3BkZXY7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdHM3Mnh4X3dkdF9wZGV2OwogCiAvKgogICogVFMtNzJ4eCBXYXRjaGRvZyBzdXBwb3J0cyBmb2xsb3dpbmcgdGltZW91dHMgKHZhbHVlIHdyaXR0ZW4KQEAgLTM5NCwxMCArMzk0LDggQEAKIAlpbnQgZXJyb3IgPSAwOwogCiAJd2R0ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgdHM3Mnh4X3dkdCksIEdGUF9LRVJORUwpOwotCWlmICghd2R0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCWlmICghd2R0KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlyMSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJd2R0LT5jb250cm9sX3JlZyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3c4MzY5N2hmX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy93ODM2OTdoZl93ZHQuYwppbmRleCA2OGI0NWZjLi5lOWVhODU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3c4MzY5N2hmX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvdzgzNjk3aGZfd2R0LmMKQEAgLTQ1NSw2ICs0NTUsNiBAQAogbW9kdWxlX2V4aXQod2R0X2V4aXQpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJNYXJjdXMgSnVua2VyIDxqdW5rZXJAYW5kdXJhcy5kZT4sICIKLQkJIlNhbXVlbCBUYXJkaWV1IDxzYW1AcmZjMTE0OS5uZXQ+Iik7CitNT0RVTEVfQVVUSE9SKCJNYXJjdXMgSnVua2VyIDxqdW5rZXJAYW5kdXJhcy5kZT4iKTsKK01PRFVMRV9BVVRIT1IoIlNhbXVlbCBUYXJkaWV1IDxzYW1AcmZjMTE0OS5uZXQ+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oInc4MzY5N2hmL2hnIFdEVCBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvd2R0Mjg1LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3dkdDI4NS5jCmluZGV4IDczNTVkZGQwLi5lYmJiMTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3dkdDI4NS5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvd2R0Mjg1LmMKQEAgLTEzOSw5ICsxMzksOCBAQAogc3RhdGljIGxvbmcgd2F0Y2hkb2dfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQl1bnNpZ25lZCBpbnQgbmV3X21hcmdpbjsKIAlpbnQgX191c2VyICppbnRfYXJnID0gKGludCBfX3VzZXIgKilhcmc7Ci0JaW50IHJldCA9IC1FTk9UVFk7CisJaW50IG5ld19tYXJnaW4sIHJldCA9IC1FTk9UVFk7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvd2R0X3BjaS5jIGIvZHJpdmVycy93YXRjaGRvZy93ZHRfcGNpLmMKaW5kZXggM2RjNTc4ZS4uNDhiMmMwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy93ZHRfcGNpLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy93ZHRfcGNpLmMKQEAgLTQ5LDcgKzQ5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvd204MzF4X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy93bTgzMXhfd2R0LmMKaW5kZXggZTI0M2JkMC4uMmZhMTdlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy93bTgzMXhfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy93bTgzMXhfd2R0LmMKQEAgLTIwNCw3ICsyMDQsNiBAQAogCWRyaXZlcl9kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZHJpdmVyX2RhdGEpLAogCQkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghZHJpdmVyX2RhdGEpIHsKLQkJZGV2X2Vycih3bTgzMXgtPmRldiwgIlVuYWJsZSB0byBhbGxvYWNhdGUgd2F0Y2hkb2cgZGV2aWNlXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZXZlbnRzL2V2ZW50c18ybC5jIGIvZHJpdmVycy94ZW4vZXZlbnRzL2V2ZW50c18ybC5jCmluZGV4IGQ3ZmY5MTcuLjVkYjQzZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL2V2ZW50cy9ldmVudHNfMmwuYworKysgYi9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzXzJsLmMKQEAgLTE2Niw3ICsxNjYsNiBAQAogCWludCBzdGFydF93b3JkX2lkeCwgc3RhcnRfYml0X2lkeDsKIAlpbnQgd29yZF9pZHgsIGJpdF9pZHg7CiAJaW50IGk7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjOwogCXN0cnVjdCBzaGFyZWRfaW5mbyAqcyA9IEhZUEVSVklTT1Jfc2hhcmVkX2luZm87CiAJc3RydWN0IHZjcHVfaW5mbyAqdmNwdV9pbmZvID0gX190aGlzX2NwdV9yZWFkKHhlbl92Y3B1KTsKIApAQCAtMTc2LDExICsxNzUsOCBAQAogCQl1bnNpZ25lZCBpbnQgZXZ0Y2huID0gZXZ0Y2huX2Zyb21faXJxKGlycSk7CiAJCXdvcmRfaWR4ID0gZXZ0Y2huIC8gQklUU19QRVJfTE9ORzsKIAkJYml0X2lkeCA9IGV2dGNobiAlIEJJVFNfUEVSX0xPTkc7Ci0JCWlmIChhY3RpdmVfZXZ0Y2hucyhjcHUsIHMsIHdvcmRfaWR4KSAmICgxVUxMIDw8IGJpdF9pZHgpKSB7Ci0JCQlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKLQkJCWlmIChkZXNjKQotCQkJCWdlbmVyaWNfaGFuZGxlX2lycV9kZXNjKGlycSwgZGVzYyk7Ci0JCX0KKwkJaWYgKGFjdGl2ZV9ldnRjaG5zKGNwdSwgcywgd29yZF9pZHgpICYgKDFVTEwgPDwgYml0X2lkeCkpCisJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKIAl9CiAKIAkvKgpAQCAtMjQ1LDExICsyNDEsOCBAQAogCQkJcG9ydCA9ICh3b3JkX2lkeCAqIEJJVFNfUEVSX0VWVENITl9XT1JEKSArIGJpdF9pZHg7CiAJCQlpcnEgPSBnZXRfZXZ0Y2huX3RvX2lycShwb3J0KTsKIAotCQkJaWYgKGlycSAhPSAtMSkgewotCQkJCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwotCQkJCWlmIChkZXNjKQotCQkJCQlnZW5lcmljX2hhbmRsZV9pcnFfZGVzYyhpcnEsIGRlc2MpOwotCQkJfQorCQkJaWYgKGlycSAhPSAtMSkKKwkJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKIAogCQkJYml0X2lkeCA9IChiaXRfaWR4ICsgMSkgJSBCSVRTX1BFUl9FVlRDSE5fV09SRDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZXZlbnRzL2V2ZW50c19iYXNlLmMgYi9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzX2Jhc2UuYwppbmRleCBmNGE5ZTMzLi5jMzQ1OGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzX2Jhc2UuYworKysgYi9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzX2Jhc2UuYwpAQCAtMzM2LDkgKzMzNiw4IEBACiAKIAlCVUdfT04oaXJxID09IC0xKTsKICNpZmRlZiBDT05GSUdfU01QCi0JY3B1bWFza19jb3B5KGlycV90b19kZXNjKGlycSktPmlycV9kYXRhLmFmZmluaXR5LCBjcHVtYXNrX29mKGNwdSkpOworCWNwdW1hc2tfY29weShpcnFfZ2V0X2lycV9kYXRhKGlycSktPmFmZmluaXR5LCBjcHVtYXNrX29mKGNwdSkpOwogI2VuZGlmCi0KIAl4ZW5fZXZ0Y2huX3BvcnRfYmluZF90b19jcHUoaW5mbywgY3B1KTsKIAogCWluZm8tPmNwdSA9IGNwdTsKQEAgLTM3MywxMCArMzcyLDggQEAKIHsKIAlzdHJ1Y3QgaXJxX2luZm8gKmluZm87CiAjaWZkZWYgQ09ORklHX1NNUAotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7Ci0KIAkvKiBCeSBkZWZhdWx0IGFsbCBldmVudCBjaGFubmVscyBub3RpZnkgQ1BVIzAuICovCi0JY3B1bWFza19jb3B5KGRlc2MtPmlycV9kYXRhLmFmZmluaXR5LCBjcHVtYXNrX29mKDApKTsKKwljcHVtYXNrX2NvcHkoaXJxX2dldF9pcnFfZGF0YShpcnEpLT5hZmZpbml0eSwgY3B1bWFza19vZigwKSk7CiAjZW5kaWYKIAogCWluZm8gPSBremFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOwpAQCAtNDkwLDEzICs0ODcsNiBAQAogCQlpbmZvLT51LnBpcnEuZmxhZ3MgfD0gUElSUV9ORUVEU19FT0k7CiB9CiAKLXN0YXRpYyBib29sIHByb2JpbmdfaXJxKGludCBpcnEpCi17Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKLQotCXJldHVybiBkZXNjICYmIGRlc2MtPmFjdGlvbiA9PSBOVUxMOwotfQotCiBzdGF0aWMgdm9pZCBlb2lfcGlycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7CiAJaW50IGV2dGNobiA9IGV2dGNobl9mcm9tX2lycShkYXRhLT5pcnEpOwpAQCAtNTM4LDggKzUyOCw3IEBACiAJCQkJCUJJTkRfUElSUV9fV0lMTF9TSEFSRSA6IDA7CiAJcmMgPSBIWVBFUlZJU09SX2V2ZW50X2NoYW5uZWxfb3AoRVZUQ0hOT1BfYmluZF9waXJxLCAmYmluZF9waXJxKTsKIAlpZiAocmMgIT0gMCkgewotCQlpZiAoIXByb2JpbmdfaXJxKGlycSkpCi0JCQlwcl9pbmZvKCJGYWlsZWQgdG8gb2J0YWluIHBoeXNpY2FsIElSUSAlZFxuIiwgaXJxKTsKKwkJcHJfd2FybigiRmFpbGVkIHRvIG9idGFpbiBwaHlzaWNhbCBJUlEgJWRcbiIsIGlycSk7CiAJCXJldHVybiAwOwogCX0KIAlldnRjaG4gPSBiaW5kX3BpcnEucG9ydDsKQEAgLTc3MiwxNyArNzYxLDEyIEBACiAKIGludCB4ZW5fZGVzdHJveV9pcnEoaW50IGlycSkKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAJc3RydWN0IHBoeXNkZXZfdW5tYXBfcGlycSB1bm1hcF9pcnE7CiAJc3RydWN0IGlycV9pbmZvICppbmZvID0gaW5mb19mb3JfaXJxKGlycSk7CiAJaW50IHJjID0gLUVOT0VOVDsKIAogCW11dGV4X2xvY2soJmlycV9tYXBwaW5nX3VwZGF0ZV9sb2NrKTsKIAotCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwotCWlmICghZGVzYykKLQkJZ290byBvdXQ7Ci0KIAlpZiAoeGVuX2luaXRpYWxfZG9tYWluKCkpIHsKIAkJdW5tYXBfaXJxLnBpcnEgPSBpbmZvLT51LnBpcnEucGlycTsKIAkJdW5tYXBfaXJxLmRvbWlkID0gaW5mby0+dS5waXJxLmRvbWlkOwpAQCAtMTI1MSw2ICsxMjM1LDcgQEAKICNpZmRlZiBDT05GSUdfWDg2CiAJZXhpdF9pZGxlKCk7CiAjZW5kaWYKKwlpbmNfaXJxX3N0YXQoaXJxX2h2X2NhbGxiYWNrX2NvdW50KTsKIAogCV9feGVuX2V2dGNobl9kb191cGNhbGwoKTsKIApAQCAtMTMzOSw3ICsxMzI0LDcgQEAKIHN0YXRpYyBpbnQgc2V0X2FmZmluaXR5X2lycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpkZXN0LAogCQkJICAgIGJvb2wgZm9yY2UpCiB7Ci0JdW5zaWduZWQgdGNwdSA9IGNwdW1hc2tfZmlyc3QoZGVzdCk7CisJdW5zaWduZWQgdGNwdSA9IGNwdW1hc2tfZmlyc3RfYW5kKGRlc3QsIGNwdV9vbmxpbmVfbWFzayk7CiAKIAlyZXR1cm4gcmViaW5kX2lycV90b19jcHUoZGF0YS0+aXJxLCB0Y3B1KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL2V2ZW50cy9ldmVudHNfZmlmby5jIGIvZHJpdmVycy94ZW4vZXZlbnRzL2V2ZW50c19maWZvLmMKaW5kZXggMWRlMmExOS4uOTYxMDlhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vZXZlbnRzL2V2ZW50c19maWZvLmMKKysrIGIvZHJpdmVycy94ZW4vZXZlbnRzL2V2ZW50c19maWZvLmMKQEAgLTIzNSwxNCArMjM1LDEwIEBACiBzdGF0aWMgdm9pZCBoYW5kbGVfaXJxX2Zvcl9wb3J0KHVuc2lnbmVkIHBvcnQpCiB7CiAJaW50IGlycTsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAKIAlpcnEgPSBnZXRfZXZ0Y2huX3RvX2lycShwb3J0KTsKLQlpZiAoaXJxICE9IC0xKSB7Ci0JCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwotCQlpZiAoZGVzYykKLQkJCWdlbmVyaWNfaGFuZGxlX2lycV9kZXNjKGlycSwgZGVzYyk7Ci0JfQorCWlmIChpcnEgIT0gLTEpCisJCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOwogfQogCiBzdGF0aWMgdm9pZCBjb25zdW1lX29uZV9ldmVudCh1bnNpZ25lZCBjcHUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW4tYWNwaS1jcHVob3RwbHVnLmMgYi9kcml2ZXJzL3hlbi94ZW4tYWNwaS1jcHVob3RwbHVnLmMKaW5kZXggODA4NzVmYi4uM2U2MmVlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuLWFjcGktY3B1aG90cGx1Zy5jCisrKyBiL2RyaXZlcnMveGVuL3hlbi1hY3BpLWNwdWhvdHBsdWcuYwpAQCAtMzEzLDcgKzMxMyw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCSh2b2lkKSBhY3BpX2V2YWx1YXRlX2hvdHBsdWdfb3N0KGhhbmRsZSwgZXZlbnQsIG9zdF9jb2RlLCBOVUxMKTsKKwkodm9pZCkgYWNwaV9ldmFsdWF0ZV9vc3QoaGFuZGxlLCBldmVudCwgb3N0X2NvZGUsIE5VTEwpOwogCiBvdXQ6CiAJYWNwaV9zY2FuX2xvY2tfcmVsZWFzZSgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuLWFjcGktbWVtaG90cGx1Zy5jIGIvZHJpdmVycy94ZW4veGVuLWFjcGktbWVtaG90cGx1Zy5jCmluZGV4IGY4ZDE4NjIuLjM0ZTQwYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3hlbi1hY3BpLW1lbWhvdHBsdWcuYworKysgYi9kcml2ZXJzL3hlbi94ZW4tYWNwaS1tZW1ob3RwbHVnLmMKQEAgLTI4NSw3ICsyODUsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JKHZvaWQpIGFjcGlfZXZhbHVhdGVfaG90cGx1Z19vc3QoaGFuZGxlLCBldmVudCwgb3N0X2NvZGUsIE5VTEwpOworCSh2b2lkKSBhY3BpX2V2YWx1YXRlX29zdChoYW5kbGUsIGV2ZW50LCBvc3RfY29kZSwgTlVMTCk7CiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW4tYWNwaS1wYWQuYyBiL2RyaXZlcnMveGVuL3hlbi1hY3BpLXBhZC5jCmluZGV4IDQwYzRiYzAuLmY4M2I3NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3hlbi1hY3BpLXBhZC5jCisrKyBiL2RyaXZlcnMveGVuL3hlbi1hY3BpLXBhZC5jCkBAIC03NywyNyArNzcsMTQgQEAKIAlyZXR1cm4gbnVtOwogfQogCi0vKiBOb3RpZnkgZmlybXdhcmUgaG93IG1hbnkgQ1BVcyBhcmUgaWRsZSAqLwotc3RhdGljIHZvaWQgYWNwaV9wYWRfb3N0KGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHN0YXQsCi0JdWludDMyX3QgaWRsZV9udW1zKQotewotCXVuaW9uIGFjcGlfb2JqZWN0IHBhcmFtc1szXSA9IHsKLQkJey50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVIsfSwKLQkJey50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVIsfSwKLQkJey50eXBlID0gQUNQSV9UWVBFX0JVRkZFUix9LAotCX07Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJnX2xpc3QgPSB7MywgcGFyYW1zfTsKLQotCXBhcmFtc1swXS5pbnRlZ2VyLnZhbHVlID0gQUNQSV9QUk9DRVNTT1JfQUdHUkVHQVRPUl9OT1RJRlk7Ci0JcGFyYW1zWzFdLmludGVnZXIudmFsdWUgPSAgc3RhdDsKLQlwYXJhbXNbMl0uYnVmZmVyLmxlbmd0aCA9IDQ7Ci0JcGFyYW1zWzJdLmJ1ZmZlci5wb2ludGVyID0gKHZvaWQgKikmaWRsZV9udW1zOwotCWFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgIl9PU1QiLCAmYXJnX2xpc3QsIE5VTEwpOwotfQotCiBzdGF0aWMgdm9pZCBhY3BpX3BhZF9oYW5kbGVfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKIAlpbnQgaWRsZV9udW1zOworCXN0cnVjdCBhY3BpX2J1ZmZlciBwYXJhbSA9IHsKKwkJLmxlbmd0aCA9IDQsCisJCS5wb2ludGVyID0gKHZvaWQgKikmaWRsZV9udW1zLAorCX07CisKIAogCW11dGV4X2xvY2soJnhlbl9jcHVfbG9jayk7CiAJaWRsZV9udW1zID0gYWNwaV9wYWRfcHVyKGhhbmRsZSk7CkBAIC0xMDksNyArOTYsOCBAQAogCWlkbGVfbnVtcyA9IHhlbl9hY3BpX3BhZF9pZGxlX2NwdXMoaWRsZV9udW1zKQogCQkgICAgPzogeGVuX2FjcGlfcGFkX2lkbGVfY3B1c19udW0oKTsKIAlpZiAoaWRsZV9udW1zID49IDApCi0JCWFjcGlfcGFkX29zdChoYW5kbGUsIDAsIGlkbGVfbnVtcyk7CisJCWFjcGlfZXZhbHVhdGVfb3N0KGhhbmRsZSwgQUNQSV9QUk9DRVNTT1JfQUdHUkVHQVRPUl9OT1RJRlksCisJCQkJICAwLCAmcGFyYW0pOwogCW11dGV4X3VubG9jaygmeGVuX2NwdV9sb2NrKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZyBiL2ZzL0tjb25maWcKaW5kZXggNzM4NWU1NC4uMzEyMzkzZiAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZworKysgYi9mcy9LY29uZmlnCkBAIC05Niw2ICs5Niw3IEBACiBtZW51ICJQc2V1ZG8gZmlsZXN5c3RlbXMiCiAKIHNvdXJjZSAiZnMvcHJvYy9LY29uZmlnIgorc291cmNlICJmcy9rZXJuZnMvS2NvbmZpZyIKIHNvdXJjZSAiZnMvc3lzZnMvS2NvbmZpZyIKIAogY29uZmlnIFRNUEZTCmRpZmYgLS1naXQgYS9mcy9NYWtlZmlsZSBiL2ZzL01ha2VmaWxlCmluZGV4IDQ3YWMwN2IuLmY5Y2I5ODcgMTAwNjQ0Ci0tLSBhL2ZzL01ha2VmaWxlCisrKyBiL2ZzL01ha2VmaWxlCkBAIC01Miw3ICs1Miw4IEBACiBvYmoteQkJCQkrPSBxdW90YS8KIAogb2JqLSQoQ09ORklHX1BST0NfRlMpCQkrPSBwcm9jLwotb2JqLSQoQ09ORklHX1NZU0ZTKQkJKz0gc3lzZnMvIGtlcm5mcy8KK29iai0kKENPTkZJR19LRVJORlMpCQkrPSBrZXJuZnMvCitvYmotJChDT05GSUdfU1lTRlMpCQkrPSBzeXNmcy8KIG9iai0kKENPTkZJR19DT05GSUdGU19GUykJKz0gY29uZmlnZnMvCiBvYmoteQkJCQkrPSBkZXZwdHMvCiAKZGlmZiAtLWdpdCBhL2ZzL2Jpby1pbnRlZ3JpdHkuYyBiL2ZzL2Jpby1pbnRlZ3JpdHkuYwppbmRleCA0ZjcwZjM4Li4yOTY5NmI3IDEwMDY0NAotLS0gYS9mcy9iaW8taW50ZWdyaXR5LmMKKysrIGIvZnMvYmlvLWludGVncml0eS5jCkBAIC0zMDEsMjUgKzMwMSwyNSBAQAogRVhQT1JUX1NZTUJPTChiaW9faW50ZWdyaXR5X2dldF90YWcpOwogCiAvKioKLSAqIGJpb19pbnRlZ3JpdHlfZ2VuZXJhdGUgLSBHZW5lcmF0ZSBpbnRlZ3JpdHkgbWV0YWRhdGEgZm9yIGEgYmlvCi0gKiBAYmlvOgliaW8gdG8gZ2VuZXJhdGUgaW50ZWdyaXR5IG1ldGFkYXRhIGZvcgotICoKLSAqIERlc2NyaXB0aW9uOiBHZW5lcmF0ZXMgaW50ZWdyaXR5IG1ldGFkYXRhIGZvciBhIGJpbyBieSBjYWxsaW5nIHRoZQotICogYmxvY2sgZGV2aWNlJ3MgZ2VuZXJhdGlvbiBjYWxsYmFjayBmdW5jdGlvbi4gIFRoZSBiaW8gbXVzdCBoYXZlIGEKLSAqIGJpcCBhdHRhY2hlZCB3aXRoIGVub3VnaCByb29tIHRvIGFjY29tbW9kYXRlIHRoZSBnZW5lcmF0ZWQKLSAqIGludGVncml0eSBtZXRhZGF0YS4KKyAqIGJpb19pbnRlZ3JpdHlfZ2VuZXJhdGVfdmVyaWZ5IC0gR2VuZXJhdGUvdmVyaWZ5IGludGVncml0eSBtZXRhZGF0YSBmb3IgYSBiaW8KKyAqIEBiaW86CWJpbyB0byBnZW5lcmF0ZS92ZXJpZnkgaW50ZWdyaXR5IG1ldGFkYXRhIGZvcgorICogQG9wZXJhdGU6CW9wZXJhdGUgbnVtYmVyLCAxIGZvciBnZW5lcmF0ZSwgMCBmb3IgdmVyaWZ5CiAgKi8KLXN0YXRpYyB2b2lkIGJpb19pbnRlZ3JpdHlfZ2VuZXJhdGUoc3RydWN0IGJpbyAqYmlvKQorc3RhdGljIGludCBiaW9faW50ZWdyaXR5X2dlbmVyYXRlX3ZlcmlmeShzdHJ1Y3QgYmlvICpiaW8sIGludCBvcGVyYXRlKQogewogCXN0cnVjdCBibGtfaW50ZWdyaXR5ICpiaSA9IGJkZXZfZ2V0X2ludGVncml0eShiaW8tPmJpX2JkZXYpOwogCXN0cnVjdCBibGtfaW50ZWdyaXR5X2V4Y2hnIGJpeDsKIAlzdHJ1Y3QgYmlvX3ZlYyBidjsKIAlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7Ci0Jc2VjdG9yX3Qgc2VjdG9yID0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvcjsKLQl1bnNpZ25lZCBpbnQgc2VjdG9ycywgdG90YWw7CisJc2VjdG9yX3Qgc2VjdG9yOworCXVuc2lnbmVkIGludCBzZWN0b3JzLCByZXQgPSAwOwogCXZvaWQgKnByb3RfYnVmID0gYmlvLT5iaV9pbnRlZ3JpdHktPmJpcF9idWY7CiAKLQl0b3RhbCA9IDA7CisJaWYgKG9wZXJhdGUpCisJCXNlY3RvciA9IGJpby0+YmlfaXRlci5iaV9zZWN0b3I7CisJZWxzZQorCQlzZWN0b3IgPSBiaW8tPmJpX2ludGVncml0eS0+YmlwX2l0ZXIuYmlfc2VjdG9yOworCiAJYml4LmRpc2tfbmFtZSA9IGJpby0+YmlfYmRldi0+YmRfZGlzay0+ZGlza19uYW1lOwogCWJpeC5zZWN0b3Jfc2l6ZSA9IGJpLT5zZWN0b3Jfc2l6ZTsKIApAQCAtMzMwLDE2ICszMzAsMzcgQEAKIAkJYml4LnByb3RfYnVmID0gcHJvdF9idWY7CiAJCWJpeC5zZWN0b3IgPSBzZWN0b3I7CiAKLQkJYmktPmdlbmVyYXRlX2ZuKCZiaXgpOworCQlpZiAob3BlcmF0ZSkgeworCQkJYmktPmdlbmVyYXRlX2ZuKCZiaXgpOworCQl9IGVsc2UgeworCQkJcmV0ID0gYmktPnZlcmlmeV9mbigmYml4KTsKKwkJCWlmIChyZXQpIHsKKwkJCQlrdW5tYXBfYXRvbWljKGthZGRyKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CiAKIAkJc2VjdG9ycyA9IGJ2LmJ2X2xlbiAvIGJpLT5zZWN0b3Jfc2l6ZTsKIAkJc2VjdG9yICs9IHNlY3RvcnM7CiAJCXByb3RfYnVmICs9IHNlY3RvcnMgKiBiaS0+dHVwbGVfc2l6ZTsKLQkJdG90YWwgKz0gc2VjdG9ycyAqIGJpLT50dXBsZV9zaXplOwotCQlCVUdfT04odG90YWwgPiBiaW8tPmJpX2ludGVncml0eS0+YmlwX2l0ZXIuYmlfc2l6ZSk7CiAKIAkJa3VubWFwX2F0b21pYyhrYWRkcik7CiAJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYmlvX2ludGVncml0eV9nZW5lcmF0ZSAtIEdlbmVyYXRlIGludGVncml0eSBtZXRhZGF0YSBmb3IgYSBiaW8KKyAqIEBiaW86CWJpbyB0byBnZW5lcmF0ZSBpbnRlZ3JpdHkgbWV0YWRhdGEgZm9yCisgKgorICogRGVzY3JpcHRpb246IEdlbmVyYXRlcyBpbnRlZ3JpdHkgbWV0YWRhdGEgZm9yIGEgYmlvIGJ5IGNhbGxpbmcgdGhlCisgKiBibG9jayBkZXZpY2UncyBnZW5lcmF0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uLiAgVGhlIGJpbyBtdXN0IGhhdmUgYQorICogYmlwIGF0dGFjaGVkIHdpdGggZW5vdWdoIHJvb20gdG8gYWNjb21tb2RhdGUgdGhlIGdlbmVyYXRlZAorICogaW50ZWdyaXR5IG1ldGFkYXRhLgorICovCitzdGF0aWMgdm9pZCBiaW9faW50ZWdyaXR5X2dlbmVyYXRlKHN0cnVjdCBiaW8gKmJpbykKK3sKKwliaW9faW50ZWdyaXR5X2dlbmVyYXRlX3ZlcmlmeShiaW8sIDEpOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGJsa19pbnRlZ3JpdHlfdHVwbGVfc2l6ZShzdHJ1Y3QgYmxrX2ludGVncml0eSAqYmkpCkBAIC00NTQsNDAgKzQ3NSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgYmlvX2ludGVncml0eV92ZXJpZnkoc3RydWN0IGJpbyAqYmlvKQogewotCXN0cnVjdCBibGtfaW50ZWdyaXR5ICpiaSA9IGJkZXZfZ2V0X2ludGVncml0eShiaW8tPmJpX2JkZXYpOwotCXN0cnVjdCBibGtfaW50ZWdyaXR5X2V4Y2hnIGJpeDsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7Ci0Jc2VjdG9yX3Qgc2VjdG9yID0gYmlvLT5iaV9pbnRlZ3JpdHktPmJpcF9pdGVyLmJpX3NlY3RvcjsKLQl1bnNpZ25lZCBpbnQgc2VjdG9ycywgcmV0ID0gMDsKLQl2b2lkICpwcm90X2J1ZiA9IGJpby0+YmlfaW50ZWdyaXR5LT5iaXBfYnVmOwotCWludCBpOwotCi0JYml4LmRpc2tfbmFtZSA9IGJpby0+YmlfYmRldi0+YmRfZGlzay0+ZGlza19uYW1lOwotCWJpeC5zZWN0b3Jfc2l6ZSA9IGJpLT5zZWN0b3Jfc2l6ZTsKLQotCWJpb19mb3JfZWFjaF9zZWdtZW50X2FsbChidiwgYmlvLCBpKSB7Ci0JCXZvaWQgKmthZGRyID0ga21hcF9hdG9taWMoYnYtPmJ2X3BhZ2UpOwotCi0JCWJpeC5kYXRhX2J1ZiA9IGthZGRyICsgYnYtPmJ2X29mZnNldDsKLQkJYml4LmRhdGFfc2l6ZSA9IGJ2LT5idl9sZW47Ci0JCWJpeC5wcm90X2J1ZiA9IHByb3RfYnVmOwotCQliaXguc2VjdG9yID0gc2VjdG9yOwotCi0JCXJldCA9IGJpLT52ZXJpZnlfZm4oJmJpeCk7Ci0KLQkJaWYgKHJldCkgewotCQkJa3VubWFwX2F0b21pYyhrYWRkcik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJc2VjdG9ycyA9IGJ2LT5idl9sZW4gLyBiaS0+c2VjdG9yX3NpemU7Ci0JCXNlY3RvciArPSBzZWN0b3JzOwotCQlwcm90X2J1ZiArPSBzZWN0b3JzICogYmktPnR1cGxlX3NpemU7Ci0KLQkJa3VubWFwX2F0b21pYyhrYWRkcik7Ci0JfQotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gYmlvX2ludGVncml0eV9nZW5lcmF0ZV92ZXJpZnkoYmlvLCAwKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9mcy9iaW8uYyBiL2ZzL2Jpby5jCmluZGV4IDg3NTRlN2IuLmIyZGQ0MmUgMTAwNjQ0Ci0tLSBhL2ZzL2Jpby5jCisrKyBiL2ZzL2Jpby5jCkBAIC0xMTYsNyArMTE2LDYgQEAKIAlpZiAoIXNsYWIpCiAJCWdvdG8gb3V0X3VubG9jazsKIAotCXByaW50ayhLRVJOX0lORk8gImJpbzogY3JlYXRlIHNsYWIgPCVzPiBhdCAlZFxuIiwgYnNsYWItPm5hbWUsIGVudHJ5KTsKIAlic2xhYi0+c2xhYiA9IHNsYWI7CiAJYnNsYWItPnNsYWJfcmVmID0gMTsKIAlic2xhYi0+c2xhYl9zaXplID0gc3o7CmRpZmYgLS1naXQgYS9mcy9jb21wYXQuYyBiL2ZzL2NvbXBhdC5jCmluZGV4IDE5MjUyYjkuLmY4NmRmODUgMTAwNjQ0Ci0tLSBhL2ZzL2NvbXBhdC5jCisrKyBiL2ZzL2NvbXBhdC5jCkBAIC05Miw4ICs5Miw4IEBACiAJc3RydWN0IHRpbWVzcGVjIHR2WzJdOwogCiAJaWYgICh0KSB7Ci0JCWlmIChnZXRfY29tcGF0X3RpbWVzcGVjKCZ0dlswXSwgJnRbMF0pIHx8Ci0JCSAgICBnZXRfY29tcGF0X3RpbWVzcGVjKCZ0dlsxXSwgJnRbMV0pKQorCQlpZiAoY29tcGF0X2dldF90aW1lc3BlYygmdHZbMF0sICZ0WzBdKSB8fAorCQkgICAgY29tcGF0X2dldF90aW1lc3BlYygmdHZbMV0sICZ0WzFdKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCWlmICh0dlswXS50dl9uc2VjID09IFVUSU1FX09NSVQgJiYgdHZbMV0udHZfbnNlYyA9PSBVVElNRV9PTUlUKQpAQCAtNTA1LDcgKzUwNSw3IEBACiAJc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdXQgPSBOVUxMOwogCiAJaWYgKHRpbWVvdXQpIHsKLQkJaWYgKGdldF9jb21wYXRfdGltZXNwZWMoJnQsIHRpbWVvdXQpKQorCQlpZiAoY29tcGF0X2dldF90aW1lc3BlYygmdCwgdGltZW91dCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQl1dCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqdXQpKTsKZGlmZiAtLWdpdCBhL2ZzL2tlcm5mcy9LY29uZmlnIGIvZnMva2VybmZzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3YjVmNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2tlcm5mcy9LY29uZmlnCkBAIC0wLDAgKzEsNyBAQAorIworIyBLRVJORlMgc2hvdWxkIGJlIHNlbGVjdGVkIGJ5IGl0cyB1c2VycworIworCitjb25maWcgS0VSTkZTCisJYm9vbAorCWRlZmF1bHQgbgpkaWZmIC0tZ2l0IGEvZnMva2VybmZzL2Rpci5jIGIvZnMva2VybmZzL2Rpci5jCmluZGV4IGJkNmUxOGIuLjBiZDA1YWIgMTAwNjQ0Ci0tLSBhL2ZzL2tlcm5mcy9kaXIuYworKysgYi9mcy9rZXJuZnMvZGlyLmMKQEAgLTgsNiArOCw3IEBACiAgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KQEAgLTE4LDkgKzE5LDE2MSBAQAogI2luY2x1ZGUgImtlcm5mcy1pbnRlcm5hbC5oIgogCiBERUZJTkVfTVVURVgoa2VybmZzX211dGV4KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soa2VybmZzX3JlbmFtZV9sb2NrKTsJLyoga24tPnBhcmVudCBhbmQgLT5uYW1lICovCitzdGF0aWMgY2hhciBrZXJuZnNfcHJfY29udF9idWZbUEFUSF9NQVhdOwkvKiBwcm90ZWN0ZWQgYnkgcmVuYW1lX2xvY2sgKi8KIAogI2RlZmluZSByYl90b19rbihYKSByYl9lbnRyeSgoWCksIHN0cnVjdCBrZXJuZnNfbm9kZSwgcmIpCiAKK3N0YXRpYyBib29sIGtlcm5mc19hY3RpdmUoc3RydWN0IGtlcm5mc19ub2RlICprbikKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZrZXJuZnNfbXV0ZXgpOworCXJldHVybiBhdG9taWNfcmVhZCgma24tPmFjdGl2ZSkgPj0gMDsKK30KKworc3RhdGljIGJvb2wga2VybmZzX2xvY2tkZXAoc3RydWN0IGtlcm5mc19ub2RlICprbikKK3sKKyNpZmRlZiBDT05GSUdfREVCVUdfTE9DS19BTExPQworCXJldHVybiBrbi0+ZmxhZ3MgJiBLRVJORlNfTE9DS0RFUDsKKyNlbHNlCisJcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQga2VybmZzX25hbWVfbG9ja2VkKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24sIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKK3sKKwlyZXR1cm4gc3RybGNweShidWYsIGtuLT5wYXJlbnQgPyBrbi0+bmFtZSA6ICIvIiwgYnVmbGVuKTsKK30KKworc3RhdGljIGNoYXIgKiBfX211c3RfY2hlY2sga2VybmZzX3BhdGhfbG9ja2VkKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24sIGNoYXIgKmJ1ZiwKKwkJCQkJICAgICAgc2l6ZV90IGJ1ZmxlbikKK3sKKwljaGFyICpwID0gYnVmICsgYnVmbGVuOworCWludCBsZW47CisKKwkqLS1wID0gJ1wwJzsKKworCWRvIHsKKwkJbGVuID0gc3RybGVuKGtuLT5uYW1lKTsKKwkJaWYgKHAgLSBidWYgPCBsZW4gKyAxKSB7CisJCQlidWZbMF0gPSAnXDAnOworCQkJcCA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlwIC09IGxlbjsKKwkJbWVtY3B5KHAsIGtuLT5uYW1lLCBsZW4pOworCQkqLS1wID0gJy8nOworCQlrbiA9IGtuLT5wYXJlbnQ7CisJfSB3aGlsZSAoa24gJiYga24tPnBhcmVudCk7CisKKwlyZXR1cm4gcDsKK30KKworLyoqCisgKiBrZXJuZnNfbmFtZSAtIG9idGFpbiB0aGUgbmFtZSBvZiBhIGdpdmVuIG5vZGUKKyAqIEBrbjoga2VybmZzX25vZGUgb2YgaW50ZXJlc3QKKyAqIEBidWY6IGJ1ZmZlciB0byBjb3B5IEBrbidzIG5hbWUgaW50bworICogQGJ1Zmxlbjogc2l6ZSBvZiBAYnVmCisgKgorICogQ29waWVzIHRoZSBuYW1lIG9mIEBrbiBpbnRvIEBidWYgb2YgQGJ1ZmxlbiBieXRlcy4gIFRoZSBiZWhhdmlvciBpcworICogc2ltaWxhciB0byBzdHJsY3B5KCkuICBJdCByZXR1cm5zIHRoZSBsZW5ndGggb2YgQGtuJ3MgbmFtZSBhbmQgaWYgQGJ1ZgorICogaXNuJ3QgbG9uZyBlbm91Z2gsIGl0J3MgZmlsbGVkIHVwdG8gQGJ1Zmxlbi0xIGFuZCBudWwgdGVybWluYXRlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZnJvbSBhbnkgY29udGV4dC4KKyAqLworaW50IGtlcm5mc19uYW1lKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24sIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgma2VybmZzX3JlbmFtZV9sb2NrLCBmbGFncyk7CisJcmV0ID0ga2VybmZzX25hbWVfbG9ja2VkKGtuLCBidWYsIGJ1Zmxlbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma2VybmZzX3JlbmFtZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBrZXJuZnNfcGF0aCAtIGJ1aWxkIGZ1bGwgcGF0aCBvZiBhIGdpdmVuIG5vZGUKKyAqIEBrbjoga2VybmZzX25vZGUgb2YgaW50ZXJlc3QKKyAqIEBidWY6IGJ1ZmZlciB0byBjb3B5IEBrbidzIG5hbWUgaW50bworICogQGJ1Zmxlbjogc2l6ZSBvZiBAYnVmCisgKgorICogQnVpbGRzIGFuZCByZXR1cm5zIHRoZSBmdWxsIHBhdGggb2YgQGtuIGluIEBidWYgb2YgQGJ1ZmxlbiBieXRlcy4gIFRoZQorICogcGF0aCBpcyBidWlsdCBmcm9tIHRoZSBlbmQgb2YgQGJ1ZiBzbyB0aGUgcmV0dXJuZWQgcG9pbnRlciB1c3VhbGx5CisgKiBkb2Vzbid0IG1hdGNoIEBidWYuICBJZiBAYnVmIGlzbid0IGxvbmcgZW5vdWdoLCBAYnVmIGlzIG51bCB0ZXJtaW5hdGVkCisgKiBhbmQgJU5VTEwgaXMgcmV0dXJuZWQuCisgKi8KK2NoYXIgKmtlcm5mc19wYXRoKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24sIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNoYXIgKnA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgma2VybmZzX3JlbmFtZV9sb2NrLCBmbGFncyk7CisJcCA9IGtlcm5mc19wYXRoX2xvY2tlZChrbiwgYnVmLCBidWZsZW4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtlcm5mc19yZW5hbWVfbG9jaywgZmxhZ3MpOworCXJldHVybiBwOworfQorCisvKioKKyAqIHByX2NvbnRfa2VybmZzX25hbWUgLSBwcl9jb250IG5hbWUgb2YgYSBrZXJuZnNfbm9kZQorICogQGtuOiBrZXJuZnNfbm9kZSBvZiBpbnRlcmVzdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBmcm9tIGFueSBjb250ZXh0LgorICovCit2b2lkIHByX2NvbnRfa2VybmZzX25hbWUoc3RydWN0IGtlcm5mc19ub2RlICprbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmtlcm5mc19yZW5hbWVfbG9jaywgZmxhZ3MpOworCisJa2VybmZzX25hbWVfbG9ja2VkKGtuLCBrZXJuZnNfcHJfY29udF9idWYsIHNpemVvZihrZXJuZnNfcHJfY29udF9idWYpKTsKKwlwcl9jb250KCIlcyIsIGtlcm5mc19wcl9jb250X2J1Zik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrZXJuZnNfcmVuYW1lX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBwcl9jb250X2tlcm5mc19wYXRoIC0gcHJfY29udCBwYXRoIG9mIGEga2VybmZzX25vZGUKKyAqIEBrbjoga2VybmZzX25vZGUgb2YgaW50ZXJlc3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZnJvbSBhbnkgY29udGV4dC4KKyAqLwordm9pZCBwcl9jb250X2tlcm5mc19wYXRoKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyICpwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmtlcm5mc19yZW5hbWVfbG9jaywgZmxhZ3MpOworCisJcCA9IGtlcm5mc19wYXRoX2xvY2tlZChrbiwga2VybmZzX3ByX2NvbnRfYnVmLAorCQkJICAgICAgIHNpemVvZihrZXJuZnNfcHJfY29udF9idWYpKTsKKwlpZiAocCkKKwkJcHJfY29udCgiJXMiLCBwKTsKKwllbHNlCisJCXByX2NvbnQoIjxuYW1lIHRvbyBsb25nPiIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma2VybmZzX3JlbmFtZV9sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICoga2VybmZzX2dldF9wYXJlbnQgLSBkZXRlcm1pbmUgdGhlIHBhcmVudCBub2RlIGFuZCBwaW4gaXQKKyAqIEBrbjoga2VybmZzX25vZGUgb2YgaW50ZXJlc3QKKyAqCisgKiBEZXRlcm1pbmVzIEBrbidzIHBhcmVudCwgcGlucyBhbmQgcmV0dXJucyBpdC4gIFRoaXMgZnVuY3Rpb24gY2FuIGJlCisgKiBjYWxsZWQgZnJvbSBhbnkgY29udGV4dC4KKyAqLworc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZ2V0X3BhcmVudChzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQoreworCXN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgma2VybmZzX3JlbmFtZV9sb2NrLCBmbGFncyk7CisJcGFyZW50ID0ga24tPnBhcmVudDsKKwlrZXJuZnNfZ2V0KHBhcmVudCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma2VybmZzX3JlbmFtZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcGFyZW50OworfQorCiAvKioKICAqCWtlcm5mc19uYW1lX2hhc2gKICAqCUBuYW1lOiBOdWxsIHRlcm1pbmF0ZWQgc3RyaW5nIHRvIGhhc2gKQEAgLTM3LDcgKzE5MCw3IEBACiAJaGFzaCA9IChlbmRfbmFtZV9oYXNoKGhhc2gpIF4gaGFzaF9wdHIoKHZvaWQgKilucywgMzEpKTsKIAloYXNoICY9IDB4N2ZmZmZmZmZVOwogCS8qIFJlc2VydmUgaGFzaCBudW1iZXJzIDAsIDEgYW5kIElOVF9NQVggZm9yIG1hZ2ljIGRpcmVjdG9yeSBlbnRyaWVzICovCi0JaWYgKGhhc2ggPCAxKQorCWlmIChoYXNoIDwgMikKIAkJaGFzaCArPSAyOwogCWlmIChoYXNoID49IElOVF9NQVgpCiAJCWhhc2ggPSBJTlRfTUFYIC0gMTsKQEAgLTEwNSwxOCArMjU4LDI0IEBACiAgKglrZXJuZnNfdW5saW5rX3NpYmxpbmcgLSB1bmxpbmsga2VybmZzX25vZGUgZnJvbSBzaWJsaW5nIHJidHJlZQogICoJQGtuOiBrZXJuZnNfbm9kZSBvZiBpbnRlcmVzdAogICoKLSAqCVVubGluayBAa24gZnJvbSBpdHMgc2libGluZyByYnRyZWUgd2hpY2ggc3RhcnRzIGZyb20KLSAqCWtuLT5wYXJlbnQtPmRpci5jaGlsZHJlbi4KKyAqCVRyeSB0byB1bmxpbmsgQGtuIGZyb20gaXRzIHNpYmxpbmcgcmJ0cmVlIHdoaWNoIHN0YXJ0cyBmcm9tCisgKglrbi0+cGFyZW50LT5kaXIuY2hpbGRyZW4uICBSZXR1cm5zICV0cnVlIGlmIEBrbiB3YXMgYWN0dWFsbHkKKyAqCXJlbW92ZWQsICVmYWxzZSBpZiBAa24gd2Fzbid0IG9uIHRoZSByYnRyZWUuCiAgKgogICoJTG9ja2luZzoKICAqCW11dGV4X2xvY2soa2VybmZzX211dGV4KQogICovCi1zdGF0aWMgdm9pZCBrZXJuZnNfdW5saW5rX3NpYmxpbmcoc3RydWN0IGtlcm5mc19ub2RlICprbikKK3N0YXRpYyBib29sIGtlcm5mc191bmxpbmtfc2libGluZyhzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQogeworCWlmIChSQl9FTVBUWV9OT0RFKCZrbi0+cmIpKQorCQlyZXR1cm4gZmFsc2U7CisKIAlpZiAoa2VybmZzX3R5cGUoa24pID09IEtFUk5GU19ESVIpCiAJCWtuLT5wYXJlbnQtPmRpci5zdWJkaXJzLS07CiAKIAlyYl9lcmFzZSgma24tPnJiLCAma24tPnBhcmVudC0+ZGlyLmNoaWxkcmVuKTsKKwlSQl9DTEVBUl9OT0RFKCZrbi0+cmIpOworCXJldHVybiB0cnVlOwogfQogCiAvKioKQEAgLTEzNyw3ICsyOTYsNyBAQAogCWlmICghYXRvbWljX2luY191bmxlc3NfbmVnYXRpdmUoJmtuLT5hY3RpdmUpKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChrbi0+ZmxhZ3MgJiBLRVJORlNfTE9DS0RFUCkKKwlpZiAoa2VybmZzX2xvY2tkZXAoa24pKQogCQlyd3NlbV9hY3F1aXJlX3JlYWQoJmtuLT5kZXBfbWFwLCAwLCAxLCBfUkVUX0lQXyk7CiAJcmV0dXJuIGtuOwogfQpAQCAtMTUxLDU5ICszMTAsNTcgQEAKICAqLwogdm9pZCBrZXJuZnNfcHV0X2FjdGl2ZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQogeworCXN0cnVjdCBrZXJuZnNfcm9vdCAqcm9vdCA9IGtlcm5mc19yb290KGtuKTsKIAlpbnQgdjsKIAogCWlmICh1bmxpa2VseSgha24pKQogCQlyZXR1cm47CiAKLQlpZiAoa24tPmZsYWdzICYgS0VSTkZTX0xPQ0tERVApCisJaWYgKGtlcm5mc19sb2NrZGVwKGtuKSkKIAkJcndzZW1fcmVsZWFzZSgma24tPmRlcF9tYXAsIDEsIF9SRVRfSVBfKTsKIAl2ID0gYXRvbWljX2RlY19yZXR1cm4oJmtuLT5hY3RpdmUpOwogCWlmIChsaWtlbHkodiAhPSBLTl9ERUFDVElWQVRFRF9CSUFTKSkKIAkJcmV0dXJuOwogCi0JLyoKLQkgKiBhdG9taWNfZGVjX3JldHVybigpIGlzIGEgbWIoKSwgd2UnbGwgYWx3YXlzIHNlZSB0aGUgdXBkYXRlZAotCSAqIGtuLT51LmNvbXBsZXRpb24uCi0JICovCi0JY29tcGxldGUoa24tPnUuY29tcGxldGlvbik7CisJd2FrZV91cF9hbGwoJnJvb3QtPmRlYWN0aXZhdGVfd2FpdHEpOwogfQogCiAvKioKLSAqCWtlcm5mc19kZWFjdGl2YXRlIC0gZGVhY3RpdmF0ZSBrZXJuZnNfbm9kZQotICoJQGtuOiBrZXJuZnNfbm9kZSB0byBkZWFjdGl2YXRlCisgKiBrZXJuZnNfZHJhaW4gLSBkcmFpbiBrZXJuZnNfbm9kZQorICogQGtuOiBrZXJuZnNfbm9kZSB0byBkcmFpbgogICoKLSAqCURlbnkgbmV3IGFjdGl2ZSByZWZlcmVuY2VzIGFuZCBkcmFpbiBleGlzdGluZyBvbmVzLgorICogRHJhaW4gZXhpc3RpbmcgdXNhZ2VzIGFuZCBudWtlIGFsbCBleGlzdGluZyBtbWFwcyBvZiBAa24uICBNdXRpcGxlCisgKiByZW1vdmVycyBtYXkgaW52b2tlIHRoaXMgZnVuY3Rpb24gY29uY3VycmVudGx5IG9uIEBrbiBhbmQgYWxsIHdpbGwKKyAqIHJldHVybiBhZnRlciBkcmFpbmluZyBpcyBjb21wbGV0ZS4KICAqLwotc3RhdGljIHZvaWQga2VybmZzX2RlYWN0aXZhdGUoc3RydWN0IGtlcm5mc19ub2RlICprbikKK3N0YXRpYyB2b2lkIGtlcm5mc19kcmFpbihzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQorCV9fcmVsZWFzZXMoJmtlcm5mc19tdXRleCkgX19hY3F1aXJlcygma2VybmZzX211dGV4KQogewotCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKHdhaXQpOwotCWludCB2OworCXN0cnVjdCBrZXJuZnNfcm9vdCAqcm9vdCA9IGtlcm5mc19yb290KGtuKTsKIAotCUJVR19PTighKGtuLT5mbGFncyAmIEtFUk5GU19SRU1PVkVEKSk7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgma2VybmZzX211dGV4KTsKKwlXQVJOX09OX09OQ0Uoa2VybmZzX2FjdGl2ZShrbikpOwogCi0JaWYgKCEoa2VybmZzX3R5cGUoa24pICYgS0VSTkZTX0FDVElWRV9SRUYpKQotCQlyZXR1cm47CisJbXV0ZXhfdW5sb2NrKCZrZXJuZnNfbXV0ZXgpOwogCi0Ja24tPnUuY29tcGxldGlvbiA9ICh2b2lkICopJndhaXQ7Ci0KLQlpZiAoa24tPmZsYWdzICYgS0VSTkZTX0xPQ0tERVApCisJaWYgKGtlcm5mc19sb2NrZGVwKGtuKSkgewogCQlyd3NlbV9hY3F1aXJlKCZrbi0+ZGVwX21hcCwgMCwgMCwgX1JFVF9JUF8pOwotCS8qIGF0b21pY19hZGRfcmV0dXJuKCkgaXMgYSBtYigpLCBwdXRfYWN0aXZlKCkgd2lsbCBhbHdheXMgc2VlCi0JICogdGhlIHVwZGF0ZWQga24tPnUuY29tcGxldGlvbi4KLQkgKi8KLQl2ID0gYXRvbWljX2FkZF9yZXR1cm4oS05fREVBQ1RJVkFURURfQklBUywgJmtuLT5hY3RpdmUpOwotCi0JaWYgKHYgIT0gS05fREVBQ1RJVkFURURfQklBUykgewotCQlpZiAoa24tPmZsYWdzICYgS0VSTkZTX0xPQ0tERVApCisJCWlmIChhdG9taWNfcmVhZCgma24tPmFjdGl2ZSkgIT0gS05fREVBQ1RJVkFURURfQklBUykKIAkJCWxvY2tfY29udGVuZGVkKCZrbi0+ZGVwX21hcCwgX1JFVF9JUF8pOwotCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ3YWl0KTsKIAl9CiAKLQlpZiAoa24tPmZsYWdzICYgS0VSTkZTX0xPQ0tERVApIHsKKwkvKiBidXQgZXZlcnlvbmUgc2hvdWxkIHdhaXQgZm9yIGRyYWluaW5nICovCisJd2FpdF9ldmVudChyb290LT5kZWFjdGl2YXRlX3dhaXRxLAorCQkgICBhdG9taWNfcmVhZCgma24tPmFjdGl2ZSkgPT0gS05fREVBQ1RJVkFURURfQklBUyk7CisKKwlpZiAoa2VybmZzX2xvY2tkZXAoa24pKSB7CiAJCWxvY2tfYWNxdWlyZWQoJmtuLT5kZXBfbWFwLCBfUkVUX0lQXyk7CiAJCXJ3c2VtX3JlbGVhc2UoJmtuLT5kZXBfbWFwLCAxLCBfUkVUX0lQXyk7CiAJfQorCisJa2VybmZzX3VubWFwX2Jpbl9maWxlKGtuKTsKKworCW11dGV4X2xvY2soJmtlcm5mc19tdXRleCk7CiB9CiAKIC8qKgpAQCAtMjM0LDEzICszOTEsMTUgQEAKIAkJcmV0dXJuOwogCXJvb3QgPSBrZXJuZnNfcm9vdChrbik7CiAgcmVwZWF0OgotCS8qIE1vdmluZy9yZW5hbWluZyBpcyBhbHdheXMgZG9uZSB3aGlsZSBob2xkaW5nIHJlZmVyZW5jZS4KKwkvKgorCSAqIE1vdmluZy9yZW5hbWluZyBpcyBhbHdheXMgZG9uZSB3aGlsZSBob2xkaW5nIHJlZmVyZW5jZS4KIAkgKiBrbi0+cGFyZW50IHdvbid0IGNoYW5nZSBiZW5lYXRoIHVzLgogCSAqLwogCXBhcmVudCA9IGtuLT5wYXJlbnQ7CiAKLQlXQVJOKCEoa24tPmZsYWdzICYgS0VSTkZTX1JFTU9WRUQpLCAia2VybmZzOiBmcmVlIHVzaW5nIGVudHJ5OiAlcy8lc1xuIiwKLQkgICAgIHBhcmVudCA/IHBhcmVudC0+bmFtZSA6ICIiLCBrbi0+bmFtZSk7CisJV0FSTl9PTkNFKGF0b21pY19yZWFkKCZrbi0+YWN0aXZlKSAhPSBLTl9ERUFDVElWQVRFRF9CSUFTLAorCQkgICJrZXJuZnNfcHV0OiAlcy8lczogcmVsZWFzZWQgd2l0aCBpbmNvcnJlY3QgYWN0aXZlX3JlZiAlZFxuIiwKKwkJICBwYXJlbnQgPyBwYXJlbnQtPm5hbWUgOiAiIiwga24tPm5hbWUsIGF0b21pY19yZWFkKCZrbi0+YWN0aXZlKSk7CiAKIAlpZiAoa2VybmZzX3R5cGUoa24pID09IEtFUk5GU19MSU5LKQogCQlrZXJuZnNfcHV0KGtuLT5zeW1saW5rLnRhcmdldF9rbik7CkBAIC0yODIsOCArNDQxLDggQEAKIAlrbiA9IGRlbnRyeS0+ZF9mc2RhdGE7CiAJbXV0ZXhfbG9jaygma2VybmZzX211dGV4KTsKIAotCS8qIFRoZSBrZXJuZnMgbm9kZSBoYXMgYmVlbiBkZWxldGVkICovCi0JaWYgKGtuLT5mbGFncyAmIEtFUk5GU19SRU1PVkVEKQorCS8qIFRoZSBrZXJuZnMgbm9kZSBoYXMgYmVlbiBkZWFjdGl2YXRlZCAqLworCWlmICgha2VybmZzX2FjdGl2ZShrbikpCiAJCWdvdG8gb3V0X2JhZDsKIAogCS8qIFRoZSBrZXJuZnMgbm9kZSBoYXMgYmVlbiBtb3ZlZD8gKi8KQEAgLTMyOCw2ICs0ODcsMjQgQEAKIAkuZF9yZWxlYXNlCT0ga2VybmZzX2RvcF9yZWxlYXNlLAogfTsKIAorLyoqCisgKiBrZXJuZnNfbm9kZV9mcm9tX2RlbnRyeSAtIGRldGVybWluZSBrZXJuZnNfbm9kZSBhc3NvY2lhdGVkIHdpdGggYSBkZW50cnkKKyAqIEBkZW50cnk6IHRoZSBkZW50cnkgaW4gcXVlc3Rpb24KKyAqCisgKiBSZXR1cm4gdGhlIGtlcm5mc19ub2RlIGFzc29jaWF0ZWQgd2l0aCBAZGVudHJ5LiAgSWYgQGRlbnRyeSBpcyBub3QgYQorICoga2VybmZzIG9uZSwgJU5VTEwgaXMgcmV0dXJuZWQuCisgKgorICogV2hpbGUgdGhlIHJldHVybmVkIGtlcm5mc19ub2RlIHdpbGwgc3RheSBhY2Nlc3NpYmxlIGFzIGxvbmcgYXMgQGRlbnRyeQorICogaXMgYWNjZXNzaWJsZSwgdGhlIHJldHVybmVkIG5vZGUgY2FuIGJlIGluIGFueSBzdGF0ZSBhbmQgdGhlIGNhbGxlciBpcworICogZnVsbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHdoYXQncyBhY2Nlc3NpYmxlLgorICovCitzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19ub2RlX2Zyb21fZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpZiAoZGVudHJ5LT5kX3NiLT5zX29wID09ICZrZXJuZnNfc29wcykKKwkJcmV0dXJuIGRlbnRyeS0+ZF9mc2RhdGE7CisJcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKl9fa2VybmZzX25ld19ub2RlKHN0cnVjdCBrZXJuZnNfcm9vdCAqcm9vdCwKIAkJCQkJICAgICBjb25zdCBjaGFyICpuYW1lLCB1bW9kZV90IG1vZGUsCiAJCQkJCSAgICAgdW5zaWduZWQgZmxhZ3MpCkBAIC0zNTIsMTEgKzUyOSwxMiBAQAogCWtuLT5pbm8gPSByZXQ7CiAKIAlhdG9taWNfc2V0KCZrbi0+Y291bnQsIDEpOwotCWF0b21pY19zZXQoJmtuLT5hY3RpdmUsIDApOworCWF0b21pY19zZXQoJmtuLT5hY3RpdmUsIEtOX0RFQUNUSVZBVEVEX0JJQVMpOworCVJCX0NMRUFSX05PREUoJmtuLT5yYik7CiAKIAlrbi0+bmFtZSA9IG5hbWU7CiAJa24tPm1vZGUgPSBtb2RlOwotCWtuLT5mbGFncyA9IGZsYWdzIHwgS0VSTkZTX1JFTU9WRUQ7CisJa24tPmZsYWdzID0gZmxhZ3M7CiAKIAlyZXR1cm4ga247CiAKQEAgLTM4Miw2OSArNTYwLDQ0IEBACiB9CiAKIC8qKgotICoJa2VybmZzX2FkZHJtX3N0YXJ0IC0gcHJlcGFyZSBmb3Iga2VybmZzX25vZGUgYWRkL3JlbW92ZQotICoJQGFjeHQ6IHBvaW50ZXIgdG8ga2VybmZzX2FkZHJtX2N4dCB0byBiZSB1c2VkCi0gKgotICoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIGFkZCBvciByZW1vdmUKLSAqCWtlcm5mc19ub2RlLiAgVGhpcyBmdW5jdGlvbiBhY3F1aXJlcyBrZXJuZnNfbXV0ZXguICBAYWN4dCBpcyB1c2VkCi0gKgl0byBrZWVwIGFuZCBwYXNzIGNvbnRleHQgdG8gb3RoZXIgYWRkcm0gZnVuY3Rpb25zLgotICoKLSAqCUxPQ0tJTkc6Ci0gKglLZXJuZWwgdGhyZWFkIGNvbnRleHQgKG1heSBzbGVlcCkuICBrZXJuZnNfbXV0ZXggaXMgbG9ja2VkIG9uCi0gKglyZXR1cm4uCi0gKi8KLXZvaWQga2VybmZzX2FkZHJtX3N0YXJ0KHN0cnVjdCBrZXJuZnNfYWRkcm1fY3h0ICphY3h0KQotCV9fYWNxdWlyZXMoa2VybmZzX211dGV4KQotewotCW1lbXNldChhY3h0LCAwLCBzaXplb2YoKmFjeHQpKTsKLQotCW11dGV4X2xvY2soJmtlcm5mc19tdXRleCk7Ci19Ci0KLS8qKgogICoJa2VybmZzX2FkZF9vbmUgLSBhZGQga2VybmZzX25vZGUgdG8gcGFyZW50IHdpdGhvdXQgd2FybmluZwotICoJQGFjeHQ6IGFkZHJtIGNvbnRleHQgdG8gdXNlCiAgKglAa246IGtlcm5mc19ub2RlIHRvIGJlIGFkZGVkCiAgKgogICoJVGhlIGNhbGxlciBtdXN0IGFscmVhZHkgaGF2ZSBpbml0aWFsaXplZCBAa24tPnBhcmVudC4gIFRoaXMKICAqCWZ1bmN0aW9uIGluY3JlbWVudHMgbmxpbmsgb2YgdGhlIHBhcmVudCdzIGlub2RlIGlmIEBrbiBpcyBhCiAgKglkaXJlY3RvcnkgYW5kIGxpbmsgaW50byB0aGUgY2hpbGRyZW4gbGlzdCBvZiB0aGUgcGFyZW50LgogICoKLSAqCVRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZXR3ZWVuIGNhbGxzIHRvCi0gKglrZXJuZnNfYWRkcm1fc3RhcnQoKSBhbmQga2VybmZzX2FkZHJtX2ZpbmlzaCgpIGFuZCBzaG91bGQgYmUgcGFzc2VkCi0gKgl0aGUgc2FtZSBAYWN4dCBhcyBwYXNzZWQgdG8ga2VybmZzX2FkZHJtX3N0YXJ0KCkuCi0gKgotICoJTE9DS0lORzoKLSAqCURldGVybWluZWQgYnkga2VybmZzX2FkZHJtX3N0YXJ0KCkuCi0gKgogICoJUkVUVVJOUzoKICAqCTAgb24gc3VjY2VzcywgLUVFWElTVCBpZiBlbnRyeSB3aXRoIHRoZSBnaXZlbiBuYW1lIGFscmVhZHkKICAqCWV4aXN0cy4KICAqLwotaW50IGtlcm5mc19hZGRfb25lKHN0cnVjdCBrZXJuZnNfYWRkcm1fY3h0ICphY3h0LCBzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQoraW50IGtlcm5mc19hZGRfb25lKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCiB7CiAJc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQgPSBrbi0+cGFyZW50OwotCWJvb2wgaGFzX25zID0ga2VybmZzX25zX2VuYWJsZWQocGFyZW50KTsKIAlzdHJ1Y3Qga2VybmZzX2lhdHRycyAqcHNfaWF0dHI7CisJYm9vbCBoYXNfbnM7CiAJaW50IHJldDsKIAotCWlmIChoYXNfbnMgIT0gKGJvb2wpa24tPm5zKSB7Ci0JCVdBUk4oMSwgS0VSTl9XQVJOSU5HICJrZXJuZnM6IG5zICVzIGluICclcycgZm9yICclcydcbiIsCi0JCSAgICAgaGFzX25zID8gInJlcXVpcmVkIiA6ICJpbnZhbGlkIiwgcGFyZW50LT5uYW1lLCBrbi0+bmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwltdXRleF9sb2NrKCZrZXJuZnNfbXV0ZXgpOworCisJcmV0ID0gLUVJTlZBTDsKKwloYXNfbnMgPSBrZXJuZnNfbnNfZW5hYmxlZChwYXJlbnQpOworCWlmIChXQVJOKGhhc19ucyAhPSAoYm9vbClrbi0+bnMsIEtFUk5fV0FSTklORyAia2VybmZzOiBucyAlcyBpbiAnJXMnIGZvciAnJXMnXG4iLAorCQkgaGFzX25zID8gInJlcXVpcmVkIiA6ICJpbnZhbGlkIiwgcGFyZW50LT5uYW1lLCBrbi0+bmFtZSkpCisJCWdvdG8gb3V0X3VubG9jazsKIAogCWlmIChrZXJuZnNfdHlwZShwYXJlbnQpICE9IEtFUk5GU19ESVIpCi0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIG91dF91bmxvY2s7CiAKLQlpZiAocGFyZW50LT5mbGFncyAmIEtFUk5GU19SRU1PVkVEKQotCQlyZXR1cm4gLUVOT0VOVDsKKwlyZXQgPSAtRU5PRU5UOworCWlmICgocGFyZW50LT5mbGFncyAmIEtFUk5GU19BQ1RJVkFURUQpICYmICFrZXJuZnNfYWN0aXZlKHBhcmVudCkpCisJCWdvdG8gb3V0X3VubG9jazsKIAogCWtuLT5oYXNoID0ga2VybmZzX25hbWVfaGFzaChrbi0+bmFtZSwga24tPm5zKTsKIAogCXJldCA9IGtlcm5mc19saW5rX3NpYmxpbmcoa24pOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0X3VubG9jazsKIAogCS8qIFVwZGF0ZSB0aW1lc3RhbXBzIG9uIHRoZSBwYXJlbnQgKi8KIAlwc19pYXR0ciA9IHBhcmVudC0+aWF0dHI7CkBAIC00NTMsODIgKzYwNiwyMiBAQAogCQlwc19pYXR0cnMtPmlhX2N0aW1lID0gcHNfaWF0dHJzLT5pYV9tdGltZSA9IENVUlJFTlRfVElNRTsKIAl9CiAKLQkvKiBNYXJrIHRoZSBlbnRyeSBhZGRlZCBpbnRvIGRpcmVjdG9yeSB0cmVlICovCi0Ja24tPmZsYWdzICY9IH5LRVJORlNfUkVNT1ZFRDsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqCWtlcm5mc19yZW1vdmVfb25lIC0gcmVtb3ZlIGtlcm5mc19ub2RlIGZyb20gcGFyZW50Ci0gKglAYWN4dDogYWRkcm0gY29udGV4dCB0byB1c2UKLSAqCUBrbjoga2VybmZzX25vZGUgdG8gYmUgcmVtb3ZlZAotICoKLSAqCU1hcmsgQGtuIHJlbW92ZWQgYW5kIGRyb3Agbmxpbmsgb2YgcGFyZW50IGlub2RlIGlmIEBrbiBpcyBhCi0gKglkaXJlY3RvcnkuICBAa24gaXMgdW5saW5rZWQgZnJvbSB0aGUgY2hpbGRyZW4gbGlzdC4KLSAqCi0gKglUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmV0d2VlbiBjYWxscyB0bwotICoJa2VybmZzX2FkZHJtX3N0YXJ0KCkgYW5kIGtlcm5mc19hZGRybV9maW5pc2goKSBhbmQgc2hvdWxkIGJlCi0gKglwYXNzZWQgdGhlIHNhbWUgQGFjeHQgYXMgcGFzc2VkIHRvIGtlcm5mc19hZGRybV9zdGFydCgpLgotICoKLSAqCUxPQ0tJTkc6Ci0gKglEZXRlcm1pbmVkIGJ5IGtlcm5mc19hZGRybV9zdGFydCgpLgotICovCi1zdGF0aWMgdm9pZCBrZXJuZnNfcmVtb3ZlX29uZShzdHJ1Y3Qga2VybmZzX2FkZHJtX2N4dCAqYWN4dCwKLQkJCSAgICAgIHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCi17Ci0Jc3RydWN0IGtlcm5mc19pYXR0cnMgKnBzX2lhdHRyOwotCi0JLyoKLQkgKiBSZW1vdmFsIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWUgbm9kZS4gIE9ubHkgdGhlCi0JICogZmlyc3QgaW52b2NhdGlvbiBpcyBlZmZlY3RpdmUgYW5kIHB1dHMgdGhlIGJhc2UgcmVmLgotCSAqLwotCWlmIChrbi0+ZmxhZ3MgJiBLRVJORlNfUkVNT1ZFRCkKLQkJcmV0dXJuOwotCi0JaWYgKGtuLT5wYXJlbnQpIHsKLQkJa2VybmZzX3VubGlua19zaWJsaW5nKGtuKTsKLQotCQkvKiBVcGRhdGUgdGltZXN0YW1wcyBvbiB0aGUgcGFyZW50ICovCi0JCXBzX2lhdHRyID0ga24tPnBhcmVudC0+aWF0dHI7Ci0JCWlmIChwc19pYXR0cikgewotCQkJcHNfaWF0dHItPmlhX2lhdHRyLmlhX2N0aW1lID0gQ1VSUkVOVF9USU1FOwotCQkJcHNfaWF0dHItPmlhX2lhdHRyLmlhX210aW1lID0gQ1VSUkVOVF9USU1FOwotCQl9Ci0JfQotCi0Ja24tPmZsYWdzIHw9IEtFUk5GU19SRU1PVkVEOwotCWtuLT51LnJlbW92ZWRfbGlzdCA9IGFjeHQtPnJlbW92ZWQ7Ci0JYWN4dC0+cmVtb3ZlZCA9IGtuOwotfQotCi0vKioKLSAqCWtlcm5mc19hZGRybV9maW5pc2ggLSBmaW5pc2ggdXAga2VybmZzX25vZGUgYWRkL3JlbW92ZQotICoJQGFjeHQ6IGFkZHJtIGNvbnRleHQgdG8gZmluaXNoIHVwCi0gKgotICoJRmluaXNoIHVwIGtlcm5mc19ub2RlIGFkZC9yZW1vdmUuICBSZXNvdXJjZXMgYWNxdWlyZWQgYnkKLSAqCWtlcm5mc19hZGRybV9zdGFydCgpIGFyZSByZWxlYXNlZCBhbmQgcmVtb3ZlZCBrZXJuZnNfbm9kZXMgYXJlCi0gKgljbGVhbmVkIHVwLgotICoKLSAqCUxPQ0tJTkc6Ci0gKglrZXJuZnNfbXV0ZXggaXMgcmVsZWFzZWQuCi0gKi8KLXZvaWQga2VybmZzX2FkZHJtX2ZpbmlzaChzdHJ1Y3Qga2VybmZzX2FkZHJtX2N4dCAqYWN4dCkKLQlfX3JlbGVhc2VzKGtlcm5mc19tdXRleCkKLXsKLQkvKiByZWxlYXNlIHJlc291cmNlcyBhY3F1aXJlZCBieSBrZXJuZnNfYWRkcm1fc3RhcnQoKSAqLwogCW11dGV4X3VubG9jaygma2VybmZzX211dGV4KTsKIAotCS8qIGtpbGwgcmVtb3ZlZCBrZXJuZnNfbm9kZXMgKi8KLQl3aGlsZSAoYWN4dC0+cmVtb3ZlZCkgewotCQlzdHJ1Y3Qga2VybmZzX25vZGUgKmtuID0gYWN4dC0+cmVtb3ZlZDsKKwkvKgorCSAqIEFjdGl2YXRlIHRoZSBuZXcgbm9kZSB1bmxlc3MgQ1JFQVRFX0RFQUNUSVZBVEVEIGlzIHJlcXVlc3RlZC4KKwkgKiBJZiBub3QgYWN0aXZhdGVkIGhlcmUsIHRoZSBrZXJuZnMgdXNlciBpcyByZXNwb25zaWJsZSBmb3IKKwkgKiBhY3RpdmF0aW5nIHRoZSBub2RlIHdpdGgga2VybmZzX2FjdGl2YXRlKCkuICBBIG5vZGUgd2hpY2ggaGFzbid0CisJICogYmVlbiBhY3RpdmF0ZWQgaXMgbm90IHZpc2libGUgdG8gdXNlcmxhbmQgYW5kIGl0cyByZW1vdmFsIHdvbid0CisJICogdHJpZ2dlciBkZWFjdGl2YXRpb24uCisJICovCisJaWYgKCEoa2VybmZzX3Jvb3Qoa24pLT5mbGFncyAmIEtFUk5GU19ST09UX0NSRUFURV9ERUFDVElWQVRFRCkpCisJCWtlcm5mc19hY3RpdmF0ZShrbik7CisJcmV0dXJuIDA7CiAKLQkJYWN4dC0+cmVtb3ZlZCA9IGtuLT51LnJlbW92ZWRfbGlzdDsKLQotCQlrZXJuZnNfZGVhY3RpdmF0ZShrbik7Ci0JCWtlcm5mc191bm1hcF9iaW5fZmlsZShrbik7Ci0JCWtlcm5mc19wdXQoa24pOwotCX0KK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZrZXJuZnNfbXV0ZXgpOworCXJldHVybiByZXQ7CiB9CiAKIC8qKgpAQCAtNTk5LDEzICs2OTIsMTUgQEAKIAogLyoqCiAgKiBrZXJuZnNfY3JlYXRlX3Jvb3QgLSBjcmVhdGUgYSBuZXcga2VybmZzIGhpZXJhcmNoeQotICogQGtkb3BzOiBvcHRpb25hbCBkaXJlY3Rvcnkgc3lzY2FsbCBvcGVyYXRpb25zIGZvciB0aGUgaGllcmFyY2h5CisgKiBAc2NvcHM6IG9wdGlvbmFsIHN5c2NhbGwgb3BlcmF0aW9ucyBmb3IgdGhlIGhpZXJhcmNoeQorICogQGZsYWdzOiBLRVJORlNfUk9PVF8qIGZsYWdzCiAgKiBAcHJpdjogb3BhcXVlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgZGlyZWN0b3J5CiAgKgogICogUmV0dXJucyB0aGUgcm9vdCBvZiB0aGUgbmV3IGhpZXJhcmNoeSBvbiBzdWNjZXNzLCBFUlJfUFRSKCkgdmFsdWUgb24KICAqIGZhaWx1cmUuCiAgKi8KLXN0cnVjdCBrZXJuZnNfcm9vdCAqa2VybmZzX2NyZWF0ZV9yb290KHN0cnVjdCBrZXJuZnNfZGlyX29wcyAqa2RvcHMsIHZvaWQgKnByaXYpCitzdHJ1Y3Qga2VybmZzX3Jvb3QgKmtlcm5mc19jcmVhdGVfcm9vdChzdHJ1Y3Qga2VybmZzX3N5c2NhbGxfb3BzICpzY29wcywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpwcml2KQogewogCXN0cnVjdCBrZXJuZnNfcm9vdCAqcm9vdDsKIAlzdHJ1Y3Qga2VybmZzX25vZGUgKmtuOwpAQCAtNjI0LDEyICs3MTksMTYgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCi0Ja24tPmZsYWdzICY9IH5LRVJORlNfUkVNT1ZFRDsKIAlrbi0+cHJpdiA9IHByaXY7CiAJa24tPmRpci5yb290ID0gcm9vdDsKIAotCXJvb3QtPmRpcl9vcHMgPSBrZG9wczsKKwlyb290LT5zeXNjYWxsX29wcyA9IHNjb3BzOworCXJvb3QtPmZsYWdzID0gZmxhZ3M7CiAJcm9vdC0+a24gPSBrbjsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyb290LT5kZWFjdGl2YXRlX3dhaXRxKTsKKworCWlmICghKHJvb3QtPmZsYWdzICYgS0VSTkZTX1JPT1RfQ1JFQVRFX0RFQUNUSVZBVEVEKSkKKwkJa2VybmZzX2FjdGl2YXRlKGtuKTsKIAogCXJldHVybiByb290OwogfQpAQCAtNjYwLDcgKzc1OSw2IEBACiAJCQkJCSBjb25zdCBjaGFyICpuYW1lLCB1bW9kZV90IG1vZGUsCiAJCQkJCSB2b2lkICpwcml2LCBjb25zdCB2b2lkICpucykKIHsKLQlzdHJ1Y3Qga2VybmZzX2FkZHJtX2N4dCBhY3h0OwogCXN0cnVjdCBrZXJuZnNfbm9kZSAqa247CiAJaW50IHJjOwogCkBAIC02NzQsMTAgKzc3Miw3IEBACiAJa24tPnByaXYgPSBwcml2OwogCiAJLyogbGluayBpbiAqLwotCWtlcm5mc19hZGRybV9zdGFydCgmYWN4dCk7Ci0JcmMgPSBrZXJuZnNfYWRkX29uZSgmYWN4dCwga24pOwotCWtlcm5mc19hZGRybV9maW5pc2goJmFjeHQpOwotCisJcmMgPSBrZXJuZnNfYWRkX29uZShrbik7CiAJaWYgKCFyYykKIAkJcmV0dXJuIGtuOwogCkBAIC03MDMsNyArNzk4LDcgQEAKIAlrbiA9IGtlcm5mc19maW5kX25zKHBhcmVudCwgZGVudHJ5LT5kX25hbWUubmFtZSwgbnMpOwogCiAJLyogbm8gc3VjaCBlbnRyeSAqLwotCWlmICgha24pIHsKKwlpZiAoIWtuIHx8ICFrZXJuZnNfYWN0aXZlKGtuKSkgewogCQlyZXQgPSBOVUxMOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQpAQCAtNzI4LDIzICs4MjMsMzcgQEAKIAkJCSAgICB1bW9kZV90IG1vZGUpCiB7CiAJc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQgPSBkaXItPmlfcHJpdmF0ZTsKLQlzdHJ1Y3Qga2VybmZzX2Rpcl9vcHMgKmtkb3BzID0ga2VybmZzX3Jvb3QocGFyZW50KS0+ZGlyX29wczsKKwlzdHJ1Y3Qga2VybmZzX3N5c2NhbGxfb3BzICpzY29wcyA9IGtlcm5mc19yb290KHBhcmVudCktPnN5c2NhbGxfb3BzOworCWludCByZXQ7CiAKLQlpZiAoIWtkb3BzIHx8ICFrZG9wcy0+bWtkaXIpCisJaWYgKCFzY29wcyB8fCAhc2NvcHMtPm1rZGlyKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JcmV0dXJuIGtkb3BzLT5ta2RpcihwYXJlbnQsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIG1vZGUpOworCWlmICgha2VybmZzX2dldF9hY3RpdmUocGFyZW50KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBzY29wcy0+bWtkaXIocGFyZW50LCBkZW50cnktPmRfbmFtZS5uYW1lLCBtb2RlKTsKKworCWtlcm5mc19wdXRfYWN0aXZlKHBhcmVudCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBrZXJuZnNfaW9wX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJc3RydWN0IGtlcm5mc19ub2RlICprbiAgPSBkZW50cnktPmRfZnNkYXRhOwotCXN0cnVjdCBrZXJuZnNfZGlyX29wcyAqa2RvcHMgPSBrZXJuZnNfcm9vdChrbiktPmRpcl9vcHM7CisJc3RydWN0IGtlcm5mc19zeXNjYWxsX29wcyAqc2NvcHMgPSBrZXJuZnNfcm9vdChrbiktPnN5c2NhbGxfb3BzOworCWludCByZXQ7CiAKLQlpZiAoIWtkb3BzIHx8ICFrZG9wcy0+cm1kaXIpCisJaWYgKCFzY29wcyB8fCAhc2NvcHMtPnJtZGlyKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JcmV0dXJuIGtkb3BzLT5ybWRpcihrbik7CisJaWYgKCFrZXJuZnNfZ2V0X2FjdGl2ZShrbikpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gc2NvcHMtPnJtZGlyKGtuKTsKKworCWtlcm5mc19wdXRfYWN0aXZlKGtuKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGtlcm5mc19pb3BfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKQEAgLTc1MiwxMiArODYxLDI1IEBACiB7CiAJc3RydWN0IGtlcm5mc19ub2RlICprbiAgPSBvbGRfZGVudHJ5LT5kX2ZzZGF0YTsKIAlzdHJ1Y3Qga2VybmZzX25vZGUgKm5ld19wYXJlbnQgPSBuZXdfZGlyLT5pX3ByaXZhdGU7Ci0Jc3RydWN0IGtlcm5mc19kaXJfb3BzICprZG9wcyA9IGtlcm5mc19yb290KGtuKS0+ZGlyX29wczsKKwlzdHJ1Y3Qga2VybmZzX3N5c2NhbGxfb3BzICpzY29wcyA9IGtlcm5mc19yb290KGtuKS0+c3lzY2FsbF9vcHM7CisJaW50IHJldDsKIAotCWlmICgha2RvcHMgfHwgIWtkb3BzLT5yZW5hbWUpCisJaWYgKCFzY29wcyB8fCAhc2NvcHMtPnJlbmFtZSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCXJldHVybiBrZG9wcy0+cmVuYW1lKGtuLCBuZXdfcGFyZW50LCBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSk7CisJaWYgKCFrZXJuZnNfZ2V0X2FjdGl2ZShrbikpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFrZXJuZnNfZ2V0X2FjdGl2ZShuZXdfcGFyZW50KSkgeworCQlrZXJuZnNfcHV0X2FjdGl2ZShrbik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldCA9IHNjb3BzLT5yZW5hbWUoa24sIG5ld19wYXJlbnQsIG5ld19kZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWtlcm5mc19wdXRfYWN0aXZlKG5ld19wYXJlbnQpOworCWtlcm5mc19wdXRfYWN0aXZlKGtuKTsKKwlyZXR1cm4gcmV0OwogfQogCiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBrZXJuZnNfZGlyX2lvcHMgPSB7CkBAIC04MzAsMjMgKzk1MiwxMDQgQEAKIAlyZXR1cm4gcG9zLT5wYXJlbnQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9fa2VybmZzX3JlbW92ZShzdHJ1Y3Qga2VybmZzX2FkZHJtX2N4dCAqYWN4dCwKLQkJCSAgICBzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQorLyoqCisgKiBrZXJuZnNfYWN0aXZhdGUgLSBhY3RpdmF0ZSBhIG5vZGUgd2hpY2ggc3RhcnRlZCBkZWFjdGl2YXRlZAorICogQGtuOiBrZXJuZnNfbm9kZSB3aG9zZSBzdWJ0cmVlIGlzIHRvIGJlIGFjdGl2YXRlZAorICoKKyAqIElmIHRoZSByb290IGhhcyBLRVJORlNfUk9PVF9DUkVBVEVfREVBQ1RJVkFURUQgc2V0LCBhIG5ld2x5IGNyZWF0ZWQgbm9kZQorICogbmVlZHMgdG8gYmUgZXhwbGljaXRseSBhY3RpdmF0ZWQuICBBIG5vZGUgd2hpY2ggaGFzbid0IGJlZW4gYWN0aXZhdGVkCisgKiBpc24ndCB2aXNpYmxlIHRvIHVzZXJsYW5kIGFuZCBkZWFjdGl2YXRpb24gaXMgc2tpcHBlZCBkdXJpbmcgaXRzCisgKiByZW1vdmFsLiAgVGhpcyBpcyB1c2VmdWwgdG8gY29uc3RydWN0IGF0b21pYyBpbml0IHNlcXVlbmNlcyB3aGVyZQorICogY3JlYXRpb24gb2YgbXVsdGlwbGUgbm9kZXMgc2hvdWxkIGVpdGhlciBzdWNjZWVkIG9yIGZhaWwgYXRvbWljYWxseS4KKyAqCisgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgbm90IGNhbGxlZAorICogYWZ0ZXIga2VybmZzX3JlbW92ZSooKSBpcyBpbnZva2VkIG9uIEBrbi4KKyAqLwordm9pZCBrZXJuZnNfYWN0aXZhdGUoc3RydWN0IGtlcm5mc19ub2RlICprbikKIHsKLQlzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcywgKm5leHQ7CisJc3RydWN0IGtlcm5mc19ub2RlICpwb3M7CiAKLQlpZiAoIWtuKQorCW11dGV4X2xvY2soJmtlcm5mc19tdXRleCk7CisKKwlwb3MgPSBOVUxMOworCXdoaWxlICgocG9zID0ga2VybmZzX25leHRfZGVzY2VuZGFudF9wb3N0KHBvcywga24pKSkgeworCQlpZiAoIXBvcyB8fCAocG9zLT5mbGFncyAmIEtFUk5GU19BQ1RJVkFURUQpKQorCQkJY29udGludWU7CisKKwkJV0FSTl9PTl9PTkNFKHBvcy0+cGFyZW50ICYmIFJCX0VNUFRZX05PREUoJnBvcy0+cmIpKTsKKwkJV0FSTl9PTl9PTkNFKGF0b21pY19yZWFkKCZwb3MtPmFjdGl2ZSkgIT0gS05fREVBQ1RJVkFURURfQklBUyk7CisKKwkJYXRvbWljX3N1YihLTl9ERUFDVElWQVRFRF9CSUFTLCAmcG9zLT5hY3RpdmUpOworCQlwb3MtPmZsYWdzIHw9IEtFUk5GU19BQ1RJVkFURUQ7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZrZXJuZnNfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBfX2tlcm5mc19yZW1vdmUoc3RydWN0IGtlcm5mc19ub2RlICprbikKK3sKKwlzdHJ1Y3Qga2VybmZzX25vZGUgKnBvczsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmtlcm5mc19tdXRleCk7CisKKwkvKgorCSAqIFNob3J0LWNpcmN1aXQgaWYgbm9uLXJvb3QgQGtuIGhhcyBhbHJlYWR5IGZpbmlzaGVkIHJlbW92YWwuCisJICogVGhpcyBpcyBmb3Iga2VybmZzX3JlbW92ZV9zZWxmKCkgd2hpY2ggcGxheXMgd2l0aCBhY3RpdmUgcmVmCisJICogYWZ0ZXIgcmVtb3ZhbC4KKwkgKi8KKwlpZiAoIWtuIHx8IChrbi0+cGFyZW50ICYmIFJCX0VNUFRZX05PREUoJmtuLT5yYikpKQogCQlyZXR1cm47CiAKIAlwcl9kZWJ1Zygia2VybmZzICVzOiByZW1vdmluZ1xuIiwga24tPm5hbWUpOwogCi0JbmV4dCA9IE5VTEw7CisJLyogcHJldmVudCBhbnkgbmV3IHVzYWdlIHVuZGVyIEBrbiBieSBkZWFjdGl2YXRpbmcgYWxsIG5vZGVzICovCisJcG9zID0gTlVMTDsKKwl3aGlsZSAoKHBvcyA9IGtlcm5mc19uZXh0X2Rlc2NlbmRhbnRfcG9zdChwb3MsIGtuKSkpCisJCWlmIChrZXJuZnNfYWN0aXZlKHBvcykpCisJCQlhdG9taWNfYWRkKEtOX0RFQUNUSVZBVEVEX0JJQVMsICZwb3MtPmFjdGl2ZSk7CisKKwkvKiBkZWFjdGl2YXRlIGFuZCB1bmxpbmsgdGhlIHN1YnRyZWUgbm9kZS1ieS1ub2RlICovCiAJZG8gewotCQlwb3MgPSBuZXh0OwotCQluZXh0ID0ga2VybmZzX25leHRfZGVzY2VuZGFudF9wb3N0KHBvcywga24pOwotCQlpZiAocG9zKQotCQkJa2VybmZzX3JlbW92ZV9vbmUoYWN4dCwgcG9zKTsKLQl9IHdoaWxlIChuZXh0KTsKKwkJcG9zID0ga2VybmZzX2xlZnRtb3N0X2Rlc2NlbmRhbnQoa24pOworCisJCS8qCisJCSAqIGtlcm5mc19kcmFpbigpIGRyb3BzIGtlcm5mc19tdXRleCB0ZW1wb3JhcmlseSBhbmQgQHBvcydzCisJCSAqIGJhc2UgcmVmIGNvdWxkIGhhdmUgYmVlbiBwdXQgYnkgc29tZW9uZSBlbHNlIGJ5IHRoZSB0aW1lCisJCSAqIHRoZSBmdW5jdGlvbiByZXR1cm5zLiAgTWFrZSBzdXJlIGl0IGRvZXNuJ3QgZ28gYXdheQorCQkgKiB1bmRlcm5lYXRoIHVzLgorCQkgKi8KKwkJa2VybmZzX2dldChwb3MpOworCisJCS8qCisJCSAqIERyYWluIGlmZiBAa24gd2FzIGFjdGl2YXRlZC4gIFRoaXMgYXZvaWRzIGRyYWluaW5nIGFuZAorCQkgKiBpdHMgbG9ja2RlcCBhbm5vdGF0aW9ucyBmb3Igbm9kZXMgd2hpY2ggaGF2ZSBuZXZlciBiZWVuCisJCSAqIGFjdGl2YXRlZCBhbmQgYWxsb3dzIGVtYmVkZGluZyBrZXJuZnNfcmVtb3ZlKCkgaW4gY3JlYXRlCisJCSAqIGVycm9yIHBhdGhzIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgZHJhaW5pbmcuCisJCSAqLworCQlpZiAoa24tPmZsYWdzICYgS0VSTkZTX0FDVElWQVRFRCkKKwkJCWtlcm5mc19kcmFpbihwb3MpOworCQllbHNlCisJCQlXQVJOX09OX09OQ0UoYXRvbWljX3JlYWQoJmtuLT5hY3RpdmUpICE9IEtOX0RFQUNUSVZBVEVEX0JJQVMpOworCisJCS8qCisJCSAqIGtlcm5mc191bmxpbmtfc2libGluZygpIHN1Y2NlZWRzIG9uY2UgcGVyIG5vZGUuICBVc2UgaXQKKwkJICogdG8gZGVjaWRlIHdobydzIHJlc3BvbnNpYmxlIGZvciBjbGVhbnVwcy4KKwkJICovCisJCWlmICghcG9zLT5wYXJlbnQgfHwga2VybmZzX3VubGlua19zaWJsaW5nKHBvcykpIHsKKwkJCXN0cnVjdCBrZXJuZnNfaWF0dHJzICpwc19pYXR0ciA9CisJCQkJcG9zLT5wYXJlbnQgPyBwb3MtPnBhcmVudC0+aWF0dHIgOiBOVUxMOworCisJCQkvKiB1cGRhdGUgdGltZXN0YW1wcyBvbiB0aGUgcGFyZW50ICovCisJCQlpZiAocHNfaWF0dHIpIHsKKwkJCQlwc19pYXR0ci0+aWFfaWF0dHIuaWFfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJCQkJcHNfaWF0dHItPmlhX2lhdHRyLmlhX210aW1lID0gQ1VSUkVOVF9USU1FOworCQkJfQorCisJCQlrZXJuZnNfcHV0KHBvcyk7CisJCX0KKworCQlrZXJuZnNfcHV0KHBvcyk7CisJfSB3aGlsZSAocG9zICE9IGtuKTsKIH0KIAogLyoqCkBAIC04NTcsMTEgKzEwNjAsMTQwIEBACiAgKi8KIHZvaWQga2VybmZzX3JlbW92ZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQogewotCXN0cnVjdCBrZXJuZnNfYWRkcm1fY3h0IGFjeHQ7CisJbXV0ZXhfbG9jaygma2VybmZzX211dGV4KTsKKwlfX2tlcm5mc19yZW1vdmUoa24pOworCW11dGV4X3VubG9jaygma2VybmZzX211dGV4KTsKK30KIAotCWtlcm5mc19hZGRybV9zdGFydCgmYWN4dCk7Ci0JX19rZXJuZnNfcmVtb3ZlKCZhY3h0LCBrbik7Ci0Ja2VybmZzX2FkZHJtX2ZpbmlzaCgmYWN4dCk7CisvKioKKyAqIGtlcm5mc19icmVha19hY3RpdmVfcHJvdGVjdGlvbiAtIGJyZWFrIG91dCBvZiBhY3RpdmUgcHJvdGVjdGlvbgorICogQGtuOiB0aGUgc2VsZiBrZXJuZnNfbm9kZQorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBiZSBydW5uaW5nIG9mZiBvZiBhIGtlcm5mcyBvcGVyYXRpb24gd2hpY2ggaXMgaW52b2tlZAorICogd2l0aCBhbiBhY3RpdmUgcmVmZXJlbmNlIC0gZS5nLiBvbmUgb2Yga2VybmZzX29wcy4gIEVhY2ggaW52b2NhdGlvbiBvZgorICogdGhpcyBmdW5jdGlvbiBtdXN0IGFsc28gYmUgbWF0Y2hlZCB3aXRoIGFuIGludm9jYXRpb24gb2YKKyAqIGtlcm5mc191bmJyZWFrX2FjdGl2ZV9wcm90ZWN0aW9uKCkuCisgKgorICogVGhpcyBmdW5jdGlvbiByZWxlYXNlcyB0aGUgYWN0aXZlIHJlZmVyZW5jZSBvZiBAa24gdGhlIGNhbGxlciBpcworICogaG9sZGluZy4gIE9uY2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIEBrbiBtYXkgYmUgcmVtb3ZlZCBhdCBhbnkgcG9pbnQKKyAqIGFuZCB0aGUgY2FsbGVyIGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGUgb2JqZWN0cyBpdAorICogZGVyZWZlcmVuY2VzIGFyZSBhY2Nlc3NpYmxlLgorICovCit2b2lkIGtlcm5mc19icmVha19hY3RpdmVfcHJvdGVjdGlvbihzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQoreworCS8qCisJICogVGFrZSBvdXQgb3Vyc2VsZiBvdXQgb2YgdGhlIGFjdGl2ZSByZWYgZGVwZW5kZW5jeSBjaGFpbi4gIElmCisJICogd2UncmUgY2FsbGVkIHdpdGhvdXQgYW4gYWN0aXZlIHJlZiwgbG9ja2RlcCB3aWxsIGNvbXBsYWluLgorCSAqLworCWtlcm5mc19wdXRfYWN0aXZlKGtuKTsKK30KKworLyoqCisgKiBrZXJuZnNfdW5icmVha19hY3RpdmVfcHJvdGVjdGlvbiAtIHVuZG8ga2VybmZzX2JyZWFrX2FjdGl2ZV9wcm90ZWN0aW9uKCkKKyAqIEBrbjogdGhlIHNlbGYga2VybmZzX25vZGUKKyAqCisgKiBJZiBrZXJuZnNfYnJlYWtfYWN0aXZlX3Byb3RlY3Rpb24oKSB3YXMgY2FsbGVkLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUKKyAqIGludm9rZWQgYmVmb3JlIGZpbmlzaGluZyB0aGUga2VybmZzIG9wZXJhdGlvbi4gIE5vdGUgdGhhdCB3aGlsZSB0aGlzCisgKiBmdW5jdGlvbiByZXN0b3JlcyB0aGUgYWN0aXZlIHJlZmVyZW5jZSwgaXQgZG9lc24ndCBhbmQgY2FuJ3QgYWN0dWFsbHkKKyAqIHJlc3RvcmUgdGhlIGFjdGl2ZSBwcm90ZWN0aW9uIC0gQGtuIG1heSBhbHJlYWR5IG9yIGJlIGluIHRoZSBwcm9jZXNzIG9mCisgKiBiZWluZyByZW1vdmVkLiAgT25jZSBrZXJuZnNfYnJlYWtfYWN0aXZlX3Byb3RlY3Rpb24oKSBpcyBpbnZva2VkLCB0aGF0CisgKiBwcm90ZWN0aW9uIGlzIGlycmV2ZXJzaWJseSBnb25lIGZvciB0aGUga2VybmZzIG9wZXJhdGlvbiBpbnN0YW5jZS4KKyAqCisgKiBXaGlsZSB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgYXQgYW55IHBvaW50IGFmdGVyCisgKiBrZXJuZnNfYnJlYWtfYWN0aXZlX3Byb3RlY3Rpb24oKSBpcyBpbnZva2VkLCBpdHMgbW9zdCB1c2VmdWwgbG9jYXRpb24KKyAqIHdvdWxkIGJlIHJpZ2h0IGJlZm9yZSB0aGUgZW5jbG9zaW5nIGtlcm5mcyBvcGVyYXRpb24gcmV0dXJucy4KKyAqLwordm9pZCBrZXJuZnNfdW5icmVha19hY3RpdmVfcHJvdGVjdGlvbihzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQoreworCS8qCisJICogQGtuLT5hY3RpdmUgY291bGQgYmUgaW4gYW55IHN0YXRlOyBob3dldmVyLCB0aGUgaW5jcmVtZW50IHdlIGRvCisJICogaGVyZSB3aWxsIGJlIHVuZG9uZSBhcyBzb29uIGFzIHRoZSBlbmNsb3Npbmcga2VybmZzIG9wZXJhdGlvbgorCSAqIGZpbmlzaGVzIGFuZCB0aGlzIHRlbXBvcmFyeSBidW1wIGNhbid0IGJyZWFrIGFueXRoaW5nLiAgSWYgQGtuCisJICogaXMgYWxpdmUsIG5vdGhpbmcgY2hhbmdlcy4gIElmIEBrbiBpcyBiZWluZyBkZWFjdGl2YXRlZCwgdGhlCisJICogc29vbi10by1mb2xsb3cgcHV0IHdpbGwgZWl0aGVyIGZpbmlzaCBkZWFjdGl2YXRpb24gb3IgcmVzdG9yZQorCSAqIGRlYWN0aXZhdGVkIHN0YXRlLiAgSWYgQGtuIGlzIGFscmVhZHkgcmVtb3ZlZCwgdGhlIHRlbXBvcmFyeQorCSAqIGJ1bXAgaXMgZ3VhcmFudGVlZCB0byBiZSBnb25lIGJlZm9yZSBAa24gaXMgcmVsZWFzZWQuCisJICovCisJYXRvbWljX2luYygma24tPmFjdGl2ZSk7CisJaWYgKGtlcm5mc19sb2NrZGVwKGtuKSkKKwkJcndzZW1fYWNxdWlyZSgma24tPmRlcF9tYXAsIDAsIDEsIF9SRVRfSVBfKTsKK30KKworLyoqCisgKiBrZXJuZnNfcmVtb3ZlX3NlbGYgLSByZW1vdmUgYSBrZXJuZnNfbm9kZSBmcm9tIGl0cyBvd24gbWV0aG9kCisgKiBAa246IHRoZSBzZWxmIGtlcm5mc19ub2RlIHRvIHJlbW92ZQorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBiZSBydW5uaW5nIG9mZiBvZiBhIGtlcm5mcyBvcGVyYXRpb24gd2hpY2ggaXMgaW52b2tlZAorICogd2l0aCBhbiBhY3RpdmUgcmVmZXJlbmNlIC0gZS5nLiBvbmUgb2Yga2VybmZzX29wcy4gIFRoaXMgY2FuIGJlIHVzZWQgdG8KKyAqIGltcGxlbWVudCBhIGZpbGUgb3BlcmF0aW9uIHdoaWNoIGRlbGV0ZXMgaXRzZWxmLgorICoKKyAqIEZvciBleGFtcGxlLCB0aGUgImRlbGV0ZSIgZmlsZSBmb3IgYSBzeXNmcyBkZXZpY2UgZGlyZWN0b3J5IGNhbiBiZQorICogaW1wbGVtZW50ZWQgYnkgaW52b2tpbmcga2VybmZzX3JlbW92ZV9zZWxmKCkgb24gdGhlICJkZWxldGUiIGZpbGUKKyAqIGl0c2VsZi4gIFRoaXMgZnVuY3Rpb24gYnJlYWtzIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5IG9mIHRyeWluZyB0bworICogZGVhY3RpdmF0ZSBzZWxmIHdoaWxlIGhvbGRpbmcgYW4gYWN0aXZlIHJlZiBpdHNlbGYuICBJdCBpc24ndCBuZWNlc3NhcnkKKyAqIHRvIG1vZGlmeSB0aGUgdXN1YWwgcmVtb3ZhbCBwYXRoIHRvIHVzZSBrZXJuZnNfcmVtb3ZlX3NlbGYoKS4gIFRoZQorICogImRlbGV0ZSIgaW1wbGVtZW50YXRpb24gY2FuIHNpbXBseSBpbnZva2Uga2VybmZzX3JlbW92ZV9zZWxmKCkgb24gc2VsZgorICogYmVmb3JlIHByb2NlZWRpbmcgd2l0aCB0aGUgdXN1YWwgcmVtb3ZhbCBwYXRoLiAga2VybmZzIHdpbGwgaWdub3JlIGxhdGVyCisgKiBrZXJuZnNfcmVtb3ZlKCkgb24gc2VsZi4KKyAqCisgKiBrZXJuZnNfcmVtb3ZlX3NlbGYoKSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGNvbmN1cnJlbnRseSBvbiB0aGUKKyAqIHNhbWUga2VybmZzX25vZGUuICBPbmx5IHRoZSBmaXJzdCBvbmUgYWN0dWFsbHkgcGVyZm9ybXMgcmVtb3ZhbCBhbmQKKyAqIHJldHVybnMgJXRydWUuICBBbGwgb3RoZXJzIHdpbGwgd2FpdCB1bnRpbCB0aGUga2VybmZzIG9wZXJhdGlvbiB3aGljaAorICogd29uIHNlbGYtcmVtb3ZhbCBmaW5pc2hlcyBhbmQgcmV0dXJuICVmYWxzZS4gIE5vdGUgdGhhdCB0aGUgbG9zZXJzIHdhaXQKKyAqIGZvciB0aGUgY29tcGxldGlvbiBvZiBub3Qgb25seSB0aGUgd2lubmluZyBrZXJuZnNfcmVtb3ZlX3NlbGYoKSBidXQgYWxzbworICogdGhlIHdob2xlIGtlcm5mc19vcHMgd2hpY2ggd29uIHRoZSBhcmJpdHJhdGlvbi4gIFRoaXMgY2FuIGJlIHVzZWQgdG8KKyAqIGd1YXJhbnRlZSwgZm9yIGV4YW1wbGUsIGFsbCBjb25jdXJyZW50IHdyaXRlcyB0byBhICJkZWxldGUiIGZpbGUgdG8KKyAqIGZpbmlzaCBvbmx5IGFmdGVyIHRoZSB3aG9sZSBvcGVyYXRpb24gaXMgY29tcGxldGUuCisgKi8KK2Jvb2wga2VybmZzX3JlbW92ZV9zZWxmKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCit7CisJYm9vbCByZXQ7CisKKwltdXRleF9sb2NrKCZrZXJuZnNfbXV0ZXgpOworCWtlcm5mc19icmVha19hY3RpdmVfcHJvdGVjdGlvbihrbik7CisKKwkvKgorCSAqIFNVSUNJREFMIGlzIHVzZWQgdG8gYXJiaXRyYXRlIGFtb25nIGNvbXBldGluZyBpbnZvY2F0aW9ucy4gIE9ubHkKKwkgKiB0aGUgZmlyc3Qgb25lIHdpbGwgYWN0dWFsbHkgcGVyZm9ybSByZW1vdmFsLiAgV2hlbiB0aGUgcmVtb3ZhbAorCSAqIGlzIGNvbXBsZXRlLCBTVUlDSURFRCBpcyBzZXQgYW5kIHRoZSBhY3RpdmUgcmVmIGlzIHJlc3RvcmVkCisJICogd2hpbGUgaG9sZGluZyBrZXJuZnNfbXV0ZXguICBUaGUgb25lcyB3aGljaCBsb3N0IGFyYml0cmF0aW9uCisJICogd2FpdHMgZm9yIFNVSUNERUQgJiYgZHJhaW5lZCB3aGljaCBjYW4gaGFwcGVuIG9ubHkgYWZ0ZXIgdGhlCisJICogZW5jbG9zaW5nIGtlcm5mcyBvcGVyYXRpb24gd2hpY2ggZXhlY3V0ZWQgdGhlIHdpbm5pbmcgaW5zdGFuY2UKKwkgKiBvZiBrZXJuZnNfcmVtb3ZlX3NlbGYoKSBmaW5pc2hlZC4KKwkgKi8KKwlpZiAoIShrbi0+ZmxhZ3MgJiBLRVJORlNfU1VJQ0lEQUwpKSB7CisJCWtuLT5mbGFncyB8PSBLRVJORlNfU1VJQ0lEQUw7CisJCV9fa2VybmZzX3JlbW92ZShrbik7CisJCWtuLT5mbGFncyB8PSBLRVJORlNfU1VJQ0lERUQ7CisJCXJldCA9IHRydWU7CisJfSBlbHNlIHsKKwkJd2FpdF9xdWV1ZV9oZWFkX3QgKndhaXRxID0gJmtlcm5mc19yb290KGtuKS0+ZGVhY3RpdmF0ZV93YWl0cTsKKwkJREVGSU5FX1dBSVQod2FpdCk7CisKKwkJd2hpbGUgKHRydWUpIHsKKwkJCXByZXBhcmVfdG9fd2FpdCh3YWl0cSwgJndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKworCQkJaWYgKChrbi0+ZmxhZ3MgJiBLRVJORlNfU1VJQ0lERUQpICYmCisJCQkgICAgYXRvbWljX3JlYWQoJmtuLT5hY3RpdmUpID09IEtOX0RFQUNUSVZBVEVEX0JJQVMpCisJCQkJYnJlYWs7CisKKwkJCW11dGV4X3VubG9jaygma2VybmZzX211dGV4KTsKKwkJCXNjaGVkdWxlKCk7CisJCQltdXRleF9sb2NrKCZrZXJuZnNfbXV0ZXgpOworCQl9CisJCWZpbmlzaF93YWl0KHdhaXRxLCAmd2FpdCk7CisJCVdBUk5fT05fT05DRSghUkJfRU1QVFlfTk9ERSgma24tPnJiKSk7CisJCXJldCA9IGZhbHNlOworCX0KKworCS8qCisJICogVGhpcyBtdXN0IGJlIGRvbmUgd2hpbGUgaG9sZGluZyBrZXJuZnNfbXV0ZXg7IG90aGVyd2lzZSwgd2FpdGluZworCSAqIGZvciBTVUlDSURFRCAmJiBkZWFjdGl2YXRlZCBjb3VsZCBmaW5pc2ggcHJlbWF0dXJlbHkuCisJICovCisJa2VybmZzX3VuYnJlYWtfYWN0aXZlX3Byb3RlY3Rpb24oa24pOworCisJbXV0ZXhfdW5sb2NrKCZrZXJuZnNfbXV0ZXgpOworCXJldHVybiByZXQ7CiB9CiAKIC8qKgpAQCAtODc2LDcgKzEyMDgsNiBAQAogaW50IGtlcm5mc19yZW1vdmVfYnlfbmFtZV9ucyhzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSwKIAkJCSAgICAgY29uc3Qgdm9pZCAqbnMpCiB7Ci0Jc3RydWN0IGtlcm5mc19hZGRybV9jeHQgYWN4dDsKIAlzdHJ1Y3Qga2VybmZzX25vZGUgKmtuOwogCiAJaWYgKCFwYXJlbnQpIHsKQEAgLTg4NSwxMyArMTIxNiwxMyBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQlrZXJuZnNfYWRkcm1fc3RhcnQoJmFjeHQpOworCW11dGV4X2xvY2soJmtlcm5mc19tdXRleCk7CiAKIAlrbiA9IGtlcm5mc19maW5kX25zKHBhcmVudCwgbmFtZSwgbnMpOwogCWlmIChrbikKLQkJX19rZXJuZnNfcmVtb3ZlKCZhY3h0LCBrbik7CisJCV9fa2VybmZzX3JlbW92ZShrbik7CiAKLQlrZXJuZnNfYWRkcm1fZmluaXNoKCZhY3h0KTsKKwltdXRleF91bmxvY2soJmtlcm5mc19tdXRleCk7CiAKIAlpZiAoa24pCiAJCXJldHVybiAwOwpAQCAtOTA5LDEyICsxMjQwLDE4IEBACiBpbnQga2VybmZzX3JlbmFtZV9ucyhzdHJ1Y3Qga2VybmZzX25vZGUgKmtuLCBzdHJ1Y3Qga2VybmZzX25vZGUgKm5ld19wYXJlbnQsCiAJCSAgICAgY29uc3QgY2hhciAqbmV3X25hbWUsIGNvbnN0IHZvaWQgKm5ld19ucykKIHsKKwlzdHJ1Y3Qga2VybmZzX25vZGUgKm9sZF9wYXJlbnQ7CisJY29uc3QgY2hhciAqb2xkX25hbWUgPSBOVUxMOwogCWludCBlcnJvcjsKIAorCS8qIGNhbid0IG1vdmUgb3IgcmVuYW1lIHJvb3QgKi8KKwlpZiAoIWtuLT5wYXJlbnQpCisJCXJldHVybiAtRUlOVkFMOworCiAJbXV0ZXhfbG9jaygma2VybmZzX211dGV4KTsKIAogCWVycm9yID0gLUVOT0VOVDsKLQlpZiAoKGtuLT5mbGFncyB8IG5ld19wYXJlbnQtPmZsYWdzKSAmIEtFUk5GU19SRU1PVkVEKQorCWlmICgha2VybmZzX2FjdGl2ZShrbikgfHwgIWtlcm5mc19hY3RpdmUobmV3X3BhcmVudCkpCiAJCWdvdG8gb3V0OwogCiAJZXJyb3IgPSAwOwpAQCAtOTMyLDEzICsxMjY5LDggQEAKIAkJbmV3X25hbWUgPSBrc3RyZHVwKG5ld19uYW1lLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFuZXdfbmFtZSkKIAkJCWdvdG8gb3V0OwotCi0JCWlmIChrbi0+ZmxhZ3MgJiBLRVJORlNfU1RBVElDX05BTUUpCi0JCQlrbi0+ZmxhZ3MgJj0gfktFUk5GU19TVEFUSUNfTkFNRTsKLQkJZWxzZQotCQkJa2ZyZWUoa24tPm5hbWUpOwotCi0JCWtuLT5uYW1lID0gbmV3X25hbWU7CisJfSBlbHNlIHsKKwkJbmV3X25hbWUgPSBOVUxMOwogCX0KIAogCS8qCkBAIC05NDYsMTIgKzEyNzgsMjkgQEAKIAkgKi8KIAlrZXJuZnNfdW5saW5rX3NpYmxpbmcoa24pOwogCWtlcm5mc19nZXQobmV3X3BhcmVudCk7Ci0Ja2VybmZzX3B1dChrbi0+cGFyZW50KTsKLQlrbi0+bnMgPSBuZXdfbnM7Ci0Ja24tPmhhc2ggPSBrZXJuZnNfbmFtZV9oYXNoKGtuLT5uYW1lLCBrbi0+bnMpOworCisJLyogcmVuYW1lX2xvY2sgcHJvdGVjdHMgLT5wYXJlbnQgYW5kIC0+bmFtZSBhY2Nlc3NvcnMgKi8KKwlzcGluX2xvY2tfaXJxKCZrZXJuZnNfcmVuYW1lX2xvY2spOworCisJb2xkX3BhcmVudCA9IGtuLT5wYXJlbnQ7CiAJa24tPnBhcmVudCA9IG5ld19wYXJlbnQ7CisKKwlrbi0+bnMgPSBuZXdfbnM7CisJaWYgKG5ld19uYW1lKSB7CisJCWlmICghKGtuLT5mbGFncyAmIEtFUk5GU19TVEFUSUNfTkFNRSkpCisJCQlvbGRfbmFtZSA9IGtuLT5uYW1lOworCQlrbi0+ZmxhZ3MgJj0gfktFUk5GU19TVEFUSUNfTkFNRTsKKwkJa24tPm5hbWUgPSBuZXdfbmFtZTsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoJmtlcm5mc19yZW5hbWVfbG9jayk7CisKKwlrbi0+aGFzaCA9IGtlcm5mc19uYW1lX2hhc2goa24tPm5hbWUsIGtuLT5ucyk7CiAJa2VybmZzX2xpbmtfc2libGluZyhrbik7CiAKKwlrZXJuZnNfcHV0KG9sZF9wYXJlbnQpOworCWtmcmVlKG9sZF9uYW1lKTsKKwogCWVycm9yID0gMDsKICBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZrZXJuZnNfbXV0ZXgpOwpAQCAtOTc0LDcgKzEzMjMsNyBAQAogCXN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBsb2ZmX3QgaGFzaCwgc3RydWN0IGtlcm5mc19ub2RlICpwb3MpCiB7CiAJaWYgKHBvcykgewotCQlpbnQgdmFsaWQgPSAhKHBvcy0+ZmxhZ3MgJiBLRVJORlNfUkVNT1ZFRCkgJiYKKwkJaW50IHZhbGlkID0ga2VybmZzX2FjdGl2ZShwb3MpICYmCiAJCQlwb3MtPnBhcmVudCA9PSBwYXJlbnQgJiYgaGFzaCA9PSBwb3MtPmhhc2g7CiAJCWtlcm5mc19wdXQocG9zKTsKIAkJaWYgKCF2YWxpZCkKQEAgLTk5Myw4ICsxMzQyLDggQEAKIAkJCQlicmVhazsKIAkJfQogCX0KLQkvKiBTa2lwIG92ZXIgZW50cmllcyBpbiB0aGUgd3JvbmcgbmFtZXNwYWNlICovCi0Jd2hpbGUgKHBvcyAmJiBwb3MtPm5zICE9IG5zKSB7CisJLyogU2tpcCBvdmVyIGVudHJpZXMgd2hpY2ggYXJlIGR5aW5nL2RlYWQgb3IgaW4gdGhlIHdyb25nIG5hbWVzcGFjZSAqLworCXdoaWxlIChwb3MgJiYgKCFrZXJuZnNfYWN0aXZlKHBvcykgfHwgcG9zLT5ucyAhPSBucykpIHsKIAkJc3RydWN0IHJiX25vZGUgKm5vZGUgPSByYl9uZXh0KCZwb3MtPnJiKTsKIAkJaWYgKCFub2RlKQogCQkJcG9zID0gTlVMTDsKQEAgLTEwMDgsMTQgKzEzNTcsMTUgQEAKIAlzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgaW5vX3QgaW5vLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcykKIHsKIAlwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBpbm8sIHBvcyk7Ci0JaWYgKHBvcykKKwlpZiAocG9zKSB7CiAJCWRvIHsKIAkJCXN0cnVjdCByYl9ub2RlICpub2RlID0gcmJfbmV4dCgmcG9zLT5yYik7CiAJCQlpZiAoIW5vZGUpCiAJCQkJcG9zID0gTlVMTDsKIAkJCWVsc2UKIAkJCQlwb3MgPSByYl90b19rbihub2RlKTsKLQkJfSB3aGlsZSAocG9zICYmIHBvcy0+bnMgIT0gbnMpOworCQl9IHdoaWxlIChwb3MgJiYgKCFrZXJuZnNfYWN0aXZlKHBvcykgfHwgcG9zLT5ucyAhPSBucykpOworCX0KIAlyZXR1cm4gcG9zOwogfQogCmRpZmYgLS1naXQgYS9mcy9rZXJuZnMvZmlsZS5jIGIvZnMva2VybmZzL2ZpbGUuYwppbmRleCBkYmYzOTdiLi44MDM0NzA2IDEwMDY0NAotLS0gYS9mcy9rZXJuZnMvZmlsZS5jCisrKyBiL2ZzL2tlcm5mcy9maWxlLmMKQEAgLTI1MiwxMCArMjUyLDE4IEBACiAJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mID0ga2VybmZzX29mKGZpbGUpOwotCXNzaXplX3QgbGVuID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgUEFHRV9TSVpFKTsKIAljb25zdCBzdHJ1Y3Qga2VybmZzX29wcyAqb3BzOworCXNpemVfdCBsZW47CiAJY2hhciAqYnVmOwogCisJaWYgKG9mLT5hdG9taWNfd3JpdGVfbGVuKSB7CisJCWxlbiA9IGNvdW50OworCQlpZiAobGVuID4gb2YtPmF0b21pY193cml0ZV9sZW4pCisJCQlyZXR1cm4gLUUyQklHOworCX0gZWxzZSB7CisJCWxlbiA9IG1pbl90KHNpemVfdCwgY291bnQsIFBBR0VfU0laRSk7CisJfQorCiAJYnVmID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC02NTMsNiArNjYxLDEyIEBACiAJb2YtPmZpbGUgPSBmaWxlOwogCiAJLyoKKwkgKiBXcml0ZSBwYXRoIG5lZWRzIHRvIGF0b21pY193cml0ZV9sZW4gb3V0c2lkZSBhY3RpdmUgcmVmZXJlbmNlLgorCSAqIENhY2hlIGl0IGluIG9wZW5fZmlsZS4gIFNlZSBrZXJuZnNfZm9wX3dyaXRlKCkgZm9yIGRldGFpbHMuCisJICovCisJb2YtPmF0b21pY193cml0ZV9sZW4gPSBvcHMtPmF0b21pY193cml0ZV9sZW47CisKKwkvKgogCSAqIEFsd2F5cyBpbnN0YW50aWF0ZSBzZXFfZmlsZSBldmVuIGlmIHJlYWQgYWNjZXNzIGRvZXNuJ3QgdXNlCiAJICogc2VxX2ZpbGUgb3IgaXMgbm90IHJlcXVlc3RlZC4gIFRoaXMgdW5pZmllcyBwcml2YXRlIGRhdGEgYWNjZXNzCiAJICogYW5kIHJlYWRhYmxlIHJlZ3VsYXIgZmlsZXMgYXJlIHRoZSB2YXN0IG1ham9yaXR5IGFueXdheS4KQEAgLTgyMCw3ICs4MzQsNiBAQAogCQkJCQkgYm9vbCBuYW1lX2lzX3N0YXRpYywKIAkJCQkJIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqa2V5KQogewotCXN0cnVjdCBrZXJuZnNfYWRkcm1fY3h0IGFjeHQ7CiAJc3RydWN0IGtlcm5mc19ub2RlICprbjsKIAl1bnNpZ25lZCBmbGFnczsKIAlpbnQgcmM7CkBAIC04NTUsMTAgKzg2OCw3IEBACiAJaWYgKG9wcy0+bW1hcCkKIAkJa24tPmZsYWdzIHw9IEtFUk5GU19IQVNfTU1BUDsKIAotCWtlcm5mc19hZGRybV9zdGFydCgmYWN4dCk7Ci0JcmMgPSBrZXJuZnNfYWRkX29uZSgmYWN4dCwga24pOwotCWtlcm5mc19hZGRybV9maW5pc2goJmFjeHQpOwotCisJcmMgPSBrZXJuZnNfYWRkX29uZShrbik7CiAJaWYgKHJjKSB7CiAJCWtlcm5mc19wdXQoa24pOwogCQlyZXR1cm4gRVJSX1BUUihyYyk7CmRpZmYgLS1naXQgYS9mcy9rZXJuZnMva2VybmZzLWludGVybmFsLmggYi9mcy9rZXJuZnMva2VybmZzLWludGVybmFsLmgKaW5kZXggZWI1MzZiNy4uOGJlMTNiMiAxMDA2NDQKLS0tIGEvZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oCisrKyBiL2ZzL2tlcm5mcy9rZXJuZnMtaW50ZXJuYWwuaApAQCAtMjYsNyArMjYsOCBAQAogCXN0cnVjdCBzaW1wbGVfeGF0dHJzCXhhdHRyczsKIH07CiAKLSNkZWZpbmUgS05fREVBQ1RJVkFURURfQklBUwkJSU5UX01JTgorLyogKzEgdG8gYXZvaWQgdHJpZ2dlcmluZyBvdmVyZmxvdyB3YXJuaW5nIHdoZW4gbmVnYXRpbmcgaXQgKi8KKyNkZWZpbmUgS05fREVBQ1RJVkFURURfQklBUwkJKElOVF9NSU4gKyAxKQogCiAvKiBLRVJORlNfVFlQRV9NQVNLIGFuZCB0eXBlcyBhcmUgZGVmaW5lZCBpbiBpbmNsdWRlL2xpbnV4L2tlcm5mcy5oICovCiAKQEAgLTQ1LDEzICs0Niw2IEBACiB9CiAKIC8qCi0gKiBDb250ZXh0IHN0cnVjdHVyZSB0byBiZSB1c2VkIHdoaWxlIGFkZGluZy9yZW1vdmluZyBub2Rlcy4KLSAqLwotc3RydWN0IGtlcm5mc19hZGRybV9jeHQgewotCXN0cnVjdCBrZXJuZnNfbm9kZQkqcmVtb3ZlZDsKLX07Ci0KLS8qCiAgKiBtb3VudC5jCiAgKi8KIHN0cnVjdCBrZXJuZnNfc3VwZXJfaW5mbyB7CkBAIC03MSw2ICs2NSw3IEBACiB9OwogI2RlZmluZSBrZXJuZnNfaW5mbyhTQikgKChzdHJ1Y3Qga2VybmZzX3N1cGVyX2luZm8gKikoU0ItPnNfZnNfaW5mbykpCiAKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBrZXJuZnNfc29wczsKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqa2VybmZzX25vZGVfY2FjaGU7CiAKIC8qCkBAIC0xMDAsOSArOTUsNyBAQAogCiBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19nZXRfYWN0aXZlKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pOwogdm9pZCBrZXJuZnNfcHV0X2FjdGl2ZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKTsKLXZvaWQga2VybmZzX2FkZHJtX3N0YXJ0KHN0cnVjdCBrZXJuZnNfYWRkcm1fY3h0ICphY3h0KTsKLWludCBrZXJuZnNfYWRkX29uZShzdHJ1Y3Qga2VybmZzX2FkZHJtX2N4dCAqYWN4dCwgc3RydWN0IGtlcm5mc19ub2RlICprbik7Ci12b2lkIGtlcm5mc19hZGRybV9maW5pc2goc3RydWN0IGtlcm5mc19hZGRybV9jeHQgKmFjeHQpOworaW50IGtlcm5mc19hZGRfb25lKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pOwogc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfbmV3X25vZGUoc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsCiAJCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsIHVtb2RlX3QgbW9kZSwKIAkJCQkgICAgdW5zaWduZWQgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZnMva2VybmZzL21vdW50LmMgYi9mcy9rZXJuZnMvbW91bnQuYwppbmRleCAwZjQxNTJkLi42YTVmMDRhIDEwMDY0NAotLS0gYS9mcy9rZXJuZnMvbW91bnQuYworKysgYi9mcy9rZXJuZnMvbW91bnQuYwpAQCAtMTksMTIgKzE5LDQ5IEBACiAKIHN0cnVjdCBrbWVtX2NhY2hlICprZXJuZnNfbm9kZV9jYWNoZTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGtlcm5mc19zb3BzID0geworc3RhdGljIGludCBrZXJuZnNfc29wX3JlbW91bnRfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3Qga2VybmZzX3Jvb3QgKnJvb3QgPSBrZXJuZnNfaW5mbyhzYiktPnJvb3Q7CisJc3RydWN0IGtlcm5mc19zeXNjYWxsX29wcyAqc2NvcHMgPSByb290LT5zeXNjYWxsX29wczsKKworCWlmIChzY29wcyAmJiBzY29wcy0+cmVtb3VudF9mcykKKwkJcmV0dXJuIHNjb3BzLT5yZW1vdW50X2ZzKHJvb3QsIGZsYWdzLCBkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrZXJuZnNfc29wX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNmLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGtlcm5mc19yb290ICpyb290ID0ga2VybmZzX3Jvb3QoZGVudHJ5LT5kX2ZzZGF0YSk7CisJc3RydWN0IGtlcm5mc19zeXNjYWxsX29wcyAqc2NvcHMgPSByb290LT5zeXNjYWxsX29wczsKKworCWlmIChzY29wcyAmJiBzY29wcy0+c2hvd19vcHRpb25zKQorCQlyZXR1cm4gc2NvcHMtPnNob3dfb3B0aW9ucyhzZiwgcm9vdCk7CisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGtlcm5mc19zb3BzID0gewogCS5zdGF0ZnMJCT0gc2ltcGxlX3N0YXRmcywKIAkuZHJvcF9pbm9kZQk9IGdlbmVyaWNfZGVsZXRlX2lub2RlLAogCS5ldmljdF9pbm9kZQk9IGtlcm5mc19ldmljdF9pbm9kZSwKKworCS5yZW1vdW50X2ZzCT0ga2VybmZzX3NvcF9yZW1vdW50X2ZzLAorCS5zaG93X29wdGlvbnMJPSBrZXJuZnNfc29wX3Nob3dfb3B0aW9ucywKIH07CiAKKy8qKgorICoga2VybmZzX3Jvb3RfZnJvbV9zYiAtIGRldGVybWluZSBrZXJuZnNfcm9vdCBhc3NvY2lhdGVkIHdpdGggYSBzdXBlcl9ibG9jaworICogQHNiOiB0aGUgc3VwZXJfYmxvY2sgaW4gcXVlc3Rpb24KKyAqCisgKiBSZXR1cm4gdGhlIGtlcm5mc19yb290IGFzc29jaWF0ZWQgd2l0aCBAc2IuICBJZiBAc2IgaXMgbm90IGEga2VybmZzIG9uZSwKKyAqICVOVUxMIGlzIHJldHVybmVkLgorICovCitzdHJ1Y3Qga2VybmZzX3Jvb3QgKmtlcm5mc19yb290X2Zyb21fc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpZiAoc2ItPnNfb3AgPT0gJmtlcm5mc19zb3BzKQorCQlyZXR1cm4ga2VybmZzX2luZm8oc2IpLT5yb290OworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgaW50IGtlcm5mc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGtlcm5mc19zdXBlcl9pbmZvICppbmZvID0ga2VybmZzX2luZm8oc2IpOwpkaWZmIC0tZ2l0IGEvZnMva2VybmZzL3N5bWxpbmsuYyBiL2ZzL2tlcm5mcy9zeW1saW5rLmMKaW5kZXggNGQ0NTcwNS4uOGExOTg4OSAxMDA2NDQKLS0tIGEvZnMva2VybmZzL3N5bWxpbmsuYworKysgYi9mcy9rZXJuZnMvc3ltbGluay5jCkBAIC0yNyw3ICsyNyw2IEBACiAJCQkJICAgICAgIHN0cnVjdCBrZXJuZnNfbm9kZSAqdGFyZ2V0KQogewogCXN0cnVjdCBrZXJuZnNfbm9kZSAqa247Ci0Jc3RydWN0IGtlcm5mc19hZGRybV9jeHQgYWN4dDsKIAlpbnQgZXJyb3I7CiAKIAlrbiA9IGtlcm5mc19uZXdfbm9kZShwYXJlbnQsIG5hbWUsIFNfSUZMTkt8U19JUldYVUdPLCBLRVJORlNfTElOSyk7CkBAIC0zOSwxMCArMzgsNyBAQAogCWtuLT5zeW1saW5rLnRhcmdldF9rbiA9IHRhcmdldDsKIAlrZXJuZnNfZ2V0KHRhcmdldCk7CS8qIHJlZiBvd25lZCBieSBzeW1saW5rICovCiAKLQlrZXJuZnNfYWRkcm1fc3RhcnQoJmFjeHQpOwotCWVycm9yID0ga2VybmZzX2FkZF9vbmUoJmFjeHQsIGtuKTsKLQlrZXJuZnNfYWRkcm1fZmluaXNoKCZhY3h0KTsKLQorCWVycm9yID0ga2VybmZzX2FkZF9vbmUoa24pOwogCWlmICghZXJyb3IpCiAJCXJldHVybiBrbjsKIApkaWZmIC0tZ2l0IGEvZnMvcHJvYy9zdGF0LmMgYi9mcy9wcm9jL3N0YXQuYwppbmRleCA2ZjU5OWM2Li45ZDIzMWU5IDEwMDY0NAotLS0gYS9mcy9wcm9jL3N0YXQuYworKysgYi9mcy9wcm9jL3N0YXQuYwpAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycW5yLmg+Ci0jaW5jbHVkZSA8YXNtL2NwdXRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHV0aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvdGljay5oPgogCiAjaWZuZGVmIGFyY2hfaXJxX3N0YXRfY3B1CmRpZmYgLS1naXQgYS9mcy9wcm9jL3VwdGltZS5jIGIvZnMvcHJvYy91cHRpbWUuYwppbmRleCA3MTQxYjhkLi4zM2RlNTY3IDEwMDY0NAotLS0gYS9mcy9wcm9jL3VwdGltZS5jCisrKyBiL2ZzL3Byb2MvdXB0aW1lLmMKQEAgLTUsNyArNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KLSNpbmNsdWRlIDxhc20vY3B1dGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdXRpbWUuaD4KIAogc3RhdGljIGludCB1cHRpbWVfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL0tjb25maWcgYi9mcy9zeXNmcy9LY29uZmlnCmluZGV4IDhjNDFmZWEuLmIyNzU2MDEgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL0tjb25maWcKKysrIGIvZnMvc3lzZnMvS2NvbmZpZwpAQCAtMSw2ICsxLDcgQEAKIGNvbmZpZyBTWVNGUwogCWJvb2wgInN5c2ZzIGZpbGUgc3lzdGVtIHN1cHBvcnQiIGlmIEVYUEVSVAogCWRlZmF1bHQgeQorCXNlbGVjdCBLRVJORlMKIAloZWxwCiAJVGhlIHN5c2ZzIGZpbGVzeXN0ZW0gaXMgYSB2aXJ0dWFsIGZpbGVzeXN0ZW0gdGhhdCB0aGUga2VybmVsIHVzZXMgdG8KIAlleHBvcnQgaW50ZXJuYWwga2VybmVsIG9iamVjdHMsIHRoZWlyIGF0dHJpYnV0ZXMsIGFuZCB0aGVpcgpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZGlyLmMgYi9mcy9zeXNmcy9kaXIuYwppbmRleCBlZTBkNzYxLi4wYjQ1ZmY0IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9kaXIuYworKysgYi9mcy9zeXNmcy9kaXIuYwpAQCAtMTksMzkgKzE5LDE4IEBACiAKIERFRklORV9TUElOTE9DSyhzeXNmc19zeW1saW5rX3RhcmdldF9sb2NrKTsKIAotLyoqCi0gKglzeXNmc19wYXRobmFtZSAtIHJldHVybiBmdWxsIHBhdGggdG8gc3lzZnMgZGlyZW50Ci0gKglAa246IGtlcm5mc19ub2RlIHdob3NlIHBhdGggd2Ugd2FudAotICoJQHBhdGg6IGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIG9mIHNpemUgUEFUSF9NQVgKLSAqCi0gKglHaXZlcyB0aGUgbmFtZSAiLyIgdG8gdGhlIHN5c2ZzX3Jvb3QgZW50cnk7IGFueSBwYXRoIHJldHVybmVkCi0gKglpcyByZWxhdGl2ZSB0byB3aGVyZXZlciBzeXNmcyBpcyBtb3VudGVkLgotICovCi1zdGF0aWMgY2hhciAqc3lzZnNfcGF0aG5hbWUoc3RydWN0IGtlcm5mc19ub2RlICprbiwgY2hhciAqcGF0aCkKLXsKLQlpZiAoa24tPnBhcmVudCkgewotCQlzeXNmc19wYXRobmFtZShrbi0+cGFyZW50LCBwYXRoKTsKLQkJc3RybGNhdChwYXRoLCAiLyIsIFBBVEhfTUFYKTsKLQl9Ci0Jc3RybGNhdChwYXRoLCBrbi0+bmFtZSwgUEFUSF9NQVgpOwotCXJldHVybiBwYXRoOwotfQotCiB2b2lkIHN5c2ZzX3dhcm5fZHVwKHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lKQogewotCWNoYXIgKnBhdGg7CisJY2hhciAqYnVmLCAqcGF0aCA9IE5VTEw7CiAKLQlwYXRoID0ga3phbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBhdGgpIHsKLQkJc3lzZnNfcGF0aG5hbWUocGFyZW50LCBwYXRoKTsKLQkJc3RybGNhdChwYXRoLCAiLyIsIFBBVEhfTUFYKTsKLQkJc3RybGNhdChwYXRoLCBuYW1lLCBQQVRIX01BWCk7Ci0JfQorCWJ1ZiA9IGt6YWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpOworCWlmIChidWYpCisJCXBhdGggPSBrZXJuZnNfcGF0aChwYXJlbnQsIGJ1ZiwgUEFUSF9NQVgpOwogCi0JV0FSTigxLCBLRVJOX1dBUk5JTkcgInN5c2ZzOiBjYW5ub3QgY3JlYXRlIGR1cGxpY2F0ZSBmaWxlbmFtZSAnJXMnXG4iLAotCSAgICAgcGF0aCA/IHBhdGggOiBuYW1lKTsKKwlXQVJOKDEsIEtFUk5fV0FSTklORyAic3lzZnM6IGNhbm5vdCBjcmVhdGUgZHVwbGljYXRlIGZpbGVuYW1lICclcy8lcydcbiIsCisJICAgICBwYXRoLCBuYW1lKTsKIAotCWtmcmVlKHBhdGgpOworCWtmcmVlKGJ1Zik7CiB9CiAKIC8qKgpAQCAtMTIyLDkgKzEwMSwxMyBAQAogaW50IHN5c2ZzX3JlbmFtZV9kaXJfbnMoc3RydWN0IGtvYmplY3QgKmtvYmosIGNvbnN0IGNoYXIgKm5ld19uYW1lLAogCQkJY29uc3Qgdm9pZCAqbmV3X25zKQogewotCXN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50ID0ga29iai0+c2QtPnBhcmVudDsKKwlzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudDsKKwlpbnQgcmV0OwogCi0JcmV0dXJuIGtlcm5mc19yZW5hbWVfbnMoa29iai0+c2QsIHBhcmVudCwgbmV3X25hbWUsIG5ld19ucyk7CisJcGFyZW50ID0ga2VybmZzX2dldF9wYXJlbnQoa29iai0+c2QpOworCXJldCA9IGtlcm5mc19yZW5hbWVfbnMoa29iai0+c2QsIHBhcmVudCwgbmV3X25hbWUsIG5ld19ucyk7CisJa2VybmZzX3B1dChwYXJlbnQpOworCXJldHVybiByZXQ7CiB9CiAKIGludCBzeXNmc19tb3ZlX2Rpcl9ucyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmplY3QgKm5ld19wYXJlbnRfa29iaiwKQEAgLTEzMyw3ICsxMTYsNiBAQAogCXN0cnVjdCBrZXJuZnNfbm9kZSAqa24gPSBrb2JqLT5zZDsKIAlzdHJ1Y3Qga2VybmZzX25vZGUgKm5ld19wYXJlbnQ7CiAKLQlCVUdfT04oIWtuLT5wYXJlbnQpOwogCW5ld19wYXJlbnQgPSBuZXdfcGFyZW50X2tvYmogJiYgbmV3X3BhcmVudF9rb2JqLT5zZCA/CiAJCW5ld19wYXJlbnRfa29iai0+c2QgOiBzeXNmc19yb290X2tuOwogCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9maWxlLmMgYi9mcy9zeXNmcy9maWxlLmMKaW5kZXggODEwY2Y2ZS4uMWI4YjkxYiAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvZmlsZS5jCisrKyBiL2ZzL3N5c2ZzL2ZpbGUuYwpAQCAtMzcyLDYgKzM3MiwyOSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfcmVtb3ZlX2ZpbGVfbnMpOwogCisvKioKKyAqIHN5c2ZzX3JlbW92ZV9maWxlX3NlbGYgLSByZW1vdmUgYW4gb2JqZWN0IGF0dHJpYnV0ZSBmcm9tIGl0cyBvd24gbWV0aG9kCisgKiBAa29iajogb2JqZWN0IHdlJ3JlIGFjdGluZyBmb3IKKyAqIEBhdHRyOiBhdHRyaWJ1dGUgZGVzY3JpcHRvcgorICoKKyAqIFNlZSBrZXJuZnNfcmVtb3ZlX3NlbGYoKSBmb3IgZGV0YWlscy4KKyAqLworYm9vbCBzeXNmc19yZW1vdmVfZmlsZV9zZWxmKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyKQoreworCXN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50ID0ga29iai0+c2Q7CisJc3RydWN0IGtlcm5mc19ub2RlICprbjsKKwlib29sIHJldDsKKworCWtuID0ga2VybmZzX2ZpbmRfYW5kX2dldChwYXJlbnQsIGF0dHItPm5hbWUpOworCWlmIChXQVJOX09OX09OQ0UoIWtuKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0ID0ga2VybmZzX3JlbW92ZV9zZWxmKGtuKTsKKworCWtlcm5mc19wdXQoa24pOworCXJldHVybiByZXQ7Cit9CisKIHZvaWQgc3lzZnNfcmVtb3ZlX2ZpbGVzKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICoqcHRyKQogewogCWludCBpOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZ3JvdXAuYyBiL2ZzL3N5c2ZzL2dyb3VwLmMKaW5kZXggNmI1NzkzOC4uYWEwNDA2OCAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvZ3JvdXAuYworKysgYi9mcy9zeXNmcy9ncm91cC5jCkBAIC03MCw4ICs3MCwxMSBAQAogCWlmIChncnAtPmJpbl9hdHRycykgewogCQlmb3IgKGJpbl9hdHRyID0gZ3JwLT5iaW5fYXR0cnM7ICpiaW5fYXR0cjsgYmluX2F0dHIrKykgewogCQkJaWYgKHVwZGF0ZSkKLQkJCQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoa29iaiwgKmJpbl9hdHRyKTsKLQkJCWVycm9yID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKGtvYmosICpiaW5fYXR0cik7CisJCQkJa2VybmZzX3JlbW92ZV9ieV9uYW1lKHBhcmVudCwKKwkJCQkJCSgqYmluX2F0dHIpLT5hdHRyLm5hbWUpOworCQkJZXJyb3IgPSBzeXNmc19hZGRfZmlsZV9tb2RlX25zKHBhcmVudCwKKwkJCQkJJigqYmluX2F0dHIpLT5hdHRyLCB0cnVlLAorCQkJCQkoKmJpbl9hdHRyKS0+YXR0ci5tb2RlLCBOVUxMKTsKIAkJCWlmIChlcnJvcikKIAkJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvbW91bnQuYyBiL2ZzL3N5c2ZzL21vdW50LmMKaW5kZXggM2VhZjVjNi4uYTY2YWQ2MSAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvbW91bnQuYworKysgYi9mcy9zeXNmcy9tb3VudC5jCkBAIC02Myw3ICs2Myw3IEBACiB7CiAJaW50IGVycjsKIAotCXN5c2ZzX3Jvb3QgPSBrZXJuZnNfY3JlYXRlX3Jvb3QoTlVMTCwgTlVMTCk7CisJc3lzZnNfcm9vdCA9IGtlcm5mc19jcmVhdGVfcm9vdChOVUxMLCAwLCBOVUxMKTsKIAlpZiAoSVNfRVJSKHN5c2ZzX3Jvb3QpKQogCQlyZXR1cm4gUFRSX0VSUihzeXNmc19yb290KTsKIApkaWZmIC0tZ2l0IGEvZnMvdGltZXJmZC5jIGIvZnMvdGltZXJmZC5jCmluZGV4IDkyOTMxMjEuLjAwMTMxNDIgMTAwNjQ0Ci0tLSBhL2ZzL3RpbWVyZmQuYworKysgYi9mcy90aW1lcmZkLmMKQEAgLTMxNyw2ICszMTcsNyBAQAogCSAgICAoY2xvY2tpZCAhPSBDTE9DS19NT05PVE9OSUMgJiYKIAkgICAgIGNsb2NraWQgIT0gQ0xPQ0tfUkVBTFRJTUUgJiYKIAkgICAgIGNsb2NraWQgIT0gQ0xPQ0tfUkVBTFRJTUVfQUxBUk0gJiYKKwkgICAgIGNsb2NraWQgIT0gQ0xPQ0tfQk9PVFRJTUUgJiYKIAkgICAgIGNsb2NraWQgIT0gQ0xPQ0tfQk9PVFRJTUVfQUxBUk0pKQogCQlyZXR1cm4gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjYnVmZmVyLmggYi9pbmNsdWRlL2FjcGkvYWNidWZmZXIuaAppbmRleCBjOTI3YTBiLi44OGNiNDc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNidWZmZXIuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNidWZmZXIuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2NvbmZpZy5oIGIvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmgKaW5kZXggM2VhMjE0Yy4uOTMyYTYwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNleGNlcC5oIGIvaW5jbHVkZS9hY3BpL2FjZXhjZXAuaAppbmRleCA0ZTI4MGJkLi44YjA2ZTRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNleGNlcC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY2V4Y2VwLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNuYW1lcy5oIGIvaW5jbHVkZS9hY3BpL2FjbmFtZXMuaAppbmRleCAxZjM2Nzc3Li4zZGQ2ZTgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNuYW1lcy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY25hbWVzLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNvdXRwdXQuaCBiL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCmluZGV4IDQ2MDdiMDIuLjFiYWFlNmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGkuaCBiL2luY2x1ZGUvYWNwaS9hY3BpLmgKaW5kZXggNjE4Nzg3Ny4uY2EwY2I2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGkuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaS5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNjIsNSArNjIsOCBAQAogI2luY2x1ZGUgPGFjcGkvYWNyZXN0eXAuaD4JCS8qIFJlc291cmNlIERlc2NyaXB0b3Igc3RydWN0cyAqLwogI2luY2x1ZGUgPGFjcGkvYWNwaW9zeGYuaD4JCS8qIE9TTCBpbnRlcmZhY2VzIChBQ1BJQ0EtdG8tT1MpICovCiAjaW5jbHVkZSA8YWNwaS9hY3BpeGYuaD4JCS8qIEFDUEkgY29yZSBzdWJzeXN0ZW0gZXh0ZXJuYWwgaW50ZXJmYWNlcyAqLworI2lmZGVmIEFDUElfTkFUSVZFX0lOVEVSRkFDRV9IRUFERVIKKyNpbmNsdWRlIEFDUElfTkFUSVZFX0lOVEVSRkFDRV9IRUFERVIKKyNlbmRpZgogCiAjZW5kaWYJCQkJLyogX19BQ1BJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmggYi9pbmNsdWRlL2FjcGkvYWNwaV9idXMuaAppbmRleCA4MjU2ZWI0Li44NGEyZTI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaV9idXMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaV9idXMuaApAQCAtNDksOCArNDksOCBAQAogCQkJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKmFyZ3VtZW50cywKIAkJCXN0cnVjdCBhY3BpX2hhbmRsZV9saXN0ICpsaXN0KTsKIGFjcGlfc3RhdHVzCi1hY3BpX2V2YWx1YXRlX2hvdHBsdWdfb3N0KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIHNvdXJjZV9ldmVudCwKLQkJCXUzMiBzdGF0dXNfY29kZSwgc3RydWN0IGFjcGlfYnVmZmVyICpzdGF0dXNfYnVmKTsKK2FjcGlfZXZhbHVhdGVfb3N0KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIHNvdXJjZV9ldmVudCwgdTMyIHN0YXR1c19jb2RlLAorCQkgIHN0cnVjdCBhY3BpX2J1ZmZlciAqc3RhdHVzX2J1Zik7CiAKIGFjcGlfc3RhdHVzCiBhY3BpX2dldF9waHlzaWNhbF9kZXZpY2VfbG9jYXRpb24oYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9wbGRfaW5mbyAqKnBsZCk7CkBAIC0xMzMsMTAgKzEzMywyNCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9ub2RlOwogCWludCAoKmF0dGFjaCkoc3RydWN0IGFjcGlfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCAqaWQpOwogCXZvaWQgKCpkZXRhY2gpKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2KTsKKwl2b2lkICgqYmluZCkoc3RydWN0IGRldmljZSAqcGh5c19kZXYpOworCXZvaWQgKCp1bmJpbmQpKHN0cnVjdCBkZXZpY2UgKnBoeXNfZGV2KTsKIAlzdHJ1Y3QgYWNwaV9ob3RwbHVnX3Byb2ZpbGUgaG90cGx1ZzsKIH07CiAKIC8qCisgKiBBQ1BJIEhvdHBsdWcgQ29udGV4dAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitzdHJ1Y3QgYWNwaV9ob3RwbHVnX2NvbnRleHQgeworCXN0cnVjdCBhY3BpX2RldmljZSAqc2VsZjsKKwlpbnQgKCpub3RpZnkpKHN0cnVjdCBhY3BpX2RldmljZSAqLCB1MzIpOworCXZvaWQgKCp1ZXZlbnQpKHN0cnVjdCBhY3BpX2RldmljZSAqLCB1MzIpOworCXZvaWQgKCpmaXh1cCkoc3RydWN0IGFjcGlfZGV2aWNlICopOworfTsKKworLyoKICAqIEFDUEkgRHJpdmVyCiAgKiAtLS0tLS0tLS0tLQogICovCkBAIC0xOTAsNyArMjA0LDkgQEAKIAl1MzIgaW5pdGlhbGl6ZWQ6MTsKIAl1MzIgdmlzaXRlZDoxOwogCXUzMiBub19ob3RwbHVnOjE7Ci0JdTMyIHJlc2VydmVkOjI0OworCXUzMiBob3RwbHVnX25vdGlmeToxOworCXUzMiBpc19kb2NrX3N0YXRpb246MTsKKwl1MzIgcmVzZXJ2ZWQ6MjI7CiB9OwogCiAvKiBGaWxlIFN5c3RlbSAqLwpAQCAtMzI5LDYgKzM0NSw3IEBACiAJc3RydWN0IGFjcGlfZGV2aWNlX3BlcmYgcGVyZm9ybWFuY2U7CiAJc3RydWN0IGFjcGlfZGV2aWNlX2RpciBkaXI7CiAJc3RydWN0IGFjcGlfc2Nhbl9oYW5kbGVyICpoYW5kbGVyOworCXN0cnVjdCBhY3BpX2hvdHBsdWdfY29udGV4dCAqaHA7CiAJc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXI7CiAJdm9pZCAqZHJpdmVyX2RhdGE7CiAJc3RydWN0IGRldmljZSBkZXY7CkBAIC0zNTEsNiArMzY4LDI0IEBACiAJKigodTMyICopJmFkZXYtPnN0YXR1cykgPSBzdGE7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3NldF9ocF9jb250ZXh0KHN0cnVjdCBhY3BpX2RldmljZSAqYWRldiwKKwkJCQkgICAgICAgc3RydWN0IGFjcGlfaG90cGx1Z19jb250ZXh0ICpocCwKKwkJCQkgICAgICAgaW50ICgqbm90aWZ5KShzdHJ1Y3QgYWNwaV9kZXZpY2UgKiwgdTMyKSwKKwkJCQkgICAgICAgdm9pZCAoKnVldmVudCkoc3RydWN0IGFjcGlfZGV2aWNlICosIHUzMiksCisJCQkJICAgICAgIHZvaWQgKCpmaXh1cCkoc3RydWN0IGFjcGlfZGV2aWNlICopKQoreworCWhwLT5zZWxmID0gYWRldjsKKwlocC0+bm90aWZ5ID0gbm90aWZ5OworCWhwLT51ZXZlbnQgPSB1ZXZlbnQ7CisJaHAtPmZpeHVwID0gZml4dXA7CisJYWRldi0+aHAgPSBocDsKK30KKwordm9pZCBhY3BpX2luaXRpYWxpemVfaHBfY29udGV4dChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsCisJCQkJc3RydWN0IGFjcGlfaG90cGx1Z19jb250ZXh0ICpocCwKKwkJCQlpbnQgKCpub3RpZnkpKHN0cnVjdCBhY3BpX2RldmljZSAqLCB1MzIpLAorCQkJCXZvaWQgKCp1ZXZlbnQpKHN0cnVjdCBhY3BpX2RldmljZSAqLCB1MzIpKTsKKwogLyogYWNwaV9kZXZpY2UuZGV2LmJ1cyA9PSAmYWNwaV9idXNfdHlwZSAqLwogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBhY3BpX2J1c190eXBlOwogCkBAIC0zODEsNiArNDE2LDggQEAKICAqLwogCiBpbnQgYWNwaV9idXNfZ2V0X2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2RldmljZSAqKmRldmljZSk7CitzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfYnVzX2dldF9hY3BpX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUpOwordm9pZCBhY3BpX2J1c19wdXRfYWNwaV9kZXZpY2Uoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KTsKIGFjcGlfc3RhdHVzIGFjcGlfYnVzX2dldF9zdGF0dXNfaGFuZGxlKGFjcGlfaGFuZGxlIGhhbmRsZSwKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBsb25nICpzdGEpOwogaW50IGFjcGlfYnVzX2dldF9zdGF0dXMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwpAQCAtNDAyLDYgKzQzOSw4IEBACiAKIHZvaWQgYWNwaV9zY2FuX2xvY2tfYWNxdWlyZSh2b2lkKTsKIHZvaWQgYWNwaV9zY2FuX2xvY2tfcmVsZWFzZSh2b2lkKTsKK3ZvaWQgYWNwaV9sb2NrX2hwX2NvbnRleHQodm9pZCk7Cit2b2lkIGFjcGlfdW5sb2NrX2hwX2NvbnRleHQodm9pZCk7CiBpbnQgYWNwaV9zY2FuX2FkZF9oYW5kbGVyKHN0cnVjdCBhY3BpX3NjYW5faGFuZGxlciAqaGFuZGxlcik7CiBpbnQgYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyKTsKIHZvaWQgYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXIpOwpAQCAtNDE4LDEwICs0NTcsNiBAQAogCXJldHVybiBhZGV2ICYmIGFkZXYtPmZsYWdzLmluaXRpYWxpemVkICYmIGFkZXYtPmZsYWdzLnZpc2l0ZWQ7CiB9CiAKLXR5cGVkZWYgdm9pZCAoKmFjcGlfaHBfY2FsbGJhY2spKHZvaWQgKmRhdGEsIHUzMiBzcmMpOwotCi1hY3BpX3N0YXR1cyBhY3BpX2hvdHBsdWdfZXhlY3V0ZShhY3BpX2hwX2NhbGxiYWNrIGZ1bmMsIHZvaWQgKmRhdGEsIHUzMiBzcmMpOwotCiAvKioKICAqIG1vZHVsZV9hY3BpX2RyaXZlcihhY3BpX2RyaXZlcikgLSBIZWxwZXIgbWFjcm8gZm9yIHJlZ2lzdGVyaW5nIGFuIEFDUEkgZHJpdmVyCiAgKiBAX19hY3BpX2RyaXZlcjogYWNwaV9kcml2ZXIgc3RydWN0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmggYi9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmgKaW5kZXggYjEyNGZkYi4uZDUwNDYxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaApAQCAtMTA5LDM2ICsxMDksMTQgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2NrIFN0YXRpb24KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0cnVjdCBhY3BpX2RvY2tfb3BzIHsKLQlhY3BpX25vdGlmeV9oYW5kbGVyIGZpeHVwOwotCWFjcGlfbm90aWZ5X2hhbmRsZXIgaGFuZGxlcjsKLQlhY3BpX25vdGlmeV9oYW5kbGVyIHVldmVudDsKLX07CiAKICNpZmRlZiBDT05GSUdfQUNQSV9ET0NLCi1leHRlcm4gaW50IGlzX2RvY2tfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSk7Ci1leHRlcm4gaW50IHJlZ2lzdGVyX2hvdHBsdWdfZG9ja19kZXZpY2UoYWNwaV9oYW5kbGUgaGFuZGxlLAotCQkJCQljb25zdCBzdHJ1Y3QgYWNwaV9kb2NrX29wcyAqb3BzLAotCQkJCQl2b2lkICpjb250ZXh0LAotCQkJCQl2b2lkICgqaW5pdCkodm9pZCAqKSwKLQkJCQkJdm9pZCAoKnJlbGVhc2UpKHZvaWQgKikpOwotZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9ob3RwbHVnX2RvY2tfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSk7CitleHRlcm4gaW50IGlzX2RvY2tfZGV2aWNlKHN0cnVjdCBhY3BpX2RldmljZSAqYWRldik7CiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQgaXNfZG9ja19kZXZpY2UoYWNwaV9oYW5kbGUgaGFuZGxlKQorc3RhdGljIGlubGluZSBpbnQgaXNfZG9ja19kZXZpY2Uoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KQogewogCXJldHVybiAwOwogfQotc3RhdGljIGlubGluZSBpbnQgcmVnaXN0ZXJfaG90cGx1Z19kb2NrX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUsCi0JCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYWNwaV9kb2NrX29wcyAqb3BzLAotCQkJCQkgICAgICAgdm9pZCAqY29udGV4dCwKLQkJCQkJICAgICAgIHZvaWQgKCppbml0KSh2b2lkICopLAotCQkJCQkgICAgICAgdm9pZCAoKnJlbGVhc2UpKHZvaWQgKikpCi17Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgdW5yZWdpc3Rlcl9ob3RwbHVnX2RvY2tfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSkKLXsKLX0KICNlbmRpZiAvKiBDT05GSUdfQUNQSV9ET0NLICovCiAKICNlbmRpZiAvKl9fQUNQSV9EUklWRVJTX0hfXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaV9udW1hLmggYi9pbmNsdWRlL2FjcGkvYWNwaV9udW1hLmgKaW5kZXggNDUxODIzYy4uOTRhMzdjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfbnVtYS5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpX251bWEuaApAQCAtMTMsNyArMTMsNiBAQAogCiBleHRlcm4gaW50IHB4bV90b19ub2RlKGludCk7CiBleHRlcm4gaW50IG5vZGVfdG9fcHhtKGludCk7Ci1leHRlcm4gdm9pZCBfX2FjcGlfbWFwX3B4bV90b19ub2RlKGludCwgaW50KTsKIGV4dGVybiBpbnQgYWNwaV9tYXBfcHhtX3RvX25vZGUoaW50KTsKIGV4dGVybiB1bnNpZ25lZCBjaGFyIGFjcGlfc3JhdF9yZXZpc2lvbjsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmggYi9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaAppbmRleCAwMWU2YzZkLi5mNmY1ZjhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaApAQCAtNyw3ICs3LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpeGYuaCBiL2luY2x1ZGUvYWNwaS9hY3BpeGYuaAppbmRleCBmZWE2NzczLi5iMGIwMWIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaXhmLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDYsNyArNDYsNyBAQAogCiAvKiBDdXJyZW50IEFDUElDQSBzdWJzeXN0ZW0gdmVyc2lvbiBpbiBZWVlZTU1ERCBmb3JtYXQgKi8KIAotI2RlZmluZSBBQ1BJX0NBX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MjAxMzEyMTgKKyNkZWZpbmUgQUNQSV9DQV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDIwMTQwMjE0CiAKICNpbmNsdWRlIDxhY3BpL2FjY29uZmlnLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3R5cGVzLmg+CkBAIC0yMzAsNiArMjMwLDEwIEBACiBhY3BpX3N0YXR1cyBhY3BpX2RldGFjaF9kYXRhKGFjcGlfaGFuZGxlIG9iamVjdCwgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyKTsKIAogYWNwaV9zdGF0dXMKK2FjcGlfZ2V0X2RhdGFfZnVsbChhY3BpX2hhbmRsZSBvYmplY3QsIGFjcGlfb2JqZWN0X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqKmRhdGEsCisJCSAgIHZvaWQgKCpjYWxsYmFjaykodm9pZCAqKSk7CisKK2FjcGlfc3RhdHVzCiBhY3BpX2dldF9kYXRhKGFjcGlfaGFuZGxlIG9iamVjdCwgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyLCB2b2lkICoqZGF0YSk7CiAKIGFjcGlfc3RhdHVzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNyZXN0eXAuaCBiL2luY2x1ZGUvYWNwaS9hY3Jlc3R5cC5oCmluZGV4IGNiZjRiZjkuLmViNzYwY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3Jlc3R5cC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3Jlc3R5cC5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdGJsLmggYi9pbmNsdWRlL2FjcGkvYWN0YmwuaAppbmRleCAzMjVhZWFlLi4zYjMwZTM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN0YmwuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0YmwuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3RibDEuaCBiL2luY2x1ZGUvYWNwaS9hY3RibDEuaAppbmRleCA0ZWM4YzE5Li4yMTJjNjVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN0YmwxLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdGJsMS5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxMywgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTQsIEludGVsIENvcnAuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdGJsMi5oIGIvaW5jbHVkZS9hY3BpL2FjdGJsMi5oCmluZGV4IDA5NGE5MDYuLmYzMzcyNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3RibDIuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0YmwyLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN0YmwzLmggYi9pbmNsdWRlL2FjcGkvYWN0YmwzLmgKaW5kZXggMDFjMmE5MC4uYzIyOTVjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdGJsMy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3RibDMuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmggYi9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCmluZGV4IDY4YTNhZGEuLmU3NjM1NjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTU1LDE4ICs1NSwxNiBAQAogI2Vycm9yIEFDUElfTUFDSElORV9XSURUSCBub3QgZGVmaW5lZAogI2VuZGlmCiAKLS8qISBbQmVnaW5dIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uICovCi0KIC8qCiAgKiBEYXRhIHR5cGUgcmFuZ2VzCiAgKiBOb3RlOiBUaGVzZSBtYWNyb3MgYXJlIGRlc2lnbmVkIHRvIGJlIGNvbXBpbGVyIGluZGVwZW5kZW50IGFzIHdlbGwgYXMKICAqIHdvcmtpbmcgYXJvdW5kIHByb2JsZW1zIHRoYXQgc29tZSAzMi1iaXQgY29tcGlsZXJzIGhhdmUgd2l0aCA2NC1iaXQKICAqIGNvbnN0YW50cy4KICAqLwotI2RlZmluZSBBQ1BJX1VJTlQ4X01BWCAgICAgICAgICAgICAgICAgIChVSU5UOCkgKH4oKFVJTlQ4KSAgMCkpCS8qIDB4RkYgICAgICAgICAgICAgICAqLwotI2RlZmluZSBBQ1BJX1VJTlQxNl9NQVggICAgICAgICAgICAgICAgIChVSU5UMTYpKH4oKFVJTlQxNikgMCkpCS8qIDB4RkZGRiAgICAgICAgICAgICAqLwotI2RlZmluZSBBQ1BJX1VJTlQzMl9NQVggICAgICAgICAgICAgICAgIChVSU5UMzIpKH4oKFVJTlQzMikgMCkpCS8qIDB4RkZGRkZGRkYgICAgICAgICAqLwotI2RlZmluZSBBQ1BJX1VJTlQ2NF9NQVggICAgICAgICAgICAgICAgIChVSU5UNjQpKH4oKFVJTlQ2NCkgMCkpCS8qIDB4RkZGRkZGRkZGRkZGRkZGRiAqLworI2RlZmluZSBBQ1BJX1VJTlQ4X01BWCAgICAgICAgICAgICAgICAgICh1OCkgKH4oKHU4KSAgMCkpCS8qIDB4RkYgICAgICAgICAgICAgICAqLworI2RlZmluZSBBQ1BJX1VJTlQxNl9NQVggICAgICAgICAgICAgICAgICh1MTYpKH4oKHUxNikgMCkpCS8qIDB4RkZGRiAgICAgICAgICAgICAqLworI2RlZmluZSBBQ1BJX1VJTlQzMl9NQVggICAgICAgICAgICAgICAgICh1MzIpKH4oKHUzMikgMCkpCS8qIDB4RkZGRkZGRkYgICAgICAgICAqLworI2RlZmluZSBBQ1BJX1VJTlQ2NF9NQVggICAgICAgICAgICAgICAgICh1NjQpKH4oKHU2NCkgMCkpCS8qIDB4RkZGRkZGRkZGRkZGRkZGRiAqLwogI2RlZmluZSBBQ1BJX0FTQ0lJX01BWCAgICAgICAgICAgICAgICAgIDB4N0YKIAogLyoKQEAgLTc3LDE4ICs3NSwxOCBAQAogICoKICAqIDEpIFRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIG9mIGZpeGVkIHNpemUgZm9yIGFsbCB0YXJnZXRzICgxNi8zMi82NCk6CiAgKgotICogQk9PTEVBTiAgICAgIExvZ2ljYWwgYm9vbGVhbgorICogdTggICAgICAgICAgIExvZ2ljYWwgYm9vbGVhbgogICoKLSAqIFVJTlQ4ICAgICAgICA4LWJpdCAgKDEgYnl0ZSkgdW5zaWduZWQgdmFsdWUKLSAqIFVJTlQxNiAgICAgICAxNi1iaXQgKDIgYnl0ZSkgdW5zaWduZWQgdmFsdWUKLSAqIFVJTlQzMiAgICAgICAzMi1iaXQgKDQgYnl0ZSkgdW5zaWduZWQgdmFsdWUKLSAqIFVJTlQ2NCAgICAgICA2NC1iaXQgKDggYnl0ZSkgdW5zaWduZWQgdmFsdWUKKyAqIHU4ICAgICAgICAgICA4LWJpdCAgKDEgYnl0ZSkgdW5zaWduZWQgdmFsdWUKKyAqIHUxNiAgICAgICAgICAxNi1iaXQgKDIgYnl0ZSkgdW5zaWduZWQgdmFsdWUKKyAqIHUzMiAgICAgICAgICAzMi1iaXQgKDQgYnl0ZSkgdW5zaWduZWQgdmFsdWUKKyAqIHU2NCAgICAgICAgICA2NC1iaXQgKDggYnl0ZSkgdW5zaWduZWQgdmFsdWUKICAqCi0gKiBJTlQxNiAgICAgICAgMTYtYml0ICgyIGJ5dGUpIHNpZ25lZCB2YWx1ZQotICogSU5UMzIgICAgICAgIDMyLWJpdCAoNCBieXRlKSBzaWduZWQgdmFsdWUKLSAqIElOVDY0ICAgICAgICA2NC1iaXQgKDggYnl0ZSkgc2lnbmVkIHZhbHVlCisgKiBzMTYgICAgICAgICAgMTYtYml0ICgyIGJ5dGUpIHNpZ25lZCB2YWx1ZQorICogczMyICAgICAgICAgIDMyLWJpdCAoNCBieXRlKSBzaWduZWQgdmFsdWUKKyAqIHM2NCAgICAgICAgICA2NC1iaXQgKDggYnl0ZSkgc2lnbmVkIHZhbHVlCiAgKgotICogQ09NUElMRVJfREVQRU5ERU5UX1VJTlQ2NC9JTlQ2NCAtIFRoZXNlIHR5cGVzIGFyZSBkZWZpbmVkIGluIHRoZQorICogQ09NUElMRVJfREVQRU5ERU5UX1VJTlQ2NC9zNjQgLSBUaGVzZSB0eXBlcyBhcmUgZGVmaW5lZCBpbiB0aGUKICAqIGNvbXBpbGVyLWRlcGVuZGVudCBoZWFkZXIocykgYW5kIHdlcmUgaW50cm9kdWNlZCBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbW1vbgogICogNjQtYml0IGludGVnZXIgdHlwZSBhY3Jvc3MgdGhlIHZhcmlvdXMgY29tcGlsYXRpb24gbW9kZWxzLCBhcyBzaG93biBpbgogICogdGhlIHRhYmxlIGJlbG93LgpAQCAtMTEwLDExICsxMDgsMTEgQEAKICAqIHVzdWFsbHkgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24sIGVmZmljaWVudCBsb29wIGNvdW50ZXJzLCBhbmQgYXJyYXkKICAqIGluZGV4ZXMuIFRoZSB0eXBlcyBhcmUgc2ltaWxhciB0byB0aGUgc2l6ZV90IHR5cGUgaW4gdGhlIEMgbGlicmFyeSBhbmQgYXJlCiAgKiByZXF1aXJlZCBiZWNhdXNlIHRoZXJlIGlzIG5vIEMgdHlwZSB0aGF0IGNvbnNpc3RlbnRseSByZXByZXNlbnRzIHRoZSBuYXRpdmUKLSAqIGRhdGEgd2lkdGguIEFDUElfU0laRSBpcyBuZWVkZWQgYmVjYXVzZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhCisgKiBkYXRhIHdpZHRoLiBhY3BpX3NpemUgaXMgbmVlZGVkIGJlY2F1c2UgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYQogICoga2VybmVsLWxldmVsIEMgbGlicmFyeSBpcyBwcmVzZW50LgogICoKLSAqIEFDUElfU0laRSAgICAgICAgMTYvMzIvNjQtYml0IHVuc2lnbmVkIHZhbHVlCi0gKiBBQ1BJX05BVElWRV9JTlQgIDE2LzMyLzY0LWJpdCBzaWduZWQgdmFsdWUKKyAqIGFjcGlfc2l6ZSAgICAgICAgMTYvMzIvNjQtYml0IHVuc2lnbmVkIHZhbHVlCisgKiBhY3BpX25hdGl2ZV9pbnQgIDE2LzMyLzY0LWJpdCBzaWduZWQgdmFsdWUKICAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTIzLDEzICsxMjEsMTUgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgQk9PTEVBTjsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVSU5UODsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVUlOVDE2OwotdHlwZWRlZiBDT01QSUxFUl9ERVBFTkRFTlRfVUlOVDY0IFVJTlQ2NDsKLXR5cGVkZWYgQ09NUElMRVJfREVQRU5ERU5UX0lOVDY0IElOVDY0OworI2lmbmRlZiBBQ1BJX1VTRV9TWVNURU1fSU5UVFlQRVMKIAotLyohIFtFbmRdIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uICEqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHU4OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHU4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1MTY7Cit0eXBlZGVmIENPTVBJTEVSX0RFUEVOREVOVF9VSU5UNjQgdTY0OwordHlwZWRlZiBDT01QSUxFUl9ERVBFTkRFTlRfSU5UNjQgczY0OworCisjZW5kaWYJCQkJLyogQUNQSV9VU0VfU1lTVEVNX0lOVFRZUEVTICovCiAKIC8qCiAgKiBWYWx1ZSByZXR1cm5lZCBieSBhY3BpX29zX2dldF90aHJlYWRfaWQuIFRoZXJlIGlzIG5vIHN0YW5kYXJkICJ0aHJlYWRfaWQiCkBAIC0xNDksMTIgKzE0OSwxMiBAQAogCiAjaWYgQUNQSV9NQUNISU5FX1dJRFRIID09IDY0CiAKLS8qISBbQmVnaW5dIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uIChrZWVwIHRoZSB0eXBlZGVmcyBhcy1pcykgKi8KKyNpZm5kZWYgQUNQSV9VU0VfU1lTVEVNX0lOVFRZUEVTCiAKLXR5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQzMjsKLXR5cGVkZWYgaW50IElOVDMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdTMyOwordHlwZWRlZiBpbnQgczMyOwogCi0vKiEgW0VuZF0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gISovCisjZW5kaWYJCQkJLyogQUNQSV9VU0VfU1lTVEVNX0lOVFRZUEVTICovCiAKIHR5cGVkZWYgczY0IGFjcGlfbmF0aXZlX2ludDsKIApAQCAtMTg4LDEyICsxODgsMTIgQEAKIAogI2VsaWYgQUNQSV9NQUNISU5FX1dJRFRIID09IDMyCiAKLS8qISBbQmVnaW5dIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uIChrZWVwIHRoZSB0eXBlZGVmcyBhcy1pcykgKi8KKyNpZm5kZWYgQUNQSV9VU0VfU1lTVEVNX0lOVFRZUEVTCiAKLXR5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQzMjsKLXR5cGVkZWYgaW50IElOVDMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdTMyOwordHlwZWRlZiBpbnQgczMyOwogCi0vKiEgW0VuZF0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gISovCisjZW5kaWYJCQkJLyogQUNQSV9VU0VfU1lTVEVNX0lOVFRZUEVTICovCiAKIHR5cGVkZWYgczMyIGFjcGlfbmF0aXZlX2ludDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52LmggYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaAppbmRleCBiNDAyZWI2Li5lODYzZGQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTMsIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE0LCBJbnRlbCBDb3JwLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2djYy5oIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjLmgKaW5kZXggZTA3N2NlNi4uYTQ3NmI5MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjLmgKKysrIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaAppbmRleCAwMDhhYTI4Li45M2M1NWVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oCisrKyBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4LmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEzLCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNCwgSW50ZWwgQ29ycC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC01Miw2ICs1MiwxNCBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogCisjZGVmaW5lIEFDUElfVVNFX1NZU1RFTV9JTlRUWVBFUworCisvKiBDb21waWxlIGZvciByZWR1Y2VkIGhhcmR3YXJlIG1vZGUgb25seSB3aXRoIHRoaXMga2VybmVsIGNvbmZpZyAqLworCisjaWZkZWYgQ09ORklHX0FDUElfUkVEVUNFRF9IQVJEV0FSRV9PTkxZCisjZGVmaW5lIEFDUElfUkVEVUNFRF9IQVJEV0FSRSAxCisjZW5kaWYKKwogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CkBAIC04Myw2ICs5MSwxNiBAQAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKKy8qIERpc2FibGUga2VybmVsIHNwZWNpZmljIGRlY2xhcmF0b3JzICovCisKKyNpZm5kZWYgX19pbml0CisjZGVmaW5lIF9faW5pdAorI2VuZGlmCisKKyNpZm5kZWYgX19pb21lbQorI2RlZmluZSBfX2lvbWVtCisjZW5kaWYKKwogLyogSG9zdC1kZXBlbmRlbnQgdHlwZXMgYW5kIGRlZmluZXMgZm9yIHVzZXItc3BhY2UgQUNQSUNBICovCiAKICNkZWZpbmUgQUNQSV9GTFVTSF9DUFVfQ0FDSEUoKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9jcHV0aW1lX2ppZmZpZXMuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvY3B1dGltZV9qaWZmaWVzLmgKaW5kZXggMjcyZWNiYS4uZDVjYjc4ZjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvY3B1dGltZV9qaWZmaWVzLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9jcHV0aW1lX2ppZmZpZXMuaApAQCAtMTUsOCArMTUsMTAgQEAKIAogCiAvKgotICogQ29udmVydCBuYW5vc2Vjb25kcyB0byBjcHV0aW1lCisgKiBDb252ZXJ0IG5hbm9zZWNvbmRzIDwtPiBjcHV0aW1lCiAgKi8KKyNkZWZpbmUgY3B1dGltZV90b19uc2VjcyhfX2N0KQkJXAorCWppZmZpZXNfdG9fbnNlY3MoY3B1dGltZV90b19qaWZmaWVzKF9fY3QpKQogI2RlZmluZSBuc2Vjc190b19jcHV0aW1lNjQoX19uc2VjKQlcCiAJamlmZmllczY0X3RvX2NwdXRpbWU2NChuc2Vjc190b19qaWZmaWVzNjQoX19uc2VjKSkKICNkZWZpbmUgbnNlY3NfdG9fY3B1dGltZShfX25zZWMpCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvY3B1dGltZV9uc2Vjcy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9jcHV0aW1lX25zZWNzLmgKaW5kZXggMmM5ZTYyYy4uNGU4MTc2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9jcHV0aW1lX25zZWNzLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9jcHV0aW1lX25zZWNzLmgKQEAgLTQ0LDcgKzQ0LDEwIEBACiAvKgogICogQ29udmVydCBjcHV0aW1lIDwtPiBuYW5vc2Vjb25kcwogICovCi0jZGVmaW5lIG5zZWNzX3RvX2NwdXRpbWUoX19uc2VjcykJKChfX2ZvcmNlIHU2NCkoX19uc2VjcykpCisjZGVmaW5lIGNwdXRpbWVfdG9fbnNlY3MoX19jdCkJCVwKKwkoX19mb3JjZSB1NjQpKF9fY3QpCisjZGVmaW5lIG5zZWNzX3RvX2NwdXRpbWUoX19uc2VjcykJXAorCShfX2ZvcmNlIGNwdXRpbWVfdCkoX19uc2VjcykKIAogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9zb3VuZC90bHYzMjBhaWMzMXh4LW1pY2JpYXMuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3Mvc291bmQvdGx2MzIwYWljMzF4eC1taWNiaWFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjYjc3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3Mvc291bmQvdGx2MzIwYWljMzF4eC1taWNiaWFzLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9fRFRfVExWMzIwQUlDMzFYWF9NSUNCSUFTX0gKKyNkZWZpbmUgX19EVF9UTFYzMjBBSUMzMVhYX01JQ0JJQVNfSAorCisjZGVmaW5lIE1JQ0JJQVNfMl8wVgkJMQorI2RlZmluZSBNSUNCSUFTXzJfNVYJCTIKKyNkZWZpbmUgTUlDQklBU19BVkREVgkJMworCisjZW5kaWYgLyogX19EVF9UTFYzMjBBSUMzMVhYX01JQ0JJQVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9zcG1pL3NwbWkuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3Mvc3BtaS9zcG1pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExZTFlNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3Mvc3BtaS9zcG1pLmgKQEAgLTAsMCArMSwxOCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fRFRfQklORElOR1NfU1BNSV9ICisjZGVmaW5lIF9fRFRfQklORElOR1NfU1BNSV9ICisKKyNkZWZpbmUgU1BNSV9VU0lECTAKKyNkZWZpbmUgU1BNSV9HU0lECTEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FjcGkuaCBiL2luY2x1ZGUvbGludXgvYWNwaS5oCmluZGV4IDExNTFhMWQuLjdhOGYyY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWNwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYWNwaS5oCkBAIC0xMDgsNiArMTA4LDEwIEBACiB9CiAjZW5kaWYKIAorI2RlZmluZSBCQURfTUFEVF9FTlRSWShlbnRyeSwgZW5kKSAoCQkJCQkgICAgXAorCQkoIWVudHJ5KSB8fCAodW5zaWduZWQgbG9uZyllbnRyeSArIHNpemVvZigqZW50cnkpID4gZW5kIHx8ICBcCisJCSgoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICopZW50cnkpLT5sZW5ndGggPCBzaXplb2YoKmVudHJ5KSkKKwogY2hhciAqIF9fYWNwaV9tYXBfdGFibGUgKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOwogdm9pZCBfX2FjcGlfdW5tYXBfdGFibGUoY2hhciAqbWFwLCB1bnNpZ25lZCBsb25nIHNpemUpOwogaW50IGVhcmx5X2FjcGlfYm9vdF9pbml0KHZvaWQpOwpAQCAtMjU5LDE0ICsyNjMsOSBAQAogZXh0ZXJuIHZvaWQgYWNwaV9vc2lfc2V0dXAoY2hhciAqc3RyKTsKIAogI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKLWludCBhY3BpX2dldF9weG0oYWNwaV9oYW5kbGUgaGFuZGxlKTsKLWludCBhY3BpX2dldF9ub2RlKGFjcGlfaGFuZGxlICpoYW5kbGUpOworaW50IGFjcGlfZ2V0X25vZGUoYWNwaV9oYW5kbGUgaGFuZGxlKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBhY3BpX2dldF9weG0oYWNwaV9oYW5kbGUgaGFuZGxlKQotewotCXJldHVybiAwOwotfQotc3RhdGljIGlubGluZSBpbnQgYWNwaV9nZXRfbm9kZShhY3BpX2hhbmRsZSAqaGFuZGxlKQorc3RhdGljIGlubGluZSBpbnQgYWNwaV9nZXRfbm9kZShhY3BpX2hhbmRsZSBoYW5kbGUpCiB7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F0bWVsLXNzYy5oIGIvaW5jbHVkZS9saW51eC9hdG1lbC1zc2MuaAppbmRleCA2NmEwZTUzLi41NzFhMTJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0bWVsLXNzYy5oCisrKyBiL2luY2x1ZGUvbGludXgvYXRtZWwtc3NjLmgKQEAgLTE4LDYgKzE4LDcgQEAKIAlzdHJ1Y3QgY2xrCQkqY2xrOwogCWludAkJCXVzZXI7CiAJaW50CQkJaXJxOworCWJvb2wJCQljbGtfZnJvbV9ya19waW47CiB9OwogCiBzdHJ1Y3Qgc3NjX2RldmljZSAqIF9fbXVzdF9jaGVjayBzc2NfcmVxdWVzdCh1bnNpZ25lZCBpbnQgc3NjX251bSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsay1pb3BvbGwuaCBiL2luY2x1ZGUvbGludXgvYmxrLWlvcG9sbC5oCmluZGV4IDMwODczNGQuLjc3YWU3N2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrLWlvcG9sbC5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrLWlvcG9sbC5oCkBAIC00Myw2ICs0Myw0IEBACiBleHRlcm4gdm9pZCBibGtfaW9wb2xsX2VuYWJsZShzdHJ1Y3QgYmxrX2lvcG9sbCAqKTsKIGV4dGVybiB2b2lkIGJsa19pb3BvbGxfZGlzYWJsZShzdHJ1Y3QgYmxrX2lvcG9sbCAqKTsKIAotZXh0ZXJuIGludCBibGtfaW9wb2xsX2VuYWJsZWQ7Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGstbXEuaCBiL2luY2x1ZGUvbGludXgvYmxrLW1xLmgKaW5kZXggMmZmMmU4ZC4uMDEyMDQ1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibGstbXEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsay1tcS5oCkBAIC0xMDksNyArMTA5LDcgQEAKIAlCTEtfTVFfRl9TSE9VTERfU09SVAk9IDEgPDwgMSwKIAlCTEtfTVFfRl9TSE9VTERfSVBJCT0gMSA8PCAyLAogCi0JQkxLX01RX1NfU1RPUFBFRAk9IDEgPDwgMCwKKwlCTEtfTVFfU19TVE9QUEVECT0gMCwKIAogCUJMS19NUV9NQVhfREVQVEgJPSAyMDQ4LAogfTsKQEAgLTExNyw3ICsxMTcsOCBAQAogc3RydWN0IHJlcXVlc3RfcXVldWUgKmJsa19tcV9pbml0X3F1ZXVlKHN0cnVjdCBibGtfbXFfcmVnICosIHZvaWQgKik7CiBpbnQgYmxrX21xX3JlZ2lzdGVyX2Rpc2soc3RydWN0IGdlbmRpc2sgKik7CiB2b2lkIGJsa19tcV91bnJlZ2lzdGVyX2Rpc2soc3RydWN0IGdlbmRpc2sgKik7Ci12b2lkIGJsa19tcV9pbml0X2NvbW1hbmRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHZvaWQgKCppbml0KSh2b2lkICpkYXRhLCBzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCB1bnNpZ25lZCBpbnQpLCB2b2lkICpkYXRhKTsKK2ludCBibGtfbXFfaW5pdF9jb21tYW5kcyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBpbnQgKCppbml0KSh2b2lkICpkYXRhLCBzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCB1bnNpZ25lZCBpbnQpLCB2b2lkICpkYXRhKTsKK3ZvaWQgYmxrX21xX2ZyZWVfY29tbWFuZHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdm9pZCAoKmZyZWUpKHZvaWQgKmRhdGEsIHN0cnVjdCBibGtfbXFfaHdfY3R4ICosIHN0cnVjdCByZXF1ZXN0ICosIHVuc2lnbmVkIGludCksIHZvaWQgKmRhdGEpOwogCiB2b2lkIGJsa19tcV9mbHVzaF9wbHVnX2xpc3Qoc3RydWN0IGJsa19wbHVnICpwbHVnLCBib29sIGZyb21fc2NoZWR1bGUpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaAppbmRleCA0YWZhNGY4Li4xZTFmYTNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTk5LDYgKzk5LDcgQEAKIAl1bmlvbiB7CiAJCXN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhIGNzZDsKIAkJc3RydWN0IHdvcmtfc3RydWN0IG1xX2ZsdXNoX3dvcms7CisJCXVuc2lnbmVkIGxvbmcgZmlmb190aW1lOwogCX07CiAKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2xvY2tjaGlwcy5oIGIvaW5jbHVkZS9saW51eC9jbG9ja2NoaXBzLmgKaW5kZXggNDkzYWEwMi4uMmU0Y2I2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jbG9ja2NoaXBzLmgKKysrIGIvaW5jbHVkZS9saW51eC9jbG9ja2NoaXBzLmgKQEAgLTYyLDYgKzYyLDExIEBACiAjZGVmaW5lIENMT0NLX0VWVF9GRUFUX0RZTklSUQkJMHgwMDAwMjAKICNkZWZpbmUgQ0xPQ0tfRVZUX0ZFQVRfUEVSQ1BVCQkweDAwMDA0MAogCisvKgorICogQ2xvY2tldmVudCBkZXZpY2UgaXMgYmFzZWQgb24gYSBocnRpbWVyIGZvciBicm9hZGNhc3QKKyAqLworI2RlZmluZSBDTE9DS19FVlRfRkVBVF9IUlRJTUVSCQkweDAwMDA4MAorCiAvKioKICAqIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgLSBjbG9jayBldmVudCBkZXZpY2UgZGVzY3JpcHRvcgogICogQGV2ZW50X2hhbmRsZXI6CUFzc2lnbmVkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gYmUgY2FsbGVkIGJ5IHRoZSBsb3cKQEAgLTgzLDYgKzg4LDcgQEAKICAqIEBuYW1lOgkJcHRyIHRvIGNsb2NrIGV2ZW50IG5hbWUKICAqIEByYXRpbmc6CQl2YXJpYWJsZSB0byByYXRlIGNsb2NrIGV2ZW50IGRldmljZXMKICAqIEBpcnE6CQlJUlEgbnVtYmVyIChvbmx5IGZvciBub24gQ1BVIGxvY2FsIGRldmljZXMpCisgKiBAYm91bmRfb246CQlCb3VuZCBvbiBDUFUKICAqIEBjcHVtYXNrOgkJY3B1bWFzayB0byBpbmRpY2F0ZSBmb3Igd2hpY2ggQ1BVcyB0aGlzIGRldmljZSB3b3JrcwogICogQGxpc3Q6CQlsaXN0IGhlYWQgZm9yIHRoZSBtYW5hZ2VtZW50IGNvZGUKICAqIEBvd25lcjoJCW1vZHVsZSByZWZlcmVuY2UKQEAgLTExMyw2ICsxMTksNyBAQAogCWNvbnN0IGNoYXIJCSpuYW1lOwogCWludAkJCXJhdGluZzsKIAlpbnQJCQlpcnE7CisJaW50CQkJYm91bmRfb247CiAJY29uc3Qgc3RydWN0IGNwdW1hc2sJKmNwdW1hc2s7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKQEAgLTE4MCwxNSArMTg3LDE3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUKSAmJiBkZWZpbmVkKENPTkZJR19USUNLX09ORVNIT1QpCitleHRlcm4gdm9pZCB0aWNrX3NldHVwX2hydGltZXJfYnJvYWRjYXN0KHZvaWQpOwogZXh0ZXJuIGludCB0aWNrX2NoZWNrX2Jyb2FkY2FzdF9leHBpcmVkKHZvaWQpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IHRpY2tfY2hlY2tfYnJvYWRjYXN0X2V4cGlyZWQodm9pZCkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfc2V0dXBfaHJ0aW1lcl9icm9hZGNhc3Qodm9pZCkge307CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTCi1leHRlcm4gdm9pZCBjbG9ja2V2ZW50c19ub3RpZnkodW5zaWduZWQgbG9uZyByZWFzb24sIHZvaWQgKmFyZyk7CitleHRlcm4gaW50IGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xvY2tldmVudHNfbm90aWZ5KHVuc2lnbmVkIGxvbmcgcmVhc29uLCB2b2lkICphcmcpIHt9CitzdGF0aWMgaW5saW5lIGludCBjbG9ja2V2ZW50c19ub3RpZnkodW5zaWduZWQgbG9uZyByZWFzb24sIHZvaWQgKmFyZykgeyByZXR1cm4gMDsgfQogI2VuZGlmCiAKICNlbHNlIC8qIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEICovCkBAIC0xOTYsOCArMjA1LDkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjbG9ja2V2ZW50c19zdXNwZW5kKHZvaWQpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgY2xvY2tldmVudHNfcmVzdW1lKHZvaWQpIHt9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjbG9ja2V2ZW50c19ub3RpZnkodW5zaWduZWQgbG9uZyByZWFzb24sIHZvaWQgKmFyZykge30KK3N0YXRpYyBpbmxpbmUgaW50IGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCB0aWNrX2NoZWNrX2Jyb2FkY2FzdF9leHBpcmVkKHZvaWQpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX3NldHVwX2hydGltZXJfYnJvYWRjYXN0KHZvaWQpIHt9OwogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21wYXQuaCBiL2luY2x1ZGUvbGludXgvY29tcGF0LmgKaW5kZXggMDFjMGFhNS4uZTY0OTQyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCkBAIC0xNDcsMjYgKzE0NywyMyBAQAogfTsKIAogLyoKLSAqIFRoZXNlIGZ1bmN0aW9ucyBvcGVyYXRlIHN0cmljdGx5IG9uIHN0cnVjdCBjb21wYXRfdGltZSoKLSAqLwotZXh0ZXJuIGludCBnZXRfY29tcGF0X3RpbWVzcGVjKHN0cnVjdCB0aW1lc3BlYyAqLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICopOwotZXh0ZXJuIGludCBwdXRfY29tcGF0X3RpbWVzcGVjKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqLAotCQkJICAgICAgIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICopOwotZXh0ZXJuIGludCBnZXRfY29tcGF0X3RpbWV2YWwoc3RydWN0IHRpbWV2YWwgKiwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKik7Ci1leHRlcm4gaW50IHB1dF9jb21wYXRfdGltZXZhbChjb25zdCBzdHJ1Y3QgdGltZXZhbCAqLAotCQkJICAgICAgc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqKTsKLS8qCiAgKiBUaGVzZSBmdW5jdGlvbnMgb3BlcmF0ZSBvbiAzMi0gb3IgNjQtYml0IHNwZWNzIGRlcGVuZGluZyBvbgotICogQ09NUEFUX1VTRV82NEJJVF9USU1FLCBoZW5jZSB0aGUgdm9pZCB1c2VyIHBvaW50ZXIgYXJndW1lbnRzIGFuZCB0aGUKLSAqIG5hbWluZyBhcyBjb21wYXRfZ2V0L3B1dF8gcmF0aGVyIHRoYW4gZ2V0L3B1dF9jb21wYXRfLgorICogQ09NUEFUX1VTRV82NEJJVF9USU1FLCBoZW5jZSB0aGUgdm9pZCB1c2VyIHBvaW50ZXIgYXJndW1lbnRzLgogICovCiBleHRlcm4gaW50IGNvbXBhdF9nZXRfdGltZXNwZWMoc3RydWN0IHRpbWVzcGVjICosIGNvbnN0IHZvaWQgX191c2VyICopOwogZXh0ZXJuIGludCBjb21wYXRfcHV0X3RpbWVzcGVjKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqLCB2b2lkIF9fdXNlciAqKTsKIGV4dGVybiBpbnQgY29tcGF0X2dldF90aW1ldmFsKHN0cnVjdCB0aW1ldmFsICosIGNvbnN0IHZvaWQgX191c2VyICopOwogZXh0ZXJuIGludCBjb21wYXRfcHV0X3RpbWV2YWwoY29uc3Qgc3RydWN0IHRpbWV2YWwgKiwgdm9pZCBfX3VzZXIgKik7CiAKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnQgYSB0aW1lc3BlYyBpZiBuZWNlc3NhcnkgYW5kIHJldHVybnMgYSAqdXNlcgorICogc3BhY2UqIHBvaW50ZXIuICBJZiBubyBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeSwgaXQgcmV0dXJucyB0aGUKKyAqIGluaXRpYWwgcG9pbnRlci4gIE5VTEwgaXMgYSBsZWdpdGltYXRlIGFyZ3VtZW50IGFuZCB3aWxsIGFsd2F5cworICogb3V0cHV0IE5VTEwuCisgKi8KK2V4dGVybiBpbnQgY29tcGF0X2NvbnZlcnRfdGltZXNwZWMoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKiwKKwkJCQkgICBjb25zdCB2b2lkIF9fdXNlciAqKTsKKwogc3RydWN0IGNvbXBhdF9pb3ZlYyB7CiAJY29tcGF0X3VwdHJfdAlpb3ZfYmFzZTsKIAljb21wYXRfc2l6ZV90CWlvdl9sZW47CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nvbm5lY3Rvci5oIGIvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaAppbmRleCBiMmI1YTQxLi5iZTljNDc0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nvbm5lY3Rvci5oCkBAIC03MSw3ICs3MSw3IEBACiBpbnQgY25fYWRkX2NhbGxiYWNrKHN0cnVjdCBjYl9pZCAqaWQsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCSAgICB2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBjbl9tc2cgKiwgc3RydWN0IG5ldGxpbmtfc2tiX3Bhcm1zICopKTsKIHZvaWQgY25fZGVsX2NhbGxiYWNrKHN0cnVjdCBjYl9pZCAqKTsKLWludCBjbl9uZXRsaW5rX3NlbmQoc3RydWN0IGNuX21zZyAqLCB1MzIsIGdmcF90KTsKK2ludCBjbl9uZXRsaW5rX3NlbmQoc3RydWN0IGNuX21zZyAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgZ3JvdXAsIGdmcF90IGdmcF9tYXNrKTsKIAogaW50IGNuX3F1ZXVlX2FkZF9jYWxsYmFjayhzdHJ1Y3QgY25fcXVldWVfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgIHN0cnVjdCBjYl9pZCAqaWQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdS5oIGIvaW5jbHVkZS9saW51eC9jcHUuaAppbmRleCAwM2UyMzVhZC4uMDNlOTYyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdS5oCkBAIC00NiwxMyArNDYsNiBAQAogI2VuZGlmCiBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2s7CiAKLSNpZmRlZiBDT05GSUdfQVJDSF9IQVNfQ1BVX0FVVE9QUk9CRQotZXh0ZXJuIGludCBhcmNoX2NwdV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpOwotZXh0ZXJuIHNzaXplX3QgYXJjaF9wcmludF9jcHVfbW9kYWxpYXMoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgICAgY2hhciAqYnVmcHRyKTsKLSNlbmRpZgotCiAvKgogICogQ1BVIG5vdGlmaWVyIHByaW9yaXRpZXMuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1ZmVhdHVyZS5oIGIvaW5jbHVkZS9saW51eC9jcHVmZWF0dXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRkNGViOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvY3B1ZmVhdHVyZS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgTGluYXJvIEx0ZC4gPGFyZC5iaWVzaGV1dmVsQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfQ1BVRkVBVFVSRV9ICisjZGVmaW5lIF9fTElOVVhfQ1BVRkVBVFVSRV9ICisKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DUFVfQVVUT1BST0JFCisKKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKyNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgorCisvKgorICogTWFjcm9zIGltcG9ydGVkIGZyb20gPGFzbS9jcHVmZWF0dXJlLmg+OgorICogLSBjcHVfZmVhdHVyZSh4KQkJb3JkaW5hbCB2YWx1ZSBvZiBmZWF0dXJlIGNhbGxlZCAneCcKKyAqIC0gY3B1X2hhdmVfZmVhdHVyZSh1MzIgbikJd2hldGhlciBmZWF0dXJlICNuIGlzIGF2YWlsYWJsZQorICogLSBNQVhfQ1BVX0ZFQVRVUkVTCQl1cHBlciBib3VuZCBmb3IgZmVhdHVyZSBvcmRpbmFsIHZhbHVlcworICogT3B0aW9uYWw6CisgKiAtIENQVV9GRUFUVVJFX1RZUEVGTVQJZm9ybWF0IHN0cmluZyBmcmFnbWVudCBmb3IgcHJpbnRpbmcgdGhlIGNwdSB0eXBlCisgKiAtIENQVV9GRUFUVVJFX1RZUEVWQUwJc2V0IG9mIHZhbHVlcyBtYXRjaGluZyB0aGUgZm9ybWF0IHN0cmluZyBhYm92ZQorICovCisKKyNpZm5kZWYgQ1BVX0ZFQVRVUkVfVFlQRUZNVAorI2RlZmluZSBDUFVfRkVBVFVSRV9UWVBFRk1UCSIlcyIKKyNlbmRpZgorCisjaWZuZGVmIENQVV9GRUFUVVJFX1RZUEVWQUwKKyNkZWZpbmUgQ1BVX0ZFQVRVUkVfVFlQRVZBTAlFTEZfUExBVEZPUk0KKyNlbmRpZgorCisvKgorICogVXNlIG1vZHVsZV9jcHVfZmVhdHVyZV9tYXRjaChmZWF0dXJlLCBtb2R1bGVfaW5pdF9mdW5jdGlvbikgdG8KKyAqIGRlY2xhcmUgdGhhdAorICogYSkgdGhlIG1vZHVsZSBzaGFsbCBiZSBwcm9iZWQgdXBvbiBkaXNjb3Zlcnkgb2YgQ1BVIGZlYXR1cmUgJ2ZlYXR1cmUnCisgKiAgICAodHlwaWNhbGx5IGF0IGJvb3QgdGltZSB1c2luZyB1ZGV2KQorICogYikgdGhlIG1vZHVsZSBtdXN0IG5vdCBiZSBsb2FkZWQgaWYgQ1BVIGZlYXR1cmUgJ2ZlYXR1cmUnIGlzIG5vdCBwcmVzZW50CisgKiAgICAobm90IGV2ZW4gYnkgbWFudWFsIGluc21vZCkuCisgKgorICogRm9yIGEgbGlzdCBvZiBsZWdhbCB2YWx1ZXMgZm9yICdmZWF0dXJlJywgcGxlYXNlIGNvbnN1bHQgdGhlIGZpbGUKKyAqICdhc20vY3B1ZmVhdHVyZS5oJyBvZiB5b3VyIGZhdm9yaXRlIGFyY2hpdGVjdHVyZS4KKyAqLworI2RlZmluZSBtb2R1bGVfY3B1X2ZlYXR1cmVfbWF0Y2goeCwgX19pbml0KQkJCVwKK3N0YXRpYyBzdHJ1Y3QgY3B1X2ZlYXR1cmUgY29uc3QgY3B1X2ZlYXR1cmVfbWF0Y2hfICMjIHhbXSA9CVwKKwl7IHsgLmZlYXR1cmUgPSBjcHVfZmVhdHVyZSh4KSB9LCB7IH0gfTsJCQlcCitNT0RVTEVfREVWSUNFX1RBQkxFKGNwdSwgY3B1X2ZlYXR1cmVfbWF0Y2hfICMjIHgpOwkJXAorCQkJCQkJCQlcCitzdGF0aWMgaW50IGNwdV9mZWF0dXJlX21hdGNoXyAjIyB4ICMjIF9pbml0KHZvaWQpCQlcCit7CQkJCQkJCQlcCisJaWYgKCFjcHVfaGF2ZV9mZWF0dXJlKGNwdV9mZWF0dXJlKHgpKSkJCQlcCisJCXJldHVybiAtRU5PREVWOwkJCQkJXAorCXJldHVybiBfX2luaXQoKTsJCQkJCVwKK30JCQkJCQkJCVwKK21vZHVsZV9pbml0KGNwdV9mZWF0dXJlX21hdGNoXyAjIyB4ICMjIF9pbml0KQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVmcmVxLmggYi9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaAppbmRleCA0ZDg5ZTBlLi4yZDJlNjJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaApAQCAtNzQsNiArNzQsOCBAQAogCXVuc2lnbmVkIGludAkJbWF4OyAgICAvKiBpbiBrSHogKi8KIAl1bnNpZ25lZCBpbnQJCWN1cjsgICAgLyogaW4ga0h6LCBvbmx5IG5lZWRlZCBpZiBjcHVmcmVxCiAJCQkJCSAqIGdvdmVybm9ycyBhcmUgdXNlZCAqLworCXVuc2lnbmVkIGludAkJc3VzcGVuZF9mcmVxOyAvKiBmcmVxIHRvIHNldCBkdXJpbmcgc3VzcGVuZCAqLworCiAJdW5zaWduZWQgaW50CQlwb2xpY3k7IC8qIHNlZSBhYm92ZSAqLwogCXN0cnVjdCBjcHVmcmVxX2dvdmVybm9yCSpnb3Zlcm5vcjsgLyogc2VlIGJlbG93ICovCiAJdm9pZAkJCSpnb3Zlcm5vcl9kYXRhOwpAQCAtODMsNiArODUsNyBAQAogCQkJCQkgKiBjYWxsZWQsIGJ1dCB5b3UncmUgaW4gSVJRIGNvbnRleHQgKi8KIAogCXN0cnVjdCBjcHVmcmVxX3JlYWxfcG9saWN5CXVzZXJfcG9saWN5OworCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZQkqZnJlcV90YWJsZTsKIAogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIHBvbGljeV9saXN0OwogCXN0cnVjdCBrb2JqZWN0CQlrb2JqOwpAQCAtMjI0LDYgKzIyNyw3IEBACiAJaW50CSgqYmlvc19saW1pdCkJKGludCBjcHUsIHVuc2lnbmVkIGludCAqbGltaXQpOwogCiAJaW50CSgqZXhpdCkJCShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSk7CisJdm9pZAkoKnN0b3BfY3B1KQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOwogCWludAkoKnN1c3BlbmQpCShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSk7CiAJaW50CSgqcmVzdW1lKQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOwogCXN0cnVjdCBmcmVxX2F0dHIJKiphdHRyOwpAQCAtMjk2LDYgKzMwMCwxNSBAQAogCQkJcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxKTsKIH0KIAorI2lmZGVmIENPTkZJR19DUFVfRlJFUQordm9pZCBjcHVmcmVxX3N1c3BlbmQodm9pZCk7Cit2b2lkIGNwdWZyZXFfcmVzdW1lKHZvaWQpOworaW50IGNwdWZyZXFfZ2VuZXJpY19zdXNwZW5kKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV9zdXNwZW5kKHZvaWQpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV9yZXN1bWUodm9pZCkge30KKyNlbmRpZgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgICAgIENQVUZSRVEgTk9USUZJRVIgSU5URVJGQUNFICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzA2LDggKzMxOSw2IEBACiAvKiBUcmFuc2l0aW9uIG5vdGlmaWVycyAqLwogI2RlZmluZSBDUFVGUkVRX1BSRUNIQU5HRQkJKDApCiAjZGVmaW5lIENQVUZSRVFfUE9TVENIQU5HRQkJKDEpCi0jZGVmaW5lIENQVUZSRVFfUkVTVU1FQ0hBTkdFCQkoOCkKLSNkZWZpbmUgQ1BVRlJFUV9TVVNQRU5EQ0hBTkdFCQkoOSkKIAogLyogUG9saWN5IE5vdGlmaWVycyAgKi8KICNkZWZpbmUgQ1BVRlJFUV9BREpVU1QJCQkoMCkKQEAgLTQ2Myw3ICs0NzQsNiBAQAogaW50IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9pbmRleChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKIAkJdW5zaWduZWQgaW50IGZyZXEpOwogCi12b2lkIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3VwZGF0ZV9wb2xpY3lfY3B1KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KTsKIHNzaXplX3QgY3B1ZnJlcV9zaG93X2NwdXMoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIGNoYXIgKmJ1Zik7CiAKICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKQEAgLTQ5MCw5ICs1MDAsNiBAQAogLyogdGhlIGZvbGxvd2luZyBhcmUgcmVhbGx5IHJlYWxseSBvcHRpb25hbCAqLwogZXh0ZXJuIHN0cnVjdCBmcmVxX2F0dHIgY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXM7CiBleHRlcm4gc3RydWN0IGZyZXFfYXR0ciAqY3B1ZnJlcV9nZW5lcmljX2F0dHJbXTsKLXZvaWQgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICp0YWJsZSwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgY3B1KTsKLXZvaWQgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIodW5zaWduZWQgaW50IGNwdSk7CiBpbnQgY3B1ZnJlcV90YWJsZV92YWxpZGF0ZV9hbmRfc2hvdyhzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKIAkJCQkgICAgICBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnRhYmxlKTsKIApAQCAtNTAwLDEwICs1MDcsNCBAQAogaW50IGNwdWZyZXFfZ2VuZXJpY19pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAogCQlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnRhYmxlLAogCQl1bnNpZ25lZCBpbnQgdHJhbnNpdGlvbl9sYXRlbmN5KTsKLXN0YXRpYyBpbmxpbmUgaW50IGNwdWZyZXFfZ2VuZXJpY19leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQotewotCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsKLQlyZXR1cm4gMDsKLX0KLQogI2VuZGlmIC8qIF9MSU5VWF9DUFVGUkVRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1dGltZS5oIGIvaW5jbHVkZS9saW51eC9jcHV0aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJlYjJlZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvY3B1dGltZS5oCkBAIC0wLDAgKzEsMTYgQEAKKyNpZm5kZWYgX19MSU5VWF9DUFVUSU1FX0gKKyNkZWZpbmUgX19MSU5VWF9DUFVUSU1FX0gKKworI2luY2x1ZGUgPGFzbS9jcHV0aW1lLmg+CisKKyNpZm5kZWYgY3B1dGltZV90b19uc2VjcworIyBkZWZpbmUgY3B1dGltZV90b19uc2VjcyhfX2N0KQlcCisJKGNwdXRpbWVfdG9fdXNlY3MoX19jdCkgKiBOU0VDX1BFUl9VU0VDKQorI2VuZGlmCisKKyNpZm5kZWYgbnNlY3NfdG9fY3B1dGltZQorIyBkZWZpbmUgbnNlY3NfdG9fY3B1dGltZShfX25zZWNzKQlcCisJdXNlY3NfdG9fY3B1dGltZSgoX19uc2VjcykgLyBOU0VDX1BFUl9VU0VDKQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0xJTlVYX0NQVVRJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKaW5kZXggOTUyYjAxMC4uMjMzYmJiZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCkBAIC01NjAsNiArNTYwLDggQEAKIAkJCSAgICAgIGNvbnN0IHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICplbnRyeSk7CiBleHRlcm4gdm9pZCBkZXZpY2VfcmVtb3ZlX2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyKTsKK2V4dGVybiBib29sIGRldmljZV9yZW1vdmVfZmlsZV9zZWxmKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIpOwogZXh0ZXJuIGludCBfX211c3RfY2hlY2sgZGV2aWNlX2NyZWF0ZV9iaW5fZmlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJCWNvbnN0IHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyKTsKIGV4dGVybiB2b2lkIGRldmljZV9yZW1vdmVfYmluX2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LApAQCAtNjI2LDYgKzYyOCw3IEBACiAJcmV0dXJuIGRldm1fa21hbGxvY19hcnJheShkZXYsIG4sIHNpemUsIGZsYWdzIHwgX19HRlBfWkVSTyk7CiB9CiBleHRlcm4gdm9pZCBkZXZtX2tmcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcCk7CitleHRlcm4gY2hhciAqZGV2bV9rc3RyZHVwKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqcywgZ2ZwX3QgZ2ZwKTsKIAogdm9pZCBfX2lvbWVtICpkZXZtX2lvcmVtYXBfcmVzb3VyY2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7CiB2b2lkIF9faW9tZW0gKmRldm1fcmVxdWVzdF9hbmRfaW9yZW1hcChzdHJ1Y3QgZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RyYmQuaCBiL2luY2x1ZGUvbGludXgvZHJiZC5oCmluZGV4IGRlN2Q3NGEuLjNkYmU5YmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHJiZC5oCisrKyBiL2luY2x1ZGUvbGludXgvZHJiZC5oCkBAIC0zMjcsMTIgKzMyNyw2IEBACiAJU1NfQUZURVJfTEFTVF9FUlJPUiA9IC0yMiwgICAgLyogS2VlcCB0aGlzIGF0IGJvdHRvbSAqLwogfTsKIAotLyogZnJvbSBkcmJkX3N0cmluZ3MuYyAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmRyYmRfY29ubl9zdHIoZW51bSBkcmJkX2Nvbm5zKTsKLWV4dGVybiBjb25zdCBjaGFyICpkcmJkX3JvbGVfc3RyKGVudW0gZHJiZF9yb2xlKTsKLWV4dGVybiBjb25zdCBjaGFyICpkcmJkX2Rpc2tfc3RyKGVudW0gZHJiZF9kaXNrX3N0YXRlKTsKLWV4dGVybiBjb25zdCBjaGFyICpkcmJkX3NldF9zdF9lcnJfc3RyKGVudW0gZHJiZF9zdGF0ZV9ydik7Ci0KICNkZWZpbmUgU0hBUkVEX1NFQ1JFVF9NQVggNjQKIAogI2RlZmluZSBNREZfQ09OU0lTVEVOVAkJKDEgPDwgMCkKQEAgLTM4Miw0ICszNzYsNiBAQAogI2RlZmluZSBEUkJEX01EX0lOREVYX0ZMRVhfRVhUIC0yCiAjZGVmaW5lIERSQkRfTURfSU5ERVhfRkxFWF9JTlQgLTMKIAorI2RlZmluZSBEUkJEX0NQVV9NQVNLX1NJWkUgMzIKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RyYmRfZ2VubC5oIGIvaW5jbHVkZS9saW51eC9kcmJkX2dlbmwuaAppbmRleCBlOGM0NDU3Li40MTkzZjVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RyYmRfZ2VubC5oCisrKyBiL2luY2x1ZGUvbGludXgvZHJiZF9nZW5sLmgKQEAgLTEzNSw3ICsxMzUsNyBAQAogKQogCiBHRU5MX3N0cnVjdChEUkJEX05MQV9SRVNPVVJDRV9PUFRTLCA0LCByZXNfb3B0cywKLQlfX3N0cl9maWVsZF9kZWYoMSwJRFJCRF9HRU5MQV9GX01BTkRBVE9SWSwJY3B1X21hc2ssICAgICAgIDMyKQorCV9fc3RyX2ZpZWxkX2RlZigxLAlEUkJEX0dFTkxBX0ZfTUFOREFUT1JZLAljcHVfbWFzaywgICAgICAgRFJCRF9DUFVfTUFTS19TSVpFKQogCV9fdTMyX2ZpZWxkX2RlZigyLAlEUkJEX0dFTkxBX0ZfTUFOREFUT1JZLAlvbl9ub19kYXRhLCBEUkJEX09OX05PX0RBVEFfREVGKQogKQogCkBAIC0yNzYsOSArMjc2LDkgQEAKICkKIAogCS8qIGFkZCBEUkJEIG1pbm9yIGRldmljZXMgYXMgdm9sdW1lcyB0byByZXNvdXJjZXMgKi8KLUdFTkxfb3AoRFJCRF9BRE1fTkVXX01JTk9SLCA1LCBHRU5MX2RvaXQoZHJiZF9hZG1fYWRkX21pbm9yKSwKK0dFTkxfb3AoRFJCRF9BRE1fTkVXX01JTk9SLCA1LCBHRU5MX2RvaXQoZHJiZF9hZG1fbmV3X21pbm9yKSwKIAlHRU5MX3RsYV9leHBlY3RlZChEUkJEX05MQV9DRkdfQ09OVEVYVCwgRFJCRF9GX1JFUVVJUkVEKSkKLUdFTkxfb3AoRFJCRF9BRE1fREVMX01JTk9SLCA2LCBHRU5MX2RvaXQoZHJiZF9hZG1fZGVsZXRlX21pbm9yKSwKK0dFTkxfb3AoRFJCRF9BRE1fREVMX01JTk9SLCA2LCBHRU5MX2RvaXQoZHJiZF9hZG1fZGVsX21pbm9yKSwKIAlHRU5MX3RsYV9leHBlY3RlZChEUkJEX05MQV9DRkdfQ09OVEVYVCwgRFJCRF9GX1JFUVVJUkVEKSkKIAogCS8qIGFkZCBvciBkZWxldGUgcmVzb3VyY2VzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmggYi9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmgKaW5kZXggMzA2ZGQ4Yy4uZGY2M2JkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oCisrKyBiL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaApAQCAtMjAyLDE3ICsyMDIsOCBAQAogI2RlZmluZSBycV9lbmRfc2VjdG9yKHJxKQkoYmxrX3JxX3BvcyhycSkgKyBibGtfcnFfc2VjdG9ycyhycSkpCiAjZGVmaW5lIHJiX2VudHJ5X3JxKG5vZGUpCXJiX2VudHJ5KChub2RlKSwgc3RydWN0IHJlcXVlc3QsIHJiX25vZGUpCiAKLS8qCi0gKiBIYWNrIHRvIHJldXNlIHRoZSBjc2QubGlzdCBsaXN0X2hlYWQgYXMgdGhlIGZpZm8gdGltZSBob2xkZXIgd2hpbGUKLSAqIHRoZSByZXF1ZXN0IGlzIGluIHRoZSBpbyBzY2hlZHVsZXIuIFNhdmVzIGFuIHVuc2lnbmVkIGxvbmcgaW4gcnEuCi0gKi8KLSNkZWZpbmUgcnFfZmlmb190aW1lKHJxKQkoKHVuc2lnbmVkIGxvbmcpIChycSktPmNzZC5saXN0Lm5leHQpCi0jZGVmaW5lIHJxX3NldF9maWZvX3RpbWUocnEsZXhwKQkoKHJxKS0+Y3NkLmxpc3QubmV4dCA9ICh2b2lkICopIChleHApKQogI2RlZmluZSBycV9lbnRyeV9maWZvKHB0cikJbGlzdF9lbnRyeSgocHRyKSwgc3RydWN0IHJlcXVlc3QsIHF1ZXVlbGlzdCkKLSNkZWZpbmUgcnFfZmlmb19jbGVhcihycSkJZG8gewkJXAotCWxpc3RfZGVsX2luaXQoJihycSktPnF1ZXVlbGlzdCk7CVwKLQlJTklUX0xJU1RfSEVBRCgmKHJxKS0+Y3NkLmxpc3QpOwlcCi0JfSB3aGlsZSAoMCkKKyNkZWZpbmUgcnFfZmlmb19jbGVhcihycSkJbGlzdF9kZWxfaW5pdCgmKHJxKS0+cXVldWVsaXN0KQogCiAjZWxzZSAvKiBDT05GSUdfQkxPQ0sgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHRjb24uaCBiL2luY2x1ZGUvbGludXgvZXh0Y29uLmgKaW5kZXggMjFjNTlhZi4uZjQ4ODE0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHRjb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dGNvbi5oCkBAIC0yNDAsNiArMjQwLDEyIEBACiAJCQkJICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwogZXh0ZXJuIGludCBleHRjb25fdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwKIAkJCQkgICAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKKworLyoKKyAqIEZvbGxvd2luZyBBUEkgZ2V0IHRoZSBleHRjb24gZGV2aWNlIGZyb20gZGV2aWNldHJlZS4KKyAqIFRoaXMgZnVuY3Rpb24gdXNlIHBoYW5kbGUgb2YgZGV2aWNldHJlZSB0byBnZXQgZXh0Y29uIGRldmljZSBkaXJlY3RseS4KKyAqLworZXh0ZXJuIHN0cnVjdCBleHRjb25fZGV2ICpleHRjb25fZ2V0X2VkZXZfYnlfcGhhbmRsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpbmRleCk7CiAjZWxzZSAvKiBDT05GSUdfRVhUQ09OICovCiBzdGF0aWMgaW5saW5lIGludCBleHRjb25fZGV2X3JlZ2lzdGVyKHN0cnVjdCBleHRjb25fZGV2ICplZGV2KQogewpAQCAtMzI0LDUgKzMzMCwxMSBAQAogewogCXJldHVybiAwOwogfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBleHRjb25fZGV2ICpleHRjb25fZ2V0X2VkZXZfYnlfcGhhbmRsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCQkJICAgIGludCBpbmRleCkKK3sKKwlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKK30KICNlbmRpZiAvKiBDT05GSUdfRVhUQ09OICovCiAjZW5kaWYgLyogX19MSU5VWF9FWFRDT05fSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dGNvbi9vZl9leHRjb24uaCBiL2luY2x1ZGUvbGludXgvZXh0Y29uL29mX2V4dGNvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWJmZWZmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvZXh0Y29uL29mX2V4dGNvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIE9GIGhlbHBlcnMgZm9yIEV4dGVybmFsIGNvbm5lY3RvciAoZXh0Y29uKSBmcmFtZXdvcmsKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KLSAqIEtpc2hvbiBWaWpheSBBYnJhaGFtIEkgPGtpc2hvbkB0aS5jb20+Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MKLSAqIENoYW53b28gQ2hvaSA8Y3cwMC5jaG9pQHNhbXN1bmcuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfX0xJTlVYX09GX0VYVENPTl9ICi0jZGVmaW5lIF9fTElOVVhfT0ZfRVhUQ09OX0gKLQotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfT0ZfRVhUQ09OKQotZXh0ZXJuIHN0cnVjdCBleHRjb25fZGV2Ci0JKm9mX2V4dGNvbl9nZXRfZXh0Y29uX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpbmRleCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZXh0Y29uX2RldgotCSpvZl9leHRjb25fZ2V0X2V4dGNvbl9kZXYoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaW5kZXgpCi17Ci0JcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX09GX0VYVENPTiAqLwotI2VuZGlmIC8qIF9fTElOVVhfT0ZfRVhUQ09OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZm1jLXNkYi5oIGIvaW5jbHVkZS9saW51eC9mbWMtc2RiLmgKaW5kZXggMTk3NDMxNy4uNTk5YmQ2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mbWMtc2RiLmgKKysrIGIvaW5jbHVkZS9saW51eC9mbWMtc2RiLmgKQEAgLTE0LDYgKzE0LDggQEAKIAlzdHJ1Y3Qgc2RiX2JyaWRnZSBicmlkZ2U7CiAJc3RydWN0IHNkYl9pbnRlZ3JhdGlvbiBpbnRlZ3I7CiAJc3RydWN0IHNkYl9lbXB0eSBlbXB0eTsKKwlzdHJ1Y3Qgc2RiX3N5bnRoZXNpcyBzeW50aGVzaXM7CisJc3RydWN0IHNkYl9yZXBvX3VybCByZXBvX3VybDsKIH07CiAKIHN0cnVjdCBmbWNfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2ZzbF9pZmMuaCBiL2luY2x1ZGUvbGludXgvZnNsX2lmYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZnNsX2lmYy5oCnJlbmFtZSB0byBpbmNsdWRlL2xpbnV4L2ZzbF9pZmMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oYXJkaXJxLmggYi9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaAppbmRleCAxMmQ1Zjk3Li5jYmE0NDJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaApAQCAtOSw2ICs5LDcgQEAKIAogCiBleHRlcm4gdm9pZCBzeW5jaHJvbml6ZV9pcnEodW5zaWduZWQgaW50IGlycSk7CitleHRlcm4gdm9pZCBzeW5jaHJvbml6ZV9oYXJkaXJxKHVuc2lnbmVkIGludCBpcnEpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfVElOWV9SQ1UpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGlkLXNlbnNvci1pZHMuaCBiL2luY2x1ZGUvbGludXgvaGlkLXNlbnNvci1pZHMuaAppbmRleCBiZWFmOTY1Li41MzcxNjFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hpZC1zZW5zb3ItaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9oaWQtc2Vuc29yLWlkcy5oCkBAIC0zMyw2ICszMywxNiBAQAogI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTElHSFQJCQkJMHgyMDA0ZDAKICNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9MSUdIVF9JTExVTQkJCQkweDIwMDRkMQogCisvKiBQUk9YICgyMDAwMTEpICovCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMTEKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX1BSRVNFTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDRiMAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0hVTUFOX1BSRVNFTkNFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwNGIxCisKKy8qIFByZXNzdXJlICgyMDAwMzEpICovCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJFU1NVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMzEKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0FUTU9TUEhFUklDX1BSRVNTVVJFICAgICAgICAgICAgICAweDIwMDQzMAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0FUTU9TUEhFUklDX1BSRVNTVVJFICAgICAgICAgICAgICAgICAgIDB4MjAwNDMxCisKIC8qIEd5cm8gM0Q6ICgyMDAwNzYpICovCiAjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR1lST18zRAkJCQkweDIwMDA3NgogI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQU5HTF9WRUxPQ0lUWQkJCTB4MjAwNDU2CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hydGltZXIuaCBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCmluZGV4IGQxOWE1YzIuLmU3YThkM2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCkBAIC05NiwxMiArOTYsMTIgQEAKICAqIEBmdW5jdGlvbjoJdGltZXIgZXhwaXJ5IGNhbGxiYWNrIGZ1bmN0aW9uCiAgKiBAYmFzZToJcG9pbnRlciB0byB0aGUgdGltZXIgYmFzZSAocGVyIGNwdSBhbmQgcGVyIGNsb2NrKQogICogQHN0YXRlOglzdGF0ZSBpbmZvcm1hdGlvbiAoU2VlIGJpdCB2YWx1ZXMgYWJvdmUpCisgKiBAc3RhcnRfcGlkOiB0aW1lciBzdGF0aXN0aWNzIGZpZWxkIHRvIHN0b3JlIHRoZSBwaWQgb2YgdGhlIHRhc2sgd2hpY2gKKyAqCQlzdGFydGVkIHRoZSB0aW1lcgogICogQHN0YXJ0X3NpdGU6CXRpbWVyIHN0YXRpc3RpY3MgZmllbGQgdG8gc3RvcmUgdGhlIHNpdGUgd2hlcmUgdGhlIHRpbWVyCiAgKgkJd2FzIHN0YXJ0ZWQKICAqIEBzdGFydF9jb21tOiB0aW1lciBzdGF0aXN0aWNzIGZpZWxkIHRvIHN0b3JlIHRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzIHdoaWNoCiAgKgkJc3RhcnRlZCB0aGUgdGltZXIKLSAqIEBzdGFydF9waWQ6IHRpbWVyIHN0YXRpc3RpY3MgZmllbGQgdG8gc3RvcmUgdGhlIHBpZCBvZiB0aGUgdGFzayB3aGljaAotICoJCXN0YXJ0ZWQgdGhlIHRpbWVyCiAgKgogICogVGhlIGhydGltZXIgc3RydWN0dXJlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYnkgaHJ0aW1lcl9pbml0KCkKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oeXBlcnYuaCBiL2luY2x1ZGUvbGludXgvaHlwZXJ2LmgKaW5kZXggMzQ0ODgzZC4uYWI3MzU5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oeXBlcnYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2h5cGVydi5oCkBAIC0yNSwzMjggKzI1LDExIEBACiAjaWZuZGVmIF9IWVBFUlZfSAogI2RlZmluZSBfSFlQRVJWX0gKIAorI2luY2x1ZGUgPHVhcGkvbGludXgvaHlwZXJ2Lmg+CisKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi0vKgotICogRnJhbWV3b3JrIHZlcnNpb24gZm9yIHV0aWwgc2VydmljZXMuCi0gKi8KLSNkZWZpbmUgVVRJTF9GV19NSU5PUiAgMAotCi0jZGVmaW5lIFVUSUxfV1MySzhfRldfTUFKT1IgIDEKLSNkZWZpbmUgVVRJTF9XUzJLOF9GV19WRVJTSU9OICAgICAoVVRJTF9XUzJLOF9GV19NQUpPUiA8PCAxNiB8IFVUSUxfRldfTUlOT1IpCi0KLSNkZWZpbmUgVVRJTF9GV19NQUpPUiAgMwotI2RlZmluZSBVVElMX0ZXX1ZFUlNJT04gICAgIChVVElMX0ZXX01BSk9SIDw8IDE2IHwgVVRJTF9GV19NSU5PUikKLQotCi0vKgotICogSW1wbGVtZW50YXRpb24gb2YgaG9zdCBjb250cm9sbGVkIHNuYXBzaG90IG9mIHRoZSBndWVzdC4KLSAqLwotCi0jZGVmaW5lIFZTU19PUF9SRUdJU1RFUiAxMjgKLQotZW51bSBodl92c3Nfb3AgewotCVZTU19PUF9DUkVBVEUgPSAwLAotCVZTU19PUF9ERUxFVEUsCi0JVlNTX09QX0hPVF9CQUNLVVAsCi0JVlNTX09QX0dFVF9ETV9JTkZPLAotCVZTU19PUF9CVV9DT01QTEVURSwKLQkvKgotCSAqIEZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCB3aXRoIElDIHZlcnNpb24gPj0gNS4wCi0JICovCi0JVlNTX09QX0ZSRUVaRSwgLyogRnJlZXplIHRoZSBmaWxlIHN5c3RlbXMgaW4gdGhlIFZNICovCi0JVlNTX09QX1RIQVcsIC8qIFVuZnJlZXplIHRoZSBmaWxlIHN5c3RlbXMgKi8KLQlWU1NfT1BfQVVUT19SRUNPVkVSLAotCVZTU19PUF9DT1VOVCAvKiBOdW1iZXIgb2Ygb3BlcmF0aW9ucywgbXVzdCBiZSBsYXN0ICovCi19OwotCi0KLS8qCi0gKiBIZWFkZXIgZm9yIGFsbCBWU1MgbWVzc2FnZXMuCi0gKi8KLXN0cnVjdCBodl92c3NfaGRyIHsKLQlfX3U4IG9wZXJhdGlvbjsKLQlfX3U4IHJlc2VydmVkWzddOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotCi0vKgotICogRmxhZyB2YWx1ZXMgZm9yIHRoZSBodl92c3NfY2hlY2tfZmVhdHVyZS4gTGludXggc3VwcG9ydHMgb25seQotICogb25lIHZhbHVlLgotICovCi0jZGVmaW5lIFZTU19IQlVfTk9fQVVUT19SRUNPVkVSWQkweDAwMDAwMDA1Ci0KLXN0cnVjdCBodl92c3NfY2hlY2tfZmVhdHVyZSB7Ci0JX191MzIgZmxhZ3M7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaHZfdnNzX2NoZWNrX2RtX2luZm8gewotCV9fdTMyIGZsYWdzOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGh2X3Zzc19tc2cgewotCXVuaW9uIHsKLQkJc3RydWN0IGh2X3Zzc19oZHIgdnNzX2hkcjsKLQkJaW50IGVycm9yOwotCX07Ci0JdW5pb24gewotCQlzdHJ1Y3QgaHZfdnNzX2NoZWNrX2ZlYXR1cmUgdnNzX2NmOwotCQlzdHJ1Y3QgaHZfdnNzX2NoZWNrX2RtX2luZm8gZG1faW5mbzsKLQl9OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIEh5cGVyViBrZXkgdmFsdWUgcGFpciAoS1ZQKSBmdW5jdGlvbmFsaXR5IGZvciBMaW51eC4KLSAqCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwLCBOb3ZlbGwsIEluYy4KLSAqIEF1dGhvciA6IEsuIFkuIFNyaW5pdmFzYW4gPGtzcmluaXZhc2FuQG5vdmVsbC5jb20+Ci0gKgotICovCi0KLS8qCi0gKiBNYXhpbXVtIHZhbHVlIHNpemUgLSB1c2VkIGZvciBib3RoIGtleSBuYW1lcyBhbmQgdmFsdWUgZGF0YSwgYW5kIGluY2x1ZGVzCi0gKiBhbnkgYXBwbGljYWJsZSBOVUxMIHRlcm1pbmF0b3JzLgotICoKLSAqIE5vdGU6ICBUaGlzIGxpbWl0IGlzIHNvbWV3aGF0IGFyYml0cmFyeSwgYnV0IGZhbGxzIGVhc2lseSB3aXRoaW4gd2hhdCBpcwotICogc3VwcG9ydGVkIGZvciBhbGwgbmF0aXZlIGd1ZXN0cyAoYmFjayB0byBXaW4gMjAwMCkgYW5kIHdoYXQgaXMgcmVhc29uYWJsZQotICogZm9yIHRoZSBJQyBLVlAgZXhjaGFuZ2UgZnVuY3Rpb25hbGl0eS4gIE5vdGUgdGhhdCBXaW5kb3dzIE1lLzk4Lzk1IGFyZQotICogbGltaXRlZCB0byAyNTUgY2hhcmFjdGVyIGtleSBuYW1lcy4KLSAqCi0gKiBNU0ROIHJlY29tbWVuZHMgbm90IHN0b3JpbmcgZGF0YSB2YWx1ZXMgbGFyZ2VyIHRoYW4gMjA0OCBieXRlcyBpbiB0aGUKLSAqIHJlZ2lzdHJ5LgotICoKLSAqIE5vdGU6ICBUaGlzIHZhbHVlIGlzIHVzZWQgaW4gZGVmaW5pbmcgdGhlIEtWUCBleGNoYW5nZSBtZXNzYWdlIC0gdGhpcyB2YWx1ZQotICogY2Fubm90IGJlIG1vZGlmaWVkIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBtZXNzYWdlIHNpemUgYW5kIGNvbXBhdGliaWxpdHkuCi0gKi8KLQotLyoKLSAqIGJ5dGVzLCBpbmNsdWRpbmcgYW55IG51bGwgdGVybWluYXRvcnMKLSAqLwotI2RlZmluZSBIVl9LVlBfRVhDSEFOR0VfTUFYX1ZBTFVFX1NJWkUgICAgICAgICAgKDIwNDgpCi0KLQotLyoKLSAqIE1heGltdW0ga2V5IHNpemUgLSB0aGUgcmVnaXN0cnkgbGltaXQgZm9yIHRoZSBsZW5ndGggb2YgYW4gZW50cnkgbmFtZQotICogaXMgMjU2IGNoYXJhY3RlcnMsIGluY2x1ZGluZyB0aGUgbnVsbCB0ZXJtaW5hdG9yCi0gKi8KLQotI2RlZmluZSBIVl9LVlBfRVhDSEFOR0VfTUFYX0tFWV9TSVpFICAgICAgICAgICAgKDUxMikKLQotLyoKLSAqIEluIExpbnV4LCB3ZSBpbXBsZW1lbnQgdGhlIEtWUCBmdW5jdGlvbmFsaXR5IGluIHR3byBjb21wb25lbnRzOgotICogMSkgVGhlIGtlcm5lbCBjb21wb25lbnQgd2hpY2ggaXMgcGFja2FnZWQgYXMgcGFydCBvZiB0aGUgaHZfdXRpbHMgZHJpdmVyCi0gKiBpcyByZXNwb25zaWJsZSBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBob3N0IGFuZCByZXNwb25zaWJsZSBmb3IKLSAqIGltcGxlbWVudGluZyB0aGUgaG9zdC9ndWVzdCBwcm90b2NvbC4gMikgQSB1c2VyIGxldmVsIGRhZW1vbiB0aGF0IGlzCi0gKiByZXNwb25zaWJsZSBmb3IgZGF0YSBnYXRoZXJpbmcuCi0gKgotICogSG9zdC9HdWVzdCBQcm90b2NvbDogVGhlIGhvc3QgaXRlcmF0ZXMgb3ZlciBhbiBpbmRleCBhbmQgZXhwZWN0cyB0aGUgZ3Vlc3QKLSAqIHRvIGFzc2lnbiBhIGtleSBuYW1lIHRvIHRoZSBpbmRleCBhbmQgYWxzbyByZXR1cm4gdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8KLSAqIHRoZSBrZXkuIFRoZSBob3N0IHdpbGwgaGF2ZSBhdG1vc3Qgb25lIEtWUCB0cmFuc2FjdGlvbiBvdXRzdGFuZGluZyBhdCBhbnkKLSAqIGdpdmVuIHBvaW50IGluIHRpbWUuIFRoZSBob3N0IHNpZGUgaXRlcmF0aW9uIHN0b3BzIHdoZW4gdGhlIGd1ZXN0IHJldHVybnMKLSAqIGFuIGVycm9yLiBNaWNyb3NvZnQgaGFzIHNwZWNpZmllZCB0aGUgZm9sbG93aW5nIG1hcHBpbmcgb2Yga2V5IG5hbWVzIHRvCi0gKiBob3N0IHNwZWNpZmllZCBpbmRleDoKLSAqCi0gKglJbmRleAkJS2V5IE5hbWUKLSAqCTAJCUZ1bGx5UXVhbGlmaWVkRG9tYWluTmFtZQotICoJMQkJSW50ZWdyYXRpb25TZXJ2aWNlc1ZlcnNpb24KLSAqCTIJCU5ldHdvcmtBZGRyZXNzSVB2NAotICoJMwkJTmV0d29ya0FkZHJlc3NJUHY2Ci0gKgk0CQlPU0J1aWxkTnVtYmVyCi0gKgk1CQlPU05hbWUKLSAqCTYJCU9TTWFqb3JWZXJzaW9uCi0gKgk3CQlPU01pbm9yVmVyc2lvbgotICoJOAkJT1NWZXJzaW9uCi0gKgk5CQlQcm9jZXNzb3JBcmNoaXRlY3R1cmUKLSAqCi0gKiBUaGUgV2luZG93cyBob3N0IGV4cGVjdHMgdGhlIEtleSBOYW1lIGFuZCBLZXkgVmFsdWUgdG8gYmUgZW5jb2RlZCBpbiB1dGYxNi4KLSAqCi0gKiBHdWVzdCBLZXJuZWwvS1ZQIERhZW1vbiBQcm90b2NvbDogQXMgbm90ZWQgZWFybGllciwgd2UgaW1wbGVtZW50IGFsbCBvZiB0aGUKLSAqIGRhdGEgZ2F0aGVyaW5nIGZ1bmN0aW9uYWxpdHkgaW4gYSB1c2VyIG1vZGUgZGFlbW9uLiBUaGUgdXNlciBsZXZlbCBkYWVtb24KLSAqIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGJpbmRpbmcgdGhlIGtleSBuYW1lIHRvIHRoZSBpbmRleCBhcyB3ZWxsLiBUaGUKLSAqIGtlcm5lbCBhbmQgdXNlci1sZXZlbCBkYWVtb24gY29tbXVuaWNhdGUgdXNpbmcgYSBjb25uZWN0b3IgY2hhbm5lbC4KLSAqCi0gKiBUaGUgdXNlciBtb2RlIGNvbXBvbmVudCBmaXJzdCByZWdpc3RlcnMgd2l0aCB0aGUKLSAqIHRoZSBrZXJuZWwgY29tcG9uZW50LiBTdWJzZXF1ZW50bHksIHRoZSBrZXJuZWwgY29tcG9uZW50IHJlcXVlc3RzLCBkYXRhCi0gKiBmb3IgdGhlIHNwZWNpZmllZCBrZXlzLiBJbiByZXNwb25zZSB0byB0aGlzIG1lc3NhZ2UgdGhlIHVzZXIgbW9kZSBjb21wb25lbnQKLSAqIGZpbGxzIGluIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQga2V5LiBXZSBvdmVybG9hZCB0aGUKLSAqIHNlcXVlbmNlIGZpZWxkIGluIHRoZSBjbl9tc2cgaGVhZGVyIHRvIGRlZmluZSBvdXIgS1ZQIG1lc3NhZ2UgdHlwZXMuCi0gKgotICoKLSAqIFRoZSBrZXJuZWwgY29tcG9uZW50IHNpbXBseSBhY3RzIGFzIGEgY29uZHVpdCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZQotICogV2luZG93cyBob3N0IGFuZCB0aGUgdXNlci1sZXZlbCBkYWVtb24uIFRoZSBrZXJuZWwgY29tcG9uZW50IHBhc3NlcyB1cCB0aGUKLSAqIGluZGV4IHJlY2VpdmVkIGZyb20gdGhlIEhvc3QgdG8gdGhlIHVzZXItbGV2ZWwgZGFlbW9uLiBJZiB0aGUgaW5kZXggaXMKLSAqIHZhbGlkIChzdXBwb3J0ZWQpLCB0aGUgY29ycmVzcG9uZGluZyBrZXkgYXMgd2VsbCBhcyBpdHMKLSAqIHZhbHVlIChib3RoIGFyZSBzdHJpbmdzKSBpcyByZXR1cm5lZC4gSWYgdGhlIGluZGV4IGlzIGludmFsaWQKLSAqIChub3Qgc3VwcG9ydGVkKSwgYSBOVUxMIGtleSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0gKi8KLQotCi0vKgotICogUmVnaXN0cnkgdmFsdWUgdHlwZXMuCi0gKi8KLQotI2RlZmluZSBSRUdfU1ogMQotI2RlZmluZSBSRUdfVTMyIDQKLSNkZWZpbmUgUkVHX1U2NCA4Ci0KLS8qCi0gKiBBcyB3ZSBsb29rIGF0IGV4cGFuZGluZyB0aGUgS1ZQIGZ1bmN0aW9uYWxpdHkgdG8gaW5jbHVkZQotICogSVAgaW5qZWN0aW9uIGZ1bmN0aW9uYWxpdHksIHdlIG5lZWQgdG8gbWFpbnRhaW4gYmluYXJ5Ci0gKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgZGFlbW9ucy4KLSAqCi0gKiBUaGUgS1ZQIG9wY29kZXMgYXJlIGRlZmluZWQgYnkgdGhlIGhvc3QgYW5kIGl0IHdhcyB1bmZvcnR1bmF0ZQotICogdGhhdCBJIGNob3NlIHRvIHRyZWF0IHRoZSByZWdpc3RyYXRpb24gb3BlcmF0aW9uIGFzIHBhcnQgb2YgdGhlCi0gKiBLVlAgb3BlcmF0aW9ucyBkZWZpbmVkIGJ5IHRoZSBob3N0LgotICogSGVyZSBpcyB0aGUgbGV2ZWwgb2YgY29tcGF0aWJpbGl0eQotICogKGJldHdlZW4gdGhlIHVzZXIgbGV2ZWwgZGFlbW9uIGFuZCB0aGUga2VybmVsIEtWUCBkcml2ZXIpIHRoYXQgd2UKLSAqIHdpbGwgaW1wbGVtZW50OgotICoKLSAqIEFuIG9sZGVyIGRhZW1vbiB3aWxsIGFsd2F5cyBiZSBzdXBwb3J0ZWQgb24gYSBuZXdlciBkcml2ZXIuCi0gKiBBIGdpdmVuIHVzZXIgbGV2ZWwgZGFlbW9uIHdpbGwgcmVxdWlyZSBhIG1pbmltYWwgdmVyc2lvbiBvZiB0aGUKLSAqIGtlcm5lbCBkcml2ZXIuCi0gKiBJZiB3ZSBjYW5ub3QgaGFuZGxlIHRoZSB2ZXJzaW9uIGRpZmZlcmVuY2VzLCB3ZSB3aWxsIGZhaWwgZ3JhY2VmdWxseQotICogKHRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGhhdmUgYSB1c2VyIGxldmVsIGRhZW1vbiB0aGF0IGlzIG1vcmUKLSAqIGFkdmFuY2VkIHRoYW4gdGhlIEtWUCBkcml2ZXIuCi0gKgotICogV2Ugd2lsbCB1c2UgdmFsdWVzIHVzZWQgaW4gdGhpcyBoYW5kc2hha2UgZm9yIGRldGVybWluaW5nIGlmIHdlIGhhdmUKLSAqIHdvcmthYmxlIHVzZXIgbGV2ZWwgZGFlbW9uIGFuZCB0aGUga2VybmVsIGRyaXZlci4gV2UgYmVnaW4gYnkgdGFraW5nIHRoZQotICogcmVnaXN0cmF0aW9uIG9wY29kZSBvdXQgb2YgdGhlIEtWUCBvcGNvZGUgbmFtZXNwYWNlLiBXZSB3aWxsIGhvd2V2ZXIsCi0gKiBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGV4aXN0aW5nIHVzZXItbGV2ZWwgZGFlbW9uIGNvZGUuCi0gKi8KLQotLyoKLSAqIERhZW1vbiBjb2RlIG5vdCBzdXBwb3J0aW5nIElQIGluamVjdGlvbiAobGVnYWN5IGRhZW1vbikuCi0gKi8KLQotI2RlZmluZSBLVlBfT1BfUkVHSVNURVIJNAotCi0vKgotICogRGFlbW9uIGNvZGUgc3VwcG9ydGluZyBJUCBpbmplY3Rpb24uCi0gKiBUaGUgS1ZQIG9wY29kZSBmaWVsZCBpcyB1c2VkIHRvIGNvbW11bmljYXRlIHRoZQotICogcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uOyBzbyBkZWZpbmUgYSBuYW1lc3BhY2UgdGhhdAotICogd2lsbCBiZSBkaXN0aW5jdCBmcm9tIHRoZSBob3N0IGRlZmluZWQgS1ZQIG9wY29kZS4KLSAqLwotCi0jZGVmaW5lIEtWUF9PUF9SRUdJU1RFUjEgMTAwCi0KLWVudW0gaHZfa3ZwX2V4Y2hnX29wIHsKLQlLVlBfT1BfR0VUID0gMCwKLQlLVlBfT1BfU0VULAotCUtWUF9PUF9ERUxFVEUsCi0JS1ZQX09QX0VOVU1FUkFURSwKLQlLVlBfT1BfR0VUX0lQX0lORk8sCi0JS1ZQX09QX1NFVF9JUF9JTkZPLAotCUtWUF9PUF9DT1VOVCAvKiBOdW1iZXIgb2Ygb3BlcmF0aW9ucywgbXVzdCBiZSBsYXN0LiAqLwotfTsKLQotZW51bSBodl9rdnBfZXhjaGdfcG9vbCB7Ci0JS1ZQX1BPT0xfRVhURVJOQUwgPSAwLAotCUtWUF9QT09MX0dVRVNULAotCUtWUF9QT09MX0FVVE8sCi0JS1ZQX1BPT0xfQVVUT19FWFRFUk5BTCwKLQlLVlBfUE9PTF9BVVRPX0lOVEVSTkFMLAotCUtWUF9QT09MX0NPVU5UIC8qIE51bWJlciBvZiBwb29scywgbXVzdCBiZSBsYXN0LiAqLwotfTsKLQotLyoKLSAqIFNvbWUgSHlwZXItViBzdGF0dXMgY29kZXMuCi0gKi8KLQotI2RlZmluZSBIVl9TX09LCQkJCTB4MDAwMDAwMDAKLSNkZWZpbmUgSFZfRV9GQUlMCQkJMHg4MDAwNDAwNQotI2RlZmluZSBIVl9TX0NPTlQJCQkweDgwMDcwMTAzCi0jZGVmaW5lIEhWX0VSUk9SX05PVF9TVVBQT1JURUQJCTB4ODAwNzAwMzIKLSNkZWZpbmUgSFZfRVJST1JfTUFDSElORV9MT0NLRUQJCTB4ODAwNzA0RjcKLSNkZWZpbmUgSFZfRVJST1JfREVWSUNFX05PVF9DT05ORUNURUQJMHg4MDA3MDQ4RgotI2RlZmluZSBIVl9JTlZBTElEQVJHCQkJMHg4MDA3MDA1NwotI2RlZmluZSBIVl9HVUlEX05PVEZPVU5ECQkweDgwMDQxMDAyCi0KLSNkZWZpbmUgQUREUl9GQU1JTFlfTk9ORQkweDAwCi0jZGVmaW5lIEFERFJfRkFNSUxZX0lQVjQJMHgwMQotI2RlZmluZSBBRERSX0ZBTUlMWV9JUFY2CTB4MDIKLQotI2RlZmluZSBNQVhfQURBUFRFUl9JRF9TSVpFCTEyOAotI2RlZmluZSBNQVhfSVBfQUREUl9TSVpFCTEwMjQKLSNkZWZpbmUgTUFYX0dBVEVXQVlfU0laRQk1MTIKLQotCi1zdHJ1Y3QgaHZfa3ZwX2lwYWRkcl92YWx1ZSB7Ci0JX191MTYJYWRhcHRlcl9pZFtNQVhfQURBUFRFUl9JRF9TSVpFXTsKLQlfX3U4CWFkZHJfZmFtaWx5OwotCV9fdTgJZGhjcF9lbmFibGVkOwotCV9fdTE2CWlwX2FkZHJbTUFYX0lQX0FERFJfU0laRV07Ci0JX191MTYJc3ViX25ldFtNQVhfSVBfQUREUl9TSVpFXTsKLQlfX3UxNglnYXRlX3dheVtNQVhfR0FURVdBWV9TSVpFXTsKLQlfX3UxNglkbnNfYWRkcltNQVhfSVBfQUREUl9TSVpFXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLQotc3RydWN0IGh2X2t2cF9oZHIgewotCV9fdTggb3BlcmF0aW9uOwotCV9fdTggcG9vbDsKLQlfX3UxNiBwYWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaHZfa3ZwX2V4Y2hnX21zZ192YWx1ZSB7Ci0JX191MzIgdmFsdWVfdHlwZTsKLQlfX3UzMiBrZXlfc2l6ZTsKLQlfX3UzMiB2YWx1ZV9zaXplOwotCV9fdTgga2V5W0hWX0tWUF9FWENIQU5HRV9NQVhfS0VZX1NJWkVdOwotCXVuaW9uIHsKLQkJX191OCB2YWx1ZVtIVl9LVlBfRVhDSEFOR0VfTUFYX1ZBTFVFX1NJWkVdOwotCQlfX3UzMiB2YWx1ZV91MzI7Ci0JCV9fdTY0IHZhbHVlX3U2NDsKLQl9OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGh2X2t2cF9tc2dfZW51bWVyYXRlIHsKLQlfX3UzMiBpbmRleDsKLQlzdHJ1Y3QgaHZfa3ZwX2V4Y2hnX21zZ192YWx1ZSBkYXRhOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGh2X2t2cF9tc2dfZ2V0IHsKLQlzdHJ1Y3QgaHZfa3ZwX2V4Y2hnX21zZ192YWx1ZSBkYXRhOwotfTsKLQotc3RydWN0IGh2X2t2cF9tc2dfc2V0IHsKLQlzdHJ1Y3QgaHZfa3ZwX2V4Y2hnX21zZ192YWx1ZSBkYXRhOwotfTsKLQotc3RydWN0IGh2X2t2cF9tc2dfZGVsZXRlIHsKLQlfX3UzMiBrZXlfc2l6ZTsKLQlfX3U4IGtleVtIVl9LVlBfRVhDSEFOR0VfTUFYX0tFWV9TSVpFXTsKLX07Ci0KLXN0cnVjdCBodl9rdnBfcmVnaXN0ZXIgewotCV9fdTggdmVyc2lvbltIVl9LVlBfRVhDSEFOR0VfTUFYX0tFWV9TSVpFXTsKLX07Ci0KLXN0cnVjdCBodl9rdnBfbXNnIHsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBodl9rdnBfaGRyCWt2cF9oZHI7Ci0JCWludCBlcnJvcjsKLQl9OwotCXVuaW9uIHsKLQkJc3RydWN0IGh2X2t2cF9tc2dfZ2V0CQlrdnBfZ2V0OwotCQlzdHJ1Y3QgaHZfa3ZwX21zZ19zZXQJCWt2cF9zZXQ7Ci0JCXN0cnVjdCBodl9rdnBfbXNnX2RlbGV0ZQlrdnBfZGVsZXRlOwotCQlzdHJ1Y3QgaHZfa3ZwX21zZ19lbnVtZXJhdGUJa3ZwX2VudW1fZGF0YTsKLQkJc3RydWN0IGh2X2t2cF9pcGFkZHJfdmFsdWUgICAgICBrdnBfaXBfdmFsOwotCQlzdHJ1Y3QgaHZfa3ZwX3JlZ2lzdGVyCQlrdnBfcmVnaXN0ZXI7Ci0JfSBib2R5OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGh2X2t2cF9pcF9tc2cgewotCV9fdTggb3BlcmF0aW9uOwotCV9fdTggcG9vbDsKLQlzdHJ1Y3QgaHZfa3ZwX2lwYWRkcl92YWx1ZSAgICAgIGt2cF9pcF92YWw7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KQEAgLTM1NCw3ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CiAKIAotI2RlZmluZSBNQVhfUEFHRV9CVUZGRVJfQ09VTlQJCQkJMTkKKyNkZWZpbmUgTUFYX1BBR0VfQlVGRkVSX0NPVU5UCQkJCTMyCiAjZGVmaW5lIE1BWF9NVUxUSVBBR0VfQlVGRkVSX0NPVU5UCQkJMzIgLyogMTI4SyAqLwogCiAjcHJhZ21hIHBhY2socHVzaCwgMSkKQEAgLTEwNDMsNiArNzI2LDEwIEBACiAJICogVGhpcyB3aWxsIGJlIE5VTEwgZm9yIHRoZSBwcmltYXJ5IGNoYW5uZWwuCiAJICovCiAJc3RydWN0IHZtYnVzX2NoYW5uZWwgKnByaW1hcnlfY2hhbm5lbDsKKwkvKgorCSAqIFN1cHBvcnQgcGVyLWNoYW5uZWwgc3RhdGUgZm9yIHVzZSBieSB2bWJ1cyBkcml2ZXJzLgorCSAqLworCXZvaWQgKnBlcl9jaGFubmVsX3N0YXRlOwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIHNldF9jaGFubmVsX3JlYWRfc3RhdGUoc3RydWN0IHZtYnVzX2NoYW5uZWwgKmMsIGJvb2wgc3RhdGUpCkBAIC0xMDUwLDYgKzczNywxNiBAQAogCWMtPmJhdGNoZWRfcmVhZGluZyA9IHN0YXRlOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3Blcl9jaGFubmVsX3N0YXRlKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjLCB2b2lkICpzKQoreworCWMtPnBlcl9jaGFubmVsX3N0YXRlID0gczsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpnZXRfcGVyX2NoYW5uZWxfc3RhdGUoc3RydWN0IHZtYnVzX2NoYW5uZWwgKmMpCit7CisJcmV0dXJuIGMtPnBlcl9jaGFubmVsX3N0YXRlOworfQorCiB2b2lkIHZtYnVzX29ubWVzc2FnZSh2b2lkICpjb250ZXh0KTsKIAogaW50IHZtYnVzX3JlcXVlc3Rfb2ZmZXJzKHZvaWQpOwpAQCAtMTExOCw3ICs4MTUsNyBAQAogZXh0ZXJuIHZvaWQgdm1idXNfY2xvc2Uoc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwpOwogCiBleHRlcm4gaW50IHZtYnVzX3NlbmRwYWNrZXQoc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwsCi0JCQkJICBjb25zdCB2b2lkICpidWZmZXIsCisJCQkJICB2b2lkICpidWZmZXIsCiAJCQkJICB1MzIgYnVmZmVyTGVuLAogCQkJCSAgdTY0IHJlcXVlc3RpZCwKIAkJCQkgIGVudW0gdm1idXNfcGFja2V0X3R5cGUgdHlwZSwKQEAgLTEzNTIsNiArMTA0OSwxNyBAQAogCQl9CiAKIC8qCisgKiBHdWVzdCBGaWxlIENvcHkgU2VydmljZQorICogezM0RDE0QkUzLURFRTQtNDFjOC05QUU3LTZCMTc0OTc3QzE5Mn0KKyAqLworCisjZGVmaW5lIEhWX0ZDT1BZX0dVSUQgXAorCS5ndWlkID0geyBcCisJCQkweEUzLCAweDRCLCAweEQxLCAweDM0LCAweEU0LCAweERFLCAweEM4LCAweDQxLCBcCisJCQkweDlBLCAweEU3LCAweDZCLCAweDE3LCAweDQ5LCAweDc3LCAweEMxLCAweDkyIFwKKwkJfQorCisvKgogICogQ29tbW9uIGhlYWRlciBmb3IgSHlwZXItViBJQ3MKICAqLwogCkBAIC0xNDU5LDExICsxMTY3LDEyIEBACiB2b2lkIGh2X3Zzc19kZWluaXQodm9pZCk7CiB2b2lkIGh2X3Zzc19vbmNoYW5uZWxjYWxsYmFjayh2b2lkICopOwogCitleHRlcm4gc3RydWN0IHJlc291cmNlIGh5cGVydl9tbWlvOworCiAvKgogICogTmVnb3RpYXRlZCB2ZXJzaW9uIHdpdGggdGhlIEhvc3QuCiAgKi8KIAogZXh0ZXJuIF9fdTMyIHZtYnVzX3Byb3RvX3ZlcnNpb247CiAKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0hZUEVSVl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lkci5oIGIvaW5jbHVkZS9saW51eC9pZHIuaAppbmRleCA4NzFhMjEzLi45Yzk1ZDIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lkci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWRyLmgKQEAgLTg1LDYgKzg1LDcgQEAKIHZvaWQgaWRyX2ZyZWUoc3RydWN0IGlkciAqaWRwLCBpbnQgaWQpOwogdm9pZCBpZHJfZGVzdHJveShzdHJ1Y3QgaWRyICppZHApOwogdm9pZCBpZHJfaW5pdChzdHJ1Y3QgaWRyICppZHApOworYm9vbCBpZHJfaXNfZW1wdHkoc3RydWN0IGlkciAqaWRwKTsKIAogLyoqCiAgKiBpZHJfcHJlbG9hZF9lbmQgLSBlbmQgcHJlbG9hZCBzZWN0aW9uIHN0YXJ0ZWQgd2l0aCBpZHJfcHJlbG9hZCgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lpby9paW8uaCBiL2luY2x1ZGUvbGludXgvaWlvL2lpby5oCmluZGV4IDc1YThhMjAuLjVmMmQwMGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWlvL2lpby5oCisrKyBiL2luY2x1ZGUvbGludXgvaWlvL2lpby5oCkBAIC0yNTQsMTIgKzI1NCwxNiBAQAogCQkoY2hhbi0+aW5mb19tYXNrX3NoYXJlZF9ieV9hbGwgJiBCSVQodHlwZSkpOwogfQogCi0jZGVmaW5lIElJT19TVChzaSwgcmIsIHNiLCBzaCkJCQkJCQlcCi0JeyAuc2lnbiA9IHNpLCAucmVhbGJpdHMgPSByYiwgLnN0b3JhZ2ViaXRzID0gc2IsIC5zaGlmdCA9IHNoIH0KLQotI2RlZmluZSBJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUChfc2kpCQkJCQlcCi0JeyAudHlwZSA9IElJT19USU1FU1RBTVAsIC5jaGFubmVsID0gLTEsCQkJCVwKLQkJCS5zY2FuX2luZGV4ID0gX3NpLCAuc2Nhbl90eXBlID0gSUlPX1NUKCdzJywgNjQsIDY0LCAwKSB9CisjZGVmaW5lIElJT19DSEFOX1NPRlRfVElNRVNUQU1QKF9zaSkgewkJCQkJXAorCS50eXBlID0gSUlPX1RJTUVTVEFNUCwJCQkJCQlcCisJLmNoYW5uZWwgPSAtMSwJCQkJCQkJXAorCS5zY2FuX2luZGV4ID0gX3NpLAkJCQkJCVwKKwkuc2Nhbl90eXBlID0gewkJCQkJCQlcCisJCS5zaWduID0gJ3MnLAkJCQkJCVwKKwkJLnJlYWxiaXRzID0gNjQsCQkJCQlcCisJCS5zdG9yYWdlYml0cyA9IDY0LAkJCQkJXAorCQl9LAkJCQkJCQlcCit9CiAKIC8qKgogICogaWlvX2dldF90aW1lX25zKCkgLSB1dGlsaXR5IGZ1bmN0aW9uIHRvIGdldCBhIHRpbWUgc3RhbXAgZm9yIGV2ZW50cyBldGMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmggYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCmluZGV4IGEyNjc4ZDMuLmM3YmZhYzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaApAQCAtMTg4LDYgKzE4OCw3IEBACiBleHRlcm4gdm9pZCBkaXNhYmxlX3BlcmNwdV9pcnEodW5zaWduZWQgaW50IGlycSk7CiBleHRlcm4gdm9pZCBlbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpOwogZXh0ZXJuIHZvaWQgZW5hYmxlX3BlcmNwdV9pcnEodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpOworZXh0ZXJuIHZvaWQgaXJxX3dha2VfdGhyZWFkKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiAKIC8qIFRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGFyZSBmb3IgdGhlIGNvcmUga2VybmVsIHVzZSBvbmx5LiAqLwogZXh0ZXJuIHZvaWQgc3VzcGVuZF9kZXZpY2VfaXJxcyh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW9wb3J0LmggYi9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oCmluZGV4IDg5YjdjMjQuLjVlM2E5MDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW9wb3J0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pb3BvcnQuaApAQCAtNTEsNyArNTEsNyBAQAogCiAjZGVmaW5lIElPUkVTT1VSQ0VfRVhDTFVTSVZFCTB4MDgwMDAwMDAJLyogVXNlcmxhbmQgbWF5IG5vdCBtYXAgdGhpcyByZXNvdXJjZSAqLwogI2RlZmluZSBJT1JFU09VUkNFX0RJU0FCTEVECTB4MTAwMDAwMDAKLSNkZWZpbmUgSU9SRVNPVVJDRV9VTlNFVAkweDIwMDAwMDAwCisjZGVmaW5lIElPUkVTT1VSQ0VfVU5TRVQJMHgyMDAwMDAwMAkvKiBObyBhZGRyZXNzIGFzc2lnbmVkIHlldCAqLwogI2RlZmluZSBJT1JFU09VUkNFX0FVVE8JCTB4NDAwMDAwMDAKICNkZWZpbmUgSU9SRVNPVVJDRV9CVVNZCQkweDgwMDAwMDAwCS8qIERyaXZlciBoYXMgbWFya2VkIHRoaXMgcmVzb3VyY2UgYnVzeSAqLwogCkBAIC0xNjksNiArMTY5LDE2IEBACiB7CiAJcmV0dXJuIHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX1RZUEVfQklUUzsKIH0KKy8qIFRydWUgaWZmIHIxIGNvbXBsZXRlbHkgY29udGFpbnMgcjIgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCByZXNvdXJjZV9jb250YWlucyhzdHJ1Y3QgcmVzb3VyY2UgKnIxLCBzdHJ1Y3QgcmVzb3VyY2UgKnIyKQoreworCWlmIChyZXNvdXJjZV90eXBlKHIxKSAhPSByZXNvdXJjZV90eXBlKHIyKSkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChyMS0+ZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUIHx8IHIyLT5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpCisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gcjEtPnN0YXJ0IDw9IHIyLT5zdGFydCAmJiByMS0+ZW5kID49IHIyLT5lbmQ7Cit9CisKIAogLyogQ29udmVuaWVuY2Ugc2hvcnRoYW5kIHdpdGggYWxsb2NhdGlvbiAqLwogI2RlZmluZSByZXF1ZXN0X3JlZ2lvbihzdGFydCxuLG5hbWUpCQlfX3JlcXVlc3RfcmVnaW9uKCZpb3BvcnRfcmVzb3VyY2UsIChzdGFydCksIChuKSwgKG5hbWUpLCAwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnEuaCBiL2luY2x1ZGUvbGludXgvaXJxLmgKaW5kZXggN2RjMTAwMy4uZDI3ODgzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycS5oCkBAIC0zMDMsNiArMzAzLDEwIEBACiAgKiBAaXJxX3BtX3NodXRkb3duOglmdW5jdGlvbiBjYWxsZWQgZnJvbSBjb3JlIGNvZGUgb24gc2h1dGRvd24gb25jZSBwZXIgY2hpcAogICogQGlycV9jYWxjX21hc2s6CU9wdGlvbmFsIGZ1bmN0aW9uIHRvIHNldCBpcnFfZGF0YS5tYXNrIGZvciBzcGVjaWFsIGNhc2VzCiAgKiBAaXJxX3ByaW50X2NoaXA6CW9wdGlvbmFsIHRvIHByaW50IHNwZWNpYWwgY2hpcCBpbmZvIGluIHNob3dfaW50ZXJydXB0cworICogQGlycV9yZXF1ZXN0X3Jlc291cmNlczoJb3B0aW9uYWwgdG8gcmVxdWVzdCByZXNvdXJjZXMgYmVmb3JlIGNhbGxpbmcKKyAqCQkJCWFueSBvdGhlciBjYWxsYmFjayByZWxhdGVkIHRvIHRoaXMgaXJxCisgKiBAaXJxX3JlbGVhc2VfcmVzb3VyY2VzOglvcHRpb25hbCB0byByZWxlYXNlIHJlc291cmNlcyBhY3F1aXJlZCB3aXRoCisgKgkJCQlpcnFfcmVxdWVzdF9yZXNvdXJjZXMKICAqIEBmbGFnczoJCWNoaXAgc3BlY2lmaWMgZmxhZ3MKICAqLwogc3RydWN0IGlycV9jaGlwIHsKQEAgLTMzNiw2ICszNDAsOCBAQAogCXZvaWQJCSgqaXJxX2NhbGNfbWFzaykoc3RydWN0IGlycV9kYXRhICpkYXRhKTsKIAogCXZvaWQJCSgqaXJxX3ByaW50X2NoaXApKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgc3RydWN0IHNlcV9maWxlICpwKTsKKwlpbnQJCSgqaXJxX3JlcXVlc3RfcmVzb3VyY2VzKShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpOworCXZvaWQJCSgqaXJxX3JlbGVhc2VfcmVzb3VyY2VzKShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpOwogCiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIH07CkBAIC0zNDksNiArMzU1LDggQEAKICAqIElSUUNISVBfT05PRkZMSU5FX0VOQUJMRUQ6CU9ubHkgY2FsbCBpcnFfb24vb2ZmX2xpbmUgY2FsbGJhY2tzCiAgKgkJCQl3aGVuIGlycSBlbmFibGVkCiAgKiBJUlFDSElQX1NLSVBfU0VUX1dBS0U6CVNraXAgY2hpcC5pcnFfc2V0X3dha2UoKSwgZm9yIHRoaXMgaXJxIGNoaXAKKyAqIElSUUNISVBfT05FU0hPVF9TQUZFOglPbmUgc2hvdCBkb2VzIG5vdCByZXF1aXJlIG1hc2svdW5tYXNrCisgKiBJUlFDSElQX0VPSV9USFJFQURFRDoJQ2hpcCByZXF1aXJlcyBlb2koKSBvbiB1bm1hc2sgaW4gdGhyZWFkZWQgbW9kZQogICovCiBlbnVtIHsKIAlJUlFDSElQX1NFVF9UWVBFX01BU0tFRAkJPSAoMSA8PCAgMCksCkBAIC0zNTcsNiArMzY1LDcgQEAKIAlJUlFDSElQX09OT0ZGTElORV9FTkFCTEVECT0gKDEgPDwgIDMpLAogCUlSUUNISVBfU0tJUF9TRVRfV0FLRQkJPSAoMSA8PCAgNCksCiAJSVJRQ0hJUF9PTkVTSE9UX1NBRkUJCT0gKDEgPDwgIDUpLAorCUlSUUNISVBfRU9JX1RIUkVBREVECQk9ICgxIDw8ICA2KSwKIH07CiAKIC8qIFRoaXMgaW5jbHVkZSB3aWxsIGdvIGF3YXkgb25jZSB3ZSBpc29sYXRlZCBpcnFfZGVzYyB1c2FnZSB0byBjb3JlIGNvZGUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsX3N0YXQuaCBiL2luY2x1ZGUvbGludXgva2VybmVsX3N0YXQuaAppbmRleCA1MWM3MmJlLi5lY2JjNTJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tlcm5lbF9zdGF0LmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZWxfc3RhdC5oCkBAIC05LDcgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdnRpbWUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2NwdXRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHV0aW1lLmg+CiAKIC8qCiAgKiAna2VybmVsX3N0YXQuaCcgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIG5lZWRlZCBmb3IgZG9pbmcKQEAgLTUxLDE0ICs1MSw4IEBACiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgbnJfY29udGV4dF9zd2l0Y2hlcyh2b2lkKTsKIAotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogZXh0ZXJuIHVuc2lnbmVkIGludCBrc3RhdF9pcnFzX2NwdSh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgY3B1KTsKLQotI2RlZmluZSBrc3RhdF9pbmNyX2lycXNfdGhpc19jcHUoaXJxbm8sIERFU0MpCQlcCi1kbyB7CQkJCQkJCVwKLQlfX3RoaXNfY3B1X2luYygqKERFU0MpLT5rc3RhdF9pcnFzKTsJCVwKLQlfX3RoaXNfY3B1X2luYyhrc3RhdC5pcnFzX3N1bSk7CQkJXAotfSB3aGlsZSAoMCkKK2V4dGVybiB2b2lkIGtzdGF0X2luY3JfaXJxX3RoaXNfY3B1KHVuc2lnbmVkIGludCBpcnEpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQga3N0YXRfaW5jcl9zb2Z0aXJxc190aGlzX2NwdSh1bnNpZ25lZCBpbnQgaXJxKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZnMuaCBiL2luY2x1ZGUvbGludXgva2VybmZzLmgKaW5kZXggZDI2NzYyMy4uYjAxMjJkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXJuZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5mcy5oCkBAIC0xNSw3ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgogI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAKIHN0cnVjdCBmaWxlOwogc3RydWN0IGRlbnRyeTsKQEAgLTM1LDE2ICszNSwyMiBAQAogfTsKIAogI2RlZmluZSBLRVJORlNfVFlQRV9NQVNLCTB4MDAwZgotI2RlZmluZSBLRVJORlNfQUNUSVZFX1JFRglLRVJORlNfRklMRQogI2RlZmluZSBLRVJORlNfRkxBR19NQVNLCX5LRVJORlNfVFlQRV9NQVNLCiAKIGVudW0ga2VybmZzX25vZGVfZmxhZyB7Ci0JS0VSTkZTX1JFTU9WRUQJCT0gMHgwMDEwLAorCUtFUk5GU19BQ1RJVkFURUQJPSAweDAwMTAsCiAJS0VSTkZTX05TCQk9IDB4MDAyMCwKIAlLRVJORlNfSEFTX1NFUV9TSE9XCT0gMHgwMDQwLAogCUtFUk5GU19IQVNfTU1BUAkJPSAweDAwODAsCiAJS0VSTkZTX0xPQ0tERVAJCT0gMHgwMTAwLAogCUtFUk5GU19TVEFUSUNfTkFNRQk9IDB4MDIwMCwKKwlLRVJORlNfU1VJQ0lEQUwJCT0gMHgwNDAwLAorCUtFUk5GU19TVUlDSURFRAkJPSAweDA4MDAsCit9OworCisvKiBAZmxhZ3MgZm9yIGtlcm5mc19jcmVhdGVfcm9vdCgpICovCitlbnVtIGtlcm5mc19yb290X2ZsYWcgeworCUtFUk5GU19ST09UX0NSRUFURV9ERUFDVElWQVRFRCA9IDB4MDAwMSwKIH07CiAKIC8qIHR5cGUtc3BlY2lmaWMgc3RydWN0dXJlcyBmb3Iga2VybmZzX25vZGUgdW5pb24gbWVtYmVycyAqLwpAQCAtODUsMTcgKzkxLDE3IEBACiAjaWZkZWYgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MKIAlzdHJ1Y3QgbG9ja2RlcF9tYXAJZGVwX21hcDsKICNlbmRpZgotCS8qIHRoZSBmb2xsb3dpbmcgdHdvIGZpZWxkcyBhcmUgcHVibGlzaGVkICovCisJLyoKKwkgKiBVc2Uga2VybmZzX2dldF9wYXJlbnQoKSBhbmQga2VybmZzX25hbWUvcGF0aCgpIGluc3RlYWQgb2YKKwkgKiBhY2Nlc3NpbmcgdGhlIGZvbGxvd2luZyB0d28gZmllbGRzIGRpcmVjdGx5LiAgSWYgdGhlIG5vZGUgaXMKKwkgKiBuZXZlciBtb3ZlZCB0byBhIGRpZmZlcmVudCBwYXJlbnQsIGl0IGlzIHNhZmUgdG8gYWNjZXNzIHRoZQorCSAqIHBhcmVudCBkaXJlY3RseS4KKwkgKi8KIAlzdHJ1Y3Qga2VybmZzX25vZGUJKnBhcmVudDsKIAljb25zdCBjaGFyCQkqbmFtZTsKIAogCXN0cnVjdCByYl9ub2RlCQlyYjsKIAotCXVuaW9uIHsKLQkJc3RydWN0IGNvbXBsZXRpb24JKmNvbXBsZXRpb247Ci0JCXN0cnVjdCBrZXJuZnNfbm9kZQkqcmVtb3ZlZF9saXN0OwotCX0gdTsKLQogCWNvbnN0IHZvaWQJCSpuczsJLyogbmFtZXNwYWNlIHRhZyAqLwogCXVuc2lnbmVkIGludAkJaGFzaDsJLyogbnMgKyBuYW1lIGhhc2ggKi8KIAl1bmlvbiB7CkBAIC0xMTMsMTIgKzExOSwxNiBAQAogfTsKIAogLyoKLSAqIGtlcm5mc19kaXJfb3BzIG1heSBiZSBzcGVjaWZpZWQgb24ga2VybmZzX2NyZWF0ZV9yb290KCkgdG8gc3VwcG9ydAotICogZGlyZWN0b3J5IG1hbmlwdWxhdGlvbiBzeXNjYWxscy4gIFRoZXNlIG9wdGlvbmFsIGNhbGxiYWNrcyBhcmUgaW52b2tlZAotICogb24gdGhlIG1hdGNoaW5nIHN5c2NhbGxzIGFuZCBjYW4gcGVyZm9ybSBhbnkga2VybmZzIG9wZXJhdGlvbnMgd2hpY2gKLSAqIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgdG8gYmUgdGhlIGV4YWN0IG9wZXJhdGlvbiByZXF1ZXN0ZWQuCisgKiBrZXJuZnNfc3lzY2FsbF9vcHMgbWF5IGJlIHNwZWNpZmllZCBvbiBrZXJuZnNfY3JlYXRlX3Jvb3QoKSB0byBzdXBwb3J0CisgKiBzeXNjYWxscy4gIFRoZXNlIG9wdGlvbmFsIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBvbiB0aGUgbWF0Y2hpbmcgc3lzY2FsbHMKKyAqIGFuZCBjYW4gcGVyZm9ybSBhbnkga2VybmZzIG9wZXJhdGlvbnMgd2hpY2ggZG9uJ3QgbmVjZXNzYXJpbHkgaGF2ZSB0byBiZQorICogdGhlIGV4YWN0IG9wZXJhdGlvbiByZXF1ZXN0ZWQuICBBbiBhY3RpdmUgcmVmZXJlbmNlIGlzIGhlbGQgZm9yIGVhY2gKKyAqIGtlcm5mc19ub2RlIHBhcmFtZXRlci4KICAqLwotc3RydWN0IGtlcm5mc19kaXJfb3BzIHsKK3N0cnVjdCBrZXJuZnNfc3lzY2FsbF9vcHMgeworCWludCAoKnJlbW91bnRfZnMpKHN0cnVjdCBrZXJuZnNfcm9vdCAqcm9vdCwgaW50ICpmbGFncywgY2hhciAqZGF0YSk7CisJaW50ICgqc2hvd19vcHRpb25zKShzdHJ1Y3Qgc2VxX2ZpbGUgKnNmLCBzdHJ1Y3Qga2VybmZzX3Jvb3QgKnJvb3QpOworCiAJaW50ICgqbWtkaXIpKHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLAogCQkgICAgIHVtb2RlX3QgbW9kZSk7CiAJaW50ICgqcm1kaXIpKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pOwpAQCAtMTI5LDIyICsxMzksMjYgQEAKIHN0cnVjdCBrZXJuZnNfcm9vdCB7CiAJLyogcHVibGlzaGVkIGZpZWxkcyAqLwogCXN0cnVjdCBrZXJuZnNfbm9kZQkqa247CisJdW5zaWduZWQgaW50CQlmbGFnczsJLyogS0VSTkZTX1JPT1RfKiBmbGFncyAqLwogCiAJLyogcHJpdmF0ZSBmaWVsZHMsIGRvIG5vdCB1c2Ugb3V0c2lkZSBrZXJuZnMgcHJvcGVyICovCiAJc3RydWN0IGlkYQkJaW5vX2lkYTsKLQlzdHJ1Y3Qga2VybmZzX2Rpcl9vcHMJKmRpcl9vcHM7CisJc3RydWN0IGtlcm5mc19zeXNjYWxsX29wcyAqc3lzY2FsbF9vcHM7CisJd2FpdF9xdWV1ZV9oZWFkX3QJZGVhY3RpdmF0ZV93YWl0cTsKIH07CiAKIHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlIHsKIAkvKiBwdWJsaXNoZWQgZmllbGRzICovCiAJc3RydWN0IGtlcm5mc19ub2RlCSprbjsKIAlzdHJ1Y3QgZmlsZQkJKmZpbGU7CisJdm9pZAkJCSpwcml2OwogCiAJLyogcHJpdmF0ZSBmaWVsZHMsIGRvIG5vdCB1c2Ugb3V0c2lkZSBrZXJuZnMgcHJvcGVyICovCiAJc3RydWN0IG11dGV4CQltdXRleDsKIAlpbnQJCQlldmVudDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CiAKKwlzaXplX3QJCQlhdG9taWNfd3JpdGVfbGVuOwogCWJvb2wJCQltbWFwcGVkOwogCWNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCAqdm1fb3BzOwogfTsKQEAgLTE3MSw5ICsxODUsMTMgQEAKIAkJCWxvZmZfdCBvZmYpOwogCiAJLyoKLQkgKiB3cml0ZSgpIGlzIGJvdW5jZWQgdGhyb3VnaCBrZXJuZWwgYnVmZmVyIGFuZCBhIHdyaXRlIGxhcmdlciB0aGFuCi0JICogUEFHRV9TSVpFIHJlc3VsdHMgaW4gcGFydGlhbCBvcGVyYXRpb24gb2YgUEFHRV9TSVpFLgorCSAqIHdyaXRlKCkgaXMgYm91bmNlZCB0aHJvdWdoIGtlcm5lbCBidWZmZXIuICBJZiBhdG9taWNfd3JpdGVfbGVuCisJICogaXMgbm90IHNldCwgYSB3cml0ZSBsYXJnZXIgdGhhbiBQQUdFX1NJWkUgcmVzdWx0cyBpbiBwYXJ0aWFsCisJICogb3BlcmF0aW9ucyBvZiBQQUdFX1NJWkUgY2h1bmtzLiAgSWYgYXRvbWljX3dyaXRlX2xlbiBpcyBzZXQsCisJICogd3JpdGVzIHVwdG8gdGhlIHNwZWNpZmllZCBzaXplIGFyZSBleGVjdXRlZCBhdG9taWNhbGx5IGJ1dAorCSAqIGxhcmdlciBvbmVzIGFyZSByZWplY3RlZCB3aXRoIC1FMkJJRy4KIAkgKi8KKwlzaXplX3QgYXRvbWljX3dyaXRlX2xlbjsKIAlzc2l6ZV90ICgqd3JpdGUpKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqYnVmLCBzaXplX3QgYnl0ZXMsCiAJCQkgbG9mZl90IG9mZik7CiAKQEAgLTE4NCw3ICsyMDIsNyBAQAogI2VuZGlmCiB9OwogCi0jaWZkZWYgQ09ORklHX1NZU0ZTCisjaWZkZWYgQ09ORklHX0tFUk5GUwogCiBzdGF0aWMgaW5saW5lIGVudW0ga2VybmZzX25vZGVfdHlwZSBrZXJuZnNfdHlwZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQogewpAQCAtMjE3LDEzICsyMzUsMjIgQEAKIAlyZXR1cm4ga24tPmZsYWdzICYgS0VSTkZTX05TOwogfQogCitpbnQga2VybmZzX25hbWUoc3RydWN0IGtlcm5mc19ub2RlICprbiwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKTsKK2NoYXIgKiBfX211c3RfY2hlY2sga2VybmZzX3BhdGgoc3RydWN0IGtlcm5mc19ub2RlICprbiwgY2hhciAqYnVmLAorCQkJCXNpemVfdCBidWZsZW4pOwordm9pZCBwcl9jb250X2tlcm5mc19uYW1lKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pOwordm9pZCBwcl9jb250X2tlcm5mc19wYXRoKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pOworc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZ2V0X3BhcmVudChzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKTsKIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2ZpbmRfYW5kX2dldF9ucyhzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwKIAkJCQkJICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqbnMpOwogdm9pZCBrZXJuZnNfZ2V0KHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pOwogdm9pZCBrZXJuZnNfcHV0KHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pOwogCi1zdHJ1Y3Qga2VybmZzX3Jvb3QgKmtlcm5mc19jcmVhdGVfcm9vdChzdHJ1Y3Qga2VybmZzX2Rpcl9vcHMgKmtkb3BzLAotCQkJCSAgICAgICB2b2lkICpwcml2KTsKK3N0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX25vZGVfZnJvbV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKK3N0cnVjdCBrZXJuZnNfcm9vdCAqa2VybmZzX3Jvb3RfZnJvbV9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKworc3RydWN0IGtlcm5mc19yb290ICprZXJuZnNfY3JlYXRlX3Jvb3Qoc3RydWN0IGtlcm5mc19zeXNjYWxsX29wcyAqc2NvcHMsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBmbGFncywgdm9pZCAqcHJpdik7CiB2b2lkIGtlcm5mc19kZXN0cm95X3Jvb3Qoc3RydWN0IGtlcm5mc19yb290ICpyb290KTsKIAogc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfY3JlYXRlX2Rpcl9ucyhzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwKQEAgLTIzOSw3ICsyNjYsMTEgQEAKIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2NyZWF0ZV9saW5rKHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LAogCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAogCQkJCSAgICAgICBzdHJ1Y3Qga2VybmZzX25vZGUgKnRhcmdldCk7Cit2b2lkIGtlcm5mc19hY3RpdmF0ZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKTsKIHZvaWQga2VybmZzX3JlbW92ZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKTsKK3ZvaWQga2VybmZzX2JyZWFrX2FjdGl2ZV9wcm90ZWN0aW9uKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pOwordm9pZCBrZXJuZnNfdW5icmVha19hY3RpdmVfcHJvdGVjdGlvbihzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKTsKK2Jvb2wga2VybmZzX3JlbW92ZV9zZWxmKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pOwogaW50IGtlcm5mc19yZW1vdmVfYnlfbmFtZV9ucyhzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSwKIAkJCSAgICAgY29uc3Qgdm9pZCAqbnMpOwogaW50IGtlcm5mc19yZW5hbWVfbnMoc3RydWN0IGtlcm5mc19ub2RlICprbiwgc3RydWN0IGtlcm5mc19ub2RlICpuZXdfcGFyZW50LApAQCAtMjU1LDcgKzI4Niw3IEBACiAKIHZvaWQga2VybmZzX2luaXQodm9pZCk7CiAKLSNlbHNlCS8qIENPTkZJR19TWVNGUyAqLworI2Vsc2UJLyogQ09ORklHX0tFUk5GUyAqLwogCiBzdGF0aWMgaW5saW5lIGVudW0ga2VybmZzX25vZGVfdHlwZSBrZXJuZnNfdHlwZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQogeyByZXR1cm4gMDsgfQkvKiB3aGF0ZXZlciAqLwpAQCAtMjY1LDYgKzI5NiwxOSBAQAogc3RhdGljIGlubGluZSBib29sIGtlcm5mc19uc19lbmFibGVkKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCiB7IHJldHVybiBmYWxzZTsgfQogCitzdGF0aWMgaW5saW5lIGludCBrZXJuZnNfbmFtZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCit7IHJldHVybiAtRU5PU1lTOyB9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqIF9fbXVzdF9jaGVjayBrZXJuZnNfcGF0aChzdHJ1Y3Qga2VybmZzX25vZGUgKmtuLCBjaGFyICpidWYsCisJCQkJCSAgICAgIHNpemVfdCBidWZsZW4pCit7IHJldHVybiBOVUxMOyB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcl9jb250X2tlcm5mc19uYW1lKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHByX2NvbnRfa2VybmZzX3BhdGgoc3RydWN0IGtlcm5mc19ub2RlICprbikgeyB9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZ2V0X3BhcmVudChzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQoreyByZXR1cm4gTlVMTDsgfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBrZXJuZnNfbm9kZSAqCiBrZXJuZnNfZmluZF9hbmRfZ2V0X25zKHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLAogCQkgICAgICAgY29uc3Qgdm9pZCAqbnMpCkBAIC0yNzMsOCArMzE3LDE1IEBACiBzdGF0aWMgaW5saW5lIHZvaWQga2VybmZzX2dldChzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBrZXJuZnNfcHV0KHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pIHsgfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX25vZGVfZnJvbV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreyByZXR1cm4gTlVMTDsgfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBrZXJuZnNfcm9vdCAqa2VybmZzX3Jvb3RfZnJvbV9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreyByZXR1cm4gTlVMTDsgfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBrZXJuZnNfcm9vdCAqCi1rZXJuZnNfY3JlYXRlX3Jvb3Qoc3RydWN0IGtlcm5mc19kaXJfb3BzICprZG9wcywgdm9pZCAqcHJpdikKK2tlcm5mc19jcmVhdGVfcm9vdChzdHJ1Y3Qga2VybmZzX3N5c2NhbGxfb3BzICpzY29wcywgdW5zaWduZWQgaW50IGZsYWdzLAorCQkgICB2b2lkICpwcml2KQogeyByZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsgfQogCiBzdGF0aWMgaW5saW5lIHZvaWQga2VybmZzX2Rlc3Ryb3lfcm9vdChzdHJ1Y3Qga2VybmZzX3Jvb3QgKnJvb3QpIHsgfQpAQCAtMjk2LDggKzM0NywxMyBAQAogCQkgICBzdHJ1Y3Qga2VybmZzX25vZGUgKnRhcmdldCkKIHsgcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7IH0KIAorc3RhdGljIGlubGluZSB2b2lkIGtlcm5mc19hY3RpdmF0ZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKSB7IH0KKwogc3RhdGljIGlubGluZSB2b2lkIGtlcm5mc19yZW1vdmUoc3RydWN0IGtlcm5mc19ub2RlICprbikgeyB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBrZXJuZnNfcmVtb3ZlX3NlbGYoc3RydWN0IGtlcm5mc19ub2RlICprbikKK3sgcmV0dXJuIGZhbHNlOyB9CisKIHN0YXRpYyBpbmxpbmUgaW50IGtlcm5mc19yZW1vdmVfYnlfbmFtZV9ucyhzdHJ1Y3Qga2VybmZzX25vZGUgKmtuLAogCQkJCQkgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpucykKIHsgcmV0dXJuIC1FTk9TWVM7IH0KQEAgLTMyNSw3ICszODEsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQga2VybmZzX2luaXQodm9pZCkgeyB9CiAKLSNlbmRpZgkvKiBDT05GSUdfU1lTRlMgKi8KKyNlbmRpZgkvKiBDT05GSUdfS0VSTkZTICovCiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGtlcm5mc19ub2RlICoKIGtlcm5mc19maW5kX2FuZF9nZXQoc3RydWN0IGtlcm5mc19ub2RlICprbiwgY29uc3QgY2hhciAqbmFtZSkKQEAgLTM2Nyw2ICs0MjMsMTMgQEAKIAlyZXR1cm4ga2VybmZzX3JlbW92ZV9ieV9uYW1lX25zKHBhcmVudCwgbmFtZSwgTlVMTCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGtlcm5mc19yZW5hbWUoc3RydWN0IGtlcm5mc19ub2RlICprbiwKKwkJCQlzdHJ1Y3Qga2VybmZzX25vZGUgKm5ld19wYXJlbnQsCisJCQkJY29uc3QgY2hhciAqbmV3X25hbWUpCit7CisJcmV0dXJuIGtlcm5mc19yZW5hbWVfbnMoa24sIG5ld19wYXJlbnQsIG5ld19uYW1lLCBOVUxMKTsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGVudHJ5ICoKIGtlcm5mc19tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAogCSAgICAgc3RydWN0IGtlcm5mc19yb290ICpyb290LCBib29sICpuZXdfc2JfY3JlYXRlZCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWNiLmggYi9pbmNsdWRlL2xpbnV4L21jYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjI4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21jYi5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTUVOIENoYW1lbGVvbiBCdXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IE1FTiBNaWtyb2VsZWt0cm9uaWsgR21iSCAod3d3Lm1lbi5kZSkKKyAqIEF1dGhvcjogSm9oYW5uZXMgVGh1bXNoaXJuIDxqb2hhbm5lcy50aHVtc2hpcm5AbWVuLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9MSU5VWF9NQ0JfSAorI2RlZmluZSBfTElOVVhfTUNCX0gKKworI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgorCitzdHJ1Y3QgbWNiX2RyaXZlcjsKKworLyoqCisgKiBzdHJ1Y3QgbWNiX2J1cyAtIE1FTiBDaGFtZWxlb24gQnVzCisgKgorICogQGRldjogcG9pbnRlciB0byBjYXJyaWVyIGRldmljZQorICogQGNoaWxkcmVuOiB0aGUgY2hpbGQgYnVzc2VzCisgKiBAYnVzX25yOiBtY2IgYnVzIG51bWJlcgorICovCitzdHJ1Y3QgbWNiX2J1cyB7CisJc3RydWN0IGxpc3RfaGVhZCBjaGlsZHJlbjsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlpbnQgYnVzX25yOworfTsKKyNkZWZpbmUgdG9fbWNiX2J1cyhiKSBjb250YWluZXJfb2YoKGIpLCBzdHJ1Y3QgbWNiX2J1cywgZGV2KQorCisvKioKKyAqIHN0cnVjdCBtY2JfZGV2aWNlIC0gTUVOIENoYW1lbGVvbiBCdXMgZGV2aWNlCisgKgorICogQGJ1c19saXN0OiBpbnRlcm5hbCBsaXN0IGhhbmRsaW5nIGZvciBidXMgY29kZQorICogQGRldjogZGV2aWNlIGluIGtlcm5lbCByZXByZXNlbnRhdGlvbgorICogQGJ1czogbWNiIGJ1cyB0aGUgZGV2aWNlIGlzIHBsdWdnZWQgdG8KKyAqIEBzdWJvcmRpbmF0ZTogc3Vib3JkaW5hdGUgTUNCdXMgaW4gY2FzZSBvZiBicmlkZ2UKKyAqIEBpc19hZGRlZDogZmxhZyB0byBjaGVjayBpZiBkZXZpY2UgaXMgYWRkZWQgdG8gYnVzCisgKiBAZHJpdmVyOiBhc3NvY2lhdGVkIG1jYl9kcml2ZXIKKyAqIEBpZDogbWNiIGRldmljZSBpZAorICogQGluc3Q6IGluc3RhbmNlIGluIENoYW1lbGVvbiB0YWJsZQorICogQGdyb3VwOiBncm91cCBpbiBDaGFtZWxlb24gdGFibGUKKyAqIEB2YXI6IHZhcmlhbnQgaW4gQ2hhbWVsZW9uIHRhYmxlCisgKiBAYmFyOiBCQVIgaW4gQ2hhbWVsZW9uIHRhYmxlCisgKiBAcmV2OiByZXZpc2lvbiBpbiBDaGFtZWxlb24gdGFibGUKKyAqIEBpcnE6IElSUSByZXNvdXJjZQorICogQG1lbW9yeTogbWVtb3J5IHJlc291cmNlCisgKi8KK3N0cnVjdCBtY2JfZGV2aWNlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJ1c19saXN0OworCXN0cnVjdCBkZXZpY2UgZGV2OworCXN0cnVjdCBtY2JfYnVzICpidXM7CisJc3RydWN0IG1jYl9idXMgKnN1Ym9yZGluYXRlOworCWJvb2wgaXNfYWRkZWQ7CisJc3RydWN0IG1jYl9kcml2ZXIgKmRyaXZlcjsKKwl1MTYgaWQ7CisJaW50IGluc3Q7CisJaW50IGdyb3VwOworCWludCB2YXI7CisJaW50IGJhcjsKKwlpbnQgcmV2OworCXN0cnVjdCByZXNvdXJjZSBpcnE7CisJc3RydWN0IHJlc291cmNlIG1lbTsKK307CisjZGVmaW5lIHRvX21jYl9kZXZpY2UoeCkgY29udGFpbmVyX29mKCh4KSwgc3RydWN0IG1jYl9kZXZpY2UsIGRldikKKworLyoqCisgKiBzdHJ1Y3QgbWNiX2RyaXZlciAtIE1FTiBDaGFtZWxlb24gQnVzIGRldmljZSBkcml2ZXIKKyAqCisgKiBAZHJpdmVyOiBkZXZpY2VfZHJpdmVyCisgKiBAaWRfdGFibGU6IG1jYiBpZCB0YWJsZQorICogQHByb2JlOiBwcm9iZSBjYWxsYmFjaworICogQHJlbW92ZTogcmVtb3ZlIGNhbGxiYWNrCisgKiBAc2h1dGRvd246IHNodXRkb3duIGNhbGxiYWNrCisgKi8KK3N0cnVjdCBtY2JfZHJpdmVyIHsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7CisJY29uc3Qgc3RydWN0IG1jYl9kZXZpY2VfaWQgKmlkX3RhYmxlOworCWludCAoKnByb2JlKShzdHJ1Y3QgbWNiX2RldmljZSAqbWRldiwgY29uc3Qgc3RydWN0IG1jYl9kZXZpY2VfaWQgKmlkKTsKKwl2b2lkICgqcmVtb3ZlKShzdHJ1Y3QgbWNiX2RldmljZSAqbWRldik7CisJdm9pZCAoKnNodXRkb3duKShzdHJ1Y3QgbWNiX2RldmljZSAqbWRldik7Cit9OworI2RlZmluZSB0b19tY2JfZHJpdmVyKHgpIGNvbnRhaW5lcl9vZigoeCksIHN0cnVjdCBtY2JfZHJpdmVyLCBkcml2ZXIpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWNiX2dldF9kcnZkYXRhKHN0cnVjdCBtY2JfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWNiX3NldF9kcnZkYXRhKHN0cnVjdCBtY2JfZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgZGF0YSk7Cit9CisKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrIF9fbWNiX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgbWNiX2RyaXZlciAqZHJ2LAorCQkJCQlzdHJ1Y3QgbW9kdWxlICpvd25lciwKKwkJCQkJY29uc3QgY2hhciAqbW9kX25hbWUpOworI2RlZmluZSBtY2JfcmVnaXN0ZXJfZHJpdmVyKGRyaXZlcikJCVwKKwlfX21jYl9yZWdpc3Rlcl9kcml2ZXIoZHJpdmVyLCBUSElTX01PRFVMRSwgS0JVSUxEX01PRE5BTUUpCitleHRlcm4gdm9pZCBtY2JfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IG1jYl9kcml2ZXIgKmRyaXZlcik7CisjZGVmaW5lIG1vZHVsZV9tY2JfZHJpdmVyKF9fbWNiX2RyaXZlcikJCVwKKwltb2R1bGVfZHJpdmVyKF9fbWNiX2RyaXZlciwgbWNiX3JlZ2lzdGVyX2RyaXZlciwgbWNiX3VucmVnaXN0ZXJfZHJpdmVyKTsKK2V4dGVybiB2b2lkIG1jYl9idXNfYWRkX2RldmljZXMoY29uc3Qgc3RydWN0IG1jYl9idXMgKmJ1cyk7CitleHRlcm4gaW50IG1jYl9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IG1jYl9idXMgKmJ1cywgc3RydWN0IG1jYl9kZXZpY2UgKmRldik7CitleHRlcm4gc3RydWN0IG1jYl9idXMgKm1jYl9hbGxvY19idXModm9pZCk7CitleHRlcm4gc3RydWN0IG1jYl9idXMgKm1jYl9idXNfZ2V0KHN0cnVjdCBtY2JfYnVzICpidXMpOworZXh0ZXJuIHZvaWQgbWNiX2J1c19wdXQoc3RydWN0IG1jYl9idXMgKmJ1cyk7CitleHRlcm4gc3RydWN0IG1jYl9kZXZpY2UgKm1jYl9hbGxvY19kZXYoc3RydWN0IG1jYl9idXMgKmJ1cyk7CitleHRlcm4gdm9pZCBtY2JfZnJlZV9kZXYoc3RydWN0IG1jYl9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBtY2JfcmVsZWFzZV9idXMoc3RydWN0IG1jYl9idXMgKmJ1cyk7CitleHRlcm4gc3RydWN0IHJlc291cmNlICptY2JfcmVxdWVzdF9tZW0oc3RydWN0IG1jYl9kZXZpY2UgKmRldiwKKwkJCQkJY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBtY2JfcmVsZWFzZV9tZW0oc3RydWN0IHJlc291cmNlICptZW0pOworZXh0ZXJuIGludCBtY2JfZ2V0X2lycShzdHJ1Y3QgbWNiX2RldmljZSAqZGV2KTsKKworI2VuZGlmIC8qIF9MSU5VWF9NQ0JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvYXJpem9uYS9yZWdpc3RlcnMuaCBiL2luY2x1ZGUvbGludXgvbWZkL2FyaXpvbmEvcmVnaXN0ZXJzLmgKaW5kZXggZmRmM2FhMy4uM2RkYWE2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvYXJpem9uYS9yZWdpc3RlcnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9hcml6b25hL3JlZ2lzdGVycy5oCkBAIC0xNzAyLDkgKzE3MDIsOSBAQAogLyoKICAqIFIzNzMgKDB4MTc1KSAtIEZMTDEgQ29udHJvbCA1CiAgKi8KLSNkZWZpbmUgQVJJWk9OQV9GTEwxX0ZSQVRJT19NQVNLICAgICAgICAgICAgICAgICAweDA3MDAgIC8qIEZMTDFfRlJBVElPIC0gWzEwOjhdICovCi0jZGVmaW5lIEFSSVpPTkFfRkxMMV9GUkFUSU9fU0hJRlQgICAgICAgICAgICAgICAgICAgICA4ICAvKiBGTEwxX0ZSQVRJTyAtIFsxMDo4XSAqLwotI2RlZmluZSBBUklaT05BX0ZMTDFfRlJBVElPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMyAgLyogRkxMMV9GUkFUSU8gLSBbMTA6OF0gKi8KKyNkZWZpbmUgQVJJWk9OQV9GTEwxX0ZSQVRJT19NQVNLICAgICAgICAgICAgICAgICAweDBGMDAgIC8qIEZMTDFfRlJBVElPIC0gWzExOjhdICovCisjZGVmaW5lIEFSSVpPTkFfRkxMMV9GUkFUSU9fU0hJRlQgICAgICAgICAgICAgICAgICAgICA4ICAvKiBGTEwxX0ZSQVRJTyAtIFsxMTo4XSAqLworI2RlZmluZSBBUklaT05BX0ZMTDFfRlJBVElPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNCAgLyogRkxMMV9GUkFUSU8gLSBbMTE6OF0gKi8KICNkZWZpbmUgQVJJWk9OQV9GTEwxX09VVERJVl9NQVNLICAgICAgICAgICAgICAgICAweDAwMEUgIC8qIEZMTDFfT1VURElWIC0gWzM6MV0gKi8KICNkZWZpbmUgQVJJWk9OQV9GTEwxX09VVERJVl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEZMTDFfT1VURElWIC0gWzM6MV0gKi8KICNkZWZpbmUgQVJJWk9OQV9GTEwxX09VVERJVl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEZMTDFfT1VURElWIC0gWzM6MV0gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvY29yZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9jb3JlLmgKaW5kZXggNDFjOWJkZTQuLjE1N2UzMmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvY29yZS5oCkBAIC0xOCw3ICsxOCw5IEBACiAJUzVNODc1MVgsCiAJUzVNODc2M1gsCiAJUzVNODc2N1gsCisJUzJNUEEwMSwKIAlTMk1QUzExWCwKKwlTMk1QUzE0WCwKIH07CiAKIC8qKgpAQCAtNTAsNyArNTIsNyBAQAogCXN0cnVjdCByZWdtYXBfaXJxX2NoaXBfZGF0YSAqaXJxX2RhdGE7CiAKIAlpbnQgb25vOwotCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgdHlwZTsKIAlib29sIHdha2V1cDsKIAlib29sIHd0c3Jfc21wbDsKIH07CkBAIC05Miw3ICs5NCw3IEBACiAJaW50CQkJCWJ1Y2szX2RlZmF1bHRfaWR4OwogCWludAkJCQlidWNrNF9kZWZhdWx0X2lkeDsKIAotCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVja19yYW1wX2RlbGF5OworCWludAkJCQlidWNrX3JhbXBfZGVsYXk7CiAKIAlpbnQJCQkJYnVjazJfcmFtcF9kZWxheTsKIAlpbnQJCQkJYnVjazM0X3JhbXBfZGVsYXk7CkBAIC0xMDAsMTAgKzEwMiwxNSBAQAogCWludAkJCQlidWNrMTZfcmFtcF9kZWxheTsKIAlpbnQJCQkJYnVjazc4MTBfcmFtcF9kZWxheTsKIAlpbnQJCQkJYnVjazlfcmFtcF9kZWxheTsKKwlpbnQJCQkJYnVjazI0X3JhbXBfZGVsYXk7CisJaW50CQkJCWJ1Y2szX3JhbXBfZGVsYXk7CisJaW50CQkJCWJ1Y2s3X3JhbXBfZGVsYXk7CisJaW50CQkJCWJ1Y2s4OTEwX3JhbXBfZGVsYXk7CiAKLQlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2syX3JhbXBfZW5hYmxlOwotCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVjazNfcmFtcF9lbmFibGU7Ci0JYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWNrNF9yYW1wX2VuYWJsZTsKKwlib29sCQkJCWJ1Y2sxX3JhbXBfZW5hYmxlOworCWJvb2wJCQkJYnVjazJfcmFtcF9lbmFibGU7CisJYm9vbAkJCQlidWNrM19yYW1wX2VuYWJsZTsKKwlib29sCQkJCWJ1Y2s0X3JhbXBfZW5hYmxlOwogCWJvb2wJCQkJYnVjazZfcmFtcF9lbmFibGU7CiAKIAlpbnQJCQkJYnVjazJfaW5pdDsKQEAgLTExOSw3ICsxMjYsOCBAQAogc3RydWN0IHNlY19yZWd1bGF0b3JfZGF0YSB7CiAJaW50CQkJCWlkOwogCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCSppbml0ZGF0YTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJlZ19ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZQkJKnJlZ19ub2RlOworCWludAkJCQlleHRfY29udHJvbF9ncGlvOwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvaXJxLmggYi9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL2lycS5oCmluZGV4IGQ0M2I0ZjkuLjEyMjRmNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvaXJxLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9pcnEuaApAQCAtMTMsNiArMTMsNTYgQEAKICNpZm5kZWYgX19MSU5VWF9NRkRfU0VDX0lSUV9ICiAjZGVmaW5lIF9fTElOVVhfTUZEX1NFQ19JUlFfSAogCitlbnVtIHMybXBhMDFfaXJxIHsKKwlTMk1QQTAxX0lSUV9QV1JPTkYsCisJUzJNUEEwMV9JUlFfUFdST05SLAorCVMyTVBBMDFfSVJRX0pJR09OQkYsCisJUzJNUEEwMV9JUlFfSklHT05CUiwKKwlTMk1QQTAxX0lSUV9BQ09LQkYsCisJUzJNUEEwMV9JUlFfQUNPS0JSLAorCVMyTVBBMDFfSVJRX1BXUk9OMVMsCisJUzJNUEEwMV9JUlFfTVJCLAorCisJUzJNUEEwMV9JUlFfUlRDNjBTLAorCVMyTVBBMDFfSVJRX1JUQ0ExLAorCVMyTVBBMDFfSVJRX1JUQ0EwLAorCVMyTVBBMDFfSVJRX1NNUEwsCisJUzJNUEEwMV9JUlFfUlRDMVMsCisJUzJNUEEwMV9JUlFfV1RTUiwKKworCVMyTVBBMDFfSVJRX0lOVDEyMEMsCisJUzJNUEEwMV9JUlFfSU5UMTQwQywKKwlTMk1QQTAxX0lSUV9MRE8zX1RTRCwKKwlTMk1QQTAxX0lSUV9CMTZfVFNELAorCVMyTVBBMDFfSVJRX0IyNF9UU0QsCisJUzJNUEEwMV9JUlFfQjM1X1RTRCwKKworCVMyTVBBMDFfSVJRX05SLAorfTsKKworI2RlZmluZSBTMk1QQTAxX0lSUV9QV1JPTkZfTUFTSwkJKDEgPDwgMCkKKyNkZWZpbmUgUzJNUEEwMV9JUlFfUFdST05SX01BU0sJCSgxIDw8IDEpCisjZGVmaW5lIFMyTVBBMDFfSVJRX0pJR09OQkZfTUFTSwkoMSA8PCAyKQorI2RlZmluZSBTMk1QQTAxX0lSUV9KSUdPTkJSX01BU0sJKDEgPDwgMykKKyNkZWZpbmUgUzJNUEEwMV9JUlFfQUNPS0JGX01BU0sJCSgxIDw8IDQpCisjZGVmaW5lIFMyTVBBMDFfSVJRX0FDT0tCUl9NQVNLCQkoMSA8PCA1KQorI2RlZmluZSBTMk1QQTAxX0lSUV9QV1JPTjFTX01BU0sJKDEgPDwgNikKKyNkZWZpbmUgUzJNUEEwMV9JUlFfTVJCX01BU0sJCSgxIDw8IDcpCisKKyNkZWZpbmUgUzJNUEEwMV9JUlFfUlRDNjBTX01BU0sJCSgxIDw8IDApCisjZGVmaW5lIFMyTVBBMDFfSVJRX1JUQ0ExX01BU0sJCSgxIDw8IDEpCisjZGVmaW5lIFMyTVBBMDFfSVJRX1JUQ0EwX01BU0sJCSgxIDw8IDIpCisjZGVmaW5lIFMyTVBBMDFfSVJRX1NNUExfTUFTSwkJKDEgPDwgMykKKyNkZWZpbmUgUzJNUEEwMV9JUlFfUlRDMVNfTUFTSwkJKDEgPDwgNCkKKyNkZWZpbmUgUzJNUEEwMV9JUlFfV1RTUl9NQVNLCQkoMSA8PCA1KQorCisjZGVmaW5lIFMyTVBBMDFfSVJRX0lOVDEyMENfTUFTSwkoMSA8PCAwKQorI2RlZmluZSBTMk1QQTAxX0lSUV9JTlQxNDBDX01BU0sJKDEgPDwgMSkKKyNkZWZpbmUgUzJNUEEwMV9JUlFfTERPM19UU0RfTUFTSwkoMSA8PCAyKQorI2RlZmluZSBTMk1QQTAxX0lSUV9CMTZfVFNEX01BU0sJKDEgPDwgMykKKyNkZWZpbmUgUzJNUEEwMV9JUlFfQjI0X1RTRF9NQVNLCSgxIDw8IDQpCisjZGVmaW5lIFMyTVBBMDFfSVJRX0IzNV9UU0RfTUFTSwkoMSA8PCA1KQorCiBlbnVtIHMybXBzMTFfaXJxIHsKIAlTMk1QUzExX0lSUV9QV1JPTkYsCiAJUzJNUFMxMV9JUlFfUFdST05SLApAQCAtMjQsOCArNzQsOCBAQAogCVMyTVBTMTFfSVJRX01SQiwKIAogCVMyTVBTMTFfSVJRX1JUQzYwUywKKwlTMk1QUzExX0lSUV9SVENBMCwKIAlTMk1QUzExX0lSUV9SVENBMSwKLQlTMk1QUzExX0lSUV9SVENBMiwKIAlTMk1QUzExX0lSUV9TTVBMLAogCVMyTVBTMTFfSVJRX1JUQzFTLAogCVMyTVBTMTFfSVJRX1dUU1IsCkBAIC00Nyw3ICs5Nyw3IEBACiAKICNkZWZpbmUgUzJNUFMxMV9JUlFfUlRDNjBTX01BU0sJCSgxIDw8IDApCiAjZGVmaW5lIFMyTVBTMTFfSVJRX1JUQ0ExX01BU0sJCSgxIDw8IDEpCi0jZGVmaW5lIFMyTVBTMTFfSVJRX1JUQ0EyX01BU0sJCSgxIDw8IDIpCisjZGVmaW5lIFMyTVBTMTFfSVJRX1JUQ0EwX01BU0sJCSgxIDw8IDIpCiAjZGVmaW5lIFMyTVBTMTFfSVJRX1NNUExfTUFTSwkJKDEgPDwgMykKICNkZWZpbmUgUzJNUFMxMV9JUlFfUlRDMVNfTUFTSwkJKDEgPDwgNCkKICNkZWZpbmUgUzJNUFMxMV9JUlFfV1RTUl9NQVNLCQkoMSA8PCA1KQpAQCAtNTUsNiArMTA1LDMzIEBACiAjZGVmaW5lIFMyTVBTMTFfSVJRX0lOVDEyMENfTUFTSwkoMSA8PCAwKQogI2RlZmluZSBTMk1QUzExX0lSUV9JTlQxNDBDX01BU0sJKDEgPDwgMSkKIAorZW51bSBzMm1wczE0X2lycSB7CisJUzJNUFMxNF9JUlFfUFdST05GLAorCVMyTVBTMTRfSVJRX1BXUk9OUiwKKwlTMk1QUzE0X0lSUV9KSUdPTkJGLAorCVMyTVBTMTRfSVJRX0pJR09OQlIsCisJUzJNUFMxNF9JUlFfQUNPS0JGLAorCVMyTVBTMTRfSVJRX0FDT0tCUiwKKwlTMk1QUzE0X0lSUV9QV1JPTjFTLAorCVMyTVBTMTRfSVJRX01SQiwKKworCVMyTVBTMTRfSVJRX1JUQzYwUywKKwlTMk1QUzE0X0lSUV9SVENBMSwKKwlTMk1QUzE0X0lSUV9SVENBMCwKKwlTMk1QUzE0X0lSUV9TTVBMLAorCVMyTVBTMTRfSVJRX1JUQzFTLAorCVMyTVBTMTRfSVJRX1dUU1IsCisKKwlTMk1QUzE0X0lSUV9JTlQxMjBDLAorCVMyTVBTMTRfSVJRX0lOVDE0MEMsCisJUzJNUFMxNF9JUlFfVFNELAorCisJUzJNUFMxNF9JUlFfTlIsCit9OworCisvKiBNYXNrcyBmb3IgaW50ZXJydXB0cyBhcmUgdGhlIHNhbWUgYXMgaW4gczJtcHMxMSAqLworI2RlZmluZSBTMk1QUzE0X0lSUV9UU0RfTUFTSwkJKDEgPDwgMikKKwogZW51bSBzNW04NzY3X2lycSB7CiAJUzVNODc2N19JUlFfUFdSUiwKIAlTNU04NzY3X0lSUV9QV1JGLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9ydGMuaCBiL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvcnRjLmgKaW5kZXggOTRiN2NkNi4uM2UwMmI3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9ydGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL3J0Yy5oCkBAIC0xLDEyICsxLDE3IEBACi0vKiAgcnRjLmgKKy8qIHJ0Yy5oCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE0IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQKICAqICAgICAgICAgICAgICBodHRwOi8vd3d3LnNhbXN1bmcuY29tCiAgKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICovCiAKQEAgLTQzLDYgKzQ4LDM5IEBACiAJU0VDX1JUQ19TVEFUVVMsCiAJU0VDX1dUU1JfU01QTF9DTlRMLAogCVNFQ19SVENfVURSX0NPTiwKKworCVNFQ19SVENfUkVHX01BWCwKK307CisKK2VudW0gczJtcHNfcnRjX3JlZyB7CisJUzJNUFNfUlRDX0NUUkwsCisJUzJNUFNfV1RTUl9TTVBMX0NOVEwsCisJUzJNUFNfUlRDX1VEUl9DT04sCisJUzJNUFNfUlNWRCwKKwlTMk1QU19SVENfU0VDLAorCVMyTVBTX1JUQ19NSU4sCisJUzJNUFNfUlRDX0hPVVIsCisJUzJNUFNfUlRDX1dFRUtEQVksCisJUzJNUFNfUlRDX0RBVEUsCisJUzJNUFNfUlRDX01PTlRILAorCVMyTVBTX1JUQ19ZRUFSLAorCVMyTVBTX0FMQVJNMF9TRUMsCisJUzJNUFNfQUxBUk0wX01JTiwKKwlTMk1QU19BTEFSTTBfSE9VUiwKKwlTMk1QU19BTEFSTTBfV0VFS0RBWSwKKwlTMk1QU19BTEFSTTBfREFURSwKKwlTMk1QU19BTEFSTTBfTU9OVEgsCisJUzJNUFNfQUxBUk0wX1lFQVIsCisJUzJNUFNfQUxBUk0xX1NFQywKKwlTMk1QU19BTEFSTTFfTUlOLAorCVMyTVBTX0FMQVJNMV9IT1VSLAorCVMyTVBTX0FMQVJNMV9XRUVLREFZLAorCVMyTVBTX0FMQVJNMV9EQVRFLAorCVMyTVBTX0FMQVJNMV9NT05USCwKKwlTMk1QU19BTEFSTTFfWUVBUiwKKwlTMk1QU19PRkZTUkMsCisKKwlTMk1QU19SVENfUkVHX01BWCwKIH07CiAKICNkZWZpbmUgUlRDX0kyQ19BRERSCQkoMHgwQyA+PiAxKQpAQCAtNTQsNiArOTIsOSBAQAogI2RlZmluZSBBTEFSTTFfU1RBVFVTCQkoMSA8PCAyKQogI2RlZmluZSBVUERBVEVfQUQJCSgxIDw8IDApCiAKKyNkZWZpbmUgUzJNUFNfQUxBUk0wX1NUQVRVUwkoMSA8PCAyKQorI2RlZmluZSBTMk1QU19BTEFSTTFfU1RBVFVTCSgxIDw8IDEpCisKIC8qIFJUQyBDb250cm9sIFJlZ2lzdGVyICovCiAjZGVmaW5lIEJDRF9FTl9TSElGVAkJMAogI2RlZmluZSBCQ0RfRU5fTUFTSwkJKDEgPDwgQkNEX0VOX1NISUZUKQpAQCAtNjIsNiArMTAzLDEwIEBACiAvKiBSVEMgVXBkYXRlIFJlZ2lzdGVyMSAqLwogI2RlZmluZSBSVENfVURSX1NISUZUCQkwCiAjZGVmaW5lIFJUQ19VRFJfTUFTSwkJKDEgPDwgUlRDX1VEUl9TSElGVCkKKyNkZWZpbmUgUzJNUFNfUlRDX1dVRFJfU0hJRlQJNAorI2RlZmluZSBTMk1QU19SVENfV1VEUl9NQVNLCSgxIDw8IFMyTVBTX1JUQ19XVURSX1NISUZUKQorI2RlZmluZSBTMk1QU19SVENfUlVEUl9TSElGVAkwCisjZGVmaW5lIFMyTVBTX1JUQ19SVURSX01BU0sJKDEgPDwgUzJNUFNfUlRDX1JVRFJfU0hJRlQpCiAjZGVmaW5lIFJUQ19UQ09OX1NISUZUCQkxCiAjZGVmaW5lIFJUQ19UQ09OX01BU0sJCSgxIDw8IFJUQ19UQ09OX1NISUZUKQogI2RlZmluZSBSVENfVElNRV9FTl9TSElGVAkzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL3MybXBhMDEuaCBiL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvczJtcGEwMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzYzYmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL3MybXBhMDEuaApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUZEX1MyTVBBMDFfSAorI2RlZmluZSBfX0xJTlVYX01GRF9TMk1QQTAxX0gKKworLyogUzJNUEEwMSByZWdpc3RlcnMgKi8KK2VudW0gczJtcGEwMV9yZWcgeworCVMyTVBBMDFfUkVHX0lELAorCVMyTVBBMDFfUkVHX0lOVDEsCisJUzJNUEEwMV9SRUdfSU5UMiwKKwlTMk1QQTAxX1JFR19JTlQzLAorCVMyTVBBMDFfUkVHX0lOVDFNLAorCVMyTVBBMDFfUkVHX0lOVDJNLAorCVMyTVBBMDFfUkVHX0lOVDNNLAorCVMyTVBBMDFfUkVHX1NUMSwKKwlTMk1QQTAxX1JFR19TVDIsCisJUzJNUEEwMV9SRUdfUFdST05TUkMsCisJUzJNUEEwMV9SRUdfT0ZGU1JDLAorCVMyTVBBMDFfUkVHX1JUQ19CVUYsCisJUzJNUEEwMV9SRUdfQ1RSTDEsCisJUzJNUEEwMV9SRUdfRVRDX1RFU1QsCisJUzJNUEEwMV9SRUdfUlNWRDEsCisJUzJNUEEwMV9SRUdfQlVfQ0hHLAorCVMyTVBBMDFfUkVHX1JBTVAxLAorCVMyTVBBMDFfUkVHX1JBTVAyLAorCVMyTVBBMDFfUkVHX0xET19EU0NIMSwKKwlTMk1QQTAxX1JFR19MRE9fRFNDSDIsCisJUzJNUEEwMV9SRUdfTERPX0RTQ0gzLAorCVMyTVBBMDFfUkVHX0xET19EU0NINCwKKwlTMk1QQTAxX1JFR19PVFBfQURSTCwKKwlTMk1QQTAxX1JFR19PVFBfQURSSCwKKwlTMk1QQTAxX1JFR19PVFBfREFUQSwKKwlTMk1QQTAxX1JFR19NT04xU0VMLAorCVMyTVBBMDFfUkVHX01PTjJTRUwsCisJUzJNUEEwMV9SRUdfTEVFLAorCVMyTVBBMDFfUkVHX1JTVkQyLAorCVMyTVBBMDFfUkVHX1JTVkQzLAorCVMyTVBBMDFfUkVHX1JTVkQ0LAorCVMyTVBBMDFfUkVHX1JTVkQ1LAorCVMyTVBBMDFfUkVHX1JTVkQ2LAorCVMyTVBBMDFfUkVHX1RPUF9SU1ZELAorCVMyTVBBMDFfUkVHX0RWU19TRUwsCisJUzJNUEEwMV9SRUdfRFZTX1BUUiwKKwlTMk1QQTAxX1JFR19EVlNfREFUQSwKKwlTMk1QQTAxX1JFR19SU1ZEX05PLAorCVMyTVBBMDFfUkVHX1VWTE8sCisJUzJNUEEwMV9SRUdfTEVFX05PLAorCVMyTVBBMDFfUkVHX0IxQ1RSTDEsCisJUzJNUEEwMV9SRUdfQjFDVFJMMiwKKwlTMk1QQTAxX1JFR19CMkNUUkwxLAorCVMyTVBBMDFfUkVHX0IyQ1RSTDIsCisJUzJNUEEwMV9SRUdfQjNDVFJMMSwKKwlTMk1QQTAxX1JFR19CM0NUUkwyLAorCVMyTVBBMDFfUkVHX0I0Q1RSTDEsCisJUzJNUEEwMV9SRUdfQjRDVFJMMiwKKwlTMk1QQTAxX1JFR19CNUNUUkwxLAorCVMyTVBBMDFfUkVHX0I1Q1RSTDIsCisJUzJNUEEwMV9SRUdfQjVDVFJMMywKKwlTMk1QQTAxX1JFR19CNUNUUkw0LAorCVMyTVBBMDFfUkVHX0I1Q1RSTDUsCisJUzJNUEEwMV9SRUdfQjVDVFJMNiwKKwlTMk1QQTAxX1JFR19CNkNUUkwxLAorCVMyTVBBMDFfUkVHX0I2Q1RSTDIsCisJUzJNUEEwMV9SRUdfQjdDVFJMMSwKKwlTMk1QQTAxX1JFR19CN0NUUkwyLAorCVMyTVBBMDFfUkVHX0I4Q1RSTDEsCisJUzJNUEEwMV9SRUdfQjhDVFJMMiwKKwlTMk1QQTAxX1JFR19COUNUUkwxLAorCVMyTVBBMDFfUkVHX0I5Q1RSTDIsCisJUzJNUEEwMV9SRUdfQjEwQ1RSTDEsCisJUzJNUEEwMV9SRUdfQjEwQ1RSTDIsCisJUzJNUEEwMV9SRUdfTDFDVFJMLAorCVMyTVBBMDFfUkVHX0wyQ1RSTCwKKwlTMk1QQTAxX1JFR19MM0NUUkwsCisJUzJNUEEwMV9SRUdfTDRDVFJMLAorCVMyTVBBMDFfUkVHX0w1Q1RSTCwKKwlTMk1QQTAxX1JFR19MNkNUUkwsCisJUzJNUEEwMV9SRUdfTDdDVFJMLAorCVMyTVBBMDFfUkVHX0w4Q1RSTCwKKwlTMk1QQTAxX1JFR19MOUNUUkwsCisJUzJNUEEwMV9SRUdfTDEwQ1RSTCwKKwlTMk1QQTAxX1JFR19MMTFDVFJMLAorCVMyTVBBMDFfUkVHX0wxMkNUUkwsCisJUzJNUEEwMV9SRUdfTDEzQ1RSTCwKKwlTMk1QQTAxX1JFR19MMTRDVFJMLAorCVMyTVBBMDFfUkVHX0wxNUNUUkwsCisJUzJNUEEwMV9SRUdfTDE2Q1RSTCwKKwlTMk1QQTAxX1JFR19MMTdDVFJMLAorCVMyTVBBMDFfUkVHX0wxOENUUkwsCisJUzJNUEEwMV9SRUdfTDE5Q1RSTCwKKwlTMk1QQTAxX1JFR19MMjBDVFJMLAorCVMyTVBBMDFfUkVHX0wyMUNUUkwsCisJUzJNUEEwMV9SRUdfTDIyQ1RSTCwKKwlTMk1QQTAxX1JFR19MMjNDVFJMLAorCVMyTVBBMDFfUkVHX0wyNENUUkwsCisJUzJNUEEwMV9SRUdfTDI1Q1RSTCwKKwlTMk1QQTAxX1JFR19MMjZDVFJMLAorCisJUzJNUEEwMV9SRUdfTERPX09WQ0IxLAorCVMyTVBBMDFfUkVHX0xET19PVkNCMiwKKwlTMk1QQTAxX1JFR19MRE9fT1ZDQjMsCisJUzJNUEEwMV9SRUdfTERPX09WQ0I0LAorCit9OworCisvKiBTMk1QQTAxIHJlZ3VsYXRvciBpZHMgKi8KK2VudW0gczJtcGEwMV9yZWd1bGF0b3JzIHsKKwlTMk1QQTAxX0xETzEsCisJUzJNUEEwMV9MRE8yLAorCVMyTVBBMDFfTERPMywKKwlTMk1QQTAxX0xETzQsCisJUzJNUEEwMV9MRE81LAorCVMyTVBBMDFfTERPNiwKKwlTMk1QQTAxX0xETzcsCisJUzJNUEEwMV9MRE84LAorCVMyTVBBMDFfTERPOSwKKwlTMk1QQTAxX0xETzEwLAorCVMyTVBBMDFfTERPMTEsCisJUzJNUEEwMV9MRE8xMiwKKwlTMk1QQTAxX0xETzEzLAorCVMyTVBBMDFfTERPMTQsCisJUzJNUEEwMV9MRE8xNSwKKwlTMk1QQTAxX0xETzE2LAorCVMyTVBBMDFfTERPMTcsCisJUzJNUEEwMV9MRE8xOCwKKwlTMk1QQTAxX0xETzE5LAorCVMyTVBBMDFfTERPMjAsCisJUzJNUEEwMV9MRE8yMSwKKwlTMk1QQTAxX0xETzIyLAorCVMyTVBBMDFfTERPMjMsCisJUzJNUEEwMV9MRE8yNCwKKwlTMk1QQTAxX0xETzI1LAorCVMyTVBBMDFfTERPMjYsCisKKwlTMk1QQTAxX0JVQ0sxLAorCVMyTVBBMDFfQlVDSzIsCisJUzJNUEEwMV9CVUNLMywKKwlTMk1QQTAxX0JVQ0s0LAorCVMyTVBBMDFfQlVDSzUsCisJUzJNUEEwMV9CVUNLNiwKKwlTMk1QQTAxX0JVQ0s3LAorCVMyTVBBMDFfQlVDSzgsCisJUzJNUEEwMV9CVUNLOSwKKwlTMk1QQTAxX0JVQ0sxMCwKKworCVMyTVBBMDFfUkVHVUxBVE9SX01BWCwKK307CisKKyNkZWZpbmUgUzJNUEEwMV9CVUNLX01JTjEJNjAwMDAwCisjZGVmaW5lIFMyTVBBMDFfQlVDS19NSU4yCTgwMDAwMAorI2RlZmluZSBTMk1QQTAxX0JVQ0tfTUlOMwkxMDAwMDAwCisjZGVmaW5lIFMyTVBBMDFfQlVDS19NSU40CTE1MDAwMDAKKyNkZWZpbmUgUzJNUEEwMV9MRE9fTUlOCQk4MDAwMDAKKworI2RlZmluZSBTMk1QQTAxX0JVQ0tfU1RFUDEJNjI1MAorI2RlZmluZSBTMk1QQTAxX0JVQ0tfU1RFUDIJMTI1MDAKKworI2RlZmluZSBTMk1QQTAxX0xET19TVEVQMQk1MDAwMAorI2RlZmluZSBTMk1QQTAxX0xET19TVEVQMgkyNTAwMAorCisjZGVmaW5lIFMyTVBBMDFfTERPX1ZTRUxfTUFTSwkweDNGCisjZGVmaW5lIFMyTVBBMDFfQlVDS19WU0VMX01BU0sJMHhGRgorI2RlZmluZSBTMk1QQTAxX0VOQUJMRV9NQVNLCSgweDAzIDw8IFMyTVBBMDFfRU5BQkxFX1NISUZUKQorI2RlZmluZSBTMk1QQTAxX0VOQUJMRV9TSElGVAkweDA2CisjZGVmaW5lIFMyTVBBMDFfTERPX05fVk9MVEFHRVMJKFMyTVBBMDFfTERPX1ZTRUxfTUFTSyArIDEpCisjZGVmaW5lIFMyTVBBMDFfQlVDS19OX1ZPTFRBR0VTIChTMk1QQTAxX0JVQ0tfVlNFTF9NQVNLICsgMSkKKworI2RlZmluZSBTMk1QQTAxX1JBTVBfREVMQVkJMTI1MDAJLyogdVYvdXMgKi8KKworI2RlZmluZSBTMk1QQTAxX0JVQ0sxNl9SQU1QX1NISUZUCTQKKyNkZWZpbmUgUzJNUEEwMV9CVUNLMjRfUkFNUF9TSElGVAk2CisjZGVmaW5lIFMyTVBBMDFfQlVDSzNfUkFNUF9TSElGVAk0CisjZGVmaW5lIFMyTVBBMDFfQlVDSzVfUkFNUF9TSElGVAk2CisjZGVmaW5lIFMyTVBBMDFfQlVDSzdfUkFNUF9TSElGVAkyCisjZGVmaW5lIFMyTVBBMDFfQlVDSzg5MTBfUkFNUF9TSElGVAkwCisKKyNkZWZpbmUgUzJNUEEwMV9CVUNLMV9SQU1QX0VOX1NISUZUCTMKKyNkZWZpbmUgUzJNUEEwMV9CVUNLMl9SQU1QX0VOX1NISUZUCTIKKyNkZWZpbmUgUzJNUEEwMV9CVUNLM19SQU1QX0VOX1NISUZUCTEKKyNkZWZpbmUgUzJNUEEwMV9CVUNLNF9SQU1QX0VOX1NISUZUCTAKKyNkZWZpbmUgUzJNUEEwMV9QTUlDX0VOX1NISUZUCTYKKworI2VuZGlmIC8qX19MSU5VWF9NRkRfUzJNUEEwMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL3MybXBzMTQuaCBiL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvczJtcHMxNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNDQ5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL3MybXBzMTQuaApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIHMybXBzMTQuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkCisgKiAgICAgICAgICAgICAgaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01GRF9TMk1QUzE0X0gKKyNkZWZpbmUgX19MSU5VWF9NRkRfUzJNUFMxNF9ICisKKy8qIFMyTVBTMTQgcmVnaXN0ZXJzICovCitlbnVtIHMybXBzMTRfcmVnIHsKKwlTMk1QUzE0X1JFR19JRCwKKwlTMk1QUzE0X1JFR19JTlQxLAorCVMyTVBTMTRfUkVHX0lOVDIsCisJUzJNUFMxNF9SRUdfSU5UMywKKwlTMk1QUzE0X1JFR19JTlQxTSwKKwlTMk1QUzE0X1JFR19JTlQyTSwKKwlTMk1QUzE0X1JFR19JTlQzTSwKKwlTMk1QUzE0X1JFR19TVDEsCisJUzJNUFMxNF9SRUdfU1QyLAorCVMyTVBTMTRfUkVHX1BXUk9OU1JDLAorCVMyTVBTMTRfUkVHX09GRlNSQywKKwlTMk1QUzE0X1JFR19CVV9DSEcsCisJUzJNUFMxNF9SRUdfUlRDQ1RSTCwKKwlTMk1QUzE0X1JFR19DVFJMMSwKKwlTMk1QUzE0X1JFR19DVFJMMiwKKwlTMk1QUzE0X1JFR19SU1ZEMSwKKwlTMk1QUzE0X1JFR19SU1ZEMiwKKwlTMk1QUzE0X1JFR19SU1ZEMywKKwlTMk1QUzE0X1JFR19SU1ZENCwKKwlTMk1QUzE0X1JFR19SU1ZENSwKKwlTMk1QUzE0X1JFR19SU1ZENiwKKwlTMk1QUzE0X1JFR19DVFJMMywKKwlTMk1QUzE0X1JFR19SU1ZENywKKwlTMk1QUzE0X1JFR19SU1ZEOCwKKwlTMk1QUzE0X1JFR19XUlNUQkksCisJUzJNUFMxNF9SRUdfQjFDVFJMMSwKKwlTMk1QUzE0X1JFR19CMUNUUkwyLAorCVMyTVBTMTRfUkVHX0IyQ1RSTDEsCisJUzJNUFMxNF9SRUdfQjJDVFJMMiwKKwlTMk1QUzE0X1JFR19CM0NUUkwxLAorCVMyTVBTMTRfUkVHX0IzQ1RSTDIsCisJUzJNUFMxNF9SRUdfQjRDVFJMMSwKKwlTMk1QUzE0X1JFR19CNENUUkwyLAorCVMyTVBTMTRfUkVHX0I1Q1RSTDEsCisJUzJNUFMxNF9SRUdfQjVDVFJMMiwKKwlTMk1QUzE0X1JFR19MMUNUUkwsCisJUzJNUFMxNF9SRUdfTDJDVFJMLAorCVMyTVBTMTRfUkVHX0wzQ1RSTCwKKwlTMk1QUzE0X1JFR19MNENUUkwsCisJUzJNUFMxNF9SRUdfTDVDVFJMLAorCVMyTVBTMTRfUkVHX0w2Q1RSTCwKKwlTMk1QUzE0X1JFR19MN0NUUkwsCisJUzJNUFMxNF9SRUdfTDhDVFJMLAorCVMyTVBTMTRfUkVHX0w5Q1RSTCwKKwlTMk1QUzE0X1JFR19MMTBDVFJMLAorCVMyTVBTMTRfUkVHX0wxMUNUUkwsCisJUzJNUFMxNF9SRUdfTDEyQ1RSTCwKKwlTMk1QUzE0X1JFR19MMTNDVFJMLAorCVMyTVBTMTRfUkVHX0wxNENUUkwsCisJUzJNUFMxNF9SRUdfTDE1Q1RSTCwKKwlTMk1QUzE0X1JFR19MMTZDVFJMLAorCVMyTVBTMTRfUkVHX0wxN0NUUkwsCisJUzJNUFMxNF9SRUdfTDE4Q1RSTCwKKwlTMk1QUzE0X1JFR19MMTlDVFJMLAorCVMyTVBTMTRfUkVHX0wyMENUUkwsCisJUzJNUFMxNF9SRUdfTDIxQ1RSTCwKKwlTMk1QUzE0X1JFR19MMjJDVFJMLAorCVMyTVBTMTRfUkVHX0wyM0NUUkwsCisJUzJNUFMxNF9SRUdfTDI0Q1RSTCwKKwlTMk1QUzE0X1JFR19MMjVDVFJMLAorCVMyTVBTMTRfUkVHX0xET0RTQ0gxLAorCVMyTVBTMTRfUkVHX0xET0RTQ0gyLAorCVMyTVBTMTRfUkVHX0xET0RTQ0gzLAorfTsKKworLyogUzJNUFMxNCByZWd1bGF0b3IgaWRzICovCitlbnVtIHMybXBzMTRfcmVndWxhdG9ycyB7CisJUzJNUFMxNF9MRE8xLAorCVMyTVBTMTRfTERPMiwKKwlTMk1QUzE0X0xETzMsCisJUzJNUFMxNF9MRE80LAorCVMyTVBTMTRfTERPNSwKKwlTMk1QUzE0X0xETzYsCisJUzJNUFMxNF9MRE83LAorCVMyTVBTMTRfTERPOCwKKwlTMk1QUzE0X0xETzksCisJUzJNUFMxNF9MRE8xMCwKKwlTMk1QUzE0X0xETzExLAorCVMyTVBTMTRfTERPMTIsCisJUzJNUFMxNF9MRE8xMywKKwlTMk1QUzE0X0xETzE0LAorCVMyTVBTMTRfTERPMTUsCisJUzJNUFMxNF9MRE8xNiwKKwlTMk1QUzE0X0xETzE3LAorCVMyTVBTMTRfTERPMTgsCisJUzJNUFMxNF9MRE8xOSwKKwlTMk1QUzE0X0xETzIwLAorCVMyTVBTMTRfTERPMjEsCisJUzJNUFMxNF9MRE8yMiwKKwlTMk1QUzE0X0xETzIzLAorCVMyTVBTMTRfTERPMjQsCisJUzJNUFMxNF9MRE8yNSwKKwlTMk1QUzE0X0JVQ0sxLAorCVMyTVBTMTRfQlVDSzIsCisJUzJNUFMxNF9CVUNLMywKKwlTMk1QUzE0X0JVQ0s0LAorCVMyTVBTMTRfQlVDSzUsCisKKwlTMk1QUzE0X1JFR1VMQVRPUl9NQVgsCit9OworCisvKiBSZWd1bGF0b3IgY29uc3RyYWludHMgZm9yIEJVQ0t4ICovCisjZGVmaW5lIFMyTVBTMTRfQlVDSzEyMzVfTUlOXzYwME1WCTYwMDAwMAorI2RlZmluZSBTMk1QUzE0X0JVQ0s0X01JTl8xNDAwTVYJMTQwMDAwMAorI2RlZmluZSBTMk1QUzE0X0JVQ0sxMjM1X1NURVBfNl8yNU1WCTYyNTAKKyNkZWZpbmUgUzJNUFMxNF9CVUNLNF9TVEVQXzEyXzVNVgkxMjUwMAorI2RlZmluZSBTMk1QUzE0X0JVQ0sxMjM1X1NUQVJUX1NFTAkweDIwCisjZGVmaW5lIFMyTVBTMTRfQlVDSzRfU1RBUlRfU0VMCQkweDQwCisvKgorICogRGVmYXVsdCByYW1wIGRlbGF5IGluIHV2L3VzLiBEYXRhc2hlZXQgc2F5cyB0aGF0IHJhbXAgZGVsYXkgY2FuIGJlCisgKiBjb250cm9sbGVkIGhvd2V2ZXIgaXQgZG9lcyBub3Qgc3BlY2lmeSB3aGljaCByZWdpc3RlciBpcyB1c2VkIGZvciB0aGF0LgorICogTGV0J3MgYXNzdW1lIHRoYXQgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHNldC4KKyAqLworI2RlZmluZSBTMk1QUzE0X0JVQ0tfUkFNUF9ERUxBWQkJMTI1MDAKKworLyogUmVndWxhdG9yIGNvbnN0cmFpbnRzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgTERPeCAqLworI2RlZmluZSBTMk1QUzE0X0xET19NSU5fODAwTVYJCTgwMDAwMAorI2RlZmluZSBTMk1QUzE0X0xET19NSU5fMTgwME1WCQkxODAwMDAwCisjZGVmaW5lIFMyTVBTMTRfTERPX1NURVBfMTJfNU1WCQkxMjUwMAorI2RlZmluZSBTMk1QUzE0X0xET19TVEVQXzI1TVYJCTI1MDAwCisKKyNkZWZpbmUgUzJNUFMxNF9MRE9fVlNFTF9NQVNLCQkweDNGCisjZGVmaW5lIFMyTVBTMTRfQlVDS19WU0VMX01BU0sJCTB4RkYKKyNkZWZpbmUgUzJNUFMxNF9FTkFCTEVfTUFTSwkJKDB4MDMgPDwgUzJNUFMxNF9FTkFCTEVfU0hJRlQpCisjZGVmaW5lIFMyTVBTMTRfRU5BQkxFX1NISUZUCQk2CisvKiBPbi9PZmYgY29udHJvbGxlZCBieSBQV1JFTiAqLworI2RlZmluZSBTMk1QUzE0X0VOQUJMRV9TVVNQRU5ECQkoMHgwMSA8PCBTMk1QUzE0X0VOQUJMRV9TSElGVCkKKyNkZWZpbmUgUzJNUFMxNF9MRE9fTl9WT0xUQUdFUwkJKFMyTVBTMTRfTERPX1ZTRUxfTUFTSyArIDEpCisjZGVmaW5lIFMyTVBTMTRfQlVDS19OX1ZPTFRBR0VTCQkoUzJNUFMxNF9CVUNLX1ZTRUxfTUFTSyArIDEpCisKKyNlbmRpZiAvKiAgX19MSU5VWF9NRkRfUzJNUFMxNF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL3M1bTg3NjcuaCBiL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvczVtODc2Ny5oCmluZGV4IDJhYjBiMGYuLjI0M2I1OGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvczVtODc2Ny5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvczVtODc2Ny5oCkBAIC0xODMsMTAgKzE4MywxNyBAQAogCVM1TTg3NjdfUkVHX01BWCwKIH07CiAKKy8qIExET19FTi9CVUNLX0VOIGZpZWxkIGluIHJlZ2lzdGVycyAqLwogI2RlZmluZSBTNU04NzY3X0VOQ1RSTF9TSElGVAkJNgogI2RlZmluZSBTNU04NzY3X0VOQ1RSTF9NQVNLCQkoMHgzIDw8IFM1TTg3NjdfRU5DVFJMX1NISUZUKQogCiAvKgorICogTERPX0VOL0JVQ0tfRU4gcmVnaXN0ZXIgdmFsdWUgZm9yIGNvbnRyb2xsaW5nIHRoaXMgQnVjayBvciBMRE8KKyAqIGJ5IEdQSU8gKFBXUkVOLCBCVUNLRU4pLgorICovCisjZGVmaW5lIFM1TTg3NjdfRU5DVFJMX1VTRV9HUElPCQkweDEKKworLyoKICAqIFZhbHVlcyBmb3IgQlVDS19SQU1QIGZpZWxkIGluIERWU19SQU1QIHJlZ2lzdGVyLCBtYXRjaGluZyByYXcgdmFsdWVzCiAgKiBpbiBtVi91cy4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L21pc2NkZXZpY2UuaAppbmRleCAzNzM3ZjcyLi4yY2YxNTQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21pc2NkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L21pc2NkZXZpY2UuaApAQCAtMTEsMjMgKzExLDIzIEBACiAgKi8KIAogI2RlZmluZSBQU01PVVNFX01JTk9SCQkxCi0jZGVmaW5lIE1TX0JVU01PVVNFX01JTk9SCTIKLSNkZWZpbmUgQVRJWExfQlVTTU9VU0VfTUlOT1IJMworI2RlZmluZSBNU19CVVNNT1VTRV9NSU5PUgkyCS8qIHVudXNlZCAqLworI2RlZmluZSBBVElYTF9CVVNNT1VTRV9NSU5PUgkzCS8qIHVudXNlZCAqLwogLyojZGVmaW5lIEFNSUdBTU9VU0VfTUlOT1IJNAlGSVhNRSBPQlNPTEVURSAqLwotI2RlZmluZSBBVEFSSU1PVVNFX01JTk9SCTUKLSNkZWZpbmUgU1VOX01PVVNFX01JTk9SCQk2Ci0jZGVmaW5lIEFQT0xMT19NT1VTRV9NSU5PUgk3Ci0jZGVmaW5lIFBDMTEwUEFEX01JTk9SCQk5CisjZGVmaW5lIEFUQVJJTU9VU0VfTUlOT1IJNQkvKiB1bnVzZWQgKi8KKyNkZWZpbmUgU1VOX01PVVNFX01JTk9SCQk2CS8qIHVudXNlZCAqLworI2RlZmluZSBBUE9MTE9fTU9VU0VfTUlOT1IJNwkvKiB1bnVzZWQgKi8KKyNkZWZpbmUgUEMxMTBQQURfTUlOT1IJCTkJLyogdW51c2VkICovCiAvKiNkZWZpbmUgQURCX01PVVNFX01JTk9SCTEwCUZJWE1FIE9CU09MRVRFICovCiAjZGVmaW5lIFdBVENIRE9HX01JTk9SCQkxMzAJLyogV2F0Y2hkb2cgdGltZXIgICAgICovCiAjZGVmaW5lIFRFTVBfTUlOT1IJCTEzMQkvKiBUZW1wZXJhdHVyZSBTZW5zb3IgKi8KICNkZWZpbmUgUlRDX01JTk9SCQkxMzUKICNkZWZpbmUgRUZJX1JUQ19NSU5PUgkJMTM2CS8qIEVGSSBUaW1lIHNlcnZpY2VzICovCiAjZGVmaW5lIFNVTl9PUEVOUFJPTV9NSU5PUgkxMzkKLSNkZWZpbmUgRE1BUElfTUlOT1IJCTE0MAkvKiBETUFQSSAqLworI2RlZmluZSBETUFQSV9NSU5PUgkJMTQwCS8qIHVudXNlZCAqLwogI2RlZmluZSBOVlJBTV9NSU5PUgkJMTQ0CiAjZGVmaW5lIFNHSV9NTVRJTUVSCQkxNTMKLSNkZWZpbmUgU1RPUkVfUVVFVUVfTUlOT1IJMTU1CisjZGVmaW5lIFNUT1JFX1FVRVVFX01JTk9SCTE1NQkvKiB1bnVzZWQgKi8KICNkZWZpbmUgSTJPX01JTk9SCQkxNjYKICNkZWZpbmUgTUlDUk9DT0RFX01JTk9SCQkxODQKICNkZWZpbmUgVkZJT19NSU5PUgkJMTk2CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggYTBkZjQyOS4uMmVlYzYxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW0uaApAQCAtMTc1Niw2ICsxNzU2LDkgQEAKIGV4dGVybiBzdHJ1Y3QgZmlsZSAqZ2V0X21tX2V4ZV9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKIAogZXh0ZXJuIGludCBtYXlfZXhwYW5kX3ZtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIG5wYWdlcyk7CitleHRlcm4gc3RydWN0IHZtX2FyZWFfc3RydWN0ICpfaW5zdGFsbF9zcGVjaWFsX21hcHBpbmcoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKTsKIGV4dGVybiBpbnQgaW5zdGFsbF9zcGVjaWFsX21hcHBpbmcoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKIAkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmggYi9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5oCmluZGV4IDQ1ZTkyMTQuLjlhMTY1YTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tb2RfZGV2aWNldGFibGUuaApAQCAtNDMyLDYgKzQzMiwxNCBAQAogCWtlcm5lbF91bG9uZ190IGRyaXZlcl9kYXRhOwkvKiBEYXRhIHByaXZhdGUgdG8gdGhlIGRyaXZlciAqLwogfTsKIAorI2RlZmluZSBTUE1JX05BTUVfU0laRQkzMgorI2RlZmluZSBTUE1JX01PRFVMRV9QUkVGSVggInNwbWk6IgorCitzdHJ1Y3Qgc3BtaV9kZXZpY2VfaWQgeworCWNoYXIgbmFtZVtTUE1JX05BTUVfU0laRV07CisJa2VybmVsX3Vsb25nX3QgZHJpdmVyX2RhdGE7CS8qIERhdGEgcHJpdmF0ZSB0byB0aGUgZHJpdmVyICovCit9OworCiAvKiBkbWkgKi8KIGVudW0gZG1pX2ZpZWxkIHsKIAlETUlfTk9ORSwKQEAgLTU2NCw2ICs1NzIsMTUgQEAKICNkZWZpbmUgWDg2X01PREVMX0FOWSAgMAogI2RlZmluZSBYODZfRkVBVFVSRV9BTlkgMAkvKiBTYW1lIGFzIEZQVSwgeW91IGNhbid0IHRlc3QgZm9yIHRoYXQgKi8KIAorLyoKKyAqIEdlbmVyaWMgdGFibGUgdHlwZSBmb3IgbWF0Y2hpbmcgQ1BVIGZlYXR1cmVzLgorICogQGZlYXR1cmU6CXRoZSBiaXQgbnVtYmVyIG9mIHRoZSBmZWF0dXJlICgwIC0gNjU1MzUpCisgKi8KKworc3RydWN0IGNwdV9mZWF0dXJlIHsKKwlfX3UxNglmZWF0dXJlOworfTsKKwogI2RlZmluZSBJUEFDS19BTllfRk9STUFUIDB4ZmYKICNkZWZpbmUgSVBBQ0tfQU5ZX0lEICh+MCkKIHN0cnVjdCBpcGFja19kZXZpY2VfaWQgewpAQCAtNTk5LDQgKzYxNiw5IEBACiAJX191MTYgYXNtX2RpZCwgYXNtX3ZpZDsKIH07CiAKK3N0cnVjdCBtY2JfZGV2aWNlX2lkIHsKKwlfX3UxNiBkZXZpY2U7CisJa2VybmVsX3Vsb25nX3QgZHJpdmVyX2RhdGE7Cit9OworCiAjZW5kaWYgLyogTElOVVhfTU9EX0RFVklDRVRBQkxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2YuaCBiL2luY2x1ZGUvbGludXgvb2YuaAppbmRleCA0MzVjYjk5Li44M2QxYWM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mLmgKKysrIGIvaW5jbHVkZS9saW51eC9vZi5oCkBAIC0xOTgsNiArMTk4LDggQEAKIGV4dGVybiBzdHJ1Y3QgcHJvcGVydHkgKm9mX2ZpbmRfcHJvcGVydHkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJCSBpbnQgKmxlbnApOworZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9jb3VudF9lbGVtc19vZl9zaXplKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIGludCBlbGVtX3NpemUpOwogZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCSAgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwKIAkJCQkgICAgICAgdTMyIGluZGV4LCB1MzIgKm91dF92YWx1ZSk7CkBAIC0zOTAsNiArMzkyLDEyIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG9mX3Byb3BlcnR5X2NvdW50X2VsZW1zX29mX3NpemUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCWNvbnN0IGNoYXIgKnByb3BuYW1lLCBpbnQgZWxlbV9zaXplKQoreworCXJldHVybiAtRU5PU1lTOworfQorCiBzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIHUzMiBpbmRleCwgdTMyICpvdXRfdmFsdWUpCiB7CkBAIC01MzYsNiArNTQ0LDc0IEBACiB9CiAKIC8qKgorICogb2ZfcHJvcGVydHlfY291bnRfdThfZWxlbXMgLSBDb3VudCB0aGUgbnVtYmVyIG9mIHU4IGVsZW1lbnRzIGluIGEgcHJvcGVydHkKKyAqCisgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgorICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KKyAqCisgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZSBhbmQgY291bnQgdGhlIG51bWJlciBvZiB1OCBlbGVtZW50cworICogaW4gaXQuIFJldHVybnMgbnVtYmVyIG9mIGVsZW1lbnRzIG9uIHN1Y2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkgZG9lcworICogbm90IGV4aXN0IG9yIGl0cyBsZW5ndGggZG9lcyBub3QgbWF0Y2ggYSBtdWx0aXBsZSBvZiB1OCBhbmQgLUVOT0RBVEEgaWYgdGhlCisgKiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG9mX3Byb3BlcnR5X2NvdW50X3U4X2VsZW1zKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJY29uc3QgY2hhciAqcHJvcG5hbWUpCit7CisJcmV0dXJuIG9mX3Byb3BlcnR5X2NvdW50X2VsZW1zX29mX3NpemUobnAsIHByb3BuYW1lLCBzaXplb2YodTgpKTsKK30KKworLyoqCisgKiBvZl9wcm9wZXJ0eV9jb3VudF91MTZfZWxlbXMgLSBDb3VudCB0aGUgbnVtYmVyIG9mIHUxNiBlbGVtZW50cyBpbiBhIHByb3BlcnR5CisgKgorICogQG5wOgkJZGV2aWNlIG5vZGUgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdG8gYmUgcmVhZC4KKyAqIEBwcm9wbmFtZToJbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2VhcmNoZWQuCisgKgorICogU2VhcmNoIGZvciBhIHByb3BlcnR5IGluIGEgZGV2aWNlIG5vZGUgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgdTE2IGVsZW1lbnRzCisgKiBpbiBpdC4gUmV0dXJucyBudW1iZXIgb2YgZWxlbWVudHMgb24gc3VjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eSBkb2VzCisgKiBub3QgZXhpc3Qgb3IgaXRzIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBhIG11bHRpcGxlIG9mIHUxNiBhbmQgLUVOT0RBVEEgaWYgdGhlCisgKiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG9mX3Byb3BlcnR5X2NvdW50X3UxNl9lbGVtcyhjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCWNvbnN0IGNoYXIgKnByb3BuYW1lKQoreworCXJldHVybiBvZl9wcm9wZXJ0eV9jb3VudF9lbGVtc19vZl9zaXplKG5wLCBwcm9wbmFtZSwgc2l6ZW9mKHUxNikpOworfQorCisvKioKKyAqIG9mX3Byb3BlcnR5X2NvdW50X3UzMl9lbGVtcyAtIENvdW50IHRoZSBudW1iZXIgb2YgdTMyIGVsZW1lbnRzIGluIGEgcHJvcGVydHkKKyAqCisgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgorICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KKyAqCisgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZSBhbmQgY291bnQgdGhlIG51bWJlciBvZiB1MzIgZWxlbWVudHMKKyAqIGluIGl0LiBSZXR1cm5zIG51bWJlciBvZiBlbGVtZW50cyBvbiBzdWNlc3MsIC1FSU5WQUwgaWYgdGhlIHByb3BlcnR5IGRvZXMKKyAqIG5vdCBleGlzdCBvciBpdHMgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGEgbXVsdGlwbGUgb2YgdTMyIGFuZCAtRU5PREFUQSBpZiB0aGUKKyAqIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgb2ZfcHJvcGVydHlfY291bnRfdTMyX2VsZW1zKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJY29uc3QgY2hhciAqcHJvcG5hbWUpCit7CisJcmV0dXJuIG9mX3Byb3BlcnR5X2NvdW50X2VsZW1zX29mX3NpemUobnAsIHByb3BuYW1lLCBzaXplb2YodTMyKSk7Cit9CisKKy8qKgorICogb2ZfcHJvcGVydHlfY291bnRfdTY0X2VsZW1zIC0gQ291bnQgdGhlIG51bWJlciBvZiB1NjQgZWxlbWVudHMgaW4gYSBwcm9wZXJ0eQorICoKKyAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCisgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgorICoKKyAqIFNlYXJjaCBmb3IgYSBwcm9wZXJ0eSBpbiBhIGRldmljZSBub2RlIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIHU2NCBlbGVtZW50cworICogaW4gaXQuIFJldHVybnMgbnVtYmVyIG9mIGVsZW1lbnRzIG9uIHN1Y2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkgZG9lcworICogbm90IGV4aXN0IG9yIGl0cyBsZW5ndGggZG9lcyBub3QgbWF0Y2ggYSBtdWx0aXBsZSBvZiB1NjQgYW5kIC1FTk9EQVRBIGlmIHRoZQorICogcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLgorICovCitzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9jb3VudF91NjRfZWxlbXMoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQljb25zdCBjaGFyICpwcm9wbmFtZSkKK3sKKwlyZXR1cm4gb2ZfcHJvcGVydHlfY291bnRfZWxlbXNfb2Zfc2l6ZShucCwgcHJvcG5hbWUsIHNpemVvZih1NjQpKTsKK30KKworLyoqCiAgKiBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wgLSBGaW5kZnJvbSBhIHByb3BlcnR5CiAgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgogICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2ZfZ3JhcGguaCBiL2luY2x1ZGUvbGludXgvb2ZfZ3JhcGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWZlZjQyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9vZl9ncmFwaC5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBPRiBncmFwaCBiaW5kaW5nIHBhcnNpbmcgaGVscGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTMgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcjogU3lsd2VzdGVyIE5hd3JvY2tpIDxzLm5hd3JvY2tpQHNhbXN1bmcuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBSZW5lc2FzIEVsZWN0cm9uaWNzIENvcnAuCisgKiBBdXRob3I6IEd1ZW5uYWRpIExpYWtob3ZldHNraSA8Zy5saWFraG92ZXRza2lAZ214LmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpZm5kZWYgX19MSU5VWF9PRl9HUkFQSF9ICisjZGVmaW5lIF9fTElOVVhfT0ZfR1JBUEhfSAorCisvKioKKyAqIHN0cnVjdCBvZl9lbmRwb2ludCAtIHRoZSBPRiBncmFwaCBlbmRwb2ludCBkYXRhIHN0cnVjdHVyZQorICogQHBvcnQ6IGlkZW50aWZpZXIgKHZhbHVlIG9mIHJlZyBwcm9wZXJ0eSkgb2YgYSBwb3J0IHRoaXMgZW5kcG9pbnQgYmVsb25ncyB0bworICogQGlkOiBpZGVudGlmaWVyICh2YWx1ZSBvZiByZWcgcHJvcGVydHkpIG9mIHRoaXMgZW5kcG9pbnQKKyAqIEBsb2NhbF9ub2RlOiBwb2ludGVyIHRvIGRldmljZV9ub2RlIG9mIHRoaXMgZW5kcG9pbnQKKyAqLworc3RydWN0IG9mX2VuZHBvaW50IHsKKwl1bnNpZ25lZCBpbnQgcG9ydDsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpsb2NhbF9ub2RlOworfTsKKworI2lmZGVmIENPTkZJR19PRgoraW50IG9mX2dyYXBoX3BhcnNlX2VuZHBvaW50KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQlzdHJ1Y3Qgb2ZfZW5kcG9pbnQgKmVuZHBvaW50KTsKK3N0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZ3JhcGhfZ2V0X25leHRfZW5kcG9pbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsCisJCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcHJldmlvdXMpOworc3RydWN0IGRldmljZV9ub2RlICpvZl9ncmFwaF9nZXRfcmVtb3RlX3BvcnRfcGFyZW50KAorCQkJCQljb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpOworc3RydWN0IGRldmljZV9ub2RlICpvZl9ncmFwaF9nZXRfcmVtb3RlX3BvcnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IG9mX2dyYXBoX3BhcnNlX2VuZHBvaW50KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkJc3RydWN0IG9mX2VuZHBvaW50ICplbmRwb2ludCkKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dyYXBoX2dldF9uZXh0X2VuZHBvaW50KAorCQkJCQljb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwKKwkJCQkJc3RydWN0IGRldmljZV9ub2RlICpwcmV2aW91cykKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQoCisJCQkJCWNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydCgKKwkJCQkJY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXJldHVybiBOVUxMOworfQorCisjZW5kaWYgLyogQ09ORklHX09GICovCisKKyNlbmRpZiAvKiBfX0xJTlVYX09GX0dSQVBIX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLWFjcGkuaCBiL2luY2x1ZGUvbGludXgvcGNpLWFjcGkuaAppbmRleCA1YTQ2MmM0Li42MzdhNjA4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS1hY3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2ktYWNwaS5oCkBAIC01OSwxMiArNTksMTIgQEAKIHZvaWQgYWNwaXBocF9pbml0KHZvaWQpOwogdm9pZCBhY3BpcGhwX2VudW1lcmF0ZV9zbG90cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIHZvaWQgYWNwaXBocF9yZW1vdmVfc2xvdHMoc3RydWN0IHBjaV9idXMgKmJ1cyk7Ci12b2lkIGFjcGlwaHBfY2hlY2tfaG9zdF9icmlkZ2UoYWNwaV9oYW5kbGUgaGFuZGxlKTsKK3ZvaWQgYWNwaXBocF9jaGVja19ob3N0X2JyaWRnZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpcGhwX2luaXQodm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaXBocF9lbnVtZXJhdGVfc2xvdHMoc3RydWN0IHBjaV9idXMgKmJ1cykgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaXBocF9yZW1vdmVfc2xvdHMoc3RydWN0IHBjaV9idXMgKmJ1cykgeyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgYWNwaXBocF9jaGVja19ob3N0X2JyaWRnZShhY3BpX2hhbmRsZSBoYW5kbGUpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIGFjcGlwaHBfY2hlY2tfaG9zdF9icmlkZ2Uoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KSB7IH0KICNlbmRpZgogCiAjZWxzZQkvKiBDT05GSUdfQUNQSSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNpLmgKaW5kZXggMzNhYTJjYS4uYWFiNTdiNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pcnFyZXR1cm4uaD4KICNpbmNsdWRlIDx1YXBpL2xpbnV4L3BjaS5oPgogCiAjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgpAQCAtMTcwLDYgKzE2OSw4IEBACiAJUENJX0RFVl9GTEFHU19OT19EMyA9IChfX2ZvcmNlIHBjaV9kZXZfZmxhZ3NfdCkgMiwKIAkvKiBQcm92aWRlIGluZGljYXRpb24gZGV2aWNlIGlzIGFzc2lnbmVkIGJ5IGEgVmlydHVhbCBNYWNoaW5lIE1hbmFnZXIgKi8KIAlQQ0lfREVWX0ZMQUdTX0FTU0lHTkVEID0gKF9fZm9yY2UgcGNpX2Rldl9mbGFnc190KSA0LAorCS8qIEZsYWcgZm9yIHF1aXJrIHVzZSB0byBzdG9yZSBpZiBxdWlyay1zcGVjaWZpYyBBQ1MgaXMgZW5hYmxlZCAqLworCVBDSV9ERVZfRkxBR1NfQUNTX0VOQUJMRURfUVVJUksgPSAoX19mb3JjZSBwY2lfZGV2X2ZsYWdzX3QpIDgsCiB9OwogCiBlbnVtIHBjaV9pcnFfcmVyb3V0ZV92YXJpYW50IHsKQEAgLTQ2MSw3ICs0NjIsNiBAQAogCXVuc2lnbmVkIGludAkJaXNfYWRkZWQ6MTsKIH07CiAKLSNkZWZpbmUgcGNpX2J1c19iKG4pCWxpc3RfZW50cnkobiwgc3RydWN0IHBjaV9idXMsIG5vZGUpCiAjZGVmaW5lIHRvX3BjaV9idXMobikJY29udGFpbmVyX29mKG4sIHN0cnVjdCBwY2lfYnVzLCBkZXYpCiAKIC8qCkBAIC0xMDY2LDcgKzEwNjYsNyBAQAogaW50IF9fbXVzdF9jaGVjayBwY2lfYnVzX2FsbG9jX3Jlc291cmNlKHN0cnVjdCBwY2lfYnVzICpidXMsCiAJCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgcmVzb3VyY2Vfc2l6ZV90IHNpemUsCiAJCQlyZXNvdXJjZV9zaXplX3QgYWxpZ24sIHJlc291cmNlX3NpemVfdCBtaW4sCi0JCQl1bnNpZ25lZCBpbnQgdHlwZV9tYXNrLAorCQkJdW5zaWduZWQgbG9uZyB0eXBlX21hc2ssCiAJCQlyZXNvdXJjZV9zaXplX3QgKCphbGlnbmYpKHZvaWQgKiwKIAkJCQkJCSAgY29uc3Qgc3RydWN0IHJlc291cmNlICosCiAJCQkJCQkgIHJlc291cmNlX3NpemVfdCwKQEAgLTE1MzAsNiArMTUzMCw3IEBACiB2b2lkIHBjaV9maXh1cF9kZXZpY2UoZW51bSBwY2lfZml4dXBfcGFzcyBwYXNzLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIHN0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X2RtYV9zb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldik7CiBpbnQgcGNpX2Rldl9zcGVjaWZpY19hY3NfZW5hYmxlZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1MTYgYWNzX2ZsYWdzKTsKK3ZvaWQgcGNpX2Rldl9zcGVjaWZpY19lbmFibGVfYWNzKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2lfZml4dXBfZGV2aWNlKGVudW0gcGNpX2ZpeHVwX3Bhc3MgcGFzcywKIAkJCQkgICAgc3RydWN0IHBjaV9kZXYgKmRldikgeyB9CkBAIC0xNTQyLDYgKzE1NDMsNyBAQAogewogCXJldHVybiAtRU5PVFRZOwogfQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9kZXZfc3BlY2lmaWNfZW5hYmxlX2FjcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IH0KICNlbmRpZgogCiB2b2lkIF9faW9tZW0gKnBjaW1faW9tYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBiYXIsIHVuc2lnbmVkIGxvbmcgbWF4bGVuKTsKQEAgLTE1OTcsNyArMTU5OSw2IEBACiAjaWZkZWYgQ09ORklHX1BDSV9JT1YKIGludCBwY2lfZW5hYmxlX3NyaW92KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBucl92aXJ0Zm4pOwogdm9pZCBwY2lfZGlzYWJsZV9zcmlvdihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLWlycXJldHVybl90IHBjaV9zcmlvdl9taWdyYXRpb24oc3RydWN0IHBjaV9kZXYgKmRldik7CiBpbnQgcGNpX251bV92ZihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGludCBwY2lfdmZzX2Fzc2lnbmVkKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogaW50IHBjaV9zcmlvdl9zZXRfdG90YWx2ZnMoc3RydWN0IHBjaV9kZXYgKmRldiwgdTE2IG51bXZmcyk7CkBAIC0xNjA2LDggKzE2MDcsNiBAQAogc3RhdGljIGlubGluZSBpbnQgcGNpX2VuYWJsZV9zcmlvdihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbnJfdmlydGZuKQogeyByZXR1cm4gLUVOT0RFVjsgfQogc3RhdGljIGlubGluZSB2b2lkIHBjaV9kaXNhYmxlX3NyaW92KHN0cnVjdCBwY2lfZGV2ICpkZXYpIHsgfQotc3RhdGljIGlubGluZSBpcnFyZXR1cm5fdCBwY2lfc3Jpb3ZfbWlncmF0aW9uKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17IHJldHVybiBJUlFfTk9ORTsgfQogc3RhdGljIGlubGluZSBpbnQgcGNpX251bV92ZihzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBwY2lfdmZzX2Fzc2lnbmVkKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7IHJldHVybiAwOyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaCBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCmluZGV4IDczOTllNmEuLmQ0ZGUyNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCkBAIC01MjgsNiArNTI4LDggQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTVIX05CX0Y1CTB4MTYwNQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF8xNkhfTkJfRjMJMHgxNTMzCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzE2SF9OQl9GNAkweDE1MzQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTZIX00zMEhfTkJfRjMgMHgxNTgzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzE2SF9NMzBIX05CX0Y0IDB4MTU4NAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9DTkIxN0hfRjMJMHgxNzAzCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0xBTkNFCQkweDIwMDAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfTEFOQ0VfSE9NRQkweDIwMDEKQEAgLTcyNiw2ICs3MjgsNyBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTgJCTB4NzAxOAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfSFAJCTB4MTAzYworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0hQXzNQQVIJCTB4MTU5MAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0hQX1ZJU1VBTElaRV9FRwkweDEwMDUKICNkZWZpbmUgUENJX0RFVklDRV9JRF9IUF9WSVNVQUxJWkVfRlg2CTB4MTAwNgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0hQX1ZJU1VBTElaRV9GWDQJMHgxMDA4CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9vbWFwX2NvbnRyb2xfdXNiLmggYi9pbmNsdWRlL2xpbnV4L3BoeS9vbWFwX2NvbnRyb2xfcGh5LmgKc2ltaWxhcml0eSBpbmRleCA2NyUKcmVuYW1lIGZyb20gaW5jbHVkZS9saW51eC91c2Ivb21hcF9jb250cm9sX3VzYi5oCnJlbmFtZSB0byBpbmNsdWRlL2xpbnV4L3BoeS9vbWFwX2NvbnRyb2xfcGh5LmgKaW5kZXggNjlhZTM4My4uNTQ1MDQwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2Ivb21hcF9jb250cm9sX3VzYi5oCisrKyBiL2luY2x1ZGUvbGludXgvcGh5L29tYXBfY29udHJvbF9waHkuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBvbWFwX2NvbnRyb2xfdXNiLmggLSBIZWFkZXIgZmlsZSBmb3IgdGhlIFVTQiBwYXJ0IG9mIGNvbnRyb2wgbW9kdWxlLgorICogb21hcF9jb250cm9sX3BoeS5oIC0gSGVhZGVyIGZpbGUgZm9yIHRoZSBQSFkgcGFydCBvZiBjb250cm9sIG1vZHVsZS4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20KICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0xNiwxMCArMTYsMTAgQEAKICAqCiAgKi8KIAotI2lmbmRlZiBfX09NQVBfQ09OVFJPTF9VU0JfSF9fCi0jZGVmaW5lIF9fT01BUF9DT05UUk9MX1VTQl9IX18KKyNpZm5kZWYgX19PTUFQX0NPTlRST0xfUEhZX0hfXworI2RlZmluZSBfX09NQVBfQ09OVFJPTF9QSFlfSF9fCiAKLWVudW0gb21hcF9jb250cm9sX3VzYl90eXBlIHsKK2VudW0gb21hcF9jb250cm9sX3BoeV90eXBlIHsKIAlPTUFQX0NUUkxfVFlQRV9PVEdIUyA9IDEsCS8qIE1haWxib3ggT1RHSFNfQ09OVFJPTCAqLwogCU9NQVBfQ1RSTF9UWVBFX1VTQjIsCS8qIFVTQjJfUEhZLCBwb3dlciBkb3duIGluIENPTlRST0xfREVWX0NPTkYgKi8KIAlPTUFQX0NUUkxfVFlQRV9QSVBFMywJLyogUElQRTMgUEhZLCBEUExMICYgc2VwZXJhdGUgUngvVHggcG93ZXIgKi8KQEAgLTI3LDcgKzI3LDcgQEAKIAlPTUFQX0NUUkxfVFlQRV9BTTQzN1VTQjIsIC8qIFVTQjIgUEhZLCBwb3dlciBlLmcuIEFNNDM3eCAqLwogfTsKIAotc3RydWN0IG9tYXBfY29udHJvbF91c2Igeworc3RydWN0IG9tYXBfY29udHJvbF9waHkgewogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAogCXUzMiBfX2lvbWVtICpvdGdoc19jb250cm9sOwpAQCAtMzYsNyArMzYsNyBAQAogCiAJc3RydWN0IGNsayAqc3lzX2NsazsKIAotCWVudW0gb21hcF9jb250cm9sX3VzYl90eXBlIHR5cGU7CisJZW51bSBvbWFwX2NvbnRyb2xfcGh5X3R5cGUgdHlwZTsKIH07CiAKIGVudW0gb21hcF9jb250cm9sX3VzYl9tb2RlIHsKQEAgLTU0LDE0ICs1NCwxNCBAQAogI2RlZmluZQlPTUFQX0NUUkxfREVWX1NFU1NFTkQJCUJJVCgzKQogI2RlZmluZQlPTUFQX0NUUkxfREVWX0lERElHCQlCSVQoNCkKIAotI2RlZmluZQlPTUFQX0NUUkxfVVNCX1BXUkNUTF9DTEtfQ01EX01BU0sJMHgwMDNGQzAwMAotI2RlZmluZQlPTUFQX0NUUkxfVVNCX1BXUkNUTF9DTEtfQ01EX1NISUZUCTB4RQorI2RlZmluZQlPTUFQX0NUUkxfUElQRTNfUEhZX1BXUkNUTF9DTEtfQ01EX01BU0sJCTB4MDAzRkMwMDAKKyNkZWZpbmUJT01BUF9DVFJMX1BJUEUzX1BIWV9QV1JDVExfQ0xLX0NNRF9TSElGVAkweEUKIAotI2RlZmluZQlPTUFQX0NUUkxfVVNCX1BXUkNUTF9DTEtfRlJFUV9NQVNLCTB4RkZDMDAwMDAKLSNkZWZpbmUJT01BUF9DVFJMX1VTQl9QV1JDVExfQ0xLX0ZSRVFfU0hJRlQJMHgxNgorI2RlZmluZQlPTUFQX0NUUkxfUElQRTNfUEhZX1BXUkNUTF9DTEtfRlJFUV9NQVNLCTB4RkZDMDAwMDAKKyNkZWZpbmUJT01BUF9DVFJMX1BJUEUzX1BIWV9QV1JDVExfQ0xLX0ZSRVFfU0hJRlQJMHgxNgogCi0jZGVmaW5lCU9NQVBfQ1RSTF9VU0IzX1BIWV9UWF9SWF9QT1dFUk9OCTB4MwotI2RlZmluZQlPTUFQX0NUUkxfVVNCM19QSFlfVFhfUlhfUE9XRVJPRkYJMHgwCisjZGVmaW5lCU9NQVBfQ1RSTF9QSVBFM19QSFlfVFhfUlhfUE9XRVJPTgkweDMKKyNkZWZpbmUJT01BUF9DVFJMX1BJUEUzX1BIWV9UWF9SWF9QT1dFUk9GRgkweDAKIAogI2RlZmluZSBPTUFQX0NUUkxfVVNCMl9QSFlfUEQJCUJJVCgyOCkKIApAQCAtNzAsMTMgKzcwLDEzIEBACiAjZGVmaW5lIEFNNDM3WF9DVFJMX1VTQjJfT1RHVkRFVF9FTglCSVQoMTkpCiAjZGVmaW5lIEFNNDM3WF9DVFJMX1VTQjJfT1RHU0VTU0VORF9FTglCSVQoMjApCiAKLSNpZiBJU19FTkFCTEVEKENPTkZJR19PTUFQX0NPTlRST0xfVVNCKQotZXh0ZXJuIHZvaWQgb21hcF9jb250cm9sX3VzYl9waHlfcG93ZXIoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgb24pOwotZXh0ZXJuIHZvaWQgb21hcF9jb250cm9sX3VzYl9zZXRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JZW51bSBvbWFwX2NvbnRyb2xfdXNiX21vZGUgbW9kZSk7CisjaWYgSVNfRU5BQkxFRChDT05GSUdfT01BUF9DT05UUk9MX1BIWSkKK3ZvaWQgb21hcF9jb250cm9sX3BoeV9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBvbik7Cit2b2lkIG9tYXBfY29udHJvbF91c2Jfc2V0X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIGVudW0gb21hcF9jb250cm9sX3VzYl9tb2RlIG1vZGUpOwogI2Vsc2UKIAotc3RhdGljIGlubGluZSB2b2lkIG9tYXBfY29udHJvbF91c2JfcGh5X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG9uKQorc3RhdGljIGlubGluZSB2b2lkIG9tYXBfY29udHJvbF9waHlfcG93ZXIoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgb24pCiB7CiB9CiAKQEAgLTg2LDQgKzg2LDQgQEAKIH0KICNlbmRpZgogCi0jZW5kaWYJLyogX19PTUFQX0NPTlRST0xfVVNCX0hfXyAqLworI2VuZGlmCS8qIF9fT01BUF9DT05UUk9MX1BIWV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL29tYXBfdXNiLmggYi9pbmNsdWRlL2xpbnV4L3BoeS9vbWFwX3VzYi5oCnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbGludXgvdXNiL29tYXBfdXNiLmgKcmVuYW1lIHRvIGluY2x1ZGUvbGludXgvcGh5L29tYXBfdXNiLmgKaW5kZXggNmFlMjkzNi4uZGMyYzU0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2Ivb21hcF91c2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BoeS9vbWFwX3VzYi5oCkBAIC0zNCwxNCArMzQsMjQgQEAKIAlzdHJ1Y3QgdXNiX3BoeQkJcGh5OwogCXN0cnVjdCBwaHlfY29tcGFuaW9uCSpjb21wYXJhdG9yOwogCXZvaWQgX19pb21lbQkJKnBsbF9jdHJsX2Jhc2U7CisJdm9pZCBfX2lvbWVtCQkqcGh5X2Jhc2U7CiAJc3RydWN0IGRldmljZQkJKmRldjsKIAlzdHJ1Y3QgZGV2aWNlCQkqY29udHJvbF9kZXY7CiAJc3RydWN0IGNsawkJKndrdXBjbGs7Ci0Jc3RydWN0IGNsawkJKnN5c19jbGs7CiAJc3RydWN0IGNsawkJKm9wdGNsazsKLQl1OAkJCWlzX3N1c3BlbmRlZDoxOworCXU4CQkJZmxhZ3M7CiB9OwogCitzdHJ1Y3QgdXNiX3BoeV9kYXRhIHsKKwljb25zdCBjaGFyICpsYWJlbDsKKwl1OCBmbGFnczsKK307CisKKy8qIERyaXZlciBGbGFncyAqLworI2RlZmluZSBPTUFQX1VTQjJfSEFTX1NUQVJUX1NSUCAoMSA8PCAwKQorI2RlZmluZSBPTUFQX1VTQjJfSEFTX1NFVF9WQlVTICgxIDw8IDEpCisjZGVmaW5lIE9NQVBfVVNCMl9DQUxJQlJBVEVfRkFMU0VfRElTQ09OTkVDVCAoMSA8PCAyKQorCiAjZGVmaW5lCXBoeV90b19vbWFwdXNiKHgpCWNvbnRhaW5lcl9vZigoeCksIHN0cnVjdCBvbWFwX3VzYiwgcGh5KQogCiAjaWYgZGVmaW5lZChDT05GSUdfT01BUF9VU0IyKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQX1VTQjJfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waHkvcGh5LmggYi9pbmNsdWRlL2xpbnV4L3BoeS9waHkuaAppbmRleCAzZjgzNDU5Li5lMmY1Y2E5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BoeS9waHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BoeS9waHkuaApAQCAtMTQ5LDggKzE0OSwxMSBAQAogc3RydWN0IHBoeSAqcGh5X29wdGlvbmFsX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKnN0cmluZyk7CiBzdHJ1Y3QgcGh5ICpkZXZtX3BoeV9nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpzdHJpbmcpOwogc3RydWN0IHBoeSAqZGV2bV9waHlfb3B0aW9uYWxfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqc3RyaW5nKTsKK3N0cnVjdCBwaHkgKmRldm1fb2ZfcGh5X2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkgICAgY29uc3QgY2hhciAqY29uX2lkKTsKIHZvaWQgcGh5X3B1dChzdHJ1Y3QgcGh5ICpwaHkpOwogdm9pZCBkZXZtX3BoeV9wdXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGh5ICpwaHkpOworc3RydWN0IHBoeSAqb2ZfcGh5X2dldChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpjb25faWQpOwogc3RydWN0IHBoeSAqb2ZfcGh5X3NpbXBsZV94bGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqYXJncyk7CiBzdHJ1Y3QgcGh5ICpwaHlfY3JlYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IHBoeV9vcHMgKm9wcywKQEAgLTI1MSw2ICsyNTQsMTMgQEAKIAlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgcGh5ICpkZXZtX29mX3BoeV9nZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCSAgY29uc3QgY2hhciAqY29uX2lkKQoreworCXJldHVybiBFUlJfUFRSKC1FTk9TWVMpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgcGh5X3B1dChzdHJ1Y3QgcGh5ICpwaHkpCiB7CiB9CkBAIC0yNTksNiArMjY5LDExIEBACiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBoeSAqb2ZfcGh5X2dldChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpjb25faWQpCit7CisJcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBoeSAqb2ZfcGh5X3NpbXBsZV94bGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqYXJncykKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9hZGF1MTk3Ny5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2FkYXUxOTc3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkMTFkOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9hZGF1MTk3Ny5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBBREFVMTk3Ny9BREFVMTk3OC9BREFVMTk3OSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgQXV0aG9yOiBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1BMQVRGT1JNX0RBVEFfQURBVTE5NzdfSF9fCisjZGVmaW5lIF9fTElOVVhfUExBVEZPUk1fREFUQV9BREFVMTk3N19IX18KKworLyoqCisgKiBlbnVtIGFkYXUxOTc3X21pY2JpYXMgLSBBREFVMTk3NyBNSUNCSUFTIHBpbiB2b2x0YWdlIHNldHRpbmcKKyAqIEBBREFVMTk3N19NSUNCSUFTXzVWMDogTUlDQklBUyBpcyBzZXQgdG8gNS4wIFYKKyAqIEBBREFVMTk3N19NSUNCSUFTXzVWNTogTUlDQklBUyBpcyBzZXQgdG8gNS41IFYKKyAqIEBBREFVMTk3N19NSUNCSUFTXzZWMDogTUlDQklBUyBpcyBzZXQgdG8gNi4wIFYKKyAqIEBBREFVMTk3N19NSUNCSUFTXzZWNTogTUlDQklBUyBpcyBzZXQgdG8gNi41IFYKKyAqIEBBREFVMTk3N19NSUNCSUFTXzdWMDogTUlDQklBUyBpcyBzZXQgdG8gNy4wIFYKKyAqIEBBREFVMTk3N19NSUNCSUFTXzdWNTogTUlDQklBUyBpcyBzZXQgdG8gNy41IFYKKyAqIEBBREFVMTk3N19NSUNCSUFTXzhWMDogTUlDQklBUyBpcyBzZXQgdG8gOC4wIFYKKyAqIEBBREFVMTk3N19NSUNCSUFTXzhWNTogTUlDQklBUyBpcyBzZXQgdG8gOC41IFYKKyAqIEBBREFVMTk3N19NSUNCSUFTXzlWMDogTUlDQklBUyBpcyBzZXQgdG8gOS4wIFYKKyAqLworZW51bSBhZGF1MTk3N19taWNiaWFzIHsKKwlBREFVMTk3N19NSUNCSUFTXzVWMCA9IDB4MCwKKwlBREFVMTk3N19NSUNCSUFTXzVWNSA9IDB4MSwKKwlBREFVMTk3N19NSUNCSUFTXzZWMCA9IDB4MiwKKwlBREFVMTk3N19NSUNCSUFTXzZWNSA9IDB4MywKKwlBREFVMTk3N19NSUNCSUFTXzdWMCA9IDB4NCwKKwlBREFVMTk3N19NSUNCSUFTXzdWNSA9IDB4NSwKKwlBREFVMTk3N19NSUNCSUFTXzhWMCA9IDB4NiwKKwlBREFVMTk3N19NSUNCSUFTXzhWNSA9IDB4NywKKwlBREFVMTk3N19NSUNCSUFTXzlWMCA9IDB4OCwKK307CisKKy8qKgorICogc3RydWN0IGFkYXUxOTc3X3BsYXRmb3JtX2RhdGEgLSBQbGF0Zm9ybSBjb25maWd1cmF0aW9uIGRhdGEgZm9yIHRoZSBBREFVMTk3NworICogQG1pY2JpYXM6IFNwZWNpZmllcyB0aGUgdm9sdGFnZSBmb3IgdGhlIE1JQ0JJQVMgcGluCisgKi8KK3N0cnVjdCBhZGF1MTk3N19wbGF0Zm9ybV9kYXRhIHsKKwllbnVtIGFkYXUxOTc3X21pY2JpYXMgbWljYmlhczsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2Fzb2MtczNjLmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvYXNvYy1zM2MuaAppbmRleCA5ZWZjMDRkLi43MDljNmY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvYXNvYy1zM2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvYXNvYy1zM2MuaApAQCAtMSw1ICsxLDQgQEAKLS8qIGFyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvYXVkaW8uaAotICoKKy8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTHRkCiAgKiBBdXRob3I6IEphc3dpbmRlciBTaW5naCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4KICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvYXNvYy1zM2MyNHh4X3NpbXRlYy5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2Fzb2MtczNjMjR4eF9zaW10ZWMuaAppbmRleCAzNzZhZjUyLi5kMjIwZTU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvYXNvYy1zM2MyNHh4X3NpbXRlYy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9hc29jLXMzYzI0eHhfc2ltdGVjLmgKQEAgLTEsNSArMSw0IEBACi0vKiBhcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2F1ZGlvLXNpbXRlYy5oCi0gKgorLyoKICAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwogICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KICAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9idC1ub2tpYS1oNHAuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9idC1ub2tpYS1oNHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGQxNjlkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2J0LW5va2lhLWg0cC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBOb2tpYSBINFAgYmx1ZXRvb3RoIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKworLyoqCisgKiBzdHJ1Y3QgaGNpX2g0cF9wbGF0Zm9ybSBkYXRhIC0gaGNpX2g0cCBQbGF0Zm9ybSBkYXRhIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgaGNpX2g0cF9wbGF0Zm9ybV9kYXRhIHsKKwlpbnQgY2hpcF90eXBlOworCWludCBidF9zeXNjbGs7CisJdW5zaWduZWQgaW50IGJ0X3dha2V1cF9ncGlvOworCXVuc2lnbmVkIGludCBob3N0X3dha2V1cF9ncGlvOworCXVuc2lnbmVkIGludCByZXNldF9ncGlvOworCWludCByZXNldF9ncGlvX3NoYXJlZDsKKwl1bnNpZ25lZCBpbnQgdWFydF9pcnE7CisJcGh5c19hZGRyX3QgdWFydF9iYXNlOworCWNvbnN0IGNoYXIgKnVhcnRfaWNsazsKKwljb25zdCBjaGFyICp1YXJ0X2ZjbGs7CisJdm9pZCAoKnNldF9wbV9saW1pdHMpKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBzZXQpOworfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kYXZpbmNpX2FzcC5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RhdmluY2lfYXNwLmgKaW5kZXggNTI0NTk5Mi4uODVhZDY4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RhdmluY2lfYXNwLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RhdmluY2lfYXNwLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2dlbmFsbG9jLmg+CiAKLXN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSB7CitzdHJ1Y3QgZGF2aW5jaV9tY2FzcF9wZGF0YSB7CiAJdTMyIHR4X2RtYV9vZmZzZXQ7CiAJdTMyIHJ4X2RtYV9vZmZzZXQ7CiAJaW50IGFzcF9jaGFuX3E7CS8qIGV2ZW50IHF1ZXVlIG51bWJlciBmb3IgQVNQIGNoYW5uZWwgKi8KQEAgLTg3LDYgKzg3LDggQEAKIAlpbnQgdHhfZG1hX2NoYW5uZWw7CiAJaW50IHJ4X2RtYV9jaGFubmVsOwogfTsKKy8qIFRPRE86IEZpeCBhcmNoL2FybS9tYWNoLWRhdmluY2kvIHVzZXJzIGFuZCByZW1vdmUgdGhpcyBkZWZpbmUgKi8KKyNkZWZpbmUgc25kX3BsYXRmb3JtX2RhdGEgZGF2aW5jaV9tY2FzcF9wZGF0YQogCiBlbnVtIHsKIAlNQ0FTUF9WRVJTSU9OXzEgPSAwLAkvKiBETTY0NnggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9tYXgzMTB4LmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvbWF4MzEweC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDExZGNkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9tYXgzMTB4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogIE1heGltIChEYWxsYXMpIE1BWDMxMDcvOC85LCBNQVgxNDgzMCBzZXJpYWwgZHJpdmVyCi0gKgotICogIENvcHlyaWdodCAoQykgMjAxMiBBbGV4YW5kZXIgU2hpeWFuIDxzaGNfd29ya0BtYWlsLnJ1PgotICoKLSAqICBCYXNlZCBvbiBtYXgzMTAwLmMsIGJ5IENocmlzdGlhbiBQZWxsZWdyaW4gPGNocmlwZWxsQGV2b2x3YXJlLm9yZz4KLSAqICBCYXNlZCBvbiBtYXgzMTEwLmMsIGJ5IEZlbmcgVGFuZyA8ZmVuZy50YW5nQGludGVsLmNvbT4KLSAqICBCYXNlZCBvbiBtYXgzMTA3LmMsIGJ5IEFhdmFtb2JpbGUKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9NQVgzMTBYX0hfCi0jZGVmaW5lIF9NQVgzMTBYX0hfCi0KLS8qCi0gKiBFeGFtcGxlIGJvYXJkIGluaXRpYWxpemF0aW9uIGRhdGE6Ci0gKgotICogc3RhdGljIHN0cnVjdCBtYXgzMTB4X3BkYXRhIG1heDMxMDdfcGRhdGEgPSB7Ci0gKgkuZHJpdmVyX2ZsYWdzCT0gTUFYMzEwWF9FWFRfQ0xLLAotICoJLnVhcnRfZmxhZ3NbMF0JPSBNQVgzMTBYX0VDSE9fU1VQUkVTUyB8IE1BWDMxMFhfQVVUT19ESVJfQ1RSTCwKLSAqCS5mcmVxdWVuY3kJPSAzNjg2NDAwLAotICoJLmdwaW9fYmFzZQk9IC0xLAotICogfTsKLSAqCi0gKiBzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIHNwaV9kZXZpY2VfbWF4MzEwN1tdID0gewotICoJewotICoJCS5tb2RhbGlhcwk9ICJtYXgzMTA3IiwKLSAqCQkuaXJxCQk9IElSUV9FSU5UMywKLSAqCQkuYnVzX251bQk9IDEsCi0gKgkJLmNoaXBfc2VsZWN0CT0gMSwKLSAqCQkucGxhdGZvcm1fZGF0YQk9ICZtYXgzMTA3X3BkYXRhLAotICoJfSwKLSAqIH07Ci0gKi8KLQotI2RlZmluZSBNQVgzMTBYX01BWF9VQVJUUwk0Ci0KLS8qIE1BWDMxMFggcGxhdGZvcm0gZGF0YSBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCBtYXgzMTB4X3BkYXRhIHsKLQkvKiBGbGFncyBnbG9iYWwgdG8gZHJpdmVyICovCi0JY29uc3QgdTgJCWRyaXZlcl9mbGFnczsKLSNkZWZpbmUgTUFYMzEwWF9FWFRfQ0xLCQkoMHgwMDAwMDAwMSkJLyogRXh0ZXJuYWwgY2xvY2sgZW5hYmxlICovCi0JLyogRmxhZ3MgZ2xvYmFsIHRvIFVBUlQgcG9ydCAqLwotCWNvbnN0IHU4CQl1YXJ0X2ZsYWdzW01BWDMxMFhfTUFYX1VBUlRTXTsKLSNkZWZpbmUgTUFYMzEwWF9MT09QQkFDSwkoMHgwMDAwMDAwMSkJLyogTG9vcGJhY2sgbW9kZSBlbmFibGUgKi8KLSNkZWZpbmUgTUFYMzEwWF9FQ0hPX1NVUFJFU1MJKDB4MDAwMDAwMDIpCS8qIEVuYWJsZSBlY2hvIHN1cHJlc3MgKi8KLSNkZWZpbmUgTUFYMzEwWF9BVVRPX0RJUl9DVFJMCSgweDAwMDAwMDA0KQkvKiBFbmFibGUgQXV0byBkaXJlY3Rpb24KLQkJCQkJCSAqIGNvbnRyb2wgKFJTLTQ4NSkKLQkJCQkJCSAqLwotCS8qIEZyZXF1ZW5jeSAoZXh0cmVuYWwgY2xvY2sgb3IgY3J5c3RhbCkgKi8KLQljb25zdCBpbnQJCWZyZXF1ZW5jeTsKLQkvKiBHUElPIGJhc2UgbnVtYmVyIChjYW4gYmUgbmVnYXRpdmUpICovCi0JY29uc3QgaW50CQlncGlvX2Jhc2U7Ci0JLyogQ2FsbGVkIGR1cmluZyBzdGFydHVwICovCi0Jdm9pZCAoKmluaXQpKHZvaWQpOwotCS8qIENhbGxlZCBiZWZvcmUgZmluaXNoICovCi0Jdm9pZCAoKmV4aXQpKHZvaWQpOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvc2VyaWFsLWlteC5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL3NlcmlhbC1pbXguaAppbmRleCA0YWRlYzliLi4zY2MyZTNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvc2VyaWFsLWlteC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9zZXJpYWwtaW14LmgKQEAgLTIzLDggKzIzLDYgQEAKICNkZWZpbmUgSU1YVUFSVF9JUkRBICAgICAgICAoMTw8MSkKIAogc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB7Ci0JaW50ICgqaW5pdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7Ci0Jdm9pZCAoKmV4aXQpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwogCXVuc2lnbmVkIGludCBmbGFnczsKIAl2b2lkICgqaXJkYV9lbmFibGUpKGludCBlbmFibGUpOwogCXVuc2lnbmVkIGludCBpcmRhX2ludl9yeDoxOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL3NwaS1zM2M2NHh4LmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvc3BpLXMzYzY0eHguaAppbmRleCA4NDQ3ZjYzLi5kMzg4OWI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvc3BpLXMzYzY0eHguaAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvc3BpLXMzYzY0eHguaApAQCAtMSw1ICsxLDQgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjNjR4eC1zcGkuaAotICoKKy8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBMdGQuCiAgKglKYXN3aW5kZXIgU2luZ2ggPGphc3NpLmJyYXJAc2Ftc3VuZy5jb20+CiAgKgpAQCAtOCw4ICs3LDggQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLSNpZm5kZWYgX19TM0M2NFhYX1BMQVRfU1BJX0gKLSNkZWZpbmUgX19TM0M2NFhYX1BMQVRfU1BJX0gKKyNpZm5kZWYgX19TUElfUzNDNjRYWF9ICisjZGVmaW5lIF9fU1BJX1MzQzY0WFhfSAogCiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CiAKQEAgLTY4LDQgKzY3LDQgQEAKIGV4dGVybiBzdHJ1Y3QgczNjNjR4eF9zcGlfaW5mbyBzM2M2NHh4X3NwaTBfcGRhdGE7CiBleHRlcm4gc3RydWN0IHMzYzY0eHhfc3BpX2luZm8gczNjNjR4eF9zcGkxX3BkYXRhOwogZXh0ZXJuIHN0cnVjdCBzM2M2NHh4X3NwaV9pbmZvIHMzYzY0eHhfc3BpMl9wZGF0YTsKLSNlbmRpZiAvKiBfX1MzQzY0WFhfUExBVF9TUElfSCAqLworI2VuZGlmIC8qX19TUElfUzNDNjRYWF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtLmggYi9pbmNsdWRlL2xpbnV4L3BtLmgKaW5kZXggOGM2NTgzYS4uZDkxNWQwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG0uaApAQCAtMjY0LDkgKzI2NCw5IEBACiAgKglyZWdpc3RlcnMsIHNvIHRoYXQgaXQgaXMgZnVsbHkgb3BlcmF0aW9uYWwuCiAgKgogICogQHJ1bnRpbWVfaWRsZTogRGV2aWNlIGFwcGVhcnMgdG8gYmUgaW5hY3RpdmUgYW5kIGl0IG1pZ2h0IGJlIHB1dCBpbnRvIGEKLSAqCWxvdy1wb3dlciBzdGF0ZSBpZiBhbGwgb2YgdGhlIG5lY2Vzc2FyeSBjb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQuICBDaGVjawotICoJdGhlc2UgY29uZGl0aW9ucyBhbmQgaGFuZGxlIHRoZSBkZXZpY2UgYXMgYXBwcm9wcmlhdGUsIHBvc3NpYmx5IHF1ZXVlaW5nCi0gKglhIHN1c3BlbmQgcmVxdWVzdCBmb3IgaXQuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQgYnkgdGhlIFBNIGNvcmUuCisgKglsb3ctcG93ZXIgc3RhdGUgaWYgYWxsIG9mIHRoZSBuZWNlc3NhcnkgY29uZGl0aW9ucyBhcmUgc2F0aXNmaWVkLgorICoJQ2hlY2sgdGhlc2UgY29uZGl0aW9ucywgYW5kIHJldHVybiAwIGlmIGl0J3MgYXBwcm9wcmlhdGUgdG8gbGV0IHRoZSBQTQorICoJY29yZSBxdWV1ZSBhIHN1c3BlbmQgcmVxdWVzdCBmb3IgdGhlIGRldmljZS4KICAqCiAgKiBSZWZlciB0byBEb2N1bWVudGF0aW9uL3Bvd2VyL3J1bnRpbWVfcG0udHh0IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZQogICogcm9sZSBvZiB0aGUgYWJvdmUgY2FsbGJhY2tzIGluIGRldmljZSBydW50aW1lIHBvd2VyIG1hbmFnZW1lbnQuCkBAIC0zNTIsNyArMzUyLDcgQEAKIAogLyoKICAqIFVzZSB0aGlzIGZvciBkZWZpbmluZyBhIHNldCBvZiBQTSBvcGVyYXRpb25zIHRvIGJlIHVzZWQgaW4gYWxsIHNpdHVhdGlvbnMKLSAqIChzdXN0ZW0gc3VzcGVuZCwgaGliZXJuYXRpb24gb3IgcnVudGltZSBQTSkuCisgKiAoc3lzdGVtIHN1c3BlbmQsIGhpYmVybmF0aW9uIG9yIHJ1bnRpbWUgUE0pLgogICogTk9URTogSW4gZ2VuZXJhbCwgc3lzdGVtIHN1c3BlbmQgY2FsbGJhY2tzLCAuc3VzcGVuZCgpIGFuZCAucmVzdW1lKCksIHNob3VsZAogICogYmUgZGlmZmVyZW50IGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgcnVudGltZSBQTSBjYWxsYmFja3MsIC5ydW50aW1lX3N1c3BlbmQoKSwKICAqIGFuZCAucnVudGltZV9yZXN1bWUoKSwgYmVjYXVzZSAucnVudGltZV9zdXNwZW5kKCkgYWx3YXlzIHdvcmtzIG9uIGFuIGFscmVhZHkKQEAgLTM3OSw3ICszNzksNyBAQAogICoKICAqIE9OCQlObyB0cmFuc2l0aW9uLgogICoKLSAqIEZSRUVaRSAJU3lzdGVtIGlzIGdvaW5nIHRvIGhpYmVybmF0ZSwgY2FsbCAtPnByZXBhcmUoKSBhbmQgLT5mcmVlemUoKQorICogRlJFRVpFCVN5c3RlbSBpcyBnb2luZyB0byBoaWJlcm5hdGUsIGNhbGwgLT5wcmVwYXJlKCkgYW5kIC0+ZnJlZXplKCkKICAqCQlmb3IgYWxsIGRldmljZXMuCiAgKgogICogU1VTUEVORAlTeXN0ZW0gaXMgZ29pbmcgdG8gc3VzcGVuZCwgY2FsbCAtPnByZXBhcmUoKSBhbmQgLT5zdXNwZW5kKCkKQEAgLTQyMyw3ICs0MjMsNyBAQAogCiAjZGVmaW5lIFBNX0VWRU5UX0lOVkFMSUQJKC0xKQogI2RlZmluZSBQTV9FVkVOVF9PTgkJMHgwMDAwCi0jZGVmaW5lIFBNX0VWRU5UX0ZSRUVaRSAJMHgwMDAxCisjZGVmaW5lIFBNX0VWRU5UX0ZSRUVaRQkJMHgwMDAxCiAjZGVmaW5lIFBNX0VWRU5UX1NVU1BFTkQJMHgwMDAyCiAjZGVmaW5lIFBNX0VWRU5UX0hJQkVSTkFURQkweDAwMDQKICNkZWZpbmUgUE1fRVZFTlRfUVVJRVNDRQkweDAwMDgKQEAgLTU0Miw2ICs1NDIsOCBAQAogCXVuc2lnbmVkIGludAkJYXN5bmNfc3VzcGVuZDoxOwogCWJvb2wJCQlpc19wcmVwYXJlZDoxOwkvKiBPd25lZCBieSB0aGUgUE0gY29yZSAqLwogCWJvb2wJCQlpc19zdXNwZW5kZWQ6MTsJLyogRGl0dG8gKi8KKwlib29sCQkJaXNfbm9pcnFfc3VzcGVuZGVkOjE7CisJYm9vbAkJCWlzX2xhdGVfc3VzcGVuZGVkOjE7CiAJYm9vbAkJCWlnbm9yZV9jaGlsZHJlbjoxOwogCWJvb2wJCQllYXJseV9pbml0OjE7CS8qIE93bmVkIGJ5IHRoZSBQTSBjb3JlICovCiAJc3BpbmxvY2tfdAkJbG9jazsKQEAgLTU4Miw2ICs1ODQsNyBAQAogCXVuc2lnbmVkIGxvbmcJCWFjY291bnRpbmdfdGltZXN0YW1wOwogI2VuZGlmCiAJc3RydWN0IHBtX3N1YnN5c19kYXRhCSpzdWJzeXNfZGF0YTsgIC8qIE93bmVkIGJ5IHRoZSBzdWJzeXN0ZW0uICovCisJdm9pZCAoKnNldF9sYXRlbmN5X3RvbGVyYW5jZSkoc3RydWN0IGRldmljZSAqLCBzMzIpOwogCXN0cnVjdCBkZXZfcG1fcW9zCSpxb3M7CiB9OwogCkBAIC02MTIsMTEgKzYxNSwxMSBAQAogICogbWVzc2FnZSBpcyBpbXBsaWNpdDoKICAqCiAgKiBPTgkJRHJpdmVyIHN0YXJ0cyB3b3JraW5nIGFnYWluLCByZXNwb25kaW5nIHRvIGhhcmR3YXJlIGV2ZW50cwotICogCQlhbmQgc29mdHdhcmUgcmVxdWVzdHMuICBUaGUgaGFyZHdhcmUgbWF5IGhhdmUgZ29uZSB0aHJvdWdoCi0gKiAJCWEgcG93ZXItb2ZmIHJlc2V0LCBvciBpdCBtYXkgaGF2ZSBtYWludGFpbmVkIHN0YXRlIGZyb20gdGhlCi0gKiAJCXByZXZpb3VzIHN1c3BlbmQoKSB3aGljaCB0aGUgZHJpdmVyIHdpbGwgcmVseSBvbiB3aGlsZQotICogCQlyZXN1bWluZy4gIE9uIG1vc3QgcGxhdGZvcm1zLCB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uCi0gKiAJCWF2YWlsYWJpbGl0eSBvZiByZXNvdXJjZXMgbGlrZSBjbG9ja3MgZHVyaW5nIHJlc3VtZSgpLgorICoJCWFuZCBzb2Z0d2FyZSByZXF1ZXN0cy4gIFRoZSBoYXJkd2FyZSBtYXkgaGF2ZSBnb25lIHRocm91Z2gKKyAqCQlhIHBvd2VyLW9mZiByZXNldCwgb3IgaXQgbWF5IGhhdmUgbWFpbnRhaW5lZCBzdGF0ZSBmcm9tIHRoZQorICoJCXByZXZpb3VzIHN1c3BlbmQoKSB3aGljaCB0aGUgZHJpdmVyIHdpbGwgcmVseSBvbiB3aGlsZQorICoJCXJlc3VtaW5nLiAgT24gbW9zdCBwbGF0Zm9ybXMsIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24KKyAqCQlhdmFpbGFiaWxpdHkgb2YgcmVzb3VyY2VzIGxpa2UgY2xvY2tzIGR1cmluZyByZXN1bWUoKS4KICAqCiAgKiBPdGhlciB0cmFuc2l0aW9ucyBhcmUgdHJpZ2dlcmVkIGJ5IG1lc3NhZ2VzIHNlbnQgdXNpbmcgc3VzcGVuZCgpLiAgQWxsCiAgKiB0aGVzZSB0cmFuc2l0aW9ucyBxdWllc2NlIHRoZSBkcml2ZXIsIHNvIHRoYXQgSS9PIHF1ZXVlcyBhcmUgaW5hY3RpdmUuCkBAIC02MjYsMjEgKzYyOSwyMSBAQAogICogZGlmZmVyIGFjY29yZGluZyB0byB0aGUgbWVzc2FnZToKICAqCiAgKiBTVVNQRU5ECVF1aWVzY2UsIGVudGVyIGEgbG93IHBvd2VyIGRldmljZSBzdGF0ZSBhcHByb3ByaWF0ZSBmb3IKLSAqIAkJdGhlIHVwY29taW5nIHN5c3RlbSBzdGF0ZSAoc3VjaCBhcyBQQ0lfRDNob3QpLCBhbmQgZW5hYmxlCi0gKiAJCXdha2V1cCBldmVudHMgYXMgYXBwcm9wcmlhdGUuCisgKgkJdGhlIHVwY29taW5nIHN5c3RlbSBzdGF0ZSAoc3VjaCBhcyBQQ0lfRDNob3QpLCBhbmQgZW5hYmxlCisgKgkJd2FrZXVwIGV2ZW50cyBhcyBhcHByb3ByaWF0ZS4KICAqCiAgKiBISUJFUk5BVEUJRW50ZXIgYSBsb3cgcG93ZXIgZGV2aWNlIHN0YXRlIGFwcHJvcHJpYXRlIGZvciB0aGUgaGliZXJuYXRpb24KLSAqIAkJc3RhdGUgKGVnLiBBQ1BJIFM0KSBhbmQgZW5hYmxlIHdha2V1cCBldmVudHMgYXMgYXBwcm9wcmlhdGUuCisgKgkJc3RhdGUgKGVnLiBBQ1BJIFM0KSBhbmQgZW5hYmxlIHdha2V1cCBldmVudHMgYXMgYXBwcm9wcmlhdGUuCiAgKgogICogRlJFRVpFCVF1aWVzY2Ugb3BlcmF0aW9ucyBzbyB0aGF0IGEgY29uc2lzdGVudCBpbWFnZSBjYW4gYmUgc2F2ZWQ7Ci0gKiAJCWJ1dCBkbyBOT1Qgb3RoZXJ3aXNlIGVudGVyIGEgbG93IHBvd2VyIGRldmljZSBzdGF0ZSwgYW5kIGRvCi0gKiAJCU5PVCBlbWl0IHN5c3RlbSB3YWtldXAgZXZlbnRzLgorICoJCWJ1dCBkbyBOT1Qgb3RoZXJ3aXNlIGVudGVyIGEgbG93IHBvd2VyIGRldmljZSBzdGF0ZSwgYW5kIGRvCisgKgkJTk9UIGVtaXQgc3lzdGVtIHdha2V1cCBldmVudHMuCiAgKgogICogUFJFVEhBVwlRdWllc2NlIGFzIGlmIGZvciBGUkVFWkU7IGFkZGl0aW9uYWxseSwgcHJlcGFyZSBmb3IgcmVzdG9yaW5nCi0gKiAJCXRoZSBzeXN0ZW0gZnJvbSBhIHNuYXBzaG90IHRha2VuIGFmdGVyIGFuIGVhcmxpZXIgRlJFRVpFLgotICogCQlTb21lIGRyaXZlcnMgd2lsbCBuZWVkIHRvIHJlc2V0IHRoZWlyIGhhcmR3YXJlIHN0YXRlIGluc3RlYWQKLSAqIAkJb2YgcHJlc2VydmluZyBpdCwgdG8gZW5zdXJlIHRoYXQgaXQncyBuZXZlciBtaXN0YWtlbiBmb3IgdGhlCi0gKiAJCXN0YXRlIHdoaWNoIHRoYXQgZWFybGllciBzbmFwc2hvdCBoYWQgc2V0IHVwLgorICoJCXRoZSBzeXN0ZW0gZnJvbSBhIHNuYXBzaG90IHRha2VuIGFmdGVyIGFuIGVhcmxpZXIgRlJFRVpFLgorICoJCVNvbWUgZHJpdmVycyB3aWxsIG5lZWQgdG8gcmVzZXQgdGhlaXIgaGFyZHdhcmUgc3RhdGUgaW5zdGVhZAorICoJCW9mIHByZXNlcnZpbmcgaXQsIHRvIGVuc3VyZSB0aGF0IGl0J3MgbmV2ZXIgbWlzdGFrZW4gZm9yIHRoZQorICoJCXN0YXRlIHdoaWNoIHRoYXQgZWFybGllciBzbmFwc2hvdCBoYWQgc2V0IHVwLgogICoKICAqIEEgbWluaW1hbGx5IHBvd2VyLWF3YXJlIGRyaXZlciB0cmVhdHMgYWxsIG1lc3NhZ2VzIGFzIFNVU1BFTkQsIGZ1bGx5CiAgKiByZWluaXRpYWxpemVzIGl0cyBkZXZpY2UgZHVyaW5nIHJlc3VtZSgpIC0tIHdoZXRoZXIgb3Igbm90IGl0IHdhcyByZXNldApAQCAtNzE3LDE0ICs3MjAsMjYgQEAKIHsKIH0KIAotI2RlZmluZSBwbV9nZW5lcmljX3ByZXBhcmUJTlVMTAotI2RlZmluZSBwbV9nZW5lcmljX3N1c3BlbmQJTlVMTAotI2RlZmluZSBwbV9nZW5lcmljX3Jlc3VtZQlOVUxMCi0jZGVmaW5lIHBtX2dlbmVyaWNfZnJlZXplCU5VTEwKLSNkZWZpbmUgcG1fZ2VuZXJpY190aGF3CQlOVUxMCi0jZGVmaW5lIHBtX2dlbmVyaWNfcmVzdG9yZQlOVUxMCi0jZGVmaW5lIHBtX2dlbmVyaWNfcG93ZXJvZmYJTlVMTAotI2RlZmluZSBwbV9nZW5lcmljX2NvbXBsZXRlCU5VTEwKKyNkZWZpbmUgcG1fZ2VuZXJpY19wcmVwYXJlCQlOVUxMCisjZGVmaW5lIHBtX2dlbmVyaWNfc3VzcGVuZF9sYXRlCQlOVUxMCisjZGVmaW5lIHBtX2dlbmVyaWNfc3VzcGVuZF9ub2lycQlOVUxMCisjZGVmaW5lIHBtX2dlbmVyaWNfc3VzcGVuZAkJTlVMTAorI2RlZmluZSBwbV9nZW5lcmljX3Jlc3VtZV9lYXJseQkJTlVMTAorI2RlZmluZSBwbV9nZW5lcmljX3Jlc3VtZV9ub2lycQkJTlVMTAorI2RlZmluZSBwbV9nZW5lcmljX3Jlc3VtZQkJTlVMTAorI2RlZmluZSBwbV9nZW5lcmljX2ZyZWV6ZV9ub2lycQkJTlVMTAorI2RlZmluZSBwbV9nZW5lcmljX2ZyZWV6ZV9sYXRlCQlOVUxMCisjZGVmaW5lIHBtX2dlbmVyaWNfZnJlZXplCQlOVUxMCisjZGVmaW5lIHBtX2dlbmVyaWNfdGhhd19ub2lycQkJTlVMTAorI2RlZmluZSBwbV9nZW5lcmljX3RoYXdfZWFybHkJCU5VTEwKKyNkZWZpbmUgcG1fZ2VuZXJpY190aGF3CQkJTlVMTAorI2RlZmluZSBwbV9nZW5lcmljX3Jlc3RvcmVfbm9pcnEJTlVMTAorI2RlZmluZSBwbV9nZW5lcmljX3Jlc3RvcmVfZWFybHkJTlVMTAorI2RlZmluZSBwbV9nZW5lcmljX3Jlc3RvcmUJCU5VTEwKKyNkZWZpbmUgcG1fZ2VuZXJpY19wb3dlcm9mZl9ub2lycQlOVUxMCisjZGVmaW5lIHBtX2dlbmVyaWNfcG93ZXJvZmZfbGF0ZQlOVUxMCisjZGVmaW5lIHBtX2dlbmVyaWNfcG93ZXJvZmYJCU5VTEwKKyNkZWZpbmUgcG1fZ2VuZXJpY19jb21wbGV0ZQkJTlVMTAogI2VuZGlmIC8qICFDT05GSUdfUE1fU0xFRVAgKi8KIAogLyogSG93IHRvIHJlb3JkZXIgZHBtX2xpc3QgYWZ0ZXIgZGV2aWNlX21vdmUoKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbV9xb3MuaCBiL2luY2x1ZGUvbGludXgvcG1fcW9zLmgKaW5kZXggNWE5NTAxMy4uOWFiNGJmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbV9xb3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BtX3Fvcy5oCkBAIC0zMiw3ICszMiwxMCBAQAogI2RlZmluZSBQTV9RT1NfQ1BVX0RNQV9MQVRfREVGQVVMVF9WQUxVRQkoMjAwMCAqIFVTRUNfUEVSX1NFQykKICNkZWZpbmUgUE1fUU9TX05FVFdPUktfTEFUX0RFRkFVTFRfVkFMVUUJKDIwMDAgKiBVU0VDX1BFUl9TRUMpCiAjZGVmaW5lIFBNX1FPU19ORVRXT1JLX1RIUk9VR0hQVVRfREVGQVVMVF9WQUxVRQkwCi0jZGVmaW5lIFBNX1FPU19ERVZfTEFUX0RFRkFVTFRfVkFMVUUJCTAKKyNkZWZpbmUgUE1fUU9TX1JFU1VNRV9MQVRFTkNZX0RFRkFVTFRfVkFMVUUJMAorI2RlZmluZSBQTV9RT1NfTEFURU5DWV9UT0xFUkFOQ0VfREVGQVVMVF9WQUxVRQkwCisjZGVmaW5lIFBNX1FPU19MQVRFTkNZX1RPTEVSQU5DRV9OT19DT05TVFJBSU5UCSgtMSkKKyNkZWZpbmUgUE1fUU9TX0xBVEVOQ1lfQU5ZCQkJKChzMzIpKH4oX191MzIpMCA+PiAxKSkKIAogI2RlZmluZSBQTV9RT1NfRkxBR19OT19QT1dFUl9PRkYJKDEgPDwgMCkKICNkZWZpbmUgUE1fUU9TX0ZMQUdfUkVNT1RFX1dBS0VVUAkoMSA8PCAxKQpAQCAtNDksNyArNTIsOCBAQAogfTsKIAogZW51bSBkZXZfcG1fcW9zX3JlcV90eXBlIHsKLQlERVZfUE1fUU9TX0xBVEVOQ1kgPSAxLAorCURFVl9QTV9RT1NfUkVTVU1FX0xBVEVOQ1kgPSAxLAorCURFVl9QTV9RT1NfTEFURU5DWV9UT0xFUkFOQ0UsCiAJREVWX1BNX1FPU19GTEFHUywKIH07CiAKQEAgLTc3LDYgKzgxLDcgQEAKIAlzdHJ1Y3QgcGxpc3RfaGVhZCBsaXN0OwogCXMzMiB0YXJnZXRfdmFsdWU7CS8qIERvIG5vdCBjaGFuZ2UgdG8gNjQgYml0ICovCiAJczMyIGRlZmF1bHRfdmFsdWU7CisJczMyIG5vX2NvbnN0cmFpbnRfdmFsdWU7CiAJZW51bSBwbV9xb3NfdHlwZSB0eXBlOwogCXN0cnVjdCBibG9ja2luZ19ub3RpZmllcl9oZWFkICpub3RpZmllcnM7CiB9OwpAQCAtODcsOSArOTIsMTEgQEAKIH07CiAKIHN0cnVjdCBkZXZfcG1fcW9zIHsKLQlzdHJ1Y3QgcG1fcW9zX2NvbnN0cmFpbnRzIGxhdGVuY3k7CisJc3RydWN0IHBtX3Fvc19jb25zdHJhaW50cyByZXN1bWVfbGF0ZW5jeTsKKwlzdHJ1Y3QgcG1fcW9zX2NvbnN0cmFpbnRzIGxhdGVuY3lfdG9sZXJhbmNlOwogCXN0cnVjdCBwbV9xb3NfZmxhZ3MgZmxhZ3M7Ci0Jc3RydWN0IGRldl9wbV9xb3NfcmVxdWVzdCAqbGF0ZW5jeV9yZXE7CisJc3RydWN0IGRldl9wbV9xb3NfcmVxdWVzdCAqcmVzdW1lX2xhdGVuY3lfcmVxOworCXN0cnVjdCBkZXZfcG1fcW9zX3JlcXVlc3QgKmxhdGVuY3lfdG9sZXJhbmNlX3JlcTsKIAlzdHJ1Y3QgZGV2X3BtX3Fvc19yZXF1ZXN0ICpmbGFnc19yZXE7CiB9OwogCkBAIC0xNDIsNyArMTQ5LDggQEAKIHZvaWQgZGV2X3BtX3Fvc19jb25zdHJhaW50c19pbml0KHN0cnVjdCBkZXZpY2UgKmRldik7CiB2b2lkIGRldl9wbV9xb3NfY29uc3RyYWludHNfZGVzdHJveShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogaW50IGRldl9wbV9xb3NfYWRkX2FuY2VzdG9yX3JlcXVlc3Qoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgZGV2X3BtX3Fvc19yZXF1ZXN0ICpyZXEsIHMzMiB2YWx1ZSk7CisJCQkJICAgIHN0cnVjdCBkZXZfcG1fcW9zX3JlcXVlc3QgKnJlcSwKKwkJCQkgICAgZW51bSBkZXZfcG1fcW9zX3JlcV90eXBlIHR5cGUsIHMzMiB2YWx1ZSk7CiAjZWxzZQogc3RhdGljIGlubGluZSBlbnVtIHBtX3Fvc19mbGFnc19zdGF0dXMgX19kZXZfcG1fcW9zX2ZsYWdzKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJCQkgIHMzMiBtYXNrKQpAQCAtMTg1LDcgKzE5Myw5IEBACiAJZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfSU5WQUxJRDsKIH0KIHN0YXRpYyBpbmxpbmUgaW50IGRldl9wbV9xb3NfYWRkX2FuY2VzdG9yX3JlcXVlc3Qoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgZGV2X3BtX3Fvc19yZXF1ZXN0ICpyZXEsIHMzMiB2YWx1ZSkKKwkJCQkJCSAgc3RydWN0IGRldl9wbV9xb3NfcmVxdWVzdCAqcmVxLAorCQkJCQkJICBlbnVtIGRldl9wbV9xb3NfcmVxX3R5cGUgdHlwZSwKKwkJCQkJCSAgczMyIHZhbHVlKQogCQkJeyByZXR1cm4gMDsgfQogI2VuZGlmCiAKQEAgLTE5NSwxMCArMjA1LDEyIEBACiBpbnQgZGV2X3BtX3Fvc19leHBvc2VfZmxhZ3Moc3RydWN0IGRldmljZSAqZGV2LCBzMzIgdmFsdWUpOwogdm9pZCBkZXZfcG1fcW9zX2hpZGVfZmxhZ3Moc3RydWN0IGRldmljZSAqZGV2KTsKIGludCBkZXZfcG1fcW9zX3VwZGF0ZV9mbGFncyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHMzMiBtYXNrLCBib29sIHNldCk7CitzMzIgZGV2X3BtX3Fvc19nZXRfdXNlcl9sYXRlbmN5X3RvbGVyYW5jZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworaW50IGRldl9wbV9xb3NfdXBkYXRlX3VzZXJfbGF0ZW5jeV90b2xlcmFuY2Uoc3RydWN0IGRldmljZSAqZGV2LCBzMzIgdmFsKTsKIAotc3RhdGljIGlubGluZSBzMzIgZGV2X3BtX3Fvc19yZXF1ZXN0ZWRfbGF0ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW5saW5lIHMzMiBkZXZfcG1fcW9zX3JlcXVlc3RlZF9yZXN1bWVfbGF0ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIGRldi0+cG93ZXIucW9zLT5sYXRlbmN5X3JlcS0+ZGF0YS5wbm9kZS5wcmlvOworCXJldHVybiBkZXYtPnBvd2VyLnFvcy0+cmVzdW1lX2xhdGVuY3lfcmVxLT5kYXRhLnBub2RlLnByaW87CiB9CiAKIHN0YXRpYyBpbmxpbmUgczMyIGRldl9wbV9xb3NfcmVxdWVzdGVkX2ZsYWdzKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTIxNCw4ICsyMjYsMTIgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXZfcG1fcW9zX2hpZGVfZmxhZ3Moc3RydWN0IGRldmljZSAqZGV2KSB7fQogc3RhdGljIGlubGluZSBpbnQgZGV2X3BtX3Fvc191cGRhdGVfZmxhZ3Moc3RydWN0IGRldmljZSAqZGV2LCBzMzIgbSwgYm9vbCBzZXQpCiAJCQl7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHMzMiBkZXZfcG1fcW9zX2dldF91c2VyX2xhdGVuY3lfdG9sZXJhbmNlKHN0cnVjdCBkZXZpY2UgKmRldikKKwkJCXsgcmV0dXJuIFBNX1FPU19MQVRFTkNZX1RPTEVSQU5DRV9OT19DT05TVFJBSU5UOyB9CitzdGF0aWMgaW5saW5lIGludCBkZXZfcG1fcW9zX3VwZGF0ZV91c2VyX2xhdGVuY3lfdG9sZXJhbmNlKHN0cnVjdCBkZXZpY2UgKmRldiwgczMyIHZhbCkKKwkJCXsgcmV0dXJuIDA7IH0KIAotc3RhdGljIGlubGluZSBzMzIgZGV2X3BtX3Fvc19yZXF1ZXN0ZWRfbGF0ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgczMyIGRldl9wbV9xb3NfcmVxdWVzdGVkX3Jlc3VtZV9sYXRlbmN5KHN0cnVjdCBkZXZpY2UgKmRldikgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBzMzIgZGV2X3BtX3Fvc19yZXF1ZXN0ZWRfZmxhZ3Moc3RydWN0IGRldmljZSAqZGV2KSB7IHJldHVybiAwOyB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbV9ydW50aW1lLmggYi9pbmNsdWRlL2xpbnV4L3BtX3J1bnRpbWUuaAppbmRleCAxNmM5YTYyLi4yYTU4OTdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BtX3J1bnRpbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BtX3J1bnRpbWUuaApAQCAtMjYsOSArMjYsMTMgQEAKICNpZmRlZiBDT05GSUdfUE0KIGV4dGVybiBpbnQgcG1fZ2VuZXJpY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgcG1fZ2VuZXJpY19ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBwbV9ydW50aW1lX2ZvcmNlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgcG1fcnVudGltZV9mb3JjZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBwbV9nZW5lcmljX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHBtX2dlbmVyaWNfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBwbV9ydW50aW1lX2ZvcmNlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBwbV9ydW50aW1lX2ZvcmNlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHsgcmV0dXJuIDA7IH0KICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVnbWFwLmggYi9pbmNsdWRlL2xpbnV4L3JlZ21hcC5oCmluZGV4IDQxNDlmMWEuLjg1NjkxYjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVnbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWdtYXAuaApAQCAtMTY0LDYgKzE2NCw5IEBACiAgKiBAdXNlX3NpbmdsZV9ydzogSWYgc2V0LCBjb252ZXJ0cyB0aGUgYnVsayByZWFkIGFuZCB3cml0ZSBvcGVyYXRpb25zIGludG8KICAqCQkgICAgYSBzZXJpZXMgb2Ygc2luZ2xlIHJlYWQgYW5kIHdyaXRlIG9wZXJhdGlvbnMuIFRoaXMgaXMgdXNlZnVsCiAgKgkJICAgIGZvciBkZXZpY2UgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGJ1bGsgcmVhZCBhbmQgd3JpdGUuCisgKiBAY2FuX211bHRpX3dyaXRlOiBJZiBzZXQsIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGhlIG11bHRpIHdyaXRlIG1vZGUgb2YgYnVsaworICogICAgICAgICAgICAgICAgICAgd3JpdGUgb3BlcmF0aW9ucywgaWYgY2xlYXIgbXVsdGkgd3JpdGUgcmVxdWVzdHMgd2lsbCBiZQorICogICAgICAgICAgICAgICAgICAgc3BsaXQgaW50byBpbmRpdmlkdWFsIHdyaXRlIG9wZXJhdGlvbnMKICAqCiAgKiBAY2FjaGVfdHlwZTogVGhlIGFjdHVhbCBjYWNoZSB0eXBlLgogICogQHJlZ19kZWZhdWx0c19yYXc6IFBvd2VyIG9uIHJlc2V0IHZhbHVlcyBmb3IgcmVnaXN0ZXJzIChmb3IgdXNlIHdpdGgKQEAgLTIxNSw2ICsyMTgsNyBAQAogCXU4IHdyaXRlX2ZsYWdfbWFzazsKIAogCWJvb2wgdXNlX3NpbmdsZV9ydzsKKwlib29sIGNhbl9tdWx0aV93cml0ZTsKIAogCWVudW0gcmVnbWFwX2VuZGlhbiByZWdfZm9ybWF0X2VuZGlhbjsKIAllbnVtIHJlZ21hcF9lbmRpYW4gdmFsX2Zvcm1hdF9lbmRpYW47CkBAIC0zMTcsMTIgKzMyMSwxNiBAQAogCQkJICAgY29uc3Qgc3RydWN0IHJlZ21hcF9idXMgKmJ1cywKIAkJCSAgIHZvaWQgKmJ1c19jb250ZXh0LAogCQkJICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZyk7CitpbnQgcmVnbWFwX2F0dGFjaF9kZXYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICptYXAsCisJCQkJIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpOwogc3RydWN0IHJlZ21hcCAqcmVnbWFwX2luaXRfaTJjKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZyk7CiBzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfaW5pdF9zcGkoc3RydWN0IHNwaV9kZXZpY2UgKmRldiwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKTsKLXN0cnVjdCByZWdtYXAgKnJlZ21hcF9pbml0X3NwbWkoc3RydWN0IHNwbWlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZyk7CitzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfaW5pdF9zcG1pX2Jhc2Uoc3RydWN0IHNwbWlfZGV2aWNlICpkZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKTsKK3N0cnVjdCByZWdtYXAgKnJlZ21hcF9pbml0X3NwbWlfZXh0KHN0cnVjdCBzcG1pX2RldmljZSAqZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKTsKIHN0cnVjdCByZWdtYXAgKnJlZ21hcF9pbml0X21taW9fY2xrKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqY2xrX2lkLAogCQkJCSAgICB2b2lkIF9faW9tZW0gKnJlZ3MsCiAJCQkJICAgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpOwpAQCAtMzM1LDggKzM0MywxMCBAQAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKTsKIHN0cnVjdCByZWdtYXAgKmRldm1fcmVnbWFwX2luaXRfc3BpKHN0cnVjdCBzcGlfZGV2aWNlICpkZXYsCiAJCQkJICAgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpOwotc3RydWN0IHJlZ21hcCAqZGV2bV9yZWdtYXBfaW5pdF9zcG1pKHN0cnVjdCBzcG1pX2RldmljZSAqZGV2LAotCQkJCSAgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZyk7CitzdHJ1Y3QgcmVnbWFwICpkZXZtX3JlZ21hcF9pbml0X3NwbWlfYmFzZShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKmRldiwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKTsKK3N0cnVjdCByZWdtYXAgKmRldm1fcmVnbWFwX2luaXRfc3BtaV9leHQoc3RydWN0IHNwbWlfZGV2aWNlICpkZXYsCisJCQkJCSBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKTsKIHN0cnVjdCByZWdtYXAgKmRldm1fcmVnbWFwX2luaXRfbW1pb19jbGsoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpjbGtfaWQsCiAJCQkJCSB2b2lkIF9faW9tZW0gKnJlZ3MsCiAJCQkJCSBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKTsKQEAgLTM4Niw4ICszOTYsMTEgQEAKIAkJICAgICBjb25zdCB2b2lkICp2YWwsIHNpemVfdCB2YWxfbGVuKTsKIGludCByZWdtYXBfYnVsa193cml0ZShzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcsIGNvbnN0IHZvaWQgKnZhbCwKIAkJCXNpemVfdCB2YWxfY291bnQpOwotaW50IHJlZ21hcF9tdWx0aV9yZWdfd3JpdGUoc3RydWN0IHJlZ21hcCAqbWFwLCBzdHJ1Y3QgcmVnX2RlZmF1bHQgKnJlZ3MsCitpbnQgcmVnbWFwX211bHRpX3JlZ193cml0ZShzdHJ1Y3QgcmVnbWFwICptYXAsIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcmVncywKIAkJCWludCBudW1fcmVncyk7CitpbnQgcmVnbWFwX211bHRpX3JlZ193cml0ZV9ieXBhc3NlZChzdHJ1Y3QgcmVnbWFwICptYXAsCisJCQkJICAgIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcmVncywKKwkJCQkgICAgaW50IG51bV9yZWdzKTsKIGludCByZWdtYXBfcmF3X3dyaXRlX2FzeW5jKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZywKIAkJCSAgIGNvbnN0IHZvaWQgKnZhbCwgc2l6ZV90IHZhbF9sZW4pOwogaW50IHJlZ21hcF9yZWFkKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50ICp2YWwpOwpAQCAtNDIzLDYgKzQzNiw4IEBACiAKIGludCByZWdtYXBfcmVnaXN0ZXJfcGF0Y2goc3RydWN0IHJlZ21hcCAqbWFwLCBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgKnJlZ3MsCiAJCQkgIGludCBudW1fcmVncyk7CitpbnQgcmVnbWFwX3BhcnNlX3ZhbChzdHJ1Y3QgcmVnbWFwICptYXAsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCQl1bnNpZ25lZCBpbnQgKnZhbCk7CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCByZWdtYXBfcmVnX2luX3JhbmdlKHVuc2lnbmVkIGludCByZWcsCiAJCQkJICAgICAgIGNvbnN0IHN0cnVjdCByZWdtYXBfcmFuZ2UgKnJhbmdlKQpAQCAtNjk1LDYgKzcxMCwxMyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCitzdGF0aWMgaW5saW5lIGludCByZWdtYXBfcGFyc2VfdmFsKHN0cnVjdCByZWdtYXAgKm1hcCwgY29uc3Qgdm9pZCAqYnVmLAorCQkJCXVuc2lnbmVkIGludCAqdmFsKQoreworCVdBUk5fT05DRSgxLCAicmVnbWFwIEFQSSBpcyBkaXNhYmxlZCIpOworCXJldHVybiAtRUlOVkFMOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCByZWdtYXAgKmRldl9nZXRfcmVnbWFwKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaCBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCmluZGV4IDkzNzBlNjUuLmJiZTAzYTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCkBAIC0yMjgsMTAgKzIyOCwxNCBAQAogICogICAgICAgICAgICAgICAgb3V0cHV0IHdoZW4gdXNpbmcgcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAKICAqIEBlbmFibGVfcmVnOiBSZWdpc3RlciBmb3IgY29udHJvbCB3aGVuIHVzaW5nIHJlZ21hcCBlbmFibGUvZGlzYWJsZSBvcHMKICAqIEBlbmFibGVfbWFzazogTWFzayBmb3IgY29udHJvbCB3aGVuIHVzaW5nIHJlZ21hcCBlbmFibGUvZGlzYWJsZSBvcHMKKyAqIEBlbmFibGVfdmFsOiBFbmFibGluZyB2YWx1ZSBmb3IgY29udHJvbCB3aGVuIHVzaW5nIHJlZ21hcCBlbmFibGUvZGlzYWJsZSBvcHMKKyAqIEBkaXNhYmxlX3ZhbDogRGlzYWJsaW5nIHZhbHVlIGZvciBjb250cm9sIHdoZW4gdXNpbmcgcmVnbWFwIGVuYWJsZS9kaXNhYmxlIG9wcwogICogQGVuYWJsZV9pc19pbnZlcnRlZDogQSBmbGFnIHRvIGluZGljYXRlIHNldCBlbmFibGVfbWFzayBiaXRzIHRvIGRpc2FibGUKICAqICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdXNpbmcgcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAgYW5kIGZyaWVuZHMgQVBJcy4KICAqIEBieXBhc3NfcmVnOiBSZWdpc3RlciBmb3IgY29udHJvbCB3aGVuIHVzaW5nIHJlZ21hcCBzZXRfYnlwYXNzCiAgKiBAYnlwYXNzX21hc2s6IE1hc2sgZm9yIGNvbnRyb2wgd2hlbiB1c2luZyByZWdtYXAgc2V0X2J5cGFzcworICogQGJ5cGFzc192YWxfb246IEVuYWJsaW5nIHZhbHVlIGZvciBjb250cm9sIHdoZW4gdXNpbmcgcmVnbWFwIHNldF9ieXBhc3MKKyAqIEBieXBhc3NfdmFsX29mZjogRGlzYWJsaW5nIHZhbHVlIGZvciBjb250cm9sIHdoZW4gdXNpbmcgcmVnbWFwIHNldF9ieXBhc3MKICAqCiAgKiBAZW5hYmxlX3RpbWU6IFRpbWUgdGFrZW4gZm9yIGluaXRpYWwgZW5hYmxlIG9mIHJlZ3VsYXRvciAoaW4gdVMpLgogICovCkBAIC0yNjMsOSArMjY3LDEzIEBACiAJdW5zaWduZWQgaW50IGFwcGx5X2JpdDsKIAl1bnNpZ25lZCBpbnQgZW5hYmxlX3JlZzsKIAl1bnNpZ25lZCBpbnQgZW5hYmxlX21hc2s7CisJdW5zaWduZWQgaW50IGVuYWJsZV92YWw7CisJdW5zaWduZWQgaW50IGRpc2FibGVfdmFsOwogCWJvb2wgZW5hYmxlX2lzX2ludmVydGVkOwogCXVuc2lnbmVkIGludCBieXBhc3NfcmVnOwogCXVuc2lnbmVkIGludCBieXBhc3NfbWFzazsKKwl1bnNpZ25lZCBpbnQgYnlwYXNzX3ZhbF9vbjsKKwl1bnNpZ25lZCBpbnQgYnlwYXNzX3ZhbF9vZmY7CiAKIAl1bnNpZ25lZCBpbnQgZW5hYmxlX3RpbWU7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvcGZ1emUxMDAuaCBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL3BmdXplMTAwLmgKaW5kZXggNjVkNTUwYi4uMzY0ZjdhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvcGZ1emUxMDAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9wZnV6ZTEwMC5oCkBAIC0zNSw2ICszNSwyMCBAQAogI2RlZmluZSBQRlVaRTEwMF9WR0VONgkJMTQKICNkZWZpbmUgUEZVWkUxMDBfTUFYX1JFR1VMQVRPUgkxNQogCisjZGVmaW5lIFBGVVpFMjAwX1NXMUFCCQkwCisjZGVmaW5lIFBGVVpFMjAwX1NXMgkJMQorI2RlZmluZSBQRlVaRTIwMF9TVzNBCQkyCisjZGVmaW5lIFBGVVpFMjAwX1NXM0IJCTMKKyNkZWZpbmUgUEZVWkUyMDBfU1dCU1QJCTQKKyNkZWZpbmUgUEZVWkUyMDBfVlNOVlMJCTUKKyNkZWZpbmUgUEZVWkUyMDBfVlJFRkREUgk2CisjZGVmaW5lIFBGVVpFMjAwX1ZHRU4xCQk3CisjZGVmaW5lIFBGVVpFMjAwX1ZHRU4yCQk4CisjZGVmaW5lIFBGVVpFMjAwX1ZHRU4zCQk5CisjZGVmaW5lIFBGVVpFMjAwX1ZHRU40CQkxMAorI2RlZmluZSBQRlVaRTIwMF9WR0VONQkJMTEKKyNkZWZpbmUgUEZVWkUyMDBfVkdFTjYJCTEyCisKIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhOwogCiBzdHJ1Y3QgcGZ1emVfcmVndWxhdG9yX3BsYXRmb3JtX2RhdGEgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IDgyNWVkODMuLjdjYjA3ZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTI5LDcgKzI5LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS9jcHV0aW1lLmg+CisjaW5jbHVkZSA8bGludXgvY3B1dGltZS5oPgogCiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc2VtLmg+CkBAIC0yOTQsMTAgKzI5NCwxNCBAQAogI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgZGVmaW5lZChDT05GSUdfTk9fSFpfQ09NTU9OKQogZXh0ZXJuIHZvaWQgbm9oel9iYWxhbmNlX2VudGVyX2lkbGUoaW50IGNwdSk7CiBleHRlcm4gdm9pZCBzZXRfY3B1X3NkX3N0YXRlX2lkbGUodm9pZCk7Ci1leHRlcm4gaW50IGdldF9ub2h6X3RpbWVyX3RhcmdldCh2b2lkKTsKK2V4dGVybiBpbnQgZ2V0X25vaHpfdGltZXJfdGFyZ2V0KGludCBwaW5uZWQpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBub2h6X2JhbGFuY2VfZW50ZXJfaWRsZShpbnQgY3B1KSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY3B1X3NkX3N0YXRlX2lkbGUodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIGludCBnZXRfbm9oel90aW1lcl90YXJnZXQoaW50IHBpbm5lZCkKK3sKKwlyZXR1cm4gc21wX3Byb2Nlc3Nvcl9pZCgpOworfQogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9iY202M3h4LmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9iY202M3h4LmgKaW5kZXggNTcwZTk2NC4uYTgwYWExYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWxfYmNtNjN4eC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2JjbTYzeHguaApAQCAtMTE2LDQgKzExNiw2IEBACiAJCQkJCVVBUlRfRklGT19QQVJFUlJfTUFTSyB8CQlcCiAJCQkJCVVBUlRfRklGT19CUktERVRfTUFTSykKIAorI2RlZmluZSBVQVJUX1JFR19TSVpFCQkJMjQKKwogI2VuZGlmIC8qIF9MSU5VWF9TRVJJQUxfQkNNNjNYWF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9zY2kuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oCmluZGV4IDIyYjM2NDAuLjZjNWUzYmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oCkBAIC0xMCw0NSArMTAsNTkgQEAKIAogI2RlZmluZSBTQ0l4X05PVF9TVVBQT1JURUQJKC0xKQogCi0jZGVmaW5lIFNDU0NSX1RJRQkoMSA8PCA3KQotI2RlZmluZSBTQ1NDUl9SSUUJKDEgPDwgNikKLSNkZWZpbmUgU0NTQ1JfVEUJKDEgPDwgNSkKLSNkZWZpbmUgU0NTQ1JfUkUJKDEgPDwgNCkKLSNkZWZpbmUgU0NTQ1JfUkVJRQkoMSA8PCAzKQkvKiBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBwYXJ0cyAqLwotI2RlZmluZSBTQ1NDUl9UT0lFCSgxIDw8IDIpCS8qIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIHBhcnRzICovCi0jZGVmaW5lIFNDU0NSX0NLRTEJKDEgPDwgMSkKLSNkZWZpbmUgU0NTQ1JfQ0tFMAkoMSA8PCAwKQorLyogU0NTTVIgKFNlcmlhbCBNb2RlIFJlZ2lzdGVyKSAqLworI2RlZmluZSBTQ1NNUl9DSFIJKDEgPDwgNikJLyogNy1iaXQgQ2hhcmFjdGVyIExlbmd0aCAqLworI2RlZmluZSBTQ1NNUl9QRQkoMSA8PCA1KQkvKiBQYXJpdHkgRW5hYmxlICovCisjZGVmaW5lIFNDU01SX09ERAkoMSA8PCA0KQkvKiBPZGQgUGFyaXR5ICovCisjZGVmaW5lIFNDU01SX1NUT1AJKDEgPDwgMykJLyogU3RvcCBCaXQgTGVuZ3RoICovCisjZGVmaW5lIFNDU01SX0NLUwkweDAwMDMJCS8qIENsb2NrIFNlbGVjdCAqLwogCi0vKiBTQ3hTUiBTQ0kgKi8KLSNkZWZpbmUgU0NJX1REUkUgIDB4ODAKLSNkZWZpbmUgU0NJX1JEUkYgIDB4NDAKLSNkZWZpbmUgU0NJX09SRVIgIDB4MjAKLSNkZWZpbmUgU0NJX0ZFUiAgIDB4MTAKLSNkZWZpbmUgU0NJX1BFUiAgIDB4MDgKLSNkZWZpbmUgU0NJX1RFTkQgIDB4MDQKKy8qIFNlcmlhbCBDb250cm9sIFJlZ2lzdGVyIChAID0gbm90IHN1cHBvcnRlZCBieSBhbGwgcGFydHMpICovCisjZGVmaW5lIFNDU0NSX1RJRQkoMSA8PCA3KQkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFNDU0NSX1JJRQkoMSA8PCA2KQkvKiBSZWNlaXZlIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgU0NTQ1JfVEUJKDEgPDwgNSkJLyogVHJhbnNtaXQgRW5hYmxlICovCisjZGVmaW5lIFNDU0NSX1JFCSgxIDw8IDQpCS8qIFJlY2VpdmUgRW5hYmxlICovCisjZGVmaW5lIFNDU0NSX1JFSUUJKDEgPDwgMykJLyogUmVjZWl2ZSBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlIEAgKi8KKyNkZWZpbmUgU0NTQ1JfVE9JRQkoMSA8PCAyKQkvKiBUaW1lb3V0IEludGVycnVwdCBFbmFibGUgQCAqLworI2RlZmluZSBTQ1NDUl9DS0UxCSgxIDw8IDEpCS8qIENsb2NrIEVuYWJsZSAxICovCisjZGVmaW5lIFNDU0NSX0NLRTAJKDEgPDwgMCkJLyogQ2xvY2sgRW5hYmxlIDAgKi8KKy8qIFNDSUZBL1NDSUZCIG9ubHkgKi8KKyNkZWZpbmUgU0NTQ1JfVERSUUUJKDEgPDwgMTUpCS8qIFR4IERhdGEgVHJhbnNmZXIgUmVxdWVzdCBFbmFibGUgKi8KKyNkZWZpbmUgU0NTQ1JfUkRSUUUJKDEgPDwgMTQpCS8qIFJ4IERhdGEgVHJhbnNmZXIgUmVxdWVzdCBFbmFibGUgKi8KKworLyogU0N4U1IgKFNlcmlhbCBTdGF0dXMgUmVnaXN0ZXIpIG9uIFNDSSAqLworI2RlZmluZSBTQ0lfVERSRSAgMHg4MAkJCS8qIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgRW1wdHkgKi8KKyNkZWZpbmUgU0NJX1JEUkYgIDB4NDAJCQkvKiBSZWNlaXZlIERhdGEgUmVnaXN0ZXIgRnVsbCAqLworI2RlZmluZSBTQ0lfT1JFUiAgMHgyMAkJCS8qIE92ZXJydW4gRXJyb3IgKi8KKyNkZWZpbmUgU0NJX0ZFUiAgIDB4MTAJCQkvKiBGcmFtaW5nIEVycm9yICovCisjZGVmaW5lIFNDSV9QRVIgICAweDA4CQkJLyogUGFyaXR5IEVycm9yICovCisjZGVmaW5lIFNDSV9URU5EICAweDA0CQkJLyogVHJhbnNtaXQgRW5kICovCiAKICNkZWZpbmUgU0NJX0RFRkFVTFRfRVJST1JfTUFTSyAoU0NJX1BFUiB8IFNDSV9GRVIpCiAKLS8qIFNDeFNSIFNDSUYsIEhTQ0lGICovCi0jZGVmaW5lIFNDSUZfRVIgICAgMHgwMDgwCi0jZGVmaW5lIFNDSUZfVEVORCAgMHgwMDQwCi0jZGVmaW5lIFNDSUZfVERGRSAgMHgwMDIwCi0jZGVmaW5lIFNDSUZfQlJLICAgMHgwMDEwCi0jZGVmaW5lIFNDSUZfRkVSICAgMHgwMDA4Ci0jZGVmaW5lIFNDSUZfUEVSICAgMHgwMDA0Ci0jZGVmaW5lIFNDSUZfUkRGICAgMHgwMDAyCi0jZGVmaW5lIFNDSUZfRFIgICAgMHgwMDAxCisvKiBTQ3hTUiAoU2VyaWFsIFN0YXR1cyBSZWdpc3Rlcikgb24gU0NJRiwgSFNDSUYgKi8KKyNkZWZpbmUgU0NJRl9FUiAgICAweDAwODAJCS8qIFJlY2VpdmUgRXJyb3IgKi8KKyNkZWZpbmUgU0NJRl9URU5EICAweDAwNDAJCS8qIFRyYW5zbWlzc2lvbiBFbmQgKi8KKyNkZWZpbmUgU0NJRl9UREZFICAweDAwMjAJCS8qIFRyYW5zbWl0IEZJRk8gRGF0YSBFbXB0eSAqLworI2RlZmluZSBTQ0lGX0JSSyAgIDB4MDAxMAkJLyogQnJlYWsgRGV0ZWN0ICovCisjZGVmaW5lIFNDSUZfRkVSICAgMHgwMDA4CQkvKiBGcmFtaW5nIEVycm9yICovCisjZGVmaW5lIFNDSUZfUEVSICAgMHgwMDA0CQkvKiBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUgU0NJRl9SREYgICAweDAwMDIJCS8qIFJlY2VpdmUgRklGTyBEYXRhIEZ1bGwgKi8KKyNkZWZpbmUgU0NJRl9EUiAgICAweDAwMDEJCS8qIFJlY2VpdmUgRGF0YSBSZWFkeSAqLwogCiAjZGVmaW5lIFNDSUZfREVGQVVMVF9FUlJPUl9NQVNLIChTQ0lGX1BFUiB8IFNDSUZfRkVSIHwgU0NJRl9FUiB8IFNDSUZfQlJLKQogCi0vKiBTQ1NQVFIsIG9wdGlvbmFsICovCi0jZGVmaW5lIFNDU1BUUl9SVFNJTwkoMSA8PCA3KQotI2RlZmluZSBTQ1NQVFJfQ1RTSU8JKDEgPDwgNSkKLSNkZWZpbmUgU0NTUFRSX1NQQjJJTwkoMSA8PCAxKQotI2RlZmluZSBTQ1NQVFJfU1BCMkRUCSgxIDw8IDApCisvKiBTQ0ZDUiAoRklGTyBDb250cm9sIFJlZ2lzdGVyKSAqLworI2RlZmluZSBTQ0ZDUl9MT09QCSgxIDw8IDApCS8qIExvb3BiYWNrIFRlc3QgKi8KKworLyogU0NTUFRSIChTZXJpYWwgUG9ydCBSZWdpc3RlciksIG9wdGlvbmFsICovCisjZGVmaW5lIFNDU1BUUl9SVFNJTwkoMSA8PCA3KQkvKiBTZXJpYWwgUG9ydCBSVFMgUGluIElucHV0L091dHB1dCAqLworI2RlZmluZSBTQ1NQVFJfQ1RTSU8JKDEgPDwgNSkJLyogU2VyaWFsIFBvcnQgQ1RTIFBpbiBJbnB1dC9PdXRwdXQgKi8KKyNkZWZpbmUgU0NTUFRSX1NQQjJJTwkoMSA8PCAxKQkvKiBTZXJpYWwgUG9ydCBCcmVhayBJbnB1dC9PdXRwdXQgKi8KKyNkZWZpbmUgU0NTUFRSX1NQQjJEVAkoMSA8PCAwKQkvKiBTZXJpYWwgUG9ydCBCcmVhayBEYXRhICovCiAKIC8qIEhTU1JSIEhTQ0lGICovCi0jZGVmaW5lIEhTQ0lGX1NSRQkweDgwMDAKKyNkZWZpbmUgSFNDSUZfU1JFCTB4ODAwMAkJLyogU2FtcGxpbmcgUmF0ZSBSZWdpc3RlciBFbmFibGUgKi8KIAogZW51bSB7CiAJU0NJeF9QUk9CRV9SRUdUWVBFLApAQCAtNzMsMTAgKzg3LDE5IEBACiAgKiBOb3QgYWxsIHJlZ2lzdGVycyB3aWxsIGV4aXN0IG9uIGFsbCBwYXJ0cy4KICAqLwogZW51bSB7Ci0JU0NTTVIsIFNDQlJSLCBTQ1NDUiwgU0N4U1IsCi0JU0NGQ1IsIFNDRkRSLCBTQ3hURFIsIFNDeFJEUiwKLQlTQ0xTUiwgU0NURkRSLCBTQ1JGRFIsIFNDU1BUUiwKLQlIU1NSUiwKKwlTQ1NNUiwJCQkJLyogU2VyaWFsIE1vZGUgUmVnaXN0ZXIgKi8KKwlTQ0JSUiwJCQkJLyogQml0IFJhdGUgUmVnaXN0ZXIgKi8KKwlTQ1NDUiwJCQkJLyogU2VyaWFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlTQ3hTUiwJCQkJLyogU2VyaWFsIFN0YXR1cyBSZWdpc3RlciAqLworCVNDRkNSLAkJCQkvKiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlTQ0ZEUiwJCQkJLyogRklGTyBEYXRhIENvdW50IFJlZ2lzdGVyICovCisJU0N4VERSLAkJCQkvKiBUcmFuc21pdCAoRklGTykgRGF0YSBSZWdpc3RlciAqLworCVNDeFJEUiwJCQkJLyogUmVjZWl2ZSAoRklGTykgRGF0YSBSZWdpc3RlciAqLworCVNDTFNSLAkJCQkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlciAqLworCVNDVEZEUiwJCQkJLyogVHJhbnNtaXQgRklGTyBEYXRhIENvdW50IFJlZ2lzdGVyICovCisJU0NSRkRSLAkJCQkvKiBSZWNlaXZlIEZJRk8gRGF0YSBDb3VudCBSZWdpc3RlciAqLworCVNDU1BUUiwJCQkJLyogU2VyaWFsIFBvcnQgUmVnaXN0ZXIgKi8KKwlIU1NSUiwJCQkJLyogU2FtcGxpbmcgUmF0ZSBSZWdpc3RlciAqLwogCiAJU0NJeF9OUl9SRUdTLAogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc21wLmggYi9pbmNsdWRlL2xpbnV4L3NtcC5oCmluZGV4IDZhZTAwNGUuLjYzM2Y1ZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc21wLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbXAuaApAQCAtMTcsMTAgKzE3LDcgQEAKIAogdHlwZWRlZiB2b2lkICgqc21wX2NhbGxfZnVuY190KSh2b2lkICppbmZvKTsKIHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhIHsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQkJc3RydWN0IGxsaXN0X25vZGUgbGxpc3Q7Ci0JfTsKKwlzdHJ1Y3QgbGxpc3Rfbm9kZSBsbGlzdDsKIAlzbXBfY2FsbF9mdW5jX3QgZnVuYzsKIAl2b2lkICppbmZvOwogCXUxNiBmbGFnczsKQEAgLTUzLDggKzUwLDcgQEAKIAkJc21wX2NhbGxfZnVuY190IGZ1bmMsIHZvaWQgKmluZm8sIGJvb2wgd2FpdCwKIAkJZ2ZwX3QgZ2ZwX2ZsYWdzKTsKIAotdm9pZCBfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShpbnQgY3B1aWQsIHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhICpkYXRhLAotCQkJCWludCB3YWl0KTsKK2ludCBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGVfYXN5bmMoaW50IGNwdSwgc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgKmNzZCk7CiAKICNpZmRlZiBDT05GSUdfU01QCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKaW5kZXggNDIwM2M2Ni4uMzZjODZlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKQEAgLTI0LDYgKzI0LDkgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorCitzdHJ1Y3QgZG1hX2NoYW47CiAKIC8qCiAgKiBJTlRFUkZBQ0VTIGJldHdlZW4gU1BJIG1hc3Rlci1zaWRlIGRyaXZlcnMgYW5kIFNQSSBpbmZyYXN0cnVjdHVyZS4KQEAgLTI2Niw2ICsyNjksNyBAQAogICogQGF1dG9fcnVudGltZV9wbTogdGhlIGNvcmUgc2hvdWxkIGVuc3VyZSBhIHJ1bnRpbWUgUE0gcmVmZXJlbmNlIGlzIGhlbGQKICAqICAgICAgICAgICAgICAgICAgIHdoaWxlIHRoZSBoYXJkd2FyZSBpcyBwcmVwYXJlZCwgdXNpbmcgdGhlIHBhcmVudAogICogICAgICAgICAgICAgICAgICAgZGV2aWNlIGZvciB0aGUgc3BpZGV2CisgKiBAbWF4X2RtYV9sZW46IE1heGltdW0gbGVuZ3RoIG9mIGEgRE1BIHRyYW5zZmVyIGZvciB0aGUgZGV2aWNlLgogICogQHByZXBhcmVfdHJhbnNmZXJfaGFyZHdhcmU6IGEgbWVzc2FnZSB3aWxsIHNvb24gYXJyaXZlIGZyb20gdGhlIHF1ZXVlCiAgKglzbyB0aGUgc3Vic3lzdGVtIHJlcXVlc3RzIHRoZSBkcml2ZXIgdG8gcHJlcGFyZSB0aGUgdHJhbnNmZXIgaGFyZHdhcmUKICAqCWJ5IGlzc3VpbmcgdGhpcyBjYWxsCkBAIC0zNDgsNiArMzUyLDggQEAKICNkZWZpbmUgU1BJX01BU1RFUl9IQUxGX0RVUExFWAlCSVQoMCkJCS8qIGNhbid0IGRvIGZ1bGwgZHVwbGV4ICovCiAjZGVmaW5lIFNQSV9NQVNURVJfTk9fUlgJQklUKDEpCQkvKiBjYW4ndCBkbyBidWZmZXIgcmVhZCAqLwogI2RlZmluZSBTUElfTUFTVEVSX05PX1RYCUJJVCgyKQkJLyogY2FuJ3QgZG8gYnVmZmVyIHdyaXRlICovCisjZGVmaW5lIFNQSV9NQVNURVJfTVVTVF9SWCAgICAgIEJJVCgzKQkJLyogcmVxdWlyZXMgcnggKi8KKyNkZWZpbmUgU1BJX01BU1RFUl9NVVNUX1RYICAgICAgQklUKDQpCQkvKiByZXF1aXJlcyB0eCAqLwogCiAJLyogbG9jayBhbmQgbXV0ZXggZm9yIFNQSSBidXMgbG9ja2luZyAqLwogCXNwaW5sb2NrX3QJCWJ1c19sb2NrX3NwaW5sb2NrOwpAQCAtMzkwLDYgKzM5NiwxNyBAQAogCXZvaWQJCQkoKmNsZWFudXApKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpOwogCiAJLyoKKwkgKiBVc2VkIHRvIGVuYWJsZSBjb3JlIHN1cHBvcnQgZm9yIERNQSBoYW5kbGluZywgaWYgY2FuX2RtYSgpCisJICogZXhpc3RzIGFuZCByZXR1cm5zIHRydWUgdGhlbiB0aGUgdHJhbnNmZXIgd2lsbCBiZSBtYXBwZWQKKwkgKiBwcmlvciB0byB0cmFuc2Zlcl9vbmUoKSBiZWluZyBjYWxsZWQuICBUaGUgZHJpdmVyIHNob3VsZAorCSAqIG5vdCBtb2RpZnkgb3Igc3RvcmUgeGZlciBhbmQgZG1hX3R4IGFuZCBkbWFfcnggbXVzdCBiZSBzZXQKKwkgKiB3aGlsZSB0aGUgZGV2aWNlIGlzIHByZXBhcmVkLgorCSAqLworCWJvb2wJCQkoKmNhbl9kbWEpKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCQkJCSAgIHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJCSAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpOworCisJLyoKIAkgKiBUaGVzZSBob29rcyBhcmUgZm9yIGRyaXZlcnMgdGhhdCB3YW50IHRvIHVzZSB0aGUgZ2VuZXJpYwogCSAqIG1hc3RlciB0cmFuc2ZlciBxdWV1ZWluZyBtZWNoYW5pc20uIElmIHRoZXNlIGFyZSB1c2VkLCB0aGUKIAkgKiB0cmFuc2ZlcigpIGZ1bmN0aW9uIGFib3ZlIG11c3QgTk9UIGJlIHNwZWNpZmllZCBieSB0aGUgZHJpdmVyLgpAQCAtNDA3LDcgKzQyNCw5IEBACiAJYm9vbAkJCQlydDsKIAlib29sCQkJCWF1dG9fcnVudGltZV9wbTsKIAlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9tc2dfcHJlcGFyZWQ7CisJYm9vbAkJCQljdXJfbXNnX21hcHBlZDsKIAlzdHJ1Y3QgY29tcGxldGlvbiAgICAgICAgICAgICAgIHhmZXJfY29tcGxldGlvbjsKKwlzaXplX3QJCQkJbWF4X2RtYV9sZW47CiAKIAlpbnQgKCpwcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlKShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKTsKIAlpbnQgKCp0cmFuc2Zlcl9vbmVfbWVzc2FnZSkoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKQEAgLTQyOCw2ICs0NDcsMTQgQEAKIAogCS8qIGdwaW8gY2hpcCBzZWxlY3QgKi8KIAlpbnQJCQkqY3NfZ3Bpb3M7CisKKwkvKiBETUEgY2hhbm5lbHMgZm9yIHVzZSB3aXRoIGNvcmUgZG1hZW5naW5lIGhlbHBlcnMgKi8KKwlzdHJ1Y3QgZG1hX2NoYW4JCSpkbWFfdHg7CisJc3RydWN0IGRtYV9jaGFuCQkqZG1hX3J4OworCisJLyogZHVtbXkgZGF0YSBmb3IgZnVsbCBkdXBsZXggZGV2aWNlcyAqLworCXZvaWQJCQkqZHVtbXlfcng7CisJdm9pZAkJCSpkdW1teV90eDsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQpAQCAtNTEyLDYgKzUzOSw4IEBACiAgKgkob3B0aW9uYWxseSkgY2hhbmdpbmcgdGhlIGNoaXBzZWxlY3Qgc3RhdHVzLCB0aGVuIHN0YXJ0aW5nCiAgKgl0aGUgbmV4dCB0cmFuc2ZlciBvciBjb21wbGV0aW5nIHRoaXMgQHNwaV9tZXNzYWdlLgogICogQHRyYW5zZmVyX2xpc3Q6IHRyYW5zZmVycyBhcmUgc2VxdWVuY2VkIHRocm91Z2ggQHNwaV9tZXNzYWdlLnRyYW5zZmVycworICogQHR4X3NnOiBTY2F0dGVybGlzdCBmb3IgdHJhbnNtaXQsIGN1cnJlbnRseSBub3QgZm9yIGNsaWVudCB1c2UKKyAqIEByeF9zZzogU2NhdHRlcmxpc3QgZm9yIHJlY2VpdmUsIGN1cnJlbnRseSBub3QgZm9yIGNsaWVudCB1c2UKICAqCiAgKiBTUEkgdHJhbnNmZXJzIGFsd2F5cyB3cml0ZSB0aGUgc2FtZSBudW1iZXIgb2YgYnl0ZXMgYXMgdGhleSByZWFkLgogICogUHJvdG9jb2wgZHJpdmVycyBzaG91bGQgYWx3YXlzIHByb3ZpZGUgQHJ4X2J1ZiBhbmQvb3IgQHR4X2J1Zi4KQEAgLTU3OSw2ICs2MDgsOCBAQAogCiAJZG1hX2FkZHJfdAl0eF9kbWE7CiAJZG1hX2FkZHJfdAlyeF9kbWE7CisJc3RydWN0IHNnX3RhYmxlIHR4X3NnOworCXN0cnVjdCBzZ190YWJsZSByeF9zZzsKIAogCXVuc2lnbmVkCWNzX2NoYW5nZToxOwogCXVuc2lnbmVkCXR4X25iaXRzOjM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpX2JpdGJhbmcuaAppbmRleCBkYWViYWJhLi44NTU3OGQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL3NwaV9iaXRiYW5nLmgKQEAgLTQyLDYgKzQyLDYgQEAKIAogLyogc3RhcnQgb3Igc3RvcCBxdWV1ZSBwcm9jZXNzaW5nICovCiBleHRlcm4gaW50IHNwaV9iaXRiYW5nX3N0YXJ0KHN0cnVjdCBzcGlfYml0YmFuZyAqc3BpKTsKLWV4dGVybiBpbnQgc3BpX2JpdGJhbmdfc3RvcChzdHJ1Y3Qgc3BpX2JpdGJhbmcgKnNwaSk7CitleHRlcm4gdm9pZCBzcGlfYml0YmFuZ19zdG9wKHN0cnVjdCBzcGlfYml0YmFuZyAqc3BpKTsKIAogI2VuZGlmCS8qIF9fU1BJX0JJVEJBTkdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcG1pLmggYi9pbmNsdWRlL2xpbnV4L3NwbWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWY1ZWFiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zcG1pLmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9MSU5VWF9TUE1JX0gKKyNkZWZpbmUgX0xJTlVYX1NQTUlfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKworLyogTWF4aW11bSBzbGF2ZSBpZGVudGlmaWVyICovCisjZGVmaW5lIFNQTUlfTUFYX1NMQVZFX0lECQkxNgorCisvKiBTUE1JIENvbW1hbmRzICovCisjZGVmaW5lIFNQTUlfQ01EX0VYVF9XUklURQkJMHgwMAorI2RlZmluZSBTUE1JX0NNRF9SRVNFVAkJCTB4MTAKKyNkZWZpbmUgU1BNSV9DTURfU0xFRVAJCQkweDExCisjZGVmaW5lIFNQTUlfQ01EX1NIVVRET1dOCQkweDEyCisjZGVmaW5lIFNQTUlfQ01EX1dBS0VVUAkJCTB4MTMKKyNkZWZpbmUgU1BNSV9DTURfQVVUSEVOVElDQVRFCQkweDE0CisjZGVmaW5lIFNQTUlfQ01EX01TVFJfUkVBRAkJMHgxNQorI2RlZmluZSBTUE1JX0NNRF9NU1RSX1dSSVRFCQkweDE2CisjZGVmaW5lIFNQTUlfQ01EX1RSQU5TRkVSX0JVU19PV05FUlNISVAJMHgxQQorI2RlZmluZSBTUE1JX0NNRF9EREJfTUFTVEVSX1JFQUQJMHgxQgorI2RlZmluZSBTUE1JX0NNRF9EREJfU0xBVkVfUkVBRAkJMHgxQworI2RlZmluZSBTUE1JX0NNRF9FWFRfUkVBRAkJMHgyMAorI2RlZmluZSBTUE1JX0NNRF9FWFRfV1JJVEVMCQkweDMwCisjZGVmaW5lIFNQTUlfQ01EX0VYVF9SRUFETAkJMHgzOAorI2RlZmluZSBTUE1JX0NNRF9XUklURQkJCTB4NDAKKyNkZWZpbmUgU1BNSV9DTURfUkVBRAkJCTB4NjAKKyNkZWZpbmUgU1BNSV9DTURfWkVST19XUklURQkJMHg4MAorCisvKioKKyAqIHN0cnVjdCBzcG1pX2RldmljZSAtIEJhc2ljIHJlcHJlc2VudGF0aW9uIG9mIGFuIFNQTUkgZGV2aWNlCisgKiBAZGV2OglEcml2ZXIgbW9kZWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRldmljZS4KKyAqIEBjdHJsOglTUE1JIGNvbnRyb2xsZXIgbWFuYWdpbmcgdGhlIGJ1cyBob3N0aW5nIHRoaXMgZGV2aWNlLgorICogQHVzaWQ6CVRoaXMgZGV2aWNlcycgVW5pcXVlIFNsYXZlIElEZW50aWZpZXIuCisgKi8KK3N0cnVjdCBzcG1pX2RldmljZSB7CisJc3RydWN0IGRldmljZQkJZGV2OworCXN0cnVjdCBzcG1pX2NvbnRyb2xsZXIJKmN0cmw7CisJdTgJCQl1c2lkOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnRvX3NwbWlfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3Qgc3BtaV9kZXZpY2UsIGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqc3BtaV9kZXZpY2VfZ2V0X2RydmRhdGEoY29uc3Qgc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2KQoreworCXJldHVybiBkZXZfZ2V0X2RydmRhdGEoJnNkZXYtPmRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcG1pX2RldmljZV9zZXRfZHJ2ZGF0YShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsIHZvaWQgKmRhdGEpCit7CisJZGV2X3NldF9kcnZkYXRhKCZzZGV2LT5kZXYsIGRhdGEpOworfQorCitzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNwbWlfZGV2aWNlX2FsbG9jKHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwpOworCitzdGF0aWMgaW5saW5lIHZvaWQgc3BtaV9kZXZpY2VfcHV0KHN0cnVjdCBzcG1pX2RldmljZSAqc2RldikKK3sKKwlpZiAoc2RldikKKwkJcHV0X2RldmljZSgmc2Rldi0+ZGV2KTsKK30KKworaW50IHNwbWlfZGV2aWNlX2FkZChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpOworCit2b2lkIHNwbWlfZGV2aWNlX3JlbW92ZShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpOworCisvKioKKyAqIHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgLSBpbnRlcmZhY2UgdG8gdGhlIFNQTUkgbWFzdGVyIGNvbnRyb2xsZXIKKyAqIEBkZXY6CURyaXZlciBtb2RlbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGV2aWNlLgorICogQG5yOgkJYm9hcmQtc3BlY2lmaWMgbnVtYmVyIGlkZW50aWZpZXIgZm9yIHRoaXMgY29udHJvbGxlci9idXMKKyAqIEBjbWQ6CXNlbmRzIGEgbm9uLWRhdGEgY29tbWFuZCBzZXF1ZW5jZSBvbiB0aGUgU1BNSSBidXMuCisgKiBAcmVhZF9jbWQ6CXNlbmRzIGEgcmVnaXN0ZXIgcmVhZCBjb21tYW5kIHNlcXVlbmNlIG9uIHRoZSBTUE1JIGJ1cy4KKyAqIEB3cml0ZV9jbWQ6CXNlbmRzIGEgcmVnaXN0ZXIgd3JpdGUgY29tbWFuZCBzZXF1ZW5jZSBvbiB0aGUgU1BNSSBidXMuCisgKi8KK3N0cnVjdCBzcG1pX2NvbnRyb2xsZXIgeworCXN0cnVjdCBkZXZpY2UJCWRldjsKKwl1bnNpZ25lZCBpbnQJCW5yOworCWludAkoKmNtZCkoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCwgdTggb3Bjb2RlLCB1OCBzaWQpOworCWludAkoKnJlYWRfY21kKShzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsLCB1OCBvcGNvZGUsCisJCQkgICAgdTggc2lkLCB1MTYgYWRkciwgdTggKmJ1Ziwgc2l6ZV90IGxlbik7CisJaW50CSgqd3JpdGVfY21kKShzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsLCB1OCBvcGNvZGUsCisJCQkgICAgIHU4IHNpZCwgdTE2IGFkZHIsIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4pOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICp0b19zcG1pX2NvbnRyb2xsZXIoc3RydWN0IGRldmljZSAqZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGQsIHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIsIGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgKnNwbWlfY29udHJvbGxlcl9nZXRfZHJ2ZGF0YShjb25zdCBzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsKQoreworCXJldHVybiBkZXZfZ2V0X2RydmRhdGEoJmN0cmwtPmRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcG1pX2NvbnRyb2xsZXJfc2V0X2RydmRhdGEoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCwKKwkJCQkJICAgICAgIHZvaWQgKmRhdGEpCit7CisJZGV2X3NldF9kcnZkYXRhKCZjdHJsLT5kZXYsIGRhdGEpOworfQorCitzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpzcG1pX2NvbnRyb2xsZXJfYWxsb2Moc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJCQkgICAgICBzaXplX3Qgc2l6ZSk7CisKKy8qKgorICogc3BtaV9jb250cm9sbGVyX3B1dCgpIC0gZGVjcmVtZW50IGNvbnRyb2xsZXIgcmVmY291bnQKKyAqIEBjdHJsCVNQTUkgY29udHJvbGxlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNwbWlfY29udHJvbGxlcl9wdXQoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCkKK3sKKwlpZiAoY3RybCkKKwkJcHV0X2RldmljZSgmY3RybC0+ZGV2KTsKK30KKworaW50IHNwbWlfY29udHJvbGxlcl9hZGQoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCk7Cit2b2lkIHNwbWlfY29udHJvbGxlcl9yZW1vdmUoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCk7CisKKy8qKgorICogc3RydWN0IHNwbWlfZHJpdmVyIC0gU1BNSSBzbGF2ZSBkZXZpY2UgZHJpdmVyCisgKiBAZHJpdmVyOglTUE1JIGRldmljZSBkcml2ZXJzIHNob3VsZCBpbml0aWFsaXplIG5hbWUgYW5kIG93bmVyIGZpZWxkIG9mCisgKgkJdGhpcyBzdHJ1Y3R1cmUuCisgKiBAcHJvYmU6CWJpbmRzIHRoaXMgZHJpdmVyIHRvIGEgU1BNSSBkZXZpY2UuCisgKiBAcmVtb3ZlOgl1bmJpbmRzIHRoaXMgZHJpdmVyIGZyb20gdGhlIFNQTUkgZGV2aWNlLgorICogQHNodXRkb3duOglzdGFuZGFyZCBzaHV0ZG93biBjYWxsYmFjayB1c2VkIGR1cmluZyBwb3dlcmRvd24vaGFsdC4KKyAqIEBzdXNwZW5kOglzdGFuZGFyZCBzdXNwZW5kIGNhbGxiYWNrIHVzZWQgZHVyaW5nIHN5c3RlbSBzdXNwZW5kLgorICogQHJlc3VtZToJc3RhbmRhcmQgcmVzdW1lIGNhbGxiYWNrIHVzZWQgZHVyaW5nIHN5c3RlbSByZXN1bWUuCisgKgorICogSWYgUE0gcnVudGltZSBzdXBwb3J0IGlzIGRlc2lyZWQgZm9yIGEgc2xhdmUsIGEgZGV2aWNlIGRyaXZlciBjYW4gY2FsbAorICogcG1fcnVudGltZV9wdXQoKSBmcm9tIHRoZWlyIHByb2JlKCkgcm91dGluZSAoYW5kIGEgYmFsYW5jaW5nCisgKiBwbV9ydW50aW1lX2dldCgpIGluIHJlbW92ZSgpKS4gIFBNIHJ1bnRpbWUgc3VwcG9ydCBmb3IgYSBzbGF2ZSBpcworICogaW1wbGVtZW50ZWQgYnkgaXNzdWluZyBhIFNMRUVQIGNvbW1hbmQgdG8gdGhlIHNsYXZlIG9uIHJ1bnRpbWVfc3VzcGVuZCgpLAorICogdHJhbnNpdGlvbmluZyB0aGUgc2xhdmUgaW50byB0aGUgU0xFRVAgc3RhdGUuICBPbiBydW50aW1lX3Jlc3VtZSgpLCBhIFdBS0VVUAorICogY29tbWFuZCBpcyBzZW50IHRvIHRoZSBzbGF2ZSB0byBicmluZyBpdCBiYWNrIHRvIEFDVElWRS4KKyAqLworc3RydWN0IHNwbWlfZHJpdmVyIHsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7CisJaW50CSgqcHJvYmUpKHN0cnVjdCBzcG1pX2RldmljZSAqc2Rldik7CisJdm9pZAkoKnJlbW92ZSkoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2KTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNwbWlfZHJpdmVyICp0b19zcG1pX2RyaXZlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGQsIHN0cnVjdCBzcG1pX2RyaXZlciwgZHJpdmVyKTsKK30KKworaW50IHNwbWlfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBzcG1pX2RyaXZlciAqc2Rydik7CisKKy8qKgorICogc3BtaV9kcml2ZXJfdW5yZWdpc3RlcigpIC0gdW5yZWdpc3RlciBhbiBTUE1JIGNsaWVudCBkcml2ZXIKKyAqIEBzZHJ2Ogl0aGUgZHJpdmVyIHRvIHVucmVnaXN0ZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNwbWlfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IHNwbWlfZHJpdmVyICpzZHJ2KQoreworCWlmIChzZHJ2KQorCQlkcml2ZXJfdW5yZWdpc3Rlcigmc2Rydi0+ZHJpdmVyKTsKK30KKworI2RlZmluZSBtb2R1bGVfc3BtaV9kcml2ZXIoX19zcG1pX2RyaXZlcikgXAorCW1vZHVsZV9kcml2ZXIoX19zcG1pX2RyaXZlciwgc3BtaV9kcml2ZXJfcmVnaXN0ZXIsIFwKKwkJCXNwbWlfZHJpdmVyX3VucmVnaXN0ZXIpCisKK2ludCBzcG1pX3JlZ2lzdGVyX3JlYWQoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LCB1OCBhZGRyLCB1OCAqYnVmKTsKK2ludCBzcG1pX2V4dF9yZWdpc3Rlcl9yZWFkKHN0cnVjdCBzcG1pX2RldmljZSAqc2RldiwgdTggYWRkciwgdTggKmJ1ZiwKKwkJCSAgIHNpemVfdCBsZW4pOworaW50IHNwbWlfZXh0X3JlZ2lzdGVyX3JlYWRsKHN0cnVjdCBzcG1pX2RldmljZSAqc2RldiwgdTE2IGFkZHIsIHU4ICpidWYsCisJCQkgICAgc2l6ZV90IGxlbik7CitpbnQgc3BtaV9yZWdpc3Rlcl93cml0ZShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsIHU4IGFkZHIsIHU4IGRhdGEpOworaW50IHNwbWlfcmVnaXN0ZXJfemVyb193cml0ZShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsIHU4IGRhdGEpOworaW50IHNwbWlfZXh0X3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBzcG1pX2RldmljZSAqc2RldiwgdTggYWRkciwKKwkJCSAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKTsKK2ludCBzcG1pX2V4dF9yZWdpc3Rlcl93cml0ZWwoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LCB1MTYgYWRkciwKKwkJCSAgICAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbik7CitpbnQgc3BtaV9jb21tYW5kX3Jlc2V0KHN0cnVjdCBzcG1pX2RldmljZSAqc2Rldik7CitpbnQgc3BtaV9jb21tYW5kX3NsZWVwKHN0cnVjdCBzcG1pX2RldmljZSAqc2Rldik7CitpbnQgc3BtaV9jb21tYW5kX3dha2V1cChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpOworaW50IHNwbWlfY29tbWFuZF9zaHV0ZG93bihzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzZnMuaCBiL2luY2x1ZGUvbGludXgvc3lzZnMuaAppbmRleCAzMGIyZWJlLi5lMGJmMjEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNmcy5oCkBAIC0xOTgsNiArMTk4LDcgQEAKIAkJCQkgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIHVtb2RlX3QgbW9kZSk7CiB2b2lkIHN5c2ZzX3JlbW92ZV9maWxlX25zKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAogCQkJICBjb25zdCB2b2lkICpucyk7Citib29sIHN5c2ZzX3JlbW92ZV9maWxlX3NlbGYoc3RydWN0IGtvYmplY3QgKmtvYmosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIpOwogdm9pZCBzeXNmc19yZW1vdmVfZmlsZXMoc3RydWN0IGtvYmplY3QgKmtvYmosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKiphdHRyKTsKIAogaW50IF9fbXVzdF9jaGVjayBzeXNmc19jcmVhdGVfYmluX2ZpbGUoc3RydWN0IGtvYmplY3QgKmtvYmosCkBAIC0yNDYsNiArMjQ3LDExIEBACiAKIGludCBfX211c3RfY2hlY2sgc3lzZnNfaW5pdCh2b2lkKTsKIAorc3RhdGljIGlubGluZSB2b2lkIHN5c2ZzX2VuYWJsZV9ucyhzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQoreworCXJldHVybiBrZXJuZnNfZW5hYmxlX25zKGtuKTsKK30KKwogI2Vsc2UgLyogQ09ORklHX1NZU0ZTICovCiAKIHN0YXRpYyBpbmxpbmUgaW50IHN5c2ZzX3NjaGVkdWxlX2NhbGxiYWNrKHN0cnVjdCBrb2JqZWN0ICprb2JqLApAQCAtMzAxLDYgKzMwNywxMiBAQAogewogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgc3lzZnNfcmVtb3ZlX2ZpbGVfc2VsZihzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyKQoreworCXJldHVybiBmYWxzZTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHN5c2ZzX3JlbW92ZV9maWxlcyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKiphdHRyKQogewpAQCAtNDE4LDYgKzQzMCwxMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgc3lzZnNfZW5hYmxlX25zKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCit7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfU1lTRlMgKi8KIAogc3RhdGljIGlubGluZSBpbnQgX19tdXN0X2NoZWNrIHN5c2ZzX2NyZWF0ZV9maWxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90dHkuaCBiL2luY2x1ZGUvbGludXgvdHR5LmgKaW5kZXggOTBiNGZkYy4uYjkwYjVjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90dHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3R0eS5oCkBAIC0yMDgsNyArMjA4LDcgQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdAlkZWx0YV9tc3Jfd2FpdDsJLyogTW9kZW0gc3RhdHVzIGNoYW5nZSAqLwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwkJLyogVFRZIGZsYWdzIEFTWV8qLwogCXVuc2lnbmVkIGNoYXIJCWNvbnNvbGU6MSwJLyogcG9ydCBpcyBhIGNvbnNvbGUgKi8KLQkJCQlsb3dfbGF0ZW5jeToxOwkvKiBkaXJlY3QgYnVmZmVyIGZsdXNoICovCisJCQkJbG93X2xhdGVuY3k6MTsJLyogb3B0aW9uYWw6IHR1bmUgZm9yIGxhdGVuY3kgKi8KIAlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwkJLyogTG9ja2luZyAqLwogCXN0cnVjdCBtdXRleAkJYnVmX211dGV4OwkvKiBCdWZmZXIgYWxsb2MgbG9jayAqLwogCXVuc2lnbmVkIGNoYXIJCSp4bWl0X2J1ZjsJLyogT3B0aW9uYWwgYnVmZmVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R0eV9sZGlzYy5oIGIvaW5jbHVkZS9saW51eC90dHlfbGRpc2MuaAppbmRleCBiODM0N2MyMC4uYWRkMjZkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90dHlfbGRpc2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3R0eV9sZGlzYy5oCkBAIC0xMjYsNyArMTI2LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KIAogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IuaCBiL2luY2x1ZGUvbGludXgvdXNiLmgKaW5kZXggN2Y2ZWI4NS4uNmI3ZWMzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi5oCkBAIC01Nyw2ICs1Nyw3IEBACiAgKiBAZXh0cmE6IGRlc2NyaXB0b3JzIGZvbGxvd2luZyB0aGlzIGVuZHBvaW50IGluIHRoZSBjb25maWd1cmF0aW9uCiAgKiBAZXh0cmFsZW46IGhvdyBtYW55IGJ5dGVzIG9mICJleHRyYSIgYXJlIHZhbGlkCiAgKiBAZW5hYmxlZDogVVJCcyBtYXkgYmUgc3VibWl0dGVkIHRvIHRoaXMgZW5kcG9pbnQKKyAqIEBzdHJlYW1zOiBudW1iZXIgb2YgVVNCLTMgc3RyZWFtcyBhbGxvY2F0ZWQgb24gdGhlIGVuZHBvaW50CiAgKgogICogVVNCIHJlcXVlc3RzIGFyZSBhbHdheXMgcXVldWVkIHRvIGEgZ2l2ZW4gZW5kcG9pbnQsIGlkZW50aWZpZWQgYnkgYQogICogZGVzY3JpcHRvciB3aXRoaW4gYW4gYWN0aXZlIGludGVyZmFjZSBpbiBhIGdpdmVuIFVTQiBjb25maWd1cmF0aW9uLgpAQCAtNzEsNiArNzIsNyBAQAogCXVuc2lnbmVkIGNoYXIgKmV4dHJhOyAgIC8qIEV4dHJhIGRlc2NyaXB0b3JzICovCiAJaW50IGV4dHJhbGVuOwogCWludCBlbmFibGVkOworCWludCBzdHJlYW1zOwogfTsKIAogLyogaG9zdC1zaWRlIHdyYXBwZXIgZm9yIG9uZSBpbnRlcmZhY2Ugc2V0dGluZydzIHBhcnNlZCBkZXNjcmlwdG9ycyAqLwpAQCAtMjAyLDYgKzIwNCw4IEBACiBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdXNiX2dldF9pbnRmKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIHZvaWQgdXNiX3B1dF9pbnRmKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIAorLyogSGFyZCBsaW1pdCAqLworI2RlZmluZSBVU0JfTUFYRU5EUE9JTlRTCTMwCiAvKiB0aGlzIG1heGltdW0gaXMgYXJiaXRyYXJ5ICovCiAjZGVmaW5lIFVTQl9NQVhJTlRFUkZBQ0VTCTMyCiAjZGVmaW5lIFVTQl9NQVhJQURTCQkoVVNCX01BWElOVEVSRkFDRVMvMikKQEAgLTM2Niw2ICszNzAsOCBAQAogI2VuZGlmCiB9OwogCitzdHJ1Y3QgdXNiX2Rldl9zdGF0ZTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RydWN0IHVzYl90dDsKQEAgLTc0OSw2ICs3NTUsMTEgQEAKIAkJdW5zaWduZWQgaW50IGlmYWNlX251bSwKIAkJdW5zaWduZWQgaW50IGFsdF9udW0pOwogCisvKiBwb3J0IGNsYWltaW5nIGZ1bmN0aW9ucyAqLworaW50IHVzYl9odWJfY2xhaW1fcG9ydChzdHJ1Y3QgdXNiX2RldmljZSAqaGRldiwgdW5zaWduZWQgcG9ydDEsCisJCXN0cnVjdCB1c2JfZGV2X3N0YXRlICpvd25lcik7CitpbnQgdXNiX2h1Yl9yZWxlYXNlX3BvcnQoc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYsIHVuc2lnbmVkIHBvcnQxLAorCQlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqb3duZXIpOwogCiAvKioKICAqIHVzYl9tYWtlX3BhdGggLSByZXR1cm5zIHN0YWJsZSBkZXZpY2UgcGF0aCBpbiB0aGUgdXNiIHRyZWUKQEAgLTE2NjYsNiArMTY3NywxMCBAQAogLyogdGhpcyByZXF1ZXN0IGlzbid0IHJlYWxseSBzeW5jaHJvbm91cywgYnV0IGl0IGJlbG9uZ3Mgd2l0aCB0aGUgb3RoZXJzICovCiBleHRlcm4gaW50IHVzYl9kcml2ZXJfc2V0X2NvbmZpZ3VyYXRpb24oc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIGludCBjb25maWcpOwogCisvKiBjaG9vc2UgYW5kIHNldCBjb25maWd1cmF0aW9uIGZvciBkZXZpY2UgKi8KK2V4dGVybiBpbnQgdXNiX2Nob29zZV9jb25maWd1cmF0aW9uKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KTsKK2V4dGVybiBpbnQgdXNiX3NldF9jb25maWd1cmF0aW9uKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBjb25maWd1cmF0aW9uKTsKKwogLyoKICAqIHRpbWVvdXRzLCBpbiBtaWxsaXNlY29uZHMsIHVzZWQgZm9yIHNlbmRpbmcvcmVjZWl2aW5nIGNvbnRyb2wgbWVzc2FnZXMKICAqIHRoZXkgdHlwaWNhbGx5IGNvbXBsZXRlIHdpdGhpbiBhIGZldyBmcmFtZXMgKG1zZWMpIGFmdGVyIHRoZXkncmUgaXNzdWVkCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9jaGlwaWRlYS5oIGIvaW5jbHVkZS9saW51eC91c2IvY2hpcGlkZWEuaAppbmRleCA3MDhiZDExLi5iYmU3NzlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9jaGlwaWRlYS5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL2NoaXBpZGVhLmgKQEAgLTI1LDYgKzI1LDcgQEAKIAkgKi8KICNkZWZpbmUgQ0lfSERSQ19EVUFMX1JPTEVfTk9UX09URwlCSVQoNCkKICNkZWZpbmUgQ0lfSERSQ19JTVgyOF9XUklURV9GSVgJCUJJVCg1KQorI2RlZmluZSBDSV9IRFJDX0ZPUkNFX0ZVTExTUEVFRAkJQklUKDYpCiAJZW51bSB1c2JfZHJfbW9kZQlkcl9tb2RlOwogI2RlZmluZSBDSV9IRFJDX0NPTlRST0xMRVJfUkVTRVRfRVZFTlQJCTAKICNkZWZpbmUgQ0lfSERSQ19DT05UUk9MTEVSX1NUT1BQRURfRVZFTlQJMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvaGNkLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9oY2QuaAppbmRleCBlZmU4ZDhhLi40ODVjZDVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9oY2QuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9oY2QuaApAQCAtMTQzLDYgKzE0Myw3IEBACiAJdW5zaWduZWQJCWF1dGhvcml6ZWRfZGVmYXVsdDoxOwogCXVuc2lnbmVkCQloYXNfdHQ6MTsJLyogSW50ZWdyYXRlZCBUVCBpbiByb290IGh1YiAqLwogCXVuc2lnbmVkCQlhbWRfcmVzdW1lX2J1ZzoxOyAvKiBBTUQgcmVtb3RlIHdha2V1cCBxdWlyayAqLworCXVuc2lnbmVkCQljYW5fZG9fc3RyZWFtczoxOyAvKiBIQyBzdXBwb3J0cyBzdHJlYW1zICovCiAKIAl1bnNpZ25lZCBpbnQJCWlycTsJCS8qIGlycSBhbGxvY2F0ZWQgKi8KIAl2b2lkIF9faW9tZW0JCSpyZWdzOwkJLyogZGV2aWNlIG1lbW9yeS9pbyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvcGh5LmggYi9pbmNsdWRlL2xpbnV4L3VzYi9waHkuaAppbmRleCA2YzBiMWM1Li4zNTMwNTNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9waHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9waHkuaApAQCAtMTExLDYgKzExMSwxMyBAQAogCWludAkoKnNldF9zdXNwZW5kKShzdHJ1Y3QgdXNiX3BoeSAqeCwKIAkJCQlpbnQgc3VzcGVuZCk7CiAKKwkvKgorCSAqIFNldCB3YWtldXAgZW5hYmxlIGZvciBQSFksIGluIHRoYXQgY2FzZSwgdGhlIFBIWSBjYW4gYmUKKwkgKiB3b2tlbiB1cCBmcm9tIHN1c3BlbmQgc3RhdHVzIGR1ZSB0byBleHRlcm5hbCBldmVudHMsCisJICogbGlrZSB2YnVzIGNoYW5nZSwgZHAvZG0gY2hhbmdlIGFuZCBpZC4KKwkgKi8KKwlpbnQJKCpzZXRfd2FrZXVwKShzdHJ1Y3QgdXNiX3BoeSAqeCwgYm9vbCBlbmFibGVkKTsKKwogCS8qIG5vdGlmeSBwaHkgY29ubmVjdCBzdGF0dXMgY2hhbmdlICovCiAJaW50CSgqbm90aWZ5X2Nvbm5lY3QpKHN0cnVjdCB1c2JfcGh5ICp4LAogCQkJZW51bSB1c2JfZGV2aWNlX3NwZWVkIHNwZWVkKTsKQEAgLTI2NSw2ICsyNzIsMTUgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKK3VzYl9waHlfc2V0X3dha2V1cChzdHJ1Y3QgdXNiX3BoeSAqeCwgYm9vbCBlbmFibGVkKQoreworCWlmICh4ICYmIHgtPnNldF93YWtldXApCisJCXJldHVybiB4LT5zZXRfd2FrZXVwKHgsIGVuYWJsZWQpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CiB1c2JfcGh5X25vdGlmeV9jb25uZWN0KHN0cnVjdCB1c2JfcGh5ICp4LCBlbnVtIHVzYl9kZXZpY2Vfc3BlZWQgc3BlZWQpCiB7CiAJaWYgKHggJiYgeC0+bm90aWZ5X2Nvbm5lY3QpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9zZXJpYWwuaCBiL2luY2x1ZGUvbGludXgvdXNiL3NlcmlhbC5oCmluZGV4IDcwNGExYWIuLjliYjU0N2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL3NlcmlhbC5oCkBAIC0xOTAsNyArMTkwLDggQEAKICAqIEBudW1fcG9ydHM6IHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IHBvcnRzIHRoaXMgZGV2aWNlIHdpbGwgaGF2ZS4KICAqIEBidWxrX2luX3NpemU6IG1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlIGZvciBidWxrLWluIGJ1ZmZlcgogICoJKDAgPSBlbmQtcG9pbnQgc2l6ZSkKLSAqIEBidWxrX291dF9zaXplOiBieXRlcyB0byBhbGxvY2F0ZSBmb3IgYnVsay1vdXQgYnVmZmVyICgwID0gZW5kLXBvaW50IHNpemUpCisgKiBAYnVsa19vdXRfc2l6ZTogbWluaW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUgZm9yIGJ1bGstb3V0IGJ1ZmZlcgorICoJKDAgPSBlbmQtcG9pbnQgc2l6ZSkKICAqIEBjYWxjX251bV9wb3J0czogcG9pbnRlciB0byBhIGZ1bmN0aW9uIHRvIGRldGVybWluZSBob3cgbWFueSBwb3J0cyB0aGlzCiAgKglkZXZpY2UgaGFzIGR5bmFtaWNhbGx5LiAgSXQgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHByb2JlKCkKICAqCWNhbGxiYWNrIGlzIGNhbGxlZCwgYnV0IGJlZm9yZSBhdHRhY2goKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvdWFzLmggYi9pbmNsdWRlL2xpbnV4L3VzYi91YXMuaAppbmRleCA1NDk5YWI1Li4zZmM4ZThiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi91YXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi91YXMuaApAQCAtOSw3ICs5LDcgQEAKIAlfX3U4IGl1X2lkOwogCV9fdTggcnN2ZDE7CiAJX19iZTE2IHRhZzsKLX07Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKIAogZW51bSB7CiAJSVVfSURfQ09NTUFORAkJPSAweDAxLApAQCAtNTIsNyArNTIsNyBAQAogCV9fdTggcnN2ZDc7CiAJc3RydWN0IHNjc2lfbHVuIGx1bjsKIAlfX3U4IGNkYlsxNl07CS8qIFhYWDogT3ZlcmZsb3ctY2hlY2tpbmcgdG9vbHMgbWF5IG1pc3VuZGVyc3RhbmQgKi8KLX07Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKIAogc3RydWN0IHRhc2tfbWdtdF9pdSB7CiAJX191OCBpdV9pZDsKQEAgLTYyLDcgKzYyLDcgQEAKIAlfX3U4IHJzdmQyOwogCV9fYmUxNiB0YXNrX3RhZzsKIAlzdHJ1Y3Qgc2NzaV9sdW4gbHVuOwotfTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwogCiAvKgogICogQWxzbyB1c2VkIGZvciB0aGUgUmVhZCBSZWFkeSBhbmQgV3JpdGUgUmVhZHkgSVVzIHNpbmNlIHRoZXkgaGF2ZSB0aGUKQEAgLTc3LDE1ICs3NywxNSBAQAogCV9fdTggcnN2ZDdbN107CiAJX19iZTE2IGxlbjsKIAlfX3U4IHNlbnNlW1NDU0lfU0VOU0VfQlVGRkVSU0laRV07Ci19OworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CiAKLXN0cnVjdCByZXNwb25zZV91aSB7CitzdHJ1Y3QgcmVzcG9uc2VfaXUgewogCV9fdTggaXVfaWQ7CiAJX191OCByc3ZkMTsKIAlfX2JlMTYgdGFnOwotCV9fYmUxNiBhZGRfcmVzcG9uc2VfaW5mbzsKKwlfX3U4IGFkZF9yZXNwb25zZV9pbmZvWzNdOwogCV9fdTggcmVzcG9uc2VfY29kZTsKLX07Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKIAogc3RydWN0IHVzYl9waXBlX3VzYWdlX2Rlc2NyaXB0b3IgewogCV9fdTggIGJMZW5ndGg7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oIGIvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaAppbmRleCA2MzAzNTY4Li4xYTY0YjI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmgKQEAgLTY3LDggKzY3LDEwIEBACiAJCS8qIEluaXRpYWwgUkVBRCgxMCkgKGFuZCBvdGhlcnMpIG11c3QgYmUgcmV0cmllZCAqLwlcCiAJVVNfRkxBRyhXUklURV9DQUNIRSwJMHgwMDIwMDAwMCkJCQlcCiAJCS8qIFdyaXRlIENhY2hlIHN0YXR1cyBpcyBub3QgYXZhaWxhYmxlICovCVwKLQlVU19GTEFHKE5FRURTX0NBUDE2LAkweDAwNDAwMDAwKQotCQkvKiBjYW5ub3QgaGFuZGxlIFJFQURfQ0FQQUNJVFlfMTAgKi8KKwlVU19GTEFHKE5FRURTX0NBUDE2LAkweDAwNDAwMDAwKQkJCVwKKwkJLyogY2Fubm90IGhhbmRsZSBSRUFEX0NBUEFDSVRZXzEwICovCQlcCisJVVNfRkxBRyhJR05PUkVfVUFTLAkweDAwODAwMDAwKQkJCVwKKwkJLyogRGV2aWNlIGFkdmVydGlzZXMgVUFTIGJ1dCBpdCBpcyBicm9rZW4gKi8KIAogI2RlZmluZSBVU19GTEFHKG5hbWUsIHZhbHVlKQlVU19GTF8jI25hbWUgPSB2YWx1ZSAsCiBlbnVtIHsgVVNfRE9fQUxMX0ZMQUdTIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpZGVvX291dHB1dC5oIGIvaW5jbHVkZS9saW51eC92aWRlb19vdXRwdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ1Y2RlYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpZGVvX291dHB1dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA2IEx1bWluZyBZdSA8bHVtaW5nLnl1QGludGVsLmNvbT4KLSAqCi0gKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCi0gKgotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqLwotI2lmbmRlZiBfTElOVVhfVklERU9fT1VUUFVUX0gKLSNkZWZpbmUgX0xJTlVYX1ZJREVPX09VVFBVVF9ICi0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci1zdHJ1Y3Qgb3V0cHV0X2RldmljZTsKLXN0cnVjdCBvdXRwdXRfcHJvcGVydGllcyB7Ci0JaW50ICgqc2V0X3N0YXRlKShzdHJ1Y3Qgb3V0cHV0X2RldmljZSAqKTsKLQlpbnQgKCpnZXRfc3RhdHVzKShzdHJ1Y3Qgb3V0cHV0X2RldmljZSAqKTsKLX07Ci1zdHJ1Y3Qgb3V0cHV0X2RldmljZSB7Ci0JaW50IHJlcXVlc3Rfc3RhdGU7Ci0Jc3RydWN0IG91dHB1dF9wcm9wZXJ0aWVzICpwcm9wczsKLQlzdHJ1Y3QgZGV2aWNlIGRldjsKLX07Ci0jZGVmaW5lIHRvX291dHB1dF9kZXZpY2Uob2JqKSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3Qgb3V0cHV0X2RldmljZSwgZGV2KQotI2lmCWRlZmluZWQoQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MKSB8fCBkZWZpbmVkKENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTF9NT0RVTEUpCi1zdHJ1Y3Qgb3V0cHV0X2RldmljZSAqdmlkZW9fb3V0cHV0X3JlZ2lzdGVyKGNvbnN0IGNoYXIgKm5hbWUsCi0Jc3RydWN0IGRldmljZSAqZGV2LAotCXZvaWQgKmRldmRhdGEsCi0Jc3RydWN0IG91dHB1dF9wcm9wZXJ0aWVzICpvcCk7Ci12b2lkIHZpZGVvX291dHB1dF91bnJlZ2lzdGVyKHN0cnVjdCBvdXRwdXRfZGV2aWNlICpkZXYpOwotI2Vsc2UKLXN0YXRpYyBzdHJ1Y3Qgb3V0cHV0X2RldmljZSAqdmlkZW9fb3V0cHV0X3JlZ2lzdGVyKGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgIHN0cnVjdCBkZXZpY2UgKmRldiwKLSAgICAgICAgdm9pZCAqZGV2ZGF0YSwKLSAgICAgICAgc3RydWN0IG91dHB1dF9wcm9wZXJ0aWVzICpvcCkKLXsKLQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKLX0KLXN0YXRpYyB2b2lkIHZpZGVvX291dHB1dF91bnJlZ2lzdGVyKHN0cnVjdCBvdXRwdXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuOwotfQotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmggYi9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCmluZGV4IDUzMjk5NDYuLjFiMjJjNDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKKysrIGIvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaApAQCAtMTgwLDYgKzE4MCw3IEBACiAjaWZkZWYgQ09ORklHX0RFQlVHX09CSkVDVFNfV09SSwogZXh0ZXJuIHZvaWQgX19pbml0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrLCBpbnQgb25zdGFjayk7CiBleHRlcm4gdm9pZCBkZXN0cm95X3dvcmtfb25fc3RhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK2V4dGVybiB2b2lkIGRlc3Ryb3lfZGVsYXllZF93b3JrX29uX3N0YWNrKHN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmspOwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgd29ya19zdGF0aWMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXJldHVybiAqd29ya19kYXRhX2JpdHMod29yaykgJiBXT1JLX1NUUlVDVF9TVEFUSUM7CkBAIC0xODcsNiArMTg4LDcgQEAKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrLCBpbnQgb25zdGFjaykgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgZGVzdHJveV93b3JrX29uX3N0YWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgZGVzdHJveV9kZWxheWVkX3dvcmtfb25fc3RhY2soc3RydWN0IGRlbGF5ZWRfd29yayAqd29yaykgeyB9CiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB3b3JrX3N0YXRpYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspIHsgcmV0dXJuIDA7IH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItb2YuaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1vZi5oCmluZGV4IDU0MWNlYTQuLjcwZmE3YjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1vZi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1vZi5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncmFwaC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZWRpYWJ1cy5oPgogCkBAIC01MCwxNyArNTEsMTMgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgdjRsMl9vZl9lbmRwb2ludCAtIHRoZSBlbmRwb2ludCBkYXRhIHN0cnVjdHVyZQotICogQHBvcnQ6IGlkZW50aWZpZXIgKHZhbHVlIG9mIHJlZyBwcm9wZXJ0eSkgb2YgYSBwb3J0IHRoaXMgZW5kcG9pbnQgYmVsb25ncyB0bwotICogQGlkOiBpZGVudGlmaWVyICh2YWx1ZSBvZiByZWcgcHJvcGVydHkpIG9mIHRoaXMgZW5kcG9pbnQKLSAqIEBsb2NhbF9ub2RlOiBwb2ludGVyIHRvIGRldmljZV9ub2RlIG9mIHRoaXMgZW5kcG9pbnQKKyAqIEBiYXNlOiBzdHJ1Y3Qgb2ZfZW5kcG9pbnQgY29udGFpbmluZyBwb3J0LCBpZCwgYW5kIGxvY2FsIG9mX25vZGUKICAqIEBidXNfdHlwZTogYnVzIHR5cGUKICAqIEBidXM6IGJ1cyBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCiAgKiBAaGVhZDogbGlzdCBoZWFkIGZvciB0aGlzIHN0cnVjdHVyZQogICovCiBzdHJ1Y3QgdjRsMl9vZl9lbmRwb2ludCB7Ci0JdW5zaWduZWQgaW50IHBvcnQ7Ci0JdW5zaWduZWQgaW50IGlkOwotCWNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbG9jYWxfbm9kZTsKKwlzdHJ1Y3Qgb2ZfZW5kcG9pbnQgYmFzZTsKIAllbnVtIHY0bDJfbWJ1c190eXBlIGJ1c190eXBlOwogCXVuaW9uIHsKIAkJc3RydWN0IHY0bDJfb2ZfYnVzX3BhcmFsbGVsIHBhcmFsbGVsOwpAQCAtNzIsMTEgKzY5LDYgQEAKICNpZmRlZiBDT05GSUdfT0YKIGludCB2NGwyX29mX3BhcnNlX2VuZHBvaW50KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKIAkJCSAgIHN0cnVjdCB2NGwyX29mX2VuZHBvaW50ICplbmRwb2ludCk7Ci1zdHJ1Y3QgZGV2aWNlX25vZGUgKnY0bDJfb2ZfZ2V0X25leHRfZW5kcG9pbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsCi0JCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcHJldmlvdXMpOwotc3RydWN0IGRldmljZV9ub2RlICp2NGwyX29mX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQoCi0JCQkJCWNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7Ci1zdHJ1Y3QgZGV2aWNlX25vZGUgKnY0bDJfb2ZfZ2V0X3JlbW90ZV9wb3J0KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7CiAjZWxzZSAvKiBDT05GSUdfT0YgKi8KIAogc3RhdGljIGlubGluZSBpbnQgdjRsMl9vZl9wYXJzZV9lbmRwb2ludChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCkBAIC04NSwyNSArNzcsNiBAQAogCXJldHVybiAtRU5PU1lTOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2Vfbm9kZSAqdjRsMl9vZl9nZXRfbmV4dF9lbmRwb2ludCgKLQkJCQkJY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsCi0JCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcHJldmlvdXMpCi17Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZV9ub2RlICp2NGwyX29mX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQoCi0JCQkJCWNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKLXsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlX25vZGUgKnY0bDJfb2ZfZ2V0X3JlbW90ZV9wb3J0KAotCQkJCQljb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCi17Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KICNlbmRpZiAvKiBDT05GSUdfT0YgKi8KIAogI2VuZGlmIC8qIF9WNEwyX09GX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9saWJpc2NzaS5oIGIvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmgKaW5kZXggMzA5ZjUxMy4uNzIyMWEyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmgKKysrIGIvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmgKQEAgLTMyNywxMiArMzI3LDE5IEBACiAJc3RydWN0IGlzY3NpX3RyYW5zcG9ydAkqdHQ7CiAJc3RydWN0IFNjc2lfSG9zdAkqaG9zdDsKIAlzdHJ1Y3QgaXNjc2lfY29ubgkqbGVhZGNvbm47CS8qIGxlYWRpbmcgY29ubmVjdGlvbiAqLwotCXNwaW5sb2NrX3QJCWxvY2s7CQkvKiBwcm90ZWN0cyBzZXNzaW9uIHN0YXRlLCAqCi0JCQkJCQkgKiBzZXF1ZW5jZSBudW1iZXJzLCAgICAgICAqCisJLyogQmV0d2VlbiB0aGUgZm9yd2FyZCBhbmQgdGhlIGJhY2t3YXJkIGxvY2tzIGV4aXN0cyBhIHN0cmljdCBsb2NraW5nCisJICogaGllcmFyY2h5LiBUaGUgbXV0dWFsIGV4Y2x1c2lvbiB6b25lIHByb3RlY3RlZCBieSB0aGUgZm9yd2FyZCBsb2NrCisJICogY2FuIGVuY2xvc2UgdGhlIG11dHVhbCBleGNsdXNpb24gem9uZSBwcm90ZWN0ZWQgYnkgdGhlIGJhY2t3YXJkIGxvY2sKKwkgKiBidXQgbm90IHZpY2UgdmVyc2EuCisJICovCisJc3BpbmxvY2tfdAkJZnJ3ZF9sb2NrOwkvKiBwcm90ZWN0cyBzZXNzaW9uIHN0YXRlLCAqCisJCQkJCQkgKiBjbWRzbiwgcXVldWVkX2NtZHNuICAgICAqCiAJCQkJCQkgKiBzZXNzaW9uIHJlc291cmNlczogICAgICAqCi0JCQkJCQkgKiAtIGNtZHBvb2wsCQkgICAqCi0JCQkJCQkgKiAtIG1nbXRwb29sLAkJICAgKgotCQkJCQkJICogLSByMnRwb29sCQkgICAqLworCQkJCQkJICogLSBjbWRwb29sIGtmaWZvX291dCAsICAgKgorCQkJCQkJICogLSBtZ210cG9vbCwJCSAgICovCisJc3BpbmxvY2tfdAkJYmFja19sb2NrOwkvKiBwcm90ZWN0cyBjbWRzbl9leHAgICAgICAqCisJCQkJCQkgKiBjbWRzbl9tYXgsICAgICAgICAgICAgICAqCisJCQkJCQkgKiBjbWRwb29sIGtmaWZvX2luICAgICAgICAqLwogCWludAkJCXN0YXRlOwkJLyogc2Vzc2lvbiBzdGF0ZSAgICAgICAgICAgKi8KIAlpbnQJCQlhZ2U7CQkvKiBjb3VudHMgc2Vzc2lvbiByZS1vcGVucyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvbGliaXNjc2lfdGNwLmggYi9pbmNsdWRlL3Njc2kvbGliaXNjc2lfdGNwLmgKaW5kZXggMjE1NDY5YS4uMmE3YWE3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2xpYmlzY3NpX3RjcC5oCisrKyBiL2luY2x1ZGUvc2NzaS9saWJpc2NzaV90Y3AuaApAQCAtODMsNiArODMsOCBAQAogCXN0cnVjdCBpc2NzaV9wb29sCXIydHBvb2w7CiAJc3RydWN0IGtmaWZvCQlyMnRxdWV1ZTsKIAl2b2lkCQkJKmRkX2RhdGE7CisJc3BpbmxvY2tfdAkJcG9vbDJxdWV1ZTsKKwlzcGlubG9ja190CQlxdWV1ZTJwb29sOwogfTsKIAogZW51bSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmggYi9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmgKaW5kZXggOTE1NThhMS4uZGQ3Yzk5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfY21uZC5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX2NtbmQuaApAQCAtMTQyLDggKzE0Miw3IEBACiBleHRlcm4gc3RydWN0IHNjc2lfY21uZCAqc2NzaV9nZXRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgZ2ZwX3QpOwogZXh0ZXJuIHN0cnVjdCBzY3NpX2NtbmQgKl9fc2NzaV9nZXRfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICosIGdmcF90KTsKIGV4dGVybiB2b2lkIHNjc2lfcHV0X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqKTsKLWV4dGVybiB2b2lkIF9fc2NzaV9wdXRfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICosIHN0cnVjdCBzY3NpX2NtbmQgKiwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICopOworZXh0ZXJuIHZvaWQgX19zY3NpX3B1dF9jb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKiwgc3RydWN0IHNjc2lfY21uZCAqKTsKIGV4dGVybiB2b2lkIHNjc2lfZmluaXNoX2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIAogZXh0ZXJuIHZvaWQgKnNjc2lfa21hcF9hdG9taWNfc2coc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IHNnX2NvdW50LApAQCAtMTU2LDkgKzE1NSw2IEBACiBleHRlcm4gaW50IHNjc2lfZG1hX21hcChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOwogZXh0ZXJuIHZvaWQgc2NzaV9kbWFfdW5tYXAoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIAotc3RydWN0IHNjc2lfY21uZCAqc2NzaV9hbGxvY2F0ZV9jb21tYW5kKGdmcF90IGdmcF9tYXNrKTsKLXZvaWQgc2NzaV9mcmVlX2NvbW1hbmQoZ2ZwX3QgZ2ZwX21hc2ssIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7Ci0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2NzaV9zZ19jb3VudChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CiAJcmV0dXJuIGNtZC0+c2RiLnRhYmxlLm5lbnRzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfZGV2aWNlLmggYi9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaAppbmRleCBkNjVmYmVjLi40ZTg0NWI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaApAQCAtMTEzLDYgKzExMywxMiBAQAogCWNvbnN0IGNoYXIgKiB2ZW5kb3I7CQkvKiBbYmFja19jb21wYXRdIHBvaW50IGludG8gJ2lucXVpcnknIC4uLiAqLwogCWNvbnN0IGNoYXIgKiBtb2RlbDsJCS8qIC4uLiBhZnRlciBzY2FuOyBwb2ludCB0byBzdGF0aWMgc3RyaW5nICovCiAJY29uc3QgY2hhciAqIHJldjsJCS8qIC4uLiAibnVsbG51bGxudWxsbnVsbCIgYmVmb3JlIHNjYW4gKi8KKworI2RlZmluZSBTQ1NJX1ZQRF9QR19MRU4gICAgICAgICAgICAgICAgMjU1CisJaW50IHZwZF9wZzgzX2xlbjsKKwl1bnNpZ25lZCBjaGFyICp2cGRfcGc4MzsKKwlpbnQgdnBkX3BnODBfbGVuOworCXVuc2lnbmVkIGNoYXIgKnZwZF9wZzgwOwogCXVuc2lnbmVkIGNoYXIgY3VycmVudF90YWc7CS8qIGN1cnJlbnQgdGFnICovCiAJc3RydWN0IHNjc2lfdGFyZ2V0ICAgICAgKnNkZXZfdGFyZ2V0OyAgIC8qIHVzZWQgb25seSBmb3Igc2luZ2xlX2x1biAqLwogCkBAIC0yMzUsMTIgKzI0MSwyNCBAQAogI2RlZmluZSBzZGV2X3ByaW50ayhwcmVmaXgsIHNkZXYsIGZtdCwgYS4uLikJXAogCWRldl9wcmludGsocHJlZml4LCAmKHNkZXYpLT5zZGV2X2dlbmRldiwgZm10LCAjI2EpCiAKKyNkZWZpbmUgc2Rldl9kYmcoc2RldiwgZm10LCBhLi4uKSBcCisJZGV2X2RiZygmKHNkZXYpLT5zZGV2X2dlbmRldiwgZm10LCAjI2EpCisKICNkZWZpbmUgc2NtZF9wcmludGsocHJlZml4LCBzY21kLCBmbXQsIGEuLi4pCQkJCVwKICAgICAgICAgKHNjbWQpLT5yZXF1ZXN0LT5ycV9kaXNrID8JCQkJCVwKIAlzZGV2X3ByaW50ayhwcmVmaXgsIChzY21kKS0+ZGV2aWNlLCAiWyVzXSAiIGZtdCwJCVwKIAkJICAgIChzY21kKS0+cmVxdWVzdC0+cnFfZGlzay0+ZGlza19uYW1lLCAjI2EpIDoJCVwKIAlzZGV2X3ByaW50ayhwcmVmaXgsIChzY21kKS0+ZGV2aWNlLCBmbXQsICMjYSkKIAorI2RlZmluZSBzY21kX2RiZyhzY21kLCBmbXQsIGEuLi4pCQkJCQkgICBcCisJZG8gewkJCQkJCQkJICAgXAorCQlpZiAoKHNjbWQpLT5yZXF1ZXN0LT5ycV9kaXNrKQkJCQkgICBcCisJCQlzZGV2X2RiZygoc2NtZCktPmRldmljZSwgIlslc10gIiBmbXQsCQkgICBcCisJCQkJIChzY21kKS0+cmVxdWVzdC0+cnFfZGlzay0+ZGlza19uYW1lLCAjI2EpO1wKKwkJZWxzZQkJCQkJCQkgICBcCisJCQlzZGV2X2RiZygoc2NtZCktPmRldmljZSwgZm10LCAjI2EpOwkJICAgXAorCX0gd2hpbGUgKDApCisKIGVudW0gc2NzaV90YXJnZXRfc3RhdGUgewogCVNUQVJHRVRfQ1JFQVRFRCA9IDEsCiAJU1RBUkdFVF9SVU5OSU5HLApAQCAtMjU3LDcgKzI3NSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZAlzaWJsaW5nczsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWRldmljZXM7CiAJc3RydWN0IGRldmljZQkJZGV2OwotCXVuc2lnbmVkIGludAkJcmVhcF9yZWY7IC8qIHByb3RlY3RlZCBieSB0aGUgaG9zdCBsb2NrICovCisJc3RydWN0IGtyZWYJCXJlYXBfcmVmOyAvKiBsYXN0IHB1dCByZW5kZXJzIHRhcmdldCBpbnZpc2libGUgKi8KIAl1bnNpZ25lZCBpbnQJCWNoYW5uZWw7CiAJdW5zaWduZWQgaW50CQlpZDsgLyogdGFyZ2V0IGlkIC4uLiByZXBsYWNlCiAJCQkJICAgICAqIHNjc2lfZGV2aWNlLmlkIGV2ZW50dWFsbHkgKi8KQEAgLTI4NCw3ICszMDIsNiBAQAogI2RlZmluZSBTQ1NJX0RFRkFVTFRfVEFSR0VUX0JMT0NLRUQJMwogCiAJY2hhcgkJCXNjc2lfbGV2ZWw7Ci0Jc3RydWN0IGV4ZWN1dGVfd29yawlldzsKIAllbnVtIHNjc2lfdGFyZ2V0X3N0YXRlCXN0YXRlOwogCXZvaWQgCQkJKmhvc3RkYXRhOyAvKiBhdmFpbGFibGUgdG8gbG93LWxldmVsIGRyaXZlciAqLwogCXVuc2lnbmVkIGxvbmcJCXN0YXJnZXRfZGF0YVswXTsgLyogZm9yIHRoZSB0cmFuc3BvcnQgKi8KQEAgLTMwOSw2ICszMjYsNyBAQAogZXh0ZXJuIGludCBzY3NpX3JlZ2lzdGVyX2RldmljZV9oYW5kbGVyKHN0cnVjdCBzY3NpX2RldmljZV9oYW5kbGVyICpzY3NpX2RoKTsKIGV4dGVybiB2b2lkIHNjc2lfcmVtb3ZlX2RldmljZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CiBleHRlcm4gaW50IHNjc2lfdW5yZWdpc3Rlcl9kZXZpY2VfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9kZXZpY2VfaGFuZGxlciAqc2NzaV9kaCk7Cit2b2lkIHNjc2lfYXR0YWNoX3ZwZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOwogCiBleHRlcm4gaW50IHNjc2lfZGV2aWNlX2dldChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBzY3NpX2RldmljZV9wdXQoc3RydWN0IHNjc2lfZGV2aWNlICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oCmluZGV4IDUzMDc1ZTUuLjk0ODQ0ZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmgKQEAgLTE1LDYgKzE1LDcgQEAKIHN0cnVjdCBtb2R1bGU7CiBzdHJ1Y3Qgc2NzaV9jbW5kOwogc3RydWN0IHNjc2lfZGV2aWNlOworc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbDsKIHN0cnVjdCBzY3NpX3RhcmdldDsKIHN0cnVjdCBTY3NpX0hvc3Q7CiBzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sOwpAQCAtNTI0LDYgKzUyNSwxMiBAQAogCSAqICAgc2NzaV9uZXRsaW5rLmgKIAkgKi8KIAl1NjQgdmVuZG9yX2lkOworCisJLyoKKwkgKiBBZGRpdGlvbmFsIHBlci1jb21tYW5kIGRhdGEgYWxsb2NhdGVkIGZvciB0aGUgZHJpdmVyLgorCSAqLworCXVuc2lnbmVkIGludCBjbWRfc2l6ZTsKKwlzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sICpjbWRfcG9vbDsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oCmluZGV4IGI3OTdlOGYuLjhjNzk5ODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oCkBAIC0xMzAsNiArMTMwLDcgQEAKICNkZWZpbmUgRkNfUE9SVFNQRUVEXzRHQklUCQk4CiAjZGVmaW5lIEZDX1BPUlRTUEVFRF84R0JJVAkJMHgxMAogI2RlZmluZSBGQ19QT1JUU1BFRURfMTZHQklUCQkweDIwCisjZGVmaW5lIEZDX1BPUlRTUEVFRF8zMkdCSVQJCTB4NDAKICNkZWZpbmUgRkNfUE9SVFNQRUVEX05PVF9ORUdPVElBVEVECSgxIDw8IDE1KSAvKiBTcGVlZCBub3QgZXN0YWJsaXNoZWQgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvY29yZS5oIGIvaW5jbHVkZS9zb3VuZC9jb3JlLmgKaW5kZXggMmExNGYxZi4uZDNmNWY4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9jb3JlLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9jb3JlLmgKQEAgLTIyLDYgKzIyLDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CQkvKiB3YWtlX3VwKCkgKi8KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgkJLyogc3RydWN0IG11dGV4ICovCiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4JCS8qIHN0cnVjdCByd19zZW1hcGhvcmUgKi8KQEAgLTQxLDM5ICs0MiwzMyBAQAogLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KIHN0cnVjdCBwY2lfZGV2Owogc3RydWN0IG1vZHVsZTsKLXN0cnVjdCBkZXZpY2U7Ci1zdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZTsKK3N0cnVjdCBjb21wbGV0aW9uOwogCiAvKiBkZXZpY2UgYWxsb2NhdGlvbiBzdHVmZiAqLwogCi0jZGVmaW5lIFNORFJWX0RFVl9UWVBFX1JBTkdFX1NJWkUJCTB4MTAwMAorLyogdHlwZSBvZiB0aGUgb2JqZWN0IHVzZWQgaW4gc25kX2RldmljZV8qKCkKKyAqIHRoaXMgYWxzbyBkZWZpbmVzIHRoZSBjYWxsaW5nIG9yZGVyCisgKi8KK2VudW0gc25kX2RldmljZV90eXBlIHsKKwlTTkRSVl9ERVZfTE9XTEVWRUwsCisJU05EUlZfREVWX0NPTlRST0wsCisJU05EUlZfREVWX0lORk8sCisJU05EUlZfREVWX0JVUywKKwlTTkRSVl9ERVZfQ09ERUMsCisJU05EUlZfREVWX1BDTSwKKwlTTkRSVl9ERVZfQ09NUFJFU1MsCisJU05EUlZfREVWX1JBV01JREksCisJU05EUlZfREVWX1RJTUVSLAorCVNORFJWX0RFVl9TRVFVRU5DRVIsCisJU05EUlZfREVWX0hXREVQLAorCVNORFJWX0RFVl9KQUNLLAorfTsKIAotdHlwZWRlZiBpbnQgX19iaXR3aXNlIHNuZF9kZXZpY2VfdHlwZV90OwotI2RlZmluZQlTTkRSVl9ERVZfVE9QTEVWRUwJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAwKQotI2RlZmluZQlTTkRSVl9ERVZfQ09OVFJPTAkoKF9fZm9yY2Ugc25kX2RldmljZV90eXBlX3QpIDEpCi0jZGVmaW5lCVNORFJWX0RFVl9MT1dMRVZFTF9QUkUJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAyKQotI2RlZmluZQlTTkRSVl9ERVZfTE9XTEVWRUxfTk9STUFMICgoX19mb3JjZSBzbmRfZGV2aWNlX3R5cGVfdCkgMHgxMDAwKQotI2RlZmluZQlTTkRSVl9ERVZfUENNCQkoKF9fZm9yY2Ugc25kX2RldmljZV90eXBlX3QpIDB4MTAwMSkKLSNkZWZpbmUJU05EUlZfREVWX1JBV01JREkJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDIpCi0jZGVmaW5lCVNORFJWX0RFVl9USU1FUgkJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDMpCi0jZGVmaW5lCVNORFJWX0RFVl9TRVFVRU5DRVIJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDQpCi0jZGVmaW5lCVNORFJWX0RFVl9IV0RFUAkJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDUpCi0jZGVmaW5lCVNORFJWX0RFVl9JTkZPCQkoKF9fZm9yY2Ugc25kX2RldmljZV90eXBlX3QpIDB4MTAwNikKLSNkZWZpbmUJU05EUlZfREVWX0JVUwkJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDcpCi0jZGVmaW5lCVNORFJWX0RFVl9DT0RFQwkJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDgpCi0jZGVmaW5lCVNORFJWX0RFVl9KQUNLICAgICAgICAgICgoX19mb3JjZSBzbmRfZGV2aWNlX3R5cGVfdCkgMHgxMDA5KQotI2RlZmluZQlTTkRSVl9ERVZfQ09NUFJFU1MJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMEEpCi0jZGVmaW5lCVNORFJWX0RFVl9MT1dMRVZFTAkoKF9fZm9yY2Ugc25kX2RldmljZV90eXBlX3QpIDB4MjAwMCkKLQotdHlwZWRlZiBpbnQgX19iaXR3aXNlIHNuZF9kZXZpY2Vfc3RhdGVfdDsKLSNkZWZpbmUJU05EUlZfREVWX0JVSUxECQkoKF9fZm9yY2Ugc25kX2RldmljZV9zdGF0ZV90KSAwKQotI2RlZmluZQlTTkRSVl9ERVZfUkVHSVNURVJFRAkoKF9fZm9yY2Ugc25kX2RldmljZV9zdGF0ZV90KSAxKQotI2RlZmluZQlTTkRSVl9ERVZfRElTQ09OTkVDVEVECSgoX19mb3JjZSBzbmRfZGV2aWNlX3N0YXRlX3QpIDIpCi0KLXR5cGVkZWYgaW50IF9fYml0d2lzZSBzbmRfZGV2aWNlX2NtZF90OwotI2RlZmluZQlTTkRSVl9ERVZfQ01EX1BSRQkoKF9fZm9yY2Ugc25kX2RldmljZV9jbWRfdCkgMCkKLSNkZWZpbmUJU05EUlZfREVWX0NNRF9OT1JNQUwJKChfX2ZvcmNlIHNuZF9kZXZpY2VfY21kX3QpIDEpCQotI2RlZmluZQlTTkRSVl9ERVZfQ01EX1BPU1QJKChfX2ZvcmNlIHNuZF9kZXZpY2VfY21kX3QpIDIpCitlbnVtIHNuZF9kZXZpY2Vfc3RhdGUgeworCVNORFJWX0RFVl9CVUlMRCwKKwlTTkRSVl9ERVZfUkVHSVNURVJFRCwKKwlTTkRSVl9ERVZfRElTQ09OTkVDVEVELAorfTsKIAogc3RydWN0IHNuZF9kZXZpY2U7CiAKQEAgLTg2LDggKzgxLDggQEAKIHN0cnVjdCBzbmRfZGV2aWNlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBsaXN0IG9mIHJlZ2lzdGVyZWQgZGV2aWNlcyAqLwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsJCS8qIGNhcmQgd2hpY2ggaG9sZHMgdGhpcyBkZXZpY2UgKi8KLQlzbmRfZGV2aWNlX3N0YXRlX3Qgc3RhdGU7CS8qIHN0YXRlIG9mIHRoZSBkZXZpY2UgKi8KLQlzbmRfZGV2aWNlX3R5cGVfdCB0eXBlOwkJLyogZGV2aWNlIHR5cGUgKi8KKwllbnVtIHNuZF9kZXZpY2Vfc3RhdGUgc3RhdGU7CS8qIHN0YXRlIG9mIHRoZSBkZXZpY2UgKi8KKwllbnVtIHNuZF9kZXZpY2VfdHlwZSB0eXBlOwkvKiBkZXZpY2UgdHlwZSAqLwogCXZvaWQgKmRldmljZV9kYXRhOwkJLyogZGV2aWNlIHN0cnVjdHVyZSAqLwogCXN0cnVjdCBzbmRfZGV2aWNlX29wcyAqb3BzOwkvKiBvcGVyYXRpb25zICovCiB9OwpAQCAtMTMxLDExICsxMjYsMTAgQEAKIAkJCQkJCQkJc3RhdGUgKi8KIAlzcGlubG9ja190IGZpbGVzX2xvY2s7CQkvKiBsb2NrIHRoZSBmaWxlcyBmb3IgdGhpcyBjYXJkICovCiAJaW50IHNodXRkb3duOwkJCS8qIHRoaXMgY2FyZCBpcyBnb2luZyBkb3duICovCi0JaW50IGZyZWVfb25fbGFzdF9jbG9zZTsJCS8qIGZyZWUgaW4gY29udGV4dCBvZiBmaWxlX3JlbGVhc2UgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBzaHV0ZG93bl9zbGVlcDsKLQlhdG9taWNfdCByZWZjb3VudDsJCS8qIHJlZmNvdW50IGZvciBkaXNjb25uZWN0aW9uICovCisJc3RydWN0IGNvbXBsZXRpb24gKnJlbGVhc2VfY29tcGxldGlvbjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CQkvKiBkZXZpY2UgYXNzaWduZWQgdG8gdGhpcyBjYXJkICovCi0Jc3RydWN0IGRldmljZSAqY2FyZF9kZXY7CS8qIGNhcmRYIG9iamVjdCBmb3Igc3lzZnMgKi8KKwlzdHJ1Y3QgZGV2aWNlIGNhcmRfZGV2OwkJLyogY2FyZFggb2JqZWN0IGZvciBzeXNmcyAqLworCWJvb2wgcmVnaXN0ZXJlZDsJCS8qIGNhcmRfZGV2IGlzIHJlZ2lzdGVyZWQ/ICovCiAKICNpZmRlZiBDT05GSUdfUE0KIAl1bnNpZ25lZCBpbnQgcG93ZXJfc3RhdGU7CS8qIHBvd2VyIHN0YXRlICovCkBAIC0xNDksNiArMTQzLDggQEAKICNlbmRpZgogfTsKIAorI2RlZmluZSBkZXZfdG9fc25kX2NhcmQocCkJY29udGFpbmVyX29mKHAsIHN0cnVjdCBzbmRfY2FyZCwgY2FyZF9kZXYpCisKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzbmRfcG93ZXJfbG9jayhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCiB7CkBAIC0xOTcsNyArMTkzLDcgQEAKIC8qIHJldHVybiBhIGRldmljZSBwb2ludGVyIGxpbmtlZCB0byBlYWNoIHNvdW5kIGRldmljZSBhcyBhIHBhcmVudCAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICpzbmRfY2FyZF9nZXRfZGV2aWNlX2xpbmsoc3RydWN0IHNuZF9jYXJkICpjYXJkKQogewotCXJldHVybiBjYXJkID8gY2FyZC0+Y2FyZF9kZXYgOiBOVUxMOworCXJldHVybiBjYXJkID8gJmNhcmQtPmNhcmRfZGV2IDogTlVMTDsKIH0KIAogLyogc291bmQuYyAqLwpAQCAtMjQ0LDEzICsyNDAsMTEgQEAKIAogaW50IHNuZF91bnJlZ2lzdGVyX2RldmljZShpbnQgdHlwZSwgc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2KTsKIHZvaWQgKnNuZF9sb29rdXBfbWlub3JfZGF0YSh1bnNpZ25lZCBpbnQgbWlub3IsIGludCB0eXBlKTsKLWludCBzbmRfYWRkX2RldmljZV9zeXNmc19maWxlKGludCB0eXBlLCBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cik7CitzdHJ1Y3QgZGV2aWNlICpzbmRfZ2V0X2RldmljZShpbnQgdHlwZSwgc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2KTsKIAogI2lmZGVmIENPTkZJR19TTkRfT1NTRU1VTAogaW50IHNuZF9yZWdpc3Rlcl9vc3NfZGV2aWNlKGludCB0eXBlLCBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYsCi0JCQkgICAgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZl9vcHMsIHZvaWQgKnByaXZhdGVfZGF0YSwKLQkJCSAgICBjb25zdCBjaGFyICpuYW1lKTsKKwkJCSAgICBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmX29wcywgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKIGludCBzbmRfdW5yZWdpc3Rlcl9vc3NfZGV2aWNlKGludCB0eXBlLCBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYpOwogdm9pZCAqc25kX2xvb2t1cF9vc3NfbWlub3JfZGF0YSh1bnNpZ25lZCBpbnQgbWlub3IsIGludCB0eXBlKTsKICNlbmRpZgpAQCAtMjg0LDkgKzI3OCwxNiBAQAogZXh0ZXJuIGludCAoKnNuZF9taXhlcl9vc3Nfbm90aWZ5X2NhbGxiYWNrKShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBjbWQpOwogI2VuZGlmCiAKLWludCBzbmRfY2FyZF9jcmVhdGUoaW50IGlkeCwgY29uc3QgY2hhciAqaWQsCi0JCSAgICBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIGludCBleHRyYV9zaXplLAotCQkgICAgc3RydWN0IHNuZF9jYXJkICoqY2FyZF9yZXQpOworaW50IHNuZF9jYXJkX25ldyhzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIGludCBpZHgsIGNvbnN0IGNoYXIgKnhpZCwKKwkJIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwgaW50IGV4dHJhX3NpemUsCisJCSBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkX3JldCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZAorc25kX2NhcmRfY3JlYXRlKGludCBpZHgsIGNvbnN0IGNoYXIgKmlkLCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIGludCBleHRyYV9zaXplLAorCQlzdHJ1Y3Qgc25kX2NhcmQgKipyZXQpCit7CisJcmV0dXJuIHNuZF9jYXJkX25ldyhOVUxMLCBpZHgsIGlkLCBtb2R1bGUsIGV4dHJhX3NpemUsIHJldCk7Cit9CiAKIGludCBzbmRfY2FyZF9kaXNjb25uZWN0KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCk7CiBpbnQgc25kX2NhcmRfZnJlZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpOwpAQCAtMjk4LDIwICsyOTksMTkgQEAKIGludCBzbmRfY29tcG9uZW50X2FkZChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGNvbnN0IGNoYXIgKmNvbXBvbmVudCk7CiBpbnQgc25kX2NhcmRfZmlsZV9hZGQoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBpbnQgc25kX2NhcmRfZmlsZV9yZW1vdmUoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci12b2lkIHNuZF9jYXJkX3VucmVmKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCk7CisjZGVmaW5lIHNuZF9jYXJkX3VucmVmKGNhcmQpCXB1dF9kZXZpY2UoJihjYXJkKS0+Y2FyZF9kZXYpCiAKICNkZWZpbmUgc25kX2NhcmRfc2V0X2RldihjYXJkLCBkZXZwdHIpICgoY2FyZCktPmRldiA9IChkZXZwdHIpKQogCiAvKiBkZXZpY2UuYyAqLwogCi1pbnQgc25kX2RldmljZV9uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBzbmRfZGV2aWNlX3R5cGVfdCB0eXBlLAoraW50IHNuZF9kZXZpY2VfbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgZW51bSBzbmRfZGV2aWNlX3R5cGUgdHlwZSwKIAkJICAgdm9pZCAqZGV2aWNlX2RhdGEsIHN0cnVjdCBzbmRfZGV2aWNlX29wcyAqb3BzKTsKIGludCBzbmRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgdm9pZCAqZGV2aWNlX2RhdGEpOwogaW50IHNuZF9kZXZpY2VfcmVnaXN0ZXJfYWxsKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCk7Ci1pbnQgc25kX2RldmljZV9kaXNjb25uZWN0KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgdm9pZCAqZGV2aWNlX2RhdGEpOwogaW50IHNuZF9kZXZpY2VfZGlzY29ubmVjdF9hbGwoc3RydWN0IHNuZF9jYXJkICpjYXJkKTsKLWludCBzbmRfZGV2aWNlX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkLCB2b2lkICpkZXZpY2VfZGF0YSk7Ci1pbnQgc25kX2RldmljZV9mcmVlX2FsbChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHNuZF9kZXZpY2VfY21kX3QgY21kKTsKK3ZvaWQgc25kX2RldmljZV9mcmVlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgdm9pZCAqZGV2aWNlX2RhdGEpOwordm9pZCBzbmRfZGV2aWNlX2ZyZWVfYWxsKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCk7CiAKIC8qIGlzYWRtYS5jICovCiAKQEAgLTQzMyw3ICs0MzMsNiBAQAogI2RlZmluZSBnYW1lcG9ydF9nZXRfcG9ydF9kYXRhKGdwKSAoZ3ApLT5wb3J0X2RhdGEKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1BDSQogLyogUENJIHF1aXJrIGxpc3QgaGVscGVyICovCiBzdHJ1Y3Qgc25kX3BjaV9xdWlyayB7CiAJdW5zaWduZWQgc2hvcnQgc3VidmVuZG9yOwkvKiBQQ0kgc3VidmVuZG9yIElEICovCkBAIC00NjksMTIgKzQ2OCwyNiBAQAogI2RlZmluZSBzbmRfcGNpX3F1aXJrX25hbWUocSkJIiIKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BDSQogY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKgogc25kX3BjaV9xdWlya19sb29rdXAoc3RydWN0IHBjaV9kZXYgKnBjaSwgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKmxpc3QpOwogCiBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayAqCiBzbmRfcGNpX3F1aXJrX2xvb2t1cF9pZCh1MTYgdmVuZG9yLCB1MTYgZGV2aWNlLAogCQkJY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKmxpc3QpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKgorc25kX3BjaV9xdWlya19sb29rdXAoc3RydWN0IHBjaV9kZXYgKnBjaSwgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKmxpc3QpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKgorc25kX3BjaV9xdWlya19sb29rdXBfaWQodTE2IHZlbmRvciwgdTE2IGRldmljZSwKKwkJCWNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrICpsaXN0KQoreworCXJldHVybiBOVUxMOworfQogI2VuZGlmCiAKICNlbmRpZiAvKiBfX1NPVU5EX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9lbXUxMGsxLmggYi9pbmNsdWRlL3NvdW5kL2VtdTEwazEuaAppbmRleCBkZmI0MmNhLi5jNDY5MDhjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2VtdTEwazEuaAorKysgYi9pbmNsdWRlL3NvdW5kL2VtdTEwazEuaApAQCAtNDM2LDggKzQzNiw2IEBACiAjZGVmaW5lIENDQ0FfQ1VSUkFERFJfTUFTSwkweDAwZmZmZmZmCS8qIEN1cnJlbnQgYWRkcmVzcyBvZiB0aGUgc2VsZWN0ZWQgY2hhbm5lbAkJKi8KICNkZWZpbmUgQ0NDQV9DVVJSQUREUgkJMHgxODAwMDAwOAogCi0vKiB1bmRlZmluZSBDQ1IgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCB0aGUgZGVmaW5pdGlvbiBmb3IgU0ggKi8KLSN1bmRlZiBDQ1IKICNkZWZpbmUgQ0NSCQkJMHgwOQkJLyogQ2FjaGUgY29udHJvbCByZWdpc3RlcgkJCQkqLwogI2RlZmluZSBDQ1JfQ0FDSEVJTlZBTElEU0laRQkweDA3MTkwMDA5CiAjZGVmaW5lIENDUl9DQUNIRUlOVkFMSURTSVpFX01BU0sJMHhmZTAwMDAwMAkvKiBOdW1iZXIgb2YgaW52YWxpZCBzYW1wbGVzIGNhY2hlIGZvciB0aGlzIGNoYW5uZWwgICAgCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2h3ZGVwLmggYi9pbmNsdWRlL3NvdW5kL2h3ZGVwLmgKaW5kZXggOGMwNWU0N2EuLmFlMDRhM2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvaHdkZXAuaAorKysgYi9pbmNsdWRlL3NvdW5kL2h3ZGVwLmgKQEAgLTYwLDcgKzYwLDYgQEAKIAlpbnQgaWZhY2U7CiAKICNpZmRlZiBDT05GSUdfU05EX09TU0VNVUwKLQljaGFyIG9zc19kZXZbMzJdOwogCWludCBvc3NfdHlwZTsKIAlpbnQgb3NzcmVnOwogI2VuZGlmCkBAIC02OSw2ICs2OCw4IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OwogCXZvaWQgKnByaXZhdGVfZGF0YTsKIAl2b2lkICgqcHJpdmF0ZV9mcmVlKSAoc3RydWN0IHNuZF9od2RlcCAqaHdkZXApOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwljb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzOwogCiAJc3RydWN0IG11dGV4IG9wZW5fbXV0ZXg7CiAJaW50IHVzZWQ7CQkJLyogcmVmZXJlbmNlIGNvdW50ZXIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvcGNtLmggYi9pbmNsdWRlL3NvdW5kL3BjbS5oCmluZGV4IDQ4ODM0OTkuLmI0ZDY2OTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvcGNtLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9wY20uaApAQCAtMTE0MSw0ICsxMTQxLDEyIEBACiAJcmV0dXJuIDFVTEwgPDwgKF9fZm9yY2UgaW50KSBwY21fZm9ybWF0OwogfQogCisvKiBwcmludGsgaGVscGVycyAqLworI2RlZmluZSBwY21fZXJyKHBjbSwgZm10LCBhcmdzLi4uKSBcCisJZGV2X2VycigocGNtKS0+Y2FyZC0+ZGV2LCBmbXQsICMjYXJncykKKyNkZWZpbmUgcGNtX3dhcm4ocGNtLCBmbXQsIGFyZ3MuLi4pIFwKKwlkZXZfd2FybigocGNtKS0+Y2FyZC0+ZGV2LCBmbXQsICMjYXJncykKKyNkZWZpbmUgcGNtX2RiZyhwY20sIGZtdCwgYXJncy4uLikgXAorCWRldl9kYmcoKHBjbSktPmNhcmQtPmRldiwgZm10LCAjI2FyZ3MpCisKICNlbmRpZiAvKiBfX1NPVU5EX1BDTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3Jhd21pZGkuaCBiL2luY2x1ZGUvc291bmQvcmF3bWlkaS5oCmluZGV4IGFkZjA4ODUuLjMxMWRhZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvcmF3bWlkaS5oCisrKyBiL2luY2x1ZGUvc291bmQvcmF3bWlkaS5oCkBAIC0xNTcsMTAgKzE1Nyw4IEBACiAKIC8qIGNhbGxiYWNrcyAqLwogCi12b2lkIHNuZF9yYXdtaWRpX3JlY2VpdmVfcmVzZXQoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKIGludCBzbmRfcmF3bWlkaV9yZWNlaXZlKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGNvdW50KTsKLXZvaWQgc25kX3Jhd21pZGlfdHJhbnNtaXRfcmVzZXQoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKIGludCBzbmRfcmF3bWlkaV90cmFuc21pdF9lbXB0eShzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0pOwogaW50IHNuZF9yYXdtaWRpX3RyYW5zbWl0X3BlZWsoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJICAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgY291bnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9yY2FyX3NuZC5oIGIvaW5jbHVkZS9zb3VuZC9yY2FyX3NuZC5oCmluZGV4IDZhZGQ2Y2MuLjM0YTNjMDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvcmNhcl9zbmQuaAorKysgYi9pbmNsdWRlL3NvdW5kL3JjYXJfc25kLmgKQEAgLTM0LDE3ICszNCwxNyBAQAogICogQiA6IFNTSSBkaXJlY3Rpb24KICAqLwogI2RlZmluZSBSU05EX1NTSV9DTEtfUElOX1NIQVJFCQkoMSA8PCAzMSkKLSNkZWZpbmUgUlNORF9TU0lfU1lOQwkJCSgxIDw8IDI5KSAvKiBTU0kzNF9zeW5jIGV0YyAqLwotCiAjZGVmaW5lIFJTTkRfU1NJX1BMQVkJCQkoMSA8PCAyNCkKIAorI2RlZmluZSBSU05EX1NTSShfZG1hX2lkLCBfcGlvX2lycSwgX2ZsYWdzKQkJXAoreyAuZG1hX2lkID0gX2RtYV9pZCwgLnBpb19pcnEgPSBfcGlvX2lycSwgLmZsYWdzID0gX2ZsYWdzIH0KICNkZWZpbmUgUlNORF9TU0lfU0VUKF9kYWlfaWQsIF9kbWFfaWQsIF9waW9faXJxLCBfZmxhZ3MpCVwKIHsgLmRhaV9pZCA9IF9kYWlfaWQsIC5kbWFfaWQgPSBfZG1hX2lkLCAucGlvX2lycSA9IF9waW9faXJxLCAuZmxhZ3MgPSBfZmxhZ3MgfQogI2RlZmluZSBSU05EX1NTSV9VTlVTRUQgXAogeyAuZGFpX2lkID0gLTEsIC5kbWFfaWQgPSAtMSwgLnBpb19pcnEgPSAtMSwgLmZsYWdzID0gMCB9CiAKIHN0cnVjdCByc25kX3NzaV9wbGF0Zm9ybV9pbmZvIHsKLQlpbnQgZGFpX2lkOworCWludCBkYWlfaWQ7CS8qIHdpbGwgYmUgcmVtb3ZlZCAqLwogCWludCBkbWFfaWQ7CiAJaW50IHBpb19pcnE7CiAJdTMyIGZsYWdzOwpAQCAtNTUsOSArNTUsMzEgQEAKICAqLwogI2RlZmluZSBSU05EX1NDVV9VU0VfSFBCSUYJCSgxIDw8IDMxKSAvKiBpdCBuZWVkcyBSU05EX1NTSV9ERVBFTkRFTlQgKi8KIAotc3RydWN0IHJzbmRfc2N1X3BsYXRmb3JtX2luZm8geworI2RlZmluZSBSU05EX1NSQyhyYXRlLCBfZG1hX2lkKQkJCQkJCVwKK3sgLmZsYWdzID0gUlNORF9TQ1VfVVNFX0hQQklGLCAuY29udmVydF9yYXRlID0gcmF0ZSwgLmRtYV9pZCA9IF9kbWFfaWQsIH0KKyNkZWZpbmUgUlNORF9TUkNfU0VUKHJhdGUsIF9kbWFfaWQpCQlcCisJeyAuZmxhZ3MgPSBSU05EX1NDVV9VU0VfSFBCSUYsIC5jb252ZXJ0X3JhdGUgPSByYXRlLCAuZG1hX2lkID0gX2RtYV9pZCwgfQorI2RlZmluZSBSU05EX1NSQ19VTlVTRUQJCQkJXAorCXsgLmZsYWdzID0gMCwgLmNvbnZlcnRfcmF0ZSA9IDAsIC5kbWFfaWQgPSAwLCB9CisKKyNkZWZpbmUgcnNuZF9zY3VfcGxhdGZvcm1faW5mbwlyc25kX3NyY19wbGF0Zm9ybV9pbmZvCisjZGVmaW5lIHNyY19pbmZvCQlzY3VfaW5mbworI2RlZmluZSBzcmNfaW5mb19ucgkJc2N1X2luZm9fbnIKKworc3RydWN0IHJzbmRfc3JjX3BsYXRmb3JtX2luZm8gewogCXUzMiBmbGFnczsKIAl1MzIgY29udmVydF9yYXRlOyAvKiBzYW1wbGluZyByYXRlIGNvbnZlcnQgKi8KKwlpbnQgZG1hX2lkOyAvKiBmb3IgR2VuMiBTQ1UgKi8KK307CisKK3N0cnVjdCByc25kX2RhaV9wYXRoX2luZm8geworCXN0cnVjdCByc25kX3NzaV9wbGF0Zm9ybV9pbmZvICpzc2k7CisJc3RydWN0IHJzbmRfc3JjX3BsYXRmb3JtX2luZm8gKnNyYzsKK307CisKK3N0cnVjdCByc25kX2RhaV9wbGF0Zm9ybV9pbmZvIHsKKwlzdHJ1Y3QgcnNuZF9kYWlfcGF0aF9pbmZvIHBsYXliYWNrOworCXN0cnVjdCByc25kX2RhaV9wYXRoX2luZm8gY2FwdHVyZTsKIH07CiAKIC8qCkBAIC03NSw4ICs5NywxMCBAQAogCXUzMiBmbGFnczsKIAlzdHJ1Y3QgcnNuZF9zc2lfcGxhdGZvcm1faW5mbyAqc3NpX2luZm87CiAJaW50IHNzaV9pbmZvX25yOwotCXN0cnVjdCByc25kX3NjdV9wbGF0Zm9ybV9pbmZvICpzY3VfaW5mbzsKLQlpbnQgc2N1X2luZm9fbnI7CisJc3RydWN0IHJzbmRfc3JjX3BsYXRmb3JtX2luZm8gKnNyY19pbmZvOworCWludCBzcmNfaW5mb19ucjsKKwlzdHJ1Y3QgcnNuZF9kYWlfcGxhdGZvcm1faW5mbyAqZGFpX2luZm87CisJaW50IGRhaV9pbmZvX25yOwogCWludCAoKnN0YXJ0KShpbnQgaWQpOwogCWludCAoKnN0b3ApKGludCBpZCk7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zaW1wbGVfY2FyZC5oIGIvaW5jbHVkZS9zb3VuZC9zaW1wbGVfY2FyZC5oCmluZGV4IDZjNzQ1MjcuLjliMGFjNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc2ltcGxlX2NhcmQuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NpbXBsZV9jYXJkLmgKQEAgLTE4LDYgKzE4LDggQEAKIAljb25zdCBjaGFyICpuYW1lOwogCXVuc2lnbmVkIGludCBmbXQ7CiAJdW5zaWduZWQgaW50IHN5c2NsazsKKwlpbnQgc2xvdHM7CisJaW50IHNsb3Rfd2lkdGg7CiB9OwogCiBzdHJ1Y3QgYXNvY19zaW1wbGVfY2FyZF9pbmZvIHsKQEAgLTI5LDEwICszMSw2IEBACiAJdW5zaWduZWQgaW50IGRhaWZtdDsKIAlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpIGNwdV9kYWk7CiAJc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSBjb2RlY19kYWk7Ci0KLQkvKiB1c2VkIGluIHNpbXBsZS1jYXJkLmMgKi8KLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBzbmRfbGluazsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkIHNuZF9jYXJkOwogfTsKIAogI2VuZGlmIC8qIF9fU0lNUExFX0NBUkRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2MtZGFpLmggYi9pbmNsdWRlL3NvdW5kL3NvYy1kYWkuaAppbmRleCA3MWYyN2M0Li5mYWQ3Njc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3NvYy1kYWkuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NvYy1kYWkuaApAQCAtMTQyLDYgKzE0Miw4IEBACiAJICogQ2FsbGVkIGJ5IHNvY19jYXJkIGRyaXZlcnMsIG5vcm1hbGx5IGluIHRoZWlyIGh3X3BhcmFtcy4KIAkgKi8KIAlpbnQgKCpzZXRfZm10KShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IGZtdCk7CisJaW50ICgqeGxhdGVfdGRtX3Nsb3RfbWFzaykodW5zaWduZWQgaW50IHNsb3RzLAorCQl1bnNpZ25lZCBpbnQgKnR4X21hc2ssIHVuc2lnbmVkIGludCAqcnhfbWFzayk7CiAJaW50ICgqc2V0X3RkbV9zbG90KShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKIAkJdW5zaWduZWQgaW50IHR4X21hc2ssIHVuc2lnbmVkIGludCByeF9tYXNrLAogCQlpbnQgc2xvdHMsIGludCBzbG90X3dpZHRoKTsKQEAgLTI3MCw2ICsyNzIsNyBAQAogCS8qIHBhcmVudCBwbGF0Zm9ybS9jb2RlYyAqLwogCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQ7CiAKIAlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmggYi9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmgKaW5kZXggNmU4OWVmNi4uZWY3OGY1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oCisrKyBiL2luY2x1ZGUvc291bmQvc29jLWRhcG0uaApAQCAtMTA4LDEzICsxMDgsOSBAQAogCVNORF9TT0NfREFQTV9JTklUX1JFR19WQUwod3JlZywgd3NoaWZ0LCB3aW52ZXJ0KSwgXAogCS5rY29udHJvbF9uZXdzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IDF9CiAjZGVmaW5lIFNORF9TT0NfREFQTV9WSVJUX01VWCh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMpIFwKLXsJLmlkID0gc25kX3NvY19kYXBtX3ZpcnRfbXV4LCAubmFtZSA9IHduYW1lLCBcCi0JU05EX1NPQ19EQVBNX0lOSVRfUkVHX1ZBTCh3cmVnLCB3c2hpZnQsIHdpbnZlcnQpLCBcCi0JLmtjb250cm9sX25ld3MgPSB3Y29udHJvbHMsIC5udW1fa2NvbnRyb2xzID0gMX0KKwlTTkRfU09DX0RBUE1fTVVYKHduYW1lLCB3cmVnLCB3c2hpZnQsIHdpbnZlcnQsIHdjb250cm9scykKICNkZWZpbmUgU05EX1NPQ19EQVBNX1ZBTFVFX01VWCh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMpIFwKLXsJLmlkID0gc25kX3NvY19kYXBtX3ZhbHVlX211eCwgLm5hbWUgPSB3bmFtZSwgXAotCVNORF9TT0NfREFQTV9JTklUX1JFR19WQUwod3JlZywgd3NoaWZ0LCB3aW52ZXJ0KSwgXAotCS5rY29udHJvbF9uZXdzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IDF9CisJU05EX1NPQ19EQVBNX01VWCh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMpCiAKIC8qIFNpbXBsaWZpZWQgdmVyc2lvbnMgb2YgYWJvdmUgbWFjcm9zLCBhc3N1bWluZyB3bmNvbnRyb2xzID0gQVJSQVlfU0laRSh3Y29udHJvbHMpICovCiAjZGVmaW5lIFNPQ19QR0FfQVJSQVkod25hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCxcCkBAIC0xNzIsMTAgKzE2OCw4IEBACiAJLmV2ZW50ID0gd2V2ZW50LCAuZXZlbnRfZmxhZ3MgPSB3ZmxhZ3N9CiAjZGVmaW5lIFNORF9TT0NfREFQTV9WSVJUX01VWF9FKHduYW1lLCB3cmVnLCB3c2hpZnQsIHdpbnZlcnQsIHdjb250cm9scywgXAogCXdldmVudCwgd2ZsYWdzKSBcCi17CS5pZCA9IHNuZF9zb2NfZGFwbV92aXJ0X211eCwgLm5hbWUgPSB3bmFtZSwgXAotCVNORF9TT0NfREFQTV9JTklUX1JFR19WQUwod3JlZywgd3NoaWZ0LCB3aW52ZXJ0KSwgXAotCS5rY29udHJvbF9uZXdzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IDEsIFwKLQkuZXZlbnQgPSB3ZXZlbnQsIC5ldmVudF9mbGFncyA9IHdmbGFnc30KKwlTTkRfU09DX0RBUE1fTVVYX0Uod25hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCwgd2NvbnRyb2xzLCB3ZXZlbnQsIFwKKwkJd2ZsYWdzKQogCiAvKiBhZGRpdGlvbmFsIHNlcXVlbmNpbmcgY29udHJvbCB3aXRoaW4gYW4gZXZlbnQgdHlwZSAqLwogI2RlZmluZSBTTkRfU09DX0RBUE1fUEdBX1Mod25hbWUsIHdzdWJzZXEsIHdyZWcsIHdzaGlmdCwgd2ludmVydCwgXApAQCAtMzExLDEyICszMDUsOCBAQAogIAkuZ2V0ID0gc25kX3NvY19kYXBtX2dldF9lbnVtX2RvdWJsZSwgXAogIAkucHV0ID0gc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZSwgXAogICAJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQotI2RlZmluZSBTT0NfREFQTV9FTlVNX1ZJUlQoeG5hbWUsIHhlbnVtKQkJICAgIFwKLXsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb19lbnVtX2RvdWJsZSwgXAotCS5nZXQgPSBzbmRfc29jX2RhcG1fZ2V0X2VudW1fdmlydCwgXAotCS5wdXQgPSBzbmRfc29jX2RhcG1fcHV0X2VudW1fdmlydCwgXAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJnhlbnVtIH0KKyNkZWZpbmUgU09DX0RBUE1fRU5VTV9WSVJUKHhuYW1lLCB4ZW51bSkgXAorCVNPQ19EQVBNX0VOVU0oeG5hbWUsIHhlbnVtKQogI2RlZmluZSBTT0NfREFQTV9FTlVNX0VYVCh4bmFtZSwgeGVudW0sIHhnZXQsIHhwdXQpIFwKIHsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKIAkuaW5mbyA9IHNuZF9zb2NfaW5mb19lbnVtX2RvdWJsZSwgXApAQCAtMzI0LDExICszMTQsNyBAQAogCS5wdXQgPSB4cHV0LCBcCiAJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQogI2RlZmluZSBTT0NfREFQTV9WQUxVRV9FTlVNKHhuYW1lLCB4ZW51bSkgXAotewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAotCS5pbmZvID0gc25kX3NvY19pbmZvX2VudW1fZG91YmxlLCBcCi0JLmdldCA9IHNuZF9zb2NfZGFwbV9nZXRfdmFsdWVfZW51bV9kb3VibGUsIFwKLQkucHV0ID0gc25kX3NvY19kYXBtX3B1dF92YWx1ZV9lbnVtX2RvdWJsZSwgXAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJnhlbnVtIH0KKwlTT0NfREFQTV9FTlVNKHhuYW1lLCB4ZW51bSkKICNkZWZpbmUgU09DX0RBUE1fUElOX1NXSVRDSCh4bmFtZSkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSAiIFN3aXRjaCIsIFwKIAkuaW5mbyA9IHNuZF9zb2NfZGFwbV9pbmZvX3Bpbl9zd2l0Y2gsIFwKQEAgLTM5MiwxNCArMzc4LDYgQEAKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CiBpbnQgc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7Ci1pbnQgc25kX3NvY19kYXBtX2dldF9lbnVtX3ZpcnQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwotaW50IHNuZF9zb2NfZGFwbV9wdXRfZW51bV92aXJ0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLWludCBzbmRfc29jX2RhcG1fZ2V0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLWludCBzbmRfc29jX2RhcG1fcHV0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKIGludCBzbmRfc29jX2RhcG1faW5mb19waW5fc3dpdGNoKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pOwogaW50IHNuZF9zb2NfZGFwbV9nZXRfcGluX3N3aXRjaChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKQEAgLTQ2MSw2ICs0MzksNyBAQAogaW50IHNuZF9zb2NfZGFwbV9nZXRfcGluX3N0YXR1cyhzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCiAJCQkJY29uc3QgY2hhciAqcGluKTsKIGludCBzbmRfc29jX2RhcG1fc3luYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pOworaW50IHNuZF9zb2NfZGFwbV9zeW5jX3VubG9ja2VkKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSk7CiBpbnQgc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAogCQkJCSAgY29uc3QgY2hhciAqcGluKTsKIGludCBzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3Bpbl91bmxvY2tlZChzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCkBAIC00NzAsNyArNDQ5LDYgQEAKIHZvaWQgc25kX3NvY19kYXBtX2F1dG9fbmNfY29kZWNfcGlucyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwogCiAvKiBNb3N0bHkgaW50ZXJuYWwgLSBzaG91bGQgbm90IG5vcm1hbGx5IGJlIHVzZWQgKi8KLXZvaWQgZGFwbV9tYXJrX2RpcnR5KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LCBjb25zdCBjaGFyICpyZWFzb24pOwogdm9pZCBkYXBtX21hcmtfaW9fZGlydHkoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtKTsKIAogLyogZGFwbSBwYXRoIHF1ZXJ5ICovCkBAIC00ODQsOCArNDYyLDYgQEAKIAlzbmRfc29jX2RhcG1faW5wdXQgPSAwLAkJLyogaW5wdXQgcGluICovCiAJc25kX3NvY19kYXBtX291dHB1dCwJCS8qIG91dHB1dCBwaW4gKi8KIAlzbmRfc29jX2RhcG1fbXV4LAkJCS8qIHNlbGVjdHMgMSBhbmFsb2cgc2lnbmFsIGZyb20gbWFueSBpbnB1dHMgKi8KLQlzbmRfc29jX2RhcG1fdmlydF9tdXgsCQkJLyogdmlydHVhbCB2ZXJzaW9uIG9mIHNuZF9zb2NfZGFwbV9tdXggKi8KLQlzbmRfc29jX2RhcG1fdmFsdWVfbXV4LAkJCS8qIHNlbGVjdHMgMSBhbmFsb2cgc2lnbmFsIGZyb20gbWFueSBpbnB1dHMgKi8KIAlzbmRfc29jX2RhcG1fbWl4ZXIsCQkJLyogbWl4ZXMgc2V2ZXJhbCBhbmFsb2cgc2lnbmFscyB0b2dldGhlciAqLwogCXNuZF9zb2NfZGFwbV9taXhlcl9uYW1lZF9jdGwsCQkvKiBtaXhlciB3aXRoIG5hbWVkIGNvbnRyb2xzICovCiAJc25kX3NvY19kYXBtX3BnYSwJCQkvKiBwcm9ncmFtbWFibGUgZ2Fpbi9hdHRlbnVhdGlvbiAodm9sdW1lKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2MuaCBiL2luY2x1ZGUvc291bmQvc29jLmgKaW5kZXggOWEwMDE0Ny4uMGI4MzE2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zb2MuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NvYy5oCkBAIC00NSw2ICs0NSwxMSBAQAogCSgodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAogCXsucmVnID0geGxyZWcsIC5ycmVnID0geHJyZWcsIC5zaGlmdCA9IHhzaGlmdCwgLnJzaGlmdCA9IHhzaGlmdCwgXAogCS5tYXggPSB4bWF4LCAucGxhdGZvcm1fbWF4ID0geG1heCwgLmludmVydCA9IHhpbnZlcnR9KQorI2RlZmluZSBTT0NfRE9VQkxFX1JfU19WQUxVRSh4bHJlZywgeHJyZWcsIHhzaGlmdCwgeG1pbiwgeG1heCwgeHNpZ25fYml0LCB4aW52ZXJ0KSBcCisJKCh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKSBcCisJey5yZWcgPSB4bHJlZywgLnJyZWcgPSB4cnJlZywgLnNoaWZ0ID0geHNoaWZ0LCAucnNoaWZ0ID0geHNoaWZ0LCBcCisJLm1heCA9IHhtYXgsIC5taW4gPSB4bWluLCAucGxhdGZvcm1fbWF4ID0geG1heCwgLnNpZ25fYml0ID0geHNpZ25fYml0LCBcCisJLmludmVydCA9IHhpbnZlcnR9KQogI2RlZmluZSBTT0NfRE9VQkxFX1JfUkFOR0VfVkFMVUUoeGxyZWcsIHhycmVnLCB4c2hpZnQsIHhtaW4sIHhtYXgsIHhpbnZlcnQpIFwKIAkoKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wpIFwKIAl7LnJlZyA9IHhscmVnLCAucnJlZyA9IHhycmVnLCAuc2hpZnQgPSB4c2hpZnQsIC5yc2hpZnQgPSB4c2hpZnQsIFwKQEAgLTE1Miw2ICsxNTcsMTUgQEAKIAkJey5yZWcgPSB4cmVnLCAucnJlZyA9IHhycmVnLCBcCiAJCS5zaGlmdCA9IHhzaGlmdCwgLnJzaGlmdCA9IHhzaGlmdCwgXAogCQkubWF4ID0geG1heCwgLm1pbiA9IHhtaW59IH0KKyNkZWZpbmUgU09DX0RPVUJMRV9SX1NfVExWKHhuYW1lLCByZWdfbGVmdCwgcmVnX3JpZ2h0LCB4c2hpZnQsIHhtaW4sIHhtYXgsIHhzaWduX2JpdCwgeGludmVydCwgdGx2X2FycmF5KSBcCit7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9ICh4bmFtZSksXAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfFwKKwkJIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsXAorCS50bHYucCA9ICh0bHZfYXJyYXkpLCBcCisJLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csIFwKKwkuZ2V0ID0gc25kX3NvY19nZXRfdm9sc3csIC5wdXQgPSBzbmRfc29jX3B1dF92b2xzdywgXAorCS5wcml2YXRlX3ZhbHVlID0gU09DX0RPVUJMRV9SX1NfVkFMVUUocmVnX2xlZnQsIHJlZ19yaWdodCwgeHNoaWZ0LCBcCisJCQkJCSAgICB4bWluLCB4bWF4LCB4c2lnbl9iaXQsIHhpbnZlcnQpIH0KICNkZWZpbmUgU09DX0RPVUJMRV9TOF9UTFYoeG5hbWUsIHhyZWcsIHhtaW4sIHhtYXgsIHRsdl9hcnJheSkgXAogewkuaWZhY2UgID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSwgXAogCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfCBcCkBAIC0xNjIsMzAgKzE3NiwyOCBAQAogCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wpIFwKIAkJey5yZWcgPSB4cmVnLCAubWluID0geG1pbiwgLm1heCA9IHhtYXgsIFwKIAkJIC5wbGF0Zm9ybV9tYXggPSB4bWF4fSB9Ci0jZGVmaW5lIFNPQ19FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIHhtYXgsIHh0ZXh0cykgXAorI2RlZmluZSBTT0NfRU5VTV9ET1VCTEUoeHJlZywgeHNoaWZ0X2wsIHhzaGlmdF9yLCB4aXRlbXMsIHh0ZXh0cykgXAogewkucmVnID0geHJlZywgLnNoaWZ0X2wgPSB4c2hpZnRfbCwgLnNoaWZ0X3IgPSB4c2hpZnRfciwgXAotCS5tYXggPSB4bWF4LCAudGV4dHMgPSB4dGV4dHMsIFwKLQkubWFzayA9IHhtYXggPyByb3VuZHVwX3Bvd19vZl90d28oeG1heCkgLSAxIDogMH0KLSNkZWZpbmUgU09DX0VOVU1fU0lOR0xFKHhyZWcsIHhzaGlmdCwgeG1heCwgeHRleHRzKSBcCi0JU09DX0VOVU1fRE9VQkxFKHhyZWcsIHhzaGlmdCwgeHNoaWZ0LCB4bWF4LCB4dGV4dHMpCi0jZGVmaW5lIFNPQ19FTlVNX1NJTkdMRV9FWFQoeG1heCwgeHRleHRzKSBcCi17CS5tYXggPSB4bWF4LCAudGV4dHMgPSB4dGV4dHMgfQotI2RlZmluZSBTT0NfVkFMVUVfRU5VTV9ET1VCTEUoeHJlZywgeHNoaWZ0X2wsIHhzaGlmdF9yLCB4bWFzaywgeG1heCwgeHRleHRzLCB4dmFsdWVzKSBcCisJLml0ZW1zID0geGl0ZW1zLCAudGV4dHMgPSB4dGV4dHMsIFwKKwkubWFzayA9IHhpdGVtcyA/IHJvdW5kdXBfcG93X29mX3R3byh4aXRlbXMpIC0gMSA6IDB9CisjZGVmaW5lIFNPQ19FTlVNX1NJTkdMRSh4cmVnLCB4c2hpZnQsIHhpdGVtcywgeHRleHRzKSBcCisJU09DX0VOVU1fRE9VQkxFKHhyZWcsIHhzaGlmdCwgeHNoaWZ0LCB4aXRlbXMsIHh0ZXh0cykKKyNkZWZpbmUgU09DX0VOVU1fU0lOR0xFX0VYVCh4aXRlbXMsIHh0ZXh0cykgXAorewkuaXRlbXMgPSB4aXRlbXMsIC50ZXh0cyA9IHh0ZXh0cyB9CisjZGVmaW5lIFNPQ19WQUxVRV9FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIHhtYXNrLCB4aXRlbXMsIHh0ZXh0cywgeHZhbHVlcykgXAogewkucmVnID0geHJlZywgLnNoaWZ0X2wgPSB4c2hpZnRfbCwgLnNoaWZ0X3IgPSB4c2hpZnRfciwgXAotCS5tYXNrID0geG1hc2ssIC5tYXggPSB4bWF4LCAudGV4dHMgPSB4dGV4dHMsIC52YWx1ZXMgPSB4dmFsdWVzfQotI2RlZmluZSBTT0NfVkFMVUVfRU5VTV9TSU5HTEUoeHJlZywgeHNoaWZ0LCB4bWFzaywgeG1heCwgeHRleHRzLCB4dmFsdWVzKSBcCi0JU09DX1ZBTFVFX0VOVU1fRE9VQkxFKHhyZWcsIHhzaGlmdCwgeHNoaWZ0LCB4bWFzaywgeG1heCwgeHRleHRzLCB4dmFsdWVzKQorCS5tYXNrID0geG1hc2ssIC5pdGVtcyA9IHhpdGVtcywgLnRleHRzID0geHRleHRzLCAudmFsdWVzID0geHZhbHVlc30KKyNkZWZpbmUgU09DX1ZBTFVFX0VOVU1fU0lOR0xFKHhyZWcsIHhzaGlmdCwgeG1hc2ssIHhuaXRtZXMsIHh0ZXh0cywgeHZhbHVlcykgXAorCVNPQ19WQUxVRV9FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnQsIHhzaGlmdCwgeG1hc2ssIHhuaXRtZXMsIHh0ZXh0cywgeHZhbHVlcykKKyNkZWZpbmUgU09DX0VOVU1fU0lOR0xFX1ZJUlQoeGl0ZW1zLCB4dGV4dHMpIFwKKwlTT0NfRU5VTV9TSU5HTEUoU05EX1NPQ19OT1BNLCAwLCB4aXRlbXMsIHh0ZXh0cykKICNkZWZpbmUgU09DX0VOVU0oeG5hbWUsIHhlbnVtKSBcCiB7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLFwKIAkuaW5mbyA9IHNuZF9zb2NfaW5mb19lbnVtX2RvdWJsZSwgXAogCS5nZXQgPSBzbmRfc29jX2dldF9lbnVtX2RvdWJsZSwgLnB1dCA9IHNuZF9zb2NfcHV0X2VudW1fZG91YmxlLCBcCiAJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQogI2RlZmluZSBTT0NfVkFMVUVfRU5VTSh4bmFtZSwgeGVudW0pIFwKLXsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsXAotCS5pbmZvID0gc25kX3NvY19pbmZvX2VudW1fZG91YmxlLCBcCi0JLmdldCA9IHNuZF9zb2NfZ2V0X3ZhbHVlX2VudW1fZG91YmxlLCBcCi0JLnB1dCA9IHNuZF9zb2NfcHV0X3ZhbHVlX2VudW1fZG91YmxlLCBcCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQorCVNPQ19FTlVNKHhuYW1lLCB4ZW51bSkKICNkZWZpbmUgU09DX1NJTkdMRV9FWFQoeG5hbWUsIHhyZWcsIHhzaGlmdCwgeG1heCwgeGludmVydCxcCiAJIHhoYW5kbGVyX2dldCwgeGhhbmRsZXJfcHV0KSBcCiB7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCkBAIC0yNzIsMTcgKzI4NCwxOSBAQAogICogQVJSQVlfU0laRSBpbnRlcm5hbGx5CiAgKi8KICNkZWZpbmUgU09DX0VOVU1fRE9VQkxFX0RFQ0wobmFtZSwgeHJlZywgeHNoaWZ0X2wsIHhzaGlmdF9yLCB4dGV4dHMpIFwKLQlzdHJ1Y3Qgc29jX2VudW0gbmFtZSA9IFNPQ19FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIFwKKwljb25zdCBzdHJ1Y3Qgc29jX2VudW0gbmFtZSA9IFNPQ19FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIFwKIAkJCQkJCUFSUkFZX1NJWkUoeHRleHRzKSwgeHRleHRzKQogI2RlZmluZSBTT0NfRU5VTV9TSU5HTEVfREVDTChuYW1lLCB4cmVnLCB4c2hpZnQsIHh0ZXh0cykgXAogCVNPQ19FTlVNX0RPVUJMRV9ERUNMKG5hbWUsIHhyZWcsIHhzaGlmdCwgeHNoaWZ0LCB4dGV4dHMpCiAjZGVmaW5lIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChuYW1lLCB4dGV4dHMpIFwKLQlzdHJ1Y3Qgc29jX2VudW0gbmFtZSA9IFNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRSh4dGV4dHMpLCB4dGV4dHMpCisJY29uc3Qgc3RydWN0IHNvY19lbnVtIG5hbWUgPSBTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUoeHRleHRzKSwgeHRleHRzKQogI2RlZmluZSBTT0NfVkFMVUVfRU5VTV9ET1VCTEVfREVDTChuYW1lLCB4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIHhtYXNrLCB4dGV4dHMsIHh2YWx1ZXMpIFwKLQlzdHJ1Y3Qgc29jX2VudW0gbmFtZSA9IFNPQ19WQUxVRV9FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIHhtYXNrLCBcCisJY29uc3Qgc3RydWN0IHNvY19lbnVtIG5hbWUgPSBTT0NfVkFMVUVfRU5VTV9ET1VCTEUoeHJlZywgeHNoaWZ0X2wsIHhzaGlmdF9yLCB4bWFzaywgXAogCQkJCQkJCUFSUkFZX1NJWkUoeHRleHRzKSwgeHRleHRzLCB4dmFsdWVzKQogI2RlZmluZSBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChuYW1lLCB4cmVnLCB4c2hpZnQsIHhtYXNrLCB4dGV4dHMsIHh2YWx1ZXMpIFwKIAlTT0NfVkFMVUVfRU5VTV9ET1VCTEVfREVDTChuYW1lLCB4cmVnLCB4c2hpZnQsIHhzaGlmdCwgeG1hc2ssIHh0ZXh0cywgeHZhbHVlcykKKyNkZWZpbmUgU09DX0VOVU1fU0lOR0xFX1ZJUlRfREVDTChuYW1lLCB4dGV4dHMpIFwKKwljb25zdCBzdHJ1Y3Qgc29jX2VudW0gbmFtZSA9IFNPQ19FTlVNX1NJTkdMRV9WSVJUKEFSUkFZX1NJWkUoeHRleHRzKSwgeHRleHRzKQogCiAvKgogICogQ29tcG9uZW50IHByb2JlIGFuZCByZW1vdmUgb3JkZXJpbmcgbGV2ZWxzIGZvciBjb21wb25lbnRzIHdpdGggcnVudGltZQpAQCAtMzQwLDEyICszNTQsNiBAQAogCiBleHRlcm4gc3RydWN0IHNuZF9hYzk3X2J1c19vcHMgKnNvY19hYzk3X29wczsKIAotZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSB7Ci0JU05EX1NPQ19JMkMgPSAxLAotCVNORF9TT0NfU1BJLAotCVNORF9TT0NfUkVHTUFQLAotfTsKLQogZW51bSBzbmRfc29jX3BjbV9zdWJjbGFzcyB7CiAJU05EX1NPQ19QQ01fQ0xBU1NfUENNCT0gMCwKIAlTTkRfU09DX1BDTV9DTEFTU19CRQk9IDEsCkBAIC0zOTIsOCArNDAwLDcgQEAKIGludCBzbmRfc29jX2NvZGVjX3dyaXRhYmxlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAkJCQkgICAgdW5zaWduZWQgaW50IHJlZyk7CiBpbnQgc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJICAgICAgIGludCBhZGRyX2JpdHMsIGludCBkYXRhX2JpdHMsCi0JCQkgICAgICAgZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sKTsKKwkJCSAgICAgICBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApOwogaW50IHNuZF9zb2NfY2FjaGVfc3luYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwogaW50IHNuZF9zb2NfY2FjaGVfaW5pdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwogaW50IHNuZF9zb2NfY2FjaGVfZXhpdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwpAQCAtNDEzLDYgKzQyMCwxMCBAQAogc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNuZF9zb2NfZ2V0X3BjbV9ydW50aW1lKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQsCiAJCWNvbnN0IGNoYXIgKmRhaV9saW5rKTsKIAorYm9vbCBzbmRfc29jX3J1bnRpbWVfaWdub3JlX3BtZG93bl90aW1lKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpOwordm9pZCBzbmRfc29jX3J1bnRpbWVfYWN0aXZhdGUoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwgaW50IHN0cmVhbSk7Cit2b2lkIHNuZF9zb2NfcnVudGltZV9kZWFjdGl2YXRlKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsIGludCBzdHJlYW0pOworCiAvKiBVdGlsaXR5IGZ1bmN0aW9ucyB0byBnZXQgY2xvY2sgcmF0ZXMgZnJvbSB2YXJpb3VzIHRoaW5ncyAqLwogaW50IHNuZF9zb2NfY2FsY19mcmFtZV9zaXplKGludCBzYW1wbGVfc2l6ZSwgaW50IGNoYW5uZWxzLCBpbnQgdGRtX3Nsb3RzKTsKIGludCBzbmRfc29jX3BhcmFtc190b19mcmFtZV9zaXplKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKTsKQEAgLTQ5NiwxMCArNTA3LDYgQEAKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CiBpbnQgc25kX3NvY19wdXRfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwotaW50IHNuZF9zb2NfZ2V0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLWludCBzbmRfc29jX3B1dF92YWx1ZV9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CiBpbnQgc25kX3NvY19pbmZvX3ZvbHN3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pOwogI2RlZmluZSBzbmRfc29jX2luZm9fYm9vbF9leHQJCXNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8KQEAgLTYwMCw3ICs2MDcsOCBAQAogCXN0cnVjdCBzbmRfc29jX2phY2sgKmphY2s7CiAJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwogCi0JaW50ICgqamFja19zdGF0dXNfY2hlY2spKHZvaWQpOworCXZvaWQgKmRhdGE7CisJaW50ICgqamFja19zdGF0dXNfY2hlY2spKHZvaWQgKmRhdGEpOwogfTsKIAogc3RydWN0IHNuZF9zb2NfamFjayB7CkBAIC02NTYsMTIgKzY2NCwxOSBAQAogCWNvbnN0IGNoYXIgKm5hbWU7CiAJaW50IGlkOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCXVuc2lnbmVkIGludCBhY3RpdmU7CisKKwl1bnNpZ25lZCBpbnQgaWdub3JlX3BtZG93bl90aW1lOjE7IC8qIHBtZG93bl90aW1lIGlzIGlnbm9yZWQgYXQgc3RvcCAqLworCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCiAJc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciAqZGFpX2RydjsKIAlpbnQgbnVtX2RhaTsKIAogCWNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgKmRyaXZlcjsKKworCXN0cnVjdCBsaXN0X2hlYWQgZGFpX2xpc3Q7CiB9OwogCiAvKiBTb0MgQXVkaW8gQ29kZWMgZGV2aWNlICovCkBAIC02ODMsNyArNjk4LDYgQEAKIAogCS8qIHJ1bnRpbWUgKi8KIAlzdHJ1Y3Qgc25kX2FjOTcgKmFjOTc7ICAvKiBmb3IgYWQtaG9jIGFjOTcgZGV2aWNlcyAqLwotCXVuc2lnbmVkIGludCBhY3RpdmU7CiAJdW5zaWduZWQgaW50IGNhY2hlX2J5cGFzczoxOyAvKiBTdXBwcmVzcyBhY2Nlc3MgdG8gdGhlIGNhY2hlICovCiAJdW5zaWduZWQgaW50IHN1c3BlbmRlZDoxOyAvKiBDb2RlYyBpcyBpbiBzdXNwZW5kIFBNIHN0YXRlICovCiAJdW5zaWduZWQgaW50IHByb2JlZDoxOyAvKiBDb2RlYyBoYXMgYmVlbiBwcm9iZWQgKi8KQEAgLTY5Nyw3ICs3MTEsNiBAQAogCS8qIGNvZGVjIElPICovCiAJdm9pZCAqY29udHJvbF9kYXRhOyAvKiBjb2RlYyBjb250cm9sIChpMmMvM3dpcmUpIGRhdGEgKi8KIAlod193cml0ZV90IGh3X3dyaXRlOwotCXVuc2lnbmVkIGludCAoKmh3X3JlYWQpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIHVuc2lnbmVkIGludCk7CiAJdW5zaWduZWQgaW50ICgqcmVhZCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50KTsKIAlpbnQgKCp3cml0ZSkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwogCXZvaWQgKnJlZ19jYWNoZTsKQEAgLTcwOSw3ICs3MjIsNiBAQAogCiAJLyogZGFwbSAqLwogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCBkYXBtOwotCXVuc2lnbmVkIGludCBpZ25vcmVfcG1kb3duX3RpbWU6MTsgLyogcG1kb3duX3RpbWUgaXMgaWdub3JlZCBhdCBzdG9wICovCiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NvZGVjX3Jvb3Q7CkBAIC0xMDY3LDYgKzEwNzksNyBAQAogCWludCBtaW4sIG1heCwgcGxhdGZvcm1fbWF4OwogCWludCByZWcsIHJyZWc7CiAJdW5zaWduZWQgaW50IHNoaWZ0LCByc2hpZnQ7CisJdW5zaWduZWQgaW50IHNpZ25fYml0OwogCXVuc2lnbmVkIGludCBpbnZlcnQ6MTsKIAl1bnNpZ25lZCBpbnQgYXV0b2Rpc2FibGU6MTsKIH07CkBAIC0xMDg1LDE2ICsxMDk4LDI4IEBACiAKIC8qIGVudW1lcmF0ZWQga2NvbnRyb2wgKi8KIHN0cnVjdCBzb2NfZW51bSB7Ci0JdW5zaWduZWQgc2hvcnQgcmVnOwotCXVuc2lnbmVkIHNob3J0IHJlZzI7CisJaW50IHJlZzsKIAl1bnNpZ25lZCBjaGFyIHNoaWZ0X2w7CiAJdW5zaWduZWQgY2hhciBzaGlmdF9yOwotCXVuc2lnbmVkIGludCBtYXg7CisJdW5zaWduZWQgaW50IGl0ZW1zOwogCXVuc2lnbmVkIGludCBtYXNrOwogCWNvbnN0IGNoYXIgKiBjb25zdCAqdGV4dHM7CiAJY29uc3QgdW5zaWduZWQgaW50ICp2YWx1ZXM7CiB9OwogCisvKioKKyAqIHNuZF9zb2NfY29tcG9uZW50X3RvX2NvZGVjKCkgLSBDYXN0cyBhIGNvbXBvbmVudCB0byB0aGUgQ09ERUMgaXQgaXMgZW1iZWRkZWQgaW4KKyAqIEBjb21wb25lbnQ6IFRoZSBjb21wb25lbnQgdG8gY2FzdCB0byBhIENPREVDCisgKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IG9ubHkgYmUgdXNlZCBvbiBjb21wb25lbnRzIHRoYXQgYXJlIGtub3duIHRvIGJlIENPREVDcy4KKyAqIE90aGVyd2lzZSB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzbmRfc29jX2NvZGVjICpzbmRfc29jX2NvbXBvbmVudF90b19jb2RlYygKKwlzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGNvbXBvbmVudCwgc3RydWN0IHNuZF9zb2NfY29kZWMsIGNvbXBvbmVudCk7Cit9CisKIC8qIGNvZGVjIElPICovCiB1bnNpZ25lZCBpbnQgc25kX3NvY19yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZyk7CiB1bnNpZ25lZCBpbnQgc25kX3NvY193cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCkBAIC0xMTY4LDExICsxMTkzLDUxIEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNuZF9zb2NfZW51bV92YWxfdG9faXRlbShzdHJ1Y3Qgc29jX2VudW0gKmUsCisJdW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICghZS0+dmFsdWVzKQorCQlyZXR1cm4gdmFsOworCisJZm9yIChpID0gMDsgaSA8IGUtPml0ZW1zOyBpKyspCisJCWlmICh2YWwgPT0gZS0+dmFsdWVzW2ldKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc25kX3NvY19lbnVtX2l0ZW1fdG9fdmFsKHN0cnVjdCBzb2NfZW51bSAqZSwKKwl1bnNpZ25lZCBpbnQgaXRlbSkKK3sKKwlpZiAoIWUtPnZhbHVlcykKKwkJcmV0dXJuIGl0ZW07CisKKwlyZXR1cm4gZS0+dmFsdWVzW2l0ZW1dOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgc25kX3NvY19jb21wb25lbnRfaXNfYWN0aXZlKAorCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50KQoreworCXJldHVybiBjb21wb25lbnQtPmFjdGl2ZSAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgc25kX3NvY19jb2RlY19pc19hY3RpdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXJldHVybiBzbmRfc29jX2NvbXBvbmVudF9pc19hY3RpdmUoJmNvZGVjLT5jb21wb25lbnQpOworfQorCiBpbnQgc25kX3NvY191dGlsX2luaXQodm9pZCk7CiB2b2lkIHNuZF9zb2NfdXRpbF9leGl0KHZvaWQpOwogCiBpbnQgc25kX3NvY19vZl9wYXJzZV9jYXJkX25hbWUoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCwKIAkJCSAgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSk7CitpbnQgc25kX3NvY19vZl9wYXJzZV9hdWRpb19zaW1wbGVfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkLAorCQkJCQkgIGNvbnN0IGNoYXIgKnByb3BuYW1lKTsKK2ludCBzbmRfc29jX29mX3BhcnNlX3RkbV9zbG90KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKnNsb3RzLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpzbG90X3dpZHRoKTsKIGludCBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3JvdXRpbmcoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCwKIAkJCQkgICBjb25zdCBjaGFyICpwcm9wbmFtZSk7CiB1bnNpZ25lZCBpbnQgc25kX3NvY19vZl9wYXJzZV9kYWlmbXQoc3RydWN0IGRldmljZV9ub2RlICpucCwKQEAgLTExODgsNCArMTI1MywxNSBAQAogCiBleHRlcm4gY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgc25kX3NvY19wbV9vcHM7CiAKKy8qIEhlbHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCit7CisJbXV0ZXhfbG9jaygmZGFwbS0+Y2FyZC0+ZGFwbV9tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSkKK3sKKwltdXRleF91bmxvY2soJmRhcG0tPmNhcmQtPmRhcG1fbXV0ZXgpOworfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2JjYWNoZS5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvYmNhY2hlLmgKaW5kZXggNzExMDg5Ny4uYzljM2MwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvYmNhY2hlLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvYmNhY2hlLmgKQEAgLTM5OSwyNiArMzk5LDQzIEBACiAKIC8qIEFsbG9jYXRvciAqLwogCi1UUkFDRV9FVkVOVChiY2FjaGVfYWxsb2NfaW52YWxpZGF0ZSwKLQlUUF9QUk9UTyhzdHJ1Y3QgY2FjaGUgKmNhKSwKLQlUUF9BUkdTKGNhKSwKK1RSQUNFX0VWRU5UKGJjYWNoZV9pbnZhbGlkYXRlLAorCVRQX1BST1RPKHN0cnVjdCBjYWNoZSAqY2EsIHNpemVfdCBidWNrZXQpLAorCVRQX0FSR1MoY2EsIGJ1Y2tldCksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAotCQlfX2ZpZWxkKHVuc2lnbmVkLAlmcmVlCQkJKQotCQlfX2ZpZWxkKHVuc2lnbmVkLAlmcmVlX2luYwkJKQotCQlfX2ZpZWxkKHVuc2lnbmVkLAlmcmVlX2luY19zaXplCQkpCi0JCV9fZmllbGQodW5zaWduZWQsCXVudXNlZAkJCSkKKwkJX19maWVsZCh1bnNpZ25lZCwJc2VjdG9ycwkJCSkKKwkJX19maWVsZChkZXZfdCwJCWRldgkJCSkKKwkJX19maWVsZChfX3U2NCwJCW9mZnNldAkJCSkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCi0JCV9fZW50cnktPmZyZWUJCT0gZmlmb191c2VkKCZjYS0+ZnJlZVtSRVNFUlZFX05PTkVdKTsKLQkJX19lbnRyeS0+ZnJlZV9pbmMJPSBmaWZvX3VzZWQoJmNhLT5mcmVlX2luYyk7Ci0JCV9fZW50cnktPmZyZWVfaW5jX3NpemUJPSBjYS0+ZnJlZV9pbmMuc2l6ZTsKLQkJX19lbnRyeS0+dW51c2VkCQk9IGZpZm9fdXNlZCgmY2EtPnVudXNlZCk7CisJCV9fZW50cnktPmRldgkJPSBjYS0+YmRldi0+YmRfZGV2OworCQlfX2VudHJ5LT5vZmZzZXQJCT0gYnVja2V0IDw8IGNhLT5zZXQtPmJ1Y2tldF9iaXRzOworCQlfX2VudHJ5LT5zZWN0b3JzCT0gR0NfU0VDVE9SU19VU0VEKCZjYS0+YnVja2V0c1tidWNrZXRdKTsKIAkpLAogCi0JVFBfcHJpbnRrKCJmcmVlICV1IGZyZWVfaW5jICV1LyV1IHVudXNlZCAldSIsIF9fZW50cnktPmZyZWUsCi0JCSAgX19lbnRyeS0+ZnJlZV9pbmMsIF9fZW50cnktPmZyZWVfaW5jX3NpemUsIF9fZW50cnktPnVudXNlZCkKKwlUUF9wcmludGsoImludmFsaWRhdGVkICV1IHNlY3RvcnMgYXQgJWQsJWQgc2VjdG9yPSVsbHUiLAorCQkgIF9fZW50cnktPnNlY3RvcnMsIE1BSk9SKF9fZW50cnktPmRldiksCisJCSAgTUlOT1IoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+b2Zmc2V0KQorKTsKKworVFJBQ0VfRVZFTlQoYmNhY2hlX2FsbG9jLAorCVRQX1BST1RPKHN0cnVjdCBjYWNoZSAqY2EsIHNpemVfdCBidWNrZXQpLAorCVRQX0FSR1MoY2EsIGJ1Y2tldCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKGRldl90LAkJZGV2CQkJKQorCQlfX2ZpZWxkKF9fdTY0LAkJb2Zmc2V0CQkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CQk9IGNhLT5iZGV2LT5iZF9kZXY7CisJCV9fZW50cnktPm9mZnNldAkJPSBidWNrZXQgPDwgY2EtPnNldC0+YnVja2V0X2JpdHM7CisJKSwKKworCVRQX3ByaW50aygiYWxsb2NhdGVkICVkLCVkIHNlY3Rvcj0lbGx1IiwgTUFKT1IoX19lbnRyeS0+ZGV2KSwKKwkJICBNSU5PUihfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT5vZmZzZXQpCiApOwogCiBUUkFDRV9FVkVOVChiY2FjaGVfYWxsb2NfZmFpbCwKQEAgLTQyNiwyMSArNDQzLDIyIEBACiAJVFBfQVJHUyhjYSwgcmVzZXJ2ZSksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKGRldl90LAkJZGV2CQkJKQogCQlfX2ZpZWxkKHVuc2lnbmVkLAlmcmVlCQkJKQogCQlfX2ZpZWxkKHVuc2lnbmVkLAlmcmVlX2luYwkJKQotCQlfX2ZpZWxkKHVuc2lnbmVkLAl1bnVzZWQJCQkpCiAJCV9fZmllbGQodW5zaWduZWQsCWJsb2NrZWQJCQkpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJCT0gY2EtPmJkZXYtPmJkX2RldjsKIAkJX19lbnRyeS0+ZnJlZQkJPSBmaWZvX3VzZWQoJmNhLT5mcmVlW3Jlc2VydmVdKTsKIAkJX19lbnRyeS0+ZnJlZV9pbmMJPSBmaWZvX3VzZWQoJmNhLT5mcmVlX2luYyk7Ci0JCV9fZW50cnktPnVudXNlZAkJPSBmaWZvX3VzZWQoJmNhLT51bnVzZWQpOwogCQlfX2VudHJ5LT5ibG9ja2VkCT0gYXRvbWljX3JlYWQoJmNhLT5zZXQtPnByaW9fYmxvY2tlZCk7CiAJKSwKIAotCVRQX3ByaW50aygiZnJlZSAldSBmcmVlX2luYyAldSB1bnVzZWQgJXUgYmxvY2tlZCAldSIsIF9fZW50cnktPmZyZWUsCi0JCSAgX19lbnRyeS0+ZnJlZV9pbmMsIF9fZW50cnktPnVudXNlZCwgX19lbnRyeS0+YmxvY2tlZCkKKwlUUF9wcmludGsoImFsbG9jIGZhaWwgJWQsJWQgZnJlZSAldSBmcmVlX2luYyAldSBibG9ja2VkICV1IiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT5mcmVlLAorCQkgIF9fZW50cnktPmZyZWVfaW5jLCBfX2VudHJ5LT5ibG9ja2VkKQogKTsKIAogLyogQmFja2dyb3VuZCB3cml0ZWJhY2sgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2Jsb2NrLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9ibG9jay5oCmluZGV4IGU3NmFlMTkuLmU4YTVlY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2Jsb2NrLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvYmxvY2suaApAQCAtMTMyLDYgKzEzMiw3IEBACiAgKiBibG9ja19ycV9jb21wbGV0ZSAtIGJsb2NrIElPIG9wZXJhdGlvbiBjb21wbGV0ZWQgYnkgZGV2aWNlIGRyaXZlcgogICogQHE6IHF1ZXVlIGNvbnRhaW5pbmcgdGhlIGJsb2NrIG9wZXJhdGlvbiByZXF1ZXN0CiAgKiBAcnE6IGJsb2NrIG9wZXJhdGlvbnMgcmVxdWVzdAorICogQG5yX2J5dGVzOiBudW1iZXIgb2YgY29tcGxldGVkIGJ5dGVzCiAgKgogICogVGhlIGJsb2NrX3JxX2NvbXBsZXRlIHRyYWNlcG9pbnQgZXZlbnQgaW5kaWNhdGVzIHRoYXQgc29tZSBwb3J0aW9uCiAgKiBvZiBvcGVyYXRpb24gcmVxdWVzdCBoYXMgYmVlbiBjb21wbGV0ZWQgYnkgdGhlIGRldmljZSBkcml2ZXIuICBJZgpAQCAtMTM5LDExICsxNDAsMzcgQEAKICAqIGRvIGZvciB0aGUgcmVxdWVzdC4gSWYgQHJxLT5iaW8gaXMgbm9uLU5VTEwgdGhlbiB0aGVyZSBpcwogICogYWRkaXRpb25hbCB3b3JrIHJlcXVpcmVkIHRvIGNvbXBsZXRlIHRoZSByZXF1ZXN0LgogICovCi1ERUZJTkVfRVZFTlQoYmxvY2tfcnFfd2l0aF9lcnJvciwgYmxvY2tfcnFfY29tcGxldGUsCitUUkFDRV9FVkVOVChibG9ja19ycV9jb21wbGV0ZSwKIAotCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpLAorCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCisJCSB1bnNpZ25lZCBpbnQgbnJfYnl0ZXMpLAogCi0JVFBfQVJHUyhxLCBycSkKKwlUUF9BUkdTKHEsIHJxLCBucl9ieXRlcyksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKCAgZGV2X3QsCWRldgkJCSkKKwkJX19maWVsZCggIHNlY3Rvcl90LAlzZWN0b3IJCQkpCisJCV9fZmllbGQoICB1bnNpZ25lZCBpbnQsCW5yX3NlY3RvcgkJKQorCQlfX2ZpZWxkKCAgaW50LAkJZXJyb3JzCQkJKQorCQlfX2FycmF5KCAgY2hhciwJCXJ3YnMsCVJXQlNfTEVOCSkKKwkJX19keW5hbWljX2FycmF5KCBjaGFyLAljbWQsCWJsa19jbWRfYnVmX2xlbihycSkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CSAgID0gcnEtPnJxX2Rpc2sgPyBkaXNrX2RldnQocnEtPnJxX2Rpc2spIDogMDsKKwkJX19lbnRyeS0+c2VjdG9yICAgID0gYmxrX3JxX3BvcyhycSk7CisJCV9fZW50cnktPm5yX3NlY3RvciA9IG5yX2J5dGVzID4+IDk7CisJCV9fZW50cnktPmVycm9ycyAgICA9IHJxLT5lcnJvcnM7CisKKwkJYmxrX2ZpbGxfcndicyhfX2VudHJ5LT5yd2JzLCBycS0+Y21kX2ZsYWdzLCBucl9ieXRlcyk7CisJCWJsa19kdW1wX2NtZChfX2dldF9zdHIoY21kKSwgcnEpOworCSksCisKKwlUUF9wcmludGsoIiVkLCVkICVzICglcykgJWxsdSArICV1IFslZF0iLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgX19lbnRyeS0+cndicywgX19nZXRfc3RyKGNtZCksCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5zZWN0b3IsCisJCSAgX19lbnRyeS0+bnJfc2VjdG9yLCBfX2VudHJ5LT5lcnJvcnMpCiApOwogCiBERUNMQVJFX0VWRU5UX0NMQVNTKGJsb2NrX3JxLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaHN3YWRzcC5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaHN3YWRzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNzhiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9oc3dhZHNwLmgKQEAgLTAsMCArMSwzODQgQEAKKyN1bmRlZiBUUkFDRV9TWVNURU0KKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIGhzd2Fkc3AKKworI2lmICFkZWZpbmVkKF9UUkFDRV9IU1dBRFNQX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9UUkFDRV9IU1dBRFNQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKK3N0cnVjdCBzc3RfaHN3Oworc3RydWN0IHNzdF9oc3dfc3RyZWFtOworc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9mcmVlX3JlcTsKK3N0cnVjdCBzc3RfaHN3X2lwY192b2x1bWVfcmVxOworc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9hbGxvY19yZXE7CitzdHJ1Y3Qgc3N0X2hzd19hdWRpb19kYXRhX2Zvcm1hdF9pcGM7CitzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2luZm9fcmVwbHk7CitzdHJ1Y3Qgc3N0X2hzd19pcGNfZGV2aWNlX2NvbmZpZ19yZXE7CisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1Moc3N0X2lycSwKKworCVRQX1BST1RPKHVpbnQzMl90IHN0YXR1cywgdWludDMyX3QgbWFzayksCisKKwlUUF9BUkdTKHN0YXR1cywgbWFzayksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCXN0YXR1cwkJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCW1hc2sJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnN0YXR1cyA9IHN0YXR1czsKKwkJX19lbnRyeS0+bWFzayA9IG1hc2s7CisJKSwKKworCVRQX3ByaW50aygic3RhdHVzIDB4JTguOHggbWFzayAweCU4Ljh4IiwKKwkJKHVuc2lnbmVkIGludClfX2VudHJ5LT5zdGF0dXMsICh1bnNpZ25lZCBpbnQpX19lbnRyeS0+bWFzaykKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXJxLCBzc3RfaXJxX2J1c3ksCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgc3RhdHVzLCB1bnNpZ25lZCBpbnQgbWFzayksCisKKwlUUF9BUkdTKHN0YXR1cywgbWFzaykKKworKTsKKworREVGSU5FX0VWRU5UKHNzdF9pcnEsIHNzdF9pcnFfZG9uZSwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBzdGF0dXMsIHVuc2lnbmVkIGludCBtYXNrKSwKKworCVRQX0FSR1Moc3RhdHVzLCBtYXNrKQorCispOworCitERUNMQVJFX0VWRU5UX0NMQVNTKGlwYywKKworCVRQX1BST1RPKGNvbnN0IGNoYXIgKm5hbWUsIGludCB2YWwpLAorCisJVFBfQVJHUyhuYW1lLCB2YWwpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcoCW5hbWUsCW5hbWUJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAl2YWwJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19hc3NpZ25fc3RyKG5hbWUsIG5hbWUpOworCQlfX2VudHJ5LT52YWwgPSB2YWw7CisJKSwKKworCVRQX3ByaW50aygiJXMgMHglOC44eCIsIF9fZ2V0X3N0cihuYW1lKSwgKHVuc2lnbmVkIGludClfX2VudHJ5LT52YWwpCisKKyk7CisKK0RFRklORV9FVkVOVChpcGMsIGlwY19yZXF1ZXN0LAorCisJVFBfUFJPVE8oY29uc3QgY2hhciAqbmFtZSwgaW50IHZhbCksCisKKwlUUF9BUkdTKG5hbWUsIHZhbCkKKworKTsKKworREVGSU5FX0VWRU5UKGlwYywgaXBjX3JlcGx5LAorCisJVFBfUFJPVE8oY29uc3QgY2hhciAqbmFtZSwgaW50IHZhbCksCisKKwlUUF9BUkdTKG5hbWUsIHZhbCkKKworKTsKKworREVGSU5FX0VWRU5UKGlwYywgaXBjX3BlbmRpbmdfcmVwbHksCisKKwlUUF9QUk9UTyhjb25zdCBjaGFyICpuYW1lLCBpbnQgdmFsKSwKKworCVRQX0FSR1MobmFtZSwgdmFsKQorCispOworCitERUZJTkVfRVZFTlQoaXBjLCBpcGNfbm90aWZpY2F0aW9uLAorCisJVFBfUFJPVE8oY29uc3QgY2hhciAqbmFtZSwgaW50IHZhbCksCisKKwlUUF9BUkdTKG5hbWUsIHZhbCkKKworKTsKKworREVGSU5FX0VWRU5UKGlwYywgaXBjX2Vycm9yLAorCisJVFBfUFJPVE8oY29uc3QgY2hhciAqbmFtZSwgaW50IHZhbCksCisKKwlUUF9BUkdTKG5hbWUsIHZhbCkKKworKTsKKworREVDTEFSRV9FVkVOVF9DTEFTUyhzdHJlYW1fcG9zaXRpb24sCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBwb3MpLAorCisJVFBfQVJHUyhpZCwgcG9zKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJaWQJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAlwb3MJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmlkID0gaWQ7CisJCV9fZW50cnktPnBvcyA9IHBvczsKKwkpLAorCisJVFBfcHJpbnRrKCJpZCAlZCBwb3NpdGlvbiAweCV4IiwKKwkJKHVuc2lnbmVkIGludClfX2VudHJ5LT5pZCwgKHVuc2lnbmVkIGludClfX2VudHJ5LT5wb3MpCispOworCitERUZJTkVfRVZFTlQoc3RyZWFtX3Bvc2l0aW9uLCBzdHJlYW1fcmVhZF9wb3NpdGlvbiwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHBvcyksCisKKwlUUF9BUkdTKGlkLCBwb3MpCisKKyk7CisKK0RFRklORV9FVkVOVChzdHJlYW1fcG9zaXRpb24sIHN0cmVhbV93cml0ZV9wb3NpdGlvbiwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHBvcyksCisKKwlUUF9BUkdTKGlkLCBwb3MpCisKKyk7CisKK1RSQUNFX0VWRU5UKGhzd19zdHJlYW1fYnVmZmVyLAorCisJVFBfUFJPVE8oc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pLAorCisJVFBfQVJHUyhzdHJlYW0pLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW50LAlpZAkpCisJCV9fZmllbGQoCWludCwJcHRfYWRkcgkpCisJCV9fZmllbGQoCWludCwJbnVtX3BhZ2VzCSkKKwkJX19maWVsZCgJaW50LAlyaW5nX3NpemUJKQorCQlfX2ZpZWxkKAlpbnQsCXJpbmdfb2Zmc2V0CSkKKwkJX19maWVsZCgJaW50LAlmaXJzdF9wZm4JKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aWQgPSBzdHJlYW0tPmhvc3RfaWQ7CisJCV9fZW50cnktPnB0X2FkZHIgPSBzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19wdF9hZGRyZXNzOworCQlfX2VudHJ5LT5udW1fcGFnZXMgPSBzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ubnVtX3BhZ2VzOworCQlfX2VudHJ5LT5yaW5nX3NpemUgPSBzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19zaXplOworCQlfX2VudHJ5LT5yaW5nX29mZnNldCA9IHN0cmVhbS0+cmVxdWVzdC5yaW5naW5mby5yaW5nX29mZnNldDsKKwkJX19lbnRyeS0+Zmlyc3RfcGZuID0gc3RyZWFtLT5yZXF1ZXN0LnJpbmdpbmZvLnJpbmdfZmlyc3RfcGZuOworCSksCisKKwlUUF9wcmludGsoInN0cmVhbSAlZCByaW5nIGFkZHIgMHgleCBwYWdlcyAlZCBzaXplIDB4JXggb2Zmc2V0IDB4JXggUEZOIDB4JXgiLAorCQkoaW50KSBfX2VudHJ5LT5pZCwgIChpbnQpX19lbnRyeS0+cHRfYWRkciwKKwkJKGludClfX2VudHJ5LT5udW1fcGFnZXMsIChpbnQpX19lbnRyeS0+cmluZ19zaXplLAorCQkoaW50KV9fZW50cnktPnJpbmdfb2Zmc2V0LCAoaW50KV9fZW50cnktPmZpcnN0X3BmbikKKyk7CisKK1RSQUNFX0VWRU5UKGhzd19zdHJlYW1fYWxsb2NfcmVwbHksCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSksCisKKwlUUF9BUkdTKHN0cmVhbSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAlpbnQsCWlkCSkKKwkJX19maWVsZCgJaW50LAlzdHJlYW1faWQJKQorCQlfX2ZpZWxkKAlpbnQsCW1peGVyX2lkCSkKKwkJX19maWVsZCgJaW50LAlwZWFrMAkpCisJCV9fZmllbGQoCWludCwJcGVhazEJKQorCQlfX2ZpZWxkKAlpbnQsCXZvbDAJKQorCQlfX2ZpZWxkKAlpbnQsCXZvbDEJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aWQgPSBzdHJlYW0tPmhvc3RfaWQ7CisJCV9fZW50cnktPnN0cmVhbV9pZCA9IHN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkOworCQlfX2VudHJ5LT5taXhlcl9pZCA9IHN0cmVhbS0+cmVwbHkubWl4ZXJfaHdfaWQ7CisJCV9fZW50cnktPnBlYWswID0gc3RyZWFtLT5yZXBseS5wZWFrX21ldGVyX3JlZ2lzdGVyX2FkZHJlc3NbMF07CisJCV9fZW50cnktPnBlYWsxID0gc3RyZWFtLT5yZXBseS5wZWFrX21ldGVyX3JlZ2lzdGVyX2FkZHJlc3NbMV07CisJCV9fZW50cnktPnZvbDAgPSBzdHJlYW0tPnJlcGx5LnZvbHVtZV9yZWdpc3Rlcl9hZGRyZXNzWzBdOworCQlfX2VudHJ5LT52b2wxID0gc3RyZWFtLT5yZXBseS52b2x1bWVfcmVnaXN0ZXJfYWRkcmVzc1sxXTsKKwkpLAorCisJVFBfcHJpbnRrKCJzdHJlYW0gJWQgaHcgaWQgJWQgbWl4ZXIgJWQgcGVhayAweCV4OjB4JXggdm9sIDB4JXgsMHgleCIsCisJCShpbnQpIF9fZW50cnktPmlkLCAoaW50KSBfX2VudHJ5LT5zdHJlYW1faWQsIChpbnQpX19lbnRyeS0+bWl4ZXJfaWQsCisJCShpbnQpX19lbnRyeS0+cGVhazAsIChpbnQpX19lbnRyeS0+cGVhazEsCisJCShpbnQpX19lbnRyeS0+dm9sMCwgKGludClfX2VudHJ5LT52b2wxKQorKTsKKworVFJBQ0VfRVZFTlQoaHN3X21peGVyX2luZm9fcmVwbHksCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2luZm9fcmVwbHkgKnJlcGx5KSwKKworCVRQX0FSR1MocmVwbHkpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW50LAltaXhlcl9pZAkpCisJCV9fZmllbGQoCWludCwJcGVhazAJKQorCQlfX2ZpZWxkKAlpbnQsCXBlYWsxCSkKKwkJX19maWVsZCgJaW50LAl2b2wwCSkKKwkJX19maWVsZCgJaW50LAl2b2wxCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPm1peGVyX2lkID0gcmVwbHktPm1peGVyX2h3X2lkOworCQlfX2VudHJ5LT5wZWFrMCA9IHJlcGx5LT5wZWFrX21ldGVyX3JlZ2lzdGVyX2FkZHJlc3NbMF07CisJCV9fZW50cnktPnBlYWsxID0gcmVwbHktPnBlYWtfbWV0ZXJfcmVnaXN0ZXJfYWRkcmVzc1sxXTsKKwkJX19lbnRyeS0+dm9sMCA9IHJlcGx5LT52b2x1bWVfcmVnaXN0ZXJfYWRkcmVzc1swXTsKKwkJX19lbnRyeS0+dm9sMSA9IHJlcGx5LT52b2x1bWVfcmVnaXN0ZXJfYWRkcmVzc1sxXTsKKwkpLAorCisJVFBfcHJpbnRrKCJtaXhlciBpZCAlZCBwZWFrIDB4JXg6MHgleCB2b2wgMHgleCwweCV4IiwKKwkJKGludClfX2VudHJ5LT5taXhlcl9pZCwKKwkJKGludClfX2VudHJ5LT5wZWFrMCwgKGludClfX2VudHJ5LT5wZWFrMSwKKwkJKGludClfX2VudHJ5LT52b2wwLCAoaW50KV9fZW50cnktPnZvbDEpCispOworCitUUkFDRV9FVkVOVChoc3dfc3RyZWFtX2RhdGFfZm9ybWF0LAorCisJVFBfUFJPVE8oc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCisJCXN0cnVjdCBzc3RfaHN3X2F1ZGlvX2RhdGFfZm9ybWF0X2lwYyAqcmVxKSwKKworCVRQX0FSR1Moc3RyZWFtLCByZXEpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJdWludDMyX3QsCWlkCSkKKwkJX19maWVsZCgJdWludDMyX3QsCWZyZXF1ZW5jeQkpCisJCV9fZmllbGQoCXVpbnQzMl90LAliaXRkZXB0aAkpCisJCV9fZmllbGQoCXVpbnQzMl90LAltYXAJKQorCQlfX2ZpZWxkKAl1aW50MzJfdCwJY29uZmlnCSkKKwkJX19maWVsZCgJdWludDMyX3QsCXN0eWxlCSkKKwkJX19maWVsZCgJdWludDhfdCwJY2hfbnVtCSkKKwkJX19maWVsZCgJdWludDhfdCwJdmFsaWRfYml0CSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmlkID0gc3RyZWFtLT5ob3N0X2lkOworCQlfX2VudHJ5LT5mcmVxdWVuY3kgPSByZXEtPmZyZXF1ZW5jeTsKKwkJX19lbnRyeS0+Yml0ZGVwdGggPSByZXEtPmJpdGRlcHRoOworCQlfX2VudHJ5LT5tYXAgPSByZXEtPm1hcDsKKwkJX19lbnRyeS0+Y29uZmlnID0gcmVxLT5jb25maWc7CisJCV9fZW50cnktPnN0eWxlID0gcmVxLT5zdHlsZTsKKwkJX19lbnRyeS0+Y2hfbnVtID0gcmVxLT5jaF9udW07CisJCV9fZW50cnktPnZhbGlkX2JpdCA9IHJlcS0+dmFsaWRfYml0OworCSksCisKKwlUUF9wcmludGsoInN0cmVhbSAlZCBmcmVxICVkIGRlcHRoICVkIG1hcCAweCV4IGNvbmZpZyAweCV4IHN0eWxlIDB4JXggY2ggJWQgYml0cyAlZCIsCisJCShpbnQpIF9fZW50cnktPmlkLCAodWludDMyX3QpX19lbnRyeS0+ZnJlcXVlbmN5LAorCQkodWludDMyX3QpX19lbnRyeS0+Yml0ZGVwdGgsICh1aW50MzJfdClfX2VudHJ5LT5tYXAsCisJCSh1aW50MzJfdClfX2VudHJ5LT5jb25maWcsICh1aW50MzJfdClfX2VudHJ5LT5zdHlsZSwKKwkJKHVpbnQ4X3QpX19lbnRyeS0+Y2hfbnVtLCAodWludDhfdClfX2VudHJ5LT52YWxpZF9iaXQpCispOworCitUUkFDRV9FVkVOVChoc3dfc3RyZWFtX2FsbG9jX3JlcXVlc3QsCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwkJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9hbGxvY19yZXEgKnJlcSksCisKKwlUUF9BUkdTKHN0cmVhbSwgcmVxKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCXVpbnQzMl90LAlpZAkpCisJCV9fZmllbGQoCXVpbnQ4X3QsCXBhdGhfaWQJKQorCQlfX2ZpZWxkKAl1aW50OF90LAlzdHJlYW1fdHlwZQkpCisJCV9fZmllbGQoCXVpbnQ4X3QsCWZvcm1hdF9pZAkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5pZCA9IHN0cmVhbS0+aG9zdF9pZDsKKwkJX19lbnRyeS0+cGF0aF9pZCA9IHJlcS0+cGF0aF9pZDsKKwkJX19lbnRyeS0+c3RyZWFtX3R5cGUgPSByZXEtPnN0cmVhbV90eXBlOworCQlfX2VudHJ5LT5mb3JtYXRfaWQgPSByZXEtPmZvcm1hdF9pZDsKKwkpLAorCisJVFBfcHJpbnRrKCJzdHJlYW0gJWQgcGF0aCAlZCB0eXBlICVkIGZvcm1hdCAlZCIsCisJCShpbnQpIF9fZW50cnktPmlkLCAodWludDhfdClfX2VudHJ5LT5wYXRoX2lkLAorCQkodWludDhfdClfX2VudHJ5LT5zdHJlYW1fdHlwZSwgKHVpbnQ4X3QpX19lbnRyeS0+Zm9ybWF0X2lkKQorKTsKKworVFJBQ0VfRVZFTlQoaHN3X3N0cmVhbV9mcmVlX3JlcSwKKworCVRQX1BST1RPKHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCQlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2ZyZWVfcmVxICpyZXEpLAorCisJVFBfQVJHUyhzdHJlYW0sIHJlcSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAlpbnQsCWlkCSkKKwkJX19maWVsZCgJaW50LAlzdHJlYW1faWQJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aWQgPSBzdHJlYW0tPmhvc3RfaWQ7CisJCV9fZW50cnktPnN0cmVhbV9pZCA9IHJlcS0+c3RyZWFtX2lkOworCSksCisKKwlUUF9wcmludGsoInN0cmVhbSAlZCBodyBpZCAlZCIsCisJCShpbnQpIF9fZW50cnktPmlkLCAoaW50KSBfX2VudHJ5LT5zdHJlYW1faWQpCispOworCitUUkFDRV9FVkVOVChoc3dfdm9sdW1lX3JlcSwKKworCVRQX1BST1RPKHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCQlzdHJ1Y3Qgc3N0X2hzd19pcGNfdm9sdW1lX3JlcSAqcmVxKSwKKworCVRQX0FSR1Moc3RyZWFtLCByZXEpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW50LAlpZAkpCisJCV9fZmllbGQoCXVpbnQzMl90LAljaGFubmVsCSkKKwkJX19maWVsZCgJdWludDMyX3QsCXRhcmdldF92b2x1bWUJKQorCQlfX2ZpZWxkKAl1aW50NjRfdCwJY3VydmVfZHVyYXRpb24JKQorCQlfX2ZpZWxkKAl1aW50MzJfdCwJY3VydmVfdHlwZQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5pZCA9IHN0cmVhbS0+aG9zdF9pZDsKKwkJX19lbnRyeS0+Y2hhbm5lbCA9IHJlcS0+Y2hhbm5lbDsKKwkJX19lbnRyeS0+dGFyZ2V0X3ZvbHVtZSA9IHJlcS0+dGFyZ2V0X3ZvbHVtZTsKKwkJX19lbnRyeS0+Y3VydmVfZHVyYXRpb24gPSByZXEtPmN1cnZlX2R1cmF0aW9uOworCQlfX2VudHJ5LT5jdXJ2ZV90eXBlID0gcmVxLT5jdXJ2ZV90eXBlOworCSksCisKKwlUUF9wcmludGsoInN0cmVhbSAlZCBjaGFuIDB4JXggdm9sICVkIGR1cmF0aW9uICVsbHUgdHlwZSAlZCIsCisJCShpbnQpIF9fZW50cnktPmlkLCAodWludDMyX3QpIF9fZW50cnktPmNoYW5uZWwsCisJCSh1aW50MzJfdClfX2VudHJ5LT50YXJnZXRfdm9sdW1lLAorCQkodWludDY0X3QpX19lbnRyeS0+Y3VydmVfZHVyYXRpb24sCisJCSh1aW50MzJfdClfX2VudHJ5LT5jdXJ2ZV90eXBlKQorKTsKKworVFJBQ0VfRVZFTlQoaHN3X2RldmljZV9jb25maWdfcmVxLAorCisJVFBfUFJPVE8oc3RydWN0IHNzdF9oc3dfaXBjX2RldmljZV9jb25maWdfcmVxICpyZXEpLAorCisJVFBfQVJHUyhyZXEpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJdWludDMyX3QsCXNzcAkpCisJCV9fZmllbGQoCXVpbnQzMl90LAljbG9ja19mcmVxCSkKKwkJX19maWVsZCgJdWludDMyX3QsCW1vZGUJKQorCQlfX2ZpZWxkKAl1aW50MTZfdCwJY2xvY2tfZGl2aWRlcgkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5zc3AgPSByZXEtPnNzcF9pbnRlcmZhY2U7CisJCV9fZW50cnktPmNsb2NrX2ZyZXEgPSByZXEtPmNsb2NrX2ZyZXF1ZW5jeTsKKwkJX19lbnRyeS0+bW9kZSA9IHJlcS0+bW9kZTsKKwkJX19lbnRyeS0+Y2xvY2tfZGl2aWRlciA9IHJlcS0+Y2xvY2tfZGl2aWRlcjsKKwkpLAorCisJVFBfcHJpbnRrKCJTU1AgJWQgRnJlcSAlZCBtb2RlICVkIGRpdiAlZCIsCisJCSh1aW50MzJfdClfX2VudHJ5LT5zc3AsCisJCSh1aW50MzJfdClfX2VudHJ5LT5jbG9ja19mcmVxLCAodWludDMyX3QpX19lbnRyeS0+bW9kZSwKKwkJKHVpbnQzMl90KV9fZW50cnktPmNsb2NrX2RpdmlkZXIpCispOworCisjZW5kaWYgLyogX1RSQUNFX0hTV0FEU1BfSCAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2ludGVsLXNzdC5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaW50ZWwtc3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjNzJkMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2ludGVsLXNzdC5oCkBAIC0wLDAgKzEsMTQ4IEBACisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX1NZU1RFTSBpbnRlbC1zc3QKKworI2lmICFkZWZpbmVkKF9UUkFDRV9JTlRFTF9TU1RfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX0lOVEVMX1NTVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorCitERUNMQVJFX0VWRU5UX0NMQVNTKHNzdF9pcGNfbXNnLAorCisJVFBfUFJPVE8odW5zaWduZWQgaW50IHZhbCksCisKKwlUUF9BUkdTKHZhbCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCXZhbAkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+dmFsID0gdmFsOworCSksCisKKwlUUF9wcmludGsoIjB4JTguOHgiLCAodW5zaWduZWQgaW50KV9fZW50cnktPnZhbCkKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXBjX21zZywgc3N0X2lwY19tc2dfdHgsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgdmFsKSwKKworCVRQX0FSR1ModmFsKQorCispOworCitERUZJTkVfRVZFTlQoc3N0X2lwY19tc2csIHNzdF9pcGNfbXNnX3J4LAorCisJVFBfUFJPVE8odW5zaWduZWQgaW50IHZhbCksCisKKwlUUF9BUkdTKHZhbCkKKworKTsKKworREVDTEFSRV9FVkVOVF9DTEFTUyhzc3RfaXBjX21haWxib3gsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgdmFsKSwKKworCVRQX0FSR1Mob2Zmc2V0LCB2YWwpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAlvZmZzZXQJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAl2YWwJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPm9mZnNldCA9IG9mZnNldDsKKwkJX19lbnRyeS0+dmFsID0gdmFsOworCSksCisKKwlUUF9wcmludGsoIiAweCU0LjR4ID0gMHglOC44eCIsCisJCSh1bnNpZ25lZCBpbnQpX19lbnRyeS0+b2Zmc2V0LCAodW5zaWduZWQgaW50KV9fZW50cnktPnZhbCkKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXBjX21haWxib3gsIHNzdF9pcGNfaW5ib3hfcmRhdGEsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgdmFsKSwKKworCVRQX0FSR1Mob2Zmc2V0LCB2YWwpCisKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXBjX21haWxib3gsIHNzdF9pcGNfaW5ib3hfd2RhdGEsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgdmFsKSwKKworCVRQX0FSR1Mob2Zmc2V0LCB2YWwpCisKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXBjX21haWxib3gsIHNzdF9pcGNfb3V0Ym94X3JkYXRhLAorCisJVFBfUFJPVE8odW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHZhbCksCisKKwlUUF9BUkdTKG9mZnNldCwgdmFsKQorCispOworCitERUZJTkVfRVZFTlQoc3N0X2lwY19tYWlsYm94LCBzc3RfaXBjX291dGJveF93ZGF0YSwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCB2YWwpLAorCisJVFBfQVJHUyhvZmZzZXQsIHZhbCkKKworKTsKKworREVDTEFSRV9FVkVOVF9DTEFTUyhzc3RfaXBjX21haWxib3hfaW5mbywKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBzaXplKSwKKworCVRQX0FSR1Moc2l6ZSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCXNpemUJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnNpemUgPSBzaXplOworCSksCisKKwlUUF9wcmludGsoIk1haWxib3ggYnl0ZXMgMHglOC44eCIsICh1bnNpZ25lZCBpbnQpX19lbnRyeS0+c2l6ZSkKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXBjX21haWxib3hfaW5mbywgc3N0X2lwY19pbmJveF9yZWFkLAorCisJVFBfUFJPVE8odW5zaWduZWQgaW50IHNpemUpLAorCisJVFBfQVJHUyhzaXplKQorCispOworCitERUZJTkVfRVZFTlQoc3N0X2lwY19tYWlsYm94X2luZm8sIHNzdF9pcGNfaW5ib3hfd3JpdGUsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgc2l6ZSksCisKKwlUUF9BUkdTKHNpemUpCisKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXBjX21haWxib3hfaW5mbywgc3N0X2lwY19vdXRib3hfcmVhZCwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBzaXplKSwKKworCVRQX0FSR1Moc2l6ZSkKKworKTsKKworREVGSU5FX0VWRU5UKHNzdF9pcGNfbWFpbGJveF9pbmZvLCBzc3RfaXBjX291dGJveF93cml0ZSwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBzaXplKSwKKworCVRQX0FSR1Moc2l6ZSkKKworKTsKKworI2VuZGlmIC8qIF9UUkFDRV9TU1RfSCAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3Bvd2VyLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9wb3dlci5oCmluZGV4IGU1YmY5YTcuLjlhN2UwOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3Bvd2VyLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvcG93ZXIuaApAQCAtNDA3LDggKzQwNyw4IEBACiAJVFBfcHJpbnRrKCJkZXZpY2U9JXMgdHlwZT0lcyBuZXdfdmFsdWU9JWQiLAogCQkgIF9fZ2V0X3N0cihuYW1lKSwKIAkJICBfX3ByaW50X3N5bWJvbGljKF9fZW50cnktPnR5cGUsCi0JCQl7IERFVl9QTV9RT1NfTEFURU5DWSwJIkRFVl9QTV9RT1NfTEFURU5DWSIgfSwKLQkJCXsgREVWX1BNX1FPU19GTEFHUywJIkRFVl9QTV9RT1NfRkxBR1MiIH0pLAorCQkJeyBERVZfUE1fUU9TX1JFU1VNRV9MQVRFTkNZLCAiREVWX1BNX1FPU19SRVNVTUVfTEFURU5DWSIgfSwKKwkJCXsgREVWX1BNX1FPU19GTEFHUywgIkRFVl9QTV9RT1NfRkxBR1MiIH0pLAogCQkgIF9fZW50cnktPm5ld192YWx1ZSkKICk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9LYnVpbGQgYi9pbmNsdWRlL3VhcGkvbGludXgvS2J1aWxkCmluZGV4IDNjZTI1YjUuLjY5Mjk1NzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9LYnVpbGQKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L0tidWlsZApAQCAtMTM5LDYgKzEzOSw3IEBACiBoZWFkZXIteSArPSBoaWRkZXYuaAogaGVhZGVyLXkgKz0gaGlkcmF3LmgKIGhlYWRlci15ICs9IGhwZXQuaAoraGVhZGVyLXkgKz0gaHlwZXJ2LmgKIGhlYWRlci15ICs9IGh5c2RuX2lmLmgKIGhlYWRlci15ICs9IGkyYy1kZXYuaAogaGVhZGVyLXkgKz0gaTJjLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9oeXBlcnYuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9oeXBlcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmViN2M5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2h5cGVydi5oCkBAIC0wLDAgKzEsMzkwIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgTWljcm9zb2Z0IENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCisgKiBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiBBdXRob3JzOgorICogICBIYWl5YW5nIFpoYW5nIDxoYWl5YW5nekBtaWNyb3NvZnQuY29tPgorICogICBIYW5rIEphbnNzZW4gIDxoamFuc3NlbkBtaWNyb3NvZnQuY29tPgorICogICBLLiBZLiBTcmluaXZhc2FuIDxreXNAbWljcm9zb2Z0LmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBfVUFQSV9IWVBFUlZfSAorI2RlZmluZSBfVUFQSV9IWVBFUlZfSAorCisjaW5jbHVkZSA8bGludXgvdXVpZC5oPgorCisvKgorICogRnJhbWV3b3JrIHZlcnNpb24gZm9yIHV0aWwgc2VydmljZXMuCisgKi8KKyNkZWZpbmUgVVRJTF9GV19NSU5PUiAgMAorCisjZGVmaW5lIFVUSUxfV1MySzhfRldfTUFKT1IgIDEKKyNkZWZpbmUgVVRJTF9XUzJLOF9GV19WRVJTSU9OICAgICAoVVRJTF9XUzJLOF9GV19NQUpPUiA8PCAxNiB8IFVUSUxfRldfTUlOT1IpCisKKyNkZWZpbmUgVVRJTF9GV19NQUpPUiAgMworI2RlZmluZSBVVElMX0ZXX1ZFUlNJT04gICAgIChVVElMX0ZXX01BSk9SIDw8IDE2IHwgVVRJTF9GV19NSU5PUikKKworCisvKgorICogSW1wbGVtZW50YXRpb24gb2YgaG9zdCBjb250cm9sbGVkIHNuYXBzaG90IG9mIHRoZSBndWVzdC4KKyAqLworCisjZGVmaW5lIFZTU19PUF9SRUdJU1RFUiAxMjgKKworZW51bSBodl92c3Nfb3AgeworCVZTU19PUF9DUkVBVEUgPSAwLAorCVZTU19PUF9ERUxFVEUsCisJVlNTX09QX0hPVF9CQUNLVVAsCisJVlNTX09QX0dFVF9ETV9JTkZPLAorCVZTU19PUF9CVV9DT01QTEVURSwKKwkvKgorCSAqIEZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCB3aXRoIElDIHZlcnNpb24gPj0gNS4wCisJICovCisJVlNTX09QX0ZSRUVaRSwgLyogRnJlZXplIHRoZSBmaWxlIHN5c3RlbXMgaW4gdGhlIFZNICovCisJVlNTX09QX1RIQVcsIC8qIFVuZnJlZXplIHRoZSBmaWxlIHN5c3RlbXMgKi8KKwlWU1NfT1BfQVVUT19SRUNPVkVSLAorCVZTU19PUF9DT1VOVCAvKiBOdW1iZXIgb2Ygb3BlcmF0aW9ucywgbXVzdCBiZSBsYXN0ICovCit9OworCisKKy8qCisgKiBIZWFkZXIgZm9yIGFsbCBWU1MgbWVzc2FnZXMuCisgKi8KK3N0cnVjdCBodl92c3NfaGRyIHsKKwlfX3U4IG9wZXJhdGlvbjsKKwlfX3U4IHJlc2VydmVkWzddOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisvKgorICogRmxhZyB2YWx1ZXMgZm9yIHRoZSBodl92c3NfY2hlY2tfZmVhdHVyZS4gTGludXggc3VwcG9ydHMgb25seQorICogb25lIHZhbHVlLgorICovCisjZGVmaW5lIFZTU19IQlVfTk9fQVVUT19SRUNPVkVSWQkweDAwMDAwMDA1CisKK3N0cnVjdCBodl92c3NfY2hlY2tfZmVhdHVyZSB7CisJX191MzIgZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaHZfdnNzX2NoZWNrX2RtX2luZm8geworCV9fdTMyIGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGh2X3Zzc19tc2cgeworCXVuaW9uIHsKKwkJc3RydWN0IGh2X3Zzc19oZHIgdnNzX2hkcjsKKwkJaW50IGVycm9yOworCX07CisJdW5pb24geworCQlzdHJ1Y3QgaHZfdnNzX2NoZWNrX2ZlYXR1cmUgdnNzX2NmOworCQlzdHJ1Y3QgaHZfdnNzX2NoZWNrX2RtX2luZm8gZG1faW5mbzsKKwl9OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIGEgaG9zdCB0byBndWVzdCBjb3B5IGZhY2lsaXR5LgorICovCisKKyNkZWZpbmUgRkNPUFlfVkVSU0lPTl8wIDAKKyNkZWZpbmUgRkNPUFlfQ1VSUkVOVF9WRVJTSU9OIEZDT1BZX1ZFUlNJT05fMAorI2RlZmluZSBXX01BWF9QQVRIIDI2MAorCitlbnVtIGh2X2Zjb3B5X29wIHsKKwlTVEFSVF9GSUxFX0NPUFkgPSAwLAorCVdSSVRFX1RPX0ZJTEUsCisJQ09NUExFVEVfRkNPUFksCisJQ0FOQ0VMX0ZDT1BZLAorfTsKKworc3RydWN0IGh2X2Zjb3B5X2hkciB7CisJX191MzIgb3BlcmF0aW9uOworCXV1aWRfbGUgc2VydmljZV9pZDA7IC8qIGN1cnJlbnRseSB1bnVzZWQgKi8KKwl1dWlkX2xlIHNlcnZpY2VfaWQxOyAvKiBjdXJyZW50bHkgdW51c2VkICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIE9WRVJfV1JJVEUJMHgxCisjZGVmaW5lIENSRUFURV9QQVRICTB4MgorCitzdHJ1Y3QgaHZfc3RhcnRfZmNvcHkgeworCXN0cnVjdCBodl9mY29weV9oZHIgaGRyOworCV9fdTE2IGZpbGVfbmFtZVtXX01BWF9QQVRIXTsKKwlfX3UxNiBwYXRoX25hbWVbV19NQVhfUEFUSF07CisJX191MzIgY29weV9mbGFnczsKKwlfX3U2NCBmaWxlX3NpemU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKgorICogVGhlIGZpbGUgaXMgY2h1bmtlZCBpbnRvIGZyYWdtZW50cy4KKyAqLworI2RlZmluZSBEQVRBX0ZSQUdNRU5UCSg2ICogMTAyNCkKKworc3RydWN0IGh2X2RvX2Zjb3B5IHsKKwlzdHJ1Y3QgaHZfZmNvcHlfaGRyIGhkcjsKKwlfX3U2NAlvZmZzZXQ7CisJX191MzIJc2l6ZTsKKwlfX3U4CWRhdGFbREFUQV9GUkFHTUVOVF07Cit9OworCisvKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgSHlwZXJWIGtleSB2YWx1ZSBwYWlyIChLVlApIGZ1bmN0aW9uYWxpdHkgZm9yIExpbnV4LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIE5vdmVsbCwgSW5jLgorICogQXV0aG9yIDogSy4gWS4gU3Jpbml2YXNhbiA8a3NyaW5pdmFzYW5Abm92ZWxsLmNvbT4KKyAqCisgKi8KKworLyoKKyAqIE1heGltdW0gdmFsdWUgc2l6ZSAtIHVzZWQgZm9yIGJvdGgga2V5IG5hbWVzIGFuZCB2YWx1ZSBkYXRhLCBhbmQgaW5jbHVkZXMKKyAqIGFueSBhcHBsaWNhYmxlIE5VTEwgdGVybWluYXRvcnMuCisgKgorICogTm90ZTogIFRoaXMgbGltaXQgaXMgc29tZXdoYXQgYXJiaXRyYXJ5LCBidXQgZmFsbHMgZWFzaWx5IHdpdGhpbiB3aGF0IGlzCisgKiBzdXBwb3J0ZWQgZm9yIGFsbCBuYXRpdmUgZ3Vlc3RzIChiYWNrIHRvIFdpbiAyMDAwKSBhbmQgd2hhdCBpcyByZWFzb25hYmxlCisgKiBmb3IgdGhlIElDIEtWUCBleGNoYW5nZSBmdW5jdGlvbmFsaXR5LiAgTm90ZSB0aGF0IFdpbmRvd3MgTWUvOTgvOTUgYXJlCisgKiBsaW1pdGVkIHRvIDI1NSBjaGFyYWN0ZXIga2V5IG5hbWVzLgorICoKKyAqIE1TRE4gcmVjb21tZW5kcyBub3Qgc3RvcmluZyBkYXRhIHZhbHVlcyBsYXJnZXIgdGhhbiAyMDQ4IGJ5dGVzIGluIHRoZQorICogcmVnaXN0cnkuCisgKgorICogTm90ZTogIFRoaXMgdmFsdWUgaXMgdXNlZCBpbiBkZWZpbmluZyB0aGUgS1ZQIGV4Y2hhbmdlIG1lc3NhZ2UgLSB0aGlzIHZhbHVlCisgKiBjYW5ub3QgYmUgbW9kaWZpZWQgd2l0aG91dCBhZmZlY3RpbmcgdGhlIG1lc3NhZ2Ugc2l6ZSBhbmQgY29tcGF0aWJpbGl0eS4KKyAqLworCisvKgorICogYnl0ZXMsIGluY2x1ZGluZyBhbnkgbnVsbCB0ZXJtaW5hdG9ycworICovCisjZGVmaW5lIEhWX0tWUF9FWENIQU5HRV9NQVhfVkFMVUVfU0laRSAgICAgICAgICAoMjA0OCkKKworCisvKgorICogTWF4aW11bSBrZXkgc2l6ZSAtIHRoZSByZWdpc3RyeSBsaW1pdCBmb3IgdGhlIGxlbmd0aCBvZiBhbiBlbnRyeSBuYW1lCisgKiBpcyAyNTYgY2hhcmFjdGVycywgaW5jbHVkaW5nIHRoZSBudWxsIHRlcm1pbmF0b3IKKyAqLworCisjZGVmaW5lIEhWX0tWUF9FWENIQU5HRV9NQVhfS0VZX1NJWkUgICAgICAgICAgICAoNTEyKQorCisvKgorICogSW4gTGludXgsIHdlIGltcGxlbWVudCB0aGUgS1ZQIGZ1bmN0aW9uYWxpdHkgaW4gdHdvIGNvbXBvbmVudHM6CisgKiAxKSBUaGUga2VybmVsIGNvbXBvbmVudCB3aGljaCBpcyBwYWNrYWdlZCBhcyBwYXJ0IG9mIHRoZSBodl91dGlscyBkcml2ZXIKKyAqIGlzIHJlc3BvbnNpYmxlIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIGhvc3QgYW5kIHJlc3BvbnNpYmxlIGZvcgorICogaW1wbGVtZW50aW5nIHRoZSBob3N0L2d1ZXN0IHByb3RvY29sLiAyKSBBIHVzZXIgbGV2ZWwgZGFlbW9uIHRoYXQgaXMKKyAqIHJlc3BvbnNpYmxlIGZvciBkYXRhIGdhdGhlcmluZy4KKyAqCisgKiBIb3N0L0d1ZXN0IFByb3RvY29sOiBUaGUgaG9zdCBpdGVyYXRlcyBvdmVyIGFuIGluZGV4IGFuZCBleHBlY3RzIHRoZSBndWVzdAorICogdG8gYXNzaWduIGEga2V5IG5hbWUgdG8gdGhlIGluZGV4IGFuZCBhbHNvIHJldHVybiB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB0bworICogdGhlIGtleS4gVGhlIGhvc3Qgd2lsbCBoYXZlIGF0bW9zdCBvbmUgS1ZQIHRyYW5zYWN0aW9uIG91dHN0YW5kaW5nIGF0IGFueQorICogZ2l2ZW4gcG9pbnQgaW4gdGltZS4gVGhlIGhvc3Qgc2lkZSBpdGVyYXRpb24gc3RvcHMgd2hlbiB0aGUgZ3Vlc3QgcmV0dXJucworICogYW4gZXJyb3IuIE1pY3Jvc29mdCBoYXMgc3BlY2lmaWVkIHRoZSBmb2xsb3dpbmcgbWFwcGluZyBvZiBrZXkgbmFtZXMgdG8KKyAqIGhvc3Qgc3BlY2lmaWVkIGluZGV4OgorICoKKyAqCUluZGV4CQlLZXkgTmFtZQorICoJMAkJRnVsbHlRdWFsaWZpZWREb21haW5OYW1lCisgKgkxCQlJbnRlZ3JhdGlvblNlcnZpY2VzVmVyc2lvbgorICoJMgkJTmV0d29ya0FkZHJlc3NJUHY0CisgKgkzCQlOZXR3b3JrQWRkcmVzc0lQdjYKKyAqCTQJCU9TQnVpbGROdW1iZXIKKyAqCTUJCU9TTmFtZQorICoJNgkJT1NNYWpvclZlcnNpb24KKyAqCTcJCU9TTWlub3JWZXJzaW9uCisgKgk4CQlPU1ZlcnNpb24KKyAqCTkJCVByb2Nlc3NvckFyY2hpdGVjdHVyZQorICoKKyAqIFRoZSBXaW5kb3dzIGhvc3QgZXhwZWN0cyB0aGUgS2V5IE5hbWUgYW5kIEtleSBWYWx1ZSB0byBiZSBlbmNvZGVkIGluIHV0ZjE2LgorICoKKyAqIEd1ZXN0IEtlcm5lbC9LVlAgRGFlbW9uIFByb3RvY29sOiBBcyBub3RlZCBlYXJsaWVyLCB3ZSBpbXBsZW1lbnQgYWxsIG9mIHRoZQorICogZGF0YSBnYXRoZXJpbmcgZnVuY3Rpb25hbGl0eSBpbiBhIHVzZXIgbW9kZSBkYWVtb24uIFRoZSB1c2VyIGxldmVsIGRhZW1vbgorICogaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgYmluZGluZyB0aGUga2V5IG5hbWUgdG8gdGhlIGluZGV4IGFzIHdlbGwuIFRoZQorICoga2VybmVsIGFuZCB1c2VyLWxldmVsIGRhZW1vbiBjb21tdW5pY2F0ZSB1c2luZyBhIGNvbm5lY3RvciBjaGFubmVsLgorICoKKyAqIFRoZSB1c2VyIG1vZGUgY29tcG9uZW50IGZpcnN0IHJlZ2lzdGVycyB3aXRoIHRoZQorICogdGhlIGtlcm5lbCBjb21wb25lbnQuIFN1YnNlcXVlbnRseSwgdGhlIGtlcm5lbCBjb21wb25lbnQgcmVxdWVzdHMsIGRhdGEKKyAqIGZvciB0aGUgc3BlY2lmaWVkIGtleXMuIEluIHJlc3BvbnNlIHRvIHRoaXMgbWVzc2FnZSB0aGUgdXNlciBtb2RlIGNvbXBvbmVudAorICogZmlsbHMgaW4gdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBrZXkuIFdlIG92ZXJsb2FkIHRoZQorICogc2VxdWVuY2UgZmllbGQgaW4gdGhlIGNuX21zZyBoZWFkZXIgdG8gZGVmaW5lIG91ciBLVlAgbWVzc2FnZSB0eXBlcy4KKyAqCisgKgorICogVGhlIGtlcm5lbCBjb21wb25lbnQgc2ltcGx5IGFjdHMgYXMgYSBjb25kdWl0IGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlCisgKiBXaW5kb3dzIGhvc3QgYW5kIHRoZSB1c2VyLWxldmVsIGRhZW1vbi4gVGhlIGtlcm5lbCBjb21wb25lbnQgcGFzc2VzIHVwIHRoZQorICogaW5kZXggcmVjZWl2ZWQgZnJvbSB0aGUgSG9zdCB0byB0aGUgdXNlci1sZXZlbCBkYWVtb24uIElmIHRoZSBpbmRleCBpcworICogdmFsaWQgKHN1cHBvcnRlZCksIHRoZSBjb3JyZXNwb25kaW5nIGtleSBhcyB3ZWxsIGFzIGl0cworICogdmFsdWUgKGJvdGggYXJlIHN0cmluZ3MpIGlzIHJldHVybmVkLiBJZiB0aGUgaW5kZXggaXMgaW52YWxpZAorICogKG5vdCBzdXBwb3J0ZWQpLCBhIE5VTEwga2V5IHN0cmluZyBpcyByZXR1cm5lZC4KKyAqLworCisKKy8qCisgKiBSZWdpc3RyeSB2YWx1ZSB0eXBlcy4KKyAqLworCisjZGVmaW5lIFJFR19TWiAxCisjZGVmaW5lIFJFR19VMzIgNAorI2RlZmluZSBSRUdfVTY0IDgKKworLyoKKyAqIEFzIHdlIGxvb2sgYXQgZXhwYW5kaW5nIHRoZSBLVlAgZnVuY3Rpb25hbGl0eSB0byBpbmNsdWRlCisgKiBJUCBpbmplY3Rpb24gZnVuY3Rpb25hbGl0eSwgd2UgbmVlZCB0byBtYWludGFpbiBiaW5hcnkKKyAqIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBkYWVtb25zLgorICoKKyAqIFRoZSBLVlAgb3Bjb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgaG9zdCBhbmQgaXQgd2FzIHVuZm9ydHVuYXRlCisgKiB0aGF0IEkgY2hvc2UgdG8gdHJlYXQgdGhlIHJlZ2lzdHJhdGlvbiBvcGVyYXRpb24gYXMgcGFydCBvZiB0aGUKKyAqIEtWUCBvcGVyYXRpb25zIGRlZmluZWQgYnkgdGhlIGhvc3QuCisgKiBIZXJlIGlzIHRoZSBsZXZlbCBvZiBjb21wYXRpYmlsaXR5CisgKiAoYmV0d2VlbiB0aGUgdXNlciBsZXZlbCBkYWVtb24gYW5kIHRoZSBrZXJuZWwgS1ZQIGRyaXZlcikgdGhhdCB3ZQorICogd2lsbCBpbXBsZW1lbnQ6CisgKgorICogQW4gb2xkZXIgZGFlbW9uIHdpbGwgYWx3YXlzIGJlIHN1cHBvcnRlZCBvbiBhIG5ld2VyIGRyaXZlci4KKyAqIEEgZ2l2ZW4gdXNlciBsZXZlbCBkYWVtb24gd2lsbCByZXF1aXJlIGEgbWluaW1hbCB2ZXJzaW9uIG9mIHRoZQorICoga2VybmVsIGRyaXZlci4KKyAqIElmIHdlIGNhbm5vdCBoYW5kbGUgdGhlIHZlcnNpb24gZGlmZmVyZW5jZXMsIHdlIHdpbGwgZmFpbCBncmFjZWZ1bGx5CisgKiAodGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgaGF2ZSBhIHVzZXIgbGV2ZWwgZGFlbW9uIHRoYXQgaXMgbW9yZQorICogYWR2YW5jZWQgdGhhbiB0aGUgS1ZQIGRyaXZlci4KKyAqCisgKiBXZSB3aWxsIHVzZSB2YWx1ZXMgdXNlZCBpbiB0aGlzIGhhbmRzaGFrZSBmb3IgZGV0ZXJtaW5pbmcgaWYgd2UgaGF2ZQorICogd29ya2FibGUgdXNlciBsZXZlbCBkYWVtb24gYW5kIHRoZSBrZXJuZWwgZHJpdmVyLiBXZSBiZWdpbiBieSB0YWtpbmcgdGhlCisgKiByZWdpc3RyYXRpb24gb3Bjb2RlIG91dCBvZiB0aGUgS1ZQIG9wY29kZSBuYW1lc3BhY2UuIFdlIHdpbGwgaG93ZXZlciwKKyAqIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgZXhpc3RpbmcgdXNlci1sZXZlbCBkYWVtb24gY29kZS4KKyAqLworCisvKgorICogRGFlbW9uIGNvZGUgbm90IHN1cHBvcnRpbmcgSVAgaW5qZWN0aW9uIChsZWdhY3kgZGFlbW9uKS4KKyAqLworCisjZGVmaW5lIEtWUF9PUF9SRUdJU1RFUgk0CisKKy8qCisgKiBEYWVtb24gY29kZSBzdXBwb3J0aW5nIElQIGluamVjdGlvbi4KKyAqIFRoZSBLVlAgb3Bjb2RlIGZpZWxkIGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgdGhlCisgKiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb247IHNvIGRlZmluZSBhIG5hbWVzcGFjZSB0aGF0CisgKiB3aWxsIGJlIGRpc3RpbmN0IGZyb20gdGhlIGhvc3QgZGVmaW5lZCBLVlAgb3Bjb2RlLgorICovCisKKyNkZWZpbmUgS1ZQX09QX1JFR0lTVEVSMSAxMDAKKworZW51bSBodl9rdnBfZXhjaGdfb3AgeworCUtWUF9PUF9HRVQgPSAwLAorCUtWUF9PUF9TRVQsCisJS1ZQX09QX0RFTEVURSwKKwlLVlBfT1BfRU5VTUVSQVRFLAorCUtWUF9PUF9HRVRfSVBfSU5GTywKKwlLVlBfT1BfU0VUX0lQX0lORk8sCisJS1ZQX09QX0NPVU5UIC8qIE51bWJlciBvZiBvcGVyYXRpb25zLCBtdXN0IGJlIGxhc3QuICovCit9OworCitlbnVtIGh2X2t2cF9leGNoZ19wb29sIHsKKwlLVlBfUE9PTF9FWFRFUk5BTCA9IDAsCisJS1ZQX1BPT0xfR1VFU1QsCisJS1ZQX1BPT0xfQVVUTywKKwlLVlBfUE9PTF9BVVRPX0VYVEVSTkFMLAorCUtWUF9QT09MX0FVVE9fSU5URVJOQUwsCisJS1ZQX1BPT0xfQ09VTlQgLyogTnVtYmVyIG9mIHBvb2xzLCBtdXN0IGJlIGxhc3QuICovCit9OworCisvKgorICogU29tZSBIeXBlci1WIHN0YXR1cyBjb2Rlcy4KKyAqLworCisjZGVmaW5lIEhWX1NfT0sJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBIVl9FX0ZBSUwJCQkweDgwMDA0MDA1CisjZGVmaW5lIEhWX1NfQ09OVAkJCTB4ODAwNzAxMDMKKyNkZWZpbmUgSFZfRVJST1JfTk9UX1NVUFBPUlRFRAkJMHg4MDA3MDAzMgorI2RlZmluZSBIVl9FUlJPUl9NQUNISU5FX0xPQ0tFRAkJMHg4MDA3MDRGNworI2RlZmluZSBIVl9FUlJPUl9ERVZJQ0VfTk9UX0NPTk5FQ1RFRAkweDgwMDcwNDhGCisjZGVmaW5lIEhWX0lOVkFMSURBUkcJCQkweDgwMDcwMDU3CisjZGVmaW5lIEhWX0dVSURfTk9URk9VTkQJCTB4ODAwNDEwMDIKKworI2RlZmluZSBBRERSX0ZBTUlMWV9OT05FCTB4MDAKKyNkZWZpbmUgQUREUl9GQU1JTFlfSVBWNAkweDAxCisjZGVmaW5lIEFERFJfRkFNSUxZX0lQVjYJMHgwMgorCisjZGVmaW5lIE1BWF9BREFQVEVSX0lEX1NJWkUJMTI4CisjZGVmaW5lIE1BWF9JUF9BRERSX1NJWkUJMTAyNAorI2RlZmluZSBNQVhfR0FURVdBWV9TSVpFCTUxMgorCisKK3N0cnVjdCBodl9rdnBfaXBhZGRyX3ZhbHVlIHsKKwlfX3UxNglhZGFwdGVyX2lkW01BWF9BREFQVEVSX0lEX1NJWkVdOworCV9fdTgJYWRkcl9mYW1pbHk7CisJX191OAlkaGNwX2VuYWJsZWQ7CisJX191MTYJaXBfYWRkcltNQVhfSVBfQUREUl9TSVpFXTsKKwlfX3UxNglzdWJfbmV0W01BWF9JUF9BRERSX1NJWkVdOworCV9fdTE2CWdhdGVfd2F5W01BWF9HQVRFV0FZX1NJWkVdOworCV9fdTE2CWRuc19hZGRyW01BWF9JUF9BRERSX1NJWkVdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCitzdHJ1Y3QgaHZfa3ZwX2hkciB7CisJX191OCBvcGVyYXRpb247CisJX191OCBwb29sOworCV9fdTE2IHBhZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBodl9rdnBfZXhjaGdfbXNnX3ZhbHVlIHsKKwlfX3UzMiB2YWx1ZV90eXBlOworCV9fdTMyIGtleV9zaXplOworCV9fdTMyIHZhbHVlX3NpemU7CisJX191OCBrZXlbSFZfS1ZQX0VYQ0hBTkdFX01BWF9LRVlfU0laRV07CisJdW5pb24geworCQlfX3U4IHZhbHVlW0hWX0tWUF9FWENIQU5HRV9NQVhfVkFMVUVfU0laRV07CisJCV9fdTMyIHZhbHVlX3UzMjsKKwkJX191NjQgdmFsdWVfdTY0OworCX07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaHZfa3ZwX21zZ19lbnVtZXJhdGUgeworCV9fdTMyIGluZGV4OworCXN0cnVjdCBodl9rdnBfZXhjaGdfbXNnX3ZhbHVlIGRhdGE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaHZfa3ZwX21zZ19nZXQgeworCXN0cnVjdCBodl9rdnBfZXhjaGdfbXNnX3ZhbHVlIGRhdGE7Cit9OworCitzdHJ1Y3QgaHZfa3ZwX21zZ19zZXQgeworCXN0cnVjdCBodl9rdnBfZXhjaGdfbXNnX3ZhbHVlIGRhdGE7Cit9OworCitzdHJ1Y3QgaHZfa3ZwX21zZ19kZWxldGUgeworCV9fdTMyIGtleV9zaXplOworCV9fdTgga2V5W0hWX0tWUF9FWENIQU5HRV9NQVhfS0VZX1NJWkVdOworfTsKKworc3RydWN0IGh2X2t2cF9yZWdpc3RlciB7CisJX191OCB2ZXJzaW9uW0hWX0tWUF9FWENIQU5HRV9NQVhfS0VZX1NJWkVdOworfTsKKworc3RydWN0IGh2X2t2cF9tc2cgeworCXVuaW9uIHsKKwkJc3RydWN0IGh2X2t2cF9oZHIJa3ZwX2hkcjsKKwkJaW50IGVycm9yOworCX07CisJdW5pb24geworCQlzdHJ1Y3QgaHZfa3ZwX21zZ19nZXQJCWt2cF9nZXQ7CisJCXN0cnVjdCBodl9rdnBfbXNnX3NldAkJa3ZwX3NldDsKKwkJc3RydWN0IGh2X2t2cF9tc2dfZGVsZXRlCWt2cF9kZWxldGU7CisJCXN0cnVjdCBodl9rdnBfbXNnX2VudW1lcmF0ZQlrdnBfZW51bV9kYXRhOworCQlzdHJ1Y3QgaHZfa3ZwX2lwYWRkcl92YWx1ZSAgICAgIGt2cF9pcF92YWw7CisJCXN0cnVjdCBodl9rdnBfcmVnaXN0ZXIJCWt2cF9yZWdpc3RlcjsKKwl9IGJvZHk7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaHZfa3ZwX2lwX21zZyB7CisJX191OCBvcGVyYXRpb247CisJX191OCBwb29sOworCXN0cnVjdCBodl9rdnBfaXBhZGRyX3ZhbHVlICAgICAga3ZwX2lwX3ZhbDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNlbmRpZiAvKiBfVUFQSV9IWVBFUlZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3NwaS9zcGlkZXYuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9zcGkvc3BpZGV2LmgKaW5kZXggNTJkOWVkMC4uZGQ1ZjIxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3NwaS9zcGlkZXYuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvc3BpL3NwaWRldi5oCkBAIC00Miw2ICs0MiwxMCBAQAogI2RlZmluZSBTUElfTE9PUAkJMHgyMAogI2RlZmluZSBTUElfTk9fQ1MJCTB4NDAKICNkZWZpbmUgU1BJX1JFQURZCQkweDgwCisjZGVmaW5lIFNQSV9UWF9EVUFMCQkweDEwMAorI2RlZmluZSBTUElfVFhfUVVBRAkJMHgyMDAKKyNkZWZpbmUgU1BJX1JYX0RVQUwJCTB4NDAwCisjZGVmaW5lIFNQSV9SWF9RVUFECQkweDgwMAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTkyLDcgKzk2LDkgQEAKIAlfX3UxNgkJZGVsYXlfdXNlY3M7CiAJX191OAkJYml0c19wZXJfd29yZDsKIAlfX3U4CQljc19jaGFuZ2U7Ci0JX191MzIJCXBhZDsKKwlfX3U4CQl0eF9uYml0czsKKwlfX3U4CQlyeF9uYml0czsKKwlfX3UxNgkJcGFkOwogCiAJLyogSWYgdGhlIGNvbnRlbnRzIG9mICdzdHJ1Y3Qgc3BpX2lvY190cmFuc2ZlcicgZXZlciBjaGFuZ2UKIAkgKiBpbmNvbXBhdGlibHksIHRoZW4gdGhlIGlvY3RsIG51bWJlciAoY3VycmVudGx5IDApIG11c3QgY2hhbmdlOwpAQCAtMTEwLDcgKzExNiw3IEBACiAjZGVmaW5lIFNQSV9JT0NfTUVTU0FHRShOKSBfSU9XKFNQSV9JT0NfTUFHSUMsIDAsIGNoYXJbU1BJX01TR1NJWkUoTildKQogCiAKLS8qIFJlYWQgLyBXcml0ZSBvZiBTUEkgbW9kZSAoU1BJX01PREVfMC4uU1BJX01PREVfMykgKi8KKy8qIFJlYWQgLyBXcml0ZSBvZiBTUEkgbW9kZSAoU1BJX01PREVfMC4uU1BJX01PREVfMykgKGxpbWl0ZWQgdG8gOCBiaXRzKSAqLwogI2RlZmluZSBTUElfSU9DX1JEX01PREUJCQlfSU9SKFNQSV9JT0NfTUFHSUMsIDEsIF9fdTgpCiAjZGVmaW5lIFNQSV9JT0NfV1JfTU9ERQkJCV9JT1coU1BJX0lPQ19NQUdJQywgMSwgX191OCkKIApAQCAtMTI2LDYgKzEzMiwxMCBAQAogI2RlZmluZSBTUElfSU9DX1JEX01BWF9TUEVFRF9IWgkJX0lPUihTUElfSU9DX01BR0lDLCA0LCBfX3UzMikKICNkZWZpbmUgU1BJX0lPQ19XUl9NQVhfU1BFRURfSFoJCV9JT1coU1BJX0lPQ19NQUdJQywgNCwgX191MzIpCiAKKy8qIFJlYWQgLyBXcml0ZSBvZiB0aGUgU1BJIG1vZGUgZmllbGQgKi8KKyNkZWZpbmUgU1BJX0lPQ19SRF9NT0RFMzIJCV9JT1IoU1BJX0lPQ19NQUdJQywgNSwgX191MzIpCisjZGVmaW5lIFNQSV9JT0NfV1JfTU9ERTMyCQlfSU9XKFNQSV9JT0NfTUFHSUMsIDUsIF9fdTMyKQorCiAKIAogI2VuZGlmIC8qIFNQSURFVl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvdXNiL2Z1bmN0aW9uZnMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC91c2IvZnVuY3Rpb25mcy5oCmluZGV4IGQ2YjAxMjguLjJhNGI0YTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC91c2IvZnVuY3Rpb25mcy5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC91c2IvZnVuY3Rpb25mcy5oCkBAIC0xMCw5ICsxMCwxNSBAQAogCiBlbnVtIHsKIAlGVU5DVElPTkZTX0RFU0NSSVBUT1JTX01BR0lDID0gMSwKLQlGVU5DVElPTkZTX1NUUklOR1NfTUFHSUMgICAgID0gMgorCUZVTkNUSU9ORlNfU1RSSU5HU19NQUdJQyA9IDIsCisJRlVOQ1RJT05GU19ERVNDUklQVE9SU19NQUdJQ19WMiA9IDMsCiB9OwogCitlbnVtIGZ1bmN0aW9uZnNfZmxhZ3MgeworCUZVTkNUSU9ORlNfSEFTX0ZTX0RFU0MgPSAxLAorCUZVTkNUSU9ORlNfSEFTX0hTX0RFU0MgPSAyLAorCUZVTkNUSU9ORlNfSEFTX1NTX0RFU0MgPSA0LAorfTsKIAogI2lmbmRlZiBfX0tFUk5FTF9fCiAKQEAgLTI5LDI5ICszNSwzOSBAQAogCiAKIC8qCi0gKiBBbGwgbnVtYmVycyBtdXN0IGJlIGluIGxpdHRsZSBlbmRpYW4gb3JkZXIuCi0gKi8KLQotc3RydWN0IHVzYl9mdW5jdGlvbmZzX2Rlc2NzX2hlYWQgewotCV9fbGUzMiBtYWdpYzsKLQlfX2xlMzIgbGVuZ3RoOwotCV9fbGUzMiBmc19jb3VudDsKLQlfX2xlMzIgaHNfY291bnQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgogICogRGVzY3JpcHRvcnMgZm9ybWF0OgogICoKICAqIHwgb2ZmIHwgbmFtZSAgICAgIHwgdHlwZSAgICAgICAgIHwgZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAqIHwtLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAqIHwgICAwIHwgbWFnaWMgICAgIHwgTEUzMiAgICAgICAgIHwgRlVOQ1RJT05GU197RlMsSFN9X0RFU0NSSVBUT1JTX01BR0lDIHwKKyAqIHwgICAwIHwgbWFnaWMgICAgIHwgTEUzMiAgICAgICAgIHwgRlVOQ1RJT05GU19ERVNDUklQVE9SU19NQUdJQ19WMiAgICAgIHwKKyAqIHwgICA0IHwgbGVuZ3RoICAgIHwgTEUzMiAgICAgICAgIHwgbGVuZ3RoIG9mIHRoZSB3aG9sZSBkYXRhIGNodW5rICAgICAgIHwKKyAqIHwgICA4IHwgZmxhZ3MgICAgIHwgTEUzMiAgICAgICAgIHwgY29tYmluYXRpb24gb2YgZnVuY3Rpb25mc19mbGFncyAgICAgIHwKKyAqIHwgICAgIHwgZnNfY291bnQgIHwgTEUzMiAgICAgICAgIHwgbnVtYmVyIG9mIGZ1bGwtc3BlZWQgZGVzY3JpcHRvcnMgICAgIHwKKyAqIHwgICAgIHwgaHNfY291bnQgIHwgTEUzMiAgICAgICAgIHwgbnVtYmVyIG9mIGhpZ2gtc3BlZWQgZGVzY3JpcHRvcnMgICAgIHwKKyAqIHwgICAgIHwgc3NfY291bnQgIHwgTEUzMiAgICAgICAgIHwgbnVtYmVyIG9mIHN1cGVyLXNwZWVkIGRlc2NyaXB0b3JzICAgIHwKKyAqIHwgICAgIHwgZnNfZGVzY3JzIHwgRGVzY3JpcHRvcltdIHwgbGlzdCBvZiBmdWxsLXNwZWVkIGRlc2NyaXB0b3JzICAgICAgIHwKKyAqIHwgICAgIHwgaHNfZGVzY3JzIHwgRGVzY3JpcHRvcltdIHwgbGlzdCBvZiBoaWdoLXNwZWVkIGRlc2NyaXB0b3JzICAgICAgIHwKKyAqIHwgICAgIHwgc3NfZGVzY3JzIHwgRGVzY3JpcHRvcltdIHwgbGlzdCBvZiBzdXBlci1zcGVlZCBkZXNjcmlwdG9ycyAgICAgIHwKKyAqCisgKiBEZXBlbmRpbmcgb24gd2hpY2ggZmxhZ3MgYXJlIHNldCwgdmFyaW91cyBmaWVsZHMgbWF5IGJlIG1pc3NpbmcgaW4gdGhlCisgKiBzdHJ1Y3R1cmUuICBBbnkgZmxhZ3MgdGhhdCBhcmUgbm90IHJlY29nbmlzZWQgY2F1c2UgdGhlIHdob2xlIGJsb2NrIHRvIGJlCisgKiByZWplY3RlZCB3aXRoIC1FTk9TWVMuCisgKgorICogTGVnYWN5IGRlc2NyaXB0b3JzIGZvcm1hdDoKKyAqCisgKiB8IG9mZiB8IG5hbWUgICAgICB8IHR5cGUgICAgICAgICB8IGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8LS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgMCB8IG1hZ2ljICAgICB8IExFMzIgICAgICAgICB8IEZVTkNUSU9ORlNfREVTQ1JJUFRPUlNfTUFHSUMgICAgICAgICB8CiAgKiB8ICAgNCB8IGxlbmd0aCAgICB8IExFMzIgICAgICAgICB8IGxlbmd0aCBvZiB0aGUgd2hvbGUgZGF0YSBjaHVuayAgICAgICB8CiAgKiB8ICAgOCB8IGZzX2NvdW50ICB8IExFMzIgICAgICAgICB8IG51bWJlciBvZiBmdWxsLXNwZWVkIGRlc2NyaXB0b3JzICAgICB8CiAgKiB8ICAxMiB8IGhzX2NvdW50ICB8IExFMzIgICAgICAgICB8IG51bWJlciBvZiBoaWdoLXNwZWVkIGRlc2NyaXB0b3JzICAgICB8CiAgKiB8ICAxNiB8IGZzX2Rlc2NycyB8IERlc2NyaXB0b3JbXSB8IGxpc3Qgb2YgZnVsbC1zcGVlZCBkZXNjcmlwdG9ycyAgICAgICB8CiAgKiB8ICAgICB8IGhzX2Rlc2NycyB8IERlc2NyaXB0b3JbXSB8IGxpc3Qgb2YgaGlnaC1zcGVlZCBkZXNjcmlwdG9ycyAgICAgICB8CiAgKgotICogZGVzY3MgYXJlIGp1c3QgdmFsaWQgVVNCIGRlc2NyaXB0b3JzIGFuZCBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICogQWxsIG51bWJlcnMgbXVzdCBiZSBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyLgorICoKKyAqIERlc2NyaXB0b3JbXSBpcyBhbiBhcnJheSBvZiB2YWxpZCBVU0IgZGVzY3JpcHRvcnMgd2hpY2ggaGF2ZSB0aGUgZm9sbG93aW5nCisgKiBmb3JtYXQ6CiAgKgogICogfCBvZmYgfCBuYW1lICAgICAgICAgICAgfCB0eXBlIHwgZGVzY3JpcHRpb24gICAgICAgICAgICAgIHwKICAqIHwtLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvdXNiZGV2aWNlX2ZzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdXNiZGV2aWNlX2ZzLmgKaW5kZXggMGM2NWU0Yi4uYWJlNWY0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3VzYmRldmljZV9mcy5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC91c2JkZXZpY2VfZnMuaApAQCAtMTAyLDcgKzEwMiwxMCBAQAogCWludCBidWZmZXJfbGVuZ3RoOwogCWludCBhY3R1YWxfbGVuZ3RoOwogCWludCBzdGFydF9mcmFtZTsKLQlpbnQgbnVtYmVyX29mX3BhY2tldHM7CisJdW5pb24geworCQlpbnQgbnVtYmVyX29mX3BhY2tldHM7CS8qIE9ubHkgdXNlZCBmb3IgaXNvYyB1cmJzICovCisJCXVuc2lnbmVkIGludCBzdHJlYW1faWQ7CS8qIE9ubHkgdXNlZCB3aXRoIGJ1bGsgc3RyZWFtcyAqLworCX07CiAJaW50IGVycm9yX2NvdW50OwogCXVuc2lnbmVkIGludCBzaWducjsJLyogc2lnbmFsIHRvIGJlIHNlbnQgb24gY29tcGxldGlvbiwKIAkJCQkgIG9yIDAgaWYgbm9uZSBzaG91bGQgYmUgc2VudC4gKi8KQEAgLTE0NCw2ICsxNDcsMTEgQEAKIAljaGFyIGRyaXZlcltVU0JERVZGU19NQVhEUklWRVJOQU1FICsgMV07CiB9OwogCitzdHJ1Y3QgdXNiZGV2ZnNfc3RyZWFtcyB7CisJdW5zaWduZWQgaW50IG51bV9zdHJlYW1zOyAvKiBOb3QgdXNlZCBieSBVU0JERVZGU19GUkVFX1NUUkVBTVMgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2VwczsKKwl1bnNpZ25lZCBjaGFyIGVwc1swXTsKK307CiAKICNkZWZpbmUgVVNCREVWRlNfQ09OVFJPTCAgICAgICAgICAgX0lPV1IoJ1UnLCAwLCBzdHJ1Y3QgdXNiZGV2ZnNfY3RybHRyYW5zZmVyKQogI2RlZmluZSBVU0JERVZGU19DT05UUk9MMzIgICAgICAgICAgIF9JT1dSKCdVJywgMCwgc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlcjMyKQpAQCAtMTc2LDUgKzE4NCw3IEBACiAjZGVmaW5lIFVTQkRFVkZTX1JFTEVBU0VfUE9SVCAgICAgIF9JT1IoJ1UnLCAyNSwgdW5zaWduZWQgaW50KQogI2RlZmluZSBVU0JERVZGU19HRVRfQ0FQQUJJTElUSUVTICBfSU9SKCdVJywgMjYsIF9fdTMyKQogI2RlZmluZSBVU0JERVZGU19ESVNDT05ORUNUX0NMQUlNICBfSU9SKCdVJywgMjcsIHN0cnVjdCB1c2JkZXZmc19kaXNjb25uZWN0X2NsYWltKQorI2RlZmluZSBVU0JERVZGU19BTExPQ19TVFJFQU1TICAgICBfSU9SKCdVJywgMjgsIHN0cnVjdCB1c2JkZXZmc19zdHJlYW1zKQorI2RlZmluZSBVU0JERVZGU19GUkVFX1NUUkVBTVMgICAgICBfSU9SKCdVJywgMjksIHN0cnVjdCB1c2JkZXZmc19zdHJlYW1zKQogCiAjZW5kaWYgLyogX1VBUElfTElOVVhfVVNCREVWSUNFX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vc2dpdncuaCBiL2luY2x1ZGUvdmlkZW8vc2dpdncuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhYTU2OS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3ZpZGVvL3NnaXZ3LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ODEgKzAsMCBAQAotLyoKLSAqICBsaW51eC9kcml2ZXJzL3ZpZGVvL3NnaXZ3LmggLS0gU0dJIERCRSBmcmFtZSBidWZmZXIgZGV2aWNlIGhlYWRlcgotICoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqICAgICAgSmVmZnJleSBOZXdxdWlzdCwgbmV3cXVpc3RAZW5nci5zZ2kuc29tCi0gKgotICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgTGljZW5zZS4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKLSAqICBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX1NHSVZXRkJfSF9fCi0jZGVmaW5lIF9fU0dJVldGQl9IX18KLQotI2RlZmluZSBEQkVfR0VUUkVHKHJlZywgZGVzdCkJCSgoZGVzdCkgPSBEQkVfUkVHX0JBU0UtPnJlZykKLSNkZWZpbmUgREJFX1NFVFJFRyhyZWcsIHNyYykJCURCRV9SRUdfQkFTRS0+cmVnID0gKHNyYykKLSNkZWZpbmUgREJFX0lHRVRSRUcocmVnLCBpZHgsIGRlc3QpCSgoZGVzdCkgPSBEQkVfUkVHX0JBU0UtPnJlZ1tpZHhdKQotI2RlZmluZSBEQkVfSVNFVFJFRyhyZWcsIGlkeCwgc3JjKQkoREJFX1JFR19CQVNFLT5yZWdbaWR4XSA9IChzcmMpKQotCi0jZGVmaW5lIE1BU0sobXNiLCBsc2IpICAgICAgICAgICggKCgodTMyKTE8PCgobXNiKS0obHNiKSsxKSktMSkgPDwgKGxzYikgKQotI2RlZmluZSBHRVQodiwgbXNiLCBsc2IpICAgICAgICAoICgodTMyKSh2KSAmIE1BU0sobXNiLGxzYikpID4+IChsc2IpICkKLSNkZWZpbmUgU0VUKHYsIGYsIG1zYiwgbHNiKSAgICAgKCAodikgPSAoKHYpJn5NQVNLKG1zYixsc2IpKSB8ICgoICh1MzIpKGYpPDwobHNiKSApICYgTUFTSyhtc2IsbHNiKSkgKQotCi0jZGVmaW5lIEdFVF9EQkVfRklFTEQocmVnLCBmaWVsZCwgdikgICAgICAgIEdFVCgodiksIERCRV8jI3JlZyMjXyMjZmllbGQjI19NU0IsIERCRV8jI3JlZyMjXyMjZmllbGQjI19MU0IpCi0jZGVmaW5lIFNFVF9EQkVfRklFTEQocmVnLCBmaWVsZCwgdiwgZikgICAgIFNFVCgodiksIChmKSwgREJFXyMjcmVnIyNfIyNmaWVsZCMjX01TQiwgREJFXyMjcmVnIyNfIyNmaWVsZCMjX0xTQikKLQotLyogTk9URTogQWxsIGxvYWRzL3N0b3JlcyBtdXN0IGJlIDMyIGJpdHMgYW5kIHVuY2FjaGVkICovCi0KLSNkZWZpbmUgREJFX1JFR19QSFlTCTB4ZDAwMDAwMDAKLSNkZWZpbmUgREJFX1JFR19TSVpFICAgICAgICAweDAxMDAwMDAwCi0KLXN0cnVjdCBhc3JlZ3MgewotICB2b2xhdGlsZSB1MzIgY3RybHN0YXQ7ICAgICAvKiAweDAwMDAwMCBnZW5lcmFsIGNvbnRyb2wgKi8KLSAgdm9sYXRpbGUgdTMyIGRvdGNsb2NrOyAgICAgLyogMHgwMDAwMDQgZG90IGNsb2NrIFBMTCBjb250cm9sICovCi0gIHZvbGF0aWxlIHUzMiBpMmM7ICAgICAgICAgIC8qIDB4MDAwMDA4IGNydCBJMkMgY29udHJvbCAqLwotICB2b2xhdGlsZSB1MzIgc3lzY2xrOyAgICAgICAvKiAweDAwMDAwYyBzeXN0ZW0gY2xvY2sgUExMIGNvbnRyb2wgKi8KLSAgdm9sYXRpbGUgdTMyIGkyY2ZwOyAgICAgICAgLyogMHgwMDAwMTAgZmxhdCBwYW5lbCBJMkMgY29udHJvbCAqLwotICB2b2xhdGlsZSB1MzIgaWQ7ICAgICAgICAgICAvKiAweDAwMDAxNCBkZXZpY2UgaWQvY2hpcCByZXZpc2lvbiAqLwotICB2b2xhdGlsZSB1MzIgY29uZmlnOyAgICAgICAvKiAweDAwMDAxOCBwb3dlciBvbiBjb25maWd1cmF0aW9uICovCi0gIHZvbGF0aWxlIHUzMiBiaXN0OyAgICAgICAgIC8qIDB4MDAwMDFjIGludGVybmFsIGJpc3Qgc3RhdHVzICovCi0KLSAgY2hhciBfcGFkMFsgMHgwMTAwMDAgLSAweDAwMDAyMCBdOwotCi0gIHZvbGF0aWxlIHUzMiB2dF94eTsgICAgICAgIC8qIDB4MDEwMDAwIGN1cnJlbnQgZG90IGNvb3JkcyAqLwotICB2b2xhdGlsZSB1MzIgdnRfeHltYXg7ICAgICAvKiAweDAxMDAwNCBtYXhpbXVtIGRvdCBjb29yZHMgKi8KLSAgdm9sYXRpbGUgdTMyIHZ0X3ZzeW5jOyAgICAgLyogMHgwMTAwMDggdnN5bmMgb24vb2ZmICovCi0gIHZvbGF0aWxlIHUzMiB2dF9oc3luYzsgICAgIC8qIDB4MDEwMDBjIGhzeW5jIG9uL29mZiAqLwotICB2b2xhdGlsZSB1MzIgdnRfdmJsYW5rOyAgICAvKiAweDAxMDAxMCB2Ymxhbmsgb24vb2ZmICovCi0gIHZvbGF0aWxlIHUzMiB2dF9oYmxhbms7ICAgIC8qIDB4MDEwMDE0IGhibGFuayBvbi9vZmYgKi8KLSAgdm9sYXRpbGUgdTMyIHZ0X2ZsYWdzOyAgICAgLyogMHgwMTAwMTggcG9sYXJpdHkgb2YgdnQgc2lnbmFscyAqLwotICB2b2xhdGlsZSB1MzIgdnRfZjJyZl9sb2NrOyAvKiAweDAxMDAxYyBmMnJmICYgZnJhbWVsY2sgeSBjb29yZCAqLwotICB2b2xhdGlsZSB1MzIgdnRfaW50cjAxOyAgICAvKiAweDAxMDAyMCBpbnRyIDAsMSB5IGNvb3JkcyAqLwotICB2b2xhdGlsZSB1MzIgdnRfaW50cjIzOyAgICAvKiAweDAxMDAyNCBpbnRyIDIsMyB5IGNvb3JkcyAqLwotICB2b2xhdGlsZSB1MzIgZnBfaGRydjsgICAgICAvKiAweDAxMDAyOCBmbGF0IHBhbmVsIGhkcnYgb24vb2ZmICovCi0gIHZvbGF0aWxlIHUzMiBmcF92ZHJ2OyAgICAgIC8qIDB4MDEwMDJjIGZsYXQgcGFuZWwgdmRydiBvbi9vZmYgKi8KLSAgdm9sYXRpbGUgdTMyIGZwX2RlOyAgICAgICAgLyogMHgwMTAwMzAgZmxhdCBwYW5lbCBkZSBvbi9vZmYgKi8KLSAgdm9sYXRpbGUgdTMyIHZ0X2hwaXhlbjsgICAgLyogMHgwMTAwMzQgaW50cm5sIGhvcml6IHBpeGVsIG9uL29mZiovCi0gIHZvbGF0aWxlIHUzMiB2dF92cGl4ZW47ICAgIC8qIDB4MDEwMDM4IGludHJubCB2ZXJ0IHBpeGVsIG9uL29mZiAqLwotICB2b2xhdGlsZSB1MzIgdnRfaGNtYXA7ICAgICAvKiAweDAxMDAzYyBjbWFwIHdyaXRlIChob3JpeikgKi8KLSAgdm9sYXRpbGUgdTMyIHZ0X3ZjbWFwOyAgICAgLyogMHgwMTAwNDAgY21hcCB3cml0ZSAodmVydCkgKi8KLSAgdm9sYXRpbGUgdTMyIGRpZF9zdGFydF94eTsgLyogMHgwMTAwNDQgZW9sL2YgZGlkL3h5IHJlc2V0IHZhbCAqLwotICB2b2xhdGlsZSB1MzIgY3JzX3N0YXJ0X3h5OyAvKiAweDAxMDA0OCBlb2wvZiBjcnMveHkgcmVzZXQgdmFsICovCi0gIHZvbGF0aWxlIHUzMiB2Y19zdGFydF94eTsgIC8qIDB4MDEwMDRjIGVvbC9mIHZjL3h5IHJlc2V0IHZhbCAqLwotCi0gIGNoYXIgX3BhZDFbIDB4MDIwMDAwIC0gMHgwMTAwNTAgXTsKLQotICB2b2xhdGlsZSB1MzIgb3ZyX3dpZHRoX3RpbGU7IC8qIDB4MDIwMDAwIG92ZXJsYXkgcGxhbmUgY3RybCAwICovCi0gIHZvbGF0aWxlIHUzMiBvdnJfaW5od2N0cmw7ICAgLyogMHgwMjAwMDQgb3ZlcmxheSBwbGFuZSBjdHJsIDEgKi8KLSAgdm9sYXRpbGUgdTMyIG92cl9jb250cm9sOyAgICAvKiAweDAyMDAwOCBvdmVybGF5IHBsYW5lIGN0cmwgMSAqLwotCi0gIGNoYXIgX3BhZDJbIDB4MDMwMDAwIC0gMHgwMjAwMEMgXTsKLQotICB2b2xhdGlsZSB1MzIgZnJtX3NpemVfdGlsZTsgIC8qIDB4MDMwMDAwIG5vcm1hbCBwbGFuZSBjdHJsIDAgKi8KLSAgdm9sYXRpbGUgdTMyIGZybV9zaXplX3BpeGVsOyAvKiAweDAzMDAwNCBub3JtYWwgcGxhbmUgY3RybCAxICovCi0gIHZvbGF0aWxlIHUzMiBmcm1faW5od2N0cmw7ICAgLyogMHgwMzAwMDggbm9ybWFsIHBsYW5lIGN0cmwgMiAqLwotICB2b2xhdGlsZSB1MzIgZnJtX2NvbnRyb2w7CSAgIC8qIDB4MDMwMDBDIG5vcm1hbCBwbGFuZSBjdHJsIDMgKi8KLQotICBjaGFyIF9wYWQzWyAweDA0MDAwMCAtIDB4MDMwMDEwIF07Ci0KLSAgdm9sYXRpbGUgdTMyIGRpZF9pbmh3Y3RybDsgICAvKiAweDA0MDAwMCBESUQgY29udHJvbCAqLwotICB2b2xhdGlsZSB1MzIgZGlkX2NvbnRyb2w7ICAgIC8qIDB4MDQwMDA0IERJRCBzaGFkb3cgKi8KLQotICBjaGFyIF9wYWQ0WyAweDA0ODAwMCAtIDB4MDQwMDA4IF07Ci0KLSAgdm9sYXRpbGUgdTMyIG1vZGVfcmVnc1szMl07ICAvKiAweDA0ODAwMCAtIDB4MDQ4MDdjIFdJRCB0YWJsZSAqLwotCi0gIGNoYXIgX3BhZDVbIDB4MDUwMDAwIC0gMHgwNDgwODAgXTsKLQotICB2b2xhdGlsZSB1MzIgY21hcFs2MTQ0XTsgICAgIC8qIDB4MDUwMDAwIC0gMHgwNTVmZmMgY29sb3IgbWFwICovCi0KLSAgY2hhciBfcGFkNlsgMHgwNTgwMDAgLSAweDA1NjAwMCBdOwotCi0gIHZvbGF0aWxlIHUzMiBjbV9maWZvOyAgICAgICAgLyogMHgwNTgwMDAgY29sb3IgbWFwIGZpZm8gc3RhdHVzICovCi0KLSAgY2hhciBfcGFkN1sgMHgwNjAwMDAgLSAweDA1ODAwNCBdOwotCi0gIHZvbGF0aWxlIHUzMiBnbWFwWzI1Nl07ICAgICAgLyogMHgwNjAwMDAgLSAweDA2MDNmYyBnYW1tYSBtYXAgKi8KLQotICBjaGFyIF9wYWQ4WyAweDA2ODAwMCAtIDB4MDYwNDAwIF07Ci0KLSAgdm9sYXRpbGUgdTMyIGdtYXAxMFsxMDI0XTsgICAvKiAweDA2ODAwMCAtIDB4MDY4ZmZjIGdhbW1hIG1hcCAqLwotCi0gIGNoYXIgX3BhZDlbIDB4MDcwMDAwIC0gMHgwNjkwMDAgXTsKLQotICB2b2xhdGlsZSB1MzIgY3JzX3BvczsgICAgICAgIC8qIDB4MDcwMDAwIGN1c3JvciBjb250cm9sIDAgKi8KLSAgdm9sYXRpbGUgdTMyIGNyc19jdGw7ICAgICAgICAvKiAweDA3MDAwNCBjdXNyb3IgY29udHJvbCAxICovCi0gIHZvbGF0aWxlIHUzMiBjcnNfY21hcFszXTsgICAgLyogMHgwNzAwMDggLSAweDA3MDAxMCBjcnMgY21hcCAqLwotCi0gIGNoYXIgX3BhZDEwWyAweDA3ODAwMCAtIDB4MDcwMDE0IF07Ci0KLSAgdm9sYXRpbGUgdTMyIGNyc19nbHlwaFs2NF07ICAvKiAweDA3ODAwMCAtIDB4MDc4MGZjIGNycyBnbHlwaCAqLwotCi0gIGNoYXIgX3BhZDExWyAweDA4MDAwMCAtIDB4MDc4MTAwIF07Ci0KLSAgdm9sYXRpbGUgdTMyIHZjXzA7ICAgICAgICAgICAvKiAweDA4MDAwMCB2aWRlbyBjYXB0dXJlIGNydGwgMCAqLwotICB2b2xhdGlsZSB1MzIgdmNfMTsgICAgICAgICAgIC8qIDB4MDgwMDA0IHZpZGVvIGNhcHR1cmUgY3J0bCAxICovCi0gIHZvbGF0aWxlIHUzMiB2Y18yOyAgICAgICAgICAgLyogMHgwODAwMDggdmlkZW8gY2FwdHVyZSBjcnRsIDIgKi8KLSAgdm9sYXRpbGUgdTMyIHZjXzM7ICAgICAgICAgICAvKiAweDA4MDAwYyB2aWRlbyBjYXB0dXJlIGNydGwgMyAqLwotICB2b2xhdGlsZSB1MzIgdmNfNDsgICAgICAgICAgIC8qIDB4MDgwMDEwIHZpZGVvIGNhcHR1cmUgY3J0bCAzICovCi0gIHZvbGF0aWxlIHUzMiB2Y181OyAgICAgICAgICAgLyogMHgwODAwMTQgdmlkZW8gY2FwdHVyZSBjcnRsIDMgKi8KLSAgdm9sYXRpbGUgdTMyIHZjXzY7ICAgICAgICAgICAvKiAweDA4MDAxOCB2aWRlbyBjYXB0dXJlIGNydGwgMyAqLwotICB2b2xhdGlsZSB1MzIgdmNfNzsgICAgICAgICAgIC8qIDB4MDgwMDFjIHZpZGVvIGNhcHR1cmUgY3J0bCAzICovCi0gIHZvbGF0aWxlIHUzMiB2Y184OyAgICAgICAgICAgLyogMHgwODAwMGMgdmlkZW8gY2FwdHVyZSBjcnRsIDMgKi8KLX07Ci0KLS8qIEJpdCBtYXNrIGluZm9ybWF0aW9uICovCi0KLSNkZWZpbmUgREJFX0NUUkxTVEFUX0NISVBJRF9NU0IgICAgIDMKLSNkZWZpbmUgREJFX0NUUkxTVEFUX0NISVBJRF9MU0IgICAgIDAKLSNkZWZpbmUgREJFX0NUUkxTVEFUX1NFTlNFX05fTVNCICAgIDQKLSNkZWZpbmUgREJFX0NUUkxTVEFUX1NFTlNFX05fTFNCICAgIDQKLSNkZWZpbmUgREJFX0NUUkxTVEFUX1BDTEtTRUxfTVNCICAgIDI5Ci0jZGVmaW5lIERCRV9DVFJMU1RBVF9QQ0xLU0VMX0xTQiAgICAyOAotCi0jZGVmaW5lIERCRV9ET1RDTEtfTV9NU0IgICAgICAgICAgICA3Ci0jZGVmaW5lIERCRV9ET1RDTEtfTV9MU0IgICAgICAgICAgICAwCi0jZGVmaW5lIERCRV9ET1RDTEtfTl9NU0IgICAgICAgICAgICAxMwotI2RlZmluZSBEQkVfRE9UQ0xLX05fTFNCICAgICAgICAgICAgOAotI2RlZmluZSBEQkVfRE9UQ0xLX1BfTVNCICAgICAgICAgICAgMTUKLSNkZWZpbmUgREJFX0RPVENMS19QX0xTQiAgICAgICAgICAgIDE0Ci0jZGVmaW5lIERCRV9ET1RDTEtfUlVOX01TQiAgICAgICAgICAyMAotI2RlZmluZSBEQkVfRE9UQ0xLX1JVTl9MU0IgICAgICAgICAgMjAKLQotI2RlZmluZSBEQkVfVlRfWFlfVlRfRlJFRVpFX01TQiAgICAgMzEKLSNkZWZpbmUgREJFX1ZUX1hZX1ZUX0ZSRUVaRV9MU0IgICAgIDMxCi0KLSNkZWZpbmUgREJFX0ZQX1ZEUlZfRlBfVkRSVl9PTl9NU0IJMjMKLSNkZWZpbmUgREJFX0ZQX1ZEUlZfRlBfVkRSVl9PTl9MU0IJMTIKLSNkZWZpbmUgREJFX0ZQX1ZEUlZfRlBfVkRSVl9PRkZfTVNCCTExCi0jZGVmaW5lIERCRV9GUF9WRFJWX0ZQX1ZEUlZfT0ZGX0xTQgkwCi0KLSNkZWZpbmUgREJFX0ZQX0hEUlZfRlBfSERSVl9PTl9NU0IJMjMKLSNkZWZpbmUgREJFX0ZQX0hEUlZfRlBfSERSVl9PTl9MU0IJMTIKLSNkZWZpbmUgREJFX0ZQX0hEUlZfRlBfSERSVl9PRkZfTVNCCTExCi0jZGVmaW5lIERCRV9GUF9IRFJWX0ZQX0hEUlZfT0ZGX0xTQgkwCi0KLSNkZWZpbmUgREJFX0ZQX0RFX0ZQX0RFX09OX01TQgkJMjMKLSNkZWZpbmUgREJFX0ZQX0RFX0ZQX0RFX09OX0xTQgkJMTIKLSNkZWZpbmUgREJFX0ZQX0RFX0ZQX0RFX09GRl9NU0IJCTExCi0jZGVmaW5lIERCRV9GUF9ERV9GUF9ERV9PRkZfTFNCCQkwCi0KLSNkZWZpbmUgREJFX1ZUX1ZTWU5DX1ZUX1ZTWU5DX09OX01TQiAgICAgICAgMjMKLSNkZWZpbmUgREJFX1ZUX1ZTWU5DX1ZUX1ZTWU5DX09OX0xTQiAgICAgICAgMTIKLSNkZWZpbmUgREJFX1ZUX1ZTWU5DX1ZUX1ZTWU5DX09GRl9NU0IgICAgICAgMTEKLSNkZWZpbmUgREJFX1ZUX1ZTWU5DX1ZUX1ZTWU5DX09GRl9MU0IgICAgICAgMAotCi0jZGVmaW5lIERCRV9WVF9IU1lOQ19WVF9IU1lOQ19PTl9NU0IgICAgICAgIDIzCi0jZGVmaW5lIERCRV9WVF9IU1lOQ19WVF9IU1lOQ19PTl9MU0IgICAgICAgIDEyCi0jZGVmaW5lIERCRV9WVF9IU1lOQ19WVF9IU1lOQ19PRkZfTVNCICAgICAgIDExCi0jZGVmaW5lIERCRV9WVF9IU1lOQ19WVF9IU1lOQ19PRkZfTFNCICAgICAgIDAKLQotI2RlZmluZSBEQkVfVlRfVkJMQU5LX1ZUX1ZCTEFOS19PTl9NU0IgICAgICAgIDIzCi0jZGVmaW5lIERCRV9WVF9WQkxBTktfVlRfVkJMQU5LX09OX0xTQiAgICAgICAgMTIKLSNkZWZpbmUgREJFX1ZUX1ZCTEFOS19WVF9WQkxBTktfT0ZGX01TQiAgICAgICAxMQotI2RlZmluZSBEQkVfVlRfVkJMQU5LX1ZUX1ZCTEFOS19PRkZfTFNCICAgICAgIDAKLQotI2RlZmluZSBEQkVfVlRfSEJMQU5LX1ZUX0hCTEFOS19PTl9NU0IgICAgICAgIDIzCi0jZGVmaW5lIERCRV9WVF9IQkxBTktfVlRfSEJMQU5LX09OX0xTQiAgICAgICAgMTIKLSNkZWZpbmUgREJFX1ZUX0hCTEFOS19WVF9IQkxBTktfT0ZGX01TQiAgICAgICAxMQotI2RlZmluZSBEQkVfVlRfSEJMQU5LX1ZUX0hCTEFOS19PRkZfTFNCICAgICAgIDAKLQotI2RlZmluZSBEQkVfVlRfRkxBR1NfVkRSVl9JTlZFUlRfTVNCCQkwCi0jZGVmaW5lIERCRV9WVF9GTEFHU19WRFJWX0lOVkVSVF9MU0IJCTAKLSNkZWZpbmUgREJFX1ZUX0ZMQUdTX0hEUlZfSU5WRVJUX01TQgkJMgotI2RlZmluZSBEQkVfVlRfRkxBR1NfSERSVl9JTlZFUlRfTFNCCQkyCi0KLSNkZWZpbmUgREJFX1ZUX1ZDTUFQX1ZUX1ZDTUFQX09OX01TQiAgICAgICAgMjMKLSNkZWZpbmUgREJFX1ZUX1ZDTUFQX1ZUX1ZDTUFQX09OX0xTQiAgICAgICAgMTIKLSNkZWZpbmUgREJFX1ZUX1ZDTUFQX1ZUX1ZDTUFQX09GRl9NU0IgICAgICAgMTEKLSNkZWZpbmUgREJFX1ZUX1ZDTUFQX1ZUX1ZDTUFQX09GRl9MU0IgICAgICAgMAotCi0jZGVmaW5lIERCRV9WVF9IQ01BUF9WVF9IQ01BUF9PTl9NU0IgICAgICAgIDIzCi0jZGVmaW5lIERCRV9WVF9IQ01BUF9WVF9IQ01BUF9PTl9MU0IgICAgICAgIDEyCi0jZGVmaW5lIERCRV9WVF9IQ01BUF9WVF9IQ01BUF9PRkZfTVNCICAgICAgIDExCi0jZGVmaW5lIERCRV9WVF9IQ01BUF9WVF9IQ01BUF9PRkZfTFNCICAgICAgIDAKLQotI2RlZmluZSBEQkVfVlRfWFlNQVhfVlRfTUFYWF9NU0IgICAgMTEKLSNkZWZpbmUgREJFX1ZUX1hZTUFYX1ZUX01BWFhfTFNCICAgIDAKLSNkZWZpbmUgREJFX1ZUX1hZTUFYX1ZUX01BWFlfTVNCICAgIDIzCi0jZGVmaW5lIERCRV9WVF9YWU1BWF9WVF9NQVhZX0xTQiAgICAxMgotCi0jZGVmaW5lIERCRV9WVF9IUElYRU5fVlRfSFBJWEVOX09OX01TQiAgICAgIDIzCi0jZGVmaW5lIERCRV9WVF9IUElYRU5fVlRfSFBJWEVOX09OX0xTQiAgICAgIDEyCi0jZGVmaW5lIERCRV9WVF9IUElYRU5fVlRfSFBJWEVOX09GRl9NU0IgICAgIDExCi0jZGVmaW5lIERCRV9WVF9IUElYRU5fVlRfSFBJWEVOX09GRl9MU0IgICAgIDAKLQotI2RlZmluZSBEQkVfVlRfVlBJWEVOX1ZUX1ZQSVhFTl9PTl9NU0IgICAgICAyMwotI2RlZmluZSBEQkVfVlRfVlBJWEVOX1ZUX1ZQSVhFTl9PTl9MU0IgICAgICAxMgotI2RlZmluZSBEQkVfVlRfVlBJWEVOX1ZUX1ZQSVhFTl9PRkZfTVNCICAgICAxMQotI2RlZmluZSBEQkVfVlRfVlBJWEVOX1ZUX1ZQSVhFTl9PRkZfTFNCICAgICAwCi0KLSNkZWZpbmUgREJFX09WUl9DT05UUk9MX09WUl9ETUFfRU5BQkxFX01TQiAgMAotI2RlZmluZSBEQkVfT1ZSX0NPTlRST0xfT1ZSX0RNQV9FTkFCTEVfTFNCICAwCi0KLSNkZWZpbmUgREJFX09WUl9JTkhXQ1RSTF9PVlJfRE1BX0VOQUJMRV9NU0IgMAotI2RlZmluZSBEQkVfT1ZSX0lOSFdDVFJMX09WUl9ETUFfRU5BQkxFX0xTQiAwCi0KLSNkZWZpbmUgREJFX09WUl9XSURUSF9USUxFX09WUl9GSUZPX1JFU0VUX01TQiAgICAgICAxMwotI2RlZmluZSBEQkVfT1ZSX1dJRFRIX1RJTEVfT1ZSX0ZJRk9fUkVTRVRfTFNCICAgICAgIDEzCi0KLSNkZWZpbmUgREJFX0ZSTV9DT05UUk9MX0ZSTV9ETUFfRU5BQkxFX01TQiAgMAotI2RlZmluZSBEQkVfRlJNX0NPTlRST0xfRlJNX0RNQV9FTkFCTEVfTFNCICAwCi0jZGVmaW5lIERCRV9GUk1fQ09OVFJPTF9GUk1fVElMRV9QVFJfTVNCICAgIDMxCi0jZGVmaW5lIERCRV9GUk1fQ09OVFJPTF9GUk1fVElMRV9QVFJfTFNCICAgIDkKLSNkZWZpbmUgREJFX0ZSTV9DT05UUk9MX0ZSTV9MSU5FQVJfTVNCICAgICAgMQotI2RlZmluZSBEQkVfRlJNX0NPTlRST0xfRlJNX0xJTkVBUl9MU0IgICAgICAxCi0KLSNkZWZpbmUgREJFX0ZSTV9JTkhXQ1RSTF9GUk1fRE1BX0VOQUJMRV9NU0IgMAotI2RlZmluZSBEQkVfRlJNX0lOSFdDVFJMX0ZSTV9ETUFfRU5BQkxFX0xTQiAwCi0KLSNkZWZpbmUgREJFX0ZSTV9TSVpFX1RJTEVfRlJNX1dJRFRIX1RJTEVfTVNCICAgICAgICAxMgotI2RlZmluZSBEQkVfRlJNX1NJWkVfVElMRV9GUk1fV0lEVEhfVElMRV9MU0IgICAgICAgIDUKLSNkZWZpbmUgREJFX0ZSTV9TSVpFX1RJTEVfRlJNX1JIU19NU0IgICAgICAgNAotI2RlZmluZSBEQkVfRlJNX1NJWkVfVElMRV9GUk1fUkhTX0xTQiAgICAgICAwCi0jZGVmaW5lIERCRV9GUk1fU0laRV9USUxFX0ZSTV9ERVBUSF9NU0IgICAgIDE0Ci0jZGVmaW5lIERCRV9GUk1fU0laRV9USUxFX0ZSTV9ERVBUSF9MU0IgICAgIDEzCi0jZGVmaW5lIERCRV9GUk1fU0laRV9USUxFX0ZSTV9GSUZPX1JFU0VUX01TQiAgICAgICAgMTUKLSNkZWZpbmUgREJFX0ZSTV9TSVpFX1RJTEVfRlJNX0ZJRk9fUkVTRVRfTFNCICAgICAgICAxNQotCi0jZGVmaW5lIERCRV9GUk1fU0laRV9QSVhFTF9GQl9IRUlHSFRfUElYX01TQiAgICAgICAgMzEKLSNkZWZpbmUgREJFX0ZSTV9TSVpFX1BJWEVMX0ZCX0hFSUdIVF9QSVhfTFNCICAgICAgICAxNgotCi0jZGVmaW5lIERCRV9ESURfQ09OVFJPTF9ESURfRE1BX0VOQUJMRV9NU0IgIDAKLSNkZWZpbmUgREJFX0RJRF9DT05UUk9MX0RJRF9ETUFfRU5BQkxFX0xTQiAgMAotI2RlZmluZSBEQkVfRElEX0lOSFdDVFJMX0RJRF9ETUFfRU5BQkxFX01TQiAwCi0jZGVmaW5lIERCRV9ESURfSU5IV0NUUkxfRElEX0RNQV9FTkFCTEVfTFNCIDAKLQotI2RlZmluZSBEQkVfRElEX1NUQVJUX1hZX0RJRF9TVEFSVFlfTVNCICAgICAyMwotI2RlZmluZSBEQkVfRElEX1NUQVJUX1hZX0RJRF9TVEFSVFlfTFNCICAgICAxMgotI2RlZmluZSBEQkVfRElEX1NUQVJUX1hZX0RJRF9TVEFSVFhfTVNCICAgICAxMQotI2RlZmluZSBEQkVfRElEX1NUQVJUX1hZX0RJRF9TVEFSVFhfTFNCICAgICAwCi0KLSNkZWZpbmUgREJFX0NSU19TVEFSVF9YWV9DUlNfU1RBUlRZX01TQiAgICAgMjMKLSNkZWZpbmUgREJFX0NSU19TVEFSVF9YWV9DUlNfU1RBUlRZX0xTQiAgICAgMTIKLSNkZWZpbmUgREJFX0NSU19TVEFSVF9YWV9DUlNfU1RBUlRYX01TQiAgICAgMTEKLSNkZWZpbmUgREJFX0NSU19TVEFSVF9YWV9DUlNfU1RBUlRYX0xTQiAgICAgMAotCi0jZGVmaW5lIERCRV9XSURfVFlQX01TQiAgICAgNAotI2RlZmluZSBEQkVfV0lEX1RZUF9MU0IgICAgIDIKLSNkZWZpbmUgREJFX1dJRF9CVUZfTVNCICAgICAxCi0jZGVmaW5lIERCRV9XSURfQlVGX0xTQiAgICAgMAotCi0jZGVmaW5lIERCRV9WQ19TVEFSVF9YWV9WQ19TVEFSVFlfTVNCICAgICAgIDIzCi0jZGVmaW5lIERCRV9WQ19TVEFSVF9YWV9WQ19TVEFSVFlfTFNCICAgICAgIDEyCi0jZGVmaW5lIERCRV9WQ19TVEFSVF9YWV9WQ19TVEFSVFhfTVNCICAgICAgIDExCi0jZGVmaW5lIERCRV9WQ19TVEFSVF9YWV9WQ19TVEFSVFhfTFNCICAgICAgIDAKLQotLyogQ29uc3RhbnRzICovCi0KLSNkZWZpbmUgREJFX0ZSTV9ERVBUSF84ICAgICAwCi0jZGVmaW5lIERCRV9GUk1fREVQVEhfMTYgICAgMQotI2RlZmluZSBEQkVfRlJNX0RFUFRIXzMyICAgIDIKLQotI2RlZmluZSBEQkVfQ01PREVfSTggICAgICAgIDAKLSNkZWZpbmUgREJFX0NNT0RFX0kxMiAgICAgICAxCi0jZGVmaW5lIERCRV9DTU9ERV9SRzNCMiAgICAgMgotI2RlZmluZSBEQkVfQ01PREVfUkdCNCAgICAgIDMKLSNkZWZpbmUgREJFX0NNT0RFX0FSR0I1ICAgICA0Ci0jZGVmaW5lIERCRV9DTU9ERV9SR0I4ICAgICAgNQotI2RlZmluZSBEQkVfQ01PREVfUkdCQTUgICAgIDYKLSNkZWZpbmUgREJFX0NNT0RFX1JHQjEwICAgICA3Ci0KLSNkZWZpbmUgREJFX0JNT0RFX0JPVEggICAgICAzCi0KLSNkZWZpbmUgREJFX0NSU19NQUdJQyAgICAgICA1NAotCi0jZGVmaW5lIERCRV9DTE9DS19SRUZfS0haCTI3MDAwCi0KLS8qIENvbmZpZyBSZWdpc3RlciAoREJFIE9ubHkpIERlZmluaXRpb25zICovCi0KLSNkZWZpbmUgREJFX0NPTkZJR19WREFDX0VOQUJMRSAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIERCRV9DT05GSUdfVkRBQ19HU1lOQyAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBEQkVfQ09ORklHX1ZEQUNfUEJMQU5LICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgREJFX0NPTkZJR19GUEVOQUJMRSAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIERCRV9DT05GSUdfTEVORElBTiAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBEQkVfQ09ORklHX1RJTEVISVNUICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgREJFX0NPTkZJR19FWFRfQUREUiAgICAgICAgICAweDAwMDAwMDgwCi0KLSNkZWZpbmUgREJFX0NPTkZJR19GQkRFViAgICAgICAgKCBEQkVfQ09ORklHX1ZEQUNfRU5BQkxFIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkVfQ09ORklHX1ZEQUNfR1NZTkMgIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkVfQ09ORklHX1ZEQUNfUEJMQU5LIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkVfQ09ORklHX0xFTkRJQU4gICAgIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkVfQ09ORklHX0VYVF9BRERSICkKLQotLyoKLSAqIEF2YWlsYWJsZSBWaWRlbyBUaW1pbmdzIGFuZCBDb3JyZXNwb25kaW5nIEluZGljZXMKLSAqLwotCi10eXBlZGVmIGVudW0gewotICBEQkVfVlRfNjQwXzQ4MF82MCwKLQotICBEQkVfVlRfODAwXzYwMF82MCwKLSAgREJFX1ZUXzgwMF82MDBfNzUsCi0gIERCRV9WVF84MDBfNjAwXzEyMCwKLQotICBEQkVfVlRfMTAyNF83NjhfNTAsCi0gIERCRV9WVF8xMDI0Xzc2OF82MCwKLSAgREJFX1ZUXzEwMjRfNzY4Xzc1LAotICBEQkVfVlRfMTAyNF83NjhfODUsCi0gIERCRV9WVF8xMDI0Xzc2OF8xMjAsCi0KLSAgREJFX1ZUXzEyODBfMTAyNF81MCwKLSAgREJFX1ZUXzEyODBfMTAyNF82MCwKLSAgREJFX1ZUXzEyODBfMTAyNF83NSwKLSAgREJFX1ZUXzEyODBfMTAyNF84NSwKLQotICBEQkVfVlRfMTYwMF8xMDI0XzUzLAotICBEQkVfVlRfMTYwMF8xMDI0XzYwLAotCi0gIERCRV9WVF8xNjAwXzEyMDBfNTAsCi0gIERCRV9WVF8xNjAwXzEyMDBfNjAsCi0gIERCRV9WVF8xNjAwXzEyMDBfNzUsCi0KLSAgREJFX1ZUXzE5MjBfMTA4MF81MCwKLSAgREJFX1ZUXzE5MjBfMTA4MF82MCwKLSAgREJFX1ZUXzE5MjBfMTA4MF83MiwKLQotICBEQkVfVlRfMTkyMF8xMjAwXzUwLAotICBEQkVfVlRfMTkyMF8xMjAwXzYwLAotICBEQkVfVlRfMTkyMF8xMjAwXzY2LAotCi0gIERCRV9WVF9VTktOT1dOCi19IGRiZV90aW1pbmdfdDsKLQotCi0KLS8qCi0gKiBDcmltZSBWaWRlbyBUaW1pbmcgRGF0YSBTdHJ1Y3R1cmUKLSAqLwotCi1zdHJ1Y3QgZGJlX3RpbWluZ19pbmZvCi17Ci0gIGRiZV90aW1pbmdfdCB0eXBlOwotICBpbnQgZmxhZ3M7Ci0gIHNob3J0IHdpZHRoOwkJICAgIC8qIE1vbml0b3IgcmVzb2x1dGlvbgkJKi8KLSAgc2hvcnQgaGVpZ2h0OwotICBpbnQgZmllbGRzX3NlYzsJICAgIC8qIGZpZWxkcy9zZWMgIChIeiAtMyBkZWMuIHBsYWNlcyAqLwotICBpbnQgY2ZyZXE7CQkgICAgLyogcGl4ZWwgY2xvY2sgZnJlcXVlbmN5IChNSHogLTMgZGVjLiBwbGFjZXMpICovCi0gIHNob3J0IGh0b3RhbDsJCSAgICAvKiBIb3Jpem9udGFsIHRvdGFsIHBpeGVscwkqLwotICBzaG9ydCBoYmxhbmtfc3RhcnQ7CSAgICAvKiBIb3Jpem9udGFsIGJsYW5rIHN0YXJ0CSovCi0gIHNob3J0IGhibGFua19lbmQ7CSAgICAvKiBIb3Jpem9udGFsIGJsYW5rIGVuZAkJKi8KLSAgc2hvcnQgaHN5bmNfc3RhcnQ7CSAgICAvKiBIb3Jpem9udGFsIHN5bmMgc3RhcnQJKi8KLSAgc2hvcnQgaHN5bmNfZW5kOwkgICAgLyogSG9yaXpvbnRhbCBzeW5jIGVuZAkJKi8KLSAgc2hvcnQgdnRvdGFsOwkJICAgIC8qIFZlcnRpY2FsIHRvdGFsIGxpbmVzCQkqLwotICBzaG9ydCB2Ymxhbmtfc3RhcnQ7CSAgICAvKiBWZXJ0aWNhbCBibGFuayBzdGFydAkJKi8KLSAgc2hvcnQgdmJsYW5rX2VuZDsJICAgIC8qIFZlcnRpY2FsIGJsYW5rIGVuZAkJKi8KLSAgc2hvcnQgdnN5bmNfc3RhcnQ7CSAgICAvKiBWZXJ0aWNhbCBzeW5jIHN0YXJ0CQkqLwotICBzaG9ydCB2c3luY19lbmQ7CSAgICAvKiBWZXJ0aWNhbCBzeW5jIGVuZAkJKi8KLSAgc2hvcnQgcGxsX207CQkgICAgLyogUExMIE0gcGFyYW1ldGVyCQkqLwotICBzaG9ydCBwbGxfbjsJCSAgICAvKiBQTEwgUCBwYXJhbWV0ZXIJCSovCi0gIHNob3J0IHBsbF9wOwkJICAgIC8qIFBMTCBOIHBhcmFtZXRlcgkJKi8KLX07Ci0KLS8qIERlZmluZXMgZm9yIGRiZV92b2ZfaW5mb190IGZsYWdzICovCi0KLSNkZWZpbmUgREJFX1ZPRl9VTktOT1dOTU9OICAgIDEKLSNkZWZpbmUgREJFX1ZPRl9TVEVSRU8gICAgICAgIDIKLSNkZWZpbmUgREJFX1ZPRl9ET19HRU5TWU5DICAgIDQgICAgICAgICAgLyogZW5hYmxlIGluY29taW5nIHN5bmMgKi8KLSNkZWZpbmUgREJFX1ZPRl9TWU5DX09OX0dSRUVOIDggICAgICAgICAgLyogc3luYyBvbiBncmVlbiAqLwotI2RlZmluZSBEQkVfVk9GX0ZMQVRQQU5FTCAgICAgMHgxMDAwICAgICAvKiBGTEFUUEFORUwgVGltaW5nICovCi0jZGVmaW5lIERCRV9WT0ZfTUFHSUNLRVkgICAgICAweDIwMDAgICAgIC8qIEJhY2tkb29yIGtleSAqLwotCi0vKgotICogREJFIFRpbWluZyBUYWJsZXMKLSAqLwotCi0jaWZkZWYgSU5DTFVERV9USU1JTkdfVEFCTEVfREFUQQotc3RydWN0IGRiZV90aW1pbmdfaW5mbyBkYmVWVGltaW5nc1tdID0gewotICB7Ci0gICAgREJFX1ZUXzY0MF80ODBfNjAsCi0gICAgLyoJZmxhZ3MsCXdpZHRoLAkJCWhlaWdodCwJCWZpZWxkc19zZWMsCQljZnJlcSAqLwotICAgIDAsCSAgICAgICAgNjQwLAkJCTQ4MCwJCTU5OTQwLAkJCTI1MTc1LAotICAgIC8qCWh0b3RhbCwJaGJsYW5rX3N0YXJ0LAloYmxhbmtfZW5kLAloc3luY19zdGFydCwJaHN5bmNfZW5kICovCi0gICAgODAwLAk2NDAsCQkgICAgICAgIDgwMCwJCTY1NiwJCTc1MiwKLSAgICAvKgl2dG90YWwsCXZibGFua19zdGFydCwJdmJsYW5rX2VuZCwJdnN5bmNfc3RhcnQsCXZzeW5jX2VuZCAqLwotICAgIDUyNSwJNDgwLAkJICAgICAgICA1MjUsCQk0OTAsCQkgICAgNDkyLAotICAgIC8qCXBsbF9tLAlwbGxfbiwJCQlwbGxfcCAqLwotICAgIDE1LAkgICAgMiwJCQkJMwotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfODAwXzYwMF82MCwKLSAgICAvKglmbGFncywJd2lkdGgsCQkJaGVpZ2h0LAkJZmllbGRzX3NlYywJCWNmcmVxICovCi0gICAgMCwJICAgIDgwMCwJCQk2MDAsCQk2MDMxNywJCQk0MDAwMCwKLSAgICAvKglodG90YWwsCWhibGFua19zdGFydCwJaGJsYW5rX2VuZCwJaHN5bmNfc3RhcnQsCWhzeW5jX2VuZCAqLwotICAgIDEwNTYsCTgwMCwJCSAgICAxMDU2LAkJODQwLAkJICAgIDk2OCwKLSAgICAvKgl2dG90YWwsCXZibGFua19zdGFydCwJdmJsYW5rX2VuZCwJdnN5bmNfc3RhcnQsCXZzeW5jX2VuZCAqLwotICAgIDYyOCwJNjAwLAkJICAgIDYyOCwJCTYwMSwJCSAgICA2MDUsCi0gICAgLyoJcGxsX20sCXBsbF9uLAkJCXBsbF9wICovCi0gICAgMywJICAgIDEsCQkJCTEKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzgwMF82MDBfNzUsCi0gICAgLyoJZmxhZ3MsCXdpZHRoLAkJICAgIGhlaWdodCwJCWZpZWxkc19zZWMsCSAgICBjZnJlcSAqLwotICAgIDAsCSAgICA4MDAsCQkgICAgNjAwLAkJNzUwMDAsCQkgICAgNDk1MDAsCi0gICAgLyoJaHRvdGFsLAloYmxhbmtfc3RhcnQsCWhibGFua19lbmQsCWhzeW5jX3N0YXJ0LAloc3luY19lbmQgKi8KLSAgICAxMDU2LAk4MDAsCQkgICAgMTA1NiwJCTgxNiwJCSAgICA4OTYsCi0gICAgLyoJdnRvdGFsLAl2Ymxhbmtfc3RhcnQsCXZibGFua19lbmQsCXZzeW5jX3N0YXJ0LAl2c3luY19lbmQgKi8KLSAgICA2MjUsCTYwMCwJCSAgICA2MjUsCQk2MDEsCQkgICAgNjA0LAotICAgIC8qCXBsbF9tLAlwbGxfbiwJCSAgICBwbGxfcCAqLwotICAgIDExLAkgICAgMywJCSAgICAgICAgMQotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfODAwXzYwMF8xMjAsCi0gICAgLyoJZmxhZ3MsCQkJCQl3aWR0aCwJCWhlaWdodCwJCQlmaWVsZHNfc2VjLAkgICAgY2ZyZXEgKi8KLSAgICBEQkVfVk9GX1NURVJFTywJICAgIDgwMCwJCTYwMCwJCQkxMTk4MDAsCQkgICAgODI5NzgsCi0gICAgLyoJaHRvdGFsLAloYmxhbmtfc3RhcnQsCWhibGFua19lbmQsCWhzeW5jX3N0YXJ0LAloc3luY19lbmQgKi8KLSAgICAxMDQwLAk4MDAsCQkgICAgMTA0MCwJCTg1NiwJCSAgICA5NzYsCi0gICAgLyoJdnRvdGFsLAl2Ymxhbmtfc3RhcnQsCXZibGFua19lbmQsCXZzeW5jX3N0YXJ0LAl2c3luY19lbmQgKi8KLSAgICA2NjYsCTYwMCwJCSAgICA2NjYsCQk2MzcsCQkgICAgNjQzLAotICAgIC8qCXBsbF9tLAlwbGxfbiwJCSAgICBwbGxfcCAqLwotICAgIDMxLAkgICAgNSwJCSAgICAgICAgMQotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTAyNF83NjhfNTAsCi0gICAgLyoJZmxhZ3MsCXdpZHRoLAkJICAgIGhlaWdodCwJCWZpZWxkc19zZWMsCSAgICBjZnJlcSAqLwotICAgIDAsCSAgICAxMDI0LAkJICAgIDc2OCwJCTUwMDAwLAkJICAgIDU0MTYzLAotICAgIC8qCWh0b3RhbCwJaGJsYW5rX3N0YXJ0LAloYmxhbmtfZW5kLAloc3luY19zdGFydCwJaHN5bmNfZW5kICovCi0gICAgMTM0NCwJMTAyNCwJCSAgICAxMzQ0LAkJMTA0OCwJCSAgICAxMTg0LAotICAgIC8qCXZ0b3RhbCwJdmJsYW5rX3N0YXJ0LAl2YmxhbmtfZW5kLAl2c3luY19zdGFydCwJdnN5bmNfZW5kICovCi0gICAgODA2LAk3NjgsCQkgICAgODA2LAkJNzcxLAkJICAgIDc3NywKLSAgICAvKglwbGxfbSwJcGxsX24sCQkgICAgcGxsX3AgKi8KLSAgICA0LAkgICAgMSwJCSAgICAgICAgMQotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTAyNF83NjhfNjAsCi0gICAgLyoJZmxhZ3MsCXdpZHRoLAkJCWhlaWdodCwJCWZpZWxkc19zZWMsCQljZnJlcSAqLwotICAgIDAsCSAgICAxMDI0LAkJCTc2OCwJCTYwMDA0LAkJCTY1MDAwLAotICAgIC8qCWh0b3RhbCwJaGJsYW5rX3N0YXJ0LAloYmxhbmtfZW5kLAloc3luY19zdGFydCwJaHN5bmNfZW5kICovCi0gICAgMTM0NCwJMTAyNCwJCSAgICAxMzQ0LAkJMTA0OCwJCSAgICAxMTg0LAotICAgIC8qCXZ0b3RhbCwJdmJsYW5rX3N0YXJ0LAl2YmxhbmtfZW5kLAl2c3luY19zdGFydCwJdnN5bmNfZW5kICovCi0gICAgODA2LAk3NjgsCQkgICAgODA2LAkJNzcxLAkJICAgIDc3NywKLSAgICAvKglwbGxfbSwJcGxsX24sCQkJcGxsX3AgKi8KLSAgICAxMiwJICAgIDUsCQkJCTAKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzEwMjRfNzY4Xzc1LAotICAgIC8qCWZsYWdzLAl3aWR0aCwJCQloZWlnaHQsCQlmaWVsZHNfc2VjLAkJY2ZyZXEgKi8KLSAgICAwLAkgICAgMTAyNCwJCQk3NjgsCQk3NTAyOSwJCQk3ODc1MCwKLSAgICAvKglodG90YWwsCWhibGFua19zdGFydCwJaGJsYW5rX2VuZCwJaHN5bmNfc3RhcnQsCWhzeW5jX2VuZCAqLwotICAgIDEzMTIsCTEwMjQsCQkgICAgMTMxMiwJCTEwNDAsCQkgICAgMTEzNiwKLSAgICAvKgl2dG90YWwsCXZibGFua19zdGFydCwJdmJsYW5rX2VuZCwJdnN5bmNfc3RhcnQsCXZzeW5jX2VuZCAqLwotICAgIDgwMCwJNzY4LAkJICAgIDgwMCwJCTc2OSwJCSAgICA3NzIsCi0gICAgLyoJcGxsX20sCXBsbF9uLAkJCXBsbF9wICovCi0gICAgMjksCSAgICA1LAkJCQkxCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xMDI0Xzc2OF84NSwKLSAgICAvKglmbGFncywJd2lkdGgsCQkJaGVpZ2h0LAkJZmllbGRzX3NlYywJCWNmcmVxICovCi0gICAgMCwJICAgIDEwMjQsCQkJNzY4LAkJODQ5OTcsCQkJOTQ1MDAsCi0gICAgLyoJaHRvdGFsLAloYmxhbmtfc3RhcnQsCWhibGFua19lbmQsCWhzeW5jX3N0YXJ0LAloc3luY19lbmQgKi8KLSAgICAxMzc2LAkxMDI0LAkJICAgIDEzNzYsCQkxMDcyLAkJICAgIDExNjgsCi0gICAgLyoJdnRvdGFsLAl2Ymxhbmtfc3RhcnQsCXZibGFua19lbmQsCXZzeW5jX3N0YXJ0LAl2c3luY19lbmQgKi8KLSAgICA4MDgsCTc2OCwJCSAgICA4MDgsCQk3NjksCQkgICAgNzcyLAotICAgIC8qCXBsbF9tLAlwbGxfbiwJCQlwbGxfcCAqLwotICAgIDcsCSAgICAyLAkJCQkwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xMDI0Xzc2OF8xMjAsCi0gICAgLyoJZmxhZ3MsCQkJCQl3aWR0aCwJCWhlaWdodCwJCQlmaWVsZHNfc2VjLAkJY2ZyZXEgKi8KLSAgICBEQkVfVk9GX1NURVJFTywJICAgIDEwMjQsCQk3NjgsCQkJMTE5ODAwLAkJCTEzMzE5NSwKLSAgICAvKglodG90YWwsCWhibGFua19zdGFydCwJaGJsYW5rX2VuZCwJaHN5bmNfc3RhcnQsCWhzeW5jX2VuZCAqLwotICAgIDEzNzYsCTEwMjQsCQkgICAgMTM3NiwJCTEwNzIsCQkgICAgMTE2OCwKLSAgICAvKgl2dG90YWwsCXZibGFua19zdGFydCwJdmJsYW5rX2VuZCwJdnN5bmNfc3RhcnQsCXZzeW5jX2VuZCAqLwotICAgIDgwOCwJNzY4LAkJICAgIDgwOCwJCTc2OSwJCSAgICA3NzIsCi0gICAgLyoJcGxsX20sCXBsbF9uLAkJCXBsbF9wICovCi0gICAgNSwJICAgIDEsCQkJCTAKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzEyODBfMTAyNF81MCwKLSAgICAvKglmbGFncywJd2lkdGgsCQkJaGVpZ2h0LAkJZmllbGRzX3NlYywJCWNmcmVxICovCi0gICAgMCwJICAgIDEyODAsCQkJMTAyNCwJCTUwMDAwLAkJCTg5NDYwLAotICAgIC8qCWh0b3RhbCwJaGJsYW5rX3N0YXJ0LAloYmxhbmtfZW5kLAloc3luY19zdGFydCwJaHN5bmNfZW5kICovCi0gICAgMTY4MCwJMTI4MCwJCSAgICAxNjgwLAkJMTM2MCwJCSAgICAxNDgwLAotICAgIC8qCXZ0b3RhbCwJdmJsYW5rX3N0YXJ0LAl2YmxhbmtfZW5kLAl2c3luY19zdGFydCwJdnN5bmNfZW5kICovCi0gICAgMTA2NSwJMTAyNCwJCSAgICAxMDY1LAkJMTAyNywJCSAgICAxMDMwLAotICAgIC8qCXBsbF9tLAlwbGxfbiwJCQlwbGxfcCAqLwotICAgIDEwLAkgICAgMywJCQkJMAotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTI4MF8xMDI0XzYwLAotICAgIC8qCWZsYWdzLAl3aWR0aCwJCQloZWlnaHQsCQlmaWVsZHNfc2VjLAkJY2ZyZXEgKi8KLSAgICAwLAkgICAgMTI4MCwJCQkxMDI0LAkJNjAwMjAsCQkJMTA4MDAwLAotICAgIC8qCWh0b3RhbCwJaGJsYW5rX3N0YXJ0LAloYmxhbmtfZW5kLAloc3luY19zdGFydCwJaHN5bmNfZW5kICovCi0gICAgMTY4OCwJMTI4MCwJCSAgICAxNjg4LAkJMTMyOCwJCSAgICAxNDQwLAotICAgIC8qCXZ0b3RhbCwJdmJsYW5rX3N0YXJ0LAl2YmxhbmtfZW5kLAl2c3luY19zdGFydCwJdnN5bmNfZW5kICovCi0gICAgMTA2NiwJMTAyNCwJCSAgICAxMDY2LAkJMTAyNSwJCSAgICAxMDI4LAotICAgIC8qCXBsbF9tLAlwbGxfbiwJCQlwbGxfcCAqLwotICAgIDQsCSAgICAxLAkJCSAgICAwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xMjgwXzEwMjRfNzUsCi0gICAgLyoJZmxhZ3MsCXdpZHRoLAkJCWhlaWdodCwJCWZpZWxkc19zZWMsCQljZnJlcSAqLwotICAgIDAsCSAgICAxMjgwLAkJCTEwMjQsCQk3NTAyNSwJCQkxMzUwMDAsCi0gICAgLyoJaHRvdGFsLAloYmxhbmtfc3RhcnQsCWhibGFua19lbmQsCWhzeW5jX3N0YXJ0LAloc3luY19lbmQgKi8KLSAgICAxNjg4LAkxMjgwLAkJICAgIDE2ODgsCQkxMjk2LAkJICAgIDE0NDAsCi0gICAgLyoJdnRvdGFsLAl2Ymxhbmtfc3RhcnQsCXZibGFua19lbmQsCXZzeW5jX3N0YXJ0LAl2c3luY19lbmQgKi8KLSAgICAxMDY2LAkxMDI0LAkJICAgIDEwNjYsCQkxMDI1LAkJICAgIDEwMjgsCi0gICAgLyoJcGxsX20sCXBsbF9uLAkJCXBsbF9wICovCi0gICAgNSwJICAgIDEsCQkJCTAKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzEyODBfMTAyNF84NSwKLSAgICAvKglmbGFncywJd2lkdGgsCQkgICAgaGVpZ2h0LAkJZmllbGRzX3NlYywJICAgIGNmcmVxICovCi0gICAgMCwJICAgIDEyODAsCQkgICAgMTAyNCwJCTg1MDI0LAkJICAgIDE1NzUwMCwKLSAgICAvKglodG90YWwsCWhibGFua19zdGFydCwJaGJsYW5rX2VuZCwJaHN5bmNfc3RhcnQsCWhzeW5jX2VuZCAqLwotICAgIDE3MjgsCTEyODAsCQkgICAgMTcyOCwJCTEzNDQsCQkgICAgMTUwNCwKLSAgICAvKgl2dG90YWwsCXZibGFua19zdGFydCwJdmJsYW5rX2VuZCwJdnN5bmNfc3RhcnQsCXZzeW5jX2VuZCAqLwotICAgIDEwNzIsCTEwMjQsCQkgICAgMTA3MiwJCTEwMjUsCQkgICAgMTAyOCwKLSAgICAvKglwbGxfbSwJcGxsX24sCQkgICAgcGxsX3AgKi8KLSAgICAyOSwJICAgIDUsCQkgICAgICAgIDAKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzE2MDBfMTAyNF81MywKLSAgICAvKiBmbGFncywJd2lkdGgsCQkJaGVpZ2h0LAkJZmllbGRzX3NlYywgICAgIGNmcmVxICovCi0gICAgREJFX1ZPRl9GTEFUUEFORUwgfCBEQkVfVk9GX01BR0lDS0VZLAotICAgIDE2MDAsCQkJMTAyNCwJCTUzMDAwLAkJCTEwNzQ0NywKLSAgICAvKiBodG90YWwsIGhibGFua19zdGFydCwgICBoYmxhbmtfZW5kLCAgICAgaHN5bmNfc3RhcnQsICAgIGhzeW5jX2VuZCAqLwotICAgIDE5MDAsICAgMTYwMCwgICAgICAgICAgIDE5MDAsICAgICAgICAgICAxNjMwLCAgICAgICAgICAgMTczMCwKLSAgICAvKiB2dG90YWwsIHZibGFua19zdGFydCwgICB2YmxhbmtfZW5kLCAgICAgdnN5bmNfc3RhcnQsICAgIHZzeW5jX2VuZCAqLwotICAgIDEwNjcsICAgMTAyNCwgICAgICAgICAgIDEwNjcsICAgICAgICAgICAxMDI3LCAgICAgICAgICAgMTAzMCwKLSAgICAvKiBwbGxfbSwgIHBsbF9uLCAgICAgICAgICBwbGxfcCAqLwotICAgIDQsICAgICAgMSwgICAgICAgICAgICAgIDAKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzE2MDBfMTAyNF82MCwKLSAgICAvKiBmbGFncywJCQkJCXdpZHRoLCAgICAgICAgICBoZWlnaHQsCQkJZmllbGRzX3NlYywgICAgIGNmcmVxICovCi0gICAgREJFX1ZPRl9GTEFUUEFORUwsICAgMTYwMCwgICAgICAgICAgIDEwMjQsCQkJNjAwMDAsICAgICAgICAgIDEwNjkxMywKLSAgICAvKiBodG90YWwsIGhibGFua19zdGFydCwgICBoYmxhbmtfZW5kLCAgICAgaHN5bmNfc3RhcnQsICAgIGhzeW5jX2VuZCAqLwotICAgIDE2NzAsICAgMTYwMCwgICAgICAgICAgIDE2NzAsICAgICAgICAgICAxNjMwLCAgICAgICAgICAgMTY1MCwKLSAgICAvKiB2dG90YWwsIHZibGFua19zdGFydCwgICB2YmxhbmtfZW5kLCAgICAgdnN5bmNfc3RhcnQsICAgIHZzeW5jX2VuZCAqLwotICAgIDEwNjcsICAgMTAyNCwgICAgICAgICAgIDEwNjcsICAgICAgICAgICAxMDI3LCAgICAgICAgICAgMTAzMCwKLSAgICAvKiBwbGxfbSwgIHBsbF9uLCAgICAgICAgICBwbGxfcCAqLwotICAgIDQsICAgICAgMSwgICAgICAgICAgICAgIDAKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzE2MDBfMTIwMF81MCwKLSAgICAvKiBmbGFncywgIHdpZHRoLCAgICAgICAgICBoZWlnaHQsICAgICAgICAgZmllbGRzX3NlYywgICAgIGNmcmVxICovCi0gICAgMCwgICAgICAxNjAwLCAgICAgICAgICAgMTIwMCwgICAgICAgICAgIDUwMDAwLCAgICAgICAgICAxMzA1MDAsCi0gICAgLyogaHRvdGFsLCBoYmxhbmtfc3RhcnQsICAgaGJsYW5rX2VuZCwgICAgIGhzeW5jX3N0YXJ0LCAgICBoc3luY19lbmQgKi8KLSAgICAyMDg4LCAgIDE2MDAsICAgICAgICAgICAyMDg4LCAgICAgICAgICAgMTY0NCwgICAgICAgICAgIDE3NjQsCi0gICAgLyogdnRvdGFsLCB2Ymxhbmtfc3RhcnQsICAgdmJsYW5rX2VuZCwgICAgIHZzeW5jX3N0YXJ0LCAgICB2c3luY19lbmQgKi8KLSAgICAxMjUwLCAgIDEyMDAsICAgICAgICAgICAxMjUwLCAgICAgICAgICAgMTIwNSwgICAgICAgICAgIDEyMTEsCi0gICAgLyogcGxsX20sICBwbGxfbiwgICAgICAgICAgcGxsX3AgKi8KLSAgICAyNCwgICAgIDUsICAgICAgICAgICAgICAwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xNjAwXzEyMDBfNjAsCi0gICAgLyogZmxhZ3MsICB3aWR0aCwgICAgICAgICAgaGVpZ2h0LCAgICAgICAgIGZpZWxkc19zZWMsICAgICBjZnJlcSAqLwotICAgIDAsICAgICAgMTYwMCwgICAgICAgICAgIDEyMDAsICAgICAgICAgICA1OTk0MCwgICAgICAgICAgMTYyMDAwLAotICAgIC8qIGh0b3RhbCwgaGJsYW5rX3N0YXJ0LCAgIGhibGFua19lbmQsICAgICBoc3luY19zdGFydCwgICAgaHN5bmNfZW5kICovCi0gICAgMjE2MCwgICAxNjAwLCAgICAgICAgICAgMjE2MCwgICAgICAgICAgIDE2NDQsICAgICAgICAgICAxODU2LAotICAgIC8qIHZ0b3RhbCwgdmJsYW5rX3N0YXJ0LCAgIHZibGFua19lbmQsICAgICB2c3luY19zdGFydCwgICAgdnN5bmNfZW5kICovCi0gICAgMTI1MCwgICAxMjAwLCAgICAgICAgICAgMTI1MCwgICAgICAgICAgIDEyMDEsICAgICAgICAgICAxMjA0LAotICAgIC8qIHBsbF9tLCAgcGxsX24sICAgICAgICAgIHBsbF9wICovCi0gICAgNiwJCTEsICAgICAgICAgICAgICAwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xNjAwXzEyMDBfNzUsCi0gICAgLyogZmxhZ3MsICB3aWR0aCwgICAgICAgICAgaGVpZ2h0LCAgICAgICAgIGZpZWxkc19zZWMsICAgICBjZnJlcSAqLwotICAgIDAsICAgICAgMTYwMCwgICAgICAgICAgIDEyMDAsICAgICAgICAgICA3NTAwMCwgICAgICAgICAgMjAyNTAwLAotICAgIC8qIGh0b3RhbCwgaGJsYW5rX3N0YXJ0LCAgIGhibGFua19lbmQsICAgICBoc3luY19zdGFydCwgICAgaHN5bmNfZW5kICovCi0gICAgMjE2MCwgICAxNjAwLCAgICAgICAgICAgMjE2MCwgICAgICAgICAgIDE2NDQsICAgICAgICAgICAxODU2LAotICAgIC8qIHZ0b3RhbCwgdmJsYW5rX3N0YXJ0LCAgIHZibGFua19lbmQsICAgICB2c3luY19zdGFydCwgICAgdnN5bmNfZW5kICovCi0gICAgMTI1MCwgICAxMjAwLCAgICAgICAgICAgMTI1MCwgICAgICAgICAgIDEyMDEsICAgICAgICAgICAxMjA0LAotICAgIC8qIHBsbF9tLCAgcGxsX24sICAgICAgICAgIHBsbF9wICovCi0gICAgMTUsCQkyLCAgICAgICAgICAgICAgMAotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTkyMF8xMDgwXzUwLAotICAgIC8qIGZsYWdzLCAgd2lkdGgsICAgICAgICAgIGhlaWdodCwgICAgICAgICBmaWVsZHNfc2VjLCAgICAgY2ZyZXEgKi8KLSAgICAwLCAgICAgIDE5MjAsICAgICAgICAgICAxMDgwLCAgICAgICAgICAgNTAwMDAsICAgICAgICAgIDEzMzIwMCwKLSAgICAvKiBodG90YWwsIGhibGFua19zdGFydCwgICBoYmxhbmtfZW5kLCAgICAgaHN5bmNfc3RhcnQsICAgIGhzeW5jX2VuZCAqLwotICAgIDIzNjgsICAgMTkyMCwgICAgICAgICAgIDIzNjgsICAgICAgICAgICAxOTUyLCAgICAgICAgICAgMjA5NiwKLSAgICAvKiB2dG90YWwsIHZibGFua19zdGFydCwgICB2YmxhbmtfZW5kLCAgICAgdnN5bmNfc3RhcnQsICAgIHZzeW5jX2VuZCAqLwotICAgIDExMjUsICAgMTA4MCwgICAgICAgICAgIDExMjUsICAgICAgICAgICAxMDgzLCAgICAgICAgICAgMTA4NiwKLSAgICAvKiBwbGxfbSwgIHBsbF9uLCAgICAgICAgICBwbGxfcCAqLwotICAgIDUsICAgICAgMSwgICAgICAgICAgICAgIDAKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzE5MjBfMTA4MF82MCwKLSAgICAvKiBmbGFncywgIHdpZHRoLCAgICAgICAgICBoZWlnaHQsICAgICAgICAgZmllbGRzX3NlYywgICAgIGNmcmVxICovCi0gICAgMCwgICAgICAxOTIwLCAgICAgICAgICAgMTA4MCwgICAgICAgICAgIDU5OTQwLCAgICAgICAgICAxNTk4NDAsCi0gICAgLyogaHRvdGFsLCBoYmxhbmtfc3RhcnQsICAgaGJsYW5rX2VuZCwgICAgIGhzeW5jX3N0YXJ0LCAgICBoc3luY19lbmQgKi8KLSAgICAyMzY4LCAgIDE5MjAsICAgICAgICAgICAyMzY4LCAgICAgICAgICAgMTk1MiwgICAgICAgICAgIDIwOTYsCi0gICAgLyogdnRvdGFsLCB2Ymxhbmtfc3RhcnQsICAgdmJsYW5rX2VuZCwgICAgIHZzeW5jX3N0YXJ0LCAgICB2c3luY19lbmQgKi8KLSAgICAxMTI1LCAgIDEwODAsICAgICAgICAgICAxMTI1LCAgICAgICAgICAgMTA4MywgICAgICAgICAgIDEwODYsCi0gICAgLyogcGxsX20sICBwbGxfbiwgICAgICAgICAgcGxsX3AgKi8KLSAgICA2LCAgICAgIDEsICAgICAgICAgICAgICAwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xOTIwXzEwODBfNzIsCi0gICAgLyogZmxhZ3MsICB3aWR0aCwgICAgICAgICAgaGVpZ2h0LCAgICAgICAgIGZpZWxkc19zZWMsICAgICBjZnJlcSAqLwotICAgIDAsICAgICAgMTkyMCwgICAgICAgICAgIDEwODAsICAgICAgICAgICA3MjAwMCwgICAgICAgICAgMjE2MDIzLAotICAgIC8qIGh0b3RhbCwgaGJsYW5rX3N0YXJ0LCAgIGhibGFua19lbmQsICAgICBoc3luY19zdGFydCwgICAgaHN5bmNfZW5kICovCi0gICAgMjU2MCwgICAxOTIwLCAgICAgICAgICAgMjU2MCwgICAgICAgICAgIDE5NjgsICAgICAgICAgICAyMTg0LAotICAgIC8qIHZ0b3RhbCwgdmJsYW5rX3N0YXJ0LCAgIHZibGFua19lbmQsICAgICB2c3luY19zdGFydCwgICAgdnN5bmNfZW5kICovCi0gICAgMTE3MiwgICAxMDgwLCAgICAgICAgICAgMTE3MiwgICAgICAgICAgIDEwODMsICAgICAgICAgICAxMDg2LAotICAgIC8qIHBsbF9tLCAgcGxsX24sICAgICAgICAgIHBsbF9wICovCi0gICAgOCwgICAgICAxLCAgICAgICAgICAgICAgMAotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTkyMF8xMjAwXzUwLAotICAgIC8qIGZsYWdzLCAgd2lkdGgsICAgICAgICAgIGhlaWdodCwgICAgICAgICBmaWVsZHNfc2VjLCAgICAgY2ZyZXEgKi8KLSAgICAwLCAgICAgIDE5MjAsICAgICAgICAgICAxMjAwLCAgICAgICAgICAgNTAwMDAsICAgICAgICAgIDE2MTUwMCwKLSAgICAvKiBodG90YWwsIGhibGFua19zdGFydCwgICBoYmxhbmtfZW5kLCAgICAgaHN5bmNfc3RhcnQsICAgIGhzeW5jX2VuZCAqLwotICAgIDI1ODQsICAgMTkyMCwgICAgICAgICAgIDI1ODQsICAgICAgICAgICAxOTg0LCAgICAgICAgICAgMjI0MCwKLSAgICAvKiB2dG90YWwsIHZibGFua19zdGFydCwgICB2YmxhbmtfZW5kLCAgICAgdnN5bmNfc3RhcnQsICAgIHZzeW5jX2VuZCAqLwotICAgIDEyNTAsICAgMTIwMCwgICAgICAgICAgIDEyNTAsICAgICAgICAgICAxMjAzLCAgICAgICAgICAgMTIwNiwKLSAgICAvKiBwbGxfbSwgIHBsbF9uLCAgICAgICAgICBwbGxfcCAqLwotICAgIDYsICAgICAgMSwgICAgICAgICAgICAgIDAKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzE5MjBfMTIwMF82MCwKLSAgICAvKiBmbGFncywgIHdpZHRoLCAgICAgICAgICBoZWlnaHQsICAgICAgICAgZmllbGRzX3NlYywgICAgIGNmcmVxICovCi0gICAgMCwgICAgICAxOTIwLCAgICAgICAgICAgMTIwMCwgICAgICAgICAgIDU5OTQwLCAgICAgICAgICAxOTM4MDAsCi0gICAgLyogaHRvdGFsLCBoYmxhbmtfc3RhcnQsICAgaGJsYW5rX2VuZCwgICAgIGhzeW5jX3N0YXJ0LCAgICBoc3luY19lbmQgKi8KLSAgICAyNTg0LCAgIDE5MjAsICAgICAgICAgICAyNTg0LCAgICAgICAgICAgMTk4NCwgICAgICAgICAgIDIyNDAsCi0gICAgLyogdnRvdGFsLCB2Ymxhbmtfc3RhcnQsICAgdmJsYW5rX2VuZCwgICAgIHZzeW5jX3N0YXJ0LCAgICB2c3luY19lbmQgKi8KLSAgICAxMjUwLCAgIDEyMDAsICAgICAgICAgICAxMjUwLCAgICAgICAgICAgMTIwMywgICAgICAgICAgIDEyMDYsCi0gICAgLyogcGxsX20sICBwbGxfbiwgICAgICAgICAgcGxsX3AgKi8KLSAgICAyOSwgICAgIDQsICAgICAgICAgICAgICAwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xOTIwXzEyMDBfNjYsCi0gICAgLyogZmxhZ3MsICB3aWR0aCwgICAgICAgICAgaGVpZ2h0LCAgICAgICAgIGZpZWxkc19zZWMsICAgICBjZnJlcSAqLwotICAgIDAsICAgICAgMTkyMCwgICAgICAgICAgIDEyMDAsICAgICAgICAgICA2NjAwMCwgICAgICAgICAgMjEzMTgwLAotICAgIC8qIGh0b3RhbCwgaGJsYW5rX3N0YXJ0LCAgIGhibGFua19lbmQsICAgICBoc3luY19zdGFydCwgICAgaHN5bmNfZW5kICovCi0gICAgMjU4NCwgICAxOTIwLCAgICAgICAgICAgMjU4NCwgICAgICAgICAgIDE5ODQsICAgICAgICAgICAyMjQwLAotICAgIC8qIHZ0b3RhbCwgdmJsYW5rX3N0YXJ0LCAgIHZibGFua19lbmQsICAgICB2c3luY19zdGFydCwgICAgdnN5bmNfZW5kICovCi0gICAgMTI1MCwgICAxMjAwLCAgICAgICAgICAgMTI1MCwgICAgICAgICAgIDEyMDMsICAgICAgICAgICAxMjA2LAotICAgIC8qIHBsbF9tLCAgcGxsX24sICAgICAgICAgIHBsbF9wICovCi0gICAgOCwgICAgICAxLCAgICAgICAgICAgICAgMAotICB9Ci19OwotCi0jZW5kaWYgLy8gSU5DTFVERV9USU1JTkdfVEFCTEVfREFUQQotCi0jZW5kaWYgLy8gISBfX1NHSVZXRkJfSF9fCmRpZmYgLS1naXQgYS9pcGMvY29tcGF0LmMgYi9pcGMvY29tcGF0LmMKaW5kZXggOThiOTAxNi4uYTQ2OTVhZCAxMDA2NDQKLS0tIGEvaXBjL2NvbXBhdC5jCisrKyBiL2lwYy9jb21wYXQuYwpAQCAtNzUzLDE0ICs3NTMsOCBAQAogCQkgICAgICAgdW5zaWduZWQsIG5zb3BzLAogCQkgICAgICAgY29uc3Qgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKiwgdGltZW91dCkKIHsKLQlzdHJ1Y3QgdGltZXNwZWMgX191c2VyICp0czY0ID0gTlVMTDsKLQlpZiAodGltZW91dCkgewotCQlzdHJ1Y3QgdGltZXNwZWMgdHM7Ci0JCXRzNjQgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnRzNjQpKTsKLQkJaWYgKGdldF9jb21wYXRfdGltZXNwZWMoJnRzLCB0aW1lb3V0KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAoY29weV90b191c2VyKHRzNjQsICZ0cywgc2l6ZW9mKHRzKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9CisJc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdHM2NDsKKwlpZiAoY29tcGF0X2NvbnZlcnRfdGltZXNwZWMoJnRzNjQsIHRpbWVvdXQpKQorCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gc3lzX3NlbXRpbWVkb3Aoc2VtaWQsIHRzZW1zLCBuc29wcywgdHM2NCk7CiB9CmRpZmYgLS1naXQgYS9pcGMvY29tcGF0X21xLmMgYi9pcGMvY29tcGF0X21xLmMKaW5kZXggZDU4NzQ3MjkuLjkwZDI5ZjUgMTAwNjQ0Ci0tLSBhL2lwYy9jb21wYXRfbXEuYworKysgYi9pcGMvY29tcGF0X21xLmMKQEAgLTY0LDIwICs2NCw2IEBACiAJcmV0dXJuIHN5c19tcV9vcGVuKHVfbmFtZSwgb2ZsYWcsIG1vZGUsIHApOwogfQogCi1zdGF0aWMgaW50IGNvbXBhdF9wcmVwYXJlX3RpbWVvdXQoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKnAsCi0JCQkJICBjb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqdSkKLXsKLQlzdHJ1Y3QgdGltZXNwZWMgdHM7Ci0JaWYgKCF1KSB7Ci0JCSpwID0gTlVMTDsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHRzKSk7Ci0JaWYgKGdldF9jb21wYXRfdGltZXNwZWMoJnRzLCB1KSB8fCBjb3B5X3RvX3VzZXIoKnAsICZ0cywgc2l6ZW9mKHRzKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotfQotCiBDT01QQVRfU1lTQ0FMTF9ERUZJTkU1KG1xX3RpbWVkc2VuZCwgbXFkX3QsIG1xZGVzLAogCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKiwgdV9tc2dfcHRyLAogCQkgICAgICAgY29tcGF0X3NpemVfdCwgbXNnX2xlbiwgdW5zaWduZWQgaW50LCBtc2dfcHJpbywKQEAgLTg1LDcgKzcxLDcgQEAKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgX191c2VyICp1X3RzOwogCi0JaWYgKGNvbXBhdF9wcmVwYXJlX3RpbWVvdXQoJnVfdHMsIHVfYWJzX3RpbWVvdXQpKQorCWlmIChjb21wYXRfY29udmVydF90aW1lc3BlYygmdV90cywgdV9hYnNfdGltZW91dCkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJcmV0dXJuIHN5c19tcV90aW1lZHNlbmQobXFkZXMsIHVfbXNnX3B0ciwgbXNnX2xlbiwKQEAgLTk4LDcgKzg0LDggQEAKIAkJICAgICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICosIHVfYWJzX3RpbWVvdXQpCiB7CiAJc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdV90czsKLQlpZiAoY29tcGF0X3ByZXBhcmVfdGltZW91dCgmdV90cywgdV9hYnNfdGltZW91dCkpCisKKwlpZiAoY29tcGF0X2NvbnZlcnRfdGltZXNwZWMoJnVfdHMsIHVfYWJzX3RpbWVvdXQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXJldHVybiBzeXNfbXFfdGltZWRyZWNlaXZlKG1xZGVzLCB1X21zZ19wdHIsIG1zZ19sZW4sCmRpZmYgLS1naXQgYS9rZXJuZWwvY29tcGF0LmMgYi9rZXJuZWwvY29tcGF0LmMKaW5kZXggNDg4ZmY4Yy4uZTQwYjA0MyAxMDA2NDQKLS0tIGEva2VybmVsL2NvbXBhdC5jCisrKyBiL2tlcm5lbC9jb21wYXQuYwpAQCAtMzAsMjggKzMwLDYgQEAKIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLS8qCi0gKiBHZXQvc2V0IHN0cnVjdCB0aW1ldmFsIHdpdGggc3RydWN0IHRpbWVzcGVjIG9uIHRoZSBuYXRpdmUgc2lkZQotICovCi1zdGF0aWMgaW50IGNvbXBhdF9nZXRfdGltZXZhbF9jb252ZXJ0KHN0cnVjdCB0aW1lc3BlYyAqbywKLQkJCQkgICAgICBzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICppKQotewotCWxvbmcgdXNlYzsKLQotCWlmIChnZXRfdXNlcihvLT50dl9zZWMsICZpLT50dl9zZWMpIHx8Ci0JICAgIGdldF91c2VyKHVzZWMsICZpLT50dl91c2VjKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0Jby0+dHZfbnNlYyA9IHVzZWMgKiAxMDAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNvbXBhdF9wdXRfdGltZXZhbF9jb252ZXJ0KHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKm8sCi0JCQkJICAgICAgc3RydWN0IHRpbWV2YWwgKmkpCi17Ci0JcmV0dXJuIChwdXRfdXNlcihpLT50dl9zZWMsICZvLT50dl9zZWMpIHx8Ci0JCXB1dF91c2VyKGktPnR2X3VzZWMsICZvLT50dl91c2VjKSkgPyAtRUZBVUxUIDogMDsKLX0KLQogc3RhdGljIGludCBjb21wYXRfZ2V0X3RpbWV4KHN0cnVjdCB0aW1leCAqdHhjLCBzdHJ1Y3QgY29tcGF0X3RpbWV4IF9fdXNlciAqdXRwKQogewogCW1lbXNldCh0eGMsIDAsIHNpemVvZihzdHJ1Y3QgdGltZXgpKTsKQEAgLTExNiw3ICs5NCw3IEBACiAJaWYgKHR2KSB7CiAJCXN0cnVjdCB0aW1ldmFsIGt0djsKIAkJZG9fZ2V0dGltZW9mZGF5KCZrdHYpOwotCQlpZiAoY29tcGF0X3B1dF90aW1ldmFsX2NvbnZlcnQodHYsICZrdHYpKQorCQlpZiAoY29tcGF0X3B1dF90aW1ldmFsKCZrdHYsIHR2KSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KIAlpZiAodHopIHsKQEAgLTEzMCw1OSArMTA4LDU4IEBACiBDT01QQVRfU1lTQ0FMTF9ERUZJTkUyKHNldHRpbWVvZmRheSwgc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqLCB0diwKIAkJICAgICAgIHN0cnVjdCB0aW1lem9uZSBfX3VzZXIgKiwgdHopCiB7Ci0Jc3RydWN0IHRpbWVzcGVjIGt0czsKLQlzdHJ1Y3QgdGltZXpvbmUga3R6OworCXN0cnVjdCB0aW1ldmFsIHVzZXJfdHY7CisJc3RydWN0IHRpbWVzcGVjCW5ld190czsKKwlzdHJ1Y3QgdGltZXpvbmUgbmV3X3R6OwogCiAJaWYgKHR2KSB7Ci0JCWlmIChjb21wYXRfZ2V0X3RpbWV2YWxfY29udmVydCgma3RzLCB0dikpCisJCWlmIChjb21wYXRfZ2V0X3RpbWV2YWwoJnVzZXJfdHYsIHR2KSkKIAkJCXJldHVybiAtRUZBVUxUOworCQluZXdfdHMudHZfc2VjID0gdXNlcl90di50dl9zZWM7CisJCW5ld190cy50dl9uc2VjID0gdXNlcl90di50dl91c2VjICogTlNFQ19QRVJfVVNFQzsKIAl9CiAJaWYgKHR6KSB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigma3R6LCB0eiwgc2l6ZW9mKGt0eikpKQorCQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld190eiwgdHosIHNpemVvZigqdHopKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCXJldHVybiBkb19zeXNfc2V0dGltZW9mZGF5KHR2ID8gJmt0cyA6IE5VTEwsIHR6ID8gJmt0eiA6IE5VTEwpOworCXJldHVybiBkb19zeXNfc2V0dGltZW9mZGF5KHR2ID8gJm5ld190cyA6IE5VTEwsIHR6ID8gJm5ld190eiA6IE5VTEwpOwogfQogCi1pbnQgZ2V0X2NvbXBhdF90aW1ldmFsKHN0cnVjdCB0aW1ldmFsICp0diwgY29uc3Qgc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqY3R2KQorc3RhdGljIGludCBfX2NvbXBhdF9nZXRfdGltZXZhbChzdHJ1Y3QgdGltZXZhbCAqdHYsIGNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKmN0dikKIHsKIAlyZXR1cm4gKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGN0diwgc2l6ZW9mKCpjdHYpKSB8fAogCQkJX19nZXRfdXNlcih0di0+dHZfc2VjLCAmY3R2LT50dl9zZWMpIHx8CiAJCQlfX2dldF91c2VyKHR2LT50dl91c2VjLCAmY3R2LT50dl91c2VjKSkgPyAtRUZBVUxUIDogMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGdldF9jb21wYXRfdGltZXZhbCk7CiAKLWludCBwdXRfY29tcGF0X3RpbWV2YWwoY29uc3Qgc3RydWN0IHRpbWV2YWwgKnR2LCBzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICpjdHYpCitzdGF0aWMgaW50IF9fY29tcGF0X3B1dF90aW1ldmFsKGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0diwgc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqY3R2KQogewogCXJldHVybiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGN0diwgc2l6ZW9mKCpjdHYpKSB8fAogCQkJX19wdXRfdXNlcih0di0+dHZfc2VjLCAmY3R2LT50dl9zZWMpIHx8CiAJCQlfX3B1dF91c2VyKHR2LT50dl91c2VjLCAmY3R2LT50dl91c2VjKSkgPyAtRUZBVUxUIDogMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHB1dF9jb21wYXRfdGltZXZhbCk7CiAKLWludCBnZXRfY29tcGF0X3RpbWVzcGVjKHN0cnVjdCB0aW1lc3BlYyAqdHMsIGNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICpjdHMpCitzdGF0aWMgaW50IF9fY29tcGF0X2dldF90aW1lc3BlYyhzdHJ1Y3QgdGltZXNwZWMgKnRzLCBjb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqY3RzKQogewogCXJldHVybiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgY3RzLCBzaXplb2YoKmN0cykpIHx8CiAJCQlfX2dldF91c2VyKHRzLT50dl9zZWMsICZjdHMtPnR2X3NlYykgfHwKIAkJCV9fZ2V0X3VzZXIodHMtPnR2X25zZWMsICZjdHMtPnR2X25zZWMpKSA/IC1FRkFVTFQgOiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoZ2V0X2NvbXBhdF90aW1lc3BlYyk7CiAKLWludCBwdXRfY29tcGF0X3RpbWVzcGVjKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdHMsIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICpjdHMpCitzdGF0aWMgaW50IF9fY29tcGF0X3B1dF90aW1lc3BlYyhjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRzLCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqY3RzKQogewogCXJldHVybiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGN0cywgc2l6ZW9mKCpjdHMpKSB8fAogCQkJX19wdXRfdXNlcih0cy0+dHZfc2VjLCAmY3RzLT50dl9zZWMpIHx8CiAJCQlfX3B1dF91c2VyKHRzLT50dl9uc2VjLCAmY3RzLT50dl9uc2VjKSkgPyAtRUZBVUxUIDogMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHB1dF9jb21wYXRfdGltZXNwZWMpOwogCiBpbnQgY29tcGF0X2dldF90aW1ldmFsKHN0cnVjdCB0aW1ldmFsICp0diwgY29uc3Qgdm9pZCBfX3VzZXIgKnV0dikKIHsKIAlpZiAoQ09NUEFUX1VTRV82NEJJVF9USU1FKQogCQlyZXR1cm4gY29weV9mcm9tX3VzZXIodHYsIHV0diwgc2l6ZW9mICp0dikgPyAtRUZBVUxUIDogMDsKIAllbHNlCi0JCXJldHVybiBnZXRfY29tcGF0X3RpbWV2YWwodHYsIHV0dik7CisJCXJldHVybiBfX2NvbXBhdF9nZXRfdGltZXZhbCh0diwgdXR2KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNvbXBhdF9nZXRfdGltZXZhbCk7CiAKQEAgLTE5MSw3ICsxNjgsNyBAQAogCWlmIChDT01QQVRfVVNFXzY0QklUX1RJTUUpCiAJCXJldHVybiBjb3B5X3RvX3VzZXIodXR2LCB0diwgc2l6ZW9mICp0dikgPyAtRUZBVUxUIDogMDsKIAllbHNlCi0JCXJldHVybiBwdXRfY29tcGF0X3RpbWV2YWwodHYsIHV0dik7CisJCXJldHVybiBfX2NvbXBhdF9wdXRfdGltZXZhbCh0diwgdXR2KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNvbXBhdF9wdXRfdGltZXZhbCk7CiAKQEAgLTIwMCw3ICsxNzcsNyBAQAogCWlmIChDT01QQVRfVVNFXzY0QklUX1RJTUUpCiAJCXJldHVybiBjb3B5X2Zyb21fdXNlcih0cywgdXRzLCBzaXplb2YgKnRzKSA/IC1FRkFVTFQgOiAwOwogCWVsc2UKLQkJcmV0dXJuIGdldF9jb21wYXRfdGltZXNwZWModHMsIHV0cyk7CisJCXJldHVybiBfX2NvbXBhdF9nZXRfdGltZXNwZWModHMsIHV0cyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjb21wYXRfZ2V0X3RpbWVzcGVjKTsKIApAQCAtMjA5LDEwICsxODYsMzMgQEAKIAlpZiAoQ09NUEFUX1VTRV82NEJJVF9USU1FKQogCQlyZXR1cm4gY29weV90b191c2VyKHV0cywgdHMsIHNpemVvZiAqdHMpID8gLUVGQVVMVCA6IDA7CiAJZWxzZQotCQlyZXR1cm4gcHV0X2NvbXBhdF90aW1lc3BlYyh0cywgdXRzKTsKKwkJcmV0dXJuIF9fY29tcGF0X3B1dF90aW1lc3BlYyh0cywgdXRzKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNvbXBhdF9wdXRfdGltZXNwZWMpOwogCitpbnQgY29tcGF0X2NvbnZlcnRfdGltZXNwZWMoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKmt0cywKKwkJCSAgICBjb25zdCB2b2lkIF9fdXNlciAqY3RzKQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwlzdHJ1Y3QgdGltZXNwZWMgX191c2VyICp1dHM7CisKKwlpZiAoIWN0cyB8fCBDT01QQVRfVVNFXzY0QklUX1RJTUUpIHsKKwkJKmt0cyA9IChzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopY3RzOworCQlyZXR1cm4gMDsKKwl9CisKKwl1dHMgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YodHMpKTsKKwlpZiAoIXV0cykKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvbXBhdF9nZXRfdGltZXNwZWMoJnRzLCBjdHMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoY29weV90b191c2VyKHV0cywgJnRzLCBzaXplb2YodHMpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkqa3RzID0gdXRzOworCXJldHVybiAwOworfQorCiBzdGF0aWMgbG9uZyBjb21wYXRfbmFub3NsZWVwX3Jlc3RhcnQoc3RydWN0IHJlc3RhcnRfYmxvY2sgKnJlc3RhcnQpCiB7CiAJc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnJtdHA7CkBAIC0yMjksNyArMjI5LDcgQEAKIAlpZiAocmV0KSB7CiAJCXJtdHAgPSByZXN0YXJ0LT5uYW5vc2xlZXAuY29tcGF0X3JtdHA7CiAKLQkJaWYgKHJtdHAgJiYgcHV0X2NvbXBhdF90aW1lc3BlYygmcm10LCBybXRwKSkKKwkJaWYgKHJtdHAgJiYgY29tcGF0X3B1dF90aW1lc3BlYygmcm10LCBybXRwKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KIApAQCAtMjQzLDcgKzI0Myw3IEBACiAJbW1fc2VnbWVudF90IG9sZGZzOwogCWxvbmcgcmV0OwogCi0JaWYgKGdldF9jb21wYXRfdGltZXNwZWMoJnR1LCBycXRwKSkKKwlpZiAoY29tcGF0X2dldF90aW1lc3BlYygmdHUsIHJxdHApKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmICghdGltZXNwZWNfdmFsaWQoJnR1KSkKQEAgLTI2Myw3ICsyNjMsNyBAQAogCQlyZXN0YXJ0LT5mbiA9IGNvbXBhdF9uYW5vc2xlZXBfcmVzdGFydDsKIAkJcmVzdGFydC0+bmFub3NsZWVwLmNvbXBhdF9ybXRwID0gcm10cDsKIAotCQlpZiAocm10cCAmJiBwdXRfY29tcGF0X3RpbWVzcGVjKCZybXQsIHJtdHApKQorCQlpZiAocm10cCAmJiBjb21wYXRfcHV0X3RpbWVzcGVjKCZybXQsIHJtdHApKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCkBAIC00NTEsNyArNDUxLDcgQEAKIAltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CiAKIAlzZXRfZnMoS0VSTkVMX0RTKTsKLQlyZXQgPSBzeXNfb2xkX2dldHJsaW1pdChyZXNvdXJjZSwgJnIpOworCXJldCA9IHN5c19vbGRfZ2V0cmxpbWl0KHJlc291cmNlLCAoc3RydWN0IHJsaW1pdCBfX3VzZXIgKikmcik7CiAJc2V0X2ZzKG9sZF9mcyk7CiAKIAlpZiAoIXJldCkgewpAQCAtNjQ3LDggKzY0Nyw4IEBACiBpbnQgZ2V0X2NvbXBhdF9pdGltZXJzcGVjKHN0cnVjdCBpdGltZXJzcGVjICpkc3QsCiAJCQkgIGNvbnN0IHN0cnVjdCBjb21wYXRfaXRpbWVyc3BlYyBfX3VzZXIgKnNyYykKIHsKLQlpZiAoZ2V0X2NvbXBhdF90aW1lc3BlYygmZHN0LT5pdF9pbnRlcnZhbCwgJnNyYy0+aXRfaW50ZXJ2YWwpIHx8Ci0JICAgIGdldF9jb21wYXRfdGltZXNwZWMoJmRzdC0+aXRfdmFsdWUsICZzcmMtPml0X3ZhbHVlKSkKKwlpZiAoX19jb21wYXRfZ2V0X3RpbWVzcGVjKCZkc3QtPml0X2ludGVydmFsLCAmc3JjLT5pdF9pbnRlcnZhbCkgfHwKKwkgICAgX19jb21wYXRfZ2V0X3RpbWVzcGVjKCZkc3QtPml0X3ZhbHVlLCAmc3JjLT5pdF92YWx1ZSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQpAQCAtNjU2LDggKzY1Niw4IEBACiBpbnQgcHV0X2NvbXBhdF9pdGltZXJzcGVjKHN0cnVjdCBjb21wYXRfaXRpbWVyc3BlYyBfX3VzZXIgKmRzdCwKIAkJCSAgY29uc3Qgc3RydWN0IGl0aW1lcnNwZWMgKnNyYykKIHsKLQlpZiAocHV0X2NvbXBhdF90aW1lc3BlYygmc3JjLT5pdF9pbnRlcnZhbCwgJmRzdC0+aXRfaW50ZXJ2YWwpIHx8Ci0JICAgIHB1dF9jb21wYXRfdGltZXNwZWMoJnNyYy0+aXRfdmFsdWUsICZkc3QtPml0X3ZhbHVlKSkKKwlpZiAoX19jb21wYXRfcHV0X3RpbWVzcGVjKCZzcmMtPml0X2ludGVydmFsLCAmZHN0LT5pdF9pbnRlcnZhbCkgfHwKKwkgICAgX19jb21wYXRfcHV0X3RpbWVzcGVjKCZzcmMtPml0X3ZhbHVlLCAmZHN0LT5pdF92YWx1ZSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQpAQCAtNzI3LDcgKzcyNyw3IEBACiAJbW1fc2VnbWVudF90IG9sZGZzOwogCXN0cnVjdCB0aW1lc3BlYyB0czsKIAotCWlmIChnZXRfY29tcGF0X3RpbWVzcGVjKCZ0cywgdHApKQorCWlmIChjb21wYXRfZ2V0X3RpbWVzcGVjKCZ0cywgdHApKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlvbGRmcyA9IGdldF9mcygpOwogCXNldF9mcyhLRVJORUxfRFMpOwpAQCAtNzQ5LDcgKzc0OSw3IEBACiAJZXJyID0gc3lzX2Nsb2NrX2dldHRpbWUod2hpY2hfY2xvY2ssCiAJCQkJKHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKikgJnRzKTsKIAlzZXRfZnMob2xkZnMpOwotCWlmICghZXJyICYmIHB1dF9jb21wYXRfdGltZXNwZWMoJnRzLCB0cCkpCisJaWYgKCFlcnIgJiYgY29tcGF0X3B1dF90aW1lc3BlYygmdHMsIHRwKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTc4OSw3ICs3ODksNyBAQAogCWVyciA9IHN5c19jbG9ja19nZXRyZXMod2hpY2hfY2xvY2ssCiAJCQkgICAgICAgKHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKikgJnRzKTsKIAlzZXRfZnMob2xkZnMpOwotCWlmICghZXJyICYmIHRwICYmIHB1dF9jb21wYXRfdGltZXNwZWMoJnRzLCB0cCkpCisJaWYgKCFlcnIgJiYgdHAgJiYgY29tcGF0X3B1dF90aW1lc3BlYygmdHMsIHRwKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTc5OSw3ICs3OTksNyBAQAogCWxvbmcgZXJyOwogCW1tX3NlZ21lbnRfdCBvbGRmczsKIAlzdHJ1Y3QgdGltZXNwZWMgdHU7Ci0Jc3RydWN0IGNvbXBhdF90aW1lc3BlYyAqcm10cCA9IHJlc3RhcnQtPm5hbm9zbGVlcC5jb21wYXRfcm10cDsKKwlzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqcm10cCA9IHJlc3RhcnQtPm5hbm9zbGVlcC5jb21wYXRfcm10cDsKIAogCXJlc3RhcnQtPm5hbm9zbGVlcC5ybXRwID0gKHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKikgJnR1OwogCW9sZGZzID0gZ2V0X2ZzKCk7CkBAIC04MDgsNyArODA4LDcgQEAKIAlzZXRfZnMob2xkZnMpOwogCiAJaWYgKChlcnIgPT0gLUVSRVNUQVJUX1JFU1RBUlRCTE9DSykgJiYgcm10cCAmJgotCSAgICBwdXRfY29tcGF0X3RpbWVzcGVjKCZ0dSwgcm10cCkpCisJICAgIGNvbXBhdF9wdXRfdGltZXNwZWMoJnR1LCBybXRwKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAoZXJyID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0spIHsKQEAgLTgyNyw3ICs4MjcsNyBAQAogCXN0cnVjdCB0aW1lc3BlYyBpbiwgb3V0OwogCXN0cnVjdCByZXN0YXJ0X2Jsb2NrICpyZXN0YXJ0OwogCi0JaWYgKGdldF9jb21wYXRfdGltZXNwZWMoJmluLCBycXRwKSkKKwlpZiAoY29tcGF0X2dldF90aW1lc3BlYygmaW4sIHJxdHApKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCW9sZGZzID0gZ2V0X2ZzKCk7CkBAIC04MzgsNyArODM4LDcgQEAKIAlzZXRfZnMob2xkZnMpOwogCiAJaWYgKChlcnIgPT0gLUVSRVNUQVJUX1JFU1RBUlRCTE9DSykgJiYgcm10cCAmJgotCSAgICBwdXRfY29tcGF0X3RpbWVzcGVjKCZvdXQsIHJtdHApKQorCSAgICBjb21wYXRfcHV0X3RpbWVzcGVjKCZvdXQsIHJtdHApKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmIChlcnIgPT0gLUVSRVNUQVJUX1JFU1RBUlRCTE9DSykgewpAQCAtMTEzMCw3ICsxMTMwLDcgQEAKIAlzZXRfZnMoS0VSTkVMX0RTKTsKIAlyZXQgPSBzeXNfc2NoZWRfcnJfZ2V0X2ludGVydmFsKHBpZCwgKHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKikmdCk7CiAJc2V0X2ZzKG9sZF9mcyk7Ci0JaWYgKHB1dF9jb21wYXRfdGltZXNwZWMoJnQsIGludGVydmFsKSkKKwlpZiAoY29tcGF0X3B1dF90aW1lc3BlYygmdCwgaW50ZXJ2YWwpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2Z1dGV4X2NvbXBhdC5jIGIva2VybmVsL2Z1dGV4X2NvbXBhdC5jCmluZGV4IGY5ZjQ0ZmQuLjU1YzhjOTMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mdXRleF9jb21wYXQuYworKysgYi9rZXJuZWwvZnV0ZXhfY29tcGF0LmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCWlmICh1dGltZSAmJiAoY21kID09IEZVVEVYX1dBSVQgfHwgY21kID09IEZVVEVYX0xPQ0tfUEkgfHwKIAkJICAgICAgY21kID09IEZVVEVYX1dBSVRfQklUU0VUIHx8CiAJCSAgICAgIGNtZCA9PSBGVVRFWF9XQUlUX1JFUVVFVUVfUEkpKSB7Ci0JCWlmIChnZXRfY29tcGF0X3RpbWVzcGVjKCZ0cywgdXRpbWUpKQorCQlpZiAoY29tcGF0X2dldF90aW1lc3BlYygmdHMsIHV0aW1lKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlpZiAoIXRpbWVzcGVjX3ZhbGlkKCZ0cykpCiAJCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9ocnRpbWVyLmMgYi9rZXJuZWwvaHJ0aW1lci5jCmluZGV4IDA5MDk0MzYuLmQ1NTA5MmMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ocnRpbWVyLmMKKysrIGIva2VybmVsL2hydGltZXIuYwpAQCAtMTY4LDE5ICsxNjgsNiBAQAogCX0KIH0KIAotCi0vKgotICogR2V0IHRoZSBwcmVmZXJyZWQgdGFyZ2V0IENQVSBmb3IgTk9IWgotICovCi1zdGF0aWMgaW50IGhydGltZXJfZ2V0X3RhcmdldChpbnQgdGhpc19jcHUsIGludCBwaW5uZWQpCi17Ci0jaWZkZWYgQ09ORklHX05PX0haX0NPTU1PTgotCWlmICghcGlubmVkICYmIGdldF9zeXNjdGxfdGltZXJfbWlncmF0aW9uKCkgJiYgaWRsZV9jcHUodGhpc19jcHUpKQotCQlyZXR1cm4gZ2V0X25vaHpfdGltZXJfdGFyZ2V0KCk7Ci0jZW5kaWYKLQlyZXR1cm4gdGhpc19jcHU7Ci19Ci0KIC8qCiAgKiBXaXRoIEhJR0hSRVM9eSB3ZSBkbyBub3QgbWlncmF0ZSB0aGUgdGltZXIgd2hlbiBpdCBpcyBleHBpcmluZwogICogYmVmb3JlIHRoZSBuZXh0IGV2ZW50IG9uIHRoZSB0YXJnZXQgY3B1IGJlY2F1c2Ugd2UgY2Fubm90IHJlcHJvZ3JhbQpAQCAtMjE0LDcgKzIwMSw3IEBACiAJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqbmV3X2Jhc2U7CiAJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKm5ld19jcHVfYmFzZTsKIAlpbnQgdGhpc19jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JaW50IGNwdSA9IGhydGltZXJfZ2V0X3RhcmdldCh0aGlzX2NwdSwgcGlubmVkKTsKKwlpbnQgY3B1ID0gZ2V0X25vaHpfdGltZXJfdGFyZ2V0KHBpbm5lZCk7CiAJaW50IGJhc2VudW0gPSBiYXNlLT5pbmRleDsKIAogYWdhaW46CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2NoaXAuYyBiL2tlcm5lbC9pcnEvY2hpcC5jCmluZGV4IGRjMDRjMTYuLjYzOTdkZjIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvY2hpcC5jCisrKyBiL2tlcm5lbC9pcnEvY2hpcC5jCkBAIC0yODEsNiArMjgxLDE5IEBACiAJfQogfQogCit2b2lkIHVubWFza190aHJlYWRlZF9pcnEoc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGRlc2MtPmlycV9kYXRhLmNoaXA7CisKKwlpZiAoY2hpcC0+ZmxhZ3MgJiBJUlFDSElQX0VPSV9USFJFQURFRCkKKwkJY2hpcC0+aXJxX2VvaSgmZGVzYy0+aXJxX2RhdGEpOworCisJaWYgKGNoaXAtPmlycV91bm1hc2spIHsKKwkJY2hpcC0+aXJxX3VubWFzaygmZGVzYy0+aXJxX2RhdGEpOworCQlpcnFfc3RhdGVfY2xyX21hc2tlZChkZXNjKTsKKwl9Cit9CisKIC8qCiAgKgloYW5kbGVfbmVzdGVkX2lycSAtIEhhbmRsZSBhIG5lc3RlZCBpcnEgZnJvbSBhIGlycSB0aHJlYWQKICAqCUBpcnE6CXRoZSBpbnRlcnJ1cHQgbnVtYmVyCkBAIC00MzUsNiArNDQ4LDI3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcHJlZmxvd19oYW5kbGVyKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykgeyB9CiAjZW5kaWYKIAorc3RhdGljIHZvaWQgY29uZF91bm1hc2tfZW9pX2lycShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIHN0cnVjdCBpcnFfY2hpcCAqY2hpcCkKK3sKKwlpZiAoIShkZXNjLT5pc3RhdGUgJiBJUlFTX09ORVNIT1QpKSB7CisJCWNoaXAtPmlycV9lb2koJmRlc2MtPmlycV9kYXRhKTsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIFdlIG5lZWQgdG8gdW5tYXNrIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6CisJICogLSBPbmVzaG90IGlycSB3aGljaCBkaWQgbm90IHdha2UgdGhlIHRocmVhZCAoY2F1c2VkIGJ5IGEKKwkgKiAgIHNwdXJpb3VzIGludGVycnVwdCBvciBhIHByaW1hcnkgaGFuZGxlciBoYW5kbGluZyBpdAorCSAqICAgY29tcGxldGVseSkuCisJICovCisJaWYgKCFpcnFkX2lycV9kaXNhYmxlZCgmZGVzYy0+aXJxX2RhdGEpICYmCisJICAgIGlycWRfaXJxX21hc2tlZCgmZGVzYy0+aXJxX2RhdGEpICYmICFkZXNjLT50aHJlYWRzX29uZXNob3QpIHsKKwkJY2hpcC0+aXJxX2VvaSgmZGVzYy0+aXJxX2RhdGEpOworCQl1bm1hc2tfaXJxKGRlc2MpOworCX0gZWxzZSBpZiAoIShjaGlwLT5mbGFncyAmIElSUUNISVBfRU9JX1RIUkVBREVEKSkgeworCQljaGlwLT5pcnFfZW9pKCZkZXNjLT5pcnFfZGF0YSk7CisJfQorfQorCiAvKioKICAqCWhhbmRsZV9mYXN0ZW9pX2lycSAtIGlycSBoYW5kbGVyIGZvciB0cmFuc3BhcmVudCBjb250cm9sbGVycwogICoJQGlycToJdGhlIGludGVycnVwdCBudW1iZXIKQEAgLTQ0OCw2ICs0ODIsOCBAQAogdm9pZAogaGFuZGxlX2Zhc3Rlb2lfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBkZXNjLT5pcnFfZGF0YS5jaGlwOworCiAJcmF3X3NwaW5fbG9jaygmZGVzYy0+bG9jayk7CiAKIAlpZiAodW5saWtlbHkoaXJxZF9pcnFfaW5wcm9ncmVzcygmZGVzYy0+aXJxX2RhdGEpKSkKQEAgLTQ3MywxOCArNTA5LDE0IEBACiAJcHJlZmxvd19oYW5kbGVyKGRlc2MpOwogCWhhbmRsZV9pcnFfZXZlbnQoZGVzYyk7CiAKLQlpZiAoZGVzYy0+aXN0YXRlICYgSVJRU19PTkVTSE9UKQotCQljb25kX3VubWFza19pcnEoZGVzYyk7CisJY29uZF91bm1hc2tfZW9pX2lycShkZXNjLCBjaGlwKTsKIAotb3V0X2VvaToKLQlkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfZW9pKCZkZXNjLT5pcnFfZGF0YSk7Ci1vdXRfdW5sb2NrOgogCXJhd19zcGluX3VubG9jaygmZGVzYy0+bG9jayk7CiAJcmV0dXJuOwogb3V0OgotCWlmICghKGRlc2MtPmlycV9kYXRhLmNoaXAtPmZsYWdzICYgSVJRQ0hJUF9FT0lfSUZfSEFORExFRCkpCi0JCWdvdG8gb3V0X2VvaTsKLQlnb3RvIG91dF91bmxvY2s7CisJaWYgKCEoY2hpcC0+ZmxhZ3MgJiBJUlFDSElQX0VPSV9JRl9IQU5ETEVEKSkKKwkJY2hpcC0+aXJxX2VvaSgmZGVzYy0+aXJxX2RhdGEpOworCXJhd19zcGluX3VubG9jaygmZGVzYy0+bG9jayk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9oYW5kbGUuYyBiL2tlcm5lbC9pcnEvaGFuZGxlLmMKaW5kZXggMTMxY2ExNy4uNjM1NDgwMiAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9oYW5kbGUuYworKysgYi9rZXJuZWwvaXJxL2hhbmRsZS5jCkBAIC00MSw2ICs0MSw3IEBACiB7CiAJcmV0dXJuIElSUV9OT05FOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobm9fYWN0aW9uKTsKIAogc3RhdGljIHZvaWQgd2Fybl9ub190aHJlYWQodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKQogewpAQCAtNTEsNyArNTIsNyBAQAogCSAgICAgICAiYnV0IG5vIHRocmVhZCBmdW5jdGlvbiBhdmFpbGFibGUuIiwgaXJxLCBhY3Rpb24tPm5hbWUpOwogfQogCi1zdGF0aWMgdm9pZCBpcnFfd2FrZV90aHJlYWQoc3RydWN0IGlycV9kZXNjICpkZXNjLCBzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24pCit2b2lkIF9faXJxX3dha2VfdGhyZWFkKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKQogewogCS8qCiAJICogSW4gY2FzZSB0aGUgdGhyZWFkIGNyYXNoZWQgYW5kIHdhcyBraWxsZWQgd2UganVzdCBwcmV0ZW5kIHRoYXQKQEAgLTE1Nyw3ICsxNTgsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCi0JCQlpcnFfd2FrZV90aHJlYWQoZGVzYywgYWN0aW9uKTsKKwkJCV9faXJxX3dha2VfdGhyZWFkKGRlc2MsIGFjdGlvbik7CiAKIAkJCS8qIEZhbGwgdGhyb3VnaCB0byBhZGQgdG8gcmFuZG9tbmVzcyAqLwogCQljYXNlIElSUV9IQU5ETEVEOgpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9pbnRlcm5hbHMuaCBiL2tlcm5lbC9pcnEvaW50ZXJuYWxzLmgKaW5kZXggMDAxZmE1Yi4uZGRmMWZmZSAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9pbnRlcm5hbHMuaAorKysgYi9rZXJuZWwvaXJxL2ludGVybmFscy5oCkBAIC02LDYgKzYsNyBAQAogICogb2YgdGhpcyBmaWxlIGZvciB5b3VyIG5vbiBjb3JlIGNvZGUuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pcnFkZXNjLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KIAogI2lmZGVmIENPTkZJR19TUEFSU0VfSVJRCiAjIGRlZmluZSBJUlFfQklUTUFQX0JJVFMJKE5SX0lSUVMgKyA4MTk2KQpAQCAtNzMsNiArNzQsNyBAQAogZXh0ZXJuIHZvaWQgaXJxX3BlcmNwdV9kaXNhYmxlKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgdW5zaWduZWQgaW50IGNwdSk7CiBleHRlcm4gdm9pZCBtYXNrX2lycShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOwogZXh0ZXJuIHZvaWQgdW5tYXNrX2lycShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOworZXh0ZXJuIHZvaWQgdW5tYXNrX3RocmVhZGVkX2lycShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOwogCiBleHRlcm4gdm9pZCBpbml0X2tzdGF0X2lycXMoc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgbm9kZSwgaW50IG5yKTsKIApAQCAtODIsNiArODQsNyBAQAogLyogUmVzZW5kaW5nIG9mIGludGVycnVwdHMgOiovCiB2b2lkIGNoZWNrX2lycV9yZXNlbmQoc3RydWN0IGlycV9kZXNjICpkZXNjLCB1bnNpZ25lZCBpbnQgaXJxKTsKIGJvb2wgaXJxX3dhaXRfZm9yX3BvbGwoc3RydWN0IGlycV9kZXNjICpkZXNjKTsKK3ZvaWQgX19pcnFfd2FrZV90aHJlYWQoc3RydWN0IGlycV9kZXNjICpkZXNjLCBzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24pOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIGV4dGVybiB2b2lkIHJlZ2lzdGVyX2lycV9wcm9jKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYyk7CkBAIC0xNzksMyArMTgyLDkgQEAKIHsKIAlyZXR1cm4gZC0+c3RhdGVfdXNlX2FjY2Vzc29ycyAmIG1hc2s7CiB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrc3RhdF9pbmNyX2lycXNfdGhpc19jcHUodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCV9fdGhpc19jcHVfaW5jKCpkZXNjLT5rc3RhdF9pcnFzKTsKKwlfX3RoaXNfY3B1X2luYyhrc3RhdC5pcnFzX3N1bSk7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2lycWRlc2MuYyBiL2tlcm5lbC9pcnEvaXJxZGVzYy5jCmluZGV4IDhhYjhlOTMuLmE3MTc0NjE3IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2lycWRlc2MuYworKysgYi9rZXJuZWwvaXJxL2lycWRlc2MuYwpAQCAtNDg5LDYgKzQ4OSwxMSBAQAogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXNjLT5sb2NrLCBmbGFncyk7CiB9CiAKK3ZvaWQga3N0YXRfaW5jcl9pcnFfdGhpc19jcHUodW5zaWduZWQgaW50IGlycSkKK3sKKwlrc3RhdF9pbmNyX2lycXNfdGhpc19jcHUoaXJxLCBpcnFfdG9fZGVzYyhpcnEpKTsKK30KKwogdW5zaWduZWQgaW50IGtzdGF0X2lycXNfY3B1KHVuc2lnbmVkIGludCBpcnEsIGludCBjcHUpCiB7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvbWFuYWdlLmMgYi9rZXJuZWwvaXJxL21hbmFnZS5jCmluZGV4IGQzYmY2NjAuLjI0ODZhNGMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvbWFuYWdlLmMKKysrIGIva2VybmVsL2lycS9tYW5hZ2UuYwpAQCAtMzIsMjQgKzMyLDEwIEBACiBlYXJseV9wYXJhbSgidGhyZWFkaXJxcyIsIHNldHVwX2ZvcmNlZF9pcnF0aHJlYWRzKTsKICNlbmRpZgogCi0vKioKLSAqCXN5bmNocm9uaXplX2lycSAtIHdhaXQgZm9yIHBlbmRpbmcgSVJRIGhhbmRsZXJzIChvbiBvdGhlciBDUFVzKQotICoJQGlycTogaW50ZXJydXB0IG51bWJlciB0byB3YWl0IGZvcgotICoKLSAqCVRoaXMgZnVuY3Rpb24gd2FpdHMgZm9yIGFueSBwZW5kaW5nIElSUSBoYW5kbGVycyBmb3IgdGhpcyBpbnRlcnJ1cHQKLSAqCXRvIGNvbXBsZXRlIGJlZm9yZSByZXR1cm5pbmcuIElmIHlvdSB1c2UgdGhpcyBmdW5jdGlvbiB3aGlsZQotICoJaG9sZGluZyBhIHJlc291cmNlIHRoZSBJUlEgaGFuZGxlciBtYXkgbmVlZCB5b3Ugd2lsbCBkZWFkbG9jay4KLSAqCi0gKglUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgLSB3aXRoIGNhcmUgLSBmcm9tIElSUSBjb250ZXh0LgotICovCi12b2lkIHN5bmNocm9uaXplX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgX19zeW5jaHJvbml6ZV9oYXJkaXJxKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCWJvb2wgaW5wcm9ncmVzczsKIAotCWlmICghZGVzYykKLQkJcmV0dXJuOwotCiAJZG8gewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC02NywxMiArNTMsNTYgQEAKIAogCQkvKiBPb3BzLCB0aGF0IGZhaWxlZD8gKi8KIAl9IHdoaWxlIChpbnByb2dyZXNzKTsKK30KIAotCS8qCi0JICogV2UgbWFkZSBzdXJlIHRoYXQgbm8gaGFyZGlycSBoYW5kbGVyIGlzIHJ1bm5pbmcuIE5vdyB2ZXJpZnkKLQkgKiB0aGF0IG5vIHRocmVhZGVkIGhhbmRsZXJzIGFyZSBhY3RpdmUuCi0JICovCi0Jd2FpdF9ldmVudChkZXNjLT53YWl0X2Zvcl90aHJlYWRzLCAhYXRvbWljX3JlYWQoJmRlc2MtPnRocmVhZHNfYWN0aXZlKSk7CisvKioKKyAqCXN5bmNocm9uaXplX2hhcmRpcnEgLSB3YWl0IGZvciBwZW5kaW5nIGhhcmQgSVJRIGhhbmRsZXJzIChvbiBvdGhlciBDUFVzKQorICoJQGlycTogaW50ZXJydXB0IG51bWJlciB0byB3YWl0IGZvcgorICoKKyAqCVRoaXMgZnVuY3Rpb24gd2FpdHMgZm9yIGFueSBwZW5kaW5nIGhhcmQgSVJRIGhhbmRsZXJzIGZvciB0aGlzCisgKglpbnRlcnJ1cHQgdG8gY29tcGxldGUgYmVmb3JlIHJldHVybmluZy4gSWYgeW91IHVzZSB0aGlzCisgKglmdW5jdGlvbiB3aGlsZSBob2xkaW5nIGEgcmVzb3VyY2UgdGhlIElSUSBoYW5kbGVyIG1heSBuZWVkIHlvdQorICoJd2lsbCBkZWFkbG9jay4gSXQgZG9lcyBub3QgdGFrZSBhc3NvY2lhdGVkIHRocmVhZGVkIGhhbmRsZXJzCisgKglpbnRvIGFjY291bnQuCisgKgorICoJRG8gbm90IHVzZSB0aGlzIGZvciBzaHV0ZG93biBzY2VuYXJpb3Mgd2hlcmUgeW91IG11c3QgYmUgc3VyZQorICoJdGhhdCBhbGwgcGFydHMgKGhhcmRpcnEgYW5kIHRocmVhZGVkIGhhbmRsZXIpIGhhdmUgY29tcGxldGVkLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCAtIHdpdGggY2FyZSAtIGZyb20gSVJRIGNvbnRleHQuCisgKi8KK3ZvaWQgc3luY2hyb25pemVfaGFyZGlycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CisKKwlpZiAoZGVzYykKKwkJX19zeW5jaHJvbml6ZV9oYXJkaXJxKGRlc2MpOworfQorRVhQT1JUX1NZTUJPTChzeW5jaHJvbml6ZV9oYXJkaXJxKTsKKworLyoqCisgKglzeW5jaHJvbml6ZV9pcnEgLSB3YWl0IGZvciBwZW5kaW5nIElSUSBoYW5kbGVycyAob24gb3RoZXIgQ1BVcykKKyAqCUBpcnE6IGludGVycnVwdCBudW1iZXIgdG8gd2FpdCBmb3IKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciBhbnkgcGVuZGluZyBJUlEgaGFuZGxlcnMgZm9yIHRoaXMgaW50ZXJydXB0CisgKgl0byBjb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nLiBJZiB5b3UgdXNlIHRoaXMgZnVuY3Rpb24gd2hpbGUKKyAqCWhvbGRpbmcgYSByZXNvdXJjZSB0aGUgSVJRIGhhbmRsZXIgbWF5IG5lZWQgeW91IHdpbGwgZGVhZGxvY2suCisgKgorICoJVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIC0gd2l0aCBjYXJlIC0gZnJvbSBJUlEgY29udGV4dC4KKyAqLwordm9pZCBzeW5jaHJvbml6ZV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCisJaWYgKGRlc2MpIHsKKwkJX19zeW5jaHJvbml6ZV9oYXJkaXJxKGRlc2MpOworCQkvKgorCQkgKiBXZSBtYWRlIHN1cmUgdGhhdCBubyBoYXJkaXJxIGhhbmRsZXIgaXMKKwkJICogcnVubmluZy4gTm93IHZlcmlmeSB0aGF0IG5vIHRocmVhZGVkIGhhbmRsZXJzIGFyZQorCQkgKiBhY3RpdmUuCisJCSAqLworCQl3YWl0X2V2ZW50KGRlc2MtPndhaXRfZm9yX3RocmVhZHMsCisJCQkgICAhYXRvbWljX3JlYWQoJmRlc2MtPnRocmVhZHNfYWN0aXZlKSk7CisJfQogfQogRVhQT1JUX1NZTUJPTChzeW5jaHJvbml6ZV9pcnEpOwogCkBAIC03MTgsNyArNzQ4LDcgQEAKIAogCWlmICghZGVzYy0+dGhyZWFkc19vbmVzaG90ICYmICFpcnFkX2lycV9kaXNhYmxlZCgmZGVzYy0+aXJxX2RhdGEpICYmCiAJICAgIGlycWRfaXJxX21hc2tlZCgmZGVzYy0+aXJxX2RhdGEpKQotCQl1bm1hc2tfaXJxKGRlc2MpOworCQl1bm1hc2tfdGhyZWFkZWRfaXJxKGRlc2MpOwogCiBvdXRfdW5sb2NrOgogCXJhd19zcGluX3VubG9ja19pcnEoJmRlc2MtPmxvY2spOwpAQCAtNzI3LDcgKzc1Nyw3IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAvKgotICogQ2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGNoYXNuZ2UgdGhlIGFmZmluaXR5IG9mIHRoZSBpbnRlcnJ1cHQgdGhyZWFkLgorICogQ2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgYWZmaW5pdHkgb2YgdGhlIGludGVycnVwdCB0aHJlYWQuCiAgKi8KIHN0YXRpYyB2b2lkCiBpcnFfdGhyZWFkX2NoZWNrX2FmZmluaXR5KHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKQpAQCAtODgwLDYgKzkxMCwzMyBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqCWlycV93YWtlX3RocmVhZCAtIHdha2UgdGhlIGlycSB0aHJlYWQgZm9yIHRoZSBhY3Rpb24gaWRlbnRpZmllZCBieSBkZXZfaWQKKyAqCUBpcnE6CQlJbnRlcnJ1cHQgbGluZQorICoJQGRldl9pZDoJRGV2aWNlIGlkZW50aXR5IGZvciB3aGljaCB0aGUgdGhyZWFkIHNob3VsZCBiZSB3b2tlbgorICoKKyAqLwordm9pZCBpcnFfd2FrZV90aHJlYWQodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CisJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWRlc2MgfHwgV0FSTl9PTihpcnFfc2V0dGluZ3NfaXNfcGVyX2NwdV9kZXZpZChkZXNjKSkpCisJCXJldHVybjsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOworCWZvciAoYWN0aW9uID0gZGVzYy0+YWN0aW9uOyBhY3Rpb247IGFjdGlvbiA9IGFjdGlvbi0+bmV4dCkgeworCQlpZiAoYWN0aW9uLT5kZXZfaWQgPT0gZGV2X2lkKSB7CisJCQlpZiAoYWN0aW9uLT50aHJlYWQpCisJCQkJX19pcnFfd2FrZV90aHJlYWQoZGVzYywgYWN0aW9uKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXNjLT5sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpcnFfd2FrZV90aHJlYWQpOworCiBzdGF0aWMgdm9pZCBpcnFfc2V0dXBfZm9yY2VkX3RocmVhZGluZyhzdHJ1Y3QgaXJxYWN0aW9uICpuZXcpCiB7CiAJaWYgKCFmb3JjZV9pcnF0aHJlYWRzKQpAQCAtODk2LDYgKzk1MywyMyBAQAogCX0KIH0KIAorc3RhdGljIGludCBpcnFfcmVxdWVzdF9yZXNvdXJjZXMoc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBpcnFfZGF0YSAqZCA9ICZkZXNjLT5pcnFfZGF0YTsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmMgPSBkLT5jaGlwOworCisJcmV0dXJuIGMtPmlycV9yZXF1ZXN0X3Jlc291cmNlcyA/IGMtPmlycV9yZXF1ZXN0X3Jlc291cmNlcyhkKSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIGlycV9yZWxlYXNlX3Jlc291cmNlcyhzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGlycV9kYXRhICpkID0gJmRlc2MtPmlycV9kYXRhOworCXN0cnVjdCBpcnFfY2hpcCAqYyA9IGQtPmNoaXA7CisKKwlpZiAoYy0+aXJxX3JlbGVhc2VfcmVzb3VyY2VzKQorCQljLT5pcnFfcmVsZWFzZV9yZXNvdXJjZXMoZCk7Cit9CisKIC8qCiAgKiBJbnRlcm5hbCBmdW5jdGlvbiB0byByZWdpc3RlciBhbiBpcnFhY3Rpb24gLSB0eXBpY2FsbHkgdXNlZCB0bwogICogYWxsb2NhdGUgc3BlY2lhbCBpbnRlcnJ1cHRzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGFyY2hpdGVjdHVyZS4KQEAgLTEwOTEsNiArMTE2NSwxMyBAQAogCX0KIAogCWlmICghc2hhcmVkKSB7CisJCXJldCA9IGlycV9yZXF1ZXN0X3Jlc291cmNlcyhkZXNjKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8gcmVxdWVzdCByZXNvdXJjZXMgZm9yICVzIChpcnEgJWQpIG9uIGlycWNoaXAgJXNcbiIsCisJCQkgICAgICAgbmV3LT5uYW1lLCBpcnEsIGRlc2MtPmlycV9kYXRhLmNoaXAtPm5hbWUpOworCQkJZ290byBvdXRfbWFzazsKKwkJfQorCiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRlc2MtPndhaXRfZm9yX3RocmVhZHMpOwogCiAJCS8qIFNldHVwIHRoZSB0eXBlIChsZXZlbCwgZWRnZSBwb2xhcml0eSkgaWYgY29uZmlndXJlZDogKi8KQEAgLTEyNjEsOCArMTM0MiwxMCBAQAogCSphY3Rpb25fcHRyID0gYWN0aW9uLT5uZXh0OwogCiAJLyogSWYgdGhpcyB3YXMgdGhlIGxhc3QgaGFuZGxlciwgc2h1dCBkb3duIHRoZSBJUlEgbGluZTogKi8KLQlpZiAoIWRlc2MtPmFjdGlvbikKKwlpZiAoIWRlc2MtPmFjdGlvbikgewogCQlpcnFfc2h1dGRvd24oZGVzYyk7CisJCWlycV9yZWxlYXNlX3Jlc291cmNlcyhkZXNjKTsKKwl9CiAKICNpZmRlZiBDT05GSUdfU01QCiAJLyogbWFrZSBzdXJlIGFmZmluaXR5X2hpbnQgaXMgY2xlYW5lZCB1cCAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9wcm9jLmMgYi9rZXJuZWwvaXJxL3Byb2MuYwppbmRleCAzNmY2ZWUxLi5hYzFiYTJmIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL3Byb2MuYworKysgYi9rZXJuZWwvaXJxL3Byb2MuYwpAQCAtMzI0LDE1ICszMjQsMTUgQEAKIAogI2lmZGVmIENPTkZJR19TTVAKIAkvKiBjcmVhdGUgL3Byb2MvaXJxLzxpcnE+L3NtcF9hZmZpbml0eSAqLwotCXByb2NfY3JlYXRlX2RhdGEoInNtcF9hZmZpbml0eSIsIDA2MDAsIGRlc2MtPmRpciwKKwlwcm9jX2NyZWF0ZV9kYXRhKCJzbXBfYWZmaW5pdHkiLCAwNjQ0LCBkZXNjLT5kaXIsCiAJCQkgJmlycV9hZmZpbml0eV9wcm9jX2ZvcHMsICh2b2lkICopKGxvbmcpaXJxKTsKIAogCS8qIGNyZWF0ZSAvcHJvYy9pcnEvPGlycT4vYWZmaW5pdHlfaGludCAqLwotCXByb2NfY3JlYXRlX2RhdGEoImFmZmluaXR5X2hpbnQiLCAwNDAwLCBkZXNjLT5kaXIsCisJcHJvY19jcmVhdGVfZGF0YSgiYWZmaW5pdHlfaGludCIsIDA0NDQsIGRlc2MtPmRpciwKIAkJCSAmaXJxX2FmZmluaXR5X2hpbnRfcHJvY19mb3BzLCAodm9pZCAqKShsb25nKWlycSk7CiAKIAkvKiBjcmVhdGUgL3Byb2MvaXJxLzxpcnE+L3NtcF9hZmZpbml0eV9saXN0ICovCi0JcHJvY19jcmVhdGVfZGF0YSgic21wX2FmZmluaXR5X2xpc3QiLCAwNjAwLCBkZXNjLT5kaXIsCisJcHJvY19jcmVhdGVfZGF0YSgic21wX2FmZmluaXR5X2xpc3QiLCAwNjQ0LCBkZXNjLT5kaXIsCiAJCQkgJmlycV9hZmZpbml0eV9saXN0X3Byb2NfZm9wcywgKHZvaWQgKikobG9uZylpcnEpOwogCiAJcHJvY19jcmVhdGVfZGF0YSgibm9kZSIsIDA0NDQsIGRlc2MtPmRpciwKQEAgLTM3Miw3ICszNzIsNyBAQAogc3RhdGljIHZvaWQgcmVnaXN0ZXJfZGVmYXVsdF9hZmZpbml0eV9wcm9jKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX1NNUAotCXByb2NfY3JlYXRlKCJpcnEvZGVmYXVsdF9zbXBfYWZmaW5pdHkiLCAwNjAwLCBOVUxMLAorCXByb2NfY3JlYXRlKCJpcnEvZGVmYXVsdF9zbXBfYWZmaW5pdHkiLCAwNjQ0LCBOVUxMLAogCQkgICAgJmRlZmF1bHRfYWZmaW5pdHlfcHJvY19mb3BzKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tpbmcvbXV0ZXgtZGVidWcuYyBiL2tlcm5lbC9sb2NraW5nL211dGV4LWRlYnVnLmMKaW5kZXggZTExOTFjOS4uNWNmNjczMSAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tpbmcvbXV0ZXgtZGVidWcuYworKysgYi9rZXJuZWwvbG9ja2luZy9tdXRleC1kZWJ1Zy5jCkBAIC03MSwxOCArNzEsMTcgQEAKIAogdm9pZCBkZWJ1Z19tdXRleF91bmxvY2soc3RydWN0IG11dGV4ICpsb2NrKQogewotCWlmICh1bmxpa2VseSghZGVidWdfbG9ja3MpKQotCQlyZXR1cm47CisJaWYgKGxpa2VseShkZWJ1Z19sb2NrcykpIHsKKwkJREVCVUdfTE9DS1NfV0FSTl9PTihsb2NrLT5tYWdpYyAhPSBsb2NrKTsKIAotCURFQlVHX0xPQ0tTX1dBUk5fT04obG9jay0+bWFnaWMgIT0gbG9jayk7CisJCWlmICghbG9jay0+b3duZXIpCisJCQlERUJVR19MT0NLU19XQVJOX09OKCFsb2NrLT5vd25lcik7CisJCWVsc2UKKwkJCURFQlVHX0xPQ0tTX1dBUk5fT04obG9jay0+b3duZXIgIT0gY3VycmVudCk7CiAKLQlpZiAoIWxvY2stPm93bmVyKQotCQlERUJVR19MT0NLU19XQVJOX09OKCFsb2NrLT5vd25lcik7Ci0JZWxzZQotCQlERUJVR19MT0NLU19XQVJOX09OKGxvY2stPm93bmVyICE9IGN1cnJlbnQpOwotCi0JREVCVUdfTE9DS1NfV0FSTl9PTighbG9jay0+d2FpdF9saXN0LnByZXYgJiYgIWxvY2stPndhaXRfbGlzdC5uZXh0KTsKLQltdXRleF9jbGVhcl9vd25lcihsb2NrKTsKKwkJREVCVUdfTE9DS1NfV0FSTl9PTighbG9jay0+d2FpdF9saXN0LnByZXYgJiYgIWxvY2stPndhaXRfbGlzdC5uZXh0KTsKKwkJbXV0ZXhfY2xlYXJfb3duZXIobG9jayk7CisJfQogCiAJLyoKIAkgKiBfX211dGV4X3Nsb3dwYXRoX25lZWRzX3RvX3VubG9jaygpIGlzIGV4cGxpY2l0bHkgMCBmb3IgZGVidWcKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYyBiL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYwppbmRleCAzNzE3MGQ0Li5mNGYyMDczIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMKKysrIGIva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jCkBAIC05NzMsMTYgKzk3MywyMCBAQAogc3RhdGljIHNzaXplX3QgcmVzdW1lX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbikKIHsKLQl1bnNpZ25lZCBpbnQgbWFqLCBtaW47CiAJZGV2X3QgcmVzOwotCWludCByZXQgPSAtRUlOVkFMOworCWludCBsZW4gPSBuOworCWNoYXIgKm5hbWU7CiAKLQlpZiAoc3NjYW5mKGJ1ZiwgIiV1OiV1IiwgJm1haiwgJm1pbikgIT0gMikKLQkJZ290byBvdXQ7CisJaWYgKGxlbiAmJiBidWZbbGVuLTFdID09ICdcbicpCisJCWxlbi0tOworCW5hbWUgPSBrc3RybmR1cChidWYsIGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCXJlcyA9IE1LREVWKG1haixtaW4pOwotCWlmIChtYWogIT0gTUFKT1IocmVzKSB8fCBtaW4gIT0gTUlOT1IocmVzKSkKLQkJZ290byBvdXQ7CisJcmVzID0gbmFtZV90b19kZXZfdChuYW1lKTsKKwlrZnJlZShuYW1lKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlsb2NrX3N5c3RlbV9zbGVlcCgpOwogCXN3c3VzcF9yZXN1bWVfZGV2aWNlID0gcmVzOwpAQCAtOTkwLDkgKzk5NCw3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiUE06IFN0YXJ0aW5nIG1hbnVhbCByZXN1bWUgZnJvbSBkaXNrXG4iKTsKIAlub3Jlc3VtZSA9IDA7CiAJc29mdHdhcmVfcmVzdW1lKCk7Ci0JcmV0ID0gbjsKLSBvdXQ6Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gbjsKIH0KIAogcG93ZXJfYXR0cihyZXN1bWUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL21haW4uYyBiL2tlcm5lbC9wb3dlci9tYWluLmMKaW5kZXggMWQxYmY2My4uNjI3MWJjNCAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL21haW4uYworKysgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCkBAIC0yODIsOCArMjgyLDggQEAKICAqCXN0YXRlIC0gY29udHJvbCBzeXN0ZW0gcG93ZXIgc3RhdGUuCiAgKgogICoJc2hvdygpIHJldHVybnMgd2hhdCBzdGF0ZXMgYXJlIHN1cHBvcnRlZCwgd2hpY2ggaXMgaGFyZC1jb2RlZCB0bwotICoJJ3N0YW5kYnknIChQb3dlci1PbiBTdXNwZW5kKSwgJ21lbScgKFN1c3BlbmQtdG8tUkFNKSwgYW5kCi0gKgknZGlzaycgKFN1c3BlbmQtdG8tRGlzaykuCisgKgknZnJlZXplJyAoTG93LVBvd2VyIElkbGUpLCAnc3RhbmRieScgKFBvd2VyLU9uIFN1c3BlbmQpLAorICoJJ21lbScgKFN1c3BlbmQtdG8tUkFNKSwgYW5kICdkaXNrJyAoU3VzcGVuZC10by1EaXNrKS4KICAqCiAgKglzdG9yZSgpIGFjY2VwdHMgb25lIG9mIHRob3NlIHN0cmluZ3MsIHRyYW5zbGF0ZXMgaXQgaW50byB0aGUKICAqCXByb3BlciBlbnVtZXJhdGVkIHZhbHVlLCBhbmQgaW5pdGlhdGVzIGEgc3VzcGVuZCB0cmFuc2l0aW9uLgpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3Bvd2VyLmggYi9rZXJuZWwvcG93ZXIvcG93ZXIuaAppbmRleCA3ZDRiN2ZmLi4xY2E3NTMxIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvcG93ZXIuaAorKysgYi9rZXJuZWwvcG93ZXIvcG93ZXIuaApAQCAtNDksNiArNDksOCBAQAogICovCiAjZGVmaW5lIFNQQVJFX1BBR0VTCSgoMTAyNCAqIDEwMjQpID4+IFBBR0VfU0hJRlQpCiAKK2FzbWxpbmthZ2UgaW50IHN3c3VzcF9zYXZlKHZvaWQpOworCiAvKiBrZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMgKi8KIGV4dGVybiBib29sIGZyZWV6ZXJfdGVzdF9kb25lOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvcW9zLmMgYi9rZXJuZWwvcG93ZXIvcW9zLmMKaW5kZXggOGRmZjliNC4uODg0Yjc3MCAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3Fvcy5jCisrKyBiL2tlcm5lbC9wb3dlci9xb3MuYwpAQCAtNjYsNiArNjYsNyBAQAogCS5saXN0ID0gUExJU1RfSEVBRF9JTklUKGNwdV9kbWFfY29uc3RyYWludHMubGlzdCksCiAJLnRhcmdldF92YWx1ZSA9IFBNX1FPU19DUFVfRE1BX0xBVF9ERUZBVUxUX1ZBTFVFLAogCS5kZWZhdWx0X3ZhbHVlID0gUE1fUU9TX0NQVV9ETUFfTEFUX0RFRkFVTFRfVkFMVUUsCisJLm5vX2NvbnN0cmFpbnRfdmFsdWUgPSBQTV9RT1NfQ1BVX0RNQV9MQVRfREVGQVVMVF9WQUxVRSwKIAkudHlwZSA9IFBNX1FPU19NSU4sCiAJLm5vdGlmaWVycyA9ICZjcHVfZG1hX2xhdF9ub3RpZmllciwKIH07CkBAIC03OSw2ICs4MCw3IEBACiAJLmxpc3QgPSBQTElTVF9IRUFEX0lOSVQobmV0d29ya19sYXRfY29uc3RyYWludHMubGlzdCksCiAJLnRhcmdldF92YWx1ZSA9IFBNX1FPU19ORVRXT1JLX0xBVF9ERUZBVUxUX1ZBTFVFLAogCS5kZWZhdWx0X3ZhbHVlID0gUE1fUU9TX05FVFdPUktfTEFUX0RFRkFVTFRfVkFMVUUsCisJLm5vX2NvbnN0cmFpbnRfdmFsdWUgPSBQTV9RT1NfTkVUV09SS19MQVRfREVGQVVMVF9WQUxVRSwKIAkudHlwZSA9IFBNX1FPU19NSU4sCiAJLm5vdGlmaWVycyA9ICZuZXR3b3JrX2xhdF9ub3RpZmllciwKIH07CkBAIC05Myw2ICs5NSw3IEBACiAJLmxpc3QgPSBQTElTVF9IRUFEX0lOSVQobmV0d29ya190cHV0X2NvbnN0cmFpbnRzLmxpc3QpLAogCS50YXJnZXRfdmFsdWUgPSBQTV9RT1NfTkVUV09SS19USFJPVUdIUFVUX0RFRkFVTFRfVkFMVUUsCiAJLmRlZmF1bHRfdmFsdWUgPSBQTV9RT1NfTkVUV09SS19USFJPVUdIUFVUX0RFRkFVTFRfVkFMVUUsCisJLm5vX2NvbnN0cmFpbnRfdmFsdWUgPSBQTV9RT1NfTkVUV09SS19USFJPVUdIUFVUX0RFRkFVTFRfVkFMVUUsCiAJLnR5cGUgPSBQTV9RT1NfTUFYLAogCS5ub3RpZmllcnMgPSAmbmV0d29ya190aHJvdWdocHV0X25vdGlmaWVyLAogfTsKQEAgLTEyOCw3ICsxMzEsNyBAQAogc3RhdGljIGlubGluZSBpbnQgcG1fcW9zX2dldF92YWx1ZShzdHJ1Y3QgcG1fcW9zX2NvbnN0cmFpbnRzICpjKQogewogCWlmIChwbGlzdF9oZWFkX2VtcHR5KCZjLT5saXN0KSkKLQkJcmV0dXJuIGMtPmRlZmF1bHRfdmFsdWU7CisJCXJldHVybiBjLT5ub19jb25zdHJhaW50X3ZhbHVlOwogCiAJc3dpdGNoIChjLT50eXBlKSB7CiAJY2FzZSBQTV9RT1NfTUlOOgpAQCAtMTcwLDYgKzE3Myw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcHJldl92YWx1ZSwgY3Vycl92YWx1ZSwgbmV3X3ZhbHVlOworCWludCByZXQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG1fcW9zX2xvY2ssIGZsYWdzKTsKIAlwcmV2X3ZhbHVlID0gcG1fcW9zX2dldF92YWx1ZShjKTsKQEAgLTIwNSwxMyArMjA5LDE1IEBACiAKIAl0cmFjZV9wbV9xb3NfdXBkYXRlX3RhcmdldChhY3Rpb24sIHByZXZfdmFsdWUsIGN1cnJfdmFsdWUpOwogCWlmIChwcmV2X3ZhbHVlICE9IGN1cnJfdmFsdWUpIHsKLQkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbihjLT5ub3RpZmllcnMsCi0JCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpY3Vycl92YWx1ZSwKLQkJCQkJICAgICBOVUxMKTsKLQkJcmV0dXJuIDE7CisJCXJldCA9IDE7CisJCWlmIChjLT5ub3RpZmllcnMpCisJCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKGMtPm5vdGlmaWVycywKKwkJCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpY3Vycl92YWx1ZSwKKwkJCQkJCSAgICAgTlVMTCk7CiAJfSBlbHNlIHsKLQkJcmV0dXJuIDA7CisJCXJldCA9IDA7CiAJfQorCXJldHVybiByZXQ7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMgYi9rZXJuZWwvcG93ZXIvc25hcHNob3QuYwppbmRleCBkOWY2MWExLi4xNDllNzQ1IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuYworKysgYi9rZXJuZWwvcG93ZXIvc25hcHNob3QuYwpAQCAtMTI2OCw3ICsxMjY4LDcgQEAKICAqIFtudW1iZXIgb2Ygc2F2ZWFibGUgcGFnZXNdIC0gW251bWJlciBvZiBwYWdlcyB0aGF0IGNhbiBiZSBmcmVlZCBpbiB0aGVvcnldCiAgKgogICogd2hlcmUgdGhlIHNlY29uZCB0ZXJtIGlzIHRoZSBzdW0gb2YgKDEpIHJlY2xhaW1hYmxlIHNsYWIgcGFnZXMsICgyKSBhY3RpdmUKLSAqIGFuZCAoMykgaW5hY3RpdmUgYW5vbnltb3VucyBwYWdlcywgKDQpIGFjdGl2ZSBhbmQgKDUpIGluYWN0aXZlIGZpbGUgcGFnZXMsCisgKiBhbmQgKDMpIGluYWN0aXZlIGFub255bW91cyBwYWdlcywgKDQpIGFjdGl2ZSBhbmQgKDUpIGluYWN0aXZlIGZpbGUgcGFnZXMsCiAgKiBtaW51cyBtYXBwZWQgZmlsZSBwYWdlcy4KICAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbWluaW11bV9pbWFnZV9zaXplKHVuc2lnbmVkIGxvbmcgc2F2ZWFibGUpCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc3VzcGVuZC5jIGIva2VybmVsL3Bvd2VyL3N1c3BlbmQuYwppbmRleCA2MmVlNDM3Li45MGIzZDkzIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvc3VzcGVuZC5jCisrKyBiL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMKQEAgLTM5LDcgKzM5LDcgQEAKIAogc3RhdGljIGJvb2wgbmVlZF9zdXNwZW5kX29wcyhzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCiB7Ci0JcmV0dXJuICEhKHN0YXRlID4gUE1fU1VTUEVORF9GUkVFWkUpOworCXJldHVybiBzdGF0ZSA+IFBNX1NVU1BFTkRfRlJFRVpFOwogfQogCiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoc3VzcGVuZF9mcmVlemVfd2FpdF9oZWFkKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci93YWtlbG9jay5jIGIva2VybmVsL3Bvd2VyL3dha2Vsb2NrLmMKaW5kZXggOGY1MGRlMy4uMDE5MDY5YyAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3dha2Vsb2NrLmMKKysrIGIva2VybmVsL3Bvd2VyL3dha2Vsb2NrLmMKQEAgLTE4LDYgKzE4LDggQEAKICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKKyNpbmNsdWRlICJwb3dlci5oIgorCiBzdGF0aWMgREVGSU5FX01VVEVYKHdha2Vsb2Nrc19sb2NrKTsKIAogc3RydWN0IHdha2Vsb2NrIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yZXNvdXJjZS5jIGIva2VybmVsL3Jlc291cmNlLmMKaW5kZXggM2YyODVkYy4uNjczMDYxYyAxMDA2NDQKLS0tIGEva2VybmVsL3Jlc291cmNlLmMKKysrIGIva2VybmVsL3Jlc291cmNlLmMKQEAgLTQzMiwxMSArNDMyLDYgQEAKIAkJcmVzLT5lbmQgPSBtYXg7CiB9CiAKLXN0YXRpYyBib29sIHJlc291cmNlX2NvbnRhaW5zKHN0cnVjdCByZXNvdXJjZSAqcmVzMSwgc3RydWN0IHJlc291cmNlICpyZXMyKQotewotCXJldHVybiByZXMxLT5zdGFydCA8PSByZXMyLT5zdGFydCAmJiByZXMxLT5lbmQgPj0gcmVzMi0+ZW5kOwotfQotCiAvKgogICogRmluZCBlbXB0eSBzbG90IGluIHRoZSByZXNvdXJjZSB0cmVlIHdpdGggdGhlIGdpdmVuIHJhbmdlIGFuZAogICogYWxpZ25tZW50IGNvbnN0cmFpbnRzCkBAIC00NzEsMTAgKzQ2NiwxMSBAQAogCQlhcmNoX3JlbW92ZV9yZXNlcnZhdGlvbnMoJnRtcCk7CiAKIAkJLyogQ2hlY2sgZm9yIG92ZXJmbG93IGFmdGVyIEFMSUdOKCkgKi8KLQkJYXZhaWwgPSAqbmV3OwogCQlhdmFpbC5zdGFydCA9IEFMSUdOKHRtcC5zdGFydCwgY29uc3RyYWludC0+YWxpZ24pOwogCQlhdmFpbC5lbmQgPSB0bXAuZW5kOworCQlhdmFpbC5mbGFncyA9IG5ldy0+ZmxhZ3MgJiB+SU9SRVNPVVJDRV9VTlNFVDsKIAkJaWYgKGF2YWlsLnN0YXJ0ID49IHRtcC5zdGFydCkgeworCQkJYWxsb2MuZmxhZ3MgPSBhdmFpbC5mbGFnczsKIAkJCWFsbG9jLnN0YXJ0ID0gY29uc3RyYWludC0+YWxpZ25mKGNvbnN0cmFpbnQtPmFsaWduZl9kYXRhLCAmYXZhaWwsCiAJCQkJCXNpemUsIGNvbnN0cmFpbnQtPmFsaWduKTsKIAkJCWFsbG9jLmVuZCA9IGFsbG9jLnN0YXJ0ICsgc2l6ZSAtIDE7CkBAIC05NDksOCArOTQ1LDggQEAKIAlyZXMtPm5hbWUgPSBuYW1lOwogCXJlcy0+c3RhcnQgPSBzdGFydDsKIAlyZXMtPmVuZCA9IHN0YXJ0ICsgbiAtIDE7Ci0JcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfQlVTWTsKLQlyZXMtPmZsYWdzIHw9IGZsYWdzOworCXJlcy0+ZmxhZ3MgPSByZXNvdXJjZV90eXBlKHBhcmVudCk7CisJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX0JVU1kgfCBmbGFnczsKIAogCXdyaXRlX2xvY2soJnJlc291cmNlX2xvY2spOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvY29yZS5jIGIva2VybmVsL3NjaGVkL2NvcmUuYwppbmRleCBhNDc5MDJjLi45Y2FlMjg2IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvY29yZS5jCisrKyBiL2tlcm5lbC9zY2hlZC9jb3JlLmMKQEAgLTQzMiw3ICs0MzIsNyBAQAogCWlmIChycSA9PSB0aGlzX3JxKCkpIHsKIAkJX19ocnRpY2tfcmVzdGFydChycSk7CiAJfSBlbHNlIGlmICghcnEtPmhydGlja19jc2RfcGVuZGluZykgewotCQlfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHVfb2YocnEpLCAmcnEtPmhydGlja19jc2QsIDApOworCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGVfYXN5bmMoY3B1X29mKHJxKSwgJnJxLT5ocnRpY2tfY3NkKTsKIAkJcnEtPmhydGlja19jc2RfcGVuZGluZyA9IDE7CiAJfQogfQpAQCAtNTU1LDEyICs1NTUsMTUgQEAKICAqIHNlbGVjdGluZyBhbiBpZGxlIGNwdSB3aWxsIGFkZCBtb3JlIGRlbGF5cyB0byB0aGUgdGltZXJzIHRoYW4gaW50ZW5kZWQKICAqIChhcyB0aGF0IGNwdSdzIHRpbWVyIGJhc2UgbWF5IG5vdCBiZSB1cHRvZGF0ZSB3cnQgamlmZmllcyBldGMpLgogICovCi1pbnQgZ2V0X25vaHpfdGltZXJfdGFyZ2V0KHZvaWQpCitpbnQgZ2V0X25vaHpfdGltZXJfdGFyZ2V0KGludCBwaW5uZWQpCiB7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlpbnQgaTsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKIAorCWlmIChwaW5uZWQgfHwgIWdldF9zeXNjdGxfdGltZXJfbWlncmF0aW9uKCkgfHwgIWlkbGVfY3B1KGNwdSkpCisJCXJldHVybiBjcHU7CisKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yX2VhY2hfZG9tYWluKGNwdSwgc2QpIHsKIAkJZm9yX2VhY2hfY3B1KGksIHNjaGVkX2RvbWFpbl9zcGFuKHNkKSkgewpAQCAtODIzLDE5ICs4MjYsMTMgQEAKICNlbmRpZgogI2lmZGVmIENPTkZJR19QQVJBVklSVF9USU1FX0FDQ09VTlRJTkcKIAlpZiAoc3RhdGljX2tleV9mYWxzZSgoJnBhcmF2aXJ0X3N0ZWFsX3JxX2VuYWJsZWQpKSkgewotCQl1NjQgc3Q7Ci0KIAkJc3RlYWwgPSBwYXJhdmlydF9zdGVhbF9jbG9jayhjcHVfb2YocnEpKTsKIAkJc3RlYWwgLT0gcnEtPnByZXZfc3RlYWxfdGltZV9ycTsKIAogCQlpZiAodW5saWtlbHkoc3RlYWwgPiBkZWx0YSkpCiAJCQlzdGVhbCA9IGRlbHRhOwogCi0JCXN0ID0gc3RlYWxfdGlja3Moc3RlYWwpOwotCQlzdGVhbCA9IHN0ICogVElDS19OU0VDOwotCiAJCXJxLT5wcmV2X3N0ZWFsX3RpbWVfcnEgKz0gc3RlYWw7Ci0KIAkJZGVsdGEgLT0gc3RlYWw7CiAJfQogI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvY3B1dGltZS5jIGIva2VybmVsL3NjaGVkL2NwdXRpbWUuYwppbmRleCA1ODYyNGE2Li5hOTUwOTdjIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvY3B1dGltZS5jCisrKyBiL2tlcm5lbC9zY2hlZC9jcHV0aW1lLmMKQEAgLTI1OCwxNiArMjU4LDIyIEBACiB7CiAjaWZkZWYgQ09ORklHX1BBUkFWSVJUCiAJaWYgKHN0YXRpY19rZXlfZmFsc2UoJnBhcmF2aXJ0X3N0ZWFsX2VuYWJsZWQpKSB7Ci0JCXU2NCBzdGVhbCwgc3QgPSAwOworCQl1NjQgc3RlYWw7CisJCWNwdXRpbWVfdCBzdGVhbF9jdDsKIAogCQlzdGVhbCA9IHBhcmF2aXJ0X3N0ZWFsX2Nsb2NrKHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJCXN0ZWFsIC09IHRoaXNfcnEoKS0+cHJldl9zdGVhbF90aW1lOwogCi0JCXN0ID0gc3RlYWxfdGlja3Moc3RlYWwpOwotCQl0aGlzX3JxKCktPnByZXZfc3RlYWxfdGltZSArPSBzdCAqIFRJQ0tfTlNFQzsKKwkJLyoKKwkJICogY3B1dGltZV90IG1heSBiZSBsZXNzIHByZWNpc2UgdGhhbiBuc2VjcyAoZWc6IGlmIGl0J3MKKwkJICogYmFzZWQgb24gamlmZmllcykuIExldHMgY2FzdCB0aGUgcmVzdWx0IHRvIGNwdXRpbWUKKwkJICogZ3JhbnVsYXJpdHkgYW5kIGFjY291bnQgdGhlIHJlc3Qgb24gdGhlIG5leHQgcm91bmRzLgorCQkgKi8KKwkJc3RlYWxfY3QgPSBuc2Vjc190b19jcHV0aW1lKHN0ZWFsKTsKKwkJdGhpc19ycSgpLT5wcmV2X3N0ZWFsX3RpbWUgKz0gY3B1dGltZV90b19uc2VjcyhzdGVhbF9jdCk7CiAKLQkJYWNjb3VudF9zdGVhbF90aW1lKHN0KTsKLQkJcmV0dXJuIHN0OworCQlhY2NvdW50X3N0ZWFsX3RpbWUoc3RlYWxfY3QpOworCQlyZXR1cm4gc3RlYWxfY3Q7CiAJfQogI2VuZGlmCiAJcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL3NjaGVkLmggYi9rZXJuZWwvc2NoZWQvc2NoZWQuaAppbmRleCBmMmRlN2ExLi5jOTAwN2YyIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvc2NoZWQuaAorKysgYi9rZXJuZWwvc2NoZWQvc2NoZWQuaApAQCAtMTIxNiwxNiArMTIxNiw2IEBACiAKIGV4dGVybiB2b2lkIGluaXRfdGFza19ydW5uYWJsZV9hdmVyYWdlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiAKLSNpZmRlZiBDT05GSUdfUEFSQVZJUlQKLXN0YXRpYyBpbmxpbmUgdTY0IHN0ZWFsX3RpY2tzKHU2NCBzdGVhbCkKLXsKLQlpZiAodW5saWtlbHkoc3RlYWwgPiBOU0VDX1BFUl9TRUMpKQotCQlyZXR1cm4gZGl2X3U2NChzdGVhbCwgVElDS19OU0VDKTsKLQotCXJldHVybiBfX2l0ZXJfZGl2X3U2NF9yZW0oc3RlYWwsIFRJQ0tfTlNFQywgJnN0ZWFsKTsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5jX25yX3J1bm5pbmcoc3RydWN0IHJxICpycSkKIHsKIAlycS0+bnJfcnVubmluZysrOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NtcC5jIGIva2VybmVsL3NtcC5jCmluZGV4IGZmZWUzNWIuLjA2ZDU3NGUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zbXAuYworKysgYi9rZXJuZWwvc21wLmMKQEAgLTExNywxMyArMTE3LDQzIEBACiAJY3NkLT5mbGFncyAmPSB+Q1NEX0ZMQUdfTE9DSzsKIH0KIAorc3RhdGljIERFRklORV9QRVJfQ1BVX1NIQVJFRF9BTElHTkVEKHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhLCBjc2RfZGF0YSk7CisKIC8qCiAgKiBJbnNlcnQgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBjYWxsX3NpbmdsZV9kYXRhIGVsZW1lbnQKICAqIGZvciBleGVjdXRpb24gb24gdGhlIGdpdmVuIENQVS4gZGF0YSBtdXN0IGFscmVhZHkgaGF2ZQogICogLT5mdW5jLCAtPmluZm8sIGFuZCAtPmZsYWdzIHNldC4KICAqLwotc3RhdGljIHZvaWQgZ2VuZXJpY19leGVjX3NpbmdsZShpbnQgY3B1LCBzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqY3NkLCBpbnQgd2FpdCkKK3N0YXRpYyBpbnQgZ2VuZXJpY19leGVjX3NpbmdsZShpbnQgY3B1LCBzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqY3NkLAorCQkJICAgICAgIHNtcF9jYWxsX2Z1bmNfdCBmdW5jLCB2b2lkICppbmZvLCBpbnQgd2FpdCkKIHsKKwlzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSBjc2Rfc3RhY2sgPSB7IC5mbGFncyA9IDAgfTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisKKwlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkgeworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWZ1bmMoaW5mbyk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisKKwlpZiAoKHVuc2lnbmVkKWNwdSA+PSBucl9jcHVfaWRzIHx8ICFjcHVfb25saW5lKGNwdSkpCisJCXJldHVybiAtRU5YSU87CisKKworCWlmICghY3NkKSB7CisJCWNzZCA9ICZjc2Rfc3RhY2s7CisJCWlmICghd2FpdCkKKwkJCWNzZCA9ICZfX2dldF9jcHVfdmFyKGNzZF9kYXRhKTsKKwl9CisKKwljc2RfbG9jayhjc2QpOworCisJY3NkLT5mdW5jID0gZnVuYzsKKwljc2QtPmluZm8gPSBpbmZvOworCiAJaWYgKHdhaXQpCiAJCWNzZC0+ZmxhZ3MgfD0gQ1NEX0ZMQUdfV0FJVDsKIApAQCAtMTQzLDYgKzE3Myw4IEBACiAKIAlpZiAod2FpdCkKIAkJY3NkX2xvY2tfd2FpdChjc2QpOworCisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNTEsNyArMTgzLDggQEAKICAqLwogdm9pZCBnZW5lcmljX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pbnRlcnJ1cHQodm9pZCkKIHsKLQlzdHJ1Y3QgbGxpc3Rfbm9kZSAqZW50cnksICpuZXh0OworCXN0cnVjdCBsbGlzdF9ub2RlICplbnRyeTsKKwlzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqY3NkLCAqY3NkX25leHQ7CiAKIAkvKgogCSAqIFNob3VsZG4ndCByZWNlaXZlIHRoaXMgaW50ZXJydXB0IG9uIGEgY3B1IHRoYXQgaXMgbm90IHlldCBvbmxpbmUuCkBAIC0xNjEsMjEgKzE5NCwxMiBAQAogCWVudHJ5ID0gbGxpc3RfZGVsX2FsbCgmX19nZXRfY3B1X3ZhcihjYWxsX3NpbmdsZV9xdWV1ZSkpOwogCWVudHJ5ID0gbGxpc3RfcmV2ZXJzZV9vcmRlcihlbnRyeSk7CiAKLQl3aGlsZSAoZW50cnkpIHsKLQkJc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgKmNzZDsKLQotCQluZXh0ID0gZW50cnktPm5leHQ7Ci0KLQkJY3NkID0gbGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhLCBsbGlzdCk7CisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjc2QsIGNzZF9uZXh0LCBlbnRyeSwgbGxpc3QpIHsKIAkJY3NkLT5mdW5jKGNzZC0+aW5mbyk7CiAJCWNzZF91bmxvY2soY3NkKTsKLQotCQllbnRyeSA9IG5leHQ7CiAJfQogfQogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFVfU0hBUkVEX0FMSUdORUQoc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEsIGNzZF9kYXRhKTsKLQogLyoKICAqIHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSAtIFJ1biBhIGZ1bmN0aW9uIG9uIGEgc3BlY2lmaWMgQ1BVCiAgKiBAZnVuYzogVGhlIGZ1bmN0aW9uIHRvIHJ1bi4gVGhpcyBtdXN0IGJlIGZhc3QgYW5kIG5vbi1ibG9ja2luZy4KQEAgLTE4NywxMiArMjExLDggQEAKIGludCBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoaW50IGNwdSwgc21wX2NhbGxfZnVuY190IGZ1bmMsIHZvaWQgKmluZm8sCiAJCQkgICAgIGludCB3YWl0KQogewotCXN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhIGQgPSB7Ci0JCS5mbGFncyA9IDAsCi0JfTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCB0aGlzX2NwdTsKLQlpbnQgZXJyID0gMDsKKwlpbnQgZXJyOwogCiAJLyoKIAkgKiBwcmV2ZW50IHByZWVtcHRpb24gYW5kIHJlc2NoZWR1bGUgb24gYW5vdGhlciBwcm9jZXNzb3IsCkBAIC0yMDksMjYgKzIyOSw3IEBACiAJV0FSTl9PTl9PTkNFKGNwdV9vbmxpbmUodGhpc19jcHUpICYmIGlycXNfZGlzYWJsZWQoKQogCQkgICAgICYmICFvb3BzX2luX3Byb2dyZXNzKTsKIAotCWlmIChjcHUgPT0gdGhpc19jcHUpIHsKLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQlmdW5jKGluZm8pOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JfSBlbHNlIHsKLQkJaWYgKCh1bnNpZ25lZCljcHUgPCBucl9jcHVfaWRzICYmIGNwdV9vbmxpbmUoY3B1KSkgewotCQkJc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgKmNzZCA9ICZkOwotCi0JCQlpZiAoIXdhaXQpCi0JCQkJY3NkID0gJl9fZ2V0X2NwdV92YXIoY3NkX2RhdGEpOwotCi0JCQljc2RfbG9jayhjc2QpOwotCi0JCQljc2QtPmZ1bmMgPSBmdW5jOwotCQkJY3NkLT5pbmZvID0gaW5mbzsKLQkJCWdlbmVyaWNfZXhlY19zaW5nbGUoY3B1LCBjc2QsIHdhaXQpOwotCQl9IGVsc2UgewotCQkJZXJyID0gLUVOWElPOwkvKiBDUFUgbm90IG9ubGluZSAqLwotCQl9Ci0JfQorCWVyciA9IGdlbmVyaWNfZXhlY19zaW5nbGUoY3B1LCBOVUxMLCBmdW5jLCBpbmZvLCB3YWl0KTsKIAogCXB1dF9jcHUoKTsKIApAQCAtMjM2LDYgKzIzNywzNCBAQAogfQogRVhQT1JUX1NZTUJPTChzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUpOwogCisvKioKKyAqIHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9hc3luYygpOiBSdW4gYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9uIGEKKyAqIAkJCSAgICAgICAgIHNwZWNpZmljIENQVS4KKyAqIEBjcHU6IFRoZSBDUFUgdG8gcnVuIG9uLgorICogQGNzZDogUHJlLWFsbG9jYXRlZCBhbmQgc2V0dXAgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBMaWtlIHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSgpLCBidXQgdGhlIGNhbGwgaXMgYXN5bmNob25vdXMgYW5kCisgKiBjYW4gdGh1cyBiZSBkb25lIGZyb20gY29udGV4dHMgd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzLgorICoKKyAqIFRoZSBjYWxsZXIgcGFzc2VzIGhpcyBvd24gcHJlLWFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZQorICogKGllOiBlbWJlZGRlZCBpbiBhbiBvYmplY3QpIGFuZCBpcyByZXNwb25zaWJsZSBmb3Igc3luY2hyb25pemluZyBpdAorICogc3VjaCB0aGF0IHRoZSBJUElzIHBlcmZvcm1lZCBvbiB0aGUgQGNzZCBhcmUgc3RyaWN0bHkgc2VyaWFsaXplZC4KKyAqCisgKiBOT1RFOiBCZSBjYXJlZnVsLCB0aGVyZSBpcyB1bmZvcnR1bmF0ZWx5IG5vIGN1cnJlbnQgZGVidWdnaW5nIGZhY2lsaXR5IHRvCisgKiB2YWxpZGF0ZSB0aGUgY29ycmVjdG5lc3Mgb2YgdGhpcyBzZXJpYWxpemF0aW9uLgorICovCitpbnQgc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2FzeW5jKGludCBjcHUsIHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhICpjc2QpCit7CisJaW50IGVyciA9IDA7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwllcnIgPSBnZW5lcmljX2V4ZWNfc2luZ2xlKGNwdSwgY3NkLCBjc2QtPmZ1bmMsIGNzZC0+aW5mbywgMCk7CisJcHJlZW1wdF9lbmFibGUoKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGVfYXN5bmMpOworCiAvKgogICogc21wX2NhbGxfZnVuY3Rpb25fYW55IC0gUnVuIGEgZnVuY3Rpb24gb24gYW55IG9mIHRoZSBnaXZlbiBjcHVzCiAgKiBAbWFzazogVGhlIG1hc2sgb2YgY3B1cyBpdCBjYW4gcnVuIG9uLgpAQCAtMjgwLDQ0ICszMDksNiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc21wX2NhbGxfZnVuY3Rpb25fYW55KTsKIAogLyoqCi0gKiBfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSgpOiBSdW4gYSBmdW5jdGlvbiBvbiBhIHNwZWNpZmljIENQVQotICogQGNwdTogVGhlIENQVSB0byBydW4gb24uCi0gKiBAZGF0YTogUHJlLWFsbG9jYXRlZCBhbmQgc2V0dXAgZGF0YSBzdHJ1Y3R1cmUKLSAqIEB3YWl0OiBJZiB0cnVlLCB3YWl0IHVudGlsIGZ1bmN0aW9uIGhhcyBjb21wbGV0ZWQgb24gc3BlY2lmaWVkIENQVS4KLSAqCi0gKiBMaWtlIHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSgpLCBidXQgYWxsb3cgY2FsbGVyIHRvIHBhc3MgaW4gYQotICogcHJlLWFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZS4gVXNlZnVsIGZvciBlbWJlZGRpbmcgQGRhdGEgaW5zaWRlCi0gKiBvdGhlciBzdHJ1Y3R1cmVzLCBmb3IgaW5zdGFuY2UuCi0gKi8KLXZvaWQgX19zbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoaW50IGNwdSwgc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgKmNzZCwKLQkJCQlpbnQgd2FpdCkKLXsKLQl1bnNpZ25lZCBpbnQgdGhpc19jcHU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXRoaXNfY3B1ID0gZ2V0X2NwdSgpOwotCS8qCi0JICogQ2FuIGRlYWRsb2NrIHdoZW4gY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KLQkgKiBXZSBhbGxvdyBjcHUncyB0aGF0IGFyZSBub3QgeWV0IG9ubGluZSB0aG91Z2gsIGFzIG5vIG9uZSBlbHNlIGNhbgotCSAqIHNlbmQgc21wIGNhbGwgZnVuY3Rpb24gaW50ZXJydXB0IHRvIHRoaXMgY3B1IGFuZCBhcyBzdWNoIGRlYWRsb2NrcwotCSAqIGNhbid0IGhhcHBlbi4KLQkgKi8KLQlXQVJOX09OX09OQ0UoY3B1X29ubGluZShzbXBfcHJvY2Vzc29yX2lkKCkpICYmIHdhaXQgJiYgaXJxc19kaXNhYmxlZCgpCi0JCSAgICAgJiYgIW9vcHNfaW5fcHJvZ3Jlc3MpOwotCi0JaWYgKGNwdSA9PSB0aGlzX2NwdSkgewotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCWNzZC0+ZnVuYyhjc2QtPmluZm8pOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JfSBlbHNlIHsKLQkJY3NkX2xvY2soY3NkKTsKLQkJZ2VuZXJpY19leGVjX3NpbmdsZShjcHUsIGNzZCwgd2FpdCk7Ci0JfQotCXB1dF9jcHUoKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKF9fc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKTsKLQotLyoqCiAgKiBzbXBfY2FsbF9mdW5jdGlvbl9tYW55KCk6IFJ1biBhIGZ1bmN0aW9uIG9uIGEgc2V0IG9mIG90aGVyIENQVXMuCiAgKiBAbWFzazogVGhlIHNldCBvZiBjcHVzIHRvIHJ1biBvbiAob25seSBydW5zIG9uIG9ubGluZSBzdWJzZXQpLgogICogQGZ1bmM6IFRoZSBmdW5jdGlvbiB0byBydW4uIFRoaXMgbXVzdCBiZSBmYXN0IGFuZCBub24tYmxvY2tpbmcuCmRpZmYgLS1naXQgYS9rZXJuZWwvc29mdGlycS5jIGIva2VybmVsL3NvZnRpcnEuYwppbmRleCA0OTBmY2JiLi5iNTA5OTBhIDEwMDY0NAotLS0gYS9rZXJuZWwvc29mdGlycS5jCisrKyBiL2tlcm5lbC9zb2Z0aXJxLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBib290Lmg+CiAjaW5jbHVkZSA8bGludXgvdGljay5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvaXJxLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggNzc1NGZmMS4uMDlkMmUyNCAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCisrKyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtMTEyLDkgKzExMiw2IEBACiAjaWZuZGVmIENPTkZJR19NTVUKIGV4dGVybiBpbnQgc3lzY3RsX25yX3RyaW1fcGFnZXM7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfQkxPQ0sKLWV4dGVybiBpbnQgYmxrX2lvcG9sbF9lbmFibGVkOwotI2VuZGlmCiAKIC8qIENvbnN0YW50cyB1c2VkIGZvciBtaW5pbXVtIGFuZCAgbWF4aW11bSAqLwogI2lmZGVmIENPTkZJR19MT0NLVVBfREVURUNUT1IKQEAgLTEwODcsMTUgKzEwODQsNiBAQAogCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKIAl9LAogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0JMT0NLCi0JewotCQkucHJvY25hbWUJPSAiYmxrX2lvcG9sbCIsCi0JCS5kYXRhCQk9ICZibGtfaW9wb2xsX2VuYWJsZWQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAotCX0sCi0jZW5kaWYKIAl7IH0KIH07CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL0tjb25maWcgYi9rZXJuZWwvdGltZS9LY29uZmlnCmluZGV4IDNjZTZlOGMuLmY0NDg1MTMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL0tjb25maWcKKysrIGIva2VybmVsL3RpbWUvS2NvbmZpZwpAQCAtMTI0LDcgKzEyNCw3IEBACiBlbmRjaG9pY2UKIAogY29uZmlnIE5PX0haX0ZVTExfQUxMCi0gICAgICAgYm9vbCAiRnVsbCBkeW50aWNrcyBzeXN0ZW0gb24gYWxsIENQVXMgYnkgZGVmYXVsdCIKKyAgICAgICBib29sICJGdWxsIGR5bnRpY2tzIHN5c3RlbSBvbiBhbGwgQ1BVcyBieSBkZWZhdWx0IChleGNlcHQgQ1BVIDApIgogICAgICAgIGRlcGVuZHMgb24gTk9fSFpfRlVMTAogICAgICAgIGhlbHAKICAgICAgICAgIElmIHRoZSB1c2VyIGRvZXNuJ3QgcGFzcyB0aGUgbm9oel9mdWxsIGJvb3Qgb3B0aW9uIHRvCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9NYWtlZmlsZSBiL2tlcm5lbC90aW1lL01ha2VmaWxlCmluZGV4IDkyNTAxMzAuLjU3YTQxM2YgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL01ha2VmaWxlCisrKyBiL2tlcm5lbC90aW1lL01ha2VmaWxlCkBAIC0zLDcgKzMsMTAgQEAKIAogb2JqLSQoQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQpCQkrPSBjbG9ja2V2ZW50cy5vCiBvYmotJChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUykJCSs9IHRpY2stY29tbW9uLm8KLW9iai0kKENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVCkJKz0gdGljay1icm9hZGNhc3QubworaWZlcSAoJChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QpLHkpCisgb2JqLXkJCQkJCQkrPSB0aWNrLWJyb2FkY2FzdC5vCisgb2JqLSQoQ09ORklHX1RJQ0tfT05FU0hPVCkJCQkrPSB0aWNrLWJyb2FkY2FzdC1ocnRpbWVyLm8KK2VuZGlmCiBvYmotJChDT05GSUdfR0VORVJJQ19TQ0hFRF9DTE9DSykJCSs9IHNjaGVkX2Nsb2NrLm8KIG9iai0kKENPTkZJR19USUNLX09ORVNIT1QpCQkJKz0gdGljay1vbmVzaG90Lm8KIG9iai0kKENPTkZJR19USUNLX09ORVNIT1QpCQkJKz0gdGljay1zY2hlZC5vCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jIGIva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYwppbmRleCAwODZhZDYwLi5hZDM2MmMyIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jCisrKyBiL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKQEAgLTQzOSw2ICs0MzksMTkgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNsb2NrZXZlbnRzX2NvbmZpZ19hbmRfcmVnaXN0ZXIpOwogCitpbnQgX19jbG9ja2V2ZW50c191cGRhdGVfZnJlcShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsIHUzMiBmcmVxKQoreworCWNsb2NrZXZlbnRzX2NvbmZpZyhkZXYsIGZyZXEpOworCisJaWYgKGRldi0+bW9kZSA9PSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKQorCQlyZXR1cm4gY2xvY2tldmVudHNfcHJvZ3JhbV9ldmVudChkZXYsIGRldi0+bmV4dF9ldmVudCwgZmFsc2UpOworCisJaWYgKGRldi0+bW9kZSA9PSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQykKKwkJZGV2LT5zZXRfbW9kZShDTE9DS19FVlRfTU9ERV9QRVJJT0RJQywgZGV2KTsKKworCXJldHVybiAwOworfQorCiAvKioKICAqIGNsb2NrZXZlbnRzX3VwZGF0ZV9mcmVxIC0gVXBkYXRlIGZyZXF1ZW5jeSBhbmQgcmVwcm9ncmFtIGEgY2xvY2sgZXZlbnQgZGV2aWNlLgogICogQGRldjoJZGV2aWNlIHRvIG1vZGlmeQpAQCAtNDQ2LDE3ICs0NTksMjIgQEAKICAqCiAgKiBSZWNvbmZpZ3VyZSBhbmQgcmVwcm9ncmFtIGEgY2xvY2sgZXZlbnQgZGV2aWNlIGluIG9uZXNob3QKICAqIG1vZGUuIE11c3QgYmUgY2FsbGVkIG9uIHRoZSBjcHUgZm9yIHdoaWNoIHRoZSBkZXZpY2UgZGVsaXZlcnMgcGVyCi0gKiBjcHUgdGltZXIgZXZlbnRzIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCEgIFJldHVybnMgMCBvbiBzdWNjZXNzLAotICogLUVUSU1FIHdoZW4gdGhlIGV2ZW50IGlzIGluIHRoZSBwYXN0LgorICogY3B1IHRpbWVyIGV2ZW50cy4gSWYgY2FsbGVkIGZvciB0aGUgYnJvYWRjYXN0IGRldmljZSB0aGUgY29yZSB0YWtlcworICogY2FyZSBvZiBzZXJpYWxpemF0aW9uLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRVRJTUUgd2hlbiB0aGUgZXZlbnQgaXMgaW4gdGhlIHBhc3QuCiAgKi8KIGludCBjbG9ja2V2ZW50c191cGRhdGVfZnJlcShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsIHUzMiBmcmVxKQogewotCWNsb2NrZXZlbnRzX2NvbmZpZyhkZXYsIGZyZXEpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKIAotCWlmIChkZXYtPm1vZGUgIT0gQ0xPQ0tfRVZUX01PREVfT05FU0hPVCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gY2xvY2tldmVudHNfcHJvZ3JhbV9ldmVudChkZXYsIGRldi0+bmV4dF9ldmVudCwgZmFsc2UpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlyZXQgPSB0aWNrX2Jyb2FkY2FzdF91cGRhdGVfZnJlcShkZXYsIGZyZXEpOworCWlmIChyZXQgPT0gLUVOT0RFVikKKwkJcmV0ID0gX19jbG9ja2V2ZW50c191cGRhdGVfZnJlcShkZXYsIGZyZXEpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtNTI0LDEyICs1NDIsMTMgQEAKICNpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUwogLyoqCiAgKiBjbG9ja2V2ZW50c19ub3RpZnkgLSBub3RpZmljYXRpb24gYWJvdXQgcmVsZXZhbnQgZXZlbnRzCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgYW55IG90aGVyIHZhbHVlIG9uIGVycm9yCiAgKi8KLXZvaWQgY2xvY2tldmVudHNfbm90aWZ5KHVuc2lnbmVkIGxvbmcgcmVhc29uLCB2b2lkICphcmcpCitpbnQgY2xvY2tldmVudHNfbm90aWZ5KHVuc2lnbmVkIGxvbmcgcmVhc29uLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCAqdG1wOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGNwdTsKKwlpbnQgY3B1LCByZXQgPSAwOwogCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZjbG9ja2V2ZW50c19sb2NrLCBmbGFncyk7CiAKQEAgLTU0Miw3ICs1NjEsNyBAQAogCiAJY2FzZSBDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FTlRFUjoKIAljYXNlIENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX0VYSVQ6Ci0JCXRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbChyZWFzb24pOworCQlyZXQgPSB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2NvbnRyb2wocmVhc29uKTsKIAkJYnJlYWs7CiAKIAljYXNlIENMT0NLX0VWVF9OT1RJRllfQ1BVX0RZSU5HOgpAQCAtNTg1LDYgKzYwNCw3IEBACiAJCWJyZWFrOwogCX0KIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tldmVudHNfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjbG9ja2V2ZW50c19ub3RpZnkpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9udHAuYyBiL2tlcm5lbC90aW1lL250cC5jCmluZGV4IGFmOGQxZDQuLjQxOWE1MmMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL250cC5jCisrKyBiL2tlcm5lbC90aW1lL250cC5jCkBAIC01MTQsMTIgKzUxNCwxMyBAQAogCQluZXh0LnR2X3NlYysrOwogCQluZXh0LnR2X25zZWMgLT0gTlNFQ19QRVJfU0VDOwogCX0KLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnN5bmNfY21vc193b3JrLCB0aW1lc3BlY190b19qaWZmaWVzKCZuZXh0KSk7CisJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsCisJCQkgICAmc3luY19jbW9zX3dvcmssIHRpbWVzcGVjX3RvX2ppZmZpZXMoJm5leHQpKTsKIH0KIAogdm9pZCBudHBfbm90aWZ5X2Ntb3NfdGltZXIodm9pZCkKIHsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnN5bmNfY21vc193b3JrLCAwKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwgJnN5bmNfY21vc193b3JrLCAwKTsKIH0KIAogI2Vsc2UKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LWhydGltZXIuYyBiL2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LWhydGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjY4MmQ1Ci0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RpbWUvdGljay1icm9hZGNhc3QtaHJ0aW1lci5jCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogbGludXgva2VybmVsL3RpbWUvdGljay1icm9hZGNhc3QtaHJ0aW1lci5jCisgKiBUaGlzIGZpbGUgZW11bGF0ZXMgYSBsb2NhbCBjbG9jayBldmVudCBkZXZpY2UKKyAqIHZpYSBhIHBzZXVkbyBjbG9jayBkZXZpY2UuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAidGljay1pbnRlcm5hbC5oIgorCitzdGF0aWMgc3RydWN0IGhydGltZXIgYmN0aW1lcjsKKworc3RhdGljIHZvaWQgYmNfc2V0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCisJCQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYykKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgorCQkvKgorCQkgKiBOb3RlLCB3ZSBjYW5ub3QgY2FuY2VsIHRoZSB0aW1lciBoZXJlIGFzIHdlIG1pZ2h0CisJCSAqIHJ1biBpbnRvIHRoZSBmb2xsb3dpbmcgbGl2ZSBsb2NrIHNjZW5hcmlvOgorCQkgKgorCQkgKiBjcHUgMAkJY3B1MQorCQkgKiBsb2NrKGJyb2FkY2FzdF9sb2NrKTsKKwkJICoJCQlocnRpbWVyX2ludGVycnVwdCgpCisJCSAqCQkJYmNfaGFuZGxlcigpCisJCSAqCQkJICAgdGlja19oYW5kbGVfb25lc2hvdF9icm9hZGNhc3QoKTsKKwkJICoJCQkgICAgbG9jayhicm9hZGNhc3RfbG9jayk7CisJCSAqIGhydGltZXJfY2FuY2VsKCkKKwkJICogIHdhaXRfZm9yX2NhbGxiYWNrKCkKKwkJICovCisJCWhydGltZXJfdHJ5X3RvX2NhbmNlbCgmYmN0aW1lcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIGd1dHMgb2YgdGhlIGJyb2FkY2FzdCBjb2RlIHdoZW4gdGhlIGNwdQorICogd2hpY2ggaXMgYWJvdXQgdG8gZW50ZXIgaWRsZSBoYXMgdGhlIGVhcmxpZXN0IGJyb2FkY2FzdCB0aW1lciBldmVudC4KKyAqLworc3RhdGljIGludCBiY19zZXRfbmV4dChrdGltZV90IGV4cGlyZXMsIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjKQoreworCS8qCisJICogV2UgdHJ5IHRvIGNhbmNlbCB0aGUgdGltZXIgZmlyc3QuIElmIHRoZSBjYWxsYmFjayBpcyBvbgorCSAqIGZsaWdodCBvbiBzb21lIG90aGVyIGNwdSB0aGVuIHdlIGxldCBpdCBoYW5kbGUgaXQuIElmIHdlCisJICogd2VyZSBhYmxlIHRvIGNhbmNlbCB0aGUgdGltZXIgbm90aGluZyBjYW4gcmVhcm0gaXQgYXMgd2UKKwkgKiBvd24gYnJvYWRjYXN0X2xvY2suCisJICoKKwkgKiBIb3dldmVyIHdlIGNhbiBhbHNvIGJlIGNhbGxlZCBmcm9tIHRoZSBldmVudCBoYW5kbGVyIG9mCisJICogY2VfYnJvYWRjYXN0X2hydGltZXIgaXRzZWxmIHdoZW4gaXQgZXhwaXJlcy4gV2UgY2Fubm90CisJICogcmVzdGFydCB0aGUgdGltZXIgYmVjYXVzZSB3ZSBhcmUgaW4gdGhlIGNhbGxiYWNrLCBidXQgd2UKKwkgKiBjYW4gc2V0IHRoZSBleHBpcnkgdGltZSBhbmQgbGV0IHRoZSBjYWxsYmFjayByZXR1cm4KKwkgKiBIUlRJTUVSX1JFU1RBUlQuCisJICovCisJaWYgKGhydGltZXJfdHJ5X3RvX2NhbmNlbCgmYmN0aW1lcikgPj0gMCkgeworCQlocnRpbWVyX3N0YXJ0KCZiY3RpbWVyLCBleHBpcmVzLCBIUlRJTUVSX01PREVfQUJTX1BJTk5FRCk7CisJCS8qIEJpbmQgdGhlICJkZXZpY2UiIHRvIHRoZSBjcHUgKi8KKwkJYmMtPmJvdW5kX29uID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCX0gZWxzZSBpZiAoYmMtPmJvdW5kX29uID09IHNtcF9wcm9jZXNzb3JfaWQoKSkgeworCQlocnRpbWVyX3NldF9leHBpcmVzKCZiY3RpbWVyLCBleHBpcmVzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIGNlX2Jyb2FkY2FzdF9ocnRpbWVyID0geworCS5zZXRfbW9kZQkJPSBiY19zZXRfbW9kZSwKKwkuc2V0X25leHRfa3RpbWUJCT0gYmNfc2V0X25leHQsCisJLmZlYXR1cmVzCQk9IENMT0NLX0VWVF9GRUFUX09ORVNIT1QgfAorCQkJCSAgQ0xPQ0tfRVZUX0ZFQVRfS1RJTUUgfAorCQkJCSAgQ0xPQ0tfRVZUX0ZFQVRfSFJUSU1FUiwKKwkucmF0aW5nCQkJPSAwLAorCS5ib3VuZF9vbgkJPSAtMSwKKwkubWluX2RlbHRhX25zCQk9IDEsCisJLm1heF9kZWx0YV9ucwkJPSBLVElNRV9NQVgsCisJLm1pbl9kZWx0YV90aWNrcwk9IDEsCisJLm1heF9kZWx0YV90aWNrcwk9IFVMT05HX01BWCwKKwkubXVsdAkJCT0gMSwKKwkuc2hpZnQJCQk9IDAsCisJLmNwdW1hc2sJCT0gY3B1X2FsbF9tYXNrLAorfTsKKworc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGJjX2hhbmRsZXIoc3RydWN0IGhydGltZXIgKnQpCit7CisJY2VfYnJvYWRjYXN0X2hydGltZXIuZXZlbnRfaGFuZGxlcigmY2VfYnJvYWRjYXN0X2hydGltZXIpOworCisJaWYgKGNlX2Jyb2FkY2FzdF9ocnRpbWVyLm5leHRfZXZlbnQudHY2NCA9PSBLVElNRV9NQVgpCisJCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKKworCXJldHVybiBIUlRJTUVSX1JFU1RBUlQ7Cit9CisKK3ZvaWQgdGlja19zZXR1cF9ocnRpbWVyX2Jyb2FkY2FzdCh2b2lkKQoreworCWhydGltZXJfaW5pdCgmYmN0aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfQUJTKTsKKwliY3RpbWVyLmZ1bmN0aW9uID0gYmNfaGFuZGxlcjsKKwljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoJmNlX2Jyb2FkY2FzdF9ocnRpbWVyKTsKK30KZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LmMgYi9rZXJuZWwvdGltZS90aWNrLWJyb2FkY2FzdC5jCmluZGV4IDk4OTc3YTUuLjY0YzU5OTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LmMKKysrIGIva2VybmVsL3RpbWUvdGljay1icm9hZGNhc3QuYwpAQCAtMTIwLDYgKzEyMCwxOSBAQAogCXJldHVybiAoZGV2ICYmIHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXYgPT0gZGV2KTsKIH0KIAoraW50IHRpY2tfYnJvYWRjYXN0X3VwZGF0ZV9mcmVxKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwgdTMyIGZyZXEpCit7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKwlpZiAodGlja19pc19icm9hZGNhc3RfZGV2aWNlKGRldikpIHsKKwkJcmF3X3NwaW5fbG9jaygmdGlja19icm9hZGNhc3RfbG9jayk7CisJCXJldCA9IF9fY2xvY2tldmVudHNfdXBkYXRlX2ZyZXEoZGV2LCBmcmVxKTsKKwkJcmF3X3NwaW5fdW5sb2NrKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCiBzdGF0aWMgdm9pZCBlcnJfYnJvYWRjYXN0KGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQogewogCXByX2NyaXRfb25jZSgiRmFpbGVkIHRvIGJyb2FkY2FzdCB0aW1lciB0aWNrLiBTb21lIENQVXMgbWF5IGJlIHVucmVzcG9uc2l2ZS5cbiIpOwpAQCAtMjcyLDEyICsyODUsOCBAQAogICovCiBzdGF0aWMgdm9pZCB0aWNrX2RvX3BlcmlvZGljX2Jyb2FkY2FzdCh2b2lkKQogewotCXJhd19zcGluX2xvY2soJnRpY2tfYnJvYWRjYXN0X2xvY2spOwotCiAJY3B1bWFza19hbmQodG1wbWFzaywgY3B1X29ubGluZV9tYXNrLCB0aWNrX2Jyb2FkY2FzdF9tYXNrKTsKIAl0aWNrX2RvX2Jyb2FkY2FzdCh0bXBtYXNrKTsKLQotCXJhd19zcGluX3VubG9jaygmdGlja19icm9hZGNhc3RfbG9jayk7CiB9CiAKIC8qCkBAIC0yODcsMTMgKzI5NiwxNSBAQAogewogCWt0aW1lX3QgbmV4dDsKIAorCXJhd19zcGluX2xvY2soJnRpY2tfYnJvYWRjYXN0X2xvY2spOworCiAJdGlja19kb19wZXJpb2RpY19icm9hZGNhc3QoKTsKIAogCS8qCiAJICogVGhlIGRldmljZSBpcyBpbiBwZXJpb2RpYyBtb2RlLiBObyByZXByb2dyYW1taW5nIG5lY2Vzc2FyeToKIAkgKi8KIAlpZiAoZGV2LT5tb2RlID09IENMT0NLX0VWVF9NT0RFX1BFUklPRElDKQotCQlyZXR1cm47CisJCWdvdG8gdW5sb2NrOwogCiAJLyoKIAkgKiBTZXR1cCB0aGUgbmV4dCBwZXJpb2QgZm9yIGRldmljZXMsIHdoaWNoIGRvIG5vdCBoYXZlCkBAIC0zMDYsOSArMzE3LDExIEBACiAJCW5leHQgPSBrdGltZV9hZGQobmV4dCwgdGlja19wZXJpb2QpOwogCiAJCWlmICghY2xvY2tldmVudHNfcHJvZ3JhbV9ldmVudChkZXYsIG5leHQsIGZhbHNlKSkKLQkJCXJldHVybjsKKwkJCWdvdG8gdW5sb2NrOwogCQl0aWNrX2RvX3BlcmlvZGljX2Jyb2FkY2FzdCgpOwogCX0KK3VubG9jazoKKwlyYXdfc3Bpbl91bmxvY2soJnRpY2tfYnJvYWRjYXN0X2xvY2spOwogfQogCiAvKgpAQCAtNjMwLDI0ICs2NDMsNjEgQEAKIAlyYXdfc3Bpbl91bmxvY2soJnRpY2tfYnJvYWRjYXN0X2xvY2spOwogfQogCitzdGF0aWMgaW50IGJyb2FkY2FzdF9uZWVkc19jcHUoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMsIGludCBjcHUpCit7CisJaWYgKCEoYmMtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfSFJUSU1FUikpCisJCXJldHVybiAwOworCWlmIChiYy0+bmV4dF9ldmVudC50djY0ID09IEtUSU1FX01BWCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGJjLT5ib3VuZF9vbiA9PSBjcHUgPyAtRUJVU1kgOiAwOworfQorCitzdGF0aWMgdm9pZCBicm9hZGNhc3Rfc2h1dGRvd25fbG9jYWwoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMsCisJCQkJICAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCit7CisJLyoKKwkgKiBGb3IgaHJ0aW1lciBiYXNlZCBicm9hZGNhc3Rpbmcgd2UgY2Fubm90IHNodXRkb3duIHRoZSBjcHUKKwkgKiBsb2NhbCBkZXZpY2UgaWYgb3VyIG93biBldmVudCBpcyB0aGUgZmlyc3Qgb25lIHRvIGV4cGlyZSBvcgorCSAqIGlmIHdlIG93biB0aGUgYnJvYWRjYXN0IHRpbWVyLgorCSAqLworCWlmIChiYy0+ZmVhdHVyZXMgJiBDTE9DS19FVlRfRkVBVF9IUlRJTUVSKSB7CisJCWlmIChicm9hZGNhc3RfbmVlZHNfY3B1KGJjLCBzbXBfcHJvY2Vzc29yX2lkKCkpKQorCQkJcmV0dXJuOworCQlpZiAoZGV2LT5uZXh0X2V2ZW50LnR2NjQgPCBiYy0+bmV4dF9ldmVudC50djY0KQorCQkJcmV0dXJuOworCX0KKwljbG9ja2V2ZW50c19zZXRfbW9kZShkZXYsIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOKTsKK30KKworc3RhdGljIHZvaWQgYnJvYWRjYXN0X21vdmVfYmMoaW50IGRlYWRjcHUpCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMgPSB0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2OworCisJaWYgKCFiYyB8fCAhYnJvYWRjYXN0X25lZWRzX2NwdShiYywgZGVhZGNwdSkpCisJCXJldHVybjsKKwkvKiBUaGlzIG1vdmVzIHRoZSBicm9hZGNhc3QgYXNzaWdubWVudCB0byB0aGlzIGNwdSAqLworCWNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoYmMsIGJjLT5uZXh0X2V2ZW50LCAxKTsKK30KKwogLyoKICAqIFBvd2Vyc3RhdGUgaW5mb3JtYXRpb246IFRoZSBzeXN0ZW0gZW50ZXJzL2xlYXZlcyBhIHN0YXRlLCB3aGVyZQogICogYWZmZWN0ZWQgZGV2aWNlcyBtaWdodCBzdG9wCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVCVVNZIGlmIHRoZSBjcHUgaXMgdXNlZCB0byBicm9hZGNhc3Qgd2FrZXVwcy4KICAqLwotdm9pZCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2NvbnRyb2wodW5zaWduZWQgbG9uZyByZWFzb24pCitpbnQgdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKHVuc2lnbmVkIGxvbmcgcmVhc29uKQogewogCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjLCAqZGV2OwogCXN0cnVjdCB0aWNrX2RldmljZSAqdGQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlrdGltZV90IG5vdzsKLQlpbnQgY3B1OworCWludCBjcHUsIHJldCA9IDA7CiAKIAkvKgogCSAqIFBlcmlvZGljIG1vZGUgZG9lcyBub3QgY2FyZSBhYm91dCB0aGUgZW50ZXIvZXhpdCBvZiBwb3dlcgogCSAqIHN0YXRlcwogCSAqLwogCWlmICh0aWNrX2Jyb2FkY2FzdF9kZXZpY2UubW9kZSA9PSBUSUNLREVWX01PREVfUEVSSU9ESUMpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKIAkvKgogCSAqIFdlIGFyZSBjYWxsZWQgd2l0aCBwcmVlbXRpb24gZGlzYWJsZWQgZnJvbSB0aGUgZGVwdGggb2YgdGhlCkBAIC02NTgsNyArNzA4LDcgQEAKIAlkZXYgPSB0ZC0+ZXZ0ZGV2OwogCiAJaWYgKCEoZGV2LT5mZWF0dXJlcyAmIENMT0NLX0VWVF9GRUFUX0MzU1RPUCkpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKIAliYyA9IHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXY7CiAKQEAgLTY2Niw3ICs3MTYsNyBAQAogCWlmIChyZWFzb24gPT0gQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVIpIHsKIAkJaWYgKCFjcHVtYXNrX3Rlc3RfYW5kX3NldF9jcHUoY3B1LCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spKSB7CiAJCQlXQVJOX09OX09OQ0UoY3B1bWFza190ZXN0X2NwdShjcHUsIHRpY2tfYnJvYWRjYXN0X3BlbmRpbmdfbWFzaykpOwotCQkJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9TSFVURE9XTik7CisJCQlicm9hZGNhc3Rfc2h1dGRvd25fbG9jYWwoYmMsIGRldik7CiAJCQkvKgogCQkJICogV2Ugb25seSByZXByb2dyYW0gdGhlIGJyb2FkY2FzdCB0aW1lciBpZiB3ZQogCQkJICogZGlkIG5vdCBtYXJrIG91cnNlbGYgaW4gdGhlIGZvcmNlIG1hc2sgYW5kCkBAIC02NzksNiArNzI5LDE2IEBACiAJCQkgICAgZGV2LT5uZXh0X2V2ZW50LnR2NjQgPCBiYy0+bmV4dF9ldmVudC50djY0KQogCQkJCXRpY2tfYnJvYWRjYXN0X3NldF9ldmVudChiYywgY3B1LCBkZXYtPm5leHRfZXZlbnQsIDEpOwogCQl9CisJCS8qCisJCSAqIElmIHRoZSBjdXJyZW50IENQVSBvd25zIHRoZSBocnRpbWVyIGJyb2FkY2FzdAorCQkgKiBtZWNoYW5pc20sIGl0IGNhbm5vdCBnbyBkZWVwIGlkbGUgYW5kIHdlIHJlbW92ZSB0aGUKKwkJICogQ1BVIGZyb20gdGhlIGJyb2FkY2FzdCBtYXNrLiBXZSBkb24ndCBoYXZlIHRvIGdvCisJCSAqIHRocm91Z2ggdGhlIEVYSVQgcGF0aCBhcyB0aGUgbG9jYWwgdGltZXIgaXMgbm90CisJCSAqIHNodXRkb3duLgorCQkgKi8KKwkJcmV0ID0gYnJvYWRjYXN0X25lZWRzX2NwdShiYywgY3B1KTsKKwkJaWYgKHJldCkKKwkJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrKTsKIAl9IGVsc2UgewogCQlpZiAoY3B1bWFza190ZXN0X2FuZF9jbGVhcl9jcHUoY3B1LCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spKSB7CiAJCQljbG9ja2V2ZW50c19zZXRfbW9kZShkZXYsIENMT0NLX0VWVF9NT0RFX09ORVNIT1QpOwpAQCAtNzQ2LDYgKzgwNiw3IEBACiAJfQogb3V0OgogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTg1Miw2ICs5MTMsOCBAQAogCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgdGlja19icm9hZGNhc3RfcGVuZGluZ19tYXNrKTsKIAljcHVtYXNrX2NsZWFyX2NwdShjcHUsIHRpY2tfYnJvYWRjYXN0X2ZvcmNlX21hc2spOwogCisJYnJvYWRjYXN0X21vdmVfYmMoY3B1KTsKKwogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2stY29tbW9uLmMgYi9rZXJuZWwvdGltZS90aWNrLWNvbW1vbi5jCmluZGV4IDIwYjJmZTMuLjAxNTY2MTIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpY2stY29tbW9uLmMKKysrIGIva2VybmVsL3RpbWUvdGljay1jb21tb24uYwpAQCAtOTgsMTggKzk4LDE5IEBACiB2b2lkIHRpY2tfaGFuZGxlX3BlcmlvZGljKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKIHsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWt0aW1lX3QgbmV4dDsKKwlrdGltZV90IG5leHQgPSBkZXYtPm5leHRfZXZlbnQ7CiAKIAl0aWNrX3BlcmlvZGljKGNwdSk7CiAKIAlpZiAoZGV2LT5tb2RlICE9IENMT0NLX0VWVF9NT0RFX09ORVNIT1QpCiAJCXJldHVybjsKLQkvKgotCSAqIFNldHVwIHRoZSBuZXh0IHBlcmlvZCBmb3IgZGV2aWNlcywgd2hpY2ggZG8gbm90IGhhdmUKLQkgKiBwZXJpb2RpYyBtb2RlOgotCSAqLwotCW5leHQgPSBrdGltZV9hZGQoZGV2LT5uZXh0X2V2ZW50LCB0aWNrX3BlcmlvZCk7CiAJZm9yICg7OykgeworCQkvKgorCQkgKiBTZXR1cCB0aGUgbmV4dCBwZXJpb2QgZm9yIGRldmljZXMsIHdoaWNoIGRvIG5vdCBoYXZlCisJCSAqIHBlcmlvZGljIG1vZGU6CisJCSAqLworCQluZXh0ID0ga3RpbWVfYWRkKG5leHQsIHRpY2tfcGVyaW9kKTsKKwogCQlpZiAoIWNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBuZXh0LCBmYWxzZSkpCiAJCQlyZXR1cm47CiAJCS8qCkBAIC0xMTgsMTIgKzExOSwxMSBAQAogCQkgKiB0byBiZSBzdXJlIHdlJ3JlIHVzaW5nIGEgcmVhbCBoYXJkd2FyZSBjbG9ja3NvdXJjZS4KIAkJICogT3RoZXJ3aXNlIHdlIGNvdWxkIGdldCB0cmFwcGVkIGluIGFuIGluZmluaXRlCiAJCSAqIGxvb3AsIGFzIHRoZSB0aWNrX3BlcmlvZGljKCkgaW5jcmVtZW50cyBqaWZmaWVzLAotCQkgKiB3aGVuIHRoZW4gd2lsbCBpbmNyZW1lbnQgdGltZSwgcG9zaWJseSBjYXVzaW5nCisJCSAqIHdoaWNoIHRoZW4gd2lsbCBpbmNyZW1lbnQgdGltZSwgcG9zc2libHkgY2F1c2luZwogCQkgKiB0aGUgbG9vcCB0byB0cmlnZ2VyIGFnYWluIGFuZCBhZ2Fpbi4KIAkJICovCiAJCWlmICh0aW1la2VlcGluZ192YWxpZF9mb3JfaHJlcygpKQogCQkJdGlja19wZXJpb2RpYyhjcHUpOwotCQluZXh0ID0ga3RpbWVfYWRkKG5leHQsIHRpY2tfcGVyaW9kKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2staW50ZXJuYWwuaCBiL2tlcm5lbC90aW1lL3RpY2staW50ZXJuYWwuaAppbmRleCA4MzI5NjY5Li43YWI5MmIxIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aWNrLWludGVybmFsLmgKKysrIGIva2VybmVsL3RpbWUvdGljay1pbnRlcm5hbC5oCkBAIC00Niw3ICs0Niw3IEBACiBleHRlcm4gdm9pZCB0aWNrX3Jlc3VtZV9vbmVzaG90KHZvaWQpOwogIyBpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QKIGV4dGVybiB2b2lkIHRpY2tfYnJvYWRjYXN0X3NldHVwX29uZXNob3Qoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMpOwotZXh0ZXJuIHZvaWQgdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKHVuc2lnbmVkIGxvbmcgcmVhc29uKTsKK2V4dGVybiBpbnQgdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKHVuc2lnbmVkIGxvbmcgcmVhc29uKTsKIGV4dGVybiB2b2lkIHRpY2tfYnJvYWRjYXN0X3N3aXRjaF90b19vbmVzaG90KHZvaWQpOwogZXh0ZXJuIHZvaWQgdGlja19zaHV0ZG93bl9icm9hZGNhc3Rfb25lc2hvdCh1bnNpZ25lZCBpbnQgKmNwdXApOwogZXh0ZXJuIGludCB0aWNrX3Jlc3VtZV9icm9hZGNhc3Rfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYyk7CkBAIC01OCw3ICs1OCw3IEBACiB7CiAJQlVHKCk7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKHVuc2lnbmVkIGxvbmcgcmVhc29uKSB7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbikgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X3N3aXRjaF90b19vbmVzaG90KHZvaWQpIHsgfQogc3RhdGljIGlubGluZSB2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0X29uZXNob3QodW5zaWduZWQgaW50ICpjcHVwKSB7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHRpY2tfYnJvYWRjYXN0X29uZXNob3RfYWN0aXZlKHZvaWQpIHsgcmV0dXJuIDA7IH0KQEAgLTg3LDcgKzg3LDcgQEAKIHsKIAlCVUcoKTsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2NvbnRyb2wodW5zaWduZWQgbG9uZyByZWFzb24pIHsgfQorc3RhdGljIGlubGluZSBpbnQgdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKHVuc2lnbmVkIGxvbmcgcmVhc29uKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgdGlja19zaHV0ZG93bl9icm9hZGNhc3Rfb25lc2hvdCh1bnNpZ25lZCBpbnQgKmNwdXApIHsgfQogc3RhdGljIGlubGluZSBpbnQgdGlja19yZXN1bWVfYnJvYWRjYXN0X29uZXNob3Qoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMpCiB7CkBAIC0xMTEsNiArMTExLDcgQEAKIGV4dGVybiB2b2lkIHRpY2tfYnJvYWRjYXN0X2luaXQodm9pZCk7CiBleHRlcm4gdm9pZAogdGlja19zZXRfcGVyaW9kaWNfaGFuZGxlcihzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsIGludCBicm9hZGNhc3QpOworaW50IHRpY2tfYnJvYWRjYXN0X3VwZGF0ZV9mcmVxKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwgdTMyIGZyZXEpOwogCiAjZWxzZSAvKiAhQlJPQURDQVNUICovCiAKQEAgLTEzMyw2ICsxMzQsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIHRpY2tfc3VzcGVuZF9icm9hZGNhc3Qodm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIGludCB0aWNrX3Jlc3VtZV9icm9hZGNhc3Qodm9pZCkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X2luaXQodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIGludCB0aWNrX2Jyb2FkY2FzdF91cGRhdGVfZnJlcShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgdTMyIGZyZXEpIHsgcmV0dXJuIC1FTk9ERVY7IH0KIAogLyoKICAqIFNldCB0aGUgcGVyaW9kaWMgaGFuZGxlciBpbiBub24gYnJvYWRjYXN0IG1vZGUKQEAgLTE1Miw2ICsxNTUsOCBAQAogCXJldHVybiAhKGRldi0+ZmVhdHVyZXMgJiBDTE9DS19FVlRfRkVBVF9EVU1NWSk7CiB9CiAKK2ludCBfX2Nsb2NrZXZlbnRzX3VwZGF0ZV9mcmVxKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwgdTMyIGZyZXEpOworCiAjZW5kaWYKIAogZXh0ZXJuIHZvaWQgZG9fdGltZXIodW5zaWduZWQgbG9uZyB0aWNrcyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1la2VlcGluZ19kZWJ1Zy5jIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmdfZGVidWcuYwppbmRleCA4MDI0MzNhLi40ZDU0Zjk3IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aW1la2VlcGluZ19kZWJ1Zy5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nX2RlYnVnLmMKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KIAorI2luY2x1ZGUgInRpbWVrZWVwaW5nX2ludGVybmFsLmgiCisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2xlZXBfdGltZV9iaW5bMzJdID0gezB9OwogCiBzdGF0aWMgaW50IHRrX2RlYnVnX3Nob3dfc2xlZXBfdGltZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKmRhdGEpCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZXIuYyBiL2tlcm5lbC90aW1lci5jCmluZGV4IGQ3OGRlMDQuLjg3YmQ1MjkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lci5jCisrKyBiL2tlcm5lbC90aW1lci5jCkBAIC04MSw2ICs4MSw3IEBACiAJdW5zaWduZWQgbG9uZyB0aW1lcl9qaWZmaWVzOwogCXVuc2lnbmVkIGxvbmcgbmV4dF90aW1lcjsKIAl1bnNpZ25lZCBsb25nIGFjdGl2ZV90aW1lcnM7CisJdW5zaWduZWQgbG9uZyBhbGxfdGltZXJzOwogCXN0cnVjdCB0dmVjX3Jvb3QgdHYxOwogCXN0cnVjdCB0dmVjIHR2MjsKIAlzdHJ1Y3QgdHZlYyB0djM7CkBAIC0zMzcsNiArMzM4LDIwIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzZXRfdGltZXJfc2xhY2spOwogCisvKgorICogSWYgdGhlIGxpc3QgaXMgZW1wdHksIGNhdGNoIHVwIC0+dGltZXJfamlmZmllcyB0byB0aGUgY3VycmVudCB0aW1lLgorICogVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIHR2ZWNfYmFzZSBsb2NrLiAgUmV0dXJucyB0cnVlIGlmIHRoZSBsaXN0CisgKiB3YXMgZW1wdHkgYW5kIHRoZXJlZm9yZSAtPnRpbWVyX2ppZmZpZXMgd2FzIHVwZGF0ZWQuCisgKi8KK3N0YXRpYyBib29sIGNhdGNodXBfdGltZXJfamlmZmllcyhzdHJ1Y3QgdHZlY19iYXNlICpiYXNlKQoreworCWlmICghYmFzZS0+YWxsX3RpbWVycykgeworCQliYXNlLT50aW1lcl9qaWZmaWVzID0gamlmZmllczsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKwogc3RhdGljIHZvaWQKIF9faW50ZXJuYWxfYWRkX3RpbWVyKHN0cnVjdCB0dmVjX2Jhc2UgKmJhc2UsIHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKIHsKQEAgLTM4MywxNSArMzk4LDE3IEBACiAKIHN0YXRpYyB2b2lkIGludGVybmFsX2FkZF90aW1lcihzdHJ1Y3QgdHZlY19iYXNlICpiYXNlLCBzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCiB7CisJKHZvaWQpY2F0Y2h1cF90aW1lcl9qaWZmaWVzKGJhc2UpOwogCV9faW50ZXJuYWxfYWRkX3RpbWVyKGJhc2UsIHRpbWVyKTsKIAkvKgogCSAqIFVwZGF0ZSBiYXNlLT5hY3RpdmVfdGltZXJzIGFuZCBiYXNlLT5uZXh0X3RpbWVyCiAJICovCiAJaWYgKCF0YmFzZV9nZXRfZGVmZXJyYWJsZSh0aW1lci0+YmFzZSkpIHsKLQkJaWYgKHRpbWVfYmVmb3JlKHRpbWVyLT5leHBpcmVzLCBiYXNlLT5uZXh0X3RpbWVyKSkKKwkJaWYgKCFiYXNlLT5hY3RpdmVfdGltZXJzKysgfHwKKwkJICAgIHRpbWVfYmVmb3JlKHRpbWVyLT5leHBpcmVzLCBiYXNlLT5uZXh0X3RpbWVyKSkKIAkJCWJhc2UtPm5leHRfdGltZXIgPSB0aW1lci0+ZXhwaXJlczsKLQkJYmFzZS0+YWN0aXZlX3RpbWVycysrOwogCX0KKwliYXNlLT5hbGxfdGltZXJzKys7CiB9CiAKICNpZmRlZiBDT05GSUdfVElNRVJfU1RBVFMKQEAgLTY3MSw2ICs2ODgsOCBAQAogCWRldGFjaF90aW1lcih0aW1lciwgdHJ1ZSk7CiAJaWYgKCF0YmFzZV9nZXRfZGVmZXJyYWJsZSh0aW1lci0+YmFzZSkpCiAJCWJhc2UtPmFjdGl2ZV90aW1lcnMtLTsKKwliYXNlLT5hbGxfdGltZXJzLS07CisJKHZvaWQpY2F0Y2h1cF90aW1lcl9qaWZmaWVzKGJhc2UpOwogfQogCiBzdGF0aWMgaW50IGRldGFjaF9pZl9wZW5kaW5nKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgc3RydWN0IHR2ZWNfYmFzZSAqYmFzZSwKQEAgLTY4NSw2ICs3MDQsOCBAQAogCQlpZiAodGltZXItPmV4cGlyZXMgPT0gYmFzZS0+bmV4dF90aW1lcikKIAkJCWJhc2UtPm5leHRfdGltZXIgPSBiYXNlLT50aW1lcl9qaWZmaWVzOwogCX0KKwliYXNlLT5hbGxfdGltZXJzLS07CisJKHZvaWQpY2F0Y2h1cF90aW1lcl9qaWZmaWVzKGJhc2UpOwogCXJldHVybiAxOwogfQogCkBAIC03MzksMTIgKzc2MCw3IEBACiAKIAlkZWJ1Z19hY3RpdmF0ZSh0aW1lciwgZXhwaXJlcyk7CiAKLQljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19OT19IWl9DT01NT04pICYmIGRlZmluZWQoQ09ORklHX1NNUCkKLQlpZiAoIXBpbm5lZCAmJiBnZXRfc3lzY3RsX3RpbWVyX21pZ3JhdGlvbigpICYmIGlkbGVfY3B1KGNwdSkpCi0JCWNwdSA9IGdldF9ub2h6X3RpbWVyX3RhcmdldCgpOwotI2VuZGlmCisJY3B1ID0gZ2V0X25vaHpfdGltZXJfdGFyZ2V0KHBpbm5lZCk7CiAJbmV3X2Jhc2UgPSBwZXJfY3B1KHR2ZWNfYmFzZXMsIGNwdSk7CiAKIAlpZiAoYmFzZSAhPSBuZXdfYmFzZSkgewpAQCAtOTM5LDggKzk1NSwxNSBAQAogCSAqIHdpdGggdGhlIHRpbWVyIGJ5IGhvbGRpbmcgdGhlIHRpbWVyIGJhc2UgbG9jay4gVGhpcyBhbHNvCiAJICogbWFrZXMgc3VyZSB0aGF0IGEgQ1BVIG9uIHRoZSB3YXkgdG8gc3RvcCBpdHMgdGljayBjYW4gbm90CiAJICogZXZhbHVhdGUgdGhlIHRpbWVyIHdoZWVsLgorCSAqCisJICogU3BhcmUgdGhlIElQSSBmb3IgZGVmZXJyYWJsZSB0aW1lcnMgb24gaWRsZSB0YXJnZXRzIHRob3VnaC4KKwkgKiBUaGUgbmV4dCBidXN5IHRpY2tzIHdpbGwgdGFrZSBjYXJlIG9mIGl0LiBFeGNlcHQgZnVsbCBkeW50aWNrcworCSAqIHJlcXVpcmUgc3BlY2lhbCBjYXJlIGFnYWluc3QgcmFjZXMgd2l0aCBpZGxlX2NwdSgpLCBsZXRzIGRlYWwKKwkgKiB3aXRoIHRoYXQgbGF0ZXIuCiAJICovCi0Jd2FrZV91cF9ub2h6X2NwdShjcHUpOworCWlmICghdGJhc2VfZ2V0X2RlZmVycmFibGUodGltZXItPmJhc2UpIHx8IHRpY2tfbm9oel9mdWxsX2NwdShjcHUpKQorCQl3YWtlX3VwX25vaHpfY3B1KGNwdSk7CisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXNlLT5sb2NrLCBmbGFncyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhZGRfdGltZXJfb24pOwpAQCAtMTE0Niw2ICsxMTY5LDEwIEBACiAJc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyOwogCiAJc3Bpbl9sb2NrX2lycSgmYmFzZS0+bG9jayk7CisJaWYgKGNhdGNodXBfdGltZXJfamlmZmllcyhiYXNlKSkgeworCQlzcGluX3VubG9ja19pcnEoJmJhc2UtPmxvY2spOworCQlyZXR1cm47CisJfQogCXdoaWxlICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGJhc2UtPnRpbWVyX2ppZmZpZXMpKSB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgd29ya19saXN0OwogCQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJndvcmtfbGlzdDsKQEAgLTExNjAsNyArMTE4Nyw3IEBACiAJCQkJCSFjYXNjYWRlKGJhc2UsICZiYXNlLT50djQsIElOREVYKDIpKSkKIAkJCWNhc2NhZGUoYmFzZSwgJmJhc2UtPnR2NSwgSU5ERVgoMykpOwogCQkrK2Jhc2UtPnRpbWVyX2ppZmZpZXM7Ci0JCWxpc3RfcmVwbGFjZV9pbml0KGJhc2UtPnR2MS52ZWMgKyBpbmRleCwgJndvcmtfbGlzdCk7CisJCWxpc3RfcmVwbGFjZV9pbml0KGJhc2UtPnR2MS52ZWMgKyBpbmRleCwgaGVhZCk7CiAJCXdoaWxlICghbGlzdF9lbXB0eShoZWFkKSkgewogCQkJdm9pZCAoKmZuKSh1bnNpZ25lZCBsb25nKTsKIAkJCXVuc2lnbmVkIGxvbmcgZGF0YTsKQEAgLTE1MjMsOSArMTU1MCw4IEBACiAJCQlpZiAoIWJhc2UpCiAJCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJCS8qIE1ha2Ugc3VyZSB0aGF0IHR2ZWNfYmFzZSBpcyAyIGJ5dGUgYWxpZ25lZCAqLwotCQkJaWYgKHRiYXNlX2dldF9kZWZlcnJhYmxlKGJhc2UpKSB7Ci0JCQkJV0FSTl9PTigxKTsKKwkJCS8qIE1ha2Ugc3VyZSB0dmVjX2Jhc2UgaGFzIFRJTUVSX0ZMQUdfTUFTSyBiaXRzIGZyZWUgKi8KKwkJCWlmIChXQVJOX09OKGJhc2UgIT0gdGJhc2VfZ2V0X2Jhc2UoYmFzZSkpKSB7CiAJCQkJa2ZyZWUoYmFzZSk7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CkBAIC0xNTU5LDYgKzE1ODUsNyBAQAogCWJhc2UtPnRpbWVyX2ppZmZpZXMgPSBqaWZmaWVzOwogCWJhc2UtPm5leHRfdGltZXIgPSBiYXNlLT50aW1lcl9qaWZmaWVzOwogCWJhc2UtPmFjdGl2ZV90aW1lcnMgPSAwOworCWJhc2UtPmFsbF90aW1lcnMgPSAwOwogCXJldHVybiAwOwogfQogCkBAIC0xNjQ4LDkgKzE2NzUsOSBAQAogCiAJZXJyID0gdGltZXJfY3B1X25vdGlmeSgmdGltZXJzX25iLCAodW5zaWduZWQgbG9uZylDUFVfVVBfUFJFUEFSRSwKIAkJCSAgICAgICAodm9pZCAqKShsb25nKXNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JaW5pdF90aW1lcl9zdGF0cygpOwotCiAJQlVHX09OKGVyciAhPSBOT1RJRllfT0spOworCisJaW5pdF90aW1lcl9zdGF0cygpOwogCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmdGltZXJzX25iKTsKIAlvcGVuX3NvZnRpcnEoVElNRVJfU09GVElSUSwgcnVuX3RpbWVyX3NvZnRpcnEpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL2Jsa3RyYWNlLmMgYi9rZXJuZWwvdHJhY2UvYmxrdHJhY2UuYwppbmRleCBiNDE4Y2IwLi40ZjNhM2MwMyAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL2Jsa3RyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL2Jsa3RyYWNlLmMKQEAgLTcwMiw2ICs3MDIsNyBAQAogICogYmxrX2FkZF90cmFjZV9ycSAtIEFkZCBhIHRyYWNlIGZvciBhIHJlcXVlc3Qgb3JpZW50ZWQgYWN0aW9uCiAgKiBAcToJCXF1ZXVlIHRoZSBpbyBpcyBmb3IKICAqIEBycToJCXRoZSBzb3VyY2UgcmVxdWVzdAorICogQG5yX2J5dGVzOgludW1iZXIgb2YgY29tcGxldGVkIGJ5dGVzCiAgKiBAd2hhdDoJdGhlIGFjdGlvbgogICoKICAqIERlc2NyaXB0aW9uOgpAQCAtNzA5LDcgKzcxMCw3IEBACiAgKgogICoqLwogc3RhdGljIHZvaWQgYmxrX2FkZF90cmFjZV9ycShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAotCQkJICAgICB1MzIgd2hhdCkKKwkJCSAgICAgdW5zaWduZWQgaW50IG5yX2J5dGVzLCB1MzIgd2hhdCkKIHsKIAlzdHJ1Y3QgYmxrX3RyYWNlICpidCA9IHEtPmJsa190cmFjZTsKIApAQCAtNzE4LDExICs3MTksMTEgQEAKIAogCWlmIChycS0+Y21kX3R5cGUgPT0gUkVRX1RZUEVfQkxPQ0tfUEMpIHsKIAkJd2hhdCB8PSBCTEtfVENfQUNUKEJMS19UQ19QQyk7Ci0JCV9fYmxrX2FkZF90cmFjZShidCwgMCwgYmxrX3JxX2J5dGVzKHJxKSwgcnEtPmNtZF9mbGFncywKKwkJX19ibGtfYWRkX3RyYWNlKGJ0LCAwLCBucl9ieXRlcywgcnEtPmNtZF9mbGFncywKIAkJCQl3aGF0LCBycS0+ZXJyb3JzLCBycS0+Y21kX2xlbiwgcnEtPmNtZCk7CiAJfSBlbHNlICB7CiAJCXdoYXQgfD0gQkxLX1RDX0FDVChCTEtfVENfRlMpOwotCQlfX2Jsa19hZGRfdHJhY2UoYnQsIGJsa19ycV9wb3MocnEpLCBibGtfcnFfYnl0ZXMocnEpLAorCQlfX2Jsa19hZGRfdHJhY2UoYnQsIGJsa19ycV9wb3MocnEpLCBucl9ieXRlcywKIAkJCQlycS0+Y21kX2ZsYWdzLCB3aGF0LCBycS0+ZXJyb3JzLCAwLCBOVUxMKTsKIAl9CiB9CkBAIC03MzAsMzMgKzczMSwzNCBAQAogc3RhdGljIHZvaWQgYmxrX2FkZF90cmFjZV9ycV9hYm9ydCh2b2lkICppZ25vcmUsCiAJCQkJICAgc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKLQlibGtfYWRkX3RyYWNlX3JxKHEsIHJxLCBCTEtfVEFfQUJPUlQpOworCWJsa19hZGRfdHJhY2VfcnEocSwgcnEsIGJsa19ycV9ieXRlcyhycSksIEJMS19UQV9BQk9SVCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJsa19hZGRfdHJhY2VfcnFfaW5zZXJ0KHZvaWQgKmlnbm9yZSwKIAkJCQkgICAgc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKLQlibGtfYWRkX3RyYWNlX3JxKHEsIHJxLCBCTEtfVEFfSU5TRVJUKTsKKwlibGtfYWRkX3RyYWNlX3JxKHEsIHJxLCBibGtfcnFfYnl0ZXMocnEpLCBCTEtfVEFfSU5TRVJUKTsKIH0KIAogc3RhdGljIHZvaWQgYmxrX2FkZF90cmFjZV9ycV9pc3N1ZSh2b2lkICppZ25vcmUsCiAJCQkJICAgc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKLQlibGtfYWRkX3RyYWNlX3JxKHEsIHJxLCBCTEtfVEFfSVNTVUUpOworCWJsa19hZGRfdHJhY2VfcnEocSwgcnEsIGJsa19ycV9ieXRlcyhycSksIEJMS19UQV9JU1NVRSk7CiB9CiAKIHN0YXRpYyB2b2lkIGJsa19hZGRfdHJhY2VfcnFfcmVxdWV1ZSh2b2lkICppZ25vcmUsCiAJCQkJICAgICBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKIAkJCQkgICAgIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKLQlibGtfYWRkX3RyYWNlX3JxKHEsIHJxLCBCTEtfVEFfUkVRVUVVRSk7CisJYmxrX2FkZF90cmFjZV9ycShxLCBycSwgYmxrX3JxX2J5dGVzKHJxKSwgQkxLX1RBX1JFUVVFVUUpOwogfQogCiBzdGF0aWMgdm9pZCBibGtfYWRkX3RyYWNlX3JxX2NvbXBsZXRlKHZvaWQgKmlnbm9yZSwKIAkJCQkgICAgICBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKLQkJCQkgICAgICBzdHJ1Y3QgcmVxdWVzdCAqcnEpCisJCQkJICAgICAgc3RydWN0IHJlcXVlc3QgKnJxLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBucl9ieXRlcykKIHsKLQlibGtfYWRkX3RyYWNlX3JxKHEsIHJxLCBCTEtfVEFfQ09NUExFVEUpOworCWJsa19hZGRfdHJhY2VfcnEocSwgcnEsIG5yX2J5dGVzLCBCTEtfVEFfQ09NUExFVEUpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2tlcm5lbC91cC5jIGIva2VybmVsL3VwLmMKaW5kZXggNTA5NDAzZS4uMTc2MGJmMyAxMDA2NDQKLS0tIGEva2VybmVsL3VwLmMKKysrIGIva2VybmVsL3VwLmMKQEAgLTIyLDE2ICsyMiwxNiBAQAogfQogRVhQT1JUX1NZTUJPTChzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUpOwogCi12b2lkIF9fc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGludCBjcHUsIHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhICpjc2QsCi0JCQkJaW50IHdhaXQpCitpbnQgc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2FzeW5jKGludCBjcHUsIHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhICpjc2QpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAljc2QtPmZ1bmMoY3NkLT5pbmZvKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKF9fc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKTsKK0VYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2FzeW5jKTsKIAogaW50IG9uX2VhY2hfY3B1KHNtcF9jYWxsX2Z1bmNfdCBmdW5jLCB2b2lkICppbmZvLCBpbnQgd2FpdCkKIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC93YXRjaGRvZy5jIGIva2VybmVsL3dhdGNoZG9nLmMKaW5kZXggNDQzMTYxMC4uMDFjNmY5NyAxMDA2NDQKLS0tIGEva2VybmVsL3dhdGNoZG9nLmMKKysrIGIva2VybmVsL3dhdGNoZG9nLmMKQEAgLTUwNSw3ICs1MDUsNiBAQAogCiBzdGF0aWMgdm9pZCB1cGRhdGVfdGltZXJzKGludCBjcHUpCiB7Ci0Jc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgZGF0YSA9IHsuZnVuYyA9IHJlc3RhcnRfd2F0Y2hkb2dfaHJ0aW1lcn07CiAJLyoKIAkgKiBNYWtlIHN1cmUgdGhhdCBwZXJmIGV2ZW50IGNvdW50ZXIgd2lsbCBhZG9wdCB0byBhIG5ldwogCSAqIHNhbXBsaW5nIHBlcmlvZC4gVXBkYXRpbmcgdGhlIHNhbXBsaW5nIHBlcmlvZCBkaXJlY3RseSB3b3VsZApAQCAtNTE1LDcgKzUxNCw3IEBACiAJICogbWlnaHQgYmUgbGF0ZSBhbHJlYWR5IHNvIHdlIGhhdmUgdG8gcmVzdGFydCB0aGUgdGltZXIgYXMgd2VsbC4KIAkgKi8KIAl3YXRjaGRvZ19ubWlfZGlzYWJsZShjcHUpOwotCV9fc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgJmRhdGEsIDEpOworCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIHJlc3RhcnRfd2F0Y2hkb2dfaHJ0aW1lciwgTlVMTCwgMSk7CiAJd2F0Y2hkb2dfbm1pX2VuYWJsZShjcHUpOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvd29ya3F1ZXVlLmMgYi9rZXJuZWwvd29ya3F1ZXVlLmMKaW5kZXggM2ZhNWI4Zi4uMGVlNjNhZiAxMDA2NDQKLS0tIGEva2VybmVsL3dvcmtxdWV1ZS5jCisrKyBiL2tlcm5lbC93b3JrcXVldWUuYwpAQCAtNTE2LDYgKzUxNiwxMyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGVzdHJveV93b3JrX29uX3N0YWNrKTsKIAordm9pZCBkZXN0cm95X2RlbGF5ZWRfd29ya19vbl9zdGFjayhzdHJ1Y3QgZGVsYXllZF93b3JrICp3b3JrKQoreworCWRlc3Ryb3lfdGltZXJfb25fc3RhY2soJndvcmstPnRpbWVyKTsKKwlkZWJ1Z19vYmplY3RfZnJlZSgmd29yay0+d29yaywgJndvcmtfZGVidWdfZGVzY3IpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGVzdHJveV9kZWxheWVkX3dvcmtfb25fc3RhY2spOworCiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX3dvcmtfYWN0aXZhdGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z193b3JrX2RlYWN0aXZhdGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKSB7IH0KZGlmZiAtLWdpdCBhL2xpYi9pZHIuYyBiL2xpYi9pZHIuYwppbmRleCBiZmU0ZGI0Li4xYmE0OTU2IDEwMDY0NAotLS0gYS9saWIvaWRyLmMKKysrIGIvbGliL2lkci5jCkBAIC04NjksNiArODY5LDE2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGlkcl9pbml0KTsKIAorc3RhdGljIGludCBpZHJfaGFzX2VudHJ5KGludCBpZCwgdm9pZCAqcCwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gMTsKK30KKworYm9vbCBpZHJfaXNfZW1wdHkoc3RydWN0IGlkciAqaWRwKQoreworCXJldHVybiAhaWRyX2Zvcl9lYWNoKGlkcCwgaWRyX2hhc19lbnRyeSwgTlVMTCk7Cit9CitFWFBPUlRfU1lNQk9MKGlkcl9pc19lbXB0eSk7CiAKIC8qKgogICogRE9DOiBJREEgZGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhL2xpYi9rb2JqZWN0LmMgYi9saWIva29iamVjdC5jCmluZGV4IGNiMTRhZWEuLjU4NzUxYmIgMTAwNjQ0Ci0tLSBhL2xpYi9rb2JqZWN0LmMKKysrIGIvbGliL2tvYmplY3QuYwpAQCAtOTQsNyArOTQsNyBAQAogCQlCVUdfT04ob3BzLT50eXBlID49IEtPQkpfTlNfVFlQRVMpOwogCQlCVUdfT04oIWtvYmpfbnNfdHlwZV9yZWdpc3RlcmVkKG9wcy0+dHlwZSkpOwogCi0JCWtlcm5mc19lbmFibGVfbnMoa29iai0+c2QpOworCQlzeXNmc19lbmFibGVfbnMoa29iai0+c2QpOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCAxODViNmQzLi41ZTJjZjZmIDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtNzE5LDEwICs3MTksMTUgQEAKIAkJc3BlY3AgPSAmbWVtX3NwZWM7CiAJCWRlY29kZSA9IDA7CiAJfQotCXAgPSBudW1iZXIocCwgcGVuZCwgcmVzLT5zdGFydCwgKnNwZWNwKTsKLQlpZiAocmVzLT5zdGFydCAhPSByZXMtPmVuZCkgewotCQkqcCsrID0gJy0nOwotCQlwID0gbnVtYmVyKHAsIHBlbmQsIHJlcy0+ZW5kLCAqc3BlY3ApOworCWlmIChkZWNvZGUgJiYgcmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpIHsKKwkJcCA9IHN0cmluZyhwLCBwZW5kLCAic2l6ZSAiLCBzdHJfc3BlYyk7CisJCXAgPSBudW1iZXIocCwgcGVuZCwgcmVzb3VyY2Vfc2l6ZShyZXMpLCAqc3BlY3ApOworCX0gZWxzZSB7CisJCXAgPSBudW1iZXIocCwgcGVuZCwgcmVzLT5zdGFydCwgKnNwZWNwKTsKKwkJaWYgKHJlcy0+c3RhcnQgIT0gcmVzLT5lbmQpIHsKKwkJCSpwKysgPSAnLSc7CisJCQlwID0gbnVtYmVyKHAsIHBlbmQsIHJlcy0+ZW5kLCAqc3BlY3ApOworCQl9CiAJfQogCWlmIChkZWNvZGUpIHsKIAkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTV82NCkKZGlmZiAtLWdpdCBhL21tL21tYXAuYyBiL21tL21tYXAuYwppbmRleCAyMGZmMGMzLi44MWJhNTRmIDEwMDY0NAotLS0gYS9tbS9tbWFwLmMKKysrIGIvbW0vbW1hcC5jCkBAIC0yOTE4LDcgKzI5MTgsNyBAQAogICogVGhlIGFycmF5IHBvaW50ZXIgYW5kIHRoZSBwYWdlcyBpdCBwb2ludHMgdG8gYXJlIGFzc3VtZWQgdG8gc3RheSBhbGl2ZQogICogZm9yIGFzIGxvbmcgYXMgdGhpcyBtYXBwaW5nIG1pZ2h0IGV4aXN0LgogICovCi1pbnQgaW5zdGFsbF9zcGVjaWFsX21hcHBpbmcoc3RydWN0IG1tX3N0cnVjdCAqbW0sCitzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKl9pbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgdm1fZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpCiB7CkBAIC0yOTI3LDcgKzI5MjcsNyBAQAogCiAJdm1hID0ga21lbV9jYWNoZV96YWxsb2Modm1fYXJlYV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSh2bWEgPT0gTlVMTCkpCi0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCUlOSVRfTElTVF9IRUFEKCZ2bWEtPmFub25fdm1hX2NoYWluKTsKIAl2bWEtPnZtX21tID0gbW07CkBAIC0yOTQ4LDExICsyOTQ4LDIzIEBACiAKIAlwZXJmX2V2ZW50X21tYXAodm1hKTsKIAotCXJldHVybiAwOworCXJldHVybiB2bWE7CiAKIG91dDoKIAlrbWVtX2NhY2hlX2ZyZWUodm1fYXJlYV9jYWNoZXAsIHZtYSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCitpbnQgaW5zdGFsbF9zcGVjaWFsX21hcHBpbmcoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCSAgICB1bnNpZ25lZCBsb25nIHZtX2ZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQoreworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gX2luc3RhbGxfc3BlY2lhbF9tYXBwaW5nKG1tLAorCQkJICAgIGFkZHIsIGxlbiwgdm1fZmxhZ3MsIHBhZ2VzKTsKKworCWlmIChJU19FUlIodm1hKSkKKwkJcmV0dXJuIFBUUl9FUlIodm1hKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIERFRklORV9NVVRFWChtbV9hbGxfbG9ja3NfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGV2LmMgYi9uZXQvY29yZS9kZXYuYwppbmRleCA0NWZhMmYxLi5iYzNjODk3IDEwMDY0NAotLS0gYS9uZXQvY29yZS9kZXYuYworKysgYi9uZXQvY29yZS9kZXYuYwpAQCAtNDEzNSw4ICs0MTM1LDggQEAKIAkJCXN0cnVjdCBzb2Z0bmV0X2RhdGEgKm5leHQgPSByZW1zZC0+cnBzX2lwaV9uZXh0OwogCiAJCQlpZiAoY3B1X29ubGluZShyZW1zZC0+Y3B1KSkKLQkJCQlfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShyZW1zZC0+Y3B1LAotCQkJCQkJCSAgICZyZW1zZC0+Y3NkLCAwKTsKKwkJCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGVfYXN5bmMocmVtc2QtPmNwdSwKKwkJCQkJCQkgICAmcmVtc2QtPmNzZCk7CiAJCQlyZW1zZCA9IG5leHQ7CiAJCX0KIAl9IGVsc2UKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL2RldmljZXRhYmxlLW9mZnNldHMuYyBiL3NjcmlwdHMvbW9kL2RldmljZXRhYmxlLW9mZnNldHMuYwppbmRleCBiYjVkMTE1Li5mMjgyNTE2IDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9kZXZpY2V0YWJsZS1vZmZzZXRzLmMKKysrIGIvc2NyaXB0cy9tb2QvZGV2aWNldGFibGUtb2Zmc2V0cy5jCkBAIC0xNzQsNiArMTc0LDkgQEAKIAlERVZJRF9GSUVMRCh4ODZfY3B1X2lkLCBtb2RlbCk7CiAJREVWSURfRklFTEQoeDg2X2NwdV9pZCwgdmVuZG9yKTsKIAorCURFVklEKGNwdV9mZWF0dXJlKTsKKwlERVZJRF9GSUVMRChjcHVfZmVhdHVyZSwgZmVhdHVyZSk7CisKIAlERVZJRChtZWlfY2xfZGV2aWNlX2lkKTsKIAlERVZJRF9GSUVMRChtZWlfY2xfZGV2aWNlX2lkLCBuYW1lKTsKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jIGIvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jCmluZGV4IDI1ZTVjYjAuLjI1ZjZmNTkgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYworKysgYi9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMKQEAgLTExMTAsNyArMTExMCw3IEBACiB9CiBBRERfVE9fREVWVEFCTEUoImFtYmEiLCBhbWJhX2lkLCBkb19hbWJhX2VudHJ5KTsKIAotLyogTE9PS1MgbGlrZSB4ODZjcHU6dmVuZG9yOlZWVlY6ZmFtaWx5OkZGRkY6bW9kZWw6TU1NTTpmZWF0dXJlOiosRkVBVCwqCisvKiBMT09LUyBsaWtlIGNwdTp0eXBlOng4Nix2ZW5WVlZWZmFtRkZGRm1vZE1NTU06ZmVhdHVyZToqLEZFQVQsKgogICogQWxsIGZpZWxkcyBhcmUgbnVtYmVycy4gSXQgd291bGQgYmUgbmljZXIgdG8gdXNlIHN0cmluZ3MgZm9yIHZlbmRvcgogICogYW5kIGZlYXR1cmUsIGJ1dCBnZXR0aW5nIHRob3NlIG91dCBvZiB0aGUgYnVpbGQgc3lzdGVtIGhlcmUgaXMgdG9vCiAgKiBjb21wbGljYXRlZC4KQEAgLTExMjQsMTAgKzExMjQsMTAgQEAKIAlERUZfRklFTEQoc3ltdmFsLCB4ODZfY3B1X2lkLCBtb2RlbCk7CiAJREVGX0ZJRUxEKHN5bXZhbCwgeDg2X2NwdV9pZCwgdmVuZG9yKTsKIAotCXN0cmNweShhbGlhcywgIng4NmNwdToiKTsKLQlBREQoYWxpYXMsICJ2ZW5kb3I6IiwgIHZlbmRvciAhPSBYODZfVkVORE9SX0FOWSwgdmVuZG9yKTsKLQlBREQoYWxpYXMsICI6ZmFtaWx5OiIsIGZhbWlseSAhPSBYODZfRkFNSUxZX0FOWSwgZmFtaWx5KTsKLQlBREQoYWxpYXMsICI6bW9kZWw6IiwgIG1vZGVsICAhPSBYODZfTU9ERUxfQU5ZLCAgbW9kZWwpOworCXN0cmNweShhbGlhcywgImNwdTp0eXBlOng4NiwiKTsKKwlBREQoYWxpYXMsICJ2ZW4iLCB2ZW5kb3IgIT0gWDg2X1ZFTkRPUl9BTlksIHZlbmRvcik7CisJQUREKGFsaWFzLCAiZmFtIiwgZmFtaWx5ICE9IFg4Nl9GQU1JTFlfQU5ZLCBmYW1pbHkpOworCUFERChhbGlhcywgIm1vZCIsIG1vZGVsICAhPSBYODZfTU9ERUxfQU5ZLCAgbW9kZWwpOwogCXN0cmNhdChhbGlhcywgIjpmZWF0dXJlOioiKTsKIAlpZiAoZmVhdHVyZSAhPSBYODZfRkVBVFVSRV9BTlkpCiAJCXNwcmludGYoYWxpYXMgKyBzdHJsZW4oYWxpYXMpLCAiJTA0WCoiLCBmZWF0dXJlKTsKQEAgLTExMzUsNiArMTEzNSwxNiBAQAogfQogQUREX1RPX0RFVlRBQkxFKCJ4ODZjcHUiLCB4ODZfY3B1X2lkLCBkb194ODZjcHVfZW50cnkpOwogCisvKiBMT09LUyBsaWtlIGNwdTp0eXBlOio6ZmVhdHVyZToqRkVBVCogKi8KK3N0YXRpYyBpbnQgZG9fY3B1X2VudHJ5KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpzeW12YWwsIGNoYXIgKmFsaWFzKQoreworCURFRl9GSUVMRChzeW12YWwsIGNwdV9mZWF0dXJlLCBmZWF0dXJlKTsKKworCXNwcmludGYoYWxpYXMsICJjcHU6dHlwZToqOmZlYXR1cmU6KiUwNFgqIiwgZmVhdHVyZSk7CisJcmV0dXJuIDE7Cit9CitBRERfVE9fREVWVEFCTEUoImNwdSIsIGNwdV9mZWF0dXJlLCBkb19jcHVfZW50cnkpOworCiAvKiBMb29rcyBsaWtlOiBtZWk6UyAqLwogc3RhdGljIGludCBkb19tZWlfZW50cnkoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKnN5bXZhbCwKIAkJCWNoYXIgKmFsaWFzKQpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2FvYS5oIGIvc291bmQvYW9hL2FvYS5oCmluZGV4IGUwODc4OTQuLjM0YzY2OGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9hb2EuaAorKysgYi9zb3VuZC9hb2EvYW9hLmgKQEAgLTExNiw3ICsxMTYsNyBAQAogCXN0cnVjdCBzbmRfY2FyZCAqYWxzYV9jYXJkOwogfTsKICAgICAgICAgCi1leHRlcm4gaW50IGFvYV9zbmRfZGV2aWNlX25ldyhzbmRfZGV2aWNlX3R5cGVfdCB0eXBlLAorZXh0ZXJuIGludCBhb2Ffc25kX2RldmljZV9uZXcoZW51bSBzbmRfZGV2aWNlX3R5cGUgdHlwZSwKIAl2b2lkICogZGV2aWNlX2RhdGEsIHN0cnVjdCBzbmRfZGV2aWNlX29wcyAqIG9wcyk7CiBleHRlcm4gc3RydWN0IHNuZF9jYXJkICphb2FfZ2V0X2NhcmQodm9pZCk7CiBleHRlcm4gaW50IGFvYV9zbmRfY3RsX2FkZChzdHJ1Y3Qgc25kX2tjb250cm9sKiBjb250cm9sKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb2RlY3Mvb255eC5jIGIvc291bmQvYW9hL2NvZGVjcy9vbnl4LmMKaW5kZXggNGNlZGM2OS4uZjAxYmZmYiAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2NvZGVjcy9vbnl4LmMKKysrIGIvc291bmQvYW9hL2NvZGVjcy9vbnl4LmMKQEAgLTg4OSw3ICs4ODksNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoYW9hX3NuZF9kZXZpY2VfbmV3KFNORFJWX0RFVl9MT1dMRVZFTCwgb255eCwgJm9wcykpIHsKKwlpZiAoYW9hX3NuZF9kZXZpY2VfbmV3KFNORFJWX0RFVl9DT0RFQywgb255eCwgJm9wcykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmFpbGVkIHRvIGNyZWF0ZSBvbnl4IHNuZCBkZXZpY2UhXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2NvZGVjcy90YXMuYyBiL3NvdW5kL2FvYS9jb2RlY3MvdGFzLmMKaW5kZXggYzQ5MWFlMC4uY2YzYzYzMCAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2NvZGVjcy90YXMuYworKysgYi9zb3VuZC9hb2EvY29kZWNzL3Rhcy5jCkBAIC04MjYsNyArODI2LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKGFvYV9zbmRfZGV2aWNlX25ldyhTTkRSVl9ERVZfTE9XTEVWRUwsIHRhcywgJm9wcykpIHsKKwlpZiAoYW9hX3NuZF9kZXZpY2VfbmV3KFNORFJWX0RFVl9DT0RFQywgdGFzLCAmb3BzKSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJmYWlsZWQgdG8gY3JlYXRlIHRhcyBzbmQgZGV2aWNlIVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb2RlY3MvdG9vbmllLmMgYi9zb3VuZC9hb2EvY29kZWNzL3Rvb25pZS5jCmluZGV4IDY5ZDJjYjYuLjdlOGMzNDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9jb2RlY3MvdG9vbmllLmMKKysrIGIvc291bmQvYW9hL2NvZGVjcy90b29uaWUuYwpAQCAtOTIsNyArOTIsNyBAQAogCWlmICh0b29uaWUtPmNvZGVjLmNvbm5lY3RlZCAhPSAxKQogCQlyZXR1cm4gLUVOT1RDT05OOwogCi0JaWYgKGFvYV9zbmRfZGV2aWNlX25ldyhTTkRSVl9ERVZfTE9XTEVWRUwsIHRvb25pZSwgJm9wcykpIHsKKwlpZiAoYW9hX3NuZF9kZXZpY2VfbmV3KFNORFJWX0RFVl9DT0RFQywgdG9vbmllLCAmb3BzKSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJmYWlsZWQgdG8gY3JlYXRlIHRvb25pZSBzbmQgZGV2aWNlIVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb3JlL2Fsc2EuYyBiL3NvdW5kL2FvYS9jb3JlL2Fsc2EuYwppbmRleCAwZmEzODU1Li40YTdlNGU2IDEwMDY0NAotLS0gYS9zb3VuZC9hb2EvY29yZS9hbHNhLmMKKysrIGIvc291bmQvYW9hL2NvcmUvYWxzYS5jCkBAIC0yMywxMyArMjMsMTIgQEAKIAkJLyogY2Fubm90IGJlIEVFWElTVCBkdWUgdG8gdXNhZ2UgaW4gYW9hX2ZhYnJpY19yZWdpc3RlciAqLwogCQlyZXR1cm4gLUVCVVNZOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBuYW1lLCBtb2QsIHNpemVvZihzdHJ1Y3QgYW9hX2NhcmQpLAotCQkJICAgICAgJmFsc2FfY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KGRldiwgaW5kZXgsIG5hbWUsIG1vZCwgc2l6ZW9mKHN0cnVjdCBhb2FfY2FyZCksCisJCQkgICAmYWxzYV9jYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlhb2FfY2FyZCA9IGFsc2FfY2FyZC0+cHJpdmF0ZV9kYXRhOwogCWFvYV9jYXJkLT5hbHNhX2NhcmQgPSBhbHNhX2NhcmQ7Ci0JYWxzYV9jYXJkLT5kZXYgPSBkZXY7CiAJc3RybGNweShhbHNhX2NhcmQtPmRyaXZlciwgIkFwcGxlT25iZEF1ZGlvIiwgc2l6ZW9mKGFsc2FfY2FyZC0+ZHJpdmVyKSk7CiAJc3RybGNweShhbHNhX2NhcmQtPnNob3J0bmFtZSwgbmFtZSwgc2l6ZW9mKGFsc2FfY2FyZC0+c2hvcnRuYW1lKSk7CiAJc3RybGNweShhbHNhX2NhcmQtPmxvbmduYW1lLCBuYW1lLCBzaXplb2YoYWxzYV9jYXJkLT5sb25nbmFtZSkpOwpAQCAtNjAsNyArNTksNyBAQAogCX0KIH0KIAotaW50IGFvYV9zbmRfZGV2aWNlX25ldyhzbmRfZGV2aWNlX3R5cGVfdCB0eXBlLAoraW50IGFvYV9zbmRfZGV2aWNlX25ldyhlbnVtIHNuZF9kZXZpY2VfdHlwZSB0eXBlLAogCQkgICAgICAgdm9pZCAqIGRldmljZV9kYXRhLCBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgKiBvcHMpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gYW9hX2dldF9jYXJkKCk7CmRpZmYgLS1naXQgYS9zb3VuZC9hcm0vYWFjaS5jIGIvc291bmQvYXJtL2FhY2kuYwppbmRleCBjNDIxZmRiLi4wZTgzYTczIDEwMDY0NAotLS0gYS9zb3VuZC9hcm0vYWFjaS5jCisrKyBiL3NvdW5kL2FybS9hYWNpLmMKQEAgLTg5OSw4ICs4OTksOCBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxLAotCQkJICAgICAgVEhJU19NT0RVTEUsIHNpemVvZihzdHJ1Y3QgYWFjaSksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmRldi0+ZGV2LCBTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKKwkJCSAgIFRISVNfTU9EVUxFLCBzaXplb2Yoc3RydWN0IGFhY2kpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBOVUxMOwogCkBAIC0xMDU1LDggKzEwNTUsNiBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0Jc25kX2NhcmRfc2V0X2RldihhYWNpLT5jYXJkLCAmZGV2LT5kZXYpOwotCiAJcmV0ID0gc25kX2NhcmRfcmVnaXN0ZXIoYWFjaS0+Y2FyZCk7CiAJaWYgKHJldCA9PSAwKSB7CiAJCWRldl9pbmZvKCZkZXYtPmRldiwgIiVzXG4iLCBhYWNpLT5jYXJkLT5sb25nbmFtZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9hcm0vcHhhMnh4LWFjOTcuYyBiL3NvdW5kL2FybS9weGEyeHgtYWM5Ny5jCmluZGV4IDlhMmFjMWUuLjNhMTBkZjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FybS9weGEyeHgtYWM5Ny5jCisrKyBiL3NvdW5kL2FybS9weGEyeHgtYWM5Ny5jCkBAIC0xNzksMTIgKzE3OSwxMSBAQAogCQlnb3RvIGVycl9kZXY7CiAJfQogCi0JcmV0ID0gc25kX2NhcmRfY3JlYXRlKFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxLAotCQkJICAgICAgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwlyZXQgPSBzbmRfY2FyZF9uZXcoJmRldi0+ZGV2LCBTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKKwkJCSAgIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyOwogCi0JY2FyZC0+ZGV2ID0gJmRldi0+ZGV2OwogCXN0cmxjcHkoY2FyZC0+ZHJpdmVyLCBkZXYtPmRldi5kcml2ZXItPm5hbWUsIHNpemVvZihjYXJkLT5kcml2ZXIpKTsKIAogCXJldCA9IHB4YTJ4eF9wY21fbmV3KGNhcmQsICZweGEyeHhfYWM5N19wY21fY2xpZW50LCAmcHhhMnh4X2FjOTdfcGNtKTsKQEAgLTIxMCw3ICsyMDksNiBAQAogCiAJaWYgKHBkYXRhICYmIHBkYXRhLT5jb2RlY19wZGF0YVswXSkKIAkJc25kX2FjOTdfZGV2X2FkZF9wZGF0YShhYzk3X2J1cy0+Y29kZWNbMF0sIHBkYXRhLT5jb2RlY19wZGF0YVswXSk7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2LT5kZXYpOwogCXJldCA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChyZXQgPT0gMCkgewogCQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIGNhcmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvYXRtZWwvYWJkYWMuYyBiL3NvdW5kL2F0bWVsL2FiZGFjLmMKaW5kZXggMzUxOTUxOC4uZWRmMmNhNyAxMDA2NDQKLS0tIGEvc291bmQvYXRtZWwvYWJkYWMuYworKysgYi9zb3VuZC9hdG1lbC9hYmRhYy5jCkBAIC00MjksOCArNDI5LDkgQEAKIAl9CiAJY2xrX2VuYWJsZShwY2xrKTsKIAotCXJldHZhbCA9IHNuZF9jYXJkX2NyZWF0ZShTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKLQkJCVRISVNfTU9EVUxFLCBzaXplb2Yoc3RydWN0IGF0bWVsX2FiZGFjKSwgJmNhcmQpOworCXJldHZhbCA9IHNuZF9jYXJkX25ldygmcGRldi0+ZGV2LCBTTkRSVl9ERUZBVUxUX0lEWDEsCisJCQkgICAgICBTTkRSVl9ERUZBVUxUX1NUUjEsIFRISVNfTU9EVUxFLAorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBhdG1lbF9hYmRhYyksICZjYXJkKTsKIAlpZiAocmV0dmFsKSB7CiAJCWRldl9kYmcoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBjcmVhdGUgc291bmQgY2FyZCBkZXZpY2VcbiIpOwogCQlnb3RvIG91dF9wdXRfc2FtcGxlX2NsazsKQEAgLTQ2Nyw4ICs0NjgsNiBAQAogCQlnb3RvIG91dF91bm1hcF9yZWdzOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBkZXYtPmRldik7Ci0KIAlpZiAocGRhdGEtPmR3cy5kbWFfZGV2KSB7CiAJCWRtYV9jYXBfbWFza190IG1hc2s7CiAKQEAgLTQ5Miw3ICs0OTEsNyBAQAogCWlmICghcGRhdGEtPmR3cy5kbWFfZGV2IHx8ICFkYWMtPmRtYS5jaGFuKSB7CiAJCWRldl9kYmcoJnBkZXYtPmRldiwgIkRNQSBub3QgYXZhaWxhYmxlXG4iKTsKIAkJcmV0dmFsID0gLUVOT0RFVjsKLQkJZ290byBvdXRfdW5zZXRfY2FyZF9kZXY7CisJCWdvdG8gb3V0X3VubWFwX3JlZ3M7CiAJfQogCiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgIkF0bWVsIEFCREFDIik7CkBAIC01MjEsOSArNTIwLDYgQEAKIG91dF9yZWxlYXNlX2RtYToKIAlkbWFfcmVsZWFzZV9jaGFubmVsKGRhYy0+ZG1hLmNoYW4pOwogCWRhYy0+ZG1hLmNoYW4gPSBOVUxMOwotb3V0X3Vuc2V0X2NhcmRfZGV2OgotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgTlVMTCk7Ci0JZnJlZV9pcnEoaXJxLCBkYWMpOwogb3V0X3VubWFwX3JlZ3M6CiAJaW91bm1hcChkYWMtPnJlZ3MpOwogb3V0X2ZyZWVfY2FyZDoKQEAgLTU3OSw3ICs1NzUsNiBAQAogCiAJZG1hX3JlbGVhc2VfY2hhbm5lbChkYWMtPmRtYS5jaGFuKTsKIAlkYWMtPmRtYS5jaGFuID0gTlVMTDsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIE5VTEwpOwogCWlvdW5tYXAoZGFjLT5yZWdzKTsKIAlmcmVlX2lycShkYWMtPmlycSwgZGFjKTsKIAlzbmRfY2FyZF9mcmVlKGNhcmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvYXRtZWwvYWM5N2MuYyBiL3NvdW5kL2F0bWVsL2FjOTdjLmMKaW5kZXggYzVmMGRkZC4uMDVlYzA0OSAxMDA2NDQKLS0tIGEvc291bmQvYXRtZWwvYWM5N2MuYworKysgYi9zb3VuZC9hdG1lbC9hYzk3Yy5jCkBAIC05NDUsOCArOTQ1LDkgQEAKIAl9CiAJY2xrX2VuYWJsZShwY2xrKTsKIAotCXJldHZhbCA9IHNuZF9jYXJkX2NyZWF0ZShTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKLQkJCVRISVNfTU9EVUxFLCBzaXplb2Yoc3RydWN0IGF0bWVsX2FjOTdjKSwgJmNhcmQpOworCXJldHZhbCA9IHNuZF9jYXJkX25ldygmcGRldi0+ZGV2LCBTTkRSVl9ERUZBVUxUX0lEWDEsCisJCQkgICAgICBTTkRSVl9ERUZBVUxUX1NUUjEsIFRISVNfTU9EVUxFLAorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBhdG1lbF9hYzk3YyksICZjYXJkKTsKIAlpZiAocmV0dmFsKSB7CiAJCWRldl9kYmcoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBjcmVhdGUgc291bmQgY2FyZCBkZXZpY2VcbiIpOwogCQlnb3RvIGVycl9zbmRfY2FyZF9uZXc7CkBAIC05OTAsOCArOTkxLDYgQEAKIAkJY2hpcC0+cmVzZXRfcGluID0gLUVJTlZBTDsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOwotCiAJYXRtZWxfYWM5N2NfcmVzZXQoY2hpcCk7CiAKIAkvKiBFbmFibGUgb3ZlcnJ1biBpbnRlcnJ1cHQgZnJvbSBjb2RlYyBjaGFubmVsICovCkBAIC0xMTEzLDggKzExMTIsNiBAQAogCQljaGlwLT5kbWEudHhfY2hhbiA9IE5VTEw7CiAJfQogZXJyX2FjOTdfYnVzOgotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgTlVMTCk7Ci0KIAlpZiAoZ3Bpb19pc192YWxpZChjaGlwLT5yZXNldF9waW4pKQogCQlncGlvX2ZyZWUoY2hpcC0+cmVzZXRfcGluKTsKIApAQCAtMTE5NSw3ICsxMTkyLDYgQEAKIAkJY2hpcC0+ZG1hLnR4X2NoYW4gPSBOVUxMOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgTlVMTCk7CiAJc25kX2NhcmRfZnJlZShjYXJkKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9jb250cm9sLmMgYi9zb3VuZC9jb3JlL2NvbnRyb2wuYwppbmRleCBkOGFhMjA2Li5mMDM4ZjVhIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2NvbnRyb2wuYworKysgYi9zb3VuZC9jb3JlL2NvbnRyb2wuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAJaWYgKHNuZF9CVUdfT04oIWNhcmQgfHwgIWlkKSkKIAkJcmV0dXJuOwogCXJlYWRfbG9jaygmY2FyZC0+Y3RsX2ZpbGVzX3J3bG9jayk7Ci0jaWYgZGVmaW5lZChDT05GSUdfU05EX01JWEVSX09TUykgfHwgZGVmaW5lZChDT05GSUdfU05EX01JWEVSX09TU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfU05EX01JWEVSX09TUykKIAljYXJkLT5taXhlcl9vc3NfY2hhbmdlX2NvdW50Kys7CiAjZW5kaWYKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0bCwgJmNhcmQtPmN0bF9maWxlcywgbGlzdCkgewpAQCAtMTcwLDcgKzE3MCw3IEBACiAJCQlldi0+bWFzayA9IG1hc2s7CiAJCQlsaXN0X2FkZF90YWlsKCZldi0+bGlzdCwgJmN0bC0+ZXZlbnRzKTsKIAkJfSBlbHNlIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIk5vIG1lbW9yeSBhdmFpbGFibGUgdG8gYWxsb2NhdGUgZXZlbnRcbiIpOworCQkJZGV2X2VycihjYXJkLT5kZXYsICJObyBtZW1vcnkgYXZhaWxhYmxlIHRvIGFsbG9jYXRlIGV2ZW50XG4iKTsKIAkJfQogCV9mb3VuZDoKIAkJd2FrZV91cCgmY3RsLT5jaGFuZ2Vfc2xlZXApOwpAQCAtMjA2LDcgKzIwNiw3IEBACiAKIAlrY3RsID0ga3phbGxvYyhzaXplb2YoKmtjdGwpICsgc2l6ZW9mKHN0cnVjdCBzbmRfa2NvbnRyb2xfdm9sYXRpbGUpICogY29udHJvbC0+Y291bnQsIEdGUF9LRVJORUwpOwogCWlmIChrY3RsID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGFsbG9jYXRlIGNvbnRyb2wgaW5zdGFuY2VcbiIpOworCQlwcl9lcnIoIkFMU0E6IENhbm5vdCBhbGxvY2F0ZSBjb250cm9sIGluc3RhbmNlXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCSprY3RsID0gKmNvbnRyb2w7CkBAIC0yNDEsOSArMjQxLDggQEAKIAlpZiAobmNvbnRyb2wtPm5hbWUpIHsKIAkJc3RybGNweShrY3RsLmlkLm5hbWUsIG5jb250cm9sLT5uYW1lLCBzaXplb2Yoa2N0bC5pZC5uYW1lKSk7CiAJCWlmIChzdHJjbXAobmNvbnRyb2wtPm5hbWUsIGtjdGwuaWQubmFtZSkgIT0gMCkKLQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJICAgIkNvbnRyb2wgbmFtZSAnJXMnIHRydW5jYXRlZCB0byAnJXMnXG4iLAotCQkJCSAgIG5jb250cm9sLT5uYW1lLCBrY3RsLmlkLm5hbWUpOworCQkJcHJfd2FybigiQUxTQTogQ29udHJvbCBuYW1lICclcycgdHJ1bmNhdGVkIHRvICclcydcbiIsCisJCQkJbmNvbnRyb2wtPm5hbWUsIGtjdGwuaWQubmFtZSk7CiAJfQogCWtjdGwuaWQuaW5kZXggPSBuY29udHJvbC0+aW5kZXg7CiAJa2N0bC5jb3VudCA9IG5jb250cm9sLT5jb3VudCA/IG5jb250cm9sLT5jb3VudCA6IDE7CkBAIC0zMDYsNyArMzA1LDcgQEAKIAl3aGlsZSAoc25kX2N0bF9yZW1vdmVfbnVtaWRfY29uZmxpY3QoY2FyZCwgY291bnQpKSB7CiAJCWlmICgtLWl0ZXIgPT0gMCkgewogCQkJLyogdGhpcyBzaXR1YXRpb24gaXMgdmVyeSB1bmxpa2VseSAqLwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGFsbG9jYXRlIG5ldyBjb250cm9sIG51bWlkXG4iKTsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIG5ldyBjb250cm9sIG51bWlkXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJfQpAQCAtMzQxLDcgKzM0MCw3IEBACiAJZG93bl93cml0ZSgmY2FyZC0+Y29udHJvbHNfcndzZW0pOwogCWlmIChzbmRfY3RsX2ZpbmRfaWQoY2FyZCwgJmlkKSkgewogCQl1cF93cml0ZSgmY2FyZC0+Y29udHJvbHNfcndzZW0pOwotCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJjb250cm9sICVpOiVpOiVpOiVzOiVpIGlzIGFscmVhZHkgcHJlc2VudFxuIiwKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjb250cm9sICVpOiVpOiVpOiVzOiVpIGlzIGFscmVhZHkgcHJlc2VudFxuIiwKIAkJCQkJaWQuaWZhY2UsCiAJCQkJCWlkLmRldmljZSwKIAkJCQkJaWQuc3ViZGV2aWNlLApAQCAtMTQwNiw3ICsxNDA1LDcgQEAKIAkJfQogCX0KIAl1cF9yZWFkKCZzbmRfaW9jdGxfcndzZW0pOwotCXNuZF9wcmludGRkKCJ1bmtub3duIGlvY3RsID0gMHgleFxuIiwgY21kKTsKKwlkZXZfZGJnKGNhcmQtPmRldiwgInVua25vd24gaW9jdGwgPSAweCV4XG4iLCBjbWQpOwogCXJldHVybiAtRU5PVFRZOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2NvbnRyb2xfY29tcGF0LmMgYi9zb3VuZC9jb3JlL2NvbnRyb2xfY29tcGF0LmMKaW5kZXggMmJiOTVhNy4uYjljMDkxMCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9jb250cm9sX2NvbXBhdC5jCisrKyBiL3NvdW5kL2NvcmUvY29udHJvbF9jb21wYXQuYwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJfSBlbHNlIHsKIAkJc2l6ZSA9IGdldF9lbGVtX3NpemUodHlwZSwgY291bnQpOwogCQlpZiAoc2l6ZSA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAic25kX2lvY3RsMzJfY3RsX2VsZW1fdmFsdWU6IHVua25vd24gdHlwZSAlZFxuIiwgdHlwZSk7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwgInNuZF9pb2N0bDMyX2N0bF9lbGVtX3ZhbHVlOiB1bmtub3duIHR5cGUgJWRcbiIsIHR5cGUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEtPnZhbHVlLmJ5dGVzLmRhdGEsCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2RldmljZS5jIGIvc291bmQvY29yZS9kZXZpY2UuYwppbmRleCBkZjg4ZGVmLi40MWJlYzMwIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2RldmljZS5jCisrKyBiL3NvdW5kL2NvcmUvZGV2aWNlLmMKQEAgLTQxLDI4ICs0MSw3MiBAQAogICoKICAqIFJldHVybjogWmVybyBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICAqLwotaW50IHNuZF9kZXZpY2VfbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc25kX2RldmljZV90eXBlX3QgdHlwZSwKK2ludCBzbmRfZGV2aWNlX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGVudW0gc25kX2RldmljZV90eXBlIHR5cGUsCiAJCSAgIHZvaWQgKmRldmljZV9kYXRhLCBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgKm9wcykKIHsKIAlzdHJ1Y3Qgc25kX2RldmljZSAqZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAKIAlpZiAoc25kX0JVR19PTighY2FyZCB8fCAhZGV2aWNlX2RhdGEgfHwgIW9wcykpCiAJCXJldHVybiAtRU5YSU87CiAJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwogCWlmIChkZXYgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgYWxsb2NhdGUgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJDYW5ub3QgYWxsb2NhdGUgZGV2aWNlLCB0eXBlPSVkXG4iLCB0eXBlKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQorCUlOSVRfTElTVF9IRUFEKCZkZXYtPmxpc3QpOwogCWRldi0+Y2FyZCA9IGNhcmQ7CiAJZGV2LT50eXBlID0gdHlwZTsKIAlkZXYtPnN0YXRlID0gU05EUlZfREVWX0JVSUxEOwogCWRldi0+ZGV2aWNlX2RhdGEgPSBkZXZpY2VfZGF0YTsKIAlkZXYtPm9wcyA9IG9wczsKLQlsaXN0X2FkZCgmZGV2LT5saXN0LCAmY2FyZC0+ZGV2aWNlcyk7CS8qIGFkZCB0byB0aGUgaGVhZCBvZiBsaXN0ICovCisKKwkvKiBpbnNlcnQgdGhlIGVudHJ5IGluIGFuIGluY3JlbWVudGFsbHkgc29ydGVkIGxpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoX3ByZXYocCwgJmNhcmQtPmRldmljZXMpIHsKKwkJc3RydWN0IHNuZF9kZXZpY2UgKnBkZXYgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfZGV2aWNlLCBsaXN0KTsKKwkJaWYgKCh1bnNpZ25lZCBpbnQpcGRldi0+dHlwZSA8PSAodW5zaWduZWQgaW50KXR5cGUpCisJCQlicmVhazsKKwl9CisKKwlsaXN0X2FkZCgmZGV2LT5saXN0LCBwKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc25kX2RldmljZV9uZXcpOworCitzdGF0aWMgaW50IF9fc25kX2RldmljZV9kaXNjb25uZWN0KHN0cnVjdCBzbmRfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+c3RhdGUgPT0gU05EUlZfREVWX1JFR0lTVEVSRUQpIHsKKwkJaWYgKGRldi0+b3BzLT5kZXZfZGlzY29ubmVjdCAmJgorCQkgICAgZGV2LT5vcHMtPmRldl9kaXNjb25uZWN0KGRldikpCisJCQlkZXZfZXJyKGRldi0+Y2FyZC0+ZGV2LCAiZGV2aWNlIGRpc2Nvbm5lY3QgZmFpbHVyZVxuIik7CisJCWRldi0+c3RhdGUgPSBTTkRSVl9ERVZfRElTQ09OTkVDVEVEOworCX0KIAlyZXR1cm4gMDsKIH0KIAotRVhQT1JUX1NZTUJPTChzbmRfZGV2aWNlX25ldyk7CitzdGF0aWMgdm9pZCBfX3NuZF9kZXZpY2VfZnJlZShzdHJ1Y3Qgc25kX2RldmljZSAqZGV2KQoreworCS8qIHVubGluayAqLworCWxpc3RfZGVsKCZkZXYtPmxpc3QpOworCisJX19zbmRfZGV2aWNlX2Rpc2Nvbm5lY3QoZGV2KTsKKwlpZiAoZGV2LT5vcHMtPmRldl9mcmVlKSB7CisJCWlmIChkZXYtPm9wcy0+ZGV2X2ZyZWUoZGV2KSkKKwkJCWRldl9lcnIoZGV2LT5jYXJkLT5kZXYsICJkZXZpY2UgZnJlZSBmYWlsdXJlXG4iKTsKKwl9CisJa2ZyZWUoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfZGV2aWNlICpsb29rX2Zvcl9kZXYoc3RydWN0IHNuZF9jYXJkICpjYXJkLCB2b2lkICpkZXZpY2VfZGF0YSkKK3sKKwlzdHJ1Y3Qgc25kX2RldmljZSAqZGV2OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KQorCQlpZiAoZGV2LT5kZXZpY2VfZGF0YSA9PSBkZXZpY2VfZGF0YSkKKwkJCXJldHVybiBkZXY7CisKKwlyZXR1cm4gTlVMTDsKK30KIAogLyoqCiAgKiBzbmRfZGV2aWNlX2ZyZWUgLSByZWxlYXNlIHRoZSBkZXZpY2UgZnJvbSB0aGUgY2FyZApAQCAtNzIsNzMgKzExNiwzMyBAQAogICogUmVtb3ZlcyB0aGUgZGV2aWNlIGZyb20gdGhlIGxpc3Qgb24gdGhlIGNhcmQgYW5kIGludm9rZXMgdGhlCiAgKiBjYWxsYmFja3MsIGRldl9kaXNjb25uZWN0IGFuZCBkZXZfZnJlZSwgY29ycmVzcG9uZGluZyB0byB0aGUgc3RhdGUuCiAgKiBUaGVuIHJlbGVhc2UgdGhlIGRldmljZS4KLSAqCi0gKiBSZXR1cm46IFplcm8gaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUgb3IgaWYgdGhlCi0gKiBkZXZpY2Ugbm90IGZvdW5kLgogICovCi1pbnQgc25kX2RldmljZV9mcmVlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgdm9pZCAqZGV2aWNlX2RhdGEpCit2b2lkIHNuZF9kZXZpY2VfZnJlZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHZvaWQgKmRldmljZV9kYXRhKQogewogCXN0cnVjdCBzbmRfZGV2aWNlICpkZXY7CiAJCiAJaWYgKHNuZF9CVUdfT04oIWNhcmQgfHwgIWRldmljZV9kYXRhKSkKLQkJcmV0dXJuIC1FTlhJTzsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmNhcmQtPmRldmljZXMsIGxpc3QpIHsKLQkJaWYgKGRldi0+ZGV2aWNlX2RhdGEgIT0gZGV2aWNlX2RhdGEpCi0JCQljb250aW51ZTsKLQkJLyogdW5saW5rICovCi0JCWxpc3RfZGVsKCZkZXYtPmxpc3QpOwotCQlpZiAoZGV2LT5zdGF0ZSA9PSBTTkRSVl9ERVZfUkVHSVNURVJFRCAmJgotCQkgICAgZGV2LT5vcHMtPmRldl9kaXNjb25uZWN0KQotCQkJaWYgKGRldi0+b3BzLT5kZXZfZGlzY29ubmVjdChkZXYpKQotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIKLQkJCQkJICAgImRldmljZSBkaXNjb25uZWN0IGZhaWx1cmVcbiIpOwotCQlpZiAoZGV2LT5vcHMtPmRldl9mcmVlKSB7Ci0JCQlpZiAoZGV2LT5vcHMtPmRldl9mcmVlKGRldikpCi0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZGV2aWNlIGZyZWUgZmFpbHVyZVxuIik7Ci0JCX0KLQkJa2ZyZWUoZGV2KTsKLQkJcmV0dXJuIDA7Ci0JfQotCXNuZF9wcmludGQoImRldmljZSBmcmVlICVwIChmcm9tICVwRiksIG5vdCBmb3VuZFxuIiwgZGV2aWNlX2RhdGEsCi0JCSAgIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci0JcmV0dXJuIC1FTlhJTzsKKwkJcmV0dXJuOworCWRldiA9IGxvb2tfZm9yX2RldihjYXJkLCBkZXZpY2VfZGF0YSk7CisJaWYgKGRldikKKwkJX19zbmRfZGV2aWNlX2ZyZWUoZGV2KTsKKwllbHNlCisJCWRldl9kYmcoY2FyZC0+ZGV2LCAiZGV2aWNlIGZyZWUgJXAgKGZyb20gJXBGKSwgbm90IGZvdW5kXG4iLAorCQkJZGV2aWNlX2RhdGEsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiB9Ci0KIEVYUE9SVF9TWU1CT0woc25kX2RldmljZV9mcmVlKTsKIAotLyoqCi0gKiBzbmRfZGV2aWNlX2Rpc2Nvbm5lY3QgLSBkaXNjb25uZWN0IHRoZSBkZXZpY2UKLSAqIEBjYXJkOiB0aGUgY2FyZCBpbnN0YW5jZQotICogQGRldmljZV9kYXRhOiB0aGUgZGF0YSBwb2ludGVyIHRvIGRpc2Nvbm5lY3QKLSAqCi0gKiBUdXJucyB0aGUgZGV2aWNlIGludG8gdGhlIGRpc2Nvbm5lY3Rpb24gc3RhdGUsIGludm9raW5nCi0gKiBkZXZfZGlzY29ubmVjdCBjYWxsYmFjaywgaWYgdGhlIGRldmljZSB3YXMgYWxyZWFkeSByZWdpc3RlcmVkLgotICoKLSAqIFVzdWFsbHkgY2FsbGVkIGZyb20gc25kX2NhcmRfZGlzY29ubmVjdCgpLgotICoKLSAqIFJldHVybjogWmVybyBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZSBvciBpZiB0aGUKLSAqIGRldmljZSBub3QgZm91bmQuCi0gKi8KLWludCBzbmRfZGV2aWNlX2Rpc2Nvbm5lY3Qoc3RydWN0IHNuZF9jYXJkICpjYXJkLCB2b2lkICpkZXZpY2VfZGF0YSkKK3N0YXRpYyBpbnQgX19zbmRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHNuZF9kZXZpY2UgKmRldjsKLQotCWlmIChzbmRfQlVHX09OKCFjYXJkIHx8ICFkZXZpY2VfZGF0YSkpCi0JCXJldHVybiAtRU5YSU87Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7Ci0JCWlmIChkZXYtPmRldmljZV9kYXRhICE9IGRldmljZV9kYXRhKQotCQkJY29udGludWU7Ci0JCWlmIChkZXYtPnN0YXRlID09IFNORFJWX0RFVl9SRUdJU1RFUkVEICYmCi0JCSAgICBkZXYtPm9wcy0+ZGV2X2Rpc2Nvbm5lY3QpIHsKLQkJCWlmIChkZXYtPm9wcy0+ZGV2X2Rpc2Nvbm5lY3QoZGV2KSkKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkZXZpY2UgZGlzY29ubmVjdCBmYWlsdXJlXG4iKTsKLQkJCWRldi0+c3RhdGUgPSBTTkRSVl9ERVZfRElTQ09OTkVDVEVEOworCWlmIChkZXYtPnN0YXRlID09IFNORFJWX0RFVl9CVUlMRCkgeworCQlpZiAoZGV2LT5vcHMtPmRldl9yZWdpc3RlcikgeworCQkJaW50IGVyciA9IGRldi0+b3BzLT5kZXZfcmVnaXN0ZXIoZGV2KTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CiAJCX0KLQkJcmV0dXJuIDA7CisJCWRldi0+c3RhdGUgPSBTTkRSVl9ERVZfUkVHSVNURVJFRDsKIAl9Ci0Jc25kX3ByaW50ZCgiZGV2aWNlIGRpc2Nvbm5lY3QgJXAgKGZyb20gJXBGKSwgbm90IGZvdW5kXG4iLCBkZXZpY2VfZGF0YSwKLQkJICAgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLQlyZXR1cm4gLUVOWElPOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTE1NywyNiArMTYxLDE1IEBACiBpbnQgc25kX2RldmljZV9yZWdpc3RlcihzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHZvaWQgKmRldmljZV9kYXRhKQogewogCXN0cnVjdCBzbmRfZGV2aWNlICpkZXY7Ci0JaW50IGVycjsKIAogCWlmIChzbmRfQlVHX09OKCFjYXJkIHx8ICFkZXZpY2VfZGF0YSkpCiAJCXJldHVybiAtRU5YSU87Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7Ci0JCWlmIChkZXYtPmRldmljZV9kYXRhICE9IGRldmljZV9kYXRhKQotCQkJY29udGludWU7Ci0JCWlmIChkZXYtPnN0YXRlID09IFNORFJWX0RFVl9CVUlMRCAmJiBkZXYtPm9wcy0+ZGV2X3JlZ2lzdGVyKSB7Ci0JCQlpZiAoKGVyciA9IGRldi0+b3BzLT5kZXZfcmVnaXN0ZXIoZGV2KSkgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQlkZXYtPnN0YXRlID0gU05EUlZfREVWX1JFR0lTVEVSRUQ7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlzbmRfcHJpbnRkKCJzbmRfZGV2aWNlX3JlZ2lzdGVyIGJ1c3lcbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KKwlkZXYgPSBsb29rX2Zvcl9kZXYoY2FyZCwgZGV2aWNlX2RhdGEpOworCWlmIChkZXYpCisJCXJldHVybiBfX3NuZF9kZXZpY2VfcmVnaXN0ZXIoZGV2KTsKIAlzbmRfQlVHKCk7CiAJcmV0dXJuIC1FTlhJTzsKIH0KLQogRVhQT1JUX1NZTUJPTChzbmRfZGV2aWNlX3JlZ2lzdGVyKTsKIAogLyoKQEAgLTE5MSwxMSArMTg0LDkgQEAKIAlpZiAoc25kX0JVR19PTighY2FyZCkpCiAJCXJldHVybiAtRU5YSU87CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7Ci0JCWlmIChkZXYtPnN0YXRlID09IFNORFJWX0RFVl9CVUlMRCAmJiBkZXYtPm9wcy0+ZGV2X3JlZ2lzdGVyKSB7Ci0JCQlpZiAoKGVyciA9IGRldi0+b3BzLT5kZXZfcmVnaXN0ZXIoZGV2KSkgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQlkZXYtPnN0YXRlID0gU05EUlZfREVWX1JFR0lTVEVSRUQ7Ci0JCX0KKwkJZXJyID0gX19zbmRfZGV2aWNlX3JlZ2lzdGVyKGRldik7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yMTEsOCArMjAyLDggQEAKIAogCWlmIChzbmRfQlVHX09OKCFjYXJkKSkKIAkJcmV0dXJuIC1FTlhJTzsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmNhcmQtPmRldmljZXMsIGxpc3QpIHsKLQkJaWYgKHNuZF9kZXZpY2VfZGlzY29ubmVjdChjYXJkLCBkZXYtPmRldmljZV9kYXRhKSA8IDApCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGRldiwgJmNhcmQtPmRldmljZXMsIGxpc3QpIHsKKwkJaWYgKF9fc25kX2RldmljZV9kaXNjb25uZWN0KGRldikgPCAwKQogCQkJZXJyID0gLUVOWElPOwogCX0KIAlyZXR1cm4gZXJyOwpAQCAtMjIyLDI0ICsyMTMsMTIgQEAKICAqIHJlbGVhc2UgYWxsIHRoZSBkZXZpY2VzIG9uIHRoZSBjYXJkLgogICogY2FsbGVkIGZyb20gaW5pdC5jCiAgKi8KLWludCBzbmRfZGV2aWNlX2ZyZWVfYWxsKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc25kX2RldmljZV9jbWRfdCBjbWQpCit2b2lkIHNuZF9kZXZpY2VfZnJlZV9hbGwoc3RydWN0IHNuZF9jYXJkICpjYXJkKQogewotCXN0cnVjdCBzbmRfZGV2aWNlICpkZXY7Ci0JaW50IGVycjsKLQl1bnNpZ25lZCBpbnQgcmFuZ2VfbG93LCByYW5nZV9oaWdoLCB0eXBlOworCXN0cnVjdCBzbmRfZGV2aWNlICpkZXYsICpuZXh0OwogCiAJaWYgKHNuZF9CVUdfT04oIWNhcmQpKQotCQlyZXR1cm4gLUVOWElPOwotCXJhbmdlX2xvdyA9IChfX2ZvcmNlIHVuc2lnbmVkIGludCljbWQgKiBTTkRSVl9ERVZfVFlQRV9SQU5HRV9TSVpFOwotCXJhbmdlX2hpZ2ggPSByYW5nZV9sb3cgKyBTTkRSVl9ERVZfVFlQRV9SQU5HRV9TSVpFIC0gMTsKLSAgICAgIF9fYWdhaW46Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7Ci0JCXR5cGUgPSAoX19mb3JjZSB1bnNpZ25lZCBpbnQpZGV2LT50eXBlOwotCQlpZiAodHlwZSA+PSByYW5nZV9sb3cgJiYgdHlwZSA8PSByYW5nZV9oaWdoKSB7Ci0JCQlpZiAoKGVyciA9IHNuZF9kZXZpY2VfZnJlZShjYXJkLCBkZXYtPmRldmljZV9kYXRhKSkgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQlnb3RvIF9fYWdhaW47Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7CisJCXJldHVybjsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZShkZXYsIG5leHQsICZjYXJkLT5kZXZpY2VzLCBsaXN0KQorCQlfX3NuZF9kZXZpY2VfZnJlZShkZXYpOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9ocnRpbWVyLmMgYi9zb3VuZC9jb3JlL2hydGltZXIuYwppbmRleCBiOGIzMWM0Li44ODZiZTdkIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2hydGltZXIuYworKysgYi9zb3VuZC9jb3JlL2hydGltZXIuYwpAQCAtMTI2LDggKzEyNiw3IEBACiAKIAlocnRpbWVyX2dldF9yZXMoQ0xPQ0tfTU9OT1RPTklDLCAmdHApOwogCWlmICh0cC50dl9zZWMgPiAwIHx8ICF0cC50dl9uc2VjKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIKLQkJCSAgICJzbmQtaHJ0aW1lcjogSW52YWxpZCByZXNvbHV0aW9uICV1LiUwOXUiLAorCQlwcl9lcnIoInNuZC1ocnRpbWVyOiBJbnZhbGlkIHJlc29sdXRpb24gJXUuJTA5dSIsCiAJCQkgICAodW5zaWduZWQpdHAudHZfc2VjLCAodW5zaWduZWQpdHAudHZfbnNlYyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvaHdkZXAuYyBiL3NvdW5kL2NvcmUvaHdkZXAuYwppbmRleCBkMTA1MDczLi42OTQ1OWU1IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2h3ZGVwLmMKKysrIGIvc291bmQvY29yZS9od2RlcC5jCkBAIC0zNzUsNyArMzc1LDcgQEAKIAkJKnJod2RlcCA9IE5VTEw7CiAJaHdkZXAgPSBremFsbG9jKHNpemVvZigqaHdkZXApLCBHRlBfS0VSTkVMKTsKIAlpZiAoaHdkZXAgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJod2RlcDogY2Fubm90IGFsbG9jYXRlXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJod2RlcDogY2Fubm90IGFsbG9jYXRlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWh3ZGVwLT5jYXJkID0gY2FyZDsKQEAgLTM5NSw2ICszOTUsNyBAQAogCQkqcmh3ZGVwID0gaHdkZXA7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHNuZF9od2RlcF9uZXcpOwogCiBzdGF0aWMgaW50IHNuZF9od2RlcF9mcmVlKHN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwKQogewpAQCAtNDE1LDM3ICs0MTYsNjEgQEAKIHN0YXRpYyBpbnQgc25kX2h3ZGVwX2Rldl9yZWdpc3RlcihzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBod2RlcC0+Y2FyZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJaW50IGVycjsKIAljaGFyIG5hbWVbMzJdOwogCiAJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwotCWlmIChzbmRfaHdkZXBfc2VhcmNoKGh3ZGVwLT5jYXJkLCBod2RlcC0+ZGV2aWNlKSkgeworCWlmIChzbmRfaHdkZXBfc2VhcmNoKGNhcmQsIGh3ZGVwLT5kZXZpY2UpKSB7CiAJCW11dGV4X3VubG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAlsaXN0X2FkZF90YWlsKCZod2RlcC0+bGlzdCwgJnNuZF9od2RlcF9kZXZpY2VzKTsKIAlzcHJpbnRmKG5hbWUsICJod0MlaUQlaSIsIGh3ZGVwLT5jYXJkLT5udW1iZXIsIGh3ZGVwLT5kZXZpY2UpOwotCWlmICgoZXJyID0gc25kX3JlZ2lzdGVyX2RldmljZShTTkRSVl9ERVZJQ0VfVFlQRV9IV0RFUCwKLQkJCQkgICAgICAgaHdkZXAtPmNhcmQsIGh3ZGVwLT5kZXZpY2UsCi0JCQkJICAgICAgICZzbmRfaHdkZXBfZl9vcHMsIGh3ZGVwLCBuYW1lKSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZWdpc3RlciBoYXJkd2FyZSBkZXBlbmRlbnQgZGV2aWNlICVpOiVpXG4iLAotCQkJICAgaHdkZXAtPmNhcmQtPm51bWJlciwgaHdkZXAtPmRldmljZSk7CisJZGV2ID0gaHdkZXAtPmRldjsKKwlpZiAoIWRldikKKwkJZGV2ID0gc25kX2NhcmRfZ2V0X2RldmljZV9saW5rKGh3ZGVwLT5jYXJkKTsKKwllcnIgPSBzbmRfcmVnaXN0ZXJfZGV2aWNlX2Zvcl9kZXYoU05EUlZfREVWSUNFX1RZUEVfSFdERVAsCisJCQkJCSAgaHdkZXAtPmNhcmQsIGh3ZGVwLT5kZXZpY2UsCisJCQkJCSAgJnNuZF9od2RlcF9mX29wcywgaHdkZXAsIG5hbWUsIGRldik7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihkZXYsCisJCQkidW5hYmxlIHRvIHJlZ2lzdGVyIGhhcmR3YXJlIGRlcGVuZGVudCBkZXZpY2UgJWk6JWlcbiIsCisJCQljYXJkLT5udW1iZXIsIGh3ZGVwLT5kZXZpY2UpOwogCQlsaXN0X2RlbCgmaHdkZXAtPmxpc3QpOwogCQltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAkJcmV0dXJuIGVycjsKIAl9CisKKwlpZiAoaHdkZXAtPmdyb3VwcykgeworCQlzdHJ1Y3QgZGV2aWNlICpkID0gc25kX2dldF9kZXZpY2UoU05EUlZfREVWSUNFX1RZUEVfSFdERVAsCisJCQkJCQkgIGh3ZGVwLT5jYXJkLCBod2RlcC0+ZGV2aWNlKTsKKwkJaWYgKGQpIHsKKwkJCWlmIChod2RlcC0+cHJpdmF0ZV9kYXRhKQorCQkJCWRldl9zZXRfZHJ2ZGF0YShkLCBod2RlcC0+cHJpdmF0ZV9kYXRhKTsKKwkJCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cHMoJmQtPmtvYmosIGh3ZGVwLT5ncm91cHMpOworCQkJaWYgKGVyciA8IDApCisJCQkJZGV2X3dhcm4oZGV2LAorCQkJCQkgImh3ZGVwICVkOiVkOiBjYW5ub3QgY3JlYXRlIHN5c2ZzIGdyb3Vwc1xuIiwKKwkJCQkJIGNhcmQtPm51bWJlciwgaHdkZXAtPmRldmljZSk7CisJCQlwdXRfZGV2aWNlKGQpOworCQl9CisJfQorCiAjaWZkZWYgQ09ORklHX1NORF9PU1NFTVVMCiAJaHdkZXAtPm9zc3JlZyA9IDA7CiAJaWYgKGh3ZGVwLT5vc3NfdHlwZSA+PSAwKSB7CiAJCWlmICgoaHdkZXAtPm9zc190eXBlID09IFNORFJWX09TU19ERVZJQ0VfVFlQRV9ETUZNKSAmJiAoaHdkZXAtPmRldmljZSAhPSAwKSkgewotCQkJc25kX3ByaW50ayAoS0VSTl9XQVJOSU5HICJvbmx5IGh3ZGVwIGRldmljZSAwIGNhbiBiZSByZWdpc3RlcmVkIGFzIE9TUyBkaXJlY3QgRk0gZGV2aWNlIVxuIik7CisJCQlkZXZfd2FybihkZXYsCisJCQkJICJvbmx5IGh3ZGVwIGRldmljZSAwIGNhbiBiZSByZWdpc3RlcmVkIGFzIE9TUyBkaXJlY3QgRk0gZGV2aWNlIVxuIik7CiAJCX0gZWxzZSB7CiAJCQlpZiAoc25kX3JlZ2lzdGVyX29zc19kZXZpY2UoaHdkZXAtPm9zc190eXBlLAotCQkJCQkJICAgIGh3ZGVwLT5jYXJkLCBod2RlcC0+ZGV2aWNlLAotCQkJCQkJICAgICZzbmRfaHdkZXBfZl9vcHMsIGh3ZGVwLAotCQkJCQkJICAgIGh3ZGVwLT5vc3NfZGV2KSA8IDApIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgT1NTIGNvbXBhdGliaWxpdHkgZGV2aWNlICVpOiVpXG4iLAotCQkJCQkgICBod2RlcC0+Y2FyZC0+bnVtYmVyLCBod2RlcC0+ZGV2aWNlKTsKKwkJCQkJCSAgICBjYXJkLCBod2RlcC0+ZGV2aWNlLAorCQkJCQkJICAgICZzbmRfaHdkZXBfZl9vcHMsIGh3ZGVwKSA8IDApIHsKKwkJCQlkZXZfZXJyKGRldiwKKwkJCQkJInVuYWJsZSB0byByZWdpc3RlciBPU1MgY29tcGF0aWJpbGl0eSBkZXZpY2UgJWk6JWlcbiIsCisJCQkJCWNhcmQtPm51bWJlciwgaHdkZXAtPmRldmljZSk7CiAJCQl9IGVsc2UKIAkJCQlod2RlcC0+b3NzcmVnID0gMTsKIAkJfQpAQCAtNTQzLDUgKzU2OCwzIEBACiAKIG1vZHVsZV9pbml0KGFsc2FfaHdkZXBfaW5pdCkKIG1vZHVsZV9leGl0KGFsc2FfaHdkZXBfZXhpdCkKLQotRVhQT1JUX1NZTUJPTChzbmRfaHdkZXBfbmV3KTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvaW5mby5jIGIvc291bmQvY29yZS9pbmZvLmMKaW5kZXggZTc5YmFhMS4uMDUxZDU1YiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9pbmZvLmMKKysrIGIvc291bmQvY29yZS9pbmZvLmMKQEAgLTQxOCw5ICs0MTgsMTQgQEAKIAkJCWlmIChlbnRyeS0+Yy50ZXh0LndyaXRlKSB7CiAJCQkJZW50cnktPmMudGV4dC53cml0ZShlbnRyeSwgZGF0YS0+d2J1ZmZlcik7CiAJCQkJaWYgKGRhdGEtPndidWZmZXItPmVycm9yKSB7Ci0JCQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJkYXRhIHdyaXRlIGVycm9yIHRvICVzICglaSlcbiIsCi0JCQkJCQllbnRyeS0+bmFtZSwKLQkJCQkJCWRhdGEtPndidWZmZXItPmVycm9yKTsKKwkJCQkJaWYgKGVudHJ5LT5jYXJkKQorCQkJCQkJZGV2X3dhcm4oZW50cnktPmNhcmQtPmRldiwgImluZm86IGRhdGEgd3JpdGUgZXJyb3IgdG8gJXMgKCVpKVxuIiwKKwkJCQkJCQkgZW50cnktPm5hbWUsCisJCQkJCQkJIGRhdGEtPndidWZmZXItPmVycm9yKTsKKwkJCQkJZWxzZQorCQkJCQkJcHJfd2FybigiQUxTQTogaW5mbzogZGF0YSB3cml0ZSBlcnJvciB0byAlcyAoJWkpXG4iLAorCQkJCQkJCWVudHJ5LT5uYW1lLAorCQkJCQkJCWRhdGEtPndidWZmZXItPmVycm9yKTsKIAkJCQl9CiAJCQl9CiAJCQlrZnJlZShkYXRhLT53YnVmZmVyLT5idWZmZXIpOwpAQCAtNTQwLDcgKzU0NSw3IEBACiAJCXNuZF9vc3Nfcm9vdCA9IGVudHJ5OwogCX0KICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1NORF9TRVFVRU5DRVIpIHx8IGRlZmluZWQoQ09ORklHX1NORF9TRVFVRU5DRVJfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9TRVFVRU5DRVIpCiAJewogCQlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCQlpZiAoKGVudHJ5ID0gc25kX2luZm9fY3JlYXRlX21vZHVsZV9lbnRyeShUSElTX01PRFVMRSwgInNlcSIsIE5VTEwpKSA9PSBOVUxMKQpAQCAtNTY3LDcgKzU3Miw3IEBACiAJc25kX21pbm9yX2luZm9fZG9uZSgpOwogCXNuZF9pbmZvX3ZlcnNpb25fZG9uZSgpOwogCWlmIChzbmRfcHJvY19yb290KSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfU05EX1NFUVVFTkNFUikgfHwgZGVmaW5lZChDT05GSUdfU05EX1NFUVVFTkNFUl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfU05EX1NFUVVFTkNFUikKIAkJc25kX2luZm9fZnJlZV9lbnRyeShzbmRfc2VxX3Jvb3QpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NORF9PU1NFTVVMCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2luaXQuYyBiL3NvdW5kL2NvcmUvaW5pdC5jCmluZGV4IDBkNDJmY2QuLjVlZTgzODQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvaW5pdC5jCisrKyBiL3NvdW5kL2NvcmUvaW5pdC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgpAQCAtOTQsNyArOTUsNyBAQAogCXJldHVybiBtYXRjaDsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1MpIHx8IGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1NfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9NSVhFUl9PU1MpCiBpbnQgKCpzbmRfbWl4ZXJfb3NzX25vdGlmeV9jYWxsYmFjaykoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZnJlZV9mbGFnKTsKIEVYUE9SVF9TWU1CT0woc25kX21peGVyX29zc19ub3RpZnlfY2FsbGJhY2spOwogI2VuZGlmCkBAIC0xMTIsMTEgKzExMywxMSBAQAogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7CiAKIAlpZiAoKGVyciA9IHNuZF9pbmZvX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgewotCQlzbmRfcHJpbnRkKCJ1bmFibGUgdG8gY3JlYXRlIGNhcmQgaW5mb1xuIik7CisJCWRldl9kYmcoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGNyZWF0ZSBjYXJkIGluZm9cbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlpZiAoKGVudHJ5ID0gc25kX2luZm9fY3JlYXRlX2NhcmRfZW50cnkoY2FyZCwgImlkIiwgY2FyZC0+cHJvY19yb290KSkgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJ1bmFibGUgdG8gY3JlYXRlIGNhcmQgZW50cnlcbiIpOworCQlkZXZfZGJnKGNhcmQtPmRldiwgInVuYWJsZSB0byBjcmVhdGUgY2FyZCBlbnRyeVxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCWVudHJ5LT5jLnRleHQucmVhZCA9IHNuZF9jYXJkX2lkX3JlYWQ7CkBAIC0xNTYsOCArMTU3LDE3IEBACiAJcmV0dXJuIG1hc2s7IC8qIHVuY2hhbmdlZCAqLwogfQogCitzdGF0aWMgaW50IHNuZF9jYXJkX2RvX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpjYXJkX2Rldl9hdHRyX2dyb3Vwc1tdOworCitzdGF0aWMgdm9pZCByZWxlYXNlX2NhcmRfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzbmRfY2FyZF9kb19mcmVlKGRldl90b19zbmRfY2FyZChkZXYpKTsKK30KKwogLyoqCi0gKiAgc25kX2NhcmRfY3JlYXRlIC0gY3JlYXRlIGFuZCBpbml0aWFsaXplIGEgc291bmRjYXJkIHN0cnVjdHVyZQorICogIHNuZF9jYXJkX25ldyAtIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIHNvdW5kY2FyZCBzdHJ1Y3R1cmUKKyAqICBAcGFyZW50OiB0aGUgcGFyZW50IGRldmljZSBvYmplY3QKICAqICBAaWR4OiBjYXJkIGluZGV4IChhZGRyZXNzKSBbMCAuLi4gKFNORFJWX0NBUkRTLTEpXQogICogIEB4aWQ6IGNhcmQgaWRlbnRpZmljYXRpb24gKEFTQ0lJIHN0cmluZykKICAqICBAbW9kdWxlOiB0b3AgbGV2ZWwgbW9kdWxlIGZvciBsb2NraW5nCkBAIC0xNzIsNyArMTgyLDcgQEAKICAqCiAgKiAgUmV0dXJuOiBaZXJvIGlmIHN1Y2Nlc3NmdWwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgogICovCi1pbnQgc25kX2NhcmRfY3JlYXRlKGludCBpZHgsIGNvbnN0IGNoYXIgKnhpZCwKK2ludCBzbmRfY2FyZF9uZXcoc3RydWN0IGRldmljZSAqcGFyZW50LCBpbnQgaWR4LCBjb25zdCBjaGFyICp4aWQsCiAJCSAgICBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIGludCBleHRyYV9zaXplLAogCQkgICAgc3RydWN0IHNuZF9jYXJkICoqY2FyZF9yZXQpCiB7CkBAIC0xODgsNiArMTk4LDggQEAKIAljYXJkID0ga3phbGxvYyhzaXplb2YoKmNhcmQpICsgZXh0cmFfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYXJkKQogCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoZXh0cmFfc2l6ZSA+IDApCisJCWNhcmQtPnByaXZhdGVfZGF0YSA9IChjaGFyICopY2FyZCArIHNpemVvZihzdHJ1Y3Qgc25kX2NhcmQpOwogCWlmICh4aWQpCiAJCXN0cmxjcHkoY2FyZC0+aWQsIHhpZCwgc2l6ZW9mKGNhcmQtPmlkKSk7CiAJZXJyID0gMDsKQEAgLTIwNSwxNCArMjE3LDE2IEBACiAJCWVyciA9IC1FTk9ERVY7CiAJaWYgKGVyciA8IDApIHsKIAkJbXV0ZXhfdW5sb2NrKCZzbmRfY2FyZF9tdXRleCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBmaW5kIHRoZSBzbG90IGZvciBpbmRleCAlZCAocmFuZ2UgMC0laSksIGVycm9yOiAlZFxuIiwKKwkJZGV2X2VycihwYXJlbnQsICJjYW5ub3QgZmluZCB0aGUgc2xvdCBmb3IgaW5kZXggJWQgKHJhbmdlIDAtJWkpLCBlcnJvcjogJWRcbiIsCiAJCQkgaWR4LCBzbmRfZWNhcmRzX2xpbWl0IC0gMSwgZXJyKTsKLQkJZ290byBfX2Vycm9yOworCQlrZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKIAl9CiAJc2V0X2JpdChpZHgsIHNuZF9jYXJkc19sb2NrKTsJCS8qIGxvY2sgaXQgKi8KIAlpZiAoaWR4ID49IHNuZF9lY2FyZHNfbGltaXQpCiAJCXNuZF9lY2FyZHNfbGltaXQgPSBpZHggKyAxOyAvKiBpbmNyZWFzZSB0aGUgbGltaXQgKi8KIAltdXRleF91bmxvY2soJnNuZF9jYXJkX211dGV4KTsKKwljYXJkLT5kZXYgPSBwYXJlbnQ7CiAJY2FyZC0+bnVtYmVyID0gaWR4OwogCWNhcmQtPm1vZHVsZSA9IG1vZHVsZTsKIAlJTklUX0xJU1RfSEVBRCgmY2FyZC0+ZGV2aWNlcyk7CkBAIC0yMjIsMzYgKzIzNiw0MiBAQAogCUlOSVRfTElTVF9IRUFEKCZjYXJkLT5jdGxfZmlsZXMpOwogCXNwaW5fbG9ja19pbml0KCZjYXJkLT5maWxlc19sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmY2FyZC0+ZmlsZXNfbGlzdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+c2h1dGRvd25fc2xlZXApOwotCWF0b21pY19zZXQoJmNhcmQtPnJlZmNvdW50LCAwKTsKICNpZmRlZiBDT05GSUdfUE0KIAltdXRleF9pbml0KCZjYXJkLT5wb3dlcl9sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYXJkLT5wb3dlcl9zbGVlcCk7CiAjZW5kaWYKKworCWRldmljZV9pbml0aWFsaXplKCZjYXJkLT5jYXJkX2Rldik7CisJY2FyZC0+Y2FyZF9kZXYucGFyZW50ID0gcGFyZW50OworCWNhcmQtPmNhcmRfZGV2LmNsYXNzID0gc291bmRfY2xhc3M7CisJY2FyZC0+Y2FyZF9kZXYucmVsZWFzZSA9IHJlbGVhc2VfY2FyZF9kZXZpY2U7CisJY2FyZC0+Y2FyZF9kZXYuZ3JvdXBzID0gY2FyZF9kZXZfYXR0cl9ncm91cHM7CisJZXJyID0ga29iamVjdF9zZXRfbmFtZSgmY2FyZC0+Y2FyZF9kZXYua29iaiwgImNhcmQlZCIsIGlkeCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gX19lcnJvcjsKKwogCS8qIHRoZSBjb250cm9sIGludGVyZmFjZSBjYW5ub3QgYmUgYWNjZXNzZWQgZnJvbSB0aGUgdXNlciBzcGFjZSB1bnRpbCAqLwogCS8qIHNuZF9jYXJkc19iaXRtYXNrIGFuZCBzbmRfY2FyZHMgYXJlIHNldCB3aXRoIHNuZF9jYXJkX3JlZ2lzdGVyICovCiAJZXJyID0gc25kX2N0bF9jcmVhdGUoY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIGNvbnRyb2wgbWlub3JzXG4iKTsKKwkJZGV2X2VycihwYXJlbnQsICJ1bmFibGUgdG8gcmVnaXN0ZXIgY29udHJvbCBtaW5vcnNcbiIpOwogCQlnb3RvIF9fZXJyb3I7CiAJfQogCWVyciA9IHNuZF9pbmZvX2NhcmRfY3JlYXRlKGNhcmQpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBjcmVhdGUgY2FyZCBpbmZvXG4iKTsKKwkJZGV2X2VycihwYXJlbnQsICJ1bmFibGUgdG8gY3JlYXRlIGNhcmQgaW5mb1xuIik7CiAJCWdvdG8gX19lcnJvcl9jdGw7CiAJfQotCWlmIChleHRyYV9zaXplID4gMCkKLQkJY2FyZC0+cHJpdmF0ZV9kYXRhID0gKGNoYXIgKiljYXJkICsgc2l6ZW9mKHN0cnVjdCBzbmRfY2FyZCk7CiAJKmNhcmRfcmV0ID0gY2FyZDsKIAlyZXR1cm4gMDsKIAogICAgICAgX19lcnJvcl9jdGw6Ci0Jc25kX2RldmljZV9mcmVlX2FsbChjYXJkLCBTTkRSVl9ERVZfQ01EX1BSRSk7CisJc25kX2RldmljZV9mcmVlX2FsbChjYXJkKTsKICAgICAgIF9fZXJyb3I6Ci0Ja2ZyZWUoY2FyZCk7CisJcHV0X2RldmljZSgmY2FyZC0+Y2FyZF9kZXYpOwogICAJcmV0dXJuIGVycjsKIH0KLUVYUE9SVF9TWU1CT0woc25kX2NhcmRfY3JlYXRlKTsKK0VYUE9SVF9TWU1CT0woc25kX2NhcmRfbmV3KTsKIAogLyogcmV0dXJuIG5vbi16ZXJvIGlmIGEgY2FyZCBpcyBhbHJlYWR5IGxvY2tlZCAqLwogaW50IHNuZF9jYXJkX2xvY2tlZChpbnQgY2FyZCkKQEAgLTM5NCw3ICs0MTQsNyBAQAogCS8qIHBoYXNlIDM6IG5vdGlmeSBhbGwgY29ubmVjdGVkIGRldmljZXMgYWJvdXQgZGlzY29ubmVjdGlvbiAqLwogCS8qIGF0IHRoaXMgcG9pbnQsIHRoZXkgY2Fubm90IHJlc3BvbmQgdG8gYW55IGNhbGxzIGV4Y2VwdCByZWxlYXNlKCkgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1MpIHx8IGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1NfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9NSVhFUl9PU1MpCiAJaWYgKHNuZF9taXhlcl9vc3Nfbm90aWZ5X2NhbGxiYWNrKQogCQlzbmRfbWl4ZXJfb3NzX25vdGlmeV9jYWxsYmFjayhjYXJkLCBTTkRfTUlYRVJfT1NTX05PVElGWV9ESVNDT05ORUNUKTsKICNlbmRpZgpAQCAtNDAyLDEyICs0MjIsMTIgQEAKIAkvKiBub3RpZnkgYWxsIGRldmljZXMgdGhhdCB3ZSBhcmUgZGlzY29ubmVjdGVkICovCiAJZXJyID0gc25kX2RldmljZV9kaXNjb25uZWN0X2FsbChjYXJkKTsKIAlpZiAoZXJyIDwgMCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAibm90IGFsbCBkZXZpY2VzIGZvciBjYXJkICVpIGNhbiBiZSBkaXNjb25uZWN0ZWRcbiIsIGNhcmQtPm51bWJlcik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAibm90IGFsbCBkZXZpY2VzIGZvciBjYXJkICVpIGNhbiBiZSBkaXNjb25uZWN0ZWRcbiIsIGNhcmQtPm51bWJlcik7CiAKIAlzbmRfaW5mb19jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7Ci0JaWYgKGNhcmQtPmNhcmRfZGV2KSB7Ci0JCWRldmljZV91bnJlZ2lzdGVyKGNhcmQtPmNhcmRfZGV2KTsKLQkJY2FyZC0+Y2FyZF9kZXYgPSBOVUxMOworCWlmIChjYXJkLT5yZWdpc3RlcmVkKSB7CisJCWRldmljZV9kZWwoJmNhcmQtPmNhcmRfZGV2KTsKKwkJY2FyZC0+cmVnaXN0ZXJlZCA9IGZhbHNlOwogCX0KICNpZmRlZiBDT05GSUdfUE0KIAl3YWtlX3VwKCZjYXJkLT5wb3dlcl9zbGVlcCk7CkBAIC00MzAsODEgKzQ1MCw0OCBAQAogICovCiBzdGF0aWMgaW50IHNuZF9jYXJkX2RvX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkKQogewotI2lmIGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1MpIHx8IGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1NfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9NSVhFUl9PU1MpCiAJaWYgKHNuZF9taXhlcl9vc3Nfbm90aWZ5X2NhbGxiYWNrKQogCQlzbmRfbWl4ZXJfb3NzX25vdGlmeV9jYWxsYmFjayhjYXJkLCBTTkRfTUlYRVJfT1NTX05PVElGWV9GUkVFKTsKICNlbmRpZgotCWlmIChzbmRfZGV2aWNlX2ZyZWVfYWxsKGNhcmQsIFNORFJWX0RFVl9DTURfUFJFKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGZyZWUgYWxsIGRldmljZXMgKHByZSlcbiIpOwotCQkvKiBGYXRhbCwgYnV0IHRoaXMgc2l0dWF0aW9uIHNob3VsZCBuZXZlciBvY2N1ciAqLwotCX0KLQlpZiAoc25kX2RldmljZV9mcmVlX2FsbChjYXJkLCBTTkRSVl9ERVZfQ01EX05PUk1BTCkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBmcmVlIGFsbCBkZXZpY2VzIChub3JtYWwpXG4iKTsKLQkJLyogRmF0YWwsIGJ1dCB0aGlzIHNpdHVhdGlvbiBzaG91bGQgbmV2ZXIgb2NjdXIgKi8KLQl9Ci0JaWYgKHNuZF9kZXZpY2VfZnJlZV9hbGwoY2FyZCwgU05EUlZfREVWX0NNRF9QT1NUKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGZyZWUgYWxsIGRldmljZXMgKHBvc3QpXG4iKTsKLQkJLyogRmF0YWwsIGJ1dCB0aGlzIHNpdHVhdGlvbiBzaG91bGQgbmV2ZXIgb2NjdXIgKi8KLQl9CisJc25kX2RldmljZV9mcmVlX2FsbChjYXJkKTsKIAlpZiAoY2FyZC0+cHJpdmF0ZV9mcmVlKQogCQljYXJkLT5wcml2YXRlX2ZyZWUoY2FyZCk7CiAJc25kX2luZm9fZnJlZV9lbnRyeShjYXJkLT5wcm9jX2lkKTsKIAlpZiAoc25kX2luZm9fY2FyZF9mcmVlKGNhcmQpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAidW5hYmxlIHRvIGZyZWUgY2FyZCBpbmZvXG4iKTsKKwkJZGV2X3dhcm4oY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGZyZWUgY2FyZCBpbmZvXG4iKTsKIAkJLyogTm90IGZhdGFsIGVycm9yICovCiAJfQorCWlmIChjYXJkLT5yZWxlYXNlX2NvbXBsZXRpb24pCisJCWNvbXBsZXRlKGNhcmQtPnJlbGVhc2VfY29tcGxldGlvbik7CiAJa2ZyZWUoY2FyZCk7CiAJcmV0dXJuIDA7CiB9CiAKLS8qKgotICogc25kX2NhcmRfdW5yZWYgLSByZWxlYXNlIHRoZSByZWZlcmVuY2UgY291bnRlcgotICogQGNhcmQ6IHRoZSBjYXJkIGluc3RhbmNlCi0gKgotICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50ZXIuICBXaGVuIGl0IHJlYWNoZXMgdG8gemVybywgd2FrZSB1cAotICogdGhlIHNsZWVwZXIgYW5kIGNhbGwgdGhlIGRlc3RydWN0b3IgaWYgbmVlZGVkLgotICovCi12b2lkIHNuZF9jYXJkX3VucmVmKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCkKLXsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY2FyZC0+cmVmY291bnQpKSB7Ci0JCXdha2VfdXAoJmNhcmQtPnNodXRkb3duX3NsZWVwKTsKLQkJaWYgKGNhcmQtPmZyZWVfb25fbGFzdF9jbG9zZSkKLQkJCXNuZF9jYXJkX2RvX2ZyZWUoY2FyZCk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChzbmRfY2FyZF91bnJlZik7Ci0KIGludCBzbmRfY2FyZF9mcmVlX3doZW5fY2xvc2VkKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCkKIHsKLQlpbnQgcmV0OwotCi0JYXRvbWljX2luYygmY2FyZC0+cmVmY291bnQpOwotCXJldCA9IHNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7Ci0JaWYgKHJldCkgewotCQlhdG9taWNfZGVjKCZjYXJkLT5yZWZjb3VudCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JY2FyZC0+ZnJlZV9vbl9sYXN0X2Nsb3NlID0gMTsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY2FyZC0+cmVmY291bnQpKQotCQlzbmRfY2FyZF9kb19mcmVlKGNhcmQpOwotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MKHNuZF9jYXJkX2ZyZWVfd2hlbl9jbG9zZWQpOwotCi1pbnQgc25kX2NhcmRfZnJlZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCi17CiAJaW50IHJldCA9IHNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQotCS8qIHdhaXQsIHVudGlsIGFsbCBkZXZpY2VzIGFyZSByZWFkeSBmb3IgdGhlIGZyZWUgb3BlcmF0aW9uICovCi0Jd2FpdF9ldmVudChjYXJkLT5zaHV0ZG93bl9zbGVlcCwgIWF0b21pY19yZWFkKCZjYXJkLT5yZWZjb3VudCkpOwotCXNuZF9jYXJkX2RvX2ZyZWUoY2FyZCk7CisJcHV0X2RldmljZSgmY2FyZC0+Y2FyZF9kZXYpOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChzbmRfY2FyZF9mcmVlX3doZW5fY2xvc2VkKTsKIAoraW50IHNuZF9jYXJkX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkKQoreworCXN0cnVjdCBjb21wbGV0aW9uIHJlbGVhc2VkOworCWludCByZXQ7CisKKwlpbml0X2NvbXBsZXRpb24oJnJlbGVhc2VkKTsKKwljYXJkLT5yZWxlYXNlX2NvbXBsZXRpb24gPSAmcmVsZWFzZWQ7CisJcmV0ID0gc25kX2NhcmRfZnJlZV93aGVuX2Nsb3NlZChjYXJkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCS8qIHdhaXQsIHVudGlsIGFsbCBkZXZpY2VzIGFyZSByZWFkeSBmb3IgdGhlIGZyZWUgb3BlcmF0aW9uICovCisJd2FpdF9mb3JfY29tcGxldGlvbigmcmVsZWFzZWQpOworCXJldHVybiAwOworfQogRVhQT1JUX1NZTUJPTChzbmRfY2FyZF9mcmVlKTsKIAogLyogcmV0cmlldmUgdGhlIGxhc3Qgd29yZCBvZiBzaG9ydG5hbWUgb3IgbG9uZ25hbWUgKi8KQEAgLTU5OCw3ICs1ODUsNyBAQAogCQlnb3RvIGFnYWluOwogCX0KIAkvKiBsYXN0IHJlc29ydC4uLiAqLwotCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBzZXQgY2FyZCBpZCAoJXMpXG4iLCBpZCk7CisJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gc2V0IGNhcmQgaWQgKCVzKVxuIiwgaWQpOwogCWlmIChjYXJkLT5wcm9jX3Jvb3QtPm5hbWUpCiAJCXN0cmxjcHkoY2FyZC0+aWQsIGNhcmQtPnByb2Nfcm9vdC0+bmFtZSwgc2l6ZW9mKGNhcmQtPmlkKSk7CiB9CkBAIC02MjYsMTUgKzYxMywxNSBAQAogY2FyZF9pZF9zaG93X2F0dHIoc3RydWN0IGRldmljZSAqZGV2LAogCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHNuZF9jYXJkICpjYXJkID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGNhcmQgPyBjYXJkLT5pZCA6ICIobnVsbCkiKTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgc25kX2NhcmQsIGNhcmRfZGV2KTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgY2FyZC0+aWQpOwogfQogCiBzdGF0aWMgc3NpemVfdAogY2FyZF9pZF9zdG9yZV9hdHRyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBzbmRfY2FyZCwgY2FyZF9kZXYpOwogCWNoYXIgYnVmMVtzaXplb2YoY2FyZC0+aWQpXTsKIAlzaXplX3QgY29weSA9IGNvdW50ID4gc2l6ZW9mKGNhcmQtPmlkKSAtIDEgPwogCQkJCQlzaXplb2YoY2FyZC0+aWQpIC0gMSA6IGNvdW50OwpAQCAtNjYwLDE5ICs2NDcsMzIgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBjYXJkX2lkX2F0dHJzID0KLQlfX0FUVFIoaWQsIFNfSVJVR08gfCBTX0lXVVNSLCBjYXJkX2lkX3Nob3dfYXR0ciwgY2FyZF9pZF9zdG9yZV9hdHRyKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpZCwgU19JUlVHTyB8IFNfSVdVU1IsIGNhcmRfaWRfc2hvd19hdHRyLCBjYXJkX2lkX3N0b3JlX2F0dHIpOwogCiBzdGF0aWMgc3NpemVfdAogY2FyZF9udW1iZXJfc2hvd19hdHRyKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVpXG4iLCBjYXJkID8gY2FyZC0+bnVtYmVyIDogLTEpOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBzbmRfY2FyZCwgY2FyZF9kZXYpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVpXG4iLCBjYXJkLT5udW1iZXIpOwogfQogCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgY2FyZF9udW1iZXJfYXR0cnMgPQotCV9fQVRUUihudW1iZXIsIFNfSVJVR08sIGNhcmRfbnVtYmVyX3Nob3dfYXR0ciwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIobnVtYmVyLCBTX0lSVUdPLCBjYXJkX251bWJlcl9zaG93X2F0dHIsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY2FyZF9kZXZfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfaWQuYXR0ciwKKwkmZGV2X2F0dHJfbnVtYmVyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgY2FyZF9kZXZfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMJPSBjYXJkX2Rldl9hdHRycywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpjYXJkX2Rldl9hdHRyX2dyb3Vwc1tdID0geworCSZjYXJkX2Rldl9hdHRyX2dyb3VwLAorCU5VTEwKK307CiAKIC8qKgogICogIHNuZF9jYXJkX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgdGhlIHNvdW5kY2FyZApAQCAtNjkyLDEyICs2OTIsMTEgQEAKIAlpZiAoc25kX0JVR19PTighY2FyZCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFjYXJkLT5jYXJkX2RldikgewotCQljYXJkLT5jYXJkX2RldiA9IGRldmljZV9jcmVhdGUoc291bmRfY2xhc3MsIGNhcmQtPmRldiwKLQkJCQkJICAgICAgIE1LREVWKDAsIDApLCBjYXJkLAotCQkJCQkgICAgICAgImNhcmQlaSIsIGNhcmQtPm51bWJlcik7Ci0JCWlmIChJU19FUlIoY2FyZC0+Y2FyZF9kZXYpKQotCQkJY2FyZC0+Y2FyZF9kZXYgPSBOVUxMOworCWlmICghY2FyZC0+cmVnaXN0ZXJlZCkgeworCQllcnIgPSBkZXZpY2VfYWRkKCZjYXJkLT5jYXJkX2Rldik7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJY2FyZC0+cmVnaXN0ZXJlZCA9IHRydWU7CiAJfQogCiAJaWYgKChlcnIgPSBzbmRfZGV2aWNlX3JlZ2lzdGVyX2FsbChjYXJkKSkgPCAwKQpAQCAtNzIzLDE5ICs3MjIsMTAgQEAKIAlzbmRfY2FyZHNbY2FyZC0+bnVtYmVyXSA9IGNhcmQ7CiAJbXV0ZXhfdW5sb2NrKCZzbmRfY2FyZF9tdXRleCk7CiAJaW5pdF9pbmZvX2Zvcl9jYXJkKGNhcmQpOwotI2lmIGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1MpIHx8IGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1NfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9NSVhFUl9PU1MpCiAJaWYgKHNuZF9taXhlcl9vc3Nfbm90aWZ5X2NhbGxiYWNrKQogCQlzbmRfbWl4ZXJfb3NzX25vdGlmeV9jYWxsYmFjayhjYXJkLCBTTkRfTUlYRVJfT1NTX05PVElGWV9SRUdJU1RFUik7CiAjZW5kaWYKLQlpZiAoY2FyZC0+Y2FyZF9kZXYpIHsKLQkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGNhcmQtPmNhcmRfZGV2LCAmY2FyZF9pZF9hdHRycyk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGNhcmQtPmNhcmRfZGV2LCAmY2FyZF9udW1iZXJfYXR0cnMpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkwOCw3ICs4OTgsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJbGlzdF9hZGQoJm1maWxlLT5saXN0LCAmY2FyZC0+ZmlsZXNfbGlzdCk7Ci0JYXRvbWljX2luYygmY2FyZC0+cmVmY291bnQpOworCWdldF9kZXZpY2UoJmNhcmQtPmNhcmRfZGV2KTsKIAlzcGluX3VubG9jaygmY2FyZC0+ZmlsZXNfbG9jayk7CiAJcmV0dXJuIDA7CiB9CkBAIC05NDcsMTEgKzkzNywxMSBAQAogCX0KIAlzcGluX3VubG9jaygmY2FyZC0+ZmlsZXNfbG9jayk7CiAJaWYgKCFmb3VuZCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBTFNBIGNhcmQgZmlsZSByZW1vdmUgcHJvYmxlbSAoJXApXG4iLCBmaWxlKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjYXJkIGZpbGUgcmVtb3ZlIHByb2JsZW0gKCVwKVxuIiwgZmlsZSk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAlrZnJlZShmb3VuZCk7Ci0Jc25kX2NhcmRfdW5yZWYoY2FyZCk7CisJcHV0X2RldmljZSgmY2FyZC0+Y2FyZF9kZXYpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2lzYWRtYS5jIGIvc291bmQvY29yZS9pc2FkbWEuYwppbmRleCBlMmIzODYxLi4zMWU4NTQ0IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2lzYWRtYS5jCisrKyBiL3NvdW5kL2NvcmUvaXNhZG1hLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCQlyZXN1bHQgPSByZXN1bHQxOwogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKIAlpZiAocmVzdWx0ID4gc2l6ZSkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAicG9pbnRlciAoMHgleCkgZm9yIERNQSAjJWxkIGlzIGdyZWF0ZXIgdGhhbiB0cmFuc2ZlciBzaXplICgweCV4KVxuIiwgcmVzdWx0LCBkbWEsIHNpemUpOworCQlwcl9lcnIoIkFMU0E6IHBvaW50ZXIgKDB4JXgpIGZvciBETUEgIyVsZCBpcyBncmVhdGVyIHRoYW4gdHJhbnNmZXIgc2l6ZSAoMHgleClcbiIsIHJlc3VsdCwgZG1hLCBzaXplKTsKICNlbmRpZgogCWlmIChyZXN1bHQgPj0gc2l6ZSB8fCByZXN1bHQgPT0gMCkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL21lbWFsbG9jLmMgYi9zb3VuZC9jb3JlL21lbWFsbG9jLmMKaW5kZXggNDU5NWY5My4uMDgyNTA5ZSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9tZW1hbGxvYy5jCisrKyBiL3NvdW5kL2NvcmUvbWVtYWxsb2MuYwpAQCAtMjA3LDcgKzIwNyw3IEBACiAJCWJyZWFrOwogI2VuZGlmCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJzbmQtbWFsbG9jOiBpbnZhbGlkIGRldmljZSB0eXBlICVkXG4iLCB0eXBlKTsKKwkJcHJfZXJyKCJzbmQtbWFsbG9jOiBpbnZhbGlkIGRldmljZSB0eXBlICVkXG4iLCB0eXBlKTsKIAkJZG1hYi0+YXJlYSA9IE5VTEw7CiAJCWRtYWItPmFkZHIgPSAwOwogCQlyZXR1cm4gLUVOWElPOwpAQCAtMjg0LDcgKzI4NCw3IEBACiAJCWJyZWFrOwogI2VuZGlmCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJzbmQtbWFsbG9jOiBpbnZhbGlkIGRldmljZSB0eXBlICVkXG4iLCBkbWFiLT5kZXYudHlwZSk7CisJCXByX2Vycigic25kLW1hbGxvYzogaW52YWxpZCBkZXZpY2UgdHlwZSAlZFxuIiwgZG1hYi0+ZGV2LnR5cGUpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9vc3MvbWl4ZXJfb3NzLmMgYi9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYwppbmRleCBlOGExZDE4Li41ZTYzNDlmIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYworKysgYi9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYwpAQCAtMTE4Nyw3ICsxMTg3LDggQEAKIAkJCWlmIChvc3NfbWl4ZXJfbmFtZXNbY2hdICYmIHN0cmNtcChvc3NfbWl4ZXJfbmFtZXNbY2hdLCBzdHIpID09IDApCiAJCQkJYnJlYWs7CiAJCWlmIChjaCA+PSBTTkRSVl9PU1NfTUFYX01JWEVSUykgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWl4ZXJfb3NzOiBpbnZhbGlkIE9TUyB2b2x1bWUgJyVzJ1xuIiwgc3RyKTsKKwkJCXByX2VycigiQUxTQTogbWl4ZXJfb3NzOiBpbnZhbGlkIE9TUyB2b2x1bWUgJyVzJ1xuIiwKKwkJCSAgICAgICBzdHIpOwogCQkJY29udGludWU7CiAJCX0KIAkJY3B0ciA9IHNuZF9pbmZvX2dldF9zdHIoc3RyLCBjcHRyLCBzaXplb2Yoc3RyKSk7CkBAIC0xMjAxLDcgKzEyMDIsNyBAQAogCQlzbmRfaW5mb19nZXRfc3RyKGlkeHN0ciwgY3B0ciwgc2l6ZW9mKGlkeHN0cikpOwogCQlpZHggPSBzaW1wbGVfc3RydG91bChpZHhzdHIsIE5VTEwsIDEwKTsKIAkJaWYgKGlkeCA+PSAweDQwMDApIHsgLyogdG9vIGJpZyAqLwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWl4ZXJfb3NzOiBpbnZhbGlkIGluZGV4ICVkXG4iLCBpZHgpOworCQkJcHJfZXJyKCJBTFNBOiBtaXhlcl9vc3M6IGludmFsaWQgaW5kZXggJWRcbiIsIGlkeCk7CiAJCQljb250aW51ZTsKIAkJfQogCQltdXRleF9sb2NrKCZtaXhlci0+cmVnX211dGV4KTsKQEAgLTEyMTIsNyArMTIxMyw3IEBACiAJCQlnb3RvIF9fdW5sb2NrOwogCQl0YmwgPSBrbWFsbG9jKHNpemVvZigqdGJsKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghIHRibCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWl4ZXJfb3NzOiBubyBtZW1vcnlcbiIpOworCQkJcHJfZXJyKCJBTFNBOiBtaXhlcl9vc3M6IG5vIG1lbW9yeVxuIik7CiAJCQlnb3RvIF9fdW5sb2NrOwogCQl9CiAJCXRibC0+b3NzX2lkID0gY2g7CkBAIC0xMzQzLDIwICsxMzQ0LDE4IEBACiAJc3RydWN0IHNuZF9taXhlcl9vc3MgKm1peGVyOwogCiAJaWYgKGNtZCA9PSBTTkRfTUlYRVJfT1NTX05PVElGWV9SRUdJU1RFUikgewotCQljaGFyIG5hbWVbMTI4XTsKIAkJaW50IGlkeCwgZXJyOwogCiAJCW1peGVyID0ga2NhbGxvYygyLCBzaXplb2YoKm1peGVyKSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChtaXhlciA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCW11dGV4X2luaXQoJm1peGVyLT5yZWdfbXV0ZXgpOwotCQlzcHJpbnRmKG5hbWUsICJtaXhlciVpJWkiLCBjYXJkLT5udW1iZXIsIDApOwogCQlpZiAoKGVyciA9IHNuZF9yZWdpc3Rlcl9vc3NfZGV2aWNlKFNORFJWX09TU19ERVZJQ0VfVFlQRV9NSVhFUiwKIAkJCQkJCSAgIGNhcmQsIDAsCi0JCQkJCQkgICAmc25kX21peGVyX29zc19mX29wcywgY2FyZCwKLQkJCQkJCSAgIG5hbWUpKSA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZWdpc3RlciBPU1MgbWl4ZXIgZGV2aWNlICVpOiVpXG4iLAotCQkJCSAgIGNhcmQtPm51bWJlciwgMCk7CisJCQkJCQkgICAmc25kX21peGVyX29zc19mX29wcywgY2FyZCkpIDwgMCkgeworCQkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkJInVuYWJsZSB0byByZWdpc3RlciBPU1MgbWl4ZXIgZGV2aWNlICVpOiVpXG4iLAorCQkJCWNhcmQtPm51bWJlciwgMCk7CiAJCQlrZnJlZShtaXhlcik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CkBAIC0xMzY1LDcgKzEzNjQsOCBAQAogCQlpZiAoKmNhcmQtPm1peGVybmFtZSkKIAkJCXN0cmxjcHkobWl4ZXItPm5hbWUsIGNhcmQtPm1peGVybmFtZSwgc2l6ZW9mKG1peGVyLT5uYW1lKSk7CiAJCWVsc2UKLQkJCXN0cmxjcHkobWl4ZXItPm5hbWUsIG5hbWUsIHNpemVvZihtaXhlci0+bmFtZSkpOworCQkJc25wcmludGYobWl4ZXItPm5hbWUsIHNpemVvZihtaXhlci0+bmFtZSksCisJCQkJICJtaXhlciVpIiwgY2FyZC0+bnVtYmVyKTsKICNpZmRlZiBTTkRSVl9PU1NfSU5GT19ERVZfTUlYRVJTCiAJCXNuZF9vc3NfaW5mb19yZWdpc3RlcihTTkRSVl9PU1NfSU5GT19ERVZfTUlYRVJTLAogCQkJCSAgICAgIGNhcmQtPm51bWJlciwKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYyBiL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYwppbmRleCA0YzFjYzUxLi5hZGE2OWQ3IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL29zcy9wY21fb3NzLmMKKysrIGIvc291bmQvY29yZS9vc3MvcGNtX29zcy5jCkBAIC04NTQsNyArODU0LDcgQEAKIAlwYXJhbXMgPSBrbWFsbG9jKHNpemVvZigqcGFyYW1zKSwgR0ZQX0tFUk5FTCk7CiAJc3BhcmFtcyA9IGttYWxsb2Moc2l6ZW9mKCpzcGFyYW1zKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzd19wYXJhbXMgfHwgIXBhcmFtcyB8fCAhc3BhcmFtcykgewotCQlzbmRfcHJpbnRkKCJObyBtZW1vcnlcbiIpOworCQlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLCAiTm8gbWVtb3J5XG4iKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsdXJlOwogCX0KQEAgLTg3Nyw3ICs4NzcsNyBAQAogCX0KIAllcnIgPSBzbmRfcGNtX2h3X3BhcmFtX21hc2soc3Vic3RyZWFtLCBzcGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fQUNDRVNTLCAmbWFzayk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ZCgiTm8gdXNhYmxlIGFjY2Vzc2VzXG4iKTsKKwkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwgIk5vIHVzYWJsZSBhY2Nlc3Nlc1xuIik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZmFpbHVyZTsKIAl9CkBAIC05MDIsNyArOTAyLDcgQEAKIAkJCQlicmVhazsKIAkJfQogCQlpZiAoKF9fZm9yY2UgaW50KXNmb3JtYXQgPiAoX19mb3JjZSBpbnQpU05EUlZfUENNX0ZPUk1BVF9MQVNUKSB7Ci0JCQlzbmRfcHJpbnRkKCJDYW5ub3QgZmluZCBhIGZvcm1hdCEhIVxuIik7CisJCQlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLCAiQ2Fubm90IGZpbmQgYSBmb3JtYXQhISFcbiIpOwogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gZmFpbHVyZTsKIAkJfQpAQCAtOTQyLDE0ICs5NDIsMTYgQEAKIAkJaWYgKChlcnIgPSBzbmRfcGNtX3BsdWdfZm9ybWF0X3BsdWdpbnMoc3Vic3RyZWFtLAogCQkJCQkJICAgICAgIHBhcmFtcywgCiAJCQkJCQkgICAgICAgc3BhcmFtcykpIDwgMCkgewotCQkJc25kX3ByaW50ZCgic25kX3BjbV9wbHVnX2Zvcm1hdF9wbHVnaW5zIGZhaWxlZDogJWlcbiIsIGVycik7CisJCQlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLAorCQkJCSJzbmRfcGNtX3BsdWdfZm9ybWF0X3BsdWdpbnMgZmFpbGVkOiAlaVxuIiwgZXJyKTsKIAkJCXNuZF9wY21fb3NzX3BsdWdpbl9jbGVhcihzdWJzdHJlYW0pOwogCQkJZ290byBmYWlsdXJlOwogCQl9CiAJCWlmIChydW50aW1lLT5vc3MucGx1Z2luX2ZpcnN0KSB7CiAJCQlzdHJ1Y3Qgc25kX3BjbV9wbHVnaW4gKnBsdWdpbjsKIAkJCWlmICgoZXJyID0gc25kX3BjbV9wbHVnaW5fYnVpbGRfaW8oc3Vic3RyZWFtLCBzcGFyYW1zLCAmcGx1Z2luKSkgPCAwKSB7Ci0JCQkJc25kX3ByaW50ZCgic25kX3BjbV9wbHVnaW5fYnVpbGRfaW8gZmFpbGVkOiAlaVxuIiwgZXJyKTsKKwkJCQlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLAorCQkJCQkic25kX3BjbV9wbHVnaW5fYnVpbGRfaW8gZmFpbGVkOiAlaVxuIiwgZXJyKTsKIAkJCQlzbmRfcGNtX29zc19wbHVnaW5fY2xlYXIoc3Vic3RyZWFtKTsKIAkJCQlnb3RvIGZhaWx1cmU7CiAJCQl9CkBAIC05ODMsNyArOTg1LDcgQEAKIAlzbmRfcGNtX2tlcm5lbF9pb2N0bChzdWJzdHJlYW0sIFNORFJWX1BDTV9JT0NUTF9EUk9QLCBOVUxMKTsKIAogCWlmICgoZXJyID0gc25kX3BjbV9rZXJuZWxfaW9jdGwoc3Vic3RyZWFtLCBTTkRSVl9QQ01fSU9DVExfSFdfUEFSQU1TLCBzcGFyYW1zKSkgPCAwKSB7Ci0JCXNuZF9wcmludGQoIkhXX1BBUkFNUyBmYWlsZWQ6ICVpXG4iLCBlcnIpOworCQlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLCAiSFdfUEFSQU1TIGZhaWxlZDogJWlcbiIsIGVycik7CiAJCWdvdG8gZmFpbHVyZTsKIAl9CiAKQEAgLTEwMTYsNyArMTAxOCw3IEBACiAJfQogCiAJaWYgKChlcnIgPSBzbmRfcGNtX2tlcm5lbF9pb2N0bChzdWJzdHJlYW0sIFNORFJWX1BDTV9JT0NUTF9TV19QQVJBTVMsIHN3X3BhcmFtcykpIDwgMCkgewotCQlzbmRfcHJpbnRkKCJTV19QQVJBTVMgZmFpbGVkOiAlaVxuIiwgZXJyKTsKKwkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwgIlNXX1BBUkFNUyBmYWlsZWQ6ICVpXG4iLCBlcnIpOwogCQlnb3RvIGZhaWx1cmU7CiAJfQogCkBAIC0xMTEwLDcgKzExMTIsOCBAQAogCiAJZXJyID0gc25kX3BjbV9rZXJuZWxfaW9jdGwoc3Vic3RyZWFtLCBTTkRSVl9QQ01fSU9DVExfUFJFUEFSRSwgTlVMTCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ZCgic25kX3BjbV9vc3NfcHJlcGFyZTogU05EUlZfUENNX0lPQ1RMX1BSRVBBUkUgZmFpbGVkXG4iKTsKKwkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwKKwkJCSJzbmRfcGNtX29zc19wcmVwYXJlOiBTTkRSVl9QQ01fSU9DVExfUFJFUEFSRSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlydW50aW1lLT5vc3MucHJlcGFyZSA9IDA7CkBAIC0xMTc1LDEyICsxMTc4LDEwIEBACiAJCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9YUlVOIHx8CiAJCSAgICBydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9TVVNQRU5ERUQpIHsKICNpZmRlZiBPU1NfREVCVUcKLQkJCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9YUlVOKQotCQkJCXByaW50ayhLRVJOX0RFQlVHICJwY21fb3NzOiB3cml0ZTogIgotCQkJCSAgICAgICAicmVjb3ZlcmluZyBmcm9tIFhSVU5cbiIpOwotCQkJZWxzZQotCQkJCXByaW50ayhLRVJOX0RFQlVHICJwY21fb3NzOiB3cml0ZTogIgotCQkJCSAgICAgICAicmVjb3ZlcmluZyBmcm9tIFNVU1BFTkRcbiIpOworCQkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwKKwkJCQkicGNtX29zczogd3JpdGU6IHJlY292ZXJpbmcgZnJvbSAlc1xuIiwKKwkJCQlydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9YUlVOID8KKwkJCQkiWFJVTiIgOiAiU1VTUEVORCIpOwogI2VuZGlmCiAJCQlyZXQgPSBzbmRfcGNtX29zc19wcmVwYXJlKHN1YnN0cmVhbSk7CiAJCQlpZiAocmV0IDwgMCkKQEAgLTEyMTMsMTIgKzEyMTQsMTAgQEAKIAkJaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX1hSVU4gfHwKIAkJICAgIHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX1NVU1BFTkRFRCkgewogI2lmZGVmIE9TU19ERUJVRwotCQkJaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX1hSVU4pCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgInBjbV9vc3M6IHJlYWQ6ICIKLQkJCQkgICAgICAgInJlY292ZXJpbmcgZnJvbSBYUlVOXG4iKTsKLQkJCWVsc2UKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAicGNtX29zczogcmVhZDogIgotCQkJCSAgICAgICAicmVjb3ZlcmluZyBmcm9tIFNVU1BFTkRcbiIpOworCQkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwKKwkJCQkicGNtX29zczogcmVhZDogcmVjb3ZlcmluZyBmcm9tICVzXG4iLAorCQkJCXJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX1hSVU4gPworCQkJCSJYUlVOIiA6ICJTVVNQRU5EIik7CiAjZW5kaWYKIAkJCXJldCA9IHNuZF9wY21fa2VybmVsX2lvY3RsKHN1YnN0cmVhbSwgU05EUlZfUENNX0lPQ1RMX0RSQUlOLCBOVUxMKTsKIAkJCWlmIChyZXQgPCAwKQpAQCAtMTI2MSwxMiArMTI2MCwxMCBAQAogCQlpZiAocnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfWFJVTiB8fAogCQkgICAgcnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfU1VTUEVOREVEKSB7CiAjaWZkZWYgT1NTX0RFQlVHCi0JCQlpZiAocnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfWFJVTikKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAicGNtX29zczogd3JpdGV2OiAiCi0JCQkJICAgICAgICJyZWNvdmVyaW5nIGZyb20gWFJVTlxuIik7Ci0JCQllbHNlCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgInBjbV9vc3M6IHdyaXRldjogIgotCQkJCSAgICAgICAicmVjb3ZlcmluZyBmcm9tIFNVU1BFTkRcbiIpOworCQkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwKKwkJCQkicGNtX29zczogd3JpdGV2OiByZWNvdmVyaW5nIGZyb20gJXNcbiIsCisJCQkJcnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfWFJVTiA/CisJCQkJIlhSVU4iIDogIlNVU1BFTkQiKTsKICNlbmRpZgogCQkJcmV0ID0gc25kX3BjbV9vc3NfcHJlcGFyZShzdWJzdHJlYW0pOwogCQkJaWYgKHJldCA8IDApCkBAIC0xMjk5LDEyICsxMjk2LDEwIEBACiAJCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9YUlVOIHx8CiAJCSAgICBydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9TVVNQRU5ERUQpIHsKICNpZmRlZiBPU1NfREVCVUcKLQkJCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9YUlVOKQotCQkJCXByaW50ayhLRVJOX0RFQlVHICJwY21fb3NzOiByZWFkdjogIgotCQkJCSAgICAgICAicmVjb3ZlcmluZyBmcm9tIFhSVU5cbiIpOwotCQkJZWxzZQotCQkJCXByaW50ayhLRVJOX0RFQlVHICJwY21fb3NzOiByZWFkdjogIgotCQkJCSAgICAgICAicmVjb3ZlcmluZyBmcm9tIFNVU1BFTkRcbiIpOworCQkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwKKwkJCQkicGNtX29zczogcmVhZHY6IHJlY292ZXJpbmcgZnJvbSAlc1xuIiwKKwkJCQlydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9YUlVOID8KKwkJCQkiWFJVTiIgOiAiU1VTUEVORCIpOwogI2VuZGlmCiAJCQlyZXQgPSBzbmRfcGNtX2tlcm5lbF9pb2N0bChzdWJzdHJlYW0sIFNORFJWX1BDTV9JT0NUTF9EUkFJTiwgTlVMTCk7CiAJCQlpZiAocmV0IDwgMCkKQEAgLTE1NjEsNyArMTU1Niw3IEBACiAJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCWFkZF93YWl0X3F1ZXVlKCZydW50aW1lLT5zbGVlcCwgJndhaXQpOwogI2lmZGVmIE9TU19ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJzeW5jMTogc2l6ZSA9ICVsaVxuIiwgc2l6ZSk7CisJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwgInN5bmMxOiBzaXplID0gJWxpXG4iLCBzaXplKTsKICNlbmRpZgogCXdoaWxlICgxKSB7CiAJCXJlc3VsdCA9IHNuZF9wY21fb3NzX3dyaXRlMihzdWJzdHJlYW0sIHJ1bnRpbWUtPm9zcy5idWZmZXIsIHNpemUsIDEpOwpAQCAtMTU4Nyw3ICsxNTgyLDggQEAKIAkJCWJyZWFrOwogCQl9CiAJCWlmIChyZXMgPT0gMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiT1NTIHN5bmMgZXJyb3IgLSBETUEgdGltZW91dFxuIik7CisJCQlwY21fZXJyKHN1YnN0cmVhbS0+cGNtLAorCQkJCSJPU1Mgc3luYyBlcnJvciAtIERNQSB0aW1lb3V0XG4iKTsKIAkJCXJlc3VsdCA9IC1FSU87CiAJCQlicmVhazsKIAkJfQpAQCAtMTYxOCw3ICsxNjE0LDcgQEAKIAkJbXV0ZXhfbG9jaygmcnVudGltZS0+b3NzLnBhcmFtc19sb2NrKTsKIAkJaWYgKHJ1bnRpbWUtPm9zcy5idWZmZXJfdXNlZCA+IDApIHsKICNpZmRlZiBPU1NfREVCVUcKLQkJCXByaW50ayhLRVJOX0RFQlVHICJzeW5jOiBidWZmZXJfdXNlZFxuIik7CisJCQlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLCAic3luYzogYnVmZmVyX3VzZWRcbiIpOwogI2VuZGlmCiAJCQlzaXplID0gKDggKiAocnVudGltZS0+b3NzLnBlcmlvZF9ieXRlcyAtIHJ1bnRpbWUtPm9zcy5idWZmZXJfdXNlZCkgKyA3KSAvIHdpZHRoOwogCQkJc25kX3BjbV9mb3JtYXRfc2V0X3NpbGVuY2UoZm9ybWF0LApAQCAtMTYzMSw3ICsxNjI3LDcgQEAKIAkJCX0KIAkJfSBlbHNlIGlmIChydW50aW1lLT5vc3MucGVyaW9kX3B0ciA+IDApIHsKICNpZmRlZiBPU1NfREVCVUcKLQkJCXByaW50ayhLRVJOX0RFQlVHICJzeW5jOiBwZXJpb2RfcHRyXG4iKTsKKwkJCXBjbV9kYmcoc3Vic3RyZWFtLT5wY20sICJzeW5jOiBwZXJpb2RfcHRyXG4iKTsKICNlbmRpZgogCQkJc2l6ZSA9IHJ1bnRpbWUtPm9zcy5wZXJpb2RfYnl0ZXMgLSBydW50aW1lLT5vc3MucGVyaW9kX3B0cjsKIAkJCXNuZF9wY21fZm9ybWF0X3NldF9zaWxlbmNlKGZvcm1hdCwKQEAgLTE5ODMsNyArMTk3OSw3IEBACiAJaW50IGVyciwgY21kOwogCiAjaWZkZWYgT1NTX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgInBjbV9vc3M6IHRyaWdnZXIgPSAweCV4XG4iLCB0cmlnZ2VyKTsKKwlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLCAicGNtX29zczogdHJpZ2dlciA9IDB4JXhcbiIsIHRyaWdnZXIpOwogI2VuZGlmCiAJCiAJcHN1YnN0cmVhbSA9IHBjbV9vc3NfZmlsZS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXTsKQEAgLTIyMDMsOSArMjE5OSw5IEBACiAJfQogCiAjaWZkZWYgT1NTX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgInBjbV9vc3M6IHNwYWNlOiBieXRlcyA9ICVpLCBmcmFnbWVudHMgPSAlaSwgIgotCSAgICAgICAiZnJhZ3N0b3RhbCA9ICVpLCBmcmFnc2l6ZSA9ICVpXG4iLAotCSAgICAgICBpbmZvLmJ5dGVzLCBpbmZvLmZyYWdtZW50cywgaW5mby5mcmFnc3RvdGFsLCBpbmZvLmZyYWdzaXplKTsKKwlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLAorCQkicGNtX29zczogc3BhY2U6IGJ5dGVzID0gJWksIGZyYWdtZW50cyA9ICVpLCBmcmFnc3RvdGFsID0gJWksIGZyYWdzaXplID0gJWlcbiIsCisJCWluZm8uYnl0ZXMsIGluZm8uZnJhZ21lbnRzLCBpbmZvLmZyYWdzdG90YWwsIGluZm8uZnJhZ3NpemUpOwogI2VuZGlmCiAJaWYgKGNvcHlfdG9fdXNlcihfaW5mbywgJmluZm8sIHNpemVvZihpbmZvKSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMjIxNSw3ICsyMjExLDcgQEAKIHN0YXRpYyBpbnQgc25kX3BjbV9vc3NfZ2V0X21hcGJ1ZihzdHJ1Y3Qgc25kX3BjbV9vc3NfZmlsZSAqcGNtX29zc19maWxlLCBpbnQgc3RyZWFtLCBzdHJ1Y3QgYnVmZm1lbV9kZXNjIF9fdXNlciAqIF9pbmZvKQogewogCS8vIGl0IHdvbid0IGJlIHByb2JhYmx5IGltcGxlbWVudGVkCi0JLy8gc25kX3ByaW50ZCgiVE9ETzogc25kX3BjbV9vc3NfZ2V0X21hcGJ1ZlxuIik7CisJLy8gcHJfZGVidWcoIlRPRE86IHNuZF9wY21fb3NzX2dldF9tYXBidWZcbiIpOwogCXJldHVybiAtRUlOVkFMOwogfQogCkBAIC0yNTE5LDcgKzI1MTUsNyBAQAogCWlmICgoKGNtZCA+PiA4KSAmIDB4ZmYpICE9ICdQJykKIAkJcmV0dXJuIC1FSU5WQUw7CiAjaWZkZWYgT1NTX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgInBjbV9vc3M6IGlvY3RsID0gMHgleFxuIiwgY21kKTsKKwlwcl9kZWJ1ZygicGNtX29zczogaW9jdGwgPSAweCV4XG4iLCBjbWQpOwogI2VuZGlmCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORENUTF9EU1BfUkVTRVQ6CkBAIC0yNjQ2LDcgKzI2NDIsNyBAQAogCWNhc2UgU05EQ1RMX0RTUF9QUk9GSUxFOgogCQlyZXR1cm4gMDsJLyogc2lsZW50bHkgaWdub3JlICovCiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ZCgicGNtX29zczogdW5rbm93biBjb21tYW5kID0gMHgleFxuIiwgY21kKTsKKwkJcHJfZGVidWcoInBjbV9vc3M6IHVua25vd24gY29tbWFuZCA9IDB4JXhcbiIsIGNtZCk7CiAJfQogCXJldHVybiAtRUlOVkFMOwogfQpAQCAtMjY3Myw4ICsyNjY5LDkgQEAKICNlbHNlCiAJewogCQlzc2l6ZV90IHJlcyA9IHNuZF9wY21fb3NzX3JlYWQxKHN1YnN0cmVhbSwgYnVmLCBjb3VudCk7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJwY21fb3NzOiByZWFkICVsaSBieXRlcyAiCi0JCSAgICAgICAiKHJldHVybmVkICVsaSBieXRlcylcbiIsIChsb25nKWNvdW50LCAobG9uZylyZXMpOworCQlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLAorCQkJInBjbV9vc3M6IHJlYWQgJWxpIGJ5dGVzIChyZXR1cm5lZCAlbGkgYnl0ZXMpXG4iLAorCQkJKGxvbmcpY291bnQsIChsb25nKXJlcyk7CiAJCXJldHVybiByZXM7CiAJfQogI2VuZGlmCkBAIC0yNjkzLDcgKzI2OTAsNyBAQAogCXN1YnN0cmVhbS0+Zl9mbGFncyA9IGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLOwogCXJlc3VsdCA9IHNuZF9wY21fb3NzX3dyaXRlMShzdWJzdHJlYW0sIGJ1ZiwgY291bnQpOwogI2lmZGVmIE9TU19ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJwY21fb3NzOiB3cml0ZSAlbGkgYnl0ZXMgKHdyb3RlICVsaSBieXRlcylcbiIsCisJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwgInBjbV9vc3M6IHdyaXRlICVsaSBieXRlcyAod3JvdGUgJWxpIGJ5dGVzKVxuIiwKIAkgICAgICAgKGxvbmcpY291bnQsIChsb25nKXJlc3VsdCk7CiAjZW5kaWYKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMjc3Miw3ICsyNzY5LDcgQEAKIAlpbnQgZXJyOwogCiAjaWZkZWYgT1NTX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgInBjbV9vc3M6IG1tYXAgYmVnaW5cbiIpOworCXByX2RlYnVnKCJwY21fb3NzOiBtbWFwIGJlZ2luXG4iKTsKICNlbmRpZgogCXBjbV9vc3NfZmlsZSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzd2l0Y2ggKChhcmVhLT52bV9mbGFncyAmIChWTV9SRUFEIHwgVk1fV1JJVEUpKSkgewpAQCAtMjgyMiw3ICsyODE5LDcgQEAKIAlydW50aW1lLT5zaWxlbmNlX3RocmVzaG9sZCA9IDA7CiAJcnVudGltZS0+c2lsZW5jZV9zaXplID0gMDsKICNpZmRlZiBPU1NfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAicGNtX29zczogbW1hcCBvaywgYnl0ZXMgPSAweCV4XG4iLAorCXByX2RlYnVnKCJwY21fb3NzOiBtbWFwIG9rLCBieXRlcyA9IDB4JXhcbiIsCiAJICAgICAgIHJ1bnRpbWUtPm9zcy5tbWFwX2J5dGVzKTsKICNlbmRpZgogCS8qIEluIG1tYXAgbW9kZSB3ZSBuZXZlciBzdG9wICovCkBAIC0zMDA3LDEyICszMDA0LDEwIEBACiAKIHN0YXRpYyB2b2lkIHJlZ2lzdGVyX29zc19kc3Aoc3RydWN0IHNuZF9wY20gKnBjbSwgaW50IGluZGV4KQogewotCWNoYXIgbmFtZVsxMjhdOwotCXNwcmludGYobmFtZSwgImRzcCVpJWkiLCBwY20tPmNhcmQtPm51bWJlciwgcGNtLT5kZXZpY2UpOwogCWlmIChzbmRfcmVnaXN0ZXJfb3NzX2RldmljZShTTkRSVl9PU1NfREVWSUNFX1RZUEVfUENNLAogCQkJCSAgICBwY20tPmNhcmQsIGluZGV4LCAmc25kX3BjbV9vc3NfZl9yZWcsCi0JCQkJICAgIHBjbSwgbmFtZSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZWdpc3RlciBPU1MgUENNIGRldmljZSAlaTolaVxuIiwKKwkJCQkgICAgcGNtKSA8IDApIHsKKwkJcGNtX2VycihwY20sICJ1bmFibGUgdG8gcmVnaXN0ZXIgT1NTIFBDTSBkZXZpY2UgJWk6JWlcbiIsCiAJCQkgICBwY20tPmNhcmQtPm51bWJlciwgcGNtLT5kZXZpY2UpOwogCX0KIH0KQEAgLTMwOTMsMTIgKzMwODgsMTIgQEAKIAkvKiBjaGVjayBkZXZpY2UgbWFwIHRhYmxlICovCiAJZm9yIChpID0gMDsgaSA8IFNORFJWX0NBUkRTOyBpKyspIHsKIAkJaWYgKGRzcF9tYXBbaV0gPCAwIHx8IGRzcF9tYXBbaV0gPj0gU05EUlZfUENNX0RFVklDRVMpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgZHNwX21hcFslZF0gPSAlZFxuIiwKKwkJCXByX2VycigiQUxTQTogcGNtX29zczogaW52YWxpZCBkc3BfbWFwWyVkXSA9ICVkXG4iLAogCQkJCSAgIGksIGRzcF9tYXBbaV0pOwogCQkJZHNwX21hcFtpXSA9IDA7CiAJCX0KIAkJaWYgKGFkc3BfbWFwW2ldIDwgMCB8fCBhZHNwX21hcFtpXSA+PSBTTkRSVl9QQ01fREVWSUNFUykgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBhZHNwX21hcFslZF0gPSAlZFxuIiwKKwkJCXByX2VycigiQUxTQTogcGNtX29zczogaW52YWxpZCBhZHNwX21hcFslZF0gPSAlZFxuIiwKIAkJCQkgICBpLCBhZHNwX21hcFtpXSk7CiAJCQlhZHNwX21hcFtpXSA9IDE7CiAJCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtLmMgYi9zb3VuZC9jb3JlL3BjbS5jCmluZGV4IGUxZTllMGMuLjQzOTMyZTggMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtLmMKKysrIGIvc291bmQvY29yZS9wY20uYwpAQCAtMjk1LDcgKzI5NSw3IEBACiAJcmV0dXJuIHNuZF9wY21fc3RhdGVfbmFtZXNbKF9fZm9yY2UgaW50KXN0YXRlXTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX1NORF9QQ01fT1NTKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfU05EX1BDTV9PU1MpCiAjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzbmRfcGNtX29zc19mb3JtYXRfbmFtZShpbnQgZm9ybWF0KQpAQCAtMzM4LDcgKzMzOCw4IEBACiAKIAlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoISBpbmZvKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJzbmRfcGNtX3Byb2NfaW5mb19yZWFkOiBjYW5ub3QgbWFsbG9jXG4iKTsKKwkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwKKwkJCSJzbmRfcGNtX3Byb2NfaW5mb19yZWFkOiBjYW5ub3QgbWFsbG9jXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzk4LDcgKzM5OSw3IEBACiAJc25kX2lwcmludGYoYnVmZmVyLCAicmF0ZTogJXUgKCV1LyV1KVxuIiwgcnVudGltZS0+cmF0ZSwgcnVudGltZS0+cmF0ZV9udW0sIHJ1bnRpbWUtPnJhdGVfZGVuKTsJCiAJc25kX2lwcmludGYoYnVmZmVyLCAicGVyaW9kX3NpemU6ICVsdVxuIiwgcnVudGltZS0+cGVyaW9kX3NpemUpOwkKIAlzbmRfaXByaW50ZihidWZmZXIsICJidWZmZXJfc2l6ZTogJWx1XG4iLCBydW50aW1lLT5idWZmZXJfc2l6ZSk7CQotI2lmIGRlZmluZWQoQ09ORklHX1NORF9QQ01fT1NTKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfU05EX1BDTV9PU1MpCiAJaWYgKHN1YnN0cmVhbS0+b3NzLm9zcykgewogCQlzbmRfaXByaW50ZihidWZmZXIsICJPU1MgZm9ybWF0OiAlc1xuIiwgc25kX3BjbV9vc3NfZm9ybWF0X25hbWUocnVudGltZS0+b3NzLmZvcm1hdCkpOwogCQlzbmRfaXByaW50ZihidWZmZXIsICJPU1MgY2hhbm5lbHM6ICV1XG4iLCBydW50aW1lLT5vc3MuY2hhbm5lbHMpOwkKQEAgLTY1MSw3ICs2NTIsNyBAQAogCXN0cnVjdCBzbmRfcGNtX3N0ciAqcHN0ciA9ICZwY20tPnN0cmVhbXNbc3RyZWFtXTsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgKnByZXY7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TUykgfHwgZGVmaW5lZChDT05GSUdfU05EX1BDTV9PU1NfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9QQ01fT1NTKQogCW11dGV4X2luaXQoJnBzdHItPm9zcy5zZXR1cF9tdXRleCk7CiAjZW5kaWYKIAlwc3RyLT5zdHJlYW0gPSBzdHJlYW07CkBAIC02NjAsNyArNjYxLDcgQEAKIAlpZiAoc3Vic3RyZWFtX2NvdW50ID4gMCAmJiAhcGNtLT5pbnRlcm5hbCkgewogCQllcnIgPSBzbmRfcGNtX3N0cmVhbV9wcm9jX2luaXQocHN0cik7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJFcnJvciBpbiBzbmRfcGNtX3N0cmVhbV9wcm9jX2luaXRcbiIpOworCQkJcGNtX2VycihwY20sICJFcnJvciBpbiBzbmRfcGNtX3N0cmVhbV9wcm9jX2luaXRcbiIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KQEAgLTY2OCw3ICs2NjksNyBAQAogCWZvciAoaWR4ID0gMCwgcHJldiA9IE5VTEw7IGlkeCA8IHN1YnN0cmVhbV9jb3VudDsgaWR4KyspIHsKIAkJc3Vic3RyZWFtID0ga3phbGxvYyhzaXplb2YoKnN1YnN0cmVhbSksIEdGUF9LRVJORUwpOwogCQlpZiAoc3Vic3RyZWFtID09IE5VTEwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkNhbm5vdCBhbGxvY2F0ZSBQQ00gc3Vic3RyZWFtXG4iKTsKKwkJCXBjbV9lcnIocGNtLCAiQ2Fubm90IGFsbG9jYXRlIFBDTSBzdWJzdHJlYW1cbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJc3Vic3RyZWFtLT5wY20gPSBwY207CkBAIC02ODUsNyArNjg2LDggQEAKIAkJaWYgKCFwY20tPmludGVybmFsKSB7CiAJCQllcnIgPSBzbmRfcGNtX3N1YnN0cmVhbV9wcm9jX2luaXQoc3Vic3RyZWFtKTsKIAkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRXJyb3IgaW4gc25kX3BjbV9zdHJlYW1fcHJvY19pbml0XG4iKTsKKwkJCQlwY21fZXJyKHBjbSwKKwkJCQkJIkVycm9yIGluIHNuZF9wY21fc3RyZWFtX3Byb2NfaW5pdFxuIik7CiAJCQkJaWYgKHByZXYgPT0gTlVMTCkKIAkJCQkJcHN0ci0+c3Vic3RyZWFtID0gTlVMTDsKIAkJCQllbHNlCkBAIC03MjQsNyArNzI2LDcgQEAKIAkJKnJwY20gPSBOVUxMOwogCXBjbSA9IGt6YWxsb2Moc2l6ZW9mKCpwY20pLCBHRlBfS0VSTkVMKTsKIAlpZiAocGNtID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGFsbG9jYXRlIFBDTVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ2Fubm90IGFsbG9jYXRlIFBDTVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlwY20tPmNhcmQgPSBjYXJkOwpAQCAtODA3LDcgKzgwOSw3IEBACiBzdGF0aWMgdm9pZCBzbmRfcGNtX2ZyZWVfc3RyZWFtKHN0cnVjdCBzbmRfcGNtX3N0ciAqIHBzdHIpCiB7CiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sICpzdWJzdHJlYW1fbmV4dDsKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TUykgfHwgZGVmaW5lZChDT05GSUdfU05EX1BDTV9PU1NfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9QQ01fT1NTKQogCXN0cnVjdCBzbmRfcGNtX29zc19zZXR1cCAqc2V0dXAsICpzZXR1cG47CiAjZW5kaWYKIAlzdWJzdHJlYW0gPSBwc3RyLT5zdWJzdHJlYW07CkBAIC04MTksNyArODIxLDcgQEAKIAkJc3Vic3RyZWFtID0gc3Vic3RyZWFtX25leHQ7CiAJfQogCXNuZF9wY21fc3RyZWFtX3Byb2NfZG9uZShwc3RyKTsKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TUykgfHwgZGVmaW5lZChDT05GSUdfU05EX1BDTV9PU1NfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9QQ01fT1NTKQogCWZvciAoc2V0dXAgPSBwc3RyLT5vc3Muc2V0dXBfbGlzdDsgc2V0dXA7IHNldHVwID0gc2V0dXBuKSB7CiAJCXNldHVwbiA9IHNldHVwLT5uZXh0OwogCQlrZnJlZShzZXR1cC0+dGFza19uYW1lKTsKQEAgLTEwMTYsOCArMTAxOCwyMCBAQAogICAgICAgICByZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgc3RyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHBjbV9hdHRycyA9Ci0JX19BVFRSKHBjbV9jbGFzcywgU19JUlVHTywgc2hvd19wY21fY2xhc3MsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHBjbV9jbGFzcywgU19JUlVHTywgc2hvd19wY21fY2xhc3MsIE5VTEwpOworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnBjbV9kZXZfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfcGNtX2NsYXNzLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgcGNtX2Rldl9hdHRyX2dyb3VwID0geworCS5hdHRycwk9IHBjbV9kZXZfYXR0cnMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqcGNtX2Rldl9hdHRyX2dyb3Vwc1tdID0geworCSZwY21fZGV2X2F0dHJfZ3JvdXAsCisJTlVMTAorfTsKIAogc3RhdGljIGludCBzbmRfcGNtX2Rldl9yZWdpc3RlcihzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQogewpAQCAtMTA2Nyw4ICsxMDgxLDE4IEBACiAJCQltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAkJCXJldHVybiBlcnI7CiAJCX0KLQkJc25kX2FkZF9kZXZpY2Vfc3lzZnNfZmlsZShkZXZ0eXBlLCBwY20tPmNhcmQsIHBjbS0+ZGV2aWNlLAotCQkJCQkgICZwY21fYXR0cnMpOworCisJCWRldiA9IHNuZF9nZXRfZGV2aWNlKGRldnR5cGUsIHBjbS0+Y2FyZCwgcGNtLT5kZXZpY2UpOworCQlpZiAoZGV2KSB7CisJCQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXBzKCZkZXYtPmtvYmosCisJCQkJCQkgIHBjbV9kZXZfYXR0cl9ncm91cHMpOworCQkJaWYgKGVyciA8IDApCisJCQkJZGV2X3dhcm4oZGV2LAorCQkJCQkgInBjbSAlZDolZDogY2Fubm90IGNyZWF0ZSBzeXNmcyBncm91cHNcbiIsCisJCQkJCSBwY20tPmNhcmQtPm51bWJlciwgcGNtLT5kZXZpY2UpOworCQkJcHV0X2RldmljZShkZXYpOworCQl9CisKIAkJZm9yIChzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbY2lkeF0uc3Vic3RyZWFtOyBzdWJzdHJlYW07IHN1YnN0cmVhbSA9IHN1YnN0cmVhbS0+bmV4dCkKIAkJCXNuZF9wY21fdGltZXJfaW5pdChzdWJzdHJlYW0pOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX2xpYi5jIGIvc291bmQvY29yZS9wY21fbGliLmMKaW5kZXggYTIxMDQ2Ny4uY2U4M2RlZiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY21fbGliLmMKKysrIGIvc291bmQvY29yZS9wY21fbGliLmMKQEAgLTE3NCw3ICsxNzQsNyBAQAogCWlmICh4cnVuX2RlYnVnKHN1YnN0cmVhbSwgWFJVTl9ERUJVR19CQVNJQykpIHsKIAkJY2hhciBuYW1lWzE2XTsKIAkJc25kX3BjbV9kZWJ1Z19uYW1lKHN1YnN0cmVhbSwgbmFtZSwgc2l6ZW9mKG5hbWUpKTsKLQkJc25kX3ByaW50ZChLRVJOX0RFQlVHICJYUlVOOiAlc1xuIiwgbmFtZSk7CisJCXBjbV93YXJuKHN1YnN0cmVhbS0+cGNtLCAiWFJVTjogJXNcbiIsIG5hbWUpOwogCQlkdW1wX3N0YWNrX29uX3hydW4oc3Vic3RyZWFtKTsKIAl9CiB9CkBAIC0xODQsOSArMTg0LDcgQEAKIAlkbyB7CQkJCQkJCQlcCiAJCWlmICh4cnVuX2RlYnVnKHN1YnN0cmVhbSwgWFJVTl9ERUJVR19CQVNJQykpIHsJCVwKIAkJCXhydW5fbG9nX3Nob3coc3Vic3RyZWFtKTsJCQlcCi0JCQlpZiAoc25kX3ByaW50ZF9yYXRlbGltaXQoKSkgewkJCVwKLQkJCQlzbmRfcHJpbnRkKCJQQ006ICIgZm10LCAjI2FyZ3MpOwlcCi0JCQl9CQkJCQkJXAorCQkJcHJfZXJyX3JhdGVsaW1pdGVkKCJBTFNBOiBQQ006ICIgZm10LCAjI2FyZ3MpOwlcCiAJCQlkdW1wX3N0YWNrX29uX3hydW4oc3Vic3RyZWFtKTsJCQlcCiAJCX0JCQkJCQkJXAogCX0gd2hpbGUgKDApCkBAIC0yNTMsNyArMjUxLDcgQEAKIAkJZW50cnkgPSAmbG9nLT5lbnRyaWVzW2lkeF07CiAJCWlmIChlbnRyeS0+cGVyaW9kX3NpemUgPT0gMCkKIAkJCWJyZWFrOwotCQlzbmRfcHJpbnRkKCJod3B0ciBsb2c6ICVzOiAlc2o9JWx1LCBwb3M9JWxkLyVsZC8lbGQsICIKKwkJcHJfaW5mbygiaHdwdHIgbG9nOiAlczogJXNqPSVsdSwgcG9zPSVsZC8lbGQvJWxkLCAiCiAJCQkgICAiaHdwdHI9JWxkLyVsZFxuIiwKIAkJCSAgIG5hbWUsIGVudHJ5LT5pbl9pbnRlcnJ1cHQgPyAiW1FdICIgOiAiIiwKIAkJCSAgIGVudHJ5LT5qaWZmaWVzLApAQCAtMzQyLDE0ICszNDAsMTQgQEAKIAkJcmV0dXJuIC1FUElQRTsKIAl9CiAJaWYgKHBvcyA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkgewotCQlpZiAoc25kX3ByaW50ZF9yYXRlbGltaXQoKSkgeworCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKSB7CiAJCQljaGFyIG5hbWVbMTZdOwogCQkJc25kX3BjbV9kZWJ1Z19uYW1lKHN1YnN0cmVhbSwgbmFtZSwgc2l6ZW9mKG5hbWUpKTsKIAkJCXhydW5fbG9nX3Nob3coc3Vic3RyZWFtKTsKLQkJCXNuZF9wcmludGQoS0VSTl9FUlIgICJCVUc6ICVzLCBwb3MgPSAlbGQsICIKLQkJCQkgICAiYnVmZmVyIHNpemUgPSAlbGQsIHBlcmlvZCBzaXplID0gJWxkXG4iLAotCQkJCSAgIG5hbWUsIHBvcywgcnVudGltZS0+YnVmZmVyX3NpemUsCi0JCQkJICAgcnVudGltZS0+cGVyaW9kX3NpemUpOworCQkJcGNtX2VycihzdWJzdHJlYW0tPnBjbSwKKwkJCQkiQlVHOiAlcywgcG9zID0gJWxkLCBidWZmZXIgc2l6ZSA9ICVsZCwgcGVyaW9kIHNpemUgPSAlbGRcbiIsCisJCQkJbmFtZSwgcG9zLCBydW50aW1lLT5idWZmZXJfc2l6ZSwKKwkJCQlydW50aW1lLT5wZXJpb2Rfc2l6ZSk7CiAJCX0KIAkJcG9zID0gMDsKIAl9CkBAIC0zOTQsOCArMzkyLDggQEAKIAkJCVhSVU5fREVCVUdfUEVSSU9EVVBEQVRFIDogWFJVTl9ERUJVR19IV1BUUlVQREFURSkpIHsKIAkJY2hhciBuYW1lWzE2XTsKIAkJc25kX3BjbV9kZWJ1Z19uYW1lKHN1YnN0cmVhbSwgbmFtZSwgc2l6ZW9mKG5hbWUpKTsKLQkJc25kX3ByaW50ZCgiJXNfdXBkYXRlOiAlczogcG9zPSV1LyV1LyV1LCAiCi0JCQkgICAiaHdwdHI9JWxkLyVsZC8lbGQvJWxkXG4iLAorCQlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLAorCQkJIiVzX3VwZGF0ZTogJXM6IHBvcz0ldS8ldS8ldSwgaHdwdHI9JWxkLyVsZC8lbGQvJWxkXG4iLAogCQkJICAgaW5faW50ZXJydXB0ID8gInBlcmlvZCIgOiAiaHdwdHIiLAogCQkJICAgbmFtZSwKIAkJCSAgICh1bnNpZ25lZCBpbnQpcG9zLApAQCAtMTI0Miw2ICsxMjQwLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHNuZF9wY21faHdfY29uc3RyYWludF9tYXNrNjQpOwogCiAvKioKICAqIHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyIC0gYXBwbHkgYW4gaW50ZWdlciBjb25zdHJhaW50IHRvIGFuIGludGVydmFsCkBAIC0xOTQxLDggKzE5NDAsOSBAQAogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKCF0b3V0KSB7Ci0JCQlzbmRfcHJpbnRkKCIlcyB3cml0ZSBlcnJvciAoRE1BIG9yIElSUSB0cm91YmxlPylcbiIsCi0JCQkJICAgaXNfcGxheWJhY2sgPyAicGxheWJhY2siIDogImNhcHR1cmUiKTsKKwkJCXBjbV9kYmcoc3Vic3RyZWFtLT5wY20sCisJCQkJIiVzIHdyaXRlIGVycm9yIChETUEgb3IgSVJRIHRyb3VibGU/KVxuIiwKKwkJCQlpc19wbGF5YmFjayA/ICJwbGF5YmFjayIgOiAiY2FwdHVyZSIpOwogCQkJZXJyID0gLUVJTzsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYyBiL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCmluZGV4IDAxYTVlMDUuLmI2NTNhYjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCisrKyBiL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCkBAIC0xOTAsMTIgKzE5MCwxMiBAQAogCQlpZiAoIShwYXJhbXMtPnJtYXNrICYgKDEgPDwgaykpKQogCQkJY29udGludWU7CiAjaWZkZWYgUlVMRVNfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzID0gIiwgc25kX3BjbV9od19wYXJhbV9uYW1lc1trXSk7Ci0JCXByaW50aygiJTA0eCUwNHglMDR4JTA0eCAtPiAiLCBtLT5iaXRzWzNdLCBtLT5iaXRzWzJdLCBtLT5iaXRzWzFdLCBtLT5iaXRzWzBdKTsKKwkJcHJfZGVidWcoIiVzID0gIiwgc25kX3BjbV9od19wYXJhbV9uYW1lc1trXSk7CisJCXByX2NvbnQoIiUwNHglMDR4JTA0eCUwNHggLT4gIiwgbS0+Yml0c1szXSwgbS0+Yml0c1syXSwgbS0+Yml0c1sxXSwgbS0+Yml0c1swXSk7CiAjZW5kaWYKIAkJY2hhbmdlZCA9IHNuZF9tYXNrX3JlZmluZShtLCBjb25zdHJzX21hc2soY29uc3RycywgaykpOwogI2lmZGVmIFJVTEVTX0RFQlVHCi0JCXByaW50aygiJTA0eCUwNHglMDR4JTA0eFxuIiwgbS0+Yml0c1szXSwgbS0+Yml0c1syXSwgbS0+Yml0c1sxXSwgbS0+Yml0c1swXSk7CisJCXByX2NvbnQoIiUwNHglMDR4JTA0eCUwNHhcbiIsIG0tPmJpdHNbM10sIG0tPmJpdHNbMl0sIG0tPmJpdHNbMV0sIG0tPmJpdHNbMF0pOwogI2VuZGlmCiAJCWlmIChjaGFuZ2VkKQogCQkJcGFyYW1zLT5jbWFzayB8PSAxIDw8IGs7CkBAIC0yMTAsMjEgKzIxMCwyMSBAQAogCQlpZiAoIShwYXJhbXMtPnJtYXNrICYgKDEgPDwgaykpKQogCQkJY29udGludWU7CiAjaWZkZWYgUlVMRVNfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzID0gIiwgc25kX3BjbV9od19wYXJhbV9uYW1lc1trXSk7CisJCXByX2RlYnVnKCIlcyA9ICIsIHNuZF9wY21faHdfcGFyYW1fbmFtZXNba10pOwogCQlpZiAoaS0+ZW1wdHkpCi0JCQlwcmludGsoImVtcHR5Iik7CisJCQlwcl9jb250KCJlbXB0eSIpOwogCQllbHNlCi0JCQlwcmludGsoIiVjJXUgJXUlYyIsIAorCQkJcHJfY29udCgiJWMldSAldSVjIiwKIAkJCSAgICAgICBpLT5vcGVubWluID8gJygnIDogJ1snLCBpLT5taW4sCiAJCQkgICAgICAgaS0+bWF4LCBpLT5vcGVubWF4ID8gJyknIDogJ10nKTsKLQkJcHJpbnRrKCIgLT4gIik7CisJCXByX2NvbnQoIiAtPiAiKTsKICNlbmRpZgogCQljaGFuZ2VkID0gc25kX2ludGVydmFsX3JlZmluZShpLCBjb25zdHJzX2ludGVydmFsKGNvbnN0cnMsIGspKTsKICNpZmRlZiBSVUxFU19ERUJVRwogCQlpZiAoaS0+ZW1wdHkpCi0JCQlwcmludGsoImVtcHR5XG4iKTsKKwkJCXByX2NvbnQoImVtcHR5XG4iKTsKIAkJZWxzZSAKLQkJCXByaW50aygiJWMldSAldSVjXG4iLCAKKwkJCXByX2NvbnQoIiVjJXUgJXUlY1xuIiwKIAkJCSAgICAgICBpLT5vcGVubWluID8gJygnIDogJ1snLCBpLT5taW4sCiAJCQkgICAgICAgaS0+bWF4LCBpLT5vcGVubWF4ID8gJyknIDogJ10nKTsKICNlbmRpZgpAQCAtMjU1LDE4ICsyNTUsMTggQEAKIAkJCWlmICghZG9pdCkKIAkJCQljb250aW51ZTsKICNpZmRlZiBSVUxFU19ERUJVRwotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlJ1bGUgJWQgWyVwXTogIiwgaywgci0+ZnVuYyk7CisJCQlwcl9kZWJ1ZygiUnVsZSAlZCBbJXBdOiAiLCBrLCByLT5mdW5jKTsKIAkJCWlmIChyLT52YXIgPj0gMCkgewotCQkJCXByaW50aygiJXMgPSAiLCBzbmRfcGNtX2h3X3BhcmFtX25hbWVzW3ItPnZhcl0pOworCQkJCXByX2NvbnQoIiVzID0gIiwgc25kX3BjbV9od19wYXJhbV9uYW1lc1tyLT52YXJdKTsKIAkJCQlpZiAoaHdfaXNfbWFzayhyLT52YXIpKSB7CiAJCQkJCW0gPSBod19wYXJhbV9tYXNrKHBhcmFtcywgci0+dmFyKTsKLQkJCQkJcHJpbnRrKCIleCIsICptLT5iaXRzKTsKKwkJCQkJcHJfY29udCgiJXgiLCAqbS0+Yml0cyk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJaSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgci0+dmFyKTsKIAkJCQkJaWYgKGktPmVtcHR5KQotCQkJCQkJcHJpbnRrKCJlbXB0eSIpOworCQkJCQkJcHJfY29udCgiZW1wdHkiKTsKIAkJCQkJZWxzZQotCQkJCQkJcHJpbnRrKCIlYyV1ICV1JWMiLCAKKwkJCQkJCXByX2NvbnQoIiVjJXUgJXUlYyIsCiAJCQkJCQkgICAgICAgaS0+b3Blbm1pbiA/ICcoJyA6ICdbJywgaS0+bWluLAogCQkJCQkJICAgICAgIGktPm1heCwgaS0+b3Blbm1heCA/ICcpJyA6ICddJyk7CiAJCQkJfQpAQCAtMjc1LDE5ICsyNzUsMTkgQEAKIAkJCWNoYW5nZWQgPSByLT5mdW5jKHBhcmFtcywgcik7CiAjaWZkZWYgUlVMRVNfREVCVUcKIAkJCWlmIChyLT52YXIgPj0gMCkgewotCQkJCXByaW50aygiIC0+ICIpOworCQkJCXByX2NvbnQoIiAtPiAiKTsKIAkJCQlpZiAoaHdfaXNfbWFzayhyLT52YXIpKQotCQkJCQlwcmludGsoIiV4IiwgKm0tPmJpdHMpOworCQkJCQlwcl9jb250KCIleCIsICptLT5iaXRzKTsKIAkJCQllbHNlIHsKIAkJCQkJaWYgKGktPmVtcHR5KQotCQkJCQkJcHJpbnRrKCJlbXB0eSIpOworCQkJCQkJcHJfY29udCgiZW1wdHkiKTsKIAkJCQkJZWxzZQotCQkJCQkJcHJpbnRrKCIlYyV1ICV1JWMiLCAKKwkJCQkJCXByX2NvbnQoIiVjJXUgJXUlYyIsCiAJCQkJCQkgICAgICAgaS0+b3Blbm1pbiA/ICcoJyA6ICdbJywgaS0+bWluLAogCQkJCQkJICAgICAgIGktPm1heCwgaS0+b3Blbm1heCA/ICcpJyA6ICddJyk7CiAJCQkJfQogCQkJfQotCQkJcHJpbnRrKCJcbiIpOworCQkJcHJfY29udCgiXG4iKTsKICNlbmRpZgogCQkJcnN0YW1wc1trXSA9IHN0YW1wOwogCQkJaWYgKGNoYW5nZWQgJiYgci0+dmFyID49IDApIHsKQEAgLTM5OSw3ICszOTksNyBAQAogCQlyZXR1cm4gLUVCQURGRDsKIAl9CiAJc25kX3BjbV9zdHJlYW1fdW5sb2NrX2lycShzdWJzdHJlYW0pOwotI2lmIGRlZmluZWQoQ09ORklHX1NORF9QQ01fT1NTKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfU05EX1BDTV9PU1MpCiAJaWYgKCFzdWJzdHJlYW0tPm9zcy5vc3MpCiAjZW5kaWYKIAkJaWYgKGF0b21pY19yZWFkKCZzdWJzdHJlYW0tPm1tYXBfY291bnQpKQpAQCAtOTU0LDcgKzk1NCw3IEBACiAgKgogICogVGhlIHN0YXRlIG9mIGVhY2ggc3RyZWFtIGlzIHRoZW4gY2hhbmdlZCB0byB0aGUgZ2l2ZW4gc3RhdGUgdW5jb25kaXRpb25hbGx5LgogICoKLSAqIFJldHVybjogWmVybyBpZiBzdWNjZXNmdWwsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqIFJldHVybjogWmVybyBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCiAgKi8KIGludCBzbmRfcGNtX3N0b3Aoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIHNuZF9wY21fc3RhdGVfdCBzdGF0ZSkKIHsKQEAgLTE1NDEsNyArMTU0MSw4IEBACiAJCQlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9TVVNQRU5ERUQpCiAJCQkJcmVzdWx0ID0gLUVTVFJQSVBFOwogCQkJZWxzZSB7Ci0JCQkJc25kX3ByaW50ZCgicGxheWJhY2sgZHJhaW4gZXJyb3IgKERNQSBvciBJUlEgdHJvdWJsZT8pXG4iKTsKKwkJCQlkZXZfZGJnKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsCisJCQkJCSJwbGF5YmFjayBkcmFpbiBlcnJvciAoRE1BIG9yIElSUSB0cm91YmxlPylcbiIpOwogCQkJCXNuZF9wY21fc3RvcChzdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9TRVRVUCk7CiAJCQkJcmVzdWx0ID0gLUVJTzsKIAkJCX0KQEAgLTIwNjYsNyArMjA2Nyw3IEBACiAKIAllcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRzX2luaXQoc3Vic3RyZWFtKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRkKCJzbmRfcGNtX2h3X2NvbnN0cmFpbnRzX2luaXQgZmFpbGVkXG4iKTsKKwkJcGNtX2RiZyhwY20sICJzbmRfcGNtX2h3X2NvbnN0cmFpbnRzX2luaXQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKQEAgLTIwNzcsNyArMjA3OCw3IEBACiAKIAllcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRzX2NvbXBsZXRlKHN1YnN0cmVhbSk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ZCgic25kX3BjbV9od19jb25zdHJhaW50c19jb21wbGV0ZSBmYWlsZWRcbiIpOworCQlwY21fZGJnKHBjbSwgInNuZF9wY21faHdfY29uc3RyYWludHNfY29tcGxldGUgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKQEAgLTI2MDksNyArMjYxMCw3IEBACiAJCXJldHVybiByZXM7CiAJfQogCX0KLQlzbmRfcHJpbnRkKCJ1bmtub3duIGlvY3RsID0gMHgleFxuIiwgY21kKTsKKwlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLCAidW5rbm93biBpb2N0bCA9IDB4JXhcbiIsIGNtZCk7CiAJcmV0dXJuIC1FTk9UVFk7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX3RpbWVyLmMgYi9zb3VuZC9jb3JlL3BjbV90aW1lci5jCmluZGV4IGIwMWQ5NDguLjIwZWNkOGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtX3RpbWVyLmMKKysrIGIvc291bmQvY29yZS9wY21fdGltZXIuYwpAQCAtNTMsNyArNTMsOSBAQAogCQlwb3N0ICo9IDI7CiAJfQogCWlmIChyYXRlID09IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAicGNtIHRpbWVyIHJlc29sdXRpb24gb3V0IG9mIHJhbmdlIChyYXRlID0gJXUsIHBlcmlvZF9zaXplID0gJWx1KVxuIiwgcnVudGltZS0+cmF0ZSwgcnVudGltZS0+cGVyaW9kX3NpemUpOworCQlwY21fZXJyKHN1YnN0cmVhbS0+cGNtLAorCQkJInBjbSB0aW1lciByZXNvbHV0aW9uIG91dCBvZiByYW5nZSAocmF0ZSA9ICV1LCBwZXJpb2Rfc2l6ZSA9ICVsdSlcbiIsCisJCQlydW50aW1lLT5yYXRlLCBydW50aW1lLT5wZXJpb2Rfc2l6ZSk7CiAJCXJ1bnRpbWUtPnRpbWVyX3Jlc29sdXRpb24gPSAtMTsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcmF3bWlkaS5jIGIvc291bmQvY29yZS9yYXdtaWRpLmMKaW5kZXggN2I1OTZiNS4uNmZjNzFhNCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9yYXdtaWRpLmMKKysrIGIvc291bmQvY29yZS9yYXdtaWRpLmMKQEAgLTU2LDYgKzU2LDEzIEBACiBzdGF0aWMgTElTVF9IRUFEKHNuZF9yYXdtaWRpX2RldmljZXMpOwogc3RhdGljIERFRklORV9NVVRFWChyZWdpc3Rlcl9tdXRleCk7CiAKKyNkZWZpbmUgcm1pZGlfZXJyKHJtaWRpLCBmbXQsIGFyZ3MuLi4pIFwKKwlkZXZfZXJyKChybWlkaSktPmNhcmQtPmRldiwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIHJtaWRpX3dhcm4ocm1pZGksIGZtdCwgYXJncy4uLikgXAorCWRldl93YXJuKChybWlkaSktPmNhcmQtPmRldiwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIHJtaWRpX2RiZyhybWlkaSwgZm10LCBhcmdzLi4uKSBcCisJZGV2X2RiZygocm1pZGkpLT5jYXJkLT5kZXYsIGZtdCwgIyNhcmdzKQorCiBzdGF0aWMgc3RydWN0IHNuZF9yYXdtaWRpICpzbmRfcmF3bWlkaV9zZWFyY2goc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2aWNlKQogewogCXN0cnVjdCBzbmRfcmF3bWlkaSAqcmF3bWlkaTsKQEAgLTE2NSw2ICsxNzIsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ1bnRpbWUtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfZHJvcF9vdXRwdXQpOwogCiBpbnQgc25kX3Jhd21pZGlfZHJhaW5fb3V0cHV0KHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKQEAgLTE4MCw3ICsxODgsOSBAQAogCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJZXJyID0gLUVSRVNUQVJUU1lTOwogCWlmIChydW50aW1lLT5hdmFpbCA8IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplICYmICF0aW1lb3V0KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJyYXdtaWRpIGRyYWluIGVycm9yIChhdmFpbCA9ICVsaSwgYnVmZmVyX3NpemUgPSAlbGkpXG4iLCAobG9uZylydW50aW1lLT5hdmFpbCwgKGxvbmcpcnVudGltZS0+YnVmZmVyX3NpemUpOworCQlybWlkaV93YXJuKHN1YnN0cmVhbS0+cm1pZGksCisJCQkgICAicmF3bWlkaSBkcmFpbiBlcnJvciAoYXZhaWwgPSAlbGksIGJ1ZmZlcl9zaXplID0gJWxpKVxuIiwKKwkJCSAgIChsb25nKXJ1bnRpbWUtPmF2YWlsLCAobG9uZylydW50aW1lLT5idWZmZXJfc2l6ZSk7CiAJCWVyciA9IC1FSU87CiAJfQogCXJ1bnRpbWUtPmRyYWluID0gMDsKQEAgLTE5NCw2ICsyMDQsNyBAQAogCX0KIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9kcmFpbl9vdXRwdXQpOwogCiBpbnQgc25kX3Jhd21pZGlfZHJhaW5faW5wdXQoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewpAQCAtMjA4LDYgKzIxOSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnVudGltZS0+bG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9kcmFpbl9pbnB1dCk7CiAKIC8qIGxvb2sgZm9yIGFuIGF2YWlsYWJsZSBzdWJzdHJlYW0gZm9yIHRoZSBnaXZlbiBzdHJlYW0gZGlyZWN0aW9uOwogICogaWYgYSBzcGVjaWZpYyBzdWJkZXZpY2UgaXMgZ2l2ZW4sIHRyeSB0byBhc3NpZ24gaXQKQEAgLTM0NSw2ICszNTcsNyBAQAogCQltb2R1bGVfcHV0KHJtaWRpLT5jYXJkLT5tb2R1bGUpOwogCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX2tlcm5lbF9vcGVuKTsKIAogc3RhdGljIGludCBzbmRfcmF3bWlkaV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewpAQCAtNTIzLDYgKzUzNiw3IEBACiAJbW9kdWxlX3B1dChybWlkaS0+Y2FyZC0+bW9kdWxlKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfa2VybmVsX3JlbGVhc2UpOwogCiBzdGF0aWMgaW50IHNuZF9yYXdtaWRpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CkBAIC01OTksNiArNjEzLDcgQEAKIAl9CiAJcmV0dXJuIC1FTlhJTzsKIH0KK0VYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfaW5mb19zZWxlY3QpOwogCiBzdGF0aWMgaW50IHNuZF9yYXdtaWRpX2luZm9fc2VsZWN0X3VzZXIoc3RydWN0IHNuZF9jYXJkICpjYXJkLAogCQkJCQlzdHJ1Y3Qgc25kX3Jhd21pZGlfaW5mbyBfX3VzZXIgKl9pbmZvKQpAQCAtNjQ2LDYgKzY2MSw3IEBACiAJc3Vic3RyZWFtLT5hY3RpdmVfc2Vuc2luZyA9ICFwYXJhbXMtPm5vX2FjdGl2ZV9zZW5zaW5nOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9vdXRwdXRfcGFyYW1zKTsKIAogaW50IHNuZF9yYXdtaWRpX2lucHV0X3BhcmFtcyhzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgIHN0cnVjdCBzbmRfcmF3bWlkaV9wYXJhbXMgKiBwYXJhbXMpCkBAIC02NzEsNiArNjg3LDcgQEAKIAlydW50aW1lLT5hdmFpbF9taW4gPSBwYXJhbXMtPmF2YWlsX21pbjsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfaW5wdXRfcGFyYW1zKTsKIAogc3RhdGljIGludCBzbmRfcmF3bWlkaV9vdXRwdXRfc3RhdHVzKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCQkgICAgIHN0cnVjdCBzbmRfcmF3bWlkaV9zdGF0dXMgKiBzdGF0dXMpCkBAIC04MDIsMTAgKzgxOSw5IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KLSNpZmRlZiBDT05GSUdfU05EX0RFQlVHCiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgInJhd21pZGk6IHVua25vd24gY29tbWFuZCA9IDB4JXhcbiIsIGNtZCk7Ci0jZW5kaWYKKwkJcm1pZGlfZGJnKHJmaWxlLT5ybWlkaSwKKwkJCSAgInJhd21pZGk6IHVua25vd24gY29tbWFuZCA9IDB4JXhcbiIsIGNtZCk7CiAJfQogCXJldHVybiAtRU5PVFRZOwogfQpAQCAtODc1LDcgKzg5MSw4IEBACiAJaWYgKCFzdWJzdHJlYW0tPm9wZW5lZCkKIAkJcmV0dXJuIC1FQkFERkQ7CiAJaWYgKHJ1bnRpbWUtPmJ1ZmZlciA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGQoInNuZF9yYXdtaWRpX3JlY2VpdmU6IGlucHV0IGlzIG5vdCBhY3RpdmUhISFcbiIpOworCQlybWlkaV9kYmcoc3Vic3RyZWFtLT5ybWlkaSwKKwkJCSAgInNuZF9yYXdtaWRpX3JlY2VpdmU6IGlucHV0IGlzIG5vdCBhY3RpdmUhISFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ1bnRpbWUtPmxvY2ssIGZsYWdzKTsKQEAgLTkyNiw2ICs5NDMsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ1bnRpbWUtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcmVzdWx0OwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9yZWNlaXZlKTsKIAogc3RhdGljIGxvbmcgc25kX3Jhd21pZGlfa2VybmVsX3JlYWQxKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCQkgICAgIHVuc2lnbmVkIGNoYXIgX191c2VyICp1c2VyYnVmLApAQCAtOTY4LDYgKzk4Niw3IEBACiAJc25kX3Jhd21pZGlfaW5wdXRfdHJpZ2dlcihzdWJzdHJlYW0sIDEpOwogCXJldHVybiBzbmRfcmF3bWlkaV9rZXJuZWxfcmVhZDEoc3Vic3RyZWFtLCBOVUxMLyp1c2VyYnVmKi8sIGJ1ZiwgY291bnQpOwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9rZXJuZWxfcmVhZCk7CiAKIHN0YXRpYyBzc2l6ZV90IHNuZF9yYXdtaWRpX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKIAkJCQlsb2ZmX3QgKm9mZnNldCkKQEAgLTEwMzQsNyArMTA1Myw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChydW50aW1lLT5idWZmZXIgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJzbmRfcmF3bWlkaV90cmFuc21pdF9lbXB0eTogb3V0cHV0IGlzIG5vdCBhY3RpdmUhISFcbiIpOworCQlybWlkaV9kYmcoc3Vic3RyZWFtLT5ybWlkaSwKKwkJCSAgInNuZF9yYXdtaWRpX3RyYW5zbWl0X2VtcHR5OiBvdXRwdXQgaXMgbm90IGFjdGl2ZSEhIVxuIik7CiAJCXJldHVybiAxOwogCX0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcnVudGltZS0+bG9jaywgZmxhZ3MpOwpAQCAtMTA0Miw2ICsxMDYyLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydW50aW1lLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJlc3VsdDsJCQogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV90cmFuc21pdF9lbXB0eSk7CiAKIC8qKgogICogc25kX3Jhd21pZGlfdHJhbnNtaXRfcGVlayAtIGNvcHkgZGF0YSBmcm9tIHRoZSBpbnRlcm5hbCBidWZmZXIKQEAgLTEwNjUsNyArMTA4Niw4IEBACiAJc3RydWN0IHNuZF9yYXdtaWRpX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAKIAlpZiAocnVudGltZS0+YnVmZmVyID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgic25kX3Jhd21pZGlfdHJhbnNtaXRfcGVlazogb3V0cHV0IGlzIG5vdCBhY3RpdmUhISFcbiIpOworCQlybWlkaV9kYmcoc3Vic3RyZWFtLT5ybWlkaSwKKwkJCSAgInNuZF9yYXdtaWRpX3RyYW5zbWl0X3BlZWs6IG91dHB1dCBpcyBub3QgYWN0aXZlISEhXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJlc3VsdCA9IDA7CkBAIC0xMDk3LDExICsxMTE5LDEyIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnVudGltZS0+bG9jaywgZmxhZ3MpOwogCXJldHVybiByZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX3RyYW5zbWl0X3BlZWspOwogCiAvKioKICAqIHNuZF9yYXdtaWRpX3RyYW5zbWl0X2FjayAtIGFja25vd2xlZGdlIHRoZSB0cmFuc21pc3Npb24KICAqIEBzdWJzdHJlYW06IHRoZSByYXdtaWRpIHN1YnN0cmVhbQotICogQGNvdW50OiB0aGUgdHJhbmZlcnJlZCBjb3VudAorICogQGNvdW50OiB0aGUgdHJhbnNmZXJyZWQgY291bnQKICAqCiAgKiBBZHZhbmNlcyB0aGUgaGFyZHdhcmUgcG9pbnRlciBmb3IgdGhlIGludGVybmFsIG91dHB1dCBidWZmZXIgd2l0aAogICogdGhlIGdpdmVuIHNpemUgYW5kIHVwZGF0ZXMgdGhlIGNvbmRpdGlvbi4KQEAgLTExMTUsNyArMTEzOCw4IEBACiAJc3RydWN0IHNuZF9yYXdtaWRpX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAKIAlpZiAocnVudGltZS0+YnVmZmVyID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgic25kX3Jhd21pZGlfdHJhbnNtaXRfYWNrOiBvdXRwdXQgaXMgbm90IGFjdGl2ZSEhIVxuIik7CisJCXJtaWRpX2RiZyhzdWJzdHJlYW0tPnJtaWRpLAorCQkJICAic25kX3Jhd21pZGlfdHJhbnNtaXRfYWNrOiBvdXRwdXQgaXMgbm90IGFjdGl2ZSEhIVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcnVudGltZS0+bG9jaywgZmxhZ3MpOwpAQCAtMTEzMSw2ICsxMTU1LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydW50aW1lLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGNvdW50OwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV90cmFuc21pdF9hY2spOwogCiAvKioKICAqIHNuZF9yYXdtaWRpX3RyYW5zbWl0IC0gY29weSBmcm9tIHRoZSBidWZmZXIgdG8gdGhlIGRldmljZQpAQCAtMTE1Miw2ICsxMTc3LDcgQEAKIAkJcmV0dXJuIGNvdW50OwogCXJldHVybiBzbmRfcmF3bWlkaV90cmFuc21pdF9hY2soc3Vic3RyZWFtLCBjb3VudCk7CiB9CitFWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX3RyYW5zbWl0KTsKIAogc3RhdGljIGxvbmcgc25kX3Jhd21pZGlfa2VybmVsX3dyaXRlMShzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBfX3VzZXIgKnVzZXJidWYsCkBAIC0xMjEzLDYgKzEyMzksNyBAQAogewogCXJldHVybiBzbmRfcmF3bWlkaV9rZXJuZWxfd3JpdGUxKHN1YnN0cmVhbSwgTlVMTCwgYnVmLCBjb3VudCk7CiB9CitFWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX2tlcm5lbF93cml0ZSk7CiAKIHN0YXRpYyBzc2l6ZV90IHNuZF9yYXdtaWRpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqb2Zmc2V0KQpAQCAtMTQxMyw3ICsxNDQwLDcgQEAKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IGNvdW50OyBpZHgrKykgewogCQlzdWJzdHJlYW0gPSBremFsbG9jKHNpemVvZigqc3Vic3RyZWFtKSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChzdWJzdHJlYW0gPT0gTlVMTCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAicmF3bWlkaTogY2Fubm90IGFsbG9jYXRlIHN1YnN0cmVhbVxuIik7CisJCQlybWlkaV9lcnIocm1pZGksICJyYXdtaWRpOiBjYW5ub3QgYWxsb2NhdGUgc3Vic3RyZWFtXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCXN1YnN0cmVhbS0+c3RyZWFtID0gZGlyZWN0aW9uOwpAQCAtMTQ1OCw3ICsxNDg1LDcgQEAKIAkJKnJyYXdtaWRpID0gTlVMTDsKIAlybWlkaSA9IGt6YWxsb2Moc2l6ZW9mKCpybWlkaSksIEdGUF9LRVJORUwpOwogCWlmIChybWlkaSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInJhd21pZGk6IGNhbm5vdCBhbGxvY2F0ZVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAicmF3bWlkaTogY2Fubm90IGFsbG9jYXRlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXJtaWRpLT5jYXJkID0gY2FyZDsKQEAgLTE0OTIsNiArMTUxOSw3IEBACiAJCSpycmF3bWlkaSA9IHJtaWRpOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9uZXcpOwogCiBzdGF0aWMgdm9pZCBzbmRfcmF3bWlkaV9mcmVlX3N1YnN0cmVhbXMoc3RydWN0IHNuZF9yYXdtaWRpX3N0ciAqc3RyZWFtKQogewpAQCAtMTU1Nyw3ICsxNTg1LDggQEAKIAlpZiAoKGVyciA9IHNuZF9yZWdpc3Rlcl9kZXZpY2UoU05EUlZfREVWSUNFX1RZUEVfUkFXTUlESSwKIAkJCQkgICAgICAgcm1pZGktPmNhcmQsIHJtaWRpLT5kZXZpY2UsCiAJCQkJICAgICAgICZzbmRfcmF3bWlkaV9mX29wcywgcm1pZGksIG5hbWUpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIHJhd21pZGkgZGV2aWNlICVpOiVpXG4iLCBybWlkaS0+Y2FyZC0+bnVtYmVyLCBybWlkaS0+ZGV2aWNlKTsKKwkJcm1pZGlfZXJyKHJtaWRpLCAidW5hYmxlIHRvIHJlZ2lzdGVyIHJhd21pZGkgZGV2aWNlICVpOiVpXG4iLAorCQkJICBybWlkaS0+Y2FyZC0+bnVtYmVyLCBybWlkaS0+ZGV2aWNlKTsKIAkJbGlzdF9kZWwoJnJtaWRpLT5saXN0KTsKIAkJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJCXJldHVybiBlcnI7CkBAIC0xNTc0LDggKzE2MDMsMTAgQEAKIAlpZiAoKGludClybWlkaS0+ZGV2aWNlID09IG1pZGlfbWFwW3JtaWRpLT5jYXJkLT5udW1iZXJdKSB7CiAJCWlmIChzbmRfcmVnaXN0ZXJfb3NzX2RldmljZShTTkRSVl9PU1NfREVWSUNFX1RZUEVfTUlESSwKIAkJCQkJICAgIHJtaWRpLT5jYXJkLCAwLCAmc25kX3Jhd21pZGlfZl9vcHMsCi0JCQkJCSAgICBybWlkaSwgbmFtZSkgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgT1NTIHJhd21pZGkgZGV2aWNlICVpOiVpXG4iLCBybWlkaS0+Y2FyZC0+bnVtYmVyLCAwKTsKKwkJCQkJICAgIHJtaWRpKSA8IDApIHsKKwkJCXJtaWRpX2VycihybWlkaSwKKwkJCQkgICJ1bmFibGUgdG8gcmVnaXN0ZXIgT1NTIHJhd21pZGkgZGV2aWNlICVpOiVpXG4iLAorCQkJCSAgcm1pZGktPmNhcmQtPm51bWJlciwgMCk7CiAJCX0gZWxzZSB7CiAJCQlybWlkaS0+b3NzcmVnKys7CiAjaWZkZWYgU05EUlZfT1NTX0lORk9fREVWX01JREkKQEAgLTE1ODYsOCArMTYxNywxMCBAQAogCWlmICgoaW50KXJtaWRpLT5kZXZpY2UgPT0gYW1pZGlfbWFwW3JtaWRpLT5jYXJkLT5udW1iZXJdKSB7CiAJCWlmIChzbmRfcmVnaXN0ZXJfb3NzX2RldmljZShTTkRSVl9PU1NfREVWSUNFX1RZUEVfTUlESSwKIAkJCQkJICAgIHJtaWRpLT5jYXJkLCAxLCAmc25kX3Jhd21pZGlfZl9vcHMsCi0JCQkJCSAgICBybWlkaSwgbmFtZSkgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgT1NTIHJhd21pZGkgZGV2aWNlICVpOiVpXG4iLCBybWlkaS0+Y2FyZC0+bnVtYmVyLCAxKTsKKwkJCQkJICAgIHJtaWRpKSA8IDApIHsKKwkJCXJtaWRpX2VycihybWlkaSwKKwkJCQkgICJ1bmFibGUgdG8gcmVnaXN0ZXIgT1NTIHJhd21pZGkgZGV2aWNlICVpOiVpXG4iLAorCQkJCSAgcm1pZGktPmNhcmQtPm51bWJlciwgMSk7CiAJCX0gZWxzZSB7CiAJCQlybWlkaS0+b3NzcmVnKys7CiAJCX0KQEAgLTE2NzAsNiArMTcwMyw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJzdHJlYW0sICZybWlkaS0+c3RyZWFtc1tzdHJlYW1dLnN1YnN0cmVhbXMsIGxpc3QpCiAJCXN1YnN0cmVhbS0+b3BzID0gb3BzOwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9zZXRfb3BzKTsKIAogLyoKICAqICBFTlRSWSBmdW5jdGlvbnMKQEAgLTE2ODUsMTEgKzE3MTksMTMgQEAKIAkvKiBjaGVjayBkZXZpY2UgbWFwIHRhYmxlICovCiAJZm9yIChpID0gMDsgaSA8IFNORFJWX0NBUkRTOyBpKyspIHsKIAkJaWYgKG1pZGlfbWFwW2ldIDwgMCB8fCBtaWRpX21hcFtpXSA+PSBTTkRSVl9SQVdNSURJX0RFVklDRVMpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgbWlkaV9tYXBbJWRdID0gJWRcbiIsIGksIG1pZGlfbWFwW2ldKTsKKwkJCXByX2VycigiQUxTQTogcmF3bWlkaTogaW52YWxpZCBtaWRpX21hcFslZF0gPSAlZFxuIiwKKwkJCSAgICAgICBpLCBtaWRpX21hcFtpXSk7CiAJCQltaWRpX21hcFtpXSA9IDA7CiAJCX0KIAkJaWYgKGFtaWRpX21hcFtpXSA8IDAgfHwgYW1pZGlfbWFwW2ldID49IFNORFJWX1JBV01JRElfREVWSUNFUykgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBhbWlkaV9tYXBbJWRdID0gJWRcbiIsIGksIGFtaWRpX21hcFtpXSk7CisJCQlwcl9lcnIoIkFMU0E6IHJhd21pZGk6IGludmFsaWQgYW1pZGlfbWFwWyVkXSA9ICVkXG4iLAorCQkJICAgICAgIGksIGFtaWRpX21hcFtpXSk7CiAJCQlhbWlkaV9tYXBbaV0gPSAxOwogCQl9CiAJfQpAQCAtMTcwNiwyMSArMTc0MiwzIEBACiAKIG1vZHVsZV9pbml0KGFsc2FfcmF3bWlkaV9pbml0KQogbW9kdWxlX2V4aXQoYWxzYV9yYXdtaWRpX2V4aXQpCi0KLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfb3V0cHV0X3BhcmFtcyk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX2lucHV0X3BhcmFtcyk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX2Ryb3Bfb3V0cHV0KTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfZHJhaW5fb3V0cHV0KTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfZHJhaW5faW5wdXQpOwotRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9yZWNlaXZlKTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfdHJhbnNtaXRfZW1wdHkpOwotRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV90cmFuc21pdF9wZWVrKTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfdHJhbnNtaXRfYWNrKTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfdHJhbnNtaXQpOwotRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9uZXcpOwotRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9zZXRfb3BzKTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfaW5mb19zZWxlY3QpOwotRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9rZXJuZWxfb3Blbik7Ci1FWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX2tlcm5lbF9yZWxlYXNlKTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfa2VybmVsX3JlYWQpOwotRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9rZXJuZWxfd3JpdGUpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9ydGN0aW1lci5jIGIvc291bmQvY29yZS9ydGN0aW1lci5jCmluZGV4IGU4NWU3MmIuLmYzNDIwZDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcnRjdGltZXIuYworKysgYi9zb3VuZC9jb3JlL3J0Y3RpbWVyLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvdGltZXIuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQykgfHwgZGVmaW5lZChDT05GSUdfUlRDX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19SVEMpCiAKICNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgogCkBAIC0xMzIsOCArMTMyLDcgQEAKIAogCWlmIChydGN0aW1lcl9mcmVxIDwgMiB8fCBydGN0aW1lcl9mcmVxID4gODE5MiB8fAogCSAgICAhaXNfcG93ZXJfb2ZfMihydGN0aW1lcl9mcmVxKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJydGN0aW1lcjogaW52YWxpZCBmcmVxdWVuY3kgJWRcbiIsCi0JCQkgICBydGN0aW1lcl9mcmVxKTsKKwkJcHJfZXJyKCJBTFNBOiBydGN0aW1lcjogaW52YWxpZCBmcmVxdWVuY3kgJWRcbiIsIHJ0Y3RpbWVyX2ZyZXEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE4NSw0ICsxODQsNCBAQAogCiBNT0RVTEVfQUxJQVMoInNuZC10aW1lci0iIF9fc3RyaW5naWZ5KFNORFJWX1RJTUVSX0dMT0JBTF9SVEMpKTsKIAotI2VuZGlmIC8qIENPTkZJR19SVEMgfHwgQ09ORklHX1JUQ19NT0RVTEUgKi8KKyNlbmRpZiAvKiBJU19FTkFCTEVEKENPTkZJR19SVEMpICovCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zcy5jIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3MuYwppbmRleCA4ZDRkNWU4Li4xNmQ0MjY3IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zcy5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzLmMKQEAgLTM5LDEyICszOSw2IEBACiBNT0RVTEVfQUxJQVNfU05EUlZfTUlOT1IoU05EUlZfTUlOT1JfT1NTX1NFUVVFTkNFUik7CiBNT0RVTEVfQUxJQVNfU05EUlZfTUlOT1IoU05EUlZfTUlOT1JfT1NTX01VU0lDKTsKIAotI2lmZGVmIFNORFJWX1NFUV9PU1NfREVCVUcKLW1vZHVsZV9wYXJhbShzZXFfb3NzX2RlYnVnLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhzZXFfb3NzX2RlYnVnLCAiZGVidWcgb3B0aW9uIik7Ci1pbnQgc2VxX29zc19kZWJ1ZyA9IDA7Ci0jZW5kaWYKLQogCiAvKgogICogcHJvdG90eXBlcwpAQCAtMjMxLDIyICsyMjUsMTkgQEAKIAltdXRleF9sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJaWYgKChyYyA9IHNuZF9yZWdpc3Rlcl9vc3NfZGV2aWNlKFNORFJWX09TU19ERVZJQ0VfVFlQRV9TRVFVRU5DRVIsCiAJCQkJCSAgTlVMTCwgMCwKLQkJCQkJICAmc2VxX29zc19mX29wcywgTlVMTCwKLQkJCQkJICBTTkRSVl9TRVFfT1NTX0RFVk5BTUUpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2FuJ3QgcmVnaXN0ZXIgZGV2aWNlIHNlcVxuIik7CisJCQkJCSAgJnNlcV9vc3NfZl9vcHMsIE5VTEwpKSA8IDApIHsKKwkJcHJfZXJyKCJBTFNBOiBzZXFfb3NzOiBjYW4ndCByZWdpc3RlciBkZXZpY2Ugc2VxXG4iKTsKIAkJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJCXJldHVybiByYzsKIAl9CiAJaWYgKChyYyA9IHNuZF9yZWdpc3Rlcl9vc3NfZGV2aWNlKFNORFJWX09TU19ERVZJQ0VfVFlQRV9NVVNJQywKIAkJCQkJICBOVUxMLCAwLAotCQkJCQkgICZzZXFfb3NzX2Zfb3BzLCBOVUxMLAotCQkJCQkgIFNORFJWX1NFUV9PU1NfREVWTkFNRSkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW4ndCByZWdpc3RlciBkZXZpY2UgbXVzaWNcbiIpOworCQkJCQkgICZzZXFfb3NzX2Zfb3BzLCBOVUxMKSkgPCAwKSB7CisJCXByX2VycigiQUxTQTogc2VxX29zczogY2FuJ3QgcmVnaXN0ZXIgZGV2aWNlIG11c2ljXG4iKTsKIAkJc25kX3VucmVnaXN0ZXJfb3NzX2RldmljZShTTkRSVl9PU1NfREVWSUNFX1RZUEVfU0VRVUVOQ0VSLCBOVUxMLCAwKTsKIAkJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJCXJldHVybiByYzsKIAl9Ci0JZGVidWdfcHJpbnRrKCgiZGV2aWNlIHJlZ2lzdGVyZWRcbiIpKTsKIAltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI1NSwxMSArMjQ2LDEwIEBACiB1bnJlZ2lzdGVyX2RldmljZSh2b2lkKQogewogCW11dGV4X2xvY2soJnJlZ2lzdGVyX211dGV4KTsKLQlkZWJ1Z19wcmludGsoKCJkZXZpY2UgdW5yZWdpc3RlcmVkXG4iKSk7CiAJaWYgKHNuZF91bnJlZ2lzdGVyX29zc19kZXZpY2UoU05EUlZfT1NTX0RFVklDRV9UWVBFX01VU0lDLCBOVUxMLCAwKSA8IDApCQkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgdW5yZWdpc3RlciBkZXZpY2UgbXVzaWNcbiIpOworCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IGVycm9yIHVucmVnaXN0ZXIgZGV2aWNlIG11c2ljXG4iKTsKIAlpZiAoc25kX3VucmVnaXN0ZXJfb3NzX2RldmljZShTTkRSVl9PU1NfREVWSUNFX1RZUEVfU0VRVUVOQ0VSLCBOVUxMLCAwKSA8IDApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHVucmVnaXN0ZXIgZGV2aWNlIHNlcVxuIik7CisJCXByX2VycigiQUxTQTogc2VxX29zczogZXJyb3IgdW5yZWdpc3RlciBkZXZpY2Ugc2VxXG4iKTsKIAltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfZGV2aWNlLmggYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19kZXZpY2UuaAppbmRleCBjMDE1NGE5Li5iNDM5MjQzIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19kZXZpY2UuaAorKysgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19kZXZpY2UuaApAQCAtMzEsOSArMzEsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3NlcV9rZXJuZWwuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CiAKLS8qIGVuYWJsZSBkZWJ1ZyBwcmludCAqLwotI2RlZmluZSBTTkRSVl9TRVFfT1NTX0RFQlVHCi0KIC8qIG1heC4gYXBwbGljYXRpb25zICovCiAjZGVmaW5lIFNORFJWX1NFUV9PU1NfTUFYX0NMSUVOVFMJMTYKICNkZWZpbmUgU05EUlZfU0VRX09TU19NQVhfU1lOVEhfREVWUwkxNgpAQCAtNDYsNyArNDMsNiBAQAogI2RlZmluZSBTTkRSVl9TRVFfT1NTX1ZFUlNJT05fU1RSCSIwLjEuOCIKIAogLyogZGV2aWNlIGFuZCBwcm9jIGludGVyZmFjZSBuYW1lICovCi0jZGVmaW5lIFNORFJWX1NFUV9PU1NfREVWTkFNRQkJInNlcV9vc3MiCiAjZGVmaW5lIFNORFJWX1NFUV9PU1NfUFJPQ05BTUUJCSJvc3MiCiAKIApAQCAtMTc3LDEzICsxNzMsNCBAQAogLyogbWlzYy4gZnVuY3Rpb25zIGZvciBwcm9jIGludGVyZmFjZSAqLwogY2hhciAqZW5hYmxlZF9zdHIoaW50IGJvb2wpOwogCi0KLS8qIGZvciBkZWJ1ZyAqLwotI2lmZGVmIFNORFJWX1NFUV9PU1NfREVCVUcKLWV4dGVybiBpbnQgc2VxX29zc19kZWJ1ZzsKLSNkZWZpbmUgZGVidWdfcHJpbnRrKHgpCWRvIHsgaWYgKHNlcV9vc3NfZGVidWcgPiAwKSBzbmRfcHJpbnRkIHg7IH0gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBkZWJ1Z19wcmludGsoeCkJLyoqLwotI2VuZGlmCi0KICNlbmRpZiAvKiBfX1NFUV9PU1NfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX2luaXQuYyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX2luaXQuYwppbmRleCBiM2YzOWI1Li5iOTE4NGQyIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19pbml0LmMKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfaW5pdC5jCkBAIC05Miw3ICs5Miw2IEBACiAJCWdvdG8gX19lcnJvcjsKIAogCXN5c3RlbV9jbGllbnQgPSByYzsKLQlkZWJ1Z19wcmludGsoKCJuZXcgY2xpZW50ID0gJWRcbiIsIHJjKSk7CiAKIAkvKiBjcmVhdGUgYW5ub3VjZW1lbnQgcmVjZWl2ZXIgcG9ydCAqLwogCW1lbXNldChwb3J0LCAwLCBzaXplb2YoKnBvcnQpKTsKQEAgLTE5MCwxMCArMTg5LDkgQEAKIAogCWRwID0ga3phbGxvYyhzaXplb2YoKmRwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkcCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBtYWxsb2MgZGV2aWNlIGluZm9cbiIpOworCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IGNhbid0IG1hbGxvYyBkZXZpY2UgaW5mb1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlkZWJ1Z19wcmludGsoKCJvc3Nfb3BlbjogZHAgPSAlcFxuIiwgZHApKTsKIAogCWRwLT5jc2VxID0gc3lzdGVtX2NsaWVudDsKIAlkcC0+cG9ydCA9IC0xOwpAQCAtMjA2LDcgKzIwNCw3IEBACiAKIAlkcC0+aW5kZXggPSBpOwogCWlmIChpID49IFNORFJWX1NFUV9PU1NfTUFYX0NMSUVOVFMpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidG9vIG1hbnkgYXBwbGljYXRpb25zXG4iKTsKKwkJcHJfZXJyKCJBTFNBOiBzZXFfb3NzOiB0b28gbWFueSBhcHBsaWNhdGlvbnNcbiIpOwogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gX2Vycm9yOwogCX0KQEAgLTIxNiwyMSArMjE0LDE5IEBACiAJc25kX3NlcV9vc3NfbWlkaV9zZXR1cChkcCk7CiAKIAlpZiAoZHAtPnN5bnRoX29wZW5lZCA9PSAwICYmIGRwLT5tYXhfbWlkaWRldiA9PSAwKSB7Ci0JCS8qIHNuZF9wcmludGsoS0VSTl9FUlIgIm5vIGRldmljZSBmb3VuZFxuIik7ICovCisJCS8qIHByX2VycigiQUxTQTogc2VxX29zczogbm8gZGV2aWNlIGZvdW5kXG4iKTsgKi8KIAkJcmMgPSAtRU5PREVWOwogCQlnb3RvIF9lcnJvcjsKIAl9CiAKIAkvKiBjcmVhdGUgcG9ydCAqLwotCWRlYnVnX3ByaW50aygoImNyZWF0ZSBuZXcgcG9ydFxuIikpOwogCXJjID0gY3JlYXRlX3BvcnQoZHApOwogCWlmIChyYyA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2FuJ3QgY3JlYXRlIHBvcnRcbiIpOworCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IGNhbid0IGNyZWF0ZSBwb3J0XG4iKTsKIAkJZ290byBfZXJyb3I7CiAJfQogCiAJLyogYWxsb2NhdGUgcXVldWUgKi8KLQlkZWJ1Z19wcmludGsoKCJhbGxvY2F0ZSBxdWV1ZVxuIikpOwogCXJjID0gYWxsb2Nfc2VxX3F1ZXVlKGRwKTsKIAlpZiAocmMgPCAwKQogCQlnb3RvIF9lcnJvcjsKQEAgLTI0Nyw3ICsyNDMsNiBAQAogCWRwLT5maWxlX21vZGUgPSB0cmFuc2xhdGVfbW9kZShmaWxlKTsKIAogCS8qIGluaXRpYWxpemUgcmVhZCBxdWV1ZSAqLwotCWRlYnVnX3ByaW50aygoImluaXRpYWxpemUgcmVhZCBxdWV1ZVxuIikpOwogCWlmIChpc19yZWFkX21vZGUoZHAtPmZpbGVfbW9kZSkpIHsKIAkJZHAtPnJlYWRxID0gc25kX3NlcV9vc3NfcmVhZHFfbmV3KGRwLCBtYXhxbGVuKTsKIAkJaWYgKCFkcC0+cmVhZHEpIHsKQEAgLTI1Nyw3ICsyNTIsNiBAQAogCX0KIAogCS8qIGluaXRpYWxpemUgd3JpdGUgcXVldWUgKi8KLQlkZWJ1Z19wcmludGsoKCJpbml0aWFsaXplIHdyaXRlIHF1ZXVlXG4iKSk7CiAJaWYgKGlzX3dyaXRlX21vZGUoZHAtPmZpbGVfbW9kZSkpIHsKIAkJZHAtPndyaXRlcSA9IHNuZF9zZXFfb3NzX3dyaXRlcV9uZXcoZHAsIG1heHFsZW4pOwogCQlpZiAoIWRwLT53cml0ZXEpIHsKQEAgLTI2NywxNCArMjYxLDEyIEBACiAJfQogCiAJLyogaW5pdGlhbGl6ZSB0aW1lciAqLwotCWRlYnVnX3ByaW50aygoImluaXRpYWxpemUgdGltZXJcbiIpKTsKIAlkcC0+dGltZXIgPSBzbmRfc2VxX29zc190aW1lcl9uZXcoZHApOwogCWlmICghZHAtPnRpbWVyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbid0IGFsbG9jIHRpbWVyXG4iKTsKKwkJcHJfZXJyKCJBTFNBOiBzZXFfb3NzOiBjYW4ndCBhbGxvYyB0aW1lclxuIik7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBfZXJyb3I7CiAJfQotCWRlYnVnX3ByaW50aygoInRpbWVyIGluaXRpYWxpemVkXG4iKSk7CiAKIAkvKiBzZXQgcHJpdmF0ZSBkYXRhIHBvaW50ZXIgKi8KIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBkcDsKQEAgLTI4OCw3ICsyODAsNiBAQAogCWNsaWVudF90YWJsZVtkcC0+aW5kZXhdID0gZHA7CiAJbnVtX2NsaWVudHMrKzsKIAotCWRlYnVnX3ByaW50aygoIm9wZW4gZG9uZVxuIikpOwogCXJldHVybiAwOwogCiAgX2Vycm9yOgpAQCAtMzQ3LDcgKzMzOCw2IEBACiAJCXJldHVybiByYzsKIAogCWRwLT5wb3J0ID0gcG9ydC5hZGRyLnBvcnQ7Ci0JZGVidWdfcHJpbnRrKCgibmV3IHBvcnQgPSAlZFxuIiwgcG9ydC5hZGRyLnBvcnQpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzYzLDcgKzM1Myw2IEBACiAJCXJldHVybiAwOwogCX0KIAotCWRlYnVnX3ByaW50aygoImRlbGV0ZV9wb3J0ICVpXG4iLCBkcC0+cG9ydCkpOwogCXJldHVybiBzbmRfc2VxX2V2ZW50X3BvcnRfZGV0YWNoKGRwLT5jc2VxLCBkcC0+cG9ydCk7CiB9CiAKQEAgLTQwMSw3ICszOTAsNyBAQAogCXFpbmZvLnF1ZXVlID0gcXVldWU7CiAJcmMgPSBjYWxsX2N0bChTTkRSVl9TRVFfSU9DVExfREVMRVRFX1FVRVVFLCAmcWluZm8pOwogCWlmIChyYyA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAic2VxLW9zczogdW5hYmxlIHRvIGRlbGV0ZSBxdWV1ZSAlZCAoJWQpXG4iLCBxdWV1ZSwgcmMpOworCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IHVuYWJsZSB0byBkZWxldGUgcXVldWUgJWQgKCVkKVxuIiwgcXVldWUsIHJjKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTQzOCwyMSArNDI3LDE2IEBACiAJY2xpZW50X3RhYmxlW2RwLT5pbmRleF0gPSBOVUxMOwogCW51bV9jbGllbnRzLS07CiAKLQlkZWJ1Z19wcmludGsoKCJyZXNldHRpbmcuLlxuIikpOwogCXNuZF9zZXFfb3NzX3Jlc2V0KGRwKTsKIAotCWRlYnVnX3ByaW50aygoImNsZWFuaW5nIHVwLi5cbiIpKTsKIAlzbmRfc2VxX29zc19zeW50aF9jbGVhbnVwKGRwKTsKIAlzbmRfc2VxX29zc19taWRpX2NsZWFudXAoZHApOwogCiAJLyogY2xlYXIgc2xvdCAqLwotCWRlYnVnX3ByaW50aygoInJlbGVhc2luZyByZXNvdXJjZS4uXG4iKSk7CiAJcXVldWUgPSBkcC0+cXVldWU7CiAJaWYgKGRwLT5wb3J0ID49IDApCiAJCWRlbGV0ZV9wb3J0KGRwKTsKIAlkZWxldGVfc2VxX3F1ZXVlKHF1ZXVlKTsKLQotCWRlYnVnX3ByaW50aygoInJlbGVhc2UgZG9uZVxuIikpOwogfQogCiAKQEAgLTQ2Niw3ICs0NTAsNiBAQAogCQlyZXR1cm47CiAJaWYgKGlzX3dyaXRlX21vZGUoZHAtPmZpbGVfbW9kZSkgJiYgIWlzX25vbmJsb2NrX21vZGUoZHAtPmZpbGVfbW9kZSkgJiYKIAkgICAgZHAtPndyaXRlcSkgewotCQlkZWJ1Z19wcmludGsoKCJzeW5jaW5nLi5cbiIpKTsKIAkJd2hpbGUgKHNuZF9zZXFfb3NzX3dyaXRlcV9zeW5jKGRwLT53cml0ZXEpKQogCQkJOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX2lvY3RsLmMgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19pb2N0bC5jCmluZGV4IDVhYzcwMWMuLjViODUyMDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX2lvY3RsLmMKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfaW9jdGwuYwpAQCAtOTAsMTIgKzkwLDEwIEBACiAJCXJldHVybiBzbmRfc2VxX29zc190aW1lcl9pb2N0bChkcC0+dGltZXIsIGNtZCwgYXJnKTsKIAogCWNhc2UgU05EQ1RMX1NFUV9QQU5JQzoKLQkJZGVidWdfcHJpbnRrKCgicGFuaWNcbiIpKTsKIAkJc25kX3NlcV9vc3NfcmVzZXQoZHApOwogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNhc2UgU05EQ1RMX1NFUV9TWU5DOgotCQlkZWJ1Z19wcmludGsoKCJzeW5jXG4iKSk7CiAJCWlmICghIGlzX3dyaXRlX21vZGUoZHAtPmZpbGVfbW9kZSkgfHwgZHAtPndyaXRlcSA9PSBOVUxMKQogCQkJcmV0dXJuIDA7CiAJCXdoaWxlIChzbmRfc2VxX29zc193cml0ZXFfc3luYyhkcC0+d3JpdGVxKSkKQEAgLTEwNSw1NSArMTAzLDQ1IEBACiAJCXJldHVybiAwOwogCiAJY2FzZSBTTkRDVExfU0VRX1JFU0VUOgotCQlkZWJ1Z19wcmludGsoKCJyZXNldFxuIikpOwogCQlzbmRfc2VxX29zc19yZXNldChkcCk7CiAJCXJldHVybiAwOwogCiAJY2FzZSBTTkRDVExfU0VRX1RFU1RNSURJOgotCQlkZWJ1Z19wcmludGsoKCJ0ZXN0IG1pZGlcbiIpKTsKIAkJaWYgKGdldF91c2VyKGRldiwgcCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJcmV0dXJuIHNuZF9zZXFfb3NzX21pZGlfb3BlbihkcCwgZGV2LCBkcC0+ZmlsZV9tb2RlKTsKIAogCWNhc2UgU05EQ1RMX1NFUV9HRVRJTkNPVU5UOgotCQlkZWJ1Z19wcmludGsoKCJnZXQgaW4gY291bnRcbiIpKTsKIAkJaWYgKGRwLT5yZWFkcSA9PSBOVUxMIHx8ICEgaXNfcmVhZF9tb2RlKGRwLT5maWxlX21vZGUpKQogCQkJcmV0dXJuIDA7CiAJCXJldHVybiBwdXRfdXNlcihkcC0+cmVhZHEtPnFsZW4sIHApID8gLUVGQVVMVCA6IDA7CiAKIAljYXNlIFNORENUTF9TRVFfR0VUT1VUQ09VTlQ6Ci0JCWRlYnVnX3ByaW50aygoImdldCBvdXQgY291bnRcbiIpKTsKIAkJaWYgKCEgaXNfd3JpdGVfbW9kZShkcC0+ZmlsZV9tb2RlKSB8fCBkcC0+d3JpdGVxID09IE5VTEwpCiAJCQlyZXR1cm4gMDsKIAkJcmV0dXJuIHB1dF91c2VyKHNuZF9zZXFfb3NzX3dyaXRlcV9nZXRfZnJlZV9zaXplKGRwLT53cml0ZXEpLCBwKSA/IC1FRkFVTFQgOiAwOwogCiAJY2FzZSBTTkRDVExfU0VRX0dFVFRJTUU6Ci0JCWRlYnVnX3ByaW50aygoImdldCB0aW1lXG4iKSk7CiAJCXJldHVybiBwdXRfdXNlcihzbmRfc2VxX29zc190aW1lcl9jdXJfdGljayhkcC0+dGltZXIpLCBwKSA/IC1FRkFVTFQgOiAwOwogCiAJY2FzZSBTTkRDVExfU0VRX1JFU0VUU0FNUExFUzoKLQkJZGVidWdfcHJpbnRrKCgicmVzZXQgc2FtcGxlc1xuIikpOwogCQlpZiAoZ2V0X3VzZXIoZGV2LCBwKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlyZXR1cm4gc25kX3NlcV9vc3Nfc3ludGhfaW9jdGwoZHAsIGRldiwgY21kLCBjYXJnKTsKIAogCWNhc2UgU05EQ1RMX1NFUV9OUlNZTlRIUzoKLQkJZGVidWdfcHJpbnRrKCgibnIgc3ludGhzXG4iKSk7CiAJCXJldHVybiBwdXRfdXNlcihkcC0+bWF4X3N5bnRoZGV2LCBwKSA/IC1FRkFVTFQgOiAwOwogCiAJY2FzZSBTTkRDVExfU0VRX05STUlESVM6Ci0JCWRlYnVnX3ByaW50aygoIm5yIG1pZGlzXG4iKSk7CiAJCXJldHVybiBwdXRfdXNlcihkcC0+bWF4X21pZGlkZXYsIHApID8gLUVGQVVMVCA6IDA7CiAKIAljYXNlIFNORENUTF9TWU5USF9NRU1BVkw6Ci0JCWRlYnVnX3ByaW50aygoIm1lbSBhdmFpbFxuIikpOwogCQlpZiAoZ2V0X3VzZXIoZGV2LCBwKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQl2YWwgPSBzbmRfc2VxX29zc19zeW50aF9pb2N0bChkcCwgZGV2LCBjbWQsIGNhcmcpOwogCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKSA/IC1FRkFVTFQgOiAwOwogCiAJY2FzZSBTTkRDVExfRk1fNE9QX0VOQUJMRToKLQkJZGVidWdfcHJpbnRrKCgiNG9wXG4iKSk7CiAJCWlmIChnZXRfdXNlcihkZXYsIHApKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXNuZF9zZXFfb3NzX3N5bnRoX2lvY3RsKGRwLCBkZXYsIGNtZCwgY2FyZyk7CkBAIC0xNjEsMTkgKzE0OSwxNSBAQAogCiAJY2FzZSBTTkRDVExfU1lOVEhfSU5GTzoKIAljYXNlIFNORENUTF9TWU5USF9JRDoKLQkJZGVidWdfcHJpbnRrKCgic3ludGggaW5mb1xuIikpOwogCQlyZXR1cm4gc25kX3NlcV9vc3Nfc3ludGhfaW5mb191c2VyKGRwLCBhcmcpOwogCiAJY2FzZSBTTkRDVExfU0VRX09VVE9GQkFORDoKLQkJZGVidWdfcHJpbnRrKCgib3V0IG9mIGJhbmRcbiIpKTsKIAkJcmV0dXJuIHNuZF9zZXFfb3NzX29vYl91c2VyKGRwLCBhcmcpOwogCiAJY2FzZSBTTkRDVExfTUlESV9JTkZPOgotCQlkZWJ1Z19wcmludGsoKCJtaWRpIGluZm9cbiIpKTsKIAkJcmV0dXJuIHNuZF9zZXFfb3NzX21pZGlfaW5mb191c2VyKGRwLCBhcmcpOwogCiAJY2FzZSBTTkRDVExfU0VRX1RIUkVTSE9MRDoKLQkJZGVidWdfcHJpbnRrKCgidGhyZXNob2xkXG4iKSk7CiAJCWlmICghIGlzX3dyaXRlX21vZGUoZHAtPmZpbGVfbW9kZSkpCiAJCQlyZXR1cm4gMDsKIAkJaWYgKGdldF91c2VyKHZhbCwgcCkpCkBAIC0xODYsNyArMTcwLDYgQEAKIAkJcmV0dXJuIDA7CiAKIAljYXNlIFNORENUTF9NSURJX1BSRVRJTUU6Ci0JCWRlYnVnX3ByaW50aygoInByZXRpbWVcbiIpKTsKIAkJaWYgKGRwLT5yZWFkcSA9PSBOVUxMIHx8ICFpc19yZWFkX21vZGUoZHAtPmZpbGVfbW9kZSkpCiAJCQlyZXR1cm4gMDsKIAkJaWYgKGdldF91c2VyKHZhbCwgcCkpCkBAIC0xOTksNyArMTgyLDYgQEAKIAkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCkgPyAtRUZBVUxUIDogMDsKIAogCWRlZmF1bHQ6Ci0JCWRlYnVnX3ByaW50aygoIm90aGVyc1xuIikpOwogCQlpZiAoISBpc193cml0ZV9tb2RlKGRwLT5maWxlX21vZGUpKQogCQkJcmV0dXJuIC1FSU87CiAJCXJldHVybiBzbmRfc2VxX29zc19zeW50aF9pb2N0bChkcCwgMCwgY21kLCBjYXJnKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX21pZGkuYyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX21pZGkuYwppbmRleCA4NjJkODQ4OS4uM2E0NTY5NiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfbWlkaS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX21pZGkuYwpAQCAtMTUzLDcgKzE1Myw2IEBACiAJc3RydWN0IHNlcV9vc3NfbWlkaSAqbWRldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGVidWdfcHJpbnRrKCgiY2hlY2sgZm9yIE1JREkgY2xpZW50ICVkIHBvcnQgJWRcbiIsIHBpbmZvLT5hZGRyLmNsaWVudCwgcGluZm8tPmFkZHIucG9ydCkpOwogCS8qIHRoZSBwb3J0IG11c3QgaW5jbHVkZSBnZW5lcmljIG1pZGkgKi8KIAlpZiAoISAocGluZm8tPnR5cGUgJiBTTkRSVl9TRVFfUE9SVF9UWVBFX01JRElfR0VORVJJQykpCiAJCXJldHVybiAwOwpAQCAtMTc1LDcgKzE3NCw3IEBACiAJICogYWxsb2NhdGUgbWlkaSBpbmZvIHJlY29yZAogCSAqLwogCWlmICgobWRldiA9IGt6YWxsb2Moc2l6ZW9mKCptZGV2KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2FuJ3QgbWFsbG9jIG1pZGkgaW5mb1xuIik7CisJCXByX2VycigiQUxTQTogc2VxX29zczogY2FuJ3QgbWFsbG9jIG1pZGkgaW5mb1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTkxLDcgKzE5MCw3IEBACiAKIAkvKiBjcmVhdGUgTUlESSBjb2RlciAqLwogCWlmIChzbmRfbWlkaV9ldmVudF9uZXcoTUFYX01JRElfRVZFTlRfQlVGLCAmbWRldi0+Y29kZXIpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBtYWxsb2MgbWlkaSBjb2RlclxuIik7CisJCXByX2VycigiQUxTQTogc2VxX29zczogY2FuJ3QgbWFsbG9jIG1pZGkgY29kZXJcbiIpOwogCQlrZnJlZShtZGV2KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtNDA2LDcgKzQwNSw2IEBACiAJCXJldHVybiAwOwogCX0KIAotCWRlYnVnX3ByaW50aygoImNsb3NpbmcgY2xpZW50ICVkIHBvcnQgJWQgbW9kZSAlZFxuIiwgbWRldi0+Y2xpZW50LCBtZGV2LT5wb3J0LCBtZGV2LT5vcGVuZWQpKTsKIAltZW1zZXQoJnN1YnMsIDAsIHNpemVvZihzdWJzKSk7CiAJaWYgKG1kZXYtPm9wZW5lZCAmIFBFUk1fV1JJVEUpIHsKIAkJc3Vicy5zZW5kZXIgPSBkcC0+YWRkcjsKQEAgLTQ3MCw3ICs0NjgsNiBAQAogCQlzdHJ1Y3Qgc25kX3NlcV9ldmVudCBldjsKIAkJaW50IGM7CiAKLQkJZGVidWdfcHJpbnRrKCgicmVzZXR0aW5nIGNsaWVudCAlZCBwb3J0ICVkXG4iLCBtZGV2LT5jbGllbnQsIG1kZXYtPnBvcnQpKTsKIAkJbWVtc2V0KCZldiwgMCwgc2l6ZW9mKGV2KSk7CiAJCWV2LmRlc3QuY2xpZW50ID0gbWRldi0+Y2xpZW50OwogCQlldi5kZXN0LnBvcnQgPSBtZGV2LT5wb3J0OwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfcmVhZHEuYyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3JlYWRxLmMKaW5kZXggNzM2NjFjNC4uNjU0ZDE3YSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfcmVhZHEuYworKysgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19yZWFkcS5jCkBAIC00OCwxMiArNDgsMTIgQEAKIAlzdHJ1Y3Qgc2VxX29zc19yZWFkcSAqcTsKIAogCWlmICgocSA9IGt6YWxsb2Moc2l6ZW9mKCpxKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2FuJ3QgbWFsbG9jIHJlYWQgcXVldWVcbiIpOworCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IGNhbid0IG1hbGxvYyByZWFkIHF1ZXVlXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJaWYgKChxLT5xID0ga2NhbGxvYyhtYXhsZW4sIHNpemVvZih1bmlvbiBldnJlYyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbid0IG1hbGxvYyByZWFkIHF1ZXVlIGJ1ZmZlclxuIik7CisJCXByX2VycigiQUxTQTogc2VxX29zczogY2FuJ3QgbWFsbG9jIHJlYWQgcXVldWUgYnVmZmVyXG4iKTsKIAkJa2ZyZWUocSk7CiAJCXJldHVybiBOVUxMOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3N5bnRoLmMgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19zeW50aC5jCmluZGV4IGM1Yjc3M2EuLjcwMWZlYjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3N5bnRoLmMKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3Nfc3ludGguYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICgocmVjID0ga3phbGxvYyhzaXplb2YoKnJlYyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbid0IG1hbGxvYyBzeW50aCBpbmZvXG4iKTsKKwkJcHJfZXJyKCJBTFNBOiBzZXFfb3NzOiBjYW4ndCBtYWxsb2Mgc3ludGggaW5mb1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlyZWMtPnNlcV9kZXZpY2UgPSAtMTsKQEAgLTEzMCw3ICsxMzAsNyBAQAogCWlmIChpID49IG1heF9zeW50aF9kZXZzKSB7CiAJCWlmIChtYXhfc3ludGhfZGV2cyA+PSBTTkRSVl9TRVFfT1NTX01BWF9TWU5USF9ERVZTKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZWdpc3Rlcl9sb2NrLCBmbGFncyk7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJubyBtb3JlIHN5bnRoIHNsb3RcbiIpOworCQkJcHJfZXJyKCJBTFNBOiBzZXFfb3NzOiBubyBtb3JlIHN5bnRoIHNsb3RcbiIpOwogCQkJa2ZyZWUocmVjKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CkBAIC0xMzgsNyArMTM4LDYgQEAKIAl9CiAJcmVjLT5zZXFfZGV2aWNlID0gaTsKIAlzeW50aF9kZXZzW2ldID0gcmVjOwotCWRlYnVnX3ByaW50aygoInN5bnRoICVzIHJlZ2lzdGVyZWQgJWRcbiIsIHJlYy0+bmFtZSwgaSkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKIAlkZXYtPmRyaXZlcl9kYXRhID0gcmVjOwogI2lmZGVmIFNORFJWX09TU19JTkZPX0RFVl9TWU5USApAQCAtMTYzLDcgKzE2Miw3IEBACiAJfQogCWlmIChpbmRleCA+PSBtYXhfc3ludGhfZGV2cykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZWdpc3Rlcl9sb2NrLCBmbGFncyk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbid0IHVucmVnaXN0ZXIgc3ludGhcbiIpOworCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IGNhbid0IHVucmVnaXN0ZXIgc3ludGhcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJc3ludGhfZGV2c1tpbmRleF0gPSBOVUxMOwpAQCAtMjQ4LDcgKzI0Nyw3IEBACiAJCWlmIChpbmZvLT5ucl92b2ljZXMgPiAwKSB7CiAJCQlpbmZvLT5jaCA9IGtjYWxsb2MoaW5mby0+bnJfdm9pY2VzLCBzaXplb2Yoc3RydWN0IHNlcV9vc3NfY2hpbmZvKSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIWluZm8tPmNoKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ2Fubm90IG1hbGxvY1xuIik7CisJCQkJcHJfZXJyKCJBTFNBOiBzZXFfb3NzOiBDYW5ub3QgbWFsbG9jIHZvaWNlc1xuIik7CiAJCQkJcmVjLT5vcGVyLmNsb3NlKCZpbmZvLT5hcmcpOwogCQkJCW1vZHVsZV9wdXQocmVjLT5vcGVyLm93bmVyKTsKIAkJCQlzbmRfdXNlX2xvY2tfZnJlZSgmcmVjLT51c2VfbG9jayk7CkBAIC0yNTYsNyArMjU1LDYgQEAKIAkJCX0KIAkJCXJlc2V0X2NoYW5uZWxzKGluZm8pOwogCQl9Ci0JCWRlYnVnX3ByaW50aygoInN5bnRoICVkIGFzc2lnbmVkXG4iLCBpKSk7CiAJCWluZm8tPm9wZW5lZCsrOwogCQlyZWMtPm9wZW5lZCsrOwogCQlkcC0+c3ludGhfb3BlbmVkKys7CkBAIC0zMjYsNyArMzI0LDYgQEAKIAkJCWlmIChyZWMgPT0gTlVMTCkKIAkJCQljb250aW51ZTsKIAkJCWlmIChyZWMtPm9wZW5lZCA+IDApIHsKLQkJCQlkZWJ1Z19wcmludGsoKCJzeW50aCAlZCBjbG9zZWRcbiIsIGkpKTsKIAkJCQlyZWMtPm9wZXIuY2xvc2UoJmluZm8tPmFyZyk7CiAJCQkJbW9kdWxlX3B1dChyZWMtPm9wZXIub3duZXIpOwogCQkJCXJlYy0+b3BlbmVkID0gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3RpbWVyLmMgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc190aW1lci5jCmluZGV4IGFiNTljYmYuLjRmMjRlYTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3RpbWVyLmMKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfdGltZXIuYwpAQCAtMjMzLDcgKzIzMyw2IEBACiAJaW50IHZhbHVlOwogCiAJaWYgKGNtZCA9PSBTTkRDVExfU0VRX0NUUkxSQVRFKSB7Ci0JCWRlYnVnX3ByaW50aygoImN0cmwgcmF0ZVxuIikpOwogCQkvKiBpZiAqYXJnID09IDAsIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IHJhdGUgKi8KIAkJaWYgKGdldF91c2VyKHZhbHVlLCBhcmcpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0yNDgsMjEgKzI0NywxNiBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORENUTF9UTVJfU1RBUlQ6Ci0JCWRlYnVnX3ByaW50aygoInRpbWVyIHN0YXJ0XG4iKSk7CiAJCXJldHVybiBzbmRfc2VxX29zc190aW1lcl9zdGFydCh0aW1lcik7CiAJY2FzZSBTTkRDVExfVE1SX1NUT1A6Ci0JCWRlYnVnX3ByaW50aygoInRpbWVyIHN0b3BcbiIpKTsKIAkJcmV0dXJuIHNuZF9zZXFfb3NzX3RpbWVyX3N0b3AodGltZXIpOwogCWNhc2UgU05EQ1RMX1RNUl9DT05USU5VRToKLQkJZGVidWdfcHJpbnRrKCgidGltZXIgY29udGludWVcbiIpKTsKIAkJcmV0dXJuIHNuZF9zZXFfb3NzX3RpbWVyX2NvbnRpbnVlKHRpbWVyKTsKIAljYXNlIFNORENUTF9UTVJfVEVNUE86Ci0JCWRlYnVnX3ByaW50aygoInRpbWVyIHRlbXBvXG4iKSk7CiAJCWlmIChnZXRfdXNlcih2YWx1ZSwgYXJnKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlyZXR1cm4gc25kX3NlcV9vc3NfdGltZXJfdGVtcG8odGltZXIsIHZhbHVlKTsKIAljYXNlIFNORENUTF9UTVJfVElNRUJBU0U6Ci0JCWRlYnVnX3ByaW50aygoInRpbWVyIHRpbWViYXNlXG4iKSk7CiAJCWlmIChnZXRfdXNlcih2YWx1ZSwgYXJnKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlpZiAodmFsdWUgPCBNSU5fT1NTX1RJTUVCQVNFKQpAQCAtMjc2LDcgKzI3MCw2IEBACiAJY2FzZSBTTkRDVExfVE1SX01FVFJPTk9NRToKIAljYXNlIFNORENUTF9UTVJfU0VMRUNUOgogCWNhc2UgU05EQ1RMX1RNUl9TT1VSQ0U6Ci0JCWRlYnVnX3ByaW50aygoInRpbWVyIFhYWFxuIikpOwogCQkvKiBub3Qgc3VwcG9ydGVkICovCiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYwppbmRleCA0ZGM2YmFlLi45Y2E1ZTY0IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfY2xpZW50bWdyLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2NsaWVudG1nci5jCkBAIC0xMjMsNyArMTIzLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudHB0cihpbnQgY2xpZW50aWQpCiB7CiAJaWYgKGNsaWVudGlkIDwgMCB8fCBjbGllbnRpZCA+PSBTTkRSVl9TRVFfTUFYX0NMSUVOVFMpIHsKLQkJc25kX3ByaW50ZCgiU2VxOiBvb3BzLiBUcnlpbmcgdG8gZ2V0IHBvaW50ZXIgdG8gY2xpZW50ICVkXG4iLAorCQlwcl9kZWJ1ZygiQUxTQTogc2VxOiBvb3BzLiBUcnlpbmcgdG8gZ2V0IHBvaW50ZXIgdG8gY2xpZW50ICVkXG4iLAogCQkJICAgY2xpZW50aWQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0xMzYsNyArMTM2LDcgQEAKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudDsKIAogCWlmIChjbGllbnRpZCA8IDAgfHwgY2xpZW50aWQgPj0gU05EUlZfU0VRX01BWF9DTElFTlRTKSB7Ci0JCXNuZF9wcmludGQoIlNlcTogb29wcy4gVHJ5aW5nIHRvIGdldCBwb2ludGVyIHRvIGNsaWVudCAlZFxuIiwKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogb29wcy4gVHJ5aW5nIHRvIGdldCBwb2ludGVyIHRvIGNsaWVudCAlZFxuIiwKIAkJCSAgIGNsaWVudGlkKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMjkxLDggKzI5MSw4IEBACiAJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCXN3aXRjaCAoY2xpZW50LT50eXBlKSB7CiAJY2FzZSBOT19DTElFTlQ6Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJTZXE6IFRyeWluZyB0byBmcmVlIHVudXNlZCBjbGllbnQgJWRcbiIsCi0JCQkgICBjbGllbnQtPm51bWJlcik7CisJCXByX3dhcm4oIkFMU0E6IHNlcTogVHJ5aW5nIHRvIGZyZWUgdW51c2VkIGNsaWVudCAlZFxuIiwKKwkJCWNsaWVudC0+bnVtYmVyKTsKIAkJYnJlYWs7CiAJY2FzZSBVU0VSX0NMSUVOVDoKIAljYXNlIEtFUk5FTF9DTElFTlQ6CkBAIC0zMDEsNyArMzAxLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJTZXE6IFRyeWluZyB0byBmcmVlIGNsaWVudCAlZCB3aXRoIHVuZGVmaW5lZCB0eXBlID0gJWRcbiIsCisJCXByX2VycigiQUxTQTogc2VxOiBUcnlpbmcgdG8gZnJlZSBjbGllbnQgJWQgd2l0aCB1bmRlZmluZWQgdHlwZSA9ICVkXG4iLAogCQkJICAgY2xpZW50LT5udW1iZXIsIGNsaWVudC0+dHlwZSk7CiAJfQogCW11dGV4X3VubG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwpAQCAtNzczLDcgKzc3Myw3IEBACiBzdGF0aWMgaW50IG11bHRpY2FzdF9ldmVudChzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgc3RydWN0IHNuZF9zZXFfZXZlbnQgKmV2ZW50LAogCQkJICAgaW50IGF0b21pYywgaW50IGhvcCkKIHsKLQlzbmRfcHJpbnRkKCJzZXE6IG11bHRpY2FzdCBub3Qgc3VwcG9ydGVkIHlldC5cbiIpOworCXByX2RlYnVnKCJBTFNBOiBzZXE6IG11bHRpY2FzdCBub3Qgc3VwcG9ydGVkIHlldC5cbiIpOwogCXJldHVybiAwOyAvKiBpZ25vcmVkICovCiB9CiAjZW5kaWYgLyogU1VQUE9SVF9CUk9BRENBU1QgKi8KQEAgLTc5NCw3ICs3OTQsNyBAQAogCiAJaG9wKys7CiAJaWYgKGhvcCA+PSBTTkRSVl9TRVFfTUFYX0hPUFMpIHsKLQkJc25kX3ByaW50ZCgidG9vIGxvbmcgZGVsaXZlcnkgcGF0aCAoJWQ6JWQtPiVkOiVkKVxuIiwKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogdG9vIGxvbmcgZGVsaXZlcnkgcGF0aCAoJWQ6JWQtPiVkOiVkKVxuIiwKIAkJCSAgIGV2ZW50LT5zb3VyY2UuY2xpZW50LCBldmVudC0+c291cmNlLnBvcnQsCiAJCQkgICBldmVudC0+ZGVzdC5jbGllbnQsIGV2ZW50LT5kZXN0LnBvcnQpOwogCQlyZXR1cm4gLUVNTElOSzsKQEAgLTIxOTYsNyArMjE5Niw3IEBACiAJCWlmIChwLT5jbWQgPT0gY21kKQogCQkJcmV0dXJuIHAtPmZ1bmMoY2xpZW50LCBhcmcpOwogCX0KLQlzbmRfcHJpbnRkKCJzZXEgdW5rbm93biBpb2N0bCgpIDB4JXggKHR5cGU9JyVjJywgbnVtYmVyPTB4JTAyeClcbiIsCisJcHJfZGVidWcoIkFMU0E6IHNlcSB1bmtub3duIGlvY3RsKCkgMHgleCAodHlwZT0nJWMnLCBudW1iZXI9MHglMDJ4KVxuIiwKIAkJICAgY21kLCBfSU9DX1RZUEUoY21kKSwgX0lPQ19OUihjbWQpKTsKIAlyZXR1cm4gLUVOT1RUWTsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9kZXZpY2UuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9kZXZpY2UuYwppbmRleCAwNDBjNjBlLi45MWE3ODZhIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfZGV2aWNlLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2RldmljZS5jCkBAIC0xNjgsNyArMTY4LDcgQEAKIAogLyoKICAqIHJlZ2lzdGVyIGEgc2VxdWVuY2VyIGRldmljZQotICogY2FyZCA9IGNhcmQgaW5mbyAoTlVMTCBhbGxvd2VkKQorICogY2FyZCA9IGNhcmQgaW5mbwogICogZGV2aWNlID0gZGV2aWNlIG51bWJlciAoaWYgYW55KQogICogaWQgPSBpZCBvZiBkcml2ZXIKICAqIHJlc3VsdCA9IHJldHVybiBwb2ludGVyIChOVUxMIGFsbG93ZWQgaWYgdW5uZWNlc3NhcnkpCkBAIC0zMjUsNyArMzI1LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWlmIChvcHMtPmRyaXZlciAmIERSSVZFUl9MT0FERUQpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImRyaXZlcl9yZWdpc3RlcjogZHJpdmVyICclcycgYWxyZWFkeSBleGlzdHNcbiIsIGlkKTsKKwkJcHJfd2FybigiQUxTQTogc2VxOiBkcml2ZXJfcmVnaXN0ZXI6IGRyaXZlciAnJXMnIGFscmVhZHkgZXhpc3RzXG4iLCBpZCk7CiAJCXVubG9ja19kcml2ZXIob3BzKTsKIAkJc25kX3NlcV9hdXRvbG9hZF91bmxvY2soKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTM5OCw3ICszOTgsNyBAQAogCQlyZXR1cm4gLUVOWElPOwogCWlmICghIChvcHMtPmRyaXZlciAmIERSSVZFUl9MT0FERUQpIHx8CiAJICAgIChvcHMtPmRyaXZlciAmIERSSVZFUl9MT0NLRUQpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRyaXZlcl91bnJlZ2lzdGVyOiBjYW5ub3QgdW5sb2FkIGRyaXZlciAnJXMnOiBzdGF0dXM9JXhcbiIsCisJCXByX2VycigiQUxTQTogc2VxOiBkcml2ZXJfdW5yZWdpc3RlcjogY2Fubm90IHVubG9hZCBkcml2ZXIgJyVzJzogc3RhdHVzPSV4XG4iLAogCQkJICAgaWQsIG9wcy0+ZHJpdmVyKTsKIAkJdW5sb2NrX2RyaXZlcihvcHMpOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtNDEzLDcgKzQxMyw3IEBACiAKIAlvcHMtPmRyaXZlciA9IDA7CiAJaWYgKG9wcy0+bnVtX2luaXRfZGV2aWNlcyA+IDApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgImZyZWVfZHJpdmVyOiBpbml0X2RldmljZXMgPiAwISEgKCVkKVxuIiwKKwkJcHJfZXJyKCJBTFNBOiBzZXE6IGZyZWVfZHJpdmVyOiBpbml0X2RldmljZXMgPiAwISEgKCVkKVxuIiwKIAkJCSAgIG9wcy0+bnVtX2luaXRfZGV2aWNlcyk7CiAJbXV0ZXhfdW5sb2NrKCZvcHMtPnJlZ19tdXRleCk7CiAKQEAgLTQ1OSw3ICs0NTksNyBAQAogCWlmIChkZXYtPnN0YXR1cyAhPSBTTkRSVl9TRVFfREVWSUNFX0ZSRUUpCiAJCXJldHVybiAwOyAvKiBhbHJlYWR5IGluaXRpYWxpemVkICovCiAJaWYgKG9wcy0+YXJnc2l6ZSAhPSBkZXYtPmFyZ3NpemUpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW5jb21wYXRpYmxlIGRldmljZSAnJXMnIGZvciBwbHVnLWluICclcycgKCVkICVkKVxuIiwKKwkJcHJfZXJyKCJBTFNBOiBzZXE6IGluY29tcGF0aWJsZSBkZXZpY2UgJyVzJyBmb3IgcGx1Zy1pbiAnJXMnICglZCAlZClcbiIsCiAJCQkgICBkZXYtPm5hbWUsIG9wcy0+aWQsIG9wcy0+YXJnc2l6ZSwgZGV2LT5hcmdzaXplKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNDY3LDcgKzQ2Nyw3IEBACiAJCWRldi0+c3RhdHVzID0gU05EUlZfU0VRX0RFVklDRV9SRUdJU1RFUkVEOwogCQlvcHMtPm51bV9pbml0X2RldmljZXMrKzsKIAl9IGVsc2UgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbml0X2RldmljZSBmYWlsZWQ6ICVzOiAlc1xuIiwKKwkJcHJfZXJyKCJBTFNBOiBzZXE6IGluaXRfZGV2aWNlIGZhaWxlZDogJXM6ICVzXG4iLAogCQkJICAgZGV2LT5uYW1lLCBkZXYtPmlkKTsKIAl9CiAKQEAgLTQ4Niw3ICs0ODYsNyBAQAogCWlmIChkZXYtPnN0YXR1cyAhPSBTTkRSVl9TRVFfREVWSUNFX1JFR0lTVEVSRUQpCiAJCXJldHVybiAwOyAvKiBub3QgcmVnaXN0ZXJlZCAqLwogCWlmIChvcHMtPmFyZ3NpemUgIT0gZGV2LT5hcmdzaXplKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImluY29tcGF0aWJsZSBkZXZpY2UgJyVzJyBmb3IgcGx1Zy1pbiAnJXMnICglZCAlZClcbiIsCisJCXByX2VycigiQUxTQTogc2VxOiBpbmNvbXBhdGlibGUgZGV2aWNlICclcycgZm9yIHBsdWctaW4gJyVzJyAoJWQgJWQpXG4iLAogCQkJICAgZGV2LT5uYW1lLCBvcHMtPmlkLCBvcHMtPmFyZ3NpemUsIGRldi0+YXJnc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTQ5NSw3ICs0OTUsNyBAQAogCQlkZXYtPmRyaXZlcl9kYXRhID0gTlVMTDsKIAkJb3BzLT5udW1faW5pdF9kZXZpY2VzLS07CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZnJlZV9kZXZpY2UgZmFpbGVkOiAlczogJXNcbiIsCisJCXByX2VycigiQUxTQTogc2VxOiBmcmVlX2RldmljZSBmYWlsZWQ6ICVzOiAlc1xuIiwKIAkJCSAgIGRldi0+bmFtZSwgZGV2LT5pZCk7CiAJfQogCkBAIC01NTksNyArNTU5LDcgQEAKIAlzbmRfaW5mb19mcmVlX2VudHJ5KGluZm9fZW50cnkpOwogI2VuZGlmCiAJaWYgKG51bV9vcHMpCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRyaXZlcnMgbm90IHJlbGVhc2VkICglZClcbiIsIG51bV9vcHMpOworCQlwcl9lcnIoIkFMU0E6IHNlcTogZHJpdmVycyBub3QgcmVsZWFzZWQgKCVkKVxuIiwgbnVtX29wcyk7CiB9CiAKIG1vZHVsZV9pbml0KGFsc2Ffc2VxX2RldmljZV9pbml0KQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2R1bW15LmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZHVtbXkuYwppbmRleCBkYmM1NTA3Li5lYzY2N2YxIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfZHVtbXkuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZHVtbXkuYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAJaW50IGk7CiAKIAlpZiAocG9ydHMgPCAxKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgbnVtYmVyIG9mIHBvcnRzICVkXG4iLCBwb3J0cyk7CisJCXByX2VycigiQUxTQTogc2VxX2R1bW15OiBpbnZhbGlkIG51bWJlciBvZiBwb3J0cyAlZFxuIiwgcG9ydHMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9maWZvLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZmlmby5jCmluZGV4IDBkNzVhZmEuLjU1OTk4OTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9maWZvLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2ZpZm8uYwpAQCAtMzQsNyArMzQsNyBAQAogCiAJZiA9IGt6YWxsb2Moc2l6ZW9mKCpmKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGYgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJtYWxsb2MgZmFpbGVkIGZvciBzbmRfc2VxX2ZpZm9fbmV3KCkgXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogbWFsbG9jIGZhaWxlZCBmb3Igc25kX3NlcV9maWZvX25ldygpIFxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2xvY2suYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9sb2NrLmMKaW5kZXggMmNmZTUwYy4uM2I2OTNlOSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX2xvY2suYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbG9jay5jCkBAIC0zMSwxMiArMzEsMTIgQEAKIAlpbnQgbWF4X2NvdW50ID0gNSAqIEhaOwogCiAJaWYgKGF0b21pY19yZWFkKGxvY2twKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2VxX2xvY2s6IGxvY2sgdHJvdWJsZSBbY291bnRlciA9ICVkXSBpbiAlczolZFxuIiwgYXRvbWljX3JlYWQobG9ja3ApLCBmaWxlLCBsaW5lKTsKKwkJcHJfd2FybigiQUxTQTogc2VxX2xvY2s6IGxvY2sgdHJvdWJsZSBbY291bnRlciA9ICVkXSBpbiAlczolZFxuIiwgYXRvbWljX3JlYWQobG9ja3ApLCBmaWxlLCBsaW5lKTsKIAkJcmV0dXJuOwogCX0KIAl3aGlsZSAoYXRvbWljX3JlYWQobG9ja3ApID4gMCkgewogCQlpZiAobWF4X2NvdW50ID09IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJzZXFfbG9jazogdGltZW91dCBbJWQgbGVmdF0gaW4gJXM6JWRcbiIsIGF0b21pY19yZWFkKGxvY2twKSwgZmlsZSwgbGluZSk7CisJCQlwcl93YXJuKCJBTFNBOiBzZXFfbG9jazogdGltZW91dCBbJWQgbGVmdF0gaW4gJXM6JWRcbiIsIGF0b21pY19yZWFkKGxvY2twKSwgZmlsZSwgbGluZSk7CiAJCQlicmVhazsKIAkJfQogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9tZW1vcnkuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9tZW1vcnkuYwppbmRleCBmNDc4Zjc3Li4xZTIwNmRlIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfbWVtb3J5LmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX21lbW9yeS5jCkBAIC0yMzYsNyArMjM2LDcgQEAKIAlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKIAlpZiAocG9vbC0+cHRyID09IE5VTEwpIHsJLyogbm90IGluaXRpYWxpemVkICovCi0JCXNuZF9wcmludGQoInNlcTogcG9vbCBpcyBub3QgaW5pdGlhbGl6ZWRcbiIpOworCQlwcl9kZWJ1ZygiQUxTQTogc2VxOiBwb29sIGlzIG5vdCBpbml0aWFsaXplZFxuIik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gX19lcnJvcjsKIAl9CkBAIC0zODgsNyArMzg4LDcgQEAKIAogCXBvb2wtPnB0ciA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbmRfc2VxX2V2ZW50X2NlbGwpICogcG9vbC0+c2l6ZSk7CiAJaWYgKHBvb2wtPnB0ciA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGQoInNlcTogbWFsbG9jIGZvciBzZXF1ZW5jZXIgZXZlbnRzIGZhaWxlZFxuIik7CisJCXByX2RlYnVnKCJBTFNBOiBzZXE6IG1hbGxvYyBmb3Igc2VxdWVuY2VyIGV2ZW50cyBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTQzMSw3ICs0MzEsNyBAQAogCiAJd2hpbGUgKGF0b21pY19yZWFkKCZwb29sLT5jb3VudGVyKSA+IDApIHsKIAkJaWYgKG1heF9jb3VudCA9PSAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAic25kX3NlcV9wb29sX2RvbmUgdGltZW91dDogJWQgY2VsbHMgcmVtYWluXG4iLCBhdG9taWNfcmVhZCgmcG9vbC0+Y291bnRlcikpOworCQkJcHJfd2FybigiQUxTQTogc25kX3NlcV9wb29sX2RvbmUgdGltZW91dDogJWQgY2VsbHMgcmVtYWluXG4iLCBhdG9taWNfcmVhZCgmcG9vbC0+Y291bnRlcikpOwogCQkJYnJlYWs7CiAJCX0KIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CkBAIC00NjQsNyArNDY0LDcgQEAKIAkvKiBjcmVhdGUgcG9vbCBibG9jayAqLwogCXBvb2wgPSBremFsbG9jKHNpemVvZigqcG9vbCksIEdGUF9LRVJORUwpOwogCWlmIChwb29sID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgic2VxOiBtYWxsb2MgZmFpbGVkIGZvciBwb29sXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogbWFsbG9jIGZhaWxlZCBmb3IgcG9vbFxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAlzcGluX2xvY2tfaW5pdCgmcG9vbC0+bG9jayk7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaS5jIGIvc291bmQvY29yZS9zZXEvc2VxX21pZGkuYwppbmRleCA2NDA2OWRiLi4zZTA1YzU1IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9taWRpLmMKQEAgLTEyMSw3ICsxMjEsNyBAQAogCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJaWYgKCh0bXAgPSBydW50aW1lLT5hdmFpbCkgPCBjb3VudCkgewogCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiTUlESSBvdXRwdXQgYnVmZmVyIG92ZXJydW5cbiIpOworCQkJcHJfZXJyKCJBTFNBOiBzZXFfbWlkaTogTUlESSBvdXRwdXQgYnVmZmVyIG92ZXJydW5cbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJaWYgKHNuZF9yYXdtaWRpX2tlcm5lbF93cml0ZShzdWJzdHJlYW0sIGJ1ZiwgY291bnQpIDwgY291bnQpCkBAIC0xNDUsNyArMTQ1LDcgQEAKIAlpZiAoZXYtPnR5cGUgPT0gU05EUlZfU0VRX0VWRU5UX1NZU0VYKSB7CS8qIHNwZWNpYWwgY2FzZSwgdG8gc2F2ZSBzcGFjZSAqLwogCQlpZiAoKGV2LT5mbGFncyAmIFNORFJWX1NFUV9FVkVOVF9MRU5HVEhfTUFTSykgIT0gU05EUlZfU0VRX0VWRU5UX0xFTkdUSF9WQVJJQUJMRSkgewogCQkJLyogaW52YWxpZCBldmVudCAqLwotCQkJc25kX3ByaW50ZCgic2VxX21pZGk6IGludmFsaWQgc3lzZXggZXZlbnQgZmxhZ3MgPSAweCV4XG4iLCBldi0+ZmxhZ3MpOworCQkJcHJfZGVidWcoIkFMU0E6IHNlcV9taWRpOiBpbnZhbGlkIHN5c2V4IGV2ZW50IGZsYWdzID0gMHgleFxuIiwgZXYtPmZsYWdzKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCXNuZF9zZXFfZHVtcF92YXJfZXZlbnQoZXYsIChzbmRfc2VxX2R1bXBfZnVuY190KWR1bXBfbWlkaSwgc3Vic3RyZWFtKTsKQEAgLTE4OSw3ICsxODksNyBAQAogCQkJCQkgICBtc3ludGgtPnN1YmRldmljZSwKIAkJCQkJICAgU05EUlZfUkFXTUlESV9MRkxHX0lOUFVULAogCQkJCQkgICAmbXN5bnRoLT5pbnB1dF9yZmlsZSkpIDwgMCkgewotCQlzbmRfcHJpbnRkKCJtaWRpIGlucHV0IG9wZW4gZmFpbGVkISEhXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcV9taWRpOiBtaWRpIGlucHV0IG9wZW4gZmFpbGVkISEhXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcnVudGltZSA9IG1zeW50aC0+aW5wdXRfcmZpbGUuaW5wdXQtPnJ1bnRpbWU7CkBAIC0yMzEsNyArMjMxLDcgQEAKIAkJCQkJICAgbXN5bnRoLT5zdWJkZXZpY2UsCiAJCQkJCSAgIFNORFJWX1JBV01JRElfTEZMR19PVVRQVVQsCiAJCQkJCSAgICZtc3ludGgtPm91dHB1dF9yZmlsZSkpIDwgMCkgewotCQlzbmRfcHJpbnRkKCJtaWRpIG91dHB1dCBvcGVuIGZhaWxlZCEhIVxuIik7CisJCXByX2RlYnVnKCJBTFNBOiBzZXFfbWlkaTogbWlkaSBvdXRwdXQgb3BlbiBmYWlsZWQhISFcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX21pZGlfZW11bC5jIGIvc291bmQvY29yZS9zZXEvc2VxX21pZGlfZW11bC5jCmluZGV4IDZmNjQ0NzEuLjliNjQ3MGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9taWRpX2VtdWwuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaV9lbXVsLmMKQEAgLTg5LDcgKzg5LDcgQEAKIAlpbnQgZGVzdF9jaGFubmVsID0gMDsKIAogCWlmIChldiA9PSBOVUxMIHx8IGNoYW5zZXQgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJldiBvciBjaGFuYmFzZSBOVUxMIChzbmRfbWlkaV9wcm9jZXNzX2V2ZW50KVxuIik7CisJCXByX2RlYnVnKCJBTFNBOiBzZXFfbWlkaV9lbXVsOiBldiBvciBjaGFuYmFzZSBOVUxMIChzbmRfbWlkaV9wcm9jZXNzX2V2ZW50KVxuIik7CiAJCXJldHVybjsKIAl9CiAJaWYgKGNoYW5zZXQtPmNoYW5uZWxzID09IE5VTEwpCkBAIC05OCw3ICs5OCw3IEBACiAJaWYgKHNuZF9zZXFfZXZfaXNfY2hhbm5lbF90eXBlKGV2KSkgewogCQlkZXN0X2NoYW5uZWwgPSBldi0+ZGF0YS5ub3RlLmNoYW5uZWw7CiAJCWlmIChkZXN0X2NoYW5uZWwgPj0gY2hhbnNldC0+bWF4X2NoYW5uZWxzKSB7Ci0JCQlzbmRfcHJpbnRkKCJkZXN0IGNoYW5uZWwgaXMgJWQsIG1heCBpcyAlZFxuIiwKKwkJCXByX2RlYnVnKCJBTFNBOiBzZXFfbWlkaV9lbXVsOiBkZXN0IGNoYW5uZWwgaXMgJWQsIG1heCBpcyAlZFxuIiwKIAkJCQkgICBkZXN0X2NoYW5uZWwsIGNoYW5zZXQtPm1heF9jaGFubmVscyk7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTIzMiw3ICsyMzIsNyBAQAogCWNhc2UgU05EUlZfU0VRX0VWRU5UX0VDSE86CiAJbm90X3lldDoKIAlkZWZhdWx0OgotCQkvKnNuZF9wcmludGQoIlVuaW1wbGVtZW50ZWQgZXZlbnQgJWRcbiIsIGV2LT50eXBlKTsqLworCQkvKnByX2RlYnVnKCJBTFNBOiBzZXFfbWlkaV9lbXVsOiBVbmltcGxlbWVudGVkIGV2ZW50ICVkXG4iLCBldi0+dHlwZSk7Ki8KIAkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX3BvcnRzLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfcG9ydHMuYwppbmRleCA5NTE2ZTVjLi43OTRhMzQxIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfcG9ydHMuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfcG9ydHMuYwpAQCAtMTM1LDE0ICsxMzUsMTQgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoY2xpZW50LT5udW1fcG9ydHMgPj0gU05EUlZfU0VRX01BWF9QT1JUUyAtIDEpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgInRvbyBtYW55IHBvcnRzIGZvciBjbGllbnQgJWRcbiIsIGNsaWVudC0+bnVtYmVyKTsKKwkJcHJfd2FybigiQUxTQTogc2VxOiB0b28gbWFueSBwb3J0cyBmb3IgY2xpZW50ICVkXG4iLCBjbGllbnQtPm51bWJlcik7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCS8qIGNyZWF0ZSBhIG5ldyBwb3J0ICovCiAJbmV3X3BvcnQgPSBremFsbG9jKHNpemVvZigqbmV3X3BvcnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoISBuZXdfcG9ydCkgewotCQlzbmRfcHJpbnRkKCJtYWxsb2MgZmFpbGVkIGZvciByZWdpc3RlcmluZyBjbGllbnQgcG9ydFxuIik7CisJCXByX2RlYnVnKCJBTFNBOiBzZXE6IG1hbGxvYyBmYWlsZWQgZm9yIHJlZ2lzdGVyaW5nIGNsaWVudCBwb3J0XG4iKTsKIAkJcmV0dXJuIE5VTEw7CS8qIGZhaWx1cmUsIG91dCBvZiBtZW1vcnkgKi8KIAl9CiAJLyogaW5pdCBwb3J0IGRhdGEgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9wcmlvcS5jIGIvc291bmQvY29yZS9zZXEvc2VxX3ByaW9xLmMKaW5kZXggMjk4OTZhYi4uMDIxYjAyYiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX3ByaW9xLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX3ByaW9xLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAogCWYgPSBremFsbG9jKHNpemVvZigqZiksIEdGUF9LRVJORUwpOwogCWlmIChmID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgib29wczogbWFsbG9jIGZhaWxlZCBmb3Igc25kX3NlcV9wcmlvcV9uZXcoKVxuIik7CisJCXByX2RlYnVnKCJBTFNBOiBzZXE6IG1hbGxvYyBmYWlsZWQgZm9yIHNuZF9zZXFfcHJpb3FfbmV3KClcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJCkBAIC03OSw3ICs3OSw3IEBACiAJKmZpZm8gPSBOVUxMOwogCiAJaWYgKGYgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJvb3BzOiBzbmRfc2VxX3ByaW9xX2RlbGV0ZSgpIGNhbGxlZCB3aXRoIE5VTEwgcHJpb3FcbiIpOworCQlwcl9kZWJ1ZygiQUxTQTogc2VxOiBzbmRfc2VxX3ByaW9xX2RlbGV0ZSgpIGNhbGxlZCB3aXRoIE5VTEwgcHJpb3FcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xOTcsNyArMTk3LDcgQEAKIAkJY3VyID0gY3VyLT5uZXh0OwogCQlpZiAoISAtLWNvdW50KSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmLT5sb2NrLCBmbGFncyk7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZmluZCBhIHBvaW50ZXIuLiBpbmZpbml0ZSBsb29wP1xuIik7CisJCQlwcl9lcnIoIkFMU0E6IHNlcTogY2Fubm90IGZpbmQgYSBwb2ludGVyLi4gaW5maW5pdGUgbG9vcD9cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0yMjMsNyArMjIzLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGYgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJvb3BzOiBzbmRfc2VxX3ByaW9xX2NlbGxfaW4oKSBjYWxsZWQgd2l0aCBOVUxMIHByaW9xXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogc25kX3NlcV9wcmlvcV9jZWxsX2luKCkgY2FsbGVkIHdpdGggTlVMTCBwcmlvcVxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZi0+bG9jaywgZmxhZ3MpOwpAQCAtMjQ4LDcgKzI0OCw3IEBACiBpbnQgc25kX3NlcV9wcmlvcV9hdmFpbChzdHJ1Y3Qgc25kX3NlcV9wcmlvcSAqIGYpCiB7CiAJaWYgKGYgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJvb3BzOiBzbmRfc2VxX3ByaW9xX2NlbGxfaW4oKSBjYWxsZWQgd2l0aCBOVUxMIHByaW9xXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogc25kX3NlcV9wcmlvcV9jZWxsX2luKCkgY2FsbGVkIHdpdGggTlVMTCBwcmlvcVxuIik7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gZi0+Y2VsbHM7CkBAIC0yNTksNyArMjU5LDcgQEAKIHN0cnVjdCBzbmRfc2VxX2V2ZW50X2NlbGwgKnNuZF9zZXFfcHJpb3FfY2VsbF9wZWVrKHN0cnVjdCBzbmRfc2VxX3ByaW9xICogZikKIHsKIAlpZiAoZiA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGQoIm9vcHM6IHNuZF9zZXFfcHJpb3FfY2VsbF9pbigpIGNhbGxlZCB3aXRoIE5VTEwgcHJpb3FcbiIpOworCQlwcl9kZWJ1ZygiQUxTQTogc2VxOiBzbmRfc2VxX3ByaW9xX2NlbGxfaW4oKSBjYWxsZWQgd2l0aCBOVUxMIHByaW9xXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCXJldHVybiBmLT5oZWFkOwpAQCAtMzIxLDcgKzMyMSw3IEBACiAJCQlmcmVlcHJldiA9IGNlbGw7CiAJCX0gZWxzZSB7CiAjaWYgMAotCQkJcHJpbnRrKEtFUk5fREVCVUcgInR5cGUgPSAlaSwgc291cmNlID0gJWksIGRlc3QgPSAlaSwgIgorCQkJcHJfZGVidWcoIkFMU0E6IHNlcTogdHlwZSA9ICVpLCBzb3VyY2UgPSAlaSwgZGVzdCA9ICVpLCAiCiAJCQkgICAgICAgImNsaWVudCA9ICVpXG4iLAogCQkJCWNlbGwtPmV2ZW50LnR5cGUsCiAJCQkJY2VsbC0+ZXZlbnQuc291cmNlLmNsaWVudCwKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9xdWV1ZS5jIGIvc291bmQvY29yZS9zZXEvc2VxX3F1ZXVlLmMKaW5kZXggZjkwNzczNi4uYWFkNDg3OCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX3F1ZXVlLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX3F1ZXVlLmMKQEAgLTExMiw3ICsxMTIsNyBAQAogCiAJcSA9IGt6YWxsb2Moc2l6ZW9mKCpxKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHEgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJtYWxsb2MgZmFpbGVkIGZvciBzbmRfc2VxX3F1ZXVlX25ldygpXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogbWFsbG9jIGZhaWxlZCBmb3Igc25kX3NlcV9xdWV1ZV9uZXcoKVxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX3RpbWVyLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfdGltZXIuYwppbmRleCAyNGQ0NGIyLi5lNzM2MDUzIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfdGltZXIuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfdGltZXIuYwpAQCAtNTcsNyArNTcsNyBAQAogCQogCXRtciA9IGt6YWxsb2Moc2l6ZW9mKCp0bXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAodG1yID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgibWFsbG9jIGZhaWxlZCBmb3Igc25kX3NlcV90aW1lcl9uZXcoKSBcbiIpOworCQlwcl9kZWJ1ZygiQUxTQTogc2VxOiBtYWxsb2MgZmFpbGVkIGZvciBzbmRfc2VxX3RpbWVyX25ldygpIFxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAlzcGluX2xvY2tfaW5pdCgmdG1yLT5sb2NrKTsKQEAgLTc4LDcgKzc4LDcgQEAKIAkqdG1yID0gTlVMTDsKIAogCWlmICh0ID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgib29wczogc25kX3NlcV90aW1lcl9kZWxldGUoKSBjYWxsZWQgd2l0aCBOVUxMIHRpbWVyXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogc25kX3NlcV90aW1lcl9kZWxldGUoKSBjYWxsZWQgd2l0aCBOVUxMIHRpbWVyXG4iKTsKIAkJcmV0dXJuOwogCX0KIAl0LT5ydW5uaW5nID0gMDsKQEAgLTE5OSw3ICsxOTksNyBAQAogCQkvKiByZWZ1c2UgdG8gY2hhbmdlIHBwcSBvbiBydW5uaW5nIHRpbWVycyAqLwogCQkvKiBiZWNhdXNlIGl0IHdpbGwgdXBzZXQgdGhlIHNvbmcgcG9zaXRpb24gKHRpY2tzKSAqLwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0bXItPmxvY2ssIGZsYWdzKTsKLQkJc25kX3ByaW50ZCgic2VxOiBjYW5ub3QgY2hhbmdlIHBwcSBvZiBhIHJ1bm5pbmcgdGltZXJcbiIpOworCQlwcl9kZWJ1ZygiQUxTQTogc2VxOiBjYW5ub3QgY2hhbmdlIHBwcSBvZiBhIHJ1bm5pbmcgdGltZXJcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtMjUyLDcgKzI1Miw3IEBACiAKIAkvKiBGSVhNRSAqLwogCWlmIChiYXNlICE9IFNLRVdfQkFTRSkgewotCQlzbmRfcHJpbnRkKCJpbnZhbGlkIHNrZXcgYmFzZSAweCV4XG4iLCBiYXNlKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogaW52YWxpZCBza2V3IGJhc2UgMHgleFxuIiwgYmFzZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmdG1yLT5sb2NrLCBmbGFncyk7CkBAIC0yOTIsNyArMjkyLDcgQEAKIAkJfQogCX0KIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJzZXEgZmF0YWwgZXJyb3I6IGNhbm5vdCBjcmVhdGUgdGltZXIgKCVpKVxuIiwgZXJyKTsKKwkJcHJfZXJyKCJBTFNBOiBzZXEgZmF0YWwgZXJyb3I6IGNhbm5vdCBjcmVhdGUgdGltZXIgKCVpKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJdC0+Y2FsbGJhY2sgPSBzbmRfc2VxX3RpbWVyX2ludGVycnVwdDsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV92aXJtaWRpLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfdmlybWlkaS5jCmluZGV4IDRiNTBlNjAuLjU2ZTBmNGNkIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfdmlybWlkaS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV92aXJtaWRpLmMKQEAgLTQ0Niw3ICs0NDYsNyBAQAogCQkvKiBzaG91bGQgY2hlY2sgcHJlc2VuY2Ugb2YgcG9ydCBtb3JlIHN0cmljdGx5Li4gKi8KIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic2VxX21vZGUgaXMgbm90IHNldDogJWRcbiIsIHJkZXYtPnNlcV9tb2RlKTsKKwkJcHJfZXJyKCJBTFNBOiBzZXFfdmlybWlkaTogc2VxX21vZGUgaXMgbm90IHNldDogJWRcbiIsIHJkZXYtPnNlcV9tb2RlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zb3VuZC5jIGIvc291bmQvY29yZS9zb3VuZC5jCmluZGV4IDQzN2MyNWUuLjM4YWQxYTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc291bmQuYworKysgYi9zb3VuZC9jb3JlL3NvdW5kLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogCWlmIChtcmVnICYmIG1yZWctPnR5cGUgPT0gdHlwZSkgewogCQlwcml2YXRlX2RhdGEgPSBtcmVnLT5wcml2YXRlX2RhdGE7CiAJCWlmIChwcml2YXRlX2RhdGEgJiYgbXJlZy0+Y2FyZF9wdHIpCi0JCQlhdG9taWNfaW5jKCZtcmVnLT5jYXJkX3B0ci0+cmVmY291bnQpOworCQkJZ2V0X2RldmljZSgmbXJlZy0+Y2FyZF9wdHItPmNhcmRfZGV2KTsKIAl9IGVsc2UKIAkJcHJpdmF0ZV9kYXRhID0gTlVMTDsKIAltdXRleF91bmxvY2soJnNvdW5kX211dGV4KTsKQEAgLTM1NSwyMiArMzU1LDI1IEBACiAKIEVYUE9SVF9TWU1CT0woc25kX3VucmVnaXN0ZXJfZGV2aWNlKTsKIAotaW50IHNuZF9hZGRfZGV2aWNlX3N5c2ZzX2ZpbGUoaW50IHR5cGUsIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldiwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyKQorLyogZ2V0IHRoZSBhc3NpZ25lZCBkZXZpY2UgdG8gdGhlIGdpdmVuIHR5cGUgYW5kIGRldmljZSBudW1iZXI7CisgKiB0aGUgY2FsbGVyIG5lZWRzIHRvIHJlbGVhc2UgaXQgdmlhIHB1dF9kZXZpY2UoKSBhZnRlciB1c2luZyBpdAorICovCitzdHJ1Y3QgZGV2aWNlICpzbmRfZ2V0X2RldmljZShpbnQgdHlwZSwgc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2KQogewotCWludCBtaW5vciwgcmV0ID0gLUVJTlZBTDsKLQlzdHJ1Y3QgZGV2aWNlICpkOworCWludCBtaW5vcjsKKwlzdHJ1Y3QgZGV2aWNlICpkID0gTlVMTDsKIAogCW11dGV4X2xvY2soJnNvdW5kX211dGV4KTsKIAltaW5vciA9IGZpbmRfc25kX21pbm9yKHR5cGUsIGNhcmQsIGRldik7Ci0JaWYgKG1pbm9yID49IDAgJiYgKGQgPSBzbmRfbWlub3JzW21pbm9yXS0+ZGV2KSAhPSBOVUxMKQotCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZCwgYXR0cik7CisJaWYgKG1pbm9yID49IDApIHsKKwkJZCA9IHNuZF9taW5vcnNbbWlub3JdLT5kZXY7CisJCWlmIChkKQorCQkJZ2V0X2RldmljZShkKTsKKwl9CiAJbXV0ZXhfdW5sb2NrKCZzb3VuZF9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLQorCXJldHVybiBkOwogfQotCi1FWFBPUlRfU1lNQk9MKHNuZF9hZGRfZGV2aWNlX3N5c2ZzX2ZpbGUpOworRVhQT1JUX1NZTUJPTChzbmRfZ2V0X2RldmljZSk7CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogLyoKQEAgLTQ1OCw3ICs0NjEsNyBAQAogCXNuZF9tYWpvciA9IG1ham9yOwogCXNuZF9lY2FyZHNfbGltaXQgPSBjYXJkc19saW1pdDsKIAlpZiAocmVnaXN0ZXJfY2hyZGV2KG1ham9yLCAiYWxzYSIsICZzbmRfZm9wcykpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIG5hdGl2ZSBtYWpvciBkZXZpY2UgbnVtYmVyICVkXG4iLCBtYWpvcik7CisJCXByX2VycigiQUxTQSBjb3JlOiB1bmFibGUgdG8gcmVnaXN0ZXIgbmF0aXZlIG1ham9yIGRldmljZSBudW1iZXIgJWRcbiIsIG1ham9yKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCWlmIChzbmRfaW5mb19pbml0KCkgPCAwKSB7CkBAIC00NjcsNyArNDcwLDcgQEAKIAl9CiAJc25kX2luZm9fbWlub3JfcmVnaXN0ZXIoKTsKICNpZm5kZWYgTU9EVUxFCi0JcHJpbnRrKEtFUk5fSU5GTyAiQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlIERyaXZlciBJbml0aWFsaXplZC5cbiIpOworCXByX2luZm8oIkFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZSBEcml2ZXIgSW5pdGlhbGl6ZWQuXG4iKTsKICNlbmRpZgogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zb3VuZF9vc3MuYyBiL3NvdW5kL2NvcmUvc291bmRfb3NzLmMKaW5kZXggNzI2YTQ5YS4uNTczYTY1ZSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zb3VuZF9vc3MuYworKysgYi9zb3VuZC9jb3JlL3NvdW5kX29zcy5jCkBAIC0yMSw3ICsyMSw3IEBACiAKICNpZmRlZiBDT05GSUdfU05EX09TU0VNVUwKIAotI2lmICFkZWZpbmVkKENPTkZJR19TT1VORCkgJiYgIShkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfU09VTkRfTU9EVUxFKSkKKyNpZiAhSVNfRU5BQkxFRChDT05GSUdfU09VTkQpCiAjZXJyb3IgIkVuYWJsZSB0aGUgT1NTIHNvdW5kY29yZSBtdWx0aXBsZXhlciAoQ09ORklHX1NPVU5EKSBpbiB0aGUga2VybmVsLiIKICNlbmRpZgogCkBAIC01NSw3ICs1NSw3IEBACiAJaWYgKG1yZWcgJiYgbXJlZy0+dHlwZSA9PSB0eXBlKSB7CiAJCXByaXZhdGVfZGF0YSA9IG1yZWctPnByaXZhdGVfZGF0YTsKIAkJaWYgKHByaXZhdGVfZGF0YSAmJiBtcmVnLT5jYXJkX3B0cikKLQkJCWF0b21pY19pbmMoJm1yZWctPmNhcmRfcHRyLT5yZWZjb3VudCk7CisJCQlnZXRfZGV2aWNlKCZtcmVnLT5jYXJkX3B0ci0+Y2FyZF9kZXYpOwogCX0gZWxzZQogCQlwcml2YXRlX2RhdGEgPSBOVUxMOwogCW11dGV4X3VubG9jaygmc291bmRfb3NzX211dGV4KTsKQEAgLTEwNSw4ICsxMDUsNyBAQAogfQogCiBpbnQgc25kX3JlZ2lzdGVyX29zc19kZXZpY2UoaW50IHR5cGUsIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldiwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmX29wcywgdm9pZCAqcHJpdmF0ZV9kYXRhLAotCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUpCisJCQkgICAgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZl9vcHMsIHZvaWQgKnByaXZhdGVfZGF0YSkKIHsKIAlpbnQgbWlub3IgPSBzbmRfb3NzX2tlcm5lbF9taW5vcih0eXBlLCBjYXJkLCBkZXYpOwogCWludCBtaW5vcl91bml0OwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS90aW1lci5jIGIvc291bmQvY29yZS90aW1lci5jCmluZGV4IDZkZGNmMDYuLmNmZDQ1NWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvdGltZXIuYworKysgYi9zb3VuZC9jb3JlL3RpbWVyLmMKQEAgLTM1LDkgKzM1LDkgQEAKICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfU05EX0hSVElNRVIpIHx8IGRlZmluZWQoQ09ORklHX1NORF9IUlRJTUVSX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfSFJUSU1FUikKICNkZWZpbmUgREVGQVVMVF9USU1FUl9MSU1JVCA0Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19TTkRfUlRDVElNRVIpIHx8IGRlZmluZWQoQ09ORklHX1NORF9SVENUSU1FUl9NT0RVTEUpCisjZWxpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfUlRDVElNRVIpCiAjZGVmaW5lIERFRkFVTFRfVElNRVJfTElNSVQgMgogI2Vsc2UKICNkZWZpbmUgREVGQVVMVF9USU1FUl9MSU1JVCAxCkBAIC0yNDAsNyArMjQwLDggQEAKIAkJLyogb3BlbiBhIHNsYXZlIGluc3RhbmNlICovCiAJCWlmICh0aWQtPmRldl9zY2xhc3MgPD0gU05EUlZfVElNRVJfU0NMQVNTX05PTkUgfHwKIAkJICAgIHRpZC0+ZGV2X3NjbGFzcyA+IFNORFJWX1RJTUVSX1NDTEFTU19PU1NfU0VRVUVOQ0VSKSB7Ci0JCQlzbmRfcHJpbnRkKCJpbnZhbGlkIHNsYXZlIGNsYXNzICVpXG4iLCB0aWQtPmRldl9zY2xhc3MpOworCQkJcHJfZGVidWcoIkFMU0E6IHRpbWVyOiBpbnZhbGlkIHNsYXZlIGNsYXNzICVpXG4iLAorCQkJCSB0aWQtPmRldl9zY2xhc3MpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwpAQCAtNzc0LDcgKzc3NSw3IEBACiAJCSpydGltZXIgPSBOVUxMOwogCXRpbWVyID0ga3phbGxvYyhzaXplb2YoKnRpbWVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHRpbWVyID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidGltZXI6IGNhbm5vdCBhbGxvY2F0ZVxuIik7CisJCXByX2VycigiQUxTQTogdGltZXI6IGNhbm5vdCBhbGxvY2F0ZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAl0aW1lci0+dG1yX2NsYXNzID0gdGlkLT5kZXZfY2xhc3M7CkBAIC04MTMsNyArODE0LDcgQEAKIAlpZiAoISBsaXN0X2VtcHR5KCZ0aW1lci0+b3Blbl9saXN0X2hlYWQpKSB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOwogCQlzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlICp0aTsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgInRpbWVyICVwIGlzIGJ1c3k/XG4iLCB0aW1lcik7CisJCXByX3dhcm4oIkFMU0E6IHRpbWVyICVwIGlzIGJ1c3k/XG4iLCB0aW1lcik7CiAJCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmdGltZXItPm9wZW5fbGlzdF9oZWFkKSB7CiAJCQlsaXN0X2RlbF9pbml0KHApOwogCQkJdGkgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2UsIG9wZW5fbGlzdCk7CkBAIC0xOTU1LDEyICsxOTU2LDEwIEBACiAjZW5kaWYKIAogCWlmICgoZXJyID0gc25kX3RpbWVyX3JlZ2lzdGVyX3N5c3RlbSgpKSA8IDApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZWdpc3RlciBzeXN0ZW0gdGltZXIgKCVpKVxuIiwKLQkJCSAgIGVycik7CisJCXByX2VycigiQUxTQTogdW5hYmxlIHRvIHJlZ2lzdGVyIHN5c3RlbSB0aW1lciAoJWkpXG4iLCBlcnIpOwogCWlmICgoZXJyID0gc25kX3JlZ2lzdGVyX2RldmljZShTTkRSVl9ERVZJQ0VfVFlQRV9USU1FUiwgTlVMTCwgMCwKIAkJCQkgICAgICAgJnNuZF90aW1lcl9mX29wcywgTlVMTCwgInRpbWVyIikpIDwgMCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIHRpbWVyIGRldmljZSAoJWkpXG4iLAotCQkJICAgZXJyKTsKKwkJcHJfZXJyKCJBTFNBOiB1bmFibGUgdG8gcmVnaXN0ZXIgdGltZXIgZGV2aWNlICglaSlcbiIsIGVycik7CiAJc25kX3RpbWVyX3Byb2NfaW5pdCgpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS92bWFzdGVyLmMgYi9zb3VuZC9jb3JlL3ZtYXN0ZXIuYwppbmRleCA4NDJhOTdkLi42YzU4ZTZmIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3ZtYXN0ZXIuYworKysgYi9zb3VuZC9jb3JlL3ZtYXN0ZXIuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJaWYgKHNsYXZlLT5pbmZvLmNvdW50ID4gMiAgfHwKIAkgICAgKHNsYXZlLT5pbmZvLnR5cGUgIT0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSICYmCiAJICAgICBzbGF2ZS0+aW5mby50eXBlICE9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTikpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBzbGF2ZSBlbGVtZW50XG4iKTsKKwkJcHJfZXJyKCJBTFNBOiB2bWFzdGVyOiBpbnZhbGlkIHNsYXZlIGVsZW1lbnRcbiIpOwogCQlrZnJlZSh1aW5mbyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvYWxvb3AuYyBiL3NvdW5kL2RyaXZlcnMvYWxvb3AuYwppbmRleCBmNzU4OTkyLi4yYTE2Yzg2IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL2Fsb29wLmMKKysrIGIvc291bmQvZHJpdmVycy9hbG9vcC5jCkBAIC0xMTQyLDggKzExNDIsOCBAQAogCWludCBkZXYgPSBkZXZwdHItPmlkOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IGxvb3BiYWNrKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmZGV2cHRyLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBsb29wYmFjayksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlsb29wYmFjayA9IGNhcmQtPnByaXZhdGVfZGF0YTsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvZHVtbXkuYyBiL3NvdW5kL2RyaXZlcnMvZHVtbXkuYwppbmRleCA5MTViNGQ3Li5mYWI5MGJkIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL2R1bW15LmMKKysrIGIvc291bmQvZHJpdmVycy9kdW1teS5jCkBAIC0xMDU0LDggKzEwNTQsOCBAQAogCWludCBpZHgsIGVycjsKIAlpbnQgZGV2ID0gZGV2cHRyLT5pZDsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2R1bW15KSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmZGV2cHRyLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfZHVtbXkpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJZHVtbXkgPSBjYXJkLT5wcml2YXRlX2RhdGE7CkBAIC0xMTE0LDggKzExMTQsNiBAQAogCiAJZHVtbXlfcHJvY19pbml0KGR1bW15KTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmRldnB0ci0+ZGV2KTsKLQogCWVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChlcnIgPT0gMCkgewogCQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXZwdHIsIGNhcmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9tbDQwMy1hYzk3Y3IuYyBiL3NvdW5kL2RyaXZlcnMvbWw0MDMtYWM5N2NyLmMKaW5kZXggOTVlYTRhMS4uMzNlZDc2NSAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9tbDQwMy1hYzk3Y3IuYworKysgYi9zb3VuZC9kcml2ZXJzL21sNDAzLWFjOTdjci5jCkBAIC0xMjgwLDcgKzEyODAsOCBAQAogCWlmICghZW5hYmxlW2Rldl0pCiAJCXJldHVybiAtRU5PRU5UOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwZmRldi0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAllcnIgPSBzbmRfbWw0MDNfYWM5N2NyX2NyZWF0ZShjYXJkLCBwZmRldiwgJm1sNDAzX2FjOTdjcik7CkBAIC0xMzEwLDggKzEzMTEsNiBAQAogCQkodW5zaWduZWQgbG9uZyltbDQwM19hYzk3Y3ItPnBvcnQsIG1sNDAzX2FjOTdjci0+aXJxLAogCQltbDQwM19hYzk3Y3ItPmNhcHR1cmVfaXJxLCBkZXYgKyAxKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBmZGV2LT5kZXYpOwotCiAJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvbXB1NDAxL21wdTQwMS5jIGIvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxLmMKaW5kZXggOTBhM2E3Yi4uODMwMTRiOCAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxLmMKKysrIGIvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxLmMKQEAgLTY0LDcgKzY0LDggQEAKIHN0YXRpYyBpbnQgcG5wX3JlZ2lzdGVyZWQ7CiBzdGF0aWMgdW5zaWduZWQgaW50IHNuZF9tcHU0MDFfZGV2aWNlczsKIAotc3RhdGljIGludCBzbmRfbXB1NDAxX2NyZWF0ZShpbnQgZGV2LCBzdHJ1Y3Qgc25kX2NhcmQgKipyY2FyZCkKK3N0YXRpYyBpbnQgc25kX21wdTQwMV9jcmVhdGUoc3RydWN0IGRldmljZSAqZGV2cHRyLCBpbnQgZGV2LAorCQkJICAgICBzdHJ1Y3Qgc25kX2NhcmQgKipyY2FyZCkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycjsKQEAgLTczLDcgKzc0LDggQEAKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAidGhlIHVhcnRfZW50ZXIgb3B0aW9uIGlzIG9ic29sZXRlOyByZW1vdmUgaXRcbiIpOwogCiAJKnJjYXJkID0gTlVMTDsKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoZGV2cHRyLCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiTVBVLTQwMSBVQVJUIik7CkBAIC0xMTQsMTAgKzExNiw5IEBACiAJCXNuZF9wcmludGsoS0VSTl9FUlIgInNwZWNpZnkgb3IgZGlzYWJsZSBJUlFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JZXJyID0gc25kX21wdTQwMV9jcmVhdGUoZGV2LCAmY2FyZCk7CisJZXJyID0gc25kX21wdTQwMV9jcmVhdGUoJmRldnB0ci0+ZGV2LCBkZXYsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZkZXZwdHItPmRldik7CiAJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CkBAIC0xOTQsMTQgKzE5NSwxMyBAQAogCQllcnIgPSBzbmRfbXB1NDAxX3BucChkZXYsIHBucF9kZXYsIGlkKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwotCQllcnIgPSBzbmRfbXB1NDAxX2NyZWF0ZShkZXYsICZjYXJkKTsKKwkJZXJyID0gc25kX21wdTQwMV9jcmVhdGUoJnBucF9kZXYtPmRldiwgZGV2LCAmY2FyZCk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAkJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7CiAJCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQkJcmV0dXJuIGVycjsKIAkJfQotCQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwbnBfZGV2LT5kZXYpOwogCQlwbnBfc2V0X2RydmRhdGEocG5wX2RldiwgY2FyZCk7CiAJCXNuZF9tcHU0MDFfZGV2aWNlcysrOwogCQkrK2RldjsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvbXRwYXYuYyBiL3NvdW5kL2RyaXZlcnMvbXRwYXYuYwppbmRleCBlNWVjN2ViLi40YjY2YzdmIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL210cGF2LmMKKysrIGIvc291bmQvZHJpdmVycy9tdHBhdi5jCkBAIC02OTcsNyArNjk3LDggQEAKIAlpbnQgZXJyOwogCXN0cnVjdCBtdHBhdiAqbXRwX2NhcmQ7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgc2l6ZW9mKCptdHBfY2FyZCksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmRldi0+ZGV2LCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKCptdHBfY2FyZCksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtNzMyLDcgKzczMyw2IEBACiAKIAlzbmRfbXRwYXZfcG9ydHNjYW4obXRwX2NhcmQpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2LT5kZXYpOwogCWVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKG10cF9jYXJkLT5jYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBfX2Vycm9yOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9tdHM2NC5jIGIvc291bmQvZHJpdmVycy9tdHM2NC5jCmluZGV4IDRlMGRkMjIuLmY1ZmQ0NDggMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvbXRzNjQuYworKysgYi9zb3VuZC9kcml2ZXJzL210czY0LmMKQEAgLTk1OSw3ICs5NTksOCBAQAogCWlmICgoZXJyID0gc25kX210czY0X3Byb2JlX3BvcnQocCkpIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGRldi0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRkKCJDYW5ub3QgY3JlYXRlIGNhcmRcbiIpOwogCQlyZXR1cm4gZXJyOwpAQCAtMTAwOSw4ICsxMDEwLDYgQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGRldi0+ZGV2KTsKLQogCS8qIEF0IHRoaXMgcG9pbnQgY2FyZCB3aWxsIGJlIHVzYWJsZSAqLwogCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgewogCQlzbmRfcHJpbnRkKCJDYW5ub3QgcmVnaXN0ZXIgY2FyZFxuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19saWIuYyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX2xpYi5jCmluZGV4IDMzZDlhODUuLmY2NmFmNTggMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX2xpYi5jCisrKyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX2xpYi5jCkBAIC01MDEsMTAgKzUwMSw4IEBACiAJaHctPnByaXZhdGVfZGF0YSA9IG9wbDM7CiAJaHctPmV4Y2x1c2l2ZSA9IDE7CiAjaWZkZWYgQ09ORklHX1NORF9PU1NFTVVMCi0JaWYgKGRldmljZSA9PSAwKSB7CisJaWYgKGRldmljZSA9PSAwKQogCQlody0+b3NzX3R5cGUgPSBTTkRSVl9PU1NfREVWSUNFX1RZUEVfRE1GTTsKLQkJc3ByaW50Zihody0+b3NzX2RldiwgImRtZm0laSIsIGNhcmQtPm51bWJlcik7Ci0JfQogI2VuZGlmCiAJc3RyY3B5KGh3LT5uYW1lLCBody0+aWQpOwogCXN3aXRjaCAob3BsMy0+aGFyZHdhcmUgJiBPUEwzX0hXX01BU0spIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3N5bnRoLmMgYi9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19zeW50aC5jCmluZGV4IDc0MmE0YjYuLmRkY2MxYTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3N5bnRoLmMKKysrIGIvc291bmQvZHJpdmVycy9vcGwzL29wbDNfc3ludGguYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPHNvdW5kL29wbDMuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRfZm0uaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1NORF9TRVFVRU5DRVIpIHx8IGRlZmluZWQoQ09ORklHX1NORF9TRVFVRU5DRVJfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9TRVFVRU5DRVIpCiAjZGVmaW5lIE9QTDNfU1VQUE9SVF9TWU5USAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwLmMgYi9zb3VuZC9kcml2ZXJzL3Bjc3AvcGNzcC5jCmluZGV4IDMyOGJkMjkuLjM2ODA4Y2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwLmMKKysrIGIvc291bmQvZHJpdmVycy9wY3NwL3Bjc3AuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJaHJ0aW1lcl9pbml0KCZwY3NwX2NoaXAudGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CiAJcGNzcF9jaGlwLnRpbWVyLmZ1bmN0aW9uID0gcGNzcF9kb190aW1lcjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KGRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xMjcsOCArMTI3LDYgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KHBjc3BfY2hpcC5jYXJkLCBkZXYpOwotCiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgIlBDLVNwZWFrZXIiKTsKIAlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAicGNzcCIpOwogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICJJbnRlcm5hbCBQQy1TcGVha2VyIGF0IHBvcnQgMHgleCIsCmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL3Bjc3AvcGNzcF9pbnB1dC5jIGIvc291bmQvZHJpdmVycy9wY3NwL3Bjc3BfaW5wdXQuYwppbmRleCBiODc0YjBhLi4wZWNmOGE0IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL3Bjc3AvcGNzcF9pbnB1dC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwX2lucHV0LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgInBjc3AuaCIKKyNpbmNsdWRlICJwY3NwX2lucHV0LmgiCiAKIHN0YXRpYyB2b2lkIHBjc3Brcl9kb19zb3VuZCh1bnNpZ25lZCBpbnQgY291bnQpCiB7CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL3BvcnRtYW4yeDQuYyBiL3NvdW5kL2RyaXZlcnMvcG9ydG1hbjJ4NC5jCmluZGV4IDk5MTAxOGQuLjc4Y2NmYTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvcG9ydG1hbjJ4NC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvcG9ydG1hbjJ4NC5jCkBAIC03NDgsNyArNzQ4LDggQEAKIAlpZiAoKGVyciA9IHNuZF9wb3J0bWFuX3Byb2JlX3BvcnQocCkpIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGRldi0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRkKCJDYW5ub3QgY3JlYXRlIGNhcmRcbiIpOwogCQlyZXR1cm4gZXJyOwpAQCAtNzk4LDggKzc5OSw2IEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBkZXYtPmRldik7Ci0KIAkvKiBBdCB0aGlzIHBvaW50IGNhcmQgd2lsbCBiZSB1c2FibGUgKi8KIAlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKIAkJc25kX3ByaW50ZCgiQ2Fubm90IHJlZ2lzdGVyIGNhcmRcbiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9zZXJpYWwtdTE2NTUwLmMgYi9zb3VuZC9kcml2ZXJzL3NlcmlhbC11MTY1NTAuYwppbmRleCBlMGJmNWU3Li45YWQ0NDE0IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL3NlcmlhbC11MTY1NTAuYworKysgYi9zb3VuZC9kcml2ZXJzL3NlcmlhbC11MTY1NTAuYwpAQCAtOTQyLDcgKzk0Miw4IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWVyciAgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgID0gc25kX2NhcmRfbmV3KCZkZXZwdHItPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC05NjksOCArOTcwLDYgQEAKIAkJdWFydC0+YmFzZSwKIAkJdWFydC0+aXJxKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmRldnB0ci0+ZGV2KTsKLQogCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkKIAkJZ290byBfZXJyOwogCmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL3Zpcm1pZGkuYyBiL3NvdW5kL2RyaXZlcnMvdmlybWlkaS5jCmluZGV4IGFjZTM4NzkuLmIxNzg3MjQyOSAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy92aXJtaWRpLmMKKysrIGIvc291bmQvZHJpdmVycy92aXJtaWRpLmMKQEAgLTkwLDggKzkwLDggQEAKIAlpbnQgaWR4LCBlcnI7CiAJaW50IGRldiA9IGRldnB0ci0+aWQ7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX3Zpcm1pZGkpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZkZXZwdHItPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX3Zpcm1pZGkpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJdm1pZGkgPSBjYXJkLT5wcml2YXRlX2RhdGE7CkBAIC0xMTgsOCArMTE4LDYgQEAKIAlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiVmlyTUlESSIpOwogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICJWaXJ0dWFsIE1JREkgQ2FyZCAlaSIsIGRldiArIDEpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2cHRyLT5kZXYpOwotCiAJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPT0gMCkgewogCQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXZwdHIsIGNhcmQpOwogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2RpY2UuYyBiL3NvdW5kL2ZpcmV3aXJlL2RpY2UuYwppbmRleCBjMGFhNjQ5Li4wYzM5NDg2IDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS9kaWNlLmMKKysrIGIvc291bmQvZmlyZXdpcmUvZGljZS5jCkBAIC0xMzI2LDEwICsxMzI2LDEwIEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoLTEsIE5VTEwsIFRISVNfTU9EVUxFLCBzaXplb2YoKmRpY2UpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZ1bml0LT5kZXZpY2UsIC0xLCBOVUxMLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZigqZGljZSksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZ1bml0LT5kZXZpY2UpOwogCiAJZGljZSA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlkaWNlLT5jYXJkID0gY2FyZDsKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2lzaWdodC5jIGIvc291bmQvZmlyZXdpcmUvaXNpZ2h0LmMKaW5kZXggZmQ0MmU2Yi4uN2FjOTQ0MyAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvaXNpZ2h0LmMKKysrIGIvc291bmQvZmlyZXdpcmUvaXNpZ2h0LmMKQEAgLTYzMSwxMCArNjMxLDEwIEBACiAJc3RydWN0IGlzaWdodCAqaXNpZ2h0OwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoLTEsIE5VTEwsIFRISVNfTU9EVUxFLCBzaXplb2YoKmlzaWdodCksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnVuaXQtPmRldmljZSwgLTEsIE5VTEwsIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKCppc2lnaHQpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmdW5pdC0+ZGV2aWNlKTsKIAogCWlzaWdodCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlpc2lnaHQtPmNhcmQgPSBjYXJkOwpkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvc2NzMXguYyBiL3NvdW5kL2ZpcmV3aXJlL3NjczF4LmMKaW5kZXggODU4MDIzYy4uMmRiYTg0OCAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvc2NzMXguYworKysgYi9zb3VuZC9maXJld2lyZS9zY3MxeC5jCkBAIC0zOTEsMTAgKzM5MSwxMCBAQAogCXN0cnVjdCBzY3MgKnNjczsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKC0xNiwgTlVMTCwgVEhJU19NT0RVTEUsIHNpemVvZigqc2NzKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmdW5pdC0+ZGV2aWNlLCAtMTYsIE5VTEwsIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKCpzY3MpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmdW5pdC0+ZGV2aWNlKTsKIAogCXNjcyA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlzY3MtPmNhcmQgPSBjYXJkOwpkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvc3BlYWtlcnMuYyBiL3NvdW5kL2ZpcmV3aXJlL3NwZWFrZXJzLmMKaW5kZXggY2M4YmMzYS4uOWY3ZWYyMSAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvc3BlYWtlcnMuYworKysgYi9zb3VuZC9maXJld2lyZS9zcGVha2Vycy5jCkBAIC02NjgsMTAgKzY2OCwxMCBAQAogCXUzMiBmaXJtd2FyZTsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKC0xLCBOVUxMLCBUSElTX01PRFVMRSwgc2l6ZW9mKCpmd3NwayksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnVuaXQtPmRldmljZSwgLTEsIE5VTEwsIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKCpmd3NwayksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZ1bml0LT5kZXZpY2UpOwogCiAJZndzcGsgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJZndzcGstPmNhcmQgPSBjYXJkOwpkaWZmIC0tZ2l0IGEvc291bmQvaTJjL290aGVyL2FrNDExMy5jIGIvc291bmQvaTJjL290aGVyL2FrNDExMy5jCmluZGV4IGUwNGU3NTAuLjFhM2E2ZmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy9vdGhlci9hazQxMTMuYworKysgYi9zb3VuZC9pMmMvb3RoZXIvYWs0MTEzLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAkJCUFLNDExM19DSU5UIHwgQUs0MTEzX1NUQyk7CiAJY2hpcC0+cmNzMSA9IHJlZ19yZWFkKGNoaXAsIEFLNDExM19SRUdfUkNTMSk7CiAJY2hpcC0+cmNzMiA9IHJlZ19yZWFkKGNoaXAsIEFLNDExM19SRUdfUkNTMik7Ci0JZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKTsKKwllcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfQ09ERUMsIGNoaXAsICZvcHMpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIF9fZmFpbDsKIApkaWZmIC0tZ2l0IGEvc291bmQvaTJjL290aGVyL2FrNDExNC5jIGIvc291bmQvaTJjL290aGVyL2FrNDExNC5jCmluZGV4IDE1YWUwMjUuLmM3ZjU2MzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy9vdGhlci9hazQxMTQuYworKysgYi9zb3VuZC9pMmMvb3RoZXIvYWs0MTE0LmMKQEAgLTExMSw3ICsxMTEsNyBAQAogCWNoaXAtPnJjczAgPSByZWdfcmVhZChjaGlwLCBBSzQxMTRfUkVHX1JDUzApICYgfihBSzQxMTRfUUlOVCB8IEFLNDExNF9DSU5UKTsKIAljaGlwLT5yY3MxID0gcmVnX3JlYWQoY2hpcCwgQUs0MTE0X1JFR19SQ1MxKTsKIAotCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKSkgPCAwKQorCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0NPREVDLCBjaGlwLCAmb3BzKSkgPCAwKQogCQlnb3RvIF9fZmFpbDsKIAogCWlmIChyX2FrNDExNCkKZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9vdGhlci9hazQxMTcuYyBiL3NvdW5kL2kyYy9vdGhlci9hazQxMTcuYwppbmRleCA0MGUzM2M5Li44ODQ1MmU4IDEwMDY0NAotLS0gYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTE3LmMKKysrIGIvc291bmQvaTJjL290aGVyL2FrNDExNy5jCkBAIC02Miw3ICs2Miw3IEBACiAKIHN0YXRpYyB2b2lkIHNuZF9hazQxMTdfZnJlZShzdHJ1Y3QgYWs0MTE3ICpjaGlwKQogewotCWRlbF90aW1lcigmY2hpcC0+dGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZjaGlwLT50aW1lcik7CiAJa2ZyZWUoY2hpcCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmEuYyBiL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmEuYwppbmRleCAyNmNlMjZhLi5mNDgxYTQxIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhLmMKKysrIGIvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YS5jCkBAIC0xNDQsOCArMTQ0LDkgQEAKIAlzdHJ1Y3Qgc25kX29wbDMgKm9wbDM7CiAJc3RydWN0IHNuZF90aW1lciAqdGltZXI7CiAKLQllcnJvciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLQkJCQlzaXplb2Yoc3RydWN0IHNuZF9hZDE4MTZhKSwgJmNhcmQpOworCWVycm9yID0gc25kX2NhcmRfbmV3KCZwY2FyZC0+Y2FyZC0+ZGV2LAorCQkJICAgICBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfYWQxODE2YSksICZjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7CiAJY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKQEAgLTE1NCw3ICsxNTUsNiBAQAogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjYXJkLT5jYXJkLT5kZXYpOwogCiAJaWYgKChlcnJvciA9IHNuZF9hZDE4MTZhX2NyZWF0ZShjYXJkLCBwb3J0W2Rldl0sCiAJCQkJCWlycVtkZXZdLApkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2FkMTg0OC9hZDE4NDguYyBiL3NvdW5kL2lzYS9hZDE4NDgvYWQxODQ4LmMKaW5kZXggZTNmNDU1YmQuLjA5M2YyMmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9hZDE4NDgvYWQxODQ4LmMKKysrIGIvc291bmQvaXNhL2FkMTg0OC9hZDE4NDguYwpAQCAtOTEsNyArOTEsNyBAQAogCXN0cnVjdCBzbmRfcGNtICpwY207CiAJaW50IGVycm9yOwogCi0JZXJyb3IgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVycm9yID0gc25kX2NhcmRfbmV3KGRldiwgaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnJvciA8IDApCiAJCXJldHVybiBlcnJvcjsKIApAQCAtMTE5LDggKzExOSw2IEBACiAJaWYgKHRoaW5rcGFkW25dKQogCQlzdHJjYXQoY2FyZC0+bG9uZ25hbWUsICIgW1RoaW5rcGFkXSIpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBkZXYpOwotCiAJZXJyb3IgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9hZGxpYi5jIGIvc291bmQvaXNhL2FkbGliLmMKaW5kZXggMzU2NTkyMS4uMTIwYzUyNCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2FkbGliLmMKKysrIGIvc291bmQvaXNhL2FkbGliLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAlzdHJ1Y3Qgc25kX29wbDMgKm9wbDM7CiAJaW50IGVycm9yOwogCi0JZXJyb3IgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVycm9yID0gc25kX2NhcmRfbmV3KGRldiwgaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnJvciA8IDApIHsKIAkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgY3JlYXRlIGNhcmRcbiIpOwogCQlyZXR1cm4gZXJyb3I7CkBAIC04Myw4ICs4Myw2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2KTsKLQogCWVycm9yID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkgewogCQlkZXZfZXJyKGRldiwgImNvdWxkIG5vdCByZWdpc3RlciBjYXJkXG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9hbHMxMDAuYyBiL3NvdW5kL2lzYS9hbHMxMDAuYwppbmRleCAxMGYwOGExLi4zMmQwMTUyIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvYWxzMTAwLmMKKysrIGIvc291bmQvaXNhL2FsczEwMC5jCkBAIC0xOTMsOCArMTkzLDkgQEAKIAlzdHJ1Y3Qgc25kX2NhcmRfYWxzMTAwICphY2FyZDsKIAlzdHJ1Y3Qgc25kX29wbDMgKm9wbDM7CiAKLQllcnJvciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLQkJCQlzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2FsczEwMCksICZjYXJkKTsKKwllcnJvciA9IHNuZF9jYXJkX25ldygmcGNhcmQtPmNhcmQtPmRldiwKKwkJCSAgICAgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2NhcmRfYWxzMTAwKSwgJmNhcmQpOwogCWlmIChlcnJvciA8IDApCiAJCXJldHVybiBlcnJvcjsKIAlhY2FyZCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKQEAgLTIwMyw3ICsyMDQsNiBAQAogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjYXJkLT5jYXJkLT5kZXYpOwogCiAJaWYgKHBpZC0+ZHJpdmVyX2RhdGEgPT0gU0JfSFdfRFQwMTlYKQogCQlkbWExNltkZXZdID0gLTE7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvYXp0MjMyMC5jIGIvc291bmQvaXNhL2F6dDIzMjAuYwppbmRleCBkYjMwMWZmLi4wZWE3NWZjIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvYXp0MjMyMC5jCisrKyBiL3NvdW5kL2lzYS9henQyMzIwLmMKQEAgLTE4NCw4ICsxODQsOSBAQAogCXN0cnVjdCBzbmRfd3NzICpjaGlwOwogCXN0cnVjdCBzbmRfb3BsMyAqb3BsMzsKIAotCWVycm9yID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJCXNpemVvZihzdHJ1Y3Qgc25kX2NhcmRfYXp0MjMyMCksICZjYXJkKTsKKwllcnJvciA9IHNuZF9jYXJkX25ldygmcGNhcmQtPmNhcmQtPmRldiwKKwkJCSAgICAgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2NhcmRfYXp0MjMyMCksICZjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7CiAJYWNhcmQgPSBjYXJkLT5wcml2YXRlX2RhdGE7CkBAIC0xOTQsNyArMTk1LDYgQEAKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2FyZC0+Y2FyZC0+ZGV2KTsKIAogCWlmICgoZXJyb3IgPSBzbmRfY2FyZF9henQyMzIwX2VuYWJsZV93c3MocG9ydFtkZXZdKSkpIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9jbWk4MzI4LmMgYi9zb3VuZC9pc2EvY21pODMyOC5jCmluZGV4IGFiNmIyZGMuLjQ3Nzg4NTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9jbWk4MzI4LmMKKysrIGIvc291bmQvaXNhL2NtaTgzMjguYwpAQCAtMjkzLDE1ICsyOTMsMTQgQEAKIAl9CiAJb3V0Yih2YWwsIHBvcnQpOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W25kZXZdLCBpZFtuZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzbmRfY21pODMyOCksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcocGRldiwgaW5kZXhbbmRldl0sIGlkW25kZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX2NtaTgzMjgpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJY21pID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCWNtaS0+Y2FyZCA9IGNhcmQ7CiAJY21pLT5wb3J0ID0gcG9ydDsKIAljbWktPndzc19jZmcgPSB2YWw7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBwZGV2KTsKIAogCWVyciA9IHNuZF93c3NfY3JlYXRlKGNhcmQsIHBvcnQgKyA0LCAtMSwgaXJxW25kZXZdLCBkbWExW25kZXZdLAogCQkJZG1hMltuZGV2XSwgV1NTX0hXX0RFVEVDVCwgMCwgJmNtaS0+d3NzKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9jbWk4MzMwLmMgYi9zb3VuZC9pc2EvY21pODMzMC5jCmluZGV4IDI3MGI5NjUuLmRmZWRmZDggMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9jbWk4MzMwLmMKKysrIGIvc291bmQvaXNhL2NtaTgzMzAuYwpAQCAtNTE0LDE0ICs1MTQsMTUgQEAKIAogI2RlZmluZSBQRlgJImNtaTgzMzA6ICIKIAotc3RhdGljIGludCBzbmRfY21pODMzMF9jYXJkX25ldyhpbnQgZGV2LCBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKK3N0YXRpYyBpbnQgc25kX2NtaTgzMzBfY2FyZF9uZXcoc3RydWN0IGRldmljZSAqcGRldiwgaW50IGRldiwKKwkJCQlzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9jbWk4MzMwICphY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfY21pODMzMCksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcocGRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9jbWk4MzMwKSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgUEZYICJjb3VsZCBub3QgZ2V0IGEgbmV3IGNhcmRcbiIpOwogCQlyZXR1cm4gZXJyOwpAQCAtNjM1LDEwICs2MzYsOSBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NtaTgzMzBfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJZXJyID0gc25kX2NtaTgzMzBfY2FyZF9uZXcocGRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBwZGV2KTsKIAlpZiAoKGVyciA9IHNuZF9jbWk4MzMwX3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtNjk4LDcgKzY5OCw3IEBACiAJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CiAJCQkgICAgICAgCi0JcmVzID0gc25kX2NtaTgzMzBfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJcmVzID0gc25kX2NtaTgzMzBfY2FyZF9uZXcoJnBjYXJkLT5jYXJkLT5kZXYsIGRldiwgJmNhcmQpOwogCWlmIChyZXMgPCAwKQogCQlyZXR1cm4gcmVzOwogCWlmICgocmVzID0gc25kX2NtaTgzMzBfcG5wKGRldiwgY2FyZC0+cHJpdmF0ZV9kYXRhLCBwY2FyZCwgcGlkKSkgPCAwKSB7CkBAIC03MDYsNyArNzA2LDYgQEAKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIHJlczsKIAl9Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNhcmQtPmNhcmQtPmRldik7CiAJaWYgKChyZXMgPSBzbmRfY21pODMzMF9wcm9iZShjYXJkLCBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIHJlczsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9jczQyM3gvY3M0MjMxLmMgYi9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzMS5jCmluZGV4IGJhOWE3NGUuLjdkYmEwN2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9jczQyM3gvY3M0MjMxLmMKKysrIGIvc291bmQvaXNhL2NzNDIzeC9jczQyMzEuYwpAQCAtOTUsNyArOTUsNyBAQAogCXN0cnVjdCBzbmRfcGNtICpwY207CiAJaW50IGVycm9yOwogCi0JZXJyb3IgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVycm9yID0gc25kX2NhcmRfbmV3KGRldiwgaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnJvciA8IDApCiAJCXJldHVybiBlcnJvcjsKIApAQCAtMTM1LDggKzEzNSw2IEBACiAJCQlkZXZfd2FybihkZXYsICJNUFU0MDEgbm90IGRldGVjdGVkXG4iKTsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIGRldik7Ci0KIAllcnJvciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2NzNDIzeC9jczQyMzYuYyBiL3NvdW5kL2lzYS9jczQyM3gvY3M0MjM2LmMKaW5kZXggNjk2MTRhYy4uNzUwZjUxYyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2NzNDIzeC9jczQyMzYuYworKysgYi9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzNi5jCkBAIC0zNjQsMTMgKzM2NCwxNCBAQAogCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UoYWNhcmQtPnJlc19zYl9wb3J0KTsKIH0KIAotc3RhdGljIGludCBzbmRfY3M0MjN4X2NhcmRfbmV3KGludCBkZXYsIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQorc3RhdGljIGludCBzbmRfY3M0MjN4X2NhcmRfbmV3KHN0cnVjdCBkZXZpY2UgKnBkZXYsIGludCBkZXYsCisJCQkgICAgICAgc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2NzNDIzNiksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcocGRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2NzNDIzNiksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfY2FyZF9jczQyMzZfZnJlZTsKQEAgLTQ4NywxMCArNDg4LDkgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jczQyM3hfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJZXJyID0gc25kX2NzNDIzeF9jYXJkX25ldyhwZGV2LCBkZXYsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIHBkZXYpOwogCWlmICgoZXJyID0gc25kX2NzNDIzeF9wcm9iZShjYXJkLCBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKQEAgLTU3Nyw3ICs1NzcsNyBAQAogCQlpZiAoIXN0cmNtcChjZGV2LT5pZFswXS5pZCwgY2lkKSkKIAkJCWJyZWFrOwogCX0KLQllcnIgPSBzbmRfY3M0MjN4X2NhcmRfbmV3KGRldiwgJmNhcmQpOworCWVyciA9IHNuZF9jczQyM3hfY2FyZF9uZXcoJnBkZXYtPmRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJZXJyID0gc25kX2NhcmRfY3M0MjN4X3BucChkZXYsIGNhcmQtPnByaXZhdGVfZGF0YSwgcGRldiwgY2Rldik7CkBAIC01ODYsNyArNTg2LDYgQEAKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGRldi0+ZGV2KTsKIAlpZiAoKGVyciA9IHNuZF9jczQyM3hfcHJvYmUoY2FyZCwgZGV2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CkBAIC02MzgsNyArNjM3LDcgQEAKIAlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJlcyA9IHNuZF9jczQyM3hfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJcmVzID0gc25kX2NzNDIzeF9jYXJkX25ldygmcGNhcmQtPmNhcmQtPmRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKHJlcyA8IDApCiAJCXJldHVybiByZXM7CiAJaWYgKChyZXMgPSBzbmRfY2FyZF9jczQyM3hfcG5wYyhkZXYsIGNhcmQtPnByaXZhdGVfZGF0YSwgcGNhcmQsIHBpZCkpIDwgMCkgewpAQCAtNjQ3LDcgKzY0Niw2IEBACiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiByZXM7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjYXJkLT5jYXJkLT5kZXYpOwogCWlmICgocmVzID0gc25kX2NzNDIzeF9wcm9iZShjYXJkLCBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIHJlczsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9lczE2ODgvZXMxNjg4LmMgYi9zb3VuZC9pc2EvZXMxNjg4L2VzMTY4OC5jCmluZGV4IGNkY2ZiNTcuLjc2MDAxZmUwIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZXMxNjg4L2VzMTY4OC5jCisrKyBiL3NvdW5kL2lzYS9lczE2ODgvZXMxNjg4LmMKQEAgLTE4Nyw4ICsxODcsOCBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyb3I7CiAKLQllcnJvciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtuXSwgaWRbbl0sIFRISVNfTU9EVUxFLAotCQkJCXNpemVvZihzdHJ1Y3Qgc25kX2VzMTY4OCksICZjYXJkKTsKKwllcnJvciA9IHNuZF9jYXJkX25ldyhkZXYsIGluZGV4W25dLCBpZFtuXSwgVEhJU19NT0RVTEUsCisJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2VzMTY4OCksICZjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7CiAKQEAgLTE5Niw4ICsxOTYsNiBAQAogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0OwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBkZXYpOwotCiAJZXJyb3IgPSBzbmRfZXMxNjg4X3Byb2JlKGNhcmQsIG4pOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0OwpAQCAtMjc0LDggKzI3Miw5IEBACiAJaWYgKGRldiA9PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQllcnJvciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLQkJCQlzaXplb2Yoc3RydWN0IHNuZF9lczE2ODgpLCAmY2FyZCk7CisJZXJyb3IgPSBzbmRfY2FyZF9uZXcoJnBjYXJkLT5jYXJkLT5kZXYsCisJCQkgICAgIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgICBzaXplb2Yoc3RydWN0IHNuZF9lczE2ODgpLCAmY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJcmV0dXJuIGVycm9yOwogCWNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CkBAIC0yODUsNyArMjg0LDYgQEAKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2FyZC0+Y2FyZC0+ZGV2KTsKIAllcnJvciA9IHNuZF9lczE2ODhfcHJvYmUoY2FyZCwgZGV2KTsKIAlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZXMxOHh4LmMgYi9zb3VuZC9pc2EvZXMxOHh4LmMKaW5kZXggMTI5NzhiOC4uMWMxNjgzMCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2VzMTh4eC5jCisrKyBiL3NvdW5kL2lzYS9lczE4eHguYwpAQCAtMjEwNSwxMCArMjEwNSwxMSBAQAogI2RlZmluZSBpc19pc2FwbnBfc2VsZWN0ZWQoZGV2KQkJMAogI2VuZGlmCiAKLXN0YXRpYyBpbnQgc25kX2VzMTh4eF9jYXJkX25ldyhpbnQgZGV2LCBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKK3N0YXRpYyBpbnQgc25kX2VzMTh4eF9jYXJkX25ldyhzdHJ1Y3QgZGV2aWNlICpwZGV2LCBpbnQgZGV2LAorCQkJICAgICAgIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQogewotCXJldHVybiBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfZXMxOHh4KSwgY2FyZHApOworCXJldHVybiBzbmRfY2FyZF9uZXcocGRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBzbmRfZXMxOHh4KSwgY2FyZHApOwogfQogCiBzdGF0aWMgaW50IHNuZF9hdWRpb2RyaXZlX3Byb2JlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldikKQEAgLTIxNzksMTAgKzIxODAsOSBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2VzMTh4eF9jYXJkX25ldyhkZXYsICZjYXJkKTsKKwllcnIgPSBzbmRfZXMxOHh4X2NhcmRfbmV3KGRldnB0ciwgZGV2LCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBkZXZwdHIpOwogCWlmICgoZXJyID0gc25kX2F1ZGlvZHJpdmVfcHJvYmUoY2FyZCwgZGV2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CkBAIC0yMjg0LDE0ICsyMjg0LDEzIEBACiAJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQllcnIgPSBzbmRfZXMxOHh4X2NhcmRfbmV3KGRldiwgJmNhcmQpOworCWVyciA9IHNuZF9lczE4eHhfY2FyZF9uZXcoJnBkZXYtPmRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJaWYgKChlcnIgPSBzbmRfYXVkaW9kcml2ZV9wbnAoZGV2LCBjYXJkLT5wcml2YXRlX2RhdGEsIHBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGRldi0+ZGV2KTsKIAlpZiAoKGVyciA9IHNuZF9hdWRpb2RyaXZlX3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtMjM0Miw3ICsyMzQxLDcgQEAKIAlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJlcyA9IHNuZF9lczE4eHhfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJcmVzID0gc25kX2VzMTh4eF9jYXJkX25ldygmcGNhcmQtPmNhcmQtPmRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKHJlcyA8IDApCiAJCXJldHVybiByZXM7CiAKQEAgLTIzNTAsNyArMjM0OSw2IEBACiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiByZXM7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjYXJkLT5jYXJkLT5kZXYpOwogCWlmICgocmVzID0gc25kX2F1ZGlvZHJpdmVfcHJvYmUoY2FyZCwgZGV2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiByZXM7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ2FsYXh5L2dhbGF4eS5jIGIvc291bmQvaXNhL2dhbGF4eS9nYWxheHkuYwppbmRleCA4MTI0NGU3Li4xZWIyYjFlIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ2FsYXh5L2dhbGF4eS5jCisrKyBiL3NvdW5kL2lzYS9nYWxheHkvZ2FsYXh5LmMKQEAgLTUwNiwxMyArNTA2LDExIEBACiAJdTggdHlwZTsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W25dLCBpZFtuXSwgVEhJU19NT0RVTEUsIHNpemVvZiAqZ2FsYXh5LAotCQkJICAgICAgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldyhkZXYsIGluZGV4W25dLCBpZFtuXSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2YoKmdhbGF4eSksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2KTsKLQogCWNhcmQtPnByaXZhdGVfZnJlZSA9IHNuZF9nYWxheHlfZnJlZTsKIAlnYWxheHkgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9ndXMvZ3VzY2xhc3NpYy5jIGIvc291bmQvaXNhL2d1cy9ndXNjbGFzc2ljLmMKaW5kZXggMWFkYzFiOS4uN2NlMjlmZiAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2d1cy9ndXNjbGFzc2ljLmMKKysrIGIvc291bmQvaXNhL2d1cy9ndXNjbGFzc2ljLmMKQEAgLTE0OSw3ICsxNDksNyBAQAogCXN0cnVjdCBzbmRfZ3VzX2NhcmQgKmd1czsKIAlpbnQgZXJyb3I7CiAKLQllcnJvciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtuXSwgaWRbbl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyb3IgPSBzbmRfY2FyZF9uZXcoZGV2LCBpbmRleFtuXSwgaWRbbl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJcmV0dXJuIGVycm9yOwogCkBAIC0xOTksOCArMTk5LDYgQEAKIAkJc3ByaW50ZihjYXJkLT5sb25nbmFtZSArIHN0cmxlbihjYXJkLT5sb25nbmFtZSksCiAJCQkiJiVkIiwgZ3VzLT5nZjEuZG1hMik7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIGRldik7Ci0KIAllcnJvciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2d1cy9ndXNleHRyZW1lLmMgYi9zb3VuZC9pc2EvZ3VzL2d1c2V4dHJlbWUuYwppbmRleCAzOGUxZTMyLi4yOGExNjkzIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2d1c2V4dHJlbWUuYworKysgYi9zb3VuZC9pc2EvZ3VzL2d1c2V4dHJlbWUuYwpAQCAtMjQyLDggKzI0Miw4IEBACiAJc3RydWN0IHNuZF9vcGwzICpvcGwzOwogCWludCBlcnJvcjsKIAotCWVycm9yID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W25dLCBpZFtuXSwgVEhJU19NT0RVTEUsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzbmRfZXMxNjg4KSwgJmNhcmQpOworCWVycm9yID0gc25kX2NhcmRfbmV3KGRldiwgaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfZXMxNjg4KSwgJmNhcmQpOwogCWlmIChlcnJvciA8IDApCiAJCXJldHVybiBlcnJvcjsKIApAQCAtMzI4LDggKzMyOCw2IEBACiAJCSJpcnEgJWkmJWksIGRtYSAlaSYlaSIsIGVzMTY4OC0+cG9ydCwKIAkJZ3VzLT5nZjEuaXJxLCBlczE2ODgtPmlycSwgZ3VzLT5nZjEuZG1hMSwgZXMxNjg4LT5kbWE4KTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2KTsKLQogCWVycm9yID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ3VzL2d1c21heC5jIGIvc291bmQvaXNhL2d1cy9ndXNtYXguYwppbmRleCA2NTJkNWQ4Li4zOWRmMzZjIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2d1c21heC5jCisrKyBiL3NvdW5kL2lzYS9ndXMvZ3VzbWF4LmMKQEAgLTIxNCw4ICsyMTQsOCBAQAogCXN0cnVjdCBzbmRfd3NzICp3c3M7CiAJc3RydWN0IHNuZF9ndXNtYXggKm1heGNhcmQ7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9ndXNtYXgpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KHBkZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfZ3VzbWF4KSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWNhcmQtPnByaXZhdGVfZnJlZSA9IHNuZF9ndXNtYXhfZnJlZTsKQEAgLTMzNyw4ICszMzcsNiBAQAogCWlmICh4ZG1hMiA+PSAwKQogCQlzcHJpbnRmKGNhcmQtPmxvbmduYW1lICsgc3RybGVuKGNhcmQtPmxvbmduYW1lKSwgIiYlaSIsIHhkbWEyKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgcGRldik7Ci0KIAllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBfZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2d1cy9pbnRlcndhdmUuYyBiL3NvdW5kL2lzYS9ndXMvaW50ZXJ3YXZlLmMKaW5kZXggYWZlZjBkNy4uNWFiYmJlNCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2d1cy9pbnRlcndhdmUuYworKysgYi9zb3VuZC9pc2EvZ3VzL2ludGVyd2F2ZS5jCkBAIC02MjUsMTQgKzYyNSwxNSBAQAogCQlmcmVlX2lycShpd2NhcmQtPmlycSwgKHZvaWQgKilpd2NhcmQpOwogfQogCi1zdGF0aWMgaW50IHNuZF9pbnRlcndhdmVfY2FyZF9uZXcoaW50IGRldiwgc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCitzdGF0aWMgaW50IHNuZF9pbnRlcndhdmVfY2FyZF9uZXcoc3RydWN0IGRldmljZSAqcGRldiwgaW50IGRldiwKKwkJCQkgIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlzdHJ1Y3Qgc25kX2ludGVyd2F2ZSAqaXdjYXJkOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9pbnRlcndhdmUpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KHBkZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfaW50ZXJ3YXZlKSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWl3Y2FyZCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKQEAgLTc3OSwxMSArNzgwLDEwIEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfaW50ZXJ3YXZlX2NhcmRfbmV3KGRldiwgJmNhcmQpOworCWVyciA9IHNuZF9pbnRlcndhdmVfY2FyZF9uZXcoZGV2cHRyLCBkZXYsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2cHRyKTsKIAlpZiAoKGVyciA9IHNuZF9pbnRlcndhdmVfcHJvYmUoY2FyZCwgZGV2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CkBAIC04NzYsNyArODc2LDcgQEAKIAlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKIAkJCQkKLQlyZXMgPSBzbmRfaW50ZXJ3YXZlX2NhcmRfbmV3KGRldiwgJmNhcmQpOworCXJlcyA9IHNuZF9pbnRlcndhdmVfY2FyZF9uZXcoJnBjYXJkLT5jYXJkLT5kZXYsIGRldiwgJmNhcmQpOwogCWlmIChyZXMgPCAwKQogCQlyZXR1cm4gcmVzOwogCkBAIC04ODQsNyArODg0LDYgQEAKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIHJlczsKIAl9Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNhcmQtPmNhcmQtPmRldik7CiAJaWYgKChyZXMgPSBzbmRfaW50ZXJ3YXZlX3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gcmVzOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL21zbmQvbXNuZF9waW5uYWNsZS5jIGIvc291bmQvaXNhL21zbmQvbXNuZF9waW5uYWNsZS5jCmluZGV4IDBhOTBiZDYuLjUwMTZiZjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9tc25kL21zbmRfcGlubmFjbGUuYworKysgYi9zb3VuZC9pc2EvbXNuZC9tc25kX3Bpbm5hY2xlLmMKQEAgLTkwNSwxMiArOTA1LDExIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtpZHhdLCBpZFtpZHhdLCBUSElTX01PRFVMRSwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX21zbmQpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KHBkZXYsIGluZGV4W2lkeF0sIGlkW2lkeF0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfbXNuZCksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgcGRldik7CiAJY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAljaGlwLT5jYXJkID0gY2FyZDsKIApAQCAtMTEyMiwxNCArMTEyMSwxNCBAQAogCSAqIENyZWF0ZSBhIG5ldyBBTFNBIHNvdW5kIGNhcmQgZW50cnksIGluIGFudGljaXBhdGlvbgogCSAqIG9mIGRldGVjdGluZyBvdXIgaGFyZHdhcmUgLi4uCiAJICovCi0JcmV0ID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2lkeF0sIGlkW2lkeF0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfbXNuZCksICZjYXJkKTsKKwlyZXQgPSBzbmRfY2FyZF9uZXcoJnBjYXJkLT5jYXJkLT5kZXYsCisJCQkgICBpbmRleFtpZHhdLCBpZFtpZHhdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX21zbmQpLCAmY2FyZCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKIAljaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCWNoaXAtPmNhcmQgPSBjYXJkOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjYXJkLT5jYXJkLT5kZXYpOwogCiAJLyoKIAkgKiBSZWFkIHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMgb2ZmIHRoZSBJU0EgUG5QIGJ1cyAuLi4KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9vcGwzc2EyLmMgYi9zb3VuZC9pc2Evb3BsM3NhMi5jCmluZGV4IGNjMDFjNDEuLmEyMTliYzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9vcGwzc2EyLmMKKysrIGIvc291bmQvaXNhL29wbDNzYTIuYwpAQCAtNjI3LDE0ICs2MjcsMTUgQEAKIAlyZWxlYXNlX2FuZF9mcmVlX3Jlc291cmNlKGNoaXAtPnJlc19wb3J0KTsKIH0KIAotc3RhdGljIGludCBzbmRfb3BsM3NhMl9jYXJkX25ldyhpbnQgZGV2LCBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKK3N0YXRpYyBpbnQgc25kX29wbDNzYTJfY2FyZF9uZXcoc3RydWN0IGRldmljZSAqcGRldiwgaW50IGRldiwKKwkJCQlzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9vcGwzc2EyICpjaGlwOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9vcGwzc2EyKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldyhwZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX29wbDNzYTIpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgIk9QTDNTQTIiKTsKQEAgLTczNywxNCArNzM4LDEzIEBACiAJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQllcnIgPSBzbmRfb3BsM3NhMl9jYXJkX25ldyhkZXYsICZjYXJkKTsKKwllcnIgPSBzbmRfb3BsM3NhMl9jYXJkX25ldygmcGRldi0+ZGV2LCBkZXYsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlpZiAoKGVyciA9IHNuZF9vcGwzc2EyX3BucChkZXYsIGNhcmQtPnByaXZhdGVfZGF0YSwgcGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwogCX0KLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOwogCWlmICgoZXJyID0gc25kX29wbDNzYTJfcHJvYmUoY2FyZCwgZGV2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CkBAIC04MDIsMTQgKzgwMiwxMyBAQAogCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZXJyID0gc25kX29wbDNzYTJfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJZXJyID0gc25kX29wbDNzYTJfY2FyZF9uZXcoJnBkZXYtPmRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJaWYgKChlcnIgPSBzbmRfb3BsM3NhMl9wbnAoZGV2LCBjYXJkLT5wcml2YXRlX2RhdGEsIHBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGRldi0+ZGV2KTsKIAlpZiAoKGVyciA9IHNuZF9vcGwzc2EyX3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtODgzLDEwICs4ODIsOSBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX29wbDNzYTJfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJZXJyID0gc25kX29wbDNzYTJfY2FyZF9uZXcocGRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBwZGV2KTsKIAlpZiAoKGVyciA9IHNuZF9vcGwzc2EyX3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL29wdGk5eHgvbWlyby5jIGIvc291bmQvaXNhL29wdGk5eHgvbWlyby5jCmluZGV4IDYxOTc1M2QuLmMyY2E2ODEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9vcHRpOXh4L21pcm8uYworKysgYi9zb3VuZC9pc2Evb3B0aTl4eC9taXJvLmMKQEAgLTE0MTEsOCArMTQxMSw4IEBACiAJc3RydWN0IHNuZF9taXJvICptaXJvOwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAotCWVycm9yID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzbmRfbWlybyksICZjYXJkKTsKKwllcnJvciA9IHNuZF9jYXJkX25ldyhkZXZwdHIsIGluZGV4LCBpZCwgVEhJU19NT0RVTEUsCisJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc25kX21pcm8pLCAmY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJcmV0dXJuIGVycm9yOwogCkBAIC0xNDc5LDggKzE0NzksNiBAQAogCQl9CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBkZXZwdHIpOwotCiAJZXJyb3IgPSBzbmRfbWlyb19wcm9iZShjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CkBAIC0xNTg0LDggKzE1ODIsOCBAQAogCQlyZXR1cm4gLUVCVVNZOwogCWlmICghaXNhcG5wKQogCQlyZXR1cm4gLUVOT0RFVjsKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIGlkLCBUSElTX01PRFVMRSwKLQkJCQlzaXplb2Yoc3RydWN0IHNuZF9taXJvKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNhcmQtPmNhcmQtPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX21pcm8pLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTE2MTIsNyArMTYxMCw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNhcmQtPmNhcmQtPmRldik7CiAJZXJyID0gc25kX21pcm9fcHJvYmUoY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9vcHRpOXh4L29wdGk5MngtYWQxODQ4LmMgYi9zb3VuZC9pc2Evb3B0aTl4eC9vcHRpOTJ4LWFkMTg0OC5jCmluZGV4IDZlZmZlOTkuLmM5YjU4MjggMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9vcHRpOXh4L29wdGk5MngtYWQxODQ4LmMKKysrIGIvc291bmQvaXNhL29wdGk5eHgvb3B0aTkyeC1hZDE4NDguYwpAQCAtOTM0LDEzICs5MzQsMTMgQEAKIAlyZXR1cm4gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiB9CiAKLXN0YXRpYyBpbnQgc25kX29wdGk5eHhfY2FyZF9uZXcoc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCitzdGF0aWMgaW50IHNuZF9vcHRpOXh4X2NhcmRfbmV3KHN0cnVjdCBkZXZpY2UgKnBkZXYsIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9vcHRpOXh4KSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldyhwZGV2LCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfb3B0aTl4eCksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfY2FyZF9vcHRpOXh4X2ZyZWU7CkBAIC0xMDEwLDcgKzEwMTAsNyBAQAogCX0KICNlbmRpZgogCi0JZXJyb3IgPSBzbmRfb3B0aTl4eF9jYXJkX25ldygmY2FyZCk7CisJZXJyb3IgPSBzbmRfb3B0aTl4eF9jYXJkX25ldyhkZXZwdHIsICZjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7CiAKQEAgLTEwMTgsNyArMTAxOCw2IEBACiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnJvcjsKIAl9Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBkZXZwdHIpOwogCWlmICgoZXJyb3IgPSBzbmRfb3B0aTl4eF9wcm9iZShjYXJkKSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnJvcjsKQEAgLTExMDAsNyArMTA5OSw3IEBACiAJCXJldHVybiAtRUJVU1k7CiAJaWYgKCEgaXNhcG5wKQogCQlyZXR1cm4gLUVOT0RFVjsKLQllcnJvciA9IHNuZF9vcHRpOXh4X2NhcmRfbmV3KCZjYXJkKTsKKwllcnJvciA9IHNuZF9vcHRpOXh4X2NhcmRfbmV3KCZwY2FyZC0+Y2FyZC0+ZGV2LCAmY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJcmV0dXJuIGVycm9yOwogCWNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CkBAIC0xMTMxLDcgKzExMzAsNiBAQAogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjYXJkLT5jYXJkLT5kZXYpOwogCWlmICgoZXJyb3IgPSBzbmRfb3B0aTl4eF9wcm9iZShjYXJkKSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9qYXp6MTYuYyBiL3NvdW5kL2lzYS9zYi9qYXp6MTYuYwppbmRleCAzNTZhNjMwLi45MGQyZWJhIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc2IvamF6ejE2LmMKKysrIGIvc291bmQvaXNhL3NiL2phenoxNi5jCkBAIC0yMjksOCArMjI5LDggQEAKIAlzdGF0aWMgaW50IHBvc3NpYmxlX2RtYXMxNltdID0gezUsIDcsIC0xfTsKIAlpbnQgZXJyLCB4aXJxLCB4ZG1hOCwgeGRtYTE2LCB4bXB1X3BvcnQsIHhtcHVfaXJxOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfY2FyZF9qYXp6MTYpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KGRldnB0ciwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2phenoxNiksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMzI3LDggKzMyNyw2IEBACiAJCQkJCW1wdV9wb3J0W2Rldl0pOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2cHRyKTsKLQogCWVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycl9mcmVlOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NiL3NiMTYuYyBiL3NvdW5kL2lzYS9zYi9zYjE2LmMKaW5kZXggYTQxMzA5OS4uM2Y2OTQ1NCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NiL3NiMTYuYworKysgYi9zb3VuZC9pc2Evc2Ivc2IxNi5jCkBAIC0zMjMsMTMgKzMyMywxNCBAQAogI2RlZmluZSBpc19pc2FwbnBfc2VsZWN0ZWQoZGV2KQkJMAogI2VuZGlmCiAKLXN0YXRpYyBpbnQgc25kX3NiMTZfY2FyZF9uZXcoaW50IGRldiwgc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCitzdGF0aWMgaW50IHNuZF9zYjE2X2NhcmRfbmV3KHN0cnVjdCBkZXZpY2UgKmRldnB0ciwgaW50IGRldiwKKwkJCSAgICAgc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX3NiMTYpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KGRldnB0ciwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX3NiMTYpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJY2FyZC0+cHJpdmF0ZV9mcmVlID0gc25kX3NiMTZfZnJlZTsKQEAgLTQ5Myw3ICs0OTQsNyBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX3NiMTZfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJZXJyID0gc25kX3NiMTZfY2FyZF9uZXcocGRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTUwNyw3ICs1MDgsNiBAQAogCWF3ZV9wb3J0W2Rldl0gPSBwb3J0W2Rldl0gKyAweDQwMDsKICNlbmRpZgogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBwZGV2KTsKIAlpZiAoKGVyciA9IHNuZF9zYjE2X3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtNjEzLDEwICs2MTMsOSBAQAogCWZvciAoIDsgZGV2IDwgU05EUlZfQ0FSRFM7IGRldisrKSB7CiAJCWlmICghZW5hYmxlW2Rldl0gfHwgIWlzYXBucFtkZXZdKQogCQkJY29udGludWU7Ci0JCXJlcyA9IHNuZF9zYjE2X2NhcmRfbmV3KGRldiwgJmNhcmQpOworCQlyZXMgPSBzbmRfc2IxNl9jYXJkX25ldygmcGNhcmQtPmNhcmQtPmRldiwgZGV2LCAmY2FyZCk7CiAJCWlmIChyZXMgPCAwKQogCQkJcmV0dXJuIHJlczsKLQkJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNhcmQtPmNhcmQtPmRldik7CiAJCWlmICgocmVzID0gc25kX2NhcmRfc2IxNl9wbnAoZGV2LCBjYXJkLT5wcml2YXRlX2RhdGEsIHBjYXJkLCBwaWQpKSA8IDAgfHwKIAkJICAgIChyZXMgPSBzbmRfc2IxNl9wcm9iZShjYXJkLCBkZXYpKSA8IDApIHsKIAkJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2Ivc2I4LmMgYi9zb3VuZC9pc2Evc2Ivc2I4LmMKaW5kZXggYTgwNmFlOS4uNmMzMmIzYSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NiL3NiOC5jCisrKyBiL3NvdW5kL2lzYS9zYi9zYjguYwpAQCAtMTAyLDggKzEwMiw4IEBACiAJc3RydWN0IHNuZF9vcGwzICpvcGwzOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9zYjgpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KHBkZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfc2I4KSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWFjYXJkID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwpAQCAtMTkyLDggKzE5Miw2IEBACiAJCWNoaXAtPnBvcnQsCiAJCWlycVtkZXZdLCBkbWE4W2Rldl0pOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBwZGV2KTsKLQogCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkKIAkJZ290byBfZXJyOwogCmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2M2MDAwLmMgYi9zb3VuZC9pc2Evc2M2MDAwLmMKaW5kZXggMDlkNDgxYi4uMTVhMTUyZSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NjNjAwMC5jCisrKyBiL3NvdW5kL2lzYS9zYzYwMDAuYwpAQCAtNTU5LDggKzU1OSw4IEBACiAJY2hhciBfX2lvbWVtICp2bXNzX3BvcnQ7CiAKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgc2l6ZW9mKHZwb3J0KSwKLQkJCQkmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KGRldnB0ciwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2YodnBvcnQpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTY2OCw4ICs2NjgsNiBAQAogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICJHYWxsYW50IFNDLTYwMDAgYXQgMHglbHgsIGlycSAlZCwgZG1hICVkIiwKIAkJbXNzX3BvcnRbZGV2XSwgeGlycSwgeGRtYSk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIGRldnB0cik7Ci0KIAllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJfdW5tYXAyOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NzY2FwZS5jIGIvc291bmQvaXNhL3NzY2FwZS5jCmluZGV4IDU3YjMzODkuLjQ0NDA1ZGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zc2NhcGUuYworKysgYi9zb3VuZC9pc2Evc3NjYXBlLmMKQEAgLTExNjksOCArMTE2OSw4IEBACiAJc3RydWN0IHNvdW5kc2NhcGUgKnNzY2FwZTsKIAlpbnQgcmV0OwogCi0JcmV0ID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZHNjYXBlKSwgJmNhcmQpOworCXJldCA9IHNuZF9jYXJkX25ldyhwZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc291bmRzY2FwZSksICZjYXJkKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTE3OCw3ICsxMTc4LDYgQEAKIAlzc2NhcGUtPnR5cGUgPSBTU0NBUEU7CiAKIAlkbWFbZGV2XSAmPSAweDAzOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgcGRldik7CiAKIAlyZXQgPSBjcmVhdGVfc3NjYXBlKGRldiwgY2FyZCk7CiAJaWYgKHJldCA8IDApCkBAIC0xMjU5LDggKzEyNTgsOSBAQAogCSAqIENyZWF0ZSBhIG5ldyBBTFNBIHNvdW5kIGNhcmQgZW50cnksIGluIGFudGljaXBhdGlvbgogCSAqIG9mIGRldGVjdGluZyBvdXIgaGFyZHdhcmUgLi4uCiAJICovCi0JcmV0ID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2lkeF0sIGlkW2lkeF0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZHNjYXBlKSwgJmNhcmQpOworCXJldCA9IHNuZF9jYXJkX25ldygmcGNhcmQtPmNhcmQtPmRldiwKKwkJCSAgIGluZGV4W2lkeF0sIGlkW2lkeF0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzb3VuZHNjYXBlKSwgJmNhcmQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xMjg4LDcgKzEyODgsNiBAQAogCQl3c3NfcG9ydFtpZHhdID0gcG5wX3BvcnRfc3RhcnQoZGV2LCAxKTsKIAkJZG1hMltpZHhdID0gcG5wX2RtYShkZXYsIDEpOwogCX0KLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2FyZC0+Y2FyZC0+ZGV2KTsKIAogCXJldCA9IGNyZWF0ZV9zc2NhcGUoaWR4LCBjYXJkKTsKIAlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250LmMgYi9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udC5jCmluZGV4IDgyZGQ3NjkuLmJmYmYzOGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250LmMKKysrIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnQuYwpAQCAtMzM0LDE0ICszMzQsMTUgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgc25kX3dhdmVmcm9udF9jYXJkX25ldyhpbnQgZGV2LCBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKK3N0YXRpYyBpbnQgc25kX3dhdmVmcm9udF9jYXJkX25ldyhzdHJ1Y3QgZGV2aWNlICpwZGV2LCBpbnQgZGV2LAorCQkJCSAgc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCXNuZF93YXZlZnJvbnRfY2FyZF90ICphY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHNuZF93YXZlZnJvbnRfY2FyZF90KSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldyhwZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzbmRfd2F2ZWZyb250X2NhcmRfdCksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtNTY0LDEwICs1NjUsOSBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX3dhdmVmcm9udF9jYXJkX25ldyhkZXYsICZjYXJkKTsKKwllcnIgPSBzbmRfd2F2ZWZyb250X2NhcmRfbmV3KHBkZXYsIGRldiwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgcGRldik7CiAJaWYgKChlcnIgPSBzbmRfd2F2ZWZyb250X3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtNjEyLDcgKzYxMiw3IEBACiAJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlyZXMgPSBzbmRfd2F2ZWZyb250X2NhcmRfbmV3KGRldiwgJmNhcmQpOworCXJlcyA9IHNuZF93YXZlZnJvbnRfY2FyZF9uZXcoJnBjYXJkLT5jYXJkLT5kZXYsIGRldiwgJmNhcmQpOwogCWlmIChyZXMgPCAwKQogCQlyZXR1cm4gcmVzOwogCkBAIC02MjMsNyArNjIzLDYgQEAKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjYXJkLT5jYXJkLT5kZXYpOwogCiAJaWYgKChyZXMgPSBzbmRfd2F2ZWZyb250X3Byb2JlKGNhcmQsIGRldikpIDwgMCkKIAkJcmV0dXJuIHJlczsKZGlmZiAtLWdpdCBhL3NvdW5kL21pcHMvYXUxeDAwLmMgYi9zb3VuZC9taXBzL2F1MXgwMC5jCmluZGV4IDIyNGY1NGIuLmE3Y2M0OWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL21pcHMvYXUxeDAwLmMKKysrIGIvc291bmQvbWlwcy9hdTF4MDAuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpAQCAtOTgsNiArOTksNyBAQAogCiAJc3RydWN0IHNuZF9wY20gKnBjbTsKIAlzdHJ1Y3QgYXVkaW9fc3RyZWFtICpzdHJlYW1bMl07CS8qIHBsYXliYWNrICYgY2FwdHVyZSAqLworCWludCBkbWFpZFsyXTsJCS8qIHR4KDApL3J4KDEpIERNQSBpZHMgKi8KIH07CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExvY2FsIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC00NjUsMTUgKzQ2NywxNyBAQAogCXNwaW5fbG9ja19pbml0KCZhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXS0+ZG1hX2xvY2spOwogCiAJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOwotCWlmICgoYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdLT5kbWEgPSByZXF1ZXN0X2F1MTAwMF9kbWEoRE1BX0lEX0FDOTdDX1RYLAorCWF1MTAwMC0+c3RyZWFtW1BMQVlCQUNLXS0+ZG1hID0gcmVxdWVzdF9hdTEwMDBfZG1hKGF1MTAwMC0+ZG1haWRbMF0sCiAJCQkiQUM5NyBUWCIsIGF1MTAwMF9kbWFfaW50ZXJydXB0LCAwLAotCQkJYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdKSkgPCAwKSB7CisJCQlhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10pOworCWlmIChhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10tPmRtYSA8IDApIHsKIAkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQotCWlmICgoYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0tPmRtYSA9IHJlcXVlc3RfYXUxMDAwX2RtYShETUFfSURfQUM5N0NfUlgsCisJYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0tPmRtYSA9IHJlcXVlc3RfYXUxMDAwX2RtYShhdTEwMDAtPmRtYWlkWzFdLAogCQkJIkFDOTcgUlgiLCBhdTEwMDBfZG1hX2ludGVycnVwdCwgMCwKLQkJCWF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdKSkgPCAwKXsKKwkJCWF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdKTsKKwlpZiAoYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0tPmRtYSA8IDApewogCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC01NTIsMjcgKzU1NiwxMTEgQEAKIAlzcGluX3VubG9jaygmYXUxMDAwLT5hYzk3X2xvY2spOwogfQogCi1zdGF0aWMgaW50Ci1zbmRfYXUxMDAwX2FjOTdfbmV3KHN0cnVjdCBzbmRfYXUxMDAwICphdTEwMDApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXR1cCAvIERlc3Ryb3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHNuZF9hdTEwMDBfZnJlZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IHNuZF9hdTEwMDAgKmF1MTAwMCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKKworCWlmIChhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10pIHsKKwkgIAlpZiAoYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdLT5kbWEgPj0gMCkKKwkJCWZyZWVfYXUxMDAwX2RtYShhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10tPmRtYSk7CisJCWtmcmVlKGF1MTAwMC0+c3RyZWFtW1BMQVlCQUNLXSk7CisJfQorCisJaWYgKGF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdKSB7CisJCWlmIChhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXS0+ZG1hID49IDApCisJCQlmcmVlX2F1MTAwMF9kbWEoYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0tPmRtYSk7CisJCWtmcmVlKGF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdKTsKKwl9CisKKwlpZiAoYXUxMDAwLT5hYzk3X3Jlc19wb3J0KSB7CisJCS8qIHB1dCBpbnRlcm5hbCBBQzk3IGJsb2NrIGludG8gcmVzZXQgKi8KKwkJaWYgKGF1MTAwMC0+YWM5N19pb3BvcnQpIHsKKwkJCWF1MTAwMC0+YWM5N19pb3BvcnQtPmNudHJsID0gQUM5N0NfUlM7CisJCQlpb3VubWFwKGF1MTAwMC0+YWM5N19pb3BvcnQpOworCQkJYXUxMDAwLT5hYzk3X2lvcG9ydCA9IE5VTEw7CisJCX0KKwkJcmVsZWFzZV9hbmRfZnJlZV9yZXNvdXJjZShhdTEwMDAtPmFjOTdfcmVzX3BvcnQpOworCQlhdTEwMDAtPmFjOTdfcmVzX3BvcnQgPSBOVUxMOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzbmRfYWM5N19idXNfb3BzIG9wcyA9IHsKKwkud3JpdGUJPSBzbmRfYXUxMDAwX2FjOTdfd3JpdGUsCisJLnJlYWQJPSBzbmRfYXUxMDAwX2FjOTdfcmVhZCwKK307CisKK3N0YXRpYyBpbnQgYXUxMDAwX2FjOTdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlpbnQgZXJyOworCXZvaWQgX19pb21lbSAqaW87CisJc3RydWN0IHJlc291cmNlICpyOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlzdHJ1Y3Qgc25kX2F1MTAwMCAqYXUxMDAwOwogCXN0cnVjdCBzbmRfYWM5N19idXMgKnBidXM7CiAJc3RydWN0IHNuZF9hYzk3X3RlbXBsYXRlIGFjOTc7Ci0gCXN0YXRpYyBzdHJ1Y3Qgc25kX2FjOTdfYnVzX29wcyBvcHMgPSB7Ci0JCS53cml0ZSA9IHNuZF9hdTEwMDBfYWM5N193cml0ZSwKLQkJLnJlYWQgPSBzbmRfYXUxMDAwX2FjOTdfcmVhZCwKLQl9OwogCi0JaWYgKChhdTEwMDAtPmFjOTdfcmVzX3BvcnQgPSByZXF1ZXN0X21lbV9yZWdpb24oQ1BIWVNBRERSKEFDOTdDX0NPTkZJRyksCi0JICAgICAgIAkJMHgxMDAwMDAsICJBdTF4MDAgQUM5NyIpKSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkFMU0EgQUM5NzogY2FuJ3QgZ3JhcCBBQzk3IHBvcnRcbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQlhdTEwMDAtPmFjOTdfaW9wb3J0ID0gKHN0cnVjdCBhdTEwMDBfYWM5N19yZWcgKikKLQkJS1NFRzFBRERSKGF1MTAwMC0+YWM5N19yZXNfcG9ydC0+c3RhcnQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGRldi0+ZGV2LCAtMSwgIkFDOTciLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX2F1MTAwMCksICZjYXJkKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKIAorCWF1MTAwMCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKKwlhdTEwMDAtPmNhcmQgPSBjYXJkOwogCXNwaW5fbG9ja19pbml0KCZhdTEwMDAtPmFjOTdfbG9jayk7CiAKKwkvKiBmcm9tIGhlcmUgb24gbGV0IEFMU0EgY2FsbCB0aGUgc3BlY2lhbCBmcmVlaW5nIGZ1bmN0aW9uICovCisJY2FyZC0+cHJpdmF0ZV9mcmVlID0gc25kX2F1MTAwMF9mcmVlOworCisJLyogVFggRE1BIElEICovCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMCk7CisJaWYgKCFyKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCXNuZF9wcmludGsoS0VSTl9JTkZPICJubyBUWCBETUEgcGxhdGZvcm0gcmVzb3VyY2UhXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCWF1MTAwMC0+ZG1haWRbMF0gPSByLT5zdGFydDsKKworCS8qIFJYIERNQSBJRCAqLworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9ETUEsIDEpOworCWlmICghcikgeworCQllcnIgPSAtRU5PREVWOworCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAibm8gUlggRE1BIHBsYXRmb3JtIHJlc291cmNlIVxuIik7CisJCWdvdG8gb3V0OworCX0KKwlhdTEwMDAtPmRtYWlkWzFdID0gci0+c3RhcnQ7CisKKwlhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkaW9fc3RyZWFtKSwKKwkJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10pCisJCWdvdG8gb3V0OworCWF1MTAwMC0+c3RyZWFtW1BMQVlCQUNLXS0+ZG1hID0gLTE7CisKKwlhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpb19zdHJlYW0pLAorCQkJCQkgIEdGUF9LRVJORUwpOworCWlmICghYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0pCisJCWdvdG8gb3V0OworCWF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdLT5kbWEgPSAtMTsKKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcikKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRUJVU1k7CisJYXUxMDAwLT5hYzk3X3Jlc19wb3J0ID0gcmVxdWVzdF9tZW1fcmVnaW9uKHItPnN0YXJ0LAorCQkJCQlyLT5lbmQgLSByLT5zdGFydCArIDEsIHBkZXYtPm5hbWUpOworCWlmICghYXUxMDAwLT5hYzk3X3Jlc19wb3J0KSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgIkFMU0EgQUM5NzogY2FuJ3QgZ3JhYiBBQzk3IHBvcnRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpbyA9IGlvcmVtYXAoci0+c3RhcnQsIHItPmVuZCAtIHItPnN0YXJ0ICsgMSk7CisJaWYgKCFpbykKKwkJZ290byBvdXQ7CisKKwlhdTEwMDAtPmFjOTdfaW9wb3J0ID0gKHN0cnVjdCBhdTEwMDBfYWM5N19yZWcgKilpbzsKKwogCS8qIGNvbmZpZ3VyZSBwaW5zIGZvciBBQyc5NwogCVRPRE86IG1vdmUgdG8gYm9hcmRfc2V0dXAuYyAqLwogCWF1X3dyaXRlbChhdV9yZWFkbChTWVNfUElORlVOQykgJiB+MHgwMiwgU1lTX1BJTkZVTkMpOwpAQCAtNTkwLDEwNyArNjc4LDYyIEBACiAJbWRlbGF5KDUpOwogCiAJLyogSW5pdGlhbGlzZSBBQzk3IG1pZGRsZS1sYXllciAqLwotCWlmICgoZXJyID0gc25kX2FjOTdfYnVzKGF1MTAwMC0+Y2FyZCwgMCwgJm9wcywgYXUxMDAwLCAmcGJ1cykpIDwgMCkKLSAJCXJldHVybiBlcnI7CisJZXJyID0gc25kX2FjOTdfYnVzKGF1MTAwMC0+Y2FyZCwgMCwgJm9wcywgYXUxMDAwLCAmcGJ1cyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OwogCiAJbWVtc2V0KCZhYzk3LCAwLCBzaXplb2YoYWM5NykpOwogCWFjOTcucHJpdmF0ZV9kYXRhID0gYXUxMDAwOwotCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZhdTEwMDAtPmFjOTcpKSA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2V0dXAgLyBEZXN0cm95IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkCi1zbmRfYXUxMDAwX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkKQotewotCXN0cnVjdCBzbmRfYXUxMDAwICphdTEwMDAgPSBjYXJkLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoYXUxMDAwLT5hYzk3X3Jlc19wb3J0KSB7Ci0JCS8qIHB1dCBpbnRlcm5hbCBBQzk3IGJsb2NrIGludG8gcmVzZXQgKi8KLQkJYXUxMDAwLT5hYzk3X2lvcG9ydC0+Y250cmwgPSBBQzk3Q19SUzsKLQkJYXUxMDAwLT5hYzk3X2lvcG9ydCA9IE5VTEw7Ci0JCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UoYXUxMDAwLT5hYzk3X3Jlc19wb3J0KTsKLQl9Ci0KLQlpZiAoYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdKSB7Ci0JICAJaWYgKGF1MTAwMC0+c3RyZWFtW1BMQVlCQUNLXS0+ZG1hID49IDApCi0JCQlmcmVlX2F1MTAwMF9kbWEoYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdLT5kbWEpOwotCQlrZnJlZShhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10pOwotCX0KLQotCWlmIChhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXSkgewotCQlpZiAoYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0tPmRtYSA+PSAwKQotCQkJZnJlZV9hdTEwMDBfZG1hKGF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdLT5kbWEpOwotCQlrZnJlZShhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXSk7Ci0JfQotfQotCi0KLXN0YXRpYyBzdHJ1Y3Qgc25kX2NhcmQgKmF1MTAwMF9jYXJkOwotCi1zdGF0aWMgaW50IF9faW5pdAotYXUxMDAwX2luaXQodm9pZCkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKLQlzdHJ1Y3Qgc25kX2F1MTAwMCAqYXUxMDAwOwotCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKC0xLCAiQUM5NyIsIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfYXUxMDAwKSwgJmNhcmQpOworCWVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmYXUxMDAwLT5hYzk3KTsKIAlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXQ7CiAKLQljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfYXUxMDAwX2ZyZWU7Ci0JYXUxMDAwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwotCWF1MTAwMC0+Y2FyZCA9IGNhcmQ7Ci0KLQlhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkaW9fc3RyZWFtKSwgR0ZQX0tFUk5FTCk7Ci0JYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRSBdID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGlvX3N0cmVhbSksIEdGUF9LRVJORUwpOwotCS8qIHNvIHRoYXQgc25kX2F1MTAwMF9mcmVlIHdpbGwgd29yayBhcyBpbnRlbmRlZCAqLwotIAlhdTEwMDAtPmFjOTdfcmVzX3BvcnQgPSBOVUxMOwotCWlmIChhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10pCi0JCWF1MTAwMC0+c3RyZWFtW1BMQVlCQUNLXS0+ZG1hID0gLTE7Ci0JaWYgKGF1MTAwMC0+c3RyZWFtW0NBUFRVUkUgXSkKLQkJYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRSBdLT5kbWEgPSAtMTsKLQotCWlmIChhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10gPT0gTlVMTCB8fAotCSAgICBhdTEwMDAtPnN0cmVhbVtDQVBUVVJFIF0gPT0gTlVMTCkgewotCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlpZiAoKGVyciA9IHNuZF9hdTEwMDBfYWM5N19uZXcoYXUxMDAwKSkgPCAwICkgewotCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmICgoZXJyID0gc25kX2F1MTAwMF9wY21fbmV3KGF1MTAwMCkpIDwgMCkgewotCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwotCQlyZXR1cm4gZXJyOwotCX0KKwllcnIgPSBzbmRfYXUxMDAwX3BjbV9uZXcoYXUxMDAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CiAKIAlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiQXUxMDAwLUFDOTciKTsKIAlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiQU1EIEF1MTAwMC1BQzk3Iik7CiAJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIkFNRCBBdTEwMDAtLUFDOTcgQUxTQSBEcml2ZXIiKTsKIAotCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgewotCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwotCQlyZXR1cm4gZXJyOwotCX0KKwllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CiAKIAlwcmludGsoS0VSTl9JTkZPICJBTFNBIEFDOTc6IERyaXZlciBJbml0aWFsaXplZFxuIik7Ci0JYXUxMDAwX2NhcmQgPSBjYXJkOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2FyZCk7CisKIAlyZXR1cm4gMDsKKworIG91dDoKKwlzbmRfY2FyZF9mcmVlKGNhcmQpOworCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBhdTEwMDBfZXhpdCh2b2lkKQorc3RhdGljIGludCBhdTEwMDBfYWM5N19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzbmRfY2FyZF9mcmVlKGF1MTAwMF9jYXJkKTsKKwlyZXR1cm4gc25kX2NhcmRfZnJlZShwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSk7CiB9CiAKLW1vZHVsZV9pbml0KGF1MTAwMF9pbml0KTsKLW1vZHVsZV9leGl0KGF1MTAwMF9leGl0KTsKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXUxMDAwX2FjOTdjX2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJhdTEwMDAtYWM5N2MiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBhdTEwMDBfYWM5N19wcm9iZSwKKwkucmVtb3ZlCQk9IGF1MTAwMF9hYzk3X3JlbW92ZSwKK307CiAKK3N0YXRpYyBpbnQgX19pbml0IGF1MTAwMF9hYzk3X2xvYWQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhdTEwMDBfYWM5N2NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF1MTAwMF9hYzk3X3VubG9hZCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhdTEwMDBfYWM5N2NfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYXUxMDAwX2FjOTdfbG9hZCk7Cittb2R1bGVfZXhpdChhdTEwMDBfYWM5N191bmxvYWQpOwpkaWZmIC0tZ2l0IGEvc291bmQvbWlwcy9oYWwyLmMgYi9zb3VuZC9taXBzL2hhbDIuYwppbmRleCAyYjdmNmU4Li4yMzQ0MWI5IDEwMDY0NAotLS0gYS9zb3VuZC9taXBzL2hhbDIuYworKysgYi9zb3VuZC9taXBzL2hhbDIuYwpAQCAtODgwLDcgKzg4MCw3IEBACiAJc3RydWN0IHNuZF9oYWwyICpjaGlwOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGRldi0+ZGV2LCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTg4OSw3ICs4ODksNiBAQAogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwogCX0KLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOwogCiAJZXJyID0gaGFsMl9wY21fY3JlYXRlKGNoaXApOwogCWlmIChlcnIgPCAwKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9taXBzL3NnaW8yYXVkaW8uYyBiL3NvdW5kL21pcHMvc2dpbzJhdWRpby5jCmluZGV4IGNmZTk5YWUuLjA0YmIwNmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL21pcHMvc2dpbzJhdWRpby5jCisrKyBiL3NvdW5kL21pcHMvc2dpbzJhdWRpby5jCkBAIC05MjAsNyArOTIwLDcgQEAKIAlzdHJ1Y3Qgc25kX3NnaW8yYXVkaW8gKmNoaXA7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwZGV2LT5kZXYsIGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtOTI5LDcgKzkyOSw2IEBACiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBkZXYtPmRldik7CiAKIAllcnIgPSBzbmRfc2dpbzJhdWRpb19uZXdfcGNtKGNoaXApOwogCWlmIChlcnIgPCAwKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvS2NvbmZpZyBiL3NvdW5kL29zcy9LY29uZmlnCmluZGV4IDFhOTY0MDIuLjQ4NTY4ZmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9LY29uZmlnCisrKyBiL3NvdW5kL29zcy9LY29uZmlnCkBAIC0xMywxNSArMTMsNiBAQAogCSAgbm90ZSB0aGF0IENPTkZJR19LR0RCIHNob3VsZCBub3QgYmUgZW5hYmxlZCBhdCB0aGUgc2FtZQogCSAgdGltZSwgc2luY2UgaXQgYWxzbyBhdHRlbXB0cyB0byB1c2UgdGhpcyBVQVJUIHBvcnQuCiAKLWNvbmZpZyBTT1VORF9WV1NORAotCXRyaXN0YXRlICJTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIFNvdW5kIgotCWRlcGVuZHMgb24gWDg2X1ZJU1dTCi0JaGVscAotCSAgU2F5IFkgb3IgTSBpZiB5b3UgaGF2ZSBhbiBTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIGFuZCB5b3Ugd2FudCB0byBiZQotCSAgYWJsZSB0byB1c2UgaXRzIG9uLWJvYXJkIGF1ZGlvLiAgUmVhZAotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvdndzbmQ+IGZvciBtb3JlIGluZm8gb24gdGhpcyBkcml2ZXIncwotCSAgY2FwYWJpbGl0aWVzLgotCiBjb25maWcgU09VTkRfTVNORENMQVMKIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgVHVydGxlIEJlYWNoIE11bHRpU291bmQgQ2xhc3NpYywgVGFoaXRpLCBNb250ZXJleSIKIAlkZXBlbmRzIG9uIChtIHx8ICFTVEFOREFMT05FKSAmJiBJU0EKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9NYWtlZmlsZSBiL3NvdW5kL29zcy9NYWtlZmlsZQppbmRleCA3N2YyMWI2Li45YmRiYmRlIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvTWFrZWZpbGUKKysrIGIvc291bmQvb3NzL01ha2VmaWxlCkBAIC0yNCw3ICsyNCw2IEBACiBvYmotJChDT05GSUdfU09VTkRfV0FWRUFSVElTVCkJKz0gd2F2ZWFydGlzdC5vCiBvYmotJChDT05GSUdfU09VTkRfTVNORENMQVMpCSs9IG1zbmQubyBtc25kX2NsYXNzaWMubwogb2JqLSQoQ09ORklHX1NPVU5EX01TTkRQSU4pCSs9IG1zbmQubyBtc25kX3Bpbm5hY2xlLm8KLW9iai0kKENPTkZJR19TT1VORF9WV1NORCkJKz0gdndzbmQubwogb2JqLSQoQ09ORklHX1NPVU5EX0JDTV9DUzQyOTdBKQkrPSBzd2FybV9jczQyOTdhLm8KIAogb2JqLSQoQ09ORklHX0RNQVNPVU5EKQkJKz0gZG1hc291bmQvCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvcGFzMi5oIGIvc291bmQvb3NzL3BhczIuaAppbmRleCBmYTEyYzU1Li5kMTlmNzU3IDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvcGFzMi5oCisrKyBiL3NvdW5kL29zcy9wYXMyLmgKQEAgLTE1LDMgKzE1LDYgQEAKIC8qCUZyb20gcGFzX21pZGkuYyAqLwogdm9pZCBwYXNfbWlkaV9pbml0KHZvaWQpOwogdm9pZCBwYXNfbWlkaV9pbnRlcnJ1cHQodm9pZCk7CisKKy8qCUZyb20gcGFzMl9taXhlci5jKi8KK3ZvaWQgbWl4X3dyaXRlKHVuc2lnbmVkIGNoYXIgZGF0YSwgaW50IGlvYWRkcik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvcGFzMl9jYXJkLmMgYi9zb3VuZC9vc3MvcGFzMl9jYXJkLmMKaW5kZXggNzAwNGUyNC4uYjA3OTU0YSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3BhczJfY2FyZC5jCisrKyBiL3NvdW5kL29zcy9wYXMyX2NhcmQuYwpAQCAtNzQsOCArNzQsNiBAQAogICogdG8gc3VwcG9ydCBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IGJhc2UgYWRkcmVzcwogICovCiAKLWV4dGVybiB2b2lkICAgICBtaXhfd3JpdGUodW5zaWduZWQgY2hhciBkYXRhLCBpbnQgaW9hZGRyKTsKLQogdW5zaWduZWQgY2hhciBwYXNfcmVhZChpbnQgaW9hZGRyKQogewogCXJldHVybiBpbmIoaW9hZGRyICsgcGFzX3RyYW5zbGF0ZV9jb2RlKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy92d3NuZC5jIGIvc291bmQvb3NzL3Z3c25kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNzdlOWMuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL3Z3c25kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTA2ICswLDAgQEAKLS8qCi0gKiBTb3VuZCBkcml2ZXIgZm9yIFNpbGljb24gR3JhcGhpY3MgMzIwIGFuZCA1NDAgVmlzdWFsIFdvcmtzdGF0aW9ucycKLSAqIG9uYm9hcmQgYXVkaW8uICBTZWUgbm90ZXMgaW4gRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvdndzbmQgLgotICoKLSAqIENvcHlyaWdodCAxOTk5IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI3VuZGVmIFZXU05EX0RFQlVHCQkJLyogZGVmaW5lIGZvciBkZWJ1Z2dpbmcgKi8KLQotLyoKLSAqIFhYWCB0byBkbyAtCi0gKgotICoJRXh0ZXJuYWwgc3luYy4KLSAqCVJlbmFtZSBzd2J1ZiwgaHdidWYsIHUmaSwgaHdwdHImc3dwdHIgdG8gc29tZXRoaW5nIHJhdGlvbmFsLgotICoJQnVnIC0gaWYgc2VsZWN0KCkgY2FsbGVkIGJlZm9yZSByZWFkKCksIHBjbV9zZXR1cCgpIG5vdCBjYWxsZWQuCi0gKglCdWcgLSBvdXRwdXQgZG9lc24ndCBzdG9wIHNvb24gZW5vdWdoIGlmIHByb2Nlc3Mga2lsbGVkLgotICovCi0KLS8qCi0gKiBUaGluZ3MgdG8gdGVzdCAtCi0gKgotICoJV2lsbCByZWFkdi93cml0ZXYgd29yaz8gIFdyaXRlIGEgdGVzdC4KLSAqCi0gKglpbnNtb2Qvcm1tb2QgMTAwIG1pbGxpb24gdGltZXMuCi0gKgotICoJUnVuIEkvTyB1bnRpbCBpbnQgcHRycyB3cmFwIGFyb3VuZCAocm91Z2hseSA2LjIgaG91cnMgQCBEQVQKLSAqCXJhdGUpLgotICoKLSAqCUNvbmN1cnJlbnQgdGhyZWFkcyBiYW5naW5nIG9uIG1peGVyIHNpbXVsdGFuZW91c2x5LCBib3RoIFVQCi0gKglhbmQgU01QIGtlcm5lbHMuICBFc3BlY2lhbGx5LCB3YXRjaCBmb3IgdGhyZWFkIEEgY2hhbmdpbmcKLSAqCU9VVFNSQyB3aGlsZSB0aHJlYWQgQiBjaGFuZ2VzIGdhaW4gLS0gYm90aCB3cml0ZSB0byB0aGUgc2FtZQotICoJYWQxODQzIHJlZ2lzdGVyLgotICoKLSAqCVdoYXQgaGFwcGVucyBpZiBhIGNsaWVudCBvcGVucyAvZGV2L2F1ZGlvIHRoZW4gZm9ya3M/Ci0gKglEbyB0d28gcHJvY3MgaGF2ZSAvZGV2L2F1ZGlvIG9wZW4/ICBUZXN0LgotICoKLSAqCVB1bXAgYXVkaW8gdGhyb3VnaCB0aGUgQ0QsIE1JQyBhbmQgbGluZSBpbnB1dHMgYW5kIHZlcmlmeSB0aGF0Ci0gKgl0aGV5IG1peC9tdXRlIGludG8gdGhlIG91dHB1dC4KLSAqCi0gKglBcHBzOgotICoJCWFtcAotICoJCW1wZzEyMwotICoJCXgxMWFtcAotICoJCW14dgotICoJCWttZWRpYQotICoJCWVzb3VuZAotICoJCW5lZWQgbW9yZSBpbnB1dCBhcHBzCi0gKgotICoJUnVuIHRlc3RzIHdoaWxlIGJvbWJhcmRpbmcgd2l0aCBzaWduYWxzLiAgc2V0aXRpbWVyKDIpIHdpbGwgZG8gaXQuLi4gICovCi0KLS8qCi0gKiBUaGlzIGRyaXZlciBpcyBvcmdhbml6ZWQgaW4gbmluZSBzZWN0aW9ucy4KLSAqIFRoZSBuaW5lIHNlY3Rpb25zIGFyZToKLSAqCi0gKglkZWJ1ZyBzdHVmZgotICogCWxvdyBsZXZlbCBsaXRoaXVtIGFjY2VzcwotICoJaGlnaCBsZXZlbCBsaXRoaXVtIGFjY2VzcwotICoJQUQxODQzIGFjY2VzcwotICoJUENNIEkvTwotICoJYXVkaW8gZHJpdmVyCi0gKgltaXhlciBkcml2ZXIKLSAqCXByb2JlL2F0dGFjaC91bmxvYWQKLSAqCWluaXRpYWxpemF0aW9uIGFuZCBsb2FkYWJsZSBrZXJuZWwgbW9kdWxlIGludGVyZmFjZQotICoKLSAqIFRoYXQgaXMgcm91Z2hseSB0aGUgb3JkZXIgb2YgaW5jcmVhc2luZyBhYnN0cmFjdGlvbiwgc28gZm9yd2FyZAotICogZGVwZW5kZW5jaWVzIGFyZSBtaW5pbWFsLgotICovCi0KLS8qCi0gKiBMb2NraW5nIE5vdGVzCi0gKgotICoJSU5DX1VTRV9DT1VOVCBhbmQgREVDX1VTRV9DT1VOVCBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YKLSAqCW9wZW4gZGVzY3JpcHRvcnMgdG8gdGhpcyBkcml2ZXIuIFRoZXkgc3RvcmUgaXQgaW4gdndzbmRfdXNlX2NvdW50LgotICogCVRoZSBnbG9iYWwgZGV2aWNlIGxpc3QsIHZ3c25kX2Rldl9saXN0LAlpcyBpbW11dGFibGUgd2hlbiB0aGUgSU5fVVNFCi0gKglpcyB0cnVlLgotICoKLSAqCWRldmMtPm9wZW5fbG9jayBpcyBhIHNlbWFwaG9yZSB0aGF0IGlzIHVzZWQgdG8gZW5mb3JjZSB0aGUKLSAqCXNpbmdsZSByZWFkZXIvc2luZ2xlIHdyaXRlciBydWxlIGZvciAvZGV2L2F1ZGlvLiAgVGhlIHJ1bGUgaXMKLSAqCXRoYXQgZWFjaCBkZXZpY2UgbWF5IGhhdmUgYXQgbW9zdCBvbmUgcmVhZGVyIGFuZCBvbmUgd3JpdGVyLgotICoJT3BlbiB3aWxsIGJsb2NrIHVudGlsIHRoZSBwcmV2aW91cyBjbGllbnQgaGFzIGNsb3NlZCB0aGUKLSAqCWRldmljZSwgdW5sZXNzIE9fTk9OQkxPQ0sgaXMgc3BlY2lmaWVkLgotICoKLSAqCVRoZSBzZW1hcGhvcmUgZGV2Yy0+aW9fbXV0ZXggc2VyaWFsaXplcyBQQ00gSS9PIHN5c2NhbGxzLiAgVGhpcwotICoJaXMgdW5uZWNlc3NhcnkgaW4gTGludXggMi4yLCBiZWNhdXNlIHRoZSBrZXJuZWwgbG9jawotICoJc2VyaWFsaXplcyByZWFkLCB3cml0ZSwgYW5kIGlvY3RsIGdsb2JhbGx5LCBidXQgaXQncyB0aGVyZSwKLSAqCXJlYWR5IGZvciB0aGUgYnJhdmUsIG5ldyBwb3N0LWtlcm5lbC1sb2NrIHdvcmxkLgotICoKLSAqCUxvY2tpbmcgYmV0d2VlbiBpbnRlcnJ1cHQgYW5kIGJhc2VsZXZlbCBpcyBoYW5kbGVkIGJ5IHRoZQotICoJImxvY2siIHNwaW5sb2NrIGluIHZ3c25kX3BvcnQgKG9uZSBsb2NrIGVhY2ggZm9yIHJlYWQgYW5kCi0gKgl3cml0ZSkuICBFYWNoIGhhbGYgaG9sZHMgdGhlIGxvY2sganVzdCBsb25nIGVub3VnaCB0byBzZWUgd2hhdAotICoJYXJlYSBpdCBvd25zIGFuZCB1cGRhdGUgaXRzIHBvaW50ZXJzLiAgU2VlIHBjbV9vdXRwdXQoKSBhbmQKLSAqCXBjbV9pbnB1dCgpIGZvciBtb3N0IG9mIHRoZSBnb3J5IHN0dWZmLgotICoKLSAqCWRldmMtPm1peF9tdXRleCBzZXJpYWxpemVzIGFsbCBtaXhlciBpb2N0bHMuICBUaGlzIGlzIGFsc28KLSAqCXJlZHVuZGFudCBiZWNhdXNlIG9mIHRoZSBrZXJuZWwgbG9jay4KLSAqCi0gKglUaGUgbG93ZXN0IGxldmVsIGxvY2sgaXMgbGl0aC0+bGl0aGl1bV9sb2NrLiAgSXQgaXMgYQotICoJc3BpbmxvY2sgd2hpY2ggaXMgaGVsZCBkdXJpbmcgdGhlIHR3by1yZWdpc3RlciB0YW5nbyBvZgotICoJcmVhZGluZy93cml0aW5nIGFuIEFEMTg0MyByZWdpc3Rlci4gIFNlZQotICoJbGlfe3JlYWQsd3JpdGV9X2FkMTg0M19yZWcoKS4KLSAqLwotCi0vKgotICogU2FtcGxlIEZvcm1hdCBOb3RlcwotICoKLSAqCUxpdGhpdW0ncyBETUEgZW5naW5lIGhhcyB0d28gZm9ybWF0czogMTYtYml0IDIncyBjb21wbGVtZW50Ci0gKglhbmQgOC1iaXQgdW5zaWduZWQgLiAgMTYtYml0IHRyYW5zZmVycyB0aGUgZGF0YSB1bm1vZGlmaWVkLCAyCi0gKglieXRlcyBwZXIgc2FtcGxlLiAgOC1iaXQgdW5zaWduZWQgdHJhbnNmZXJzIDEgYnl0ZSBwZXIgc2FtcGxlCi0gKglhbmQgWE9ScyBlYWNoIGJ5dGUgd2l0aCAweDgwLiAgTGl0aGl1bSBjYW4gaW5wdXQgb3Igb3V0cHV0Ci0gKgllaXRoZXIgbW9ubyBvciBzdGVyZW8gaW4gZWl0aGVyIGZvcm1hdC4KLSAqCi0gKglUaGUgQUQxODQzIGhhcyBmb3VyIGZvcm1hdHM6IDE2LWJpdCAyJ3MgY29tcGxlbWVudCwgOC1iaXQKLSAqCXVuc2lnbmVkLCA4LWJpdCBtdS1MYXcgYW5kIDgtYml0IEEtTGF3LgotICoKLSAqCVRoaXMgZHJpdmVyIHN1cHBvcnRzIGZpdmUgZm9ybWF0czogQUZNVF9TOCwgQUZNVF9VOCwKLSAqCUFGTVRfTVVfTEFXLCBBRk1UX0FfTEFXLCBhbmQgQUZNVF9TMTZfTEUuCi0gKgotICoJRm9yIEFGTVRfVTggb3V0cHV0LCB3ZSBrZWVwIHRoZSBBRDE4NDMgaW4gMTYtYml0IG1vZGUsIGFuZAotICoJcmVseSBvbiBMaXRoaXVtJ3MgWE9SIHRvIHRyYW5zbGF0ZSBiZXR3ZWVuIFU4IGFuZCBTOC4KLSAqCi0gKglGb3IgQUZNVF9TOCwgQUZNVF9NVV9MQVcgYW5kIEFGTVRfQV9MQVcgb3V0cHV0LCB3ZSBoYXZlIHRvIFhPUgotICoJdGhlIDB4ODAgYml0IGluIHNvZnR3YXJlIHRvIGNvbXBlbnNhdGUgZm9yIExpdGhpdW0ncyBYT1IuCi0gKglUaGlzIGhhcHBlbnMgaW4gcGNtX2NvcHlfe2luLG91dH0oKS4KLSAqCi0gKiBDaGFuZ2VzOgotICogMTEtMTAtMjAwMAlCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6IDxia3pAbGludXgtaWRlLm9yZz4KLSAqCQlBZGRlZCBzb21lIF9faW5pdC9fX2V4aXQKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGFzbS92aXN3cy9jb2JhbHQuaD4KLQotI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgotCi1zdGF0aWMgREVGSU5FX01VVEVYKHZ3c25kX211dGV4KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogZGVidWcgc3R1ZmYgKi8KLQotI2lmZGVmIFZXU05EX0RFQlVHCi0KLXN0YXRpYyBpbnQgc2h1dF91cCA9IDE7Ci0KLS8qCi0gKiBkYmdhc3NlcnQgLSBjYWxsZWQgd2hlbiBhbiBhc3NlcnRpb24gZmFpbHMuCi0gKi8KLQotc3RhdGljIHZvaWQgZGJnYXNzZXJ0KGNvbnN0IGNoYXIgKmZjbiwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmV4cHIpCi17Ci0JaWYgKGluX2ludGVycnVwdCgpKQotCQlwYW5pYygiQVNTRVJUSU9OIEZBSUxFRCBJTiBJTlRFUlJVUFQsICVzOiVzOiVkICVzXG4iLAotCQkgICAgICBfX0ZJTEVfXywgZmNuLCBsaW5lLCBleHByKTsKLQllbHNlIHsKLQkJaW50IHg7Ci0JCXByaW50ayhLRVJOX0VSUiAiQVNTRVJUSU9OIEZBSUxFRCwgJXM6JXM6JWQgJXNcbiIsCi0JCSAgICAgICBfX0ZJTEVfXywgZmNuLCBsaW5lLCBleHByKTsKLQkJeCA9ICogKHZvbGF0aWxlIGludCAqKSAwOyAvKiBmb3JjZSBwcm9jIHRvIGV4aXQgKi8KLQl9Ci19Ci0KLS8qCi0gKiBCdW5jaCBvZiB1c2VmdWwgZGVidWcgbWFjcm9zOgotICoKLSAqCUFTU0VSVAktIHByaW50IHVubGVzcyBlIG5vbnplcm8gKHBhbmljIGlmIGluIGludGVycnVwdCkKLSAqCURCR0RPCS0gaW5jbHVkZSBhcmJpdHJhcnkgY29kZSBpZiBkZWJ1Z2dpbmcKLSAqCURCR1gJLSBkZWJ1ZyBwcmludCByYXcgKHcvbyBmdW5jdGlvbiBuYW1lKQotICoJREJHUAktIGRlYnVnIHByaW50IHcvIGZ1bmN0aW9uIG5hbWUKLSAqCURCR0UJLSBkZWJ1ZyBwcmludCBmdW5jdGlvbiBlbnRyeQotICoJREJHQwktIGRlYnVnIHByaW50IGZ1bmN0aW9uIGNhbGwKLSAqCURCR1IJLSBkZWJ1ZyBwcmludCBmdW5jdGlvbiByZXR1cm4KLSAqCURCR1hWCS0gZGVidWcgcHJpbnQgcmF3IHdoZW4gdmVyYm9zZQotICoJREJHUFYJLSBkZWJ1ZyBwcmludCB3aGVuIHZlcmJvc2UKLSAqCURCR0VWCS0gZGVidWcgcHJpbnQgZnVuY3Rpb24gZW50cnkgd2hlbiB2ZXJib3NlCi0gKglEQkdSVgktIGRlYnVnIHByaW50IGZ1bmN0aW9uIHJldHVybiB3aGVuIHZlcmJvc2UKLSAqLwotCi0jZGVmaW5lIEFTU0VSVChlKSAgICAgICgoZSkgPyAodm9pZCkgMCA6IGRiZ2Fzc2VydChfX2Z1bmNfXywgX19MSU5FX18sICNlKSkKLSNkZWZpbmUgREJHRE8oeCkgICAgICAgICAgICB4Ci0jZGVmaW5lIERCR1goZm10LCBhcmdzLi4uKSAgKGluX2ludGVycnVwdCgpID8gMCA6IHByaW50ayhLRVJOX0VSUiBmbXQsICMjYXJncykpCi0jZGVmaW5lIERCR1AoZm10LCBhcmdzLi4uKSAgKERCR1goIiVzOiAiIGZtdCwgX19mdW5jX18gLCAjI2FyZ3MpKQotI2RlZmluZSBEQkdFKGZtdCwgYXJncy4uLikgIChEQkdYKCIlcyIgZm10LCBfX2Z1bmNfXyAsICMjYXJncykpCi0jZGVmaW5lIERCR0MocnRuKSAgICAgICAgICAgKERCR1AoImNhbGxpbmcgJXNcbiIsIHJ0bikpCi0jZGVmaW5lIERCR1IoKSAgICAgICAgICAgICAgKERCR1AoInJldHVybmluZ1xuIikpCi0jZGVmaW5lIERCR1hWKGZtdCwgYXJncy4uLikgKHNodXRfdXAgPyAwIDogREJHWChmbXQsICMjYXJncykpCi0jZGVmaW5lIERCR1BWKGZtdCwgYXJncy4uLikgKHNodXRfdXAgPyAwIDogREJHUChmbXQsICMjYXJncykpCi0jZGVmaW5lIERCR0VWKGZtdCwgYXJncy4uLikgKHNodXRfdXAgPyAwIDogREJHRShmbXQsICMjYXJncykpCi0jZGVmaW5lIERCR0NWKHJ0bikgICAgICAgICAgKHNodXRfdXAgPyAwIDogREJHQyhydG4pKQotI2RlZmluZSBEQkdSVigpICAgICAgICAgICAgIChzaHV0X3VwID8gMCA6IERCR1IoKSkKLQotI2Vsc2UgLyogIVZXU05EX0RFQlVHICovCi0KLSNkZWZpbmUgQVNTRVJUKGUpICAgICAgICAgICAoKHZvaWQpIDApCi0jZGVmaW5lIERCR0RPKHgpICAgICAgICAgICAgLyogZG9uJ3QgKi8KLSNkZWZpbmUgREJHWChmbXQsIGFyZ3MuLi4pICAoKHZvaWQpIDApCi0jZGVmaW5lIERCR1AoZm10LCBhcmdzLi4uKSAgKCh2b2lkKSAwKQotI2RlZmluZSBEQkdFKGZtdCwgYXJncy4uLikgICgodm9pZCkgMCkKLSNkZWZpbmUgREJHQyhydG4pICAgICAgICAgICAoKHZvaWQpIDApCi0jZGVmaW5lIERCR1IoKSAgICAgICAgICAgICAgKCh2b2lkKSAwKQotI2RlZmluZSBEQkdQVihmbXQsIGFyZ3MuLi4pICgodm9pZCkgMCkKLSNkZWZpbmUgREJHWFYoZm10LCBhcmdzLi4uKSAoKHZvaWQpIDApCi0jZGVmaW5lIERCR0VWKGZtdCwgYXJncy4uLikgKCh2b2lkKSAwKQotI2RlZmluZSBEQkdDVihydG4pICAgICAgICAgICgodm9pZCkgMCkKLSNkZWZpbmUgREJHUlYoKSAgICAgICAgICAgICAoKHZvaWQpIDApCi0KLSNlbmRpZiAvKiAhVldTTkRfREVCVUcgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogbG93IGxldmVsIGxpdGhpdW0gYWNjZXNzICovCi0KLS8qCi0gKiBXZSBuZWVkIHRvIHRhbGsgdG8gTGl0aGl1bSByZWdpc3RlcnMgb24gdGhyZWUgcGFnZXMuICBIZXJlIGFyZQotICogdGhlIHBhZ2VzJyBvZmZzZXRzIGZyb20gdGhlIGJhc2UgYWRkcmVzcyAoMHhGRjAwMTAwMCkuCi0gKi8KLQotZW51bSB7Ci0JTElfUEFHRTBfT0ZGU0VUID0gMHgwMTAwMCAtIDB4MTAwMCwgLyogRkYwMDEwMDAgKi8KLQlMSV9QQUdFMV9PRkZTRVQgPSAweDBGMDAwIC0gMHgxMDAwLCAvKiBGRjAwRjAwMCAqLwotCUxJX1BBR0UyX09GRlNFVCA9IDB4MTAwMDAgLSAweDEwMDAsIC8qIEZGMDEwMDAwICovCi19OwotCi0vKiBsb3ctbGV2ZWwgbGl0aGl1bSBkYXRhICovCi0KLXR5cGVkZWYgc3RydWN0IGxpdGhpdW0gewotCXZvaWQgKgkJcGFnZTA7CQkvKiB2aXJ0dWFsIGFkZHJlc3NlcyAqLwotCXZvaWQgKgkJcGFnZTE7Ci0Jdm9pZCAqCQlwYWdlMjsKLQlzcGlubG9ja190CWxvY2s7CQkvKiBwcm90ZWN0cyBjb2RlYyBhbmQgVVNUL01TQyBhY2Nlc3MgKi8KLX0gbGl0aGl1bV90OwotCi0vKgotICogbGlfZGVzdHJveSBkZXN0cm95cyB0aGUgbGl0aGl1bV90IHN0cnVjdHVyZSBhbmQgdm0gbWFwcGluZ3MuCi0gKi8KLQotc3RhdGljIHZvaWQgbGlfZGVzdHJveShsaXRoaXVtX3QgKmxpdGgpCi17Ci0JaWYgKGxpdGgtPnBhZ2UwKSB7Ci0JCWlvdW5tYXAobGl0aC0+cGFnZTApOwotCQlsaXRoLT5wYWdlMCA9IE5VTEw7Ci0JfQotCWlmIChsaXRoLT5wYWdlMSkgewotCQlpb3VubWFwKGxpdGgtPnBhZ2UxKTsKLQkJbGl0aC0+cGFnZTEgPSBOVUxMOwotCX0KLQlpZiAobGl0aC0+cGFnZTIpIHsKLQkJaW91bm1hcChsaXRoLT5wYWdlMik7Ci0JCWxpdGgtPnBhZ2UyID0gTlVMTDsKLQl9Ci19Ci0KLS8qCi0gKiBsaV9jcmVhdGUgaW5pdGlhbGl6ZXMgdGhlIGxpdGhpdW1fdCBzdHJ1Y3R1cmUgYW5kIHNldHMgdXAgdm0gbWFwcGluZ3MKLSAqIHRvIGFjY2VzcyB0aGUgcmVnaXN0ZXJzLgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGxpX2NyZWF0ZShsaXRoaXVtX3QgKmxpdGgsIHVuc2lnbmVkIGxvbmcgYmFzZWFkZHIpCi17Ci0Jc3Bpbl9sb2NrX2luaXQoJmxpdGgtPmxvY2spOwotCWxpdGgtPnBhZ2UwID0gaW9yZW1hcF9ub2NhY2hlKGJhc2VhZGRyICsgTElfUEFHRTBfT0ZGU0VULCBQQUdFX1NJWkUpOwotCWxpdGgtPnBhZ2UxID0gaW9yZW1hcF9ub2NhY2hlKGJhc2VhZGRyICsgTElfUEFHRTFfT0ZGU0VULCBQQUdFX1NJWkUpOwotCWxpdGgtPnBhZ2UyID0gaW9yZW1hcF9ub2NhY2hlKGJhc2VhZGRyICsgTElfUEFHRTJfT0ZGU0VULCBQQUdFX1NJWkUpOwotCWlmICghbGl0aC0+cGFnZTAgfHwgIWxpdGgtPnBhZ2UxIHx8ICFsaXRoLT5wYWdlMikgewotCQlsaV9kZXN0cm95KGxpdGgpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBiYXNpYyByZWdpc3RlciBhY2Nlc3NvcnMgLSByZWFkL3dyaXRlIGxvbmcvYnl0ZQotICovCi0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbGlfcmVhZGwobGl0aGl1bV90ICpsaXRoLCBpbnQgb2ZmKQotewotCXJldHVybiAqICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChsaXRoLT5wYWdlMCArIG9mZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGNoYXIgbGlfcmVhZGIobGl0aGl1bV90ICpsaXRoLCBpbnQgb2ZmKQotewotCXJldHVybiAqICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChsaXRoLT5wYWdlMCArIG9mZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgbGlfd3JpdGVsKGxpdGhpdW1fdCAqbGl0aCwgaW50IG9mZiwgdW5zaWduZWQgbG9uZyB2YWwpCi17Ci0JKiAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAobGl0aC0+cGFnZTAgKyBvZmYpID0gdmFsOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGxpX3dyaXRlYihsaXRoaXVtX3QgKmxpdGgsIGludCBvZmYsIHVuc2lnbmVkIGNoYXIgdmFsKQotewotCSogKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKGxpdGgtPnBhZ2UwICsgb2ZmKSA9IHZhbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogSGlnaCBMZXZlbCBMaXRoaXVtIEFjY2VzcyAqLwotCi0vKgotICogTGl0aGl1bSBETUEgTm90ZXMKLSAqCi0gKiBMaXRoaXVtIGhhcyB0d28gZGVkaWNhdGVkIERNQSBjaGFubmVscyBmb3IgYXVkaW8uICBUaGV5IGFyZSBrbm93bgotICogYXMgY29tbTEgYW5kIGNvbW0yIChjb21tdW5pY2F0aW9uIGFyZWFzIDEgYW5kIDIpLiAgQ29tbTEgaXMgZm9yCi0gKiBpbnB1dCwgYW5kIGNvbW0yIGlzIGZvciBvdXRwdXQuICBFYWNoIGlzIGNvbnRyb2xsZWQgYnkgdGhyZWUKLSAqIHJlZ2lzdGVyczogQkFTRSAoYmFzZSBhZGRyZXNzKSwgQ0ZHIChjb25maWcpIGFuZCBDQ1RMCi0gKiAoY29uZmlnL2NvbnRyb2wpLgotICoKLSAqIEVhY2ggRE1BIGNoYW5uZWwgcG9pbnRzIHRvIGEgcGh5c2ljYWxseSBjb250aWd1b3VzIHJpbmcgYnVmZmVyIGluCi0gKiBtYWluIG1lbW9yeSBvZiB1cCB0byA4IEtieXRlcy4gIChUaGlzIGRyaXZlciBhbHdheXMgdXNlcyA4IEtiLikKLSAqIFRoZXJlIGFyZSB0aHJlZSBwb2ludGVycyBpbnRvIHRoZSByaW5nIGJ1ZmZlcjogcmVhZCwgd3JpdGUsIGFuZAotICogdHJpZ2dlci4gIFRoZSBwb2ludGVycyBhcmUgOCBiaXRzIGVhY2guICBFYWNoIHBvaW50ZXIgcG9pbnRzIHRvCi0gKiAzMi1ieXRlICJjaHVua3MiIG9mIGRhdGEuICBUaGUgRE1BIGVuZ2luZSBtb3ZlcyAzMiBieXRlcyBhdCBhIHRpbWUsCi0gKiBzbyB0aGVyZSBpcyBubyBmaW5lci1ncmFudWxhcml0eSBjb250cm9sLgotICoKLSAqIEluIGNvbW0xLCB0aGUgaGFyZHdhcmUgdXBkYXRlcyB0aGUgd3JpdGUgcHRyLCBhbmQgc29mdHdhcmUgdXBkYXRlcwotICogdGhlIHJlYWQgcHRyLiAgSW4gY29tbTIsIGl0J3MgdGhlIG9wcG9zaXRlOiBoYXJkd2FyZSB1cGRhdGVzIHRoZQotICogcmVhZCBwdHIsIGFuZCBzb2Z0d2FyZSB1cGRhdGVzIHRoZSB3cml0ZSBwdHIuICBJIGRlc2lnbmF0ZSB0aGUKLSAqIGhhcmR3YXJlLXVwZGF0ZWQgcHRyIGFzIHRoZSBod3B0ciwgYW5kIHRoZSBzb2Z0d2FyZS11cGRhdGVkIHB0ciBhcwotICogdGhlIHN3cHRyLgotICoKLSAqIFRoZSB0cmlnZ2VyIHB0ciBhbmQgdHJpZ2dlciBtYXNrIGFyZSB1c2VkIHRvIHRyaWdnZXIgaW50ZXJydXB0cy4KLSAqIEZyb20gdGhlIExpdGhpdW0gc3BlYywgc2VjdGlvbiA1LjYuOCwgcmV2aXNpb24gb2YgMTIvMTUvMTk5ODoKLSAqCi0gKglUcmlnZ2VyIE1hc2sgVmFsdWUKLSAqCi0gKglBIHRocmVlIGJpdCB3aWRlIGZpZWxkIHRoYXQgcmVwcmVzZW50cyBhIHBvd2VyIG9mIHR3byBtYXNrCi0gKgl0aGF0IGlzIHVzZWQgd2hlbmV2ZXIgdGhlIHRyaWdnZXIgcG9pbnRlciBpcyBjb21wYXJlZCB0byBpdHMKLSAqCXJlc3BlY3RpdmUgcmVhZCBvciB3cml0ZSBwb2ludGVyLiAgQSB2YWx1ZSBvZiB6ZXJvIGhlcmUKLSAqCWltcGxpZXMgYSBtYXNrIG9mIDB4RkYgYW5kIGEgdmFsdWUgb2Ygc2V2ZW4gaW1wbGllcyBhIG1hc2sKLSAqCTB4MDEuICBUaGlzIHZhbHVlIGNhbiBiZSB1c2VkIHRvIHN1Yi1kaXZpZGUgdGhlIHJpbmcgYnVmZmVyCi0gKglpbnRvIHBpZSBzZWN0aW9ucyBzbyB0aGF0IGludGVycnVwdHMgbW9uaXRvciB0aGUgcHJvZ3Jlc3Mgb2YKLSAqCWhhcmR3YXJlIGZyb20gc2VjdGlvbiB0byBzZWN0aW9uLgotICoKLSAqIE15IGludGVycHJldGF0aW9uIG9mIHRoYXQgaXMsIHdoZW5ldmVyIHRoZSBodyBwdHIgaXMgdXBkYXRlZCwgaXQgaXMKLSAqIGNvbXBhcmVkIHdpdGggdGhlIHRyaWdnZXIgcHRyLCBhbmQgdGhlIHJlc3VsdCBpcyBtYXNrZWQgYnkgdGhlCi0gKiB0cmlnZ2VyIG1hc2suICAoQWN0dWFsbHksIGJ5IHRoZSBjb21wbGVtZW50IG9mIHRoZSB0cmlnZ2VyIG1hc2suKQotICogSWYgdGhlIHJlc3VsdCBpcyB6ZXJvLCBhbiBpbnRlcnJ1cHQgaXMgdHJpZ2dlcmVkLiAgSS5lLiwgaW50ZXJydXB0Ci0gKiBpZiAoKGh3cHRyICYgfm1hc2spID09ICh0cnB0ciAmIH5tYXNrKSkuICBUaGUgbWFzayBpcyBmb3JtZWQgZnJvbQotICogdGhlIHRyaWdnZXIgcmVnaXN0ZXIgdmFsdWUgYXMgbWFzayA9ICgxIDw8ICg4IC0gdG1yZWcpKSAtIDEuCi0gKgotICogSW4geWV0IGRpZmZlcmVudCB3b3Jkcywgc2V0dGluZyB0bXJlZyB0byAwIGNhdXNlcyBhbiBpbnRlcnJ1cHQgYWZ0ZXIKLSAqIGV2ZXJ5IDI1NiBETUEgY2h1bmtzICg4MTkyIGJ5dGVzKSBvciBvbmNlIHBlciB0cmF2ZXJzYWwgb2YgdGhlCi0gKiByaW5nIGJ1ZmZlci4gIFNldHRpbmcgaXQgdG8gNyBjYXVlcyBhbiBpbnRlcnJ1cHQgZXZlcnkgMiBETUEgY2h1bmtzCi0gKiAoNjQgYnl0ZXMpIG9yIDEyOCB0aW1lcyBwZXIgdHJhdmVyc2FsIG9mIHRoZSByaW5nIGJ1ZmZlci4KLSAqLwotCi0vKiBMaXRoaXVtIHJlZ2lzdGVyIG9mZnNldHMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLwotCi0jZGVmaW5lIExJX0hPU1RfQ09OVFJPTExFUgkweDAwMAotIyBkZWZpbmUgTElfSENfUkVTRVQJCSAweDAwMDA4MDAwCi0jIGRlZmluZSBMSV9IQ19MSU5LX0VOQUJMRQkgMHgwMDAwNDAwMAotIyBkZWZpbmUgTElfSENfTElOS19GQUlMVVJFCSAweDAwMDAwMDA0Ci0jIGRlZmluZSBMSV9IQ19MSU5LX0NPREVDCSAweDAwMDAwMDAyCi0jIGRlZmluZSBMSV9IQ19MSU5LX1JFQURZCSAweDAwMDAwMDAxCi0KLSNkZWZpbmUgTElfSU5UUl9TVEFUVVMJCTB4MDEwCi0jZGVmaW5lIExJX0lOVFJfTUFTSwkJMHgwMTQKLSMgZGVmaW5lIExJX0lOVFJfTElOS19FUlIJIDB4MDAwMDgwMDAKLSMgZGVmaW5lIExJX0lOVFJfQ09NTTJfVFJJRwkgMHgwMDAwMDAwOAotIyBkZWZpbmUgTElfSU5UUl9DT01NMl9VTkRFUkZMT1cgMHgwMDAwMDAwNAotIyBkZWZpbmUgTElfSU5UUl9DT01NMV9UUklHCSAweDAwMDAwMDAyCi0jIGRlZmluZSBMSV9JTlRSX0NPTU0xX09WRVJGTE9XICAweDAwMDAwMDAxCi0KLSNkZWZpbmUgTElfQ09ERUNfQ09NTUFORAkweDAxOAotIyBkZWZpbmUgTElfQ0NfQlVTWQkJIDB4MDAwMDgwMDAKLSMgZGVmaW5lIExJX0NDX0RJUgkJIDB4MDAwMDAwODAKLSMgIGRlZmluZSBMSV9DQ19ESVJfUkQJCSAgTElfQ0NfRElSCi0jICBkZWZpbmUgTElfQ0NfRElSX1dSCQkoIUxJX0NDX0RJUikKLSMgZGVmaW5lIExJX0NDX0FERFJfTUFTSwkgMHgwMDAwMDA3RgotCi0jZGVmaW5lIExJX0NPREVDX0RBVEEJCTB4MDFDCi0KLSNkZWZpbmUgTElfQ09NTTFfQkFTRQkJMHgxMDAKLSNkZWZpbmUgTElfQ09NTTFfQ1RMCQkweDEwNAotIyBkZWZpbmUgTElfQ0NUTF9SRVNFVAkJIDB4ODAwMDAwMDAKLSMgZGVmaW5lIExJX0NDVExfU0laRQkJIDB4NzAwMDAwMDAKLSMgZGVmaW5lIExJX0NDVExfRE1BX0VOQUJMRQkgMHgwODAwMDAwMAotIyBkZWZpbmUgTElfQ0NUTF9UTUFTSwkJIDB4MDcwMDAwMDAgLyogdHJpZ2dlciBtYXNrICovCi0jIGRlZmluZSBMSV9DQ1RMX1RQVFIJCSAweDAwRkYwMDAwIC8qIHRyaWdnZXIgcG9pbnRlciAqLwotIyBkZWZpbmUgTElfQ0NUTF9SUFRSCQkgMHgwMDAwRkYwMAotIyBkZWZpbmUgTElfQ0NUTF9XUFRSCQkgMHgwMDAwMDBGRgotI2RlZmluZSBMSV9DT01NMV9DRkcJCTB4MTA4Ci0jIGRlZmluZSBMSV9DQ0ZHX0xPQ0sJCSAweDAwMDA4MDAwCi0jIGRlZmluZSBMSV9DQ0ZHX1NMT1QJCSAweDAwMDAwMDcwCi0jIGRlZmluZSBMSV9DQ0ZHX0RJUkVDVElPTgkgMHgwMDAwMDAwOAotIyAgZGVmaW5lIExJX0NDRkdfRElSX0lOCSghTElfQ0NGR19ESVJFQ1RJT04pCi0jICBkZWZpbmUgTElfQ0NGR19ESVJfT1VUCSAgTElfQ0NGR19ESVJFQ1RJT04KLSMgZGVmaW5lIExJX0NDRkdfTU9ERQkJIDB4MDAwMDAwMDQKLSMgIGRlZmluZSBMSV9DQ0ZHX01PREVfTU9OTwkoIUxJX0NDRkdfTU9ERSkKLSMgIGRlZmluZSBMSV9DQ0ZHX01PREVfU1RFUkVPCSAgTElfQ0NGR19NT0RFCi0jIGRlZmluZSBMSV9DQ0ZHX0ZPUk1BVAkJIDB4MDAwMDAwMDMKLSMgIGRlZmluZSBMSV9DQ0ZHX0ZNVF84QklUCSAgMHgwMDAwMDAwMAotIyAgZGVmaW5lIExJX0NDRkdfRk1UXzE2QklUCSAgMHgwMDAwMDAwMQotI2RlZmluZSBMSV9DT01NMl9CQVNFCQkweDEwQwotI2RlZmluZSBMSV9DT01NMl9DVEwJCTB4MTEwCi0gLyogYml0IGRlZmluaXRpb25zIGFyZSB0aGUgc2FtZSBhcyBMSV9DT01NMV9DVEwgKi8KLSNkZWZpbmUgTElfQ09NTTJfQ0ZHCQkweDExNAotIC8qIGJpdCBkZWZpbml0aW9ucyBhcmUgdGhlIHNhbWUgYXMgTElfQ09NTTFfQ0ZHICovCi0KLSNkZWZpbmUgTElfVVNUX0xPVwkJMHgyMDAJLyogNjQtYml0IFVuYWRqdXN0ZWQgU3lzdGVtIFRpbWUgaXMgKi8KLSNkZWZpbmUgTElfVVNUX0hJR0gJCTB4MjA0CS8qIG1pY3Jvc2Vjb25kcyBzaW5jZSBib290ICovCi0KLSNkZWZpbmUgTElfQVVESU8xX1VTVAkJMHgzMDAJLyogVVNULU1TQyBwYWlycyAqLwotI2RlZmluZSBMSV9BVURJTzFfTVNDCQkweDMwNAkvKiBNU0MgKE1lZGlhIFN0cmVhbSBDb3VudGVyKSAqLwotI2RlZmluZSBMSV9BVURJTzJfVVNUCQkweDMwOAkvKiBjb3VudHMgc2FtcGxlcyBhY3R1YWxseSAqLwotI2RlZmluZSBMSV9BVURJTzJfTVNDCQkweDMwQwkvKiBwcm9jZXNzZWQgYXMgb2YgdGltZSBVU1QgKi8KLQotLyogCi0gKiBMaXRoaXVtJ3MgRE1BIGVuZ2luZSBvcGVyYXRlcyBvbiBjaHVua3Mgb2YgMzIgYnl0ZXMuICBXZSBjYWxsIHRoYXQKLSAqIGEgRE1BQ0hVTksuCi0gKi8KLQotI2RlZmluZSBETUFDSFVOS19TSElGVCA1Ci0jZGVmaW5lIERNQUNIVU5LX1NJWkUgKDEgPDwgRE1BQ0hVTktfU0hJRlQpCi0jZGVmaW5lIEJZVEVTX1RPX0NIVU5LUyhieXRlcykgKChieXRlcykgPj4gRE1BQ0hVTktfU0hJRlQpCi0jZGVmaW5lIENIVU5LU19UT19CWVRFUyhjaHVua3MpICgoY2h1bmtzKSA8PCBETUFDSFVOS19TSElGVCkKLQotLyoKLSAqIFR3byBjb252ZW5pZW50IG1hY3JvcyB0byBzaGlmdCBiaXRmaWVsZHMgaW50by9vdXQgb2YgcG9zaXRpb24uCi0gKgotICogT2JzZXJ2ZSB0aGF0IChtYXNrICYgLW1hc2spIGlzICgxIDw8IGxvd19zZXRfYml0X29mKG1hc2spKS4KLSAqIEFzIGxvbmcgYXMgbWFzayBpcyBjb25zdGFudCwgd2UgdHJ1c3QgdGhlIGNvbXBpbGVyIHdpbGwgY2hhbmdlIHRoZQotICogbXVsdGlwbHkgYW5kIGRpdmlkZSBpbnRvIHNoaWZ0cy4KLSAqLwotCi0jZGVmaW5lIFNISUZUX0ZJRUxEKHZhbCwgbWFzaykgKCgodmFsKSAqICgobWFzaykgJiAtKG1hc2spKSkgJiAobWFzaykpCi0jZGVmaW5lIFVOU0hJRlRfRklFTEQodmFsLCBtYXNrKSAoKCh2YWwpICYgKG1hc2spKSAvICgobWFzaykgJiAtKG1hc2spKSkKLQotLyoKLSAqIGRtYV9jaGFuX2Rlc2MgaXMgaW52YXJpYW50IGluZm9ybWF0aW9uIGFib3V0IGEgTGl0aGl1bQotICogRE1BIGNoYW5uZWwuICBUaGVyZSBhcmUgdHdvIGluc3RhbmNlcywgbGlfY29tbTEgYW5kIGxpX2NvbW0yLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgQ0NUTCByZWdpc3RlciBmaWVsZHMgYXJlIHdyaXRlIHB0ciBhbmQgcmVhZCBwdHIsIGJ1dCB3aGF0Ci0gKiB3ZSBjYXJlIGFib3V0IGFyZSB3aGljaCBwb2ludGVyIGlzIHVwZGF0ZWQgYnkgc29mdHdhcmUgYW5kIHdoaWNoIGJ5Ci0gKiBoYXJkd2FyZS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBkbWFfY2hhbl9kZXNjIHsKLQlpbnQgYmFzZXJlZzsKLQlpbnQgY2ZncmVnOwotCWludCBjdGxyZWc7Ci0JaW50IGh3cHRycmVnOwotCWludCBzd3B0cnJlZzsKLQlpbnQgdXN0cmVnOwotCWludCBtc2NyZWc7Ci0JdW5zaWduZWQgbG9uZyBzd3B0cm1hc2s7Ci0JaW50IGFkMTg0M19zbG90OwotCWludCBkaXJlY3Rpb247CQkJLyogTElfQ0NUTF9ESVJfSU4vT1VUICovCi19IGRtYV9jaGFuX2Rlc2NfdDsKLQotc3RhdGljIGNvbnN0IGRtYV9jaGFuX2Rlc2NfdCBsaV9jb21tMSA9IHsKLQlMSV9DT01NMV9CQVNFLAkJCS8qIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0ICovCi0JTElfQ09NTTFfQ0ZHLAkJCS8qIGNvbmZpZyByZWdpc3RlciBvZmZzZXQgKi8KLQlMSV9DT01NMV9DVEwsCQkJLyogY29udHJvbCByZWdpc3RlciBvZmZzZXQgKi8KLQlMSV9DT01NMV9DVEwgKyAwLAkJLyogaHcgcHRyIHJlZyBvZmZzZXQgKHdyaXRlIHB0cikgKi8KLQlMSV9DT01NMV9DVEwgKyAxLAkJLyogc3cgcHRyIHJlZyBvZmZzZXQgKHJlYWQgcHRyKSAqLwotCUxJX0FVRElPMV9VU1QsCQkJLyogdXN0IHJlZyBvZmZzZXQgKi8KLQlMSV9BVURJTzFfTVNDLAkJCS8qIG1zYyByZWcgb2Zmc2V0ICovCi0JTElfQ0NUTF9SUFRSLAkJCS8qIHN3IHB0ciBiaXRtYXNrIGluIGN0bHZhbCAqLwotCTIsCQkJCS8qIGFkMTg0MyBzZXJpYWwgc2xvdCAqLwotCUxJX0NDRkdfRElSX0lOCQkJLyogZGlyZWN0aW9uICovCi19OwotCi1zdGF0aWMgY29uc3QgZG1hX2NoYW5fZGVzY190IGxpX2NvbW0yID0gewotCUxJX0NPTU0yX0JBU0UsCQkJLyogYmFzZSByZWdpc3RlciBvZmZzZXQgKi8KLQlMSV9DT01NMl9DRkcsCQkJLyogY29uZmlnIHJlZ2lzdGVyIG9mZnNldCAqLwotCUxJX0NPTU0yX0NUTCwJCQkvKiBjb250cm9sIHJlZ2lzdGVyIG9mZnNldCAqLwotCUxJX0NPTU0yX0NUTCArIDEsCQkvKiBodyBwdHIgcmVnIG9mZnNldCAocmVhZCBwdHIpICovCi0JTElfQ09NTTJfQ1RMICsgMCwJCS8qIHN3IHB0ciByZWcgb2Zmc2V0ICh3cml0ciBwdHIpICovCi0JTElfQVVESU8yX1VTVCwJCQkvKiB1c3QgcmVnIG9mZnNldCAqLwotCUxJX0FVRElPMl9NU0MsCQkJLyogbXNjIHJlZyBvZmZzZXQgKi8KLQlMSV9DQ1RMX1dQVFIsCQkJLyogc3cgcHRyIGJpdG1hc2sgaW4gY3RsdmFsICovCi0JMiwJCQkJLyogYWQxODQzIHNlcmlhbCBzbG90ICovCi0JTElfQ0NGR19ESVJfT1VUCQkJLyogZGlyZWN0aW9uICovCi19OwotCi0vKgotICogZG1hX2NoYW4gaXMgdmFyaWFibGUgaW5mb3JtYXRpb24gYWJvdXQgYSBMaXRoaXVtIERNQSBjaGFubmVsLgotICoKLSAqIFRoZSBkZXNjIGZpZWxkIHBvaW50cyB0byBpbnZhcmlhbnQgaW5mb3JtYXRpb24uCi0gKiBUaGUgbGl0aCBmaWVsZCBwb2ludHMgdG8gYSBsaXRoaXVtX3Qgd2hpY2ggaXMgcGFzc2VkCi0gKiB0byBsaV9yZWFkKiBhbmQgbGlfd3JpdGUqIHRvIGFjY2VzcyB0aGUgcmVnaXN0ZXJzLgotICogVGhlICp2YWwgZmllbGRzIHNoYWRvdyB0aGUgbGl0aGl1bSByZWdpc3RlcnMnIGNvbnRlbnRzLgotICovCi0KLXR5cGVkZWYgc3RydWN0IGRtYV9jaGFuIHsKLQljb25zdCBkbWFfY2hhbl9kZXNjX3QgKmRlc2M7Ci0JbGl0aGl1bV90ICAgICAgKmxpdGg7Ci0JdW5zaWduZWQgbG9uZyAgIGJhc2V2YWw7Ci0JdW5zaWduZWQgbG9uZwljZmd2YWw7Ci0JdW5zaWduZWQgbG9uZwljdGx2YWw7Ci19IGRtYV9jaGFuX3Q7Ci0KLS8qCi0gKiB1c3Rtc2MgaXMgYSBVU1QvTVNDIHBhaXIgKFVuYWRqdXN0ZWQgU3lzdGVtIFRpbWUvTWVkaWEgU3RyZWFtIENvdW50ZXIpLgotICogVVNUIGlzIHRpbWUgaW4gbWljcm9zZWNvbmRzIHNpbmNlIHRoZSBzeXN0ZW0gYm9vdGVkLCBhbmQgTVNDIGlzIGEKLSAqIGNvdW50ZXIgdGhhdCBpbmNyZW1lbnRzIHdpdGggZXZlcnkgYXVkaW8gc2FtcGxlLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHVzdG1zYyB7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHVzdDsKLQl1bnNpZ25lZCBsb25nIG1zYzsKLX0gdXN0bXNjX3Q7Ci0KLS8qCi0gKiBsaV9hZDE4NDNfd2FpdCB3YWl0cyB1bnRpbCBsaXRoaXVtIHNheXMgdGhlIEFEMTg0MyByZWdpc3RlcgotICogZXhjaGFuZ2UgaXMgbm90IGJ1c3kuICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVCVVNZIG9uIHRpbWVvdXQuCi0gKgotICogTG9ja2luZzogbXVzdCBiZSBjYWxsZWQgd2l0aCBsaXRoaXVtX2xvY2sgaGVsZC4KLSAqLwotCi1zdGF0aWMgaW50IGxpX2FkMTg0M193YWl0KGxpdGhpdW1fdCAqbGl0aCkKLXsKLQl1bnNpZ25lZCBsb25nIGxhdGVyID0gamlmZmllcyArIDI7Ci0Jd2hpbGUgKGxpX3JlYWRsKGxpdGgsIExJX0NPREVDX0NPTU1BTkQpICYgTElfQ0NfQlVTWSkKLQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgbGF0ZXIpKQotCQkJcmV0dXJuIC1FQlVTWTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGxpX3JlYWRfYWQxODQzX3JlZyByZXR1cm5zIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIGEgMTYgYml0IEFEMTg0MyByZWdpc3Rlci4KLSAqCi0gKiBSZXR1cm5zIHVuc2lnbmVkIHJlZ2lzdGVyIHZhbHVlIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgotICovCi0KLXN0YXRpYyBpbnQgbGlfcmVhZF9hZDE4NDNfcmVnKGxpdGhpdW1fdCAqbGl0aCwgaW50IHJlZykKLXsKLQlpbnQgdmFsOwotCi0JQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7Ci0Jc3Bpbl9sb2NrKCZsaXRoLT5sb2NrKTsKLQl7Ci0JCXZhbCA9IGxpX2FkMTg0M193YWl0KGxpdGgpOwotCQlpZiAodmFsID09IDApIHsKLQkJCWxpX3dyaXRlbChsaXRoLCBMSV9DT0RFQ19DT01NQU5ELCBMSV9DQ19ESVJfUkQgfCByZWcpOwotCQkJdmFsID0gbGlfYWQxODQzX3dhaXQobGl0aCk7Ci0JCX0KLQkJaWYgKHZhbCA9PSAwKQotCQkJdmFsID0gbGlfcmVhZGwobGl0aCwgTElfQ09ERUNfREFUQSk7Ci0JfQotCXNwaW5fdW5sb2NrKCZsaXRoLT5sb2NrKTsKLQotCURCR1hWKCJsaV9yZWFkX2FkMTg0M19yZWcobGl0aD0weCVwLCByZWc9JWQpIHJldHVybnMgMHglMDR4XG4iLAotCSAgICAgIGxpdGgsIHJlZywgdmFsKTsKLQotCXJldHVybiB2YWw7Ci19Ci0KLS8qCi0gKiBsaV93cml0ZV9hZDE4NDNfcmVnIHdyaXRlcyB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIGEgMTYgYml0IEFEMTg0MyByZWdpc3Rlci4KLSAqLwotCi1zdGF0aWMgdm9pZCBsaV93cml0ZV9hZDE4NDNfcmVnKGxpdGhpdW1fdCAqbGl0aCwgaW50IHJlZywgaW50IG5ld3ZhbCkKLXsKLQlzcGluX2xvY2soJmxpdGgtPmxvY2spOwotCXsKLQkJaWYgKGxpX2FkMTg0M193YWl0KGxpdGgpID09IDApIHsKLQkJCWxpX3dyaXRlbChsaXRoLCBMSV9DT0RFQ19EQVRBLCBuZXd2YWwpOwotCQkJbGlfd3JpdGVsKGxpdGgsIExJX0NPREVDX0NPTU1BTkQsIExJX0NDX0RJUl9XUiB8IHJlZyk7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2soJmxpdGgtPmxvY2spOwotfQotCi0vKgotICogbGlfc2V0dXBfZG1hIGNhbGN1bGF0ZXMgYWxsIHRoZSByZWdpc3RlciBzZXR0aW5ncyBmb3IgRE1BIGluIGEgcGFydGljdWxhcgotICogbW9kZS4gIEl0IHRha2VzIHRvbyBtYW55IGFyZ3VtZW50cy4KLSAqLwotCi1zdGF0aWMgdm9pZCBsaV9zZXR1cF9kbWEoZG1hX2NoYW5fdCAqY2hhbiwKLQkJCSBjb25zdCBkbWFfY2hhbl9kZXNjX3QgKmRlc2MsCi0JCQkgbGl0aGl1bV90ICpsaXRoLAotCQkJIHVuc2lnbmVkIGxvbmcgYnVmZmVyX3BhZGRyLAotCQkJIGludCBidWZzaGlmdCwKLQkJCSBpbnQgZnJhZ3NoaWZ0LAotCQkJIGludCBjaGFubmVscywKLQkJCSBpbnQgc2FtcHNpemUpCi17Ci0JdW5zaWduZWQgbG9uZyBtb2RlLCBmb3JtYXQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplLCB0bWFzazsKLQotCURCR0VWKCIoY2hhbj0weCVwLCBkZXNjPTB4JXAsIGxpdGg9MHglcCwgYnVmZmVyX3BhZGRyPTB4JWx4LCAiCi0JICAgICAiYnVmc2hpZnQ9JWQsIGZyYWdzaGlmdD0lZCwgY2hhbm5lbHM9JWQsIHNhbXBzaXplPSVkKVxuIiwKLQkgICAgIGNoYW4sIGRlc2MsIGxpdGgsIGJ1ZmZlcl9wYWRkciwKLQkgICAgIGJ1ZnNoaWZ0LCBmcmFnc2hpZnQsIGNoYW5uZWxzLCBzYW1wc2l6ZSk7Ci0KLQkvKiBSZXNldCB0aGUgY2hhbm5lbCBmaXJzdC4gKi8KLQotCWxpX3dyaXRlbChsaXRoLCBkZXNjLT5jdGxyZWcsIExJX0NDVExfUkVTRVQpOwotCi0JQVNTRVJUKGNoYW5uZWxzID09IDEgfHwgY2hhbm5lbHMgPT0gMik7Ci0JaWYgKGNoYW5uZWxzID09IDIpCi0JCW1vZGUgPSBMSV9DQ0ZHX01PREVfU1RFUkVPOwotCWVsc2UKLQkJbW9kZSA9IExJX0NDRkdfTU9ERV9NT05POwotCUFTU0VSVChzYW1wc2l6ZSA9PSAxIHx8IHNhbXBzaXplID09IDIpOwotCWlmIChzYW1wc2l6ZSA9PSAyKQotCQlmb3JtYXQgPSBMSV9DQ0ZHX0ZNVF8xNkJJVDsKLQllbHNlCi0JCWZvcm1hdCA9IExJX0NDRkdfRk1UXzhCSVQ7Ci0JY2hhbi0+ZGVzYyA9IGRlc2M7Ci0JY2hhbi0+bGl0aCA9IGxpdGg7Ci0KLQkvKgotCSAqIExpdGhpdW0gRE1BIGFkZHJlc3MgcmVnaXN0ZXIgdGFrZXMgYSA0MC1iaXQgcGh5c2ljYWwKLQkgKiBhZGRyZXNzLCByaWdodC1zaGlmdGVkIGJ5IDggc28gaXQgZml0cyBpbiAzMiBiaXRzLiAgQml0IDM3Ci0JICogbXVzdCBiZSBzZXQgLS0gaXQgZW5hYmxlcyBjYWNoZSBjb2hlcmVuY2UuCi0JICovCi0KLQlBU1NFUlQoIShidWZmZXJfcGFkZHIgJiAweEZGKSk7Ci0JY2hhbi0+YmFzZXZhbCA9IChidWZmZXJfcGFkZHIgPj4gOCkgfCAxIDw8ICgzNyAtIDgpOwotCi0JY2hhbi0+Y2ZndmFsID0gKChjaGFuLT5jZmd2YWwgJiB+TElfQ0NGR19MT0NLKSB8Ci0JCQlTSElGVF9GSUVMRChkZXNjLT5hZDE4NDNfc2xvdCwgTElfQ0NGR19TTE9UKSB8Ci0JCQlkZXNjLT5kaXJlY3Rpb24gfAotCQkJbW9kZSB8Ci0JCQlmb3JtYXQpOwotCi0Jc2l6ZSA9IGJ1ZnNoaWZ0IC0gNjsKLQl0bWFzayA9IDEzIC0gZnJhZ3NoaWZ0OwkJLyogU2VlIExpdGhpdW0gRE1BIE5vdGVzIGFib3ZlLiAqLwotCUFTU0VSVChzaXplID49IDIgJiYgc2l6ZSA8PSA3KTsKLQlBU1NFUlQodG1hc2sgPj0gMSAmJiB0bWFzayA8PSA3KTsKLQljaGFuLT5jdGx2YWwgPSAoKGNoYW4tPmN0bHZhbCAmIH5MSV9DQ1RMX1JFU0VUKSB8Ci0JCQlTSElGVF9GSUVMRChzaXplLCBMSV9DQ1RMX1NJWkUpIHwKLQkJCShjaGFuLT5jdGx2YWwgJiB+TElfQ0NUTF9ETUFfRU5BQkxFKSB8Ci0JCQlTSElGVF9GSUVMRCh0bWFzaywgTElfQ0NUTF9UTUFTSykgfAotCQkJU0hJRlRfRklFTEQoMCwgTElfQ0NUTF9UUFRSKSk7Ci0KLQlEQkdQVigiYmFzZXJlZyAweCV4ID0gMHglbHhcbiIsIGRlc2MtPmJhc2VyZWcsIGNoYW4tPmJhc2V2YWwpOwotCURCR1BWKCJjZmdyZWcgMHgleCA9IDB4JWx4XG4iLCBkZXNjLT5jZmdyZWcsIGNoYW4tPmNmZ3ZhbCk7Ci0JREJHUFYoImN0bHJlZyAweCV4ID0gMHglbHhcbiIsIGRlc2MtPmN0bHJlZywgY2hhbi0+Y3RsdmFsKTsKLQotCWxpX3dyaXRlbChsaXRoLCBkZXNjLT5iYXNlcmVnLCBjaGFuLT5iYXNldmFsKTsKLQlsaV93cml0ZWwobGl0aCwgZGVzYy0+Y2ZncmVnLCBjaGFuLT5jZmd2YWwpOwotCWxpX3dyaXRlbChsaXRoLCBkZXNjLT5jdGxyZWcsIGNoYW4tPmN0bHZhbCk7Ci0KLQlEQkdSVigpOwotfQotCi1zdGF0aWMgdm9pZCBsaV9zaHV0ZG93bl9kbWEoZG1hX2NoYW5fdCAqY2hhbikKLXsKLQlsaXRoaXVtX3QgKmxpdGggPSBjaGFuLT5saXRoOwotCXZvaWQgKiBsaXRoMSA9IGxpdGgtPnBhZ2UxOwotCi0JREJHRVYoIihjaGFuPTB4JXApXG4iLCBjaGFuKTsKLQkKLQljaGFuLT5jdGx2YWwgJj0gfkxJX0NDVExfRE1BX0VOQUJMRTsKLQlEQkdQVigiY3RscmVnIDB4JXggPSAweCVseFxuIiwgY2hhbi0+ZGVzYy0+Y3RscmVnLCBjaGFuLT5jdGx2YWwpOwotCWxpX3dyaXRlbChsaXRoLCBjaGFuLT5kZXNjLT5jdGxyZWcsIGNoYW4tPmN0bHZhbCk7Ci0KLQkvKgotCSAqIE9mZnNldCAweDUwMCBvbiBMaXRoaXVtIHBhZ2UgMSBpcyBhbiB1bmRvY3VtZW50ZWQsCi0JICogdW5zdXBwb3J0ZWQgcmVnaXN0ZXIgdGhhdCBob2xkcyB0aGUgemVybyBzYW1wbGUgdmFsdWUuCi0JICogTGl0aGl1bSBpcyBzdXBwb3NlZCB0byBvdXRwdXQgemVybyBzYW1wbGVzIHdoZW4gRE1BIGlzCi0JICogaW5hY3RpdmUsIGFuZCByZXBlYXQgdGhlIGxhc3Qgc2FtcGxlIHdoZW4gRE1BIHVuZGVyZmxvd3MuCi0JICogQnV0IGl0IGhhcyBhIGJ1Zywgd2hlcmUsIGFmdGVyIHVuZGVyZmxvdyBvY2N1cnMsIHRoZSB6ZXJvCi0JICogc2FtcGxlIGlzIG5vdCByZXNldC4KLQkgKgotCSAqIEkgZXhwZWN0IHRoaXMgdG8gYnJlYWsgaW4gYSBmdXR1cmUgcmV2IG9mIExpdGhpdW0uCi0JICovCi0KLQlpZiAobGl0aDEgJiYgY2hhbi0+ZGVzYy0+ZGlyZWN0aW9uID09IExJX0NDRkdfRElSX09VVCkKLQkJKiAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAobGl0aDEgKyAweDUwMCkgPSAwOwotfQotCi0vKgotICogbGlfYWN0aXZhdGVfZG1hIGFsd2F5cyBzdGFydHMgZG1hIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4KLSAqCi0gKiBOLkIuLCB0aGVzZSBtYXkgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0LgotICovCi0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgbGlfYWN0aXZhdGVfZG1hKGRtYV9jaGFuX3QgKmNoYW4pCi17Ci0JY2hhbi0+Y3RsdmFsIHw9IExJX0NDVExfRE1BX0VOQUJMRTsKLQlEQkdQVigiY3RsdmFsID0gMHglbHhcbiIsIGNoYW4tPmN0bHZhbCk7Ci0JbGlfd3JpdGVsKGNoYW4tPmxpdGgsIGNoYW4tPmRlc2MtPmN0bHJlZywgY2hhbi0+Y3RsdmFsKTsKLX0KLQotc3RhdGljIHZvaWQgbGlfZGVhY3RpdmF0ZV9kbWEoZG1hX2NoYW5fdCAqY2hhbikKLXsKLQlsaXRoaXVtX3QgKmxpdGggPSBjaGFuLT5saXRoOwotCXZvaWQgKiBsaXRoMiA9IGxpdGgtPnBhZ2UyOwotCi0JY2hhbi0+Y3RsdmFsICY9IH4oTElfQ0NUTF9ETUFfRU5BQkxFIHwgTElfQ0NUTF9SUFRSIHwgTElfQ0NUTF9XUFRSKTsKLQlEQkdQVigiY3RsdmFsID0gMHglbHhcbiIsIGNoYW4tPmN0bHZhbCk7Ci0JREJHUFYoImN0bHJlZyAweCV4ID0gMHglbHhcbiIsIGNoYW4tPmRlc2MtPmN0bHJlZywgY2hhbi0+Y3RsdmFsKTsKLQlsaV93cml0ZWwobGl0aCwgY2hhbi0+ZGVzYy0+Y3RscmVnLCBjaGFuLT5jdGx2YWwpOwotCi0JLyoKLQkgKiBPZmZzZXRzIDB4OTggYW5kIDB4OUMgb24gTGl0aGl1bSBwYWdlIDIgYXJlIHVuZG9jdW1lbnRlZCwKLQkgKiB1bnN1cHBvcnRlZCByZWdpc3RlcnMgdGhhdCBhcmUgaW50ZXJuYWwgY29waWVzIG9mIHRoZSBETUEKLQkgKiByZWFkIGFuZCB3cml0ZSBwb2ludGVycy4gIEJlY2F1c2Ugb2YgYSBMaXRoaXVtIGJ1ZywgdGhlc2UKLQkgKiByZWdpc3RlcnMgYXJlbid0IHplcm9lZCBjb3JyZWN0bHkgd2hlbiBETUEgaXMgc2h1dCBvZmYuICBTbwotCSAqIHdlIHdoYWNrIHRoZW0gZGlyZWN0bHkuCi0JICoKLQkgKiBJIGV4cGVjdCB0aGlzIHRvIGJyZWFrIGluIGEgZnV0dXJlIHJldiBvZiBMaXRoaXVtLgotCSAqLwotCi0JaWYgKGxpdGgyICYmIGNoYW4tPmRlc2MtPmRpcmVjdGlvbiA9PSBMSV9DQ0ZHX0RJUl9PVVQpIHsKLQkJKiAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAobGl0aDIgKyAweDk4KSA9IDA7Ci0JCSogKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKGxpdGgyICsgMHg5QykgPSAwOwotCX0KLX0KLQotLyoKLSAqIHJlYWQvd3JpdGUgdGhlIHJpbmcgYnVmZmVyIHBvaW50ZXJzLiAgVGhlc2Ugcm91dGluZXMnIGFyZ3VtZW50cyBhbmQgcmVzdWx0cwotICogYXJlIGJ5dGUgb2Zmc2V0cyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJpbmcgYnVmZmVyLgotICovCi0KLXN0YXRpYyBfX2lubGluZV9fIGludCBsaV9yZWFkX3N3cHRyKGRtYV9jaGFuX3QgKmNoYW4pCi17Ci0JY29uc3QgdW5zaWduZWQgbG9uZyBtYXNrID0gY2hhbi0+ZGVzYy0+c3dwdHJtYXNrOwotCi0JcmV0dXJuIENIVU5LU19UT19CWVRFUyhVTlNISUZUX0ZJRUxEKGNoYW4tPmN0bHZhbCwgbWFzaykpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgbGlfcmVhZF9od3B0cihkbWFfY2hhbl90ICpjaGFuKQotewotCXJldHVybiBDSFVOS1NfVE9fQllURVMobGlfcmVhZGIoY2hhbi0+bGl0aCwgY2hhbi0+ZGVzYy0+aHdwdHJyZWcpKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBsaV93cml0ZV9zd3B0cihkbWFfY2hhbl90ICpjaGFuLCBpbnQgdmFsKQotewotCWNvbnN0IHVuc2lnbmVkIGxvbmcgbWFzayA9IGNoYW4tPmRlc2MtPnN3cHRybWFzazsKLQotCUFTU0VSVCghKHZhbCAmIH5DSFVOS1NfVE9fQllURVMoMHhGRikpKTsKLQl2YWwgPSBCWVRFU19UT19DSFVOS1ModmFsKTsKLQljaGFuLT5jdGx2YWwgPSAoY2hhbi0+Y3RsdmFsICYgfm1hc2spIHwgU0hJRlRfRklFTEQodmFsLCBtYXNrKTsKLQlsaV93cml0ZWIoY2hhbi0+bGl0aCwgY2hhbi0+ZGVzYy0+c3dwdHJyZWcsIHZhbCk7Ci19Ci0KLS8qIGxpX3JlYWRfVVNUTVNDKCkgcmV0dXJucyBhIFVTVC9NU0MgcGFpciBmb3IgdGhlIGdpdmVuIGNoYW5uZWwuICovCi0KLXN0YXRpYyB2b2lkIGxpX3JlYWRfVVNUTVNDKGRtYV9jaGFuX3QgKmNoYW4sIHVzdG1zY190ICp1c3Rtc2MpCi17Ci0JbGl0aGl1bV90ICpsaXRoID0gY2hhbi0+bGl0aDsKLQljb25zdCBkbWFfY2hhbl9kZXNjX3QgKmRlc2MgPSBjaGFuLT5kZXNjOwotCXVuc2lnbmVkIGxvbmcgbm93X2xvdywgbm93X2hpZ2gwLCBub3dfaGlnaDEsIGNoYW5fdXN0OwotCi0Jc3Bpbl9sb2NrKCZsaXRoLT5sb2NrKTsKLQl7Ci0JCS8qCi0JCSAqIHJldHJ5IHVudGlsIHdlIGRvIGFsbCBmaXZlIHJlYWRzIHdpdGhvdXQgdGhlCi0JCSAqIGhpZ2ggd29yZCBjaGFuZ2luZy4gIChIaWdoIHdvcmQgaW5jcmVtZW50cwotCQkgKiBldmVyeSAyXjMyIG1pY3Jvc2Vjb25kcywgaS5lLiwgbm90IG9mdGVuKQotCQkgKi8KLQkJZG8gewotCQkJbm93X2hpZ2gwID0gbGlfcmVhZGwobGl0aCwgTElfVVNUX0hJR0gpOwotCQkJbm93X2xvdyA9IGxpX3JlYWRsKGxpdGgsIExJX1VTVF9MT1cpOwotCi0JCQkvKgotCQkJICogTGl0aGl1bSBndWFyYW50ZWVzIHRoZXNlIHR3byByZWFkcyB3aWxsIGJlCi0JCQkgKiBhdG9taWMgLS0gdXN0IHdpbGwgbm90IGluY3JlbWVudCBhZnRlciBtc2MKLQkJCSAqIGlzIHJlYWQuCi0JCQkgKi8KLQotCQkJdXN0bXNjLT5tc2MgPSBsaV9yZWFkbChsaXRoLCBkZXNjLT5tc2NyZWcpOwotCQkJY2hhbl91c3QgPSBsaV9yZWFkbChsaXRoLCBkZXNjLT51c3RyZWcpOwotCi0JCQlub3dfaGlnaDEgPSBsaV9yZWFkbChsaXRoLCBMSV9VU1RfSElHSCk7Ci0JCX0gd2hpbGUgKG5vd19oaWdoMCAhPSBub3dfaGlnaDEpOwotCX0JCi0Jc3Bpbl91bmxvY2soJmxpdGgtPmxvY2spOwotCXVzdG1zYy0+dXN0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpIG5vd19oaWdoMCA8PCAzMiB8IGNoYW5fdXN0KTsKLX0KLQotc3RhdGljIHZvaWQgbGlfZW5hYmxlX2ludGVycnVwdHMobGl0aGl1bV90ICpsaXRoLCB1bnNpZ25lZCBpbnQgbWFzaykKLXsKLQlEQkdFVigiKGxpdGg9MHglcCwgbWFzaz0weCV4KVxuIiwgbGl0aCwgbWFzayk7Ci0KLQkvKiBjbGVhciBhbnkgYWxyZWFkeS1wZW5kaW5nIGludGVycnVwdHMuICovCi0KLQlsaV93cml0ZWwobGl0aCwgTElfSU5UUl9TVEFUVVMsIG1hc2spOwotCi0JLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHRzLiAqLwotCi0JbWFzayB8PSBsaV9yZWFkbChsaXRoLCBMSV9JTlRSX01BU0spOwotCWxpX3dyaXRlbChsaXRoLCBMSV9JTlRSX01BU0ssIG1hc2spOwotfQotCi1zdGF0aWMgdm9pZCBsaV9kaXNhYmxlX2ludGVycnVwdHMobGl0aGl1bV90ICpsaXRoLCB1bnNpZ25lZCBpbnQgbWFzaykKLXsKLQl1bnNpZ25lZCBpbnQga2VlcG1hc2s7Ci0KLQlEQkdFVigiKGxpdGg9MHglcCwgbWFzaz0weCV4KVxuIiwgbGl0aCwgbWFzayk7Ci0KLQkvKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHRzICovCi0KLQlrZWVwbWFzayA9IGxpX3JlYWRsKGxpdGgsIExJX0lOVFJfTUFTSykgJiB+bWFzazsKLQlsaV93cml0ZWwobGl0aCwgTElfSU5UUl9NQVNLLCBrZWVwbWFzayk7Ci0KLQkvKiBjbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzLiAqLwotCi0JbGlfd3JpdGVsKGxpdGgsIExJX0lOVFJfU1RBVFVTLCBtYXNrKTsKLX0KLQotLyogR2V0IHRoZSBpbnRlcnJ1cHQgc3RhdHVzIGFuZCBjbGVhciBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzLiAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGxpX2dldF9jbGVhcl9pbnRyX3N0YXR1cyhsaXRoaXVtX3QgKmxpdGgpCi17Ci0JdW5zaWduZWQgaW50IHN0YXR1czsKLQotCXN0YXR1cyA9IGxpX3JlYWRsKGxpdGgsIExJX0lOVFJfU1RBVFVTKTsKLQlsaV93cml0ZWwobGl0aCwgTElfSU5UUl9TVEFUVVMsIH4wKTsKLQlyZXR1cm4gc3RhdHVzICYgbGlfcmVhZGwobGl0aCwgTElfSU5UUl9NQVNLKTsKLX0KLQotc3RhdGljIGludCBsaV9pbml0KGxpdGhpdW1fdCAqbGl0aCkKLXsKLQkvKiAxLiBTeXN0ZW0gcG93ZXIgc3VwcGxpZXMgc3RhYmlsaXplLiAqLwotCi0JLyogMi4gQXNzZXJ0IHRoZSB+UkVTRVQgc2lnbmFsLiAqLwotCi0JbGlfd3JpdGVsKGxpdGgsIExJX0hPU1RfQ09OVFJPTExFUiwgTElfSENfUkVTRVQpOwotCXVkZWxheSgxKTsKLQotCS8qIDMuIERlYXNzZXJ0IHRoZSB+UkVTRVQgc2lnbmFsIGFuZCBlbnRlciBhIHdhaXQgcGVyaW9kIHRvIGFsbG93Ci0JICAgdGhlIEFEMTg0MyBpbnRlcm5hbCBjbG9ja3MgYW5kIHRoZSBleHRlcm5hbCBjcnlzdGFsIG9zY2lsbGF0b3IKLQkgICB0byBzdGFiaWxpemUuICovCi0KLQlsaV93cml0ZWwobGl0aCwgTElfSE9TVF9DT05UUk9MTEVSLCBMSV9IQ19MSU5LX0VOQUJMRSk7Ci0JdWRlbGF5KDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEFEMTg0MyBhY2Nlc3MgKi8KLQotLyoKLSAqIEFEMTg0MyBiaXRmaWVsZCBkZWZpbml0aW9ucy4gIEFsbCBhcmUgbmFtZWQgYXMgaW4gdGhlIEFEMTg0MyBkYXRhCi0gKiBzaGVldCwgd2l0aCBhZDE4NDNfIHByZXBlbmRlZCBhbmQgaW5kaXZpZHVhbCBiaXQgbnVtYmVycyByZW1vdmVkLgotICoKLSAqIEUuZy4sIGJpdHMgTFNTMCB0aHJvdWdoIExTUzIgYmVjb21lIGFkMTg0M19MU1MuCi0gKgotICogT25seSB0aGUgYml0ZmllbGRzIHdlIG5lZWQgYXJlIGRlZmluZWQuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgYWQxODQzX2JpdGZpZWxkIHsKLQljaGFyIHJlZzsKLQljaGFyIGxvX2JpdDsKLQljaGFyIG5iaXRzOwotfSBhZDE4NDNfYml0ZmllbGRfdDsKLQotc3RhdGljIGNvbnN0IGFkMTg0M19iaXRmaWVsZF90Ci0JYWQxODQzX1BETk8gICA9IHsgIDAsIDE0LCAgMSB9LAkvKiBDb252ZXJ0ZXIgUG93ZXItRG93biBGbGFnICovCi0JYWQxODQzX0lOSVQgICA9IHsgIDAsIDE1LCAgMSB9LAkvKiBDbG9jayBJbml0aWFsaXphdGlvbiBGbGFnICovCi0JYWQxODQzX1JJRyAgICA9IHsgIDIsICAwLCAgNCB9LAkvKiBSaWdodCBBREMgSW5wdXQgR2FpbiAqLwotCWFkMTg0M19STUdFICAgPSB7ICAyLCAgNCwgIDEgfSwJLyogUmlnaHQgQURDIE1pYyBHYWluIEVuYWJsZSAqLwotCWFkMTg0M19SU1MgICAgPSB7ICAyLCAgNSwgIDMgfSwJLyogUmlnaHQgQURDIFNvdXJjZSBTZWxlY3QgKi8KLQlhZDE4NDNfTElHICAgID0geyAgMiwgIDgsICA0IH0sCS8qIExlZnQgQURDIElucHV0IEdhaW4gKi8KLQlhZDE4NDNfTE1HRSAgID0geyAgMiwgMTIsICAxIH0sCS8qIExlZnQgQURDIE1pYyBHYWluIEVuYWJsZSAqLwotCWFkMTg0M19MU1MgICAgPSB7ICAyLCAxMywgIDMgfSwJLyogTGVmdCBBREMgU291cmNlIFNlbGVjdCAqLwotCWFkMTg0M19SWDFNICAgPSB7ICA0LCAgMCwgIDUgfSwJLyogUmlnaHQgQXV4IDEgTWl4IEdhaW4vQXR0ZW4gKi8KLQlhZDE4NDNfUlgxTU0gID0geyAgNCwgIDcsICAxIH0sCS8qIFJpZ2h0IEF1eCAxIE1peCBNdXRlICovCi0JYWQxODQzX0xYMU0gICA9IHsgIDQsICA4LCAgNSB9LAkvKiBMZWZ0IEF1eCAxIE1peCBHYWluL0F0dGVuICovCi0JYWQxODQzX0xYMU1NICA9IHsgIDQsIDE1LCAgMSB9LAkvKiBMZWZ0IEF1eCAxIE1peCBNdXRlICovCi0JYWQxODQzX1JYMk0gICA9IHsgIDUsICAwLCAgNSB9LAkvKiBSaWdodCBBdXggMiBNaXggR2Fpbi9BdHRlbiAqLwotCWFkMTg0M19SWDJNTSAgPSB7ICA1LCAgNywgIDEgfSwJLyogUmlnaHQgQXV4IDIgTWl4IE11dGUgKi8KLQlhZDE4NDNfTFgyTSAgID0geyAgNSwgIDgsICA1IH0sCS8qIExlZnQgQXV4IDIgTWl4IEdhaW4vQXR0ZW4gKi8KLQlhZDE4NDNfTFgyTU0gID0geyAgNSwgMTUsICAxIH0sCS8qIExlZnQgQXV4IDIgTWl4IE11dGUgKi8KLQlhZDE4NDNfUk1DTSAgID0geyAgNywgIDAsICA1IH0sCS8qIFJpZ2h0IE1pYyBNaXggR2Fpbi9BdHRlbiAqLwotCWFkMTg0M19STUNNTSAgPSB7ICA3LCAgNywgIDEgfSwJLyogUmlnaHQgTWljIE1peCBNdXRlICovCi0JYWQxODQzX0xNQ00gICA9IHsgIDcsICA4LCAgNSB9LAkvKiBMZWZ0IE1pYyBNaXggR2Fpbi9BdHRlbiAqLwotCWFkMTg0M19MTUNNTSAgPSB7ICA3LCAxNSwgIDEgfSwJLyogTGVmdCBNaWMgTWl4IE11dGUgKi8KLQlhZDE4NDNfSFBPUyAgID0geyAgOCwgIDQsICAxIH0sCS8qIEhlYWRwaG9uZSBPdXRwdXQgVm9sdGFnZSBTd2luZyAqLwotCWFkMTg0M19IUE9NICAgPSB7ICA4LCAgNSwgIDEgfSwJLyogSGVhZHBob25lIE91dHB1dCBNdXRlICovCi0JYWQxODQzX1JEQTFHICA9IHsgIDksICAwLCAgNiB9LAkvKiBSaWdodCBEQUMxIEFuYWxvZy9EaWdpdGFsIEdhaW4gKi8KLQlhZDE4NDNfUkRBMUdNID0geyAgOSwgIDcsICAxIH0sCS8qIFJpZ2h0IERBQzEgQW5hbG9nIE11dGUgKi8KLQlhZDE4NDNfTERBMUcgID0geyAgOSwgIDgsICA2IH0sCS8qIExlZnQgREFDMSBBbmFsb2cvRGlnaXRhbCBHYWluICovCi0JYWQxODQzX0xEQTFHTSA9IHsgIDksIDE1LCAgMSB9LAkvKiBMZWZ0IERBQzEgQW5hbG9nIE11dGUgKi8KLQlhZDE4NDNfUkRBMUFNID0geyAxMSwgIDcsICAxIH0sCS8qIFJpZ2h0IERBQzEgRGlnaXRhbCBNdXRlICovCi0JYWQxODQzX0xEQTFBTSA9IHsgMTEsIDE1LCAgMSB9LAkvKiBMZWZ0IERBQzEgRGlnaXRhbCBNdXRlICovCi0JYWQxODQzX0FETEMgICA9IHsgMTUsICAwLCAgMiB9LAkvKiBBREMgTGVmdCBTYW1wbGUgUmF0ZSBTb3VyY2UgKi8KLQlhZDE4NDNfQURSQyAgID0geyAxNSwgIDIsICAyIH0sCS8qIEFEQyBSaWdodCBTYW1wbGUgUmF0ZSBTb3VyY2UgKi8KLQlhZDE4NDNfREExQyAgID0geyAxNSwgIDgsICAyIH0sCS8qIERBQzEgU2FtcGxlIFJhdGUgU291cmNlICovCi0JYWQxODQzX0MxQyAgICA9IHsgMTcsICAwLCAxNiB9LAkvKiBDbG9jayAxIFNhbXBsZSBSYXRlIFNlbGVjdCAqLwotCWFkMTg0M19DMkMgICAgPSB7IDIwLCAgMCwgMTYgfSwJLyogQ2xvY2sgMSBTYW1wbGUgUmF0ZSBTZWxlY3QgKi8KLQlhZDE4NDNfREFBREwgID0geyAyNSwgIDQsICAyIH0sCS8qIERpZ2l0YWwgQURDIExlZnQgU291cmNlIFNlbGVjdCAqLwotCWFkMTg0M19EQUFEUiAgPSB7IDI1LCAgNiwgIDIgfSwJLyogRGlnaXRhbCBBREMgUmlnaHQgU291cmNlIFNlbGVjdCAqLwotCWFkMTg0M19EUlNGTFQgPSB7IDI1LCAxNSwgIDEgfSwJLyogRGlnaXRhbCBSZWFtcGxlciBGaWx0ZXIgTW9kZSAqLwotCWFkMTg0M19BRExGICAgPSB7IDI2LCAgMCwgIDIgfSwgLyogQURDIExlZnQgQ2hhbm5lbCBEYXRhIEZvcm1hdCAqLwotCWFkMTg0M19BRFJGICAgPSB7IDI2LCAgMiwgIDIgfSwgLyogQURDIFJpZ2h0IENoYW5uZWwgRGF0YSBGb3JtYXQgKi8KLQlhZDE4NDNfQURUTEsgID0geyAyNiwgIDQsICAxIH0sCS8qIEFEQyBUcmFuc21pdCBMb2NrIE1vZGUgU2VsZWN0ICovCi0JYWQxODQzX1NDRiAgICA9IHsgMjYsICA3LCAgMSB9LAkvKiBTQ0xLIEZyZXF1ZW5jeSBTZWxlY3QgKi8KLQlhZDE4NDNfREExRiAgID0geyAyNiwgIDgsICAyIH0sCS8qIERBQzEgRGF0YSBGb3JtYXQgU2VsZWN0ICovCi0JYWQxODQzX0RBMVNNICA9IHsgMjYsIDE0LCAgMSB9LAkvKiBEQUMxIFN0ZXJlby9Nb25vIE1vZGUgU2VsZWN0ICovCi0JYWQxODQzX0FETEVOICA9IHsgMjcsICAwLCAgMSB9LAkvKiBBREMgTGVmdCBDaGFubmVsIEVuYWJsZSAqLwotCWFkMTg0M19BRFJFTiAgPSB7IDI3LCAgMSwgIDEgfSwJLyogQURDIFJpZ2h0IENoYW5uZWwgRW5hYmxlICovCi0JYWQxODQzX0FBTUVOICA9IHsgMjcsICA0LCAgMSB9LAkvKiBBbmFsb2cgdG8gQW5hbG9nIE1peCBFbmFibGUgKi8KLQlhZDE4NDNfQU5BRU4gID0geyAyNywgIDcsICAxIH0sCS8qIEFuYWxvZyBDaGFubmVsIEVuYWJsZSAqLwotCWFkMTg0M19EQTFFTiAgPSB7IDI3LCAgOCwgIDEgfSwJLyogREFDMSBFbmFibGUgKi8KLQlhZDE4NDNfREEyRU4gID0geyAyNywgIDksICAxIH0sCS8qIERBQzIgRW5hYmxlICovCi0JYWQxODQzX0MxRU4gICA9IHsgMjgsIDExLCAgMSB9LAkvKiBDbG9jayBHZW5lcmF0b3IgMSBFbmFibGUgKi8KLQlhZDE4NDNfQzJFTiAgID0geyAyOCwgMTIsICAxIH0sCS8qIENsb2NrIEdlbmVyYXRvciAyIEVuYWJsZSAqLwotCWFkMTg0M19QRE5JICAgPSB7IDI4LCAxNSwgIDEgfTsJLyogQ29udmVydGVyIFBvd2VyIERvd24gKi8KLQotLyoKLSAqIFRoZSB2YXJpb3VzIHJlZ2lzdGVycyBvZiB0aGUgQUQxODQzIHVzZSB0aHJlZSBkaWZmZXJlbnQgZm9ybWF0cyBmb3IKLSAqIHNwZWNpZnlpbmcgZ2Fpbi4gIFRoZSBhZDE4NDNfZ2FpbiBzdHJ1Y3R1cmUgcGFyYW1ldGVyaXplcyB0aGUKLSAqIGZvcm1hdHMuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgYWQxODQzX2dhaW4gewotCi0JaW50CW5lZ2F0aXZlOwkJLyogbm9uemVybyBpZiBnYWluIGlzIG5lZ2F0aXZlLiAqLwotCWNvbnN0IGFkMTg0M19iaXRmaWVsZF90ICpsZmllbGQ7Ci0JY29uc3QgYWQxODQzX2JpdGZpZWxkX3QgKnJmaWVsZDsKLQotfSBhZDE4NDNfZ2Fpbl90OwotCi1zdGF0aWMgY29uc3QgYWQxODQzX2dhaW5fdCBhZDE4NDNfZ2Fpbl9SRUNMRVYKLQkJCQk9IHsgMCwgJmFkMTg0M19MSUcsICAgJmFkMTg0M19SSUcgfTsKLXN0YXRpYyBjb25zdCBhZDE4NDNfZ2Fpbl90IGFkMTg0M19nYWluX0xJTkUKLQkJCQk9IHsgMSwgJmFkMTg0M19MWDFNLCAgJmFkMTg0M19SWDFNIH07Ci1zdGF0aWMgY29uc3QgYWQxODQzX2dhaW5fdCBhZDE4NDNfZ2Fpbl9DRAotCQkJCT0geyAxLCAmYWQxODQzX0xYMk0sICAmYWQxODQzX1JYMk0gfTsKLXN0YXRpYyBjb25zdCBhZDE4NDNfZ2Fpbl90IGFkMTg0M19nYWluX01JQwotCQkJCT0geyAxLCAmYWQxODQzX0xNQ00sICAmYWQxODQzX1JNQ00gfTsKLXN0YXRpYyBjb25zdCBhZDE4NDNfZ2Fpbl90IGFkMTg0M19nYWluX1BDTQotCQkJCT0geyAxLCAmYWQxODQzX0xEQTFHLCAmYWQxODQzX1JEQTFHIH07Ci0KLS8qIHJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYW4gQUQxODQzIGJpdGZpZWxkLiAqLwotCi1zdGF0aWMgaW50IGFkMTg0M19yZWFkX2JpdHMobGl0aGl1bV90ICpsaXRoLCBjb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqZmllbGQpCi17Ci0JaW50IHcgPSBsaV9yZWFkX2FkMTg0M19yZWcobGl0aCwgZmllbGQtPnJlZyk7Ci0JaW50IHZhbCA9IHcgPj4gZmllbGQtPmxvX2JpdCAmICgoMSA8PCBmaWVsZC0+bmJpdHMpIC0gMSk7Ci0KLQlEQkdYVigiYWQxODQzX3JlYWRfYml0cyhsaXRoPTB4JXAsIGZpZWxkLT57JWQgJWQgJWR9KSByZXR1cm5zIDB4JXhcbiIsCi0JICAgICAgbGl0aCwgZmllbGQtPnJlZywgZmllbGQtPmxvX2JpdCwgZmllbGQtPm5iaXRzLCB2YWwpOwotCi0JcmV0dXJuIHZhbDsKLX0KLQotLyoKLSAqIHdyaXRlIGEgbmV3IHZhbHVlIHRvIGFuIEFEMTg0MyBiaXRmaWVsZCBhbmQgcmV0dXJuIHRoZSBvbGQgdmFsdWUuCi0gKi8KLQotc3RhdGljIGludCBhZDE4NDNfd3JpdGVfYml0cyhsaXRoaXVtX3QgKmxpdGgsCi0JCQkgICAgIGNvbnN0IGFkMTg0M19iaXRmaWVsZF90ICpmaWVsZCwKLQkJCSAgICAgaW50IG5ld3ZhbCkKLXsKLQlpbnQgdyA9IGxpX3JlYWRfYWQxODQzX3JlZyhsaXRoLCBmaWVsZC0+cmVnKTsKLQlpbnQgbWFzayA9ICgoMSA8PCBmaWVsZC0+bmJpdHMpIC0gMSkgPDwgZmllbGQtPmxvX2JpdDsKLQlpbnQgb2xkdmFsID0gKHcgJiBtYXNrKSA+PiBmaWVsZC0+bG9fYml0OwotCWludCBuZXdiaXRzID0gKG5ld3ZhbCA8PCBmaWVsZC0+bG9fYml0KSAmIG1hc2s7Ci0JdyA9ICh3ICYgfm1hc2spIHwgbmV3Yml0czsKLQkodm9pZCkgbGlfd3JpdGVfYWQxODQzX3JlZyhsaXRoLCBmaWVsZC0+cmVnLCB3KTsKLQotCURCR1hWKCJhZDE4NDNfd3JpdGVfYml0cyhsaXRoPTB4JXAsIGZpZWxkLT57JWQgJWQgJWR9LCB2YWw9MHgleCkgIgotCSAgICAgICJyZXR1cm5zIDB4JXhcbiIsCi0JICAgICAgbGl0aCwgZmllbGQtPnJlZywgZmllbGQtPmxvX2JpdCwgZmllbGQtPm5iaXRzLCBuZXd2YWwsCi0JICAgICAgb2xkdmFsKTsKLQotCXJldHVybiBvbGR2YWw7Ci19Ci0KLS8qCi0gKiBhZDE4NDNfcmVhZF9tdWx0aSByZWFkcyBtdWx0aXBsZSBiaXRmaWVsZHMgZnJvbSB0aGUgc2FtZSBBRDE4NDMKLSAqIHJlZ2lzdGVyLiAgSXQgdXNlcyBhIHNpbmdsZSByZWFkIGN5Y2xlIHRvIGRvIGl0LiAgKFJlYWRpbmcgdGhlCi0gKiBhZDE4NDMgcmVxdWlyZXMgMjU2IGJpdCB0aW1lcyBhdCAxMi4yODggTUh6LCBvciBuZWFybHkgMjAKLSAqIG1pY3Jvc2Vjb25kcy4pCi0gKgotICogQ2FsbGVkIGlrZSB0aGlzLgotICoKLSAqICBhZDE4NDNfcmVhZF9tdWx0aShsaXRoLCBuZmllbGRzLAotICoJCSAgICAgICZhZDE4NDNfRklFTEQxLCAmdmFsMSwKLSAqCQkgICAgICAmYWQxODQzX0ZJRUxEMiwgJnZhbDIsIC4uLik7Ci0gKi8KLQotc3RhdGljIHZvaWQgYWQxODQzX3JlYWRfbXVsdGkobGl0aGl1bV90ICpsaXRoLCBpbnQgYXJnY291bnQsIC4uLikKLXsKLQl2YV9saXN0IGFwOwotCWNvbnN0IGFkMTg0M19iaXRmaWVsZF90ICpmcDsKLQlpbnQgdyA9IDAsIG1hc2ssICp2YWx1ZSwgcmVnID0gLTE7Ci0KLQl2YV9zdGFydChhcCwgYXJnY291bnQpOwotCXdoaWxlICgtLWFyZ2NvdW50ID49IDApIHsKLQkJZnAgPSB2YV9hcmcoYXAsIGNvbnN0IGFkMTg0M19iaXRmaWVsZF90ICopOwotCQl2YWx1ZSA9IHZhX2FyZyhhcCwgaW50ICopOwotCQlpZiAocmVnID09IC0xKSB7Ci0JCQlyZWcgPSBmcC0+cmVnOwotCQkJdyA9IGxpX3JlYWRfYWQxODQzX3JlZyhsaXRoLCByZWcpOwotCQl9Ci0JCUFTU0VSVChyZWcgPT0gZnAtPnJlZyk7Ci0JCW1hc2sgPSAoMSA8PCBmcC0+bmJpdHMpIC0gMTsKLQkJKnZhbHVlID0gdyA+PiBmcC0+bG9fYml0ICYgbWFzazsKLQl9Ci0JdmFfZW5kKGFwKTsKLX0KLQotLyoKLSAqIGFkMTg0M193cml0ZV9tdWx0aSBzdG9yZXMgbXVsdGlwbGUgYml0ZmllbGRzIGludG8gdGhlIHNhbWUgQUQxODQzCi0gKiByZWdpc3Rlci4gIEl0IHVzZXMgb25lIHJlYWQgYW5kIG9uZSB3cml0ZSBjeWNsZSB0byBkbyBpdC4KLSAqCi0gKiBDYWxsZWQgbGlrZSB0aGlzLgotICoKLSAqICBhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgbmZpZWxkcywKLSAqCQkgICAgICAgJmFkMTg0M19GSUVMRDEsIHZhbDEsCi0gKgkJICAgICAgICZhZDE4NDNfRklFTEYyLCB2YWwyLCAuLi4pOwotICovCi0KLXN0YXRpYyB2b2lkIGFkMTg0M193cml0ZV9tdWx0aShsaXRoaXVtX3QgKmxpdGgsIGludCBhcmdjb3VudCwgLi4uKQotewotCXZhX2xpc3QgYXA7Ci0JaW50IHJlZzsKLQljb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqZnA7Ci0JaW50IHZhbHVlOwotCWludCB3LCBtLCBtYXNrLCBiaXRzOwotCi0JbWFzayA9IDA7Ci0JYml0cyA9IDA7Ci0JcmVnID0gLTE7Ci0KLQl2YV9zdGFydChhcCwgYXJnY291bnQpOwotCXdoaWxlICgtLWFyZ2NvdW50ID49IDApIHsKLQkJZnAgPSB2YV9hcmcoYXAsIGNvbnN0IGFkMTg0M19iaXRmaWVsZF90ICopOwotCQl2YWx1ZSA9IHZhX2FyZyhhcCwgaW50KTsKLQkJaWYgKHJlZyA9PSAtMSkKLQkJCXJlZyA9IGZwLT5yZWc7Ci0JCUFTU0VSVChmcC0+cmVnID09IHJlZyk7Ci0JCW0gPSAoKDEgPDwgZnAtPm5iaXRzKSAtIDEpIDw8IGZwLT5sb19iaXQ7Ci0JCW1hc2sgfD0gbTsKLQkJYml0cyB8PSAodmFsdWUgPDwgZnAtPmxvX2JpdCkgJiBtOwotCX0KLQl2YV9lbmQoYXApOwotCUFTU0VSVCghKGJpdHMgJiB+bWFzaykpOwotCWlmICh+bWFzayAmIDB4RkZGRikKLQkJdyA9IGxpX3JlYWRfYWQxODQzX3JlZyhsaXRoLCByZWcpOwotCWVsc2UKLQkJdyA9IDA7Ci0JdyA9ICh3ICYgfm1hc2spIHwgYml0czsKLQkodm9pZCkgbGlfd3JpdGVfYWQxODQzX3JlZyhsaXRoLCByZWcsIHcpOwotfQotCi0vKgotICogYWQxODQzX2dldF9nYWluIHJlYWRzIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgYW5kIGV4dHJhY3RzIHRoZSBnYWluIHZhbHVlCi0gKiB1c2luZyB0aGUgc3VwcGxpZWQgZ2FpbiB0eXBlLiAgSXQgcmV0dXJucyB0aGUgZ2FpbiBpbiBPU1MgZm9ybWF0LgotICovCi0KLXN0YXRpYyBpbnQgYWQxODQzX2dldF9nYWluKGxpdGhpdW1fdCAqbGl0aCwgY29uc3QgYWQxODQzX2dhaW5fdCAqZ3ApCi17Ci0JaW50IGxnLCByZzsKLQl1bnNpZ25lZCBzaG9ydCBtYXNrID0gKDEgPDwgZ3AtPmxmaWVsZC0+bmJpdHMpIC0gMTsKLQotCWFkMTg0M19yZWFkX211bHRpKGxpdGgsIDIsIGdwLT5sZmllbGQsICZsZywgZ3AtPnJmaWVsZCwgJnJnKTsKLQlpZiAoZ3AtPm5lZ2F0aXZlKSB7Ci0JCWxnID0gbWFzayAtIGxnOwotCQlyZyA9IG1hc2sgLSByZzsKLQl9Ci0JbGcgPSAobGcgKiAxMDAgKyAobWFzayA+PiAxKSkgLyBtYXNrOwotCXJnID0gKHJnICogMTAwICsgKG1hc2sgPj4gMSkpIC8gbWFzazsKLQlyZXR1cm4gbGcgPDwgMCB8IHJnIDw8IDg7Ci19Ci0KLS8qCi0gKiBTZXQgYW4gYXVkaW8gY2hhbm5lbCdzIGdhaW4uIENvbnZlcnRzIGZyb20gT1NTIGZvcm1hdCB0byBBRDE4NDMncwotICogZm9ybWF0LgotICoKLSAqIFJldHVybnMgdGhlIG5ldyBnYWluLCB3aGljaCBtYXkgYmUgbG93ZXIgdGhhbiB0aGUgb2xkIGdhaW4uCi0gKi8KLQotc3RhdGljIGludCBhZDE4NDNfc2V0X2dhaW4obGl0aGl1bV90ICpsaXRoLAotCQkJICAgY29uc3QgYWQxODQzX2dhaW5fdCAqZ3AsCi0JCQkgICBpbnQgbmV3dmFsKQotewotCXVuc2lnbmVkIHNob3J0IG1hc2sgPSAoMSA8PCBncC0+bGZpZWxkLT5uYml0cykgLSAxOwotCi0JaW50IGxnID0gbmV3dmFsID4+IDAgJiAweEZGOwotCWludCByZyA9IG5ld3ZhbCA+PiA4OwotCWlmIChsZyA8IDAgfHwgbGcgPiAxMDAgfHwgcmcgPCAwIHx8IHJnID4gMTAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlsZyA9IChsZyAqIG1hc2sgKyAobWFzayA+PiAxKSkgLyAxMDA7Ci0JcmcgPSAocmcgKiBtYXNrICsgKG1hc2sgPj4gMSkpIC8gMTAwOwotCWlmIChncC0+bmVnYXRpdmUpIHsKLQkJbGcgPSBtYXNrIC0gbGc7Ci0JCXJnID0gbWFzayAtIHJnOwotCX0KLQlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgZ3AtPmxmaWVsZCwgbGcsIGdwLT5yZmllbGQsIHJnKTsKLQlyZXR1cm4gYWQxODQzX2dldF9nYWluKGxpdGgsIGdwKTsKLX0KLQotLyogUmV0dXJucyB0aGUgY3VycmVudCByZWNvcmRpbmcgc291cmNlLCBpbiBPU1MgZm9ybWF0LiAqLwotCi1zdGF0aWMgaW50IGFkMTg0M19nZXRfcmVjc3JjKGxpdGhpdW1fdCAqbGl0aCkKLXsKLQlpbnQgbHMgPSBhZDE4NDNfcmVhZF9iaXRzKGxpdGgsICZhZDE4NDNfTFNTKTsKLQotCXN3aXRjaCAobHMpIHsKLQljYXNlIDE6Ci0JCXJldHVybiBTT1VORF9NQVNLX01JQzsKLQljYXNlIDI6Ci0JCXJldHVybiBTT1VORF9NQVNLX0xJTkU7Ci0JY2FzZSAzOgotCQlyZXR1cm4gU09VTkRfTUFTS19DRDsKLQljYXNlIDY6Ci0JCXJldHVybiBTT1VORF9NQVNLX1BDTTsKLQlkZWZhdWx0OgotCQlBU1NFUlQoMCk7Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci0KLS8qCi0gKiBFbmFibGUvZGlzYWJsZSBkaWdpdGFsIHJlc2FtcGxlIG1vZGUgaW4gdGhlIEFEMTg0My4KLSAqCi0gKiBUaGUgQUQxODQzIHJlcXVpcmVzIHRoYXQgQURMLCBBRFIsIERBMSBhbmQgREEyIGJlIHBvd2VyZWQgZG93bgotICogd2hpbGUgc3dpdGNoaW5nIG1vZGVzLiAgU28gd2Ugc2F2ZSBEQTEncyBzdGF0ZSAoREEyJ3Mgc3RhdGUgaXMgbm90Ci0gKiBpbnRlcmVzdGluZyksIHBvd2VyIHRoZW0gZG93biwgc3dpdGNoIGludG8vb3V0IG9mIHJlc2FtcGxlIG1vZGUsCi0gKiBwb3dlciB0aGVtIHVwLCBhbmQgcmVzdG9yZSBzdGF0ZS4KLSAqCi0gKiBUaGlzIHdpbGwgY2F1c2UgYXVkaWJsZSBnbGl0Y2hlcyBpZiBEL0Egb3IgQS9EIGlzIGdvaW5nIG9uLCBzbyB0aGUKLSAqIGRyaXZlciBkaXNhbGxvd3MgdGhhdCAoaW4gbWl4ZXJfd3JpdGVfaW9jdGwoKSkuCi0gKgotICogVGhlIG9wZW4gcXVlc3Rpb24gaXMsIGlzIHRoaXMgd29ydGggZG9pbmc/ICBJJ20gbGVhdmluZyBpdCBpbiwKLSAqIGJlY2F1c2UgaXQncyB3cml0dGVuLCBidXQuLi4KLSAqLwotCi1zdGF0aWMgdm9pZCBhZDE4NDNfc2V0X3Jlc2FtcGxlX21vZGUobGl0aGl1bV90ICpsaXRoLCBpbnQgb25vZmYpCi17Ci0JLyogU2F2ZSBEQTEgbXV0ZSBhbmQgZ2FpbiAoYWRkciA5IGlzIERBMSBhbmFsb2cgZ2Fpbi9hdHRlbnVhdGlvbikgKi8KLQlpbnQgc2F2ZV9kYTEgPSBsaV9yZWFkX2FkMTg0M19yZWcobGl0aCwgOSk7Ci0KLQkvKiBQb3dlciBkb3duIEEvRCBhbmQgRC9BLiAqLwotCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCA0LAotCQkJICAgJmFkMTg0M19EQTFFTiwgMCwKLQkJCSAgICZhZDE4NDNfREEyRU4sIDAsCi0JCQkgICAmYWQxODQzX0FETEVOLCAwLAotCQkJICAgJmFkMTg0M19BRFJFTiwgMCk7Ci0KLQkvKiBTd2l0Y2ggbW9kZSAqLwotCUFTU0VSVChvbm9mZiA9PSAwIHx8IG9ub2ZmID09IDEpOwotCWFkMTg0M193cml0ZV9iaXRzKGxpdGgsICZhZDE4NDNfRFJTRkxULCBvbm9mZik7Ci0KLSAJLyogUG93ZXIgdXAgQS9EIGFuZCBEL0EuICovCi0JYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDMsCi0JCQkgICAmYWQxODQzX0RBMUVOLCAxLAotCQkJICAgJmFkMTg0M19BRExFTiwgMSwKLQkJCSAgICZhZDE4NDNfQURSRU4sIDEpOwotCi0JLyogUmVzdG9yZSBEQTEgbXV0ZSBhbmQgZ2Fpbi4gKi8KLQlsaV93cml0ZV9hZDE4NDNfcmVnKGxpdGgsIDksIHNhdmVfZGExKTsKLX0KLQotLyoKLSAqIFNldCByZWNvcmRpbmcgc291cmNlLiAgQXJnIG5ld3NyYyBzcGVjaWZpZXMgYW4gT1NTIGNoYW5uZWwgbWFzay4KLSAqCi0gKiBUaGUgY29tcGxpY2F0aW9uIGlzIHRoYXQgd2hlbiB3ZSBzd2l0Y2ggaW50by9vdXQgb2YgbG9vcGJhY2sgbW9kZQotICogKGkuZS4sIHNyYyA9IFNPVU5EX01BU0tfUENNKSwgd2UgY2hhbmdlIHRoZSBBRDE4NDMgaW50by9vdXQgb2YKLSAqIGRpZ2l0YWwgcmVzYW1wbGluZyBtb2RlLgotICoKLSAqIFJldHVybnMgbmV3c3JjIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgotICovCi0KLXN0YXRpYyBpbnQgYWQxODQzX3NldF9yZWNzcmMobGl0aGl1bV90ICpsaXRoLCBpbnQgbmV3c3JjKQotewotCWludCBiaXRzOwotCWludCBvbGRiaXRzOwotCi0Jc3dpdGNoIChuZXdzcmMpIHsKLQljYXNlIFNPVU5EX01BU0tfUENNOgotCQliaXRzID0gNjsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01BU0tfTUlDOgotCQliaXRzID0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01BU0tfTElORToKLQkJYml0cyA9IDI7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NQVNLX0NEOgotCQliaXRzID0gMzsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0Jb2xkYml0cyA9IGFkMTg0M19yZWFkX2JpdHMobGl0aCwgJmFkMTg0M19MU1MpOwotCWlmIChuZXdzcmMgPT0gU09VTkRfTUFTS19QQ00gJiYgb2xkYml0cyAhPSA2KSB7Ci0JCURCR1AoImVuYWJsaW5nIGRpZ2l0YWwgcmVzYW1wbGUgbW9kZVxuIik7Ci0JCWFkMTg0M19zZXRfcmVzYW1wbGVfbW9kZShsaXRoLCAxKTsKLQkJYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsCi0JCQkJICAgJmFkMTg0M19EQUFETCwgMiwKLQkJCQkgICAmYWQxODQzX0RBQURSLCAyKTsKLQl9IGVsc2UgaWYgKG5ld3NyYyAhPSBTT1VORF9NQVNLX1BDTSAmJiBvbGRiaXRzID09IDYpIHsKLQkJREJHUCgiZGlzYWJsaW5nIGRpZ2l0YWwgcmVzYW1wbGUgbW9kZVxuIik7Ci0JCWFkMTg0M19zZXRfcmVzYW1wbGVfbW9kZShsaXRoLCAwKTsKLQkJYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsCi0JCQkJICAgJmFkMTg0M19EQUFETCwgMCwKLQkJCQkgICAmYWQxODQzX0RBQURSLCAwKTsKLQl9Ci0JYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsICZhZDE4NDNfTFNTLCBiaXRzLCAmYWQxODQzX1JTUywgYml0cyk7Ci0JcmV0dXJuIG5ld3NyYzsKLX0KLQotLyoKLSAqIFJldHVybiBjdXJyZW50IG91dHB1dCBzb3VyY2VzLCBpbiBPU1MgZm9ybWF0LgotICovCi0KLXN0YXRpYyBpbnQgYWQxODQzX2dldF9vdXRzcmMobGl0aGl1bV90ICpsaXRoKQotewotCWludCBwY20sIGxpbmUsIG1pYywgY2Q7Ci0KLQlwY20gID0gYWQxODQzX3JlYWRfYml0cyhsaXRoLCAmYWQxODQzX0xEQTFHTSkgPyAwIDogU09VTkRfTUFTS19QQ007Ci0JbGluZSA9IGFkMTg0M19yZWFkX2JpdHMobGl0aCwgJmFkMTg0M19MWDFNTSkgID8gMCA6IFNPVU5EX01BU0tfTElORTsKLQljZCAgID0gYWQxODQzX3JlYWRfYml0cyhsaXRoLCAmYWQxODQzX0xYMk1NKSAgPyAwIDogU09VTkRfTUFTS19DRDsKLQltaWMgID0gYWQxODQzX3JlYWRfYml0cyhsaXRoLCAmYWQxODQzX0xNQ01NKSAgPyAwIDogU09VTkRfTUFTS19NSUM7Ci0KLQlyZXR1cm4gcGNtIHwgbGluZSB8IGNkIHwgbWljOwotfQotCi0vKgotICogU2V0IG91dHB1dCBzb3VyY2VzLiAgQXJnIGlzIGEgbWFzayBvZiBhY3RpdmUgc291cmNlcyBpbiBPU1MgZm9ybWF0LgotICoKLSAqIFJldHVybnMgc291cmNlIG1hc2sgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuCi0gKi8KLQotc3RhdGljIGludCBhZDE4NDNfc2V0X291dHNyYyhsaXRoaXVtX3QgKmxpdGgsIGludCBtYXNrKQotewotCWludCBwY20sIGxpbmUsIG1pYywgY2Q7Ci0KLQlpZiAobWFzayAmIH4oU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX0xJTkUgfAotCQkgICAgIFNPVU5EX01BU0tfQ0QgfCBTT1VORF9NQVNLX01JQykpCi0JCXJldHVybiAtRUlOVkFMOwotCXBjbSAgPSAobWFzayAmIFNPVU5EX01BU0tfUENNKSAgPyAwIDogMTsKLQlsaW5lID0gKG1hc2sgJiBTT1VORF9NQVNLX0xJTkUpID8gMCA6IDE7Ci0JbWljICA9IChtYXNrICYgU09VTkRfTUFTS19NSUMpICA/IDAgOiAxOwotCWNkICAgPSAobWFzayAmIFNPVU5EX01BU0tfQ0QpICAgPyAwIDogMTsKLQotCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLCAmYWQxODQzX0xEQTFHTSwgcGNtLCAmYWQxODQzX1JEQTFHTSwgcGNtKTsKLQlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgJmFkMTg0M19MWDFNTSwgbGluZSwgJmFkMTg0M19SWDFNTSwgbGluZSk7Ci0JYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsICZhZDE4NDNfTFgyTU0sIGNkLCAgICZhZDE4NDNfUlgyTU0sIGNkKTsKLQlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgJmFkMTg0M19MTUNNTSwgbWljLCAgJmFkMTg0M19STUNNTSwgbWljKTsKLQotCXJldHVybiBtYXNrOwotfQotCi0vKiBTZXR1cCBhZDE4NDMgZm9yIEQvQSBjb252ZXJzaW9uLiAqLwotCi1zdGF0aWMgdm9pZCBhZDE4NDNfc2V0dXBfZGFjKGxpdGhpdW1fdCAqbGl0aCwKLQkJCSAgICAgaW50IGZyYW1lcmF0ZSwKLQkJCSAgICAgaW50IGZtdCwKLQkJCSAgICAgaW50IGNoYW5uZWxzKQotewotCWludCBhZF9mbXQgPSAwLCBhZF9tb2RlID0gMDsKLQotCURCR0VWKCIobGl0aD0weCVwLCBmcmFtZXJhdGU9JWQsIGZtdD0lZCwgY2hhbm5lbHM9JWQpXG4iLAotCSAgICAgIGxpdGgsIGZyYW1lcmF0ZSwgZm10LCBjaGFubmVscyk7Ci0KLQlzd2l0Y2ggKGZtdCkgewotCWNhc2UgQUZNVF9TODoJCWFkX2ZtdCA9IDE7IGJyZWFrOwotCWNhc2UgQUZNVF9VODoJCWFkX2ZtdCA9IDE7IGJyZWFrOwotCWNhc2UgQUZNVF9TMTZfTEU6CWFkX2ZtdCA9IDE7IGJyZWFrOwotCWNhc2UgQUZNVF9NVV9MQVc6CWFkX2ZtdCA9IDI7IGJyZWFrOwotCWNhc2UgQUZNVF9BX0xBVzoJYWRfZm10ID0gMzsgYnJlYWs7Ci0JZGVmYXVsdDoJCUFTU0VSVCgwKTsKLQl9Ci0KLQlzd2l0Y2ggKGNoYW5uZWxzKSB7Ci0JY2FzZSAyOgkJCWFkX21vZGUgPSAwOyBicmVhazsKLQljYXNlIDE6CQkJYWRfbW9kZSA9IDE7IGJyZWFrOwotCWRlZmF1bHQ6CQlBU1NFUlQoMCk7Ci0JfQotCQkKLQlEQkdQVigiYWRfbW9kZSA9ICVkLCBhZF9mbXQgPSAlZFxuIiwgYWRfbW9kZSwgYWRfZm10KTsKLQlBU1NFUlQoZnJhbWVyYXRlID49IDQwMDAgJiYgZnJhbWVyYXRlIDw9IDQ5MDAwKTsKLQlhZDE4NDNfd3JpdGVfYml0cyhsaXRoLCAmYWQxODQzX0MxQywgZnJhbWVyYXRlKTsKLQlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwKLQkJCSAgICZhZDE4NDNfREExU00sIGFkX21vZGUsICZhZDE4NDNfREExRiwgYWRfZm10KTsKLX0KLQotc3RhdGljIHZvaWQgYWQxODQzX3NodXRkb3duX2RhYyhsaXRoaXVtX3QgKmxpdGgpCi17Ci0JYWQxODQzX3dyaXRlX2JpdHMobGl0aCwgJmFkMTg0M19EQTFGLCAxKTsKLX0KLQotc3RhdGljIHZvaWQgYWQxODQzX3NldHVwX2FkYyhsaXRoaXVtX3QgKmxpdGgsIGludCBmcmFtZXJhdGUsIGludCBmbXQsIGludCBjaGFubmVscykKLXsKLQlpbnQgZGFfZm10ID0gMDsKLQotCURCR0VWKCIobGl0aD0weCVwLCBmcmFtZXJhdGU9JWQsIGZtdD0lZCwgY2hhbm5lbHM9JWQpXG4iLAotCSAgICAgIGxpdGgsIGZyYW1lcmF0ZSwgZm10LCBjaGFubmVscyk7Ci0KLQlzd2l0Y2ggKGZtdCkgewotCWNhc2UgQUZNVF9TODoJCWRhX2ZtdCA9IDE7IGJyZWFrOwotCWNhc2UgQUZNVF9VODoJCWRhX2ZtdCA9IDE7IGJyZWFrOwotCWNhc2UgQUZNVF9TMTZfTEU6CWRhX2ZtdCA9IDE7IGJyZWFrOwotCWNhc2UgQUZNVF9NVV9MQVc6CWRhX2ZtdCA9IDI7IGJyZWFrOwotCWNhc2UgQUZNVF9BX0xBVzoJZGFfZm10ID0gMzsgYnJlYWs7Ci0JZGVmYXVsdDoJCUFTU0VSVCgwKTsKLQl9Ci0KLQlEQkdQVigiZGFfZm10ID0gJWRcbiIsIGRhX2ZtdCk7Ci0JQVNTRVJUKGZyYW1lcmF0ZSA+PSA0MDAwICYmIGZyYW1lcmF0ZSA8PSA0OTAwMCk7Ci0JYWQxODQzX3dyaXRlX2JpdHMobGl0aCwgJmFkMTg0M19DMkMsIGZyYW1lcmF0ZSk7Ci0JYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsCi0JCQkgICAmYWQxODQzX0FETEYsIGRhX2ZtdCwgJmFkMTg0M19BRFJGLCBkYV9mbXQpOwotfQotCi1zdGF0aWMgdm9pZCBhZDE4NDNfc2h1dGRvd25fYWRjKGxpdGhpdW1fdCAqbGl0aCkKLXsKLQkvKiBub3RoaW5nIHRvIGRvICovCi19Ci0KLS8qCi0gKiBGdWxseSBpbml0aWFsaXplIHRoZSBhZDE4NDMuICBBcyBkZXNjcmliZWQgaW4gdGhlIEFEMTg0MyBkYXRhCi0gKiBzaGVldCwgc2VjdGlvbiAiU1RBUlQtVVAgU0VRVUVOQ0UiLiAgVGhlIG51bWJlcmVkIGNvbW1lbnRzIGFyZQotICogc3Vic2VjdGlvbiBoZWFkaW5ncyBmcm9tIHRoZSBkYXRhIHNoZWV0LiAgU2VlIHRoZSBkYXRhIHNoZWV0LCBwYWdlcwotICogNTItNTQsIGZvciBtb3JlIGluZm8uCi0gKgotICogcmV0dXJuIDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuICAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBhZDE4NDNfaW5pdChsaXRoaXVtX3QgKmxpdGgpCi17Ci0JdW5zaWduZWQgbG9uZyBsYXRlcjsKLQlpbnQgZXJyOwotCi0JZXJyID0gbGlfaW5pdChsaXRoKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKGFkMTg0M19yZWFkX2JpdHMobGl0aCwgJmFkMTg0M19JTklUKSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidndzbmQgc291bmQ6IEFEMTg0MyB3b24ndCBpbml0aWFsaXplXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JYWQxODQzX3dyaXRlX2JpdHMobGl0aCwgJmFkMTg0M19TQ0YsIDEpOwotCi0JLyogNC4gUHV0IHRoZSBjb252ZXJzaW9uIHJlc291cmNlcyBpbnRvIHN0YW5kYnkuICovCi0KLQlhZDE4NDNfd3JpdGVfYml0cyhsaXRoLCAmYWQxODQzX1BETkksIDApOwotCWxhdGVyID0gamlmZmllcyArIEhaIC8gMjsJLyogcm91Z2hseSBoYWxmIGEgc2Vjb25kICovCi0JREJHRE8oc2h1dF91cCsrKTsKLQl3aGlsZSAoYWQxODQzX3JlYWRfYml0cyhsaXRoLCAmYWQxODQzX1BETk8pKSB7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGxhdGVyKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgInZ3c25kIGF1ZGlvOiBBRDE4NDMgd29uJ3QgcG93ZXIgdXBcbiIpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQkJc2NoZWR1bGUoKTsKLQl9Ci0JREJHRE8oc2h1dF91cC0tKTsKLQotCS8qIDUuIFBvd2VyIHVwIHRoZSBjbG9jayBnZW5lcmF0b3JzIGFuZCBlbmFibGUgY2xvY2sgb3V0cHV0IHBpbnMuICovCi0KLQlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgJmFkMTg0M19DMUVOLCAxLCAmYWQxODQzX0MyRU4sIDEpOwotCi0JLyogNi4gQ29uZmlndXJlIGNvbnZlcnNpb24gcmVzb3VyY2VzIHdoaWxlIHRoZXkgYXJlIGluIHN0YW5kYnkuICovCi0KLSAJLyogREFDMSB1c2VzIGNsb2NrIDEgYXMgc291cmNlLCBBREMgdXNlcyBjbG9jayAyLiAgQWx3YXlzLiAqLwotCi0JYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDMsCi0JCQkgICAmYWQxODQzX0RBMUMsIDEsCi0JCQkgICAmYWQxODQzX0FETEMsIDIsCi0JCQkgICAmYWQxODQzX0FEUkMsIDIpOwotCi0JLyogNy4gRW5hYmxlIGNvbnZlcnNpb24gcmVzb3VyY2VzLiAqLwotCi0JYWQxODQzX3dyaXRlX2JpdHMobGl0aCwgJmFkMTg0M19BRFRMSywgMSk7Ci0JYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDUsCi0JCQkgICAmYWQxODQzX0FOQUVOLCAxLAotCQkJICAgJmFkMTg0M19BQU1FTiwgMSwKLQkJCSAgICZhZDE4NDNfREExRU4sIDEsCi0JCQkgICAmYWQxODQzX0FETEVOLCAxLAotCQkJICAgJmFkMTg0M19BRFJFTiwgMSk7Ci0KLQkvKiA4LiBDb25maWd1cmUgY29udmVyc2lvbiByZXNvdXJjZXMgd2hpbGUgdGhleSBhcmUgZW5hYmxlZC4gKi8KLQotCWFkMTg0M193cml0ZV9iaXRzKGxpdGgsICZhZDE4NDNfREExQywgMSk7Ci0KLQkvKiBVbm11dGUgYWxsIGNoYW5uZWxzLiAqLwotCi0JYWQxODQzX3NldF9vdXRzcmMobGl0aCwKLQkJCSAgKFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19MSU5FIHwKLQkJCSAgIFNPVU5EX01BU0tfTUlDIHwgU09VTkRfTUFTS19DRCkpOwotCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLCAmYWQxODQzX0xEQTFBTSwgMCwgJmFkMTg0M19SREExQU0sIDApOwotCi0JLyogU2V0IGRlZmF1bHQgcmVjb3JkaW5nIHNvdXJjZSB0byBMaW5lIEluIGFuZCBzZXQKLQkgKiBtaWMgZ2FpbiB0byArMjAgZEIuCi0JICovCi0KLQlhZDE4NDNfc2V0X3JlY3NyYyhsaXRoLCBTT1VORF9NQVNLX0xJTkUpOwotCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLCAmYWQxODQzX0xNR0UsIDEsICZhZDE4NDNfUk1HRSwgMSk7Ci0KLQkvKiBTZXQgU3BlYWtlciBPdXQgbGV2ZWwgdG8gKy8tIDRWIGFuZCB1bm11dGUgaXQuICovCi0KLQlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgJmFkMTg0M19IUE9TLCAxLCAmYWQxODQzX0hQT00sIDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFBDTSBJL08gKi8KLQotI2RlZmluZSBSRUFEX0lOVFJfTUFTSyAgKExJX0lOVFJfQ09NTTFfVFJJRyB8IExJX0lOVFJfQ09NTTFfT1ZFUkZMT1cpCi0jZGVmaW5lIFdSSVRFX0lOVFJfTUFTSyAoTElfSU5UUl9DT01NMl9UUklHIHwgTElfSU5UUl9DT01NMl9VTkRFUkZMT1cpCi0KLXR5cGVkZWYgZW51bSB2d3NuZF9wb3J0X3N3c3RhdGUgewkvKiBzb2Z0d2FyZSBzdGF0ZSAqLwotCVNXX09GRiwKLQlTV19JTklUSUFMLAotCVNXX1JVTiwKLQlTV19EUkFJTiwKLX0gdndzbmRfcG9ydF9zd3N0YXRlX3Q7Ci0KLXR5cGVkZWYgZW51bSB2d3NuZF9wb3J0X2h3c3RhdGUgewkvKiBoYXJkd2FyZSBzdGF0ZSAqLwotCUhXX1NUT1BQRUQsCi0JSFdfUlVOTklORywKLX0gdndzbmRfcG9ydF9od3N0YXRlX3Q7Ci0KLS8qCi0gKiBUaGVzZSBmbGFncyBhcmUgcmVhZCBieSBJU1IsIGJ1dCBvbmx5IHdyaXR0ZW4gYXQgYmFzZWxpbmUuCi0gKi8KLQotdHlwZWRlZiBlbnVtIHZ3c25kX3BvcnRfZmxhZ3MgewotCURJU0FCTEVEID0gMSA8PCAwLAotCUVSRkxPV04gID0gMSA8PCAxLAkJLyogb3ZlcmZsb3duIG9yIHVuZGVyZmxvd24gKi8KLQlIV19CVVNZICA9IDEgPDwgMiwKLX0gdndzbmRfcG9ydF9mbGFnc190OwotCi0vKgotICogdndzbmRfcG9ydCBpcyB0aGUgcGVyLXBvcnQgZGF0YSBzdHJ1Y3R1cmUuICBFYWNoIGRldmljZSBoYXMgdHdvCi0gKiBwb3J0cywgb25lIGZvciBpbnB1dCBhbmQgb25lIGZvciBvdXRwdXQuCi0gKgotICogTG9ja2luZzoKLSAqCi0gKglwb3J0LT5sb2NrIHByb3RlY3RzOiBod3N0YXRlLCBmbGFncywgc3diX1tpdV1fYXZhaWwuCi0gKgotICoJZGV2Yy0+aW9fbXV0ZXggcHJvdGVjdHM6IHN3c3RhdGUsIHN3XyosIHN3Yl9baXVdX2lkeC4KLSAqCi0gKglldmVyeXRoaW5nIGVsc2UgaXMgb25seSB3cml0dGVuIGJ5IG9wZW4vcmVsZWFzZSBvcgotICoJcGNtX3tzZXR1cCxzaHV0ZG93bn0oKSwgd2hpY2ggYXJlIHNlcmlhbGl6ZWQgYnkgYQotICoJY29tYmluYXRpb24gb2YgZGV2Yy0+b3Blbl9tdXRleCBhbmQgZGV2Yy0+aW9fbXV0ZXguCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgdndzbmRfcG9ydCB7Ci0KLQlzcGlubG9ja190CWxvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgcXVldWU7Ci0JdndzbmRfcG9ydF9zd3N0YXRlX3Qgc3dzdGF0ZTsKLQl2d3NuZF9wb3J0X2h3c3RhdGVfdCBod3N0YXRlOwotCXZ3c25kX3BvcnRfZmxhZ3NfdCBmbGFnczsKLQotCWludAkJc3dfY2hhbm5lbHM7Ci0JaW50CQlzd19zYW1wbGVmbXQ7Ci0JaW50CQlzd19mcmFtZXJhdGU7Ci0JaW50CQlzYW1wbGVfc2l6ZTsKLQlpbnQJCWZyYW1lX3NpemU7Ci0JdW5zaWduZWQgaW50CXplcm9fd29yZDsJLyogemVybyBmb3IgdGhlIHNhbXBsZSBmb3JtYXQgKi8KLQotCWludAkJc3dfZnJhZ3NoaWZ0OwotCWludAkJc3dfZnJhZ2NvdW50OwotCWludAkJc3dfc3ViZGl2c2hpZnQ7Ci0KLQl1bnNpZ25lZCBpbnQJaHdfZnJhZ3NoaWZ0OwotCXVuc2lnbmVkIGludAlod19mcmFnc2l6ZTsKLQl1bnNpZ25lZCBpbnQJaHdfZnJhZ2NvdW50OwotCi0JaW50CQlod2J1Zl9zaXplOwotCXVuc2lnbmVkIGxvbmcJaHdidWZfcGFkZHI7Ci0JdW5zaWduZWQgbG9uZwlod2J1Zl92YWRkcjsKLQl2b2lkICoJCWh3YnVmOwkJLyogaHdidWYgPT0gaHdidWZfdmFkZHIgKi8KLQlpbnQJCWh3YnVmX21heDsJLyogbWF4IGJ5dGVzIHRvIHByZWxvYWQgKi8KLQotCXZvaWQgKgkJc3didWY7Ci0JdW5zaWduZWQgaW50CXN3YnVmX3NpemU7CS8qIHNpemUgaW4gYnl0ZXMgKi8KLQl1bnNpZ25lZCBpbnQJc3diX3VfaWR4OwkvKiBpbmRleCBvZiBuZXh0IHVzZXIgYnl0ZSAqLwotCXVuc2lnbmVkIGludAlzd2JfaV9pZHg7CS8qIGluZGV4IG9mIG5leHQgaW50ciBieXRlICovCi0JdW5zaWduZWQgaW50CXN3Yl91X2F2YWlsOwkvKiAjIGJ5dGVzIGF2YWlsIHRvIHVzZXIgKi8KLQl1bnNpZ25lZCBpbnQJc3diX2lfYXZhaWw7CS8qICMgYnl0ZXMgYXZhaWwgdG8gaW50ciAqLwotCi0JZG1hX2NoYW5fdAljaGFuOwotCi0JLyogQWNjb3VudGluZyAqLwotCi0JaW50CQlieXRlX2NvdW50OwotCWludAkJZnJhZ19jb3VudDsKLQlpbnQJCU1TQ19vZmZzZXQ7Ci0KLX0gdndzbmRfcG9ydF90OwotCi0vKiB2d3NuZF9kZXYgaXMgdGhlIHBlci1kZXZpY2UgZGF0YSBzdHJ1Y3R1cmUuICovCi0KLXR5cGVkZWYgc3RydWN0IHZ3c25kX2RldiB7Ci0Jc3RydWN0IHZ3c25kX2RldiAqbmV4dF9kZXY7Ci0JaW50CQlhdWRpb19taW5vcjsJLyogbWlub3IgbnVtYmVyIG9mIGF1ZGlvIGRldmljZSAqLwotCWludAkJbWl4ZXJfbWlub3I7CS8qIG1pbm9yIG51bWJlciBvZiBtaXhlciBkZXZpY2UgKi8KLQotCXN0cnVjdCBtdXRleCBvcGVuX211dGV4OwotCXN0cnVjdCBtdXRleCBpb19tdXRleDsKLQlzdHJ1Y3QgbXV0ZXggbWl4X211dGV4OwotCWZtb2RlX3QJCW9wZW5fbW9kZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7Ci0KLQlsaXRoaXVtX3QJbGl0aDsKLQotCXZ3c25kX3BvcnRfdAlycG9ydDsKLQl2d3NuZF9wb3J0X3QJd3BvcnQ7Ci19IHZ3c25kX2Rldl90OwotCi1zdGF0aWMgdndzbmRfZGV2X3QgKnZ3c25kX2Rldl9saXN0OwkvKiBsaW5rZWQgbGlzdCBvZiBhbGwgZGV2aWNlcyAqLwotCi1zdGF0aWMgYXRvbWljX3QgdndzbmRfdXNlX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7Ci0KLSMgZGVmaW5lIElOQ19VU0VfQ09VTlQgKGF0b21pY19pbmMoJnZ3c25kX3VzZV9jb3VudCkpCi0jIGRlZmluZSBERUNfVVNFX0NPVU5UIChhdG9taWNfZGVjKCZ2d3NuZF91c2VfY291bnQpKQotIyBkZWZpbmUgSU5fVVNFICAgICAgICAoYXRvbWljX3JlYWQoJnZ3c25kX3VzZV9jb3VudCkgIT0gMCkKLQotLyoKLSAqIExpdGhpdW0gY2FuIG9ubHkgRE1BIG11bHRpcGxlcyBvZiAzMiBieXRlcy4gIEl0cyBETUEgYnVmZmVyIG1heQotICogYmUgdXAgdG8gOCBLYi4gIFRoaXMgZHJpdmVyIGFsd2F5cyB1c2VzIDggS2IuCi0gKgotICogTWVtb3J5IGJ1ZyB3b3JrYXJvdW5kIC0tIEknbSBub3Qgc3VyZSB3aGF0J3MgZ29pbmcgb24gaGVyZSwgYnV0Ci0gKiBzb21laG93IHBjbV9jb3B5X291dCgpIHdhcyB0cmlnZ2VyaW5nIHNlZ3YncyBnb2luZyBvbiB0byB0aGUgbmV4dAotICogcGFnZSBvZiB0aGUgaHcgYnVmZmVyLiAgU28sIEkgbWFrZSB0aGUgaHcgYnVmZmVyIG9uZSBzaXplIGJpZ2dlcgotICogdGhhbiB3ZSBhY3R1YWxseSB1c2UuICBUaGF0IHdheSwgdGhlIGZvbGxvd2luZyBwYWdlIGlzIGFsbG9jYXRlZAotICogYW5kIG1hcHBlZCwgYW5kIG5vIGVycm9yLiAgSSBzdXNwZWN0IHRoYXQgc29tZXRoaW5nIGlzIGJyb2tlbgotICogaW4gQ29iYWx0LCBidXQgaGF2ZW4ndCByZWFsbHkgaW52ZXN0aWdhdGVkLiAgSEJPIGlzIHRoZSBhY3R1YWwKLSAqIHNpemUgb2YgdGhlIGJ1ZmZlciwgYW5kIEhXQlVGX09SREVSIGlzIHdoYXQgd2UgYWxsb2NhdGUuCi0gKi8KLQotI2RlZmluZSBIV0JVRl9TSElGVCAxMwotI2RlZmluZSBIV0JVRl9TSVpFICgxIDw8IEhXQlVGX1NISUZUKQotIyBkZWZpbmUgSEJPICAgICAgICAgKEhXQlVGX1NISUZUID4gUEFHRV9TSElGVCA/IEhXQlVGX1NISUZUIC0gUEFHRV9TSElGVCA6IDApCi0jIGRlZmluZSBIV0JVRl9PUkRFUiAoSEJPICsgMSkJCS8qIG5leHQgc2l6ZSBiaWdnZXIgKi8KLSNkZWZpbmUgTUlOX1NQRUVEIDQwMDAKLSNkZWZpbmUgTUFYX1NQRUVEIDQ5MDAwCi0KLSNkZWZpbmUgTUlOX0ZSQUdTSElGVAkJCShETUFDSFVOS19TSElGVCArIDEpCi0jZGVmaW5lIE1BWF9GUkFHU0hJRlQJCQkoUEFHRV9TSElGVCkKLSNkZWZpbmUgTUlOX0ZSQUdTSVpFCQkJKDEgPDwgTUlOX0ZSQUdTSElGVCkKLSNkZWZpbmUgTUFYX0ZSQUdTSVpFCQkJKDEgPDwgTUFYX0ZSQUdTSElGVCkKLSNkZWZpbmUgTUlOX0ZSQUdDT1VOVChmcmFnc2l6ZSkJCTMKLSNkZWZpbmUgTUFYX0ZSQUdDT1VOVChmcmFnc2l6ZSkJCSgzMiAqIFBBR0VfU0laRSAvIChmcmFnc2l6ZSkpCi0jZGVmaW5lIERFRkFVTFRfRlJBR1NISUZUCQkxMgotI2RlZmluZSBERUZBVUxUX0ZSQUdDT1VOVAkJMTYKLSNkZWZpbmUgREVGQVVMVF9TVUJESVZTSElGVAkJMAotCi0vKgotICogVGhlIHNvZnR3YXJlIGJ1ZmZlciAoc3didWYpIGlzIGEgcmluZyBidWZmZXIgc2hhcmVkIGJldHdlZW4gdXNlcgotICogbGV2ZWwgYW5kIGludGVycnVwdCBsZXZlbC4gIEVhY2ggbGV2ZWwgb3ducyBzb21lIG9mIHRoZSBieXRlcyBpbgotICogdGhlIGJ1ZmZlciwgYW5kIG1heSBnaXZlIGJ5dGVzIGF3YXkgYnkgY2FsbGluZyBzd2JfaW5jX3t1LGl9KCkuCi0gKiBVc2VyIGxldmVsIGNhbGxzIF91IGZvciB1c2VyLCBhbmQgaW50ZXJydXB0IGxldmVsIGNhbGxzIF9pIGZvcgotICogaW50ZXJydXB0LgotICoKLSAqIHBvcnQtPnN3Yl97dSxpfV9hdmFpbCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSB0byB0aGF0IGxldmVsLgotICoKLSAqIHBvcnQtPnN3Yl97dSxpfV9pZHggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBhdmFpbGFibGUgYnl0ZSBpbiB0aGUKLSAqIGJ1ZmZlci4KLSAqCi0gKiBFYWNoIGxldmVsIGNhbGxzIHN3Yl9pbmNfe3UsaX0oKSB0byBhdG9taWNhbGx5IGluY3JlbWVudCBpdHMgaW5kZXgsCi0gKiByZWNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBmb3IgYm90aCBzaWRlcywgYW5kCi0gKiByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUuICBTaW5jZSBlYWNoIHNpZGUgY2FuIG9ubHkKLSAqIGdpdmUgYXdheSBieXRlcywgdGhlIG90aGVyIHNpZGUgY2FuIG9ubHkgaW5jcmVhc2UgdGhlIG51bWJlciBvZgotICogYnl0ZXMgYXZhaWxhYmxlIHRvIHRoaXMgc2lkZS4gIEVhY2ggc2lkZSB1cGRhdGVzIGl0cyBvd24gaW5kZXgKLSAqIHZhcmlhYmxlLCBzd2Jfe3UsaX1faWR4LCBzbyBubyBsb2NrIGlzIG5lZWRlZCB0byByZWFkIGl0LgotICoKLSAqIFRvIHF1ZXJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlLCBjYWxsIHN3Yl9pbmNfe3UsaX0gd2l0aCBhbgotICogaW5jcmVtZW50IG9mIHplcm8uCi0gKi8KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IF9fc3diX2luY191KHZ3c25kX3BvcnRfdCAqcG9ydCwgaW50IGluYykKLXsKLQlpZiAoaW5jKSB7Ci0JCXBvcnQtPnN3Yl91X2lkeCArPSBpbmM7Ci0JCXBvcnQtPnN3Yl91X2lkeCAlPSBwb3J0LT5zd2J1Zl9zaXplOwotCQlwb3J0LT5zd2JfdV9hdmFpbCAtPSBpbmM7Ci0JCXBvcnQtPnN3Yl9pX2F2YWlsICs9IGluYzsKLQl9Ci0JcmV0dXJuIHBvcnQtPnN3Yl91X2F2YWlsOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgc3diX2luY191KHZ3c25kX3BvcnRfdCAqcG9ydCwgaW50IGluYykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCByZXQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCXsKLQkJcmV0ID0gX19zd2JfaW5jX3UocG9ydCwgaW5jKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX3N3Yl9pbmNfaSh2d3NuZF9wb3J0X3QgKnBvcnQsIGludCBpbmMpCi17Ci0JaWYgKGluYykgewotCQlwb3J0LT5zd2JfaV9pZHggKz0gaW5jOwotCQlwb3J0LT5zd2JfaV9pZHggJT0gcG9ydC0+c3didWZfc2l6ZTsKLQkJcG9ydC0+c3diX2lfYXZhaWwgLT0gaW5jOwotCQlwb3J0LT5zd2JfdV9hdmFpbCArPSBpbmM7Ci0JfQotCXJldHVybiBwb3J0LT5zd2JfaV9hdmFpbDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IHN3Yl9pbmNfaSh2d3NuZF9wb3J0X3QgKnBvcnQsIGludCBpbmMpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgcmV0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQl7Ci0JCXJldCA9IF9fc3diX2luY19pKHBvcnQsIGluYyk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogcGNtX3NldHVwIC0gdGhpcyByb3V0aW5lIGluaXRpYWxpemVzIGFsbCBwb3J0IHN0YXRlIGFmdGVyCi0gKiBtb2RlLXNldHRpbmcgaW9jdGxzIGhhdmUgYmVlbiBkb25lLCBidXQgYmVmb3JlIHRoZSBmaXJzdCBJL08gaXMKLSAqIGRvbmUuCi0gKgotICogTG9ja2luZzogY2FsbGVkIHdpdGggZGV2Yy0+aW9fbXV0ZXggaGVsZC4KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuCi0gKi8KLQotc3RhdGljIGludCBwY21fc2V0dXAodndzbmRfZGV2X3QgKmRldmMsCi0JCSAgICAgdndzbmRfcG9ydF90ICpycG9ydCwKLQkJICAgICB2d3NuZF9wb3J0X3QgKndwb3J0KQotewotCXZ3c25kX3BvcnRfdCAqYXBvcnQgPSBycG9ydCA/IHJwb3J0IDogd3BvcnQ7Ci0JaW50IHNhbXBsZV9zaXplOwotCXVuc2lnbmVkIGludCB6ZXJvX3dvcmQ7Ci0KLQlEQkdFVigiKGRldmM9MHglcCwgcnBvcnQ9MHglcCwgd3BvcnQ9MHglcClcbiIsIGRldmMsIHJwb3J0LCB3cG9ydCk7Ci0KLQlBU1NFUlQoYXBvcnQgIT0gTlVMTCk7Ci0JaWYgKGFwb3J0LT5zd2J1ZiAhPSBOVUxMKQotCQlyZXR1cm4gMDsKLQlzd2l0Y2ggKGFwb3J0LT5zd19zYW1wbGVmbXQpIHsKLQljYXNlIEFGTVRfTVVfTEFXOgotCQlzYW1wbGVfc2l6ZSA9IDE7Ci0JCXplcm9fd29yZCA9IDB4RkZGRkZGRkYgXiAweDgwODA4MDgwOwotCQlicmVhazsKLQotCWNhc2UgQUZNVF9BX0xBVzoKLQkJc2FtcGxlX3NpemUgPSAxOwotCQl6ZXJvX3dvcmQgPSAweEQ1RDVENUQ1IF4gMHg4MDgwODA4MDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFGTVRfVTg6Ci0JCXNhbXBsZV9zaXplID0gMTsKLQkJemVyb193b3JkID0gMHg4MDgwODA4MDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFGTVRfUzg6Ci0JCXNhbXBsZV9zaXplID0gMTsKLQkJemVyb193b3JkID0gMHgwMDAwMDAwMDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFGTVRfUzE2X0xFOgotCQlzYW1wbGVfc2l6ZSA9IDI7Ci0JCXplcm9fd29yZCA9IDB4MDAwMDAwMDA7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJc2FtcGxlX3NpemUgPSAwOwkvKiBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmcgKi8KLQkJemVyb193b3JkID0gMDsKLQkJQVNTRVJUKDApOwotCX0KLQlhcG9ydC0+c2FtcGxlX3NpemUgID0gc2FtcGxlX3NpemU7Ci0JYXBvcnQtPnplcm9fd29yZCAgICA9IHplcm9fd29yZDsKLQlhcG9ydC0+ZnJhbWVfc2l6ZSAgID0gYXBvcnQtPnN3X2NoYW5uZWxzICogYXBvcnQtPnNhbXBsZV9zaXplOwotCWFwb3J0LT5od19mcmFnc2hpZnQgPSBhcG9ydC0+c3dfZnJhZ3NoaWZ0IC0gYXBvcnQtPnN3X3N1YmRpdnNoaWZ0OwotCWFwb3J0LT5od19mcmFnc2l6ZSAgPSAxIDw8IGFwb3J0LT5od19mcmFnc2hpZnQ7Ci0JYXBvcnQtPmh3X2ZyYWdjb3VudCA9IGFwb3J0LT5zd19mcmFnY291bnQgPDwgYXBvcnQtPnN3X3N1YmRpdnNoaWZ0OwotCUFTU0VSVChhcG9ydC0+aHdfZnJhZ3NpemUgPj0gTUlOX0ZSQUdTSVpFKTsKLQlBU1NFUlQoYXBvcnQtPmh3X2ZyYWdzaXplIDw9IE1BWF9GUkFHU0laRSk7Ci0JQVNTRVJUKGFwb3J0LT5od19mcmFnY291bnQgPj0gTUlOX0ZSQUdDT1VOVChhcG9ydC0+aHdfZnJhZ3NpemUpKTsKLQlBU1NFUlQoYXBvcnQtPmh3X2ZyYWdjb3VudCA8PSBNQVhfRlJBR0NPVU5UKGFwb3J0LT5od19mcmFnc2l6ZSkpOwotCWlmIChycG9ydCkgewotCQlpbnQgaHdmcmFncywgc3dmcmFnczsKLQkJcnBvcnQtPmh3YnVmX21heCA9IGFwb3J0LT5od2J1Zl9zaXplIC0gRE1BQ0hVTktfU0laRTsKLQkJaHdmcmFncyA9IHJwb3J0LT5od2J1Zl9tYXggPj4gYXBvcnQtPmh3X2ZyYWdzaGlmdDsKLQkJc3dmcmFncyA9IGFwb3J0LT5od19mcmFnY291bnQgLSBod2ZyYWdzOwotCQlpZiAoc3dmcmFncyA8IDIpCi0JCQlzd2ZyYWdzID0gMjsKLQkJcnBvcnQtPnN3YnVmX3NpemUgPSBzd2ZyYWdzICogYXBvcnQtPmh3X2ZyYWdzaXplOwotCQlEQkdQVigiaHdmcmFncyA9ICVkLCBzd2ZyYWdzID0gJWRcbiIsIGh3ZnJhZ3MsIHN3ZnJhZ3MpOwotCQlEQkdQVigicmVhZCBod2J1Zl9tYXggPSAlZCwgc3didWZfc2l6ZSA9ICVkXG4iLAotCQkgICAgIHJwb3J0LT5od2J1Zl9tYXgsIHJwb3J0LT5zd2J1Zl9zaXplKTsKLQl9Ci0JaWYgKHdwb3J0KSB7Ci0JCWludCBod2ZyYWdzLCBzd2ZyYWdzOwotCQlpbnQgdG90YWxfYnl0ZXMgPSBhcG9ydC0+aHdfZnJhZ2NvdW50ICogYXBvcnQtPmh3X2ZyYWdzaXplOwotCQl3cG9ydC0+aHdidWZfbWF4ID0gYXBvcnQtPmh3YnVmX3NpemUgLSBETUFDSFVOS19TSVpFOwotCQlpZiAod3BvcnQtPmh3YnVmX21heCA+IHRvdGFsX2J5dGVzKQotCQkJd3BvcnQtPmh3YnVmX21heCA9IHRvdGFsX2J5dGVzOwotCQlod2ZyYWdzID0gd3BvcnQtPmh3YnVmX21heCA+PiBhcG9ydC0+aHdfZnJhZ3NoaWZ0OwotCQlEQkdQVigiaHdmcmFncyA9ICVkXG4iLCBod2ZyYWdzKTsKLQkJc3dmcmFncyA9IGFwb3J0LT5od19mcmFnY291bnQgLSBod2ZyYWdzOwotCQlpZiAoc3dmcmFncyA8IDIpCi0JCQlzd2ZyYWdzID0gMjsKLQkJd3BvcnQtPnN3YnVmX3NpemUgPSBzd2ZyYWdzICogYXBvcnQtPmh3X2ZyYWdzaXplOwotCQlEQkdQVigiaHdmcmFncyA9ICVkLCBzd2ZyYWdzID0gJWRcbiIsIGh3ZnJhZ3MsIHN3ZnJhZ3MpOwotCQlEQkdQVigid3JpdGUgaHdidWZfbWF4ID0gJWQsIHN3YnVmX3NpemUgPSAlZFxuIiwKLQkJICAgICB3cG9ydC0+aHdidWZfbWF4LCB3cG9ydC0+c3didWZfc2l6ZSk7Ci0JfQotCi0JYXBvcnQtPnN3Yl91X2lkeCAgICA9IDA7Ci0JYXBvcnQtPnN3Yl9pX2lkeCAgICA9IDA7Ci0JYXBvcnQtPmJ5dGVfY291bnQgICA9IDA7Ci0KLQkvKgotCSAqIElzIHRoaXMgYSBDb2JhbHQgYnVnPyAgV2UgbmVlZCB0byBtYWtlIHRoaXMgYnVmZmVyIGV4dGVuZAotCSAqIG9uZSBwYWdlIGZ1cnRoZXIgdGhhbiB3ZSBhY3R1YWxseSB1c2UgLS0gc29tZWhvdyBtZW1jcHkKLQkgKiBjYXVzZXMgYW4gZXhjZXB0b2luIG90aGVyd2lzZS4gIEkgc3VzcGVjdCB0aGVyZSdzIGEgYnVnIGluCi0JICogQ29iYWx0IChvciBzb21ld2hlcmUpIHdoZXJlIGl0J3MgZ2VuZXJhdGluZyBhIGZhdWx0IG9uIGEKLQkgKiBzcGVjdWxhdGl2ZSBsb2FkIG9yIHNvbWV0aGluZy4gIE9idmlvdXNseSwgSSBoYXZlbid0IHRha2VuCi0JICogdGhlIHRpbWUgdG8gdHJhY2sgaXQgZG93bi4KLQkgKi8KLQotCWFwb3J0LT5zd2J1ZiAgICAgICAgPSB2bWFsbG9jKGFwb3J0LT5zd2J1Zl9zaXplICsgUEFHRV9TSVpFKTsKLQlpZiAoIWFwb3J0LT5zd2J1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKHJwb3J0ICYmIHdwb3J0KSB7Ci0JCUFTU0VSVChhcG9ydCA9PSBycG9ydCk7Ci0JCUFTU0VSVCh3cG9ydC0+c3didWYgPT0gTlVMTCk7Ci0JCS8qIE9uZSBleHRyYSBwYWdlIC0gc2VlIGNvbW1lbnQgYWJvdmUuICovCi0JCXdwb3J0LT5zd2J1ZiA9IHZtYWxsb2MoYXBvcnQtPnN3YnVmX3NpemUgKyBQQUdFX1NJWkUpOwotCQlpZiAoIXdwb3J0LT5zd2J1ZikgewotCQkJdmZyZWUoYXBvcnQtPnN3YnVmKTsKLQkJCWFwb3J0LT5zd2J1ZiA9IE5VTEw7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQl3cG9ydC0+c2FtcGxlX3NpemUgID0gcnBvcnQtPnNhbXBsZV9zaXplOwotCQl3cG9ydC0+emVyb193b3JkICAgID0gcnBvcnQtPnplcm9fd29yZDsKLQkJd3BvcnQtPmZyYW1lX3NpemUgICA9IHJwb3J0LT5mcmFtZV9zaXplOwotCQl3cG9ydC0+aHdfZnJhZ3NoaWZ0ID0gcnBvcnQtPmh3X2ZyYWdzaGlmdDsKLQkJd3BvcnQtPmh3X2ZyYWdzaXplICA9IHJwb3J0LT5od19mcmFnc2l6ZTsKLQkJd3BvcnQtPmh3X2ZyYWdjb3VudCA9IHJwb3J0LT5od19mcmFnY291bnQ7Ci0JCXdwb3J0LT5zd2J1Zl9zaXplICAgPSBycG9ydC0+c3didWZfc2l6ZTsKLQkJd3BvcnQtPmh3YnVmX21heCAgICA9IHJwb3J0LT5od2J1Zl9tYXg7Ci0JCXdwb3J0LT5zd2JfdV9pZHggICAgPSBycG9ydC0+c3diX3VfaWR4OwotCQl3cG9ydC0+c3diX2lfaWR4ICAgID0gcnBvcnQtPnN3Yl9pX2lkeDsKLQkJd3BvcnQtPmJ5dGVfY291bnQgICA9IHJwb3J0LT5ieXRlX2NvdW50OwotCX0KLQlpZiAocnBvcnQpIHsKLQkJcnBvcnQtPnN3Yl91X2F2YWlsID0gMDsKLQkJcnBvcnQtPnN3Yl9pX2F2YWlsID0gcnBvcnQtPnN3YnVmX3NpemU7Ci0JCXJwb3J0LT5zd3N0YXRlID0gU1dfUlVOOwotCQlsaV9zZXR1cF9kbWEoJnJwb3J0LT5jaGFuLAotCQkJICAgICAmbGlfY29tbTEsCi0JCQkgICAgICZkZXZjLT5saXRoLAotCQkJICAgICBycG9ydC0+aHdidWZfcGFkZHIsCi0JCQkgICAgIEhXQlVGX1NISUZULAotCQkJICAgICBycG9ydC0+aHdfZnJhZ3NoaWZ0LAotCQkJICAgICBycG9ydC0+c3dfY2hhbm5lbHMsCi0JCQkgICAgIHJwb3J0LT5zYW1wbGVfc2l6ZSk7Ci0JCWFkMTg0M19zZXR1cF9hZGMoJmRldmMtPmxpdGgsCi0JCQkJIHJwb3J0LT5zd19mcmFtZXJhdGUsCi0JCQkJIHJwb3J0LT5zd19zYW1wbGVmbXQsCi0JCQkJIHJwb3J0LT5zd19jaGFubmVscyk7Ci0JCWxpX2VuYWJsZV9pbnRlcnJ1cHRzKCZkZXZjLT5saXRoLCBSRUFEX0lOVFJfTUFTSyk7Ci0JCWlmICghKHJwb3J0LT5mbGFncyAmIERJU0FCTEVEKSkgewotCQkJdXN0bXNjX3QgdXN0bXNjOwotCQkJcnBvcnQtPmh3c3RhdGUgPSBIV19SVU5OSU5HOwotCQkJbGlfYWN0aXZhdGVfZG1hKCZycG9ydC0+Y2hhbik7Ci0JCQlsaV9yZWFkX1VTVE1TQygmcnBvcnQtPmNoYW4sICZ1c3Rtc2MpOwotCQkJcnBvcnQtPk1TQ19vZmZzZXQgPSB1c3Rtc2MubXNjOwotCQl9Ci0JfQotCWlmICh3cG9ydCkgewotCQlpZiAod3BvcnQtPmh3YnVmX21heCA+IHdwb3J0LT5zd2J1Zl9zaXplKQotCQkJd3BvcnQtPmh3YnVmX21heCA9IHdwb3J0LT5zd2J1Zl9zaXplOwotCQl3cG9ydC0+ZmxhZ3MgJj0gfkVSRkxPV047Ci0JCXdwb3J0LT5zd2JfdV9hdmFpbCA9IHdwb3J0LT5zd2J1Zl9zaXplOwotCQl3cG9ydC0+c3diX2lfYXZhaWwgPSAwOwotCQl3cG9ydC0+c3dzdGF0ZSA9IFNXX1JVTjsKLQkJbGlfc2V0dXBfZG1hKCZ3cG9ydC0+Y2hhbiwKLQkJCSAgICAgJmxpX2NvbW0yLAotCQkJICAgICAmZGV2Yy0+bGl0aCwKLQkJCSAgICAgd3BvcnQtPmh3YnVmX3BhZGRyLAotCQkJICAgICBIV0JVRl9TSElGVCwKLQkJCSAgICAgd3BvcnQtPmh3X2ZyYWdzaGlmdCwKLQkJCSAgICAgd3BvcnQtPnN3X2NoYW5uZWxzLAotCQkJICAgICB3cG9ydC0+c2FtcGxlX3NpemUpOwotCQlhZDE4NDNfc2V0dXBfZGFjKCZkZXZjLT5saXRoLAotCQkJCSB3cG9ydC0+c3dfZnJhbWVyYXRlLAotCQkJCSB3cG9ydC0+c3dfc2FtcGxlZm10LAotCQkJCSB3cG9ydC0+c3dfY2hhbm5lbHMpOwotCQlsaV9lbmFibGVfaW50ZXJydXB0cygmZGV2Yy0+bGl0aCwgV1JJVEVfSU5UUl9NQVNLKTsKLQl9Ci0JREJHUlYoKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHBjbV9zaHV0ZG93bl9wb3J0IC0gc2h1dCBkb3duIG9uZSBwb3J0IChkaXJlY3Rpb24pIGZvciBQQ00gSS9PLgotICogT25seSBjYWxsZWQgZnJvbSBwY21fc2h1dGRvd24uCi0gKi8KLQotc3RhdGljIHZvaWQgcGNtX3NodXRkb3duX3BvcnQodndzbmRfZGV2X3QgKmRldmMsCi0JCQkgICAgICB2d3NuZF9wb3J0X3QgKmFwb3J0LAotCQkJICAgICAgdW5zaWduZWQgaW50IG1hc2spCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl2d3NuZF9wb3J0X2h3c3RhdGVfdCBod3N0YXRlOwotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCi0JYXBvcnQtPnN3c3RhdGUgPSBTV19JTklUSUFMOwotCWFkZF93YWl0X3F1ZXVlKCZhcG9ydC0+cXVldWUsICZ3YWl0KTsKLQl3aGlsZSAoMSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhcG9ydC0+bG9jaywgZmxhZ3MpOwotCQl7Ci0JCQlod3N0YXRlID0gYXBvcnQtPmh3c3RhdGU7Ci0JCX0JCQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcG9ydC0+bG9jaywgZmxhZ3MpOwotCQlpZiAoaHdzdGF0ZSA9PSBIV19TVE9QUEVEKQotCQkJYnJlYWs7Ci0JCXNjaGVkdWxlKCk7Ci0JfQotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZhcG9ydC0+cXVldWUsICZ3YWl0KTsKLQlsaV9kaXNhYmxlX2ludGVycnVwdHMoJmRldmMtPmxpdGgsIG1hc2spOwotCWlmIChhcG9ydCA9PSAmZGV2Yy0+cnBvcnQpCi0JCWFkMTg0M19zaHV0ZG93bl9hZGMoJmRldmMtPmxpdGgpOwotCWVsc2UgLyogYXBvcnQgPT0gJmRldmMtPndwb3J0KSAqLwotCQlhZDE4NDNfc2h1dGRvd25fZGFjKCZkZXZjLT5saXRoKTsKLQlsaV9zaHV0ZG93bl9kbWEoJmFwb3J0LT5jaGFuKTsKLQl2ZnJlZShhcG9ydC0+c3didWYpOwotCWFwb3J0LT5zd2J1ZiA9IE5VTEw7Ci0JYXBvcnQtPmJ5dGVfY291bnQgPSAwOwotfQotCi0vKgotICogcGNtX3NodXRkb3duIHVuZG9lcyB3aGF0IHBjbV9zZXR1cCBkaWQuCi0gKiBBbHNvIHNldHMgdGhlIHBvcnRzJyBzd3N0YXRlIHRvIG5ld3N0YXRlLgotICovCi0KLXN0YXRpYyB2b2lkIHBjbV9zaHV0ZG93bih2d3NuZF9kZXZfdCAqZGV2YywKLQkJCSB2d3NuZF9wb3J0X3QgKnJwb3J0LAotCQkJIHZ3c25kX3BvcnRfdCAqd3BvcnQpCi17Ci0JREJHRVYoIihkZXZjPTB4JXAsIHJwb3J0PTB4JXAsIHdwb3J0PTB4JXApXG4iLCBkZXZjLCBycG9ydCwgd3BvcnQpOwotCi0JaWYgKHJwb3J0ICYmIHJwb3J0LT5zd2J1ZikgewotCQlEQkdQVigic2h1dHRpbmcgZG93biBycG9ydFxuIik7Ci0JCXBjbV9zaHV0ZG93bl9wb3J0KGRldmMsIHJwb3J0LCBSRUFEX0lOVFJfTUFTSyk7Ci0JfQotCWlmICh3cG9ydCAmJiB3cG9ydC0+c3didWYpIHsKLQkJREJHUFYoInNodXR0aW5nIGRvd24gd3BvcnRcbiIpOwotCQlwY21fc2h1dGRvd25fcG9ydChkZXZjLCB3cG9ydCwgV1JJVEVfSU5UUl9NQVNLKTsKLQl9Ci0JREJHUlYoKTsKLX0KLQotc3RhdGljIHZvaWQgcGNtX2NvcHlfaW4odndzbmRfcG9ydF90ICpycG9ydCwgaW50IHN3aWR4LCBpbnQgaHdpZHgsIGludCBuYikKLXsKLQljaGFyICpzcmMgPSBycG9ydC0+aHdidWYgKyBod2lkeDsKLQljaGFyICpkc3QgPSBycG9ydC0+c3didWYgKyBzd2lkeDsKLQlpbnQgZm10ID0gcnBvcnQtPnN3X3NhbXBsZWZtdDsKLQotCURCR1BWKCJzd2lkeCA9ICVkLCBod2lkeCA9ICVkXG4iLCBzd2lkeCwgaHdpZHgpOwotCUFTU0VSVChycG9ydC0+aHdidWYgIT0gTlVMTCk7Ci0JQVNTRVJUKHJwb3J0LT5zd2J1ZiAhPSBOVUxMKTsKLQlBU1NFUlQobmIgPiAwICYmIChuYiAlIDMyKSA9PSAwKTsKLQlBU1NFUlQoc3dpZHggJSAzMiA9PSAwICYmIGh3aWR4ICUgMzIgPT0gMCk7Ci0JQVNTRVJUKHN3aWR4ID49IDAgJiYgc3dpZHggKyBuYiA8PSBycG9ydC0+c3didWZfc2l6ZSk7Ci0JQVNTRVJUKGh3aWR4ID49IDAgJiYgaHdpZHggKyBuYiA8PSBycG9ydC0+aHdidWZfc2l6ZSk7Ci0KLQlpZiAoZm10ID09IEFGTVRfTVVfTEFXIHx8IGZtdCA9PSBBRk1UX0FfTEFXIHx8IGZtdCA9PSBBRk1UX1M4KSB7Ci0KLQkJLyogU2VlIFNhbXBsZSBGb3JtYXQgTm90ZXMgYWJvdmUuICovCi0KLQkJY2hhciAqZW5kID0gc3JjICsgbmI7Ci0JCXdoaWxlIChzcmMgPCBlbmQpCi0JCQkqZHN0KysgPSAqc3JjKysgXiAweDgwOwotCX0gZWxzZQotCQltZW1jcHkoZHN0LCBzcmMsIG5iKTsKLX0KLQotc3RhdGljIHZvaWQgcGNtX2NvcHlfb3V0KHZ3c25kX3BvcnRfdCAqd3BvcnQsIGludCBzd2lkeCwgaW50IGh3aWR4LCBpbnQgbmIpCi17Ci0JY2hhciAqc3JjID0gd3BvcnQtPnN3YnVmICsgc3dpZHg7Ci0JY2hhciAqZHN0ID0gd3BvcnQtPmh3YnVmICsgaHdpZHg7Ci0JaW50IGZtdCA9IHdwb3J0LT5zd19zYW1wbGVmbXQ7Ci0KLQlBU1NFUlQobmIgPiAwICYmIChuYiAlIDMyKSA9PSAwKTsKLQlBU1NFUlQod3BvcnQtPmh3YnVmICE9IE5VTEwpOwotCUFTU0VSVCh3cG9ydC0+c3didWYgIT0gTlVMTCk7Ci0JQVNTRVJUKHN3aWR4ICUgMzIgPT0gMCAmJiBod2lkeCAlIDMyID09IDApOwotCUFTU0VSVChzd2lkeCA+PSAwICYmIHN3aWR4ICsgbmIgPD0gd3BvcnQtPnN3YnVmX3NpemUpOwotCUFTU0VSVChod2lkeCA+PSAwICYmIGh3aWR4ICsgbmIgPD0gd3BvcnQtPmh3YnVmX3NpemUpOwotCWlmIChmbXQgPT0gQUZNVF9NVV9MQVcgfHwgZm10ID09IEFGTVRfQV9MQVcgfHwgZm10ID09IEFGTVRfUzgpIHsKLQotCQkvKiBTZWUgU2FtcGxlIEZvcm1hdCBOb3RlcyBhYm92ZS4gKi8KLQotCQljaGFyICplbmQgPSBzcmMgKyBuYjsKLQkJd2hpbGUgKHNyYyA8IGVuZCkKLQkJCSpkc3QrKyA9ICpzcmMrKyBeIDB4ODA7Ci0JfSBlbHNlCi0JCW1lbWNweShkc3QsIHNyYywgbmIpOwotfQotCi0vKgotICogcGNtX291dHB1dCgpIGlzIGNhbGxlZCBib3RoIGZyb20gYmFzZWxldmVsIGFuZCBmcm9tIGludGVycnVwdCBsZXZlbC4KLSAqIFRoaXMgaXMgd2hlcmUgYXVkaW8gZnJhbWVzIGFyZSBjb3BpZWQgaW50byB0aGUgaGFyZHdhcmUtYWNjZXNzaWJsZQotICogcmluZyBidWZmZXIuCi0gKgotICogTG9ja2luZyBub3RlOiBUaGUgcGFydCBvZiB0aGlzIHJvdXRpbmUgdGhhdCBmaWd1cmVzIG91dCB3aGF0IHRvIGRvCi0gKiBob2xkcyB3cG9ydC0+bG9jay4gIFRoZSBsb25nZXIgcGFydCByZWxlYXNlcyB3cG9ydC0+bG9jaywgYnV0IHNldHMKLSAqIHdwb3J0LT5mbGFncyAmIEhXX0JVU1kuICBBZnRlcndhcmQsIGl0IHJlYWNxdWlyZXMgd3BvcnQtPmxvY2ssIGFuZAotICogY2hlY2tzIGZvciBtb3JlIHdvcmsgdG8gZG8uCi0gKgotICogSWYgYW5vdGhlciB0aHJlYWQgY2FsbHMgcGNtX291dHB1dCgpIHdoaWxlIEhXX0JVU1kgaXMgc2V0LCBpdAotICogcmV0dXJucyBpbW1lZGlhdGVseSwga25vd2luZyB0aGF0IHRoZSB0aHJlYWQgdGhhdCBzZXQgSFdfQlVTWSB3aWxsCi0gKiBsb29rIGZvciBtb3JlIHdvcmsgdG8gZG8gYmVmb3JlIHJldHVybmluZy4KLSAqCi0gKiBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgcG9ydC0+bG9jayBpcyBoZWxkIGZvciBzZXZlcmFsIHNob3J0Ci0gKiBwZXJpb2RzIGluc3RlYWQgb2Ygb25lIGxvbmcgcGVyaW9kLiAgQWxzbywgd2hlbiBwY21fb3V0cHV0IGlzCi0gKiBjYWxsZWQgZnJvbSBiYXNlIGxldmVsLCBpdCByZWVuYWJsZXMgaW50ZXJydXB0cy4KLSAqLwotCi1zdGF0aWMgdm9pZCBwY21fb3V0cHV0KHZ3c25kX2Rldl90ICpkZXZjLCBpbnQgZXJmbG93biwgaW50IG5iKQotewotCXZ3c25kX3BvcnRfdCAqd3BvcnQgPSAmZGV2Yy0+d3BvcnQ7Ci0JY29uc3QgaW50IGh3bWF4ICA9IHdwb3J0LT5od2J1Zl9tYXg7Ci0JY29uc3QgaW50IGh3c2l6ZSA9IHdwb3J0LT5od2J1Zl9zaXplOwotCWNvbnN0IGludCBzd3NpemUgPSB3cG9ydC0+c3didWZfc2l6ZTsKLQljb25zdCBpbnQgZnJhZ3NpemUgPSB3cG9ydC0+aHdfZnJhZ3NpemU7Ci0JdW5zaWduZWQgbG9uZyBpZmxhZ3M7Ci0KLQlEQkdFVigiKGRldmM9MHglcCwgZXJmbG93bj0lZCwgbmI9JWQpXG4iLCBkZXZjLCBlcmZsb3duLCBuYik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJndwb3J0LT5sb2NrLCBpZmxhZ3MpOwotCWlmIChlcmZsb3duKQotCQl3cG9ydC0+ZmxhZ3MgfD0gRVJGTE9XTjsKLQkodm9pZCkgX19zd2JfaW5jX3Uod3BvcnQsIG5iKTsKLQlpZiAod3BvcnQtPmZsYWdzICYgSFdfQlVTWSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgaWZsYWdzKTsKLQkJREJHUFYoInJldHVybmluZzogSFcgQlVTWVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHdwb3J0LT5mbGFncyAmIERJU0FCTEVEKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndwb3J0LT5sb2NrLCBpZmxhZ3MpOwotCQlEQkdQVigicmV0dXJuaW5nOiBESVNBQkxFRFxuIik7Ci0JCXJldHVybjsKLQl9Ci0Jd3BvcnQtPmZsYWdzIHw9IEhXX0JVU1k7Ci0Jd2hpbGUgKDEpIHsKLQkJaW50IHN3cHRyLCBod3B0ciwgaHdfYXZhaWwsIHN3X2F2YWlsLCBzd2lkeDsKLQkJdndzbmRfcG9ydF9od3N0YXRlX3QgaHdzdGF0ZSA9IHdwb3J0LT5od3N0YXRlOwotCQl2d3NuZF9wb3J0X3N3c3RhdGVfdCBzd3N0YXRlID0gd3BvcnQtPnN3c3RhdGU7Ci0JCWludCBod191bmF2YWlsOwotCQl1c3Rtc2NfdCB1c3Rtc2M7Ci0KLQkJaHdwdHIgPSBsaV9yZWFkX2h3cHRyKCZ3cG9ydC0+Y2hhbik7Ci0JCXN3cHRyID0gbGlfcmVhZF9zd3B0cigmd3BvcnQtPmNoYW4pOwotCQlod191bmF2YWlsID0gKHN3cHRyIC0gaHdwdHIgKyBod3NpemUpICUgaHdzaXplOwotCQlod19hdmFpbCA9IChod21heCAtIGh3X3VuYXZhaWwpICYgLWZyYWdzaXplOwotCQlzd19hdmFpbCA9IHdwb3J0LT5zd2JfaV9hdmFpbCAmIC1mcmFnc2l6ZTsKLQkJaWYgKHN3X2F2YWlsICYmIHN3c3RhdGUgPT0gU1dfUlVOKSB7Ci0JCQlpZiAod3BvcnQtPmZsYWdzICYgRVJGTE9XTikgewotCQkJCXdwb3J0LT5mbGFncyAmPSB+RVJGTE9XTjsKLQkJCX0KLQkJfSBlbHNlIGlmIChzd3N0YXRlID09IFNXX0lOSVRJQUwgfHwKLQkJCSBzd3N0YXRlID09IFNXX09GRiB8fAotCQkJIChzd3N0YXRlID09IFNXX0RSQUlOICYmCi0JCQkgICFzd19hdmFpbCAmJgotCQkJICAod3BvcnQtPmZsYWdzICYgRVJGTE9XTikpKSB7Ci0JCQlEQkdQKCJzdG9wcGluZy4gIGh3c3RhdGUgPSAlZFxuIiwgaHdzdGF0ZSk7Ci0JCQlpZiAoaHdzdGF0ZSAhPSBIV19TVE9QUEVEKSB7Ci0JCQkJbGlfZGVhY3RpdmF0ZV9kbWEoJndwb3J0LT5jaGFuKTsKLQkJCQl3cG9ydC0+aHdzdGF0ZSA9IEhXX1NUT1BQRUQ7Ci0JCQl9Ci0JCQl3YWtlX3VwKCZ3cG9ydC0+cXVldWUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCFzd19hdmFpbCB8fCAhaHdfYXZhaWwpCi0JCQlicmVhazsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3BvcnQtPmxvY2ssIGlmbGFncyk7Ci0KLQkJLyoKLQkJICogV2UgZ2F2ZSB1cCB0aGUgcG9ydCBsb2NrLCBidXQgd2UgaGF2ZSB0aGUgSFdfQlVTWSBmbGFnLgotCQkgKiBQcm9jZWVkIHdpdGhvdXQgYWNjZXNzaW5nIGFueSBub25sb2NhbCBzdGF0ZS4KLQkJICogRG8gbm90IGV4aXQgdGhlIGxvb3AgLS0gbXVzdCBjaGVjayBmb3IgbW9yZSB3b3JrLgotCQkgKi8KLQotCQlzd2lkeCA9IHdwb3J0LT5zd2JfaV9pZHg7Ci0JCW5iID0gaHdfYXZhaWw7Ci0JCWlmIChuYiA+IHN3X2F2YWlsKQotCQkJbmIgPSBzd19hdmFpbDsKLQkJaWYgKG5iID4gaHdzaXplIC0gc3dwdHIpCi0JCQluYiA9IGh3c2l6ZSAtIHN3cHRyOyAvKiBkb24ndCBvdmVyZmxvdyBod2J1ZiAqLwotCQlpZiAobmIgPiBzd3NpemUgLSBzd2lkeCkKLQkJCW5iID0gc3dzaXplIC0gc3dpZHg7IC8qIGRvbid0IG92ZXJmbG93IHN3YnVmICovCi0JCUFTU0VSVChuYiA+IDApOwotCQlpZiAobmIgJSBmcmFnc2l6ZSkgewotCQkJREJHUCgibmIgPSAlZCwgZnJhZ3NpemUgPSAlZFxuIiwgbmIsIGZyYWdzaXplKTsKLQkJCURCR1AoImh3X2F2YWlsID0gJWRcbiIsIGh3X2F2YWlsKTsKLQkJCURCR1AoInN3X2F2YWlsID0gJWRcbiIsIHN3X2F2YWlsKTsKLQkJCURCR1AoImh3c2l6ZSA9ICVkLCBzd3B0ciA9ICVkXG4iLCBod3NpemUsIHN3cHRyKTsKLQkJCURCR1AoInN3c2l6ZSA9ICVkLCBzd2lkeCA9ICVkXG4iLCBzd3NpemUsIHN3aWR4KTsKLQkJfQotCQlBU1NFUlQoIShuYiAlIGZyYWdzaXplKSk7Ci0JCURCR1BWKCJjb3B5aW5nIHN3YlslZC4uJWRdIHRvIGh3YlslZC4uJWRdXG4iLAotCQkgICAgICBzd2lkeCwgc3dpZHggKyBuYiwgc3dwdHIsIHN3cHRyICsgbmIpOwotCQlwY21fY29weV9vdXQod3BvcnQsIHN3aWR4LCBzd3B0ciwgbmIpOwotCQlsaV93cml0ZV9zd3B0cigmd3BvcnQtPmNoYW4sIChzd3B0ciArIG5iKSAlIGh3c2l6ZSk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3cG9ydC0+bG9jaywgaWZsYWdzKTsKLQkJaWYgKGh3c3RhdGUgPT0gSFdfU1RPUFBFRCkgewotCQkJREJHUFYoInN0YXJ0aW5nXG4iKTsKLQkJCWxpX2FjdGl2YXRlX2RtYSgmd3BvcnQtPmNoYW4pOwotCQkJd3BvcnQtPmh3c3RhdGUgPSBIV19SVU5OSU5HOwotCQkJbGlfcmVhZF9VU1RNU0MoJndwb3J0LT5jaGFuLCAmdXN0bXNjKTsKLQkJCUFTU0VSVCh3cG9ydC0+Ynl0ZV9jb3VudCAlIHdwb3J0LT5mcmFtZV9zaXplID09IDApOwotCQkJd3BvcnQtPk1TQ19vZmZzZXQgPSB1c3Rtc2MubXNjIC0gd3BvcnQtPmJ5dGVfY291bnQgLyB3cG9ydC0+ZnJhbWVfc2l6ZTsKLQkJfQotCQlfX3N3Yl9pbmNfaSh3cG9ydCwgbmIpOwotCQl3cG9ydC0+Ynl0ZV9jb3VudCArPSBuYjsKLQkJd3BvcnQtPmZyYWdfY291bnQgKz0gbmIgLyBmcmFnc2l6ZTsKLQkJQVNTRVJUKG5iICUgZnJhZ3NpemUgPT0gMCk7Ci0JCXdha2VfdXAoJndwb3J0LT5xdWV1ZSk7Ci0JfQotCXdwb3J0LT5mbGFncyAmPSB+SFdfQlVTWTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgaWZsYWdzKTsKLQlEQkdSVigpOwotfQotCi0vKgotICogcGNtX2lucHV0KCkgaXMgY2FsbGVkIGJvdGggZnJvbSBiYXNlbGV2ZWwgYW5kIGZyb20gaW50ZXJydXB0IGxldmVsLgotICogVGhpcyBpcyB3aGVyZSBhdWRpbyBmcmFtZXMgYXJlIGNvcGllZCBvdXQgb2YgdGhlIGhhcmR3YXJlLWFjY2Vzc2libGUKLSAqIHJpbmcgYnVmZmVyLgotICoKLSAqIExvY2tpbmcgbm90ZTogVGhlIHBhcnQgb2YgdGhpcyByb3V0aW5lIHRoYXQgZmlndXJlcyBvdXQgd2hhdCB0byBkbwotICogaG9sZHMgcnBvcnQtPmxvY2suICBUaGUgbG9uZ2VyIHBhcnQgcmVsZWFzZXMgcnBvcnQtPmxvY2ssIGJ1dCBzZXRzCi0gKiBycG9ydC0+ZmxhZ3MgJiBIV19CVVNZLiAgQWZ0ZXJ3YXJkLCBpdCByZWFjcXVpcmVzIHJwb3J0LT5sb2NrLCBhbmQKLSAqIGNoZWNrcyBmb3IgbW9yZSB3b3JrIHRvIGRvLgotICoKLSAqIElmIGFub3RoZXIgdGhyZWFkIGNhbGxzIHBjbV9pbnB1dCgpIHdoaWxlIEhXX0JVU1kgaXMgc2V0LCBpdAotICogcmV0dXJucyBpbW1lZGlhdGVseSwga25vd2luZyB0aGF0IHRoZSB0aHJlYWQgdGhhdCBzZXQgSFdfQlVTWSB3aWxsCi0gKiBsb29rIGZvciBtb3JlIHdvcmsgdG8gZG8gYmVmb3JlIHJldHVybmluZy4KLSAqCi0gKiBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgcG9ydC0+bG9jayBpcyBoZWxkIGZvciBzZXZlcmFsIHNob3J0Ci0gKiBwZXJpb2RzIGluc3RlYWQgb2Ygb25lIGxvbmcgcGVyaW9kLiAgQWxzbywgd2hlbiBwY21faW5wdXQgaXMKLSAqIGNhbGxlZCBmcm9tIGJhc2UgbGV2ZWwsIGl0IHJlZW5hYmxlcyBpbnRlcnJ1cHRzLgotICovCi0KLXN0YXRpYyB2b2lkIHBjbV9pbnB1dCh2d3NuZF9kZXZfdCAqZGV2YywgaW50IGVyZmxvd24sIGludCBuYikKLXsKLQl2d3NuZF9wb3J0X3QgKnJwb3J0ID0gJmRldmMtPnJwb3J0OwotCWNvbnN0IGludCBod21heCAgPSBycG9ydC0+aHdidWZfbWF4OwotCWNvbnN0IGludCBod3NpemUgPSBycG9ydC0+aHdidWZfc2l6ZTsKLQljb25zdCBpbnQgc3dzaXplID0gcnBvcnQtPnN3YnVmX3NpemU7Ci0JY29uc3QgaW50IGZyYWdzaXplID0gcnBvcnQtPmh3X2ZyYWdzaXplOwotCXVuc2lnbmVkIGxvbmcgaWZsYWdzOwotCi0JREJHRVYoIihkZXZjPTB4JXAsIGVyZmxvd249JWQsIG5iPSVkKVxuIiwgZGV2YywgZXJmbG93biwgbmIpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJwb3J0LT5sb2NrLCBpZmxhZ3MpOwotCWlmIChlcmZsb3duKQotCQlycG9ydC0+ZmxhZ3MgfD0gRVJGTE9XTjsKLQkodm9pZCkgX19zd2JfaW5jX3UocnBvcnQsIG5iKTsKLQlpZiAocnBvcnQtPmZsYWdzICYgSFdfQlVTWSB8fCAhcnBvcnQtPnN3YnVmKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwb3J0LT5sb2NrLCBpZmxhZ3MpOwotCQlEQkdQVigicmV0dXJuaW5nOiBIVyBCVVNZIG9yICFzd2J1ZlxuIik7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHJwb3J0LT5mbGFncyAmIERJU0FCTEVEKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwb3J0LT5sb2NrLCBpZmxhZ3MpOwotCQlEQkdQVigicmV0dXJuaW5nOiBESVNBQkxFRFxuIik7Ci0JCXJldHVybjsKLQl9Ci0JcnBvcnQtPmZsYWdzIHw9IEhXX0JVU1k7Ci0Jd2hpbGUgKDEpIHsKLQkJaW50IHN3cHRyLCBod3B0ciwgaHdfYXZhaWwsIHN3X2F2YWlsLCBzd2lkeDsKLQkJdndzbmRfcG9ydF9od3N0YXRlX3QgaHdzdGF0ZSA9IHJwb3J0LT5od3N0YXRlOwotCQl2d3NuZF9wb3J0X3N3c3RhdGVfdCBzd3N0YXRlID0gcnBvcnQtPnN3c3RhdGU7Ci0KLQkJaHdwdHIgPSBsaV9yZWFkX2h3cHRyKCZycG9ydC0+Y2hhbik7Ci0JCXN3cHRyID0gbGlfcmVhZF9zd3B0cigmcnBvcnQtPmNoYW4pOwotCQlod19hdmFpbCA9IChod3B0ciAtIHN3cHRyICsgaHdzaXplKSAlIGh3c2l6ZSAmIC1mcmFnc2l6ZTsKLQkJaWYgKGh3X2F2YWlsID4gaHdtYXgpCi0JCQlod19hdmFpbCA9IGh3bWF4OwotCQlzd19hdmFpbCA9IHJwb3J0LT5zd2JfaV9hdmFpbCAmIC1mcmFnc2l6ZTsKLQkJaWYgKHN3c3RhdGUgIT0gU1dfUlVOKSB7Ci0JCQlEQkdQKCJzdG9wcGluZy4gIGh3c3RhdGUgPSAlZFxuIiwgaHdzdGF0ZSk7Ci0JCQlpZiAoaHdzdGF0ZSAhPSBIV19TVE9QUEVEKSB7Ci0JCQkJbGlfZGVhY3RpdmF0ZV9kbWEoJnJwb3J0LT5jaGFuKTsKLQkJCQlycG9ydC0+aHdzdGF0ZSA9IEhXX1NUT1BQRUQ7Ci0JCQl9Ci0JCQl3YWtlX3VwKCZycG9ydC0+cXVldWUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCFzd19hdmFpbCB8fCAhaHdfYXZhaWwpCi0JCQlicmVhazsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnBvcnQtPmxvY2ssIGlmbGFncyk7Ci0KLQkJLyoKLQkJICogV2UgZ2F2ZSB1cCB0aGUgcG9ydCBsb2NrLCBidXQgd2UgaGF2ZSB0aGUgSFdfQlVTWSBmbGFnLgotCQkgKiBQcm9jZWVkIHdpdGhvdXQgYWNjZXNzaW5nIGFueSBub25sb2NhbCBzdGF0ZS4KLQkJICogRG8gbm90IGV4aXQgdGhlIGxvb3AgLS0gbXVzdCBjaGVjayBmb3IgbW9yZSB3b3JrLgotCQkgKi8KLQotCQlzd2lkeCA9IHJwb3J0LT5zd2JfaV9pZHg7Ci0JCW5iID0gaHdfYXZhaWw7Ci0JCWlmIChuYiA+IHN3X2F2YWlsKQotCQkJbmIgPSBzd19hdmFpbDsKLQkJaWYgKG5iID4gaHdzaXplIC0gc3dwdHIpCi0JCQluYiA9IGh3c2l6ZSAtIHN3cHRyOyAvKiBkb24ndCBvdmVyZmxvdyBod2J1ZiAqLwotCQlpZiAobmIgPiBzd3NpemUgLSBzd2lkeCkKLQkJCW5iID0gc3dzaXplIC0gc3dpZHg7IC8qIGRvbid0IG92ZXJmbG93IHN3YnVmICovCi0JCUFTU0VSVChuYiA+IDApOwotCQlpZiAobmIgJSBmcmFnc2l6ZSkgewotCQkJREJHUCgibmIgPSAlZCwgZnJhZ3NpemUgPSAlZFxuIiwgbmIsIGZyYWdzaXplKTsKLQkJCURCR1AoImh3X2F2YWlsID0gJWRcbiIsIGh3X2F2YWlsKTsKLQkJCURCR1AoInN3X2F2YWlsID0gJWRcbiIsIHN3X2F2YWlsKTsKLQkJCURCR1AoImh3c2l6ZSA9ICVkLCBzd3B0ciA9ICVkXG4iLCBod3NpemUsIHN3cHRyKTsKLQkJCURCR1AoInN3c2l6ZSA9ICVkLCBzd2lkeCA9ICVkXG4iLCBzd3NpemUsIHN3aWR4KTsKLQkJfQotCQlBU1NFUlQoIShuYiAlIGZyYWdzaXplKSk7Ci0JCURCR1BWKCJjb3B5aW5nIGh3YlslZC4uJWRdIHRvIHN3YlslZC4uJWRdXG4iLAotCQkgICAgICBzd3B0ciwgc3dwdHIgKyBuYiwgc3dpZHgsIHN3aWR4ICsgbmIpOwotCQlwY21fY29weV9pbihycG9ydCwgc3dpZHgsIHN3cHRyLCBuYik7Ci0JCWxpX3dyaXRlX3N3cHRyKCZycG9ydC0+Y2hhbiwgKHN3cHRyICsgbmIpICUgaHdzaXplKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJwb3J0LT5sb2NrLCBpZmxhZ3MpOwotCQlfX3N3Yl9pbmNfaShycG9ydCwgbmIpOwotCQlycG9ydC0+Ynl0ZV9jb3VudCArPSBuYjsKLQkJcnBvcnQtPmZyYWdfY291bnQgKz0gbmIgLyBmcmFnc2l6ZTsKLQkJQVNTRVJUKG5iICUgZnJhZ3NpemUgPT0gMCk7Ci0JCXdha2VfdXAoJnJwb3J0LT5xdWV1ZSk7Ci0JfQotCXJwb3J0LT5mbGFncyAmPSB+SFdfQlVTWTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycG9ydC0+bG9jaywgaWZsYWdzKTsKLQlEQkdSVigpOwotfQotCi0vKgotICogcGNtX2ZsdXNoX2ZyYWcoKSB3cml0ZXMgemVybyBzYW1wbGVzIHRvIGZpbGwgdGhlIGN1cnJlbnQgZnJhZ21lbnQsCi0gKiB0aGVuIGZsdXNoZXMgaXQgdG8gdGhlIGhhcmR3YXJlLgotICoKLSAqIEl0IGlzIG9ubHkgbWVhbmluZ2Z1bCB0byBmbHVzaCBvdXRwdXQsIG5vdCBpbnB1dC4KLSAqLwotCi1zdGF0aWMgdm9pZCBwY21fZmx1c2hfZnJhZyh2d3NuZF9kZXZfdCAqZGV2YykKLXsKLQl2d3NuZF9wb3J0X3QgKndwb3J0ID0gJmRldmMtPndwb3J0OwotCi0JREJHUFYoInN3c3RhdGUgPSAlZFxuIiwgd3BvcnQtPnN3c3RhdGUpOwotCWlmICh3cG9ydC0+c3dzdGF0ZSA9PSBTV19SVU4pIHsKLQkJaW50IGlkeCA9IHdwb3J0LT5zd2JfdV9pZHg7Ci0JCWludCBlbmQgPSAoaWR4ICsgd3BvcnQtPmh3X2ZyYWdzaXplIC0gMSkKLQkJCT4+IHdwb3J0LT5od19mcmFnc2hpZnQKLQkJCTw8IHdwb3J0LT5od19mcmFnc2hpZnQ7Ci0JCWludCBuYiA9IGVuZCAtIGlkeDsKLQkJREJHUFYoImNsZWFyaW5nICVkIGJ5dGVzXG4iLCBuYik7Ci0JCWlmIChuYikKLQkJCW1lbXNldCh3cG9ydC0+c3didWYgKyBpZHgsCi0JCQkgICAgICAgKGNoYXIpIHdwb3J0LT56ZXJvX3dvcmQsCi0JCQkgICAgICAgbmIpOwotCQl3cG9ydC0+c3dzdGF0ZSA9IFNXX0RSQUlOOwotCQlwY21fb3V0cHV0KGRldmMsIDAsIG5iKTsKLQl9Ci0JREJHUlYoKTsKLX0KLQotLyoKLSAqIFdhaXQgZm9yIG91dHB1dCB0byBkcmFpbi4gIFRoaXMgc2xlZXBzIHVuaW50ZXJydXB0aWJseSBiZWNhdXNlCi0gKiB0aGVyZSBpcyBub3RoaW5nIGludGVsbGlnZW50IHdlIGNhbiBkbyBpZiBpbnRlcnJ1cHRlZC4gIFRoaXMKLSAqIG1lYW5zIHRoZSBwcm9jZXNzIHdpbGwgYmUgZGVsYXllZCBpbiByZXNwb25kaW5nIHRvIHRoZSBzaWduYWwuCi0gKi8KLQotc3RhdGljIHZvaWQgcGNtX3dyaXRlX3N5bmModndzbmRfZGV2X3QgKmRldmMpCi17Ci0JdndzbmRfcG9ydF90ICp3cG9ydCA9ICZkZXZjLT53cG9ydDsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXZ3c25kX3BvcnRfaHdzdGF0ZV90IGh3c3RhdGU7Ci0KLQlEQkdFVigiKGRldmM9MHglcClcbiIsIGRldmMpOwotCWFkZF93YWl0X3F1ZXVlKCZ3cG9ydC0+cXVldWUsICZ3YWl0KTsKLQl3aGlsZSAoMSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOwotCQl7Ci0JCQlod3N0YXRlID0gd3BvcnQtPmh3c3RhdGU7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGh3c3RhdGUgPT0gSFdfU1RPUFBFRCkKLQkJCWJyZWFrOwotCQlzY2hlZHVsZSgpOwotCX0KLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmd3BvcnQtPnF1ZXVlLCAmd2FpdCk7Ci0JREJHUFYoInN3c3RhdGUgPSAlZCwgaHdzdGF0ZSA9ICVkXG4iLCB3cG9ydC0+c3dzdGF0ZSwgd3BvcnQtPmh3c3RhdGUpOwotCURCR1JWKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGF1ZGlvIGRyaXZlciAqLwotCi0vKgotICogc2VlayBvbiBhbiBhdWRpbyBkZXZpY2UgYWx3YXlzIGZhaWxzLgotICovCi0KLXN0YXRpYyB2b2lkIHZ3c25kX2F1ZGlvX3JlYWRfaW50cih2d3NuZF9kZXZfdCAqZGV2YywgdW5zaWduZWQgaW50IHN0YXR1cykKLXsKLQlpbnQgb3ZlcmZsb3duID0gc3RhdHVzICYgTElfSU5UUl9DT01NMV9PVkVSRkxPVzsKLQotCWlmIChzdGF0dXMgJiBSRUFEX0lOVFJfTUFTSykKLQkJcGNtX2lucHV0KGRldmMsIG92ZXJmbG93biwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZ3c25kX2F1ZGlvX3dyaXRlX2ludHIodndzbmRfZGV2X3QgKmRldmMsIHVuc2lnbmVkIGludCBzdGF0dXMpCi17Ci0JaW50IHVuZGVyZmxvd24gPSBzdGF0dXMgJiBMSV9JTlRSX0NPTU0yX1VOREVSRkxPVzsKLQotCWlmIChzdGF0dXMgJiBXUklURV9JTlRSX01BU0spCi0JCXBjbV9vdXRwdXQoZGV2YywgdW5kZXJmbG93biwgMCk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB2d3NuZF9hdWRpb19pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQl2d3NuZF9kZXZfdCAqZGV2YyA9IGRldl9pZDsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzOwotCi0JREJHRVYoIihpcnE9JWQsIGRldl9pZD0weCVwKVxuIiwgaXJxLCBkZXZfaWQpOwotCi0Jc3RhdHVzID0gbGlfZ2V0X2NsZWFyX2ludHJfc3RhdHVzKCZkZXZjLT5saXRoKTsKLQl2d3NuZF9hdWRpb19yZWFkX2ludHIoZGV2Yywgc3RhdHVzKTsKLQl2d3NuZF9hdWRpb193cml0ZV9pbnRyKGRldmMsIHN0YXR1cyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgc3NpemVfdCB2d3NuZF9hdWRpb19kb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgIGNoYXIgKmJ1ZmZlciwKLQkJCQkgICBzaXplX3QgY291bnQsCi0JCQkJICAgbG9mZl90ICpwcG9zKQotewotCXZ3c25kX2Rldl90ICpkZXZjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXZ3c25kX3BvcnRfdCAqcnBvcnQgPSAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8KLQkJCSAgICAgICAmZGV2Yy0+cnBvcnQgOiBOVUxMKTsKLQlpbnQgcmV0LCBuYjsKLQotCURCR0VWKCIoZmlsZT0weCVwLCBidWZmZXI9MHglcCwgY291bnQ9JWQsIHBwb3M9MHglcClcbiIsCi0JICAgICBmaWxlLCBidWZmZXIsIGNvdW50LCBwcG9zKTsKLQotCWlmICghcnBvcnQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHJwb3J0LT5zd2J1ZiA9PSBOVUxMKSB7Ci0JCXZ3c25kX3BvcnRfdCAqd3BvcnQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpID8KLQkJCSZkZXZjLT53cG9ydCA6IE5VTEw7Ci0JCXJldCA9IHBjbV9zZXR1cChkZXZjLCBycG9ydCwgd3BvcnQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXQgPSAwOwotCXdoaWxlIChjb3VudCkgewotCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQkJYWRkX3dhaXRfcXVldWUoJnJwb3J0LT5xdWV1ZSwgJndhaXQpOwotCQl3aGlsZSAoKG5iID0gc3diX2luY191KHJwb3J0LCAwKSkgPT0gMCkgewotCQkJREJHUFYoImJsb2NraW5nXG4iKTsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQlpZiAocnBvcnQtPmZsYWdzICYgRElTQUJMRUQgfHwKLQkJCSAgICBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZycG9ydC0+cXVldWUsICZ3YWl0KTsKLQkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVBR0FJTjsKLQkJCX0KLQkJCXNjaGVkdWxlKCk7Ci0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcnBvcnQtPnF1ZXVlLCAmd2FpdCk7Ci0JCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUzsKLQkJCX0KLQkJfQotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJcmVtb3ZlX3dhaXRfcXVldWUoJnJwb3J0LT5xdWV1ZSwgJndhaXQpOwotCQlwY21faW5wdXQoZGV2YywgMCwgMCk7Ci0JCS8qIG5iIGJ5dGVzIGFyZSBhdmFpbGFibGUgaW4gdXNlcmJ1Zi4gKi8KLQkJaWYgKG5iID4gY291bnQpCi0JCQluYiA9IGNvdW50OwotCQlEQkdQVigibmIgPSAlZFxuIiwgbmIpOwotCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgcnBvcnQtPnN3YnVmICsgcnBvcnQtPnN3Yl91X2lkeCwgbmIpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCSh2b2lkKSBzd2JfaW5jX3UocnBvcnQsIG5iKTsKLQkJYnVmZmVyICs9IG5iOwotCQljb3VudCAtPSBuYjsKLQkJcmV0ICs9IG5iOwotCX0KLQlEQkdQVigicmV0dXJuaW5nICVkXG4iLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHZ3c25kX2F1ZGlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJY2hhciAqYnVmZmVyLAotCQkJCXNpemVfdCBjb3VudCwKLQkJCQlsb2ZmX3QgKnBwb3MpCi17Ci0JdndzbmRfZGV2X3QgKmRldmMgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3NpemVfdCByZXQ7Ci0KLQltdXRleF9sb2NrKCZkZXZjLT5pb19tdXRleCk7Ci0JcmV0ID0gdndzbmRfYXVkaW9fZG9fcmVhZChmaWxlLCBidWZmZXIsIGNvdW50LCBwcG9zKTsKLQltdXRleF91bmxvY2soJmRldmMtPmlvX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCB2d3NuZF9hdWRpb19kb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgICAgY29uc3QgY2hhciAqYnVmZmVyLAotCQkJCSAgICBzaXplX3QgY291bnQsCi0JCQkJICAgIGxvZmZfdCAqcHBvcykKLXsKLQl2d3NuZF9kZXZfdCAqZGV2YyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQl2d3NuZF9wb3J0X3QgKndwb3J0ID0gKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgPwotCQkJICAgICAgICZkZXZjLT53cG9ydCA6IE5VTEwpOwotCWludCByZXQsIG5iOwotCi0JREJHRVYoIihmaWxlPTB4JXAsIGJ1ZmZlcj0weCVwLCBjb3VudD0lZCwgcHBvcz0weCVwKVxuIiwKLQkgICAgICBmaWxlLCBidWZmZXIsIGNvdW50LCBwcG9zKTsKLQotCWlmICghd3BvcnQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHdwb3J0LT5zd2J1ZiA9PSBOVUxMKSB7Ci0JCXZ3c25kX3BvcnRfdCAqcnBvcnQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPwotCQkJJmRldmMtPnJwb3J0IDogTlVMTDsKLQkJcmV0ID0gcGNtX3NldHVwKGRldmMsIHJwb3J0LCB3cG9ydCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQl9Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0ID0gMDsKLQl3aGlsZSAoY291bnQpIHsKLQkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0JCWFkZF93YWl0X3F1ZXVlKCZ3cG9ydC0+cXVldWUsICZ3YWl0KTsKLQkJd2hpbGUgKChuYiA9IHN3Yl9pbmNfdSh3cG9ydCwgMCkpID09IDApIHsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQlpZiAod3BvcnQtPmZsYWdzICYgRElTQUJMRUQgfHwKLQkJCSAgICBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZ3cG9ydC0+cXVldWUsICZ3YWl0KTsKLQkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVBR0FJTjsKLQkJCX0KLQkJCXNjaGVkdWxlKCk7Ci0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmd3BvcnQtPnF1ZXVlLCAmd2FpdCk7Ci0JCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUzsKLQkJCX0KLQkJfQotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJcmVtb3ZlX3dhaXRfcXVldWUoJndwb3J0LT5xdWV1ZSwgJndhaXQpOwotCQkvKiBuYiBieXRlcyBhcmUgYXZhaWxhYmxlIGluIHVzZXJidWYuICovCi0JCWlmIChuYiA+IGNvdW50KQotCQkJbmIgPSBjb3VudDsKLQkJREJHUFYoIm5iID0gJWRcbiIsIG5iKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKHdwb3J0LT5zd2J1ZiArIHdwb3J0LT5zd2JfdV9pZHgsIGJ1ZmZlciwgbmIpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXBjbV9vdXRwdXQoZGV2YywgMCwgbmIpOwotCQlidWZmZXIgKz0gbmI7Ci0JCWNvdW50IC09IG5iOwotCQlyZXQgKz0gbmI7Ci0JfQotCURCR1BWKCJyZXR1cm5pbmcgJWRcbiIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgdndzbmRfYXVkaW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJIGNvbnN0IGNoYXIgKmJ1ZmZlciwKLQkJCQkgc2l6ZV90IGNvdW50LAotCQkJCSBsb2ZmX3QgKnBwb3MpCi17Ci0JdndzbmRfZGV2X3QgKmRldmMgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3NpemVfdCByZXQ7Ci0KLQltdXRleF9sb2NrKCZkZXZjLT5pb19tdXRleCk7Ci0JcmV0ID0gdndzbmRfYXVkaW9fZG9fd3JpdGUoZmlsZSwgYnVmZmVyLCBjb3VudCwgcHBvcyk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXZjLT5pb19tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogTm8ga2VybmVsIGxvY2sgLSBmaW5lICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHZ3c25kX2F1ZGlvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICAgICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0JdndzbmRfZGV2X3QgKmRldmMgPSAodndzbmRfZGV2X3QgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXZ3c25kX3BvcnRfdCAqcnBvcnQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPwotCQkmZGV2Yy0+cnBvcnQgOiBOVUxMOwotCXZ3c25kX3BvcnRfdCAqd3BvcnQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpID8KLQkJJmRldmMtPndwb3J0IDogTlVMTDsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0KLQlEQkdFVigiKGZpbGU9MHglcCwgd2FpdD0weCVwKVxuIiwgZmlsZSwgd2FpdCk7Ci0KLQlBU1NFUlQocnBvcnQgfHwgd3BvcnQpOwotCWlmIChycG9ydCkgewotCQlwb2xsX3dhaXQoZmlsZSwgJnJwb3J0LT5xdWV1ZSwgd2FpdCk7Ci0JCWlmIChzd2JfaW5jX3UocnBvcnQsIDApKQotCQkJbWFzayB8PSAoUE9MTElOIHwgUE9MTFJETk9STSk7Ci0JfQotCWlmICh3cG9ydCkgewotCQlwb2xsX3dhaXQoZmlsZSwgJndwb3J0LT5xdWV1ZSwgd2FpdCk7Ci0JCWlmICh3cG9ydC0+c3didWYgPT0gTlVMTCB8fCBzd2JfaW5jX3Uod3BvcnQsIDApKQotCQkJbWFzayB8PSAoUE9MTE9VVCB8IFBPTExXUk5PUk0pOwotCX0KLQotCURCR1BWKCJyZXR1cm5pbmcgMHgleFxuIiwgbWFzayk7Ci0JcmV0dXJuIG1hc2s7Ci19Ci0KLXN0YXRpYyBpbnQgdndzbmRfYXVkaW9fZG9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJdW5zaWduZWQgaW50IGNtZCwKLQkJCQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQl2d3NuZF9kZXZfdCAqZGV2YyA9ICh2d3NuZF9kZXZfdCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JdndzbmRfcG9ydF90ICpycG9ydCA9IChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/Ci0JCSZkZXZjLT5ycG9ydCA6IE5VTEw7Ci0JdndzbmRfcG9ydF90ICp3cG9ydCA9IChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgPwotCQkmZGV2Yy0+d3BvcnQgOiBOVUxMOwotCXZ3c25kX3BvcnRfdCAqYXBvcnQgPSBycG9ydCA/IHJwb3J0IDogd3BvcnQ7Ci0Jc3RydWN0IGF1ZGlvX2J1Zl9pbmZvIGJ1Zl9pbmZvOwotCXN0cnVjdCBjb3VudF9pbmZvIGluZm87Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaXZhbDsKLQotCQotCURCR0VWKCIoZmlsZT0weCVwLCBjbWQ9MHgleCwgYXJnPTB4JWx4KVxuIiwKLQkgICAgICBmaWxlLCBjbWQsIGFyZyk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIE9TU19HRVRWRVJTSU9OOgkJLyogX1NJT1IgKCdNJywgMTE4LCBpbnQpICovCi0JCURCR1goIk9TU19HRVRWRVJTSU9OXG4iKTsKLQkJaXZhbCA9IFNPVU5EX1ZFUlNJT047Ci0JCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoJLyogX1NJT1IgKCdQJywxNSwgaW50KSAqLwotCQlEQkdYKCJTTkRDVExfRFNQX0dFVENBUFNcbiIpOwotCQlpdmFsID0gRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwgRFNQX0NBUF9UUklHR0VSOwotCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6CS8qIF9TSU9SICgnUCcsMTEsIGludCkgKi8KLQkJREJHWCgiU05EQ1RMX0RTUF9HRVRGTVRTXG4iKTsKLQkJaXZhbCA9IChBRk1UX1MxNl9MRSB8IEFGTVRfTVVfTEFXIHwgQUZNVF9BX0xBVyB8Ci0JCQlBRk1UX1U4IHwgQUZNVF9TOCk7Ci0JCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgkvKiBfU0lPUiAoJ1AnLCAyLCBpbnQpICovCi0JCURCR1goIlNPVU5EX1BDTV9SRUFEX1JBVEVcbiIpOwotCQlpdmFsID0gYXBvcnQtPnN3X2ZyYW1lcmF0ZTsKLQkJcmV0dXJuIHB1dF91c2VyKGl2YWwsIChpbnQgKikgYXJnKTsKLQotCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CS8qIF9TSU9SICgnUCcsIDYsIGludCkgKi8KLQkJREJHWCgiU09VTkRfUENNX1JFQURfQ0hBTk5FTFNcbiIpOwotCQlpdmFsID0gYXBvcnQtPnN3X2NoYW5uZWxzOwotCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOwotCi0JY2FzZSBTTkRDVExfRFNQX1NQRUVEOgkJLyogX1NJT1dSKCdQJywgMiwgaW50KSAqLwotCQlpZiAoZ2V0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCURCR1goIlNORENUTF9EU1BfU1BFRUQgJWRcbiIsIGl2YWwpOwotCQlpZiAoaXZhbCkgewotCQkJaWYgKGFwb3J0LT5zd3N0YXRlICE9IFNXX0lOSVRJQUwpIHsKLQkJCQlEQkdYKCJTTkRDVExfRFNQX1NQRUVEIGZhaWxlZDogc3dzdGF0ZSA9ICVkXG4iLAotCQkJCSAgICAgYXBvcnQtPnN3c3RhdGUpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJaWYgKGl2YWwgPCBNSU5fU1BFRUQpCi0JCQkJaXZhbCA9IE1JTl9TUEVFRDsKLQkJCWlmIChpdmFsID4gTUFYX1NQRUVEKQotCQkJCWl2YWwgPSBNQVhfU1BFRUQ7Ci0JCQlpZiAocnBvcnQpCi0JCQkJcnBvcnQtPnN3X2ZyYW1lcmF0ZSA9IGl2YWw7Ci0JCQlpZiAod3BvcnQpCi0JCQkJd3BvcnQtPnN3X2ZyYW1lcmF0ZSA9IGl2YWw7Ci0JCX0gZWxzZQotCQkJaXZhbCA9IGFwb3J0LT5zd19mcmFtZXJhdGU7Ci0JCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7Ci0KLQljYXNlIFNORENUTF9EU1BfU1RFUkVPOgkJLyogX1NJT1dSKCdQJywgMywgaW50KSAqLwotCQlpZiAoZ2V0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCURCR1goIlNORENUTF9EU1BfU1RFUkVPICVkXG4iLCBpdmFsKTsKLQkJaWYgKGl2YWwgIT0gMCAmJiBpdmFsICE9IDEpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGFwb3J0LT5zd3N0YXRlICE9IFNXX0lOSVRJQUwpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHJwb3J0KQotCQkJcnBvcnQtPnN3X2NoYW5uZWxzID0gaXZhbCArIDE7Ci0JCWlmICh3cG9ydCkKLQkJCXdwb3J0LT5zd19jaGFubmVscyA9IGl2YWwgKyAxOwotCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOwotCi0JY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgkvKiBfU0lPV1IoJ1AnLCA2LCBpbnQpICovCi0JCWlmIChnZXRfdXNlcihpdmFsLCAoaW50ICopIGFyZykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJREJHWCgiU05EQ1RMX0RTUF9DSEFOTkVMUyAlZFxuIiwgaXZhbCk7Ci0JCWlmIChpdmFsICE9IDEgJiYgaXZhbCAhPSAyKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChhcG9ydC0+c3dzdGF0ZSAhPSBTV19JTklUSUFMKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChycG9ydCkKLQkJCXJwb3J0LT5zd19jaGFubmVscyA9IGl2YWw7Ci0JCWlmICh3cG9ydCkKLQkJCXdwb3J0LT5zd19jaGFubmVscyA9IGl2YWw7Ci0JCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToJLyogX1NJT1dSKCdQJywgNCwgaW50KSAqLwotCQlpdmFsID0gcGNtX3NldHVwKGRldmMsIHJwb3J0LCB3cG9ydCk7Ci0JCWlmIChpdmFsIDwgMCkgewotCQkJREJHWCgiU05EQ1RMX0RTUF9HRVRCTEtTSVpFIGZhaWxlZCwgZXJybm8gJWRcbiIsIGl2YWwpOwotCQkJcmV0dXJuIGl2YWw7Ci0JCX0KLQkJaXZhbCA9IDEgPDwgYXBvcnQtPnN3X2ZyYWdzaGlmdDsKLQkJREJHWCgiU05EQ1RMX0RTUF9HRVRCTEtTSVpFIHJldHVybmluZyAlZFxuIiwgaXZhbCk7Ci0JCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7Ci0KLQljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CS8qIF9TSU9XUignUCcsMTAsIGludCkgKi8KLQkJaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlEQkdYKCJTTkRDVExfRFNQX1NFVEZSQUdNRU5UICVkOiVkXG4iLAotCQkgICAgIGl2YWwgPj4gMTYsIGl2YWwgJiAweEZGRkYpOwotCQlpZiAoYXBvcnQtPnN3c3RhdGUgIT0gU1dfSU5JVElBTCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQl7Ci0JCQlpbnQgc3dfZnJhZ3NoaWZ0ID0gaXZhbCAmIDB4RkZGRjsKLQkJCWludCBzd19zdWJkaXZzaGlmdCA9IGFwb3J0LT5zd19zdWJkaXZzaGlmdDsKLQkJCWludCBod19mcmFnc2hpZnQgPSBzd19mcmFnc2hpZnQgLSBzd19zdWJkaXZzaGlmdDsKLQkJCWludCBzd19mcmFnY291bnQgPSAoaXZhbCA+PiAxNikgJiAweEZGRkY7Ci0JCQlpbnQgaHdfZnJhZ3NpemU7Ci0JCQlpZiAoaHdfZnJhZ3NoaWZ0IDwgTUlOX0ZSQUdTSElGVCkKLQkJCQlod19mcmFnc2hpZnQgPSBNSU5fRlJBR1NISUZUOwotCQkJaWYgKGh3X2ZyYWdzaGlmdCA+IE1BWF9GUkFHU0hJRlQpCi0JCQkJaHdfZnJhZ3NoaWZ0ID0gTUFYX0ZSQUdTSElGVDsKLQkJCXN3X2ZyYWdzaGlmdCA9IGh3X2ZyYWdzaGlmdCArIGFwb3J0LT5zd19zdWJkaXZzaGlmdDsKLQkJCWh3X2ZyYWdzaXplID0gMSA8PCBod19mcmFnc2hpZnQ7Ci0JCQlpZiAoc3dfZnJhZ2NvdW50IDwgTUlOX0ZSQUdDT1VOVChod19mcmFnc2l6ZSkpCi0JCQkJc3dfZnJhZ2NvdW50ID0gTUlOX0ZSQUdDT1VOVChod19mcmFnc2l6ZSk7Ci0JCQlpZiAoc3dfZnJhZ2NvdW50ID4gTUFYX0ZSQUdDT1VOVChod19mcmFnc2l6ZSkpCi0JCQkJc3dfZnJhZ2NvdW50ID0gTUFYX0ZSQUdDT1VOVChod19mcmFnc2l6ZSk7Ci0JCQlEQkdQVigic3dfZnJhZ3NoaWZ0ID0gJWRcbiIsIHN3X2ZyYWdzaGlmdCk7Ci0JCQlEQkdQVigicnBvcnQgPSAweCVwLCB3cG9ydCA9IDB4JXBcbiIsIHJwb3J0LCB3cG9ydCk7Ci0JCQlpZiAocnBvcnQpIHsKLQkJCQlycG9ydC0+c3dfZnJhZ3NoaWZ0ID0gc3dfZnJhZ3NoaWZ0OwotCQkJCXJwb3J0LT5zd19mcmFnY291bnQgPSBzd19mcmFnY291bnQ7Ci0JCQl9Ci0JCQlpZiAod3BvcnQpIHsKLQkJCQl3cG9ydC0+c3dfZnJhZ3NoaWZ0ID0gc3dfZnJhZ3NoaWZ0OwotCQkJCXdwb3J0LT5zd19mcmFnY291bnQgPSBzd19mcmFnY291bnQ7Ci0JCQl9Ci0JCQlpdmFsID0gc3dfZnJhZ2NvdW50IDw8IDE2IHwgc3dfZnJhZ3NoaWZ0OwotCQl9Ci0JCURCR1goIlNORENUTF9EU1BfU0VURlJBR01FTlQgcmV0dXJucyAlZDolZFxuIiwKLQkJICAgICAgaXZhbCA+PiAxNiwgaXZhbCAmIDB4RkZGRik7Ci0JCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7Ci0KLQljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgkvKiBfU0lPV1IoJ1AnLCA5LCBpbnQpICovCi0gICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlEQkdYKCJTTkRDVExfRFNQX1NVQkRJVklERSAlZFxuIiwgaXZhbCk7Ci0JCWlmIChhcG9ydC0+c3dzdGF0ZSAhPSBTV19JTklUSUFMKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXsKLQkJCWludCBzdWJkaXZzaGlmdDsKLQkJCWludCBod19mcmFnc2hpZnQsIGh3X2ZyYWdzaXplLCBod19mcmFnY291bnQ7Ci0JCQlzd2l0Y2ggKGl2YWwpIHsKLQkJCWNhc2UgMTogc3ViZGl2c2hpZnQgPSAwOyBicmVhazsKLQkJCWNhc2UgMjogc3ViZGl2c2hpZnQgPSAxOyBicmVhazsKLQkJCWNhc2UgNDogc3ViZGl2c2hpZnQgPSAyOyBicmVhazsKLQkJCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJaHdfZnJhZ3NoaWZ0ID0gYXBvcnQtPnN3X2ZyYWdzaGlmdCAtIHN1YmRpdnNoaWZ0OwotCQkJaWYgKGh3X2ZyYWdzaGlmdCA8IE1JTl9GUkFHU0hJRlQgfHwKLQkJCSAgICBod19mcmFnc2hpZnQgPiBNQVhfRlJBR1NISUZUKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaHdfZnJhZ3NpemUgPSAxIDw8IGh3X2ZyYWdzaGlmdDsKLQkJCWh3X2ZyYWdjb3VudCA9IGFwb3J0LT5zd19mcmFnY291bnQgPj4gc3ViZGl2c2hpZnQ7Ci0JCQlpZiAoaHdfZnJhZ2NvdW50IDwgTUlOX0ZSQUdDT1VOVChod19mcmFnc2l6ZSkgfHwKLQkJCSAgICBod19mcmFnY291bnQgPiBNQVhfRlJBR0NPVU5UKGh3X2ZyYWdzaXplKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlmIChycG9ydCkKLQkJCQlycG9ydC0+c3dfc3ViZGl2c2hpZnQgPSBzdWJkaXZzaGlmdDsKLQkJCWlmICh3cG9ydCkKLQkJCQl3cG9ydC0+c3dfc3ViZGl2c2hpZnQgPSBzdWJkaXZzaGlmdDsKLQkJfQotCQlyZXR1cm4gMDsKLQotCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CQkvKiBfU0lPV1IoJ1AnLDUsIGludCkgKi8KLQkJaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlEQkdYKCJTTkRDVExfRFNQX1NFVEZNVCAlZFxuIiwgaXZhbCk7Ci0JCWlmIChpdmFsICE9IEFGTVRfUVVFUlkpIHsKLQkJCWlmIChhcG9ydC0+c3dzdGF0ZSAhPSBTV19JTklUSUFMKSB7Ci0JCQkJREJHUCgiU0VURk1UIGZhaWxlZCwgc3dzdGF0ZSA9ICVkXG4iLAotCQkJCSAgICAgYXBvcnQtPnN3c3RhdGUpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJc3dpdGNoIChpdmFsKSB7Ci0JCQljYXNlIEFGTVRfTVVfTEFXOgotCQkJY2FzZSBBRk1UX0FfTEFXOgotCQkJY2FzZSBBRk1UX1U4OgotCQkJY2FzZSBBRk1UX1M4OgotCQkJY2FzZSBBRk1UX1MxNl9MRToKLQkJCQlpZiAocnBvcnQpCi0JCQkJCXJwb3J0LT5zd19zYW1wbGVmbXQgPSBpdmFsOwotCQkJCWlmICh3cG9ydCkKLQkJCQkJd3BvcnQtPnN3X3NhbXBsZWZtdCA9IGl2YWw7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQl9Ci0JCWl2YWwgPSBhcG9ydC0+c3dfc2FtcGxlZm10OwotCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToJLyogX1NJT1IgKCdQJywxMiwgYXVkaW9fYnVmX2luZm8pICovCi0JCURCR1hWKCJTTkRDVExfRFNQX0dFVE9TUEFDRVxuIik7Ci0JCWlmICghd3BvcnQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaXZhbCA9IHBjbV9zZXR1cChkZXZjLCBycG9ydCwgd3BvcnQpOwotCQlpZiAoaXZhbCA8IDApCi0JCQlyZXR1cm4gaXZhbDsKLQkJaXZhbCA9IHN3Yl9pbmNfdSh3cG9ydCwgMCk7Ci0JCWJ1Zl9pbmZvLmZyYWdtZW50cyA9IGl2YWwgPj4gd3BvcnQtPnN3X2ZyYWdzaGlmdDsKLQkJYnVmX2luZm8uZnJhZ3N0b3RhbCA9IHdwb3J0LT5zd19mcmFnY291bnQ7Ci0JCWJ1Zl9pbmZvLmZyYWdzaXplID0gMSA8PCB3cG9ydC0+c3dfZnJhZ3NoaWZ0OwotCQlidWZfaW5mby5ieXRlcyA9IGl2YWw7Ci0JCURCR1hWKCJTTkRDVExfRFNQX0dFVE9TUEFDRSByZXR1cm5zIHsgJWQgJWQgJWQgJWQgfVxuIiwKLQkJICAgICBidWZfaW5mby5mcmFnbWVudHMsIGJ1Zl9pbmZvLmZyYWdzdG90YWwsCi0JCSAgICAgYnVmX2luZm8uZnJhZ3NpemUsIGJ1Zl9pbmZvLmJ5dGVzKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZidWZfaW5mbywgc2l6ZW9mIGJ1Zl9pbmZvKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CS8qIF9TSU9SICgnUCcsMTMsIGF1ZGlvX2J1Zl9pbmZvKSAqLwotCQlEQkdYKCJTTkRDVExfRFNQX0dFVElTUEFDRVxuIik7Ci0JCWlmICghcnBvcnQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaXZhbCA9IHBjbV9zZXR1cChkZXZjLCBycG9ydCwgd3BvcnQpOwotCQlpZiAoaXZhbCA8IDApCi0JCQlyZXR1cm4gaXZhbDsKLQkJaXZhbCA9IHN3Yl9pbmNfdShycG9ydCwgMCk7Ci0JCWJ1Zl9pbmZvLmZyYWdtZW50cyA9IGl2YWwgPj4gcnBvcnQtPnN3X2ZyYWdzaGlmdDsKLQkJYnVmX2luZm8uZnJhZ3N0b3RhbCA9IHJwb3J0LT5zd19mcmFnY291bnQ7Ci0JCWJ1Zl9pbmZvLmZyYWdzaXplID0gMSA8PCBycG9ydC0+c3dfZnJhZ3NoaWZ0OwotCQlidWZfaW5mby5ieXRlcyA9IGl2YWw7Ci0JCURCR1goIlNORENUTF9EU1BfR0VUSVNQQUNFIHJldHVybnMgeyAlZCAlZCAlZCAlZCB9XG4iLAotCQkgICAgIGJ1Zl9pbmZvLmZyYWdtZW50cywgYnVmX2luZm8uZnJhZ3N0b3RhbCwKLQkJICAgICBidWZfaW5mby5mcmFnc2l6ZSwgYnVmX2luZm8uYnl0ZXMpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmJ1Zl9pbmZvLCBzaXplb2YgYnVmX2luZm8pKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgkvKiBfU0lPICAoJ1AnLDE0KSAqLwotCQlEQkdYKCJTTkRDVExfRFNQX05PTkJMT0NLXG4iKTsKLQkJc3Bpbl9sb2NrKCZmaWxlLT5mX2xvY2spOwotCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7Ci0JCXNwaW5fdW5sb2NrKCZmaWxlLT5mX2xvY2spOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoJCS8qIF9TSU8gICgnUCcsIDApICovCi0JCURCR1goIlNORENUTF9EU1BfUkVTRVRcbiIpOwotCQkvKgotCQkgKiBOb3RoaW5nIHNwZWNpYWwgbmVlZHMgdG8gYmUgZG9uZSBmb3IgaW5wdXQuICBJbnB1dAotCQkgKiBzYW1wbGVzIHNpdCBpbiBzd2J1ZiwgYnV0IGl0IHdpbGwgYmUgcmVpbml0aWFsaXplZAotCQkgKiB0byBlbXB0eSB3aGVuIHBjbV9zZXR1cCgpIGlzIGNhbGxlZC4KLQkJICovCi0JCWlmICh3cG9ydCAmJiB3cG9ydC0+c3didWYpIHsKLQkJCXdwb3J0LT5zd3N0YXRlID0gU1dfSU5JVElBTDsKLQkJCXBjbV9vdXRwdXQoZGV2YywgMCwgMCk7Ci0JCQlwY21fd3JpdGVfc3luYyhkZXZjKTsKLQkJfQotCQlwY21fc2h1dGRvd24oZGV2YywgcnBvcnQsIHdwb3J0KTsKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFNORENUTF9EU1BfU1lOQzoJCS8qIF9TSU8gICgnUCcsIDEpICovCi0JCURCR1goIlNORENUTF9EU1BfU1lOQ1xuIik7Ci0JCWlmICh3cG9ydCkgewotCQkJcGNtX2ZsdXNoX2ZyYWcoZGV2Yyk7Ci0JCQlwY21fd3JpdGVfc3luYyhkZXZjKTsKLQkJfQotCQlwY21fc2h1dGRvd24oZGV2YywgcnBvcnQsIHdwb3J0KTsKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFNORENUTF9EU1BfUE9TVDoJCS8qIF9TSU8gICgnUCcsIDgpICovCi0JCURCR1goIlNORENUTF9EU1BfUE9TVFxuIik7Ci0JCWlmICghd3BvcnQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcGNtX2ZsdXNoX2ZyYWcoZGV2Yyk7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CS8qIF9TSU9SICgnUCcsIDE3LCBjb3VudF9pbmZvKSAqLwotCQlEQkdYKCJTTkRDVExfRFNQX0dFVElQVFJcbiIpOwotCQlpZiAoIXJwb3J0KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZycG9ydC0+bG9jaywgZmxhZ3MpOwotCQl7Ci0JCQl1c3Rtc2NfdCB1c3Rtc2M7Ci0JCQlpZiAocnBvcnQtPmh3c3RhdGUgPT0gSFdfUlVOTklORykgewotCQkJCUFTU0VSVChycG9ydC0+c3dzdGF0ZSA9PSBTV19SVU4pOwotCQkJCWxpX3JlYWRfVVNUTVNDKCZycG9ydC0+Y2hhbiwgJnVzdG1zYyk7Ci0JCQkJaW5mby5ieXRlcyA9IHVzdG1zYy5tc2MgLSBycG9ydC0+TVNDX29mZnNldDsKLQkJCQlpbmZvLmJ5dGVzICo9IHJwb3J0LT5mcmFtZV9zaXplOwotCQkJfSBlbHNlIHsKLQkJCQlpbmZvLmJ5dGVzID0gcnBvcnQtPmJ5dGVfY291bnQ7Ci0JCQl9Ci0JCQlpbmZvLmJsb2NrcyA9IHJwb3J0LT5mcmFnX2NvdW50OwotCQkJaW5mby5wdHIgPSAwOwkvKiBub3QgaW1wbGVtZW50ZWQgKi8KLQkJCXJwb3J0LT5mcmFnX2NvdW50ID0gMDsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycG9ydC0+bG9jaywgZmxhZ3MpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmluZm8sIHNpemVvZiBpbmZvKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgkvKiBfU0lPUiAoJ1AnLDE4LCBjb3VudF9pbmZvKSAqLwotCQlEQkdYKCJTTkRDVExfRFNQX0dFVE9QVFJcbiIpOwotCQlpZiAoIXdwb3J0KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOwotCQl7Ci0JCQl1c3Rtc2NfdCB1c3Rtc2M7Ci0JCQlpZiAod3BvcnQtPmh3c3RhdGUgPT0gSFdfUlVOTklORykgewotCQkJCUFTU0VSVCh3cG9ydC0+c3dzdGF0ZSA9PSBTV19SVU4pOwotCQkJCWxpX3JlYWRfVVNUTVNDKCZ3cG9ydC0+Y2hhbiwgJnVzdG1zYyk7Ci0JCQkJaW5mby5ieXRlcyA9IHVzdG1zYy5tc2MgLSB3cG9ydC0+TVNDX29mZnNldDsKLQkJCQlpbmZvLmJ5dGVzICo9IHdwb3J0LT5mcmFtZV9zaXplOwotCQkJfSBlbHNlIHsKLQkJCQlpbmZvLmJ5dGVzID0gd3BvcnQtPmJ5dGVfY291bnQ7Ci0JCQl9Ci0JCQlpbmZvLmJsb2NrcyA9IHdwb3J0LT5mcmFnX2NvdW50OwotCQkJaW5mby5wdHIgPSAwOwkvKiBub3QgaW1wbGVtZW50ZWQgKi8KLQkJCXdwb3J0LT5mcmFnX2NvdW50ID0gMDsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmluZm8sIHNpemVvZiBpbmZvKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CS8qIF9TSU9SICgnUCcsIDIzLCBpbnQpICovCi0JCURCR1goIlNORENUTF9EU1BfR0VUT0RFTEFZXG4iKTsKLQkJaWYgKCF3cG9ydCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKLQkJewotCQkJaW50IGZzaXplID0gd3BvcnQtPmZyYW1lX3NpemU7Ci0JCQlpdmFsID0gd3BvcnQtPnN3Yl9pX2F2YWlsIC8gZnNpemU7Ci0JCQlpZiAod3BvcnQtPmh3c3RhdGUgPT0gSFdfUlVOTklORykgewotCQkJCWludCBzd3B0ciwgaHdwdHIsIGh3ZnJhbWVzLCBod2J5dGVzLCBod3NpemU7Ci0JCQkJaW50IHRvdGFsaHdieXRlczsKLQkJCQl1c3Rtc2NfdCB1c3Rtc2M7Ci0KLQkJCQlod3NpemUgPSB3cG9ydC0+aHdidWZfc2l6ZTsKLQkJCQlzd3B0ciA9IGxpX3JlYWRfc3dwdHIoJndwb3J0LT5jaGFuKTsKLQkJCQlsaV9yZWFkX1VTVE1TQygmd3BvcnQtPmNoYW4sICZ1c3Rtc2MpOwotCQkJCWh3ZnJhbWVzID0gdXN0bXNjLm1zYyAtIHdwb3J0LT5NU0Nfb2Zmc2V0OwotCQkJCXRvdGFsaHdieXRlcyA9IGh3ZnJhbWVzICogZnNpemU7Ci0JCQkJaHdwdHIgPSB0b3RhbGh3Ynl0ZXMgJSBod3NpemU7Ci0JCQkJaHdieXRlcyA9IChzd3B0ciAtIGh3cHRyICsgaHdzaXplKSAlIGh3c2l6ZTsKLQkJCQlpdmFsICs9IGh3Ynl0ZXMgLyBmc2l6ZTsKLQkJCX0KLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOwotCi0JY2FzZSBTTkRDVExfRFNQX1BST0ZJTEU6CS8qIF9TSU9XICgnUCcsIDIzLCBpbnQpICovCi0JCURCR1goIlNORENUTF9EU1BfUFJPRklMRVxuIik7Ci0KLQkJLyoKLQkJICogVGhvbWFzIFNhaWxlciBleHBsYWlucyBTTkRDVExfRFNQX1BST0ZJTEUKLQkJICogKHByaXZhdGUgZW1haWwsIE1hcmNoIDI0LCAxOTk5KToKLQkJICoKLQkJICogICAgIFRoaXMgZ2l2ZXMgdGhlIHNvdW5kIGRyaXZlciBhIGhpbnQgb24gd2hhdCBpdAotCQkgKiAgICAgc2hvdWxkIGRvIHdpdGggcGFydGlhbCBmcmFnbWVudHMKLQkJICogICAgIChpLmUuIGZyYWdtZW50cyBwYXJ0aWFsbHkgZmlsbGVkIHdpdGggd3JpdGUpLgotCQkgKiAgICAgVGhpcyBjYW4gZGlyZWN0IHRoZSBkcml2ZXIgdG8gemVybyB0aGVtIG9yCi0JCSAqICAgICBsZWF2ZSB0aGVtIGFsb25lLiAgQnV0IGRvbid0IGFzayBtZSB3aGF0IHRoaXMKLQkJICogICAgIGlzIGdvb2QgZm9yLCBteSBkcml2ZXIganVzdCB6ZXJvZXMgdGhlIGxhc3QKLQkJICogICAgIGZyYWdtZW50IGJlZm9yZSB0aGUgcmVjZWl2ZXIgc3RvcHMsIG5vIGlkZWEKLQkJICogICAgIHdoYXQgZ29vZCBmb3IgYW55IG90aGVyIGJlaGF2aW91ciBjb3VsZAotCQkgKiAgICAgYmUuIEltcGxlbWVudGluZyBpdCBhcyBOT1Agc2VlbXMgc2FmZS4KLQkJICovCi0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoJLyogX1NJT1IgKCdQJywxNiwgaW50KSAqLwotCQlEQkdYKCJTTkRDVExfRFNQX0dFVFRSSUdHRVJcbiIpOwotCQlpdmFsID0gMDsKLQkJaWYgKHJwb3J0KSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJCXsKLQkJCQlpZiAoIShycG9ydC0+ZmxhZ3MgJiBESVNBQkxFRCkpCi0JCQkJCWl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwb3J0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQkJaWYgKHdwb3J0KSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKLQkJCXsKLQkJCQlpZiAoISh3cG9ydC0+ZmxhZ3MgJiBESVNBQkxFRCkpCi0JCQkJCWl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0JCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7Ci0KLQljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoJLyogX1NJT1cgKCdQJywxNiwgaW50KSAqLwotCQlpZiAoZ2V0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCURCR1goIlNORENUTF9EU1BfU0VUVFJJR0dFUiAlZFxuIiwgaXZhbCk7Ci0KLQkJLyoKLQkJICogSWYgdXNlciBpcyBkaXNhYmxpbmcgSS9PIGFuZCBwb3J0IGlzIG5vdCBpbiBpbml0aWFsCi0JCSAqIHN0YXRlLCBmYWlsIHdpdGggRUlOVkFMLgotCQkgKi8KLQotCQlpZiAoKChycG9ydCAmJiAhKGl2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKSkgfHwKLQkJICAgICAod3BvcnQgJiYgIShpdmFsICYgUENNX0VOQUJMRV9PVVRQVVQpKSkgJiYKLQkJICAgIGFwb3J0LT5zd3N0YXRlICE9IFNXX0lOSVRJQUwpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAocnBvcnQpIHsKLQkJCXZ3c25kX3BvcnRfaHdzdGF0ZV90IGh3c3RhdGU7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJCXsKLQkJCQlod3N0YXRlID0gcnBvcnQtPmh3c3RhdGU7Ci0JCQkJaWYgKGl2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKQotCQkJCQlycG9ydC0+ZmxhZ3MgJj0gfkRJU0FCTEVEOwotCQkJCWVsc2UKLQkJCQkJcnBvcnQtPmZsYWdzIHw9IERJU0FCTEVEOwotCQkJfQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJCWlmIChod3N0YXRlICE9IEhXX1JVTk5JTkcgJiYgaXZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKLQotCQkJCWlmIChycG9ydC0+c3dzdGF0ZSA9PSBTV19JTklUSUFMKQotCQkJCQlwY21fc2V0dXAoZGV2YywgcnBvcnQsIHdwb3J0KTsKLQkJCQllbHNlCi0JCQkJCWxpX2FjdGl2YXRlX2RtYSgmcnBvcnQtPmNoYW4pOwotCQkJfQotCQl9Ci0JCWlmICh3cG9ydCkgewotCQkJdndzbmRfcG9ydF9mbGFnc190IHBmbGFnczsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOwotCQkJewotCQkJCXBmbGFncyA9IHdwb3J0LT5mbGFnczsKLQkJCQlpZiAoaXZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKQotCQkJCQl3cG9ydC0+ZmxhZ3MgJj0gfkRJU0FCTEVEOwotCQkJCWVsc2UKLQkJCQkJd3BvcnQtPmZsYWdzIHw9IERJU0FCTEVEOwotCQkJfQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKLQkJCWlmIChwZmxhZ3MgJiBESVNBQkxFRCAmJiBpdmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKLQkJCQlpZiAod3BvcnQtPnN3c3RhdGUgPT0gU1dfUlVOKQotCQkJCQlwY21fb3V0cHV0KGRldmMsIDAsIDApOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCi0JZGVmYXVsdDoKLQkJREJHUCgidW5rbm93biBpb2N0bCAweCV4XG4iLCBjbWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JREJHUCgidW5pbXBsZW1lbnRlZCBpb2N0bCAweCV4XG4iLCBjbWQpOwotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgbG9uZyB2d3NuZF9hdWRpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQl1bnNpZ25lZCBpbnQgY21kLAotCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCXZ3c25kX2Rldl90ICpkZXZjID0gKHZ3c25kX2Rldl90ICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmdndzbmRfbXV0ZXgpOwotCW11dGV4X2xvY2soJmRldmMtPmlvX211dGV4KTsKLQlyZXQgPSB2d3NuZF9hdWRpb19kb19pb2N0bChmaWxlLCBjbWQsIGFyZyk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXZjLT5pb19tdXRleCk7Ci0JbXV0ZXhfdW5sb2NrKCZ2d3NuZF9tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBObyBtbWFwLiAqLwotCi1zdGF0aWMgaW50IHZ3c25kX2F1ZGlvX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCURCR0UoIihmaWxlPTB4JXAsIHZtYT0weCVwKVxuIiwgZmlsZSwgdm1hKTsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotLyoKLSAqIE9wZW4gdGhlIGF1ZGlvIGRldmljZSBmb3IgcmVhZCBhbmQvb3Igd3JpdGUuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgotICovCi0KLXN0YXRpYyBpbnQgdndzbmRfYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQl2d3NuZF9kZXZfdCAqZGV2YzsKLQlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotCWludCBzd19zYW1wbGVmbXQ7Ci0JREVGSU5FX1dBSVQod2FpdCk7Ci0KLQlEQkdFKCIoaW5vZGU9MHglcCwgZmlsZT0weCVwKVxuIiwgaW5vZGUsIGZpbGUpOwotCi0JbXV0ZXhfbG9jaygmdndzbmRfbXV0ZXgpOwotCUlOQ19VU0VfQ09VTlQ7Ci0JZm9yIChkZXZjID0gdndzbmRfZGV2X2xpc3Q7IGRldmM7IGRldmMgPSBkZXZjLT5uZXh0X2RldikKLQkJaWYgKChkZXZjLT5hdWRpb19taW5vciAmIH4weDBGKSA9PSAobWlub3IgJiB+MHgwRikpCi0JCQlicmVhazsKLQotCWlmIChkZXZjID09IE5VTEwpIHsKLQkJREVDX1VTRV9DT1VOVDsKLQkJbXV0ZXhfdW5sb2NrKCZ2d3NuZF9tdXRleCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCW11dGV4X2xvY2soJmRldmMtPm9wZW5fbXV0ZXgpOwotCXdoaWxlICgxKSB7Ci0JCXByZXBhcmVfdG9fd2FpdCgmZGV2Yy0+b3Blbl93YWl0LCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKCEoZGV2Yy0+b3Blbl9tb2RlICYgZmlsZS0+Zl9tb2RlKSkKLQkJCWJyZWFrOwotCi0JCW11dGV4X3VubG9jaygmZGV2Yy0+b3Blbl9tdXRleCk7Ci0JCW11dGV4X3VubG9jaygmdndzbmRfbXV0ZXgpOwotCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJCURFQ19VU0VfQ09VTlQ7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0JCXNjaGVkdWxlKCk7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJREVDX1VTRV9DT1VOVDsKLQkJCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JCX0KLQkJbXV0ZXhfbG9jaygmdndzbmRfbXV0ZXgpOwotCQltdXRleF9sb2NrKCZkZXZjLT5vcGVuX211dGV4KTsKLQl9Ci0JZmluaXNoX3dhaXQoJmRldmMtPm9wZW5fd2FpdCwgJndhaXQpOwotCWRldmMtPm9wZW5fbW9kZSB8PSBmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKTsKLQltdXRleF91bmxvY2soJmRldmMtPm9wZW5fbXV0ZXgpOwotCi0JLyogZ2V0IGRlZmF1bHQgc2FtcGxlIGZvcm1hdCBmcm9tIG1pbm9yIG51bWJlci4gKi8KLQotCXN3X3NhbXBsZWZtdCA9IDA7Ci0JaWYgKChtaW5vciAmIDB4RikgPT0gU05EX0RFVl9EU1ApCi0JCXN3X3NhbXBsZWZtdCA9IEFGTVRfVTg7Ci0JZWxzZSBpZiAoKG1pbm9yICYgMHhGKSA9PSBTTkRfREVWX0FVRElPKQotCQlzd19zYW1wbGVmbXQgPSBBRk1UX01VX0xBVzsKLQllbHNlIGlmICgobWlub3IgJiAweEYpID09IFNORF9ERVZfRFNQMTYpCi0JCXN3X3NhbXBsZWZtdCA9IEFGTVRfUzE2X0xFOwotCWVsc2UKLQkJQVNTRVJUKDApOwotCi0JLyogSW5pdGlhbGl6ZSB2d3NuZF9wb3J0cy4gKi8KLQotCW11dGV4X2xvY2soJmRldmMtPmlvX211dGV4KTsKLQl7Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlkZXZjLT5ycG9ydC5zd3N0YXRlICAgICAgICA9IFNXX0lOSVRJQUw7Ci0JCQlkZXZjLT5ycG9ydC5mbGFncyAgICAgICAgICA9IDA7Ci0JCQlkZXZjLT5ycG9ydC5zd19jaGFubmVscyAgICA9IDE7Ci0JCQlkZXZjLT5ycG9ydC5zd19zYW1wbGVmbXQgICA9IHN3X3NhbXBsZWZtdDsKLQkJCWRldmMtPnJwb3J0LnN3X2ZyYW1lcmF0ZSAgID0gODAwMDsKLQkJCWRldmMtPnJwb3J0LnN3X2ZyYWdzaGlmdCAgID0gREVGQVVMVF9GUkFHU0hJRlQ7Ci0JCQlkZXZjLT5ycG9ydC5zd19mcmFnY291bnQgICA9IERFRkFVTFRfRlJBR0NPVU5UOwotCQkJZGV2Yy0+cnBvcnQuc3dfc3ViZGl2c2hpZnQgPSBERUZBVUxUX1NVQkRJVlNISUZUOwotCQkJZGV2Yy0+cnBvcnQuYnl0ZV9jb3VudCAgICAgPSAwOwotCQkJZGV2Yy0+cnBvcnQuZnJhZ19jb3VudCAgICAgPSAwOwotCQl9Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJZGV2Yy0+d3BvcnQuc3dzdGF0ZSAgICAgICAgPSBTV19JTklUSUFMOwotCQkJZGV2Yy0+d3BvcnQuZmxhZ3MgICAgICAgICAgPSAwOwotCQkJZGV2Yy0+d3BvcnQuc3dfY2hhbm5lbHMgICAgPSAxOwotCQkJZGV2Yy0+d3BvcnQuc3dfc2FtcGxlZm10ICAgPSBzd19zYW1wbGVmbXQ7Ci0JCQlkZXZjLT53cG9ydC5zd19mcmFtZXJhdGUgICA9IDgwMDA7Ci0JCQlkZXZjLT53cG9ydC5zd19mcmFnc2hpZnQgICA9IERFRkFVTFRfRlJBR1NISUZUOwotCQkJZGV2Yy0+d3BvcnQuc3dfZnJhZ2NvdW50ICAgPSBERUZBVUxUX0ZSQUdDT1VOVDsKLQkJCWRldmMtPndwb3J0LnN3X3N1YmRpdnNoaWZ0ID0gREVGQVVMVF9TVUJESVZTSElGVDsKLQkJCWRldmMtPndwb3J0LmJ5dGVfY291bnQgICAgID0gMDsKLQkJCWRldmMtPndwb3J0LmZyYWdfY291bnQgICAgID0gMDsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJmRldmMtPmlvX211dGV4KTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldmM7Ci0JREJHUlYoKTsKLQltdXRleF91bmxvY2soJnZ3c25kX211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFJlbGVhc2UgKGNsb3NlKSB0aGUgYXVkaW8gZGV2aWNlLgotICovCi0KLXN0YXRpYyBpbnQgdndzbmRfYXVkaW9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQl2d3NuZF9kZXZfdCAqZGV2YyA9ICh2d3NuZF9kZXZfdCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JdndzbmRfcG9ydF90ICp3cG9ydCA9IE5VTEwsICpycG9ydCA9IE5VTEw7Ci0JaW50IGVyciA9IDA7Ci0KLQltdXRleF9sb2NrKCZ2d3NuZF9tdXRleCk7Ci0JbXV0ZXhfbG9jaygmZGV2Yy0+aW9fbXV0ZXgpOwotCXsKLQkJREJHRVYoIihpbm9kZT0weCVwLCBmaWxlPTB4JXApXG4iLCBpbm9kZSwgZmlsZSk7Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQlycG9ydCA9ICZkZXZjLT5ycG9ydDsKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQl3cG9ydCA9ICZkZXZjLT53cG9ydDsKLQkJCXBjbV9mbHVzaF9mcmFnKGRldmMpOwotCQkJcGNtX3dyaXRlX3N5bmMoZGV2Yyk7Ci0JCX0KLQkJcGNtX3NodXRkb3duKGRldmMsIHJwb3J0LCB3cG9ydCk7Ci0JCWlmIChycG9ydCkKLQkJCXJwb3J0LT5zd3N0YXRlID0gU1dfT0ZGOwotCQlpZiAod3BvcnQpCi0JCQl3cG9ydC0+c3dzdGF0ZSA9IFNXX09GRjsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZkZXZjLT5pb19tdXRleCk7Ci0KLQltdXRleF9sb2NrKCZkZXZjLT5vcGVuX211dGV4KTsKLQl7Ci0JCWRldmMtPm9wZW5fbW9kZSAmPSB+ZmlsZS0+Zl9tb2RlOwotCX0KLQltdXRleF91bmxvY2soJmRldmMtPm9wZW5fbXV0ZXgpOwotCXdha2VfdXAoJmRldmMtPm9wZW5fd2FpdCk7Ci0JREVDX1VTRV9DT1VOVDsKLQlEQkdSKCk7Ci0JbXV0ZXhfdW5sb2NrKCZ2d3NuZF9tdXRleCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdndzbmRfYXVkaW9fZm9wcyA9IHsKLQkub3duZXIgPQlUSElTX01PRFVMRSwKLQkubGxzZWVrID0Jbm9fbGxzZWVrLAotCS5yZWFkID0JCXZ3c25kX2F1ZGlvX3JlYWQsCi0JLndyaXRlID0JdndzbmRfYXVkaW9fd3JpdGUsCi0JLnBvbGwgPQkJdndzbmRfYXVkaW9fcG9sbCwKLQkudW5sb2NrZWRfaW9jdGwgPSB2d3NuZF9hdWRpb19pb2N0bCwKLQkubW1hcCA9CQl2d3NuZF9hdWRpb19tbWFwLAotCS5vcGVuID0JCXZ3c25kX2F1ZGlvX29wZW4sCi0JLnJlbGVhc2UgPQl2d3NuZF9hdWRpb19yZWxlYXNlLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogbWl4ZXIgZHJpdmVyICovCi0KLS8qIG9wZW4gdGhlIG1peGVyIGRldmljZS4gKi8KLQotc3RhdGljIGludCB2d3NuZF9taXhlcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXZ3c25kX2Rldl90ICpkZXZjOwotCi0JREJHRVYoIihpbm9kZT0weCVwLCBmaWxlPTB4JXApXG4iLCBpbm9kZSwgZmlsZSk7Ci0KLQlJTkNfVVNFX0NPVU5UOwotCW11dGV4X2xvY2soJnZ3c25kX211dGV4KTsKLQlmb3IgKGRldmMgPSB2d3NuZF9kZXZfbGlzdDsgZGV2YzsgZGV2YyA9IGRldmMtPm5leHRfZGV2KQotCQlpZiAoZGV2Yy0+bWl4ZXJfbWlub3IgPT0gaW1pbm9yKGlub2RlKSkKLQkJCWJyZWFrOwotCi0JaWYgKGRldmMgPT0gTlVMTCkgewotCQlERUNfVVNFX0NPVU5UOwotCQltdXRleF91bmxvY2soJnZ3c25kX211dGV4KTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldmM7Ci0JbXV0ZXhfdW5sb2NrKCZ2d3NuZF9tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIHJlbGVhc2UgKGNsb3NlKSB0aGUgbWl4ZXIgZGV2aWNlLiAqLwotCi1zdGF0aWMgaW50IHZ3c25kX21peGVyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JREJHRVYoIihpbm9kZT0weCVwLCBmaWxlPTB4JXApXG4iLCBpbm9kZSwgZmlsZSk7Ci0JREVDX1VTRV9DT1VOVDsKLQlyZXR1cm4gMDsKLX0KLQotLyogbWl4ZXJfcmVhZF9pb2N0bCBoYW5kbGVzIGFsbCByZWFkIGlvY3RscyBvbiB0aGUgbWl4ZXIgZGV2aWNlLiAqLwotCi1zdGF0aWMgaW50IG1peGVyX3JlYWRfaW9jdGwodndzbmRfZGV2X3QgKmRldmMsIHVuc2lnbmVkIGludCBuciwgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlpbnQgdmFsID0gLTE7Ci0KLQlEQkdFVigiKGRldmM9MHglcCwgbnI9MHgleCwgYXJnPTB4JXApXG4iLCBkZXZjLCBuciwgYXJnKTsKLQotCXN3aXRjaCAobnIpIHsKLQljYXNlIFNPVU5EX01JWEVSX0NBUFM6Ci0JCXZhbCA9IFNPVU5EX0NBUF9FWENMX0lOUFVUOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfREVWTUFTSzoKLQkJdmFsID0gKFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19MSU5FIHwKLQkJICAgICAgIFNPVU5EX01BU0tfTUlDIHwgU09VTkRfTUFTS19DRCB8IFNPVU5EX01BU0tfUkVDTEVWKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01JWEVSX1NURVJFT0RFVlM6Ci0JCXZhbCA9IChTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfTElORSB8Ci0JCSAgICAgICBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfQ0QgfCBTT1VORF9NQVNLX1JFQ0xFVik7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9PVVRNQVNLOgotCQl2YWwgPSAoU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX0xJTkUgfAotCQkgICAgICAgU09VTkRfTUFTS19NSUMgfCBTT1VORF9NQVNLX0NEKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6Ci0JCXZhbCA9IChTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfTElORSB8Ci0JCSAgICAgICBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfQ0QpOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfUENNOgotCQl2YWwgPSBhZDE4NDNfZ2V0X2dhaW4oJmRldmMtPmxpdGgsICZhZDE4NDNfZ2Fpbl9QQ00pOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfTElORToKLQkJdmFsID0gYWQxODQzX2dldF9nYWluKCZkZXZjLT5saXRoLCAmYWQxODQzX2dhaW5fTElORSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9NSUM6Ci0JCXZhbCA9IGFkMTg0M19nZXRfZ2FpbigmZGV2Yy0+bGl0aCwgJmFkMTg0M19nYWluX01JQyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9DRDoKLQkJdmFsID0gYWQxODQzX2dldF9nYWluKCZkZXZjLT5saXRoLCAmYWQxODQzX2dhaW5fQ0QpOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfUkVDTEVWOgotCQl2YWwgPSBhZDE4NDNfZ2V0X2dhaW4oJmRldmMtPmxpdGgsICZhZDE4NDNfZ2Fpbl9SRUNMRVYpOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgotCQl2YWwgPSBhZDE4NDNfZ2V0X3JlY3NyYygmZGV2Yy0+bGl0aCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9PVVRTUkM6Ci0JCXZhbCA9IGFkMTg0M19nZXRfb3V0c3JjKCZkZXZjLT5saXRoKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKikgYXJnKTsKLX0KLQotLyogbWl4ZXJfd3JpdGVfaW9jdGwgaGFuZGxlcyBhbGwgd3JpdGUgaW9jdGxzIG9uIHRoZSBtaXhlciBkZXZpY2UuICovCi0KLXN0YXRpYyBpbnQgbWl4ZXJfd3JpdGVfaW9jdGwodndzbmRfZGV2X3QgKmRldmMsIHVuc2lnbmVkIGludCBuciwgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlpbnQgdmFsOwotCWludCBlcnI7Ci0KLQlEQkdFVigiKGRldmM9MHglcCwgbnI9MHgleCwgYXJnPTB4JXApXG4iLCBkZXZjLCBuciwgYXJnKTsKLQotCWVyciA9IGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKikgYXJnKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlzd2l0Y2ggKG5yKSB7Ci0JY2FzZSBTT1VORF9NSVhFUl9QQ006Ci0JCXZhbCA9IGFkMTg0M19zZXRfZ2FpbigmZGV2Yy0+bGl0aCwgJmFkMTg0M19nYWluX1BDTSwgdmFsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01JWEVSX0xJTkU6Ci0JCXZhbCA9IGFkMTg0M19zZXRfZ2FpbigmZGV2Yy0+bGl0aCwgJmFkMTg0M19nYWluX0xJTkUsIHZhbCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9NSUM6Ci0JCXZhbCA9IGFkMTg0M19zZXRfZ2FpbigmZGV2Yy0+bGl0aCwgJmFkMTg0M19nYWluX01JQywgdmFsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01JWEVSX0NEOgotCQl2YWwgPSBhZDE4NDNfc2V0X2dhaW4oJmRldmMtPmxpdGgsICZhZDE4NDNfZ2Fpbl9DRCwgdmFsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01JWEVSX1JFQ0xFVjoKLQkJdmFsID0gYWQxODQzX3NldF9nYWluKCZkZXZjLT5saXRoLCAmYWQxODQzX2dhaW5fUkVDTEVWLCB2YWwpOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgotCQlpZiAoZGV2Yy0+cnBvcnQuc3didWYgfHwgZGV2Yy0+d3BvcnQuc3didWYpCi0JCQlyZXR1cm4gLUVCVVNZOwkvKiBjYW4ndCBjaGFuZ2UgcmVjc3JjIHdoaWxlIHJ1bm5pbmcgKi8KLQkJdmFsID0gYWQxODQzX3NldF9yZWNzcmMoJmRldmMtPmxpdGgsIHZhbCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9PVVRTUkM6Ci0JCXZhbCA9IGFkMTg0M19zZXRfb3V0c3JjKCZkZXZjLT5saXRoLCB2YWwpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAodmFsIDwgMCkKLQkJcmV0dXJuIHZhbDsKLQlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKSBhcmcpOwotfQotCi0vKiBUaGlzIGlzIHRoZSBpb2N0bCBlbnRyeSB0byB0aGUgbWl4ZXIgZHJpdmVyLiAqLwotCi1zdGF0aWMgbG9uZyB2d3NuZF9taXhlcl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQl2d3NuZF9kZXZfdCAqZGV2YyA9ICh2d3NuZF9kZXZfdCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY29uc3QgdW5zaWduZWQgaW50IG5ybWFzayA9IF9JT0NfTlJNQVNLIDw8IF9JT0NfTlJTSElGVDsKLQljb25zdCB1bnNpZ25lZCBpbnQgbnIgPSAoY21kICYgbnJtYXNrKSA+PiBfSU9DX05SU0hJRlQ7Ci0JaW50IHJldHZhbDsKLQotCURCR0VWKCIoZGV2Yz0weCVwLCBjbWQ9MHgleCwgYXJnPTB4JWx4KVxuIiwgZGV2YywgY21kLCBhcmcpOwotCi0JbXV0ZXhfbG9jaygmdndzbmRfbXV0ZXgpOwotCW11dGV4X2xvY2soJmRldmMtPm1peF9tdXRleCk7Ci0JewotCQlpZiAoKGNtZCAmIH5ucm1hc2spID09IE1JWEVSX1JFQUQoMCkpCi0JCQlyZXR2YWwgPSBtaXhlcl9yZWFkX2lvY3RsKGRldmMsIG5yLCAodm9pZCBfX3VzZXIgKikgYXJnKTsKLQkJZWxzZSBpZiAoKGNtZCAmIH5ucm1hc2spID09IE1JWEVSX1dSSVRFKDApKQotCQkJcmV0dmFsID0gbWl4ZXJfd3JpdGVfaW9jdGwoZGV2YywgbnIsICh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQllbHNlCi0JCQlyZXR2YWwgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJmRldmMtPm1peF9tdXRleCk7Ci0JbXV0ZXhfdW5sb2NrKCZ2d3NuZF9tdXRleCk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdndzbmRfbWl4ZXJfZm9wcyA9IHsKLQkub3duZXIgPQlUSElTX01PRFVMRSwKLQkubGxzZWVrID0Jbm9fbGxzZWVrLAotCS51bmxvY2tlZF9pb2N0bCA9IHZ3c25kX21peGVyX2lvY3RsLAotCS5vcGVuID0JCXZ3c25kX21peGVyX29wZW4sCi0JLnJlbGVhc2UgPQl2d3NuZF9taXhlcl9yZWxlYXNlLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogcHJvYmUvYXR0YWNoL3VubG9hZCAqLwotCi0vKiBkcml2ZXIgcHJvYmUgcm91dGluZS4gIFJldHVybiBub256ZXJvIGlmIGhhcmR3YXJlIGlzIGZvdW5kLiAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBwcm9iZV92d3NuZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCi17Ci0JbGl0aGl1bV90IGxpdGg7Ci0JaW50IHc7Ci0JdW5zaWduZWQgbG9uZyBsYXRlcjsKLQotCURCR0VWKCIoaHdfY29uZmlnPTB4JXApXG4iLCBod19jb25maWcpOwotCi0JLyogWFhYIHZlcmlmeSBsaXRoaXVtIHByZXNlbnQgKHRvIHByZXZlbnQgY3Jhc2ggb24gbm9uLXZ3KSAqLwotCi0JaWYgKGxpX2NyZWF0ZSgmbGl0aCwgaHdfY29uZmlnLT5pb19iYXNlKSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInByb2JlX3Z3c25kOiBjYW4ndCBtYXAgbGl0aGl1bVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlsYXRlciA9IGppZmZpZXMgKyAyOwotCWxpX3dyaXRlbCgmbGl0aCwgTElfSE9TVF9DT05UUk9MTEVSLCBMSV9IQ19MSU5LX0VOQUJMRSk7Ci0JZG8gewotCQl3ID0gbGlfcmVhZGwoJmxpdGgsIExJX0hPU1RfQ09OVFJPTExFUik7Ci0JfSB3aGlsZSAodyA9PSBMSV9IQ19MSU5LX0VOQUJMRSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCBsYXRlcikpOwotCQotCWxpX2Rlc3Ryb3koJmxpdGgpOwotCi0JREJHUFYoIkhDID0gMHglMDR4XG4iLCB3KTsKLQotCWlmICgodyA9PSBMSV9IQ19MSU5LX0VOQUJMRSkgfHwgKHcgJiBMSV9IQ19MSU5LX0NPREVDKSkgewotCi0JCS8qIFRoaXMgbWF5IGluZGljYXRlIGEgYmV0YSBtYWNoaW5lIHdpdGggbm8gYXVkaW8sCi0JCSAqIG9yIGEgZnV0dXJlIG1hY2hpbmUgd2l0aCBkaWZmZXJlbnQgYXVkaW8uCi0JCSAqIE9uIGJldGEtcmVsZWFzZSAzMjAgdy8gbm8gYXVkaW8sIEhDID09IDB4NDAwMCAqLwotCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgInByb2JlX3Z3c25kOiBhdWRpbyBjb2RlYyBub3QgZm91bmRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAodyAmIExJX0hDX0xJTktfRkFJTFVSRSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwcm9iZV92d3NuZDogY2FuJ3QgaW5pdCBhdWRpbyBjb2RlY1xuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCXByaW50ayhLRVJOX0lORk8gInZ3c25kOiBsaXRoaXVtIGF1ZGlvIGF0IG1taW8gJSN4IGlycSAlZFxuIiwKLQkJaHdfY29uZmlnLT5pb19iYXNlLCBod19jb25maWctPmlycSk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyoKLSAqIGRyaXZlciBhdHRhY2ggcm91dGluZS4gIEluaXRpYWxpemUgZHJpdmVyIGRhdGEgc3RydWN0dXJlcyBhbmQKLSAqIGluaXRpYWxpemUgaGFyZHdhcmUuICBBIG5ldyB2d3NuZF9kZXZfdCBpcyBhbGxvY2F0ZWQgYW5kIHB1dAotICogb250byB0aGUgZ2xvYmFsIGxpc3QsIHZ3c25kX2Rldl9saXN0LgotICoKLSAqIFJldHVybiArbWlub3JfZGV2IG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGF0dGFjaF92d3NuZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCi17Ci0JdndzbmRfZGV2X3QgKmRldmMgPSBOVUxMOwotCWludCBlcnIgPSAtRU5PTUVNOwotCi0JREJHRVYoIihod19jb25maWc9MHglcClcbiIsIGh3X2NvbmZpZyk7Ci0KLQlkZXZjID0ga21hbGxvYyhzaXplb2YgKHZ3c25kX2Rldl90KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRldmMgPT0gTlVMTCkKLQkJZ290byBmYWlsMDsKLQotCWVyciA9IGxpX2NyZWF0ZSgmZGV2Yy0+bGl0aCwgaHdfY29uZmlnLT5pb19iYXNlKTsKLQlpZiAoZXJyKQotCQlnb3RvIGZhaWwxOwotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2Yy0+b3Blbl93YWl0KTsKLQotCWRldmMtPnJwb3J0Lmh3YnVmX3NpemUgPSBIV0JVRl9TSVpFOwotCWRldmMtPnJwb3J0Lmh3YnVmX3ZhZGRyID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBIV0JVRl9PUkRFUik7Ci0JaWYgKCFkZXZjLT5ycG9ydC5od2J1Zl92YWRkcikKLQkJZ290byBmYWlsMjsKLQlkZXZjLT5ycG9ydC5od2J1ZiA9ICh2b2lkICopIGRldmMtPnJwb3J0Lmh3YnVmX3ZhZGRyOwotCWRldmMtPnJwb3J0Lmh3YnVmX3BhZGRyID0gdmlydF90b19waHlzKGRldmMtPnJwb3J0Lmh3YnVmKTsKLQotCS8qCi0JICogUXVvdGUgZnJvbSB0aGUgTlQgZHJpdmVyOgotCSAqCi0JICogLy8gV0FSTklORyEhISBIQUNLIHRvIHNldHVwIG91dHB1dCBkbWEhISEKLQkgKiAvLyBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgZXZlbiBvbiBvdXRwdXQgdGhlcmUgaXMgc29tZSBkYXRhCi0JICogLy8gdHJpY2tsaW5nIGludG8gdGhlIGlucHV0IERNQSBjaGFubmVsLiAgVGhpcyBpcyBhIGJ1ZyBpbiB0aGUKLQkgKiAvLyBMaXRoaXVtIG1pY3JvY29kZS4KLQkgKiAvLyAtLXNkZQotCSAqCi0JICogV2Ugc2V0IHRoZSBpbnB1dCBzaWRlJ3MgRE1BIGJhc2UgYWRkcmVzcyBoZXJlLiAgSXQgd2lsbCByZW1haW4KLQkgKiB2YWxpZCB1bnRpbCB0aGUgZHJpdmVyIGlzIHVubG9hZGVkLgotCSAqLwotCi0JbGlfd3JpdGVsKCZkZXZjLT5saXRoLCBMSV9DT01NMV9CQVNFLAotCQkgIGRldmMtPnJwb3J0Lmh3YnVmX3BhZGRyID4+IDggfCAxIDw8ICgzNyAtIDgpKTsKLQotCWRldmMtPndwb3J0Lmh3YnVmX3NpemUgPSBIV0JVRl9TSVpFOwotCWRldmMtPndwb3J0Lmh3YnVmX3ZhZGRyID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBIV0JVRl9PUkRFUik7Ci0JaWYgKCFkZXZjLT53cG9ydC5od2J1Zl92YWRkcikKLQkJZ290byBmYWlsMzsKLQlkZXZjLT53cG9ydC5od2J1ZiA9ICh2b2lkICopIGRldmMtPndwb3J0Lmh3YnVmX3ZhZGRyOwotCWRldmMtPndwb3J0Lmh3YnVmX3BhZGRyID0gdmlydF90b19waHlzKGRldmMtPndwb3J0Lmh3YnVmKTsKLQlEQkdQKCJ3cG9ydCBod2J1ZiA9IDB4JXBcbiIsIGRldmMtPndwb3J0Lmh3YnVmKTsKLQotCURCR0RPKHNodXRfdXArKyk7Ci0JZXJyID0gYWQxODQzX2luaXQoJmRldmMtPmxpdGgpOwotCURCR0RPKHNodXRfdXAtLSk7Ci0JaWYgKGVycikKLQkJZ290byBmYWlsNDsKLQotCS8qIGluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXIgKi8KLQotCWVyciA9IHJlcXVlc3RfaXJxKGh3X2NvbmZpZy0+aXJxLCB2d3NuZF9hdWRpb19pbnRyLCAwLCAidndzbmQiLCBkZXZjKTsKLQlpZiAoZXJyKQotCQlnb3RvIGZhaWw1OwotCi0JLyogcmVnaXN0ZXIgdGhpcyBkZXZpY2UncyBkcml2ZXJzLiAqLwotCi0JZGV2Yy0+YXVkaW9fbWlub3IgPSByZWdpc3Rlcl9zb3VuZF9kc3AoJnZ3c25kX2F1ZGlvX2ZvcHMsIC0xKTsKLQlpZiAoKGVyciA9IGRldmMtPmF1ZGlvX21pbm9yKSA8IDApIHsKLQkJREJHRE8ocHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAiYXR0YWNoX3Z3c25kOiByZWdpc3Rlcl9zb3VuZF9kc3AgZXJyb3IgJWRcbiIsCi0JCQkgICAgIGVycikpOwotCQlnb3RvIGZhaWw2OwotCX0KLQlkZXZjLT5taXhlcl9taW5vciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZ2d3NuZF9taXhlcl9mb3BzLAotCQkJCQkJIGRldmMtPmF1ZGlvX21pbm9yID4+IDQpOwotCWlmICgoZXJyID0gZGV2Yy0+bWl4ZXJfbWlub3IpIDwgMCkgewotCQlEQkdETyhwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICJhdHRhY2hfdndzbmQ6IHJlZ2lzdGVyX3NvdW5kX21peGVyIGVycm9yICVkXG4iLAotCQkJICAgICBlcnIpKTsKLQkJZ290byBmYWlsNzsKLQl9Ci0KLQkvKiBTcXVpcnJlbCBhd2F5IGRldmljZSBpbmRpY2VzIGZvciB1bmxvYWQgcm91dGluZS4gKi8KLQotCWh3X2NvbmZpZy0+c2xvdHNbMF0gPSBkZXZjLT5hdWRpb19taW5vcjsKLQotCS8qIEluaXRpYWxpemUgYXMgbXVjaCBvZiAqZGV2YyBhcyBwb3NzaWJsZSAqLwotCi0JbXV0ZXhfaW5pdCgmZGV2Yy0+b3Blbl9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmZGV2Yy0+aW9fbXV0ZXgpOwotCW11dGV4X2luaXQoJmRldmMtPm1peF9tdXRleCk7Ci0JZGV2Yy0+b3Blbl9tb2RlID0gMDsKLQlzcGluX2xvY2tfaW5pdCgmZGV2Yy0+cnBvcnQubG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2Yy0+cnBvcnQucXVldWUpOwotCWRldmMtPnJwb3J0LnN3c3RhdGUgPSBTV19PRkY7Ci0JZGV2Yy0+cnBvcnQuaHdzdGF0ZSA9IEhXX1NUT1BQRUQ7Ci0JZGV2Yy0+cnBvcnQuZmxhZ3MgPSAwOwotCWRldmMtPnJwb3J0LnN3YnVmID0gTlVMTDsKLQlzcGluX2xvY2tfaW5pdCgmZGV2Yy0+d3BvcnQubG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2Yy0+d3BvcnQucXVldWUpOwotCWRldmMtPndwb3J0LnN3c3RhdGUgPSBTV19PRkY7Ci0JZGV2Yy0+d3BvcnQuaHdzdGF0ZSA9IEhXX1NUT1BQRUQ7Ci0JZGV2Yy0+d3BvcnQuZmxhZ3MgPSAwOwotCWRldmMtPndwb3J0LnN3YnVmID0gTlVMTDsKLQotCS8qIFN1Y2Nlc3MuICBMaW5rIHVzIG9udG8gdGhlIGxvY2FsIGRldmljZSBsaXN0LiAqLwotCi0JZGV2Yy0+bmV4dF9kZXYgPSB2d3NuZF9kZXZfbGlzdDsKLQl2d3NuZF9kZXZfbGlzdCA9IGRldmM7Ci0JcmV0dXJuIGRldmMtPmF1ZGlvX21pbm9yOwotCi0JLyogU28gbWFueSB3YXlzIHRvIGZhaWwuICBVbmRvIHdoYXQgd2UgZGlkLiAqLwotCi0gZmFpbDc6Ci0JdW5yZWdpc3Rlcl9zb3VuZF9kc3AoZGV2Yy0+YXVkaW9fbWlub3IpOwotIGZhaWw2OgotCWZyZWVfaXJxKGh3X2NvbmZpZy0+aXJxLCBkZXZjKTsKLSBmYWlsNToKLSBmYWlsNDoKLQlmcmVlX3BhZ2VzKGRldmMtPndwb3J0Lmh3YnVmX3ZhZGRyLCBIV0JVRl9PUkRFUik7Ci0gZmFpbDM6Ci0JZnJlZV9wYWdlcyhkZXZjLT5ycG9ydC5od2J1Zl92YWRkciwgSFdCVUZfT1JERVIpOwotIGZhaWwyOgotCWxpX2Rlc3Ryb3koJmRldmMtPmxpdGgpOwotIGZhaWwxOgotCWtmcmVlKGRldmMpOwotIGZhaWwwOgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgX19leGl0IHVubG9hZF92d3NuZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCi17Ci0JdndzbmRfZGV2X3QgKmRldmMsICoqZGV2Y3A7Ci0KLQlEQkdFKCIoKVxuIik7Ci0KLQlkZXZjcCA9ICZ2d3NuZF9kZXZfbGlzdDsKLQl3aGlsZSAoKGRldmMgPSAqZGV2Y3ApKSB7Ci0JCWlmIChkZXZjLT5hdWRpb19taW5vciA9PSBod19jb25maWctPnNsb3RzWzBdKSB7Ci0JCQkqZGV2Y3AgPSBkZXZjLT5uZXh0X2RldjsKLQkJCWJyZWFrOwotCQl9Ci0JCWRldmNwID0gJmRldmMtPm5leHRfZGV2OwotCX0KLQotCWlmICghZGV2YykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGRldmMtPm1peGVyX21pbm9yKTsKLQl1bnJlZ2lzdGVyX3NvdW5kX2RzcChkZXZjLT5hdWRpb19taW5vcik7Ci0JZnJlZV9pcnEoaHdfY29uZmlnLT5pcnEsIGRldmMpOwotCWZyZWVfcGFnZXMoZGV2Yy0+d3BvcnQuaHdidWZfdmFkZHIsIEhXQlVGX09SREVSKTsKLQlmcmVlX3BhZ2VzKGRldmMtPnJwb3J0Lmh3YnVmX3ZhZGRyLCBIV0JVRl9PUkRFUik7Ci0JbGlfZGVzdHJveSgmZGV2Yy0+bGl0aCk7Ci0Ja2ZyZWUoZGV2Yyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogaW5pdGlhbGl6YXRpb24gYW5kIGxvYWRhYmxlIGtlcm5lbCBtb2R1bGUgaW50ZXJmYWNlICovCi0KLXN0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIHRoZV9od19jb25maWcgPSB7Ci0JMHhGRjAwMTAwMCwJCQkvKiBsaXRoaXVtIHBoeXMgYWRkciAgKi8KLQlDT19JUlEoQ09fQVBJQ19MSV9BVURJTykJLyogaXJxICovCi19OwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlNHSSBWaXN1YWwgV29ya3N0YXRpb24gc291bmQgbW9kdWxlIik7Ci1NT0RVTEVfQVVUSE9SKCJCb2IgTWlsbGVyIDxrYm9iQHNnaS5jb20+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXRfdndzbmQodm9pZCkKLXsKLQlpbnQgZXJyOwotCi0JREJHWFYoIlxuIik7Ci0JREJHWFYoInNvdW5kOjp2d3NuZDo6aW5pdF9tb2R1bGUoKVxuIik7Ci0KLQlpZiAoIXByb2JlX3Z3c25kKCZ0aGVfaHdfY29uZmlnKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQllcnIgPSBhdHRhY2hfdndzbmQoJnRoZV9od19jb25maWcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF92d3NuZCh2b2lkKQotewotCURCR1goInNvdW5kOjp2d3NuZDo6Y2xlYW51cF9tb2R1bGUoKVxuIik7Ci0KLQl1bmxvYWRfdndzbmQoJnRoZV9od19jb25maWcpOwotfQotCi1tb2R1bGVfaW5pdChpbml0X3Z3c25kKTsKLW1vZHVsZV9leGl0KGNsZWFudXBfdndzbmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGFyaXNjL2hhcm1vbnkuYyBiL3NvdW5kL3BhcmlzYy9oYXJtb255LmMKaW5kZXggNjdmNTZhMi4uNGIyMGJlNyAxMDA2NDQKLS0tIGEvc291bmQvcGFyaXNjL2hhcm1vbnkuYworKysgYi9zb3VuZC9wYXJpc2MvaGFybW9ueS5jCkBAIC05NTksOCArOTU5LDYgQEAKICAgICAgICAgICAgICAgICBnb3RvIGZyZWVfYW5kX3JldDsKICAgICAgICAgfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGFkZXYtPmRldik7Ci0KIAkqcmNoaXAgPSBoOwogCiAJcmV0dXJuIDA7CkBAIC05NzcsNyArOTc1LDcgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9oYXJtb255ICpoOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBhZGV2LT5kZXYsIGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL0tjb25maWcgYi9zb3VuZC9wY2kvS2NvbmZpZwppbmRleCA4NzU2YzhlLi4wYjBjMGNmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvS2NvbmZpZworKysgYi9zb3VuZC9wY2kvS2NvbmZpZwpAQCAtMjc2LDcgKzI3Niw3IEBACiAKIGNvbmZpZyBTTkRfQ1M1NTMwCiAJdHJpc3RhdGUgIkNTNTUzMCBBdWRpbyIKLQlkZXBlbmRzIG9uIElTQV9ETUFfQVBJCisJZGVwZW5kcyBvbiBJU0FfRE1BX0FQSSAmJiAoWDg2XzMyIHx8IENPTVBJTEVfVEVTVCkKIAlzZWxlY3QgU05EX1NCMTZfRFNQCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIGF1ZGlvIG9uIEN5cml4L05hdFNlbWkgQ1M1NTMwIGNoaXBzLgpAQCAtMjg2LDYgKzI4Niw3IEBACiAKIGNvbmZpZyBTTkRfQ1M1NTM1QVVESU8KIAl0cmlzdGF0ZSAiQ1M1NTM1L0NTNTUzNiBBdWRpbyIKKwlkZXBlbmRzIG9uIFg4Nl8zMiB8fCBNSVBTIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBTTkRfUENNCiAJc2VsZWN0IFNORF9BQzk3X0NPREVDCiAJaGVscApAQCAtNTc4LDggKzU3OSw2IEBACiAJICBGTTgwMSBjaGlwIHdpdGggYSBURUE1NzU3IHR1bmVyIChNZWRpYUZvcnRlIFNGMjU2LVBDUywgU0YyNTYtUENQIGFuZAogCSAgU0Y2NC1QQ1IpIGludG8gdGhlIHNuZC1mbTgwMSBkcml2ZXIuCiAKLXNvdXJjZSAic291bmQvcGNpL2hkYS9LY29uZmlnIgotCiBjb25maWcgU05EX0hEU1AKIAl0cmlzdGF0ZSAiUk1FIEhhbW1lcmZhbGwgRFNQIEF1ZGlvIgogCXNlbGVjdCBGV19MT0FERVIKQEAgLTc5Niw3ICs3OTUsNyBAQAogCiBjb25maWcgU05EX1NJUzcwMTkKIAl0cmlzdGF0ZSAiU2lTIDcwMTkgQXVkaW8gQWNjZWxlcmF0b3IiCi0JZGVwZW5kcyBvbiBYODYgJiYgIVg4Nl82NAorCWRlcGVuZHMgb24gWDg2XzMyCiAJc2VsZWN0IFNORF9BQzk3X0NPREVDCiAJc2VsZWN0IFpPTkVfRE1BCiAJaGVscApAQCAtODg5LDMgKzg4OCw1IEBACiAJICB3aWxsIGJlIGNhbGxlZCBzbmQteW1mcGNpLgogCiBlbmRpZgkjIFNORF9QQ0kKKworc291cmNlICJzb3VuZC9wY2kvaGRhL0tjb25maWciCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMKaW5kZXggYmY1NzhiYTIuLjE0YWQ1NGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYworKysgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMKQEAgLTIxNCw2ICsyMTQsMTIgQEAKICNkZWZpbmUgYWM5N19pc19wb3dlcl9zYXZlX21vZGUoYWM5NykgMAogI2VuZGlmCiAKKyNkZWZpbmUgYWM5N19lcnIoYWM5NywgZm10LCBhcmdzLi4uKQlcCisJZGV2X2VycigoYWM5NyktPmJ1cy0+Y2FyZC0+ZGV2LCBmbXQsICMjYXJncykKKyNkZWZpbmUgYWM5N193YXJuKGFjOTcsIGZtdCwgYXJncy4uLikJXAorCWRldl93YXJuKChhYzk3KS0+YnVzLT5jYXJkLT5kZXYsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBhYzk3X2RiZyhhYzk3LCBmbXQsIGFyZ3MuLi4pCVwKKwlkZXZfZGJnKChhYzk3KS0+YnVzLT5jYXJkLT5kZXYsIGZtdCwgIyNhcmdzKQogCiAvKgogICogIEkvTyByb3V0aW5lcwpAQCAtMTY3Myw3ICsxNjc5LDcgQEAKIAlpbnQgZXJyLCBpZHg7CiAKIAkvKgotCXByaW50ayhLRVJOX0RFQlVHICJBQzk3X0dQSU9fQ0ZHID0gJXhcbiIsCisJYWM5N19kYmcoYWM5NywgIkFDOTdfR1BJT19DRkcgPSAleFxuIiwKIAkgICAgICAgc25kX2FjOTdfcmVhZChhYzk3LEFDOTdfR1BJT19DRkcpKTsKIAkqLwogCXNuZF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfR1BJT19DRkcsIDB4ZmZmZiAmIH4oQUM5N19HUElPX0xJTkUxX09IKSk7CkBAIC0xOTYzLDcgKzE5NjksNyBAQAogCQkgICAgIGFjOTctPmJ1cy0+Y2FyZC0+bnVtYmVyLCBhYzk3LT5udW0sCiAJCSAgICAgc25kX2FjOTdfZ2V0X3Nob3J0X25hbWUoYWM5NykpOwogCWlmICgoZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZhYzk3LT5kZXYpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgcmVnaXN0ZXIgYWM5NyBidXNcbiIpOworCQlhYzk3X2VycihhYzk3LCAiQ2FuJ3QgcmVnaXN0ZXIgYWM5NyBidXNcbiIpOwogCQlhYzk3LT5kZXYuYnVzID0gTlVMTDsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC0yMDg5LDcgKzIwOTUsOCBAQAogCQkJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyg1MDApLCAxKTsKIAkJfQogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkFDJzk3ICVkIGRvZXMgbm90IHJlc3BvbmQgLSBSRVNFVFxuIiwgYWM5Ny0+bnVtKTsKKwkJCWFjOTdfd2FybihhYzk3LCAiQUMnOTcgJWQgZG9lcyBub3QgcmVzcG9uZCAtIFJFU0VUXG4iLAorCQkJCSBhYzk3LT5udW0pOwogCQkJLyogcHJvY2VlZCBhbnl3YXkgLSBpdCdzIG9mdGVuIG5vbi1jcml0aWNhbCAqLwogCQl9CiAJfQpAQCAtMjA5OCw3ICsyMTA1LDkgQEAKIAlhYzk3LT5pZCB8PSBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfVkVORE9SX0lEMik7CiAJaWYgKCEgKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX0RFVEVDVF9CWV9WRU5ET1IpICYmCiAJICAgIChhYzk3LT5pZCA9PSAweDAwMDAwMDAwIHx8IGFjOTctPmlkID09IDB4ZmZmZmZmZmYpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3ICVkIGFjY2VzcyBpcyBub3QgdmFsaWQgWzB4JXhdLCByZW1vdmluZyBtaXhlci5cbiIsIGFjOTctPm51bSwgYWM5Ny0+aWQpOworCQlhYzk3X2VycihhYzk3LAorCQkJICJBQyc5NyAlZCBhY2Nlc3MgaXMgbm90IHZhbGlkIFsweCV4XSwgcmVtb3ZpbmcgbWl4ZXIuXG4iLAorCQkJIGFjOTctPm51bSwgYWM5Ny0+aWQpOwogCQlzbmRfYWM5N19mcmVlKGFjOTcpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yMTMxLDcgKzIxNDAsOSBAQAogCiAJaWYgKCFhYzk3X2lzX2F1ZGlvKGFjOTcpICYmICFhYzk3X2lzX21vZGVtKGFjOTcpKSB7CiAJCWlmICghKGFjOTctPnNjYXBzICYgKEFDOTdfU0NBUF9TS0lQX0FVRElPfEFDOTdfU0NBUF9TS0lQX01PREVNKSkpCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyAlZCBhY2Nlc3MgZXJyb3IgKG5vdCBhdWRpbyBvciBtb2RlbSBjb2RlYylcbiIsIGFjOTctPm51bSk7CisJCQlhYzk3X2VycihhYzk3LAorCQkJCSAiQUMnOTcgJWQgYWNjZXNzIGVycm9yIChub3QgYXVkaW8gb3IgbW9kZW0gY29kZWMpXG4iLAorCQkJCSBhYzk3LT5udW0pOwogCQlzbmRfYWM5N19mcmVlKGFjOTcpOwogCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CkBAIC0yMTU2LDcgKzIxNjcsOCBAQAogCQkJCWdvdG8gX19yZWFkeV9vazsKIAkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCQl9IHdoaWxlICh0aW1lX2FmdGVyX2VxKGVuZF90aW1lLCBqaWZmaWVzKSk7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJBQyc5NyAlZCBhbmFsb2cgc3Vic2VjdGlvbnMgbm90IHJlYWR5XG4iLCBhYzk3LT5udW0pOworCQlhYzk3X3dhcm4oYWM5NywKKwkJCSAgIkFDJzk3ICVkIGFuYWxvZyBzdWJzZWN0aW9ucyBub3QgcmVhZHlcbiIsIGFjOTctPm51bSk7CiAJfQogCiAJLyogRklYTUU6IGFkZCBwb3dlcmRvd24gY29udHJvbCAqLwpAQCAtMjE4OCw3ICsyMjAwLDEwIEBACiAJCQkJZ290byBfX3JlYWR5X29rOwogCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIk1DJzk3ICVkIGNvbnZlcnRlcnMgYW5kIEdQSU8gbm90IHJlYWR5ICgweCV4KVxuIiwgYWM5Ny0+bnVtLCBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfRVhURU5ERURfTVNUQVRVUykpOworCQlhYzk3X3dhcm4oYWM5NywKKwkJCSAgIk1DJzk3ICVkIGNvbnZlcnRlcnMgYW5kIEdQSU8gbm90IHJlYWR5ICgweCV4KVxuIiwKKwkJCSAgYWM5Ny0+bnVtLAorCQkJICBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfRVhURU5ERURfTVNUQVRVUykpOwogCX0KIAkKICAgICAgIF9fcmVhZHlfb2s6CkBAIC0yNzIzLDcgKzI3MzgsNyBAQAogewogCXVuc2lnbmVkIHNob3J0IHNjZmc7CiAJaWYgKChhYzk3LT5pZCAmIDB4ZmZmZmZmMDApICE9IDB4NDE0NDUzMDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWM5N19xdWlyayBBRF9TSEFSSU5HIGlzIG9ubHkgZm9yIEFEIGNvZGVjc1xuIik7CisJCWFjOTdfZXJyKGFjOTcsICJhYzk3X3F1aXJrIEFEX1NIQVJJTkcgaXMgb25seSBmb3IgQUQgY29kZWNzXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCS8qIFR1cm4gb24gT01TIGJpdCB0byByb3V0ZSBtaWNyb3Bob25lIHRvIGJhY2sgcGFuZWwgKi8KQEAgLTI3MzksNyArMjc1NCw4IEBACiBzdGF0aWMgaW50IHR1bmVfYWxjX2phY2soc3RydWN0IHNuZF9hYzk3ICphYzk3KQogewogCWlmICgoYWM5Ny0+aWQgJiAweGZmZmZmZjAwKSAhPSAweDQxNGM0NzAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFjOTdfcXVpcmsgQUxDX0pBQ0sgaXMgb25seSBmb3IgUmVhbHRlayBjb2RlY3NcbiIpOworCQlhYzk3X2VycihhYzk3LAorCQkJICJhYzk3X3F1aXJrIEFMQ19KQUNLIGlzIG9ubHkgZm9yIFJlYWx0ZWsgY29kZWNzXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIDB4N2EsIDB4MjAsIDB4MjApOyAvKiBzZWxlY3QgamFjayBkZXRlY3QgZnVuY3Rpb24gKi8KQEAgLTI4OTksNyArMjkxNSw4IEBACiAJaWYgKG92ZXJyaWRlICYmIHN0cmNtcChvdmVycmlkZSwgIi0xIikgJiYgc3RyY21wKG92ZXJyaWRlLCAiZGVmYXVsdCIpKSB7CiAJCXJlc3VsdCA9IGFwcGx5X3F1aXJrX3N0cihhYzk3LCBvdmVycmlkZSk7CiAJCWlmIChyZXN1bHQgPCAwKQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXBwbHlpbmcgcXVpcmsgdHlwZSAlcyBmYWlsZWQgKCVkKVxuIiwgb3ZlcnJpZGUsIHJlc3VsdCk7CisJCQlhYzk3X2VycihhYzk3LCAiYXBwbHlpbmcgcXVpcmsgdHlwZSAlcyBmYWlsZWQgKCVkKVxuIiwKKwkJCQkgb3ZlcnJpZGUsIHJlc3VsdCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCkBAIC0yOTEzLDEwICsyOTMwLDE0IEBACiAJCSAgICBxdWlyay0+c3ViZGV2aWNlID09IChxdWlyay0+bWFzayAmIGFjOTctPnN1YnN5c3RlbV9kZXZpY2UpKSB7CiAJCQlpZiAocXVpcmstPmNvZGVjX2lkICYmIHF1aXJrLT5jb2RlY19pZCAhPSBhYzk3LT5pZCkKIAkJCQljb250aW51ZTsKLQkJCXNuZF9wcmludGRkKCJhYzk3IHF1aXJrIGZvciAlcyAoJTA0eDolMDR4KVxuIiwgcXVpcmstPm5hbWUsIGFjOTctPnN1YnN5c3RlbV92ZW5kb3IsIGFjOTctPnN1YnN5c3RlbV9kZXZpY2UpOworCQkJYWM5N19kYmcoYWM5NywgImFjOTcgcXVpcmsgZm9yICVzICglMDR4OiUwNHgpXG4iLAorCQkJCSBxdWlyay0+bmFtZSwgYWM5Ny0+c3Vic3lzdGVtX3ZlbmRvciwKKwkJCQkgYWM5Ny0+c3Vic3lzdGVtX2RldmljZSk7CiAJCQlyZXN1bHQgPSBhcHBseV9xdWlyayhhYzk3LCBxdWlyay0+dHlwZSk7CiAJCQlpZiAocmVzdWx0IDwgMCkKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhcHBseWluZyBxdWlyayB0eXBlICVkIGZvciAlcyBmYWlsZWQgKCVkKVxuIiwgcXVpcmstPnR5cGUsIHF1aXJrLT5uYW1lLCByZXN1bHQpOworCQkJCWFjOTdfZXJyKGFjOTcsCisJCQkJCSAiYXBwbHlpbmcgcXVpcmsgdHlwZSAlZCBmb3IgJXMgZmFpbGVkICglZClcbiIsCisJCQkJCSBxdWlyay0+dHlwZSwgcXVpcmstPm5hbWUsIHJlc3VsdCk7CiAJCQlyZXR1cm4gcmVzdWx0OwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5jIGIvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5jCmluZGV4IDY2YTNiYzkuLjk5MTc2MjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guYworKysgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmMKQEAgLTM0NzcsNyArMzQ3Nyw4IEBACiAKIAkJc2N0bCA9IHNuZF9hYzk3X2ZpbmRfbWl4ZXJfY3RsKGFjOTcsICpzKTsKIAkJaWYgKCFzY3RsKSB7Ci0JCQlzbmRfcHJpbnRkZCgiQ2Fubm90IGZpbmQgc2xhdmUgJXMsIHNraXBwZWRcbiIsICpzKTsKKwkJCWRldl9kYmcoYWM5Ny0+YnVzLT5jYXJkLT5kZXYsCisJCQkJIkNhbm5vdCBmaW5kIHNsYXZlICVzLCBza2lwcGVkXG4iLCAqcyk7CiAJCQljb250aW51ZTsKIAkJfQogCQllcnIgPSBzbmRfY3RsX2FkZF9zbGF2ZShrY3RsLCBzY3RsKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGNtLmMgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BjbS5jCmluZGV4IGVhYjBmYzkuLmQxNTI5N2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGNtLmMKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19wY20uYwpAQCAtNjA0LDcgKzYwNCw5IEBACiAJCX0KIAkJaWYgKCFva19mbGFnKSB7CiAJCQlzcGluX3VubG9ja19pcnEoJnBjbS0+YnVzLT5idXNfbG9jayk7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZmluZCBjb25maWd1cmF0aW9uIGZvciBBQzk3IHNsb3QgJWlcbiIsIGkpOworCQkJZGV2X2VycihidXMtPmNhcmQtPmRldiwKKwkJCQkiY2Fubm90IGZpbmQgY29uZmlndXJhdGlvbiBmb3IgQUM5NyBzbG90ICVpXG4iLAorCQkJCWkpOwogCQkJZXJyID0gLUVBR0FJTjsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KQEAgLTYxOCwxNSArNjIwLDIwIEBACiAJCQlpZiAocGNtLT5yW3JdLnJzbG90c1tjaWR4XSAmICgxIDw8IGkpKSB7CiAJCQkJcmVnID0gZ2V0X3Nsb3RfcmVnKHBjbSwgY2lkeCwgaSwgcik7CiAJCQkJaWYgKHJlZyA9PSAweGZmKSB7Ci0JCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgQUM5NyBzbG90ICVpP1xuIiwgaSk7CisJCQkJCWRldl9lcnIoYnVzLT5jYXJkLT5kZXYsCisJCQkJCQkiaW52YWxpZCBBQzk3IHNsb3QgJWk/XG4iLCBpKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCQkJCWlmIChyZWdfb2tbY2lkeF0gJiAoMSA8PCAocmVnIC0gQUM5N19QQ01fRlJPTlRfREFDX1JBVEUpKSkKIAkJCQkJY29udGludWU7Ci0JCQkJLy9wcmludGsoS0VSTl9ERUJVRyAic2V0dGluZyBhYzk3IHJlZyAweCV4IHRvIHJhdGUgJWRcbiIsIHJlZywgcmF0ZSk7CisJCQkJZGV2X2RiZyhidXMtPmNhcmQtPmRldiwKKwkJCQkJInNldHRpbmcgYWM5NyByZWcgMHgleCB0byByYXRlICVkXG4iLAorCQkJCQlyZWcsIHJhdGUpOwogCQkJCWVyciA9IHNuZF9hYzk3X3NldF9yYXRlKHBjbS0+cltyXS5jb2RlY1tjaWR4XSwgcmVnLCByYXRlKTsKIAkJCQlpZiAoZXJyIDwgMCkKLQkJCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgaW4gc25kX2FjOTdfc2V0X3JhdGU6IGNpZHg9JWQsIHJlZz0weCV4LCByYXRlPSVkLCBlcnI9JWRcbiIsIGNpZHgsIHJlZywgcmF0ZSwgZXJyKTsKKwkJCQkJZGV2X2VycihidXMtPmNhcmQtPmRldiwKKwkJCQkJCSJlcnJvciBpbiBzbmRfYWM5N19zZXRfcmF0ZTogY2lkeD0lZCwgcmVnPTB4JXgsIHJhdGU9JWQsIGVycj0lZFxuIiwKKwkJCQkJCWNpZHgsIHJlZywgcmF0ZSwgZXJyKTsKIAkJCQllbHNlCiAJCQkJCXJlZ19va1tjaWR4XSB8PSAoMSA8PCAocmVnIC0gQUM5N19QQ01fRlJPTlRfREFDX1JBVEUpKTsKIAkJCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hZDE4ODkuYyBiL3NvdW5kL3BjaS9hZDE4ODkuYwppbmRleCBiNjgwZDAzLi40ODhmOTY2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWQxODg5LmMKKysrIGIvc291bmQvcGNpL2FkMTg4OS5jCkBAIC03Nyw5ICs3Nyw2IEBACiAjZGVmaW5lIERFVk5BTUUgImFkMTg4OSIKICNkZWZpbmUgUEZYCURFVk5BTUUgIjogIgogCi0vKiBsZXQncyB1c2UgdGhlIGdsb2JhbCBzb3VuZCBkZWJ1ZyBpbnRlcmZhY2VzICovCi0jZGVmaW5lIGFkMTg4OV9kZWJ1ZyhmbXQsIGFyZy4uLikgc25kX3ByaW50ZChLRVJOX0RFQlVHIGZtdCwgIyMgYXJnKQotCiAvKiBrZWVwIHRyYWNrIG9mIHNvbWUgaHcgcmVnaXN0ZXJzICovCiBzdHJ1Y3QgYWQxODg5X3JlZ2lzdGVyX3N0YXRlIHsKIAl1MTYgcmVnOwkvKiByZWcgc2V0dXAgKi8KQEAgLTI2NCwxMSArMjYxLDExIEBACiAJCQkmJiAtLXJldHJ5KQogCQltZGVsYXkoMSk7CiAJaWYgKCFyZXRyeSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAiWyVzXSBMaW5rIGlzIG5vdCByZWFkeS5cbiIsCi0JCSAgICAgICBfX2Z1bmNfXyk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiWyVzXSBMaW5rIGlzIG5vdCByZWFkeS5cbiIsCisJCQlfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlPOwogCX0KLQlhZDE4ODlfZGVidWcoIlslc10gcmVhZHkgYWZ0ZXIgJWQgbXNcbiIsIF9fZnVuY19fLCA0MDAgLSByZXRyeSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJbJXNdIHJlYWR5IGFmdGVyICVkIG1zXG4iLCBfX2Z1bmNfXywgNDAwIC0gcmV0cnkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MDUsOSArNDAyLDkgQEAKIAkKIAlzcGluX3VubG9ja19pcnEoJmNoaXAtPmxvY2spOwogCQotCWFkMTg4OV9kZWJ1ZygicHJlcGFyZSBwbGF5YmFjazogYWRkciA9IDB4JXgsIGNvdW50ID0gJXUsICIKLQkJCSJzaXplID0gJXUsIHJlZyA9IDB4JXgsIHJhdGUgPSAldVxuIiwgY2hpcC0+d2F2ZS5hZGRyLAotCQkJY291bnQsIHNpemUsIHJlZywgcnQtPnJhdGUpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkicHJlcGFyZSBwbGF5YmFjazogYWRkciA9IDB4JXgsIGNvdW50ID0gJXUsIHNpemUgPSAldSwgcmVnID0gMHgleCwgcmF0ZSA9ICV1XG4iLAorCQljaGlwLT53YXZlLmFkZHIsIGNvdW50LCBzaXplLCByZWcsIHJ0LT5yYXRlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDUyLDkgKzQ0OSw5IEBACiAJCiAJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5sb2NrKTsKIAkKLQlhZDE4ODlfZGVidWcoInByZXBhcmUgY2FwdHVyZTogYWRkciA9IDB4JXgsIGNvdW50ID0gJXUsICIKLQkJCSJzaXplID0gJXUsIHJlZyA9IDB4JXgsIHJhdGUgPSAldVxuIiwgY2hpcC0+cmFtYy5hZGRyLAotCQkJY291bnQsIHNpemUsIHJlZywgcnQtPnJhdGUpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkicHJlcGFyZSBjYXB0dXJlOiBhZGRyID0gMHgleCwgY291bnQgPSAldSwgc2l6ZSA9ICV1LCByZWcgPSAweCV4LCByYXRlID0gJXVcbiIsCisJCWNoaXAtPnJhbWMuYWRkciwgY291bnQsIHNpemUsIHJlZywgcnQtPnJhdGUpOwogCXJldHVybiAwOwogfQogCkBAIC02MTQsNyArNjExLDggQEAKIAkJcmV0dXJuIElSUV9OT05FOwogCiAJaWYgKHN0ICYgKEFEX0RNQV9ESVNSX1BNQUl8QURfRE1BX0RJU1JfUFRBSSkpCi0JCWFkMTg4OV9kZWJ1ZygiVW5leHBlY3RlZCBtYXN0ZXIgb3IgdGFyZ2V0IGFib3J0IGludGVycnVwdCFcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJVbmV4cGVjdGVkIG1hc3RlciBvciB0YXJnZXQgYWJvcnQgaW50ZXJydXB0IVxuIik7CiAKIAlpZiAoKHN0ICYgQURfRE1BX0RJU1JfV0FWSSkgJiYgY2hpcC0+cHN1YnMpCiAJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY2hpcC0+cHN1YnMpOwpAQCAtNjU2LDcgKzY1NCw3IEBACiAJCQkJCQlCVUZGRVJfQllURVNfTUFYKTsKIAogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUEZYICJidWZmZXIgYWxsb2NhdGlvbiBlcnJvcjogJWRcbiIsIGVycik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiYnVmZmVyIGFsbG9jYXRpb24gZXJyb3I6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAkKQEAgLTkxMiw3ICs5MTAsNyBAQAogCS8qIGNoZWNrIFBDSSBhdmFpbGFiaWxpdHkgKDMyYml0IERNQSkgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygzMikpIDwgMCB8fAogCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMzIpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZXJyb3Igc2V0dGluZyAzMi1iaXQgRE1BIG1hc2suXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJlcnJvciBzZXR0aW5nIDMyLWJpdCBETUEgbWFzay5cbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC05MzUsNyArOTMzLDcgQEAKIAljaGlwLT5iYXIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKIAljaGlwLT5pb2Jhc2UgPSBwY2lfaW9yZW1hcF9iYXIocGNpLCAwKTsKIAlpZiAoY2hpcC0+aW9iYXNlID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIHJlc2VydmUgcmVnaW9uLlxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIHJlc2VydmUgcmVnaW9uLlxuIik7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBmcmVlX2FuZF9yZXQ7CiAJfQpAQCAtOTQ2LDcgKzk0NCw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9hZDE4ODlfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3Qgb2J0YWluIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBvYnRhaW4gSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9hZDE4ODlfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC05NjUsOCArOTYzLDYgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcmNoaXAgPSBjaGlwOwogCiAJcmV0dXJuIDA7CkBAIC05OTYsNyArOTkyLDggQEAKIAl9CiAKIAkvKiAoMikgKi8KLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2bm9dLCBpZFtkZXZub10sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2bm9dLCBpZFtkZXZub10sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCS8qIFhYWCBSRVZJU0lUOiB3ZSBjYW4gcHJvYmFibHkgYWxsb2NhdGUgY2hpcCBpbiB0aGlzIGNhbGwgKi8KIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYyBiL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYwppbmRleCBjNjgzNWEzLi5mZWIyOWMyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMKKysrIGIvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jCkBAIC02NSwxOCArNjUsNiBAQAogCiAKIC8qCi0gKiAgRGVidWcgcGFydCBkZWZpbml0aW9ucwotICovCi0KLS8qICNkZWZpbmUgQUxJX0RFQlVHICovCi0KLSNpZmRlZiBBTElfREVCVUcKLSNkZWZpbmUgc25kX2FsaV9wcmludGsoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQsICMjYXJncyk7Ci0jZWxzZQotI2RlZmluZSBzbmRfYWxpX3ByaW50ayhmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotLyoKICAqICBDb25zdGFudHMgZGVmaW5pdGlvbgogICovCiAKQEAgLTMyMSw3ICszMDksNyBAQAogCX0KIAogCXNuZF9hbGlfNTQ1MV9wb2tlKGNvZGVjLCBwb3J0LCByZXMgJiB+MHg4MDAwKTsKLQlzbmRfcHJpbnRkZCgiYWxpX2NvZGVjX3JlYWR5OiBjb2RlYyBpcyBub3QgcmVhZHkuXG4gIik7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAiYWxpX2NvZGVjX3JlYWR5OiBjb2RlYyBpcyBub3QgcmVhZHkuXG4gIik7CiAJcmV0dXJuIC1FSU87CiB9CiAKQEAgLTM0Miw3ICszMzAsNyBAQAogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAl9CiAKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfc3RpbWVyX3JlYWQ6IHN0aW1lciBpcyBub3QgcmVhZHkuXG4iKTsKKwlkZXZfZXJyKGNvZGVjLT5jYXJkLT5kZXYsICJhbGlfc3RpbWVyX3JlYWQ6IHN0aW1lciBpcyBub3QgcmVhZHkuXG4iKTsKIAlyZXR1cm4gLUVJTzsKIH0KIApAQCAtMzU0LDcgKzM0Miw4IEBACiAJdW5zaWduZWQgaW50IHBvcnQ7CiAKIAlpZiAocmVnID49IDB4ODApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpX2NvZGVjX3Bva2U6IHJlZygleGgpIGludmFsaWQuXG4iLCByZWcpOworCQlkZXZfZXJyKGNvZGVjLT5jYXJkLT5kZXYsCisJCQkiYWxpX2NvZGVjX3Bva2U6IHJlZygleGgpIGludmFsaWQuXG4iLCByZWcpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zODUsNyArMzc0LDggQEAKIAl1bnNpZ25lZCBpbnQgcG9ydDsKIAogCWlmIChyZWcgPj0gMHg4MCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfY29kZWNfcGVlazogcmVnKCV4aCkgaW52YWxpZC5cbiIsIHJlZyk7CisJCWRldl9lcnIoY29kZWMtPmNhcmQtPmRldiwKKwkJCSJhbGlfY29kZWNfcGVlazogcmVnKCV4aCkgaW52YWxpZC5cbiIsIHJlZyk7CiAJCXJldHVybiB+MDsKIAl9CiAKQEAgLTQxNyw3ICs0MDcsNyBAQAogewogCXN0cnVjdCBzbmRfYWxpICpjb2RlYyA9IGFjOTctPnByaXZhdGVfZGF0YTsKIAotCXNuZF9hbGlfcHJpbnRrKCJjb2RlY193cml0ZTogcmVnPSV4aCBkYXRhPSV4aC5cbiIsIHJlZywgdmFsKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJjb2RlY193cml0ZTogcmVnPSV4aCBkYXRhPSV4aC5cbiIsIHJlZywgdmFsKTsKIAlpZiAocmVnID09IEFDOTdfR1BJT19TVEFUVVMpIHsKIAkJb3V0bCgodmFsIDw8IEFMSV9BQzk3X0dQSU9fREFUQV9TSElGVCkgfCBBTElfQUM5N19HUElPX0VOQUJMRSwKIAkJICAgICBBTElfUkVHKGNvZGVjLCBBTElfQUM5N19HUElPKSk7CkBAIC00MzMsNyArNDIzLDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX2FsaSAqY29kZWMgPSBhYzk3LT5wcml2YXRlX2RhdGE7CiAKLQlzbmRfYWxpX3ByaW50aygiY29kZWNfcmVhZCByZWc9JXhoLlxuIiwgcmVnKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJjb2RlY19yZWFkIHJlZz0leGguXG4iLCByZWcpOwogCXJldHVybiBzbmRfYWxpX2NvZGVjX3BlZWsoY29kZWMsIGFjOTctPm51bSwgcmVnKTsKIH0KIApAQCAtNDc0LDcgKzQ2NCw3IEBACiAJfQogCiAJLyogbm9uLWZhdGFsIGlmIHlvdSBoYXZlIGEgbm9uIFBNIGNhcGFibGUgY29kZWMgKi8KLQkvKiBzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiYWxpNTQ1MTogcmVzZXQgdGltZSBvdXRcbiIpOyAqLworCS8qIGRldl93YXJuKGNvZGVjLT5jYXJkLT5kZXYsICJhbGk1NDUxOiByZXNldCB0aW1lIG91dFxuIik7ICovCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUyOCw3ICs1MTgsNyBAQAogCXVuc2lnbmVkIGludCBtYXNrOwogCXN0cnVjdCBzbmRfYWxpX2NoYW5uZWxfY29udHJvbCAqcGNocmVncyA9ICYoY29kZWMtPmNocmVncyk7CiAKLQlzbmRfYWxpX3ByaW50aygiZGlzYWJsZV92b2ljZV9pcnEgY2hhbm5lbD0lZFxuIixjaGFubmVsKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJkaXNhYmxlX3ZvaWNlX2lycSBjaGFubmVsPSVkXG4iLCBjaGFubmVsKTsKIAogCW1hc2sgPSAxIDw8IChjaGFubmVsICYgMHgxZik7CiAJcGNocmVncy0+ZGF0YS5haW50ZW4gID0gaW5sKEFMSV9SRUcoY29kZWMsIHBjaHJlZ3MtPnJlZ3MuYWludGVuKSk7CkBAIC01NDEsNyArNTMxLDcgQEAKIAl1bnNpZ25lZCBpbnQgaWR4ID0gIGNoYW5uZWwgJiAweDFmOwogCiAJaWYgKGNvZGVjLT5zeW50aC5jaGNudCA+PSBBTElfQ0hBTk5FTFMpewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCWRldl9lcnIoY29kZWMtPmNhcmQtPmRldiwKIAkJCSAgICJhbGlfYWxsb2NfcGNtX2NoYW5uZWw6IG5vIGZyZWUgY2hhbm5lbHMuXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTU0OSw3ICs1MzksNyBAQAogCWlmICghKGNvZGVjLT5zeW50aC5jaG1hcCAmICgxIDw8IGlkeCkpKSB7CiAJCWNvZGVjLT5zeW50aC5jaG1hcCB8PSAxIDw8IGlkeDsKIAkJY29kZWMtPnN5bnRoLmNoY250Kys7Ci0JCXNuZF9hbGlfcHJpbnRrKCJhbGxvY19wY21fY2hhbm5lbCBuby4gJWQuXG4iLGlkeCk7CisJCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgImFsbG9jX3BjbV9jaGFubmVsIG5vLiAlZC5cbiIsIGlkeCk7CiAJCXJldHVybiBpZHg7CiAJfQogCXJldHVybiAtMTsKQEAgLTU2MCw3ICs1NTAsOCBAQAogCWludCBpZHg7CiAJaW50IHJlc3VsdCA9IC0xOwogCi0Jc25kX2FsaV9wcmludGsoImZpbmRfZnJlZV9jaGFubmVsOiBmb3IgJXNcbiIscmVjID8gInJlYyIgOiAicGNtIik7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LAorCQkiZmluZF9mcmVlX2NoYW5uZWw6IGZvciAlc1xuIiwgcmVjID8gInJlYyIgOiAicGNtIik7CiAKIAkvKiByZWNvcmRpbmcgKi8KIAlpZiAocmVjKSB7CkBAIC01NzUsOCArNTY2LDggQEAKIAkJaWYgKHJlc3VsdCA+PSAwKQogCQkJcmV0dXJuIHJlc3VsdDsKIAkJZWxzZSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfZmluZF9mcmVlX2NoYW5uZWw6ICIKLQkJCQkgICAicmVjb3JkIGNoYW5uZWwgaXMgYnVzeSBub3cuXG4iKTsKKwkJCWRldl9lcnIoY29kZWMtPmNhcmQtPmRldiwKKwkJCQkiYWxpX2ZpbmRfZnJlZV9jaGFubmVsOiByZWNvcmQgY2hhbm5lbCBpcyBidXN5IG5vdy5cbiIpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQpAQCAtNTkwLDggKzU4MSw4IEBACiAJCWlmIChyZXN1bHQgPj0gMCkKIAkJCXJldHVybiByZXN1bHQ7CiAJCWVsc2UKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImFsaV9maW5kX2ZyZWVfY2hhbm5lbDogIgotCQkJCSAgICJTL1BESUYgb3V0IGNoYW5uZWwgaXMgaW4gYnVzeSBub3cuXG4iKTsKKwkJCWRldl9lcnIoY29kZWMtPmNhcmQtPmRldiwKKwkJCQkiYWxpX2ZpbmRfZnJlZV9jaGFubmVsOiBTL1BESUYgb3V0IGNoYW5uZWwgaXMgaW4gYnVzeSBub3cuXG4iKTsKIAl9CiAKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IEFMSV9DSEFOTkVMUzsgaWR4KyspIHsKQEAgLTU5OSw3ICs1OTAsNyBAQAogCQlpZiAocmVzdWx0ID49IDApCiAJCQlyZXR1cm4gcmVzdWx0OwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfZmluZF9mcmVlX2NoYW5uZWw6IG5vIGZyZWUgY2hhbm5lbHMuXG4iKTsKKwlkZXZfZXJyKGNvZGVjLT5jYXJkLT5kZXYsICJhbGlfZmluZF9mcmVlX2NoYW5uZWw6IG5vIGZyZWUgY2hhbm5lbHMuXG4iKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTYwNywxNCArNTk4LDE1IEBACiB7CiAJdW5zaWduZWQgaW50IGlkeCA9IGNoYW5uZWwgJiAweDAwMDAwMDFmOwogCi0Jc25kX2FsaV9wcmludGsoImZyZWVfY2hhbm5lbF9wY20gY2hhbm5lbD0lZFxuIixjaGFubmVsKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJmcmVlX2NoYW5uZWxfcGNtIGNoYW5uZWw9JWRcbiIsIGNoYW5uZWwpOwogCiAJaWYgKGNoYW5uZWwgPCAwIHx8IGNoYW5uZWwgPj0gQUxJX0NIQU5ORUxTKQogCQlyZXR1cm47CiAKIAlpZiAoIShjb2RlYy0+c3ludGguY2htYXAgJiAoMSA8PCBpZHgpKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfZnJlZV9jaGFubmVsX3BjbTogIgotCQkJICAgImNoYW5uZWwgJWQgaXMgbm90IGluIHVzZS5cbiIsIGNoYW5uZWwpOworCQlkZXZfZXJyKGNvZGVjLT5jYXJkLT5kZXYsCisJCQkiYWxpX2ZyZWVfY2hhbm5lbF9wY206IGNoYW5uZWwgJWQgaXMgbm90IGluIHVzZS5cbiIsCisJCQljaGFubmVsKTsKIAkJcmV0dXJuOwogCX0gZWxzZSB7CiAJCWNvZGVjLT5zeW50aC5jaG1hcCAmPSB+KDEgPDwgaWR4KTsKQEAgLTYyNiw3ICs2MTgsNyBAQAogewogCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCAoY2hhbm5lbCAmIDB4MWYpOwogCi0Jc25kX2FsaV9wcmludGsoInN0b3Bfdm9pY2U6IGNoYW5uZWw9JWRcbiIsY2hhbm5lbCk7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAic3RvcF92b2ljZTogY2hhbm5lbD0lZFxuIiwgY2hhbm5lbCk7CiAJb3V0bChtYXNrLCBBTElfUkVHKGNvZGVjLCBjb2RlYy0+Y2hyZWdzLnJlZ3Muc3RvcCkpOwogfQogCkBAIC02NjcsNyArNjU5LDcgQEAKIAl9CiAKIAlpZiAoY291bnQgPiA1MDAwMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfZGV0ZWN0X3NwZGlmX3JhdGU6IHRpbWVvdXQhXG4iKTsKKwkJZGV2X2Vycihjb2RlYy0+Y2FyZC0+ZGV2LCAiYWxpX2RldGVjdF9zcGRpZl9yYXRlOiB0aW1lb3V0IVxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTY4Miw3ICs2NzQsNyBAQAogCX0KIAogCWlmIChjb3VudCA+IDUwMDAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFsaV9kZXRlY3Rfc3BkaWZfcmF0ZTogdGltZW91dCFcbiIpOworCQlkZXZfZXJyKGNvZGVjLT5jYXJkLT5kZXYsICJhbGlfZGV0ZWN0X3NwZGlmX3JhdGU6IHRpbWVvdXQhXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtODU3LDkgKzg0OSw2IEBACiAJc3RydWN0IHNuZF9hbGlfdm9pY2UgKnB2b2ljZTsKIAlzdHJ1Y3Qgc25kX2FsaV9jaGFubmVsX2NvbnRyb2wgKnBjaHJlZ3M7CiAJdW5zaWduZWQgaW50IG9sZCwgbWFzazsKLSNpZmRlZiBBTElfREVCVUcKLQl1bnNpZ25lZCBpbnQgdGVtcCwgY3NwZjsKLSNlbmRpZgogCiAJcGNocmVncyA9ICYoY29kZWMtPmNocmVncyk7CiAKQEAgLTg3NywxNCArODY2LDExIEBACiAKIAlpZiAocHZvaWNlLT5wY20gJiYgcHZvaWNlLT5zdWJzdHJlYW0pIHsKIAkJLyogcGNtIGludGVycnVwdCAqLwotI2lmZGVmIEFMSV9ERUJVRwotCQlvdXRiKCh1OCkocHZvaWNlLT5udW1iZXIpLCBBTElfUkVHKGNvZGVjLCBBTElfR0NfQ0lSKSk7Ci0JCXRlbXAgPSBpbncoQUxJX1JFRyhjb2RlYywgQUxJX0NTT19BTFBIQV9GTVMgKyAyKSk7Ci0JCWNzcGYgPSAoaW5sKEFMSV9SRUcoY29kZWMsIEFMSV9DU1BGKSkgJiBtYXNrKSA9PSBtYXNrOwotI2VuZGlmCiAJCWlmIChwdm9pY2UtPnJ1bm5pbmcpIHsKLQkJCXNuZF9hbGlfcHJpbnRrKCJ1cGRhdGVfcHRyOiBjc289JTQuNHggY3NwZj0lZC5cbiIsCi0JCQkJICAgICAgICh1MTYpdGVtcCwgY3NwZik7CisJCQlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsCisJCQkJInVwZGF0ZV9wdHI6IGNzbz0lNC40eCBjc3BmPSVkLlxuIiwKKwkJCQlpbncoQUxJX1JFRyhjb2RlYywgQUxJX0NTT19BTFBIQV9GTVMgKyAyKSksCisJCQkJKGlubChBTElfUkVHKGNvZGVjLCBBTElfQ1NQRikpICYgbWFzaykgPT0gbWFzayk7CiAJCQlzcGluX3VubG9jaygmY29kZWMtPnJlZ19sb2NrKTsKIAkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocHZvaWNlLT5zdWJzdHJlYW0pOwogCQkJc3Bpbl9sb2NrKCZjb2RlYy0+cmVnX2xvY2spOwpAQCAtOTQwLDE0ICs5MjYsMTQgQEAKIAlzdHJ1Y3Qgc25kX2FsaV92b2ljZSAqcHZvaWNlOwogCWludCBpZHg7CiAKLQlzbmRfYWxpX3ByaW50aygiYWxsb2Nfdm9pY2U6IHR5cGU9JWQgcmVjPSVkXG4iLCB0eXBlLCByZWMpOworCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgImFsbG9jX3ZvaWNlOiB0eXBlPSVkIHJlYz0lZFxuIiwgdHlwZSwgcmVjKTsKIAogCXNwaW5fbG9ja19pcnEoJmNvZGVjLT52b2ljZV9hbGxvYyk7CiAJaWYgKHR5cGUgPT0gU05EUlZfQUxJX1ZPSUNFX1RZUEVfUENNKSB7CiAJCWlkeCA9IGNoYW5uZWwgPiAwID8gc25kX2FsaV9hbGxvY19wY21fY2hhbm5lbChjb2RlYywgY2hhbm5lbCkgOgogCQkJc25kX2FsaV9maW5kX2ZyZWVfY2hhbm5lbChjb2RlYyxyZWMpOwogCQlpZiAoaWR4IDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpX2FsbG9jX3ZvaWNlOiBlcnIuXG4iKTsKKwkJCWRldl9lcnIoY29kZWMtPmNhcmQtPmRldiwgImFsaV9hbGxvY192b2ljZTogZXJyLlxuIik7CiAJCQlzcGluX3VubG9ja19pcnEoJmNvZGVjLT52b2ljZV9hbGxvYyk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQpAQCAtOTcwLDcgKzk1Niw3IEBACiAJdm9pZCAoKnByaXZhdGVfZnJlZSkodm9pZCAqKTsKIAl2b2lkICpwcml2YXRlX2RhdGE7CiAKLQlzbmRfYWxpX3ByaW50aygiZnJlZV92b2ljZTogY2hhbm5lbD0lZFxuIixwdm9pY2UtPm51bWJlcik7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAiZnJlZV92b2ljZTogY2hhbm5lbD0lZFxuIiwgcHZvaWNlLT5udW1iZXIpOwogCWlmICghcHZvaWNlLT51c2UpCiAJCXJldHVybjsKIAlzbmRfYWxpX2NsZWFyX3ZvaWNlcyhjb2RlYywgcHZvaWNlLT5udW1iZXIsIHB2b2ljZS0+bnVtYmVyKTsKQEAgLTExNTMsNyArMTEzOSw3IEBACiAJb3V0bCh2YWwsIEFMSV9SRUcoY29kZWMsIEFMSV9BSU5URU4pKTsKIAlpZiAoZG9fc3RhcnQpCiAJCW91dGwod2hhdCwgQUxJX1JFRyhjb2RlYywgQUxJX1NUQVJUKSk7Ci0Jc25kX2FsaV9wcmludGsoInRyaWdnZXI6IHdoYXQ9JXhoIHdoYXRpPSV4aFxuIiwgd2hhdCwgd2hhdGkpOworCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgInRyaWdnZXI6IHdoYXQ9JXhoIHdoYXRpPSV4aFxuIiwgd2hhdCwgd2hhdGkpOwogCXNwaW5fdW5sb2NrKCZjb2RlYy0+cmVnX2xvY2spOwogCiAJcmV0dXJuIDA7CkBAIC0xMjM5LDcgKzEyMjUsNyBAQAogCXVuc2lnbmVkIGludCBWT0w7CiAJdW5zaWduZWQgaW50IEVDOwogCQotCXNuZF9hbGlfcHJpbnRrKCJwbGF5YmFja19wcmVwYXJlIC4uLlxuIik7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAicGxheWJhY2tfcHJlcGFyZSAuLi5cbiIpOwogCiAJc3Bpbl9sb2NrX2lycSgmY29kZWMtPnJlZ19sb2NrKTsJCiAJCkBAIC0xMjY2LDcgKzEyNTIsNyBAQAogCS8qIHNldCB0YXJnZXQgRVNPIGZvciBjaGFubmVsICovCiAJcHZvaWNlLT5lc28gPSBydW50aW1lLT5idWZmZXJfc2l6ZTsgCiAKLQlzbmRfYWxpX3ByaW50aygicGxheWJhY2tfcHJlcGFyZTogZXNvPSV4aCBjb3VudD0leGhcbiIsCisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAicGxheWJhY2tfcHJlcGFyZTogZXNvPSV4aCBjb3VudD0leGhcbiIsCiAJCSAgICAgICBwdm9pY2UtPmVzbywgcHZvaWNlLT5jb3VudCk7CiAKIAkvKiBzZXQgRVNPIHRvIGNhcHR1cmUgZmlyc3QgTUlETFAgaW50ZXJydXB0ICovCkBAIC0xMjc4LDggKzEyNjQsOSBAQAogCVBBTiA9IDA7CiAJVk9MID0gMDsKIAlFQyA9IDA7Ci0Jc25kX2FsaV9wcmludGsoInBsYXliYWNrX3ByZXBhcmU6XG4iKTsKLQlzbmRfYWxpX3ByaW50aygiY2g9JWQsIFJhdGU9JWQgRGVsdGE9JXhoLEdWU0VMPSV4aCxQQU49JXhoLENUUkw9JXhoXG4iLAorCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgInBsYXliYWNrX3ByZXBhcmU6XG4iKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsCisJCSJjaD0lZCwgUmF0ZT0lZCBEZWx0YT0leGgsR1ZTRUw9JXhoLFBBTj0leGgsQ1RSTD0leGhcbiIsCiAJCSAgICAgICBwdm9pY2UtPm51bWJlcixydW50aW1lLT5yYXRlLERlbHRhLEdWU0VMLFBBTixDVFJMKTsKIAlzbmRfYWxpX3dyaXRlX3ZvaWNlX3JlZ3MoY29kZWMsCiAJCQkJIHB2b2ljZS0+bnVtYmVyLApAQCAtMTMzMiw3ICsxMzE5LDcgQEAKIAogCXNwaW5fbG9ja19pcnEoJmNvZGVjLT5yZWdfbG9jayk7CiAKLQlzbmRfYWxpX3ByaW50aygiYWxpX3ByZXBhcmUuLi5cbiIpOworCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgImFsaV9wcmVwYXJlLi4uXG4iKTsKIAogCXNuZF9hbGlfZW5hYmxlX3NwZWNpYWxfY2hhbm5lbChjb2RlYyxwdm9pY2UtPm51bWJlcik7CiAKQEAgLTEzNTEsMTUgKzEzMzgsMTYgQEAKIAogCQlyYXRlID0gc25kX2FsaV9nZXRfc3BkaWZfaW5fcmF0ZShjb2RlYyk7CiAJCWlmIChyYXRlID09IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJhbGlfY2FwdHVyZV9wcmVhcHJlOiAiCi0JCQkJICAgInNwZGlmIHJhdGUgZGV0ZWN0IGVyciFcbiIpOworCQkJZGV2X3dhcm4oY29kZWMtPmNhcmQtPmRldiwKKwkJCQkgImFsaV9jYXB0dXJlX3ByZWFwcmU6IHNwZGlmIHJhdGUgZGV0ZWN0IGVyciFcbiIpOwogCQkJcmF0ZSA9IDQ4MDAwOwogCQl9CiAJCXNwaW5fbG9ja19pcnEoJmNvZGVjLT5yZWdfbG9jayk7CiAJCWJWYWx1ZSA9IGluYihBTElfUkVHKGNvZGVjLEFMSV9TUERJRl9DVFJMKSk7CiAJCWlmIChiVmFsdWUgJiAweDEwKSB7CiAJCQlvdXRiKGJWYWx1ZSxBTElfUkVHKGNvZGVjLEFMSV9TUERJRl9DVFJMKSk7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJjbGVhciBTUERJRiBwYXJpdHkgZXJyb3IgZmxhZy5cbiIpOworCQkJZGV2X3dhcm4oY29kZWMtPmNhcmQtPmRldiwKKwkJCQkgImNsZWFyIFNQRElGIHBhcml0eSBlcnJvciBmbGFnLlxuIik7CiAJCX0KIAogCQlpZiAocmF0ZSAhPSA0ODAwMCkKQEAgLTE0MTgsNyArMTQwNiw3IEBACiAJb3V0Yihwdm9pY2UtPm51bWJlciwgQUxJX1JFRyhjb2RlYywgQUxJX0dDX0NJUikpOwogCWNzbyA9IGludyhBTElfUkVHKGNvZGVjLCBBTElfQ1NPX0FMUEhBX0ZNUyArIDIpKTsKIAlzcGluX3VubG9jaygmY29kZWMtPnJlZ19sb2NrKTsKLQlzbmRfYWxpX3ByaW50aygicGxheWJhY2sgcG9pbnRlciByZXR1cm5lZCBjc289JXhoLlxuIiwgY3NvKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJwbGF5YmFjayBwb2ludGVyIHJldHVybmVkIGNzbz0leGguXG4iLCBjc28pOwogCiAJcmV0dXJuIGNzbzsKIH0KQEAgLTE2ODUsNyArMTY3Myw4IEBACiAJZXJyID0gc25kX3BjbV9uZXcoY29kZWMtPmNhcmQsIGRlc2MtPm5hbWUsIGRldmljZSwKIAkJCSAgZGVzYy0+cGxheWJhY2tfbnVtLCBkZXNjLT5jYXB0dXJlX251bSwgJnBjbSk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic25kX2FsaV9wY206IGVyciBjYWxsZWQgc25kX3BjbV9uZXcuXG4iKTsKKwkJZGV2X2Vycihjb2RlYy0+Y2FyZC0+ZGV2LAorCQkJInNuZF9hbGlfcGNtOiBlcnIgY2FsbGVkIHNuZF9wY21fbmV3LlxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCXBjbS0+cHJpdmF0ZV9kYXRhID0gY29kZWM7CkBAIC0xODYxLDcgKzE4NTAsNyBAQAogCQlhYzk3Lm51bSA9IGk7CiAJCWVyciA9IHNuZF9hYzk3X21peGVyKGNvZGVjLT5hYzk3X2J1cywgJmFjOTcsICZjb2RlYy0+YWM5N1tpXSk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCQlkZXZfZXJyKGNvZGVjLT5jYXJkLT5kZXYsCiAJCQkJICAgImFsaSBtaXhlciAlZCBjcmVhdGluZyBlcnJvci5cbiIsIGkpOwogCQkJaWYgKGkgPT0gMCkKIAkJCQlyZXR1cm4gZXJyOwpAQCAtMTk0Nyw4ICsxOTM2LDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImFsaTU0NTE6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTIwMTMsMTAgKzIwMDEsMTAgQEAKIAl1bnNpZ25lZCBjaGFyIHRlbXA7CiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CiAKLQlzbmRfYWxpX3ByaW50aygiY2hpcCBpbml0aWFsaXppbmcgLi4uIFxuIik7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAiY2hpcCBpbml0aWFsaXppbmcgLi4uXG4iKTsKIAogCWlmIChzbmRfYWxpX3Jlc2V0XzU0NTEoY29kZWMpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFsaV9jaGlwX2luaXQ6IHJlc2V0IDU0NTEgZXJyb3IuXG4iKTsKKwkJZGV2X2Vycihjb2RlYy0+Y2FyZC0+ZGV2LCAiYWxpX2NoaXBfaW5pdDogcmVzZXQgNTQ1MSBlcnJvci5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0yMDYyLDcgKzIwNTAsNyBAQAogCQkgICAgIEFMSV9SRUcoY29kZWMsIEFMSV9TQ1RSTCkpOwogCX0KIAotCXNuZF9hbGlfcHJpbnRrKCJjaGlwIGluaXRpYWxpemUgc3VjY2VlZC5cbiIpOworCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgImNoaXAgaW5pdGlhbGl6ZSBzdWNjZWVkLlxuIik7CiAJcmV0dXJuIDA7CiAKIH0KQEAgLTIwODgsNyArMjA3Niw3IEBACiB7CiAJaW50IGVycjsKIAotCXNuZF9hbGlfcHJpbnRrKCJyZXNvdXJjZXMgYWxsb2NhdGlvbiAuLi5cbiIpOworCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgInJlc291cmNlcyBhbGxvY2F0aW9uIC4uLlxuIik7CiAJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhjb2RlYy0+cGNpLCAiQUxJIDU0NTEiKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKQEAgLTIwOTYsMTEgKzIwODQsMTEgQEAKIAogCWlmIChyZXF1ZXN0X2lycShjb2RlYy0+cGNpLT5pcnEsIHNuZF9hbGlfY2FyZF9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNvZGVjKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVxdWVzdCBpcnEuXG4iKTsKKwkJZGV2X2Vycihjb2RlYy0+Y2FyZC0+ZGV2LCAiVW5hYmxlIHRvIHJlcXVlc3QgaXJxLlxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWNvZGVjLT5pcnEgPSBjb2RlYy0+cGNpLT5pcnE7Ci0Jc25kX2FsaV9wcmludGsoInJlc291cmNlcyBhbGxvY2F0ZWQuXG4iKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJyZXNvdXJjZXMgYWxsb2NhdGVkLlxuIik7CiAJcmV0dXJuIDA7CiB9CiBzdGF0aWMgaW50IHNuZF9hbGlfZGV2X2ZyZWUoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKQEAgLTIxMjUsNyArMjExMyw3IEBACiAKIAkqcl9hbGkgPSBOVUxMOwogCi0Jc25kX2FsaV9wcmludGsoImNyZWF0aW5nIC4uLlxuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJjcmVhdGluZyAuLi5cbiIpOwogCiAJLyogZW5hYmxlIFBDSSBkZXZpY2UgKi8KIAllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpOwpAQCAtMjEzNCw4ICsyMTIyLDggQEAKIAkvKiBjaGVjaywgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDMxIGJpdHMgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygzMSkpIDwgMCB8fAogCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMzEpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgIgotCQkJICAgIjMxYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMzFiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC0yMTk5LDQ4ICsyMTg3LDQ2IEBACiAJLyogTTE1MzM6IHNvdXRoYnJpZGdlICovCiAJY29kZWMtPnBjaV9tMTUzMyA9IHBjaV9nZXRfZGV2aWNlKDB4MTBiOSwgMHgxNTMzLCBOVUxMKTsKIAlpZiAoIWNvZGVjLT5wY2lfbTE1MzMpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpNTQ1MTogY2Fubm90IGZpbmQgQUxpIDE1MzMgY2hpcC5cbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBmaW5kIEFMaSAxNTMzIGNoaXAuXG4iKTsKIAkJc25kX2FsaV9mcmVlKGNvZGVjKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCS8qIE03MTAxOiBwb3dlciBtYW5hZ2VtZW50ICovCiAJY29kZWMtPnBjaV9tNzEwMSA9IHBjaV9nZXRfZGV2aWNlKDB4MTBiOSwgMHg3MTAxLCBOVUxMKTsKIAlpZiAoIWNvZGVjLT5wY2lfbTcxMDEgJiYgY29kZWMtPnJldmlzaW9uID09IEFMSV81NDUxX1YwMikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGk1NDUxOiBjYW5ub3QgZmluZCBBTGkgNzEwMSBjaGlwLlxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGZpbmQgQUxpIDcxMDEgY2hpcC5cbiIpOwogCQlzbmRfYWxpX2ZyZWUoY29kZWMpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlzbmRfYWxpX3ByaW50aygic25kX2RldmljZV9uZXcgaXMgY2FsbGVkLlxuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJzbmRfZGV2aWNlX25ldyBpcyBjYWxsZWQuXG4iKTsKIAllcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGNvZGVjLCAmb3BzKTsKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfYWxpX2ZyZWUoY29kZWMpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCS8qIGluaXRpYWxpc2Ugc3ludGggdm9pY2VzKi8KIAlmb3IgKGkgPSAwOyBpIDwgQUxJX0NIQU5ORUxTOyBpKyspCiAJCWNvZGVjLT5zeW50aC52b2ljZXNbaV0ubnVtYmVyID0gaTsKIAogCWVyciA9IHNuZF9hbGlfY2hpcF9pbml0KGNvZGVjKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGkgY3JlYXRlOiBjaGlwIGluaXQgZXJyb3IuXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJhbGkgY3JlYXRlOiBjaGlwIGluaXQgZXJyb3IuXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIAljb2RlYy0+aW1hZ2UgPSBrbWFsbG9jKHNpemVvZigqY29kZWMtPmltYWdlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb2RlYy0+aW1hZ2UpCi0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJjYW4ndCBhbGxvY2F0ZSBhcG0gYnVmZmVyXG4iKTsKKwkJZGV2X3dhcm4oY2FyZC0+ZGV2LCAiY2FuJ3QgYWxsb2NhdGUgYXBtIGJ1ZmZlclxuIik7CiAjZW5kaWYKIAogCXNuZF9hbGlfZW5hYmxlX2FkZHJlc3NfaW50ZXJydXB0KGNvZGVjKTsKIAljb2RlYy0+aHdfaW5pdGlhbGl6ZWQgPSAxOwogCiAJKnJfYWxpID0gY29kZWM7Ci0Jc25kX2FsaV9wcmludGsoImNyZWF0ZWQuXG4iKTsKKwlkZXZfZGJnKGNhcmQtPmRldiwgImNyZWF0ZWQuXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjI1MSw5ICsyMjM3LDkgQEAKIAlzdHJ1Y3Qgc25kX2FsaSAqY29kZWM7CiAJaW50IGVycjsKIAotCXNuZF9hbGlfcHJpbnRrKCJwcm9iZSAuLi5cbiIpOworCWRldl9kYmcoJnBjaS0+ZGV2LCAicHJvYmUgLi4uXG4iKTsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yMjYyLDEyICsyMjQ4LDEyIEBACiAJCWdvdG8gZXJyb3I7CiAJY2FyZC0+cHJpdmF0ZV9kYXRhID0gY29kZWM7CiAKLQlzbmRfYWxpX3ByaW50aygibWl4ZXIgYnVpbGRpbmcgLi4uXG4iKTsKKwlkZXZfZGJnKCZwY2ktPmRldiwgIm1peGVyIGJ1aWxkaW5nIC4uLlxuIik7CiAJZXJyID0gc25kX2FsaV9taXhlcihjb2RlYyk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3I7CiAJCi0Jc25kX2FsaV9wcmludGsoInBjbSBidWlsZGluZyAuLi5cbiIpOworCWRldl9kYmcoJnBjaS0+ZGV2LCAicGNtIGJ1aWxkaW5nIC4uLlxuIik7CiAJZXJyID0gc25kX2FsaV9idWlsZF9wY21zKGNvZGVjKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJvcjsKQEAgLTIyODAsNyArMjI2Niw3IEBACiAJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4LCBpcnEgJWkiLAogCQljYXJkLT5zaG9ydG5hbWUsIGNvZGVjLT5wb3J0LCBjb2RlYy0+aXJxKTsKIAotCXNuZF9hbGlfcHJpbnRrKCJyZWdpc3RlciBjYXJkLlxuIik7CisJZGV2X2RiZygmcGNpLT5kZXYsICJyZWdpc3RlciBjYXJkLlxuIik7CiAJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3I7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxzMzAwLmMgYi9zb3VuZC9wY2kvYWxzMzAwLmMKaW5kZXggNTkxZWZiNi4uY2M5YTE1YSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FsczMwMC5jCisrKyBiL3NvdW5kL3BjaS9hbHMzMDAuYwpAQCAtODcsMTkgKzg3LDggQEAKICNkZWZpbmUgUExBWUJBQ0tfQkxPQ0tfQ09VTlRFUgkweDlBCiAjZGVmaW5lIFJFQ09SRF9CTE9DS19DT1VOVEVSCTB4OUIKIAotI2RlZmluZSBERUJVR19DQUxMUwkwCiAjZGVmaW5lIERFQlVHX1BMQVlfUkVDCTAKIAotI2lmIERFQlVHX0NBTExTCi0jZGVmaW5lIHNuZF9hbHMzMDBfZGJnY2FsbHMoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQsICMjYXJncykKLSNkZWZpbmUgc25kX2FsczMwMF9kYmdjYWxsZW50ZXIoKSBwcmludGsoS0VSTl9FUlIgIi0tPiAlc1xuIiwgX19mdW5jX18pCi0jZGVmaW5lIHNuZF9hbHMzMDBfZGJnY2FsbGxlYXZlKCkgcHJpbnRrKEtFUk5fRVJSICI8LS0gJXNcbiIsIF9fZnVuY19fKQotI2Vsc2UKLSNkZWZpbmUgc25kX2FsczMwMF9kYmdjYWxscyhmb3JtYXQsIGFyZ3MuLi4pCi0jZGVmaW5lIHNuZF9hbHMzMDBfZGJnY2FsbGVudGVyKCkKLSNkZWZpbmUgc25kX2FsczMwMF9kYmdjYWxsbGVhdmUoKQotI2VuZGlmCi0KICNpZiBERUJVR19QTEFZX1JFQwogI2RlZmluZSBzbmRfYWxzMzAwX2RiZ3BsYXkoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9FUlIgZm9ybWF0LCAjI2FyZ3MpCiAjZWxzZQpAQCAtMTc3LDcgKzE2Niw2IEBACiBzdGF0aWMgdm9pZCBzbmRfYWxzMzAwX3NldF9pcnFfZmxhZyhzdHJ1Y3Qgc25kX2FsczMwMCAqY2hpcCwgaW50IGNtZCkKIHsKIAl1MzIgdG1wID0gc25kX2FsczMwMF9nY3JfcmVhZChjaGlwLT5wb3J0LCBNSVNDX0NPTlRST0wpOwotCXNuZF9hbHMzMDBfZGJnY2FsbGVudGVyKCk7CiAKIAkvKiBib29sZWFuIFhPUiBjaGVjaywgc2luY2Ugb2xkIHZzLiBuZXcgaGFyZHdhcmUgaGF2ZQogCSAgIGRpcmVjdGx5IHJldmVyc2VkIGJpdCBzZXR0aW5nIGZvciBFTkFCTEUgYW5kIERJU0FCTEUuCkBAIC0xODgsMTkgKzE3NiwxNiBAQAogCWVsc2UKIAkJdG1wICY9IH5JUlFfU0VUX0JJVDsKIAlzbmRfYWxzMzAwX2djcl93cml0ZShjaGlwLT5wb3J0LCBNSVNDX0NPTlRST0wsIHRtcCk7Ci0Jc25kX2FsczMwMF9kYmdjYWxsbGVhdmUoKTsKIH0KIAogc3RhdGljIGludCBzbmRfYWxzMzAwX2ZyZWUoc3RydWN0IHNuZF9hbHMzMDAgKmNoaXApCiB7Ci0Jc25kX2FsczMwMF9kYmdjYWxsZW50ZXIoKTsKIAlzbmRfYWxzMzAwX3NldF9pcnFfZmxhZyhjaGlwLCBJUlFfRElTQUJMRSk7CiAJaWYgKGNoaXAtPmlycSA+PSAwKQogCQlmcmVlX2lycShjaGlwLT5pcnEsIGNoaXApOwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY2hpcC0+cGNpKTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKIAlrZnJlZShjaGlwKTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC0yODAsOSArMjY1LDcgQEAKIAogc3RhdGljIHZvaWQgc25kX2FsczMwMF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaSkKIHsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxlbnRlcigpOwogCXNuZF9jYXJkX2ZyZWUocGNpX2dldF9kcnZkYXRhKHBjaSkpOwotCXNuZF9hbHMzMDBfZGJnY2FsbGxlYXZlKCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbmRfYWxzMzAwX2FjOTdfcmVhZChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsCkBAIC0zMzAsMTQgKzMxMywxMiBAQAogCQkucmVhZCA9IHNuZF9hbHMzMDBfYWM5N19yZWFkLAogCX07CiAKLQlzbmRfYWxzMzAwX2RiZ2NhbGxlbnRlcigpOwogCWlmICgoZXJyID0gc25kX2FjOTdfYnVzKGNoaXAtPmNhcmQsIDAsICZvcHMsIE5VTEwsICZidXMpKSA8IDApCiAJCXJldHVybiBlcnI7CiAKIAltZW1zZXQoJmFjOTcsIDAsIHNpemVvZihhYzk3KSk7CiAJYWM5Ny5wcml2YXRlX2RhdGEgPSBjaGlwOwogCi0Jc25kX2FsczMwMF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gc25kX2FjOTdfbWl4ZXIoYnVzLCAmYWM5NywgJmNoaXAtPmFjOTcpOwogfQogCkBAIC0zOTUsMTMgKzM3NiwxMSBAQAogCiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxlbnRlcigpOwogCWNoaXAtPnBsYXliYWNrX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKIAlydW50aW1lLT5odyA9IHNuZF9hbHMzMDBfcGxheWJhY2tfaHc7CiAJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gZGF0YTsKIAlkYXRhLT5jb250cm9sX3JlZ2lzdGVyID0gUExBWUJBQ0tfQ09OVFJPTDsKIAlkYXRhLT5ibG9ja19jb3VudGVyX3JlZ2lzdGVyID0gUExBWUJBQ0tfQkxPQ0tfQ09VTlRFUjsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC00MTEsMTEgKzM5MCw5IEBACiAJc3RydWN0IHNuZF9hbHMzMDBfc3Vic3RyZWFtX2RhdGEgKmRhdGE7CiAKIAlkYXRhID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc25kX2FsczMwMF9kYmdjYWxsZW50ZXIoKTsKIAlrZnJlZShkYXRhKTsKIAljaGlwLT5wbGF5YmFja19zdWJzdHJlYW0gPSBOVUxMOwogCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC00MjgsMTMgKzQwNSwxMSBAQAogCiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxlbnRlcigpOwogCWNoaXAtPmNhcHR1cmVfc3Vic3RyZWFtID0gc3Vic3RyZWFtOwogCXJ1bnRpbWUtPmh3ID0gc25kX2FsczMwMF9jYXB0dXJlX2h3OwogCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IGRhdGE7CiAJZGF0YS0+Y29udHJvbF9yZWdpc3RlciA9IFJFQ09SRF9DT05UUk9MOwogCWRhdGEtPmJsb2NrX2NvdW50ZXJfcmVnaXN0ZXIgPSBSRUNPUkRfQkxPQ0tfQ09VTlRFUjsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC00NDQsMTEgKzQxOSw5IEBACiAJc3RydWN0IHNuZF9hbHMzMDBfc3Vic3RyZWFtX2RhdGEgKmRhdGE7CiAKIAlkYXRhID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc25kX2FsczMwMF9kYmdjYWxsZW50ZXIoKTsKIAlrZnJlZShkYXRhKTsKIAljaGlwLT5jYXB0dXJlX3N1YnN0cmVhbSA9IE5VTEw7CiAJc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwotCXNuZF9hbHMzMDBfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ3Miw3ICs0NDUsNiBAQAogCXVuc2lnbmVkIHNob3J0IHBlcmlvZF9ieXRlcyA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOwogCXVuc2lnbmVkIHNob3J0IGJ1ZmZlcl9ieXRlcyA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOwogCQotCXNuZF9hbHMzMDBfZGJnY2FsbGVudGVyKCk7CiAJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwogCXRtcCA9IHNuZF9hbHMzMDBfZ2NyX3JlYWQoY2hpcC0+cG9ydCwgUExBWUJBQ0tfQ09OVFJPTCk7CiAJdG1wICY9IH5UUkFOU0ZFUl9TVEFSVDsKQEAgLTQ5MSw3ICs0NjMsNiBAQAogCXNuZF9hbHMzMDBfZ2NyX3dyaXRlKGNoaXAtPnBvcnQsIFBMQVlCQUNLX0VORCwKIAkJCQkJcnVudGltZS0+ZG1hX2FkZHIgKyBidWZmZXJfYnl0ZXMgLSAxKTsKIAlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC01MDMsNyArNDc0LDYgQEAKIAl1bnNpZ25lZCBzaG9ydCBwZXJpb2RfYnl0ZXMgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKIAl1bnNpZ25lZCBzaG9ydCBidWZmZXJfYnl0ZXMgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKIAotCXNuZF9hbHMzMDBfZGJnY2FsbGVudGVyKCk7CiAJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwogCXRtcCA9IHNuZF9hbHMzMDBfZ2NyX3JlYWQoY2hpcC0+cG9ydCwgUkVDT1JEX0NPTlRST0wpOwogCXRtcCAmPSB+VFJBTlNGRVJfU1RBUlQ7CkBAIC01MjIsNyArNDkyLDYgQEAKIAlzbmRfYWxzMzAwX2djcl93cml0ZShjaGlwLT5wb3J0LCBSRUNPUkRfRU5ELAogCQkJCQlydW50aW1lLT5kbWFfYWRkciArIGJ1ZmZlcl9ieXRlcyAtIDEpOwogCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCXNuZF9hbHMzMDBfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUzNyw3ICs1MDYsNiBAQAogCWRhdGEgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAlyZWcgPSBkYXRhLT5jb250cm9sX3JlZ2lzdGVyOwogCi0Jc25kX2FsczMwMF9kYmdjYWxsZW50ZXIoKTsKIAlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CkBAIC01NjgsNyArNTM2LDYgQEAKIAkJcmV0ID0gLUVJTlZBTDsKIAl9CiAJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTU4Miw3ICs1NDksNiBAQAogCWRhdGEgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAlwZXJpb2RfYnl0ZXMgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKIAkKLQlzbmRfYWxzMzAwX2RiZ2NhbGxlbnRlcigpOwogCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOwogCWN1cnJlbnRfcHRyID0gKHUxNikgc25kX2FsczMwMF9nY3JfcmVhZChjaGlwLT5wb3J0LAogCQkJCQlkYXRhLT5ibG9ja19jb3VudGVyX3JlZ2lzdGVyKSArIDQ7CkBAIC01OTUsNyArNTYxLDYgQEAKIAlpZiAoZGF0YS0+cGVyaW9kX2ZsaXBmbG9wID09IDApCiAJCWN1cnJlbnRfcHRyICs9IHBlcmlvZF9ieXRlczsKIAlzbmRfYWxzMzAwX2RiZ3BsYXkoIlBvaW50ZXIgKGJ5dGVzKTogJWRcbiIsIGN1cnJlbnRfcHRyKTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBjdXJyZW50X3B0cik7CiB9CiAKQEAgLTYyNiw3ICs1OTEsNiBAQAogCXN0cnVjdCBzbmRfcGNtICpwY207CiAJaW50IGVycjsKIAotCXNuZF9hbHMzMDBfZGJnY2FsbGVudGVyKCk7CiAJZXJyID0gc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgIkFMUzMwMCIsIDAsIDEsIDEsICZwY20pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtNjQzLDcgKzYwNyw2IEBACiAJLyogcHJlLWFsbG9jYXRpb24gb2YgYnVmZmVycyAqLwogCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVYsCiAJc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLCA2NCoxMDI0LCA2NCoxMDI0KTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC02NTIsNyArNjE1LDYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiB0bXA7CiAJCi0Jc25kX2FsczMwMF9kYmdjYWxsZW50ZXIoKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKIAljaGlwLT5yZXZpc2lvbiA9IChzbmRfYWxzMzAwX2djcl9yZWFkKGNoaXAtPnBvcnQsIE1JU0NfQ09OVFJPTCkgPj4gMTYpCiAJCQkJCQkJCSYgMHgwMDAwMDAwRjsKQEAgLTY3OSw3ICs2NDEsNiBAQAogCXNuZF9hbHMzMDBfZ2NyX3dyaXRlKGNoaXAtPnBvcnQsIFBMQVlCQUNLX0NPTlRST0wsCiAJCQl0bXAgJiB+VFJBTlNGRVJfU1RBUlQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0Jc25kX2FsczMwMF9kYmdjYWxsbGVhdmUoKTsKIH0KIAogc3RhdGljIGludCBzbmRfYWxzMzAwX2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCkBAIC02OTUsMTMgKzY1NiwxMiBAQAogCX07CiAJKnJjaGlwID0gTlVMTDsKIAotCXNuZF9hbHMzMDBfZGJnY2FsbGVudGVyKCk7CiAJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpKSA8IDApCiAJCXJldHVybiBlcnI7CiAKIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygyOCkpIDwgMCB8fAogCQlwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjgpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlcnJvciBzZXR0aW5nIDI4Yml0IERNQSBtYXNrXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJlcnJvciBzZXR0aW5nIDI4Yml0IERNQSBtYXNrXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtNzMzLDcgKzY5Myw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIGlycV9oYW5kbGVyLCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2FsczMwMF9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTc0NCwxMyArNzA0LDEzIEBACiAKIAllcnIgPSBzbmRfYWxzMzAwX2FjOTcoY2hpcCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkNvdWxkIG5vdCBjcmVhdGUgYWM5N1xuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ291bGQgbm90IGNyZWF0ZSBhYzk3XG4iKTsKIAkJc25kX2FsczMwMF9mcmVlKGNoaXApOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCWlmICgoZXJyID0gc25kX2FsczMwMF9uZXdfcGNtKGNoaXApKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkNvdWxkIG5vdCBjcmVhdGUgUENNXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJDb3VsZCBub3QgY3JlYXRlIFBDTVxuIik7CiAJCXNuZF9hbHMzMDBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC03NjEsMTAgKzcyMSw3IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJjaGlwID0gY2hpcDsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC03OTQsOCArNzUxLDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImFsczMwMDogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtODI5LDcgKzc4NSw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxzNDAwMC5jIGIvc291bmQvcGNpL2FsczQwMDAuYwppbmRleCBmZmM4MjFiLi5iNzUxYzM4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWxzNDAwMC5jCisrKyBiL3NvdW5kL3BjaS9hbHM0MDAwLmMKQEAgLTU3OCw3ICs1NzgsNyBAQAogCQlzbmRfYWxzNGtfaW9iYXNlX3JlYWRiKGNoaXAtPmFsdF9wb3J0LAogCQkJCQlBTFM0S19JT0JfMTZfQUNLX0ZPUl9DUjFFKTsKIAotCS8qIHByaW50ayhLRVJOX0lORk8gImFsczQwMDA6IGlycSAweCUwNHggMHglMDR4XG4iLAorCS8qIGRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiYWxzNDAwMDogaXJxIDB4JTA0eCAweCUwNHhcbiIsCiAJCQkJCSBwY2lfaXJxc3RhdHVzLCBzYl9pcnFzdGF0dXMpOyAqLwogCiAJLyogb25seSBhY2sgdGhlIHRoaW5ncyB3ZSBhY3R1YWxseSBoYW5kbGVkIGFib3ZlICovCkBAIC03OTEsMTMgKzc5MSwxMyBAQAogCX0KIAogCWlmICghcikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhbHM0MDAwOiBjYW5ub3QgcmVzZXJ2ZSBqb3lzdGljayBwb3J0c1xuIik7CisJCWRldl93YXJuKCZhY2FyZC0+cGNpLT5kZXYsICJjYW5ub3QgcmVzZXJ2ZSBqb3lzdGljayBwb3J0c1xuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJYWNhcmQtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFncCkgewotCQlwcmludGsoS0VSTl9FUlIgImFsczQwMDA6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJZGV2X2VycigmYWNhcmQtPnBjaS0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOwogCQlyZWxlYXNlX2FuZF9mcmVlX3Jlc291cmNlKHIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC04NzMsNyArODczLDcgQEAKIAkvKiBjaGVjaywgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDI0IGJpdHMgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygyNCkpIDwgMCB8fAogCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjQpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjRiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlkZXZfZXJyKCZwY2ktPmRldiwgImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDI0Yml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtODg4LDkgKzg4OCw5IEBACiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaSwgUENJX0NPTU1BTkQsIHdvcmQgfCBQQ0lfQ09NTUFORF9JTyk7CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAkKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIAotCQkJICAgICAgc2l6ZW9mKCphY2FyZCkgLyogcHJpdmF0ZV9kYXRhOiBhY2FyZCAqLywKLQkJCSAgICAgICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZigqYWNhcmQpIC8qIHByaXZhdGVfZGF0YTogYWNhcmQgKi8sCisJCQkgICAmY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwY2kpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKQEAgLTkyMCw3ICs5MjAsNiBAQAogCiAJY2hpcC0+cGNpID0gcGNpOwogCWNoaXAtPmFsdF9wb3J0ID0gaW9iYXNlOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKIAogCXNuZF9hbHM0MDAwX2NvbmZpZ3VyZShjaGlwKTsKIApAQCAtOTM0LDcgKzkzMyw3IEBACiAJCQkJCU1QVTQwMV9JTkZPX0lOVEVHUkFURUQgfAogCQkJCQlNUFU0MDFfSU5GT19JUlFfSE9PSywKIAkJCQkJLTEsICZjaGlwLT5ybWlkaSkpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImFsczQwMDA6IG5vIE1QVS00MDEgZGV2aWNlIGF0IDB4JWx4P1xuIiwKKwkJZGV2X2VycigmcGNpLT5kZXYsICJubyBNUFUtNDAxIGRldmljZSBhdCAweCVseD9cbiIsCiAJCQkJaW9iYXNlICsgQUxTNEtfSU9CXzMwX01JRElfREFUQSk7CiAJCWdvdG8gb3V0X2VycjsKIAl9CkBAIC05NTUsNyArOTU0LDcgQEAKIAkJCQlpb2Jhc2UgKyBBTFM0S19JT0JfMTBfQURMSUJfQUREUjAsCiAJCQkJaW9iYXNlICsgQUxTNEtfSU9CXzEyX0FETElCX0FERFIyLAogCQkJICAgIE9QTDNfSFdfQVVUTywgMSwgJm9wbDMpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImFsczQwMDA6IG5vIE9QTCBkZXZpY2UgYXQgMHglbHgtMHglbHg/XG4iLAorCQlkZXZfZXJyKCZwY2ktPmRldiwgIm5vIE9QTCBkZXZpY2UgYXQgMHglbHgtMHglbHg/XG4iLAogCQkJICAgaW9iYXNlICsgQUxTNEtfSU9CXzEwX0FETElCX0FERFIwLAogCQkJICAgaW9iYXNlICsgQUxTNEtfSU9CXzEyX0FETElCX0FERFIyKTsKIAl9IGVsc2UgewpAQCAtMTAxNSw4ICsxMDE0LDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImFsczQwMDA6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hc2locGkvYXNpaHBpLmMgYi9zb3VuZC9wY2kvYXNpaHBpL2FzaWhwaS5jCmluZGV4IDVmMmFjZDMuLjkwMWM5NDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hc2locGkvYXNpaHBpLmMKKysrIGIvc291bmQvcGNpL2FzaWhwaS9hc2locGkuYwpAQCAtMTI1MywxMSArMTI1MywxMiBAQAogCQkJbnVtX291dHN0cmVhbXMsCW51bV9pbnN0cmVhbXMsICZwY20pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOworCiAJLyogcG9pbnRlciB0byBvcHMgc3RydWN0IGlzIHN0b3JlZCwgZG9udCBjaGFuZ2Ugb3BzIGFmdGVyd2FyZHMhICovCi0JCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCi0JCQkJJnNuZF9jYXJkX2FzaWhwaV9wbGF5YmFja19tbWFwX29wcyk7Ci0JCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwKLQkJCQkmc25kX2NhcmRfYXNpaHBpX2NhcHR1cmVfbW1hcF9vcHMpOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCisJCQkmc25kX2NhcmRfYXNpaHBpX3BsYXliYWNrX21tYXBfb3BzKTsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsCisJCQkmc25kX2NhcmRfYXNpaHBpX2NhcHR1cmVfbW1hcF9vcHMpOwogCiAJcGNtLT5wcml2YXRlX2RhdGEgPSBhc2locGk7CiAJcGNtLT5pbmZvX2ZsYWdzID0gMDsKQEAgLTI4MjcsMTcgKzI4MjgsMTMgQEAKIAlocGkgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CiAJYWRhcHRlcl9pbmRleCA9IGhwaS0+YWRhcHRlci0+aW5kZXg7CiAJLyogZmlyc3QgdHJ5IHRvIGdpdmUgdGhlIGNhcmQgdGhlIHNhbWUgaW5kZXggYXMgaXRzIGhhcmR3YXJlIGluZGV4ICovCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGFkYXB0ZXJfaW5kZXgsCi0JCQkgICAgICBpZFthZGFwdGVyX2luZGV4XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2FzaWhwaSksCi0JCQkgICAgICAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2lfZGV2LT5kZXYsIGFkYXB0ZXJfaW5kZXgsIGlkW2FkYXB0ZXJfaW5kZXhdLAorCQkJICAgVEhJU19NT0RVTEUsIHNpemVvZihzdHJ1Y3Qgc25kX2NhcmRfYXNpaHBpKSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKSB7CiAJCS8qIGlmIHRoYXQgZmFpbHMsIHRyeSB0aGUgZGVmYXVsdCBpbmRleD09bmV4dCBhdmFpbGFibGUgKi8KLQkJZXJyID0KLQkJICAgIHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLAotCQkJCSAgICBUSElTX01PRFVMRSwKLQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzbmRfY2FyZF9hc2locGkpLAotCQkJCSAgICAmY2FyZCk7CisJCWVyciA9IHNuZF9jYXJkX25ldygmcGNpX2Rldi0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLAorCQkJCSAgIFRISVNfTU9EVUxFLCBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2FzaWhwaSksCisJCQkJICAgJmNhcmQpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HCkBAIC0yODQ1LDggKzI4NDIsNiBAQAogCQkJYWRhcHRlcl9pbmRleCwgY2FyZC0+bnVtYmVyKTsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2lfZGV2LT5kZXYpOwotCiAJYXNpaHBpID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCWFzaWhwaS0+Y2FyZCA9IGNhcmQ7CiAJYXNpaHBpLT5wY2kgPSBwY2lfZGV2OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F0aWl4cC5jIGIvc291bmQvcGNpL2F0aWl4cC5jCmluZGV4IGY2ZGVjM2UuLmFlMDdiNDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdGlpeHAuYworKysgYi9zb3VuZC9wY2kvYXRpaXhwLmMKQEAgLTQzMiw3ICs0MzIsNyBAQAogCiAJd2hpbGUgKGF0aWl4cF9yZWFkKGNoaXAsIFBIWVNfT1VUX0FERFIpICYgQVRJX1JFR19QSFlTX09VVF9BRERSX0VOKSB7CiAJCWlmICghIHRpbWVvdXQtLSkgewotCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImF0aWl4cDogY29kZWMgYWNxdWlyZSB0aW1lb3V0XG4iKTsKKwkJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImNvZGVjIGFjcXVpcmUgdGltZW91dFxuIik7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CiAJCXVkZWxheSgxKTsKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCX0gd2hpbGUgKC0tdGltZW91dCk7CiAJLyogdGltZSBvdXQgbWF5IGhhcHBlbiBkdXJpbmcgcmVzZXQgKi8KIAlpZiAocmVnIDwgMHg3YykKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImF0aWl4cDogY29kZWMgcmVhZCB0aW1lb3V0IChyZWcgJXgpXG4iLCByZWcpOworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsICJjb2RlYyByZWFkIHRpbWVvdXQgKHJlZyAleClcbiIsIHJlZyk7CiAJcmV0dXJuIDB4ZmZmZjsKIH0KIApAQCAtNTIzLDcgKzUyMyw3IEBACiAJCW1kZWxheSgxKTsKIAkJYXRpaXhwX3VwZGF0ZShjaGlwLCBDTUQsIEFUSV9SRUdfQ01EX0FDX1JFU0VULCBBVElfUkVHX0NNRF9BQ19SRVNFVCk7CiAJCWlmICghLS10aW1lb3V0KSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhdGlpeHA6IGNvZGVjIHJlc2V0IHRpbWVvdXRcbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJjb2RlYyByZXNldCB0aW1lb3V0XG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNTY3LDkgKzU2Nyw4IEBACiAKIAlxID0gc25kX3BjaV9xdWlya19sb29rdXAocGNpLCBhdGlpeHBfcXVpcmtzKTsKIAlpZiAocSkgewotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8KLQkJCSAgICAiQXRpaXhwIHF1aXJrIGZvciAlcy4gIEZvcmNpbmcgY29kZWMgJWRcbiIsCi0JCQkgICAgc25kX3BjaV9xdWlya19uYW1lKHEpLCBxLT52YWx1ZSk7CisJCWRldl9kYmcoJnBjaS0+ZGV2LCAiYXRpaXhwIHF1aXJrIGZvciAlcy4gIEZvcmNpbmcgY29kZWMgJWRcbiIsCisJCQlzbmRfcGNpX3F1aXJrX25hbWUocSksIHEtPnZhbHVlKTsKIAkJcmV0dXJuIHEtPnZhbHVlOwogCX0KIAkvKiB0aGlzIGhhcmR3YXJlIGRvZXNuJ3QgbmVlZCB3b3JrYXJvdW5kcy4gIFByb2JlIGZvciBjb2RlYyAqLwpAQCAtNjAwLDcgKzU5OSw3IEBACiAJYXRpaXhwX3dyaXRlKGNoaXAsIElFUiwgMCk7IC8qIGRpc2FibGUgaXJxcyAqLwogCiAJaWYgKChjaGlwLT5jb2RlY19ub3RfcmVhZHlfYml0cyAmIEFMTF9DT0RFQ19OT1RfUkVBRFkpID09IEFMTF9DT0RFQ19OT1RfUkVBRFkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXRpaXhwOiBubyBjb2RlYyBkZXRlY3RlZCFcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIm5vIGNvZGVjIGRldGVjdGVkIVxuIik7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCXJldHVybiAwOwpAQCAtNjc2LDcgKzY3NSw3IEBACiAJCQljb250aW51ZTsKIAkJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCBjdXJwdHIpOwogCX0KLQlzbmRfcHJpbnRkKCJhdGlpeHA6IGludmFsaWQgRE1BIHBvaW50ZXIgcmVhZCAweCV4IChidWY9JXgpXG4iLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiaW52YWxpZCBETUEgcG9pbnRlciByZWFkIDB4JXggKGJ1Zj0leClcbiIsCiAJCSAgIHJlYWRsKGNoaXAtPnJlbWFwX2FkZHIgKyBkbWEtPm9wcy0+ZHRfY3VyKSwgZG1hLT5idWZfYWRkcik7CiAJcmV0dXJuIDA7CiB9CkBAIC02ODgsNyArNjg3LDcgQEAKIHsKIAlpZiAoISBkbWEtPnN1YnN0cmVhbSB8fCAhIGRtYS0+cnVubmluZykKIAkJcmV0dXJuOwotCXNuZF9wcmludGRkKCJhdGlpeHA6IFhSVU4gZGV0ZWN0ZWQgKERNQSAlZClcbiIsIGRtYS0+b3BzLT50eXBlKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIlhSVU4gZGV0ZWN0ZWQgKERNQSAlZClcbiIsIGRtYS0+b3BzLT50eXBlKTsKIAlzbmRfcGNtX3N0cmVhbV9sb2NrKGRtYS0+c3Vic3RyZWFtKTsKIAlzbmRfcGNtX3N0b3AoZG1hLT5zdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9YUlVOKTsKIAlzbmRfcGNtX3N0cmVhbV91bmxvY2soZG1hLT5zdWJzdHJlYW0pOwpAQCAtMTQ1MywxNCArMTQ1MiwxNSBAQAogCQkJYWM5Ny5zY2FwcyB8PSBBQzk3X1NDQVBfTk9fU1BESUY7CiAJCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZjaGlwLT5hYzk3W2ldKSkgPCAwKSB7CiAJCQljaGlwLT5hYzk3W2ldID0gTlVMTDsgLyogdG8gYmUgc3VyZSAqLwotCQkJc25kX3ByaW50ZGQoImF0aWl4cDogY29kZWMgJWQgbm90IGF2YWlsYWJsZSBmb3IgYXVkaW9cbiIsIGkpOworCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJImNvZGVjICVkIG5vdCBhdmFpbGFibGUgZm9yIGF1ZGlvXG4iLCBpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWNvZGVjX2NvdW50Kys7CiAJfQogCiAJaWYgKCEgY29kZWNfY291bnQpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXRpaXhwOiBubyBjb2RlYyBhdmFpbGFibGVcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIm5vIGNvZGVjIGF2YWlsYWJsZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTUxMSw4ICsxNTExLDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImF0aWl4cDogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTYzNywxNCArMTYzNiwxNCBAQAogCWNoaXAtPmFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKIAljaGlwLT5yZW1hcF9hZGRyID0gcGNpX2lvcmVtYXBfYmFyKHBjaSwgMCk7CiAJaWYgKGNoaXAtPnJlbWFwX2FkZHIgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBzcGFjZSBpb3JlbWFwIHByb2JsZW1cbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkFDJzk3IHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CiAJCXNuZF9hdGlpeHBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfYXRpaXhwX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9hdGlpeHBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0xNjU3LDggKzE2NTYsNiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyX2NoaXAgPSBjaGlwOwogCXJldHVybiAwOwogfQpAQCAtMTY3MSw3ICsxNjY4LDcgQEAKIAlzdHJ1Y3QgYXRpaXhwICpjaGlwOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jIGIvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jCmluZGV4IDI4OTU2M2UuLmI5ZGM5NmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYworKysgYi9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMKQEAgLTQwMCw3ICs0MDAsNyBAQAogCiAJd2hpbGUgKGF0aWl4cF9yZWFkKGNoaXAsIFBIWVNfT1VUX0FERFIpICYgQVRJX1JFR19QSFlTX09VVF9BRERSX0VOKSB7CiAJCWlmICghIHRpbWVvdXQtLSkgewotCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImF0aWl4cC1tb2RlbTogY29kZWMgYWNxdWlyZSB0aW1lb3V0XG4iKTsKKwkJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImNvZGVjIGFjcXVpcmUgdGltZW91dFxuIik7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CiAJCXVkZWxheSgxKTsKQEAgLTQzMyw3ICs0MzMsNyBAQAogCX0gd2hpbGUgKC0tdGltZW91dCk7CiAJLyogdGltZSBvdXQgbWF5IGhhcHBlbiBkdXJpbmcgcmVzZXQgKi8KIAlpZiAocmVnIDwgMHg3YykKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImF0aWl4cC1tb2RlbTogY29kZWMgcmVhZCB0aW1lb3V0IChyZWcgJXgpXG4iLCByZWcpOworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsICJjb2RlYyByZWFkIHRpbWVvdXQgKHJlZyAleClcbiIsIHJlZyk7CiAJcmV0dXJuIDB4ZmZmZjsKIH0KIApAQCAtNDk5LDcgKzQ5OSw3IEBACiAJCW1zbGVlcCgxKTsKIAkJYXRpaXhwX3VwZGF0ZShjaGlwLCBDTUQsIEFUSV9SRUdfQ01EX0FDX1JFU0VULCBBVElfUkVHX0NNRF9BQ19SRVNFVCk7CiAJCWlmICghLS10aW1lb3V0KSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhdGlpeHAtbW9kZW06IGNvZGVjIHJlc2V0IHRpbWVvdXRcbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJjb2RlYyByZXNldCB0aW1lb3V0XG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNTUzLDcgKzU1Myw3IEBACiAJYXRpaXhwX3dyaXRlKGNoaXAsIElFUiwgMCk7IC8qIGRpc2FibGUgaXJxcyAqLwogCiAJaWYgKChjaGlwLT5jb2RlY19ub3RfcmVhZHlfYml0cyAmIEFMTF9DT0RFQ19OT1RfUkVBRFkpID09IEFMTF9DT0RFQ19OT1RfUkVBRFkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXRpaXhwLW1vZGVtOiBubyBjb2RlYyBkZXRlY3RlZCFcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIm5vIGNvZGVjIGRldGVjdGVkIVxuIik7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCXJldHVybiAwOwpAQCAtNjI0LDcgKzYyNCw3IEBACiAJCQljb250aW51ZTsKIAkJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCBjdXJwdHIpOwogCX0KLQlzbmRfcHJpbnRkKCJhdGlpeHAtbW9kZW06IGludmFsaWQgRE1BIHBvaW50ZXIgcmVhZCAweCV4IChidWY9JXgpXG4iLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiaW52YWxpZCBETUEgcG9pbnRlciByZWFkIDB4JXggKGJ1Zj0leClcbiIsCiAJCSAgIHJlYWRsKGNoaXAtPnJlbWFwX2FkZHIgKyBkbWEtPm9wcy0+ZHRfY3VyKSwgZG1hLT5idWZfYWRkcik7CiAJcmV0dXJuIDA7CiB9CkBAIC02MzcsNyArNjM3LDcgQEAKIHsKIAlpZiAoISBkbWEtPnN1YnN0cmVhbSB8fCAhIGRtYS0+cnVubmluZykKIAkJcmV0dXJuOwotCXNuZF9wcmludGRkKCJhdGlpeHAtbW9kZW06IFhSVU4gZGV0ZWN0ZWQgKERNQSAlZClcbiIsIGRtYS0+b3BzLT50eXBlKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIlhSVU4gZGV0ZWN0ZWQgKERNQSAlZClcbiIsIGRtYS0+b3BzLT50eXBlKTsKIAlzbmRfcGNtX3N0cmVhbV9sb2NrKGRtYS0+c3Vic3RyZWFtKTsKIAlzbmRfcGNtX3N0b3AoZG1hLT5zdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9YUlVOKTsKIAlzbmRfcGNtX3N0cmVhbV91bmxvY2soZG1hLT5zdWJzdHJlYW0pOwpAQCAtMTA5OCwxNCArMTA5OCwxNSBAQAogCQlhYzk3LnNjYXBzID0gQUM5N19TQ0FQX1NLSVBfQVVESU8gfCBBQzk3X1NDQVBfUE9XRVJfU0FWRTsKIAkJaWYgKChlcnIgPSBzbmRfYWM5N19taXhlcihwYnVzLCAmYWM5NywgJmNoaXAtPmFjOTdbaV0pKSA8IDApIHsKIAkJCWNoaXAtPmFjOTdbaV0gPSBOVUxMOyAvKiB0byBiZSBzdXJlICovCi0JCQlzbmRfcHJpbnRkZCgiYXRpaXhwLW1vZGVtOiBjb2RlYyAlZCBub3QgYXZhaWxhYmxlIGZvciBtb2RlbVxuIiwgaSk7CisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiY29kZWMgJWQgbm90IGF2YWlsYWJsZSBmb3IgbW9kZW1cbiIsIGkpOwogCQkJY29udGludWU7CiAJCX0KIAkJY29kZWNfY291bnQrKzsKIAl9CiAKIAlpZiAoISBjb2RlY19jb3VudCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhdGlpeHAtbW9kZW06IG5vIGNvZGVjIGF2YWlsYWJsZVxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAibm8gY29kZWMgYXZhaWxhYmxlXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMTUwLDggKzExNTEsNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYXRpaXhwLW1vZGVtOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0xMjYyLDE0ICsxMjYyLDE0IEBACiAJY2hpcC0+YWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOwogCWNoaXAtPnJlbWFwX2FkZHIgPSBwY2lfaW9yZW1hcF9iYXIocGNpLCAwKTsKIAlpZiAoY2hpcC0+cmVtYXBfYWRkciA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQUMnOTcgc3BhY2UgaW9yZW1hcCBwcm9ibGVtXG4iKTsKIAkJc25kX2F0aWl4cF9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9hdGlpeHBfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2F0aWl4cF9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTEyODIsOCArMTI4Miw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJfY2hpcCA9IGNoaXA7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMjk2LDcgKzEyOTQsNyBAQAogCXN0cnVjdCBhdGlpeHBfbW9kZW0gKmNoaXA7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MC5jIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDAuYwppbmRleCA3MDU5ZGQ2Li5hZmIxYjQ0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MC5jCisrKyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwLmMKQEAgLTIxMSw4ICsyMTEsNiBAQAogCQlnb3RvIGFsbG9jX291dDsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcmNoaXAgPSBjaGlwOwogCiAJcmV0dXJuIDA7CkBAIC0yNTAsNyArMjQ4LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCS8vICgyKQotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXcyL2F3Mi1hbHNhLmMgYi9zb3VuZC9wY2kvYXcyL2F3Mi1hbHNhLmMKaW5kZXggMjkyNTIyMC4uMTIwZDBkMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F3Mi9hdzItYWxzYS5jCisrKyBiL3NvdW5kL3BjaS9hdzIvYXcyLWFsc2EuYwpAQCAtMjYyLDcgKzI2Miw3IEBACiAJLyogY2hlY2sgUENJIGF2YWlsYWJpbGl0eSAoMzJiaXQgRE1BKSAqLwogCWlmICgocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygzMikpIDwgMCkgfHwKIAkgICAgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygzMikpIDwgMCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhdzI6IEltcG9zc2libGUgdG8gc2V0IDMyYml0IG1hc2sgRE1BXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJJbXBvc3NpYmxlIHRvIHNldCAzMmJpdCBtYXNrIERNQVxuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTI5MCw3ICsyOTAsNyBAQAogCQkJCXBjaV9yZXNvdXJjZV9sZW4ocGNpLCAwKSk7CiAKIAlpZiAoY2hpcC0+aW9iYXNlX3ZpcnQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImF3MjogdW5hYmxlIHRvIHJlbWFwIG1lbW9yeSByZWdpb24iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gcmVtYXAgbWVtb3J5IHJlZ2lvbiIpOwogCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBjaSk7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlrZnJlZShjaGlwKTsKQEAgLTMwMiw3ICszMDIsNyBAQAogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfYXcyX3NhYTcxNDZfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlwcmludGsoS0VSTl9FUlIgImF3MjogQ2Fubm90IGdyYWIgaXJxICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ2Fubm90IGdyYWIgaXJxICVkXG4iLCBwY2ktPmlycSk7CiAKIAkJaW91bm1hcChjaGlwLT5pb2Jhc2VfdmlydCk7CiAJCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY2hpcC0+cGNpKTsKQEAgLTMyMiwxMiArMzIyLDEwIEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwogCSpyY2hpcCA9IGNoaXA7CiAKLQlwcmludGsoS0VSTl9JTkZPCi0JICAgICAgICJBdWRpb3dlcmsgMiBzb3VuZCBjYXJkIChzYWE3MTQ2IGNoaXBzZXQpIGRldGVjdGVkIGFuZCAiCi0JICAgICAgICJtYW5hZ2VkXG4iKTsKKwlkZXZfaW5mbyhjYXJkLT5kZXYsCisJCSAiQXVkaW93ZXJrIDIgc291bmQgY2FyZCAoc2FhNzE0NiBjaGlwc2V0KSBkZXRlY3RlZCBhbmQgbWFuYWdlZFxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM0OSw3ICszNDcsOCBAQAogCX0KIAogCS8qICgyKSBDcmVhdGUgY2FyZCBpbnN0YW5jZSAqLwotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0zOTksNyArMzk4LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9ERUJVRyAiYXcyOiBQbGF5YmFja19vcGVuXG4iKTsKKwlkZXZfZGJnKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsICJQbGF5YmFja19vcGVuXG4iKTsKIAlydW50aW1lLT5odyA9IHNuZF9hdzJfcGxheWJhY2tfaHc7CiAJcmV0dXJuIDA7CiB9CkBAIC00MTUsNyArNDE0LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9ERUJVRyAiYXcyOiBDYXB0dXJlX29wZW5cbiIpOworCWRldl9kYmcoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwgIkNhcHR1cmVfb3BlblxuIik7CiAJcnVudGltZS0+aHcgPSBzbmRfYXcyX2NhcHR1cmVfaHc7CiAJcmV0dXJuIDA7CiB9CkBAIC02MDMsNyArNjAyLDcgQEAKIAllcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCAiQXVkaW93ZXJrMiBhbmFsb2cgcGxheWJhY2siLCAwLCAxLCAwLAogCQkJICAmcGNtX3BsYXliYWNrX2FuYSk7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhdzI6IHNuZF9wY21fbmV3IGVycm9yICgweCVYKVxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJzbmRfcGNtX25ldyBlcnJvciAoMHglWClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC02MzMsMTQgKzYzMiwxNSBAQAogCQkJCQkJICAgIChjaGlwLT5wY2kpLAogCQkJCQkJICAgIDY0ICogMTAyNCwgNjQgKiAxMDI0KTsKIAlpZiAoZXJyKQotCQlwcmludGsoS0VSTl9FUlIgImF3Mjogc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbCAiCi0JCSAgICAgICAiZXJyb3IgKDB4JVgpXG4iLCBlcnIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsIGVycm9yICgweCVYKVxuIiwKKwkJCWVycik7CiAKIAllcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCAiQXVkaW93ZXJrMiBkaWdpdGFsIHBsYXliYWNrIiwgMSwgMSwgMCwKIAkJCSAgJnBjbV9wbGF5YmFja19udW0pOwogCiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhdzI6IHNuZF9wY21fbmV3IGVycm9yICgweCVYKVxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJzbmRfcGNtX25ldyBlcnJvciAoMHglWClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCS8qIENyZWF0aW9uIG9rICovCkBAIC02NjksMTcgKzY2OSwxNSBAQAogCQkJCQkJICAgIChjaGlwLT5wY2kpLAogCQkJCQkJICAgIDY0ICogMTAyNCwgNjQgKiAxMDI0KTsKIAlpZiAoZXJyKQotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJhdzI6IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwgZXJyb3IgIgotCQkgICAgICAgIigweCVYKVxuIiwgZXJyKTsKLQotCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwgZXJyb3IgKDB4JVgpXG4iLAorCQkJZXJyKTsKIAogCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJBdWRpb3dlcmsyIGNhcHR1cmUiLCAyLCAwLCAxLAogCQkJICAmcGNtX2NhcHR1cmUpOwogCiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhdzI6IHNuZF9wY21fbmV3IGVycm9yICgweCVYKVxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJzbmRfcGNtX25ldyBlcnJvciAoMHglWClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC03MDksMTUgKzcwNywxNSBAQAogCQkJCQkJICAgIChjaGlwLT5wY2kpLAogCQkJCQkJICAgIDY0ICogMTAyNCwgNjQgKiAxMDI0KTsKIAlpZiAoZXJyKQotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJhdzI6IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwgZXJyb3IgIgotCQkgICAgICAgIigweCVYKVxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkic25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbCBlcnJvciAoMHglWClcbiIsCisJCQllcnIpOwogCiAKIAkvKiBDcmVhdGUgY29udHJvbCAqLwogCWVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIHNuZF9jdGxfbmV3MSgmYXcyX2NvbnRyb2wsIGNoaXApKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImF3Mjogc25kX2N0bF9hZGQgZXJyb3IgKDB4JVgpXG4iLCBlcnIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgInNuZF9jdGxfYWRkIGVycm9yICgweCVYKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdzIvYXcyLXNhYTcxNDYuYyBiL3NvdW5kL3BjaS9hdzIvYXcyLXNhYTcxNDYuYwppbmRleCA0NDM5NjM2Li42ZDI0ZTk1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXcyL2F3Mi1zYWE3MTQ2LmMKKysrIGIvc291bmQvcGNpL2F3Mi9hdzItc2FhNzE0Ni5jCkBAIC0yMDQsOCArMjA0LDcgQEAKIAkJLyogRGVmaW5lIHVwcGVyIGxpbWl0IGZvciBETUEgYWNjZXNzICovCiAJCVdSSVRFUkVHKGRtYV9hZGRyICsgYnVmZmVyX3NpemUsIFByb3RBMV9vdXQpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImF3Mjogc25kX2F3Ml9zYWE3MTQ2X3BjbV9pbml0X3BsYXliYWNrOiAiCisJCXByX2VycigiYXcyOiBzbmRfYXcyX3NhYTcxNDZfcGNtX2luaXRfcGxheWJhY2s6ICIKIAkJICAgICAgICJTdWJzdHJlYW0gbnVtYmVyIGlzIG5vdCAwIG9yIDEgLT4gbm90IG1hbmFnZWRcbiIpOwogCX0KIH0KQEAgLTI1MSw4ICsyNTAsNyBAQAogCQkvKiBEZWZpbmUgdXBwZXIgbGltaXQgZm9yIERNQSBhY2Nlc3MgICovCiAJCVdSSVRFUkVHKGRtYV9hZGRyICsgYnVmZmVyX3NpemUsIFByb3RBMV9pbik7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiYXcyOiBzbmRfYXcyX3NhYTcxNDZfcGNtX2luaXRfY2FwdHVyZTogIgorCQlwcl9lcnIoImF3Mjogc25kX2F3Ml9zYWE3MTQ2X3BjbV9pbml0X2NhcHR1cmU6ICIKIAkJICAgICAgICJTdWJzdHJlYW0gbnVtYmVyIGlzIG5vdCAwIC0+IG5vdCBtYW5hZ2VkXG4iKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXp0MzMyOC5jIGIvc291bmQvcGNpL2F6dDMzMjguYwppbmRleCAxYWVmNzEyLi5jOTIxNmMwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXp0MzMyOC5jCisrKyBiL3NvdW5kL3BjaS9henQzMzI4LmMKQEAgLTIzOCw2MSArMjM4LDYgQEAKICAgICAyPi9kZXYvbnVsbAogKi8KIAotI2RlZmluZSBERUJVR19NSVNDCTAKLSNkZWZpbmUgREVCVUdfQ0FMTFMJMAotI2RlZmluZSBERUJVR19NSVhFUgkwCi0jZGVmaW5lIERFQlVHX0NPREVDCTAKLSNkZWZpbmUgREVCVUdfVElNRVIJMAotI2RlZmluZSBERUJVR19HQU1FCTAKLSNkZWZpbmUgREVCVUdfUE0JMAotI2RlZmluZSBNSVhFUl9URVNUSU5HCTAKLQotI2lmIERFQlVHX01JU0MKLSNkZWZpbmUgc25kX2F6ZjMzMjhfZGJnbWlzYyhmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCwgIyNhcmdzKQotI2Vsc2UKLSNkZWZpbmUgc25kX2F6ZjMzMjhfZGJnbWlzYyhmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotI2lmIERFQlVHX0NBTExTCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ2NhbGxzKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKGZvcm1hdCwgIyNhcmdzKQotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKSBwcmludGsoS0VSTl9ERUJVRyAiLS0+ICVzXG4iLCBfX2Z1bmNfXykKLSNkZWZpbmUgc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCkgcHJpbnRrKEtFUk5fREVCVUcgIjwtLSAlc1xuIiwgX19mdW5jX18pCi0jZWxzZQotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdjYWxscyhmb3JtYXQsIGFyZ3MuLi4pCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpCi0jZW5kaWYKLQotI2lmIERFQlVHX01JWEVSCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ21peGVyKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0LCAjI2FyZ3MpCi0jZWxzZQotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdtaXhlcihmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotI2lmIERFQlVHX0NPREVDCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ2NvZGVjKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0LCAjI2FyZ3MpCi0jZWxzZQotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdjb2RlYyhmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotI2lmIERFQlVHX01JU0MKLSNkZWZpbmUgc25kX2F6ZjMzMjhfZGJndGltZXIoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQsICMjYXJncykKLSNlbHNlCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ3RpbWVyKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi0jaWYgREVCVUdfR0FNRQotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdnYW1lKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0LCAjI2FyZ3MpCi0jZWxzZQotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdnYW1lKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi0jaWYgREVCVUdfUE0KLSNkZWZpbmUgc25kX2F6ZjMzMjhfZGJncG0oZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQsICMjYXJncykKLSNlbHNlCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ3BtKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCiBzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwkvKiBJbmRleCAwLU1BWCAqLwogbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBBWkYzMzI4IHNvdW5kY2FyZC4iKTsKQEAgLTQ3NSw2ICs0MjAsMTIgQEAKIAlyZXR1cm4gaW5iKGNoaXAtPmN0cmxfaW8gKyByZWcpOwogfQogCitzdGF0aWMgaW5saW5lIHUxNgorc25kX2F6ZjMzMjhfY3RybF9pbncoY29uc3Qgc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwLCB1bnNpZ25lZCByZWcpCit7CisJcmV0dXJuIGludyhjaGlwLT5jdHJsX2lvICsgcmVnKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkCiBzbmRfYXpmMzMyOF9jdHJsX291dHcoY29uc3Qgc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwLCB1bnNpZ25lZCByZWcsIHUxNiB2YWx1ZSkKIHsKQEAgLTU3OCwxMSArNTI5LDEyIEBACiAjaWZkZWYgQVpGX1VTRV9BQzk3X0xBWUVSCiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotc25kX2F6ZjMzMjhfbWl4ZXJfYWM5N19tYXBfdW5zdXBwb3J0ZWQodW5zaWduZWQgc2hvcnQgcmVnLCBjb25zdCBjaGFyICptb2RlKQorc25kX2F6ZjMzMjhfbWl4ZXJfYWM5N19tYXBfdW5zdXBwb3J0ZWQoY29uc3Qgc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwLAorCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCByZWcsIGNvbnN0IGNoYXIgKm1vZGUpCiB7CiAJLyogbmVlZCB0byBhZGQgc29tZSBtb3JlIG9yIGxlc3MgY2xldmVyIGVtdWxhdGlvbj8gKi8KLQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSJhenQzMzI4OiBtaXNzaW5nICVzIGVtdWxhdGlvbiBmb3IgQUM5NyByZWdpc3RlciAweCUwMnghXG4iLAorCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwKKwkJIm1pc3NpbmcgJXMgZW11bGF0aW9uIGZvciBBQzk3IHJlZ2lzdGVyIDB4JTAyeCFcbiIsCiAJCW1vZGUsIHJlZyk7CiB9CiAKQEAgLTcxNywxMCArNjY5LDggQEAKIAl1bnNpZ25lZCBzaG9ydCByZWdfdmFsID0gMDsKIAlib29sIHVuc3VwcG9ydGVkID0gZmFsc2U7CiAKLQlzbmRfYXpmMzMyOF9kYmdtaXhlcigKLQkJInNuZF9hemYzMzI4X21peGVyX2FjOTdfcmVhZCByZWdfYWM5NyAldVxuIiwKLQkJCXJlZ19hYzk3Ci0JKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInNuZF9hemYzMzI4X21peGVyX2FjOTdfcmVhZCByZWdfYWM5NyAldVxuIiwKKwkJcmVnX2FjOTcpOwogCWlmIChyZWdfYXpmICYgQVpGX0FDOTdfUkVHX1VOU1VQUE9SVEVEKQogCQl1bnN1cHBvcnRlZCA9IHRydWU7CiAJZWxzZSB7CkBAIC03NjUsNyArNzE1LDcgQEAKIAkJfQogCX0KIAlpZiAodW5zdXBwb3J0ZWQpCi0JCXNuZF9hemYzMzI4X21peGVyX2FjOTdfbWFwX3Vuc3VwcG9ydGVkKHJlZ19hYzk3LCAicmVhZCIpOworCQlzbmRfYXpmMzMyOF9taXhlcl9hYzk3X21hcF91bnN1cHBvcnRlZChjaGlwLCByZWdfYWM5NywgInJlYWQiKTsKIAogCXJldHVybiByZWdfdmFsOwogfQpAQCAtNzc4LDEwICs3MjgsOSBAQAogCXVuc2lnbmVkIHNob3J0IHJlZ19hemYgPSBzbmRfYXpmMzMyOF9taXhlcl9hYzk3X21hcF9yZWdfaWR4KHJlZ19hYzk3KTsKIAlib29sIHVuc3VwcG9ydGVkID0gZmFsc2U7CiAKLQlzbmRfYXpmMzMyOF9kYmdtaXhlcigKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKIAkJInNuZF9hemYzMzI4X21peGVyX2FjOTdfd3JpdGUgcmVnX2FjOTcgJXUgdmFsICV1XG4iLAotCQkJcmVnX2FjOTcsIHZhbAotCSk7CisJCXJlZ19hYzk3LCB2YWwpOwogCWlmIChyZWdfYXpmICYgQVpGX0FDOTdfUkVHX1VOU1VQUE9SVEVEKQogCQl1bnN1cHBvcnRlZCA9IHRydWU7CiAJZWxzZSB7CkBAIC04MTQsNyArNzYzLDcgQEAKIAkJfQogCX0KIAlpZiAodW5zdXBwb3J0ZWQpCi0JCXNuZF9hemYzMzI4X21peGVyX2FjOTdfbWFwX3Vuc3VwcG9ydGVkKHJlZ19hYzk3LCAid3JpdGUiKTsKKwkJc25kX2F6ZjMzMjhfbWl4ZXJfYWM5N19tYXBfdW5zdXBwb3J0ZWQoY2hpcCwgcmVnX2FjOTcsICJ3cml0ZSIpOwogfQogCiBzdGF0aWMgaW50CkBAIC04NTAsNyArNzk5LDcgQEAKIAkJICogZHVlIHRvIHRoaXMgY2FyZCBiZWluZyBhIHZlcnkgcXVpcmt5IEFDOTcgImxvb2thbGlrZSIuCiAJCSAqLwogCWlmIChyYykKLQkJcHJpbnRrKEtFUk5fRVJSICJhenQzMzI4OiBBQzk3IGluaXQgZmFpbGVkLCBlcnIgJWQhXG4iLCByYyk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQUM5NyBpbml0IGZhaWxlZCwgZXJyICVkIVxuIiwgcmMpOwogCiAJLyogSWYgd2UgcmV0dXJuIGFuIGVycm9yIGhlcmUsIHRoZW4gc25kX2NhcmRfZnJlZSgpIHNob3VsZAogCSAqIGZyZWUgdXAgYW55IGFjOTcgY29kZWNzIHRoYXQgZ290IGNyZWF0ZWQsIGFzIHdlbGwgYXMgdGhlIGJ1cy4KQEAgLTg3MCw4ICs4MTksNiBAQAogCXVuc2lnbmVkIGNoYXIgY3Vycl92b2xfbGVmdCA9IDAsIGN1cnJfdm9sX3JpZ2h0ID0gMDsKIAlpbnQgbGVmdF9jaGFuZ2UgPSAwLCByaWdodF9jaGFuZ2UgPSAwOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7Ci0KIAlpZiAoY2hhbl9zZWwgJiBTRVRfQ0hBTl9MRUZUKSB7CiAJCWN1cnJfdm9sX2xlZnQgID0gaW5iKHBvcnRiYXNlICsgMSk7CiAKQEAgLTkxMiw3ICs4NTksNiBAQAogCQlpZiAoZGVsYXkpCiAJCQltZGVsYXkoZGVsYXkpOwogCX0gd2hpbGUgKChsZWZ0X2NoYW5nZSkgfHwgKHJpZ2h0X2NoYW5nZSkpOwotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogfQogCiAvKgpAQCAtOTkwLDE0ICs5MzYsMTIgQEAKIHsKIAlzdHJ1Y3QgYXpmMzMyOF9taXhlcl9yZWcgcmVnOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CiAJc25kX2F6ZjMzMjhfbWl4ZXJfcmVnX2RlY29kZSgmcmVnLCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CiAJdWluZm8tPnR5cGUgPSByZWcubWFzayA9PSAxID8KIAkJU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOIDogU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOwogCXVpbmZvLT5jb3VudCA9IHJlZy5zdGVyZW8gKyAxOwogCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CiAJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gcmVnLm1hc2s7Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMDksNyArOTUzLDYgQEAKIAlzdHJ1Y3QgYXpmMzMyOF9taXhlcl9yZWcgcmVnOwogCXUxNiBvcmVnLCB2YWw7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKIAlzbmRfYXpmMzMyOF9taXhlcl9yZWdfZGVjb2RlKCZyZWcsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKIAogCW9yZWcgPSBzbmRfYXpmMzMyOF9taXhlcl9pbncoY2hpcCwgcmVnLnJlZyk7CkBAIC0xMDIzLDEyICs5NjYsMTEgQEAKIAkJCXZhbCA9IHJlZy5tYXNrIC0gdmFsOwogCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IHZhbDsKIAl9Ci0Jc25kX2F6ZjMzMjhfZGJnbWl4ZXIoImdldDogJTAyeCBpcyAlMDR4IC0+IHZvbCAlMDJseHwlMDJseCAiCi0JCQkgICAgICIoc2hpZnQgJTAyZHwlMDJkLCBtYXNrICUwMngsIGludi4gJWQsIHN0ZXJlbyAlZClcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJnZXQ6ICUwMnggaXMgJTA0eCAtPiB2b2wgJTAybHh8JTAybHggKHNoaWZ0ICUwMmR8JTAyZCwgbWFzayAlMDJ4LCBpbnYuICVkLCBzdGVyZW8gJWQpXG4iLAogCQlyZWcucmVnLCBvcmVnLAogCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0sCiAJCXJlZy5sY2hhbl9zaGlmdCwgcmVnLnJjaGFuX3NoaWZ0LCByZWcubWFzaywgcmVnLmludmVydCwgcmVnLnN0ZXJlbyk7Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwNDAsNyArOTgyLDYgQEAKIAlzdHJ1Y3QgYXpmMzMyOF9taXhlcl9yZWcgcmVnOwogCXUxNiBvcmVnLCBucmVnLCB2YWw7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKIAlzbmRfYXpmMzMyOF9taXhlcl9yZWdfZGVjb2RlKCZyZWcsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKIAlvcmVnID0gc25kX2F6ZjMzMjhfbWl4ZXJfaW53KGNoaXAsIHJlZy5yZWcpOwogCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgcmVnLm1hc2s7CkBAIC0xMDY0LDEyICsxMDA1LDExIEBACiAJZWxzZQogICAgICAgICAJc25kX2F6ZjMzMjhfbWl4ZXJfb3V0dyhjaGlwLCByZWcucmVnLCBucmVnKTsKIAotCXNuZF9hemYzMzI4X2RiZ21peGVyKCJwdXQ6ICUwMnggdG8gJTAybHh8JTAybHgsICIKLQkJCSAgICAgIm9yZWcgJTA0eDsgc2hpZnQgJTAyZHwlMDJkIC0+IG5yZWcgJTA0eDsgYWZ0ZXI6ICUwNHhcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJwdXQ6ICUwMnggdG8gJTAybHh8JTAybHgsIG9yZWcgJTA0eDsgc2hpZnQgJTAyZHwlMDJkIC0+IG5yZWcgJTA0eDsgYWZ0ZXI6ICUwNHhcbiIsCiAJCXJlZy5yZWcsIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSwKIAkJb3JlZywgcmVnLmxjaGFuX3NoaWZ0LCByZWcucmNoYW5fc2hpZnQsCiAJCW5yZWcsIHNuZF9hemYzMzI4X21peGVyX2ludyhjaGlwLCByZWcucmVnKSk7Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIChucmVnICE9IG9yZWcpOwogfQogCkBAIC0xMTM1LDcgKzEwNzUsOCBAQAogCX0gZWxzZQogICAgICAgICAJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9ICh2YWwgPj4gcmVnLmxjaGFuX3NoaWZ0KSAmIChyZWcuZW51bV9jIC0gMSk7CiAKLQlzbmRfYXpmMzMyOF9kYmdtaXhlcigiZ2V0X2VudW06ICUwMnggaXMgJTA0eCAtPiAlZHwlZCAoc2hpZnQgJTAyZCwgZW51bV9jICVkKVxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJImdldF9lbnVtOiAlMDJ4IGlzICUwNHggLT4gJWR8JWQgKHNoaWZ0ICUwMmQsIGVudW1fYyAlZClcbiIsCiAJCXJlZy5yZWcsIHZhbCwgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSwgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSwKIAkJcmVnLmxjaGFuX3NoaWZ0LCByZWcuZW51bV9jKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xMTY3LDcgKzExMDgsOCBAQAogCXNuZF9hemYzMzI4X21peGVyX291dHcoY2hpcCwgcmVnLnJlZywgdmFsKTsKIAlucmVnID0gdmFsOwogCi0Jc25kX2F6ZjMzMjhfZGJnbWl4ZXIoInB1dF9lbnVtOiAlMDJ4IHRvICUwNHgsIG9yZWcgJTA0eFxuIiwgcmVnLnJlZywgdmFsLCBvcmVnKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJInB1dF9lbnVtOiAlMDJ4IHRvICUwNHgsIG9yZWcgJTA0eFxuIiwgcmVnLnJlZywgdmFsLCBvcmVnKTsKIAlyZXR1cm4gKG5yZWcgIT0gb3JlZyk7CiB9CiAKQEAgLTEyNTMsNyArMTE5NSw2IEBACiAJdW5zaWduZWQgaW50IGlkeDsKIAlpbnQgZXJyOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CiAJaWYgKHNuZF9CVUdfT04oIWNoaXAgfHwgIWNoaXAtPmNhcmQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTI3OSw3ICsxMjIwLDYgQEAKIAlzbmRfY29tcG9uZW50X2FkZChjYXJkLCAiQVpGMzMyOCBtaXhlciIpOwogCXN0cmNweShjYXJkLT5taXhlcm5hbWUsICJBWkYzMzI4IG1peGVyIik7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBBWkZfVVNFX0FDOTdfTEFZRVIgKi8KQEAgLTEyODgsMTkgKzEyMjgsMTMgQEAKIHNuZF9hemYzMzI4X2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCiB7Ci0JaW50IHJlczsKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKLQlyZXMgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOwotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwotCXJldHVybiByZXM7CisJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7CiB9CiAKIHN0YXRpYyBpbnQKIHNuZF9hemYzMzI4X2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CiAJc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC0xMzE1LDcgKzEyNDksNiBAQAogCXUxNiB2YWwgPSAweGZmMDA7CiAJdTggZnJlcSA9IDA7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKIAlzd2l0Y2ggKGJpdHJhdGUpIHsKIAljYXNlIEFaRl9GUkVRXzQwMDA6ICBmcmVxID0gU09VTkRGT1JNQVRfRlJFUV9TVVNQRUNURURfNDAwMDsgYnJlYWs7CiAJY2FzZSBBWkZfRlJFUV80ODAwOiAgZnJlcSA9IFNPVU5ERk9STUFUX0ZSRVFfU1VTUEVDVEVEXzQ4MDA7IGJyZWFrOwpAQCAtMTM3OSw3ICsxMzEyLDYgQEAKIAkJKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY29kZWMtPmxvY2ssIGZsYWdzKTsKLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC0xNDA0LDE1ICsxMzM2LDE2IEBACiAJCWNoaXAtPnNoYWRvd19yZWdfY3RybF82QUggfD0gYml0bWFzazsKIAllbHNlCiAJCWNoaXAtPnNoYWRvd19yZWdfY3RybF82QUggJj0gfmJpdG1hc2s7Ci0Jc25kX2F6ZjMzMjhfZGJnY29kZWMoIjZBSF91cGRhdGUgbWFzayAweCUwNHggZG9fbWFzayAlZDogdmFsIDB4JTA0eFxuIiwKLQkJCWJpdG1hc2ssIGRvX21hc2ssIGNoaXAtPnNoYWRvd19yZWdfY3RybF82QUgpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiNkFIX3VwZGF0ZSBtYXNrIDB4JTA0eCBkb19tYXNrICVkOiB2YWwgMHglMDR4XG4iLAorCQliaXRtYXNrLCBkb19tYXNrLCBjaGlwLT5zaGFkb3dfcmVnX2N0cmxfNkFIKTsKIAlzbmRfYXpmMzMyOF9jdHJsX291dHcoY2hpcCwgSURYX0lPXzZBSCwgY2hpcC0+c2hhZG93X3JlZ19jdHJsXzZBSCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogc25kX2F6ZjMzMjhfY3RybF9lbmFibGVfY29kZWNzKHN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCwgYm9vbCBlbmFibGUpCiB7Ci0Jc25kX2F6ZjMzMjhfZGJnY29kZWMoImNvZGVjX2VuYWJsZSAlZFxuIiwgZW5hYmxlKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImNvZGVjX2VuYWJsZSAlZFxuIiwgZW5hYmxlKTsKIAkvKiBubyBpZGVhIHdoYXQgZXhhY3RseSBpcyBiZWluZyBkb25lIGhlcmUsIGJ1dCBJIHN0cm9uZ2x5IGFzc3VtZSBpdCdzCiAJICogUE0gcmVsYXRlZCAqLwogCXNuZF9hemYzMzI4X2N0cmxfcmVnXzZBSF91cGRhdGUoCkBAIC0xNDI5LDcgKzEzNjIsNyBAQAogCXN0cnVjdCBzbmRfYXpmMzMyOF9jb2RlY19kYXRhICpjb2RlYyA9ICZjaGlwLT5jb2RlY3NbY29kZWNfdHlwZV07CiAJYm9vbCBuZWVkX2NoYW5nZSA9IChjb2RlYy0+cnVubmluZyAhPSBlbmFibGUpOwogCi0Jc25kX2F6ZjMzMjhfZGJnY29kZWMoCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCiAJCSJjb2RlY19hY3Rpdml0eTogJXMgY29kZWMsIGVuYWJsZSAlZCwgbmVlZF9jaGFuZ2UgJWRcbiIsCiAJCQkJY29kZWMtPm5hbWUsIGVuYWJsZSwgbmVlZF9jaGFuZ2UKIAkpOwpAQCAtMTQ3MCwxMyArMTQwMywxMyBAQAogfQogCiBzdGF0aWMgdm9pZAotc25kX2F6ZjMzMjhfY29kZWNfc2V0ZG1hYShzdHJ1Y3Qgc25kX2F6ZjMzMjhfY29kZWNfZGF0YSAqY29kZWMsCi0JCQkJdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJCXVuc2lnbmVkIGludCBwZXJpb2RfYnl0ZXMsCi0JCQkJdW5zaWduZWQgaW50IGJ1ZmZlcl9ieXRlcworc25kX2F6ZjMzMjhfY29kZWNfc2V0ZG1hYShzdHJ1Y3Qgc25kX2F6ZjMzMjggKmNoaXAsCisJCQkgIHN0cnVjdCBzbmRfYXpmMzMyOF9jb2RlY19kYXRhICpjb2RlYywKKwkJCSAgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICB1bnNpZ25lZCBpbnQgcGVyaW9kX2J5dGVzLAorCQkJICB1bnNpZ25lZCBpbnQgYnVmZmVyX2J5dGVzCiApCiB7Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CiAJV0FSTl9PTkNFKHBlcmlvZF9ieXRlcyAmIDEsICJvZGQgcGVyaW9kIGxlbmd0aCE/XG4iKTsKIAlXQVJOX09OQ0UoYnVmZmVyX2J5dGVzICE9IDIgKiBwZXJpb2RfYnl0ZXMsCiAJCSAibWlzc2VkIG91ciBpbnB1dCBleHBlY3RhdGlvbnMhICV1IHZzLiAldVxuIiwKQEAgLTE0OTksNyArMTQzMiw3IEBACiAJCXNldHVwX2lvLmRtYV9zdGFydF8xID0gYWRkcjsKIAkJc2V0dXBfaW8uZG1hX3N0YXJ0XzIgPSBhZGRyK2FyZWFfbGVuZ3RoOwogCi0JCXNuZF9hemYzMzI4X2RiZ2NvZGVjKAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKIAkJCSJzZXRkbWE6IGJ1ZmZlcnMgJTA4eFsldV0gLyAlMDh4WyV1XSwgJXUsICV1XG4iLAogCQkJCXNldHVwX2lvLmRtYV9zdGFydF8xLCBhcmVhX2xlbmd0aCwKIAkJCQlzZXR1cF9pby5kbWFfc3RhcnRfMiwgYXJlYV9sZW5ndGgsCkBAIC0xNTIyLDcgKzE0NTUsNiBAQAogCQkpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGNvZGVjLT5sb2NrLCBmbGFncyk7CiAJfQotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogfQogCiBzdGF0aWMgaW50CkBAIC0xNTM1LDggKzE0NjcsNiBAQAogCXVuc2lnbmVkIGludCBjb3VudCA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOwogI2VuZGlmCiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKLQogCWNvZGVjLT5kbWFfYmFzZSA9IHJ1bnRpbWUtPmRtYV9hZGRyOwogCiAjaWYgMApAQCAtMTU0NCwxMCArMTQ3NCw5IEBACiAJCXJ1bnRpbWUtPnJhdGUsCiAJCXNuZF9wY21fZm9ybWF0X3dpZHRoKHJ1bnRpbWUtPmZvcm1hdCksCiAJCXJ1bnRpbWUtPmNoYW5uZWxzKTsKLQlzbmRfYXpmMzMyOF9jb2RlY19zZXRkbWFhKGNvZGVjLAorCXNuZF9hemYzMzI4X2NvZGVjX3NldGRtYWEoY2hpcCwgY29kZWMsCiAJCQkJCXJ1bnRpbWUtPmRtYV9hZGRyLCBjb3VudCwgc2l6ZSk7CiAjZW5kaWYKLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU2MiwxMSArMTQ5MSw5IEBACiAJYm9vbCBwcmV2aW91c2x5X211dGVkID0gZmFsc2U7CiAJYm9vbCBpc19tYWluX21peGVyX3BsYXliYWNrX2NvZGVjID0gKEFaRl9DT0RFQ19QTEFZQkFDSyA9PSBjb2RlYy0+dHlwZSk7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxscygic25kX2F6ZjMzMjhfcGNtX3RyaWdnZXIgY21kICVkXG4iLCBjbWQpOwotCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgotCQlzbmRfYXpmMzMyOF9kYmdjb2RlYygiU1RBUlQgJXNcbiIsIGNvZGVjLT5uYW1lKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJTVEFSVCBQQ00gJXNcbiIsIGNvZGVjLT5uYW1lKTsKIAogCQlpZiAoaXNfbWFpbl9taXhlcl9wbGF5YmFja19jb2RlYykgewogCQkJLyogbXV0ZSBXYXZlT3V0IChhdm9pZCBjbGlja2luZyBkdXJpbmcgc2V0dXApICovCkBAIC0xNTkzLDcgKzE1MjAsNyBAQAogCQlzbmRfYXpmMzMyOF9jb2RlY19vdXR3KGNvZGVjLCBJRFhfSU9fQ09ERUNfSVJRVFlQRSwgMHhmZmZmKTsKIAkJc3Bpbl91bmxvY2soY29kZWMtPmxvY2spOwogCi0JCXNuZF9hemYzMzI4X2NvZGVjX3NldGRtYWEoY29kZWMsIHJ1bnRpbWUtPmRtYV9hZGRyLAorCQlzbmRfYXpmMzMyOF9jb2RlY19zZXRkbWFhKGNoaXAsIGNvZGVjLCBydW50aW1lLT5kbWFfYWRkciwKIAkJCXNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pLAogCQkJc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSkKIAkJKTsKQEAgLTE2MzMsMTAgKzE1NjAsMTAgQEAKIAkJCQkpOwogCQl9CiAKLQkJc25kX2F6ZjMzMjhfZGJnY29kZWMoIlNUQVJURUQgJXNcbiIsIGNvZGVjLT5uYW1lKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJQQ00gU1RBUlRFRCAlc1xuIiwgY29kZWMtPm5hbWUpOwogCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKLQkJc25kX2F6ZjMzMjhfZGJnY29kZWMoIlJFU1VNRSAlc1xuIiwgY29kZWMtPm5hbWUpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIlBDTSBSRVNVTUUgJXNcbiIsIGNvZGVjLT5uYW1lKTsKIAkJLyogcmVzdW1lIGNvZGVjIGlmIHdlIHdlcmUgYWN0aXZlICovCiAJCXNwaW5fbG9jayhjb2RlYy0+bG9jayk7CiAJCWlmIChjb2RlYy0+cnVubmluZykKQEAgLTE2NDgsNyArMTU3NSw3IEBACiAJCXNwaW5fdW5sb2NrKGNvZGVjLT5sb2NrKTsKIAkJYnJlYWs7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgotCQlzbmRfYXpmMzMyOF9kYmdjb2RlYygiU1RPUCAlc1xuIiwgY29kZWMtPm5hbWUpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIlBDTSBTVE9QICVzXG4iLCBjb2RlYy0+bmFtZSk7CiAKIAkJaWYgKGlzX21haW5fbWl4ZXJfcGxheWJhY2tfY29kZWMpIHsKIAkJCS8qIG11dGUgV2F2ZU91dCAoYXZvaWQgY2xpY2tpbmcgZHVyaW5nIHNldHVwKSAqLwpAQCAtMTY4NCwxMCArMTYxMSwxMCBAQAogCQkJCSk7CiAJCX0KIAotCQlzbmRfYXpmMzMyOF9kYmdjb2RlYygiU1RPUFBFRCAlc1xuIiwgY29kZWMtPm5hbWUpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIlBDTSBTVE9QUEVEICVzXG4iLCBjb2RlYy0+bmFtZSk7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKLQkJc25kX2F6ZjMzMjhfZGJnY29kZWMoIlNVU1BFTkQgJXNcbiIsIGNvZGVjLT5uYW1lKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJQQ00gU1VTUEVORCAlc1xuIiwgY29kZWMtPm5hbWUpOwogCQkvKiBtYWtlIHN1cmUgY29kZWMgaXMgc3RvcHBlZCAqLwogCQlzbmRfYXpmMzMyOF9jb2RlY19vdXR3KGNvZGVjLCBJRFhfSU9fQ09ERUNfRE1BX0ZMQUdTLAogCQkJc25kX2F6ZjMzMjhfY29kZWNfaW53KApAQCAtMTY5NiwxNyArMTYyMywxNiBAQAogCQkpOwogCQlicmVhazsKICAgICAgICAgY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJGSVhNRTogU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSCBOSVkhXG4iKTsKKwkJV0FSTigxLCAiRklYTUU6IFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0ggTklZIVxuIik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRklYTUU6IFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0UgTklZIVxuIik7CisJCVdBUk4oMSwgIkZJWE1FOiBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFIE5JWSFcbiIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJGSVhNRTogdW5rbm93biB0cmlnZ2VyIG1vZGUhXG4iKTsKKwkJV0FSTigxLCAiRklYTUU6IHVua25vd24gdHJpZ2dlciBtb2RlIVxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTcyOCw4ICsxNjU0LDggQEAKIAlyZXN1bHQgLT0gY29kZWMtPmRtYV9iYXNlOwogI2VuZGlmCiAJZnJtcmVzID0gYnl0ZXNfdG9fZnJhbWVzKCBzdWJzdHJlYW0tPnJ1bnRpbWUsIHJlc3VsdCk7Ci0Jc25kX2F6ZjMzMjhfZGJnY29kZWMoIiUwOGxpICVzIEAgMHglOGx4LCBmcmFtZXMgJThsZFxuIiwKLQkJCQlqaWZmaWVzLCBjb2RlYy0+bmFtZSwgcmVzdWx0LCBmcm1yZXMpOworCWRldl9kYmcoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwgIiUwOGxpICVzIEAgMHglOGx4LCBmcmFtZXMgJThsZFxuIiwKKwkJamlmZmllcywgY29kZWMtPm5hbWUsIHJlc3VsdCwgZnJtcmVzKTsKIAlyZXR1cm4gZnJtcmVzOwogfQogCkBAIC0xNzkyLDcgKzE3MTgsNyBAQAogCSAqIHNrZWxldG9uIGhhbmRsZXIgb25seQogCSAqICh3ZSBkbyBub3Qgd2FudCBheGlzIHJlYWRpbmcgaW4gaW50ZXJydXB0IGhhbmRsZXIgLSB0b28gbXVjaCBsb2FkISkKIAkgKi8KLQlzbmRfYXpmMzMyOF9kYmdnYW1lKCJnYW1lcG9ydCBpcnFcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiZ2FtZXBvcnQgaXJxXG4iKTsKIAogCSAvKiB0aGlzIHNob3VsZCBBQ0sgdGhlIGdhbWVwb3J0IElSUSBwcm9wZXJseSwgaG9wZWZ1bGx5LiAqLwogCXNuZF9hemYzMzI4X2dhbWVfaW53KGNoaXAsIElEWF9HQU1FX0FYSVNfVkFMVUUpOwpAQCAtMTgwNCw3ICsxNzMwLDcgQEAKIAlzdHJ1Y3Qgc25kX2F6ZjMzMjggKmNoaXAgPSBnYW1lcG9ydF9nZXRfcG9ydF9kYXRhKGdhbWVwb3J0KTsKIAlpbnQgcmVzOwogCi0Jc25kX2F6ZjMzMjhfZGJnZ2FtZSgiZ2FtZXBvcnRfb3BlbiwgbW9kZSAlZFxuIiwgbW9kZSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJnYW1lcG9ydF9vcGVuLCBtb2RlICVkXG4iLCBtb2RlKTsKIAlzd2l0Y2ggKG1vZGUpIHsKIAljYXNlIEdBTUVQT1JUX01PREVfQ09PS0VEOgogCWNhc2UgR0FNRVBPUlRfTU9ERV9SQVc6CkBAIC0xODI3LDcgKzE3NTMsNyBAQAogewogCXN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCA9IGdhbWVwb3J0X2dldF9wb3J0X2RhdGEoZ2FtZXBvcnQpOwogCi0Jc25kX2F6ZjMzMjhfZGJnZ2FtZSgiZ2FtZXBvcnRfY2xvc2VcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiZ2FtZXBvcnRfY2xvc2VcbiIpOwogCXNuZF9hemYzMzI4X2dhbWVwb3J0X3NldF9jb3VudGVyX2ZyZXF1ZW5jeShjaGlwLAogCQkJCUdBTUVfSFdDRkdfQURDX0NPVU5URVJfRlJFUV8xXzIwMCk7CiAJc25kX2F6ZjMzMjhfZ2FtZXBvcnRfYXhpc19jaXJjdWl0X2VuYWJsZShjaGlwLCAwKTsKQEAgLTE4OTIsOSArMTgxOCw4IEBACiAJCQlheGVzW2ldID0gLTE7CiAJfQogCi0Jc25kX2F6ZjMzMjhfZGJnZ2FtZSgiY29va2VkX3JlYWQ6IGF4ZXMgJWQgJWQgJWQgJWQgYnV0dG9ucyAlZFxuIiwKLQkJYXhlc1swXSwgYXhlc1sxXSwgYXhlc1syXSwgYXhlc1szXSwgKmJ1dHRvbnMKLQkpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiY29va2VkX3JlYWQ6IGF4ZXMgJWQgJWQgJWQgJWQgYnV0dG9ucyAlZFxuIiwKKwkJYXhlc1swXSwgYXhlc1sxXSwgYXhlc1syXSwgYXhlc1szXSwgKmJ1dHRvbnMpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xOTA2LDcgKzE4MzEsNyBAQAogCiAJY2hpcC0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKIAlpZiAoIWdwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYXp0MzMyODogY2Fubm90IGFsbG9jIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xOTUwLDIzICsxODc1LDIzIEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIHNuZF9hemYzMzI4X2dhbWVwb3J0X2ludGVycnVwdChzdHJ1Y3Qgc25kX2F6ZjMzMjggKmNoaXApCiB7Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiaHVoLCBnYW1lIHBvcnQgSVJRIG9jY3VycmVkIT9cbiIpOworCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImh1aCwgZ2FtZSBwb3J0IElSUSBvY2N1cnJlZCE/XG4iKTsKIH0KICNlbmRpZiAvKiBTVVBQT1JUX0dBTUVQT1JUICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotc25kX2F6ZjMzMjhfaXJxX2xvZ191bmtub3duX3R5cGUodTggd2hpY2gpCitzbmRfYXpmMzMyOF9pcnFfbG9nX3Vua25vd25fdHlwZShzdHJ1Y3Qgc25kX2F6ZjMzMjggKmNoaXAsIHU4IHdoaWNoKQogewotCXNuZF9hemYzMzI4X2RiZ2NvZGVjKAotCSJhenQzMzI4OiB1bmtub3duIElSUSB0eXBlICgleCkgb2NjdXJyZWQsIHBsZWFzZSByZXBvcnQhXG4iLAotCQl3aGljaAotCSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJ1bmtub3duIElSUSB0eXBlICgleCkgb2NjdXJyZWQsIHBsZWFzZSByZXBvcnQhXG4iLAorCQl3aGljaCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotc25kX2F6ZjMzMjhfcGNtX2ludGVycnVwdChjb25zdCBzdHJ1Y3Qgc25kX2F6ZjMzMjhfY29kZWNfZGF0YSAqZmlyc3RfY29kZWMsCitzbmRfYXpmMzMyOF9wY21faW50ZXJydXB0KHN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCwKKwkJCSAgY29uc3Qgc3RydWN0IHNuZF9hemYzMzI4X2NvZGVjX2RhdGEgKmZpcnN0X2NvZGVjLAogCQkJICB1OCBzdGF0dXMKICkKIHsKQEAgLTE5OTAsMTcgKzE5MTUsMTUgQEAKIAogCQlpZiAoY29kZWMtPnN1YnN0cmVhbSkgewogCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjb2RlYy0+c3Vic3RyZWFtKTsKLQkJCXNuZF9hemYzMzI4X2RiZ2NvZGVjKCIlcyBwZXJpb2QgZG9uZSAoIyV4KSwgQCAleFxuIiwKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiJXMgcGVyaW9kIGRvbmUgKCMleCksIEAgJXhcbiIsCiAJCQkJY29kZWMtPm5hbWUsCiAJCQkJd2hpY2gsCiAJCQkJc25kX2F6ZjMzMjhfY29kZWNfaW5sKAotCQkJCQljb2RlYywgSURYX0lPX0NPREVDX0RNQV9DVVJSUE9TCi0JCQkJKQotCQkJKTsKKwkJCQkJY29kZWMsIElEWF9JT19DT0RFQ19ETUFfQ1VSUlBPUykpOwogCQl9IGVsc2UKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImF6dDMzMjg6IGlycSBoYW5kbGVyIHByb2JsZW0hXG4iKTsKKwkJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImlycSBoYW5kbGVyIHByb2JsZW0hXG4iKTsKIAkJaWYgKHdoaWNoICYgSVJRX1NPTUVUSElORykKLQkJCXNuZF9hemYzMzI4X2lycV9sb2dfdW5rbm93bl90eXBlKHdoaWNoKTsKKwkJCXNuZF9hemYzMzI4X2lycV9sb2dfdW5rbm93bl90eXBlKGNoaXAsIHdoaWNoKTsKIAl9CiB9CiAKQEAgLTIwMDksOSArMTkzMiw3IEBACiB7CiAJc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwID0gZGV2X2lkOwogCXU4IHN0YXR1czsKLSNpZiBERUJVR19DT0RFQwogCXN0YXRpYyB1bnNpZ25lZCBsb25nIGlycV9jb3VudDsKLSNlbmRpZgogCiAJc3RhdHVzID0gc25kX2F6ZjMzMjhfY3RybF9pbmIoY2hpcCwgSURYX0lPX0lSUVNUQVRVUyk7CiAKQEAgLTIwMjIsMTQgKzE5NDMsMTMgQEAKIAkpKQogCQlyZXR1cm4gSVJRX05PTkU7IC8qIG11c3QgYmUgaW50ZXJydXB0IGZvciBhbm90aGVyIGRldmljZSAqLwogCi0Jc25kX2F6ZjMzMjhfZGJnY29kZWMoCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCiAJCSJpcnFfY291bnQgJWxkISBJRFhfSU9fSVJRU1RBVFVTICUwNHhcbiIsCiAJCQlpcnFfY291bnQrKyAvKiBkZWJ1Zy1vbmx5ICovLAotCQkJc3RhdHVzCi0JKTsKKwkJCXN0YXR1cyk7CiAKIAlpZiAoc3RhdHVzICYgSVJRX1RJTUVSKSB7Ci0JCS8qIHNuZF9hemYzMzI4X2RiZ2NvZGVjKCJ0aW1lciAlbGRcbiIsCisJCS8qIGRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAidGltZXIgJWxkXG4iLAogCQkJc25kX2F6ZjMzMjhfY29kZWNfaW5sKGNoaXAsIElEWF9JT19USU1FUl9WQUxVRSkKIAkJCQkmIFRJTUVSX1ZBTFVFX01BU0sKIAkJKTsgKi8KQEAgLTIwMzksMTEgKzE5NTksMTEgQEAKICAgICAgICAgICAgICAgICBzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAkJc25kX2F6ZjMzMjhfY3RybF9vdXRiKGNoaXAsIElEWF9JT19USU1FUl9WQUxVRSArIDMsIDB4MDcpOwogCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwotCQlzbmRfYXpmMzMyOF9kYmdjb2RlYygiYXp0MzMyODogdGltZXIgSVJRXG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJ0aW1lciBJUlFcbiIpOwogCX0KIAogCWlmIChzdGF0dXMgJiAoSVJRX1BMQVlCQUNLfElSUV9SRUNPUkRJTkd8SVJRX0kyU19PVVQpKQotCQlzbmRfYXpmMzMyOF9wY21faW50ZXJydXB0KGNoaXAtPmNvZGVjcywgc3RhdHVzKTsKKwkJc25kX2F6ZjMzMjhfcGNtX2ludGVycnVwdChjaGlwLCBjaGlwLT5jb2RlY3MsIHN0YXR1cyk7CiAKIAlpZiAoc3RhdHVzICYgSVJRX0dBTUVQT1JUKQogCQlzbmRfYXpmMzMyOF9nYW1lcG9ydF9pbnRlcnJ1cHQoY2hpcCk7CkBAIC0yMDU1LDcgKzE5NzUsNyBAQAogCiAJCS8qIGhtbSwgZG8gd2UgaGF2ZSB0byBhY2sgdGhlIElSUSBoZXJlIHNvbWVob3c/CiAJCSAqIElmIHNvLCB0aGVuIEkgZG9uJ3Qga25vdyBob3cgeWV0Li4uICovCi0JCXNuZF9hemYzMzI4X2RiZ2NvZGVjKCJhenQzMzI4OiBNUFU0MDEgSVJRXG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJNUFU0MDEgSVJRXG4iKTsKIAl9CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMjEzMyw3ICsyMDUzLDYgQEAKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCXN0cnVjdCBzbmRfYXpmMzMyOF9jb2RlY19kYXRhICpjb2RlYyA9ICZjaGlwLT5jb2RlY3NbY29kZWNfdHlwZV07CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKIAljb2RlYy0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwogCiAJLyogc2FtZSBwYXJhbWV0ZXJzIGZvciBhbGwgb3VyIGNvZGVjcyAtIGF0IGxlYXN0IHdlIHRoaW5rIHNvLi4uICovCkBAIC0yMTQyLDcgKzIwNjEsNiBAQAogCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAogCQkJCSAgICZzbmRfYXpmMzMyOF9od19jb25zdHJhaW50c19yYXRlcyk7CiAJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gY29kZWM7Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxNzEsOSArMjA4OSw3IEBACiAJc3RydWN0IHNuZF9hemYzMzI4X2NvZGVjX2RhdGEgKmNvZGVjID0KIAkJc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKIAljb2RlYy0+c3Vic3RyZWFtID0gTlVMTDsKLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjIyMCw4ICsyMTM2LDYgQEAKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwogCWludCBlcnI7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKLQogCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJBWkYzMzI4IERTUCIsIEFaRl9QQ01ERVZfU1RELAogCQkJCQkJCQkxLCAxLCAmcGNtKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTIyNTgsNyArMjE3Miw2IEBACiAJCQkJCQlzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCiAJCQkJCQkJNjQqMTAyNCwgNjQqMTAyNCk7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjI4MSw3ICsyMTk0LDYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBkZWxheTsKIAotCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOwogCWNoaXAgPSBzbmRfdGltZXJfY2hpcCh0aW1lcik7CiAJZGVsYXkgPSAoKHRpbWVyLT5zdGlja3MgKiBzZXF0aW1lcl9zY2FsaW5nKSAtIDEpICYgVElNRVJfVkFMVUVfTUFTSzsKIAlpZiAoZGVsYXkgPCA0OSkgewpAQCAtMjI4OSwxNSArMjIwMSwxNCBAQAogCQkgKiB0aGlzIHRpbWluZyB0d2VhawogCQkgKiAod2UgbmVlZCB0byBkbyBpdCB0byBhdm9pZCBhIGxvY2t1cCwgdGhvdWdoKSAqLwogCi0JCXNuZF9hemYzMzI4X2RiZ3RpbWVyKCJkZWxheSB3YXMgdG9vIGxvdyAoJWQpIVxuIiwgZGVsYXkpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImRlbGF5IHdhcyB0b28gbG93ICglZCkhXG4iLCBkZWxheSk7CiAJCWRlbGF5ID0gNDk7IC8qIG1pbmltdW0gdGltZSBpcyA0OSB0aWNrcyAqLwogCX0KLQlzbmRfYXpmMzMyOF9kYmd0aW1lcigic2V0dGluZyB0aW1lciBjb3VudGRvd24gdmFsdWUgJWRcbiIsIGRlbGF5KTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInNldHRpbmcgdGltZXIgY291bnRkb3duIHZhbHVlICVkXG4iLCBkZWxheSk7CiAJZGVsYXkgfD0gVElNRVJfQ09VTlRET1dOX0VOQUJMRSB8IFRJTUVSX0lSUV9FTkFCTEU7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CiAJc25kX2F6ZjMzMjhfY3RybF9vdXRsKGNoaXAsIElEWF9JT19USU1FUl9WQUxVRSwgZGVsYXkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzMDcsNyArMjIxOCw2IEBACiAJc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKIAljaGlwID0gc25kX3RpbWVyX2NoaXAodGltZXIpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwogCS8qIGRpc2FibGUgdGltZXIgY291bnRkb3duIGFuZCBpbnRlcnJ1cHQgKi8KQEAgLTIzMTksNyArMjIyOSw2IEBACiAJICAgdGhlIGhhcmR3YXJlL0FMU0EgaW50ZXJydXB0IGFjdGl2aXR5LiAqLwogCXNuZF9hemYzMzI4X2N0cmxfb3V0YihjaGlwLCBJRFhfSU9fVElNRVJfVkFMVUUgKyAzLCAweDA0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC0yMzI4LDEwICsyMjM3LDggQEAKIHNuZF9hemYzMzI4X3RpbWVyX3ByZWNpc2VfcmVzb2x1dGlvbihzdHJ1Y3Qgc25kX3RpbWVyICp0aW1lciwKIAkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm51bSwgdW5zaWduZWQgbG9uZyAqZGVuKQogewotCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOwogCSpudW0gPSAxOwogCSpkZW4gPSAxMDI0MDAwIC8gc2VxdGltZXJfc2NhbGluZzsKLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjM1MSw3ICsyMjU4LDYgQEAKIAlzdHJ1Y3Qgc25kX3RpbWVyX2lkIHRpZDsKIAlpbnQgZXJyOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CiAJdGlkLmRldl9jbGFzcyA9IFNORFJWX1RJTUVSX0NMQVNTX0NBUkQ7CiAJdGlkLmRldl9zY2xhc3MgPSBTTkRSVl9USU1FUl9TQ0xBU1NfTk9ORTsKIAl0aWQuY2FyZCA9IGNoaXAtPmNhcmQtPm51bWJlcjsKQEAgLTIzNzYsNyArMjI4Miw2IEBACiAJZXJyID0gMDsKIAogb3V0OgotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTI0MzgsMzQgKzIzNDMsMzQgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogc25kX2F6ZjMzMjhfZGVidWdfc2hvd19wb3J0cyhjb25zdCBzdHJ1Y3Qgc25kX2F6ZjMzMjggKmNoaXApCiB7Ci0jaWYgREVCVUdfTUlTQwogCXUxNiB0bXA7CiAKLQlzbmRfYXpmMzMyOF9kYmdtaXNjKAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAogCQkiY3RybF9pbyAweCVseCwgZ2FtZV9pbyAweCVseCwgbXB1X2lvIDB4JWx4LCAiCiAJCSJvcGwzX2lvIDB4JWx4LCBtaXhlcl9pbyAweCVseCwgaXJxICVkXG4iLAogCQljaGlwLT5jdHJsX2lvLCBjaGlwLT5nYW1lX2lvLCBjaGlwLT5tcHVfaW8sCi0JCWNoaXAtPm9wbDNfaW8sIGNoaXAtPm1peGVyX2lvLCBjaGlwLT5pcnEKLQkpOworCQljaGlwLT5vcGwzX2lvLCBjaGlwLT5taXhlcl9pbywgY2hpcC0+aXJxKTsKIAotCXNuZF9hemYzMzI4X2RiZ21pc2MoImdhbWUgJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJnYW1lICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAogCQlzbmRfYXpmMzMyOF9nYW1lX2luYihjaGlwLCAwKSwKIAkJc25kX2F6ZjMzMjhfZ2FtZV9pbmIoY2hpcCwgMSksCiAJCXNuZF9hemYzMzI4X2dhbWVfaW5iKGNoaXAsIDIpLAogCQlzbmRfYXpmMzMyOF9nYW1lX2luYihjaGlwLCAzKSwKIAkJc25kX2F6ZjMzMjhfZ2FtZV9pbmIoY2hpcCwgNCksCi0JCXNuZF9hemYzMzI4X2dhbWVfaW5iKGNoaXAsIDUpCi0JKTsKKwkJc25kX2F6ZjMzMjhfZ2FtZV9pbmIoY2hpcCwgNSkpOwogCiAJZm9yICh0bXAgPSAwOyB0bXAgPCAweDA3OyB0bXAgKz0gMSkKLQkJc25kX2F6ZjMzMjhfZGJnbWlzYygibXB1X2lvIDB4JTA0eFxuIiwgaW5iKGNoaXAtPm1wdV9pbyArIHRtcCkpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJtcHVfaW8gMHglMDR4XG4iLCBpbmIoY2hpcC0+bXB1X2lvICsgdG1wKSk7CiAKIAlmb3IgKHRtcCA9IDA7IHRtcCA8PSAweDA3OyB0bXAgKz0gMSkKLQkJc25kX2F6ZjMzMjhfZGJnbWlzYygiMHglMDJ4OiBnYW1lMjAwIDB4JTA0eCwgZ2FtZTIwOCAweCUwNHhcbiIsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIjB4JTAyeDogZ2FtZTIwMCAweCUwNHgsIGdhbWUyMDggMHglMDR4XG4iLAogCQkJdG1wLCBpbmIoMHgyMDAgKyB0bXApLCBpbmIoMHgyMDggKyB0bXApKTsKIAogCWZvciAodG1wID0gMDsgdG1wIDw9IDB4MDE7IHRtcCArPSAxKQotCQlzbmRfYXpmMzMyOF9kYmdtaXNjKAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKIAkJCSIweCUwMng6IG1wdTMwMCAweCUwNHgsIG1wdTMxMCAweCUwNHgsIG1wdTMyMCAweCUwNHgsICIKIAkJCSJtcHUzMzAgMHglMDR4IG9wbDM4OCAweCUwNHggb3BsMzhjIDB4JTA0eFxuIiwKIAkJCQl0bXAsCkBAIC0yNDc0LDE5ICsyMzc5LDE3IEBACiAJCQkJaW5iKDB4MzIwICsgdG1wKSwKIAkJCQlpbmIoMHgzMzAgKyB0bXApLAogCQkJCWluYigweDM4OCArIHRtcCksCi0JCQkJaW5iKDB4MzhjICsgdG1wKQotCQkpOworCQkJCWluYigweDM4YyArIHRtcCkpOwogCiAJZm9yICh0bXAgPSAwOyB0bXAgPCBBWkZfSU9fU0laRV9DVFJMOyB0bXAgKz0gMikKLQkJc25kX2F6ZjMzMjhfZGJnbWlzYygiY3RybCAweCUwMng6IDB4JTA0eFxuIiwKLQkJCXRtcCwgc25kX2F6ZjMzMjhfY3RybF9pbncoY2hpcCwgdG1wKQotCQkpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjdHJsIDB4JTAyeDogMHglMDR4XG4iLAorCQkJdG1wLCBzbmRfYXpmMzMyOF9jdHJsX2ludyhjaGlwLCB0bXApKTsKIAogCWZvciAodG1wID0gMDsgdG1wIDwgQVpGX0lPX1NJWkVfTUlYRVI7IHRtcCArPSAyKQotCQlzbmRfYXpmMzMyOF9kYmdtaXNjKCJtaXhlciAweCUwMng6IDB4JTA0eFxuIiwKLQkJCXRtcCwgc25kX2F6ZjMzMjhfbWl4ZXJfaW53KGNoaXAsIHRtcCkKLQkJKTsKLSNlbmRpZiAvKiBERUJVR19NSVNDICovCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIm1peGVyIDB4JTAyeDogMHglMDR4XG4iLAorCQkJdG1wLCBzbmRfYXpmMzMyOF9taXhlcl9pbncoY2hpcCwgdG1wKSk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTI1MjMsOCArMjQyNiw4IEBACiAJLyogY2hlY2sgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDI0IGJpdHMgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygyNCkpIDwgMCB8fAogCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjQpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgIgotCQkJCQkiMjRiaXQgUENJIGJ1c21hc3RlciBETUFcbiIKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjRiaXQgUENJIGJ1c21hc3RlciBETUFcbiIKIAkJKTsKIAkJZXJyID0gLUVOWElPOwogCQlnb3RvIG91dF9lcnI7CkBAIC0yNTYwLDcgKzI0NjMsNyBAQAogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfYXpmMzMyOF9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQllcnIgPSAtRUJVU1k7CiAJCWdvdG8gb3V0X2VycjsKIAl9CkBAIC0yNTk5LDggKzI1MDIsNiBAQAogCQlzcGluX3VubG9ja19pcnEoY29kZWMtPmxvY2spOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyY2hpcCA9IGNoaXA7CiAKIAllcnIgPSAwOwpAQCAtMjYyNCw3ICsyNTI1LDYgQEAKIAlzdHJ1Y3Qgc25kX29wbDMgKm9wbDM7CiAJaW50IGVycjsKIAotCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOwogCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpIHsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CkBAIC0yNjM1LDcgKzI1MzUsOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXQ7CiAKQEAgLTI2NTcsNyArMjU1OCw3IEBACiAJCS0xLCAmY2hpcC0+cm1pZGkKIAkpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImF6ZjMzMjg6IG5vIE1QVS00MDEgZGV2aWNlIGF0IDB4JWx4P1xuIiwKKwkJZGV2X2VycihjYXJkLT5kZXYsICJubyBNUFUtNDAxIGRldmljZSBhdCAweCVseD9cbiIsCiAJCQkJY2hpcC0+bXB1X2lvCiAJCSk7CiAJCWdvdG8gb3V0X2VycjsKQEAgLTI2NzMsNyArMjU3NCw3IEBACiAKIAlpZiAoc25kX29wbDNfY3JlYXRlKGNhcmQsIGNoaXAtPm9wbDNfaW8sIGNoaXAtPm9wbDNfaW8rMiwKIAkJCSAgICBPUEwzX0hXX0FVVE8sIDEsICZvcGwzKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXpmMzMyODogbm8gT1BMMyBkZXZpY2UgYXQgMHglbHgtMHglbHg/XG4iLAorCQlkZXZfZXJyKGNhcmQtPmRldiwgIm5vIE9QTDMgZGV2aWNlIGF0IDB4JWx4LTB4JWx4P1xuIiwKIAkJCSAgIGNoaXAtPm9wbDNfaW8sIGNoaXAtPm9wbDNfaW8rMgogCQkpOwogCX0gZWxzZSB7CkBAIC0yNjk1LDEyICsyNTk2LDE1IEBACiAJCWdvdG8gb3V0X2VycjsKIAogI2lmZGVmIE1PRFVMRQotCXByaW50ayhLRVJOX0lORk8KLSJhenQzMzI4OiBTb3VuZCBkcml2ZXIgZm9yIEF6dGVjaCBBWkYzMzI4LWJhc2VkIHNvdW5kY2FyZHMgc3VjaCBhcyBQQ0kxNjguXG4iCi0iYXp0MzMyODogSGFyZHdhcmUgd2FzIGNvbXBsZXRlbHkgdW5kb2N1bWVudGVkLCB1bmZvcnR1bmF0ZWx5LlxuIgotImF6dDMzMjg6IEZlZWwgZnJlZSB0byBjb250YWN0IGFuZGkgQVQgbGlzYXMuZGUgZm9yIGJ1ZyByZXBvcnRzIGV0Yy4hXG4iCi0iYXp0MzMyODogVXNlci1zY2FsYWJsZSBzZXF1ZW5jZXIgdGltZXIgc2V0IHRvICVkSHogKDEwMjQwMDBIeiAvICVkKS5cbiIsCi0JMTAyNDAwMCAvIHNlcXRpbWVyX3NjYWxpbmcsIHNlcXRpbWVyX3NjYWxpbmcpOworCWRldl9pbmZvKGNhcmQtPmRldiwKKwkJICJTb3VuZCBkcml2ZXIgZm9yIEF6dGVjaCBBWkYzMzI4LWJhc2VkIHNvdW5kY2FyZHMgc3VjaCBhcyBQQ0kxNjguXG4iKTsKKwlkZXZfaW5mbyhjYXJkLT5kZXYsCisJCSAiSGFyZHdhcmUgd2FzIGNvbXBsZXRlbHkgdW5kb2N1bWVudGVkLCB1bmZvcnR1bmF0ZWx5LlxuIik7CisJZGV2X2luZm8oY2FyZC0+ZGV2LAorCQkgIkZlZWwgZnJlZSB0byBjb250YWN0IGFuZGkgQVQgbGlzYXMuZGUgZm9yIGJ1ZyByZXBvcnRzIGV0Yy4hXG4iKTsKKwlkZXZfaW5mbyhjYXJkLT5kZXYsCisJCSAiVXNlci1zY2FsYWJsZSBzZXF1ZW5jZXIgdGltZXIgc2V0IHRvICVkSHogKDEwMjQwMDBIeiAvICVkKS5cbiIsCisJCSAxMDI0MDAwIC8gc2VxdGltZXJfc2NhbGluZywgc2VxdGltZXJfc2NhbGluZyk7CiAjZW5kaWYKIAogCXNuZF9hemYzMzI4X2dhbWVwb3J0KGNoaXAsIGRldik7CkBAIC0yNzEyLDMxICsyNjE2LDI5IEBACiAJZ290byBvdXQ7CiAKIG91dF9lcnI6Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiYXpmMzMyODogc29tZXRoaW5nIGZhaWxlZCwgZXhpdGluZ1xuIik7CisJZGV2X2VycihjYXJkLT5kZXYsICJzb21ldGhpbmcgZmFpbGVkLCBleGl0aW5nXG4iKTsKIAlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCiBvdXQ6Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQKIHNuZF9hemYzMzI4X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQogewotCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOwogCXNuZF9jYXJkX2ZyZWUocGNpX2dldF9kcnZkYXRhKHBjaSkpOwotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW5saW5lIHZvaWQKLXNuZF9hemYzMzI4X3N1c3BlbmRfcmVncyh1bnNpZ25lZCBsb25nIGlvX2FkZHIsIHVuc2lnbmVkIGNvdW50LCB1MzIgKnNhdmVkX3JlZ3MpCitzbmRfYXpmMzMyOF9zdXNwZW5kX3JlZ3MoY29uc3Qgc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwLAorCQkJIHVuc2lnbmVkIGxvbmcgaW9fYWRkciwgdW5zaWduZWQgY291bnQsIHUzMiAqc2F2ZWRfcmVncykKIHsKIAl1bnNpZ25lZCByZWc7CiAKIAlmb3IgKHJlZyA9IDA7IHJlZyA8IGNvdW50OyArK3JlZykgewogCQkqc2F2ZWRfcmVncyA9IGlubChpb19hZGRyKTsKLQkJc25kX2F6ZjMzMjhfZGJncG0oInN1c3BlbmQ6IGlvIDB4JTA0bHg6IDB4JTA4eFxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzdXNwZW5kOiBpbyAweCUwNGx4OiAweCUwOHhcbiIsCiAJCQlpb19hZGRyLCAqc2F2ZWRfcmVncyk7CiAJCSsrc2F2ZWRfcmVnczsKIAkJaW9fYWRkciArPSBzaXplb2YoKnNhdmVkX3JlZ3MpOwpAQCAtMjc0NCw3ICsyNjQ2LDggQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1zbmRfYXpmMzMyOF9yZXN1bWVfcmVncyhjb25zdCB1MzIgKnNhdmVkX3JlZ3MsCitzbmRfYXpmMzMyOF9yZXN1bWVfcmVncyhjb25zdCBzdHJ1Y3Qgc25kX2F6ZjMzMjggKmNoaXAsCisJCQljb25zdCB1MzIgKnNhdmVkX3JlZ3MsCiAJCQl1bnNpZ25lZCBsb25nIGlvX2FkZHIsCiAJCQl1bnNpZ25lZCBjb3VudAogKQpAQCAtMjc1Myw3ICsyNjU2LDggQEAKIAogCWZvciAocmVnID0gMDsgcmVnIDwgY291bnQ7ICsrcmVnKSB7CiAJCW91dGwoKnNhdmVkX3JlZ3MsIGlvX2FkZHIpOwotCQlzbmRfYXpmMzMyOF9kYmdwbSgicmVzdW1lOiBpbyAweCUwNGx4OiAweCUwOHggLS0+IDB4JTA4eFxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkicmVzdW1lOiBpbyAweCUwNGx4OiAweCUwOHggLS0+IDB4JTA4eFxuIiwKIAkJCWlvX2FkZHIsICpzYXZlZF9yZWdzLCBpbmwoaW9fYWRkcikpOwogCQkrK3NhdmVkX3JlZ3M7CiAJCWlvX2FkZHIgKz0gc2l6ZW9mKCpzYXZlZF9yZWdzKTsKQEAgLTI3NjYsNyArMjY3MCw3IEBACiAjaWZkZWYgQVpGX1VTRV9BQzk3X0xBWUVSCiAJc25kX2FjOTdfc3VzcGVuZChjaGlwLT5hYzk3KTsKICNlbHNlCi0Jc25kX2F6ZjMzMjhfc3VzcGVuZF9yZWdzKGNoaXAtPm1peGVyX2lvLAorCXNuZF9hemYzMzI4X3N1c3BlbmRfcmVncyhjaGlwLCBjaGlwLT5taXhlcl9pbywKIAkJQVJSQVlfU0laRShjaGlwLT5zYXZlZF9yZWdzX21peGVyKSwgY2hpcC0+c2F2ZWRfcmVnc19taXhlcik7CiAKIAkvKiBtYWtlIHN1cmUgdG8gZGlzYWJsZSBtYXN0ZXIgdm9sdW1lIGV0Yy4gdG8gcHJldmVudCBsb29waW5nIHNvdW5kICovCkBAIC0yNzgxLDcgKzI2ODUsNyBAQAogI2lmZGVmIEFaRl9VU0VfQUM5N19MQVlFUgogCXNuZF9hYzk3X3Jlc3VtZShjaGlwLT5hYzk3KTsKICNlbHNlCi0Jc25kX2F6ZjMzMjhfcmVzdW1lX3JlZ3MoY2hpcC0+c2F2ZWRfcmVnc19taXhlciwgY2hpcC0+bWl4ZXJfaW8sCisJc25kX2F6ZjMzMjhfcmVzdW1lX3JlZ3MoY2hpcCwgY2hpcC0+c2F2ZWRfcmVnc19taXhlciwgY2hpcC0+bWl4ZXJfaW8sCiAJCQkJCUFSUkFZX1NJWkUoY2hpcC0+c2F2ZWRfcmVnc19taXhlcikpOwogCiAJLyogdW5mb3J0dW5hdGVseSB3aXRoIDMyYml0IHRyYW5zZmVycywgSURYX01JWEVSX1BMQVlfTUFTVEVSICgweDAyKQpAQCAtMjgwOCwxOCArMjcxMiwxOCBAQAogCiAJc25kX2F6ZjMzMjhfc3VzcGVuZF9hYzk3KGNoaXApOwogCi0Jc25kX2F6ZjMzMjhfc3VzcGVuZF9yZWdzKGNoaXAtPmN0cmxfaW8sCisJc25kX2F6ZjMzMjhfc3VzcGVuZF9yZWdzKGNoaXAsIGNoaXAtPmN0cmxfaW8sCiAJCUFSUkFZX1NJWkUoY2hpcC0+c2F2ZWRfcmVnc19jdHJsKSwgY2hpcC0+c2F2ZWRfcmVnc19jdHJsKTsKIAogCS8qIG1hbnVhbGx5IHN0b3JlIHRoZSBvbmUgY3VycmVudGx5IHJlbGV2YW50IHdyaXRlLW9ubHkgcmVnLCB0b28gKi8KIAlzYXZlZF9yZWdzX2N0cmxfdTE2ID0gKHUxNiAqKWNoaXAtPnNhdmVkX3JlZ3NfY3RybDsKIAlzYXZlZF9yZWdzX2N0cmxfdTE2W0lEWF9JT182QUggLyAyXSA9IGNoaXAtPnNoYWRvd19yZWdfY3RybF82QUg7CiAKLQlzbmRfYXpmMzMyOF9zdXNwZW5kX3JlZ3MoY2hpcC0+Z2FtZV9pbywKKwlzbmRfYXpmMzMyOF9zdXNwZW5kX3JlZ3MoY2hpcCwgY2hpcC0+Z2FtZV9pbywKIAkJQVJSQVlfU0laRShjaGlwLT5zYXZlZF9yZWdzX2dhbWUpLCBjaGlwLT5zYXZlZF9yZWdzX2dhbWUpOwotCXNuZF9hemYzMzI4X3N1c3BlbmRfcmVncyhjaGlwLT5tcHVfaW8sCisJc25kX2F6ZjMzMjhfc3VzcGVuZF9yZWdzKGNoaXAsIGNoaXAtPm1wdV9pbywKIAkJQVJSQVlfU0laRShjaGlwLT5zYXZlZF9yZWdzX21wdSksIGNoaXAtPnNhdmVkX3JlZ3NfbXB1KTsKLQlzbmRfYXpmMzMyOF9zdXNwZW5kX3JlZ3MoY2hpcC0+b3BsM19pbywKKwlzbmRfYXpmMzMyOF9zdXNwZW5kX3JlZ3MoY2hpcCwgY2hpcC0+b3BsM19pbywKIAkJQVJSQVlfU0laRShjaGlwLT5zYXZlZF9yZWdzX29wbDMpLCBjaGlwLT5zYXZlZF9yZWdzX29wbDMpOwogCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CkBAIC0yODM4LDIzICsyNzQyLDIyIEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhenQzMzI4OiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAotCXNuZF9hemYzMzI4X3Jlc3VtZV9yZWdzKGNoaXAtPnNhdmVkX3JlZ3NfZ2FtZSwgY2hpcC0+Z2FtZV9pbywKKwlzbmRfYXpmMzMyOF9yZXN1bWVfcmVncyhjaGlwLCBjaGlwLT5zYXZlZF9yZWdzX2dhbWUsIGNoaXAtPmdhbWVfaW8sCiAJCQkJCUFSUkFZX1NJWkUoY2hpcC0+c2F2ZWRfcmVnc19nYW1lKSk7Ci0Jc25kX2F6ZjMzMjhfcmVzdW1lX3JlZ3MoY2hpcC0+c2F2ZWRfcmVnc19tcHUsIGNoaXAtPm1wdV9pbywKKwlzbmRfYXpmMzMyOF9yZXN1bWVfcmVncyhjaGlwLCBjaGlwLT5zYXZlZF9yZWdzX21wdSwgY2hpcC0+bXB1X2lvLAogCQkJCQlBUlJBWV9TSVpFKGNoaXAtPnNhdmVkX3JlZ3NfbXB1KSk7Ci0Jc25kX2F6ZjMzMjhfcmVzdW1lX3JlZ3MoY2hpcC0+c2F2ZWRfcmVnc19vcGwzLCBjaGlwLT5vcGwzX2lvLAorCXNuZF9hemYzMzI4X3Jlc3VtZV9yZWdzKGNoaXAsIGNoaXAtPnNhdmVkX3JlZ3Nfb3BsMywgY2hpcC0+b3BsM19pbywKIAkJCQkJQVJSQVlfU0laRShjaGlwLT5zYXZlZF9yZWdzX29wbDMpKTsKIAogCXNuZF9hemYzMzI4X3Jlc3VtZV9hYzk3KGNoaXApOwogCi0Jc25kX2F6ZjMzMjhfcmVzdW1lX3JlZ3MoY2hpcC0+c2F2ZWRfcmVnc19jdHJsLCBjaGlwLT5jdHJsX2lvLAorCXNuZF9hemYzMzI4X3Jlc3VtZV9yZWdzKGNoaXAsIGNoaXAtPnNhdmVkX3JlZ3NfY3RybCwgY2hpcC0+Y3RybF9pbywKIAkJCQkJQVJSQVlfU0laRShjaGlwLT5zYXZlZF9yZWdzX2N0cmwpKTsKIAogCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9idDg3eC5jIGIvc291bmQvcGNpL2J0ODd4LmMKaW5kZXggMTg4MDIwMy4uODU0NjcxMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2J0ODd4LmMKKysrIGIvc291bmQvcGNpL2J0ODd4LmMKQEAgLTI5MywxNyArMjkzLDIzIEBACiAJCVBDSV9TVEFUVVNfU0lHX1NZU1RFTV9FUlJPUiB8IFBDSV9TVEFUVVNfREVURUNURURfUEFSSVRZOwogCXBjaV93cml0ZV9jb25maWdfd29yZChjaGlwLT5wY2ksIFBDSV9TVEFUVVMsIHBjaV9zdGF0dXMpOwogCWlmIChwY2lfc3RhdHVzICE9IFBDSV9TVEFUVVNfREVURUNURURfUEFSSVRZKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBaWVlZSAtIFBDSSBlcnJvciEgc3RhdHVzICUjMDh4LCBQQ0kgc3RhdHVzICUjMDR4XG4iLAorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJBaWVlZSAtIFBDSSBlcnJvciEgc3RhdHVzICUjMDh4LCBQQ0kgc3RhdHVzICUjMDR4XG4iLAogCQkJICAgc3RhdHVzICYgRVJST1JfSU5URVJSVVBUUywgcGNpX3N0YXR1cyk7CiAJZWxzZSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkFpZWVlIC0gUENJIHBhcml0eSBlcnJvciBkZXRlY3RlZCFcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJBaWVlZSAtIFBDSSBwYXJpdHkgZXJyb3IgZGV0ZWN0ZWQhXG4iKTsKIAkJLyogZXJyb3IgJ2hhbmRsaW5nJyBzaW1pbGFyIHRvIGFpYzd4eHhfcGNpLmM6ICovCiAJCWNoaXAtPnBjaV9wYXJpdHlfZXJyb3JzKys7CiAJCWlmIChjaGlwLT5wY2lfcGFyaXR5X2Vycm9ycyA+IDIwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJUb28gbWFueSBQQ0kgcGFyaXR5IGVycm9ycyBvYnNlcnZlZC5cbiIpOwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiU29tZSBkZXZpY2Ugb24gdGhpcyBidXMgaXMgZ2VuZXJhdGluZyBiYWQgcGFyaXR5LlxuIik7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJUaGlzIGlzIGFuIGVycm9yICpvYnNlcnZlZCBieSosIG5vdCAqZ2VuZXJhdGVkIGJ5KiwgdGhpcyBjYXJkLlxuIik7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJQQ0kgcGFyaXR5IGVycm9yIGNoZWNraW5nIGhhcyBiZWVuIGRpc2FibGVkLlxuIik7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiVG9vIG1hbnkgUENJIHBhcml0eSBlcnJvcnMgb2JzZXJ2ZWQuXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJTb21lIGRldmljZSBvbiB0aGlzIGJ1cyBpcyBnZW5lcmF0aW5nIGJhZCBwYXJpdHkuXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJUaGlzIGlzIGFuIGVycm9yICpvYnNlcnZlZCBieSosIG5vdCAqZ2VuZXJhdGVkIGJ5KiwgdGhpcyBjYXJkLlxuIik7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiUENJIHBhcml0eSBlcnJvciBjaGVja2luZyBoYXMgYmVlbiBkaXNhYmxlZC5cbiIpOwogCQkJY2hpcC0+aW50ZXJydXB0X21hc2sgJj0gfihJTlRfUFBFUlIgfCBJTlRfUklQRVJSKTsKIAkJCXNuZF9idDg3eF93cml0ZWwoY2hpcCwgUkVHX0lOVF9NQVNLLCBjaGlwLT5pbnRlcnJ1cHRfbWFzayk7CiAJCX0KQEAgLTMyMyw5ICszMjksMTEgQEAKIAogCWlmIChpcnFfc3RhdHVzICYgRVJST1JfSU5URVJSVVBUUykgewogCQlpZiAoaXJxX3N0YXR1cyAmIChJTlRfRkJVUyB8IElOVF9GVFJHVCkpCi0JCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiRklGTyBvdmVycnVuLCBzdGF0dXMgJSMwOHhcbiIsIHN0YXR1cyk7CisJCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsCisJCQkJICJGSUZPIG92ZXJydW4sIHN0YXR1cyAlIzA4eFxuIiwgc3RhdHVzKTsKIAkJaWYgKGlycV9zdGF0dXMgJiBJTlRfT0NFUlIpCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnRlcm5hbCBSSVNDIGVycm9yLCBzdGF0dXMgJSMwOHhcbiIsIHN0YXR1cyk7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiaW50ZXJuYWwgUklTQyBlcnJvciwgc3RhdHVzICUjMDh4XG4iLCBzdGF0dXMpOwogCQlpZiAoaXJxX3N0YXR1cyAmIChJTlRfUFBFUlIgfCBJTlRfUklQRVJSIHwgSU5UX1BBQk9SVCkpCiAJCQlzbmRfYnQ4N3hfcGNpX2Vycm9yKGNoaXAsIGlycV9zdGF0dXMpOwogCX0KQEAgLTc0Nyw3ICs3NTUsNyBAQAogCX0KIAljaGlwLT5tbWlvID0gcGNpX2lvcmVtYXBfYmFyKHBjaSwgMCk7CiAJaWYgKCFjaGlwLT5tbWlvKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCByZW1hcCBpbyBtZW1vcnlcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCByZW1hcCBpbyBtZW1vcnlcbiIpOwogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtNzYyLDcgKzc3MCw3IEBACiAJZXJyID0gcmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9idDg3eF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJICBLQlVJTERfTU9ETkFNRSwgY2hpcCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGdyYWIgaXJxICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGdyYWIgaXJxICVkXG4iLCBwY2ktPmlycSk7CiAJCWdvdG8gZmFpbDsKIAl9CiAJY2hpcC0+aXJxID0gcGNpLT5pcnE7CkBAIC03NzMsNyArNzgxLDYgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBmYWlsOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwogCSpyY2hpcCA9IGNoaXA7CiAJcmV0dXJuIDA7CiAKQEAgLTg1MSwxNCArODU4LDE1IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmxhY2tsaXN0KTsgKytpKQogCQlpZiAoYmxhY2tsaXN0W2ldLnN1YnZlbmRvciA9PSBwY2ktPnN1YnN5c3RlbV92ZW5kb3IgJiYKIAkJICAgIGJsYWNrbGlzdFtpXS5zdWJkZXZpY2UgPT0gcGNpLT5zdWJzeXN0ZW1fZGV2aWNlKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImNhcmQgJSMwNHgtJSMwNHg6JSMwNHggaGFzIG5vIGF1ZGlvXG4iLAorCQkJZGV2X2RiZygmcGNpLT5kZXYsCisJCQkJImNhcmQgJSMwNHgtJSMwNHg6JSMwNHggaGFzIG5vIGF1ZGlvXG4iLAogCQkJCSAgICBwY2ktPmRldmljZSwgcGNpLT5zdWJzeXN0ZW1fdmVuZG9yLCBwY2ktPnN1YnN5c3RlbV9kZXZpY2UpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCi0Jc25kX3ByaW50ayhLRVJOX0lORk8gInVua25vd24gY2FyZCAlIzA0eC0lIzA0eDolIzA0eFxuIiwKKwlkZXZfaW5mbygmcGNpLT5kZXYsICJ1bmtub3duIGNhcmQgJSMwNHgtJSMwNHg6JSMwNHhcbiIsCiAJCSAgIHBjaS0+ZGV2aWNlLCBwY2ktPnN1YnN5c3RlbV92ZW5kb3IsIHBjaS0+c3Vic3lzdGVtX2RldmljZSk7Ci0Jc25kX3ByaW50ayhLRVJOX0RFQlVHICJwbGVhc2UgbWFpbCBpZCwgYm9hcmQgbmFtZSwgYW5kLCAiCisJZGV2X2luZm8oJnBjaS0+ZGV2LCAicGxlYXNlIG1haWwgaWQsIGJvYXJkIG5hbWUsIGFuZCwgIgogCQkgICAiaWYgaXQgd29ya3MsIHRoZSBjb3JyZWN0IGRpZ2l0YWxfcmF0ZSBvcHRpb24gdG8gIgogCQkgICAiPGFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZz5cbiIpOwogCXJldHVybiBTTkRfQlQ4N1hfQk9BUkRfVU5LTk9XTjsKQEAgLTg4OCw3ICs4OTYsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtOTI1LDcgKzkzNCw3IEBACiAJCWlmIChlcnIgPCAwKQogCQkJZ290byBfZXJyb3I7CiAJfQotCXNuZF9wcmludGsoS0VSTl9JTkZPICJidDg3eCVkOiBVc2luZyBib2FyZCAlZCwgJXNhbmFsb2csICVzZGlnaXRhbCAiCisJZGV2X2luZm8oY2FyZC0+ZGV2LCAiYnQ4N3glZDogVXNpbmcgYm9hcmQgJWQsICVzYW5hbG9nLCAlc2RpZ2l0YWwgIgogCQkgICAiKHJhdGUgJWQgSHopXG4iLCBkZXYsIGJvYXJkaWQsCiAJCSAgIGNoaXAtPmJvYXJkLm5vX2FuYWxvZyA/ICJubyAiIDogIiIsCiAJCSAgIGNoaXAtPmJvYXJkLm5vX2RpZ2l0YWwgPyAibm8gIiA6ICIiLCBjaGlwLT5ib2FyZC5kaWdfcmF0ZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMKaW5kZXggZjRkYjU1OC4uZjk0Y2M2ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYwpAQCAtNDE3LDEzICs0MTcsMTMgQEAKIAlpbnQgc3RhdHVzOwogCWludCByZXRyeTsKIAlpZiAoKHJlZyA+IDB4N2YpIHx8ICh2YWx1ZSA+IDB4MWZmKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpMmNfd3JpdGU6IGludmFsaWQgdmFsdWVzLlxuIik7CisJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsICJpMmNfd3JpdGU6IGludmFsaWQgdmFsdWVzLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXRtcCA9IHJlZyA8PCAyNSB8IHZhbHVlIDw8IDE2OwogCS8qCi0Jc25kX3ByaW50ayhLRVJOX0RFQlVHICJJMkMtd3JpdGU6cmVnPTB4JXgsIHZhbHVlPTB4JXhcbiIsIHJlZywgdmFsdWUpOworCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJJMkMtd3JpdGU6cmVnPTB4JXgsIHZhbHVlPTB4JXhcbiIsIHJlZywgdmFsdWUpOwogCSovCiAJLyogTm90IHN1cmUgd2hhdCB0aGlzIEkyQyBjaGFubmVsIGNvbnRyb2xzLiAqLwogCS8qIHNuZF9jYTAxMDZfcHRyX3dyaXRlKGVtdSwgSTJDX0QwLCAwLCB0bXApOyAqLwpAQCAtNDQyLDcgKzQ0Miw3IEBACiAJCS8qIFdhaXQgdGlsbCB0aGUgdHJhbnNhY3Rpb24gZW5kcyAqLwogCQl3aGlsZSAoMSkgewogCQkJc3RhdHVzID0gc25kX2NhMDEwNl9wdHJfcmVhZChlbXUsIEkyQ19BLCAwKTsKLQkJCS8qc25kX3ByaW50ayhLRVJOX0RFQlVHICJJMkM6c3RhdHVzPTB4JXhcbiIsIHN0YXR1cyk7Ki8KKwkJCS8qZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgIkkyQzpzdGF0dXM9MHgleFxuIiwgc3RhdHVzKTsqLwogCQkJdGltZW91dCsrOwogCQkJaWYgKChzdGF0dXMgJiBJMkNfQV9BRENfU1RBUlQpID09IDApCiAJCQkJYnJlYWs7CkBAIC00NTYsNyArNDU2LDcgQEAKIAl9CiAKIAlpZiAocmV0cnkgPT0gMTApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiV3JpdGluZyB0byBBREMgZmFpbGVkIVxuIik7CisJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsICJXcml0aW5nIHRvIEFEQyBmYWlsZWQhXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogICAgIApAQCAtNTE2LDcgKzUxNiw4IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHNuZF9jYTAxMDZfY2hhbm5lbF9kYWMoc3RydWN0IHNuZF9jYTAxMDZfZGV0YWlscyAqZGV0YWlscywKK3N0YXRpYyBpbnQgc25kX2NhMDEwNl9jaGFubmVsX2RhYyhzdHJ1Y3Qgc25kX2NhMDEwNiAqY2hpcCwKKwkJCQkgIHN0cnVjdCBzbmRfY2EwMTA2X2RldGFpbHMgKmRldGFpbHMsCiAJCQkJICBpbnQgY2hhbm5lbF9pZCkKIHsKIAlzd2l0Y2ggKGNoYW5uZWxfaWQpIHsKQEAgLTUyOSw3ICs1MzAsNyBAQAogCWNhc2UgUENNX1VOS05PV05fQ0hBTk5FTDoKIAkJcmV0dXJuIChkZXRhaWxzLT5zcGlfZGFjICYgMHgwMDBmKSA+PiAoNCAqIDApOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiY2EwMTA2OiB1bmtub3duIGNoYW5uZWxfaWQgJWRcbiIsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiY2EwMTA2OiB1bmtub3duIGNoYW5uZWxfaWQgJWRcbiIsCiAJCQkgICBjaGFubmVsX2lkKTsKIAl9CiAJcmV0dXJuIDA7CkBAIC01MzksNyArNTQwLDcgQEAKIAkJCQkgICAgaW50IHBvd2VyKQogewogCWlmIChjaGlwLT5kZXRhaWxzLT5zcGlfZGFjKSB7Ci0JCWNvbnN0IGludCBkYWMgPSBzbmRfY2EwMTA2X2NoYW5uZWxfZGFjKGNoaXAtPmRldGFpbHMsCisJCWNvbnN0IGludCBkYWMgPSBzbmRfY2EwMTA2X2NoYW5uZWxfZGFjKGNoaXAsIGNoaXAtPmRldGFpbHMsCiAJCQkJCQkgICAgICAgY2hhbm5lbF9pZCk7CiAJCWNvbnN0IGludCByZWcgPSBzcGlfZGFjZF9yZWdbZGFjXTsKIAkJY29uc3QgaW50IGJpdCA9IHNwaV9kYWNkX2JpdFtkYWNdOwpAQCAtNTgzLDcgKzU4NCw3IEBACiAKIAljaGFubmVsLT51c2UgPSAxOwogCS8qCi0JcHJpbnRrKEtFUk5fREVCVUcgIm9wZW46Y2hhbm5lbF9pZD0lZCwgY2hpcD0lcCwgY2hhbm5lbD0lcFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIm9wZW46Y2hhbm5lbF9pZD0lZCwgY2hpcD0lcCwgY2hhbm5lbD0lcFxuIiwKIAkgICAgICAgY2hhbm5lbF9pZCwgY2hpcCwgY2hhbm5lbCk7CiAJKi8KICAgICAgICAgLy9jaGFubmVsLT5pbnRlcnJ1cHQgPSBzbmRfY2EwMTA2X3BjbV9jaGFubmVsX2ludGVycnVwdDsKQEAgLTY2MCw3ICs2NjEsOCBAQAogCiAJZXBjbSA9IGt6YWxsb2Moc2l6ZW9mKCplcGNtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGVwY20gPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJvcGVuX2NhcHR1cmVfY2hhbm5lbDogZmFpbGVkIGVwY20gYWxsb2NcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJvcGVuX2NhcHR1cmVfY2hhbm5lbDogZmFpbGVkIGVwY20gYWxsb2NcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKICAgICAgICAgfQogCWVwY20tPmVtdSA9IGNoaXA7CkBAIC02NzcsNyArNjc5LDcgQEAKIAogCWNoYW5uZWwtPnVzZSA9IDE7CiAJLyoKLSAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIm9wZW46Y2hhbm5lbF9pZD0lZCwgY2hpcD0lcCwgY2hhbm5lbD0lcFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIm9wZW46Y2hhbm5lbF9pZD0lZCwgY2hpcD0lcCwgY2hhbm5lbD0lcFxuIiwKIAkgICAgICAgY2hhbm5lbF9pZCwgY2hpcCwgY2hhbm5lbCk7CiAJKi8KICAgICAgICAgLy9jaGFubmVsLT5pbnRlcnJ1cHQgPSBzbmRfY2EwMTA2X3BjbV9jaGFubmVsX2ludGVycnVwdDsKQEAgLTc3MSw3ICs3NzMsNyBAQAogCWludCBpOwogCQogI2lmIDAgLyogZGVidWcgKi8KLQlzbmRfcHJpbnRrKEtFUk5fREVCVUcKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LAogCQkgICAicHJlcGFyZTpjaGFubmVsX251bWJlcj0lZCwgcmF0ZT0lZCwgZm9ybWF0PTB4JXgsICIKIAkJICAgImNoYW5uZWxzPSVkLCBidWZmZXJfc2l6ZT0lbGQsIHBlcmlvZF9zaXplPSVsZCwgIgogCQkgICAicGVyaW9kcz0ldSwgZnJhbWVzX3RvX2J5dGVzPSVkXG4iLApAQCAtNzc5LDkgKzc4MSwxMSBAQAogCQkgICBydW50aW1lLT5jaGFubmVscywgcnVudGltZS0+YnVmZmVyX3NpemUsCiAJCSAgIHJ1bnRpbWUtPnBlcmlvZF9zaXplLCBydW50aW1lLT5wZXJpb2RzLAogCQkgICBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgMSkpOwotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiZG1hX2FkZHI9JXgsIGRtYV9hcmVhPSVwLCB0YWJsZV9iYXNlPSVwXG4iLAorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCisJCSJkbWFfYWRkcj0leCwgZG1hX2FyZWE9JXAsIHRhYmxlX2Jhc2U9JXBcbiIsCiAJCSAgIHJ1bnRpbWUtPmRtYV9hZGRyLCBydW50aW1lLT5kbWFfYXJlYSwgdGFibGVfYmFzZSk7Ci0Jc25kX3ByaW50ayhLRVJOX0RFQlVHICJkbWFfYWRkcj0leCwgZG1hX2FyZWE9JXAsIGRtYV9ieXRlcyhzaXplKT0leFxuIiwKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LAorCQkiZG1hX2FkZHI9JXgsIGRtYV9hcmVhPSVwLCBkbWFfYnl0ZXMoc2l6ZSk9JXhcbiIsCiAJCSAgIGVtdS0+YnVmZmVyLmFkZHIsIGVtdS0+YnVmZmVyLmFyZWEsIGVtdS0+YnVmZmVyLmJ5dGVzKTsKICNlbmRpZiAvKiBkZWJ1ZyAqLwogCS8qIFJhdGUgY2FuIGJlIHNldCBwZXIgY2hhbm5lbC4gKi8KQEAgLTg3Niw3ICs4ODAsNyBAQAogCXUzMiByZWc3MTsKIAkKICNpZiAwIC8qIGRlYnVnICovCi0Jc25kX3ByaW50ayhLRVJOX0RFQlVHCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKIAkJICAgInByZXBhcmU6Y2hhbm5lbF9udW1iZXI9JWQsIHJhdGU9JWQsIGZvcm1hdD0weCV4LCAiCiAJCSAgICJjaGFubmVscz0lZCwgYnVmZmVyX3NpemU9JWxkLCBwZXJpb2Rfc2l6ZT0lbGQsICIKIAkJICAgInBlcmlvZHM9JXUsIGZyYW1lc190b19ieXRlcz0lZFxuIiwKQEAgLTg4NCw5ICs4ODgsMTEgQEAKIAkJICAgcnVudGltZS0+Y2hhbm5lbHMsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplLAogCQkgICBydW50aW1lLT5wZXJpb2Rfc2l6ZSwgcnVudGltZS0+cGVyaW9kcywKIAkJICAgZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIDEpKTsKLSAgICAgICAgc25kX3ByaW50ayhLRVJOX0RFQlVHICJkbWFfYWRkcj0leCwgZG1hX2FyZWE9JXAsIHRhYmxlX2Jhc2U9JXBcbiIsCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKKwkJImRtYV9hZGRyPSV4LCBkbWFfYXJlYT0lcCwgdGFibGVfYmFzZT0lcFxuIiwKIAkJICAgcnVudGltZS0+ZG1hX2FkZHIsIHJ1bnRpbWUtPmRtYV9hcmVhLCB0YWJsZV9iYXNlKTsKLQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImRtYV9hZGRyPSV4LCBkbWFfYXJlYT0lcCwgZG1hX2J5dGVzKHNpemUpPSV4XG4iLAorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCisJCSJkbWFfYWRkcj0leCwgZG1hX2FyZWE9JXAsIGRtYV9ieXRlcyhzaXplKT0leFxuIiwKIAkJICAgZW11LT5idWZmZXIuYWRkciwgZW11LT5idWZmZXIuYXJlYSwgZW11LT5idWZmZXIuYnl0ZXMpOwogI2VuZGlmIC8qIGRlYnVnICovCiAJLyogcmVnNzEgY29udHJvbHMgQURDIHJhdGUuICovCkBAIC05MzQsNyArOTQwLDcgQEAKIAogCiAJLyoKLQlwcmludGsoS0VSTl9ERUJVRworCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCiAJICAgICAgICJwcmVwYXJlOmNoYW5uZWxfbnVtYmVyPSVkLCByYXRlPSVkLCBmb3JtYXQ9MHgleCwgY2hhbm5lbHM9JWQsICIKIAkgICAgICAgImJ1ZmZlcl9zaXplPSVsZCwgcGVyaW9kX3NpemU9JWxkLCBmcmFtZXNfdG9fYnl0ZXM9JWRcbiIsCiAJICAgICAgIGNoYW5uZWwsIHJ1bnRpbWUtPnJhdGUsIHJ1bnRpbWUtPmZvcm1hdCwgcnVudGltZS0+Y2hhbm5lbHMsCkBAIC05ODIsMTMgKzk4OCwxMyBAQAogCQlydW50aW1lID0gcy0+cnVudGltZTsKIAkJZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAkJY2hhbm5lbCA9IGVwY20tPmNoYW5uZWxfaWQ7Ci0JCS8qIHNuZF9wcmludGsoS0VSTl9ERUJVRyAiY2hhbm5lbD0lZFxuIiwgY2hhbm5lbCk7ICovCisJCS8qIGRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJjaGFubmVsPSVkXG4iLCBjaGFubmVsKTsgKi8KIAkJZXBjbS0+cnVubmluZyA9IHJ1bm5pbmc7CiAJCWJhc2ljIHw9ICgweDEgPDwgY2hhbm5lbCk7CiAJCWV4dGVuZGVkIHw9ICgweDEwIDw8IGNoYW5uZWwpOwogICAgICAgICAgICAgICAgIHNuZF9wY21fdHJpZ2dlcl9kb25lKHMsIHN1YnN0cmVhbSk7CiAgICAgICAgIH0KLQkvKiBzbmRfcHJpbnRrKEtFUk5fREVCVUcgImJhc2ljPTB4JXgsIGV4dGVuZGVkPTB4JXhcbiIsYmFzaWMsIGV4dGVuZGVkKTsgKi8KKwkvKiBkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiYmFzaWM9MHgleCwgZXh0ZW5kZWQ9MHgleFxuIixiYXNpYywgZXh0ZW5kZWQpOyAqLwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgpAQCAtMTA3MCw3ICsxMDc2LDcgQEAKIAkJCXJldHVybiBwdHI7CiAJCXByZXZfcHRyID0gcHRyOwogCX0gd2hpbGUgKC0tdGltZW91dCk7Ci0Jc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImNhMDEwNjogdW5zdGFibGUgRE1BIHBvaW50ZXIhXG4iKTsKKwlkZXZfd2FybihlbXUtPmNhcmQtPmRldiwgImNhMDEwNjogdW5zdGFibGUgRE1BIHBvaW50ZXIhXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA5Myw3ICsxMDk5LDcgQEAKICAgICAgICAgaWYgKHB0ciA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKIAkJcHRyIC09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwogCS8qCi0JcHJpbnRrKEtFUk5fREVCVUcgInB0cjEgPSAweCVseCwgcHRyMj0weCVseCwgcHRyPTB4JWx4LCAiCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgInB0cjEgPSAweCVseCwgcHRyMj0weCVseCwgcHRyPTB4JWx4LCAiCiAJICAgICAgICJidWZmZXJfc2l6ZSA9IDB4JXgsIHBlcmlvZF9zaXplID0gMHgleCwgYml0cz0lZCwgcmF0ZT0lZFxuIiwKIAkgICAgICAgcHRyMSwgcHRyMiwgcHRyLCAoaW50KXJ1bnRpbWUtPmJ1ZmZlcl9zaXplLAogCSAgICAgICAoaW50KXJ1bnRpbWUtPnBlcmlvZF9zaXplLCAoaW50KXJ1bnRpbWUtPmZyYW1lX2JpdHMsCkBAIC0xMjg0LDkgKzEyOTAsOSBAQAogCiAgICAgICAgIHN0YXQ3NiA9IHNuZF9jYTAxMDZfcHRyX3JlYWQoY2hpcCwgRVhURU5ERURfSU5ULCAwKTsKIAkvKgotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiaW50ZXJydXB0IHN0YXR1cyA9IDB4JTA4eCwgc3RhdDc2PTB4JTA4eFxuIiwKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiaW50ZXJydXB0IHN0YXR1cyA9IDB4JTA4eCwgc3RhdDc2PTB4JTA4eFxuIiwKIAkJICAgc3RhdHVzLCBzdGF0NzYpOwotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAicHRyPTB4JTA4eFxuIiwKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAicHRyPTB4JTA4eFxuIiwKIAkJICAgc25kX2NhMDEwNl9wdHJfcmVhZChjaGlwLCBQTEFZQkFDS19QT0lOVEVSLCAwKSk7CiAJKi8KICAgICAgICAgbWFzayA9IDB4MTE7IC8qIDB4MSBmb3Igb25lIGhhbGYsIDB4MTAgZm9yIHRoZSBvdGhlciBoYWxmIHBlcmlvZC4gKi8KQEAgLTEyOTYsMTEgKzEzMDIsMTMgQEAKIC8qIEZJWE1FOiBTZWxlY3QgdGhlIGNvcnJlY3Qgc3Vic3RyZWFtIGZvciBwZXJpb2QgZWxhcHNlZCAqLwogCQkJaWYocGNoYW5uZWwtPnVzZSkgewogCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocGNoYW5uZWwtPmVwY20tPnN1YnN0cmVhbSk7Ci0JCQkJLy9wcmludGsoS0VSTl9JTkZPICJpbnRlcnJ1cHQgWyVkXSB1c2VkXG4iLCBpKTsKKwkJCQkvKiBkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiaW50ZXJydXB0IFslZF0gdXNlZFxuIiwgaSk7ICovCiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAJCX0KLQkgICAgICAgIC8vcHJpbnRrKEtFUk5fSU5GTyAiY2hhbm5lbD0lcFxuIixwY2hhbm5lbCk7Ci0JICAgICAgICAvL3ByaW50ayhLRVJOX0lORk8gImludGVycnVwdCBzdGF0NzZbJWRdID0gJTA4eCwgdXNlPSVkLCBjaGFubmVsPSVkXG4iLCBpLCBzdGF0NzYsIHBjaGFubmVsLT51c2UsIHBjaGFubmVsLT5udW1iZXIpOworCQkvKgorCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiY2hhbm5lbD0lcFxuIiwgcGNoYW5uZWwpOworCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiaW50ZXJydXB0IHN0YXQ3NlslZF0gPSAlMDh4LCB1c2U9JWQsIGNoYW5uZWw9JWRcbiIsIGksIHN0YXQ3NiwgcGNoYW5uZWwtPnVzZSwgcGNoYW5uZWwtPm51bWJlcik7CisJCSovCiAJCW1hc2sgPDw9IDE7CiAJfQogICAgICAgICBtYXNrID0gMHgxMTAwMDA7IC8qIDB4MSBmb3Igb25lIGhhbGYsIDB4MTAgZm9yIHRoZSBvdGhlciBoYWxmIHBlcmlvZC4gKi8KQEAgLTEzMTAsMTEgKzEzMTgsMTMgQEAKIC8qIEZJWE1FOiBTZWxlY3QgdGhlIGNvcnJlY3Qgc3Vic3RyZWFtIGZvciBwZXJpb2QgZWxhcHNlZCAqLwogCQkJaWYocGNoYW5uZWwtPnVzZSkgewogCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocGNoYW5uZWwtPmVwY20tPnN1YnN0cmVhbSk7Ci0JCQkJLy9wcmludGsoS0VSTl9JTkZPICJpbnRlcnJ1cHQgWyVkXSB1c2VkXG4iLCBpKTsKKwkJCQkvKiBkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiaW50ZXJydXB0IFslZF0gdXNlZFxuIiwgaSk7ICovCiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAJCX0KLQkgICAgICAgIC8vcHJpbnRrKEtFUk5fSU5GTyAiY2hhbm5lbD0lcFxuIixwY2hhbm5lbCk7Ci0JICAgICAgICAvL3ByaW50ayhLRVJOX0lORk8gImludGVycnVwdCBzdGF0NzZbJWRdID0gJTA4eCwgdXNlPSVkLCBjaGFubmVsPSVkXG4iLCBpLCBzdGF0NzYsIHBjaGFubmVsLT51c2UsIHBjaGFubmVsLT5udW1iZXIpOworCQkvKgorCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiY2hhbm5lbD0lcFxuIiwgcGNoYW5uZWwpOworCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiaW50ZXJydXB0IHN0YXQ3NlslZF0gPSAlMDh4LCB1c2U9JWQsIGNoYW5uZWw9JWRcbiIsIGksIHN0YXQ3NiwgcGNoYW5uZWwtPnVzZSwgcGNoYW5uZWwtPm51bWJlcik7CisJCSovCiAJCW1hc2sgPDw9IDE7CiAJfQogCkBAIC0xNjAzLDcgKzE2MTMsNyBAQAogCQlpbnQgc2l6ZSwgbjsKIAogCQlzaXplID0gQVJSQVlfU0laRShpMmNfYWRjX2luaXQpOwotCQkvKiBzbmRfcHJpbnRrKEtFUk5fREVCVUcgIkkyQzphcnJheSBzaXplPTB4JXhcbiIsIHNpemUpOyAqLworCQkvKiBkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiSTJDOmFycmF5IHNpemU9MHgleFxuIiwgc2l6ZSk7ICovCiAJCWZvciAobiA9IDA7IG4gPCBzaXplOyBuKyspCiAJCQlzbmRfY2EwMTA2X2kyY193cml0ZShjaGlwLCBpMmNfYWRjX2luaXRbbl1bMF0sCiAJCQkJCSAgICAgaTJjX2FkY19pbml0W25dWzFdKTsKQEAgLTE2NjgsNyArMTY3OCw3IEBACiAJCXJldHVybiBlcnI7CiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMzIpKSA8IDAgfHwKIAkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDMyKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZXJyb3IgdG8gc2V0IDMyYml0IG1hc2sgRE1BXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJlcnJvciB0byBzZXQgMzJiaXQgbWFzayBETUFcbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC0xNjg5LDE0ICsxNjk5LDE0IEBACiAJY2hpcC0+cmVzX3BvcnQgPSByZXF1ZXN0X3JlZ2lvbihjaGlwLT5wb3J0LCAweDIwLCAic25kX2NhMDEwNiIpOwogCWlmICghY2hpcC0+cmVzX3BvcnQpIHsKIAkJc25kX2NhMDEwNl9mcmVlKGNoaXApOwotCQlwcmludGsoS0VSTl9FUlIgImNhbm5vdCBhbGxvY2F0ZSB0aGUgcG9ydFxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIHRoZSBwb3J0XG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9jYTAxMDZfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewogCQlzbmRfY2EwMTA2X2ZyZWUoY2hpcCk7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2Fubm90IGdyYWIgaXJxXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjYW5ub3QgZ3JhYiBpcnFcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAljaGlwLT5pcnEgPSBwY2ktPmlycTsKQEAgLTE3MTIsNyArMTcyMiw3IEBACiAJLyogcmVhZCBzZXJpYWwgKi8KIAlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJmNoaXAtPnNlcmlhbCk7CiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCBQQ0lfU1VCU1lTVEVNX0lELCAmY2hpcC0+bW9kZWwpOwotCXByaW50ayhLRVJOX0lORk8gInNuZC1jYTAxMDY6IE1vZGVsICUwNHggUmV2ICUwOHggU2VyaWFsICUwOHhcbiIsCisJZGV2X2luZm8oY2FyZC0+ZGV2LCAiTW9kZWwgJTA0eCBSZXYgJTA4eCBTZXJpYWwgJTA4eFxuIiwKIAkgICAgICAgY2hpcC0+bW9kZWwsIHBjaS0+cmV2aXNpb24sIGNoaXAtPnNlcmlhbCk7CiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgIkNBMDEwNiIpOwogCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJDQTAxMDYiKTsKQEAgLTE3MjYsNyArMTczNiw3IEBACiAJfQogCWNoaXAtPmRldGFpbHMgPSBjOwogCWlmIChzdWJzeXN0ZW1bZGV2XSkgewotCQlwcmludGsoS0VSTl9JTkZPICJzbmQtY2EwMTA2OiBTb3VuZCBjYXJkIG5hbWU9JXMsICIKKwkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiU291bmQgY2FyZCBuYW1lPSVzLCAiCiAJCSAgICAgICAic3Vic3lzdGVtPTB4JXguIEZvcmNlZCB0byBzdWJzeXN0ZW09MHgleFxuIiwKIAkJICAgICAgIGMtPm5hbWUsIGNoaXAtPnNlcmlhbCwgc3Vic3lzdGVtW2Rldl0pOwogCX0KQEAgLTE4NDMsNyArMTg1Myw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xODY4LDE4ICsxODc5LDE2IEBACiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3I7CiAKLQlzbmRfcHJpbnRkZCgiY2EwMTA2OiBwcm9iZSBmb3IgTUlESSBjaGFubmVsIEEgLi4uIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJwcm9iZSBmb3IgTUlESSBjaGFubmVsIEEgLi4uIik7CiAJZXJyID0gc25kX2NhMDEwNl9taWRpKGNoaXAsIENBMDEwNl9NSURJX0NIQU5fQSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3I7Ci0Jc25kX3ByaW50ZGQoIiBkb25lLlxuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICIgZG9uZS5cbiIpOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAlzbmRfY2EwMTA2X3Byb2NfaW5pdChjaGlwKTsKICNlbmRpZgogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3I7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY2EwMTA2L2NhX21pZGkuYyBiL3NvdW5kL3BjaS9jYTAxMDYvY2FfbWlkaS5jCmluZGV4IDhiYmRmMjYuLmI5MWM3ZjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jYTAxMDYvY2FfbWlkaS5jCisrKyBiL3NvdW5kL3BjaS9jYTAxMDYvY2FfbWlkaS5jCkBAIC00Niw3ICs0Niw3IEBACiAJCWNhX21pZGlfcmVhZF9kYXRhKG1pZGkpOwogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKIAlpZiAodGltZW91dCA8PSAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYV9taWRpX2NsZWFyX3J4OiB0aW1lb3V0IChzdGF0dXMgPSAweCV4KVxuIiwKKwkJcHJfZXJyKCJjYV9taWRpX2NsZWFyX3J4OiB0aW1lb3V0IChzdGF0dXMgPSAweCV4KVxuIiwKIAkJCSAgIGNhX21pZGlfcmVhZF9zdGF0KG1pZGkpKTsKICNlbmRpZgogfQpAQCAtMTEzLDcgKzExMyw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGktPmlucHV0X2xvY2ssIGZsYWdzKTsKIAlpZiAoIW9rKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYV9taWRpX2NtZDogMHgleCBmYWlsZWQgYXQgMHgleCAoc3RhdHVzID0gMHgleCwgZGF0YSA9IDB4JXgpISEhXG4iLAorCQlwcl9lcnIoImNhX21pZGlfY21kOiAweCV4IGZhaWxlZCBhdCAweCV4IChzdGF0dXMgPSAweCV4LCBkYXRhID0gMHgleCkhISFcbiIsCiAJCQkgICBjbWQsCiAJCQkgICBtaWRpLT5nZXRfZGV2X2lkX3BvcnQobWlkaS0+ZGV2X2lkKSwKIAkJCSAgIGNhX21pZGlfcmVhZF9zdGF0KG1pZGkpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NtaXBjaS5jIGIvc291bmQvcGNpL2NtaXBjaS5jCmluZGV4IDI3NTVlYzUuLjEyYzMxOGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jbWlwY2kuYworKysgYi9zb3VuZC9wY2kvY21pcGNpLmMKQEAgLTc5Niw3ICs3OTYsNyBAQAogCWlmIChydW50aW1lLT5jaGFubmVscyA+IDEpCiAJCXJlYy0+Zm10IHw9IDB4MDE7CiAJaWYgKHJlYy0+aXNfZGFjICYmIHNldF9kYWNfY2hhbm5lbHMoY20sIHJlYywgcnVudGltZS0+Y2hhbm5lbHMpIDwgMCkgewotCQlzbmRfcHJpbnRkKCJjYW5ub3Qgc2V0IGRhYyBjaGFubmVsc1xuIik7CisJCWRldl9kYmcoY20tPmNhcmQtPmRldiwgImNhbm5vdCBzZXQgZGFjIGNoYW5uZWxzXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC04MjcsNyArODI3LDcgQEAKIAllbHNlCiAJCWNtLT5jdHJsIHw9IHZhbDsKIAlzbmRfY21pcGNpX3dyaXRlKGNtLCBDTV9SRUdfRlVOQ1RSTDAsIGNtLT5jdHJsKTsKLQkvL3NuZF9wcmludGQoImNtaXBjaTogZnVuY3RybDAgPSAlMDh4XG4iLCBjbS0+Y3RybCk7CisJLyogZGV2X2RiZyhjbS0+Y2FyZC0+ZGV2LCAiZnVuY3RybDAgPSAlMDh4XG4iLCBjbS0+Y3RybCk7ICovCiAKIAkvKiBzZXQgc2FtcGxlIHJhdGUgKi8KIAlmcmVxID0gMDsKQEAgLTg1MCw3ICs4NTAsNyBAQAogCQl2YWwgfD0gKGZyZXEgPDwgQ01fQVNGQ19TSElGVCkgJiBDTV9BU0ZDX01BU0s7CiAJfQogCXNuZF9jbWlwY2lfd3JpdGUoY20sIENNX1JFR19GVU5DVFJMMSwgdmFsKTsKLQkvL3NuZF9wcmludGQoImNtaXBjaTogZnVuY3RybDEgPSAlMDh4XG4iLCB2YWwpOworCWRldl9kYmcoY20tPmNhcmQtPmRldiwgImZ1bmN0cmwxID0gJTA4eFxuIiwgdmFsKTsKIAogCS8qIHNldCBmb3JtYXQgKi8KIAl2YWwgPSBzbmRfY21pcGNpX3JlYWQoY20sIENNX1JFR19DSEZPUk1BVCk7CkBAIC04NjYsNyArODY2LDcgQEAKIAkJdmFsIHw9IGZyZXFfZXh0IDw8IChyZWMtPmNoICogMik7CiAJfQogCXNuZF9jbWlwY2lfd3JpdGUoY20sIENNX1JFR19DSEZPUk1BVCwgdmFsKTsKLQkvL3NuZF9wcmludGQoImNtaXBjaTogY2hmb3JtYXQgPSAlMDh4XG4iLCB2YWwpOworCWRldl9kYmcoY20tPmNhcmQtPmRldiwgImNoZm9ybWF0ID0gJTA4eFxuIiwgdmFsKTsKIAogCWlmICghcmVjLT5pc19kYWMgJiYgY20tPmNoaXBfdmVyc2lvbikgewogCQlpZiAocnVudGltZS0+cmF0ZSA+IDQ0MTAwKQpAQCAtOTA0LDcgKzkwNCw3IEBACiAJCWNtLT5jdHJsIHw9IGNoZW47CiAJCS8qIGVuYWJsZSBjaGFubmVsICovCiAJCXNuZF9jbWlwY2lfd3JpdGUoY20sIENNX1JFR19GVU5DVFJMMCwgY20tPmN0cmwpOwotCQkvL3NuZF9wcmludGQoImNtaXBjaTogZnVuY3RybDAgPSAlMDh4XG4iLCBjbS0+Y3RybCk7CisJCWRldl9kYmcoY20tPmNhcmQtPmRldiwgImZ1bmN0cmwwID0gJTA4eFxuIiwgY20tPmN0cmwpOwogCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CiAJCXJlYy0+cnVubmluZyA9IDA7CkBAIC05NTIsNyArOTUyLDcgQEAKIAkJaWYgKHJlbSA8IHJlYy0+ZG1hX3NpemUpCiAJCQlnb3RvIG9rOwogCX0gCi0JcHJpbnRrKEtFUk5fRVJSICJjbWlwY2k6IGludmFsaWQgUENNIHBvaW50ZXI6ICUjeFxuIiwgcmVtKTsKKwlkZXZfZXJyKGNtLT5jYXJkLT5kZXYsICJpbnZhbGlkIFBDTSBwb2ludGVyOiAlI3hcbiIsIHJlbSk7CiAJcmV0dXJuIFNORFJWX1BDTV9QT1NfWFJVTjsKIG9rOgogCXB0ciA9IChyZWMtPmRtYV9zaXplIC0gKHJlbSArIDEpKSA+PiByZWMtPnNoaWZ0OwpAQCAtMjg4OSwxMyArMjg4OSwxMyBAQAogCX0KIAogCWlmICghcikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJjbWlwY2k6IGNhbm5vdCByZXNlcnZlIGpveXN0aWNrIHBvcnRzXG4iKTsKKwkJZGV2X3dhcm4oY20tPmNhcmQtPmRldiwgImNhbm5vdCByZXNlcnZlIGpveXN0aWNrIHBvcnRzXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAljbS0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKIAlpZiAoIWdwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY21pcGNpOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCWRldl9lcnIoY20tPmNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKIAkJcmVsZWFzZV9hbmRfZnJlZV9yZXNvdXJjZShyKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjk5NSwxMyArMjk5NSwxNCBAQAogCiAJCWlmIChzbmRfb3BsM19jcmVhdGUoY20tPmNhcmQsIGlvc3ludGgsIGlvc3ludGggKyAyLAogCQkJCSAgICBPUEwzX0hXX09QTDMsIDAsICZvcGwzKSA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiY21pcGNpOiBubyBPUEwgZGV2aWNlIGF0ICUjbHgsICIKLQkJCSAgICAgICAic2tpcHBpbmcuLi5cbiIsIGlvc3ludGgpOworCQkJZGV2X2VycihjbS0+Y2FyZC0+ZGV2LAorCQkJCSJubyBPUEwgZGV2aWNlIGF0ICUjbHgsIHNraXBwaW5nLi4uXG4iLAorCQkJCWlvc3ludGgpOwogCQkJZ290byBkaXNhYmxlX2ZtOwogCQl9CiAJfQogCWlmICgoZXJyID0gc25kX29wbDNfaHdkZXBfbmV3KG9wbDMsIDAsIDEsIE5VTEwpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjbWlwY2k6IGNhbm5vdCBjcmVhdGUgT1BMMyBod2RlcFxuIik7CisJCWRldl9lcnIoY20tPmNhcmQtPmRldiwgImNhbm5vdCBjcmVhdGUgT1BMMyBod2RlcFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCXJldHVybiAwOwpAQCAtMzA2MCw3ICszMDYxLDcgQEAKIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2NtaXBjaV9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNtKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2NtaXBjaV9mcmVlKGNtKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0zMTkyLDggKzMxOTMsOSBAQAogCQkJLyogZW5hYmxlIFVBUlQgKi8KIAkJCXNuZF9jbWlwY2lfc2V0X2JpdChjbSwgQ01fUkVHX0ZVTkNUUkwxLCBDTV9VQVJUX0VOKTsKIAkJCWlmIChpbmIoaW9taWRpICsgMSkgPT0gMHhmZikgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBlbmFibGUgTVBVLTQwMSBwb3J0IgotCQkJCQkgICAiIGF0ICUjbHhcbiIsIGlvbWlkaSk7CisJCQkJZGV2X2VycihjbS0+Y2FyZC0+ZGV2LAorCQkJCQkiY2Fubm90IGVuYWJsZSBNUFUtNDAxIHBvcnQgYXQgJSNseFxuIiwKKwkJCQkJaW9taWRpKTsKIAkJCQlzbmRfY21pcGNpX2NsZWFyX2JpdChjbSwgQ01fUkVHX0ZVTkNUUkwxLAogCQkJCQkJICAgICBDTV9VQVJUX0VOKTsKIAkJCQlpb21pZGkgPSAwOwpAQCAtMzIzNyw3ICszMjM5LDggQEAKIAkJCQkJCU1QVTQwMV9JTkZPX0lOVEVHUkFURUQgOiAwKSB8CiAJCQkJCSAgICAgICBNUFU0MDFfSU5GT19JUlFfSE9PSywKIAkJCQkJICAgICAgIC0xLCAmY20tPnJtaWRpKSkgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImNtaXBjaTogbm8gVUFSVDQwMSBkZXZpY2UgYXQgMHglbHhcbiIsIGlvbWlkaSk7CisJCQlkZXZfZXJyKGNtLT5jYXJkLT5kZXYsCisJCQkJIm5vIFVBUlQ0MDEgZGV2aWNlIGF0IDB4JWx4XG4iLCBpb21pZGkpOwogCQl9CiAJfQogCkBAIC0zMjU0LDggKzMyNTcsNiBAQAogCWlmIChzbmRfY21pcGNpX2NyZWF0ZV9nYW1lcG9ydChjbSwgZGV2KSA8IDApCiAJCXNuZF9jbWlwY2lfY2xlYXJfYml0KGNtLCBDTV9SRUdfRlVOQ1RSTDEsIENNX0pZU1RLX0VOKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyY21pcGNpID0gY207CiAJcmV0dXJuIDA7CiB9CkBAIC0zMjgwLDcgKzMyODEsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAkKQEAgLTMzODEsOCArMzM4Myw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjbWlwY2k6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQyODEuYyBiL3NvdW5kL3BjaS9jczQyODEuYwppbmRleCAxZGM3OTNlLi40M2QxZjkxIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0MjgxLmMKKysrIGIvc291bmQvcGNpL2NzNDI4MS5jCkBAIC01NjQsNyArNTY0LDggQEAKIAkJCXJldHVybjsKIAkJfQogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyB3cml0ZSBwcm9ibGVtLCByZWcgPSAweCV4LCB2YWwgPSAweCV4XG4iLCByZWcsIHZhbCk7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCSJBQyc5NyB3cml0ZSBwcm9ibGVtLCByZWcgPSAweCV4LCB2YWwgPSAweCV4XG4iLCByZWcsIHZhbCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbmRfY3M0MjgxX2FjOTdfcmVhZChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsCkBAIC02MjQsNyArNjI1LDggQEAKIAkJCWdvdG8gX19vazE7CiAJfQogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgcmVhZCBwcm9ibGVtIChBQ0NUTF9EQ1YpLCByZWcgPSAweCV4XG4iLCByZWcpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiQUMnOTcgcmVhZCBwcm9ibGVtIChBQ0NUTF9EQ1YpLCByZWcgPSAweCV4XG4iLCByZWcpOwogCXJlc3VsdCA9IDB4ZmZmZjsKIAlnb3RvIF9fZW5kOwogCQpAQCAtNjQzLDcgKzY0NSw4IEBACiAJCXVkZWxheSgxMCk7CiAJfQogCQotCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHJlYWQgcHJvYmxlbSAoQUNTVFNfVlNUUyksIHJlZyA9IDB4JXhcbiIsIHJlZyk7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCSJBQyc5NyByZWFkIHByb2JsZW0gKEFDU1RTX1ZTVFMpLCByZWcgPSAweCV4XG4iLCByZWcpOwogCXJlc3VsdCA9IDB4ZmZmZjsKIAlnb3RvIF9fZW5kOwogCkBAIC04MzUsOCArODM4LDkgQEAKIAlzdHJ1Y3QgY3M0MjgxICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCiAJLyoKLQlwcmludGsoS0VSTl9ERUJVRyAiRENDID0gMHgleCwgYnVmZmVyX3NpemUgPSAweCV4LCBqaWZmaWVzID0gJWxpXG4iLAotCSAgICAgICBzbmRfY3M0MjgxX3BlZWtCQTAoY2hpcCwgZG1hLT5yZWdEQ0MpLCBydW50aW1lLT5idWZmZXJfc2l6ZSwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJIkRDQyA9IDB4JXgsIGJ1ZmZlcl9zaXplID0gMHgleCwgamlmZmllcyA9ICVsaVxuIiwKKwkJc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIGRtYS0+cmVnRENDKSwgcnVudGltZS0+YnVmZmVyX3NpemUsCiAJICAgICAgIGppZmZpZXMpOwogCSovCiAJcmV0dXJuIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplIC0KQEAgLTEyNjUsNyArMTI2OSw4IEBACiAKIAljaGlwLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOwogCWlmICghZ3ApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjczQyODE6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTEzNjEsNyArMTM2Niw3IEBACiAJY2hpcC0+aXJxID0gLTE7CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAlpZiAoZHVhbF9jb2RlYyA8IDAgfHwgZHVhbF9jb2RlYyA+IDMpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBkdWFsX2NvZGVjIG9wdGlvbiAlZFxuIiwgZHVhbF9jb2RlYyk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiaW52YWxpZCBkdWFsX2NvZGVjIG9wdGlvbiAlZFxuIiwgZHVhbF9jb2RlYyk7CiAJCWR1YWxfY29kZWMgPSAwOwogCX0KIAljaGlwLT5kdWFsX2NvZGVjID0gZHVhbF9jb2RlYzsKQEAgLTEzODMsNyArMTM4OCw3IEBACiAJCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfY3M0MjgxX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9jczQyODFfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTQwMiw4ICsxNDA3LDYgQEAKIAogCXNuZF9jczQyODFfcHJvY19pbml0KGNoaXApOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJjaGlwID0gY2hpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTE0MjUsNyArMTQyOCw4IEBACiAJCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfQ0ZMUiwgQkEwX0NGTFJfREVGQVVMVCk7CiAJCXRtcCA9IHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfQ0ZMUik7CiAJCWlmICh0bXAgIT0gQkEwX0NGTFJfREVGQVVMVCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ0ZMUiBzZXR1cCBmYWlsZWQgKDB4JXgpXG4iLCB0bXApOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJIkNGTFIgc2V0dXAgZmFpbGVkICgweCV4KVxuIiwgdG1wKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAJfQpAQCAtMTQzNiwxMSArMTQ0MCwxMyBAQAogCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfQ1dQUiwgMHg0MjgxKTsKIAkKIAlpZiAoKHRtcCA9IHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfU0VSQzEpKSAhPSAoQkEwX1NFUkMxX1NPMUVOIHwgQkEwX1NFUkMxX0FDOTcpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIlNFUkMxIEFDJzk3IGNoZWNrIGZhaWxlZCAoMHgleClcbiIsIHRtcCk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIlNFUkMxIEFDJzk3IGNoZWNrIGZhaWxlZCAoMHgleClcbiIsIHRtcCk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAoKHRtcCA9IHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfU0VSQzIpKSAhPSAoQkEwX1NFUkMyX1NJMUVOIHwgQkEwX1NFUkMyX0FDOTcpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIlNFUkMyIEFDJzk3IGNoZWNrIGZhaWxlZCAoMHgleClcbiIsIHRtcCk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIlNFUkMyIEFDJzk3IGNoZWNrIGZhaWxlZCAoMHgleClcbiIsIHRtcCk7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMTUwMiw3ICsxNTA4LDcgQEAKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOwogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiRExMUkRZIG5vdCBzZWVuXG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkRMTFJEWSBub3Qgc2VlblxuIik7CiAJcmV0dXJuIC1FSU87CiAKICAgICAgIF9fb2swOgpAQCAtMTUyOCw3ICsxNTM0LDkgQEAKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOwogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAibmV2ZXIgcmVhZCBjb2RlYyByZWFkeSBmcm9tIEFDJzk3ICgweCV4KVxuIiwgc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIEJBMF9BQ1NUUykpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkibmV2ZXIgcmVhZCBjb2RlYyByZWFkeSBmcm9tIEFDJzk3ICgweCV4KVxuIiwKKwkJc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIEJBMF9BQ1NUUykpOwogCXJldHVybiAtRUlPOwogCiAgICAgICBfX29rMToKQEAgLTE1MzksNyArMTU0Nyw4IEBACiAJCQkJZ290byBfX2NvZGVjMl9vazsKIAkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCQl9IHdoaWxlICh0aW1lX2FmdGVyX2VxKGVuZF90aW1lLCBqaWZmaWVzKSk7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJzZWNvbmRhcnkgY29kZWMgZG9lc24ndCByZXNwb25kLiBkaXNhYmxlIGl0Li4uXG4iKTsKKwkJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LAorCQkJICJzZWNvbmRhcnkgY29kZWMgZG9lc24ndCByZXNwb25kLiBkaXNhYmxlIGl0Li4uXG4iKTsKIAkJY2hpcC0+ZHVhbF9jb2RlYyA9IDA7CiAJX19jb2RlYzJfb2s6IDsKIAl9CkBAIC0xNTY5LDcgKzE1NzgsNyBAQAogCiAJaWYgKC0tcmV0cnlfY291bnQgPiAwKQogCQlnb3RvIF9fcmV0cnk7Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAibmV2ZXIgcmVhZCBJU1YzIGFuZCBJU1Y0IGZyb20gQUMnOTdcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAibmV2ZXIgcmVhZCBJU1YzIGFuZCBJU1Y0IGZyb20gQUMnOTdcbiIpOwogCXJldHVybiAtRUlPOwogCiAgICAgICBfX29rMjoKQEAgLTE5MTcsNyArMTkyNiw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yMDU1LDggKzIwNjUsNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY3M0MjgxOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eC5jIGIvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHguYwppbmRleCBiMDM0OTgzLi5hZjBlYWNiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eC5jCisrKyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4LmMKQEAgLTg4LDcgKzg4LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJaWYgKChlcnIgPSBzbmRfY3M0Nnh4X2NyZWF0ZShjYXJkLCBwY2ksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCmluZGV4IDA2MjM5OGUuLjMyYjQ0ZjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCisrKyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIAogCXRtcCA9IHNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfQUNDVEwpOwogCWlmICgodG1wICYgQUNDVExfVkZSTSkgPT0gMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAgImNzNDZ4eDogQUNDVExfVkZSTSBub3Qgc2V0IDB4JXhcbiIsdG1wKTsKKwkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiQUNDVExfVkZSTSBub3Qgc2V0IDB4JXhcbiIsIHRtcCk7CiAJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfQUNDVEwsICh0bXAgJiAofkFDQ1RMX0VTWU4pKSB8IEFDQ1RMX1ZGUk0gKTsKIAkJbXNsZWVwKDUwKTsKIAkJdG1wID0gc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9BQ0NUTCArIG9mZnNldCk7CkBAIC0xNjgsNyArMTY4LDggQEAKIAkJCWdvdG8gb2sxOwogCX0KIAotCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHJlYWQgcHJvYmxlbSAoQUNDVExfRENWKSwgcmVnID0gMHgleFxuIiwgcmVnKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJIkFDJzk3IHJlYWQgcHJvYmxlbSAoQUNDVExfRENWKSwgcmVnID0gMHgleFxuIiwgcmVnKTsKIAlyZXN1bHQgPSAweGZmZmY7CiAJZ290byBlbmQ7CiAJCkBAIC0xODcsNyArMTg4LDkgQEAKIAkJdWRlbGF5KDEwKTsKIAl9CiAJCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgcmVhZCBwcm9ibGVtIChBQ1NUU19WU1RTKSwgY29kZWNfaW5kZXggJWQsIHJlZyA9IDB4JXhcbiIsIGNvZGVjX2luZGV4LCByZWcpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiQUMnOTcgcmVhZCBwcm9ibGVtIChBQ1NUU19WU1RTKSwgY29kZWNfaW5kZXggJWQsIHJlZyA9IDB4JXhcbiIsCisJCWNvZGVjX2luZGV4LCByZWcpOwogCXJlc3VsdCA9IDB4ZmZmZjsKIAlnb3RvIGVuZDsKIApAQCAtMTk3LDcgKzIwMCw4IEBACiAJICogIEFDU0RBID0gU3RhdHVzIERhdGEgUmVnaXN0ZXIgPSA0NzRoCiAJICovCiAjaWYgMAotCXByaW50ayhLRVJOX0RFQlVHICJlKSByZWcgPSAweCV4LCB2YWwgPSAweCV4LCBCQTBfQUNDQUQgPSAweCV4XG4iLCByZWcsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJlKSByZWcgPSAweCV4LCB2YWwgPSAweCV4LCBCQTBfQUNDQUQgPSAweCV4XG4iLCByZWcsCiAJCQlzbmRfY3M0Nnh4X3BlZWtCQTAoY2hpcCwgQkEwX0FDU0RBKSwKIAkJCXNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfQUNDQUQpKTsKICNlbmRpZgpAQCAtMjg2LDcgKzI5MCw5IEBACiAJCQlnb3RvIGVuZDsKIAkJfQogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyB3cml0ZSBwcm9ibGVtLCBjb2RlY19pbmRleCA9ICVkLCByZWcgPSAweCV4LCB2YWwgPSAweCV4XG4iLCBjb2RlY19pbmRleCwgcmVnLCB2YWwpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiQUMnOTcgd3JpdGUgcHJvYmxlbSwgY29kZWNfaW5kZXggPSAlZCwgcmVnID0gMHgleCwgdmFsID0gMHgleFxuIiwKKwkJY29kZWNfaW5kZXgsIHJlZywgdmFsKTsKICBlbmQ6CiAJY2hpcC0+YWN0aXZlX2N0cmwoY2hpcCwgLTEpOwogfQpAQCAtNjA4LDggKzYxNCw4IEBACiAJfQogICAKIAlpZihzdGF0dXMgJiBTRVJCU1RfV0JTWSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IGZhaWx1cmUgd2FpdGluZyBmb3IgIgotCQkJICAgIkZJRk8gY29tbWFuZCB0byBjb21wbGV0ZVxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImZhaWx1cmUgd2FpdGluZyBmb3IgRklGTyBjb21tYW5kIHRvIGNvbXBsZXRlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC02NDYsNyArNjUyLDkgQEAKIAkJICogIE1ha2Ugc3VyZSB0aGUgcHJldmlvdXMgRklGTyB3cml0ZSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KIAkJICovCiAJCWlmIChjczQ2eHhfd2FpdF9mb3JfZmlmbyhjaGlwLDEpKSB7Ci0JCQlzbmRfcHJpbnRkZCAoImZhaWxlZCB3YWl0aW5nIGZvciBGSUZPIGF0IGFkZHIgKCUwMlgpXG4iLGlkeCk7CisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiZmFpbGVkIHdhaXRpbmcgZm9yIEZJRk8gYXQgYWRkciAoJTAyWClcbiIsCisJCQkJaWR4KTsKIAogCQkJaWYgKHBvd2VyZG93bikKIAkJCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0NMS0NSMSwgdG1wKTsKQEAgLTY5NCw3ICs3MDIsNyBAQAogCX0KIAogCWlmIChzbmRfY3M0Nnh4X3BlZWsoY2hpcCwgQkExX1NQQ1IpICYgU1BDUl9SVU5GUikKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiU1BDUl9SVU5GUiBuZXZlciByZXNldFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiU1BDUl9SVU5GUiBuZXZlciByZXNldFxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIHNuZF9jczQ2eHhfcHJvY19zdG9wKHN0cnVjdCBzbmRfY3M0Nnh4ICpjaGlwKQpAQCAtMTA1NCw3ICsxMDYyLDggQEAKIAkJY3BjbS0+cGNtX2NoYW5uZWwgPSBjczQ2eHhfZHNwX2NyZWF0ZV9wY21fY2hhbm5lbCAoY2hpcCwgc2FtcGxlX3JhdGUsIAogCQkJCQkJCQkgICBjcGNtLCBjcGNtLT5od19idWYuYWRkcixjcGNtLT5wY21fY2hhbm5lbF9pZCk7CiAJCWlmIChjcGNtLT5wY21fY2hhbm5lbCA9PSBOVUxMKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IGZhaWxlZCB0byBjcmVhdGUgdmlydHVhbCBQQ00gY2hhbm5lbFxuIik7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiZmFpbGVkIHRvIGNyZWF0ZSB2aXJ0dWFsIFBDTSBjaGFubmVsXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCWNwY20tPnBjbV9jaGFubmVsLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOwpAQCAtMTA2Nyw3ICsxMDc2LDggQEAKIAkJaWYgKCAoY3BjbS0+cGNtX2NoYW5uZWwgPSBjczQ2eHhfZHNwX2NyZWF0ZV9wY21fY2hhbm5lbCAoY2hpcCwgc2FtcGxlX3JhdGUsIGNwY20sIAogCQkJCQkJCQkJIGNwY20tPmh3X2J1Zi5hZGRyLAogCQkJCQkJCQkJIGNwY20tPnBjbV9jaGFubmVsX2lkKSkgPT0gTlVMTCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY3M0Nnh4OiBmYWlsZWQgdG8gcmUtY3JlYXRlIHZpcnR1YWwgUENNIGNoYW5uZWxcbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImZhaWxlZCB0byByZS1jcmVhdGUgdmlydHVhbCBQQ00gY2hhbm5lbFxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCkBAIC0xMTE2LDcgKzExMjYsOCBAQAogCQkgcmV0dXJuIC1FSU5WQUw7CiAJIH0KIAotCXNuZF9wcmludGRkICgicGVyaW9kX3NpemUgKCVkKSwgcGVyaW9kcyAoJWQpIGJ1ZmZlcl9zaXplKCVkKVxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJInBlcmlvZF9zaXplICglZCksIHBlcmlvZHMgKCVkKSBidWZmZXJfc2l6ZSglZClcbiIsCiAJCSAgICAgcGVyaW9kX3NpemUsIHBhcmFtc19wZXJpb2RzKGh3X3BhcmFtcyksCiAJCSAgICAgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKICNlbmRpZgpAQCAtMTUzMSwyMiArMTU0MiwyMCBAQAogCiBzdGF0aWMgaW50IHNuZF9jczQ2eHhfcGxheWJhY2tfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKLQlzbmRfcHJpbnRkZCgib3BlbiBmcm9udCBjaGFubmVsXG4iKTsKKwlkZXZfZGJnKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsICJvcGVuIGZyb250IGNoYW5uZWxcbiIpOwogCXJldHVybiBfY3M0Nnh4X3BsYXliYWNrX29wZW5fY2hhbm5lbChzdWJzdHJlYW0sRFNQX1BDTV9NQUlOX0NIQU5ORUwpOwogfQogCiAjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAogc3RhdGljIGludCBzbmRfY3M0Nnh4X3BsYXliYWNrX29wZW5fcmVhcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKLQlzbmRfcHJpbnRkZCgib3BlbiByZWFyIGNoYW5uZWxcbiIpOwotCisJZGV2X2RiZyhzdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2LCAib3BlbiByZWFyIGNoYW5uZWxcbiIpOwogCXJldHVybiBfY3M0Nnh4X3BsYXliYWNrX29wZW5fY2hhbm5lbChzdWJzdHJlYW0sRFNQX1BDTV9SRUFSX0NIQU5ORUwpOwogfQogCiBzdGF0aWMgaW50IHNuZF9jczQ2eHhfcGxheWJhY2tfb3Blbl9jbGZlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewotCXNuZF9wcmludGRkKCJvcGVuIGNlbnRlciAtIExGRSBjaGFubmVsXG4iKTsKLQorCWRldl9kYmcoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwgIm9wZW4gY2VudGVyIC0gTEZFIGNoYW5uZWxcbiIpOwogCXJldHVybiBfY3M0Nnh4X3BsYXliYWNrX29wZW5fY2hhbm5lbChzdWJzdHJlYW0sRFNQX1BDTV9DRU5URVJfTEZFX0NIQU5ORUwpOwogfQogCkBAIC0xNTU0LDcgKzE1NjMsNyBAQAogewogCXN0cnVjdCBzbmRfY3M0Nnh4ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCi0Jc25kX3ByaW50ZGQoIm9wZW4gcmF3IGllYzk1OCBjaGFubmVsXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIm9wZW4gcmF3IGllYzk1OCBjaGFubmVsXG4iKTsKIAogCW11dGV4X2xvY2soJmNoaXAtPnNwb3NfbXV0ZXgpOwogCWNzNDZ4eF9pZWM5NThfcHJlX29wZW4gKGNoaXApOwpAQCAtMTU3MCw3ICsxNTc5LDcgQEAKIAlpbnQgZXJyOwogCXN0cnVjdCBzbmRfY3M0Nnh4ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogICAKLQlzbmRfcHJpbnRkZCgiY2xvc2UgcmF3IGllYzk1OCBjaGFubmVsXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImNsb3NlIHJhdyBpZWM5NTggY2hhbm5lbFxuIik7CiAKIAllcnIgPSBzbmRfY3M0Nnh4X3BsYXliYWNrX2Nsb3NlKHN1YnN0cmVhbSk7CiAKQEAgLTI0MjEsMTAgKzI0MzAsMTAgQEAKIAogCS8qIHNldCB0aGUgZGVzaXJlZCBDT0RFQyBtb2RlICovCiAJaWYgKGFjOTctPm51bSA9PSBDUzQ2WFhfUFJJTUFSWV9DT0RFQ19JTkRFWCkgewotCQlzbmRfcHJpbnRkZCgiY3M0Nnh4OiBDT0RFQzEgbW9kZSAlMDR4XG4iLCAweDApOworCQlkZXZfZGJnKGFjOTctPmJ1cy0+Y2FyZC0+ZGV2LCAiQ09ERUMxIG1vZGUgJTA0eFxuIiwgMHgwKTsKIAkJc25kX2NzNDZ4eF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfQ1NSX0FDTU9ERSwgMHgwKTsKIAl9IGVsc2UgaWYgKGFjOTctPm51bSA9PSBDUzQ2WFhfU0VDT05EQVJZX0NPREVDX0lOREVYKSB7Ci0JCXNuZF9wcmludGRkKCJjczQ2eHg6IENPREVDMiBtb2RlICUwNHhcbiIsIDB4Myk7CisJCWRldl9kYmcoYWM5Ny0+YnVzLT5jYXJkLT5kZXYsICJDT0RFQzIgbW9kZSAlMDR4XG4iLCAweDMpOwogCQlzbmRfY3M0Nnh4X2FjOTdfd3JpdGUoYWM5NywgQUM5N19DU1JfQUNNT0RFLCAweDMpOwogCX0gZWxzZSB7CiAJCXNuZF9CVUcoKTsgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAuLi4gKi8KQEAgLTI0NTYsNyArMjQ2NSw4IEBACiAJCW1zbGVlcCgxMCk7CiAJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOwogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQ1M0Nnh4IHNlY29uZGFyeSBjb2RlYyBkb2Vzbid0IHJlc3BvbmQhXG4iKTsgIAorCWRldl9lcnIoYWM5Ny0+YnVzLT5jYXJkLT5kZXYsCisJCSJDUzQ2eHggc2Vjb25kYXJ5IGNvZGVjIGRvZXNuJ3QgcmVzcG9uZCFcbiIpOwogfQogI2VuZGlmCiAKQEAgLTI0NzYsNyArMjQ4Niw4IEBACiAJCXNuZF9jczQ2eHhfY29kZWNfd3JpdGUoY2hpcCwgQUM5N19SRVNFVCwgMCwgY29kZWMpOwogCQl1ZGVsYXkoMTApOwogCQlpZiAoc25kX2NzNDZ4eF9jb2RlY19yZWFkKGNoaXAsIEFDOTdfUkVTRVQsIGNvZGVjKSAmIDB4ODAwMCkgewotCQkJc25kX3ByaW50ZGQoInNuZF9jczQ2eHg6IHNlY29uYWRyeSBjb2RlYyBub3QgcHJlc2VudFxuIik7CisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkic2Vjb25hZHJ5IGNvZGVjIG5vdCBwcmVzZW50XG4iKTsKIAkJCXJldHVybiAtRU5YSU87CiAJCX0KIAl9CkBAIC0yNDg5LDcgKzI1MDAsNyBAQAogCQl9CiAJCW1zbGVlcCgxMCk7CiAJfQotCXNuZF9wcmludGRkKCJzbmRfY3M0Nnh4OiBjb2RlYyAlZCBkZXRlY3Rpb24gdGltZW91dFxuIiwgY29kZWMpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiY29kZWMgJWQgZGV0ZWN0aW9uIHRpbWVvdXRcbiIsIGNvZGVjKTsKIAlyZXR1cm4gLUVOWElPOwogfQogCkBAIC0yNTA5LDcgKzI1MjAsNyBAQAogCiAJLyogZGV0ZWN0IHByaW1hcnkgY29kZWMgKi8KIAljaGlwLT5ucl9hYzk3X2NvZGVjcyA9IDA7Ci0Jc25kX3ByaW50ZGQoInNuZF9jczQ2eHg6IGRldGVjdGluZyBwcmltYXJ5IGNvZGVjXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImRldGVjdGluZyBwcmltYXJ5IGNvZGVjXG4iKTsKIAlpZiAoKGVyciA9IHNuZF9hYzk3X2J1cyhjYXJkLCAwLCAmb3BzLCBjaGlwLCAmY2hpcC0+YWM5N19idXMpKSA8IDApCiAJCXJldHVybiBlcnI7CiAJY2hpcC0+YWM5N19idXMtPnByaXZhdGVfZnJlZSA9IHNuZF9jczQ2eHhfbWl4ZXJfZnJlZV9hYzk3X2J1czsKQEAgLTI1MTksNyArMjUzMCw3IEBACiAJY2hpcC0+bnJfYWM5N19jb2RlY3MgPSAxOwogCiAjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAotCXNuZF9wcmludGRkKCJzbmRfY3M0Nnh4OiBkZXRlY3Rpbmcgc2Vjb25hZHJ5IGNvZGVjXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImRldGVjdGluZyBzZWNvbmFkcnkgY29kZWNcbiIpOwogCS8qIHRyeSBkZXRlY3QgYSBzZWNvbmRhcnkgY29kZWMgKi8KIAlpZiAoISBjczQ2eHhfZGV0ZWN0X2NvZGVjKGNoaXAsIENTNDZYWF9TRUNPTkRBUllfQ09ERUNfSU5ERVgpKQogCQljaGlwLT5ucl9hYzk3X2NvZGVjcyA9IDI7CkBAIC0yNTU0LDcgKzI1NjUsNyBAQAogCX0KIAkvKiBkbyBzb3VuZGNhcmQgc3BlY2lmaWMgbWl4ZXIgc2V0dXAgKi8KIAlpZiAoY2hpcC0+bWl4ZXJfaW5pdCkgewotCQlzbmRfcHJpbnRkZCAoImNhbGxpbmcgY2hpcC0+bWl4ZXJfaW5pdChjaGlwKTtcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImNhbGxpbmcgY2hpcC0+bWl4ZXJfaW5pdChjaGlwKTtcbiIpOwogCQljaGlwLT5taXhlcl9pbml0KGNoaXApOwogCX0KICNlbmRpZgpAQCAtMjgwMSw3ICsyODEyLDggQEAKIAogCWNoaXAtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFncCkgewotCQlwcmludGsoS0VSTl9FUlIgImNzNDZ4eDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMzEzOCw4ICszMTUwLDEwIEBACiAJfQogCiAKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjcmVhdGUgLSBuZXZlciByZWFkIGNvZGVjIHJlYWR5IGZyb20gQUMnOTdcbiIpOwotCXNuZF9wcmludGsoS0VSTl9FUlIgIml0IGlzIG5vdCBwcm9iYWJseSBidWcsIHRyeSB0byB1c2UgQ1M0MjM2IGRyaXZlclxuIik7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCSJjcmVhdGUgLSBuZXZlciByZWFkIGNvZGVjIHJlYWR5IGZyb20gQUMnOTdcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiaXQgaXMgbm90IHByb2JhYmx5IGJ1ZywgdHJ5IHRvIHVzZSBDUzQyMzYgZHJpdmVyXG4iKTsKIAlyZXR1cm4gLUVJTzsKICBvazE6CiAjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUApAQCAtMzE1Nyw3ICszMTcxLDggQEAKIAkJICogIE1ha2Ugc3VyZSBDT0RFQyBpcyBSRUFEWS4KIAkJICovCiAJCWlmICghKHNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfQUNTVFMyKSAmIEFDU1RTX0NSRFkpKQotCQkJc25kX3ByaW50ZGQoImNzNDZ4eDogbmV2ZXIgcmVhZCBjYXJkIHJlYWR5IGZyb20gc2Vjb25kYXJ5IEFDJzk3XG4iKTsKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJuZXZlciByZWFkIGNhcmQgcmVhZHkgZnJvbSBzZWNvbmRhcnkgQUMnOTdcbiIpOwogCX0KICNlbmRpZgogCkBAIC0zMTg3LDE3ICszMjAyLDIxIEBACiAJfQogCiAjaWZuZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjcmVhdGUgLSBuZXZlciByZWFkIElTVjMgJiBJU1Y0IGZyb20gQUMnOTdcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiY3JlYXRlIC0gbmV2ZXIgcmVhZCBJU1YzICYgSVNWNCBmcm9tIEFDJzk3XG4iKTsKIAlyZXR1cm4gLUVJTzsKICNlbHNlCiAJLyogVGhpcyBtYXkgaGFwcGVuIG9uIGEgY29sZCBib290IHdpdGggYSBUZXJyYXRlYyBTaVhQYWNrIDUuMS4KIAkgICBSZWxvYWRpbmcgdGhlIGRyaXZlciBtYXkgaGVscCwgaWYgdGhlcmUncyBvdGhlciBzb3VuZGNhcmRzIAogCSAgIHdpdGggdGhlIHNhbWUgcHJvYmxlbSBJIHdvdWxkIGxpa2UgdG8ga25vdy4gKEJlbm55KSAqLwogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiRVJST1I6IHNuZC1jczQ2eHg6IG5ldmVyIHJlYWQgSVNWMyAmIElTVjQgZnJvbSBBQyc5N1xuIik7Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiICAgICAgIFRyeSByZWxvYWRpbmcgdGhlIEFMU0EgZHJpdmVyLCBpZiB5b3UgZmluZCBzb21ldGhpbmdcbiIpOwotICAgICAgICBzbmRfcHJpbnRrKEtFUk5fRVJSICIgICAgICAgYnJva2VuIG9yIG5vdCB3b3JraW5nIG9uIHlvdXIgc291bmRjYXJkIHVwb25cbiIpOwotCXNuZF9wcmludGsoS0VSTl9FUlIgIiAgICAgICB0aGlzIG1lc3NhZ2UgcGxlYXNlIHJlcG9ydCB0byBhbHNhLWRldmVsQGFsc2EtcHJvamVjdC5vcmdcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAibmV2ZXIgcmVhZCBJU1YzICYgSVNWNCBmcm9tIEFDJzk3XG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJIlRyeSByZWxvYWRpbmcgdGhlIEFMU0EgZHJpdmVyLCBpZiB5b3UgZmluZCBzb21ldGhpbmdcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiYnJva2VuIG9yIG5vdCB3b3JraW5nIG9uIHlvdXIgc291bmRjYXJkIHVwb25cbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkidGhpcyBtZXNzYWdlIHBsZWFzZSByZXBvcnQgdG8gYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnXG4iKTsKIAogCXJldHVybiAtRUlPOwogI2VuZGlmCkBAIC0zMjY2LDEzICszMjg1LDEzIEBACiAJZm9yIChpID0gMDsgaSA8IENTNDZYWF9EU1BfTU9EVUxFUzsgaSsrKSB7CiAJCWVyciA9IGxvYWRfZmlybXdhcmUoY2hpcCwgJmNoaXAtPm1vZHVsZXNbaV0sIG1vZHVsZV9uYW1lc1tpXSk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJmaXJtd2FyZSBsb2FkIGVycm9yIFslc11cbiIsCisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImZpcm13YXJlIGxvYWQgZXJyb3IgWyVzXVxuIiwKIAkJCQkgICBtb2R1bGVfbmFtZXNbaV0pOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCQllcnIgPSBjczQ2eHhfZHNwX2xvYWRfbW9kdWxlKGNoaXAsIGNoaXAtPm1vZHVsZXNbaV0pOwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW1hZ2UgZG93bmxvYWQgZXJyb3IgWyVzXVxuIiwKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiaW1hZ2UgZG93bmxvYWQgZXJyb3IgWyVzXVxuIiwKIAkJCQkgICBtb2R1bGVfbmFtZXNbaV0pOwogCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtMzI4OCw3ICszMzA3LDcgQEAKIAkvKiBvbGQgaW1hZ2UgKi8KIAllcnIgPSBzbmRfY3M0Nnh4X2Rvd25sb2FkX2ltYWdlKGNoaXApOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImltYWdlIGRvd25sb2FkIGVycm9yXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJpbWFnZSBkb3dubG9hZCBlcnJvclxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0zMzQxLDcgKzMzNjAsNyBAQAogCXUzMiBpZHgsIHZhbGlkX3Nsb3RzLHRtcCxwb3dlcmRvd24gPSAwOwogCXUxNiBtb2RlbV9wb3dlcixwaW5fY29uZmlnLGxvZ2ljX3R5cGU7CiAKLQlzbmRfcHJpbnRkZCAoImNzNDZ4eDogY3M0Nnh4X3NldHVwX2VhcGRfc2xvdCgpK1xuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJjczQ2eHhfc2V0dXBfZWFwZF9zbG90KCkrXG4iKTsKIAogCS8qCiAJICogIFNlZSBpZiB0aGUgZGV2aWNlcyBhcmUgcG93ZXJlZCBkb3duLiAgSWYgc28sIHdlIG11c3QgcG93ZXIgdGhlbSB1cCBmaXJzdApAQCAtMzM1OSw3ICszMzc4LDggQEAKIAkgKiBzdHVmZi4KIAkgKi8KIAlpZihjaGlwLT5ucl9hYzk3X2NvZGVjcyAhPSAyKSB7Ci0JCXNuZF9wcmludGsgKEtFUk5fRVJSICJjczQ2eHg6IGNzNDZ4eF9zZXR1cF9lYXBkX3Nsb3QoKSAtIG5vIHNlY29uZGFyeSBjb2RlYyBjb25maWd1cmVkXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiY3M0Nnh4X3NldHVwX2VhcGRfc2xvdCgpIC0gbm8gc2Vjb25kYXJ5IGNvZGVjIGNvbmZpZ3VyZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTM0MDAsNyArMzQyMCw3IEBACiAJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9BQ09TViwgdmFsaWRfc2xvdHMpOwogCiAJaWYgKCBjczQ2eHhfd2FpdF9mb3JfZmlmbyhjaGlwLDEpICkgewotCSAgc25kX3ByaW50ZGQoIkZJRk8gaXMgYnVzeVxuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiRklGTyBpcyBidXN5XG4iKTsKIAkgIAogCSAgcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMzQyMSw3ICszNDQxLDkgQEAKIAkJICogV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZQogCQkgKi8KIAkJaWYgKCBjczQ2eHhfd2FpdF9mb3JfZmlmbyhjaGlwLDIwMCkgKSB7Ci0JCQlzbmRfcHJpbnRkZCgiZmFpbGVkIHdhaXRpbmcgZm9yIEZJRk8gYXQgYWRkciAoJTAyWClcbiIsaWR4KTsKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJmYWlsZWQgd2FpdGluZyBmb3IgRklGTyBhdCBhZGRyICglMDJYKVxuIiwKKwkJCQlpZHgpOwogCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMzUxMCwxNCArMzUzMiwxNCBAQAogCiAJY2hpcC0+YW1wbGlmaWVyICs9IGNoYW5nZTsKIAlpZiAoY2hpcC0+YW1wbGlmaWVyICYmICFvbGQpIHsKLQkJc25kX3ByaW50ZGQgKCJIZXJjdWxlcyBhbXBsaWZpZXIgT05cbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIkhlcmN1bGVzIGFtcGxpZmllciBPTlxuIik7CiAKIAkJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9FR1BJT0RSLCAKIAkJCQkgICBFR1BJT0RSX0dQT0UyIHwgdmFsMSk7ICAgICAvKiBlbmFibGUgRUdQSU8yIG91dHB1dCAqLwogCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0VHUElPUFRSLCAKIAkJCQkgICBFR1BJT1BUUl9HUFBUMiB8IHZhbDIpOyAgIC8qIG9wZW4tZHJhaW4gb24gb3V0cHV0ICovCiAJfSBlbHNlIGlmIChvbGQgJiYgIWNoaXAtPmFtcGxpZmllcikgewotCQlzbmRfcHJpbnRkZCAoIkhlcmN1bGVzIGFtcGxpZmllciBPRkZcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIkhlcmN1bGVzIGFtcGxpZmllciBPRkZcbiIpOwogCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0VHUElPRFIsICB2YWwxICYgfkVHUElPRFJfR1BPRTIpOyAvKiBkaXNhYmxlICovCiAJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfRUdQSU9QVFIsIHZhbDIgJiB+RUdQSU9QVFJfR1BQVDIpOyAvKiBkaXNhYmxlICovCiAJfQpAQCAtMzUyNSw3ICszNTQ3LDcgQEAKIAogc3RhdGljIHZvaWQgdm95ZXRyYV9taXhlcl9pbml0IChzdHJ1Y3Qgc25kX2NzNDZ4eCAqY2hpcCkKIHsKLQlzbmRfcHJpbnRkZCAoImluaXRpYWxpemluZyBWb3lldHJhIG1peGVyXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImluaXRpYWxpemluZyBWb3lldHJhIG1peGVyXG4iKTsKIAogCS8qIEVuYWJsZSBTUERJRiBvdXQgKi8KIAlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0VHUElPRFIsIEVHUElPRFJfR1BPRTApOwpAQCAtMzU0Myw3ICszNTY1LDcgQEAKIAkvKiBzZXQgRUdQSU8gdG8gZGVmYXVsdCAqLwogCWhlcmN1bGVzX2luaXQoY2hpcCk7CiAKLQlzbmRfcHJpbnRkZCAoImluaXRpYWxpemluZyBIZXJjdWxlcyBtaXhlclxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJpbml0aWFsaXppbmcgSGVyY3VsZXMgbWl4ZXJcbiIpOwogCiAjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAogCWlmIChjaGlwLT5pbl9zdXNwZW5kKQpAQCAtMzU1NCw3ICszNTc2LDkgQEAKIAogCQlrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfaGVyY3VsZXNfY29udHJvbHNbaWR4XSwgY2hpcCk7CiAJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpIDwgMCkgewotCQkJcHJpbnRrIChLRVJOX0VSUiAiY3M0Nnh4OiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBIZXJjdWxlcyBtaXhlciAoJWQpXG4iLGVycik7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCQkiZmFpbGVkIHRvIGluaXRpYWxpemUgSGVyY3VsZXMgbWl4ZXIgKCVkKVxuIiwKKwkJCQllcnIpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0zODI2LDggKzM4NTAsNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY3M0Nnh4OiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0zOTMyLDcgKzM5NTUsOCBAQAogCWNoaXAtPmJhMV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMSk7CiAJaWYgKGNoaXAtPmJhMF9hZGRyID09IDAgfHwgY2hpcC0+YmEwX2FkZHIgPT0gKHVuc2lnbmVkIGxvbmcpfjAgfHwKIAkgICAgY2hpcC0+YmExX2FkZHIgPT0gMCB8fCBjaGlwLT5iYTFfYWRkciA9PSAodW5zaWduZWQgbG9uZyl+MCkgewotCSAgICAJc25kX3ByaW50ayhLRVJOX0VSUiAid3JvbmcgYWRkcmVzcyhlcykgLSBiYTAgPSAweCVseCwgYmExID0gMHglbHhcbiIsCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIndyb25nIGFkZHJlc3MoZXMpIC0gYmEwID0gMHglbHgsIGJhMSA9IDB4JWx4XG4iLAogCQkJICAgY2hpcC0+YmEwX2FkZHIsIGNoaXAtPmJhMV9hZGRyKTsKIAkgICAgCXNuZF9jczQ2eHhfZnJlZShjaGlwKTsKIAkgICAgCXJldHVybiAtRU5PTUVNOwpAQCAtMzk2OSw3ICszOTkzLDggQEAKIAogCWZvciAoY3AgPSAmY2FyZHNbMF07IGNwLT5uYW1lOyBjcCsrKSB7CiAJCWlmIChjcC0+dmVuZG9yID09IHNzX3ZlbmRvciAmJiBjcC0+aWQgPT0gc3NfY2FyZCkgewotCQkJc25kX3ByaW50ZGQgKCJoYWNrIGZvciAlcyBlbmFibGVkXG4iLCBjcC0+bmFtZSk7CisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImhhY2sgZm9yICVzIGVuYWJsZWRcbiIsCisJCQkJY3AtPm5hbWUpOwogCiAJCQljaGlwLT5hbXBsaWZpZXJfY3RybCA9IGNwLT5hbXA7CiAJCQljaGlwLT5hY3RpdmVfY3RybCA9IGNwLT5hY3RpdmU7CkBAIC0zOTgyLDEyICs0MDA3LDE0IEBACiAJfQogCiAJaWYgKGV4dGVybmFsX2FtcCkgewotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiQ3J5c3RhbCBFQVBEIHN1cHBvcnQgZm9yY2VkIG9uLlxuIik7CisJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJCSAiQ3J5c3RhbCBFQVBEIHN1cHBvcnQgZm9yY2VkIG9uLlxuIik7CiAJCWNoaXAtPmFtcGxpZmllcl9jdHJsID0gYW1wX3ZveWV0cmE7CiAJfQogCiAJaWYgKHRoaW5rcGFkKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJBY3RpdmF0aW5nIENMS1JVTiBoYWNrIGZvciBUaGlua3BhZC5cbiIpOworCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsCisJCQkgIkFjdGl2YXRpbmcgQ0xLUlVOIGhhY2sgZm9yIFRoaW5rcGFkLlxuIik7CiAJCWNoaXAtPmFjdGl2ZV9jdHJsID0gY2xrcnVuX2hhY2s7CiAJCWNsa3J1bl9pbml0KGNoaXApOwogCX0KQEAgLTQwMDUsMTQgKzQwMzIsMTYgQEAKIAkJcmVnaW9uID0gJmNoaXAtPnJlZ2lvbi5pZHhbaWR4XTsKIAkJaWYgKChyZWdpb24tPnJlc291cmNlID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlZ2lvbi0+YmFzZSwgcmVnaW9uLT5zaXplLAogCQkJCQkJCSAgIHJlZ2lvbi0+bmFtZSkpID09IE5VTEwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZXF1ZXN0IG1lbW9yeSByZWdpb24gMHglbHgtMHglbHhcbiIsCisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkidW5hYmxlIHRvIHJlcXVlc3QgbWVtb3J5IHJlZ2lvbiAweCVseC0weCVseFxuIiwKIAkJCQkgICByZWdpb24tPmJhc2UsIHJlZ2lvbi0+YmFzZSArIHJlZ2lvbi0+c2l6ZSAtIDEpOwogCQkJc25kX2NzNDZ4eF9mcmVlKGNoaXApOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCQlyZWdpb24tPnJlbWFwX2FkZHIgPSBpb3JlbWFwX25vY2FjaGUocmVnaW9uLT5iYXNlLCByZWdpb24tPnNpemUpOwogCQlpZiAocmVnaW9uLT5yZW1hcF9hZGRyID09IE5VTEwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVzIGlvcmVtYXAgcHJvYmxlbVxuIiwgcmVnaW9uLT5uYW1lKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSIlcyBpb3JlbWFwIHByb2JsZW1cbiIsIHJlZ2lvbi0+bmFtZSk7CiAJCQlzbmRfY3M0Nnh4X2ZyZWUoY2hpcCk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtNDAyMCw3ICs0MDQ5LDcgQEAKIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2NzNDZ4eF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfY3M0Nnh4X2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtNDA1OCw4ICs0MDg3LDYgQEAKIAogCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIC0xKTsgLyogZGlzYWJsZSBDTEtSVU4gKi8KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyY2hpcCA9IGNoaXA7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zLmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zLmMKaW5kZXggMTY4NmI0Zi4uMWM0YTBmYiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvcy5jCisrKyBiL3NvdW5kL3BjaS9jczQ2eHgvZHNwX3Nwb3MuYwpAQCAtODUsMTIgKzg1LDE1IEBACiAJCQkJCQlhZGRyZXNzICA9IChoaXZhbCAmIDB4MDBGRkYpIDw8IDU7CiAJCQkJCQlhZGRyZXNzIHw9ICBsb3ZhbCA+PiAxNTsKICAgICAgICAgICAgIAotCQkJCQkJc25kX3ByaW50ZGQoImhhbmRsZV93aWRlb3BbMV06ICUwNXg6JTA1eCBhZGRyICUwNHhcbiIsaGl2YWwsbG92YWwsYWRkcmVzcyk7CisJCQkJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkJCQkiaGFuZGxlX3dpZGVvcFsxXTogJTA1eDolMDV4IGFkZHIgJTA0eFxuIiwKKwkJCQkJCQloaXZhbCwgbG92YWwsIGFkZHJlc3MpOwogICAgICAgICAgICAgCiAJCQkJCQlpZiAoICEoYWRkcmVzcyAmIDB4ODAwMCkgKSB7CiAJCQkJCQkJYWRkcmVzcyArPSAoaW5zLT5jb2RlLm9mZnNldCAvIDIpIC0gb3ZlcmxheV9iZWdpbl9hZGRyZXNzOwogCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlzbmRfcHJpbnRkZCgiaGFuZGxlX3dpZGVvcFsxXTogUk9NIHN5bWJvbCBub3QgcmVhbGxvY2F0ZWRcbiIpOworCQkJCQkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCQkJCQkiaGFuZGxlX3dpZGVvcFsxXTogUk9NIHN5bWJvbCBub3QgcmVhbGxvY2F0ZWRcbiIpOwogCQkJCQkJfQogICAgICAgICAgICAgCiAJCQkJCQloaXZhbCAmPSAweEZGMDAwOwpAQCAtMTAyLDggKzEwNSw5IEBACiAJCQkJCQlhZGRyZXNzICA9IChoaXZhbCAmIDB4MDBGRkYpIDw8IDU7CiAJCQkJCQlhZGRyZXNzIHw9ICBsb3ZhbCA+PiAxNTsKICAgICAgICAgICAgIAotCQkJCQkJc25kX3ByaW50ZGQoImhhbmRsZV93aWRlb3A6WzJdICUwNXg6JTA1eCBhZGRyICUwNHhcbiIsaGl2YWwsbG92YWwsYWRkcmVzcyk7ICAgICAgICAgICAgCi0JCQkJCQlucmVhbGxvY2F0ZWQgKys7CisJCQkJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkJCQkiaGFuZGxlX3dpZGVvcDpbMl0gJTA1eDolMDV4IGFkZHIgJTA0eFxuIiwKKwkJCQkJCQloaXZhbCwgbG92YWwsIGFkZHJlc3MpOwkJCQkJCW5yZWFsbG9jYXRlZCsrOwogCQkJCQl9IC8qIHdpZGVfb3Bjb2Rlc1tqXSA9PSB3aWRlX29wICovCiAJCQkJfSAvKiBmb3IgKi8KIAkJCX0gLyogbW9kX3R5cGUgPT0gMCAuLi4gKi8KQEAgLTExMyw3ICsxMTcsOCBAQAogCQlpbnMtPmNvZGUuZGF0YVtpbnMtPmNvZGUuc2l6ZSsrXSA9IGhpdmFsOwogCX0KIAotCXNuZF9wcmludGRkKCJkc3Bfc3BvczogJWQgaW5zdHJ1Y3Rpb25zIHJlYWxsb2NhdGVkXG4iLG5yZWFsbG9jYXRlZCk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJkc3Bfc3BvczogJWQgaW5zdHJ1Y3Rpb25zIHJlYWxsb2NhdGVkXG4iLCBucmVhbGxvY2F0ZWQpOwogCXJldHVybiBucmVhbGxvY2F0ZWQ7CiB9CiAKQEAgLTE1Nyw3ICsxNjIsOCBAQAogCiAJZm9yIChpID0gMDtpIDwgbW9kdWxlLT5zeW1ib2xfdGFibGUubnN5bWJvbHM7ICsraSkgewogCQlpZiAoaW5zLT5zeW1ib2xfdGFibGUubnN5bWJvbHMgPT0gKERTUF9NQVhfU1lNQk9MUyAtIDEpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sIHRhYmxlIGlzIGZ1bGxcbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImRzcF9zcG9zOiBzeW1ib2wgdGFibGUgaXMgZnVsbFxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCkBAIC0xNzYsOCArMTgyLDExIEBACiAKIAkJCWlucy0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzKys7CiAJCX0gZWxzZSB7Ci0gICAgICAgICAgLyogaWYgKDApIHByaW50ayAoImRzcF9zcG9zOiBzeW1ib2wgPCVzPiBkdXBsaWNhdGVkLCBwcm9iYWJseSBub3RoaW5nIHdyb25nIHdpdGggdGhhdCAoQ2lycnVzPylcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS0+c3ltYm9sX3RhYmxlLnN5bWJvbHNbaV0uc3ltYm9sX25hbWUpOyAqLworI2lmIDAKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJkc3Bfc3Bvczogc3ltYm9sIDwlcz4gZHVwbGljYXRlZCwgcHJvYmFibHkgbm90aGluZyB3cm9uZyB3aXRoIHRoYXQgKENpcnJ1cz8pXG4iLAorCQkJCW1vZHVsZS0+c3ltYm9sX3RhYmxlLnN5bWJvbHNbaV0uc3ltYm9sX25hbWUpOyAqLworI2VuZGlmCiAJCX0KIAl9CiAKQEAgLTE5MiwxNCArMjAxLDE1IEBACiAJaW50IGluZGV4OwogCiAJaWYgKGlucy0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzID09IChEU1BfTUFYX1NZTUJPTFMgLSAxKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sIHRhYmxlIGlzIGZ1bGxcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImRzcF9zcG9zOiBzeW1ib2wgdGFibGUgaXMgZnVsbFxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KICAgCiAJaWYgKGNzNDZ4eF9kc3BfbG9va3VwX3N5bWJvbChjaGlwLAogCQkJCSAgICAgc3ltYm9sX25hbWUsCiAJCQkJICAgICB0eXBlKSAhPSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBzeW1ib2wgPCVzPiBkdXBsaWNhdGVkXG4iLCBzeW1ib2xfbmFtZSk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBzeW1ib2wgPCVzPiBkdXBsaWNhdGVkXG4iLCBzeW1ib2xfbmFtZSk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMzA1LDE5ICszMTUsMjAgQEAKIAl1MzIgZG9mZnNldCwgZHNpemU7CiAKIAlpZiAoIXBhcmFtZXRlcikgewotCQlzbmRfcHJpbnRkZCgiZHNwX3Nwb3M6IG1vZHVsZSBnb3Qgbm8gcGFyYW1ldGVyIHNlZ21lbnRcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3BvczogbW9kdWxlIGdvdCBubyBwYXJhbWV0ZXIgc2VnbWVudFxuIik7CiAJCXJldHVybiAwOwogCX0KIAogCWRvZmZzZXQgPSAocGFyYW1ldGVyLT5vZmZzZXQgKiA0ICsgRFNQX1BBUkFNRVRFUl9CWVRFX09GRlNFVCk7CiAJZHNpemUgICA9IHBhcmFtZXRlci0+c2l6ZSAqIDQ7CiAKLQlzbmRfcHJpbnRkZCgiZHNwX3Nwb3M6ICIKLQkJICAgICJkb3dubG9hZGluZyBwYXJhbWV0ZXIgZGF0YSB0byBjaGlwICglMDh4LSUwOHgpXG4iLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiZHNwX3Nwb3M6IGRvd25sb2FkaW5nIHBhcmFtZXRlciBkYXRhIHRvIGNoaXAgKCUwOHgtJTA4eClcbiIsCiAJCSAgICBkb2Zmc2V0LGRvZmZzZXQgKyBkc2l6ZSk7CiAJaWYgKHNuZF9jczQ2eHhfZG93bmxvYWQgKGNoaXAsIHBhcmFtZXRlci0+ZGF0YSwgZG9mZnNldCwgZHNpemUpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiAiCi0JCQkgICAiZmFpbGVkIHRvIGRvd25sb2FkIHBhcmFtZXRlciBkYXRhIHRvIERTUFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBmYWlsZWQgdG8gZG93bmxvYWQgcGFyYW1ldGVyIGRhdGEgdG8gRFNQXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwpAQCAtMzI5LDE4ICszNDAsMjEgQEAKIAl1MzIgZG9mZnNldCwgZHNpemU7CiAKIAlpZiAoIXNhbXBsZSkgewotCQlzbmRfcHJpbnRkZCgiZHNwX3Nwb3M6IG1vZHVsZSBnb3Qgbm8gc2FtcGxlIHNlZ21lbnRcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3BvczogbW9kdWxlIGdvdCBubyBzYW1wbGUgc2VnbWVudFxuIik7CiAJCXJldHVybiAwOwogCX0KIAogCWRvZmZzZXQgPSAoc2FtcGxlLT5vZmZzZXQgKiA0ICArIERTUF9TQU1QTEVfQllURV9PRkZTRVQpOwogCWRzaXplICAgPSAgc2FtcGxlLT5zaXplICogNDsKIAotCXNuZF9wcmludGRkKCJkc3Bfc3BvczogZG93bmxvYWRpbmcgc2FtcGxlIGRhdGEgdG8gY2hpcCAoJTA4eC0lMDh4KVxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJImRzcF9zcG9zOiBkb3dubG9hZGluZyBzYW1wbGUgZGF0YSB0byBjaGlwICglMDh4LSUwOHgpXG4iLAogCQkgICAgZG9mZnNldCxkb2Zmc2V0ICsgZHNpemUpOwogCiAJaWYgKHNuZF9jczQ2eHhfZG93bmxvYWQgKGNoaXAsc2FtcGxlLT5kYXRhLGRvZmZzZXQsZHNpemUpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBmYWlsZWQgdG8gc2FtcGxlIGRhdGEgdG8gRFNQXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IGZhaWxlZCB0byBzYW1wbGUgZGF0YSB0byBEU1BcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIDA7CkBAIC0zNTQsMTQgKzM2OCwxNiBAQAogCWludCBlcnI7CiAKIAlpZiAoaW5zLT5ubW9kdWxlcyA9PSBEU1BfTUFYX01PRFVMRVMgLSAxKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiB0byBtYW55IG1vZHVsZXMgbG9hZGVkIGludG8gRFNQXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IHRvIG1hbnkgbW9kdWxlcyBsb2FkZWQgaW50byBEU1BcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlzbmRfcHJpbnRkZCgiZHNwX3Nwb3M6IGxvYWRpbmcgbW9kdWxlICVzIGludG8gRFNQXG4iLCBtb2R1bGUtPm1vZHVsZV9uYW1lKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJImRzcF9zcG9zOiBsb2FkaW5nIG1vZHVsZSAlcyBpbnRvIERTUFxuIiwgbW9kdWxlLT5tb2R1bGVfbmFtZSk7CiAgIAogCWlmIChpbnMtPm5tb2R1bGVzID09IDApIHsKLQkJc25kX3ByaW50ZGQoImRzcF9zcG9zOiBjbGVhcmluZyBwYXJhbWV0ZXIgYXJlYVxuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiZHNwX3Nwb3M6IGNsZWFyaW5nIHBhcmFtZXRlciBhcmVhXG4iKTsKIAkJc25kX2NzNDZ4eF9jbGVhcl9CQTEoY2hpcCwgRFNQX1BBUkFNRVRFUl9CWVRFX09GRlNFVCwgRFNQX1BBUkFNRVRFUl9CWVRFX1NJWkUpOwogCX0KICAgCkBAIC0zNzEsNyArMzg3LDcgQEAKIAkJcmV0dXJuIGVycjsKIAogCWlmIChpbnMtPm5tb2R1bGVzID09IDApIHsKLQkJc25kX3ByaW50ZGQoImRzcF9zcG9zOiBjbGVhcmluZyBzYW1wbGUgYXJlYVxuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiZHNwX3Nwb3M6IGNsZWFyaW5nIHNhbXBsZSBhcmVhXG4iKTsKIAkJc25kX2NzNDZ4eF9jbGVhcl9CQTEoY2hpcCwgRFNQX1NBTVBMRV9CWVRFX09GRlNFVCwgRFNQX1NBTVBMRV9CWVRFX1NJWkUpOwogCX0KIApAQCAtMzgxLDE1ICszOTcsMTcgQEAKIAkJcmV0dXJuIGVycjsKIAogCWlmIChpbnMtPm5tb2R1bGVzID09IDApIHsKLQkJc25kX3ByaW50ZGQoImRzcF9zcG9zOiBjbGVhcmluZyBjb2RlIGFyZWFcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImRzcF9zcG9zOiBjbGVhcmluZyBjb2RlIGFyZWFcbiIpOwogCQlzbmRfY3M0Nnh4X2NsZWFyX0JBMShjaGlwLCBEU1BfQ09ERV9CWVRFX09GRlNFVCwgRFNQX0NPREVfQllURV9TSVpFKTsKIAl9CiAKIAlpZiAoY29kZSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGRkKCJkc3Bfc3BvczogbW9kdWxlIGdvdCBubyBjb2RlIHNlZ21lbnRcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3BvczogbW9kdWxlIGdvdCBubyBjb2RlIHNlZ21lbnRcbiIpOwogCX0gZWxzZSB7CiAJCWlmIChpbnMtPmNvZGUub2Zmc2V0ICsgY29kZS0+c2l6ZSA+IERTUF9DT0RFX0JZVEVfU0laRSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IG5vIHNwYWNlIGF2YWlsYWJsZSBpbiBEU1BcbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImRzcF9zcG9zOiBubyBzcGFjZSBhdmFpbGFibGUgaW4gRFNQXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKQEAgLTQwMSwxOSArNDE5LDIyIEBACiAJCWlmIChzbmRfQlVHX09OKCFtb2R1bGUtPnN5bWJvbF90YWJsZS5zeW1ib2xzKSkKIAkJCXJldHVybiAtRU5PTUVNOwogCQlpZiAoYWRkX3N5bWJvbHMoY2hpcCxtb2R1bGUpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3BvczogZmFpbGVkIHRvIGxvYWQgc3ltYm9sIHRhYmxlXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJkc3Bfc3BvczogZmFpbGVkIHRvIGxvYWQgc3ltYm9sIHRhYmxlXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAgICAgCiAJCWRvZmZzZXQgPSAoY29kZS0+b2Zmc2V0ICogNCArIGlucy0+Y29kZS5vZmZzZXQgKiA0ICsgRFNQX0NPREVfQllURV9PRkZTRVQpOwogCQlkc2l6ZSAgID0gY29kZS0+c2l6ZSAqIDQ7Ci0JCXNuZF9wcmludGRkKCJkc3Bfc3BvczogZG93bmxvYWRpbmcgY29kZSB0byBjaGlwICglMDh4LSUwOHgpXG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3BvczogZG93bmxvYWRpbmcgY29kZSB0byBjaGlwICglMDh4LSUwOHgpXG4iLAogCQkJICAgIGRvZmZzZXQsZG9mZnNldCArIGRzaXplKTsgICAKIAogCQltb2R1bGUtPm5maXh1cHMgPSBzaGFkb3dfYW5kX3JlYWxsb2NhdGVfY29kZShjaGlwLGNvZGUtPmRhdGEsY29kZS0+c2l6ZSxtb2R1bGUtPm92ZXJsYXlfYmVnaW5fYWRkcmVzcyk7CiAKIAkJaWYgKHNuZF9jczQ2eHhfZG93bmxvYWQgKGNoaXAsKGlucy0+Y29kZS5kYXRhICsgaW5zLT5jb2RlLm9mZnNldCksZG9mZnNldCxkc2l6ZSkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBmYWlsZWQgdG8gZG93bmxvYWQgY29kZSB0byBEU1BcbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImRzcF9zcG9zOiBmYWlsZWQgdG8gZG93bmxvYWQgY29kZSB0byBEU1BcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIApAQCAtNDQ3LDcgKzQ2OCw3IEBACiAJfQogCiAjaWYgMAotCXByaW50ayAoImRzcF9zcG9zOiBzeW1ib2wgPCVzPiB0eXBlICUwMnggbm90IGZvdW5kXG4iLAorCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiZHNwX3Nwb3M6IHN5bWJvbCA8JXM+IHR5cGUgJTAyeCBub3QgZm91bmRcbiIsCiAJCXN5bWJvbF9uYW1lLHN5bWJvbF90eXBlKTsKICNlbmRpZgogCkBAIC05MTAsNyArOTMxLDYgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwogCi1zdGF0aWMgaW50IGRlYnVnX3RyZWU7CiBzdGF0aWMgdm9pZCBfZHNwX2NyZWF0ZV90YXNrX3RyZWUgKHN0cnVjdCBzbmRfY3M0Nnh4ICpjaGlwLCB1MzIgKiB0YXNrX2RhdGEsCiAJCQkJICAgdTMyICBkZXN0LCBpbnQgc2l6ZSkKIHsKQEAgLTkxOSwxMyArOTM5LDEzIEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCWlmIChkZWJ1Z190cmVlKSBwcmludGsgKCJhZGRyICVwLCB2YWwgJTA4eFxuIixzcGRzdCx0YXNrX2RhdGFbaV0pOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImFkZHIgJXAsIHZhbCAlMDh4XG4iLAorCQkJc3Bkc3QsIHRhc2tfZGF0YVtpXSk7CiAJCXdyaXRlbCh0YXNrX2RhdGFbaV0sc3Bkc3QpOwogCQlzcGRzdCArPSBzaXplb2YodTMyKTsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgZGVidWdfc2NiOwogc3RhdGljIHZvaWQgX2RzcF9jcmVhdGVfc2NiIChzdHJ1Y3Qgc25kX2NzNDZ4eCAqY2hpcCwgdTMyICogc2NiX2RhdGEsIHUzMiBkZXN0KQogewogCXZvaWQgX19pb21lbSAqc3Bkc3QgPSBjaGlwLT5yZWdpb24uaWR4WzFdLnJlbWFwX2FkZHIgKyAKQEAgLTkzMyw3ICs5NTMsOCBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IDB4MTA7ICsraSkgewotCQlpZiAoZGVidWdfc2NiKSBwcmludGsgKCJhZGRyICVwLCB2YWwgJTA4eFxuIixzcGRzdCxzY2JfZGF0YVtpXSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiYWRkciAlcCwgdmFsICUwOHhcbiIsCisJCQlzcGRzdCwgc2NiX2RhdGFbaV0pOwogCQl3cml0ZWwoc2NiX2RhdGFbaV0sc3Bkc3QpOwogCQlzcGRzdCArPSBzaXplb2YodTMyKTsKIAl9CkBAIC05NjAsNyArOTgxLDggQEAKIAlpbnQgaW5kZXg7CiAKIAlpZiAoaW5zLT5uc2NiID09IERTUF9NQVhfU0NCX0RFU0MgLSAxKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBnb3Qgbm8gcGxhY2UgZm9yIG90aGVyIFNDQlxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBnb3Qgbm8gcGxhY2UgZm9yIG90aGVyIFNDQlxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtOTkxLDcgKzEwMTMsOCBAQAogCXN0cnVjdCBkc3BfdGFza19kZXNjcmlwdG9yICogZGVzYyA9IE5VTEw7CiAKIAlpZiAoaW5zLT5udGFzayA9PSBEU1BfTUFYX1RBU0tfREVTQyAtIDEpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IGdvdCBubyBwbGFjZSBmb3Igb3RoZXIgVEFTS1xuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBnb3Qgbm8gcGxhY2UgZm9yIG90aGVyIFRBU0tcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTEwMzEsNyArMTA1NCw3IEBACiAJCWRlc2MtPmRhdGEgPSBzY2JfZGF0YTsKIAkJX2RzcF9jcmVhdGVfc2NiKGNoaXAsc2NiX2RhdGEsZGVzdCk7CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IGZhaWxlZCB0byBtYXAgU0NCXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJkc3Bfc3BvczogZmFpbGVkIHRvIG1hcCBTQ0JcbiIpOwogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogCQlrZnJlZShzY2JfZGF0YSk7CiAjZW5kaWYKQEAgLTEwNTIsNyArMTA3NSw3IEBACiAJCWRlc2MtPmRhdGEgPSB0YXNrX2RhdGE7CiAJCV9kc3BfY3JlYXRlX3Rhc2tfdHJlZShjaGlwLHRhc2tfZGF0YSxkZXN0LHNpemUpOwogCX0gZWxzZSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBmYWlsZWQgdG8gbWFwIFRBU0tcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImRzcF9zcG9zOiBmYWlsZWQgdG8gbWFwIFRBU0tcbiIpOwogCX0KIAogCXJldHVybiBkZXNjOwpAQCAtMTEwNSwzMSArMTEyOCwzNiBAQAogCiAJbnVsbF9hbGdvcml0aG0gID0gY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsICJOVUxMQUxHT1JJVEhNIiwgU1lNQk9MX0NPREUpOwogCWlmIChudWxsX2FsZ29yaXRobSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBzeW1ib2wgTlVMTEFMR09SSVRITSBub3QgZm91bmRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3Bvczogc3ltYm9sIE5VTExBTEdPUklUSE0gbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJZmdfdGFza190cmVlX2hlYWRlcl9jb2RlID0gY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsICJGR1RBU0tUUkVFSEVBREVSQ09ERSIsIFNZTUJPTF9DT0RFKTsgIAogCWlmIChmZ190YXNrX3RyZWVfaGVhZGVyX2NvZGUgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sIEZHVEFTS1RSRUVIRUFERVJDT0RFIG5vdCBmb3VuZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBzeW1ib2wgRkdUQVNLVFJFRUhFQURFUkNPREUgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJdGFza190cmVlX2hlYWRlcl9jb2RlID0gY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsICJUQVNLVFJFRUhFQURFUkNPREUiLCBTWU1CT0xfQ09ERSk7ICAKIAlpZiAodGFza190cmVlX2hlYWRlcl9jb2RlID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IHN5bWJvbCBUQVNLVFJFRUhFQURFUkNPREUgbm90IGZvdW5kXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IHN5bWJvbCBUQVNLVFJFRUhFQURFUkNPREUgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogICAKIAl0YXNrX3RyZWVfdGhyZWFkID0gY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsICJUQVNLVFJFRVRIUkVBRCIsIFNZTUJPTF9DT0RFKTsKIAlpZiAodGFza190cmVlX3RocmVhZCA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBzeW1ib2wgVEFTS1RSRUVUSFJFQUQgbm90IGZvdW5kXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IHN5bWJvbCBUQVNLVFJFRVRIUkVBRCBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAltYWdpY19zbm9vcF90YXNrID0gY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsICJNQUdJQ1NOT09QVEFTSyIsIFNZTUJPTF9DT0RFKTsKIAlpZiAobWFnaWNfc25vb3BfdGFzayA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBzeW1ib2wgTUFHSUNTTk9PUFRBU0sgbm90IGZvdW5kXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IHN5bWJvbCBNQUdJQ1NOT09QVEFTSyBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAgIApAQCAtMTQ3Niw3ICsxNTA0LDcgQEAKIAlyZXR1cm4gMDsKIAogIF9mYWlsX2VuZDoKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3BvczogZmFpbGVkIHRvIHNldHVwIFNDQidzIGluIERTUFxuIik7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJkc3Bfc3BvczogZmFpbGVkIHRvIHNldHVwIFNDQidzIGluIERTUFxuIik7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKQEAgLTE0OTEsMTggKzE1MTksMjEgQEAKIAogCXMxNl9hc3luY19jb2RlY19pbnB1dF90YXNrID0gY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsICJTMTZfQVNZTkNDT0RFQ0lOUFVUVEFTSyIsIFNZTUJPTF9DT0RFKTsKIAlpZiAoczE2X2FzeW5jX2NvZGVjX2lucHV0X3Rhc2sgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sIFMxNl9BU1lOQ0NPREVDSU5QVVRUQVNLIG5vdCBmb3VuZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBzeW1ib2wgUzE2X0FTWU5DQ09ERUNJTlBVVFRBU0sgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCXNwZGlmb190YXNrID0gY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsICJTUERJRk9UQVNLIiwgU1lNQk9MX0NPREUpOwogCWlmIChzcGRpZm9fdGFzayA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBzeW1ib2wgU1BESUZPVEFTSyBub3QgZm91bmRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3Bvczogc3ltYm9sIFNQRElGT1RBU0sgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJc3BkaWZpX3Rhc2sgPSBjczQ2eHhfZHNwX2xvb2t1cF9zeW1ib2woY2hpcCwgIlNQRElGSVRBU0siLCBTWU1CT0xfQ09ERSk7CiAJaWYgKHNwZGlmaV90YXNrID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IHN5bWJvbCBTUERJRklUQVNLIG5vdCBmb3VuZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBzeW1ib2wgU1BESUZJVEFTSyBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTE4ODMsNyArMTkxNCw4IEBACiAJfQogCiAJaWYgKGkgPT0gMjUpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IFNQSU9Xcml0ZVRhc2sgbm90IHJlc3BvbmRpbmdcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3BvczogU1BJT1dyaXRlVGFzayBub3QgcmVzcG9uZGluZ1xuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zX3NjYl9saWIuYyBiL3NvdW5kL3BjaS9jczQ2eHgvZHNwX3Nwb3Nfc2NiX2xpYi5jCmluZGV4IDQwOWU4NzYuLjgyODRiYzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQ2eHgvZHNwX3Nwb3Nfc2NiX2xpYi5jCisrKyBiL3NvdW5kL3BjaS9jczQ2eHgvZHNwX3Nwb3Nfc2NiX2xpYi5jCkBAIC0yMzMsOCArMjMzLDExIEBACiB7CiAJaWYgKHNjYi0+cHJvY19pbmZvKSB7CiAJCXN0cnVjdCBwcm9jX3NjYl9pbmZvICogc2NiX2luZm8gPSBzY2ItPnByb2NfaW5mby0+cHJpdmF0ZV9kYXRhOworCQlzdHJ1Y3Qgc25kX2NzNDZ4eCAqY2hpcCA9IHNjYl9pbmZvLT5jaGlwOwogCi0JCXNuZF9wcmludGRkKCJjczQ2eHhfZHNwX3Byb2NfZnJlZV9zY2JfZGVzYzogZnJlZWluZyAlc1xuIixzY2ItPnNjYl9uYW1lKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiY3M0Nnh4X2RzcF9wcm9jX2ZyZWVfc2NiX2Rlc2M6IGZyZWVpbmcgJXNcbiIsCisJCQlzY2ItPnNjYl9uYW1lKTsKIAogCQlzbmRfaW5mb19mcmVlX2VudHJ5KHNjYi0+cHJvY19pbmZvKTsKIAkJc2NiLT5wcm9jX2luZm8gPSBOVUxMOwpAQCAtMzA1LDcgKzMwOCw3IEBACiAJc2NiX2RhdGFbU0NCZnVuY0VudHJ5UHRyXSAmPSAweEZGRkYwMDAwOwogCXNjYl9kYXRhW1NDQmZ1bmNFbnRyeVB0cl0gfD0gdGFza19lbnRyeS0+YWRkcmVzczsKIAotCXNuZF9wcmludGRkKCJkc3Bfc3BvczogY3JlYXRpbmcgU0NCIDwlcz5cbiIsbmFtZSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJkc3Bfc3BvczogY3JlYXRpbmcgU0NCIDwlcz5cbiIsIG5hbWUpOwogCiAJc2NiID0gY3M0Nnh4X2RzcF9jcmVhdGVfc2NiKGNoaXAsbmFtZSxzY2JfZGF0YSxkZXN0KTsKIApAQCAtMzIwLDkgKzMyMywxNSBAQAogCS8qIHVwZGF0ZSBwYXJlbnQgU0NCICovCiAJaWYgKHNjYi0+cGFyZW50X3NjYl9wdHIpIHsKICNpZiAwCi0JCXByaW50ayAoInNjYi0+cGFyZW50X3NjYl9wdHIgPSAlc1xuIixzY2ItPnBhcmVudF9zY2JfcHRyLT5zY2JfbmFtZSk7Ci0JCXByaW50ayAoInNjYi0+cGFyZW50X3NjYl9wdHItPm5leHRfc2NiX3B0ciA9ICVzXG4iLHNjYi0+cGFyZW50X3NjYl9wdHItPm5leHRfc2NiX3B0ci0+c2NiX25hbWUpOwotCQlwcmludGsgKCJzY2ItPnBhcmVudF9zY2JfcHRyLT5zdWJfbGlzdF9wdHIgPSAlc1xuIixzY2ItPnBhcmVudF9zY2JfcHRyLT5zdWJfbGlzdF9wdHItPnNjYl9uYW1lKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkic2NiLT5wYXJlbnRfc2NiX3B0ciA9ICVzXG4iLAorCQkJc2NiLT5wYXJlbnRfc2NiX3B0ci0+c2NiX25hbWUpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJzY2ItPnBhcmVudF9zY2JfcHRyLT5uZXh0X3NjYl9wdHIgPSAlc1xuIiwKKwkJCXNjYi0+cGFyZW50X3NjYl9wdHItPm5leHRfc2NiX3B0ci0+c2NiX25hbWUpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJzY2ItPnBhcmVudF9zY2JfcHRyLT5zdWJfbGlzdF9wdHIgPSAlc1xuIiwKKwkJCXNjYi0+cGFyZW50X3NjYl9wdHItPnN1Yl9saXN0X3B0ci0+c2NiX25hbWUpOwogI2VuZGlmCiAJCS8qIGxpbmsgdG8gIHBhcmVudCBTQ0IgKi8KIAkJaWYgKHNjYl9jaGlsZF90eXBlID09IFNDQl9PTl9QQVJFTlRfTkVYVF9TQ0IpIHsKQEAgLTM2OCw3ICszNzcsOCBAQAogCQkJCQkgICAgICAgU1lNQk9MX0NPREUpOwogICAKIAlpZiAodGFza19lbnRyeSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsgKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sICVzIG5vdCBmb3VuZFxuIix0YXNrX2VudHJ5X25hbWUpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3Bvczogc3ltYm9sICVzIG5vdCBmb3VuZFxuIiwgdGFza19lbnRyeV9uYW1lKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogICAKQEAgLTU4Miw3ICs1OTIsOCBAQAogCQkJCQkJCQkgU1lNQk9MX0NPREUpOwogICAgIAogCQlpZiAoaW5zLT5udWxsX2FsZ29yaXRobSA9PSBOVUxMKSB7Ci0JCQlzbmRfcHJpbnRrIChLRVJOX0VSUiAiZHNwX3Nwb3M6IHN5bWJvbCBOVUxMQUxHT1JJVEhNIG5vdCBmb3VuZFxuIik7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiZHNwX3Nwb3M6IHN5bWJvbCBOVUxMQUxHT1JJVEhNIG5vdCBmb3VuZFxuIik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfSAgICAKIAl9CkBAIC02MTIsNyArNjIzLDggQEAKIAl1bnNpZ25lZCBpbnQgcGhpSW5jcjsKIAl1bnNpZ25lZCBpbnQgY29ycmVjdGlvblBlckdPRiwgY29ycmVjdGlvblBlclNlYzsKIAotCXNuZF9wcmludGRkKCAiZHNwX3Nwb3M6IHNldHRpbmcgJXMgcmF0ZSB0byAldVxuIixzY2JfbmFtZSxyYXRlKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImRzcF9zcG9zOiBzZXR0aW5nICVzIHJhdGUgdG8gJXVcbiIsCisJCXNjYl9uYW1lLCByYXRlKTsKIAogCS8qCiAJICogIENvbXB1dGUgdGhlIHZhbHVlcyB1c2VkIHRvIGRyaXZlIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUgY29udmVyc2lvbi4KQEAgLTY3MCw3ICs2ODIsOCBAQAogCQkJCQkJCQkgU1lNQk9MX0NPREUpOwogCQkJCiAJCQlpZiAoaW5zLT5zMTZfdXAgPT0gTlVMTCkgewotCQkJCXNuZF9wcmludGsgKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sIFMxNl9VUFNSQyBub3QgZm91bmRcbiIpOworCQkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCQkiZHNwX3Nwb3M6IHN5bWJvbCBTMTZfVVBTUkMgbm90IGZvdW5kXG4iKTsKIAkJCQlyZXR1cm4gTlVMTDsKIAkJCX0gICAgCiAJCX0KQEAgLTEyNjUsNyArMTI3OCw3IEBACiAJCSAgIHRoZSBTYW1wbGUgUmF0ZSBDb252ZXJ0ZWQgKHdoaWNoIGNvdWxkCiAJCSAgIGFsdGVyIHRoZSByYXcgZGF0YSBzdHJlYW0gLi4uKSAqLwogCQlpZiAoc2FtcGxlX3JhdGUgPT0gNDgwMDApIHsKLQkJCXNuZF9wcmludGRkICgiSUVDOTU4IHBhc3MgdGhyb3VnaFxuIik7CisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIklFQzk1OCBwYXNzIHRocm91Z2hcbiIpOwogCQkJLyogSGFjayB0byBieXBhc3MgY3JlYXRpbmcgYSBuZXcgU1JDICovCiAJCQlwYXNzX3Rocm91Z2ggPSAxOwogCQl9CkBAIC0xMjk5LDEzICsxMzEyLDE0IEBACiAJfQogCiAJaWYgKHBjbV9pbmRleCA9PSAtMSkgewotCQlzbmRfcHJpbnRrIChLRVJOX0VSUiAiZHNwX3Nwb3M6IG5vIGZyZWUgUENNIGNoYW5uZWxcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImRzcF9zcG9zOiBubyBmcmVlIFBDTSBjaGFubmVsXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJaWYgKHNyY19zY2IgPT0gTlVMTCkgewogCQlpZiAoaW5zLT5uc3JjX3NjYiA+PSBEU1BfTUFYX1NSQ19OUikgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IHRvIG1hbnkgU1JDIGluc3RhbmNlc1xuISIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImRzcF9zcG9zOiB0byBtYW55IFNSQyBpbnN0YW5jZXNcbiEiKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAKQEAgLTEzMzEsNyArMTM0NSw4IEBACiAKIAkJc25wcmludGYgKHNjYl9uYW1lLERTUF9NQVhfU0NCX05BTUUsIlNyY1Rhc2tfU0NCJWQiLHNyY19pbmRleCk7CiAJCQotCQlzbmRfcHJpbnRkZCggImRzcF9zcG9zOiBjcmVhdGluZyBTUkMgXCIlc1wiXG4iLHNjYl9uYW1lKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IGNyZWF0aW5nIFNSQyBcIiVzXCJcbiIsIHNjYl9uYW1lKTsKIAkJc3JjX3NjYiA9IGNzNDZ4eF9kc3BfY3JlYXRlX3NyY190YXNrX3NjYihjaGlwLHNjYl9uYW1lLAogCQkJCQkJCSBzYW1wbGVfcmF0ZSwKIAkJCQkJCQkgc3JjX291dHB1dF9idWZmZXJfYWRkcltzcmNfaW5kZXhdLApAQCAtMTM0Myw3ICsxMzU4LDggQEAKIAkJCQkJCQkgcGFzc190aHJvdWdoKTsKIAogCQlpZiAoIXNyY19zY2IpIHsKLQkJCXNuZF9wcmludGsgKEtFUk5fRVJSICJkc3Bfc3BvczogZmFpbGVkIHRvIGNyZWF0ZSBTUkN0YXNrU0NCXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJkc3Bfc3BvczogZmFpbGVkIHRvIGNyZWF0ZSBTUkN0YXNrU0NCXG4iKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAKQEAgLTEzNTUsOCArMTM3MSw4IEBACiAgIAogCXNucHJpbnRmIChzY2JfbmFtZSxEU1BfTUFYX1NDQl9OQU1FLCJQQ01SZWFkZXJfU0NCJWQiLHBjbV9pbmRleCk7CiAKLQlzbmRfcHJpbnRkZCggImRzcF9zcG9zOiBjcmVhdGluZyBQQ00gXCIlc1wiICglZClcbiIsc2NiX25hbWUsCi0gICAgICAgICAgICAgICAgIHBjbV9jaGFubmVsX2lkKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImRzcF9zcG9zOiBjcmVhdGluZyBQQ00gXCIlc1wiICglZClcbiIsCisJCXNjYl9uYW1lLCBwY21fY2hhbm5lbF9pZCk7CiAKIAlwY21fc2NiID0gY3M0Nnh4X2RzcF9jcmVhdGVfcGNtX3JlYWRlcl9zY2IoY2hpcCxzY2JfbmFtZSwKIAkJCQkJCSAgIHBjbV9yZWFkZXJfYnVmZmVyX2FkZHJbcGNtX2luZGV4XSwKQEAgLTEzNjksNyArMTM4NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogCiAJaWYgKCFwY21fc2NiKSB7Ci0JCXNuZF9wcmludGsgKEtFUk5fRVJSICJkc3Bfc3BvczogZmFpbGVkIHRvIGNyZWF0ZSBQQ01yZWFkZXJTQ0JcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3BvczogZmFpbGVkIHRvIGNyZWF0ZSBQQ01yZWFkZXJTQ0JcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJCkBAIC0xNDE5LDcgKzE0MzYsOCBAQAogCQl0ZW1wIHw9IERNQV9SUV9DMV9TT1VSQ0VfTU9EMTY7CiAJCWJyZWFrOyAKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRkZCAoInBlcmlvZCBzaXplICglZCkgbm90IHN1cHBvcnRlZCBieSBIV1xuIiwgcGVyaW9kX3NpemUpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJwZXJpb2Qgc2l6ZSAoJWQpIG5vdCBzdXBwb3J0ZWQgYnkgSFdcbiIsIHBlcmlvZF9zaXplKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNDU3LDcgKzE0NzUsOCBAQAogCQl0ZW1wIHw9IERNQV9SUV9DMV9ERVNUX01PRDE2OwogCQlicmVhazsgCiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ZGQgKCJwZXJpb2Qgc2l6ZSAoJWQpIG5vdCBzdXBwb3J0ZWQgYnkgSFdcbiIsIHBlcmlvZF9zaXplKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkicGVyaW9kIHNpemUgKCVkKSBub3Qgc3VwcG9ydGVkIGJ5IEhXXG4iLCBwZXJpb2Rfc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNTUzMC5jIGIvc291bmQvcGNpL2NzNTUzMC5jCmluZGV4IGM2YjgyYzguLmI0ZTBmZjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczU1MzAuYworKysgYi9zb3VuZC9wY2kvY3M1NTMwLmMKQEAgLTE2MCwxNyArMTYwLDE3IEBACiAJc2JfYmFzZSA9IDB4MjIwICsgMHgyMCAqIChtYXAgJiAzKTsKIAogCWlmIChtYXAgJiAoMTw8MikpCi0JCXByaW50ayhLRVJOX0lORk8gIkNTNTUzMDogWHByZXNzQXVkaW8gYXQgMHglbHhcbiIsIHNiX2Jhc2UpOworCQlkZXZfaW5mbyhjYXJkLT5kZXYsICJYcHJlc3NBdWRpbyBhdCAweCVseFxuIiwgc2JfYmFzZSk7CiAJZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGZpbmQgWHByZXNzQXVkaW8hXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJDb3VsZCBub3QgZmluZCBYcHJlc3NBdWRpbyFcbiIpOwogCQlzbmRfY3M1NTMwX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWlmIChtYXAgJiAoMTw8NSkpCi0JCXByaW50ayhLRVJOX0lORk8gIkNTNTUzMDogTVBVIGF0IDB4MzAwXG4iKTsKKwkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiTVBVIGF0IDB4MzAwXG4iKTsKIAllbHNlIGlmIChtYXAgJiAoMTw8NikpCi0JCXByaW50ayhLRVJOX0lORk8gIkNTNTUzMDogTVBVIGF0IDB4MzMwXG4iKTsKKwkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiTVBVIGF0IDB4MzMwXG4iKTsKIAogCWlycSA9IHNuZF9jczU1MzBfbWl4ZXJfcmVhZChzYl9iYXNlLCAweDgwKSAmIDB4MEY7CiAJZG1hOCA9IHNuZF9jczU1MzBfbWl4ZXJfcmVhZChzYl9iYXNlLCAweDgxKTsKQEAgLTE4Miw3ICsxODIsNyBAQAogCWVsc2UgaWYgKGRtYTggJiAweDgwKQogCQlkbWExNiA9IDc7CiAJZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ1M1NTMwOiBObyAxNmJpdCBETUEgZW5hYmxlZFxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiTm8gMTZiaXQgRE1BIGVuYWJsZWRcbiIpOwogCQlzbmRfY3M1NTMwX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTE5NCw3ICsxOTQsNyBAQAogCWVsc2UgaWYgKGRtYTggJiAweDA4KQogCQlkbWE4ID0gMzsKIAllbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDUzU1MzA6IE5vIDhiaXQgRE1BIGVuYWJsZWRcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIk5vIDhiaXQgRE1BIGVuYWJsZWRcbiIpOwogCQlzbmRfY3M1NTMwX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTIwOCwzMiArMjA4LDMxIEBACiAJZWxzZSBpZiAoaXJxICYgOCkKIAkJaXJxID0gMTA7CiAJZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ1M1NTMwOiBTb3VuZEJsYXN0ZXIgSVJRIG5vdCBzZXRcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIlNvdW5kQmxhc3RlciBJUlEgbm90IHNldFxuIik7CiAJCXNuZF9jczU1MzBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiQ1M1NTMwOiBJUlE6ICVkIERNQTg6ICVkIERNQTE2OiAlZFxuIiwgaXJxLCBkbWE4LCAKLQkJCQkJCQkJCWRtYTE2KTsKKwlkZXZfaW5mbyhjYXJkLT5kZXYsICJJUlE6ICVkIERNQTg6ICVkIERNQTE2OiAlZFxuIiwgaXJxLCBkbWE4LCBkbWExNik7CiAKIAllcnIgPSBzbmRfc2Jkc3BfY3JlYXRlKGNhcmQsIHNiX2Jhc2UsIGlycSwgc25kX3NiMTZkc3BfaW50ZXJydXB0LCBkbWE4LAogCQkJCQkJZG1hMTYsIFNCX0hXX0NTNTUzMCwgJmNoaXAtPnNiKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNTNTUzMDogQ291bGQgbm90IGNyZWF0ZSBTb3VuZEJsYXN0ZXJcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkNvdWxkIG5vdCBjcmVhdGUgU291bmRCbGFzdGVyXG4iKTsKIAkJc25kX2NzNTUzMF9mcmVlKGNoaXApOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCWVyciA9IHNuZF9zYjE2ZHNwX3BjbShjaGlwLT5zYiwgMCwgJmNoaXAtPnNiLT5wY20pOwogCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ1M1NTMwOiBDb3VsZCBub3QgY3JlYXRlIFBDTVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ291bGQgbm90IGNyZWF0ZSBQQ01cbiIpOwogCQlzbmRfY3M1NTMwX2ZyZWUoY2hpcCk7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJZXJyID0gc25kX3NibWl4ZXJfbmV3KGNoaXAtPnNiKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNTNTUzMDogQ291bGQgbm90IGNyZWF0ZSBNaXhlclxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ291bGQgbm90IGNyZWF0ZSBNaXhlclxuIik7CiAJCXNuZF9jczU1MzBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC0yNDQsNyArMjQzLDYgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CiAJKnJjaGlwID0gY2hpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTI2NCw3ICsyNjIsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvLmMgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW8uYwppbmRleCBjMGQyODM1Li5lZGNiYmRhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW8uYworKysgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW8uYwpAQCAtODQsNyArODQsOCBAQAogCQl1ZGVsYXkoMSk7CiAJfSB3aGlsZSAoLS10aW1lb3V0KTsKIAlpZiAoIXRpbWVvdXQpCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkZhaWx1cmUgd3JpdGluZyB0byBjczU1MzUgY29kZWNcbiIpOworCQlkZXZfZXJyKGNzNTUzNWF1LT5jYXJkLT5kZXYsCisJCQkiRmFpbHVyZSB3cml0aW5nIHRvIGNzNTUzNSBjb2RlY1xuIik7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbmRfY3M1NTM1YXVkaW9fY29kZWNfcmVhZChzdHJ1Y3QgY3M1NTM1YXVkaW8gKmNzNTUzNWF1LApAQCAtMTA5LDggKzExMCw5IEBACiAJCXVkZWxheSgxKTsKIAl9IHdoaWxlICgtLXRpbWVvdXQpOwogCWlmICghdGltZW91dCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRmFpbHVyZSByZWFkaW5nIGNvZGVjIHJlZyAweCV4LCIKLQkJCQkJIkxhc3QgdmFsdWU9MHgleFxuIiwgcmVnLCB2YWwpOworCQlkZXZfZXJyKGNzNTUzNWF1LT5jYXJkLT5kZXYsCisJCQkiRmFpbHVyZSByZWFkaW5nIGNvZGVjIHJlZyAweCV4LCBMYXN0IHZhbHVlPTB4JXhcbiIsCisJCQlyZWcsIHZhbCk7CiAKIAlyZXR1cm4gKHVuc2lnbmVkIHNob3J0KSB2YWw7CiB9CkBAIC0xNjgsNyArMTcwLDcgQEAKIAlvbHBjX3ByZXF1aXJrcyhjYXJkLCAmYWM5Nyk7CiAKIAlpZiAoKGVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmY3M1NTM1YXUtPmFjOTcpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWl4ZXIgZmFpbGVkXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJtaXhlciBmYWlsZWRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMTc2LDcgKzE3OCw3IEBACiAKIAllcnIgPSBvbHBjX3F1aXJrcyhjYXJkLCBjczU1MzVhdS0+YWM5Nyk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAib2xwYyBxdWlya3MgZmFpbGVkXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJvbHBjIHF1aXJrcyBmYWlsZWRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMTk0LDggKzE5Niw5IEBACiAJCWRtYSA9IGNzNTUzNWF1LT5wbGF5YmFja19zdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjczU1MzVhdS0+cGxheWJhY2tfc3Vic3RyZWFtKTsKIAl9IGVsc2UgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmV4cGVjdGVkIGJtMCBpcnEgc3JjLCBibV9zdGF0PSV4XG4iLAotCQkJCQlibV9zdGF0KTsKKwkJZGV2X2VycihjczU1MzVhdS0+Y2FyZC0+ZGV2LAorCQkJInVuZXhwZWN0ZWQgYm0wIGlycSBzcmMsIGJtX3N0YXQ9JXhcbiIsCisJCQlibV9zdGF0KTsKIAl9CiB9CiAKQEAgLTI0MSw4ICsyNDQsOSBAQAogCQkJCXByb2Nlc3NfYm0xX2lycShjczU1MzVhdSk7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIlVuZXhwZWN0ZWQgaXJxIHNyYzogIgotCQkJCQkJIjB4JXhcbiIsIGFjY19pcnFfc3RhdCk7CisJCQkJZGV2X2VycihjczU1MzVhdS0+Y2FyZC0+ZGV2LAorCQkJCQkiVW5leHBlY3RlZCBpcnEgc3JjOiAweCV4XG4iLAorCQkJCQlhY2NfaXJxX3N0YXQpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC0yODcsNyArMjkxLDcgQEAKIAogCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDMyKSkgPCAwIHx8CiAJICAgIHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygzMikpIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJ1bmFibGUgdG8gZ2V0IDMyYml0IGRtYVxuIik7CisJCWRldl93YXJuKGNhcmQtPmRldiwgInVuYWJsZSB0byBnZXQgMzJiaXQgZG1hXG4iKTsKIAkJZXJyID0gLUVOWElPOwogCQlnb3RvIHBjaWZhaWw7CiAJfQpAQCAtMzEyLDcgKzMxNiw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9jczU1MzVhdWRpb19pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNzNTUzNWF1KSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIHNuZGZhaWw7CiAJfQpAQCAtMzI0LDggKzMyOCw2IEBACiAJCQkJICBjczU1MzVhdSwgJm9wcykpIDwgMCkKIAkJZ290byBzbmRmYWlsOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJjczU1MzVhdSA9IGNzNTUzNWF1OwogCXJldHVybiAwOwogCkBAIC0zNTMsNyArMzU1LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19vbHBjLmMgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fb2xwYy5jCmluZGV4IGU2YTQ0NTAuLjNiMGZkYWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19vbHBjLmMKKysrIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX29scGMuYwpAQCAtMzYsNyArMzYsOCBAQAogCWVyciA9IHNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQURfVEVTVDIsCiAJCQkxIDw8IEFDOTdfQURfSFBGRF9TSElGVCwgb24gPDwgQUM5N19BRF9IUEZEX1NISUZUKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJzZXR0aW5nIEhpZ2ggUGFzcyBGaWx0ZXIgLSAlZFxuIiwgZXJyKTsKKwkJZGV2X2VycihhYzk3LT5idXMtPmNhcmQtPmRldiwKKwkJCSJzZXR0aW5nIEhpZ2ggUGFzcyBGaWx0ZXIgLSAlZFxuIiwgZXJyKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTgsNyArNTksNyBAQAogCWVyciA9IHNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQURfTUlTQywKIAkJCTEgPDwgQUM5N19BRF9WUkVGRF9TSElGVCwgb24gPDwgQUM5N19BRF9WUkVGRF9TSElGVCk7CiAJaWYgKGVyciA8IDApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgInNldHRpbmcgTUlDIEJpYXMgLSAlZFxuIiwgZXJyKTsKKwkJZGV2X2VycihhYzk3LT5idXMtPmNhcmQtPmRldiwgInNldHRpbmcgTUlDIEJpYXMgLSAlZFxuIiwgZXJyKTsKIH0KIAogc3RhdGljIGludCBvbHBjX2RjX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKQEAgLTE1Myw3ICsxNTQsNyBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChncGlvX3JlcXVlc3QoT0xQQ19HUElPX01JQ19BQywgRFJWX05BTUUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiB1bmFibGUgdG8gYWxsb2NhdGUgTUlDIEdQSU9cbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBNSUMgR1BJT1xuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlncGlvX2RpcmVjdGlvbl9vdXRwdXQoT0xQQ19HUElPX01JQ19BQywgMCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcGNtLmMgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcGNtLmMKaW5kZXggOWFiMDFhNy4uOWMyZGM5MSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BjbS5jCisrKyBiL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19wY20uYwpAQCAtMzE3LDcgKzMxNyw3IEBACiAJCWRtYS0+b3BzLT5kaXNhYmxlX2RtYShjczU1MzVhdSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuaGFuZGxlZCB0cmlnZ2VyXG4iKTsKKwkJZGV2X2VycihjczU1MzVhdS0+Y2FyZC0+ZGV2LCAidW5oYW5kbGVkIHRyaWdnZXJcbiIpOwogCQllcnIgPSAtRUlOVkFMOwogCQlicmVhazsKIAl9CkBAIC0zMzUsMTMgKzMzNSwxMyBAQAogCWRtYSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCWN1cmRtYSA9IGRtYS0+b3BzLT5yZWFkX2RtYV9wbnRyKGNzNTUzNWF1KTsKIAlpZiAoY3VyZG1hIDwgZG1hLT5idWZfYWRkcikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjdXJkbWE9JXggPCAleCBidWZhZGRyLlxuIiwKKwkJZGV2X2VycihjczU1MzVhdS0+Y2FyZC0+ZGV2LCAiY3VyZG1hPSV4IDwgJXggYnVmYWRkci5cbiIsCiAJCQkJCWN1cmRtYSwgZG1hLT5idWZfYWRkcik7CiAJCXJldHVybiAwOwogCX0KIAljdXJkbWEgLT0gZG1hLT5idWZfYWRkcjsKIAlpZiAoY3VyZG1hID49IGRtYS0+YnVmX2J5dGVzKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRpZmY9JXggPj0gJXggYnVmX2J5dGVzLlxuIiwKKwkJZGV2X2VycihjczU1MzVhdS0+Y2FyZC0+ZGV2LCAiZGlmZj0leCA+PSAleCBidWZfYnl0ZXMuXG4iLAogCQkJCQljdXJkbWEsIGRtYS0+YnVmX2J5dGVzKTsKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BtLmMgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcG0uYwppbmRleCA2YzM0ZGVmLi4zNGNjNjAwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcG0uYworKysgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcG0uYwpAQCAtNzQsNyArNzQsNyBAQAogCXNuZF9jczU1MzVhdWRpb19zdG9wX2hhcmR3YXJlKGNzNTUzNWF1KTsKIAogCWlmIChwY2lfc2F2ZV9zdGF0ZShwY2kpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY3M1NTM1YXVkaW86IHBjaV9zYXZlX3N0YXRlIGZhaWxlZCFcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9zYXZlX3N0YXRlIGZhaWxlZCFcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CkBAIC05NCw4ICs5NCw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjczU1MzVhdWRpbzogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTEzLDcgKzExMiw3IEBACiAJfSB3aGlsZSAoLS10aW1lb3V0KTsKIAogCWlmICghdGltZW91dCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRmFpbHVyZSBnZXR0aW5nIEFDIExpbmsgcmVhZHlcbiIpOworCQlkZXZfZXJyKGNzNTUzNWF1LT5jYXJkLT5kZXYsICJGYWlsdXJlIGdldHRpbmcgQUMgTGluayByZWFkeVxuIik7CiAKIAkvKiBzZXQgdXAgcmF0ZSByZWdzLCBkbWEuIGFjdHVhbCBpbml0aWF0aW9uIGlzIGRvbmUgaW4gdHJpZyAqLwogCWZvciAoaSA9IDA7IGkgPCBOVU1fQ1M1NTM1QVVESU9fRE1BUzsgaSsrKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3R4ZmkvY3RhdGMuYyBiL3NvdW5kL3BjaS9jdHhmaS9jdGF0Yy5jCmluZGV4IGViODY4MjkuLmFmNjMyYmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jdHhmaS9jdGF0Yy5jCisrKyBiL3NvdW5kL3BjaS9jdHhmaS9jdGF0Yy5jCkBAIC0xNzM5LDggKzE3MzksNiBAQAogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm9yMTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyYXRjID0gYXRjOwogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3R4ZmkveGZpLmMgYi9zb3VuZC9wY2kvY3R4ZmkveGZpLmMKaW5kZXggZDQ2NGFkMi4uOTg0MjZkMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2N0eGZpL3hmaS5jCisrKyBiL3NvdW5kL3BjaS9jdHhmaS94ZmkuYwpAQCAtNzEsNyArNzEsOCBAQAogCQlkZXYrKzsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAJaWYgKChyZWZlcmVuY2VfcmF0ZSAhPSA0ODAwMCkgJiYgKHJlZmVyZW5jZV9yYXRlICE9IDQ0MTAwKSkgewpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW8uYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvLmMKaW5kZXggMDVjZmU1NS4uOWYxMGM5ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW8uYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpby5jCkBAIC01OCw3ICs1OCw4IEBACiAJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiZWEvJXMiLCBjYXJkX2Z3W2Z3X2luZGV4XS5kYXRhKTsKIAllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKGZ3X2VudHJ5LCBuYW1lLCBwY2lfZGV2aWNlKGNoaXApKTsKIAlpZiAoZXJyIDwgMCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZ2V0X2Zpcm13YXJlKCk6IEZpcm13YXJlIG5vdCBhdmFpbGFibGUgKCVkKVxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiZ2V0X2Zpcm13YXJlKCk6IEZpcm13YXJlIG5vdCBhdmFpbGFibGUgKCVkKVxuIiwgZXJyKTsKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIAllbHNlCiAJCWNoaXAtPmZ3X2NhY2hlW2Z3X2luZGV4XSA9ICpmd19lbnRyeTsKQEAgLTU2Myw3ICs1NjQsNyBAQAogCWVyciA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sCiAJCQkJICAgICAgIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWFsbG9jX3BhZ2VzIGVycj0lZFxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJtYWxsb2NfcGFnZXMgZXJyPSVkXG4iLCBlcnIpOwogCQlzcGluX2xvY2tfaXJxKCZjaGlwLT5sb2NrKTsKIAkJZnJlZV9waXBlcyhjaGlwLCBwaXBlKTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5sb2NrKTsKQEAgLTE5ODksOCArMTk5MCw4IEBACiAKIAlpZiAoKGNoaXAtPmlvcmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKGNoaXAtPmRzcF9yZWdpc3RlcnNfcGh5cywgc3osCiAJCQkJCSAgICAgIEVDSE9DQVJEX05BTUUpKSA9PSBOVUxMKSB7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiY2Fubm90IGdldCBtZW1vcnkgcmVnaW9uXG4iKTsKIAkJc25kX2VjaG9fZnJlZShjaGlwKTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGdldCBtZW1vcnkgcmVnaW9uXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJY2hpcC0+ZHNwX3JlZ2lzdGVycyA9ICh2b2xhdGlsZSB1MzIgX19pb21lbSAqKQpAQCAtMTk5OCw4ICsxOTk5LDggQEAKIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2VjaG9faW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgeworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNhbm5vdCBncmFiIGlycVxuIik7CiAJCXNuZF9lY2hvX2ZyZWUoY2hpcCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBncmFiIGlycVxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWNoaXAtPmlycSA9IHBjaS0+aXJxOwpAQCAtMjAxMSw4ICsyMDEyLDggQEAKIAlpZiAoc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKIAkJCQlzaXplb2Yoc3RydWN0IGNvbW1fcGFnZSksCiAJCQkJJmNoaXAtPmNvbW1wYWdlX2RtYV9idWYpIDwgMCkgeworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSB0aGUgY29tbSBwYWdlXG4iKTsKIAkJc25kX2VjaG9fZnJlZShjaGlwKTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGFsbG9jYXRlIHRoZSBjb21tIHBhZ2VcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJY2hpcC0+Y29tbV9wYWdlX3BoeXMgPSBjaGlwLT5jb21tcGFnZV9kbWFfYnVmLmFkZHI7CkBAIC0yMDU4LDEyICsyMDU5LDExIEBACiAKIAlERV9JTklUKCgiRWNob2F1ZGlvIGRyaXZlciBzdGFydGluZy4uLlxuIikpOwogCWkgPSAwOwotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJY2hpcCA9IE5VTEw7CS8qIFRlbGxzIHNuZF9lY2hvX2NyZWF0ZSB0byBhbGxvY2F0ZSBjaGlwICovCiAJaWYgKChlcnIgPSBzbmRfZWNob19jcmVhdGUoY2FyZCwgcGNpLCAmY2hpcCkpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwpAQCAtMjA4Miw3ICsyMDgyLDcgQEAKIAkJY2hpcC0+ZHNwX3JlZ2lzdGVyc19waHlzLCBjaGlwLT5pcnEpOwogCiAJaWYgKChlcnIgPSBzbmRfZWNob19uZXdfcGNtKGNoaXApKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAibmV3IHBjbSBlcnJvciAlZFxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJuZXcgcGNtIGVycm9yICVkXG4iLCBlcnIpOwogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTIwOTAsNyArMjA5MCw3IEBACiAjaWZkZWYgRUNIT0NBUkRfSEFTX01JREkKIAlpZiAoY2hpcC0+aGFzX21pZGkpIHsJLyogU29tZSBNaWEncyBkbyBub3QgaGF2ZSBtaWRpICovCiAJCWlmICgoZXJyID0gc25kX2VjaG9fbWlkaV9jcmVhdGUoY2FyZCwgY2hpcCkpIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAibmV3IG1pZGkgZXJyb3IgJWRcbiIsIGVycik7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIm5ldyBtaWRpIGVycm9yICVkXG4iLCBlcnIpOwogCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTIxODksMTQgKzIxODksMTQgQEAKIAllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBjdGxfZXJyb3I7Ci0Jc25kX3ByaW50ayhLRVJOX0lORk8gIkNhcmQgcmVnaXN0ZXJlZDogJXNcbiIsIGNhcmQtPmxvbmduYW1lKTsKKwlkZXZfaW5mbyhjYXJkLT5kZXYsICJDYXJkIHJlZ2lzdGVyZWQ6ICVzXG4iLCBjYXJkLT5sb25nbmFtZSk7CiAKIAlwY2lfc2V0X2RydmRhdGEocGNpLCBjaGlwKTsKIAlkZXYrKzsKIAlyZXR1cm4gMDsKIAogY3RsX2Vycm9yOgotCXNuZF9wcmludGsoS0VSTl9FUlIgIm5ldyBjb250cm9sIGVycm9yICVkXG4iLCBlcnIpOworCWRldl9lcnIoY2FyZC0+ZGV2LCAibmV3IGNvbnRyb2wgZXJyb3IgJWRcbiIsIGVycik7CiAJc25kX2NhcmRfZnJlZShjYXJkKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjI5MSw4ICsyMjkxLDggQEAKIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2VjaG9faW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgeworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNhbm5vdCBncmFiIGlycVxuIik7CiAJCXNuZF9lY2hvX2ZyZWUoY2hpcCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBncmFiIGlycVxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWNoaXAtPmlycSA9IHBjaS0+aXJxOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW9fZHNwLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpb19kc3AuYwppbmRleCBkOGM2NzBjLi41YTZhMjE3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpb19kc3AuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpb19kc3AuYwpAQCAtNTMsNyArNTMsNyBAQAogCQl1ZGVsYXkoMSk7CiAJfQogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAid2FpdF9oYW5kc2hha2UoKTogVGltZW91dCB3YWl0aW5nIGZvciBEU1BcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAid2FpdF9oYW5kc2hha2UoKTogVGltZW91dCB3YWl0aW5nIGZvciBEU1BcbiIpOwogCXJldHVybiAtRUJVU1k7CiB9CiAKQEAgLTE0OSw3ICsxNDksOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewogCQlpZiAocmVhZF9kc3AoY2hpcCwgJnNuW2ldKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlYWQgc2VyaWFsIG51bWJlclxuIik7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiRmFpbGVkIHRvIHJlYWQgc2VyaWFsIG51bWJlclxuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCX0KQEAgLTE4NCw3ICsxODUsNyBAQAogCiAJZXJyID0gZ2V0X2Zpcm13YXJlKCZmdywgY2hpcCwgYXNpYyk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkZpcm13YXJlIG5vdCBmb3VuZCAhXG4iKTsKKwkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiRmlybXdhcmUgbm90IGZvdW5kICFcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMjQ3LDcgKzI0OCw3IEBACiAKIAlpID0gZ2V0X2Zpcm13YXJlKCZmdywgY2hpcCwgRldfMzYxX0xPQURFUik7CiAJaWYgKGkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJGaXJtd2FyZSBub3QgZm91bmQgIVxuIik7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgIkZpcm13YXJlIG5vdCBmb3VuZCAhXG4iKTsKIAkJcmV0dXJuIGk7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL21pZGkuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlkaS5jCmluZGV4IGFiZmQ1MWMuLjdmNGRmYWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlkaS5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlkaS5jCkBAIC0yMjEsNyArMjIxLDggQEAKIAkJREVfTUlEKCgiVHJ5IHRvIHNlbmQgJWQgYnl0ZXMuLi5cbiIsIGJ5dGVzKSk7CiAJCXNlbnQgPSB3cml0ZV9taWRpKGNoaXAsIGJ1ZiwgYnl0ZXMpOwogCQlpZiAoc2VudCA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIndyaXRlX21pZGkoKSBlcnJvciAlZFxuIiwgc2VudCk7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkid3JpdGVfbWlkaSgpIGVycm9yICVkXG4iLCBzZW50KTsKIAkJCS8qIHJldHJ5IGxhdGVyICovCiAJCQlzZW50ID0gOTAwMDsKIAkJCWNoaXAtPm1pZGlfZnVsbCA9IDE7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxLmMKaW5kZXggOWUxYmQwYy4uYWQ5ZDlmOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMS5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazEuYwpAQCAtMTE3LDcgKzExNyw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWlmIChtYXhfYnVmZmVyX3NpemVbZGV2XSA8IDMyKQpAQCAtMTY5LDcgKzE3MCw4IEBACiAJaWYgKHNuZF9zZXFfZGV2aWNlX25ldyhjYXJkLCAxLCBTTkRSVl9TRVFfREVWX0lEX0VNVTEwSzFfU1lOVEgsCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfZW11MTBrMV9zeW50aF9hcmcpLCAmd2F2ZSkgPCAwIHx8CiAJICAgIHdhdmUgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiY2FuJ3QgaW5pdGlhbGl6ZSBFbXUxMGsxIHdhdmV0YWJsZSBzeW50aFxuIik7CisJCWRldl93YXJuKGVtdS0+Y2FyZC0+ZGV2LAorCQkJICJjYW4ndCBpbml0aWFsaXplIEVtdTEwazEgd2F2ZXRhYmxlIHN5bnRoXG4iKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3Qgc25kX2VtdTEwazFfc3ludGhfYXJnICphcmc7CiAJCWFyZyA9IFNORFJWX1NFUV9ERVZJQ0VfQVJHUFRSKHdhdmUpOwpAQCAtMjQ2LDggKzI0OCw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX2NhbGxiYWNrLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX2NhbGxiYWNrLmMKaW5kZXggY2FlMzY1OS4uM2YzZWYzOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9jYWxsYmFjay5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfY2FsbGJhY2suYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJCQl2cCA9ICZlbXUtPnZvaWNlc1tiZXN0W2ldLnZvaWNlXTsKIAkJCWlmICgoY2ggPSB2cC0+Y2gpIDwgMCkgewogCQkJCS8qCi0JCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCWRldl93YXJuKGVtdS0+Y2FyZC0+ZGV2LAogCQkJCSAgICAgICAic3ludGhfZ2V0X3ZvaWNlOiBjaCA8IDAgKCVkKSA/PyIsIGkpOwogCQkJCSovCiAJCQkJY29udGludWU7CkBAIC0zMzksNyArMzM5LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJZW1lbS0+bWFwX2xvY2tlZCsrOwogCWlmIChzbmRfZW11MTBrMV9tZW1ibGtfbWFwKGh3LCBlbWVtKSA8IDApIHsKLQkJLyogcHJpbnRrKEtFUk5fRVJSICJlbXU6IGNhbm5vdCBtYXAhXG4iKTsgKi8KKwkJLyogZGV2X2Vycihody0+Y2FyZC0+ZGV2SywgImVtdTogY2Fubm90IG1hcCFcbiIpOyAqLwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJbWFwcGVkX29mZnNldCA9IHNuZF9lbXUxMGsxX21lbWJsa19vZmZzZXQoZW1lbSkgPj4gMTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKaW5kZXggYmRkODg4ZS4uMjI5MjY5NyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKQEAgLTIxNyw3ICsyMTcsNyBAQAogCX0KIAlpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+Y2EwMTA4X2NoaXApIHsgLyogYXVkaWd5MiBWYWx1ZSAqLwogCQkvKiBIYWNrcyBmb3IgQWxpY2UzIHRvIHdvcmsgaW5kZXBlbmRlbnQgb2YgaGFQMTZWIGRyaXZlciAqLwotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiQXVkaWd5MiB2YWx1ZTogU3BlY2lhbCBjb25maWcuXG4iKTsKKwkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsICJBdWRpZ3kyIHZhbHVlOiBTcGVjaWFsIGNvbmZpZy5cbiIpOwogCQkvKiBTZXR1cCBTUkNNdWx0aV9JMlMgU2FtcGxpbmdSYXRlICovCiAJCXRtcCA9IHNuZF9lbXUxMGsxX3B0cl9yZWFkKGVtdSwgQV9TUERJRl9TQU1QTEVSQVRFLCAwKTsKIAkJdG1wICY9IDB4ZmZmZmYxZmY7CkBAIC03MjMsNyArNzIzLDggQEAKIAkJaWYgKHJlZyAmIEVNVV9IQU5BX09QVElPTl9ET0NLX09GRkxJTkUpIHsKIAkJCS8qIEF1ZGlvIERvY2sgYXR0YWNoZWQgKi8KIAkJCS8qIFJldHVybiB0byBBdWRpbyBEb2NrIHByb2dyYW1taW5nIG1vZGUgKi8KLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBMb2FkaW5nIEF1ZGlvIERvY2sgRmlybXdhcmVcbiIpOworCQkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsCisJCQkJICJlbXUxMDEwOiBMb2FkaW5nIEF1ZGlvIERvY2sgRmlybXdhcmVcbiIpOwogCQkJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX0ZQR0FfQ09ORklHLCBFTVVfSEFOQV9GUEdBX0NPTkZJR19BVURJT0RPQ0spOwogCiAJCQlpZiAoIWVtdS0+ZG9ja19mdykgewpAQCAtNzU2LDE5ICs3NTcsMjUgQEAKIAogCQkJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX0ZQR0FfQ09ORklHLCAwKTsKIAkJCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX0lSUV9TVEFUVVMsICZyZWcpOwotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IEVNVV9IQU5BK0RPQ0tfSVJRX1NUQVRVUyA9IDB4JXhcbiIsIHJlZyk7CisJCQlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwKKwkJCQkgImVtdTEwMTA6IEVNVV9IQU5BK0RPQ0tfSVJRX1NUQVRVUyA9IDB4JXhcbiIsCisJCQkJIHJlZyk7CiAJCQkvKiBJRCwgc2hvdWxkIHJlYWQgJiAweDdmID0gMHg1NSB3aGVuIEZQR0EgcHJvZ3JhbW1lZC4gKi8KIAkJCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX0lELCAmcmVnKTsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBFTVVfSEFOQStET0NLX0lEID0gMHgleFxuIiwgcmVnKTsKKwkJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LAorCQkJCSAiZW11MTAxMDogRU1VX0hBTkErRE9DS19JRCA9IDB4JXhcbiIsIHJlZyk7CiAJCQlpZiAoKHJlZyAmIDB4MWYpICE9IDB4MTUpIHsKIAkJCQkvKiBGUEdBIGZhaWxlZCB0byBiZSBwcm9ncmFtbWVkICovCi0JCQkJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IExvYWRpbmcgQXVkaW8gRG9jayBGaXJtd2FyZSBmaWxlIGZhaWxlZCwgcmVnID0gMHgleFxuIiwgcmVnKTsKKwkJCQlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwKKwkJCQkJICJlbXUxMDEwOiBMb2FkaW5nIEF1ZGlvIERvY2sgRmlybXdhcmUgZmlsZSBmYWlsZWQsIHJlZyA9IDB4JXhcbiIsCisJCQkJCSByZWcpOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IEF1ZGlvIERvY2sgRmlybXdhcmUgbG9hZGVkXG4iKTsKKwkJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LAorCQkJCSAiZW11MTAxMDogQXVkaW8gRG9jayBGaXJtd2FyZSBsb2FkZWRcbiIpOwogCQkJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0RPQ0tfTUFKT1JfUkVWLCAmdG1wKTsKIAkJCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9ET0NLX01JTk9SX1JFViwgJnRtcDIpOwotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkF1ZGlvIERvY2sgdmVyOiAldS4ldVxuIiwKKwkJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiQXVkaW8gRG9jayB2ZXI6ICV1LiV1XG4iLAogCQkJCSAgIHRtcCwgdG1wMik7CiAJCQkvKiBTeW5jIGNsb2NraW5nIGJldHdlZW4gMTAxMCBhbmQgRG9jayAqLwogCQkJLyogQWxsb3cgRExMIHRvIHNldHRsZSAqLwpAQCAtNzc3LDcgKzc4NCw3IEBACiAJCQlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfVU5NVVRFLCBFTVVfVU5NVVRFKTsKIAkJfQogCX0KLQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogZmlybXdhcmUgdGhyZWFkIHN0b3BwaW5nXG4iKTsKKwlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwgImVtdTEwMTA6IGZpcm13YXJlIHRocmVhZCBzdG9wcGluZ1xuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgxOCw3ICs4MjUsNyBAQAogCXUzMiB0bXAsIHRtcDIsIHJlZzsKIAlpbnQgZXJyOwogCi0Jc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IFNwZWNpYWwgY29uZmlnLlxuIik7CisJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsICJlbXUxMDEwOiBTcGVjaWFsIGNvbmZpZy5cbiIpOwogCS8qIEFDOTcgMi4xLCBBbnkgMTZNZWcgb2YgNEdpZyBhZGRyZXNzLCBBdXRvLU11dGUsIEVNVTMyIFNsYXZlLAogCSAqIExvY2sgU291bmQgTWVtb3J5IENhY2hlLCBMb2NrIFRhbmsgTWVtb3J5IENhY2hlLAogCSAqIE11dGUgYWxsIGNvZGVjcy4KQEAgLTg0Myw3ICs4NTAsNyBAQAogCiAJLyogSUQsIHNob3VsZCByZWFkICYgMHg3ZiA9IDB4NTUuIChCaXQgNyBpcyB0aGUgSVJRIGJpdCkgKi8KIAlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9JRCwgJnJlZyk7Ci0Jc25kX3ByaW50ZGQoInJlZzEgPSAweCV4XG4iLCByZWcpOworCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJyZWcxID0gMHgleFxuIiwgcmVnKTsKIAlpZiAoKHJlZyAmIDB4M2YpID09IDB4MTUpIHsKIAkJLyogRlBHQSBuZXRsaXN0IGFscmVhZHkgcHJlc2VudCBzbyBjbGVhciBpdCAqLwogCQkvKiBSZXR1cm4gdG8gcHJvZ3JhbW1pbmcgbW9kZSAqLwpAQCAtODUxLDEzICs4NTgsMTQgQEAKIAkJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX0ZQR0FfQ09ORklHLCAweDAyKTsKIAl9CiAJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfSUQsICZyZWcpOwotCXNuZF9wcmludGRkKCJyZWcyID0gMHgleFxuIiwgcmVnKTsKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAicmVnMiA9IDB4JXhcbiIsIHJlZyk7CiAJaWYgKChyZWcgJiAweDNmKSA9PSAweDE1KSB7CiAJCS8qIEZQR0EgZmFpbGVkIHRvIHJldHVybiB0byBwcm9ncmFtbWluZyBtb2RlICovCi0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBGUEdBIGZhaWxlZCB0byByZXR1cm4gdG8gcHJvZ3JhbW1pbmcgbW9kZVxuIik7CisJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LAorCQkJICJlbXUxMDEwOiBGUEdBIGZhaWxlZCB0byByZXR1cm4gdG8gcHJvZ3JhbW1pbmcgbW9kZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogRU1VX0hBTkFfSUQgPSAweCV4XG4iLCByZWcpOworCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiZW11MTAxMDogRU1VX0hBTkFfSUQgPSAweCV4XG4iLCByZWcpOwogCiAJaWYgKCFlbXUtPmZpcm13YXJlKSB7CiAJCWNvbnN0IGNoYXIgKmZpbGVuYW1lOwpAQCAtODgwLDE2ICs4ODgsMTkgQEAKIAogCQllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZlbXUtPmZpcm13YXJlLCBmaWxlbmFtZSwgJmVtdS0+cGNpLT5kZXYpOwogCQlpZiAoZXJyICE9IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVtdTEwMTA6IGZpcm13YXJlOiAlcyBub3QgZm91bmQuIEVyciA9ICVkXG4iLCBmaWxlbmFtZSwgZXJyKTsKKwkJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LAorCQkJCSAiZW11MTAxMDogZmlybXdhcmU6ICVzIG5vdCBmb3VuZC4gRXJyID0gJWRcbiIsCisJCQkJIGZpbGVuYW1lLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogZmlybXdhcmUgZmlsZSA9ICVzLCBzaXplID0gMHglenhcbiIsCisJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LAorCQkJICJlbXUxMDEwOiBmaXJtd2FyZSBmaWxlID0gJXMsIHNpemUgPSAweCV6eFxuIiwKIAkJCSAgIGZpbGVuYW1lLCBlbXUtPmZpcm13YXJlLT5zaXplKTsKIAl9CiAKIAllcnIgPSBzbmRfZW11MTAxMF9sb2FkX2Zpcm13YXJlKGVtdSwgZW11LT5maXJtd2FyZSk7CiAJaWYgKGVyciAhPSAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBMb2FkaW5nIEZpcm13YXJlIGZhaWxlZFxuIik7CisJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiZW11MTAxMDogTG9hZGluZyBGaXJtd2FyZSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtODk3LDIxICs5MDgsMjMgQEAKIAlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9JRCwgJnJlZyk7CiAJaWYgKChyZWcgJiAweDNmKSAhPSAweDE1KSB7CiAJCS8qIEZQR0EgZmFpbGVkIHRvIGJlIHByb2dyYW1tZWQgKi8KLQkJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IExvYWRpbmcgSGFuYSBGaXJtd2FyZSBmaWxlIGZhaWxlZCwgcmVnID0gMHgleFxuIiwgcmVnKTsKKwkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsCisJCQkgImVtdTEwMTA6IExvYWRpbmcgSGFuYSBGaXJtd2FyZSBmaWxlIGZhaWxlZCwgcmVnID0gMHgleFxuIiwKKwkJCSByZWcpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogSGFuYSBGaXJtd2FyZSBsb2FkZWRcbiIpOworCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiZW11MTAxMDogSGFuYSBGaXJtd2FyZSBsb2FkZWRcbiIpOwogCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX01BSk9SX1JFViwgJnRtcCk7CiAJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfTUlOT1JfUkVWLCAmdG1wMik7Ci0Jc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IEhhbmEgdmVyc2lvbjogJXUuJXVcbiIsIHRtcCwgdG1wMik7CisJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsICJlbXUxMDEwOiBIYW5hIHZlcnNpb246ICV1LiV1XG4iLCB0bXAsIHRtcDIpOwogCS8qIEVuYWJsZSA0OFZvbHQgcG93ZXIgdG8gQXVkaW8gRG9jayAqLwogCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9ET0NLX1BXUiwgRU1VX0hBTkFfRE9DS19QV1JfT04pOwogCiAJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfT1BUSU9OX0NBUkRTLCAmcmVnKTsKLQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogQ2FyZCBvcHRpb25zID0gMHgleFxuIiwgcmVnKTsKKwlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwgImVtdTEwMTA6IENhcmQgb3B0aW9ucyA9IDB4JXhcbiIsIHJlZyk7CiAJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfT1BUSU9OX0NBUkRTLCAmcmVnKTsKLQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogQ2FyZCBvcHRpb25zID0gMHgleFxuIiwgcmVnKTsKKwlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwgImVtdTEwMTA6IENhcmQgb3B0aW9ucyA9IDB4JXhcbiIsIHJlZyk7CiAJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfT1BUSUNBTF9UWVBFLCAmdG1wKTsKIAkvKiBPcHRpY2FsIC0+IEFEQVQgSS9PICAqLwogCS8qIDAgOiBTUERJRgpAQCAtOTUwLDcgKzk2Myw3IEBACiAJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX0lSUV9FTkFCTEUsIDB4MDApOwogCiAJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfT1BUSU9OX0NBUkRTLCAmcmVnKTsKLQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogQ2FyZCBvcHRpb25zMyA9IDB4JXhcbiIsIHJlZyk7CisJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsICJlbXUxMDEwOiBDYXJkIG9wdGlvbnMzID0gMHgleFxuIiwgcmVnKTsKIAkvKiBEZWZhdWx0IFdDTEsgc2V0IHRvIDQ4a0h6LiAqLwogCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9ERUZDTE9DSywgMHgwMCk7CiAJLyogV29yZCBDbG9jayBzb3VyY2UsIEludGVybmFsIDQ4a0h6IHgxICovCkBAIC0xODA4LDcgKzE4MjEsOSBAQAogCWVtdS0+cmV2aXNpb24gPSBwY2ktPnJldmlzaW9uOwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2ksIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmZW11LT5zZXJpYWwpOwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaSwgUENJX1NVQlNZU1RFTV9JRCwgJmVtdS0+bW9kZWwpOwotCXNuZF9wcmludGRkKCJ2ZW5kb3IgPSAweCV4LCBkZXZpY2UgPSAweCV4LCBzdWJzeXN0ZW1fdmVuZG9yX2lkID0gMHgleCwgc3Vic3lzdGVtX2lkID0gMHgleFxuIiwgcGNpLT52ZW5kb3IsIHBjaS0+ZGV2aWNlLCBlbXUtPnNlcmlhbCwgZW11LT5tb2RlbCk7CisJZGV2X2RiZyhjYXJkLT5kZXYsCisJCSJ2ZW5kb3IgPSAweCV4LCBkZXZpY2UgPSAweCV4LCBzdWJzeXN0ZW1fdmVuZG9yX2lkID0gMHgleCwgc3Vic3lzdGVtX2lkID0gMHgleFxuIiwKKwkJcGNpLT52ZW5kb3IsIHBjaS0+ZGV2aWNlLCBlbXUtPnNlcmlhbCwgZW11LT5tb2RlbCk7CiAKIAlmb3IgKGMgPSBlbXVfY2hpcF9kZXRhaWxzOyBjLT52ZW5kb3I7IGMrKykgewogCQlpZiAoYy0+dmVuZG9yID09IHBjaS0+dmVuZG9yICYmIGMtPmRldmljZSA9PSBwY2ktPmRldmljZSkgewpAQCAtMTgyNywyMSArMTg0MiwyMSBAQAogCQl9CiAJfQogCWlmIChjLT52ZW5kb3IgPT0gMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBDYXJkIG5vdCByZWNvZ25pc2VkXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJlbXUxMGsxOiBDYXJkIG5vdCByZWNvZ25pc2VkXG4iKTsKIAkJa2ZyZWUoZW11KTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAllbXUtPmNhcmRfY2FwYWJpbGl0aWVzID0gYzsKIAlpZiAoYy0+c3Vic3lzdGVtICYmICFzdWJzeXN0ZW0pCi0JCXNuZF9wcmludGRkKCJTb3VuZCBjYXJkIG5hbWUgPSAlc1xuIiwgYy0+bmFtZSk7CisJCWRldl9kYmcoY2FyZC0+ZGV2LCAiU291bmQgY2FyZCBuYW1lID0gJXNcbiIsIGMtPm5hbWUpOwogCWVsc2UgaWYgKHN1YnN5c3RlbSkKLQkJc25kX3ByaW50ZGQoIlNvdW5kIGNhcmQgbmFtZSA9ICVzLCAiCisJCWRldl9kYmcoY2FyZC0+ZGV2LCAiU291bmQgY2FyZCBuYW1lID0gJXMsICIKIAkJCSJ2ZW5kb3IgPSAweCV4LCBkZXZpY2UgPSAweCV4LCBzdWJzeXN0ZW0gPSAweCV4LiAiCiAJCQkiRm9yY2VkIHRvIHN1YnN5c3RlbSA9IDB4JXhcbiIsCWMtPm5hbWUsCiAJCQlwY2ktPnZlbmRvciwgcGNpLT5kZXZpY2UsIGVtdS0+c2VyaWFsLCBjLT5zdWJzeXN0ZW0pOwogCWVsc2UKLQkJc25kX3ByaW50ZGQoIlNvdW5kIGNhcmQgbmFtZSA9ICVzLCAiCisJCWRldl9kYmcoY2FyZC0+ZGV2LCAiU291bmQgY2FyZCBuYW1lID0gJXMsICIKIAkJCSJ2ZW5kb3IgPSAweCV4LCBkZXZpY2UgPSAweCV4LCBzdWJzeXN0ZW0gPSAweCV4LlxuIiwKIAkJCWMtPm5hbWUsIHBjaS0+dmVuZG9yLCBwY2ktPmRldmljZSwKIAkJCWVtdS0+c2VyaWFsKTsKQEAgLTE4NjksNyArMTg4NCw5IEBACiAJZW11LT5kbWFfbWFzayA9IGlzX2F1ZGlneSA/IEFVRElHWV9ETUFfTUFTSyA6IEVNVTEwSzFfRE1BX01BU0s7CiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBlbXUtPmRtYV9tYXNrKSA8IDAgfHwKIAkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgZW11LT5kbWFfbWFzaykgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IFBDSSBidXNtYXN0ZXIgRE1BIHdpdGggbWFzayAweCVseFxuIiwgZW11LT5kbWFfbWFzayk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IFBDSSBidXNtYXN0ZXIgRE1BIHdpdGggbWFzayAweCVseFxuIiwKKwkJCWVtdS0+ZG1hX21hc2spOwogCQlrZnJlZShlbXUpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTlhJTzsKQEAgLTIwMjEsNyArMjAzOCw2IEBACiAJc25kX2VtdTEwazFfcHJvY19pbml0KGVtdSk7CiAjZW5kaWYKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKIAkqcmVtdSA9IGVtdTsKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9wYXRjaC5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9wYXRjaC5jCmluZGV4IDY2MmE0NTguLjBlMDY5YWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfcGF0Y2guYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX3BhdGNoLmMKQEAgLTUwLDcgKzUwLDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoc3AtPnYuc2l6ZSA9PSAwKSB7Ci0JCXNuZF9wcmludGQoImVtdTogcm9tIGZvbnQgZm9yIHNhbXBsZSAlZFxuIiwgc3AtPnYuc2FtcGxlKTsKKwkJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKKwkJCSJlbXU6IHJvbSBmb250IGZvciBzYW1wbGUgJWRcbiIsIHNwLT52LnNhbXBsZSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtOTIsNyArOTMsOCBAQAogCQlibG9ja3NpemUgKj0gMjsKIAlzcC0+YmxvY2sgPSBzbmRfZW11MTBrMV9zeW50aF9hbGxvYyhlbXUsIGJsb2Nrc2l6ZSk7CiAJaWYgKHNwLT5ibG9jayA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGQoImVtdTEwazE6IHN5bnRoIG1hbGxvYyBmYWlsZWQgKHNpemU9JWQpXG4iLCBibG9ja3NpemUpOworCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LAorCQkJInN5bnRoIG1hbGxvYyBmYWlsZWQgKHNpemU9JWQpXG4iLCBibG9ja3NpemUpOwogCQkvKiBub3QgRU5PTUVNIChmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE9TUykgKi8KIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMKaW5kZXggNTZhZDlkNi4uZWZlMDE3NSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jCkBAIC0zNjksNyArMzY5LDggQEAKIAlpZiAoZXBjbS0+c3Vic3RyZWFtID09IE5VTEwpCiAJCXJldHVybjsKICNpZiAwCi0Jc25kX3ByaW50ayhLRVJOX0lORk8gIklSUTogcG9zaXRpb24gPSAweCV4LCBwZXJpb2QgPSAweCV4LCBzaXplID0gMHgleFxuIiwKKwlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwKKwkJICJJUlE6IHBvc2l0aW9uID0gMHgleCwgcGVyaW9kID0gMHgleCwgc2l6ZSA9IDB4JXhcbiIsCiAJCSAgIGVwY20tPnN1YnN0cmVhbS0+b3BzLT5wb2ludGVyKGVwY20tPnN1YnN0cmVhbSksCiAJCSAgIHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhlcGNtLT5zdWJzdHJlYW0pLAogCQkgICBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoZXBjbS0+c3Vic3RyZWFtKSk7CkBAIC00ODcsNyArNDg4LDExIEBACiAJaW50IGNoYW5uZWwgPSBlcGNtLT52b2ljZS0+bnVtYmVyOwogCWludCByZXN1bHQgPSAwOwogCi0vLwlzbmRfcHJpbnRrKEtFUk5fSU5GTyAidHJpZ2dlciAtIGVtdTEwazF4ID0gMHgleCwgY21kID0gJWksIHBvaW50ZXIgPSAlZFxuIiwgKGludCllbXUsIGNtZCwgKGludClzdWJzdHJlYW0tPm9wcy0+cG9pbnRlcihzdWJzdHJlYW0pKTsKKwkvKgorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCisJCSJ0cmlnZ2VyIC0gZW11MTBrMXggPSAweCV4LCBjbWQgPSAlaSwgcG9pbnRlciA9ICVkXG4iLAorCQkoaW50KWVtdSwgY21kLCAoaW50KXN1YnN0cmVhbS0+b3BzLT5wb2ludGVyKHN1YnN0cmVhbSkpOworCSovCiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CkBAIC04MjYsNyArODMxLDcgQEAKIAkvLyBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0IGlmIG5lY2Vzc2FyeQogCW91dGwoc3RhdHVzLCBjaGlwLT5wb3J0ICsgSVBSKTsKIAotCS8vIHNuZF9wcmludGsoS0VSTl9JTkZPICJpbnRlcnJ1cHQgJTA4eFxuIiwgc3RhdHVzKTsKKwkvKiBkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImludGVycnVwdCAlMDh4XG4iLCBzdGF0dXMpOyAqLwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtOTE5LDcgKzkyNCw3IEBACiAJCXJldHVybiBlcnI7CiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjgpKSA8IDAgfHwKIAkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDI4KSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHRvIHNldCAyOGJpdCBtYXNrIERNQVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiZXJyb3IgdG8gc2V0IDI4Yml0IG1hc2sgRE1BXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtOTQwLDE0ICs5NDUsMTUgQEAKIAljaGlwLT5wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CiAJaWYgKChjaGlwLT5yZXNfcG9ydCA9IHJlcXVlc3RfcmVnaW9uKGNoaXAtPnBvcnQsIDgsCiAJCQkJCSAgICAgIkVNVTEwSzFYIikpID09IE5VTEwpIHsgCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVtdTEwazF4OiBjYW5ub3QgYWxsb2NhdGUgdGhlIHBvcnQgMHglbHhcbiIsIGNoaXAtPnBvcnQpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSB0aGUgcG9ydCAweCVseFxuIiwKKwkJCWNoaXAtPnBvcnQpOwogCQlzbmRfZW11MTBrMXhfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9lbXUxMGsxeF9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVtdTEwazF4OiBjYW5ub3QgZ3JhYiBpcnEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjYW5ub3QgZ3JhYiBpcnEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2VtdTEwazF4X2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtOTY0LDcgKzk3MCw3IEBACiAJY2hpcC0+cmV2aXNpb24gPSBwY2ktPnJldmlzaW9uOwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2ksIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmY2hpcC0+c2VyaWFsKTsKIAlwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIFBDSV9TVUJTWVNURU1fSUQsICZjaGlwLT5tb2RlbCk7Ci0Jc25kX3ByaW50ayhLRVJOX0lORk8gIk1vZGVsICUwNHggUmV2ICUwOHggU2VyaWFsICUwOHhcbiIsIGNoaXAtPm1vZGVsLAorCWRldl9pbmZvKGNhcmQtPmRldiwgIk1vZGVsICUwNHggUmV2ICUwOHggU2VyaWFsICUwOHhcbiIsIGNoaXAtPm1vZGVsLAogCQkgICBjaGlwLT5yZXZpc2lvbiwgY2hpcC0+c2VyaWFsKTsKIAogCW91dGwoMCwgY2hpcC0+cG9ydCArIElOVEUpOwkKQEAgLTEyNDgsNyArMTI1NCw5IEBACiAJCW1wdTQwMV9yZWFkX2RhdGEoZW11LCBtcHUpOwogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKIAlpZiAodGltZW91dCA8PSAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjbWQ6IGNsZWFyIHJ4IHRpbWVvdXQgKHN0YXR1cyA9IDB4JXgpXG4iLCBtcHU0MDFfcmVhZF9zdGF0KGVtdSwgbXB1KSk7CisJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsCisJCQkiY21kOiBjbGVhciByeCB0aW1lb3V0IChzdGF0dXMgPSAweCV4KVxuIiwKKwkJCW1wdTQwMV9yZWFkX3N0YXQoZW11LCBtcHUpKTsKICNlbmRpZgogfQogCkBAIC0xMzIyLDcgKzEzMzAsOCBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpLT5pbnB1dF9sb2NrLCBmbGFncyk7CiAJaWYgKCFvaykgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJtaWRpX2NtZDogMHgleCBmYWlsZWQgYXQgMHglbHggKHN0YXR1cyA9IDB4JXgsIGRhdGEgPSAweCV4KSEhIVxuIiwKKwkJZGV2X2VycihlbXUtPmNhcmQtPmRldiwKKwkJCSJtaWRpX2NtZDogMHgleCBmYWlsZWQgYXQgMHglbHggKHN0YXR1cyA9IDB4JXgsIGRhdGEgPSAweCV4KSEhIVxuIiwKIAkJCSAgIGNtZCwgZW11LT5wb3J0LAogCQkJICAgbXB1NDAxX3JlYWRfc3RhdChlbXUsIG1pZGkpLAogCQkJICAgbXB1NDAxX3JlYWRfZGF0YShlbXUsIG1pZGkpKTsKQEAgLTE1NjQsNyArMTU3Myw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xNjA4LDggKzE2MTgsNiBAQAogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseCBpcnEgJWkiLAogCQljYXJkLT5zaG9ydG5hbWUsIGNoaXAtPnBvcnQsIGNoaXAtPmlycSk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdWZ4LmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVmeC5jCmluZGV4IDFmOWM3YzQuLjc0NWYwNjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdWZ4LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11ZnguYwpAQCAtMTU0Nyw3ICsxNTQ3LDcgQEAKIAkvKiBBX1BVVF9TVEVSRU9fT1VUUFVUKEFfRVhUT1VUX0ZST05UX0wsIEFfRVhUT1VUX0ZST05UX1IsIHBsYXliYWNrICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMpOyAqLwogCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXVfbW9kZWwpIHsKIAkJLyogRU1VMTAxMCBPdXRwdXRzIGZyb20gUENNIEZyb250LCBSZWFyLCBDZW50ZXIsIExGRSwgU2lkZSAqLwotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiRU1VIG91dHB1dHMgb25cbiIpOworCQlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwgIkVNVSBvdXRwdXRzIG9uXG4iKTsKIAkJZm9yICh6ID0gMDsgeiA8IDg7IHorKykgewogCQkJaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmNhMDEwOF9jaGlwKSB7CiAJCQkJQV9PUChpY29kZSwgJnB0ciwgaUFDQzMsIEEzX0VNVTMyT1VUKHopLCBBX0dQUihwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICsgeiksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsKQEAgLTE1NzEsNyArMTU3MSw5IEBACiAJCUFfU1dJVENIKGljb2RlLCAmcHRyLCB0bXAgKyAxLCBwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICsgeiwgdG1wICsgMSk7CiAJCWlmICgoej09MSkgJiYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPnNwZGlmX2J1ZykpIHsKIAkJCS8qIER1ZSB0byBhIFNQRElGIG91dHB1dCBidWcgb24gc29tZSBBdWRpZ3kgY2FyZHMsIHRoaXMgY29kZSBkZWxheXMgdGhlIFJpZ2h0IGNoYW5uZWwgYnkgMSBzYW1wbGUgKi8KLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJJbnN0YWxsaW5nIHNwZGlmX2J1ZyBwYXRjaDogJXNcbiIsIGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPm5hbWUpOworCQkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsCisJCQkJICJJbnN0YWxsaW5nIHNwZGlmX2J1ZyBwYXRjaDogJXNcbiIsCisJCQkJIGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPm5hbWUpOwogCQkJQV9PUChpY29kZSwgJnB0ciwgaUFDQzMsIEFfRVhUT1VUKEFfRVhUT1VUX0ZST05UX0wgKyB6KSwgQV9HUFIoZ3ByIC0gMyksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsKIAkJCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0dQUihncHIgLSAzKSwgQV9HUFIodG1wICsgMCksIEFfR1BSKHRtcCArIDEpLCBBX0NfMDAwMDAwMDApOwogCQl9IGVsc2UgewpAQCAtMTU5NSw3ICsxNTk3LDcgQEAKIAogCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXVfbW9kZWwpIHsKIAkJaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmNhMDEwOF9jaGlwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiRU1VMiBpbnB1dHMgb25cbiIpOworCQkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsICJFTVUyIGlucHV0cyBvblxuIik7CiAJCQlmb3IgKHogPSAwOyB6IDwgMHgxMDsgeisrKSB7CiAJCQkJc25kX2VtdTEwazFfYXVkaWd5X2RzcF9jb252ZXJ0XzMyX3RvXzJ4MTYoIGljb2RlLCAmcHRyLCB0bXAsIAogCQkJCQkJCQkJYml0X3NoaWZ0ZXIxNiwKQEAgLTE2MDMsMTEgKzE2MDUsMTEgQEAKIAkJCQkJCQkJCUFfRlhCVVMyKHoqMikgKTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJFTVUgaW5wdXRzIG9uXG4iKTsKKwkJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiRU1VIGlucHV0cyBvblxuIik7CiAJCQkvKiBDYXB0dXJlIDE2IChvcmlnaW5hbGx5IDgpIGNoYW5uZWxzIG9mIFMzMl9MRSBzb3VuZCAqLwogCiAJCQkvKgotCQkJcHJpbnRrKEtFUk5fREVCVUcgImVtdWZ4LmM6IGdwcj0weCV4LCB0bXA9MHgleFxuIiwKKwkJCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJlbXVmeC5jOiBncHI9MHgleCwgdG1wPTB4JXhcbiIsCiAJCQkgICAgICAgZ3ByLCB0bXApOwogCQkJKi8KIAkJCS8qIEZvciB0aGUgRU1VMTAxMDogSG93IHRvIGdldCAzMmJpdCB2YWx1ZXMgZnJvbSB0aGUgRFNQLiBIaWdoIDE2Yml0cyBpbnRvIEwsIGxvdyAxNmJpdHMgaW50byBSLiAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11bWl4ZXIuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdW1peGVyLmMKaW5kZXggZjZjM2RhMC4uYzVhZTJhMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11bWl4ZXIuYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVtaXhlci5jCkBAIC0xODUzLDggKzE4NTMsMTAgQEAKIAkJaWYgKChlcnIgPSBzbmRfYWM5N19taXhlcihwYnVzLCAmYWM5NywgJmVtdS0+YWM5NykpIDwgMCkgewogCQkJaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmFjOTdfY2hpcCA9PSAxKQogCQkJCXJldHVybiBlcnI7Ci0JCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiZW11MTBrMTogQUM5NyBpcyBvcHRpb25hbCBvbiB0aGlzIGJvYXJkXG4iKTsKLQkJCXNuZF9wcmludGQoS0VSTl9JTkZPIiAgICAgICAgICBQcm9jZWVkaW5nIHdpdGhvdXQgYWM5NyBtaXhlcnMuLi5cbiIpOworCQkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsCisJCQkJICJBQzk3IGlzIG9wdGlvbmFsIG9uIHRoaXMgYm9hcmRcbiIpOworCQkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsCisJCQkJICJQcm9jZWVkaW5nIHdpdGhvdXQgYWM5NyBtaXhlcnMuLi5cbiIpOwogCQkJc25kX2RldmljZV9mcmVlKGVtdS0+Y2FyZCwgcGJ1cyk7CiAJCQlnb3RvIG5vX2FjOTc7IC8qIEZJWE1FOiBnZXQgcmlkIG9mIHVnbHkgZ290b3MuLiAqLwogCQl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVtcHU0MDEuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdW1wdTQwMS5jCmluZGV4IDFlYzkxMjQuLmZkZjJiMGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdW1wdTQwMS5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdW1wdTQwMS5jCkBAIC02NCw3ICs2NCw5IEBACiAJCW1wdTQwMV9yZWFkX2RhdGEoZW11LCBtcHUpOwogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKIAlpZiAodGltZW91dCA8PSAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjbWQ6IGNsZWFyIHJ4IHRpbWVvdXQgKHN0YXR1cyA9IDB4JXgpXG4iLCBtcHU0MDFfcmVhZF9zdGF0KGVtdSwgbXB1KSk7CisJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsCisJCQkiY21kOiBjbGVhciByeCB0aW1lb3V0IChzdGF0dXMgPSAweCV4KVxuIiwKKwkJCW1wdTQwMV9yZWFkX3N0YXQoZW11LCBtcHUpKTsKICNlbmRpZgogfQogCkBAIC0xNDEsNyArMTQzLDggQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaS0+aW5wdXRfbG9jaywgZmxhZ3MpOwogCWlmICghb2spIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWlkaV9jbWQ6IDB4JXggZmFpbGVkIGF0IDB4JWx4IChzdGF0dXMgPSAweCV4LCBkYXRhID0gMHgleCkhISFcbiIsCisJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsCisJCQkibWlkaV9jbWQ6IDB4JXggZmFpbGVkIGF0IDB4JWx4IChzdGF0dXMgPSAweCV4LCBkYXRhID0gMHgleCkhISFcbiIsCiAJCQkgICBjbWQsIGVtdS0+cG9ydCwKIAkJCSAgIG1wdTQwMV9yZWFkX3N0YXQoZW11LCBtaWRpKSwKIAkJCSAgIG1wdTQwMV9yZWFkX2RhdGEoZW11LCBtaWRpKSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVwY20uYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCmluZGV4IDVhZTFkMDQuLmY4MjQ4MWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCkBAIC00NCw3ICs0NCw4IEBACiAJaWYgKGVwY20tPnN1YnN0cmVhbSA9PSBOVUxMKQogCQlyZXR1cm47CiAjaWYgMAotCXByaW50ayhLRVJOX0RFQlVHICJJUlE6IHBvc2l0aW9uID0gMHgleCwgcGVyaW9kID0gMHgleCwgc2l6ZSA9IDB4JXhcbiIsCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKKwkJIklSUTogcG9zaXRpb24gPSAweCV4LCBwZXJpb2QgPSAweCV4LCBzaXplID0gMHgleFxuIiwKIAkJCWVwY20tPnN1YnN0cmVhbS0+cnVudGltZS0+aHctPnBvaW50ZXIoZW11LCBlcGNtLT5zdWJzdHJlYW0pLAogCQkJc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKGVwY20tPnN1YnN0cmVhbSksCiAJCQlzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoZXBjbS0+c3Vic3RyZWFtKSk7CkBAIC0xNDcsNyArMTQ4LDcgQEAKIAkJCQkJICAgICAgJmVwY20tPmV4dHJhKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCS8qCi0JCQlwcmludGsoS0VSTl9ERUJVRyAicGNtX2NoYW5uZWxfYWxsb2M6ICIKKwkJCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJwY21fY2hhbm5lbF9hbGxvYzogIgogCQkJICAgICAgICJmYWlsZWQgZXh0cmE6IHZvaWNlcz0lZCwgZnJhbWU9JWRcbiIsCiAJCQkgICAgICAgdm9pY2VzLCBmcmFtZSk7CiAJCQkqLwpAQCAtNzYxLDcgKzc2Miw4IEBACiAJaW50IHJlc3VsdCA9IDA7CiAKIAkvKgotCXByaW50ayhLRVJOX0RFQlVHICJ0cmlnZ2VyIC0gZW11MTBrMSA9IDB4JXgsIGNtZCA9ICVpLCBwb2ludGVyID0gJWlcbiIsCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKKwkJInRyaWdnZXIgLSBlbXUxMGsxID0gMHgleCwgY21kID0gJWksIHBvaW50ZXIgPSAlaVxuIiwKIAkgICAgICAgKGludCllbXUsIGNtZCwgc3Vic3RyZWFtLT5vcHMtPnBvaW50ZXIoc3Vic3RyZWFtKSkKIAkqLwogCXNwaW5fbG9jaygmZW11LT5yZWdfbG9jayk7CkBAIC04MTUsNyArODE3LDcgQEAKIAkJb3V0bChlcGNtLT5jYXB0dXJlX2lwciwgZW11LT5wb3J0ICsgSVBSKTsKIAkJc25kX2VtdTEwazFfaW50cl9lbmFibGUoZW11LCBlcGNtLT5jYXB0dXJlX2ludGUpOwogCQkvKgotCQlwcmludGsoS0VSTl9ERUJVRyAiYWRjY3IgPSAweCV4LCBhZGNicyA9IDB4JXhcbiIsCisJCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJhZGNjciA9IDB4JXgsIGFkY2JzID0gMHgleFxuIiwKIAkJICAgICAgIGVwY20tPmFkY2NyLCBlcGNtLT5hZGNicyk7CiAJCSovCiAJCXN3aXRjaCAoZXBjbS0+dHlwZSkgewpAQCAtODI2LDcgKzgyOCwxMCBAQAogCQkJaWYgKGVtdS0+YXVkaWd5KSB7CiAJCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQV9GWFdDMSwgMCwgZXBjbS0+Y2FwdHVyZV9jcl92YWwpOwogCQkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfRlhXQzIsIDAsIGVwY20tPmNhcHR1cmVfY3JfdmFsMik7Ci0JCQkJc25kX3ByaW50ZGQoImNyX3ZhbD0weCV4LCBjcl92YWwyPTB4JXhcbiIsIGVwY20tPmNhcHR1cmVfY3JfdmFsLCBlcGNtLT5jYXB0dXJlX2NyX3ZhbDIpOworCQkJCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCisJCQkJCSJjcl92YWw9MHgleCwgY3JfdmFsMj0weCV4XG4iLAorCQkJCQllcGNtLT5jYXB0dXJlX2NyX3ZhbCwKKwkJCQkJZXBjbS0+Y2FwdHVyZV9jcl92YWwyKTsKIAkJCX0gZWxzZQogCQkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEZYV0MsIDAsIGVwY20tPmNhcHR1cmVfY3JfdmFsKTsKIAkJCWJyZWFrOwpAQCAtODg5LDcgKzg5NCw3IEBACiAJfQogI2VuZGlmCiAJLyoKLQlwcmludGsoS0VSTl9ERUJVRworCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCiAJICAgICAgICJwdHIgPSAweCVseCwgYnVmZmVyX3NpemUgPSAweCVseCwgcGVyaW9kX3NpemUgPSAweCVseFxuIiwKIAkgICAgICAgKGxvbmcpcHRyLCAobG9uZylydW50aW1lLT5idWZmZXJfc2l6ZSwKIAkgICAgICAgKGxvbmcpcnVudGltZS0+cGVyaW9kX3NpemUpOwpAQCAtMTU5NCw3ICsxNTk5LDggQEAKIAkJCQkJCSAgIHVuc2lnbmVkIGludCB0cmFtX3NoaWZ0KQogewogCS8qCi0JcHJpbnRrKEtFUk5fREVCVUcgInRyYW1fcG9rZTE6IGRzdF9sZWZ0ID0gMHglcCwgZHN0X3JpZ2h0ID0gMHglcCwgIgorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCisJCSJ0cmFtX3Bva2UxOiBkc3RfbGVmdCA9IDB4JXAsIGRzdF9yaWdodCA9IDB4JXAsICIKIAkgICAgICAgInNyYyA9IDB4JXAsIGNvdW50ID0gMHgleFxuIiwKIAkgICAgICAgZHN0X2xlZnQsIGRzdF9yaWdodCwgc3JjLCBjb3VudCk7CiAJKi8KQEAgLTE2NzUsNyArMTY4MSw3IEBACiAJdW5zaWduZWQgaW50IGk7CiAJCiAJLyoKLQlwcmludGsoS0VSTl9ERUJVRyAicHJlcGFyZTogZXRyYW1fcGFnZXMgPSAweCVwLCBkbWFfYXJlYSA9IDB4JXgsICIKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAicHJlcGFyZTogZXRyYW1fcGFnZXMgPSAweCVwLCBkbWFfYXJlYSA9IDB4JXgsICIKIAkgICAgICAgImJ1ZmZlcl9zaXplID0gMHgleCAoMHgleClcbiIsCiAJICAgICAgIGVtdS0+Zng4MDEwLmV0cmFtX3BhZ2VzLCBydW50aW1lLT5kbWFfYXJlYSwKIAkgICAgICAgcnVudGltZS0+YnVmZmVyX3NpemUsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplIDw8IDIpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvaW8uYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2lvLmMKaW5kZXggZTRmYmE0OS4uNzA2YjRmMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvaW8uYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9pby5jCkBAIC03MSwxMSArNzEsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IG1hc2s7CiAKLQlpZiAoIWVtdSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwdHJfd3JpdGU6IGVtdSBpcyBudWxsIVxuIik7Ci0JCWR1bXBfc3RhY2soKTsKKwlpZiAoc25kX0JVR19PTighZW11KSkKIAkJcmV0dXJuOwotCX0KIAltYXNrID0gZW11LT5hdWRpZ3kgPyBBX1BUUl9BRERSRVNTX01BU0sgOiBQVFJfQUREUkVTU19NQVNLOwogCXJlZ3B0ciA9ICgocmVnIDw8IDE2KSAmIG1hc2spIHwgKGNobiAmIFBUUl9DSEFOTkVMTlVNX01BU0spOwogCkBAIC0xOTksNyArMTk2LDcgQEAKIAlpbnQgZXJyID0gMDsKIAogCWlmICgocmVnID4gMHg3ZikgfHwgKHZhbHVlID4gMHgxZmYpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImkyY193cml0ZTogaW52YWxpZCB2YWx1ZXMuXG4iKTsKKwkJZGV2X2VycihlbXUtPmNhcmQtPmRldiwgImkyY193cml0ZTogaW52YWxpZCB2YWx1ZXMuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMjcsNyArMjI0LDcgQEAKIAkJCQlicmVhazsKIAogCQkJaWYgKHRpbWVvdXQgPiAxMDAwKSB7Ci0gICAgICAgICAgICAgICAgCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORworCQkJCWRldl93YXJuKGVtdS0+Y2FyZC0+ZGV2LAogCQkJCQkgICAiZW11MTBrMTpJMkM6dGltZW91dCBzdGF0dXM9MHgleFxuIiwKIAkJCQkJICAgc3RhdHVzKTsKIAkJCQlicmVhazsKQEAgLTIzOSw4ICsyMzYsOCBAQAogCX0KIAogCWlmIChyZXRyeSA9PSAxMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJXcml0aW5nIHRvIEFEQyBmYWlsZWQhXG4iKTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic3RhdHVzPTB4JXgsIHJlZz0lZCwgdmFsdWU9JWRcbiIsCisJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsICJXcml0aW5nIHRvIEFEQyBmYWlsZWQhXG4iKTsKKwkJZGV2X2VycihlbXUtPmNhcmQtPmRldiwgInN0YXR1cz0weCV4LCByZWc9JWQsIHZhbHVlPSVkXG4iLAogCQkJc3RhdHVzLCByZWcsIHZhbHVlKTsKIAkJLyogZHVtcF9zdGFjaygpOyAqLwogCQllcnIgPSAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvaXJxLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9pcnEuYwppbmRleCAzMGJmZWQ2Li4zYzVjNWUzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9pcnEuYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9pcnEuYwpAQCAtNDEsMTEgKzQxLDEyIEBACiAJCW9yaWdfc3RhdHVzID0gc3RhdHVzOwogCQloYW5kbGVkID0gMTsKIAkJaWYgKChzdGF0dXMgJiAweGZmZmZmZmZmKSA9PSAweGZmZmZmZmZmKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAic25kLWVtdTEwazE6IFN1c3BlY3RlZCBzb3VuZCBjYXJkIHJlbW92YWxcbiIpOworCQkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsCisJCQkJICJTdXNwZWN0ZWQgc291bmQgY2FyZCByZW1vdmFsXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCWlmIChzdGF0dXMgJiBJUFJfUENJRVJST1IpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImludGVycnVwdDogUENJIGVycm9yXG4iKTsKKwkJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsICJpbnRlcnJ1cHQ6IFBDSSBlcnJvclxuIik7CiAJCQlzbmRfZW11MTBrMV9pbnRyX2Rpc2FibGUoZW11LCBJTlRFX1BDSUVSUk9SRU5BQkxFKTsKIAkJCXN0YXR1cyAmPSB+SVBSX1BDSUVSUk9SOwogCQl9CkBAIC0xNTcsMTkgKzE1OCwyMiBAQAogCQkJCXN0cnVjdCBzbmRfZW11MTBrMV92b2ljZSAqcHZvaWNlID0gJihlbXUtPnAxNnZfdm9pY2VzWzBdKTsKIAkJCQlzdHJ1Y3Qgc25kX2VtdTEwazFfdm9pY2UgKmN2b2ljZSA9ICYoZW11LT5wMTZ2X2NhcHR1cmVfdm9pY2UpOwogCi0JCQkJLy9wcmludGsoS0VSTl9JTkZPICJzdGF0dXMyPTB4JXhcbiIsIHN0YXR1czIpOworCQkJCS8qIGRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJzdGF0dXMyPTB4JXhcbiIsIHN0YXR1czIpOyAqLwogCQkJCW9yaWdfc3RhdHVzMiA9IHN0YXR1czI7CiAJCQkJaWYoc3RhdHVzMiAmIG1hc2spIHsKIAkJCQkJaWYocHZvaWNlLT51c2UpIHsKIAkJCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocHZvaWNlLT5lcGNtLT5zdWJzdHJlYW0pOwogCQkJCQl9IGVsc2UgeyAKLQkJCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInAxNnY6IHN0YXR1czogMHglMDh4LCBtYXNrPTB4JTA4eCwgcHZvaWNlPSVwLCB1c2U9JWRcbiIsIHN0YXR1czIsIG1hc2ssIHB2b2ljZSwgcHZvaWNlLT51c2UpOworCQkJCQkJZGV2X2VycihlbXUtPmNhcmQtPmRldiwKKwkJCQkJCQkicDE2djogc3RhdHVzOiAweCUwOHgsIG1hc2s9MHglMDh4LCBwdm9pY2U9JXAsIHVzZT0lZFxuIiwKKwkJCQkJCQlzdGF0dXMyLCBtYXNrLCBwdm9pY2UsCisJCQkJCQkJcHZvaWNlLT51c2UpOwogCQkJCQl9CiAJCQkJfQogCQkJCWlmKHN0YXR1czIgJiAweDExMDAwMCkgewotCQkJCQkvL3ByaW50ayhLRVJOX0lORk8gImNhcHR1cmUgaW50IGZvdW5kXG4iKTsKKwkJCQkJLyogZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsICJjYXB0dXJlIGludCBmb3VuZFxuIik7ICovCiAJCQkJCWlmKGN2b2ljZS0+dXNlKSB7Ci0JCQkJCQkvL3ByaW50ayhLRVJOX0lORk8gImNhcHR1cmUgcGVyaW9kX2VsYXBzZWRcbiIpOworCQkJCQkJLyogZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsICJjYXB0dXJlIHBlcmlvZF9lbGFwc2VkXG4iKTsgKi8KIAkJCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY3ZvaWNlLT5lcGNtLT5zdWJzdHJlYW0pOwogCQkJCQl9CiAJCQkJfQpAQCAtMTgwLDcgKzE4NCw4IEBACiAKIAkJaWYgKHN0YXR1cykgewogCQkJdW5zaWduZWQgaW50IGJpdHM7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiB1bmhhbmRsZWQgaW50ZXJydXB0OiAweCUwOHhcbiIsIHN0YXR1cyk7CisJCQlkZXZfZXJyKGVtdS0+Y2FyZC0+ZGV2LAorCQkJCSJ1bmhhbmRsZWQgaW50ZXJydXB0OiAweCUwOHhcbiIsIHN0YXR1cyk7CiAJCQkvL21ha2Ugc3VyZSBhbnkgaW50ZXJydXB0cyB3ZSBkb24ndCBoYW5kbGUgYXJlIGRpc2FibGVkOgogCQkJYml0cyA9IElOVEVfRlhEU1BFTkFCTEUgfAogCQkJCUlOVEVfUENJRVJST1JFTkFCTEUgfApAQCAtMjAyLDcgKzIwNyw3IEBACiAJCW91dGwob3JpZ19zdGF0dXMsIGVtdS0+cG9ydCArIElQUik7IC8qIGFjayBhbGwgKi8KIAl9CiAJaWYgKHRpbWVvdXQgPT0gMTAwMCkKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwazEgaXJxIHJvdXRpbmUgZmFpbHVyZVxuIik7CisJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiZW11MTBrMSBpcnEgcm91dGluZSBmYWlsdXJlXG4iKTsKIAogCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvbWVtb3J5LmMgYi9zb3VuZC9wY2kvZW11MTBrMS9tZW1vcnkuYwppbmRleCBhZTcwOWMxLi5jNjhlNmRkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9tZW1vcnkuYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9tZW1vcnkuYwpAQCAtMjM2LDExICsyMzYsMTMgQEAKIHN0YXRpYyBpbnQgaXNfdmFsaWRfcGFnZShzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSwgZG1hX2FkZHJfdCBhZGRyKQogewogCWlmIChhZGRyICYgfmVtdS0+ZG1hX21hc2spIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWF4IG1lbW9yeSBzaXplIGlzIDB4JWx4IChhZGRyID0gMHglbHgpISFcbiIsIGVtdS0+ZG1hX21hc2ssICh1bnNpZ25lZCBsb25nKWFkZHIpOworCQlkZXZfZXJyKGVtdS0+Y2FyZC0+ZGV2LAorCQkJIm1heCBtZW1vcnkgc2l6ZSBpcyAweCVseCAoYWRkciA9IDB4JWx4KSEhXG4iLAorCQkJZW11LT5kbWFfbWFzaywgKHVuc2lnbmVkIGxvbmcpYWRkcik7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoYWRkciAmIChFTVVQQUdFU0laRS0xKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwYWdlIGlzIG5vdCBhbGlnbmVkXG4iKTsKKwkJZGV2X2VycihlbXUtPmNhcmQtPmRldiwgInBhZ2UgaXMgbm90IGFsaWduZWRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIDE7CkBAIC0zMzEsNyArMzMzLDggQEAKIAkJZWxzZQogCQkJYWRkciA9IHNuZF9wY21fc2didWZfZ2V0X2FkZHIoc3Vic3RyZWFtLCBvZnMpOwogCQlpZiAoISBpc192YWxpZF9wYWdlKGVtdSwgYWRkcikpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZW11OiBmYWlsdXJlIHBhZ2UgPSAlZFxuIiwgaWR4KTsKKwkJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsCisJCQkJImVtdTogZmFpbHVyZSBwYWdlID0gJWRcbiIsIGlkeCk7CiAJCQltdXRleF91bmxvY2soJmhkci0+YmxvY2tfbXV0ZXgpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KQEAgLTUwNyw3ICs1MTAsOCBAQAogCQlyZXR1cm4gTlVMTDsKIAlwdHIgPSBlbXUtPnBhZ2VfcHRyX3RhYmxlW3BhZ2VdOwogCWlmICghIHB0cikgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGFjY2VzcyB0byBOVUxMIHB0cjogcGFnZSA9ICVkXG4iLCBwYWdlKTsKKwkJZGV2X2VycihlbXUtPmNhcmQtPmRldiwKKwkJCSJhY2Nlc3MgdG8gTlVMTCBwdHI6IHBhZ2UgPSAlZFxuIiwgcGFnZSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlwdHIgKz0gb2Zmc2V0ICYgKFBBR0VfU0laRSAtIDEpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvcDE2di5jIGIvc291bmQvcGNpL2VtdTEwazEvcDE2di5jCmluZGV4IDdlMjAyNWMuLmE0ZmU3ZjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL3AxNnYuYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9wMTZ2LmMKQEAgLTE2OCw3ICsxNjgsNyBAQAogCXN0cnVjdCBzbmRfZW11MTBrMV9wY20gKmVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CiAgIAogCWlmIChlcGNtKSB7Ci0gICAgICAgIAkvKiBzbmRfcHJpbnRrKEtFUk5fREVCVUcgImVwY20gZnJlZTogJXBcbiIsIGVwY20pOyAqLworCQkvKiBkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiZXBjbSBmcmVlOiAlcFxuIiwgZXBjbSk7ICovCiAJCWtmcmVlKGVwY20pOwogCX0KIH0KQEAgLTE4MywxNCArMTgzLDE0IEBACiAJaW50IGVycjsKIAogCWVwY20gPSBremFsbG9jKHNpemVvZigqZXBjbSksIEdGUF9LRVJORUwpOwotICAgICAgICAvKiBzbmRfcHJpbnRrKEtFUk5fREVCVUcgImVwY20ga2NhbGxvYzogJXBcbiIsIGVwY20pOyAqLworCS8qIGRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJlcGNtIGtjYWxsb2M6ICVwXG4iLCBlcGNtKTsgKi8KIAogCWlmIChlcGNtID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCWVwY20tPmVtdSA9IGVtdTsKIAllcGNtLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CiAJLyoKLQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImVwY20gZGV2aWNlPSVkLCBjaGFubmVsX2lkPSVkXG4iLAorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJlcGNtIGRldmljZT0lZCwgY2hhbm5lbF9pZD0lZFxuIiwKIAkJICAgc3Vic3RyZWFtLT5wY20tPmRldmljZSwgY2hhbm5lbF9pZCk7CiAJKi8KIAlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBlcGNtOwpAQCAtMjAzLDEwICsyMDMsMTAgQEAKIAogICAgICAgICBjaGFubmVsLT51c2U9MTsKICNpZiAwIC8qIGRlYnVnICovCi0Jc25kX3ByaW50ayhLRVJOX0RFQlVHCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKIAkJICAgInAxNnY6IG9wZW4gY2hhbm5lbF9pZD0lZCwgY2hhbm5lbD0lcCwgdXNlPTB4JXhcbiIsCiAJCSAgIGNoYW5uZWxfaWQsIGNoYW5uZWwsIGNoYW5uZWwtPnVzZSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIm9wZW46Y2hhbm5lbF9pZD0lZCwgY2hpcD0lcCwgY2hhbm5lbD0lcFxuIiwKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAib3BlbjpjaGFubmVsX2lkPSVkLCBjaGlwPSVwLCBjaGFubmVsPSVwXG4iLAogCSAgICAgICBjaGFubmVsX2lkLCBjaGlwLCBjaGFubmVsKTsKICNlbmRpZiAvKiBkZWJ1ZyAqLwogCS8qIGNoYW5uZWwtPmludGVycnVwdCA9IHNuZF9wMTZ2X3BjbV9jaGFubmVsX2ludGVycnVwdDsgKi8KQEAgLTIzMSwxNCArMjMxLDE0IEBACiAJaW50IGVycjsKIAogCWVwY20gPSBremFsbG9jKHNpemVvZigqZXBjbSksIEdGUF9LRVJORUwpOwotCS8qIHNuZF9wcmludGsoS0VSTl9ERUJVRyAiZXBjbSBrY2FsbG9jOiAlcFxuIiwgZXBjbSk7ICovCisJLyogZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgImVwY20ga2NhbGxvYzogJXBcbiIsIGVwY20pOyAqLwogCiAJaWYgKGVwY20gPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJZXBjbS0+ZW11ID0gZW11OwogCWVwY20tPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKIAkvKgotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiZXBjbSBkZXZpY2U9JWQsIGNoYW5uZWxfaWQ9JWRcbiIsCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgImVwY20gZGV2aWNlPSVkLCBjaGFubmVsX2lkPSVkXG4iLAogCQkgICBzdWJzdHJlYW0tPnBjbS0+ZGV2aWNlLCBjaGFubmVsX2lkKTsKIAkqLwogCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IGVwY207CkBAIC0yNTEsMTAgKzI1MSwxMCBAQAogCiAJY2hhbm5lbC0+dXNlPTE7CiAjaWYgMCAvKiBkZWJ1ZyAqLwotCXNuZF9wcmludGsoS0VSTl9ERUJVRworCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCiAJCSAgICJwMTZ2OiBvcGVuIGNoYW5uZWxfaWQ9JWQsIGNoYW5uZWw9JXAsIHVzZT0weCV4XG4iLAogCQkgICBjaGFubmVsX2lkLCBjaGFubmVsLCBjaGFubmVsLT51c2UpOwotCXByaW50ayhLRVJOX0RFQlVHICJvcGVuOmNoYW5uZWxfaWQ9JWQsIGNoaXA9JXAsIGNoYW5uZWw9JXBcbiIsCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgIm9wZW46Y2hhbm5lbF9pZD0lZCwgY2hpcD0lcCwgY2hhbm5lbD0lcFxuIiwKIAkgICAgICAgY2hhbm5lbF9pZCwgY2hpcCwgY2hhbm5lbCk7CiAjZW5kaWYgLyogZGVidWcgKi8KIAkvKiBjaGFubmVsLT5pbnRlcnJ1cHQgPSBzbmRfcDE2dl9wY21fY2hhbm5lbF9pbnRlcnJ1cHQ7ICovCkBAIC0zNDksMTUgKzM0OSwxOCBAQAogCXUzMiB0bXA7CiAJCiAjaWYgMCAvKiBkZWJ1ZyAqLwotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAicHJlcGFyZTpjaGFubmVsX251bWJlcj0lZCwgcmF0ZT0lZCwgIgorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCisJCSJwcmVwYXJlOmNoYW5uZWxfbnVtYmVyPSVkLCByYXRlPSVkLCAiCiAJCSAgICJmb3JtYXQ9MHgleCwgY2hhbm5lbHM9JWQsIGJ1ZmZlcl9zaXplPSVsZCwgIgogCQkgICAicGVyaW9kX3NpemU9JWxkLCBwZXJpb2RzPSV1LCBmcmFtZXNfdG9fYnl0ZXM9JWRcbiIsCiAJCSAgIGNoYW5uZWwsIHJ1bnRpbWUtPnJhdGUsIHJ1bnRpbWUtPmZvcm1hdCwgcnVudGltZS0+Y2hhbm5lbHMsCiAJCSAgIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplLCBydW50aW1lLT5wZXJpb2Rfc2l6ZSwKIAkJICAgcnVudGltZS0+cGVyaW9kcywgZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIDEpKTsKLQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImRtYV9hZGRyPSV4LCBkbWFfYXJlYT0lcCwgdGFibGVfYmFzZT0lcFxuIiwKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LAorCQkiZG1hX2FkZHI9JXgsIGRtYV9hcmVhPSVwLCB0YWJsZV9iYXNlPSVwXG4iLAogCQkgICBydW50aW1lLT5kbWFfYWRkciwgcnVudGltZS0+ZG1hX2FyZWEsIHRhYmxlX2Jhc2UpOwotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiZG1hX2FkZHI9JXgsIGRtYV9hcmVhPSVwLCBkbWFfYnl0ZXMoc2l6ZSk9JXhcbiIsCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKKwkJImRtYV9hZGRyPSV4LCBkbWFfYXJlYT0lcCwgZG1hX2J5dGVzKHNpemUpPSV4XG4iLAogCQkgICBlbXUtPnAxNnZfYnVmZmVyLmFkZHIsIGVtdS0+cDE2dl9idWZmZXIuYXJlYSwKIAkJICAgZW11LT5wMTZ2X2J1ZmZlci5ieXRlcyk7CiAjZW5kaWYgLyogZGVidWcgKi8KQEAgLTQwNSw3ICs0MDgsNyBAQAogCXUzMiB0bXA7CiAKIAkvKgotCXByaW50ayhLRVJOX0RFQlVHICJwcmVwYXJlIGNhcHR1cmU6Y2hhbm5lbF9udW1iZXI9JWQsIHJhdGU9JWQsICIKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAicHJlcGFyZSBjYXB0dXJlOmNoYW5uZWxfbnVtYmVyPSVkLCByYXRlPSVkLCAiCiAJICAgICAgICJmb3JtYXQ9MHgleCwgY2hhbm5lbHM9JWQsIGJ1ZmZlcl9zaXplPSVsZCwgcGVyaW9kX3NpemU9JWxkLCAiCiAJICAgICAgICJmcmFtZXNfdG9fYnl0ZXM9JWRcbiIsCiAJICAgICAgIGNoYW5uZWwsIHJ1bnRpbWUtPnJhdGUsIHJ1bnRpbWUtPmZvcm1hdCwgcnVudGltZS0+Y2hhbm5lbHMsCkBAIC00OTEsMTMgKzQ5NCwxMyBAQAogCQlydW50aW1lID0gcy0+cnVudGltZTsKIAkJZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAkJY2hhbm5lbCA9IHN1YnN0cmVhbS0+cGNtLT5kZXZpY2UtZW11LT5wMTZ2X2RldmljZV9vZmZzZXQ7Ci0JCS8qIHNuZF9wcmludGsoS0VSTl9ERUJVRyAicDE2diBjaGFubmVsPSVkXG4iLCBjaGFubmVsKTsgKi8KKwkJLyogZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgInAxNnYgY2hhbm5lbD0lZFxuIiwgY2hhbm5lbCk7ICovCiAJCWVwY20tPnJ1bm5pbmcgPSBydW5uaW5nOwogCQliYXNpYyB8PSAoMHgxPDxjaGFubmVsKTsKIAkJaW50ZSB8PSAoSU5URTJfUExBWUJBQ0tfQ0hfMF9MT09QPDxjaGFubmVsKTsKICAgICAgICAgICAgICAgICBzbmRfcGNtX3RyaWdnZXJfZG9uZShzLCBzdWJzdHJlYW0pOwogICAgICAgICB9Ci0JLyogc25kX3ByaW50ayhLRVJOX0RFQlVHICJiYXNpYz0weCV4LCBpbnRlPTB4JXhcbiIsIGJhc2ljLCBpbnRlKTsgKi8KKwkvKiBkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiYmFzaWM9MHgleCwgaW50ZT0weCV4XG4iLCBiYXNpYywgaW50ZSk7ICovCiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CkBAIC01ODgsMTAgKzU5MSwxMCBAQAogCXB0cj1wdHIyOwogCWlmIChwdHIgPj0gcnVudGltZS0+YnVmZmVyX3NpemUpIHsKIAkJcHRyIC09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidWZmZXIgY2FwdHVyZSBsaW1pdGVkIVxuIik7CisJCWRldl93YXJuKGVtdS0+Y2FyZC0+ZGV2LCAiYnVmZmVyIGNhcHR1cmUgbGltaXRlZCFcbiIpOwogCX0KIAkvKgotCXByaW50ayhLRVJOX0RFQlVHICJwdHIxID0gMHglbHgsIHB0cjI9MHglbHgsIHB0cj0weCVseCwgIgorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJwdHIxID0gMHglbHgsIHB0cjI9MHglbHgsIHB0cj0weCVseCwgIgogCSAgICAgICAiYnVmZmVyX3NpemUgPSAweCV4LCBwZXJpb2Rfc2l6ZSA9IDB4JXgsIGJpdHM9JWQsIHJhdGU9JWRcbiIsCiAJICAgICAgIHB0cjEsIHB0cjIsIHB0ciwgKGludClydW50aW1lLT5idWZmZXJfc2l6ZSwKIAkgICAgICAgKGludClydW50aW1lLT5wZXJpb2Rfc2l6ZSwgKGludClydW50aW1lLT5mcmFtZV9iaXRzLApAQCAtNjMwLDcgKzYzMyw3IEBACiAJaWYgKGNoaXAtPnAxNnZfYnVmZmVyLmFyZWEpIHsKIAkJc25kX2RtYV9mcmVlX3BhZ2VzKCZjaGlwLT5wMTZ2X2J1ZmZlcik7CiAJCS8qCi0JCXNuZF9wcmludGsoS0VSTl9ERUJVRyAicGVyaW9kIGxhYmxlcyBmcmVlOiAlcFxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJwZXJpb2QgbGFibGVzIGZyZWU6ICVwXG4iLAogCQkJICAgJmNoaXAtPnAxNnZfYnVmZmVyKTsKIAkJKi8KIAl9CkBAIC02NDQsNyArNjQ3LDcgQEAKIAlpbnQgZXJyOwogICAgICAgICBpbnQgY2FwdHVyZT0xOwogICAKLQkvKiBzbmRfcHJpbnRrKEtFUk5fREVCVUcgInNuZF9wMTZ2X3BjbSBjYWxsZWQuIGRldmljZT0lZFxuIiwgZGV2aWNlKTsgKi8KKwkvKiBkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAic25kX3AxNnZfcGNtIGNhbGxlZC4gZGV2aWNlPSVkXG4iLCBkZXZpY2UpOyAqLwogCWVtdS0+cDE2dl9kZXZpY2Vfb2Zmc2V0ID0gZGV2aWNlOwogCWlmIChycGNtKQogCQkqcnBjbSA9IE5VTEw7CkBAIC02NzIsNyArNjc1LDcgQEAKIAkJCQkJCQkgKCg2NTUzNiAtIDY0KSAqIDgpLCAoKDY1NTM2IC0gNjQpICogOCkpKSA8IDApIAogCQkJcmV0dXJuIGVycjsKIAkJLyoKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHCisJCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCiAJCQkgICAicHJlYWxsb2NhdGUgcGxheWJhY2sgc3Vic3RyZWFtOiBlcnI9JWRcbiIsIGVycik7CiAJCSovCiAJfQpAQCAtNjg2LDcgKzY4OSw3IEBACiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM2IC0gNjQsIDY1NTM2IC0gNjQpKSA8IDApCiAJCQlyZXR1cm4gZXJyOwogCQkvKgotCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcKKwkJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKIAkJCSAgICJwcmVhbGxvY2F0ZSBjYXB0dXJlIHN1YnN0cmVhbTogZXJyPSVkXG4iLCBlcnIpOwogCQkqLwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL3ZvaWNlLmMgYi9zb3VuZC9wY2kvZW11MTBrMS92b2ljZS5jCmluZGV4IDEwMWU3Y2IuLmYxNmZkNWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL3ZvaWNlLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvdm9pY2UuYwpAQCAtNTUsNyArNTUsNyBAQAogCWZpcnN0X3ZvaWNlID0gbGFzdF92b2ljZSA9IDA7CiAJZm9yIChpID0gZW11LT5uZXh0X2ZyZWVfdm9pY2UsIGogPSAwOyBqIDwgTlVNX0cgOyBpICs9IG51bWJlciwgaiArPSBudW1iZXIpIHsKIAkJLyoKLQkJcHJpbnRrKEtFUk5fREVCVUcgImkgJWQgaiAlZCBuZXh0IGZyZWUgJWQhXG4iLAorCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiaSAlZCBqICVkIG5leHQgZnJlZSAlZCFcbiIsCiAJCSAgICAgICBpLCBqLCBlbXUtPm5leHRfZnJlZV92b2ljZSk7CiAJCSovCiAJCWkgJT0gTlVNX0c7CkBAIC03NSw3ICs3NSw3IEBACiAJCQl9CiAJCX0KIAkJaWYgKCFza2lwKSB7Ci0JCQkvKiBwcmludGsoS0VSTl9ERUJVRyAiYWxsb2NhdGVkIHZvaWNlICVkXG4iLCBpKTsgKi8KKwkJCS8qIGRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJhbGxvY2F0ZWQgdm9pY2UgJWRcbiIsIGkpOyAqLwogCQkJZmlyc3Rfdm9pY2UgPSBpOwogCQkJbGFzdF92b2ljZSA9IChpICsgbnVtYmVyKSAlIE5VTV9HOwogCQkJZW11LT5uZXh0X2ZyZWVfdm9pY2UgPSBsYXN0X3ZvaWNlOwpAQCAtODksNyArODksNyBAQAogCWZvciAoaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewogCQl2b2ljZSA9ICZlbXUtPnZvaWNlc1soZmlyc3Rfdm9pY2UgKyBpKSAlIE5VTV9HXTsKIAkJLyoKLQkJcHJpbnRrKGtFUk5fREVCVUcgInZvaWNlIGFsbG9jIC0gJWksICVpIG9mICVpXG4iLAorCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAidm9pY2UgYWxsb2MgLSAlaSwgJWkgb2YgJWlcbiIsCiAJCSAgICAgICB2b2ljZS0+bnVtYmVyLCBpZHgtZmlyc3Rfdm9pY2UrMSwgbnVtYmVyKTsKIAkJKi8KIAkJdm9pY2UtPnVzZSA9IDE7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW5zMTM3MC5jIGIvc291bmQvcGNpL2VuczEzNzAuYwppbmRleCA2MTI2MmYzLi4yOWNkMzM5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW5zMTM3MC5jCisrKyBiL3NvdW5kL3BjaS9lbnMxMzcwLmMKQEAgLTUyNSw3ICs1MjUsNyBAQAogCQkJcmV0dXJuIHI7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ3YWl0IHNyYyByZWFkeSB0aW1lb3V0IDB4JWx4IFsweCV4XVxuIiwKKwlkZXZfZXJyKGVuc29uaXEtPmNhcmQtPmRldiwgIndhaXQgc3JjIHJlYWR5IHRpbWVvdXQgMHglbHggWzB4JXhdXG4iLAogCQkgICBFU19SRUcoZW5zb25pcSwgMTM3MV9TTVBSQVRFKSwgcik7CiAJcmV0dXJuIDA7CiB9CkBAIC01ODcsNyArNTg3LDcgQEAKIAl1bnNpZ25lZCBsb25nIGVuZF90aW1lID0gamlmZmllcyArIEhaIC8gMTA7CiAKICNpZiAwCi0JcHJpbnRrKEtFUk5fREVCVUcKKwlkZXZfZGJnKGVuc29uaXEtPmNhcmQtPmRldiwKIAkgICAgICAgIkNPREVDIFdSSVRFOiByZWcgPSAweCV4LCB2YWwgPSAweCV4ICgweCV4KSwgY3JlZyA9IDB4JXhcbiIsCiAJICAgICAgIHJlZywgdmFsLCBFU18xMzcwX0NPREVDX1dSSVRFKHJlZywgdmFsKSwgRVNfUkVHKGVuc29uaXEsIDEzNzBfQ09ERUMpKTsKICNlbmRpZgpAQCAtNTk4LDcgKzU5OCw3IEBACiAJCX0KIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJfSB3aGlsZSAodGltZV9hZnRlcihlbmRfdGltZSwgamlmZmllcykpOwotCXNuZF9wcmludGsoS0VSTl9FUlIgImNvZGVjIHdyaXRlIHRpbWVvdXQsIHN0YXR1cyA9IDB4JXhcbiIsCisJZGV2X2VycihlbnNvbmlxLT5jYXJkLT5kZXYsICJjb2RlYyB3cml0ZSB0aW1lb3V0LCBzdGF0dXMgPSAweCV4XG4iLAogCQkgICBpbmwoRVNfUkVHKGVuc29uaXEsIFNUQVRVUykpKTsKIH0KIApAQCAtNjQ5LDcgKzY0OSw3IEBACiAJCX0KIAl9CiAJbXV0ZXhfdW5sb2NrKCZlbnNvbmlxLT5zcmNfbXV0ZXgpOwotCXNuZF9wcmludGsoS0VSTl9FUlIgImNvZGVjIHdyaXRlIHRpbWVvdXQgYXQgMHglbHggWzB4JXhdXG4iLAorCWRldl9lcnIoZW5zb25pcS0+Y2FyZC0+ZGV2LCAiY29kZWMgd3JpdGUgdGltZW91dCBhdCAweCVseCBbMHgleF1cbiIsCiAJCSAgIEVTX1JFRyhlbnNvbmlxLCAxMzcxX0NPREVDKSwgaW5sKEVTX1JFRyhlbnNvbmlxLCAxMzcxX0NPREVDKSkpOwogfQogCkBAIC03MDYsOCArNzA2LDggQEAKIAkJCX0KIAkJCW11dGV4X3VubG9jaygmZW5zb25pcS0+c3JjX211dGV4KTsKIAkJCWlmICgrK2ZhaWwgPiAxMCkgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNvZGVjIHJlYWQgdGltZW91dCAoZmluYWwpICIKLQkJCQkJICAgImF0IDB4JWx4LCByZWcgPSAweCV4IFsweCV4XVxuIiwKKwkJCQlkZXZfZXJyKGVuc29uaXEtPmNhcmQtPmRldiwKKwkJCQkJImNvZGVjIHJlYWQgdGltZW91dCAoZmluYWwpIGF0IDB4JWx4LCByZWcgPSAweCV4IFsweCV4XVxuIiwKIAkJCQkJICAgRVNfUkVHKGVuc29uaXEsIDEzNzFfQ09ERUMpLCByZWcsCiAJCQkJCSAgIGlubChFU19SRUcoZW5zb25pcSwgMTM3MV9DT0RFQykpKTsKIAkJCQlyZXR1cm4gMDsKQEAgLTcxNiw3ICs3MTYsNyBAQAogCQl9CiAJfQogCW11dGV4X3VubG9jaygmZW5zb25pcS0+c3JjX211dGV4KTsKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlczEzNzE6IGNvZGVjIHJlYWQgdGltZW91dCBhdCAweCVseCBbMHgleF1cbiIsCisJZGV2X2VycihlbnNvbmlxLT5jYXJkLT5kZXYsICJjb2RlYyByZWFkIHRpbWVvdXQgYXQgMHglbHggWzB4JXhdXG4iLAogCQkgICBFU19SRUcoZW5zb25pcSwgMTM3MV9DT0RFQyksIGlubChFU19SRUcoZW5zb25pcSwgMTM3MV9DT0RFQykpKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE3OTYsNyArMTc5Niw3IEBACiAjaWZkZWYgU1VQUE9SVF9KT1lTVElDSwogCiAjaWZkZWYgQ0hJUDEzNzEKLXN0YXRpYyBpbnQgc25kX2Vuc29uaXFfZ2V0X2pveXN0aWNrX3BvcnQoaW50IGRldikKK3N0YXRpYyBpbnQgc25kX2Vuc29uaXFfZ2V0X2pveXN0aWNrX3BvcnQoc3RydWN0IGVuc29uaXEgKmVuc29uaXEsIGludCBkZXYpCiB7CiAJc3dpdGNoIChqb3lzdGlja19wb3J0W2Rldl0pIHsKIAljYXNlIDA6IC8qIGRpc2FibGVkICovCkBAIC0xODA4LDEyICsxODA4LDEzIEBACiAJCXJldHVybiBqb3lzdGlja19wb3J0W2Rldl07CiAKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgImVuczEzNzE6IGludmFsaWQgam95c3RpY2sgcG9ydCAlI3giLCBqb3lzdGlja19wb3J0W2Rldl0pOworCQlkZXZfZXJyKGVuc29uaXEtPmNhcmQtPmRldiwKKwkJCSJpbnZhbGlkIGpveXN0aWNrIHBvcnQgJSN4Iiwgam95c3RpY2tfcG9ydFtkZXZdKTsKIAkJcmV0dXJuIDA7CiAJfQogfQogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IHNuZF9lbnNvbmlxX2dldF9qb3lzdGlja19wb3J0KGludCBkZXYpCitzdGF0aWMgaW50IHNuZF9lbnNvbmlxX2dldF9qb3lzdGlja19wb3J0KHN0cnVjdCBlbnNvbmlxICplbnNvbmlxLCBpbnQgZGV2KQogewogCXJldHVybiBqb3lzdGlja1tkZXZdID8gMHgyMDAgOiAwOwogfQpAQCAtMTgyNCw3ICsxODI1LDcgQEAKIAlzdHJ1Y3QgZ2FtZXBvcnQgKmdwOwogCWludCBpb19wb3J0OwogCi0JaW9fcG9ydCA9IHNuZF9lbnNvbmlxX2dldF9qb3lzdGlja19wb3J0KGRldik7CisJaW9fcG9ydCA9IHNuZF9lbnNvbmlxX2dldF9qb3lzdGlja19wb3J0KGVuc29uaXEsIGRldik7CiAKIAlzd2l0Y2ggKGlvX3BvcnQpIHsKIAljYXNlIDA6CkBAIC0xODM1LDE0ICsxODM2LDE2IEBACiAJCQlpZiAocmVxdWVzdF9yZWdpb24oaW9fcG9ydCwgOCwgImVuczEzN3g6IGdhbWVwb3J0IikpCiAJCQkJYnJlYWs7CiAJCWlmIChpb19wb3J0ID4gMHgyMTgpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImVuczEzN3g6IG5vIGdhbWVwb3J0IHBvcnRzIGF2YWlsYWJsZVxuIik7CisJCQlkZXZfd2FybihlbnNvbmlxLT5jYXJkLT5kZXYsCisJCQkJICJubyBnYW1lcG9ydCBwb3J0cyBhdmFpbGFibGVcbiIpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCQlicmVhazsKIAogCWRlZmF1bHQ6CiAJCWlmICghcmVxdWVzdF9yZWdpb24oaW9fcG9ydCwgOCwgImVuczEzN3g6IGdhbWVwb3J0IikpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImVuczEzN3g6IGdhbWVwb3J0IGlvIHBvcnQgJSN4IGluIHVzZVxuIiwKKwkJCWRldl93YXJuKGVuc29uaXEtPmNhcmQtPmRldiwKKwkJCQkgImdhbWVwb3J0IGlvIHBvcnQgJSN4IGluIHVzZVxuIiwKIAkJCSAgICAgICBpb19wb3J0KTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KQEAgLTE4NTEsNyArMTg1NCw4IEBACiAKIAllbnNvbmlxLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOwogCWlmICghZ3ApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbnMxMzd4OiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCWRldl9lcnIoZW5zb25pcS0+Y2FyZC0+ZGV2LAorCQkJImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKIAkJcmVsZWFzZV9yZWdpb24oaW9fcG9ydCwgOCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTIwODIsOCArMjA4Niw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTIxMzcsNyArMjE0MCw3IEBACiAJZW5zb25pcS0+cG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOwogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2F1ZGlvcGNpX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgZW5zb25pcSkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9lbnNvbmlxX2ZyZWUoZW5zb25pcSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMjE0NSw3ICsyMTQ4LDcgQEAKICNpZmRlZiBDSElQMTM3MAogCWlmIChzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YShwY2kpLAogCQkJCTE2LCAmZW5zb25pcS0+ZG1hX2J1ZykgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgcGhhbnRvbSBhcmVhIC0gZG1hX2J1Z1xuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBwaGFudG9tIGFyZWEgLSBkbWFfYnVnXG4iKTsKIAkJc25kX2Vuc29uaXFfZnJlZShlbnNvbmlxKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0yMTgwLDggKzIxODMsNiBAQAogCiAJc25kX2Vuc29uaXFfcHJvY19pbml0KGVuc29uaXEpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJlbnNvbmlxID0gZW5zb25pcTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI0MzcsNyArMjQzOCw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZXMxOTM4LmMgYi9zb3VuZC9wY2kvZXMxOTM4LmMKaW5kZXggOTIxM2ZiMy4uMzRkOTViZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VzMTkzOC5jCisrKyBiL3NvdW5kL3BjaS9lczE5MzguYwpAQCAtMjU0LDcgKzI1NCw2IEBACiAjZGVmaW5lIFdSSVRFX0xPT1BfVElNRU9VVAkweDEwMDAwCiAjZGVmaW5lIEdFVF9MT09QX1RJTUVPVVQJMHgwMTAwMAogCi0jdW5kZWYgUkVHX0RFQlVHCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogV3JpdGUgdG8gYSBtaXhlciByZWdpc3RlcgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjY1LDkgKzI2NCw3IEBACiAJb3V0YihyZWcsIFNMU0JfUkVHKGNoaXAsIE1JWEVSQUREUikpOwogCW91dGIodmFsLCBTTFNCX1JFRyhjaGlwLCBNSVhFUkRBVEEpKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5taXhlcl9sb2NrLCBmbGFncyk7Ci0jaWZkZWYgUkVHX0RFQlVHCi0Jc25kX3ByaW50ayhLRVJOX0RFQlVHICJNaXhlciByZWcgJTAyeCBzZXQgdG8gJTAyeFxuIiwgcmVnLCB2YWwpOwotI2VuZGlmCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJNaXhlciByZWcgJTAyeCBzZXQgdG8gJTAyeFxuIiwgcmVnLCB2YWwpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjgxLDkgKzI3OCw3IEBACiAJb3V0YihyZWcsIFNMU0JfUkVHKGNoaXAsIE1JWEVSQUREUikpOwogCWRhdGEgPSBpbmIoU0xTQl9SRUcoY2hpcCwgTUlYRVJEQVRBKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+bWl4ZXJfbG9jaywgZmxhZ3MpOwotI2lmZGVmIFJFR19ERUJVRwotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiTWl4ZXIgcmVnICUwMnggbm93IGlzICUwMnhcbiIsIHJlZywgZGF0YSk7Ci0jZW5kaWYKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIk1peGVyIHJlZyAlMDJ4IG5vdyBpcyAlMDJ4XG4iLCByZWcsIGRhdGEpOwogCXJldHVybiBkYXRhOwogfQogCkBAIC0zMDIsMTAgKzI5Nyw5IEBACiAJaWYgKHZhbCAhPSBvdmFsKSB7CiAJCW5ldyA9IChvbGQgJiB+bWFzaykgfCAodmFsICYgbWFzayk7CiAJCW91dGIobmV3LCBTTFNCX1JFRyhjaGlwLCBNSVhFUkRBVEEpKTsKLSNpZmRlZiBSRUdfREVCVUcKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJNaXhlciByZWcgJTAyeCB3YXMgJTAyeCwgc2V0IHRvICUwMnhcbiIsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIk1peGVyIHJlZyAlMDJ4IHdhcyAlMDJ4LCBzZXQgdG8gJTAyeFxuIiwKIAkJCSAgIHJlZywgb2xkLCBuZXcpOwotI2VuZGlmCiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPm1peGVyX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gb3ZhbDsKQEAgLTMyNCw3ICszMTgsOCBAQAogCQkJcmV0dXJuOwogCQl9CiAJfQotCXByaW50ayhLRVJOX0VSUiAic25kX2VzMTkzOF93cml0ZV9jbWQgdGltZW91dCAoMHgwMiV4LzB4MDIleClcbiIsIGNtZCwgdik7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCSJzbmRfZXMxOTM4X3dyaXRlX2NtZCB0aW1lb3V0ICgweDAyJXgvMHgwMiV4KVxuIiwgY21kLCB2KTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTMzNyw3ICszMzIsNyBAQAogCWZvciAoaSA9IEdFVF9MT09QX1RJTUVPVVQ7IGk7IGktLSkKIAkJaWYgKCh2ID0gaW5iKFNMU0JfUkVHKGNoaXAsIFNUQVRVUykpKSAmIDB4ODApCiAJCQlyZXR1cm4gaW5iKFNMU0JfUkVHKGNoaXAsIFJFQUREQVRBKSk7Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiZ2V0X2J5dGUgdGltZW91dDogc3RhdHVzIDB4MDIleFxuIiwgdik7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJnZXRfYnl0ZSB0aW1lb3V0OiBzdGF0dXMgMHgwMiV4XG4iLCB2KTsKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIApAQCAtMzUxLDkgKzM0Niw3IEBACiAJc25kX2VzMTkzOF93cml0ZV9jbWQoY2hpcCwgcmVnKTsKIAlzbmRfZXMxOTM4X3dyaXRlX2NtZChjaGlwLCB2YWwpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0jaWZkZWYgUkVHX0RFQlVHCi0Jc25kX3ByaW50ayhLRVJOX0RFQlVHICJSZWcgJTAyeCBzZXQgdG8gJTAyeFxuIiwgcmVnLCB2YWwpOwotI2VuZGlmCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJSZWcgJTAyeCBzZXQgdG8gJTAyeFxuIiwgcmVnLCB2YWwpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzY4LDkgKzM2MSw3IEBACiAJc25kX2VzMTkzOF93cml0ZV9jbWQoY2hpcCwgcmVnKTsKIAl2YWwgPSBzbmRfZXMxOTM4X2dldF9ieXRlKGNoaXApOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0jaWZkZWYgUkVHX0RFQlVHCi0Jc25kX3ByaW50ayhLRVJOX0RFQlVHICJSZWcgJTAyeCBub3cgaXMgJTAyeFxuIiwgcmVnLCB2YWwpOwotI2VuZGlmCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJSZWcgJTAyeCBub3cgaXMgJTAyeFxuIiwgcmVnLCB2YWwpOwogCXJldHVybiB2YWw7CiB9CiAKQEAgLTM5MSwxMCArMzgyLDggQEAKIAkJc25kX2VzMTkzOF93cml0ZV9jbWQoY2hpcCwgcmVnKTsKIAkJbmV3ID0gKG9sZCAmIH5tYXNrKSB8ICh2YWwgJiBtYXNrKTsKIAkJc25kX2VzMTkzOF93cml0ZV9jbWQoY2hpcCwgbmV3KTsKLSNpZmRlZiBSRUdfREVCVUcKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJSZWcgJTAyeCB3YXMgJTAyeCwgc2V0IHRvICUwMnhcbiIsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiUmVnICUwMnggd2FzICUwMngsIHNldCB0byAlMDJ4XG4iLAogCQkJICAgcmVnLCBvbGQsIG5ldyk7Ci0jZW5kaWYKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gb3ZhbDsKQEAgLTQxNiw3ICs0MDUsNyBAQAogCQkJCWdvdG8gX19uZXh0OwogCQl9CiAJfQotCXNuZF9wcmludGsoS0VSTl9FUlIgIkVTUyBTb2xvLTEgcmVzZXQgZmFpbGVkXG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkVTUyBTb2xvLTEgcmVzZXQgZmFpbGVkXG4iKTsKIAogICAgICBfX25leHQ6CiAJc25kX2VzMTkzOF93cml0ZV9jbWQoY2hpcCwgRVNTX0NNRF9FTkFCTEVFWFQpOwpAQCAtMTUwNCwxNiArMTQ5MywxNSBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZXMxOTM4OiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9lczE5MzhfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlwcmludGsoS0VSTl9FUlIgImVzMTkzODogdW5hYmxlIHRvIGdyYWIgSVJRICVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZCwgZGlzYWJsaW5nIGRldmljZVxuIiwKKwkJCXBjaS0+aXJxKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTU0NSw3ICsxNTMzLDggQEAKIAogCWNoaXAtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFncCkgewotCQlwcmludGsoS0VSTl9FUlIgImVzMTkzODogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTYxMiw3ICsxNjAxLDggQEAKICAgICAgICAgLyogY2hlY2ssIGlmIHdlIGNhbiByZXN0cmljdCBQQ0kgRE1BIHRyYW5zZmVycyB0byAyNCBiaXRzICovCiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjQpKSA8IDAgfHwKIAkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDI0KSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDI0Yml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjRiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVOWElPOwogICAgICAgICB9CkBAIC0xNjM5LDE1ICsxNjI5LDE0IEBACiAJY2hpcC0+Z2FtZV9wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgNCk7CiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfZXMxOTM4X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9lczE5MzhfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJY2hpcC0+aXJxID0gcGNpLT5pcnE7Ci0jaWZkZWYgRVMxOTM4X0RERUJVRwotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiY3JlYXRlOiBpbzogMHglbHgsIHNiOiAweCVseCwgdmM6IDB4JWx4LCBtcHU6IDB4JWx4LCBnYW1lOiAweCVseFxuIiwKKwlkZXZfZGJnKGNhcmQtPmRldiwKKwkJImNyZWF0ZTogaW86IDB4JWx4LCBzYjogMHglbHgsIHZjOiAweCVseCwgbXB1OiAweCVseCwgZ2FtZTogMHglbHhcbiIsCiAJCSAgIGNoaXAtPmlvX3BvcnQsIGNoaXAtPnNiX3BvcnQsIGNoaXAtPnZjX3BvcnQsIGNoaXAtPm1wdV9wb3J0LCBjaGlwLT5nYW1lX3BvcnQpOwotI2VuZGlmCiAKIAljaGlwLT5kZG1hX3BvcnQgPSBjaGlwLT52Y19wb3J0ICsgMHgwMDsJCS8qIGZpeCBmcm9tIFRob21hcyBTYWlsZXIgKi8KIApAQCAtMTY1OCw4ICsxNjQ3LDYgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcmNoaXAgPSBjaGlwOwogCXJldHVybiAwOwogfQpAQCAtMTY3NSwyMSArMTY2MiwyMiBAQAogCiAJc3RhdHVzID0gaW5iKFNMSU9fUkVHKGNoaXAsIElSUUNPTlRST0wpKTsKICNpZiAwCi0JcHJpbnRrKEtFUk5fREVCVUcgIkVzMTkzOGRlYnVnIC0gaW50ZXJydXB0IHN0YXR1czogPTB4JXhcbiIsIHN0YXR1cyk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJFczE5MzhkZWJ1ZyAtIGludGVycnVwdCBzdGF0dXM6ID0weCV4XG4iLCBzdGF0dXMpOwogI2VuZGlmCiAJCiAJLyogQVVESU8gMSAqLwogCWlmIChzdGF0dXMgJiAweDEwKSB7CiAjaWYgMAotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAogCQkgICAgICAgIkVzMTkzOGRlYnVnIC0gQVVESU8gY2hhbm5lbCAxIGludGVycnVwdFxuIik7Ci0JCXByaW50ayhLRVJOX0RFQlVHCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAogCQkgICAgICAgIkVzMTkzOGRlYnVnIC0gQVVESU8gY2hhbm5lbCAxIERNQUMgRE1BIGNvdW50OiAldVxuIiwKIAkJICAgICAgIGludyhTTERNX1JFRyhjaGlwLCBETUFDT1VOVCkpKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCiAJCSAgICAgICAiRXMxOTM4ZGVidWcgLSBBVURJTyBjaGFubmVsIDEgRE1BQyBETUEgYmFzZTogJXVcbiIsCiAJCSAgICAgICBpbmwoU0xETV9SRUcoY2hpcCwgRE1BQUREUikpKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCiAJCSAgICAgICAiRXMxOTM4ZGVidWcgLSBBVURJTyBjaGFubmVsIDEgRE1BQyBETUEgc3RhdHVzOiAweCV4XG4iLAogCQkgICAgICAgaW5sKFNMRE1fUkVHKGNoaXAsIERNQVNUQVRVUykpKTsKICNlbmRpZgpAQCAtMTcwNSwxMiArMTY5MywxMiBAQAogCS8qIEFVRElPIDIgKi8KIAlpZiAoc3RhdHVzICYgMHgyMCkgewogI2lmIDAKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKIAkJICAgICAgICJFczE5MzhkZWJ1ZyAtIEFVRElPIGNoYW5uZWwgMiBpbnRlcnJ1cHRcbiIpOwotCQlwcmludGsoS0VSTl9ERUJVRworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKIAkJICAgICAgICJFczE5MzhkZWJ1ZyAtIEFVRElPIGNoYW5uZWwgMiBETUFDIERNQSBjb3VudDogJXVcbiIsCiAJCSAgICAgICBpbncoU0xJT19SRUcoY2hpcCwgQVVESU8yRE1BQ09VTlQpKSk7Ci0JCXByaW50ayhLRVJOX0RFQlVHCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAogCQkgICAgICAgIkVzMTkzOGRlYnVnIC0gQVVESU8gY2hhbm5lbCAyIERNQUMgRE1BIGJhc2U6ICV1XG4iLAogCQkgICAgICAgaW5sKFNMSU9fUkVHKGNoaXAsIEFVRElPMkRNQUFERFIpKSk7CiAKQEAgLTE4MDgsNyArMTc5Niw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWZvciAoaWR4ID0gMDsgaWR4IDwgNTsgaWR4KyspIHsKQEAgLTE4NDMsNyArMTgzMiw3IEBACiAJCQkgICAgU0xTQl9SRUcoY2hpcCwgRk1MT1dBRERSKSwKIAkJCSAgICBTTFNCX1JFRyhjaGlwLCBGTUhJR0hBRERSKSwKIAkJCSAgICBPUEwzX0hXX09QTDMsIDEsICZvcGwzKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlczE5Mzg6IE9QTDMgbm90IGRldGVjdGVkIGF0IDB4JWx4XG4iLAorCQlkZXZfZXJyKGNhcmQtPmRldiwgIk9QTDMgbm90IGRldGVjdGVkIGF0IDB4JWx4XG4iLAogCQkJICAgU0xTQl9SRUcoY2hpcCwgRk1MT1dBRERSKSk7CiAJfSBlbHNlIHsKIAkgICAgICAgIGlmICgoZXJyID0gc25kX29wbDNfdGltZXJfbmV3KG9wbDMsIDAsIDEpKSA8IDApIHsKQEAgLTE4NTksNyArMTg0OCw3IEBACiAJCQkJY2hpcC0+bXB1X3BvcnQsCiAJCQkJTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8IE1QVTQwMV9JTkZPX0lSUV9IT09LLAogCQkJCS0xLCAmY2hpcC0+cm1pZGkpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImVzMTkzODogdW5hYmxlIHRvIGluaXRpYWxpemUgTVBVLTQwMVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGluaXRpYWxpemUgTVBVLTQwMVxuIik7CiAJfSBlbHNlIHsKIAkJLy8gdGhpcyBsaW5lIGlzIHZpdGFsIGZvciBNSURJIGludGVycnVwdCBoYW5kbGluZyBvbiBlc3Mtc29sbzEKIAkJLy8gYW5kcmVhc0BmbHlpbmctc25haWwuZGUKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lczE5NjguYyBiL3NvdW5kL3BjaS9lczE5NjguYwppbmRleCA3NzJjYzM2Li41YmIxY2Y2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZXMxOTY4LmMKKysrIGIvc291bmQvcGNpL2VzMTk2OC5jCkBAIC02MzIsNyArNjMyLDcgQEAKIAkJCXJldHVybiAwOwogCQljb25kX3Jlc2NoZWQoKTsKIAl9Ci0Jc25kX3ByaW50ZCgiZXMxOTY4OiBhYzk3IHRpbWVvdXRcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiYWM5NyB0aW1lb3V0XG4iKTsKIAlyZXR1cm4gMTsgLyogdGltZW91dCAqLwogfQogCkBAIC02NDQsNyArNjQ0LDcgQEAKIAkJaWYgKCEoaW5iKGNoaXAtPmlvX3BvcnQgKyBFU01fQUM5N19JTkRFWCkgJiAxKSkKIAkJCXJldHVybiAwOwogCX0KLQlzbmRfcHJpbnRkKCJlczE5Njg6IGFjOTcgdGltZW91dFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJhYzk3IHRpbWVvdXRcbiIpOwogCXJldHVybiAxOyAvKiB0aW1lb3V0ICovCiB9CiAKQEAgLTY4Nyw3ICs2ODcsNyBAQAogCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspCiAJCWlmIChfX21hZXN0cm9fcmVhZChjaGlwLCBJRFIxX0NSQU1fUE9JTlRFUikgPT0gaW5kZXgpCiAJCQlyZXR1cm47Ci0Jc25kX3ByaW50ZCgiZXMxOTY4OiBBUFUgcmVnaXN0ZXIgc2VsZWN0IGZhaWxlZC4gKFRpbWVvdXQpXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIkFQVSByZWdpc3RlciBzZWxlY3QgZmFpbGVkLiAoVGltZW91dClcbiIpOwogfQogCiAvKiBubyBzcGlubG9jayAqLwpAQCAtNjk5LDcgKzY5OSw3IEBACiAJCQlyZXR1cm47CiAJCV9fbWFlc3Ryb193cml0ZShjaGlwLCBJRFIwX0RBVEFfUE9SVCwgZGF0YSk7CiAJfQotCXNuZF9wcmludGQoImVzMTk2ODogQVBVIHJlZ2lzdGVyIHNldCBwcm9iYWJseSBmYWlsZWQgKFRpbWVvdXQpIVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJBUFUgcmVnaXN0ZXIgc2V0IHByb2JhYmx5IGZhaWxlZCAoVGltZW91dCkhXG4iKTsKIH0KIAogLyogbm8gc3BpbmxvY2sgKi8KQEAgLTE0NDIsMTMgKzE0NDIsMTQgQEAKIAkJCQkJICAgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAogCQkJCQkgICBjaGlwLT50b3RhbF9idWZzaXplLCAmY2hpcC0+ZG1hKTsKIAlpZiAoZXJyIDwgMCB8fCAhIGNoaXAtPmRtYS5hcmVhKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVzMTk2ODogY2FuJ3QgYWxsb2NhdGUgZG1hIHBhZ2VzIGZvciBzaXplICVkXG4iLAorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjYW4ndCBhbGxvY2F0ZSBkbWEgcGFnZXMgZm9yIHNpemUgJWRcbiIsCiAJCQkgICBjaGlwLT50b3RhbF9idWZzaXplKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWlmICgoY2hpcC0+ZG1hLmFkZHIgKyBjaGlwLT5kbWEuYnl0ZXMgLSAxKSAmIH4oKDEgPDwgMjgpIC0gMSkpIHsKIAkJc25kX2RtYV9mcmVlX3BhZ2VzKCZjaGlwLT5kbWEpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlczE5Njg6IERNQSBidWZmZXIgYmV5b25kIDI1Nk1CLlxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiRE1BIGJ1ZmZlciBiZXlvbmQgMjU2TUIuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xNDg5LDcgKzE0OTAsOCBAQAogCX0KIAljaGFuLT5tZW1vcnkgPSBzbmRfZXMxOTY4X25ld19tZW1vcnkoY2hpcCwgc2l6ZSk7CiAJaWYgKGNoYW4tPm1lbW9yeSA9PSBOVUxMKSB7Ci0JCS8vIHNuZF9wcmludGQoImNhbm5vdCBhbGxvY2F0ZSBkbWEgYnVmZmVyOiBzaXplID0gJWRcbiIsIHNpemUpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgYWxsb2NhdGUgZG1hIGJ1ZmZlcjogc2l6ZSA9ICVkXG4iLCBzaXplKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwgJmNoYW4tPm1lbW9yeS0+YnVmKTsKQEAgLTE3MTUsMTEgKzE3MTcsMTMgQEAKIAogCS8qIHNlYXJjaCAyIEFQVXMgKGFsdGhvdWdoIG9uZSBhcHUgaXMgZW5vdWdoKSAqLwogCWlmICgoYXB1ID0gc25kX2VzMTk2OF9hbGxvY19hcHVfcGFpcihjaGlwLCBFU01fQVBVX1BDTV9QTEFZKSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkhtbSwgY2Fubm90IGZpbmQgZW1wdHkgQVBVIHBhaXIhP1xuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiSG1tLCBjYW5ub3QgZmluZCBlbXB0eSBBUFUgcGFpciE/XG4iKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoKG1lbW9yeSA9IHNuZF9lczE5NjhfbmV3X21lbW9yeShjaGlwLCBDTE9DS19NRUFTVVJFX0JVRlNJWkUpKSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBhbGxvY2F0ZSBkbWEgYnVmZmVyIC0gdXNpbmcgZGVmYXVsdCBjbG9jayAlZFxuIiwgY2hpcC0+Y2xvY2spOworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsCisJCQkgImNhbm5vdCBhbGxvY2F0ZSBkbWEgYnVmZmVyIC0gdXNpbmcgZGVmYXVsdCBjbG9jayAlZFxuIiwKKwkJCSBjaGlwLT5jbG9jayk7CiAJCXNuZF9lczE5NjhfZnJlZV9hcHVfcGFpcihjaGlwLCBhcHUpOwogCQlyZXR1cm47CiAJfQpAQCAtMTc4MCw3ICsxNzg0LDcgQEAKIAllbHNlCiAJCXQgKz0gc3RvcF90aW1lLnR2X3VzZWMgLSBzdGFydF90aW1lLnR2X3VzZWM7CiAJaWYgKHQgPT0gMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICI/PyBjYWxjdWxhdGlvbiBlcnJvci4uXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICI/PyBjYWxjdWxhdGlvbiBlcnJvci4uXG4iKTsKIAl9IGVsc2UgewogCQlvZmZzZXQgKj0gMTAwMDsKIAkJb2Zmc2V0ID0gKG9mZnNldCAvIHQpICogMTAwMCArICgob2Zmc2V0ICUgdCkgKiAxMDAwKSAvIHQ7CkBAIC0xNzg4LDcgKzE3OTIsNyBAQAogCQkJaWYgKG9mZnNldCA+PSA0MDAwMCAmJiBvZmZzZXQgPD0gNTAwMDApCiAJCQkJY2hpcC0+Y2xvY2sgPSAoY2hpcC0+Y2xvY2sgKiBvZmZzZXQpIC8gNDgwMDA7CiAJCX0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiZXMxOTY4OiBjbG9ja2luZyB0byAlZFxuIiwgY2hpcC0+Y2xvY2spOworCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsICJjbG9ja2luZyB0byAlZFxuIiwgY2hpcC0+Y2xvY2spOwogCX0KIAlzbmRfZXMxOTY4X2ZyZWVfbWVtb3J5KGNoaXAsIG1lbW9yeSk7CiAJc25kX2VzMTk2OF9mcmVlX2FwdV9wYWlyKGNoaXAsIGFwdSk7CkBAIC0yMTA4LDcgKzIxMTIsNyBAQAogCW91dHcoaW53KGlvYWRkciArIDB4M2MpICYgMHhmZmZjLCBpb2FkZHIgKyAweDNjKTsKIAogI2lmIDAJCQkJLyogdGhlIGxvb3AgaGVyZSBuZWVkcyB0byBiZSBtdWNoIGJldHRlciBpZiB3ZSB3YW50IGl0Li4gKi8KLQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAidHJ5aW5nIHNvZnR3YXJlIHJlc2V0XG4iKTsKKwlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsICJ0cnlpbmcgc29mdHdhcmUgcmVzZXRcbiIpOwogCS8qIHRyeSBhbmQgZG8gYSBzb2Z0d2FyZSByZXNldCAqLwogCW91dGIoMHg4MCB8IDB4N2MsIGlvYWRkciArIDB4MzApOwogCWZvciAodyA9IDA7OyB3KyspIHsKQEAgLTI0MTYsOCArMjQyMCw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlczE5Njg6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTI0NzksNyArMjQ4Miw4IEBACiAKIAljaGlwLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOwogCWlmICghZ3ApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlczE5Njg6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOwogCQlyZWxlYXNlX2FuZF9mcmVlX3Jlc291cmNlKHIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0yNzA2LDcgKzI3MTAsOCBAQAogCS8qIGNoZWNrLCBpZiB3ZSBjYW4gcmVzdHJpY3QgUENJIERNQSB0cmFuc2ZlcnMgdG8gMjggYml0cyAqLwogCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDI4KSkgPCAwIHx8CiAJICAgIHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygyOCkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyOGJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDI4Yml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtMjc0MCw3ICsyNzQ1LDcgQEAKIAljaGlwLT5pb19wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfZXMxOTY4X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9lczE5NjhfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0yNzcwLDcgKzI3NzUsNyBAQAogCQl9CiAJCWlmIChkb19wbSA+IDEpIHsKIAkJCS8qIG5vdCBtYXRjaGVkOyBkaXNhYmxpbmcgcG0gKi8KLQkJCXByaW50ayhLRVJOX0lORk8gImVzMTk2ODogbm90IGF0dGVtcHRpbmcgcG93ZXIgbWFuYWdlbWVudC5cbiIpOworCQkJZGV2X2luZm8oY2FyZC0+ZGV2LCAibm90IGF0dGVtcHRpbmcgcG93ZXIgbWFuYWdlbWVudC5cbiIpOwogCQkJZG9fcG0gPSAwOwogCQl9CiAJfQpAQCAtMjc4Myw4ICsyNzg4LDYgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KICNpZmRlZiBDT05GSUdfU05EX0VTMTk2OF9SQURJTwogCS8qIGRvbid0IHBsYXkgd2l0aCBHUElPcyBvbiBsYXB0b3BzICovCiAJaWYgKGNoaXAtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciAhPSAweDEyNWQpCkBAIC0yODAyLDcgKzI4MDUsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNuZF9lczE5NjhfdGVhNTc1eF9ncGlvcyk7IGkrKykgewogCQljaGlwLT50ZWE1NzV4X3R1bmVyID0gaTsKIAkJaWYgKCFzbmRfdGVhNTc1eF9pbml0KCZjaGlwLT50ZWEsIFRISVNfTU9EVUxFKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gImVzMTk2ODogZGV0ZWN0ZWQgVEVBNTc1eCByYWRpbyB0eXBlICVzXG4iLAorCQkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiZGV0ZWN0ZWQgVEVBNTc1eCByYWRpbyB0eXBlICVzXG4iLAogCQkJCSAgIGdldF90ZWE1NzV4X2dwaW8oY2hpcCktPm5hbWUpOwogCQkJc3RybGNweShjaGlwLT50ZWEuY2FyZCwgZ2V0X3RlYTU3NXhfZ3BpbyhjaGlwKS0+bmFtZSwKIAkJCQlzaXplb2YoY2hpcC0+dGVhLmNhcmQpKTsKQEAgLTI4MzYsNyArMjgzOSw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogICAgICAgICAgICAgICAgIApAQCAtMjkwMCw3ICsyOTA0LDcgQEAKIAkJCQkJICAgICAgIE1QVTQwMV9JTkZPX0lOVEVHUkFURUQgfAogCQkJCQkgICAgICAgTVBVNDAxX0lORk9fSVJRX0hPT0ssCiAJCQkJCSAgICAgICAtMSwgJmNoaXAtPnJtaWRpKSkgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJlczE5Njg6IHNraXBwaW5nIE1QVS00MDEgTUlESSBzdXBwb3J0Li5cbiIpOworCQkJZGV2X3dhcm4oY2FyZC0+ZGV2LCAic2tpcHBpbmcgTVBVLTQwMSBNSURJIHN1cHBvcnQuLlxuIik7CiAJCX0KIAl9CiAKQEAgLTI5MDksOCArMjkxMyw4IEBACiAjaWZkZWYgQ09ORklHX1NORF9FUzE5NjhfSU5QVVQKIAllcnIgPSBzbmRfZXMxOTY4X2lucHV0X3JlZ2lzdGVyKGNoaXApOwogCWlmIChlcnIpCi0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJJbnB1dCBkZXZpY2UgcmVnaXN0cmF0aW9uICIKLQkJCSJmYWlsZWQgd2l0aCBlcnJvciAlaSIsIGVycik7CisJCWRldl93YXJuKGNhcmQtPmRldiwKKwkJCSAiSW5wdXQgZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQgd2l0aCBlcnJvciAlaSIsIGVycik7CiAjZW5kaWYKIAogCXNuZF9lczE5Njhfc3RhcnRfaXJxKGNoaXApOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ZtODAxLmMgYi9zb3VuZC9wY2kvZm04MDEuYwppbmRleCA0NWJjOGE5Li5kYjE4Y2NhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZm04MDEuYworKysgYi9zb3VuZC9wY2kvZm04MDEuYwpAQCAtMjU0LDcgKzI1NCw3IEBACiAJCQlnb3RvIG9rMTsKIAkJdWRlbGF5KDEwKTsKIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgaW50ZXJmYWNlIGlzIGJ1c3kgKDEpXG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkFDJzk3IGludGVyZmFjZSBpcyBidXN5ICgxKVxuIik7CiAJcmV0dXJuOwogCiAgb2sxOgpAQCAtMjY5LDcgKzI2OSw3IEBACiAJCQlyZXR1cm47CiAJCXVkZWxheSgxMCk7CiAJfQotCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IGludGVyZmFjZSAjJWQgaXMgYnVzeSAoMilcbiIsIGFjOTctPm51bSk7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJBQyc5NyBpbnRlcmZhY2UgIyVkIGlzIGJ1c3kgKDIpXG4iLCBhYzk3LT5udW0pOwogfQogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX2ZtODAxX2NvZGVjX3JlYWQoc3RydWN0IHNuZF9hYzk3ICphYzk3LCB1bnNpZ25lZCBzaG9ydCByZWcpCkBAIC0yODUsNyArMjg1LDcgQEAKIAkJCWdvdG8gb2sxOwogCQl1ZGVsYXkoMTApOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBpbnRlcmZhY2UgaXMgYnVzeSAoMSlcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQUMnOTcgaW50ZXJmYWNlIGlzIGJ1c3kgKDEpXG4iKTsKIAlyZXR1cm4gMDsKIAogIG9rMToKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCQkJZ290byBvazI7CiAJCXVkZWxheSgxMCk7CiAJfQotCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IGludGVyZmFjZSAjJWQgaXMgYnVzeSAoMilcbiIsIGFjOTctPm51bSk7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJBQyc5NyBpbnRlcmZhY2UgIyVkIGlzIGJ1c3kgKDIpXG4iLCBhYzk3LT5udW0pOwogCXJldHVybiAwOwogCiAgb2syOgpAQCAtMzA2LDcgKzMwNiw3IEBACiAJCQlnb3RvIG9rMzsKIAkJdWRlbGF5KDEwKTsKIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgaW50ZXJmYWNlICMlZCBpcyBub3QgdmFsaWQgKDIpXG4iLCBhYzk3LT5udW0pOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQUMnOTcgaW50ZXJmYWNlICMlZCBpcyBub3QgdmFsaWQgKDIpXG4iLCBhYzk3LT5udW0pOwogCXJldHVybiAwOwogCiAgb2szOgpAQCAtMTEwMCw4ICsxMTAwLDggQEAKIAogCWlmICh3YWl0X2Zvcl9jb2RlYyhjaGlwLCAwLCBBQzk3X1JFU0VULCBtc2Vjc190b19qaWZmaWVzKDc1MCkpIDwgMCkKIAkJaWYgKCFyZXN1bWUpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJQcmltYXJ5IEFDJzk3IGNvZGVjIG5vdCBmb3VuZCwgIgotCQkJCQkgICAgImFzc3VtZSBTRjY0LVBDUiAodHVuZXItb25seSlcbiIpOworCQkJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSAiUHJpbWFyeSBBQyc5NyBjb2RlYyBub3QgZm91bmQsIGFzc3VtZSBTRjY0LVBDUiAodHVuZXItb25seSlcbiIpOwogCQkJY2hpcC0+dGVhNTc1eF90dW5lciA9IDMgfCBUVU5FUl9PTkxZOwogCQkJZ290byBfX2FjOTdfb2s7CiAJCX0KQEAgLTEyMjUsNyArMTIyNSw3IEBACiAJaWYgKCh0ZWE1NzV4X3R1bmVyICYgVFVORVJfT05MWSkgPT0gMCkgewogCQlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9mbTgwMV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBjaGlwLT5pcnEpOworCQkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIGNoaXAtPmlycSk7CiAJCQlzbmRfZm04MDFfZnJlZShjaGlwKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KQEAgLTEyNTEsOCArMTI1MSw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAjaWZkZWYgQ09ORklHX1NORF9GTTgwMV9URUE1NzVYX0JPT0wKIAllcnIgPSB2NGwyX2RldmljZV9yZWdpc3RlcigmcGNpLT5kZXYsICZjaGlwLT52NGwyX2Rldik7CiAJaWYgKGVyciA8IDApIHsKQEAgLTEyNjcsNyArMTI2NSw3IEBACiAJaWYgKCh0ZWE1NzV4X3R1bmVyICYgVFVORVJfVFlQRV9NQVNLKSA+IDAgJiYKIAkgICAgKHRlYTU3NXhfdHVuZXIgJiBUVU5FUl9UWVBFX01BU0spIDwgNCkgewogCQlpZiAoc25kX3RlYTU3NXhfaW5pdCgmY2hpcC0+dGVhLCBUSElTX01PRFVMRSkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIlRFQTU3NXggcmFkaW8gbm90IGZvdW5kXG4iKTsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LCAiVEVBNTc1eCByYWRpbyBub3QgZm91bmRcbiIpOwogCQkJc25kX2ZtODAxX2ZyZWUoY2hpcCk7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQpAQCAtMTI3NiwxMyArMTI3NCwxNCBAQAogCQlmb3IgKHRlYTU3NXhfdHVuZXIgPSAxOyB0ZWE1NzV4X3R1bmVyIDw9IDM7IHRlYTU3NXhfdHVuZXIrKykgewogCQkJY2hpcC0+dGVhNTc1eF90dW5lciA9IHRlYTU3NXhfdHVuZXI7CiAJCQlpZiAoIXNuZF90ZWE1NzV4X2luaXQoJmNoaXAtPnRlYSwgVEhJU19NT0RVTEUpKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0lORk8gImRldGVjdGVkIFRFQTU3NXggcmFkaW8gdHlwZSAlc1xuIiwKKwkJCQlkZXZfaW5mbyhjYXJkLT5kZXYsCisJCQkJCSAiZGV0ZWN0ZWQgVEVBNTc1eCByYWRpbyB0eXBlICVzXG4iLAogCQkJCQkgICBnZXRfdGVhNTc1eF9ncGlvKGNoaXApLT5uYW1lKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQogCQlpZiAodGVhNTc1eF90dW5lciA9PSA0KSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJURUE1NzV4IHJhZGlvIG5vdCBmb3VuZFxuIik7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwgIlRFQTU3NXggcmFkaW8gbm90IGZvdW5kXG4iKTsKIAkJCWNoaXAtPnRlYTU3NXhfdHVuZXIgPSBUVU5FUl9ESVNBQkxFRDsKIAkJfQogCX0KQEAgLTEzMTIsNyArMTMxMSw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWlmICgoZXJyID0gc25kX2ZtODAxX2NyZWF0ZShjYXJkLCBwY2ksIHRlYTU3NXhfdHVuZXJbZGV2XSwgcmFkaW9fbnJbZGV2XSwgJmNoaXApKSA8IDApIHsKQEAgLTE0MTEsOCArMTQxMSw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJmbTgwMTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9LY29uZmlnIGIvc291bmQvcGNpL2hkYS9LY29uZmlnCmluZGV4IDBlNTM2MzQuLmFjMTdjM2YgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvS2NvbmZpZworKysgYi9zb3VuZC9wY2kvaGRhL0tjb25maWcKQEAgLTEsOCArMSwxNSBAQAotbWVudWNvbmZpZyBTTkRfSERBX0lOVEVMCi0JdHJpc3RhdGUgIkludGVsIEhEIEF1ZGlvIgorbWVudSAiSEQtQXVkaW8iCisKK2NvbmZpZyBTTkRfSERBCisJdHJpc3RhdGUKIAlzZWxlY3QgU05EX1BDTQogCXNlbGVjdCBTTkRfVk1BU1RFUgogCXNlbGVjdCBTTkRfS0NUTF9KQUNLCisKK2NvbmZpZyBTTkRfSERBX0lOVEVMCisJdHJpc3RhdGUgIkhEIEF1ZGlvIFBDSSIKKwlkZXBlbmRzIG9uIFNORF9QQ0kKKwlzZWxlY3QgU05EX0hEQQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBJbnRlbCAiSGlnaCBEZWZpbml0aW9uCiAJICBBdWRpbyIgKEF6YWxpYSkgYW5kIGl0cyBjb21wYXRpYmxlIGRldmljZXMuCkBAIC0xMyw3ICsyMCw3IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBzbmQtaGRhLWludGVsLgogCi1pZiBTTkRfSERBX0lOVEVMCitpZiBTTkRfSERBCiAKIGNvbmZpZyBTTkRfSERBX0RTUF9MT0FERVIKIAlib29sCkBAIC00MSw3ICs0OCw2IEBACiAKIGNvbmZpZyBTTkRfSERBX1JFQ09ORklHCiAJYm9vbCAiQWxsb3cgZHluYW1pYyBjb2RlYyByZWNvbmZpZ3VyYXRpb24iCi0JZGVwZW5kcyBvbiBTTkRfSERBX0hXREVQCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIEhELWF1ZGlvIGNvZGVjIHJlLWNvbmZpZ3VyYXRpb24gZmVhdHVyZS4KIAkgIFRoaXMgYWRkcyB0aGUgc3lzZnMgaW50ZXJmYWNlcyB0byBhbGxvdyB1c2VyIHRvIGNsZWFyIHRoZSB3aG9sZQpAQCAtNTAsNyArNTYsNyBAQAogCiBjb25maWcgU05EX0hEQV9JTlBVVF9CRUVQCiAJYm9vbCAiU3VwcG9ydCBkaWdpdGFsIGJlZXAgdmlhIGlucHV0IGxheWVyIgotCWRlcGVuZHMgb24gSU5QVVQ9eSB8fCBJTlBVVD1TTkRfSERBX0lOVEVMCisJZGVwZW5kcyBvbiBJTlBVVD15IHx8IElOUFVUPVNORF9IREEKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGJ1aWxkIGEgZGlnaXRhbCBiZWVwIGludGVyZmFjZSBmb3IgSEQtYXVkaW8KIAkgIGRyaXZlci4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBnZW5lcmF0ZSBkaWdpdGFsIGJlZXBzLgpAQCAtNzYsNyArODIsNiBAQAogY29uZmlnIFNORF9IREFfUEFUQ0hfTE9BREVSCiAJYm9vbCAiU3VwcG9ydCBpbml0aWFsaXphdGlvbiBwYXRjaCBsb2FkaW5nIGZvciBIRC1hdWRpbyIKIAlzZWxlY3QgRldfTE9BREVSCi0Jc2VsZWN0IFNORF9IREFfSFdERVAKIAlzZWxlY3QgU05EX0hEQV9SRUNPTkZJRwogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gYWxsb3cgdGhlIEhELWF1ZGlvIGRyaXZlciB0byBsb2FkIGEgcHNldWRvCkBAIC04NCw4ICs4OSw2IEBACiAJICBzdGFydCB1cC4gIFRoZSAicGF0Y2giIGZpbGUgY2FuIGJlIHNwZWNpZmllZCB2aWEgcGF0Y2ggbW9kdWxlCiAJICBvcHRpb24sIHN1Y2ggYXMgcGF0Y2g9aGRhLWluaXQuCiAKLQkgIFRoaXMgb3B0aW9uIHR1cm5zIG9uIGh3ZGVwIGFuZCByZWNvbmZpZyBmZWF0dXJlcyBhdXRvbWF0aWNhbGx5LgotCiBjb25maWcgU05EX0hEQV9DT0RFQ19SRUFMVEVLCiAJdHJpc3RhdGUgIkJ1aWxkIFJlYWx0ZWsgSEQtYXVkaW8gY29kZWMgc3VwcG9ydCIKIAlzZWxlY3QgU05EX0hEQV9HRU5FUklDCkBAIC05NCw3ICs5Nyw3IEBACiAJICBzbmQtaGRhLWludGVsIGRyaXZlciwgc3VjaCBhcyBBTEM4ODAuCiAKIGNvbW1lbnQgIlNldCB0byBZIGlmIHlvdSB3YW50IGF1dG8tbG9hZGluZyB0aGUgY29kZWMgZHJpdmVyIgotCWRlcGVuZHMgb24gU05EX0hEQV9JTlRFTD15ICYmIFNORF9IREFfQ09ERUNfUkVBTFRFSz1tCisJZGVwZW5kcyBvbiBTTkRfSERBPXkgJiYgU05EX0hEQV9DT0RFQ19SRUFMVEVLPW0KIAogY29uZmlnIFNORF9IREFfQ09ERUNfQU5BTE9HCiAJdHJpc3RhdGUgIkJ1aWxkIEFuYWxvZyBEZXZpY2UgSEQtYXVkaW8gY29kZWMgc3VwcG9ydCIKQEAgLTEwNCw3ICsxMDcsNyBAQAogCSAgc25kLWhkYS1pbnRlbCBkcml2ZXIsIHN1Y2ggYXMgQUQxOTg2QS4KIAogY29tbWVudCAiU2V0IHRvIFkgaWYgeW91IHdhbnQgYXV0by1sb2FkaW5nIHRoZSBjb2RlYyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTTkRfSERBX0lOVEVMPXkgJiYgU05EX0hEQV9DT0RFQ19BTkFMT0c9bQorCWRlcGVuZHMgb24gU05EX0hEQT15ICYmIFNORF9IREFfQ09ERUNfQU5BTE9HPW0KIAogY29uZmlnIFNORF9IREFfQ09ERUNfU0lHTUFURUwKIAl0cmlzdGF0ZSAiQnVpbGQgSURUL1NpZ21hdGVsIEhELWF1ZGlvIGNvZGVjIHN1cHBvcnQiCkBAIC0xMTQsNyArMTE3LDcgQEAKIAkgIHNuZC1oZGEtaW50ZWwgZHJpdmVyLCBzdWNoIGFzIFNUQUM5MjAwLgogCiBjb21tZW50ICJTZXQgdG8gWSBpZiB5b3Ugd2FudCBhdXRvLWxvYWRpbmcgdGhlIGNvZGVjIGRyaXZlciIKLQlkZXBlbmRzIG9uIFNORF9IREFfSU5URUw9eSAmJiBTTkRfSERBX0NPREVDX1NJR01BVEVMPW0KKwlkZXBlbmRzIG9uIFNORF9IREE9eSAmJiBTTkRfSERBX0NPREVDX1NJR01BVEVMPW0KIAogY29uZmlnIFNORF9IREFfQ09ERUNfVklBCiAJdHJpc3RhdGUgIkJ1aWxkIFZJQSBIRC1hdWRpbyBjb2RlYyBzdXBwb3J0IgpAQCAtMTI0LDcgKzEyNyw3IEBACiAJICBzbmQtaGRhLWludGVsIGRyaXZlciwgc3VjaCBhcyBWVDE3MDguCiAKIGNvbW1lbnQgIlNldCB0byBZIGlmIHlvdSB3YW50IGF1dG8tbG9hZGluZyB0aGUgY29kZWMgZHJpdmVyIgotCWRlcGVuZHMgb24gU05EX0hEQV9JTlRFTD15ICYmIFNORF9IREFfQ09ERUNfVklBPW0KKwlkZXBlbmRzIG9uIFNORF9IREE9eSAmJiBTTkRfSERBX0NPREVDX1ZJQT1tCiAKIGNvbmZpZyBTTkRfSERBX0NPREVDX0hETUkKIAl0cmlzdGF0ZSAiQnVpbGQgSERNSS9EaXNwbGF5UG9ydCBIRC1hdWRpbyBjb2RlYyBzdXBwb3J0IgpAQCAtMTM0LDcgKzEzNyw3IEBACiAJICBJbnRlbCBhbmQgTnZpZGlhIEhETUkvRGlzcGxheVBvcnQgY29kZWNzLgogCiBjb21tZW50ICJTZXQgdG8gWSBpZiB5b3Ugd2FudCBhdXRvLWxvYWRpbmcgdGhlIGNvZGVjIGRyaXZlciIKLQlkZXBlbmRzIG9uIFNORF9IREFfSU5URUw9eSAmJiBTTkRfSERBX0NPREVDX0hETUk9bQorCWRlcGVuZHMgb24gU05EX0hEQT15ICYmIFNORF9IREFfQ09ERUNfSERNST1tCiAKIGNvbmZpZyBTTkRfSERBX0k5MTUKIAlib29sCkBAIC0xNDksNyArMTUyLDcgQEAKIAkgIHNuZC1oZGEtaW50ZWwgZHJpdmVyLCBzdWNoIGFzIENTNDIwNi4KIAogY29tbWVudCAiU2V0IHRvIFkgaWYgeW91IHdhbnQgYXV0by1sb2FkaW5nIHRoZSBjb2RlYyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTTkRfSERBX0lOVEVMPXkgJiYgU05EX0hEQV9DT0RFQ19DSVJSVVM9bQorCWRlcGVuZHMgb24gU05EX0hEQT15ICYmIFNORF9IREFfQ09ERUNfQ0lSUlVTPW0KIAogY29uZmlnIFNORF9IREFfQ09ERUNfQ09ORVhBTlQKIAl0cmlzdGF0ZSAiQnVpbGQgQ29uZXhhbnQgSEQtYXVkaW8gY29kZWMgc3VwcG9ydCIKQEAgLTE1OSw3ICsxNjIsNyBAQAogCSAgc25kLWhkYS1pbnRlbCBkcml2ZXIsIHN1Y2ggYXMgQ1gyMDU0OS4KIAogY29tbWVudCAiU2V0IHRvIFkgaWYgeW91IHdhbnQgYXV0by1sb2FkaW5nIHRoZSBjb2RlYyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTTkRfSERBX0lOVEVMPXkgJiYgU05EX0hEQV9DT0RFQ19DT05FWEFOVD1tCisJZGVwZW5kcyBvbiBTTkRfSERBPXkgJiYgU05EX0hEQV9DT0RFQ19DT05FWEFOVD1tCiAKIGNvbmZpZyBTTkRfSERBX0NPREVDX0NBMDExMAogCXRyaXN0YXRlICJCdWlsZCBDcmVhdGl2ZSBDQTAxMTAtSUJHIGNvZGVjIHN1cHBvcnQiCkBAIC0xNjksNyArMTcyLDcgQEAKIAkgIHNuZC1oZGEtaW50ZWwgZHJpdmVyLCBmb3VuZCBvbiBzb21lIENyZWF0aXZlIFgtRmkgY2FyZHMuCiAKIGNvbW1lbnQgIlNldCB0byBZIGlmIHlvdSB3YW50IGF1dG8tbG9hZGluZyB0aGUgY29kZWMgZHJpdmVyIgotCWRlcGVuZHMgb24gU05EX0hEQV9JTlRFTD15ICYmIFNORF9IREFfQ09ERUNfQ0EwMTEwPW0KKwlkZXBlbmRzIG9uIFNORF9IREE9eSAmJiBTTkRfSERBX0NPREVDX0NBMDExMD1tCiAKIGNvbmZpZyBTTkRfSERBX0NPREVDX0NBMDEzMgogCXRyaXN0YXRlICJCdWlsZCBDcmVhdGl2ZSBDQTAxMzIgY29kZWMgc3VwcG9ydCIKQEAgLTE3OCw3ICsxODEsNyBAQAogCSAgc25kLWhkYS1pbnRlbCBkcml2ZXIuCiAKIGNvbW1lbnQgIlNldCB0byBZIGlmIHlvdSB3YW50IGF1dG8tbG9hZGluZyB0aGUgY29kZWMgZHJpdmVyIgotCWRlcGVuZHMgb24gU05EX0hEQV9JTlRFTD15ICYmIFNORF9IREFfQ09ERUNfQ0EwMTMyPW0KKwlkZXBlbmRzIG9uIFNORF9IREE9eSAmJiBTTkRfSERBX0NPREVDX0NBMDEzMj1tCiAKIGNvbmZpZyBTTkRfSERBX0NPREVDX0NBMDEzMl9EU1AKIAlib29sICJTdXBwb3J0IG5ldyBEU1AgY29kZSBmb3IgQ0EwMTMyIGNvZGVjIgpAQCAtMjAwLDcgKzIwMyw3IEBACiAJICBzbmQtaGRhLWludGVsIGRyaXZlciwgc3VjaCBhcyBDTUk5ODgwLgogCiBjb21tZW50ICJTZXQgdG8gWSBpZiB5b3Ugd2FudCBhdXRvLWxvYWRpbmcgdGhlIGNvZGVjIGRyaXZlciIKLQlkZXBlbmRzIG9uIFNORF9IREFfSU5URUw9eSAmJiBTTkRfSERBX0NPREVDX0NNRURJQT1tCisJZGVwZW5kcyBvbiBTTkRfSERBPXkgJiYgU05EX0hEQV9DT0RFQ19DTUVESUE9bQogCiBjb25maWcgU05EX0hEQV9DT0RFQ19TSTMwNTQKIAl0cmlzdGF0ZSAiQnVpbGQgU2lsaWNvbiBMYWJzIDMwNTQgSEQtbW9kZW0gY29kZWMgc3VwcG9ydCIKQEAgLTIwOSw3ICsyMTIsNyBAQAogCSAgKGFuZCBjb21wYXRpYmxlcykgc3VwcG9ydCBpbiBzbmQtaGRhLWludGVsIGRyaXZlci4KIAogY29tbWVudCAiU2V0IHRvIFkgaWYgeW91IHdhbnQgYXV0by1sb2FkaW5nIHRoZSBjb2RlYyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTTkRfSERBX0lOVEVMPXkgJiYgU05EX0hEQV9DT0RFQ19TSTMwNTQ9bQorCWRlcGVuZHMgb24gU05EX0hEQT15ICYmIFNORF9IREFfQ09ERUNfU0kzMDU0PW0KIAogY29uZmlnIFNORF9IREFfR0VORVJJQwogCXRyaXN0YXRlICJFbmFibGUgZ2VuZXJpYyBIRC1hdWRpbyBjb2RlYyBwYXJzZXIiCkBAIC0yMTgsNyArMjIxLDcgQEAKIAkgIGluIHNuZC1oZGEtaW50ZWwgZHJpdmVyLgogCiBjb21tZW50ICJTZXQgdG8gWSBpZiB5b3Ugd2FudCBhdXRvLWxvYWRpbmcgdGhlIGNvZGVjIGRyaXZlciIKLQlkZXBlbmRzIG9uIFNORF9IREFfSU5URUw9eSAmJiBTTkRfSERBX0dFTkVSSUM9bQorCWRlcGVuZHMgb24gU05EX0hEQT15ICYmIFNORF9IREFfR0VORVJJQz1tCiAKIGNvbmZpZyBTTkRfSERBX1BPV0VSX1NBVkVfREVGQVVMVAogCWludCAiRGVmYXVsdCB0aW1lLW91dCBmb3IgSEQtYXVkaW8gcG93ZXItc2F2ZSBtb2RlIgpAQCAtMjI5LDMgKzIzMiw1IEBACiAJICBwb3dlci1zYXZlIG1vZGUuICAwIG1lYW5zIHRvIGRpc2FibGUgdGhlIHBvd2VyLXNhdmUgbW9kZS4KIAogZW5kaWYKKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9NYWtlZmlsZSBiL3NvdW5kL3BjaS9oZGEvTWFrZWZpbGUKaW5kZXggMWZjYjExOC4uZDBkMGMxOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9NYWtlZmlsZQorKysgYi9zb3VuZC9wY2kvaGRhL01ha2VmaWxlCkBAIC0xLDE1ICsxLDE2IEBACiBzbmQtaGRhLWludGVsLW9ianMgOj0gaGRhX2ludGVsLm8KK3NuZC1oZGEtY29udHJvbGxlci1vYmpzIDo9IGhkYV9jb250cm9sbGVyLm8KICMgZm9yIGhhc3dlbGwgcG93ZXIgd2VsbAogc25kLWhkYS1pbnRlbC0kKENPTkZJR19TTkRfSERBX0k5MTUpICs9CWhkYV9pOTE1Lm8KIAotc25kLWhkYS1jb2RlYy15IDo9IGhkYV9jb2RlYy5vIGhkYV9qYWNrLm8gaGRhX2F1dG9fcGFyc2VyLm8KK3NuZC1oZGEtY29kZWMteSA6PSBoZGFfY29kZWMubyBoZGFfamFjay5vIGhkYV9hdXRvX3BhcnNlci5vIGhkYV9zeXNmcy5vCiBzbmQtaGRhLWNvZGVjLSQoQ09ORklHX1BST0NfRlMpICs9IGhkYV9wcm9jLm8KIHNuZC1oZGEtY29kZWMtJChDT05GSUdfU05EX0hEQV9IV0RFUCkgKz0gaGRhX2h3ZGVwLm8KIHNuZC1oZGEtY29kZWMtJChDT05GSUdfU05EX0hEQV9JTlBVVF9CRUVQKSArPSBoZGFfYmVlcC5vCiAKICMgZm9yIHRyYWNlLXBvaW50cwogQ0ZMQUdTX2hkYV9jb2RlYy5vIDo9IC1JJChzcmMpCi1DRkxBR1NfaGRhX2ludGVsLm8gOj0gLUkkKHNyYykKK0NGTEFHU19oZGFfY29udHJvbGxlci5vIDo9IC1JJChzcmMpCiAKIHNuZC1oZGEtY29kZWMtZ2VuZXJpYy1vYmpzIDo9CWhkYV9nZW5lcmljLm8KIHNuZC1oZGEtY29kZWMtcmVhbHRlay1vYmpzIDo9CXBhdGNoX3JlYWx0ZWsubwpAQCAtMjUsNyArMjYsOCBAQAogc25kLWhkYS1jb2RlYy1oZG1pLW9ianMgOj0JcGF0Y2hfaGRtaS5vIGhkYV9lbGQubwogCiAjIGNvbW1vbiBkcml2ZXIKLW9iai0kKENPTkZJR19TTkRfSERBX0lOVEVMKSA6PSBzbmQtaGRhLWNvZGVjLm8KK29iai0kKENPTkZJR19TTkRfSERBKSA6PSBzbmQtaGRhLWNvZGVjLm8KK29iai0kKENPTkZJR19TTkRfSERBKSArPSBzbmQtaGRhLWNvbnRyb2xsZXIubwogCiAjIGNvZGVjIGRyaXZlcnMKIG9iai0kKENPTkZJR19TTkRfSERBX0dFTkVSSUMpICs9IHNuZC1oZGEtY29kZWMtZ2VuZXJpYy5vCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9hdXRvX3BhcnNlci5jIGIvc291bmQvcGNpL2hkYS9oZGFfYXV0b19wYXJzZXIuYwppbmRleCA0N2FkMzFjLi45MGQyZmRhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9hdXRvX3BhcnNlci5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2F1dG9fcGFyc2VyLmMKQEAgLTIyNywxMCArMjI3LDE4IEBACiAJCQkJY29udGludWU7CiAJCQlpZiAoIWFzc29jX2xpbmVfb3V0KQogCQkJCWFzc29jX2xpbmVfb3V0ID0gYXNzb2M7Ci0JCQllbHNlIGlmIChhc3NvY19saW5lX291dCAhPSBhc3NvYykKKwkJCWVsc2UgaWYgKGFzc29jX2xpbmVfb3V0ICE9IGFzc29jKSB7CisJCQkJY29kZWNfaW5mbyhjb2RlYywKKwkJCQkJICAgImlnbm9yZSBwaW4gMHgleCB3aXRoIG1pc21hdGNoaW5nIGFzc29jIyAweCV4IHZzIDB4JXhcbiIsCisJCQkJCSAgIG5pZCwgYXNzb2MsIGFzc29jX2xpbmVfb3V0KTsKIAkJCQljb250aW51ZTsKLQkJCWlmIChjZmctPmxpbmVfb3V0cyA+PSBBUlJBWV9TSVpFKGNmZy0+bGluZV9vdXRfcGlucykpCisJCQl9CisJCQlpZiAoY2ZnLT5saW5lX291dHMgPj0gQVJSQVlfU0laRShjZmctPmxpbmVfb3V0X3BpbnMpKSB7CisJCQkJY29kZWNfaW5mbyhjb2RlYywKKwkJCQkJICAgImlnbm9yZSBwaW4gMHgleCwgdG9vIG1hbnkgYXNzaWduZWQgcGluc1xuIiwKKwkJCQkJICAgbmlkKTsKIAkJCQljb250aW51ZTsKKwkJCX0KIAkJCWxpbmVfb3V0W2NmZy0+bGluZV9vdXRzXS5waW4gPSBuaWQ7CiAJCQlsaW5lX291dFtjZmctPmxpbmVfb3V0c10uc2VxID0gc2VxOwogCQkJY2ZnLT5saW5lX291dHMrKzsKQEAgLTIzOCw4ICsyNDYsMTIgQEAKIAkJY2FzZSBBQ19KQUNLX1NQRUFLRVI6CiAJCQlzZXEgPSBnZXRfZGVmY2ZnX3NlcXVlbmNlKGRlZl9jb25mKTsKIAkJCWFzc29jID0gZ2V0X2RlZmNmZ19hc3NvY2lhdGlvbihkZWZfY29uZik7Ci0JCQlpZiAoY2ZnLT5zcGVha2VyX291dHMgPj0gQVJSQVlfU0laRShjZmctPnNwZWFrZXJfcGlucykpCisJCQlpZiAoY2ZnLT5zcGVha2VyX291dHMgPj0gQVJSQVlfU0laRShjZmctPnNwZWFrZXJfcGlucykpIHsKKwkJCQljb2RlY19pbmZvKGNvZGVjLAorCQkJCQkgICAiaWdub3JlIHBpbiAweCV4LCB0b28gbWFueSBhc3NpZ25lZCBwaW5zXG4iLAorCQkJCQkgICBuaWQpOwogCQkJCWNvbnRpbnVlOworCQkJfQogCQkJc3BlYWtlcl9vdXRbY2ZnLT5zcGVha2VyX291dHNdLnBpbiA9IG5pZDsKIAkJCXNwZWFrZXJfb3V0W2NmZy0+c3BlYWtlcl9vdXRzXS5zZXEgPSAoYXNzb2MgPDwgNCkgfCBzZXE7CiAJCQljZmctPnNwZWFrZXJfb3V0cysrOwpAQCAtMjQ3LDggKzI1OSwxMiBAQAogCQljYXNlIEFDX0pBQ0tfSFBfT1VUOgogCQkJc2VxID0gZ2V0X2RlZmNmZ19zZXF1ZW5jZShkZWZfY29uZik7CiAJCQlhc3NvYyA9IGdldF9kZWZjZmdfYXNzb2NpYXRpb24oZGVmX2NvbmYpOwotCQkJaWYgKGNmZy0+aHBfb3V0cyA+PSBBUlJBWV9TSVpFKGNmZy0+aHBfcGlucykpCisJCQlpZiAoY2ZnLT5ocF9vdXRzID49IEFSUkFZX1NJWkUoY2ZnLT5ocF9waW5zKSkgeworCQkJCWNvZGVjX2luZm8oY29kZWMsCisJCQkJCSAgICJpZ25vcmUgcGluIDB4JXgsIHRvbyBtYW55IGFzc2lnbmVkIHBpbnNcbiIsCisJCQkJCSAgIG5pZCk7CiAJCQkJY29udGludWU7CisJCQl9CiAJCQlocF9vdXRbY2ZnLT5ocF9vdXRzXS5waW4gPSBuaWQ7CiAJCQlocF9vdXRbY2ZnLT5ocF9vdXRzXS5zZXEgPSAoYXNzb2MgPDwgNCkgfCBzZXE7CiAJCQljZmctPmhwX291dHMrKzsKQEAgLTI2Nyw4ICsyODMsMTIgQEAKIAkJCWJyZWFrOwogCQljYXNlIEFDX0pBQ0tfU1BESUZfT1VUOgogCQljYXNlIEFDX0pBQ0tfRElHX09USEVSX09VVDoKLQkJCWlmIChjZmctPmRpZ19vdXRzID49IEFSUkFZX1NJWkUoY2ZnLT5kaWdfb3V0X3BpbnMpKQorCQkJaWYgKGNmZy0+ZGlnX291dHMgPj0gQVJSQVlfU0laRShjZmctPmRpZ19vdXRfcGlucykpIHsKKwkJCQljb2RlY19pbmZvKGNvZGVjLAorCQkJCQkgICAiaWdub3JlIHBpbiAweCV4LCB0b28gbWFueSBhc3NpZ25lZCBwaW5zXG4iLAorCQkJCQkgICBuaWQpOwogCQkJCWNvbnRpbnVlOworCQkJfQogCQkJY2ZnLT5kaWdfb3V0X3BpbnNbY2ZnLT5kaWdfb3V0c10gPSBuaWQ7CiAJCQljZmctPmRpZ19vdXRfdHlwZVtjZmctPmRpZ19vdXRzXSA9CiAJCQkJKGxvYyA9PSBBQ19KQUNLX0xPQ19IRE1JKSA/CkBAIC0zMTMsOSArMzMzLDkgQEAKIAkJfQogCiAJCWlmIChoc21pYykKLQkJCXNuZF9wcmludGRkKCJUb2xkIHRvIGxvb2sgZm9yIGEgaGVhZHNldCBtaWMsIGJ1dCBkaWRuJ3QgZmluZCBhbnkuXG4iKTsKKwkJCWNvZGVjX2RiZyhjb2RlYywgIlRvbGQgdG8gbG9vayBmb3IgYSBoZWFkc2V0IG1pYywgYnV0IGRpZG4ndCBmaW5kIGFueS5cbiIpOwogCQlpZiAoaHBtaWMpCi0JCQlzbmRfcHJpbnRkZCgiVG9sZCB0byBsb29rIGZvciBhIGhlYWRwaG9uZSBtaWMsIGJ1dCBkaWRuJ3QgZmluZCBhbnkuXG4iKTsKKwkJCWNvZGVjX2RiZyhjb2RlYywgIlRvbGQgdG8gbG9vayBmb3IgYSBoZWFkcGhvbmUgbWljLCBidXQgZGlkbid0IGZpbmQgYW55LlxuIik7CiAJfQogCiAJLyogRklYLVVQOgpAQCAtMzg0LDMzICs0MDQsMzMgQEAKIAkvKgogCSAqIGRlYnVnIHByaW50cyBvZiB0aGUgcGFyc2VkIHJlc3VsdHMKIAkgKi8KLQlzbmRfcHJpbnRkKCJhdXRvY29uZmlnOiBsaW5lX291dHM9JWQgKDB4JXgvMHgleC8weCV4LzB4JXgvMHgleCkgdHlwZTolc1xuIiwKKwljb2RlY19pbmZvKGNvZGVjLCAiYXV0b2NvbmZpZzogbGluZV9vdXRzPSVkICgweCV4LzB4JXgvMHgleC8weCV4LzB4JXgpIHR5cGU6JXNcbiIsCiAJCSAgIGNmZy0+bGluZV9vdXRzLCBjZmctPmxpbmVfb3V0X3BpbnNbMF0sIGNmZy0+bGluZV9vdXRfcGluc1sxXSwKIAkJICAgY2ZnLT5saW5lX291dF9waW5zWzJdLCBjZmctPmxpbmVfb3V0X3BpbnNbM10sCiAJCSAgIGNmZy0+bGluZV9vdXRfcGluc1s0XSwKIAkJICAgY2ZnLT5saW5lX291dF90eXBlID09IEFVVE9fUElOX0hQX09VVCA/ICJocCIgOgogCQkgICAoY2ZnLT5saW5lX291dF90eXBlID09IEFVVE9fUElOX1NQRUFLRVJfT1VUID8KIAkJICAgICJzcGVha2VyIiA6ICJsaW5lIikpOwotCXNuZF9wcmludGQoIiAgIHNwZWFrZXJfb3V0cz0lZCAoMHgleC8weCV4LzB4JXgvMHgleC8weCV4KVxuIiwKKwljb2RlY19pbmZvKGNvZGVjLCAiICAgc3BlYWtlcl9vdXRzPSVkICgweCV4LzB4JXgvMHgleC8weCV4LzB4JXgpXG4iLAogCQkgICBjZmctPnNwZWFrZXJfb3V0cywgY2ZnLT5zcGVha2VyX3BpbnNbMF0sCiAJCSAgIGNmZy0+c3BlYWtlcl9waW5zWzFdLCBjZmctPnNwZWFrZXJfcGluc1syXSwKIAkJICAgY2ZnLT5zcGVha2VyX3BpbnNbM10sIGNmZy0+c3BlYWtlcl9waW5zWzRdKTsKLQlzbmRfcHJpbnRkKCIgICBocF9vdXRzPSVkICgweCV4LzB4JXgvMHgleC8weCV4LzB4JXgpXG4iLAorCWNvZGVjX2luZm8oY29kZWMsICIgICBocF9vdXRzPSVkICgweCV4LzB4JXgvMHgleC8weCV4LzB4JXgpXG4iLAogCQkgICBjZmctPmhwX291dHMsIGNmZy0+aHBfcGluc1swXSwKIAkJICAgY2ZnLT5ocF9waW5zWzFdLCBjZmctPmhwX3BpbnNbMl0sCiAJCSAgIGNmZy0+aHBfcGluc1szXSwgY2ZnLT5ocF9waW5zWzRdKTsKLQlzbmRfcHJpbnRkKCIgICBtb25vOiBtb25vX291dD0weCV4XG4iLCBjZmctPm1vbm9fb3V0X3Bpbik7CisJY29kZWNfaW5mbyhjb2RlYywgIiAgIG1vbm86IG1vbm9fb3V0PTB4JXhcbiIsIGNmZy0+bW9ub19vdXRfcGluKTsKIAlpZiAoY2ZnLT5kaWdfb3V0cykKLQkJc25kX3ByaW50ZCgiICAgZGlnLW91dD0weCV4LzB4JXhcbiIsCisJCWNvZGVjX2luZm8oY29kZWMsICIgICBkaWctb3V0PTB4JXgvMHgleFxuIiwKIAkJCSAgIGNmZy0+ZGlnX291dF9waW5zWzBdLCBjZmctPmRpZ19vdXRfcGluc1sxXSk7Ci0Jc25kX3ByaW50ZCgiICAgaW5wdXRzOlxuIik7CisJY29kZWNfaW5mbyhjb2RlYywgIiAgIGlucHV0czpcbiIpOwogCWZvciAoaSA9IDA7IGkgPCBjZmctPm51bV9pbnB1dHM7IGkrKykgewotCQlzbmRfcHJpbnRkKCIgICAgICVzPTB4JXhcbiIsCisJCWNvZGVjX2luZm8oY29kZWMsICIgICAgICVzPTB4JXhcbiIsCiAJCQkgICAgaGRhX2dldF9hdXRvY2ZnX2lucHV0X2xhYmVsKGNvZGVjLCBjZmcsIGkpLAogCQkJICAgIGNmZy0+aW5wdXRzW2ldLnBpbik7CiAJfQogCWlmIChjZmctPmRpZ19pbl9waW4pCi0JCXNuZF9wcmludGQoIiAgIGRpZy1pbj0weCV4XG4iLCBjZmctPmRpZ19pbl9waW4pOworCQljb2RlY19pbmZvKGNvZGVjLCAiICAgZGlnLWluPTB4JXhcbiIsIGNmZy0+ZGlnX2luX3Bpbik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc3NCwzOCArNzk0LDMzIEBACiAJCWNhc2UgSERBX0ZJWFVQX1BJTlM6CiAJCQlpZiAoYWN0aW9uICE9IEhEQV9GSVhVUF9BQ1RfUFJFX1BST0JFIHx8ICFmaXgtPnYucGlucykKIAkJCQlicmVhazsKLQkJCXNuZF9wcmludGRkKEtFUk5fSU5GTyBTRlgKLQkJCQkgICAgIiVzOiBBcHBseSBwaW5jZmcgZm9yICVzXG4iLAorCQkJY29kZWNfZGJnKGNvZGVjLCAiJXM6IEFwcGx5IHBpbmNmZyBmb3IgJXNcbiIsCiAJCQkJICAgIGNvZGVjLT5jaGlwX25hbWUsIG1vZGVsbmFtZSk7CiAJCQlzbmRfaGRhX2FwcGx5X3BpbmNmZ3MoY29kZWMsIGZpeC0+di5waW5zKTsKIAkJCWJyZWFrOwogCQljYXNlIEhEQV9GSVhVUF9WRVJCUzoKIAkJCWlmIChhY3Rpb24gIT0gSERBX0ZJWFVQX0FDVF9QUk9CRSB8fCAhZml4LT52LnZlcmJzKQogCQkJCWJyZWFrOwotCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPIFNGWAotCQkJCSAgICAiJXM6IEFwcGx5IGZpeC12ZXJicyBmb3IgJXNcbiIsCisJCQljb2RlY19kYmcoY29kZWMsICIlczogQXBwbHkgZml4LXZlcmJzIGZvciAlc1xuIiwKIAkJCQkgICAgY29kZWMtPmNoaXBfbmFtZSwgbW9kZWxuYW1lKTsKIAkJCXNuZF9oZGFfYWRkX3ZlcmJzKGNvZGVjLCBmaXgtPnYudmVyYnMpOwogCQkJYnJlYWs7CiAJCWNhc2UgSERBX0ZJWFVQX0ZVTkM6CiAJCQlpZiAoIWZpeC0+di5mdW5jKQogCQkJCWJyZWFrOwotCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPIFNGWAotCQkJCSAgICAiJXM6IEFwcGx5IGZpeC1mdW5jIGZvciAlc1xuIiwKKwkJCWNvZGVjX2RiZyhjb2RlYywgIiVzOiBBcHBseSBmaXgtZnVuYyBmb3IgJXNcbiIsCiAJCQkJICAgIGNvZGVjLT5jaGlwX25hbWUsIG1vZGVsbmFtZSk7CiAJCQlmaXgtPnYuZnVuYyhjb2RlYywgZml4LCBhY3Rpb24pOwogCQkJYnJlYWs7CiAJCWNhc2UgSERBX0ZJWFVQX1BJTkNUTFM6CiAJCQlpZiAoYWN0aW9uICE9IEhEQV9GSVhVUF9BQ1RfUFJPQkUgfHwgIWZpeC0+di5waW5zKQogCQkJCWJyZWFrOwotCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPIFNGWAotCQkJCSAgICAiJXM6IEFwcGx5IHBpbmN0bCBmb3IgJXNcbiIsCisJCQljb2RlY19kYmcoY29kZWMsICIlczogQXBwbHkgcGluY3RsIGZvciAlc1xuIiwKIAkJCQkgICAgY29kZWMtPmNoaXBfbmFtZSwgbW9kZWxuYW1lKTsKIAkJCXNldF9waW5fdGFyZ2V0cyhjb2RlYywgZml4LT52LnBpbnMpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWAotCQkJCSAgICIlczogSW52YWxpZCBmaXh1cCB0eXBlICVkXG4iLAorCQkJY29kZWNfZXJyKGNvZGVjLCAiJXM6IEludmFsaWQgZml4dXAgdHlwZSAlZFxuIiwKIAkJCQkgICBjb2RlYy0+Y2hpcF9uYW1lLCBmaXgtPnR5cGUpOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuYwppbmRleCAwNTg5YjM5Li44YzZjNTBhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5jCkBAIC0yMCw3ICsyMCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgpAQCAtMTQwLDcgKzEzOSwxMCBAQAogCiBzdGF0aWMgdm9pZCBzbmRfaGRhX2RvX2RldGFjaChzdHJ1Y3QgaGRhX2JlZXAgKmJlZXApCiB7Ci0JaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoYmVlcC0+ZGV2KTsKKwlpZiAoYmVlcC0+cmVnaXN0ZXJlZCkKKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoYmVlcC0+ZGV2KTsKKwllbHNlCisJCWlucHV0X2ZyZWVfZGV2aWNlKGJlZXAtPmRldik7CiAJYmVlcC0+ZGV2ID0gTlVMTDsKIAl0dXJuX29mZl9iZWVwKGJlZXApOwogfQpAQCAtMTQ5LDcgKzE1MSw2IEBACiB7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gYmVlcC0+Y29kZWM7Ci0JaW50IGVycjsKIAogCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmICghaW5wdXRfZGV2KQpAQCAtMTY3LDE1ICsxNjgsOSBAQAogCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9TTkQpOwogCWlucHV0X2Rldi0+c25kYml0WzBdID0gQklUX01BU0soU05EX0JFTEwpIHwgQklUX01BU0soU05EX1RPTkUpOwogCWlucHV0X2Rldi0+ZXZlbnQgPSBzbmRfaGRhX2JlZXBfZXZlbnQ7Ci0JaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJmNvZGVjLT5idXMtPnBjaS0+ZGV2OworCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZjb2RlYy0+ZGV2OwogCWlucHV0X3NldF9kcnZkYXRhKGlucHV0X2RldiwgYmVlcCk7CiAKLQllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKLQlpZiAoZXJyIDwgMCkgewotCQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwotCQlwcmludGsoS0VSTl9JTkZPICJoZGFfYmVlcDogdW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQogCWJlZXAtPmRldiA9IGlucHV0X2RldjsKIAlyZXR1cm4gMDsKIH0KQEAgLTI0NSw2ICsyNDAsMjcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfZGV0YWNoX2JlZXBfZGV2aWNlKTsKIAoraW50IHNuZF9oZGFfcmVnaXN0ZXJfYmVlcF9kZXZpY2Uoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGhkYV9iZWVwICpiZWVwID0gY29kZWMtPmJlZXA7CisJaW50IGVycjsKKworCWlmICghYmVlcCB8fCAhYmVlcC0+ZGV2KQorCQlyZXR1cm4gMDsKKworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShiZWVwLT5kZXYpOworCWlmIChlcnIgPCAwKSB7CisJCWNvZGVjX2Vycihjb2RlYywgImhkYV9iZWVwOiB1bmFibGUgdG8gcmVnaXN0ZXIgaW5wdXQgZGV2aWNlXG4iKTsKKwkJaW5wdXRfZnJlZV9kZXZpY2UoYmVlcC0+ZGV2KTsKKwkJY29kZWMtPmJlZXAgPSBOVUxMOworCQlrZnJlZShiZWVwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJYmVlcC0+cmVnaXN0ZXJlZCA9IHRydWU7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX3JlZ2lzdGVyX2JlZXBfZGV2aWNlKTsKKwogc3RhdGljIGJvb2wgY3RsX2hhc19tdXRlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sKQogewogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5oIGIvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5oCmluZGV4IGNiODg0NjQuLmE2M2I1ZTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuaAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmgKQEAgLTM0LDYgKzM0LDcgQEAKIAljaGFyIHBoeXNbMzJdOwogCWludCB0b25lOwogCWhkYV9uaWRfdCBuaWQ7CisJdW5zaWduZWQgaW50IHJlZ2lzdGVyZWQ6MTsKIAl1bnNpZ25lZCBpbnQgZW5hYmxlZDoxOwogCXVuc2lnbmVkIGludCBsaW5lYXJfdG9uZToxOwkvKiBsaW5lYXIgdG9uZSBmb3IgSURUL1NUQUMgY29kZWMgKi8KIAl1bnNpZ25lZCBpbnQgcGxheWluZzoxOwpAQCAtNDUsNiArNDYsNyBAQAogaW50IHNuZF9oZGFfZW5hYmxlX2JlZXBfZGV2aWNlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgZW5hYmxlKTsKIGludCBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IG5pZCk7CiB2b2lkIHNuZF9oZGFfZGV0YWNoX2JlZXBfZGV2aWNlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKK2ludCBzbmRfaGRhX3JlZ2lzdGVyX2JlZXBfZGV2aWNlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IG5pZCkKIHsKQEAgLTUzLDUgKzU1LDkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzbmRfaGRhX2RldGFjaF9iZWVwX2RldmljZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIH0KK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9oZGFfcmVnaXN0ZXJfYmVlcF9kZXZpY2Uoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMKaW5kZXggZGFmY2Y4Mi4uNGMyMDI3NyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KQEAgLTY4LDYgKzY3LDcgQEAKIAl7IDB4MTdlOCwgIkNocm9udGVsIiB9LAogCXsgMHgxODU0LCAiTEciIH0sCiAJeyAweDFhZWMsICJXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MiIH0sCisJeyAweDFhZjQsICJRRU1VIiB9LAogCXsgMHg0MzRkLCAiQy1NZWRpYSIgfSwKIAl7IDB4ODA4NiwgIkludGVsIiB9LAogCXsgMHg4Mzg0LCAiU2lnbWFUZWwiIH0sCkBAIC0yMDEsNyArMjAxLDcgQEAKIAogCWlmICgoY29kZWMtPmFkZHIgJiB+MHhmKSB8fCAobmlkICYgfjB4N2YpIHx8CiAJICAgICh2ZXJiICYgfjB4ZmZmKSB8fCAocGFybSAmIH4weGZmZmYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaGRhLWNvZGVjOiBvdXQgb2YgcmFuZ2UgY21kICV4OiV4OiV4OiV4XG4iLAorCQljb2RlY19lcnIoY29kZWMsICJoZGEtY29kZWM6IG91dCBvZiByYW5nZSBjbWQgJXg6JXg6JXg6JXhcbiIsCiAJCSAgICAgICBjb2RlYy0+YWRkciwgbmlkLCB2ZXJiLCBwYXJtKTsKIAkJcmV0dXJuIH4wOwogCX0KQEAgLTI0OSw4ICsyNDksOCBAQAogCXNuZF9oZGFfcG93ZXJfZG93bihjb2RlYyk7CiAJaWYgKCFjb2RlY19pbl9wbShjb2RlYykgJiYgcmVzICYmICpyZXMgPT0gLTEgJiYgYnVzLT5yaXJiX2Vycm9yKSB7CiAJCWlmIChidXMtPnJlc3BvbnNlX3Jlc2V0KSB7Ci0JCQlzbmRfcHJpbnRkKCJoZGFfY29kZWM6IHJlc2V0dGluZyBCVVMgZHVlIHRvICIKLQkJCQkgICAiZmF0YWwgY29tbXVuaWNhdGlvbiBlcnJvclxuIik7CisJCQljb2RlY19kYmcoY29kZWMsCisJCQkJICAicmVzZXR0aW5nIEJVUyBkdWUgdG8gZmF0YWwgY29tbXVuaWNhdGlvbiBlcnJvclxuIik7CiAJCQl0cmFjZV9oZGFfYnVzX3Jlc2V0KGJ1cyk7CiAJCQlidXMtPm9wcy5idXNfcmVzZXQoYnVzKTsKIAkJfQpAQCAtNDc1LDggKzQ3NSw3IEBACiAKIAlpZiAobGVuID4gMCAmJiBjb25uX2xpc3QpIHsKIAkJaWYgKGxlbiA+IG1heF9jb25ucykgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiAiCi0JCQkJICAgIlRvbyBtYW55IGNvbm5lY3Rpb25zICVkIGZvciBOSUQgMHgleFxuIiwKKwkJCWNvZGVjX2Vycihjb2RlYywgIlRvbyBtYW55IGNvbm5lY3Rpb25zICVkIGZvciBOSUQgMHgleFxuIiwKIAkJCQkgICBsZW4sIG5pZCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtNTc0LDggKzU3Myw4IEBACiAJCXJhbmdlX3ZhbCA9ICEhKHBhcm0gJiAoMSA8PCAoc2hpZnQtMSkpKTsgLyogcmFuZ2VzICovCiAJCXZhbCA9IHBhcm0gJiBtYXNrOwogCQlpZiAodmFsID09IDAgJiYgbnVsbF9jb3VudCsrKSB7ICAvKiBubyBzZWNvbmQgY2hhbmNlICovCi0JCQlzbmRfcHJpbnRkZCgiaGRhX2NvZGVjOiAiCi0JCQkJICAgImludmFsaWQgQ09OTkVDVF9MSVNUIHZlcmIgJXhbJWldOiV4XG4iLAorCQkJY29kZWNfZGJnKGNvZGVjLAorCQkJCSAgImludmFsaWQgQ09OTkVDVF9MSVNUIHZlcmIgJXhbJWldOiV4XG4iLAogCQkJCSAgICBuaWQsIGksIHBhcm0pOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTU4Myw3ICs1ODIsNyBAQAogCQlpZiAocmFuZ2VfdmFsKSB7CiAJCQkvKiByYW5nZXMgYmV0d2VlbiB0aGUgcHJldmlvdXMgYW5kIHRoaXMgb25lICovCiAJCQlpZiAoIXByZXZfbmlkIHx8IHByZXZfbmlkID49IHZhbCkgewotCQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJoZGFfY29kZWM6ICIKKwkJCQljb2RlY193YXJuKGNvZGVjLAogCQkJCQkgICAiaW52YWxpZCBkZXBfcmFuZ2VfdmFsICV4OiV4XG4iLAogCQkJCQkgICBwcmV2X25pZCwgdmFsKTsKIAkJCQljb250aW51ZTsKQEAgLTY2MCw3ICs2NTksNyBAQAogCWlmICghcmVjdXJzaXZlKQogCQlyZXR1cm4gLTE7CiAJaWYgKHJlY3Vyc2l2ZSA+IDEwKSB7Ci0JCXNuZF9wcmludGQoImhkYV9jb2RlYzogdG9vIGRlZXAgY29ubmVjdGlvbiBmb3IgMHgleFxuIiwgbmlkKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAidG9vIGRlZXAgY29ubmVjdGlvbiBmb3IgMHgleFxuIiwgbmlkKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlyZWN1cnNpdmUrKzsKQEAgLTgwOCw4ICs4MDcsNyBAQAogCiAJdW5zb2wgPSBremFsbG9jKHNpemVvZigqdW5zb2wpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVuc29sKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogIgotCQkJICAgImNhbid0IGFsbG9jYXRlIHVuc29saWNpdGVkIHF1ZXVlXG4iKTsKKwkJZGV2X2VycihidXMtPmNhcmQtPmRldiwgImNhbid0IGFsbG9jYXRlIHVuc29saWNpdGVkIHF1ZXVlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCUlOSVRfV09SSygmdW5zb2wtPndvcmssIHByb2Nlc3NfdW5zb2xfZXZlbnRzKTsKQEAgLTgyMSw1MSArODE5LDM2IEBACiAvKgogICogZGVzdHJ1Y3RvcgogICovCi1zdGF0aWMgdm9pZCBzbmRfaGRhX2NvZGVjX2ZyZWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwotCi1zdGF0aWMgaW50IHNuZF9oZGFfYnVzX2ZyZWUoc3RydWN0IGhkYV9idXMgKmJ1cykKK3N0YXRpYyB2b2lkIHNuZF9oZGFfYnVzX2ZyZWUoc3RydWN0IGhkYV9idXMgKmJ1cykKIHsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgKm47Ci0KIAlpZiAoIWJ1cykKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKKworCVdBUk5fT04oIWxpc3RfZW1wdHkoJmJ1cy0+Y29kZWNfbGlzdCkpOwogCWlmIChidXMtPndvcmtxKQogCQlmbHVzaF93b3JrcXVldWUoYnVzLT53b3JrcSk7CiAJaWYgKGJ1cy0+dW5zb2wpCiAJCWtmcmVlKGJ1cy0+dW5zb2wpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjb2RlYywgbiwgJmJ1cy0+Y29kZWNfbGlzdCwgbGlzdCkgewotCQlzbmRfaGRhX2NvZGVjX2ZyZWUoY29kZWMpOwotCX0KIAlpZiAoYnVzLT5vcHMucHJpdmF0ZV9mcmVlKQogCQlidXMtPm9wcy5wcml2YXRlX2ZyZWUoYnVzKTsKIAlpZiAoYnVzLT53b3JrcSkKIAkJZGVzdHJveV93b3JrcXVldWUoYnVzLT53b3JrcSk7CiAKIAlrZnJlZShidXMpOwotCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNuZF9oZGFfYnVzX2Rldl9mcmVlKHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IGhkYV9idXMgKmJ1cyA9IGRldmljZS0+ZGV2aWNlX2RhdGE7Ci0JYnVzLT5zaHV0ZG93biA9IDE7Ci0JcmV0dXJuIHNuZF9oZGFfYnVzX2ZyZWUoYnVzKTsKLX0KLQotI2lmZGVmIENPTkZJR19TTkRfSERBX0hXREVQCi1zdGF0aWMgaW50IHNuZF9oZGFfYnVzX2Rldl9yZWdpc3RlcihzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQotewotCXN0cnVjdCBoZGFfYnVzICpidXMgPSBkZXZpY2UtPmRldmljZV9kYXRhOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZidXMtPmNvZGVjX2xpc3QsIGxpc3QpIHsKLQkJc25kX2hkYV9od2RlcF9hZGRfc3lzZnMoY29kZWMpOwotCQlzbmRfaGRhX2h3ZGVwX2FkZF9wb3dlcl9zeXNmcyhjb2RlYyk7Ci0JfQorCXNuZF9oZGFfYnVzX2ZyZWUoZGV2aWNlLT5kZXZpY2VfZGF0YSk7CiAJcmV0dXJuIDA7CiB9Ci0jZWxzZQotI2RlZmluZSBzbmRfaGRhX2J1c19kZXZfcmVnaXN0ZXIJTlVMTAotI2VuZGlmCisKK3N0YXRpYyBpbnQgc25kX2hkYV9idXNfZGV2X2Rpc2Nvbm5lY3Qoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgaGRhX2J1cyAqYnVzID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlidXMtPnNodXRkb3duID0gMTsKKwlyZXR1cm4gMDsKK30KIAogLyoqCiAgKiBzbmRfaGRhX2J1c19uZXcgLSBjcmVhdGUgYSBIREEgYnVzCkBAIC04ODIsNyArODY1LDcgQEAKIAlzdHJ1Y3QgaGRhX2J1cyAqYnVzOwogCWludCBlcnI7CiAJc3RhdGljIHN0cnVjdCBzbmRfZGV2aWNlX29wcyBkZXZfb3BzID0gewotCQkuZGV2X3JlZ2lzdGVyID0gc25kX2hkYV9idXNfZGV2X3JlZ2lzdGVyLAorCQkuZGV2X2Rpc2Nvbm5lY3QgPSBzbmRfaGRhX2J1c19kZXZfZGlzY29ubmVjdCwKIAkJLmRldl9mcmVlID0gc25kX2hkYV9idXNfZGV2X2ZyZWUsCiAJfTsKIApAQCAtODk2LDcgKzg3OSw3IEBACiAKIAlidXMgPSBremFsbG9jKHNpemVvZigqYnVzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJ1cyA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbid0IGFsbG9jYXRlIHN0cnVjdCBoZGFfYnVzXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBzdHJ1Y3QgaGRhX2J1c1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtOTE1LDcgKzg5OCw3IEBACiAJCSAiaGQtYXVkaW8lZCIsIGNhcmQtPm51bWJlcik7CiAJYnVzLT53b3JrcSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKGJ1cy0+d29ya3FfbmFtZSk7CiAJaWYgKCFidXMtPndvcmtxKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBjcmVhdGUgd29ya3F1ZXVlICVzXG4iLAorCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBjcmVhdGUgd29ya3F1ZXVlICVzXG4iLAogCQkJICAgYnVzLT53b3JrcV9uYW1lKTsKIAkJa2ZyZWUoYnVzKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC05NTksNyArOTQyLDcgQEAKIAltdXRleF9sb2NrKCZwcmVzZXRfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodGJsLCAmaGRhX3ByZXNldF90YWJsZXMsIGxpc3QpIHsKIAkJaWYgKCF0cnlfbW9kdWxlX2dldCh0YmwtPm93bmVyKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiBjYW5ub3QgbW9kdWxlX2dldFxuIik7CisJCQljb2RlY19lcnIoY29kZWMsICJjYW5ub3QgbW9kdWxlX2dldFxuIik7CiAJCQljb250aW51ZTsKIAkJfQogCQlmb3IgKHByZXNldCA9IHRibC0+cHJlc2V0OyBwcmVzZXQtPmlkOyBwcmVzZXQrKykgewpAQCAtMTE4NSw3ICsxMTY4LDcgQEAKIHsKIAlzdHJ1Y3QgaGRhX3BpbmNmZyAqcGluOwogCi0jaWZkZWYgQ09ORklHX1NORF9IREFfSFdERVAKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRwogCXsKIAkJdW5zaWduZWQgaW50IGNmZyA9IDA7CiAJCW11dGV4X2xvY2soJmNvZGVjLT51c2VyX211dGV4KTsKQEAgLTEzMDAsNyArMTI4Myw3IEBACiBzdGF0aWMgdm9pZCBmcmVlX2luaXRfcGluY2ZncyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzbmRfYXJyYXlfZnJlZSgmY29kZWMtPmRyaXZlcl9waW5zKTsKLSNpZmRlZiBDT05GSUdfU05EX0hEQV9IV0RFUAorI2lmZGVmIENPTkZJR19TTkRfSERBX1JFQ09ORklHCiAJc25kX2FycmF5X2ZyZWUoJmNvZGVjLT51c2VyX3BpbnMpOwogI2VuZGlmCiAJc25kX2FycmF5X2ZyZWUoJmNvZGVjLT5pbml0X3BpbnMpOwpAQCAtMTM3NCw2ICsxMzU3LDcgQEAKIAlpZiAoY29kZWMtPnBhdGNoX29wcy5mcmVlKQogCQljb2RlYy0+cGF0Y2hfb3BzLmZyZWUoY29kZWMpOwogCWhkYV9jYWxsX3BtX25vdGlmeShjb2RlYywgZmFsc2UpOyAvKiBjYW5jZWwgbGVmdG92ZXIgcmVmY291bnRzICovCisJc25kX2hkYV9zeXNmc19jbGVhcihjb2RlYyk7CiAJdW5sb2FkX3BhcnNlcihjb2RlYyk7CiAJbW9kdWxlX3B1dChjb2RlYy0+b3duZXIpOwogCWZyZWVfaGRhX2NhY2hlKCZjb2RlYy0+YW1wX2NhY2hlKTsKQEAgLTEzODMsNyArMTM2Nyw3IEBACiAJa2ZyZWUoY29kZWMtPm1vZGVsbmFtZSk7CiAJa2ZyZWUoY29kZWMtPndjYXBzKTsKIAljb2RlYy0+YnVzLT5udW1fY29kZWNzLS07Ci0Ja2ZyZWUoY29kZWMpOworCXB1dF9kZXZpY2UoJmNvZGVjLT5kZXYpOwogfQogCiBzdGF0aWMgYm9vbCBzbmRfaGRhX2NvZGVjX2dldF9zdXBwb3J0ZWRfcHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCkBAIC0xMzkyLDYgKzEzNzYsMzggQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaGRhX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCQl1bnNpZ25lZCBpbnQgcG93ZXJfc3RhdGUpOwogCitzdGF0aWMgaW50IHNuZF9oZGFfY29kZWNfZGV2X3JlZ2lzdGVyKHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCWludCBlcnIgPSBkZXZpY2VfYWRkKCZjb2RlYy0+ZGV2KTsKKworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXNuZF9oZGFfcmVnaXN0ZXJfYmVlcF9kZXZpY2UoY29kZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZGFfY29kZWNfZGV2X2Rpc2Nvbm5lY3Qoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CisKKwlzbmRfaGRhX2RldGFjaF9iZWVwX2RldmljZShjb2RlYyk7CisJZGV2aWNlX2RlbCgmY29kZWMtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkYV9jb2RlY19kZXZfZnJlZShzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQoreworCXNuZF9oZGFfY29kZWNfZnJlZShkZXZpY2UtPmRldmljZV9kYXRhKTsKKwlyZXR1cm4gMDsKK30KKworLyoganVzdCBmcmVlIHRoZSBjb250YWluZXIgKi8KK3N0YXRpYyB2b2lkIHNuZF9oZGFfY29kZWNfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCWtmcmVlKGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBoZGFfY29kZWMsIGRldikpOworfQorCiAvKioKICAqIHNuZF9oZGFfY29kZWNfbmV3IC0gY3JlYXRlIGEgSERBIGNvZGVjCiAgKiBAYnVzOiB0aGUgYnVzIHRvIGFzc2lnbgpAQCAtMTQwOCw2ICsxNDI0LDExIEBACiAJY2hhciBjb21wb25lbnRbMzFdOwogCWhkYV9uaWRfdCBmZzsKIAlpbnQgZXJyOworCXN0YXRpYyBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgZGV2X29wcyA9IHsKKwkJLmRldl9yZWdpc3RlciA9IHNuZF9oZGFfY29kZWNfZGV2X3JlZ2lzdGVyLAorCQkuZGV2X2Rpc2Nvbm5lY3QgPSBzbmRfaGRhX2NvZGVjX2Rldl9kaXNjb25uZWN0LAorCQkuZGV2X2ZyZWUgPSBzbmRfaGRhX2NvZGVjX2Rldl9mcmVlLAorCX07CiAKIAlpZiAoc25kX0JVR19PTighYnVzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNDE1LDE3ICsxNDM2LDI3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGJ1cy0+Y2FkZHJfdGJsW2NvZGVjX2FkZHJdKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogIgotCQkJICAgImFkZHJlc3MgMHgleCBpcyBhbHJlYWR5IG9jY3VwaWVkXG4iLCBjb2RlY19hZGRyKTsKKwkJZGV2X2VycihidXMtPmNhcmQtPmRldiwKKwkJCSJhZGRyZXNzIDB4JXggaXMgYWxyZWFkeSBvY2N1cGllZFxuIiwKKwkJCWNvZGVjX2FkZHIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWNvZGVjID0ga3phbGxvYyhzaXplb2YoKmNvZGVjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNvZGVjID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2FuJ3QgYWxsb2NhdGUgc3RydWN0IGhkYV9jb2RlY1xuIik7CisJCWRldl9lcnIoYnVzLT5jYXJkLT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBzdHJ1Y3QgaGRhX2NvZGVjXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJZGV2aWNlX2luaXRpYWxpemUoJmNvZGVjLT5kZXYpOworCWNvZGVjLT5kZXYucGFyZW50ID0gJmJ1cy0+Y2FyZC0+Y2FyZF9kZXY7CisJY29kZWMtPmRldi5jbGFzcyA9IHNvdW5kX2NsYXNzOworCWNvZGVjLT5kZXYucmVsZWFzZSA9IHNuZF9oZGFfY29kZWNfZGV2X3JlbGVhc2U7CisJY29kZWMtPmRldi5ncm91cHMgPSBzbmRfaGRhX2Rldl9hdHRyX2dyb3VwczsKKwlkZXZfc2V0X25hbWUoJmNvZGVjLT5kZXYsICJoZGF1ZGlvQyVkRCVkIiwgYnVzLT5jYXJkLT5udW1iZXIsCisJCSAgICAgY29kZWNfYWRkcik7CisJZGV2X3NldF9kcnZkYXRhKCZjb2RlYy0+ZGV2LCBjb2RlYyk7IC8qIGZvciBzeXNmcyAqLworCiAJY29kZWMtPmJ1cyA9IGJ1czsKIAljb2RlYy0+YWRkciA9IGNvZGVjX2FkZHI7CiAJbXV0ZXhfaW5pdCgmY29kZWMtPnNwZGlmX211dGV4KTsKQEAgLTE0NTYsMTEgKzE0ODcsMTMgQEAKIAloZGFfa2VlcF9wb3dlcl9vbihjb2RlYyk7CiAjZW5kaWYKIAorCXNuZF9oZGFfc3lzZnNfaW5pdChjb2RlYyk7CisKIAlpZiAoY29kZWMtPmJ1cy0+bW9kZWxuYW1lKSB7CiAJCWNvZGVjLT5tb2RlbG5hbWUgPSBrc3RyZHVwKGNvZGVjLT5idXMtPm1vZGVsbmFtZSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghY29kZWMtPm1vZGVsbmFtZSkgewotCQkJc25kX2hkYV9jb2RlY19mcmVlKGNvZGVjKTsKLQkJCXJldHVybiAtRU5PREVWOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyb3I7CiAJCX0KIAl9CiAKQEAgLTE0ODQsNyArMTUxNyw3IEBACiAKIAlzZXR1cF9mZ19ub2Rlcyhjb2RlYyk7CiAJaWYgKCFjb2RlYy0+YWZnICYmICFjb2RlYy0+bWZnKSB7Ci0JCXNuZF9wcmludGRkKCJoZGFfY29kZWM6IG5vIEFGRyBvciBNRkcgbm9kZSBmb3VuZFxuIik7CisJCWRldl9lcnIoYnVzLT5jYXJkLT5kZXYsICJubyBBRkcgb3IgTUZHIG5vZGUgZm91bmRcbiIpOwogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGVycm9yOwogCX0KQEAgLTE0OTIsNyArMTUyNSw3IEBACiAJZmcgPSBjb2RlYy0+YWZnID8gY29kZWMtPmFmZyA6IGNvZGVjLT5tZmc7CiAJZXJyID0gcmVhZF93aWRnZXRfY2Fwcyhjb2RlYywgZmcpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogY2Fubm90IG1hbGxvY1xuIik7CisJCWRldl9lcnIoYnVzLT5jYXJkLT5kZXYsICJjYW5ub3QgbWFsbG9jXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAJZXJyID0gcmVhZF9waW5fZGVmYXVsdHMoY29kZWMpOwpAQCAtMTUyOCw2ICsxNTYxLDEwIEBACiAJCWNvZGVjLT5zdWJzeXN0ZW1faWQsIGNvZGVjLT5yZXZpc2lvbl9pZCk7CiAJc25kX2NvbXBvbmVudF9hZGQoY29kZWMtPmJ1cy0+Y2FyZCwgY29tcG9uZW50KTsKIAorCWVyciA9IHNuZF9kZXZpY2VfbmV3KGJ1cy0+Y2FyZCwgU05EUlZfREVWX0NPREVDLCBjb2RlYywgJmRldl9vcHMpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCiAJaWYgKGNvZGVjcCkKIAkJKmNvZGVjcCA9IGNvZGVjOwogCXJldHVybiAwOwpAQCAtMTU1MCw3ICsxNTg3LDcgQEAKIAlmZyA9IGNvZGVjLT5hZmcgPyBjb2RlYy0+YWZnIDogY29kZWMtPm1mZzsKIAllcnIgPSByZWFkX3dpZGdldF9jYXBzKGNvZGVjLCBmZyk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiBjYW5ub3QgbWFsbG9jXG4iKTsKKwkJY29kZWNfZXJyKGNvZGVjLCAiY2Fubm90IG1hbGxvY1xuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xNjI3LDcgKzE2NjQsNyBAQAogI2VuZGlmCiAJCX0KIAkJaWYgKCFwYXRjaCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJoZGEtY29kZWM6IE5vIGNvZGVjIHBhcnNlciBpcyBhdmFpbGFibGVcbiIpOworCQkJY29kZWNfZXJyKGNvZGVjLCAiTm8gY29kZWMgcGFyc2VyIGlzIGF2YWlsYWJsZVxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0KQEAgLTE3MTEsOSArMTc0OCw5IEBACiAJaWYgKCFuaWQpCiAJCXJldHVybjsKIAotCXNuZF9wcmludGRkKCJoZGFfY29kZWNfc2V0dXBfc3RyZWFtOiAiCi0JCSAgICAiTklEPTB4JXgsIHN0cmVhbT0weCV4LCBjaGFubmVsPSVkLCBmb3JtYXQ9MHgleFxuIiwKLQkJICAgIG5pZCwgc3RyZWFtX3RhZywgY2hhbm5lbF9pZCwgZm9ybWF0KTsKKwljb2RlY19kYmcoY29kZWMsCisJCSAgImhkYV9jb2RlY19zZXR1cF9zdHJlYW06IE5JRD0weCV4LCBzdHJlYW09MHgleCwgY2hhbm5lbD0lZCwgZm9ybWF0PTB4JXhcbiIsCisJCSAgbmlkLCBzdHJlYW1fdGFnLCBjaGFubmVsX2lkLCBmb3JtYXQpOwogCXAgPSBnZXRfaGRhX2N2dF9zZXR1cChjb2RlYywgbmlkKTsKIAlpZiAoIXApCiAJCXJldHVybjsKQEAgLTE3NjAsNyArMTc5Nyw3IEBACiAJaWYgKGNvZGVjLT5ub19zdGlja3lfc3RyZWFtKQogCQlkb19ub3cgPSAxOwogCi0Jc25kX3ByaW50ZGQoImhkYV9jb2RlY19jbGVhbnVwX3N0cmVhbTogTklEPTB4JXhcbiIsIG5pZCk7CisJY29kZWNfZGJnKGNvZGVjLCAiaGRhX2NvZGVjX2NsZWFudXBfc3RyZWFtOiBOSUQ9MHgleFxuIiwgbmlkKTsKIAlwID0gZ2V0X2hkYV9jdnRfc2V0dXAoY29kZWMsIG5pZCk7CiAJaWYgKHApIHsKIAkJLyogaGVyZSB3ZSBqdXN0IGNsZWFyIHRoZSBhY3RpdmUgZmxhZyB3aGVuIGRvX25vdyBpc24ndCBzZXQ7CkBAIC0yMjgyLDkgKzIzMTksOSBAQAogCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CiAJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gZ2V0X2FtcF9tYXhfdmFsdWUoY29kZWMsIG5pZCwgZGlyLCBvZnMpOwogCWlmICghdWluZm8tPnZhbHVlLmludGVnZXIubWF4KSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImhkYV9jb2RlYzogIgotCQkgICAgICAgIm51bV9zdGVwcyA9IDAgZm9yIE5JRD0weCV4IChjdGwgPSAlcylcbiIsIG5pZCwKLQkJICAgICAgIGtjb250cm9sLT5pZC5uYW1lKTsKKwkJY29kZWNfd2Fybihjb2RlYywKKwkJCSAgICJudW1fc3RlcHMgPSAwIGZvciBOSUQ9MHgleCAoY3RsID0gJXMpXG4iLAorCQkJICAgbmlkLCBrY29udHJvbC0+aWQubmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKQEAgLTI1NTgsOCArMjU5NSw4IEBACiAJCWl0ZW0tPm5pZCA9IG5pZDsKIAkJcmV0dXJuIDA7CiAJfQotCXByaW50ayhLRVJOX0VSUiAiaGRhLWNvZGVjOiBubyBOSUQgZm9yIG1hcHBpbmcgY29udHJvbCAlczolZDolZFxuIiwKLQkgICAgICAga2N0bC0+aWQubmFtZSwga2N0bC0+aWQuaW5kZXgsIGluZGV4KTsKKwljb2RlY19lcnIoY29kZWMsICJubyBOSUQgZm9yIG1hcHBpbmcgY29udHJvbCAlczolZDolZFxuIiwKKwkJICBrY3RsLT5pZC5uYW1lLCBrY3RsLT5pZC5pbmRleCwgaW5kZXgpOwogCXJldHVybiAtRUlOVkFMOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9hZGRfbmlkKTsKQEAgLTI2NjAsNiArMjY5Nyw3IEBACiAJCQkJICBidXMtPnBjbV9kZXZfYml0cyk7CiAJCX0KIAl9CisJc25kX2hkYV9kZXRhY2hfYmVlcF9kZXZpY2UoY29kZWMpOwogCWlmIChjb2RlYy0+cGF0Y2hfb3BzLmZyZWUpCiAJCWNvZGVjLT5wYXRjaF9vcHMuZnJlZShjb2RlYyk7CiAJbWVtc2V0KCZjb2RlYy0+cGF0Y2hfb3BzLCAwLCBzaXplb2YoY29kZWMtPnBhdGNoX29wcykpOwpAQCAtMjc1MSw3ICsyNzg5LDcgQEAKIAkJCXJldHVybiAtMTsKIAkJaWYgKCpzdGVwX3RvX2NoZWNrICYmICpzdGVwX3RvX2NoZWNrICE9IHN0ZXApIHsKIAkJCXNuZF9wcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogTWlzbWF0Y2hpbmcgZEIgc3RlcCBmb3Igdm1hc3RlciBzbGF2ZSAoJWQhPSVkKVxuIiwKLQkJCQkgICAqc3RlcF90b19jaGVjaywgc3RlcCk7CistCQkJCSAgICpzdGVwX3RvX2NoZWNrLCBzdGVwKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQkqc3RlcF90b19jaGVjayA9IHN0ZXA7CkBAIC0yODIxLDcgKzI4NTksNyBAQAogCiAJZXJyID0gbWFwX3NsYXZlcyhjb2RlYywgc2xhdmVzLCBzdWZmaXgsIGNoZWNrX3NsYXZlX3ByZXNlbnQsIE5VTEwpOwogCWlmIChlcnIgIT0gMSkgewotCQlzbmRfcHJpbnRkZCgiTm8gc2xhdmUgZm91bmQgZm9yICVzXG4iLCBuYW1lKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiTm8gc2xhdmUgZm91bmQgZm9yICVzXG4iLCBuYW1lKTsKIAkJcmV0dXJuIDA7CiAJfQogCWtjdGwgPSBzbmRfY3RsX21ha2VfdmlydHVhbF9tYXN0ZXIobmFtZSwgdGx2KTsKQEAgLTM0ODcsNyArMzUyNSw3IEBACiAKIAlpZHggPSBmaW5kX2VtcHR5X21peGVyX2N0bF9pZHgoY29kZWMsICJJRUM5NTggUGxheWJhY2sgU3dpdGNoIiwgaWR4KTsKIAlpZiAoaWR4IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogdG9vIG1hbnkgSUVDOTU4IG91dHB1dHNcbiIpOworCQljb2RlY19lcnIoY29kZWMsICJ0b28gbWFueSBJRUM5NTggb3V0cHV0c1xuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCXNwZGlmID0gc25kX2FycmF5X25ldygmY29kZWMtPnNwZGlmX291dCk7CkBAIC0zNjkxLDcgKzM3MjksNyBAQAogCiAJaWR4ID0gZmluZF9lbXB0eV9taXhlcl9jdGxfaWR4KGNvZGVjLCAiSUVDOTU4IENhcHR1cmUgU3dpdGNoIiwgMCk7CiAJaWYgKGlkeCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6IHRvbyBtYW55IElFQzk1OCBpbnB1dHNcbiIpOworCQljb2RlY19lcnIoY29kZWMsICJ0b28gbWFueSBJRUM5NTggaW5wdXRzXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJZm9yIChkaWdfbWl4ID0gZGlnX2luX2N0bHM7IGRpZ19taXgtPm5hbWU7IGRpZ19taXgrKykgewpAQCAtNDAxMCw3ICs0MDQ4LDcgQEAKIAl9CiB9CiAKLSNpZmRlZiBDT05GSUdfU05EX0hEQV9IV0RFUAorI2lmZGVmIENPTkZJR19TTkRfSERBX1JFQ09ORklHCiAvKiBleGVjdXRlIGFkZGl0aW9uYWwgaW5pdCB2ZXJicyAqLwogc3RhdGljIHZvaWQgaGRhX2V4ZWNfaW5pdF92ZXJicyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKQEAgLTQxMTgsMTIgKzQxNTYsMTMgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjLCAmYnVzLT5jb2RlY19saXN0LCBsaXN0KSB7CiAJCWludCBlcnIgPSBzbmRfaGRhX2NvZGVjX2J1aWxkX2NvbnRyb2xzKGNvZGVjKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiBjYW5ub3QgYnVpbGQgY29udHJvbHMgIgotCQkJICAgICAgICJmb3IgIyVkIChlcnJvciAlZClcbiIsIGNvZGVjLT5hZGRyLCBlcnIpOworCQkJY29kZWNfZXJyKGNvZGVjLAorCQkJCSAgImNhbm5vdCBidWlsZCBjb250cm9scyBmb3IgIyVkIChlcnJvciAlZClcbiIsCisJCQkJICBjb2RlYy0+YWRkciwgZXJyKTsKIAkJCWVyciA9IHNuZF9oZGFfY29kZWNfcmVzZXQoY29kZWMpOwogCQkJaWYgKGVyciA8IDApIHsKLQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkgICAgICAgImhkYV9jb2RlYzogY2Fubm90IHJldmVydCBjb2RlY1xuIik7CisJCQkJY29kZWNfZXJyKGNvZGVjLAorCQkJCQkgICJjYW5ub3QgcmV2ZXJ0IGNvZGVjXG4iKTsKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQogCQl9CkBAIC00Mjk0LDcgKzQzMzMsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlzbmRfcHJpbnRkZCgiaW52YWxpZCBmb3JtYXQgd2lkdGggJWRcbiIsCi0JCQkgICAgc25kX3BjbV9mb3JtYXRfd2lkdGgoZm9ybWF0KSk7CisJCQkgIHNuZF9wY21fZm9ybWF0X3dpZHRoKGZvcm1hdCkpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTQzNzAsMTAgKzQ0MDksMTAgQEAKIAkJCQlyYXRlcyB8PSByYXRlX2JpdHNbaV0uYWxzYV9iaXRzOwogCQl9CiAJCWlmIChyYXRlcyA9PSAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6IHJhdGVzID09IDAgIgotCQkJCSAgICIobmlkPTB4JXgsIHZhbD0weCV4LCBvdnJkPSVpKVxuIiwKLQkJCQkJbmlkLCB2YWwsCi0JCQkJCSh3Y2FwcyAmIEFDX1dDQVBfRk9STUFUX09WUkQpID8gMSA6IDApOworCQkJY29kZWNfZXJyKGNvZGVjLAorCQkJCSAgInJhdGVzID09IDAgKG5pZD0weCV4LCB2YWw9MHgleCwgb3ZyZD0laSlcbiIsCisJCQkJICBuaWQsIHZhbCwKKwkJCQkgICh3Y2FwcyAmIEFDX1dDQVBfRk9STUFUX09WUkQpID8gMSA6IDApOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAkJKnJhdGVzcCA9IHJhdGVzOwpAQCAtNDQzMywxMiArNDQ3MiwxMSBAQAogCQkJYnBzID0gODsKIAkJfQogCQlpZiAoZm9ybWF0cyA9PSAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6IGZvcm1hdHMgPT0gMCAiCi0JCQkJICAgIihuaWQ9MHgleCwgdmFsPTB4JXgsIG92cmQ9JWksICIKLQkJCQkgICAic3RyZWFtcz0weCV4KVxuIiwKLQkJCQkJbmlkLCB2YWwsCi0JCQkJCSh3Y2FwcyAmIEFDX1dDQVBfRk9STUFUX09WUkQpID8gMSA6IDAsCi0JCQkJCXN0cmVhbXMpOworCQkJY29kZWNfZXJyKGNvZGVjLAorCQkJCSAgImZvcm1hdHMgPT0gMCAobmlkPTB4JXgsIHZhbD0weCV4LCBvdnJkPSVpLCBzdHJlYW1zPTB4JXgpXG4iLAorCQkJCSAgbmlkLCB2YWwsCisJCQkJICAod2NhcHMgJiBBQ19XQ0FQX0ZPUk1BVF9PVlJEKSA/IDEgOiAwLAorCQkJCSAgc3RyZWFtcyk7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlpZiAoZm9ybWF0c3ApCkBAIC00NjI5LDcgKzQ2NjcsNyBAQAogCWludCBpOwogCiAJaWYgKHR5cGUgPj0gSERBX1BDTV9OVFlQRVMpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkludmFsaWQgUENNIHR5cGUgJWRcbiIsIHR5cGUpOworCQlkZXZfZXJyKGJ1cy0+Y2FyZC0+ZGV2LCAiSW52YWxpZCBQQ00gdHlwZSAlZFxuIiwgdHlwZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDY1MCwxMCArNDY4OCwxMSBAQAogCX0KICNlbmRpZgogCi0Jc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIlRvbyBtYW55ICVzIGRldmljZXNcbiIsCisJZGV2X3dhcm4oYnVzLT5jYXJkLT5kZXYsICJUb28gbWFueSAlcyBkZXZpY2VzXG4iLAogCQlzbmRfaGRhX3BjbV90eXBlX25hbWVbdHlwZV0pOwogI2lmbmRlZiBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTCi0Jc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkNvbnNpZGVyIGJ1aWxkaW5nIHRoZSBrZXJuZWwgd2l0aCBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTPXlcbiIpOworCWRldl93YXJuKGJ1cy0+Y2FyZC0+ZGV2LAorCQkgIkNvbnNpZGVyIGJ1aWxkaW5nIHRoZSBrZXJuZWwgd2l0aCBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTPXlcbiIpOwogI2VuZGlmCiAJcmV0dXJuIC1FQUdBSU47CiB9CkBAIC00NjkxLDEyICs0NzMwLDEzIEBACiAJCQlyZXR1cm4gMDsKIAkJZXJyID0gY29kZWMtPnBhdGNoX29wcy5idWlsZF9wY21zKGNvZGVjKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiBjYW5ub3QgYnVpbGQgUENNcyIKLQkJCSAgICAgICAiZm9yICMlZCAoZXJyb3IgJWQpXG4iLCBjb2RlYy0+YWRkciwgZXJyKTsKKwkJCWNvZGVjX2Vycihjb2RlYywKKwkJCQkgICJjYW5ub3QgYnVpbGQgUENNcyBmb3IgIyVkIChlcnJvciAlZClcbiIsCisJCQkJICBjb2RlYy0+YWRkciwgZXJyKTsKIAkJCWVyciA9IHNuZF9oZGFfY29kZWNfcmVzZXQoY29kZWMpOwogCQkJaWYgKGVyciA8IDApIHsKLQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkgICAgICAgImhkYV9jb2RlYzogY2Fubm90IHJldmVydCBjb2RlY1xuIik7CisJCQkJY29kZWNfZXJyKGNvZGVjLAorCQkJCQkgICJjYW5ub3QgcmV2ZXJ0IGNvZGVjXG4iKTsKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQogCQl9CkBAIC00NzE1LDkgKzQ3NTUsOSBAQAogCQkJY3BjbS0+ZGV2aWNlID0gZGV2OwogCQkJZXJyID0gc25kX2hkYV9hdHRhY2hfcGNtKGNvZGVjLCBjcGNtKTsKIAkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6IGNhbm5vdCBhdHRhY2ggIgotCQkJCSAgICAgICAiUENNIHN0cmVhbSAlZCBmb3IgY29kZWMgIyVkXG4iLAotCQkJCSAgICAgICBkZXYsIGNvZGVjLT5hZGRyKTsKKwkJCQljb2RlY19lcnIoY29kZWMsCisJCQkJCSAgImNhbm5vdCBhdHRhY2ggUENNIHN0cmVhbSAlZCBmb3IgY29kZWMgIyVkXG4iLAorCQkJCQkgIGRldiwgY29kZWMtPmFkZHIpOwogCQkJCWNvbnRpbnVlOyAvKiBubyBmYXRhbCBlcnJvciAqLwogCQkJfQogCQl9CkBAIC00Nzg2LDggKzQ4MjYsOCBAQAogCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbmZpZ3M7IGkrKykgewogCQkJaWYgKG1vZGVsc1tpXSAmJgogCQkJICAgICFzdHJjbXAoY29kZWMtPm1vZGVsbmFtZSwgbW9kZWxzW2ldKSkgewotCQkJCXNuZF9wcmludGQoS0VSTl9JTkZPICJoZGFfY29kZWM6IG1vZGVsICclcycgaXMgIgotCQkJCQkgICAic2VsZWN0ZWRcbiIsIG1vZGVsc1tpXSk7CisJCQkJY29kZWNfaW5mbyhjb2RlYywgIm1vZGVsICclcycgaXMgc2VsZWN0ZWRcbiIsCisJCQkJCSAgIG1vZGVsc1tpXSk7CiAJCQkJcmV0dXJuIGk7CiAJCQl9CiAJCX0KQEAgLTQ4MDksMTAgKzQ4NDksOSBAQAogCQkJc3ByaW50Zih0bXAsICIjJWQiLCB0YmwtPnZhbHVlKTsKIAkJCW1vZGVsID0gdG1wOwogCQl9Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBtb2RlbCAnJXMnIGlzIHNlbGVjdGVkICIKLQkJCSAgICAiZm9yIGNvbmZpZyAleDoleCAoJXMpXG4iLAotCQkJICAgIG1vZGVsLCB0YmwtPnN1YnZlbmRvciwgdGJsLT5zdWJkZXZpY2UsCi0JCQkgICAgKHRibC0+bmFtZSA/IHRibC0+bmFtZSA6ICJVbmtub3duIGRldmljZSIpKTsKKwkJY29kZWNfaW5mbyhjb2RlYywgIm1vZGVsICclcycgaXMgc2VsZWN0ZWQgZm9yIGNvbmZpZyAleDoleCAoJXMpXG4iLAorCQkJICAgbW9kZWwsIHRibC0+c3VidmVuZG9yLCB0YmwtPnN1YmRldmljZSwKKwkJCSAgICh0YmwtPm5hbWUgPyB0YmwtPm5hbWUgOiAiVW5rbm93biBkZXZpY2UiKSk7CiAjZW5kaWYKIAkJcmV0dXJuIHRibC0+dmFsdWU7CiAJfQpAQCAtNDg3MCwxMCArNDkwOSw5IEBACiAJCQlzcHJpbnRmKHRtcCwgIiMlZCIsIHRibC0+dmFsdWUpOwogCQkJbW9kZWwgPSB0bXA7CiAJCX0KLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJoZGFfY29kZWM6IG1vZGVsICclcycgaXMgc2VsZWN0ZWQgIgotCQkJICAgICJmb3IgY29uZmlnICV4OiV4ICglcylcbiIsCi0JCQkgICAgbW9kZWwsIHRibC0+c3VidmVuZG9yLCB0YmwtPnN1YmRldmljZSwKLQkJCSAgICAodGJsLT5uYW1lID8gdGJsLT5uYW1lIDogIlVua25vd24gZGV2aWNlIikpOworCQljb2RlY19pbmZvKGNvZGVjLCAibW9kZWwgJyVzJyBpcyBzZWxlY3RlZCBmb3IgY29uZmlnICV4OiV4ICglcylcbiIsCisJCQkgICBtb2RlbCwgdGJsLT5zdWJ2ZW5kb3IsIHRibC0+c3ViZGV2aWNlLAorCQkJICAgKHRibC0+bmFtZSA/IHRibC0+bmFtZSA6ICJVbmtub3duIGRldmljZSIpKTsKICNlbmRpZgogCQlyZXR1cm4gdGJsLT52YWx1ZTsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5oIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuaAppbmRleCBhYjJhNDQ0Li5hNDIzMzEzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5oCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmgKQEAgLTI3MSw2ICsyNzEsNyBAQAogCiAvKiBjb2RlYyBpbmZvcm1hdGlvbiAqLwogc3RydWN0IGhkYV9jb2RlYyB7CisJc3RydWN0IGRldmljZSBkZXY7CiAJc3RydWN0IGhkYV9idXMgKmJ1czsKIAl1bnNpZ25lZCBpbnQgYWRkcjsJLyogY29kZWMgYWRkciovCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBsaXN0IHBvaW50ICovCkBAIC0zMzIsMTQgKzMzMywxNyBAQAogCXN0cnVjdCBzbmRfYXJyYXkgZHJpdmVyX3BpbnM7CS8qIHBpbiBjb25maWdzIHNldCBieSBjb2RlYyBwYXJzZXIgKi8KIAlzdHJ1Y3Qgc25kX2FycmF5IGN2dF9zZXR1cHM7CS8qIGF1ZGlvIGNvbnZlcnQgc2V0dXBzICovCiAKLSNpZmRlZiBDT05GSUdfU05EX0hEQV9IV0RFUAogCXN0cnVjdCBtdXRleCB1c2VyX211dGV4OwotCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwOwkvKiBhc3NpZ25lZCBod2RlcCBkZXZpY2UgKi8KKyNpZmRlZiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRwogCXN0cnVjdCBzbmRfYXJyYXkgaW5pdF92ZXJiczsJLyogYWRkaXRpb25hbCBpbml0IHZlcmJzICovCiAJc3RydWN0IHNuZF9hcnJheSBoaW50czsJCS8qIGFkZGl0aW9uYWwgaGludHMgKi8KIAlzdHJ1Y3Qgc25kX2FycmF5IHVzZXJfcGluczsJLyogZGVmYXVsdCBwaW4gY29uZmlncyB0byBvdmVycmlkZSAqLwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9IV0RFUAorCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwOwkvKiBhc3NpZ25lZCBod2RlcCBkZXZpY2UgKi8KKyNlbmRpZgorCiAJLyogbWlzYyBmbGFncyAqLwogCXVuc2lnbmVkIGludCBzcGRpZl9zdGF0dXNfcmVzZXQgOjE7IC8qIG5lZWRzIHRvIHRvZ2dsZSBTUERJRiBmb3IgZWFjaAogCQkJCQkgICAgICogc3RhdHVzIGNoYW5nZQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5jIGIvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OTkzZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb250cm9sbGVyLmMKQEAgLTAsMCArMSwyMDMxIEBACisvKgorICoKKyAqICBJbXBsZW1lbnRhdGlvbiBvZiBwcmltYXJ5IGFsc2EgZHJpdmVyIGNvZGUgYmFzZSBmb3IgSW50ZWwgSEQgQXVkaW8uCisgKgorICogIENvcHlyaWdodChjKSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogICAgICAgICAgICAgICAgICAgICBQZWlTZW4gSG91IDxwc2hvdUByZWFsdGVrLmNvbS50dz4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgImhkYV9wcml2LmgiCisjaW5jbHVkZSAiaGRhX2NvbnRyb2xsZXIuaCIKKworI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSAiaGRhX2ludGVsX3RyYWNlLmgiCisKKy8qIERTUCBsb2NrIGhlbHBlcnMgKi8KKyNpZmRlZiBDT05GSUdfU05EX0hEQV9EU1BfTE9BREVSCisjZGVmaW5lIGRzcF9sb2NrX2luaXQoZGV2KQltdXRleF9pbml0KCYoZGV2KS0+ZHNwX211dGV4KQorI2RlZmluZSBkc3BfbG9jayhkZXYpCQltdXRleF9sb2NrKCYoZGV2KS0+ZHNwX211dGV4KQorI2RlZmluZSBkc3BfdW5sb2NrKGRldikJCW11dGV4X3VubG9jaygmKGRldiktPmRzcF9tdXRleCkKKyNkZWZpbmUgZHNwX2lzX2xvY2tlZChkZXYpCSgoZGV2KS0+bG9ja2VkKQorI2Vsc2UKKyNkZWZpbmUgZHNwX2xvY2tfaW5pdChkZXYpCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkc3BfbG9jayhkZXYpCQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZHNwX3VubG9jayhkZXYpCQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZHNwX2lzX2xvY2tlZChkZXYpCTAKKyNlbmRpZgorCisvKgorICogQVpYIHN0cmVhbSBvcGVyYXRpb25zLgorICovCisKKy8qIHN0YXJ0IGEgc3RyZWFtICovCitzdGF0aWMgdm9pZCBhenhfc3RyZWFtX3N0YXJ0KHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KQoreworCS8qCisJICogQmVmb3JlIHN0cmVhbSBzdGFydCwgaW5pdGlhbGl6ZSBwYXJhbWV0ZXIKKwkgKi8KKwlhenhfZGV2LT5pbnN1ZmZpY2llbnQgPSAxOworCisJLyogZW5hYmxlIFNJRSAqLworCWF6eF93cml0ZWwoY2hpcCwgSU5UQ1RMLAorCQkgICBhenhfcmVhZGwoY2hpcCwgSU5UQ1RMKSB8ICgxIDw8IGF6eF9kZXYtPmluZGV4KSk7CisJLyogc2V0IERNQSBzdGFydCBhbmQgaW50ZXJydXB0IG1hc2sgKi8KKwlhenhfc2Rfd3JpdGViKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCwKKwkJICAgICAgYXp4X3NkX3JlYWRiKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCkgfAorCQkgICAgICBTRF9DVExfRE1BX1NUQVJUIHwgU0RfSU5UX01BU0spOworfQorCisvKiBzdG9wIERNQSAqLworc3RhdGljIHZvaWQgYXp4X3N0cmVhbV9jbGVhcihzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKK3sKKwlhenhfc2Rfd3JpdGViKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCwKKwkJICAgICAgYXp4X3NkX3JlYWRiKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCkgJgorCQkgICAgICB+KFNEX0NUTF9ETUFfU1RBUlQgfCBTRF9JTlRfTUFTSykpOworCWF6eF9zZF93cml0ZWIoY2hpcCwgYXp4X2RldiwgU0RfU1RTLCBTRF9JTlRfTUFTSyk7IC8qIHRvIGJlIHN1cmUgKi8KK30KKworLyogc3RvcCBhIHN0cmVhbSAqLwordm9pZCBhenhfc3RyZWFtX3N0b3Aoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpCit7CisJYXp4X3N0cmVhbV9jbGVhcihjaGlwLCBhenhfZGV2KTsKKwkvKiBkaXNhYmxlIFNJRSAqLworCWF6eF93cml0ZWwoY2hpcCwgSU5UQ1RMLAorCQkgICBhenhfcmVhZGwoY2hpcCwgSU5UQ1RMKSAmIH4oMSA8PCBhenhfZGV2LT5pbmRleCkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X3N0cmVhbV9zdG9wKTsKKworLyogcmVzZXQgc3RyZWFtICovCitzdGF0aWMgdm9pZCBhenhfc3RyZWFtX3Jlc2V0KHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KQoreworCXVuc2lnbmVkIGNoYXIgdmFsOworCWludCB0aW1lb3V0OworCisJYXp4X3N0cmVhbV9jbGVhcihjaGlwLCBhenhfZGV2KTsKKworCWF6eF9zZF93cml0ZWIoY2hpcCwgYXp4X2RldiwgU0RfQ1RMLAorCQkgICAgICBhenhfc2RfcmVhZGIoY2hpcCwgYXp4X2RldiwgU0RfQ1RMKSB8CisJCSAgICAgIFNEX0NUTF9TVFJFQU1fUkVTRVQpOworCXVkZWxheSgzKTsKKwl0aW1lb3V0ID0gMzAwOworCXdoaWxlICghKCh2YWwgPSBhenhfc2RfcmVhZGIoY2hpcCwgYXp4X2RldiwgU0RfQ1RMKSkgJgorCQkgU0RfQ1RMX1NUUkVBTV9SRVNFVCkgJiYgLS10aW1lb3V0KQorCQk7CisJdmFsICY9IH5TRF9DVExfU1RSRUFNX1JFU0VUOworCWF6eF9zZF93cml0ZWIoY2hpcCwgYXp4X2RldiwgU0RfQ1RMLCB2YWwpOworCXVkZWxheSgzKTsKKworCXRpbWVvdXQgPSAzMDA7CisJLyogd2FpdGluZyBmb3IgaGFyZHdhcmUgdG8gcmVwb3J0IHRoYXQgdGhlIHN0cmVhbSBpcyBvdXQgb2YgcmVzZXQgKi8KKwl3aGlsZSAoKCh2YWwgPSBhenhfc2RfcmVhZGIoY2hpcCwgYXp4X2RldiwgU0RfQ1RMKSkgJgorCQlTRF9DVExfU1RSRUFNX1JFU0VUKSAmJiAtLXRpbWVvdXQpCisJCTsKKworCS8qIHJlc2V0IGZpcnN0IHBvc2l0aW9uIC0gbWF5IG5vdCBiZSBzeW5jZWQgd2l0aCBodyBhdCB0aGlzIHRpbWUgKi8KKwkqYXp4X2Rldi0+cG9zYnVmID0gMDsKK30KKworLyoKKyAqIHNldCB1cCB0aGUgU0QgZm9yIHN0cmVhbWluZworICovCitzdGF0aWMgaW50IGF6eF9zZXR1cF9jb250cm9sbGVyKHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KQoreworCXVuc2lnbmVkIGludCB2YWw7CisJLyogbWFrZSBzdXJlIHRoZSBydW4gYml0IGlzIHplcm8gZm9yIFNEICovCisJYXp4X3N0cmVhbV9jbGVhcihjaGlwLCBhenhfZGV2KTsKKwkvKiBwcm9ncmFtIHRoZSBzdHJlYW1fdGFnICovCisJdmFsID0gYXp4X3NkX3JlYWRsKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCk7CisJdmFsID0gKHZhbCAmIH5TRF9DVExfU1RSRUFNX1RBR19NQVNLKSB8CisJCShhenhfZGV2LT5zdHJlYW1fdGFnIDw8IFNEX0NUTF9TVFJFQU1fVEFHX1NISUZUKTsKKwlpZiAoIWF6eF9zbm9vcChjaGlwKSkKKwkJdmFsIHw9IFNEX0NUTF9UUkFGRklDX1BSSU87CisJYXp4X3NkX3dyaXRlbChjaGlwLCBhenhfZGV2LCBTRF9DVEwsIHZhbCk7CisKKwkvKiBwcm9ncmFtIHRoZSBsZW5ndGggb2Ygc2FtcGxlcyBpbiBjeWNsaWMgYnVmZmVyICovCisJYXp4X3NkX3dyaXRlbChjaGlwLCBhenhfZGV2LCBTRF9DQkwsIGF6eF9kZXYtPmJ1ZnNpemUpOworCisJLyogcHJvZ3JhbSB0aGUgc3RyZWFtIGZvcm1hdCAqLworCS8qIHRoaXMgdmFsdWUgbmVlZHMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIG9uZSBwcm9ncmFtbWVkICovCisJYXp4X3NkX3dyaXRldyhjaGlwLCBhenhfZGV2LCBTRF9GT1JNQVQsIGF6eF9kZXYtPmZvcm1hdF92YWwpOworCisJLyogcHJvZ3JhbSB0aGUgc3RyZWFtIExWSSAobGFzdCB2YWxpZCBpbmRleCkgb2YgdGhlIEJETCAqLworCWF6eF9zZF93cml0ZXcoY2hpcCwgYXp4X2RldiwgU0RfTFZJLCBhenhfZGV2LT5mcmFncyAtIDEpOworCisJLyogcHJvZ3JhbSB0aGUgQkRMIGFkZHJlc3MgKi8KKwkvKiBsb3dlciBCREwgYWRkcmVzcyAqLworCWF6eF9zZF93cml0ZWwoY2hpcCwgYXp4X2RldiwgU0RfQkRMUEwsICh1MzIpYXp4X2Rldi0+YmRsLmFkZHIpOworCS8qIHVwcGVyIEJETCBhZGRyZXNzICovCisJYXp4X3NkX3dyaXRlbChjaGlwLCBhenhfZGV2LCBTRF9CRExQVSwKKwkJICAgICAgdXBwZXJfMzJfYml0cyhhenhfZGV2LT5iZGwuYWRkcikpOworCisJLyogZW5hYmxlIHRoZSBwb3NpdGlvbiBidWZmZXIgKi8KKwlpZiAoY2hpcC0+cG9zaXRpb25fZml4WzBdICE9IFBPU19GSVhfTFBJQiB8fAorCSAgICBjaGlwLT5wb3NpdGlvbl9maXhbMV0gIT0gUE9TX0ZJWF9MUElCKSB7CisJCWlmICghKGF6eF9yZWFkbChjaGlwLCBEUExCQVNFKSAmIElDSDZfRFBMQkFTRV9FTkFCTEUpKQorCQkJYXp4X3dyaXRlbChjaGlwLCBEUExCQVNFLAorCQkJCSh1MzIpY2hpcC0+cG9zYnVmLmFkZHIgfCBJQ0g2X0RQTEJBU0VfRU5BQkxFKTsKKwl9CisKKwkvKiBzZXQgdGhlIGludGVycnVwdCBlbmFibGUgYml0cyBpbiB0aGUgZGVzY3JpcHRvciBjb250cm9sIHJlZ2lzdGVyICovCisJYXp4X3NkX3dyaXRlbChjaGlwLCBhenhfZGV2LCBTRF9DVEwsCisJCSAgICAgIGF6eF9zZF9yZWFkbChjaGlwLCBhenhfZGV2LCBTRF9DVEwpIHwgU0RfSU5UX01BU0spOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGFzc2lnbiBhIHN0cmVhbSBmb3IgdGhlIFBDTSAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYXp4X2RldiAqCithenhfYXNzaWduX2RldmljZShzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlpbnQgZGV2LCBpLCBudW1zOworCXN0cnVjdCBhenhfZGV2ICpyZXMgPSBOVUxMOworCS8qIG1ha2UgYSBub24temVybyB1bmlxdWUga2V5IGZvciB0aGUgc3Vic3RyZWFtICovCisJaW50IGtleSA9IChzdWJzdHJlYW0tPnBjbS0+ZGV2aWNlIDw8IDE2KSB8IChzdWJzdHJlYW0tPm51bWJlciA8PCAyKSB8CisJCShzdWJzdHJlYW0tPnN0cmVhbSArIDEpOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJZGV2ID0gY2hpcC0+cGxheWJhY2tfaW5kZXhfb2Zmc2V0OworCQludW1zID0gY2hpcC0+cGxheWJhY2tfc3RyZWFtczsKKwl9IGVsc2UgeworCQlkZXYgPSBjaGlwLT5jYXB0dXJlX2luZGV4X29mZnNldDsKKwkJbnVtcyA9IGNoaXAtPmNhcHR1cmVfc3RyZWFtczsKKwl9CisJZm9yIChpID0gMDsgaSA8IG51bXM7IGkrKywgZGV2KyspIHsKKwkJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSAmY2hpcC0+YXp4X2RldltkZXZdOworCQlkc3BfbG9jayhhenhfZGV2KTsKKwkJaWYgKCFhenhfZGV2LT5vcGVuZWQgJiYgIWRzcF9pc19sb2NrZWQoYXp4X2RldikpIHsKKwkJCXJlcyA9IGF6eF9kZXY7CisJCQlpZiAocmVzLT5hc3NpZ25lZF9rZXkgPT0ga2V5KSB7CisJCQkJcmVzLT5vcGVuZWQgPSAxOworCQkJCXJlcy0+YXNzaWduZWRfa2V5ID0ga2V5OworCQkJCWRzcF91bmxvY2soYXp4X2Rldik7CisJCQkJcmV0dXJuIGF6eF9kZXY7CisJCQl9CisJCX0KKwkJZHNwX3VubG9jayhhenhfZGV2KTsKKwl9CisJaWYgKHJlcykgeworCQlkc3BfbG9jayhyZXMpOworCQlyZXMtPm9wZW5lZCA9IDE7CisJCXJlcy0+YXNzaWduZWRfa2V5ID0ga2V5OworCQlkc3BfdW5sb2NrKHJlcyk7CisJfQorCXJldHVybiByZXM7Cit9CisKKy8qIHJlbGVhc2UgdGhlIGFzc2lnbmVkIHN0cmVhbSAqLworc3RhdGljIGlubGluZSB2b2lkIGF6eF9yZWxlYXNlX2RldmljZShzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKK3sKKwlhenhfZGV2LT5vcGVuZWQgPSAwOworfQorCitzdGF0aWMgY3ljbGVfdCBhenhfY2NfcmVhZChjb25zdCBzdHJ1Y3QgY3ljbGVjb3VudGVyICpjYykKK3sKKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGNvbnRhaW5lcl9vZihjYywgc3RydWN0IGF6eF9kZXYsIGF6eF9jYyk7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBhenhfZGV2LT5zdWJzdHJlYW07CisJc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7CisKKwlyZXR1cm4gYXp4X3JlYWRsKGNoaXAsIFdBTExDTEspOworfQorCitzdGF0aWMgdm9pZCBhenhfdGltZWNvdW50ZXJfaW5pdChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlib29sIGZvcmNlLCBjeWNsZV90IGxhc3QpCit7CisJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCXN0cnVjdCB0aW1lY291bnRlciAqdGMgPSAmYXp4X2Rldi0+YXp4X3RjOworCXN0cnVjdCBjeWNsZWNvdW50ZXIgKmNjID0gJmF6eF9kZXYtPmF6eF9jYzsKKwl1NjQgbnNlYzsKKworCWNjLT5yZWFkID0gYXp4X2NjX3JlYWQ7CisJY2MtPm1hc2sgPSBDTE9DS1NPVVJDRV9NQVNLKDMyKTsKKworCS8qCisJICogQ29udmVydGluZyBmcm9tIDI0IE1IeiB0byBucyBtZWFucyBhcHBseWluZyBhIDEyNS8zIGZhY3Rvci4KKwkgKiBUbyBhdm9pZCBhbnkgc2F0dXJhdGlvbiBpc3N1ZXMgaW4gaW50ZXJtZWRpYXRlIG9wZXJhdGlvbnMsCisJICogdGhlIDEyNSBmYWN0b3IgaXMgYXBwbGllZCBmaXJzdC4gVGhlIGRpdmlzaW9uIGlzIGFwcGxpZWQKKwkgKiBsYXN0IGFmdGVyIHJlYWRpbmcgdGhlIHRpbWVjb3VudGVyIHZhbHVlLgorCSAqIEFwcGx5aW5nIHRoZSAxLzMgZmFjdG9yIGFzIHBhcnQgb2YgdGhlIG11bHRpcGxpY2F0aW9uCisJICogcmVxdWlyZXMgYXQgbGVhc3QgMjAgYml0cyBmb3IgYSBkZWNlbnQgcHJlY2lzaW9uLCBob3dldmVyCisJICogb3ZlcmZsb3dzIG9jY3VyIGFmdGVyIGFib3V0IDQgaG91cnMgb3IgbGVzcywgbm90IGEgb3B0aW9uLgorCSAqLworCisJY2MtPm11bHQgPSAxMjU7IC8qIHNhdHVyYXRpb24gYWZ0ZXIgMTk1IHllYXJzICovCisJY2MtPnNoaWZ0ID0gMDsKKworCW5zZWMgPSAwOyAvKiBhdWRpbyB0aW1lIGlzIGVsYXBzZWQgdGltZSBzaW5jZSB0cmlnZ2VyICovCisJdGltZWNvdW50ZXJfaW5pdCh0YywgY2MsIG5zZWMpOworCWlmIChmb3JjZSkKKwkJLyoKKwkJICogZm9yY2UgdGltZWNvdW50ZXIgdG8gdXNlIHByZWRlZmluZWQgdmFsdWUsCisJCSAqIHVzZWQgZm9yIHN5bmNocm9uaXplZCBzdGFydHMKKwkJICovCisJCXRjLT5jeWNsZV9sYXN0ID0gbGFzdDsKK30KKworc3RhdGljIHU2NCBhenhfYWRqdXN0X2NvZGVjX2RlbGF5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXU2NCBuc2VjKQoreworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSBhcGNtLT5oaW5mb1tzdWJzdHJlYW0tPnN0cmVhbV07CisJdTY0IGNvZGVjX2ZyYW1lcywgY29kZWNfbnNlY3M7CisKKwlpZiAoIWhpbmZvLT5vcHMuZ2V0X2RlbGF5KQorCQlyZXR1cm4gbnNlYzsKKworCWNvZGVjX2ZyYW1lcyA9IGhpbmZvLT5vcHMuZ2V0X2RlbGF5KGhpbmZvLCBhcGNtLT5jb2RlYywgc3Vic3RyZWFtKTsKKwljb2RlY19uc2VjcyA9IGRpdl91NjQoY29kZWNfZnJhbWVzICogMTAwMDAwMDAwMExMLAorCQkJICAgICAgc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlKTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCXJldHVybiBuc2VjICsgY29kZWNfbnNlY3M7CisKKwlyZXR1cm4gKG5zZWMgPiBjb2RlY19uc2VjcykgPyBuc2VjIC0gY29kZWNfbnNlY3MgOiAwOworfQorCisvKgorICogc2V0IHVwIGEgQkRMIGVudHJ5CisgKi8KK3N0YXRpYyBpbnQgc2V0dXBfYmRsZShzdHJ1Y3QgYXp4ICpjaGlwLAorCQkgICAgICBzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmRtYWIsCisJCSAgICAgIHN0cnVjdCBhenhfZGV2ICphenhfZGV2LCB1MzIgKipiZGxwLAorCQkgICAgICBpbnQgb2ZzLCBpbnQgc2l6ZSwgaW50IHdpdGhfaW9jKQoreworCXUzMiAqYmRsID0gKmJkbHA7CisKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJZG1hX2FkZHJfdCBhZGRyOworCQlpbnQgY2h1bms7CisKKwkJaWYgKGF6eF9kZXYtPmZyYWdzID49IEFaWF9NQVhfQkRMX0VOVFJJRVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlhZGRyID0gc25kX3NnYnVmX2dldF9hZGRyKGRtYWIsIG9mcyk7CisJCS8qIHByb2dyYW0gdGhlIGFkZHJlc3MgZmllbGQgb2YgdGhlIEJETCBlbnRyeSAqLworCQliZGxbMF0gPSBjcHVfdG9fbGUzMigodTMyKWFkZHIpOworCQliZGxbMV0gPSBjcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKGFkZHIpKTsKKwkJLyogcHJvZ3JhbSB0aGUgc2l6ZSBmaWVsZCBvZiB0aGUgQkRMIGVudHJ5ICovCisJCWNodW5rID0gc25kX3NnYnVmX2dldF9jaHVua19zaXplKGRtYWIsIG9mcywgc2l6ZSk7CisJCS8qIG9uZSBCRExFIGNhbm5vdCBjcm9zcyA0SyBib3VuZGFyeSBvbiBDVEhEQSBjaGlwcyAqLworCQlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfNEtfQkRMRV9CT1VOREFSWSkgeworCQkJdTMyIHJlbWFpbiA9IDB4MTAwMCAtIChvZnMgJiAweGZmZik7CisJCQlpZiAoY2h1bmsgPiByZW1haW4pCisJCQkJY2h1bmsgPSByZW1haW47CisJCX0KKwkJYmRsWzJdID0gY3B1X3RvX2xlMzIoY2h1bmspOworCQkvKiBwcm9ncmFtIHRoZSBJT0MgdG8gZW5hYmxlIGludGVycnVwdAorCQkgKiBvbmx5IHdoZW4gdGhlIHdob2xlIGZyYWdtZW50IGlzIHByb2Nlc3NlZAorCQkgKi8KKwkJc2l6ZSAtPSBjaHVuazsKKwkJYmRsWzNdID0gKHNpemUgfHwgIXdpdGhfaW9jKSA/IDAgOiBjcHVfdG9fbGUzMigweDAxKTsKKwkJYmRsICs9IDQ7CisJCWF6eF9kZXYtPmZyYWdzKys7CisJCW9mcyArPSBjaHVuazsKKwl9CisJKmJkbHAgPSBiZGw7CisJcmV0dXJuIG9mczsKK30KKworLyoKKyAqIHNldCB1cCBCREwgZW50cmllcworICovCitzdGF0aWMgaW50IGF6eF9zZXR1cF9wZXJpb2RzKHN0cnVjdCBhenggKmNoaXAsCisJCQkgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKK3sKKwl1MzIgKmJkbDsKKwlpbnQgaSwgb2ZzLCBwZXJpb2RzLCBwZXJpb2RfYnl0ZXM7CisJaW50IHBvc19hZGogPSAwOworCisJLyogcmVzZXQgQkRMIGFkZHJlc3MgKi8KKwlhenhfc2Rfd3JpdGVsKGNoaXAsIGF6eF9kZXYsIFNEX0JETFBMLCAwKTsKKwlhenhfc2Rfd3JpdGVsKGNoaXAsIGF6eF9kZXYsIFNEX0JETFBVLCAwKTsKKworCXBlcmlvZF9ieXRlcyA9IGF6eF9kZXYtPnBlcmlvZF9ieXRlczsKKwlwZXJpb2RzID0gYXp4X2Rldi0+YnVmc2l6ZSAvIHBlcmlvZF9ieXRlczsKKworCS8qIHByb2dyYW0gdGhlIGluaXRpYWwgQkRMIGVudHJpZXMgKi8KKwliZGwgPSAodTMyICopYXp4X2Rldi0+YmRsLmFyZWE7CisJb2ZzID0gMDsKKwlhenhfZGV2LT5mcmFncyA9IDA7CisKKwlpZiAoY2hpcC0+YmRsX3Bvc19hZGopCisJCXBvc19hZGogPSBjaGlwLT5iZGxfcG9zX2FkaltjaGlwLT5kZXZfaW5kZXhdOworCWlmICghYXp4X2Rldi0+bm9fcGVyaW9kX3dha2V1cCAmJiBwb3NfYWRqID4gMCkgeworCQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCQlpbnQgcG9zX2FsaWduID0gcG9zX2FkajsKKwkJcG9zX2FkaiA9IChwb3NfYWRqICogcnVudGltZS0+cmF0ZSArIDQ3OTk5KSAvIDQ4MDAwOworCQlpZiAoIXBvc19hZGopCisJCQlwb3NfYWRqID0gcG9zX2FsaWduOworCQllbHNlCisJCQlwb3NfYWRqID0gKChwb3NfYWRqICsgcG9zX2FsaWduIC0gMSkgLyBwb3NfYWxpZ24pICoKKwkJCQlwb3NfYWxpZ247CisJCXBvc19hZGogPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgcG9zX2Fkaik7CisJCWlmIChwb3NfYWRqID49IHBlcmlvZF9ieXRlcykgeworCQkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCJUb28gYmlnIGFkanVzdG1lbnQgJWRcbiIsCisJCQkJIHBvc19hZGopOworCQkJcG9zX2FkaiA9IDA7CisJCX0gZWxzZSB7CisJCQlvZnMgPSBzZXR1cF9iZGxlKGNoaXAsIHNuZF9wY21fZ2V0X2RtYV9idWYoc3Vic3RyZWFtKSwKKwkJCQkJIGF6eF9kZXYsCisJCQkJCSAmYmRsLCBvZnMsIHBvc19hZGosIHRydWUpOworCQkJaWYgKG9mcyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJfQorCX0gZWxzZQorCQlwb3NfYWRqID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBwZXJpb2RzOyBpKyspIHsKKwkJaWYgKGkgPT0gcGVyaW9kcyAtIDEgJiYgcG9zX2FkaikKKwkJCW9mcyA9IHNldHVwX2JkbGUoY2hpcCwgc25kX3BjbV9nZXRfZG1hX2J1ZihzdWJzdHJlYW0pLAorCQkJCQkgYXp4X2RldiwgJmJkbCwgb2ZzLAorCQkJCQkgcGVyaW9kX2J5dGVzIC0gcG9zX2FkaiwgMCk7CisJCWVsc2UKKwkJCW9mcyA9IHNldHVwX2JkbGUoY2hpcCwgc25kX3BjbV9nZXRfZG1hX2J1ZihzdWJzdHJlYW0pLAorCQkJCQkgYXp4X2RldiwgJmJkbCwgb2ZzLAorCQkJCQkgcGVyaW9kX2J5dGVzLAorCQkJCQkgIWF6eF9kZXYtPm5vX3BlcmlvZF93YWtldXApOworCQlpZiAob2ZzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCXJldHVybiAwOworCisgZXJyb3I6CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJUb28gbWFueSBCREwgZW50cmllczogYnVmZmVyPSVkLCBwZXJpb2Q9JWRcbiIsCisJCWF6eF9kZXYtPmJ1ZnNpemUsIHBlcmlvZF9ieXRlcyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBQQ00gb3BzCisgKi8KKworc3RhdGljIGludCBhenhfcGNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSBhcGNtLT5oaW5mb1tzdWJzdHJlYW0tPnN0cmVhbV07CisJc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7CisJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltdXRleF9sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlhenhfZGV2LT5zdWJzdHJlYW0gPSBOVUxMOworCWF6eF9kZXYtPnJ1bm5pbmcgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJYXp4X3JlbGVhc2VfZGV2aWNlKGF6eF9kZXYpOworCWhpbmZvLT5vcHMuY2xvc2UoaGluZm8sIGFwY20tPmNvZGVjLCBzdWJzdHJlYW0pOworCXNuZF9oZGFfcG93ZXJfZG93bihhcGNtLT5jb2RlYyk7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhenhfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCit7CisJc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7CisJaW50IHJldDsKKworCWRzcF9sb2NrKGdldF9henhfZGV2KHN1YnN0cmVhbSkpOworCWlmIChkc3BfaXNfbG9ja2VkKGdldF9henhfZGV2KHN1YnN0cmVhbSkpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJcmV0ID0gY2hpcC0+b3BzLT5zdWJzdHJlYW1fYWxsb2NfcGFnZXMoY2hpcCwgc3Vic3RyZWFtLAorCQkJCQkgIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7Cit1bmxvY2s6CisJZHNwX3VubG9jayhnZXRfYXp4X2RldihzdWJzdHJlYW0pKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF6eF9wY21faHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7CisJc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7CisJc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbyA9IGFwY20tPmhpbmZvW3N1YnN0cmVhbS0+c3RyZWFtXTsKKwlpbnQgZXJyOworCisJLyogcmVzZXQgQkRMIGFkZHJlc3MgKi8KKwlkc3BfbG9jayhhenhfZGV2KTsKKwlpZiAoIWRzcF9pc19sb2NrZWQoYXp4X2RldikpIHsKKwkJYXp4X3NkX3dyaXRlbChjaGlwLCBhenhfZGV2LCBTRF9CRExQTCwgMCk7CisJCWF6eF9zZF93cml0ZWwoY2hpcCwgYXp4X2RldiwgU0RfQkRMUFUsIDApOworCQlhenhfc2Rfd3JpdGVsKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCwgMCk7CisJCWF6eF9kZXYtPmJ1ZnNpemUgPSAwOworCQlhenhfZGV2LT5wZXJpb2RfYnl0ZXMgPSAwOworCQlhenhfZGV2LT5mb3JtYXRfdmFsID0gMDsKKwl9CisKKwlzbmRfaGRhX2NvZGVjX2NsZWFudXAoYXBjbS0+Y29kZWMsIGhpbmZvLCBzdWJzdHJlYW0pOworCisJZXJyID0gY2hpcC0+b3BzLT5zdWJzdHJlYW1fZnJlZV9wYWdlcyhjaGlwLCBzdWJzdHJlYW0pOworCWF6eF9kZXYtPnByZXBhcmVkID0gMDsKKwlkc3BfdW5sb2NrKGF6eF9kZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYXp4X3BjbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOworCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvID0gYXBjbS0+aGluZm9bc3Vic3RyZWFtLT5zdHJlYW1dOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJdW5zaWduZWQgaW50IGJ1ZnNpemUsIHBlcmlvZF9ieXRlcywgZm9ybWF0X3ZhbCwgc3RyZWFtX3RhZzsKKwlpbnQgZXJyOworCXN0cnVjdCBoZGFfc3BkaWZfb3V0ICpzcGRpZiA9CisJCXNuZF9oZGFfc3BkaWZfb3V0X29mX25pZChhcGNtLT5jb2RlYywgaGluZm8tPm5pZCk7CisJdW5zaWduZWQgc2hvcnQgY3RscyA9IHNwZGlmID8gc3BkaWYtPmN0bHMgOiAwOworCisJZHNwX2xvY2soYXp4X2Rldik7CisJaWYgKGRzcF9pc19sb2NrZWQoYXp4X2RldikpIHsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlhenhfc3RyZWFtX3Jlc2V0KGNoaXAsIGF6eF9kZXYpOworCWZvcm1hdF92YWwgPSBzbmRfaGRhX2NhbGNfc3RyZWFtX2Zvcm1hdChydW50aW1lLT5yYXRlLAorCQkJCQkJcnVudGltZS0+Y2hhbm5lbHMsCisJCQkJCQlydW50aW1lLT5mb3JtYXQsCisJCQkJCQloaW5mby0+bWF4YnBzLAorCQkJCQkJY3Rscyk7CisJaWYgKCFmb3JtYXRfdmFsKSB7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImludmFsaWQgZm9ybWF0X3ZhbCwgcmF0ZT0lZCwgY2g9JWQsIGZvcm1hdD0lZFxuIiwKKwkJCXJ1bnRpbWUtPnJhdGUsIHJ1bnRpbWUtPmNoYW5uZWxzLCBydW50aW1lLT5mb3JtYXQpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlidWZzaXplID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CisJcGVyaW9kX2J5dGVzID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7CisKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImF6eF9wY21fcHJlcGFyZTogYnVmc2l6ZT0weCV4LCBmb3JtYXQ9MHgleFxuIiwKKwkJYnVmc2l6ZSwgZm9ybWF0X3ZhbCk7CisKKwlpZiAoYnVmc2l6ZSAhPSBhenhfZGV2LT5idWZzaXplIHx8CisJICAgIHBlcmlvZF9ieXRlcyAhPSBhenhfZGV2LT5wZXJpb2RfYnl0ZXMgfHwKKwkgICAgZm9ybWF0X3ZhbCAhPSBhenhfZGV2LT5mb3JtYXRfdmFsIHx8CisJICAgIHJ1bnRpbWUtPm5vX3BlcmlvZF93YWtldXAgIT0gYXp4X2Rldi0+bm9fcGVyaW9kX3dha2V1cCkgeworCQlhenhfZGV2LT5idWZzaXplID0gYnVmc2l6ZTsKKwkJYXp4X2Rldi0+cGVyaW9kX2J5dGVzID0gcGVyaW9kX2J5dGVzOworCQlhenhfZGV2LT5mb3JtYXRfdmFsID0gZm9ybWF0X3ZhbDsKKwkJYXp4X2Rldi0+bm9fcGVyaW9kX3dha2V1cCA9IHJ1bnRpbWUtPm5vX3BlcmlvZF93YWtldXA7CisJCWVyciA9IGF6eF9zZXR1cF9wZXJpb2RzKGNoaXAsIHN1YnN0cmVhbSwgYXp4X2Rldik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byB1bmxvY2s7CisJfQorCisJLyogd2hlbiBMUElCIGRlbGF5IGNvcnJlY3Rpb24gZ2l2ZXMgYSBzbWFsbCBuZWdhdGl2ZSB2YWx1ZSwKKwkgKiB3ZSBpZ25vcmUgaXQ7IGN1cnJlbnRseSBzZXQgdGhlIHRocmVzaG9sZCBzdGF0aWNhbGx5IHRvCisJICogNjQgZnJhbWVzCisJICovCisJaWYgKHJ1bnRpbWUtPnBlcmlvZF9zaXplID4gNjQpCisJCWF6eF9kZXYtPmRlbGF5X25lZ2F0aXZlX3RocmVzaG9sZCA9IC1mcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgNjQpOworCWVsc2UKKwkJYXp4X2Rldi0+ZGVsYXlfbmVnYXRpdmVfdGhyZXNob2xkID0gMDsKKworCS8qIHdhbGxjbGsgaGFzIDI0TWh6IGNsb2NrIHNvdXJjZSAqLworCWF6eF9kZXYtPnBlcmlvZF93YWxsY2xrID0gKCgocnVudGltZS0+cGVyaW9kX3NpemUgKiAyNDAwMCkgLworCQkJCQkJcnVudGltZS0+cmF0ZSkgKiAxMDAwKTsKKwlhenhfc2V0dXBfY29udHJvbGxlcihjaGlwLCBhenhfZGV2KTsKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJYXp4X2Rldi0+Zmlmb19zaXplID0KKwkJCWF6eF9zZF9yZWFkdyhjaGlwLCBhenhfZGV2LCBTRF9GSUZPU0laRSkgKyAxOworCWVsc2UKKwkJYXp4X2Rldi0+Zmlmb19zaXplID0gMDsKKworCXN0cmVhbV90YWcgPSBhenhfZGV2LT5zdHJlYW1fdGFnOworCS8qIENBLUlCRyBjaGlwcyBuZWVkIHRoZSBwbGF5YmFjayBzdHJlYW0gc3RhcnRpbmcgZnJvbSAxICovCisJaWYgKChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19DVFhfV09SS0FST1VORCkgJiYKKwkgICAgc3RyZWFtX3RhZyA+IGNoaXAtPmNhcHR1cmVfc3RyZWFtcykKKwkJc3RyZWFtX3RhZyAtPSBjaGlwLT5jYXB0dXJlX3N0cmVhbXM7CisJZXJyID0gc25kX2hkYV9jb2RlY19wcmVwYXJlKGFwY20tPmNvZGVjLCBoaW5mbywgc3RyZWFtX3RhZywKKwkJCQkgICAgIGF6eF9kZXYtPmZvcm1hdF92YWwsIHN1YnN0cmVhbSk7CisKKyB1bmxvY2s6CisJaWYgKCFlcnIpCisJCWF6eF9kZXYtPnByZXBhcmVkID0gMTsKKwlkc3BfdW5sb2NrKGF6eF9kZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYXp4X3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOworCXN0cnVjdCBhenhfZGV2ICphenhfZGV2OworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqczsKKwlpbnQgcnN0YXJ0ID0gMCwgc3RhcnQsIG5zeW5jID0gMCwgc2JpdHMgPSAwOworCWludCBud2FpdCwgdGltZW91dDsKKworCWF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCXRyYWNlX2F6eF9wY21fdHJpZ2dlcihjaGlwLCBhenhfZGV2LCBjbWQpOworCisJaWYgKGRzcF9pc19sb2NrZWQoYXp4X2RldikgfHwgIWF6eF9kZXYtPnByZXBhcmVkKQorCQlyZXR1cm4gLUVQSVBFOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlyc3RhcnQgPSAxOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwkJc3RhcnQgPSAxOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJc3RhcnQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgeworCQlpZiAocy0+cGNtLT5jYXJkICE9IHN1YnN0cmVhbS0+cGNtLT5jYXJkKQorCQkJY29udGludWU7CisJCWF6eF9kZXYgPSBnZXRfYXp4X2RldihzKTsKKwkJc2JpdHMgfD0gMSA8PCBhenhfZGV2LT5pbmRleDsKKwkJbnN5bmMrKzsKKwkJc25kX3BjbV90cmlnZ2VyX2RvbmUocywgc3Vic3RyZWFtKTsKKwl9CisKKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKworCS8qIGZpcnN0LCBzZXQgU1lOQyBiaXRzIG9mIGNvcnJlc3BvbmRpbmcgc3RyZWFtcyAqLworCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19PTERfU1NZTkMpCisJCWF6eF93cml0ZWwoY2hpcCwgT0xEX1NTWU5DLAorCQkJYXp4X3JlYWRsKGNoaXAsIE9MRF9TU1lOQykgfCBzYml0cyk7CisJZWxzZQorCQlhenhfd3JpdGVsKGNoaXAsIFNTWU5DLCBhenhfcmVhZGwoY2hpcCwgU1NZTkMpIHwgc2JpdHMpOworCisJc25kX3BjbV9ncm91cF9mb3JfZWFjaF9lbnRyeShzLCBzdWJzdHJlYW0pIHsKKwkJaWYgKHMtPnBjbS0+Y2FyZCAhPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZCkKKwkJCWNvbnRpbnVlOworCQlhenhfZGV2ID0gZ2V0X2F6eF9kZXYocyk7CisJCWlmIChzdGFydCkgeworCQkJYXp4X2Rldi0+c3RhcnRfd2FsbGNsayA9IGF6eF9yZWFkbChjaGlwLCBXQUxMQ0xLKTsKKwkJCWlmICghcnN0YXJ0KQorCQkJCWF6eF9kZXYtPnN0YXJ0X3dhbGxjbGsgLT0KKwkJCQkJCWF6eF9kZXYtPnBlcmlvZF93YWxsY2xrOworCQkJYXp4X3N0cmVhbV9zdGFydChjaGlwLCBhenhfZGV2KTsKKwkJfSBlbHNlIHsKKwkJCWF6eF9zdHJlYW1fc3RvcChjaGlwLCBhenhfZGV2KTsKKwkJfQorCQlhenhfZGV2LT5ydW5uaW5nID0gc3RhcnQ7CisJfQorCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJaWYgKHN0YXJ0KSB7CisJCS8qIHdhaXQgdW50aWwgYWxsIEZJRk9zIGdldCByZWFkeSAqLworCQlmb3IgKHRpbWVvdXQgPSA1MDAwOyB0aW1lb3V0OyB0aW1lb3V0LS0pIHsKKwkJCW53YWl0ID0gMDsKKwkJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7CisJCQkJaWYgKHMtPnBjbS0+Y2FyZCAhPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZCkKKwkJCQkJY29udGludWU7CisJCQkJYXp4X2RldiA9IGdldF9henhfZGV2KHMpOworCQkJCWlmICghKGF6eF9zZF9yZWFkYihjaGlwLCBhenhfZGV2LCBTRF9TVFMpICYKKwkJCQkgICAgICBTRF9TVFNfRklGT19SRUFEWSkpCisJCQkJCW53YWl0Kys7CisJCQl9CisJCQlpZiAoIW53YWl0KQorCQkJCWJyZWFrOworCQkJY3B1X3JlbGF4KCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiB3YWl0IHVudGlsIGFsbCBSVU4gYml0cyBhcmUgY2xlYXJlZCAqLworCQlmb3IgKHRpbWVvdXQgPSA1MDAwOyB0aW1lb3V0OyB0aW1lb3V0LS0pIHsKKwkJCW53YWl0ID0gMDsKKwkJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7CisJCQkJaWYgKHMtPnBjbS0+Y2FyZCAhPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZCkKKwkJCQkJY29udGludWU7CisJCQkJYXp4X2RldiA9IGdldF9henhfZGV2KHMpOworCQkJCWlmIChhenhfc2RfcmVhZGIoY2hpcCwgYXp4X2RldiwgU0RfQ1RMKSAmCisJCQkJICAgIFNEX0NUTF9ETUFfU1RBUlQpCisJCQkJCW53YWl0Kys7CisJCQl9CisJCQlpZiAoIW53YWl0KQorCQkJCWJyZWFrOworCQkJY3B1X3JlbGF4KCk7CisJCX0KKwl9CisJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJLyogcmVzZXQgU1lOQyBiaXRzICovCisJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX09MRF9TU1lOQykKKwkJYXp4X3dyaXRlbChjaGlwLCBPTERfU1NZTkMsCisJCQlhenhfcmVhZGwoY2hpcCwgT0xEX1NTWU5DKSAmIH5zYml0cyk7CisJZWxzZQorCQlhenhfd3JpdGVsKGNoaXAsIFNTWU5DLCBhenhfcmVhZGwoY2hpcCwgU1NZTkMpICYgfnNiaXRzKTsKKwlpZiAoc3RhcnQpIHsKKwkJYXp4X3RpbWVjb3VudGVyX2luaXQoc3Vic3RyZWFtLCAwLCAwKTsKKwkJaWYgKG5zeW5jID4gMSkgeworCQkJY3ljbGVfdCBjeWNsZV9sYXN0OworCisJCQkvKiBzYW1lIHN0YXJ0IGN5Y2xlIGZvciBtYXN0ZXIgYW5kIGdyb3VwICovCisJCQlhenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKKwkJCWN5Y2xlX2xhc3QgPSBhenhfZGV2LT5henhfdGMuY3ljbGVfbGFzdDsKKworCQkJc25kX3BjbV9ncm91cF9mb3JfZWFjaF9lbnRyeShzLCBzdWJzdHJlYW0pIHsKKwkJCQlpZiAocy0+cGNtLT5jYXJkICE9IHN1YnN0cmVhbS0+cGNtLT5jYXJkKQorCQkJCQljb250aW51ZTsKKwkJCQlhenhfdGltZWNvdW50ZXJfaW5pdChzLCAxLCBjeWNsZV9sYXN0KTsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCisvKiBnZXQgdGhlIGN1cnJlbnQgRE1BIHBvc2l0aW9uIHdpdGggY29ycmVjdGlvbiBvbiBWSUEgY2hpcHMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X3ZpYV9nZXRfcG9zaXRpb24oc3RydWN0IGF6eCAqY2hpcCwKKwkJCQkJIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KQoreworCXVuc2lnbmVkIGludCBsaW5rX3BvcywgbWluaV9wb3MsIGJvdW5kX3BvczsKKwl1bnNpZ25lZCBpbnQgbW9kX2xpbmtfcG9zLCBtb2RfZG1hX3BvcywgbW9kX21pbmlfcG9zOworCXVuc2lnbmVkIGludCBmaWZvX3NpemU7CisKKwlsaW5rX3BvcyA9IGF6eF9zZF9yZWFkbChjaGlwLCBhenhfZGV2LCBTRF9MUElCKTsKKwlpZiAoYXp4X2Rldi0+c3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQkvKiBQbGF5YmFjaywgbm8gcHJvYmxlbSB1c2luZyBsaW5rIHBvc2l0aW9uICovCisJCXJldHVybiBsaW5rX3BvczsKKwl9CisKKwkvKiBDYXB0dXJlICovCisJLyogRm9yIG5ldyBjaGlwc2V0LAorCSAqIHVzZSBtb2QgdG8gZ2V0IHRoZSBETUEgcG9zaXRpb24ganVzdCBsaWtlIG9sZCBjaGlwc2V0CisJICovCisJbW9kX2RtYV9wb3MgPSBsZTMyX3RvX2NwdSgqYXp4X2Rldi0+cG9zYnVmKTsKKwltb2RfZG1hX3BvcyAlPSBhenhfZGV2LT5wZXJpb2RfYnl0ZXM7CisKKwkvKiBhenhfZGV2LT5maWZvX3NpemUgY2FuJ3QgZ2V0IEZJRk8gc2l6ZSBvZiBpbiBzdHJlYW0uCisJICogR2V0IGZyb20gYmFzZSBhZGRyZXNzICsgb2Zmc2V0LgorCSAqLworCWZpZm9fc2l6ZSA9IHJlYWR3KGNoaXAtPnJlbWFwX2FkZHIgKyBWSUFfSU5fU1RSRUFNMF9GSUZPX1NJWkVfT0ZGU0VUKTsKKworCWlmIChhenhfZGV2LT5pbnN1ZmZpY2llbnQpIHsKKwkJLyogTGluayBwb3NpdGlvbiBuZXZlciBnYXRoZXIgdGhhbiBGSUZPIHNpemUgKi8KKwkJaWYgKGxpbmtfcG9zIDw9IGZpZm9fc2l6ZSkKKwkJCXJldHVybiAwOworCisJCWF6eF9kZXYtPmluc3VmZmljaWVudCA9IDA7CisJfQorCisJaWYgKGxpbmtfcG9zIDw9IGZpZm9fc2l6ZSkKKwkJbWluaV9wb3MgPSBhenhfZGV2LT5idWZzaXplICsgbGlua19wb3MgLSBmaWZvX3NpemU7CisJZWxzZQorCQltaW5pX3BvcyA9IGxpbmtfcG9zIC0gZmlmb19zaXplOworCisJLyogRmluZCBuZWFyZXN0IHByZXZpb3VzIGJvdWRhcnkgKi8KKwltb2RfbWluaV9wb3MgPSBtaW5pX3BvcyAlIGF6eF9kZXYtPnBlcmlvZF9ieXRlczsKKwltb2RfbGlua19wb3MgPSBsaW5rX3BvcyAlIGF6eF9kZXYtPnBlcmlvZF9ieXRlczsKKwlpZiAobW9kX2xpbmtfcG9zID49IGZpZm9fc2l6ZSkKKwkJYm91bmRfcG9zID0gbGlua19wb3MgLSBtb2RfbGlua19wb3M7CisJZWxzZSBpZiAobW9kX2RtYV9wb3MgPj0gbW9kX21pbmlfcG9zKQorCQlib3VuZF9wb3MgPSBtaW5pX3BvcyAtIG1vZF9taW5pX3BvczsKKwllbHNlIHsKKwkJYm91bmRfcG9zID0gbWluaV9wb3MgLSBtb2RfbWluaV9wb3MgKyBhenhfZGV2LT5wZXJpb2RfYnl0ZXM7CisJCWlmIChib3VuZF9wb3MgPj0gYXp4X2Rldi0+YnVmc2l6ZSkKKwkJCWJvdW5kX3BvcyA9IDA7CisJfQorCisJLyogQ2FsY3VsYXRlIHJlYWwgRE1BIHBvc2l0aW9uIHdlIHdhbnQgKi8KKwlyZXR1cm4gYm91bmRfcG9zICsgbW9kX2RtYV9wb3M7Cit9CisKK3Vuc2lnbmVkIGludCBhenhfZ2V0X3Bvc2l0aW9uKHN0cnVjdCBhenggKmNoaXAsCisJCQkgICAgICBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiwKKwkJCSAgICAgIGJvb2wgd2l0aF9jaGVjaykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGF6eF9kZXYtPnN1YnN0cmVhbTsKKwlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBpbnQgcG9zOworCWludCBzdHJlYW0gPSBzdWJzdHJlYW0tPnN0cmVhbTsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvID0gYXBjbS0+aGluZm9bc3RyZWFtXTsKKwlpbnQgZGVsYXkgPSAwOworCisJc3dpdGNoIChjaGlwLT5wb3NpdGlvbl9maXhbc3RyZWFtXSkgeworCWNhc2UgUE9TX0ZJWF9MUElCOgorCQkvKiByZWFkIExQSUIgKi8KKwkJcG9zID0gYXp4X3NkX3JlYWRsKGNoaXAsIGF6eF9kZXYsIFNEX0xQSUIpOworCQlicmVhazsKKwljYXNlIFBPU19GSVhfVklBQ09NQk86CisJCXBvcyA9IGF6eF92aWFfZ2V0X3Bvc2l0aW9uKGNoaXAsIGF6eF9kZXYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiB1c2UgdGhlIHBvc2l0aW9uIGJ1ZmZlciAqLworCQlwb3MgPSBsZTMyX3RvX2NwdSgqYXp4X2Rldi0+cG9zYnVmKTsKKwkJaWYgKHdpdGhfY2hlY2sgJiYgY2hpcC0+cG9zaXRpb25fZml4W3N0cmVhbV0gPT0gUE9TX0ZJWF9BVVRPKSB7CisJCQlpZiAoIXBvcyB8fCBwb3MgPT0gKHUzMiktMSkgeworCQkJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkJICJJbnZhbGlkIHBvc2l0aW9uIGJ1ZmZlciwgdXNpbmcgTFBJQiByZWFkIG1ldGhvZCBpbnN0ZWFkLlxuIik7CisJCQkJY2hpcC0+cG9zaXRpb25fZml4W3N0cmVhbV0gPSBQT1NfRklYX0xQSUI7CisJCQkJcG9zID0gYXp4X3NkX3JlYWRsKGNoaXAsIGF6eF9kZXYsIFNEX0xQSUIpOworCQkJfSBlbHNlCisJCQkJY2hpcC0+cG9zaXRpb25fZml4W3N0cmVhbV0gPSBQT1NfRklYX1BPU0JVRjsKKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAocG9zID49IGF6eF9kZXYtPmJ1ZnNpemUpCisJCXBvcyA9IDA7CisKKwkvKiBjYWxjdWxhdGUgcnVudGltZSBkZWxheSBmcm9tIExQSUIgKi8KKwlpZiAoc3Vic3RyZWFtLT5ydW50aW1lICYmCisJICAgIGNoaXAtPnBvc2l0aW9uX2ZpeFtzdHJlYW1dID09IFBPU19GSVhfUE9TQlVGICYmCisJICAgIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19DT1VOVF9MUElCX0RFTEFZKSkgeworCQl1bnNpZ25lZCBpbnQgbHBpYl9wb3MgPSBhenhfc2RfcmVhZGwoY2hpcCwgYXp4X2RldiwgU0RfTFBJQik7CisJCWlmIChzdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJCWRlbGF5ID0gcG9zIC0gbHBpYl9wb3M7CisJCWVsc2UKKwkJCWRlbGF5ID0gbHBpYl9wb3MgLSBwb3M7CisJCWlmIChkZWxheSA8IDApIHsKKwkJCWlmIChkZWxheSA+PSBhenhfZGV2LT5kZWxheV9uZWdhdGl2ZV90aHJlc2hvbGQpCisJCQkJZGVsYXkgPSAwOworCQkJZWxzZQorCQkJCWRlbGF5ICs9IGF6eF9kZXYtPmJ1ZnNpemU7CisJCX0KKwkJaWYgKGRlbGF5ID49IGF6eF9kZXYtPnBlcmlvZF9ieXRlcykgeworCQkJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSAiVW5zdGFibGUgTFBJQiAoJWQgPj0gJWQpOyBkaXNhYmxpbmcgTFBJQiBkZWxheSBjb3VudGluZ1xuIiwKKwkJCQkgZGVsYXksIGF6eF9kZXYtPnBlcmlvZF9ieXRlcyk7CisJCQlkZWxheSA9IDA7CisJCQljaGlwLT5kcml2ZXJfY2FwcyAmPSB+QVpYX0RDQVBTX0NPVU5UX0xQSUJfREVMQVk7CisJCX0KKwkJZGVsYXkgPSBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBkZWxheSk7CisJfQorCisJaWYgKHN1YnN0cmVhbS0+cnVudGltZSkgeworCQlpZiAoaGluZm8tPm9wcy5nZXRfZGVsYXkpCisJCQlkZWxheSArPSBoaW5mby0+b3BzLmdldF9kZWxheShoaW5mbywgYXBjbS0+Y29kZWMsCisJCQkJCQkgICAgICBzdWJzdHJlYW0pOworCQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRlbGF5ID0gZGVsYXk7CisJfQorCisJdHJhY2VfYXp4X2dldF9wb3NpdGlvbihjaGlwLCBhenhfZGV2LCBwb3MsIGRlbGF5KTsKKwlyZXR1cm4gcG9zOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2dldF9wb3NpdGlvbik7CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBhenhfcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7CisJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLAorCQkJICAgICAgIGF6eF9nZXRfcG9zaXRpb24oY2hpcCwgYXp4X2RldiwgZmFsc2UpKTsKK30KKworc3RhdGljIGludCBhenhfZ2V0X3dhbGxjbG9ja190c3RhbXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7CisJdTY0IG5zZWM7CisKKwluc2VjID0gdGltZWNvdW50ZXJfcmVhZCgmYXp4X2Rldi0+YXp4X3RjKTsKKwluc2VjID0gZGl2X3U2NChuc2VjLCAzKTsgLyogY2FuIGJlIG9wdGltaXplZCAqLworCW5zZWMgPSBhenhfYWRqdXN0X2NvZGVjX2RlbGF5KHN1YnN0cmVhbSwgbnNlYyk7CisKKwkqdHMgPSBuc190b190aW1lc3BlYyhuc2VjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgYXp4X3BjbV9odyA9IHsKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJIC8qIE5vIGZ1bGwtcmVzdW1lIHlldCBpbXBsZW1lbnRlZCAqLworCQkJCSAvKiBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfCovCisJCQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJCQkgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0hBU19XQUxMX0NMT0NLIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTk9fUEVSSU9EX1dBS0VVUCksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCS5yYXRlX21pbiA9CQk0ODAwMCwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkyLAorCS5jaGFubmVsc19tYXggPQkJMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9CUFaWF9NQVhfQlVGX1NJWkUsCisJLnBlcmlvZF9ieXRlc19taW4gPQkxMjgsCisJLnBlcmlvZF9ieXRlc19tYXggPQlBWlhfTUFYX0JVRl9TSVpFIC8gMiwKKwkucGVyaW9kc19taW4gPQkJMiwKKwkucGVyaW9kc19tYXggPQkJQVpYX01BWF9GUkFHLAorCS5maWZvX3NpemUgPQkJMCwKK307CisKK3N0YXRpYyBpbnQgYXp4X3BjbV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSBhcGNtLT5oaW5mb1tzdWJzdHJlYW0tPnN0cmVhbV07CisJc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7CisJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXY7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisJaW50IGJ1ZmZfc3RlcDsKKworCW11dGV4X2xvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOworCWF6eF9kZXYgPSBhenhfYXNzaWduX2RldmljZShjaGlwLCBzdWJzdHJlYW0pOworCWlmIChhenhfZGV2ID09IE5VTEwpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcnVudGltZS0+aHcgPSBhenhfcGNtX2h3OworCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbiA9IGhpbmZvLT5jaGFubmVsc19taW47CisJcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0gaGluZm8tPmNoYW5uZWxzX21heDsKKwlydW50aW1lLT5ody5mb3JtYXRzID0gaGluZm8tPmZvcm1hdHM7CisJcnVudGltZS0+aHcucmF0ZXMgPSBoaW5mby0+cmF0ZXM7CisJc25kX3BjbV9saW1pdF9od19yYXRlcyhydW50aW1lKTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7CisKKwkvKiBhdm9pZCB3cmFwLWFyb3VuZCB3aXRoIHdhbGwtY2xvY2sgKi8KKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfVElNRSwKKwkJCQkgICAgIDIwLAorCQkJCSAgICAgMTc4MDAwMDAwKTsKKworCWlmIChjaGlwLT5hbGlnbl9idWZmZXJfc2l6ZSkKKwkJLyogY29uc3RyYWluIGJ1ZmZlciBzaXplcyB0byBiZSBtdWx0aXBsZSBvZiAxMjgKKwkJICAgYnl0ZXMuIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgaW4gdGVybXMgb2YgbWVtb3J5CisJCSAgIGFjY2VzcyBidXQgaXNuJ3QgcmVxdWlyZWQgYnkgdGhlIEhEQSBzcGVjIGFuZAorCQkgICBwcmV2ZW50cyB1c2VycyBmcm9tIHNwZWNpZnlpbmcgZXhhY3QgcGVyaW9kL2J1ZmZlcgorCQkgICBzaXplcy4gRm9yIGV4YW1wbGUgZm9yIDQ0LjFrSHosIGEgcGVyaW9kIHNpemUgc2V0CisJCSAgIHRvIDIwbXMgd2lsbCBiZSByb3VuZGVkIHRvIDE5LjU5bXMuICovCisJCWJ1ZmZfc3RlcCA9IDEyODsKKwllbHNlCisJCS8qIERvbid0IGVuZm9yY2Ugc3RlcHMgb24gYnVmZmVyIHNpemVzLCBzdGlsbCBuZWVkIHRvCisJCSAgIGJlIG11bHRpcGxlIG9mIDQgYnl0ZXMgKEhEQSBzcGVjKS4gVGVzdGVkIG9uIEludGVsCisJCSAgIEhEQSBjb250cm9sbGVycywgbWF5IG5vdCB3b3JrIG9uIGFsbCBkZXZpY2VzIHdoZXJlCisJCSAgIG9wdGlvbiBuZWVkcyB0byBiZSBkaXNhYmxlZCAqLworCQlidWZmX3N0ZXAgPSA0OworCisJc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywKKwkJCQkgICBidWZmX3N0ZXApOworCXNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfQllURVMsCisJCQkJICAgYnVmZl9zdGVwKTsKKwlzbmRfaGRhX3Bvd2VyX3VwX2Qzd2FpdChhcGNtLT5jb2RlYyk7CisJZXJyID0gaGluZm8tPm9wcy5vcGVuKGhpbmZvLCBhcGNtLT5jb2RlYywgc3Vic3RyZWFtKTsKKwlpZiAoZXJyIDwgMCkgeworCQlhenhfcmVsZWFzZV9kZXZpY2UoYXp4X2Rldik7CisJCXNuZF9oZGFfcG93ZXJfZG93bihhcGNtLT5jb2RlYyk7CisJCW11dGV4X3VubG9jaygmY2hpcC0+b3Blbl9tdXRleCk7CisJCXJldHVybiBlcnI7CisJfQorCXNuZF9wY21fbGltaXRfaHdfcmF0ZXMocnVudGltZSk7CisJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKHNuZF9CVUdfT04oIXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbikgfHwKKwkgICAgc25kX0JVR19PTighcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4KSB8fAorCSAgICBzbmRfQlVHX09OKCFydW50aW1lLT5ody5mb3JtYXRzKSB8fAorCSAgICBzbmRfQlVHX09OKCFydW50aW1lLT5ody5yYXRlcykpIHsKKwkJYXp4X3JlbGVhc2VfZGV2aWNlKGF6eF9kZXYpOworCQloaW5mby0+b3BzLmNsb3NlKGhpbmZvLCBhcGNtLT5jb2RlYywgc3Vic3RyZWFtKTsKKwkJc25kX2hkYV9wb3dlcl9kb3duKGFwY20tPmNvZGVjKTsKKwkJbXV0ZXhfdW5sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogZGlzYWJsZSBXQUxMQ0xPQ0sgdGltZXN0YW1wcyBmb3IgY2FwdHVyZSBzdHJlYW1zCisJICAgdW50aWwgd2UgZmlndXJlIG91dCBob3cgdG8gaGFuZGxlIGRpZ2l0YWwgaW5wdXRzICovCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKKwkJcnVudGltZS0+aHcuaW5mbyAmPSB+U05EUlZfUENNX0lORk9fSEFTX1dBTExfQ0xPQ0s7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlhenhfZGV2LT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJYXp4X2Rldi0+cnVubmluZyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IGF6eF9kZXY7CisJc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOworCW11dGV4X3VubG9jaygmY2hpcC0+b3Blbl9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXp4X3BjbV9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICphcmVhKQoreworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOworCWlmIChjaGlwLT5vcHMtPnBjbV9tbWFwX3ByZXBhcmUpCisJCWNoaXAtPm9wcy0+cGNtX21tYXBfcHJlcGFyZShzdWJzdHJlYW0sIGFyZWEpOworCXJldHVybiBzbmRfcGNtX2xpYl9kZWZhdWx0X21tYXAoc3Vic3RyZWFtLCBhcmVhKTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBhenhfcGNtX29wcyA9IHsKKwkub3BlbiA9IGF6eF9wY21fb3BlbiwKKwkuY2xvc2UgPSBhenhfcGNtX2Nsb3NlLAorCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPSBhenhfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9IGF6eF9wY21faHdfZnJlZSwKKwkucHJlcGFyZSA9IGF6eF9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciA9IGF6eF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9IGF6eF9wY21fcG9pbnRlciwKKwkud2FsbF9jbG9jayA9ICBhenhfZ2V0X3dhbGxjbG9ja190c3RhbXAsCisJLm1tYXAgPSBhenhfcGNtX21tYXAsCisJLnBhZ2UgPSBzbmRfcGNtX3NnYnVmX29wc19wYWdlLAorfTsKKworc3RhdGljIHZvaWQgYXp4X3BjbV9mcmVlKHN0cnVjdCBzbmRfcGNtICpwY20pCit7CisJc3RydWN0IGF6eF9wY20gKmFwY20gPSBwY20tPnByaXZhdGVfZGF0YTsKKwlpZiAoYXBjbSkgeworCQlsaXN0X2RlbCgmYXBjbS0+bGlzdCk7CisJCWtmcmVlKGFwY20pOworCX0KK30KKworI2RlZmluZSBNQVhfUFJFQUxMT0NfU0laRQkoMzIgKiAxMDI0ICogMTAyNCkKKworc3RhdGljIGludCBhenhfYXR0YWNoX3BjbV9zdHJlYW0oc3RydWN0IGhkYV9idXMgKmJ1cywgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJIHN0cnVjdCBoZGFfcGNtICpjcGNtKQoreworCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtOworCXN0cnVjdCBhenhfcGNtICphcGNtOworCWludCBwY21fZGV2ID0gY3BjbS0+ZGV2aWNlOworCXVuc2lnbmVkIGludCBzaXplOworCWludCBzLCBlcnI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFwY20sICZjaGlwLT5wY21fbGlzdCwgbGlzdCkgeworCQlpZiAoYXBjbS0+cGNtLT5kZXZpY2UgPT0gcGNtX2RldikgeworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJQQ00gJWQgYWxyZWFkeSBleGlzdHNcbiIsCisJCQkJcGNtX2Rldik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsIGNwY20tPm5hbWUsIHBjbV9kZXYsCisJCQkgIGNwY20tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW1zLAorCQkJICBjcGNtLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW1zLAorCQkJICAmcGNtKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlzdHJsY3B5KHBjbS0+bmFtZSwgY3BjbS0+bmFtZSwgc2l6ZW9mKHBjbS0+bmFtZSkpOworCWFwY20gPSBremFsbG9jKHNpemVvZigqYXBjbSksIEdGUF9LRVJORUwpOworCWlmIChhcGNtID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWFwY20tPmNoaXAgPSBjaGlwOworCWFwY20tPnBjbSA9IHBjbTsKKwlhcGNtLT5jb2RlYyA9IGNvZGVjOworCXBjbS0+cHJpdmF0ZV9kYXRhID0gYXBjbTsKKwlwY20tPnByaXZhdGVfZnJlZSA9IGF6eF9wY21fZnJlZTsKKwlpZiAoY3BjbS0+cGNtX3R5cGUgPT0gSERBX1BDTV9UWVBFX01PREVNKQorCQlwY20tPmRldl9jbGFzcyA9IFNORFJWX1BDTV9DTEFTU19NT0RFTTsKKwlsaXN0X2FkZF90YWlsKCZhcGNtLT5saXN0LCAmY2hpcC0+cGNtX2xpc3QpOworCWNwY20tPnBjbSA9IHBjbTsKKwlmb3IgKHMgPSAwOyBzIDwgMjsgcysrKSB7CisJCWFwY20tPmhpbmZvW3NdID0gJmNwY20tPnN0cmVhbVtzXTsKKwkJaWYgKGNwY20tPnN0cmVhbVtzXS5zdWJzdHJlYW1zKQorCQkJc25kX3BjbV9zZXRfb3BzKHBjbSwgcywgJmF6eF9wY21fb3BzKTsKKwl9CisJLyogYnVmZmVyIHByZS1hbGxvY2F0aW9uICovCisJc2l6ZSA9IENPTkZJR19TTkRfSERBX1BSRUFMTE9DX1NJWkUgKiAxMDI0OworCWlmIChzaXplID4gTUFYX1BSRUFMTE9DX1NJWkUpCisJCXNpemUgPSBNQVhfUFJFQUxMT0NfU0laRTsKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWX1NHLAorCQkJCQkgICAgICBjaGlwLT5jYXJkLT5kZXYsCisJCQkJCSAgICAgIHNpemUsIE1BWF9QUkVBTExPQ19TSVpFKTsKKwkvKiBsaW5rIHRvIGNvZGVjICovCisJcGNtLT5kZXYgPSAmY29kZWMtPmRldjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENPUkIgLyBSSVJCIGludGVyZmFjZQorICovCitzdGF0aWMgaW50IGF6eF9hbGxvY19jbWRfaW8oc3RydWN0IGF6eCAqY2hpcCkKK3sKKwlpbnQgZXJyOworCisJLyogc2luZ2xlIHBhZ2UgKGF0IGxlYXN0IDQwOTYgYnl0ZXMpIG11c3Qgc3VmZmljZSBmb3IgYm90aCByaW5nYnVmZmVzICovCisJZXJyID0gY2hpcC0+b3BzLT5kbWFfYWxsb2NfcGFnZXMoY2hpcCwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkgUEFHRV9TSVpFLCAmY2hpcC0+cmIpOworCWlmIChlcnIgPCAwKQorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBDT1JCL1JJUkJcbiIpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhenhfYWxsb2NfY21kX2lvKTsKKworc3RhdGljIHZvaWQgYXp4X2luaXRfY21kX2lvKHN0cnVjdCBhenggKmNoaXApCit7CisJaW50IHRpbWVvdXQ7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJLyogQ09SQiBzZXQgdXAgKi8KKwljaGlwLT5jb3JiLmFkZHIgPSBjaGlwLT5yYi5hZGRyOworCWNoaXAtPmNvcmIuYnVmID0gKHUzMiAqKWNoaXAtPnJiLmFyZWE7CisJYXp4X3dyaXRlbChjaGlwLCBDT1JCTEJBU0UsICh1MzIpY2hpcC0+Y29yYi5hZGRyKTsKKwlhenhfd3JpdGVsKGNoaXAsIENPUkJVQkFTRSwgdXBwZXJfMzJfYml0cyhjaGlwLT5jb3JiLmFkZHIpKTsKKworCS8qIHNldCB0aGUgY29yYiBzaXplIHRvIDI1NiBlbnRyaWVzIChVTEkgcmVxdWlyZXMgZXhwbGljaXRseSkgKi8KKwlhenhfd3JpdGViKGNoaXAsIENPUkJTSVpFLCAweDAyKTsKKwkvKiBzZXQgdGhlIGNvcmIgd3JpdGUgcG9pbnRlciB0byAwICovCisJYXp4X3dyaXRldyhjaGlwLCBDT1JCV1AsIDApOworCisJLyogcmVzZXQgdGhlIGNvcmIgaHcgcmVhZCBwb2ludGVyICovCisJYXp4X3dyaXRldyhjaGlwLCBDT1JCUlAsIElDSDZfQ09SQlJQX1JTVCk7CisJZm9yICh0aW1lb3V0ID0gMTAwMDsgdGltZW91dCA+IDA7IHRpbWVvdXQtLSkgeworCQlpZiAoKGF6eF9yZWFkdyhjaGlwLCBDT1JCUlApICYgSUNINl9DT1JCUlBfUlNUKSA9PSBJQ0g2X0NPUkJSUF9SU1QpCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCX0KKwlpZiAodGltZW91dCA8PSAwKQorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkNPUkIgcmVzZXQgdGltZW91dCMxLCBDT1JCUlAgPSAlZFxuIiwKKwkJCWF6eF9yZWFkdyhjaGlwLCBDT1JCUlApKTsKKworCWF6eF93cml0ZXcoY2hpcCwgQ09SQlJQLCAwKTsKKwlmb3IgKHRpbWVvdXQgPSAxMDAwOyB0aW1lb3V0ID4gMDsgdGltZW91dC0tKSB7CisJCWlmIChhenhfcmVhZHcoY2hpcCwgQ09SQlJQKSA9PSAwKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9CisJaWYgKHRpbWVvdXQgPD0gMCkKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDT1JCIHJlc2V0IHRpbWVvdXQjMiwgQ09SQlJQID0gJWRcbiIsCisJCQlhenhfcmVhZHcoY2hpcCwgQ09SQlJQKSk7CisKKwkvKiBlbmFibGUgY29yYiBkbWEgKi8KKwlhenhfd3JpdGViKGNoaXAsIENPUkJDVEwsIElDSDZfQ09SQkNUTF9SVU4pOworCisJLyogUklSQiBzZXQgdXAgKi8KKwljaGlwLT5yaXJiLmFkZHIgPSBjaGlwLT5yYi5hZGRyICsgMjA0ODsKKwljaGlwLT5yaXJiLmJ1ZiA9ICh1MzIgKikoY2hpcC0+cmIuYXJlYSArIDIwNDgpOworCWNoaXAtPnJpcmIud3AgPSBjaGlwLT5yaXJiLnJwID0gMDsKKwltZW1zZXQoY2hpcC0+cmlyYi5jbWRzLCAwLCBzaXplb2YoY2hpcC0+cmlyYi5jbWRzKSk7CisJYXp4X3dyaXRlbChjaGlwLCBSSVJCTEJBU0UsICh1MzIpY2hpcC0+cmlyYi5hZGRyKTsKKwlhenhfd3JpdGVsKGNoaXAsIFJJUkJVQkFTRSwgdXBwZXJfMzJfYml0cyhjaGlwLT5yaXJiLmFkZHIpKTsKKworCS8qIHNldCB0aGUgcmlyYiBzaXplIHRvIDI1NiBlbnRyaWVzIChVTEkgcmVxdWlyZXMgZXhwbGljaXRseSkgKi8KKwlhenhfd3JpdGViKGNoaXAsIFJJUkJTSVpFLCAweDAyKTsKKwkvKiByZXNldCB0aGUgcmlyYiBodyB3cml0ZSBwb2ludGVyICovCisJYXp4X3dyaXRldyhjaGlwLCBSSVJCV1AsIElDSDZfUklSQldQX1JTVCk7CisJLyogc2V0IE49MSwgZ2V0IFJJUkIgcmVzcG9uc2UgaW50ZXJydXB0IGZvciBuZXcgZW50cnkgKi8KKwlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfQ1RYX1dPUktBUk9VTkQpCisJCWF6eF93cml0ZXcoY2hpcCwgUklOVENOVCwgMHhjMCk7CisJZWxzZQorCQlhenhfd3JpdGV3KGNoaXAsIFJJTlRDTlQsIDEpOworCS8qIGVuYWJsZSByaXJiIGRtYSBhbmQgcmVzcG9uc2UgaXJxICovCisJYXp4X3dyaXRlYihjaGlwLCBSSVJCQ1RMLCBJQ0g2X1JCQ1RMX0RNQV9FTiB8IElDSDZfUkJDVExfSVJRX0VOKTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGF6eF9pbml0X2NtZF9pbyk7CisKK3N0YXRpYyB2b2lkIGF6eF9mcmVlX2NtZF9pbyhzdHJ1Y3QgYXp4ICpjaGlwKQoreworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwkvKiBkaXNhYmxlIHJpbmdidWZmZXIgRE1BcyAqLworCWF6eF93cml0ZWIoY2hpcCwgUklSQkNUTCwgMCk7CisJYXp4X3dyaXRlYihjaGlwLCBDT1JCQ1RMLCAwKTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGF6eF9mcmVlX2NtZF9pbyk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X2NvbW1hbmRfYWRkcih1MzIgY21kKQoreworCXVuc2lnbmVkIGludCBhZGRyID0gY21kID4+IDI4OworCisJaWYgKGFkZHIgPj0gQVpYX01BWF9DT0RFQ1MpIHsKKwkJc25kX0JVRygpOworCQlhZGRyID0gMDsKKwl9CisKKwlyZXR1cm4gYWRkcjsKK30KKworLyogc2VuZCBhIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgYXp4X2NvcmJfc2VuZF9jbWQoc3RydWN0IGhkYV9idXMgKmJ1cywgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IGFkZHIgPSBhenhfY29tbWFuZF9hZGRyKHZhbCk7CisJdW5zaWduZWQgaW50IHdwLCBycDsKKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKworCS8qIGFkZCBjb21tYW5kIHRvIGNvcmIgKi8KKwl3cCA9IGF6eF9yZWFkdyhjaGlwLCBDT1JCV1ApOworCWlmICh3cCA9PSAweGZmZmYpIHsKKwkJLyogc29tZXRoaW5nIHdyb25nLCBjb250cm9sbGVyIGxpa2VseSB0dXJuZWQgdG8gRDMgKi8KKwkJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJCXJldHVybiAtRUlPOworCX0KKwl3cCsrOworCXdwICU9IElDSDZfTUFYX0NPUkJfRU5UUklFUzsKKworCXJwID0gYXp4X3JlYWR3KGNoaXAsIENPUkJSUCk7CisJaWYgKHdwID09IHJwKSB7CisJCS8qIG9vcHMsIGl0J3MgZnVsbCAqLworCQlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJY2hpcC0+cmlyYi5jbWRzW2FkZHJdKys7CisJY2hpcC0+Y29yYi5idWZbd3BdID0gY3B1X3RvX2xlMzIodmFsKTsKKwlhenhfd3JpdGV3KGNoaXAsIENPUkJXUCwgd3ApOworCisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBJQ0g2X1JJUkJfRVhfVU5TT0xfRVYJKDE8PDQpCisKKy8qIHJldHJpZXZlIFJJUkIgZW50cnkgLSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIHZvaWQgYXp4X3VwZGF0ZV9yaXJiKHN0cnVjdCBhenggKmNoaXApCit7CisJdW5zaWduZWQgaW50IHJwLCB3cDsKKwl1bnNpZ25lZCBpbnQgYWRkcjsKKwl1MzIgcmVzLCByZXNfZXg7CisKKwl3cCA9IGF6eF9yZWFkdyhjaGlwLCBSSVJCV1ApOworCWlmICh3cCA9PSAweGZmZmYpIHsKKwkJLyogc29tZXRoaW5nIHdyb25nLCBjb250cm9sbGVyIGxpa2VseSB0dXJuZWQgdG8gRDMgKi8KKwkJcmV0dXJuOworCX0KKworCWlmICh3cCA9PSBjaGlwLT5yaXJiLndwKQorCQlyZXR1cm47CisJY2hpcC0+cmlyYi53cCA9IHdwOworCisJd2hpbGUgKGNoaXAtPnJpcmIucnAgIT0gd3ApIHsKKwkJY2hpcC0+cmlyYi5ycCsrOworCQljaGlwLT5yaXJiLnJwICU9IElDSDZfTUFYX1JJUkJfRU5UUklFUzsKKworCQlycCA9IGNoaXAtPnJpcmIucnAgPDwgMTsgLyogYW4gUklSQiBlbnRyeSBpcyA4LWJ5dGVzICovCisJCXJlc19leCA9IGxlMzJfdG9fY3B1KGNoaXAtPnJpcmIuYnVmW3JwICsgMV0pOworCQlyZXMgPSBsZTMyX3RvX2NwdShjaGlwLT5yaXJiLmJ1ZltycF0pOworCQlhZGRyID0gcmVzX2V4ICYgMHhmOworCQlpZiAoKGFkZHIgPj0gQVpYX01BWF9DT0RFQ1MpIHx8ICEoY2hpcC0+Y29kZWNfbWFzayAmICgxIDw8IGFkZHIpKSkgeworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJzcHVyaW91cyByZXNwb25zZSAlI3g6JSN4LCBycCA9ICVkLCB3cCA9ICVkIiwKKwkJCQlyZXMsIHJlc19leCwKKwkJCQljaGlwLT5yaXJiLnJwLCB3cCk7CisJCQlzbmRfQlVHKCk7CisJCX0KKwkJZWxzZSBpZiAocmVzX2V4ICYgSUNINl9SSVJCX0VYX1VOU09MX0VWKQorCQkJc25kX2hkYV9xdWV1ZV91bnNvbF9ldmVudChjaGlwLT5idXMsIHJlcywgcmVzX2V4KTsKKwkJZWxzZSBpZiAoY2hpcC0+cmlyYi5jbWRzW2FkZHJdKSB7CisJCQljaGlwLT5yaXJiLnJlc1thZGRyXSA9IHJlczsKKwkJCXNtcF93bWIoKTsKKwkJCWNoaXAtPnJpcmIuY21kc1thZGRyXS0tOworCQl9IGVsc2UgaWYgKHByaW50a19yYXRlbGltaXQoKSkgeworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJzcHVyaW91cyByZXNwb25zZSAlI3g6JSN4LCBsYXN0IGNtZD0lIzA4eFxuIiwKKwkJCQlyZXMsIHJlc19leCwKKwkJCQljaGlwLT5sYXN0X2NtZFthZGRyXSk7CisJCX0KKwl9Cit9CisKKy8qIHJlY2VpdmUgYSByZXNwb25zZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBhenhfcmlyYl9nZXRfcmVzcG9uc2Uoc3RydWN0IGhkYV9idXMgKmJ1cywKKwkJCQkJICB1bnNpZ25lZCBpbnQgYWRkcikKK3sKKwlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgbG9vcGNvdW50ZXI7CisJaW50IGRvX3BvbGwgPSAwOworCisgYWdhaW46CisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCisJZm9yIChsb29wY291bnRlciA9IDA7OyBsb29wY291bnRlcisrKSB7CisJCWlmIChjaGlwLT5wb2xsaW5nX21vZGUgfHwgZG9fcG9sbCkgeworCQkJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCQkJYXp4X3VwZGF0ZV9yaXJiKGNoaXApOworCQkJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJCX0KKwkJaWYgKCFjaGlwLT5yaXJiLmNtZHNbYWRkcl0pIHsKKwkJCXNtcF9ybWIoKTsKKwkJCWJ1cy0+cmlyYl9lcnJvciA9IDA7CisKKwkJCWlmICghZG9fcG9sbCkKKwkJCQljaGlwLT5wb2xsX2NvdW50ID0gMDsKKwkJCXJldHVybiBjaGlwLT5yaXJiLnJlc1thZGRyXTsgLyogdGhlIGxhc3QgdmFsdWUgKi8KKwkJfQorCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCWJyZWFrOworCQlpZiAoYnVzLT5uZWVkc19kYW1uX2xvbmdfZGVsYXkgfHwgbG9vcGNvdW50ZXIgPiAzMDAwKQorCQkJbXNsZWVwKDIpOyAvKiB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCAqLworCQllbHNlIHsKKwkJCXVkZWxheSgxMCk7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJfQorCX0KKworCWlmICghYnVzLT5ub19yZXNwb25zZV9mYWxsYmFjaykKKwkJcmV0dXJuIC0xOworCisJaWYgKCFjaGlwLT5wb2xsaW5nX21vZGUgJiYgY2hpcC0+cG9sbF9jb3VudCA8IDIpIHsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiYXp4X2dldF9yZXNwb25zZSB0aW1lb3V0LCBwb2xsaW5nIHRoZSBjb2RlYyBvbmNlOiBsYXN0IGNtZD0weCUwOHhcbiIsCisJCQljaGlwLT5sYXN0X2NtZFthZGRyXSk7CisJCWRvX3BvbGwgPSAxOworCQljaGlwLT5wb2xsX2NvdW50Kys7CisJCWdvdG8gYWdhaW47CisJfQorCisKKwlpZiAoIWNoaXAtPnBvbGxpbmdfbW9kZSkgeworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsCisJCQkgImF6eF9nZXRfcmVzcG9uc2UgdGltZW91dCwgc3dpdGNoaW5nIHRvIHBvbGxpbmcgbW9kZTogbGFzdCBjbWQ9MHglMDh4XG4iLAorCQkJIGNoaXAtPmxhc3RfY21kW2FkZHJdKTsKKwkJY2hpcC0+cG9sbGluZ19tb2RlID0gMTsKKwkJZ290byBhZ2FpbjsKKwl9CisKKwlpZiAoY2hpcC0+bXNpKSB7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwKKwkJCSAiTm8gcmVzcG9uc2UgZnJvbSBjb2RlYywgZGlzYWJsaW5nIE1TSTogbGFzdCBjbWQ9MHglMDh4XG4iLAorCQkJIGNoaXAtPmxhc3RfY21kW2FkZHJdKTsKKwkJaWYgKGNoaXAtPm9wcy0+ZGlzYWJsZV9tc2lfcmVzZXRfaXJxKGNoaXApICYmCisJCSAgICBjaGlwLT5vcHMtPmRpc2FibGVfbXNpX3Jlc2V0X2lycShjaGlwKSA8IDApIHsKKwkJCWJ1cy0+cmlyYl9lcnJvciA9IDE7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZ290byBhZ2FpbjsKKwl9CisKKwlpZiAoY2hpcC0+cHJvYmluZykgeworCQkvKiBJZiB0aGlzIGNyaXRpY2FsIHRpbWVvdXQgaGFwcGVucyBkdXJpbmcgdGhlIGNvZGVjIHByb2JpbmcKKwkJICogcGhhc2UsIHRoaXMgaXMgbGlrZWx5IGFuIGFjY2VzcyB0byBhIG5vbi1leGlzdGluZyBjb2RlYworCQkgKiBzbG90LiAgQmV0dGVyIHRvIHJldHVybiBhbiBlcnJvciBhbmQgcmVzZXQgdGhlIHN5c3RlbS4KKwkJICovCisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBhIGZhdGFsIGNvbW11bmljYXRpb24gZXJyb3I7IG5lZWQgZWl0aGVyIHRvIHJlc2V0IG9yIHRvIGZhbGxiYWNrCisJICogdG8gdGhlIHNpbmdsZV9jbWQgbW9kZQorCSAqLworCWJ1cy0+cmlyYl9lcnJvciA9IDE7CisJaWYgKGJ1cy0+YWxsb3dfYnVzX3Jlc2V0ICYmICFidXMtPnJlc3BvbnNlX3Jlc2V0ICYmICFidXMtPmluX3Jlc2V0KSB7CisJCWJ1cy0+cmVzcG9uc2VfcmVzZXQgPSAxOworCQlyZXR1cm4gLTE7IC8qIGdpdmUgYSBjaGFuY2UgdG8gcmV0cnkgKi8KKwl9CisKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJImF6eF9nZXRfcmVzcG9uc2UgdGltZW91dCwgc3dpdGNoaW5nIHRvIHNpbmdsZV9jbWQgbW9kZTogbGFzdCBjbWQ9MHglMDh4XG4iLAorCQljaGlwLT5sYXN0X2NtZFthZGRyXSk7CisJY2hpcC0+c2luZ2xlX2NtZCA9IDE7CisJYnVzLT5yZXNwb25zZV9yZXNldCA9IDA7CisJLyogcmVsZWFzZSBDT1JCL1JJUkIgKi8KKwlhenhfZnJlZV9jbWRfaW8oY2hpcCk7CisJLyogZGlzYWJsZSB1bnNvbGljaXRlZCByZXNwb25zZXMgKi8KKwlhenhfd3JpdGVsKGNoaXAsIEdDVEwsIGF6eF9yZWFkbChjaGlwLCBHQ1RMKSAmIH5JQ0g2X0dDVExfVU5TT0wpOworCXJldHVybiAtMTsKK30KKworLyoKKyAqIFVzZSB0aGUgc2luZ2xlIGltbWVkaWF0ZSBjb21tYW5kIGluc3RlYWQgb2YgQ09SQi9SSVJCIGZvciBzaW1wbGljaXR5CisgKgorICogTm90ZTogYWNjb3JkaW5nIHRvIEludGVsLCB0aGlzIGlzIG5vdCBwcmVmZXJyZWQgdXNlLiAgVGhlIGNvbW1hbmQgd2FzCisgKiAgICAgICBpbnRlbmRlZCBmb3IgdGhlIEJJT1Mgb25seSwgYW5kIG1heSBnZXQgY29uZnVzZWQgd2l0aCB1bnNvbGljaXRlZAorICogICAgICAgcmVzcG9uc2VzLiAgU28sIHdlIHNob3VsZG4ndCB1c2UgaXQgZm9yIG5vcm1hbCBvcGVyYXRpb24gZnJvbSB0aGUKKyAqICAgICAgIGRyaXZlci4KKyAqICAgICAgIEkgbGVmdCB0aGUgY29kZXMsIGhvd2V2ZXIsIGZvciBkZWJ1Z2dpbmcvdGVzdGluZyBwdXJwb3Nlcy4KKyAqLworCisvKiByZWNlaXZlIGEgcmVzcG9uc2UgKi8KK3N0YXRpYyBpbnQgYXp4X3NpbmdsZV93YWl0X2Zvcl9yZXNwb25zZShzdHJ1Y3QgYXp4ICpjaGlwLCB1bnNpZ25lZCBpbnQgYWRkcikKK3sKKwlpbnQgdGltZW91dCA9IDUwOworCisJd2hpbGUgKHRpbWVvdXQtLSkgeworCQkvKiBjaGVjayBJUlYgYnVzeSBiaXQgKi8KKwkJaWYgKGF6eF9yZWFkdyhjaGlwLCBJUlMpICYgSUNINl9JUlNfVkFMSUQpIHsKKwkJCS8qIHJldXNlIHJpcmIucmVzIGFzIHRoZSByZXNwb25zZSByZXR1cm4gdmFsdWUgKi8KKwkJCWNoaXAtPnJpcmIucmVzW2FkZHJdID0gYXp4X3JlYWRsKGNoaXAsIElSKTsKKwkJCXJldHVybiAwOworCQl9CisJCXVkZWxheSgxKTsKKwl9CisJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJnZXRfcmVzcG9uc2UgdGltZW91dDogSVJTPTB4JXhcbiIsCisJCQlhenhfcmVhZHcoY2hpcCwgSVJTKSk7CisJY2hpcC0+cmlyYi5yZXNbYWRkcl0gPSAtMTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyogc2VuZCBhIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgYXp4X3NpbmdsZV9zZW5kX2NtZChzdHJ1Y3QgaGRhX2J1cyAqYnVzLCB1MzIgdmFsKQoreworCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgYWRkciA9IGF6eF9jb21tYW5kX2FkZHIodmFsKTsKKwlpbnQgdGltZW91dCA9IDUwOworCisJYnVzLT5yaXJiX2Vycm9yID0gMDsKKwl3aGlsZSAodGltZW91dC0tKSB7CisJCS8qIGNoZWNrIElDQiBidXN5IGJpdCAqLworCQlpZiAoISgoYXp4X3JlYWR3KGNoaXAsIElSUykgJiBJQ0g2X0lSU19CVVNZKSkpIHsKKwkJCS8qIENsZWFyIElSViB2YWxpZCBiaXQgKi8KKwkJCWF6eF93cml0ZXcoY2hpcCwgSVJTLCBhenhfcmVhZHcoY2hpcCwgSVJTKSB8CisJCQkJICAgSUNINl9JUlNfVkFMSUQpOworCQkJYXp4X3dyaXRlbChjaGlwLCBJQywgdmFsKTsKKwkJCWF6eF93cml0ZXcoY2hpcCwgSVJTLCBhenhfcmVhZHcoY2hpcCwgSVJTKSB8CisJCQkJICAgSUNINl9JUlNfQlVTWSk7CisJCQlyZXR1cm4gYXp4X3NpbmdsZV93YWl0X2Zvcl9yZXNwb25zZShjaGlwLCBhZGRyKTsKKwkJfQorCQl1ZGVsYXkoMSk7CisJfQorCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInNlbmRfY21kIHRpbWVvdXQ6IElSUz0weCV4LCB2YWw9MHgleFxuIiwKKwkJCWF6eF9yZWFkdyhjaGlwLCBJUlMpLCB2YWwpOworCXJldHVybiAtRUlPOworfQorCisvKiByZWNlaXZlIGEgcmVzcG9uc2UgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X3NpbmdsZV9nZXRfcmVzcG9uc2Uoc3RydWN0IGhkYV9idXMgKmJ1cywKKwkJCQkJICAgIHVuc2lnbmVkIGludCBhZGRyKQoreworCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKKwlyZXR1cm4gY2hpcC0+cmlyYi5yZXNbYWRkcl07Cit9CisKKy8qCisgKiBUaGUgYmVsb3cgYXJlIHRoZSBtYWluIGNhbGxiYWNrcyBmcm9tIGhkYV9jb2RlYy4KKyAqCisgKiBUaGV5IGFyZSBqdXN0IHRoZSBza2VsZXRvbiB0byBjYWxsIHN1Yi1jYWxsYmFja3MgYWNjb3JkaW5nIHRvIHRoZQorICogY3VycmVudCBzZXR0aW5nIG9mIGNoaXAtPnNpbmdsZV9jbWQuCisgKi8KKworLyogc2VuZCBhIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgYXp4X3NlbmRfY21kKHN0cnVjdCBoZGFfYnVzICpidXMsIHVuc2lnbmVkIGludCB2YWwpCit7CisJc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGNoaXAtPmRpc2FibGVkKQorCQlyZXR1cm4gMDsKKwljaGlwLT5sYXN0X2NtZFthenhfY29tbWFuZF9hZGRyKHZhbCldID0gdmFsOworCWlmIChjaGlwLT5zaW5nbGVfY21kKQorCQlyZXR1cm4gYXp4X3NpbmdsZV9zZW5kX2NtZChidXMsIHZhbCk7CisJZWxzZQorCQlyZXR1cm4gYXp4X2NvcmJfc2VuZF9jbWQoYnVzLCB2YWwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X3NlbmRfY21kKTsKKworLyogZ2V0IGEgcmVzcG9uc2UgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X2dldF9yZXNwb25zZShzdHJ1Y3QgaGRhX2J1cyAqYnVzLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGFkZHIpCit7CisJc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCWlmIChjaGlwLT5kaXNhYmxlZCkKKwkJcmV0dXJuIDA7CisJaWYgKGNoaXAtPnNpbmdsZV9jbWQpCisJCXJldHVybiBhenhfc2luZ2xlX2dldF9yZXNwb25zZShidXMsIGFkZHIpOworCWVsc2UKKwkJcmV0dXJuIGF6eF9yaXJiX2dldF9yZXNwb25zZShidXMsIGFkZHIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2dldF9yZXNwb25zZSk7CisKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9EU1BfTE9BREVSCisvKgorICogRFNQIGxvYWRpbmcgY29kZSAoZS5nLiBmb3IgQ0EwMTMyKQorICovCisKKy8qIHVzZSB0aGUgZmlyc3Qgc3RyZWFtIGZvciBsb2FkaW5nIERTUCAqLworc3RhdGljIHN0cnVjdCBhenhfZGV2ICoKK2F6eF9nZXRfZHNwX2xvYWRlcl9kZXYoc3RydWN0IGF6eCAqY2hpcCkKK3sKKwlyZXR1cm4gJmNoaXAtPmF6eF9kZXZbY2hpcC0+cGxheWJhY2tfaW5kZXhfb2Zmc2V0XTsKK30KKworc3RhdGljIGludCBhenhfbG9hZF9kc3BfcHJlcGFyZShzdHJ1Y3QgaGRhX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJCXVuc2lnbmVkIGludCBieXRlX3NpemUsCisJCQkJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWZwKQoreworCXUzMiAqYmRsOworCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldjsKKwlpbnQgZXJyOworCisJYXp4X2RldiA9IGF6eF9nZXRfZHNwX2xvYWRlcl9kZXYoY2hpcCk7CisKKwlkc3BfbG9jayhhenhfZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJaWYgKGF6eF9kZXYtPnJ1bm5pbmcgfHwgYXp4X2Rldi0+bG9ja2VkKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gdW5sb2NrOworCX0KKwlhenhfZGV2LT5wcmVwYXJlZCA9IDA7CisJY2hpcC0+c2F2ZWRfYXp4X2RldiA9ICphenhfZGV2OworCWF6eF9kZXYtPmxvY2tlZCA9IDE7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisKKwllcnIgPSBjaGlwLT5vcHMtPmRtYV9hbGxvY19wYWdlcyhjaGlwLCBTTkRSVl9ETUFfVFlQRV9ERVZfU0csCisJCQkJCSBieXRlX3NpemUsIGJ1ZnApOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycl9hbGxvYzsKKworCWF6eF9kZXYtPmJ1ZnNpemUgPSBieXRlX3NpemU7CisJYXp4X2Rldi0+cGVyaW9kX2J5dGVzID0gYnl0ZV9zaXplOworCWF6eF9kZXYtPmZvcm1hdF92YWwgPSBmb3JtYXQ7CisKKwlhenhfc3RyZWFtX3Jlc2V0KGNoaXAsIGF6eF9kZXYpOworCisJLyogcmVzZXQgQkRMIGFkZHJlc3MgKi8KKwlhenhfc2Rfd3JpdGVsKGNoaXAsIGF6eF9kZXYsIFNEX0JETFBMLCAwKTsKKwlhenhfc2Rfd3JpdGVsKGNoaXAsIGF6eF9kZXYsIFNEX0JETFBVLCAwKTsKKworCWF6eF9kZXYtPmZyYWdzID0gMDsKKwliZGwgPSAodTMyICopYXp4X2Rldi0+YmRsLmFyZWE7CisJZXJyID0gc2V0dXBfYmRsZShjaGlwLCBidWZwLCBhenhfZGV2LCAmYmRsLCAwLCBieXRlX3NpemUsIDApOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCisJYXp4X3NldHVwX2NvbnRyb2xsZXIoY2hpcCwgYXp4X2Rldik7CisJZHNwX3VubG9jayhhenhfZGV2KTsKKwlyZXR1cm4gYXp4X2Rldi0+c3RyZWFtX3RhZzsKKworIGVycm9yOgorCWNoaXAtPm9wcy0+ZG1hX2ZyZWVfcGFnZXMoY2hpcCwgYnVmcCk7CisgZXJyX2FsbG9jOgorCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlpZiAoYXp4X2Rldi0+b3BlbmVkKQorCQkqYXp4X2RldiA9IGNoaXAtPnNhdmVkX2F6eF9kZXY7CisJYXp4X2Rldi0+bG9ja2VkID0gMDsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKyB1bmxvY2s6CisJZHNwX3VubG9jayhhenhfZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBhenhfbG9hZF9kc3BfdHJpZ2dlcihzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBib29sIHN0YXJ0KQoreworCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGF6eF9nZXRfZHNwX2xvYWRlcl9kZXYoY2hpcCk7CisKKwlpZiAoc3RhcnQpCisJCWF6eF9zdHJlYW1fc3RhcnQoY2hpcCwgYXp4X2Rldik7CisJZWxzZQorCQlhenhfc3RyZWFtX3N0b3AoY2hpcCwgYXp4X2Rldik7CisJYXp4X2Rldi0+cnVubmluZyA9IHN0YXJ0OworfQorCitzdGF0aWMgdm9pZCBhenhfbG9hZF9kc3BfY2xlYW51cChzdHJ1Y3QgaGRhX2J1cyAqYnVzLAorCQkJCSBzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmRtYWIpCit7CisJc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gYXp4X2dldF9kc3BfbG9hZGVyX2RldihjaGlwKTsKKworCWlmICghZG1hYi0+YXJlYSB8fCAhYXp4X2Rldi0+bG9ja2VkKQorCQlyZXR1cm47CisKKwlkc3BfbG9jayhhenhfZGV2KTsKKwkvKiByZXNldCBCREwgYWRkcmVzcyAqLworCWF6eF9zZF93cml0ZWwoY2hpcCwgYXp4X2RldiwgU0RfQkRMUEwsIDApOworCWF6eF9zZF93cml0ZWwoY2hpcCwgYXp4X2RldiwgU0RfQkRMUFUsIDApOworCWF6eF9zZF93cml0ZWwoY2hpcCwgYXp4X2RldiwgU0RfQ1RMLCAwKTsKKwlhenhfZGV2LT5idWZzaXplID0gMDsKKwlhenhfZGV2LT5wZXJpb2RfYnl0ZXMgPSAwOworCWF6eF9kZXYtPmZvcm1hdF92YWwgPSAwOworCisJY2hpcC0+b3BzLT5kbWFfZnJlZV9wYWdlcyhjaGlwLCBkbWFiKTsKKwlkbWFiLT5hcmVhID0gTlVMTDsKKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlpZiAoYXp4X2Rldi0+b3BlbmVkKQorCQkqYXp4X2RldiA9IGNoaXAtPnNhdmVkX2F6eF9kZXY7CisJYXp4X2Rldi0+bG9ja2VkID0gMDsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlkc3BfdW5sb2NrKGF6eF9kZXYpOworfQorI2VuZGlmIC8qIENPTkZJR19TTkRfSERBX0RTUF9MT0FERVIgKi8KKworaW50IGF6eF9hbGxvY19zdHJlYW1fcGFnZXMoc3RydWN0IGF6eCAqY2hpcCkKK3sKKwlpbnQgaSwgZXJyOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGNoaXAtPmNhcmQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3N0cmVhbXM7IGkrKykgeworCQlkc3BfbG9ja19pbml0KCZjaGlwLT5henhfZGV2W2ldKTsKKwkJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgQkRMIGZvciBlYWNoIHN0cmVhbSAqLworCQllcnIgPSBjaGlwLT5vcHMtPmRtYV9hbGxvY19wYWdlcyhjaGlwLCBTTkRSVl9ETUFfVFlQRV9ERVYsCisJCQkJCQkgQkRMX1NJWkUsCisJCQkJCQkgJmNoaXAtPmF6eF9kZXZbaV0uYmRsKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIEJETFxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwb3NpdGlvbiBidWZmZXIgKi8KKwllcnIgPSBjaGlwLT5vcHMtPmRtYV9hbGxvY19wYWdlcyhjaGlwLCBTTkRSVl9ETUFfVFlQRV9ERVYsCisJCQkJCSBjaGlwLT5udW1fc3RyZWFtcyAqIDgsICZjaGlwLT5wb3NidWYpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIHBvc2J1ZlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIGFsbG9jYXRlIENPUkIvUklSQiAqLworCWVyciA9IGF6eF9hbGxvY19jbWRfaW8oY2hpcCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhenhfYWxsb2Nfc3RyZWFtX3BhZ2VzKTsKKwordm9pZCBhenhfZnJlZV9zdHJlYW1fcGFnZXMoc3RydWN0IGF6eCAqY2hpcCkKK3sKKwlpbnQgaTsKKwlpZiAoY2hpcC0+YXp4X2RldikgeworCQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3N0cmVhbXM7IGkrKykKKwkJCWlmIChjaGlwLT5henhfZGV2W2ldLmJkbC5hcmVhKQorCQkJCWNoaXAtPm9wcy0+ZG1hX2ZyZWVfcGFnZXMoCisJCQkJCWNoaXAsICZjaGlwLT5henhfZGV2W2ldLmJkbCk7CisJfQorCWlmIChjaGlwLT5yYi5hcmVhKQorCQljaGlwLT5vcHMtPmRtYV9mcmVlX3BhZ2VzKGNoaXAsICZjaGlwLT5yYik7CisJaWYgKGNoaXAtPnBvc2J1Zi5hcmVhKQorCQljaGlwLT5vcHMtPmRtYV9mcmVlX3BhZ2VzKGNoaXAsICZjaGlwLT5wb3NidWYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2ZyZWVfc3RyZWFtX3BhZ2VzKTsKKworLyoKKyAqIExvd2xldmVsIGludGVyZmFjZQorICovCisKKy8qIGVudGVyIGxpbmsgcmVzZXQgKi8KK3ZvaWQgYXp4X2VudGVyX2xpbmtfcmVzZXQoc3RydWN0IGF6eCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwkvKiByZXNldCBjb250cm9sbGVyICovCisJYXp4X3dyaXRlbChjaGlwLCBHQ1RMLCBhenhfcmVhZGwoY2hpcCwgR0NUTCkgJiB+SUNINl9HQ1RMX1JFU0VUKTsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOworCXdoaWxlICgoYXp4X3JlYWRiKGNoaXAsIEdDVEwpICYgSUNINl9HQ1RMX1JFU0VUKSAmJgorCQkJdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpCisJCXVzbGVlcF9yYW5nZSg1MDAsIDEwMDApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2VudGVyX2xpbmtfcmVzZXQpOworCisvKiBleGl0IGxpbmsgcmVzZXQgKi8KK3N0YXRpYyB2b2lkIGF6eF9leGl0X2xpbmtfcmVzZXQoc3RydWN0IGF6eCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlhenhfd3JpdGViKGNoaXAsIEdDVEwsIGF6eF9yZWFkYihjaGlwLCBHQ1RMKSB8IElDSDZfR0NUTF9SRVNFVCk7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKwl3aGlsZSAoIWF6eF9yZWFkYihjaGlwLCBHQ1RMKSAmJgorCQkJdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpCisJCXVzbGVlcF9yYW5nZSg1MDAsIDEwMDApOworfQorCisvKiByZXNldCBjb2RlYyBsaW5rICovCitzdGF0aWMgaW50IGF6eF9yZXNldChzdHJ1Y3QgYXp4ICpjaGlwLCBpbnQgZnVsbF9yZXNldCkKK3sKKwlpZiAoIWZ1bGxfcmVzZXQpCisJCWdvdG8gX19za2lwOworCisJLyogY2xlYXIgU1RBVEVTVFMgKi8KKwlhenhfd3JpdGV3KGNoaXAsIFNUQVRFU1RTLCBTVEFURVNUU19JTlRfTUFTSyk7CisKKwkvKiByZXNldCBjb250cm9sbGVyICovCisJYXp4X2VudGVyX2xpbmtfcmVzZXQoY2hpcCk7CisKKwkvKiBkZWxheSBmb3IgPj0gMTAwdXMgZm9yIGNvZGVjIFBMTCB0byBzZXR0bGUgcGVyIHNwZWMKKwkgKiBSZXYgMC45IHNlY3Rpb24gNS41LjEKKwkgKi8KKwl1c2xlZXBfcmFuZ2UoNTAwLCAxMDAwKTsKKworCS8qIEJyaW5nIGNvbnRyb2xsZXIgb3V0IG9mIHJlc2V0ICovCisJYXp4X2V4aXRfbGlua19yZXNldChjaGlwKTsKKworCS8qIEJyZW50IENoYXJ0cmFuZCBzYWlkIHRvIHdhaXQgPj0gNTQwdXMgZm9yIGNvZGVjcyB0byBpbml0aWFsaXplICovCisJdXNsZWVwX3JhbmdlKDEwMDAsIDEyMDApOworCisgICAgICBfX3NraXA6CisJLyogY2hlY2sgdG8gc2VlIGlmIGNvbnRyb2xsZXIgaXMgcmVhZHkgKi8KKwlpZiAoIWF6eF9yZWFkYihjaGlwLCBHQ1RMKSkgeworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImF6eF9yZXNldDogY29udHJvbGxlciBub3QgcmVhZHkhXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBBY2NlcHQgdW5zb2xpY2l0ZWQgcmVzcG9uc2VzICovCisJaWYgKCFjaGlwLT5zaW5nbGVfY21kKQorCQlhenhfd3JpdGVsKGNoaXAsIEdDVEwsIGF6eF9yZWFkbChjaGlwLCBHQ1RMKSB8CisJCQkgICBJQ0g2X0dDVExfVU5TT0wpOworCisJLyogZGV0ZWN0IGNvZGVjcyAqLworCWlmICghY2hpcC0+Y29kZWNfbWFzaykgeworCQljaGlwLT5jb2RlY19tYXNrID0gYXp4X3JlYWR3KGNoaXAsIFNUQVRFU1RTKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJjb2RlY19tYXNrID0gMHgleFxuIiwKKwkJCWNoaXAtPmNvZGVjX21hc2spOworCX0KKworCXJldHVybiAwOworfQorCisvKiBlbmFibGUgaW50ZXJydXB0cyAqLworc3RhdGljIHZvaWQgYXp4X2ludF9lbmFibGUoc3RydWN0IGF6eCAqY2hpcCkKK3sKKwkvKiBlbmFibGUgY29udHJvbGxlciBDSUUgYW5kIEdJRSAqLworCWF6eF93cml0ZWwoY2hpcCwgSU5UQ1RMLCBhenhfcmVhZGwoY2hpcCwgSU5UQ1RMKSB8CisJCSAgIElDSDZfSU5UX0NUUkxfRU4gfCBJQ0g2X0lOVF9HTE9CQUxfRU4pOworfQorCisvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KK3N0YXRpYyB2b2lkIGF6eF9pbnRfZGlzYWJsZShzdHJ1Y3QgYXp4ICpjaGlwKQoreworCWludCBpOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGluIHN0cmVhbSBkZXNjcmlwdG9yICovCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zdHJlYW1zOyBpKyspIHsKKwkJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSAmY2hpcC0+YXp4X2RldltpXTsKKwkJYXp4X3NkX3dyaXRlYihjaGlwLCBhenhfZGV2LCBTRF9DVEwsCisJCQkgICAgICBhenhfc2RfcmVhZGIoY2hpcCwgYXp4X2RldiwgU0RfQ1RMKSAmCisJCQkJCX5TRF9JTlRfTUFTSyk7CisJfQorCisJLyogZGlzYWJsZSBTSUUgZm9yIGFsbCBzdHJlYW1zICovCisJYXp4X3dyaXRlYihjaGlwLCBJTlRDVEwsIDApOworCisJLyogZGlzYWJsZSBjb250cm9sbGVyIENJRSBhbmQgR0lFICovCisJYXp4X3dyaXRlbChjaGlwLCBJTlRDVEwsIGF6eF9yZWFkbChjaGlwLCBJTlRDVEwpICYKKwkJICAgfihJQ0g2X0lOVF9DVFJMX0VOIHwgSUNINl9JTlRfR0xPQkFMX0VOKSk7Cit9CisKKy8qIGNsZWFyIGludGVycnVwdHMgKi8KK3N0YXRpYyB2b2lkIGF6eF9pbnRfY2xlYXIoc3RydWN0IGF6eCAqY2hpcCkKK3sKKwlpbnQgaTsKKworCS8qIGNsZWFyIHN0cmVhbSBzdGF0dXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3N0cmVhbXM7IGkrKykgeworCQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9ICZjaGlwLT5henhfZGV2W2ldOworCQlhenhfc2Rfd3JpdGViKGNoaXAsIGF6eF9kZXYsIFNEX1NUUywgU0RfSU5UX01BU0spOworCX0KKworCS8qIGNsZWFyIFNUQVRFU1RTICovCisJYXp4X3dyaXRldyhjaGlwLCBTVEFURVNUUywgU1RBVEVTVFNfSU5UX01BU0spOworCisJLyogY2xlYXIgcmlyYiBzdGF0dXMgKi8KKwlhenhfd3JpdGViKGNoaXAsIFJJUkJTVFMsIFJJUkJfSU5UX01BU0spOworCisJLyogY2xlYXIgaW50IHN0YXR1cyAqLworCWF6eF93cml0ZWwoY2hpcCwgSU5UU1RTLCBJQ0g2X0lOVF9DVFJMX0VOIHwgSUNINl9JTlRfQUxMX1NUUkVBTSk7Cit9CisKKy8qCisgKiByZXNldCBhbmQgc3RhcnQgdGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzCisgKi8KK3ZvaWQgYXp4X2luaXRfY2hpcChzdHJ1Y3QgYXp4ICpjaGlwLCBpbnQgZnVsbF9yZXNldCkKK3sKKwlpZiAoY2hpcC0+aW5pdGlhbGl6ZWQpCisJCXJldHVybjsKKworCS8qIHJlc2V0IGNvbnRyb2xsZXIgKi8KKwlhenhfcmVzZXQoY2hpcCwgZnVsbF9yZXNldCk7CisKKwkvKiBpbml0aWFsaXplIGludGVycnVwdHMgKi8KKwlhenhfaW50X2NsZWFyKGNoaXApOworCWF6eF9pbnRfZW5hYmxlKGNoaXApOworCisJLyogaW5pdGlhbGl6ZSB0aGUgY29kZWMgY29tbWFuZCBJL08gKi8KKwlpZiAoIWNoaXAtPnNpbmdsZV9jbWQpCisJCWF6eF9pbml0X2NtZF9pbyhjaGlwKTsKKworCS8qIHByb2dyYW0gdGhlIHBvc2l0aW9uIGJ1ZmZlciAqLworCWF6eF93cml0ZWwoY2hpcCwgRFBMQkFTRSwgKHUzMiljaGlwLT5wb3NidWYuYWRkcik7CisJYXp4X3dyaXRlbChjaGlwLCBEUFVCQVNFLCB1cHBlcl8zMl9iaXRzKGNoaXAtPnBvc2J1Zi5hZGRyKSk7CisKKwljaGlwLT5pbml0aWFsaXplZCA9IDE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhenhfaW5pdF9jaGlwKTsKKwordm9pZCBhenhfc3RvcF9jaGlwKHN0cnVjdCBhenggKmNoaXApCit7CisJaWYgKCFjaGlwLT5pbml0aWFsaXplZCkKKwkJcmV0dXJuOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJYXp4X2ludF9kaXNhYmxlKGNoaXApOworCWF6eF9pbnRfY2xlYXIoY2hpcCk7CisKKwkvKiBkaXNhYmxlIENPUkIvUklSQiAqLworCWF6eF9mcmVlX2NtZF9pbyhjaGlwKTsKKworCS8qIGRpc2FibGUgcG9zaXRpb24gYnVmZmVyICovCisJYXp4X3dyaXRlbChjaGlwLCBEUExCQVNFLCAwKTsKKwlhenhfd3JpdGVsKGNoaXAsIERQVUJBU0UsIDApOworCisJY2hpcC0+aW5pdGlhbGl6ZWQgPSAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X3N0b3BfY2hpcCk7CisKKy8qCisgKiBpbnRlcnJ1cHQgaGFuZGxlcgorICovCitpcnFyZXR1cm5fdCBhenhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgYXp4ICpjaGlwID0gZGV2X2lkOworCXN0cnVjdCBhenhfZGV2ICphenhfZGV2OworCXUzMiBzdGF0dXM7CisJdTggc2Rfc3RhdHVzOworCWludCBpOworCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKKwlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfUE1fUlVOVElNRSkKKwkJaWYgKGNoaXAtPmNhcmQtPmRldi0+cG93ZXIucnVudGltZV9zdGF0dXMgIT0gUlBNX0FDVElWRSkKKwkJCXJldHVybiBJUlFfTk9ORTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisKKwlpZiAoY2hpcC0+ZGlzYWJsZWQpIHsKKwkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCXN0YXR1cyA9IGF6eF9yZWFkbChjaGlwLCBJTlRTVFMpOworCWlmIChzdGF0dXMgPT0gMCB8fCBzdGF0dXMgPT0gMHhmZmZmZmZmZikgeworCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zdHJlYW1zOyBpKyspIHsKKwkJYXp4X2RldiA9ICZjaGlwLT5henhfZGV2W2ldOworCQlpZiAoc3RhdHVzICYgYXp4X2Rldi0+c2RfaW50X3N0YV9tYXNrKSB7CisJCQlzZF9zdGF0dXMgPSBhenhfc2RfcmVhZGIoY2hpcCwgYXp4X2RldiwgU0RfU1RTKTsKKwkJCWF6eF9zZF93cml0ZWIoY2hpcCwgYXp4X2RldiwgU0RfU1RTLCBTRF9JTlRfTUFTSyk7CisJCQlpZiAoIWF6eF9kZXYtPnN1YnN0cmVhbSB8fCAhYXp4X2Rldi0+cnVubmluZyB8fAorCQkJICAgICEoc2Rfc3RhdHVzICYgU0RfSU5UX0NPTVBMRVRFKSkKKwkJCQljb250aW51ZTsKKwkJCS8qIGNoZWNrIHdoZXRoZXIgdGhpcyBJUlEgaXMgcmVhbGx5IGFjY2VwdGFibGUgKi8KKwkJCWlmICghY2hpcC0+b3BzLT5wb3NpdGlvbl9jaGVjayB8fAorCQkJICAgIGNoaXAtPm9wcy0+cG9zaXRpb25fY2hlY2soY2hpcCwgYXp4X2RldikpIHsKKwkJCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoYXp4X2Rldi0+c3Vic3RyZWFtKTsKKwkJCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIGNsZWFyIHJpcmIgaW50ICovCisJc3RhdHVzID0gYXp4X3JlYWRiKGNoaXAsIFJJUkJTVFMpOworCWlmIChzdGF0dXMgJiBSSVJCX0lOVF9NQVNLKSB7CisJCWlmIChzdGF0dXMgJiBSSVJCX0lOVF9SRVNQT05TRSkgeworCQkJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX1JJUkJfUFJFX0RFTEFZKQorCQkJCXVkZWxheSg4MCk7CisJCQlhenhfdXBkYXRlX3JpcmIoY2hpcCk7CisJCX0KKwkJYXp4X3dyaXRlYihjaGlwLCBSSVJCU1RTLCBSSVJCX0lOVF9NQVNLKTsKKwl9CisKKwlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2ludGVycnVwdCk7CisKKy8qCisgKiBDb2RlYyBpbml0ZXJmYWNlCisgKi8KKworLyoKKyAqIFByb2JlIHRoZSBnaXZlbiBjb2RlYyBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbnQgcHJvYmVfY29kZWMoc3RydWN0IGF6eCAqY2hpcCwgaW50IGFkZHIpCit7CisJdW5zaWduZWQgaW50IGNtZCA9IChhZGRyIDw8IDI4KSB8IChBQ19OT0RFX1JPT1QgPDwgMjApIHwKKwkJKEFDX1ZFUkJfUEFSQU1FVEVSUyA8PCA4KSB8IEFDX1BBUl9WRU5ET1JfSUQ7CisJdW5zaWduZWQgaW50IHJlczsKKworCW11dGV4X2xvY2soJmNoaXAtPmJ1cy0+Y21kX211dGV4KTsKKwljaGlwLT5wcm9iaW5nID0gMTsKKwlhenhfc2VuZF9jbWQoY2hpcC0+YnVzLCBjbWQpOworCXJlcyA9IGF6eF9nZXRfcmVzcG9uc2UoY2hpcC0+YnVzLCBhZGRyKTsKKwljaGlwLT5wcm9iaW5nID0gMDsKKwltdXRleF91bmxvY2soJmNoaXAtPmJ1cy0+Y21kX211dGV4KTsKKwlpZiAocmVzID09IC0xKQorCQlyZXR1cm4gLUVJTzsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImNvZGVjICMlZCBwcm9iZWQgT0tcbiIsIGFkZHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhenhfYnVzX3Jlc2V0KHN0cnVjdCBoZGFfYnVzICpidXMpCit7CisJc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCisJYnVzLT5pbl9yZXNldCA9IDE7CisJYXp4X3N0b3BfY2hpcChjaGlwKTsKKwlhenhfaW5pdF9jaGlwKGNoaXAsIDEpOworI2lmZGVmIENPTkZJR19QTQorCWlmIChjaGlwLT5pbml0aWFsaXplZCkgeworCQlzdHJ1Y3QgYXp4X3BjbSAqcDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2hpcC0+cGNtX2xpc3QsIGxpc3QpCisJCQlzbmRfcGNtX3N1c3BlbmRfYWxsKHAtPnBjbSk7CisJCXNuZF9oZGFfc3VzcGVuZChjaGlwLT5idXMpOworCQlzbmRfaGRhX3Jlc3VtZShjaGlwLT5idXMpOworCX0KKyNlbmRpZgorCWJ1cy0+aW5fcmVzZXQgPSAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCisvKiBwb3dlci11cC9kb3duIHRoZSBjb250cm9sbGVyICovCitzdGF0aWMgdm9pZCBhenhfcG93ZXJfbm90aWZ5KHN0cnVjdCBoZGFfYnVzICpidXMsIGJvb2wgcG93ZXJfdXApCit7CisJc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCEoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfUE1fUlVOVElNRSkpCisJCXJldHVybjsKKworCWlmIChwb3dlcl91cCkKKwkJcG1fcnVudGltZV9nZXRfc3luYyhjaGlwLT5jYXJkLT5kZXYpOworCWVsc2UKKwkJcG1fcnVudGltZV9wdXRfc3luYyhjaGlwLT5jYXJkLT5kZXYpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZ2V0X2phY2twb2xsX2ludGVydmFsKHN0cnVjdCBhenggKmNoaXApCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGo7CisKKwlpZiAoIWNoaXAtPmphY2twb2xsX21zKQorCQlyZXR1cm4gMDsKKworCWkgPSBjaGlwLT5qYWNrcG9sbF9tc1tjaGlwLT5kZXZfaW5kZXhdOworCWlmIChpID09IDApCisJCXJldHVybiAwOworCWlmIChpIDwgNTAgfHwgaSA+IDYwMDAwKQorCQlqID0gMDsKKwllbHNlCisJCWogPSBtc2Vjc190b19qaWZmaWVzKGkpOworCWlmIChqID09IDApCisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwKKwkJCSAiamFja3BvbGxfbXMgdmFsdWUgb3V0IG9mIHJhbmdlOiAlZFxuIiwgaSk7CisJcmV0dXJuIGo7Cit9CisKKy8qIENvZGVjIGluaXRpYWxpemF0aW9uICovCitpbnQgYXp4X2NvZGVjX2NyZWF0ZShzdHJ1Y3QgYXp4ICpjaGlwLCBjb25zdCBjaGFyICptb2RlbCwKKwkJICAgICB1bnNpZ25lZCBpbnQgbWF4X3Nsb3RzLAorCQkgICAgIGludCAqcG93ZXJfc2F2ZV90bykKK3sKKwlzdHJ1Y3QgaGRhX2J1c190ZW1wbGF0ZSBidXNfdGVtcDsKKwlpbnQgYywgY29kZWNzLCBlcnI7CisKKwltZW1zZXQoJmJ1c190ZW1wLCAwLCBzaXplb2YoYnVzX3RlbXApKTsKKwlidXNfdGVtcC5wcml2YXRlX2RhdGEgPSBjaGlwOworCWJ1c190ZW1wLm1vZGVsbmFtZSA9IG1vZGVsOworCWJ1c190ZW1wLnBjaSA9IGNoaXAtPnBjaTsKKwlidXNfdGVtcC5vcHMuY29tbWFuZCA9IGF6eF9zZW5kX2NtZDsKKwlidXNfdGVtcC5vcHMuZ2V0X3Jlc3BvbnNlID0gYXp4X2dldF9yZXNwb25zZTsKKwlidXNfdGVtcC5vcHMuYXR0YWNoX3BjbSA9IGF6eF9hdHRhY2hfcGNtX3N0cmVhbTsKKwlidXNfdGVtcC5vcHMuYnVzX3Jlc2V0ID0gYXp4X2J1c19yZXNldDsKKyNpZmRlZiBDT05GSUdfUE0KKwlidXNfdGVtcC5wb3dlcl9zYXZlID0gcG93ZXJfc2F2ZV90bzsKKwlidXNfdGVtcC5vcHMucG1fbm90aWZ5ID0gYXp4X3Bvd2VyX25vdGlmeTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TTkRfSERBX0RTUF9MT0FERVIKKwlidXNfdGVtcC5vcHMubG9hZF9kc3BfcHJlcGFyZSA9IGF6eF9sb2FkX2RzcF9wcmVwYXJlOworCWJ1c190ZW1wLm9wcy5sb2FkX2RzcF90cmlnZ2VyID0gYXp4X2xvYWRfZHNwX3RyaWdnZXI7CisJYnVzX3RlbXAub3BzLmxvYWRfZHNwX2NsZWFudXAgPSBhenhfbG9hZF9kc3BfY2xlYW51cDsKKyNlbmRpZgorCisJZXJyID0gc25kX2hkYV9idXNfbmV3KGNoaXAtPmNhcmQsICZidXNfdGVtcCwgJmNoaXAtPmJ1cyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfUklSQl9ERUxBWSkgeworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIkVuYWJsZSBkZWxheSBpbiBSSVJCIGhhbmRsaW5nXG4iKTsKKwkJY2hpcC0+YnVzLT5uZWVkc19kYW1uX2xvbmdfZGVsYXkgPSAxOworCX0KKworCWNvZGVjcyA9IDA7CisJaWYgKCFtYXhfc2xvdHMpCisJCW1heF9zbG90cyA9IEFaWF9ERUZBVUxUX0NPREVDUzsKKworCS8qIEZpcnN0IHRyeSB0byBwcm9iZSBhbGwgZ2l2ZW4gY29kZWMgc2xvdHMgKi8KKwlmb3IgKGMgPSAwOyBjIDwgbWF4X3Nsb3RzOyBjKyspIHsKKwkJaWYgKChjaGlwLT5jb2RlY19tYXNrICYgKDEgPDwgYykpICYgY2hpcC0+Y29kZWNfcHJvYmVfbWFzaykgeworCQkJaWYgKHByb2JlX2NvZGVjKGNoaXAsIGMpIDwgMCkgeworCQkJCS8qIFNvbWUgQklPU2VuIGdpdmUgeW91IHdyb25nIGNvZGVjIGFkZHJlc3NlcworCQkJCSAqIHRoYXQgZG9uJ3QgZXhpc3QKKwkJCQkgKi8KKwkJCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsCisJCQkJCSAiQ29kZWMgIyVkIHByb2JlIGVycm9yOyBkaXNhYmxpbmcgaXQuLi5cbiIsIGMpOworCQkJCWNoaXAtPmNvZGVjX21hc2sgJj0gfigxIDw8IGMpOworCQkJCS8qIE1vcmUgYmFkbHksIGFjY2Vzc2luZyB0byBhIG5vbi1leGlzdGluZworCQkJCSAqIGNvZGVjIG9mdGVuIHNjcmV3cyB1cCB0aGUgY29udHJvbGxlciBjaGlwLAorCQkJCSAqIGFuZCBkaXN0dXJicyB0aGUgZnVydGhlciBjb21tdW5pY2F0aW9ucy4KKwkJCQkgKiBUaHVzIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgcHJvYmluZywKKwkJCQkgKiBiZXR0ZXIgdG8gcmVzZXQgdGhlIGNvbnRyb2xsZXIgY2hpcCB0bworCQkJCSAqIGdldCBiYWNrIHRvIHRoZSBzYW5pdHkgc3RhdGUuCisJCQkJICovCisJCQkJYXp4X3N0b3BfY2hpcChjaGlwKTsKKwkJCQlhenhfaW5pdF9jaGlwKGNoaXAsIDEpOworCQkJfQorCQl9CisJfQorCisJLyogQU1EIGNoaXBzZXRzIG9mdGVuIGNhdXNlIHRoZSBjb21tdW5pY2F0aW9uIHN0YWxscyB1cG9uIGNlcnRhaW4KKwkgKiBzZXF1ZW5jZSBsaWtlIHRoZSBwaW4tZGV0ZWN0aW9uLiAgSXQgc2VlbXMgdGhhdCBmb3JjaW5nIHRoZSBzeW5jZWQKKwkgKiBhY2Nlc3Mgd29ya3MgYXJvdW5kIHRoZSBzdGFsbC4gIEdycnIuLi4KKwkgKi8KKwlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfU1lOQ19XUklURSkgeworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIkVuYWJsZSBzeW5jX3dyaXRlIGZvciBzdGFibGUgY29tbXVuaWNhdGlvblxuIik7CisJCWNoaXAtPmJ1cy0+c3luY193cml0ZSA9IDE7CisJCWNoaXAtPmJ1cy0+YWxsb3dfYnVzX3Jlc2V0ID0gMTsKKwl9CisKKwkvKiBUaGVuIGNyZWF0ZSBjb2RlYyBpbnN0YW5jZXMgKi8KKwlmb3IgKGMgPSAwOyBjIDwgbWF4X3Nsb3RzOyBjKyspIHsKKwkJaWYgKChjaGlwLT5jb2RlY19tYXNrICYgKDEgPDwgYykpICYgY2hpcC0+Y29kZWNfcHJvYmVfbWFzaykgeworCQkJc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7CisJCQllcnIgPSBzbmRfaGRhX2NvZGVjX25ldyhjaGlwLT5idXMsIGMsICZjb2RlYyk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQljb250aW51ZTsKKwkJCWNvZGVjLT5qYWNrcG9sbF9pbnRlcnZhbCA9IGdldF9qYWNrcG9sbF9pbnRlcnZhbChjaGlwKTsKKwkJCWNvZGVjLT5iZWVwX21vZGUgPSBjaGlwLT5iZWVwX21vZGU7CisJCQljb2RlY3MrKzsKKwkJfQorCX0KKwlpZiAoIWNvZGVjcykgeworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIm5vIGNvZGVjcyBpbml0aWFsaXplZFxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2NvZGVjX2NyZWF0ZSk7CisKKy8qIGNvbmZpZ3VyZSBlYWNoIGNvZGVjIGluc3RhbmNlICovCitpbnQgYXp4X2NvZGVjX2NvbmZpZ3VyZShzdHJ1Y3QgYXp4ICpjaGlwKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZjaGlwLT5idXMtPmNvZGVjX2xpc3QsIGxpc3QpIHsKKwkJc25kX2hkYV9jb2RlY19jb25maWd1cmUoY29kZWMpOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGF6eF9jb2RlY19jb25maWd1cmUpOworCisvKiBtaXhlciBjcmVhdGlvbiAtIGFsbCBzdHVmZiBpcyBpbXBsZW1lbnRlZCBpbiBoZGEgbW9kdWxlICovCitpbnQgYXp4X21peGVyX2NyZWF0ZShzdHJ1Y3QgYXp4ICpjaGlwKQoreworCXJldHVybiBzbmRfaGRhX2J1aWxkX2NvbnRyb2xzKGNoaXAtPmJ1cyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhenhfbWl4ZXJfY3JlYXRlKTsKKworCisvKiBpbml0aWFsaXplIFNEIHN0cmVhbXMgKi8KK2ludCBhenhfaW5pdF9zdHJlYW0oc3RydWN0IGF6eCAqY2hpcCkKK3sKKwlpbnQgaTsKKworCS8qIGluaXRpYWxpemUgZWFjaCBzdHJlYW0gKGFrYSBkZXZpY2UpCisJICogYXNzaWduIHRoZSBzdGFydGluZyBiZGwgYWRkcmVzcyB0byBlYWNoIHN0cmVhbSAoZGV2aWNlKQorCSAqIGFuZCBpbml0aWFsaXplCisJICovCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zdHJlYW1zOyBpKyspIHsKKwkJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSAmY2hpcC0+YXp4X2RldltpXTsKKwkJYXp4X2Rldi0+cG9zYnVmID0gKHUzMiBfX2lvbWVtICopKGNoaXAtPnBvc2J1Zi5hcmVhICsgaSAqIDgpOworCQkvKiBvZmZzZXQ6IFNESTA9MHg4MCwgU0RJMT0weGEwLCAuLi4gU0RPMz0weDE2MCAqLworCQlhenhfZGV2LT5zZF9hZGRyID0gY2hpcC0+cmVtYXBfYWRkciArICgweDIwICogaSArIDB4ODApOworCQkvKiBpbnQgbWFzazogU0RJMD0weDAxLCBTREkxPTB4MDIsIC4uLiBTRE8zPTB4ODAgKi8KKwkJYXp4X2Rldi0+c2RfaW50X3N0YV9tYXNrID0gMSA8PCBpOworCQkvKiBzdHJlYW0gdGFnOiBtdXN0IGJlIG5vbi16ZXJvIGFuZCB1bmlxdWUgKi8KKwkJYXp4X2Rldi0+aW5kZXggPSBpOworCQlhenhfZGV2LT5zdHJlYW1fdGFnID0gaSArIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhenhfaW5pdF9zdHJlYW0pOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbW1vbiBIREEgZHJpdmVyIGZ1bmNpdG9ucyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5oIGIvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMmUzYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb250cm9sbGVyLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqICBDb21tb24gZnVuY3Rpb25hbGl0eSBmb3IgdGhlIGFsc2EgZHJpdmVyIGNvZGUgYmFzZSBmb3IgSEQgQXVkaW8uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiAgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqICBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1NPVU5EX0hEQV9DT05UUk9MTEVSX0gKKyNkZWZpbmUgX19TT1VORF9IREFfQ09OVFJPTExFUl9ICisKKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgImhkYV9jb2RlYy5oIgorI2luY2x1ZGUgImhkYV9wcml2LmgiCisKKy8qIFBDTSBzZXR1cCAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYXp4X2RldiAqZ2V0X2F6eF9kZXYoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJcmV0dXJuIHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworfQordW5zaWduZWQgaW50IGF6eF9nZXRfcG9zaXRpb24oc3RydWN0IGF6eCAqY2hpcCwKKwkJCSAgICAgIHN0cnVjdCBhenhfZGV2ICphenhfZGV2LAorCQkJICAgICAgYm9vbCB3aXRoX2NoZWNrKTsKKworLyogU3RyZWFtIGNvbnRyb2wuICovCit2b2lkIGF6eF9zdHJlYW1fc3RvcChzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3QgYXp4X2RldiAqYXp4X2Rldik7CisKKy8qIEFsbG9jYXRpb24gZnVuY3Rpb25zLiAqLworaW50IGF6eF9hbGxvY19zdHJlYW1fcGFnZXMoc3RydWN0IGF6eCAqY2hpcCk7Cit2b2lkIGF6eF9mcmVlX3N0cmVhbV9wYWdlcyhzdHJ1Y3QgYXp4ICpjaGlwKTsKKworLyogTG93IGxldmVsIGF6eCBpbnRlcmZhY2UgKi8KK3ZvaWQgYXp4X2luaXRfY2hpcChzdHJ1Y3QgYXp4ICpjaGlwLCBpbnQgZnVsbF9yZXNldCk7Cit2b2lkIGF6eF9zdG9wX2NoaXAoc3RydWN0IGF6eCAqY2hpcCk7Cit2b2lkIGF6eF9lbnRlcl9saW5rX3Jlc2V0KHN0cnVjdCBhenggKmNoaXApOworaXJxcmV0dXJuX3QgYXp4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworCisvKiBDb2RlYyBpbnRlcmZhY2UgKi8KK2ludCBhenhfY29kZWNfY3JlYXRlKHN0cnVjdCBhenggKmNoaXAsIGNvbnN0IGNoYXIgKm1vZGVsLAorCQkgICAgIHVuc2lnbmVkIGludCBtYXhfc2xvdHMsCisJCSAgICAgaW50ICpwb3dlcl9zYXZlX3RvKTsKK2ludCBhenhfY29kZWNfY29uZmlndXJlKHN0cnVjdCBhenggKmNoaXApOworaW50IGF6eF9taXhlcl9jcmVhdGUoc3RydWN0IGF6eCAqY2hpcCk7CitpbnQgYXp4X2luaXRfc3RyZWFtKHN0cnVjdCBhenggKmNoaXApOworCisjZW5kaWYgLyogX19TT1VORF9IREFfQ09OVFJPTExFUl9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9lbGQuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2VsZC5jCmluZGV4IDc5Y2E4MGYuLjQ2NjkwYTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2VsZC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2VsZC5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIAl2YWwgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKIAkJCQkJQUNfVkVSQl9HRVRfSERNSV9FTERELCBieXRlX2luZGV4KTsKICNpZmRlZiBCRV9QQVJBTk9JRAotCXByaW50ayhLRVJOX0lORk8gIkhETUk6IEVMRCBkYXRhIGJ5dGUgJWQ6IDB4JXhcbiIsIGJ5dGVfaW5kZXgsIHZhbCk7CisJY29kZWNfaW5mbyhjb2RlYywgIkhETUk6IEVMRCBkYXRhIGJ5dGUgJWQ6IDB4JXhcbiIsIGJ5dGVfaW5kZXgsIHZhbCk7CiAjZW5kaWYKIAlyZXR1cm4gdmFsOwogfQpAQCAtMzMyLDExICszMzIsMTEgQEAKIAlzaXplID0gc25kX2hkbWlfZ2V0X2VsZF9zaXplKGNvZGVjLCBuaWQpOwogCWlmIChzaXplID09IDApIHsKIAkJLyogd2ZnOiB3b3JrYXJvdW5kIGZvciBBU1VTIFA1RS1WTSBIRE1JIGJvYXJkICovCi0JCXNuZF9wcmludGQoS0VSTl9JTkZPICJIRE1JOiBFTEQgYnVmIHNpemUgaXMgMCwgZm9yY2UgMTI4XG4iKTsKKwkJY29kZWNfaW5mbyhjb2RlYywgIkhETUk6IEVMRCBidWYgc2l6ZSBpcyAwLCBmb3JjZSAxMjhcbiIpOwogCQlzaXplID0gMTI4OwogCX0KIAlpZiAoc2l6ZSA8IEVMRF9GSVhFRF9CWVRFUyB8fCBzaXplID4gRUxEX01BWF9TSVpFKSB7Ci0JCXNuZF9wcmludGQoS0VSTl9JTkZPICJIRE1JOiBpbnZhbGlkIEVMRCBidWYgc2l6ZSAlZFxuIiwgc2l6ZSk7CisJCWNvZGVjX2luZm8oY29kZWMsICJIRE1JOiBpbnZhbGlkIEVMRCBidWYgc2l6ZSAlZFxuIiwgc2l6ZSk7CiAJCXJldHVybiAtRVJBTkdFOwogCX0KIApAQCAtMzQ4LDggKzM0OCw3IEBACiAJCSAqIEp1c3QgYWJvcnQuIFRoZSBjYWxsZXIgd2lsbCByZXBvbGwgYWZ0ZXIgYSB3aGlsZS4KIAkJICovCiAJCWlmICghKHZhbCAmIEFDX0VMRERfRUxEX1ZBTElEKSkgewotCQkJc25kX3ByaW50ZChLRVJOX0lORk8KLQkJCQkgICJIRE1JOiBpbnZhbGlkIEVMRCBkYXRhIGJ5dGUgJWRcbiIsIGkpOworCQkJY29kZWNfaW5mbyhjb2RlYywgIkhETUk6IGludmFsaWQgRUxEIGRhdGEgYnl0ZSAlZFxuIiwgaSk7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBlcnJvcjsKIAkJfQpAQCAtMzYxLDcgKzM2MCw3IEBACiAJCSAqIGNvcnJlY3RseSB3cml0ZXMgRUxEIGNvbnRlbnQgYmVmb3JlIHNldHRpbmcgRUxEX3ZhbGlkIGJpdC4KIAkJICovCiAJCWlmICghdmFsICYmICFpKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIkhETUk6IDAgRUxEIGRhdGFcbiIpOworCQkJY29kZWNfZGJnKGNvZGVjLCAiSERNSTogMCBFTEQgZGF0YVxuIik7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBlcnJvcjsKIAkJfQpAQCAtNjgxLDcgKzY4MCw3IEBACiAJc3BrYWxsb2MgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwgQVRJX1ZFUkJfR0VUX1NQRUFLRVJfQUxMT0NBVElPTiwgMCk7CiAKIAlpZiAoc3BrYWxsb2MgPD0gMCkgewotCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiSERNSSBBVEkvQU1EOiBubyBzcGVha2VyIGFsbG9jYXRpb24gZm9yIEVMRFxuIik7CisJCWNvZGVjX2luZm8oY29kZWMsICJIRE1JIEFUSS9BTUQ6IG5vIHNwZWFrZXIgYWxsb2NhdGlvbiBmb3IgRUxEXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC03MjIsNyArNzIxLDcgQEAKIAkJc2lua19kZXNjX2xlbiA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBVElfVkVSQl9HRVRfU0lOS19JTkZPX0RBVEEsIDApOwogCiAJCWlmIChzaW5rX2Rlc2NfbGVuID4gRUxEX01BWF9NTkwpIHsKLQkJCXNuZF9wcmludGQoS0VSTl9JTkZPICJIRE1JIEFUSS9BTUQ6IFRydW5jYXRpbmcgSERNSSBzaW5rIGRlc2NyaXB0aW9uIHdpdGggbGVuZ3RoICVkXG4iLAorCQkJY29kZWNfaW5mbyhjb2RlYywgIkhETUkgQVRJL0FNRDogVHJ1bmNhdGluZyBIRE1JIHNpbmsgZGVzY3JpcHRpb24gd2l0aCBsZW5ndGggJWRcbiIsCiAJCQkJICAgc2lua19kZXNjX2xlbik7CiAJCQlzaW5rX2Rlc2NfbGVuID0gRUxEX01BWF9NTkw7CiAJCX0KQEAgLTc2NCw3ICs3NjMsNyBAQAogCX0KIAogCWlmIChwb3MgPT0gRUxEX0ZJWEVEX0JZVEVTICsgc2lua19kZXNjX2xlbikgewotCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiSERNSSBBVEkvQU1EOiBubyBhdWRpbyBkZXNjcmlwdG9ycyBmb3IgRUxEXG4iKTsKKwkJY29kZWNfaW5mbyhjb2RlYywgIkhETUkgQVRJL0FNRDogbm8gYXVkaW8gZGVzY3JpcHRvcnMgZm9yIEVMRFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfZ2VuZXJpYy5jIGIvc291bmQvcGNpL2hkYS9oZGFfZ2VuZXJpYy5jCmluZGV4IGQ5YTA5YmQuLjE2MTMzODggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9nZW5lcmljLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAlzbmRfYXJyYXlfZnJlZSgmc3BlYy0+a2N0bHMpOwogfQogCi12b2lkIHNuZF9oZGFfZ2VuX3NwZWNfZnJlZShzdHJ1Y3QgaGRhX2dlbl9zcGVjICpzcGVjKQorc3RhdGljIHZvaWQgc25kX2hkYV9nZW5fc3BlY19mcmVlKHN0cnVjdCBoZGFfZ2VuX3NwZWMgKnNwZWMpCiB7CiAJaWYgKCFzcGVjKQogCQlyZXR1cm47CkBAIC04Nyw3ICs4Nyw2IEBACiAJc25kX2FycmF5X2ZyZWUoJnNwZWMtPnBhdGhzKTsKIAlzbmRfYXJyYXlfZnJlZSgmc3BlYy0+bG9vcGJhY2tfbGlzdCk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2dlbl9zcGVjX2ZyZWUpOwogCiAvKgogICogc3RvcmUgdXNlciBoaW50cwpAQCAtMzQ3LDcgKzM0Niw4IEBACiAJcmV0dXJuIGlzX2N0bF91c2VkKGNvZGVjLCB2YWwsIHR5cGUpOwogfQogCi1zdGF0aWMgdm9pZCBwcmludF9uaWRfcGF0aChjb25zdCBjaGFyICpwZngsIHN0cnVjdCBuaWRfcGF0aCAqcGF0aCkKK3N0YXRpYyB2b2lkIHByaW50X25pZF9wYXRoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJICAgY29uc3QgY2hhciAqcGZ4LCBzdHJ1Y3QgbmlkX3BhdGggKnBhdGgpCiB7CiAJY2hhciBidWZbNDBdOwogCWludCBpOwpAQCAtMzU5LDcgKzM1OSw3IEBACiAJCXNwcmludGYodG1wLCAiOiUwMngiLCBwYXRoLT5wYXRoW2ldKTsKIAkJc3RybGNhdChidWYsIHRtcCwgc2l6ZW9mKGJ1ZikpOwogCX0KLQlzbmRfcHJpbnRkZCgiJXMgcGF0aDogZGVwdGg9JWQgJXNcbiIsIHBmeCwgcGF0aC0+ZGVwdGgsIGJ1Zik7CisJY29kZWNfZGJnKGNvZGVjLCAiJXMgcGF0aDogZGVwdGg9JWQgJXNcbiIsIHBmeCwgcGF0aC0+ZGVwdGgsIGJ1Zik7CiB9CiAKIC8qIGNhbGxlZCByZWN1cnNpdmVseSAqLwpAQCAtNzYyLDcgKzc2Miw3IEBACiAJCQkJCQkgICAgQUNfUFdSU1RfRDApOwogCQl9CiAJCWlmIChlbmFibGUgJiYgcGF0aC0+bXVsdGlbaV0pCi0JCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBuaWQsIDAsCisJCQlzbmRfaGRhX2NvZGVjX3VwZGF0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAogCQkJCQkgICAgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsCiAJCQkJCSAgICBwYXRoLT5pZHhbaV0pOwogCQlpZiAoaGFzX2FtcF9pbihjb2RlYywgcGF0aCwgaSkpCkBAIC0xMjYxLDcgKzEyNjEsNyBAQAogCQkJZGFjID0gZGFjc1tpXSA9IDA7CiAJCQliYWRuZXNzICs9IGJhZC0+bm9fZGFjOwogCQl9IGVsc2UgewotCQkJLyogcHJpbnRfbmlkX3BhdGgoIm91dHB1dCIsIHBhdGgpOyAqLworCQkJLyogcHJpbnRfbmlkX3BhdGgoY29kZWMsICJvdXRwdXQiLCBwYXRoKTsgKi8KIAkJCXBhdGgtPmFjdGl2ZSA9IHRydWU7CiAJCQlwYXRoX2lkeFtpXSA9IHNuZF9oZGFfZ2V0X3BhdGhfaWR4KGNvZGVjLCBwYXRoKTsKIAkJCWJhZG5lc3MgKz0gYXNzaWduX291dF9wYXRoX2N0bHMoY29kZWMsIHBhdGgpOwpAQCAtMTM4OCw3ICsxMzg4LDcgQEAKIAkJCQliYWRuZXNzKys7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQkvKiBwcmludF9uaWRfcGF0aCgibXVsdGlpbyIsIHBhdGgpOyAqLworCQkJLyogcHJpbnRfbmlkX3BhdGgoY29kZWMsICJtdWx0aWlvIiwgcGF0aCk7ICovCiAJCQlzcGVjLT5tdWx0aV9pb1tzcGVjLT5tdWx0aV9pb3NdLnBpbiA9IG5pZDsKIAkJCXNwZWMtPm11bHRpX2lvW3NwZWMtPm11bHRpX2lvc10uZGFjID0gZGFjOwogCQkJc3BlYy0+b3V0X3BhdGhzW2NmZy0+bGluZV9vdXRzICsgc3BlYy0+bXVsdGlfaW9zXSA9CkBAIC0xNDQ1LDcgKzE0NDUsNyBAQAogCQlpZiAocGF0aCkgewogCQkJZGFjc1tpXSA9IGRhYzsKIAkJCWZvdW5kID0gdHJ1ZTsKLQkJCS8qIHByaW50X25pZF9wYXRoKCJvdXRwdXQiLCBwYXRoKTsgKi8KKwkJCS8qIHByaW50X25pZF9wYXRoKGNvZGVjLCAib3V0cHV0IiwgcGF0aCk7ICovCiAJCQlwYXRoLT5hY3RpdmUgPSB0cnVlOwogCQkJcGF0aF9pZHhbaV0gPSBzbmRfaGRhX2dldF9wYXRoX2lkeChjb2RlYywgcGF0aCk7CiAJCX0KQEAgLTE0ODMsNyArMTQ4Myw3IEBACiAJfQogCWlmICghcGF0aCkKIAkJcmV0dXJuIDA7Ci0JLyogcHJpbnRfbmlkX3BhdGgoIm91dHB1dC1hYW1peCIsIHBhdGgpOyAqLworCS8qIHByaW50X25pZF9wYXRoKGNvZGVjLCAib3V0cHV0LWFhbWl4IiwgcGF0aCk7ICovCiAJcGF0aC0+YWN0aXZlID0gZmFsc2U7IC8qIHVudXNlZCBhcyBkZWZhdWx0ICovCiAJcmV0dXJuIHNuZF9oZGFfZ2V0X3BhdGhfaWR4KGNvZGVjLCBwYXRoKTsKIH0KQEAgLTE3MDAsNyArMTcwMCw3IEBACiAjZGVmaW5lIERFQlVHX0JBRE5FU1MKIAogI2lmZGVmIERFQlVHX0JBRE5FU1MKLSNkZWZpbmUgZGVidWdfYmFkbmVzcwlzbmRfcHJpbnRkZAorI2RlZmluZSBkZWJ1Z19iYWRuZXNzKGZtdCwgYXJncy4uLikJY29kZWNfZGJnKGNvZGVjLCBmbXQsICMjYXJncykKICNlbHNlCiAjZGVmaW5lIGRlYnVnX2JhZG5lc3MoLi4uKQogI2VuZGlmCkBAIC0xNzEzLDcgKzE3MTMsNyBAQAogCiAJcGF0aCA9IHNuZF9oZGFfZ2V0X3BhdGhfZnJvbV9pZHgoY29kZWMsIGlkeCk7CiAJaWYgKHBhdGgpCi0JCXByaW50X25pZF9wYXRoKHBmeCwgcGF0aCk7CisJCXByaW50X25pZF9wYXRoKGNvZGVjLCBwZngsIHBhdGgpOwogfQogCiBzdGF0aWMgdm9pZCBkZWJ1Z19zaG93X2NvbmZpZ3Moc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCkBAIC0xNzgxLDcgKzE3ODEsNyBAQAogCQlpZiAoZ2V0X3djYXBzX3R5cGUoZ2V0X3djYXBzKGNvZGVjLCBuaWQpKSAhPSBBQ19XSURfQVVEX09VVCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoc3BlYy0+bnVtX2FsbF9kYWNzID49IEFSUkFZX1NJWkUoc3BlYy0+YWxsX2RhY3MpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGE6IFRvbyBtYW55IERBQ3MhXG4iKTsKKwkJCWNvZGVjX2Vycihjb2RlYywgIlRvbyBtYW55IERBQ3MhXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCXNwZWMtPmFsbF9kYWNzW3NwZWMtPm51bV9hbGxfZGFjcysrXSA9IG5pZDsKQEAgLTI0MzAsNyArMjQzMCw3IEBACiAJc3BlYy0+aHBfbWljX3BpbiA9IG5pZDsKIAkvKiB3ZSBjYW4ndCBoYW5kbGUgYXV0by1taWMgdG9nZXRoZXIgd2l0aCBIUC1taWMgKi8KIAlzcGVjLT5zdXBwcmVzc19hdXRvX21pYyA9IDE7Ci0Jc25kX3ByaW50ZGQoImhkYS1jb2RlYzogRW5hYmxlIHNoYXJlZCBJL08gamFjayBvbiBOSUQgMHgleFxuIiwgbmlkKTsKKwljb2RlY19kYmcoY29kZWMsICJFbmFibGUgc2hhcmVkIEkvTyBqYWNrIG9uIE5JRCAweCV4XG4iLCBuaWQpOwogCXJldHVybiAwOwogfQogCkBAIC0yODg0LDcgKzI4ODQsNyBAQAogCXBhdGggPSBzbmRfaGRhX2FkZF9uZXdfcGF0aChjb2RlYywgcGluLCBtaXhfbmlkLCAwKTsKIAlpZiAoIXBhdGgpCiAJCXJldHVybiAtRUlOVkFMOwotCXByaW50X25pZF9wYXRoKCJsb29wYmFjayIsIHBhdGgpOworCXByaW50X25pZF9wYXRoKGNvZGVjLCAibG9vcGJhY2siLCBwYXRoKTsKIAlzcGVjLT5sb29wYmFja19wYXRoc1tpbnB1dF9pZHhdID0gc25kX2hkYV9nZXRfcGF0aF9pZHgoY29kZWMsIHBhdGgpOwogCiAJaWR4ID0gcGF0aC0+aWR4W3BhdGgtPmRlcHRoIC0gMV07CkBAIC0yOTEyLDcgKzI5MTIsNyBAQAogCQlwYXRoID0gc25kX2hkYV9hZGRfbmV3X3BhdGgoY29kZWMsIHNwZWMtPm1peGVyX25pZCwKIAkJCQkJICAgIHNwZWMtPm1peGVyX21lcmdlX25pZCwgMCk7CiAJCWlmIChwYXRoKSB7Ci0JCQlwcmludF9uaWRfcGF0aCgibG9vcGJhY2stbWVyZ2UiLCBwYXRoKTsKKwkJCXByaW50X25pZF9wYXRoKGNvZGVjLCAibG9vcGJhY2stbWVyZ2UiLCBwYXRoKTsKIAkJCXBhdGgtPmFjdGl2ZSA9IHRydWU7CiAJCQlzcGVjLT5sb29wYmFja19tZXJnZV9wYXRoID0KIAkJCQlzbmRfaGRhX2dldF9wYXRoX2lkeChjb2RlYywgcGF0aCk7CkBAIC0yOTkxLDcgKzI5OTEsNyBAQAogCQkJfQogCQl9CiAKLQkJc25kX3ByaW50ZGQoImhkYS1jb2RlYzogZW5hYmxpbmcgQURDIHN3aXRjaGluZ1xuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImVuYWJsaW5nIEFEQyBzd2l0Y2hpbmdcbiIpOwogCQlzcGVjLT5keW5fYWRjX3N3aXRjaCA9IDE7CiAJfSBlbHNlIGlmIChudW1zICE9IHNwZWMtPm51bV9hZGNfbmlkcykgewogCQkvKiBzaHJpbmsgdGhlIGludmFsaWQgYWRjcyBhbmQgaW5wdXQgcGF0aHMgKi8KQEAgLTMwMTUsNyArMzAxNSw3IEBACiAKIAlpZiAoaW11eC0+bnVtX2l0ZW1zID09IDEgfHwKIAkgICAgKGltdXgtPm51bV9pdGVtcyA9PSAyICYmIHNwZWMtPmhwX21pYykpIHsKLQkJc25kX3ByaW50ZGQoImhkYS1jb2RlYzogcmVkdWNpbmcgdG8gYSBzaW5nbGUgQURDXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAicmVkdWNpbmcgdG8gYSBzaW5nbGUgQURDXG4iKTsKIAkJc3BlYy0+bnVtX2FkY19uaWRzID0gMTsgLyogcmVkdWNlIHRvIGEgc2luZ2xlIEFEQyAqLwogCX0KIApAQCAtMzA0Niw3ICszMDQ2LDcgQEAKIAkJcGF0aCA9IHNuZF9oZGFfYWRkX25ld19wYXRoKGNvZGVjLCBwaW4sIGFkYywgYW5jaG9yKTsKIAkJaWYgKCFwYXRoKQogCQkJY29udGludWU7Ci0JCXByaW50X25pZF9wYXRoKCJpbnB1dCIsIHBhdGgpOworCQlwcmludF9uaWRfcGF0aChjb2RlYywgImlucHV0IiwgcGF0aCk7CiAJCXNwZWMtPmlucHV0X3BhdGhzW2ltdXhfaWR4XVtjXSA9CiAJCQlzbmRfaGRhX2dldF9wYXRoX2lkeChjb2RlYywgcGF0aCk7CiAKQEAgLTM3MTIsNyArMzcxMiw3IEBACiAJCXBhdGggPSBzbmRfaGRhX2FkZF9uZXdfcGF0aChjb2RlYywgZGlnX25pZCwgcGluLCAwKTsKIAkJaWYgKCFwYXRoKQogCQkJY29udGludWU7Ci0JCXByaW50X25pZF9wYXRoKCJkaWdvdXQiLCBwYXRoKTsKKwkJcHJpbnRfbmlkX3BhdGgoY29kZWMsICJkaWdvdXQiLCBwYXRoKTsKIAkJcGF0aC0+YWN0aXZlID0gdHJ1ZTsKIAkJc3BlYy0+ZGlnb3V0X3BhdGhzW2ldID0gc25kX2hkYV9nZXRfcGF0aF9pZHgoY29kZWMsIHBhdGgpOwogCQlzZXRfcGluX3RhcmdldChjb2RlYywgcGluLCBQSU5fT1VULCBmYWxzZSk7CkBAIC0zNzM5LDcgKzM3MzksNyBAQAogCQkJCWNvbnRpbnVlOwogCQkJcGF0aCA9IHNuZF9oZGFfYWRkX25ld19wYXRoKGNvZGVjLCBwaW4sIGRpZ19uaWQsIDApOwogCQkJaWYgKHBhdGgpIHsKLQkJCQlwcmludF9uaWRfcGF0aCgiZGlnaW4iLCBwYXRoKTsKKwkJCQlwcmludF9uaWRfcGF0aChjb2RlYywgImRpZ2luIiwgcGF0aCk7CiAJCQkJcGF0aC0+YWN0aXZlID0gdHJ1ZTsKIAkJCQlzcGVjLT5kaWdfaW5fbmlkID0gZGlnX25pZDsKIAkJCQlzcGVjLT5kaWdpbl9wYXRoID0gc25kX2hkYV9nZXRfcGF0aF9pZHgoY29kZWMsIHBhdGgpOwpAQCAtNDE3MCw4ICs0MTcwLDcgQEAKIAkJaGRhX25pZF90IG5pZCA9IGNmZy0+aHBfcGluc1tpXTsKIAkJaWYgKCFpc19qYWNrX2RldGVjdGFibGUoY29kZWMsIG5pZCkpCiAJCQljb250aW51ZTsKLQkJc25kX3ByaW50ZGQoImhkYS1jb2RlYzogRW5hYmxlIEhQIGF1dG8tbXV0aW5nIG9uIE5JRCAweCV4XG4iLAotCQkJICAgIG5pZCk7CisJCWNvZGVjX2RiZyhjb2RlYywgIkVuYWJsZSBIUCBhdXRvLW11dGluZyBvbiBOSUQgMHgleFxuIiwgbmlkKTsKIAkJc25kX2hkYV9qYWNrX2RldGVjdF9lbmFibGVfY2FsbGJhY2soY29kZWMsIG5pZCwgSERBX0dFTl9IUF9FVkVOVCwKIAkJCQkJCSAgICBjYWxsX2hwX2F1dG9tdXRlKTsKIAkJc3BlYy0+ZGV0ZWN0X2hwID0gMTsKQEAgLTQxODMsNyArNDE4Miw3IEBACiAJCQkJaGRhX25pZF90IG5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1tpXTsKIAkJCQlpZiAoIWlzX2phY2tfZGV0ZWN0YWJsZShjb2RlYywgbmlkKSkKIAkJCQkJY29udGludWU7Ci0JCQkJc25kX3ByaW50ZGQoImhkYS1jb2RlYzogRW5hYmxlIExpbmUtT3V0IGF1dG8tbXV0aW5nIG9uIE5JRCAweCV4XG4iLCBuaWQpOworCQkJCWNvZGVjX2RiZyhjb2RlYywgIkVuYWJsZSBMaW5lLU91dCBhdXRvLW11dGluZyBvbiBOSUQgMHgleFxuIiwgbmlkKTsKIAkJCQlzbmRfaGRhX2phY2tfZGV0ZWN0X2VuYWJsZV9jYWxsYmFjayhjb2RlYywgbmlkLAogCQkJCQkJCQkgICAgSERBX0dFTl9GUk9OVF9FVkVOVCwKIAkJCQkJCQkJICAgIGNhbGxfbGluZV9hdXRvbXV0ZSk7CkBAIC00MzAzLDcgKzQzMDIsNyBAQAogCXNwZWMtPmF1dG9fbWljID0gMTsKIAlzcGVjLT5udW1fYWRjX25pZHMgPSAxOwogCXNwZWMtPmN1cl9tdXhbMF0gPSBzcGVjLT5hbV9lbnRyeVswXS5pZHg7Ci0Jc25kX3ByaW50ZGQoImhkYS1jb2RlYzogRW5hYmxlIGF1dG8tbWljIHN3aXRjaCBvbiBOSUQgMHgleC8weCV4LzB4JXhcbiIsCisJY29kZWNfZGJnKGNvZGVjLCAiRW5hYmxlIGF1dG8tbWljIHN3aXRjaCBvbiBOSUQgMHgleC8weCV4LzB4JXhcbiIsCiAJCSAgICBzcGVjLT5hbV9lbnRyeVswXS5waW4sCiAJCSAgICBzcGVjLT5hbV9lbnRyeVsxXS5waW4sCiAJCSAgICBzcGVjLT5hbV9lbnRyeVsyXS5waW4pOwpAQCAtNTM1MCw3ICs1MzQ5LDcgQEAKICAqLwogdm9pZCBzbmRfaGRhX2dlbl9mcmVlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewotCXNuZF9oZGFfZGV0YWNoX2JlZXBfZGV2aWNlKGNvZGVjKTsKKwlzbmRfaGRhX2FwcGx5X2ZpeHVwKGNvZGVjLCBIREFfRklYVVBfQUNUX0ZSRUUpOwogCXNuZF9oZGFfZ2VuX3NwZWNfZnJlZShjb2RlYy0+c3BlYyk7CiAJa2ZyZWUoY29kZWMtPnNwZWMpOwogCWNvZGVjLT5zcGVjID0gTlVMTDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuaAppbmRleCBjOTA4YWZiLi5iYjJkZWE3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9nZW5lcmljLmgKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfZ2VuZXJpYy5oCkBAIC0yOTcsNyArMjk3LDYgQEAKIH07CiAKIGludCBzbmRfaGRhX2dlbl9zcGVjX2luaXQoc3RydWN0IGhkYV9nZW5fc3BlYyAqc3BlYyk7Ci12b2lkIHNuZF9oZGFfZ2VuX3NwZWNfZnJlZShzdHJ1Y3QgaGRhX2dlbl9zcGVjICpzcGVjKTsKIAogaW50IHNuZF9oZGFfZ2VuX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwogdm9pZCBzbmRfaGRhX2dlbl9mcmVlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2h3ZGVwLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9od2RlcC5jCmluZGV4IDcyZDgzODkuLjAxNGE3ODQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2h3ZGVwLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfaHdkZXAuYwpAQCAtMjAsMjQgKzIwLDEzIEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCiAjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCiAjaW5jbHVkZSA8c291bmQvaGRhX2h3ZGVwLmg+CiAjaW5jbHVkZSA8c291bmQvbWlub3JzLmg+CiAKLS8qIGhpbnQgc3RyaW5nIHBhaXIgKi8KLXN0cnVjdCBoZGFfaGludCB7Ci0JY29uc3QgY2hhciAqa2V5OwotCWNvbnN0IGNoYXIgKnZhbDsJLyogY29udGFpbmVkIGluIHRoZSBzYW1lIGFsbG9jIGFzIGtleSAqLwotfTsKLQogLyoKICAqIHdyaXRlL3JlYWQgYW4gb3V0LW9mLWJvdW5kIHZlcmIKICAqLwpAQCAtMTA1LDI2ICs5NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGNsZWFyX2h3ZGVwX2VsZW1lbnRzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWludCBpOwotCi0JLyogY2xlYXIgaW5pdCB2ZXJicyAqLwotCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+aW5pdF92ZXJicyk7Ci0JLyogY2xlYXIgaGludHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPmhpbnRzLnVzZWQ7IGkrKykgewotCQlzdHJ1Y3QgaGRhX2hpbnQgKmhpbnQgPSBzbmRfYXJyYXlfZWxlbSgmY29kZWMtPmhpbnRzLCBpKTsKLQkJa2ZyZWUoaGludC0+a2V5KTsgLyogd2UgZG9uJ3QgbmVlZCB0byBmcmVlIGhpbnQtPnZhbCAqLwotCX0KLQlzbmRfYXJyYXlfZnJlZSgmY29kZWMtPmhpbnRzKTsKLQlzbmRfYXJyYXlfZnJlZSgmY29kZWMtPnVzZXJfcGlucyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGh3ZGVwX2ZyZWUoc3RydWN0IHNuZF9od2RlcCAqaHdkZXApCi17Ci0JY2xlYXJfaHdkZXBfZWxlbWVudHMoaHdkZXAtPnByaXZhdGVfZGF0YSk7Ci19Ci0KIGludCBzbmRfaGRhX2NyZWF0ZV9od2RlcChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAljaGFyIGh3bmFtZVsxNl07CkBAIC0xMzksOCArMTA4LDggQEAKIAlzcHJpbnRmKGh3ZGVwLT5uYW1lLCAiSERBIENvZGVjICVkIiwgY29kZWMtPmFkZHIpOwogCWh3ZGVwLT5pZmFjZSA9IFNORFJWX0hXREVQX0lGQUNFX0hEQTsKIAlod2RlcC0+cHJpdmF0ZV9kYXRhID0gY29kZWM7Ci0JaHdkZXAtPnByaXZhdGVfZnJlZSA9IGh3ZGVwX2ZyZWU7CiAJaHdkZXAtPmV4Y2x1c2l2ZSA9IDE7CisJaHdkZXAtPmdyb3VwcyA9IHNuZF9oZGFfZGV2X2F0dHJfZ3JvdXBzOwogCiAJaHdkZXAtPm9wcy5vcGVuID0gaGRhX2h3ZGVwX29wZW47CiAJaHdkZXAtPm9wcy5pb2N0bCA9IGhkYV9od2RlcF9pb2N0bDsKQEAgLTE0OCw3NDAgKzExNyw4IEBACiAJaHdkZXAtPm9wcy5pb2N0bF9jb21wYXQgPSBoZGFfaHdkZXBfaW9jdGxfY29tcGF0OwogI2VuZGlmCiAKLQltdXRleF9pbml0KCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0Jc25kX2FycmF5X2luaXQoJmNvZGVjLT5pbml0X3ZlcmJzLCBzaXplb2Yoc3RydWN0IGhkYV92ZXJiKSwgMzIpOwotCXNuZF9hcnJheV9pbml0KCZjb2RlYy0+aGludHMsIHNpemVvZihzdHJ1Y3QgaGRhX2hpbnQpLCAzMik7Ci0Jc25kX2FycmF5X2luaXQoJmNvZGVjLT51c2VyX3BpbnMsIHNpemVvZihzdHJ1Y3QgaGRhX3BpbmNmZyksIDE2KTsKKwkvKiBsaW5rIHRvIGNvZGVjICovCisJaHdkZXAtPmRldiA9ICZjb2RlYy0+ZGV2OwogCiAJcmV0dXJuIDA7CiB9Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBzc2l6ZV90IHBvd2VyX29uX2FjY3Rfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsKLQlzbmRfaGRhX3VwZGF0ZV9wb3dlcl9hY2N0KGNvZGVjKTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgamlmZmllc190b19tc2Vjcyhjb2RlYy0+cG93ZXJfb25fYWNjdCkpOwotfQotCi1zdGF0aWMgc3NpemVfdCBwb3dlcl9vZmZfYWNjdF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHNuZF9od2RlcCAqaHdkZXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7Ci0Jc25kX2hkYV91cGRhdGVfcG93ZXJfYWNjdChjb2RlYyk7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGppZmZpZXNfdG9fbXNlY3MoY29kZWMtPnBvd2VyX29mZl9hY2N0KSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBwb3dlcl9hdHRyc1tdID0gewotCV9fQVRUUl9STyhwb3dlcl9vbl9hY2N0KSwKLQlfX0FUVFJfUk8ocG93ZXJfb2ZmX2FjY3QpLAotfTsKLQotaW50IHNuZF9oZGFfaHdkZXBfYWRkX3Bvd2VyX3N5c2ZzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwID0gY29kZWMtPmh3ZGVwOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG93ZXJfYXR0cnMpOyBpKyspCi0JCXNuZF9hZGRfZGV2aWNlX3N5c2ZzX2ZpbGUoU05EUlZfREVWSUNFX1RZUEVfSFdERVAsIGh3ZGVwLT5jYXJkLAotCQkJCQkgIGh3ZGVwLT5kZXZpY2UsICZwb3dlcl9hdHRyc1tpXSk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BNICovCi0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRwotCi0vKgotICogc3lzZnMgaW50ZXJmYWNlCi0gKi8KLQotc3RhdGljIGludCBjbGVhcl9jb2RlYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gc25kX2hkYV9jb2RlY19yZXNldChjb2RlYyk7Ci0JaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiVGhlIGNvZGVjIGlzIGJlaW5nIHVzZWQsIGNhbid0IGZyZWUuXG4iKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JY2xlYXJfaHdkZXBfZWxlbWVudHMoY29kZWMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJlY29uZmlnX2NvZGVjKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWludCBlcnI7Ci0KLQlzbmRfaGRhX3Bvd2VyX3VwKGNvZGVjKTsKLQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiaGRhLWNvZGVjOiByZWNvbmZpZ3VyaW5nXG4iKTsKLQllcnIgPSBzbmRfaGRhX2NvZGVjX3Jlc2V0KGNvZGVjKTsKLQlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAiVGhlIGNvZGVjIGlzIGJlaW5nIHVzZWQsIGNhbid0IHJlY29uZmlndXJlLlxuIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWVyciA9IHNuZF9oZGFfY29kZWNfY29uZmlndXJlKGNvZGVjKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBlcnJvcjsKLQkvKiByZWJ1aWxkIFBDTXMgKi8KLQllcnIgPSBzbmRfaGRhX2NvZGVjX2J1aWxkX3BjbXMoY29kZWMpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGVycm9yOwotCS8qIHJlYnVpbGQgbWl4ZXJzICovCi0JZXJyID0gc25kX2hkYV9jb2RlY19idWlsZF9jb250cm9scyhjb2RlYyk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY29kZWMtPmJ1cy0+Y2FyZCk7Ci0gZXJyb3I6Ci0Jc25kX2hkYV9wb3dlcl9kb3duKGNvZGVjKTsKLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogYWxsb2NhdGUgYSBzdHJpbmcgYXQgbW9zdCBsZW4gY2hhcnMsIGFuZCByZW1vdmUgdGhlIHRyYWlsaW5nIEVPTAotICovCi1zdGF0aWMgY2hhciAqa3N0cm5kdXBfbm9lb2woY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbGVuKQotewotCWNoYXIgKnMgPSBrc3RybmR1cChzcmMsIGxlbiwgR0ZQX0tFUk5FTCk7Ci0JY2hhciAqcDsKLQlpZiAoIXMpCi0JCXJldHVybiBOVUxMOwotCXAgPSBzdHJjaHIocywgJ1xuJyk7Ci0JaWYgKHApCi0JCSpwID0gMDsKLQlyZXR1cm4gczsKLX0KLQotI2RlZmluZSBDT0RFQ19JTkZPX1NIT1codHlwZSkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHR5cGUjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAotCQkJICAgY2hhciAqYnVmKQkJCQlcCi17CQkJCQkJCQlcCi0Jc3RydWN0IHNuZF9od2RlcCAqaHdkZXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7CQlcCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiMHgleFxuIiwgY29kZWMtPnR5cGUpOwkJXAotfQotCi0jZGVmaW5lIENPREVDX0lORk9fU1RSX1NIT1codHlwZSkJCQkJXAotc3RhdGljIHNzaXplX3QgdHlwZSMjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAkJCVwKLQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKLQkJCQkJY2hhciAqYnVmKQkJXAotewkJCQkJCQkJXAotCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQlcCi0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBod2RlcC0+cHJpdmF0ZV9kYXRhOwkJXAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLAkJCQlcCi0JCSAgICAgICBjb2RlYy0+dHlwZSA/IGNvZGVjLT50eXBlIDogIiIpOwkJXAotfQotCi1DT0RFQ19JTkZPX1NIT1codmVuZG9yX2lkKTsKLUNPREVDX0lORk9fU0hPVyhzdWJzeXN0ZW1faWQpOwotQ09ERUNfSU5GT19TSE9XKHJldmlzaW9uX2lkKTsKLUNPREVDX0lORk9fU0hPVyhhZmcpOwotQ09ERUNfSU5GT19TSE9XKG1mZyk7Ci1DT0RFQ19JTkZPX1NUUl9TSE9XKHZlbmRvcl9uYW1lKTsKLUNPREVDX0lORk9fU1RSX1NIT1coY2hpcF9uYW1lKTsKLUNPREVDX0lORk9fU1RSX1NIT1cobW9kZWxuYW1lKTsKLQotI2RlZmluZSBDT0RFQ19JTkZPX1NUT1JFKHR5cGUpCQkJCQlcCi1zdGF0aWMgc3NpemVfdCB0eXBlIyNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKLQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAotCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCi17CQkJCQkJCQlcCi0Jc3RydWN0IHNuZF9od2RlcCAqaHdkZXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7CQlcCi0JdW5zaWduZWQgbG9uZyB2YWw7CQkJCQlcCi0JaW50IGVyciA9IGtzdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7CQkJXAotCWlmIChlcnIgPCAwKQkJCQkJCVwKLQkJcmV0dXJuIGVycjsJCQkJCVwKLQljb2RlYy0+dHlwZSA9IHZhbDsJCQkJCVwKLQlyZXR1cm4gY291bnQ7CQkJCQkJXAotfQotCi0jZGVmaW5lIENPREVDX0lORk9fU1RSX1NUT1JFKHR5cGUpCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHR5cGUjI19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAotCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCi0JCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKLXsJCQkJCQkJCVwKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsJCVwKLQljaGFyICpzID0ga3N0cm5kdXBfbm9lb2woYnVmLCA2NCk7CQkJXAotCWlmICghcykJCQkJCQkJXAotCQlyZXR1cm4gLUVOT01FTTsJCQkJCVwKLQlrZnJlZShjb2RlYy0+dHlwZSk7CQkJCQlcCi0JY29kZWMtPnR5cGUgPSBzOwkJCQkJXAotCXJldHVybiBjb3VudDsJCQkJCQlcCi19Ci0KLUNPREVDX0lORk9fU1RPUkUodmVuZG9yX2lkKTsKLUNPREVDX0lORk9fU1RPUkUoc3Vic3lzdGVtX2lkKTsKLUNPREVDX0lORk9fU1RPUkUocmV2aXNpb25faWQpOwotQ09ERUNfSU5GT19TVFJfU1RPUkUodmVuZG9yX25hbWUpOwotQ09ERUNfSU5GT19TVFJfU1RPUkUoY2hpcF9uYW1lKTsKLUNPREVDX0lORk9fU1RSX1NUT1JFKG1vZGVsbmFtZSk7Ci0KLSNkZWZpbmUgQ09ERUNfQUNUSU9OX1NUT1JFKHR5cGUpCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHR5cGUjI19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAotCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCi0JCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKLXsJCQkJCQkJCVwKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsJCVwKLQlpbnQgZXJyID0gMDsJCQkJCQlcCi0JaWYgKCpidWYpCQkJCQkJXAotCQllcnIgPSB0eXBlIyNfY29kZWMoY29kZWMpOwkJCVwKLQlyZXR1cm4gZXJyIDwgMCA/IGVyciA6IGNvdW50OwkJCQlcCi19Ci0KLUNPREVDX0FDVElPTl9TVE9SRShyZWNvbmZpZyk7Ci1DT0RFQ19BQ1RJT05fU1RPUkUoY2xlYXIpOwotCi1zdGF0aWMgc3NpemVfdCBpbml0X3ZlcmJzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsKLQlpbnQgaSwgbGVuID0gMDsKLQltdXRleF9sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0JZm9yIChpID0gMDsgaSA8IGNvZGVjLT5pbml0X3ZlcmJzLnVzZWQ7IGkrKykgewotCQlzdHJ1Y3QgaGRhX3ZlcmIgKnYgPSBzbmRfYXJyYXlfZWxlbSgmY29kZWMtPmluaXRfdmVyYnMsIGkpOwotCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBQQUdFX1NJWkUgLSBsZW4sCi0JCQkJIjB4JTAyeCAweCUwM3ggMHglMDR4XG4iLAotCQkJCXYtPm5pZCwgdi0+dmVyYiwgdi0+cGFyYW0pOwotCX0KLQltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50IHBhcnNlX2luaXRfdmVyYnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaGRhX3ZlcmIgKnY7Ci0JaW50IG5pZCwgdmVyYiwgcGFyYW07Ci0KLQlpZiAoc3NjYW5mKGJ1ZiwgIiVpICVpICVpIiwgJm5pZCwgJnZlcmIsICZwYXJhbSkgIT0gMykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKCFuaWQgfHwgIXZlcmIpCi0JCXJldHVybiAtRUlOVkFMOwotCW11dGV4X2xvY2soJmNvZGVjLT51c2VyX211dGV4KTsKLQl2ID0gc25kX2FycmF5X25ldygmY29kZWMtPmluaXRfdmVyYnMpOwotCWlmICghdikgewotCQltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXYtPm5pZCA9IG5pZDsKLQl2LT52ZXJiID0gdmVyYjsKLQl2LT5wYXJhbSA9IHBhcmFtOwotCW11dGV4X3VubG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBpbml0X3ZlcmJzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsKLQlpbnQgZXJyID0gcGFyc2VfaW5pdF92ZXJicyhjb2RlYywgYnVmKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGhpbnRzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgY2hhciAqYnVmKQotewotCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBod2RlcC0+cHJpdmF0ZV9kYXRhOwotCWludCBpLCBsZW4gPSAwOwotCW11dGV4X2xvY2soJmNvZGVjLT51c2VyX211dGV4KTsKLQlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPmhpbnRzLnVzZWQ7IGkrKykgewotCQlzdHJ1Y3QgaGRhX2hpbnQgKmhpbnQgPSBzbmRfYXJyYXlfZWxlbSgmY29kZWMtPmhpbnRzLCBpKTsKLQkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgUEFHRV9TSVpFIC0gbGVuLAotCQkJCSIlcyA9ICVzXG4iLCBoaW50LT5rZXksIGhpbnQtPnZhbCk7Ci0JfQotCW11dGV4X3VubG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOwotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaGRhX2hpbnQgKmdldF9oaW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICprZXkpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPmhpbnRzLnVzZWQ7IGkrKykgewotCQlzdHJ1Y3QgaGRhX2hpbnQgKmhpbnQgPSBzbmRfYXJyYXlfZWxlbSgmY29kZWMtPmhpbnRzLCBpKTsKLQkJaWYgKCFzdHJjbXAoaGludC0+a2V5LCBrZXkpKQotCQkJcmV0dXJuIGhpbnQ7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCByZW1vdmVfdHJhaWxfc3BhY2VzKGNoYXIgKnN0cikKLXsKLQljaGFyICpwOwotCWlmICghKnN0cikKLQkJcmV0dXJuOwotCXAgPSBzdHIgKyBzdHJsZW4oc3RyKSAtIDE7Ci0JZm9yICg7IGlzc3BhY2UoKnApOyBwLS0pIHsKLQkJKnAgPSAwOwotCQlpZiAocCA9PSBzdHIpCi0JCQlyZXR1cm47Ci0JfQotfQotCi0jZGVmaW5lIE1BWF9ISU5UUwkxMDI0Ci0KLXN0YXRpYyBpbnQgcGFyc2VfaGludHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKmJ1ZikKLXsKLQljaGFyICprZXksICp2YWw7Ci0Jc3RydWN0IGhkYV9oaW50ICpoaW50OwotCWludCBlcnIgPSAwOwotCi0JYnVmID0gc2tpcF9zcGFjZXMoYnVmKTsKLQlpZiAoISpidWYgfHwgKmJ1ZiA9PSAnIycgfHwgKmJ1ZiA9PSAnXG4nKQotCQlyZXR1cm4gMDsKLQlpZiAoKmJ1ZiA9PSAnPScpCi0JCXJldHVybiAtRUlOVkFMOwotCWtleSA9IGtzdHJuZHVwX25vZW9sKGJ1ZiwgMTAyNCk7Ci0JaWYgKCFrZXkpCi0JCXJldHVybiAtRU5PTUVNOwotCS8qIGV4dHJhY3Qga2V5IGFuZCB2YWwgKi8KLQl2YWwgPSBzdHJjaHIoa2V5LCAnPScpOwotCWlmICghdmFsKSB7Ci0JCWtmcmVlKGtleSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQkqdmFsKysgPSAwOwotCXZhbCA9IHNraXBfc3BhY2VzKHZhbCk7Ci0JcmVtb3ZlX3RyYWlsX3NwYWNlcyhrZXkpOwotCXJlbW92ZV90cmFpbF9zcGFjZXModmFsKTsKLQltdXRleF9sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0JaGludCA9IGdldF9oaW50KGNvZGVjLCBrZXkpOwotCWlmIChoaW50KSB7Ci0JCS8qIHJlcGxhY2UgKi8KLQkJa2ZyZWUoaGludC0+a2V5KTsKLQkJaGludC0+a2V5ID0ga2V5OwotCQloaW50LT52YWwgPSB2YWw7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQkvKiBhbGxvY2F0ZSBhIG5ldyBoaW50IGVudHJ5ICovCi0JaWYgKGNvZGVjLT5oaW50cy51c2VkID49IE1BWF9ISU5UUykKLQkJaGludCA9IE5VTEw7Ci0JZWxzZQotCQloaW50ID0gc25kX2FycmF5X25ldygmY29kZWMtPmhpbnRzKTsKLQlpZiAoaGludCkgewotCQloaW50LT5rZXkgPSBrZXk7Ci0JCWhpbnQtPnZhbCA9IHZhbDsKLQl9IGVsc2UgewotCQllcnIgPSAtRU5PTUVNOwotCX0KLSB1bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0JaWYgKGVycikKLQkJa2ZyZWUoa2V5KTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgc3NpemVfdCBoaW50c19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBod2RlcC0+cHJpdmF0ZV9kYXRhOwotCWludCBlcnIgPSBwYXJzZV9oaW50cyhjb2RlYywgYnVmKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHBpbl9jb25maWdzX3Nob3coc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJc3RydWN0IHNuZF9hcnJheSAqbGlzdCwKLQkJCQljaGFyICpidWYpCi17Ci0JaW50IGksIGxlbiA9IDA7Ci0JbXV0ZXhfbG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOwotCWZvciAoaSA9IDA7IGkgPCBsaXN0LT51c2VkOyBpKyspIHsKLQkJc3RydWN0IGhkYV9waW5jZmcgKnBpbiA9IHNuZF9hcnJheV9lbGVtKGxpc3QsIGkpOwotCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIweCUwMnggMHglMDh4XG4iLAotCQkJICAgICAgIHBpbi0+bmlkLCBwaW4tPmNmZyk7Ci0JfQotCW11dGV4X3VubG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOwotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGluaXRfcGluX2NvbmZpZ3Nfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsKLQlyZXR1cm4gcGluX2NvbmZpZ3Nfc2hvdyhjb2RlYywgJmNvZGVjLT5pbml0X3BpbnMsIGJ1Zik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHVzZXJfcGluX2NvbmZpZ3Nfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsKLQlyZXR1cm4gcGluX2NvbmZpZ3Nfc2hvdyhjb2RlYywgJmNvZGVjLT51c2VyX3BpbnMsIGJ1Zik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGRyaXZlcl9waW5fY29uZmlnc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsKLQlyZXR1cm4gcGluX2NvbmZpZ3Nfc2hvdyhjb2RlYywgJmNvZGVjLT5kcml2ZXJfcGlucywgYnVmKTsKLX0KLQotI2RlZmluZSBNQVhfUElOX0NPTkZJR1MJCTMyCi0KLXN0YXRpYyBpbnQgcGFyc2VfdXNlcl9waW5fY29uZmlncyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqYnVmKQotewotCWludCBuaWQsIGNmZywgZXJyOwotCi0JaWYgKHNzY2FuZihidWYsICIlaSAlaSIsICZuaWQsICZjZmcpICE9IDIpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICghbmlkKQotCQlyZXR1cm4gLUVJTlZBTDsKLQltdXRleF9sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0JZXJyID0gc25kX2hkYV9hZGRfcGluY2ZnKGNvZGVjLCAmY29kZWMtPnVzZXJfcGlucywgbmlkLCBjZmcpOwotCW11dGV4X3VubG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHVzZXJfcGluX2NvbmZpZ3Nfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBod2RlcC0+cHJpdmF0ZV9kYXRhOwotCWludCBlcnIgPSBwYXJzZV91c2VyX3Bpbl9jb25maWdzKGNvZGVjLCBidWYpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCXJldHVybiBjb3VudDsKLX0KLQotI2RlZmluZSBDT0RFQ19BVFRSX1JXKHR5cGUpIFwKLQlfX0FUVFIodHlwZSwgMDY0NCwgdHlwZSMjX3Nob3csIHR5cGUjI19zdG9yZSkKLSNkZWZpbmUgQ09ERUNfQVRUUl9STyh0eXBlKSBcCi0JX19BVFRSX1JPKHR5cGUpCi0jZGVmaW5lIENPREVDX0FUVFJfV08odHlwZSkgXAotCV9fQVRUUih0eXBlLCAwMjAwLCBOVUxMLCB0eXBlIyNfc3RvcmUpCi0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBjb2RlY19hdHRyc1tdID0gewotCUNPREVDX0FUVFJfUlcodmVuZG9yX2lkKSwKLQlDT0RFQ19BVFRSX1JXKHN1YnN5c3RlbV9pZCksCi0JQ09ERUNfQVRUUl9SVyhyZXZpc2lvbl9pZCksCi0JQ09ERUNfQVRUUl9STyhhZmcpLAotCUNPREVDX0FUVFJfUk8obWZnKSwKLQlDT0RFQ19BVFRSX1JXKHZlbmRvcl9uYW1lKSwKLQlDT0RFQ19BVFRSX1JXKGNoaXBfbmFtZSksCi0JQ09ERUNfQVRUUl9SVyhtb2RlbG5hbWUpLAotCUNPREVDX0FUVFJfUlcoaW5pdF92ZXJicyksCi0JQ09ERUNfQVRUUl9SVyhoaW50cyksCi0JQ09ERUNfQVRUUl9STyhpbml0X3Bpbl9jb25maWdzKSwKLQlDT0RFQ19BVFRSX1JXKHVzZXJfcGluX2NvbmZpZ3MpLAotCUNPREVDX0FUVFJfUk8oZHJpdmVyX3Bpbl9jb25maWdzKSwKLQlDT0RFQ19BVFRSX1dPKHJlY29uZmlnKSwKLQlDT0RFQ19BVFRSX1dPKGNsZWFyKSwKLX07Ci0KLS8qCi0gKiBjcmVhdGUgc3lzZnMgZmlsZXMgb24gaHdkZXAgZGlyZWN0b3J5Ci0gKi8KLWludCBzbmRfaGRhX2h3ZGVwX2FkZF9zeXNmcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGNvZGVjLT5od2RlcDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvZGVjX2F0dHJzKTsgaSsrKQotCQlzbmRfYWRkX2RldmljZV9zeXNmc19maWxlKFNORFJWX0RFVklDRV9UWVBFX0hXREVQLCBod2RlcC0+Y2FyZCwKLQkJCQkJICBod2RlcC0+ZGV2aWNlLCAmY29kZWNfYXR0cnNbaV0pOwotCXJldHVybiAwOwotfQotCi0vKgotICogTG9vayBmb3IgaGludCBzdHJpbmcKLSAqLwotY29uc3QgY2hhciAqc25kX2hkYV9nZXRfaGludChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqa2V5KQotewotCXN0cnVjdCBoZGFfaGludCAqaGludCA9IGdldF9oaW50KGNvZGVjLCBrZXkpOwotCXJldHVybiBoaW50ID8gaGludC0+dmFsIDogTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfZ2V0X2hpbnQpOwotCi1pbnQgc25kX2hkYV9nZXRfYm9vbF9oaW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICprZXkpCi17Ci0JY29uc3QgY2hhciAqcDsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOwotCXAgPSBzbmRfaGRhX2dldF9oaW50KGNvZGVjLCBrZXkpOwotCWlmICghcCB8fCAhKnApCi0JCXJldCA9IC1FTk9FTlQ7Ci0JZWxzZSB7Ci0JCXN3aXRjaCAodG91cHBlcigqcCkpIHsKLQkJY2FzZSAnVCc6IC8qIHRydWUgKi8KLQkJY2FzZSAnWSc6IC8qIHllcyAqLwotCQljYXNlICcxJzoKLQkJCXJldCA9IDE7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9nZXRfYm9vbF9oaW50KTsKLQotaW50IHNuZF9oZGFfZ2V0X2ludF9oaW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICprZXksIGludCAqdmFscCkKLXsKLQljb25zdCBjaGFyICpwOwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0JcCA9IHNuZF9oZGFfZ2V0X2hpbnQoY29kZWMsIGtleSk7Ci0JaWYgKCFwKQotCQlyZXQgPSAtRU5PRU5UOwotCWVsc2UgaWYgKGtzdHJ0b3VsKHAsIDAsICZ2YWwpKQotCQlyZXQgPSAtRUlOVkFMOwotCWVsc2UgewotCQkqdmFscCA9IHZhbDsKLQkJcmV0ID0gMDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfZ2V0X2ludF9oaW50KTsKLSNlbmRpZiAvKiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRyAqLwotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfUEFUQ0hfTE9BREVSCi0KLS8qIHBhcnNlciBtb2RlICovCi1lbnVtIHsKLQlMSU5FX01PREVfTk9ORSwKLQlMSU5FX01PREVfQ09ERUMsCi0JTElORV9NT0RFX01PREVMLAotCUxJTkVfTU9ERV9QSU5DRkcsCi0JTElORV9NT0RFX1ZFUkIsCi0JTElORV9NT0RFX0hJTlQsCi0JTElORV9NT0RFX1ZFTkRPUl9JRCwKLQlMSU5FX01PREVfU1VCU1lTVEVNX0lELAotCUxJTkVfTU9ERV9SRVZJU0lPTl9JRCwKLQlMSU5FX01PREVfQ0hJUF9OQU1FLAotCU5VTV9MSU5FX01PREVTLAotfTsKLQotc3RhdGljIGlubGluZSBpbnQgc3RybWF0Y2goY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikKLXsKLQlyZXR1cm4gc3RybmljbXAoYSwgYiwgc3RybGVuKGIpKSA9PSAwOwotfQotCi0vKiBwYXJzZSB0aGUgY29udGVudHMgYWZ0ZXIgdGhlIGxpbmUgIltjb2RlY10iCi0gKiBhY2NlcHQgb25seSB0aGUgbGluZSB3aXRoIHRocmVlIG51bWJlcnMsIGFuZCBhc3NpZ24gdGhlIGN1cnJlbnQgY29kZWMKLSAqLwotc3RhdGljIHZvaWQgcGFyc2VfY29kZWNfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsCi0JCQkgICAgIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCi17Ci0JaW50IHZlbmRvcmlkLCBzdWJpZCwgY2FkZHI7Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7Ci0KLQkqY29kZWNwID0gTlVMTDsKLQlpZiAoc3NjYW5mKGJ1ZiwgIiVpICVpICVpIiwgJnZlbmRvcmlkLCAmc3ViaWQsICZjYWRkcikgPT0gMykgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjLCAmYnVzLT5jb2RlY19saXN0LCBsaXN0KSB7Ci0JCQlpZiAoKHZlbmRvcmlkIDw9IDAgfHwgY29kZWMtPnZlbmRvcl9pZCA9PSB2ZW5kb3JpZCkgJiYKLQkJCSAgICAoc3ViaWQgPD0gMCB8fCBjb2RlYy0+c3Vic3lzdGVtX2lkID09IHN1YmlkKSAmJgotCQkJICAgIGNvZGVjLT5hZGRyID09IGNhZGRyKSB7Ci0JCQkJKmNvZGVjcCA9IGNvZGVjOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKiBwYXJzZSB0aGUgY29udGVudHMgYWZ0ZXIgdGhlIG90aGVyIGNvbW1hbmQgdGFncywgW3BpbmNmZ10sIFt2ZXJiXSwKLSAqIFt2ZW5kb3JfaWRdLCBbc3Vic3lzdGVtX2lkXSwgW3JldmlzaW9uX2lkXSwgW2NoaXBfbmFtZV0sIFtoaW50XSBhbmQgW21vZGVsXQotICoganVzdCBwYXNzIHRvIHRoZSBzeXNmcyBoZWxwZXIgKG9ubHkgd2hlbiBhbnkgY29kZWMgd2FzIHNwZWNpZmllZCkKLSAqLwotc3RhdGljIHZvaWQgcGFyc2VfcGluY2ZnX21vZGUoY2hhciAqYnVmLCBzdHJ1Y3QgaGRhX2J1cyAqYnVzLAotCQkJICAgICAgc3RydWN0IGhkYV9jb2RlYyAqKmNvZGVjcCkKLXsKLQlwYXJzZV91c2VyX3Bpbl9jb25maWdzKCpjb2RlY3AsIGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhcnNlX3ZlcmJfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsCi0JCQkgICAgc3RydWN0IGhkYV9jb2RlYyAqKmNvZGVjcCkKLXsKLQlwYXJzZV9pbml0X3ZlcmJzKCpjb2RlY3AsIGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhcnNlX2hpbnRfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsCi0JCQkgICAgc3RydWN0IGhkYV9jb2RlYyAqKmNvZGVjcCkKLXsKLQlwYXJzZV9oaW50cygqY29kZWNwLCBidWYpOwotfQotCi1zdGF0aWMgdm9pZCBwYXJzZV9tb2RlbF9tb2RlKGNoYXIgKmJ1Ziwgc3RydWN0IGhkYV9idXMgKmJ1cywKLQkJCSAgICAgc3RydWN0IGhkYV9jb2RlYyAqKmNvZGVjcCkKLXsKLQlrZnJlZSgoKmNvZGVjcCktPm1vZGVsbmFtZSk7Ci0JKCpjb2RlY3ApLT5tb2RlbG5hbWUgPSBrc3RyZHVwKGJ1ZiwgR0ZQX0tFUk5FTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhcnNlX2NoaXBfbmFtZV9tb2RlKGNoYXIgKmJ1Ziwgc3RydWN0IGhkYV9idXMgKmJ1cywKLQkJCQkgc3RydWN0IGhkYV9jb2RlYyAqKmNvZGVjcCkKLXsKLQlrZnJlZSgoKmNvZGVjcCktPmNoaXBfbmFtZSk7Ci0JKCpjb2RlY3ApLT5jaGlwX25hbWUgPSBrc3RyZHVwKGJ1ZiwgR0ZQX0tFUk5FTCk7Ci19Ci0KLSNkZWZpbmUgREVGSU5FX1BBUlNFX0lEX01PREUobmFtZSkgXAotc3RhdGljIHZvaWQgcGFyc2VfIyNuYW1lIyNfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsIFwKLQkJCQkgc3RydWN0IGhkYV9jb2RlYyAqKmNvZGVjcCkgXAoteyBcCi0JdW5zaWduZWQgbG9uZyB2YWw7IFwKLQlpZiAoIWtzdHJ0b3VsKGJ1ZiwgMCwgJnZhbCkpIFwKLQkJKCpjb2RlY3ApLT5uYW1lID0gdmFsOyBcCi19Ci0KLURFRklORV9QQVJTRV9JRF9NT0RFKHZlbmRvcl9pZCk7Ci1ERUZJTkVfUEFSU0VfSURfTU9ERShzdWJzeXN0ZW1faWQpOwotREVGSU5FX1BBUlNFX0lEX01PREUocmV2aXNpb25faWQpOwotCi0KLXN0cnVjdCBoZGFfcGF0Y2hfaXRlbSB7Ci0JY29uc3QgY2hhciAqdGFnOwotCWNvbnN0IGNoYXIgKmFsaWFzOwotCXZvaWQgKCpwYXJzZXIpKGNoYXIgKmJ1Ziwgc3RydWN0IGhkYV9idXMgKmJ1cywgc3RydWN0IGhkYV9jb2RlYyAqKnJldGMpOwotfTsKLQotc3RhdGljIHN0cnVjdCBoZGFfcGF0Y2hfaXRlbSBwYXRjaF9pdGVtc1tOVU1fTElORV9NT0RFU10gPSB7Ci0JW0xJTkVfTU9ERV9DT0RFQ10gPSB7Ci0JCS50YWcgPSAiW2NvZGVjXSIsCi0JCS5wYXJzZXIgPSBwYXJzZV9jb2RlY19tb2RlLAotCX0sCi0JW0xJTkVfTU9ERV9NT0RFTF0gPSB7Ci0JCS50YWcgPSAiW21vZGVsXSIsCi0JCS5wYXJzZXIgPSBwYXJzZV9tb2RlbF9tb2RlLAotCX0sCi0JW0xJTkVfTU9ERV9WRVJCXSA9IHsKLQkJLnRhZyA9ICJbdmVyYl0iLAotCQkuYWxpYXMgPSAiW2luaXRfdmVyYnNdIiwKLQkJLnBhcnNlciA9IHBhcnNlX3ZlcmJfbW9kZSwKLQl9LAotCVtMSU5FX01PREVfUElOQ0ZHXSA9IHsKLQkJLnRhZyA9ICJbcGluY2ZnXSIsCi0JCS5hbGlhcyA9ICJbdXNlcl9waW5fY29uZmlnc10iLAotCQkucGFyc2VyID0gcGFyc2VfcGluY2ZnX21vZGUsCi0JfSwKLQlbTElORV9NT0RFX0hJTlRdID0gewotCQkudGFnID0gIltoaW50XSIsCi0JCS5hbGlhcyA9ICJbaGludHNdIiwKLQkJLnBhcnNlciA9IHBhcnNlX2hpbnRfbW9kZQotCX0sCi0JW0xJTkVfTU9ERV9WRU5ET1JfSURdID0gewotCQkudGFnID0gIlt2ZW5kb3JfaWRdIiwKLQkJLnBhcnNlciA9IHBhcnNlX3ZlbmRvcl9pZF9tb2RlLAotCX0sCi0JW0xJTkVfTU9ERV9TVUJTWVNURU1fSURdID0gewotCQkudGFnID0gIltzdWJzeXN0ZW1faWRdIiwKLQkJLnBhcnNlciA9IHBhcnNlX3N1YnN5c3RlbV9pZF9tb2RlLAotCX0sCi0JW0xJTkVfTU9ERV9SRVZJU0lPTl9JRF0gPSB7Ci0JCS50YWcgPSAiW3JldmlzaW9uX2lkXSIsCi0JCS5wYXJzZXIgPSBwYXJzZV9yZXZpc2lvbl9pZF9tb2RlLAotCX0sCi0JW0xJTkVfTU9ERV9DSElQX05BTUVdID0gewotCQkudGFnID0gIltjaGlwX25hbWVdIiwKLQkJLnBhcnNlciA9IHBhcnNlX2NoaXBfbmFtZV9tb2RlLAotCX0sCi19OwotCi0vKiBjaGVjayB0aGUgbGluZSBzdGFydGluZyB3aXRoICdbJyAtLSBjaGFuZ2UgdGhlIHBhcnNlciBtb2RlIGFjY29kaW5nbHkgKi8KLXN0YXRpYyBpbnQgcGFyc2VfbGluZV9tb2RlKGNoYXIgKmJ1Ziwgc3RydWN0IGhkYV9idXMgKmJ1cykKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwYXRjaF9pdGVtcyk7IGkrKykgewotCQlpZiAoIXBhdGNoX2l0ZW1zW2ldLnRhZykKLQkJCWNvbnRpbnVlOwotCQlpZiAoc3RybWF0Y2goYnVmLCBwYXRjaF9pdGVtc1tpXS50YWcpKQotCQkJcmV0dXJuIGk7Ci0JCWlmIChwYXRjaF9pdGVtc1tpXS5hbGlhcyAmJiBzdHJtYXRjaChidWYsIHBhdGNoX2l0ZW1zW2ldLmFsaWFzKSkKLQkJCXJldHVybiBpOwotCX0KLQlyZXR1cm4gTElORV9NT0RFX05PTkU7Ci19Ci0KLS8qIGNvcHkgb25lIGxpbmUgZnJvbSB0aGUgYnVmZmVyIGluIGZ3LCBhbmQgdXBkYXRlIHRoZSBmaWVsZHMgaW4gZncKLSAqIHJldHVybiB6ZXJvIGlmIGl0IHJlYWNoZXMgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCBvciBub24temVybwotICogaWYgc3VjY2Vzc2Z1bGx5IGNvcGllZCBhIGxpbmUKLSAqCi0gKiB0aGUgc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIHRoZSBlbmQgb2YgdGhlIGxpbmUgYXJlIHN0cmlwcGVkCi0gKi8KLXN0YXRpYyBpbnQgZ2V0X2xpbmVfZnJvbV9mdyhjaGFyICpidWYsIGludCBzaXplLCBzaXplX3QgKmZ3X3NpemVfcCwKLQkJCSAgICBjb25zdCB2b2lkICoqZndfZGF0YV9wKQotewotCWludCBsZW47Ci0Jc2l6ZV90IGZ3X3NpemUgPSAqZndfc2l6ZV9wOwotCWNvbnN0IGNoYXIgKnAgPSAqZndfZGF0YV9wOwotCi0Jd2hpbGUgKGlzc3BhY2UoKnApICYmIGZ3X3NpemUpIHsKLQkJcCsrOwotCQlmd19zaXplLS07Ci0JfQotCWlmICghZndfc2l6ZSkKLQkJcmV0dXJuIDA7Ci0KLQlmb3IgKGxlbiA9IDA7IGxlbiA8IGZ3X3NpemU7IGxlbisrKSB7Ci0JCWlmICghKnApCi0JCQlicmVhazsKLQkJaWYgKCpwID09ICdcbicpIHsKLQkJCXArKzsKLQkJCWxlbisrOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGxlbiA8IHNpemUpCi0JCQkqYnVmKysgPSAqcCsrOwotCX0KLQkqYnVmID0gMDsKLQkqZndfc2l6ZV9wID0gZndfc2l6ZSAtIGxlbjsKLQkqZndfZGF0YV9wID0gcDsKLQlyZW1vdmVfdHJhaWxfc3BhY2VzKGJ1Zik7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBsb2FkIGEgInBhdGNoIiBmaXJtd2FyZSBmaWxlIGFuZCBwYXJzZSBpdAotICovCi1pbnQgc25kX2hkYV9sb2FkX3BhdGNoKHN0cnVjdCBoZGFfYnVzICpidXMsIHNpemVfdCBmd19zaXplLCBjb25zdCB2b2lkICpmd19idWYpCi17Ci0JY2hhciBidWZbMTI4XTsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYzsKLQlpbnQgbGluZV9tb2RlOwotCi0JbGluZV9tb2RlID0gTElORV9NT0RFX05PTkU7Ci0JY29kZWMgPSBOVUxMOwotCXdoaWxlIChnZXRfbGluZV9mcm9tX2Z3KGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxLCAmZndfc2l6ZSwgJmZ3X2J1ZikpIHsKLQkJaWYgKCEqYnVmIHx8ICpidWYgPT0gJyMnIHx8ICpidWYgPT0gJ1xuJykKLQkJCWNvbnRpbnVlOwotCQlpZiAoKmJ1ZiA9PSAnWycpCi0JCQlsaW5lX21vZGUgPSBwYXJzZV9saW5lX21vZGUoYnVmLCBidXMpOwotCQllbHNlIGlmIChwYXRjaF9pdGVtc1tsaW5lX21vZGVdLnBhcnNlciAmJgotCQkJIChjb2RlYyB8fCBsaW5lX21vZGUgPD0gTElORV9NT0RFX0NPREVDKSkKLQkJCXBhdGNoX2l0ZW1zW2xpbmVfbW9kZV0ucGFyc2VyKGJ1ZiwgYnVzLCAmY29kZWMpOwotCX0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfbG9hZF9wYXRjaCk7Ci0jZW5kaWYgLyogQ09ORklHX1NORF9IREFfUEFUQ0hfTE9BREVSICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9pOTE1LmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9pOTE1LmMKaW5kZXggNzZjMTNkNS4uOWQwN2U0ZWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2k5MTUuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9pOTE1LmMKQEAgLTMwLDcgKzMwLDcgQEAKIAlpZiAoIWdldF9wb3dlciB8fCAhcHV0X3Bvd2VyKQogCQlyZXR1cm47CiAKLQlzbmRfcHJpbnRkZCgiSERBIGRpc3BsYXkgcG93ZXIgJXMgXG4iLAorCXByX2RlYnVnKCJIREEgZGlzcGxheSBwb3dlciAlcyBcbiIsCiAJCQllbmFibGUgPyAiRW5hYmxlIiA6ICJEaXNhYmxlIik7CiAJaWYgKGVuYWJsZSkKIAkJZ2V0X3Bvd2VyKCk7CkBAIC00NCw3ICs0NCw3IEBACiAKIAlnZXRfcG93ZXIgPSBzeW1ib2xfcmVxdWVzdChpOTE1X3JlcXVlc3RfcG93ZXJfd2VsbCk7CiAJaWYgKCFnZXRfcG93ZXIpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImhkYS1pOTE1OiBnZXRfcG93ZXIgc3ltYm9sIGdldCBmYWlsXG4iKTsKKwkJcHJfd2FybigiaGRhLWk5MTU6IGdldF9wb3dlciBzeW1ib2wgZ2V0IGZhaWxcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTU1LDcgKzU1LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc25kX3ByaW50ZCgiSERBIGRyaXZlciBnZXQgc3ltYm9sIHN1Y2Nlc3NmdWxseSBmcm9tIGk5MTUgbW9kdWxlXG4iKTsKKwlwcl9kZWJ1ZygiSERBIGRyaXZlciBnZXQgc3ltYm9sIHN1Y2Nlc3NmdWxseSBmcm9tIGk5MTUgbW9kdWxlXG4iKTsKIAogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jIGIvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYwppbmRleCBlMzU0YWIxLi43N2NhODk0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKQEAgLTYzLDYgKzYzLDggQEAKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgImhkYV9jb2RlYy5oIgogI2luY2x1ZGUgImhkYV9pOTE1LmgiCisjaW5jbHVkZSAiaGRhX2NvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJoZGFfcHJpdi5oIgogCiAKIHN0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CkBAIC0xMjcsNiArMTI5LDcgQEAKICNkZWZpbmUgcGFyYW1fY2hlY2tfeGludCBwYXJhbV9jaGVja19pbnQKIAogc3RhdGljIGludCBwb3dlcl9zYXZlID0gQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRV9ERUZBVUxUOworc3RhdGljIGludCAqcG93ZXJfc2F2ZV9hZGRyID0gJnBvd2VyX3NhdmU7CiBtb2R1bGVfcGFyYW0ocG93ZXJfc2F2ZSwgeGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBvd2VyX3NhdmUsICJBdXRvbWF0aWMgcG93ZXItc2F2aW5nIHRpbWVvdXQgIgogCQkgIihpbiBzZWNvbmQsIDAgPSBkaXNhYmxlKS4iKTsKQEAgLTEzOCw2ICsxNDEsOCBAQAogc3RhdGljIGJvb2wgcG93ZXJfc2F2ZV9jb250cm9sbGVyID0gMTsKIG1vZHVsZV9wYXJhbShwb3dlcl9zYXZlX2NvbnRyb2xsZXIsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhwb3dlcl9zYXZlX2NvbnRyb2xsZXIsICJSZXNldCBjb250cm9sbGVyIGluIHBvd2VyIHNhdmUgbW9kZS4iKTsKKyNlbHNlCitzdGF0aWMgaW50ICpwb3dlcl9zYXZlX2FkZHI7CiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKIHN0YXRpYyBpbnQgYWxpZ25fYnVmZmVyX3NpemUgPSAtMTsKQEAgLTE0OSwxMCArMTU0LDggQEAKIHN0YXRpYyBib29sIGhkYV9zbm9vcCA9IHRydWU7CiBtb2R1bGVfcGFyYW1fbmFtZWQoc25vb3AsIGhkYV9zbm9vcCwgYm9vbCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHNub29wLCAiRW5hYmxlL2Rpc2FibGUgc25vb3BpbmciKTsKLSNkZWZpbmUgYXp4X3Nub29wKGNoaXApCQkoY2hpcCktPnNub29wCiAjZWxzZQogI2RlZmluZSBoZGFfc25vb3AJCXRydWUKLSNkZWZpbmUgYXp4X3Nub29wKGNoaXApCQl0cnVlCiAjZW5kaWYKIAogCkBAIC0xOTEsMTIgKzE5NCw2IEBACiAJCQkgIntVTEksIE01NDYxfX0iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgSERBIGRyaXZlciIpOwogCi0jaWZkZWYgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USwotI2RlZmluZSBTRlgJLyogbm9wICovCi0jZWxzZQotI2RlZmluZSBTRlgJImhkYS1pbnRlbCAiCi0jZW5kaWYKLQogI2lmIGRlZmluZWQoQ09ORklHX1BNKSAmJiBkZWZpbmVkKENPTkZJR19WR0FfU1dJVENIRVJPTykKICNpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfSERBX0NPREVDX0hETUkpCiAjZGVmaW5lIFNVUFBPUlRfVkdBX1NXSVRDSEVST08KQEAgLTIwNSwzNjQgKzIwMiw3IEBACiAKIAogLyoKLSAqIHJlZ2lzdGVycwogICovCi0jZGVmaW5lIElDSDZfUkVHX0dDQVAJCQkweDAwCi0jZGVmaW5lICAgSUNINl9HQ0FQXzY0T0sJKDEgPDwgMCkgICAvKiA2NGJpdCBhZGRyZXNzIHN1cHBvcnQgKi8KLSNkZWZpbmUgICBJQ0g2X0dDQVBfTlNETwkoMyA8PCAxKSAgIC8qICMgb2Ygc2VyaWFsIGRhdGEgb3V0IHNpZ25hbHMgKi8KLSNkZWZpbmUgICBJQ0g2X0dDQVBfQlNTCQkoMzEgPDwgMykgIC8qICMgb2YgYmlkaXJlY3Rpb25hbCBzdHJlYW1zICovCi0jZGVmaW5lICAgSUNINl9HQ0FQX0lTUwkJKDE1IDw8IDgpICAvKiAjIG9mIGlucHV0IHN0cmVhbXMgKi8KLSNkZWZpbmUgICBJQ0g2X0dDQVBfT1NTCQkoMTUgPDwgMTIpIC8qICMgb2Ygb3V0cHV0IHN0cmVhbXMgKi8KLSNkZWZpbmUgSUNINl9SRUdfVk1JTgkJCTB4MDIKLSNkZWZpbmUgSUNINl9SRUdfVk1BSgkJCTB4MDMKLSNkZWZpbmUgSUNINl9SRUdfT1VUUEFZCQkJMHgwNAotI2RlZmluZSBJQ0g2X1JFR19JTlBBWQkJCTB4MDYKLSNkZWZpbmUgSUNINl9SRUdfR0NUTAkJCTB4MDgKLSNkZWZpbmUgICBJQ0g2X0dDVExfUkVTRVQJKDEgPDwgMCkgICAvKiBjb250cm9sbGVyIHJlc2V0ICovCi0jZGVmaW5lICAgSUNINl9HQ1RMX0ZDTlRSTAkoMSA8PCAxKSAgIC8qIGZsdXNoIGNvbnRyb2wgKi8KLSNkZWZpbmUgICBJQ0g2X0dDVExfVU5TT0wJKDEgPDwgOCkgICAvKiBhY2NlcHQgdW5zb2wuIHJlc3BvbnNlIGVuYWJsZSAqLwotI2RlZmluZSBJQ0g2X1JFR19XQUtFRU4JCQkweDBjCi0jZGVmaW5lIElDSDZfUkVHX1NUQVRFU1RTCQkweDBlCi0jZGVmaW5lIElDSDZfUkVHX0dTVFMJCQkweDEwCi0jZGVmaW5lICAgSUNINl9HU1RTX0ZTVFMJKDEgPDwgMSkgICAvKiBmbHVzaCBzdGF0dXMgKi8KLSNkZWZpbmUgSUNINl9SRUdfSU5UQ1RMCQkJMHgyMAotI2RlZmluZSBJQ0g2X1JFR19JTlRTVFMJCQkweDI0Ci0jZGVmaW5lIElDSDZfUkVHX1dBTExDTEsJCTB4MzAJLyogMjRNaHogc291cmNlICovCi0jZGVmaW5lIElDSDZfUkVHX09MRF9TU1lOQwkJMHgzNAkvKiBTU1lOQyBmb3Igb2xkIElDSCAqLwotI2RlZmluZSBJQ0g2X1JFR19TU1lOQwkJCTB4MzgKLSNkZWZpbmUgSUNINl9SRUdfQ09SQkxCQVNFCQkweDQwCi0jZGVmaW5lIElDSDZfUkVHX0NPUkJVQkFTRQkJMHg0NAotI2RlZmluZSBJQ0g2X1JFR19DT1JCV1AJCQkweDQ4Ci0jZGVmaW5lIElDSDZfUkVHX0NPUkJSUAkJCTB4NGEKLSNkZWZpbmUgICBJQ0g2X0NPUkJSUF9SU1QJKDEgPDwgMTUpICAvKiByZWFkIHBvaW50ZXIgcmVzZXQgKi8KLSNkZWZpbmUgSUNINl9SRUdfQ09SQkNUTAkJMHg0YwotI2RlZmluZSAgIElDSDZfQ09SQkNUTF9SVU4JKDEgPDwgMSkgICAvKiBlbmFibGUgRE1BICovCi0jZGVmaW5lICAgSUNINl9DT1JCQ1RMX0NNRUlFCSgxIDw8IDApICAgLyogZW5hYmxlIG1lbW9yeSBlcnJvciBpcnEgKi8KLSNkZWZpbmUgSUNINl9SRUdfQ09SQlNUUwkJMHg0ZAotI2RlZmluZSAgIElDSDZfQ09SQlNUU19DTUVJCSgxIDw8IDApICAgLyogbWVtb3J5IGVycm9yIGluZGljYXRpb24gKi8KLSNkZWZpbmUgSUNINl9SRUdfQ09SQlNJWkUJCTB4NGUKLQotI2RlZmluZSBJQ0g2X1JFR19SSVJCTEJBU0UJCTB4NTAKLSNkZWZpbmUgSUNINl9SRUdfUklSQlVCQVNFCQkweDU0Ci0jZGVmaW5lIElDSDZfUkVHX1JJUkJXUAkJCTB4NTgKLSNkZWZpbmUgICBJQ0g2X1JJUkJXUF9SU1QJKDEgPDwgMTUpICAvKiB3cml0ZSBwb2ludGVyIHJlc2V0ICovCi0jZGVmaW5lIElDSDZfUkVHX1JJTlRDTlQJCTB4NWEKLSNkZWZpbmUgSUNINl9SRUdfUklSQkNUTAkJMHg1YwotI2RlZmluZSAgIElDSDZfUkJDVExfSVJRX0VOCSgxIDw8IDApICAgLyogZW5hYmxlIElSUSAqLwotI2RlZmluZSAgIElDSDZfUkJDVExfRE1BX0VOCSgxIDw8IDEpICAgLyogZW5hYmxlIERNQSAqLwotI2RlZmluZSAgIElDSDZfUkJDVExfT1ZFUlJVTl9FTgkoMSA8PCAyKSAgIC8qIGVuYWJsZSBvdmVycnVuIGlycSAqLwotI2RlZmluZSBJQ0g2X1JFR19SSVJCU1RTCQkweDVkCi0jZGVmaW5lICAgSUNINl9SQlNUU19JUlEJKDEgPDwgMCkgICAvKiByZXNwb25zZSBpcnEgKi8KLSNkZWZpbmUgICBJQ0g2X1JCU1RTX09WRVJSVU4JKDEgPDwgMikgICAvKiBvdmVycnVuIGlycSAqLwotI2RlZmluZSBJQ0g2X1JFR19SSVJCU0laRQkJMHg1ZQotCi0jZGVmaW5lIElDSDZfUkVHX0lDCQkJMHg2MAotI2RlZmluZSBJQ0g2X1JFR19JUgkJCTB4NjQKLSNkZWZpbmUgSUNINl9SRUdfSVJTCQkJMHg2OAotI2RlZmluZSAgIElDSDZfSVJTX1ZBTElECSgxPDwxKQotI2RlZmluZSAgIElDSDZfSVJTX0JVU1kJCSgxPDwwKQotCi0jZGVmaW5lIElDSDZfUkVHX0RQTEJBU0UJCTB4NzAKLSNkZWZpbmUgSUNINl9SRUdfRFBVQkFTRQkJMHg3NAotI2RlZmluZSAgIElDSDZfRFBMQkFTRV9FTkFCTEUJMHgxCS8qIEVuYWJsZSBwb3NpdGlvbiBidWZmZXIgKi8KLQotLyogU0Qgb2Zmc2V0OiBTREkwPTB4ODAsIFNESTE9MHhhMCwgLi4uIFNETzM9MHgxNjAgKi8KLWVudW0geyBTREkwLCBTREkxLCBTREkyLCBTREkzLCBTRE8wLCBTRE8xLCBTRE8yLCBTRE8zIH07Ci0KLS8qIHN0cmVhbSByZWdpc3RlciBvZmZzZXRzIGZyb20gc3RyZWFtIGJhc2UgKi8KLSNkZWZpbmUgSUNINl9SRUdfU0RfQ1RMCQkJMHgwMAotI2RlZmluZSBJQ0g2X1JFR19TRF9TVFMJCQkweDAzCi0jZGVmaW5lIElDSDZfUkVHX1NEX0xQSUIJCTB4MDQKLSNkZWZpbmUgSUNINl9SRUdfU0RfQ0JMCQkJMHgwOAotI2RlZmluZSBJQ0g2X1JFR19TRF9MVkkJCQkweDBjCi0jZGVmaW5lIElDSDZfUkVHX1NEX0ZJRk9XCQkweDBlCi0jZGVmaW5lIElDSDZfUkVHX1NEX0ZJRk9TSVpFCQkweDEwCi0jZGVmaW5lIElDSDZfUkVHX1NEX0ZPUk1BVAkJMHgxMgotI2RlZmluZSBJQ0g2X1JFR19TRF9CRExQTAkJMHgxOAotI2RlZmluZSBJQ0g2X1JFR19TRF9CRExQVQkJMHgxYwotCi0vKiBQQ0kgc3BhY2UgKi8KLSNkZWZpbmUgSUNINl9QQ0lSRUdfVENTRUwJMHg0NAotCi0vKgotICogb3RoZXIgY29uc3RhbnRzCi0gKi8KLQotLyogbWF4IG51bWJlciBvZiBTRHMgKi8KLS8qIElDSCwgQVRJIGFuZCBWSUEgaGF2ZSA0IHBsYXliYWNrIGFuZCA0IGNhcHR1cmUgKi8KLSNkZWZpbmUgSUNINl9OVU1fQ0FQVFVSRQk0Ci0jZGVmaW5lIElDSDZfTlVNX1BMQVlCQUNLCTQKLQotLyogVUxJIGhhcyA2IHBsYXliYWNrIGFuZCA1IGNhcHR1cmUgKi8KLSNkZWZpbmUgVUxJX05VTV9DQVBUVVJFCQk1Ci0jZGVmaW5lIFVMSV9OVU1fUExBWUJBQ0sJNgotCi0vKiBBVEkgSERNSSBtYXkgaGF2ZSB1cCB0byA4IHBsYXliYWNrcyBhbmQgMCBjYXB0dXJlICovCi0jZGVmaW5lIEFUSUhETUlfTlVNX0NBUFRVUkUJMAotI2RlZmluZSBBVElIRE1JX05VTV9QTEFZQkFDSwk4Ci0KLS8qIFRFUkEgaGFzIDQgcGxheWJhY2sgYW5kIDMgY2FwdHVyZSAqLwotI2RlZmluZSBURVJBX05VTV9DQVBUVVJFCTMKLSNkZWZpbmUgVEVSQV9OVU1fUExBWUJBQ0sJNAotCi0vKiB0aGlzIG51bWJlciBpcyBzdGF0aWNhbGx5IGRlZmluZWQgZm9yIHNpbXBsaWNpdHkgKi8KLSNkZWZpbmUgTUFYX0FaWF9ERVYJCTE2Ci0KLS8qIG1heCBudW1iZXIgb2YgZnJhZ21lbnRzIC0gd2UgbWF5IHVzZSBtb3JlIGlmIGFsbG9jYXRpbmcgbW9yZSBwYWdlcyBmb3IgQkRMICovCi0jZGVmaW5lIEJETF9TSVpFCQk0MDk2Ci0jZGVmaW5lIEFaWF9NQVhfQkRMX0VOVFJJRVMJKEJETF9TSVpFIC8gMTYpCi0jZGVmaW5lIEFaWF9NQVhfRlJBRwkJMzIKLS8qIG1heCBidWZmZXIgc2l6ZSAtIG5vIGgvdyBsaW1pdCwgeW91IGNhbiBpbmNyZWFzZSBhcyB5b3UgbGlrZSAqLwotI2RlZmluZSBBWlhfTUFYX0JVRl9TSVpFCSgxMDI0KjEwMjQqMTAyNCkKLQotLyogUklSQiBpbnQgbWFzazogb3ZlcnJ1blsyXSwgcmVzcG9uc2VbMF0gKi8KLSNkZWZpbmUgUklSQl9JTlRfUkVTUE9OU0UJMHgwMQotI2RlZmluZSBSSVJCX0lOVF9PVkVSUlVOCTB4MDQKLSNkZWZpbmUgUklSQl9JTlRfTUFTSwkJMHgwNQotCi0vKiBTVEFURVNUUyBpbnQgbWFzazogUzMsU0QyLFNEMSxTRDAgKi8KLSNkZWZpbmUgQVpYX01BWF9DT0RFQ1MJCTgKLSNkZWZpbmUgQVpYX0RFRkFVTFRfQ09ERUNTCTQKLSNkZWZpbmUgU1RBVEVTVFNfSU5UX01BU0sJKCgxIDw8IEFaWF9NQVhfQ09ERUNTKSAtIDEpCi0KLS8qIFNEX0NUTCBiaXRzICovCi0jZGVmaW5lIFNEX0NUTF9TVFJFQU1fUkVTRVQJMHgwMQkvKiBzdHJlYW0gcmVzZXQgYml0ICovCi0jZGVmaW5lIFNEX0NUTF9ETUFfU1RBUlQJMHgwMgkvKiBzdHJlYW0gRE1BIHN0YXJ0IGJpdCAqLwotI2RlZmluZSBTRF9DVExfU1RSSVBFCQkoMyA8PCAxNikJLyogc3RyaXBlIGNvbnRyb2wgKi8KLSNkZWZpbmUgU0RfQ1RMX1RSQUZGSUNfUFJJTwkoMSA8PCAxOCkJLyogdHJhZmZpYyBwcmlvcml0eSAqLwotI2RlZmluZSBTRF9DVExfRElSCQkoMSA8PCAxOSkJLyogYmktZGlyZWN0aW9uYWwgc3RyZWFtICovCi0jZGVmaW5lIFNEX0NUTF9TVFJFQU1fVEFHX01BU0sJKDB4ZiA8PCAyMCkKLSNkZWZpbmUgU0RfQ1RMX1NUUkVBTV9UQUdfU0hJRlQJMjAKLQotLyogU0RfQ1RMIGFuZCBTRF9TVFMgKi8KLSNkZWZpbmUgU0RfSU5UX0RFU0NfRVJSCQkweDEwCS8qIGRlc2NyaXB0b3IgZXJyb3IgaW50ZXJydXB0ICovCi0jZGVmaW5lIFNEX0lOVF9GSUZPX0VSUgkJMHgwOAkvKiBGSUZPIGVycm9yIGludGVycnVwdCAqLwotI2RlZmluZSBTRF9JTlRfQ09NUExFVEUJCTB4MDQJLyogY29tcGxldGlvbiBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgU0RfSU5UX01BU0sJCShTRF9JTlRfREVTQ19FUlJ8U0RfSU5UX0ZJRk9fRVJSfFwKLQkJCQkgU0RfSU5UX0NPTVBMRVRFKQotCi0vKiBTRF9TVFMgKi8KLSNkZWZpbmUgU0RfU1RTX0ZJRk9fUkVBRFkJMHgyMAkvKiBGSUZPIHJlYWR5ICovCi0KLS8qIElOVENUTCBhbmQgSU5UU1RTICovCi0jZGVmaW5lIElDSDZfSU5UX0FMTF9TVFJFQU0JMHhmZgkgICAvKiBhbGwgc3RyZWFtIGludGVycnVwdHMgKi8KLSNkZWZpbmUgSUNINl9JTlRfQ1RSTF9FTgkweDQwMDAwMDAwIC8qIGNvbnRyb2xsZXIgaW50ZXJydXB0IGVuYWJsZSBiaXQgKi8KLSNkZWZpbmUgSUNINl9JTlRfR0xPQkFMX0VOCTB4ODAwMDAwMDAgLyogZ2xvYmFsIGludGVycnVwdCBlbmFibGUgYml0ICovCi0KLS8qIGJlbG93IGFyZSBzbyBmYXIgaGFyZGNvZGVkIC0gc2hvdWxkIHJlYWQgcmVnaXN0ZXJzIGluIGZ1dHVyZSAqLwotI2RlZmluZSBJQ0g2X01BWF9DT1JCX0VOVFJJRVMJMjU2Ci0jZGVmaW5lIElDSDZfTUFYX1JJUkJfRU5UUklFUwkyNTYKLQotLyogcG9zaXRpb24gZml4IG1vZGUgKi8KLWVudW0gewotCVBPU19GSVhfQVVUTywKLQlQT1NfRklYX0xQSUIsCi0JUE9TX0ZJWF9QT1NCVUYsCi0JUE9TX0ZJWF9WSUFDT01CTywKLQlQT1NfRklYX0NPTUJPLAotfTsKLQotLyogRGVmaW5lcyBmb3IgQVRJIEhEIEF1ZGlvIHN1cHBvcnQgaW4gU0I0NTAgc291dGggYnJpZGdlICovCi0jZGVmaW5lIEFUSV9TQjQ1MF9IREFVRElPX01JU0NfQ05UUjJfQUREUiAgIDB4NDIKLSNkZWZpbmUgQVRJX1NCNDUwX0hEQVVESU9fRU5BQkxFX1NOT09QICAgICAgMHgwMgotCi0vKiBEZWZpbmVzIGZvciBOdmlkaWEgSERBIHN1cHBvcnQgKi8KLSNkZWZpbmUgTlZJRElBX0hEQV9UUkFOU1JFR19BRERSICAgICAgMHg0ZQotI2RlZmluZSBOVklESUFfSERBX0VOQUJMRV9DT0hCSVRTICAgICAweDBmCi0jZGVmaW5lIE5WSURJQV9IREFfSVNUUk1fQ09IICAgICAgICAgIDB4NGQKLSNkZWZpbmUgTlZJRElBX0hEQV9PU1RSTV9DT0ggICAgICAgICAgMHg0YwotI2RlZmluZSBOVklESUFfSERBX0VOQUJMRV9DT0hCSVQgICAgICAweDAxCi0KLS8qIERlZmluZXMgZm9yIEludGVsIFNDSCBIREEgc25vb3AgY29udHJvbCAqLwotI2RlZmluZSBJTlRFTF9TQ0hfSERBX0RFVkMgICAgICAweDc4Ci0jZGVmaW5lIElOVEVMX1NDSF9IREFfREVWQ19OT1NOT09QICAgICAgICgweDE8PDExKQotCi0vKiBEZWZpbmUgSU4gc3RyZWFtIDAgRklGTyBzaXplIG9mZnNldCBpbiBWSUEgY29udHJvbGxlciAqLwotI2RlZmluZSBWSUFfSU5fU1RSRUFNMF9GSUZPX1NJWkVfT0ZGU0VUCTB4OTAKLS8qIERlZmluZSBWSUEgSEQgQXVkaW8gRGV2aWNlIElEKi8KLSNkZWZpbmUgVklBX0hEQUNfREVWSUNFX0lECQkweDMyODgKLQotLyogSEQgQXVkaW8gY2xhc3MgY29kZSAqLwotI2RlZmluZSBQQ0lfQ0xBU1NfTVVMVElNRURJQV9IRF9BVURJTwkweDA0MDMKLQotLyoKLSAqLwotCi1zdHJ1Y3QgYXp4X2RldiB7Ci0Jc3RydWN0IHNuZF9kbWFfYnVmZmVyIGJkbDsgLyogQkRMIGJ1ZmZlciAqLwotCXUzMiAqcG9zYnVmOwkJLyogcG9zaXRpb24gYnVmZmVyIHBvaW50ZXIgKi8KLQotCXVuc2lnbmVkIGludCBidWZzaXplOwkvKiBzaXplIG9mIHRoZSBwbGF5IGJ1ZmZlciBpbiBieXRlcyAqLwotCXVuc2lnbmVkIGludCBwZXJpb2RfYnl0ZXM7IC8qIHNpemUgb2YgdGhlIHBlcmlvZCBpbiBieXRlcyAqLwotCXVuc2lnbmVkIGludCBmcmFnczsJLyogbnVtYmVyIGZvciBwZXJpb2QgaW4gdGhlIHBsYXkgYnVmZmVyICovCi0JdW5zaWduZWQgaW50IGZpZm9fc2l6ZTsJLyogRklGTyBzaXplICovCi0JdW5zaWduZWQgbG9uZyBzdGFydF93YWxsY2xrOwkvKiBzdGFydCArIG1pbmltdW0gd2FsbGNsayAqLwotCXVuc2lnbmVkIGxvbmcgcGVyaW9kX3dhbGxjbGs7CS8qIHdhbGxjbGsgZm9yIHBlcmlvZCAqLwotCi0Jdm9pZCBfX2lvbWVtICpzZF9hZGRyOwkvKiBzdHJlYW0gZGVzY3JpcHRvciBwb2ludGVyICovCi0KLQl1MzIgc2RfaW50X3N0YV9tYXNrOwkvKiBzdHJlYW0gaW50IHN0YXR1cyBtYXNrICovCi0KLQkvKiBwY20gc3VwcG9ydCAqLwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOwkvKiBhc3NpZ25lZCBzdWJzdHJlYW0sCi0JCQkJCQkgKiBzZXQgaW4gUENNIG9wZW4KLQkJCQkJCSAqLwotCXVuc2lnbmVkIGludCBmb3JtYXRfdmFsOwkvKiBmb3JtYXQgdmFsdWUgdG8gYmUgc2V0IGluIHRoZQotCQkJCQkgKiBjb250cm9sbGVyIGFuZCB0aGUgY29kZWMKLQkJCQkJICovCi0JdW5zaWduZWQgY2hhciBzdHJlYW1fdGFnOwkvKiBhc3NpZ25lZCBzdHJlYW0gKi8KLQl1bnNpZ25lZCBjaGFyIGluZGV4OwkJLyogc3RyZWFtIGluZGV4ICovCi0JaW50IGFzc2lnbmVkX2tleTsJCS8qIGxhc3QgZGV2aWNlIyBrZXkgYXNzaWduZWQgdG8gKi8KLQotCXVuc2lnbmVkIGludCBvcGVuZWQgOjE7Ci0JdW5zaWduZWQgaW50IHJ1bm5pbmcgOjE7Ci0JdW5zaWduZWQgaW50IGlycV9wZW5kaW5nIDoxOwotCXVuc2lnbmVkIGludCBwcmVwYXJlZDoxOwotCXVuc2lnbmVkIGludCBsb2NrZWQ6MTsKLQkvKgotCSAqIEZvciBWSUE6Ci0JICogIEEgZmxhZyB0byBlbnN1cmUgRE1BIHBvc2l0aW9uIGlzIDAKLQkgKiAgd2hlbiBsaW5rIHBvc2l0aW9uIGlzIG5vdCBncmVhdGVyIHRoYW4gRklGTyBzaXplCi0JICovCi0JdW5zaWduZWQgaW50IGluc3VmZmljaWVudCA6MTsKLQl1bnNpZ25lZCBpbnQgd2NfbWFya2VkOjE7Ci0JdW5zaWduZWQgaW50IG5vX3BlcmlvZF93YWtldXA6MTsKLQotCXN0cnVjdCB0aW1lY291bnRlciAgYXp4X3RjOwotCXN0cnVjdCBjeWNsZWNvdW50ZXIgYXp4X2NjOwotCi0JaW50IGRlbGF5X25lZ2F0aXZlX3RocmVzaG9sZDsKLQotI2lmZGVmIENPTkZJR19TTkRfSERBX0RTUF9MT0FERVIKLQlzdHJ1Y3QgbXV0ZXggZHNwX211dGV4OwotI2VuZGlmCi19OwotCi0vKiBEU1AgbG9jayBoZWxwZXJzICovCi0jaWZkZWYgQ09ORklHX1NORF9IREFfRFNQX0xPQURFUgotI2RlZmluZSBkc3BfbG9ja19pbml0KGRldikJbXV0ZXhfaW5pdCgmKGRldiktPmRzcF9tdXRleCkKLSNkZWZpbmUgZHNwX2xvY2soZGV2KQkJbXV0ZXhfbG9jaygmKGRldiktPmRzcF9tdXRleCkKLSNkZWZpbmUgZHNwX3VubG9jayhkZXYpCQltdXRleF91bmxvY2soJihkZXYpLT5kc3BfbXV0ZXgpCi0jZGVmaW5lIGRzcF9pc19sb2NrZWQoZGV2KQkoKGRldiktPmxvY2tlZCkKLSNlbHNlCi0jZGVmaW5lIGRzcF9sb2NrX2luaXQoZGV2KQlkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgZHNwX2xvY2soZGV2KQkJZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIGRzcF91bmxvY2soZGV2KQkJZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIGRzcF9pc19sb2NrZWQoZGV2KQkwCi0jZW5kaWYKLQotLyogQ09SQi9SSVJCICovCi1zdHJ1Y3QgYXp4X3JiIHsKLQl1MzIgKmJ1ZjsJCS8qIENPUkIvUklSQiBidWZmZXIKLQkJCQkgKiBFYWNoIENPUkIgZW50cnkgaXMgNGJ5dGUsIFJJUkIgaXMgOGJ5dGUKLQkJCQkgKi8KLQlkbWFfYWRkcl90IGFkZHI7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgQ09SQi9SSVJCIGJ1ZmZlciAqLwotCS8qIGZvciBSSVJCICovCi0JdW5zaWduZWQgc2hvcnQgcnAsIHdwOwkvKiByZWFkL3dyaXRlIHBvaW50ZXJzICovCi0JaW50IGNtZHNbQVpYX01BWF9DT0RFQ1NdOwkvKiBudW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0cyAqLwotCXUzMiByZXNbQVpYX01BWF9DT0RFQ1NdOwkvKiBsYXN0IHJlYWQgdmFsdWUgKi8KLX07Ci0KLXN0cnVjdCBhenhfcGNtIHsKLQlzdHJ1Y3QgYXp4ICpjaGlwOwotCXN0cnVjdCBzbmRfcGNtICpwY207Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7Ci0Jc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mb1syXTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi1zdHJ1Y3QgYXp4IHsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaTsKLQlpbnQgZGV2X2luZGV4OwotCi0JLyogY2hpcCB0eXBlIHNwZWNpZmljICovCi0JaW50IGRyaXZlcl90eXBlOwotCXVuc2lnbmVkIGludCBkcml2ZXJfY2FwczsKLQlpbnQgcGxheWJhY2tfc3RyZWFtczsKLQlpbnQgcGxheWJhY2tfaW5kZXhfb2Zmc2V0OwotCWludCBjYXB0dXJlX3N0cmVhbXM7Ci0JaW50IGNhcHR1cmVfaW5kZXhfb2Zmc2V0OwotCWludCBudW1fc3RyZWFtczsKLQotCS8qIHBjaSByZXNvdXJjZXMgKi8KLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0Jdm9pZCBfX2lvbWVtICpyZW1hcF9hZGRyOwotCWludCBpcnE7Ci0KLQkvKiBsb2NrcyAqLwotCXNwaW5sb2NrX3QgcmVnX2xvY2s7Ci0Jc3RydWN0IG11dGV4IG9wZW5fbXV0ZXg7Ci0Jc3RydWN0IGNvbXBsZXRpb24gcHJvYmVfd2FpdDsKLQotCS8qIHN0cmVhbXMgKHggbnVtX3N0cmVhbXMpICovCi0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXY7Ci0KLQkvKiBQQ00gKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHBjbV9saXN0OyAvKiBhenhfcGNtIGxpc3QgKi8KLQotCS8qIEhEIGNvZGVjICovCi0JdW5zaWduZWQgc2hvcnQgY29kZWNfbWFzazsKLQlpbnQgIGNvZGVjX3Byb2JlX21hc2s7IC8qIGNvcGllZCBmcm9tIHByb2JlX21hc2sgb3B0aW9uICovCi0Jc3RydWN0IGhkYV9idXMgKmJ1czsKLQl1bnNpZ25lZCBpbnQgYmVlcF9tb2RlOwotCi0JLyogQ09SQi9SSVJCICovCi0Jc3RydWN0IGF6eF9yYiBjb3JiOwotCXN0cnVjdCBhenhfcmIgcmlyYjsKLQotCS8qIENPUkIvUklSQiBhbmQgcG9zaXRpb24gYnVmZmVycyAqLwotCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciByYjsKLQlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgcG9zYnVmOwotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfUEFUQ0hfTE9BREVSCi0JY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKLSNlbmRpZgotCi0JLyogZmxhZ3MgKi8KLQlpbnQgcG9zaXRpb25fZml4WzJdOyAvKiBmb3IgYm90aCBwbGF5YmFjay9jYXB0dXJlIHN0cmVhbXMgKi8KLQlpbnQgcG9sbF9jb3VudDsKLQl1bnNpZ25lZCBpbnQgcnVubmluZyA6MTsKLQl1bnNpZ25lZCBpbnQgaW5pdGlhbGl6ZWQgOjE7Ci0JdW5zaWduZWQgaW50IHNpbmdsZV9jbWQgOjE7Ci0JdW5zaWduZWQgaW50IHBvbGxpbmdfbW9kZSA6MTsKLQl1bnNpZ25lZCBpbnQgbXNpIDoxOwotCXVuc2lnbmVkIGludCBpcnFfcGVuZGluZ193YXJuZWQgOjE7Ci0JdW5zaWduZWQgaW50IHByb2JpbmcgOjE7IC8qIGNvZGVjIHByb2JpbmcgcGhhc2UgKi8KLQl1bnNpZ25lZCBpbnQgc25vb3A6MTsKLQl1bnNpZ25lZCBpbnQgYWxpZ25fYnVmZmVyX3NpemU6MTsKLQl1bnNpZ25lZCBpbnQgcmVnaW9uX3JlcXVlc3RlZDoxOwotCi0JLyogVkdBLXN3aXRjaGVyb28gc2V0dXAgKi8KLQl1bnNpZ25lZCBpbnQgdXNlX3ZnYV9zd2l0Y2hlcm9vOjE7Ci0JdW5zaWduZWQgaW50IHZnYV9zd2l0Y2hlcm9vX3JlZ2lzdGVyZWQ6MTsKLQl1bnNpZ25lZCBpbnQgaW5pdF9mYWlsZWQ6MTsgLyogZGVsYXllZCBpbml0IGZhaWxlZCAqLwotCXVuc2lnbmVkIGludCBkaXNhYmxlZDoxOyAvKiBkaXNhYmxlZCBieSBWR0Etc3dpdGNoZXIgKi8KLQotCS8qIGZvciBkZWJ1Z2dpbmcgKi8KLQl1bnNpZ25lZCBpbnQgbGFzdF9jbWRbQVpYX01BWF9DT0RFQ1NdOwotCi0JLyogZm9yIHBlbmRpbmcgaXJxcyAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdCBpcnFfcGVuZGluZ193b3JrOwotCi0Jc3RydWN0IHdvcmtfc3RydWN0IHByb2JlX3dvcms7Ci0KLQkvKiByZWJvb3Qgbm90aWZpZXIgKGZvciBteXN0ZXJpb3VzIGhhbmd1cCBwcm9ibGVtIGF0IHBvd2VyLWRvd24pICovCi0Jc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHJlYm9vdF9ub3RpZmllcjsKLQotCS8qIGNhcmQgbGlzdCAoZm9yIHBvd2VyX3NhdmUgdHJpZ2dlcikgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9EU1BfTE9BREVSCi0Jc3RydWN0IGF6eF9kZXYgc2F2ZWRfYXp4X2RldjsKLSNlbmRpZgotCi0JLyogc2Vjb25kYXJ5IHBvd2VyIGRvbWFpbiBmb3IgaGRtaSBhdWRpbyB1bmRlciB2Z2EgZGV2aWNlICovCi0Jc3RydWN0IGRldl9wbV9kb21haW4gaGRtaV9wbV9kb21haW47Ci19OwotCi0jZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKLSNpbmNsdWRlICJoZGFfaW50ZWxfdHJhY2UuaCIKIAogLyogZHJpdmVyIHR5cGVzICovCiBlbnVtIHsKQEAgLTU4NCwyOCArMjI0LDYgQEAKIAlBWlhfTlVNX0RSSVZFUlMsIC8qIGtlZXAgdGhpcyBhcyBsYXN0IGVudHJ5ICovCiB9OwogCi0vKiBkcml2ZXIgcXVpcmtzIChjYXBhYmlsaXRpZXMpICovCi0vKiBiaXRzIDAtNyBhcmUgdXNlZCBmb3IgaW5kaWNhdGluZyBkcml2ZXIgdHlwZSAqLwotI2RlZmluZSBBWlhfRENBUFNfTk9fVENTRUwJKDEgPDwgOCkJLyogTm8gSW50ZWwgVENTRUwgYml0ICovCi0jZGVmaW5lIEFaWF9EQ0FQU19OT19NU0kJKDEgPDwgOSkJLyogTm8gTVNJIHN1cHBvcnQgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX0FUSV9TTk9PUAkoMSA8PCAxMCkJLyogQVRJIHNub29wIGVuYWJsZSAqLwotI2RlZmluZSBBWlhfRENBUFNfTlZJRElBX1NOT09QCSgxIDw8IDExKQkvKiBOdmlkaWEgc25vb3AgZW5hYmxlICovCi0jZGVmaW5lIEFaWF9EQ0FQU19TQ0hfU05PT1AJKDEgPDwgMTIpCS8qIFNDSC9QQ0ggc25vb3AgZW5hYmxlICovCi0jZGVmaW5lIEFaWF9EQ0FQU19SSVJCX0RFTEFZCSgxIDw8IDEzKQkvKiBMb25nIGRlbGF5IGluIHJlYWQgbG9vcCAqLwotI2RlZmluZSBBWlhfRENBUFNfUklSQl9QUkVfREVMQVkgKDEgPDwgMTQpCS8qIFB1dCBhIGRlbGF5IGJlZm9yZSByZWFkICovCi0jZGVmaW5lIEFaWF9EQ0FQU19DVFhfV09SS0FST1VORCAoMSA8PCAxNSkJLyogWC1GaSB3b3JrYXJvdW5kICovCi0jZGVmaW5lIEFaWF9EQ0FQU19QT1NGSVhfTFBJQgkoMSA8PCAxNikJLyogVXNlIExQSUIgYXMgZGVmYXVsdCAqLwotI2RlZmluZSBBWlhfRENBUFNfUE9TRklYX1ZJQQkoMSA8PCAxNykJLyogVXNlIFZJQUNPTUJPIGFzIGRlZmF1bHQgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX05PXzY0QklUCSgxIDw8IDE4KQkvKiBObyA2NGJpdCBhZGRyZXNzICovCi0jZGVmaW5lIEFaWF9EQ0FQU19TWU5DX1dSSVRFCSgxIDw8IDE5KQkvKiBzeW5jIGVhY2ggY21kIHdyaXRlICovCi0jZGVmaW5lIEFaWF9EQ0FQU19PTERfU1NZTkMJKDEgPDwgMjApCS8qIE9sZCBTU1lOQyByZWcgZm9yIElDSCAqLwotI2RlZmluZSBBWlhfRENBUFNfQlVGU0laRQkoMSA8PCAyMSkJLyogbm8gYnVmZmVyIHNpemUgYWxpZ25tZW50ICovCi0jZGVmaW5lIEFaWF9EQ0FQU19BTElHTl9CVUZTSVpFCSgxIDw8IDIyKQkvKiBidWZmZXIgc2l6ZSBhbGlnbm1lbnQgKi8KLSNkZWZpbmUgQVpYX0RDQVBTXzRLX0JETEVfQk9VTkRBUlkgKDEgPDwgMjMpCS8qIEJETEUgaW4gNGsgYm91bmRhcnkgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX0NPVU5UX0xQSUJfREVMQVkgICgxIDw8IDI1KQkvKiBUYWtlIExQSUIgYXMgZGVsYXkgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX1BNX1JVTlRJTUUJKDEgPDwgMjYpCS8qIHJ1bnRpbWUgUE0gc3VwcG9ydCAqLwotI2RlZmluZSBBWlhfRENBUFNfSTkxNV9QT1dFUldFTEwgKDEgPDwgMjcpCS8qIEhTVyBpOTE1IHBvd2VyIHdlbGwgc3VwcG9ydCAqLwotCiAvKiBxdWlya3MgZm9yIEludGVsIFBDSCAqLwogI2RlZmluZSBBWlhfRENBUFNfSU5URUxfUENIX05PUE0gXAogCShBWlhfRENBUFNfU0NIX1NOT09QIHwgQVpYX0RDQVBTX0JVRlNJWkUgfCBcCkBAIC02NjMsMzggKzI4MSw2IEBACiAJW0FaWF9EUklWRVJfR0VORVJJQ10gPSAiSEQtQXVkaW8gR2VuZXJpYyIsCiB9OwogCi0vKgotICogbWFjcm9zIGZvciBlYXN5IHVzZQotICovCi0jZGVmaW5lIGF6eF93cml0ZWwoY2hpcCxyZWcsdmFsdWUpIFwKLQl3cml0ZWwodmFsdWUsIChjaGlwKS0+cmVtYXBfYWRkciArIElDSDZfUkVHXyMjcmVnKQotI2RlZmluZSBhenhfcmVhZGwoY2hpcCxyZWcpIFwKLQlyZWFkbCgoY2hpcCktPnJlbWFwX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykKLSNkZWZpbmUgYXp4X3dyaXRldyhjaGlwLHJlZyx2YWx1ZSkgXAotCXdyaXRldyh2YWx1ZSwgKGNoaXApLT5yZW1hcF9hZGRyICsgSUNINl9SRUdfIyNyZWcpCi0jZGVmaW5lIGF6eF9yZWFkdyhjaGlwLHJlZykgXAotCXJlYWR3KChjaGlwKS0+cmVtYXBfYWRkciArIElDSDZfUkVHXyMjcmVnKQotI2RlZmluZSBhenhfd3JpdGViKGNoaXAscmVnLHZhbHVlKSBcCi0Jd3JpdGViKHZhbHVlLCAoY2hpcCktPnJlbWFwX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykKLSNkZWZpbmUgYXp4X3JlYWRiKGNoaXAscmVnKSBcCi0JcmVhZGIoKGNoaXApLT5yZW1hcF9hZGRyICsgSUNINl9SRUdfIyNyZWcpCi0KLSNkZWZpbmUgYXp4X3NkX3dyaXRlbChkZXYscmVnLHZhbHVlKSBcCi0Jd3JpdGVsKHZhbHVlLCAoZGV2KS0+c2RfYWRkciArIElDSDZfUkVHXyMjcmVnKQotI2RlZmluZSBhenhfc2RfcmVhZGwoZGV2LHJlZykgXAotCXJlYWRsKChkZXYpLT5zZF9hZGRyICsgSUNINl9SRUdfIyNyZWcpCi0jZGVmaW5lIGF6eF9zZF93cml0ZXcoZGV2LHJlZyx2YWx1ZSkgXAotCXdyaXRldyh2YWx1ZSwgKGRldiktPnNkX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykKLSNkZWZpbmUgYXp4X3NkX3JlYWR3KGRldixyZWcpIFwKLQlyZWFkdygoZGV2KS0+c2RfYWRkciArIElDSDZfUkVHXyMjcmVnKQotI2RlZmluZSBhenhfc2Rfd3JpdGViKGRldixyZWcsdmFsdWUpIFwKLQl3cml0ZWIodmFsdWUsIChkZXYpLT5zZF9hZGRyICsgSUNINl9SRUdfIyNyZWcpCi0jZGVmaW5lIGF6eF9zZF9yZWFkYihkZXYscmVnKSBcCi0JcmVhZGIoKGRldiktPnNkX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykKLQotLyogZm9yIHBjbSBzdXBwb3J0ICovCi0jZGVmaW5lIGdldF9henhfZGV2KHN1YnN0cmVhbSkgKHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhKQotCiAjaWZkZWYgQ09ORklHX1g4Ngogc3RhdGljIHZvaWQgX19tYXJrX3BhZ2VzX3djKHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hYiwgYm9vbCBvbikKIHsKQEAgLTc0OSw1NzggKzMzNSw2IEBACiAjZW5kaWYKIAogc3RhdGljIGludCBhenhfYWNxdWlyZV9pcnEoc3RydWN0IGF6eCAqY2hpcCwgaW50IGRvX2Rpc2Nvbm5lY3QpOwotc3RhdGljIGludCBhenhfc2VuZF9jbWQoc3RydWN0IGhkYV9idXMgKmJ1cywgdW5zaWduZWQgaW50IHZhbCk7Ci0vKgotICogSW50ZXJmYWNlIGZvciBIRCBjb2RlYwotICovCi0KLS8qCi0gKiBDT1JCIC8gUklSQiBpbnRlcmZhY2UKLSAqLwotc3RhdGljIGludCBhenhfYWxsb2NfY21kX2lvKHN0cnVjdCBhenggKmNoaXApCi17Ci0JaW50IGVycjsKLQotCS8qIHNpbmdsZSBwYWdlIChhdCBsZWFzdCA0MDk2IGJ5dGVzKSBtdXN0IHN1ZmZpY2UgZm9yIGJvdGggcmluZ2J1ZmZlcyAqLwotCWVyciA9IHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLAotCQkJCSAgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAotCQkJCSAgUEFHRV9TSVpFLCAmY2hpcC0+cmIpOwotCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYICIlczogY2Fubm90IGFsbG9jYXRlIENPUkIvUklSQlxuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCW1hcmtfcGFnZXNfd2MoY2hpcCwgJmNoaXAtPnJiLCB0cnVlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYXp4X2luaXRfY21kX2lvKHN0cnVjdCBhenggKmNoaXApCi17Ci0Jc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCS8qIENPUkIgc2V0IHVwICovCi0JY2hpcC0+Y29yYi5hZGRyID0gY2hpcC0+cmIuYWRkcjsKLQljaGlwLT5jb3JiLmJ1ZiA9ICh1MzIgKiljaGlwLT5yYi5hcmVhOwotCWF6eF93cml0ZWwoY2hpcCwgQ09SQkxCQVNFLCAodTMyKWNoaXAtPmNvcmIuYWRkcik7Ci0JYXp4X3dyaXRlbChjaGlwLCBDT1JCVUJBU0UsIHVwcGVyXzMyX2JpdHMoY2hpcC0+Y29yYi5hZGRyKSk7Ci0KLQkvKiBzZXQgdGhlIGNvcmIgc2l6ZSB0byAyNTYgZW50cmllcyAoVUxJIHJlcXVpcmVzIGV4cGxpY2l0bHkpICovCi0JYXp4X3dyaXRlYihjaGlwLCBDT1JCU0laRSwgMHgwMik7Ci0JLyogc2V0IHRoZSBjb3JiIHdyaXRlIHBvaW50ZXIgdG8gMCAqLwotCWF6eF93cml0ZXcoY2hpcCwgQ09SQldQLCAwKTsKLQkvKiByZXNldCB0aGUgY29yYiBodyByZWFkIHBvaW50ZXIgKi8KLQlhenhfd3JpdGV3KGNoaXAsIENPUkJSUCwgSUNINl9DT1JCUlBfUlNUKTsKLQkvKiBlbmFibGUgY29yYiBkbWEgKi8KLQlhenhfd3JpdGViKGNoaXAsIENPUkJDVEwsIElDSDZfQ09SQkNUTF9SVU4pOwotCi0JLyogUklSQiBzZXQgdXAgKi8KLQljaGlwLT5yaXJiLmFkZHIgPSBjaGlwLT5yYi5hZGRyICsgMjA0ODsKLQljaGlwLT5yaXJiLmJ1ZiA9ICh1MzIgKikoY2hpcC0+cmIuYXJlYSArIDIwNDgpOwotCWNoaXAtPnJpcmIud3AgPSBjaGlwLT5yaXJiLnJwID0gMDsKLQltZW1zZXQoY2hpcC0+cmlyYi5jbWRzLCAwLCBzaXplb2YoY2hpcC0+cmlyYi5jbWRzKSk7Ci0JYXp4X3dyaXRlbChjaGlwLCBSSVJCTEJBU0UsICh1MzIpY2hpcC0+cmlyYi5hZGRyKTsKLQlhenhfd3JpdGVsKGNoaXAsIFJJUkJVQkFTRSwgdXBwZXJfMzJfYml0cyhjaGlwLT5yaXJiLmFkZHIpKTsKLQotCS8qIHNldCB0aGUgcmlyYiBzaXplIHRvIDI1NiBlbnRyaWVzIChVTEkgcmVxdWlyZXMgZXhwbGljaXRseSkgKi8KLQlhenhfd3JpdGViKGNoaXAsIFJJUkJTSVpFLCAweDAyKTsKLQkvKiByZXNldCB0aGUgcmlyYiBodyB3cml0ZSBwb2ludGVyICovCi0JYXp4X3dyaXRldyhjaGlwLCBSSVJCV1AsIElDSDZfUklSQldQX1JTVCk7Ci0JLyogc2V0IE49MSwgZ2V0IFJJUkIgcmVzcG9uc2UgaW50ZXJydXB0IGZvciBuZXcgZW50cnkgKi8KLQlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfQ1RYX1dPUktBUk9VTkQpCi0JCWF6eF93cml0ZXcoY2hpcCwgUklOVENOVCwgMHhjMCk7Ci0JZWxzZQotCQlhenhfd3JpdGV3KGNoaXAsIFJJTlRDTlQsIDEpOwotCS8qIGVuYWJsZSByaXJiIGRtYSBhbmQgcmVzcG9uc2UgaXJxICovCi0JYXp4X3dyaXRlYihjaGlwLCBSSVJCQ1RMLCBJQ0g2X1JCQ1RMX0RNQV9FTiB8IElDSDZfUkJDVExfSVJRX0VOKTsKLQlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgYXp4X2ZyZWVfY21kX2lvKHN0cnVjdCBhenggKmNoaXApCi17Ci0Jc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCS8qIGRpc2FibGUgcmluZ2J1ZmZlciBETUFzICovCi0JYXp4X3dyaXRlYihjaGlwLCBSSVJCQ1RMLCAwKTsKLQlhenhfd3JpdGViKGNoaXAsIENPUkJDVEwsIDApOwotCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGF6eF9jb21tYW5kX2FkZHIodTMyIGNtZCkKLXsKLQl1bnNpZ25lZCBpbnQgYWRkciA9IGNtZCA+PiAyODsKLQotCWlmIChhZGRyID49IEFaWF9NQVhfQ09ERUNTKSB7Ci0JCXNuZF9CVUcoKTsKLQkJYWRkciA9IDA7Ci0JfQotCi0JcmV0dXJuIGFkZHI7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X3Jlc3BvbnNlX2FkZHIodTMyIHJlcykKLXsKLQl1bnNpZ25lZCBpbnQgYWRkciA9IHJlcyAmIDB4ZjsKLQotCWlmIChhZGRyID49IEFaWF9NQVhfQ09ERUNTKSB7Ci0JCXNuZF9CVUcoKTsKLQkJYWRkciA9IDA7Ci0JfQotCi0JcmV0dXJuIGFkZHI7Ci19Ci0KLS8qIHNlbmQgYSBjb21tYW5kICovCi1zdGF0aWMgaW50IGF6eF9jb3JiX3NlbmRfY21kKHN0cnVjdCBoZGFfYnVzICpidXMsIHUzMiB2YWwpCi17Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGludCBhZGRyID0gYXp4X2NvbW1hbmRfYWRkcih2YWwpOwotCXVuc2lnbmVkIGludCB3cCwgcnA7Ci0KLQlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Ci0KLQkvKiBhZGQgY29tbWFuZCB0byBjb3JiICovCi0Jd3AgPSBhenhfcmVhZHcoY2hpcCwgQ09SQldQKTsKLQlpZiAod3AgPT0gMHhmZmZmKSB7Ci0JCS8qIHNvbWV0aGluZyB3cm9uZywgY29udHJvbGxlciBsaWtlbHkgdHVybmVkIHRvIEQzICovCi0JCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0Jd3ArKzsKLQl3cCAlPSBJQ0g2X01BWF9DT1JCX0VOVFJJRVM7Ci0KLQlycCA9IGF6eF9yZWFkdyhjaGlwLCBDT1JCUlApOwotCWlmICh3cCA9PSBycCkgewotCQkvKiBvb3BzLCBpdCdzIGZ1bGwgKi8KLQkJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQotCWNoaXAtPnJpcmIuY21kc1thZGRyXSsrOwotCWNoaXAtPmNvcmIuYnVmW3dwXSA9IGNwdV90b19sZTMyKHZhbCk7Ci0JYXp4X3dyaXRlbChjaGlwLCBDT1JCV1AsIHdwKTsKLQotCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgSUNINl9SSVJCX0VYX1VOU09MX0VWCSgxPDw0KQotCi0vKiByZXRyaWV2ZSBSSVJCIGVudHJ5IC0gY2FsbGVkIGZyb20gaW50ZXJydXB0IGhhbmRsZXIgKi8KLXN0YXRpYyB2b2lkIGF6eF91cGRhdGVfcmlyYihzdHJ1Y3QgYXp4ICpjaGlwKQotewotCXVuc2lnbmVkIGludCBycCwgd3A7Ci0JdW5zaWduZWQgaW50IGFkZHI7Ci0JdTMyIHJlcywgcmVzX2V4OwotCi0Jd3AgPSBhenhfcmVhZHcoY2hpcCwgUklSQldQKTsKLQlpZiAod3AgPT0gMHhmZmZmKSB7Ci0JCS8qIHNvbWV0aGluZyB3cm9uZywgY29udHJvbGxlciBsaWtlbHkgdHVybmVkIHRvIEQzICovCi0JCXJldHVybjsKLQl9Ci0KLQlpZiAod3AgPT0gY2hpcC0+cmlyYi53cCkKLQkJcmV0dXJuOwotCWNoaXAtPnJpcmIud3AgPSB3cDsKLQotCXdoaWxlIChjaGlwLT5yaXJiLnJwICE9IHdwKSB7Ci0JCWNoaXAtPnJpcmIucnArKzsKLQkJY2hpcC0+cmlyYi5ycCAlPSBJQ0g2X01BWF9SSVJCX0VOVFJJRVM7Ci0KLQkJcnAgPSBjaGlwLT5yaXJiLnJwIDw8IDE7IC8qIGFuIFJJUkIgZW50cnkgaXMgOC1ieXRlcyAqLwotCQlyZXNfZXggPSBsZTMyX3RvX2NwdShjaGlwLT5yaXJiLmJ1ZltycCArIDFdKTsKLQkJcmVzID0gbGUzMl90b19jcHUoY2hpcC0+cmlyYi5idWZbcnBdKTsKLQkJYWRkciA9IGF6eF9yZXNwb25zZV9hZGRyKHJlc19leCk7Ci0JCWlmIChyZXNfZXggJiBJQ0g2X1JJUkJfRVhfVU5TT0xfRVYpCi0JCQlzbmRfaGRhX3F1ZXVlX3Vuc29sX2V2ZW50KGNoaXAtPmJ1cywgcmVzLCByZXNfZXgpOwotCQllbHNlIGlmIChjaGlwLT5yaXJiLmNtZHNbYWRkcl0pIHsKLQkJCWNoaXAtPnJpcmIucmVzW2FkZHJdID0gcmVzOwotCQkJc21wX3dtYigpOwotCQkJY2hpcC0+cmlyYi5jbWRzW2FkZHJdLS07Ci0JCX0gZWxzZSBpZiAocHJpbnRrX3JhdGVsaW1pdCgpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IHNwdXJpb3VzIHJlc3BvbnNlICUjeDolI3gsIGxhc3QgY21kPSUjMDh4XG4iLAotCQkJCSAgIHBjaV9uYW1lKGNoaXAtPnBjaSksCi0JCQkJICAgcmVzLCByZXNfZXgsCi0JCQkJICAgY2hpcC0+bGFzdF9jbWRbYWRkcl0pOwotCQl9Ci0JfQotfQotCi0vKiByZWNlaXZlIGEgcmVzcG9uc2UgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X3JpcmJfZ2V0X3Jlc3BvbnNlKHN0cnVjdCBoZGFfYnVzICpidXMsCi0JCQkJCSAgdW5zaWduZWQgaW50IGFkZHIpCi17Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQl1bnNpZ25lZCBsb25nIGxvb3Bjb3VudGVyOwotCWludCBkb19wb2xsID0gMDsKLQotIGFnYWluOgotCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwKTsKLQotCWZvciAobG9vcGNvdW50ZXIgPSAwOzsgbG9vcGNvdW50ZXIrKykgewotCQlpZiAoY2hpcC0+cG9sbGluZ19tb2RlIHx8IGRvX3BvbGwpIHsKLQkJCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQkJCWF6eF91cGRhdGVfcmlyYihjaGlwKTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCQl9Ci0JCWlmICghY2hpcC0+cmlyYi5jbWRzW2FkZHJdKSB7Ci0JCQlzbXBfcm1iKCk7Ci0JCQlidXMtPnJpcmJfZXJyb3IgPSAwOwotCi0JCQlpZiAoIWRvX3BvbGwpCi0JCQkJY2hpcC0+cG9sbF9jb3VudCA9IDA7Ci0JCQlyZXR1cm4gY2hpcC0+cmlyYi5yZXNbYWRkcl07IC8qIHRoZSBsYXN0IHZhbHVlICovCi0JCX0KLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCi0JCQlicmVhazsKLQkJaWYgKGJ1cy0+bmVlZHNfZGFtbl9sb25nX2RlbGF5IHx8IGxvb3Bjb3VudGVyID4gMzAwMCkKLQkJCW1zbGVlcCgyKTsgLyogdGVtcG9yYXJ5IHdvcmthcm91bmQgKi8KLQkJZWxzZSB7Ci0JCQl1ZGVsYXkoMTApOwotCQkJY29uZF9yZXNjaGVkKCk7Ci0JCX0KLQl9Ci0KLQlpZiAoIWJ1cy0+bm9fcmVzcG9uc2VfZmFsbGJhY2spCi0JCXJldHVybiAtMTsKLQotCWlmICghY2hpcC0+cG9sbGluZ19tb2RlICYmIGNoaXAtPnBvbGxfY291bnQgPCAyKSB7Ci0JCXNuZF9wcmludGRkKFNGWCAiJXM6IGF6eF9nZXRfcmVzcG9uc2UgdGltZW91dCwgIgotCQkJICAgInBvbGxpbmcgdGhlIGNvZGVjIG9uY2U6IGxhc3QgY21kPTB4JTA4eFxuIiwKLQkJCSAgIHBjaV9uYW1lKGNoaXAtPnBjaSksIGNoaXAtPmxhc3RfY21kW2FkZHJdKTsKLQkJZG9fcG9sbCA9IDE7Ci0JCWNoaXAtPnBvbGxfY291bnQrKzsKLQkJZ290byBhZ2FpbjsKLQl9Ci0KLQotCWlmICghY2hpcC0+cG9sbGluZ19tb2RlKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIFNGWCAiJXM6IGF6eF9nZXRfcmVzcG9uc2UgdGltZW91dCwgIgotCQkJICAgInN3aXRjaGluZyB0byBwb2xsaW5nIG1vZGU6IGxhc3QgY21kPTB4JTA4eFxuIiwKLQkJCSAgIHBjaV9uYW1lKGNoaXAtPnBjaSksIGNoaXAtPmxhc3RfY21kW2FkZHJdKTsKLQkJY2hpcC0+cG9sbGluZ19tb2RlID0gMTsKLQkJZ290byBhZ2FpbjsKLQl9Ci0KLQlpZiAoY2hpcC0+bXNpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIFNGWCAiJXM6IE5vIHJlc3BvbnNlIGZyb20gY29kZWMsICIKLQkJCSAgICJkaXNhYmxpbmcgTVNJOiBsYXN0IGNtZD0weCUwOHhcbiIsCi0JCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpLCBjaGlwLT5sYXN0X2NtZFthZGRyXSk7Ci0JCWZyZWVfaXJxKGNoaXAtPmlycSwgY2hpcCk7Ci0JCWNoaXAtPmlycSA9IC0xOwotCQlwY2lfZGlzYWJsZV9tc2koY2hpcC0+cGNpKTsKLQkJY2hpcC0+bXNpID0gMDsKLQkJaWYgKGF6eF9hY3F1aXJlX2lycShjaGlwLCAxKSA8IDApIHsKLQkJCWJ1cy0+cmlyYl9lcnJvciA9IDE7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZ290byBhZ2FpbjsKLQl9Ci0KLQlpZiAoY2hpcC0+cHJvYmluZykgewotCQkvKiBJZiB0aGlzIGNyaXRpY2FsIHRpbWVvdXQgaGFwcGVucyBkdXJpbmcgdGhlIGNvZGVjIHByb2JpbmcKLQkJICogcGhhc2UsIHRoaXMgaXMgbGlrZWx5IGFuIGFjY2VzcyB0byBhIG5vbi1leGlzdGluZyBjb2RlYwotCQkgKiBzbG90LiAgQmV0dGVyIHRvIHJldHVybiBhbiBlcnJvciBhbmQgcmVzZXQgdGhlIHN5c3RlbS4KLQkJICovCi0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBhIGZhdGFsIGNvbW11bmljYXRpb24gZXJyb3I7IG5lZWQgZWl0aGVyIHRvIHJlc2V0IG9yIHRvIGZhbGxiYWNrCi0JICogdG8gdGhlIHNpbmdsZV9jbWQgbW9kZQotCSAqLwotCWJ1cy0+cmlyYl9lcnJvciA9IDE7Ci0JaWYgKGJ1cy0+YWxsb3dfYnVzX3Jlc2V0ICYmICFidXMtPnJlc3BvbnNlX3Jlc2V0ICYmICFidXMtPmluX3Jlc2V0KSB7Ci0JCWJ1cy0+cmVzcG9uc2VfcmVzZXQgPSAxOwotCQlyZXR1cm4gLTE7IC8qIGdpdmUgYSBjaGFuY2UgdG8gcmV0cnkgKi8KLQl9Ci0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGFfaW50ZWw6IGF6eF9nZXRfcmVzcG9uc2UgdGltZW91dCwgIgotCQkgICAic3dpdGNoaW5nIHRvIHNpbmdsZV9jbWQgbW9kZTogbGFzdCBjbWQ9MHglMDh4XG4iLAotCQkgICBjaGlwLT5sYXN0X2NtZFthZGRyXSk7Ci0JY2hpcC0+c2luZ2xlX2NtZCA9IDE7Ci0JYnVzLT5yZXNwb25zZV9yZXNldCA9IDA7Ci0JLyogcmVsZWFzZSBDT1JCL1JJUkIgKi8KLQlhenhfZnJlZV9jbWRfaW8oY2hpcCk7Ci0JLyogZGlzYWJsZSB1bnNvbGljaXRlZCByZXNwb25zZXMgKi8KLQlhenhfd3JpdGVsKGNoaXAsIEdDVEwsIGF6eF9yZWFkbChjaGlwLCBHQ1RMKSAmIH5JQ0g2X0dDVExfVU5TT0wpOwotCXJldHVybiAtMTsKLX0KLQotLyoKLSAqIFVzZSB0aGUgc2luZ2xlIGltbWVkaWF0ZSBjb21tYW5kIGluc3RlYWQgb2YgQ09SQi9SSVJCIGZvciBzaW1wbGljaXR5Ci0gKgotICogTm90ZTogYWNjb3JkaW5nIHRvIEludGVsLCB0aGlzIGlzIG5vdCBwcmVmZXJyZWQgdXNlLiAgVGhlIGNvbW1hbmQgd2FzCi0gKiAgICAgICBpbnRlbmRlZCBmb3IgdGhlIEJJT1Mgb25seSwgYW5kIG1heSBnZXQgY29uZnVzZWQgd2l0aCB1bnNvbGljaXRlZAotICogICAgICAgcmVzcG9uc2VzLiAgU28sIHdlIHNob3VsZG4ndCB1c2UgaXQgZm9yIG5vcm1hbCBvcGVyYXRpb24gZnJvbSB0aGUKLSAqICAgICAgIGRyaXZlci4KLSAqICAgICAgIEkgbGVmdCB0aGUgY29kZXMsIGhvd2V2ZXIsIGZvciBkZWJ1Z2dpbmcvdGVzdGluZyBwdXJwb3Nlcy4KLSAqLwotCi0vKiByZWNlaXZlIGEgcmVzcG9uc2UgKi8KLXN0YXRpYyBpbnQgYXp4X3NpbmdsZV93YWl0X2Zvcl9yZXNwb25zZShzdHJ1Y3QgYXp4ICpjaGlwLCB1bnNpZ25lZCBpbnQgYWRkcikKLXsKLQlpbnQgdGltZW91dCA9IDUwOwotCi0Jd2hpbGUgKHRpbWVvdXQtLSkgewotCQkvKiBjaGVjayBJUlYgYnVzeSBiaXQgKi8KLQkJaWYgKGF6eF9yZWFkdyhjaGlwLCBJUlMpICYgSUNINl9JUlNfVkFMSUQpIHsKLQkJCS8qIHJldXNlIHJpcmIucmVzIGFzIHRoZSByZXNwb25zZSByZXR1cm4gdmFsdWUgKi8KLQkJCWNoaXAtPnJpcmIucmVzW2FkZHJdID0gYXp4X3JlYWRsKGNoaXAsIElSKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXVkZWxheSgxKTsKLQl9Ci0JaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJc25kX3ByaW50ZChTRlggIiVzOiBnZXRfcmVzcG9uc2UgdGltZW91dDogSVJTPTB4JXhcbiIsCi0JCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpLCBhenhfcmVhZHcoY2hpcCwgSVJTKSk7Ci0JY2hpcC0+cmlyYi5yZXNbYWRkcl0gPSAtMTsKLQlyZXR1cm4gLUVJTzsKLX0KLQotLyogc2VuZCBhIGNvbW1hbmQgKi8KLXN0YXRpYyBpbnQgYXp4X3NpbmdsZV9zZW5kX2NtZChzdHJ1Y3QgaGRhX2J1cyAqYnVzLCB1MzIgdmFsKQotewotCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBpbnQgYWRkciA9IGF6eF9jb21tYW5kX2FkZHIodmFsKTsKLQlpbnQgdGltZW91dCA9IDUwOwotCi0JYnVzLT5yaXJiX2Vycm9yID0gMDsKLQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCS8qIGNoZWNrIElDQiBidXN5IGJpdCAqLwotCQlpZiAoISgoYXp4X3JlYWR3KGNoaXAsIElSUykgJiBJQ0g2X0lSU19CVVNZKSkpIHsKLQkJCS8qIENsZWFyIElSViB2YWxpZCBiaXQgKi8KLQkJCWF6eF93cml0ZXcoY2hpcCwgSVJTLCBhenhfcmVhZHcoY2hpcCwgSVJTKSB8Ci0JCQkJICAgSUNINl9JUlNfVkFMSUQpOwotCQkJYXp4X3dyaXRlbChjaGlwLCBJQywgdmFsKTsKLQkJCWF6eF93cml0ZXcoY2hpcCwgSVJTLCBhenhfcmVhZHcoY2hpcCwgSVJTKSB8Ci0JCQkJICAgSUNINl9JUlNfQlVTWSk7Ci0JCQlyZXR1cm4gYXp4X3NpbmdsZV93YWl0X2Zvcl9yZXNwb25zZShjaGlwLCBhZGRyKTsKLQkJfQotCQl1ZGVsYXkoMSk7Ci0JfQotCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXNuZF9wcmludGQoU0ZYICIlczogc2VuZF9jbWQgdGltZW91dDogSVJTPTB4JXgsIHZhbD0weCV4XG4iLAotCQkJICAgcGNpX25hbWUoY2hpcC0+cGNpKSwgYXp4X3JlYWR3KGNoaXAsIElSUyksIHZhbCk7Ci0JcmV0dXJuIC1FSU87Ci19Ci0KLS8qIHJlY2VpdmUgYSByZXNwb25zZSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBhenhfc2luZ2xlX2dldF9yZXNwb25zZShzdHJ1Y3QgaGRhX2J1cyAqYnVzLAotCQkJCQkgICAgdW5zaWduZWQgaW50IGFkZHIpCi17Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOwotCXJldHVybiBjaGlwLT5yaXJiLnJlc1thZGRyXTsKLX0KLQotLyoKLSAqIFRoZSBiZWxvdyBhcmUgdGhlIG1haW4gY2FsbGJhY2tzIGZyb20gaGRhX2NvZGVjLgotICoKLSAqIFRoZXkgYXJlIGp1c3QgdGhlIHNrZWxldG9uIHRvIGNhbGwgc3ViLWNhbGxiYWNrcyBhY2NvcmRpbmcgdG8gdGhlCi0gKiBjdXJyZW50IHNldHRpbmcgb2YgY2hpcC0+c2luZ2xlX2NtZC4KLSAqLwotCi0vKiBzZW5kIGEgY29tbWFuZCAqLwotc3RhdGljIGludCBhenhfc2VuZF9jbWQoc3RydWN0IGhkYV9idXMgKmJ1cywgdW5zaWduZWQgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoY2hpcC0+ZGlzYWJsZWQpCi0JCXJldHVybiAwOwotCWNoaXAtPmxhc3RfY21kW2F6eF9jb21tYW5kX2FkZHIodmFsKV0gPSB2YWw7Ci0JaWYgKGNoaXAtPnNpbmdsZV9jbWQpCi0JCXJldHVybiBhenhfc2luZ2xlX3NlbmRfY21kKGJ1cywgdmFsKTsKLQllbHNlCi0JCXJldHVybiBhenhfY29yYl9zZW5kX2NtZChidXMsIHZhbCk7Ci19Ci0KLS8qIGdldCBhIHJlc3BvbnNlICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGF6eF9nZXRfcmVzcG9uc2Uoc3RydWN0IGhkYV9idXMgKmJ1cywKLQkJCQkgICAgIHVuc2lnbmVkIGludCBhZGRyKQotewotCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKLQlpZiAoY2hpcC0+ZGlzYWJsZWQpCi0JCXJldHVybiAwOwotCWlmIChjaGlwLT5zaW5nbGVfY21kKQotCQlyZXR1cm4gYXp4X3NpbmdsZV9nZXRfcmVzcG9uc2UoYnVzLCBhZGRyKTsKLQllbHNlCi0JCXJldHVybiBhenhfcmlyYl9nZXRfcmVzcG9uc2UoYnVzLCBhZGRyKTsKLX0KLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIHZvaWQgYXp4X3Bvd2VyX25vdGlmeShzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBib29sIHBvd2VyX3VwKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfRFNQX0xPQURFUgotc3RhdGljIGludCBhenhfbG9hZF9kc3BfcHJlcGFyZShzdHJ1Y3QgaGRhX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZm9ybWF0LAotCQkJCXVuc2lnbmVkIGludCBieXRlX3NpemUsCi0JCQkJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWZwKTsKLXN0YXRpYyB2b2lkIGF6eF9sb2FkX2RzcF90cmlnZ2VyKHN0cnVjdCBoZGFfYnVzICpidXMsIGJvb2wgc3RhcnQpOwotc3RhdGljIHZvaWQgYXp4X2xvYWRfZHNwX2NsZWFudXAoc3RydWN0IGhkYV9idXMgKmJ1cywKLQkJCQkgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFiKTsKLSNlbmRpZgotCi0vKiBlbnRlciBsaW5rIHJlc2V0ICovCi1zdGF0aWMgdm9pZCBhenhfZW50ZXJfbGlua19yZXNldChzdHJ1Y3QgYXp4ICpjaGlwKQotewotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQotCS8qIHJlc2V0IGNvbnRyb2xsZXIgKi8KLQlhenhfd3JpdGVsKGNoaXAsIEdDVEwsIGF6eF9yZWFkbChjaGlwLCBHQ1RMKSAmIH5JQ0g2X0dDVExfUkVTRVQpOwotCi0JdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCk7Ci0Jd2hpbGUgKChhenhfcmVhZGIoY2hpcCwgR0NUTCkgJiBJQ0g2X0dDVExfUkVTRVQpICYmCi0JCQl0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKLQkJdXNsZWVwX3JhbmdlKDUwMCwgMTAwMCk7Ci19Ci0KLS8qIGV4aXQgbGluayByZXNldCAqLwotc3RhdGljIHZvaWQgYXp4X2V4aXRfbGlua19yZXNldChzdHJ1Y3QgYXp4ICpjaGlwKQotewotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQotCWF6eF93cml0ZWIoY2hpcCwgR0NUTCwgYXp4X3JlYWRiKGNoaXAsIEdDVEwpIHwgSUNINl9HQ1RMX1JFU0VUKTsKLQotCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOwotCXdoaWxlICghYXp4X3JlYWRiKGNoaXAsIEdDVEwpICYmCi0JCQl0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKLQkJdXNsZWVwX3JhbmdlKDUwMCwgMTAwMCk7Ci19Ci0KLS8qIHJlc2V0IGNvZGVjIGxpbmsgKi8KLXN0YXRpYyBpbnQgYXp4X3Jlc2V0KHN0cnVjdCBhenggKmNoaXAsIGludCBmdWxsX3Jlc2V0KQotewotCWlmICghZnVsbF9yZXNldCkKLQkJZ290byBfX3NraXA7Ci0KLQkvKiBjbGVhciBTVEFURVNUUyAqLwotCWF6eF93cml0ZXcoY2hpcCwgU1RBVEVTVFMsIFNUQVRFU1RTX0lOVF9NQVNLKTsKLQotCS8qIHJlc2V0IGNvbnRyb2xsZXIgKi8KLQlhenhfZW50ZXJfbGlua19yZXNldChjaGlwKTsKLQotCS8qIGRlbGF5IGZvciA+PSAxMDB1cyBmb3IgY29kZWMgUExMIHRvIHNldHRsZSBwZXIgc3BlYwotCSAqIFJldiAwLjkgc2VjdGlvbiA1LjUuMQotCSAqLwotCXVzbGVlcF9yYW5nZSg1MDAsIDEwMDApOwotCi0JLyogQnJpbmcgY29udHJvbGxlciBvdXQgb2YgcmVzZXQgKi8KLQlhenhfZXhpdF9saW5rX3Jlc2V0KGNoaXApOwotCi0JLyogQnJlbnQgQ2hhcnRyYW5kIHNhaWQgdG8gd2FpdCA+PSA1NDB1cyBmb3IgY29kZWNzIHRvIGluaXRpYWxpemUgKi8KLQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTIwMCk7Ci0KLSAgICAgIF9fc2tpcDoKLQkvKiBjaGVjayB0byBzZWUgaWYgY29udHJvbGxlciBpcyByZWFkeSAqLwotCWlmICghYXp4X3JlYWRiKGNoaXAsIEdDVEwpKSB7Ci0JCXNuZF9wcmludGQoU0ZYICIlczogYXp4X3Jlc2V0OiBjb250cm9sbGVyIG5vdCByZWFkeSFcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSkpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCS8qIEFjY2VwdCB1bnNvbGljaXRlZCByZXNwb25zZXMgKi8KLQlpZiAoIWNoaXAtPnNpbmdsZV9jbWQpCi0JCWF6eF93cml0ZWwoY2hpcCwgR0NUTCwgYXp4X3JlYWRsKGNoaXAsIEdDVEwpIHwKLQkJCSAgIElDSDZfR0NUTF9VTlNPTCk7Ci0KLQkvKiBkZXRlY3QgY29kZWNzICovCi0JaWYgKCFjaGlwLT5jb2RlY19tYXNrKSB7Ci0JCWNoaXAtPmNvZGVjX21hc2sgPSBhenhfcmVhZHcoY2hpcCwgU1RBVEVTVFMpOwotCQlzbmRfcHJpbnRkZChTRlggIiVzOiBjb2RlY19tYXNrID0gMHgleFxuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSwgY2hpcC0+Y29kZWNfbWFzayk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIExvd2xldmVsIGludGVyZmFjZQotICovICAKLQotLyogZW5hYmxlIGludGVycnVwdHMgKi8KLXN0YXRpYyB2b2lkIGF6eF9pbnRfZW5hYmxlKHN0cnVjdCBhenggKmNoaXApCi17Ci0JLyogZW5hYmxlIGNvbnRyb2xsZXIgQ0lFIGFuZCBHSUUgKi8KLQlhenhfd3JpdGVsKGNoaXAsIElOVENUTCwgYXp4X3JlYWRsKGNoaXAsIElOVENUTCkgfAotCQkgICBJQ0g2X0lOVF9DVFJMX0VOIHwgSUNINl9JTlRfR0xPQkFMX0VOKTsKLX0KLQotLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi1zdGF0aWMgdm9pZCBhenhfaW50X2Rpc2FibGUoc3RydWN0IGF6eCAqY2hpcCkKLXsKLQlpbnQgaTsKLQotCS8qIGRpc2FibGUgaW50ZXJydXB0cyBpbiBzdHJlYW0gZGVzY3JpcHRvciAqLwotCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fc3RyZWFtczsgaSsrKSB7Ci0JCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gJmNoaXAtPmF6eF9kZXZbaV07Ci0JCWF6eF9zZF93cml0ZWIoYXp4X2RldiwgU0RfQ1RMLAotCQkJICAgICAgYXp4X3NkX3JlYWRiKGF6eF9kZXYsIFNEX0NUTCkgJiB+U0RfSU5UX01BU0spOwotCX0KLQotCS8qIGRpc2FibGUgU0lFIGZvciBhbGwgc3RyZWFtcyAqLwotCWF6eF93cml0ZWIoY2hpcCwgSU5UQ1RMLCAwKTsKLQotCS8qIGRpc2FibGUgY29udHJvbGxlciBDSUUgYW5kIEdJRSAqLwotCWF6eF93cml0ZWwoY2hpcCwgSU5UQ1RMLCBhenhfcmVhZGwoY2hpcCwgSU5UQ1RMKSAmCi0JCSAgIH4oSUNINl9JTlRfQ1RSTF9FTiB8IElDSDZfSU5UX0dMT0JBTF9FTikpOwotfQotCi0vKiBjbGVhciBpbnRlcnJ1cHRzICovCi1zdGF0aWMgdm9pZCBhenhfaW50X2NsZWFyKHN0cnVjdCBhenggKmNoaXApCi17Ci0JaW50IGk7Ci0KLQkvKiBjbGVhciBzdHJlYW0gc3RhdHVzICovCi0JZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zdHJlYW1zOyBpKyspIHsKLQkJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSAmY2hpcC0+YXp4X2RldltpXTsKLQkJYXp4X3NkX3dyaXRlYihhenhfZGV2LCBTRF9TVFMsIFNEX0lOVF9NQVNLKTsKLQl9Ci0KLQkvKiBjbGVhciBTVEFURVNUUyAqLwotCWF6eF93cml0ZXcoY2hpcCwgU1RBVEVTVFMsIFNUQVRFU1RTX0lOVF9NQVNLKTsKLQotCS8qIGNsZWFyIHJpcmIgc3RhdHVzICovCi0JYXp4X3dyaXRlYihjaGlwLCBSSVJCU1RTLCBSSVJCX0lOVF9NQVNLKTsKLQotCS8qIGNsZWFyIGludCBzdGF0dXMgKi8KLQlhenhfd3JpdGVsKGNoaXAsIElOVFNUUywgSUNINl9JTlRfQ1RSTF9FTiB8IElDSDZfSU5UX0FMTF9TVFJFQU0pOwotfQotCi0vKiBzdGFydCBhIHN0cmVhbSAqLwotc3RhdGljIHZvaWQgYXp4X3N0cmVhbV9zdGFydChzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKLXsKLQkvKgotCSAqIEJlZm9yZSBzdHJlYW0gc3RhcnQsIGluaXRpYWxpemUgcGFyYW1ldGVyCi0JICovCi0JYXp4X2Rldi0+aW5zdWZmaWNpZW50ID0gMTsKLQotCS8qIGVuYWJsZSBTSUUgKi8KLQlhenhfd3JpdGVsKGNoaXAsIElOVENUTCwKLQkJICAgYXp4X3JlYWRsKGNoaXAsIElOVENUTCkgfCAoMSA8PCBhenhfZGV2LT5pbmRleCkpOwotCS8qIHNldCBETUEgc3RhcnQgYW5kIGludGVycnVwdCBtYXNrICovCi0JYXp4X3NkX3dyaXRlYihhenhfZGV2LCBTRF9DVEwsIGF6eF9zZF9yZWFkYihhenhfZGV2LCBTRF9DVEwpIHwKLQkJICAgICAgU0RfQ1RMX0RNQV9TVEFSVCB8IFNEX0lOVF9NQVNLKTsKLX0KLQotLyogc3RvcCBETUEgKi8KLXN0YXRpYyB2b2lkIGF6eF9zdHJlYW1fY2xlYXIoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpCi17Ci0JYXp4X3NkX3dyaXRlYihhenhfZGV2LCBTRF9DVEwsIGF6eF9zZF9yZWFkYihhenhfZGV2LCBTRF9DVEwpICYKLQkJICAgICAgfihTRF9DVExfRE1BX1NUQVJUIHwgU0RfSU5UX01BU0spKTsKLQlhenhfc2Rfd3JpdGViKGF6eF9kZXYsIFNEX1NUUywgU0RfSU5UX01BU0spOyAvKiB0byBiZSBzdXJlICovCi19Ci0KLS8qIHN0b3AgYSBzdHJlYW0gKi8KLXN0YXRpYyB2b2lkIGF6eF9zdHJlYW1fc3RvcChzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKLXsKLQlhenhfc3RyZWFtX2NsZWFyKGNoaXAsIGF6eF9kZXYpOwotCS8qIGRpc2FibGUgU0lFICovCi0JYXp4X3dyaXRlbChjaGlwLCBJTlRDVEwsCi0JCSAgIGF6eF9yZWFkbChjaGlwLCBJTlRDVEwpICYgfigxIDw8IGF6eF9kZXYtPmluZGV4KSk7Ci19Ci0KLQotLyoKLSAqIHJlc2V0IGFuZCBzdGFydCB0aGUgY29udHJvbGxlciByZWdpc3RlcnMKLSAqLwotc3RhdGljIHZvaWQgYXp4X2luaXRfY2hpcChzdHJ1Y3QgYXp4ICpjaGlwLCBpbnQgZnVsbF9yZXNldCkKLXsKLQlpZiAoY2hpcC0+aW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKLQotCS8qIHJlc2V0IGNvbnRyb2xsZXIgKi8KLQlhenhfcmVzZXQoY2hpcCwgZnVsbF9yZXNldCk7Ci0KLQkvKiBpbml0aWFsaXplIGludGVycnVwdHMgKi8KLQlhenhfaW50X2NsZWFyKGNoaXApOwotCWF6eF9pbnRfZW5hYmxlKGNoaXApOwotCi0JLyogaW5pdGlhbGl6ZSB0aGUgY29kZWMgY29tbWFuZCBJL08gKi8KLQlpZiAoIWNoaXAtPnNpbmdsZV9jbWQpCi0JCWF6eF9pbml0X2NtZF9pbyhjaGlwKTsKLQotCS8qIHByb2dyYW0gdGhlIHBvc2l0aW9uIGJ1ZmZlciAqLwotCWF6eF93cml0ZWwoY2hpcCwgRFBMQkFTRSwgKHUzMiljaGlwLT5wb3NidWYuYWRkcik7Ci0JYXp4X3dyaXRlbChjaGlwLCBEUFVCQVNFLCB1cHBlcl8zMl9iaXRzKGNoaXAtPnBvc2J1Zi5hZGRyKSk7Ci0KLQljaGlwLT5pbml0aWFsaXplZCA9IDE7Ci19CiAKIC8qCiAgKiBpbml0aWFsaXplIHRoZSBQQ0kgcmVnaXN0ZXJzCkBAIC0xMzQ2LDcgKzM2MCw3IEBACiAJICogVGhlIFBDSSByZWdpc3RlciBUQ1NFTCBpcyBkZWZpbmVkIGluIHRoZSBJbnRlbCBtYW51YWxzLgogCSAqLwogCWlmICghKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX05PX1RDU0VMKSkgewotCQlzbmRfcHJpbnRkZChTRlggIiVzOiBDbGVhcmluZyBUQ1NFTFxuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiQ2xlYXJpbmcgVENTRUxcbiIpOwogCQl1cGRhdGVfcGNpX2J5dGUoY2hpcC0+cGNpLCBJQ0g2X1BDSVJFR19UQ1NFTCwgMHgwNywgMCk7CiAJfQogCkBAIC0xMzU0LDcgKzM2OCw4IEBACiAJICogd2UgbmVlZCB0byBlbmFibGUgc25vb3AuCiAJICovCiAJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX0FUSV9TTk9PUCkgewotCQlzbmRfcHJpbnRkZChTRlggIiVzOiBTZXR0aW5nIEFUSSBzbm9vcDogJWRcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSksIGF6eF9zbm9vcChjaGlwKSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiU2V0dGluZyBBVEkgc25vb3A6ICVkXG4iLAorCQkJYXp4X3Nub29wKGNoaXApKTsKIAkJdXBkYXRlX3BjaV9ieXRlKGNoaXAtPnBjaSwKIAkJCQlBVElfU0I0NTBfSERBVURJT19NSVNDX0NOVFIyX0FERFIsIDB4MDcsCiAJCQkJYXp4X3Nub29wKGNoaXApID8gQVRJX1NCNDUwX0hEQVVESU9fRU5BQkxFX1NOT09QIDogMCk7CkBAIC0xMzYyLDcgKzM3Nyw4IEBACiAKIAkvKiBGb3IgTlZJRElBIEhEQSwgZW5hYmxlIHNub29wICovCiAJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX05WSURJQV9TTk9PUCkgewotCQlzbmRfcHJpbnRkZChTRlggIiVzOiBTZXR0aW5nIE52aWRpYSBzbm9vcDogJWRcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSksIGF6eF9zbm9vcChjaGlwKSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiU2V0dGluZyBOdmlkaWEgc25vb3A6ICVkXG4iLAorCQkJYXp4X3Nub29wKGNoaXApKTsKIAkJdXBkYXRlX3BjaV9ieXRlKGNoaXAtPnBjaSwKIAkJCQlOVklESUFfSERBX1RSQU5TUkVHX0FERFIsCiAJCQkJMHgwZiwgTlZJRElBX0hEQV9FTkFCTEVfQ09IQklUUyk7CkBAIC0xMzg3LDExMTIgKzQwMywyOSBAQAogCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoY2hpcC0+cGNpLAogCQkJCUlOVEVMX1NDSF9IREFfREVWQywgJnNub29wKTsKIAkJfQotCQlzbmRfcHJpbnRkZChTRlggIiVzOiBTQ0ggc25vb3A6ICVzXG4iLAotCQkJCXBjaV9uYW1lKGNoaXAtPnBjaSksIChzbm9vcCAmIElOVEVMX1NDSF9IREFfREVWQ19OT1NOT09QKQotCQkJCT8gIkRpc2FibGVkIiA6ICJFbmFibGVkIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiU0NIIHNub29wOiAlc1xuIiwKKwkJCShzbm9vcCAmIElOVEVMX1NDSF9IREFfREVWQ19OT1NOT09QKSA/CisJCQkiRGlzYWJsZWQiIDogIkVuYWJsZWQiKTsKICAgICAgICAgfQogfQogCi0KIHN0YXRpYyBpbnQgYXp4X3Bvc2l0aW9uX29rKHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KTsKIAotLyoKLSAqIGludGVycnVwdCBoYW5kbGVyCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBhenhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKKy8qIGNhbGxlZCBmcm9tIElSUSAqLworc3RhdGljIGludCBhenhfcG9zaXRpb25fY2hlY2soc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpCiB7Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGRldl9pZDsKLQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldjsKLQl1MzIgc3RhdHVzOwotCXU4IHNkX3N0YXR1czsKLQlpbnQgaSwgb2s7CisJaW50IG9rOwogCi0jaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKLQlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfUE1fUlVOVElNRSkKLQkJaWYgKGNoaXAtPnBjaS0+ZGV2LnBvd2VyLnJ1bnRpbWVfc3RhdHVzICE9IFJQTV9BQ1RJVkUpCi0JCQlyZXR1cm4gSVJRX05PTkU7Ci0jZW5kaWYKLQotCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOwotCi0JaWYgKGNoaXAtPmRpc2FibGVkKSB7Ci0JCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0KLQlzdGF0dXMgPSBhenhfcmVhZGwoY2hpcCwgSU5UU1RTKTsKLQlpZiAoc3RhdHVzID09IDAgfHwgc3RhdHVzID09IDB4ZmZmZmZmZmYpIHsKLQkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KLQkKLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3N0cmVhbXM7IGkrKykgewotCQlhenhfZGV2ID0gJmNoaXAtPmF6eF9kZXZbaV07Ci0JCWlmIChzdGF0dXMgJiBhenhfZGV2LT5zZF9pbnRfc3RhX21hc2spIHsKLQkJCXNkX3N0YXR1cyA9IGF6eF9zZF9yZWFkYihhenhfZGV2LCBTRF9TVFMpOwotCQkJYXp4X3NkX3dyaXRlYihhenhfZGV2LCBTRF9TVFMsIFNEX0lOVF9NQVNLKTsKLQkJCWlmICghYXp4X2Rldi0+c3Vic3RyZWFtIHx8ICFhenhfZGV2LT5ydW5uaW5nIHx8Ci0JCQkgICAgIShzZF9zdGF0dXMgJiBTRF9JTlRfQ09NUExFVEUpKQotCQkJCWNvbnRpbnVlOwotCQkJLyogY2hlY2sgd2hldGhlciB0aGlzIElSUSBpcyByZWFsbHkgYWNjZXB0YWJsZSAqLwotCQkJb2sgPSBhenhfcG9zaXRpb25fb2soY2hpcCwgYXp4X2Rldik7Ci0JCQlpZiAob2sgPT0gMSkgewotCQkJCWF6eF9kZXYtPmlycV9wZW5kaW5nID0gMDsKLQkJCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwotCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoYXp4X2Rldi0+c3Vic3RyZWFtKTsKLQkJCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQkJCX0gZWxzZSBpZiAob2sgPT0gMCAmJiBjaGlwLT5idXMgJiYgY2hpcC0+YnVzLT53b3JrcSkgewotCQkJCS8qIGJvZ3VzIElSUSwgcHJvY2VzcyBpdCBsYXRlciAqLwotCQkJCWF6eF9kZXYtPmlycV9wZW5kaW5nID0gMTsKLQkJCQlxdWV1ZV93b3JrKGNoaXAtPmJ1cy0+d29ya3EsCi0JCQkJCSAgICZjaGlwLT5pcnFfcGVuZGluZ193b3JrKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIGNsZWFyIHJpcmIgaW50ICovCi0Jc3RhdHVzID0gYXp4X3JlYWRiKGNoaXAsIFJJUkJTVFMpOwotCWlmIChzdGF0dXMgJiBSSVJCX0lOVF9NQVNLKSB7Ci0JCWlmIChzdGF0dXMgJiBSSVJCX0lOVF9SRVNQT05TRSkgewotCQkJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX1JJUkJfUFJFX0RFTEFZKQotCQkJCXVkZWxheSg4MCk7Ci0JCQlhenhfdXBkYXRlX3JpcmIoY2hpcCk7Ci0JCX0KLQkJYXp4X3dyaXRlYihjaGlwLCBSSVJCU1RTLCBSSVJCX0lOVF9NQVNLKTsKLQl9Ci0KLSNpZiAwCi0JLyogY2xlYXIgc3RhdGUgc3RhdHVzIGludCAqLwotCWlmIChhenhfcmVhZHcoY2hpcCwgU1RBVEVTVFMpICYgMHgwNCkKLQkJYXp4X3dyaXRldyhjaGlwLCBTVEFURVNUUywgMHgwNCk7Ci0jZW5kaWYKLQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwotCQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotCi0vKgotICogc2V0IHVwIGEgQkRMIGVudHJ5Ci0gKi8KLXN0YXRpYyBpbnQgc2V0dXBfYmRsZShzdHJ1Y3QgYXp4ICpjaGlwLAotCQkgICAgICBzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmRtYWIsCi0JCSAgICAgIHN0cnVjdCBhenhfZGV2ICphenhfZGV2LCB1MzIgKipiZGxwLAotCQkgICAgICBpbnQgb2ZzLCBpbnQgc2l6ZSwgaW50IHdpdGhfaW9jKQotewotCXUzMiAqYmRsID0gKmJkbHA7Ci0KLQl3aGlsZSAoc2l6ZSA+IDApIHsKLQkJZG1hX2FkZHJfdCBhZGRyOwotCQlpbnQgY2h1bms7Ci0KLQkJaWYgKGF6eF9kZXYtPmZyYWdzID49IEFaWF9NQVhfQkRMX0VOVFJJRVMpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlhZGRyID0gc25kX3NnYnVmX2dldF9hZGRyKGRtYWIsIG9mcyk7Ci0JCS8qIHByb2dyYW0gdGhlIGFkZHJlc3MgZmllbGQgb2YgdGhlIEJETCBlbnRyeSAqLwotCQliZGxbMF0gPSBjcHVfdG9fbGUzMigodTMyKWFkZHIpOwotCQliZGxbMV0gPSBjcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKGFkZHIpKTsKLQkJLyogcHJvZ3JhbSB0aGUgc2l6ZSBmaWVsZCBvZiB0aGUgQkRMIGVudHJ5ICovCi0JCWNodW5rID0gc25kX3NnYnVmX2dldF9jaHVua19zaXplKGRtYWIsIG9mcywgc2l6ZSk7Ci0JCS8qIG9uZSBCRExFIGNhbm5vdCBjcm9zcyA0SyBib3VuZGFyeSBvbiBDVEhEQSBjaGlwcyAqLwotCQlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfNEtfQkRMRV9CT1VOREFSWSkgewotCQkJdTMyIHJlbWFpbiA9IDB4MTAwMCAtIChvZnMgJiAweGZmZik7Ci0JCQlpZiAoY2h1bmsgPiByZW1haW4pCi0JCQkJY2h1bmsgPSByZW1haW47Ci0JCX0KLQkJYmRsWzJdID0gY3B1X3RvX2xlMzIoY2h1bmspOwotCQkvKiBwcm9ncmFtIHRoZSBJT0MgdG8gZW5hYmxlIGludGVycnVwdAotCQkgKiBvbmx5IHdoZW4gdGhlIHdob2xlIGZyYWdtZW50IGlzIHByb2Nlc3NlZAotCQkgKi8KLQkJc2l6ZSAtPSBjaHVuazsKLQkJYmRsWzNdID0gKHNpemUgfHwgIXdpdGhfaW9jKSA/IDAgOiBjcHVfdG9fbGUzMigweDAxKTsKLQkJYmRsICs9IDQ7Ci0JCWF6eF9kZXYtPmZyYWdzKys7Ci0JCW9mcyArPSBjaHVuazsKLQl9Ci0JKmJkbHAgPSBiZGw7Ci0JcmV0dXJuIG9mczsKLX0KLQotLyoKLSAqIHNldCB1cCBCREwgZW50cmllcwotICovCi1zdGF0aWMgaW50IGF6eF9zZXR1cF9wZXJpb2RzKHN0cnVjdCBhenggKmNoaXAsCi0JCQkgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICAgICBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKLXsKLQl1MzIgKmJkbDsKLQlpbnQgaSwgb2ZzLCBwZXJpb2RzLCBwZXJpb2RfYnl0ZXM7Ci0JaW50IHBvc19hZGo7Ci0KLQkvKiByZXNldCBCREwgYWRkcmVzcyAqLwotCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQkRMUEwsIDApOwotCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQkRMUFUsIDApOwotCi0JcGVyaW9kX2J5dGVzID0gYXp4X2Rldi0+cGVyaW9kX2J5dGVzOwotCXBlcmlvZHMgPSBhenhfZGV2LT5idWZzaXplIC8gcGVyaW9kX2J5dGVzOwotCi0JLyogcHJvZ3JhbSB0aGUgaW5pdGlhbCBCREwgZW50cmllcyAqLwotCWJkbCA9ICh1MzIgKilhenhfZGV2LT5iZGwuYXJlYTsKLQlvZnMgPSAwOwotCWF6eF9kZXYtPmZyYWdzID0gMDsKLQlwb3NfYWRqID0gYmRsX3Bvc19hZGpbY2hpcC0+ZGV2X2luZGV4XTsKLQlpZiAoIWF6eF9kZXYtPm5vX3BlcmlvZF93YWtldXAgJiYgcG9zX2FkaiA+IDApIHsKLQkJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQkJaW50IHBvc19hbGlnbiA9IHBvc19hZGo7Ci0JCXBvc19hZGogPSAocG9zX2FkaiAqIHJ1bnRpbWUtPnJhdGUgKyA0Nzk5OSkgLyA0ODAwMDsKLQkJaWYgKCFwb3NfYWRqKQotCQkJcG9zX2FkaiA9IHBvc19hbGlnbjsKLQkJZWxzZQotCQkJcG9zX2FkaiA9ICgocG9zX2FkaiArIHBvc19hbGlnbiAtIDEpIC8gcG9zX2FsaWduKSAqCi0JCQkJcG9zX2FsaWduOwotCQlwb3NfYWRqID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIHBvc19hZGopOwotCQlpZiAocG9zX2FkaiA+PSBwZXJpb2RfYnl0ZXMpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIFNGWCAiJXM6IFRvbyBiaWcgYWRqdXN0bWVudCAlZFxuIiwKLQkJCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpLCBiZGxfcG9zX2FkaltjaGlwLT5kZXZfaW5kZXhdKTsKLQkJCXBvc19hZGogPSAwOwotCQl9IGVsc2UgewotCQkJb2ZzID0gc2V0dXBfYmRsZShjaGlwLCBzbmRfcGNtX2dldF9kbWFfYnVmKHN1YnN0cmVhbSksCi0JCQkJCSBhenhfZGV2LAotCQkJCQkgJmJkbCwgb2ZzLCBwb3NfYWRqLCB0cnVlKTsKLQkJCWlmIChvZnMgPCAwKQotCQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9IGVsc2UKLQkJcG9zX2FkaiA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IHBlcmlvZHM7IGkrKykgewotCQlpZiAoaSA9PSBwZXJpb2RzIC0gMSAmJiBwb3NfYWRqKQotCQkJb2ZzID0gc2V0dXBfYmRsZShjaGlwLCBzbmRfcGNtX2dldF9kbWFfYnVmKHN1YnN0cmVhbSksCi0JCQkJCSBhenhfZGV2LCAmYmRsLCBvZnMsCi0JCQkJCSBwZXJpb2RfYnl0ZXMgLSBwb3NfYWRqLCAwKTsKLQkJZWxzZQotCQkJb2ZzID0gc2V0dXBfYmRsZShjaGlwLCBzbmRfcGNtX2dldF9kbWFfYnVmKHN1YnN0cmVhbSksCi0JCQkJCSBhenhfZGV2LCAmYmRsLCBvZnMsCi0JCQkJCSBwZXJpb2RfYnl0ZXMsCi0JCQkJCSAhYXp4X2Rldi0+bm9fcGVyaW9kX3dha2V1cCk7Ci0JCWlmIChvZnMgPCAwKQotCQkJZ290byBlcnJvcjsKKwlvayA9IGF6eF9wb3NpdGlvbl9vayhjaGlwLCBhenhfZGV2KTsKKwlpZiAob2sgPT0gMSkgeworCQlhenhfZGV2LT5pcnFfcGVuZGluZyA9IDA7CisJCXJldHVybiBvazsKKwl9IGVsc2UgaWYgKG9rID09IDAgJiYgY2hpcC0+YnVzICYmIGNoaXAtPmJ1cy0+d29ya3EpIHsKKwkJLyogYm9ndXMgSVJRLCBwcm9jZXNzIGl0IGxhdGVyICovCisJCWF6eF9kZXYtPmlycV9wZW5kaW5nID0gMTsKKwkJcXVldWVfd29yayhjaGlwLT5idXMtPndvcmtxLCAmY2hpcC0+aXJxX3BlbmRpbmdfd29yayk7CiAJfQogCXJldHVybiAwOwotCi0gZXJyb3I6Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiBTRlggIiVzOiBUb28gbWFueSBCREwgZW50cmllczogYnVmZmVyPSVkLCBwZXJpb2Q9JWRcbiIsCi0JCSAgIHBjaV9uYW1lKGNoaXAtPnBjaSksIGF6eF9kZXYtPmJ1ZnNpemUsIHBlcmlvZF9ieXRlcyk7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qIHJlc2V0IHN0cmVhbSAqLwotc3RhdGljIHZvaWQgYXp4X3N0cmVhbV9yZXNldChzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKLXsKLQl1bnNpZ25lZCBjaGFyIHZhbDsKLQlpbnQgdGltZW91dDsKLQotCWF6eF9zdHJlYW1fY2xlYXIoY2hpcCwgYXp4X2Rldik7Ci0KLQlhenhfc2Rfd3JpdGViKGF6eF9kZXYsIFNEX0NUTCwgYXp4X3NkX3JlYWRiKGF6eF9kZXYsIFNEX0NUTCkgfAotCQkgICAgICBTRF9DVExfU1RSRUFNX1JFU0VUKTsKLQl1ZGVsYXkoMyk7Ci0JdGltZW91dCA9IDMwMDsKLQl3aGlsZSAoISgodmFsID0gYXp4X3NkX3JlYWRiKGF6eF9kZXYsIFNEX0NUTCkpICYgU0RfQ1RMX1NUUkVBTV9SRVNFVCkgJiYKLQkgICAgICAgLS10aW1lb3V0KQotCQk7Ci0JdmFsICY9IH5TRF9DVExfU1RSRUFNX1JFU0VUOwotCWF6eF9zZF93cml0ZWIoYXp4X2RldiwgU0RfQ1RMLCB2YWwpOwotCXVkZWxheSgzKTsKLQotCXRpbWVvdXQgPSAzMDA7Ci0JLyogd2FpdGluZyBmb3IgaGFyZHdhcmUgdG8gcmVwb3J0IHRoYXQgdGhlIHN0cmVhbSBpcyBvdXQgb2YgcmVzZXQgKi8KLQl3aGlsZSAoKCh2YWwgPSBhenhfc2RfcmVhZGIoYXp4X2RldiwgU0RfQ1RMKSkgJiBTRF9DVExfU1RSRUFNX1JFU0VUKSAmJgotCSAgICAgICAtLXRpbWVvdXQpCi0JCTsKLQotCS8qIHJlc2V0IGZpcnN0IHBvc2l0aW9uIC0gbWF5IG5vdCBiZSBzeW5jZWQgd2l0aCBodyBhdCB0aGlzIHRpbWUgKi8KLQkqYXp4X2Rldi0+cG9zYnVmID0gMDsKLX0KLQotLyoKLSAqIHNldCB1cCB0aGUgU0QgZm9yIHN0cmVhbWluZwotICovCi1zdGF0aWMgaW50IGF6eF9zZXR1cF9jb250cm9sbGVyKHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KQotewotCXVuc2lnbmVkIGludCB2YWw7Ci0JLyogbWFrZSBzdXJlIHRoZSBydW4gYml0IGlzIHplcm8gZm9yIFNEICovCi0JYXp4X3N0cmVhbV9jbGVhcihjaGlwLCBhenhfZGV2KTsKLQkvKiBwcm9ncmFtIHRoZSBzdHJlYW1fdGFnICovCi0JdmFsID0gYXp4X3NkX3JlYWRsKGF6eF9kZXYsIFNEX0NUTCk7Ci0JdmFsID0gKHZhbCAmIH5TRF9DVExfU1RSRUFNX1RBR19NQVNLKSB8Ci0JCShhenhfZGV2LT5zdHJlYW1fdGFnIDw8IFNEX0NUTF9TVFJFQU1fVEFHX1NISUZUKTsKLQlpZiAoIWF6eF9zbm9vcChjaGlwKSkKLQkJdmFsIHw9IFNEX0NUTF9UUkFGRklDX1BSSU87Ci0JYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9DVEwsIHZhbCk7Ci0KLQkvKiBwcm9ncmFtIHRoZSBsZW5ndGggb2Ygc2FtcGxlcyBpbiBjeWNsaWMgYnVmZmVyICovCi0JYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9DQkwsIGF6eF9kZXYtPmJ1ZnNpemUpOwotCi0JLyogcHJvZ3JhbSB0aGUgc3RyZWFtIGZvcm1hdCAqLwotCS8qIHRoaXMgdmFsdWUgbmVlZHMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIG9uZSBwcm9ncmFtbWVkICovCi0JYXp4X3NkX3dyaXRldyhhenhfZGV2LCBTRF9GT1JNQVQsIGF6eF9kZXYtPmZvcm1hdF92YWwpOwotCi0JLyogcHJvZ3JhbSB0aGUgc3RyZWFtIExWSSAobGFzdCB2YWxpZCBpbmRleCkgb2YgdGhlIEJETCAqLwotCWF6eF9zZF93cml0ZXcoYXp4X2RldiwgU0RfTFZJLCBhenhfZGV2LT5mcmFncyAtIDEpOwotCi0JLyogcHJvZ3JhbSB0aGUgQkRMIGFkZHJlc3MgKi8KLQkvKiBsb3dlciBCREwgYWRkcmVzcyAqLwotCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQkRMUEwsICh1MzIpYXp4X2Rldi0+YmRsLmFkZHIpOwotCS8qIHVwcGVyIEJETCBhZGRyZXNzICovCi0JYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9CRExQVSwgdXBwZXJfMzJfYml0cyhhenhfZGV2LT5iZGwuYWRkcikpOwotCi0JLyogZW5hYmxlIHRoZSBwb3NpdGlvbiBidWZmZXIgKi8KLQlpZiAoY2hpcC0+cG9zaXRpb25fZml4WzBdICE9IFBPU19GSVhfTFBJQiB8fAotCSAgICBjaGlwLT5wb3NpdGlvbl9maXhbMV0gIT0gUE9TX0ZJWF9MUElCKSB7Ci0JCWlmICghKGF6eF9yZWFkbChjaGlwLCBEUExCQVNFKSAmIElDSDZfRFBMQkFTRV9FTkFCTEUpKQotCQkJYXp4X3dyaXRlbChjaGlwLCBEUExCQVNFLAotCQkJCSh1MzIpY2hpcC0+cG9zYnVmLmFkZHIgfCBJQ0g2X0RQTEJBU0VfRU5BQkxFKTsKLQl9Ci0KLQkvKiBzZXQgdGhlIGludGVycnVwdCBlbmFibGUgYml0cyBpbiB0aGUgZGVzY3JpcHRvciBjb250cm9sIHJlZ2lzdGVyICovCi0JYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9DVEwsCi0JCSAgICAgIGF6eF9zZF9yZWFkbChhenhfZGV2LCBTRF9DVEwpIHwgU0RfSU5UX01BU0spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBQcm9iZSB0aGUgZ2l2ZW4gY29kZWMgYWRkcmVzcwotICovCi1zdGF0aWMgaW50IHByb2JlX2NvZGVjKHN0cnVjdCBhenggKmNoaXAsIGludCBhZGRyKQotewotCXVuc2lnbmVkIGludCBjbWQgPSAoYWRkciA8PCAyOCkgfCAoQUNfTk9ERV9ST09UIDw8IDIwKSB8Ci0JCShBQ19WRVJCX1BBUkFNRVRFUlMgPDwgOCkgfCBBQ19QQVJfVkVORE9SX0lEOwotCXVuc2lnbmVkIGludCByZXM7Ci0KLQltdXRleF9sb2NrKCZjaGlwLT5idXMtPmNtZF9tdXRleCk7Ci0JY2hpcC0+cHJvYmluZyA9IDE7Ci0JYXp4X3NlbmRfY21kKGNoaXAtPmJ1cywgY21kKTsKLQlyZXMgPSBhenhfZ2V0X3Jlc3BvbnNlKGNoaXAtPmJ1cywgYWRkcik7Ci0JY2hpcC0+cHJvYmluZyA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5idXMtPmNtZF9tdXRleCk7Ci0JaWYgKHJlcyA9PSAtMSkKLQkJcmV0dXJuIC1FSU87Ci0Jc25kX3ByaW50ZGQoU0ZYICIlczogY29kZWMgIyVkIHByb2JlZCBPS1xuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSwgYWRkcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXp4X2F0dGFjaF9wY21fc3RyZWFtKHN0cnVjdCBoZGFfYnVzICpidXMsIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCSBzdHJ1Y3QgaGRhX3BjbSAqY3BjbSk7Ci1zdGF0aWMgdm9pZCBhenhfc3RvcF9jaGlwKHN0cnVjdCBhenggKmNoaXApOwotCi1zdGF0aWMgdm9pZCBhenhfYnVzX3Jlc2V0KHN0cnVjdCBoZGFfYnVzICpidXMpCi17Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOwotCi0JYnVzLT5pbl9yZXNldCA9IDE7Ci0JYXp4X3N0b3BfY2hpcChjaGlwKTsKLQlhenhfaW5pdF9jaGlwKGNoaXAsIDEpOwotI2lmZGVmIENPTkZJR19QTQotCWlmIChjaGlwLT5pbml0aWFsaXplZCkgewotCQlzdHJ1Y3QgYXp4X3BjbSAqcDsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2hpcC0+cGNtX2xpc3QsIGxpc3QpCi0JCQlzbmRfcGNtX3N1c3BlbmRfYWxsKHAtPnBjbSk7Ci0JCXNuZF9oZGFfc3VzcGVuZChjaGlwLT5idXMpOwotCQlzbmRfaGRhX3Jlc3VtZShjaGlwLT5idXMpOwotCX0KLSNlbmRpZgotCWJ1cy0+aW5fcmVzZXQgPSAwOwotfQotCi1zdGF0aWMgaW50IGdldF9qYWNrcG9sbF9pbnRlcnZhbChzdHJ1Y3QgYXp4ICpjaGlwKQotewotCWludCBpID0gamFja3BvbGxfbXNbY2hpcC0+ZGV2X2luZGV4XTsKLQl1bnNpZ25lZCBpbnQgajsKLQlpZiAoaSA9PSAwKQotCQlyZXR1cm4gMDsKLQlpZiAoaSA8IDUwIHx8IGkgPiA2MDAwMCkKLQkJaiA9IDA7Ci0JZWxzZQotCQlqID0gbXNlY3NfdG9famlmZmllcyhpKTsKLQlpZiAoaiA9PSAwKQotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyBTRlgKLQkJCSAgICJqYWNrcG9sbF9tcyB2YWx1ZSBvdXQgb2YgcmFuZ2U6ICVkXG4iLCBpKTsKLQlyZXR1cm4gajsKLX0KLQotLyoKLSAqIENvZGVjIGluaXRpYWxpemF0aW9uCi0gKi8KLQotLyogbnVtYmVyIG9mIGNvZGVjIHNsb3RzIGZvciBlYWNoIGNoaXBzZXQ6IDAgPSBkZWZhdWx0IHNsb3RzIChpLmUuIDQpICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGF6eF9tYXhfY29kZWNzW0FaWF9OVU1fRFJJVkVSU10gPSB7Ci0JW0FaWF9EUklWRVJfTlZJRElBXSA9IDgsCi0JW0FaWF9EUklWRVJfVEVSQV0gPSAxLAotfTsKLQotc3RhdGljIGludCBhenhfY29kZWNfY3JlYXRlKHN0cnVjdCBhenggKmNoaXAsIGNvbnN0IGNoYXIgKm1vZGVsKQotewotCXN0cnVjdCBoZGFfYnVzX3RlbXBsYXRlIGJ1c190ZW1wOwotCWludCBjLCBjb2RlY3MsIGVycjsKLQlpbnQgbWF4X3Nsb3RzOwotCi0JbWVtc2V0KCZidXNfdGVtcCwgMCwgc2l6ZW9mKGJ1c190ZW1wKSk7Ci0JYnVzX3RlbXAucHJpdmF0ZV9kYXRhID0gY2hpcDsKLQlidXNfdGVtcC5tb2RlbG5hbWUgPSBtb2RlbDsKLQlidXNfdGVtcC5wY2kgPSBjaGlwLT5wY2k7Ci0JYnVzX3RlbXAub3BzLmNvbW1hbmQgPSBhenhfc2VuZF9jbWQ7Ci0JYnVzX3RlbXAub3BzLmdldF9yZXNwb25zZSA9IGF6eF9nZXRfcmVzcG9uc2U7Ci0JYnVzX3RlbXAub3BzLmF0dGFjaF9wY20gPSBhenhfYXR0YWNoX3BjbV9zdHJlYW07Ci0JYnVzX3RlbXAub3BzLmJ1c19yZXNldCA9IGF6eF9idXNfcmVzZXQ7Ci0jaWZkZWYgQ09ORklHX1BNCi0JYnVzX3RlbXAucG93ZXJfc2F2ZSA9ICZwb3dlcl9zYXZlOwotCWJ1c190ZW1wLm9wcy5wbV9ub3RpZnkgPSBhenhfcG93ZXJfbm90aWZ5OwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NORF9IREFfRFNQX0xPQURFUgotCWJ1c190ZW1wLm9wcy5sb2FkX2RzcF9wcmVwYXJlID0gYXp4X2xvYWRfZHNwX3ByZXBhcmU7Ci0JYnVzX3RlbXAub3BzLmxvYWRfZHNwX3RyaWdnZXIgPSBhenhfbG9hZF9kc3BfdHJpZ2dlcjsKLQlidXNfdGVtcC5vcHMubG9hZF9kc3BfY2xlYW51cCA9IGF6eF9sb2FkX2RzcF9jbGVhbnVwOwotI2VuZGlmCi0KLQllcnIgPSBzbmRfaGRhX2J1c19uZXcoY2hpcC0+Y2FyZCwgJmJ1c190ZW1wLCAmY2hpcC0+YnVzKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19SSVJCX0RFTEFZKSB7Ci0JCXNuZF9wcmludGQoU0ZYICIlczogRW5hYmxlIGRlbGF5IGluIFJJUkIgaGFuZGxpbmdcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSkpOwotCQljaGlwLT5idXMtPm5lZWRzX2RhbW5fbG9uZ19kZWxheSA9IDE7Ci0JfQotCi0JY29kZWNzID0gMDsKLQltYXhfc2xvdHMgPSBhenhfbWF4X2NvZGVjc1tjaGlwLT5kcml2ZXJfdHlwZV07Ci0JaWYgKCFtYXhfc2xvdHMpCi0JCW1heF9zbG90cyA9IEFaWF9ERUZBVUxUX0NPREVDUzsKLQotCS8qIEZpcnN0IHRyeSB0byBwcm9iZSBhbGwgZ2l2ZW4gY29kZWMgc2xvdHMgKi8KLQlmb3IgKGMgPSAwOyBjIDwgbWF4X3Nsb3RzOyBjKyspIHsKLQkJaWYgKChjaGlwLT5jb2RlY19tYXNrICYgKDEgPDwgYykpICYgY2hpcC0+Y29kZWNfcHJvYmVfbWFzaykgewotCQkJaWYgKHByb2JlX2NvZGVjKGNoaXAsIGMpIDwgMCkgewotCQkJCS8qIFNvbWUgQklPU2VuIGdpdmUgeW91IHdyb25nIGNvZGVjIGFkZHJlc3NlcwotCQkJCSAqIHRoYXQgZG9uJ3QgZXhpc3QKLQkJCQkgKi8KLQkJCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyBTRlgKLQkJCQkJICAgIiVzOiBDb2RlYyAjJWQgcHJvYmUgZXJyb3I7ICIKLQkJCQkJICAgImRpc2FibGluZyBpdC4uLlxuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSwgYyk7Ci0JCQkJY2hpcC0+Y29kZWNfbWFzayAmPSB+KDEgPDwgYyk7Ci0JCQkJLyogTW9yZSBiYWRseSwgYWNjZXNzaW5nIHRvIGEgbm9uLWV4aXN0aW5nCi0JCQkJICogY29kZWMgb2Z0ZW4gc2NyZXdzIHVwIHRoZSBjb250cm9sbGVyIGNoaXAsCi0JCQkJICogYW5kIGRpc3R1cmJzIHRoZSBmdXJ0aGVyIGNvbW11bmljYXRpb25zLgotCQkJCSAqIFRodXMgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBwcm9iaW5nLAotCQkJCSAqIGJldHRlciB0byByZXNldCB0aGUgY29udHJvbGxlciBjaGlwIHRvCi0JCQkJICogZ2V0IGJhY2sgdG8gdGhlIHNhbml0eSBzdGF0ZS4KLQkJCQkgKi8KLQkJCQlhenhfc3RvcF9jaGlwKGNoaXApOwotCQkJCWF6eF9pbml0X2NoaXAoY2hpcCwgMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBBTUQgY2hpcHNldHMgb2Z0ZW4gY2F1c2UgdGhlIGNvbW11bmljYXRpb24gc3RhbGxzIHVwb24gY2VydGFpbgotCSAqIHNlcXVlbmNlIGxpa2UgdGhlIHBpbi1kZXRlY3Rpb24uICBJdCBzZWVtcyB0aGF0IGZvcmNpbmcgdGhlIHN5bmNlZAotCSAqIGFjY2VzcyB3b3JrcyBhcm91bmQgdGhlIHN0YWxsLiAgR3Jyci4uLgotCSAqLwotCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19TWU5DX1dSSVRFKSB7Ci0JCXNuZF9wcmludGQoU0ZYICIlczogRW5hYmxlIHN5bmNfd3JpdGUgZm9yIHN0YWJsZSBjb21tdW5pY2F0aW9uXG4iLAotCQkJcGNpX25hbWUoY2hpcC0+cGNpKSk7Ci0JCWNoaXAtPmJ1cy0+c3luY193cml0ZSA9IDE7Ci0JCWNoaXAtPmJ1cy0+YWxsb3dfYnVzX3Jlc2V0ID0gMTsKLQl9Ci0KLQkvKiBUaGVuIGNyZWF0ZSBjb2RlYyBpbnN0YW5jZXMgKi8KLQlmb3IgKGMgPSAwOyBjIDwgbWF4X3Nsb3RzOyBjKyspIHsKLQkJaWYgKChjaGlwLT5jb2RlY19tYXNrICYgKDEgPDwgYykpICYgY2hpcC0+Y29kZWNfcHJvYmVfbWFzaykgewotCQkJc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7Ci0JCQllcnIgPSBzbmRfaGRhX2NvZGVjX25ldyhjaGlwLT5idXMsIGMsICZjb2RlYyk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQljb250aW51ZTsKLQkJCWNvZGVjLT5qYWNrcG9sbF9pbnRlcnZhbCA9IGdldF9qYWNrcG9sbF9pbnRlcnZhbChjaGlwKTsKLQkJCWNvZGVjLT5iZWVwX21vZGUgPSBjaGlwLT5iZWVwX21vZGU7Ci0JCQljb2RlY3MrKzsKLQkJfQotCX0KLQlpZiAoIWNvZGVjcykgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IG5vIGNvZGVjcyBpbml0aWFsaXplZFxuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCXJldHVybiAwOwotfQotCi0vKiBjb25maWd1cmUgZWFjaCBjb2RlYyBpbnN0YW5jZSAqLwotc3RhdGljIGludCBhenhfY29kZWNfY29uZmlndXJlKHN0cnVjdCBhenggKmNoaXApCi17Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShjb2RlYywgJmNoaXAtPmJ1cy0+Y29kZWNfbGlzdCwgbGlzdCkgewotCQlzbmRfaGRhX2NvZGVjX2NvbmZpZ3VyZShjb2RlYyk7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBQQ00gc3VwcG9ydAotICovCi0KLS8qIGFzc2lnbiBhIHN0cmVhbSBmb3IgdGhlIFBDTSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgYXp4X2RldiAqCi1henhfYXNzaWduX2RldmljZShzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlpbnQgZGV2LCBpLCBudW1zOwotCXN0cnVjdCBhenhfZGV2ICpyZXMgPSBOVUxMOwotCS8qIG1ha2UgYSBub24temVybyB1bmlxdWUga2V5IGZvciB0aGUgc3Vic3RyZWFtICovCi0JaW50IGtleSA9IChzdWJzdHJlYW0tPnBjbS0+ZGV2aWNlIDw8IDE2KSB8IChzdWJzdHJlYW0tPm51bWJlciA8PCAyKSB8Ci0JCShzdWJzdHJlYW0tPnN0cmVhbSArIDEpOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJZGV2ID0gY2hpcC0+cGxheWJhY2tfaW5kZXhfb2Zmc2V0OwotCQludW1zID0gY2hpcC0+cGxheWJhY2tfc3RyZWFtczsKLQl9IGVsc2UgewotCQlkZXYgPSBjaGlwLT5jYXB0dXJlX2luZGV4X29mZnNldDsKLQkJbnVtcyA9IGNoaXAtPmNhcHR1cmVfc3RyZWFtczsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IG51bXM7IGkrKywgZGV2KyspIHsKLQkJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSAmY2hpcC0+YXp4X2RldltkZXZdOwotCQlkc3BfbG9jayhhenhfZGV2KTsKLQkJaWYgKCFhenhfZGV2LT5vcGVuZWQgJiYgIWRzcF9pc19sb2NrZWQoYXp4X2RldikpIHsKLQkJCXJlcyA9IGF6eF9kZXY7Ci0JCQlpZiAocmVzLT5hc3NpZ25lZF9rZXkgPT0ga2V5KSB7Ci0JCQkJcmVzLT5vcGVuZWQgPSAxOwotCQkJCXJlcy0+YXNzaWduZWRfa2V5ID0ga2V5OwotCQkJCWRzcF91bmxvY2soYXp4X2Rldik7Ci0JCQkJcmV0dXJuIGF6eF9kZXY7Ci0JCQl9Ci0JCX0KLQkJZHNwX3VubG9jayhhenhfZGV2KTsKLQl9Ci0JaWYgKHJlcykgewotCQlkc3BfbG9jayhyZXMpOwotCQlyZXMtPm9wZW5lZCA9IDE7Ci0JCXJlcy0+YXNzaWduZWRfa2V5ID0ga2V5OwotCQlkc3BfdW5sb2NrKHJlcyk7Ci0JfQotCXJldHVybiByZXM7Ci19Ci0KLS8qIHJlbGVhc2UgdGhlIGFzc2lnbmVkIHN0cmVhbSAqLwotc3RhdGljIGlubGluZSB2b2lkIGF6eF9yZWxlYXNlX2RldmljZShzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKLXsKLQlhenhfZGV2LT5vcGVuZWQgPSAwOwotfQotCi1zdGF0aWMgY3ljbGVfdCBhenhfY2NfcmVhZChjb25zdCBzdHJ1Y3QgY3ljbGVjb3VudGVyICpjYykKLXsKLQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGNvbnRhaW5lcl9vZihjYywgc3RydWN0IGF6eF9kZXYsIGF6eF9jYyk7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBhenhfZGV2LT5zdWJzdHJlYW07Ci0Jc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7Ci0KLQlyZXR1cm4gYXp4X3JlYWRsKGNoaXAsIFdBTExDTEspOwotfQotCi1zdGF0aWMgdm9pZCBhenhfdGltZWNvdW50ZXJfaW5pdChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQlib29sIGZvcmNlLCBjeWNsZV90IGxhc3QpCi17Ci0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOwotCXN0cnVjdCB0aW1lY291bnRlciAqdGMgPSAmYXp4X2Rldi0+YXp4X3RjOwotCXN0cnVjdCBjeWNsZWNvdW50ZXIgKmNjID0gJmF6eF9kZXYtPmF6eF9jYzsKLQl1NjQgbnNlYzsKLQotCWNjLT5yZWFkID0gYXp4X2NjX3JlYWQ7Ci0JY2MtPm1hc2sgPSBDTE9DS1NPVVJDRV9NQVNLKDMyKTsKLQotCS8qCi0JICogQ29udmVydGluZyBmcm9tIDI0IE1IeiB0byBucyBtZWFucyBhcHBseWluZyBhIDEyNS8zIGZhY3Rvci4KLQkgKiBUbyBhdm9pZCBhbnkgc2F0dXJhdGlvbiBpc3N1ZXMgaW4gaW50ZXJtZWRpYXRlIG9wZXJhdGlvbnMsCi0JICogdGhlIDEyNSBmYWN0b3IgaXMgYXBwbGllZCBmaXJzdC4gVGhlIGRpdmlzaW9uIGlzIGFwcGxpZWQKLQkgKiBsYXN0IGFmdGVyIHJlYWRpbmcgdGhlIHRpbWVjb3VudGVyIHZhbHVlLgotCSAqIEFwcGx5aW5nIHRoZSAxLzMgZmFjdG9yIGFzIHBhcnQgb2YgdGhlIG11bHRpcGxpY2F0aW9uCi0JICogcmVxdWlyZXMgYXQgbGVhc3QgMjAgYml0cyBmb3IgYSBkZWNlbnQgcHJlY2lzaW9uLCBob3dldmVyCi0JICogb3ZlcmZsb3dzIG9jY3VyIGFmdGVyIGFib3V0IDQgaG91cnMgb3IgbGVzcywgbm90IGEgb3B0aW9uLgotCSAqLwotCi0JY2MtPm11bHQgPSAxMjU7IC8qIHNhdHVyYXRpb24gYWZ0ZXIgMTk1IHllYXJzICovCi0JY2MtPnNoaWZ0ID0gMDsKLQotCW5zZWMgPSAwOyAvKiBhdWRpbyB0aW1lIGlzIGVsYXBzZWQgdGltZSBzaW5jZSB0cmlnZ2VyICovCi0JdGltZWNvdW50ZXJfaW5pdCh0YywgY2MsIG5zZWMpOwotCWlmIChmb3JjZSkKLQkJLyoKLQkJICogZm9yY2UgdGltZWNvdW50ZXIgdG8gdXNlIHByZWRlZmluZWQgdmFsdWUsCi0JCSAqIHVzZWQgZm9yIHN5bmNocm9uaXplZCBzdGFydHMKLQkJICovCi0JCXRjLT5jeWNsZV9sYXN0ID0gbGFzdDsKLX0KLQotc3RhdGljIHU2NCBhenhfYWRqdXN0X2NvZGVjX2RlbGF5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCXU2NCBuc2VjKQotewotCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSBhcGNtLT5oaW5mb1tzdWJzdHJlYW0tPnN0cmVhbV07Ci0JdTY0IGNvZGVjX2ZyYW1lcywgY29kZWNfbnNlY3M7Ci0KLQlpZiAoIWhpbmZvLT5vcHMuZ2V0X2RlbGF5KQotCQlyZXR1cm4gbnNlYzsKLQotCWNvZGVjX2ZyYW1lcyA9IGhpbmZvLT5vcHMuZ2V0X2RlbGF5KGhpbmZvLCBhcGNtLT5jb2RlYywgc3Vic3RyZWFtKTsKLQljb2RlY19uc2VjcyA9IGRpdl91NjQoY29kZWNfZnJhbWVzICogMTAwMDAwMDAwMExMLAotCQkJICAgICAgc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlKTsKLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCXJldHVybiBuc2VjICsgY29kZWNfbnNlY3M7Ci0KLQlyZXR1cm4gKG5zZWMgPiBjb2RlY19uc2VjcykgPyBuc2VjIC0gY29kZWNfbnNlY3MgOiAwOwotfQotCi1zdGF0aWMgaW50IGF6eF9nZXRfd2FsbGNsb2NrX3RzdGFtcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQlzdHJ1Y3QgdGltZXNwZWMgKnRzKQotewotCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKLQl1NjQgbnNlYzsKLQotCW5zZWMgPSB0aW1lY291bnRlcl9yZWFkKCZhenhfZGV2LT5henhfdGMpOwotCW5zZWMgPSBkaXZfdTY0KG5zZWMsIDMpOyAvKiBjYW4gYmUgb3B0aW1pemVkICovCi0JbnNlYyA9IGF6eF9hZGp1c3RfY29kZWNfZGVsYXkoc3Vic3RyZWFtLCBuc2VjKTsKLQotCSp0cyA9IG5zX3RvX3RpbWVzcGVjKG5zZWMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBhenhfcGNtX2h3ID0gewotCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8Ci0JCQkJIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKLQkJCQkgLyogTm8gZnVsbC1yZXN1bWUgeWV0IGltcGxlbWVudGVkICovCi0JCQkJIC8qIFNORFJWX1BDTV9JTkZPX1JFU1VNRSB8Ki8KLQkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUIHwKLQkJCQkgU05EUlZfUENNX0lORk9fSEFTX1dBTExfQ0xPQ0sgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19OT19QRVJJT0RfV0FLRVVQKSwKLQkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfNDgwMDAsCi0JLnJhdGVfbWluID0JCTQ4MDAwLAotCS5yYXRlX21heCA9CQk0ODAwMCwKLQkuY2hhbm5lbHNfbWluID0JCTIsCi0JLmNoYW5uZWxzX21heCA9CQkyLAotCS5idWZmZXJfYnl0ZXNfbWF4ID0JQVpYX01BWF9CVUZfU0laRSwKLQkucGVyaW9kX2J5dGVzX21pbiA9CTEyOCwKLQkucGVyaW9kX2J5dGVzX21heCA9CUFaWF9NQVhfQlVGX1NJWkUgLyAyLAotCS5wZXJpb2RzX21pbiA9CQkyLAotCS5wZXJpb2RzX21heCA9CQlBWlhfTUFYX0ZSQUcsCi0JLmZpZm9fc2l6ZSA9CQkwLAotfTsKLQotc3RhdGljIGludCBhenhfcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbyA9IGFwY20tPmhpbmZvW3N1YnN0cmVhbS0+c3RyZWFtXTsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYXBjbS0+Y2hpcDsKLQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldjsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGVycjsKLQlpbnQgYnVmZl9zdGVwOwotCi0JbXV0ZXhfbG9jaygmY2hpcC0+b3Blbl9tdXRleCk7Ci0JYXp4X2RldiA9IGF6eF9hc3NpZ25fZGV2aWNlKGNoaXAsIHN1YnN0cmVhbSk7Ci0JaWYgKGF6eF9kZXYgPT0gTlVMTCkgewotCQltdXRleF91bmxvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQlydW50aW1lLT5odyA9IGF6eF9wY21faHc7Ci0JcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID0gaGluZm8tPmNoYW5uZWxzX21pbjsKLQlydW50aW1lLT5ody5jaGFubmVsc19tYXggPSBoaW5mby0+Y2hhbm5lbHNfbWF4OwotCXJ1bnRpbWUtPmh3LmZvcm1hdHMgPSBoaW5mby0+Zm9ybWF0czsKLQlydW50aW1lLT5ody5yYXRlcyA9IGhpbmZvLT5yYXRlczsKLQlzbmRfcGNtX2xpbWl0X2h3X3JhdGVzKHJ1bnRpbWUpOwotCXNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKLQotCS8qIGF2b2lkIHdyYXAtYXJvdW5kIHdpdGggd2FsbC1jbG9jayAqLwotCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9USU1FLAotCQkJCTIwLAotCQkJCTE3ODAwMDAwMCk7Ci0KLQlpZiAoY2hpcC0+YWxpZ25fYnVmZmVyX3NpemUpCi0JCS8qIGNvbnN0cmFpbiBidWZmZXIgc2l6ZXMgdG8gYmUgbXVsdGlwbGUgb2YgMTI4Ci0JCSAgIGJ5dGVzLiBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IGluIHRlcm1zIG9mIG1lbW9yeQotCQkgICBhY2Nlc3MgYnV0IGlzbid0IHJlcXVpcmVkIGJ5IHRoZSBIREEgc3BlYyBhbmQKLQkJICAgcHJldmVudHMgdXNlcnMgZnJvbSBzcGVjaWZ5aW5nIGV4YWN0IHBlcmlvZC9idWZmZXIKLQkJICAgc2l6ZXMuIEZvciBleGFtcGxlIGZvciA0NC4xa0h6LCBhIHBlcmlvZCBzaXplIHNldAotCQkgICB0byAyMG1zIHdpbGwgYmUgcm91bmRlZCB0byAxOS41OW1zLiAqLwotCQlidWZmX3N0ZXAgPSAxMjg7Ci0JZWxzZQotCQkvKiBEb24ndCBlbmZvcmNlIHN0ZXBzIG9uIGJ1ZmZlciBzaXplcywgc3RpbGwgbmVlZCB0bwotCQkgICBiZSBtdWx0aXBsZSBvZiA0IGJ5dGVzIChIREEgc3BlYykuIFRlc3RlZCBvbiBJbnRlbAotCQkgICBIREEgY29udHJvbGxlcnMsIG1heSBub3Qgd29yayBvbiBhbGwgZGV2aWNlcyB3aGVyZQotCQkgICBvcHRpb24gbmVlZHMgdG8gYmUgZGlzYWJsZWQgKi8KLQkJYnVmZl9zdGVwID0gNDsKLQotCXNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsCi0JCQkJICAgYnVmZl9zdGVwKTsKLQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLAotCQkJCSAgIGJ1ZmZfc3RlcCk7Ci0Jc25kX2hkYV9wb3dlcl91cF9kM3dhaXQoYXBjbS0+Y29kZWMpOwotCWVyciA9IGhpbmZvLT5vcHMub3BlbihoaW5mbywgYXBjbS0+Y29kZWMsIHN1YnN0cmVhbSk7Ci0JaWYgKGVyciA8IDApIHsKLQkJYXp4X3JlbGVhc2VfZGV2aWNlKGF6eF9kZXYpOwotCQlzbmRfaGRhX3Bvd2VyX2Rvd24oYXBjbS0+Y29kZWMpOwotCQltdXRleF91bmxvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOwotCQlyZXR1cm4gZXJyOwotCX0KLQlzbmRfcGNtX2xpbWl0X2h3X3JhdGVzKHJ1bnRpbWUpOwotCS8qIHNhbml0eSBjaGVjayAqLwotCWlmIChzbmRfQlVHX09OKCFydW50aW1lLT5ody5jaGFubmVsc19taW4pIHx8Ci0JICAgIHNuZF9CVUdfT04oIXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCkgfHwKLQkgICAgc25kX0JVR19PTighcnVudGltZS0+aHcuZm9ybWF0cykgfHwKLQkgICAgc25kX0JVR19PTighcnVudGltZS0+aHcucmF0ZXMpKSB7Ci0JCWF6eF9yZWxlYXNlX2RldmljZShhenhfZGV2KTsKLQkJaGluZm8tPm9wcy5jbG9zZShoaW5mbywgYXBjbS0+Y29kZWMsIHN1YnN0cmVhbSk7Ci0JCXNuZF9oZGFfcG93ZXJfZG93bihhcGNtLT5jb2RlYyk7Ci0JCW11dGV4X3VubG9jaygmY2hpcC0+b3Blbl9tdXRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIGRpc2FibGUgV0FMTENMT0NLIHRpbWVzdGFtcHMgZm9yIGNhcHR1cmUgc3RyZWFtcwotCSAgIHVudGlsIHdlIGZpZ3VyZSBvdXQgaG93IHRvIGhhbmRsZSBkaWdpdGFsIGlucHV0cyAqLwotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCXJ1bnRpbWUtPmh3LmluZm8gJj0gflNORFJWX1BDTV9JTkZPX0hBU19XQUxMX0NMT0NLOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JYXp4X2Rldi0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwotCWF6eF9kZXYtPnJ1bm5pbmcgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0KLQlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBhenhfZGV2OwotCXNuZF9wY21fc2V0X3N5bmMoc3Vic3RyZWFtKTsKLQltdXRleF91bmxvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF6eF9wY21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbyA9IGFwY20tPmhpbmZvW3N1YnN0cmVhbS0+c3RyZWFtXTsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYXBjbS0+Y2hpcDsKLQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCW11dGV4X2xvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCWF6eF9kZXYtPnN1YnN0cmVhbSA9IE5VTEw7Ci0JYXp4X2Rldi0+cnVubmluZyA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlhenhfcmVsZWFzZV9kZXZpY2UoYXp4X2Rldik7Ci0JaGluZm8tPm9wcy5jbG9zZShoaW5mbywgYXBjbS0+Y29kZWMsIHN1YnN0cmVhbSk7Ci0Jc25kX2hkYV9wb3dlcl9kb3duKGFwY20tPmNvZGVjKTsKLQltdXRleF91bmxvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF6eF9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcykKLXsKLQlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYXBjbS0+Y2hpcDsKLQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7Ci0JaW50IHJldDsKLQotCWRzcF9sb2NrKGF6eF9kZXYpOwotCWlmIChkc3BfaXNfbG9ja2VkKGF6eF9kZXYpKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JbWFya19ydW50aW1lX3djKGNoaXAsIGF6eF9kZXYsIHN1YnN0cmVhbSwgZmFsc2UpOwotCWF6eF9kZXYtPmJ1ZnNpemUgPSAwOwotCWF6eF9kZXYtPnBlcmlvZF9ieXRlcyA9IDA7Ci0JYXp4X2Rldi0+Zm9ybWF0X3ZhbCA9IDA7Ci0JcmV0ID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwKLQkJCQkJcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byB1bmxvY2s7Ci0JbWFya19ydW50aW1lX3djKGNoaXAsIGF6eF9kZXYsIHN1YnN0cmVhbSwgdHJ1ZSk7Ci0gdW5sb2NrOgotCWRzcF91bmxvY2soYXp4X2Rldik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhenhfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOwotCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOwotCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSBhcGNtLT5oaW5mb1tzdWJzdHJlYW0tPnN0cmVhbV07Ci0KLQkvKiByZXNldCBCREwgYWRkcmVzcyAqLwotCWRzcF9sb2NrKGF6eF9kZXYpOwotCWlmICghZHNwX2lzX2xvY2tlZChhenhfZGV2KSkgewotCQlhenhfc2Rfd3JpdGVsKGF6eF9kZXYsIFNEX0JETFBMLCAwKTsKLQkJYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9CRExQVSwgMCk7Ci0JCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQ1RMLCAwKTsKLQkJYXp4X2Rldi0+YnVmc2l6ZSA9IDA7Ci0JCWF6eF9kZXYtPnBlcmlvZF9ieXRlcyA9IDA7Ci0JCWF6eF9kZXYtPmZvcm1hdF92YWwgPSAwOwotCX0KLQotCXNuZF9oZGFfY29kZWNfY2xlYW51cChhcGNtLT5jb2RlYywgaGluZm8sIHN1YnN0cmVhbSk7Ci0KLQltYXJrX3J1bnRpbWVfd2MoY2hpcCwgYXp4X2Rldiwgc3Vic3RyZWFtLCBmYWxzZSk7Ci0JYXp4X2Rldi0+cHJlcGFyZWQgPSAwOwotCWRzcF91bmxvY2soYXp4X2Rldik7Ci0JcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKLX0KLQotc3RhdGljIGludCBhenhfcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7Ci0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOwotCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSBhcGNtLT5oaW5mb1tzdWJzdHJlYW0tPnN0cmVhbV07Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQl1bnNpZ25lZCBpbnQgYnVmc2l6ZSwgcGVyaW9kX2J5dGVzLCBmb3JtYXRfdmFsLCBzdHJlYW1fdGFnOwotCWludCBlcnI7Ci0Jc3RydWN0IGhkYV9zcGRpZl9vdXQgKnNwZGlmID0KLQkJc25kX2hkYV9zcGRpZl9vdXRfb2ZfbmlkKGFwY20tPmNvZGVjLCBoaW5mby0+bmlkKTsKLQl1bnNpZ25lZCBzaG9ydCBjdGxzID0gc3BkaWYgPyBzcGRpZi0+Y3RscyA6IDA7Ci0KLQlkc3BfbG9jayhhenhfZGV2KTsKLQlpZiAoZHNwX2lzX2xvY2tlZChhenhfZGV2KSkgewotCQllcnIgPSAtRUJVU1k7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCWF6eF9zdHJlYW1fcmVzZXQoY2hpcCwgYXp4X2Rldik7Ci0JZm9ybWF0X3ZhbCA9IHNuZF9oZGFfY2FsY19zdHJlYW1fZm9ybWF0KHJ1bnRpbWUtPnJhdGUsCi0JCQkJCQlydW50aW1lLT5jaGFubmVscywKLQkJCQkJCXJ1bnRpbWUtPmZvcm1hdCwKLQkJCQkJCWhpbmZvLT5tYXhicHMsCi0JCQkJCQljdGxzKTsKLQlpZiAoIWZvcm1hdF92YWwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlgKLQkJCSAgICIlczogaW52YWxpZCBmb3JtYXRfdmFsLCByYXRlPSVkLCBjaD0lZCwgZm9ybWF0PSVkXG4iLAotCQkJICAgcGNpX25hbWUoY2hpcC0+cGNpKSwgcnVudGltZS0+cmF0ZSwgcnVudGltZS0+Y2hhbm5lbHMsIHJ1bnRpbWUtPmZvcm1hdCk7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCWJ1ZnNpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKLQlwZXJpb2RfYnl0ZXMgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKLQotCXNuZF9wcmludGRkKFNGWCAiJXM6IGF6eF9wY21fcHJlcGFyZTogYnVmc2l6ZT0weCV4LCBmb3JtYXQ9MHgleFxuIiwKLQkJICAgIHBjaV9uYW1lKGNoaXAtPnBjaSksIGJ1ZnNpemUsIGZvcm1hdF92YWwpOwotCi0JaWYgKGJ1ZnNpemUgIT0gYXp4X2Rldi0+YnVmc2l6ZSB8fAotCSAgICBwZXJpb2RfYnl0ZXMgIT0gYXp4X2Rldi0+cGVyaW9kX2J5dGVzIHx8Ci0JICAgIGZvcm1hdF92YWwgIT0gYXp4X2Rldi0+Zm9ybWF0X3ZhbCB8fAotCSAgICBydW50aW1lLT5ub19wZXJpb2Rfd2FrZXVwICE9IGF6eF9kZXYtPm5vX3BlcmlvZF93YWtldXApIHsKLQkJYXp4X2Rldi0+YnVmc2l6ZSA9IGJ1ZnNpemU7Ci0JCWF6eF9kZXYtPnBlcmlvZF9ieXRlcyA9IHBlcmlvZF9ieXRlczsKLQkJYXp4X2Rldi0+Zm9ybWF0X3ZhbCA9IGZvcm1hdF92YWw7Ci0JCWF6eF9kZXYtPm5vX3BlcmlvZF93YWtldXAgPSBydW50aW1lLT5ub19wZXJpb2Rfd2FrZXVwOwotCQllcnIgPSBhenhfc2V0dXBfcGVyaW9kcyhjaGlwLCBzdWJzdHJlYW0sIGF6eF9kZXYpOwotCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gdW5sb2NrOwotCX0KLQotCS8qIHdoZW4gTFBJQiBkZWxheSBjb3JyZWN0aW9uIGdpdmVzIGEgc21hbGwgbmVnYXRpdmUgdmFsdWUsCi0JICogd2UgaWdub3JlIGl0OyBjdXJyZW50bHkgc2V0IHRoZSB0aHJlc2hvbGQgc3RhdGljYWxseSB0bwotCSAqIDY0IGZyYW1lcwotCSAqLwotCWlmIChydW50aW1lLT5wZXJpb2Rfc2l6ZSA+IDY0KQotCQlhenhfZGV2LT5kZWxheV9uZWdhdGl2ZV90aHJlc2hvbGQgPSAtZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIDY0KTsKLQllbHNlCi0JCWF6eF9kZXYtPmRlbGF5X25lZ2F0aXZlX3RocmVzaG9sZCA9IDA7Ci0KLQkvKiB3YWxsY2xrIGhhcyAyNE1oeiBjbG9jayBzb3VyY2UgKi8KLQlhenhfZGV2LT5wZXJpb2Rfd2FsbGNsayA9ICgoKHJ1bnRpbWUtPnBlcmlvZF9zaXplICogMjQwMDApIC8KLQkJCQkJCXJ1bnRpbWUtPnJhdGUpICogMTAwMCk7Ci0JYXp4X3NldHVwX2NvbnRyb2xsZXIoY2hpcCwgYXp4X2Rldik7Ci0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCWF6eF9kZXYtPmZpZm9fc2l6ZSA9IGF6eF9zZF9yZWFkdyhhenhfZGV2LCBTRF9GSUZPU0laRSkgKyAxOwotCWVsc2UKLQkJYXp4X2Rldi0+Zmlmb19zaXplID0gMDsKLQotCXN0cmVhbV90YWcgPSBhenhfZGV2LT5zdHJlYW1fdGFnOwotCS8qIENBLUlCRyBjaGlwcyBuZWVkIHRoZSBwbGF5YmFjayBzdHJlYW0gc3RhcnRpbmcgZnJvbSAxICovCi0JaWYgKChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19DVFhfV09SS0FST1VORCkgJiYKLQkgICAgc3RyZWFtX3RhZyA+IGNoaXAtPmNhcHR1cmVfc3RyZWFtcykKLQkJc3RyZWFtX3RhZyAtPSBjaGlwLT5jYXB0dXJlX3N0cmVhbXM7Ci0JZXJyID0gc25kX2hkYV9jb2RlY19wcmVwYXJlKGFwY20tPmNvZGVjLCBoaW5mbywgc3RyZWFtX3RhZywKLQkJCQkgICAgIGF6eF9kZXYtPmZvcm1hdF92YWwsIHN1YnN0cmVhbSk7Ci0KLSB1bmxvY2s6Ci0JaWYgKCFlcnIpCi0JCWF6eF9kZXYtPnByZXBhcmVkID0gMTsKLQlkc3BfdW5sb2NrKGF6eF9kZXYpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgYXp4X3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQotewotCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOwotCXN0cnVjdCBhenhfZGV2ICphenhfZGV2OwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqczsKLQlpbnQgcnN0YXJ0ID0gMCwgc3RhcnQsIG5zeW5jID0gMCwgc2JpdHMgPSAwOwotCWludCBud2FpdCwgdGltZW91dDsKLQotCWF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOwotCXRyYWNlX2F6eF9wY21fdHJpZ2dlcihjaGlwLCBhenhfZGV2LCBjbWQpOwotCi0JaWYgKGRzcF9pc19sb2NrZWQoYXp4X2RldikgfHwgIWF6eF9kZXYtPnByZXBhcmVkKQotCQlyZXR1cm4gLUVQSVBFOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgotCQlyc3RhcnQgPSAxOwotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKLQkJc3RhcnQgPSAxOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQkJc3RhcnQgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgewotCQlpZiAocy0+cGNtLT5jYXJkICE9IHN1YnN0cmVhbS0+cGNtLT5jYXJkKQotCQkJY29udGludWU7Ci0JCWF6eF9kZXYgPSBnZXRfYXp4X2RldihzKTsKLQkJc2JpdHMgfD0gMSA8PCBhenhfZGV2LT5pbmRleDsKLQkJbnN5bmMrKzsKLQkJc25kX3BjbV90cmlnZ2VyX2RvbmUocywgc3Vic3RyZWFtKTsKLQl9Ci0KLQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQotCS8qIGZpcnN0LCBzZXQgU1lOQyBiaXRzIG9mIGNvcnJlc3BvbmRpbmcgc3RyZWFtcyAqLwotCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19PTERfU1NZTkMpCi0JCWF6eF93cml0ZWwoY2hpcCwgT0xEX1NTWU5DLAotCQkJYXp4X3JlYWRsKGNoaXAsIE9MRF9TU1lOQykgfCBzYml0cyk7Ci0JZWxzZQotCQlhenhfd3JpdGVsKGNoaXAsIFNTWU5DLCBhenhfcmVhZGwoY2hpcCwgU1NZTkMpIHwgc2JpdHMpOwotCi0Jc25kX3BjbV9ncm91cF9mb3JfZWFjaF9lbnRyeShzLCBzdWJzdHJlYW0pIHsKLQkJaWYgKHMtPnBjbS0+Y2FyZCAhPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZCkKLQkJCWNvbnRpbnVlOwotCQlhenhfZGV2ID0gZ2V0X2F6eF9kZXYocyk7Ci0JCWlmIChzdGFydCkgewotCQkJYXp4X2Rldi0+c3RhcnRfd2FsbGNsayA9IGF6eF9yZWFkbChjaGlwLCBXQUxMQ0xLKTsKLQkJCWlmICghcnN0YXJ0KQotCQkJCWF6eF9kZXYtPnN0YXJ0X3dhbGxjbGsgLT0KLQkJCQkJCWF6eF9kZXYtPnBlcmlvZF93YWxsY2xrOwotCQkJYXp4X3N0cmVhbV9zdGFydChjaGlwLCBhenhfZGV2KTsKLQkJfSBlbHNlIHsKLQkJCWF6eF9zdHJlYW1fc3RvcChjaGlwLCBhenhfZGV2KTsKLQkJfQotCQlhenhfZGV2LT5ydW5uaW5nID0gc3RhcnQ7Ci0JfQotCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JaWYgKHN0YXJ0KSB7Ci0JCS8qIHdhaXQgdW50aWwgYWxsIEZJRk9zIGdldCByZWFkeSAqLwotCQlmb3IgKHRpbWVvdXQgPSA1MDAwOyB0aW1lb3V0OyB0aW1lb3V0LS0pIHsKLQkJCW53YWl0ID0gMDsKLQkJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7Ci0JCQkJaWYgKHMtPnBjbS0+Y2FyZCAhPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZCkKLQkJCQkJY29udGludWU7Ci0JCQkJYXp4X2RldiA9IGdldF9henhfZGV2KHMpOwotCQkJCWlmICghKGF6eF9zZF9yZWFkYihhenhfZGV2LCBTRF9TVFMpICYKLQkJCQkgICAgICBTRF9TVFNfRklGT19SRUFEWSkpCi0JCQkJCW53YWl0Kys7Ci0JCQl9Ci0JCQlpZiAoIW53YWl0KQotCQkJCWJyZWFrOwotCQkJY3B1X3JlbGF4KCk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiB3YWl0IHVudGlsIGFsbCBSVU4gYml0cyBhcmUgY2xlYXJlZCAqLwotCQlmb3IgKHRpbWVvdXQgPSA1MDAwOyB0aW1lb3V0OyB0aW1lb3V0LS0pIHsKLQkJCW53YWl0ID0gMDsKLQkJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7Ci0JCQkJaWYgKHMtPnBjbS0+Y2FyZCAhPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZCkKLQkJCQkJY29udGludWU7Ci0JCQkJYXp4X2RldiA9IGdldF9henhfZGV2KHMpOwotCQkJCWlmIChhenhfc2RfcmVhZGIoYXp4X2RldiwgU0RfQ1RMKSAmCi0JCQkJICAgIFNEX0NUTF9ETUFfU1RBUlQpCi0JCQkJCW53YWl0Kys7Ci0JCQl9Ci0JCQlpZiAoIW53YWl0KQotCQkJCWJyZWFrOwotCQkJY3B1X3JlbGF4KCk7Ci0JCX0KLQl9Ci0Jc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JLyogcmVzZXQgU1lOQyBiaXRzICovCi0JaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX09MRF9TU1lOQykKLQkJYXp4X3dyaXRlbChjaGlwLCBPTERfU1NZTkMsCi0JCQlhenhfcmVhZGwoY2hpcCwgT0xEX1NTWU5DKSAmIH5zYml0cyk7Ci0JZWxzZQotCQlhenhfd3JpdGVsKGNoaXAsIFNTWU5DLCBhenhfcmVhZGwoY2hpcCwgU1NZTkMpICYgfnNiaXRzKTsKLQlpZiAoc3RhcnQpIHsKLQkJYXp4X3RpbWVjb3VudGVyX2luaXQoc3Vic3RyZWFtLCAwLCAwKTsKLQkJaWYgKG5zeW5jID4gMSkgewotCQkJY3ljbGVfdCBjeWNsZV9sYXN0OwotCi0JCQkvKiBzYW1lIHN0YXJ0IGN5Y2xlIGZvciBtYXN0ZXIgYW5kIGdyb3VwICovCi0JCQlhenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKLQkJCWN5Y2xlX2xhc3QgPSBhenhfZGV2LT5henhfdGMuY3ljbGVfbGFzdDsKLQotCQkJc25kX3BjbV9ncm91cF9mb3JfZWFjaF9lbnRyeShzLCBzdWJzdHJlYW0pIHsKLQkJCQlpZiAocy0+cGNtLT5jYXJkICE9IHN1YnN0cmVhbS0+cGNtLT5jYXJkKQotCQkJCQljb250aW51ZTsKLQkJCQlhenhfdGltZWNvdW50ZXJfaW5pdChzLCAxLCBjeWNsZV9sYXN0KTsKLQkJCX0KLQkJfQotCX0KLQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwotCXJldHVybiAwOwotfQotCi0vKiBnZXQgdGhlIGN1cnJlbnQgRE1BIHBvc2l0aW9uIHdpdGggY29ycmVjdGlvbiBvbiBWSUEgY2hpcHMgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X3ZpYV9nZXRfcG9zaXRpb24oc3RydWN0IGF6eCAqY2hpcCwKLQkJCQkJIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KQotewotCXVuc2lnbmVkIGludCBsaW5rX3BvcywgbWluaV9wb3MsIGJvdW5kX3BvczsKLQl1bnNpZ25lZCBpbnQgbW9kX2xpbmtfcG9zLCBtb2RfZG1hX3BvcywgbW9kX21pbmlfcG9zOwotCXVuc2lnbmVkIGludCBmaWZvX3NpemU7Ci0KLQlsaW5rX3BvcyA9IGF6eF9zZF9yZWFkbChhenhfZGV2LCBTRF9MUElCKTsKLQlpZiAoYXp4X2Rldi0+c3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQkvKiBQbGF5YmFjaywgbm8gcHJvYmxlbSB1c2luZyBsaW5rIHBvc2l0aW9uICovCi0JCXJldHVybiBsaW5rX3BvczsKLQl9Ci0KLQkvKiBDYXB0dXJlICovCi0JLyogRm9yIG5ldyBjaGlwc2V0LAotCSAqIHVzZSBtb2QgdG8gZ2V0IHRoZSBETUEgcG9zaXRpb24ganVzdCBsaWtlIG9sZCBjaGlwc2V0Ci0JICovCi0JbW9kX2RtYV9wb3MgPSBsZTMyX3RvX2NwdSgqYXp4X2Rldi0+cG9zYnVmKTsKLQltb2RfZG1hX3BvcyAlPSBhenhfZGV2LT5wZXJpb2RfYnl0ZXM7Ci0KLQkvKiBhenhfZGV2LT5maWZvX3NpemUgY2FuJ3QgZ2V0IEZJRk8gc2l6ZSBvZiBpbiBzdHJlYW0uCi0JICogR2V0IGZyb20gYmFzZSBhZGRyZXNzICsgb2Zmc2V0LgotCSAqLwotCWZpZm9fc2l6ZSA9IHJlYWR3KGNoaXAtPnJlbWFwX2FkZHIgKyBWSUFfSU5fU1RSRUFNMF9GSUZPX1NJWkVfT0ZGU0VUKTsKLQotCWlmIChhenhfZGV2LT5pbnN1ZmZpY2llbnQpIHsKLQkJLyogTGluayBwb3NpdGlvbiBuZXZlciBnYXRoZXIgdGhhbiBGSUZPIHNpemUgKi8KLQkJaWYgKGxpbmtfcG9zIDw9IGZpZm9fc2l6ZSkKLQkJCXJldHVybiAwOwotCi0JCWF6eF9kZXYtPmluc3VmZmljaWVudCA9IDA7Ci0JfQotCi0JaWYgKGxpbmtfcG9zIDw9IGZpZm9fc2l6ZSkKLQkJbWluaV9wb3MgPSBhenhfZGV2LT5idWZzaXplICsgbGlua19wb3MgLSBmaWZvX3NpemU7Ci0JZWxzZQotCQltaW5pX3BvcyA9IGxpbmtfcG9zIC0gZmlmb19zaXplOwotCi0JLyogRmluZCBuZWFyZXN0IHByZXZpb3VzIGJvdWRhcnkgKi8KLQltb2RfbWluaV9wb3MgPSBtaW5pX3BvcyAlIGF6eF9kZXYtPnBlcmlvZF9ieXRlczsKLQltb2RfbGlua19wb3MgPSBsaW5rX3BvcyAlIGF6eF9kZXYtPnBlcmlvZF9ieXRlczsKLQlpZiAobW9kX2xpbmtfcG9zID49IGZpZm9fc2l6ZSkKLQkJYm91bmRfcG9zID0gbGlua19wb3MgLSBtb2RfbGlua19wb3M7Ci0JZWxzZSBpZiAobW9kX2RtYV9wb3MgPj0gbW9kX21pbmlfcG9zKQotCQlib3VuZF9wb3MgPSBtaW5pX3BvcyAtIG1vZF9taW5pX3BvczsKLQllbHNlIHsKLQkJYm91bmRfcG9zID0gbWluaV9wb3MgLSBtb2RfbWluaV9wb3MgKyBhenhfZGV2LT5wZXJpb2RfYnl0ZXM7Ci0JCWlmIChib3VuZF9wb3MgPj0gYXp4X2Rldi0+YnVmc2l6ZSkKLQkJCWJvdW5kX3BvcyA9IDA7Ci0JfQotCi0JLyogQ2FsY3VsYXRlIHJlYWwgRE1BIHBvc2l0aW9uIHdlIHdhbnQgKi8KLQlyZXR1cm4gYm91bmRfcG9zICsgbW9kX2RtYV9wb3M7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X2dldF9wb3NpdGlvbihzdHJ1Y3QgYXp4ICpjaGlwLAotCQkJCSAgICAgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYsCi0JCQkJICAgICBib29sIHdpdGhfY2hlY2spCi17Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBhenhfZGV2LT5zdWJzdHJlYW07Ci0Jc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0JdW5zaWduZWQgaW50IHBvczsKLQlpbnQgc3RyZWFtID0gc3Vic3RyZWFtLT5zdHJlYW07Ci0Jc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbyA9IGFwY20tPmhpbmZvW3N0cmVhbV07Ci0JaW50IGRlbGF5ID0gMDsKLQotCXN3aXRjaCAoY2hpcC0+cG9zaXRpb25fZml4W3N0cmVhbV0pIHsKLQljYXNlIFBPU19GSVhfTFBJQjoKLQkJLyogcmVhZCBMUElCICovCi0JCXBvcyA9IGF6eF9zZF9yZWFkbChhenhfZGV2LCBTRF9MUElCKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1NfRklYX1ZJQUNPTUJPOgotCQlwb3MgPSBhenhfdmlhX2dldF9wb3NpdGlvbihjaGlwLCBhenhfZGV2KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJLyogdXNlIHRoZSBwb3NpdGlvbiBidWZmZXIgKi8KLQkJcG9zID0gbGUzMl90b19jcHUoKmF6eF9kZXYtPnBvc2J1Zik7Ci0JCWlmICh3aXRoX2NoZWNrICYmIGNoaXAtPnBvc2l0aW9uX2ZpeFtzdHJlYW1dID09IFBPU19GSVhfQVVUTykgewotCQkJaWYgKCFwb3MgfHwgcG9zID09ICh1MzIpLTEpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJICAgICAgICJoZGEtaW50ZWw6IEludmFsaWQgcG9zaXRpb24gYnVmZmVyLCAiCi0JCQkJICAgICAgICJ1c2luZyBMUElCIHJlYWQgbWV0aG9kIGluc3RlYWQuXG4iKTsKLQkJCQljaGlwLT5wb3NpdGlvbl9maXhbc3RyZWFtXSA9IFBPU19GSVhfTFBJQjsKLQkJCQlwb3MgPSBhenhfc2RfcmVhZGwoYXp4X2RldiwgU0RfTFBJQik7Ci0JCQl9IGVsc2UKLQkJCQljaGlwLT5wb3NpdGlvbl9maXhbc3RyZWFtXSA9IFBPU19GSVhfUE9TQlVGOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWlmIChwb3MgPj0gYXp4X2Rldi0+YnVmc2l6ZSkKLQkJcG9zID0gMDsKLQotCS8qIGNhbGN1bGF0ZSBydW50aW1lIGRlbGF5IGZyb20gTFBJQiAqLwotCWlmIChzdWJzdHJlYW0tPnJ1bnRpbWUgJiYKLQkgICAgY2hpcC0+cG9zaXRpb25fZml4W3N0cmVhbV0gPT0gUE9TX0ZJWF9QT1NCVUYgJiYKLQkgICAgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX0NPVU5UX0xQSUJfREVMQVkpKSB7Ci0JCXVuc2lnbmVkIGludCBscGliX3BvcyA9IGF6eF9zZF9yZWFkbChhenhfZGV2LCBTRF9MUElCKTsKLQkJaWYgKHN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQkJZGVsYXkgPSBwb3MgLSBscGliX3BvczsKLQkJZWxzZQotCQkJZGVsYXkgPSBscGliX3BvcyAtIHBvczsKLQkJaWYgKGRlbGF5IDwgMCkgewotCQkJaWYgKGRlbGF5ID49IGF6eF9kZXYtPmRlbGF5X25lZ2F0aXZlX3RocmVzaG9sZCkKLQkJCQlkZWxheSA9IDA7Ci0JCQllbHNlCi0JCQkJZGVsYXkgKz0gYXp4X2Rldi0+YnVmc2l6ZTsKLQkJfQotCQlpZiAoZGVsYXkgPj0gYXp4X2Rldi0+cGVyaW9kX2J5dGVzKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyBTRlgKLQkJCQkgICAiJXM6IFVuc3RhYmxlIExQSUIgKCVkID49ICVkKTsgIgotCQkJCSAgICJkaXNhYmxpbmcgTFBJQiBkZWxheSBjb3VudGluZ1xuIiwKLQkJCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpLCBkZWxheSwgYXp4X2Rldi0+cGVyaW9kX2J5dGVzKTsKLQkJCWRlbGF5ID0gMDsKLQkJCWNoaXAtPmRyaXZlcl9jYXBzICY9IH5BWlhfRENBUFNfQ09VTlRfTFBJQl9ERUxBWTsKLQkJfQotCQlkZWxheSA9IGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIGRlbGF5KTsKLQl9Ci0KLQlpZiAoc3Vic3RyZWFtLT5ydW50aW1lKSB7Ci0JCWlmIChoaW5mby0+b3BzLmdldF9kZWxheSkKLQkJCWRlbGF5ICs9IGhpbmZvLT5vcHMuZ2V0X2RlbGF5KGhpbmZvLCBhcGNtLT5jb2RlYywKLQkJCQkJCSAgICAgIHN1YnN0cmVhbSk7Ci0JCXN1YnN0cmVhbS0+cnVudGltZS0+ZGVsYXkgPSBkZWxheTsKLQl9Ci0KLQl0cmFjZV9henhfZ2V0X3Bvc2l0aW9uKGNoaXAsIGF6eF9kZXYsIHBvcywgZGVsYXkpOwotCXJldHVybiBwb3M7Ci19Ci0KLXN0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBhenhfcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7Ci0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOwotCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLAotCQkJICAgICAgIGF6eF9nZXRfcG9zaXRpb24oY2hpcCwgYXp4X2RldiwgZmFsc2UpKTsKIH0KIAogLyoKQEAgLTI1MjEsNyArNDU0LDcgQEAKIAlpZiAod2FsbGNsayA8IChhenhfZGV2LT5wZXJpb2Rfd2FsbGNsayAqIDUpIC8gNCAmJgogCSAgICBwb3MgJSBhenhfZGV2LT5wZXJpb2RfYnl0ZXMgPiBhenhfZGV2LT5wZXJpb2RfYnl0ZXMgLyAyKQogCQkvKiBORyAtIGl0J3MgYmVsb3cgdGhlIGZpcnN0IG5leHQgcGVyaW9kIGJvdW5kYXJ5ICovCi0JCXJldHVybiBiZGxfcG9zX2FkaltjaGlwLT5kZXZfaW5kZXhdID8gMCA6IC0xOworCQlyZXR1cm4gY2hpcC0+YmRsX3Bvc19hZGpbY2hpcC0+ZGV2X2luZGV4XSA/IDAgOiAtMTsKIAlhenhfZGV2LT5zdGFydF93YWxsY2xrICs9IHdhbGxjbGs7CiAJcmV0dXJuIDE7IC8qIE9LLCBpdCdzIGZpbmUgKi8KIH0KQEAgLTI1MzUsMTAgKzQ2OCw5IEBACiAJaW50IGksIHBlbmRpbmcsIG9rOwogCiAJaWYgKCFjaGlwLT5pcnFfcGVuZGluZ193YXJuZWQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgImhkYS1pbnRlbDogSVJRIHRpbWluZyB3b3JrYXJvdW5kIGlzIGFjdGl2YXRlZCAiCi0JCSAgICAgICAiZm9yIGNhcmQgIyVkLiBTdWdnZXN0IGEgYmlnZ2VyIGJkbF9wb3NfYWRqLlxuIiwKLQkJICAgICAgIGNoaXAtPmNhcmQtPm51bWJlcik7CisJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJCSAiSVJRIHRpbWluZyB3b3JrYXJvdW5kIGlzIGFjdGl2YXRlZCBmb3IgY2FyZCAjJWQuIFN1Z2dlc3QgYSBiaWdnZXIgYmRsX3Bvc19hZGouXG4iLAorCQkJIGNoaXAtPmNhcmQtPm51bWJlcik7CiAJCWNoaXAtPmlycV9wZW5kaW5nX3dhcm5lZCA9IDE7CiAJfQogCkBAIC0yNTgwLDEzOSArNTEyLDE0IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CiB9CiAKLSNpZmRlZiBDT05GSUdfWDg2Ci1zdGF0aWMgaW50IGF6eF9wY21fbW1hcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSkKLXsKLQlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYXBjbS0+Y2hpcDsKLQlpZiAoIWF6eF9zbm9vcChjaGlwKSkKLQkJYXJlYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZShhcmVhLT52bV9wYWdlX3Byb3QpOwotCXJldHVybiBzbmRfcGNtX2xpYl9kZWZhdWx0X21tYXAoc3Vic3RyZWFtLCBhcmVhKTsKLX0KLSNlbHNlCi0jZGVmaW5lIGF6eF9wY21fbW1hcAlOVUxMCi0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBhenhfcGNtX29wcyA9IHsKLQkub3BlbiA9IGF6eF9wY21fb3BlbiwKLQkuY2xvc2UgPSBhenhfcGNtX2Nsb3NlLAotCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLAotCS5od19wYXJhbXMgPSBhenhfcGNtX2h3X3BhcmFtcywKLQkuaHdfZnJlZSA9IGF6eF9wY21faHdfZnJlZSwKLQkucHJlcGFyZSA9IGF6eF9wY21fcHJlcGFyZSwKLQkudHJpZ2dlciA9IGF6eF9wY21fdHJpZ2dlciwKLQkucG9pbnRlciA9IGF6eF9wY21fcG9pbnRlciwKLQkud2FsbF9jbG9jayA9ICBhenhfZ2V0X3dhbGxjbG9ja190c3RhbXAsCi0JLm1tYXAgPSBhenhfcGNtX21tYXAsCi0JLnBhZ2UgPSBzbmRfcGNtX3NnYnVmX29wc19wYWdlLAotfTsKLQotc3RhdGljIHZvaWQgYXp4X3BjbV9mcmVlKHN0cnVjdCBzbmRfcGNtICpwY20pCi17Ci0Jc3RydWN0IGF6eF9wY20gKmFwY20gPSBwY20tPnByaXZhdGVfZGF0YTsKLQlpZiAoYXBjbSkgewotCQlsaXN0X2RlbCgmYXBjbS0+bGlzdCk7Ci0JCWtmcmVlKGFwY20pOwotCX0KLX0KLQotI2RlZmluZSBNQVhfUFJFQUxMT0NfU0laRQkoMzIgKiAxMDI0ICogMTAyNCkKLQotc3RhdGljIGludAotYXp4X2F0dGFjaF9wY21fc3RyZWFtKHN0cnVjdCBoZGFfYnVzICpidXMsIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkgICAgICBzdHJ1Y3QgaGRhX3BjbSAqY3BjbSkKLXsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9wY20gKnBjbTsKLQlzdHJ1Y3QgYXp4X3BjbSAqYXBjbTsKLQlpbnQgcGNtX2RldiA9IGNwY20tPmRldmljZTsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQlpbnQgcywgZXJyOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShhcGNtLCAmY2hpcC0+cGNtX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGFwY20tPnBjbS0+ZGV2aWNlID09IHBjbV9kZXYpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYICIlczogUENNICVkIGFscmVhZHkgZXhpc3RzXG4iLAotCQkJCSAgIHBjaV9uYW1lKGNoaXAtPnBjaSksIHBjbV9kZXYpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCX0KLQllcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCBjcGNtLT5uYW1lLCBwY21fZGV2LAotCQkJICBjcGNtLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtcywKLQkJCSAgY3BjbS0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtcywKLQkJCSAgJnBjbSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0Jc3RybGNweShwY20tPm5hbWUsIGNwY20tPm5hbWUsIHNpemVvZihwY20tPm5hbWUpKTsKLQlhcGNtID0ga3phbGxvYyhzaXplb2YoKmFwY20pLCBHRlBfS0VSTkVMKTsKLQlpZiAoYXBjbSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQlhcGNtLT5jaGlwID0gY2hpcDsKLQlhcGNtLT5wY20gPSBwY207Ci0JYXBjbS0+Y29kZWMgPSBjb2RlYzsKLQlwY20tPnByaXZhdGVfZGF0YSA9IGFwY207Ci0JcGNtLT5wcml2YXRlX2ZyZWUgPSBhenhfcGNtX2ZyZWU7Ci0JaWYgKGNwY20tPnBjbV90eXBlID09IEhEQV9QQ01fVFlQRV9NT0RFTSkKLQkJcGNtLT5kZXZfY2xhc3MgPSBTTkRSVl9QQ01fQ0xBU1NfTU9ERU07Ci0JbGlzdF9hZGRfdGFpbCgmYXBjbS0+bGlzdCwgJmNoaXAtPnBjbV9saXN0KTsKLQljcGNtLT5wY20gPSBwY207Ci0JZm9yIChzID0gMDsgcyA8IDI7IHMrKykgewotCQlhcGNtLT5oaW5mb1tzXSA9ICZjcGNtLT5zdHJlYW1bc107Ci0JCWlmIChjcGNtLT5zdHJlYW1bc10uc3Vic3RyZWFtcykKLQkJCXNuZF9wY21fc2V0X29wcyhwY20sIHMsICZhenhfcGNtX29wcyk7Ci0JfQotCS8qIGJ1ZmZlciBwcmUtYWxsb2NhdGlvbiAqLwotCXNpemUgPSBDT05GSUdfU05EX0hEQV9QUkVBTExPQ19TSVpFICogMTAyNDsKLQlpZiAoc2l6ZSA+IE1BWF9QUkVBTExPQ19TSVpFKQotCQlzaXplID0gTUFYX1BSRUFMTE9DX1NJWkU7Ci0Jc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFVl9TRywKLQkJCQkJICAgICAgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAotCQkJCQkgICAgICBzaXplLCBNQVhfUFJFQUxMT0NfU0laRSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBtaXhlciBjcmVhdGlvbiAtIGFsbCBzdHVmZiBpcyBpbXBsZW1lbnRlZCBpbiBoZGEgbW9kdWxlCi0gKi8KLXN0YXRpYyBpbnQgYXp4X21peGVyX2NyZWF0ZShzdHJ1Y3QgYXp4ICpjaGlwKQotewotCXJldHVybiBzbmRfaGRhX2J1aWxkX2NvbnRyb2xzKGNoaXAtPmJ1cyk7Ci19Ci0KLQotLyoKLSAqIGluaXRpYWxpemUgU0Qgc3RyZWFtcwotICovCi1zdGF0aWMgaW50IGF6eF9pbml0X3N0cmVhbShzdHJ1Y3QgYXp4ICpjaGlwKQotewotCWludCBpOwotCi0JLyogaW5pdGlhbGl6ZSBlYWNoIHN0cmVhbSAoYWthIGRldmljZSkKLQkgKiBhc3NpZ24gdGhlIHN0YXJ0aW5nIGJkbCBhZGRyZXNzIHRvIGVhY2ggc3RyZWFtIChkZXZpY2UpCi0JICogYW5kIGluaXRpYWxpemUKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3N0cmVhbXM7IGkrKykgewotCQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9ICZjaGlwLT5henhfZGV2W2ldOwotCQlhenhfZGV2LT5wb3NidWYgPSAodTMyIF9faW9tZW0gKikoY2hpcC0+cG9zYnVmLmFyZWEgKyBpICogOCk7Ci0JCS8qIG9mZnNldDogU0RJMD0weDgwLCBTREkxPTB4YTAsIC4uLiBTRE8zPTB4MTYwICovCi0JCWF6eF9kZXYtPnNkX2FkZHIgPSBjaGlwLT5yZW1hcF9hZGRyICsgKDB4MjAgKiBpICsgMHg4MCk7Ci0JCS8qIGludCBtYXNrOiBTREkwPTB4MDEsIFNESTE9MHgwMiwgLi4uIFNETzM9MHg4MCAqLwotCQlhenhfZGV2LT5zZF9pbnRfc3RhX21hc2sgPSAxIDw8IGk7Ci0JCS8qIHN0cmVhbSB0YWc6IG11c3QgYmUgbm9uLXplcm8gYW5kIHVuaXF1ZSAqLwotCQlhenhfZGV2LT5pbmRleCA9IGk7Ci0JCWF6eF9kZXYtPnN0cmVhbV90YWcgPSBpICsgMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBhenhfYWNxdWlyZV9pcnEoc3RydWN0IGF6eCAqY2hpcCwgaW50IGRvX2Rpc2Nvbm5lY3QpCiB7CiAJaWYgKHJlcXVlc3RfaXJxKGNoaXAtPnBjaS0+aXJxLCBhenhfaW50ZXJydXB0LAogCQkJY2hpcC0+bXNpID8gMCA6IElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaGRhLWludGVsOiB1bmFibGUgdG8gZ3JhYiBJUlEgJWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iLCBjaGlwLT5wY2ktPmlycSk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInVuYWJsZSB0byBncmFiIElSUSAlZCwgZGlzYWJsaW5nIGRldmljZVxuIiwKKwkJCWNoaXAtPnBjaS0+aXJxKTsKIAkJaWYgKGRvX2Rpc2Nvbm5lY3QpCiAJCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNoaXAtPmNhcmQpOwogCQlyZXR1cm4gLTE7CkBAIC0yNzIyLDE2MCArNTI5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgdm9pZCBhenhfc3RvcF9jaGlwKHN0cnVjdCBhenggKmNoaXApCi17Ci0JaWYgKCFjaGlwLT5pbml0aWFsaXplZCkKLQkJcmV0dXJuOwotCi0JLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0JYXp4X2ludF9kaXNhYmxlKGNoaXApOwotCWF6eF9pbnRfY2xlYXIoY2hpcCk7Ci0KLQkvKiBkaXNhYmxlIENPUkIvUklSQiAqLwotCWF6eF9mcmVlX2NtZF9pbyhjaGlwKTsKLQotCS8qIGRpc2FibGUgcG9zaXRpb24gYnVmZmVyICovCi0JYXp4X3dyaXRlbChjaGlwLCBEUExCQVNFLCAwKTsKLQlhenhfd3JpdGVsKGNoaXAsIERQVUJBU0UsIDApOwotCi0JY2hpcC0+aW5pdGlhbGl6ZWQgPSAwOwotfQotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfRFNQX0xPQURFUgotLyoKLSAqIERTUCBsb2FkaW5nIGNvZGUgKGUuZy4gZm9yIENBMDEzMikKLSAqLwotCi0vKiB1c2UgdGhlIGZpcnN0IHN0cmVhbSBmb3IgbG9hZGluZyBEU1AgKi8KLXN0YXRpYyBzdHJ1Y3QgYXp4X2RldiAqCi1henhfZ2V0X2RzcF9sb2FkZXJfZGV2KHN0cnVjdCBhenggKmNoaXApCi17Ci0JcmV0dXJuICZjaGlwLT5henhfZGV2W2NoaXAtPnBsYXliYWNrX2luZGV4X29mZnNldF07Ci19Ci0KLXN0YXRpYyBpbnQgYXp4X2xvYWRfZHNwX3ByZXBhcmUoc3RydWN0IGhkYV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGZvcm1hdCwKLQkJCQl1bnNpZ25lZCBpbnQgYnl0ZV9zaXplLAotCQkJCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmcCkKLXsKLQl1MzIgKmJkbDsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXY7Ci0JaW50IGVycjsKLQotCWF6eF9kZXYgPSBhenhfZ2V0X2RzcF9sb2FkZXJfZGV2KGNoaXApOwotCi0JZHNwX2xvY2soYXp4X2Rldik7Ci0Jc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCWlmIChhenhfZGV2LT5ydW5uaW5nIHx8IGF6eF9kZXYtPmxvY2tlZCkgewotCQlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQkJZXJyID0gLUVCVVNZOwotCQlnb3RvIHVubG9jazsKLQl9Ci0JYXp4X2Rldi0+cHJlcGFyZWQgPSAwOwotCWNoaXAtPnNhdmVkX2F6eF9kZXYgPSAqYXp4X2RldjsKLQlhenhfZGV2LT5sb2NrZWQgPSAxOwotCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCi0JZXJyID0gc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVZfU0csCi0JCQkJICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCi0JCQkJICBieXRlX3NpemUsIGJ1ZnApOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGVycl9hbGxvYzsKLQotCW1hcmtfcGFnZXNfd2MoY2hpcCwgYnVmcCwgdHJ1ZSk7Ci0JYXp4X2Rldi0+YnVmc2l6ZSA9IGJ5dGVfc2l6ZTsKLQlhenhfZGV2LT5wZXJpb2RfYnl0ZXMgPSBieXRlX3NpemU7Ci0JYXp4X2Rldi0+Zm9ybWF0X3ZhbCA9IGZvcm1hdDsKLQotCWF6eF9zdHJlYW1fcmVzZXQoY2hpcCwgYXp4X2Rldik7Ci0KLQkvKiByZXNldCBCREwgYWRkcmVzcyAqLwotCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQkRMUEwsIDApOwotCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQkRMUFUsIDApOwotCi0JYXp4X2Rldi0+ZnJhZ3MgPSAwOwotCWJkbCA9ICh1MzIgKilhenhfZGV2LT5iZGwuYXJlYTsKLQllcnIgPSBzZXR1cF9iZGxlKGNoaXAsIGJ1ZnAsIGF6eF9kZXYsICZiZGwsIDAsIGJ5dGVfc2l6ZSwgMCk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlhenhfc2V0dXBfY29udHJvbGxlcihjaGlwLCBhenhfZGV2KTsKLQlkc3BfdW5sb2NrKGF6eF9kZXYpOwotCXJldHVybiBhenhfZGV2LT5zdHJlYW1fdGFnOwotCi0gZXJyb3I6Ci0JbWFya19wYWdlc193YyhjaGlwLCBidWZwLCBmYWxzZSk7Ci0Jc25kX2RtYV9mcmVlX3BhZ2VzKGJ1ZnApOwotIGVycl9hbGxvYzoKLQlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Ci0JaWYgKGF6eF9kZXYtPm9wZW5lZCkKLQkJKmF6eF9kZXYgPSBjaGlwLT5zYXZlZF9henhfZGV2OwotCWF6eF9kZXYtPmxvY2tlZCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Ci0gdW5sb2NrOgotCWRzcF91bmxvY2soYXp4X2Rldik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgYXp4X2xvYWRfZHNwX3RyaWdnZXIoc3RydWN0IGhkYV9idXMgKmJ1cywgYm9vbCBzdGFydCkKLXsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBhenhfZ2V0X2RzcF9sb2FkZXJfZGV2KGNoaXApOwotCi0JaWYgKHN0YXJ0KQotCQlhenhfc3RyZWFtX3N0YXJ0KGNoaXAsIGF6eF9kZXYpOwotCWVsc2UKLQkJYXp4X3N0cmVhbV9zdG9wKGNoaXAsIGF6eF9kZXYpOwotCWF6eF9kZXYtPnJ1bm5pbmcgPSBzdGFydDsKLX0KLQotc3RhdGljIHZvaWQgYXp4X2xvYWRfZHNwX2NsZWFudXAoc3RydWN0IGhkYV9idXMgKmJ1cywKLQkJCQkgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFiKQotewotCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGF6eF9nZXRfZHNwX2xvYWRlcl9kZXYoY2hpcCk7Ci0KLQlpZiAoIWRtYWItPmFyZWEgfHwgIWF6eF9kZXYtPmxvY2tlZCkKLQkJcmV0dXJuOwotCi0JZHNwX2xvY2soYXp4X2Rldik7Ci0JLyogcmVzZXQgQkRMIGFkZHJlc3MgKi8KLQlhenhfc2Rfd3JpdGVsKGF6eF9kZXYsIFNEX0JETFBMLCAwKTsKLQlhenhfc2Rfd3JpdGVsKGF6eF9kZXYsIFNEX0JETFBVLCAwKTsKLQlhenhfc2Rfd3JpdGVsKGF6eF9kZXYsIFNEX0NUTCwgMCk7Ci0JYXp4X2Rldi0+YnVmc2l6ZSA9IDA7Ci0JYXp4X2Rldi0+cGVyaW9kX2J5dGVzID0gMDsKLQlhenhfZGV2LT5mb3JtYXRfdmFsID0gMDsKLQotCW1hcmtfcGFnZXNfd2MoY2hpcCwgZG1hYiwgZmFsc2UpOwotCXNuZF9kbWFfZnJlZV9wYWdlcyhkbWFiKTsKLQlkbWFiLT5hcmVhID0gTlVMTDsKLQotCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQlpZiAoYXp4X2Rldi0+b3BlbmVkKQotCQkqYXp4X2RldiA9IGNoaXAtPnNhdmVkX2F6eF9kZXY7Ci0JYXp4X2Rldi0+bG9ja2VkID0gMDsKLQlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQlkc3BfdW5sb2NrKGF6eF9kZXYpOwotfQotI2VuZGlmIC8qIENPTkZJR19TTkRfSERBX0RTUF9MT0FERVIgKi8KLQogI2lmZGVmIENPTkZJR19QTQotLyogcG93ZXItdXAvZG93biB0aGUgY29udHJvbGxlciAqLwotc3RhdGljIHZvaWQgYXp4X3Bvd2VyX25vdGlmeShzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBib29sIHBvd2VyX3VwKQotewotCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKLQotCWlmICghKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX1BNX1JVTlRJTUUpKQotCQlyZXR1cm47Ci0KLQlpZiAocG93ZXJfdXApCi0JCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJmNoaXAtPnBjaS0+ZGV2KTsKLQllbHNlCi0JCXBtX3J1bnRpbWVfcHV0X3N5bmMoJmNoaXAtPnBjaS0+ZGV2KTsKLX0KLQogc3RhdGljIERFRklORV9NVVRFWChjYXJkX2xpc3RfbG9jayk7CiBzdGF0aWMgTElTVF9IRUFEKGNhcmRfbGlzdCk7CiAKQEAgLTI5NjksOCArNjIzLDggQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImhkYS1pbnRlbDogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTMxMjcsMzYgKzc4MSwzMiBAQAogCWlmICghY2hpcC0+YnVzKSB7CiAJCWNoaXAtPmRpc2FibGVkID0gZGlzYWJsZWQ7CiAJCWlmICghZGlzYWJsZWQpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPIFNGWAotCQkJCSAgICIlczogU3RhcnQgZGVsYXllZCBpbml0aWFsaXphdGlvblxuIiwKLQkJCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwkJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkgIlN0YXJ0IGRlbGF5ZWQgaW5pdGlhbGl6YXRpb25cbiIpOwogCQkJaWYgKGF6eF9wcm9iZV9jb250aW51ZShjaGlwKSA8IDApIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWAotCQkJCQkgICAiJXM6IGluaXRpYWxpemF0aW9uIGVycm9yXG4iLAotCQkJCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwkJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImluaXRpYWxpemF0aW9uIGVycm9yXG4iKTsKIAkJCQljaGlwLT5pbml0X2ZhaWxlZCA9IHRydWU7CiAJCQl9CiAJCX0KIAl9IGVsc2UgewotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyBTRlgKLQkJCSAgICIlczogJXMgdmlhIFZHQS1zd2l0Y2hlcm9vXG4iLCBwY2lfbmFtZShjaGlwLT5wY2kpLAotCQkJICAgZGlzYWJsZWQgPyAiRGlzYWJsaW5nIiA6ICJFbmFibGluZyIpOworCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsICIlcyB2aWEgVkdBLXN3aXRjaGVyb29cbiIsCisJCQkgZGlzYWJsZWQgPyAiRGlzYWJsaW5nIiA6ICJFbmFibGluZyIpOwogCQlpZiAoZGlzYWJsZWQpIHsKLQkJCXBtX3J1bnRpbWVfcHV0X3N5bmNfc3VzcGVuZCgmcGNpLT5kZXYpOwotCQkJYXp4X3N1c3BlbmQoJnBjaS0+ZGV2KTsKKwkJCXBtX3J1bnRpbWVfcHV0X3N5bmNfc3VzcGVuZChjYXJkLT5kZXYpOworCQkJYXp4X3N1c3BlbmQoY2FyZC0+ZGV2KTsKIAkJCS8qIHdoZW4gd2UgZ2V0IHN1c3BlbmRlZCBieSB2Z2Egc3dpdGNoZXJvbyB3ZSBlbmQgdXAgaW4gRDNjb2xkLAogCQkJICogaG93ZXZlciB3ZSBoYXZlIG5vIEFDUEkgaGFuZGxlLCBzbyBwY2kvYWNwaSBjYW4ndCBwdXQgdXMgdGhlcmUsCiAJCQkgKiBwdXQgb3Vyc2VsdmVzIHRoZXJlICovCiAJCQlwY2ktPmN1cnJlbnRfc3RhdGUgPSBQQ0lfRDNjb2xkOwogCQkJY2hpcC0+ZGlzYWJsZWQgPSB0cnVlOwogCQkJaWYgKHNuZF9oZGFfbG9ja19kZXZpY2VzKGNoaXAtPmJ1cykpCi0JCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgU0ZYICIlczogQ2Fubm90IGxvY2sgZGV2aWNlcyFcbiIsCi0JCQkJCSAgIHBjaV9uYW1lKGNoaXAtPnBjaSkpOworCQkJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkJICJDYW5ub3QgbG9jayBkZXZpY2VzIVxuIik7CiAJCX0gZWxzZSB7CiAJCQlzbmRfaGRhX3VubG9ja19kZXZpY2VzKGNoaXAtPmJ1cyk7Ci0JCQlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZSgmcGNpLT5kZXYpOworCQkJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoY2FyZC0+ZGV2KTsKIAkJCWNoaXAtPmRpc2FibGVkID0gZmFsc2U7Ci0JCQlhenhfcmVzdW1lKCZwY2ktPmRldik7CisJCQlhenhfcmVzdW1lKGNhcmQtPmRldik7CiAJCX0KIAl9CiB9CkBAIC0zMTgxLDkgKzgzMSw4IEBACiB7CiAJc3RydWN0IHBjaV9kZXYgKnAgPSBnZXRfYm91bmRfdmdhKGNoaXAtPnBjaSk7CiAJaWYgKHApIHsKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gU0ZYCi0JCQkgICAiJXM6IEhhbmRsZSBWR0Etc3dpdGNoZXJvbyBhdWRpbyBjbGllbnRcbiIsCi0JCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwkJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LAorCQkJICJIYW5kbGUgVkdBLXN3aXRjaGVyb28gYXVkaW8gY2xpZW50XG4iKTsKIAkJY2hpcC0+dXNlX3ZnYV9zd2l0Y2hlcm9vID0gMTsKIAkJcGNpX2Rldl9wdXQocCk7CiAJfQpAQCAtMzIxMSw3ICs4NjAsOCBAQAogCWNoaXAtPnZnYV9zd2l0Y2hlcm9vX3JlZ2lzdGVyZWQgPSAxOwogCiAJLyogcmVnaXN0ZXIgYXMgYW4gb3B0aW11cyBoZG1pIGF1ZGlvIHBvd2VyIGRvbWFpbiAqLwotCXZnYV9zd2l0Y2hlcm9vX2luaXRfZG9tYWluX3BtX29wdGltdXNfaGRtaV9hdWRpbygmY2hpcC0+cGNpLT5kZXYsICZjaGlwLT5oZG1pX3BtX2RvbWFpbik7CisJdmdhX3N3aXRjaGVyb29faW5pdF9kb21haW5fcG1fb3B0aW11c19oZG1pX2F1ZGlvKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkJCQkgJmNoaXAtPmhkbWlfcG1fZG9tYWluKTsKIAlyZXR1cm4gMDsKIH0KICNlbHNlCkBAIC0zMjYwLDIxICs5MTAsNyBAQAogCWlmIChjaGlwLT5yZW1hcF9hZGRyKQogCQlpb3VubWFwKGNoaXAtPnJlbWFwX2FkZHIpOwogCi0JaWYgKGNoaXAtPmF6eF9kZXYpIHsKLQkJZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zdHJlYW1zOyBpKyspCi0JCQlpZiAoY2hpcC0+YXp4X2RldltpXS5iZGwuYXJlYSkgewotCQkJCW1hcmtfcGFnZXNfd2MoY2hpcCwgJmNoaXAtPmF6eF9kZXZbaV0uYmRsLCBmYWxzZSk7Ci0JCQkJc25kX2RtYV9mcmVlX3BhZ2VzKCZjaGlwLT5henhfZGV2W2ldLmJkbCk7Ci0JCQl9Ci0JfQotCWlmIChjaGlwLT5yYi5hcmVhKSB7Ci0JCW1hcmtfcGFnZXNfd2MoY2hpcCwgJmNoaXAtPnJiLCBmYWxzZSk7Ci0JCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+cmIpOwotCX0KLQlpZiAoY2hpcC0+cG9zYnVmLmFyZWEpIHsKLQkJbWFya19wYWdlc193YyhjaGlwLCAmY2hpcC0+cG9zYnVmLCBmYWxzZSk7Ci0JCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+cG9zYnVmKTsKLQl9CisJYXp4X2ZyZWVfc3RyZWFtX3BhZ2VzKGNoaXApOwogCWlmIChjaGlwLT5yZWdpb25fcmVxdWVzdGVkKQogCQlwY2lfcmVsZWFzZV9yZWdpb25zKGNoaXAtPnBjaSk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CkBAIC0zMzc0LDIwICsxMDEwLDE5IEBACiAKIAlxID0gc25kX3BjaV9xdWlya19sb29rdXAoY2hpcC0+cGNpLCBwb3NpdGlvbl9maXhfbGlzdCk7CiAJaWYgKHEpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTwotCQkgICAgICAgImhkYV9pbnRlbDogcG9zaXRpb25fZml4IHNldCB0byAlZCAiCi0JCSAgICAgICAiZm9yIGRldmljZSAlMDR4OiUwNHhcbiIsCi0JCSAgICAgICBxLT52YWx1ZSwgcS0+c3VidmVuZG9yLCBxLT5zdWJkZXZpY2UpOworCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsCisJCQkgInBvc2l0aW9uX2ZpeCBzZXQgdG8gJWQgZm9yIGRldmljZSAlMDR4OiUwNHhcbiIsCisJCQkgcS0+dmFsdWUsIHEtPnN1YnZlbmRvciwgcS0+c3ViZGV2aWNlKTsKIAkJcmV0dXJuIHEtPnZhbHVlOwogCX0KIAogCS8qIENoZWNrIFZJQS9BVEkgSEQgQXVkaW8gQ29udHJvbGxlciBleGlzdCAqLwogCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19QT1NGSVhfVklBKSB7Ci0JCXNuZF9wcmludGQoU0ZYICIlczogVXNpbmcgVklBQ09NQk8gcG9zaXRpb24gZml4XG4iLCBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJVc2luZyBWSUFDT01CTyBwb3NpdGlvbiBmaXhcbiIpOwogCQlyZXR1cm4gUE9TX0ZJWF9WSUFDT01CTzsKIAl9CiAJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX1BPU0ZJWF9MUElCKSB7Ci0JCXNuZF9wcmludGQoU0ZYICIlczogVXNpbmcgTFBJQiBwb3NpdGlvbiBmaXhcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSkpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIlVzaW5nIExQSUIgcG9zaXRpb24gZml4XG4iKTsKIAkJcmV0dXJuIFBPU19GSVhfTFBJQjsKIAl9CiAJcmV0dXJuIFBPU19GSVhfQVVUTzsKQEAgLTM0MjUsMTAgKzEwNjAsOSBAQAogCWlmIChjaGlwLT5jb2RlY19wcm9iZV9tYXNrID09IC0xKSB7CiAJCXEgPSBzbmRfcGNpX3F1aXJrX2xvb2t1cChjaGlwLT5wY2ksIHByb2JlX21hc2tfbGlzdCk7CiAJCWlmIChxKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgImhkYV9pbnRlbDogcHJvYmVfbWFzayBzZXQgdG8gMHgleCAiCi0JCQkgICAgICAgImZvciBkZXZpY2UgJTA0eDolMDR4XG4iLAotCQkJICAgICAgIHEtPnZhbHVlLCBxLT5zdWJ2ZW5kb3IsIHEtPnN1YmRldmljZSk7CisJCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJICJwcm9iZV9tYXNrIHNldCB0byAweCV4IGZvciBkZXZpY2UgJTA0eDolMDR4XG4iLAorCQkJCSBxLT52YWx1ZSwgcS0+c3VidmVuZG9yLCBxLT5zdWJkZXZpY2UpOwogCQkJY2hpcC0+Y29kZWNfcHJvYmVfbWFzayA9IHEtPnZhbHVlOwogCQl9CiAJfQpAQCAtMzQzNyw4ICsxMDcxLDggQEAKIAlpZiAoY2hpcC0+Y29kZWNfcHJvYmVfbWFzayAhPSAtMSAmJgogCSAgICAoY2hpcC0+Y29kZWNfcHJvYmVfbWFzayAmIEFaWF9GT1JDRV9DT0RFQ19NQVNLKSkgewogCQljaGlwLT5jb2RlY19tYXNrID0gY2hpcC0+Y29kZWNfcHJvYmVfbWFzayAmIDB4ZmY7Ci0JCXByaW50ayhLRVJOX0lORk8gImhkYV9pbnRlbDogY29kZWNfbWFzayBmb3JjZWQgdG8gMHgleFxuIiwKLQkJICAgICAgIGNoaXAtPmNvZGVjX21hc2spOworCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsICJjb2RlY19tYXNrIGZvcmNlZCB0byAweCV4XG4iLAorCQkJIGNoaXAtPmNvZGVjX21hc2spOwogCX0KIH0KIApAQCAtMzQ3MCwxNiArMTEwNCwxNiBAQAogCWNoaXAtPm1zaSA9IDE7CS8qIGVuYWJsZSBNU0kgYXMgZGVmYXVsdCAqLwogCXEgPSBzbmRfcGNpX3F1aXJrX2xvb2t1cChjaGlwLT5wY2ksIG1zaV9ibGFja19saXN0KTsKIAlpZiAocSkgewotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAiaGRhX2ludGVsOiBtc2kgZm9yIGRldmljZSAlMDR4OiUwNHggc2V0IHRvICVkXG4iLAotCQkgICAgICAgcS0+c3VidmVuZG9yLCBxLT5zdWJkZXZpY2UsIHEtPnZhbHVlKTsKKwkJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LAorCQkJICJtc2kgZm9yIGRldmljZSAlMDR4OiUwNHggc2V0IHRvICVkXG4iLAorCQkJIHEtPnN1YnZlbmRvciwgcS0+c3ViZGV2aWNlLCBxLT52YWx1ZSk7CiAJCWNoaXAtPm1zaSA9IHEtPnZhbHVlOwogCQlyZXR1cm47CiAJfQogCiAJLyogTlZpZGlhIGNoaXBzZXRzIHNlZW0gdG8gY2F1c2UgdHJvdWJsZXMgd2l0aCBNU0kgKi8KIAlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfTk9fTVNJKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImhkYV9pbnRlbDogRGlzYWJsaW5nIE1TSVxuIik7CisJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwgIkRpc2FibGluZyBNU0lcbiIpOwogCQljaGlwLT5tc2kgPSAwOwogCX0KIH0KQEAgLTM1MTEsOCArMTE0NSw4IEBACiAJfQogCiAJaWYgKHNub29wICE9IGNoaXAtPnNub29wKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPIFNGWCAiJXM6IEZvcmNlIHRvICVzIG1vZGVcbiIsCi0JCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpLCBzbm9vcCA/ICJzbm9vcCIgOiAibm9uLXNub29wIik7CisJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwgIkZvcmNlIHRvICVzIG1vZGVcbiIsCisJCQkgc25vb3AgPyAic25vb3AiIDogIm5vbi1zbm9vcCIpOwogCQljaGlwLT5zbm9vcCA9IHNub29wOwogCX0KIH0KQEAgLTM1MjcsNiArMTE2MSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgYXp4X2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHN0cnVjdCBwY2lfZGV2ICpwY2ksCiAJCSAgICAgIGludCBkZXYsIHVuc2lnbmVkIGludCBkcml2ZXJfY2FwcywKKwkJICAgICAgY29uc3Qgc3RydWN0IGhkYV9jb250cm9sbGVyX29wcyAqaGRhX29wcywKIAkJICAgICAgc3RydWN0IGF6eCAqKnJjaGlwKQogewogCXN0YXRpYyBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgb3BzID0gewpAQCAtMzU0Myw3ICsxMTc4LDcgQEAKIAogCWNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOwogCWlmICghY2hpcCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IENhbm5vdCBhbGxvY2F0ZSBjaGlwXG4iLCBwY2lfbmFtZShwY2kpKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJDYW5ub3QgYWxsb2NhdGUgY2hpcFxuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0zNTUyLDExICsxMTg3LDEzIEBACiAJbXV0ZXhfaW5pdCgmY2hpcC0+b3Blbl9tdXRleCk7CiAJY2hpcC0+Y2FyZCA9IGNhcmQ7CiAJY2hpcC0+cGNpID0gcGNpOworCWNoaXAtPm9wcyA9IGhkYV9vcHM7CiAJY2hpcC0+aXJxID0gLTE7CiAJY2hpcC0+ZHJpdmVyX2NhcHMgPSBkcml2ZXJfY2FwczsKIAljaGlwLT5kcml2ZXJfdHlwZSA9IGRyaXZlcl9jYXBzICYgMHhmZjsKIAljaGVja19tc2koY2hpcCk7CiAJY2hpcC0+ZGV2X2luZGV4ID0gZGV2OworCWNoaXAtPmphY2twb2xsX21zID0gamFja3BvbGxfbXM7CiAJSU5JVF9XT1JLKCZjaGlwLT5pcnFfcGVuZGluZ193b3JrLCBhenhfaXJxX3BlbmRpbmdfd29yayk7CiAJSU5JVF9MSVNUX0hFQUQoJmNoaXAtPnBjbV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmY2hpcC0+bGlzdCk7CkBAIC0zNTg4LDExICsxMjI1LDExIEBACiAJCQlicmVhazsKIAkJfQogCX0KKwljaGlwLT5iZGxfcG9zX2FkaiA9IGJkbF9wb3NfYWRqOwogCiAJZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IEVycm9yIGNyZWF0aW5nIGRldmljZSBbY2FyZF0hXG4iLAotCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJFcnJvciBjcmVhdGluZyBkZXZpY2UgW2NhcmRdIVxuIik7CiAJCWF6eF9mcmVlKGNoaXApOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTM2MTAsNyArMTI0Nyw3IEBACiAJaW50IGRldiA9IGNoaXAtPmRldl9pbmRleDsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpID0gY2hpcC0+cGNpOwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGNoaXAtPmNhcmQ7Ci0JaW50IGksIGVycjsKKwlpbnQgZXJyOwogCXVuc2lnbmVkIHNob3J0IGdjYXA7CiAKICNpZiBCSVRTX1BFUl9MT05HICE9IDY0CkBAIC0zNjMxLDcgKzEyNjgsNyBAQAogCWNoaXAtPmFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKIAljaGlwLT5yZW1hcF9hZGRyID0gcGNpX2lvcmVtYXBfYmFyKHBjaSwgMCk7CiAJaWYgKGNoaXAtPnJlbWFwX2FkZHIgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IGlvcmVtYXAgZXJyb3JcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSkpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImlvcmVtYXAgZXJyb3JcbiIpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIApAQCAtMzY0Niw3ICsxMjgzLDcgQEAKIAlzeW5jaHJvbml6ZV9pcnEoY2hpcC0+aXJxKTsKIAogCWdjYXAgPSBhenhfcmVhZHcoY2hpcCwgR0NBUCk7Ci0Jc25kX3ByaW50ZGQoU0ZYICIlczogY2hpcHNldCBnbG9iYWwgY2FwYWJpbGl0aWVzID0gMHgleFxuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSwgZ2NhcCk7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJjaGlwc2V0IGdsb2JhbCBjYXBhYmlsaXRpZXMgPSAweCV4XG4iLCBnY2FwKTsKIAogCS8qIGRpc2FibGUgU0I2MDAgNjRiaXQgc3VwcG9ydCBmb3Igc2FmZXR5ICovCiAJaWYgKGNoaXAtPnBjaS0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQVRJKSB7CkBAIC0zNjYzLDcgKzEzMDAsNyBAQAogCiAJLyogZGlzYWJsZSA2NGJpdCBETUEgYWRkcmVzcyBvbiBzb21lIGRldmljZXMgKi8KIAlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfTk9fNjRCSVQpIHsKLQkJc25kX3ByaW50ZChTRlggIiVzOiBEaXNhYmxpbmcgNjRiaXQgRE1BXG4iLCBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwkJZGV2X2RiZyhjYXJkLT5kZXYsICJEaXNhYmxpbmcgNjRiaXQgRE1BXG4iKTsKIAkJZ2NhcCAmPSB+SUNINl9HQ0FQXzY0T0s7CiAJfQogCkBAIC0zNzE4LDMzICsxMzU1LDExIEBACiAJY2hpcC0+YXp4X2RldiA9IGtjYWxsb2MoY2hpcC0+bnVtX3N0cmVhbXMsIHNpemVvZigqY2hpcC0+YXp4X2RldiksCiAJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFjaGlwLT5henhfZGV2KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYICIlczogY2Fubm90IG1hbGxvYyBhenhfZGV2XG4iLCBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjYW5ub3QgbWFsbG9jIGF6eF9kZXZcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3N0cmVhbXM7IGkrKykgewotCQlkc3BfbG9ja19pbml0KCZjaGlwLT5henhfZGV2W2ldKTsKLQkJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgQkRMIGZvciBlYWNoIHN0cmVhbSAqLwotCQllcnIgPSBzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwKLQkJCQkJICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCi0JCQkJCSAgQkRMX1NJWkUsICZjaGlwLT5henhfZGV2W2ldLmJkbCk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IGNhbm5vdCBhbGxvY2F0ZSBCRExcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSkpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJbWFya19wYWdlc193YyhjaGlwLCAmY2hpcC0+YXp4X2RldltpXS5iZGwsIHRydWUpOwotCX0KLQkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwb3NpdGlvbiBidWZmZXIgKi8KLQllcnIgPSBzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwKLQkJCQkgIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKLQkJCQkgIGNoaXAtPm51bV9zdHJlYW1zICogOCwgJmNoaXAtPnBvc2J1Zik7Ci0JaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggIiVzOiBjYW5ub3QgYWxsb2NhdGUgcG9zYnVmXG4iLCBwY2lfbmFtZShjaGlwLT5wY2kpKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1hcmtfcGFnZXNfd2MoY2hpcCwgJmNoaXAtPnBvc2J1ZiwgdHJ1ZSk7Ci0JLyogYWxsb2NhdGUgQ09SQi9SSVJCICovCi0JZXJyID0gYXp4X2FsbG9jX2NtZF9pbyhjaGlwKTsKKwllcnIgPSBhenhfYWxsb2Nfc3RyZWFtX3BhZ2VzKGNoaXApOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0zNzU3LDcgKzEzNzIsNyBAQAogCiAJLyogY29kZWMgZGV0ZWN0aW9uICovCiAJaWYgKCFjaGlwLT5jb2RlY19tYXNrKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYICIlczogbm8gY29kZWNzIGZvdW5kIVxuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAibm8gY29kZWNzIGZvdW5kIVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMzc5Myw4ICsxNDA4LDcgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpID0gY2hpcC0+cGNpOwogCiAJaWYgKCFmdykgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IENhbm5vdCBsb2FkIGZpcm13YXJlLCBhYm9ydGluZ1xuIiwKLQkJCSAgIHBjaV9uYW1lKGNoaXAtPnBjaSkpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkNhbm5vdCBsb2FkIGZpcm13YXJlLCBhYm9ydGluZ1xuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC0zODEyLDYgKzE0MjYsMTMyIEBACiB9CiAjZW5kaWYKIAorLyoKKyAqIEhEQSBjb250cm9sbGVyIG9wcy4KKyAqLworCisvKiBQQ0kgcmVnaXN0ZXIgYWNjZXNzLiAqLworc3RhdGljIHZvaWQgcGNpX2F6eF93cml0ZWwodTMyIHZhbHVlLCB1MzIgX19pb21lbSAqYWRkcikKK3sKKwl3cml0ZWwodmFsdWUsIGFkZHIpOworfQorCitzdGF0aWMgdTMyIHBjaV9henhfcmVhZGwodTMyIF9faW9tZW0gKmFkZHIpCit7CisJcmV0dXJuIHJlYWRsKGFkZHIpOworfQorCitzdGF0aWMgdm9pZCBwY2lfYXp4X3dyaXRldyh1MTYgdmFsdWUsIHUxNiBfX2lvbWVtICphZGRyKQoreworCXdyaXRldyh2YWx1ZSwgYWRkcik7Cit9CisKK3N0YXRpYyB1MTYgcGNpX2F6eF9yZWFkdyh1MTYgX19pb21lbSAqYWRkcikKK3sKKwlyZXR1cm4gcmVhZHcoYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIHBjaV9henhfd3JpdGViKHU4IHZhbHVlLCB1OCBfX2lvbWVtICphZGRyKQoreworCXdyaXRlYih2YWx1ZSwgYWRkcik7Cit9CisKK3N0YXRpYyB1OCBwY2lfYXp4X3JlYWRiKHU4IF9faW9tZW0gKmFkZHIpCit7CisJcmV0dXJuIHJlYWRiKGFkZHIpOworfQorCitzdGF0aWMgaW50IGRpc2FibGVfbXNpX3Jlc2V0X2lycShzdHJ1Y3QgYXp4ICpjaGlwKQoreworCWludCBlcnI7CisKKwlmcmVlX2lycShjaGlwLT5pcnEsIGNoaXApOworCWNoaXAtPmlycSA9IC0xOworCXBjaV9kaXNhYmxlX21zaShjaGlwLT5wY2kpOworCWNoaXAtPm1zaSA9IDA7CisJZXJyID0gYXp4X2FjcXVpcmVfaXJxKGNoaXAsIDEpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKKy8qIERNQSBwYWdlIGFsbG9jYXRpb24gaGVscGVycy4gICovCitzdGF0aWMgaW50IGRtYV9hbGxvY19wYWdlcyhzdHJ1Y3QgYXp4ICpjaGlwLAorCQkJICAgaW50IHR5cGUsCisJCQkgICBzaXplX3Qgc2l6ZSwKKwkJCSAgIHN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmKQoreworCWludCBlcnI7CisKKwllcnIgPSBzbmRfZG1hX2FsbG9jX3BhZ2VzKHR5cGUsCisJCQkJICBjaGlwLT5jYXJkLT5kZXYsCisJCQkJICBzaXplLCBidWYpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCW1hcmtfcGFnZXNfd2MoY2hpcCwgYnVmLCB0cnVlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZG1hX2ZyZWVfcGFnZXMoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWYpCit7CisJbWFya19wYWdlc193YyhjaGlwLCBidWYsIGZhbHNlKTsKKwlzbmRfZG1hX2ZyZWVfcGFnZXMoYnVmKTsKK30KKworc3RhdGljIGludCBzdWJzdHJlYW1fYWxsb2NfcGFnZXMoc3RydWN0IGF6eCAqY2hpcCwKKwkJCQkgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKKwlpbnQgcmV0OworCisJbWFya19ydW50aW1lX3djKGNoaXAsIGF6eF9kZXYsIHN1YnN0cmVhbSwgZmFsc2UpOworCWF6eF9kZXYtPmJ1ZnNpemUgPSAwOworCWF6eF9kZXYtPnBlcmlvZF9ieXRlcyA9IDA7CisJYXp4X2Rldi0+Zm9ybWF0X3ZhbCA9IDA7CisJcmV0ID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgc2l6ZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJbWFya19ydW50aW1lX3djKGNoaXAsIGF6eF9kZXYsIHN1YnN0cmVhbSwgdHJ1ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3Vic3RyZWFtX2ZyZWVfcGFnZXMoc3RydWN0IGF6eCAqY2hpcCwKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7CisJbWFya19ydW50aW1lX3djKGNoaXAsIGF6eF9kZXYsIHN1YnN0cmVhbSwgZmFsc2UpOworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbV9tbWFwX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSkKK3sKKyNpZmRlZiBDT05GSUdfWDg2CisJc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7CisJaWYgKCFhenhfc25vb3AoY2hpcCkpCisJCWFyZWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUoYXJlYS0+dm1fcGFnZV9wcm90KTsKKyNlbmRpZgorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jb250cm9sbGVyX29wcyBwY2lfaGRhX29wcyA9IHsKKwkucmVnX3dyaXRlbCA9IHBjaV9henhfd3JpdGVsLAorCS5yZWdfcmVhZGwgPSBwY2lfYXp4X3JlYWRsLAorCS5yZWdfd3JpdGV3ID0gcGNpX2F6eF93cml0ZXcsCisJLnJlZ19yZWFkdyA9IHBjaV9henhfcmVhZHcsCisJLnJlZ193cml0ZWIgPSBwY2lfYXp4X3dyaXRlYiwKKwkucmVnX3JlYWRiID0gcGNpX2F6eF9yZWFkYiwKKwkuZGlzYWJsZV9tc2lfcmVzZXRfaXJxID0gZGlzYWJsZV9tc2lfcmVzZXRfaXJxLAorCS5kbWFfYWxsb2NfcGFnZXMgPSBkbWFfYWxsb2NfcGFnZXMsCisJLmRtYV9mcmVlX3BhZ2VzID0gZG1hX2ZyZWVfcGFnZXMsCisJLnN1YnN0cmVhbV9hbGxvY19wYWdlcyA9IHN1YnN0cmVhbV9hbGxvY19wYWdlcywKKwkuc3Vic3RyZWFtX2ZyZWVfcGFnZXMgPSBzdWJzdHJlYW1fZnJlZV9wYWdlcywKKwkucGNtX21tYXBfcHJlcGFyZSA9IHBjbV9tbWFwX3ByZXBhcmUsCisJLnBvc2l0aW9uX2NoZWNrID0gYXp4X3Bvc2l0aW9uX2NoZWNrLAorfTsKKwogc3RhdGljIGludCBhenhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKIAkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQogewpAQCAtMzgyOCwxNSArMTU2OCwxNSBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGEtaW50ZWw6IEVycm9yIGNyZWF0aW5nIGNhcmQhXG4iKTsKKwkJZGV2X2VycigmcGNpLT5kZXYsICJFcnJvciBjcmVhdGluZyBjYXJkIVxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCi0JZXJyID0gYXp4X2NyZWF0ZShjYXJkLCBwY2ksIGRldiwgcGNpX2lkLT5kcml2ZXJfZGF0YSwgJmNoaXApOworCWVyciA9IGF6eF9jcmVhdGUoY2FyZCwgcGNpLCBkZXYsIHBjaV9pZC0+ZHJpdmVyX2RhdGEsCisJCQkgJnBjaV9oZGFfb3BzLCAmY2hpcCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0X2ZyZWU7CiAJY2FyZC0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKQEAgLTM4NDUsMTUgKzE1ODUsMTMgQEAKIAogCWVyciA9IHJlZ2lzdGVyX3ZnYV9zd2l0Y2hlcm9vKGNoaXApOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYCi0JCQkgICAiJXM6IEVycm9yIHJlZ2lzdGVyaW5nIFZHQS1zd2l0Y2hlcm9vIGNsaWVudFxuIiwgcGNpX25hbWUocGNpKSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiRXJyb3IgcmVnaXN0ZXJpbmcgVkdBLXN3aXRjaGVyb28gY2xpZW50XG4iKTsKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKIAlpZiAoY2hlY2tfaGRtaV9kaXNhYmxlZChwY2kpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPIFNGWCAiJXM6IFZHQSBjb250cm9sbGVyIGlzIGRpc2FibGVkXG4iLAotCQkJICAgcGNpX25hbWUocGNpKSk7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPIFNGWCAiJXM6IERlbGF5aW5nIGluaXRpYWxpemF0aW9uXG4iLCBwY2lfbmFtZShwY2kpKTsKKwkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiVkdBIGNvbnRyb2xsZXIgaXMgZGlzYWJsZWRcbiIpOworCQlkZXZfaW5mbyhjYXJkLT5kZXYsICJEZWxheWluZyBpbml0aWFsaXphdGlvblxuIik7CiAJCWNoaXAtPmRpc2FibGVkID0gdHJ1ZTsKIAl9CiAKQEAgLTM4NjEsOCArMTU5OSw4IEBACiAKICNpZmRlZiBDT05GSUdfU05EX0hEQV9QQVRDSF9MT0FERVIKIAlpZiAocGF0Y2hbZGV2XSAmJiAqcGF0Y2hbZGV2XSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IEFwcGx5aW5nIHBhdGNoIGZpcm13YXJlICclcydcbiIsCi0JCQkgICBwY2lfbmFtZShwY2kpLCBwYXRjaFtkZXZdKTsKKwkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiQXBwbHlpbmcgcGF0Y2ggZmlybXdhcmUgJyVzJ1xuIiwKKwkJCSBwYXRjaFtkZXZdKTsKIAkJZXJyID0gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsIHRydWUsIHBhdGNoW2Rldl0sCiAJCQkJCSAgICAgICZwY2ktPmRldiwgR0ZQX0tFUk5FTCwgY2FyZCwKIAkJCQkJICAgICAgYXp4X2Zpcm13YXJlX2NiKTsKQEAgLTM4NzQsNyArMTYxMiw3IEBACiAKICNpZm5kZWYgQ09ORklHX1NORF9IREFfSTkxNQogCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19JOTE1X1BPV0VSV0VMTCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggIkhhc3dlbGwgbXVzdCBidWlsZCBpbiBDT05GSUdfU05EX0hEQV9JOTE1XG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJIYXN3ZWxsIG11c3QgYnVpbGQgaW4gQ09ORklHX1NORF9IREFfSTkxNVxuIik7CiAjZW5kaWYKIAogCWlmIChzY2hlZHVsZV9wcm9iZSkKQEAgLTM4OTAsNiArMTYyOCwxMiBAQAogCXJldHVybiBlcnI7CiB9CiAKKy8qIG51bWJlciBvZiBjb2RlYyBzbG90cyBmb3IgZWFjaCBjaGlwc2V0OiAwID0gZGVmYXVsdCBzbG90cyAoaS5lLiA0KSAqLworc3RhdGljIHVuc2lnbmVkIGludCBhenhfbWF4X2NvZGVjc1tBWlhfTlVNX0RSSVZFUlNdID0geworCVtBWlhfRFJJVkVSX05WSURJQV0gPSA4LAorCVtBWlhfRFJJVkVSX1RFUkFdID0gMSwKK307CisKIHN0YXRpYyBpbnQgYXp4X3Byb2JlX2NvbnRpbnVlKHN0cnVjdCBhenggKmNoaXApCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaSA9IGNoaXAtPnBjaTsKQEAgLTM5MDEsNyArMTY0NSw4IEBACiAjaWZkZWYgQ09ORklHX1NORF9IREFfSTkxNQogCQllcnIgPSBoZGFfaTkxNV9pbml0KCk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiRXJyb3IgcmVxdWVzdCBwb3dlci13ZWxsIGZyb20gaTkxNVxuIik7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiRXJyb3IgcmVxdWVzdCBwb3dlci13ZWxsIGZyb20gaTkxNVxuIik7CiAJCQlnb3RvIG91dF9mcmVlOwogCQl9CiAjZW5kaWYKQEAgLTM5MTcsNyArMTY2MiwxMCBAQAogI2VuZGlmCiAKIAkvKiBjcmVhdGUgY29kZWMgaW5zdGFuY2VzICovCi0JZXJyID0gYXp4X2NvZGVjX2NyZWF0ZShjaGlwLCBtb2RlbFtkZXZdKTsKKwllcnIgPSBhenhfY29kZWNfY3JlYXRlKGNoaXAsIG1vZGVsW2Rldl0sCisJCQkgICAgICAgYXp4X21heF9jb2RlY3NbY2hpcC0+ZHJpdmVyX3R5cGVdLAorCQkJICAgICAgIHBvd2VyX3NhdmVfYWRkcik7CisKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXRfZnJlZTsKICNpZmRlZiBDT05GSUdfU05EX0hEQV9QQVRDSF9MT0FERVIKQEAgLTQxNDIsNyArMTg5MCw3IEBACiAJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0NUSERBIHwgQVpYX0RDQVBTX1BSRVNFVF9DVEhEQSB9LAogCXsgUENJX0RFVklDRSgweDExMDIsIDB4MDAxMiksCiAJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0NUSERBIHwgQVpYX0RDQVBTX1BSRVNFVF9DVEhEQSB9LAotI2lmICFkZWZpbmVkKENPTkZJR19TTkRfQ1RYRkkpICYmICFkZWZpbmVkKENPTkZJR19TTkRfQ1RYRklfTU9EVUxFKQorI2lmICFJU19FTkFCTEVEKENPTkZJR19TTkRfQ1RYRkkpCiAJLyogdGhlIGZvbGxvd2luZyBlbnRyeSBjb25mbGljdHMgd2l0aCBzbmQtY3R4ZmkgZHJpdmVyLAogCSAqIGFzIGN0eGZpIGRyaXZlciBtdXRhdGVzIGZyb20gSEQtYXVkaW8gdG8gbmF0aXZlIG1vZGUgd2l0aAogCSAqIGEgc3BlY2lhbCBjb21tYW5kIHNlcXVlbmNlLgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2xvY2FsLmgKaW5kZXggZGE4MGM1Yi4uZTUxZDE1NSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oCkBAIC01OTcsMjMgKzU5NywxMCBAQAogc3RhdGljIGlubGluZSBpbnQgc25kX2hkYV9jcmVhdGVfaHdkZXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpIHsgcmV0dXJuIDA7IH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfUE0pICYmIGRlZmluZWQoQ09ORklHX1NORF9IREFfSFdERVApCi1pbnQgc25kX2hkYV9od2RlcF9hZGRfcG93ZXJfc3lzZnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IHNuZF9oZGFfaHdkZXBfYWRkX3Bvd2VyX3N5c2ZzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXJldHVybiAwOwotfQotI2VuZGlmCit2b2lkIHNuZF9oZGFfc3lzZnNfaW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7Cit2b2lkIHNuZF9oZGFfc3lzZnNfY2xlYXIoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwogCi0jaWZkZWYgQ09ORklHX1NORF9IREFfUkVDT05GSUcKLWludCBzbmRfaGRhX2h3ZGVwX2FkZF9zeXNmcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgc25kX2hkYV9od2RlcF9hZGRfc3lzZnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpzbmRfaGRhX2Rldl9hdHRyX2dyb3Vwc1tdOwogCiAjaWZkZWYgQ09ORklHX1NORF9IREFfUkVDT05GSUcKIGNvbnN0IGNoYXIgKnNuZF9oZGFfZ2V0X2hpbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKmtleSk7CkBAIC03NzEsNCArNzU4LDExIEBACiAjZGVmaW5lIFNORF9QUklOVF9DSEFOTkVMX0FMTE9DQVRJT05fQURWSVNFRF9CVUZTSVpFIDgwCiB2b2lkIHNuZF9wcmludF9jaGFubmVsX2FsbG9jYXRpb24oaW50IHNwa19hbGxvYywgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKIAorLyoKKyAqLworI2RlZmluZSBjb2RlY19lcnIoY29kZWMsIGZtdCwgYXJncy4uLikgZGV2X2VycigmKGNvZGVjKS0+ZGV2LCBmbXQsICMjYXJncykKKyNkZWZpbmUgY29kZWNfd2Fybihjb2RlYywgZm10LCBhcmdzLi4uKSBkZXZfd2FybigmKGNvZGVjKS0+ZGV2LCBmbXQsICMjYXJncykKKyNkZWZpbmUgY29kZWNfaW5mbyhjb2RlYywgZm10LCBhcmdzLi4uKSBkZXZfaW5mbygmKGNvZGVjKS0+ZGV2LCBmbXQsICMjYXJncykKKyNkZWZpbmUgY29kZWNfZGJnKGNvZGVjLCBmbXQsIGFyZ3MuLi4pIGRldl9kYmcoJihjb2RlYyktPmRldiwgZm10LCAjI2FyZ3MpCisKICNlbmRpZiAvKiBfX1NPVU5EX0hEQV9MT0NBTF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9wcml2LmggYi9zb3VuZC9wY2kvaGRhL2hkYV9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzOGI4MQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX3ByaXYuaApAQCAtMCwwICsxLDQ2MyBAQAorLyoKKyAqICBDb21tb24gZGVmaW5lcyBmb3IgdGhlIGFsc2EgZHJpdmVyIGNvZGUgYmFzZSBmb3IgSEQgQXVkaW8uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiAgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqICBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1NPVU5EX0hEQV9QUklWX0gKKyNkZWZpbmUgX19TT1VORF9IREFfUFJJVl9ICisKKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKworLyoKKyAqIHJlZ2lzdGVycworICovCisjZGVmaW5lIElDSDZfUkVHX0dDQVAJCQkweDAwCisjZGVmaW5lICAgSUNINl9HQ0FQXzY0T0sJKDEgPDwgMCkgICAvKiA2NGJpdCBhZGRyZXNzIHN1cHBvcnQgKi8KKyNkZWZpbmUgICBJQ0g2X0dDQVBfTlNETwkoMyA8PCAxKSAgIC8qICMgb2Ygc2VyaWFsIGRhdGEgb3V0IHNpZ25hbHMgKi8KKyNkZWZpbmUgICBJQ0g2X0dDQVBfQlNTCQkoMzEgPDwgMykgIC8qICMgb2YgYmlkaXJlY3Rpb25hbCBzdHJlYW1zICovCisjZGVmaW5lICAgSUNINl9HQ0FQX0lTUwkJKDE1IDw8IDgpICAvKiAjIG9mIGlucHV0IHN0cmVhbXMgKi8KKyNkZWZpbmUgICBJQ0g2X0dDQVBfT1NTCQkoMTUgPDwgMTIpIC8qICMgb2Ygb3V0cHV0IHN0cmVhbXMgKi8KKyNkZWZpbmUgSUNINl9SRUdfVk1JTgkJCTB4MDIKKyNkZWZpbmUgSUNINl9SRUdfVk1BSgkJCTB4MDMKKyNkZWZpbmUgSUNINl9SRUdfT1VUUEFZCQkJMHgwNAorI2RlZmluZSBJQ0g2X1JFR19JTlBBWQkJCTB4MDYKKyNkZWZpbmUgSUNINl9SRUdfR0NUTAkJCTB4MDgKKyNkZWZpbmUgICBJQ0g2X0dDVExfUkVTRVQJKDEgPDwgMCkgICAvKiBjb250cm9sbGVyIHJlc2V0ICovCisjZGVmaW5lICAgSUNINl9HQ1RMX0ZDTlRSTAkoMSA8PCAxKSAgIC8qIGZsdXNoIGNvbnRyb2wgKi8KKyNkZWZpbmUgICBJQ0g2X0dDVExfVU5TT0wJKDEgPDwgOCkgICAvKiBhY2NlcHQgdW5zb2wuIHJlc3BvbnNlIGVuYWJsZSAqLworI2RlZmluZSBJQ0g2X1JFR19XQUtFRU4JCQkweDBjCisjZGVmaW5lIElDSDZfUkVHX1NUQVRFU1RTCQkweDBlCisjZGVmaW5lIElDSDZfUkVHX0dTVFMJCQkweDEwCisjZGVmaW5lICAgSUNINl9HU1RTX0ZTVFMJKDEgPDwgMSkgICAvKiBmbHVzaCBzdGF0dXMgKi8KKyNkZWZpbmUgSUNINl9SRUdfSU5UQ1RMCQkJMHgyMAorI2RlZmluZSBJQ0g2X1JFR19JTlRTVFMJCQkweDI0CisjZGVmaW5lIElDSDZfUkVHX1dBTExDTEsJCTB4MzAJLyogMjRNaHogc291cmNlICovCisjZGVmaW5lIElDSDZfUkVHX09MRF9TU1lOQwkJMHgzNAkvKiBTU1lOQyBmb3Igb2xkIElDSCAqLworI2RlZmluZSBJQ0g2X1JFR19TU1lOQwkJCTB4MzgKKyNkZWZpbmUgSUNINl9SRUdfQ09SQkxCQVNFCQkweDQwCisjZGVmaW5lIElDSDZfUkVHX0NPUkJVQkFTRQkJMHg0NAorI2RlZmluZSBJQ0g2X1JFR19DT1JCV1AJCQkweDQ4CisjZGVmaW5lIElDSDZfUkVHX0NPUkJSUAkJCTB4NGEKKyNkZWZpbmUgICBJQ0g2X0NPUkJSUF9SU1QJKDEgPDwgMTUpICAvKiByZWFkIHBvaW50ZXIgcmVzZXQgKi8KKyNkZWZpbmUgSUNINl9SRUdfQ09SQkNUTAkJMHg0YworI2RlZmluZSAgIElDSDZfQ09SQkNUTF9SVU4JKDEgPDwgMSkgICAvKiBlbmFibGUgRE1BICovCisjZGVmaW5lICAgSUNINl9DT1JCQ1RMX0NNRUlFCSgxIDw8IDApICAgLyogZW5hYmxlIG1lbW9yeSBlcnJvciBpcnEgKi8KKyNkZWZpbmUgSUNINl9SRUdfQ09SQlNUUwkJMHg0ZAorI2RlZmluZSAgIElDSDZfQ09SQlNUU19DTUVJCSgxIDw8IDApICAgLyogbWVtb3J5IGVycm9yIGluZGljYXRpb24gKi8KKyNkZWZpbmUgSUNINl9SRUdfQ09SQlNJWkUJCTB4NGUKKworI2RlZmluZSBJQ0g2X1JFR19SSVJCTEJBU0UJCTB4NTAKKyNkZWZpbmUgSUNINl9SRUdfUklSQlVCQVNFCQkweDU0CisjZGVmaW5lIElDSDZfUkVHX1JJUkJXUAkJCTB4NTgKKyNkZWZpbmUgICBJQ0g2X1JJUkJXUF9SU1QJKDEgPDwgMTUpICAvKiB3cml0ZSBwb2ludGVyIHJlc2V0ICovCisjZGVmaW5lIElDSDZfUkVHX1JJTlRDTlQJCTB4NWEKKyNkZWZpbmUgSUNINl9SRUdfUklSQkNUTAkJMHg1YworI2RlZmluZSAgIElDSDZfUkJDVExfSVJRX0VOCSgxIDw8IDApICAgLyogZW5hYmxlIElSUSAqLworI2RlZmluZSAgIElDSDZfUkJDVExfRE1BX0VOCSgxIDw8IDEpICAgLyogZW5hYmxlIERNQSAqLworI2RlZmluZSAgIElDSDZfUkJDVExfT1ZFUlJVTl9FTgkoMSA8PCAyKSAgIC8qIGVuYWJsZSBvdmVycnVuIGlycSAqLworI2RlZmluZSBJQ0g2X1JFR19SSVJCU1RTCQkweDVkCisjZGVmaW5lICAgSUNINl9SQlNUU19JUlEJKDEgPDwgMCkgICAvKiByZXNwb25zZSBpcnEgKi8KKyNkZWZpbmUgICBJQ0g2X1JCU1RTX09WRVJSVU4JKDEgPDwgMikgICAvKiBvdmVycnVuIGlycSAqLworI2RlZmluZSBJQ0g2X1JFR19SSVJCU0laRQkJMHg1ZQorCisjZGVmaW5lIElDSDZfUkVHX0lDCQkJMHg2MAorI2RlZmluZSBJQ0g2X1JFR19JUgkJCTB4NjQKKyNkZWZpbmUgSUNINl9SRUdfSVJTCQkJMHg2OAorI2RlZmluZSAgIElDSDZfSVJTX1ZBTElECSgxPDwxKQorI2RlZmluZSAgIElDSDZfSVJTX0JVU1kJCSgxPDwwKQorCisjZGVmaW5lIElDSDZfUkVHX0RQTEJBU0UJCTB4NzAKKyNkZWZpbmUgSUNINl9SRUdfRFBVQkFTRQkJMHg3NAorI2RlZmluZSAgIElDSDZfRFBMQkFTRV9FTkFCTEUJMHgxCS8qIEVuYWJsZSBwb3NpdGlvbiBidWZmZXIgKi8KKworLyogU0Qgb2Zmc2V0OiBTREkwPTB4ODAsIFNESTE9MHhhMCwgLi4uIFNETzM9MHgxNjAgKi8KK2VudW0geyBTREkwLCBTREkxLCBTREkyLCBTREkzLCBTRE8wLCBTRE8xLCBTRE8yLCBTRE8zIH07CisKKy8qIHN0cmVhbSByZWdpc3RlciBvZmZzZXRzIGZyb20gc3RyZWFtIGJhc2UgKi8KKyNkZWZpbmUgSUNINl9SRUdfU0RfQ1RMCQkJMHgwMAorI2RlZmluZSBJQ0g2X1JFR19TRF9TVFMJCQkweDAzCisjZGVmaW5lIElDSDZfUkVHX1NEX0xQSUIJCTB4MDQKKyNkZWZpbmUgSUNINl9SRUdfU0RfQ0JMCQkJMHgwOAorI2RlZmluZSBJQ0g2X1JFR19TRF9MVkkJCQkweDBjCisjZGVmaW5lIElDSDZfUkVHX1NEX0ZJRk9XCQkweDBlCisjZGVmaW5lIElDSDZfUkVHX1NEX0ZJRk9TSVpFCQkweDEwCisjZGVmaW5lIElDSDZfUkVHX1NEX0ZPUk1BVAkJMHgxMgorI2RlZmluZSBJQ0g2X1JFR19TRF9CRExQTAkJMHgxOAorI2RlZmluZSBJQ0g2X1JFR19TRF9CRExQVQkJMHgxYworCisvKiBQQ0kgc3BhY2UgKi8KKyNkZWZpbmUgSUNINl9QQ0lSRUdfVENTRUwJMHg0NAorCisvKgorICogb3RoZXIgY29uc3RhbnRzCisgKi8KKworLyogbWF4IG51bWJlciBvZiBTRHMgKi8KKy8qIElDSCwgQVRJIGFuZCBWSUEgaGF2ZSA0IHBsYXliYWNrIGFuZCA0IGNhcHR1cmUgKi8KKyNkZWZpbmUgSUNINl9OVU1fQ0FQVFVSRQk0CisjZGVmaW5lIElDSDZfTlVNX1BMQVlCQUNLCTQKKworLyogVUxJIGhhcyA2IHBsYXliYWNrIGFuZCA1IGNhcHR1cmUgKi8KKyNkZWZpbmUgVUxJX05VTV9DQVBUVVJFCQk1CisjZGVmaW5lIFVMSV9OVU1fUExBWUJBQ0sJNgorCisvKiBBVEkgSERNSSBtYXkgaGF2ZSB1cCB0byA4IHBsYXliYWNrcyBhbmQgMCBjYXB0dXJlICovCisjZGVmaW5lIEFUSUhETUlfTlVNX0NBUFRVUkUJMAorI2RlZmluZSBBVElIRE1JX05VTV9QTEFZQkFDSwk4CisKKy8qIFRFUkEgaGFzIDQgcGxheWJhY2sgYW5kIDMgY2FwdHVyZSAqLworI2RlZmluZSBURVJBX05VTV9DQVBUVVJFCTMKKyNkZWZpbmUgVEVSQV9OVU1fUExBWUJBQ0sJNAorCisvKiB0aGlzIG51bWJlciBpcyBzdGF0aWNhbGx5IGRlZmluZWQgZm9yIHNpbXBsaWNpdHkgKi8KKyNkZWZpbmUgTUFYX0FaWF9ERVYJCTE2CisKKy8qIG1heCBudW1iZXIgb2YgZnJhZ21lbnRzIC0gd2UgbWF5IHVzZSBtb3JlIGlmIGFsbG9jYXRpbmcgbW9yZSBwYWdlcyBmb3IgQkRMICovCisjZGVmaW5lIEJETF9TSVpFCQk0MDk2CisjZGVmaW5lIEFaWF9NQVhfQkRMX0VOVFJJRVMJKEJETF9TSVpFIC8gMTYpCisjZGVmaW5lIEFaWF9NQVhfRlJBRwkJMzIKKy8qIG1heCBidWZmZXIgc2l6ZSAtIG5vIGgvdyBsaW1pdCwgeW91IGNhbiBpbmNyZWFzZSBhcyB5b3UgbGlrZSAqLworI2RlZmluZSBBWlhfTUFYX0JVRl9TSVpFCSgxMDI0KjEwMjQqMTAyNCkKKworLyogUklSQiBpbnQgbWFzazogb3ZlcnJ1blsyXSwgcmVzcG9uc2VbMF0gKi8KKyNkZWZpbmUgUklSQl9JTlRfUkVTUE9OU0UJMHgwMQorI2RlZmluZSBSSVJCX0lOVF9PVkVSUlVOCTB4MDQKKyNkZWZpbmUgUklSQl9JTlRfTUFTSwkJMHgwNQorCisvKiBTVEFURVNUUyBpbnQgbWFzazogUzMsU0QyLFNEMSxTRDAgKi8KKyNkZWZpbmUgQVpYX01BWF9DT0RFQ1MJCTgKKyNkZWZpbmUgQVpYX0RFRkFVTFRfQ09ERUNTCTQKKyNkZWZpbmUgU1RBVEVTVFNfSU5UX01BU0sJKCgxIDw8IEFaWF9NQVhfQ09ERUNTKSAtIDEpCisKKy8qIFNEX0NUTCBiaXRzICovCisjZGVmaW5lIFNEX0NUTF9TVFJFQU1fUkVTRVQJMHgwMQkvKiBzdHJlYW0gcmVzZXQgYml0ICovCisjZGVmaW5lIFNEX0NUTF9ETUFfU1RBUlQJMHgwMgkvKiBzdHJlYW0gRE1BIHN0YXJ0IGJpdCAqLworI2RlZmluZSBTRF9DVExfU1RSSVBFCQkoMyA8PCAxNikJLyogc3RyaXBlIGNvbnRyb2wgKi8KKyNkZWZpbmUgU0RfQ1RMX1RSQUZGSUNfUFJJTwkoMSA8PCAxOCkJLyogdHJhZmZpYyBwcmlvcml0eSAqLworI2RlZmluZSBTRF9DVExfRElSCQkoMSA8PCAxOSkJLyogYmktZGlyZWN0aW9uYWwgc3RyZWFtICovCisjZGVmaW5lIFNEX0NUTF9TVFJFQU1fVEFHX01BU0sJKDB4ZiA8PCAyMCkKKyNkZWZpbmUgU0RfQ1RMX1NUUkVBTV9UQUdfU0hJRlQJMjAKKworLyogU0RfQ1RMIGFuZCBTRF9TVFMgKi8KKyNkZWZpbmUgU0RfSU5UX0RFU0NfRVJSCQkweDEwCS8qIGRlc2NyaXB0b3IgZXJyb3IgaW50ZXJydXB0ICovCisjZGVmaW5lIFNEX0lOVF9GSUZPX0VSUgkJMHgwOAkvKiBGSUZPIGVycm9yIGludGVycnVwdCAqLworI2RlZmluZSBTRF9JTlRfQ09NUExFVEUJCTB4MDQJLyogY29tcGxldGlvbiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0RfSU5UX01BU0sJCShTRF9JTlRfREVTQ19FUlJ8U0RfSU5UX0ZJRk9fRVJSfFwKKwkJCQkgU0RfSU5UX0NPTVBMRVRFKQorCisvKiBTRF9TVFMgKi8KKyNkZWZpbmUgU0RfU1RTX0ZJRk9fUkVBRFkJMHgyMAkvKiBGSUZPIHJlYWR5ICovCisKKy8qIElOVENUTCBhbmQgSU5UU1RTICovCisjZGVmaW5lIElDSDZfSU5UX0FMTF9TVFJFQU0JMHhmZgkgICAvKiBhbGwgc3RyZWFtIGludGVycnVwdHMgKi8KKyNkZWZpbmUgSUNINl9JTlRfQ1RSTF9FTgkweDQwMDAwMDAwIC8qIGNvbnRyb2xsZXIgaW50ZXJydXB0IGVuYWJsZSBiaXQgKi8KKyNkZWZpbmUgSUNINl9JTlRfR0xPQkFMX0VOCTB4ODAwMDAwMDAgLyogZ2xvYmFsIGludGVycnVwdCBlbmFibGUgYml0ICovCisKKy8qIGJlbG93IGFyZSBzbyBmYXIgaGFyZGNvZGVkIC0gc2hvdWxkIHJlYWQgcmVnaXN0ZXJzIGluIGZ1dHVyZSAqLworI2RlZmluZSBJQ0g2X01BWF9DT1JCX0VOVFJJRVMJMjU2CisjZGVmaW5lIElDSDZfTUFYX1JJUkJfRU5UUklFUwkyNTYKKworLyogZHJpdmVyIHF1aXJrcyAoY2FwYWJpbGl0aWVzKSAqLworLyogYml0cyAwLTcgYXJlIHVzZWQgZm9yIGluZGljYXRpbmcgZHJpdmVyIHR5cGUgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX05PX1RDU0VMCSgxIDw8IDgpCS8qIE5vIEludGVsIFRDU0VMIGJpdCAqLworI2RlZmluZSBBWlhfRENBUFNfTk9fTVNJCSgxIDw8IDkpCS8qIE5vIE1TSSBzdXBwb3J0ICovCisjZGVmaW5lIEFaWF9EQ0FQU19BVElfU05PT1AJKDEgPDwgMTApCS8qIEFUSSBzbm9vcCBlbmFibGUgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX05WSURJQV9TTk9PUAkoMSA8PCAxMSkJLyogTnZpZGlhIHNub29wIGVuYWJsZSAqLworI2RlZmluZSBBWlhfRENBUFNfU0NIX1NOT09QCSgxIDw8IDEyKQkvKiBTQ0gvUENIIHNub29wIGVuYWJsZSAqLworI2RlZmluZSBBWlhfRENBUFNfUklSQl9ERUxBWQkoMSA8PCAxMykJLyogTG9uZyBkZWxheSBpbiByZWFkIGxvb3AgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX1JJUkJfUFJFX0RFTEFZICgxIDw8IDE0KQkvKiBQdXQgYSBkZWxheSBiZWZvcmUgcmVhZCAqLworI2RlZmluZSBBWlhfRENBUFNfQ1RYX1dPUktBUk9VTkQgKDEgPDwgMTUpCS8qIFgtRmkgd29ya2Fyb3VuZCAqLworI2RlZmluZSBBWlhfRENBUFNfUE9TRklYX0xQSUIJKDEgPDwgMTYpCS8qIFVzZSBMUElCIGFzIGRlZmF1bHQgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX1BPU0ZJWF9WSUEJKDEgPDwgMTcpCS8qIFVzZSBWSUFDT01CTyBhcyBkZWZhdWx0ICovCisjZGVmaW5lIEFaWF9EQ0FQU19OT182NEJJVAkoMSA8PCAxOCkJLyogTm8gNjRiaXQgYWRkcmVzcyAqLworI2RlZmluZSBBWlhfRENBUFNfU1lOQ19XUklURQkoMSA8PCAxOSkJLyogc3luYyBlYWNoIGNtZCB3cml0ZSAqLworI2RlZmluZSBBWlhfRENBUFNfT0xEX1NTWU5DCSgxIDw8IDIwKQkvKiBPbGQgU1NZTkMgcmVnIGZvciBJQ0ggKi8KKyNkZWZpbmUgQVpYX0RDQVBTX0JVRlNJWkUJKDEgPDwgMjEpCS8qIG5vIGJ1ZmZlciBzaXplIGFsaWdubWVudCAqLworI2RlZmluZSBBWlhfRENBUFNfQUxJR05fQlVGU0laRQkoMSA8PCAyMikJLyogYnVmZmVyIHNpemUgYWxpZ25tZW50ICovCisjZGVmaW5lIEFaWF9EQ0FQU180S19CRExFX0JPVU5EQVJZICgxIDw8IDIzKQkvKiBCRExFIGluIDRrIGJvdW5kYXJ5ICovCisjZGVmaW5lIEFaWF9EQ0FQU19DT1VOVF9MUElCX0RFTEFZICAoMSA8PCAyNSkJLyogVGFrZSBMUElCIGFzIGRlbGF5ICovCisjZGVmaW5lIEFaWF9EQ0FQU19QTV9SVU5USU1FCSgxIDw8IDI2KQkvKiBydW50aW1lIFBNIHN1cHBvcnQgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX0k5MTVfUE9XRVJXRUxMICgxIDw8IDI3KQkvKiBIU1cgaTkxNSBwb3dlcndlbGwgc3VwcG9ydCAqLworCisvKiBwb3NpdGlvbiBmaXggbW9kZSAqLworZW51bSB7CisJUE9TX0ZJWF9BVVRPLAorCVBPU19GSVhfTFBJQiwKKwlQT1NfRklYX1BPU0JVRiwKKwlQT1NfRklYX1ZJQUNPTUJPLAorCVBPU19GSVhfQ09NQk8sCit9OworCisvKiBEZWZpbmVzIGZvciBBVEkgSEQgQXVkaW8gc3VwcG9ydCBpbiBTQjQ1MCBzb3V0aCBicmlkZ2UgKi8KKyNkZWZpbmUgQVRJX1NCNDUwX0hEQVVESU9fTUlTQ19DTlRSMl9BRERSICAgMHg0MgorI2RlZmluZSBBVElfU0I0NTBfSERBVURJT19FTkFCTEVfU05PT1AgICAgICAweDAyCisKKy8qIERlZmluZXMgZm9yIE52aWRpYSBIREEgc3VwcG9ydCAqLworI2RlZmluZSBOVklESUFfSERBX1RSQU5TUkVHX0FERFIgICAgICAweDRlCisjZGVmaW5lIE5WSURJQV9IREFfRU5BQkxFX0NPSEJJVFMgICAgIDB4MGYKKyNkZWZpbmUgTlZJRElBX0hEQV9JU1RSTV9DT0ggICAgICAgICAgMHg0ZAorI2RlZmluZSBOVklESUFfSERBX09TVFJNX0NPSCAgICAgICAgICAweDRjCisjZGVmaW5lIE5WSURJQV9IREFfRU5BQkxFX0NPSEJJVCAgICAgIDB4MDEKKworLyogRGVmaW5lcyBmb3IgSW50ZWwgU0NIIEhEQSBzbm9vcCBjb250cm9sICovCisjZGVmaW5lIElOVEVMX1NDSF9IREFfREVWQyAgICAgIDB4NzgKKyNkZWZpbmUgSU5URUxfU0NIX0hEQV9ERVZDX05PU05PT1AgICAgICAgKDB4MTw8MTEpCisKKy8qIERlZmluZSBJTiBzdHJlYW0gMCBGSUZPIHNpemUgb2Zmc2V0IGluIFZJQSBjb250cm9sbGVyICovCisjZGVmaW5lIFZJQV9JTl9TVFJFQU0wX0ZJRk9fU0laRV9PRkZTRVQJMHg5MAorLyogRGVmaW5lIFZJQSBIRCBBdWRpbyBEZXZpY2UgSUQqLworI2RlZmluZSBWSUFfSERBQ19ERVZJQ0VfSUQJCTB4MzI4OAorCisvKiBIRCBBdWRpbyBjbGFzcyBjb2RlICovCisjZGVmaW5lIFBDSV9DTEFTU19NVUxUSU1FRElBX0hEX0FVRElPCTB4MDQwMworCitzdHJ1Y3QgYXp4X2RldiB7CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyIGJkbDsgLyogQkRMIGJ1ZmZlciAqLworCXUzMiAqcG9zYnVmOwkJLyogcG9zaXRpb24gYnVmZmVyIHBvaW50ZXIgKi8KKworCXVuc2lnbmVkIGludCBidWZzaXplOwkvKiBzaXplIG9mIHRoZSBwbGF5IGJ1ZmZlciBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludCBwZXJpb2RfYnl0ZXM7IC8qIHNpemUgb2YgdGhlIHBlcmlvZCBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludCBmcmFnczsJLyogbnVtYmVyIGZvciBwZXJpb2QgaW4gdGhlIHBsYXkgYnVmZmVyICovCisJdW5zaWduZWQgaW50IGZpZm9fc2l6ZTsJLyogRklGTyBzaXplICovCisJdW5zaWduZWQgbG9uZyBzdGFydF93YWxsY2xrOwkvKiBzdGFydCArIG1pbmltdW0gd2FsbGNsayAqLworCXVuc2lnbmVkIGxvbmcgcGVyaW9kX3dhbGxjbGs7CS8qIHdhbGxjbGsgZm9yIHBlcmlvZCAqLworCisJdm9pZCBfX2lvbWVtICpzZF9hZGRyOwkvKiBzdHJlYW0gZGVzY3JpcHRvciBwb2ludGVyICovCisKKwl1MzIgc2RfaW50X3N0YV9tYXNrOwkvKiBzdHJlYW0gaW50IHN0YXR1cyBtYXNrICovCisKKwkvKiBwY20gc3VwcG9ydCAqLworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOwkvKiBhc3NpZ25lZCBzdWJzdHJlYW0sCisJCQkJCQkgKiBzZXQgaW4gUENNIG9wZW4KKwkJCQkJCSAqLworCXVuc2lnbmVkIGludCBmb3JtYXRfdmFsOwkvKiBmb3JtYXQgdmFsdWUgdG8gYmUgc2V0IGluIHRoZQorCQkJCQkgKiBjb250cm9sbGVyIGFuZCB0aGUgY29kZWMKKwkJCQkJICovCisJdW5zaWduZWQgY2hhciBzdHJlYW1fdGFnOwkvKiBhc3NpZ25lZCBzdHJlYW0gKi8KKwl1bnNpZ25lZCBjaGFyIGluZGV4OwkJLyogc3RyZWFtIGluZGV4ICovCisJaW50IGFzc2lnbmVkX2tleTsJCS8qIGxhc3QgZGV2aWNlIyBrZXkgYXNzaWduZWQgdG8gKi8KKworCXVuc2lnbmVkIGludCBvcGVuZWQ6MTsKKwl1bnNpZ25lZCBpbnQgcnVubmluZzoxOworCXVuc2lnbmVkIGludCBpcnFfcGVuZGluZzoxOworCXVuc2lnbmVkIGludCBwcmVwYXJlZDoxOworCXVuc2lnbmVkIGludCBsb2NrZWQ6MTsKKwkvKgorCSAqIEZvciBWSUE6CisJICogIEEgZmxhZyB0byBlbnN1cmUgRE1BIHBvc2l0aW9uIGlzIDAKKwkgKiAgd2hlbiBsaW5rIHBvc2l0aW9uIGlzIG5vdCBncmVhdGVyIHRoYW4gRklGTyBzaXplCisJICovCisJdW5zaWduZWQgaW50IGluc3VmZmljaWVudDoxOworCXVuc2lnbmVkIGludCB3Y19tYXJrZWQ6MTsKKwl1bnNpZ25lZCBpbnQgbm9fcGVyaW9kX3dha2V1cDoxOworCisJc3RydWN0IHRpbWVjb3VudGVyICBhenhfdGM7CisJc3RydWN0IGN5Y2xlY291bnRlciBhenhfY2M7CisKKwlpbnQgZGVsYXlfbmVnYXRpdmVfdGhyZXNob2xkOworCisjaWZkZWYgQ09ORklHX1NORF9IREFfRFNQX0xPQURFUgorCS8qIEFsbG93cyBkc3AgbG9hZCB0byBoYXZlIHNvbGUgYWNjZXNzIHRvIHRoZSBwbGF5YmFjayBzdHJlYW0uICovCisJc3RydWN0IG11dGV4IGRzcF9tdXRleDsKKyNlbmRpZgorfTsKKworLyogQ09SQi9SSVJCICovCitzdHJ1Y3QgYXp4X3JiIHsKKwl1MzIgKmJ1ZjsJCS8qIENPUkIvUklSQiBidWZmZXIKKwkJCQkgKiBFYWNoIENPUkIgZW50cnkgaXMgNGJ5dGUsIFJJUkIgaXMgOGJ5dGUKKwkJCQkgKi8KKwlkbWFfYWRkcl90IGFkZHI7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgQ09SQi9SSVJCIGJ1ZmZlciAqLworCS8qIGZvciBSSVJCICovCisJdW5zaWduZWQgc2hvcnQgcnAsIHdwOwkvKiByZWFkL3dyaXRlIHBvaW50ZXJzICovCisJaW50IGNtZHNbQVpYX01BWF9DT0RFQ1NdOwkvKiBudW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0cyAqLworCXUzMiByZXNbQVpYX01BWF9DT0RFQ1NdOwkvKiBsYXN0IHJlYWQgdmFsdWUgKi8KK307CisKK3N0cnVjdCBheng7CisKKy8qIEZ1bmN0aW9ucyB0byByZWFkL3dyaXRlIHRvIGhkYSByZWdpc3RlcnMuICovCitzdHJ1Y3QgaGRhX2NvbnRyb2xsZXJfb3BzIHsKKwkvKiBSZWdpc3RlciBBY2Nlc3MgKi8KKwl2b2lkICgqcmVnX3dyaXRlbCkodTMyIHZhbHVlLCB1MzIgX19pb21lbSAqYWRkcik7CisJdTMyICgqcmVnX3JlYWRsKSh1MzIgX19pb21lbSAqYWRkcik7CisJdm9pZCAoKnJlZ193cml0ZXcpKHUxNiB2YWx1ZSwgdTE2IF9faW9tZW0gKmFkZHIpOworCXUxNiAoKnJlZ19yZWFkdykodTE2IF9faW9tZW0gKmFkZHIpOworCXZvaWQgKCpyZWdfd3JpdGViKSh1OCB2YWx1ZSwgdTggX19pb21lbSAqYWRkcik7CisJdTggKCpyZWdfcmVhZGIpKHU4IF9faW9tZW0gKmFkZHIpOworCS8qIERpc2FibGUgbXNpIGlmIHN1cHBvcnRlZCwgUENJIG9ubHkgKi8KKwlpbnQgKCpkaXNhYmxlX21zaV9yZXNldF9pcnEpKHN0cnVjdCBhenggKik7CisJLyogQWxsb2NhdGlvbiBvcHMgKi8KKwlpbnQgKCpkbWFfYWxsb2NfcGFnZXMpKHN0cnVjdCBhenggKmNoaXAsCisJCQkgICAgICAgaW50IHR5cGUsCisJCQkgICAgICAgc2l6ZV90IHNpemUsCisJCQkgICAgICAgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWYpOworCXZvaWQgKCpkbWFfZnJlZV9wYWdlcykoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWYpOworCWludCAoKnN1YnN0cmVhbV9hbGxvY19wYWdlcykoc3RydWN0IGF6eCAqY2hpcCwKKwkJCQkgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCSAgICAgc2l6ZV90IHNpemUpOworCWludCAoKnN1YnN0cmVhbV9mcmVlX3BhZ2VzKShzdHJ1Y3QgYXp4ICpjaGlwLAorCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7CisJdm9pZCAoKnBjbV9tbWFwX3ByZXBhcmUpKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCSBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmFyZWEpOworCS8qIENoZWNrIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYWNjZXB0YWJsZSAqLworCWludCAoKnBvc2l0aW9uX2NoZWNrKShzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3QgYXp4X2RldiAqYXp4X2Rldik7Cit9OworCitzdHJ1Y3QgYXp4X3BjbSB7CisJc3RydWN0IGF6eCAqY2hpcDsKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtOworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOworCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm9bMl07CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RydWN0IGF6eCB7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkOworCXN0cnVjdCBwY2lfZGV2ICpwY2k7CisJaW50IGRldl9pbmRleDsKKworCS8qIGNoaXAgdHlwZSBzcGVjaWZpYyAqLworCWludCBkcml2ZXJfdHlwZTsKKwl1bnNpZ25lZCBpbnQgZHJpdmVyX2NhcHM7CisJaW50IHBsYXliYWNrX3N0cmVhbXM7CisJaW50IHBsYXliYWNrX2luZGV4X29mZnNldDsKKwlpbnQgY2FwdHVyZV9zdHJlYW1zOworCWludCBjYXB0dXJlX2luZGV4X29mZnNldDsKKwlpbnQgbnVtX3N0cmVhbXM7CisJY29uc3QgaW50ICpqYWNrcG9sbF9tczsgLyogcGVyLWNhcmQgamFjayBwb2xsIGludGVydmFsICovCisKKwkvKiBSZWdpc3RlciBpbnRlcmFjdGlvbi4gKi8KKwljb25zdCBzdHJ1Y3QgaGRhX2NvbnRyb2xsZXJfb3BzICpvcHM7CisKKwkvKiBwY2kgcmVzb3VyY2VzICovCisJdW5zaWduZWQgbG9uZyBhZGRyOworCXZvaWQgX19pb21lbSAqcmVtYXBfYWRkcjsKKwlpbnQgaXJxOworCisJLyogbG9ja3MgKi8KKwlzcGlubG9ja190IHJlZ19sb2NrOworCXN0cnVjdCBtdXRleCBvcGVuX211dGV4OyAvKiBQcmV2ZW50cyBjb25jdXJyZW50IG9wZW4vY2xvc2Ugb3BlcmF0aW9ucyAqLworCXN0cnVjdCBjb21wbGV0aW9uIHByb2JlX3dhaXQ7CisKKwkvKiBzdHJlYW1zICh4IG51bV9zdHJlYW1zKSAqLworCXN0cnVjdCBhenhfZGV2ICphenhfZGV2OworCisJLyogUENNICovCisJc3RydWN0IGxpc3RfaGVhZCBwY21fbGlzdDsgLyogYXp4X3BjbSBsaXN0ICovCisKKwkvKiBIRCBjb2RlYyAqLworCXVuc2lnbmVkIHNob3J0IGNvZGVjX21hc2s7CisJaW50ICBjb2RlY19wcm9iZV9tYXNrOyAvKiBjb3BpZWQgZnJvbSBwcm9iZV9tYXNrIG9wdGlvbiAqLworCXN0cnVjdCBoZGFfYnVzICpidXM7CisJdW5zaWduZWQgaW50IGJlZXBfbW9kZTsKKworCS8qIENPUkIvUklSQiAqLworCXN0cnVjdCBhenhfcmIgY29yYjsKKwlzdHJ1Y3QgYXp4X3JiIHJpcmI7CisKKwkvKiBDT1JCL1JJUkIgYW5kIHBvc2l0aW9uIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgcmI7CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyIHBvc2J1ZjsKKworI2lmZGVmIENPTkZJR19TTkRfSERBX1BBVENIX0xPQURFUgorCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisjZW5kaWYKKworCS8qIGZsYWdzICovCisJaW50IHBvc2l0aW9uX2ZpeFsyXTsgLyogZm9yIGJvdGggcGxheWJhY2svY2FwdHVyZSBzdHJlYW1zICovCisJY29uc3QgaW50ICpiZGxfcG9zX2FkajsKKwlpbnQgcG9sbF9jb3VudDsKKwl1bnNpZ25lZCBpbnQgcnVubmluZzoxOworCXVuc2lnbmVkIGludCBpbml0aWFsaXplZDoxOworCXVuc2lnbmVkIGludCBzaW5nbGVfY21kOjE7CisJdW5zaWduZWQgaW50IHBvbGxpbmdfbW9kZToxOworCXVuc2lnbmVkIGludCBtc2k6MTsKKwl1bnNpZ25lZCBpbnQgaXJxX3BlbmRpbmdfd2FybmVkOjE7CisJdW5zaWduZWQgaW50IHByb2Jpbmc6MTsgLyogY29kZWMgcHJvYmluZyBwaGFzZSAqLworCXVuc2lnbmVkIGludCBzbm9vcDoxOworCXVuc2lnbmVkIGludCBhbGlnbl9idWZmZXJfc2l6ZToxOworCXVuc2lnbmVkIGludCByZWdpb25fcmVxdWVzdGVkOjE7CisKKwkvKiBWR0Etc3dpdGNoZXJvbyBzZXR1cCAqLworCXVuc2lnbmVkIGludCB1c2VfdmdhX3N3aXRjaGVyb286MTsKKwl1bnNpZ25lZCBpbnQgdmdhX3N3aXRjaGVyb29fcmVnaXN0ZXJlZDoxOworCXVuc2lnbmVkIGludCBpbml0X2ZhaWxlZDoxOyAvKiBkZWxheWVkIGluaXQgZmFpbGVkICovCisJdW5zaWduZWQgaW50IGRpc2FibGVkOjE7IC8qIGRpc2FibGVkIGJ5IFZHQS1zd2l0Y2hlciAqLworCisJLyogZm9yIGRlYnVnZ2luZyAqLworCXVuc2lnbmVkIGludCBsYXN0X2NtZFtBWlhfTUFYX0NPREVDU107CisKKwkvKiBmb3IgcGVuZGluZyBpcnFzICovCisJc3RydWN0IHdvcmtfc3RydWN0IGlycV9wZW5kaW5nX3dvcms7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcHJvYmVfd29yazsKKworCS8qIHJlYm9vdCBub3RpZmllciAoZm9yIG15c3RlcmlvdXMgaGFuZ3VwIHByb2JsZW0gYXQgcG93ZXItZG93bikgKi8KKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcmVib290X25vdGlmaWVyOworCisJLyogY2FyZCBsaXN0IChmb3IgcG93ZXJfc2F2ZSB0cmlnZ2VyKSAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworI2lmZGVmIENPTkZJR19TTkRfSERBX0RTUF9MT0FERVIKKwlzdHJ1Y3QgYXp4X2RldiBzYXZlZF9henhfZGV2OworI2VuZGlmCisKKwkvKiBzZWNvbmRhcnkgcG93ZXIgZG9tYWluIGZvciBoZG1pIGF1ZGlvIHVuZGVyIHZnYSBkZXZpY2UgKi8KKwlzdHJ1Y3QgZGV2X3BtX2RvbWFpbiBoZG1pX3BtX2RvbWFpbjsKK307CisKKyNpZmRlZiBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLCisjZGVmaW5lIFNGWAkvKiBub3AgKi8KKyNlbHNlCisjZGVmaW5lIFNGWAkiaGRhLWludGVsICIKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1g4NgorI2RlZmluZSBhenhfc25vb3AoY2hpcCkJCSgoY2hpcCktPnNub29wKQorI2Vsc2UKKyNkZWZpbmUgYXp4X3Nub29wKGNoaXApCQl0cnVlCisjZW5kaWYKKworLyoKKyAqIG1hY3JvcyBmb3IgZWFzeSB1c2UKKyAqLworCisjZGVmaW5lIGF6eF93cml0ZWwoY2hpcCwgcmVnLCB2YWx1ZSkgXAorCSgoY2hpcCktPm9wcy0+cmVnX3dyaXRlbCh2YWx1ZSwgKGNoaXApLT5yZW1hcF9hZGRyICsgSUNINl9SRUdfIyNyZWcpKQorI2RlZmluZSBhenhfcmVhZGwoY2hpcCwgcmVnKSBcCisJKChjaGlwKS0+b3BzLT5yZWdfcmVhZGwoKGNoaXApLT5yZW1hcF9hZGRyICsgSUNINl9SRUdfIyNyZWcpKQorI2RlZmluZSBhenhfd3JpdGV3KGNoaXAsIHJlZywgdmFsdWUpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ193cml0ZXcodmFsdWUsIChjaGlwKS0+cmVtYXBfYWRkciArIElDSDZfUkVHXyMjcmVnKSkKKyNkZWZpbmUgYXp4X3JlYWR3KGNoaXAsIHJlZykgXAorCSgoY2hpcCktPm9wcy0+cmVnX3JlYWR3KChjaGlwKS0+cmVtYXBfYWRkciArIElDSDZfUkVHXyMjcmVnKSkKKyNkZWZpbmUgYXp4X3dyaXRlYihjaGlwLCByZWcsIHZhbHVlKSBcCisJKChjaGlwKS0+b3BzLT5yZWdfd3JpdGViKHZhbHVlLCAoY2hpcCktPnJlbWFwX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykpCisjZGVmaW5lIGF6eF9yZWFkYihjaGlwLCByZWcpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ19yZWFkYigoY2hpcCktPnJlbWFwX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykpCisKKyNkZWZpbmUgYXp4X3NkX3dyaXRlbChjaGlwLCBkZXYsIHJlZywgdmFsdWUpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ193cml0ZWwodmFsdWUsIChkZXYpLT5zZF9hZGRyICsgSUNINl9SRUdfIyNyZWcpKQorI2RlZmluZSBhenhfc2RfcmVhZGwoY2hpcCwgZGV2LCByZWcpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ19yZWFkbCgoZGV2KS0+c2RfYWRkciArIElDSDZfUkVHXyMjcmVnKSkKKyNkZWZpbmUgYXp4X3NkX3dyaXRldyhjaGlwLCBkZXYsIHJlZywgdmFsdWUpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ193cml0ZXcodmFsdWUsIChkZXYpLT5zZF9hZGRyICsgSUNINl9SRUdfIyNyZWcpKQorI2RlZmluZSBhenhfc2RfcmVhZHcoY2hpcCwgZGV2LCByZWcpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ19yZWFkdygoZGV2KS0+c2RfYWRkciArIElDSDZfUkVHXyMjcmVnKSkKKyNkZWZpbmUgYXp4X3NkX3dyaXRlYihjaGlwLCBkZXYsIHJlZywgdmFsdWUpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ193cml0ZWIodmFsdWUsIChkZXYpLT5zZF9hZGRyICsgSUNINl9SRUdfIyNyZWcpKQorI2RlZmluZSBhenhfc2RfcmVhZGIoY2hpcCwgZGV2LCByZWcpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ19yZWFkYigoZGV2KS0+c2RfYWRkciArIElDSDZfUkVHXyMjcmVnKSkKKworI2VuZGlmIC8qIF9fU09VTkRfSERBX1BSSVZfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfc3lzZnMuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwNzkwOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX3N5c2ZzLmMKQEAgLTAsMCArMSw3ODAgQEAKKy8qCisgKiBzeXNmcyBpbnRlcmZhY2UgZm9yIEhELWF1ZGlvIGNvZGVjCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqCisgKiBzcGxpdCBmcm9tIGhkYV9od2RlcC5jCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlICJoZGFfY29kZWMuaCIKKyNpbmNsdWRlICJoZGFfbG9jYWwuaCIKKyNpbmNsdWRlIDxzb3VuZC9oZGFfaHdkZXAuaD4KKyNpbmNsdWRlIDxzb3VuZC9taW5vcnMuaD4KKworLyogaGludCBzdHJpbmcgcGFpciAqLworc3RydWN0IGhkYV9oaW50IHsKKwljb25zdCBjaGFyICprZXk7CisJY29uc3QgY2hhciAqdmFsOwkvKiBjb250YWluZWQgaW4gdGhlIHNhbWUgYWxsb2MgYXMga2V5ICovCit9OworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgc3NpemVfdCBwb3dlcl9vbl9hY2N0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjaGFyICpidWYpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzbmRfaGRhX3VwZGF0ZV9wb3dlcl9hY2N0KGNvZGVjKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgamlmZmllc190b19tc2Vjcyhjb2RlYy0+cG93ZXJfb25fYWNjdCkpOworfQorCitzdGF0aWMgc3NpemVfdCBwb3dlcl9vZmZfYWNjdF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzbmRfaGRhX3VwZGF0ZV9wb3dlcl9hY2N0KGNvZGVjKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgamlmZmllc190b19tc2Vjcyhjb2RlYy0+cG93ZXJfb2ZmX2FjY3QpKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSX1JPKHBvd2VyX29uX2FjY3QpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHBvd2VyX29mZl9hY2N0KTsKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworI2RlZmluZSBDT0RFQ19JTkZPX1NIT1codHlwZSkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHR5cGUjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJICAgY2hhciAqYnVmKQkJCQlcCit7CQkJCQkJCQlcCisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCV4XG4iLCBjb2RlYy0+dHlwZSk7CQlcCit9CisKKyNkZWZpbmUgQ09ERUNfSU5GT19TVFJfU0hPVyh0eXBlKQkJCQlcCitzdGF0aWMgc3NpemVfdCB0eXBlIyNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJCQljaGFyICpidWYpCQlcCit7CQkJCQkJCQlcCisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwJCQkJXAorCQkgICAgICAgY29kZWMtPnR5cGUgPyBjb2RlYy0+dHlwZSA6ICIiKTsJCVwKK30KKworQ09ERUNfSU5GT19TSE9XKHZlbmRvcl9pZCk7CitDT0RFQ19JTkZPX1NIT1coc3Vic3lzdGVtX2lkKTsKK0NPREVDX0lORk9fU0hPVyhyZXZpc2lvbl9pZCk7CitDT0RFQ19JTkZPX1NIT1coYWZnKTsKK0NPREVDX0lORk9fU0hPVyhtZmcpOworQ09ERUNfSU5GT19TVFJfU0hPVyh2ZW5kb3JfbmFtZSk7CitDT0RFQ19JTkZPX1NUUl9TSE9XKGNoaXBfbmFtZSk7CitDT0RFQ19JTkZPX1NUUl9TSE9XKG1vZGVsbmFtZSk7CisKK3N0YXRpYyBzc2l6ZV90IHBpbl9jb25maWdzX3Nob3coc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJc3RydWN0IHNuZF9hcnJheSAqbGlzdCwKKwkJCQljaGFyICpidWYpCit7CisJaW50IGksIGxlbiA9IDA7CisJbXV0ZXhfbG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCBsaXN0LT51c2VkOyBpKyspIHsKKwkJc3RydWN0IGhkYV9waW5jZmcgKnBpbiA9IHNuZF9hcnJheV9lbGVtKGxpc3QsIGkpOworCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIweCUwMnggMHglMDh4XG4iLAorCQkJICAgICAgIHBpbi0+bmlkLCBwaW4tPmNmZyk7CisJfQorCW11dGV4X3VubG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGluaXRfcGluX2NvbmZpZ3Nfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXJldHVybiBwaW5fY29uZmlnc19zaG93KGNvZGVjLCAmY29kZWMtPmluaXRfcGlucywgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3QgZHJpdmVyX3Bpbl9jb25maWdzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJcmV0dXJuIHBpbl9jb25maWdzX3Nob3coY29kZWMsICZjb2RlYy0+ZHJpdmVyX3BpbnMsIGJ1Zik7Cit9CisKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRworCisvKgorICogc3lzZnMgaW50ZXJmYWNlCisgKi8KKworc3RhdGljIGludCBjbGVhcl9jb2RlYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gc25kX2hkYV9jb2RlY19yZXNldChjb2RlYyk7CisJaWYgKGVyciA8IDApIHsKKwkJY29kZWNfZXJyKGNvZGVjLCAiVGhlIGNvZGVjIGlzIGJlaW5nIHVzZWQsIGNhbid0IGZyZWUuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJc25kX2hkYV9zeXNmc19jbGVhcihjb2RlYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVjb25maWdfY29kZWMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJaW50IGVycjsKKworCXNuZF9oZGFfcG93ZXJfdXAoY29kZWMpOworCWNvZGVjX2luZm8oY29kZWMsICJoZGEtY29kZWM6IHJlY29uZmlndXJpbmdcbiIpOworCWVyciA9IHNuZF9oZGFfY29kZWNfcmVzZXQoY29kZWMpOworCWlmIChlcnIgPCAwKSB7CisJCWNvZGVjX2Vycihjb2RlYywKKwkJCSAgICJUaGUgY29kZWMgaXMgYmVpbmcgdXNlZCwgY2FuJ3QgcmVjb25maWd1cmUuXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZXJyID0gc25kX2hkYV9jb2RlY19jb25maWd1cmUoY29kZWMpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCS8qIHJlYnVpbGQgUENNcyAqLworCWVyciA9IHNuZF9oZGFfY29kZWNfYnVpbGRfcGNtcyhjb2RlYyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogcmVidWlsZCBtaXhlcnMgKi8KKwllcnIgPSBzbmRfaGRhX2NvZGVjX2J1aWxkX2NvbnRyb2xzKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKwllcnIgPSBzbmRfY2FyZF9yZWdpc3Rlcihjb2RlYy0+YnVzLT5jYXJkKTsKKyBlcnJvcjoKKwlzbmRfaGRhX3Bvd2VyX2Rvd24oY29kZWMpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBhbGxvY2F0ZSBhIHN0cmluZyBhdCBtb3N0IGxlbiBjaGFycywgYW5kIHJlbW92ZSB0aGUgdHJhaWxpbmcgRU9MCisgKi8KK3N0YXRpYyBjaGFyICprc3RybmR1cF9ub2VvbChjb25zdCBjaGFyICpzcmMsIHNpemVfdCBsZW4pCit7CisJY2hhciAqcyA9IGtzdHJuZHVwKHNyYywgbGVuLCBHRlBfS0VSTkVMKTsKKwljaGFyICpwOworCWlmICghcykKKwkJcmV0dXJuIE5VTEw7CisJcCA9IHN0cmNocihzLCAnXG4nKTsKKwlpZiAocCkKKwkJKnAgPSAwOworCXJldHVybiBzOworfQorCisjZGVmaW5lIENPREVDX0lORk9fU1RPUkUodHlwZSkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHR5cGUjI19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCVwKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAorCXVuc2lnbmVkIGxvbmcgdmFsOwkJCQkJXAorCWludCBlcnIgPSBrc3RydG91bChidWYsIDAsICZ2YWwpOwkJCVwKKwlpZiAoZXJyIDwgMCkJCQkJCQlcCisJCXJldHVybiBlcnI7CQkJCQlcCisJY29kZWMtPnR5cGUgPSB2YWw7CQkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCVwKK30KKworI2RlZmluZSBDT0RFQ19JTkZPX1NUUl9TVE9SRSh0eXBlKQkJCQlcCitzdGF0aWMgc3NpemVfdCB0eXBlIyNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQlcCisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKKwljaGFyICpzID0ga3N0cm5kdXBfbm9lb2woYnVmLCA2NCk7CQkJXAorCWlmICghcykJCQkJCQkJXAorCQlyZXR1cm4gLUVOT01FTTsJCQkJCVwKKwlrZnJlZShjb2RlYy0+dHlwZSk7CQkJCQlcCisJY29kZWMtPnR5cGUgPSBzOwkJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQlcCit9CisKK0NPREVDX0lORk9fU1RPUkUodmVuZG9yX2lkKTsKK0NPREVDX0lORk9fU1RPUkUoc3Vic3lzdGVtX2lkKTsKK0NPREVDX0lORk9fU1RPUkUocmV2aXNpb25faWQpOworQ09ERUNfSU5GT19TVFJfU1RPUkUodmVuZG9yX25hbWUpOworQ09ERUNfSU5GT19TVFJfU1RPUkUoY2hpcF9uYW1lKTsKK0NPREVDX0lORk9fU1RSX1NUT1JFKG1vZGVsbmFtZSk7CisKKyNkZWZpbmUgQ09ERUNfQUNUSU9OX1NUT1JFKHR5cGUpCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHR5cGUjI19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCVwKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAorCWludCBlcnIgPSAwOwkJCQkJCVwKKwlpZiAoKmJ1ZikJCQkJCQlcCisJCWVyciA9IHR5cGUjI19jb2RlYyhjb2RlYyk7CQkJXAorCXJldHVybiBlcnIgPCAwID8gZXJyIDogY291bnQ7CQkJCVwKK30KKworQ09ERUNfQUNUSU9OX1NUT1JFKHJlY29uZmlnKTsKK0NPREVDX0FDVElPTl9TVE9SRShjbGVhcik7CisKK3N0YXRpYyBzc2l6ZV90IGluaXRfdmVyYnNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGksIGxlbiA9IDA7CisJbXV0ZXhfbG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+aW5pdF92ZXJicy51c2VkOyBpKyspIHsKKwkJc3RydWN0IGhkYV92ZXJiICp2ID0gc25kX2FycmF5X2VsZW0oJmNvZGVjLT5pbml0X3ZlcmJzLCBpKTsKKwkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgUEFHRV9TSVpFIC0gbGVuLAorCQkJCSIweCUwMnggMHglMDN4IDB4JTA0eFxuIiwKKwkJCQl2LT5uaWQsIHYtPnZlcmIsIHYtPnBhcmFtKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBwYXJzZV9pbml0X3ZlcmJzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICpidWYpCit7CisJc3RydWN0IGhkYV92ZXJiICp2OworCWludCBuaWQsIHZlcmIsIHBhcmFtOworCisJaWYgKHNzY2FuZihidWYsICIlaSAlaSAlaSIsICZuaWQsICZ2ZXJiLCAmcGFyYW0pICE9IDMpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghbmlkIHx8ICF2ZXJiKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltdXRleF9sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7CisJdiA9IHNuZF9hcnJheV9uZXcoJmNvZGVjLT5pbml0X3ZlcmJzKTsKKwlpZiAoIXYpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl2LT5uaWQgPSBuaWQ7CisJdi0+dmVyYiA9IHZlcmI7CisJdi0+cGFyYW0gPSBwYXJhbTsKKwltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgaW5pdF92ZXJic19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyID0gcGFyc2VfaW5pdF92ZXJicyhjb2RlYywgYnVmKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGhpbnRzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGksIGxlbiA9IDA7CisJbXV0ZXhfbG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+aGludHMudXNlZDsgaSsrKSB7CisJCXN0cnVjdCBoZGFfaGludCAqaGludCA9IHNuZF9hcnJheV9lbGVtKCZjb2RlYy0+aGludHMsIGkpOworCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBQQUdFX1NJWkUgLSBsZW4sCisJCQkJIiVzID0gJXNcbiIsIGhpbnQtPmtleSwgaGludC0+dmFsKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBoZGFfaGludCAqZ2V0X2hpbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKmtleSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+aGludHMudXNlZDsgaSsrKSB7CisJCXN0cnVjdCBoZGFfaGludCAqaGludCA9IHNuZF9hcnJheV9lbGVtKCZjb2RlYy0+aGludHMsIGkpOworCQlpZiAoIXN0cmNtcChoaW50LT5rZXksIGtleSkpCisJCQlyZXR1cm4gaGludDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV90cmFpbF9zcGFjZXMoY2hhciAqc3RyKQoreworCWNoYXIgKnA7CisJaWYgKCEqc3RyKQorCQlyZXR1cm47CisJcCA9IHN0ciArIHN0cmxlbihzdHIpIC0gMTsKKwlmb3IgKDsgaXNzcGFjZSgqcCk7IHAtLSkgeworCQkqcCA9IDA7CisJCWlmIChwID09IHN0cikKKwkJCXJldHVybjsKKwl9Cit9CisKKyNkZWZpbmUgTUFYX0hJTlRTCTEwMjQKKworc3RhdGljIGludCBwYXJzZV9oaW50cyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqYnVmKQoreworCWNoYXIgKmtleSwgKnZhbDsKKwlzdHJ1Y3QgaGRhX2hpbnQgKmhpbnQ7CisJaW50IGVyciA9IDA7CisKKwlidWYgPSBza2lwX3NwYWNlcyhidWYpOworCWlmICghKmJ1ZiB8fCAqYnVmID09ICcjJyB8fCAqYnVmID09ICdcbicpCisJCXJldHVybiAwOworCWlmICgqYnVmID09ICc9JykKKwkJcmV0dXJuIC1FSU5WQUw7CisJa2V5ID0ga3N0cm5kdXBfbm9lb2woYnVmLCAxMDI0KTsKKwlpZiAoIWtleSkKKwkJcmV0dXJuIC1FTk9NRU07CisJLyogZXh0cmFjdCBrZXkgYW5kIHZhbCAqLworCXZhbCA9IHN0cmNocihrZXksICc9Jyk7CisJaWYgKCF2YWwpIHsKKwkJa2ZyZWUoa2V5KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCSp2YWwrKyA9IDA7CisJdmFsID0gc2tpcF9zcGFjZXModmFsKTsKKwlyZW1vdmVfdHJhaWxfc3BhY2VzKGtleSk7CisJcmVtb3ZlX3RyYWlsX3NwYWNlcyh2YWwpOworCW11dGV4X2xvY2soJmNvZGVjLT51c2VyX211dGV4KTsKKwloaW50ID0gZ2V0X2hpbnQoY29kZWMsIGtleSk7CisJaWYgKGhpbnQpIHsKKwkJLyogcmVwbGFjZSAqLworCQlrZnJlZShoaW50LT5rZXkpOworCQloaW50LT5rZXkgPSBrZXk7CisJCWhpbnQtPnZhbCA9IHZhbDsKKwkJZ290byB1bmxvY2s7CisJfQorCS8qIGFsbG9jYXRlIGEgbmV3IGhpbnQgZW50cnkgKi8KKwlpZiAoY29kZWMtPmhpbnRzLnVzZWQgPj0gTUFYX0hJTlRTKQorCQloaW50ID0gTlVMTDsKKwllbHNlCisJCWhpbnQgPSBzbmRfYXJyYXlfbmV3KCZjb2RlYy0+aGludHMpOworCWlmIChoaW50KSB7CisJCWhpbnQtPmtleSA9IGtleTsKKwkJaGludC0+dmFsID0gdmFsOworCX0gZWxzZSB7CisJCWVyciA9IC1FTk9NRU07CisJfQorIHVubG9jazoKKwltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKKwlpZiAoZXJyKQorCQlrZnJlZShrZXkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGhpbnRzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyID0gcGFyc2VfaGludHMoY29kZWMsIGJ1Zik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCB1c2VyX3Bpbl9jb25maWdzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlyZXR1cm4gcGluX2NvbmZpZ3Nfc2hvdyhjb2RlYywgJmNvZGVjLT51c2VyX3BpbnMsIGJ1Zik7Cit9CisKKyNkZWZpbmUgTUFYX1BJTl9DT05GSUdTCQkzMgorCitzdGF0aWMgaW50IHBhcnNlX3VzZXJfcGluX2NvbmZpZ3Moc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKmJ1ZikKK3sKKwlpbnQgbmlkLCBjZmcsIGVycjsKKworCWlmIChzc2NhbmYoYnVmLCAiJWkgJWkiLCAmbmlkLCAmY2ZnKSAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIW5pZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOworCWVyciA9IHNuZF9oZGFfYWRkX3BpbmNmZyhjb2RlYywgJmNvZGVjLT51c2VyX3BpbnMsIG5pZCwgY2ZnKTsKKwltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3NpemVfdCB1c2VyX3Bpbl9jb25maWdzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBlcnIgPSBwYXJzZV91c2VyX3Bpbl9jb25maWdzKGNvZGVjLCBidWYpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiBjb3VudDsKK30KKworLyogc3lzZnMgYXR0cmlidXRlcyBleHBvc2VkIG9ubHkgd2hlbiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRz15ICovCitzdGF0aWMgREVWSUNFX0FUVFJfUlcoaW5pdF92ZXJicyk7CitzdGF0aWMgREVWSUNFX0FUVFJfUlcoaGludHMpOworc3RhdGljIERFVklDRV9BVFRSX1JXKHVzZXJfcGluX2NvbmZpZ3MpOworc3RhdGljIERFVklDRV9BVFRSX1dPKHJlY29uZmlnKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9XTyhjbGVhcik7CisKKy8qCisgKiBMb29rIGZvciBoaW50IHN0cmluZworICovCitjb25zdCBjaGFyICpzbmRfaGRhX2dldF9oaW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICprZXkpCit7CisJc3RydWN0IGhkYV9oaW50ICpoaW50ID0gZ2V0X2hpbnQoY29kZWMsIGtleSk7CisJcmV0dXJuIGhpbnQgPyBoaW50LT52YWwgOiBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9nZXRfaGludCk7CisKK2ludCBzbmRfaGRhX2dldF9ib29sX2hpbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKmtleSkKK3sKKwljb25zdCBjaGFyICpwOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7CisJcCA9IHNuZF9oZGFfZ2V0X2hpbnQoY29kZWMsIGtleSk7CisJaWYgKCFwIHx8ICEqcCkKKwkJcmV0ID0gLUVOT0VOVDsKKwllbHNlIHsKKwkJc3dpdGNoICh0b3VwcGVyKCpwKSkgeworCQljYXNlICdUJzogLyogdHJ1ZSAqLworCQljYXNlICdZJzogLyogeWVzICovCisJCWNhc2UgJzEnOgorCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2dldF9ib29sX2hpbnQpOworCitpbnQgc25kX2hkYV9nZXRfaW50X2hpbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKmtleSwgaW50ICp2YWxwKQoreworCWNvbnN0IGNoYXIgKnA7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNvZGVjLT51c2VyX211dGV4KTsKKwlwID0gc25kX2hkYV9nZXRfaGludChjb2RlYywga2V5KTsKKwlpZiAoIXApCisJCXJldCA9IC1FTk9FTlQ7CisJZWxzZSBpZiAoa3N0cnRvdWwocCwgMCwgJnZhbCkpCisJCXJldCA9IC1FSU5WQUw7CisJZWxzZSB7CisJCSp2YWxwID0gdmFsOworCQlyZXQgPSAwOworCX0KKwltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9nZXRfaW50X2hpbnQpOworI2VuZGlmIC8qIENPTkZJR19TTkRfSERBX1JFQ09ORklHICovCisKKy8qCisgKiBjb21tb24gc3lzZnMgYXR0cmlidXRlcworICovCisjaWZkZWYgQ09ORklHX1NORF9IREFfUkVDT05GSUcKKyNkZWZpbmUgUkVDT05GSUdfREVWSUNFX0FUVFIobmFtZSkJREVWSUNFX0FUVFJfUlcobmFtZSkKKyNlbHNlCisjZGVmaW5lIFJFQ09ORklHX0RFVklDRV9BVFRSKG5hbWUpCURFVklDRV9BVFRSX1JPKG5hbWUpCisjZW5kaWYKK3N0YXRpYyBSRUNPTkZJR19ERVZJQ0VfQVRUUih2ZW5kb3JfaWQpOworc3RhdGljIFJFQ09ORklHX0RFVklDRV9BVFRSKHN1YnN5c3RlbV9pZCk7CitzdGF0aWMgUkVDT05GSUdfREVWSUNFX0FUVFIocmV2aXNpb25faWQpOworc3RhdGljIERFVklDRV9BVFRSX1JPKGFmZyk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8obWZnKTsKK3N0YXRpYyBSRUNPTkZJR19ERVZJQ0VfQVRUUih2ZW5kb3JfbmFtZSk7CitzdGF0aWMgUkVDT05GSUdfREVWSUNFX0FUVFIoY2hpcF9uYW1lKTsKK3N0YXRpYyBSRUNPTkZJR19ERVZJQ0VfQVRUUihtb2RlbG5hbWUpOworc3RhdGljIERFVklDRV9BVFRSX1JPKGluaXRfcGluX2NvbmZpZ3MpOworc3RhdGljIERFVklDRV9BVFRSX1JPKGRyaXZlcl9waW5fY29uZmlncyk7CisKKworI2lmZGVmIENPTkZJR19TTkRfSERBX1BBVENIX0xPQURFUgorCisvKiBwYXJzZXIgbW9kZSAqLworZW51bSB7CisJTElORV9NT0RFX05PTkUsCisJTElORV9NT0RFX0NPREVDLAorCUxJTkVfTU9ERV9NT0RFTCwKKwlMSU5FX01PREVfUElOQ0ZHLAorCUxJTkVfTU9ERV9WRVJCLAorCUxJTkVfTU9ERV9ISU5ULAorCUxJTkVfTU9ERV9WRU5ET1JfSUQsCisJTElORV9NT0RFX1NVQlNZU1RFTV9JRCwKKwlMSU5FX01PREVfUkVWSVNJT05fSUQsCisJTElORV9NT0RFX0NISVBfTkFNRSwKKwlOVU1fTElORV9NT0RFUywKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHN0cm1hdGNoKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpCit7CisJcmV0dXJuIHN0cm5pY21wKGEsIGIsIHN0cmxlbihiKSkgPT0gMDsKK30KKworLyogcGFyc2UgdGhlIGNvbnRlbnRzIGFmdGVyIHRoZSBsaW5lICJbY29kZWNdIgorICogYWNjZXB0IG9ubHkgdGhlIGxpbmUgd2l0aCB0aHJlZSBudW1iZXJzLCBhbmQgYXNzaWduIHRoZSBjdXJyZW50IGNvZGVjCisgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX2NvZGVjX21vZGUoY2hhciAqYnVmLCBzdHJ1Y3QgaGRhX2J1cyAqYnVzLAorCQkJICAgICBzdHJ1Y3QgaGRhX2NvZGVjICoqY29kZWNwKQoreworCWludCB2ZW5kb3JpZCwgc3ViaWQsIGNhZGRyOworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOworCisJKmNvZGVjcCA9IE5VTEw7CisJaWYgKHNzY2FuZihidWYsICIlaSAlaSAlaSIsICZ2ZW5kb3JpZCwgJnN1YmlkLCAmY2FkZHIpID09IDMpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjb2RlYywgJmJ1cy0+Y29kZWNfbGlzdCwgbGlzdCkgeworCQkJaWYgKCh2ZW5kb3JpZCA8PSAwIHx8IGNvZGVjLT52ZW5kb3JfaWQgPT0gdmVuZG9yaWQpICYmCisJCQkgICAgKHN1YmlkIDw9IDAgfHwgY29kZWMtPnN1YnN5c3RlbV9pZCA9PSBzdWJpZCkgJiYKKwkJCSAgICBjb2RlYy0+YWRkciA9PSBjYWRkcikgeworCQkJCSpjb2RlY3AgPSBjb2RlYzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworLyogcGFyc2UgdGhlIGNvbnRlbnRzIGFmdGVyIHRoZSBvdGhlciBjb21tYW5kIHRhZ3MsIFtwaW5jZmddLCBbdmVyYl0sCisgKiBbdmVuZG9yX2lkXSwgW3N1YnN5c3RlbV9pZF0sIFtyZXZpc2lvbl9pZF0sIFtjaGlwX25hbWVdLCBbaGludF0gYW5kIFttb2RlbF0KKyAqIGp1c3QgcGFzcyB0byB0aGUgc3lzZnMgaGVscGVyIChvbmx5IHdoZW4gYW55IGNvZGVjIHdhcyBzcGVjaWZpZWQpCisgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX3BpbmNmZ19tb2RlKGNoYXIgKmJ1Ziwgc3RydWN0IGhkYV9idXMgKmJ1cywKKwkJCSAgICAgIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCit7CisJcGFyc2VfdXNlcl9waW5fY29uZmlncygqY29kZWNwLCBidWYpOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV92ZXJiX21vZGUoY2hhciAqYnVmLCBzdHJ1Y3QgaGRhX2J1cyAqYnVzLAorCQkJICAgIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCit7CisJcGFyc2VfaW5pdF92ZXJicygqY29kZWNwLCBidWYpOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9oaW50X21vZGUoY2hhciAqYnVmLCBzdHJ1Y3QgaGRhX2J1cyAqYnVzLAorCQkJICAgIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCit7CisJcGFyc2VfaGludHMoKmNvZGVjcCwgYnVmKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfbW9kZWxfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsCisJCQkgICAgIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCit7CisJa2ZyZWUoKCpjb2RlY3ApLT5tb2RlbG5hbWUpOworCSgqY29kZWNwKS0+bW9kZWxuYW1lID0ga3N0cmR1cChidWYsIEdGUF9LRVJORUwpOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9jaGlwX25hbWVfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsCisJCQkJIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCit7CisJa2ZyZWUoKCpjb2RlY3ApLT5jaGlwX25hbWUpOworCSgqY29kZWNwKS0+Y2hpcF9uYW1lID0ga3N0cmR1cChidWYsIEdGUF9LRVJORUwpOworfQorCisjZGVmaW5lIERFRklORV9QQVJTRV9JRF9NT0RFKG5hbWUpIFwKK3N0YXRpYyB2b2lkIHBhcnNlXyMjbmFtZSMjX21vZGUoY2hhciAqYnVmLCBzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBcCisJCQkJIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApIFwKK3sgXAorCXVuc2lnbmVkIGxvbmcgdmFsOyBcCisJaWYgKCFrc3RydG91bChidWYsIDAsICZ2YWwpKSBcCisJCSgqY29kZWNwKS0+bmFtZSA9IHZhbDsgXAorfQorCitERUZJTkVfUEFSU0VfSURfTU9ERSh2ZW5kb3JfaWQpOworREVGSU5FX1BBUlNFX0lEX01PREUoc3Vic3lzdGVtX2lkKTsKK0RFRklORV9QQVJTRV9JRF9NT0RFKHJldmlzaW9uX2lkKTsKKworCitzdHJ1Y3QgaGRhX3BhdGNoX2l0ZW0geworCWNvbnN0IGNoYXIgKnRhZzsKKwljb25zdCBjaGFyICphbGlhczsKKwl2b2lkICgqcGFyc2VyKShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsIHN0cnVjdCBoZGFfY29kZWMgKipyZXRjKTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BhdGNoX2l0ZW0gcGF0Y2hfaXRlbXNbTlVNX0xJTkVfTU9ERVNdID0geworCVtMSU5FX01PREVfQ09ERUNdID0geworCQkudGFnID0gIltjb2RlY10iLAorCQkucGFyc2VyID0gcGFyc2VfY29kZWNfbW9kZSwKKwl9LAorCVtMSU5FX01PREVfTU9ERUxdID0geworCQkudGFnID0gIlttb2RlbF0iLAorCQkucGFyc2VyID0gcGFyc2VfbW9kZWxfbW9kZSwKKwl9LAorCVtMSU5FX01PREVfVkVSQl0gPSB7CisJCS50YWcgPSAiW3ZlcmJdIiwKKwkJLmFsaWFzID0gIltpbml0X3ZlcmJzXSIsCisJCS5wYXJzZXIgPSBwYXJzZV92ZXJiX21vZGUsCisJfSwKKwlbTElORV9NT0RFX1BJTkNGR10gPSB7CisJCS50YWcgPSAiW3BpbmNmZ10iLAorCQkuYWxpYXMgPSAiW3VzZXJfcGluX2NvbmZpZ3NdIiwKKwkJLnBhcnNlciA9IHBhcnNlX3BpbmNmZ19tb2RlLAorCX0sCisJW0xJTkVfTU9ERV9ISU5UXSA9IHsKKwkJLnRhZyA9ICJbaGludF0iLAorCQkuYWxpYXMgPSAiW2hpbnRzXSIsCisJCS5wYXJzZXIgPSBwYXJzZV9oaW50X21vZGUKKwl9LAorCVtMSU5FX01PREVfVkVORE9SX0lEXSA9IHsKKwkJLnRhZyA9ICJbdmVuZG9yX2lkXSIsCisJCS5wYXJzZXIgPSBwYXJzZV92ZW5kb3JfaWRfbW9kZSwKKwl9LAorCVtMSU5FX01PREVfU1VCU1lTVEVNX0lEXSA9IHsKKwkJLnRhZyA9ICJbc3Vic3lzdGVtX2lkXSIsCisJCS5wYXJzZXIgPSBwYXJzZV9zdWJzeXN0ZW1faWRfbW9kZSwKKwl9LAorCVtMSU5FX01PREVfUkVWSVNJT05fSURdID0geworCQkudGFnID0gIltyZXZpc2lvbl9pZF0iLAorCQkucGFyc2VyID0gcGFyc2VfcmV2aXNpb25faWRfbW9kZSwKKwl9LAorCVtMSU5FX01PREVfQ0hJUF9OQU1FXSA9IHsKKwkJLnRhZyA9ICJbY2hpcF9uYW1lXSIsCisJCS5wYXJzZXIgPSBwYXJzZV9jaGlwX25hbWVfbW9kZSwKKwl9LAorfTsKKworLyogY2hlY2sgdGhlIGxpbmUgc3RhcnRpbmcgd2l0aCAnWycgLS0gY2hhbmdlIHRoZSBwYXJzZXIgbW9kZSBhY2NvZGluZ2x5ICovCitzdGF0aWMgaW50IHBhcnNlX2xpbmVfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGF0Y2hfaXRlbXMpOyBpKyspIHsKKwkJaWYgKCFwYXRjaF9pdGVtc1tpXS50YWcpCisJCQljb250aW51ZTsKKwkJaWYgKHN0cm1hdGNoKGJ1ZiwgcGF0Y2hfaXRlbXNbaV0udGFnKSkKKwkJCXJldHVybiBpOworCQlpZiAocGF0Y2hfaXRlbXNbaV0uYWxpYXMgJiYgc3RybWF0Y2goYnVmLCBwYXRjaF9pdGVtc1tpXS5hbGlhcykpCisJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIExJTkVfTU9ERV9OT05FOworfQorCisvKiBjb3B5IG9uZSBsaW5lIGZyb20gdGhlIGJ1ZmZlciBpbiBmdywgYW5kIHVwZGF0ZSB0aGUgZmllbGRzIGluIGZ3CisgKiByZXR1cm4gemVybyBpZiBpdCByZWFjaGVzIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgb3Igbm9uLXplcm8KKyAqIGlmIHN1Y2Nlc3NmdWxseSBjb3BpZWQgYSBsaW5lCisgKgorICogdGhlIHNwYWNlcyBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kIG9mIHRoZSBsaW5lIGFyZSBzdHJpcHBlZAorICovCitzdGF0aWMgaW50IGdldF9saW5lX2Zyb21fZncoY2hhciAqYnVmLCBpbnQgc2l6ZSwgc2l6ZV90ICpmd19zaXplX3AsCisJCQkgICAgY29uc3Qgdm9pZCAqKmZ3X2RhdGFfcCkKK3sKKwlpbnQgbGVuOworCXNpemVfdCBmd19zaXplID0gKmZ3X3NpemVfcDsKKwljb25zdCBjaGFyICpwID0gKmZ3X2RhdGFfcDsKKworCXdoaWxlIChpc3NwYWNlKCpwKSAmJiBmd19zaXplKSB7CisJCXArKzsKKwkJZndfc2l6ZS0tOworCX0KKwlpZiAoIWZ3X3NpemUpCisJCXJldHVybiAwOworCisJZm9yIChsZW4gPSAwOyBsZW4gPCBmd19zaXplOyBsZW4rKykgeworCQlpZiAoISpwKQorCQkJYnJlYWs7CisJCWlmICgqcCA9PSAnXG4nKSB7CisJCQlwKys7CisJCQlsZW4rKzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChsZW4gPCBzaXplKQorCQkJKmJ1ZisrID0gKnArKzsKKwl9CisJKmJ1ZiA9IDA7CisJKmZ3X3NpemVfcCA9IGZ3X3NpemUgLSBsZW47CisJKmZ3X2RhdGFfcCA9IHA7CisJcmVtb3ZlX3RyYWlsX3NwYWNlcyhidWYpOworCXJldHVybiAxOworfQorCisvKgorICogbG9hZCBhICJwYXRjaCIgZmlybXdhcmUgZmlsZSBhbmQgcGFyc2UgaXQKKyAqLworaW50IHNuZF9oZGFfbG9hZF9wYXRjaChzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBzaXplX3QgZndfc2l6ZSwgY29uc3Qgdm9pZCAqZndfYnVmKQoreworCWNoYXIgYnVmWzEyOF07CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7CisJaW50IGxpbmVfbW9kZTsKKworCWxpbmVfbW9kZSA9IExJTkVfTU9ERV9OT05FOworCWNvZGVjID0gTlVMTDsKKwl3aGlsZSAoZ2V0X2xpbmVfZnJvbV9mdyhidWYsIHNpemVvZihidWYpIC0gMSwgJmZ3X3NpemUsICZmd19idWYpKSB7CisJCWlmICghKmJ1ZiB8fCAqYnVmID09ICcjJyB8fCAqYnVmID09ICdcbicpCisJCQljb250aW51ZTsKKwkJaWYgKCpidWYgPT0gJ1snKQorCQkJbGluZV9tb2RlID0gcGFyc2VfbGluZV9tb2RlKGJ1ZiwgYnVzKTsKKwkJZWxzZSBpZiAocGF0Y2hfaXRlbXNbbGluZV9tb2RlXS5wYXJzZXIgJiYKKwkJCSAoY29kZWMgfHwgbGluZV9tb2RlIDw9IExJTkVfTU9ERV9DT0RFQykpCisJCQlwYXRjaF9pdGVtc1tsaW5lX21vZGVdLnBhcnNlcihidWYsIGJ1cywgJmNvZGVjKTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2xvYWRfcGF0Y2gpOworI2VuZGlmIC8qIENPTkZJR19TTkRfSERBX1BBVENIX0xPQURFUiAqLworCisvKgorICogc3lzZnMgZW50cmllcworICovCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaGRhX2Rldl9hdHRyc1tdID0geworCSZkZXZfYXR0cl92ZW5kb3JfaWQuYXR0ciwKKwkmZGV2X2F0dHJfc3Vic3lzdGVtX2lkLmF0dHIsCisJJmRldl9hdHRyX3JldmlzaW9uX2lkLmF0dHIsCisJJmRldl9hdHRyX2FmZy5hdHRyLAorCSZkZXZfYXR0cl9tZmcuYXR0ciwKKwkmZGV2X2F0dHJfdmVuZG9yX25hbWUuYXR0ciwKKwkmZGV2X2F0dHJfY2hpcF9uYW1lLmF0dHIsCisJJmRldl9hdHRyX21vZGVsbmFtZS5hdHRyLAorCSZkZXZfYXR0cl9pbml0X3Bpbl9jb25maWdzLmF0dHIsCisJJmRldl9hdHRyX2RyaXZlcl9waW5fY29uZmlncy5hdHRyLAorI2lmZGVmIENPTkZJR19QTQorCSZkZXZfYXR0cl9wb3dlcl9vbl9hY2N0LmF0dHIsCisJJmRldl9hdHRyX3Bvd2VyX29mZl9hY2N0LmF0dHIsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRworCSZkZXZfYXR0cl9pbml0X3ZlcmJzLmF0dHIsCisJJmRldl9hdHRyX2hpbnRzLmF0dHIsCisJJmRldl9hdHRyX3VzZXJfcGluX2NvbmZpZ3MuYXR0ciwKKwkmZGV2X2F0dHJfcmVjb25maWcuYXR0ciwKKwkmZGV2X2F0dHJfY2xlYXIuYXR0ciwKKyNlbmRpZgorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGhkYV9kZXZfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMJPSBoZGFfZGV2X2F0dHJzLAorfTsKKworY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqc25kX2hkYV9kZXZfYXR0cl9ncm91cHNbXSA9IHsKKwkmaGRhX2Rldl9hdHRyX2dyb3VwLAorCU5VTEwKK307CisKK3ZvaWQgc25kX2hkYV9zeXNmc19pbml0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCW11dGV4X2luaXQoJmNvZGVjLT51c2VyX211dGV4KTsKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRworCXNuZF9hcnJheV9pbml0KCZjb2RlYy0+aW5pdF92ZXJicywgc2l6ZW9mKHN0cnVjdCBoZGFfdmVyYiksIDMyKTsKKwlzbmRfYXJyYXlfaW5pdCgmY29kZWMtPmhpbnRzLCBzaXplb2Yoc3RydWN0IGhkYV9oaW50KSwgMzIpOworCXNuZF9hcnJheV9pbml0KCZjb2RlYy0+dXNlcl9waW5zLCBzaXplb2Yoc3RydWN0IGhkYV9waW5jZmcpLCAxNik7CisjZW5kaWYKK30KKwordm9pZCBzbmRfaGRhX3N5c2ZzX2NsZWFyKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworI2lmZGVmIENPTkZJR19TTkRfSERBX1JFQ09ORklHCisJaW50IGk7CisKKwkvKiBjbGVhciBpbml0IHZlcmJzICovCisJc25kX2FycmF5X2ZyZWUoJmNvZGVjLT5pbml0X3ZlcmJzKTsKKwkvKiBjbGVhciBoaW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+aGludHMudXNlZDsgaSsrKSB7CisJCXN0cnVjdCBoZGFfaGludCAqaGludCA9IHNuZF9hcnJheV9lbGVtKCZjb2RlYy0+aGludHMsIGkpOworCQlrZnJlZShoaW50LT5rZXkpOyAvKiB3ZSBkb24ndCBuZWVkIHRvIGZyZWUgaGludC0+dmFsICovCisJfQorCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+aGludHMpOworCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+dXNlcl9waW5zKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKaW5kZXggOGVkMGJjYy4uNDBiYTA2ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCkBAIC0yMSw3ICsyMSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMTAuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTEwLmMKaW5kZXggMzBiM2E0Yi4uNWU2NTk5OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMTAuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDExMC5jCkBAIC0yMCw3ICsyMCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlICJoZGFfY29kZWMuaCIKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTMyLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDEzMi5jCmluZGV4IDQ2ZWNkYmIuLjA5MmYyYmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTMyLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMzIuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CkBAIC04NjgsNyArODY3LDcgQEAKIAlpbnQgc3RhdHVzID0gMDsKIAogCWlmIChkYXRhID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImNoaXBpb193cml0ZV9kYXRhIG51bGwgcHRyXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiY2hpcGlvX3dyaXRlX2RhdGEgbnVsbCBwdHJcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE0MDcsMTIgKzE0MDYsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoZGlyID09IFNDUF9HRVQgJiYgcmVwbHkgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiZHNwaW9fc2NwIGdldCBidXQgaGFzIG5vIGJ1ZmZlclxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImRzcGlvX3NjcCBnZXQgYnV0IGhhcyBubyBidWZmZXJcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAocmVwbHkgIT0gTlVMTCAmJiAocmVwbHlfbGVuID09IE5VTEwgfHwgKCpyZXBseV9sZW4gPT0gMCkpKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJkc3Bpb19zY3AgYmFkIHJlc3AgYnVmIGxlbiBwYXJtc1xuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImRzcGlvX3NjcCBiYWQgcmVzcCBidWYgbGVuIHBhcm1zXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNDMwLDcgKzE0MjksNyBAQAogCQkJCQlzaXplb2Yoc2NwX3JlcGx5KSwgJnJldF9ieXRlcyk7CiAKIAlpZiAoc3RhdHVzIDwgMCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiZHNwaW9fc2NwOiBzZW5kIHNjcCBtc2cgZmFpbGVkXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiZHNwaW9fc2NwOiBzZW5kIHNjcCBtc2cgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAKQEAgLTE0NDksMTcgKzE0NDgsMTcgQEAKIAkJCQkJLyBzaXplb2YodW5zaWduZWQgaW50KTsKIAogCQlpZiAoKnJlcGx5X2xlbiA8IHJldF9zaXplKnNpemVvZih1bnNpZ25lZCBpbnQpKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAicmVwbHkgdG9vIGxvbmcgZm9yIGJ1ZlxuIik7CisJCQljb2RlY19kYmcoY29kZWMsICJyZXBseSB0b28gbG9uZyBmb3IgYnVmXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9IGVsc2UgaWYgKHJldF9zaXplICE9IHJlcGx5X2RhdGFfc2l6ZSkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIlJldExlbiBhbmQgSGRyTGVuIC5ORS5cbiIpOworCQkJY29kZWNfZGJnKGNvZGVjLCAiUmV0TGVuIGFuZCBIZHJMZW4gLk5FLlxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfSBlbHNlIHsKIAkJCSpyZXBseV9sZW4gPSByZXRfc2l6ZSpzaXplb2YodW5zaWduZWQgaW50KTsKIAkJCW1lbWNweShyZXBseSwgc2NwX3JlcGx5LmRhdGEsICpyZXBseV9sZW4pOwogCQl9CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgInJlcGx5IGlsbC1mb3JtZWQgb3IgZXJyZmxhZyBzZXRcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJyZXBseSBpbGwtZm9ybWVkIG9yIGVycmZsYWcgc2V0XG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0xNDg5LDIyICsxNDg4LDIyIEBACiAJaW50IHN0YXR1cyA9IDA7CiAJdW5zaWduZWQgaW50IHNpemUgPSBzaXplb2YoZG1hX2NoYW4pOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICAgIGRzcGlvX2FsbG9jX2RtYV9jaGFuKCkgLS0gYmVnaW5cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIiAgICAgZHNwaW9fYWxsb2NfZG1hX2NoYW4oKSAtLSBiZWdpblxuIik7CiAJc3RhdHVzID0gZHNwaW9fc2NwKGNvZGVjLCBNQVNURVJDT05UUk9MLCBNQVNURVJDT05UUk9MX0FMTE9DX0RNQV9DSEFOLAogCQkJU0NQX0dFVCwgTlVMTCwgMCwgZG1hX2NoYW4sICZzaXplKTsKIAogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiZHNwaW9fYWxsb2NfZG1hX2NoYW46IFNDUCBGYWlsZWRcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJkc3Bpb19hbGxvY19kbWFfY2hhbjogU0NQIEZhaWxlZFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCiAJaWYgKCgqZG1hX2NoYW4gKyAxKSA9PSAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAibm8gZnJlZSBkbWEgY2hhbm5lbHMgdG8gYWxsb2NhdGVcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJubyBmcmVlIGRtYSBjaGFubmVscyB0byBhbGxvY2F0ZVxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0Jc25kX3ByaW50ZGQoImRzcGlvX2FsbG9jX2RtYV9jaGFuOiBjaGFuPSVkXG4iLCAqZG1hX2NoYW4pOwotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgICBkc3Bpb19hbGxvY19kbWFfY2hhbigpIC0tIGNvbXBsZXRlXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICJkc3Bpb19hbGxvY19kbWFfY2hhbjogY2hhbj0lZFxuIiwgKmRtYV9jaGFuKTsKKwljb2RlY19kYmcoY29kZWMsICIgICAgIGRzcGlvX2FsbG9jX2RtYV9jaGFuKCkgLS0gY29tcGxldGVcbiIpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE1MTcsMTggKzE1MTYsMTggQEAKIAlpbnQgc3RhdHVzID0gMDsKIAl1bnNpZ25lZCBpbnQgZHVtbXkgPSAwOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICAgIGRzcGlvX2ZyZWVfZG1hX2NoYW4oKSAtLSBiZWdpblxuIik7Ci0Jc25kX3ByaW50ZGQoImRzcGlvX2ZyZWVfZG1hX2NoYW46IGNoYW49JWRcbiIsIGRtYV9jaGFuKTsKKwljb2RlY19kYmcoY29kZWMsICIgICAgIGRzcGlvX2ZyZWVfZG1hX2NoYW4oKSAtLSBiZWdpblxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiZHNwaW9fZnJlZV9kbWFfY2hhbjogY2hhbj0lZFxuIiwgZG1hX2NoYW4pOwogCiAJc3RhdHVzID0gZHNwaW9fc2NwKGNvZGVjLCBNQVNURVJDT05UUk9MLCBNQVNURVJDT05UUk9MX0FMTE9DX0RNQV9DSEFOLAogCQkJICAgU0NQX1NFVCwgJmRtYV9jaGFuLCBzaXplb2YoZG1hX2NoYW4pLCBOVUxMLCAmZHVtbXkpOwogCiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJkc3Bpb19mcmVlX2RtYV9jaGFuOiBTQ1AgRmFpbGVkXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiZHNwaW9fZnJlZV9kbWFfY2hhbjogU0NQIEZhaWxlZFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICAgIGRzcGlvX2ZyZWVfZG1hX2NoYW4oKSAtLSBjb21wbGV0ZVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgICBkc3Bpb19mcmVlX2RtYV9jaGFuKCkgLS0gY29tcGxldGVcbiIpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE1NzYsMTQgKzE1NzUsMTQgQEAKIAl1bnNpZ25lZCBpbnQgcmVzOwogCWludCByZXRyeSA9IDIwOwogCi0Jc25kX3ByaW50ZGQoImRzcF9yZXNldFxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiZHNwX3Jlc2V0XG4iKTsKIAlkbyB7CiAJCXJlcyA9IGRzcGlvX3NlbmQoY29kZWMsIFZFTkRPUl9EU1BJT19EU1BfSU5JVCwgMCk7CiAJCXJldHJ5LS07CiAJfSB3aGlsZSAocmVzID09IC1FSU8gJiYgcmV0cnkpOwogCiAJaWYgKCFyZXRyeSkgewotCQlzbmRfcHJpbnRkZCgiZHNwX3Jlc2V0IHRpbWVvdXRcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJkc3BfcmVzZXQgdGltZW91dFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMTYzNiwzOSArMTYzNSwzOSBAQAogCXVuc2lnbmVkIGludCBhY3RpdmU7CiAJYm9vbCBjb2RlLCB5cmFtOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICItLSBkc3BfZG1hX3NldHVwX2NvbW1vbigpIC0tIEJlZ2luIC0tLS0tLS0tLVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiLS0gZHNwX2RtYV9zZXR1cF9jb21tb24oKSAtLSBCZWdpbiAtLS0tLS0tLS1cbiIpOwogCiAJaWYgKGRtYV9jaGFuID49IERTUERNQUNfRE1BX0NGR19DSEFOTkVMX0NPVU5UKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJkbWEgY2hhbiBudW0gaW52YWxpZFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImRtYSBjaGFuIG51bSBpbnZhbGlkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGRzcF9pc19kbWFfYWN0aXZlKGNvZGVjLCBkbWFfY2hhbikpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImRtYSBhbHJlYWR5IGFjdGl2ZVxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImRtYSBhbHJlYWR5IGFjdGl2ZVxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJZHNwX2FkZHggPSBkc3BfY2hpcF90b19kc3BfYWRkeChjaGlwX2FkZHgsICZjb2RlLCAmeXJhbSk7CiAKIAlpZiAoZHNwX2FkZHggPT0gSU5WQUxJRF9DSElQX0FERFJFU1MpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImludmFsaWQgY2hpcCBhZGRyXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiaW52YWxpZCBjaGlwIGFkZHJcbiIpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIAogCWNobmxfcHJvcCA9IERTUERNQUNfQ0hOTFBST1BfQUNfTUFTSzsKIAlhY3RpdmUgPSAwOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICBkc3BfZG1hX3NldHVwX2NvbW1vbigpICAgIHN0YXJ0IHJlZyBwZ21cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIiAgIGRzcF9kbWFfc2V0dXBfY29tbW9uKCkgICAgc3RhcnQgcmVnIHBnbVxuIik7CiAKIAlpZiAob3ZseSkgewogCQlzdGF0dXMgPSBjaGlwaW9fcmVhZChjb2RlYywgRFNQRE1BQ19DSE5MUFJPUF9JTlNUX09GRlNFVCwKIAkJCQkgICAgICZjaG5sX3Byb3ApOwogCiAJCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAicmVhZCBDSE5MUFJPUCBSZWcgZmFpbFxuIik7CisJCQljb2RlY19kYmcoY29kZWMsICJyZWFkIENITkxQUk9QIFJlZyBmYWlsXG4iKTsKIAkJCXJldHVybiBzdGF0dXM7CiAJCX0KLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJkc3BfZG1hX3NldHVwX2NvbW1vbigpIFJlYWQgQ0hOTFBST1BcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJkc3BfZG1hX3NldHVwX2NvbW1vbigpIFJlYWQgQ0hOTFBST1BcbiIpOwogCX0KIAogCWlmICghY29kZSkKQEAgLTE2ODAsMjAgKzE2NzksMjAgQEAKIAogCXN0YXR1cyA9IGNoaXBpb193cml0ZShjb2RlYywgRFNQRE1BQ19DSE5MUFJPUF9JTlNUX09GRlNFVCwgY2hubF9wcm9wKTsKIAlpZiAoc3RhdHVzIDwgMCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAid3JpdGUgQ0hOTFBST1AgUmVnIGZhaWxcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJ3cml0ZSBDSE5MUFJPUCBSZWcgZmFpbFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgZHNwX2RtYV9zZXR1cF9jb21tb24oKSAgICBXcml0ZSBDSE5MUFJPUFxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgZHNwX2RtYV9zZXR1cF9jb21tb24oKSAgICBXcml0ZSBDSE5MUFJPUFxuIik7CiAKIAlpZiAob3ZseSkgewogCQlzdGF0dXMgPSBjaGlwaW9fcmVhZChjb2RlYywgRFNQRE1BQ19BQ1RJVkVfSU5TVF9PRkZTRVQsCiAJCQkJICAgICAmYWN0aXZlKTsKIAogCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgInJlYWQgQUNUSVZFIFJlZyBmYWlsXG4iKTsKKwkJCWNvZGVjX2RiZyhjb2RlYywgInJlYWQgQUNUSVZFIFJlZyBmYWlsXG4iKTsKIAkJCXJldHVybiBzdGF0dXM7CiAJCX0KLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJkc3BfZG1hX3NldHVwX2NvbW1vbigpIFJlYWQgQUNUSVZFXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiZHNwX2RtYV9zZXR1cF9jb21tb24oKSBSZWFkIEFDVElWRVxuIik7CiAJfQogCiAJYWN0aXZlICY9ICh+KDEgPDwgKERTUERNQUNfQUNUSVZFX0FBUl9MT0JJVCArIGRtYV9jaGFuKSkpICYKQEAgLTE3MDEsMzUgKzE3MDAsMzUgQEAKIAogCXN0YXR1cyA9IGNoaXBpb193cml0ZShjb2RlYywgRFNQRE1BQ19BQ1RJVkVfSU5TVF9PRkZTRVQsIGFjdGl2ZSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIndyaXRlIEFDVElWRSBSZWcgZmFpbFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIndyaXRlIEFDVElWRSBSZWcgZmFpbFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICBkc3BfZG1hX3NldHVwX2NvbW1vbigpICAgIFdyaXRlIEFDVElWRVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgZHNwX2RtYV9zZXR1cF9jb21tb24oKSAgICBXcml0ZSBBQ1RJVkVcbiIpOwogCiAJc3RhdHVzID0gY2hpcGlvX3dyaXRlKGNvZGVjLCBEU1BETUFDX0FVRENIU0VMX0lOU1RfT0ZGU0VUKGRtYV9jaGFuKSwKIAkJCSAgICAgIHBvcnRfbWFwX21hc2spOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJ3cml0ZSBBVURDSFNFTCBSZWcgZmFpbFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIndyaXRlIEFVRENIU0VMIFJlZyBmYWlsXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9Ci0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICBkc3BfZG1hX3NldHVwX2NvbW1vbigpICAgIFdyaXRlIEFVRENIU0VMXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICIgICBkc3BfZG1hX3NldHVwX2NvbW1vbigpICAgIFdyaXRlIEFVRENIU0VMXG4iKTsKIAogCXN0YXR1cyA9IGNoaXBpb193cml0ZShjb2RlYywgRFNQRE1BQ19JUlFDTlRfSU5TVF9PRkZTRVQoZG1hX2NoYW4pLAogCQkJRFNQRE1BQ19JUlFDTlRfQklDTlRfTUFTSyB8IERTUERNQUNfSVJRQ05UX0NJQ05UX01BU0spOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJ3cml0ZSBJUlFDTlQgUmVnIGZhaWxcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJ3cml0ZSBJUlFDTlQgUmVnIGZhaWxcbiIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIiAgIGRzcF9kbWFfc2V0dXBfY29tbW9uKCkgICAgV3JpdGUgSVJRQ05UXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICIgICBkc3BfZG1hX3NldHVwX2NvbW1vbigpICAgIFdyaXRlIElSUUNOVFxuIik7CiAKLQlzbmRfcHJpbnRkZCgKKwljb2RlY19kYmcoY29kZWMsCiAJCSAgICJDaGlwQT0weCV4LERzcEE9MHgleCxkbWFDaD0ldSwgIgogCQkgICAiQ0hTRUw9MHgleCxDSFBST1A9MHgleCxBY3RpdmU9MHgleFxuIiwKIAkJICAgY2hpcF9hZGR4LCBkc3BfYWRkeCwgZG1hX2NoYW4sCiAJCSAgIHBvcnRfbWFwX21hc2ssIGNobmxfcHJvcCwgYWN0aXZlKTsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiLS0gZHNwX2RtYV9zZXR1cF9jb21tb24oKSAtLSBDb21wbGV0ZSAtLS0tLS1cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIi0tIGRzcF9kbWFfc2V0dXBfY29tbW9uKCkgLS0gQ29tcGxldGUgLS0tLS0tXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTc1NSwyMCArMTc1NCwyMCBAQAogCWNvbnN0IHVuc2lnbmVkIGludCBtYXhfZG1hX2NvdW50ID0gMSA8PCAoRFNQRE1BQ19YRlJDTlRfQkNOVF9ISUJJVCAtCiAJCQkJCQlEU1BETUFDX1hGUkNOVF9CQ05UX0xPQklUICsgMSk7CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIi0tIGRzcF9kbWFfc2V0dXAoKSAtLSBCZWdpbiAtLS0tLS0tLS1cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIi0tIGRzcF9kbWFfc2V0dXAoKSAtLSBCZWdpbiAtLS0tLS0tLS1cbiIpOwogCiAJaWYgKGNvdW50ID4gbWF4X2RtYV9jb3VudCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiY291bnQgdG9vIGJpZ1xuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImNvdW50IHRvbyBiaWdcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlkc3BfYWRkeCA9IGRzcF9jaGlwX3RvX2RzcF9hZGR4KGNoaXBfYWRkeCwgJmNvZGUsICZ5cmFtKTsKIAlpZiAoZHNwX2FkZHggPT0gSU5WQUxJRF9DSElQX0FERFJFU1MpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImludmFsaWQgY2hpcCBhZGRyXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiaW52YWxpZCBjaGlwIGFkZHJcbiIpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgZHNwX2RtYV9zZXR1cCgpICAgIHN0YXJ0IHJlZyBwZ21cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIiAgIGRzcF9kbWFfc2V0dXAoKSAgICBzdGFydCByZWcgcGdtXG4iKTsKIAogCWFkZHJfZmllbGQgPSBkc3BfYWRkeCA8PCBEU1BETUFDX0RNQUNGR19EQkFEUl9MT0JJVDsKIAlpbmNyX2ZpZWxkICAgPSAwOwpAQCAtMTc4NSwxMCArMTc4NCwxMCBAQAogCXN0YXR1cyA9IGNoaXBpb193cml0ZShjb2RlYywgRFNQRE1BQ19ETUFDRkdfSU5TVF9PRkZTRVQoZG1hX2NoYW4pLAogCQkJCWRtYV9jZmcpOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJ3cml0ZSBETUFDRkcgUmVnIGZhaWxcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJ3cml0ZSBETUFDRkcgUmVnIGZhaWxcbiIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIiAgIGRzcF9kbWFfc2V0dXAoKSAgICBXcml0ZSBETUFDRkdcbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIiAgIGRzcF9kbWFfc2V0dXAoKSAgICBXcml0ZSBETUFDRkdcbiIpOwogCiAJYWRyX29mcyA9IChjb3VudCAtIDEpIDw8IChEU1BETUFDX0RTUEFEUk9GU19CT0ZTX0xPQklUICsKIAkJCQkJCQkoY29kZSA/IDAgOiAxKSk7CkBAIC0xNzk2LDEwICsxNzk1LDEwIEBACiAJc3RhdHVzID0gY2hpcGlvX3dyaXRlKGNvZGVjLCBEU1BETUFDX0RTUEFEUk9GU19JTlNUX09GRlNFVChkbWFfY2hhbiksCiAJCQkJYWRyX29mcyk7CiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIndyaXRlIERTUEFEUk9GUyBSZWcgZmFpbFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIndyaXRlIERTUEFEUk9GUyBSZWcgZmFpbFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgZHNwX2RtYV9zZXR1cCgpICAgIFdyaXRlIERTUEFEUk9GU1xuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgZHNwX2RtYV9zZXR1cCgpICAgIFdyaXRlIERTUEFEUk9GU1xuIik7CiAKIAliYXNlX2NudCA9IChjb3VudCAtIDEpIDw8IERTUERNQUNfWEZSQ05UX0JDTlRfTE9CSVQ7CiAKQEAgLTE4MTAsMTcgKzE4MDksMTcgQEAKIAlzdGF0dXMgPSBjaGlwaW9fd3JpdGUoY29kZWMsCiAJCQkJRFNQRE1BQ19YRlJDTlRfSU5TVF9PRkZTRVQoZG1hX2NoYW4pLCB4ZnJfY250KTsKIAlpZiAoc3RhdHVzIDwgMCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAid3JpdGUgWEZSQ05UIFJlZyBmYWlsXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAid3JpdGUgWEZSQ05UIFJlZyBmYWlsXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9Ci0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICBkc3BfZG1hX3NldHVwKCkgICAgV3JpdGUgWEZSQ05UXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICIgICBkc3BfZG1hX3NldHVwKCkgICAgV3JpdGUgWEZSQ05UXG4iKTsKIAotCXNuZF9wcmludGRkKAorCWNvZGVjX2RiZyhjb2RlYywKIAkJICAgIkNoaXBBPTB4JXgsIGNudD0weCV4LCBETUFDRkc9MHgleCwgIgogCQkgICAiQURST0ZTPTB4JXgsIFhGUkNOVD0weCV4XG4iLAogCQkgICBjaGlwX2FkZHgsIGNvdW50LCBkbWFfY2ZnLCBhZHJfb2ZzLCB4ZnJfY250KTsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiLS0gZHNwX2RtYV9zZXR1cCgpIC0tIENvbXBsZXRlIC0tLS0tLS0tLVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiLS0gZHNwX2RtYV9zZXR1cCgpIC0tIENvbXBsZXRlIC0tLS0tLS0tLVxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE4MzQsMTcgKzE4MzMsMTcgQEAKIAl1bnNpZ25lZCBpbnQgcmVnID0gMDsKIAlpbnQgc3RhdHVzID0gMDsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiLS0gZHNwX2RtYV9zdGFydCgpIC0tIEJlZ2luIC0tLS0tLS0tLVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiLS0gZHNwX2RtYV9zdGFydCgpIC0tIEJlZ2luIC0tLS0tLS0tLVxuIik7CiAKIAlpZiAob3ZseSkgewogCQlzdGF0dXMgPSBjaGlwaW9fcmVhZChjb2RlYywKIAkJCQkgICAgIERTUERNQUNfQ0hOTFNUQVJUX0lOU1RfT0ZGU0VULCAmcmVnKTsKIAogCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgInJlYWQgQ0hOTFNUQVJUIHJlZyBmYWlsXG4iKTsKKwkJCWNvZGVjX2RiZyhjb2RlYywgInJlYWQgQ0hOTFNUQVJUIHJlZyBmYWlsXG4iKTsKIAkJCXJldHVybiBzdGF0dXM7CiAJCX0KLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICItLSBkc3BfZG1hX3N0YXJ0KCkgICAgUmVhZCBDSE5MU1RBUlRcbiIpOworCQljb2RlY19kYmcoY29kZWMsICItLSBkc3BfZG1hX3N0YXJ0KCkgICAgUmVhZCBDSE5MU1RBUlRcbiIpOwogCiAJCXJlZyAmPSB+KERTUERNQUNfQ0hOTFNUQVJUX0VOX01BU0sgfAogCQkJCURTUERNQUNfQ0hOTFNUQVJUX0RJU19NQVNLKTsKQEAgLTE4NTMsMTAgKzE4NTIsMTAgQEAKIAlzdGF0dXMgPSBjaGlwaW9fd3JpdGUoY29kZWMsIERTUERNQUNfQ0hOTFNUQVJUX0lOU1RfT0ZGU0VULAogCQkJcmVnIHwgKDEgPDwgKGRtYV9jaGFuICsgRFNQRE1BQ19DSE5MU1RBUlRfRU5fTE9CSVQpKSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIndyaXRlIENITkxTVEFSVCByZWcgZmFpbFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIndyaXRlIENITkxTVEFSVCByZWcgZmFpbFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiLS0gZHNwX2RtYV9zdGFydCgpIC0tIENvbXBsZXRlIC0tLS0tLS0tLVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiLS0gZHNwX2RtYV9zdGFydCgpIC0tIENvbXBsZXRlIC0tLS0tLS0tLVxuIik7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTg3MCwxNyArMTg2OSwxNyBAQAogCXVuc2lnbmVkIGludCByZWcgPSAwOwogCWludCBzdGF0dXMgPSAwOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICItLSBkc3BfZG1hX3N0b3AoKSAtLSBCZWdpbiAtLS0tLS0tLS1cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIi0tIGRzcF9kbWFfc3RvcCgpIC0tIEJlZ2luIC0tLS0tLS0tLVxuIik7CiAKIAlpZiAob3ZseSkgewogCQlzdGF0dXMgPSBjaGlwaW9fcmVhZChjb2RlYywKIAkJCQkgICAgIERTUERNQUNfQ0hOTFNUQVJUX0lOU1RfT0ZGU0VULCAmcmVnKTsKIAogCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgInJlYWQgQ0hOTFNUQVJUIHJlZyBmYWlsXG4iKTsKKwkJCWNvZGVjX2RiZyhjb2RlYywgInJlYWQgQ0hOTFNUQVJUIHJlZyBmYWlsXG4iKTsKIAkJCXJldHVybiBzdGF0dXM7CiAJCX0KLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICItLSBkc3BfZG1hX3N0b3AoKSAgICBSZWFkIENITkxTVEFSVFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIi0tIGRzcF9kbWFfc3RvcCgpICAgIFJlYWQgQ0hOTFNUQVJUXG4iKTsKIAkJcmVnICY9IH4oRFNQRE1BQ19DSE5MU1RBUlRfRU5fTUFTSyB8CiAJCQkJRFNQRE1BQ19DSE5MU1RBUlRfRElTX01BU0spOwogCX0KQEAgLTE4ODgsMTAgKzE4ODcsMTAgQEAKIAlzdGF0dXMgPSBjaGlwaW9fd3JpdGUoY29kZWMsIERTUERNQUNfQ0hOTFNUQVJUX0lOU1RfT0ZGU0VULAogCQkJcmVnIHwgKDEgPDwgKGRtYV9jaGFuICsgRFNQRE1BQ19DSE5MU1RBUlRfRElTX0xPQklUKSkpOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJ3cml0ZSBDSE5MU1RBUlQgcmVnIGZhaWxcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJ3cml0ZSBDSE5MU1RBUlQgcmVnIGZhaWxcbiIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIi0tIGRzcF9kbWFfc3RvcCgpIC0tIENvbXBsZXRlIC0tLS0tLS0tLVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiLS0gZHNwX2RtYV9zdG9wKCkgLS0gQ29tcGxldGUgLS0tLS0tLS0tXG4iKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xOTc0LDE3ICsxOTczLDE3IEBACiB7CiAJaW50IHN0YXR1czsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgICBkc3BfYWxsb2NhdGVfcG9ydHMoKSAtLSBiZWdpblxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgICBkc3BfYWxsb2NhdGVfcG9ydHMoKSAtLSBiZWdpblxuIik7CiAKIAlpZiAoKHJhdGVfbXVsdGkgIT0gMSkgJiYgKHJhdGVfbXVsdGkgIT0gMikgJiYgKHJhdGVfbXVsdGkgIT0gNCkpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImJhZCByYXRlIG11bHRpcGxlXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiYmFkIHJhdGUgbXVsdGlwbGVcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlzdGF0dXMgPSBkc3BfYWxsb2NhdGVfcm91dGVyX3BvcnRzKGNvZGVjLCBudW1fY2hhbnMsCiAJCQkJCSAgIHJhdGVfbXVsdGksIDAsIHBvcnRfbWFwKTsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgICBkc3BfYWxsb2NhdGVfcG9ydHMoKSAtLSBjb21wbGV0ZVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgICBkc3BfYWxsb2NhdGVfcG9ydHMoKSAtLSBjb21wbGV0ZVxuIik7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMjAwMSw3ICsyMDAwLDcgQEAKIAl1bnNpZ25lZCBpbnQgcmF0ZV9tdWx0aSA9IHNhbXBsZV9yYXRlX211bCAvIHNhbXBsZV9yYXRlX2RpdjsKIAogCWlmICgocmF0ZV9tdWx0aSAhPSAxKSAmJiAocmF0ZV9tdWx0aSAhPSAyKSAmJiAocmF0ZV9tdWx0aSAhPSA0KSkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiYmFkIHJhdGUgbXVsdGlwbGVcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJiYWQgcmF0ZSBtdWx0aXBsZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjAxOSwxNCArMjAxOCwxNCBAQAogewogCWludCBzdGF0dXM7CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIiAgICAgZHNwX2ZyZWVfcG9ydHMoKSAtLSBiZWdpblxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgICBkc3BfZnJlZV9wb3J0cygpIC0tIGJlZ2luXG4iKTsKIAogCXN0YXR1cyA9IGRzcF9mcmVlX3JvdXRlcl9wb3J0cyhjb2RlYyk7CiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImZyZWUgcm91dGVyIHBvcnRzIGZhaWxcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJmcmVlIHJvdXRlciBwb3J0cyBmYWlsXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9Ci0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICAgIGRzcF9mcmVlX3BvcnRzKCkgLS0gY29tcGxldGVcbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIiAgICAgZHNwX2ZyZWVfcG9ydHMoKSAtLSBjb21wbGV0ZVxuIik7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMjA5Miw4ICsyMDkxLDYgQEAKIHsKIAlib29sIGNtZDsKIAotCXNuZF9wcmludGRkKCJkbWFfc2V0X3N0YXRlIHN0YXRlPSVkXG4iLCBzdGF0ZSk7Ci0KIAlzd2l0Y2ggKHN0YXRlKSB7CiAJY2FzZSBETUFfU1RBVEVfU1RPUDoKIAkJY21kID0gZmFsc2U7CkBAIC0yMTk2LDcgKzIxOTMsNyBAQAogCXVuc2lnbmVkIGludCBjb3VudDsKIAogCWlmIChmbHMgPT0gTlVMTCB8fCBmbHMtPmNoaXBfYWRkciAhPSBnX2NoaXBfYWRkcl9tYWdpY192YWx1ZSkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiaGNpX3dyaXRlIGludmFsaWQgcGFyYW1zXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiaGNpX3dyaXRlIGludmFsaWQgcGFyYW1zXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMjA1LDcgKzIyMDIsNyBAQAogCXdoaWxlIChjb3VudCA+PSAyKSB7CiAJCXN0YXR1cyA9IGNoaXBpb193cml0ZShjb2RlYywgZGF0YVswXSwgZGF0YVsxXSk7CiAJCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiaGNpX3dyaXRlIGNoaXBpbyBmYWlsZWRcbiIpOworCQkJY29kZWNfZGJnKGNvZGVjLCAiaGNpX3dyaXRlIGNoaXBpbyBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIHN0YXR1czsKIAkJfQogCQljb3VudCAtPSAyOwpAQCAtMjI2NSwxMiArMjI2MiwxMiBAQAogCX0KIAogCWlmIChoY2lfd3JpdGUgJiYgKCFmbHMgfHwgaXNfbGFzdChmbHMpKSkgewotCQlzbmRfcHJpbnRkZCgiaGNpX3dyaXRlXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiaGNpX3dyaXRlXG4iKTsKIAkJcmV0dXJuIGRzcHhmcl9oY2lfd3JpdGUoY29kZWMsIGhjaV93cml0ZSk7CiAJfQogCiAJaWYgKGZscyA9PSBOVUxMIHx8IGRtYV9lbmdpbmUgPT0gTlVMTCB8fCBwb3J0X21hcF9tYXNrID09IDApIHsKLQkJc25kX3ByaW50ZGQoIkludmFsaWQgUGFyYW1zXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiSW52YWxpZCBQYXJhbXNcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTIyODYsNyArMjI4Myw3IEBACiAJaWYgKCFVQ19SQU5HRShjaGlwX2FkZHgsIHdvcmRzX3RvX3dyaXRlKSAmJgogCSAgICAhWF9SQU5HRV9BTEwoY2hpcF9hZGR4LCB3b3Jkc190b193cml0ZSkgJiYKIAkgICAgIVlfUkFOR0VfQUxMKGNoaXBfYWRkeCwgd29yZHNfdG9fd3JpdGUpKSB7Ci0JCXNuZF9wcmludGRkKCJJbnZhbGlkIGNoaXBfYWRkeCBQYXJhbXNcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJJbnZhbGlkIGNoaXBfYWRkeCBQYXJhbXNcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTIyOTYsNyArMjI5Myw3IEBACiAJYnVmZmVyX2FkZHggPSBkbWFfZ2V0X2J1ZmZlcl9hZGRyKGRtYV9lbmdpbmUpOwogCiAJaWYgKGJ1ZmZlcl9hZGR4ID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImRtYV9lbmdpbmUgYnVmZmVyIE5VTExcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJkbWFfZW5naW5lIGJ1ZmZlciBOVUxMXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMzA5LDcgKzIzMDYsNyBAQAogCQkJKG51bV9jaGFucyAqIHNhbXBsZV9yYXRlX211bCAvIHNhbXBsZV9yYXRlX2RpdikpOwogCiAJaWYgKGhkYV9mcmFtZV9zaXplX3dvcmRzID09IDApIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImZybXN6IHplcm9cbiIpOworCQljb2RlY19kYmcoY29kZWMsICJmcm1zeiB6ZXJvXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMzE3LDE0ICsyMzE0LDE0IEBACiAJCQkJKHVuc2lnbmVkIGludCkoVUNfUkFOR0UoY2hpcF9hZGR4LCAxKSA/CiAJCQkJNjU1MzYgOiAzMjc2OCkpOwogCWJ1ZmZlcl9zaXplX3dvcmRzIC09IGJ1ZmZlcl9zaXplX3dvcmRzICUgaGRhX2ZyYW1lX3NpemVfd29yZHM7Ci0Jc25kX3ByaW50ZGQoCisJY29kZWNfZGJnKGNvZGVjLAogCQkgICAiY2hwYWRyPTB4JTA4eCBmcm1zej0ldSBuY2hhbj0ldSAiCiAJCSAgICJyYXRlX211bD0ldSBkaXY9JXUgYnVmc3o9JXVcbiIsCiAJCSAgIGNoaXBfYWRkeCwgaGRhX2ZyYW1lX3NpemVfd29yZHMsIG51bV9jaGFucywKIAkJICAgc2FtcGxlX3JhdGVfbXVsLCBzYW1wbGVfcmF0ZV9kaXYsIGJ1ZmZlcl9zaXplX3dvcmRzKTsKIAogCWlmIChidWZmZXJfc2l6ZV93b3JkcyA8IGhkYV9mcmFtZV9zaXplX3dvcmRzKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJkc3B4ZnJfb25lX3NlZzpmYWlsZWRcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJkc3B4ZnJfb25lX3NlZzpmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTIzMzgsNyArMjMzNSw3IEBACiAKIAl3aGlsZSAod29yZHNfdG9fd3JpdGUgIT0gMCkgewogCQlydW5fc2l6ZV93b3JkcyA9IG1pbihidWZmZXJfc2l6ZV93b3Jkcywgd29yZHNfdG9fd3JpdGUpOwotCQlzbmRfcHJpbnRkZCgiZHNweGZyIChzZWcgbG9vcCljbnQ9JXUgcnM9JXUgcmVtYWluZGVyPSV1XG4iLAorCQljb2RlY19kYmcoY29kZWMsICJkc3B4ZnIgKHNlZyBsb29wKWNudD0ldSBycz0ldSByZW1haW5kZXI9JXVcbiIsCiAJCQkgICAgd29yZHNfdG9fd3JpdGUsIHJ1bl9zaXplX3dvcmRzLCByZW1haW5kZXJfd29yZHMpOwogCQlkbWFfeGZlcihkbWFfZW5naW5lLCBkYXRhLCBydW5fc2l6ZV93b3JkcypzaXplb2YodTMyKSk7CiAJCWlmICghY29tbV9kbWFfc2V0dXBfZG9uZSkgewpAQCAtMjM2MCw3ICsyMzU3LDcgQEAKIAkJaWYgKHN0YXR1cyA8IDApCiAJCQlyZXR1cm4gc3RhdHVzOwogCQlpZiAoIWRzcF9pc19kbWFfYWN0aXZlKGNvZGVjLCBkbWFfY2hhbikpIHsKLQkJCXNuZF9wcmludGRkKEtFUk5fRVJSICJkc3B4ZnI6RE1BIGRpZCBub3Qgc3RhcnRcbiIpOworCQkJY29kZWNfZGJnKGNvZGVjLCAiZHNweGZyOkRNQSBkaWQgbm90IHN0YXJ0XG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAJCXN0YXR1cyA9IGRtYV9zZXRfc3RhdGUoZG1hX2VuZ2luZSwgRE1BX1NUQVRFX1JVTik7CkBAIC0yMzkyLDcgKzIzODksNyBAQAogCQlpZiAoZG1hX2FjdGl2ZSkKIAkJCWJyZWFrOwogCi0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiKysrKysgRE1BIGNvbXBsZXRlXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiKysrKysgRE1BIGNvbXBsZXRlXG4iKTsKIAkJZG1hX3NldF9zdGF0ZShkbWFfZW5naW5lLCBETUFfU1RBVEVfU1RPUCk7CiAJCXN0YXR1cyA9IGRtYV9yZXNldChkbWFfZW5naW5lKTsKIApAQCAtMjQ2Niw3ICsyNDYzLDcgQEAKIAkJCQkJaGRhX2Zvcm1hdCwgJnJlc3BvbnNlKTsKIAogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJzZXQgY29udmVydGVyIGZvcm1hdCBmYWlsXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAic2V0IGNvbnZlcnRlciBmb3JtYXQgZmFpbFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTI0ODEsNyArMjQ3OCw3IEBACiAJaWYgKG92bHkpIHsKIAkJc3RhdHVzID0gZHNwaW9fYWxsb2NfZG1hX2NoYW4oY29kZWMsICZkbWFfY2hhbik7CiAJCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiYWxsb2MgZG1hY2hhbiBmYWlsXG4iKTsKKwkJCWNvZGVjX2RiZyhjb2RlYywgImFsbG9jIGRtYWNoYW4gZmFpbFxuIik7CiAJCQlkbWFfY2hhbiA9IElOVkFMSURfRE1BX0NIQU5ORUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTI0OTEsNyArMjQ4OCw3IEBACiAJc3RhdHVzID0gZHNwX2FsbG9jYXRlX3BvcnRzX2Zvcm1hdChjb2RlYywgaGRhX2Zvcm1hdCwKIAkJCQkJJnBvcnRfbWFwX21hc2spOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJhbGxvYyBwb3J0cyBmYWlsXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiYWxsb2MgcG9ydHMgZmFpbFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTI0OTksMTMgKzI0OTYsMTMgQEAKIAlzdGF0dXMgPSBjb2RlY19zZXRfY29udmVydGVyX3N0cmVhbV9jaGFubmVsKGNvZGVjLAogCQkJV0lER0VUX0NISVBfQ1RSTCwgc3RyZWFtX2lkLCAwLCAmcmVzcG9uc2UpOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJzZXQgc3RyZWFtIGNoYW4gZmFpbFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgInNldCBzdHJlYW0gY2hhbiBmYWlsXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCXdoaWxlICgoZmxzX2RhdGEgIT0gTlVMTCkgJiYgIWlzX2xhc3QoZmxzX2RhdGEpKSB7CiAJCWlmICghaXNfdmFsaWQoZmxzX2RhdGEpKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiRkxTIGNoZWNrIGZhaWxcbiIpOworCQkJY29kZWNfZGJnKGNvZGVjLCAiRkxTIGNoZWNrIGZhaWxcbiIpOwogCQkJc3RhdHVzID0gLUVJTlZBTDsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtMjU0OCw3ICsyNTQ1LDcgQEAKICAqLwogc3RhdGljIHZvaWQgZHNwbG9hZF9wb3N0X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiLS0tLSBkc3Bsb2FkX3Bvc3Rfc2V0dXAgLS0tLS0tXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICItLS0tIGRzcGxvYWRfcG9zdF9zZXR1cCAtLS0tLS1cbiIpOwogCiAJLypzZXQgRFNQIHNwZWFrZXIgdG8gMi4wIGNvbmZpZ3VyYXRpb24qLwogCWNoaXBpb193cml0ZShjb2RlYywgWFJBTV9YUkFNX0lOU1RfT0ZGU0VUKDB4MTgpLCAweDA4MDgwMDgwKTsKQEAgLTI1ODYsNyArMjU4Myw3IEBACiAJdW5zaWduZWQgaW50IHNhbXBsZV9yYXRlOwogCXVuc2lnbmVkIHNob3J0IGNoYW5uZWxzOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICItLS0tIGRzcGxvYWRfaW1hZ2UgYmVnaW4gLS0tLS0tXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICItLS0tIGRzcGxvYWRfaW1hZ2UgYmVnaW4gLS0tLS0tXG4iKTsKIAlpZiAocm91dGVyX2NoYW5zID09IDApIHsKIAkJaWYgKCFvdmx5KQogCQkJcm91dGVyX2NoYW5zID0gRE1BX1RSQU5TRkVSX0ZSQU1FX1NJWkVfTldPUkRTOwpAQCAtMjYwMywyNyArMjYwMCwyNyBAQAogCX0KIAogCWRvIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJSZWFkeSB0byBwcm9ncmFtIERNQVxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIlJlYWR5IHRvIHByb2dyYW0gRE1BXG4iKTsKIAkJaWYgKCFvdmx5KQogCQkJc3RhdHVzID0gZHNwX3Jlc2V0KGNvZGVjKTsKIAogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCWJyZWFrOwogCi0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiZHNwX3Jlc2V0KCkgY29tcGxldGVcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJkc3BfcmVzZXQoKSBjb21wbGV0ZVxuIik7CiAJCXN0YXR1cyA9IGRzcHhmcl9pbWFnZShjb2RlYywgZmxzLCByZWxvYywgc2FtcGxlX3JhdGUsIGNoYW5uZWxzLAogCQkJCSAgICAgIG92bHkpOwogCiAJCWlmIChzdGF0dXMgPCAwKQogCQkJYnJlYWs7CiAKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJkc3B4ZnJfaW1hZ2UoKSBjb21wbGV0ZVxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImRzcHhmcl9pbWFnZSgpIGNvbXBsZXRlXG4iKTsKIAkJaWYgKGF1dG9zdGFydCAmJiAhb3ZseSkgewogCQkJZHNwbG9hZF9wb3N0X3NldHVwKGNvZGVjKTsKIAkJCXN0YXR1cyA9IGRzcF9zZXRfcnVuX3N0YXRlKGNvZGVjKTsKIAkJfQogCi0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiTE9BRCBGSU5JU0hFRFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIkxPQUQgRklOSVNIRURcbiIpOwogCX0gd2hpbGUgKDApOwogCiAJcmV0dXJuIHN0YXR1czsKQEAgLTMxMzIsNyArMzEyOSw3IEBACiAJdW5zaWduZWQgaW50IHRtcDsKIAlpbnQgZXJyOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjYTAxMzJfc2VsZWN0X291dFxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiY2EwMTMyX3NlbGVjdF9vdXRcbiIpOwogCiAJc25kX2hkYV9wb3dlcl91cChjb2RlYyk7CiAKQEAgLTMxNTAsNyArMzE0Nyw3IEBACiAJCXNwZWMtPmN1cl9vdXRfdHlwZSA9IFNQRUFLRVJfT1VUOwogCiAJaWYgKHNwZWMtPmN1cl9vdXRfdHlwZSA9PSBTUEVBS0VSX09VVCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImNhMDEzMl9zZWxlY3Rfb3V0IHNwZWFrZXJcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJjYTAxMzJfc2VsZWN0X291dCBzcGVha2VyXG4iKTsKIAkJLypzcGVha2VyIG91dCBjb25maWcqLwogCQl0bXAgPSBGTE9BVF9PTkU7CiAJCWVyciA9IGRzcGlvX3NldF91aW50X3BhcmFtKGNvZGVjLCAweDgwLCAweDA0LCB0bXApOwpAQCAtMzE4Myw3ICszMTgwLDcgQEAKIAkJc25kX2hkYV9zZXRfcGluX2N0bChjb2RlYywgc3BlYy0+b3V0X3BpbnNbMF0sCiAJCQkJICAgIHBpbl9jdGwgfCBQSU5fT1VUKTsKIAl9IGVsc2UgewotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImNhMDEzMl9zZWxlY3Rfb3V0IGhwXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiY2EwMTMyX3NlbGVjdF9vdXQgaHBcbiIpOwogCQkvKmhlYWRwaG9uZSBvdXQgY29uZmlnKi8KIAkJdG1wID0gRkxPQVRfWkVSTzsKIAkJZXJyID0gZHNwaW9fc2V0X3VpbnRfcGFyYW0oY29kZWMsIDB4ODAsIDB4MDQsIHRtcCk7CkBAIC0zMjg4LDcgKzMyODUsNyBAQAogCWludCBqYWNrX3ByZXNlbnQ7CiAJaW50IGF1dG9famFjazsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiY2EwMTMyX3NlbGVjdF9taWNcbiIpOworCWNvZGVjX2RiZyhjb2RlYywgImNhMDEzMl9zZWxlY3RfbWljXG4iKTsKIAogCXNuZF9oZGFfcG93ZXJfdXAoY29kZWMpOwogCkBAIC0zNDEwLDcgKzM0MDcsNyBAQAogCQkJdmFsID0gMDsKIAl9CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImNhMDEzMl9lZmZlY3Rfc2V0OiBuaWQ9MHgleCwgdmFsPSVsZFxuIiwKKwljb2RlY19kYmcoY29kZWMsICJjYTAxMzJfZWZmZWN0X3NldDogbmlkPTB4JXgsIHZhbD0lbGRcbiIsCiAJCSAgICBuaWQsIHZhbCk7CiAKIAlvbiA9ICh2YWwgPT0gMCkgPyBGTE9BVF9aRVJPIDogRkxPQVRfT05FOwpAQCAtMzQzMiw3ICszNDI5LDcgQEAKIAloZGFfbmlkX3QgbmlkOwogCWludCBpLCByZXQgPSAwOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjYTAxMzJfcGVfc3dpdGNoX3NldDogdmFsPSVsZFxuIiwKKwljb2RlY19kYmcoY29kZWMsICJjYTAxMzJfcGVfc3dpdGNoX3NldDogdmFsPSVsZFxuIiwKIAkJICAgIHNwZWMtPmVmZmVjdHNfc3dpdGNoW1BMQVlfRU5IQU5DRU1FTlQgLSBFRkZFQ1RfU1RBUlRfTklEXSk7CiAKIAlpID0gT1VUX0VGRkVDVF9TVEFSVF9OSUQgLSBFRkZFQ1RfU1RBUlRfTklEOwpAQCAtMzQ3OCw3ICszNDc1LDcgQEAKIAlpbnQgaSwgcmV0ID0gMDsKIAl1bnNpZ25lZCBpbnQgb2xkdmFsOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjYTAxMzJfY3ZvaWNlX3N3aXRjaF9zZXQ6IHZhbD0lbGRcbiIsCisJY29kZWNfZGJnKGNvZGVjLCAiY2EwMTMyX2N2b2ljZV9zd2l0Y2hfc2V0OiB2YWw9JWxkXG4iLAogCQkgICAgc3BlYy0+ZWZmZWN0c19zd2l0Y2hbQ1JZU1RBTF9WT0lDRSAtIEVGRkVDVF9TVEFSVF9OSURdKTsKIAogCWkgPSBJTl9FRkZFQ1RfU1RBUlRfTklEIC0gRUZGRUNUX1NUQVJUX05JRDsKQEAgLTM2MDgsNyArMzYwNSw3IEBACiAJaWYgKHNlbCA+PSBpdGVtcykKIAkJcmV0dXJuIDA7CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImNhMDEzMl92b2ljZWZ4X3B1dDogc2VsPSVkLCBwcmVzZXQ9JXNcbiIsCisJY29kZWNfZGJnKGNvZGVjLCAiY2EwMTMyX3ZvaWNlZnhfcHV0OiBzZWw9JWQsIHByZXNldD0lc1xuIiwKIAkJICAgIHNlbCwgY2EwMTMyX3ZvaWNlZnhfcHJlc2V0c1tzZWxdLm5hbWUpOwogCiAJLyoKQEAgLTM2NzksNyArMzY3Niw3IEBACiAJbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOwogCWludCBjaGFuZ2VkID0gMTsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiY2EwMTMyX3N3aXRjaF9wdXQ6IG5pZD0weCV4LCB2YWw9JWxkXG4iLAorCWNvZGVjX2RiZyhjb2RlYywgImNhMDEzMl9zd2l0Y2hfcHV0OiBuaWQ9MHgleCwgdmFsPSVsZFxuIiwKIAkJICAgIG5pZCwgKnZhbHApOwogCiAJc25kX2hkYV9wb3dlcl91cChjb2RlYyk7CkBAIC00MTQyLDcgKzQxMzksNyBAQAogCXU4IHZhbDsKIAl1bnNpZ25lZCBpbnQgb2xkdmFsOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjYTAxMzJfc2V0X2RtaWM6IGVuYWJsZT0lZFxuIiwgZW5hYmxlKTsKKwljb2RlY19kYmcoY29kZWMsICJjYTAxMzJfc2V0X2RtaWM6IGVuYWJsZT0lZFxuIiwgZW5hYmxlKTsKIAogCW9sZHZhbCA9IHN0b3BfbWljMShjb2RlYyk7CiAJY2EwMTMyX3NldF92aXBzb3VyY2UoY29kZWMsIDApOwpAQCAtNDI1MCw3ICs0MjQ3LDcgQEAKIAlpbnQgaTsKIAloZGFfbmlkX3QgbmlkOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjYTAxMzJfcmVmcmVzaF93aWRnZXRfY2Fwcy5cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgImNhMDEzMl9yZWZyZXNoX3dpZGdldF9jYXBzLlxuIik7CiAJbmlkID0gY29kZWMtPnN0YXJ0X25pZDsKIAlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPm51bV9ub2RlczsgaSsrLCBuaWQrKykKIAkJY29kZWMtPndjYXBzW2ldID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsCkBAIC00Mzk0LDcgKzQzOTEsNyBAQAogewogCXN0cnVjdCBjYTAxMzJfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjYTAxMzJfcHJvY2Vzc19kc3BfcmVzcG9uc2VcbiIpOworCWNvZGVjX2RiZyhjb2RlYywgImNhMDEzMl9wcm9jZXNzX2RzcF9yZXNwb25zZVxuIik7CiAJaWYgKHNwZWMtPndhaXRfc2NwKSB7CiAJCWlmIChkc3Bpb19nZXRfcmVzcG9uc2VfZGF0YShjb2RlYykgPj0gMCkKIAkJCXNwZWMtPndhaXRfc2NwID0gMDsKQEAgLTQ0MTMsNyArNDQxMCw3IEBACiAJCXJlcyA9IHNuZF9oZGFfamFja19nZXRfYWN0aW9uKGNvZGVjLAogCQkJCShyZXMgPj4gQUNfVU5TT0xfUkVTX1RBR19TSElGVCkgJiAweDNmKTsKIAotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gInNuZF9oZGFfamFja19nZXRfYWN0aW9uOiAweCV4XG4iLCByZXMpOworCQljb2RlY19kYmcoY29kZWMsICJzbmRfaGRhX2phY2tfZ2V0X2FjdGlvbjogMHgleFxuIiwgcmVzKTsKIAogCQlzd2l0Y2ggKHJlcykgewogCQljYXNlIFVOU09MX1RBR19IUDoKQEAgLTQ2NTgsNyArNDY1NSw3IEBACiAJc3RydWN0IGNhMDEzMl9zcGVjICpzcGVjOwogCWludCBlcnI7CiAKLQlzbmRfcHJpbnRkZCgicGF0Y2hfY2EwMTMyXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICJwYXRjaF9jYTAxMzJcbiIpOwogCiAJc3BlYyA9IGt6YWxsb2Moc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzcGVjKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9jaXJydXMuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2lycnVzLmMKaW5kZXggZmM0OTJhYy4uMzg3ZjBiNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9jaXJydXMuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NpcnJ1cy5jCkBAIC0yMCw3ICsyMCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NtZWRpYS5jCmluZGV4IDljNmNlNzMuLjA2MWVhNTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jbWVkaWEuYwpAQCAtMjMsNyArMjMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCkBAIC0zMiw2ICszMSw5IEBACiAjaW5jbHVkZSAiaGRhX2phY2suaCIKICNpbmNsdWRlICJoZGFfZ2VuZXJpYy5oIgogCisjdW5kZWYgRU5BQkxFX0NNSV9TVEFUSUNfUVVJUktTCisKKyNpZmRlZiBFTkFCTEVfQ01JX1NUQVRJQ19RVUlSS1MKICNkZWZpbmUgTlVNX1BJTlMJMTEKIAogCkBAIC00NSwxMCArNDcsMTIgQEAKIAlDTUlfQVVUTywJLyogbGV0IGRyaXZlciBndWVzcyBpdCAqLwogCUNNSV9NT0RFTFMKIH07CisjZW5kaWYgLyogRU5BQkxFX0NNSV9TVEFUSUNfUVVJUktTICovCiAKIHN0cnVjdCBjbWlfc3BlYyB7CiAJc3RydWN0IGhkYV9nZW5fc3BlYyBnZW47CiAKKyNpZmRlZiBFTkFCTEVfQ01JX1NUQVRJQ19RVUlSS1MKIAkvKiBiZWxvdyBhcmUgb25seSBmb3Igc3RhdGljIG1vZGVscyAqLwogCiAJaW50IGJvYXJkX2NvbmZpZzsKQEAgLTgxLDggKzg1LDEwIEBACiAKIAkvKiBtdWx0aWNoYW5uZWwgcGlucyAqLwogCXN0cnVjdCBoZGFfdmVyYiBtdWx0aV9pbml0WzldOwkvKiAyIHZlcmJzIGZvciBlYWNoIHBpbiArIHRlcm1pbmF0b3IgKi8KKyNlbmRpZiAvKiBFTkFCTEVfQ01JX1NUQVRJQ19RVUlSS1MgKi8KIH07CiAKKyNpZmRlZiBFTkFCTEVfQ01JX1NUQVRJQ19RVUlSS1MKIC8qCiAgKiBpbnB1dCBNVVgKICAqLwpAQCAtNTY2LDYgKzU3Miw3IEBACiAJLmluaXQgPSBjbWk5ODgwX2luaXQsCiAJLmZyZWUgPSBjbWk5ODgwX2ZyZWUsCiB9OworI2VuZGlmIC8qIEVOQUJMRV9DTUlfU1RBVElDX1FVSVJLUyAqLwogCiAvKgogICogc3R1ZmYgZm9yIGF1dG8tcGFyc2VyCkBAIC01ODgsMTUgKzU5NSwyMCBAQAogCiAJZXJyID0gc25kX2hkYV9wYXJzZV9waW5fZGVmY2ZnKGNvZGVjLCBjZmcsIE5VTEwsIDApOwogCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOworCQlnb3RvIGVycm9yOwogCWVyciA9IHNuZF9oZGFfZ2VuX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjLCBjZmcpOwogCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOworCQlnb3RvIGVycm9yOwogCiAJY29kZWMtPnBhdGNoX29wcyA9IGNtaV9hdXRvX3BhdGNoX29wczsKIAlyZXR1cm4gMDsKKworIGVycm9yOgorCXNuZF9oZGFfZ2VuX2ZyZWUoY29kZWMpOworCXJldHVybiBlcnI7CiB9CiAKKwogc3RhdGljIGludCBwYXRjaF9jbWk5ODgwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBjbWlfc3BlYyAqc3BlYzsKQEAgLTYwNiwyMyArNjE4LDE4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJY29kZWMtPnNwZWMgPSBzcGVjOworI2lmZGVmIEVOQUJMRV9DTUlfU1RBVElDX1FVSVJLUwogCXNwZWMtPmJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBDTUlfTU9ERUxTLAogCQkJCQkJCWNtaTk4ODBfbW9kZWxzLAogCQkJCQkJCWNtaTk4ODBfY2ZnX3RibCk7CiAJaWYgKHNwZWMtPmJvYXJkX2NvbmZpZyA8IDApIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJoZGFfY29kZWM6ICVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsCisJCWNvZGVjX2RiZyhjb2RlYywgIiVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsCiAJCQkgICAgY29kZWMtPmNoaXBfbmFtZSk7CiAJCXNwZWMtPmJvYXJkX2NvbmZpZyA9IENNSV9BVVRPOyAvKiB0cnkgZXZlcnl0aGluZyAqLwogCX0KIAotCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPT0gQ01JX0FVVE8pIHsKLQkJaW50IGVyciA9IGNtaV9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfaGRhX2dlbl9mcmVlKGNvZGVjKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQorCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPT0gQ01JX0FVVE8pCisJCXJldHVybiBjbWlfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwogCiAJLyogY29weSBkZWZhdWx0IERBQyBOSURzICovCiAJbWVtY3B5KHNwZWMtPmRhY19uaWRzLCBjbWk5ODgwX2RhY19uaWRzLCBzaXplb2Yoc3BlYy0+ZGFjX25pZHMpKTsKQEAgLTY2OSw2ICs2NzYsOSBAQAogCWNvZGVjLT5wYXRjaF9vcHMgPSBjbWk5ODgwX3BhdGNoX29wczsKIAogCXJldHVybiAwOworI2Vsc2UKKwlyZXR1cm4gY21pX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKyNlbmRpZgogfQogCiAvKgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jCmluZGV4IGJjZjkxYmUuLjFkYzdlOTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KQEAgLTM1LDcgKzM0LDcgQEAKICNpbmNsdWRlICJoZGFfamFjay5oIgogI2luY2x1ZGUgImhkYV9nZW5lcmljLmgiCiAKLSNkZWZpbmUgRU5BQkxFX0NYVF9TVEFUSUNfUVVJUktTCisjdW5kZWYgRU5BQkxFX0NYVF9TVEFUSUNfUVVJUktTCiAKICNkZWZpbmUgQ1hUX1BJTl9ESVJfSU4gICAgICAgICAgICAgIDB4MDAKICNkZWZpbmUgQ1hUX1BJTl9ESVJfT1VUICAgICAgICAgICAgIDB4MDEKQEAgLTY4LDYgKzY3LDEyIEBACiAKIAl1bnNpZ25lZCBpbnQgcGFyc2VfZmxhZ3M7IC8qIGZsYWcgZm9yIHNuZF9oZGFfcGFyc2VfcGluX2RlZmNmZygpICovCiAKKwkvKiBPUExDIFhPIHNwZWNpZmljICovCisJYm9vbCByZWNvcmRpbmc7CisJYm9vbCBkY19lbmFibGU7CisJdW5zaWduZWQgaW50IGRjX2lucHV0X2JpYXM7IC8qIG9mZnNldCBpbnRvIG9scGNfeG9fZGNfYmlhcyAqLworCXN0cnVjdCBuaWRfcGF0aCAqZGNfbW9kZV9wYXRoOworCiAjaWZkZWYgRU5BQkxFX0NYVF9TVEFUSUNfUVVJUktTCiAJY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKm1peGVyc1s1XTsKIAlpbnQgbnVtX21peGVyczsKQEAgLTEyMywxOSArMTI4LDYgQEAKIAl1bnNpZ25lZCBpbnQgaHBfbGFwdG9wOjE7CiAJdW5zaWduZWQgaW50IGFzdXM6MTsKIAotCXVuc2lnbmVkIGludCBleHRfbWljX3ByZXNlbnQ7Ci0JdW5zaWduZWQgaW50IHJlY29yZGluZzsKLQl2b2lkICgqY2FwdHVyZV9wcmVwYXJlKShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7Ci0Jdm9pZCAoKmNhcHR1cmVfY2xlYW51cCkoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwotCi0JLyogT0xQQyBYTy0xLjUgc3VwcG9ydHMgREMgaW5wdXQgbW9kZSAoZS5nLiBmb3IgdXNlIHdpdGggYW5hbG9nIHNlbnNvcnMpCi0JICogdGhyb3VnaCB0aGUgbWljcm9waG9uZSBqYWNrLgotCSAqIFdoZW4gdGhlIHVzZXIgZW5hYmxlcyB0aGlzIHRocm91Z2ggYSBtaXhlciBzd2l0Y2gsIGJvdGggaW50ZXJuYWwgYW5kCi0JICogZXh0ZXJuYWwgbWljcm9waG9uZXMgYXJlIGRpc2FibGVkLiBHYWluIGlzIGZpeGVkIGF0IDBkQi4gSW4gdGhpcyBtb2RlLAotCSAqIHdlIGFsc28gYWxsb3cgdGhlIGJpYXMgdG8gYmUgY29uZmlndXJlZCB0aHJvdWdoIGEgc2VwYXJhdGUgbWl4ZXIKLQkgKiBjb250cm9sLiAqLwotCXVuc2lnbmVkIGludCBkY19lbmFibGU7Ci0JdW5zaWduZWQgaW50IGRjX2lucHV0X2JpYXM7IC8qIG9mZnNldCBpbnRvIGN4dDUwNjZfb2xwY19kY19iaWFzICovCiAJdW5zaWduZWQgaW50IG1pY19ib29zdDsgLyogb2Zmc2V0IGludG8gY3h0NTA2Nl9hbmFsb2dfbWljX2Jvb3N0ICovCiAjZW5kaWYgLyogRU5BQkxFX0NYVF9TVEFUSUNfUVVJUktTICovCiB9OwpAQCAtMjUzLDggKzI0NSw2IEBACiAJCQkJICAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpZiAoc3BlYy0+Y2FwdHVyZV9wcmVwYXJlKQotCQlzcGVjLT5jYXB0dXJlX3ByZXBhcmUoY29kZWMpOwogCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBzcGVjLT5hZGNfbmlkc1tzdWJzdHJlYW0tPm51bWJlcl0sCiAJCQkJICAgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKIAlyZXR1cm4gMDsKQEAgLTI2Niw4ICsyNTYsNiBAQAogewogCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJc25kX2hkYV9jb2RlY19jbGVhbnVwX3N0cmVhbShjb2RlYywgc3BlYy0+YWRjX25pZHNbc3Vic3RyZWFtLT5udW1iZXJdKTsKLQlpZiAoc3BlYy0+Y2FwdHVyZV9jbGVhbnVwKQotCQlzcGVjLT5jYXB0dXJlX2NsZWFudXAoY29kZWMpOwogCXJldHVybiAwOwogfQogCkBAIC00NTcsOSArNDQ1LDcgQEAKIAogc3RhdGljIHZvaWQgY29uZXhhbnRfZnJlZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKLQlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNuZF9oZGFfZGV0YWNoX2JlZXBfZGV2aWNlKGNvZGVjKTsKLQlrZnJlZShzcGVjKTsKKwlrZnJlZShjb2RlYy0+c3BlYyk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjeHRfY2FwdHVyZV9taXhlcnNbXSA9IHsKQEAgLTY3MywxNCArNjU5LDYgQEAKIAl9CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggY3h0NTA0NV9jYXB0dXJlX3NvdXJjZV9ocDUzMCA9IHsKLQkubnVtX2l0ZW1zID0gMiwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsICAgICAgICAgIDB4MSB9LAotCQl7ICJJbnRlcm5hbCBNaWMiLCAweDIgfSwKLQl9Ci19OwotCiAvKiB0dXJuIG9uL29mZiBFQVBEICgrIG11dGUgSFApIGFzIGEgbWFzdGVyIHN3aXRjaCAqLwogc3RhdGljIGludCBjeHQ1MDQ1X2hwX21hc3Rlcl9zd19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQpAQCAtNzk2LDI4ICs3NzQsNiBAQAogCXt9CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3h0NTA0NV9taXhlcnNfaHA1MzBbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MWEsIDB4MDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgxYSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlBDTSBQbGF5YmFjayBWb2x1bWUiLCAweDE3LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIlBDTSBQbGF5YmFjayBTd2l0Y2giLCAweDE3LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MTcsIDB4MiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTcsIDB4MiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgxNywgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxNywgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZjeHQ1MDQ1X2hwX2JpbmRfbWFzdGVyX3ZvbCksCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCS5pbmZvID0gY3h0X2VhcGRfaW5mbywKLQkJLmdldCA9IGN4dF9lYXBkX2dldCwKLQkJLnB1dCA9IGN4dDUwNDVfaHBfbWFzdGVyX3N3X3B1dCwKLQkJLnByaXZhdGVfdmFsdWUgPSAweDEwLAotCX0sCi0KLQl7fQotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBjeHQ1MDQ1X2luaXRfdmVyYnNbXSA9IHsKIAkvKiBMaW5lIGluLCBNaWMgKi8KIAl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU58QUNfUElOQ1RMX1ZSRUZfODAgfSwKQEAgLTEwMDAsNyArOTU2LDYgQEAKIAlDWFQ1MDQ1X0xBUFRPUF9NSUNTRU5TRSwKIAlDWFQ1MDQ1X0xBUFRPUF9IUE1JQ1NFTlNFLAogCUNYVDUwNDVfQkVOUSwKLQlDWFQ1MDQ1X0xBUFRPUF9IUDUzMCwKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHCiAJQ1hUNTA0NV9URVNULAogI2VuZGlmCkBAIC0xMDEzLDcgKzk2OCw2IEBACiAJW0NYVDUwNDVfTEFQVE9QX01JQ1NFTlNFXQk9ICJsYXB0b3AtbWljc2Vuc2UiLAogCVtDWFQ1MDQ1X0xBUFRPUF9IUE1JQ1NFTlNFXQk9ICJsYXB0b3AtaHBtaWNzZW5zZSIsCiAJW0NYVDUwNDVfQkVOUV0JCQk9ICJiZW5xIiwKLQlbQ1hUNTA0NV9MQVBUT1BfSFA1MzBdCQk9ICJsYXB0b3AtaHA1MzAiLAogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKIAlbQ1hUNTA0NV9URVNUXQkJPSAidGVzdCIsCiAjZW5kaWYKQEAgLTEwMjEsOCArOTc1LDYgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBjeHQ1MDQ1X2NmZ190YmxbXSA9IHsKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMGQ1LCAiSFAgNTMwIiwgQ1hUNTA0NV9MQVBUT1BfSFA1MzApLAotCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMzEsICJUb3NoaWJhIFAxMDUiLCBDWFQ1MDQ1X0xBUFRPUF9NSUNTRU5TRSksCiAJU05EX1BDSV9RVUlSSygweDE1MmQsIDB4MDc1MywgIkJlbnEgUjU1RSIsIENYVDUwNDVfQkVOUSksCiAJU05EX1BDSV9RVUlSSygweDE3MzQsIDB4MTBhZCwgIkZ1aml0c3UgU2kxNTIwIiwgQ1hUNTA0NV9MQVBUT1BfTUlDU0VOU0UpLAogCVNORF9QQ0lfUVVJUksoMHgxNzM0LCAweDEwY2IsICJGdWppdHN1IFNpMzUxNSIsIENYVDUwNDVfTEFQVE9QX0hQTUlDU0VOU0UpLApAQCAtMTExMywxNCArMTA2NSw2IEBACiAJCXNwZWMtPm51bV9taXhlcnMgPSAyOwogCQljb2RlYy0+cGF0Y2hfb3BzLmluaXQgPSBjeHQ1MDQ1X2luaXQ7CiAJCWJyZWFrOwotCWNhc2UgQ1hUNTA0NV9MQVBUT1BfSFA1MzA6Ci0JCWNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQgPSBjeHQ1MDQ1X2hwX3Vuc29sX2V2ZW50OwotCQlzcGVjLT5pbnB1dF9tdXggPSAmY3h0NTA0NV9jYXB0dXJlX3NvdXJjZV9ocDUzMDsKLQkJc3BlYy0+bnVtX2luaXRfdmVyYnMgPSAyOwotCQlzcGVjLT5pbml0X3ZlcmJzWzFdID0gY3h0NTA0NV9ocF9zZW5zZV9pbml0X3ZlcmJzOwotCQlzcGVjLT5taXhlcnNbMF0gPSBjeHQ1MDQ1X21peGVyc19ocDUzMDsKLQkJY29kZWMtPnBhdGNoX29wcy5pbml0ID0gY3h0NTA0NV9pbml0OwotCQlicmVhazsKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHCiAJY2FzZSBDWFQ1MDQ1X1RFU1Q6CiAJCXNwZWMtPmlucHV0X211eCA9ICZjeHQ1MDQ1X3Rlc3RfY2FwdHVyZV9zb3VyY2U7CkBAIC0xOTQwLDExICsxODg0LDYgQEAKIHN0YXRpYyBjb25zdCBoZGFfbmlkX3QgY3h0NTA2Nl9jYXBzcmNfbmlkc1sxXSA9IHsgMHgxNyB9Owogc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBjeHQ1MDY2X2RpZ291dF9waW5fbmlkc1syXSA9IHsgMHgyMCwgMHgyMiB9OwogCi0vKiBPTFBDJ3MgbWljcm9waG9uZSBwb3J0IGlzIERDIGNvdXBsZWQgZm9yIHVzZSB3aXRoIGV4dGVybmFsIHNlbnNvcnMsCi0gKiB0aGVyZWZvcmUgd2UgdXNlIGEgNTAlIG1pYyBiaWFzIGluIG9yZGVyIHRvIGNlbnRlciB0aGUgaW5wdXQgc2lnbmFsIHdpdGgKLSAqIHRoZSBEQyBpbnB1dCByYW5nZSBvZiB0aGUgY29kZWMuICovCi0jZGVmaW5lIENYVDUwNjZfT0xQQ19FWFRfTUlDX0JJQVMgUElOX1ZSRUY1MAotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgY3h0NTA2Nl9tb2Rlc1sxXSA9IHsKIAl7IDIsIE5VTEwgfSwKIH07CkBAIC0xOTU5LDcgKzE4OTgsOCBAQAogCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJdW5zaWduZWQgaW50IHBpbmN0bDsKIAotCXNuZF9wcmludGRkKCJDWFQ1MDY2OiB1cGRhdGUgc3BlYWtlciwgaHBfcHJlc2VudD0lZCwgY3VyX2VhcGQ9JWRcbiIsCisJY29kZWNfZGJnKGNvZGVjLAorCQkgICJDWFQ1MDY2OiB1cGRhdGUgc3BlYWtlciwgaHBfcHJlc2VudD0lZCwgY3VyX2VhcGQ9JWRcbiIsCiAJCSAgICBzcGVjLT5ocF9wcmVzZW50LCBzcGVjLT5jdXJfZWFwZCk7CiAKIAkvKiBQb3J0IEEgKEhQKSAqLwpAQCAtMTk5Nyw4OCArMTkzNyw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBjeHQ1MDY2X29scGNfZGNfYmlhcyA9IHsKLQkubnVtX2l0ZW1zID0gMywKLQkuaXRlbXMgPSB7Ci0JCXsgIk9mZiIsIFBJTl9JTiB9LAotCQl7ICI1MCUiLCBQSU5fVlJFRjUwIH0sCi0JCXsgIjgwJSIsIFBJTl9WUkVGODAgfSwKLQl9LAotfTsKLQotc3RhdGljIGludCBjeHQ1MDY2X3NldF9vbHBjX2RjX2JpYXMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQkvKiBFdmVuIHRob3VnaCBwb3J0IEYgaXMgdGhlIERDIGlucHV0LCB0aGUgYmlhcyBpcyBjb250cm9sbGVkIG9uIHBvcnQgQi4KLQkgKiB3ZSBhbHNvIGxlYXZlIHRoYXQgcG9ydCBhcyBhbiBhY3RpdmUgaW5wdXQgKGJ1dCB1bnNlbGVjdGVkKSBpbiBEQyBtb2RlCi0JICoganVzdCBpbiBjYXNlIHRoYXQgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgdGhlIGJpYXMgc2V0dGluZyB0YWtlIGVmZmVjdC4gKi8KLQlyZXR1cm4gc25kX2hkYV9zZXRfcGluX2N0bF9jYWNoZShjb2RlYywgMHgxYSwKLQkJY3h0NTA2Nl9vbHBjX2RjX2JpYXMuaXRlbXNbc3BlYy0+ZGNfaW5wdXRfYmlhc10uaW5kZXgpOwotfQotCi0vKiBPTFBDIGRlZmVycyBtaWMgd2lkZ2V0IGNvbnRyb2wgdW50aWwgd2hlbiBjYXB0dXJlIGlzIHN0YXJ0ZWQgYmVjYXVzZSB0aGUKLSAqIG1pY3JvcGhvbmUgTEVEIGNvbWVzIG9uIGFzIHNvb24gYXMgdGhlc2Ugc2V0dGluZ3MgYXJlIHB1dCBpbiBwbGFjZS4gaWYgd2UKLSAqIGRpZCB0aGlzIGJlZm9yZSByZWNvcmRpbmcsIGl0IHdvdWxkIGdpdmUgdGhlIGZhbHNlIGluZGljYXRpb24gdGhhdCByZWNvcmRpbmcKLSAqIGlzIGhhcHBlbmluZyB3aGVuIGl0IGlzIG5vdC4gKi8KLXN0YXRpYyB2b2lkIGN4dDUwNjZfb2xwY19zZWxlY3RfbWljKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaWYgKCFzcGVjLT5yZWNvcmRpbmcpCi0JCXJldHVybjsKLQotCWlmIChzcGVjLT5kY19lbmFibGUpIHsKLQkJLyogaW4gREMgbW9kZSB3ZSBpZ25vcmUgcHJlc2VuY2UgZGV0ZWN0aW9uIGFuZCBqdXN0IHVzZSB0aGUgamFjawotCQkgKiB0aHJvdWdoIG91ciBzcGVjaWFsIERDIHBvcnQgKi8KLQkJY29uc3Qgc3RydWN0IGhkYV92ZXJiIGVuYWJsZV9kY19tb2RlW10gPSB7Ci0JCQkvKiBkaXNibGUgaW50ZXJuYWwgbWljLCBwb3J0IEMgKi8KLQkJCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB9LAotCi0JCQkvKiBlbmFibGUgREMgY2FwdHVyZSwgcG9ydCBGICovCi0JCQl7MHgxZSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCQkJe30sCi0JCX07Ci0KLQkJc25kX2hkYV9zZXF1ZW5jZV93cml0ZShjb2RlYywgZW5hYmxlX2RjX21vZGUpOwotCQkvKiBwb3J0IEIgaW5wdXQgZGlzYWJsZWQgKGFuZCBiaWFzIHNldCkgdGhyb3VnaCB0aGUgZm9sbG93aW5nIGNhbGwgKi8KLQkJY3h0NTA2Nl9zZXRfb2xwY19kY19iaWFzKGNvZGVjKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGRpc2FibGUgREMgKHBvcnQgRikgKi8KLQlzbmRfaGRhX3NldF9waW5fY3RsKGNvZGVjLCAweDFlLCAwKTsKLQotCS8qIGV4dGVybmFsIG1pYywgcG9ydCBCICovCi0Jc25kX2hkYV9zZXRfcGluX2N0bChjb2RlYywgMHgxYSwKLQkJc3BlYy0+ZXh0X21pY19wcmVzZW50ID8gQ1hUNTA2Nl9PTFBDX0VYVF9NSUNfQklBUyA6IDApOwotCi0JLyogaW50ZXJuYWwgbWljLCBwb3J0IEMgKi8KLQlzbmRfaGRhX3NldF9waW5fY3RsKGNvZGVjLCAweDFiLAotCQlzcGVjLT5leHRfbWljX3ByZXNlbnQgPyAwIDogUElOX1ZSRUY4MCk7Ci19Ci0KLS8qIHRvZ2dsZSBpbnB1dCBvZiBidWlsdC1pbiBhbmQgbWljIGphY2sgYXBwcm9wcmlhdGVseSAqLwotc3RhdGljIHZvaWQgY3h0NTA2Nl9vbHBjX2F1dG9taWMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQl1bnNpZ25lZCBpbnQgcHJlc2VudDsKLQotCWlmIChzcGVjLT5kY19lbmFibGUpIC8qIGRvbid0IGRvIHByZXNlbmNlIGRldGVjdGlvbiBpbiBEQyBtb2RlICovCi0JCXJldHVybjsKLQotCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MWEsIDAsCi0JCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKLQlpZiAocHJlc2VudCkKLQkJc25kX3ByaW50ZGQoIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgZGV0ZWN0ZWRcbiIpOwotCWVsc2UKLQkJc25kX3ByaW50ZGQoIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgYWJzZW50XG4iKTsKLQotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MTcsIDAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLAotCQlwcmVzZW50ID8gMCA6IDEpOwotCXNwZWMtPmV4dF9taWNfcHJlc2VudCA9ICEhcHJlc2VudDsKLQotCWN4dDUwNjZfb2xwY19zZWxlY3RfbWljKGNvZGVjKTsKLX0KLQogLyogdG9nZ2xlIGlucHV0IG9mIGJ1aWx0LWluIGRpZ2l0YWwgbWljIGFuZCBtaWMgamFjayBhcHByb3ByaWF0ZWx5ICovCiBzdGF0aWMgdm9pZCBjeHQ1MDY2X3Zvc3Ryb19hdXRvbWljKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewpAQCAtMjExMCwxMCArMTk2OCwxMCBAQAogCiAJcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIDB4MWEpOwogCWlmIChwcmVzZW50KSB7Ci0JCXNuZF9wcmludGRkKCJDWFQ1MDY2OiBleHRlcm5hbCBtaWNyb3Bob25lIGRldGVjdGVkXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBkZXRlY3RlZFxuIik7CiAJCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIGV4dF9taWNfcHJlc2VudCk7CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ZGQoIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgYWJzZW50XG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBhYnNlbnRcbiIpOwogCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBleHRfbWljX2Fic2VudCk7CiAJfQogfQpAQCAtMjEzOCwxMCArMTk5NiwxMCBAQAogCiAJcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIDB4MWIpOwogCWlmIChwcmVzZW50KSB7Ci0JCXNuZF9wcmludGRkKCJDWFQ1MDY2OiBleHRlcm5hbCBtaWNyb3Bob25lIGRldGVjdGVkXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBkZXRlY3RlZFxuIik7CiAJCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIGV4dF9taWNfcHJlc2VudCk7CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ZGQoIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgYWJzZW50XG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBhYnNlbnRcbiIpOwogCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBleHRfbWljX2Fic2VudCk7CiAJfQogfQpAQCAtMjE1Myw3ICsyMDExLDcgQEAKIAl1bnNpZ25lZCBpbnQgcHJlc2VudDsKIAogCXByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDFiKTsKLQlzbmRfcHJpbnRkZCgiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBwcmVzZW50PSVkXG4iLCBwcmVzZW50KTsKKwljb2RlY19kYmcoY29kZWMsICJDWFQ1MDY2OiBleHRlcm5hbCBtaWNyb3Bob25lIHByZXNlbnQ9JWRcbiIsIHByZXNlbnQpOwogCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MTcsIDAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLAogCQkJICAgIHByZXNlbnQgPyAxIDogMCk7CiB9CkBAIC0yMTY1LDcgKzIwMjMsNyBAQAogCXVuc2lnbmVkIGludCBwcmVzZW50OwogCiAJcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIDB4MWIpOwotCXNuZF9wcmludGRkKCJDWFQ1MDY2OiBleHRlcm5hbCBtaWNyb3Bob25lIHByZXNlbnQ9JWRcbiIsIHByZXNlbnQpOworCWNvZGVjX2RiZyhjb2RlYywgIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgcHJlc2VudD0lZFxuIiwgcHJlc2VudCk7CiAJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgxNywgMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsCiAJCQkgICAgcHJlc2VudCA/IDEgOiAzKTsKIH0KQEAgLTIyMDQsMTMgKzIwNjIsMTMgQEAKIAlleHRfcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIDB4MWIpOwogCWRvY2tfcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIDB4MWEpOwogCWlmIChleHRfcHJlc2VudCkgewotCQlzbmRfcHJpbnRkZCgiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBkZXRlY3RlZFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgZGV0ZWN0ZWRcbiIpOwogCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBleHRfbWljX3ByZXNlbnQpOwogCX0gZWxzZSBpZiAoZG9ja19wcmVzZW50KSB7Ci0JCXNuZF9wcmludGRkKCJDWFQ1MDY2OiBkb2NrIG1pY3JvcGhvbmUgZGV0ZWN0ZWRcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJDWFQ1MDY2OiBkb2NrIG1pY3JvcGhvbmUgZGV0ZWN0ZWRcbiIpOwogCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBkb2NrX21pY19wcmVzZW50KTsKIAl9IGVsc2UgewotCQlzbmRfcHJpbnRkZCgiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBhYnNlbnRcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJDWFQ1MDY2OiBleHRlcm5hbCBtaWNyb3Bob25lIGFic2VudFxuIik7CiAJCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIGV4dF9taWNfYWJzZW50KTsKIAl9CiB9CkBAIC0yMjI5LDcgKzIwODcsNyBAQAogCiAJc3BlYy0+aHBfcHJlc2VudCA9IHBvcnRBID8gSFBfUFJFU0VOVF9QT1JUX0EgOiAwOwogCXNwZWMtPmhwX3ByZXNlbnQgfD0gcG9ydEQgPyBIUF9QUkVTRU5UX1BPUlRfRCA6IDA7Ci0Jc25kX3ByaW50ZGQoIkNYVDUwNjY6IGhwIGF1dG9tdXRlIHBvcnRBPSV4IHBvcnREPSV4IHByZXNlbnQ9JWRcbiIsCisJY29kZWNfZGJnKGNvZGVjLCAiQ1hUNTA2NjogaHAgYXV0b211dGUgcG9ydEE9JXggcG9ydEQ9JXggcHJlc2VudD0lZFxuIiwKIAkJcG9ydEEsIHBvcnRELCBzcGVjLT5ocF9wcmVzZW50KTsKIAljeHQ1MDY2X3VwZGF0ZV9zcGVha2VyKGNvZGVjKTsKIH0KQEAgLTIyNTIsMjYgKzIxMTAsOSBAQAogfQogCiAvKiB1bnNvbGljaXRlZCBldmVudCBmb3IgamFjayBzZW5zaW5nICovCi1zdGF0aWMgdm9pZCBjeHQ1MDY2X29scGNfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZXMpCi17Ci0Jc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzbmRfcHJpbnRkZCgiQ1hUNTA2NjogdW5zb2wgZXZlbnQgJXggKCV4KVxuIiwgcmVzLCByZXMgPj4gMjYpOwotCXN3aXRjaCAocmVzID4+IDI2KSB7Ci0JY2FzZSBDT05FWEFOVF9IUF9FVkVOVDoKLQkJY3h0NTA2Nl9ocF9hdXRvbXV0ZShjb2RlYyk7Ci0JCWJyZWFrOwotCWNhc2UgQ09ORVhBTlRfTUlDX0VWRU5UOgotCQkvKiBpZ25vcmUgbWljIGV2ZW50cyBpbiBEQyBtb2RlOyB3ZSdyZSBhbHdheXMgdXNpbmcgdGhlIGphY2sgKi8KLQkJaWYgKCFzcGVjLT5kY19lbmFibGUpCi0JCQljeHQ1MDY2X29scGNfYXV0b21pYyhjb2RlYyk7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyogdW5zb2xpY2l0ZWQgZXZlbnQgZm9yIGphY2sgc2Vuc2luZyAqLwogc3RhdGljIHZvaWQgY3h0NTA2Nl91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlcykKIHsKLQlzbmRfcHJpbnRkZCgiQ1hUNTA2NjogdW5zb2wgZXZlbnQgJXggKCV4KVxuIiwgcmVzLCByZXMgPj4gMjYpOworCWNvZGVjX2RiZyhjb2RlYywgIkNYVDUwNjY6IHVuc29sIGV2ZW50ICV4ICgleClcbiIsIHJlcywgcmVzID4+IDI2KTsKIAlzd2l0Y2ggKHJlcyA+PiAyNikgewogCWNhc2UgQ09ORVhBTlRfSFBfRVZFTlQ6CiAJCWN4dDUwNjZfaHBfYXV0b211dGUoY29kZWMpOwpAQCAtMjMzOCwxMjQgKzIxNzksMTAgQEAKIAkJaWR4ID0gaW11eC0+bnVtX2l0ZW1zIC0gMTsKIAogCXNwZWMtPm1pY19ib29zdCA9IGlkeDsKLQlpZiAoIXNwZWMtPmRjX2VuYWJsZSkKLQkJY3h0NTA2Nl9zZXRfbWljX2Jvb3N0KGNvZGVjKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgY3h0NTA2Nl9lbmFibGVfZGMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JY29uc3Qgc3RydWN0IGhkYV92ZXJiIGVuYWJsZV9kY19tb2RlW10gPSB7Ci0JCS8qIGRpc2FibGUgZ2FpbiAqLwotCQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JCS8qIHN3aXRjaCB0byBEQyBpbnB1dCAqLwotCQl7MHgxNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDN9LAotCQl7fQotCX07Ci0KLQkvKiBjb25maWd1cmUgYXMgaW5wdXQgc291cmNlICovCi0Jc25kX2hkYV9zZXF1ZW5jZV93cml0ZShjb2RlYywgZW5hYmxlX2RjX21vZGUpOwotCWN4dDUwNjZfb2xwY19zZWxlY3RfbWljKGNvZGVjKTsgLyogYWxzbyBzZXRzIGNvbmZpZ3VyZWQgYmlhcyAqLwotfQotCi1zdGF0aWMgdm9pZCBjeHQ1MDY2X2Rpc2FibGVfZGMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JLyogcmVjb25maWd1cmUgaW5wdXQgc291cmNlICovCiAJY3h0NTA2Nl9zZXRfbWljX2Jvb3N0KGNvZGVjKTsKLQkvKiBhdXRvbWljIGFsc28gc2VsZWN0cyB0aGUgcmlnaHQgbWljIGlmIHdlJ3JlIHJlY29yZGluZyAqLwotCWN4dDUwNjZfb2xwY19hdXRvbWljKGNvZGVjKTsKLX0KLQotc3RhdGljIGludCBjeHQ1MDY2X29scGNfZGNfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc3BlYy0+ZGNfZW5hYmxlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGN4dDUwNjZfb2xwY19kY19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IGRjX2VuYWJsZSA9ICEhdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlpZiAoZGNfZW5hYmxlID09IHNwZWMtPmRjX2VuYWJsZSkKLQkJcmV0dXJuIDA7Ci0KLQlzcGVjLT5kY19lbmFibGUgPSBkY19lbmFibGU7Ci0JaWYgKGRjX2VuYWJsZSkKLQkJY3h0NTA2Nl9lbmFibGVfZGMoY29kZWMpOwotCWVsc2UKLQkJY3h0NTA2Nl9kaXNhYmxlX2RjKGNvZGVjKTsKLQogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IGN4dDUwNjZfb2xwY19kY19iaWFzX2VudW1faW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKLXsKLQlyZXR1cm4gc25kX2hkYV9pbnB1dF9tdXhfaW5mbygmY3h0NTA2Nl9vbHBjX2RjX2JpYXMsIHVpbmZvKTsKLX0KLQotc3RhdGljIGludCBjeHQ1MDY2X29scGNfZGNfYmlhc19lbnVtX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzcGVjLT5kY19pbnB1dF9iaWFzOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGN4dDUwNjZfb2xwY19kY19iaWFzX2VudW1fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXggPSAmY3h0NTA2Nl9hbmFsb2dfbWljX2Jvb3N0OwotCXVuc2lnbmVkIGludCBpZHg7Ci0KLQlpZHggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwotCWlmIChpZHggPj0gaW11eC0+bnVtX2l0ZW1zKQotCQlpZHggPSBpbXV4LT5udW1faXRlbXMgLSAxOwotCi0Jc3BlYy0+ZGNfaW5wdXRfYmlhcyA9IGlkeDsKLQlpZiAoc3BlYy0+ZGNfZW5hYmxlKQotCQljeHQ1MDY2X3NldF9vbHBjX2RjX2JpYXMoY29kZWMpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBjeHQ1MDY2X29scGNfY2FwdHVyZV9wcmVwYXJlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JLyogbWFyayBhcyByZWNvcmRpbmcgYW5kIGNvbmZpZ3VyZSB0aGUgbWljcm9waG9uZSB3aWRnZXQgc28gdGhhdCB0aGUKLQkgKiByZWNvcmRpbmcgTEVEIGNvbWVzIG9uLiAqLwotCXNwZWMtPnJlY29yZGluZyA9IDE7Ci0JY3h0NTA2Nl9vbHBjX3NlbGVjdF9taWMoY29kZWMpOwotfQotCi1zdGF0aWMgdm9pZCBjeHQ1MDY2X29scGNfY2FwdHVyZV9jbGVhbnVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JY29uc3Qgc3RydWN0IGhkYV92ZXJiIGRpc2FibGVfbWljc1tdID0gewotCQkvKiBkaXNhYmxlIGV4dGVybmFsIG1pYywgcG9ydCBCICovCi0JCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB9LAotCi0JCS8qIGRpc2JsZSBpbnRlcm5hbCBtaWMsIHBvcnQgQyAqLwotCQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQotCQkvKiBkaXNhYmxlIERDIGNhcHR1cmUsIHBvcnQgRiAqLwotCQl7MHgxZSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQkJe30sCi0JfTsKLQotCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIGRpc2FibGVfbWljcyk7Ci0Jc3BlYy0+cmVjb3JkaW5nID0gMDsKLX0KLQogc3RhdGljIHZvaWQgY29uZXhhbnRfY2hlY2tfZGlnX291dHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCiAJCQkJICAgIGNvbnN0IGhkYV9uaWRfdCAqZGlnX3BpbnMsCiAJCQkJICAgIGludCBudW1fcGlucykKQEAgLTI1MDYsNDMgKzIyMzMsNiBAQAogCXt9CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3h0NTA2Nl9taXhlcl9tYXN0ZXJfb2xwY1tdID0gewotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLAotCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8Ci0JCQkJICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfAotCQkJCSAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9DQUxMQkFDSywKLQkJLnN1YmRldmljZSA9IEhEQV9TVUJERVZfQU1QX0ZMQUcsCi0JCS5pbmZvID0gc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX2luZm8sCi0JCS5nZXQgPSBzbmRfaGRhX21peGVyX2FtcF92b2x1bWVfZ2V0LAotCQkucHV0ID0gc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX3B1dCwKLQkJLnRsdiA9IHsgLmMgPSBzbmRfaGRhX21peGVyX2FtcF90bHYgfSwKLQkJLyogb2Zmc2V0IGJ5IDI4IHZvbHVtZSBzdGVwcyB0byBsaW1pdCBtaW5pbXVtIGdhaW4gdG8gLTQ2ZEIgKi8KLQkJLnByaXZhdGVfdmFsdWUgPQotCQkJSERBX0NPTVBPU0VfQU1QX1ZBTF9PRlMoMHgxMCwgMywgMCwgSERBX09VVFBVVCwgMjgpLAotCX0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjeHQ1MDY2X21peGVyX29scGNfZGNbXSA9IHsKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJEQyBNb2RlIEVuYWJsZSBTd2l0Y2giLAotCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCi0JCS5nZXQgPSBjeHQ1MDY2X29scGNfZGNfZ2V0LAotCQkucHV0ID0gY3h0NTA2Nl9vbHBjX2RjX3B1dCwKLQl9LAotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIkRDIElucHV0IEJpYXMgRW51bSIsCi0JCS5pbmZvID0gY3h0NTA2Nl9vbHBjX2RjX2JpYXNfZW51bV9pbmZvLAotCQkuZ2V0ID0gY3h0NTA2Nl9vbHBjX2RjX2JpYXNfZW51bV9nZXQsCi0JCS5wdXQgPSBjeHQ1MDY2X29scGNfZGNfYmlhc19lbnVtX3B1dCwKLQl9LAotCXt9Ci19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3h0NTA2Nl9taXhlcnNbXSA9IHsKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLApAQCAtMjYzMyw2NyArMjMyMyw2IEBACiAJeyB9IC8qIGVuZCAqLwogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBjeHQ1MDY2X2luaXRfdmVyYnNfb2xwY1tdID0gewotCS8qIFBvcnQgQTogaGVhZHBob25lcyAqLwotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgLyogREFDMSAqLwotCi0JLyogUG9ydCBCOiBleHRlcm5hbCBtaWNyb3Bob25lICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0KLQkvKiBQb3J0IEM6IGludGVybmFsIG1pY3JvcGhvbmUgKi8KLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQotCS8qIFBvcnQgRDogdW51c2VkICovCi0JezB4MWMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0KLQkvKiBQb3J0IEU6IHVudXNlZCwgYnV0IGhhcyBwcmltYXJ5IEVBUEQgKi8KLQl7MHgxZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQl7MHgxZCwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDB4Mn0sIC8qIGRlZmF1bHQgb24gKi8KLQotCS8qIFBvcnQgRjogZXh0ZXJuYWwgREMgaW5wdXQgdGhyb3VnaCBtaWNyb3Bob25lIHBvcnQgKi8KLQl7MHgxZSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQotCS8qIFBvcnQgRzogaW50ZXJuYWwgc3BlYWtlcnMgKi8KLQl7MHgxZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBEQUMxICovCi0KLQkvKiBEQUMxICovCi0JezB4MTAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQotCS8qIERBQzI6IHVudXNlZCAqLwotCXsweDExLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCkgfCAweDUwfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCi0KLQkvKiBEaXNhYmxlIGRpZ2l0YWwgbWljcm9waG9uZSBwb3J0ICovCi0JezB4MjMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0KLQkvKiBBdWRpbyBpbnB1dCBzZWxlY3RvcnMgKi8KLQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfCAweDN9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUgfSwKLQotCS8qIERpc2FibGUgU1BESUYgKi8KLQl7MHgyMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQotCS8qIGVuYWJsZSB1bnNvbGljaXRlZCBldmVudHMgZm9yIFBvcnQgQSBhbmQgQiAqLwotCXsweDE5LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQ09ORVhBTlRfSFBfRVZFTlR9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQ09ORVhBTlRfTUlDX0VWRU5UfSwKLQl7IH0gLyogZW5kICovCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGN4dDUwNjZfaW5pdF92ZXJic192b3N0cm9bXSA9IHsKIAkvKiBQb3J0IEE6IGhlYWRwaG9uZXMgKi8KIAl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKQEAgLTI4NzksNyArMjUwOCw3IEBACiAvKiBpbml0aWFsaXplIGphY2stc2Vuc2luZywgdG9vICovCiBzdGF0aWMgaW50IGN4dDUwNjZfaW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKLQlzbmRfcHJpbnRkZCgiQ1hUNTA2NjogaW5pdFxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiQ1hUNTA2NjogaW5pdFxuIik7CiAJY29uZXhhbnRfaW5pdChjb2RlYyk7CiAJaWYgKGNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQpIHsKIAkJY3h0NTA2Nl9ocF9hdXRvbXV0ZShjb2RlYyk7CkBAIC0yODg5LDI1ICsyNTE4LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjeHQ1MDY2X29scGNfaW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNuZF9wcmludGRkKCJDWFQ1MDY2OiBpbml0XG4iKTsKLQljb25leGFudF9pbml0KGNvZGVjKTsKLQljeHQ1MDY2X2hwX2F1dG9tdXRlKGNvZGVjKTsKLQlpZiAoIXNwZWMtPmRjX2VuYWJsZSkgewotCQljeHQ1MDY2X3NldF9taWNfYm9vc3QoY29kZWMpOwotCQljeHQ1MDY2X29scGNfYXV0b21pYyhjb2RlYyk7Ci0JfSBlbHNlIHsKLQkJY3h0NTA2Nl9lbmFibGVfZGMoY29kZWMpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQogZW51bSB7CiAJQ1hUNTA2Nl9MQVBUT1AsCQkvKiBMYXB0b3BzIHcvIEVBUEQgc3VwcG9ydCAqLwogCUNYVDUwNjZfREVMTF9MQVBUT1AsCS8qIERlbGwgTGFwdG9wICovCi0JQ1hUNTA2Nl9PTFBDX1hPXzFfNSwJLyogT0xQQyBYTyAxLjUgKi8KIAlDWFQ1MDY2X0RFTExfVk9TVFJPLAkvKiBEZWxsIFZvc3RybyAxMDE1aSAqLwogCUNYVDUwNjZfSURFQVBBRCwJLyogTGVub3ZvIElkZWFQYWQgVTE1MCAqLwogCUNYVDUwNjZfVEhJTktQQUQsCS8qIExlbm92byBUaGlua1BhZCBUNDEwcywgb3RoZXJzPyAqLwpAQCAtMjkyMCw3ICsyNTMzLDYgQEAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3h0NTA2Nl9tb2RlbHNbQ1hUNTA2Nl9NT0RFTFNdID0gewogCVtDWFQ1MDY2X0xBUFRPUF0JPSAibGFwdG9wIiwKIAlbQ1hUNTA2Nl9ERUxMX0xBUFRPUF0JPSAiZGVsbC1sYXB0b3AiLAotCVtDWFQ1MDY2X09MUENfWE9fMV81XQk9ICJvbHBjLXhvLTFfNSIsCiAJW0NYVDUwNjZfREVMTF9WT1NUUk9dCT0gImRlbGwtdm9zdHJvIiwKIAlbQ1hUNTA2Nl9JREVBUEFEXQk9ICJpZGVhcGFkIiwKIAlbQ1hUNTA2Nl9USElOS1BBRF0JPSAidGhpbmtwYWQiLApAQCAtMjk0MSwxMCArMjU1Myw4IEBACiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTY0MywgIkFzdXMgSzUySlUiLCBDWFQ1MDY2X0FTVVMpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5OTMsICJBc3VzIFU1MEYiLCBDWFQ1MDY2X0FTVVMpLAogCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMWUsICJUb3NoaWJhIFNhdGVsbGl0ZSBDNjUwRCIsIENYVDUwNjZfSURFQVBBRCksCi0JU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmY1MCwgIlRvc2hpYmEgU2F0ZWxsaXRlIFA1MDAtUFNQR1NDLTAxODAwVCIsIENYVDUwNjZfT0xQQ19YT18xXzUpLAogCVNORF9QQ0lfUVVJUksoMHgxNGYxLCAweDAxMDEsICJDb25leGFudCBSZWZlcmVuY2UgYm9hcmQiLAogCQkgICAgICBDWFQ1MDY2X0xBUFRPUCksCi0JU05EX1BDSV9RVUlSSygweDE1MmQsIDB4MDgzMywgIk9MUEMgWE8tMS41IiwgQ1hUNTA2Nl9PTFBDX1hPXzFfNSksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjBmMiwgIkxlbm92byBUNDAwcyIsIENYVDUwNjZfVEhJTktQQUQpLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIxYzUsICJUaGlua3BhZCBFZGdlIDEzIiwgQ1hUNTA2Nl9USElOS1BBRCksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjFjNiwgIlRoaW5rcGFkIEVkZ2UgMTMiLCBDWFQ1MDY2X0FTVVMpLApAQCAtMzAzMCwzMiArMjY0MCwxMSBAQAogCQlzcGVjLT5taWNfYm9vc3QgPSAzOyAvKiBkZWZhdWx0IDMwZEIgZ2FpbiAqLwogCQlicmVhazsKIAotCWNhc2UgQ1hUNTA2Nl9PTFBDX1hPXzFfNToKLQkJY29kZWMtPnBhdGNoX29wcy5pbml0ID0gY3h0NTA2Nl9vbHBjX2luaXQ7Ci0JCWNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQgPSBjeHQ1MDY2X29scGNfdW5zb2xfZXZlbnQ7Ci0JCXNwZWMtPmluaXRfdmVyYnNbMF0gPSBjeHQ1MDY2X2luaXRfdmVyYnNfb2xwYzsKLQkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSBjeHQ1MDY2X21peGVyX21hc3Rlcl9vbHBjOwotCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IGN4dDUwNjZfbWl4ZXJfb2xwY19kYzsKLQkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSBjeHQ1MDY2X21peGVyczsKLQkJc3BlYy0+cG9ydF9kX21vZGUgPSAwOwotCQlzcGVjLT5taWNfYm9vc3QgPSAzOyAvKiBkZWZhdWx0IDMwZEIgZ2FpbiAqLwotCi0JCS8qIG5vIFMvUERJRiBvdXQgKi8KLQkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSAwOwotCi0JCS8qIGlucHV0IHNvdXJjZSBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkICovCi0JCXNwZWMtPmlucHV0X211eCA9IE5VTEw7Ci0KLQkJLyogb3VyIGNhcHR1cmUgaG9va3Mgd2hpY2ggYWxsb3cgdXMgdG8gdHVybiBvbiB0aGUgbWljcm9waG9uZSBMRUQKLQkJICogYXQgdGhlIHJpZ2h0IHRpbWUgKi8KLQkJc3BlYy0+Y2FwdHVyZV9wcmVwYXJlID0gY3h0NTA2Nl9vbHBjX2NhcHR1cmVfcHJlcGFyZTsKLQkJc3BlYy0+Y2FwdHVyZV9jbGVhbnVwID0gY3h0NTA2Nl9vbHBjX2NhcHR1cmVfY2xlYW51cDsKLQkJYnJlYWs7CiAJY2FzZSBDWFQ1MDY2X0RFTExfVk9TVFJPOgogCQljb2RlYy0+cGF0Y2hfb3BzLmluaXQgPSBjeHQ1MDY2X2luaXQ7CiAJCWNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQgPSBjeHQ1MDY2X3Vuc29sX2V2ZW50OwogCQlzcGVjLT5pbml0X3ZlcmJzWzBdID0gY3h0NTA2Nl9pbml0X3ZlcmJzX3Zvc3RybzsKLQkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSBjeHQ1MDY2X21peGVyX21hc3Rlcl9vbHBjOworCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IGN4dDUwNjZfbWl4ZXJfbWFzdGVyOwogCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IGN4dDUwNjZfbWl4ZXJzOwogCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IGN4dDUwNjZfdm9zdHJvX21peGVyczsKIAkJc3BlYy0+cG9ydF9kX21vZGUgPSAwOwpAQCAtMzIwNywxMSArMjc5Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGN4X2F1dG9fZnJlZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzbmRfaGRhX2FwcGx5X2ZpeHVwKGNvZGVjLCBIREFfRklYVVBfQUNUX0ZSRUUpOwotCXNuZF9oZGFfZ2VuX2ZyZWUoY29kZWMpOwotfQorI2RlZmluZSBjeF9hdXRvX2ZyZWUJc25kX2hkYV9nZW5fZnJlZQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jb2RlY19vcHMgY3hfYXV0b19wYXRjaF9vcHMgPSB7CiAJLmJ1aWxkX2NvbnRyb2xzID0gY3hfYXV0b19idWlsZF9jb250cm9scywKQEAgLTMyMzgsNiArMjgyMywxMSBAQAogCUNYVF9GSVhVUF9IRUFEUEhPTkVfTUlDLAogCUNYVF9GSVhVUF9HUElPMSwKIAlDWFRfRklYVVBfVEhJTktQQURfQUNQSSwKKwlDWFRfRklYVVBfT0xQQ19YTywKKwlDWFRfRklYVVBfQ0FQX01JWF9BTVAsCisJQ1hUX0ZJWFVQX1RPU0hJQkFfUDEwNSwKKwlDWFRfRklYVVBfSFBfNTMwLAorCUNYVF9GSVhVUF9DQVBfTUlYX0FNUF81MDQ3LAogfTsKIAogLyogZm9yIGhkYV9maXh1cF90aGlua3BhZF9hY3BpKCkgKi8KQEAgLTMzMTYsNiArMjkwNiwyODggQEAKIAl9CiB9CiAKKy8qIE9QTEMgWE8gMS41IGZpeHVwICovCisKKy8qIE9MUEMgWE8tMS41IHN1cHBvcnRzIERDIGlucHV0IG1vZGUgKGUuZy4gZm9yIHVzZSB3aXRoIGFuYWxvZyBzZW5zb3JzKQorICogdGhyb3VnaCB0aGUgbWljcm9waG9uZSBqYWNrLgorICogV2hlbiB0aGUgdXNlciBlbmFibGVzIHRoaXMgdGhyb3VnaCBhIG1peGVyIHN3aXRjaCwgYm90aCBpbnRlcm5hbCBhbmQKKyAqIGV4dGVybmFsIG1pY3JvcGhvbmVzIGFyZSBkaXNhYmxlZC4gR2FpbiBpcyBmaXhlZCBhdCAwZEIuIEluIHRoaXMgbW9kZSwKKyAqIHdlIGFsc28gYWxsb3cgdGhlIGJpYXMgdG8gYmUgY29uZmlndXJlZCB0aHJvdWdoIGEgc2VwYXJhdGUgbWl4ZXIKKyAqIGNvbnRyb2wuICovCisKKyNkZWZpbmUgdXBkYXRlX21pY19waW4oY29kZWMsIG5pZCwgdmFsKQkJCQkJXAorCXNuZF9oZGFfY29kZWNfdXBkYXRlX2NhY2hlKGNvZGVjLCBuaWQsIDAsCQkJXAorCQkJCSAgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgdmFsKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggb2xwY194b19kY19iaWFzID0geworCS5udW1faXRlbXMgPSAzLAorCS5pdGVtcyA9IHsKKwkJeyAiT2ZmIiwgUElOX0lOIH0sCisJCXsgIjUwJSIsIFBJTl9WUkVGNTAgfSwKKwkJeyAiODAlIiwgUElOX1ZSRUY4MCB9LAorCX0sCit9OworCitzdGF0aWMgdm9pZCBvbHBjX3hvX3VwZGF0ZV9taWNfYm9vc3Qoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgY2gsIHZhbDsKKworCWZvciAoY2ggPSAwOyBjaCA8IDI7IGNoKyspIHsKKwkJdmFsID0gQUNfQU1QX1NFVF9PVVRQVVQgfAorCQkJKGNoID8gQUNfQU1QX1NFVF9SSUdIVCA6IEFDX0FNUF9TRVRfTEVGVCk7CisJCWlmICghc3BlYy0+ZGNfZW5hYmxlKQorCQkJdmFsIHw9IHNuZF9oZGFfY29kZWNfYW1wX3JlYWQoY29kZWMsIDB4MTcsIGNoLCBIREFfT1VUUFVULCAwKTsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgxNywgMCwKKwkJCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgdmFsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9scGNfeG9fdXBkYXRlX21pY19waW5zKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGN1cl9pbnB1dCwgdmFsOworCXN0cnVjdCBuaWRfcGF0aCAqcGF0aDsKKworCWN1cl9pbnB1dCA9IHNwZWMtPmdlbi5pbnB1dF9wYXRoc1swXVtzcGVjLT5nZW4uY3VyX211eFswXV07CisKKwkvKiBTZXQgdXAgbWljIHBpbnMgZm9yIHBvcnQtQiwgQyBhbmQgRiBkeW5hbWljYWxseSBhcyB0aGUgcmVjb3JkaW5nCisJICogTEVEIGlzIHR1cm5lZCBvbi9vZmYgYnkgdGhlc2UgcGluIGNvbnRyb2xzCisJICovCisJaWYgKCFzcGVjLT5kY19lbmFibGUpIHsKKwkJLyogZGlzYWJsZSBEQyBiaWFzIHBhdGggYW5kIHBpbiBmb3IgcG9ydCBGICovCisJCXVwZGF0ZV9taWNfcGluKGNvZGVjLCAweDFlLCAwKTsKKwkJc25kX2hkYV9hY3RpdmF0ZV9wYXRoKGNvZGVjLCBzcGVjLT5kY19tb2RlX3BhdGgsIGZhbHNlLCBmYWxzZSk7CisKKwkJLyogdXBkYXRlIHBvcnQgQiAoZXh0IG1pYykgYW5kIEMgKGludCBtaWMpICovCisJCS8qIE9MUEMgZGVmZXJzIG1pYyB3aWRnZXQgY29udHJvbCB1bnRpbCB3aGVuIGNhcHR1cmUgaXMKKwkJICogc3RhcnRlZCBiZWNhdXNlIHRoZSBtaWNyb3Bob25lIExFRCBjb21lcyBvbiBhcyBzb29uIGFzCisJCSAqIHRoZXNlIHNldHRpbmdzIGFyZSBwdXQgaW4gcGxhY2UuIGlmIHdlIGRpZCB0aGlzIGJlZm9yZQorCQkgKiByZWNvcmRpbmcsIGl0IHdvdWxkIGdpdmUgdGhlIGZhbHNlIGluZGljYXRpb24gdGhhdAorCQkgKiByZWNvcmRpbmcgaXMgaGFwcGVuaW5nIHdoZW4gaXQgaXMgbm90LgorCQkgKi8KKwkJdXBkYXRlX21pY19waW4oY29kZWMsIDB4MWEsIHNwZWMtPnJlY29yZGluZyA/CisJCQkgICAgICAgc25kX2hkYV9jb2RlY19nZXRfcGluX3RhcmdldChjb2RlYywgMHgxYSkgOiAwKTsKKwkJdXBkYXRlX21pY19waW4oY29kZWMsIDB4MWIsIHNwZWMtPnJlY29yZGluZyA/CisJCQkgICAgICAgc25kX2hkYV9jb2RlY19nZXRfcGluX3RhcmdldChjb2RlYywgMHgxYikgOiAwKTsKKwkJLyogZW5hYmxlIG5vcm1hbCBtaWMgcGF0aCAqLworCQlwYXRoID0gc25kX2hkYV9nZXRfcGF0aF9mcm9tX2lkeChjb2RlYywgY3VyX2lucHV0KTsKKwkJaWYgKHBhdGgpCisJCQlzbmRfaGRhX2FjdGl2YXRlX3BhdGgoY29kZWMsIHBhdGgsIHRydWUsIGZhbHNlKTsKKwl9IGVsc2UgeworCQkvKiBkaXNhYmxlIG5vcm1hbCBtaWMgcGF0aCAqLworCQlwYXRoID0gc25kX2hkYV9nZXRfcGF0aF9mcm9tX2lkeChjb2RlYywgY3VyX2lucHV0KTsKKwkJaWYgKHBhdGgpCisJCQlzbmRfaGRhX2FjdGl2YXRlX3BhdGgoY29kZWMsIHBhdGgsIGZhbHNlLCBmYWxzZSk7CisKKwkJLyogRXZlbiB0aG91Z2ggcG9ydCBGIGlzIHRoZSBEQyBpbnB1dCwgdGhlIGJpYXMgaXMgY29udHJvbGxlZAorCQkgKiBvbiBwb3J0IEIuICBXZSBhbHNvIGxlYXZlIHRoYXQgcG9ydCBhcyBhbiBhY3RpdmUgaW5wdXQgKGJ1dAorCQkgKiB1bnNlbGVjdGVkKSBpbiBEQyBtb2RlIGp1c3QgaW4gY2FzZSB0aGF0IGlzIG5lY2Vzc2FyeSB0bworCQkgKiBtYWtlIHRoZSBiaWFzIHNldHRpbmcgdGFrZSBlZmZlY3QuCisJCSAqLworCQlpZiAoc3BlYy0+cmVjb3JkaW5nKQorCQkJdmFsID0gb2xwY194b19kY19iaWFzLml0ZW1zW3NwZWMtPmRjX2lucHV0X2JpYXNdLmluZGV4OworCQllbHNlCisJCQl2YWwgPSAwOworCQl1cGRhdGVfbWljX3Bpbihjb2RlYywgMHgxYSwgdmFsKTsKKwkJdXBkYXRlX21pY19waW4oY29kZWMsIDB4MWIsIDApOworCQkvKiBlbmFibGUgREMgYmlhcyBwYXRoIGFuZCBwaW4gKi8KKwkJdXBkYXRlX21pY19waW4oY29kZWMsIDB4MWUsIHNwZWMtPnJlY29yZGluZyA/IFBJTl9JTiA6IDApOworCQlzbmRfaGRhX2FjdGl2YXRlX3BhdGgoY29kZWMsIHNwZWMtPmRjX21vZGVfcGF0aCwgdHJ1ZSwgZmFsc2UpOworCX0KK30KKworLyogbWljX2F1dG9zd2l0Y2ggaG9vayAqLworc3RhdGljIHZvaWQgb2xwY194b19hdXRvbWljKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaGRhX2phY2tfdGJsICpqYWNrKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IHNhdmVkX2NhY2hlZF93cml0ZSA9IGNvZGVjLT5jYWNoZWRfd3JpdGU7CisKKwljb2RlYy0+Y2FjaGVkX3dyaXRlID0gMTsKKwkvKiBpbiBEQyBtb2RlLCB3ZSBkb24ndCBoYW5kbGUgYXV0b21pYyAqLworCWlmICghc3BlYy0+ZGNfZW5hYmxlKQorCQlzbmRfaGRhX2dlbl9taWNfYXV0b3N3aXRjaChjb2RlYywgamFjayk7CisJb2xwY194b191cGRhdGVfbWljX3BpbnMoY29kZWMpOworCXNuZF9oZGFfY29kZWNfZmx1c2hfY2FjaGUoY29kZWMpOworCWNvZGVjLT5jYWNoZWRfd3JpdGUgPSBzYXZlZF9jYWNoZWRfd3JpdGU7CisJaWYgKHNwZWMtPmRjX2VuYWJsZSkKKwkJb2xwY194b191cGRhdGVfbWljX2Jvb3N0KGNvZGVjKTsKK30KKworLyogcGNtX2NhcHR1cmUgaG9vayAqLworc3RhdGljIHZvaWQgb2xwY194b19jYXB0dXJlX2hvb2soc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCSBpbnQgYWN0aW9uKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwkvKiB0b2dnbGUgc3BlYy0+cmVjb3JkaW5nIGZsYWcgYW5kIHVwZGF0ZSBtaWMgcGlucyBhY2NvcmRpbmdseQorCSAqIGZvciB0dXJuaW5nIG9uL29mZiBMRUQKKwkgKi8KKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgSERBX0dFTl9QQ01fQUNUX1BSRVBBUkU6CisJCXNwZWMtPnJlY29yZGluZyA9IDE7CisJCW9scGNfeG9fdXBkYXRlX21pY19waW5zKGNvZGVjKTsKKwkJYnJlYWs7CisJY2FzZSBIREFfR0VOX1BDTV9BQ1RfQ0xFQU5VUDoKKwkJc3BlYy0+cmVjb3JkaW5nID0gMDsKKwkJb2xwY194b191cGRhdGVfbWljX3BpbnMoY29kZWMpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgb2xwY194b19kY19tb2RlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc3BlYy0+ZGNfZW5hYmxlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9scGNfeG9fZGNfbW9kZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgZGNfZW5hYmxlID0gISF1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCWlmIChkY19lbmFibGUgPT0gc3BlYy0+ZGNfZW5hYmxlKQorCQlyZXR1cm4gMDsKKworCXNwZWMtPmRjX2VuYWJsZSA9IGRjX2VuYWJsZTsKKwlvbHBjX3hvX3VwZGF0ZV9taWNfcGlucyhjb2RlYyk7CisJb2xwY194b191cGRhdGVfbWljX2Jvb3N0KGNvZGVjKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBvbHBjX3hvX2RjX2JpYXNfZW51bV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNwZWMtPmRjX2lucHV0X2JpYXM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2xwY194b19kY19iaWFzX2VudW1faW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJcmV0dXJuIHNuZF9oZGFfaW5wdXRfbXV4X2luZm8oJm9scGNfeG9fZGNfYmlhcywgdWluZm8pOworfQorCitzdGF0aWMgaW50IG9scGNfeG9fZGNfYmlhc19lbnVtX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwljb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW11eCA9ICZvbHBjX3hvX2RjX2JpYXM7CisJdW5zaWduZWQgaW50IGlkeDsKKworCWlkeCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJaWYgKGlkeCA+PSBpbXV4LT5udW1faXRlbXMpCisJCWlkeCA9IGltdXgtPm51bV9pdGVtcyAtIDE7CisJaWYgKHNwZWMtPmRjX2lucHV0X2JpYXMgPT0gaWR4KQorCQlyZXR1cm4gMDsKKworCXNwZWMtPmRjX2lucHV0X2JpYXMgPSBpZHg7CisJaWYgKHNwZWMtPmRjX2VuYWJsZSkKKwkJb2xwY194b191cGRhdGVfbWljX3BpbnMoY29kZWMpOworCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgb2xwY194b19taXhlcnNbXSA9IHsKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJEQyBNb2RlIEVuYWJsZSBTd2l0Y2giLAorCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCisJCS5nZXQgPSBvbHBjX3hvX2RjX21vZGVfZ2V0LAorCQkucHV0ID0gb2xwY194b19kY19tb2RlX3B1dCwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkRDIElucHV0IEJpYXMgRW51bSIsCisJCS5pbmZvID0gb2xwY194b19kY19iaWFzX2VudW1faW5mbywKKwkJLmdldCA9IG9scGNfeG9fZGNfYmlhc19lbnVtX2dldCwKKwkJLnB1dCA9IG9scGNfeG9fZGNfYmlhc19lbnVtX3B1dCwKKwl9LAorCXt9Cit9OworCisvKiBvdmVycmlkaW5nIG1pYyBib29zdCBwdXQgY2FsbGJhY2s7IHVwZGF0ZSBtaWMgYm9vc3Qgdm9sdW1lIG9ubHkgd2hlbgorICogREMgbW9kZSBpcyBkaXNhYmxlZAorICovCitzdGF0aWMgaW50IG9scGNfeG9fbWljX2Jvb3N0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgcmV0ID0gc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX3B1dChrY29udHJvbCwgdWNvbnRyb2wpOworCWlmIChyZXQgPiAwICYmIHNwZWMtPmRjX2VuYWJsZSkKKwkJb2xwY194b191cGRhdGVfbWljX2Jvb3N0KGNvZGVjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBjeHRfZml4dXBfb2xwY194byhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgY29uc3Qgc3RydWN0IGhkYV9maXh1cCAqZml4LCBpbnQgYWN0aW9uKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGk7CisKKwlpZiAoYWN0aW9uICE9IEhEQV9GSVhVUF9BQ1RfUFJPQkUpCisJCXJldHVybjsKKworCXNwZWMtPmdlbi5taWNfYXV0b3N3aXRjaF9ob29rID0gb2xwY194b19hdXRvbWljOworCXNwZWMtPmdlbi5wY21fY2FwdHVyZV9ob29rID0gb2xwY194b19jYXB0dXJlX2hvb2s7CisJc3BlYy0+ZGNfbW9kZV9wYXRoID0gc25kX2hkYV9hZGRfbmV3X3BhdGgoY29kZWMsIDB4MWUsIDB4MTQsIDApOworCisJc25kX2hkYV9hZGRfbmV3X2N0bHMoY29kZWMsIG9scGNfeG9fbWl4ZXJzKTsKKworCS8qIE9MUEMncyBtaWNyb3Bob25lIHBvcnQgaXMgREMgY291cGxlZCBmb3IgdXNlIHdpdGggZXh0ZXJuYWwgc2Vuc29ycywKKwkgKiB0aGVyZWZvcmUgd2UgdXNlIGEgNTAlIG1pYyBiaWFzIGluIG9yZGVyIHRvIGNlbnRlciB0aGUgaW5wdXQgc2lnbmFsCisJICogd2l0aCB0aGUgREMgaW5wdXQgcmFuZ2Ugb2YgdGhlIGNvZGVjLgorCSAqLworCXNuZF9oZGFfY29kZWNfc2V0X3Bpbl90YXJnZXQoY29kZWMsIDB4MWEsIFBJTl9WUkVGNTApOworCisJLyogb3ZlcnJpZGUgbWljIGJvb3N0IGNvbnRyb2wgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+Z2VuLmtjdGxzLnVzZWQ7IGkrKykgeworCQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa2N0bCA9CisJCQlzbmRfYXJyYXlfZWxlbSgmc3BlYy0+Z2VuLmtjdGxzLCBpKTsKKwkJaWYgKCFzdHJjbXAoa2N0bC0+bmFtZSwgIk1pYyBCb29zdCBWb2x1bWUiKSkgeworCQkJa2N0bC0+cHV0ID0gb2xwY194b19taWNfYm9vc3RfcHV0OworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qCisgKiBGaXggbWF4IGlucHV0IGxldmVsIG9uIG1peGVyIHdpZGdldCB0byAwZEIKKyAqIChvcmlnaW5hbGx5IGl0IGhhcyAweDJiIHN0ZXBzIHdpdGggMGRCIG9mZnNldCAweDE0KQorICovCitzdGF0aWMgdm9pZCBjeHRfZml4dXBfY2FwX21peF9hbXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICBjb25zdCBzdHJ1Y3QgaGRhX2ZpeHVwICpmaXgsIGludCBhY3Rpb24pCit7CisJc25kX2hkYV9vdmVycmlkZV9hbXBfY2Fwcyhjb2RlYywgMHgxNywgSERBX0lOUFVULAorCQkJCSAgKDB4MTQgPDwgQUNfQU1QQ0FQX09GRlNFVF9TSElGVCkgfAorCQkJCSAgKDB4MTQgPDwgQUNfQU1QQ0FQX05VTV9TVEVQU19TSElGVCkgfAorCQkJCSAgKDB4MDUgPDwgQUNfQU1QQ0FQX1NURVBfU0laRV9TSElGVCkgfAorCQkJCSAgKDEgPDwgQUNfQU1QQ0FQX01VVEVfU0hJRlQpKTsKK30KKworLyoKKyAqIEZpeCBtYXggaW5wdXQgbGV2ZWwgb24gbWl4ZXIgd2lkZ2V0IHRvIDBkQgorICogKG9yaWdpbmFsbHkgaXQgaGFzIDB4MWUgc3RlcHMgd2l0aCAwIGRCIG9mZnNldCAweDE3KQorICovCitzdGF0aWMgdm9pZCBjeHRfZml4dXBfY2FwX21peF9hbXBfNTA0NyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgIGNvbnN0IHN0cnVjdCBoZGFfZml4dXAgKmZpeCwgaW50IGFjdGlvbikKK3sKKwlzbmRfaGRhX292ZXJyaWRlX2FtcF9jYXBzKGNvZGVjLCAweDEwLCBIREFfSU5QVVQsCisJCQkJICAoMHgxNyA8PCBBQ19BTVBDQVBfT0ZGU0VUX1NISUZUKSB8CisJCQkJICAoMHgxNyA8PCBBQ19BTVBDQVBfTlVNX1NURVBTX1NISUZUKSB8CisJCQkJICAoMHgwNSA8PCBBQ19BTVBDQVBfU1RFUF9TSVpFX1NISUZUKSB8CisJCQkJICAoMSA8PCBBQ19BTVBDQVBfTVVURV9TSElGVCkpOworfQogCiAvKiBUaGlua1BhZCBYMjAwICYgY28gd2l0aCBjeHQ1MDUxICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9waW50YmwgY3h0X3BpbmNmZ19sZW5vdm9feDIwMFtdID0gewpAQCAtMzQwMSw2ICszMjczLDY4IEBACiAJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCiAJCS52LmZ1bmMgPSBoZGFfZml4dXBfdGhpbmtwYWRfYWNwaSwKIAl9LAorCVtDWFRfRklYVVBfT0xQQ19YT10gPSB7CisJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCisJCS52LmZ1bmMgPSBjeHRfZml4dXBfb2xwY194bywKKwl9LAorCVtDWFRfRklYVVBfQ0FQX01JWF9BTVBdID0geworCQkudHlwZSA9IEhEQV9GSVhVUF9GVU5DLAorCQkudi5mdW5jID0gY3h0X2ZpeHVwX2NhcF9taXhfYW1wLAorCX0sCisJW0NYVF9GSVhVUF9UT1NISUJBX1AxMDVdID0geworCQkudHlwZSA9IEhEQV9GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBoZGFfcGludGJsW10pIHsKKwkJCXsgMHgxMCwgMHg5NjE3MDFmMCB9LCAvKiBzcGVha2VyL2hwICovCisJCQl7IDB4MTIsIDB4MDJhMTkwMWUgfSwgLyogZXh0IG1pYyAqLworCQkJeyAweDE0LCAweDk1YTcwMTEwIH0sIC8qIGludCBtaWMgKi8KKwkJCXt9CisJCX0sCisJfSwKKwlbQ1hUX0ZJWFVQX0hQXzUzMF0gPSB7CisJCS50eXBlID0gSERBX0ZJWFVQX1BJTlMsCisJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGhkYV9waW50YmxbXSkgeworCQkJeyAweDEyLCAweDkwYTYwMTYwIH0sIC8qIGludCBtaWMgKi8KKwkJCXt9CisJCX0sCisJCS5jaGFpbmVkID0gdHJ1ZSwKKwkJLmNoYWluX2lkID0gQ1hUX0ZJWFVQX0NBUF9NSVhfQU1QLAorCX0sCisJW0NYVF9GSVhVUF9DQVBfTUlYX0FNUF81MDQ3XSA9IHsKKwkJLnR5cGUgPSBIREFfRklYVVBfRlVOQywKKwkJLnYuZnVuYyA9IGN4dF9maXh1cF9jYXBfbWl4X2FtcF81MDQ3LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgY3h0NTA0NV9maXh1cHNbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMGQ1LCAiSFAgNTMwIiwgQ1hUX0ZJWFVQX0hQXzUzMCksCisJU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmYzMSwgIlRvc2hpYmEgUDEwNSIsIENYVF9GSVhVUF9UT1NISUJBX1AxMDUpLAorCS8qIEhQLCBQYWNrYXJkIEJlbGwsIEZ1aml0c3UtU2llbWVucyAmIExlbm92byBsYXB0b3BzIGhhdmUKKwkgKiByZWFsbHkgYmFkIHNvdW5kIG92ZXIgMGRCIG9uIE5JRCAweDE3LgorCSAqLworCVNORF9QQ0lfUVVJUktfVkVORE9SKDB4MTAzYywgIkhQIiwgQ1hUX0ZJWFVQX0NBUF9NSVhfQU1QKSwKKwlTTkRfUENJX1FVSVJLX1ZFTkRPUigweDE2MzEsICJQYWNrYXJkIEJlbGwiLCBDWFRfRklYVVBfQ0FQX01JWF9BTVApLAorCVNORF9QQ0lfUVVJUktfVkVORE9SKDB4MTczNCwgIkZ1aml0c3UiLCBDWFRfRklYVVBfQ0FQX01JWF9BTVApLAorCVNORF9QQ0lfUVVJUktfVkVORE9SKDB4MTdhYSwgIkxlbm92byIsIENYVF9GSVhVUF9DQVBfTUlYX0FNUCksCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX21vZGVsX2ZpeHVwIGN4dDUwNDVfZml4dXBfbW9kZWxzW10gPSB7CisJeyAuaWQgPSBDWFRfRklYVVBfQ0FQX01JWF9BTVAsIC5uYW1lID0gImNhcC1taXgtYW1wIiB9LAorCXsgLmlkID0gQ1hUX0ZJWFVQX1RPU0hJQkFfUDEwNSwgLm5hbWUgPSAidG9zaGliYS1wMTA1IiB9LAorCXsgLmlkID0gQ1hUX0ZJWFVQX0hQXzUzMCwgLm5hbWUgPSAiaHAtNTMwIiB9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgY3h0NTA0N19maXh1cHNbXSA9IHsKKwkvKiBIUCBsYXB0b3BzIGhhdmUgcmVhbGx5IGJhZCBzb3VuZCBvdmVyIDAgZEIgb24gTklEIDB4MTAuCisJICovCisJU05EX1BDSV9RVUlSS19WRU5ET1IoMHgxMDNjLCAiSFAiLCBDWFRfRklYVVBfQ0FQX01JWF9BTVBfNTA0NyksCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX21vZGVsX2ZpeHVwIGN4dDUwNDdfZml4dXBfbW9kZWxzW10gPSB7CisJeyAuaWQgPSBDWFRfRklYVVBfQ0FQX01JWF9BTVBfNTA0NywgLm5hbWUgPSAiY2FwLW1peC1hbXAiIH0sCisJe30KIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBjeHQ1MDUxX2ZpeHVwc1tdID0gewpAQCAtMzQwOCwxMCArMzM0MiwxNiBAQAogCXt9CiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9tb2RlbF9maXh1cCBjeHQ1MDUxX2ZpeHVwX21vZGVsc1tdID0geworCXsgLmlkID0gQ1hUX1BJTkNGR19MRU5PVk9fWDIwMCwgLm5hbWUgPSAibGVub3ZvLXgyMDAiIH0sCisJe30KK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBjeHQ1MDY2X2ZpeHVwc1tdID0gewogCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDA1NDMsICJBY2VyIEFzcGlyZSBPbmUgNTIyIiwgQ1hUX0ZJWFVQX1NURVJFT19ETUlDKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwNTRjLCAiQWNlciBBc3BpcmUgMzgzMFRHIiwgQ1hUX0ZJWFVQX0dQSU8xKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzhkLCAiQXN1cyIsIENYVF9GSVhVUF9IRUFEUEhPTkVfTUlDX1BJTiksCisJU05EX1BDSV9RVUlSSygweDE1MmQsIDB4MDgzMywgIk9MUEMgWE8tMS41IiwgQ1hUX0ZJWFVQX09MUENfWE8pLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIwZjIsICJMZW5vdm8gVDQwMCIsIENYVF9QSU5DRkdfTEVOT1ZPX1RQNDEwKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMTVlLCAiTGVub3ZvIFQ0MTAiLCBDWFRfUElOQ0ZHX0xFTk9WT19UUDQxMCksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjE1ZiwgIkxlbm92byBUNTEwIiwgQ1hUX1BJTkNGR19MRU5PVk9fVFA0MTApLApAQCAtMzQyOCw2ICszMzY4LDE3IEBACiAJe30KIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX21vZGVsX2ZpeHVwIGN4dDUwNjZfZml4dXBfbW9kZWxzW10gPSB7CisJeyAuaWQgPSBDWFRfRklYVVBfU1RFUkVPX0RNSUMsIC5uYW1lID0gInN0ZXJlby1kbWljIiB9LAorCXsgLmlkID0gQ1hUX0ZJWFVQX0dQSU8xLCAubmFtZSA9ICJncGlvMSIgfSwKKwl7IC5pZCA9IENYVF9GSVhVUF9IRUFEUEhPTkVfTUlDX1BJTiwgLm5hbWUgPSAiaGVhZHBob25lLW1pYy1waW4iIH0sCisJeyAuaWQgPSBDWFRfUElOQ0ZHX0xFTk9WT19UUDQxMCwgLm5hbWUgPSAidHA0MTAiIH0sCisJeyAuaWQgPSBDWFRfRklYVVBfVEhJTktQQURfQUNQSSwgLm5hbWUgPSAidGhpbmtwYWQiIH0sCisJeyAuaWQgPSBDWFRfUElOQ0ZHX0xFTU9URV9BMTAwNCwgLm5hbWUgPSAibGVtb3RlLWExMDA0IiB9LAorCXsgLmlkID0gQ1hUX0ZJWFVQX09MUENfWE8sIC5uYW1lID0gIm9scGMteG8iIH0sCisJe30KK307CisKIC8qIGFkZCAiZmFrZSIgbXV0ZSBhbXAtY2FwcyB0byBEQUNzIG9uIGN4NTA1MSBzbyB0aGF0IG1peGVyIG11dGUgc3dpdGNoZXMKICAqIGNhbiBiZSBjcmVhdGVkIChia28jNDI4MjUpCiAgKi8KQEAgLTM0NDksOCArMzQwMCw3IEBACiAJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWM7CiAJaW50IGVycjsKIAotCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogJXM6IEJJT1MgYXV0by1wcm9iaW5nLlxuIiwKLQkgICAgICAgY29kZWMtPmNoaXBfbmFtZSk7CisJY29kZWNfaW5mbyhjb2RlYywgIiVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsIGNvZGVjLT5jaGlwX25hbWUpOwogCiAJc3BlYyA9IGt6YWxsb2Moc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzcGVjKQpAQCAtMzQ2NywxOSArMzQxNywyOCBAQAogCXN3aXRjaCAoY29kZWMtPnZlbmRvcl9pZCkgewogCWNhc2UgMHgxNGYxNTA0NToKIAkJY29kZWMtPnNpbmdsZV9hZGNfYW1wID0gMTsKKwkJc3BlYy0+Z2VuLm1peGVyX25pZCA9IDB4MTc7CisJCXNwZWMtPmdlbi5hZGRfc3RlcmVvX21peF9pbnB1dCA9IDE7CisJCXNuZF9oZGFfcGlja19maXh1cChjb2RlYywgY3h0NTA0NV9maXh1cF9tb2RlbHMsCisJCQkJICAgY3h0NTA0NV9maXh1cHMsIGN4dF9maXh1cHMpOwogCQlicmVhazsKIAljYXNlIDB4MTRmMTUwNDc6CiAJCWNvZGVjLT5waW5fYW1wX3dvcmthcm91bmQgPSAxOwogCQlzcGVjLT5nZW4ubWl4ZXJfbmlkID0gMHgxOTsKKwkJc3BlYy0+Z2VuLmFkZF9zdGVyZW9fbWl4X2lucHV0ID0gMTsKKwkJc25kX2hkYV9waWNrX2ZpeHVwKGNvZGVjLCBjeHQ1MDQ3X2ZpeHVwX21vZGVscywKKwkJCQkgICBjeHQ1MDQ3X2ZpeHVwcywgY3h0X2ZpeHVwcyk7CiAJCWJyZWFrOwogCWNhc2UgMHgxNGYxNTA1MToKIAkJYWRkX2N4NTA1MV9mYWtlX211dGVzKGNvZGVjKTsKIAkJY29kZWMtPnBpbl9hbXBfd29ya2Fyb3VuZCA9IDE7Ci0JCXNuZF9oZGFfcGlja19maXh1cChjb2RlYywgTlVMTCwgY3h0NTA1MV9maXh1cHMsIGN4dF9maXh1cHMpOworCQlzbmRfaGRhX3BpY2tfZml4dXAoY29kZWMsIGN4dDUwNTFfZml4dXBfbW9kZWxzLAorCQkJCSAgIGN4dDUwNTFfZml4dXBzLCBjeHRfZml4dXBzKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJY29kZWMtPnBpbl9hbXBfd29ya2Fyb3VuZCA9IDE7Ci0JCXNuZF9oZGFfcGlja19maXh1cChjb2RlYywgTlVMTCwgY3h0NTA2Nl9maXh1cHMsIGN4dF9maXh1cHMpOworCQlzbmRfaGRhX3BpY2tfZml4dXAoY29kZWMsIGN4dDUwNjZfZml4dXBfbW9kZWxzLAorCQkJCSAgIGN4dDUwNjZfZml4dXBzLCBjeHRfZml4dXBzKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0zNTEzLDcgKzM0NzIsNyBAQAogCSAqIEJldHRlciB0byBtYWtlIHJlc2V0LCB0aGVuLgogCSAqLwogCWlmICghY29kZWMtPmJ1cy0+c3luY193cml0ZSkgewotCQlzbmRfcHJpbnRkKCJoZGFfY29kZWM6ICIKKwkJY29kZWNfaW5mbyhjb2RlYywKIAkJCSAgICJFbmFibGUgc3luY193cml0ZSBmb3Igc3RhYmxlIGNvbW11bmljYXRpb25cbiIpOwogCQljb2RlYy0+YnVzLT5zeW5jX3dyaXRlID0gMTsKIAkJY29kZWMtPmJ1cy0+YWxsb3dfYnVzX3Jlc2V0ID0gMTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfaGRtaS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKaW5kZXggNWVmOTUwMy4uMGNiNWI4OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKQEAgLTY4LDYgKzY4LDcgQEAKIAloZGFfbmlkX3QgcGluX25pZDsKIAlpbnQgbnVtX211eF9uaWRzOwogCWhkYV9uaWRfdCBtdXhfbmlkc1tIREFfTUFYX0NPTk5FQ1RJT05TXTsKKwlpbnQgbXV4X2lkeDsKIAloZGFfbmlkX3QgY3Z0X25pZDsKIAogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOwpAQCAtMzUzLDQwICszNTQsNDMgQEAKICNkZWZpbmUgZ2V0X3BjbV9yZWMoc3BlYywgaWR4KSBcCiAJKChzdHJ1Y3QgaGRhX3BjbSAqKXNuZF9hcnJheV9lbGVtKCZzcGVjLT5wY21fcmVjLCBpZHgpKQogCi1zdGF0aWMgaW50IHBpbl9uaWRfdG9fcGluX2luZGV4KHN0cnVjdCBoZG1pX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBwaW5fbmlkKQorc3RhdGljIGludCBwaW5fbmlkX3RvX3Bpbl9pbmRleChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IHBpbl9uaWQpCiB7CisJc3RydWN0IGhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCWludCBwaW5faWR4OwogCiAJZm9yIChwaW5faWR4ID0gMDsgcGluX2lkeCA8IHNwZWMtPm51bV9waW5zOyBwaW5faWR4KyspCiAJCWlmIChnZXRfcGluKHNwZWMsIHBpbl9pZHgpLT5waW5fbmlkID09IHBpbl9uaWQpCiAJCQlyZXR1cm4gcGluX2lkeDsKIAotCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJIRE1JOiBwaW4gbmlkICVkIG5vdCByZWdpc3RlcmVkXG4iLCBwaW5fbmlkKTsKKwljb2RlY193YXJuKGNvZGVjLCAiSERNSTogcGluIG5pZCAlZCBub3QgcmVnaXN0ZXJlZFxuIiwgcGluX25pZCk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgaGluZm9fdG9fcGluX2luZGV4KHN0cnVjdCBoZG1pX3NwZWMgKnNwZWMsCitzdGF0aWMgaW50IGhpbmZvX3RvX3Bpbl9pbmRleChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCSAgICAgIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8pCiB7CisJc3RydWN0IGhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCWludCBwaW5faWR4OwogCiAJZm9yIChwaW5faWR4ID0gMDsgcGluX2lkeCA8IHNwZWMtPm51bV9waW5zOyBwaW5faWR4KyspCiAJCWlmIChnZXRfcGNtX3JlYyhzcGVjLCBwaW5faWR4KS0+c3RyZWFtID09IGhpbmZvKQogCQkJcmV0dXJuIHBpbl9pZHg7CiAKLQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiSERNSTogaGluZm8gJXAgbm90IHJlZ2lzdGVyZWRcbiIsIGhpbmZvKTsKKwljb2RlY193YXJuKGNvZGVjLCAiSERNSTogaGluZm8gJXAgbm90IHJlZ2lzdGVyZWRcbiIsIGhpbmZvKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBjdnRfbmlkX3RvX2N2dF9pbmRleChzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjLCBoZGFfbmlkX3QgY3Z0X25pZCkKK3N0YXRpYyBpbnQgY3Z0X25pZF90b19jdnRfaW5kZXgoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBjdnRfbmlkKQogeworCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgY3Z0X2lkeDsKIAogCWZvciAoY3Z0X2lkeCA9IDA7IGN2dF9pZHggPCBzcGVjLT5udW1fY3Z0czsgY3Z0X2lkeCsrKQogCQlpZiAoZ2V0X2N2dChzcGVjLCBjdnRfaWR4KS0+Y3Z0X25pZCA9PSBjdnRfbmlkKQogCQkJcmV0dXJuIGN2dF9pZHg7CiAKLQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiSERNSTogY3Z0IG5pZCAlZCBub3QgcmVnaXN0ZXJlZFxuIiwgY3Z0X25pZCk7CisJY29kZWNfd2Fybihjb2RlYywgIkhETUk6IGN2dCBuaWQgJWQgbm90IHJlZ2lzdGVyZWRcbiIsIGN2dF9uaWQpOwogCXJldHVybiAtRUlOVkFMOwogfQogCkBAIC03MDYsNyArNzEwLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKIAkJY2hhbm5lbCA9IHNwZWMtPm9wcy5waW5fZ2V0X3Nsb3RfY2hhbm5lbChjb2RlYywgcGluX25pZCwgaSk7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJIRE1JOiBBU1AgY2hhbm5lbCAlZCA9PiBzbG90ICVkXG4iLAorCQljb2RlY19kYmcoY29kZWMsICJIRE1JOiBBU1AgY2hhbm5lbCAlZCA9PiBzbG90ICVkXG4iLAogCQkJCQkJY2hhbm5lbCwgaSk7CiAJfQogI2VuZGlmCkBAIC03NTUsOCArNzU5LDcgQEAKIAkJaW50IGNoYW5uZWwgPSAoc2xvdHNldHVwICYgMHhmMCkgPj4gNDsKIAkJZXJyID0gc3BlYy0+b3BzLnBpbl9zZXRfc2xvdF9jaGFubmVsKGNvZGVjLCBwaW5fbmlkLCBoZG1pX3Nsb3QsIGNoYW5uZWwpOwogCQlpZiAoZXJyKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX05PVElDRQotCQkJCSAgICAiSERNSTogY2hhbm5lbCBtYXBwaW5nIGZhaWxlZFxuIik7CisJCQljb2RlY19kYmcoY29kZWMsICJIRE1JOiBjaGFubmVsIG1hcHBpbmcgZmFpbGVkXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtOTY3LDEyICs5NzAsMTIgQEAKIAlpbnQgc2l6ZTsKIAogCXNpemUgPSBzbmRfaGRtaV9nZXRfZWxkX3NpemUoY29kZWMsIHBpbl9uaWQpOwotCXByaW50ayhLRVJOX0RFQlVHICJIRE1JOiBFTEQgYnVmIHNpemUgaXMgJWRcbiIsIHNpemUpOworCWNvZGVjX2RiZyhjb2RlYywgIkhETUk6IEVMRCBidWYgc2l6ZSBpcyAlZFxuIiwgc2l6ZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAJCXNpemUgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIHBpbl9uaWQsIDAsCiAJCQkJCQlBQ19WRVJCX0dFVF9IRE1JX0RJUF9TSVpFLCBpKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkhETUk6IERJUCBHUFslZF0gYnVmIHNpemUgaXMgJWRcbiIsIGksIHNpemUpOworCQljb2RlY19kYmcoY29kZWMsICJIRE1JOiBESVAgR1BbJWRdIGJ1ZiBzaXplIGlzICVkXG4iLCBpLCBzaXplKTsKIAl9CiAjZW5kaWYKIH0KQEAgLTk5NCwxMiArOTk3LDEyIEBACiAJCQloZG1pX3dyaXRlX2RpcF9ieXRlKGNvZGVjLCBwaW5fbmlkLCAweDApOwogCQkJaGRtaV9nZXRfZGlwX2luZGV4KGNvZGVjLCBwaW5fbmlkLCAmcGksICZiaSk7CiAJCQlpZiAocGkgIT0gaSkKLQkJCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiZGlwIGluZGV4ICVkOiAlZCAhPSAlZFxuIiwKKwkJCQljb2RlY19kYmcoY29kZWMsICJkaXAgaW5kZXggJWQ6ICVkICE9ICVkXG4iLAogCQkJCQkJYmksIHBpLCBpKTsKIAkJCWlmIChiaSA9PSAwKSAvKiBieXRlIGluZGV4IHdyYXBwZWQgYXJvdW5kICovCiAJCQkJYnJlYWs7CiAJCX0KLQkJc25kX3ByaW50ZChLRVJOX0lORk8KKwkJY29kZWNfZGJnKGNvZGVjLAogCQkJIkhETUk6IERJUCBHUFslZF0gYnVmIHJlcG9ydGVkIHNpemU9JWQsIHdyaXR0ZW49JWRcbiIsCiAJCQlpLCBzaXplLCBqKTsKIAl9CkBAIC0xMDYyLDYgKzEwNjUsNyBAQAogewogCXVuaW9uIGF1ZGlvX2luZm9mcmFtZSBhaTsKIAorCW1lbXNldCgmYWksIDAsIHNpemVvZihhaSkpOwogCWlmIChjb25uX3R5cGUgPT0gMCkgeyAvKiBIRE1JICovCiAJCXN0cnVjdCBoZG1pX2F1ZGlvX2luZm9mcmFtZSAqaGRtaV9haSA9ICZhaS5oZG1pOwogCkBAIC0xMDgwLDcgKzEwODQsNyBAQAogCQlkcF9haS0+Q0MwMl9DVDQ3CT0gYWN0aXZlX2NoYW5uZWxzIC0gMTsKIAkJZHBfYWktPkNBCQk9IGNhOwogCX0gZWxzZSB7Ci0JCXNuZF9wcmludGQoIkhETUk6IHVua25vd24gY29ubmVjdGlvbiB0eXBlIGF0IHBpbiAlZFxuIiwKKwkJY29kZWNfZGJnKGNvZGVjLCAiSERNSTogdW5rbm93biBjb25uZWN0aW9uIHR5cGUgYXQgcGluICVkXG4iLAogCQkJICAgIHBpbl9uaWQpOwogCQlyZXR1cm47CiAJfQpAQCAtMTA5Miw4ICsxMDk2LDggQEAKIAkgKi8KIAlpZiAoIWhkbWlfaW5mb2ZyYW1lX3VwdG9kYXRlKGNvZGVjLCBwaW5fbmlkLCBhaS5ieXRlcywKIAkJCQkJc2l6ZW9mKGFpKSkpIHsKLQkJc25kX3ByaW50ZGQoImhkbWlfcGluX3NldHVwX2luZm9mcmFtZTogIgotCQkJICAgICJwaW49JWQgY2hhbm5lbHM9JWQgY2E9MHglMDJ4XG4iLAorCQljb2RlY19kYmcoY29kZWMsCisJCQkgICJoZG1pX3Bpbl9zZXR1cF9pbmZvZnJhbWU6IHBpbj0lZCBjaGFubmVscz0lZCBjYT0weCUwMnhcbiIsCiAJCQkgICAgcGluX25pZCwKIAkJCSAgICBhY3RpdmVfY2hhbm5lbHMsIGNhKTsKIAkJaGRtaV9zdG9wX2luZm9mcmFtZV90cmFucyhjb2RlYywgcGluX25pZCk7CkBAIC0xMTYxLDcgKzExNjUsNyBAQAogc3RhdGljIHZvaWQgamFja19jYWxsYmFjayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IGhkYV9qYWNrX3RibCAqamFjaykKIHsKIAlzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IHBpbl9pZHggPSBwaW5fbmlkX3RvX3Bpbl9pbmRleChzcGVjLCBqYWNrLT5uaWQpOworCWludCBwaW5faWR4ID0gcGluX25pZF90b19waW5faW5kZXgoY29kZWMsIGphY2stPm5pZCk7CiAJaWYgKHBpbl9pZHggPCAwKQogCQlyZXR1cm47CiAKQEAgLTExODAsNyArMTE4NCw3IEBACiAJCXJldHVybjsKIAlqYWNrLT5qYWNrX2RpcnR5ID0gMTsKIAotCV9zbmRfcHJpbnRkKFNORF9QUl9WRVJCT1NFLAorCWNvZGVjX2RiZyhjb2RlYywKIAkJIkhETUkgaG90IHBsdWcgZXZlbnQ6IENvZGVjPSVkIFBpbj0lZCBEZXZpY2U9JWQgSW5hY3RpdmU9JWQgUHJlc2VuY2VfRGV0ZWN0PSVkIEVMRF9WYWxpZD0lZFxuIiwKIAkJY29kZWMtPmFkZHIsIGphY2stPm5pZCwgZGV2X2VudHJ5LCAhIShyZXMgJiBBQ19VTlNPTF9SRVNfSUEpLAogCQkhIShyZXMgJiBBQ19VTlNPTF9SRVNfUEQpLCAhIShyZXMgJiBBQ19VTlNPTF9SRVNfRUxEVikpOwpAQCAtMTE5NSw3ICsxMTk5LDcgQEAKIAlpbnQgY3Bfc3RhdGUgPSAhIShyZXMgJiBBQ19VTlNPTF9SRVNfQ1BfU1RBVEUpOwogCWludCBjcF9yZWFkeSA9ICEhKHJlcyAmIEFDX1VOU09MX1JFU19DUF9SRUFEWSk7CiAKLQlwcmludGsoS0VSTl9JTkZPCisJY29kZWNfaW5mbyhjb2RlYywKIAkJIkhETUkgQ1AgZXZlbnQ6IENPREVDPSVkIFRBRz0lZCBTVUJUQUc9MHgleCBDUF9TVEFURT0lZCBDUF9SRUFEWT0lZFxuIiwKIAkJY29kZWMtPmFkZHIsCiAJCXRhZywKQEAgLTEyMTcsNyArMTIyMSw3IEBACiAJaW50IHN1YnRhZyA9IChyZXMgJiBBQ19VTlNPTF9SRVNfU1VCVEFHKSA+PiBBQ19VTlNPTF9SRVNfU1VCVEFHX1NISUZUOwogCiAJaWYgKCFzbmRfaGRhX2phY2tfdGJsX2dldF9mcm9tX3RhZyhjb2RlYywgdGFnKSkgewotCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiVW5leHBlY3RlZCBIRE1JIGV2ZW50IHRhZyAweCV4XG4iLCB0YWcpOworCQljb2RlY19kYmcoY29kZWMsICJVbmV4cGVjdGVkIEhETUkgZXZlbnQgdGFnIDB4JXhcbiIsIHRhZyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEyNDQsNyArMTI0OCw3IEBACiAJCW1zbGVlcCg0MCk7CiAJCXB3ciA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX0dFVF9QT1dFUl9TVEFURSwgMCk7CiAJCXB3ciA9IChwd3IgJiBBQ19QV1JTVF9BQ1RVQUwpID4+IEFDX1BXUlNUX0FDVFVBTF9TSElGVDsKLQkJc25kX3ByaW50ZCgiSGFzd2VsbCBIRE1JIGF1ZGlvOiBQb3dlciBmb3IgcGluIDB4JXggaXMgbm93IEQlZFxuIiwgbmlkLCBwd3IpOworCQljb2RlY19kYmcoY29kZWMsICJIYXN3ZWxsIEhETUkgYXVkaW86IFBvd2VyIGZvciBwaW4gMHgleCBpcyBub3cgRCVkXG4iLCBuaWQsIHB3cik7CiAJfQogfQogCkBAIC0xMjc0LDggKzEyNzgsOCBAQAogCQllbHNlCiAJCQluZXdfcGluY3RsIHw9IEFDX1BJTkNUTF9FUFRfTkFUSVZFOwogCi0JCXNuZF9wcmludGRkKCJoZG1pX3Bpbl9oYnJfc2V0dXA6ICIKLQkJCSAgICAiTklEPTB4JXgsICVzcGluY3RsPTB4JXhcbiIsCisJCWNvZGVjX2RiZyhjb2RlYywKKwkJCSAgImhkbWlfcGluX2hicl9zZXR1cDogTklEPTB4JXgsICVzcGluY3RsPTB4JXhcbiIsCiAJCQkgICAgcGluX25pZCwKIAkJCSAgICBwaW5jdGwgPT0gbmV3X3BpbmN0bCA/ICIiIDogIm5ldy0iLAogCQkJICAgIG5ld19waW5jdGwpOwpAQCAtMTMwMiw3ICsxMzA2LDcgQEAKIAllcnIgPSBzcGVjLT5vcHMucGluX2hicl9zZXR1cChjb2RlYywgcGluX25pZCwgaXNfaGJyX2Zvcm1hdChmb3JtYXQpKTsKIAogCWlmIChlcnIpIHsKLQkJc25kX3ByaW50ZGQoImhkbWlfc2V0dXBfc3RyZWFtOiBIQlIgaXMgbm90IHN1cHBvcnRlZFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImhkbWlfc2V0dXBfc3RyZWFtOiBIQlIgaXMgbm90IHN1cHBvcnRlZFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xMzQxLDYgKzEzNDUsOCBAQAogCWlmIChjdnRfaWR4ID09IHNwZWMtPm51bV9jdnRzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCXBlcl9waW4tPm11eF9pZHggPSBtdXhfaWR4OworCiAJaWYgKGN2dF9pZCkKIAkJKmN2dF9pZCA9IGN2dF9pZHg7CiAJaWYgKG11eF9pZCkKQEAgLTEzNDksNiArMTM1NSwyMiBAQAogCXJldHVybiAwOwogfQogCisvKiBBc3N1cmUgdGhlIHBpbiBzZWxlY3QgdGhlIHJpZ2h0IGNvbnZldG9yICovCitzdGF0aWMgdm9pZCBpbnRlbF92ZXJpZnlfcGluX2N2dF9jb25uZWN0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJc3RydWN0IGhkbWlfc3BlY19wZXJfcGluICpwZXJfcGluKQoreworCWhkYV9uaWRfdCBwaW5fbmlkID0gcGVyX3Bpbi0+cGluX25pZDsKKwlpbnQgbXV4X2lkeCwgY3VycjsKKworCW11eF9pZHggPSBwZXJfcGluLT5tdXhfaWR4OworCWN1cnIgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIHBpbl9uaWQsIDAsCisJCQkJCSAgQUNfVkVSQl9HRVRfQ09OTkVDVF9TRUwsIDApOworCWlmIChjdXJyICE9IG11eF9pZHgpCisJCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIHBpbl9uaWQsIDAsCisJCQkJCSAgICBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwKKwkJCQkJICAgIG11eF9pZHgpOworfQorCiAvKiBJbnRlbCBIRE1JIHdvcmthcm91bmQgdG8gZml4IGF1ZGlvIHJvdXRpbmcgaXNzdWU6CiAgKiBGb3Igc29tZSBJbnRlbCBkaXNwbGF5IGNvZGVjcywgcGlucyBzaGFyZSB0aGUgc2FtZSBjb25uZWN0aW9uIGxpc3QuCiAgKiBTbyBhIGNvbnZldGVyIGNhbiBiZSBzZWxlY3RlZCBieSBtdWx0aXBsZSBwaW5zIGFuZCBwbGF5YmFjayBvbiBhbnkgb2YgdGhlc2UKQEAgLTEzODksNyArMTQxMSw4IEBACiAJCWZvciAoY3Z0X2lkeCA9IDA7IGN2dF9pZHggPCBzcGVjLT5udW1fY3Z0czsgY3Z0X2lkeCsrKSB7CiAJCQlwZXJfY3Z0ID0gZ2V0X2N2dChzcGVjLCBjdnRfaWR4KTsKIAkJCWlmICghcGVyX2N2dC0+YXNzaWduZWQpIHsKLQkJCQlzbmRfcHJpbnRkZCgiY2hvb3NlIGN2dCAlZCBmb3IgcGluIG5pZCAlZFxuIiwKKwkJCQljb2RlY19kYmcoY29kZWMsCisJCQkJCSAgImNob29zZSBjdnQgJWQgZm9yIHBpbiBuaWQgJWRcbiIsCiAJCQkJCWN2dF9pZHgsIG5pZCk7CiAJCQkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAogCQkJCQkgICAgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsCkBAIC0xNDE2LDcgKzE0MzksNyBAQAogCWludCBlcnI7CiAKIAkvKiBWYWxpZGF0ZSBoaW5mbyAqLwotCXBpbl9pZHggPSBoaW5mb190b19waW5faW5kZXgoc3BlYywgaGluZm8pOworCXBpbl9pZHggPSBoaW5mb190b19waW5faW5kZXgoY29kZWMsIGhpbmZvKTsKIAlpZiAoc25kX0JVR19PTihwaW5faWR4IDwgMCkpCiAJCXJldHVybiAtRUlOVkFMOwogCXBlcl9waW4gPSBnZXRfcGluKHNwZWMsIHBpbl9pZHgpOwpAQCAtMTQ4Miw5ICsxNTA1LDggQEAKIAloZGFfbmlkX3QgcGluX25pZCA9IHBlcl9waW4tPnBpbl9uaWQ7CiAKIAlpZiAoIShnZXRfd2NhcHMoY29kZWMsIHBpbl9uaWQpICYgQUNfV0NBUF9DT05OX0xJU1QpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAiSERNSTogcGluICVkIHdjYXBzICUjeCAiCi0JCQkgICAiZG9lcyBub3Qgc3VwcG9ydCBjb25uZWN0aW9uIGxpc3RcbiIsCisJCWNvZGVjX3dhcm4oY29kZWMsCisJCQkgICAiSERNSTogcGluICVkIHdjYXBzICUjeCBkb2VzIG5vdCBzdXBwb3J0IGNvbm5lY3Rpb24gbGlzdFxuIiwKIAkJCSAgIHBpbl9uaWQsIGdldF93Y2Fwcyhjb2RlYywgcGluX25pZCkpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNTI3LDcgKzE1NDksNyBAQAogCWVsc2UKIAkJZWxkLT5lbGRfdmFsaWQgPSBmYWxzZTsKIAotCV9zbmRfcHJpbnRkKFNORF9QUl9WRVJCT1NFLAorCWNvZGVjX2RiZyhjb2RlYywKIAkJIkhETUkgc3RhdHVzOiBDb2RlYz0lZCBQaW49JWQgUHJlc2VuY2VfRGV0ZWN0PSVkIEVMRF9WYWxpZD0lZFxuIiwKIAkJY29kZWMtPmFkZHIsIHBpbl9uaWQsIHBpbl9lbGQtPm1vbml0b3JfcHJlc2VudCwgZWxkLT5lbGRfdmFsaWQpOwogCkBAIC0xNjkwLDcgKzE3MTIsNyBAQAogCiAJbm9kZXMgPSBzbmRfaGRhX2dldF9zdWJfbm9kZXMoY29kZWMsIGNvZGVjLT5hZmcsICZuaWQpOwogCWlmICghbmlkIHx8IG5vZGVzIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiSERNSTogZmFpbGVkIHRvIGdldCBhZmcgc3ViIG5vZGVzXG4iKTsKKwkJY29kZWNfd2Fybihjb2RlYywgIkhETUk6IGZhaWxlZCB0byBnZXQgYWZnIHN1YiBub2Rlc1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTc0NCwxMiArMTc2NiwyNSBAQAogewogCWhkYV9uaWRfdCBjdnRfbmlkID0gaGluZm8tPm5pZDsKIAlzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IHBpbl9pZHggPSBoaW5mb190b19waW5faW5kZXgoc3BlYywgaGluZm8pOworCWludCBwaW5faWR4ID0gaGluZm9fdG9fcGluX2luZGV4KGNvZGVjLCBoaW5mbyk7CiAJc3RydWN0IGhkbWlfc3BlY19wZXJfcGluICpwZXJfcGluID0gZ2V0X3BpbihzcGVjLCBwaW5faWR4KTsKIAloZGFfbmlkX3QgcGluX25pZCA9IHBlcl9waW4tPnBpbl9uaWQ7CiAJYm9vbCBub25fcGNtOwogCWludCBwaW5jdGw7CiAKKwlpZiAoaXNfaGFzd2VsbF9wbHVzKGNvZGVjKSB8fCBpc192YWxsZXl2aWV3KGNvZGVjKSkgeworCQkvKiBWZXJpZnkgcGluOmN2dCBzZWxlY3Rpb25zIHRvIGF2b2lkIHNpbGVudCBhdWRpbyBhZnRlciBTMy4KKwkJICogQWZ0ZXIgUzMsIHRoZSBhdWRpbyBkcml2ZXIgcmVzdG9yZXMgcGluOmN2dCBzZWxlY3Rpb25zCisJCSAqIGJ1dCB0aGlzIGNhbiBoYXBwZW4gYmVmb3JlIGdmeCBpcyByZWFkeSBhbmQgc3VjaCBzZWxlY3Rpb24KKwkJICogaXMgb3Zlcmxvb2tlZCBieSBIVy4gVGh1cyBtdWx0aXBsZSBwaW5zIGNhbiBzaGFyZSBhIHNhbWUKKwkJICogZGVmYXVsdCBjb252ZXJ0b3IgYW5kIG11dGUgY29udHJvbCB3aWxsIGFmZmVjdCBlYWNoIG90aGVyLAorCQkgKiB3aGljaCBjYW4gY2F1c2UgYSByZXN1bWVkIGF1ZGlvIHBsYXliYWNrIGJlY29tZSBzaWxlbnQKKwkJICogYWZ0ZXIgUzMuCisJCSAqLworCQlpbnRlbF92ZXJpZnlfcGluX2N2dF9jb25uZWN0KGNvZGVjLCBwZXJfcGluKTsKKwkJaW50ZWxfbm90X3NoYXJlX2Fzc2lnbmVkX2N2dChjb2RlYywgcGluX25pZCwgcGVyX3Bpbi0+bXV4X2lkeCk7CisJfQorCiAJbm9uX3BjbSA9IGNoZWNrX25vbl9wY21fcGVyX2N2dChjb2RlYywgY3Z0X25pZCk7CiAJbXV0ZXhfbG9jaygmcGVyX3Bpbi0+bG9jayk7CiAJcGVyX3Bpbi0+Y2hhbm5lbHMgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzOwpAQCAtMTc4OCw3ICsxODIzLDcgQEAKIAlpbnQgcGluY3RsOwogCiAJaWYgKGhpbmZvLT5uaWQpIHsKLQkJY3Z0X2lkeCA9IGN2dF9uaWRfdG9fY3Z0X2luZGV4KHNwZWMsIGhpbmZvLT5uaWQpOworCQljdnRfaWR4ID0gY3Z0X25pZF90b19jdnRfaW5kZXgoY29kZWMsIGhpbmZvLT5uaWQpOwogCQlpZiAoc25kX0JVR19PTihjdnRfaWR4IDwgMCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcGVyX2N2dCA9IGdldF9jdnQoc3BlYywgY3Z0X2lkeCk7CkBAIC0xNzk3LDcgKzE4MzIsNyBAQAogCQlwZXJfY3Z0LT5hc3NpZ25lZCA9IDA7CiAJCWhpbmZvLT5uaWQgPSAwOwogCi0JCXBpbl9pZHggPSBoaW5mb190b19waW5faW5kZXgoc3BlYywgaGluZm8pOworCQlwaW5faWR4ID0gaGluZm9fdG9fcGluX2luZGV4KGNvZGVjLCBoaW5mbyk7CiAJCWlmIChzbmRfQlVHX09OKHBpbl9pZHggPCAwKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlwZXJfcGluID0gZ2V0X3BpbihzcGVjLCBwaW5faWR4KTsKQEAgLTIyMTEsNyArMjI0Niw3IEBACiAJCXJldHVybjsKIAogCS8qIG92ZXJyaWRlIHBpbnMgY29ubmVjdGlvbiBsaXN0ICovCi0Jc25kX3ByaW50ZGQoImhkbWk6IGhhc3dlbGw6IG92ZXJyaWRlIHBpbiBjb25uZWN0aW9uIDB4JXhcbiIsIG5pZCk7CisJY29kZWNfZGJnKGNvZGVjLCAiaGRtaTogaGFzd2VsbDogb3ZlcnJpZGUgcGluIGNvbm5lY3Rpb24gMHgleFxuIiwgbmlkKTsKIAlzbmRfaGRhX292ZXJyaWRlX2Nvbm5fbGlzdChjb2RlYywgbmlkLCBzcGVjLT5udW1fY3Z0cywgc3BlYy0+Y3Z0X25pZHMpOwogfQogCkBAIC0zMTMyLDggKzMxNjcsOCBAQAogCQllbHNlCiAJCQloYnJfY3RsX25ldyA9IGhicl9jdGwgJiB+QVRJX0hCUl9FTkFCTEU7CiAKLQkJc25kX3ByaW50ZGQoImF0aWhkbWlfcGluX2hicl9zZXR1cDogIgotCQkJCSJOSUQ9MHgleCwgJXNoYnItY3RsPTB4JXhcbiIsCisJCWNvZGVjX2RiZyhjb2RlYywKKwkJCSAgImF0aWhkbWlfcGluX2hicl9zZXR1cDogTklEPTB4JXgsICVzaGJyLWN0bD0weCV4XG4iLAogCQkJCXBpbl9uaWQsCiAJCQkJaGJyX2N0bCA9PSBoYnJfY3RsX25ldyA/ICIiIDogIm5ldy0iLAogCQkJCWhicl9jdGxfbmV3KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKaW5kZXggOGQwYTg0NC4uZWEyMzUxZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKQEAgLTM5NSw2ICszOTUsOCBAQAogCQlnb3RvIGRvX3NrdTsKIAl9CiAKKwlpZiAoIWNvZGVjLT5idXMtPnBjaSkKKwkJcmV0dXJuIC0xOwogCWFzcyA9IGNvZGVjLT5zdWJzeXN0ZW1faWQgJiAweGZmZmY7CiAJaWYgKGFzcyAhPSBjb2RlYy0+YnVzLT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UgJiYgKGFzcyAmIDEpKQogCQlnb3RvIGRvX3NrdTsKQEAgLTQwNSw4ICs0MDcsOCBAQAogCWFzcyA9IHNuZF9oZGFfY29kZWNfZ2V0X3BpbmNmZyhjb2RlYywgbmlkKTsKIAogCWlmICghKGFzcyAmIDEpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogJXM6IFNLVSBub3QgcmVhZHkgMHglMDh4XG4iLAotCQkgICAgICAgY29kZWMtPmNoaXBfbmFtZSwgYXNzKTsKKwkJY29kZWNfaW5mbyhjb2RlYywgIiVzOiBTS1Ugbm90IHJlYWR5IDB4JTA4eFxuIiwKKwkJCSAgIGNvZGVjLT5jaGlwX25hbWUsIGFzcyk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTQzMCwxNyArNDMyLDE3IEBACiAJc3BlYy0+Y2RlZmluZS5zd2FwID0gKGFzcyAmIDB4MikgPj4gMTsKIAlzcGVjLT5jZGVmaW5lLm92ZXJyaWRlID0gYXNzICYgMHgxOwogCi0Jc25kX3ByaW50ZCgiU0tVOiBOaWQ9MHgleCBza3VfY2ZnPTB4JTA4eFxuIiwKKwljb2RlY19kYmcoY29kZWMsICJTS1U6IE5pZD0weCV4IHNrdV9jZmc9MHglMDh4XG4iLAogCQkgICBuaWQsIHNwZWMtPmNkZWZpbmUuc2t1X2NmZyk7Ci0Jc25kX3ByaW50ZCgiU0tVOiBwb3J0X2Nvbm5lY3Rpdml0eT0weCV4XG4iLAorCWNvZGVjX2RiZyhjb2RlYywgIlNLVTogcG9ydF9jb25uZWN0aXZpdHk9MHgleFxuIiwKIAkJICAgc3BlYy0+Y2RlZmluZS5wb3J0X2Nvbm5lY3Rpdml0eSk7Ci0Jc25kX3ByaW50ZCgiU0tVOiBlbmFibGVfcGNiZWVwPTB4JXhcbiIsIHNwZWMtPmNkZWZpbmUuZW5hYmxlX3BjYmVlcCk7Ci0Jc25kX3ByaW50ZCgiU0tVOiBjaGVja19zdW09MHglMDh4XG4iLCBzcGVjLT5jZGVmaW5lLmNoZWNrX3N1bSk7Ci0Jc25kX3ByaW50ZCgiU0tVOiBjdXN0b21pemF0aW9uPTB4JTA4eFxuIiwgc3BlYy0+Y2RlZmluZS5jdXN0b21pemF0aW9uKTsKLQlzbmRfcHJpbnRkKCJTS1U6IGV4dGVybmFsX2FtcD0weCV4XG4iLCBzcGVjLT5jZGVmaW5lLmV4dGVybmFsX2FtcCk7Ci0Jc25kX3ByaW50ZCgiU0tVOiBwbGF0Zm9ybV90eXBlPTB4JXhcbiIsIHNwZWMtPmNkZWZpbmUucGxhdGZvcm1fdHlwZSk7Ci0Jc25kX3ByaW50ZCgiU0tVOiBzd2FwPTB4JXhcbiIsIHNwZWMtPmNkZWZpbmUuc3dhcCk7Ci0Jc25kX3ByaW50ZCgiU0tVOiBvdmVycmlkZT0weCV4XG4iLCBzcGVjLT5jZGVmaW5lLm92ZXJyaWRlKTsKKwljb2RlY19kYmcoY29kZWMsICJTS1U6IGVuYWJsZV9wY2JlZXA9MHgleFxuIiwgc3BlYy0+Y2RlZmluZS5lbmFibGVfcGNiZWVwKTsKKwljb2RlY19kYmcoY29kZWMsICJTS1U6IGNoZWNrX3N1bT0weCUwOHhcbiIsIHNwZWMtPmNkZWZpbmUuY2hlY2tfc3VtKTsKKwljb2RlY19kYmcoY29kZWMsICJTS1U6IGN1c3RvbWl6YXRpb249MHglMDh4XG4iLCBzcGVjLT5jZGVmaW5lLmN1c3RvbWl6YXRpb24pOworCWNvZGVjX2RiZyhjb2RlYywgIlNLVTogZXh0ZXJuYWxfYW1wPTB4JXhcbiIsIHNwZWMtPmNkZWZpbmUuZXh0ZXJuYWxfYW1wKTsKKwljb2RlY19kYmcoY29kZWMsICJTS1U6IHBsYXRmb3JtX3R5cGU9MHgleFxuIiwgc3BlYy0+Y2RlZmluZS5wbGF0Zm9ybV90eXBlKTsKKwljb2RlY19kYmcoY29kZWMsICJTS1U6IHN3YXA9MHgleFxuIiwgc3BlYy0+Y2RlZmluZS5zd2FwKTsKKwljb2RlY19kYmcoY29kZWMsICJTS1U6IG92ZXJyaWRlPTB4JXhcbiIsIHNwZWMtPmNkZWZpbmUub3ZlcnJpZGUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00ODMsNyArNDg1LDggQEAKIAl9CiAKIAlhc3MgPSBjb2RlYy0+c3Vic3lzdGVtX2lkICYgMHhmZmZmOwotCWlmICgoYXNzICE9IGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX2RldmljZSkgJiYgKGFzcyAmIDEpKQorCWlmIChjb2RlYy0+YnVzLT5wY2kgJiYKKwkgICAgYXNzICE9IGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX2RldmljZSAmJiAoYXNzICYgMSkpCiAJCWdvdG8gZG9fc2t1OwogCiAJLyogaW52YWxpZCBTU0lELCBjaGVjayB0aGUgc3BlY2lhbCBOSUQgcGluIGRlZmNmZyBpbnN0ZWFkICovCkBAIC00OTksOCArNTAyLDggQEAKIAlpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSAweDEwZWMwMjYwKQogCQluaWQgPSAweDE3OwogCWFzcyA9IHNuZF9oZGFfY29kZWNfZ2V0X3BpbmNmZyhjb2RlYywgbmlkKTsKLQlzbmRfcHJpbnRkKCJyZWFsdGVrOiBObyB2YWxpZCBTU0lELCAiCi0JCSAgICJjaGVja2luZyBwaW5jZmcgMHglMDh4IGZvciBOSUQgMHgleFxuIiwKKwljb2RlY19kYmcoY29kZWMsCisJCSAgInJlYWx0ZWs6IE5vIHZhbGlkIFNTSUQsIGNoZWNraW5nIHBpbmNmZyAweCUwOHggZm9yIE5JRCAweCV4XG4iLAogCQkgICBhc3MsIG5pZCk7CiAJaWYgKCEoYXNzICYgMSkpCiAJCXJldHVybiAwOwpAQCAtNTE2LDcgKzUxOSw3IEBACiAJaWYgKCgoYXNzID4+IDE2KSAmIDB4ZikgIT0gdG1wKQogCQlyZXR1cm4gMDsKIGRvX3NrdToKLQlzbmRfcHJpbnRkKCJyZWFsdGVrOiBFbmFibGluZyBpbml0IEFTTV9JRD0weCUwNHggQ09ERUNfSUQ9JTA4eFxuIiwKKwljb2RlY19kYmcoY29kZWMsICJyZWFsdGVrOiBFbmFibGluZyBpbml0IEFTTV9JRD0weCUwNHggQ09ERUNfSUQ9JTA4eFxuIiwKIAkJICAgYXNzICYgMHhmZmZmLCBjb2RlYy0+dmVuZG9yX2lkKTsKIAkvKgogCSAqIDAgOiBvdmVycmlkZQpAQCAtNTc0LDggKzU3Nyw4IEBACiB7CiAJaWYgKCFhbGNfc3Vic3lzdGVtX2lkKGNvZGVjLCBwb3J0cykpIHsKIAkJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JCXNuZF9wcmludGQoInJlYWx0ZWs6ICIKLQkJCSAgICJFbmFibGUgZGVmYXVsdCBzZXR1cCBmb3IgYXV0byBtb2RlIGFzIGZhbGxiYWNrXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLAorCQkJICAicmVhbHRlazogRW5hYmxlIGRlZmF1bHQgc2V0dXAgZm9yIGF1dG8gbW9kZSBhcyBmYWxsYmFja1xuIik7CiAJCXNwZWMtPmluaXRfYW1wID0gQUxDX0lOSVRfREVGQVVMVDsKIAl9CiB9CkBAIC04NDUsMTEgKzg0OCw3IEBACiAJCXNuZF9oZGFfc2h1dHVwX3BpbnMoY29kZWMpOwogfQogCi1zdGF0aWMgdm9pZCBhbGNfZnJlZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzbmRfaGRhX2FwcGx5X2ZpeHVwKGNvZGVjLCBIREFfRklYVVBfQUNUX0ZSRUUpOwotCXNuZF9oZGFfZ2VuX2ZyZWUoY29kZWMpOwotfQorI2RlZmluZSBhbGNfZnJlZQlzbmRfaGRhX2dlbl9mcmVlCiAKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyB2b2lkIGFsY19wb3dlcl9lYXBkKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtOTcwLDYgKzk2OSw4IEBACiAJCQlyZXR1cm4gYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgcC0+bmFtZSk7CiAJfQogCisJaWYgKCFjb2RlYy0+YnVzLT5wY2kpCisJCXJldHVybiAwOwogCWZvciAocSA9IHJlbmFtZV9wY2lfdGJsOyBxLT5jb2RlY192ZW5kb3JfaWQ7IHErKykgewogCQlpZiAocS0+Y29kZWNfdmVuZG9yX2lkICE9IGNvZGVjLT52ZW5kb3JfaWQpCiAJCQljb250aW51ZTsKQEAgLTk5Myw2ICs5OTQsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYmVlcF93aGl0ZV9saXN0W10gPSB7CiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTAzYywgIkFTVVMiLCAxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTVkLCAiQVNVUyIsIDEpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgyOWYsICJBU1VTIiwgMSksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODM3NiwgIkVlZVBDIiwgMSksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODNjZSwgIkVlZVBDIiwgMSksCkBAIC0yNzg2LDYgKzI3ODgsMjM3IEBACiAJc25kX2hkYV9zaHV0dXBfcGlucyhjb2RlYyk7CiB9CiAKK3N0YXRpYyB2b2lkIGFsYzI4Ml9yZXN0b3JlX2RlZmF1bHRfdmFsdWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJaW50IHZhbDsKKworCS8qIFBvd2VyIERvd24gQ29udHJvbCAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgwMywgMHgwMDAyKTsKKwkvKiBGSUZPIGFuZCBmaWx0ZXIgY2xvY2sgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MDUsIDB4MDcwMCk7CisJLyogRE1JQyBjb250cm9sICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDA3LCAweDAyMDApOworCS8qIEFuYWxvZyBjbG9jayAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDA2KTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MDYsICh2YWwgJiB+MHgwMGYwKSB8IDB4MCk7CisJLyogSkQgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgwOCk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDA4LCAodmFsICYgfjB4ZmZmYykgfCAweDBjMmMpOworCS8qIEpEIG9mZnNldDEgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MGEsIDB4Y2NjYyk7CisJLyogSkQgb2Zmc2V0MiAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgwYiwgMHhjY2NjKTsKKwkvKiBMRE8xLzIvMywgREFDL0FEQyAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgwZSwgMHg2ZTAwKTsKKwkvKiBKRCAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDBmKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MGYsICh2YWwgJiB+MHhmODAwKSB8IDB4MTAwMCk7CisJLyogQ2FwbGVzcyAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDEwKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MTAsICh2YWwgJiB+MHhmYzAwKSB8IDB4MGMwMCk7CisJLyogQ2xhc3MgRCB0ZXN0IDQgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NmYsIDB4MCk7CisJLyogSU8gcG93ZXIgZG93biBkaXJlY3RseSAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDBjKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MGMsICh2YWwgJiB+MHhmZTAwKSB8IDB4MCk7CisJLyogQU5DICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDM0LCAweGEwYzApOworCS8qIEFHQyBNVVggKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgxNik7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDE2LCAodmFsICYgfjB4MDAwOCkgfCAweDApOworCS8qIERBQyBzaW1wbGUgY29udGVudCBwcm90ZWN0aW9uICovCisJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4MWQpOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgxZCwgKHZhbCAmIH4weDAwZTApIHwgMHgwKTsKKwkvKiBBREMgc2ltcGxlIGNvbnRlbnQgcHJvdGVjdGlvbiAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDFmKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MWYsICh2YWwgJiB+MHgwMGUwKSB8IDB4MCk7CisJLyogREFDIEFEQyBaZXJvIERldGVjdGlvbiAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgyMSwgMHg4ODA0KTsKKwkvKiBQTEwgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NjMsIDB4MjkwMik7CisJLyogY2FwbGVzcyBjb250cm9sIDIgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NjgsIDB4YTA4MCk7CisJLyogY2FwbGVzcyBjb250cm9sIDMgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NjksIDB4MzQwMCk7CisJLyogY2FwbGVzcyBjb250cm9sIDQgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NmEsIDB4MmYzZSk7CisJLyogY2FwbGVzcyBjb250cm9sIDUgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NmIsIDB4MCk7CisJLyogY2xhc3MgRCB0ZXN0IDIgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHg2ZCk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDZkLCAodmFsICYgfjB4MGZmZikgfCAweDA5MDApOworCS8qIGNsYXNzIEQgdGVzdCAzICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDZlLCAweDExMGEpOworCS8qIGNsYXNzIEQgdGVzdCA1ICovCisJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4NzApOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHg3MCwgKHZhbCAmIH4weDAwZjgpIHwgMHgwMGQ4KTsKKwkvKiBjbGFzcyBEIHRlc3QgNiAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHg3MSwgMHgwMDE0KTsKKwkvKiBjbGFzc0QgT0NQICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDcyLCAweGMyYmEpOworCS8qIGNsYXNzRCBwdXJlIERDIHRlc3QgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHg3Nyk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDc3LCAodmFsICYgfjB4MGY4MCkgfCAweDApOworCS8qIENsYXNzIEQgYW1wIGNvbnRyb2wgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NmMsIDB4ZmMwNik7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzI4Ml9pbml0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWhkYV9uaWRfdCBocF9waW4gPSBzcGVjLT5nZW4uYXV0b2NmZy5ocF9waW5zWzBdOworCWJvb2wgaHBfcGluX3NlbnNlOworCWludCBjb2VmNzg7CisKKwlhbGMyODJfcmVzdG9yZV9kZWZhdWx0X3ZhbHVlKGNvZGVjKTsKKworCWlmICghaHBfcGluKQorCQlyZXR1cm47CisJaHBfcGluX3NlbnNlID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgaHBfcGluKTsKKwljb2VmNzggPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHg3OCk7CisKKwkvKiBJbmRleCAweDc4IERpcmVjdCBEcml2ZSBIUCBBTVAgTFBNIENvbnRyb2wgMSAqLworCS8qIEhlYWRwaG9uZSBjYXBsZXNzIHNldCB0byBoaWdoIHBvd2VyIG1vZGUgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NzgsIDB4OTAwNCk7CisKKwlpZiAoaHBfcGluX3NlbnNlKQorCQltc2xlZXAoMik7CisKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBocF9waW4sIDAsCisJCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFKTsKKworCWlmIChocF9waW5fc2Vuc2UpCisJCW1zbGVlcCg4NSk7CisKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBocF9waW4sIDAsCisJCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUKTsKKworCWlmIChocF9waW5fc2Vuc2UpCisJCW1zbGVlcCgxMDApOworCisJLyogSGVhZHBob25lIGNhcGxlc3Mgc2V0IHRvIG5vcm1hbCBtb2RlICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDc4LCBjb2VmNzgpOworfQorCitzdGF0aWMgdm9pZCBhbGMyODJfc2h1dHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWhkYV9uaWRfdCBocF9waW4gPSBzcGVjLT5nZW4uYXV0b2NmZy5ocF9waW5zWzBdOworCWJvb2wgaHBfcGluX3NlbnNlOworCWludCBjb2VmNzg7CisKKwlpZiAoIWhwX3BpbikgeworCQlhbGMyNjlfc2h1dHVwKGNvZGVjKTsKKwkJcmV0dXJuOworCX0KKworCWhwX3Bpbl9zZW5zZSA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIGhwX3Bpbik7CisJY29lZjc4ID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4NzgpOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHg3OCwgMHg5MDA0KTsKKworCWlmIChocF9waW5fc2Vuc2UpCisJCW1zbGVlcCgyKTsKKworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGhwX3BpbiwgMCwKKwkJCSAgICBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUpOworCisJaWYgKGhwX3Bpbl9zZW5zZSkKKwkJbXNsZWVwKDg1KTsKKworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGhwX3BpbiwgMCwKKwkJCSAgICBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MCk7CisKKwlpZiAoaHBfcGluX3NlbnNlKQorCQltc2xlZXAoMTAwKTsKKworCWFsY19hdXRvX3NldHVwX2VhcGQoY29kZWMsIGZhbHNlKTsKKwlzbmRfaGRhX3NodXR1cF9waW5zKGNvZGVjKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NzgsIGNvZWY3OCk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzI4M19yZXN0b3JlX2RlZmF1bHRfdmFsdWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJaW50IHZhbDsKKworCS8qIFBvd2VyIERvd24gQ29udHJvbCAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgwMywgMHgwMDAyKTsKKwkvKiBGSUZPIGFuZCBmaWx0ZXIgY2xvY2sgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MDUsIDB4MDcwMCk7CisJLyogRE1JQyBjb250cm9sICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDA3LCAweDAyMDApOworCS8qIEFuYWxvZyBjbG9jayAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDA2KTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MDYsICh2YWwgJiB+MHgwMGYwKSB8IDB4MCk7CisJLyogSkQgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgwOCk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDA4LCAodmFsICYgfjB4ZmZmYykgfCAweDBjMmMpOworCS8qIEpEIG9mZnNldDEgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MGEsIDB4Y2NjYyk7CisJLyogSkQgb2Zmc2V0MiAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgwYiwgMHhjY2NjKTsKKwkvKiBMRE8xLzIvMywgREFDL0FEQyAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgwZSwgMHg2ZmMwKTsKKwkvKiBKRCAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDBmKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MGYsICh2YWwgJiB+MHhmODAwKSB8IDB4MTAwMCk7CisJLyogQ2FwbGVzcyAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDEwKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MTAsICh2YWwgJiB+MHhmYzAwKSB8IDB4MGMwMCk7CisJLyogQ2xhc3MgRCB0ZXN0IDQgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4M2EsIDB4MCk7CisJLyogSU8gcG93ZXIgZG93biBkaXJlY3RseSAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDBjKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MGMsICh2YWwgJiB+MHhmZTAwKSB8IDB4MCk7CisJLyogQU5DICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDIyLCAweGEwYzApOworCS8qIEFHQyBNVVggKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmZXhfaWR4KGNvZGVjLCAweDUzLCAweDAxKTsKKwlhbGNfd3JpdGVfY29lZmV4X2lkeChjb2RlYywgMHg1MywgMHgwMSwgKHZhbCAmIH4weDAwMGYpIHwgMHgwMDA4KTsKKwkvKiBEQUMgc2ltcGxlIGNvbnRlbnQgcHJvdGVjdGlvbiAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDFkKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MWQsICh2YWwgJiB+MHgwMGUwKSB8IDB4MCk7CisJLyogQURDIHNpbXBsZSBjb250ZW50IHByb3RlY3Rpb24gKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgxZik7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDFmLCAodmFsICYgfjB4MDBlMCkgfCAweDApOworCS8qIERBQyBBREMgWmVybyBEZXRlY3Rpb24gKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MjEsIDB4ODgwNCk7CisJLyogUExMICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDJlLCAweDI5MDIpOworCS8qIGNhcGxlc3MgY29udHJvbCAyICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDMzLCAweGEwODApOworCS8qIGNhcGxlc3MgY29udHJvbCAzICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDM0LCAweDM0MDApOworCS8qIGNhcGxlc3MgY29udHJvbCA0ICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDM1LCAweDJmM2UpOworCS8qIGNhcGxlc3MgY29udHJvbCA1ICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDM2LCAweDApOworCS8qIGNsYXNzIEQgdGVzdCAyICovCisJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4MzgpOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgzOCwgKHZhbCAmIH4weDBmZmYpIHwgMHgwOTAwKTsKKwkvKiBjbGFzcyBEIHRlc3QgMyAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgzOSwgMHgxMTBhKTsKKwkvKiBjbGFzcyBEIHRlc3QgNSAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDNiKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4M2IsICh2YWwgJiB+MHgwMGY4KSB8IDB4MDBkOCk7CisJLyogY2xhc3MgRCB0ZXN0IDYgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4M2MsIDB4MDAxNCk7CisJLyogY2xhc3NEIE9DUCAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgzZCwgMHhjMmJhKTsKKwkvKiBjbGFzc0QgcHVyZSBEQyB0ZXN0ICovCisJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4NDIpOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHg0MiwgKHZhbCAmIH4weDBmODApIHwgMHgwKTsKKwkvKiB0ZXN0IG1vZGUgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NDksIDB4MCk7CisJLyogQ2xhc3MgRCBEQyBlbmFibGUgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHg0MCk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDQwLCAodmFsICYgfjB4ZjgwMCkgfCAweDk4MDApOworCS8qIERDIG9mZnNldCAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDQyKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NDIsICh2YWwgJiB+MHhmMDAwKSB8IDB4MjAwMCk7CisJLyogQ2xhc3MgRCBhbXAgY29udHJvbCAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgzNywgMHhmYzA2KTsKK30KKwogc3RhdGljIHZvaWQgYWxjMjgzX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CkBAIC0yNzkzLDYgKzMwMjYsOCBAQAogCWJvb2wgaHBfcGluX3NlbnNlOwogCWludCB2YWw7CiAKKwlhbGMyODNfcmVzdG9yZV9kZWZhdWx0X3ZhbHVlKGNvZGVjKTsKKwogCWlmICghaHBfcGluKQogCQlyZXR1cm47CiAJaHBfcGluX3NlbnNlID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgaHBfcGluKTsKQEAgLTMxNjksNyArMzQwNCw4IEBACiAJCXNwZWMtPmdlbi52bWFzdGVyX211dGUuaG9vayA9IGFsYzI2OV9maXh1cF9taWNfbXV0ZV9ob29rOwogCQlzcGVjLT5nZW4udm1hc3Rlcl9tdXRlX2VudW0gPSAxOwogCQljb2RlYy0+cG93ZXJfZmlsdGVyID0gbGVkX3Bvd2VyX2ZpbHRlcjsKLQkJc25kX3ByaW50ZCgiRGV0ZWN0ZWQgbXV0ZSBMRUQgZm9yICV4OiVkXG4iLCBzcGVjLT5tdXRlX2xlZF9uaWQsCisJCWNvZGVjX2RiZyhjb2RlYywKKwkJCSAgIkRldGVjdGVkIG11dGUgTEVEIGZvciAleDolZFxuIiwgc3BlYy0+bXV0ZV9sZWRfbmlkLAogCQkJICAgc3BlYy0+bXV0ZV9sZWRfcG9sYXJpdHkpOwogCQlicmVhazsKIAl9CkBAIC0zMjk1LDcgKzM1MzEsNyBAQAogCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4YjcsIDB4ODAyYik7CiAJCWJyZWFrOwogCX0KLQlzbmRfcHJpbnRkZCgiSGVhZHNldCBqYWNrIHNldCB0byB1bnBsdWdnZWQgbW9kZS5cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIkhlYWRzZXQgamFjayBzZXQgdG8gdW5wbHVnZ2VkIG1vZGUuXG4iKTsKIH0KIAogCkBAIC0zMzM4LDcgKzM1NzQsNyBAQAogCQlzbmRfaGRhX3NldF9waW5fY3RsX2NhY2hlKGNvZGVjLCBtaWNfcGluLCBQSU5fVlJFRjUwKTsKIAkJYnJlYWs7CiAJfQotCXNuZF9wcmludGRkKCJIZWFkc2V0IGphY2sgc2V0IHRvIG1pYy1pbiBtb2RlLlxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiSGVhZHNldCBqYWNrIHNldCB0byBtaWMtaW4gbW9kZS5cbiIpOwogfQogCiBzdGF0aWMgdm9pZCBhbGNfaGVhZHNldF9tb2RlX2RlZmF1bHQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCkBAIC0zMzY2LDcgKzM2MDIsNyBAQAogCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4YjcsIDB4ODAyYik7CiAJCWJyZWFrOwogCX0KLQlzbmRfcHJpbnRkZCgiSGVhZHNldCBqYWNrIHNldCB0byBoZWFkcGhvbmUgKGRlZmF1bHQpIG1vZGUuXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICJIZWFkc2V0IGphY2sgc2V0IHRvIGhlYWRwaG9uZSAoZGVmYXVsdCkgbW9kZS5cbiIpOwogfQogCiAvKiBJcGhvbmUgdHlwZSAqLwpAQCAtMzM5NSw3ICszNjMxLDcgQEAKIAkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweGMzLCAweDAwMDApOwogCQlicmVhazsKIAl9Ci0Jc25kX3ByaW50ZGQoIkhlYWRzZXQgamFjayBzZXQgdG8gaVBob25lLXN0eWxlIGhlYWRzZXQgbW9kZS5cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIkhlYWRzZXQgamFjayBzZXQgdG8gaVBob25lLXN0eWxlIGhlYWRzZXQgbW9kZS5cbiIpOwogfQogCiAvKiBOb2tpYSB0eXBlICovCkBAIC0zNDI0LDcgKzM2NjAsNyBAQAogCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4YzMsIDB4MDAwMCk7CiAJCWJyZWFrOwogCX0KLQlzbmRfcHJpbnRkZCgiSGVhZHNldCBqYWNrIHNldCB0byBOb2tpYS1zdHlsZSBoZWFkc2V0IG1vZGUuXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICJIZWFkc2V0IGphY2sgc2V0IHRvIE5va2lhLXN0eWxlIGhlYWRzZXQgbW9kZS5cbiIpOwogfQogCiBzdGF0aWMgdm9pZCBhbGNfZGV0ZXJtaW5lX2hlYWRzZXRfdHlwZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTM0NjYsNyArMzcwMiw3IEBACiAJCWJyZWFrOwogCX0KIAotCXNuZF9wcmludGRkKCJIZWFkc2V0IGphY2sgZGV0ZWN0ZWQgaVBob25lLXN0eWxlIGhlYWRzZXQ6ICVzXG4iLAorCWNvZGVjX2RiZyhjb2RlYywgIkhlYWRzZXQgamFjayBkZXRlY3RlZCBpUGhvbmUtc3R5bGUgaGVhZHNldDogJXNcbiIsCiAJCSAgICBpc19jdGlhID8gInllcyIgOiAibm8iKTsKIAlzcGVjLT5jdXJyZW50X2hlYWRzZXRfdHlwZSA9IGlzX2N0aWEgPyBBTENfSEVBRFNFVF9UWVBFX0NUSUEgOiBBTENfSEVBRFNFVF9UWVBFX09NVFA7CiB9CkBAIC0zNTkyLDIxICszODI4LDM4IEBACiAJCWFsY19maXh1cF9oZWFkc2V0X21vZGUoY29kZWMsIGZpeCwgYWN0aW9uKTsKIH0KIAorc3RhdGljIHZvaWQgYWxjMjU1X3NldF9kZWZhdWx0X2phY2tfdHlwZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwkvKiBTZXQgdG8gaXBob25lIHR5cGUgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MWIsIDB4ODgwYik7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDQ1LCAweGQwODkpOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgxYiwgMHgwODBiKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NDYsIDB4MDAwNCk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDFiLCAweDBjMGIpOworCW1zbGVlcCgzMCk7Cit9CisKIHN0YXRpYyB2b2lkIGFsY19maXh1cF9oZWFkc2V0X21vZGVfYWxjMjU1KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAogCQkJCWNvbnN0IHN0cnVjdCBoZGFfZml4dXAgKmZpeCwgaW50IGFjdGlvbikKIHsKIAlpZiAoYWN0aW9uID09IEhEQV9GSVhVUF9BQ1RfUFJFX1BST0JFKSB7Ci0JCS8qIFNldCB0byBpcGhvbmUgdHlwZSAqLwotCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MWIsIDB4ODgwYik7Ci0JCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHg0NSwgMHhkMDg5KTsKLQkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDFiLCAweDA4MGIpOwotCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NDYsIDB4MDAwNCk7Ci0JCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgxYiwgMHgwYzBiKTsKLQkJbXNsZWVwKDMwKTsKKwkJYWxjMjU1X3NldF9kZWZhdWx0X2phY2tfdHlwZShjb2RlYyk7CiAJfQogCWFsY19maXh1cF9oZWFkc2V0X21vZGUoY29kZWMsIGZpeCwgYWN0aW9uKTsKIH0KIAorc3RhdGljIHZvaWQgYWxjX2ZpeHVwX2hlYWRzZXRfbW9kZV9hbGMyNTVfbm9faHBfbWljKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCWNvbnN0IHN0cnVjdCBoZGFfZml4dXAgKmZpeCwgaW50IGFjdGlvbikKK3sKKwlpZiAoYWN0aW9uID09IEhEQV9GSVhVUF9BQ1RfUFJFX1BST0JFKSB7CisJCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCQlzcGVjLT5wYXJzZV9mbGFncyB8PSBIREFfUElOQ0ZHX0hFQURTRVRfTUlDOworCQlhbGMyNTVfc2V0X2RlZmF1bHRfamFja190eXBlKGNvZGVjKTsKKwl9IAorCWVsc2UKKwkJYWxjX2ZpeHVwX2hlYWRzZXRfbW9kZShjb2RlYywgZml4LCBhY3Rpb24pOworfQorCiBzdGF0aWMgdm9pZCBhbGNfZml4dXBfYXV0b19tdXRlX3ZpYV9hbXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCiAJCQkJCWNvbnN0IHN0cnVjdCBoZGFfZml4dXAgKmZpeCwgaW50IGFjdGlvbikKIHsKQEAgLTM4ODcsNyArNDE0MCw5IEBACiAJQUxDMjkwX0ZJWFVQX1NVQldPT0ZFUl9IU0pBQ0ssCiAJQUxDMjY5X0ZJWFVQX1RISU5LUEFEX0FDUEksCiAJQUxDMjU1X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSwKKwlBTEMyNTVfRklYVVBfREVMTDJfTUlDX05PX1BSRVNFTkNFLAogCUFMQzI1NV9GSVhVUF9IRUFEU0VUX01PREUsCisJQUxDMjU1X0ZJWFVQX0hFQURTRVRfTU9ERV9OT19IUF9NSUMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9maXh1cCBhbGMyNjlfZml4dXBzW10gPSB7CkBAIC00MjY0LDEwICs0NTE5LDIzIEBACiAJCS5jaGFpbmVkID0gdHJ1ZSwKIAkJLmNoYWluX2lkID0gQUxDMjU1X0ZJWFVQX0hFQURTRVRfTU9ERQogCX0sCisJW0FMQzI1NV9GSVhVUF9ERUxMMl9NSUNfTk9fUFJFU0VOQ0VdID0geworCQkudHlwZSA9IEhEQV9GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBoZGFfcGludGJsW10pIHsKKwkJCXsgMHgxOSwgMHgwMWExOTEzYyB9LCAvKiB1c2UgYXMgaGVhZHNldCBtaWMsIHdpdGhvdXQgaXRzIG93biBqYWNrIGRldGVjdCAqLworCQkJeyB9CisJCX0sCisJCS5jaGFpbmVkID0gdHJ1ZSwKKwkJLmNoYWluX2lkID0gQUxDMjU1X0ZJWFVQX0hFQURTRVRfTU9ERV9OT19IUF9NSUMKKwl9LAogCVtBTEMyNTVfRklYVVBfSEVBRFNFVF9NT0RFXSA9IHsKIAkJLnR5cGUgPSBIREFfRklYVVBfRlVOQywKIAkJLnYuZnVuYyA9IGFsY19maXh1cF9oZWFkc2V0X21vZGVfYWxjMjU1LAogCX0sCisJW0FMQzI1NV9GSVhVUF9IRUFEU0VUX01PREVfTk9fSFBfTUlDXSA9IHsKKwkJLnR5cGUgPSBIREFfRklYVVBfRlVOQywKKwkJLnYuZnVuYyA9IGFsY19maXh1cF9oZWFkc2V0X21vZGVfYWxjMjU1X25vX2hwX21pYywKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzI2OV9maXh1cF90YmxbXSA9IHsKQEAgLTQzMTksNiArNDU4Nyw5IEBACiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDYxNiwgIkRlbGwgVm9zdHJvIDU0NzAiLCBBTEMyOTBfRklYVVBfU1VCV09PRkVSX0hTSkFDSyksCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDYxZiwgIkRlbGwiLCBBTEMyNTVfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNjI5LCAiRGVsbCIsIEFMQzI2OV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2MmMsICJEZWxsIiwgQUxDMjY5X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSksCisJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDYyZSwgIkRlbGwiLCBBTEMyNjlfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNjMyLCAiRGVsbCIsIEFMQzI1NV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2MzgsICJEZWxsIEluc3Bpcm9uIDU0MzkiLCBBTEMyOTBfRklYVVBfTU9OT19TUEVBS0VSU19IU0pBQ0spLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2M2UsICJEZWxsIiwgQUxDMjY5X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSksCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDYzZiwgIkRlbGwiLCBBTEMyNTVfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFKSwKQEAgLTQzMzEsNiArNDYwMiw4IEBACiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDY1OCwgIkRlbGwiLCBBTEMyNjlfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNjVmLCAiRGVsbCIsIEFMQzI1NV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2NjIsICJEZWxsIiwgQUxDMjU1X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSksCisJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDY2OCwgIkRlbGwiLCBBTEMyNTVfRklYVVBfREVMTDJfTUlDX05PX1BSRVNFTkNFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNjY5LCAiRGVsbCIsIEFMQzI1NV9GSVhVUF9ERUxMMl9NSUNfTk9fUFJFU0VOQ0UpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDE1Y2MsICJEZWxsIFg1IFByZWNpc2lvbiIsIEFMQzI2OV9GSVhVUF9ERUxMMl9NSUNfTk9fUFJFU0VOQ0UpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDE1Y2QsICJEZWxsIFg1IFByZWNpc2lvbiIsIEFMQzI2OV9GSVhVUF9ERUxMMl9NSUNfTk9fUFJFU0VOQ0UpLAogCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDE1ODYsICJIUCIsIEFMQzI2OV9GSVhVUF9IUF9NVVRFX0xFRF9NSUMyKSwKQEAgLTQ1NzMsMTMgKzQ4NDYsMTUgQEAKIAkJc3BlYy0+Y29kZWNfdmFyaWFudCA9IEFMQzI2OV9UWVBFX0FMQzI2OVZBOwogCQlzd2l0Y2ggKGFsY19nZXRfY29lZjAoY29kZWMpICYgMHgwMGYwKSB7CiAJCWNhc2UgMHgwMDEwOgotCQkJaWYgKGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDEwMjUgJiYKKwkJCWlmIChjb2RlYy0+YnVzLT5wY2kgJiYKKwkJCSAgICBjb2RlYy0+YnVzLT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxMDI1ICYmCiAJCQkgICAgc3BlYy0+Y2RlZmluZS5wbGF0Zm9ybV90eXBlID09IDEpCiAJCQkJZXJyID0gYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzI3MVgiKTsKIAkJCXNwZWMtPmNvZGVjX3ZhcmlhbnQgPSBBTEMyNjlfVFlQRV9BTEMyNjlWQjsKIAkJCWJyZWFrOwogCQljYXNlIDB4MDAyMDoKLQkJCWlmIChjb2RlYy0+YnVzLT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxN2FhICYmCisJCQlpZiAoY29kZWMtPmJ1cy0+cGNpICYmCisJCQkgICAgY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTdhYSAmJgogCQkJICAgIGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX2RldmljZSA9PSAweDIxZjMpCiAJCQkJZXJyID0gYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzMyMDIiKTsKIAkJCXNwZWMtPmNvZGVjX3ZhcmlhbnQgPSBBTEMyNjlfVFlQRV9BTEMyNjlWQzsKQEAgLTQ2MDIsNiArNDg3Nyw4IEBACiAJCWJyZWFrOwogCWNhc2UgMHgxMGVjMDI4MjoKIAkJc3BlYy0+Y29kZWNfdmFyaWFudCA9IEFMQzI2OV9UWVBFX0FMQzI4MjsKKwkJc3BlYy0+c2h1dHVwID0gYWxjMjgyX3NodXR1cDsKKwkJc3BlYy0+aW5pdF9ob29rID0gYWxjMjgyX2luaXQ7CiAJCWJyZWFrOwogCWNhc2UgMHgxMGVjMDIzMzoKIAljYXNlIDB4MTBlYzAyODM6CkBAIC00OTE5LDggKzUxOTYsNyBAQAogCQkJCSAgICAgICgweDNiIDw8IEFDX0FNUENBUF9OVU1fU1RFUFNfU0hJRlQpIHwKIAkJCQkgICAgICAoMHgwMyA8PCBBQ19BTVBDQVBfU1RFUF9TSVpFX1NISUZUKSB8CiAJCQkJICAgICAgKDAgPDwgQUNfQU1QQ0FQX01VVEVfU0hJRlQpKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgImhkYV9jb2RlYzogZmFpbGVkIHRvIG92ZXJyaWRlIGFtcCBjYXBzIGZvciBOSUQgMHgyXG4iKTsKKwkJY29kZWNfd2Fybihjb2RlYywgImZhaWxlZCB0byBvdmVycmlkZSBhbXAgY2FwcyBmb3IgTklEIDB4MlxuIik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9jaG1hcF9lbGVtIGFzdXNfcGNtXzJfMV9jaG1hcHNbXSA9IHsKQEAgLTQ5NDIsOCArNTIxOCw1NCBAQAogCX0KIH0KIAorLyogdHVybiBvbi9vZmYgbXV0ZSBMRUQgcGVyIHZtYXN0ZXIgaG9vayAqLworc3RhdGljIHZvaWQgYWxjNjYyX2xlZF9ncGlvMV9tdXRlX2hvb2sodm9pZCAqcHJpdmF0ZV9kYXRhLCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwl1bnNpZ25lZCBpbnQgb2xkdmFsID0gc3BlYy0+Z3Bpb19sZWQ7CisKKwlpZiAoZW5hYmxlZCkKKwkJc3BlYy0+Z3Bpb19sZWQgJj0gfjB4MDE7CisJZWxzZQorCQlzcGVjLT5ncGlvX2xlZCB8PSAweDAxOworCWlmIChzcGVjLT5ncGlvX2xlZCAhPSBvbGR2YWwpCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MDEsIDAsIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwKKwkJCQkgICAgc3BlYy0+Z3Bpb19sZWQpOworfQorCisvKiBhdm9pZCBEMyBmb3Iga2VlcGluZyBHUElPIHVwICovCitzdGF0aWMgdW5zaWduZWQgaW50IGdwaW9fbGVkX3Bvd2VyX2ZpbHRlcihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICBoZGFfbmlkX3QgbmlkLAorCQkJCQkgIHVuc2lnbmVkIGludCBwb3dlcl9zdGF0ZSkKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpZiAobmlkID09IGNvZGVjLT5hZmcgJiYgcG93ZXJfc3RhdGUgPT0gQUNfUFdSU1RfRDMgJiYgc3BlYy0+Z3Bpb19sZWQpCisJCXJldHVybiBBQ19QV1JTVF9EMDsKKwlyZXR1cm4gcG93ZXJfc3RhdGU7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzY2Ml9maXh1cF9sZWRfZ3BpbzEoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgY29uc3Qgc3RydWN0IGhkYV9maXh1cCAqZml4LCBpbnQgYWN0aW9uKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgZ3Bpb19pbml0W10gPSB7CisJCXsgMHgwMSwgQUNfVkVSQl9TRVRfR1BJT19NQVNLLCAweDAxIH0sCisJCXsgMHgwMSwgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIDB4MDEgfSwKKwkJe30KKwl9OworCisJaWYgKGFjdGlvbiA9PSBIREFfRklYVVBfQUNUX1BSRV9QUk9CRSkgeworCQlzcGVjLT5nZW4udm1hc3Rlcl9tdXRlLmhvb2sgPSBhbGM2NjJfbGVkX2dwaW8xX211dGVfaG9vazsKKwkJc3BlYy0+Z3Bpb19sZWQgPSAwOworCQlzbmRfaGRhX2FkZF92ZXJicyhjb2RlYywgZ3Bpb19pbml0KTsKKwkJY29kZWMtPnBvd2VyX2ZpbHRlciA9IGdwaW9fbGVkX3Bvd2VyX2ZpbHRlcjsKKwl9Cit9CisKIGVudW0gewogCUFMQzY2Ml9GSVhVUF9BU1BJUkUsCisJQUxDNjYyX0ZJWFVQX0xFRF9HUElPMSwKIAlBTEM2NjJfRklYVVBfSURFQVBBRCwKIAlBTEMyNzJfRklYVVBfTUFSSU8sCiAJQUxDNjYyX0ZJWFVQX0NaQ19QMTBULApAQCAtNDk2Miw5ICs1Mjg0LDEwIEBACiAJQUxDNjYyX0ZJWFVQX0lOVl9ETUlDLAogCUFMQzY2OF9GSVhVUF9ERUxMX01JQ19OT19QUkVTRU5DRSwKIAlBTEM2NjhfRklYVVBfSEVBRFNFVF9NT0RFLAotCUFMQzY2Ml9GSVhVUF9CQVNTX0NITUFQLAorCUFMQzY2Ml9GSVhVUF9CQVNTX01PREU0X0NITUFQLAorCUFMQzY2Ml9GSVhVUF9CQVNTXzE2LAogCUFMQzY2Ml9GSVhVUF9CQVNTXzFBLAotCUFMQzY2Ml9GSVhVUF9CQVNTXzFBX0NITUFQLAorCUFMQzY2Ml9GSVhVUF9CQVNTX0NITUFQLAogCUFMQzY2OF9GSVhVUF9BVVRPX01VVEUsCiB9OwogCkBAIC00OTc2LDEyICs1Mjk5LDE4IEBACiAJCQl7IH0KIAkJfQogCX0sCisJW0FMQzY2Ml9GSVhVUF9MRURfR1BJTzFdID0geworCQkudHlwZSA9IEhEQV9GSVhVUF9GVU5DLAorCQkudi5mdW5jID0gYWxjNjYyX2ZpeHVwX2xlZF9ncGlvMSwKKwl9LAogCVtBTEM2NjJfRklYVVBfSURFQVBBRF0gPSB7CiAJCS50eXBlID0gSERBX0ZJWFVQX1BJTlMsCiAJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGhkYV9waW50YmxbXSkgewogCQkJeyAweDE3LCAweDk5MTMwMTEyIH0sIC8qIHN1Yndvb2ZlciAqLwogCQkJeyB9Ci0JCX0KKwkJfSwKKwkJLmNoYWluZWQgPSB0cnVlLAorCQkuY2hhaW5faWQgPSBBTEM2NjJfRklYVVBfTEVEX0dQSU8xLAogCX0sCiAJW0FMQzI3Ml9GSVhVUF9NQVJJT10gPSB7CiAJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCkBAIC01MTQ2LDI0ICs1NDc1LDMzIEBACiAJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCiAJCS52LmZ1bmMgPSBhbGNfZml4dXBfaGVhZHNldF9tb2RlX2FsYzY2OCwKIAl9LAotCVtBTEM2NjJfRklYVVBfQkFTU19DSE1BUF0gPSB7CisJW0FMQzY2Ml9GSVhVUF9CQVNTX01PREU0X0NITUFQXSA9IHsKIAkJLnR5cGUgPSBIREFfRklYVVBfRlVOQywKIAkJLnYuZnVuYyA9IGFsY19maXh1cF9iYXNzX2NobWFwLAogCQkuY2hhaW5lZCA9IHRydWUsCiAJCS5jaGFpbl9pZCA9IEFMQzY2Ml9GSVhVUF9BU1VTX01PREU0CiAJfSwKKwlbQUxDNjYyX0ZJWFVQX0JBU1NfMTZdID0geworCQkudHlwZSA9IEhEQV9GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBoZGFfcGludGJsW10pIHsKKwkJCXsweDE2LCAweDgwMTA2MTExfSwgLyogYmFzcyBzcGVha2VyICovCisJCQl7fQorCQl9LAorCQkuY2hhaW5lZCA9IHRydWUsCisJCS5jaGFpbl9pZCA9IEFMQzY2Ml9GSVhVUF9CQVNTX0NITUFQLAorCX0sCiAJW0FMQzY2Ml9GSVhVUF9CQVNTXzFBXSA9IHsKIAkJLnR5cGUgPSBIREFfRklYVVBfUElOUywKIAkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgaGRhX3BpbnRibFtdKSB7CiAJCQl7MHgxYSwgMHg4MDEwNjExMX0sIC8qIGJhc3Mgc3BlYWtlciAqLwogCQkJe30KIAkJfSwKKwkJLmNoYWluZWQgPSB0cnVlLAorCQkuY2hhaW5faWQgPSBBTEM2NjJfRklYVVBfQkFTU19DSE1BUCwKIAl9LAotCVtBTEM2NjJfRklYVVBfQkFTU18xQV9DSE1BUF0gPSB7CisJW0FMQzY2Ml9GSVhVUF9CQVNTX0NITUFQXSA9IHsKIAkJLnR5cGUgPSBIREFfRklYVVBfRlVOQywKIAkJLnYuZnVuYyA9IGFsY19maXh1cF9iYXNzX2NobWFwLAotCQkuY2hhaW5lZCA9IHRydWUsCi0JCS5jaGFpbl9pZCA9IEFMQzY2Ml9GSVhVUF9CQVNTXzFBLAogCX0sCiB9OwogCkBAIC01MTg1LDkgKzU1MjMsMTEgQEAKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNjI4LCAiRGVsbCIsIEFMQzY2OF9GSVhVUF9BVVRPX01VVEUpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2NGUsICJEZWxsIiwgQUxDNjY4X0ZJWFVQX0FVVE9fTVVURSksCiAJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MTYzMiwgIkhQIFJQNTgwMCIsIEFMQzY2Ml9GSVhVUF9IUF9SUDU4MDApLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExY2QsICJBc3VzIE41NTAiLCBBTEM2NjJfRklYVVBfQkFTU18xQV9DSE1BUCksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQ3NywgIkFTVVMgTjU2VloiLCBBTEM2NjJfRklYVVBfQkFTU19DSE1BUCksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MWJmMywgIkFTVVMgTjc2VloiLCBBTEM2NjJfRklYVVBfQkFTU19DSE1BUCksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTFjZCwgIkFzdXMgTjU1MCIsIEFMQzY2Ml9GSVhVUF9CQVNTXzFBKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNDc3LCAiQVNVUyBONTZWWiIsIEFMQzY2Ml9GSVhVUF9CQVNTX01PREU0X0NITUFQKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNWE3LCAiQVNVUyBVWDUxVlpIIiwgQUxDNjYyX0ZJWFVQX0JBU1NfMTYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDFiNzMsICJBU1VTIE41NVNGIiwgQUxDNjYyX0ZJWFVQX0JBU1NfMTYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDFiZjMsICJBU1VTIE43NlZaIiwgQUxDNjYyX0ZJWFVQX0JBU1NfTU9ERTRfQ0hNQVApLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDg0NjksICJBU1VTIG1vYm8iLCBBTEM2NjJfRklYVVBfTk9fSkFDS19ERVRFQ1QpLAogCVNORF9QQ0lfUVVJUksoMHgxMDViLCAweDBjZDYsICJGb3hjb25uIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAogCVNORF9QQ0lfUVVJUksoMHgxNDRkLCAweGMwNTEsICJTYW1zdW5nIFI3MjAiLCBBTEM2NjJfRklYVVBfSURFQVBBRCksCkBAIC01MzI4LDcgKzU2NjgsNyBAQAogCQlzcGVjLT5nZW4uYmVlcF9uaWQgPSAweDAxOwogCiAJaWYgKChhbGNfZ2V0X2NvZWYwKGNvZGVjKSAmICgxIDw8IDE0KSkgJiYKLQkgICAgY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTAyNSAmJgorCSAgICBjb2RlYy0+YnVzLT5wY2kgJiYgY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTAyNSAmJgogCSAgICBzcGVjLT5jZGVmaW5lLnBsYXRmb3JtX3R5cGUgPT0gMSkgewogCQllcnIgPSBhbGNfY29kZWNfcmVuYW1lKGNvZGVjLCAiQUxDMjcyWCIpOwogCQlpZiAoZXJyIDwgMCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2kzMDU0LmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpMzA1NC5jCmluZGV4IDY2NzlhNTAuLjMyMDhhZDY5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpMzA1NC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2kzMDU0LmMKQEAgLTIzNiw3ICsyMzYsNyBAQAogCX0gd2hpbGUgKCh2YWwgJiBTSTMwNTRfTUVJX1JFQURZKSAhPSBTSTMwNTRfTUVJX1JFQURZICYmIHdhaXRfY291bnQtLSk7CiAKIAlpZigodmFsJlNJMzA1NF9NRUlfUkVBRFkpICE9IFNJMzA1NF9NRUlfUkVBRFkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic2kzMDU0OiBjYW5ub3QgaW5pdGlhbGl6ZS4gRVhUIE1JRCA9ICUwNHhcbiIsIHZhbCk7CisJCWNvZGVjX2Vycihjb2RlYywgInNpMzA1NDogY2Fubm90IGluaXRpYWxpemUuIEVYVCBNSUQgPSAlMDR4XG4iLCB2YWwpOwogCQkvKiBsZXQncyBwcmF5IHRoYXQgdGhpcyBpcyBubyBmYXRhbCBlcnJvciAqLwogCQkvKiByZXR1cm4gLUVBQ0NFUzsgKi8KIAl9CkBAIC0yNDcsNyArMjQ3LDggQEAKIAlTRVRfUkVHKGNvZGVjLCBTSTMwNTRfTElORV9DRkcxLDB4MjAwKTsKIAogCWlmKChHRVRfUkVHKGNvZGVjLFNJMzA1NF9MSU5FX1NUQVRVUykgJiAoMTw8NikpID09IDApIHsKLQkJc25kX3ByaW50ZCgiTGluayBGcmFtZSBEZXRlY3QoRkRUKSBpcyBub3QgcmVhZHkgKGxpbmUgc3RhdHVzOiAlMDR4KVxuIiwKKwkJY29kZWNfZGJnKGNvZGVjLAorCQkJICAiTGluayBGcmFtZSBEZXRlY3QoRkRUKSBpcyBub3QgcmVhZHkgKGxpbmUgc3RhdHVzOiAlMDR4KVxuIiwKIAkJCQlHRVRfUkVHKGNvZGVjLFNJMzA1NF9MSU5FX1NUQVRVUykpOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCmluZGV4IDNiYzI5YzkuLjc1NTE1YjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKQEAgLTI5Niw3ICsyOTYsNyBAQAogewogCXVuc2lnbmVkIGludCBncGlvc3RhdGUsIGdwaW9tYXNrLCBncGlvZGlyOwogCi0Jc25kX3ByaW50ZGQoIiVzIG1zayAleCBkaXIgJXggZ3BpbyAleFxuIiwgX19mdW5jX18sIG1hc2ssIGRpcl9tYXNrLCBkYXRhKTsKKwljb2RlY19kYmcoY29kZWMsICIlcyBtc2sgJXggZGlyICV4IGdwaW8gJXhcbiIsIF9fZnVuY19fLCBtYXNrLCBkaXJfbWFzaywgZGF0YSk7CiAKIAlncGlvc3RhdGUgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsIDAsCiAJCQkJICAgICAgIEFDX1ZFUkJfR0VUX0dQSU9fREFUQSwgMCk7CkBAIC0zNTksNyArMzU5LDcgQEAKIHsKIAlpbnQgZXJyb3IsIHBpbmN0bDsKIAotCXNuZF9wcmludGRkKCIlcywgbmlkICV4IGN0bCAleFxuIiwgX19mdW5jX18sIG5pZCwgbmV3X3ZyZWYpOworCWNvZGVjX2RiZyhjb2RlYywgIiVzLCBuaWQgJXggY3RsICV4XG4iLCBfX2Z1bmNfXywgbmlkLCBuZXdfdnJlZik7CiAJcGluY3RsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCiAJCQkJQUNfVkVSQl9HRVRfUElOX1dJREdFVF9DT05UUk9MLCAwKTsKIApAQCAtMjA4Niw5ICsyMDg2LDEyIEBACiAJfQogCiAJaWYgKGZpbmRfbXV0ZV9sZWRfY2ZnKGNvZGVjLCBzcGVjLT5kZWZhdWx0X3BvbGFyaXR5KSkKLQkJc25kX3ByaW50ZCgibXV0ZSBMRUQgZ3BpbyAlZCBwb2xhcml0eSAlZFxuIiwKKwkJY29kZWNfZGJnKGNvZGVjLCAibXV0ZSBMRUQgZ3BpbyAlZCBwb2xhcml0eSAlZFxuIiwKIAkJCQlzcGVjLT5ncGlvX2xlZCwKIAkJCQlzcGVjLT5ncGlvX2xlZF9wb2xhcml0eSk7CisKKwkvKiBhbGxvdyBhdXRvLXN3aXRjaGluZyBvZiBkb2NrIGxpbmUtaW4gKi8KKwlzcGVjLT5nZW4ubGluZV9pbl9hdXRvX3N3aXRjaCA9IHRydWU7CiB9CiAKIHN0YXRpYyB2b2lkIHN0YWM5MmhkODN4eHhfZml4dXBfaHBfemVwaHlyKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLApAQCAtMzA3Nyw3ICszMDgwLDcgQEAKIAl9CiAKIAlpZiAoZmluZF9tdXRlX2xlZF9jZmcoY29kZWMsIDEpKQotCQlzbmRfcHJpbnRkKCJtdXRlIExFRCBncGlvICVkIHBvbGFyaXR5ICVkXG4iLAorCQljb2RlY19kYmcoY29kZWMsICJtdXRlIExFRCBncGlvICVkIHBvbGFyaXR5ICVkXG4iLAogCQkJCXNwZWMtPmdwaW9fbGVkLAogCQkJCXNwZWMtPmdwaW9fbGVkX3BvbGFyaXR5KTsKIApAQCAtNDQyMiw4ICs0NDI1LDggQEAKIAogCW51bV9kYWNzID0gc25kX2hkYV9nZXRfbnVtX2Nvbm5zKGNvZGVjLCAweDBhKSAtIDE7CiAJaWYgKG51bV9kYWNzIDwgMyB8fCBudW1fZGFjcyA+IDUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGRhX2NvZGVjOiBDb3VsZCBub3QgZGV0ZXJtaW5lICIKLQkJICAgICAgICJudW1iZXIgb2YgY2hhbm5lbHMgZGVmYXVsdGluZyB0byBEQUMgY291bnRcbiIpOworCQljb2RlY193YXJuKGNvZGVjLAorCQkJICAgIkNvdWxkIG5vdCBkZXRlcm1pbmUgbnVtYmVyIG9mIGNoYW5uZWxzIGRlZmF1bHRpbmcgdG8gREFDIGNvdW50XG4iKTsKIAkJbnVtX2RhY3MgPSA1OwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfdmlhLmMKaW5kZXggZjg0MTk1Zi4uNzc4MTY2MiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jCkBAIC00NjUsMTQgKzQ2NSw4IEBACiAKIHN0YXRpYyB2b2lkIHZpYV9mcmVlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewotCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0JaWYgKCFzcGVjKQotCQlyZXR1cm47Ci0KIAl2dDE3MDhfc3RvcF9ocF93b3JrKGNvZGVjKTsKLQlzbmRfaGRhX2dlbl9zcGVjX2ZyZWUoJnNwZWMtPmdlbik7Ci0Ja2ZyZWUoc3BlYyk7CisJc25kX2hkYV9nZW5fZnJlZShjb2RlYyk7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvdGhpbmtwYWRfaGVscGVyLmMgYi9zb3VuZC9wY2kvaGRhL3RoaW5rcGFkX2hlbHBlci5jCmluZGV4IDhmZTNiOGMuLjZiYTBiNTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvdGhpbmtwYWRfaGVscGVyLmMKKysrIGIvc291bmQvcGNpL2hkYS90aGlua3BhZF9oZWxwZXIuYwpAQCAtNjMsNyArNjMsOCBAQAogCQlpZiAoIWxlZF9zZXRfZnVuYykKIAkJCWxlZF9zZXRfZnVuYyA9IHN5bWJvbF9yZXF1ZXN0KHRwYWNwaV9sZWRfc2V0KTsKIAkJaWYgKCFsZWRfc2V0X2Z1bmMpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gZmluZCB0aGlua3BhZC1hY3BpIHN5bWJvbCB0cGFjcGlfbGVkX3NldFxuIik7CisJCQljb2RlY193YXJuKGNvZGVjLAorCQkJCSAgICJGYWlsZWQgdG8gZmluZCB0aGlua3BhZC1hY3BpIHN5bWJvbCB0cGFjcGlfbGVkX3NldFxuIik7CiAJCQlyZXR1cm47CiAJCX0KIApAQCAtNzUsNyArNzYsOCBAQAogCQl9CiAJCWlmIChsZWRfc2V0X2Z1bmMoVFBBQ1BJX0xFRF9NSUNNVVRFLCBmYWxzZSkgPj0gMCkgewogCQkJaWYgKHNwZWMtPm51bV9hZGNfbmlkcyA+IDEpCi0JCQkJc25kX3ByaW50ZGQoIlNraXBwaW5nIG1pY211dGUgTEVEIGNvbnRyb2wgZHVlIHRvIHNldmVyYWwgQURDcyIpOworCQkJCWNvZGVjX2RiZyhjb2RlYywKKwkJCQkJICAiU2tpcHBpbmcgbWljbXV0ZSBMRUQgY29udHJvbCBkdWUgdG8gc2V2ZXJhbCBBRENzIik7CiAJCQllbHNlIHsKIAkJCQlzcGVjLT5jYXBfc3luY19ob29rID0gdXBkYXRlX3RwYWNwaV9taWNtdXRlX2xlZDsKIAkJCQlyZW1vdmVmdW5jID0gZmFsc2U7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9hdXJlb24uYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5jCmluZGV4IDU1OTAyZWMuLjNiM2NmNGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5jCkBAIC0xOTM3LDkgKzE5MzcsMTIgQEAKIAkJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOwogCQlpZCA9IGF1cmVvbl9jczg0MTVfZ2V0KGljZSwgQ1M4NDE1X0lEKTsKIAkJaWYgKGlkICE9IDB4NDEpCi0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiTm8gQ1M4NDE1IGNoaXAuIFNraXBwaW5nIENTODQxNSBjb250cm9scy5cbiIpOworCQkJZGV2X2luZm8oaWNlLT5jYXJkLT5kZXYsCisJCQkJICJObyBDUzg0MTUgY2hpcC4gU2tpcHBpbmcgQ1M4NDE1IGNvbnRyb2xzLlxuIik7CiAJCWVsc2UgaWYgKChpZCAmIDB4MEYpICE9IDB4MDEpCi0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiRGV0ZWN0ZWQgdW5zdXBwb3J0ZWQgQ1M4NDE1IHJldi4gKCVjKVxuIiwgKGNoYXIpKChpZCAmIDB4MEYpICsgJ0EnIC0gMSkpOworCQkJZGV2X2luZm8oaWNlLT5jYXJkLT5kZXYsCisJCQkJICJEZXRlY3RlZCB1bnN1cHBvcnRlZCBDUzg0MTUgcmV2LiAoJWMpXG4iLAorCQkJCSAoY2hhcikoKGlkICYgMHgwRikgKyAnQScgLSAxKSk7CiAJCWVsc2UgewogCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3M4NDE1X2NvbnRyb2xzKTsgaSsrKSB7CiAJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5jCmluZGV4IDllMjhjYzEuLmVkMjE0NGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuYwpAQCAtNDI1LDcgKzQyNSw4IEBACiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAKIAlpZiAoc25kX2kyY19zZW5kYnl0ZXMoaWNlLT5jczg0MjcsICZyZWcsIDEpICE9IDEpCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBzZW5kIHJlZ2lzdGVyIDB4JXggYnl0ZSB0byBDUzg0MjdcbiIsIHJlZyk7CisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsCisJCQkidW5hYmxlIHRvIHNlbmQgcmVnaXN0ZXIgMHgleCBieXRlIHRvIENTODQyN1xuIiwgcmVnKTsKIAlzbmRfaTJjX3JlYWRieXRlcyhpY2UtPmNzODQyNywgJnJlZywgMSk7CiAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAocmVnICYgQ1M4NDI3X1VOTE9DSykgPyAxIDogMDsKIAlyZXR1cm4gMDsKQEAgLTU3NSw2ICs1NzYsMzAgQEAKIAkubWFza19mbGFncyA9IDAsCiB9OwogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX2RlbHRhX3Jlc3VtZShzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGFrbV9iYWNrdXBbQUs0WFhYX0lNQUdFX1NJWkVdOworCS8qIGluaXQgY29kZWMgYW5kIHJlc3RvcmUgcmVnaXN0ZXJzICovCisJaWYgKGljZS0+YWttX2NvZGVjcykgeworCQltZW1jcHkoYWttX2JhY2t1cCwgaWNlLT5ha20tPmltYWdlcywgc2l6ZW9mKGFrbV9iYWNrdXApKTsKKwkJc25kX2FrbTR4eHhfaW5pdChpY2UtPmFrbSk7CisJCW1lbWNweShpY2UtPmFrbS0+aW1hZ2VzLCBha21fYmFja3VwLCBzaXplb2YoYWttX2JhY2t1cCkpOworCQlzbmRfYWttNHh4eF9yZXNldChpY2UtPmFrbSwgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfZGVsdGFfc3VzcGVuZChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKK3sKKwlpZiAoaWNlLT5ha21fY29kZWNzKSAvKiByZXNldCAmIG11dGUgY29kZWMgKi8KKwkJc25kX2FrbTR4eHhfcmVzZXQoaWNlLT5ha20sIDEpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogc3RhdGljIGludCBzbmRfaWNlMTcxMl9kZWx0YV9pbml0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewogCWludCBlcnI7CkBAIC02MjEsNyArNjQ2LDExIEBACiAJCWljZS0+bnVtX3RvdGFsX2FkY3MgPSA0OwogCQlicmVhazsKIAl9Ci0KKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKKwlpY2UtPnBtX3Jlc3VtZSA9IHNuZF9pY2UxNzEyX2RlbHRhX3Jlc3VtZTsKKwlpY2UtPnBtX3N1c3BlbmQgPSBzbmRfaWNlMTcxMl9kZWx0YV9zdXNwZW5kOworCWljZS0+cG1fc3VzcGVuZF9lbmFibGVkID0gMTsKKyNlbmRpZgogCS8qIGluaXRpYWxpemUgdGhlIFNQSSBjbG9jayB0byBoaWdoICovCiAJdG1wID0gc25kX2ljZTE3MTJfcmVhZChpY2UsIElDRTE3MTJfSVJFR19HUElPX0RBVEEpOwogCXRtcCB8PSBJQ0UxNzEyX0RFTFRBX0FQX0NDTEs7CkBAIC02MzcsNyArNjY2LDcgQEAKIAljYXNlIElDRTE3MTJfU1VCREVWSUNFX1ZYNDQyOgogCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEE2NkU6CiAJCWlmICgoZXJyID0gc25kX2kyY19idXNfY3JlYXRlKGljZS0+Y2FyZCwgIklDRTE3MTIgR1BJTyAxIiwgTlVMTCwgJmljZS0+aTJjKSkgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gY3JlYXRlIEkyQyBidXNcbiIpOworCQkJZGV2X2VycihpY2UtPmNhcmQtPmRldiwgInVuYWJsZSB0byBjcmVhdGUgSTJDIGJ1c1xuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCWljZS0+aTJjLT5wcml2YXRlX2RhdGEgPSBpY2U7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9ld3MuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jCmluZGV4IGJjMmU3MDEuLjgxN2ExYmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jCkBAIC0xNjMsNyArMTYzLDggQEAKIAogICAgICBfX2Vycm9yOgogCXNuZF9pMmNfdW5sb2NrKGljZS0+aTJjKTsKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBSzQ1MjQgY2hpcCBzZWxlY3QgZmFpbGVkLCBjaGVjayBjYWJsZSB0byB0aGUgZnJvbnQgbW9kdWxlXG4iKTsKKwlkZXZfZXJyKGljZS0+Y2FyZC0+ZGV2LAorCQkiQUs0NTI0IGNoaXAgc2VsZWN0IGZhaWxlZCwgY2hlY2sgY2FibGUgdG8gdGhlIGZyb250IG1vZHVsZVxuIik7CiAJcmV0dXJuIC1FSU87CiB9CiAKQEAgLTE3NCw3ICsxNzUsNyBAQAogCXVuc2lnbmVkIGNoYXIgdG1wOwogCS8qIGFzc2VydCBBSzQ1MjQgQ1MgKi8KIAlpZiAoc25kX2ljZTE3MTJfZXdzODhtdF9jaGlwX3NlbGVjdChpY2UsIH4oMSA8PCBjaGlwKSAmIDB4MGYpIDwgMCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZmF0YWwgZXJyb3IgKGV3czg4bXQgY2hpcCBzZWxlY3QpXG4iKTsKKwkJZGV2X2VycihpY2UtPmNhcmQtPmRldiwgImZhdGFsIGVycm9yIChld3M4OG10IGNoaXAgc2VsZWN0KVxuIik7CiAJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOwogCXRtcCA9IElDRTE3MTJfRVdTODhfU0VSSUFMX0RBVEEgfAogCQlJQ0UxNzEyX0VXUzg4X1NFUklBTF9DTE9DSyB8CkBAIC00NTYsNyArNDU3LDcgQEAKIAogCS8qIGNyZWF0ZSBpMmMgKi8KIAlpZiAoKGVyciA9IHNuZF9pMmNfYnVzX2NyZWF0ZShpY2UtPmNhcmQsICJJQ0UxNzEyIEdQSU8gMSIsIE5VTEwsICZpY2UtPmkyYykpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gY3JlYXRlIEkyQyBidXNcbiIpOworCQlkZXZfZXJyKGljZS0+Y2FyZC0+ZGV2LCAidW5hYmxlIHRvIGNyZWF0ZSBJMkMgYnVzXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJaWNlLT5pMmMtPnByaXZhdGVfZGF0YSA9IGljZTsKQEAgLTQ2OSw3ICs0NzAsOCBAQAogCQkJCQkgICAgSUNFMTcxMl82RklSRV9QQ0Y5NTU0X0FERFIsCiAJCQkJCSAgICAmc3BlYy0+aTJjZGV2c1tFV1NfSTJDXzZGSVJFXSk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJQQ0Y5NTU0IGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJCQlkZXZfZXJyKGljZS0+Y2FyZC0+ZGV2LAorCQkJCSJQQ0Y5NTU0IGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCXNuZF9pY2UxNzEyXzZmaXJlX3dyaXRlX3BjYShpY2UsIFBDRjk1NTRfUkVHX0NPTkZJRywgMHg4MCk7CkBAIC04MzQsNyArODM2LDcgQEAKIAlieXRlID0gMDsKIAlpZiAoc25kX2kyY19yZWFkYnl0ZXMoc3BlYy0+aTJjZGV2c1tFV1NfSTJDXzZGSVJFXSwgJmJ5dGUsIDEpICE9IDEpIHsKIAkJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOwotCQlwcmludGsoS0VSTl9FUlIgImNhbm5vdCByZWFkIHBjYVxuIik7CisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsICJjYW5ub3QgcmVhZCBwY2FcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jCmluZGV4IDI4ZWM4NzIuLjI5MTY3MmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMKQEAgLTM5NCw3ICszOTQsNyBAQAogCWVyciA9IHNuZF9jczg0MjdfY3JlYXRlKGljZS0+aTJjLCBhZGRyLAogCQkoaWNlLT5jczg0MjdfdGltZW91dCAqIEhaKSAvIDEwMDAsICZpY2UtPmNzODQyNyk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ1M4NDI3IGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsICJDUzg0MjcgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJaWNlLT5zcGRpZi5vcHMub3BlbiA9IG9wZW5fY3M4NDI3OwpAQCAtNDY3LDcgKzQ2Nyw3IEBACiAJCQl1MTYgcGJrc3RhdHVzOwogCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CiAJCQlwYmtzdGF0dXMgPSBpbncoSUNFRFMoaWNlLCBJTlRTVEFUKSk7Ci0JCQkvKiBwcmludGsoS0VSTl9ERUJVRyAicGJrc3RhdHVzID0gMHgleFxuIiwgcGJrc3RhdHVzKTsgKi8KKwkJCS8qIGRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJwYmtzdGF0dXMgPSAweCV4XG4iLCBwYmtzdGF0dXMpOyAqLwogCQkJZm9yIChpZHggPSAwOyBpZHggPCA2OyBpZHgrKykgewogCQkJCWlmICgocGJrc3RhdHVzICYgKDMgPDwgKGlkeCAqIDIpKSkgPT0gMCkKIAkJCQkJY29udGludWU7CkBAIC05MDMsNyArOTAzLDggQEAKIAlpZiAocnBjbSkKIAkJKnJwY20gPSBwY207CiAKLQlwcmludGsoS0VSTl9XQVJOSU5HICJDb25zdW1lciBQQ00gY29kZSBkb2VzIG5vdCB3b3JrIHdlbGwgYXQgdGhlIG1vbWVudCAtLWprXG4iKTsKKwlkZXZfd2FybihpY2UtPmNhcmQtPmRldiwKKwkJICJDb25zdW1lciBQQ00gY29kZSBkb2VzIG5vdCB3b3JrIHdlbGwgYXQgdGhlIG1vbWVudCAtLWprXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTUzNCw3ICsxNTM1LDggQEAKIAkJYWM5Ny5wcml2YXRlX2ZyZWUgPSBzbmRfaWNlMTcxMl9taXhlcl9mcmVlX2FjOTc7CiAJCWVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmaWNlLT5hYzk3KTsKIAkJaWYgKGVyciA8IDApCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJpY2UxNzEyOiBjYW5ub3QgaW5pdGlhbGl6ZSBhYzk3IGZvciBjb25zdW1lciwgc2tpcHBlZFxuIik7CisJCQlkZXZfd2FybihpY2UtPmNhcmQtPmRldiwKKwkJCQkgImNhbm5vdCBpbml0aWFsaXplIGFjOTcgZm9yIGNvbnN1bWVyLCBza2lwcGVkXG4iKTsKIAkJZWxzZSB7CiAJCQllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2ljZTE3MTJfbWl4ZXJfZGlnbWl4X3JvdXRlX2FjOTcsIGljZSkpOwogCQkJaWYgKGVyciA8IDApCkBAIC0xNTUyLDcgKzE1NTQsOCBAQAogCQlhYzk3LnByaXZhdGVfZnJlZSA9IHNuZF9pY2UxNzEyX21peGVyX2ZyZWVfYWM5NzsKIAkJZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZpY2UtPmFjOTcpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImljZTE3MTI6IGNhbm5vdCBpbml0aWFsaXplIHBybyBhYzk3LCBza2lwcGVkXG4iKTsKKwkJCWRldl93YXJuKGljZS0+Y2FyZC0+ZGV2LAorCQkJCSAiY2Fubm90IGluaXRpYWxpemUgcHJvIGFjOTcsIHNraXBwZWRcbiIpOwogCQllbHNlCiAJCQlyZXR1cm4gMDsKIAl9CkBAIC0yMzMyLDcgKzIzMzUsOCBAQAogCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoaWNlLT5wY2ksIFBDSV9TVUJTWVNURU1fSUQsICZkZXZpY2UpOwogCQkJaWNlLT5lZXByb20uc3VidmVuZG9yID0gKCh1bnNpZ25lZCBpbnQpc3dhYjE2KHZlbmRvcikgPDwgMTYpIHwgc3dhYjE2KGRldmljZSk7CiAJCQlpZiAoaWNlLT5lZXByb20uc3VidmVuZG9yID09IDAgfHwgaWNlLT5lZXByb20uc3VidmVuZG9yID09ICh1bnNpZ25lZCBpbnQpLTEpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImljZTE3MTI6IE5vIHZhbGlkIElEIGlzIGZvdW5kXG4iKTsKKwkJCQlkZXZfZXJyKGljZS0+Y2FyZC0+ZGV2LAorCQkJCQkiTm8gdmFsaWQgSUQgaXMgZm91bmRcbiIpOwogCQkJCXJldHVybiAtRU5YSU87CiAJCQl9CiAJCX0KQEAgLTIzNDAsMjEgKzIzNDQsMjIgQEAKIAlmb3IgKHRibCA9IGNhcmRfdGFibGVzOyAqdGJsOyB0YmwrKykgewogCQlmb3IgKGMgPSAqdGJsOyBjLT5zdWJ2ZW5kb3I7IGMrKykgewogCQkJaWYgKG1vZGVsbmFtZSAmJiBjLT5tb2RlbCAmJiAhc3RyY21wKG1vZGVsbmFtZSwgYy0+bW9kZWwpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWNlMTcxMjogVXNpbmcgYm9hcmQgbW9kZWwgJXNcbiIsIGMtPm5hbWUpOworCQkJCWRldl9pbmZvKGljZS0+Y2FyZC0+ZGV2LAorCQkJCQkgIlVzaW5nIGJvYXJkIG1vZGVsICVzXG4iLCBjLT5uYW1lKTsKIAkJCQlpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPSBjLT5zdWJ2ZW5kb3I7CiAJCQl9IGVsc2UgaWYgKGMtPnN1YnZlbmRvciAhPSBpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpCiAJCQkJY29udGludWU7CiAJCQlpZiAoIWMtPmVlcHJvbV9zaXplIHx8ICFjLT5lZXByb21fZGF0YSkKIAkJCQlnb3RvIGZvdW5kOwogCQkJLyogaWYgdGhlIEVFUFJPTSBpcyBnaXZlbiBieSB0aGUgZHJpdmVyLCB1c2UgaXQgKi8KLQkJCXNuZF9wcmludGRkKCJ1c2luZyB0aGUgZGVmaW5lZCBlZXByb20uLlxuIik7CisJCQlkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAidXNpbmcgdGhlIGRlZmluZWQgZWVwcm9tLi5cbiIpOwogCQkJaWNlLT5lZXByb20udmVyc2lvbiA9IDE7CiAJCQlpY2UtPmVlcHJvbS5zaXplID0gYy0+ZWVwcm9tX3NpemUgKyA2OwogCQkJbWVtY3B5KGljZS0+ZWVwcm9tLmRhdGEsIGMtPmVlcHJvbV9kYXRhLCBjLT5lZXByb21fc2l6ZSk7CiAJCQlnb3RvIHJlYWRfc2tpcHBlZDsKIAkJfQogCX0KLQlwcmludGsoS0VSTl9XQVJOSU5HICJpY2UxNzEyOiBObyBtYXRjaGluZyBtb2RlbCBmb3VuZCBmb3IgSUQgMHgleFxuIiwKKwlkZXZfd2FybihpY2UtPmNhcmQtPmRldiwgIk5vIG1hdGNoaW5nIG1vZGVsIGZvdW5kIGZvciBJRCAweCV4XG4iLAogCSAgICAgICBpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpOwogCiAgZm91bmQ6CkBAIC0yMzYyLDEyICsyMzY3LDEzIEBACiAJaWYgKGljZS0+ZWVwcm9tLnNpemUgPCA2KQogCQlpY2UtPmVlcHJvbS5zaXplID0gMzI7IC8qIEZJWE1FOiBhbnkgY2FyZHMgd2l0aG91dCB0aGUgY29ycmVjdCBzaXplPyAqLwogCWVsc2UgaWYgKGljZS0+ZWVwcm9tLnNpemUgPiAzMikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnZhbGlkIEVFUFJPTSAoc2l6ZSA9ICVpKVxuIiwgaWNlLT5lZXByb20uc2l6ZSk7CisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsCisJCQkiaW52YWxpZCBFRVBST00gKHNpemUgPSAlaSlcbiIsIGljZS0+ZWVwcm9tLnNpemUpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJaWNlLT5lZXByb20udmVyc2lvbiA9IHNuZF9pY2UxNzEyX3JlYWRfaTJjKGljZSwgZGV2LCAweDA1KTsKIAlpZiAoaWNlLT5lZXByb20udmVyc2lvbiAhPSAxKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgRUVQUk9NIHZlcnNpb24gJWlcbiIsCisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsICJpbnZhbGlkIEVFUFJPTSB2ZXJzaW9uICVpXG4iLAogCQkJICAgaWNlLT5lZXByb20udmVyc2lvbik7CiAJCS8qIHJldHVybiAtRUlPOyAqLwogCX0KQEAgLTI0MjgsNiArMjQzNCwxMyBAQAogCQlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19DT05TVU1FUl9QT1dFUkRPV04sIDApOwogCX0KIAlzbmRfaWNlMTcxMl9zZXRfcHJvX3JhdGUoaWNlLCA0ODAwMCwgMSk7CisJLyogdW5tYXNrIHVzZWQgaW50ZXJydXB0cyAqLworCW91dGIoKChpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAxX0NPREVDXSAmIElDRTE3MTJfQ0ZHXzJ4TVBVNDAxKSA9PSAwID8KKwkgICAgICBJQ0UxNzEyX0lSUV9NUFUyIDogMCkgfAorCSAgICAgKChpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAxX0NPREVDXSAmIElDRTE3MTJfQ0ZHX05PX0NPTl9BQzk3KSA/CisJICAgICAgSUNFMTcxMl9JUlFfUEJLRFMgfCBJQ0UxNzEyX0lSUV9DT05DQVAgfCBJQ0UxNzEyX0lSUV9DT05QQksgOiAwKSwKKwkgICAgIElDRVJFRyhpY2UsIElSUU1BU0spKTsKKwlvdXRiKDB4MDAsIElDRU1UKGljZSwgSVJRKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI1NTMsNyArMjU2Niw4IEBACiAJLyogY2hlY2ssIGlmIHdlIGNhbiByZXN0cmljdCBQQ0kgRE1BIHRyYW5zZmVycyB0byAyOCBiaXRzICovCiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjgpKSA8IDAgfHwKIAkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDI4KSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDI4Yml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjhiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC0yNTg5LDYgKzI2MDMsNyBAQAogCWljZS0+cGNpID0gcGNpOwogCWljZS0+aXJxID0gLTE7CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKKwkvKiBkaXNhYmxlIGxlZ2FjeSBlbXVsYXRpb24gKi8KIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaWNlLT5wY2ksIDB4NDAsIDB4ODA3Zik7CiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGljZS0+cGNpLCAweDQyLCAweDAwMDYpOwogCXNuZF9pY2UxNzEyX3Byb2NfaW5pdChpY2UpOwpAQCAtMjYwOSw3ICsyNjI0LDcgQEAKIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2ljZTE3MTJfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBpY2UpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfaWNlMTcxMl9mcmVlKGljZSk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTI2MjUsMjIgKzI2NDAsMTIgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JLyogdW5tYXNrIHVzZWQgaW50ZXJydXB0cyAqLwotCW91dGIoKChpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAxX0NPREVDXSAmIElDRTE3MTJfQ0ZHXzJ4TVBVNDAxKSA9PSAwID8KLQkgICAgICBJQ0UxNzEyX0lSUV9NUFUyIDogMCkgfAotCSAgICAgKChpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAxX0NPREVDXSAmIElDRTE3MTJfQ0ZHX05PX0NPTl9BQzk3KSA/Ci0JICAgICAgSUNFMTcxMl9JUlFfUEJLRFMgfCBJQ0UxNzEyX0lSUV9DT05DQVAgfCBJQ0UxNzEyX0lSUV9DT05QQksgOiAwKSwKLQkgICAgIElDRVJFRyhpY2UsIElSUU1BU0spKTsKLQlvdXRiKDB4MDAsIElDRU1UKGljZSwgSVJRKSk7Ci0KIAllcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGljZSwgJm9wcyk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX2ljZTE3MTJfZnJlZShpY2UpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyX2ljZTE3MTIgPSBpY2U7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNjcwLDcgKzI2NzUsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMjgwOSwxMSArMjgxNSw4MCBAQAogCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaSA9IHRvX3BjaV9kZXYoZGV2KTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IGNhcmQtPnByaXZhdGVfZGF0YTsKKworCWlmICghaWNlLT5wbV9zdXNwZW5kX2VuYWJsZWQpCisJCXJldHVybiAwOworCisJc25kX3Bvd2VyX2NoYW5nZV9zdGF0ZShjYXJkLCBTTkRSVl9DVExfUE9XRVJfRDNob3QpOworCisJc25kX3BjbV9zdXNwZW5kX2FsbChpY2UtPnBjbSk7CisJc25kX3BjbV9zdXNwZW5kX2FsbChpY2UtPnBjbV9wcm8pOworCXNuZF9wY21fc3VzcGVuZF9hbGwoaWNlLT5wY21fZHMpOworCXNuZF9hYzk3X3N1c3BlbmQoaWNlLT5hYzk3KTsKKworCWlmIChpY2UtPnBtX3N1c3BlbmQpCisJCWljZS0+cG1fc3VzcGVuZChpY2UpOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJcGNpX3NhdmVfc3RhdGUocGNpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QzaG90KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2kgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBjYXJkLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIWljZS0+cG1fc3VzcGVuZF9lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGNpKTsKKworCWlmIChzbmRfaWNlMTcxMl9jaGlwX2luaXQoaWNlKSA8IDApIHsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGljZS0+cG1fcmVzdW1lKQorCQlpY2UtPnBtX3Jlc3VtZShpY2UpOworCisJaWYgKGljZS0+YWM5NykKKwkJc25kX2FjOTdfcmVzdW1lKGljZS0+YWM5Nyk7CisKKwlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhzbmRfaWNlMTcxMl9wbSwgc25kX2ljZTE3MTJfc3VzcGVuZCwgc25kX2ljZTE3MTJfcmVzdW1lKTsKKyNkZWZpbmUgU05EX1ZUMTcxMl9QTV9PUFMJJnNuZF9pY2UxNzEyX3BtCisjZWxzZQorI2RlZmluZSBTTkRfVlQxNzEyX1BNX09QUwlOVUxMCisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCisKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpY2UxNzEyX2RyaXZlciA9IHsKIAkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF9pY2UxNzEyX2lkcywKIAkucHJvYmUgPSBzbmRfaWNlMTcxMl9wcm9iZSwKIAkucmVtb3ZlID0gc25kX2ljZTE3MTJfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5wbSA9IFNORF9WVDE3MTJfUE1fT1BTLAorCX0sCiB9OwogCiBtb2R1bGVfcGNpX2RyaXZlcihpY2UxNzEyX2RyaXZlcik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKaW5kZXggNTAwNDcxNy4uNWU3OTQ4ZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAJCQljb250aW51ZTsKIAkJcmV0dXJuIG9sZF9jbWQ7CiAJfQotCXNuZF9wcmludGQoS0VSTl9FUlIgInNuZF92dDE3MjRfYWM5N19yZWFkeTogdGltZW91dFxuIik7CisJZGV2X2RiZyhpY2UtPmNhcmQtPmRldiwgInNuZF92dDE3MjRfYWM5N19yZWFkeTogdGltZW91dFxuIik7CiAJcmV0dXJuIG9sZF9jbWQ7CiB9CiAKQEAgLTE1Niw3ICsxNTYsNyBAQAogCWZvciAodG0gPSAwOyB0bSA8IDB4MTAwMDA7IHRtKyspCiAJCWlmICgoaW5iKElDRU1UMTcyNChpY2UsIEFDOTdfQ01EKSkgJiBiaXQpID09IDApCiAJCQlyZXR1cm4gMDsKLQlzbmRfcHJpbnRkKEtFUk5fRVJSICJzbmRfdnQxNzI0X2FjOTdfd2FpdF9iaXQ6IHRpbWVvdXRcbiIpOworCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJzbmRfdnQxNzI0X2FjOTdfd2FpdF9iaXQ6IHRpbWVvdXRcbiIpOwogCXJldHVybiAtRUlPOwogfQogCkBAIC00MzAsMTAgKzQzMCwxMCBAQAogCQlzcGluX2xvY2soJmljZS0+cmVnX2xvY2spOwogCQlpZiAoKyt0aW1lb3V0ID4gMTApIHsKIAkJCXN0YXR1cyA9IGluYihJQ0VSRUcxNzI0KGljZSwgSVJRU1RBVCkpOwotCQkJcHJpbnRrKEtFUk5fRVJSICJpY2UxNzI0OiBUb28gbG9uZyBpcnEgbG9vcCwgIgotCQkJICAgICAgICJzdGF0dXMgPSAweCV4XG4iLCBzdGF0dXMpOworCQkJZGV2X2VycihpY2UtPmNhcmQtPmRldiwKKwkJCQkiVG9vIGxvbmcgaXJxIGxvb3AsIHN0YXR1cyA9IDB4JXhcbiIsIHN0YXR1cyk7CiAJCQlpZiAoc3RhdHVzICYgVlQxNzI0X0lSUV9NUFVfVFgpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImljZTE3MjQ6IERpc2FibGluZyBNUFVfVFhcbiIpOworCQkJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsICJEaXNhYmxpbmcgTVBVX1RYXG4iKTsKIAkJCQllbmFibGVfbWlkaV9pcnEoaWNlLCBWVDE3MjRfSVJRX01QVV9UWCwgMCk7CiAJCQl9CiAJCQlzcGluX3VubG9jaygmaWNlLT5yZWdfbG9jayk7CkBAIC04MDEsNyArODAxLDcgQEAKIAlzcGluX3VubG9ja19pcnEoJmljZS0+cmVnX2xvY2spOwogCiAJLyoKLQlwcmludGsoS0VSTl9ERUJVRyAicHJvIHByZXBhcmU6IGNoID0gJWQsIGFkZHIgPSAweCV4LCAiCisJZGV2X2RiZyhpY2UtPmNhcmQtPmRldiwgInBybyBwcmVwYXJlOiBjaCA9ICVkLCBhZGRyID0gMHgleCwgIgogCSAgICAgICAiYnVmZmVyID0gMHgleCwgcGVyaW9kID0gMHgleFxuIiwKIAkgICAgICAgc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVscywKIAkgICAgICAgKHVuc2lnbmVkIGludClzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyLApAQCAtODIxLDEzICs4MjEsMTMgQEAKICNpZiAwIC8qIHJlYWQgUExBWUJBQ0tfQUREUiAqLwogCXB0ciA9IGlubChJQ0VNVDE3MjQoaWNlLCBQTEFZQkFDS19BRERSKSk7CiAJaWYgKHB0ciA8IHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHIpIHsKLQkJc25kX3ByaW50ZCgiaWNlMTcyNDogaW52YWxpZCBuZWdhdGl2ZSBwdHJcbiIpOworCQlkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiaW52YWxpZCBuZWdhdGl2ZSBwdHJcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJcHRyIC09IHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHI7CiAJcHRyID0gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgcHRyKTsKIAlpZiAocHRyID49IHN1YnN0cmVhbS0+cnVudGltZS0+YnVmZmVyX3NpemUpIHsKLQkJc25kX3ByaW50ZCgiaWNlMTcyNDogaW52YWxpZCBwdHIgJWQgKHNpemU9JWQpXG4iLAorCQlkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiaW52YWxpZCBwdHIgJWQgKHNpemU9JWQpXG4iLAogCQkJICAgKGludClwdHIsIChpbnQpc3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2Rfc2l6ZSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTg0MCw3ICs4NDAsNyBAQAogCWVsc2UgaWYgKHB0ciA8PSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQogCQlwdHIgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplIC0gcHRyOwogCWVsc2UgewotCQlzbmRfcHJpbnRkKCJpY2UxNzI0OiBpbnZhbGlkIHB0ciAlZCAoc2l6ZT0lZClcbiIsCisJCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJpbnZhbGlkIHB0ciAlZCAoc2l6ZT0lZClcbiIsCiAJCQkgICAoaW50KXB0ciwgKGludClzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplKTsKIAkJcHRyID0gMDsKIAl9CkBAIC04ODQsNyArODg0LDcgQEAKIAllbHNlIGlmIChwdHIgPD0gc3Vic3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZSkKIAkJcHRyID0gc3Vic3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZSAtIHB0cjsKIAllbHNlIHsKLQkJc25kX3ByaW50ZCgiaWNlMTcyNDogaW52YWxpZCBwdHIgJWQgKHNpemU9JWQpXG4iLAorCQlkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiaW52YWxpZCBwdHIgJWQgKHNpemU9JWQpXG4iLAogCQkJICAgKGludClwdHIsIChpbnQpc3Vic3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZSk7CiAJCXB0ciA9IDA7CiAJfQpAQCAtMTUwOCw3ICsxNTA4LDggQEAKIAkJYWM5Ny5wcml2YXRlX2RhdGEgPSBpY2U7CiAJCWVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmaWNlLT5hYzk3KTsKIAkJaWYgKGVyciA8IDApCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJpY2UxNzEyOiBjYW5ub3QgaW5pdGlhbGl6ZSBwcm8gYWM5Nywgc2tpcHBlZFxuIik7CisJCQlkZXZfd2FybihpY2UtPmNhcmQtPmRldiwKKwkJCQkgImNhbm5vdCBpbml0aWFsaXplIHBybyBhYzk3LCBza2lwcGVkXG4iKTsKIAkJZWxzZQogCQkJcmV0dXJuIDA7CiAJfQpAQCAtMjI3MSw3ICsyMjcyLDcgQEAKIAl3aGlsZSAoKGluYihJQ0VSRUcxNzI0KGljZSwgSTJDX0NUUkwpKSAmIFZUMTcyNF9JMkNfQlVTWSkgJiYgdC0tKQogCQk7CiAJaWYgKHQgPT0gLTEpCi0JCXByaW50ayhLRVJOX0VSUiAiaWNlMTcyNDogaTJjIGJ1c3kgdGltZW91dFxuIik7CisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsICJpMmMgYnVzeSB0aW1lb3V0XG4iKTsKIH0KIAogdW5zaWduZWQgY2hhciBzbmRfdnQxNzI0X3JlYWRfaTJjKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLApAQCAtMjI4Nyw3ICsyMjg4LDcgQEAKIAl2YWwgPSBpbmIoSUNFUkVHMTcyNChpY2UsIEkyQ19EQVRBKSk7CiAJbXV0ZXhfdW5sb2NrKCZpY2UtPmkyY19tdXRleCk7CiAJLyoKLQlwcmludGsoS0VSTl9ERUJVRyAiaTJjX3JlYWQ6IFsweCV4LDB4JXhdID0gMHgleFxuIiwgZGV2LCBhZGRyLCB2YWwpOworCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJpMmNfcmVhZDogWzB4JXgsMHgleF0gPSAweCV4XG4iLCBkZXYsIGFkZHIsIHZhbCk7CiAJKi8KIAlyZXR1cm4gdmFsOwogfQpAQCAtMjI5OCw3ICsyMjk5LDcgQEAKIAltdXRleF9sb2NrKCZpY2UtPmkyY19tdXRleCk7CiAJd2FpdF9pMmNfYnVzeShpY2UpOwogCS8qCi0JcHJpbnRrKEtFUk5fREVCVUcgImkyY193cml0ZTogWzB4JXgsMHgleF0gPSAweCV4XG4iLCBkZXYsIGFkZHIsIGRhdGEpOworCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJpMmNfd3JpdGU6IFsweCV4LDB4JXhdID0gMHgleFxuIiwgZGV2LCBhZGRyLCBkYXRhKTsKIAkqLwogCW91dGIoYWRkciwgSUNFUkVHMTcyNChpY2UsIEkyQ19CWVRFX0FERFIpKTsKIAlvdXRiKGRhdGEsIElDRVJFRzE3MjQoaWNlLCBJMkNfREFUQSkpOwpAQCAtMjMzNSw3ICsyMzM2LDggQEAKIAkJCQkoKHVuc2lnbmVkIGludClzd2FiMTYodmVuZG9yKSA8PCAxNikgfCBzd2FiMTYoZGV2aWNlKTsKIAkJCWlmIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPT0gMCB8fAogCQkJICAgIGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSAodW5zaWduZWQgaW50KS0xKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJpY2UxNzI0OiBObyB2YWxpZCBJRCBpcyBmb3VuZFxuIik7CisJCQkJZGV2X2VycihpY2UtPmNhcmQtPmRldiwKKwkJCQkJIk5vIHZhbGlkIElEIGlzIGZvdW5kXG4iKTsKIAkJCQlyZXR1cm4gLUVOWElPOwogCQkJfQogCQl9CkBAIC0yMzQ0LDcgKzIzNDYsOCBAQAogCQlmb3IgKGMgPSAqdGJsOyBjLT5uYW1lOyBjKyspIHsKIAkJCWlmIChtb2RlbG5hbWUgJiYgYy0+bW9kZWwgJiYKIAkJCSAgICAhc3RyY21wKG1vZGVsbmFtZSwgYy0+bW9kZWwpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWNlMTcyNDogVXNpbmcgYm9hcmQgbW9kZWwgJXNcbiIsCisJCQkJZGV2X2luZm8oaWNlLT5jYXJkLT5kZXYsCisJCQkJCSAiVXNpbmcgYm9hcmQgbW9kZWwgJXNcbiIsCiAJCQkJICAgICAgIGMtPm5hbWUpOwogCQkJCWljZS0+ZWVwcm9tLnN1YnZlbmRvciA9IGMtPnN1YnZlbmRvcjsKIAkJCX0gZWxzZSBpZiAoYy0+c3VidmVuZG9yICE9IGljZS0+ZWVwcm9tLnN1YnZlbmRvcikKQEAgLTIzNTMsMTQgKzIzNTYsMTQgQEAKIAkJCWlmICghYy0+ZWVwcm9tX3NpemUgfHwgIWMtPmVlcHJvbV9kYXRhKQogCQkJCWdvdG8gZm91bmQ7CiAJCQkvKiBpZiB0aGUgRUVQUk9NIGlzIGdpdmVuIGJ5IHRoZSBkcml2ZXIsIHVzZSBpdCAqLwotCQkJc25kX3ByaW50ZGQoInVzaW5nIHRoZSBkZWZpbmVkIGVlcHJvbS4uXG4iKTsKKwkJCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJ1c2luZyB0aGUgZGVmaW5lZCBlZXByb20uLlxuIik7CiAJCQlpY2UtPmVlcHJvbS52ZXJzaW9uID0gMjsKIAkJCWljZS0+ZWVwcm9tLnNpemUgPSBjLT5lZXByb21fc2l6ZSArIDY7CiAJCQltZW1jcHkoaWNlLT5lZXByb20uZGF0YSwgYy0+ZWVwcm9tX2RhdGEsIGMtPmVlcHJvbV9zaXplKTsKIAkJCWdvdG8gcmVhZF9za2lwcGVkOwogCQl9CiAJfQotCXByaW50ayhLRVJOX1dBUk5JTkcgImljZTE3MjQ6IE5vIG1hdGNoaW5nIG1vZGVsIGZvdW5kIGZvciBJRCAweCV4XG4iLAorCWRldl93YXJuKGljZS0+Y2FyZC0+ZGV2LCAiTm8gbWF0Y2hpbmcgbW9kZWwgZm91bmQgZm9yIElEIDB4JXhcbiIsCiAJICAgICAgIGljZS0+ZWVwcm9tLnN1YnZlbmRvcik7CiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAJLyogYXNzdW1lIEFDOTctb25seSBjYXJkIHdoaWNoIGNhbiBzdXNwZW5kIHdpdGhvdXQgYWRkaXRpb25hbCBjb2RlICovCkBAIC0yMzcyLDEzICsyMzc1LDEzIEBACiAJaWYgKGljZS0+ZWVwcm9tLnNpemUgPCA2KQogCQlpY2UtPmVlcHJvbS5zaXplID0gMzI7CiAJZWxzZSBpZiAoaWNlLT5lZXByb20uc2l6ZSA+IDMyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaWNlMTcyNDogSW52YWxpZCBFRVBST00gKHNpemUgPSAlaSlcbiIsCisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsICJJbnZhbGlkIEVFUFJPTSAoc2l6ZSA9ICVpKVxuIiwKIAkJICAgICAgIGljZS0+ZWVwcm9tLnNpemUpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJaWNlLT5lZXByb20udmVyc2lvbiA9IHNuZF92dDE3MjRfcmVhZF9pMmMoaWNlLCBkZXYsIDB4MDUpOwogCWlmIChpY2UtPmVlcHJvbS52ZXJzaW9uICE9IDEgJiYgaWNlLT5lZXByb20udmVyc2lvbiAhPSAyKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJpY2UxNzI0OiBJbnZhbGlkIEVFUFJPTSB2ZXJzaW9uICVpXG4iLAorCQlkZXZfd2FybihpY2UtPmNhcmQtPmRldiwgIkludmFsaWQgRUVQUk9NIHZlcnNpb24gJWlcbiIsCiAJCSAgICAgICBpY2UtPmVlcHJvbS52ZXJzaW9uKTsKIAlzaXplID0gaWNlLT5lZXByb20uc2l6ZSAtIDY7CiAJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKQEAgLTI1ODYsNyArMjU4OSw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF92dDE3MjRfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBpY2UpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfdnQxNzI0X2ZyZWUoaWNlKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMjYwOSw4ICsyNjEyLDYgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcl9pY2UxNzEyID0gaWNlOwogCXJldHVybiAwOwogfQpAQCAtMjYzOCw3ICsyNjM5LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuYwppbmRleCA4ODU1OTMzLi43YTZjMDc4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9qdWxpLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvanVsaS5jCkBAIC0yNDQsNyArMjQ0LDcgQEAKIAkvKiBBSzUzODUgZmlyc3QsIHNpbmNlIGl0IHJlcXVpcmVzIGNvbGQgcmVzZXQgYWZmZWN0aW5nIGJvdGggY29kZWNzICovCiAJb2xkX2dwaW8gPSBpY2UtPmdwaW8uZ2V0X2RhdGEoaWNlKTsKIAluZXdfZ3BpbyA9ICAob2xkX2dwaW8gJiB+R1BJT19BSzUzODVBX01BU0spIHwgYWs1Mzg1X3BpbnM7Ci0JLyogcHJpbnRrKEtFUk5fREVCVUcgIkpVTEkgLSBhazUzODUgc2V0X3JhdGVfdmFsOiBuZXcgZ3BpbyAweCV4XG4iLAorCS8qIGRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJKVUxJIC0gYWs1Mzg1IHNldF9yYXRlX3ZhbDogbmV3IGdwaW8gMHgleFxuIiwKIAkJbmV3X2dwaW8pOyAqLwogCWljZS0+Z3Bpby5zZXRfZGF0YShpY2UsIG5ld19ncGlvKTsKIApAQCAtMzQ0LDcgKzM0NCw3IEBACiAJCQluZXdfZ3BpbyA9ICBvbGRfZ3BpbyAmCiAJCQkJfigodW5zaWduZWQgaW50KSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CiAJfQotCS8qIHByaW50ayhLRVJOX0RFQlVHCisJLyogZGV2X2RiZyhpY2UtPmNhcmQtPmRldiwKIAkJIkpVTEkgLSBtdXRlL3VubXV0ZTogY29udHJvbF92YWx1ZTogMHgleCwgb2xkX2dwaW86IDB4JXgsICIKIAkJIm5ld19ncGlvIDB4JXhcbiIsCiAJCSh1bnNpZ25lZCBpbnQpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0sIG9sZF9ncGlvLApAQCAtNDM5LDkgKzQzOSw5IEBACiB7CiAJZm9yICg7ICpsaXN0OyBsaXN0KyspIHsKIAkJc3RydWN0IHNuZF9rY29udHJvbCAqc2xhdmUgPSBjdGxfZmluZChjYXJkLCAqbGlzdCk7Ci0JCS8qIHByaW50ayhLRVJOX0RFQlVHICJhZGRfc2xhdmVzIC0gJXNcbiIsICpsaXN0KTsgKi8KKwkJLyogZGV2X2RiZyhjYXJkLT5kZXYsICJhZGRfc2xhdmVzIC0gJXNcbiIsICpsaXN0KTsgKi8KIAkJaWYgKHNsYXZlKSB7Ci0JCQkvKiBwcmludGsoS0VSTl9ERUJVRyAic2xhdmUgJXMgZm91bmRcbiIsICpsaXN0KTsgKi8KKwkJCS8qIGRldl9kYmcoY2FyZC0+ZGV2LCAic2xhdmUgJXMgZm91bmRcbiIsICpsaXN0KTsgKi8KIAkJCXNuZF9jdGxfYWRkX3NsYXZlKG1hc3Rlciwgc2xhdmUpOwogCQl9CiAJfQpAQCAtNTM2LDcgKzUzNiw3IEBACiAKIAlvbGQgPSBpY2UtPmdwaW8uZ2V0X2RhdGEoaWNlKTsKIAluZXcgPSAgKG9sZCAmIH5HUElPX1JBVEVfTUFTSykgfCBnZXRfZ3Bpb192YWwocmF0ZSk7Ci0JLyogcHJpbnRrKEtFUk5fREVCVUcgIkpVTEkgLSBzZXRfcmF0ZTogb2xkICV4LCBuZXcgJXhcbiIsCisJLyogZGV2X2RiZyhpY2UtPmNhcmQtPmRldiwgIkpVTEkgLSBzZXRfcmF0ZTogb2xkICV4LCBuZXcgJXhcbiIsCiAJCQlvbGQgJiBHUElPX1JBVEVfTUFTSywKIAkJCW5ldyAmIEdQSU9fUkFURV9NQVNLKTsgKi8KIApAQCAtNTczLDcgKzU3Myw3IEBACiAJaWYgKGljZS0+aXNfc3BkaWZfbWFzdGVyKGljZSkgJiYgYzEpIHsKIAkJLyogb25seSBmb3IgU1BESUYgbWFzdGVyIG1vZGUsIHJhdGUgd2FzIGNoYW5nZWQgKi8KIAkJcmF0ZSA9IHNuZF9hazQxMTRfZXh0ZXJuYWxfcmF0ZShhazQxMTQpOwotCQkvKiBwcmludGsoS0VSTl9ERUJVRyAiYWs0MTE0IC0gaW5wdXQgcmF0ZSBjaGFuZ2VkIHRvICVkXG4iLAorCQkvKiBkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiYWs0MTE0IC0gaW5wdXQgcmF0ZSBjaGFuZ2VkIHRvICVkXG4iLAogCQkJCXJhdGUpOyAqLwogCQlqdWxpX2FrbV9zZXRfcmF0ZV92YWwoaWNlLT5ha20sIHJhdGUpOwogCX0KQEAgLTYyOCw3ICs2MjgsNyBAQAogI2VuZGlmCiAKIAlpZiAoc3BlYy0+YW5hbG9nKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImp1bGlAOiBhbmFsb2cgSS9PIGRldGVjdGVkXG4iKTsKKwkJZGV2X2luZm8oaWNlLT5jYXJkLT5kZXYsICJqdWxpQDogYW5hbG9nIEkvTyBkZXRlY3RlZFxuIik7CiAJCWljZS0+bnVtX3RvdGFsX2RhY3MgPSAyOwogCQlpY2UtPm51bV90b3RhbF9hZGNzID0gMjsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvcHJvZGlneTE5Mi5jIGIvc291bmQvcGNpL2ljZTE3MTIvcHJvZGlneTE5Mi5jCmluZGV4IGU2MTAzMzkuLmYzYjQ5MWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3Byb2RpZ3kxOTIuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9wcm9kaWd5MTkyLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAluZXcgPSAofm11dGUgPDwgNyAmIDB4ODApIHwgKG9sZCAmIH4weDgwKTsKIAljaGFuZ2UgPSAobmV3ICE9IG9sZCk7CiAJaWYgKGNoYW5nZSkKLQkJLypwcmludGsgKCJWb2x1bWUgcmVnaXN0ZXIgMHglMDJ4OiAweCUwMnhcbiIsIGlkeCwgbmV3KTsqLworCQkvKiBkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiVm9sdW1lIHJlZ2lzdGVyIDB4JTAyeDogMHglMDJ4XG4iLCBpZHgsIG5ldyk7Ki8KIAkJc3RhYzk0NjBfcHV0KGljZSwgaWR4LCBuZXcpOwogCXJldHVybiBjaGFuZ2U7CiB9CkBAIC0xMzMsNyArMTMzLDcgQEAKIAkvKiBkdWUgdG8gcG9zc2libGUgY29uZmxpY3RzIHdpdGggc3RhYzk0NjBfc2V0X3JhdGVfdmFsLCBtdXRleGluZyAqLwogCW11dGV4X2xvY2soJnNwZWMtPm11dGVfbXV0ZXgpOwogCS8qCi0JcHJpbnRrKEtFUk5fREVCVUcgIk11dGUgcHV0OiByZWcgMHglMDJ4LCBjdHJsIHZhbHVlOiAweCUwMnhcbiIsIGlkeCwKKwlkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiTXV0ZSBwdXQ6IHJlZyAweCUwMngsIGN0cmwgdmFsdWU6IDB4JTAyeFxuIiwgaWR4LAogCSAgICAgICB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CiAJKi8KIAljaGFuZ2UgPSBzdGFjOTQ2MF9kYWNfbXV0ZShpY2UsIGlkeCwgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJaWYgKGNoYW5nZSkgewogCQlvdm9sID0gICgweDdmIC0gbnZvbCkgfCAodG1wICYgMHg4MCk7CiAJCS8qCi0JCXByaW50ayhLRVJOX0RFQlVHICJEQUMgVm9sdW1lOiByZWcgMHglMDJ4OiAweCUwMnhcbiIsCisJCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJEQUMgVm9sdW1lOiByZWcgMHglMDJ4OiAweCUwMnhcbiIsCiAJCSAgICAgICBpZHgsIG92b2wpOwogCQkqLwogCQlzdGFjOTQ2MF9wdXQoaWNlLCBpZHgsICgweDdmIC0gbnZvbCkgfCAodG1wICYgMHg4MCkpOwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAJZm9yIChpZHggPSAwOyBpZHggPCA3IDsgKytpZHgpCiAJCWNoYW5nZWRbaWR4XSA9IHN0YWM5NDYwX2RhY19tdXRlKGljZSwKIAkJCQlTVEFDOTQ2WF9NQVNURVJfVk9MVU1FICsgaWR4LCAwKTsKLQkvKnByaW50ayhLRVJOX0RFQlVHICJSYXRlIGNoYW5nZTogJWQsIG5ldyBNQzogMHglMDJ4XG4iLCByYXRlLCBuZXcpOyovCisJLypkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiUmF0ZSBjaGFuZ2U6ICVkLCBuZXcgTUM6IDB4JTAyeFxuIiwgcmF0ZSwgbmV3KTsqLwogCXN0YWM5NDYwX3B1dChpY2UsIFNUQUM5NDZYX01BU1RFUl9DTE9DS0lORywgbmV3KTsKIAl1ZGVsYXkoMTApOwogCS8qIHVubXV0aW5nIC0gb25seSBvcmlnaW5hbGx5IHVubXV0ZWQgZGFjcyAtCkBAIC03NjgsOSArNzY4LDEwIEBACiAJCS8qIGZyb20gdGhpcyBtb21lbnQgaWYgZXJyID0gMCB0aGVuCiAJCSAqIHNwZWMtPmFrNDExNCBzaG91bGQgbm90IGJlIG51bGwKIAkJICovCi0JCXNuZF9wcmludGRkKCJBSzQxMTQgaW5pdGlhbGl6ZWQgd2l0aCBzdGF0dXMgJWRcbiIsIGVycik7CisJCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsCisJCQkiQUs0MTE0IGluaXRpYWxpemVkIHdpdGggc3RhdHVzICVkXG4iLCBlcnIpOwogCX0gZWxzZQotCQlzbmRfcHJpbnRkZCgiQUs0MTE0IG5vdCBmb3VuZFxuIik7CisJCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJBSzQxMTQgbm90IGZvdW5kXG4iKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvcXVhcnRldC5jIGIvc291bmQvcGNpL2ljZTE3MTIvcXVhcnRldC5jCmluZGV4IDcxYzYwMDMuLjJjMmRmNGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3F1YXJ0ZXQuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9xdWFydGV0LmMKQEAgLTI4MCw3ICsyODAsNyBAQAogCiAJaWYgKHNuZF9CVUdfT04oY2hpcCA8IDAgfHwgY2hpcCA+PSA0KSkKIAkJcmV0dXJuOwotCS8qcHJpbnRrKEtFUk5fREVCVUcgIldyaXRpbmcgdG8gQUs0NjIwOiBjaGlwPSVkLCBhZGRyPTB4JXgsCisJLypkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiV3JpdGluZyB0byBBSzQ2MjA6IGNoaXA9JWQsIGFkZHI9MHgleCwKIAkgIGRhdGE9MHgleFxuIiwgY2hpcCwgYWRkciwgZGF0YSk7Ki8KIAlvcmlnX2RpciA9IGljZS0+Z3Bpby5nZXRfZGlyKGljZSk7CiAJaWNlLT5ncGlvLnNldF9kaXIoaWNlLCBvcmlnX2RpciB8IEdQSU9fU1BJX0FMTCk7CkBAIC04OTgsNyArODk4LDcgQEAKIAluZXcgPSAgKGdldF9jcGxkKGljZSkgJiB+Q1BMRF9DS1NfTUFTSykgfCBnZXRfY2tzX3ZhbChyYXRlKTsKIAkvKiBzd2l0Y2ggdG8gaW50ZXJuYWwgY2xvY2ssIGRyb3AgQ1BMRF9TWU5DX1NFTCAqLwogCW5ldyAmPSB+Q1BMRF9TWU5DX1NFTDsKLQkvKiBwcmludGsoS0VSTl9ERUJVRyAiUVQgLSBzZXRfcmF0ZTogb2xkICV4LCBuZXcgJXhcbiIsCisJLyogZGV2X2RiZyhpY2UtPmNhcmQtPmRldiwgIlFUIC0gc2V0X3JhdGU6IG9sZCAleCwgbmV3ICV4XG4iLAogCSAgIGdldF9jcGxkKGljZSksIG5ldyk7ICovCiAJc2V0X2NwbGQoaWNlLCBuZXcpOwogfQpAQCAtOTc4LDcgKzk3OCw3IEBACiAJCQljMSkgewogCQkvKiBvbmx5IGZvciBTUERJRiBtYXN0ZXIgbW9kZSwgcmF0ZSB3YXMgY2hhbmdlZCAqLwogCQlyYXRlID0gc25kX2FrNDExM19leHRlcm5hbF9yYXRlKGFrNDExMyk7Ci0JCS8qIHByaW50ayhLRVJOX0RFQlVHICJhazQxMTMgLSBpbnB1dCByYXRlIGNoYW5nZWQgdG8gJWRcbiIsCisJCS8qIGRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJhazQxMTMgLSBpbnB1dCByYXRlIGNoYW5nZWQgdG8gJWRcbiIsCiAJCSAgIHJhdGUpOyAqLwogCQlxdGV0X2FrbV9zZXRfcmF0ZV92YWwoaWNlLT5ha20sIHJhdGUpOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pbnRlbDh4MC5jIGIvc291bmQvcGNpL2ludGVsOHgwLmMKaW5kZXggMDhkODczMy4uNjgzNDBkNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ludGVsOHgwLmMKKysrIGIvc291bmQvcGNpL2ludGVsOHgwLmMKQEAgLTU0Nyw3ICs1NDcsOCBAQAogCS8qIGFjY2VzcyB0byBzb21lIGZvcmJpZGRlbiAobm9uIGV4aXN0ZW50KSBhYzk3IHJlZ2lzdGVycyB3aWxsIG5vdAogCSAqIHJlc2V0IHRoZSBzZW1hcGhvcmUuIFNvIGV2ZW4gaWYgeW91IGRvbid0IGdldCB0aGUgc2VtYXBob3JlLCBzdGlsbAogCSAqIGNvbnRpbnVlIHRoZSBhY2Nlc3MuIFdlIGRvbid0IG5lZWQgdGhlIHNlbWFwaG9yZSBhbnl3YXkuICovCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfc2VtYXBob3JlOiBzZW1hcGhvcmUgaXMgbm90IHJlYWR5IFsweCV4XVsweCV4XVxuIiwKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJImNvZGVjX3NlbWFwaG9yZTogc2VtYXBob3JlIGlzIG5vdCByZWFkeSBbMHgleF1bMHgleF1cbiIsCiAJCQlpZ2V0Ynl0ZShjaGlwLCBJQ0hSRUcoQUNDX1NFTUEpKSwgaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX1NUQSkpKTsKIAlpYWdldHdvcmQoY2hpcCwgMCk7CS8qIGNsZWFyIHNlbWFwaG9yZSBmbGFnICovCiAJLyogSSBkb24ndCBjYXJlIGFib3V0IHRoZSBzZW1hcGhvcmUgKi8KQEAgLTU2Miw3ICs1NjMsOSBAQAogCQogCWlmIChzbmRfaW50ZWw4eDBfY29kZWNfc2VtYXBob3JlKGNoaXAsIGFjOTctPm51bSkgPCAwKSB7CiAJCWlmICghIGNoaXAtPmluX2FjOTdfaW5pdCkKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNvZGVjX3dyaXRlICVkOiBzZW1hcGhvcmUgaXMgbm90IHJlYWR5IGZvciByZWdpc3RlciAweCV4XG4iLCBhYzk3LT5udW0sIHJlZyk7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiY29kZWNfd3JpdGUgJWQ6IHNlbWFwaG9yZSBpcyBub3QgcmVhZHkgZm9yIHJlZ2lzdGVyIDB4JXhcbiIsCisJCQkJYWM5Ny0+bnVtLCByZWcpOwogCX0KIAlpYXB1dHdvcmQoY2hpcCwgcmVnICsgYWM5Ny0+bnVtICogMHg4MCwgdmFsKTsKIH0KQEAgLTU3Niw3ICs1NzksOSBAQAogCiAJaWYgKHNuZF9pbnRlbDh4MF9jb2RlY19zZW1hcGhvcmUoY2hpcCwgYWM5Ny0+bnVtKSA8IDApIHsKIAkJaWYgKCEgY2hpcC0+aW5fYWM5N19pbml0KQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZCAlZDogc2VtYXBob3JlIGlzIG5vdCByZWFkeSBmb3IgcmVnaXN0ZXIgMHgleFxuIiwgYWM5Ny0+bnVtLCByZWcpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImNvZGVjX3JlYWQgJWQ6IHNlbWFwaG9yZSBpcyBub3QgcmVhZHkgZm9yIHJlZ2lzdGVyIDB4JXhcbiIsCisJCQkJYWM5Ny0+bnVtLCByZWcpOwogCQlyZXMgPSAweGZmZmY7CiAJfSBlbHNlIHsKIAkJcmVzID0gaWFnZXR3b3JkKGNoaXAsIHJlZyArIGFjOTctPm51bSAqIDB4ODApOwpAQCAtNTg1LDcgKzU5MCw5IEBACiAJCQlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfU1RBKSwgdG1wICYKIAkJCQkgIH4oY2hpcC0+Y29kZWNfcmVhZHlfYml0cyB8IElDSF9HU0NJKSk7CiAJCQlpZiAoISBjaGlwLT5pbl9hYzk3X2luaXQpCi0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZCAlZDogcmVhZCB0aW1lb3V0IGZvciByZWdpc3RlciAweCV4XG4iLCBhYzk3LT5udW0sIHJlZyk7CisJCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJCSJjb2RlY19yZWFkICVkOiByZWFkIHRpbWVvdXQgZm9yIHJlZ2lzdGVyIDB4JXhcbiIsCisJCQkJCWFjOTctPm51bSwgcmVnKTsKIAkJCXJlcyA9IDB4ZmZmZjsKIAkJfQogCX0KQEAgLTYxOSw3ICs2MjYsNyBAQAogCQkJcmV0dXJuIDA7CiAJfQogCWlmICghIGNoaXAtPmluX2FjOTdfaW5pdCkKLQkJc25kX3ByaW50ZChLRVJOX1dBUk5JTkcgImludGVsOHgwOiBBQzk3IGNvZGVjIHJlYWR5IHRpbWVvdXQuXG4iKTsKKwkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiQUM5NyBjb2RlYyByZWFkeSB0aW1lb3V0LlxuIik7CiAJcmV0dXJuIC1FQlVTWTsKIH0KIApAQCAtNjMxLDcgKzYzOCw3IEBACiAJd2hpbGUgKC0tdGltZSAmJiAoaWdldGR3b3JkKGNoaXAsIElDSFJFRyhBTElfQ0FTKSkgJiBBTElfQ0FTX1NFTV9CVVNZKSkKIAkJdWRlbGF5KDEpOwogCWlmICghIHRpbWUgJiYgISBjaGlwLT5pbl9hYzk3X2luaXQpCi0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJhbGlfY29kZWNfc2VtYXBob3JlIHRpbWVvdXRcbiIpOworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsICJhbGlfY29kZWNfc2VtYXBob3JlIHRpbWVvdXRcbiIpOwogCXJldHVybiBzbmRfaW50ZWw4eDBfYWxpX2NvZGVjX3JlYWR5KGNoaXAsIEFMSV9DU1BTUl9DT0RFQ19SRUFEWSk7CiB9CiAKQEAgLTcwMCw3ICs3MDcsNyBAQAogCQkJYmRiYXJbaWR4ICsgMV0gPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwIHwgLyogaW50ZXJydXB0IG9uIGNvbXBsZXRpb24gKi8KIAkJCQkJCSAgICAgaWNoZGV2LT5mcmFnc2l6ZSA+PiBpY2hkZXYtPnBvc19zaGlmdCk7CiAjaWYgMAotCQkJcHJpbnRrKEtFUk5fREVCVUcgImJkYmFyWyVpXSA9IDB4JXggWzB4JXhdXG4iLAorCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJiZGJhclslaV0gPSAweCV4IFsweCV4XVxuIiwKIAkJCSAgICAgICBpZHggKyAwLCBiZGJhcltpZHggKyAwXSwgYmRiYXJbaWR4ICsgMV0pOwogI2VuZGlmCiAJCX0KQEAgLTcxMiw4ICs3MTksOCBAQAogCWljaGRldi0+bHZpX2ZyYWcgPSBJQ0hfUkVHX0xWSV9NQVNLICUgaWNoZGV2LT5mcmFnczsKIAlpY2hkZXYtPnBvc2l0aW9uID0gMDsKICNpZiAwCi0JcHJpbnRrKEtFUk5fREVCVUcgImx2aV9mcmFnID0gJWksIGZyYWdzID0gJWksIHBlcmlvZF9zaXplID0gMHgleCwgIgotCSAgICAgICAicGVyaW9kX3NpemUxID0gMHgleFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJImx2aV9mcmFnID0gJWksIGZyYWdzID0gJWksIHBlcmlvZF9zaXplID0gMHgleCwgcGVyaW9kX3NpemUxID0gMHgleFxuIiwKIAkgICAgICAgaWNoZGV2LT5sdmlfZnJhZywgaWNoZGV2LT5mcmFncywgaWNoZGV2LT5mcmFnc2l6ZSwKIAkgICAgICAgaWNoZGV2LT5mcmFnc2l6ZTEpOwogI2VuZGlmCkBAIC03ODEsOCArNzg4LDggQEAKIAkJaWNoZGV2LT5sdmlfZnJhZyAlPSBpY2hkZXYtPmZyYWdzOwogCQlpY2hkZXYtPmJkYmFyW2ljaGRldi0+bHZpICogMl0gPSBjcHVfdG9fbGUzMihpY2hkZXYtPnBoeXNidWYgKyBpY2hkZXYtPmx2aV9mcmFnICogaWNoZGV2LT5mcmFnc2l6ZTEpOwogI2lmIDAKLQlwcmludGsoS0VSTl9ERUJVRyAibmV3OiBiZGJhclslaV0gPSAweCV4IFsweCV4XSwgcHJlZmV0Y2ggPSAlaSwgIgotCSAgICAgICAiYWxsID0gMHgleCwgMHgleFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJIm5ldzogYmRiYXJbJWldID0gMHgleCBbMHgleF0sIHByZWZldGNoID0gJWksIGFsbCA9IDB4JXgsIDB4JXhcbiIsCiAJICAgICAgIGljaGRldi0+bHZpICogMiwgaWNoZGV2LT5iZGJhcltpY2hkZXYtPmx2aSAqIDJdLAogCSAgICAgICBpY2hkZXYtPmJkYmFyW2ljaGRldi0+bHZpICogMiArIDFdLCBpbmIoSUNIX1JFR19PRkZfUElWICsgcG9ydCksCiAJICAgICAgIGlubChwb3J0ICsgNCksIGluYihwb3J0ICsgSUNIX1JFR19PRkZfQ1IpKTsKQEAgLTIyODksNyArMjI5Niw4IEBACiAJCWFjOTcubnVtID0gaTsKIAkJaWYgKChlcnIgPSBzbmRfYWM5N19taXhlcihwYnVzLCAmYWM5NywgJmNoaXAtPmFjOTdbaV0pKSA8IDApIHsKIAkJCWlmIChlcnIgIT0gLUVBQ0NFUykKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBjb2RlYyAjJWRcbiIsIGkpOworCQkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCQkiVW5hYmxlIHRvIGluaXRpYWxpemUgY29kZWMgIyVkXG4iLCBpKTsKIAkJCWlmIChpID09IDApCiAJCQkJZ290byBfX2VycjsKIAkJfQpAQCAtMjQ0MSw3ICsyNDQ5LDcgQEAKIAkJCXJldHVybiAwOwogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAl9IHdoaWxlICh0aW1lX2FmdGVyX2VxKGVuZF90aW1lLCBqaWZmaWVzKSk7Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgd2FybSByZXNldCBzdGlsbCBpbiBwcm9ncmVzcz8gWzB4JXhdXG4iLAorCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQUMnOTcgd2FybSByZXNldCBzdGlsbCBpbiBwcm9ncmVzcz8gWzB4JXhdXG4iLAogCQkgICBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfQ05UKSkpOwogCXJldHVybiAtRUlPOwogfQpAQCAtMjQ4Myw3ICsyNDkxLDggQEAKIAkJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOwogCQlpZiAoISBzdGF0dXMpIHsKIAkJCS8qIG5vIGNvZGVjIGlzIGZvdW5kICovCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlY19yZWFkeTogY29kZWMgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJjb2RlY19yZWFkeTogY29kZWMgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwKIAkJCQkgICBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfU1RBKSkpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KQEAgLTI1NDcsNyArMjU1Niw3IEBACiAJCQlnb3RvIF9fb2s7CiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyByZXNldCBmYWlsZWQuXG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkFDJzk3IHJlc2V0IGZhaWxlZC5cbiIpOwogCWlmIChwcm9iaW5nKQogCQlyZXR1cm4gLUVJTzsKIApAQCAtMjU5MSw3ICsyNjAwLDcgQEAKICAgICAgICAgCQkgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAodGltZW91dCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJpbnRlbDh4MDogcmVzZXQgb2YgcmVnaXN0ZXJzIGZhaWxlZD9cbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJyZXNldCBvZiByZWdpc3RlcnMgZmFpbGVkP1xuIik7CiAgICAgICAgIH0KIAkvKiBpbml0aWFsaXplIEJ1ZmZlciBEZXNjcmlwdG9yIExpc3RzICovCiAJZm9yIChpID0gMDsgaSA8IGNoaXAtPmJkYmFyc19jb3VudDsgaSsrKQpAQCAtMjY5Miw4ICsyNzAxLDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImludGVsOHgwOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yNzAxLDggKzI3MDksOCBAQAogCXNuZF9pbnRlbDh4MF9jaGlwX2luaXQoY2hpcCwgMCk7CiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfaW50ZWw4eDBfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlwcmludGsoS0VSTl9FUlIgImludGVsOHgwOiB1bmFibGUgdG8gZ3JhYiBJUlEgJWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iLAorCQkJcGNpLT5pcnEpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yNzc5LDcgKzI3ODcsOCBAQAogICAgICAgX19hZ2FpbjoKIAlzdWJzID0gY2hpcC0+cGNtWzBdLT5zdHJlYW1zWzBdLnN1YnN0cmVhbTsKIAlpZiAoISBzdWJzIHx8IHN1YnMtPmRtYV9idWZmZXIuYnl0ZXMgPCBJTlRFTDhYMF9URVNUQlVGX1NJWkUpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIm5vIHBsYXliYWNrIGJ1ZmZlciBhbGxvY2F0ZWQgLSBhYm9ydGluZyBtZWFzdXJlIGFjOTcgY2xvY2tcbiIpOworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsCisJCQkgIm5vIHBsYXliYWNrIGJ1ZmZlciBhbGxvY2F0ZWQgLSBhYm9ydGluZyBtZWFzdXJlIGFjOTcgY2xvY2tcbiIpOwogCQlyZXR1cm47CiAJfQogCWljaGRldiA9ICZjaGlwLT5pY2hkW0lDSERfUENNT1VUXTsKQEAgLTI3ODksNyArMjc5OCw4IEBACiAKIAkvKiBzZXQgcmF0ZSAqLwogCWlmIChzbmRfYWM5N19zZXRfcmF0ZShjaGlwLT5hYzk3WzBdLCBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSwgNDgwMDApIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3Qgc2V0IGFjOTcgcmF0ZTogY2xvY2sgPSAlZFxuIiwgY2hpcC0+YWM5N19idXMtPmNsb2NrKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJjYW5ub3Qgc2V0IGFjOTcgcmF0ZTogY2xvY2sgPSAlZFxuIiwKKwkJCWNoaXAtPmFjOTdfYnVzLT5jbG9jayk7CiAJCXJldHVybjsKIAl9CiAJc25kX2ludGVsOHgwX3NldHVwX3BlcmlvZHMoY2hpcCwgaWNoZGV2KTsKQEAgLTI4NDMsNyArMjg1Myw4IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CiAKIAlpZiAocG9zID09IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW50ZWw4eDA6IG1lYXN1cmUgLSB1bnJlbGlhYmxlIERNQSBwb3NpdGlvbi4uXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkibWVhc3VyZSAtIHVucmVsaWFibGUgRE1BIHBvc2l0aW9uLi5cbiIpOwogCSAgICAgIF9fcmV0cnk6CiAJCWlmIChhdHRlbXB0IDwgMykgewogCQkJbXNsZWVwKDMwMCk7CkBAIC0yODU3LDE2ICsyODY4LDE3IEBACiAJdCA9IHN0b3BfdGltZS50dl9zZWMgLSBzdGFydF90aW1lLnR2X3NlYzsKIAl0ICo9IDEwMDAwMDA7CiAJdCArPSAoc3RvcF90aW1lLnR2X25zZWMgLSBzdGFydF90aW1lLnR2X25zZWMpIC8gMTAwMDsKLQlwcmludGsoS0VSTl9JTkZPICIlczogbWVhc3VyZWQgJWx1IHVzZWNzICglbHUgc2FtcGxlcylcbiIsIF9fZnVuY19fLCB0LCBwb3MpOworCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJICIlczogbWVhc3VyZWQgJWx1IHVzZWNzICglbHUgc2FtcGxlcylcbiIsIF9fZnVuY19fLCB0LCBwb3MpOwogCWlmICh0ID09IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW50ZWw4eDA6ID8/IGNhbGN1bGF0aW9uIGVycm9yLi5cbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIj8/IGNhbGN1bGF0aW9uIGVycm9yLi5cbiIpOwogCQlnb3RvIF9fcmV0cnk7CiAJfQogCXBvcyAqPSAxMDAwOwogCXBvcyA9IChwb3MgLyB0KSAqIDEwMDAgKyAoKHBvcyAlIHQpICogMTAwMCkgLyB0OwogCWlmIChwb3MgPCA0MDAwMCB8fCBwb3MgPj0gNjAwMDApIHsKIAkJLyogYWJub3JtYWwgdmFsdWUuIGh3IHByb2JsZW0/ICovCi0JCXByaW50ayhLRVJOX0lORk8gImludGVsOHgwOiBtZWFzdXJlZCBjbG9jayAlbGQgcmVqZWN0ZWRcbiIsIHBvcyk7CisJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwgIm1lYXN1cmVkIGNsb2NrICVsZCByZWplY3RlZFxuIiwgcG9zKTsKIAkJZ290byBfX3JldHJ5OwogCX0gZWxzZSBpZiAocG9zID4gNDA1MDAgJiYgcG9zIDwgNDE1MDApCiAJCS8qIGZpcnN0IGV4Y2VwdGlvbiAtIDQxMDAwSHogcmVmZXJlbmNlIGNsb2NrICovCkBAIC0yODc4LDcgKzI4OTAsNyBAQAogCQkvKiBub3QgNDgwMDBIeiwgdHVuaW5nIHRoZSBjbG9jay4uICovCiAJCWNoaXAtPmFjOTdfYnVzLT5jbG9jayA9IChjaGlwLT5hYzk3X2J1cy0+Y2xvY2sgKiA0ODAwMCkgLyBwb3M7CiAgICAgICBfX2VuZDoKLQlwcmludGsoS0VSTl9JTkZPICJpbnRlbDh4MDogY2xvY2tpbmcgdG8gJWRcbiIsIGNoaXAtPmFjOTdfYnVzLT5jbG9jayk7CisJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LCAiY2xvY2tpbmcgdG8gJWRcbiIsIGNoaXAtPmFjOTdfYnVzLT5jbG9jayk7CiAJc25kX2FjOTdfdXBkYXRlX3Bvd2VyKGNoaXAtPmFjOTdbMF0sIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFLCAwKTsKIH0KIApAQCAtMjg5OSw3ICsyOTExLDcgQEAKIAl3bCA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgaW50ZWw4eDBfY2xvY2tfbGlzdCk7CiAJaWYgKCF3bCkKIAkJcmV0dXJuIDA7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiaW50ZWw4eDA6IHdoaXRlIGxpc3QgcmF0ZSBmb3IgJTA0eDolMDR4IGlzICVpXG4iLAorCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwgIndoaXRlIGxpc3QgcmF0ZSBmb3IgJTA0eDolMDR4IGlzICVpXG4iLAogCSAgICAgICBwY2ktPnN1YnN5c3RlbV92ZW5kb3IsIHBjaS0+c3Vic3lzdGVtX2RldmljZSwgd2wtPnZhbHVlKTsKIAljaGlwLT5hYzk3X2J1cy0+Y2xvY2sgPSB3bC0+dmFsdWU7CiAJcmV0dXJuIDE7CkBAIC0zMDAzLDcgKzMwMTUsNyBAQAogCiBmaW5pOgogCWlmIChtc2cgIT0gTlVMTCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaW50ZWw4eDA6ICVzIG9wdGltaXphdGlvblxuIiwgbXNnKTsKKwkJZGV2X2luZm8oJnBjaS0+ZGV2LCAiJXMgb3B0aW1pemF0aW9uXG4iLCBtc2cpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTMwOTgsNyArMzExMCw3IEBACiAJZWxzZQogCQljaGlwLT5hZGRyID0gcGNpX2lvbWFwKHBjaSwgMCwgMCk7CiAJaWYgKCFjaGlwLT5hZGRyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQUMnOTcgc3BhY2UgaW9yZW1hcCBwcm9ibGVtXG4iKTsKIAkJc25kX2ludGVsOHgwX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTMxMDcsNyArMzExOSw3IEBACiAJZWxzZQogCQljaGlwLT5ibWFkZHIgPSBwY2lfaW9tYXAocGNpLCAxLCAwKTsKIAlpZiAoIWNoaXAtPmJtYWRkcikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJDb250cm9sbGVyIHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ29udHJvbGxlciBzcGFjZSBpb3JlbWFwIHByb2JsZW1cbiIpOwogCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMzE1Miw3ICszMTY0LDcgQEAKIAkJCQljaGlwLT5iZGJhcnNfY291bnQgKiBzaXplb2YodTMyKSAqIElDSF9NQVhfRlJBR1MgKiAyLAogCQkJCSZjaGlwLT5iZGJhcnMpIDwgMCkgewogCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW50ZWw4eDA6IGNhbm5vdCBhbGxvY2F0ZSBidWZmZXIgZGVzY3JpcHRvcnNcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBidWZmZXIgZGVzY3JpcHRvcnNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJLyogdGFibGVzIG11c3QgYmUgYWxpZ25lZCB0byA4IGJ5dGVzIGhlcmUsIGJ1dCB0aGUga2VybmVsIHBhZ2VzCkBAIC0zMjA2LDcgKzMyMTgsNyBAQAogCS8qIHJlcXVlc3QgaXJxIGFmdGVyIGluaXRpYWxpemFpbmcgaW50X3N0YV9tYXNrLCBldGMgKi8KIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9pbnRlbDh4MF9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0zMjE3LDggKzMyMjksNiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyX2ludGVsOHgwID0gY2hpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTMyNjUsMTIgKzMyNzUsMTIgQEAKIAl3ID0gc25kX3BjaV9xdWlya19sb29rdXAocGNpLCBzcGRpZl9hY2xpbmtfZGVmYXVsdHMpOwogCWlmICh3KSB7CiAJCWlmICh3LT52YWx1ZSkKLQkJCXNuZF9wcmludGRkKEtFUk5fSU5GTwotCQkJCSAgICAiaW50ZWw4eDA6IFVzaW5nIFNQRElGIG92ZXIgQUMtTGluayBmb3IgJXNcbiIsCisJCQlkZXZfZGJnKCZwY2ktPmRldiwKKwkJCQkiVXNpbmcgU1BESUYgb3ZlciBBQy1MaW5rIGZvciAlc1xuIiwKIAkJCQkgICAgc25kX3BjaV9xdWlya19uYW1lKHcpKTsKIAkJZWxzZQotCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPCi0JCQkJICAgICJpbnRlbDh4MDogVXNpbmcgaW50ZWdyYXRlZCBTUERJRiBETUEgZm9yICVzXG4iLAorCQkJZGV2X2RiZygmcGNpLT5kZXYsCisJCQkJIlVzaW5nIGludGVncmF0ZWQgU1BESUYgRE1BIGZvciAlc1xuIiwKIAkJCQkgICAgc25kX3BjaV9xdWlya19uYW1lKHcpKTsKIAkJcmV0dXJuIHctPnZhbHVlOwogCX0KQEAgLTMyODUsNyArMzI5NSw3IEBACiAJaW50IGVycjsKIAlzdHJ1Y3Qgc2hvcnRuYW1lX3RhYmxlICpuYW1lOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pbnRlbDh4MG0uYyBiL3NvdW5kL3BjaS9pbnRlbDh4MG0uYwppbmRleCAzNTczYzExLi5iNTRkM2U5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaW50ZWw4eDBtLmMKKysrIGIvc291bmQvcGNpL2ludGVsOHgwbS5jCkBAIC0zMzQsNyArMzM0LDggQEAKIAkvKiBhY2Nlc3MgdG8gc29tZSBmb3JiaWRkZW4gKG5vbiBleGlzdGVudCkgYWM5NyByZWdpc3RlcnMgd2lsbCBub3QKIAkgKiByZXNldCB0aGUgc2VtYXBob3JlLiBTbyBldmVuIGlmIHlvdSBkb24ndCBnZXQgdGhlIHNlbWFwaG9yZSwgc3RpbGwKIAkgKiBjb250aW51ZSB0aGUgYWNjZXNzLiBXZSBkb24ndCBuZWVkIHRoZSBzZW1hcGhvcmUgYW55d2F5LiAqLwotCXNuZF9wcmludGsoS0VSTl9FUlIgImNvZGVjX3NlbWFwaG9yZTogc2VtYXBob3JlIGlzIG5vdCByZWFkeSBbMHgleF1bMHgleF1cbiIsCisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCSJjb2RlY19zZW1hcGhvcmU6IHNlbWFwaG9yZSBpcyBub3QgcmVhZHkgWzB4JXhdWzB4JXhdXG4iLAogCQkJaWdldGJ5dGUoY2hpcCwgSUNIUkVHKEFDQ19TRU1BKSksIGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9TVEEpKSk7CiAJaWFnZXR3b3JkKGNoaXAsIDApOwkvKiBjbGVhciBzZW1hcGhvcmUgZmxhZyAqLwogCS8qIEkgZG9uJ3QgY2FyZSBhYm91dCB0aGUgc2VtYXBob3JlICovCkBAIC0zNDksNyArMzUwLDkgQEAKIAkKIAlpZiAoc25kX2ludGVsOHgwbV9jb2RlY19zZW1hcGhvcmUoY2hpcCwgYWM5Ny0+bnVtKSA8IDApIHsKIAkJaWYgKCEgY2hpcC0+aW5fYWM5N19pbml0KQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfd3JpdGUgJWQ6IHNlbWFwaG9yZSBpcyBub3QgcmVhZHkgZm9yIHJlZ2lzdGVyIDB4JXhcbiIsIGFjOTctPm51bSwgcmVnKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJjb2RlY193cml0ZSAlZDogc2VtYXBob3JlIGlzIG5vdCByZWFkeSBmb3IgcmVnaXN0ZXIgMHgleFxuIiwKKwkJCQlhYzk3LT5udW0sIHJlZyk7CiAJfQogCWlhcHV0d29yZChjaGlwLCByZWcgKyBhYzk3LT5udW0gKiAweDgwLCB2YWwpOwogfQpAQCAtMzYzLDcgKzM2Niw5IEBACiAKIAlpZiAoc25kX2ludGVsOHgwbV9jb2RlY19zZW1hcGhvcmUoY2hpcCwgYWM5Ny0+bnVtKSA8IDApIHsKIAkJaWYgKCEgY2hpcC0+aW5fYWM5N19pbml0KQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZCAlZDogc2VtYXBob3JlIGlzIG5vdCByZWFkeSBmb3IgcmVnaXN0ZXIgMHgleFxuIiwgYWM5Ny0+bnVtLCByZWcpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImNvZGVjX3JlYWQgJWQ6IHNlbWFwaG9yZSBpcyBub3QgcmVhZHkgZm9yIHJlZ2lzdGVyIDB4JXhcbiIsCisJCQkJYWM5Ny0+bnVtLCByZWcpOwogCQlyZXMgPSAweGZmZmY7CiAJfSBlbHNlIHsKIAkJcmVzID0gaWFnZXR3b3JkKGNoaXAsIHJlZyArIGFjOTctPm51bSAqIDB4ODApOwpAQCAtMzcyLDcgKzM3Nyw5IEBACiAJCQlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfU1RBKSwKIAkJCQkgIHRtcCAmIH4oSUNIX1NSSXxJQ0hfUFJJfElDSF9UUkl8SUNIX0dTQ0kpKTsKIAkJCWlmICghIGNoaXAtPmluX2FjOTdfaW5pdCkKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlY19yZWFkICVkOiByZWFkIHRpbWVvdXQgZm9yIHJlZ2lzdGVyIDB4JXhcbiIsIGFjOTctPm51bSwgcmVnKTsKKwkJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkJImNvZGVjX3JlYWQgJWQ6IHJlYWQgdGltZW91dCBmb3IgcmVnaXN0ZXIgMHgleFxuIiwKKwkJCQkJYWM5Ny0+bnVtLCByZWcpOwogCQkJcmVzID0gMHhmZmZmOwogCQl9CiAJfQpAQCAtNDEyLDcgKzQxOSw3IEBACiAJCQliZGJhcltpZHggKyAxXSA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDAgfCAvKiBpbnRlcnJ1cHQgb24gY29tcGxldGlvbiAqLwogCQkJCQkJICAgICBpY2hkZXYtPmZyYWdzaXplID4+IGNoaXAtPnBjbV9wb3Nfc2hpZnQpOwogCQkJLyoKLQkJCXByaW50ayhLRVJOX0RFQlVHICJiZGJhclslaV0gPSAweCV4IFsweCV4XVxuIiwKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiYmRiYXJbJWldID0gMHgleCBbMHgleF1cbiIsCiAJCQkgICAgICAgaWR4ICsgMCwgYmRiYXJbaWR4ICsgMF0sIGJkYmFyW2lkeCArIDFdKTsKIAkJCSovCiAJCX0KQEAgLTQyNCw4ICs0MzEsOCBAQAogCWljaGRldi0+bHZpX2ZyYWcgPSBJQ0hfUkVHX0xWSV9NQVNLICUgaWNoZGV2LT5mcmFnczsKIAlpY2hkZXYtPnBvc2l0aW9uID0gMDsKICNpZiAwCi0JcHJpbnRrKEtFUk5fREVCVUcgImx2aV9mcmFnID0gJWksIGZyYWdzID0gJWksIHBlcmlvZF9zaXplID0gMHgleCwgIgotCSAgICAgICAicGVyaW9kX3NpemUxID0gMHgleFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJImx2aV9mcmFnID0gJWksIGZyYWdzID0gJWksIHBlcmlvZF9zaXplID0gMHgleCwgcGVyaW9kX3NpemUxID0gMHgleFxuIiwKIAkgICAgICAgaWNoZGV2LT5sdmlfZnJhZywgaWNoZGV2LT5mcmFncywgaWNoZGV2LT5mcmFnc2l6ZSwKIAkgICAgICAgaWNoZGV2LT5mcmFnc2l6ZTEpOwogI2VuZGlmCkBAIC00NzAsOCArNDc3LDggQEAKIAkJCQkJCQkgICAgIGljaGRldi0+bHZpX2ZyYWcgKgogCQkJCQkJCSAgICAgaWNoZGV2LT5mcmFnc2l6ZTEpOwogI2lmIDAKLQkJcHJpbnRrKEtFUk5fREVCVUcgIm5ldzogYmRiYXJbJWldID0gMHgleCBbMHgleF0sICIKLQkJICAgICAgICJwcmVmZXRjaCA9ICVpLCBhbGwgPSAweCV4LCAweCV4XG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJuZXc6IGJkYmFyWyVpXSA9IDB4JXggWzB4JXhdLCBwcmVmZXRjaCA9ICVpLCBhbGwgPSAweCV4LCAweCV4XG4iLAogCQkgICAgICAgaWNoZGV2LT5sdmkgKiAyLCBpY2hkZXYtPmJkYmFyW2ljaGRldi0+bHZpICogMl0sCiAJCSAgICAgICBpY2hkZXYtPmJkYmFyW2ljaGRldi0+bHZpICogMiArIDFdLCBpbmIoSUNIX1JFR19PRkZfUElWICsgcG9ydCksCiAJCSAgICAgICBpbmwocG9ydCArIDQpLCBpbmIocG9ydCArIElDSF9SRUdfT0ZGX0NSKSk7CkBAIC04NTAsNyArODU3LDggQEAKIAlhYzk3LnBjaSA9IGNoaXAtPnBjaTsKIAlhYzk3Lm51bSA9IGdsb2Jfc3RhICYgSUNIX1NDUiA/IDEgOiAwOwogCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZ4OTcpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGluaXRpYWxpemUgY29kZWMgIyVkXG4iLCBhYzk3Lm51bSk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIlVuYWJsZSB0byBpbml0aWFsaXplIGNvZGVjICMlZFxuIiwgYWM5Ny5udW0pOwogCQlpZiAoYWM5Ny5udW0gPT0gMCkKIAkJCWdvdG8gX19lcnI7CiAJCXJldHVybiBlcnI7CkBAIC05MDEsNyArOTA5LDcgQEAKIAkJCWdvdG8gX19vazsKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOwotCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHdhcm0gcmVzZXQgc3RpbGwgaW4gcHJvZ3Jlc3M/IFsweCV4XVxuIiwKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkFDJzk3IHdhcm0gcmVzZXQgc3RpbGwgaW4gcHJvZ3Jlc3M/IFsweCV4XVxuIiwKIAkJICAgaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX0NOVCkpKTsKIAlyZXR1cm4gLUVJTzsKIApAQCAtOTIxLDcgKzkyOSw4IEBACiAJCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKIAkJaWYgKCEgc3RhdHVzKSB7CiAJCQkvKiBubyBjb2RlYyBpcyBmb3VuZCAqLwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZHk6IGNvZGVjIGlzIG5vdCByZWFkeSBbMHgleF1cbiIsCisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiY29kZWNfcmVhZHk6IGNvZGVjIGlzIG5vdCByZWFkeSBbMHgleF1cbiIsCiAJCQkJICAgaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX1NUQSkpKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC0xMDQyLDE2ICsxMDUxLDE1IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpbnRlbDh4MG06IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2ludGVsOHgwbV9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaW50ZWw4eDBtOiB1bmFibGUgdG8gZ3JhYiBJUlEgJWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iLAorCQkJcGNpLT5pcnEpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0xMTY1LDcgKzExNzMsNyBAQAogCWVsc2UKIAkJY2hpcC0+YWRkciA9IHBjaV9pb21hcChwY2ksIDAsIDApOwogCWlmICghY2hpcC0+YWRkcikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBzcGFjZSBpb3JlbWFwIHByb2JsZW1cbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkFDJzk3IHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CiAJCXNuZF9pbnRlbDh4MG1fZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTE3NCw3ICsxMTgyLDcgQEAKIAllbHNlCiAJCWNoaXAtPmJtYWRkciA9IHBjaV9pb21hcChwY2ksIDEsIDApOwogCWlmICghY2hpcC0+Ym1hZGRyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkNvbnRyb2xsZXIgc3BhY2UgaW9yZW1hcCBwcm9ibGVtXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJDb250cm9sbGVyIHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CiAJCXNuZF9pbnRlbDh4MG1fZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTE4Miw3ICsxMTkwLDcgQEAKICBwb3J0X2luaXRlZDoKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9pbnRlbDh4MG1faW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2ludGVsOHgwbV9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTEyNDMsOCArMTI1MSw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJfaW50ZWw4eDBtID0gY2hpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTEyODMsNyArMTI4OSw3IEBACiAJaW50IGVycjsKIAlzdHJ1Y3Qgc2hvcnRuYW1lX3RhYmxlICpuYW1lOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jIGIvc291bmQvcGNpL2tvcmcxMjEyL2tvcmcxMjEyLmMKaW5kZXggOWNmOTgyOS4uOGYzNmQ3NyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2tvcmcxMjEyL2tvcmcxMjEyLmMKKysrIGIvc291bmQvcGNpL2tvcmcxMjEyL2tvcmcxMjEyLmMKQEAgLTI0MTgsOCArMjQxOCw2IEBACiAKICAgICAgICAgc25kX2tvcmcxMjEyX3Byb2NfaW5pdChrb3JnMTIxMik7CiAgICAgICAgIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogICAgICAgICAqIHJjaGlwID0ga29yZzEyMTI7CiAJcmV0dXJuIDA7CiAKQEAgLTI0NDUsNyArMjQ0Myw4IEBACiAJCWRldisrOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9Ci0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9sb2xhL2xvbGEuYyBiL3NvdW5kL3BjaS9sb2xhL2xvbGEuYwppbmRleCAwNTY4NTQwLi42ODgyNGNkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbG9sYS9sb2xhLmMKKysrIGIvc291bmQvcGNpL2xvbGEvbG9sYS5jCkBAIC03NSw3ICs3NSw3IEBACiBzdGF0aWMgaW50IGRlYnVnOwogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwogI2RlZmluZSB2ZXJib3NlX2RlYnVnKGZtdCwgYXJncy4uLikJCQlcCi0JZG8geyBpZiAoZGVidWcgPiAxKSBwcmludGsoS0VSTl9ERUJVRyBTRlggZm10LCAjI2FyZ3MpOyB9IHdoaWxlICgwKQorCWRvIHsgaWYgKGRlYnVnID4gMSkgcHJfZGVidWcoU0ZYIGZtdCwgIyNhcmdzKTsgfSB3aGlsZSAoMCkKICNlbHNlCiAjZGVmaW5lIHZlcmJvc2VfZGVidWcoZm10LCBhcmdzLi4uKQogI2VuZGlmCkBAIC0xNjgsNyArMTY4LDcgQEAKIAkJCXZlcmJvc2VfZGVidWcoImdldF9yZXNwb25zZTogJXgsICV4XG4iLAogCQkJCSAgICAgIGNoaXAtPnJlcywgY2hpcC0+cmVzX2V4KTsKIAkJCWlmIChjaGlwLT5yZXNfZXggJiBMT0xBX1JJUkJfRVhfRVJST1IpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HIFNGWCAiUklSQiBFUlJPUjogIgorCQkJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgIlJJUkIgRVJST1I6ICIKIAkJCQkgICAgICAgIk5JRD0leCwgdmVyYj0leCwgZGF0YT0leCwgZXh0PSV4XG4iLAogCQkJCSAgICAgICBjaGlwLT5sYXN0X2NtZF9uaWQsCiAJCQkJICAgICAgIGNoaXAtPmxhc3RfdmVyYiwgY2hpcC0+bGFzdF9kYXRhLApAQCAtMTgyLDkgKzE4Miw5IEBACiAJCXVkZWxheSgyMCk7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KLQlwcmludGsoS0VSTl9XQVJOSU5HIFNGWCAiUklSQiByZXNwb25zZSBlcnJvclxuIik7CisJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiUklSQiByZXNwb25zZSBlcnJvclxuIik7CiAJaWYgKCFjaGlwLT5wb2xsaW5nX21vZGUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBTRlggInN3aXRjaGluZyB0byBwb2xsaW5nIG1vZGVcbiIpOworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsICJzd2l0Y2hpbmcgdG8gcG9sbGluZyBtb2RlXG4iKTsKIAkJY2hpcC0+cG9sbGluZ19tb2RlID0gMTsKIAkJZ290byBhZ2FpbjsKIAl9CkBAIC0zMjcsNyArMzI3LDcgQEAKIAkJCWJyZWFrOwogCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF90aW1lKSk7CiAJaWYgKCFnY3RsKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBTRlggImNhbm5vdCByZXNldCBjb250cm9sbGVyXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJjYW5ub3QgcmVzZXQgY29udHJvbGxlclxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlyZXR1cm4gMDsKQEAgLTQ1Miw0MCArNDUyLDQwIEBACiAKIAllcnIgPSBsb2xhX3JlYWRfcGFyYW0oY2hpcCwgMCwgTE9MQV9QQVJfVkVORE9SX0lELCAmdmFsKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJDYW4ndCByZWFkIFZFTkRPUl9JRFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQ2FuJ3QgcmVhZCBWRU5ET1JfSURcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAl2YWwgPj49IDE2OwogCWlmICh2YWwgIT0gMHgxMzY5KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBTRlggIlVua25vd24gY29kZWMgdmVuZG9yIDB4JXhcbiIsIHZhbCk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiVW5rbm93biBjb2RlYyB2ZW5kb3IgMHgleFxuIiwgdmFsKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJZXJyID0gbG9sYV9yZWFkX3BhcmFtKGNoaXAsIDEsIExPTEFfUEFSX0ZVTkNUSU9OX1RZUEUsICZ2YWwpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBTRlggIkNhbid0IHJlYWQgRlVOQ1RJT05fVFlQRVxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQ2FuJ3QgcmVhZCBGVU5DVElPTl9UWVBFXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJaWYgKHZhbCAhPSAxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBTRlggIlVua25vd24gZnVuY3Rpb24gdHlwZSAlZFxuIiwgdmFsKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJVbmtub3duIGZ1bmN0aW9uIHR5cGUgJWRcbiIsIHZhbCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWVyciA9IGxvbGFfcmVhZF9wYXJhbShjaGlwLCAxLCBMT0xBX1BBUl9TUEVDSUZJQ19DQVBTLCAmdmFsKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJDYW4ndCByZWFkIFNQRUNDQVBTXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDYW4ndCByZWFkIFNQRUNDQVBTXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJY2hpcC0+bG9sYV9jYXBzID0gdmFsOwogCWNoaXAtPnBpbltDQVBUXS5udW1fcGlucyA9IExPTEFfQUZHX0lOUFVUX1BJTl9DT1VOVChjaGlwLT5sb2xhX2NhcHMpOwogCWNoaXAtPnBpbltQTEFZXS5udW1fcGlucyA9IExPTEFfQUZHX09VVFBVVF9QSU5fQ09VTlQoY2hpcC0+bG9sYV9jYXBzKTsKLQlzbmRfcHJpbnRkZChTRlggInNwZWNjYXBzPTB4JXgsIHBpbnMgaW49JWQsIG91dD0lZFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInNwZWNjYXBzPTB4JXgsIHBpbnMgaW49JWQsIG91dD0lZFxuIiwKIAkJICAgIGNoaXAtPmxvbGFfY2FwcywKIAkJICAgIGNoaXAtPnBpbltDQVBUXS5udW1fcGlucywgY2hpcC0+cGluW1BMQVldLm51bV9waW5zKTsKIAogCWlmIChjaGlwLT5waW5bQ0FQVF0ubnVtX3BpbnMgPiBNQVhfQVVESU9fSU5PVVRfQ09VTlQgfHwKIAkgICAgY2hpcC0+cGluW1BMQVldLm51bV9waW5zID4gTUFYX0FVRElPX0lOT1VUX0NPVU5UKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBTRlggIkludmFsaWQgTG9sYS1zcGVjIGNhcHMgMHgleFxuIiwgdmFsKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJJbnZhbGlkIExvbGEtc3BlYyBjYXBzIDB4JXhcbiIsIHZhbCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNTg2LDcgKzU4Niw2IEBACiAKIAljaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNoaXApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggImNhbm5vdCBhbGxvY2F0ZSBjaGlwXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTYwOSw3ICs2MDgsNyBAQAogCQljaGlwLT5zYW1wbGVfcmF0ZV9tYXggPSAxOTIwMDA7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIFNGWAorCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsCiAJCQkgICAiSW52YWxpZCBncmFudWxhcml0eSAlZCwgcmVzZXQgdG8gJWRcbiIsCiAJCQkgICBjaGlwLT5ncmFudWxhcml0eSwgTE9MQV9HUkFOVUxBUklUWV9NQVgpOwogCQljaGlwLT5ncmFudWxhcml0eSA9IExPTEFfR1JBTlVMQVJJVFlfTUFYOwpAQCAtNjE4LDcgKzYxNyw3IEBACiAJfQogCWNoaXAtPnNhbXBsZV9yYXRlX21pbiA9IHNhbXBsZV9yYXRlX21pbltkZXZdOwogCWlmIChjaGlwLT5zYW1wbGVfcmF0ZV9taW4gPiBjaGlwLT5zYW1wbGVfcmF0ZV9tYXgpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgU0ZYCisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwKIAkJCSAgICJJbnZhbGlkIHNhbXBsZV9yYXRlX21pbiAlZCwgcmVzZXQgdG8gMTYwMDBcbiIsCiAJCQkgICBjaGlwLT5zYW1wbGVfcmF0ZV9taW4pOwogCQljaGlwLT5zYW1wbGVfcmF0ZV9taW4gPSAxNjAwMDsKQEAgLTYzNiw3ICs2MzUsNyBAQAogCWNoaXAtPmJhclsxXS5hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMik7CiAJY2hpcC0+YmFyWzFdLnJlbWFwX2FkZHIgPSBwY2lfaW9yZW1hcF9iYXIocGNpLCAyKTsKIAlpZiAoIWNoaXAtPmJhclswXS5yZW1hcF9hZGRyIHx8ICFjaGlwLT5iYXJbMV0ucmVtYXBfYWRkcikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiaW9yZW1hcCBlcnJvclxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiaW9yZW1hcCBlcnJvclxuIik7CiAJCWVyciA9IC1FTlhJTzsKIAkJZ290byBlcnJvdXQ7CiAJfQpAQCAtNjQ5LDcgKzY0OCw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIGxvbGFfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIGVycm91dDsKIAl9CkBAIC02NjAsNyArNjU5LDcgQEAKIAljaGlwLT5wY21bQ0FQVF0ubnVtX3N0cmVhbXMgPSAoZGV2ZXIgPj4gMCkgJiAweDNmZjsKIAljaGlwLT5wY21bUExBWV0ubnVtX3N0cmVhbXMgPSAoZGV2ZXIgPj4gMTApICYgMHgzZmY7CiAJY2hpcC0+dmVyc2lvbiA9IChkZXZlciA+PiAyNCkgJiAweGZmOwotCXNuZF9wcmludGRkKFNGWCAic3RyZWFtcyBpbj0lZCwgb3V0PSVkLCB2ZXJzaW9uPTB4JXhcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzdHJlYW1zIGluPSVkLCBvdXQ9JWQsIHZlcnNpb249MHgleFxuIiwKIAkJICAgIGNoaXAtPnBjbVtDQVBUXS5udW1fc3RyZWFtcywgY2hpcC0+cGNtW1BMQVldLm51bV9zdHJlYW1zLAogCQkgICAgY2hpcC0+dmVyc2lvbik7CiAKQEAgLTY2OSw3ICs2NjgsNyBAQAogCSAgICBjaGlwLT5wY21bUExBWV0ubnVtX3N0cmVhbXMgPiBNQVhfU1RSRUFNX09VVF9DT1VOVCB8fAogCSAgICAoIWNoaXAtPnBjbVtDQVBUXS5udW1fc3RyZWFtcyAmJgogCSAgICAgIWNoaXAtPnBjbVtQTEFZXS5udW1fc3RyZWFtcykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiaW52YWxpZCBERVZFUiA9ICV4XG4iLCBkZXZlcik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiaW52YWxpZCBERVZFUiA9ICV4XG4iLCBkZXZlcik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyb3V0OwogCX0KQEAgLTY4MCw3ICs2NzksNyBAQAogCiAJZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiRXJyb3IgY3JlYXRpbmcgZGV2aWNlIFtjYXJkXSFcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkVycm9yIGNyZWF0aW5nIGRldmljZSBbY2FyZF0hXG4iKTsKIAkJZ290byBlcnJvdXQ7CiAJfQogCkBAIC03MTcsMTQgKzcxNiwxMyBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiRXJyb3IgY3JlYXRpbmcgY2FyZCFcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkVycm9yIGNyZWF0aW5nIGNhcmQhXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAllcnIgPSBsb2xhX2NyZWF0ZShjYXJkLCBwY2ksIGRldiwgJmNoaXApOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dF9mcmVlOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2xvbGEvbG9sYV9jbG9jay5jIGIvc291bmQvcGNpL2xvbGEvbG9sYV9jbG9jay5jCmluZGV4IGViMWQ2YjkuLjJiZWY2YjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9sb2xhL2xvbGFfY2xvY2suYworKysgYi9zb3VuZC9wY2kvbG9sYS9sb2xhX2Nsb2NrLmMKQEAgLTEyOCwyMSArMTI4LDIxIEBACiAKIAllcnIgPSBsb2xhX3JlYWRfcGFyYW0oY2hpcCwgbmlkLCBMT0xBX1BBUl9BVURJT19XSURHRVRfQ0FQLCAmdmFsKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJDYW4ndCByZWFkIHdjYXBzIGZvciAweCV4XG4iLCBuaWQpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkNhbid0IHJlYWQgd2NhcHMgZm9yIDB4JXhcbiIsIG5pZCk7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJaWYgKCh2YWwgJiAweGZmZjAwMDAwKSAhPSAweDAxZjAwMDAwKSB7IC8qIHRlc3QgU3ViVHlwZSBhbmQgVHlwZSAqLwotCQlzbmRfcHJpbnRkZCgiTm8gdmFsaWQgY2xvY2sgd2lkZ2V0XG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJObyB2YWxpZCBjbG9jayB3aWRnZXRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAljaGlwLT5jbG9jay5uaWQgPSBuaWQ7CiAJY2hpcC0+Y2xvY2suaXRlbXMgPSB2YWwgJiAweGZmOwotCXNuZF9wcmludGRkKCJjbG9ja19saXN0IG5pZD0leCwgZW50cmllcz0lZFxuIiwgbmlkLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiY2xvY2tfbGlzdCBuaWQ9JXgsIGVudHJpZXM9JWRcbiIsIG5pZCwKIAkJICAgIGNoaXAtPmNsb2NrLml0ZW1zKTsKIAlpZiAoY2hpcC0+Y2xvY2suaXRlbXMgPiBNQVhfU0FNUExFX0NMT0NLX0NPVU5UKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBTRlggIkNMT0NLX0xJU1QgdG9vIGJpZzogJWRcbiIsCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQ0xPQ0tfTElTVCB0b28gYmlnOiAlZFxuIiwKIAkJICAgICAgIGNoaXAtPmNsb2NrLml0ZW1zKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTU4LDcgKzE1OCw3IEBACiAJCWVyciA9IGxvbGFfY29kZWNfcmVhZChjaGlwLCBuaWQsIExPTEFfVkVSQl9HRVRfQ0xPQ0tfTElTVCwKIAkJCQkgICAgICBpZHgsIDAsICZ2YWwsICZyZXNfZXgpOwogCQlpZiAoZXJyIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiQ2FuJ3QgcmVhZCBDTE9DS19MSVNUXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQ2FuJ3QgcmVhZCBDTE9DS19MSVNUXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTIyMyw3ICsyMjMsNyBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWlmIChyZXMpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBTRlggImVycm9yIGluIGVuYWJsZV9jbG9ja19ldmVudHMgJWRcbiIsCisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImVycm9yIGluIGVuYWJsZV9jbG9ja19ldmVudHMgJWRcbiIsCiAJCSAgICAgICByZXMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yNDIsNyArMjQyLDcgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlpZiAocmVzKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgU0ZYICJlcnJvciBpbiBzZXRfY2xvY2sgJWRcbiIsIHJlcyk7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImVycm9yIGluIHNldF9jbG9jayAlZFxuIiwgcmVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2xvbGEvbG9sYV9taXhlci5jIGIvc291bmQvcGNpL2xvbGEvbG9sYV9taXhlci5jCmluZGV4IDUyYzhkNmIuLjc4MmY0ZDggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9sb2xhL2xvbGFfbWl4ZXIuYworKysgYi9zb3VuZC9wY2kvbG9sYS9sb2xhX21peGVyLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAlwaW4tPm5pZCA9IG5pZDsKIAllcnIgPSBsb2xhX3JlYWRfcGFyYW0oY2hpcCwgbmlkLCBMT0xBX1BBUl9BVURJT19XSURHRVRfQ0FQLCAmdmFsKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJDYW4ndCByZWFkIHdjYXBzIGZvciAweCV4XG4iLCBuaWQpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkNhbid0IHJlYWQgd2NhcHMgZm9yIDB4JXhcbiIsIG5pZCk7CiAJCXJldHVybiBlcnI7CiAJfQogCXZhbCAmPSAweDAwZjAwZmZmOyAvKiB0ZXN0IFRZUEUgYW5kIGJpdHMgMC4uMTEgKi8KQEAgLTQ4LDcgKzQ4LDcgQEAKIAllbHNlIGlmICh2YWwgPT0gMHgwMDQwMDAwYyAmJiBkaXIgPT0gUExBWSkgLyogRGlnPTAsIE91dEFtcC9vdnJkICovCiAJCXBpbi0+aXNfYW5hbG9nID0gdHJ1ZTsKIAllbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiSW52YWxpZCB3Y2FwcyAweCV4IGZvciAweCV4XG4iLCB2YWwsIG5pZCk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiSW52YWxpZCB3Y2FwcyAweCV4IGZvciAweCV4XG4iLCB2YWwsIG5pZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNjIsNyArNjIsNyBAQAogCWVsc2UKIAkJZXJyID0gbG9sYV9yZWFkX3BhcmFtKGNoaXAsIG5pZCwgTE9MQV9QQVJfQU1QX0lOX0NBUCwgJnZhbCk7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiQ2FuJ3QgcmVhZCBBTVAtY2FwcyBmb3IgMHgleFxuIiwgbmlkKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDYW4ndCByZWFkIEFNUC1jYXBzIGZvciAweCV4XG4iLCBuaWQpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNzksNyArNzksNyBAQAogCWVyciA9IGxvbGFfY29kZWNfcmVhZChjaGlwLCBuaWQsIExPTEFfVkVSQl9HRVRfTUFYX0xFVkVMLCAwLCAwLCAmdmFsLAogCQkJICAgICAgTlVMTCk7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiQ2FuJ3QgZ2V0IE1BWF9MRVZFTCAweCV4XG4iLCBuaWQpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkNhbid0IGdldCBNQVhfTEVWRUwgMHgleFxuIiwgbmlkKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcGluLT5tYXhfbGV2ZWwgPSB2YWwgJiAweDNmZjsgICAvKiAxMCBiaXRzICovCkBAIC0xMTksMTIgKzExOSwxMiBAQAogCiAJZXJyID0gbG9sYV9yZWFkX3BhcmFtKGNoaXAsIG5pZCwgTE9MQV9QQVJfQVVESU9fV0lER0VUX0NBUCwgJnZhbCk7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiQ2FuJ3QgcmVhZCB3Y2FwcyBmb3IgMHgleFxuIiwgbmlkKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDYW4ndCByZWFkIHdjYXBzIGZvciAweCV4XG4iLCBuaWQpOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCWlmICgodmFsICYgMHhmZmYwMDAwMCkgIT0gMHgwMmYwMDAwMCkgeyAvKiB0ZXN0IFN1YlR5cGUgYW5kIFR5cGUgKi8KLQkJc25kX3ByaW50ZGQoIk5vIHZhbGlkIG1peGVyIHdpZGdldFxuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiTm8gdmFsaWQgbWl4ZXIgd2lkZ2V0XG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yMDIsNyArMjAyLDcgQEAKIAkgKi8KIAlpZiAoY2hpcC0+bWl4ZXIuc3JjX3N0cmVhbV9vdXRfb2ZzID4gTUFYX0FVRElPX0lOT1VUX0NPVU5UIHx8CiAJICAgIGNoaXAtPm1peGVyLmRlc3RfcGh5c19vdXRfb2ZzID4gTUFYX1NUUkVBTV9JTl9DT1VOVCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJJbnZhbGlkIG1peGVyIHdpZGdldCBzaXplXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJJbnZhbGlkIG1peGVyIHdpZGdldCBzaXplXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMTMsNyArMjEzLDcgQEAKIAkJKCgoMVUgPDwgY2hpcC0+bWl4ZXIuZGVzdF9waHlzX291dHMpIC0gMSkKIAkJIDw8IGNoaXAtPm1peGVyLmRlc3RfcGh5c19vdXRfb2ZzKTsKIAotCXNuZF9wcmludGRkKCJNaXhlciBzcmNfbWFzaz0leCwgZGVzdF9tYXNrPSV4XG4iLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiTWl4ZXIgc3JjX21hc2s9JXgsIGRlc3RfbWFzaz0leFxuIiwKIAkJICAgIGNoaXAtPm1peGVyLnNyY19tYXNrLCBjaGlwLT5taXhlci5kZXN0X21hc2spOwogCiAJcmV0dXJuIDA7CkBAIC0yMzYsNyArMjM2LDggQEAKIAkgICAgKGdhaW4gPT0gcmVhZHcoJmNoaXAtPm1peGVyLmFycmF5LT5zcmNfZ2FpbltpZF0pKSkKIAkJcmV0dXJuIDA7CiAKLQlzbmRfcHJpbnRkZCgibG9sYV9taXhlcl9zZXRfc3JjX2dhaW4gKGlkPSVkLCBnYWluPSVkKSBlbmFibGU9JXhcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJsb2xhX21peGVyX3NldF9zcmNfZ2FpbiAoaWQ9JWQsIGdhaW49JWQpIGVuYWJsZT0leFxuIiwKIAkJCWlkLCBnYWluLCB2YWwpOwogCXdyaXRldyhnYWluLCAmY2hpcC0+bWl4ZXIuYXJyYXktPnNyY19nYWluW2lkXSk7CiAJd3JpdGVsKHZhbCwgJmNoaXAtPm1peGVyLmFycmF5LT5zcmNfZ2Fpbl9lbmFibGUpOwpAQCAtNDA5LDcgKzQxMCw4IEBACiAJCXJldHVybiAwOwogCWlmIChleHRlcm5hbF9jYWxsKQogCQlsb2xhX2NvZGVjX2ZsdXNoKGNoaXApOwotCXNuZF9wcmludGRkKCJzZXRfYW5hbG9nX3ZvbHVtZSAoZGlyPSVkIGlkeD0lZCwgdm9sdW1lPSVkKVxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJInNldF9hbmFsb2dfdm9sdW1lIChkaXI9JWQgaWR4PSVkLCB2b2x1bWU9JWQpXG4iLAogCQkJZGlyLCBpZHgsIHZhbCk7CiAJZXJyID0gbG9sYV9jb2RlY193cml0ZShjaGlwLCBwaW4tPm5pZCwKIAkJCSAgICAgICBMT0xBX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIHZhbCwgMCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbG9sYS9sb2xhX3BjbS5jIGIvc291bmQvcGNpL2xvbGEvbG9sYV9wY20uYwppbmRleCA1ZWE4NWU4Li4zYmQ2OTg1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbG9sYS9sb2xhX3BjbS5jCisrKyBiL3NvdW5kL3BjaS9sb2xhL2xvbGFfcGNtLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCQkJcmV0dXJuOwogCQltc2xlZXAoMSk7CiAJfQotCXByaW50ayhLRVJOX1dBUk5JTkcgU0ZYICJTUlNUIG5vdCBjbGVhciAoc3RyZWFtICVkKVxuIiwgc3RyLT5kc2QpOworCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgIlNSU1Qgbm90IGNsZWFyIChzdHJlYW0gJWQpXG4iLCBzdHItPmRzZCk7CiB9CiAKIHN0YXRpYyBpbnQgbG9sYV9zdHJlYW1fd2FpdF9mb3JfZmlmbyhzdHJ1Y3QgbG9sYSAqY2hpcCwKQEAgLTExOCw3ICsxMTgsNyBAQAogCQkJcmV0dXJuIDA7CiAJCW1zbGVlcCgxKTsKIAl9Ci0JcHJpbnRrKEtFUk5fV0FSTklORyBTRlggIkZJRk8gbm90IHJlYWR5IChzdHJlYW0gJWQpXG4iLCBzdHItPmRzZCk7CisJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiRklGTyBub3QgcmVhZHkgKHN0cmVhbSAlZClcbiIsIHN0ci0+ZHNkKTsKIAlyZXR1cm4gLUVJTzsKIH0KIApAQCAtMTU2LDcgKzE1Niw3IEBACiAJCQlyZXR1cm4gMDsKIAkJbXNsZWVwKDEpOwogCX0KLQlwcmludGsoS0VSTl9XQVJOSU5HIFNGWCAiRklGTyBub3QgcmVhZHkgKHBlbmRpbmcgJWQpXG4iLCBwZW5kaW5nIC0gMSk7CisJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiRklGTyBub3QgcmVhZHkgKHBlbmRpbmcgJWQpXG4iLCBwZW5kaW5nIC0gMSk7CiAJcmV0dXJuIC1FSU87CiB9CiAKQEAgLTM3Myw3ICszNzMsNyBAQAogCXJldHVybiAwOwogCiAgZXJyb3I6Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiBTRlggIlRvbyBtYW55IEJETCBlbnRyaWVzOiBidWZmZXI9JWQsIHBlcmlvZD0lZFxuIiwKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIlRvbyBtYW55IEJETCBlbnRyaWVzOiBidWZmZXI9JWQsIHBlcmlvZD0lZFxuIiwKIAkJICAgc3RyLT5idWZzaXplLCBwZXJpb2RfYnl0ZXMpOwogCXJldHVybiAtRUlOVkFMOwogfQpAQCAtNDE1LDcgKzQxNSw3IEBACiAJZXJyID0gbG9sYV9jb2RlY19yZWFkKGNoaXAsIHN0ci0+bmlkLCBMT0xBX1ZFUkJfU0VUX1NUUkVBTV9GT1JNQVQsCiAJCQkgICAgICBzdHItPmZvcm1hdF92ZXJiLCAwLCAmdmFsLCBOVUxMKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJDYW5ub3Qgc2V0IHN0cmVhbSBmb3JtYXQgMHgleFxuIiwKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDYW5ub3Qgc2V0IHN0cmVhbSBmb3JtYXQgMHgleFxuIiwKIAkJICAgICAgIHN0ci0+Zm9ybWF0X3ZlcmIpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTQyNyw3ICs0MjcsOCBAQAogCQkJCSAgICAgIExPTEFfVkVSQl9TRVRfQ0hBTk5FTF9TVFJFQU1JRCwgMCwgdmVyYiwKIAkJCQkgICAgICAmdmFsLCBOVUxMKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiBTRlggIkNhbm5vdCBzZXQgc3RyZWFtIGNoYW5uZWwgJWRcbiIsIGkpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJIkNhbm5vdCBzZXQgc3RyZWFtIGNoYW5uZWwgJWRcbiIsIGkpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KQEAgLTY1MSwxMyArNjUyLDE0IEBACiAJCXN0ci0+ZHNkICs9IE1BWF9TVFJFQU1fSU5fQ09VTlQ7CiAJZXJyID0gbG9sYV9yZWFkX3BhcmFtKGNoaXAsIG5pZCwgTE9MQV9QQVJfQVVESU9fV0lER0VUX0NBUCwgJnZhbCk7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiQ2FuJ3QgcmVhZCB3Y2FwcyBmb3IgMHgleFxuIiwgbmlkKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDYW4ndCByZWFkIHdjYXBzIGZvciAweCV4XG4iLCBuaWQpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlpZiAoZGlyID09IFBMQVkpIHsKIAkJLyogdGVzdCBUWVBFIGFuZCBiaXRzIDAuLjExIChubyB0ZXN0IGJpdDkgOiBEaWdpdGFsID0gMC8xKSAqLwogCQlpZiAoKHZhbCAmIDB4MDBmMDBkZmYpICE9IDB4MDAwMDAwMTApIHsKLQkJCXByaW50ayhLRVJOX0VSUiBTRlggIkludmFsaWQgd2NhcHMgMHgleCBmb3IgMHgleFxuIiwKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJJbnZhbGlkIHdjYXBzIDB4JXggZm9yIDB4JXhcbiIsCiAJCQkgICAgICAgdmFsLCBuaWQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTY2Niw3ICs2NjgsOCBAQAogCQkgKiAoYnVnIDogaWdub3JlIGJpdDg6IENvbm4gbGlzdCA9IDAvMSkKIAkJICovCiAJCWlmICgodmFsICYgMHgwMGYwMGNmZikgIT0gMHgwMDEwMDAxMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiSW52YWxpZCB3Y2FwcyAweCV4IGZvciAweCV4XG4iLAorCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJIkludmFsaWQgd2NhcHMgMHgleCBmb3IgMHgleFxuIiwKIAkJCSAgICAgICB2YWwsIG5pZCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtNjc3LDE0ICs2ODAsMTUgQEAKIAogCWVyciA9IGxvbGFfcmVhZF9wYXJhbShjaGlwLCBuaWQsIExPTEFfUEFSX1NUUkVBTV9GT1JNQVRTLCAmdmFsKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJDYW4ndCByZWFkIEZPUk1BVFMgMHgleFxuIiwgbmlkKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDYW4ndCByZWFkIEZPUk1BVFMgMHgleFxuIiwgbmlkKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJdmFsICY9IDM7CiAJaWYgKHZhbCA9PSAzKQogCQlzdHItPmNhbl9mbG9hdCA9IHRydWU7CiAJaWYgKCEodmFsICYgMSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiSW52YWxpZCBmb3JtYXRzIDB4JXggZm9yIDB4JXgiLCB2YWwsIG5pZCk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIkludmFsaWQgZm9ybWF0cyAweCV4IGZvciAweCV4IiwgdmFsLCBuaWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbHg2NDY0ZXMvbHg2NDY0ZXMuYyBiL3NvdW5kL3BjaS9seDY0NjRlcy9seDY0NjRlcy5jCmluZGV4IDVmY2FhYTYuLjI3ZjYwY2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9seDY0NjRlcy9seDY0NjRlcy5jCisrKyBiL3NvdW5kL3BjaS9seDY0NjRlcy9seDY0NjRlcy5jCkBAIC0xMTIsMTYgKzExMiwxNiBAQAogCiAJc25kX3BjbV91ZnJhbWVzX3QgcGVyaW9kX3NpemUgPSBydW50aW1lLT5wZXJpb2Rfc2l6ZTsKIAotCXNuZF9wcmludGQoTFhQICJhbGxvY2F0aW5nIHBpcGUgZm9yICVkIGNoYW5uZWxzXG4iLCBjaGFubmVscyk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJhbGxvY2F0aW5nIHBpcGUgZm9yICVkIGNoYW5uZWxzXG4iLCBjaGFubmVscyk7CiAJZXJyID0gbHhfcGlwZV9hbGxvY2F0ZShjaGlwLCAwLCBpc19jYXB0dXJlLCBjaGFubmVscyk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgImFsbG9jYXRpbmcgcGlwZSBmYWlsZWRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgTFhQICJhbGxvY2F0aW5nIHBpcGUgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKIAllcnIgPSBseF9zZXRfZ3JhbnVsYXJpdHkoY2hpcCwgcGVyaW9kX3NpemUpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJzZXR0aW5nIGdyYW51bGFyaXR5IHRvICVsZCBmYWlsZWRcbiIsCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAic2V0dGluZyBncmFudWxhcml0eSB0byAlbGQgZmFpbGVkXG4iLAogCQkJICAgcGVyaW9kX3NpemUpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTEzNiwyNCArMTM2LDI0IEBACiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlpbnQgaXNfY2FwdHVyZSA9IChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOwogCi0Jc25kX3ByaW50ZChMWFAgInNldHRpbmcgc3RyZWFtIGZvcm1hdFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzZXR0aW5nIHN0cmVhbSBmb3JtYXRcbiIpOwogCWVyciA9IGx4X3N0cmVhbV9zZXRfZm9ybWF0KGNoaXAsIHJ1bnRpbWUsIDAsIGlzX2NhcHR1cmUpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJzZXR0aW5nIHN0cmVhbSBmb3JtYXQgZmFpbGVkXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJzZXR0aW5nIHN0cmVhbSBmb3JtYXQgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfcHJpbnRkKExYUCAic3RhcnRpbmcgcGlwZVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzdGFydGluZyBwaXBlXG4iKTsKIAllcnIgPSBseF9waXBlX3N0YXJ0KGNoaXAsIDAsIGlzX2NhcHR1cmUpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJzdGFydGluZyBwaXBlIGZhaWxlZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAic3RhcnRpbmcgcGlwZSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9wcmludGQoTFhQICJ3YWl0aW5nIGZvciBwaXBlIHRvIHN0YXJ0XG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIndhaXRpbmcgZm9yIHBpcGUgdG8gc3RhcnRcbiIpOwogCWVyciA9IGx4X3BpcGVfd2FpdF9mb3Jfc3RhcnQoY2hpcCwgMCwgaXNfY2FwdHVyZSk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgIndhaXRpbmcgZm9yIHBpcGUgZmFpbGVkXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJ3YWl0aW5nIGZvciBwaXBlIGZhaWxlZFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xNjcsMjQgKzE2NywyNCBAQAogCWludCBlcnIgPSAwOwogCWludCBpc19jYXB0dXJlID0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CiAKLQlzbmRfcHJpbnRkKExYUCAicGF1c2luZyBwaXBlXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInBhdXNpbmcgcGlwZVxuIik7CiAJZXJyID0gbHhfcGlwZV9wYXVzZShjaGlwLCAwLCBpc19jYXB0dXJlKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAicGF1c2luZyBwaXBlIGZhaWxlZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAicGF1c2luZyBwaXBlIGZhaWxlZFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX3ByaW50ZChMWFAgIndhaXRpbmcgZm9yIHBpcGUgdG8gYmVjb21lIGlkbGVcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAid2FpdGluZyBmb3IgcGlwZSB0byBiZWNvbWUgaWRsZVxuIik7CiAJZXJyID0gbHhfcGlwZV93YWl0X2Zvcl9pZGxlKGNoaXAsIDAsIGlzX2NhcHR1cmUpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJ3YWl0aW5nIGZvciBwaXBlIGZhaWxlZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAid2FpdGluZyBmb3IgcGlwZSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9wcmludGQoTFhQICJzdG9wcGluZyBwaXBlXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInN0b3BwaW5nIHBpcGVcbiIpOwogCWVyciA9IGx4X3BpcGVfc3RvcChjaGlwLCAwLCBpc19jYXB0dXJlKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKExYUCAic3RvcHBpbmcgcGlwZSBmYWlsZWRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgInN0b3BwaW5nIHBpcGUgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTE5OCwxMCArMTk4LDEwIEBACiAJaW50IGVyciA9IDA7CiAJaW50IGlzX2NhcHR1cmUgPSAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKTsKIAotCXNuZF9wcmludGQoTFhQICJyZWxlYXNpbmcgcGlwZVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJyZWxlYXNpbmcgcGlwZVxuIik7CiAJZXJyID0gbHhfcGlwZV9yZWxlYXNlKGNoaXAsIDAsIGlzX2NhcHR1cmUpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoTFhQICJyZWxlYXNpbmcgcGlwZSBmYWlsZWRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgInJlbGVhc2luZyBwaXBlIGZhaWxlZFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0yMTYsNyArMjE2LDcgQEAKIAlpbnQgZXJyID0gMDsKIAlpbnQgYm9hcmRfcmF0ZTsKIAotCXNuZF9wcmludGRkKCItPmx4X3BjbV9vcGVuXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfcGNtX29wZW5cbiIpOwogCW11dGV4X2xvY2soJmNoaXAtPnNldHVwX211dGV4KTsKIAogCS8qIGNvcHkgdGhlIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHN0cnVjdCAqLwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwKIAkJCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyBMWFAgImNvdWxkIG5vdCBjb25zdHJhaW4gcGVyaW9kc1xuIik7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImNvdWxkIG5vdCBjb25zdHJhaW4gcGVyaW9kc1xuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAjZW5kaWYKQEAgLTIzOCw3ICsyMzgsNyBAQAogCQkJCQkgICBib2FyZF9yYXRlLCBib2FyZF9yYXRlKTsKIAogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIExYUCAiY291bGQgbm90IGNvbnN0cmFpbiBwZXJpb2RzXG4iKTsKKwkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiY291bGQgbm90IGNvbnN0cmFpbiBwZXJpb2RzXG4iKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMjQ4LDcgKzI0OCw3IEBACiAJCQkJCSAgIE1JQ1JPQkxBWkVfSUJMX01JTiwKIAkJCQkJICAgTUlDUk9CTEFaRV9JQkxfTUFYKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyBMWFAKKwkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LAogCQkJICAgImNvdWxkIG5vdCBjb25zdHJhaW4gcGVyaW9kIHNpemVcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMjYzLDE0ICsyNjMsMTQgQEAKIAlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBjaGlwOwogCiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5zZXR1cF9tdXRleCk7Ci0Jc25kX3ByaW50ZGQoIjwtbHhfcGNtX29wZW4sICVkXG4iLCBlcnIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiPC1seF9wY21fb3BlbiwgJWRcbiIsIGVycik7CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBseF9wY21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJaW50IGVyciA9IDA7Ci0Jc25kX3ByaW50ZGQoIi0+bHhfcGNtX2Nsb3NlXG4iKTsKKwlkZXZfZGJnKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsICItPmx4X3BjbV9jbG9zZVxuIik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMjg1LDEzICsyODUsMTMgQEAKIAlzdHJ1Y3QgbHhfc3RyZWFtICpseF9zdHJlYW0gPSBpc19jYXB0dXJlID8gJmNoaXAtPmNhcHR1cmVfc3RyZWFtIDoKIAkJJmNoaXAtPnBsYXliYWNrX3N0cmVhbTsKIAotCXNuZF9wcmludGRkKCItPmx4X3BjbV9zdHJlYW1fcG9pbnRlclxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICItPmx4X3BjbV9zdHJlYW1fcG9pbnRlclxuIik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+bG9jaywgZmxhZ3MpOwogCXBvcyA9IGx4X3N0cmVhbS0+ZnJhbWVfcG9zICogc3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2Rfc2l6ZTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5sb2NrLCBmbGFncyk7CiAKLQlzbmRfcHJpbnRkZChMWFAgInN0cmVhbV9wb2ludGVyIGF0ICVsZFxuIiwgcG9zKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInN0cmVhbV9wb2ludGVyIGF0ICVsZFxuIiwgcG9zKTsKIAlyZXR1cm4gcG9zOwogfQogCkBAIC0zMDEsMzcgKzMwMSwzNyBAQAogCWludCBlcnIgPSAwOwogCWNvbnN0IGludCBpc19jYXB0dXJlID0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CiAKLQlzbmRfcHJpbnRkZCgiLT5seF9wY21fcHJlcGFyZVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICItPmx4X3BjbV9wcmVwYXJlXG4iKTsKIAogCW11dGV4X2xvY2soJmNoaXAtPnNldHVwX211dGV4KTsKIAogCWlmIChjaGlwLT5oYXJkd2FyZV9ydW5uaW5nW2lzX2NhcHR1cmVdKSB7CiAJCWVyciA9IGx4X2hhcmR3YXJlX3N0b3AoY2hpcCwgc3Vic3RyZWFtKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJmYWlsZWQgdG8gc3RvcCBoYXJkd2FyZS4gIgorCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJmYWlsZWQgdG8gc3RvcCBoYXJkd2FyZS4gIgogCQkJCSAgICJFcnJvciBjb2RlICVkXG4iLCBlcnIpOwogCQkJZ290byBleGl0OwogCQl9CiAKIAkJZXJyID0gbHhfaGFyZHdhcmVfY2xvc2UoY2hpcCwgc3Vic3RyZWFtKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJmYWlsZWQgdG8gY2xvc2UgaGFyZHdhcmUuICIKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiZmFpbGVkIHRvIGNsb3NlIGhhcmR3YXJlLiAiCiAJCQkJICAgIkVycm9yIGNvZGUgJWRcbiIsIGVycik7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAl9CiAKLQlzbmRfcHJpbnRkKExYUCAib3BlbmluZyBoYXJkd2FyZVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJvcGVuaW5nIGhhcmR3YXJlXG4iKTsKIAllcnIgPSBseF9oYXJkd2FyZV9vcGVuKGNoaXAsIHN1YnN0cmVhbSk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgImZhaWxlZCB0byBvcGVuIGhhcmR3YXJlLiAiCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiZmFpbGVkIHRvIG9wZW4gaGFyZHdhcmUuICIKIAkJCSAgICJFcnJvciBjb2RlICVkXG4iLCBlcnIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJZXJyID0gbHhfaGFyZHdhcmVfc3RhcnQoY2hpcCwgc3Vic3RyZWFtKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAiZmFpbGVkIHRvIHN0YXJ0IGhhcmR3YXJlLiAiCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiZmFpbGVkIHRvIHN0YXJ0IGhhcmR3YXJlLiAiCiAJCQkgICAiRXJyb3IgY29kZSAlZFxuIiwgZXJyKTsKIAkJZ290byBleGl0OwogCX0KQEAgLTM1NCw3ICszNTQsNyBAQAogCXN0cnVjdCBseDY0NjRlcyAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlpbnQgZXJyID0gMDsKIAotCXNuZF9wcmludGRkKCItPmx4X3BjbV9od19wYXJhbXNcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiLT5seF9wY21faHdfcGFyYW1zXG4iKTsKIAogCW11dGV4X2xvY2soJmNoaXAtPnNldHVwX211dGV4KTsKIApAQCAtMzg5LDIwICszODksMjAgQEAKIAlpbnQgZXJyID0gMDsKIAlpbnQgaXNfY2FwdHVyZSA9IChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOwogCi0Jc25kX3ByaW50ZGQoIi0+bHhfcGNtX2h3X2ZyZWVcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiLT5seF9wY21faHdfZnJlZVxuIik7CiAJbXV0ZXhfbG9jaygmY2hpcC0+c2V0dXBfbXV0ZXgpOwogCiAJaWYgKGNoaXAtPmhhcmR3YXJlX3J1bm5pbmdbaXNfY2FwdHVyZV0pIHsKIAkJZXJyID0gbHhfaGFyZHdhcmVfc3RvcChjaGlwLCBzdWJzdHJlYW0pOwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgImZhaWxlZCB0byBzdG9wIGhhcmR3YXJlLiAiCisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImZhaWxlZCB0byBzdG9wIGhhcmR3YXJlLiAiCiAJCQkJICAgIkVycm9yIGNvZGUgJWRcbiIsIGVycik7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAogCQllcnIgPSBseF9oYXJkd2FyZV9jbG9zZShjaGlwLCBzdWJzdHJlYW0pOwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgImZhaWxlZCB0byBjbG9zZSBoYXJkd2FyZS4gIgorCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJmYWlsZWQgdG8gY2xvc2UgaGFyZHdhcmUuICIKIAkJCQkgICAiRXJyb3IgY29kZSAlZFxuIiwgZXJyKTsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtNDQ2LDI1ICs0NDYsMjUgQEAKIAogCQllcnIgPSBseF9idWZmZXJfYXNrKGNoaXAsIDAsIGlzX2NhcHR1cmUsICZuZWVkZWQsICZmcmVlZCwKIAkJCQkgICAgc2l6ZV9hcnJheSk7Ci0JCXNuZF9wcmludGRkKExYUCAic3RhcnRpbmc6IG5lZWRlZCAlZCwgZnJlZWQgJWRcbiIsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAic3RhcnRpbmc6IG5lZWRlZCAlZCwgZnJlZWQgJWRcbiIsCiAJCQkgICAgbmVlZGVkLCBmcmVlZCk7CiAKIAkJZXJyID0gbHhfYnVmZmVyX2dpdmUoY2hpcCwgMCwgaXNfY2FwdHVyZSwgcGVyaW9kX2J5dGVzLAogCQkJCSAgICAgbG93ZXJfMzJfYml0cyhidWYpLCB1cHBlcl8zMl9iaXRzKGJ1ZiksCiAJCQkJICAgICAmYnVmZmVyX2luZGV4KTsKIAotCQlzbmRfcHJpbnRkZChMWFAgInN0YXJ0aW5nOiBidWZmZXIgaW5kZXggJXggb24gMHglbHggKCVkIGJ5dGVzKVxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzdGFydGluZzogYnVmZmVyIGluZGV4ICV4IG9uIDB4JWx4ICglZCBieXRlcylcbiIsCiAJCQkgICAgYnVmZmVyX2luZGV4LCAodW5zaWduZWQgbG9uZylidWYsIHBlcmlvZF9ieXRlcyk7CiAJCWJ1ZiArPSBwZXJpb2RfYnl0ZXM7CiAJfQogCiAJZXJyID0gbHhfYnVmZmVyX2FzayhjaGlwLCAwLCBpc19jYXB0dXJlLCAmbmVlZGVkLCAmZnJlZWQsIHNpemVfYXJyYXkpOwotCXNuZF9wcmludGRkKExYUCAic3RhcnRpbmc6IG5lZWRlZCAlZCwgZnJlZWQgJWRcbiIsIG5lZWRlZCwgZnJlZWQpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAic3RhcnRpbmc6IG5lZWRlZCAlZCwgZnJlZWQgJWRcbiIsIG5lZWRlZCwgZnJlZWQpOwogCi0Jc25kX3ByaW50ZChMWFAgInN0YXJ0aW5nOiBzdGFydGluZyBzdHJlYW1cbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAic3RhcnRpbmc6IHN0YXJ0aW5nIHN0cmVhbVxuIik7CiAJZXJyID0gbHhfc3RyZWFtX3N0YXJ0KGNoaXAsIDAsIGlzX2NhcHR1cmUpOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAiY291bGRuJ3Qgc3RhcnQgc3RyZWFtXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJjb3VsZG4ndCBzdGFydCBzdHJlYW1cbiIpOwogCWVsc2UKIAkJbHhfc3RyZWFtLT5zdGF0dXMgPSBMWF9TVFJFQU1fU1RBVFVTX1JVTk5JTkc7CiAKQEAgLTQ3NiwxMCArNDc2LDEwIEBACiAJY29uc3QgdW5zaWduZWQgaW50IGlzX2NhcHR1cmUgPSBseF9zdHJlYW0tPmlzX2NhcHR1cmU7CiAJaW50IGVycjsKIAotCXNuZF9wcmludGQoTFhQICJzdG9wcGluZzogc3RvcHBpbmcgc3RyZWFtXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInN0b3BwaW5nOiBzdG9wcGluZyBzdHJlYW1cbiIpOwogCWVyciA9IGx4X3N0cmVhbV9zdG9wKGNoaXAsIDAsIGlzX2NhcHR1cmUpOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAiY291bGRuJ3Qgc3RvcCBzdHJlYW1cbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNvdWxkbid0IHN0b3Agc3RyZWFtXG4iKTsKIAllbHNlCiAJCWx4X3N0cmVhbS0+c3RhdHVzID0gTFhfU1RSRUFNX1NUQVRVU19GUkVFOwogCkBAIC01MDcsNyArNTA3LDcgQEAKIAlzdHJ1Y3QgbHg2NDY0ZXMgKmNoaXAgPSAoc3RydWN0IGx4NjQ2NGVzICopZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc25kX3ByaW50ZGQoIi0+bHhfdHJpZ2dlcl90YXNrbGV0XG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfdHJpZ2dlcl90YXNrbGV0XG4iKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5sb2NrLCBmbGFncyk7CiAJbHhfdHJpZ2dlcl90YXNrbGV0X2Rpc3BhdGNoX3N0cmVhbShjaGlwLCAmY2hpcC0+Y2FwdHVyZV9zdHJlYW0pOwpAQCAtNTQ3LDE0ICs1NDcsMTQgQEAKIAlzdHJ1Y3QgbHhfc3RyZWFtICpzdHJlYW0gPSBpc19jYXB0dXJlID8gJmNoaXAtPmNhcHR1cmVfc3RyZWFtIDoKIAkJJmNoaXAtPnBsYXliYWNrX3N0cmVhbTsKIAotCXNuZF9wcmludGRkKCItPmx4X3BjbV90cmlnZ2VyXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfcGNtX3RyaWdnZXJcbiIpOwogCiAJcmV0dXJuIGx4X3BjbV90cmlnZ2VyX2Rpc3BhdGNoKGNoaXAsIHN0cmVhbSwgY21kKTsKIH0KIAogc3RhdGljIGludCBzbmRfbHg2NDY0ZXNfZnJlZShzdHJ1Y3QgbHg2NDY0ZXMgKmNoaXApCiB7Ci0Jc25kX3ByaW50ZGQoIi0+c25kX2x4NjQ2NGVzX2ZyZWVcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiLT5zbmRfbHg2NDY0ZXNfZnJlZVxuIik7CiAKIAlseF9pcnFfZGlzYWJsZShjaGlwKTsKIApAQCAtNTgzLDcgKzU4Myw3IEBACiAJaW50IGk7CiAJdTMyIHBseF9yZWcgPSBseF9wbHhfcmVnX3JlYWQoY2hpcCwgZVBMWF9DSElQU0MpOwogCi0Jc25kX3ByaW50ZGQoIi0+bHhfaW5pdF94aWxpbnhfcmVzZXRcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiLT5seF9pbml0X3hpbGlueF9yZXNldFxuIik7CiAKIAkvKiBhY3RpdmF0ZSByZXNldCBvZiB4aWxpbnggKi8KIAlwbHhfcmVnICY9IH5DSElQU0NfUkVTRVRfWElMSU5YOwpAQCAtNjAzLDggKzYwMyw4IEBACiAJCW1zbGVlcCgxMCk7CiAJCXJlZ19tYm94MyA9IGx4X3BseF9yZWdfcmVhZChjaGlwLCBlUExYX01CT1gzKTsKIAkJaWYgKHJlZ19tYm94MykgewotCQkJc25kX3ByaW50ZChMWFAgInhpbGlueCByZXNldCBkb25lXG4iKTsKLQkJCXNuZF9wcmludGRkKExYUCAieGlsaW54IHRvb2sgJWQgbG9vcHNcbiIsIGkpOworCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJ4aWxpbnggcmVzZXQgZG9uZVxuIik7CisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInhpbGlueCB0b29rICVkIGxvb3BzXG4iLCBpKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNjI0LDcgKzYyNCw3IEBACiB7CiAJdTMyIHJlZzsKIAotCXNuZF9wcmludGRkKCItPmx4X2luaXRfeGlsaW54X3Rlc3RcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiLT5seF9pbml0X3hpbGlueF90ZXN0XG4iKTsKIAogCS8qIFRFU1QgaWYgd2UgaGF2ZSBhY2Nlc3MgdG8gWGlsaW54L01pY3JvQmxhemUgKi8KIAlseF9kc3BfcmVnX3dyaXRlKGNoaXAsIGVSZWdfQ1NNLCAwKTsKQEAgLTYzMiwxOSArNjMyLDE5IEBACiAJcmVnID0gbHhfZHNwX3JlZ19yZWFkKGNoaXAsIGVSZWdfQ1NNKTsKIAogCWlmIChyZWcpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgIlByb2JsZW06IFJlZ19DU00gJXguXG4iLCByZWcpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIlByb2JsZW06IFJlZ19DU00gJXguXG4iLCByZWcpOwogCiAJCS8qIFBDSTkwNTZfU1BBQ0UwX1JFTUFQICovCiAJCWx4X3BseF9yZWdfd3JpdGUoY2hpcCwgZVBMWF9QQ0lDUiwgMSk7CiAKIAkJcmVnID0gbHhfZHNwX3JlZ19yZWFkKGNoaXAsIGVSZWdfQ1NNKTsKIAkJaWYgKHJlZykgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgIkVycm9yOiBSZWdfQ1NNICV4LlxuIiwgcmVnKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiRXJyb3I6IFJlZ19DU00gJXguXG4iLCByZWcpOwogCQkJcmV0dXJuIC1FQUdBSU47IC8qIHNlZW1zIHRvIGJlIGFwcHJvcHJpYXRlICovCiAJCX0KIAl9CiAKLQlzbmRfcHJpbnRkKExYUCAiWGlsaW54L01pY3JvQmxhemUgYWNjZXNzIHRlc3Qgc3VjY2Vzc2Z1bFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJYaWxpbngvTWljcm9CbGF6ZSBhY2Nlc3MgdGVzdCBzdWNjZXNzZnVsXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjYxLDcgKzY2MSw3IEBACiAJCSg2NCA8PCBJT0NSX09VVFBVVFNfT0ZGU0VUKSB8CiAJCShGUkVRX1JBVElPX1NJTkdMRV9NT0RFIDw8IEZSRVFfUkFUSU9fT0ZGU0VUKTsKIAotCXNuZF9wcmludGRkKCItPmx4X2luaXRfZXRoZXJzb3VuZFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICItPmx4X2luaXRfZXRoZXJzb3VuZFxuIik7CiAKIAljaGlwLT5mcmVxX3JhdGlvID0gRlJFUV9SQVRJT19TSU5HTEVfTU9ERTsKIApAQCAtNjc1LDE4ICs2NzUsMTggQEAKIAogCWZvciAoaSA9IDA7IGkgIT0gMTAwMDsgKytpKSB7CiAJCWlmIChseF9kc3BfcmVnX3JlYWQoY2hpcCwgZVJlZ19DU0VTKSAmIDQpIHsKLQkJCXNuZF9wcmludGQoTFhQICJldGhlcnNvdW5kIGluaXRpYWxpemVkIGFmdGVyICVkbXNcbiIsCisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImV0aGVyc291bmQgaW5pdGlhbGl6ZWQgYWZ0ZXIgJWRtc1xuIiwKIAkJCQkgICBpKTsKIAkJCWdvdG8gZXRoZXJzb3VuZF9pbml0aWFsaXplZDsKIAkJfQogCQltc2xlZXAoMSk7CiAJfQotCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIExYUAorCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwKIAkJICAgImV0aGVyc291bmQgY291bGQgbm90IGJlIGluaXRpYWxpemVkIGFmdGVyICVkbXNcbiIsIGkpOwogCXJldHVybiAtRVRJTUVET1VUOwogCiAgZXRoZXJzb3VuZF9pbml0aWFsaXplZDoKLQlzbmRfcHJpbnRkKExYUCAiZXRoZXJzb3VuZCBpbml0aWFsaXplZFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJldGhlcnNvdW5kIGluaXRpYWxpemVkXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjk2LDE0ICs2OTYsMTQgQEAKIAogCWludCBlcnI7CiAKLQlzbmRfcHJpbnRkZCgiLT5seF9pbml0X2dldF92ZXJzaW9uX2ZlYXR1cmVzXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfaW5pdF9nZXRfdmVyc2lvbl9mZWF0dXJlc1xuIik7CiAKIAllcnIgPSBseF9kc3BfZ2V0X3ZlcnNpb24oY2hpcCwgJmRzcF92ZXJzaW9uKTsKIAogCWlmIChlcnIgPT0gMCkgewogCQl1MzIgZnJlcTsKIAotCQlzbmRfcHJpbnRrKExYUCAiRFNQIHZlcnNpb246IFYlMDJkLiUwMmQgIyVkXG4iLAorCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsICJEU1AgdmVyc2lvbjogViUwMmQuJTAyZCAjJWRcbiIsCiAJCQkgICAoZHNwX3ZlcnNpb24+PjE2KSAmIDB4ZmYsIChkc3BfdmVyc2lvbj4+OCkgJiAweGZmLAogCQkJICAgZHNwX3ZlcnNpb24gJiAweGZmKTsKIApAQCAtNzE4LDkgKzcxOCw5IEBACiAJCWVyciA9IGx4X2RzcF9nZXRfY2xvY2tfZnJlcXVlbmN5KGNoaXAsICZmcmVxKTsKIAkJaWYgKGVyciA9PSAwKQogCQkJY2hpcC0+Ym9hcmRfc2FtcGxlX3JhdGUgPSBmcmVxOwotCQlzbmRfcHJpbnRkKExYUCAiYWN0dWFsIGNsb2NrIGZyZXF1ZW5jeSAlZFxuIiwgZnJlcSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiYWN0dWFsIGNsb2NrIGZyZXF1ZW5jeSAlZFxuIiwgZnJlcSk7CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgIkRTUCBjb3JydXB0ZWQgXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJEU1AgY29ycnVwdGVkIFxuIik7CiAJCWVyciA9IC1FQUdBSU47CiAJfQogCkBAIC03MzIsNyArNzMyLDcgQEAKIAlpbnQgZXJyID0gMDsKIAl1MzIgc25hcHBlZF9ncmFuID0gTUlDUk9CTEFaRV9JQkxfTUlOOwogCi0Jc25kX3ByaW50ZGQoIi0+bHhfc2V0X2dyYW51bGFyaXR5XG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfc2V0X2dyYW51bGFyaXR5XG4iKTsKIAogCS8qIGJsb2Nrc2l6ZSBpcyBhIHBvd2VyIG9mIDIgKi8KIAl3aGlsZSAoKHNuYXBwZWRfZ3JhbiA8IGdyYW4pICYmCkBAIC03NDUsMTQgKzc0NSwxNCBAQAogCiAJZXJyID0gbHhfZHNwX3NldF9ncmFudWxhcml0eShjaGlwLCBzbmFwcGVkX2dyYW4pOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIExYUCAiY291bGQgbm90IHNldCBncmFudWxhcml0eVxuIik7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImNvdWxkIG5vdCBzZXQgZ3JhbnVsYXJpdHlcbiIpOwogCQllcnIgPSAtRUFHQUlOOwogCX0KIAogCWlmIChzbmFwcGVkX2dyYW4gIT0gZ3JhbikKLQkJc25kX3ByaW50ayhMWFAgInNuYXBwZWQgYmxvY2tzaXplIHRvICVkXG4iLCBzbmFwcGVkX2dyYW4pOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgInNuYXBwZWQgYmxvY2tzaXplIHRvICVkXG4iLCBzbmFwcGVkX2dyYW4pOwogCi0Jc25kX3ByaW50ZChMWFAgInNldCBibG9ja3NpemUgb24gYm9hcmQgJWRcbiIsIHNuYXBwZWRfZ3Jhbik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzZXQgYmxvY2tzaXplIG9uIGJvYXJkICVkXG4iLCBzbmFwcGVkX2dyYW4pOwogCWNoaXAtPnBjbV9ncmFudWxhcml0eSA9IHNuYXBwZWRfZ3JhbjsKIAogCXJldHVybiBlcnI7CkBAIC03NjQsMTkgKzc2NCwxOSBAQAogCWludCBlcnI7CiAJaW50IGk7CiAKLQlzbmRfcHJpbnRkZCgiLT5seF9pbml0X2RzcFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICItPmx4X2luaXRfZHNwXG4iKTsKIAotCXNuZF9wcmludGQoTFhQICJpbml0aWFsaXplIGJvYXJkXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImluaXRpYWxpemUgYm9hcmRcbiIpOwogCWVyciA9IGx4X2luaXRfeGlsaW54X3Jlc2V0KGNoaXApOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlzbmRfcHJpbnRkKExYUCAidGVzdGluZyBib2FyZFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJ0ZXN0aW5nIGJvYXJkXG4iKTsKIAllcnIgPSBseF9pbml0X3hpbGlueF90ZXN0KGNoaXApOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlzbmRfcHJpbnRkKExYUCAiaW5pdGlhbGl6ZSBldGhlcnNvdW5kIGNvbmZpZ3VyYXRpb25cbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiaW5pdGlhbGl6ZSBldGhlcnNvdW5kIGNvbmZpZ3VyYXRpb25cbiIpOwogCWVyciA9IGx4X2luaXRfZXRoZXJzb3VuZF9jb25maWcoY2hpcCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTc5Nyw4ICs3OTcsOSBAQAogCXJldHVybiAtRVRJTUVET1VUOwogCiBtYWNfcmVhZHk6Ci0Jc25kX3ByaW50ZChMWFAgIm1hYyBhZGRyZXNzIHJlYWR5IHJlYWQgYWZ0ZXI6ICVkbXNcbiIsIGkpOwotCXNuZF9wcmludGsoTFhQICJtYWMgYWRkcmVzczogJTAyWC4lMDJYLiUwMlguJTAyWC4lMDJYLiUwMlhcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJtYWMgYWRkcmVzcyByZWFkeSByZWFkIGFmdGVyOiAlZG1zXG4iLCBpKTsKKwlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsCisJCSAibWFjIGFkZHJlc3M6ICUwMlguJTAyWC4lMDJYLiUwMlguJTAyWC4lMDJYXG4iLAogCQkgICBjaGlwLT5tYWNfYWRkcmVzc1swXSwgY2hpcC0+bWFjX2FkZHJlc3NbMV0sIGNoaXAtPm1hY19hZGRyZXNzWzJdLAogCQkgICBjaGlwLT5tYWNfYWRkcmVzc1szXSwgY2hpcC0+bWFjX2FkZHJlc3NbNF0sIGNoaXAtPm1hY19hZGRyZXNzWzVdKTsKIApAQCAtOTc3LDcgKzk3OCw3IEBACiAJCS5kZXZfZnJlZSA9IHNuZF9seDY0NjRlc19kZXZfZnJlZSwKIAl9OwogCi0Jc25kX3ByaW50ZGQoIi0+c25kX2x4NjQ2NGVzX2NyZWF0ZVxuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICItPnNuZF9seDY0NjRlc19jcmVhdGVcbiIpOwogCiAJKnJjaGlwID0gTlVMTDsKIApAQCAtOTkxLDggKzk5Miw4IEBACiAJLyogY2hlY2sgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDMyIGJpdHMgKi8KIAllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgIgotCQkJICAgIjMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMzJiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC0xMDM0LDcgKzEwMzUsNyBAQAogCWVyciA9IHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBseF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJICBLQlVJTERfTU9ETkFNRSwgY2hpcCk7CiAJaWYgKGVycikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCWdvdG8gcmVxdWVzdF9pcnFfZmFpbGVkOwogCX0KIAljaGlwLT5pcnEgPSBwY2ktPmlycTsKQEAgLTEwNDUsNyArMTA0Niw3IEBACiAKIAllcnIgPSBseF9pbml0X2RzcChjaGlwKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAiZXJyb3IgZHVyaW5nIERTUCBpbml0aWFsaXphdGlvblxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiZXJyb3IgZHVyaW5nIERTUCBpbml0aWFsaXphdGlvblxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xMDYyLDggKzEwNjMsNiBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJjaGlwID0gY2hpcDsKIAlyZXR1cm4gMDsKIApAQCAtMTA5MCw3ICsxMDg5LDcgQEAKIAlzdHJ1Y3QgbHg2NDY0ZXMgKmNoaXA7CiAJaW50IGVycjsKIAotCXNuZF9wcmludGRkKCItPnNuZF9seDY0NjRlc19wcm9iZVxuIik7CisJZGV2X2RiZygmcGNpLT5kZXYsICItPnNuZF9seDY0NjRlc19wcm9iZVxuIik7CiAKIAlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTEwOTksMTMgKzEwOTgsMTQgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKIAllcnIgPSBzbmRfbHg2NDY0ZXNfY3JlYXRlKGNhcmQsIHBjaSwgJmNoaXApOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJlcnJvciBkdXJpbmcgc25kX2x4NjQ2NGVzX2NyZWF0ZVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiZXJyb3IgZHVyaW5nIHNuZF9seDY0NjRlc19jcmVhdGVcbiIpOwogCQlnb3RvIG91dF9mcmVlOwogCX0KIApAQCAtMTEyNSw3ICsxMTI1LDcgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXRfZnJlZTsKIAotCXNuZF9wcmludGRkKExYUCAiaW5pdGlhbGl6YXRpb24gc3VjY2Vzc2Z1bFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJpbml0aWFsaXphdGlvbiBzdWNjZXNzZnVsXG4iKTsKIAlwY2lfc2V0X2RydmRhdGEocGNpLCBjYXJkKTsKIAlkZXYrKzsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9seDY0NjRlcy9seF9jb3JlLmMgYi9zb3VuZC9wY2kvbHg2NDY0ZXMvbHhfY29yZS5jCmluZGV4IDYyNmVjYWQuLjJkOGU5NWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9seDY0NjRlcy9seF9jb3JlLmMKKysrIGIvc291bmQvcGNpL2x4NjQ2NGVzL2x4X2NvcmUuYwpAQCAtMTQxLDYzICsxNDEsNiBAQAogCWlvd3JpdGUzMihkYXRhLCBhZGRyZXNzKTsKIH0KIAotdTMyIGx4X3BseF9tYm94X3JlYWQoc3RydWN0IGx4NjQ2NGVzICpjaGlwLCBpbnQgbWJveF9ucikKLXsKLQlpbnQgaW5kZXg7Ci0KLQlzd2l0Y2ggKG1ib3hfbnIpIHsKLQljYXNlIDE6Ci0JCWluZGV4ID0gZVBMWF9NQk9YMTsgICAgYnJlYWs7Ci0JY2FzZSAyOgotCQlpbmRleCA9IGVQTFhfTUJPWDI7ICAgIGJyZWFrOwotCWNhc2UgMzoKLQkJaW5kZXggPSBlUExYX01CT1gzOyAgICBicmVhazsKLQljYXNlIDQ6Ci0JCWluZGV4ID0gZVBMWF9NQk9YNDsgICAgYnJlYWs7Ci0JY2FzZSA1OgotCQlpbmRleCA9IGVQTFhfTUJPWDU7ICAgIGJyZWFrOwotCWNhc2UgNjoKLQkJaW5kZXggPSBlUExYX01CT1g2OyAgICBicmVhazsKLQljYXNlIDc6Ci0JCWluZGV4ID0gZVBMWF9NQk9YNzsgICAgYnJlYWs7Ci0JY2FzZSAwOgkJCS8qIHJlc2VydmVkIGZvciBIRiBmbGFncyAqLwotCQlzbmRfQlVHKCk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIDB4ZGVhZGJlZWY7Ci0JfQotCi0JcmV0dXJuIGx4X3BseF9yZWdfcmVhZChjaGlwLCBpbmRleCk7Ci19Ci0KLWludCBseF9wbHhfbWJveF93cml0ZShzdHJ1Y3QgbHg2NDY0ZXMgKmNoaXAsIGludCBtYm94X25yLCB1MzIgdmFsdWUpCi17Ci0JaW50IGluZGV4ID0gLTE7Ci0KLQlzd2l0Y2ggKG1ib3hfbnIpIHsKLQljYXNlIDE6Ci0JCWluZGV4ID0gZVBMWF9NQk9YMTsgICAgYnJlYWs7Ci0JY2FzZSAzOgotCQlpbmRleCA9IGVQTFhfTUJPWDM7ICAgIGJyZWFrOwotCWNhc2UgNDoKLQkJaW5kZXggPSBlUExYX01CT1g0OyAgICBicmVhazsKLQljYXNlIDU6Ci0JCWluZGV4ID0gZVBMWF9NQk9YNTsgICAgYnJlYWs7Ci0JY2FzZSA2OgotCQlpbmRleCA9IGVQTFhfTUJPWDY7ICAgIGJyZWFrOwotCWNhc2UgNzoKLQkJaW5kZXggPSBlUExYX01CT1g3OyAgICBicmVhazsKLQljYXNlIDA6CQkJLyogcmVzZXJ2ZWQgZm9yIEhGIGZsYWdzICovCi0JY2FzZSAyOgkJCS8qIHJlc2VydmVkIGZvciBQaXBlIFN0YXRlcwotCQkJCSAqIHRoZSBEU1Aga2VlcHMgYW4gaW1hZ2Ugb2YgaXQgKi8KLQkJc25kX0JVRygpOwotCQlyZXR1cm4gLUVCQURSUUM7Ci0JfQotCi0JbHhfcGx4X3JlZ193cml0ZShjaGlwLCBpbmRleCwgdmFsdWUpOwotCXJldHVybiAwOwotfQotCi0KIC8qIHJtaCAqLwogCiAjaWZkZWYgQ09ORklHX1NORF9ERUJVRwpAQCAtMzMwLDcgKzI3Myw3IEBACiAJaW50IGR3bG9vcDsKIAogCWlmIChseF9kc3BfcmVnX3JlYWQoY2hpcCwgZVJlZ19DU00pICYgKFJlZ19DU01fTUMgfCBSZWdfQ1NNX01SKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAiUElPU2VuZE1lc3NhZ2UgZVJlZ19DU00gJXhcbiIsIHJlZyk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiUElPU2VuZE1lc3NhZ2UgZVJlZ19DU00gJXhcbiIsIHJlZyk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC0zNTEsNyArMjk0LDcgQEAKIAkJfSBlbHNlCiAJCQl1ZGVsYXkoMSk7CiAJfQotCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIExYUCAiVElNRU9VVCBseF9tZXNzYWdlX3NlbmRfYXRvbWljISAiCisJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiVElNRU9VVCBseF9tZXNzYWdlX3NlbmRfYXRvbWljISAiCiAJCSAgICJwb2xsaW5nIGZhaWxlZFxuIik7CiAKIHBvbGxpbmdfc3VjY2Vzc2Z1bDoKQEAgLTM2MywxOCArMzA2LDE4IEBACiAJCQkJCSAgIHJtaC0+c3RhdF9sZW4pOwogCQl9CiAJfSBlbHNlCi0JCXNuZF9wcmludGsoTFhQICJybWggZXJyb3I6ICUwOHhcbiIsIHJlZyk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAicm1oIGVycm9yOiAlMDh4XG4iLCByZWcpOwogCiAJLyogY2xlYXIgUmVnX0NTTV9NUiAqLwogCWx4X2RzcF9yZWdfd3JpdGUoY2hpcCwgZVJlZ19DU00sIDApOwogCiAJc3dpdGNoIChyZWcpIHsKIAljYXNlIEVEX0RTUF9USU1FRF9PVVQ6Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIExYUCAibHhfbWVzc2FnZV9zZW5kOiBkc3AgdGltZW91dFxuIik7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImx4X21lc3NhZ2Vfc2VuZDogZHNwIHRpbWVvdXRcbiIpOwogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAogCWNhc2UgRURfRFNQX0NSQVNIRUQ6Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIExYUCAibHhfbWVzc2FnZV9zZW5kOiBkc3AgY3Jhc2hlZFxuIik7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImx4X21lc3NhZ2Vfc2VuZDogZHNwIGNyYXNoZWRcbiIpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKQEAgLTQ5MSwzMyArNDM0LDYgQEAKICNkZWZpbmUgQ1NFU19CUk9BRENBU1QgICAgICAweDAwMDIKICNkZWZpbmUgQ1NFU19VUERBVEVfTERTViAgICAweDAwMDQKIAotaW50IGx4X2RzcF9lc19jaGVja19waXBlbGluZShzdHJ1Y3QgbHg2NDY0ZXMgKmNoaXApCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpICE9IENTRVNfVElNRU9VVDsgKytpKSB7Ci0JCS8qCi0JCSAqIGxlIGJpdCBDU0VTX1VQREFURV9MRFNWIGVzdCDDg8KgIDEgZMODwqlzIHF1ZSBsZSBtYWNwcm9nCi0JCSAqIGVzdCBwcmV0LiBpbCByZS1wYXNzZSDDg8KgIDAgbG9yc3F1ZSBsZSBwcmVtaWVyIHJlYWQgYQotCQkgKiDDg8KpdMODwqkgZmFpdC4gcG91ciBsJ2luc3RhbnQgb24gcmV0aXJlIGxlIHRlc3QgY2FyIGNlIGJpdAotCQkgKiBwYXNzZSBhIDEgZW52aXJvbiAyMDAgw4PCoCA0MDAgbXMgYXByw4PCqXMgcXVlIGxlIHJlZ2lzdHJlCi0JCSAqIGNvbmZFUyDDg8KgIMODwql0w4PCqSDDg8KpY3JpdCAoa2ljayBkdSB4aWxpbnggRVMpLgotCQkgKgotCQkgKiBPbiBuZSB0ZXN0ZSBxdWUgbGUgYml0IENFLgotCQkgKiAqLwotCi0JCXUzMiBjc2VzID0gbHhfZHNwX3JlZ19yZWFkKGNoaXAsIGVSZWdfQ1NFUyk7Ci0KLQkJaWYgKChjc2VzICYgQ1NFU19DRSkgPT0gMCkKLQkJCXJldHVybiAwOwotCi0JCXVkZWxheSgxKTsKLQl9Ci0KLQlyZXR1cm4gLUVUSU1FRE9VVDsKLX0KLQotCiAjZGVmaW5lIFBJUEVfSU5GT19UT19DTUQoY2FwdHVyZSwgcGlwZSkJCQkJCVwKIAkoKHUzMikoKHUzMikocGlwZSkgfCAoKGNhcHR1cmUpID8gSURfSVNfQ0FQVFVSRSA6IDBMKSkgPDwgSURfT0ZGU0VUKQogCkBAIC01NDIsNyArNDU4LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5tc2dfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGVyciAhPSAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJseDY0NjRlczogY291bGQgbm90IGFsbG9jYXRlIHBpcGVcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBwaXBlXG4iKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC02MDQsMTEgKzUyMCwxMyBAQAogCQl9CiAKICNpZiAwCi0JCXNuZF9wcmludGRkKExYUCAiQ01EXzA4X0FTS19CVUZGRVJTOiBuZWVkZWQgJWQsIGZyZWVkICVkXG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJDTURfMDhfQVNLX0JVRkZFUlM6IG5lZWRlZCAlZCwgZnJlZWQgJWRcbiIsCiAJCQkgICAgKnJfbmVlZGVkLCAqcl9mcmVlZCk7CiAJCWZvciAoaSA9IDA7IGkgPCBNQVhfU1RSRUFNX0JVRkZFUjsgKytpKSB7CiAJCQlmb3IgKGkgPSAwOyBpICE9IGNoaXAtPnJtaC5zdGF0X2xlbjsgKytpKQotCQkJCXNuZF9wcmludGRkKCIgIHN0YXRbJWRdOiAleCwgJXhcbiIsIGksCisJCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJCSIgIHN0YXRbJWRdOiAleCwgJXhcbiIsIGksCiAJCQkJCSAgICBjaGlwLT5ybWguc3RhdFtpXSwKIAkJCQkJICAgIGNoaXAtPnJtaC5zdGF0W2ldICYgTUFTS19EQVRBX1NJWkUpOwogCQl9CkBAIC03MDEsOCArNjE5LDggQEAKIAllcnIgPSBseF9tZXNzYWdlX3NlbmRfYXRvbWljKGNoaXAsICZjaGlwLT5ybWgpOyAvKiBkb24ndCBzbGVlcCEgKi8KIAogCWlmIChlcnIgIT0gMCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUgotCQkJICAgImx4NjQ2NGVzOiBjb3VsZCBub3QgcXVlcnkgcGlwZSdzIHNhbXBsZSBjb3VudFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImNvdWxkIG5vdCBxdWVyeSBwaXBlJ3Mgc2FtcGxlIGNvdW50XG4iKTsKIAllbHNlIHsKIAkJKnJzYW1wbGVfY291bnQgPSAoKHU2NCkoY2hpcC0+cm1oLnN0YXRbMF0gJiBNQVNLX1NQTF9DT1VOVF9ISSkKIAkJCQkgIDw8IDI0KSAgICAgLyogaGkgcGFydCAqLwpAQCAtNzI4LDcgKzY0Niw3IEBACiAJZXJyID0gbHhfbWVzc2FnZV9zZW5kX2F0b21pYyhjaGlwLCAmY2hpcC0+cm1oKTsKIAogCWlmIChlcnIgIT0gMCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAibHg2NDY0ZXM6IGNvdWxkIG5vdCBxdWVyeSBwaXBlJ3Mgc3RhdGVcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNvdWxkIG5vdCBxdWVyeSBwaXBlJ3Mgc3RhdGVcbiIpOwogCWVsc2UKIAkJKnJzdGF0ZSA9IChjaGlwLT5ybWguc3RhdFswXSA+PiBQU1RBVEVfT0ZGU0VUKSAmIDB4MEY7CiAKQEAgLTgwMSw3ICs3MTksNyBAQAogCXUzMiBjaGFubmVscyA9IHJ1bnRpbWUtPmNoYW5uZWxzOwogCiAJaWYgKHJ1bnRpbWUtPmNoYW5uZWxzICE9IGNoYW5uZWxzKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAiY2hhbm5lbCBjb3VudCBtaXNtYXRjaDogJWQgdnMgJWQiLAorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNoYW5uZWwgY291bnQgbWlzbWF0Y2g6ICVkIHZzICVkIiwKIAkJCSAgIHJ1bnRpbWUtPmNoYW5uZWxzLCBjaGFubmVscyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+bXNnX2xvY2ssIGZsYWdzKTsKQEAgLTkwNCwxMyArODIyLDE2IEBACiAJfQogCiAJaWYgKGVyciA9PSBFQl9SQlVGRkVSU19UQUJMRV9PVkVSRkxPVykKLQkJc25kX3ByaW50ayhMWFAgImx4X2J1ZmZlcl9naXZlIEVCX1JCVUZGRVJTX1RBQkxFX09WRVJGTE9XXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkibHhfYnVmZmVyX2dpdmUgRUJfUkJVRkZFUlNfVEFCTEVfT1ZFUkZMT1dcbiIpOwogCiAJaWYgKGVyciA9PSBFQl9JTlZBTElEX1NUUkVBTSkKLQkJc25kX3ByaW50ayhMWFAgImx4X2J1ZmZlcl9naXZlIEVCX0lOVkFMSURfU1RSRUFNXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkibHhfYnVmZmVyX2dpdmUgRUJfSU5WQUxJRF9TVFJFQU1cbiIpOwogCiAJaWYgKGVyciA9PSBFQl9DTURfUkVGVVNFRCkKLQkJc25kX3ByaW50ayhMWFAgImx4X2J1ZmZlcl9naXZlIEVCX0NNRF9SRUZVU0VEXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkibHhfYnVmZmVyX2dpdmUgRUJfQ01EX1JFRlVTRURcbiIpOwogCiAgZG9uZToKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5tc2dfbG9jaywgZmxhZ3MpOwpAQCAtOTgzLDcgKzkwNCw4IEBACiAJY2hpcC0+cm1oLmNtZFsxXSA9ICh1MzIpKG11dGVfbWFzayA+PiAodTY0KTMyKTsJICAgICAgIC8qIGhpIHBhcnQgKi8KIAljaGlwLT5ybWguY21kWzJdID0gKHUzMikobXV0ZV9tYXNrICYgKHU2NCkweEZGRkZGRkZGKTsgLyogbG8gcGFydCAqLwogCi0Jc25kX3ByaW50aygibXV0ZSAleCAleCAleFxuIiwgY2hpcC0+cm1oLmNtZFswXSwgY2hpcC0+cm1oLmNtZFsxXSwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJIm11dGUgJXggJXggJXhcbiIsIGNoaXAtPnJtaC5jbWRbMF0sIGNoaXAtPnJtaC5jbWRbMV0sCiAJCSAgIGNoaXAtPnJtaC5jbWRbMl0pOwogCiAJZXJyID0gbHhfbWVzc2FnZV9zZW5kX2F0b21pYyhjaGlwLCAmY2hpcC0+cm1oKTsKQEAgLTEwOTMsNyArMTAxNSw3IEBACiAJfQogCiAJaWYgKGlycV9hc3luYykgewotCQkvKiBzbmRfcHJpbnRkKCJpbnRlcnJ1cHQ6IGFzeW5jIGV2ZW50IHBlbmRpbmdcbiIpOyAqLworCQkvKiBkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImludGVycnVwdDogYXN5bmMgZXZlbnQgcGVuZGluZ1xuIik7ICovCiAJCSpyX2FzeW5jX3BlbmRpbmcgPSAxOwogCX0KIApAQCAtMTEzOSwxMyArMTA2MSwxMyBAQAogCWlmIChlYl9wZW5kaW5nX2luKSB7CiAJCSpyX25vdGlmaWVkX2luX3BpcGVfbWFzayA9ICgodTY0KXN0YXRbM10gPDwgMzIpCiAJCQkrIHN0YXRbNF07Ci0JCXNuZF9wcmludGRkKExYUCAiaW50ZXJydXB0OiBFT0JJIHBlbmRpbmcgJWxseFxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJpbnRlcnJ1cHQ6IEVPQkkgcGVuZGluZyAlbGx4XG4iLAogCQkJICAgICpyX25vdGlmaWVkX2luX3BpcGVfbWFzayk7CiAJfQogCWlmIChlYl9wZW5kaW5nX291dCkgewogCQkqcl9ub3RpZmllZF9vdXRfcGlwZV9tYXNrID0gKCh1NjQpc3RhdFsxXSA8PCAzMikKIAkJCSsgc3RhdFsyXTsKLQkJc25kX3ByaW50ZGQoTFhQICJpbnRlcnJ1cHQ6IEVPQk8gcGVuZGluZyAlbGx4XG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImludGVycnVwdDogRU9CTyBwZW5kaW5nICVsbHhcbiIsCiAJCQkgICAgKnJfbm90aWZpZWRfb3V0X3BpcGVfbWFzayk7CiAJfQogCkBAIC0xMTgxLDE3ICsxMTAzLDE5IEBACiAJdTMyIG5lZWRlZCwgZnJlZWQ7CiAJdTMyIHNpemVfYXJyYXlbTUFYX1NUUkVBTV9CVUZGRVJdOwogCi0Jc25kX3ByaW50ZGQoIi0+bHhfaW50ZXJydXB0X3JlcXVlc3RfbmV3X2J1ZmZlclxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICItPmx4X2ludGVycnVwdF9yZXF1ZXN0X25ld19idWZmZXJcbiIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmxvY2ssIGZsYWdzKTsKIAogCWVyciA9IGx4X2J1ZmZlcl9hc2soY2hpcCwgMCwgaXNfY2FwdHVyZSwgJm5lZWRlZCwgJmZyZWVkLCBzaXplX2FycmF5KTsKLQlzbmRfcHJpbnRkZChMWFAgImludGVycnVwdDogbmVlZGVkICVkLCBmcmVlZCAlZFxuIiwgbmVlZGVkLCBmcmVlZCk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJpbnRlcnJ1cHQ6IG5lZWRlZCAlZCwgZnJlZWQgJWRcbiIsIG5lZWRlZCwgZnJlZWQpOwogCiAJdW5wYWNrX3BvaW50ZXIoYnVmLCAmYnVmX2xvLCAmYnVmX2hpKTsKIAllcnIgPSBseF9idWZmZXJfZ2l2ZShjaGlwLCAwLCBpc19jYXB0dXJlLCBwZXJpb2RfYnl0ZXMsIGJ1Zl9sbywgYnVmX2hpLAogCQkJICAgICAmYnVmZmVyX2luZGV4KTsKLQlzbmRfcHJpbnRkZChMWFAgImludGVycnVwdDogZ2F2ZSBidWZmZXIgaW5kZXggJXggb24gMHglbHggKCVkIGJ5dGVzKVxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJImludGVycnVwdDogZ2F2ZSBidWZmZXIgaW5kZXggJXggb24gMHglbHggKCVkIGJ5dGVzKVxuIiwKIAkJICAgIGJ1ZmZlcl9pbmRleCwgKHVuc2lnbmVkIGxvbmcpYnVmLCBwZXJpb2RfYnl0ZXMpOwogCiAJbHhfc3RyZWFtLT5mcmFtZV9wb3MgPSBuZXh0X3BvczsKQEAgLTEyMDYsMTEgKzExMzAsMTEgQEAKIAlzdHJ1Y3QgbHhfc3RyZWFtICpseF9zdHJlYW0gPSAmY2hpcC0+cGxheWJhY2tfc3RyZWFtOwogCWludCBlcnI7CiAKLQlzbmRfcHJpbnRkZCgiLT5seF90YXNrbGV0X3BsYXliYWNrXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfdGFza2xldF9wbGF5YmFja1xuIik7CiAKIAllcnIgPSBseF9pbnRlcnJ1cHRfcmVxdWVzdF9uZXdfYnVmZmVyKGNoaXAsIGx4X3N0cmVhbSk7CiAJaWYgKGVyciA8IDApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAogCQkJICAgImNhbm5vdCByZXF1ZXN0IG5ldyBidWZmZXIgZm9yIHBsYXliYWNrXG4iKTsKIAogCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQobHhfc3RyZWFtLT5zdHJlYW0pOwpAQCAtMTIyMiwxMCArMTE0NiwxMCBAQAogCXN0cnVjdCBseF9zdHJlYW0gKmx4X3N0cmVhbSA9ICZjaGlwLT5jYXB0dXJlX3N0cmVhbTsKIAlpbnQgZXJyOwogCi0Jc25kX3ByaW50ZGQoIi0+bHhfdGFza2xldF9jYXB0dXJlXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfdGFza2xldF9jYXB0dXJlXG4iKTsKIAllcnIgPSBseF9pbnRlcnJ1cHRfcmVxdWVzdF9uZXdfYnVmZmVyKGNoaXAsIGx4X3N0cmVhbSk7CiAJaWYgKGVyciA8IDApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAogCQkJICAgImNhbm5vdCByZXF1ZXN0IG5ldyBidWZmZXIgZm9yIGNhcHR1cmVcbiIpOwogCiAJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChseF9zdHJlYW0tPnN0cmVhbSk7CkBAIC0xMjQwLDEyICsxMTY0LDE0IEBACiAJaW50IGVyciA9IDA7CiAKIAlpZiAobm90aWZpZWRfaW5fcGlwZV9tYXNrKSB7Ci0JCXNuZF9wcmludGRkKExYUCAicmVxdWVzdGluZyBhdWRpbyB0cmFuc2ZlciBmb3IgY2FwdHVyZVxuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInJlcXVlc3RpbmcgYXVkaW8gdHJhbnNmZXIgZm9yIGNhcHR1cmVcbiIpOwogCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZjaGlwLT50YXNrbGV0X2NhcHR1cmUpOwogCX0KIAogCWlmIChub3RpZmllZF9vdXRfcGlwZV9tYXNrKSB7Ci0JCXNuZF9wcmludGRkKExYUCAicmVxdWVzdGluZyBhdWRpbyB0cmFuc2ZlciBmb3IgcGxheWJhY2tcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJyZXF1ZXN0aW5nIGF1ZGlvIHRyYW5zZmVyIGZvciBwbGF5YmFja1xuIik7CiAJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJmNoaXAtPnRhc2tsZXRfcGxheWJhY2spOwogCX0KIApAQCAtMTI2MSwxMSArMTE4NywxMiBAQAogCiAJc3Bpbl9sb2NrKCZjaGlwLT5sb2NrKTsKIAotCXNuZF9wcmludGRkKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CiAKIAlpZiAoIWx4X2ludGVycnVwdF9hY2soY2hpcCwgJmlycXNyYywgJmFzeW5jX3BlbmRpbmcsICZhc3luY19lc2NtZCkpIHsKIAkJc3Bpbl91bmxvY2soJmNoaXAtPmxvY2spOwotCQlzbmRfcHJpbnRkZCgiSVJRX05PTkVcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIklSUV9OT05FXG4iKTsKIAkJcmV0dXJuIElSUV9OT05FOyAvKiB0aGlzIGRldmljZSBkaWQgbm90IGNhdXNlIHRoZSBpbnRlcnJ1cHQgKi8KIAl9CiAKQEAgLTEyNzQsMTYgKzEyMDEsMTYgQEAKIAogI2lmIDAKIAlpZiAoaXJxc3JjICYgTUFTS19TWVNfU1RBVFVTX0VPQkkpCi0JCXNuZF9wcmludGRkKExYUCAiaW50ZXJydXB0OiBFT0JJXG4iKTsKKwkJZGV2X2RnZyhjaGlwLT5jYXJkLT5kZXYsICJpbnRlcnJ1cHQ6IEVPQklcbiIpOwogCiAJaWYgKGlycXNyYyAmIE1BU0tfU1lTX1NUQVRVU19FT0JPKQotCQlzbmRfcHJpbnRkZChMWFAgImludGVycnVwdDogRU9CT1xuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiaW50ZXJydXB0OiBFT0JPXG4iKTsKIAogCWlmIChpcnFzcmMgJiBNQVNLX1NZU19TVEFUVVNfVVJVTikKLQkJc25kX3ByaW50ZGQoTFhQICJpbnRlcnJ1cHQ6IFVSVU5cbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImludGVycnVwdDogVVJVTlxuIik7CiAKIAlpZiAoaXJxc3JjICYgTUFTS19TWVNfU1RBVFVTX09SVU4pCi0JCXNuZF9wcmludGRkKExYUCAiaW50ZXJydXB0OiBPUlVOXG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJpbnRlcnJ1cHQ6IE9SVU5cbiIpOwogI2VuZGlmCiAKIAlpZiAoYXN5bmNfcGVuZGluZykgewpAQCAtMTI5OCw3ICsxMjI1LDcgQEAKIAkJCQkJCSAgICAgICAmbm90aWZpZWRfaW5fcGlwZV9tYXNrLAogCQkJCQkJICAgICAgICZub3RpZmllZF9vdXRfcGlwZV9tYXNrKTsKIAkJaWYgKGVycikKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQCisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKIAkJCQkgICAiZXJyb3IgaGFuZGxpbmcgYXN5bmMgZXZlbnRzXG4iKTsKIAogCQllcnIgPSBseF9pbnRlcnJ1cHRfaGFuZGxlX2F1ZGlvX3RyYW5zZmVyKGNoaXAsCkBAIC0xMzA2LDcgKzEyMzMsNyBAQAogCQkJCQkJCSBub3RpZmllZF9vdXRfcGlwZV9tYXNrCiAJCQkpOwogCQlpZiAoZXJyKQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAogCQkJCSAgICJlcnJvciBkdXJpbmcgYXVkaW8gdHJhbnNmZXJcbiIpOwogCX0KIApAQCAtMTMxOCw3ICsxMjQ1LDcgQEAKIAkJICoKIAkJICogKi8KIAotCQlzbmRfcHJpbnRkZCgibHg2NDY0ZXM6IGludGVycnVwdCByZXF1ZXN0cyBlc2NtZCBoYW5kbGluZ1xuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiaW50ZXJydXB0IHJlcXVlc3RzIGVzY21kIGhhbmRsaW5nXG4iKTsKICNlbmRpZgogCX0KIApAQCAtMTM0NiwxMiArMTI3MywxMiBAQAogCiB2b2lkIGx4X2lycV9lbmFibGUoc3RydWN0IGx4NjQ2NGVzICpjaGlwKQogewotCXNuZF9wcmludGRkKCItPmx4X2lycV9lbmFibGVcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiLT5seF9pcnFfZW5hYmxlXG4iKTsKIAlseF9pcnFfc2V0KGNoaXAsIDEpOwogfQogCiB2b2lkIGx4X2lycV9kaXNhYmxlKHN0cnVjdCBseDY0NjRlcyAqY2hpcCkKIHsKLQlzbmRfcHJpbnRkZCgiLT5seF9pcnFfZGlzYWJsZVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICItPmx4X2lycV9kaXNhYmxlXG4iKTsKIAlseF9pcnFfc2V0KGNoaXAsIDApOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21hZXN0cm8zLmMgYi9zb3VuZC9wY2kvbWFlc3RybzMuYwppbmRleCBkNTQxNzM2Li4wZDNlYTNlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbWFlc3RybzMuYworKysgYi9zb3VuZC9wY2kvbWFlc3RybzMuYwpAQCAtMTQwMyw3ICsxNDAzLDcgQEAKIAkvKiBzZXQgYnVmZmVyIGFkZHJlc3MgKi8KIAlzLT5idWZmZXJfYWRkciA9IHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHI7CiAJaWYgKHMtPmJ1ZmZlcl9hZGRyICYgMHgzKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIm9oIG15LCBub3QgYWxpZ25lZFxuIik7CisJCWRldl9lcnIoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwgIm9oIG15LCBub3QgYWxpZ25lZFxuIik7CiAJCXMtPmJ1ZmZlcl9hZGRyID0gcy0+YnVmZmVyX2FkZHIgJiB+MHgzOwogCX0KIAlyZXR1cm4gMDsKQEAgLTE5MDAsNyArMTkwMCw3IEBACiAJCWNwdV9yZWxheCgpOwogCX0gd2hpbGUgKGktLSA+IDApOwogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiYWM5NyBzZXJpYWwgYnVzIGJ1c3lcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiYWM5NyBzZXJpYWwgYnVzIGJ1c3lcbiIpOwogCXJldHVybiAxOwogfQogCkBAIC0yMDE1LDcgKzIwMTUsOCBAQAogCQlkZWxheTEgKz0gMTA7CiAJCWRlbGF5MiArPSAxMDA7CiAKLQkJc25kX3ByaW50ZCgibWFlc3RybzM6IHJldHJ5aW5nIGNvZGVjIHJlc2V0IHdpdGggZGVsYXlzIG9mICVkIGFuZCAlZCBtc1xuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkicmV0cnlpbmcgY29kZWMgcmVzZXQgd2l0aCBkZWxheXMgb2YgJWQgYW5kICVkIG1zXG4iLAogCQkJICAgZGVsYXkxLCBkZWxheTIpOwogCX0KIApAQCAtMjE5NCw3ICsyMTk1LDggQEAKIAlhZGRyZXNzID0gMHgxMTAwICsgKChkYXRhX2J5dGVzLzIpICogaW5kZXgpOwogCiAJaWYgKChhZGRyZXNzICsgKGRhdGFfYnl0ZXMvMikpID49IDB4MWMwMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJubyBtZW1vcnkgZm9yICVkIGJ5dGVzIGF0IGluZCAlZCAoYWRkciAweCV4KVxuIiwKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkibm8gbWVtb3J5IGZvciAlZCBieXRlcyBhdCBpbmQgJWQgKGFkZHIgMHgleClcbiIsCiAJCQkgICBkYXRhX2J5dGVzLCBpbmRleCwgYWRkcmVzcyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTI0MzksOCArMjQ0MSw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtYWVzdG9yMzogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMjU1Myw3ICsyNTU0LDggQEAKIAkvKiBjaGVjaywgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDI4IGJpdHMgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygyOCkpIDwgMCB8fAogCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjgpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjhiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyOGJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTI1ODYsOSArMjU4OCw4IEBACiAJZWxzZSB7CiAJCXF1aXJrID0gc25kX3BjaV9xdWlya19sb29rdXAocGNpLCBtM19hbXBfcXVpcmtfbGlzdCk7CiAJCWlmIChxdWlyaykgewotCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPCi0JCQkJICAgICJtYWVzdHJvMzogc2V0IGFtcC1ncGlvIGZvciAnJXMnXG4iLAotCQkJCSAgICBzbmRfcGNpX3F1aXJrX25hbWUocXVpcmspKTsKKwkJCWRldl9pbmZvKGNhcmQtPmRldiwgInNldCBhbXAtZ3BpbyBmb3IgJyVzJ1xuIiwKKwkJCQkgc25kX3BjaV9xdWlya19uYW1lKHF1aXJrKSk7CiAJCQljaGlwLT5hbXBfZ3BpbyA9IHF1aXJrLT52YWx1ZTsKIAkJfSBlbHNlIGlmIChjaGlwLT5hbGxlZ3JvX2ZsYWcpCiAJCQljaGlwLT5hbXBfZ3BpbyA9IEdQT19FWFRfQU1QX0FMTEVHUk87CkBAIC0yNTk4LDkgKzI1OTksOCBAQAogCiAJcXVpcmsgPSBzbmRfcGNpX3F1aXJrX2xvb2t1cChwY2ksIG0zX2lyZGFfcXVpcmtfbGlzdCk7CiAJaWYgKHF1aXJrKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTwotCQkJICAgICJtYWVzdHJvMzogZW5hYmxlZCBpcmRhIHdvcmthcm91bmQgZm9yICclcydcbiIsCi0JCQkgICAgc25kX3BjaV9xdWlya19uYW1lKHF1aXJrKSk7CisJCWRldl9pbmZvKGNhcmQtPmRldiwgImVuYWJsZWQgaXJkYSB3b3JrYXJvdW5kIGZvciAnJXMnXG4iLAorCQkJIHNuZF9wY2lfcXVpcmtfbmFtZShxdWlyaykpOwogCQljaGlwLT5pcmRhX3dvcmthcm91bmQgPSAxOwogCX0KIAlxdWlyayA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgbTNfaHZfcXVpcmtfbGlzdCk7CkBAIC0yNjUyLDcgKzI2NTIsNyBAQAogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfbTNfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX20zX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTI2NjEsNyArMjY2MSw3IEBACiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAJY2hpcC0+c3VzcGVuZF9tZW0gPSB2bWFsbG9jKHNpemVvZih1MTYpICogKFJFVl9CX0NPREVfTUVNT1JZX0xFTkdUSCArIFJFVl9CX0RBVEFfTUVNT1JZX0xFTkdUSCkpOwogCWlmIChjaGlwLT5zdXNwZW5kX21lbSA9PSBOVUxMKQotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiY2FuJ3QgYWxsb2NhdGUgYXBtIGJ1ZmZlclxuIik7CisJCWRldl93YXJuKGNhcmQtPmRldiwgImNhbid0IGFsbG9jYXRlIGFwbSBidWZmZXJcbiIpOwogI2VuZGlmCiAKIAlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY2hpcCwgJm9wcykpIDwgMCkgewpAQCAtMjY4NSwxNiArMjY4NSwxNSBAQAogCWlmIChjaGlwLT5odl9jb25maWcgJiBIVl9DVFJMX0VOQUJMRSkgewogCQllcnIgPSBzbmRfbTNfaW5wdXRfcmVnaXN0ZXIoY2hpcCk7CiAJCWlmIChlcnIpCi0JCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiSW5wdXQgZGV2aWNlIHJlZ2lzdHJhdGlvbiAiCi0JCQkJImZhaWxlZCB3aXRoIGVycm9yICVpIiwgZXJyKTsKKwkJCWRldl93YXJuKGNhcmQtPmRldiwKKwkJCQkgIklucHV0IGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkIHdpdGggZXJyb3IgJWkiLAorCQkJCSBlcnIpOwogCX0KICNlbmRpZgogCiAJc25kX20zX2VuYWJsZV9pbnRzKGNoaXApOwogCXNuZF9tM19hc3NwX2NvbnRpbnVlKGNoaXApOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKmNoaXBfcmV0ID0gY2hpcDsKIAogCXJldHVybiAwOyAKQEAgLTI3MjEsNyArMjcyMCw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yNzY0LDcgKzI3NjQsNyBAQAogCQkJCSAgTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8IE1QVTQwMV9JTkZPX0lSUV9IT09LLAogCQkJCSAgLTEsICZjaGlwLT5ybWlkaSk7CiAJaWYgKGVyciA8IDApCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIm1hZXN0cm8zOiBubyBNSURJIHN1cHBvcnQuXG4iKTsKKwkJZGV2X3dhcm4oY2FyZC0+ZGV2LCAibm8gTUlESSBzdXBwb3J0LlxuIik7CiAjZW5kaWYKIAogCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21peGFydC9taXhhcnQuYyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0LmMKaW5kZXggMWUwZjZlZS4uYTkzZTdhZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL21peGFydC9taXhhcnQuYworKysgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydC5jCkBAIC04Nyw3ICs4Nyw4IEBACiAJCWlmKCFzdGFydCkgcmV0dXJuIDA7IC8qIGFscmVhZHkgc3RvcHBlZCAqLwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBtaXhhcnRfc2V0X3BpcGVfc3RhdGUgY2FsbGVkIHdpdGggd3JvbmcgcGlwZS0+c3RhdHVzIVxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkiZXJyb3IgbWl4YXJ0X3NldF9waXBlX3N0YXRlIGNhbGxlZCB3aXRoIHdyb25nIHBpcGUtPnN0YXR1cyFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsgICAgICAvKiBmdW5jdGlvbiBjYWxsZWQgd2l0aCB3cm9uZyBwaXBlIHN0YXR1cyAqLwogCX0KIApAQCAtMTAyLDcgKzEwMyw4IEBACiAKIAllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnX3dhaXRfbm90aWYobWdyLCAmcmVxdWVzdCwgc3lzdGVtX21zZ191aWQpOwogCWlmKGVycikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciA6IE1TR19TWVNURU1fV0FJVF9TWU5DSFJPX0NNRCB3YXMgbm90IG5vdGlmaWVkICFcbiIpOworCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAorCQkJImVycm9yIDogTVNHX1NZU1RFTV9XQUlUX1NZTkNIUk9fQ01EIHdhcyBub3Qgbm90aWZpZWQgIVxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xMjMsNyArMTI1LDkgQEAKIAogCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2cobWdyLCAmcmVxdWVzdCwgc2l6ZW9mKGdyb3VwX3N0YXRlX3Jlc3ApLCAmZ3JvdXBfc3RhdGVfcmVzcCk7CiAJaWYgKGVyciA8IDAgfHwgZ3JvdXBfc3RhdGVfcmVzcC50eHhfc3RhdHVzICE9IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgTVNHX1NUUkVBTV9TVCoqKl9TVFJFQU1fR1JQX1BBQ0tFVCBlcnI9JXggc3RhdD0leCAhXG4iLCBlcnIsIGdyb3VwX3N0YXRlX3Jlc3AudHh4X3N0YXR1cyk7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkiZXJyb3IgTVNHX1NUUkVBTV9TVCoqKl9TVFJFQU1fR1JQX1BBQ0tFVCBlcnI9JXggc3RhdD0leCAhXG4iLAorCQkJZXJyLCBncm91cF9zdGF0ZV9yZXNwLnR4eF9zdGF0dXMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTEzNCw3ICsxMzgsOSBAQAogCiAJCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2cobWdyLCAmcmVxdWVzdCwgc2l6ZW9mKGdyb3VwX3N0YXRlX3Jlc3ApLCAmZ3JvdXBfc3RhdGVfcmVzcCk7CiAJCWlmIChlcnIgPCAwIHx8IGdyb3VwX3N0YXRlX3Jlc3AudHh4X3N0YXR1cyAhPSAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfU1RSRUFNX1NUQVJUX1NUUkVBTV9HUlBfUEFDS0VUIGVycj0leCBzdGF0PSV4ICFcbiIsIGVyciwgZ3JvdXBfc3RhdGVfcmVzcC50eHhfc3RhdHVzKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJImVycm9yIE1TR19TVFJFQU1fU1RBUlRfU1RSRUFNX0dSUF9QQUNLRVQgZXJyPSV4IHN0YXQ9JXggIVxuIiwKKwkJCQllcnIsIGdyb3VwX3N0YXRlX3Jlc3AudHh4X3N0YXR1cyk7CiAgCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIApAQCAtMTQ3LDcgKzE1Myw5IEBACiAKIAkJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2Yoc3RhdCksICZzdGF0KTsKIAkJaWYgKGVyciA8IDAgfHwgc3RhdCAhPSAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfU1lTVEVNX1NFTkRfU1lOQ0hST19DTUQgZXJyPSV4IHN0YXQ9JXggIVxuIiwgZXJyLCBzdGF0KTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJImVycm9yIE1TR19TWVNURU1fU0VORF9TWU5DSFJPX0NNRCBlcnI9JXggc3RhdD0leCAhXG4iLAorCQkJCWVyciwgc3RhdCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC0xNzgsNyArMTg2LDkgQEAKIAkJaWYocmF0ZSA9PSAwKQogCQkJcmV0dXJuIDA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KIAkJZWxzZSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBtaXhhcnRfc2V0X2Nsb2NrKCVkKSBjYWxsZWQgd2l0aCB3cm9uZyBwaXBlLT5zdGF0dXMgIVxuIiwgcmF0ZSk7CisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCSJlcnJvciBtaXhhcnRfc2V0X2Nsb2NrKCVkKSBjYWxsZWQgd2l0aCB3cm9uZyBwaXBlLT5zdGF0dXMgIVxuIiwKKwkJCQlyYXRlKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMTkwLDcgKzIwMCw3IEBACiAJY2xvY2tfcHJvcGVydGllcy5uYl9jYWxsZXJzID0gMTsgLyogb25seSBvbmUgZW50cnkgaW4gdWlkX2NhbGxlciAhICovCiAJY2xvY2tfcHJvcGVydGllcy51aWRfY2FsbGVyWzBdID0gcGlwZS0+Z3JvdXBfdWlkOwogCi0Jc25kX3ByaW50ZGQoIm1peGFydF9zZXRfY2xvY2sgdG8gJWQga0h6XG4iLCByYXRlKTsKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAibWl4YXJ0X3NldF9jbG9jayB0byAlZCBrSHpcbiIsIHJhdGUpOwogCiAJcmVxdWVzdC5tZXNzYWdlX2lkID0gTVNHX0NMT0NLX1NFVF9QUk9QRVJUSUVTOwogCXJlcXVlc3QudWlkID0gbWdyLT51aWRfY29uc29sZV9tYW5hZ2VyOwpAQCAtMTk5LDcgKzIwOSw5IEBACiAKIAllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKG1nciwgJnJlcXVlc3QsIHNpemVvZihjbG9ja19wcm9wX3Jlc3ApLCAmY2xvY2tfcHJvcF9yZXNwKTsKIAlpZiAoZXJyIDwgMCB8fCBjbG9ja19wcm9wX3Jlc3Auc3RhdHVzICE9IDAgfHwgY2xvY2tfcHJvcF9yZXNwLmNsb2NrX21vZGUgIT0gQ01fU1RBTkRBTE9ORSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfQ0xPQ0tfU0VUX1BST1BFUlRJRVMgZXJyPSV4IHN0YXQ9JXggbW9kPSV4ICFcbiIsIGVyciwgY2xvY2tfcHJvcF9yZXNwLnN0YXR1cywgY2xvY2tfcHJvcF9yZXNwLmNsb2NrX21vZGUpOworCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAorCQkJImVycm9yIE1TR19DTE9DS19TRVRfUFJPUEVSVElFUyBlcnI9JXggc3RhdD0leCBtb2Q9JXggIVxuIiwKKwkJCWVyciwgY2xvY2tfcHJvcF9yZXNwLnN0YXR1cywgY2xvY2tfcHJvcF9yZXNwLmNsb2NrX21vZGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI1Miw3ICsyNjQsOSBAQAogCQkJc3RydWN0IG1peGFydF9zdHJlYW1pbmdfZ3JvdXAgc2dyb3VwX3Jlc3A7CiAJCX0gKmJ1ZjsKIAotCQlzbmRfcHJpbnRkZCgiYWRkX3JlZl9waXBlIGF1ZGlvIGNoaXAoJWQpIHBjbSglZClcbiIsIGNoaXAtPmNoaXBfaWR4LCBwY21fbnVtYmVyKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiYWRkX3JlZl9waXBlIGF1ZGlvIGNoaXAoJWQpIHBjbSglZClcbiIsCisJCQljaGlwLT5jaGlwX2lkeCwgcGNtX251bWJlcik7CiAKIAkJYnVmID0ga21hbGxvYyhzaXplb2YoKmJ1ZiksIEdGUF9LRVJORUwpOwogCQlpZiAoIWJ1ZikKQEAgLTMwMiw3ICszMTYsOSBAQAogCiAJCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2coY2hpcC0+bWdyLCAmcmVxdWVzdCwgc2l6ZW9mKGJ1Zi0+c2dyb3VwX3Jlc3ApLCAmYnVmLT5zZ3JvdXBfcmVzcCk7CiAJCWlmKChlcnIgPCAwKSB8fCAoYnVmLT5zZ3JvdXBfcmVzcC5zdGF0dXMgIT0gMCkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIE1TR19TVFJFQU1fQUREXyoqUFVUX0dST1VQIGVycj0leCBzdGF0PSV4ICFcbiIsIGVyciwgYnVmLT5zZ3JvdXBfcmVzcC5zdGF0dXMpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImVycm9yIE1TR19TVFJFQU1fQUREXyoqUFVUX0dST1VQIGVycj0leCBzdGF0PSV4ICFcbiIsCisJCQkJZXJyLCBidWYtPnNncm91cF9yZXNwLnN0YXR1cyk7CiAJCQlrZnJlZShidWYpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KQEAgLTM0MywxMyArMzU5LDE0IEBACiAJCS8qIHJlbGVhc2UgdGhlIGNsb2NrICovCiAJCWVyciA9IG1peGFydF9zZXRfY2xvY2soIG1nciwgcGlwZSwgMCk7CiAJCWlmKCBlcnIgPCAwICkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWl4YXJ0X3NldF9jbG9jaygwKSByZXR1cm4gZXJyb3IhXG4iKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJIm1peGFydF9zZXRfY2xvY2soMCkgcmV0dXJuIGVycm9yIVxuIik7CiAJCX0KIAogCQkvKiBzdG9wIHRoZSBwaXBlICovCiAJCWVyciA9IG1peGFydF9zZXRfcGlwZV9zdGF0ZShtZ3IsIHBpcGUsIDApOwogCQlpZiggZXJyIDwgMCApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHN0b3BwaW5nIHBpcGUhXG4iKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJlcnJvciBzdG9wcGluZyBwaXBlIVxuIik7CiAJCX0KIAogCQlyZXF1ZXN0Lm1lc3NhZ2VfaWQgPSBNU0dfU1RSRUFNX0RFTEVURV9HUk9VUDsKQEAgLTM2MCw3ICszNzcsOSBAQAogCQkvKiBkZWxldGUgdGhlIHBpcGUgKi8KIAkJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2YoZGVsZXRlX3Jlc3ApLCAmZGVsZXRlX3Jlc3ApOwogCQlpZiAoKGVyciA8IDApIHx8IChkZWxldGVfcmVzcC5zdGF0dXMgIT0gMCkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIE1TR19TVFJFQU1fREVMRVRFX0dST1VQIGVycigleCksIHN0YXR1cygleClcbiIsIGVyciwgZGVsZXRlX3Jlc3Auc3RhdHVzKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJImVycm9yIE1TR19TVFJFQU1fREVMRVRFX0dST1VQIGVycigleCksIHN0YXR1cygleClcbiIsCisJCQkJZXJyLCBkZWxldGVfcmVzcC5zdGF0dXMpOwogCQl9CiAKIAkJcGlwZS0+Z3JvdXBfdWlkID0gKHN0cnVjdCBtaXhhcnRfdWlkKXswLDB9OwpAQCAtNDE0LDcgKzQzMyw3IEBACiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgogCi0JCXNuZF9wcmludGRkKCJTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVFxuIik7CisJCWRldl9kYmcoc3Vicy0+cGNtLT5jYXJkLT5kZXYsICJTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVFxuIik7CiAKIAkJLyogU1RBUlRfU1RSRUFNICovCiAJCWlmKCBtaXhhcnRfc2V0X3N0cmVhbV9zdGF0ZShzdHJlYW0sIDEpICkKQEAgLTQzMSwxOSArNDUwLDE5IEBACiAKIAkJc3RyZWFtLT5zdGF0dXMgPSBNSVhBUlRfU1RSRUFNX1NUQVRVU19PUEVOOwogCi0JCXNuZF9wcmludGRkKCJTTkRSVl9QQ01fVFJJR0dFUl9TVE9QXG4iKTsKKwkJZGV2X2RiZyhzdWJzLT5wY20tPmNhcmQtPmRldiwgIlNORFJWX1BDTV9UUklHR0VSX1NUT1BcbiIpOwogCiAJCWJyZWFrOwogCiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgogCQkvKiBUT0RPICovCiAJCXN0cmVhbS0+c3RhdHVzID0gTUlYQVJUX1NUUkVBTV9TVEFUVVNfUEFVU0U7Ci0JCXNuZF9wcmludGRkKCJTTkRSVl9QQ01fUEFVU0VfUFVTSFxuIik7CisJCWRldl9kYmcoc3Vicy0+cGNtLT5jYXJkLT5kZXYsICJTTkRSVl9QQ01fUEFVU0VfUFVTSFxuIik7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKIAkJLyogVE9ETyAqLwogCQlzdHJlYW0tPnN0YXR1cyA9IE1JWEFSVF9TVFJFQU1fU1RBVFVTX1JVTk5JTkc7Ci0JCXNuZF9wcmludGRkKCJTTkRSVl9QQ01fUEFVU0VfUkVMRUFTRVxuIik7CisJCWRldl9kYmcoc3Vicy0+cGNtLT5jYXJkLT5kZXYsICJTTkRSVl9QQ01fUEFVU0VfUkVMRUFTRVxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDU2LDcgKzQ3NSw4IEBACiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIEhaOwogCXdoaWxlIChhdG9taWNfcmVhZCgmbWdyLT5tc2dfcHJvY2Vzc2VkKSA+IDApIHsKIAkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIm1peGFydDogY2Fubm90IHByb2Nlc3Mgbm9uYmxvY2sgZXZlbnRzIVxuIik7CisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCSJtaXhhcnQ6IGNhbm5vdCBwcm9jZXNzIG5vbmJsb2NrIGV2ZW50cyFcbiIpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKQEAgLTQ3NCw3ICs0OTQsNyBAQAogCiAJLyogVE9ETyBkZSBmYcOnb24gbm9uIGJsb3F1YW50ZSwgcsOpYXBwbGlxdWVyIGxlcyBod19wYXJhbXMgKHJhdGUsIGJpdHMsIGNvZGVjKSAqLwogCi0Jc25kX3ByaW50ZGQoInNuZF9taXhhcnRfcHJlcGFyZVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzbmRfbWl4YXJ0X3ByZXBhcmVcbiIpOwogCiAJbWl4YXJ0X3N5bmNfbm9uYmxvY2tfZXZlbnRzKGNoaXAtPm1ncik7CiAKQEAgLTU0MiwxMSArNTYyLDEzIEBACiAJCXN0cmVhbV9wYXJhbS5zYW1wbGVfc2l6ZSA9IDMyOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBtaXhhcnRfc2V0X2Zvcm1hdCgpIDogdW5rbm93biBmb3JtYXRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJlcnJvciBtaXhhcnRfc2V0X2Zvcm1hdCgpIDogdW5rbm93biBmb3JtYXRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlzbmRfcHJpbnRkZCgic2V0IFNORFJWX1BDTV9GT1JNQVQgc2FtcGxlX3R5cGUoJWQpIHNhbXBsZV9zaXplKCVkKSBmcmVxKCVkKSBjaGFubmVscyglZClcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJzZXQgU05EUlZfUENNX0ZPUk1BVCBzYW1wbGVfdHlwZSglZCkgc2FtcGxlX3NpemUoJWQpIGZyZXEoJWQpIGNoYW5uZWxzKCVkKVxuIiwKIAkJICAgc3RyZWFtX3BhcmFtLnNhbXBsZV90eXBlLCBzdHJlYW1fcGFyYW0uc2FtcGxlX3NpemUsIHN0cmVhbV9wYXJhbS5zYW1wbGluZ19mcmVxLCBzdHJlYW0tPmNoYW5uZWxzKTsKIAogCS8qIFRPRE86IHdoYXQgZWxzZSB0byBjb25maWd1cmUgPyAqLwpAQCAtNTY2LDcgKzU4OCw5IEBACiAKIAllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKGNoaXAtPm1nciwgJnJlcXVlc3QsIHNpemVvZihyZXNwKSwgJnJlc3ApOwogCWlmKChlcnIgPCAwKSB8fCByZXNwLmVycm9yX2NvZGUpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiTVNHX1NUUkVBTV9TRVRfSU5QVVRfU1RBR0VfUEFSQU0gZXJyPSV4OyByZXNwPSV4XG4iLCBlcnIsIHJlc3AuZXJyb3JfY29kZSk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIk1TR19TVFJFQU1fU0VUX0lOUFVUX1NUQUdFX1BBUkFNIGVycj0leDsgcmVzcD0leFxuIiwKKwkJCWVyciwgcmVzcC5lcnJvcl9jb2RlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwpAQCAtNjI3LDggKzY1MSw5IEBACiAJCWJ1ZmZlcmluZm9baV0uYXZhaWxhYmxlX2xlbmd0aCA9IHN1YnMtPnJ1bnRpbWUtPmRtYV9ieXRlczsKIAkJLyogYnVmZmVyaW5mb1tpXS5idWZmZXJfaWQgIGlzIGFscmVhZHkgZGVmaW5lZCAqLwogCi0JCXNuZF9wcmludGRkKCJzbmRfbWl4YXJ0X2h3X3BhcmFtcyhwY20gJWQpIDogZG1hX2FkZHIoJXgpIGRtYV9ieXRlcygleCkgc3Vicy1udW1iZXIoJWQpXG4iLCBpLAotCQkJCWJ1ZmZlcmluZm9baV0uYnVmZmVyX2FkZHJlc3MsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInNuZF9taXhhcnRfaHdfcGFyYW1zKHBjbSAlZCkgOiBkbWFfYWRkcigleCkgZG1hX2J5dGVzKCV4KSBzdWJzLW51bWJlciglZClcbiIsCisJCQlpLCBidWZmZXJpbmZvW2ldLmJ1ZmZlcl9hZGRyZXNzLAogCQkJCWJ1ZmZlcmluZm9baV0uYXZhaWxhYmxlX2xlbmd0aCwKIAkJCQlzdWJzLT5udW1iZXIpOwogCX0KQEAgLTcxNCwxNCArNzM5LDE4IEBACiAJCXBjbV9udW1iZXIgPSBNSVhBUlRfUENNX0RJR0lUQUw7CiAJCXJ1bnRpbWUtPmh3ID0gc25kX21peGFydF9kaWdpdGFsX2NhcHM7CiAJfQotCXNuZF9wcmludGRkKCJzbmRfbWl4YXJ0X3BsYXliYWNrX29wZW4gQyVkL1AlZC9TdWIlZFxuIiwgY2hpcC0+Y2hpcF9pZHgsIHBjbV9udW1iZXIsIHN1YnMtPm51bWJlcik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJzbmRfbWl4YXJ0X3BsYXliYWNrX29wZW4gQyVkL1AlZC9TdWIlZFxuIiwKKwkJY2hpcC0+Y2hpcF9pZHgsIHBjbV9udW1iZXIsIHN1YnMtPm51bWJlcik7CiAKIAkvKiBnZXQgc3RyZWFtIGluZm8gKi8KIAlzdHJlYW0gPSAmKGNoaXAtPnBsYXliYWNrX3N0cmVhbVtwY21fbnVtYmVyXVtzdWJzLT5udW1iZXJdKTsKIAogCWlmIChzdHJlYW0tPnN0YXR1cyAhPSBNSVhBUlRfU1RSRUFNX1NUQVRVU19GUkVFKXsKIAkJLyogc3RyZWFtcyBpbiB1c2UgKi8KLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic25kX21peGFydF9wbGF5YmFja19vcGVuIEMlZC9QJWQvU3ViJWQgaW4gdXNlXG4iLCBjaGlwLT5jaGlwX2lkeCwgcGNtX251bWJlciwgc3Vicy0+bnVtYmVyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkic25kX21peGFydF9wbGF5YmFja19vcGVuIEMlZC9QJWQvU3ViJWQgaW4gdXNlXG4iLAorCQkJY2hpcC0+Y2hpcF9pZHgsIHBjbV9udW1iZXIsIHN1YnMtPm51bWJlcik7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBfZXhpdF9vcGVuOwogCX0KQEAgLTczNyw3ICs3NjYsNyBAQAogCS8qIHN0YXJ0IHRoZSBwaXBlIGlmIG5lY2Vzc2FyeSAqLwogCWVyciA9IG1peGFydF9zZXRfcGlwZV9zdGF0ZShjaGlwLT5tZ3IsIHBpcGUsIDEpOwogCWlmKCBlcnIgPCAwICkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBzdGFydGluZyBwaXBlIVxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiZXJyb3Igc3RhcnRpbmcgcGlwZSFcbiIpOwogCQlzbmRfbWl4YXJ0X2tpbGxfcmVmX3BpcGUoY2hpcC0+bWdyLCBwaXBlLCAwKTsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBfZXhpdF9vcGVuOwpAQCAtNzkyLDE0ICs4MjEsMTcgQEAKIAogCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbiA9IDI7IC8qIGZvciBpbnN0YW5jZSwgbm8gbW9ubyAqLwogCi0Jc25kX3ByaW50ZGQoInNuZF9taXhhcnRfY2FwdHVyZV9vcGVuIEMlZC9QJWQvU3ViJWRcbiIsIGNoaXAtPmNoaXBfaWR4LCBwY21fbnVtYmVyLCBzdWJzLT5udW1iZXIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAic25kX21peGFydF9jYXB0dXJlX29wZW4gQyVkL1AlZC9TdWIlZFxuIiwKKwkJY2hpcC0+Y2hpcF9pZHgsIHBjbV9udW1iZXIsIHN1YnMtPm51bWJlcik7CiAKIAkvKiBnZXQgc3RyZWFtIGluZm8gKi8KIAlzdHJlYW0gPSAmKGNoaXAtPmNhcHR1cmVfc3RyZWFtW3BjbV9udW1iZXJdKTsKIAogCWlmIChzdHJlYW0tPnN0YXR1cyAhPSBNSVhBUlRfU1RSRUFNX1NUQVRVU19GUkVFKXsKIAkJLyogc3RyZWFtcyBpbiB1c2UgKi8KLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic25kX21peGFydF9jYXB0dXJlX29wZW4gQyVkL1AlZC9TdWIlZCBpbiB1c2VcbiIsIGNoaXAtPmNoaXBfaWR4LCBwY21fbnVtYmVyLCBzdWJzLT5udW1iZXIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJzbmRfbWl4YXJ0X2NhcHR1cmVfb3BlbiBDJWQvUCVkL1N1YiVkIGluIHVzZVxuIiwKKwkJCWNoaXAtPmNoaXBfaWR4LCBwY21fbnVtYmVyLCBzdWJzLT5udW1iZXIpOwogCQllcnIgPSAtRUJVU1k7CiAJCWdvdG8gX2V4aXRfb3BlbjsKIAl9CkBAIC04MTUsNyArODQ3LDcgQEAKIAkvKiBzdGFydCB0aGUgcGlwZSBpZiBuZWNlc3NhcnkgKi8KIAllcnIgPSBtaXhhcnRfc2V0X3BpcGVfc3RhdGUoY2hpcC0+bWdyLCBwaXBlLCAxKTsKIAlpZiggZXJyIDwgMCApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3Igc3RhcnRpbmcgcGlwZSFcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImVycm9yIHN0YXJ0aW5nIHBpcGUhXG4iKTsKIAkJc25kX21peGFydF9raWxsX3JlZl9waXBlKGNoaXAtPm1nciwgcGlwZSwgMCk7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gX2V4aXRfb3BlbjsKQEAgLTg1NSw3ICs4ODcsOCBAQAogCiAJbXV0ZXhfbG9jaygmbWdyLT5zZXR1cF9tdXRleCk7CiAKLQlzbmRfcHJpbnRkZCgic25kX21peGFydF9jbG9zZSBDJWQvUCVkL1N1YiVkXG4iLCBjaGlwLT5jaGlwX2lkeCwgc3RyZWFtLT5wY21fbnVtYmVyLCBzdWJzLT5udW1iZXIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAic25kX21peGFydF9jbG9zZSBDJWQvUCVkL1N1YiVkXG4iLAorCQljaGlwLT5jaGlwX2lkeCwgc3RyZWFtLT5wY21fbnVtYmVyLCBzdWJzLT5udW1iZXIpOwogCiAJLyogc2FtcGxlIHJhdGUgcmVsZWFzZWQgKi8KIAlpZigtLW1nci0+cmVmX2NvdW50X3JhdGUgPT0gMCkgewpAQCAtODY1LDcgKzg5OCw5IEBACiAJLyogZGVsZXRlIHBpcGUgKi8KIAlpZiAoc25kX21peGFydF9raWxsX3JlZl9waXBlKG1nciwgc3RyZWFtLT5waXBlLCAwICkgPCAwKSB7CiAKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3Igc25kX21peGFydF9raWxsX3JlZl9waXBlIEMlZFAlZFxuIiwgY2hpcC0+Y2hpcF9pZHgsIHN0cmVhbS0+cGNtX251bWJlcik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImVycm9yIHNuZF9taXhhcnRfa2lsbF9yZWZfcGlwZSBDJWRQJWRcbiIsCisJCQljaGlwLT5jaGlwX2lkeCwgc3RyZWFtLT5wY21fbnVtYmVyKTsKIAl9CiAKIAlzdHJlYW0tPnBpcGUgICAgICA9IE5VTEw7CkBAIC05NDAsNyArOTc1LDggQEAKIAlpZiAoKGVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsIG5hbWUsIE1JWEFSVF9QQ01fQU5BTE9HLAogCQkJICAgICAgIE1JWEFSVF9QTEFZQkFDS19TVFJFQU1TLAogCQkJICAgICAgIE1JWEFSVF9DQVBUVVJFX1NUUkVBTVMsICZwY20pKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGNyZWF0ZSB0aGUgYW5hbG9nIHBjbSAlZFxuIiwgY2hpcC0+Y2hpcF9pZHgpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgY3JlYXRlIHRoZSBhbmFsb2cgcGNtICVkXG4iLCBjaGlwLT5jaGlwX2lkeCk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC05NzEsNyArMTAwNyw4IEBACiAJaWYgKChlcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCBuYW1lLCBNSVhBUlRfUENNX0RJR0lUQUwsCiAJCQkgICAgICAgTUlYQVJUX1BMQVlCQUNLX1NUUkVBTVMsCiAJCQkgICAgICAgTUlYQVJUX0NBUFRVUkVfU1RSRUFNUywgJnBjbSkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgY3JlYXRlIHRoZSBkaWdpdGFsIHBjbSAlZFxuIiwgY2hpcC0+Y2hpcF9pZHgpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgY3JlYXRlIHRoZSBkaWdpdGFsIHBjbSAlZFxuIiwgY2hpcC0+Y2hpcF9pZHgpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMTAxNCw3ICsxMDUxLDcgQEAKIAogCWNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOwogCWlmICghIGNoaXApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGFsbG9jYXRlIGNoaXBcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBjaGlwXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMDI4LDggKzEwNjUsNiBAQAogCX0KIAogCW1nci0+Y2hpcFtpZHhdID0gY2hpcDsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZtZ3ItPnBjaS0+ZGV2KTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMDczLDcgKzExMDgsNyBAQAogCS8qIHJlc2V0IGJvYXJkIGlmIHNvbWUgZmlybXdhcmUgd2FzIGxvYWRlZCAqLwogCWlmKG1nci0+ZHNwX2xvYWRlZCkgewogCQlzbmRfbWl4YXJ0X3Jlc2V0X2JvYXJkKG1ncik7Ci0JCXNuZF9wcmludGRkKCJyZXNldCBtaVhhcnQgIVxuIik7CisJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJyZXNldCBtaVhhcnQgIVxuIik7CiAJfQogCiAJLyogcmVsZWFzZSB0aGUgaS9vIHBvcnRzICovCkBAIC0xMjM0LDcgKzEyNjksOCBAQAogCiAJLyogY2hlY2sgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDMyIGJpdHMgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygzMikpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CisJCWRldl9lcnIoJnBjaS0+ZGV2LAorCQkJImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtMTI2MCw3ICsxMjk2LDcgQEAKIAkJbWdyLT5tZW1baV0ucGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIGkpOwogCQltZ3ItPm1lbVtpXS52aXJ0ID0gcGNpX2lvcmVtYXBfYmFyKHBjaSwgaSk7CiAJCWlmICghbWdyLT5tZW1baV0udmlydCkgewotCQkgICAgICAgIHByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlbWFwIHJlc291cmNlIDB4JWx4XG4iLAorCQkJZGV2X2VycigmcGNpLT5kZXYsICJ1bmFibGUgdG8gcmVtYXAgcmVzb3VyY2UgMHglbHhcbiIsCiAJCQkgICAgICAgbWdyLT5tZW1baV0ucGh5cyk7CiAJCQlzbmRfbWl4YXJ0X2ZyZWUobWdyKTsKIAkJCXJldHVybiAtRUJVU1k7CkBAIC0xMjY5LDcgKzEzMDUsNyBAQAogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfbWl4YXJ0X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgbWdyKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycigmcGNpLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX21peGFydF9mcmVlKG1ncik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMTMwOCwxMCArMTM0NCwxMSBAQAogCQllbHNlCiAJCQlpZHggPSBpbmRleFtkZXZdICsgaTsKIAkJc25wcmludGYodG1waWQsIHNpemVvZih0bXBpZCksICIlcy0lZCIsIGlkW2Rldl0gPyBpZFtkZXZdIDogIk1JWEFSVCIsIGkpOwotCQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaWR4LCB0bXBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwkJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaWR4LCB0bXBpZCwgVEhJU19NT0RVTEUsCisJCQkJICAgMCwgJmNhcmQpOwogCiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgYWxsb2NhdGUgdGhlIGNhcmQgJWRcbiIsIGkpOworCQkJZGV2X2VycigmcGNpLT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgdGhlIGNhcmQgJWRcbiIsIGkpOwogCQkJc25kX21peGFydF9mcmVlKG1ncik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9jb3JlLmMgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9jb3JlLmMKaW5kZXggM2RmMGY1My4uNzFmNGJkYyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL21peGFydC9taXhhcnRfY29yZS5jCisrKyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X2NvcmUuYwpAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTk0LDcgKzk1LDggQEAKIAogCWlmKCAoc2l6ZSA8IE1TR19ERVNDUklQVE9SX1NJWkUpIHx8IChyZXNwLT5zaXplIDwgKHNpemUgLSBNU0dfREVTQ1JJUFRPUl9TSVpFKSkpIHsKIAkJZXJyID0gLUVJTlZBTDsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAicHJvYmxlbSB3aXRoIHJlc3BvbnNlIHNpemUgPSAlZFxuIiwgc2l6ZSk7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkicHJvYmxlbSB3aXRoIHJlc3BvbnNlIHNpemUgPSAlZFxuIiwgc2l6ZSk7CiAJCWdvdG8gX2NsZWFuX2V4aXQ7CiAJfQogCXNpemUgLT0gTVNHX0RFU0NSSVBUT1JfU0laRTsKQEAgLTE2MSw3ICsxNjMsNyBAQAogCWhlYWRwdHIgPSByZWFkbF9iZShNSVhBUlRfTUVNKG1nciwgTVNHX0lOQk9VTkRfRlJFRV9IRUFEKSk7CiAKIAlpZiAodGFpbHB0ciA9PSBoZWFkcHRyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yOiBubyBtZXNzYWdlIGZyYW1lIGF2YWlsYWJsZVxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJlcnJvcjogbm8gbWVzc2FnZSBmcmFtZSBhdmFpbGFibGVcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtMjY1LDcgKzI2Nyw4IEBACiAJaWYgKCEgdGltZW91dCkgewogCQkvKiBlcnJvciAtIG5vIGFjayAqLwogCQltdXRleF91bmxvY2soJm1nci0+bXNnX211dGV4KTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3I6IG5vIHJlc3BvbnNlIG9uIG1zZyAleFxuIiwgbXNnX2ZyYW1lKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCSJlcnJvcjogbm8gcmVzcG9uc2Ugb24gbXNnICV4XG4iLCBtc2dfZnJhbWUpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTI3OCw3ICsyODEsNyBAQAogCWVyciA9IGdldF9tc2cobWdyLCAmcmVzcCwgbXNnX2ZyYW1lKTsKIAogCWlmKCByZXF1ZXN0LT5tZXNzYWdlX2lkICE9IHJlc3AubWVzc2FnZV9pZCApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgIlJFU1BPTlNFIEVSUk9SIVxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJSRVNQT05TRSBFUlJPUiFcbiIpOwogCiAJbXV0ZXhfdW5sb2NrKCZtZ3ItPm1zZ19tdXRleCk7CiAJcmV0dXJuIGVycjsKQEAgLTMyMSw3ICszMjQsOCBAQAogCWlmICghIHRpbWVvdXQpIHsKIAkJLyogZXJyb3IgLSBubyBhY2sgKi8KIAkJbXV0ZXhfdW5sb2NrKCZtZ3ItPm1zZ19tdXRleCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yOiBub3RpZmljYXRpb24gJXggbm90IHJlY2VpdmVkXG4iLCBub3RpZl9ldmVudCk7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkiZXJyb3I6IG5vdGlmaWNhdGlvbiAleCBub3QgcmVjZWl2ZWRcbiIsIG5vdGlmX2V2ZW50KTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0zNzgsNyArMzgyLDkgQEAKIAkJCXJlc3Auc2l6ZSA9IHNpemVvZihtaXhhcnRfbXNnX2RhdGEpOwogCQkJZXJyID0gZ2V0X21zZyhtZ3IsICZyZXNwLCBhZGRyKTsKIAkJCWlmKCBlcnIgPCAwICkgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInRhc2tsZXQ6IGVycm9yKCVkKSByZWFkaW5nIG1mICV4XG4iLCBlcnIsIG1zZyk7CisJCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCQkJInRhc2tsZXQ6IGVycm9yKCVkKSByZWFkaW5nIG1mICV4XG4iLAorCQkJCQllcnIsIG1zZyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTM4OCwxMCArMzk0LDEzIEBACiAJCQljYXNlIE1TR19TVFJFQU1fU1RPUF9JTlBVVF9TVEFHRV9QQUNLRVQ6CiAJCQljYXNlIE1TR19TVFJFQU1fU1RPUF9PVVRQVVRfU1RBR0VfUEFDS0VUOgogCQkJCWlmKG1peGFydF9tc2dfZGF0YVswXSkKLQkJCQkJc25kX3ByaW50ayhLRVJOX0VSUiAidGFza2xldCA6IGVycm9yIE1TR19TVFJFQU1fU1QqKipfKioqUFVUX1NUQUdFX1BBQ0tFVCBzdGF0dXM9JXhcbiIsIG1peGFydF9tc2dfZGF0YVswXSk7CisJCQkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJCQkidGFza2xldCA6IGVycm9yIE1TR19TVFJFQU1fU1QqKipfKioqUFVUX1NUQUdFX1BBQ0tFVCBzdGF0dXM9JXhcbiIsCisJCQkJCQltaXhhcnRfbXNnX2RhdGFbMF0pOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlzbmRfcHJpbnRkZCgidGFza2xldCByZWNlaXZlZCBtZigleCkgOiBtc2dfaWQoJXgpIHVpZCgleCwgJXgpIHNpemUoJXpkKVxuIiwKKwkJCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCQkidGFza2xldCByZWNlaXZlZCBtZigleCkgOiBtc2dfaWQoJXgpIHVpZCgleCwgJXgpIHNpemUoJXpkKVxuIiwKIAkJCQkJICAgbXNnLCByZXNwLm1lc3NhZ2VfaWQsIHJlc3AudWlkLm9iamVjdF9pZCwgcmVzcC51aWQuZGVzYywgcmVzcC5zaXplKTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTQwMSw3ICs0MTAsOSBAQAogCQljYXNlIE1TR19UWVBFX0NPTU1BTkQ6CiAJCQkvKiBnZXRfbXNnKCkgbmVjZXNzYXJ5ICovCiAJCWRlZmF1bHQ6Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ0YXNrbGV0IGRvZXNuJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggbWVzc2FnZSAleFxuIiwgbXNnKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJInRhc2tsZXQgZG9lc24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCBtZXNzYWdlICV4XG4iLAorCQkJCW1zZyk7CiAJCX0gLyogc3dpdGNoIHR5cGUgKi8KIAogCQkvKiBkZWNyZW1lbnQgY291bnRlciAqLwpAQCAtNDUxLDcgKzQ2Miw5IEBACiAJCQlyZXNwLnNpemUgPSBzaXplb2YobWl4YXJ0X21zZ19kYXRhKTsKIAkJCWVyciA9IGdldF9tc2cobWdyLCAmcmVzcCwgbXNnICYgfk1TR19UWVBFX01BU0spOwogCQkJaWYoIGVyciA8IDAgKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW50ZXJydXB0OiBlcnJvciglZCkgcmVhZGluZyBtZiAleFxuIiwgZXJyLCBtc2cpOworCQkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJCSJpbnRlcnJ1cHQ6IGVycm9yKCVkKSByZWFkaW5nIG1mICV4XG4iLAorCQkJCQllcnIsIG1zZyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTQ3Miw3ICs0ODUsOCBAQAogCQkJCQlzdHJ1Y3QgbWl4YXJ0X3N0cmVhbSAqc3RyZWFtOwogCiAJCQkJCWlmICgoY2hpcF9udW1iZXIgPj0gbWdyLT5udW1fY2FyZHMpIHx8IChwY21fbnVtYmVyID49IE1JWEFSVF9QQ01fVE9UQUwpIHx8IChzdWJfbnVtYmVyID49IE1JWEFSVF9QTEFZQkFDS19TVFJFQU1TKSkgewotCQkJCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgTVNHX1NFUlZJQ0VTX1RJTUVSX05PVElGWSBidWZmZXJfaWQgKCV4KSBwb3MoJWQpXG4iLAorCQkJCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCQkJCQkiZXJyb3IgTVNHX1NFUlZJQ0VTX1RJTUVSX05PVElGWSBidWZmZXJfaWQgKCV4KSBwb3MoJWQpXG4iLAogCQkJCQkJCSAgIGJ1ZmZlcl9pZCwgbm90aWZ5LT5zdHJlYW1zW2ldLnNhbXBsZV9wb3NfbG93X3BhcnQpOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KQEAgLTUyNCwxOCArNTM4LDIyIEBACiAJCQkJCX0KICNlbmRpZgogCQkJCQkoKGNoYXIqKW1peGFydF9tc2dfZGF0YSlbcmVzcC5zaXplIC0gMV0gPSAwOwotCQkJCQlzbmRfcHJpbnRkZCgiTUlYQVJUIFRSQUNFIDogJXNcbiIsIChjaGFyKiltaXhhcnRfbXNnX2RhdGEpOworCQkJCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCQkJIk1JWEFSVCBUUkFDRSA6ICVzXG4iLAorCQkJCQkJKGNoYXIgKiltaXhhcnRfbXNnX2RhdGEpOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCX0KIAotCQkJc25kX3ByaW50ZGQoImNvbW1hbmQgJXggbm90IGhhbmRsZWRcbiIsIHJlc3AubWVzc2FnZV9pZCk7CisJCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAiY29tbWFuZCAleCBub3QgaGFuZGxlZFxuIiwKKwkJCQlyZXNwLm1lc3NhZ2VfaWQpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBNU0dfVFlQRV9OT1RJRlk6CiAJCQlpZihtc2cgJiBNU0dfQ0FOQ0VMX05PVElGWV9NQVNLKSB7CiAJCQkJbXNnICY9IH5NU0dfQ0FOQ0VMX05PVElGWV9NQVNLOwotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbmNlbGVkIG5vdGlmaWNhdGlvbiAleCAhXG4iLCBtc2cpOworCQkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJCSJjYW5jZWxlZCBub3RpZmljYXRpb24gJXggIVxuIiwgbXNnKTsKIAkJCX0KIAkJCS8qIG5vIGJyZWFrLCBjb250aW51ZSAhICovCiAJCWNhc2UgTVNHX1RZUEVfQU5TV0VSOgpAQCAtNTU2LDcgKzU3NCw4IEBACiAJCQlicmVhazsKIAkJY2FzZSBNU0dfVFlQRV9SRVFVRVNUOgogCQlkZWZhdWx0OgotCQkJc25kX3ByaW50ZGQoImludGVycnVwdCByZWNlaXZlZCByZXF1ZXN0ICV4XG4iLCBtc2cpOworCQkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCQkiaW50ZXJydXB0IHJlY2VpdmVkIHJlcXVlc3QgJXhcbiIsIG1zZyk7CiAJCQkvKiBUT0RPIDogYXJlIHRoZXJlIHRoaW5ncyB0byBkbyBoZXJlID8gKi8KIAkJCWJyZWFrOwogCQl9IC8qIHN3aXRjaCBvbiBtc2cgdHlwZSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21peGFydC9taXhhcnRfaHdkZXAuYyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X2h3ZGVwLmMKaW5kZXggZWNlMWY4My4uNTgxZTFlNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL21peGFydC9taXhhcnRfaHdkZXAuYworKysgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9od2RlcC5jCkBAIC0xNjUsNyArMTY1LDggQEAKIAogCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2cobWdyLCAmcmVxdWVzdCwgc2l6ZW9mKCpjb25uZWN0b3IpLCBjb25uZWN0b3IpOwogCWlmKChlcnIgPCAwKSB8fCAoY29ubmVjdG9yLT5lcnJvcl9jb2RlKSB8fCAoY29ubmVjdG9yLT51aWRfY291bnQgPiBNSVhBUlRfTUFYX1BIWVNfQ09OTkVDVE9SUykpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgTVNHX1NZU1RFTV9FTlVNX1BMQVlfQ09OTkVDVE9SXG4iKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCSJlcnJvciBNU0dfU1lTVEVNX0VOVU1fUExBWV9DT05ORUNUT1JcbiIpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIF9fZXJyb3I7CiAJfQpAQCAtMTg0LDcgKzE4NSw3IEBACiAJCQlwaXBlLT51aWRfbGVmdF9jb25uZWN0b3IgPSBjb25uZWN0b3ItPnVpZFtrXTsgICAgLyogZXZlbiAqLwogCQl9CiAKLQkJLyogc25kX3ByaW50ayhLRVJOX0RFQlVHICJwbGF5YmFjayBjb25uZWN0b3JbJWRdLm9iamVjdF9pZCA9ICV4XG4iLCBrLCBjb25uZWN0b3ItPnVpZFtrXS5vYmplY3RfaWQpOyAqLworCQkvKiBkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAicGxheWJhY2sgY29ubmVjdG9yWyVkXS5vYmplY3RfaWQgPSAleFxuIiwgaywgY29ubmVjdG9yLT51aWRba10ub2JqZWN0X2lkKTsgKi8KIAogCQkvKiBUT0RPOiByZWFsbHkgbmVlZCBzZW5kX21zZyBNU0dfQ09OTkVDVE9SX0dFVF9BVURJT19JTkZPIGZvciBlYWNoIGNvbm5lY3RvciA/IHBlcmhhcHMgZm9yIGFuYWxvZyBsZXZlbCBjYXBzID8gKi8KIAkJcmVxdWVzdC5tZXNzYWdlX2lkID0gTVNHX0NPTk5FQ1RPUl9HRVRfQVVESU9fSU5GTzsKQEAgLTE5NCwxMCArMTk1LDExIEBACiAKIAkJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2YoKmF1ZGlvX2luZm8pLCBhdWRpb19pbmZvKTsKIAkJaWYoIGVyciA8IDAgKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfQ09OTkVDVE9SX0dFVF9BVURJT19JTkZPXG4iKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJImVycm9yIE1TR19DT05ORUNUT1JfR0VUX0FVRElPX0lORk9cbiIpOwogCQkJZ290byBfX2Vycm9yOwogCQl9Ci0JCS8qc25kX3ByaW50ayhLRVJOX0RFQlVHICJwbGF5ICBhbmFsb2dfaW5mby5hbmFsb2dfbGV2ZWxfcHJlc2VudCA9ICV4XG4iLCBhdWRpb19pbmZvLT5pbmZvLmFuYWxvZ19pbmZvLmFuYWxvZ19sZXZlbF9wcmVzZW50KTsqLworCQkvKmRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJwbGF5ICBhbmFsb2dfaW5mby5hbmFsb2dfbGV2ZWxfcHJlc2VudCA9ICV4XG4iLCBhdWRpb19pbmZvLT5pbmZvLmFuYWxvZ19pbmZvLmFuYWxvZ19sZXZlbF9wcmVzZW50KTsqLwogCX0KIAogCXJlcXVlc3QubWVzc2FnZV9pZCA9IE1TR19TWVNURU1fRU5VTV9SRUNPUkRfQ09OTkVDVE9SOwpAQCAtMjA3LDcgKzIwOSw4IEBACiAKIAllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKG1nciwgJnJlcXVlc3QsIHNpemVvZigqY29ubmVjdG9yKSwgY29ubmVjdG9yKTsKIAlpZigoZXJyIDwgMCkgfHwgKGNvbm5lY3Rvci0+ZXJyb3JfY29kZSkgfHwgKGNvbm5lY3Rvci0+dWlkX2NvdW50ID4gTUlYQVJUX01BWF9QSFlTX0NPTk5FQ1RPUlMpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIE1TR19TWVNURU1fRU5VTV9SRUNPUkRfQ09OTkVDVE9SXG4iKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCSJlcnJvciBNU0dfU1lTVEVNX0VOVU1fUkVDT1JEX0NPTk5FQ1RPUlxuIik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gX19lcnJvcjsKIAl9CkBAIC0yMjYsNyArMjI5LDcgQEAKIAkJCXBpcGUtPnVpZF9sZWZ0X2Nvbm5lY3RvciA9IGNvbm5lY3Rvci0+dWlkW2tdOyAgICAvKiBldmVuICovCiAJCX0KIAotCQkvKiBzbmRfcHJpbnRrKEtFUk5fREVCVUcgImNhcHR1cmUgY29ubmVjdG9yWyVkXS5vYmplY3RfaWQgPSAleFxuIiwgaywgY29ubmVjdG9yLT51aWRba10ub2JqZWN0X2lkKTsgKi8KKwkJLyogZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgImNhcHR1cmUgY29ubmVjdG9yWyVkXS5vYmplY3RfaWQgPSAleFxuIiwgaywgY29ubmVjdG9yLT51aWRba10ub2JqZWN0X2lkKTsgKi8KIAogCQkvKiBUT0RPOiByZWFsbHkgbmVlZCBzZW5kX21zZyBNU0dfQ09OTkVDVE9SX0dFVF9BVURJT19JTkZPIGZvciBlYWNoIGNvbm5lY3RvciA/IHBlcmhhcHMgZm9yIGFuYWxvZyBsZXZlbCBjYXBzID8gKi8KIAkJcmVxdWVzdC5tZXNzYWdlX2lkID0gTVNHX0NPTk5FQ1RPUl9HRVRfQVVESU9fSU5GTzsKQEAgLTIzNiwxMCArMjM5LDExIEBACiAKIAkJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2YoKmF1ZGlvX2luZm8pLCBhdWRpb19pbmZvKTsKIAkJaWYoIGVyciA8IDAgKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfQ09OTkVDVE9SX0dFVF9BVURJT19JTkZPXG4iKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJImVycm9yIE1TR19DT05ORUNUT1JfR0VUX0FVRElPX0lORk9cbiIpOwogCQkJZ290byBfX2Vycm9yOwogCQl9Ci0JCS8qc25kX3ByaW50ayhLRVJOX0RFQlVHICJyZWMgIGFuYWxvZ19pbmZvLmFuYWxvZ19sZXZlbF9wcmVzZW50ID0gJXhcbiIsIGF1ZGlvX2luZm8tPmluZm8uYW5hbG9nX2luZm8uYW5hbG9nX2xldmVsX3ByZXNlbnQpOyovCisJCS8qZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgInJlYyAgYW5hbG9nX2luZm8uYW5hbG9nX2xldmVsX3ByZXNlbnQgPSAleFxuIiwgYXVkaW9faW5mby0+aW5mby5hbmFsb2dfaW5mby5hbmFsb2dfbGV2ZWxfcHJlc2VudCk7Ki8KIAl9CiAJZXJyID0gMDsKIApAQCAtMjcyLDcgKzI3Niw5IEBACiAJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2YoY29uc29sZV9tZ3IpLCAmY29uc29sZV9tZ3IpOwogCiAJaWYoIChlcnIgPCAwKSB8fCAoY29uc29sZV9tZ3IuZXJyb3JfY29kZSAhPSAwKSApIHsKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJlcnJvciBNU0dfQ09OU09MRV9HRVRfQ0xPQ0tfVUlEIDogZXJyPSV4XG4iLCBjb25zb2xlX21nci5lcnJvcl9jb2RlKTsKKwkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCSJlcnJvciBNU0dfQ09OU09MRV9HRVRfQ0xPQ0tfVUlEIDogZXJyPSV4XG4iLAorCQkJY29uc29sZV9tZ3IuZXJyb3JfY29kZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjg2LDcgKzI5Miw5IEBACiAKIAllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKG1nciwgJnJlcXVlc3QsIHNpemVvZihwaHlzX2lvKSwgJnBoeXNfaW8pOwogCWlmKCAoZXJyIDwgMCkgfHwgKCBwaHlzX2lvLmVycm9yX2NvZGUgIT0gMCApICkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfU1lTVEVNX0VOVU1fUEhZU0lDQUxfSU8gZXJyKCV4KSBlcnJvcl9jb2RlKCV4KVxuIiwgZXJyLCBwaHlzX2lvLmVycm9yX2NvZGUgKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCSJlcnJvciBNU0dfU1lTVEVNX0VOVU1fUEhZU0lDQUxfSU8gZXJyKCV4KSBlcnJvcl9jb2RlKCV4KVxuIiwKKwkJCWVyciwgcGh5c19pby5lcnJvcl9jb2RlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zMjIsNyArMzMwLDcgQEAKIAkvKiB0aGlzIGNvbW1hbmQgaGFzIG5vIGRhdGEuIHJlc3BvbnNlIGlzIGEgMzIgYml0IHN0YXR1cyAqLwogCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2cobWdyLCAmcmVxdWVzdCwgc2l6ZW9mKGspLCAmayk7CiAJaWYoIChlcnIgPCAwKSB8fCAoayAhPSAwKSApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgTVNHX1NZU1RFTV9TRU5EX1NZTkNIUk9fQ01EXG4iKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwgImVycm9yIE1TR19TWVNURU1fU0VORF9TWU5DSFJPX0NNRFxuIik7CiAJCXJldHVybiBlcnIgPT0gMCA/IC1FSU5WQUwgOiBlcnI7CiAJfQogCkBAIC0zNDgsNyArMzU2LDcgQEAKIAogCS8qIG1vdGhlcmJvYXJkIHhpbGlueCBzdGF0dXMgNSB3aWxsIHNheSB0aGF0IHRoZSBib2FyZCBpcyBwZXJmb3JtaW5nIGEgcmVzZXQgKi8KIAlpZiAoc3RhdHVzX3hpbGlueCA9PSA1KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIm1pWGFydCBpcyByZXNldHRpbmcgIVxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJtaVhhcnQgaXMgcmVzZXR0aW5nICFcbiIpOwogCQlyZXR1cm4gLUVBR0FJTjsgLyogdHJ5IGFnYWluIGxhdGVyICovCiAJfQogCkBAIC0zNTcsMTIgKzM2NSwxMyBAQAogCiAJCS8qIHhpbGlueCBhbHJlYWR5IGxvYWRlZCA/ICovIAogCQlpZiAoc3RhdHVzX3hpbGlueCA9PSA0KSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgInhpbGlueCBpcyBhbHJlYWR5IGxvYWRlZCAhXG4iKTsKKwkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJ4aWxpbnggaXMgYWxyZWFkeSBsb2FkZWQgIVxuIik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQkvKiB0aGUgc3RhdHVzIHNob3VsZCBiZSAwID09ICJpZGxlIiAqLwogCQlpZiAoc3RhdHVzX3hpbGlueCAhPSAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ4aWxpbnggbG9hZCBlcnJvciAhIHN0YXR1cyA9ICVkXG4iLAorCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCQkieGlsaW54IGxvYWQgZXJyb3IgISBzdGF0dXMgPSAlZFxuIiwKIAkJCQkgICBzdGF0dXNfeGlsaW54KTsKIAkJCXJldHVybiAtRUlPOyAvKiBtb2Rwcm9iIC1yIG1heSBoZWxwID8gKi8KIAkJfQpAQCAtMzkzLDEzICs0MDIsMTQgQEAKIAljYXNlIE1JWEFSVF9NT1RIRVJCT0FSRF9FTEZfSU5ERVg6CiAKIAkJaWYgKHN0YXR1c19lbGYgPT0gNCkgewotCQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJlbGYgZmlsZSBhbHJlYWR5IGxvYWRlZCAhXG4iKTsKKwkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJlbGYgZmlsZSBhbHJlYWR5IGxvYWRlZCAhXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CiAKIAkJLyogdGhlIHN0YXR1cyBzaG91bGQgYmUgMCA9PSAiaWRsZSIgKi8KIAkJaWYgKHN0YXR1c19lbGYgIT0gMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZWxmIGxvYWQgZXJyb3IgISBzdGF0dXMgPSAlZFxuIiwKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJImVsZiBsb2FkIGVycm9yICEgc3RhdHVzID0gJWRcbiIsCiAJCQkJICAgc3RhdHVzX2VsZik7CiAJCQlyZXR1cm4gLUVJTzsgLyogbW9kcHJvYiAtciBtYXkgaGVscCA/ICovCiAJCX0KQEAgLTQwNyw3ICs0MTcsNyBAQAogCQkvKiB3YWl0IGZvciB4aWxpbnggc3RhdHVzID09IDQgKi8KIAkJZXJyID0gbWl4YXJ0X3dhaXRfbmljZV9mb3JfcmVnaXN0ZXJfdmFsdWUoIG1nciwgTUlYQVJUX1BTRVVET1JFR19NWExYX1NUQVRVU19PRkZTRVQsIDEsIDQsIDUwMCk7IC8qIDVzZWMgKi8KIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInhpbGlueCB3YXMgbm90IGxvYWRlZCBvciAiCisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAieGlsaW54IHdhcyBub3QgbG9hZGVkIG9yICIKIAkJCQkgICAiY291bGQgbm90IGJlIHN0YXJ0ZWRcbiIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtNDI5LDcgKzQzOSw3IEBACiAJCS8qIHdhaXQgZm9yIGVsZiBzdGF0dXMgPT0gNCAqLwogCQllcnIgPSBtaXhhcnRfd2FpdF9uaWNlX2Zvcl9yZWdpc3Rlcl92YWx1ZSggbWdyLCBNSVhBUlRfUFNFVURPUkVHX0VMRl9TVEFUVVNfT0ZGU0VULCAxLCA0LCAzMDApOyAvKiAzc2VjICovCiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlbGYgY291bGQgbm90IGJlIHN0YXJ0ZWRcbiIpOworCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwgImVsZiBjb3VsZCBub3QgYmUgc3RhcnRlZFxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKQEAgLTQ0Myw3ICs0NTMsNyBAQAogCiAJCS8qIGVsZiBhbmQgeGlsaW54IHNob3VsZCBiZSBsb2FkZWQgKi8KIAkJaWYgKHN0YXR1c19lbGYgIT0gNCB8fCBzdGF0dXNfeGlsaW54ICE9IDQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAieGlsaW54IG9yIGVsZiBub3QgIgorCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwgInhpbGlueCBvciBlbGYgbm90ICIKIAkJCSAgICAgICAic3VjY2Vzc2Z1bGx5IGxvYWRlZFxuIik7CiAJCQlyZXR1cm4gLUVJTzsgLyogbW9kcHJvYiAtciBtYXkgaGVscCA/ICovCiAJCX0KQEAgLTQ1MSw3ICs0NjEsNyBAQAogCQkvKiB3YWl0IGZvciBkYXVnaHRlciBkZXRlY3Rpb24gIT0gMCAqLwogCQllcnIgPSBtaXhhcnRfd2FpdF9uaWNlX2Zvcl9yZWdpc3Rlcl92YWx1ZSggbWdyLCBNSVhBUlRfUFNFVURPUkVHX0RCUkRfUFJFU0VOQ0VfT0ZGU0VULCAwLCAwLCAzMCk7IC8qIDMwMG1zZWMgKi8KIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHN0YXJ0aW5nIGVsZiBmaWxlXG4iKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJlcnJvciBzdGFydGluZyBlbGYgZmlsZVxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKQEAgLTQ2Nyw3ICs0NzcsOCBAQAogCiAJCS8qIGRhdWdodGVyIHNob3VsZCBiZSBpZGxlICovCiAJCWlmIChzdGF0dXNfZGF1Z2h0ICE9IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZGF1Z2h0ZXIgbG9hZCBlcnJvciAhIHN0YXR1cyA9ICVkXG4iLAorCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCQkiZGF1Z2h0ZXIgbG9hZCBlcnJvciAhIHN0YXR1cyA9ICVkXG4iLAogCQkJICAgICAgIHN0YXR1c19kYXVnaHQpOwogCQkJcmV0dXJuIC1FSU87IC8qIG1vZHByb2IgLXIgbWF5IGhlbHAgPyAqLwogCQl9CkBAIC00ODcsNyArNDk4LDcgQEAKIAkJLyogd2FpdCBmb3Igc3RhdHVzID09IDIgKi8KIAkJZXJyID0gbWl4YXJ0X3dhaXRfbmljZV9mb3JfcmVnaXN0ZXJfdmFsdWUoIG1nciwgTUlYQVJUX1BTRVVET1JFR19EWExYX1NUQVRVU19PRkZTRVQsIDEsIDIsIDMwKTsgLyogMzAwbXNlYyAqLwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZGF1Z2h0ZXIgYm9hcmQgbG9hZCBlcnJvclxuIik7CisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAiZGF1Z2h0ZXIgYm9hcmQgbG9hZCBlcnJvclxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKQEAgLTUwOSw3ICs1MjAsNyBAQAogICAgICAgICAvKiB3YWl0IGZvciBkYXVnaHRlciBzdGF0dXMgPT0gMyAqLwogICAgICAgICBlcnIgPSBtaXhhcnRfd2FpdF9uaWNlX2Zvcl9yZWdpc3Rlcl92YWx1ZSggbWdyLCBNSVhBUlRfUFNFVURPUkVHX0RYTFhfU1RBVFVTX09GRlNFVCwgMSwgMywgMzAwKTsgLyogM3NlYyAqLwogICAgICAgICBpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCiAJCQkgICAiZGF1Z2h0ZXIgYm9hcmQgY291bGQgbm90IGJlIGluaXRpYWxpc2VkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC01MjAsNyArNTMxLDcgQEAKIAkvKiBmaXJzdCBjb21tdW5pY2F0aW9uIHdpdGggZW1iZWRkZWQgKi8KIAllcnIgPSBtaXhhcnRfZmlyc3RfaW5pdChtZ3IpOwogICAgICAgICBpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJtaVhhcnQgY291bGQgbm90IGJlIHNldCB1cFxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJtaVhhcnQgY291bGQgbm90IGJlIHNldCB1cFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC01NDAsNyArNTUxLDggQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX3ByaW50ZGQoIm1pWGFydCBmaXJtd2FyZSBkb3dubG9hZGVkIGFuZCBzdWNjZXNzZnVsbHkgc2V0IHVwXG4iKTsKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkibWlYYXJ0IGZpcm13YXJlIGRvd25sb2FkZWQgYW5kIHN1Y2Nlc3NmdWxseSBzZXQgdXBcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NTksNyArNTcxLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJCXNwcmludGYocGF0aCwgIm1peGFydC8lcyIsIGZ3X2ZpbGVzW2ldKTsKIAkJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCBwYXRoLCAmbWdyLT5wY2ktPmRldikpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIm1pWGFydDogY2FuJ3QgbG9hZCBmaXJtd2FyZSAlc1xuIiwgcGF0aCk7CisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCSJtaVhhcnQ6IGNhbid0IGxvYWQgZmlybXdhcmUgJXNcbiIsIHBhdGgpOwogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCX0KIAkJLyogZmFrZSBod2RlcCBkc3AgcmVjb3JkICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9taXhlci5jIGIvc291bmQvcGNpL21peGFydC9taXhhcnRfbWl4ZXIuYwppbmRleCAzYmE2MTc0Li4yNGExOTU1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9taXhlci5jCisrKyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X21peGVyLmMKQEAgLTMyOSw3ICszMjksOSBAQAogCiAJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhjaGlwLT5tZ3IsICZyZXF1ZXN0LCBzaXplb2YocmVzcCksICZyZXNwKTsKIAlpZigoZXJyPDApIHx8IChyZXNwLmVycm9yX2NvZGUpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiZXJyb3IgTVNHX1BIWVNJQ0FMSU9fU0VUX0xFVkVMIGNhcmQoJWQpIGlzX2NhcHR1cmUoJWQpIGVycm9yX2NvZGUoJXgpXG4iLCBjaGlwLT5jaGlwX2lkeCwgaXNfY2FwdHVyZSwgcmVzcC5lcnJvcl9jb2RlKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiZXJyb3IgTVNHX1BIWVNJQ0FMSU9fU0VUX0xFVkVMIGNhcmQoJWQpIGlzX2NhcHR1cmUoJWQpIGVycm9yX2NvZGUoJXgpXG4iLAorCQkJY2hpcC0+Y2hpcF9pZHgsIGlzX2NhcHR1cmUsIHJlc3AuZXJyb3JfY29kZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKQEAgLTc2Miw3ICs3NjQsOSBAQAogCiAJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhjaGlwLT5tZ3IsICZyZXF1ZXN0LCBzaXplb2Yoc3RhdHVzKSwgJnN0YXR1cyk7CiAJaWYoKGVycjwwKSB8fCBzdGF0dXMpIHsKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJlcnJvciBNU0dfU1RSRUFNX1NFVF9PVVRfU1RSRUFNX0xFVkVMIGNhcmQoJWQpIHN0YXR1cygleClcbiIsIGNoaXAtPmNoaXBfaWR4LCBzdGF0dXMpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJlcnJvciBNU0dfU1RSRUFNX1NFVF9PVVRfU1RSRUFNX0xFVkVMIGNhcmQoJWQpIHN0YXR1cygleClcbiIsCisJCQljaGlwLT5jaGlwX2lkeCwgc3RhdHVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwpAQCAtODA1LDcgKzgwOSw5IEBACiAKIAllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKGNoaXAtPm1nciwgJnJlcXVlc3QsIHNpemVvZihzdGF0dXMpLCAmc3RhdHVzKTsKIAlpZigoZXJyPDApIHx8IHN0YXR1cykgewotCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImVycm9yIE1TR19TVFJFQU1fU0VUX0lOX0FVRElPX0xFVkVMIGNhcmQoJWQpIHN0YXR1cygleClcbiIsIGNoaXAtPmNoaXBfaWR4LCBzdGF0dXMpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJlcnJvciBNU0dfU1RSRUFNX1NFVF9JTl9BVURJT19MRVZFTCBjYXJkKCVkKSBzdGF0dXMoJXgpXG4iLAorCQkJY2hpcC0+Y2hpcF9pZHgsIHN0YXR1cyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKQEAgLTk3Nyw3ICs5ODMsOSBAQAogCiAJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhjaGlwLT5tZ3IsICZyZXF1ZXN0LCBzaXplb2YocmVzcCksICZyZXNwKTsKIAlpZigoZXJyPDApIHx8IHJlc3ApIHsKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJlcnJvciBNU0dfQ09OTkVDVE9SX1NFVF9PVVRfQVVESU9fTEVWRUwgY2FyZCglZCkgcmVzcCgleClcbiIsIGNoaXAtPmNoaXBfaWR4LCByZXNwKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiZXJyb3IgTVNHX0NPTk5FQ1RPUl9TRVRfT1VUX0FVRElPX0xFVkVMIGNhcmQoJWQpIHJlc3AoJXgpXG4iLAorCQkJY2hpcC0+Y2hpcF9pZHgsIHJlc3ApOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYyBiL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jCmluZGV4IGZlNzlmZmYuLmRkYzYwMjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jCisrKyBiL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jCkBAIC0zMTgsNyArMzE4LDggQEAKIAlvZmZzZXQgLT0gY2hpcC0+YnVmZmVyX3N0YXJ0OwogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKIAlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gY2hpcC0+YnVmZmVyX3NpemUpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAid3JpdGVfYnVmZmVyIGludmFsaWQgb2Zmc2V0ID0gJWQgc2l6ZSA9ICVkXG4iLAorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJ3cml0ZV9idWZmZXIgaW52YWxpZCBvZmZzZXQgPSAlZCBzaXplID0gJWRcbiIsCiAJCQkgICBvZmZzZXQsIHNpemUpOwogCQlyZXR1cm47CiAJfQpAQCAtMzY2LDcgKzM2Nyw4IEBACiAJCSBOTV9SRUNPUkRfUkVHX09GRlNFVCA6IE5NX1BMQVlCQUNLX1JFR19PRkZTRVQpOwogCiAJaWYgKHNuZF9ubTI1Nl9yZWFkYihjaGlwLCBwb2Zmc2V0KSAmIDEpIHsKLQkJc25kX3ByaW50ZCgiTk0yNTY6IEVuZ2luZSB3YXMgZW5hYmxlZCB3aGlsZSBsb2FkaW5nIGNvZWZmaWNpZW50cyFcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJOTTI1NjogRW5naW5lIHdhcyBlbmFibGVkIHdoaWxlIGxvYWRpbmcgY29lZmZpY2llbnRzIVxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQ2Niw3ICs0NjgsOCBAQAogCWlmIChjaGlwLT5pcnEgPCAwKSB7CiAJCWlmIChyZXF1ZXN0X2lycShjaGlwLT5wY2ktPmlycSwgY2hpcC0+aW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgY2hpcC0+cGNpLT5pcnEpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgY2hpcC0+cGNpLT5pcnEpOwogCQkJbXV0ZXhfdW5sb2NrKCZjaGlwLT5pcnFfbXV0ZXgpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQpAQCAtMTAzOSw3ICsxMDQyLDcgQEAKIAlpZiAoc3RhdHVzICYgTk1fTUlTQ19JTlRfMSkgewogCQlzdGF0dXMgJj0gfk5NX01JU0NfSU5UXzE7CiAJCU5NX0FDS19JTlQoY2hpcCwgTk1fTUlTQ19JTlRfMSk7Ci0JCXNuZF9wcmludGQoIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzFcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzFcbiIpOwogCQlzbmRfbm0yNTZfd3JpdGV3KGNoaXAsIE5NX0lOVF9SRUcsIDB4ODAwMCk7CiAJCWNieXRlID0gc25kX25tMjU2X3JlYWRiKGNoaXAsIDB4NDAwKTsKIAkJc25kX25tMjU2X3dyaXRlYihjaGlwLCAweDQwMCwgY2J5dGUgfCAyKTsKQEAgLTEwNDgsMTQgKzEwNTEsMTUgQEAKIAlpZiAoc3RhdHVzICYgTk1fTUlTQ19JTlRfMikgewogCQlzdGF0dXMgJj0gfk5NX01JU0NfSU5UXzI7CiAJCU5NX0FDS19JTlQoY2hpcCwgTk1fTUlTQ19JTlRfMik7Ci0JCXNuZF9wcmludGQoIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzJcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzJcbiIpOwogCQljYnl0ZSA9IHNuZF9ubTI1Nl9yZWFkYihjaGlwLCAweDQwMCk7CiAJCXNuZF9ubTI1Nl93cml0ZWIoY2hpcCwgMHg0MDAsIGNieXRlICYgfjIpOwogCX0KIAogCS8qIFVua25vd24gaW50ZXJydXB0LiAqLwogCWlmIChzdGF0dXMpIHsKLQkJc25kX3ByaW50ZCgiTk0yNTY6IEZpcmUgaW4gdGhlIGhvbGUhIFVua25vd24gc3RhdHVzIDB4JXhcbiIsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIk5NMjU2OiBGaXJlIGluIHRoZSBob2xlISBVbmtub3duIHN0YXR1cyAweCV4XG4iLAogCQkJICAgc3RhdHVzKTsKIAkJLyogUHJheS4gKi8KIAkJTk1fQUNLX0lOVChjaGlwLCBzdGF0dXMpOwpAQCAtMTEwNCw3ICsxMTA4LDcgQEAKIAlpZiAoc3RhdHVzICYgTk0yX01JU0NfSU5UXzEpIHsKIAkJc3RhdHVzICY9IH5OTTJfTUlTQ19JTlRfMTsKIAkJTk0yX0FDS19JTlQoY2hpcCwgTk0yX01JU0NfSU5UXzEpOwotCQlzbmRfcHJpbnRkKCJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMxXG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMxXG4iKTsKIAkJY2J5dGUgPSBzbmRfbm0yNTZfcmVhZGIoY2hpcCwgMHg0MDApOwogCQlzbmRfbm0yNTZfd3JpdGViKGNoaXAsIDB4NDAwLCBjYnl0ZSB8IDIpOwogCX0KQEAgLTExMTIsMTQgKzExMTYsMTUgQEAKIAlpZiAoc3RhdHVzICYgTk0yX01JU0NfSU5UXzIpIHsKIAkJc3RhdHVzICY9IH5OTTJfTUlTQ19JTlRfMjsKIAkJTk0yX0FDS19JTlQoY2hpcCwgTk0yX01JU0NfSU5UXzIpOwotCQlzbmRfcHJpbnRkKCJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMyXG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMyXG4iKTsKIAkJY2J5dGUgPSBzbmRfbm0yNTZfcmVhZGIoY2hpcCwgMHg0MDApOwogCQlzbmRfbm0yNTZfd3JpdGViKGNoaXAsIDB4NDAwLCBjYnl0ZSAmIH4yKTsKIAl9CiAKIAkvKiBVbmtub3duIGludGVycnVwdC4gKi8KIAlpZiAoc3RhdHVzKSB7Ci0JCXNuZF9wcmludGQoIk5NMjU2OiBGaXJlIGluIHRoZSBob2xlISBVbmtub3duIHN0YXR1cyAweCV4XG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJOTTI1NjogRmlyZSBpbiB0aGUgaG9sZSEgVW5rbm93biBzdGF0dXMgMHgleFxuIiwKIAkJCSAgIHN0YXR1cyk7CiAJCS8qIFByYXkuICovCiAJCU5NMl9BQ0tfSU5UKGNoaXAsIHN0YXR1cyk7CkBAIC0xMjQ1LDcgKzEyNTAsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAJfQotCXNuZF9wcmludGQoIm5tMjU2OiBhYzk3IGNvZGVjIG5vdCByZWFkeS4uXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIm5tMjU2OiBhYzk3IGNvZGVjIG5vdCByZWFkeS4uXG4iKTsKIH0KIAogLyogc3RhdGljIHJlc29sdXRpb24gdGFibGUgKi8KQEAgLTEzNDcsNyArMTM1Miw4IEBACiAKIAl0ZW1wID0gaW9yZW1hcF9ub2NhY2hlKGNoaXAtPmJ1ZmZlcl9hZGRyICsgY2hpcC0+YnVmZmVyX2VuZCAtIDB4NDAwLCAxNik7CiAJaWYgKHRlbXAgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gc2NhbiBmb3IgY2FyZCBzaWduYXR1cmUgaW4gdmlkZW8gUkFNXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiVW5hYmxlIHRvIHNjYW4gZm9yIGNhcmQgc2lnbmF0dXJlIGluIHZpZGVvIFJBTVxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC0xMzYxLDEyICsxMzY3LDE0IEBACiAJCWlmIChwb2ludGVyID09IDB4ZmZmZmZmZmYgfHwKIAkJICAgIHBvaW50ZXIgPCBjaGlwLT5idWZmZXJfc2l6ZSB8fAogCQkgICAgcG9pbnRlciA+IGNoaXAtPmJ1ZmZlcl9lbmQpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgc2lnbmF0dXJlIGZvdW5kOiAweCV4XG4iLCBwb2ludGVyKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJpbnZhbGlkIHNpZ25hdHVyZSBmb3VuZDogMHgleFxuIiwgcG9pbnRlcik7CiAJCQlpb3VubWFwKHRlbXApOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0gZWxzZSB7CiAJCQlwb2ludGVyX2ZvdW5kID0gcG9pbnRlcjsKLQkJCXByaW50ayhLRVJOX0lORk8gIm5tMjU2OiBmb3VuZCBjYXJkIHNpZ25hdHVyZSBpbiB2aWRlbyBSQU06IDB4JXhcbiIsCisJCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJICJmb3VuZCBjYXJkIHNpZ25hdHVyZSBpbiB2aWRlbyBSQU06IDB4JXhcbiIsCiAJCQkgICAgICAgcG9pbnRlcik7CiAJCX0KIAl9CkBAIC0xNDExLDggKzE0MTksNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibm0yNTY6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTE1MjAsMTQgKzE1MjcsMTUgQEAKIAljaGlwLT5yZXNfY3BvcnQgPSByZXF1ZXN0X21lbV9yZWdpb24oY2hpcC0+Y3BvcnRfYWRkciwgTk1fUE9SVDJfU0laRSwKIAkJCQkJICAgICBjYXJkLT5kcml2ZXIpOwogCWlmIChjaGlwLT5yZXNfY3BvcnQgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJtZW1vcnkgcmVnaW9uIDB4JWx4IChzaXplIDB4JXgpIGJ1c3lcbiIsCisJCWRldl9lcnIoY2FyZC0+ZGV2LCAibWVtb3J5IHJlZ2lvbiAweCVseCAoc2l6ZSAweCV4KSBidXN5XG4iLAogCQkJICAgY2hpcC0+Y3BvcnRfYWRkciwgTk1fUE9SVDJfU0laRSk7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBfX2Vycm9yOwogCX0KIAljaGlwLT5jcG9ydCA9IGlvcmVtYXBfbm9jYWNoZShjaGlwLT5jcG9ydF9hZGRyLCBOTV9QT1JUMl9TSVpFKTsKIAlpZiAoY2hpcC0+Y3BvcnQgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gbWFwIGNvbnRyb2wgcG9ydCAlbHhcbiIsIGNoaXAtPmNwb3J0X2FkZHIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBtYXAgY29udHJvbCBwb3J0ICVseFxuIiwKKwkJCWNoaXAtPmNwb3J0X2FkZHIpOwogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIF9fZXJyb3I7CiAJfQpAQCAtMTUzNywxMiArMTU0NSwxNCBAQAogCQlwdmFsID0gc25kX25tMjU2X3JlYWR3KGNoaXAsIE5NX01JWEVSX1BSRVNFTkNFKTsKIAkJaWYgKChwdmFsICYgTk1fUFJFU0VOQ0VfTUFTSykgIT0gTk1fUFJFU0VOQ0VfVkFMVUUpIHsKIAkJCWlmICghIGZvcmNlX2FjOTcpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIm5tMjU2OiBubyBhYzk3IGlzIGZvdW5kIVxuIik7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICIgIGZvcmNlIHRoZSBkcml2ZXIgdG8gbG9hZCBieSAiCi0JCQkJICAgICAgICJwYXNzaW5nIGluIHRoZSBtb2R1bGUgcGFyYW1ldGVyXG4iKTsKLQkJCQlwcmludGsoS0VSTl9FUlIgIiAgICBmb3JjZV9hYzk3PTFcbiIpOwotCQkJCXByaW50ayhLRVJOX0VSUiAiICBvciB0cnkgc2IxNiwgb3BsM3NhMiwgb3IgIgotCQkJCSAgICAgICAiY3M0MjN4IGRyaXZlcnMgaW5zdGVhZC5cbiIpOworCQkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCQkibm8gYWM5NyBpcyBmb3VuZCFcbiIpOworCQkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCQkiZm9yY2UgdGhlIGRyaXZlciB0byBsb2FkIGJ5IHBhc3NpbmcgaW4gdGhlIG1vZHVsZSBwYXJhbWV0ZXJcbiIpOworCQkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCQkiIGZvcmNlX2FjOTc9MVxuIik7CisJCQkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkJCSJvciB0cnkgc2IxNiwgb3BsM3NhMiwgb3IgY3M0MjN4IGRyaXZlcnMgaW5zdGVhZC5cbiIpOwogCQkJCWVyciA9IC1FTlhJTzsKIAkJCQlnb3RvIF9fZXJyb3I7CiAJCQl9CkBAIC0xNTgxLDE0ICsxNTkxLDE0IEBACiAJY2hpcC0+YnVmZmVyX3N0YXJ0ID0gY2hpcC0+YnVmZmVyX2VuZCAtIGNoaXAtPmJ1ZmZlcl9zaXplOwogCWNoaXAtPmJ1ZmZlcl9hZGRyICs9IGNoaXAtPmJ1ZmZlcl9zdGFydDsKIAotCXByaW50ayhLRVJOX0lORk8gIm5tMjU2OiBNYXBwaW5nIHBvcnQgMSBmcm9tIDB4JXggLSAweCV4XG4iLAorCWRldl9pbmZvKGNhcmQtPmRldiwgIk1hcHBpbmcgcG9ydCAxIGZyb20gMHgleCAtIDB4JXhcbiIsCiAJICAgICAgIGNoaXAtPmJ1ZmZlcl9zdGFydCwgY2hpcC0+YnVmZmVyX2VuZCk7CiAKIAljaGlwLT5yZXNfYnVmZmVyID0gcmVxdWVzdF9tZW1fcmVnaW9uKGNoaXAtPmJ1ZmZlcl9hZGRyLAogCQkJCQkgICAgICBjaGlwLT5idWZmZXJfc2l6ZSwKIAkJCQkJICAgICAgY2FyZC0+ZHJpdmVyKTsKIAlpZiAoY2hpcC0+cmVzX2J1ZmZlciA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIm5tMjU2OiBidWZmZXIgMHglbHggKHNpemUgMHgleCkgYnVzeVxuIiwKKwkJZGV2X2VycihjYXJkLT5kZXYsICJidWZmZXIgMHglbHggKHNpemUgMHgleCkgYnVzeVxuIiwKIAkJCSAgIGNoaXAtPmJ1ZmZlcl9hZGRyLCBjaGlwLT5idWZmZXJfc2l6ZSk7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBfX2Vycm9yOwpAQCAtMTU5Niw3ICsxNjA2LDggQEAKIAljaGlwLT5idWZmZXIgPSBpb3JlbWFwX25vY2FjaGUoY2hpcC0+YnVmZmVyX2FkZHIsIGNoaXAtPmJ1ZmZlcl9zaXplKTsKIAlpZiAoY2hpcC0+YnVmZmVyID09IE5VTEwpIHsKIAkJZXJyID0gLUVOT01FTTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIG1hcCByaW5nIGJ1ZmZlciBhdCAlbHhcbiIsIGNoaXAtPmJ1ZmZlcl9hZGRyKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gbWFwIHJpbmcgYnVmZmVyIGF0ICVseFxuIiwKKwkJCWNoaXAtPmJ1ZmZlcl9hZGRyKTsKIAkJZ290byBfX2Vycm9yOwogCX0KIApAQCAtMTYyNiw4ICsxNjM3LDYgQEAKIAlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY2hpcCwgJm9wcykpIDwgMCkKIAkJZ290byBfX2Vycm9yOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKmNoaXBfcmV0ID0gY2hpcDsKIAlyZXR1cm4gMDsKIApAQCAtMTY2MCwxMiArMTY2OSwxMiBAQAogCiAJcSA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgbm0yNTZfcXVpcmtzKTsKIAlpZiAocSkgewotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIm5tMjU2OiBFbmFibGVkIHF1aXJrIGZvciAlcy5cbiIsCisJCWRldl9kYmcoJnBjaS0+ZGV2LCAiRW5hYmxlZCBxdWlyayBmb3IgJXMuXG4iLAogCQkJICAgIHNuZF9wY2lfcXVpcmtfbmFtZShxKSk7CiAJCXN3aXRjaCAocS0+dmFsdWUpIHsKIAkJY2FzZSBOTV9CTEFDS0xJU1RFRDoKLQkJCXByaW50ayhLRVJOX0lORk8gIm5tMjU2OiBUaGUgZGV2aWNlIGlzIGJsYWNrbGlzdGVkLiAiCi0JCQkgICAgICAgIkxvYWRpbmcgc3RvcHBlZFxuIik7CisJCQlkZXZfaW5mbygmcGNpLT5kZXYsCisJCQkJICJUaGUgZGV2aWNlIGlzIGJsYWNrbGlzdGVkLiBMb2FkaW5nIHN0b3BwZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCWNhc2UgTk1fUkVTRVRfV09SS0FST1VORF8yOgogCQkJcmVzZXRfd29ya2Fyb3VuZF8yID0gMTsKQEAgLTE2NzYsNyArMTY4NSw3IEBACiAJCX0KIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMTY5MSw3ICsxNzAwLDcgQEAKIAkJc3RyY3B5KGNhcmQtPmRyaXZlciwgIk5NMjU2WEwrIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgZGV2aWNlIGlkIDB4JXhcbiIsIHBjaS0+ZGV2aWNlKTsKKwkJZGV2X2VycigmcGNpLT5kZXYsICJpbnZhbGlkIGRldmljZSBpZCAweCV4XG4iLCBwY2ktPmRldmljZSk7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE3MTQsMTIgKzE3MjMsMTIgQEAKIAljYXJkLT5wcml2YXRlX2RhdGEgPSBjaGlwOwogCiAJaWYgKHJlc2V0X3dvcmthcm91bmQpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJubTI1NjogcmVzZXRfd29ya2Fyb3VuZCBhY3RpdmF0ZWRcbiIpOworCQlkZXZfZGJnKCZwY2ktPmRldiwgInJlc2V0X3dvcmthcm91bmQgYWN0aXZhdGVkXG4iKTsKIAkJY2hpcC0+cmVzZXRfd29ya2Fyb3VuZCA9IDE7CiAJfQogCiAJaWYgKHJlc2V0X3dvcmthcm91bmRfMikgewotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIm5tMjU2OiByZXNldF93b3JrYXJvdW5kXzIgYWN0aXZhdGVkXG4iKTsKKwkJZGV2X2RiZygmcGNpLT5kZXYsICJyZXNldF93b3JrYXJvdW5kXzIgYWN0aXZhdGVkXG4iKTsKIAkJY2hpcC0+cmVzZXRfd29ya2Fyb3VuZF8yID0gMTsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX2lvLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9pby5jCmluZGV4IDMyNzQ5MDcuLjRiOGEzMmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX2lvLmMKKysrIGIvc291bmQvcGNpL294eWdlbi9veHlnZW5faW8uYwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgd3JpdGUgdGltZW91dFxuIik7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJBQyc5NyB3cml0ZSB0aW1lb3V0XG4iKTsKIH0KIEVYUE9SVF9TWU1CT0wob3h5Z2VuX3dyaXRlX2FjOTcpOwogCkBAIC0xNzksNyArMTc5LDcgQEAKIAkJCXJlZyBePSAweGZmZmY7CiAJCX0KIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgcmVhZCB0aW1lb3V0IG9uIGNvZGVjICV1XG4iLCBjb2RlYyk7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJBQyc5NyByZWFkIHRpbWVvdXQgb24gY29kZWMgJXVcbiIsIGNvZGVjKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wob3h5Z2VuX3JlYWRfYWM5Nyk7CkBAIC0yMDgsNyArMjA4LDcgQEAKIAkJCQkJCU9YWUdFTl9TUElfQlVTWSkgPT0gMCkKIAkJCXJldHVybiAwOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJveHlnZW46IFNQSSB3YWl0IHRpbWVvdXRcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAib3h5Z2VuOiBTUEkgd2FpdCB0aW1lb3V0XG4iKTsKIAlyZXR1cm4gLUVJTzsKIH0KIApAQCAtMjg4LDUgKzI4OCw1IEBACiAJCSAgICAgICYgT1hZR0VOX0VFUFJPTV9CVVNZKSkKIAkJCXJldHVybjsKIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiRUVQUk9NIHdyaXRlIHRpbWVvdXRcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiRUVQUk9NIHdyaXRlIHRpbWVvdXRcbiIpOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW5fbGliLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYwppbmRleCBiMGNiNDhhLi5iNjdlMzA2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYwpAQCAtMzEzLDcgKzMxMyw3IEBACiAJCW94eWdlbl9jbGVhcl9iaXRzOChjaGlwLCBPWFlHRU5fTUlTQywKIAkJCQkgICBPWFlHRU5fTUlTQ19XUklURV9QQ0lfU1VCSUQpOwogCi0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJFRVBST00gSUQgcmVzdG9yZWRcbiIpOworCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsICJFRVBST00gSUQgcmVzdG9yZWRcbiIpOwogCX0KIH0KIApAQCAtNTk1LDcgKzU5NSw4IEBACiAJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgb3duZXIsIHNpemVvZigqY2hpcCksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleCwgaWQsIG93bmVyLAorCQkJICAgc2l6ZW9mKCpjaGlwKSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC02MTYsMTMgKzYxNywxMyBAQAogCiAJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksIERSSVZFUik7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IHJlc2VydmUgUENJIHJlc291cmNlc1xuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IHJlc2VydmUgUENJIHJlc291cmNlc1xuIik7CiAJCWdvdG8gZXJyX3BjaV9lbmFibGU7CiAJfQogCiAJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBjaSwgMCkgJiBJT1JFU09VUkNFX0lPKSB8fAogCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBjaSwgMCkgPCBPWFlHRU5fSU9fU0laRSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnZhbGlkIFBDSSBJL08gcmFuZ2VcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImludmFsaWQgUENJIEkvTyByYW5nZVxuIik7CiAJCWVyciA9IC1FTlhJTzsKIAkJZ290byBlcnJfcGNpX3JlZ2lvbnM7CiAJfQpAQCAtNjQ4LDcgKzY0OSw2IEBACiAJfQogCiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CiAJY2FyZC0+cHJpdmF0ZV9mcmVlID0gb3h5Z2VuX2NhcmRfZnJlZTsKIAogCWNvbmZpZ3VyZV9wY2llX2JyaWRnZShwY2kpOwpAQCAtNjU4LDcgKzY1OCw3IEBACiAJZXJyID0gcmVxdWVzdF9pcnEocGNpLT5pcnEsIG94eWdlbl9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJICBLQlVJTERfTU9ETkFNRSwgY2hpcCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGdyYWIgaW50ZXJydXB0ICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGdyYWIgaW50ZXJydXB0ICVkXG4iLCBwY2ktPmlycSk7CiAJCWdvdG8gZXJyX2NhcmQ7CiAJfQogCWNoaXAtPmlycSA9IHBjaS0+aXJxOwpAQCAtNzk2LDcgKzc5Niw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IHJlZW5hYmxlIGRldmljZSIpOworCQlkZXZfZXJyKGRldiwgImNhbm5vdCByZWVuYWJsZSBkZXZpY2UiKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi94b25hcl9oZG1pLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX2hkbWkuYwppbmRleCAxMzZkYWM2YS4uOTFkOTJiYyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL294eWdlbi94b25hcl9oZG1pLmMKKysrIGIvc291bmQvcGNpL294eWdlbi94b25hcl9oZG1pLmMKQEAgLTEyMCw3ICsxMjAsNyBAQAogCWlmIChjaGlwLT51YXJ0X2lucHV0X2NvdW50ID49IDIgJiYKIAkgICAgY2hpcC0+dWFydF9pbnB1dFtjaGlwLT51YXJ0X2lucHV0X2NvdW50IC0gMl0gPT0gJ08nICYmCiAJICAgIGNoaXAtPnVhcnRfaW5wdXRbY2hpcC0+dWFydF9pbnB1dF9jb3VudCAtIDFdID09ICdLJykgewotCQlwcmludGsoS0VSTl9ERUJVRyAibWVzc2FnZSBmcm9tIEhETUkgY2hpcCByZWNlaXZlZDpcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIm1lc3NhZ2UgZnJvbSBIRE1JIGNoaXAgcmVjZWl2ZWQ6XG4iKTsKIAkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX09GRlNFVCwKIAkJCQkgICAgIGNoaXAtPnVhcnRfaW5wdXQsIGNoaXAtPnVhcnRfaW5wdXRfY291bnQpOwogCQljaGlwLT51YXJ0X2lucHV0X2NvdW50ID0gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfbGliLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX2xpYi5jCmluZGV4IDBlYmU3ZjUuLjcwNmIxYTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfbGliLmMKKysrIGIvc291bmQvcGNpL294eWdlbi94b25hcl9saWIuYwpAQCAtNTYsOSArNTYsOSBAQAogCWlmIChoYXNfcG93ZXIgIT0gZGF0YS0+aGFzX3Bvd2VyKSB7CiAJCWRhdGEtPmhhc19wb3dlciA9IGhhc19wb3dlcjsKIAkJaWYgKGhhc19wb3dlcikgewotCQkJc25kX3ByaW50ayhLRVJOX05PVElDRSAicG93ZXIgcmVzdG9yZWRcbiIpOworCQkJZGV2X25vdGljZShjaGlwLT5jYXJkLT5kZXYsICJwb3dlciByZXN0b3JlZFxuIik7CiAJCX0gZWxzZSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fQ1JJVAorCQkJZGV2X2NyaXQoY2hpcC0+Y2FyZC0+ZGV2LAogCQkJCSAgICJIZXkhIERvbid0IHVucGx1ZyB0aGUgcG93ZXIgY2FibGUhXG4iKTsKIAkJCS8qIFRPRE86IHN0b3AgUENNcyAqLwogCQl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHIuYyBiL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCmluZGV4IGQzNzliMjguLjhkMDk0NDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCisrKyBiL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCkBAIC0yODQsNyArMjg0LDcgQEAKIAkJCXJtaC5jbWRfbGVuID0gMzsKIAkJCWVyciA9IHBjeGhyX3NlbmRfbXNnKG1nciwgJnJtaCk7CiAJCQlpZiAoZXJyIDwgMCkgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAogCQkJCQkgICAiZXJyb3IgQ01EX0FDQ0VTU19JT19XUklURSAiCiAJCQkJCSAgICJmb3IgUExMIHJlZ2lzdGVyIDogJXghXG4iLCBlcnIpOwogCQkJCXJldHVybiBlcnI7CkBAIC0zNTcsNyArMzU3LDcgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCS8qIHNldCB0aGUgbmV3IGZyZXF1ZW5jeSAqLwotCXNuZF9wcmludGRkKCJjbG9jayByZWdpc3RlciA6IHNldCAleFxuIiwgdmFsKTsKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAiY2xvY2sgcmVnaXN0ZXIgOiBzZXQgJXhcbiIsIHZhbCk7CiAJZXJyID0gcGN4aHJfd3JpdGVfaW9fbnVtX3JlZ19jb250KG1nciwgUENYSFJfRlJFUV9SRUdfTUFTSywKIAkJCQkJICB2YWwsIGNoYW5nZWQpOwogCWlmIChlcnIpCkBAIC0zODAsNyArMzgwLDcgQEAKIAkJbWdyLT5jb2RlY19zcGVlZCA9IHNwZWVkOwkvKiBzYXZlIG5ldyBjb2RlYyBzcGVlZCAqLwogCX0KIAotCXNuZF9wcmludGRkKCJwY3hocl9zdWJfc2V0X2Nsb2NrIHRvICVkSHogKHJlYWxmcmVxPSVkKVxuIiwKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAicGN4aHJfc3ViX3NldF9jbG9jayB0byAlZEh6IChyZWFsZnJlcT0lZClcbiIsCiAJCSAgICByYXRlLCByZWFsZnJlcSk7CiAJcmV0dXJuIDA7CiB9CkBAIC00ODAsNyArNDgwLDcgQEAKIAljYXNlIFJFR19TVEFUVVNfU1lOQ18xOTIwMDAgOglyYXRlID0gMTkyMDAwOyBicmVhazsKIAlkZWZhdWx0OiByYXRlID0gMDsKIAl9Ci0Jc25kX3ByaW50ZGQoIkV4dGVybmFsIGNsb2NrIGlzIGF0ICVkIEh6XG4iLCByYXRlKTsKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAiRXh0ZXJuYWwgY2xvY2sgaXMgYXQgJWQgSHpcbiIsIHJhdGUpOwogCSpzYW1wbGVfcmF0ZSA9IHJhdGU7CiAJcmV0dXJuIDA7CiB9CkBAIC01MzcsOCArNTM3LDggQEAKIAogCWVyciA9IHBjeGhyX3NlbmRfbXNnKGNoaXAtPm1nciwgJnJtaCk7CiAJaWYgKGVycikKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRVJST1IgcGN4aHJfc2V0X3N0cmVhbV9zdGF0ZSBlcnI9JXg7XG4iLAotCQkJICAgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiRVJST1IgcGN4aHJfc2V0X3N0cmVhbV9zdGF0ZSBlcnI9JXg7XG4iLCBlcnIpOwogCXN0cmVhbS0+c3RhdHVzID0KIAkgIHN0YXJ0ID8gUENYSFJfU1RSRUFNX1NUQVRVU19TVEFSVEVEIDogUENYSFJfU1RSRUFNX1NUQVRVU19TVE9QUEVEOwogCXJldHVybiBlcnI7CkBAIC02MjgsNyArNjI4LDggQEAKIAlybWguY21kW3JtaC5jbWRfbGVuKytdID0gKGhlYWRlciAmIDB4ZmYpIDw8IDE2OwogCWVyciA9IHBjeGhyX3NlbmRfbXNnKGNoaXAtPm1nciwgJnJtaCk7CiAJaWYgKGVycikKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRVJST1IgcGN4aHJfc2V0X2Zvcm1hdCBlcnI9JXg7XG4iLCBlcnIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJFUlJPUiBwY3hocl9zZXRfZm9ybWF0IGVycj0leDtcbiIsIGVycik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNjY1LDcgKzY2Niw3IEBACiAJcm1oLmNtZF9sZW4gPSA0OwogCWVyciA9IHBjeGhyX3NlbmRfbXNnKGNoaXAtPm1nciwgJnJtaCk7CiAJaWYgKGVycikKLQkJc25kX3ByaW50ayhLRVJOX0VSUgorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKIAkJCSAgICJFUlJPUiBDTURfVVBEQVRFX1JfQlVGRkVSUyBlcnI9JXg7XG4iLCBlcnIpOwogCXJldHVybiBlcnI7CiB9CkBAIC03MzUsMTEgKzczNiwxMSBAQAogCX0KIAlpZiAoY2FwdHVyZV9tYXNrID09IDAgJiYgcGxheWJhY2tfbWFzayA9PSAwKSB7CiAJCW11dGV4X3VubG9jaygmbWdyLT5zZXR1cF9tdXRleCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInBjeGhyX3RyaWdnZXJfdGFza2xldCA6IG5vIHBpcGVzXG4iKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwgInBjeGhyX3RyaWdnZXJfdGFza2xldCA6IG5vIHBpcGVzXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCXNuZF9wcmludGRkKCJwY3hocl90cmlnZ2VyX3Rhc2tsZXQgOiAiCisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgInBjeGhyX3RyaWdnZXJfdGFza2xldCA6ICIKIAkJICAgICJwbGF5YmFja19tYXNrPSV4IGNhcHR1cmVfbWFzaz0leFxuIiwKIAkJICAgIHBsYXliYWNrX21hc2ssIGNhcHR1cmVfbWFzayk7CiAKQEAgLTc0Nyw3ICs3NDgsNyBAQAogCWVyciA9IHBjeGhyX3NldF9waXBlX3N0YXRlKG1nciwgIHBsYXliYWNrX21hc2ssIGNhcHR1cmVfbWFzaywgMCk7CiAJaWYgKGVycikgewogCQltdXRleF91bmxvY2soJm1nci0+c2V0dXBfbXV0ZXgpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hocl90cmlnZ2VyX3Rhc2tsZXQgOiAiCisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJwY3hocl90cmlnZ2VyX3Rhc2tsZXQgOiAiCiAJCQkgICAiZXJyb3Igc3RvcCBwaXBlcyAoUCV4IEMleClcbiIsCiAJCQkgICBwbGF5YmFja19tYXNrLCBjYXB0dXJlX21hc2spOwogCQlyZXR1cm47CkBAIC03OTIsNyArNzkzLDcgQEAKIAllcnIgPSBwY3hocl9zZXRfcGlwZV9zdGF0ZShtZ3IsIHBsYXliYWNrX21hc2ssIGNhcHR1cmVfbWFzaywgMSk7CiAJaWYgKGVycikgewogCQltdXRleF91bmxvY2soJm1nci0+c2V0dXBfbXV0ZXgpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hocl90cmlnZ2VyX3Rhc2tsZXQgOiAiCisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJwY3hocl90cmlnZ2VyX3Rhc2tsZXQgOiAiCiAJCQkgICAiZXJyb3Igc3RhcnQgcGlwZXMgKFAleCBDJXgpXG4iLAogCQkJICAgcGxheWJhY2tfbWFzaywgY2FwdHVyZV9tYXNrKTsKIAkJcmV0dXJuOwpAQCAtODI1LDcgKzgyNiw3IEBACiAKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHX1ZFUkJPU0UKIAlkb19nZXR0aW1lb2ZkYXkoJm15X3R2Mik7Ci0Jc25kX3ByaW50ZGQoIioqKlRSSUdHRVIgVEFTS0xFVCoqKiBUSU1FID0gJWxkIChlcnIgPSAleClcbiIsCisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgIioqKlRSSUdHRVIgVEFTS0xFVCoqKiBUSU1FID0gJWxkIChlcnIgPSAleClcbiIsCiAJCSAgICAobG9uZykobXlfdHYyLnR2X3VzZWMgLSBteV90djEudHZfdXNlYyksIGVycik7CiAjZW5kaWYKIH0KQEAgLTkwMiw3ICs5MDMsNyBAQAogCX0KIAllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsICZybWgpOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBwY3hocl9oYXJkd2FyZV90aW1lciBlcnIoJXgpXG4iLAorCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAiZXJyb3IgcGN4aHJfaGFyZHdhcmVfdGltZXIgZXJyKCV4KVxuIiwKIAkJCSAgIGVycik7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTkxNiw3ICs5MTcsOCBAQAogCXN0cnVjdCBwY3hocl9tZ3IgKm1nciA9IGNoaXAtPm1ncjsKIAlpbnQgZXJyID0gMDsKIAotCXNuZF9wcmludGRkKCJwY3hocl9wcmVwYXJlIDogcGVyaW9kX3NpemUoJWx4KSBwZXJpb2RzKCV4KSBidWZmZXJfc2l6ZSglbHgpXG4iLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkicGN4aHJfcHJlcGFyZSA6IHBlcmlvZF9zaXplKCVseCkgcGVyaW9kcygleCkgYnVmZmVyX3NpemUoJWx4KVxuIiwKIAkJICAgIHN1YnMtPnJ1bnRpbWUtPnBlcmlvZF9zaXplLCBzdWJzLT5ydW50aW1lLT5wZXJpb2RzLAogCQkgICAgc3Vicy0+cnVudGltZS0+YnVmZmVyX3NpemUpOwogCkBAIC0xMDI1LDExICsxMDI3LDExIEBACiAJcnVudGltZS0+aHcgPSBwY3hocl9jYXBzOwogCiAJaWYoIHN1YnMtPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLICkgewotCQlzbmRfcHJpbnRkZCgicGN4aHJfb3BlbiBwbGF5YmFjayBjaGlwJWQgc3VicyVkXG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInBjeGhyX29wZW4gcGxheWJhY2sgY2hpcCVkIHN1YnMlZFxuIiwKIAkJCSAgICBjaGlwLT5jaGlwX2lkeCwgc3Vicy0+bnVtYmVyKTsKIAkJc3RyZWFtID0gJmNoaXAtPnBsYXliYWNrX3N0cmVhbVtzdWJzLT5udW1iZXJdOwogCX0gZWxzZSB7Ci0JCXNuZF9wcmludGRkKCJwY3hocl9vcGVuIGNhcHR1cmUgY2hpcCVkIHN1YnMlZFxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJwY3hocl9vcGVuIGNhcHR1cmUgY2hpcCVkIHN1YnMlZFxuIiwKIAkJCSAgICBjaGlwLT5jaGlwX2lkeCwgc3Vicy0+bnVtYmVyKTsKIAkJaWYgKG1nci0+bW9ub19jYXB0dXJlKQogCQkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0gMTsKQEAgLTEwMzksNyArMTA0MSw3IEBACiAJfQogCWlmIChzdHJlYW0tPnN0YXR1cyAhPSBQQ1hIUl9TVFJFQU1fU1RBVFVTX0ZSRUUpewogCQkvKiBzdHJlYW1zIGluIHVzZSAqLwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hocl9vcGVuIGNoaXAlZCBzdWJzJWQgaW4gdXNlXG4iLAorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgInBjeGhyX29wZW4gY2hpcCVkIHN1YnMlZCBpbiB1c2VcbiIsCiAJCQkgICBjaGlwLT5jaGlwX2lkeCwgc3Vicy0+bnVtYmVyKTsKIAkJbXV0ZXhfdW5sb2NrKCZtZ3ItPnNldHVwX211dGV4KTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTExMDUsNyArMTEwNyw3IEBACiAKIAltdXRleF9sb2NrKCZtZ3ItPnNldHVwX211dGV4KTsKIAotCXNuZF9wcmludGRkKCJwY3hocl9jbG9zZSBjaGlwJWQgc3VicyVkXG4iLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAicGN4aHJfY2xvc2UgY2hpcCVkIHN1YnMlZFxuIiwKIAkJICAgIGNoaXAtPmNoaXBfaWR4LCBzdWJzLT5udW1iZXIpOwogCiAJLyogc2FtcGxlIHJhdGUgcmVsZWFzZWQgKi8KQEAgLTExNjgsNyArMTE3MCw3IEBACiAJaWYgKChlcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCBuYW1lLCAwLAogCQkJICAgICAgIGNoaXAtPm5iX3N0cmVhbXNfcGxheSwKIAkJCSAgICAgICBjaGlwLT5uYl9zdHJlYW1zX2NhcHQsICZwY20pKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGNyZWF0ZSBwY20gJXNcbiIsIG5hbWUpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNhbm5vdCBjcmVhdGUgcGNtICVzXG4iLCBuYW1lKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcGNtLT5wcml2YXRlX2RhdGEgPSBjaGlwOwpAQCAtMTIxNCw3ICsxMjE2LDcgQEAKIAogCWNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOwogCWlmICghIGNoaXApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGFsbG9jYXRlIGNoaXBcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBjaGlwXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMjM5LDcgKzEyNDEsNiBAQAogCX0KIAogCW1nci0+Y2hpcFtpZHhdID0gY2hpcDsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZtZ3ItPnBjaS0+ZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTQ4OCw3ICsxNDg5LDcgQEAKIAkvKiByZXNldCBib2FyZCBpZiBzb21lIGZpcm13YXJlIHdhcyBsb2FkZWQgKi8KIAlpZihtZ3ItPmRzcF9sb2FkZWQpIHsKIAkJcGN4aHJfcmVzZXRfYm9hcmQobWdyKTsKLQkJc25kX3ByaW50ZGQoInJlc2V0IHBjeGhyICFcbiIpOworCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAicmVzZXQgcGN4aHIgIVxuIik7CiAJfQogCiAJLyogcmVsZWFzZSBpcnEgICovCkBAIC0xNTM3LDggKzE1MzgsOCBAQAogCiAJLyogY2hlY2sgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDMyIGJpdHMgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygzMikpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAiCi0JCQkgICAiMzJiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlkZXZfZXJyKCZwY2ktPmRldiwKKwkJCSJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTE1ODksNyArMTU5MCw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHBjeGhyX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgbWdyKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycigmcGNpLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJcGN4aHJfZnJlZShtZ3IpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTE2MzgsMTAgKzE2MzksMTEgQEAKIAogCQlzbnByaW50Zih0bXBpZCwgc2l6ZW9mKHRtcGlkKSwgIiVzLSVkIiwKIAkJCSBpZFtkZXZdID8gaWRbZGV2XSA6IGNhcmRfbmFtZSwgaSk7Ci0JCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpZHgsIHRtcGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCQllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpZHgsIHRtcGlkLCBUSElTX01PRFVMRSwKKwkJCQkgICAwLCAmY2FyZCk7CiAKIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBhbGxvY2F0ZSB0aGUgY2FyZCAlZFxuIiwgaSk7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSB0aGUgY2FyZCAlZFxuIiwgaSk7CiAJCQlwY3hocl9mcmVlKG1ncik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHJfY29yZS5jIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX2NvcmUuYwppbmRleCAzN2I0MzFiLi5kZjkzNzE5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHJfY29yZS5jCisrKyBiL3NvdW5kL3BjaS9wY3hoci9wY3hocl9jb3JlLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgInBjeGhyLmgiCkBAIC0xMzIsMTQgKzEzMywxNCBAQAogCQkqcmVhZCA9IFBDWEhSX0lOUEIobWdyLCByZWcpOwogCQlpZiAoKCpyZWFkICYgbWFzaykgPT0gYml0KSB7CiAJCQlpZiAoaSA+IDEwMCkKLQkJCQlzbmRfcHJpbnRkZCgiQVRURU5USU9OISBjaGVja19yZWcoJXgpICIKLQkJCQkJICAgICJsb29wY291bnQ9JWRcbiIsCisJCQkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCQkJIkFUVEVOVElPTiEgY2hlY2tfcmVnKCV4KSBsb29wY291bnQ9JWRcbiIsCiAJCQkJCSAgICByZWcsIGkpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaSsrOwogCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKLQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKIAkJICAgInBjeGhyX2NoZWNrX3JlZ19iaXQ6IHRpbWVvdXQsIHJlZz0leCwgbWFzaz0weCV4LCB2YWw9JXhcbiIsCiAJCSAgIHJlZywgbWFzaywgKnJlYWQpOwogCXJldHVybiAtRUlPOwpAQCAtMjE2LDcgKzIxNyw3IEBACiAJZXJyID0gcGN4aHJfY2hlY2tfcmVnX2JpdChtZ3IsIFBDWEhSX0RTUF9DVlIsICBQQ1hIUl9DVlJfSEkwOF9IQywgMCwKIAkJCQkgIFBDWEhSX1RJTUVPVVRfRFNQLCAmcmVnKTsKIAlpZiAoZXJyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInBjeGhyX3NlbmRfaXRfZHNwIDogVElNRU9VVCBDVlJcbiIpOworCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAicGN4aHJfc2VuZF9pdF9kc3AgOiBUSU1FT1VUIENWUlxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCWlmIChpdGRzcCAmIFBDWEhSX01BU0tfSVRfTUFOQUdFX0hGNSkgewpAQCAtMjI3LDcgKzIyOCw3IEBACiAJCQkJCSAgUENYSFJfVElNRU9VVF9EU1AsCiAJCQkJCSAgJnJlZyk7CiAJCWlmIChlcnIpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCiAJCQkJICAgInBjeGhyX3NlbmRfaXRfZHNwIDogVElNRU9VVCBIRjVcbiIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtMjk0LDcgKzI5NSw3IEBACiAJICovCiAJaWYoc2Vjb25kKSB7CiAJCWlmICgoY2hpcHNjICYgUENYSFJfQ0hJUFNDX0dQSV9VU0VSSSkgPT0gMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgbG9hZGluZyBmaXJzdCB4aWxpbnhcbiIpOworCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwgImVycm9yIGxvYWRpbmcgZmlyc3QgeGlsaW54XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCS8qIGFjdGl2YXRlIHNlY29uZCB4aWxpbnggKi8KQEAgLTM2MCw3ICszNjEsNyBAQAogCQkJCQkgIFBDWEhSX0lTUl9ISTA4X1RSRFksCiAJCQkJCSAgUENYSFJfVElNRU9VVF9EU1AsICZkdW1teSk7CiAJCWlmIChlcnIpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCiAJCQkJICAgImRzcCBsb2FkaW5nIGVycm9yIGF0IHBvc2l0aW9uICVkXG4iLCBpKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTM5Niw3ICszOTcsNyBAQAogCQltc2xlZXAoUENYSFJfV0FJVF9ERUZBVUxUKTsKIAkJUENYSFJfT1VUUEIobWdyLCBQQ1hIUl9EU1BfSUNSLCByZWcpOwogCQltc2xlZXAoUENYSFJfV0FJVF9ERUZBVUxUKTsKLQkJc25kX3ByaW50ZGQoIm5vIG5lZWQgdG8gbG9hZCBlZXByb20gYm9vdFxuIik7CisJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJubyBuZWVkIHRvIGxvYWQgZWVwcm9tIGJvb3RcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJUENYSFJfT1VUUEIobWdyLCBQQ1hIUl9EU1BfSUNSLCByZWcpOwpAQCAtNTYxLDkgKzU2Miw5IEBACiAJCQkJCSAgUENYSFJfSVNSX0hJMDhfUlhERiwKIAkJCQkJICBQQ1hIUl9USU1FT1VUX0RTUCwgJnJlZyk7CiAJCWlmIChlcnIpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkVSUk9SIFJNSCBzdGF0OiAiCi0JCQkJICAgIklTUjpSWERGPTEgKElTUiA9ICV4OyBpPSVkIClcbiIsCi0JCQkJICAgcmVnLCBpKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJIkVSUk9SIFJNSCBzdGF0OiBJU1I6UlhERj0xIChJU1IgPSAleDsgaT0lZCApXG4iLAorCQkJCXJlZywgaSk7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCS8qIHJlYWQgZGF0YSAqLwpAQCAtNTkxLDEzICs1OTIsMTMgQEAKIAkJfQogI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQogCQlpZiAocm1oLT5jbWRfaWR4IDwgQ01EX0xBU1RfSU5ERVgpCi0JCQlzbmRfcHJpbnRkZCgiICAgIHN0YXRbJWRdPSV4XG4iLCBpLCBkYXRhKTsKKwkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICIgICAgc3RhdFslZF09JXhcbiIsIGksIGRhdGEpOwogI2VuZGlmCiAJCWlmIChpIDwgbWF4X3N0YXRfbGVuKQogCQkJcm1oLT5zdGF0W2ldID0gZGF0YTsKIAl9CiAJaWYgKHJtaC0+c3RhdF9sZW4gPiBtYXhfc3RhdF9sZW4pIHsKLQkJc25kX3ByaW50ZGQoIlBDWEhSIDogcm1oLT5zdGF0X2xlbj0leCB0b28gYmlnXG4iLAorCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAiUENYSFIgOiBybWgtPnN0YXRfbGVuPSV4IHRvbyBiaWdcbiIsCiAJCQkgICAgcm1oLT5zdGF0X2xlbik7CiAJCXJtaC0+c3RhdF9sZW4gPSBtYXhfc3RhdF9sZW47CiAJfQpAQCAtNjE1LDcgKzYxNiw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCWVyciA9IHBjeGhyX3NlbmRfaXRfZHNwKG1nciwgUENYSFJfSVRfTUVTU0FHRSwgMSk7CiAJaWYgKGVycikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hocl9zZW5kX21lc3NhZ2UgOiBFRF9EU1BfQ1JBU0hFRFxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkicGN4aHJfc2VuZF9tZXNzYWdlIDogRURfRFNQX0NSQVNIRURcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAkvKiB3YWl0IGZvciBjaGsgYml0ICovCkBAIC02NDEsNyArNjQzLDcgQEAKIAkJZGF0YSAmPSAweGZmN2ZmZjsJLyogTUFTS18xX1dPUkRfQ09NTUFORCAqLwogI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQogCWlmIChybWgtPmNtZF9pZHggPCBDTURfTEFTVF9JTkRFWCkKLQkJc25kX3ByaW50ZGQoIk1TRyBjbWRbMF09JXggKCVzKVxuIiwKKwkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgIk1TRyBjbWRbMF09JXggKCVzKVxuIiwKIAkJCSAgICBkYXRhLCBjbWRfbmFtZXNbcm1oLT5jbWRfaWR4XSk7CiAjZW5kaWYKIApAQCAtNjcxLDcgKzY3Myw4IEBACiAJCQlkYXRhID0gcm1oLT5jbWRbaV07CiAjaWZkZWYgQ09ORklHX1NORF9ERUJVR19WRVJCT1NFCiAJCQlpZiAocm1oLT5jbWRfaWR4IDwgQ01EX0xBU1RfSU5ERVgpCi0JCQkJc25kX3ByaW50ZGQoIiAgICBjbWRbJWRdPSV4XG4iLCBpLCBkYXRhKTsKKwkJCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCQkiICAgIGNtZFslZF09JXhcbiIsIGksIGRhdGEpOwogI2VuZGlmCiAJCQllcnIgPSBwY3hocl9jaGVja19yZWdfYml0KG1nciwgUENYSFJfRFNQX0lTUiwKIAkJCQkJCSAgUENYSFJfSVNSX0hJMDhfVFJEWSwKQEAgLTY5NywxNCArNzAwLDE1IEBACiAJCQkJCSAgUENYSFJfSVNSX0hJMDhfUlhERiwKIAkJCQkJICBQQ1hIUl9USU1FT1VUX0RTUCwgJnJlZyk7CiAJCWlmIChlcnIpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkVSUk9SIFJNSDogSVNSOlJYREY9MSAoSVNSID0gJXgpXG4iLCByZWcpOworCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCQkiRVJST1IgUk1IOiBJU1I6UlhERj0xIChJU1IgPSAleClcbiIsIHJlZyk7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCS8qIHJlYWQgZXJyb3IgY29kZSAqLwogCQlkYXRhICA9IFBDWEhSX0lOUEIobWdyLCBQQ1hIUl9EU1BfVFhIKSA8PCAxNjsKIAkJZGF0YSB8PSBQQ1hIUl9JTlBCKG1nciwgUENYSFJfRFNQX1RYTSkgPDwgODsKIAkJZGF0YSB8PSBQQ1hIUl9JTlBCKG1nciwgUENYSFJfRFNQX1RYTCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkVSUk9SIFJNSCglZCk6IDB4JXhcbiIsCisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJFUlJPUiBSTUgoJWQpOiAweCV4XG4iLAogCQkJICAgcm1oLT5jbWRfaWR4LCBkYXRhKTsKIAkJZXJyID0gLUVJTlZBTDsKIAl9IGVsc2UgewpAQCAtNzgwLDcgKzc4NCw3IEBACiAJICogKFBDWEhSX1BJUEVfU1RBVEVfQ0FQVFVSRV9PRkZTRVQpCiAJICovCiAJc3RhcnRfbWFzayAmPSAweGZmZmZmZjsKLQlzbmRfcHJpbnRkZCgiQ01EX1BJUEVfU1RBVEUgTUJPWDI9MHglMDZ4XG4iLCBzdGFydF9tYXNrKTsKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAiQ01EX1BJUEVfU1RBVEUgTUJPWDI9MHglMDZ4XG4iLCBzdGFydF9tYXNrKTsKIAlyZXR1cm4gc3RhcnRfbWFzazsKIH0KIApAQCAtODA5LDcgKzgxMyw3IEBACiAJCQl9CiAJCQllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsICZybWgpOwogCQkJaWYgKGVycikgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAogCQkJCQkgICAiZXJyb3IgcGlwZSBzdGFydCAiCiAJCQkJCSAgICIoQ01EX0NBTl9TVEFSVF9QSVBFKSBlcnI9JXghXG4iLAogCQkJCQkgICBlcnIpOwpAQCAtODQ3LDcgKzg1MSw3IEBACiAJCQl9CiAJCQllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsICZybWgpOwogCQkJaWYgKGVycikgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAogCQkJCQkgICAiZXJyb3IgcGlwZSBzdG9wICIKIAkJCQkJICAgIihDTURfU1RPUF9QSVBFKSBlcnI9JXghXG4iLCBlcnIpOwogCQkJCXJldHVybiBlcnI7CkBAIC04NzYsNyArODgwLDcgQEAKIAkJCQkJCQkgIDEgPDwgKGF1ZGlvIC0gUENYSFJfUElQRV9TVEFURV9DQVBUVVJFX09GRlNFVCkpOwogCQkJZXJyID0gcGN4aHJfc2VuZF9tc2cobWdyLCAmcm1oKTsKIAkJCWlmIChlcnIpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKIAkJCQkJICAgImVycm9yIHBpcGUgc3RhcnQgIgogCQkJCQkgICAiKENNRF9DT05GX1BJUEUpIGVycj0leCFcbiIsIGVycik7CiAJCQkJcmV0dXJuIGVycjsKQEAgLTg4OSw3ICs4OTMsNyBAQAogCXBjeGhyX2luaXRfcm1oKCZybWgsIENNRF9TRU5EX0lSUUEpOwogCWVyciA9IHBjeGhyX3NlbmRfbXNnKG1nciwgJnJtaCk7CiAJaWYgKGVycikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCiAJCQkgICAiZXJyb3IgcGlwZSBzdGFydCAoQ01EX1NFTkRfSVJRQSkgZXJyPSV4IVxuIiwKIAkJCSAgIGVycik7CiAJCXJldHVybiBlcnI7CkBAIC05MTMsNyArOTE3LDggQEAKIAkJICAgICAgKGNhcHR1cmVfbWFzayA8PCBQQ1hIUl9QSVBFX1NUQVRFX0NBUFRVUkVfT0ZGU0VUKSk7CiAJLyogY3VycmVudCBwaXBlIHN0YXRlIChwbGF5YmFjayArIHJlY29yZCkgKi8KIAlzdGF0ZSA9IHBjeGhyX3BpcGVzX3J1bm5pbmcobWdyKTsKLQlzbmRfcHJpbnRkZCgicGN4aHJfc2V0X3BpcGVfc3RhdGUgJXMgKG1hc2sgJXggY3VycmVudCAleClcbiIsCisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJInBjeGhyX3NldF9waXBlX3N0YXRlICVzIChtYXNrICV4IGN1cnJlbnQgJXgpXG4iLAogCQkgICAgc3RhcnQgPyAiU1RBUlQiIDogIlNUT1AiLCBhdWRpb19tYXNrLCBzdGF0ZSk7CiAJaWYgKHN0YXJ0KSB7CiAJCS8qIHN0YXJ0IG9ubHkgcGlwZXMgdGhhdCBhcmUgbm90IHlldCBzdGFydGVkICovCkBAIC05NDQsNyArOTQ5LDcgQEAKIAkJaWYgKChzdGF0ZSAmIGF1ZGlvX21hc2spID09IChzdGFydCA/IGF1ZGlvX21hc2sgOiAwKSkKIAkJCWJyZWFrOwogCQlpZiAoKytpID49IE1BWF9XQUlUX0ZPUl9EU1AgKiAxMDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHBpcGUgc3RhcnQvc3RvcFxuIik7CisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAiZXJyb3IgcGlwZSBzdGFydC9zdG9wXG4iKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAkJdWRlbGF5KDEwKTsJCQkvKiB3YWl0IDEwIG1pY3Jvc2Vjb25kcyAqLwpAQCAtOTU2LDcgKzk2MSw3IEBACiAJfQogI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQogCWRvX2dldHRpbWVvZmRheSgmbXlfdHYyKTsKLQlzbmRfcHJpbnRkZCgiKioqU0VUIFBJUEUgU1RBVEUqKiogVElNRSA9ICVsZCAoZXJyID0gJXgpXG4iLAorCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICIqKipTRVQgUElQRSBTVEFURSoqKiBUSU1FID0gJWxkIChlcnIgPSAleClcbiIsCiAJCSAgICAobG9uZykobXlfdHYyLnR2X3VzZWMgLSBteV90djEudHZfdXNlYyksIGVycik7CiAjZW5kaWYKIAlyZXR1cm4gMDsKQEAgLTk3MSw3ICs5NzYsOCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1nci0+bXNnX2xvY2ssIGZsYWdzKTsKIAlpZiAoKG1nci0+aW9fbnVtX3JlZ19jb250ICYgbWFzaykgPT0gdmFsdWUpIHsKLQkJc25kX3ByaW50ZGQoIklPX05VTV9SRUdfQ09OVCBtYXNrICV4IGFscmVhZHkgaXMgc2V0IHRvICV4XG4iLAorCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkJIklPX05VTV9SRUdfQ09OVCBtYXNrICV4IGFscmVhZHkgaXMgc2V0IHRvICV4XG4iLAogCQkJICAgIG1hc2ssIHZhbHVlKTsKIAkJaWYgKGNoYW5nZWQpCiAJCQkqY2hhbmdlZCA9IDA7CkBAIC0xMDI0LDcgKzEwMzAsNyBAQAogCQllcnIgPSAoKGVyciA+PiAxMikgJiAweGZmZik7CiAJaWYgKCFlcnIpCiAJCXJldHVybiAwOwotCXNuZF9wcmludGRkKCJDTURfQVNZTkMgOiBFcnJvciAlcyAlcyBQaXBlICVkIGVycj0leFxuIiwKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAiQ01EX0FTWU5DIDogRXJyb3IgJXMgJXMgUGlwZSAlZCBlcnI9JXhcbiIsCiAJCSAgICBlcnJfc3JjX25hbWVbZXJyX3NyY10sCiAJCSAgICBpc19jYXB0dXJlID8gIlJlY29yZCIgOiAiUGxheSIsIHBpcGUsIGVycik7CiAJaWYgKGVyciA9PSAweGUwMSkKQEAgLTEwNDUsMjAgKzEwNTEsMjQgQEAKIAlpbnQgaSwgajsKIAogCWlmIChtZ3ItPnNyY19pdF9kc3AgJiBQQ1hIUl9JUlFfRlJFUV9DSEFOR0UpCi0JCXNuZF9wcmludGRkKCJUQVNLTEVUIDogUENYSFJfSVJRX0ZSRVFfQ0hBTkdFIGV2ZW50IG9jY3VycmVkXG4iKTsKKwkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCSJUQVNLTEVUIDogUENYSFJfSVJRX0ZSRVFfQ0hBTkdFIGV2ZW50IG9jY3VycmVkXG4iKTsKIAlpZiAobWdyLT5zcmNfaXRfZHNwICYgUENYSFJfSVJRX1RJTUVfQ09ERSkKLQkJc25kX3ByaW50ZGQoIlRBU0tMRVQgOiBQQ1hIUl9JUlFfVElNRV9DT0RFIGV2ZW50IG9jY3VycmVkXG4iKTsKKwkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCSJUQVNLTEVUIDogUENYSFJfSVJRX1RJTUVfQ09ERSBldmVudCBvY2N1cnJlZFxuIik7CiAJaWYgKG1nci0+c3JjX2l0X2RzcCAmIFBDWEhSX0lSUV9OT1RJRlkpCi0JCXNuZF9wcmludGRkKCJUQVNLTEVUIDogUENYSFJfSVJRX05PVElGWSBldmVudCBvY2N1cnJlZFxuIik7CisJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCQkiVEFTS0xFVCA6IFBDWEhSX0lSUV9OT1RJRlkgZXZlbnQgb2NjdXJyZWRcbiIpOwogCWlmIChtZ3ItPnNyY19pdF9kc3AgJiAoUENYSFJfSVJRX0ZSRVFfQ0hBTkdFIHwgUENYSFJfSVJRX1RJTUVfQ09ERSkpIHsKIAkJLyogY2xlYXIgZXZlbnRzIEZSRVFfQ0hBTkdFIGFuZCBUSU1FX0NPREUgKi8KIAkJcGN4aHJfaW5pdF9ybWgocHJtaCwgQ01EX1RFU1RfSVQpOwogCQllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsIHBybWgpOwotCQlzbmRfcHJpbnRkZCgiQ01EX1RFU1RfSVQgOiBlcnI9JXgsIHN0YXQ9JXhcbiIsCisJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJDTURfVEVTVF9JVCA6IGVycj0leCwgc3RhdD0leFxuIiwKIAkJCSAgICBlcnIsIHBybWgtPnN0YXRbMF0pOwogCX0KIAlpZiAobWdyLT5zcmNfaXRfZHNwICYgUENYSFJfSVJRX0FTWU5DKSB7Ci0JCXNuZF9wcmludGRkKCJUQVNLTEVUIDogUENYSFJfSVJRX0FTWU5DIGV2ZW50IG9jY3VycmVkXG4iKTsKKwkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCSJUQVNLTEVUIDogUENYSFJfSVJRX0FTWU5DIGV2ZW50IG9jY3VycmVkXG4iKTsKIAogCQlwY3hocl9pbml0X3JtaChwcm1oLCBDTURfQVNZTkMpOwogCQlwcm1oLT5jbWRbMF0gfD0gMTsJLyogYWRkIFNFTF9BU1lOQ19FVkVOVFMgKi8KQEAgLTEwNjYsNyArMTA3Niw3IEBACiAJCXBybWgtPnN0YXRfbGVuID0gUENYSFJfU0laRV9NQVhfTE9OR19TVEFUVVM7CiAJCWVyciA9IHBjeGhyX3NlbmRfbXNnKG1nciwgcHJtaCk7CiAJCWlmIChlcnIpCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJFUlJPUiBwY3hocl9tc2dfdGFza2xldD0leDtcbiIsCisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAiRVJST1IgcGN4aHJfbXNnX3Rhc2tsZXQ9JXg7XG4iLAogCQkJCSAgIGVycik7CiAJCWkgPSAxOwogCQl3aGlsZSAoaSA8IHBybWgtPnN0YXRfbGVuKSB7CkBAIC0xMDc5LDcgKzEwODksOCBAQAogCQkJdTMyIGVycjI7CiAKIAkJCWlmIChwcm1oLT5zdGF0W2ldICYgMHg4MDAwMDApIHsJLyogaWYgQklUX0VORCAqLwotCQkJCXNuZF9wcmludGRkKCJUQVNLTEVUIDogRW5kJXNQaXBlICVkXG4iLAorCQkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCQkJCSJUQVNLTEVUIDogRW5kJXNQaXBlICVkXG4iLAogCQkJCQkgICAgaXNfY2FwdHVyZSA/ICJSZWNvcmQiIDogIlBsYXkiLAogCQkJCQkgICAgcGlwZSk7CiAJCQl9CkBAIC0xMTM2LDcgKzExNDcsOCBAQAogCWh3X3NhbXBsZV9jb3VudCA9ICgodV9pbnQ2NF90KXJtaC5zdGF0WzBdKSA8PCAyNDsKIAlod19zYW1wbGVfY291bnQgKz0gKHVfaW50NjRfdClybWguc3RhdFsxXTsKIAotCXNuZF9wcmludGRkKCJzdHJlYW0gJWMlZCA6IGFicyBzYW1wbGVzIHJlYWwoJWxsdSkgdGltZXIoJWxsdSlcbiIsCisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJInN0cmVhbSAlYyVkIDogYWJzIHNhbXBsZXMgcmVhbCglbGx1KSB0aW1lciglbGx1KVxuIiwKIAkJICAgIHN0cmVhbS0+cGlwZS0+aXNfY2FwdHVyZSA/ICdDJyA6ICdQJywKIAkJICAgIHN0cmVhbS0+c3Vic3RyZWFtLT5udW1iZXIsCiAJCSAgICBod19zYW1wbGVfY291bnQsCkBAIC0xMjAyLDcgKzEyMTQsNyBAQAogCQkJCSh1X2ludDMyX3QpKG5ld19zYW1wbGVfY291bnQgLQogCQkJCQkgICAgc3RyZWFtLT50aW1lcl9hYnNfcGVyaW9kcyk7CiAJCX0gZWxzZSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAogCQkJCSAgICJFUlJPUiBuZXdfc2FtcGxlX2NvdW50IHRvbyBzbWFsbCA/Pz8gJWxkXG4iLAogCQkJCSAgIChsb25nIHVuc2lnbmVkIGludCluZXdfc2FtcGxlX2NvdW50KTsKIAkJfQpAQCAtMTI0NywzMyArMTI1OSwzOSBAQAogCQkgICAgKG1nci0+ZHNwX3RpbWVfbGFzdCAhPSBQQ1hIUl9EU1BfVElNRV9JTlZBTElEKSkgewogCQkJLyogaGFuZGxlIGRzcCBjb3VudGVyIHdyYXBhcm91bmQgd2l0aG91dCByZXN5bmMgKi8KIAkJCWludCB0bXBfZGlmZiA9IGRzcF90aW1lX2RpZmYgKyBQQ1hIUl9EU1BfVElNRV9NQVNLICsgMTsKLQkJCXNuZF9wcmludGRkKCJXQVJOSU5HIERTUCB0aW1lc3RhbXAgb2xkKCVkKSBuZXcoJWQpIiwKKwkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCQkJIldBUk5JTkcgRFNQIHRpbWVzdGFtcCBvbGQoJWQpIG5ldyglZCkiLAogCQkJCSAgICBtZ3ItPmRzcF90aW1lX2xhc3QsIGRzcF90aW1lX25ldyk7CiAJCQlpZiAodG1wX2RpZmYgPiAwICYmIHRtcF9kaWZmIDw9ICgyKm1nci0+Z3JhbnVsYXJpdHkpKSB7Ci0JCQkJc25kX3ByaW50ZGQoIi0+IHRpbWVzdGFtcCB3cmFwYXJvdW5kIE9LOiAiCisJCQkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCQkJIi0+IHRpbWVzdGFtcCB3cmFwYXJvdW5kIE9LOiAiCiAJCQkJCSAgICAiZGlmZj0lZFxuIiwgdG1wX2RpZmYpOwogCQkJCWRzcF90aW1lX2RpZmYgPSB0bXBfZGlmZjsKIAkJCX0gZWxzZSB7Ci0JCQkJc25kX3ByaW50ZGQoIi0+IHJlc3luY2hyb25pemUgYWxsIHN0cmVhbXNcbiIpOworCQkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCQkJCSItPiByZXN5bmNocm9uaXplIGFsbCBzdHJlYW1zXG4iKTsKIAkJCQltZ3ItPmRzcF90aW1lX2VycisrOwogCQkJfQogCQl9CiAjaWZkZWYgQ09ORklHX1NORF9ERUJVR19WRVJCT1NFCiAJCWlmIChkc3BfdGltZV9kaWZmID09IDApCi0JCQlzbmRfcHJpbnRkZCgiRVJST1IgRFNQIFRJTUUgTk8gRElGRiB0aW1lKCVkKVxuIiwKKwkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCQkJIkVSUk9SIERTUCBUSU1FIE5PIERJRkYgdGltZSglZClcbiIsCiAJCQkJICAgIGRzcF90aW1lX25ldyk7CiAJCWVsc2UgaWYgKGRzcF90aW1lX2RpZmYgPj0gKDIqbWdyLT5ncmFudWxhcml0eSkpCi0JCQlzbmRfcHJpbnRkZCgiRVJST1IgRFNQIFRJTUUgVE9PIEJJRyBvbGQoJWQpIGFkZCglZClcbiIsCisJCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCSJFUlJPUiBEU1AgVElNRSBUT08gQklHIG9sZCglZCkgYWRkKCVkKVxuIiwKIAkJCQkgICAgbWdyLT5kc3BfdGltZV9sYXN0LAogCQkJCSAgICBkc3BfdGltZV9uZXcgLSBtZ3ItPmRzcF90aW1lX2xhc3QpOwogCQllbHNlIGlmIChkc3BfdGltZV9kaWZmICUgbWdyLT5ncmFudWxhcml0eSkKLQkJCXNuZF9wcmludGRkKCJFUlJPUiBEU1AgVElNRSBpbmNyZWFzZWQgYnkgJWRcbiIsCisJCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCSJFUlJPUiBEU1AgVElNRSBpbmNyZWFzZWQgYnkgJWRcbiIsCiAJCQkJICAgIGRzcF90aW1lX2RpZmYpOwogI2VuZGlmCiAJCW1nci0+ZHNwX3RpbWVfbGFzdCA9IGRzcF90aW1lX25ldzsKIAogCQlpZiAodGltZXJfdG9nZ2xlID09IG1nci0+dGltZXJfdG9nZ2xlKSB7Ci0JCQlzbmRfcHJpbnRkZCgiRVJST1IgVElNRVIgVE9HR0xFXG4iKTsKKwkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJFUlJPUiBUSU1FUiBUT0dHTEVcbiIpOwogCQkJbWdyLT5kc3BfdGltZV9lcnIrKzsKIAkJfQogCQltZ3ItPnRpbWVyX3RvZ2dsZSA9IHRpbWVyX3RvZ2dsZTsKQEAgLTEzMDgsNyArMTMyNiw3IEBACiAJfQogI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQogCWlmIChyZWcgJiBQQ1hIUl9GQVRBTF9EU1BfRVJSKQotCQlzbmRfcHJpbnRkZCgiRkFUQUwgRFNQIEVSUk9SIDogJXhcbiIsIHJlZyk7CisJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJGQVRBTCBEU1AgRVJST1IgOiAleFxuIiwgcmVnKTsKICNlbmRpZgogCXNwaW5fdW5sb2NrKCZtZ3ItPmxvY2spOwogCXJldHVybiBJUlFfSEFORExFRDsJLyogdGhpcyBkZXZpY2UgY2F1c2VkIHRoZSBpbnRlcnJ1cHQgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9wY3hoci9wY3hocl9od2RlcC5jIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKaW5kZXggZDk5NTE3NS4uMTVhOGNlNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKKysrIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKQEAgLTcyLDcgKzcyLDggQEAKIAkvKiB0ZXN0IG1heCBuYiBzdWJzdHJlYW0gcGVyIHBpcGUgKi8KIAlpZiAoKChybWguc3RhdFsxXSA+PiA3KSAmIDB4NUYpIDwgUENYSFJfUExBWUJBQ0tfU1RSRUFNUykKIAkJcmV0dXJuIC1FSU5WQUw7Ci0Jc25kX3ByaW50ZGQoInN1cHBvcnRlZCBmb3JtYXRzIDogcGxheWJhY2s9JXggY2FwdHVyZT0leFxuIiwKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkic3VwcG9ydGVkIGZvcm1hdHMgOiBwbGF5YmFjaz0leCBjYXB0dXJlPSV4XG4iLAogCQkgICAgcm1oLnN0YXRbMl0sIHJtaC5zdGF0WzNdKTsKIAogCXBjeGhyX2luaXRfcm1oKCZybWgsIENNRF9WRVJTSU9OKTsKQEAgLTg0LDcgKzg1LDggQEAKIAllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsICZybWgpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0Jc25kX3ByaW50ZGQoIlBDWEhSIERTUCB2ZXJzaW9uIGlzICVkLiVkLiVkXG4iLCAocm1oLnN0YXRbMF0+PjE2KSYweGZmLAorCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCSJQQ1hIUiBEU1AgdmVyc2lvbiBpcyAlZC4lZC4lZFxuIiwgKHJtaC5zdGF0WzBdPj4xNikmMHhmZiwKIAkJICAgIChybWguc3RhdFswXT4+OCkmMHhmZiwgcm1oLnN0YXRbMF0mMHhmZik7CiAJbWdyLT5kc3BfdmVyc2lvbiA9IHJtaC5zdGF0WzBdOwogCkBAIC0xNzksNyArMTgxLDcgQEAKIAkJc3RyZWFtX2NvdW50ID0gUENYSFJfUExBWUJBQ0tfU1RSRUFNUzsKIAkJYXVkaW9fY291bnQgPSAyOwkvKiBhbHdheXMgc3RlcmVvICovCiAJfQotCXNuZF9wcmludGRkKCJzbmRfYWRkX3JlZl9waXBlIHBpbiglZCkgcGNtJWMwXG4iLAorCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJzbmRfYWRkX3JlZl9waXBlIHBpbiglZCkgcGNtJWMwXG4iLAogCQkgICAgcGluLCBpc19jYXB0dXJlID8gJ2MnIDogJ3AnKTsKIAlwaXBlLT5pc19jYXB0dXJlID0gaXNfY2FwdHVyZTsKIAlwaXBlLT5maXJzdF9hdWRpbyA9IHBpbjsKQEAgLTE5NCw3ICsxOTYsNyBAQAogCX0KIAllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsICZybWgpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHBpcGUgYWxsb2NhdGlvbiAiCisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJlcnJvciBwaXBlIGFsbG9jYXRpb24gIgogCQkJICAgIihDTURfUkVTX1BJUEUpIGVycj0leCFcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMjIyLDE0ICsyMjQsMTQgQEAKIAkvKiBzdG9wIG9uZSBwaXBlICovCiAJZXJyID0gcGN4aHJfc2V0X3BpcGVfc3RhdGUobWdyLCBwbGF5YmFja19tYXNrLCBjYXB0dXJlX21hc2ssIDApOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBzdG9wcGluZyBwaXBlIVxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJlcnJvciBzdG9wcGluZyBwaXBlIVxuIik7CiAJLyogcmVsZWFzZSB0aGUgcGlwZSAqLwogCXBjeGhyX2luaXRfcm1oKCZybWgsIENNRF9GUkVFX1BJUEUpOwogCXBjeGhyX3NldF9waXBlX2NtZF9wYXJhbXMoJnJtaCwgcGlwZS0+aXNfY2FwdHVyZSwgcGlwZS0+Zmlyc3RfYXVkaW8sCiAJCQkJICAwLCAwKTsKIAllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsICZybWgpOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBwaXBlIHJlbGVhc2UgIgorCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAiZXJyb3IgcGlwZSByZWxlYXNlICIKIAkJCSAgICIoQ01EX0ZSRUVfUElQRSkgZXJyKCV4KVxuIiwgZXJyKTsKIAlwaXBlLT5zdGF0dXMgPSBQQ1hIUl9QSVBFX1VOREVGSU5FRDsKIAlyZXR1cm4gZXJyOwpAQCAtMjg5LDcgKzI5MSw4IEBACiB7CiAJaW50IGVyciwgY2FyZF9pbmRleDsKIAotCXNuZF9wcmludGRkKCJsb2FkaW5nIGRzcCBbJWRdIHNpemUgPSAlWmRcbiIsIGluZGV4LCBkc3AtPnNpemUpOworCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCSJsb2FkaW5nIGRzcCBbJWRdIHNpemUgPSAlWmRcbiIsIGluZGV4LCBkc3AtPnNpemUpOwogCiAJc3dpdGNoIChpbmRleCkgewogCWNhc2UgUENYSFJfRklSTVdBUkVfWExYX0lOVF9JTkRFWDoKQEAgLTMxMywxOSArMzE2LDE5IEBACiAJCQlyZXR1cm4gZXJyOwogCQlicmVhazsJLyogY29udGludWUgd2l0aCBmaXJzdCBpbml0ICovCiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAid3JvbmcgZmlsZSBpbmRleFxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJ3cm9uZyBmaWxlIGluZGV4XG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfSAvKiBlbmQgb2Ygc3dpdGNoIGZpbGUgaW5kZXgqLwogCiAJLyogZmlyc3QgY29tbXVuaWNhdGlvbiB3aXRoIGVtYmVkZGVkICovCiAJZXJyID0gcGN4aHJfaW5pdF9ib2FyZChtZ3IpOwogICAgICAgICBpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hociBjb3VsZCBub3QgYmUgc2V0IHVwXG4iKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwgInBjeGhyIGNvdWxkIG5vdCBiZSBzZXQgdXBcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAllcnIgPSBwY3hocl9jb25maWdfcGlwZXMobWdyKTsKICAgICAgICAgaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAicGN4aHIgcGlwZXMgY291bGQgbm90IGJlIHNldCB1cFxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJwY3hociBwaXBlcyBjb3VsZCBub3QgYmUgc2V0IHVwXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAgICAgICAgCS8qIGNyZWF0ZSBkZXZpY2VzIGFuZCBtaXhlciBpbiBhY2NvcmRhbmNlIHdpdGggSFcgb3B0aW9ucyovCkBAIC0zNDQsMTAgKzM0NywxMSBAQAogCX0KIAllcnIgPSBwY3hocl9zdGFydF9waXBlcyhtZ3IpOwogICAgICAgICBpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hociBwaXBlcyBjb3VsZCBub3QgYmUgc3RhcnRlZFxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJwY3hociBwaXBlcyBjb3VsZCBub3QgYmUgc3RhcnRlZFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQotCXNuZF9wcmludGRkKCJwY3hociBmaXJtd2FyZSBkb3dubG9hZGVkIGFuZCBzdWNjZXNzZnVsbHkgc2V0IHVwXG4iKTsKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkicGN4aHIgZmlybXdhcmUgZG93bmxvYWRlZCBhbmQgc3VjY2Vzc2Z1bGx5IHNldCB1cFxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM4Miw3ICszODYsOCBAQAogCQkJY29udGludWU7CiAJCXNwcmludGYocGF0aCwgInBjeGhyLyVzIiwgZndfZmlsZXNbZndfc2V0XVtpXSk7CiAJCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgcGF0aCwgJm1nci0+cGNpLT5kZXYpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hocjogY2FuJ3QgbG9hZCBmaXJtd2FyZSAlc1xuIiwKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJInBjeGhyOiBjYW4ndCBsb2FkIGZpcm13YXJlICVzXG4iLAogCQkJCSAgIHBhdGgpOwogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9wY3hoci9wY3hocl9taXgyMi5jIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX21peDIyLmMKaW5kZXggODRmZTU3Ni4uNmE1NmU1MyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3BjeGhyL3BjeGhyX21peDIyLmMKKysrIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX21peDIyLmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgpAQCAtMjkwLDcgKzI5MSw4IEBACiAJcmVnID0gUENYSFJfSU5QQihtZ3IsIFBDWEhSX1hMWF9TVEFUVVMpOwogCWlmIChyZWcgJiBQQ1hIUl9TVEFUX01JQ19DQVBTKQogCQltZ3ItPmJvYXJkX2hhc19taWMgPSAxOwkvKiBtaWNyb3Bob25lIGF2YWlsYWJsZSAqLwotCXNuZF9wcmludGRkKCJNSUMgaW5wdXQgYXZhaWxhYmxlID0gJWRcbiIsIG1nci0+Ym9hcmRfaGFzX21pYyk7CisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJIk1JQyBpbnB1dCBhdmFpbGFibGUgPSAlZFxuIiwgbWdyLT5ib2FyZF9oYXNfbWljKTsKIAogCS8qIHJlc2V0IGNvZGVjICovCiAJUENYSFJfT1VUUEIobWdyLCBQQ1hIUl9EU1BfUkVTRVQsCkBAIC00MDUsNyArNDA3LDcgQEAKIAogCWhyMjIyX2NvbmZpZ19ha20obWdyLCBBS01fVU5NVVRFX0NNRCk7CiAKLQlzbmRfcHJpbnRkZCgic2V0X2Nsb2NrIHRvICVkSHogKHJlYWxmcmVxPSVkIHBsbHJlZz0leClcbiIsCisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgInNldF9jbG9jayB0byAlZEh6IChyZWFsZnJlcT0lZCBwbGxyZWc9JXgpXG4iLAogCQkgICAgcmF0ZSwgcmVhbGZyZXEsIHBsbHJlZyk7CiAJcmV0dXJuIDA7CiB9CkBAIC00MzEsMTMgKzQzMywxNSBAQAogCQlyZWcgPSBQQ1hIUl9TVEFUX0ZSRVFfVUVSMV9NQVNLOwogCiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ZGQoImdldF9leHRlcm5hbF9jbG9jayA6IHR5cGUgJWQgbm90IHN1cHBvcnRlZFxuIiwKKwkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCSJnZXRfZXh0ZXJuYWxfY2xvY2sgOiB0eXBlICVkIG5vdCBzdXBwb3J0ZWRcbiIsCiAJCQkgICAgY2xvY2tfdHlwZSk7CiAJCXJldHVybiAtRUlOVkFMOyAvKiBvdGhlciBjbG9ja3Mgbm90IHN1cHBvcnRlZCAqLwogCX0KIAogCWlmICgoUENYSFJfSU5QQihtZ3IsIFBDWEhSX1hMWF9DU1VFUikgJiBtYXNrKSAhPSBtYXNrKSB7Ci0JCXNuZF9wcmludGRkKCJnZXRfZXh0ZXJuYWxfY2xvY2soJWQpID0gMCBIelxuIiwgY2xvY2tfdHlwZSk7CisJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCQkiZ2V0X2V4dGVybmFsX2Nsb2NrKCVkKSA9IDAgSHpcbiIsIGNsb2NrX3R5cGUpOwogCQkqc2FtcGxlX3JhdGUgPSAwOwogCQlyZXR1cm4gMDsgLyogbm8gZXh0ZXJuYWwgY2xvY2sgbG9ja2VkICovCiAJfQpAQCAtNDk1LDcgKzQ5OSw3IEBACiAJZWxzZQogCQlyYXRlID0gMDsKIAotCXNuZF9wcmludGRkKCJFeHRlcm5hbCBjbG9jayBpcyBhdCAlZCBIeiAobWVhc3VyZWQgJWQgSHopXG4iLAorCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJFeHRlcm5hbCBjbG9jayBpcyBhdCAlZCBIeiAobWVhc3VyZWQgJWQgSHopXG4iLAogCQkgICAgcmF0ZSwgY2FsY19yYXRlKTsKIAkqc2FtcGxlX3JhdGUgPSByYXRlOwogCXJldHVybiAwOwpAQCAtNTQyLDcgKzU0Niw4IEBACiBpbnQgaHIyMjJfdXBkYXRlX2FuYWxvZ19hdWRpb19sZXZlbChzdHJ1Y3Qgc25kX3BjeGhyICpjaGlwLAogCQkJCSAgICBpbnQgaXNfY2FwdHVyZSwgaW50IGNoYW5uZWwpCiB7Ci0Jc25kX3ByaW50ZGQoImhyMjIyX3VwZGF0ZV9hbmFsb2dfYXVkaW9fbGV2ZWwoJXMgY2hhbj0lZClcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJocjIyMl91cGRhdGVfYW5hbG9nX2F1ZGlvX2xldmVsKCVzIGNoYW49JWQpXG4iLAogCQkgICAgaXNfY2FwdHVyZSA/ICJjYXB0dXJlIiA6ICJwbGF5YmFjayIsIGNoYW5uZWwpOwogCWlmIChpc19jYXB0dXJlKSB7CiAJCWludCBsZXZlbF9sLCBsZXZlbF9yLCBsZXZlbF9taWM7CkBAIC02NDIsNyArNjQ3LDcgQEAKIAkJaWYgKFBDWEhSX0lOUEIoY2hpcC0+bWdyLCBQQ1hIUl9YTFhfQ1NVRVIpICYgbWFzaykKIAkJCXRlbXAgfD0gMTsKIAl9Ci0Jc25kX3ByaW50ZGQoInJlYWQgaWVjOTU4IEFFUyAlZCBieXRlICVkID0gMHgleFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInJlYWQgaWVjOTU4IEFFUyAlZCBieXRlICVkID0gMHgleFxuIiwKIAkJICAgIGNoaXAtPmNoaXBfaWR4LCBhZXNfaWR4LCB0ZW1wKTsKIAkqYWVzX2JpdHMgPSB0ZW1wOwogCXJldHVybiAwOwpAQCAtNjg0LDcgKzY4OSw3IEBACiAKIAlQQ1hIUl9PVVRQQihtZ3IsIFBDWEhSX1hMWF9TRUxNSUMsIG1nci0+eGx4X3NlbG1pYyk7CiAKLQlzbmRfcHJpbnRkZCgiaHIyMjJfbWljcm9fYm9vc3QgOiBzZXQgJXhcbiIsIGJvb3N0X21hc2spOworCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJocjIyMl9taWNyb19ib29zdCA6IHNldCAleFxuIiwgYm9vc3RfbWFzayk7CiB9CiAKIHN0YXRpYyB2b2lkIGhyMjIyX3BoYW50b21fcG93ZXIoc3RydWN0IHBjeGhyX21nciAqbWdyLCBpbnQgcG93ZXIpCkBAIC02OTYsNyArNzAxLDcgQEAKIAogCVBDWEhSX09VVFBCKG1nciwgUENYSFJfWExYX1NFTE1JQywgbWdyLT54bHhfc2VsbWljKTsKIAotCXNuZF9wcmludGRkKCJocjIyMl9waGFudG9tX3Bvd2VyIDogc2V0ICVkXG4iLCBwb3dlcik7CisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgImhyMjIyX3BoYW50b21fcG93ZXIgOiBzZXQgJWRcbiIsIHBvd2VyKTsKIH0KIAogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHJfbWl4ZXIuYyBiL3NvdW5kL3BjaS9wY3hoci9wY3hocl9taXhlci5jCmluZGV4IGZlYzA0OTMuLjk1Yzk1NzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9wY3hoci9wY3hocl9taXhlci5jCisrKyBiL3NvdW5kL3BjaS9wY3hoci9wY3hocl9taXhlci5jCkBAIC03Miw3ICs3Miw4IEBACiAJcm1oLmNtZF9sZW4gPSAzOwogCWVyciA9IHBjeGhyX3NlbmRfbXNnKGNoaXAtPm1nciwgJnJtaCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJlcnJvciB1cGRhdGVfYW5hbG9nX2F1ZGlvX2xldmVsIGNhcmQoJWQpIgorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJlcnJvciB1cGRhdGVfYW5hbG9nX2F1ZGlvX2xldmVsIGNhcmQoJWQpIgogCQkJICAgIiBpc19jYXB0dXJlKCVkKSBlcnIoJXgpXG4iLAogCQkJICAgY2hpcC0+Y2hpcF9pZHgsIGlzX2NhcHR1cmUsIGVycik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjg0LDcgKzI4NSw3IEBACiAKIAllcnIgPSBwY3hocl9zZW5kX21zZyhjaGlwLT5tZ3IsICZybWgpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiZXJyb3IgdXBkYXRlX3BsYXliYWNrX3N0cmVhbV9sZXZlbCAiCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiZXJyb3IgdXBkYXRlX3BsYXliYWNrX3N0cmVhbV9sZXZlbCAiCiAJCQkgICAiY2FyZCglZCkgZXJyKCV4KVxuIiwgY2hpcC0+Y2hpcF9pZHgsIGVycik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTMzNSw3ICszMzYsOCBAQAogCiAJZXJyID0gcGN4aHJfc2VuZF9tc2coY2hpcC0+bWdyLCAmcm1oKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImVycm9yIHVwZGF0ZV9hdWRpb19sZXZlbCglZCkgZXJyPSV4XG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJlcnJvciB1cGRhdGVfYXVkaW9fbGV2ZWwoJWQpIGVycj0leFxuIiwKIAkJCSAgIGNoaXAtPmNoaXBfaWR4LCBlcnIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC05MzAsNyArOTMyLDcgQEAKIAkJCQl0ZW1wIHw9IDE7CiAJCX0KIAl9Ci0Jc25kX3ByaW50ZGQoInJlYWQgaWVjOTU4IEFFUyAlZCBieXRlICVkID0gMHgleFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInJlYWQgaWVjOTU4IEFFUyAlZCBieXRlICVkID0gMHgleFxuIiwKIAkJICAgIGNoaXAtPmNoaXBfaWR4LCBhZXNfaWR4LCB0ZW1wKTsKIAkqYWVzX2JpdHMgPSB0ZW1wOwogCXJldHVybiAwOwpAQCAtOTkyLDcgKzk5NCw4IEBACiAJCQlybWguY21kWzBdIHw9IElPX05VTV9SRUdfQ1VFUjsKIAkJCXJtaC5jbWRbMV0gPSBjbWQ7CiAJCQlybWguY21kX2xlbiA9IDI7Ci0JCQlzbmRfcHJpbnRkZCgid3JpdGUgaWVjOTU4IEFFUyAlZCBieXRlICVkIGJpdCAlZCAoY21kICV4KVxuIiwKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJ3cml0ZSBpZWM5NTggQUVTICVkIGJ5dGUgJWQgYml0ICVkIChjbWQgJXgpXG4iLAogCQkJCSAgICBjaGlwLT5jaGlwX2lkeCwgYWVzX2lkeCwgaSwgY21kKTsKIAkJCWVyciA9IHBjeGhyX3NlbmRfbXNnKGNoaXAtPm1nciwgJnJtaCk7CiAJCQlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jIGIvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jCmluZGV4IDU2Y2M4OTEuLmI0YTgyNzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYworKysgYi9zb3VuZC9wY2kvcmlwdGlkZS9yaXB0aWRlLmMKQEAgLTE5MTYsOCArMTkxNiw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJjaGlwID0gY2hpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTIwODYsNyArMjA4NCw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWVyciA9IHNuZF9yaXB0aWRlX2NyZWF0ZShjYXJkLCBwY2ksICZjaGlwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWUzMi5jIGIvc291bmQvcGNpL3JtZTMyLmMKaW5kZXggY2MyNjM0Ni4uY2MyZjBjMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTMyLmMKKysrIGIvc291bmQvcGNpL3JtZTMyLmMKQEAgLTEzNDksMTQgKzEzNDksMTUgQEAKIAogCXJtZTMyLT5pb2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUocm1lMzItPnBvcnQsIFJNRTMyX0lPX1NJWkUpOwogCWlmICghcm1lMzItPmlvYmFzZSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVtYXAgbWVtb3J5IHJlZ2lvbiAweCVseC0weCVseFxuIiwKKwkJZGV2X2VycihybWUzMi0+Y2FyZC0+ZGV2LAorCQkJInVuYWJsZSB0byByZW1hcCBtZW1vcnkgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLAogCQkJICAgcm1lMzItPnBvcnQsIHJtZTMyLT5wb3J0ICsgUk1FMzJfSU9fU0laRSAtIDEpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9ybWUzMl9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIHJtZTMyKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihybWUzMi0+Y2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCXJtZTMyLT5pcnEgPSBwY2ktPmlycTsKQEAgLTE5MzgsMTUgKzE5MzksMTQgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBybWUzMiksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgcm1lMzIpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJY2FyZC0+cHJpdmF0ZV9mcmVlID0gc25kX3JtZTMyX2NhcmRfZnJlZTsKIAlybWUzMiA9IChzdHJ1Y3Qgcm1lMzIgKikgY2FyZC0+cHJpdmF0ZV9kYXRhOwogCXJtZTMyLT5jYXJkID0gY2FyZDsKIAlybWUzMi0+cGNpID0gcGNpOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKICAgICAgICAgaWYgKGZ1bGxkdXBsZXhbZGV2XSkKIAkJcm1lMzItPmZ1bGxkdXBsZXhfbW9kZSA9IDE7CiAJaWYgKChlcnIgPSBzbmRfcm1lMzJfY3JlYXRlKHJtZTMyKSkgPCAwKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTYuYyBiL3NvdW5kL3BjaS9ybWU5Ni5jCmluZGV4IDAyMzYzNjMuLjc2MTY5OTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5Ni5jCisrKyBiL3NvdW5kL3BjaS9ybWU5Ni5jCkBAIC0yNDAsNyArMjQwLDcgQEAKIAogCXU4IHJldjsgLyogY2FyZCByZXZpc2lvbiBudW1iZXIgKi8KIAotI2lmZGVmIENPTkZJR19QTQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAogCXUzMiBwbGF5YmFja19wb2ludGVyOwogCXUzMiBjYXB0dXJlX3BvaW50ZXI7CiAJdm9pZCAqcGxheWJhY2tfc3VzcGVuZF9idWZmZXI7CkBAIC0xNTcwLDcgKzE1NzAsNyBAQAogCQlwY2lfcmVsZWFzZV9yZWdpb25zKHJtZTk2LT5wY2kpOwogCQlybWU5Ni0+cG9ydCA9IDA7CiAJfQotI2lmZGVmIENPTkZJR19QTQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAogCXZmcmVlKHJtZTk2LT5wbGF5YmFja19zdXNwZW5kX2J1ZmZlcik7CiAJdmZyZWUocm1lOTYtPmNhcHR1cmVfc3VzcGVuZF9idWZmZXIpOwogI2VuZGlmCkBAIC0xNjA5LDEzICsxNjA5LDE1IEBACiAKIAlybWU5Ni0+aW9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJtZTk2LT5wb3J0LCBSTUU5Nl9JT19TSVpFKTsKIAlpZiAoIXJtZTk2LT5pb2Jhc2UpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlbWFwIG1lbW9yeSByZWdpb24gMHglbHgtMHglbHhcbiIsIHJtZTk2LT5wb3J0LCBybWU5Ni0+cG9ydCArIFJNRTk2X0lPX1NJWkUgLSAxKTsKKwkJZGV2X2VycihybWU5Ni0+Y2FyZC0+ZGV2LAorCQkJInVuYWJsZSB0byByZW1hcCBtZW1vcnkgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLAorCQkJcm1lOTYtPnBvcnQsIHJtZTk2LT5wb3J0ICsgUk1FOTZfSU9fU0laRSAtIDEpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9ybWU5Nl9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIHJtZTk2KSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihybWU5Ni0+Y2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCXJtZTk2LT5pcnEgPSBwY2ktPmlycTsKQEAgLTIzNzIsMTMgKzIzNzQsMTIgQEAKICAqIENhcmQgaW5pdGlhbGlzYXRpb24KICAqLwogCi0jaWZkZWYgQ09ORklHX1BNCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAKLXN0YXRpYyBpbnQKLXNuZF9ybWU5Nl9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwY2ksCi0JCSAgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBybWU5Nl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpKTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpID0gdG9fcGNpX2RldihkZXYpOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBybWU5NiAqcm1lOTYgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAKIAlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EM2hvdCk7CkBAIC0yNDA3LDE1ICsyNDA4LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLXNuZF9ybWU5Nl9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3N0YXRpYyBpbnQgcm1lOTZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpKTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpID0gdG9fcGNpX2RldihkZXYpOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBybWU5NiAqcm1lOTYgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgInJtZTk2OiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTI0NTEsNyArMjQ1MiwxMSBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhybWU5Nl9wbSwgcm1lOTZfc3VzcGVuZCwgcm1lOTZfcmVzdW1lKTsKKyNkZWZpbmUgUk1FOTZfUE1fT1BTCSZybWU5Nl9wbQorI2Vsc2UKKyNkZWZpbmUgUk1FOTZfUE1fT1BTCU5VTEwKKyNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KIAogc3RhdGljIHZvaWQgc25kX3JtZTk2X2NhcmRfZnJlZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCiB7CkBAIC0yNDc1LDMxICsyNDgwLDMwIEBACiAJCWRldisrOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9Ci0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBybWU5NiksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgcm1lOTYpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJY2FyZC0+cHJpdmF0ZV9mcmVlID0gc25kX3JtZTk2X2NhcmRfZnJlZTsKIAlybWU5NiA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlybWU5Ni0+Y2FyZCA9IGNhcmQ7CiAJcm1lOTYtPnBjaSA9IHBjaTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CiAJaWYgKChlcnIgPSBzbmRfcm1lOTZfY3JlYXRlKHJtZTk2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CiAJfQogCQotI2lmZGVmIENPTkZJR19QTQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAogCXJtZTk2LT5wbGF5YmFja19zdXNwZW5kX2J1ZmZlciA9IHZtYWxsb2MoUk1FOTZfQlVGRkVSX1NJWkUpOwogCWlmICghcm1lOTYtPnBsYXliYWNrX3N1c3BlbmRfYnVmZmVyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJZGV2X2VycihjYXJkLT5kZXYsCiAJCQkgICAiRmFpbGVkIHRvIGFsbG9jYXRlIHBsYXliYWNrIHN1c3BlbmQgYnVmZmVyIVxuIik7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlybWU5Ni0+Y2FwdHVyZV9zdXNwZW5kX2J1ZmZlciA9IHZtYWxsb2MoUk1FOTZfQlVGRkVSX1NJWkUpOwogCWlmICghcm1lOTYtPmNhcHR1cmVfc3VzcGVuZF9idWZmZXIpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUgorCQlkZXZfZXJyKGNhcmQtPmRldiwKIAkJCSAgICJGYWlsZWQgdG8gYWxsb2NhdGUgY2FwdHVyZSBzdXNwZW5kIGJ1ZmZlciFcbiIpOwogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTI1NDgsMTAgKzI1NTIsOSBAQAogCS5pZF90YWJsZSA9IHNuZF9ybWU5Nl9pZHMsCiAJLnByb2JlID0gc25kX3JtZTk2X3Byb2JlLAogCS5yZW1vdmUgPSBzbmRfcm1lOTZfcmVtb3ZlLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kID0gc25kX3JtZTk2X3N1c3BlbmQsCi0JLnJlc3VtZSA9IHNuZF9ybWU5Nl9yZXN1bWUsCi0jZW5kaWYKKwkuZHJpdmVyID0geworCQkucG0gPSBSTUU5Nl9QTV9PUFMsCisJfSwKIH07CiAKIG1vZHVsZV9wY2lfZHJpdmVyKHJtZTk2X2RyaXZlcik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMKaW5kZXggYmQ5MGM4MC4uNGM2ZjVkMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jCisrKyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYwpAQCAtNjc1LDE0ICs2NzUsMTUgQEAKIAkJaWYgKDAgPT0gKGhkc3BfcmVhZChoZHNwLCBIRFNQX3N0YXR1c1JlZ2lzdGVyKSAmCiAJCQkJCUhEU1BfQ29uZmlnRXJyb3IpKSB7CiAJCQlpZiAoaSkgewotCQkJCXNuZF9wcmludGQoIkhhbW1lcmZhbGwtRFNQOiBJTyBib3ggZm91bmQgYWZ0ZXIgJWQgbXNcbiIsCisJCQkJZGV2X2RiZyhoZHNwLT5jYXJkLT5kZXYsCisJCQkJCSJJTyBib3ggZm91bmQgYWZ0ZXIgJWQgbXNcbiIsCiAJCQkJCQkoMjAgKiBpKSk7CiAJCQl9CiAJCQlyZXR1cm4gMDsKIAkJfQogCQltc2xlZXAoMjApOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogbm8gSU8gYm94IGNvbm5lY3RlZCFcbiIpOworCWRldl9lcnIoaGRzcC0+Y2FyZC0+ZGV2LCAibm8gSU8gYm94IGNvbm5lY3RlZCFcbiIpOwogCWhkc3AtPnN0YXRlICY9IH5IRFNQX0Zpcm13YXJlTG9hZGVkOwogCXJldHVybiAtRUlPOwogfQpAQCAtNjk5LDEzICs3MDAsMTMgQEAKIAkJaWYgKGhkc3BfcmVhZChoZHNwLCBIRFNQX3N0YXR1c1JlZ2lzdGVyKSAmIEhEU1BfQ29uZmlnRXJyb3IpCiAJCQltc2xlZXAoZGVsYXkpOwogCQllbHNlIHsKLQkJCXNuZF9wcmludGQoIkhhbW1lcmZhbGwtRFNQOiBpb2JveCBmb3VuZCBhZnRlciAldW1zIVxuIiwKKwkJCWRldl9kYmcoaGRzcC0+Y2FyZC0+ZGV2LCAiaW9ib3ggZm91bmQgYWZ0ZXIgJXVtcyFcbiIsCiAJCQkJICAgaSAqIGRlbGF5KTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCi0Jc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IG5vIElPIGJveCBjb25uZWN0ZWQhXG4iKTsKKwlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsICJubyBJTyBib3ggY29ubmVjdGVkIVxuIik7CiAJaGRzcC0+c3RhdGUgJj0gfkhEU1BfRmlybXdhcmVMb2FkZWQ7CiAJcmV0dXJuIC1FSU87CiB9CkBAIC03MjgsMTMgKzcyOSwxNCBAQAogCiAJaWYgKChoZHNwX3JlYWQgKGhkc3AsIEhEU1Bfc3RhdHVzUmVnaXN0ZXIpICYgSERTUF9EbGxFcnJvcikgIT0gMCkgewogCi0JCXNuZF9wcmludGsgKCJIYW1tZXJmYWxsLURTUDogbG9hZGluZyBmaXJtd2FyZVxuIik7CisJCWRldl9pbmZvKGhkc3AtPmNhcmQtPmRldiwgImxvYWRpbmcgZmlybXdhcmVcbiIpOwogCiAJCWhkc3Bfd3JpdGUgKGhkc3AsIEhEU1BfY29udHJvbDJSZWcsIEhEU1BfU19QUk9HUkFNKTsKIAkJaGRzcF93cml0ZSAoaGRzcCwgSERTUF9maWZvRGF0YSwgMCk7CiAKIAkJaWYgKGhkc3BfZmlmb193YWl0IChoZHNwLCAwLCBIRFNQX0xPTkdfV0FJVCkpIHsKLQkJCXNuZF9wcmludGsgKCJIYW1tZXJmYWxsLURTUDogdGltZW91dCB3YWl0aW5nIGZvciBkb3dubG9hZCBwcmVwYXJhdGlvblxuIik7CisJCQlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsCisJCQkJICJ0aW1lb3V0IHdhaXRpbmcgZm9yIGRvd25sb2FkIHByZXBhcmF0aW9uXG4iKTsKIAkJCWhkc3Bfd3JpdGUoaGRzcCwgSERTUF9jb250cm9sMlJlZywgSERTUF9TMjAwKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC03NDQsNyArNzQ2LDggQEAKIAkJZm9yIChpID0gMDsgaSA8IEhEU1BfRklSTVdBUkVfU0laRSAvIDQ7ICsraSkgewogCQkJaGRzcF93cml0ZShoZHNwLCBIRFNQX2ZpZm9EYXRhLCBjYWNoZVtpXSk7CiAJCQlpZiAoaGRzcF9maWZvX3dhaXQgKGhkc3AsIDEyNywgSERTUF9MT05HX1dBSVQpKSB7Ci0JCQkJc25kX3ByaW50ayAoIkhhbW1lcmZhbGwtRFNQOiB0aW1lb3V0IGR1cmluZyBmaXJtd2FyZSBsb2FkaW5nXG4iKTsKKwkJCQlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsCisJCQkJCSAidGltZW91dCBkdXJpbmcgZmlybXdhcmUgbG9hZGluZ1xuIik7CiAJCQkJaGRzcF93cml0ZShoZHNwLCBIRFNQX2NvbnRyb2wyUmVnLCBIRFNQX1MyMDApOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQpAQCAtNzYwLDExICs3NjMsMTIgQEAKIAkJaGRzcC0+Y29udHJvbDJfcmVnaXN0ZXIgPSAwOwogI2VuZGlmCiAJCWhkc3Bfd3JpdGUgKGhkc3AsIEhEU1BfY29udHJvbDJSZWcsIGhkc3AtPmNvbnRyb2wyX3JlZ2lzdGVyKTsKLQkJc25kX3ByaW50ayAoIkhhbW1lcmZhbGwtRFNQOiBmaW5pc2hlZCBmaXJtd2FyZSBsb2FkaW5nXG4iKTsKKwkJZGV2X2luZm8oaGRzcC0+Y2FyZC0+ZGV2LCAiZmluaXNoZWQgZmlybXdhcmUgbG9hZGluZ1xuIik7CiAKIAl9CiAJaWYgKGhkc3AtPnN0YXRlICYgSERTUF9Jbml0aWFsaXphdGlvbkNvbXBsZXRlKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJIYW1tZXJmYWxsLURTUDogZmlybXdhcmUgbG9hZGVkIGZyb20gY2FjaGUsIHJlc3RvcmluZyBkZWZhdWx0c1xuIik7CisJCWRldl9pbmZvKGhkc3AtPmNhcmQtPmRldiwKKwkJCSAiZmlybXdhcmUgbG9hZGVkIGZyb20gY2FjaGUsIHJlc3RvcmluZyBkZWZhdWx0c1xuIik7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZoZHNwLT5sb2NrLCBmbGFncyk7CiAJCXNuZF9oZHNwX3NldF9kZWZhdWx0cyhoZHNwKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGRzcC0+bG9jaywgZmxhZ3MpOwpAQCAtNzkxLDcgKzc5NSw3IEBACiAJCWhkc3Bfd3JpdGUgKGhkc3AsIEhEU1BfZmlmb0RhdGEsIDApOwogCQlpZiAoaGRzcF9maWZvX3dhaXQoaGRzcCwgMCwgSERTUF9TSE9SVF9XQUlUKSA8IDApIHsKIAkJCWhkc3AtPmlvX3R5cGUgPSBNdWx0aWZhY2U7Ci0JCQlzbmRfcHJpbnRrKCJIYW1tZXJmYWxsLURTUDogTXVsdGlmYWNlIGZvdW5kXG4iKTsKKwkJCWRldl9pbmZvKGhkc3AtPmNhcmQtPmRldiwgIk11bHRpZmFjZSBmb3VuZFxuIik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCkBAIC03OTksNyArODAzLDcgQEAKIAkJaGRzcF93cml0ZShoZHNwLCBIRFNQX2ZpZm9EYXRhLCAwKTsKIAkJaWYgKGhkc3BfZmlmb193YWl0KGhkc3AsIDAsIEhEU1BfU0hPUlRfV0FJVCkgPT0gMCkgewogCQkJaGRzcC0+aW9fdHlwZSA9IERpZ2lmYWNlOwotCQkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IERpZ2lmYWNlIGZvdW5kXG4iKTsKKwkJCWRldl9pbmZvKGhkc3AtPmNhcmQtPmRldiwgIkRpZ2lmYWNlIGZvdW5kXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CiAKQEAgLTgwOCw3ICs4MTIsNyBAQAogCQloZHNwX3dyaXRlKGhkc3AsIEhEU1BfZmlmb0RhdGEsIDApOwogCQlpZiAoaGRzcF9maWZvX3dhaXQoaGRzcCwgMCwgSERTUF9TSE9SVF9XQUlUKSA9PSAwKSB7CiAJCQloZHNwLT5pb190eXBlID0gTXVsdGlmYWNlOwotCQkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IE11bHRpZmFjZSBmb3VuZFxuIik7CisJCQlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsICJNdWx0aWZhY2UgZm91bmRcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtODE3LDEyICs4MjEsMTIgQEAKIAkJaGRzcF93cml0ZShoZHNwLCBIRFNQX2ZpZm9EYXRhLCAwKTsKIAkJaWYgKGhkc3BfZmlmb193YWl0KGhkc3AsIDAsIEhEU1BfU0hPUlRfV0FJVCkgPCAwKSB7CiAJCQloZHNwLT5pb190eXBlID0gTXVsdGlmYWNlOwotCQkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IE11bHRpZmFjZSBmb3VuZFxuIik7CisJCQlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsICJNdWx0aWZhY2UgZm91bmRcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAogCQloZHNwLT5pb190eXBlID0gUlBNOwotCQlzbmRfcHJpbnRrKCJIYW1tZXJmYWxsLURTUDogUlBNIGZvdW5kXG4iKTsKKwkJZGV2X2luZm8oaGRzcC0+Y2FyZC0+ZGV2LCAiUlBNIGZvdW5kXG4iKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIHsKIAkJLyogZmlybXdhcmUgd2FzIGFscmVhZHkgbG9hZGVkLCBnZXQgaW9ib3ggdHlwZSAqLwpAQCAtODQ3LDIwICs4NTEsMTggQEAKIAkJaGRzcC0+c3RhdGUgJj0gfkhEU1BfRmlybXdhcmVMb2FkZWQ7CiAJCWlmICghIGxvYWRfb25fZGVtYW5kKQogCQkJcmV0dXJuIC1FSU87Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkhhbW1lcmZhbGwtRFNQOiBmaXJtd2FyZSBub3QgcHJlc2VudC5cbiIpOworCQlkZXZfZXJyKGhkc3AtPmNhcmQtPmRldiwgImZpcm13YXJlIG5vdCBwcmVzZW50LlxuIik7CiAJCS8qIHRyeSB0byBsb2FkIGZpcm13YXJlICovCiAJCWlmICghIChoZHNwLT5zdGF0ZSAmIEhEU1BfRmlybXdhcmVDYWNoZWQpKSB7CiAJCQlpZiAoISBoZHNwX3JlcXVlc3RfZndfbG9hZGVyKGhkc3ApKQogCQkJCXJldHVybiAwOwotCQkJc25kX3ByaW50ayhLRVJOX0VSUgotCQkJCSAgICJIYW1tZXJmYWxsLURTUDogTm8gZmlybXdhcmUgbG9hZGVkIG5vciAiCi0JCQkJICAgImNhY2hlZCwgcGxlYXNlIHVwbG9hZCBmaXJtd2FyZS5cbiIpOworCQkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkJICAgIk5vIGZpcm13YXJlIGxvYWRlZCBub3IgY2FjaGVkLCBwbGVhc2UgdXBsb2FkIGZpcm13YXJlLlxuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlpZiAoc25kX2hkc3BfbG9hZF9maXJtd2FyZV9mcm9tX2NhY2hlKGhkc3ApICE9IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIKLQkJCQkgICAiSGFtbWVyZmFsbC1EU1A6IEZpcm13YXJlIGxvYWRpbmcgZnJvbSAiCi0JCQkJICAgImNhY2hlIGZhaWxlZCwgcGxlYXNlIHVwbG9hZCBtYW51YWxseS5cbiIpOworCQkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkJICAgIkZpcm13YXJlIGxvYWRpbmcgZnJvbSBjYWNoZSBmYWlsZWQsIHBsZWFzZSB1cGxvYWQgbWFudWFsbHkuXG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAJfQpAQCAtODg4LDcgKzg5MCw4IEBACiAJCXVkZWxheSAoMTAwKTsKIAl9CiAKLQlzbmRfcHJpbnRrICgiSGFtbWVyZmFsbC1EU1A6IHdhaXQgZm9yIEZJRk8gc3RhdHVzIDw9ICVkIGZhaWxlZCBhZnRlciAlZCBpdGVyYXRpb25zXG4iLAorCWRldl93YXJuKGhkc3AtPmNhcmQtPmRldiwKKwkJICJ3YWl0IGZvciBGSUZPIHN0YXR1cyA8PSAlZCBmYWlsZWQgYWZ0ZXIgJWQgaXRlcmF0aW9uc1xuIiwKIAkJICAgIGNvdW50LCB0aW1lb3V0KTsKIAlyZXR1cm4gLTE7CiB9CkBAIC0xMDA1LDcgKzEwMDgsOSBAQAogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KLQlzbmRfcHJpbnRrICgiSGFtbWVyZmFsbC1EU1A6IHVua25vd24gc3BkaWYgZnJlcXVlbmN5IHN0YXR1czsgYml0cyA9IDB4JXgsIHN0YXR1cyA9IDB4JXhcbiIsIHJhdGVfYml0cywgc3RhdHVzKTsKKwlkZXZfd2FybihoZHNwLT5jYXJkLT5kZXYsCisJCSAidW5rbm93biBzcGRpZiBmcmVxdWVuY3kgc3RhdHVzOyBiaXRzID0gMHgleCwgc3RhdHVzID0gMHgleFxuIiwKKwkJIHJhdGVfYml0cywgc3RhdHVzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTEzOSw3ICsxMTQ0LDggQEAKIAlpZiAoIShoZHNwLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUF9DbG9ja01vZGVNYXN0ZXIpKSB7CiAJCWlmIChjYWxsZWRfaW50ZXJuYWxseSkgewogCQkJLyogcmVxdWVzdCBmcm9tIGN0bCBvciBjYXJkIGluaXRpYWxpemF0aW9uICovCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogZGV2aWNlIGlzIG5vdCBydW5uaW5nIGFzIGEgY2xvY2sgbWFzdGVyOiBjYW5ub3Qgc2V0IHNhbXBsZSByYXRlLlxuIik7CisJCQlkZXZfZXJyKGhkc3AtPmNhcmQtPmRldiwKKwkJCQkiZGV2aWNlIGlzIG5vdCBydW5uaW5nIGFzIGEgY2xvY2sgbWFzdGVyOiBjYW5ub3Qgc2V0IHNhbXBsZSByYXRlLlxuIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0gZWxzZSB7CiAJCQkvKiBod19wYXJhbSByZXF1ZXN0IHdoaWxlIGluIEF1dG9TeW5jIG1vZGUgKi8KQEAgLTExNDcsMTEgKzExNTMsMTQgQEAKIAkJCWludCBzcGRpZl9mcmVxID0gaGRzcF9zcGRpZl9zYW1wbGVfcmF0ZShoZHNwKTsKIAogCQkJaWYgKChzcGRpZl9mcmVxID09IGV4dGVybmFsX2ZyZXEqMikgJiYgKGhkc3BfYXV0b3N5bmNfcmVmKGhkc3ApID49IEhEU1BfQVVUT1NZTkNfRlJPTV9BREFUMSkpCi0JCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhhbW1lcmZhbGwtRFNQOiBEZXRlY3RlZCBBREFUIGluIGRvdWJsZSBzcGVlZCBtb2RlXG4iKTsKKwkJCQlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsCisJCQkJCSAiRGV0ZWN0ZWQgQURBVCBpbiBkb3VibGUgc3BlZWQgbW9kZVxuIik7CiAJCQllbHNlIGlmIChoZHNwLT5pb190eXBlID09IEg5NjMyICYmIChzcGRpZl9mcmVxID09IGV4dGVybmFsX2ZyZXEqNCkgJiYgKGhkc3BfYXV0b3N5bmNfcmVmKGhkc3ApID49IEhEU1BfQVVUT1NZTkNfRlJPTV9BREFUMSkpCi0JCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhhbW1lcmZhbGwtRFNQOiBEZXRlY3RlZCBBREFUIGluIHF1YWQgc3BlZWQgbW9kZVxuIik7CisJCQkJZGV2X2luZm8oaGRzcC0+Y2FyZC0+ZGV2LAorCQkJCQkgIkRldGVjdGVkIEFEQVQgaW4gcXVhZCBzcGVlZCBtb2RlXG4iKTsKIAkJCWVsc2UgaWYgKHJhdGUgIT0gZXh0ZXJuYWxfZnJlcSkgewotCQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJIYW1tZXJmYWxsLURTUDogTm8gQXV0b1N5bmMgc291cmNlIGZvciByZXF1ZXN0ZWQgcmF0ZVxuIik7CisJCQkJZGV2X2luZm8oaGRzcC0+Y2FyZC0+ZGV2LAorCQkJCQkgIk5vIEF1dG9TeW5jIHNvdXJjZSBmb3IgcmVxdWVzdGVkIHJhdGVcbiIpOwogCQkJCXJldHVybiAtMTsKIAkJCX0KIAkJfQpAQCAtMTIyMyw3ICsxMjMyLDggQEAKIAl9CiAKIAlpZiAocmVqZWN0X2lmX29wZW4gJiYgKGhkc3AtPmNhcHR1cmVfcGlkID49IDAgfHwgaGRzcC0+cGxheWJhY2tfcGlkID49IDApKSB7Ci0JCXNuZF9wcmludGsgKCJIYW1tZXJmYWxsLURTUDogY2Fubm90IGNoYW5nZSBzcGVlZCBtb2RlIChjYXB0dXJlIFBJRCA9ICVkLCBwbGF5YmFjayBQSUQgPSAlZClcbiIsCisJCWRldl93YXJuKGhkc3AtPmNhcmQtPmRldiwKKwkJCSAiY2Fubm90IGNoYW5nZSBzcGVlZCBtb2RlIChjYXB0dXJlIFBJRCA9ICVkLCBwbGF5YmFjayBQSUQgPSAlZClcbiIsCiAJCQkgICAgaGRzcC0+Y2FwdHVyZV9waWQsCiAJCQkgICAgaGRzcC0+cGxheWJhY2tfcGlkKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTM3ODUsNyArMzc5NSw4IEBACiAJICAgIHNuZF9oYW1tZXJmYWxsX2dldF9idWZmZXIoaGRzcC0+cGNpLCAmaGRzcC0+cGxheWJhY2tfZG1hX2J1ZiwgSERTUF9ETUFfQVJFQV9CWVRFUykgPCAwKSB7CiAJCWlmIChoZHNwLT5jYXB0dXJlX2RtYV9idWYuYXJlYSkKIAkJCXNuZF9kbWFfZnJlZV9wYWdlcygmaGRzcC0+Y2FwdHVyZV9kbWFfYnVmKTsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gYnVmZmVycyBhdmFpbGFibGVcbiIsIGhkc3AtPmNhcmRfbmFtZSk7CisJCWRldl9lcnIoaGRzcC0+Y2FyZC0+ZGV2LAorCQkJIiVzOiBubyBidWZmZXJzIGF2YWlsYWJsZVxuIiwgaGRzcC0+Y2FyZF9uYW1lKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC00NzQ3LDcgKzQ3NTgsOCBAQAogCQkJcmV0dXJuIGVycjsKIAogCQlpZiAoIShoZHNwLT5zdGF0ZSAmIEhEU1BfRmlybXdhcmVMb2FkZWQpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogZmlybXdhcmUgbmVlZHMgdG8gYmUgdXBsb2FkZWQgdG8gdGhlIGNhcmQuXG4iKTsKKwkJCWRldl9lcnIoaGRzcC0+Y2FyZC0+ZGV2LAorCQkJCSJmaXJtd2FyZSBuZWVkcyB0byBiZSB1cGxvYWRlZCB0byB0aGUgY2FyZC5cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIApAQCAtNDg1OCw3ICs0ODcwLDggQEAKIAkJaWYgKGhkc3AtPnN0YXRlICYgKEhEU1BfRmlybXdhcmVDYWNoZWQgfCBIRFNQX0Zpcm13YXJlTG9hZGVkKSkKIAkJCXJldHVybiAtRUJVU1k7CiAKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhhbW1lcmZhbGwtRFNQOiBpbml0aWFsaXppbmcgZmlybXdhcmUgdXBsb2FkXG4iKTsKKwkJZGV2X2luZm8oaGRzcC0+Y2FyZC0+ZGV2LAorCQkJICJpbml0aWFsaXppbmcgZmlybXdhcmUgdXBsb2FkXG4iKTsKIAkJZmlybXdhcmUgPSAoc3RydWN0IGhkc3BfZmlybXdhcmUgX191c2VyICopYXJncDsKIAogCQlpZiAoZ2V0X3VzZXIoZmlybXdhcmVfZGF0YSwgJmZpcm13YXJlLT5maXJtd2FyZV9kYXRhKSkKQEAgLTQ4OTMsNyArNDkwNiw4IEBACiAJCQlzbmRfaGRzcF9pbml0aWFsaXplX21pZGlfZmx1c2goaGRzcCk7CiAKIAkJCWlmICgoZXJyID0gc25kX2hkc3BfY3JlYXRlX2Fsc2FfZGV2aWNlcyhoZHNwLT5jYXJkLCBoZHNwKSkgPCAwKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IGVycm9yIGNyZWF0aW5nIGFsc2EgZGV2aWNlc1xuIik7CisJCQkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkJCSJlcnJvciBjcmVhdGluZyBhbHNhIGRldmljZXNcbiIpOwogCQkJCXJldHVybiBlcnI7CiAJCQl9CiAJCX0KQEAgLTQ5ODMsNyArNDk5Nyw4IEBACiAJaW50IGk7CiAKIAlpZiAoaGRzcF9maWZvX3dhaXQgKGhkc3AsIDAsIDEwMCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IGVuYWJsZV9pbyBmaWZvX3dhaXQgZmFpbGVkXG4iKTsKKwkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkiZW5hYmxlX2lvIGZpZm9fd2FpdCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTUwNTcsMjUgKzUwNzIsMjkgQEAKIAlpbnQgZXJyOwogCiAJaWYgKChlcnIgPSBzbmRfaGRzcF9jcmVhdGVfcGNtKGNhcmQsIGhkc3ApKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IEVycm9yIGNyZWF0aW5nIHBjbSBpbnRlcmZhY2VcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJFcnJvciBjcmVhdGluZyBwY20gaW50ZXJmYWNlXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKIAogCWlmICgoZXJyID0gc25kX2hkc3BfY3JlYXRlX21pZGkoY2FyZCwgaGRzcCwgMCkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogRXJyb3IgY3JlYXRpbmcgZmlyc3QgbWlkaSBpbnRlcmZhY2VcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJFcnJvciBjcmVhdGluZyBmaXJzdCBtaWRpIGludGVyZmFjZVxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJaWYgKGhkc3AtPmlvX3R5cGUgPT0gRGlnaWZhY2UgfHwgaGRzcC0+aW9fdHlwZSA9PSBIOTY1MikgewogCQlpZiAoKGVyciA9IHNuZF9oZHNwX2NyZWF0ZV9taWRpKGNhcmQsIGhkc3AsIDEpKSA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkhhbW1lcmZhbGwtRFNQOiBFcnJvciBjcmVhdGluZyBzZWNvbmQgbWlkaSBpbnRlcmZhY2VcbiIpOworCQkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkJIkVycm9yIGNyZWF0aW5nIHNlY29uZCBtaWRpIGludGVyZmFjZVxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQogCiAJaWYgKChlcnIgPSBzbmRfaGRzcF9jcmVhdGVfY29udHJvbHMoY2FyZCwgaGRzcCkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogRXJyb3IgY3JlYXRpbmcgY3RsIGludGVyZmFjZVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJIkVycm9yIGNyZWF0aW5nIGN0bCBpbnRlcmZhY2VcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNTA4OCw3ICs1MTA3LDggQEAKIAloZHNwLT5wbGF5YmFja19zdWJzdHJlYW0gPSBOVUxMOwogCiAJaWYgKChlcnIgPSBzbmRfaGRzcF9zZXRfZGVmYXVsdHMoaGRzcCkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogRXJyb3Igc2V0dGluZyBkZWZhdWx0IHZhbHVlc1xuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJIkVycm9yIHNldHRpbmcgZGVmYXVsdCB2YWx1ZXNcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNTA5OCw3ICs1MTE4LDggQEAKIAkJCWhkc3AtPnBvcnQsIGhkc3AtPmlycSk7CiAKIAkJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogZXJyb3IgcmVnaXN0ZXJpbmcgY2FyZFxuIik7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCQkiZXJyb3IgcmVnaXN0ZXJpbmcgY2FyZFxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCWhkc3AtPnN0YXRlIHw9IEhEU1BfSW5pdGlhbGl6YXRpb25Db21wbGV0ZTsKQEAgLTUxNDEsMTYgKzUxNjIsMTkgQEAKIAkJCWZ3ZmlsZSA9ICJkaWdpZmFjZV9maXJtd2FyZV9yZXYxMS5iaW4iOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogaW52YWxpZCBpb190eXBlICVkXG4iLCBoZHNwLT5pb190eXBlKTsKKwkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkiaW52YWxpZCBpb190eXBlICVkXG4iLCBoZHNwLT5pb190eXBlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd2ZpbGUsICZoZHNwLT5wY2ktPmRldikpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IGNhbm5vdCBsb2FkIGZpcm13YXJlICVzXG4iLCBmd2ZpbGUpOworCQlkZXZfZXJyKGhkc3AtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgbG9hZCBmaXJtd2FyZSAlc1xuIiwgZndmaWxlKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCWlmIChmdy0+c2l6ZSA8IEhEU1BfRklSTVdBUkVfU0laRSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogdG9vIHNob3J0IGZpcm13YXJlIHNpemUgJWQgKGV4cGVjdGVkICVkKVxuIiwKKwkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkidG9vIHNob3J0IGZpcm13YXJlIHNpemUgJWQgKGV4cGVjdGVkICVkKVxuIiwKIAkJCSAgIChpbnQpZnctPnNpemUsIEhEU1BfRklSTVdBUkVfU0laRSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTUxNjcsMTMgKzUxOTEsMTUgQEAKIAkJCXJldHVybiBlcnI7CiAKIAkJaWYgKChlcnIgPSBzbmRfaGRzcF9jcmVhdGVfaHdkZXAoaGRzcC0+Y2FyZCwgaGRzcCkpIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IGVycm9yIGNyZWF0aW5nIGh3ZGVwIGRldmljZVxuIik7CisJCQlkZXZfZXJyKGhkc3AtPmNhcmQtPmRldiwKKwkJCQkiZXJyb3IgY3JlYXRpbmcgaHdkZXAgZGV2aWNlXG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAkJc25kX2hkc3BfaW5pdGlhbGl6ZV9jaGFubmVscyhoZHNwKTsKIAkJc25kX2hkc3BfaW5pdGlhbGl6ZV9taWRpX2ZsdXNoKGhkc3ApOwogCQlpZiAoKGVyciA9IHNuZF9oZHNwX2NyZWF0ZV9hbHNhX2RldmljZXMoaGRzcC0+Y2FyZCwgaGRzcCkpIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IGVycm9yIGNyZWF0aW5nIGFsc2EgZGV2aWNlc1xuIik7CisJCQlkZXZfZXJyKGhkc3AtPmNhcmQtPmRldiwKKwkJCQkiZXJyb3IgY3JlYXRpbmcgYWxzYSBkZXZpY2VzXG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC01MjQ5LDEzICs1Mjc1LDE0IEBACiAJCXJldHVybiBlcnI7CiAJaGRzcC0+cG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOwogCWlmICgoaGRzcC0+aW9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKGhkc3AtPnBvcnQsIEhEU1BfSU9fRVhURU5UKSkgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogdW5hYmxlIHRvIHJlbWFwIHJlZ2lvbiAweCVseC0weCVseFxuIiwgaGRzcC0+cG9ydCwgaGRzcC0+cG9ydCArIEhEU1BfSU9fRVhURU5UIC0gMSk7CisJCWRldl9lcnIoaGRzcC0+Y2FyZC0+ZGV2LCAidW5hYmxlIHRvIHJlbWFwIHJlZ2lvbiAweCVseC0weCVseFxuIiwKKwkJCWhkc3AtPnBvcnQsIGhkc3AtPnBvcnQgKyBIRFNQX0lPX0VYVEVOVCAtIDEpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2hkc3BfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBoZHNwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogdW5hYmxlIHRvIHVzZSBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsICJ1bmFibGUgdG8gdXNlIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtNTI4MSwxNyArNTMwOCwyMCBAQAogCQkJCSAgIGlmIHVzZXJzcGFjZSBpcyBub3QgcmVhZHkgZm9yCiAJCQkJICAgZmlybXdhcmUgdXBsb2FkCiAJCQkJKi8KLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogY291bGRuJ3QgZ2V0IGZpcm13YXJlIGZyb20gdXNlcnNwYWNlLiB0cnkgdXNpbmcgaGRzcGxvYWRlclxuIik7CisJCQkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkJCSJjb3VsZG4ndCBnZXQgZmlybXdhcmUgZnJvbSB1c2Vyc3BhY2UuIHRyeSB1c2luZyBoZHNwbG9hZGVyXG4iKTsKIAkJCWVsc2UKIAkJCQkvKiBpbml0IGlzIGNvbXBsZXRlLCB3ZSByZXR1cm4gKi8KIAkJCQlyZXR1cm4gMDsKIAkJCS8qIHdlIGRlZmVyIGluaXRpYWxpemF0aW9uICovCi0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiSGFtbWVyZmFsbC1EU1A6IGNhcmQgaW5pdGlhbGl6YXRpb24gcGVuZGluZyA6IHdhaXRpbmcgZm9yIGZpcm13YXJlXG4iKTsKKwkJCWRldl9pbmZvKGhkc3AtPmNhcmQtPmRldiwKKwkJCQkgImNhcmQgaW5pdGlhbGl6YXRpb24gcGVuZGluZyA6IHdhaXRpbmcgZm9yIGZpcm13YXJlXG4iKTsKIAkJCWlmICgoZXJyID0gc25kX2hkc3BfY3JlYXRlX2h3ZGVwKGNhcmQsIGhkc3ApKSA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAkJCXJldHVybiAwOwogCQl9IGVsc2UgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhhbW1lcmZhbGwtRFNQOiBGaXJtd2FyZSBhbHJlYWR5IHByZXNlbnQsIGluaXRpYWxpemluZyBjYXJkLlxuIik7CisJCQlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsCisJCQkJICJGaXJtd2FyZSBhbHJlYWR5IHByZXNlbnQsIGluaXRpYWxpemluZyBjYXJkLlxuIik7CiAJCQlpZiAoaGRzcF9yZWFkKGhkc3AsIEhEU1Bfc3RhdHVzMlJlZ2lzdGVyKSAmIEhEU1BfdmVyc2lvbjIpCiAJCQkJaGRzcC0+aW9fdHlwZSA9IFJQTTsKIAkJCWVsc2UgaWYgKGhkc3BfcmVhZChoZHNwLCBIRFNQX3N0YXR1czJSZWdpc3RlcikgJiBIRFNQX3ZlcnNpb24xKQpAQCAtNTM3NSw4ICs1NDA1LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBoZHNwKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBoZHNwKSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC01Mzg0LDcgKzU0MTQsNiBAQAogCWNhcmQtPnByaXZhdGVfZnJlZSA9IHNuZF9oZHNwX2NhcmRfZnJlZTsKIAloZHNwLT5kZXYgPSBkZXY7CiAJaGRzcC0+cGNpID0gcGNpOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKIAogCWlmICgoZXJyID0gc25kX2hkc3BfY3JlYXRlKGNhcmQsIGhkc3ApKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCmluZGV4IGU5OGRjMDAuLmNiODJiNTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYwpAQCAtMTY1MSw5ICsxNjUxLDggQEAKIAkJCSAgIGp1c3QgbWFrZSBhIHdhcm5pbmcgYW4gcmVtZW1iZXIgc2V0dGluZwogCQkJICAgZm9yIGZ1dHVyZSBtYXN0ZXIgbW9kZSBzd2l0Y2hpbmcgKi8KIAotCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkhEU1BNOiAiCi0JCQkJICAgIldhcm5pbmc6IGRldmljZSBpcyBub3QgcnVubmluZyAiCi0JCQkJICAgImFzIGEgY2xvY2sgbWFzdGVyLlxuIik7CisJCQlkZXZfd2FybihoZHNwbS0+Y2FyZC0+ZGV2LAorCQkJCSAiV2FybmluZzogZGV2aWNlIGlzIG5vdCBydW5uaW5nIGFzIGEgY2xvY2sgbWFzdGVyLlxuIik7CiAJCQlub3Rfc2V0ID0gMTsKIAkJfSBlbHNlIHsKIApAQCAtMTY2NCwxNSArMTY2MywxNCBAQAogCQkJaWYgKGhkc3BtX2F1dG9zeW5jX3JlZihoZHNwbSkgPT0KIAkJCSAgICBIRFNQTV9BVVRPU1lOQ19GUk9NX05PTkUpIHsKIAotCQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJIRFNQTTogIgotCQkJCQkgICAiRGV0ZWN0ZWQgbm8gRXh0ZXJuZWwgU3luYyBcbiIpOworCQkJCWRldl93YXJuKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkJCSAiRGV0ZWN0ZWQgbm8gRXh0ZXJuZWwgU3luY1xuIik7CiAJCQkJbm90X3NldCA9IDE7CiAKIAkJCX0gZWxzZSBpZiAocmF0ZSAhPSBleHRlcm5hbF9mcmVxKSB7CiAKLQkJCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiSERTUE06ICIKLQkJCQkJICAgIldhcm5pbmc6IE5vIEF1dG9TeW5jIHNvdXJjZSBmb3IgIgotCQkJCQkgICAicmVxdWVzdGVkIHJhdGVcbiIpOworCQkJCWRldl93YXJuKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkJCSAiV2FybmluZzogTm8gQXV0b1N5bmMgc291cmNlIGZvciByZXF1ZXN0ZWQgcmF0ZVxuIik7CiAJCQkJbm90X3NldCA9IDE7CiAJCQl9CiAJCX0KQEAgLTE3MzgsMTMgKzE3MzYsMTEgQEAKIAogCWlmIChjdXJyZW50X3NwZWVkICE9IHRhcmdldF9zcGVlZAogCSAgICAmJiAoaGRzcG0tPmNhcHR1cmVfcGlkID49IDAgfHwgaGRzcG0tPnBsYXliYWNrX3BpZCA+PSAwKSkgewotCQlzbmRfcHJpbnRrCi0JCSAgICAoS0VSTl9FUlIgIkhEU1BNOiAiCi0JCSAgICAgImNhbm5vdCBjaGFuZ2UgZnJvbSAlcyBzcGVlZCB0byAlcyBzcGVlZCBtb2RlICIKLQkJICAgICAiKGNhcHR1cmUgUElEID0gJWQsIHBsYXliYWNrIFBJRCA9ICVkKVxuIiwKLQkJICAgICBoZHNwbV9zcGVlZF9uYW1lc1tjdXJyZW50X3NwZWVkXSwKLQkJICAgICBoZHNwbV9zcGVlZF9uYW1lc1t0YXJnZXRfc3BlZWRdLAotCQkgICAgIGhkc3BtLT5jYXB0dXJlX3BpZCwgaGRzcG0tPnBsYXliYWNrX3BpZCk7CisJCWRldl9lcnIoaGRzcG0tPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgY2hhbmdlIGZyb20gJXMgc3BlZWQgdG8gJXMgc3BlZWQgbW9kZSAoY2FwdHVyZSBQSUQgPSAlZCwgcGxheWJhY2sgUElEID0gJWQpXG4iLAorCQkJaGRzcG1fc3BlZWRfbmFtZXNbY3VycmVudF9zcGVlZF0sCisJCQloZHNwbV9zcGVlZF9uYW1lc1t0YXJnZXRfc3BlZWRdLAorCQkJaGRzcG0tPmNhcHR1cmVfcGlkLCBoZHNwbS0+cGxheWJhY2tfcGlkKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTU0NDYsNyArNTQ0Miw3IEBACiAJICogICAgICAgICAgMCAgICAgICAgIDY0ICAgICB+Mzk5ODIzMSAgICAgICB+ODE5MTU1OAogCSAqKi8KIAkvKgotCSAgIHNuZF9wcmludGsoS0VSTl9JTkZPICJzbmRfaGRzcG1faW50ZXJydXB0ICVsbHUgQCAlbGx4XG4iLAorCSAgZGV2X2luZm8oaGRzcG0tPmNhcmQtPmRldiwgInNuZF9oZHNwbV9pbnRlcnJ1cHQgJWxsdSBAICVsbHhcbiIsCiAJICAgbm93LWhkc3BtLT5sYXN0X2ludGVycnVwdCwgc3RhdHVzICYgMHhGRkMwKTsKIAkgICBoZHNwbS0+bGFzdF9pbnRlcnJ1cHQgPSBub3c7CiAJKi8KQEAgLTU1ODMsNyArNTU3OSw3IEBACiAJc3Bpbl9sb2NrX2lycSgmaGRzcG0tPmxvY2spOwogCWVyciA9IGhkc3BtX3NldF9yYXRlKGhkc3BtLCBwYXJhbXNfcmF0ZShwYXJhbXMpLCAwKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZXJyIG9uIGhkc3BtX3NldF9yYXRlOiAlZFxuIiwgZXJyKTsKKwkJZGV2X2luZm8oaGRzcG0tPmNhcmQtPmRldiwgImVyciBvbiBoZHNwbV9zZXRfcmF0ZTogJWRcbiIsIGVycik7CiAJCXNwaW5fdW5sb2NrX2lycSgmaGRzcG0tPmxvY2spOwogCQlfc25kX3BjbV9od19wYXJhbV9zZXRlbXB0eShwYXJhbXMsCiAJCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOwpAQCAtNTU5NCw3ICs1NTkwLDggQEAKIAllcnIgPSBoZHNwbV9zZXRfaW50ZXJydXB0X2ludGVydmFsKGhkc3BtLAogCQkJcGFyYW1zX3BlcmlvZF9zaXplKHBhcmFtcykpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJlcnIgb24gaGRzcG1fc2V0X2ludGVycnVwdF9pbnRlcnZhbDogJWRcbiIsIGVycik7CisJCWRldl9pbmZvKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkgImVyciBvbiBoZHNwbV9zZXRfaW50ZXJydXB0X2ludGVydmFsOiAlZFxuIiwgZXJyKTsKIAkJX3NuZF9wY21faHdfcGFyYW1fc2V0ZW1wdHkocGFyYW1zLAogCQkJCVNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfU0laRSk7CiAJCXJldHVybiBlcnI7CkBAIC01NjEwLDcgKzU2MDcsOCBAQAogCWVyciA9CiAJCXNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIEhEU1BNX0RNQV9BUkVBX0JZVEVTKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZXJyIG9uIHNuZF9wY21fbGliX21hbGxvY19wYWdlczogJWRcbiIsIGVycik7CisJCWRldl9pbmZvKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkgImVyciBvbiBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXM6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNTYyNCw3ICs1NjIyLDggQEAKIAogCQloZHNwbS0+cGxheWJhY2tfYnVmZmVyID0KIAkJCSh1bnNpZ25lZCBjaGFyICopIHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWE7Ci0JCXNuZF9wcmludGRkKCJBbGxvY2F0ZWQgc2FtcGxlIGJ1ZmZlciBmb3IgcGxheWJhY2sgYXQgJXBcbiIsCisJCWRldl9kYmcoaGRzcG0tPmNhcmQtPmRldiwKKwkJCSJBbGxvY2F0ZWQgc2FtcGxlIGJ1ZmZlciBmb3IgcGxheWJhY2sgYXQgJXBcbiIsCiAJCQkJaGRzcG0tPnBsYXliYWNrX2J1ZmZlcik7CiAJfSBlbHNlIHsKIAkJaGRzcG1fc2V0X3NnYnVmKGhkc3BtLCBzdWJzdHJlYW0sIEhEU1BNX3BhZ2VBZGRyZXNzQnVmZmVySW4sCkBAIC01NjM1LDE4ICs1NjM0LDIxIEBACiAKIAkJaGRzcG0tPmNhcHR1cmVfYnVmZmVyID0KIAkJCSh1bnNpZ25lZCBjaGFyICopIHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWE7Ci0JCXNuZF9wcmludGRkKCJBbGxvY2F0ZWQgc2FtcGxlIGJ1ZmZlciBmb3IgY2FwdHVyZSBhdCAlcFxuIiwKKwkJZGV2X2RiZyhoZHNwbS0+Y2FyZC0+ZGV2LAorCQkJIkFsbG9jYXRlZCBzYW1wbGUgYnVmZmVyIGZvciBjYXB0dXJlIGF0ICVwXG4iLAogCQkJCWhkc3BtLT5jYXB0dXJlX2J1ZmZlcik7CiAJfQogCiAJLyoKLQkgICBzbmRfcHJpbnRkZCgiQWxsb2NhdGVkIHNhbXBsZSBidWZmZXIgZm9yICVzIGF0IDB4JTA4WFxuIiwKKwkgICBkZXZfZGJnKGhkc3BtLT5jYXJkLT5kZXYsCisJICAgIkFsbG9jYXRlZCBzYW1wbGUgYnVmZmVyIGZvciAlcyBhdCAweCUwOFhcbiIsCiAJICAgc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/CiAJICAgInBsYXliYWNrIiA6ICJjYXB0dXJlIiwKIAkgICBzbmRfcGNtX3NnYnVmX2dldF9hZGRyKHN1YnN0cmVhbSwgMCkpOwogCSAgICovCiAJLyoKLQkgICBzbmRfcHJpbnRkZCgic2V0X2h3cGFyYW1zOiAlcyAlZCBIeiwgJWQgY2hhbm5lbHMsIGJzID0gJWRcbiIsCisJICAgZGV2X2RiZyhoZHNwbS0+Y2FyZC0+ZGV2LAorCSAgICJzZXRfaHdwYXJhbXM6ICVzICVkIEh6LCAlZCBjaGFubmVscywgYnMgPSAlZFxuIiwKIAkgICBzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8KIAkgICAicGxheWJhY2siIDogImNhcHR1cmUiLAogCSAgIHBhcmFtc19yYXRlKHBhcmFtcyksIHBhcmFtc19jaGFubmVscyhwYXJhbXMpLApAQCAtNTY2NywxMiArNTY2OSwxNCBAQAogCS8qIFN3aXRjaCB0byBuYXRpdmUgZmxvYXQgZm9ybWF0IGlmIHJlcXVlc3RlZCAqLwogCWlmIChTTkRSVl9QQ01fRk9STUFUX0ZMT0FUX0xFID09IHBhcmFtc19mb3JtYXQocGFyYW1zKSkgewogCQlpZiAoIShoZHNwbS0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BlX0ZMT0FUX0ZPUk1BVCkpCi0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiaGRzcG06IFN3aXRjaGluZyB0byBuYXRpdmUgMzJiaXQgTEUgZmxvYXQgZm9ybWF0LlxuIik7CisJCQlkZXZfaW5mbyhoZHNwbS0+Y2FyZC0+ZGV2LAorCQkJCSAiU3dpdGNoaW5nIHRvIG5hdGl2ZSAzMmJpdCBMRSBmbG9hdCBmb3JtYXQuXG4iKTsKIAogCQloZHNwbS0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQZV9GTE9BVF9GT1JNQVQ7CiAJfSBlbHNlIGlmIChTTkRSVl9QQ01fRk9STUFUX1MzMl9MRSA9PSBwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKIAkJaWYgKGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUGVfRkxPQVRfRk9STUFUKQotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gImhkc3BtOiBTd2l0Y2hpbmcgdG8gbmF0aXZlIDMyYml0IExFIGludGVnZXIgZm9ybWF0LlxuIik7CisJCQlkZXZfaW5mbyhoZHNwbS0+Y2FyZC0+ZGV2LAorCQkJCSAiU3dpdGNoaW5nIHRvIG5hdGl2ZSAzMmJpdCBMRSBpbnRlZ2VyIGZvcm1hdC5cbiIpOwogCiAJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICY9IH5IRFNQZV9GTE9BVF9GT1JNQVQ7CiAJfQpAQCAtNTcxNSwxMiArNTcxOSwxNiBAQAogCiAJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKIAkJaWYgKHNuZF9CVUdfT04oaW5mby0+Y2hhbm5lbCA+PSBoZHNwbS0+bWF4X2NoYW5uZWxzX291dCkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJzbmRfaGRzcG1fY2hhbm5lbF9pbmZvOiBvdXRwdXQgY2hhbm5lbCBvdXQgb2YgcmFuZ2UgKCVkKVxuIiwgaW5mby0+Y2hhbm5lbCk7CisJCQlkZXZfaW5mbyhoZHNwbS0+Y2FyZC0+ZGV2LAorCQkJCSAic25kX2hkc3BtX2NoYW5uZWxfaW5mbzogb3V0cHV0IGNoYW5uZWwgb3V0IG9mIHJhbmdlICglZClcbiIsCisJCQkJIGluZm8tPmNoYW5uZWwpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAogCQlpZiAoaGRzcG0tPmNoYW5uZWxfbWFwX291dFtpbmZvLT5jaGFubmVsXSA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJzbmRfaGRzcG1fY2hhbm5lbF9pbmZvOiBvdXRwdXQgY2hhbm5lbCAlZCBtYXBwZWQgb3V0XG4iLCBpbmZvLT5jaGFubmVsKTsKKwkJCWRldl9pbmZvKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkJICJzbmRfaGRzcG1fY2hhbm5lbF9pbmZvOiBvdXRwdXQgY2hhbm5lbCAlZCBtYXBwZWQgb3V0XG4iLAorCQkJCSBpbmZvLT5jaGFubmVsKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTU3MjgsMTIgKzU3MzYsMTYgQEAKIAkJCUhEU1BNX0NIQU5ORUxfQlVGRkVSX0JZVEVTOwogCX0gZWxzZSB7CiAJCWlmIChzbmRfQlVHX09OKGluZm8tPmNoYW5uZWwgPj0gaGRzcG0tPm1heF9jaGFubmVsc19pbikpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJzbmRfaGRzcG1fY2hhbm5lbF9pbmZvOiBpbnB1dCBjaGFubmVsIG91dCBvZiByYW5nZSAoJWQpXG4iLCBpbmZvLT5jaGFubmVsKTsKKwkJCWRldl9pbmZvKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkJICJzbmRfaGRzcG1fY2hhbm5lbF9pbmZvOiBpbnB1dCBjaGFubmVsIG91dCBvZiByYW5nZSAoJWQpXG4iLAorCQkJCSBpbmZvLT5jaGFubmVsKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKIAkJaWYgKGhkc3BtLT5jaGFubmVsX21hcF9pbltpbmZvLT5jaGFubmVsXSA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJzbmRfaGRzcG1fY2hhbm5lbF9pbmZvOiBpbnB1dCBjaGFubmVsICVkIG1hcHBlZCBvdXRcbiIsIGluZm8tPmNoYW5uZWwpOworCQkJZGV2X2luZm8oaGRzcG0tPmNhcmQtPmRldiwKKwkJCQkgInNuZF9oZHNwbV9jaGFubmVsX2luZm86IGlucHV0IGNoYW5uZWwgJWQgbWFwcGVkIG91dFxuIiwKKwkJCQkgaW5mby0+Y2hhbm5lbCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC02MjgzLDcgKzYyOTUsNyBAQAogCiAJCXMgPSBjb3B5X3RvX3VzZXIoYXJncCwgbGV2ZWxzLCBzaXplb2Yoc3RydWN0IGhkc3BtX3BlYWtfcm1zKSk7CiAJCWlmICgwICE9IHMpIHsKLQkJCS8qIHNuZF9wcmludGsoS0VSTl9FUlIgImNvcHlfdG9fdXNlciguLiwgLi4sICVsdSk6ICVsdQorCQkJLyogZGV2X2VycihoZHNwbS0+Y2FyZC0+ZGV2LCAiY29weV90b191c2VyKC4uLCAuLiwgJWx1KTogJWx1CiAJCQkgW0xldmVsc11cbiIsIHNpemVvZihzdHJ1Y3QgaGRzcG1fcGVha19ybXMpLCBzKTsKIAkJCSAqLwogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC02MzI5LDcgKzYzNDEsNyBAQAogCQlzID0gY29weV90b191c2VyKGFyZ3AsICZsdGMsIHNpemVvZihzdHJ1Y3QgaGRzcG1fbHRjKSk7CiAJCWlmICgwICE9IHMpIHsKIAkJCS8qCi0JCQkgc25kX3ByaW50ayhLRVJOX0VSUiAiY29weV90b191c2VyKC4uLCAuLiwgJWx1KTogJWx1IFtMVENdXG4iLCBzaXplb2Yoc3RydWN0IGhkc3BtX2x0YyksIHMpOyAqLworCQkJICBkZXZfZXJyKGhkc3BtLT5jYXJkLT5kZXYsICJjb3B5X3RvX3VzZXIoLi4sIC4uLCAlbHUpOiAlbHUgW0xUQ11cbiIsIHNpemVvZihzdHJ1Y3QgaGRzcG1fbHRjKSwgcyk7ICovCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCkBAIC02NDk0LDExICs2NTA2LDEzIEBACiAJCQkJCQkgICB3YW50ZWQsCiAJCQkJCQkgICB3YW50ZWQpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGRkKCJDb3VsZCBub3QgcHJlYWxsb2NhdGUgJXpkIEJ5dGVzXG4iLCB3YW50ZWQpOworCQlkZXZfZGJnKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkiQ291bGQgbm90IHByZWFsbG9jYXRlICV6ZCBCeXRlc1xuIiwgd2FudGVkKTsKIAogCQlyZXR1cm4gZXJyOwogCX0gZWxzZQotCQlzbmRfcHJpbnRkZCgiIFByZWFsbG9jYXRlZCAlemQgQnl0ZXNcbiIsIHdhbnRlZCk7CisJCWRldl9kYmcoaGRzcG0tPmNhcmQtPmRldiwKKwkJCSIgUHJlYWxsb2NhdGVkICV6ZCBCeXRlc1xuIiwgd2FudGVkKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjU1OSw3ICs2NTczLDcgQEAKIHsKIAlpbnQgZXJyLCBpOwogCi0Jc25kX3ByaW50ZGQoIkNyZWF0ZSBjYXJkLi4uXG4iKTsKKwlkZXZfZGJnKGNhcmQtPmRldiwgIkNyZWF0ZSBjYXJkLi4uXG4iKTsKIAllcnIgPSBzbmRfaGRzcG1fY3JlYXRlX3BjbShjYXJkLCBoZHNwbSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CkBAIC02NTgxLDcgKzY1OTUsNyBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0Jc25kX3ByaW50ZGQoInByb2MgaW5pdC4uLlxuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJwcm9jIGluaXQuLi5cbiIpOwogCXNuZF9oZHNwbV9wcm9jX2luaXQoaGRzcG0pOwogCiAJaGRzcG0tPnN5c3RlbV9zYW1wbGVfcmF0ZSA9IC0xOwpAQCAtNjU5MiwyMyArNjYwNiwyMyBAQAogCWhkc3BtLT5jYXB0dXJlX3N1YnN0cmVhbSA9IE5VTEw7CiAJaGRzcG0tPnBsYXliYWNrX3N1YnN0cmVhbSA9IE5VTEw7CiAKLQlzbmRfcHJpbnRkZCgiU2V0IGRlZmF1bHRzLi4uXG4iKTsKKwlkZXZfZGJnKGNhcmQtPmRldiwgIlNldCBkZWZhdWx0cy4uLlxuIik7CiAJZXJyID0gc25kX2hkc3BtX3NldF9kZWZhdWx0cyhoZHNwbSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlzbmRfcHJpbnRkZCgiVXBkYXRlIG1peGVyIGNvbnRyb2xzLi4uXG4iKTsKKwlkZXZfZGJnKGNhcmQtPmRldiwgIlVwZGF0ZSBtaXhlciBjb250cm9scy4uLlxuIik7CiAJaGRzcG1fdXBkYXRlX3NpbXBsZV9taXhlcl9jb250cm9scyhoZHNwbSk7CiAKLQlzbmRfcHJpbnRkZCgiSW5pdGlhbGl6ZWluZyBjb21wbGV0ZSA/Pz9cbiIpOworCWRldl9kYmcoY2FyZC0+ZGV2LCAiSW5pdGlhbGl6ZWluZyBjb21wbGV0ZSA/Pz9cbiIpOwogCiAJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSERTUE06IGVycm9yIHJlZ2lzdGVyaW5nIGNhcmRcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImVycm9yIHJlZ2lzdGVyaW5nIGNhcmRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9wcmludGRkKCIuLi4geWVzIG5vd1xuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICIuLi4geWVzIG5vd1xuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY2NjIsOCArNjY3Niw4IEBACiAJCQloZHNwbS0+Y2FyZF9uYW1lID0gIlJNRSBNQURJIjsKIAkJCWhkc3BtLT5taWRpUG9ydHMgPSAzOwogCQl9IGVsc2UgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUgotCQkJCSJIRFNQTTogdW5rbm93biBmaXJtd2FyZSByZXZpc2lvbiAleFxuIiwKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCSJ1bmtub3duIGZpcm13YXJlIHJldmlzaW9uICV4XG4iLAogCQkJCWhkc3BtLT5maXJtd2FyZV9yZXYpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KQEAgLTY2ODIsMzYgKzY2OTYsMzUgQEAKIAloZHNwbS0+cG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOwogCWlvX2V4dGVudCA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpLCAwKTsKIAotCXNuZF9wcmludGRkKCJncmFiYmVkIG1lbW9yeSByZWdpb24gMHglbHgtMHglbHhcbiIsCisJZGV2X2RiZyhjYXJkLT5kZXYsICJncmFiYmVkIG1lbW9yeSByZWdpb24gMHglbHgtMHglbHhcbiIsCiAJCQloZHNwbS0+cG9ydCwgaGRzcG0tPnBvcnQgKyBpb19leHRlbnQgLSAxKTsKIAogCWhkc3BtLT5pb2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUoaGRzcG0tPnBvcnQsIGlvX2V4dGVudCk7CiAJaWYgKCFoZHNwbS0+aW9iYXNlKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkhEU1BNOiAiCi0JCQkJInVuYWJsZSB0byByZW1hcCByZWdpb24gMHglbHgtMHglbHhcbiIsCisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIHJlbWFwIHJlZ2lvbiAweCVseC0weCVseFxuIiwKIAkJCQloZHNwbS0+cG9ydCwgaGRzcG0tPnBvcnQgKyBpb19leHRlbnQgLSAxKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9Ci0Jc25kX3ByaW50ZGQoInJlbWFwcGVkIHJlZ2lvbiAoMHglbHgpIDB4JWx4LTB4JWx4XG4iLAorCWRldl9kYmcoY2FyZC0+ZGV2LCAicmVtYXBwZWQgcmVnaW9uICgweCVseCkgMHglbHgtMHglbHhcbiIsCiAJCQkodW5zaWduZWQgbG9uZyloZHNwbS0+aW9iYXNlLCBoZHNwbS0+cG9ydCwKIAkJCWhkc3BtLT5wb3J0ICsgaW9fZXh0ZW50IC0gMSk7CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9oZHNwbV9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGhkc3BtKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIRFNQTTogdW5hYmxlIHRvIHVzZSBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gdXNlIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCXNuZF9wcmludGRkKCJ1c2UgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJ1c2UgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAKIAloZHNwbS0+aXJxID0gcGNpLT5pcnE7CiAKLQlzbmRfcHJpbnRkZCgia21hbGxvYyBNaXhlciBtZW1vcnkgb2YgJXpkIEJ5dGVzXG4iLAorCWRldl9kYmcoY2FyZC0+ZGV2LCAia21hbGxvYyBNaXhlciBtZW1vcnkgb2YgJXpkIEJ5dGVzXG4iLAogCQkJc2l6ZW9mKHN0cnVjdCBoZHNwbV9taXhlcikpOwogCWhkc3BtLT5taXhlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoZHNwbV9taXhlciksIEdGUF9LRVJORUwpOwogCWlmICghaGRzcG0tPm1peGVyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkhEU1BNOiAiCi0JCQkJInVuYWJsZSB0byBrbWFsbG9jIE1peGVyIG1lbW9yeSBvZiAlZCBCeXRlc1xuIiwKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkidW5hYmxlIHRvIGttYWxsb2MgTWl4ZXIgbWVtb3J5IG9mICVkIEJ5dGVzXG4iLAogCQkJCShpbnQpc2l6ZW9mKHN0cnVjdCBoZHNwbV9taXhlcikpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC02NzgwLDE0ICs2NzkzLDE0IEBACiAJCWhkc3BtLT5xc19vdXRfY2hhbm5lbHMgPSBBSU9fT1VUX1FTX0NIQU5ORUxTOwogCiAJCWlmICgwID09IChoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9zdGF0dXNSZWdpc3RlcjIpICYgSERTUE1fczJfQUVCSV9EKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhEU1BNOiBBRUIgaW5wdXQgYm9hcmQgZm91bmRcbiIpOworCQkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiQUVCIGlucHV0IGJvYXJkIGZvdW5kXG4iKTsKIAkJCWhkc3BtLT5zc19pbl9jaGFubmVscyArPSA0OwogCQkJaGRzcG0tPmRzX2luX2NoYW5uZWxzICs9IDQ7CiAJCQloZHNwbS0+cXNfaW5fY2hhbm5lbHMgKz0gNDsKIAkJfQogCiAJCWlmICgwID09IChoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9zdGF0dXNSZWdpc3RlcjIpICYgSERTUE1fczJfQUVCT19EKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhEU1BNOiBBRUIgb3V0cHV0IGJvYXJkIGZvdW5kXG4iKTsKKwkJCWRldl9pbmZvKGNhcmQtPmRldiwgIkFFQiBvdXRwdXQgYm9hcmQgZm91bmRcbiIpOwogCQkJaGRzcG0tPnNzX291dF9jaGFubmVscyArPSA0OwogCQkJaGRzcG0tPmRzX291dF9jaGFubmVscyArPSA0OwogCQkJaGRzcG0tPnFzX291dF9jaGFubmVscyArPSA0OwpAQCAtNjg1NCw3ICs2ODY3LDcgQEAKIAkJCWlmIChOVUxMICE9IGhkc3BtLT50Y28pIHsKIAkJCQloZHNwbV90Y29fd3JpdGUoaGRzcG0pOwogCQkJfQotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhEU1BNOiBBSU8vUmF5REFUIFRDTyBtb2R1bGUgZm91bmRcbiIpOworCQkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiQUlPL1JheURBVCBUQ08gbW9kdWxlIGZvdW5kXG4iKTsKIAkJfSBlbHNlIHsKIAkJCWhkc3BtLT50Y28gPSBOVUxMOwogCQl9CkBAIC02ODY5LDcgKzY4ODIsNyBAQAogCQkJaWYgKE5VTEwgIT0gaGRzcG0tPnRjbykgewogCQkJCWhkc3BtX3Rjb193cml0ZShoZHNwbSk7CiAJCQl9Ci0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiSERTUE06IE1BREkvQUVTIFRDTyBtb2R1bGUgZm91bmRcbiIpOworCQkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiTUFESS9BRVMgVENPIG1vZHVsZSBmb3VuZFxuIik7CiAJCX0gZWxzZSB7CiAJCQloZHNwbS0+dGNvID0gTlVMTDsKIAkJfQpAQCAtNjk1MSw3ICs2OTY0LDcgQEAKIAkJfQogCX0KIAotCXNuZF9wcmludGRkKCJjcmVhdGUgYWxzYSBkZXZpY2VzLlxuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJjcmVhdGUgYWxzYSBkZXZpY2VzLlxuIik7CiAJZXJyID0gc25kX2hkc3BtX2NyZWF0ZV9hbHNhX2RldmljZXMoY2FyZCwgaGRzcG0pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtNzAxNiw4ICs3MDI5LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sCi0JCQlUSElTX01PRFVMRSwgc2l6ZW9mKHN0cnVjdCBoZHNwbSksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLAorCQkJICAgVEhJU19NT0RVTEUsIHNpemVvZihzdHJ1Y3QgaGRzcG0pLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTcwMjYsOCArNzAzOSw2IEBACiAJaGRzcG0tPmRldiA9IGRldjsKIAloZHNwbS0+cGNpID0gcGNpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJZXJyID0gc25kX2hkc3BtX2NyZWF0ZShjYXJkLCBoZHNwbSk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYyBiL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYwppbmRleCAxNTAzZWUzLi4xZDliZTkwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTY1Mi9ybWU5NjUyLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvcm1lOTY1Mi5jCkBAIC0zOTQsNyArMzk0LDkgQEAKIAlpZiAob2Zmc2V0IDwgcGVyaW9kX3NpemUpIHsKIAkJaWYgKG9mZnNldCA+IHJtZTk2NTItPm1heF9qaXR0ZXIpIHsKIAkJCWlmIChmcmFnKQotCQkJCXByaW50ayhLRVJOX0VSUiAiVW5leHBlY3RlZCBod19wb2ludGVyIHBvc2l0aW9uIChidWZpZCA9PSAwKTogc3RhdHVzOiAleCBvZmZzZXQ6ICVkXG4iLCBzdGF0dXMsIG9mZnNldCk7CisJCQkJZGV2X2VycihybWU5NjUyLT5jYXJkLT5kZXYsCisJCQkJCSJVbmV4cGVjdGVkIGh3X3BvaW50ZXIgcG9zaXRpb24gKGJ1ZmlkID09IDApOiBzdGF0dXM6ICV4IG9mZnNldDogJWRcbiIsCisJCQkJCXN0YXR1cywgb2Zmc2V0KTsKIAkJfSBlbHNlIGlmICghZnJhZykKIAkJCXJldHVybiAwOwogCQlvZmZzZXQgLT0gcm1lOTY1Mi0+bWF4X2ppdHRlcjsKQEAgLTQwMyw3ICs0MDUsOSBAQAogCX0gZWxzZSB7CiAJCWlmIChvZmZzZXQgPiBwZXJpb2Rfc2l6ZSArIHJtZTk2NTItPm1heF9qaXR0ZXIpIHsKIAkJCWlmICghZnJhZykKLQkJCQlwcmludGsoS0VSTl9FUlIgIlVuZXhwZWN0ZWQgaHdfcG9pbnRlciBwb3NpdGlvbiAoYnVmaWQgPT0gMSk6IHN0YXR1czogJXggb2Zmc2V0OiAlZFxuIiwgc3RhdHVzLCBvZmZzZXQpOworCQkJCWRldl9lcnIocm1lOTY1Mi0+Y2FyZC0+ZGV2LAorCQkJCQkiVW5leHBlY3RlZCBod19wb2ludGVyIHBvc2l0aW9uIChidWZpZCA9PSAxKTogc3RhdHVzOiAleCBvZmZzZXQ6ICVkXG4iLAorCQkJCQlzdGF0dXMsIG9mZnNldCk7CiAJCX0gZWxzZSBpZiAoZnJhZykKIAkJCXJldHVybiBwZXJpb2Rfc2l6ZTsKIAkJb2Zmc2V0IC09IHJtZTk2NTItPm1heF9qaXR0ZXI7CkBAIC03NjksNyArNzczLDggQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlczogdW5rbm93biBTL1BESUYgaW5wdXQgcmF0ZSAoYml0cyA9IDB4JXgpXG4iLAorCQlkZXZfZXJyKHMtPmNhcmQtPmRldiwKKwkJCSIlczogdW5rbm93biBTL1BESUYgaW5wdXQgcmF0ZSAoYml0cyA9IDB4JXgpXG4iLAogCQkJICAgcy0+Y2FyZF9uYW1lLCByYXRlX2JpdHMpOwogCQlyZXR1cm4gMDsKIAkJYnJlYWs7CkBAIC0xNzkwLDcgKzE3OTUsOCBAQAogCSAgICBzbmRfaGFtbWVyZmFsbF9nZXRfYnVmZmVyKHJtZTk2NTItPnBjaSwgJnJtZTk2NTItPnBsYXliYWNrX2RtYV9idWYsIFJNRTk2NTJfRE1BX0FSRUFfQllURVMpIDwgMCkgewogCQlpZiAocm1lOTY1Mi0+Y2FwdHVyZV9kbWFfYnVmLmFyZWEpCiAJCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJnJtZTk2NTItPmNhcHR1cmVfZG1hX2J1Zik7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIGJ1ZmZlcnMgYXZhaWxhYmxlXG4iLCBybWU5NjUyLT5jYXJkX25hbWUpOworCQlkZXZfZXJyKHJtZTk2NTItPmNhcmQtPmRldiwKKwkJCSIlczogbm8gYnVmZmVycyBhdmFpbGFibGVcbiIsIHJtZTk2NTItPmNhcmRfbmFtZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMjQ2OCwxMyArMjQ3NCwxNCBAQAogCXJtZTk2NTItPnBvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKIAlybWU5NjUyLT5pb2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUocm1lOTY1Mi0+cG9ydCwgUk1FOTY1Ml9JT19FWFRFTlQpOwogCWlmIChybWU5NjUyLT5pb2Jhc2UgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVtYXAgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLCBybWU5NjUyLT5wb3J0LCBybWU5NjUyLT5wb3J0ICsgUk1FOTY1Ml9JT19FWFRFTlQgLSAxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gcmVtYXAgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLAorCQkJcm1lOTY1Mi0+cG9ydCwgcm1lOTY1Mi0+cG9ydCArIFJNRTk2NTJfSU9fRVhURU5UIC0gMSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCQogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX3JtZTk2NTJfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBybWU5NjUyKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVxdWVzdCBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gcmVxdWVzdCBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJcm1lOTY1Mi0+aXJxID0gcGNpLT5pcnE7CkBAIC0yNTg3LDggKzI1OTQsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9ybWU5NjUyKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfcm1lOTY1MiksICZjYXJkKTsKIAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtMjU5Nyw3ICsyNjA0LDYgQEAKIAljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfcm1lOTY1Ml9jYXJkX2ZyZWU7CiAJcm1lOTY1Mi0+ZGV2ID0gZGV2OwogCXJtZTk2NTItPnBjaSA9IHBjaTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CiAKIAlpZiAoKGVyciA9IHNuZF9ybWU5NjUyX2NyZWF0ZShjYXJkLCBybWU5NjUyLCBwcmVjaXNlX3B0cltkZXZdKSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvc2lzNzAxOS5jIGIvc291bmQvcGNpL3NpczcwMTkuYwppbmRleCBlNDEzYjRlLi42YjI2YjkzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvc2lzNzAxOS5jCisrKyBiL3NvdW5kL3BjaS9zaXM3MDE5LmMKQEAgLTE0MDQsOCArMTQwNCw2IEBACiAJaWYgKHJjKQogCQlnb3RvIGVycm9yX291dF9jbGVhbnVwOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJcmV0dXJuIDA7CiAKIGVycm9yX291dF9jbGVhbnVwOgpAQCAtMTQ0MCw3ICsxNDM4LDggQEAKIAlpZiAoIWNvZGVjcykKIAkJY29kZWNzID0gU0lTX1BSSU1BUllfQ09ERUNfUFJFU0VOVDsKIAotCXJjID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIHNpemVvZigqc2lzKSwgJmNhcmQpOworCXJjID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwKKwkJCSAgc2l6ZW9mKCpzaXMpLCAmY2FyZCk7CiAJaWYgKHJjIDwgMCkKIAkJZ290byBlcnJvcl9vdXQ7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9zb25pY3ZpYmVzLmMgYi9zb3VuZC9wY2kvc29uaWN2aWJlcy5jCmluZGV4IDJhNDZiZjkuLjIwNDRkYzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9zb25pY3ZpYmVzLmMKKysrIGIvc291bmQvcGNpL3NvbmljdmliZXMuYwpAQCAtMjczLDcgKzI3Myw3IEBACiAJb3V0bChjb3VudCwgc29uaWMtPmRtYWFfcG9ydCArIFNWX0RNQV9DT1VOVDApOwogCW91dGIoMHgxOCwgc29uaWMtPmRtYWFfcG9ydCArIFNWX0RNQV9NT0RFKTsKICNpZiAwCi0JcHJpbnRrKEtFUk5fREVCVUcgInByb2dyYW0gZG1hYTogYWRkciA9IDB4JXgsIHBhZGRyID0gMHgleFxuIiwKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsICJwcm9ncmFtIGRtYWE6IGFkZHIgPSAweCV4LCBwYWRkciA9IDB4JXhcbiIsCiAJICAgICAgIGFkZHIsIGlubChzb25pYy0+ZG1hYV9wb3J0ICsgU1ZfRE1BX0FERFIwKSk7CiAjZW5kaWYKIH0KQEAgLTI4OSw3ICsyODksNyBAQAogCW91dGwoY291bnQsIHNvbmljLT5kbWFjX3BvcnQgKyBTVl9ETUFfQ09VTlQwKTsKIAlvdXRiKDB4MTQsIHNvbmljLT5kbWFjX3BvcnQgKyBTVl9ETUFfTU9ERSk7CiAjaWYgMAotCXByaW50ayhLRVJOX0RFQlVHICJwcm9ncmFtIGRtYWM6IGFkZHIgPSAweCV4LCBwYWRkciA9IDB4JXhcbiIsCisJZGV2X2RiZyhzb25pYy0+Y2FyZC0+ZGV2LCAicHJvZ3JhbSBkbWFjOiBhZGRyID0gMHgleCwgcGFkZHIgPSAweCV4XG4iLAogCSAgICAgICBhZGRyLCBpbmwoc29uaWMtPmRtYWNfcG9ydCArIFNWX0RNQV9BRERSMCkpOwogI2VuZGlmCiB9CkBAIC0zNTcsMTA1ICszNTcsMTA1IEBACiAjaWYgMAogc3RhdGljIHZvaWQgc25kX3NvbmljdmliZXNfZGVidWcoc3RydWN0IHNvbmljdmliZXMgKiBzb25pYykKIHsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiU1YgUkVHUzogICAgICAgICAgSU5ERVggPSAweCUwMnggICIsIGluYihTVl9SRUcoc29uaWMsIElOREVYKSkpOwotCXByaW50aygiICAgICAgICAgICAgICAgICBTVEFUVVMgPSAweCUwMnhcbiIsIGluYihTVl9SRUcoc29uaWMsIFNUQVRVUykpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDAwOiBsZWZ0IGlucHV0ICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAwKSk7Ci0JcHJpbnRrKCIgIDB4MjA6IHN5bnRoIHJhdGUgbG93ICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjApKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDAxOiByaWdodCBpbnB1dCAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAxKSk7Ci0JcHJpbnRrKCIgIDB4MjE6IHN5bnRoIHJhdGUgaGlnaCA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjEpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDAyOiBsZWZ0IEFVWDEgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAyKSk7Ci0JcHJpbnRrKCIgIDB4MjI6IEFEQyBjbG9jayAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjIpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDAzOiByaWdodCBBVVgxICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAzKSk7Ci0JcHJpbnRrKCIgIDB4MjM6IEFEQyBhbHQgcmF0ZSAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjMpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDA0OiBsZWZ0IENEICAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA0KSk7Ci0JcHJpbnRrKCIgIDB4MjQ6IEFEQyBwbGwgTSAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjQpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDA1OiByaWdodCBDRCAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA1KSk7Ci0JcHJpbnRrKCIgIDB4MjU6IEFEQyBwbGwgTiAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjUpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDA2OiBsZWZ0IGxpbmUgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA2KSk7Ci0JcHJpbnRrKCIgIDB4MjY6IFN5bnRoIHBsbCBNICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjYpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDA3OiByaWdodCBsaW5lICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA3KSk7Ci0JcHJpbnRrKCIgIDB4Mjc6IFN5bnRoIHBsbCBOICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjcpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDA4OiBNSUMgICAgICAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA4KSk7Ci0JcHJpbnRrKCIgIDB4Mjg6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjgpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDA5OiBHYW1lIHBvcnQgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA5KSk7Ci0JcHJpbnRrKCIgIDB4Mjk6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjkpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDBhOiBsZWZ0IHN5bnRoICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBhKSk7Ci0JcHJpbnRrKCIgIDB4MmE6IE1QVTQwMSAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmEpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDBiOiByaWdodCBzeW50aCAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBiKSk7Ci0JcHJpbnRrKCIgIDB4MmI6IGRyaXZlIGN0cmwgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmIpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDBjOiBsZWZ0IEFVWDIgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBjKSk7Ci0JcHJpbnRrKCIgIDB4MmM6IFNSUyBzcGFjZSAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmMpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDBkOiByaWdodCBBVVgyICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBkKSk7Ci0JcHJpbnRrKCIgIDB4MmQ6IFNSUyBjZW50ZXIgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmQpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDBlOiBsZWZ0IGFuYWxvZyAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBlKSk7Ci0JcHJpbnRrKCIgIDB4MmU6IHdhdmUgc291cmNlICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmUpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDBmOiByaWdodCBhbmFsb2cgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBmKSk7Ci0JcHJpbnRrKCIgIDB4MmY6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmYpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDEwOiBsZWZ0IFBDTSAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDEwKSk7Ci0JcHJpbnRrKCIgIDB4MzA6IGFuYWxvZyBwb3dlciAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzApKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDExOiByaWdodCBQQ00gICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDExKSk7Ci0JcHJpbnRrKCIgIDB4MzE6IGFuYWxvZyBwb3dlciAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzEpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDEyOiBETUEgZGF0YSBmb3JtYXQgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDEyKSk7Ci0JcHJpbnRrKCIgIDB4MzI6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzIpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDEzOiBQL0MgZW5hYmxlICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDEzKSk7Ci0JcHJpbnRrKCIgIDB4MzM6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzMpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDE0OiBVL0QgYnV0dG9uICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE0KSk7Ci0JcHJpbnRrKCIgIDB4MzQ6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzQpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDE1OiByZXZpc2lvbiAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE1KSk7Ci0JcHJpbnRrKCIgIDB4MzU6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzUpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDE2OiBBREMgb3V0cHV0IGN0cmwgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE2KSk7Ci0JcHJpbnRrKCIgIDB4MzY6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzYpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDE3OiAtLS0gICAgICAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE3KSk7Ci0JcHJpbnRrKCIgIDB4Mzc6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzcpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDE4OiBETUEgQSB1cHBlciBjbnQgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE4KSk7Ci0JcHJpbnRrKCIgIDB4Mzg6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzgpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDE5OiBETUEgQSBsb3dlciBjbnQgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE5KSk7Ci0JcHJpbnRrKCIgIDB4Mzk6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzkpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDFhOiAtLS0gICAgICAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFhKSk7Ci0JcHJpbnRrKCIgIDB4M2E6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2EpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDFiOiAtLS0gICAgICAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFiKSk7Ci0JcHJpbnRrKCIgIDB4M2I6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2IpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDFjOiBETUEgQyB1cHBlciBjbnQgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFjKSk7Ci0JcHJpbnRrKCIgIDB4M2M6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2MpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDFkOiBETUEgQyB1cHBlciBjbnQgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFkKSk7Ci0JcHJpbnRrKCIgIDB4M2Q6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2QpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDFlOiBQQ00gcmF0ZSBsb3cgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFlKSk7Ci0JcHJpbnRrKCIgIDB4M2U6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2UpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDFmOiBQQ00gcmF0ZSBoaWdoICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFmKSk7Ci0JcHJpbnRrKCIgIDB4M2Y6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2YpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSJTViBSRUdTOiAgICAgICAgICBJTkRFWCA9IDB4JTAyeCAgICAgICAgICAgICAgICAgICBTVEFUVVMgPSAweCUwMnhcbiIsCisJCWluYihTVl9SRUcoc29uaWMsIElOREVYKSksIGluYihTVl9SRUcoc29uaWMsIFNUQVRVUykpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDA6IGxlZnQgaW5wdXQgICAgICA9IDB4JTAyeCAgICAweDIwOiBzeW50aCByYXRlIGxvdyAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAwKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjApKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDE6IHJpZ2h0IGlucHV0ICAgICA9IDB4JTAyeCAgICAweDIxOiBzeW50aCByYXRlIGhpZ2ggPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAxKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjEpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDI6IGxlZnQgQVVYMSAgICAgICA9IDB4JTAyeCAgICAweDIyOiBBREMgY2xvY2sgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAyKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjIpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDM6IHJpZ2h0IEFVWDEgICAgICA9IDB4JTAyeCAgICAweDIzOiBBREMgYWx0IHJhdGUgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAzKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjMpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDQ6IGxlZnQgQ0QgICAgICAgICA9IDB4JTAyeCAgICAweDI0OiBBREMgcGxsIE0gICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA0KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjQpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDU6IHJpZ2h0IENEICAgICAgICA9IDB4JTAyeCAgICAweDI1OiBBREMgcGxsIE4gICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA1KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjUpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDY6IGxlZnQgbGluZSAgICAgICA9IDB4JTAyeCAgICAweDI2OiBTeW50aCBwbGwgTSAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA2KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjYpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDc6IHJpZ2h0IGxpbmUgICAgICA9IDB4JTAyeCAgICAweDI3OiBTeW50aCBwbGwgTiAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA3KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjcpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDg6IE1JQyAgICAgICAgICAgICA9IDB4JTAyeCAgICAweDI4OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA4KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjgpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDk6IEdhbWUgcG9ydCAgICAgICA9IDB4JTAyeCAgICAweDI5OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA5KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjkpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MGE6IGxlZnQgc3ludGggICAgICA9IDB4JTAyeCAgICAweDJhOiBNUFU0MDEgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBhKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmEpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MGI6IHJpZ2h0IHN5bnRoICAgICA9IDB4JTAyeCAgICAweDJiOiBkcml2ZSBjdHJsICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBiKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmIpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MGM6IGxlZnQgQVVYMiAgICAgICA9IDB4JTAyeCAgICAweDJjOiBTUlMgc3BhY2UgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBjKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmMpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MGQ6IHJpZ2h0IEFVWDIgICAgICA9IDB4JTAyeCAgICAweDJkOiBTUlMgY2VudGVyICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBkKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmQpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MGU6IGxlZnQgYW5hbG9nICAgICA9IDB4JTAyeCAgICAweDJlOiB3YXZlIHNvdXJjZSAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBlKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmUpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MGY6IHJpZ2h0IGFuYWxvZyAgICA9IDB4JTAyeCAgICAweDJmOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBmKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmYpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTA6IGxlZnQgUENNICAgICAgICA9IDB4JTAyeCAgICAweDMwOiBhbmFsb2cgcG93ZXIgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDEwKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzApKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTE6IHJpZ2h0IFBDTSAgICAgICA9IDB4JTAyeCAgICAweDMxOiBhbmFsb2cgcG93ZXIgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDExKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzEpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTI6IERNQSBkYXRhIGZvcm1hdCA9IDB4JTAyeCAgICAweDMyOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDEyKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzIpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTM6IFAvQyBlbmFibGUgICAgICA9IDB4JTAyeCAgICAweDMzOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDEzKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzMpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTQ6IFUvRCBidXR0b24gICAgICA9IDB4JTAyeCAgICAweDM0OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE0KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzQpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTU6IHJldmlzaW9uICAgICAgICA9IDB4JTAyeCAgICAweDM1OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE1KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzUpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTY6IEFEQyBvdXRwdXQgY3RybCA9IDB4JTAyeCAgICAweDM2OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE2KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzYpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTc6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeCAgICAweDM3OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE3KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzcpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTg6IERNQSBBIHVwcGVyIGNudCA9IDB4JTAyeCAgICAweDM4OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE4KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzgpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTk6IERNQSBBIGxvd2VyIGNudCA9IDB4JTAyeCAgICAweDM5OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE5KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzkpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MWE6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeCAgICAweDNhOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFhKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2EpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MWI6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeCAgICAweDNiOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFiKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2IpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MWM6IERNQSBDIHVwcGVyIGNudCA9IDB4JTAyeCAgICAweDNjOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFjKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2MpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MWQ6IERNQSBDIHVwcGVyIGNudCA9IDB4JTAyeCAgICAweDNkOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFkKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2QpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MWU6IFBDTSByYXRlIGxvdyAgICA9IDB4JTAyeCAgICAweDNlOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFlKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2UpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MWY6IFBDTSByYXRlIGhpZ2ggICA9IDB4JTAyeCAgICAweDNmOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFmKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2YpKTsKIH0KIAogI2VuZGlmCkBAIC01MTEsOCArNTExLDEwIEBACiAJKnJlc19tID0gbTsKIAkqcmVzX24gPSBuOwogI2lmIDAKLQlwcmludGsoS0VSTl9ERUJVRyAibWV0cmljID0gJWksIHhtID0gJWksIHhuID0gJWlcbiIsIG1ldHJpYywgeG0sIHhuKTsKLQlwcmludGsoS0VSTl9ERUJVRyAicGxsOiBtID0gMHgleCwgciA9IDB4JXgsIG4gPSAweCV4XG4iLCByZWcsIG0sIHIsIG4pOworCWRldl9kYmcoc29uaWMtPmNhcmQtPmRldiwKKwkJIm1ldHJpYyA9ICVpLCB4bSA9ICVpLCB4biA9ICVpXG4iLCBtZXRyaWMsIHhtLCB4bik7CisJZGV2X2RiZyhzb25pYy0+Y2FyZC0+ZGV2LAorCQkicGxsOiBtID0gMHgleCwgciA9IDB4JXgsIG4gPSAweCV4XG4iLCByZWcsIG0sIHIsIG4pOwogI2VuZGlmCiB9CiAKQEAgLTYyNCw3ICs2MjYsOCBAQAogCQlyZXR1cm4gSVJRX05PTkU7CiAJaWYgKHN0YXR1cyA9PSAweGZmKSB7CS8qIGZhaWx1cmUgKi8KIAkJb3V0Yihzb25pYy0+aXJxbWFzayA9IH4wLCBTVl9SRUcoc29uaWMsIElSUU1BU0spKTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSVJRIGZhaWx1cmUgLSBpbnRlcnJ1cHRzIGRpc2FibGVkISFcbiIpOworCQlkZXZfZXJyKHNvbmljLT5jYXJkLT5kZXYsCisJCQkiSVJRIGZhaWx1cmUgLSBpbnRlcnJ1cHRzIGRpc2FibGVkISFcbiIpOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQogCWlmIChzb25pYy0+cGNtKSB7CkBAIC0xMTk4LDcgKzEyMDEsOCBAQAogCiAJc29uaWMtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFncCkgewotCQlwcmludGsoS0VSTl9FUlIgInNvbmljdmliZXM6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJZGV2X2Vycihzb25pYy0+Y2FyZC0+ZGV2LAorCQkJInNvbmljdmliZXM6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMjY3LDcgKzEyNzEsOCBAQAogCS8qIGNoZWNrLCBpZiB3ZSBjYW4gcmVzdHJpY3QgUENJIERNQSB0cmFuc2ZlcnMgdG8gMjQgYml0cyAqLwogICAgICAgICBpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygyNCkpIDwgMCB8fAogCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjQpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjRiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyNGJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRU5YSU87CiAgICAgICAgIH0KQEAgLTEyOTYsNyArMTMwMSw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9zb25pY3ZpYmVzX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgc29uaWMpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfc29uaWN2aWJlc19mcmVlKHNvbmljKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0xMzEwLDI0ICsxMzE1LDMyIEBACiAJaWYgKCFkbWFhKSB7CiAJCWRtYWEgPSBkbWFpbzsKIAkJZG1haW8gKz0gMHgxMDsKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkJJT1MgZGlkIG5vdCBhbGxvY2F0ZSBERE1BIGNoYW5uZWwgQSBpL28sIGFsbG9jYXRlZCBhdCAweCV4XG4iLCBkbWFhKTsKKwkJZGV2X2luZm8oY2FyZC0+ZGV2LAorCQkJICJCSU9TIGRpZCBub3QgYWxsb2NhdGUgRERNQSBjaGFubmVsIEEgaS9vLCBhbGxvY2F0ZWQgYXQgMHgleFxuIiwKKwkJCSBkbWFhKTsKIAl9CiAJaWYgKCFkbWFjKSB7CiAJCWRtYWMgPSBkbWFpbzsKIAkJZG1haW8gKz0gMHgxMDsKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkJJT1MgZGlkIG5vdCBhbGxvY2F0ZSBERE1BIGNoYW5uZWwgQyBpL28sIGFsbG9jYXRlZCBhdCAweCV4XG4iLCBkbWFjKTsKKwkJZGV2X2luZm8oY2FyZC0+ZGV2LAorCQkJICJCSU9TIGRpZCBub3QgYWxsb2NhdGUgRERNQSBjaGFubmVsIEMgaS9vLCBhbGxvY2F0ZWQgYXQgMHgleFxuIiwKKwkJCSBkbWFjKTsKIAl9CiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2ksIDB4NDAsIGRtYWEpOwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpLCAweDQ4LCBkbWFjKTsKIAogCWlmICgoc29uaWMtPnJlc19kbWFhID0gcmVxdWVzdF9yZWdpb24oZG1hYSwgMHgxMCwgIlMzIFNvbmljVmliZXMgRERNQS1BIikpID09IE5VTEwpIHsKIAkJc25kX3NvbmljdmliZXNfZnJlZShzb25pYyk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIERETUEtQSBwb3J0IGF0IDB4JXgtMHgleFxuIiwgZG1hYSwgZG1hYSArIDB4MTAgLSAxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkidW5hYmxlIHRvIGdyYWIgRERNQS1BIHBvcnQgYXQgMHgleC0weCV4XG4iLAorCQkJZG1hYSwgZG1hYSArIDB4MTAgLSAxKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJaWYgKChzb25pYy0+cmVzX2RtYWMgPSByZXF1ZXN0X3JlZ2lvbihkbWFjLCAweDEwLCAiUzMgU29uaWNWaWJlcyBERE1BLUMiKSkgPT0gTlVMTCkgewogCQlzbmRfc29uaWN2aWJlc19mcmVlKHNvbmljKTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgRERNQS1DIHBvcnQgYXQgMHgleC0weCV4XG4iLCBkbWFjLCBkbWFjICsgMHgxMCAtIDEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJ1bmFibGUgdG8gZ3JhYiBERE1BLUMgcG9ydCBhdCAweCV4LTB4JXhcbiIsCisJCQlkbWFjLCBkbWFjICsgMHgxMCAtIDEpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtMTM5Miw4ICsxNDA1LDYgQEAKIAogCXNuZF9zb25pY3ZpYmVzX3Byb2NfaW5pdChzb25pYyk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcnNvbmljID0gc29uaWM7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNDU5LDcgKzE0NzAsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAgCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJZm9yIChpZHggPSAwOyBpZHggPCA1OyBpZHgrKykgewpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudC5jIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudC5jCmluZGV4IGIzYjU4OGIuLmQ4NTI0NTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnQuYworKysgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50LmMKQEAgLTg5LDcgKzg5LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMKaW5kZXggZmIwZTE1OC4uMTI3MmMxOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMKKysrIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMKQEAgLTY5LDQwICs2OSw0MCBAQAogewogCXVuc2lnbmVkIGludCB2YWwsIHRtcDsKIAotCXByaW50ayhLRVJOX0RFQlVHICJUcmlkZW50IHZvaWNlICVpOlxuIiwgdm9pY2UpOworCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAiVHJpZGVudCB2b2ljZSAlaTpcbiIsIHZvaWNlKTsKIAlvdXRiKHZvaWNlLCBUUklEX1JFRyh0cmlkZW50LCBUNERfTEZPX0dDX0NJUikpOwogCXZhbCA9IGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9MQkEpKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiTEJBOiAweCV4XG4iLCB2YWwpOworCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAiTEJBOiAweCV4XG4iLCB2YWwpOwogCXZhbCA9IGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9HVlNFTF9QQU5fVk9MX0NUUkxfRUMpKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiR1ZTZWw6ICVpXG4iLCB2YWwgPj4gMzEpOwotCXByaW50ayhLRVJOX0RFQlVHICJQYW46IDB4JXhcbiIsICh2YWwgPj4gMjQpICYgMHg3Zik7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlZvbDogMHgleFxuIiwgKHZhbCA+PiAxNikgJiAweGZmKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiQ1RSTDogMHgleFxuIiwgKHZhbCA+PiAxMikgJiAweDBmKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiRUM6IDB4JXhcbiIsIHZhbCAmIDB4MGZmZik7CisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJHVlNlbDogJWlcbiIsIHZhbCA+PiAzMSk7CisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJQYW46IDB4JXhcbiIsICh2YWwgPj4gMjQpICYgMHg3Zik7CisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJWb2w6IDB4JXhcbiIsICh2YWwgPj4gMTYpICYgMHhmZik7CisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJDVFJMOiAweCV4XG4iLCAodmFsID4+IDEyKSAmIDB4MGYpOworCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAiRUM6IDB4JXhcbiIsIHZhbCAmIDB4MGZmZik7CiAJaWYgKHRyaWRlbnQtPmRldmljZSAhPSBUUklERU5UX0RFVklDRV9JRF9OWCkgewogCQl2YWwgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfRFhfQ1NPX0FMUEhBX0ZNUykpOwotCQlwcmludGsoS0VSTl9ERUJVRyAiQ1NPOiAweCV4XG4iLCB2YWwgPj4gMTYpOwotCQlwcmludGsoIkFscGhhOiAweCV4XG4iLCAodmFsID4+IDQpICYgMHgwZmZmKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkZNUzogMHgleFxuIiwgdmFsICYgMHgwZik7CisJCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAiQ1NPOiAweCV4XG4iLCB2YWwgPj4gMTYpOworCQlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIkFscGhhOiAweCV4XG4iLCAodmFsID4+IDQpICYgMHgwZmZmKTsKKwkJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJGTVM6IDB4JXhcbiIsIHZhbCAmIDB4MGYpOwogCQl2YWwgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfRFhfRVNPX0RFTFRBKSk7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFU086IDB4JXhcbiIsIHZhbCA+PiAxNik7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJEZWx0YTogMHgleFxuIiwgdmFsICYgMHhmZmZmKTsKKwkJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJFU086IDB4JXhcbiIsIHZhbCA+PiAxNik7CisJCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAiRGVsdGE6IDB4JXhcbiIsIHZhbCAmIDB4ZmZmZik7CiAJCXZhbCA9IGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9EWF9GTUNfUlZPTF9DVk9MKSk7CiAJfSBlbHNlIHsJCS8vIFRSSURFTlRfREVWSUNFX0lEX05YCiAJCXZhbCA9IGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9OWF9ERUxUQV9DU08pKTsKIAkJdG1wID0gKHZhbCA+PiAyNCkgJiAweGZmOwotCQlwcmludGsoS0VSTl9ERUJVRyAiQ1NPOiAweCV4XG4iLCB2YWwgJiAweDAwZmZmZmZmKTsKKwkJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJDU086IDB4JXhcbiIsIHZhbCAmIDB4MDBmZmZmZmYpOwogCQl2YWwgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfTlhfREVMVEFfRVNPKSk7CiAJCXRtcCB8PSAodmFsID4+IDE2KSAmIDB4ZmYwMDsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkRlbHRhOiAweCV4XG4iLCB0bXApOwotCQlwcmludGsoS0VSTl9ERUJVRyAiRVNPOiAweCV4XG4iLCB2YWwgJiAweDAwZmZmZmZmKTsKKwkJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJEZWx0YTogMHgleFxuIiwgdG1wKTsKKwkJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJFU086IDB4JXhcbiIsIHZhbCAmIDB4MDBmZmZmZmYpOwogCQl2YWwgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfTlhfQUxQSEFfRk1TX0ZNQ19SVk9MX0NWT0wpKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkFscGhhOiAweCV4XG4iLCB2YWwgPj4gMjApOwotCQlwcmludGsoS0VSTl9ERUJVRyAiRk1TOiAweCV4XG4iLCAodmFsID4+IDE2KSAmIDB4MGYpOworCQlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIkFscGhhOiAweCV4XG4iLCB2YWwgPj4gMjApOworCQlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIkZNUzogMHgleFxuIiwgKHZhbCA+PiAxNikgJiAweDBmKTsKIAl9Ci0JcHJpbnRrKEtFUk5fREVCVUcgIkZNQzogMHgleFxuIiwgKHZhbCA+PiAxNCkgJiAzKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiUlZvbDogMHgleFxuIiwgKHZhbCA+PiA3KSAmIDB4N2YpOwotCXByaW50ayhLRVJOX0RFQlVHICJDVm9sOiAweCV4XG4iLCB2YWwgJiAweDdmKTsKKwlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIkZNQzogMHgleFxuIiwgKHZhbCA+PiAxNCkgJiAzKTsKKwlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIlJWb2w6IDB4JXhcbiIsICh2YWwgPj4gNykgJiAweDdmKTsKKwlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIkNWb2w6IDB4JXhcbiIsIHZhbCAmIDB4N2YpOwogfQogI2VuZGlmCiAKQEAgLTE1Niw3ICsxNTYsOCBAQAogCX0KIAogCWlmIChjb3VudCA9PSAwICYmICF0cmlkZW50LT5hYzk3X2RldGVjdCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhYzk3IGNvZGVjIHJlYWQgVElNRU9VVCBbMHgleC8weCV4XSEhIVxuIiwKKwkJZGV2X2Vycih0cmlkZW50LT5jYXJkLT5kZXYsCisJCQkiYWM5NyBjb2RlYyByZWFkIFRJTUVPVVQgWzB4JXgvMHgleF0hISFcbiIsCiAJCQkgICByZWcsIGRhdGEpOwogCQlkYXRhID0gMDsKIAl9CkBAIC00OTcsMTYgKzQ5OCwxNiBAQAogCW91dGwocmVnc1s0XSwgVFJJRF9SRUcodHJpZGVudCwgQ0hfU1RBUlQgKyAxNikpOwogCiAjaWYgMAotCXByaW50ayhLRVJOX0RFQlVHICJ3cml0dGVuICVpIGNoYW5uZWw6XG4iLCB2b2ljZS0+bnVtYmVyKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiICByZWdzWzBdID0gMHgleC8weCV4XG4iLAorCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAid3JpdHRlbiAlaSBjaGFubmVsOlxuIiwgdm9pY2UtPm51bWJlcik7CisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICIgIHJlZ3NbMF0gPSAweCV4LzB4JXhcbiIsCiAJICAgICAgIHJlZ3NbMF0sIGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9TVEFSVCArIDApKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiAgcmVnc1sxXSA9IDB4JXgvMHgleFxuIiwKKwlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIiAgcmVnc1sxXSA9IDB4JXgvMHgleFxuIiwKIAkgICAgICAgcmVnc1sxXSwgaW5sKFRSSURfUkVHKHRyaWRlbnQsIENIX1NUQVJUICsgNCkpKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiICByZWdzWzJdID0gMHgleC8weCV4XG4iLAorCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAiICByZWdzWzJdID0gMHgleC8weCV4XG4iLAogCSAgICAgICByZWdzWzJdLCBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfU1RBUlQgKyA4KSkpOwotCXByaW50ayhLRVJOX0RFQlVHICIgIHJlZ3NbM10gPSAweCV4LzB4JXhcbiIsCisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICIgIHJlZ3NbM10gPSAweCV4LzB4JXhcbiIsCiAJICAgICAgIHJlZ3NbM10sIGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9TVEFSVCArIDEyKSkpOwotCXByaW50ayhLRVJOX0RFQlVHICIgIHJlZ3NbNF0gPSAweCV4LzB4JXhcbiIsCisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICIgIHJlZ3NbNF0gPSAweCV4LzB4JXhcbiIsCiAJICAgICAgIHJlZ3NbNF0sIGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9TVEFSVCArIDE2KSkpOwogI2VuZGlmCiB9CkBAIC01ODksNyArNTkwLDcgQEAKIAkJb3V0Yih2b2ljZS0+Vm9sID4+IDIsIFRSSURfUkVHKHRyaWRlbnQsIENIX0dWU0VMX1BBTl9WT0xfQ1RSTF9FQyArIDIpKTsKIAkJYnJlYWs7CiAJY2FzZSBUUklERU5UX0RFVklDRV9JRF9TSTcwMTg6Ci0JCS8qIHByaW50ayhLRVJOX0RFQlVHICJ2b2ljZS0+Vm9sID0gMHgleFxuIiwgdm9pY2UtPlZvbCk7ICovCisJCS8qIGRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAidm9pY2UtPlZvbCA9IDB4JXhcbiIsIHZvaWNlLT5Wb2wpOyAqLwogCQlvdXR3KCh2b2ljZS0+Q1RSTCA8PCAxMikgfCB2b2ljZS0+Vm9sLAogCQkgICAgIFRSSURfUkVHKHRyaWRlbnQsIENIX0dWU0VMX1BBTl9WT0xfQ1RSTF9FQykpOwogCQlicmVhazsKQEAgLTMwMTMsMTMgKzMwMTQsMTUgQEAKIAkJX2FjOTcubnVtID0gMTsKIAkJZXJyID0gc25kX2FjOTdfbWl4ZXIodHJpZGVudC0+YWM5N19idXMsICZfYWM5NywgJnRyaWRlbnQtPmFjOTdfc2VjKTsKIAkJaWYgKGVyciA8IDApCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJTSTcwMTg6IHRoZSBzZWNvbmRhcnkgY29kZWMgLSBpbnZhbGlkIGFjY2Vzc1xuIik7CisJCQlkZXZfZXJyKHRyaWRlbnQtPmNhcmQtPmRldiwKKwkJCQkiU0k3MDE4OiB0aGUgc2Vjb25kYXJ5IGNvZGVjIC0gaW52YWxpZCBhY2Nlc3NcbiIpOwogI2lmIDAJLy8gb25seSBmb3IgbXkgdGVzdGluZyBwdXJwb3NlIC0tamsKIAkJewogCQkJc3RydWN0IHNuZF9hYzk3ICptYzk3OwogCQkJZXJyID0gc25kX2FjOTdfbW9kZW0odHJpZGVudC0+Y2FyZCwgJl9hYzk3LCAmbWM5Nyk7CiAJCQlpZiAoZXJyIDwgMCkKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJzbmRfYWM5N19tb2RlbSByZXR1cm5lZCBlcnJvciAlaVxuIiwgZXJyKTsKKwkJCQlkZXZfZXJyKHRyaWRlbnQtPmNhcmQtPmRldiwKKwkJCQkJInNuZF9hYzk3X21vZGVtIHJldHVybmVkIGVycm9yICVpXG4iLCBlcnIpOwogCQl9CiAjZW5kaWYKIAl9CkBAIC0zMTk3LDcgKzMyMDAsOCBAQAogCiAJY2hpcC0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKIAlpZiAoIWdwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMzI3MCw3ICszMjc0LDggQEAKIAkJCWdvdG8gX19zaTcwMThfb2s7CiAJCWRvX2RlbGF5KHRyaWRlbnQpOwogCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBjb2RlYyByZWFkeSBlcnJvciBbMHgleF1cbiIsIGlubChUUklEX1JFRyh0cmlkZW50LCBTSV9TRVJJQUxfSU5URl9DVFJMKSkpOworCWRldl9lcnIodHJpZGVudC0+Y2FyZC0+ZGV2LCAiQUMnOTcgY29kZWMgcmVhZHkgZXJyb3IgWzB4JXhdXG4iLAorCQlpbmwoVFJJRF9SRUcodHJpZGVudCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpKTsKIAlpZiAoci0tID4gMCkgewogCQllbmRfdGltZSA9IGppZmZpZXMgKyBIWjsKIAkJZG8gewpAQCAtMzM2Nyw3ICszMzcyLDcgQEAKIAogCWlmIChzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YSh0cmlkZW50LT5wY2kpLAogCQkJCTIgKiBTTkRSVl9UUklERU5UX01BWF9QQUdFUyAqIDQsICZ0cmlkZW50LT50bGIuYnVmZmVyKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidHJpZGVudDogdW5hYmxlIHRvIGFsbG9jYXRlIFRMQiBidWZmZXJcbiIpOworCQlkZXZfZXJyKHRyaWRlbnQtPmNhcmQtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBUTEIgYnVmZmVyXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXRyaWRlbnQtPnRsYi5lbnRyaWVzID0gKHVuc2lnbmVkIGludCopQUxJR04oKHVuc2lnbmVkIGxvbmcpdHJpZGVudC0+dGxiLmJ1ZmZlci5hcmVhLCBTTkRSVl9UUklERU5UX01BWF9QQUdFUyAqIDQpOwpAQCAtMzM3NSwxMyArMzM4MCwxNCBAQAogCS8qIGFsbG9jYXRlIHNoYWRvdyBUTEIgcGFnZSB0YWJsZSAodmlydHVhbCBhZGRyZXNzZXMpICovCiAJdHJpZGVudC0+dGxiLnNoYWRvd19lbnRyaWVzID0gdm1hbGxvYyhTTkRSVl9UUklERU5UX01BWF9QQUdFUypzaXplb2YodW5zaWduZWQgbG9uZykpOwogCWlmICh0cmlkZW50LT50bGIuc2hhZG93X2VudHJpZXMgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiB1bmFibGUgdG8gYWxsb2NhdGUgc2hhZG93IFRMQiBlbnRyaWVzXG4iKTsKKwkJZGV2X2Vycih0cmlkZW50LT5jYXJkLT5kZXYsCisJCQkidW5hYmxlIHRvIGFsbG9jYXRlIHNoYWRvdyBUTEIgZW50cmllc1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAkvKiBhbGxvY2F0ZSBhbmQgc2V0dXAgc2lsZW50IHBhZ2UgYW5kIGluaXRpYWxpc2UgVExCIGVudHJpZXMgKi8KIAlpZiAoc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEodHJpZGVudC0+cGNpKSwKIAkJCQlTTkRSVl9UUklERU5UX1BBR0VfU0laRSwgJnRyaWRlbnQtPnRsYi5zaWxlbnRfcGFnZSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IHVuYWJsZSB0byBhbGxvY2F0ZSBzaWxlbnQgcGFnZVxuIik7CisJCWRldl9lcnIodHJpZGVudC0+Y2FyZC0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIHNpbGVudCBwYWdlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCW1lbXNldCh0cmlkZW50LT50bGIuc2lsZW50X3BhZ2UuYXJlYSwgMCwgU05EUlZfVFJJREVOVF9QQUdFX1NJWkUpOwpAQCAtMzQzOSw3ICszNDQ1LDcgQEAKIAkJCWdvdG8gX19keF9vazsKIAkJZG9fZGVsYXkodHJpZGVudCk7CiAJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOwotCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IGNvZGVjIHJlYWR5IGVycm9yXG4iKTsKKwlkZXZfZXJyKHRyaWRlbnQtPmNhcmQtPmRldiwgIkFDJzk3IGNvZGVjIHJlYWR5IGVycm9yXG4iKTsKIAlyZXR1cm4gLUVJTzsKIAogIF9fZHhfb2s6CkBAIC0zNDc3LDcgKzM0ODMsOCBAQAogCQkJZ290byBfX254X29rOwogCQlkb19kZWxheSh0cmlkZW50KTsKIAl9IHdoaWxlICh0aW1lX2FmdGVyX2VxKGVuZF90aW1lLCBqaWZmaWVzKSk7Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgY29kZWMgcmVhZHkgZXJyb3IgWzB4JXhdXG4iLCBpbmwoVFJJRF9SRUcodHJpZGVudCwgTlhfQUNSMF9BQzk3X0NPTV9TVEFUKSkpOworCWRldl9lcnIodHJpZGVudC0+Y2FyZC0+ZGV2LCAiQUMnOTcgY29kZWMgcmVhZHkgZXJyb3IgWzB4JXhdXG4iLAorCQlpbmwoVFJJRF9SRUcodHJpZGVudCwgTlhfQUNSMF9BQzk3X0NPTV9TVEFUKSkpOwogCXJldHVybiAtRUlPOwogCiAgX19ueF9vazoKQEAgLTM1NjIsNyArMzU2OSw4IEBACiAJLyogY2hlY2ssIGlmIHdlIGNhbiByZXN0cmljdCBQQ0kgRE1BIHRyYW5zZmVycyB0byAzMCBiaXRzICovCiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMzApKSA8IDAgfHwKIAkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDMwKSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMwYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMzBiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC0zNjAwLDcgKzM2MDgsNyBAQAogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfdHJpZGVudF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIHRyaWRlbnQpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfdHJpZGVudF9mcmVlKHRyaWRlbnQpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTM2NjQsNyArMzY3Miw2IEBACiAJc25kX3RyaWRlbnRfZW5hYmxlX2Vzbyh0cmlkZW50KTsKIAogCXNuZF90cmlkZW50X3Byb2NfaW5pdCh0cmlkZW50KTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CiAJKnJ0cmlkZW50ID0gdHJpZGVudDsKIAlyZXR1cm4gMDsKIH0KQEAgLTM5NTAsOCArMzk1Nyw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eC5jIGIvc291bmQvcGNpL3ZpYTgyeHguYwppbmRleCA1YWU2ZjA0Li45NWI5OGY1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eC5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4LmMKQEAgLTQ1OSw3ICs0NTksNyBAQAogCQkJdW5zaWduZWQgaW50IGFkZHI7CiAKIAkJCWlmIChpZHggPj0gVklBX1RBQkxFX1NJWkUpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ2aWE4Mnh4OiB0b28gbXVjaCB0YWJsZSBzaXplIVxuIik7CisJCQkJZGV2X2VycigmcGNpLT5kZXYsICJ0b28gbXVjaCB0YWJsZSBzaXplIVxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlhZGRyID0gc25kX3BjbV9zZ2J1Zl9nZXRfYWRkcihzdWJzdHJlYW0sIG9mcyk7CkBAIC00NzQsOCArNDc0LDkgQEAKIAkJCX0gZWxzZQogCQkJCWZsYWcgPSAwOyAvKiBwZXJpb2QgY29udGludWVzIHRvIHRoZSBuZXh0ICovCiAJCQkvKgotCQkJcHJpbnRrKEtFUk5fREVCVUcgInZpYTogdGJsICVkOiBhdCAlZCAgc2l6ZSAlZCAiCi0JCQkgICAgICAgIihyZXN0ICVkKVxuIiwgaWR4LCBvZnMsIHIsIHJlc3QpOworCQkJZGV2X2RiZygmcGNpLT5kZXYsCisJCQkJInRibCAlZDogYXQgJWQgIHNpemUgJWQgKHJlc3QgJWQpXG4iLAorCQkJCWlkeCwgb2ZzLCByLCByZXN0KTsKIAkJCSovCiAJCQkoKHUzMiAqKWRldi0+dGFibGUuYXJlYSlbKGlkeDw8MSkgKyAxXSA9IGNwdV90b19sZTMyKHIgfCBmbGFnKTsKIAkJCWRldi0+aWR4X3RhYmxlW2lkeF0ub2Zmc2V0ID0gb2ZzOwpAQCAtNTI4LDcgKzUyOSw3IEBACiAJCWlmICghKCh2YWwgPSBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKSkgJiBWSUFfUkVHX0FDOTdfQlVTWSkpCiAJCQlyZXR1cm4gdmFsICYgMHhmZmZmOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlY19yZWFkeTogY29kZWMgJWkgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNvZGVjX3JlYWR5OiBjb2RlYyAlaSBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLAogCQkgICBzZWNvbmRhcnksIHNuZF92aWE4Mnh4X2NvZGVjX3hyZWFkKGNoaXApKTsKIAlyZXR1cm4gLUVJTzsKIH0KQEAgLTU4Nyw3ICs1ODgsOCBAQAogCXh2YWwgfD0gKHJlZyAmIDB4N2YpIDw8IFZJQV9SRUdfQUM5N19DTURfU0hJRlQ7CiAgICAgICAJd2hpbGUgKDEpIHsKICAgICAgIAkJaWYgKGFnYWluKysgPiAzKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlY19yZWFkOiBjb2RlYyAlaSBpcyBub3QgdmFsaWQgWzB4JXhdXG4iLAorCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImNvZGVjX3JlYWQ6IGNvZGVjICVpIGlzIG5vdCB2YWxpZCBbMHgleF1cbiIsCiAJCQkJICAgYWM5Ny0+bnVtLCBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKSk7CiAJCSAgICAgIAlyZXR1cm4gMHhmZmZmOwogCQl9CkBAIC03NzcsNyArNzc5LDkgQEAKIAkoKHBvcykgPCB2aWFkZXYtPmxhc3Rwb3MgJiYgKChwb3MpID49IHZpYWRldi0+YnVmc2l6ZTIgfHxcCiAJCQkJICAgICB2aWFkZXYtPmxhc3Rwb3MgPCB2aWFkZXYtPmJ1ZnNpemUyKSkKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2FsY19saW5lYXJfcG9zKHN0cnVjdCB2aWFkZXYgKnZpYWRldiwgdW5zaWduZWQgaW50IGlkeCwKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNhbGNfbGluZWFyX3BvcyhzdHJ1Y3QgdmlhODJ4eCAqY2hpcCwKKwkJCQkJICAgc3RydWN0IHZpYWRldiAqdmlhZGV2LAorCQkJCQkgICB1bnNpZ25lZCBpbnQgaWR4LAogCQkJCQkgICB1bnNpZ25lZCBpbnQgY291bnQpCiB7CiAJdW5zaWduZWQgaW50IHNpemUsIGJhc2UsIHJlczsKQEAgLTc5MCw3ICs3OTQsOCBAQAogCiAJLyogY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBjYWxjdWxhdGVkIHBvc2l0aW9uICovCiAJaWYgKHNpemUgPCBjb3VudCkgewotCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJpbnZhbGlkIHZpYTgyeHhfY3VyX3B0ciAoc2l6ZSA9ICVkLCBjb3VudCA9ICVkKVxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiaW52YWxpZCB2aWE4Mnh4X2N1cl9wdHIgKHNpemUgPSAlZCwgY291bnQgPSAlZClcbiIsCiAJCQkgICAoaW50KXNpemUsIChpbnQpY291bnQpOwogCQlyZXMgPSB2aWFkZXYtPmxhc3Rwb3M7CiAJfSBlbHNlIHsKQEAgLTgwNyw5ICs4MTIsOSBAQAogCQl9CiAJCWlmIChjaGVja19pbnZhbGlkX3Bvcyh2aWFkZXYsIHJlcykpIHsKICNpZmRlZiBQT0lOVEVSX0RFQlVHCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiZmFpbDogaWR4ID0gJWkvJWksIGxhc3Rwb3MgPSAweCV4LCAiCi0JCQkgICAgICAgImJ1ZnNpemUyID0gMHgleCwgb2Zmc2l6ZSA9IDB4JXgsIHNpemUgPSAweCV4LCAiCi0JCQkgICAgICAgImNvdW50ID0gMHgleFxuIiwgaWR4LCB2aWFkZXYtPnRibF9lbnRyaWVzLAorCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJImZhaWw6IGlkeCA9ICVpLyVpLCBsYXN0cG9zID0gMHgleCwgYnVmc2l6ZTIgPSAweCV4LCBvZmZzaXplID0gMHgleCwgc2l6ZSA9IDB4JXgsIGNvdW50ID0gMHgleFxuIiwKKwkJCQlpZHgsIHZpYWRldi0+dGJsX2VudHJpZXMsCiAJCQkgICAgICAgdmlhZGV2LT5sYXN0cG9zLCB2aWFkZXYtPmJ1ZnNpemUyLAogCQkJICAgICAgIHZpYWRldi0+aWR4X3RhYmxlW2lkeF0ub2Zmc2V0LAogCQkJICAgICAgIHZpYWRldi0+aWR4X3RhYmxlW2lkeF0uc2l6ZSwgY291bnQpOwpAQCAtODE3LDggKzgyMiw4IEBACiAJCQkvKiBjb3VudCByZWdpc3RlciByZXR1cm5zIGZ1bGwgc2l6ZSB3aGVuIGVuZCBvZiBidWZmZXIgaXMgcmVhY2hlZCAqLwogCQkJcmVzID0gYmFzZSArIHNpemU7CiAJCQlpZiAoY2hlY2tfaW52YWxpZF9wb3ModmlhZGV2LCByZXMpKSB7Ci0JCQkJc25kX3ByaW50ZChLRVJOX0VSUiAiaW52YWxpZCB2aWE4Mnh4X2N1cl9wdHIgKDIpLCAiCi0JCQkJCSAgICJ1c2luZyBsYXN0IHZhbGlkIHBvaW50ZXJcbiIpOworCQkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCQkiaW52YWxpZCB2aWE4Mnh4X2N1cl9wdHIgKDIpLCB1c2luZyBsYXN0IHZhbGlkIHBvaW50ZXJcbiIpOwogCQkJCXJlcyA9IHZpYWRldi0+bGFzdHBvczsKIAkJCX0KIAkJfQpAQCAtODUwLDcgKzg1NSw3IEBACiAJCWlkeCA9IDA7CiAJZWxzZSAvKiBDVVJSX1BUUiBob2xkcyB0aGUgYWRkcmVzcyArIDggKi8KIAkJaWR4ID0gKChwdHIgLSAodW5zaWduZWQgaW50KXZpYWRldi0+dGFibGUuYWRkcikgLyA4IC0gMSkgJSB2aWFkZXYtPnRibF9lbnRyaWVzOwotCXJlcyA9IGNhbGNfbGluZWFyX3Bvcyh2aWFkZXYsIGlkeCwgY291bnQpOworCXJlcyA9IGNhbGNfbGluZWFyX3BvcyhjaGlwLCB2aWFkZXYsIGlkeCwgY291bnQpOwogCXZpYWRldi0+bGFzdHBvcyA9IHJlczsgLyogcmVtZW1iZXIgdGhlIGxhc3QgcG9zaXRpb24gKi8KIAlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwogCkBAIC04ODksMTMgKzg5NCwxNCBAQAogCQlpZHggPSBjb3VudCA+PiAyNDsKIAkJaWYgKGlkeCA+PSB2aWFkZXYtPnRibF9lbnRyaWVzKSB7CiAjaWZkZWYgUE9JTlRFUl9ERUJVRwotCQkJcHJpbnRrKEtFUk5fREVCVUcgImZhaWw6IGludmFsaWQgaWR4ID0gJWkvJWlcbiIsIGlkeCwKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJmYWlsOiBpbnZhbGlkIGlkeCA9ICVpLyVpXG4iLCBpZHgsCiAJCQkgICAgICAgdmlhZGV2LT50YmxfZW50cmllcyk7CiAjZW5kaWYKIAkJCXJlcyA9IHZpYWRldi0+bGFzdHBvczsKIAkJfSBlbHNlIHsKIAkJCWNvdW50ICY9IDB4ZmZmZmZmOwotCQkJcmVzID0gY2FsY19saW5lYXJfcG9zKHZpYWRldiwgaWR4LCBjb3VudCk7CisJCQlyZXMgPSBjYWxjX2xpbmVhcl9wb3MoY2hpcCwgdmlhZGV2LCBpZHgsIGNvdW50KTsKIAkJfQogCX0gZWxzZSB7CiAJCXJlcyA9IHZpYWRldi0+aHdwdHJfZG9uZTsKQEAgLTE5NDAsMTQgKzE5NDYsMTUgQEAKIAogCXIgPSByZXF1ZXN0X3JlZ2lvbihKT1lTVElDS19BRERSLCA4LCAiVklBNjg2IGdhbWVwb3J0Iik7CiAJaWYgKCFyKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInZpYTgyeHg6IGNhbm5vdCByZXNlcnZlIGpveXN0aWNrIHBvcnQgJSN4XG4iLAorCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsICJjYW5ub3QgcmVzZXJ2ZSBqb3lzdGljayBwb3J0ICUjeFxuIiwKIAkJICAgICAgIEpPWVNUSUNLX0FERFIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWNoaXAtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFncCkgewotCQlwcmludGsoS0VSTl9FUlIgInZpYTgyeHg6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOwogCQlyZWxlYXNlX2FuZF9mcmVlX3Jlc291cmNlKHIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0yMDE2LDcgKzIwMjMsOCBAQAogCQlzdHJjcHkoc2lkLm5hbWUsICJQQ00gUGxheWJhY2sgVm9sdW1lIik7CiAJCXNpZC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSOwogCQlpZiAoISBzbmRfY3RsX2ZpbmRfaWQoY2hpcC0+Y2FyZCwgJnNpZCkpIHsKLQkJCXNuZF9wcmludGQoS0VSTl9JTkZPICJVc2luZyBEWFMgYXMgUENNIFBsYXliYWNrXG4iKTsKKwkJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkgIlVzaW5nIERYUyBhcyBQQ00gUGxheWJhY2tcbiIpOwogCQkJZXJyID0gc25kX2N0bF9hZGQoY2hpcC0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfdmlhODIzM19wY21keHNfdm9sdW1lX2NvbnRyb2wsIGNoaXApKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CkBAIC0yMTAyLDggKzIxMTAsOSBAQAogCQkJCQltcHVfcG9ydCwgTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8CiAJCQkJCU1QVTQwMV9JTkZPX0lSUV9IT09LLCAtMSwKIAkJCQkJJmNoaXAtPnJtaWRpKSA8IDApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInVuYWJsZSB0byBpbml0aWFsaXplIE1QVS00MDEiCi0JCQkgICAgICAgIiBhdCAweCVseCwgc2tpcHBpbmdcbiIsIG1wdV9wb3J0KTsKKwkJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkgInVuYWJsZSB0byBpbml0aWFsaXplIE1QVS00MDEgYXQgMHglbHgsIHNraXBwaW5nXG4iLAorCQkJCSBtcHVfcG9ydCk7CiAJCQlsZWdhY3kgJj0gflZJQV9GVU5DX0VOQUJMRV9NSURJOwogCQl9IGVsc2UgewogCQkJbGVnYWN5ICY9IH5WSUFfRlVOQ19NSURJX0lSUU1BU0s7CS8qIGVuYWJsZSBNSURJIGludGVycnVwdCAqLwpAQCAtMjIwMyw3ICsyMjEyLDggQEAKIAl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmRfdGltZSkpOwogCiAJaWYgKCh2YWwgPSBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKSkgJiBWSUFfUkVHX0FDOTdfQlVTWSkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgY29kZWMgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwgdmFsKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiQUMnOTcgY29kZWMgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwgdmFsKTsKIAogI2lmIDAgLyogRklYTUU6IHdlIGRvbid0IHN1cHBvcnQgdGhlIHNlY29uZCBjb2RlYyB5ZXQgc28gc2tpcCB0aGUgZGV0ZWN0aW9uIG5vdy4uICovCiAJc25kX3ZpYTgyeHhfY29kZWNfeHdyaXRlKGNoaXAsIFZJQV9SRUdfQUM5N19SRUFEIHwKQEAgLTIzMDMsOCArMjMxMyw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ2aWE4Mnh4OiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yNDE3LDcgKzI0MjYsNyBAQAogCQkJc25kX3ZpYTgyMzNfaW50ZXJydXB0IDoJc25kX3ZpYTY4Nl9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX3ZpYTgyeHhfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0yNDQxLDggKzI0NTAsNiBAQAogCSAqIFdlIGNhbGwgcGNpX3NldF9tYXN0ZXIgaGVyZSBiZWNhdXNlIGl0IGRvZXMgbm90IGh1cnQuICovCiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyX3ZpYSA9IGNoaXA7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNTE2LDcgKzI1MjMsNyBAQAogCiAJdyA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgZHhzX3doaXRlbGlzdCk7CiAJaWYgKHcpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJ2aWE4Mnh4OiBEWFMgd2hpdGUgbGlzdCBmb3IgJXMgZm91bmRcbiIsCisJCWRldl9kYmcoJnBjaS0+ZGV2LCAiRFhTIHdoaXRlIGxpc3QgZm9yICVzIGZvdW5kXG4iLAogCQkJICAgIHNuZF9wY2lfcXVpcmtfbmFtZSh3KSk7CiAJCXJldHVybiB3LT52YWx1ZTsKIAl9CkBAIC0yNTI4LDEwICsyNTM1LDEwIEBACiAJLyoKIAkgKiBub3QgZGV0ZWN0ZWQsIHRyeSA0OGsgcmF0ZSBvbmx5IHRvIGJlIHN1cmUuCiAJICovCi0JcHJpbnRrKEtFUk5fSU5GTyAidmlhODJ4eDogQXNzdW1pbmcgRFhTIGNoYW5uZWxzIHdpdGggNDhrIGZpeGVkIHNhbXBsZSByYXRlLlxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICAgUGxlYXNlIHRyeSBkeHNfc3VwcG9ydD01IG9wdGlvblxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICAgYW5kIHJlcG9ydCBpZiBpdCB3b3JrcyBvbiB5b3VyIG1hY2hpbmUuXG4iKTsKLQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgICBGb3IgbW9yZSBkZXRhaWxzLCByZWFkIEFMU0EtQ29uZmlndXJhdGlvbi50eHQuXG4iKTsKKwlkZXZfaW5mbygmcGNpLT5kZXYsICJBc3N1bWluZyBEWFMgY2hhbm5lbHMgd2l0aCA0OGsgZml4ZWQgc2FtcGxlIHJhdGUuXG4iKTsKKwlkZXZfaW5mbygmcGNpLT5kZXYsICIgICAgICAgICBQbGVhc2UgdHJ5IGR4c19zdXBwb3J0PTUgb3B0aW9uXG4iKTsKKwlkZXZfaW5mbygmcGNpLT5kZXYsICIgICAgICAgICBhbmQgcmVwb3J0IGlmIGl0IHdvcmtzIG9uIHlvdXIgbWFjaGluZS5cbiIpOworCWRldl9pbmZvKCZwY2ktPmRldiwgIiAgICAgICAgIEZvciBtb3JlIGRldGFpbHMsIHJlYWQgQUxTQS1Db25maWd1cmF0aW9uLnR4dC5cbiIpOwogCXJldHVybiBWSUFfRFhTXzQ4SzsKIH07CiAKQEAgLTI1NDQsNyArMjU1MSw3IEBACiAJdW5zaWduZWQgaW50IGk7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yNTg0LDcgKzI1OTEsNyBAQAogCQkJc3RyY3B5KGNhcmQtPmRyaXZlciwgIlZJQTgyMzMiKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBjYXJkIHR5cGUgJWRcbiIsIGNhcmRfdHlwZSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiaW52YWxpZCBjYXJkIHR5cGUgJWRcbiIsIGNhcmRfdHlwZSk7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gX19lcnJvcjsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jIGIvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYwppbmRleCBjYTE5MDI4Li40NmEwNTI2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMKQEAgLTMxMiw3ICszMTIsNyBAQAogCQkJdW5zaWduZWQgaW50IGFkZHI7CiAKIAkJCWlmIChpZHggPj0gVklBX1RBQkxFX1NJWkUpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ2aWE4Mnh4OiB0b28gbXVjaCB0YWJsZSBzaXplIVxuIik7CisJCQkJZGV2X2VycigmcGNpLT5kZXYsICJ0b28gbXVjaCB0YWJsZSBzaXplIVxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlhZGRyID0gc25kX3BjbV9zZ2J1Zl9nZXRfYWRkcihzdWJzdHJlYW0sIG9mcyk7CkBAIC0zMjksOCArMzI5LDkgQEAKIAkJCX0gZWxzZQogCQkJCWZsYWcgPSAwOyAvKiBwZXJpb2QgY29udGludWVzIHRvIHRoZSBuZXh0ICovCiAJCQkvKgotCQkJcHJpbnRrKEtFUk5fREVCVUcgInZpYTogdGJsICVkOiBhdCAlZCAgc2l6ZSAlZCAiCi0JCQkgICAgICAgIihyZXN0ICVkKVxuIiwgaWR4LCBvZnMsIHIsIHJlc3QpOworCQkJZGV2X2RiZygmcGNpLT5kZXYsCisJCQkJInRibCAlZDogYXQgJWQgIHNpemUgJWQgKHJlc3QgJWQpXG4iLAorCQkJCWlkeCwgb2ZzLCByLCByZXN0KTsKIAkJCSovCiAJCQkoKHUzMiAqKWRldi0+dGFibGUuYXJlYSlbKGlkeDw8MSkgKyAxXSA9IGNwdV90b19sZTMyKHIgfCBmbGFnKTsKIAkJCWRldi0+aWR4X3RhYmxlW2lkeF0ub2Zmc2V0ID0gb2ZzOwpAQCAtMzgyLDcgKzM4Myw3IEBACiAJCWlmICghKCh2YWwgPSBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKSkgJiBWSUFfUkVHX0FDOTdfQlVTWSkpCiAJCQlyZXR1cm4gdmFsICYgMHhmZmZmOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlY19yZWFkeTogY29kZWMgJWkgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNvZGVjX3JlYWR5OiBjb2RlYyAlaSBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLAogCQkgICBzZWNvbmRhcnksIHNuZF92aWE4Mnh4X2NvZGVjX3hyZWFkKGNoaXApKTsKIAlyZXR1cm4gLUVJTzsKIH0KQEAgLTQ0Myw3ICs0NDQsOCBAQAogCXh2YWwgfD0gKHJlZyAmIDB4N2YpIDw8IFZJQV9SRUdfQUM5N19DTURfU0hJRlQ7CiAgICAgICAJd2hpbGUgKDEpIHsKICAgICAgIAkJaWYgKGFnYWluKysgPiAzKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlY19yZWFkOiBjb2RlYyAlaSBpcyBub3QgdmFsaWQgWzB4JXhdXG4iLAorCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImNvZGVjX3JlYWQ6IGNvZGVjICVpIGlzIG5vdCB2YWxpZCBbMHgleF1cbiIsCiAJCQkJICAgYWM5Ny0+bnVtLCBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKSk7CiAJCSAgICAgIAlyZXR1cm4gMHhmZmZmOwogCQl9CkBAIC01NjAsNyArNTYyLDkgQEAKIAkoKHBvcykgPCB2aWFkZXYtPmxhc3Rwb3MgJiYgKChwb3MpID49IHZpYWRldi0+YnVmc2l6ZTIgfHxcCiAJCQkJICAgICB2aWFkZXYtPmxhc3Rwb3MgPCB2aWFkZXYtPmJ1ZnNpemUyKSkKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2FsY19saW5lYXJfcG9zKHN0cnVjdCB2aWFkZXYgKnZpYWRldiwgdW5zaWduZWQgaW50IGlkeCwKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNhbGNfbGluZWFyX3BvcyhzdHJ1Y3QgdmlhODJ4eF9tb2RlbSAqY2hpcCwKKwkJCQkJICAgc3RydWN0IHZpYWRldiAqdmlhZGV2LAorCQkJCQkgICB1bnNpZ25lZCBpbnQgaWR4LAogCQkJCQkgICB1bnNpZ25lZCBpbnQgY291bnQpCiB7CiAJdW5zaWduZWQgaW50IHNpemUsIHJlczsKQEAgLTU3MCwyMCArNTc0LDIxIEBACiAKIAkvKiBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIGNhbGN1bGF0ZWQgcG9zaXRpb24gKi8KIAlpZiAoc2l6ZSA8IGNvdW50KSB7Ci0JCXNuZF9wcmludGQoS0VSTl9FUlIgImludmFsaWQgdmlhODJ4eF9jdXJfcHRyIChzaXplID0gJWQsIGNvdW50ID0gJWQpXG4iLAorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJpbnZhbGlkIHZpYTgyeHhfY3VyX3B0ciAoc2l6ZSA9ICVkLCBjb3VudCA9ICVkKVxuIiwKIAkJCSAgIChpbnQpc2l6ZSwgKGludCljb3VudCk7CiAJCXJlcyA9IHZpYWRldi0+bGFzdHBvczsKIAl9IGVsc2UgaWYgKGNoZWNrX2ludmFsaWRfcG9zKHZpYWRldiwgcmVzKSkgewogI2lmZGVmIFBPSU5URVJfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgImZhaWw6IGlkeCA9ICVpLyVpLCBsYXN0cG9zID0gMHgleCwgIgotCQkgICAgICAgImJ1ZnNpemUyID0gMHgleCwgb2Zmc2l6ZSA9IDB4JXgsIHNpemUgPSAweCV4LCAiCi0JCSAgICAgICAiY291bnQgPSAweCV4XG4iLCBpZHgsIHZpYWRldi0+dGJsX2VudHJpZXMsIHZpYWRldi0+bGFzdHBvcywKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiZmFpbDogaWR4ID0gJWkvJWksIGxhc3Rwb3MgPSAweCV4LCBidWZzaXplMiA9IDB4JXgsIG9mZnNpemUgPSAweCV4LCBzaXplID0gMHgleCwgY291bnQgPSAweCV4XG4iLAorCQkJaWR4LCB2aWFkZXYtPnRibF9lbnRyaWVzLCB2aWFkZXYtPmxhc3Rwb3MsCiAJCSAgICAgICB2aWFkZXYtPmJ1ZnNpemUyLCB2aWFkZXYtPmlkeF90YWJsZVtpZHhdLm9mZnNldCwKIAkJICAgICAgIHZpYWRldi0+aWR4X3RhYmxlW2lkeF0uc2l6ZSwgY291bnQpOwogI2VuZGlmCiAJCWlmIChjb3VudCAmJiBzaXplIDwgY291bnQpIHsKLQkJCXNuZF9wcmludGQoS0VSTl9FUlIgImludmFsaWQgdmlhODJ4eF9jdXJfcHRyLCAiCi0JCQkJICAgInVzaW5nIGxhc3QgdmFsaWQgcG9pbnRlclxuIik7CisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiaW52YWxpZCB2aWE4Mnh4X2N1cl9wdHIsIHVzaW5nIGxhc3QgdmFsaWQgcG9pbnRlclxuIik7CiAJCQlyZXMgPSB2aWFkZXYtPmxhc3Rwb3M7CiAJCX0gZWxzZSB7CiAJCQlpZiAoISBjb3VudCkKQEAgLTU5NSw4ICs2MDAsOCBAQAogCQkJCSAqLwogCQkJCXJlcyA9IHZpYWRldi0+aWR4X3RhYmxlW2lkeF0ub2Zmc2V0ICsgc2l6ZTsKIAkJCWlmIChjaGVja19pbnZhbGlkX3Bvcyh2aWFkZXYsIHJlcykpIHsKLQkJCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJpbnZhbGlkIHZpYTgyeHhfY3VyX3B0ciAoMiksICIKLQkJCQkJICAgInVzaW5nIGxhc3QgdmFsaWQgcG9pbnRlclxuIik7CisJCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJCSJpbnZhbGlkIHZpYTgyeHhfY3VyX3B0ciAoMiksIHVzaW5nIGxhc3QgdmFsaWQgcG9pbnRlclxuIik7CiAJCQkJcmVzID0gdmlhZGV2LT5sYXN0cG9zOwogCQkJfQogCQl9CkBAIC02MzIsNyArNjM3LDcgQEAKIAllbHNlIC8qIENVUlJfUFRSIGhvbGRzIHRoZSBhZGRyZXNzICsgOCAqLwogCQlpZHggPSAoKHB0ciAtICh1bnNpZ25lZCBpbnQpdmlhZGV2LT50YWJsZS5hZGRyKSAvIDggLSAxKSAlCiAJCQl2aWFkZXYtPnRibF9lbnRyaWVzOwotCXJlcyA9IGNhbGNfbGluZWFyX3Bvcyh2aWFkZXYsIGlkeCwgY291bnQpOworCXJlcyA9IGNhbGNfbGluZWFyX3BvcyhjaGlwLCB2aWFkZXYsIGlkeCwgY291bnQpOwogCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKIAlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgcmVzKTsKQEAgLTk5MSw3ICs5OTYsOCBAQAogCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF90aW1lKSk7CiAKIAlpZiAoKHZhbCA9IHNuZF92aWE4Mnh4X2NvZGVjX3hyZWFkKGNoaXApKSAmIFZJQV9SRUdfQUM5N19CVVNZKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBjb2RlYyBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLCB2YWwpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJBQyc5NyBjb2RlYyBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLCB2YWwpOwogCiAJc25kX3ZpYTgyeHhfY29kZWNfeHdyaXRlKGNoaXAsIFZJQV9SRUdfQUM5N19SRUFEIHwKIAkJCQkgVklBX1JFR19BQzk3X1NFQ09OREFSWV9WQUxJRCB8CkBAIC0xMDU0LDggKzEwNjAsNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidmlhODJ4eC1tb2RlbTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTEzNyw3ICsxMTQyLDcgQEAKIAljaGlwLT5wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfdmlhODJ4eF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfdmlhODJ4eF9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTExNjEsOCArMTE2Niw2IEBACiAJICogV2UgY2FsbCBwY2lfc2V0X21hc3RlciBoZXJlIGJlY2F1c2UgaXQgZG9lcyBub3QgaHVydC4gKi8KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJfdmlhID0gY2hpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTExNzcsNyArMTE4MCw3IEBACiAJdW5zaWduZWQgaW50IGk7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xMTg4LDcgKzExOTEsNyBAQAogCQlzcHJpbnRmKGNhcmQtPnNob3J0bmFtZSwgIlZJQSA4MlhYIG1vZGVtIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgY2FyZCB0eXBlICVkXG4iLCBjYXJkX3R5cGUpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImludmFsaWQgY2FyZCB0eXBlICVkXG4iLCBjYXJkX3R5cGUpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIF9fZXJyb3I7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMgYi9zb3VuZC9wY2kvdngyMjIvdngyMjIuYwppbmRleCBhYjhhOWIxLi5mZjkwNzRkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdngyMjIvdngyMjIuYworKysgYi9zb3VuZC9wY2kvdngyMjIvdngyMjIuYwpAQCAtMTcwLDcgKzE3MCw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF92eF9pcnFfaGFuZGxlciwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF92eDIyMl9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTE4MSw4ICsxODEsNiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyY2hpcCA9IHZ4OwogCXJldHVybiAwOwogfQpAQCAtMjA0LDcgKzIwMiw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yMjksNyArMjI4LDcgQEAKIAogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseCAmIDB4JWx4LCBpcnEgJWkiLAogCQljYXJkLT5zaG9ydG5hbWUsIHZ4LT5wb3J0WzBdLCB2eC0+cG9ydFsxXSwgdngtPmNvcmUuaXJxKTsKLQlzbmRfcHJpbnRkZCgiJXMgYXQgMHglbHggJiAweCVseCwgaXJxICVpXG4iLAorCWRldl9kYmcoY2FyZC0+ZGV2LCAiJXMgYXQgMHglbHggJiAweCVseCwgaXJxICVpXG4iLAogCQkgICAgY2FyZC0+c2hvcnRuYW1lLCB2eC0+cG9ydFswXSwgdngtPnBvcnRbMV0sIHZ4LT5jb3JlLmlycSk7CiAKICNpZmRlZiBTTkRfVlhfRldfTE9BREVSCkBAIC0yODAsOCArMjc5LDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgInZ4MjIyOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdngyMjIvdngyMjJfb3BzLmMgYi9zb3VuZC9wY2kvdngyMjIvdngyMjJfb3BzLmMKaW5kZXggYTY5ZTc3NC4uMmQxNTcwMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3Z4MjIyL3Z4MjIyX29wcy5jCisrKyBiL3NvdW5kL3BjaS92eDIyMi92eDIyMl9vcHMuYwpAQCAtMTA4LDcgKzEwOCw3IEBACiB7CiAJb3V0Yih2YWwsIHZ4Ml9yZWdfYWRkcihjaGlwLCBvZmZzZXQpKTsKIAkvKgotCXByaW50ayhLRVJOX0RFQlVHICJvdXRiOiAleCAtPiAleFxuIiwgdmFsLCB2eDJfcmVnX2FkZHIoY2hpcCwgb2Zmc2V0KSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJvdXRiOiAleCAtPiAleFxuIiwgdmFsLCB2eDJfcmVnX2FkZHIoY2hpcCwgb2Zmc2V0KSk7CiAJKi8KIH0KIApAQCAtMTI5LDcgKzEyOSw3IEBACiBzdGF0aWMgdm9pZCB2eDJfb3V0bChzdHJ1Y3QgdnhfY29yZSAqY2hpcCwgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHZhbCkKIHsKIAkvKgotCXByaW50ayhLRVJOX0RFQlVHICJvdXRsOiAleCAtPiAleFxuIiwgdmFsLCB2eDJfcmVnX2FkZHIoY2hpcCwgb2Zmc2V0KSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJvdXRsOiAleCAtPiAleFxuIiwgdmFsLCB2eDJfcmVnX2FkZHIoY2hpcCwgb2Zmc2V0KSk7CiAJKi8KIAlvdXRsKHZhbCwgdngyX3JlZ19hZGRyKGNoaXAsIG9mZnNldCkpOwogfQpAQCAtMTczLDcgKzE3Myw3IEBACiAJc3RydWN0IHNuZF92eDIyMiAqY2hpcCA9IChzdHJ1Y3Qgc25kX3Z4MjIyICopX2NoaXA7CiAJdW5zaWduZWQgaW50IGRhdGE7CiAKLQlzbmRfcHJpbnRkZCgidGVzdGluZyB4aWxpbnguLi5cbiIpOworCWRldl9kYmcoX2NoaXAtPmNhcmQtPmRldiwgInRlc3RpbmcgeGlsaW54Li4uXG4iKTsKIAkvKiBUaGlzIHRlc3QgdXNlcyBzZXZlcmFsIHdyaXRlL3JlYWQgc2VxdWVuY2VzIG9uIFRFU1QwIGFuZCBURVNUMSBiaXRzCiAJICogdG8gZmlndXJlIG91dCB3aGV2ZXIgb3Igbm90IHRoZSB4aWxpbnggd2FzIGNvcnJlY3RseSBsb2FkZWQKIAkgKi8KQEAgLTE4Myw3ICsxODMsNyBAQAogCXZ4X2lubChjaGlwLCBJU1IpOwogCWRhdGEgPSB2eF9pbmwoY2hpcCwgU1RBVFVTKTsKIAlpZiAoKGRhdGEgJiBWWF9TVEFUVVNfVkFMX1RFU1QwX01BU0spID09IFZYX1NUQVRVU19WQUxfVEVTVDBfTUFTSykgewotCQlzbmRfcHJpbnRkZCgiYmFkIVxuIik7CisJCWRldl9kYmcoX2NoaXAtPmNhcmQtPmRldiwgImJhZCFcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTE5Miw3ICsxOTIsNyBAQAogCXZ4X2lubChjaGlwLCBJU1IpOwogCWRhdGEgPSB2eF9pbmwoY2hpcCwgU1RBVFVTKTsKIAlpZiAoISAoZGF0YSAmIFZYX1NUQVRVU19WQUxfVEVTVDBfTUFTSykpIHsKLQkJc25kX3ByaW50ZGQoImJhZCEgIzJcbiIpOworCQlkZXZfZGJnKF9jaGlwLT5jYXJkLT5kZXYsICJiYWQhICMyXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0yMDMsNyArMjAzLDcgQEAKIAkJdnhfaW5sKGNoaXAsIElTUik7CiAJCWRhdGEgPSB2eF9pbmwoY2hpcCwgU1RBVFVTKTsKIAkJaWYgKChkYXRhICYgVlhfU1RBVFVTX1ZBTF9URVNUMV9NQVNLKSA9PSBWWF9TVEFUVVNfVkFMX1RFU1QxX01BU0spIHsKLQkJCXNuZF9wcmludGRkKCJiYWQhICMzXG4iKTsKKwkJCWRldl9kYmcoX2NoaXAtPmNhcmQtPmRldiwgImJhZCEgIzNcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIApAQCAtMjEyLDExICsyMTIsMTEgQEAKIAkJdnhfaW5sKGNoaXAsIElTUik7CiAJCWRhdGEgPSB2eF9pbmwoY2hpcCwgU1RBVFVTKTsKIAkJaWYgKCEgKGRhdGEgJiBWWF9TVEFUVVNfVkFMX1RFU1QxX01BU0spKSB7Ci0JCQlzbmRfcHJpbnRkZCgiYmFkISAjNFxuIik7CisJCQlkZXZfZGJnKF9jaGlwLT5jYXJkLT5kZXYsICJiYWQhICM0XG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfQotCXNuZF9wcmludGRkKCJvaywgeGlsaW54IGZpbmUuXG4iKTsKKwlkZXZfZGJnKF9jaGlwLT5jYXJkLT5kZXYsICJvaywgeGlsaW54IGZpbmUuXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzk3LDcgKzM5Nyw4IEBACiAJCWkgPSB2eF9pbmwoY2hpcCwgR1BJT0MpOwogCQlpZiAoaSAmIDB4MDEwMCkKIAkJCXJldHVybiAwOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ2eDIyMjogeGlsaW54IHRlc3QgZmFpbGVkIGFmdGVyIGxvYWQsIEdQSU9DPTB4JXhcbiIsIGkpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJ4aWxpbnggdGVzdCBmYWlsZWQgYWZ0ZXIgbG9hZCwgR1BJT0M9MHgleFxuIiwgaSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2kuYyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpLmMKaW5kZXggZTg5MzJiMi4uODJlZWQxNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2kuYworKysgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaS5jCkBAIC0xMDYsNyArMTA2LDggQEAKIAkJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAoIXIpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgInltZnBjaTogbm8gZ2FtZXBvcnQgcG9ydHMgYXZhaWxhYmxlXG4iKTsKKwkJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkJIm5vIGdhbWVwb3J0IHBvcnRzIGF2YWlsYWJsZVxuIik7CiAJCQkJcmV0dXJuIC1FQlVTWTsKIAkJCX0KIAkJfQpAQCAtMTE2LDE5ICsxMTcsMjIgQEAKIAkJY2FzZSAweDIwNDogbGVnYWN5X2N0cmwyIHw9IDIgPDwgNjsgYnJlYWs7CiAJCWNhc2UgMHgyMDU6IGxlZ2FjeV9jdHJsMiB8PSAzIDw8IDY7IGJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSICJ5bWZwY2k6IGludmFsaWQgam95c3RpY2sgcG9ydCAlI3giLCBpb19wb3J0KTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJpbnZhbGlkIGpveXN0aWNrIHBvcnQgJSN4IiwgaW9fcG9ydCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KIAogCWlmICghciAmJiAhKHIgPSByZXF1ZXN0X3JlZ2lvbihpb19wb3J0LCAxLCAiWU1GUENJIGdhbWVwb3J0IikpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAieW1mcGNpOiBqb3lzdGljayBwb3J0ICUjeCBpcyBpbiB1c2UuXG4iLCBpb19wb3J0KTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiam95c3RpY2sgcG9ydCAlI3ggaXMgaW4gdXNlLlxuIiwgaW9fcG9ydCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJY2hpcC0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKIAlpZiAoIWdwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAieW1mcGNpOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKIAkJcmVsZWFzZV9hbmRfZnJlZV9yZXNvdXJjZShyKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTg3LDcgKzE5MSw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0zMTMsNyArMzE4LDkgQEAKIAkJCQkJICAgICAgIE1QVTQwMV9JTkZPX0lOVEVHUkFURUQgfAogCQkJCQkgICAgICAgTVBVNDAxX0lORk9fSVJRX0hPT0ssCiAJCQkJCSAgICAgICAtMSwgJmNoaXAtPnJhd21pZGkpKSA8IDApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInltZnBjaTogY2Fubm90IGluaXRpYWxpemUgTVBVNDAxIGF0IDB4JWx4LCBza2lwcGluZy4uLlxuIiwgbXB1X3BvcnRbZGV2XSk7CisJCQlkZXZfd2FybihjYXJkLT5kZXYsCisJCQkJICJjYW5ub3QgaW5pdGlhbGl6ZSBNUFU0MDEgYXQgMHglbHgsIHNraXBwaW5nLi4uXG4iLAorCQkJCSBtcHVfcG9ydFtkZXZdKTsKIAkJCWxlZ2FjeV9jdHJsICY9IH5ZTUZQQ0lfTEVHQUNZX01JRU47IC8qIGRpc2FibGUgTVBVNDAxIGlycSAqLwogCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaSwgUENJUl9EU1hHX0xFR0FDWSwgbGVnYWN5X2N0cmwpOwogCQl9CkBAIC0zMjMsMTIgKzMzMCwxNCBAQAogCQkJCQkgICBmbV9wb3J0W2Rldl0sCiAJCQkJCSAgIGZtX3BvcnRbZGV2XSArIDIsCiAJCQkJCSAgIE9QTDNfSFdfT1BMMywgMSwgJm9wbDMpKSA8IDApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInltZnBjaTogY2Fubm90IGluaXRpYWxpemUgRk0gT1BMMyBhdCAweCVseCwgc2tpcHBpbmcuLi5cbiIsIGZtX3BvcnRbZGV2XSk7CisJCQlkZXZfd2FybihjYXJkLT5kZXYsCisJCQkJICJjYW5ub3QgaW5pdGlhbGl6ZSBGTSBPUEwzIGF0IDB4JWx4LCBza2lwcGluZy4uLlxuIiwKKwkJCQkgZm1fcG9ydFtkZXZdKTsKIAkJCWxlZ2FjeV9jdHJsICY9IH5ZTUZQQ0lfTEVHQUNZX0ZNRU47CiAJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGNpLCBQQ0lSX0RTWEdfTEVHQUNZLCBsZWdhY3lfY3RybCk7CiAJCX0gZWxzZSBpZiAoKGVyciA9IHNuZF9vcGwzX2h3ZGVwX25ldyhvcGwzLCAwLCAxLCBOVUxMKSkgPCAwKSB7CiAJCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGNyZWF0ZSBvcGwzIGh3ZGVwXG4iKTsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGNyZWF0ZSBvcGwzIGh3ZGVwXG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMKaW5kZXggZDU5MWMxNS4uODFjOTE2YSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYwpAQCAtODYsNyArODYsOSBAQAogCQkJcmV0dXJuIDA7CiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF90aW1lKSk7Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZHk6IGNvZGVjICVpIGlzIG5vdCByZWFkeSBbMHgleF1cbiIsIHNlY29uZGFyeSwgc25kX3ltZnBjaV9yZWFkdyhjaGlwLCByZWcpKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJImNvZGVjX3JlYWR5OiBjb2RlYyAlaSBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLAorCQlzZWNvbmRhcnksIHNuZF95bWZwY2lfcmVhZHcoY2hpcCwgcmVnKSk7CiAJcmV0dXJuIC1FQlVTWTsKIH0KIApAQCAtMzE5LDcgKzMyMSw3IEBACiAJCXlwY20tPmxhc3RfcG9zID0gcG9zOwogCQlpZiAoeXBjbS0+cGVyaW9kX3BvcyA+PSB5cGNtLT5wZXJpb2Rfc2l6ZSkgewogCQkJLyoKLQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKIAkJCSAgICAgICAiZG9uZSAtIGFjdGl2ZV9iYW5rID0gMHgleCwgc3RhcnQgPSAweCV4XG4iLAogCQkJICAgICAgIGNoaXAtPmFjdGl2ZV9iYW5rLAogCQkJICAgICAgIHZvaWNlLT5iYW5rW2NoaXAtPmFjdGl2ZV9iYW5rXS5zdGFydCk7CkBAIC0zNzIsNyArMzc0LDcgQEAKIAkJaWYgKHlwY20tPnBlcmlvZF9wb3MgPj0geXBjbS0+cGVyaW9kX3NpemUpIHsKIAkJCXlwY20tPnBlcmlvZF9wb3MgJT0geXBjbS0+cGVyaW9kX3NpemU7CiAJCQkvKgotCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAogCQkJICAgICAgICJkb25lIC0gYWN0aXZlX2JhbmsgPSAweCV4LCBzdGFydCA9IDB4JXhcbiIsCiAJCQkgICAgICAgY2hpcC0+YWN0aXZlX2JhbmssCiAJCQkgICAgICAgdm9pY2UtPmJhbmtbY2hpcC0+YWN0aXZlX2JhbmtdLnN0YXJ0KTsKQEAgLTIwNjcsNyArMjA2OSw4IEBACiAJCQkgICAgICAgJmNoaXAtPnBjaS0+ZGV2KTsKIAlpZiAoZXJyID49IDApIHsKIAkJaWYgKGNoaXAtPmRzcF9taWNyb2NvZGUtPnNpemUgIT0gWURTWEdfRFNQTEVOR1RIKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJEU1AgbWljcm9jb2RlIGhhcyB3cm9uZyBzaXplXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJEU1AgbWljcm9jb2RlIGhhcyB3cm9uZyBzaXplXG4iKTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0yMDgyLDggKzIwODUsOCBAQAogCQkJICAgICAgICZjaGlwLT5wY2ktPmRldik7CiAJaWYgKGVyciA+PSAwKSB7CiAJCWlmIChjaGlwLT5jb250cm9sbGVyX21pY3JvY29kZS0+c2l6ZSAhPSBZRFNYR19DVFJMTEVOR1RIKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb250cm9sbGVyIG1pY3JvY29kZSIKLQkJCQkgICAiIGhhcyB3cm9uZyBzaXplXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJjb250cm9sbGVyIG1pY3JvY29kZSBoYXMgd3Jvbmcgc2l6ZVxuIik7CiAJCQllcnIgPSAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMjM2MCw4ICsyMzYzLDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgInltZnBjaTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMjQzMywxMyArMjQzNSwxNSBAQAogCWNoaXAtPnNyYzQ0MV91c2VkID0gLTE7CiAKIAlpZiAoKGNoaXAtPnJlc19yZWdfYXJlYSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihjaGlwLT5yZWdfYXJlYV9waHlzLCAweDgwMDAsICJZTUZQQ0kiKSkgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBtZW1vcnkgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLCBjaGlwLT5yZWdfYXJlYV9waHlzLCBjaGlwLT5yZWdfYXJlYV9waHlzICsgMHg4MDAwIC0gMSk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInVuYWJsZSB0byBncmFiIG1lbW9yeSByZWdpb24gMHglbHgtMHglbHhcbiIsCisJCQljaGlwLT5yZWdfYXJlYV9waHlzLCBjaGlwLT5yZWdfYXJlYV9waHlzICsgMHg4MDAwIC0gMSk7CiAJCXNuZF95bWZwY2lfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfeW1mcGNpX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF95bWZwY2lfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0yNDUzLDcgKzI0NTcsNyBAQAogCiAJZXJyID0gc25kX3ltZnBjaV9yZXF1ZXN0X2Zpcm13YXJlKGNoaXApOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImZpcm13YXJlIHJlcXVlc3QgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJmaXJtd2FyZSByZXF1ZXN0IGZhaWxlZDogJWRcbiIsIGVycik7CiAJCXNuZF95bWZwY2lfZnJlZShjaGlwKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC0yNDg3LDggKzI0OTEsNiBAQAogCiAJc25kX3ltZnBjaV9wcm9jX2luaXQoY2FyZCwgY2hpcCk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcmNoaXAgPSBjaGlwOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYyBiL3NvdW5kL3BjbWNpYS9wZGF1ZGlvY2YvcGRhdWRpb2NmLmMKaW5kZXggOGY0ODlkZS4uNTZiZGExMiAxMDA2NDQKLS0tIGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYworKysgYi9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5jCkBAIC0xMTIsNyArMTEyLDggQEAKIAkJcmV0dXJuIC1FTk9ERVY7IC8qIGRpc2FibGVkIGV4cGxpY2l0bHkgKi8KIAogCS8qIG9rLCBjcmVhdGUgYSBjYXJkIGluc3RhbmNlICovCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2ldLCBpZFtpXSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmxpbmstPmRldiwgaW5kZXhbaV0sIGlkW2ldLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwZGFjZjogY2Fubm90IGNyZWF0ZSBhIGNhcmQgaW5zdGFuY2VcbiIpOwogCQlyZXR1cm4gZXJyOwpAQCAtMTMxLDggKzEzMiw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmbGluay0+ZGV2KTsKLQogCXBkYWNmLT5pbmRleCA9IGk7CiAJY2FyZF9saXN0W2ldID0gY2FyZDsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNtY2lhL3Z4L3Z4cG9ja2V0LmMgYi9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYwppbmRleCBkNGRiN2VjLi43ODZlN2UxIDEwMDY0NAotLS0gYS9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYworKysgYi9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYwpAQCAtMjM4LDcgKzIzOCw2IEBACiAJCWdvdG8gZmFpbGVkOwogCiAJY2hpcC0+ZGV2ID0gJmxpbmstPmRldjsKLQlzbmRfY2FyZF9zZXRfZGV2KGNoaXAtPmNhcmQsIGNoaXAtPmRldik7CiAKIAlpZiAoc25kX3Z4cG9ja2V0X2Fzc2lnbl9yZXNvdXJjZXMoY2hpcCwgbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0LAogCQkJCQkJbGluay0+aXJxKSA8IDApCkBAIC0zMDcsNyArMzA2LDggQEAKIAkJcmV0dXJuIC1FTk9ERVY7IC8qIGRpc2FibGVkIGV4cGxpY2l0bHkgKi8KIAogCS8qIG9rLCBjcmVhdGUgYSBjYXJkIGluc3RhbmNlICovCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2ldLCBpZFtpXSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBfZGV2LT5kZXYsIGluZGV4W2ldLCBpZFtpXSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAidnhwb2NrZXQ6IGNhbm5vdCBjcmVhdGUgYSBjYXJkIGluc3RhbmNlXG4iKTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9wb3dlcm1hYy5jIGIvc291bmQvcHBjL3Bvd2VybWFjLmMKaW5kZXggOGFiYjUyMS4uMzUwYTdjOGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy9wb3dlcm1hYy5jCisrKyBiL3NvdW5kL3BwYy9wb3dlcm1hYy5jCkBAIC01OCw3ICs1OCw3IEBACiAJY2hhciAqbmFtZV9leHQ7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZkZXZwdHItPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xMjIsOCArMTIyLDYgQEAKIAlpZiAoZW5hYmxlX2JlZXApCiAJCXNuZF9wbWFjX2F0dGFjaF9iZWVwKGNoaXApOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2cHRyLT5kZXYpOwotCiAJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKQogCQlnb3RvIF9fZXJyb3I7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9zbmRfcHMzLmMgYi9zb3VuZC9wcGMvc25kX3BzMy5jCmluZGV4IGViYjc2ZjIuLjU4ZjI5MmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy9zbmRfcHMzLmMKKysrIGIvc291bmQvcHBjL3NuZF9wczMuYwpAQCAtOTg0LDcgKzk4NCw4IEBACiAJfQogCiAJLyogY3JlYXRlIGNhcmQgaW5zdGFuY2UgKi8KLQlyZXQgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJnRoZV9jYXJkLmNhcmQpOworCXJldCA9IHNuZF9jYXJkX25ldygmZGV2LT5jb3JlLCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJnRoZV9jYXJkLmNhcmQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGNsZWFuX2lycTsKIApAQCAtMTA1Miw3ICsxMDUzLDYgQEAKIAlzbmRfcHMzX2luaXRfYXZzZXR0aW5nKCZ0aGVfY2FyZCk7CiAKIAkvKiByZWdpc3RlciB0aGUgY2FyZCAqLwotCXNuZF9jYXJkX3NldF9kZXYodGhlX2NhcmQuY2FyZCwgJmRldi0+Y29yZSk7CiAJcmV0ID0gc25kX2NhcmRfcmVnaXN0ZXIodGhlX2NhcmQuY2FyZCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gY2xlYW5fZG1hX21hcDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NoL2FpY2EuYyBiL3NvdW5kL3NoL2FpY2EuYwppbmRleCA3OGEzNjk3Li40Nzg0OWVhIDEwMDY0NAotLS0gYS9zb3VuZC9zaC9haWNhLmMKKysrIGIvc291bmQvc2gvYWljYS5jCkBAIC02MDgsOCArNjA4LDggQEAKIAlkcmVhbWNhc3RjYXJkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2FpY2EpLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIWRyZWFtY2FzdGNhcmQpKQogCQlyZXR1cm4gLUVOT01FTTsKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIFNORF9BSUNBX0RSSVZFUiwgVEhJU19NT0RVTEUsIDAsCi0JCQkgICAgICAmZHJlYW1jYXN0Y2FyZC0+Y2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZkZXZwdHItPmRldiwgaW5kZXgsIFNORF9BSUNBX0RSSVZFUiwKKwkJCSAgIFRISVNfTU9EVUxFLCAwLCAmZHJlYW1jYXN0Y2FyZC0+Y2FyZCk7CiAJaWYgKHVubGlrZWx5KGVyciA8IDApKSB7CiAJCWtmcmVlKGRyZWFtY2FzdGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtNjI0LDcgKzYyNCw2IEBACiAJZXJyID0gc25kX2FpY2FwY21jaGlwKGRyZWFtY2FzdGNhcmQsIDApOwogCWlmICh1bmxpa2VseShlcnIgPCAwKSkKIAkJZ290byBmcmVlZHJlYW1jYXN0OwotCXNuZF9jYXJkX3NldF9kZXYoZHJlYW1jYXN0Y2FyZC0+Y2FyZCwgJmRldnB0ci0+ZGV2KTsKIAlkcmVhbWNhc3RjYXJkLT50aW1lci5kYXRhID0gMDsKIAlkcmVhbWNhc3RjYXJkLT5jaGFubmVsID0gTlVMTDsKIAkvKiBBZGQgYmFzaWMgY29udHJvbHMgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NoL3NoX2RhY19hdWRpby5jIGIvc291bmQvc2gvc2hfZGFjX2F1ZGlvLmMKaW5kZXggN2M5NDIyYy4uZDFmYjc0ZCAxMDA2NDQKLS0tIGEvc291bmQvc2gvc2hfZGFjX2F1ZGlvLmMKKysrIGIvc291bmQvc2gvc2hfZGFjX2F1ZGlvLmMKQEAgLTM5Niw3ICszOTYsNyBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmRldnB0ci0+ZGV2LCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBhbGxvY2F0ZSB0aGUgY2FyZFxuIik7CiAJCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL0tjb25maWcgYi9zb3VuZC9zb2MvS2NvbmZpZwppbmRleCBkNjJjZTQ4Li4wMDYwYjMxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvS2NvbmZpZwpAQCAtNTAsNiArNTAsNyBAQAogc291cmNlICJzb3VuZC9zb2Mvc2Ftc3VuZy9LY29uZmlnIgogc291cmNlICJzb3VuZC9zb2MvczYwMDAvS2NvbmZpZyIKIHNvdXJjZSAic291bmQvc29jL3NoL0tjb25maWciCitzb3VyY2UgInNvdW5kL3NvYy9zaXJmL0tjb25maWciCiBzb3VyY2UgInNvdW5kL3NvYy9zcGVhci9LY29uZmlnIgogc291cmNlICJzb3VuZC9zb2MvdGVncmEvS2NvbmZpZyIKIHNvdXJjZSAic291bmQvc29jL3R4eDkvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9NYWtlZmlsZSBiL3NvdW5kL3NvYy9NYWtlZmlsZQppbmRleCA2MmExODIyZTcuLjVmMWRmMDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvTWFrZWZpbGUKQEAgLTI3LDYgKzI3LDcgQEAKIG9iai0kKENPTkZJR19TTkRfU09DKQkrPSBzYW1zdW5nLwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IHM2MDAwLwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IHNoLworb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IHNpcmYvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gc3BlYXIvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gdGVncmEvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gdHh4OS8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdG1lbC9LY29uZmlnIGIvc291bmQvc29jL2F0bWVsL0tjb25maWcKaW5kZXggZTYzNGViNy4uNDc4OTYxOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F0bWVsL0tjb25maWcKKysrIGIvc291bmQvc29jL2F0bWVsL0tjb25maWcKQEAgLTU4LDYgKzU4LDYgQEAKIAlkZXBlbmRzIG9uIEFSQ0hfQVQ5MSAmJiBBVE1FTF9TU0MgJiYgQVJDSF9BVDkxICYmIE1BQ0hfQUZFQjkyNjAgJiYgU05EX0FUTUVMX1NPQwogCXNlbGVjdCBTTkRfQVRNRUxfU09DX1BEQwogCXNlbGVjdCBTTkRfQVRNRUxfU09DX1NTQwotCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzCisJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjNfSTJDCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHNvdW5kIG9uIEFGRUI5MjYwIGJvYXJkLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVsL2F0bWVsX3NzY19kYWkuYyBiL3NvdW5kL3NvYy9hdG1lbC9hdG1lbF9zc2NfZGFpLmMKaW5kZXggMWVhZDNjOS4uZGU0MzNjZmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9hdG1lbF9zc2NfZGFpLmMKKysrIGIvc291bmQvc29jL2F0bWVsL2F0bWVsX3NzY19kYWkuYwpAQCAtMzQxLDYgKzM0MSw3IEBACiB7CiAJaW50IGlkID0gZGFpLT5pZDsKIAlzdHJ1Y3QgYXRtZWxfc3NjX2luZm8gKnNzY19wID0gJnNzY19pbmZvW2lkXTsKKwlzdHJ1Y3Qgc3NjX2RldmljZSAqc3NjID0gc3NjX3AtPnNzYzsKIAlzdHJ1Y3QgYXRtZWxfcGNtX2RtYV9wYXJhbXMgKmRtYV9wYXJhbXM7CiAJaW50IGRpciwgY2hhbm5lbHMsIGJpdHM7CiAJdTMyIHRmbXIsIHJmbXIsIHRjbXIsIHJjbXI7CkBAIC00NjYsNyArNDY3LDggQEAKIAkJCXwgU1NDX0JGKFJDTVJfU1RBUlQsIHN0YXJ0X2V2ZW50KQogCQkJfCBTU0NfQkYoUkNNUl9DS0ksIFNTQ19DS0lfUklTSU5HKQogCQkJfCBTU0NfQkYoUkNNUl9DS08sIFNTQ19DS09fTk9ORSkKLQkJCXwgU1NDX0JGKFJDTVJfQ0tTLCBTU0NfQ0tTX0NMT0NLKTsKKwkJCXwgU1NDX0JGKFJDTVJfQ0tTLCBzc2MtPmNsa19mcm9tX3JrX3BpbiA/CisJCQkJCSAgIFNTQ19DS1NfUElOIDogU1NDX0NLU19DTE9DSyk7CiAKIAkJcmZtciA9CSAgU1NDX0JGKFJGTVJfRlNFREdFLCBTU0NfRlNFREdFX1BPU0lUSVZFKQogCQkJfCBTU0NfQkYoUkZNUl9GU09TLCBTU0NfRlNPU19OT05FKQpAQCAtNDgxLDcgKzQ4Myw4IEBACiAJCQl8IFNTQ19CRihUQ01SX1NUQVJULCBzdGFydF9ldmVudCkKIAkJCXwgU1NDX0JGKFRDTVJfQ0tJLCBTU0NfQ0tJX0ZBTExJTkcpCiAJCQl8IFNTQ19CRihUQ01SX0NLTywgU1NDX0NLT19OT05FKQotCQkJfCBTU0NfQkYoVENNUl9DS1MsIFNTQ19DS1NfUElOKTsKKwkJCXwgU1NDX0JGKFRDTVJfQ0tTLCBzc2MtPmNsa19mcm9tX3JrX3BpbiA/CisJCQkJCSAgIFNTQ19DS1NfQ0xPQ0sgOiBTU0NfQ0tTX1BJTik7CiAKIAkJdGZtciA9CSAgU1NDX0JGKFRGTVJfRlNFREdFLCBTU0NfRlNFREdFX1BPU0lUSVZFKQogCQkJfCBTU0NfQkYoVEZNUl9GU0RFTiwgMCkKQEAgLTU1MCw3ICs1NTMsOCBAQAogCQkJfCBTU0NfQkYoUkNNUl9TVEFSVCwgU1NDX1NUQVJUX1JJU0lOR19SRikKIAkJCXwgU1NDX0JGKFJDTVJfQ0tJLCBTU0NfQ0tJX1JJU0lORykKIAkJCXwgU1NDX0JGKFJDTVJfQ0tPLCBTU0NfQ0tPX05PTkUpCi0JCQl8IFNTQ19CRihSQ01SX0NLUywgU1NDX0NLU19QSU4pOworCQkJfCBTU0NfQkYoUkNNUl9DS1MsIHNzYy0+Y2xrX2Zyb21fcmtfcGluID8KKwkJCQkJICAgU1NDX0NLU19QSU4gOiBTU0NfQ0tTX0NMT0NLKTsKIAogCQlyZm1yID0JICBTU0NfQkYoUkZNUl9GU0VER0UsIFNTQ19GU0VER0VfUE9TSVRJVkUpCiAJCQl8IFNTQ19CRihSRk1SX0ZTT1MsIFNTQ19GU09TX05PTkUpCkBAIC01NjUsNyArNTY5LDggQEAKIAkJCXwgU1NDX0JGKFRDTVJfU1RBUlQsIFNTQ19TVEFSVF9SSVNJTkdfUkYpCiAJCQl8IFNTQ19CRihUQ01SX0NLSSwgU1NDX0NLSV9GQUxMSU5HKQogCQkJfCBTU0NfQkYoVENNUl9DS08sIFNTQ19DS09fTk9ORSkKLQkJCXwgU1NDX0JGKFRDTVJfQ0tTLCBTU0NfQ0tTX1BJTik7CisJCQl8IFNTQ19CRihSQ01SX0NLUywgc3NjLT5jbGtfZnJvbV9ya19waW4gPworCQkJCQkgICBTU0NfQ0tTX0NMT0NLIDogU1NDX0NLU19QSU4pOwogCiAJCXRmbXIgPQkgIFNTQ19CRihURk1SX0ZTRURHRSwgU1NDX0ZTRURHRV9QT1NJVElWRSkKIAkJCXwgU1NDX0JGKFRGTVJfRlNERU4sIDApCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvc2FtOWcyMF93bTg3MzEuYyBiL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jCmluZGV4IGYxNWJmZjEuLjE3NGJkNTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jCkBAIC0xNTUsMjUgKzE1NSwxNCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCS8qIEFkZCBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBhdDkxc2FtOWcyMGVrX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUoYXQ5MXNhbTlnMjBla19kYXBtX3dpZGdldHMpKTsKLQkvKiBTZXQgdXAgc3BlY2lmaWMgYXVkaW8gcGF0aCBpbnRlcmNvbm5lY3RzICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKLQogCS8qIG5vdCBjb25uZWN0ZWQgKi8KIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJSTElORUlOIik7CiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTExJTkVJTiIpOwogCi0jaWZkZWYgRU5BQkxFX01JQ19JTlBVVAotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJJbnQgTWljIik7Ci0jZWxzZQotCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkludCBNaWMiKTsKKyNpZm5kZWYgRU5BQkxFX01JQ19JTlBVVAorCXNuZF9zb2NfZGFwbV9uY19waW4oJnJ0ZC0+Y2FyZC0+ZGFwbSwgIkludCBNaWMiKTsKICNlbmRpZgogCi0JLyogYWx3YXlzIGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgU3BrIik7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTk0LDYgKzE4MywxMSBAQAogCS5kYWlfbGluayA9ICZhdDkxc2FtOWcyMGVrX2RhaSwKIAkubnVtX2xpbmtzID0gMSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBhdDkxc2FtOWcyMGVrX3NldF9iaWFzX2xldmVsLAorCisJLmRhcG1fd2lkZ2V0cyA9IGF0OTFzYW05ZzIwZWtfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhdDkxc2FtOWcyMGVrX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gaW50ZXJjb24sCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoaW50ZXJjb24pLAogfTsKIAogc3RhdGljIGludCBhdDkxc2FtOWcyMGVrX2F1ZGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYmxhY2tmaW4vS2NvbmZpZyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9LY29uZmlnCmluZGV4IDQ1NDRkOGUuLjYzNDdkNTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9ibGFja2Zpbi9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9LY29uZmlnCkBAIC0xNCw3ICsxNCw4IEBACiAJZGVwZW5kcyBvbiBTTkRfQkY1WFhfSTJTICYmIFNORF9TT0NfSTJDX0FORF9TUEkKIAlzZWxlY3QgU05EX0JGNVhYX1NPQ19JMlMgaWYgIUJGNjB4CiAJc2VsZWN0IFNORF9CRjZYWF9TT0NfSTJTIGlmIEJGNjB4Ci0Jc2VsZWN0IFNORF9TT0NfU1NNMjYwMgorCXNlbGVjdCBTTkRfU09DX1NTTTI2MDJfU1BJIGlmIFNQSV9NQVNURVIKKwlzZWxlY3QgU05EX1NPQ19TU00yNjAyX0kyQyBpZiBJMkMKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgdGhlIEFuYWxvZyBEZXZpY2VzCiAJICBTU00yNjAyIEF1ZGlvIENvZGVjIEFkZC1PbiBDYXJkLgpAQCAtNDYsNyArNDcsOCBAQAogCXRyaXN0YXRlICJTdXBwb3J0IGZvciB0aGUgRVZBTC1BREFWODBYIGJvYXJkcyBvbiBCbGFja2ZpbiBldmFsIGJvYXJkcyIKIAlkZXBlbmRzIG9uIFNORF9CRjVYWF9JMlMgJiYgU05EX1NPQ19JMkNfQU5EX1NQSQogCXNlbGVjdCBTTkRfQkY1WFhfU09DX0kyUwotCXNlbGVjdCBTTkRfU09DX0FEQVY4MFgKKwlzZWxlY3QgU05EX1NPQ19BREFWODAxIGlmIFNQSV9NQVNURVIKKwlzZWxlY3QgU05EX1NPQ19BREFWODAzIGlmIEkyQwogCWhlbHAKIAkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciB0aGUgQW5hbG9nIERldmljZXMgRVZBTC1BREFWODAxIG9yCiAJICBFVkFMLUFEQVY4MDMgYm9hcmQgY29ubmVjdGVkIHRvIG9uZSBvZiB0aGUgQmxhY2tmaW4gZXZhbHVhdGlvbiBib2FyZHMKQEAgLTY3LDcgKzY5LDggQEAKIAl0cmlzdGF0ZSAiU29DIEFEMTkzWCBBdWRpbyBzdXBwb3J0IGZvciBCbGFja2ZpbiIKIAlkZXBlbmRzIG9uIFNORF9CRjVYWF9JMlMgJiYgU05EX1NPQ19JMkNfQU5EX1NQSQogCXNlbGVjdCBTTkRfQkY1WFhfU09DX0kyUwotCXNlbGVjdCBTTkRfU09DX0FEMTkzWAorCXNlbGVjdCBTTkRfU09DX0FEMTkzWF9JMkMgaWYgSTJDCisJc2VsZWN0IFNORF9TT0NfQUQxOTNYX1NQSSBpZiBTUElfTUFTVEVSCiAJaGVscAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIEFEMTkzWCBjb2RlYyBvbiBCbGFja2Zpbi4KIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIEFEMTkzNiwgQUQxOTM3LCBBRDE5MzggYW5kIEFEMTkzOS4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jaXJydXMvS2NvbmZpZyBiL3NvdW5kL3NvYy9jaXJydXMvS2NvbmZpZwppbmRleCAwNmY5MzhkLi41NDc3YzU0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY2lycnVzL0tjb25maWcKKysrIGIvc291bmQvc29jL2NpcnJ1cy9LY29uZmlnCkBAIC0xLDYgKzEsNiBAQAogY29uZmlnIFNORF9FUDkzWFhfU09DCiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciB0aGUgQ2lycnVzIExvZ2ljIEVQOTN4eCBzZXJpZXMiCi0JZGVwZW5kcyBvbiAoQVJDSF9FUDkzWFggfHwgQ09NUElMRV9URVNUKSAmJiBTTkRfU09DCisJZGVwZW5kcyBvbiBBUkNIX0VQOTNYWCB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgU05EX1NPQ19HRU5FUklDX0RNQUVOR0lORV9QQ00KIAloZWxwCiAJICBTYXkgWSBvciBNIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBjb2RlY3MgYXR0YWNoZWQgdG8KQEAgLTE4LDcgKzE4LDcgQEAKICAgICAgICAgdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBCbHVld2F0ZXIgU3lzdGVtcyBTbmFwcGVyIENMMTUgbW9kdWxlIgogICAgICAgICBkZXBlbmRzIG9uIFNORF9FUDkzWFhfU09DICYmIE1BQ0hfU05BUFBFUl9DTDE1CiAgICAgICAgIHNlbGVjdCBTTkRfRVA5M1hYX1NPQ19JMlMKLSAgICAgICAgc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjMKKyAgICAgICAgc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjNfSTJDCiAgICAgICAgIGhlbHAKICAgICAgICAgICBTYXkgWSBvciBNIGhlcmUgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIEkyUyBhdWRpbyBvbiB0aGUKICAgICAgICAgICBCbHVld2F0ZXIgU3lzdGVtcyBTbmFwcGVyIENMMTUgbW9kdWxlLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NpcnJ1cy9zbmFwcGVyY2wxNS5jIGIvc291bmQvc29jL2NpcnJ1cy9zbmFwcGVyY2wxNS5jCmluZGV4IDI5MjM4YTcuLjViNjhiMTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jaXJydXMvc25hcHBlcmNsMTUuYworKysgYi9zb3VuZC9zb2MvY2lycnVzL3NuYXBwZXJjbDE1LmMKQEAgLTY1LDE4ICs2NSw2IEBACiAJeyJNSUNJTiIsIE5VTEwsICJNaWMgSmFjayJ9LAogfTsKIAotc3RhdGljIGludCBzbmFwcGVyY2wxNV90bHYzMjBhaWMyM19pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUodGx2MzIwYWljMjNfZGFwbV93aWRnZXRzKSk7Ci0KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBzbmFwcGVyY2wxNV9kYWkgPSB7CiAJLm5hbWUJCT0gInRsdjMyMGFpYzIzIiwKIAkuc3RyZWFtX25hbWUJPSAiQUlDMjMiLApAQCAtODQsNyArNzIsNiBAQAogCS5jb2RlY19kYWlfbmFtZQk9ICJ0bHYzMjBhaWMyMy1oaWZpIiwKIAkuY29kZWNfbmFtZQk9ICJ0bHYzMjBhaWMyMy1jb2RlYy4wLTAwMWEiLAogCS5wbGF0Zm9ybV9uYW1lCT0gImVwOTN4eC1pMnMiLAotCS5pbml0CQk9IHNuYXBwZXJjbDE1X3RsdjMyMGFpYzIzX2luaXQsCiAJLmRhaV9mbXQJPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9OQl9JRiB8CiAJCQkgIFNORF9TT0NfREFJRk1UX0NCU19DRlMsCiAJLm9wcwkJPSAmc25hcHBlcmNsMTVfb3BzLApAQCAtOTUsNiArODIsMTEgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRhaV9saW5rCT0gJnNuYXBwZXJjbDE1X2RhaSwKIAkubnVtX2xpbmtzCT0gMSwKKworCS5kYXBtX3dpZGdldHMJCT0gdGx2MzIwYWljMjNfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh0bHYzMjBhaWMyM19kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcwkJPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBpbnQgc25hcHBlcmNsMTVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvODhwbTg2MHgtY29kZWMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvODhwbTg2MHgtY29kZWMuYwppbmRleCA2NDdhNzJjLi5iMDdlMTcxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzLzg4cG04NjB4LWNvZGVjLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy84OHBtODYweC1jb2RlYy5jCkBAIC00NDgsMzggKzQ0OCwzOCBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqcG04NjB4X3BhX3RleHRzW10gPSB7Ii0zMyUiLCAiMCUiLCAiMzMlIiwgIjY2JSJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9oczFfb3BhbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9IUzFfQ1RSTCwgNSwgNCwgcG04NjB4X29wYW1wX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfaHMxX29wYW1wX2VudW0sCisJCQkgICAgUE04NjBYX0hTMV9DVFJMLCA1LCBwbTg2MHhfb3BhbXBfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9oczJfb3BhbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9IUzJfQ1RSTCwgNSwgNCwgcG04NjB4X29wYW1wX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfaHMyX29wYW1wX2VudW0sCisJCQkgICAgUE04NjBYX0hTMl9DVFJMLCA1LCBwbTg2MHhfb3BhbXBfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9oczFfcGFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9IUzFfQ1RSTCwgMywgNCwgcG04NjB4X3BhX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfaHMxX3BhX2VudW0sCisJCQkgICAgUE04NjBYX0hTMV9DVFJMLCAzLCBwbTg2MHhfcGFfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9oczJfcGFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9IUzJfQ1RSTCwgMywgNCwgcG04NjB4X3BhX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfaHMyX3BhX2VudW0sCisJCQkgICAgUE04NjBYX0hTMl9DVFJMLCAzLCBwbTg2MHhfcGFfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9sbzFfb3BhbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9MTzFfQ1RSTCwgNSwgNCwgcG04NjB4X29wYW1wX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfbG8xX29wYW1wX2VudW0sCisJCQkgICAgUE04NjBYX0xPMV9DVFJMLCA1LCBwbTg2MHhfb3BhbXBfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9sbzJfb3BhbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9MTzJfQ1RSTCwgNSwgNCwgcG04NjB4X29wYW1wX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfbG8yX29wYW1wX2VudW0sCisJCQkgICAgUE04NjBYX0xPMl9DVFJMLCA1LCBwbTg2MHhfb3BhbXBfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9sbzFfcGFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9MTzFfQ1RSTCwgMywgNCwgcG04NjB4X3BhX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfbG8xX3BhX2VudW0sCisJCQkgICAgUE04NjBYX0xPMV9DVFJMLCAzLCBwbTg2MHhfcGFfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9sbzJfcGFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9MTzJfQ1RSTCwgMywgNCwgcG04NjB4X3BhX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfbG8yX3BhX2VudW0sCisJCQkgICAgUE04NjBYX0xPMl9DVFJMLCAzLCBwbTg2MHhfcGFfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9zcGtfcGFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9FQVJfQ1RSTF8xLCA1LCA0LCBwbTg2MHhfcGFfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHBtODYweF9zcGtfcGFfZW51bSwKKwkJCSAgICBQTTg2MFhfRUFSX0NUUkxfMSwgNSwgcG04NjB4X3BhX3RleHRzKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBwbTg2MHhfZWFyX3BhX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfRUFSX0NUUkxfMiwgMCwgNCwgcG04NjB4X3BhX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfZWFyX3BhX2VudW0sCisJCQkgICAgUE04NjBYX0VBUl9DVFJMXzIsIDAsIHBtODYweF9wYV90ZXh0cyk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcG04NjB4X3Nwa19lYXJfb3BhbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9FQVJfQ1RSTF8xLCAzLCA0LCBwbTg2MHhfb3BhbXBfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHBtODYweF9zcGtfZWFyX29wYW1wX2VudW0sCisJCQkgICAgUE04NjBYX0VBUl9DVFJMXzEsIDMsIHBtODYweF9vcGFtcF90ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwbTg2MHhfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX0RPVUJMRV9SX1RMVigiQURDIENhcHR1cmUgVm9sdW1lIiwgUE04NjBYX0FEQ19BTkFfMiwKQEAgLTU2MSw4ICs1NjEsOCBAQAogCSJQQ00gTCIsICJQQ00gUiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFpZjFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9QQ01fSUZBQ0VfMywgNiwgMiwgYWlmMV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWYxX2VudW0sCisJCQkgICAgUE04NjBYX1BDTV9JRkFDRV8zLCA2LCBhaWYxX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmMV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlBDTSBNdXgiLCBhaWYxX2VudW0pOwpAQCAtNTcyLDggKzU3Miw4IEBACiAJIkRJTiIsICJESU4xIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaTJzX2Rpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoUE04NjBYX0kyU19JRkFDRV8zLCAxLCAyLCBpMnNfZGluX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGkyc19kaW5fZW51bSwKKwkJCSAgICBQTTg2MFhfSTJTX0lGQUNFXzMsIDEsIGkyc19kaW5fdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpMnNfZGluX211eCA9CiAJU09DX0RBUE1fRU5VTSgiSTJTIERJTiBNdXgiLCBpMnNfZGluX2VudW0pOwpAQCAtNTgzLDggKzU4Myw4IEBACiAJIkV4IFBBIiwgIkFEQyIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGkyc19taWNfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9JMlNfSUZBQ0VfMywgNCwgMiwgaTJzX21pY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChpMnNfbWljX2VudW0sCisJCQkgICAgUE04NjBYX0kyU19JRkFDRV8zLCA0LCBpMnNfbWljX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaTJzX21pY19tdXggPQogCVNPQ19EQVBNX0VOVU0oIkkyUyBNaWMgTXV4IiwgaTJzX21pY19lbnVtKTsKQEAgLTU5NCw4ICs1OTQsOCBAQAogCSJBRENSIiwgIkFEQ0wiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfUENNX0lGQUNFXzMsIDQsIDIsIGFkY2xfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRjbF9lbnVtLAorCQkJICAgIFBNODYwWF9QQ01fSUZBQ0VfMywgNCwgYWRjbF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY2xfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBREMgTGVmdCBNdXgiLCBhZGNsX2VudW0pOwpAQCAtNjA1LDggKzYwNSw4IEBACiAJIkFEQ0wiLCAiQURDUiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkY3JfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9QQ01fSUZBQ0VfMywgMiwgMiwgYWRjcl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGNyX2VudW0sCisJCQkgICAgUE04NjBYX1BDTV9JRkFDRV8zLCAyLCBhZGNyX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjcl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkFEQyBSaWdodCBNdXgiLCBhZGNyX2VudW0pOwpAQCAtNjE2LDggKzYxNiw4IEBACiAJIkFEQ1IiLCAiRUMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNyX2VjX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQURDX0VOXzIsIDMsIDIsIGFkY3JfZWNfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRjcl9lY19lbnVtLAorCQkJICAgIFBNODYwWF9BRENfRU5fMiwgMywgYWRjcl9lY190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY3JfZWNfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBRENSIEVDIE11eCIsIGFkY3JfZWNfZW51bSk7CkBAIC02MjcsOCArNjI3LDggQEAKIAkiTGVmdCIsICJSaWdodCIsICJMZWZ0ICsgUmlnaHQiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBlY19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoUE04NjBYX0VDX1BBVEgsIDEsIDMsIGVjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVjX2VudW0sCisJCQkgICAgUE04NjBYX0VDX1BBVEgsIDEsIGVjX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZWNfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJFQyBNdXgiLCBlY19lbnVtKTsKQEAgLTYzOCwzNiArNjM4LDM2IEBACiB9OwogCiAvKiBEQUMgSGVhZHNldCAxIE11eCAvIE11eDEwICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19oczFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9BTkFfSU5QVVRfU0VMXzEsIDAsIDQsIGRhY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYWNfaHMxX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9JTlBVVF9TRUxfMSwgMCwgZGFjX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGFjX2hzMV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkRBQyBIUzEgTXV4IiwgZGFjX2hzMV9lbnVtKTsKIAogLyogREFDIEhlYWRzZXQgMiBNdXggLyBNdXgxMSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYWNfaHMyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQU5BX0lOUFVUX1NFTF8xLCAyLCA0LCBkYWNfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGFjX2hzMl9lbnVtLAorCQkJICAgIFBNODYwWF9BTkFfSU5QVVRfU0VMXzEsIDIsIGRhY190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhY19oczJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJEQUMgSFMyIE11eCIsIGRhY19oczJfZW51bSk7CiAKIC8qIERBQyBMaW5lb3V0IDEgTXV4IC8gTXV4MTIgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjX2xvMV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoUE04NjBYX0FOQV9JTlBVVF9TRUxfMSwgNCwgNCwgZGFjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhY19sbzFfZW51bSwKKwkJCSAgICBQTTg2MFhfQU5BX0lOUFVUX1NFTF8xLCA0LCBkYWNfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYWNfbG8xX211eCA9CiAJU09DX0RBUE1fRU5VTSgiREFDIExPMSBNdXgiLCBkYWNfbG8xX2VudW0pOwogCiAvKiBEQUMgTGluZW91dCAyIE11eCAvIE11eDEzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19sbzJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9BTkFfSU5QVVRfU0VMXzEsIDYsIDQsIGRhY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYWNfbG8yX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9JTlBVVF9TRUxfMSwgNiwgZGFjX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGFjX2xvMl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkRBQyBMTzIgTXV4IiwgZGFjX2xvMl9lbnVtKTsKIAogLyogREFDIFNwZWFya2VyIEVhcnBob25lIE11eCAvIE11eDE0ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19zcGtfZWFyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQU5BX0lOUFVUX1NFTF8yLCAwLCA0LCBkYWNfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGFjX3Nwa19lYXJfZW51bSwKKwkJCSAgICBQTTg2MFhfQU5BX0lOUFVUX1NFTF8yLCAwLCBkYWNfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYWNfc3BrX2Vhcl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkRBQyBTUCBNdXgiLCBkYWNfc3BrX2Vhcl9lbnVtKTsKQEAgLTY3NywyOSArNjc3LDI5IEBACiAJIkRpZ2l0YWwiLCAiQW5hbG9nIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaHMxX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQU5BX1RPX0FOQSwgMCwgMiwgaW5fdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaHMxX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9UT19BTkEsIDAsIGluX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaHMxX211eCA9CiAJU09DX0RBUE1fRU5VTSgiSGVhZHNldDEgTXV4IiwgaHMxX2VudW0pOwogCiAvKiBIZWFkc2V0IDIgTXV4IC8gTXV4MTYgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaHMyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQU5BX1RPX0FOQSwgMSwgMiwgaW5fdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaHMyX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9UT19BTkEsIDEsIGluX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaHMyX211eCA9CiAJU09DX0RBUE1fRU5VTSgiSGVhZHNldDIgTXV4IiwgaHMyX2VudW0pOwogCiAvKiBMaW5lb3V0IDEgTXV4IC8gTXV4MTcgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbG8xX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQU5BX1RPX0FOQSwgMiwgMiwgaW5fdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobG8xX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9UT19BTkEsIDIsIGluX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbG8xX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTGluZW91dDEgTXV4IiwgbG8xX2VudW0pOwogCiAvKiBMaW5lb3V0IDIgTXV4IC8gTXV4MTggKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbG8yX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQU5BX1RPX0FOQSwgMywgMiwgaW5fdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobG8yX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9UT19BTkEsIDMsIGluX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbG8yX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTGluZW91dDIgTXV4IiwgbG8yX2VudW0pOwpAQCAtNzA5LDggKzcwOSw4IEBACiAJIkVhcnBpZWNlIiwgIlNwZWFrZXIiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzcGtfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9BTkFfVE9fQU5BLCA2LCAyLCBzcGtfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BrX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9UT19BTkEsIDYsIHNwa190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwa19kZW11eCA9CiAJU09DX0RBUE1fRU5VTSgiU3BlYWtlciBFYXJwaWVjZSBEZW11eCIsIHNwa19lbnVtKTsKQEAgLTcyMCw4ICs3MjAsOCBAQAogCSJNaWMgMSIsICJNaWMgMiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1pY19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoUE04NjBYX0FEQ19BTkFfNCwgNCwgMiwgbWljX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1pY19lbnVtLAorCQkJICAgIFBNODYwWF9BRENfQU5BXzQsIDQsIG1pY190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1pY19tdXggPQogCVNPQ19EQVBNX0VOVU0oIk1JQyBNdXgiLCBtaWNfZW51bSk7CkBAIC0xMzI3LDggKzEzMjcsNyBAQAogCiAJcG04NjB4LT5jb2RlYyA9IGNvZGVjOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHBtODYweC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAwLCAwLCBTTkRfU09DX1JFR01BUCk7CisJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIHBtODYweC0+cmVnbWFwKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKaW5kZXggOTgzZDA4N2EuLmYwZTg0MDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKQEAgLTgsNiArOCw4IEBACiAJZGVmYXVsdCB5IGlmIEkyQz15CiAJZGVmYXVsdCB5IGlmIFNQSV9NQVNURVI9eQogCittZW51ICJDT0RFQyBkcml2ZXJzIgorCiBjb25maWcgU05EX1NPQ19BTExfQ09ERUNTCiAJdHJpc3RhdGUgIkJ1aWxkIGFsbCBBU29DIENPREVDIGRyaXZlcnMiCiAJZGVwZW5kcyBvbiBDT01QSUxFX1RFU1QKQEAgLTE2LDE1ICsxOCwyMCBAQAogCXNlbGVjdCBTTkRfU09DX0FCODUwMF9DT0RFQyBpZiBBQlg1MDBfQ09SRQogCXNlbGVjdCBTTkRfU09DX0FDOTdfQ09ERUMgaWYgU05EX1NPQ19BQzk3X0JVUwogCXNlbGVjdCBTTkRfU09DX0FEMTgzNiBpZiBTUElfTUFTVEVSCi0Jc2VsZWN0IFNORF9TT0NfQUQxOTNYIGlmIFNORF9TT0NfSTJDX0FORF9TUEkKKwlzZWxlY3QgU05EX1NPQ19BRDE5M1hfU1BJIGlmIFNQSV9NQVNURVIKKwlzZWxlY3QgU05EX1NPQ19BRDE5M1hfSTJDIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX0FEMTk4MCBpZiBTTkRfU09DX0FDOTdfQlVTCiAJc2VsZWN0IFNORF9TT0NfQUQ3MzMxMQogCXNlbGVjdCBTTkRfU09DX0FEQVUxMzczIGlmIEkyQwotCXNlbGVjdCBTTkRfU09DX0FEQVY4MFggaWYgU05EX1NPQ19JMkNfQU5EX1NQSQorCXNlbGVjdCBTTkRfU09DX0FEQVY4MDEgaWYgU1BJX01BU1RFUgorCXNlbGVjdCBTTkRfU09DX0FEQVY4MDMgaWYgSTJDCisJc2VsZWN0IFNORF9TT0NfQURBVTE5NzdfU1BJIGlmIFNQSV9NQVNURVIKKwlzZWxlY3QgU05EX1NPQ19BREFVMTk3N19JMkMgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfQURBVTE3MDEgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfQURTMTE3WAogCXNlbGVjdCBTTkRfU09DX0FLNDEwNCBpZiBTUElfTUFTVEVSCiAJc2VsZWN0IFNORF9TT0NfQUs0NTM1IGlmIEkyQworCXNlbGVjdCBTTkRfU09DX0FLNDU1NAogCXNlbGVjdCBTTkRfU09DX0FLNDY0MSBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19BSzQ2NDIgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfQUs0NjcxIGlmIEkyQwpAQCAtMzcsNiArNDQsNyBAQAogCXNlbGVjdCBTTkRfU09DX0NTNDJMNzMgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfQ1M0MjcwIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX0NTNDI3MSBpZiBTTkRfU09DX0kyQ19BTkRfU1BJCisJc2VsZWN0IFNORF9TT0NfQ1M0MlhYOF9JMkMgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfQ1gyMDQ0MiBpZiBUVFkKIAlzZWxlY3QgU05EX1NPQ19EQTcyMTAgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfREE3MjEzIGlmIEkyQwpAQCAtNTksMjAgKzY3LDI2IEBACiAJc2VsZWN0IFNORF9TT0NfUENNMTY4MSBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19QQ00xNzkyQSBpZiBTUElfTUFTVEVSCiAJc2VsZWN0IFNORF9TT0NfUENNMzAwOAorCXNlbGVjdCBTTkRfU09DX1BDTTUxMnhfSTJDIGlmIEkyQworCXNlbGVjdCBTTkRfU09DX1BDTTUxMnhfU1BJIGlmIFNQSV9NQVNURVIKIAlzZWxlY3QgU05EX1NPQ19SVDU2MzEgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfUlQ1NjQwIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1NHVEw1MDAwIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1NJNDc2WCBpZiBNRkRfU0k0NzZYX0NPUkUKKwlzZWxlY3QgU05EX1NPQ19TSVJGX0FVRElPX0NPREVDCiAJc2VsZWN0IFNORF9TT0NfU045NTAzMSBpZiBJTlRFTF9TQ1VfSVBDCiAJc2VsZWN0IFNORF9TT0NfU1BESUYKIAlzZWxlY3QgU05EX1NPQ19TU00yNTE4IGlmIEkyQwotCXNlbGVjdCBTTkRfU09DX1NTTTI2MDIgaWYgU05EX1NPQ19JMkNfQU5EX1NQSQorCXNlbGVjdCBTTkRfU09DX1NTTTI2MDJfU1BJIGlmIFNQSV9NQVNURVIKKwlzZWxlY3QgU05EX1NPQ19TU00yNjAyX0kyQyBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19TVEEzMlggaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfU1RBNTI5IGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1NUQUM5NzY2IGlmIFNORF9TT0NfQUM5N19CVVMKIAlzZWxlY3QgU05EX1NPQ19UQVM1MDg2IGlmIEkyQwotCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzIGlmIEkyQworCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzX0kyQyBpZiBJMkMKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyM19TUEkgaWYgU1BJX01BU1RFUgogCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzI2IGlmIFNQSV9NQVNURVIKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMzMVhYIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzMyWDQgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDM1ggaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfVFBBNjEzMEEyIGlmIEkyQwpAQCAtMTgyLDYgKzE5NiwxNCBAQAogY29uZmlnIFNORF9TT0NfQUQxOTNYCiAJdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfQUQxOTNYX1NQSQorCXRyaXN0YXRlCisJc2VsZWN0IFNORF9TT0NfQUQxOTNYCisKK2NvbmZpZyBTTkRfU09DX0FEMTkzWF9JMkMKKwl0cmlzdGF0ZQorCXNlbGVjdCBTTkRfU09DX0FEMTkzWAorCiBjb25maWcgU05EX1NPQ19BRDE5ODAKIAl0cmlzdGF0ZQogCkBAIC0xODksNDEgKzIxMSw2NiBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX0FEQVUxNzAxCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFEQVUxNzAxIENPREVDIgorCWRlcGVuZHMgb24gSTJDCiAJc2VsZWN0IFNORF9TT0NfU0lHTUFEU1AKLQl0cmlzdGF0ZQogCiBjb25maWcgU05EX1NPQ19BREFVMTM3MwogCXRyaXN0YXRlCiAKK2NvbmZpZyBTTkRfU09DX0FEQVUxOTc3CisJdHJpc3RhdGUKKworY29uZmlnIFNORF9TT0NfQURBVTE5NzdfU1BJCisJdHJpc3RhdGUKKwlzZWxlY3QgU05EX1NPQ19BREFVMTk3NworCXNlbGVjdCBSRUdNQVBfU1BJCisKK2NvbmZpZyBTTkRfU09DX0FEQVUxOTc3X0kyQworCXRyaXN0YXRlCisJc2VsZWN0IFNORF9TT0NfQURBVTE5NzcKKwlzZWxlY3QgUkVHTUFQX0kyQworCiBjb25maWcgU05EX1NPQ19BREFWODBYCiAJdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfQURBVjgwMQorCXRyaXN0YXRlCisJc2VsZWN0IFNORF9TT0NfQURBVjgwWAorCitjb25maWcgU05EX1NPQ19BREFWODAzCisJdHJpc3RhdGUKKwlzZWxlY3QgU05EX1NPQ19BREFWODBYCisKIGNvbmZpZyBTTkRfU09DX0FEUzExN1gKIAl0cmlzdGF0ZQogCiBjb25maWcgU05EX1NPQ19BSzQxMDQKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJBS00gQUs0MTA0IENPREVDIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUgogCiBjb25maWcgU05EX1NPQ19BSzQ1MzUKIAl0cmlzdGF0ZQogCiBjb25maWcgU05EX1NPQ19BSzQ1NTQKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJBS00gQUs0NTU0IENPREVDIgogCiBjb25maWcgU05EX1NPQ19BSzQ2NDEKIAl0cmlzdGF0ZQogCiBjb25maWcgU05EX1NPQ19BSzQ2NDIKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJBS00gQUs0NjQyIENPREVDIgorCWRlcGVuZHMgb24gSTJDCiAKIGNvbmZpZyBTTkRfU09DX0FLNDY3MQogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX0FLNTM4NgotCXRyaXN0YXRlCisJdHJpc3RhdGUgIkFLTSBBSzU2MzggQ09ERUMiCiAKIGNvbmZpZyBTTkRfU09DX0FMQzU2MjMKICAgICAgICB0cmlzdGF0ZQorCiBjb25maWcgU05EX1NPQ19BTEM1NjMyCiAJdHJpc3RhdGUKIApAQCAtMjM0LDE0ICsyODEsMTcgQEAKIAl0cmlzdGF0ZQogCiBjb25maWcgU05EX1NPQ19DUzQyTDUyCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiQ2lycnVzIExvZ2ljIENTNDJMNTIgQ09ERUMiCisJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNORF9TT0NfQ1M0Mkw3MwotCXRyaXN0YXRlCisJdHJpc3RhdGUgIkNpcnJ1cyBMb2dpYyBDUzQyTDczIENPREVDIgorCWRlcGVuZHMgb24gSTJDCiAKICMgQ2lycnVzIExvZ2ljIENTNDI3MCBDb2RlYwogY29uZmlnIFNORF9TT0NfQ1M0MjcwCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiQ2lycnVzIExvZ2ljIENTNDI3MCBDT0RFQyIKKwlkZXBlbmRzIG9uIEkyQwogCiAjIENpcnJ1cyBMb2dpYyBDUzQyNzAgQ29kZWMgVkQgPSAzLjNWIEVycmF0YQogIyBTZWxlY3QgaWYgeW91IGFyZSBhZmZlY3RlZCBieSB0aGUgZXJyYXRhIHdoZXJlIHRoZSBwYXJ0IHdpbGwgbm90IGZ1bmN0aW9uCkBAIC0yNTIsOCArMzAyLDE4IEBACiAJZGVwZW5kcyBvbiBTTkRfU09DX0NTNDI3MAogCiBjb25maWcgU05EX1NPQ19DUzQyNzEKKwl0cmlzdGF0ZSAiQ2lycnVzIExvZ2ljIENTNDI3MSBDT0RFQyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKKworY29uZmlnIFNORF9TT0NfQ1M0MlhYOAogCXRyaXN0YXRlCiAKK2NvbmZpZyBTTkRfU09DX0NTNDJYWDhfSTJDCisJdHJpc3RhdGUgIkNpcnJ1cyBMb2dpYyBDUzQyNDQ4L0NTNDI4ODggQ09ERUMgKEkyQykiCisJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgU05EX1NPQ19DUzQyWFg4CisJc2VsZWN0IFJFR01BUF9JMkMKKwogY29uZmlnIFNORF9TT0NfQ1gyMDQ0MgogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBUVFkKQEAgLTI4Myw2ICszNDMsOSBAQAogY29uZmlnIFNORF9TT0NfRE1JQwogCXRyaXN0YXRlCiAKK2NvbmZpZyBTTkRfU09DX0hETUlfQ09ERUMKKyAgICAgICB0cmlzdGF0ZSAiSERNSSBzdHViIENPREVDIgorCiBjb25maWcgU05EX1NPQ19JU0FCRUxMRQogICAgICAgICB0cmlzdGF0ZQogCkBAIC0zMDEsMTggKzM2NCwzMiBAQAogY29uZmlnIFNORF9TT0NfTUFYOTg1MAogCXRyaXN0YXRlCiAKLWNvbmZpZyBTTkRfU09DX0hETUlfQ09ERUMKLSAgICAgICB0cmlzdGF0ZQotCiBjb25maWcgU05EX1NPQ19QQ00xNjgxCi0gICAgICAgdHJpc3RhdGUKKwl0cmlzdGF0ZSAiVGV4YXMgSW5zdHJ1bWVudHMgUENNMTY4MSBDT0RFQyIKKwlkZXBlbmRzIG9uIEkyQwogCiBjb25maWcgU05EX1NPQ19QQ00xNzkyQQotICAgICAgIHRyaXN0YXRlCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFBDTTE3OTJBIENPREVDIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUgogCiBjb25maWcgU05EX1NPQ19QQ00zMDA4CiAgICAgICAgdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfUENNNTEyeAorCXRyaXN0YXRlCisKK2NvbmZpZyBTTkRfU09DX1BDTTUxMnhfSTJDCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFBDTTUxMnggQ09ERUNzIC0gSTJDIgorCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IFNORF9TT0NfUENNNTEyeAorCXNlbGVjdCBSRUdNQVBfSTJDCisKK2NvbmZpZyBTTkRfU09DX1BDTTUxMnhfU1BJCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFBDTTUxMnggQ09ERUNzIC0gU1BJIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUgorCXNlbGVjdCBTTkRfU09DX1BDTTUxMngKKwlzZWxlY3QgUkVHTUFQX1NQSQorCiBjb25maWcgU05EX1NPQ19SVDU2MzEKIAl0cmlzdGF0ZQogCkBAIC0zMjEsNyArMzk4LDggQEAKIAogI0ZyZWVzY2FsZSBzZ3RsNTAwMCBjb2RlYwogY29uZmlnIFNORF9TT0NfU0dUTDUwMDAKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJGcmVlc2NhbGUgU0dUTDUwMDAgQ09ERUMiCisJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNORF9TT0NfU0k0NzZYCiAJdHJpc3RhdGUKQEAgLTMzMCwxMSArNDA4LDE1IEBACiAJdHJpc3RhdGUKIAlzZWxlY3QgQ1JDMzIKIAorY29uZmlnIFNORF9TT0NfU0lSRl9BVURJT19DT0RFQworCXRyaXN0YXRlICJTaVJGIFNvQyBpbnRlcm5hbCBhdWRpbyBjb2RlYyIKKwlzZWxlY3QgUkVHTUFQX01NSU8KKwogY29uZmlnIFNORF9TT0NfU045NTAzMQogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1NQRElGCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiUy9QRElGIENPREVDIgogCiBjb25maWcgU05EX1NPQ19TU00yNTE4CiAJdHJpc3RhdGUKQEAgLTM0Miw2ICs0MjQsMTQgQEAKIGNvbmZpZyBTTkRfU09DX1NTTTI2MDIKIAl0cmlzdGF0ZQogCitjb25maWcgU05EX1NPQ19TU00yNjAyX1NQSQorCXNlbGVjdCBTTkRfU09DX1NTTTI2MDIKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19TU00yNjAyX0kyQworCXNlbGVjdCBTTkRfU09DX1NTTTI2MDIKKwl0cmlzdGF0ZQorCiBjb25maWcgU05EX1NPQ19TVEEzMlgKIAl0cmlzdGF0ZQogCkBAIC0zNTIsMjAgKzQ0MiwzMyBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1RBUzUwODYKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBUQVM1MDg2IHNwZWFrZXIgYW1wbGlmaWVyIgorCWRlcGVuZHMgb24gSTJDCiAKIGNvbmZpZyBTTkRfU09DX1RMVjMyMEFJQzIzCiAJdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfVExWMzIwQUlDMjNfSTJDCisJdHJpc3RhdGUKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyMworCitjb25maWcgU05EX1NPQ19UTFYzMjBBSUMyM19TUEkKKwl0cmlzdGF0ZQorCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzCisKIGNvbmZpZyBTTkRfU09DX1RMVjMyMEFJQzI2CiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIFNQSQogCitjb25maWcgU05EX1NPQ19UTFYzMjBBSUMzMVhYCisgICAgICAgIHRyaXN0YXRlCisKIGNvbmZpZyBTTkRfU09DX1RMVjMyMEFJQzMyWDQKIAl0cmlzdGF0ZQogCiBjb25maWcgU05EX1NPQ19UTFYzMjBBSUMzWAotCXRyaXN0YXRlCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFRMVjMyMEFJQzN4IENPREVDcyIKKwlkZXBlbmRzIG9uIEkyQwogCiBjb25maWcgU05EX1NPQ19UTFYzMjBEQUMzMwogCXRyaXN0YXRlCkBAIC00MTQsNTUgKzUxNyw2OSBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1dNODUxMAotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg1MTAgQ09ERUMiCisJZGVwZW5kcyBvbiBTTkRfU09DX0kyQ19BTkRfU1BJCiAKIGNvbmZpZyBTTkRfU09DX1dNODUyMwotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg1MjMgREFDIgorCWRlcGVuZHMgb24gSTJDCiAKIGNvbmZpZyBTTkRfU09DX1dNODU4MAotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg1MjMgQ09ERUMiCisJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNORF9TT0NfV004NzExCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODcxMSBDT0RFQyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKIAogY29uZmlnIFNORF9TT0NfV004NzI3CiAJdHJpc3RhdGUKIAogY29uZmlnIFNORF9TT0NfV004NzI4Ci0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODcyOCBEQUMiCisJZGVwZW5kcyBvbiBTTkRfU09DX0kyQ19BTkRfU1BJCiAKIGNvbmZpZyBTTkRfU09DX1dNODczMQotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg3MzEgQ09ERUMiCisJZGVwZW5kcyBvbiBTTkRfU09DX0kyQ19BTkRfU1BJCiAKIGNvbmZpZyBTTkRfU09DX1dNODczNwotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg3MzcgQURDIgorCWRlcGVuZHMgb24gU05EX1NPQ19JMkNfQU5EX1NQSQogCiBjb25maWcgU05EX1NPQ19XTTg3NDEKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgV004NzM3IERBQyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKIAogY29uZmlnIFNORF9TT0NfV004NzUwCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODc1MCBDT0RFQyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKIAogY29uZmlnIFNORF9TT0NfV004NzUzCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODc1MyBDT0RFQyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKIAogY29uZmlnIFNORF9TT0NfV004NzcwCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODc3MCBDT0RFQyIKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIKIAogY29uZmlnIFNORF9TT0NfV004Nzc2Ci0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODc3NiBDT0RFQyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKIAogY29uZmlnIFNORF9TT0NfV004NzgyCiAJdHJpc3RhdGUKIAogY29uZmlnIFNORF9TT0NfV004ODA0Ci0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODgwNCBTL1BESUYgdHJhbnNjZWl2ZXIiCisJZGVwZW5kcyBvbiBTTkRfU09DX0kyQ19BTkRfU1BJCiAKIGNvbmZpZyBTTkRfU09DX1dNODkwMAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1dNODkwMwotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg5MDMgQ09ERUMiCisJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNORF9TT0NfV004OTA0CiAJdHJpc3RhdGUKQEAgLTQ4MCw3ICs1OTcsOCBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1dNODk2MgotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg5NjIgQ09ERUMiCisJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNORF9TT0NfV004OTcxCiAJdHJpc3RhdGUKQEAgLTU1Myw0ICs2NzEsNyBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1RQQTYxMzBBMgotCXRyaXN0YXRlCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFRQQTYxMzBBMiBoZWFkcGhvbmUgYW1wbGlmaWVyIgorCWRlcGVuZHMgb24gSTJDCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUgYi9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCmluZGV4IGJjMTI2NzYuLjNjNGQyNzUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZQpAQCAtMywxMSArMywxOCBAQAogc25kLXNvYy1hYzk3LW9ianMgOj0gYWM5Ny5vCiBzbmQtc29jLWFkMTgzNi1vYmpzIDo9IGFkMTgzNi5vCiBzbmQtc29jLWFkMTkzeC1vYmpzIDo9IGFkMTkzeC5vCitzbmQtc29jLWFkMTkzeC1zcGktb2JqcyA6PSBhZDE5M3gtc3BpLm8KK3NuZC1zb2MtYWQxOTN4LWkyYy1vYmpzIDo9IGFkMTkzeC1pMmMubwogc25kLXNvYy1hZDE5ODAtb2JqcyA6PSBhZDE5ODAubwogc25kLXNvYy1hZDczMzExLW9ianMgOj0gYWQ3MzMxMS5vCiBzbmQtc29jLWFkYXUxNzAxLW9ianMgOj0gYWRhdTE3MDEubwogc25kLXNvYy1hZGF1MTM3My1vYmpzIDo9IGFkYXUxMzczLm8KK3NuZC1zb2MtYWRhdTE5Nzctb2JqcyA6PSBhZGF1MTk3Ny5vCitzbmQtc29jLWFkYXUxOTc3LXNwaS1vYmpzIDo9IGFkYXUxOTc3LXNwaS5vCitzbmQtc29jLWFkYXUxOTc3LWkyYy1vYmpzIDo9IGFkYXUxOTc3LWkyYy5vCiBzbmQtc29jLWFkYXY4MHgtb2JqcyA6PSBhZGF2ODB4Lm8KK3NuZC1zb2MtYWRhdjgwMS1vYmpzIDo9IGFkYXY4MDEubworc25kLXNvYy1hZGF2ODAzLW9ianMgOj0gYWRhdjgwMy5vCiBzbmQtc29jLWFkczExN3gtb2JqcyA6PSBhZHMxMTd4Lm8KIHNuZC1zb2MtYWs0MTA0LW9ianMgOj0gYWs0MTA0Lm8KIHNuZC1zb2MtYWs0NTM1LW9ianMgOj0gYWs0NTM1Lm8KQEAgLTIzLDYgKzMwLDggQEAKIHNuZC1zb2MtY3M0Mmw3My1vYmpzIDo9IGNzNDJsNzMubwogc25kLXNvYy1jczQyNzAtb2JqcyA6PSBjczQyNzAubwogc25kLXNvYy1jczQyNzEtb2JqcyA6PSBjczQyNzEubworc25kLXNvYy1jczQyeHg4LW9ianMgOj0gY3M0Mnh4OC5vCitzbmQtc29jLWNzNDJ4eDgtaTJjLW9ianMgOj0gY3M0Mnh4OC1pMmMubwogc25kLXNvYy1jeDIwNDQyLW9ianMgOj0gY3gyMDQ0Mi5vCiBzbmQtc29jLWRhNzIxMC1vYmpzIDo9IGRhNzIxMC5vCiBzbmQtc29jLWRhNzIxMy1vYmpzIDo9IGRhNzIxMy5vCkBAIC00Niw2ICs1NSw5IEBACiBzbmQtc29jLXBjbTE2ODEtb2JqcyA6PSBwY20xNjgxLm8KIHNuZC1zb2MtcGNtMTc5MmEtY29kZWMtb2JqcyA6PSBwY20xNzkyYS5vCiBzbmQtc29jLXBjbTMwMDgtb2JqcyA6PSBwY20zMDA4Lm8KK3NuZC1zb2MtcGNtNTEyeC1vYmpzIDo9IHBjbTUxMngubworc25kLXNvYy1wY201MTJ4LWkyYy1vYmpzIDo9IHBjbTUxMngtaTJjLm8KK3NuZC1zb2MtcGNtNTEyeC1zcGktb2JqcyA6PSBwY201MTJ4LXNwaS5vCiBzbmQtc29jLXJ0NTYzMS1vYmpzIDo9IHJ0NTYzMS5vCiBzbmQtc29jLXJ0NTY0MC1vYmpzIDo9IHJ0NTY0MC5vCiBzbmQtc29jLXNndGw1MDAwLW9ianMgOj0gc2d0bDUwMDAubwpAQCAtNTMsMTkgKzY1LDI1IEBACiBzbmQtc29jLWFsYzU2MzItb2JqcyA6PSBhbGM1NjMyLm8KIHNuZC1zb2Mtc2lnbWFkc3Atb2JqcyA6PSBzaWdtYWRzcC5vCiBzbmQtc29jLXNpNDc2eC1vYmpzIDo9IHNpNDc2eC5vCitzbmQtc29jLXNpcmYtYXVkaW8tY29kZWMtb2JqcyA6PSBzaXJmLWF1ZGlvLWNvZGVjLm8KIHNuZC1zb2Mtc245NTAzMS1vYmpzIDo9IHNuOTUwMzEubwogc25kLXNvYy1zcGRpZi10eC1vYmpzIDo9IHNwZGlmX3RyYW5zbWl0dGVyLm8KIHNuZC1zb2Mtc3BkaWYtcngtb2JqcyA6PSBzcGRpZl9yZWNlaXZlci5vCiBzbmQtc29jLXNzbTI1MTgtb2JqcyA6PSBzc20yNTE4Lm8KIHNuZC1zb2Mtc3NtMjYwMi1vYmpzIDo9IHNzbTI2MDIubworc25kLXNvYy1zc20yNjAyLXNwaS1vYmpzIDo9IHNzbTI2MDItc3BpLm8KK3NuZC1zb2Mtc3NtMjYwMi1pMmMtb2JqcyA6PSBzc20yNjAyLWkyYy5vCiBzbmQtc29jLXN0YTMyeC1vYmpzIDo9IHN0YTMyeC5vCiBzbmQtc29jLXN0YTUyOS1vYmpzIDo9IHN0YTUyOS5vCiBzbmQtc29jLXN0YWM5NzY2LW9ianMgOj0gc3RhYzk3NjYubwogc25kLXNvYy10YXM1MDg2LW9ianMgOj0gdGFzNTA4Ni5vCiBzbmQtc29jLXRsdjMyMGFpYzIzLW9ianMgOj0gdGx2MzIwYWljMjMubworc25kLXNvYy10bHYzMjBhaWMyMy1pMmMtb2JqcyA6PSB0bHYzMjBhaWMyMy1pMmMubworc25kLXNvYy10bHYzMjBhaWMyMy1zcGktb2JqcyA6PSB0bHYzMjBhaWMyMy1zcGkubwogc25kLXNvYy10bHYzMjBhaWMyNi1vYmpzIDo9IHRsdjMyMGFpYzI2Lm8KLXNuZC1zb2MtdGx2MzIwYWljM3gtb2JqcyA6PSB0bHYzMjBhaWMzeC5vCitzbmQtc29jLXRsdjMyMGFpYzMxeHgtb2JqcyA6PSB0bHYzMjBhaWMzMXh4Lm8KIHNuZC1zb2MtdGx2MzIwYWljMzJ4NC1vYmpzIDo9IHRsdjMyMGFpYzMyeDQubworc25kLXNvYy10bHYzMjBhaWMzeC1vYmpzIDo9IHRsdjMyMGFpYzN4Lm8KIHNuZC1zb2MtdGx2MzIwZGFjMzMtb2JqcyA6PSB0bHYzMjBkYWMzMy5vCiBzbmQtc29jLXR3bDQwMzAtb2JqcyA6PSB0d2w0MDMwLm8KIHNuZC1zb2MtdHdsNjA0MC1vYmpzIDo9IHR3bDYwNDAubwpAQCAtMTM0LDExICsxNTIsMTggQEAKIG9iai0kKENPTkZJR19TTkRfU09DX0FDOTdfQ09ERUMpCSs9IHNuZC1zb2MtYWM5Ny5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BRDE4MzYpCSs9IHNuZC1zb2MtYWQxODM2Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX0FEMTkzWCkJKz0gc25kLXNvYy1hZDE5M3gubworb2JqLSQoQ09ORklHX1NORF9TT0NfQUQxOTNYX1NQSSkJKz0gc25kLXNvYy1hZDE5M3gtc3BpLm8KK29iai0kKENPTkZJR19TTkRfU09DX0FEMTkzWF9JMkMpCSs9IHNuZC1zb2MtYWQxOTN4LWkyYy5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BRDE5ODApCSs9IHNuZC1zb2MtYWQxOTgwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0FENzMzMTEpICs9IHNuZC1zb2MtYWQ3MzMxMS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BREFVMTM3MykJKz0gc25kLXNvYy1hZGF1MTM3My5vCitvYmotJChDT05GSUdfU05EX1NPQ19BREFVMTk3NykJCSs9IHNuZC1zb2MtYWRhdTE5Nzcubworb2JqLSQoQ09ORklHX1NORF9TT0NfQURBVTE5NzdfU1BJKQkrPSBzbmQtc29jLWFkYXUxOTc3LXNwaS5vCitvYmotJChDT05GSUdfU05EX1NPQ19BREFVMTk3N19JMkMpCSs9IHNuZC1zb2MtYWRhdTE5NzctaTJjLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0FEQVUxNzAxKSAgKz0gc25kLXNvYy1hZGF1MTcwMS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BREFWODBYKSAgKz0gc25kLXNvYy1hZGF2ODB4Lm8KK29iai0kKENPTkZJR19TTkRfU09DX0FEQVY4MDEpICArPSBzbmQtc29jLWFkYXY4MDEubworb2JqLSQoQ09ORklHX1NORF9TT0NfQURBVjgwMykgICs9IHNuZC1zb2MtYWRhdjgwMy5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BRFMxMTdYKQkrPSBzbmQtc29jLWFkczExN3gubwogb2JqLSQoQ09ORklHX1NORF9TT0NfQUs0MTA0KQkrPSBzbmQtc29jLWFrNDEwNC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BSzQ1MzUpCSs9IHNuZC1zb2MtYWs0NTM1Lm8KQEAgLTE1Niw2ICsxODEsOCBAQAogb2JqLSQoQ09ORklHX1NORF9TT0NfQ1M0Mkw3MykJKz0gc25kLXNvYy1jczQybDczLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0NTNDI3MCkJKz0gc25kLXNvYy1jczQyNzAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfQ1M0MjcxKQkrPSBzbmQtc29jLWNzNDI3MS5vCitvYmotJChDT05GSUdfU05EX1NPQ19DUzQyWFg4KQkrPSBzbmQtc29jLWNzNDJ4eDgubworb2JqLSQoQ09ORklHX1NORF9TT0NfQ1M0MlhYOF9JMkMpICs9IHNuZC1zb2MtY3M0Mnh4OC1pMmMubwogb2JqLSQoQ09ORklHX1NORF9TT0NfQ1gyMDQ0MikJKz0gc25kLXNvYy1jeDIwNDQyLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0RBNzIxMCkJKz0gc25kLXNvYy1kYTcyMTAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfREE3MjEzKQkrPSBzbmQtc29jLWRhNzIxMy5vCkBAIC0xNzksNiArMjA2LDkgQEAKIG9iai0kKENPTkZJR19TTkRfU09DX1BDTTE2ODEpCSs9IHNuZC1zb2MtcGNtMTY4MS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19QQ00xNzkyQSkJKz0gc25kLXNvYy1wY20xNzkyYS1jb2RlYy5vCiBvYmotJChDT05GSUdfU05EX1NPQ19QQ00zMDA4KQkrPSBzbmQtc29jLXBjbTMwMDgubworb2JqLSQoQ09ORklHX1NORF9TT0NfUENNNTEyeCkJKz0gc25kLXNvYy1wY201MTJ4Lm8KK29iai0kKENPTkZJR19TTkRfU09DX1BDTTUxMnhfSTJDKQkrPSBzbmQtc29jLXBjbTUxMngtaTJjLm8KK29iai0kKENPTkZJR19TTkRfU09DX1BDTTUxMnhfU1BJKQkrPSBzbmQtc29jLXBjbTUxMngtc3BpLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1JUNTYzMSkJKz0gc25kLXNvYy1ydDU2MzEubwogb2JqLSQoQ09ORklHX1NORF9TT0NfUlQ1NjQwKQkrPSBzbmQtc29jLXJ0NTY0MC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19TR1RMNTAwMCkgICs9IHNuZC1zb2Mtc2d0bDUwMDAubwpAQCAtMTg4LDE0ICsyMTgsMTkgQEAKIG9iai0kKENPTkZJR19TTkRfU09DX1NQRElGKQkrPSBzbmQtc29jLXNwZGlmLXJ4Lm8gc25kLXNvYy1zcGRpZi10eC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19TU00yNTE4KQkrPSBzbmQtc29jLXNzbTI1MTgubwogb2JqLSQoQ09ORklHX1NORF9TT0NfU1NNMjYwMikJKz0gc25kLXNvYy1zc20yNjAyLm8KK29iai0kKENPTkZJR19TTkRfU09DX1NTTTI2MDJfU1BJKQkrPSBzbmQtc29jLXNzbTI2MDItc3BpLm8KK29iai0kKENPTkZJR19TTkRfU09DX1NTTTI2MDJfSTJDKQkrPSBzbmQtc29jLXNzbTI2MDItaTJjLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1NUQTMyWCkgICArPSBzbmQtc29jLXN0YTMyeC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19TVEE1MjkpICAgKz0gc25kLXNvYy1zdGE1Mjkubwogb2JqLSQoQ09ORklHX1NORF9TT0NfU1RBQzk3NjYpCSs9IHNuZC1zb2Mtc3RhYzk3NjYubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVEFTNTA4NikJKz0gc25kLXNvYy10YXM1MDg2Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX1RMVjMyMEFJQzIzKQkrPSBzbmQtc29jLXRsdjMyMGFpYzIzLm8KK29iai0kKENPTkZJR19TTkRfU09DX1RMVjMyMEFJQzIzX0kyQykJKz0gc25kLXNvYy10bHYzMjBhaWMyMy1pMmMubworb2JqLSQoQ09ORklHX1NORF9TT0NfVExWMzIwQUlDMjNfU1BJKQkrPSBzbmQtc29jLXRsdjMyMGFpYzIzLXNwaS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19UTFYzMjBBSUMyNikJKz0gc25kLXNvYy10bHYzMjBhaWMyNi5vCi1vYmotJChDT05GSUdfU05EX1NPQ19UTFYzMjBBSUMzWCkJKz0gc25kLXNvYy10bHYzMjBhaWMzeC5vCitvYmotJChDT05GSUdfU05EX1NPQ19UTFYzMjBBSUMzMVhYKSAgICAgKz0gc25kLXNvYy10bHYzMjBhaWMzMXh4Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX1RMVjMyMEFJQzMyWDQpICAgICArPSBzbmQtc29jLXRsdjMyMGFpYzMyeDQubworb2JqLSQoQ09ORklHX1NORF9TT0NfVExWMzIwQUlDM1gpCSs9IHNuZC1zb2MtdGx2MzIwYWljM3gubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVExWMzIwREFDMzMpCSs9IHNuZC1zb2MtdGx2MzIwZGFjMzMubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVFdMNDAzMCkJKz0gc25kLXNvYy10d2w0MDMwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1RXTDYwNDApCSs9IHNuZC1zb2MtdHdsNjA0MC5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5jIGIvc291bmQvc29jL2NvZGVjcy9hZDE4MzYuYwppbmRleCA3N2Y0NTk4Li42ODU5OThkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxODM2LmMKQEAgLTQwLDggKzQwLDggQEAKICAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmFkMTgzNl9kZWVtcFtdID0geyJOb25lIiwgIjQ0LjFrSHoiLCAiMzJrSHoiLCAiNDhrSHoifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZDE4MzZfZGVlbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFEMTgzNl9EQUNfQ1RSTDEsIDgsIDQsIGFkMTgzNl9kZWVtcCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWQxODM2X2RlZW1wX2VudW0sCisJCQkgICAgQUQxODM2X0RBQ19DVFJMMSwgOCwgYWQxODM2X2RlZW1wKTsKIAogI2RlZmluZSBBRDE4MzZfREFDX1ZPTFVNRSh4KSBcCiAJU09DX0RPVUJMRV9SKCJEQUMiICN4ICIgUGxheWJhY2sgVm9sdW1lIiwgQUQxODM2X0RBQ19MX1ZPTCh4KSwgXApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZDE5M3gtaTJjLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjNhMWE0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZDE5M3gtaTJjLmMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIEFEMTkzNi9BRDE5MzcgYXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTQgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgImFkMTkzeC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWQxOTN4X2lkW10gPSB7CisJeyAiYWQxOTM2IiwgMCB9LAorCXsgImFkMTkzNyIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWQxOTN4X2lkKTsKKworc3RhdGljIGludCBhZDE5M3hfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCByZWdtYXBfY29uZmlnIGNvbmZpZzsKKworCWNvbmZpZyA9IGFkMTkzeF9yZWdtYXBfY29uZmlnOworCWNvbmZpZy52YWxfYml0cyA9IDg7CisJY29uZmlnLnJlZ19iaXRzID0gODsKKworCXJldHVybiBhZDE5M3hfcHJvYmUoJmNsaWVudC0+ZGV2LCBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZjb25maWcpKTsKK30KKworc3RhdGljIGludCBhZDE5M3hfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWQxOTN4X2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWQxOTN4IiwKKwl9LAorCS5wcm9iZSAgICA9IGFkMTkzeF9pMmNfcHJvYmUsCisJLnJlbW92ZSAgID0gYWQxOTN4X2kyY19yZW1vdmUsCisJLmlkX3RhYmxlID0gYWQxOTN4X2lkLAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKGFkMTkzeF9pMmNfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEFEMTkzNi9BRDE5MzcgYXVkaW8gQ09ERUMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LXNwaS5jIGIvc291bmQvc29jL2NvZGVjcy9hZDE5M3gtc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwY2VmOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LXNwaS5jCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBBRDE5MzgvQUQxOTM5IGF1ZGlvIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDE0IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCisjaW5jbHVkZSAiYWQxOTN4LmgiCisKK3N0YXRpYyBpbnQgYWQxOTN4X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCByZWdtYXBfY29uZmlnIGNvbmZpZzsKKworCWNvbmZpZyA9IGFkMTkzeF9yZWdtYXBfY29uZmlnOworCWNvbmZpZy52YWxfYml0cyA9IDg7CisJY29uZmlnLnJlZ19iaXRzID0gMTY7CisJY29uZmlnLnJlYWRfZmxhZ19tYXNrID0gMHgwOTsKKwljb25maWcud3JpdGVfZmxhZ19tYXNrID0gMHgwODsKKworCXJldHVybiBhZDE5M3hfcHJvYmUoJnNwaS0+ZGV2LCBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZjb25maWcpKTsKK30KKworc3RhdGljIGludCBhZDE5M3hfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQxOTN4X3NwaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiYWQxOTN4IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gYWQxOTN4X3NwaV9wcm9iZSwKKwkucmVtb3ZlCQk9IGFkMTkzeF9zcGlfcmVtb3ZlLAorfTsKK21vZHVsZV9zcGlfZHJpdmVyKGFkMTkzeF9zcGlfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEFEMTkzOC9BRDE5MzkgYXVkaW8gQ09ERUMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC5jCmluZGV4IDVhNDJkY2EuLjY4NDRkMGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZDE5M3guYwpAQCAtNiwxMiArNiwxMCBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CkBAIC0xOSw2ICsxNyw3IEBACiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorCiAjaW5jbHVkZSAiYWQxOTN4LmgiCiAKIC8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLwpAQCAtMzIsOCArMzEsOCBAQAogICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFkMTkzeF9kZWVtcFtdID0geyJOb25lIiwgIjQ4a0h6IiwgIjQ0LjFrSHoiLCAiMzJrSHoifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZDE5M3hfZGVlbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFEMTkzWF9EQUNfQ1RSTDIsIDEsIDQsIGFkMTkzeF9kZWVtcCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWQxOTN4X2RlZW1wX2VudW0sIEFEMTkzWF9EQUNfQ1RSTDIsIDEsCisJCQkgICAgYWQxOTN4X2RlZW1wKTsKIAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX01JTk1BWChhZGF1MTkzeF90bHYsIC05NTYzLCAwKTsKIApAQCAtMzIwLDE3ICszMTksOSBAQAogCS5vcHMgPSAmYWQxOTN4X2RhaV9vcHMsCiB9OwogCi1zdGF0aWMgaW50IGFkMTkzeF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCitzdGF0aWMgaW50IGFkMTkzeF9jb2RlY19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFkMTkzeF9wcml2ICphZDE5M3ggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwotCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGFkMTkzeC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAwLCAwLCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KIAogCS8qIGRlZmF1bHQgc2V0dGluZyBmb3IgYWQxOTN4ICovCiAKQEAgLTM0OCwxMSArMzM5LDExIEBACiAJcmVnbWFwX3dyaXRlKGFkMTkzeC0+cmVnbWFwLCBBRDE5M1hfUExMX0NMS19DVFJMMCwgMHg5OSk7IC8qIG1jbGs9MjQuNTc2TWh6OiAweDlEOyBtY2xrPTEyLjI4OE1oejogMHg5OSAqLwogCXJlZ21hcF93cml0ZShhZDE5M3gtPnJlZ21hcCwgQUQxOTNYX1BMTF9DTEtfQ1RSTDEsIDB4MDQpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2FkMTkzeCA9IHsKLQkucHJvYmUgPSAJYWQxOTN4X3Byb2JlLAorCS5wcm9iZSA9IGFkMTkzeF9jb2RlY19wcm9iZSwKIAkuY29udHJvbHMgPSBhZDE5M3hfc25kX2NvbnRyb2xzLAogCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFkMTkzeF9zbmRfY29udHJvbHMpLAogCS5kYXBtX3dpZGdldHMgPSBhZDE5M3hfZGFwbV93aWRnZXRzLApAQCAtMzY2LDE0MCArMzU3LDMxIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkMTkzeF9zcGlfcmVnbWFwX2NvbmZpZyA9IHsKLQkudmFsX2JpdHMgPSA4LAotCS5yZWdfYml0cyA9IDE2LAotCS5yZWFkX2ZsYWdfbWFzayA9IDB4MDksCi0JLndyaXRlX2ZsYWdfbWFzayA9IDB4MDgsCi0KK2NvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkMTkzeF9yZWdtYXBfY29uZmlnID0gewogCS5tYXhfcmVnaXN0ZXIgPSBBRDE5M1hfTlVNX1JFR1MgLSAxLAogCS52b2xhdGlsZV9yZWcgPSBhZGF1MTkzeF9yZWdfdm9sYXRpbGUsCiB9OworRVhQT1JUX1NZTUJPTF9HUEwoYWQxOTN4X3JlZ21hcF9jb25maWcpOwogCi1zdGF0aWMgaW50IGFkMTkzeF9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK2ludCBhZDE5M3hfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCiB7CiAJc3RydWN0IGFkMTkzeF9wcml2ICphZDE5M3g7CiAKLQlhZDE5M3ggPSBkZXZtX2t6YWxsb2MoJnNwaS0+ZGV2LCBzaXplb2Yoc3RydWN0IGFkMTkzeF9wcml2KSwKLQkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIocmVnbWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKKworCWFkMTkzeCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqYWQxOTN4KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGFkMTkzeCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWFkMTkzeC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9zcGkoc3BpLCAmYWQxOTN4X3NwaV9yZWdtYXBfY29uZmlnKTsKLQlpZiAoSVNfRVJSKGFkMTkzeC0+cmVnbWFwKSkKLQkJcmV0dXJuIFBUUl9FUlIoYWQxOTN4LT5yZWdtYXApOworCWFkMTkzeC0+cmVnbWFwID0gcmVnbWFwOwogCi0Jc3BpX3NldF9kcnZkYXRhKHNwaSwgYWQxOTN4KTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBhZDE5M3gpOwogCi0JcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2LCAmc29jX2NvZGVjX2Rldl9hZDE5M3gsCi0JCQkmYWQxOTN4X2RhaSwgMSk7CisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoZGV2LCAmc29jX2NvZGVjX2Rldl9hZDE5M3gsCisJCSZhZDE5M3hfZGFpLCAxKTsKIH0KLQotc3RhdGljIGludCBhZDE5M3hfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQxOTN4X3NwaV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAiYWQxOTN4IiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLQkucHJvYmUJCT0gYWQxOTN4X3NwaV9wcm9iZSwKLQkucmVtb3ZlCQk9IGFkMTkzeF9zcGlfcmVtb3ZlLAotfTsKLSNlbmRpZgotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWQxOTN4X2kyY19yZWdtYXBfY29uZmlnID0gewotCS52YWxfYml0cyA9IDgsCi0JLnJlZ19iaXRzID0gOCwKLQotCS5tYXhfcmVnaXN0ZXIgPSBBRDE5M1hfTlVNX1JFR1MgLSAxLAotCS52b2xhdGlsZV9yZWcgPSBhZGF1MTkzeF9yZWdfdm9sYXRpbGUsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWQxOTN4X2lkW10gPSB7Ci0JeyAiYWQxOTM2IiwgMCB9LAotCXsgImFkMTkzNyIsIDAgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWQxOTN4X2lkKTsKLQotc3RhdGljIGludCBhZDE5M3hfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCXN0cnVjdCBhZDE5M3hfcHJpdiAqYWQxOTN4OwotCi0JYWQxOTN4ID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBhZDE5M3hfcHJpdiksCi0JCQkgICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoYWQxOTN4ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYWQxOTN4LT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZhZDE5M3hfaTJjX3JlZ21hcF9jb25maWcpOwotCWlmIChJU19FUlIoYWQxOTN4LT5yZWdtYXApKQotCQlyZXR1cm4gUFRSX0VSUihhZDE5M3gtPnJlZ21hcCk7Ci0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBhZDE5M3gpOwotCi0JcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2LCAmc29jX2NvZGVjX2Rldl9hZDE5M3gsCi0JCQkmYWQxOTN4X2RhaSwgMSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWQxOTN4X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkMTkzeF9pMmNfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImFkMTkzeCIsCi0JfSwKLQkucHJvYmUgICAgPSBhZDE5M3hfaTJjX3Byb2JlLAotCS5yZW1vdmUgICA9IGFkMTkzeF9pMmNfcmVtb3ZlLAotCS5pZF90YWJsZSA9IGFkMTkzeF9pZCwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBfX2luaXQgYWQxOTN4X21vZGluaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQotCXJldCA9ICBpMmNfYWRkX2RyaXZlcigmYWQxOTN4X2kyY19kcml2ZXIpOwotCWlmIChyZXQgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBBRDE5M1ggSTJDIGRyaXZlcjogJWRcbiIsCi0JCQkJcmV0KTsKLQl9Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCi0JcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQxOTN4X3NwaV9kcml2ZXIpOwotCWlmIChyZXQgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBBRDE5M1ggU1BJIGRyaXZlcjogJWRcbiIsCi0JCQkJcmV0KTsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotfQotbW9kdWxlX2luaXQoYWQxOTN4X21vZGluaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYWQxOTN4X21vZGV4aXQodm9pZCkKLXsKLSNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQotCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQxOTN4X3NwaV9kcml2ZXIpOwotI2VuZGlmCi0KLSNpZiBJU19FTkFCTEVEKENPTkZJR19JMkMpCi0JaTJjX2RlbF9kcml2ZXIoJmFkMTkzeF9pMmNfZHJpdmVyKTsKLSNlbmRpZgotfQotbW9kdWxlX2V4aXQoYWQxOTN4X21vZGV4aXQpOworRVhQT1JUX1NZTUJPTF9HUEwoYWQxOTN4X3Byb2JlKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIGFkMTkzeCBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZDE5M3guaCBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LmgKaW5kZXggNDczMzg4MC4uYWI5YTk5OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZDE5M3guaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC5oCkBAIC05LDYgKzksMTMgQEAKICNpZm5kZWYgX19BRDE5M1hfSF9fCiAjZGVmaW5lIF9fQUQxOTNYX0hfXwogCisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKK3N0cnVjdCBkZXZpY2U7CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhZDE5M3hfcmVnbWFwX2NvbmZpZzsKK2ludCBhZDE5M3hfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApOworCiAjZGVmaW5lIEFEMTkzWF9QTExfQ0xLX0NUUkwwICAgIDB4MDAKICNkZWZpbmUgQUQxOTNYX1BMTF9QT1dFUkRPV04gICAgICAgICAgIDB4MDEKICNkZWZpbmUgQUQxOTNYX1BMTF9JTlBVVF9NQVNLICAgMHg2CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxMzczLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxMzczLmMKaW5kZXggZWI4MzZlZC4uODc3ZjU3MyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZGF1MTM3My5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTEzNzMuYwpAQCAtMzQ1LDE1ICszNDUsMTUgQEAKIAkiQ2hhbm5lbCA1IiwKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19kcmMxX2NoYW5uZWxfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19kcmMxX2NoYW5uZWxfZW51bSwKIAlBREFVMTM3M19GRFNQX1NFTDEsIDQsIGFkYXUxMzczX2Zkc3Bfc2VsX3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2RyYzJfY2hhbm5lbF9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2RyYzJfY2hhbm5lbF9lbnVtLAogCUFEQVUxMzczX0ZEU1BfU0VMMSwgMCwgYWRhdTEzNzNfZmRzcF9zZWxfdGV4dCk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfZHJjM19jaGFubmVsX2VudW0sCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfZHJjM19jaGFubmVsX2VudW0sCiAJQURBVTEzNzNfRkRTUF9TRUwyLCAwLCBhZGF1MTM3M19mZHNwX3NlbF90ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19ocGZfY2hhbm5lbF9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2hwZl9jaGFubmVsX2VudW0sCiAJQURBVTEzNzNfRkRTUF9TRUwzLCAwLCBhZGF1MTM3M19mZHNwX3NlbF90ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2NoYW5uZWxfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2NoYW5uZWxfZW51bSwKIAlBREFVMTM3M19GRFNQX1NFTDQsIDQsIGFkYXUxMzczX2Zkc3Bfc2VsX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWRhdTEzNzNfaHBmX2N1dG9mZl90ZXh0W10gPSB7CkBAIC0zNjIsNyArMzYyLDcgQEAKIAkiODAwSHoiLAogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2hwZl9jdXRvZmZfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19ocGZfY3V0b2ZmX2VudW0sCiAJQURBVTEzNzNfSFBGX0NUUkwsIDMsIGFkYXUxMzczX2hwZl9jdXRvZmZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphZGF1MTM3M19iYXNzX2xwZl9jdXRvZmZfdGV4dFtdID0gewpAQCAtMzg4LDE0ICszODgsMTQgQEAKIAk1LCA3LCBUTFZfREJfU0NBTEVfSVRFTSgxNDAwLCAxNTAsIDApLAogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2Jhc3NfbHBmX2N1dG9mZl9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2Jhc3NfbHBmX2N1dG9mZl9lbnVtLAogCUFEQVUxMzczX0JBU1MxLCA1LCBhZGF1MTM3M19iYXNzX2xwZl9jdXRvZmZfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2NsaXBfbGV2ZWxfZW51bSwKK3N0YXRpYyBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2NsaXBfbGV2ZWxfZW51bSwKIAlBREFVMTM3M19CQVNTMSwgMiwgNywgYWRhdTEzNzNfYmFzc19jbGlwX2xldmVsX3RleHQsCiAJYWRhdTEzNzNfYmFzc19jbGlwX2xldmVsX3ZhbHVlcyk7CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2hwZl9jdXRvZmZfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2hwZl9jdXRvZmZfZW51bSwKIAlBREFVMTM3M19CQVNTMSwgMCwgYWRhdTEzNzNfYmFzc19ocGZfY3V0b2ZmX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWRhdTEzNzNfM2RfbGV2ZWxfdGV4dFtdID0gewpAQCAtNDA5LDkgKzQwOSw5IEBACiAJIjAuMTY4NzUgZnMiLCAiMC4yNzA4MyBmcyIKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M18zZF9sZXZlbF9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczXzNkX2xldmVsX2VudW0sCiAJQURBVTEzNzNfM0RfQ1RSTDEsIDQsIGFkYXUxMzczXzNkX2xldmVsX3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczXzNkX2N1dG9mZl9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczXzNkX2N1dG9mZl9lbnVtLAogCUFEQVUxMzczXzNEX0NUUkwxLCAwLCBhZGF1MTM3M18zZF9jdXRvZmZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYWRhdTEzNzNfM2RfdGx2W10gPSB7CkBAIC00MjcsMTEgKzQyNywxMSBAQAogCSJTdGVyZW8iLAogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2xpbmVvdXQxX2xyX211eF9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2xpbmVvdXQxX2xyX211eF9lbnVtLAogCUFEQVUxMzczX09VVFBVVF9DVFJMLCA0LCBhZGF1MTM3M19scl9tdXhfdGV4dCk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfbGluZW91dDJfbHJfbXV4X2VudW0sCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfbGluZW91dDJfbHJfbXV4X2VudW0sCiAJQURBVTEzNzNfT1VUUFVUX0NUUkwsIDYsIGFkYXUxMzczX2xyX211eF90ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19zcGVha2VyX2xyX211eF9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX3NwZWFrZXJfbHJfbXV4X2VudW0sCiAJQURBVTEzNzNfTFNfQ1RSTCwgNCwgYWRhdTEzNzNfbHJfbXV4X3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdTEzNzNfY29udHJvbHNbXSA9IHsKQEAgLTU3Niw4ICs1NzYsOCBAQAogCSJETUlDMSIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkYXUxMzczX2RlY2ltYXRvcl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoMCwgMCwgMiwgYWRhdTEzNzNfZGVjaW1hdG9yX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9WSVJUX0RFQ0woYWRhdTEzNzNfZGVjaW1hdG9yX2VudW0sCisJYWRhdTEzNzNfZGVjaW1hdG9yX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdTEzNzNfZGVjaW1hdG9yX211eCA9CiAJU09DX0RBUE1fRU5VTV9WSVJUKCJEZWNpbWF0b3IgTXV4IiwgYWRhdTEzNzNfZGVjaW1hdG9yX2VudW0pOwpAQCAtMTM3NiwxNSArMTM3Niw4IEBACiAJc3RydWN0IGFkYXUxMzczX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gY29kZWMtPmRldi0+cGxhdGZvcm1fZGF0YTsKIAlib29sIGxpbmVvdXRfZGlmZmVyZW50aWFsID0gZmFsc2U7CiAJdW5zaWduZWQgaW50IHZhbDsKLQlpbnQgcmV0OwogCWludCBpOwogCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDAsIDAsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgImZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlpZiAocGRhdGEpIHsKIAkJaWYgKHBkYXRhLT5udW1fZHJjID4gQVJSQVlfU0laRShwZGF0YS0+ZHJjX3NldHRpbmcpKQogCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LWkyYy5jIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTk3Ny1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzAwZThjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTk3Ny1pMmMuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogQURBVTE5NzcvQURBVTE5NzgvQURBVTE5NzkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTQgQW5hbG9nIERldmljZXMgSW5jLgorICogIEF1dGhvcjogTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgImFkYXUxOTc3LmgiCisKK3N0YXRpYyBpbnQgYWRhdTE5NzdfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCByZWdtYXBfY29uZmlnIGNvbmZpZzsKKworCWNvbmZpZyA9IGFkYXUxOTc3X3JlZ21hcF9jb25maWc7CisJY29uZmlnLnZhbF9iaXRzID0gODsKKwljb25maWcucmVnX2JpdHMgPSA4OworCisJcmV0dXJuIGFkYXUxOTc3X3Byb2JlKCZjbGllbnQtPmRldiwKKwkJZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmY29uZmlnKSwKKwkJaWQtPmRyaXZlcl9kYXRhLCBOVUxMKTsKK30KKworc3RhdGljIGludCBhZGF1MTk3N19pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZGF1MTk3N19pMmNfaWRzW10gPSB7CisJeyAiYWRhdTE5NzciLCBBREFVMTk3NyB9LAorCXsgImFkYXUxOTc4IiwgQURBVTE5NzggfSwKKwl7ICJhZGF1MTk3OSIsIEFEQVUxOTc4IH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFkYXUxOTc3X2kyY19pZHMpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWRhdTE5NzdfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGF1MTk3NyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWRhdTE5NzdfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSBhZGF1MTk3N19pMmNfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGFkYXUxOTc3X2kyY19pZHMsCit9OworbW9kdWxlX2kyY19kcml2ZXIoYWRhdTE5NzdfaTJjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBBREFVMTk3Ny9BREFVMTk3OC9BREFVMTk3OSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkxhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF1MTk3Ny1zcGkuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE5Nzctc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1Y2Y1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE5Nzctc3BpLmMKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIEFEQVUxOTc3L0FEQVUxOTc4L0FEQVUxOTc5IGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDE0IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqICBBdXRob3I6IExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCisjaW5jbHVkZSAiYWRhdTE5NzcuaCIKKworc3RhdGljIHZvaWQgYWRhdTE5Nzdfc3BpX3N3aXRjaF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCisJLyoKKwkgKiBUbyBnZXQgdGhlIGRldmljZSBpbnRvIFNQSSBtb2RlIENMQVRDSCBoYXMgdG8gYmUgcHVsbGVkIGxvdyB0aHJlZQorCSAqIHRpbWVzLiAgRG8gdGhpcyBieSBpc3N1aW5nIHRocmVlIGR1bW15IHJlYWRzLgorCSAqLworCXNwaV93OHI4KHNwaSwgMHgwMCk7CisJc3BpX3c4cjgoc3BpLCAweDAwKTsKKwlzcGlfdzhyOChzcGksIDB4MDApOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkICppZCA9IHNwaV9nZXRfZGV2aWNlX2lkKHNwaSk7CisJc3RydWN0IHJlZ21hcF9jb25maWcgY29uZmlnOworCisJaWYgKCFpZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb25maWcgPSBhZGF1MTk3N19yZWdtYXBfY29uZmlnOworCWNvbmZpZy52YWxfYml0cyA9IDg7CisJY29uZmlnLnJlZ19iaXRzID0gMTY7CisJY29uZmlnLnJlYWRfZmxhZ19tYXNrID0gMHgxOworCisJcmV0dXJuIGFkYXUxOTc3X3Byb2JlKCZzcGktPmRldiwKKwkJZGV2bV9yZWdtYXBfaW5pdF9zcGkoc3BpLCAmY29uZmlnKSwKKwkJaWQtPmRyaXZlcl9kYXRhLCBhZGF1MTk3N19zcGlfc3dpdGNoX21vZGUpOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkYXUxOTc3X3NwaV9pZHNbXSA9IHsKKwl7ICJhZGF1MTk3NyIsIEFEQVUxOTc3IH0sCisJeyAiYWRhdTE5NzgiLCBBREFVMTk3OCB9LAorCXsgImFkYXUxOTc5IiwgQURBVTE5NzggfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgYWRhdTE5Nzdfc3BpX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZGF1MTk3N19zcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkYXUxOTc3IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZGF1MTk3N19zcGlfcHJvYmUsCisJLnJlbW92ZSA9IGFkYXUxOTc3X3NwaV9yZW1vdmUsCisJLmlkX3RhYmxlID0gYWRhdTE5Nzdfc3BpX2lkcywKK307Cittb2R1bGVfc3BpX2RyaXZlcihhZGF1MTk3N19zcGlfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEFEQVUxOTc3L0FEQVUxOTc4L0FEQVUxOTc5IGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1NWRhNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE5NzcuYwpAQCAtMCwwICsxLDEwMTggQEAKKy8qCisgKiBBREFVMTk3Ny9BREFVMTk3OC9BREFVMTk3OSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgQXV0aG9yOiBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2FkYXUxOTc3Lmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisKKyNpbmNsdWRlICJhZGF1MTk3Ny5oIgorCisjZGVmaW5lIEFEQVUxOTc3X1JFR19QT1dFUgkJMHgwMAorI2RlZmluZSBBREFVMTk3N19SRUdfUExMCQkweDAxCisjZGVmaW5lIEFEQVUxOTc3X1JFR19CT09TVAkJMHgwMgorI2RlZmluZSBBREFVMTk3N19SRUdfTUlDQklBUwkJMHgwMworI2RlZmluZSBBREFVMTk3N19SRUdfQkxPQ0tfUE9XRVJfU0FJCTB4MDQKKyNkZWZpbmUgQURBVTE5NzdfUkVHX1NBSV9DVFJMMAkJMHgwNQorI2RlZmluZSBBREFVMTk3N19SRUdfU0FJX0NUUkwxCQkweDA2CisjZGVmaW5lIEFEQVUxOTc3X1JFR19DTUFQMTIJCTB4MDcKKyNkZWZpbmUgQURBVTE5NzdfUkVHX0NNQVAzNAkJMHgwOAorI2RlZmluZSBBREFVMTk3N19SRUdfU0FJX09WRVJURU1QCTB4MDkKKyNkZWZpbmUgQURBVTE5NzdfUkVHX1BPU1RfQURDX0dBSU4oeCkJKDB4MGEgKyAoeCkpCisjZGVmaW5lIEFEQVUxOTc3X1JFR19NSVNDX0NPTlRST0wJMHgwZQorI2RlZmluZSBBREFVMTk3N19SRUdfRElBR19DT05UUk9MCTB4MTAKKyNkZWZpbmUgQURBVTE5NzdfUkVHX1NUQVRVUyh4KQkJKDB4MTEgKyAoeCkpCisjZGVmaW5lIEFEQVUxOTc3X1JFR19ESUFHX0lSUTEJCTB4MTUKKyNkZWZpbmUgQURBVTE5NzdfUkVHX0RJQUdfSVJRMgkJMHgxNgorI2RlZmluZSBBREFVMTk3N19SRUdfQURKVVNUMQkJMHgxNworI2RlZmluZSBBREFVMTk3N19SRUdfQURKVVNUMgkJMHgxOAorI2RlZmluZSBBREFVMTk3N19SRUdfQURDX0NMSVAJCTB4MTkKKyNkZWZpbmUgQURBVTE5NzdfUkVHX0RDX0hQRl9DQUwJCTB4MWEKKworI2RlZmluZSBBREFVMTk3N19QT1dFUl9SRVNFVAkJCUJJVCg3KQorI2RlZmluZSBBREFVMTk3N19QT1dFUl9QV1VQCQkJQklUKDApCisKKyNkZWZpbmUgQURBVTE5NzdfUExMX0NMS19TCQkJQklUKDQpCisjZGVmaW5lIEFEQVUxOTc3X1BMTF9NQ1NfTUFTSwkJCTB4NworCisjZGVmaW5lIEFEQVUxOTc3X01JQ0JJQVNfTUJfVk9MVFNfTUFTSwkJMHhmMAorI2RlZmluZSBBREFVMTk3N19NSUNCSUFTX01CX1ZPTFRTX09GRlNFVAk0CisKKyNkZWZpbmUgQURBVTE5NzdfQkxPQ0tfUE9XRVJfU0FJX0xSX1BPTAkJQklUKDcpCisjZGVmaW5lIEFEQVUxOTc3X0JMT0NLX1BPV0VSX1NBSV9CQ0xLX0VER0UJQklUKDYpCisjZGVmaW5lIEFEQVUxOTc3X0JMT0NLX1BPV0VSX1NBSV9MRE9fRU4JCUJJVCg1KQorCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMF9GTVRfTUFTSwkJKDB4MyA8PCA2KQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfRk1UX0kyUwkJKDB4MCA8PCA2KQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfRk1UX0xKCQkoMHgxIDw8IDYpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMF9GTVRfUkpfMjRCSVQJCSgweDIgPDwgNikKKyNkZWZpbmUgQURBVTE5NzdfU0FJX0NUUkwwX0ZNVF9SSl8xNkJJVAkJKDB4MyA8PCA2KQorCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMF9TQUlfTUFTSwkJKDB4NyA8PCAzKQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfU0FJX0kyUwkJKDB4MCA8PCAzKQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfU0FJX1RETV8yCQkoMHgxIDw8IDMpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMF9TQUlfVERNXzQJCSgweDIgPDwgMykKKyNkZWZpbmUgQURBVTE5NzdfU0FJX0NUUkwwX1NBSV9URE1fOAkJKDB4MyA8PCAzKQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfU0FJX1RETV8xNgkJKDB4NCA8PCAzKQorCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMF9GU19NQVNLCQkoMHg3KQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfRlNfODAwMF8xMjAwMAkoMHgwKQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfRlNfMTYwMDBfMjQwMDAJKDB4MSkKKyNkZWZpbmUgQURBVTE5NzdfU0FJX0NUUkwwX0ZTXzMyMDAwXzQ4MDAwCSgweDIpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMF9GU182NDAwMF85NjAwMAkoMHgzKQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfRlNfMTI4MDAwXzE5MjAwMAkoMHg0KQorCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMV9TTE9UX1dJRFRIX01BU0sJKDB4MyA8PCA1KQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDFfU0xPVF9XSURUSF8zMgkoMHgwIDw8IDUpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMV9TTE9UX1dJRFRIXzI0CSgweDEgPDwgNSkKKyNkZWZpbmUgQURBVTE5NzdfU0FJX0NUUkwxX1NMT1RfV0lEVEhfMTYJKDB4MiA8PCA1KQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDFfREFUQV9XSURUSF9NQVNLCSgweDEgPDwgNCkKKyNkZWZpbmUgQURBVTE5NzdfU0FJX0NUUkwxX0RBVEFfV0lEVEhfMTZCSVQJKDB4MSA8PCA0KQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDFfREFUQV9XSURUSF8yNEJJVAkoMHgwIDw8IDQpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMV9MUkNMS19QVUxTRQkJQklUKDMpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMV9NU0IJCQlCSVQoMikKKyNkZWZpbmUgQURBVTE5NzdfU0FJX0NUUkwxX0JDTEtSQVRFXzE2CQkoMHgxIDw8IDEpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMV9CQ0xLUkFURV8zMgkJKDB4MCA8PCAxKQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDFfQkNMS1JBVEVfTUFTSwkoMHgxIDw8IDEpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMV9NQVNURVIJCUJJVCgwKQorCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9PVkVSVEVNUF9EUlZfQyh4KQkJQklUKDQgKyAoeCkpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9PVkVSVEVNUF9EUlZfSElaCQlCSVQoMykKKworI2RlZmluZSBBREFVMTk3N19NSVNDX0NPTlRST0xfU1VNX01PREVfTUFTSwkoMHgzIDw8IDYpCisjZGVmaW5lIEFEQVUxOTc3X01JU0NfQ09OVFJPTF9TVU1fTU9ERV8xQ0gJKDB4MiA8PCA2KQorI2RlZmluZSBBREFVMTk3N19NSVNDX0NPTlRST0xfU1VNX01PREVfMkNICSgweDEgPDwgNikKKyNkZWZpbmUgQURBVTE5NzdfTUlTQ19DT05UUk9MX1NVTV9NT0RFXzRDSAkoMHgwIDw8IDYpCisjZGVmaW5lIEFEQVUxOTc3X01JU0NfQ09OVFJPTF9NTVVURQkJQklUKDQpCisjZGVmaW5lIEFEQVUxOTc3X01JU0NfQ09OVFJPTF9EQ19DQUwJCUJJVCgwKQorCisjZGVmaW5lIEFEQVUxOTc3X0NIQU5fTUFQX1NFQ09ORF9TTE9UX09GRlNFVAk0CisjZGVmaW5lIEFEQVUxOTc3X0NIQU5fTUFQX0ZJUlNUX1NMT1RfT0ZGU0VUCTAKKworc3RydWN0IGFkYXUxOTc3IHsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJYm9vbCByaWdodF9qOworCXVuc2lnbmVkIGludCBzeXNjbGs7CisJZW51bSBhZGF1MTk3N19zeXNjbGtfc3JjIHN5c2Nsa19zcmM7CisJc3RydWN0IGdwaW9fZGVzYyAqcmVzZXRfZ3BpbzsKKwllbnVtIGFkYXUxOTc3X3R5cGUgdHlwZTsKKworCXN0cnVjdCByZWd1bGF0b3IgKmF2ZGRfcmVnOworCXN0cnVjdCByZWd1bGF0b3IgKmR2ZGRfcmVnOworCisJc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzOworCisJc3RydWN0IGRldmljZSAqZGV2OworCXZvaWQgKCpzd2l0Y2hfbW9kZSkoc3RydWN0IGRldmljZSAqZGV2KTsKKworCXVuc2lnbmVkIGludCBtYXhfbWFzdGVyX2ZzOworCXVuc2lnbmVkIGludCBzbG90X3dpZHRoOworCWJvb2wgZW5hYmxlZDsKKwlib29sIG1hc3RlcjsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgYWRhdTE5NzdfcmVnX2RlZmF1bHRzW10gPSB7CisJeyAweDAwLCAweDAwIH0sCisJeyAweDAxLCAweDQxIH0sCisJeyAweDAyLCAweDRhIH0sCisJeyAweDAzLCAweDdkIH0sCisJeyAweDA0LCAweDNkIH0sCisJeyAweDA1LCAweDAyIH0sCisJeyAweDA2LCAweDAwIH0sCisJeyAweDA3LCAweDEwIH0sCisJeyAweDA4LCAweDMyIH0sCisJeyAweDA5LCAweGYwIH0sCisJeyAweDBhLCAweGEwIH0sCisJeyAweDBiLCAweGEwIH0sCisJeyAweDBjLCAweGEwIH0sCisJeyAweDBkLCAweGEwIH0sCisJeyAweDBlLCAweDAyIH0sCisJeyAweDEwLCAweDBmIH0sCisJeyAweDE1LCAweDIwIH0sCisJeyAweDE2LCAweDAwIH0sCisJeyAweDE3LCAweDAwIH0sCisJeyAweDE4LCAweDAwIH0sCisJeyAweDFhLCAweDAwIH0sCit9OworCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTUlOTUFYX01VVEUoYWRhdTE5NzdfYWRjX2dhaW4sIC0zNTYyLCA2MDAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGFkYXUxOTc3X21pY2JpYXNfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX1NVUFBMWSgiTUlDQklBUyIsIEFEQVUxOTc3X1JFR19NSUNCSUFTLAorCQkzLCAwLCBOVUxMLCAwKQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGFkYXUxOTc3X2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9TVVBQTFkoIlZyZWYiLCBBREFVMTk3N19SRUdfQkxPQ0tfUE9XRVJfU0FJLAorCQk0LCAwLCBOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9BREMoIkFEQzEiLCAiQ2FwdHVyZSIsIEFEQVUxOTc3X1JFR19CTE9DS19QT1dFUl9TQUksIDAsIDApLAorCVNORF9TT0NfREFQTV9BREMoIkFEQzIiLCAiQ2FwdHVyZSIsIEFEQVUxOTc3X1JFR19CTE9DS19QT1dFUl9TQUksIDEsIDApLAorCVNORF9TT0NfREFQTV9BREMoIkFEQzMiLCAiQ2FwdHVyZSIsIEFEQVUxOTc3X1JFR19CTE9DS19QT1dFUl9TQUksIDIsIDApLAorCVNORF9TT0NfREFQTV9BREMoIkFEQzQiLCAiQ2FwdHVyZSIsIEFEQVUxOTc3X1JFR19CTE9DS19QT1dFUl9TQUksIDMsIDApLAorCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4xIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4yIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4zIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU40IiksCisKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJWUkVGIiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhZGF1MTk3N19kYXBtX3JvdXRlc1tdID0geworCXsgIkFEQzEiLCBOVUxMLCAiQUlOMSIgfSwKKwl7ICJBREMyIiwgTlVMTCwgIkFJTjIiIH0sCisJeyAiQURDMyIsIE5VTEwsICJBSU4zIiB9LAorCXsgIkFEQzQiLCBOVUxMLCAiQUlONCIgfSwKKworCXsgIkFEQzEiLCBOVUxMLCAiVnJlZiIgfSwKKwl7ICJBREMyIiwgTlVMTCwgIlZyZWYiIH0sCisJeyAiQURDMyIsIE5VTEwsICJWcmVmIiB9LAorCXsgIkFEQzQiLCBOVUxMLCAiVnJlZiIgfSwKKworCXsgIlZSRUYiLCBOVUxMLCAiVnJlZiIgfSwKK307CisKKyNkZWZpbmUgQURBVTE5NzdfVk9MVU1FKHgpIFwKKwlTT0NfU0lOR0xFX1RMVigiQURDIiAjeCAiIENhcHR1cmUgVm9sdW1lIiwgXAorCQlBREFVMTk3N19SRUdfUE9TVF9BRENfR0FJTigoeCkgLSAxKSwgXAorCQkwLCAyNTUsIDEsIGFkYXUxOTc3X2FkY19nYWluKQorCisjZGVmaW5lIEFEQVUxOTc3X0hQRl9TV0lUQ0goeCkgXAorCVNPQ19TSU5HTEUoIkFEQyIgI3ggIiBIaWdocGFzcy1GaWx0ZXIgQ2FwdHVyZSBTd2l0Y2giLCBcCisJCUFEQVUxOTc3X1JFR19EQ19IUEZfQ0FMLCAoeCkgLSAxLCAxLCAwKQorCisjZGVmaW5lIEFEQVUxOTc3X0RDX1NVQl9TV0lUQ0goeCkgXAorCVNPQ19TSU5HTEUoIkFEQyIgI3ggIiBEQyBTdWJzdHJhY3Rpb24gQ2FwdHVyZSBTd2l0Y2giLCBcCisJCUFEQVUxOTc3X1JFR19EQ19IUEZfQ0FMLCAoeCkgKyAzLCAxLCAwKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdTE5Nzdfc25kX2NvbnRyb2xzW10gPSB7CisJQURBVTE5NzdfVk9MVU1FKDEpLAorCUFEQVUxOTc3X1ZPTFVNRSgyKSwKKwlBREFVMTk3N19WT0xVTUUoMyksCisJQURBVTE5NzdfVk9MVU1FKDQpLAorCisJQURBVTE5NzdfSFBGX1NXSVRDSCgxKSwKKwlBREFVMTk3N19IUEZfU1dJVENIKDIpLAorCUFEQVUxOTc3X0hQRl9TV0lUQ0goMyksCisJQURBVTE5NzdfSFBGX1NXSVRDSCg0KSwKKworCUFEQVUxOTc3X0RDX1NVQl9TV0lUQ0goMSksCisJQURBVTE5NzdfRENfU1VCX1NXSVRDSCgyKSwKKwlBREFVMTk3N19EQ19TVUJfU1dJVENIKDMpLAorCUFEQVUxOTc3X0RDX1NVQl9TV0lUQ0goNCksCit9OworCitzdGF0aWMgaW50IGFkYXUxOTc3X3Jlc2V0KHN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcpCit7CisJaW50IHJldDsKKworCS8qCisJICogVGhlIHJlc2V0IGJpdCBpcyBvYnZpb3VzbHkgdm9sYXRpbGUsIGJ1dCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gY2FjaGUKKwkgKiB0aGUgb3RoZXIgYml0cyBpbiB0aGUgcmVnaXN0ZXIsIHNvIHdlIGNhbid0IGp1c3QgbWFyayB0aGUgd2hvbGUKKwkgKiByZWdpc3RlciBhcyB2b2xhdGlsZS4gU2luY2UgdGhpcyBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSB3ZSdsbCBldmVyCisJICogdG91Y2ggdGhlIHJlc2V0IGJpdCBqdXN0IGJ5cGFzcyB0aGUgY2FjaGUgZm9yIHRoaXMgb3BlcmF0aW9uLgorCSAqLworCXJlZ2NhY2hlX2NhY2hlX2J5cGFzcyhhZGF1MTk3Ny0+cmVnbWFwLCB0cnVlKTsKKwlyZXQgPSByZWdtYXBfd3JpdGUoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX1BPV0VSLAorCQkJQURBVTE5NzdfUE9XRVJfUkVTRVQpOworCXJlZ2NhY2hlX2NhY2hlX2J5cGFzcyhhZGF1MTk3Ny0+cmVnbWFwLCBmYWxzZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBzZXR0aW5nIGZvciB0aHMgRlMgZmllbGQgaW4gdGhlIENUUkwwIHJlZ2lzdGVyCisgKiBkZXBlbmRpbmcgb24gdGhlIHJhdGUuCisgKi8KK3N0YXRpYyBpbnQgYWRhdTE5NzdfbG9va3VwX2ZzKHVuc2lnbmVkIGludCByYXRlKQoreworCWlmIChyYXRlID49IDgwMDAgJiYgcmF0ZSA8PSAxMjAwMCkKKwkJcmV0dXJuIEFEQVUxOTc3X1NBSV9DVFJMMF9GU184MDAwXzEyMDAwOworCWVsc2UgaWYgKHJhdGUgPj0gMTYwMDAgJiYgcmF0ZSA8PSAyNDAwMCkKKwkJcmV0dXJuIEFEQVUxOTc3X1NBSV9DVFJMMF9GU18xNjAwMF8yNDAwMDsKKwllbHNlIGlmIChyYXRlID49IDMyMDAwICYmIHJhdGUgPD0gNDgwMDApCisJCXJldHVybiBBREFVMTk3N19TQUlfQ1RSTDBfRlNfMzIwMDBfNDgwMDA7CisJZWxzZSBpZiAocmF0ZSA+PSA2NDAwMCAmJiByYXRlIDw9IDk2MDAwKQorCQlyZXR1cm4gQURBVTE5NzdfU0FJX0NUUkwwX0ZTXzY0MDAwXzk2MDAwOworCWVsc2UgaWYgKHJhdGUgPj0gMTI4MDAwICYmIHJhdGUgPD0gMTkyMDAwKQorCQlyZXR1cm4gQURBVTE5NzdfU0FJX0NUUkwwX0ZTXzEyODAwMF8xOTIwMDA7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhZGF1MTk3N19sb29rdXBfbWNzKHN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcsIHVuc2lnbmVkIGludCByYXRlLAorCXVuc2lnbmVkIGludCBmcykKK3sKKwl1bnNpZ25lZCBpbnQgbWNzOworCisJLyoKKwkgKiByYXRlID0gc3lzY2xrIC8gKDUxMiAqIG1jc19sdXRbbWNzXSkgKiAyKipmcworCSAqID0+IG1jc19sdXRbbWNzXSA9IHN5c2NsayAvICg1MTIgKiByYXRlKSAqIDIqKmZzCisJICogPT4gbWNzX2x1dFttY3NdID0gc3lzY2xrIC8gKCg1MTIgLyAyKipmcykgKiByYXRlKQorCSAqLworCisJcmF0ZSAqPSA1MTIgPj4gZnM7CisKKwlpZiAoYWRhdTE5NzctPnN5c2NsayAlIHJhdGUgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltY3MgPSBhZGF1MTk3Ny0+c3lzY2xrIC8gcmF0ZTsKKworCS8qIFRoZSBmYWN0b3JzIGNvbmZpZ3VyZWQgYnkgTUNTIGFyZSAxLCAyLCAzLCA0LCA2ICovCisJaWYgKG1jcyA8IDEgfHwgbWNzID4gNiB8fCBtY3MgPT0gNSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltY3MgPSBtY3MgLSAxOworCWlmIChtY3MgPT0gNSkKKwkJbWNzID0gNDsKKworCXJldHVybiBtY3M7Cit9CisKK3N0YXRpYyBpbnQgYWRhdTE5NzdfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJdW5zaWduZWQgaW50IHNsb3Rfd2lkdGg7CisJdW5zaWduZWQgaW50IGN0cmwwLCBjdHJsMF9tYXNrOworCXVuc2lnbmVkIGludCBjdHJsMTsKKwlpbnQgbWNzLCBmczsKKwlpbnQgcmV0OworCisJZnMgPSBhZGF1MTk3N19sb29rdXBfZnMocmF0ZSk7CisJaWYgKGZzIDwgMCkKKwkJcmV0dXJuIGZzOworCisJaWYgKGFkYXUxOTc3LT5zeXNjbGtfc3JjID09IEFEQVUxOTc3X1NZU0NMS19TUkNfTUNMSykgeworCQltY3MgPSBhZGF1MTk3N19sb29rdXBfbWNzKGFkYXUxOTc3LCByYXRlLCBmcyk7CisJCWlmIChtY3MgPCAwKQorCQkJcmV0dXJuIG1jczsKKwl9IGVsc2UgeworCQltY3MgPSAwOworCX0KKworCWN0cmwwX21hc2sgPSBBREFVMTk3N19TQUlfQ1RSTDBfRlNfTUFTSzsKKwljdHJsMCA9IGZzOworCisJaWYgKGFkYXUxOTc3LT5yaWdodF9qKSB7CisJCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKKwkJY2FzZSAxNjoKKwkJCWN0cmwwIHw9IEFEQVUxOTc3X1NBSV9DVFJMMF9GTVRfUkpfMTZCSVQ7CisJCQlicmVhazsKKwkJY2FzZSAyNDoKKwkJCWN0cmwwIHw9IEFEQVUxOTc3X1NBSV9DVFJMMF9GTVRfUkpfMjRCSVQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWN0cmwwX21hc2sgfD0gQURBVTE5NzdfU0FJX0NUUkwwX0ZNVF9NQVNLOworCX0KKworCWlmIChhZGF1MTk3Ny0+bWFzdGVyKSB7CisJCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKKwkJY2FzZSAxNjoKKwkJCWN0cmwxID0gQURBVTE5NzdfU0FJX0NUUkwxX0RBVEFfV0lEVEhfMTZCSVQ7CisJCQlzbG90X3dpZHRoID0gMTY7CisJCQlicmVhazsKKwkJY2FzZSAyNDoKKwkJY2FzZSAzMjoKKwkJCWN0cmwxID0gQURBVTE5NzdfU0FJX0NUUkwxX0RBVEFfV0lEVEhfMjRCSVQ7CisJCQlzbG90X3dpZHRoID0gMzI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogSW4gVERNIG1vZGUgdGhlcmUgaXMgYSBmaXhlZCBzbG90IHdpZHRoICovCisJCWlmIChhZGF1MTk3Ny0+c2xvdF93aWR0aCkKKwkJCXNsb3Rfd2lkdGggPSBhZGF1MTk3Ny0+c2xvdF93aWR0aDsKKworCQlpZiAoc2xvdF93aWR0aCA9PSAxNikKKwkJCWN0cmwxIHw9IEFEQVUxOTc3X1NBSV9DVFJMMV9CQ0xLUkFURV8xNjsKKwkJZWxzZQorCQkJY3RybDEgfD0gQURBVTE5NzdfU0FJX0NUUkwxX0JDTEtSQVRFXzMyOworCisJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhhZGF1MTk3Ny0+cmVnbWFwLAorCQkJQURBVTE5NzdfUkVHX1NBSV9DVFJMMSwKKwkJCUFEQVUxOTc3X1NBSV9DVFJMMV9EQVRBX1dJRFRIX01BU0sgfAorCQkJQURBVTE5NzdfU0FJX0NUUkwxX0JDTEtSQVRFX01BU0ssCisJCQljdHJsMSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX1NBSV9DVFJMMCwKKwkJCQljdHJsMF9tYXNrLCBjdHJsMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19QTEwsCisJCQkJQURBVTE5NzdfUExMX01DU19NQVNLLCBtY3MpOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X3Bvd2VyX2Rpc2FibGUoc3RydWN0IGFkYXUxOTc3ICphZGF1MTk3NykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghYWRhdTE5NzctPmVuYWJsZWQpCisJCXJldHVybiAwOworCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19QT1dFUiwKKwkJQURBVTE5NzdfUE9XRVJfUFdVUCwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJlZ2NhY2hlX21hcmtfZGlydHkoYWRhdTE5NzctPnJlZ21hcCk7CisKKwlpZiAoYWRhdTE5NzctPnJlc2V0X2dwaW8pCisJCWdwaW9kX3NldF92YWx1ZV9jYW5zbGVlcChhZGF1MTk3Ny0+cmVzZXRfZ3BpbywgMCk7CisKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KGFkYXUxOTc3LT5yZWdtYXAsIHRydWUpOworCisJcmVndWxhdG9yX2Rpc2FibGUoYWRhdTE5NzctPmF2ZGRfcmVnKTsKKwlpZiAoYWRhdTE5NzctPmR2ZGRfcmVnKQorCQlyZWd1bGF0b3JfZGlzYWJsZShhZGF1MTk3Ny0+ZHZkZF9yZWcpOworCisJYWRhdTE5NzctPmVuYWJsZWQgPSBmYWxzZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X3Bvd2VyX2VuYWJsZShzdHJ1Y3QgYWRhdTE5NzcgKmFkYXUxOTc3KQoreworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IHJldCA9IDA7CisKKwlpZiAoYWRhdTE5NzctPmVuYWJsZWQpCisJCXJldHVybiAwOworCisJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShhZGF1MTk3Ny0+YXZkZF9yZWcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoYWRhdTE5NzctPmR2ZGRfcmVnKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoYWRhdTE5NzctPmR2ZGRfcmVnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2Rpc2FibGVfYXZkZDsKKwl9CisKKwlpZiAoYWRhdTE5NzctPnJlc2V0X2dwaW8pCisJCWdwaW9kX3NldF92YWx1ZV9jYW5zbGVlcChhZGF1MTk3Ny0+cmVzZXRfZ3BpbywgMSk7CisKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KGFkYXUxOTc3LT5yZWdtYXAsIGZhbHNlKTsKKworCWlmIChhZGF1MTk3Ny0+c3dpdGNoX21vZGUpCisJCWFkYXUxOTc3LT5zd2l0Y2hfbW9kZShhZGF1MTk3Ny0+ZGV2KTsKKworCXJldCA9IGFkYXUxOTc3X3Jlc2V0KGFkYXUxOTc3KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kaXNhYmxlX2R2ZGQ7CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX1BPV0VSLAorCQlBREFVMTk3N19QT1dFUl9QV1VQLCBBREFVMTk3N19QT1dFUl9QV1VQKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kaXNhYmxlX2R2ZGQ7CisKKwlyZXQgPSByZWdjYWNoZV9zeW5jKGFkYXUxOTc3LT5yZWdtYXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2Rpc2FibGVfZHZkZDsKKworCS8qCisJICogVGhlIFBMTCByZWdpc3RlciBpcyBub3QgYWZmZWN0ZWQgYnkgdGhlIHNvZnR3YXJlIHJlc2V0LiBJdCBpcworCSAqIHBvc3NpYmxlIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSByZWdpc3RlciB3YXMgY2hhbmdlZCB0byB0aGUKKwkgKiBkZWZhdWx0IHZhbHVlIHdoaWxlIHdlIHdlcmUgaW4gY2FjaGUgb25seSBtb2RlLiBJbiB0aGlzIGNhc2UKKwkgKiByZWdjYWNoZV9zeW5jIHdpbGwgc2tpcCBvdmVyIGl0IGFuZCB3ZSBoYXZlIHRvIG1hbnVhbGx5IHN5bmMKKwkgKiBpdC4KKwkgKi8KKwlyZXQgPSByZWdtYXBfcmVhZChhZGF1MTk3Ny0+cmVnbWFwLCBBREFVMTk3N19SRUdfUExMLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kaXNhYmxlX2R2ZGQ7CisKKwlpZiAodmFsID09IDB4NDEpIHsKKwkJcmVnY2FjaGVfY2FjaGVfYnlwYXNzKGFkYXUxOTc3LT5yZWdtYXAsIHRydWUpOworCQlyZXQgPSByZWdtYXBfd3JpdGUoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX1BMTCwKKwkJCTB4NDEpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfZGlzYWJsZV9kdmRkOworCQlyZWdjYWNoZV9jYWNoZV9ieXBhc3MoYWRhdTE5NzctPnJlZ21hcCwgZmFsc2UpOworCX0KKworCWFkYXUxOTc3LT5lbmFibGVkID0gdHJ1ZTsKKworCXJldHVybiByZXQ7CisKK2Vycl9kaXNhYmxlX2R2ZGQ6CisJaWYgKGFkYXUxOTc3LT5kdmRkX3JlZykKKwkJcmVndWxhdG9yX2Rpc2FibGUoYWRhdTE5NzctPmR2ZGRfcmVnKTsKK2Vycl9kaXNhYmxlX2F2ZGQ6CisJCXJlZ3VsYXRvcl9kaXNhYmxlKGFkYXUxOTc3LT5hdmRkX3JlZyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGF1MTk3N19zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpCit7CisJc3RydWN0IGFkYXUxOTc3ICphZGF1MTk3NyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgorCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKQorCQkJcmV0ID0gYWRhdTE5NzdfcG93ZXJfZW5hYmxlKGFkYXUxOTc3KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQlyZXQgPSBhZGF1MTk3N19wb3dlcl9kaXNhYmxlKGFkYXUxOTc3KTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X3NldF90ZG1fc2xvdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IHR4X21hc2ssCisJdW5zaWduZWQgaW50IHJ4X21hc2ssIGludCBzbG90cywgaW50IHdpZHRoKQoreworCXN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGRhaS0+Y29kZWMpOworCXVuc2lnbmVkIGludCBjdHJsMCwgY3RybDEsIGRydjsKKwl1bnNpZ25lZCBpbnQgc2xvdFs0XTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJaWYgKHNsb3RzID09IDApIHsKKwkJLyogMCA9IE5vIGZpeGVkIHNsb3Qgd2lkdGggKi8KKwkJYWRhdTE5NzctPnNsb3Rfd2lkdGggPSAwOworCQlhZGF1MTk3Ny0+bWF4X21hc3Rlcl9mcyA9IDE5MjAwMDsKKwkJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhhZGF1MTk3Ny0+cmVnbWFwLAorCQkJQURBVTE5NzdfUkVHX1NBSV9DVFJMMCwgQURBVTE5NzdfU0FJX0NUUkwwX1NBSV9NQVNLLAorCQkJQURBVTE5NzdfU0FJX0NUUkwwX1NBSV9JMlMpOworCX0KKworCWlmIChyeF9tYXNrID09IDAgfHwgdHhfbWFzayAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRydiA9IDA7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlzbG90W2ldID0gX19mZnMocnhfbWFzayk7CisJCWRydiB8PSBBREFVMTk3N19TQUlfT1ZFUlRFTVBfRFJWX0MoaSk7CisJCXJ4X21hc2sgJj0gfigxIDw8IHNsb3RbaV0pOworCQlpZiAoc2xvdFtpXSA+PSBzbG90cykKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAocnhfbWFzayA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKHJ4X21hc2sgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHdpZHRoKSB7CisJY2FzZSAxNjoKKwkJY3RybDEgPSBBREFVMTk3N19TQUlfQ1RSTDFfU0xPVF9XSURUSF8xNjsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJLyogV2UgY2FuIG9ubHkgZ2VuZXJhdGUgMTYgYml0IG9yIDMyIGJpdCB3aWRlIHNsb3RzICovCisJCWlmIChhZGF1MTk3Ny0+bWFzdGVyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWN0cmwxID0gQURBVTE5NzdfU0FJX0NUUkwxX1NMT1RfV0lEVEhfMjQ7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCWN0cmwxID0gQURBVTE5NzdfU0FJX0NUUkwxX1NMT1RfV0lEVEhfMzI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoc2xvdHMpIHsKKwljYXNlIDI6CisJCWN0cmwwID0gQURBVTE5NzdfU0FJX0NUUkwwX1NBSV9URE1fMjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQljdHJsMCA9IEFEQVUxOTc3X1NBSV9DVFJMMF9TQUlfVERNXzQ7CisJCWJyZWFrOworCWNhc2UgODoKKwkJY3RybDAgPSBBREFVMTk3N19TQUlfQ1RSTDBfU0FJX1RETV84OworCQlicmVhazsKKwljYXNlIDE2OgorCQljdHJsMCA9IEFEQVUxOTc3X1NBSV9DVFJMMF9TQUlfVERNXzE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX1NBSV9PVkVSVEVNUCwKKwkJQURBVTE5NzdfU0FJX09WRVJURU1QX0RSVl9DKDApIHwKKwkJQURBVTE5NzdfU0FJX09WRVJURU1QX0RSVl9DKDEpIHwKKwkJQURBVTE5NzdfU0FJX09WRVJURU1QX0RSVl9DKDIpIHwKKwkJQURBVTE5NzdfU0FJX09WRVJURU1QX0RSVl9DKDMpLCBkcnYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSByZWdtYXBfd3JpdGUoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX0NNQVAxMiwKKwkJKHNsb3RbMV0gPDwgQURBVTE5NzdfQ0hBTl9NQVBfU0VDT05EX1NMT1RfT0ZGU0VUKSB8CisJCShzbG90WzBdIDw8IEFEQVUxOTc3X0NIQU5fTUFQX0ZJUlNUX1NMT1RfT0ZGU0VUKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHJlZ21hcF93cml0ZShhZGF1MTk3Ny0+cmVnbWFwLCBBREFVMTk3N19SRUdfQ01BUDM0LAorCQkoc2xvdFszXSA8PCBBREFVMTk3N19DSEFOX01BUF9TRUNPTkRfU0xPVF9PRkZTRVQpIHwKKwkJKHNsb3RbMl0gPDwgQURBVTE5NzdfQ0hBTl9NQVBfRklSU1RfU0xPVF9PRkZTRVQpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19TQUlfQ1RSTDAsCisJCUFEQVUxOTc3X1NBSV9DVFJMMF9TQUlfTUFTSywgY3RybDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX1NBSV9DVFJMMSwKKwkJQURBVTE5NzdfU0FJX0NUUkwxX1NMT1RfV0lEVEhfTUFTSywgY3RybDEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlhZGF1MTk3Ny0+c2xvdF93aWR0aCA9IHdpZHRoOworCisJLyogSW4gbWFzdGVyIG1vZGUgdGhlIG1heGltdW0gYml0Y2xvY2sgaXMgMjQuNTc2IE1IeiAqLworCWFkYXUxOTc3LT5tYXhfbWFzdGVyX2ZzID0gbWluKDE5MjAwMCwgMjQ1NzYwMDAgLyB3aWR0aCAvIHNsb3RzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X211dGUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBtdXRlLCBpbnQgc3RyZWFtKQoreworCXN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGRhaS0+Y29kZWMpOworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAobXV0ZSkKKwkJdmFsID0gQURBVTE5NzdfTUlTQ19DT05UUk9MX01NVVRFOworCWVsc2UKKwkJdmFsID0gMDsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX01JU0NfQ09OVFJPTCwKKwkJCUFEQVUxOTc3X01JU0NfQ09OVFJPTF9NTVVURSwgdmFsKTsKK30KKworc3RhdGljIGludCBhZGF1MTk3N19zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3QgYWRhdTE5NzcgKmFkYXUxOTc3ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShkYWktPmNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgY3RybDAgPSAwLCBjdHJsMSA9IDAsIGJsb2NrX3Bvd2VyID0gMDsKKwlib29sIGludmVydF9scmNsazsKKwlpbnQgcmV0OworCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJYWRhdTE5NzctPm1hc3RlciA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWN0cmwxIHw9IEFEQVUxOTc3X1NBSV9DVFJMMV9NQVNURVI7CisJCWFkYXUxOTc3LT5tYXN0ZXIgPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJaW52ZXJ0X2xyY2xrID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCWJsb2NrX3Bvd2VyIHw9IEFEQVUxOTc3X0JMT0NLX1BPV0VSX1NBSV9CQ0xLX0VER0U7CisJCWludmVydF9scmNsayA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX0lGOgorCQlpbnZlcnRfbHJjbGsgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0lCX0lGOgorCQlibG9ja19wb3dlciB8PSBBREFVMTk3N19CTE9DS19QT1dFUl9TQUlfQkNMS19FREdFOworCQlpbnZlcnRfbHJjbGsgPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhZGF1MTk3Ny0+cmlnaHRfaiA9IGZhbHNlOworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJY3RybDAgfD0gQURBVTE5NzdfU0FJX0NUUkwwX0ZNVF9JMlM7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfTEVGVF9KOgorCQljdHJsMCB8PSBBREFVMTk3N19TQUlfQ1RSTDBfRk1UX0xKOworCQlpbnZlcnRfbHJjbGsgPSAhaW52ZXJ0X2xyY2xrOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6CisJCWN0cmwwIHw9IEFEQVUxOTc3X1NBSV9DVFJMMF9GTVRfUkpfMjRCSVQ7CisJCWFkYXUxOTc3LT5yaWdodF9qID0gdHJ1ZTsKKwkJaW52ZXJ0X2xyY2xrID0gIWludmVydF9scmNsazsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKKwkJY3RybDEgfD0gQURBVTE5NzdfU0FJX0NUUkwxX0xSQ0xLX1BVTFNFOworCQljdHJsMCB8PSBBREFVMTk3N19TQUlfQ1RSTDBfRk1UX0kyUzsKKwkJaW52ZXJ0X2xyY2xrID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCWN0cmwxIHw9IEFEQVUxOTc3X1NBSV9DVFJMMV9MUkNMS19QVUxTRTsKKwkJY3RybDAgfD0gQURBVTE5NzdfU0FJX0NUUkwwX0ZNVF9MSjsKKwkJaW52ZXJ0X2xyY2xrID0gZmFsc2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChpbnZlcnRfbHJjbGspCisJCWJsb2NrX3Bvd2VyIHw9IEFEQVUxOTc3X0JMT0NLX1BPV0VSX1NBSV9MUl9QT0w7CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX0JMT0NLX1BPV0VSX1NBSSwKKwkJQURBVTE5NzdfQkxPQ0tfUE9XRVJfU0FJX0xSX1BPTCB8CisJCUFEQVUxOTc3X0JMT0NLX1BPV0VSX1NBSV9CQ0xLX0VER0UsIGJsb2NrX3Bvd2VyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19TQUlfQ1RSTDAsCisJCUFEQVUxOTc3X1NBSV9DVFJMMF9GTVRfTUFTSywKKwkJY3RybDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19TQUlfQ1RSTDEsCisJCUFEQVUxOTc3X1NBSV9DVFJMMV9NQVNURVIgfCBBREFVMTk3N19TQUlfQ1RSTDFfTFJDTEtfUFVMU0UsCisJCWN0cmwxKTsKK30KKworc3RhdGljIGludCBhZGF1MTk3N19zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGRhaS0+Y29kZWMpOworCXU2NCBmb3JtYXRzID0gMDsKKworCWlmIChhZGF1MTk3Ny0+c2xvdF93aWR0aCA9PSAxNikKKwkJZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfQkU7CisJZWxzZSBpZiAoYWRhdTE5NzctPnJpZ2h0X2ogfHwgYWRhdTE5NzctPnNsb3Rfd2lkdGggPT0gMjQpCisJCWZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0JFIHwKKwkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjRfQkU7CisKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChzdWJzdHJlYW0tPnJ1bnRpbWUsIDAsCisJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCAmYWRhdTE5NzctPmNvbnN0cmFpbnRzKTsKKworCWlmIChhZGF1MTk3Ny0+bWFzdGVyKQorCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHN1YnN0cmVhbS0+cnVudGltZSwKKwkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCA4MDAwLCBhZGF1MTk3Ny0+bWF4X21hc3Rlcl9mcyk7CisKKwlpZiAoZm9ybWF0cyAhPSAwKQorCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWFzazY0KHN1YnN0cmVhbS0+cnVudGltZSwKKwkJCVNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsIGZvcm1hdHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRhdTE5Nzdfc2V0X3RyaXN0YXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgdHJpc3RhdGUpCit7CisJc3RydWN0IGFkYXUxOTc3ICphZGF1MTk3NyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYyk7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmICh0cmlzdGF0ZSkKKwkJdmFsID0gQURBVTE5NzdfU0FJX09WRVJURU1QX0RSVl9ISVo7CisJZWxzZQorCQl2YWwgPSAwOworCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhhZGF1MTk3Ny0+cmVnbWFwLCBBREFVMTk3N19SRUdfU0FJX09WRVJURU1QLAorCQlBREFVMTk3N19TQUlfT1ZFUlRFTVBfRFJWX0hJWiwgdmFsKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgYWRhdTE5NzdfZGFpX29wcyA9IHsKKwkuc3RhcnR1cAk9IGFkYXUxOTc3X3N0YXJ0dXAsCisJLmh3X3BhcmFtcwk9IGFkYXUxOTc3X2h3X3BhcmFtcywKKwkubXV0ZV9zdHJlYW0JPSBhZGF1MTk3N19tdXRlLAorCS5zZXRfZm10CT0gYWRhdTE5Nzdfc2V0X2RhaV9mbXQsCisJLnNldF90ZG1fc2xvdAk9IGFkYXUxOTc3X3NldF90ZG1fc2xvdCwKKwkuc2V0X3RyaXN0YXRlCT0gYWRhdTE5Nzdfc2V0X3RyaXN0YXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgYWRhdTE5NzdfZGFpID0geworCS5uYW1lID0gImFkYXUxOTc3LWhpZmkiLAorCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAiQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gNCwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVCwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAorCQkuc2lnX2JpdHMgPSAyNCwKKwl9LAorCS5vcHMgPSAmYWRhdTE5NzdfZGFpX29wcywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYWRhdTE5NzdfcmF0ZXNbXSA9IHsKKwk4MDAwLCAxNjAwMCwgMzIwMDAsIDY0MDAwLCAxMjgwMDAsCisJMTEwMjUsIDIyMDUwLCA0NDEwMCwgODgyMDAsIDE3MjQwMCwKKwkxMjAwMCwgMjQwMDAsIDQ4MDAwLCA5NjAwMCwgMTkyMDAwLAorfTsKKworI2RlZmluZSBBREFVMTk3N19SQVRFX0NPTlNUUkFJTlRfTUFTS18zMjAwMCAweDAwMWYKKyNkZWZpbmUgQURBVTE5NzdfUkFURV9DT05TVFJBSU5UX01BU0tfNDQxMDAgMHgwM2UwCisjZGVmaW5lIEFEQVUxOTc3X1JBVEVfQ09OU1RSQUlOVF9NQVNLXzQ4MDAwIDB4N2MwMAorLyogQWxsIHJhdGVzID49IDMyMDAwICovCisjZGVmaW5lIEFEQVUxOTc3X1JBVEVfQ09OU1RSQUlOVF9NQVNLX0xSQ0xLIDB4NzM5YworCitzdGF0aWMgYm9vbCBhZGF1MTk3N19jaGVja19zeXNjbGsodW5zaWduZWQgaW50IG1jbGssIHVuc2lnbmVkIGludCBiYXNlX2ZyZXEpCit7CisJdW5zaWduZWQgaW50IG1jczsKKworCWlmIChtY2xrICUgKGJhc2VfZnJlcSAqIDEyOCkgIT0gMCkKKwkJcmV0dXJuIGZhbHNlOworCisJbWNzID0gbWNsayAvICgxMjggKiBiYXNlX2ZyZXEpOworCWlmIChtY3MgPCAxIHx8IG1jcyA+IDYgfHwgbWNzID09IDUpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X3NldF9zeXNjbGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCWludCBjbGtfaWQsIGludCBzb3VyY2UsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQoreworCXN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJdW5zaWduZWQgaW50IGNsa19zcmM7CisJdW5zaWduZWQgaW50IHJldDsKKworCWlmIChkaXIgIT0gU05EX1NPQ19DTE9DS19JTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY2xrX2lkICE9IEFEQVUxOTc3X1NZU0NMSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHNvdXJjZSkgeworCWNhc2UgQURBVTE5NzdfU1lTQ0xLX1NSQ19NQ0xLOgorCQljbGtfc3JjID0gMDsKKwkJYnJlYWs7CisJY2FzZSBBREFVMTk3N19TWVNDTEtfU1JDX0xSQ0xLOgorCQljbGtfc3JjID0gQURBVTE5NzdfUExMX0NMS19TOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZnJlcSAhPSAwICYmIHNvdXJjZSA9PSBBREFVMTk3N19TWVNDTEtfU1JDX01DTEspIHsKKwkJaWYgKGZyZXEgPCA0MDAwMDAwIHx8IGZyZXEgPiAzNjg2NDAwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChhZGF1MTk3N19jaGVja19zeXNjbGsoZnJlcSwgMzIwMDApKQorCQkJbWFzayB8PSBBREFVMTk3N19SQVRFX0NPTlNUUkFJTlRfTUFTS18zMjAwMDsKKwkJaWYgKGFkYXUxOTc3X2NoZWNrX3N5c2NsayhmcmVxLCA0NDEwMCkpCisJCQltYXNrIHw9IEFEQVUxOTc3X1JBVEVfQ09OU1RSQUlOVF9NQVNLXzQ0MTAwOworCQlpZiAoYWRhdTE5NzdfY2hlY2tfc3lzY2xrKGZyZXEsIDQ4MDAwKSkKKwkJCW1hc2sgfD0gQURBVTE5NzdfUkFURV9DT05TVFJBSU5UX01BU0tfNDgwMDA7CisKKwkJaWYgKG1hc2sgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoc291cmNlID09IEFEQVUxOTc3X1NZU0NMS19TUkNfTFJDTEspIHsKKwkJbWFzayA9IEFEQVUxOTc3X1JBVEVfQ09OU1RSQUlOVF9NQVNLX0xSQ0xLOworCX0KKworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhhZGF1MTk3Ny0+cmVnbWFwLCBBREFVMTk3N19SRUdfUExMLAorCQlBREFVMTk3N19QTExfQ0xLX1MsIGNsa19zcmMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlhZGF1MTk3Ny0+Y29uc3RyYWludHMubWFzayA9IG1hc2s7CisJYWRhdTE5NzctPnN5c2Nsa19zcmMgPSBzb3VyY2U7CisJYWRhdTE5NzctPnN5c2NsayA9IGZyZXE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGF1MTk3N19jb2RlY19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFkYXUxOTc3ICphZGF1MTk3NyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQ7CisKKwlzd2l0Y2ggKGFkYXUxOTc3LT50eXBlKSB7CisJY2FzZSBBREFVMTk3NzoKKwkJcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scygmY29kZWMtPmRhcG0sCisJCQlhZGF1MTk3N19taWNiaWFzX2RhcG1fd2lkZ2V0cywKKwkJCUFSUkFZX1NJWkUoYWRhdTE5NzdfbWljYmlhc19kYXBtX3dpZGdldHMpKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBhZGF1MTk3N19jb2RlY19kcml2ZXIgPSB7CisJLnByb2JlID0gYWRhdTE5NzdfY29kZWNfcHJvYmUsCisJLnNldF9iaWFzX2xldmVsID0gYWRhdTE5Nzdfc2V0X2JpYXNfbGV2ZWwsCisJLnNldF9zeXNjbGsgPSBhZGF1MTk3N19zZXRfc3lzY2xrLAorCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKKworCS5jb250cm9scyA9IGFkYXUxOTc3X3NuZF9jb250cm9scywKKwkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhZGF1MTk3N19zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSBhZGF1MTk3N19kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFkYXUxOTc3X2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYWRhdTE5NzdfZGFwbV9yb3V0ZXMsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWRhdTE5NzdfZGFwbV9yb3V0ZXMpLAorfTsKKworc3RhdGljIGludCBhZGF1MTk3N19zZXR1cF9taWNiaWFzKHN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcpCit7CisJc3RydWN0IGFkYXUxOTc3X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gYWRhdTE5NzctPmRldi0+cGxhdGZvcm1fZGF0YTsKKwl1bnNpZ25lZCBpbnQgbWljYmlhczsKKworCWlmIChwZGF0YSkgeworCQltaWNiaWFzID0gcGRhdGEtPm1pY2JpYXM7CisJCWlmIChtaWNiaWFzID4gQURBVTE5NzdfTUlDQklBU185VjApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCX0gZWxzZSB7CisJCW1pY2JpYXMgPSBBREFVMTk3N19NSUNCSUFTXzhWNTsKKwl9CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19NSUNCSUFTLAorCQlBREFVMTk3N19NSUNCSUFTX01CX1ZPTFRTX01BU0ssCisJCW1pY2JpYXMgPDwgQURBVTE5NzdfTUlDQklBU19NQl9WT0xUU19PRkZTRVQpOworfQorCitpbnQgYWRhdTE5NzdfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCisJZW51bSBhZGF1MTk3N190eXBlIHR5cGUsIHZvaWQgKCpzd2l0Y2hfbW9kZSkoc3RydWN0IGRldmljZSAqZGV2KSkKK3sKKwl1bnNpZ25lZCBpbnQgcG93ZXJfb2ZmX21hc2s7CisJc3RydWN0IGFkYXUxOTc3ICphZGF1MTk3NzsKKwlpbnQgcmV0OworCisJaWYgKElTX0VSUihyZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOworCisJYWRhdTE5NzcgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmFkYXUxOTc3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFkYXUxOTc3ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYWRhdTE5NzctPmRldiA9IGRldjsKKwlhZGF1MTk3Ny0+dHlwZSA9IHR5cGU7CisJYWRhdTE5NzctPnJlZ21hcCA9IHJlZ21hcDsKKwlhZGF1MTk3Ny0+c3dpdGNoX21vZGUgPSBzd2l0Y2hfbW9kZTsKKwlhZGF1MTk3Ny0+bWF4X21hc3Rlcl9mcyA9IDE5MjAwMDsKKworCWFkYXUxOTc3LT5jb25zdHJhaW50cy5saXN0ID0gYWRhdTE5NzdfcmF0ZXM7CisJYWRhdTE5NzctPmNvbnN0cmFpbnRzLmNvdW50ID0gQVJSQVlfU0laRShhZGF1MTk3N19yYXRlcyk7CisKKwlhZGF1MTk3Ny0+YXZkZF9yZWcgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoZGV2LCAiQVZERCIpOworCWlmIChJU19FUlIoYWRhdTE5NzctPmF2ZGRfcmVnKSkKKwkJcmV0dXJuIFBUUl9FUlIoYWRhdTE5NzctPmF2ZGRfcmVnKTsKKworCWFkYXUxOTc3LT5kdmRkX3JlZyA9IGRldm1fcmVndWxhdG9yX2dldF9vcHRpb25hbChkZXYsICJEVkREIik7CisJaWYgKElTX0VSUihhZGF1MTk3Ny0+ZHZkZF9yZWcpKSB7CisJCWlmIChQVFJfRVJSKGFkYXUxOTc3LT5kdmRkX3JlZykgIT0gLUVOT0RFVikKKwkJCXJldHVybiBQVFJfRVJSKGFkYXUxOTc3LT5kdmRkX3JlZyk7CisJCWFkYXUxOTc3LT5kdmRkX3JlZyA9IE5VTEw7CisJfQorCisJYWRhdTE5NzctPnJlc2V0X2dwaW8gPSBkZXZtX2dwaW9kX2dldChkZXYsICJyZXNldCIpOworCWlmIChJU19FUlIoYWRhdTE5NzctPnJlc2V0X2dwaW8pKSB7CisJCXJldCA9IFBUUl9FUlIoYWRhdTE5NzctPnJlc2V0X2dwaW8pOworCQlpZiAocmV0ICE9IC1FTk9FTlQgJiYgcmV0ICE9IC1FTk9TWVMpCisJCQlyZXR1cm4gUFRSX0VSUihhZGF1MTk3Ny0+cmVzZXRfZ3Bpbyk7CisJCWFkYXUxOTc3LT5yZXNldF9ncGlvID0gTlVMTDsKKwl9CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBhZGF1MTk3Nyk7CisKKwlpZiAoYWRhdTE5NzctPnJlc2V0X2dwaW8pIHsKKwkJcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX291dHB1dChhZGF1MTk3Ny0+cmVzZXRfZ3BpbywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQluZGVsYXkoMTAwKTsKKwl9CisKKwlyZXQgPSBhZGF1MTk3N19wb3dlcl9lbmFibGUoYWRhdTE5NzcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodHlwZSA9PSBBREFVMTk3NykgeworCQlyZXQgPSBhZGF1MTk3N19zZXR1cF9taWNiaWFzKGFkYXUxOTc3KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX3Bvd2Vyb2ZmOworCX0KKworCWlmIChhZGF1MTk3Ny0+ZHZkZF9yZWcpCisJCXBvd2VyX29mZl9tYXNrID0gfjA7CisJZWxzZQorCQlwb3dlcl9vZmZfbWFzayA9IH5BREFVMTk3N19CTE9DS19QT1dFUl9TQUlfTERPX0VOOworCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19CTE9DS19QT1dFUl9TQUksCisJCQkJcG93ZXJfb2ZmX21hc2ssIDB4MDApOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3Bvd2Vyb2ZmOworCisJcmV0ID0gYWRhdTE5NzdfcG93ZXJfZGlzYWJsZShhZGF1MTk3Nyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJmFkYXUxOTc3X2NvZGVjX2RyaXZlciwKKwkJCSZhZGF1MTk3N19kYWksIDEpOworCitlcnJfcG93ZXJvZmY6CisJYWRhdTE5NzdfcG93ZXJfZGlzYWJsZShhZGF1MTk3Nyk7CisJcmV0dXJuIHJldDsKKworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWRhdTE5NzdfcHJvYmUpOworCitzdGF0aWMgYm9vbCBhZGF1MTk3N19yZWdpc3Rlcl92b2xhdGlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIEFEQVUxOTc3X1JFR19TVEFUVVMoMCk6CisJY2FzZSBBREFVMTk3N19SRUdfU1RBVFVTKDEpOgorCWNhc2UgQURBVTE5NzdfUkVHX1NUQVRVUygyKToKKwljYXNlIEFEQVUxOTc3X1JFR19TVEFUVVMoMyk6CisJY2FzZSBBREFVMTk3N19SRUdfQURDX0NMSVA6CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWRhdTE5NzdfcmVnbWFwX2NvbmZpZyA9IHsKKwkubWF4X3JlZ2lzdGVyID0gQURBVTE5NzdfUkVHX0RDX0hQRl9DQUwsCisJLnZvbGF0aWxlX3JlZyA9IGFkYXUxOTc3X3JlZ2lzdGVyX3ZvbGF0aWxlLAorCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLnJlZ19kZWZhdWx0cyA9IGFkYXUxOTc3X3JlZ19kZWZhdWx0cywKKwkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUoYWRhdTE5NzdfcmVnX2RlZmF1bHRzKSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChhZGF1MTk3N19yZWdtYXBfY29uZmlnKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEFEQVUxOTc3L0FEQVUxOTc4L0FEQVUxOTc5IGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LmggYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlNzE0MwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE5NzcuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQURBVTE5NzcvQURBVTE5NzgvQURBVTE5NzkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTQgQW5hbG9nIERldmljZXMgSW5jLgorICogIEF1dGhvcjogTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgorICovCisKKyNpZm5kZWYgX19TT1VORF9TT0NfQ09ERUNTX0FEQVUxOTc3X0hfXworI2RlZmluZSBfX1NPVU5EX1NPQ19DT0RFQ1NfQURBVTE5NzdfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworc3RydWN0IGRldmljZTsKKworZW51bSBhZGF1MTk3N190eXBlIHsKKwlBREFVMTk3NywKKwlBREFVMTk3OCwKKwlBREFVMTk3OSwKK307CisKK2ludCBhZGF1MTk3N19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKKwllbnVtIGFkYXUxOTc3X3R5cGUgdHlwZSwgdm9pZCAoKnN3aXRjaF9tb2RlKShzdHJ1Y3QgZGV2aWNlICpkZXYpKTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkYXUxOTc3X3JlZ21hcF9jb25maWc7CisKK2VudW0gYWRhdTE5NzdfY2xrX2lkIHsKKwlBREFVMTk3N19TWVNDTEssCit9OworCitlbnVtIGFkYXUxOTc3X3N5c2Nsa19zcmMgeworCUFEQVUxOTc3X1NZU0NMS19TUkNfTUNMSywKKwlBREFVMTk3N19TWVNDTEtfU1JDX0xSQ0xLLAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MDEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MGZjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MDEuYwpAQCAtMCwwICsxLDUzIEBACisvKgorICogQURBVjgwMSBhdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgImFkYXY4MHguaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkYXY4MHhfc3BpX2lkW10gPSB7CisJeyAiYWRhdjgwMSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgYWRhdjgweF9zcGlfaWQpOworCitzdGF0aWMgaW50IGFkYXY4MHhfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHJlZ21hcF9jb25maWcgY29uZmlnOworCisJY29uZmlnID0gYWRhdjgweF9yZWdtYXBfY29uZmlnOworCWNvbmZpZy5yZWFkX2ZsYWdfbWFzayA9IDB4MDE7CisKKwlyZXR1cm4gYWRhdjgweF9idXNfcHJvYmUoJnNwaS0+ZGV2LCBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZjb25maWcpKTsKK30KKworc3RhdGljIGludCBhZGF2ODB4X3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkYXY4MHhfc3BpX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJhZGF2ODAxIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gYWRhdjgweF9zcGlfcHJvYmUsCisJLnJlbW92ZQkJPSBhZGF2ODB4X3NwaV9yZW1vdmUsCisJLmlkX3RhYmxlCT0gYWRhdjgweF9zcGlfaWQsCit9OworbW9kdWxlX3NwaV9kcml2ZXIoYWRhdjgweF9zcGlfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEFEQVY4MDEgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4iKTsKK01PRFVMRV9BVVRIT1IoIllpIExpIDx5aS5saUBhbmFsb2cuY29tPj4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgwMy5jIGIvc291bmQvc29jL2NvZGVjcy9hZGF2ODAzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZkOWZjZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgwMy5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBBREFWODAzIGF1ZGlvIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDE0IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlICJhZGF2ODB4LmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZGF2ODAzX2lkW10gPSB7CisJeyAiYWRhdjgwMyIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWRhdjgwM19pZCk7CisKK3N0YXRpYyBpbnQgYWRhdjgwM19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIGFkYXY4MHhfYnVzX3Byb2JlKCZjbGllbnQtPmRldiwKKwkJZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmYWRhdjgweF9yZWdtYXBfY29uZmlnKSk7Cit9CisKK3N0YXRpYyBpbnQgYWRhdjgwM19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkYXY4MDNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkYXY4MDMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkYXY4MDNfcHJvYmUsCisJLnJlbW92ZSA9IGFkYXY4MDNfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGFkYXY4MDNfaWQsCit9OworbW9kdWxlX2kyY19kcml2ZXIoYWRhdjgwM19kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgQURBVjgwMyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkxhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPiIpOworTU9EVUxFX0FVVEhPUigiWWkgTGkgPHlpLmxpQGFuYWxvZy5jb20+PiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF2ODB4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYwppbmRleCBmNzhiMjdhLi41MDYyZTM0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYwpAQCAtOCwxNyArOCwxNSBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Ci0jaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAKICNpbmNsdWRlICJhZGF2ODB4LmgiCiAKQEAgLTU0MSw2ICs1MzksNyBAQAogCQkJICAgICAgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCiB7CiAJc3RydWN0IGFkYXY4MHggKmFkYXY4MHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKIAlpZiAoZGlyID09IFNORF9TT0NfQ0xPQ0tfSU4pIHsKIAkJc3dpdGNoIChjbGtfaWQpIHsKQEAgLTU3Myw3ICs1NzIsNyBAQAogCQkJcmVnbWFwX3dyaXRlKGFkYXY4MHgtPnJlZ21hcCwgQURBVjgwWF9JQ0xLX0NUUkwyLAogCQkJCWljbGtfY3RybDIpOwogCi0JCQlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOworCQkJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAJCX0KIAl9IGVsc2UgewogCQl1bnNpZ25lZCBpbnQgbWFzazsKQEAgLTYwMCwxNyArNTk5LDIxIEBACiAJCQlhZGF2ODB4LT5zeXNjbGtfcGRbY2xrX2lkXSA9IGZhbHNlOwogCQl9CiAKKwkJc25kX3NvY19kYXBtX211dGV4X2xvY2soZGFwbSk7CisKIAkJaWYgKGFkYXY4MHgtPnN5c2Nsa19wZFswXSkKLQkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJQTEwxIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlBMTDEiKTsKIAkJZWxzZQotCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiUExMMSIpOworCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlBMTDEiKTsKIAogCQlpZiAoYWRhdjgweC0+c3lzY2xrX3BkWzFdIHx8IGFkYXY4MHgtPnN5c2Nsa19wZFsyXSkKLQkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJQTEwyIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlBMTDIiKTsKIAkJZWxzZQotCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiUExMMiIpOworCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlBMTDIiKTsKIAotCQlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOworCQlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCQlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogCX0KIAogCXJldHVybiAwOwpAQCAtNzIyLDcgKzcyNSw3IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKIAlzdHJ1Y3QgYWRhdjgweCAqYWRhdjgweCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JaWYgKCFjb2RlYy0+YWN0aXZlIHx8ICFhZGF2ODB4LT5yYXRlKQorCWlmICghc25kX3NvY19jb2RlY19pc19hY3RpdmUoY29kZWMpIHx8ICFhZGF2ODB4LT5yYXRlKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHN1YnN0cmVhbS0+cnVudGltZSwKQEAgLTczNSw3ICs3MzgsNyBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJc3RydWN0IGFkYXY4MHggKmFkYXY4MHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAotCWlmICghY29kZWMtPmFjdGl2ZSkKKwlpZiAoIXNuZF9zb2NfY29kZWNfaXNfYWN0aXZlKGNvZGVjKSkKIAkJYWRhdjgweC0+cmF0ZSA9IDA7CiB9CiAKQEAgLTc5OCwxNSArODAxLDggQEAKIAogc3RhdGljIGludCBhZGF2ODB4X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgcmV0OwogCXN0cnVjdCBhZGF2ODB4ICphZGF2ODB4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMCwgMCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIEZvcmNlIFBMTHMgb24gZm9yIFNZU0NMSyBvdXRwdXQgKi8KIAlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJQTEwxIik7CiAJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiUExMMiIpOwpAQCAtODY0LDM5ICs4NjAsMjYgQEAKIAkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhZGF2ODB4X2RhcG1fcm91dGVzKSwKIH07CiAKLXN0YXRpYyBpbnQgYWRhdjgweF9idXNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCitpbnQgYWRhdjgweF9idXNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCiB7CiAJc3RydWN0IGFkYXY4MHggKmFkYXY4MHg7Ci0JaW50IHJldDsKIAogCWlmIChJU19FUlIocmVnbWFwKSkKIAkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKIAotCWFkYXY4MHggPSBremFsbG9jKHNpemVvZigqYWRhdjgweCksIEdGUF9LRVJORUwpOworCWFkYXY4MHggPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmFkYXY4MHgpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFkYXY4MHgpCiAJCXJldHVybiAtRU5PTUVNOwogCi0KIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBhZGF2ODB4KTsKIAlhZGF2ODB4LT5yZWdtYXAgPSByZWdtYXA7CiAKLQlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJmFkYXY4MHhfY29kZWNfZHJpdmVyLAorCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJmFkYXY4MHhfY29kZWNfZHJpdmVyLAogCQlhZGF2ODB4X2RhaXMsIEFSUkFZX1NJWkUoYWRhdjgweF9kYWlzKSk7Ci0JaWYgKHJldCkKLQkJa2ZyZWUoYWRhdjgweCk7Ci0KLQlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYWRhdjgweF9idXNfcHJvYmUpOwogCi1zdGF0aWMgaW50IGFkYXY4MHhfYnVzX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKGRldik7Ci0Ja2ZyZWUoZGV2X2dldF9kcnZkYXRhKGRldikpOwotCXJldHVybiAwOwotfQotCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhZGF2ODB4X3NwaV9yZWdtYXBfY29uZmlnID0geworY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWRhdjgweF9yZWdtYXBfY29uZmlnID0gewogCS52YWxfYml0cyA9IDgsCiAJLnBhZF9iaXRzID0gMSwKIAkucmVnX2JpdHMgPSA3LApAQCAtOTA4LDEwNSArODkxLDcgQEAKIAkucmVnX2RlZmF1bHRzID0gYWRhdjgweF9yZWdfZGVmYXVsdHMsCiAJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKGFkYXY4MHhfcmVnX2RlZmF1bHRzKSwKIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhZGF2ODB4X3NwaV9pZFtdID0gewotCXsgImFkYXY4MDEiLCAwIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIGFkYXY4MHhfc3BpX2lkKTsKLQotc3RhdGljIGludCBhZGF2ODB4X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXJldHVybiBhZGF2ODB4X2J1c19wcm9iZSgmc3BpLT5kZXYsCi0JCWRldm1fcmVnbWFwX2luaXRfc3BpKHNwaSwgJmFkYXY4MHhfc3BpX3JlZ21hcF9jb25maWcpKTsKLX0KLQotc3RhdGljIGludCBhZGF2ODB4X3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlyZXR1cm4gYWRhdjgweF9idXNfcmVtb3ZlKCZzcGktPmRldik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZGF2ODB4X3NwaV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAiYWRhdjgwMSIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCi0JLnByb2JlCQk9IGFkYXY4MHhfc3BpX3Byb2JlLAotCS5yZW1vdmUJCT0gYWRhdjgweF9zcGlfcmVtb3ZlLAotCS5pZF90YWJsZQk9IGFkYXY4MHhfc3BpX2lkLAotfTsKLSNlbmRpZgotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkYXY4MHhfaTJjX3JlZ21hcF9jb25maWcgPSB7Ci0JLnZhbF9iaXRzID0gOCwKLQkucGFkX2JpdHMgPSAxLAotCS5yZWdfYml0cyA9IDcsCi0KLQkubWF4X3JlZ2lzdGVyID0gQURBVjgwWF9QTExfT1VURSwKLQotCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAotCS5yZWdfZGVmYXVsdHMgPSBhZGF2ODB4X3JlZ19kZWZhdWx0cywKLQkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUoYWRhdjgweF9yZWdfZGVmYXVsdHMpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkYXY4MHhfaTJjX2lkW10gPSB7Ci0JeyAiYWRhdjgwMyIsIDAgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWRhdjgweF9pMmNfaWQpOwotCi1zdGF0aWMgaW50IGFkYXY4MHhfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlyZXR1cm4gYWRhdjgweF9idXNfcHJvYmUoJmNsaWVudC0+ZGV2LAotCQlkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZhZGF2ODB4X2kyY19yZWdtYXBfY29uZmlnKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWRhdjgweF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JcmV0dXJuIGFkYXY4MHhfYnVzX3JlbW92ZSgmY2xpZW50LT5kZXYpOwotfQotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWRhdjgweF9pMmNfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImFkYXY4MDMiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotCS5wcm9iZSA9IGFkYXY4MHhfaTJjX3Byb2JlLAotCS5yZW1vdmUgPSBhZGF2ODB4X2kyY19yZW1vdmUsCi0JLmlkX3RhYmxlID0gYWRhdjgweF9pMmNfaWQsCi19OwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgX19pbml0IGFkYXY4MHhfaW5pdCh2b2lkKQotewotCWludCByZXQgPSAwOwotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQotCXJldCA9IGkyY19hZGRfZHJpdmVyKCZhZGF2ODB4X2kyY19kcml2ZXIpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCi0JcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWRhdjgweF9zcGlfZHJpdmVyKTsKLSNlbmRpZgotCi0JcmV0dXJuIHJldDsKLX0KLW1vZHVsZV9pbml0KGFkYXY4MHhfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhZGF2ODB4X2V4aXQodm9pZCkKLXsKLSNpZiBJU19FTkFCTEVEKENPTkZJR19JMkMpCi0JaTJjX2RlbF9kcml2ZXIoJmFkYXY4MHhfaTJjX2RyaXZlcik7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQotCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWRhdjgweF9zcGlfZHJpdmVyKTsKLSNlbmRpZgotfQotbW9kdWxlX2V4aXQoYWRhdjgweF9leGl0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGFkYXY4MHhfcmVnbWFwX2NvbmZpZyk7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiQVNvQyBBREFWODB4IGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguaCBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgweC5oCmluZGV4IGFkYjBmYzcuLjhhMWQ3YzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgweC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgweC5oCkBAIC05LDYgKzksMTMgQEAKICNpZm5kZWYgX0FEQVY4MFhfSAogI2RlZmluZSBfQURBVjgwWF9ICiAKKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworc3RydWN0IGRldmljZTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkYXY4MHhfcmVnbWFwX2NvbmZpZzsKK2ludCBhZGF2ODB4X2J1c19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCk7CisKIGVudW0gYWRhdjgweF9wbGxfc3JjIHsKIAlBREFWODBYX1BMTF9TUkNfWElOLAogCUFEQVY4MFhfUExMX1NSQ19YVEFMLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQxMDQuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0MTA0LmMKaW5kZXggYjQ4MTlkYy4uMTBhZGYyNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQxMDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDEwNC5jCkBAIC0xNzQsOCArMTc0LDYgQEAKIAlzdHJ1Y3QgYWs0MTA0X3ByaXZhdGUgKmFrNDEwNCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCByZXQ7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gYWs0MTA0LT5yZWdtYXA7Ci0KIAkvKiBzZXQgcG93ZXItdXAgYW5kIG5vbi1yZXNldCBiaXRzICovCiAJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGFrNDEwNC0+cmVnbWFwLCBBSzQxMDRfUkVHX0NPTlRST0wxLAogCQkJCSBBSzQxMDRfQ09OVFJPTDFfUFcgfCBBSzQxMDRfQ09OVFJPTDFfUlNUTiwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTM1LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDUzNS5jCmluZGV4IDY4NGZlOTEuLjMwZTI5NzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTM1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ1MzUuYwpAQCAtMzg4LDE1ICszODgsNiBAQAogCiBzdGF0aWMgaW50IGFrNDUzNV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0Jc3RydWN0IGFrNDUzNV9wcml2ICphazQ1MzUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwotCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGFrNDUzNS0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KIAkvKiBwb3dlciBvbiBkZXZpY2UgKi8KIAlhazQ1MzVfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQxLmMKaW5kZXggOTRjYmU1MC4uODY4YzBlMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0MS5jCkBAIC0xMTMsMTQgKzExMywxNCBAQAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGF1eF9pbl90bHYsIC0yMTAwLCAzMDAsIDApOwogCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWs0NjQxX21vbm9fb3V0X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBSzQ2NDFfU0lHMSwgNiwgMiwgYWs0NjQxX21vbm9fb3V0KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWs0NjQxX2hwX291dF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQUs0NjQxX01PREUyLCAyLCAyLCBhazQ2NDFfaHBfb3V0KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWs0NjQxX21pY19zZWxlY3RfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFLNDY0MV9NSUMsIDEsIDIsIGFrNDY0MV9taWNfc2VsZWN0KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWs0NjQxX21pY19vcl9kYWNfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFLNDY0MV9CVElGLCA0LCAyLCBhazQ2NDFfbWljX29yX2RhYyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWs0NjQxX21vbm9fb3V0X2VudW0sCisJCQkgICAgQUs0NjQxX1NJRzEsIDYsIGFrNDY0MV9tb25vX291dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWs0NjQxX2hwX291dF9lbnVtLAorCQkJICAgIEFLNDY0MV9NT0RFMiwgMiwgYWs0NjQxX2hwX291dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWs0NjQxX21pY19zZWxlY3RfZW51bSwKKwkJCSAgICBBSzQ2NDFfTUlDLCAxLCBhazQ2NDFfbWljX3NlbGVjdCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWs0NjQxX21pY19vcl9kYWNfZW51bSwKKwkJCSAgICBBSzQ2NDFfQlRJRiwgNCwgYWs0NjQxX21pY19vcl9kYWMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWs0NjQxX3NuZF9jb250cm9sc1tdID0gewogCVNPQ19FTlVNKCJNb25vIDEgT3V0cHV0IiwgYWs0NjQxX21vbm9fb3V0X2VudW0pLApAQCAtNTE5LDE0ICs1MTksNiBAQAogCiBzdGF0aWMgaW50IGFrNDY0MV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKiBwb3dlciBvbiBkZXZpY2UgKi8KIAlhazQ2NDFfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQyLmMKaW5kZXggMWY2NDZjNi4uOTI2NTVjYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0Mi5jCkBAIC00NjUsMTQgKzQ2NSw2IEBACiAKIHN0YXRpYyBpbnQgYWs0NjQyX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJYWs0NjQyX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY3MS5jCmluZGV4IDI1YmRmNmEuLjk5OGZhMGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NzEuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CkBAIC0yMywxMDQgKzI0LDk5IEBACiAjaW5jbHVkZSAiYWs0NjcxLmgiCiAKIAotLyogY29kZWMgcHJpdmF0ZSBkYXRhICovCi1zdHJ1Y3QgYWs0NjcxX3ByaXYgewotCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwotfTsKLQogLyogYWs0NjcxIHJlZ2lzdGVyIGNhY2hlICYgZGVmYXVsdCByZWdpc3RlciBzZXR0aW5ncyAqLwotc3RhdGljIGNvbnN0IHU4IGFrNDY3MV9yZWdbQUs0NjcxX0NBQ0hFUkVHTlVNXSA9IHsKLQkweDAwLAkvKiBBSzQ2NzFfQURfREFfUE9XRVJfTUFOQUdFTUVOVAkoMHgwMCkJKi8KLQkweGY2LAkvKiBBSzQ2NzFfUExMX01PREVfU0VMRUNUMAkJKDB4MDEpCSovCi0JMHgwMCwJLyogQUs0NjcxX1BMTF9NT0RFX1NFTEVDVDEJCSgweDAyKQkqLwotCTB4MDIsCS8qIEFLNDY3MV9GT1JNQVRfU0VMRUNUCQkJKDB4MDMpCSovCi0JMHgwMCwJLyogQUs0NjcxX01JQ19TSUdOQUxfU0VMRUNUCQkoMHgwNCkJKi8KLQkweDU1LAkvKiBBSzQ2NzFfTUlDX0FNUF9HQUlOCQkJKDB4MDUpCSovCi0JMHgwMCwJLyogQUs0NjcxX01JWElOR19QT1dFUl9NQU5BR0VNRU5UMAkoMHgwNikJKi8KLQkweDAwLAkvKiBBSzQ2NzFfTUlYSU5HX1BPV0VSX01BTkFHRU1FTlQxCSgweDA3KQkqLwotCTB4YjUsCS8qIEFLNDY3MV9PVVRQVVRfVk9MVU1FX0NPTlRST0wJCSgweDA4KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9MT1VUMV9TSUdOQUxfU0VMRUNUCQkoMHgwOSkJKi8KLQkweDAwLAkvKiBBSzQ2NzFfUk9VVDFfU0lHTkFMX1NFTEVDVAkJKDB4MGEpCSovCi0JMHgwMCwJLyogQUs0NjcxX0xPVVQyX1NJR05BTF9TRUxFQ1QJCSgweDBiKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9ST1VUMl9TSUdOQUxfU0VMRUNUCQkoMHgwYykJKi8KLQkweDAwLAkvKiBBSzQ2NzFfTE9VVDNfU0lHTkFMX1NFTEVDVAkJKDB4MGQpCSovCi0JMHgwMCwJLyogQUs0NjcxX1JPVVQzX1NJR05BTF9TRUxFQ1QJCSgweDBlKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9MT1VUMV9QT1dFUl9NQU5BR0VSTUVOVAkoMHgwZikJKi8KLQkweDAwLAkvKiBBSzQ2NzFfTE9VVDJfUE9XRVJfTUFOQUdFUk1FTlQJKDB4MTApCSovCi0JMHg4MCwJLyogQUs0NjcxX0xPVVQzX1BPV0VSX01BTkFHRVJNRU5UCSgweDExKQkqLwotCTB4OTEsCS8qIEFLNDY3MV9MQ0hfSU5QVVRfVk9MVU1FX0NPTlRST0wJKDB4MTIpCSovCi0JMHg5MSwJLyogQUs0NjcxX1JDSF9JTlBVVF9WT0xVTUVfQ09OVFJPTAkoMHgxMykJKi8KLQkweGUxLAkvKiBBSzQ2NzFfQUxDX1JFRkVSRU5DRV9TRUxFQ1QJCSgweDE0KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9ESUdJVEFMX01JWElOR19DT05UUk9MCSgweDE1KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9BTENfVElNRVJfU0VMRUNUCQkoMHgxNikJKi8KLQkweDAwLAkvKiBBSzQ2NzFfQUxDX01PREVfQ09OVFJPTAkJKDB4MTcpCSovCi0JMHgwMiwJLyogQUs0NjcxX01PREVfQ09OVFJPTDEJCQkoMHgxOCkJKi8KLQkweDAxLAkvKiBBSzQ2NzFfTU9ERV9DT05UUk9MMgkJCSgweDE5KQkqLwotCTB4MTgsCS8qIEFLNDY3MV9MQ0hfT1VUUFVUX1ZPTFVNRV9DT05UUk9MCSgweDFhKQkqLwotCTB4MTgsCS8qIEFLNDY3MV9SQ0hfT1VUUFVUX1ZPTFVNRV9DT05UUk9MCSgweDFiKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9TSURFVE9ORV9BX0NPTlRST0wJCSgweDFjKQkqLwotCTB4MDIsCS8qIEFLNDY3MV9ESUdJVEFMX0ZJTFRFUl9TRUxFQ1QJCSgweDFkKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9GSUwzX0NPRUZGSUNJRU5UMAkJKDB4MWUpCSovCi0JMHgwMCwJLyogQUs0NjcxX0ZJTDNfQ09FRkZJQ0lFTlQxCQkoMHgxZikJKi8KLQkweDAwLAkvKiBBSzQ2NzFfRklMM19DT0VGRklDSUVOVDIJCSgweDIwKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9GSUwzX0NPRUZGSUNJRU5UMwkJKDB4MjEpCSovCi0JMHgwMCwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UMAkJKDB4MjIpCSovCi0JMHgwMCwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UMQkJKDB4MjMpCSovCi0JMHgwMCwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UMgkJKDB4MjQpCSovCi0JMHgwMCwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UMwkJKDB4MjUpCSovCi0JMHgwMCwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UNAkJKDB4MjYpCSovCi0JMHgwMCwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UNQkJKDB4MjcpCSovCi0JMHhhOSwJLyogQUs0NjcxX0ZJTDFfQ09FRkZJQ0lFTlQwCQkoMHgyOCkJKi8KLQkweDFmLAkvKiBBSzQ2NzFfRklMMV9DT0VGRklDSUVOVDEJCSgweDI5KQkqLwotCTB4YWQsCS8qIEFLNDY3MV9GSUwxX0NPRUZGSUNJRU5UMgkJKDB4MmEpCSovCi0JMHgyMCwJLyogQUs0NjcxX0ZJTDFfQ09FRkZJQ0lFTlQzCQkoMHgyYikJKi8KLQkweDAwLAkvKiBBSzQ2NzFfRklMMl9DT0VGRklDSUVOVDAJCSgweDJjKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9GSUwyX0NPRUZGSUNJRU5UMQkJKDB4MmQpCSovCi0JMHgwMCwJLyogQUs0NjcxX0ZJTDJfQ09FRkZJQ0lFTlQyCQkoMHgyZSkJKi8KLQkweDAwLAkvKiBBSzQ2NzFfRklMMl9DT0VGRklDSUVOVDMJCSgweDJmKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9ESUdJVEFMX0ZJTFRFUl9TRUxFQ1QyCSgweDMwKQkqLwotCTB4MDAsCS8qIHRoaXMgcmVnaXN0ZXIgbm90IHVzZWQJCQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDAJCSgweDMyKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDEJCSgweDMzKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDIJCSgweDM0KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDMJCSgweDM1KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDQJCSgweDM2KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDUJCSgweDM3KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDAJCSgweDM4KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDEJCSgweDM5KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDIJCSgweDNhKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDMJCSgweDNiKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDQJCSgweDNjKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDUJCSgweDNkKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDAJCSgweDNlKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDEJCSgweDNmKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDIJCSgweDQwKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDMJCSgweDQxKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDQJCSgweDQyKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDUJCSgweDQzKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDAJCSgweDQ0KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDEJCSgweDQ1KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDIJCSgweDQ2KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDMJCSgweDQ3KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDQJCSgweDQ4KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDUJCSgweDQ5KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDAJCSgweDRhKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDEJCSgweDRiKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDIJCSgweDRjKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDMJCSgweDRkKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDQJCSgweDRlKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDUJCSgweDRmKQkqLwotCTB4ODgsCS8qIEFLNDY3MV9FUV9DT05UUk9MXzI1MEhaXzEwMEhaCSgweDUwKQkqLwotCTB4ODgsCS8qIEFLNDY3MV9FUV9DT05UUk9MXzM1MDBIWl8xS0haCSgweDUxKQkqLwotCTB4MDgsCS8qIEFLNDY3MV9FUV9DT05UUk9fMTBLSFoJCSgweDUyKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9QQ01fSUZfQ09OVFJPTDAJCSgweDUzKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9QQ01fSUZfQ09OVFJPTDEJCSgweDU0KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9QQ01fSUZfQ09OVFJPTDIJCSgweDU1KQkqLwotCTB4MTgsCS8qIEFLNDY3MV9ESUdJVEFMX1ZPTFVNRV9CX0NPTlRST0wJKDB4NTYpCSovCi0JMHgxOCwJLyogQUs0NjcxX0RJR0lUQUxfVk9MVU1FX0NfQ09OVFJPTAkoMHg1NykJKi8KLQkweDAwLAkvKiBBSzQ2NzFfU0lERVRPTkVfVk9MVU1FX0NPTlRST0wJKDB4NTgpCSovCi0JMHgwMCwJLyogQUs0NjcxX0RJR0lUQUxfTUlYSU5HX0NPTlRST0wyCSgweDU5KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9TQVJfQURDX0NPTlRST0wJCSgweDVhKQkqLworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCBhazQ2NzFfcmVnX2RlZmF1bHRzW10gPSB7CisJeyAweDAwLCAweDAwIH0sCS8qIEFLNDY3MV9BRF9EQV9QT1dFUl9NQU5BR0VNRU5UCSgweDAwKQkqLworCXsgMHgwMSwgMHhmNiB9LAkvKiBBSzQ2NzFfUExMX01PREVfU0VMRUNUMAkJKDB4MDEpCSovCisJeyAweDAyLCAweDAwIH0sCS8qIEFLNDY3MV9QTExfTU9ERV9TRUxFQ1QxCQkoMHgwMikJKi8KKwl7IDB4MDMsIDB4MDIgfSwJLyogQUs0NjcxX0ZPUk1BVF9TRUxFQ1QJCQkoMHgwMykJKi8KKwl7IDB4MDQsIDB4MDAgfSwJLyogQUs0NjcxX01JQ19TSUdOQUxfU0VMRUNUCQkoMHgwNCkJKi8KKwl7IDB4MDUsIDB4NTUgfSwJLyogQUs0NjcxX01JQ19BTVBfR0FJTgkJCSgweDA1KQkqLworCXsgMHgwNiwgMHgwMCB9LAkvKiBBSzQ2NzFfTUlYSU5HX1BPV0VSX01BTkFHRU1FTlQwCSgweDA2KQkqLworCXsgMHgwNywgMHgwMCB9LAkvKiBBSzQ2NzFfTUlYSU5HX1BPV0VSX01BTkFHRU1FTlQxCSgweDA3KQkqLworCXsgMHgwOCwgMHhiNSB9LAkvKiBBSzQ2NzFfT1VUUFVUX1ZPTFVNRV9DT05UUk9MCQkoMHgwOCkJKi8KKwl7IDB4MDksIDB4MDAgfSwJLyogQUs0NjcxX0xPVVQxX1NJR05BTF9TRUxFQ1QJCSgweDA5KQkqLworCXsgMHgwYSwgMHgwMCB9LAkvKiBBSzQ2NzFfUk9VVDFfU0lHTkFMX1NFTEVDVAkJKDB4MGEpCSovCisJeyAweDBiLCAweDAwIH0sCS8qIEFLNDY3MV9MT1VUMl9TSUdOQUxfU0VMRUNUCQkoMHgwYikJKi8KKwl7IDB4MGMsIDB4MDAgfSwJLyogQUs0NjcxX1JPVVQyX1NJR05BTF9TRUxFQ1QJCSgweDBjKQkqLworCXsgMHgwZCwgMHgwMCB9LAkvKiBBSzQ2NzFfTE9VVDNfU0lHTkFMX1NFTEVDVAkJKDB4MGQpCSovCisJeyAweDBlLCAweDAwIH0sCS8qIEFLNDY3MV9ST1VUM19TSUdOQUxfU0VMRUNUCQkoMHgwZSkJKi8KKwl7IDB4MGYsIDB4MDAgfSwJLyogQUs0NjcxX0xPVVQxX1BPV0VSX01BTkFHRVJNRU5UCSgweDBmKQkqLworCXsgMHgxMCwgMHgwMCB9LAkvKiBBSzQ2NzFfTE9VVDJfUE9XRVJfTUFOQUdFUk1FTlQJKDB4MTApCSovCisJeyAweDExLCAweDgwIH0sCS8qIEFLNDY3MV9MT1VUM19QT1dFUl9NQU5BR0VSTUVOVAkoMHgxMSkJKi8KKwl7IDB4MTIsIDB4OTEgfSwJLyogQUs0NjcxX0xDSF9JTlBVVF9WT0xVTUVfQ09OVFJPTAkoMHgxMikJKi8KKwl7IDB4MTMsIDB4OTEgfSwJLyogQUs0NjcxX1JDSF9JTlBVVF9WT0xVTUVfQ09OVFJPTAkoMHgxMykJKi8KKwl7IDB4MTQsIDB4ZTEgfSwJLyogQUs0NjcxX0FMQ19SRUZFUkVOQ0VfU0VMRUNUCQkoMHgxNCkJKi8KKwl7IDB4MTUsIDB4MDAgfSwJLyogQUs0NjcxX0RJR0lUQUxfTUlYSU5HX0NPTlRST0wJKDB4MTUpCSovCisJeyAweDE2LCAweDAwIH0sCS8qIEFLNDY3MV9BTENfVElNRVJfU0VMRUNUCQkoMHgxNikJKi8KKwl7IDB4MTcsIDB4MDAgfSwJLyogQUs0NjcxX0FMQ19NT0RFX0NPTlRST0wJCSgweDE3KQkqLworCXsgMHgxOCwgMHgwMiB9LAkvKiBBSzQ2NzFfTU9ERV9DT05UUk9MMQkJCSgweDE4KQkqLworCXsgMHgxOSwgMHgwMSB9LAkvKiBBSzQ2NzFfTU9ERV9DT05UUk9MMgkJCSgweDE5KQkqLworCXsgMHgxYSwgMHgxOCB9LAkvKiBBSzQ2NzFfTENIX09VVFBVVF9WT0xVTUVfQ09OVFJPTAkoMHgxYSkJKi8KKwl7IDB4MWIsIDB4MTggfSwJLyogQUs0NjcxX1JDSF9PVVRQVVRfVk9MVU1FX0NPTlRST0wJKDB4MWIpCSovCisJeyAweDFjLCAweDAwIH0sCS8qIEFLNDY3MV9TSURFVE9ORV9BX0NPTlRST0wJCSgweDFjKQkqLworCXsgMHgxZCwgMHgwMiB9LAkvKiBBSzQ2NzFfRElHSVRBTF9GSUxURVJfU0VMRUNUCQkoMHgxZCkJKi8KKwl7IDB4MWUsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDNfQ09FRkZJQ0lFTlQwCQkoMHgxZSkJKi8KKwl7IDB4MWYsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDNfQ09FRkZJQ0lFTlQxCQkoMHgxZikJKi8KKwl7IDB4MjAsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDNfQ09FRkZJQ0lFTlQyCQkoMHgyMCkJKi8KKwl7IDB4MjEsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDNfQ09FRkZJQ0lFTlQzCQkoMHgyMSkJKi8KKwl7IDB4MjIsIDB4MDAgfSwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UMAkJKDB4MjIpCSovCisJeyAweDIzLCAweDAwIH0sCS8qIEFLNDY3MV9FUV9DT0VGRklDSUVOVDEJCSgweDIzKQkqLworCXsgMHgyNCwgMHgwMCB9LAkvKiBBSzQ2NzFfRVFfQ09FRkZJQ0lFTlQyCQkoMHgyNCkJKi8KKwl7IDB4MjUsIDB4MDAgfSwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UMwkJKDB4MjUpCSovCisJeyAweDI2LCAweDAwIH0sCS8qIEFLNDY3MV9FUV9DT0VGRklDSUVOVDQJCSgweDI2KQkqLworCXsgMHgyNywgMHgwMCB9LAkvKiBBSzQ2NzFfRVFfQ09FRkZJQ0lFTlQ1CQkoMHgyNykJKi8KKwl7IDB4MjgsIDB4YTkgfSwJLyogQUs0NjcxX0ZJTDFfQ09FRkZJQ0lFTlQwCQkoMHgyOCkJKi8KKwl7IDB4MjksIDB4MWYgfSwJLyogQUs0NjcxX0ZJTDFfQ09FRkZJQ0lFTlQxCQkoMHgyOSkJKi8KKwl7IDB4MmEsIDB4YWQgfSwJLyogQUs0NjcxX0ZJTDFfQ09FRkZJQ0lFTlQyCQkoMHgyYSkJKi8KKwl7IDB4MmIsIDB4MjAgfSwJLyogQUs0NjcxX0ZJTDFfQ09FRkZJQ0lFTlQzCQkoMHgyYikJKi8KKwl7IDB4MmMsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDJfQ09FRkZJQ0lFTlQwCQkoMHgyYykJKi8KKwl7IDB4MmQsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDJfQ09FRkZJQ0lFTlQxCQkoMHgyZCkJKi8KKwl7IDB4MmUsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDJfQ09FRkZJQ0lFTlQyCQkoMHgyZSkJKi8KKwl7IDB4MmYsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDJfQ09FRkZJQ0lFTlQzCQkoMHgyZikJKi8KKwl7IDB4MzAsIDB4MDAgfSwJLyogQUs0NjcxX0RJR0lUQUxfRklMVEVSX1NFTEVDVDIJKDB4MzApCSovCisKKwl7IDB4MzIsIDB4MDAgfSwJLyogQUs0NjcxX0UxX0NPRUZGSUNJRU5UMAkJKDB4MzIpCSovCisJeyAweDMzLCAweDAwIH0sCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDEJCSgweDMzKQkqLworCXsgMHgzNCwgMHgwMCB9LAkvKiBBSzQ2NzFfRTFfQ09FRkZJQ0lFTlQyCQkoMHgzNCkJKi8KKwl7IDB4MzUsIDB4MDAgfSwJLyogQUs0NjcxX0UxX0NPRUZGSUNJRU5UMwkJKDB4MzUpCSovCisJeyAweDM2LCAweDAwIH0sCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDQJCSgweDM2KQkqLworCXsgMHgzNywgMHgwMCB9LAkvKiBBSzQ2NzFfRTFfQ09FRkZJQ0lFTlQ1CQkoMHgzNykJKi8KKwl7IDB4MzgsIDB4MDAgfSwJLyogQUs0NjcxX0UyX0NPRUZGSUNJRU5UMAkJKDB4MzgpCSovCisJeyAweDM5LCAweDAwIH0sCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDEJCSgweDM5KQkqLworCXsgMHgzYSwgMHgwMCB9LAkvKiBBSzQ2NzFfRTJfQ09FRkZJQ0lFTlQyCQkoMHgzYSkJKi8KKwl7IDB4M2IsIDB4MDAgfSwJLyogQUs0NjcxX0UyX0NPRUZGSUNJRU5UMwkJKDB4M2IpCSovCisJeyAweDNjLCAweDAwIH0sCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDQJCSgweDNjKQkqLworCXsgMHgzZCwgMHgwMCB9LAkvKiBBSzQ2NzFfRTJfQ09FRkZJQ0lFTlQ1CQkoMHgzZCkJKi8KKwl7IDB4M2UsIDB4MDAgfSwJLyogQUs0NjcxX0UzX0NPRUZGSUNJRU5UMAkJKDB4M2UpCSovCisJeyAweDNmLCAweDAwIH0sCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDEJCSgweDNmKQkqLworCXsgMHg0MCwgMHgwMCB9LAkvKiBBSzQ2NzFfRTNfQ09FRkZJQ0lFTlQyCQkoMHg0MCkJKi8KKwl7IDB4NDEsIDB4MDAgfSwJLyogQUs0NjcxX0UzX0NPRUZGSUNJRU5UMwkJKDB4NDEpCSovCisJeyAweDQyLCAweDAwIH0sCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDQJCSgweDQyKQkqLworCXsgMHg0MywgMHgwMCB9LAkvKiBBSzQ2NzFfRTNfQ09FRkZJQ0lFTlQ1CQkoMHg0MykJKi8KKwl7IDB4NDQsIDB4MDAgfSwJLyogQUs0NjcxX0U0X0NPRUZGSUNJRU5UMAkJKDB4NDQpCSovCisJeyAweDQ1LCAweDAwIH0sCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDEJCSgweDQ1KQkqLworCXsgMHg0NiwgMHgwMCB9LAkvKiBBSzQ2NzFfRTRfQ09FRkZJQ0lFTlQyCQkoMHg0NikJKi8KKwl7IDB4NDcsIDB4MDAgfSwJLyogQUs0NjcxX0U0X0NPRUZGSUNJRU5UMwkJKDB4NDcpCSovCisJeyAweDQ4LCAweDAwIH0sCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDQJCSgweDQ4KQkqLworCXsgMHg0OSwgMHgwMCB9LAkvKiBBSzQ2NzFfRTRfQ09FRkZJQ0lFTlQ1CQkoMHg0OSkJKi8KKwl7IDB4NGEsIDB4MDAgfSwJLyogQUs0NjcxX0U1X0NPRUZGSUNJRU5UMAkJKDB4NGEpCSovCisJeyAweDRiLCAweDAwIH0sCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDEJCSgweDRiKQkqLworCXsgMHg0YywgMHgwMCB9LAkvKiBBSzQ2NzFfRTVfQ09FRkZJQ0lFTlQyCQkoMHg0YykJKi8KKwl7IDB4NGQsIDB4MDAgfSwJLyogQUs0NjcxX0U1X0NPRUZGSUNJRU5UMwkJKDB4NGQpCSovCisJeyAweDRlLCAweDAwIH0sCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDQJCSgweDRlKQkqLworCXsgMHg0ZiwgMHgwMCB9LAkvKiBBSzQ2NzFfRTVfQ09FRkZJQ0lFTlQ1CQkoMHg0ZikJKi8KKwl7IDB4NTAsIDB4ODggfSwJLyogQUs0NjcxX0VRX0NPTlRST0xfMjUwSFpfMTAwSFoJKDB4NTApCSovCisJeyAweDUxLCAweDg4IH0sCS8qIEFLNDY3MV9FUV9DT05UUk9MXzM1MDBIWl8xS0haCSgweDUxKQkqLworCXsgMHg1MiwgMHgwOCB9LAkvKiBBSzQ2NzFfRVFfQ09OVFJPXzEwS0haCQkoMHg1MikJKi8KKwl7IDB4NTMsIDB4MDAgfSwJLyogQUs0NjcxX1BDTV9JRl9DT05UUk9MMAkJKDB4NTMpCSovCisJeyAweDU0LCAweDAwIH0sCS8qIEFLNDY3MV9QQ01fSUZfQ09OVFJPTDEJCSgweDU0KQkqLworCXsgMHg1NSwgMHgwMCB9LAkvKiBBSzQ2NzFfUENNX0lGX0NPTlRST0wyCQkoMHg1NSkJKi8KKwl7IDB4NTYsIDB4MTggfSwJLyogQUs0NjcxX0RJR0lUQUxfVk9MVU1FX0JfQ09OVFJPTAkoMHg1NikJKi8KKwl7IDB4NTcsIDB4MTggfSwJLyogQUs0NjcxX0RJR0lUQUxfVk9MVU1FX0NfQ09OVFJPTAkoMHg1NykJKi8KKwl7IDB4NTgsIDB4MDAgfSwJLyogQUs0NjcxX1NJREVUT05FX1ZPTFVNRV9DT05UUk9MCSgweDU4KQkqLworCXsgMHg1OSwgMHgwMCB9LAkvKiBBSzQ2NzFfRElHSVRBTF9NSVhJTkdfQ09OVFJPTDIJKDB4NTkpCSovCisJeyAweDVhLCAweDAwIH0sCS8qIEFLNDY3MV9TQVJfQURDX0NPTlRST0wJCSgweDVhKQkqLwogfTsKIAogLyoKQEAgLTI0MSwxOSArMjM3LDE3IEBACiAvKiBJbnB1dCBNVVhzICovCiBzdGF0aWMgY29uc3QgY2hhciAqYWs0NjcxX2xpbl9tdXhfdGV4dHNbXSA9CiAJCXsiTElOMSIsICJMSU4yIiwgIkxJTjMiLCAiTElONCJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhazQ2NzFfbGluX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQUs0NjcxX01JQ19TSUdOQUxfU0VMRUNULCAwLAotCQkJQVJSQVlfU0laRShhazQ2NzFfbGluX211eF90ZXh0cyksCi0JCQlhazQ2NzFfbGluX211eF90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWs0NjcxX2xpbl9tdXhfZW51bSwKKwkJCSAgICBBSzQ2NzFfTUlDX1NJR05BTF9TRUxFQ1QsIDAsCisJCQkgICAgYWs0NjcxX2xpbl9tdXhfdGV4dHMpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFrNDY3MV9saW5fbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgYWs0NjcxX2xpbl9tdXhfZW51bSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphazQ2NzFfcmluX211eF90ZXh0c1tdID0KIAkJeyJSSU4xIiwgIlJJTjIiLCAiUklOMyIsICJSSU40In07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFrNDY3MV9yaW5fbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBSzQ2NzFfTUlDX1NJR05BTF9TRUxFQ1QsIDIsCi0JCQlBUlJBWV9TSVpFKGFrNDY3MV9yaW5fbXV4X3RleHRzKSwKLQkJCWFrNDY3MV9yaW5fbXV4X3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhazQ2NzFfcmluX211eF9lbnVtLAorCQkJICAgIEFLNDY3MV9NSUNfU0lHTkFMX1NFTEVDVCwgMiwKKwkJCSAgICBhazQ2NzFfcmluX211eF90ZXh0cyk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWs0NjcxX3Jpbl9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhazQ2NzFfcmluX211eF9lbnVtKTsKIApAQCAtNjE5LDIxICs2MTMsNyBAQAogCiBzdGF0aWMgaW50IGFrNDY3MV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0Jc3RydWN0IGFrNDY3MV9wcml2ICphazQ2NzEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIGFrNDY3MS0+Y29udHJvbF90eXBlKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0Jc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGFrNDY3MV9zbmRfY29udHJvbHMsCi0JCQkgICAgIEFSUkFZX1NJWkUoYWs0NjcxX3NuZF9jb250cm9scykpOwotCi0JYWs0NjcxX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBhazQ2NzFfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIH0KIAogc3RhdGljIGludCBhazQ2NzFfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKQEAgLTY0NiwyOCArNjI2LDM2IEBACiAJLnByb2JlID0gYWs0NjcxX3Byb2JlLAogCS5yZW1vdmUgPSBhazQ2NzFfcmVtb3ZlLAogCS5zZXRfYmlhc19sZXZlbCA9IGFrNDY3MV9zZXRfYmlhc19sZXZlbCwKLQkucmVnX2NhY2hlX3NpemUgPSBBSzQ2NzFfQ0FDSEVSRUdOVU0sCi0JLnJlZ193b3JkX3NpemUgPSBzaXplb2YodTgpLAotCS5yZWdfY2FjaGVfZGVmYXVsdCA9IGFrNDY3MV9yZWcsCisJLmNvbnRyb2xzID0gYWs0NjcxX3NuZF9jb250cm9scywKKwkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhazQ2NzFfc25kX2NvbnRyb2xzKSwKIAkuZGFwbV93aWRnZXRzID0gYWs0NjcxX2RhcG1fd2lkZ2V0cywKIAkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWs0NjcxX2RhcG1fd2lkZ2V0cyksCiAJLmRhcG1fcm91dGVzID0gYWs0NjcxX2ludGVyY29uLAogCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFrNDY3MV9pbnRlcmNvbiksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWs0NjcxX3JlZ21hcCA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisKKwkubWF4X3JlZ2lzdGVyID0gQUs0NjcxX1NBUl9BRENfQ09OVFJPTCwKKwkucmVnX2RlZmF1bHRzID0gYWs0NjcxX3JlZ19kZWZhdWx0cywKKwkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUoYWs0NjcxX3JlZ19kZWZhdWx0cyksCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCit9OworCiBzdGF0aWMgaW50IGFrNDY3MV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7Ci0Jc3RydWN0IGFrNDY3MV9wcml2ICphazQ2NzE7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCWludCByZXQ7CiAKLQlhazQ2NzEgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IGFrNDY3MV9wcml2KSwKLQkJCSAgICAgIEdGUF9LRVJORUwpOwotCWlmIChhazQ2NzEgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBhazQ2NzEpOwotCWFrNDY3MS0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CisJcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmYWs0NjcxX3JlZ21hcCk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIocmVnbWFwKTsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gY3JlYXRlIHJlZ21hcDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYsCiAJCQkmc29jX2NvZGVjX2Rldl9hazQ2NzEsICZhazQ2NzFfZGFpLCAxKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmggYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY3MS5oCmluZGV4IDYxY2I3YWIuLjM5NGEzNGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NzEuaApAQCAtMTA1LDggKzEwNSw2IEBACiAjZGVmaW5lIEFLNDY3MV9ESUdJVEFMX01JWElOR19DT05UUk9MMgkJMHg1OQogI2RlZmluZSBBSzQ2NzFfU0FSX0FEQ19DT05UUk9MCQkJMHg1YQogCi0jZGVmaW5lIEFLNDY3MV9DQUNIRVJFR05VTQkJCShBSzQ2NzFfU0FSX0FEQ19DT05UUk9MICsgMSkKLQogLyogQml0ZmllbGQgRGVmaW5pdGlvbnMgKi8KIAogLyogQUs0NjcxX0FEX0RBX1BPV0VSX01BTkFHRU1FTlQgKDB4MDApIEZpZWxkcyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hbGM1NjIzLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MjMuYwppbmRleCBkMzAzNjI4Li4wOWY3ZTc3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MjMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MjMuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpAQCAtMzgsMjYgKzM5LDEzIEBACiAKIC8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLwogc3RydWN0IGFsYzU2MjNfcHJpdiB7Ci0JZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCXU4IGlkOwogCXVuc2lnbmVkIGludCBzeXNjbGs7Ci0JdTE2IHJlZ19jYWNoZVtBTEM1NjIzX1ZFTkRPUl9JRDIrMl07CiAJdW5zaWduZWQgaW50IGFkZF9jdHJsOwogCXVuc2lnbmVkIGludCBqYWNrX2RldF9jdHJsOwogfTsKIAotc3RhdGljIHZvaWQgYWxjNTYyM19maWxsX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlpbnQgaSwgc3RlcCA9IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zdGVwOwotCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOwotCi0JLyogbm90IHJlYWxseSBlZmZpY2llbnQgLi4uICovCi0JY29kZWMtPmNhY2hlX2J5cGFzcyA9IDE7Ci0JZm9yIChpID0gMCA7IGkgPCBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc2l6ZSA7IGkgKz0gc3RlcCkKLQkJY2FjaGVbaV0gPSBzbmRfc29jX3JlYWQoY29kZWMsIGkpOwotCWNvZGVjLT5jYWNoZV9ieXBhc3MgPSAwOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBhbGM1NjIzX3Jlc2V0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlyZXR1cm4gc25kX3NvY193cml0ZShjb2RlYywgQUxDNTYyM19SRVNFVCwgMCk7CkBAIC0yMjgsMzIgKzIxNiwzNyBAQAogCQkiVm1pZCIsICJIUE91dCBNaXgiLCAiU3BlYWtlciBNaXgiLCAiTW9ubyBNaXgifTsKIAogLyogYXV4b3V0IG91dHB1dCBtdXggKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWxjNTYyM19hdXhfb3V0X2lucHV0X2VudW0gPQotU09DX0VOVU1fU0lOR0xFKEFMQzU2MjNfT1VUUFVUX01JWEVSX0NUUkwsIDYsIDQsIGFsYzU2MjNfYXV4X291dF9pbnB1dF9zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsYzU2MjNfYXV4X291dF9pbnB1dF9lbnVtLAorCQkJICAgIEFMQzU2MjNfT1VUUFVUX01JWEVSX0NUUkwsIDYsCisJCQkgICAgYWxjNTYyM19hdXhfb3V0X2lucHV0X3NlbCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNTYyM19hdXhvdXRfbXV4X2NvbnRyb2xzID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgYWxjNTYyM19hdXhfb3V0X2lucHV0X2VudW0pOwogCiAvKiBzcGVha2VyIG91dHB1dCBtdXggKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWxjNTYyM19zcGtvdXRfaW5wdXRfZW51bSA9Ci1TT0NfRU5VTV9TSU5HTEUoQUxDNTYyM19PVVRQVVRfTUlYRVJfQ1RSTCwgMTAsIDQsIGFsYzU2MjNfc3Brb3V0X2lucHV0X3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjNTYyM19zcGtvdXRfaW5wdXRfZW51bSwKKwkJCSAgICBBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCAxMCwKKwkJCSAgICBhbGM1NjIzX3Nwa291dF9pbnB1dF9zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MjNfc3Brb3V0X211eF9jb250cm9scyA9CiBTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIGFsYzU2MjNfc3Brb3V0X2lucHV0X2VudW0pOwogCiAvKiBoZWFkcGhvbmUgbGVmdCBvdXRwdXQgbXV4ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MjNfaHBsX291dF9pbnB1dF9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCA5LCAyLCBhbGM1NjIzX2hwbF9vdXRfaW5wdXRfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhbGM1NjIzX2hwbF9vdXRfaW5wdXRfZW51bSwKKwkJCSAgICBBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCA5LAorCQkJICAgIGFsYzU2MjNfaHBsX291dF9pbnB1dF9zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MjNfaHBsX291dF9tdXhfY29udHJvbHMgPQogU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhbGM1NjIzX2hwbF9vdXRfaW5wdXRfZW51bSk7CiAKIC8qIGhlYWRwaG9uZSByaWdodCBvdXRwdXQgbXV4ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MjNfaHByX291dF9pbnB1dF9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCA4LCAyLCBhbGM1NjIzX2hwcl9vdXRfaW5wdXRfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhbGM1NjIzX2hwcl9vdXRfaW5wdXRfZW51bSwKKwkJCSAgICBBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCA4LAorCQkJICAgIGFsYzU2MjNfaHByX291dF9pbnB1dF9zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MjNfaHByX291dF9tdXhfY29udHJvbHMgPQogU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhbGM1NjIzX2hwcl9vdXRfaW5wdXRfZW51bSk7CiAKIC8qIHNwZWFrZXIgb3V0cHV0IE4gc2VsZWN0ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MjNfc3BrX25fc291cl9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCAxNCwgNCwgYWxjNTYyM19zcGtfbl9zb3VyX3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjNTYyM19zcGtfbl9zb3VyX2VudW0sCisJCQkgICAgQUxDNTYyM19PVVRQVVRfTUlYRVJfQ1RSTCwgMTQsCisJCQkgICAgYWxjNTYyM19zcGtfbl9zb3VyX3NlbCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNTYyM19zcGtvdXRuX211eF9jb250cm9scyA9CiBTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIGFsYzU2MjNfc3BrX25fc291cl9lbnVtKTsKIApAQCAtMzM4LDggKzMzMSw5IEBACiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWxjNTYyM19hbXBfbmFtZXNbXSA9IHsiQUIgQW1wIiwgIkQgQW1wIn07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MjNfYW1wX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCAxMywgMiwgYWxjNTYyM19hbXBfbmFtZXMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsYzU2MjNfYW1wX2VudW0sCisJCQkgICAgQUxDNTYyM19PVVRQVVRfTUlYRVJfQ1RSTCwgMTMsCisJCQkgICAgYWxjNTYyM19hbXBfbmFtZXMpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MjNfYW1wX211eF9jb250cm9scyA9CiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhbGM1NjIzX2FtcF9lbnVtKTsKIApAQCAtODY5LDE4ICs4NjMsMjggQEAKIAogc3RhdGljIGludCBhbGM1NjIzX3N1c3BlbmQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogeworCXN0cnVjdCBhbGM1NjIzX3ByaXYgKmFsYzU2MjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwogCWFsYzU2MjNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCXJlZ2NhY2hlX2NhY2hlX29ubHkoYWxjNTYyMy0+cmVnbWFwLCB0cnVlKTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFsYzU2MjNfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgaSwgc3RlcCA9IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zdGVwOwotCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCXN0cnVjdCBhbGM1NjIzX3ByaXYgKmFsYzU2MjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0OwogCiAJLyogU3luYyByZWdfY2FjaGUgd2l0aCB0aGUgaGFyZHdhcmUgKi8KLQlmb3IgKGkgPSAyIDsgaSA8IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplIDsgaSArPSBzdGVwKQotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBpLCBjYWNoZVtpXSk7CisJcmVnY2FjaGVfY2FjaGVfb25seShhbGM1NjIzLT5yZWdtYXAsIGZhbHNlKTsKKwlyZXQgPSByZWdjYWNoZV9zeW5jKGFsYzU2MjMtPnJlZ21hcCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzeW5jIHJlZ2lzdGVyIGNhY2hlOiAlZFxuIiwKKwkJCXJldCk7CisJCXJlZ2NhY2hlX2NhY2hlX29ubHkoYWxjNTYyMy0+cmVnbWFwLCB0cnVlKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAlhbGM1NjIzX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKQEAgLTkwMCwxNCArOTA0LDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IHJldDsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgYWxjNTYyMy0+Y29udHJvbF90eXBlKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJYWxjNTYyM19yZXNldChjb2RlYyk7Ci0JYWxjNTYyM19maWxsX2NhY2hlKGNvZGVjKTsKIAogCS8qIHBvd2VyIG9uIGRldmljZSAqLwogCWFsYzU2MjNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKQEAgLTk4MCw5ICs5NzcsMTUgQEAKIAkuc3VzcGVuZCA9IGFsYzU2MjNfc3VzcGVuZCwKIAkucmVzdW1lID0gYWxjNTYyM19yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gYWxjNTYyM19zZXRfYmlhc19sZXZlbCwKLQkucmVnX2NhY2hlX3NpemUgPSBBTEM1NjIzX1ZFTkRPUl9JRDIrMiwKLQkucmVnX3dvcmRfc2l6ZSA9IHNpemVvZih1MTYpLAotCS5yZWdfY2FjaGVfc3RlcCA9IDIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWxjNTYyM19yZWdtYXAgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSAxNiwKKwkucmVnX3N0cmlkZSA9IDIsCisKKwkubWF4X3JlZ2lzdGVyID0gQUxDNTYyM19WRU5ET1JfSUQyLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAogfTsKIAogLyoKQEAgLTk5NiwxOSArOTk5LDMyIEBACiB7CiAJc3RydWN0IGFsYzU2MjNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IGFsYzU2MjNfcHJpdiAqYWxjNTYyMzsKLQlpbnQgcmV0LCB2aWQxLCB2aWQyOworCXVuc2lnbmVkIGludCB2aWQxLCB2aWQyOworCWludCByZXQ7CiAKLQl2aWQxID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgQUxDNTYyM19WRU5ET1JfSUQxKTsKLQlpZiAodmlkMSA8IDApIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcmVhZCBJMkNcbiIpOwotCQlyZXR1cm4gLUVJTzsKKwlhbGM1NjIzID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBhbGM1NjIzX3ByaXYpLAorCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmIChhbGM1NjIzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYWxjNTYyMy0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmYWxjNTYyM19yZWdtYXApOworCWlmIChJU19FUlIoYWxjNTYyMy0+cmVnbWFwKSkgeworCQlyZXQgPSBQVFJfRVJSKGFsYzU2MjMtPnJlZ21hcCk7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGluaXRpYWxpc2UgSS9POiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWdtYXBfcmVhZChhbGM1NjIzLT5yZWdtYXAsIEFMQzU2MjNfVkVORE9SX0lEMSwgJnZpZDEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlYWQgdmVuZG9yIElEMTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CiAJfQogCXZpZDEgPSAoKHZpZDEgJiAweGZmKSA8PCA4KSB8ICh2aWQxID4+IDgpOwogCi0JdmlkMiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFMQzU2MjNfVkVORE9SX0lEMik7Ci0JaWYgKHZpZDIgPCAwKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlYWQgSTJDXG4iKTsKLQkJcmV0dXJuIC1FSU87CisJcmV0ID0gcmVnbWFwX3JlYWQoYWxjNTYyMy0+cmVnbWFwLCBBTEM1NjIzX1ZFTkRPUl9JRDIsICZ2aWQyKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byByZWFkIHZlbmRvciBJRDI6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCWlmICgodmlkMSAhPSAweDEwZWMpIHx8ICh2aWQyICE9IGlkLT5kcml2ZXJfZGF0YSkpIHsKQEAgLTEwMjEsMTEgKzEwMzcsNiBAQAogCiAJZGV2X2RiZygmY2xpZW50LT5kZXYsICJGb3VuZCBjb2RlYyBpZCA6IGFsYzU2JTAyeFxuIiwgdmlkMik7CiAKLQlhbGM1NjIzID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBhbGM1NjIzX3ByaXYpLAotCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmIChhbGM1NjIzID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWlmIChwZGF0YSkgewogCQlhbGM1NjIzLT5hZGRfY3RybCA9IHBkYXRhLT5hZGRfY3RybDsKQEAgLTEwNDgsNyArMTA1OSw2IEBACiAJfQogCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgYWxjNTYyMyk7Ci0JYWxjNTYyMy0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CiAKIAlyZXQgPSAgc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYsCiAJCSZzb2NfY29kZWNfZGV2aWNlX2FsYzU2MjMsICZhbGM1NjIzX2RhaSwgMSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MzIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYzMi5jCmluZGV4IGZiMDAxYzUuLmVjMDcxYTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYzMi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYzMi5jCkBAIC0yOTMsNTEgKzI5Myw1OSBAQAogCQkiQURDIExSIiwgIlZvaWNlIFN0ZXJlbyBEaWdpdGFsIn07CiAKIC8qIGF1eG91dCBvdXRwdXQgbXV4ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MzJfYXV4X291dF9pbnB1dF9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShBTEM1NjMyX09VVFBVVF9NSVhFUl9DVFJMLCA2LCA0LCBhbGM1NjMyX2F1eF9vdXRfaW5wdXRfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhbGM1NjMyX2F1eF9vdXRfaW5wdXRfZW51bSwKKwkJCSAgICBBTEM1NjMyX09VVFBVVF9NSVhFUl9DVFJMLCA2LAorCQkJICAgIGFsYzU2MzJfYXV4X291dF9pbnB1dF9zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MzJfYXV4b3V0X211eF9jb250cm9scyA9CiBTT0NfREFQTV9FTlVNKCJBdXhPdXQgTXV4IiwgYWxjNTYzMl9hdXhfb3V0X2lucHV0X2VudW0pOwogCiAvKiBzcGVha2VyIG91dHB1dCBtdXggKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWxjNTYzMl9zcGtvdXRfaW5wdXRfZW51bSA9Ci1TT0NfRU5VTV9TSU5HTEUoQUxDNTYzMl9PVVRQVVRfTUlYRVJfQ1RSTCwgMTAsIDQsIGFsYzU2MzJfc3Brb3V0X2lucHV0X3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjNTYzMl9zcGtvdXRfaW5wdXRfZW51bSwKKwkJCSAgICBBTEM1NjMyX09VVFBVVF9NSVhFUl9DVFJMLCAxMCwKKwkJCSAgICBhbGM1NjMyX3Nwa291dF9pbnB1dF9zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MzJfc3Brb3V0X211eF9jb250cm9scyA9CiBTT0NfREFQTV9FTlVNKCJTcGVha2VyT3V0IE11eCIsIGFsYzU2MzJfc3Brb3V0X2lucHV0X2VudW0pOwogCiAvKiBoZWFkcGhvbmUgbGVmdCBvdXRwdXQgbXV4ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MzJfaHBsX291dF9pbnB1dF9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShBTEM1NjMyX09VVFBVVF9NSVhFUl9DVFJMLCA5LCAyLCBhbGM1NjMyX2hwbF9vdXRfaW5wdXRfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhbGM1NjMyX2hwbF9vdXRfaW5wdXRfZW51bSwKKwkJCSAgICBBTEM1NjMyX09VVFBVVF9NSVhFUl9DVFJMLCA5LAorCQkJICAgIGFsYzU2MzJfaHBsX291dF9pbnB1dF9zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MzJfaHBsX291dF9tdXhfY29udHJvbHMgPQogU09DX0RBUE1fRU5VTSgiTGVmdCBIZWFkcGhvbmUgTXV4IiwgYWxjNTYzMl9ocGxfb3V0X2lucHV0X2VudW0pOwogCiAvKiBoZWFkcGhvbmUgcmlnaHQgb3V0cHV0IG11eCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGM1NjMyX2hwcl9vdXRfaW5wdXRfZW51bSA9Ci1TT0NfRU5VTV9TSU5HTEUoQUxDNTYzMl9PVVRQVVRfTUlYRVJfQ1RSTCwgOCwgMiwgYWxjNTYzMl9ocHJfb3V0X2lucHV0X3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjNTYzMl9ocHJfb3V0X2lucHV0X2VudW0sCisJCQkgICAgQUxDNTYzMl9PVVRQVVRfTUlYRVJfQ1RSTCwgOCwKKwkJCSAgICBhbGM1NjMyX2hwcl9vdXRfaW5wdXRfc2VsKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM1NjMyX2hwcl9vdXRfbXV4X2NvbnRyb2xzID0KIFNPQ19EQVBNX0VOVU0oIlJpZ2h0IEhlYWRwaG9uZSBNdXgiLCBhbGM1NjMyX2hwcl9vdXRfaW5wdXRfZW51bSk7CiAKIC8qIHNwZWFrZXIgb3V0cHV0IE4gc2VsZWN0ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MzJfc3BrX25fc291cl9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShBTEM1NjMyX09VVFBVVF9NSVhFUl9DVFJMLCAxNCwgNCwgYWxjNTYzMl9zcGtfbl9zb3VyX3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjNTYzMl9zcGtfbl9zb3VyX2VudW0sCisJCQkgICAgQUxDNTYzMl9PVVRQVVRfTUlYRVJfQ1RSTCwgMTQsCisJCQkgICAgYWxjNTYzMl9zcGtfbl9zb3VyX3NlbCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNTYzMl9zcGtvdXRuX211eF9jb250cm9scyA9CiBTT0NfREFQTV9FTlVNKCJTcGVha2VyT3V0IE4gTXV4IiwgYWxjNTYzMl9zcGtfbl9zb3VyX2VudW0pOwogCiAvKiBzcGVha2VyIGFtcGxpZmllciAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmFsYzU2MzJfYW1wX25hbWVzW10gPSB7IkFCIEFtcCIsICJEIEFtcCJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGM1NjMyX2FtcF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQUxDNTYzMl9PVVRQVVRfTUlYRVJfQ1RSTCwgMTMsIDIsIGFsYzU2MzJfYW1wX25hbWVzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhbGM1NjMyX2FtcF9lbnVtLAorCQkJICAgIEFMQzU2MzJfT1VUUFVUX01JWEVSX0NUUkwsIDEzLAorCQkJICAgIGFsYzU2MzJfYW1wX25hbWVzKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM1NjMyX2FtcF9tdXhfY29udHJvbHMgPQogCVNPQ19EQVBNX0VOVU0oIkFCLUQgQW1wIE11eCIsIGFsYzU2MzJfYW1wX2VudW0pOwogCiAvKiBBREMgb3V0cHV0IHNlbGVjdCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGM1NjMyX2FkY3JfZnVuY19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQUxDNTYzMl9EQUNfRlVOQ19TRUxFQ1QsIDUsIDIsIGFsYzU2MzJfYWRjcl9mdW5jX3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjNTYzMl9hZGNyX2Z1bmNfZW51bSwKKwkJCSAgICBBTEM1NjMyX0RBQ19GVU5DX1NFTEVDVCwgNSwKKwkJCSAgICBhbGM1NjMyX2FkY3JfZnVuY19zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MzJfYWRjcl9mdW5jX2NvbnRyb2xzID0KIAlTT0NfREFQTV9FTlVNKCJBRENSIE11eCIsIGFsYzU2MzJfYWRjcl9mdW5jX2VudW0pOwogCiAvKiBJMlMgb3V0IHNlbGVjdCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGM1NjMyX2kyc19vdXRfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFMQzU2MzJfSTJTX09VVF9DVEwsIDUsIDIsIGFsYzU2MzJfaTJzX291dF9zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsYzU2MzJfaTJzX291dF9lbnVtLAorCQkJICAgIEFMQzU2MzJfSTJTX09VVF9DVEwsIDUsCisJCQkgICAgYWxjNTYzMl9pMnNfb3V0X3NlbCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNTYzMl9pMnNfb3V0X2NvbnRyb2xzID0KIAlTT0NfREFQTV9FTlVNKCJJMlNPdXQgTXV4IiwgYWxjNTYzMl9pMnNfb3V0X2VudW0pOwogCkBAIC0xMDU1LDE0ICsxMDYzLDYgQEAKIAlzdHJ1Y3QgYWxjNTYzMl9wcml2ICphbGM1NjMyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBhbGM1NjMyLT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIHBvd2VyIG9uIGRldmljZSAgKi8KIAlhbGM1NjMyX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYXJpem9uYS5jIGIvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmMKaW5kZXggZTQyOTVmZS4uMjllMTk4ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmMKQEAgLTUzLDYgKzUzLDE0IEBACiAjZGVmaW5lIEFSSVpPTkFfQUlGX1JYX0VOQUJMRVMgICAgICAgICAgICAgICAgICAweDFBCiAjZGVmaW5lIEFSSVpPTkFfQUlGX0ZPUkNFX1dSSVRFICAgICAgICAgICAgICAgICAweDFCCiAKKyNkZWZpbmUgQVJJWk9OQV9GTExfVkNPX0NPUk5FUiAxNDE5MDAwMDAKKyNkZWZpbmUgQVJJWk9OQV9GTExfTUFYX0ZSRUYgICAxMzUwMDAwMAorI2RlZmluZSBBUklaT05BX0ZMTF9NSU5fRlZDTyAgIDkwMDAwMDAwCisjZGVmaW5lIEFSSVpPTkFfRkxMX01BWF9GUkFUSU8gMTYKKyNkZWZpbmUgQVJJWk9OQV9GTExfTUFYX1JFRkRJViA4CisjZGVmaW5lIEFSSVpPTkFfRkxMX01JTl9PVVRESVYgMgorI2RlZmluZSBBUklaT05BX0ZMTF9NQVhfT1VURElWIDcKKwogI2RlZmluZSBhcml6b25hX2ZsbF9lcnIoX2ZsbCwgZm10LCAuLi4pIFwKIAlkZXZfZXJyKF9mbGwtPmFyaXpvbmEtPmRldiwgIkZMTCVkOiAiIGZtdCwgX2ZsbC0+aWQsICMjX19WQV9BUkdTX18pCiAjZGVmaW5lIGFyaXpvbmFfZmxsX3dhcm4oX2ZsbCwgZm10LCAuLi4pIFwKQEAgLTU0Miw2NyArNTUwLDc2IEBACiAJIjE1bXMvNmRCIiwgIjMwbXMvNmRCIiwKIH07CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX2luX3ZkX3JhbXAgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX0lOUFVUX1ZPTFVNRV9SQU1QLAotCQkJQVJJWk9OQV9JTl9WRF9SQU1QX1NISUZULCA3LCBhcml6b25hX3ZvbF9yYW1wX3RleHQpOworU09DX0VOVU1fU0lOR0xFX0RFQ0woYXJpem9uYV9pbl92ZF9yYW1wLAorCQkgICAgIEFSSVpPTkFfSU5QVVRfVk9MVU1FX1JBTVAsCisJCSAgICAgQVJJWk9OQV9JTl9WRF9SQU1QX1NISUZULAorCQkgICAgIGFyaXpvbmFfdm9sX3JhbXBfdGV4dCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhcml6b25hX2luX3ZkX3JhbXApOwogCi1jb25zdCBzdHJ1Y3Qgc29jX2VudW0gYXJpem9uYV9pbl92aV9yYW1wID0KLQlTT0NfRU5VTV9TSU5HTEUoQVJJWk9OQV9JTlBVVF9WT0xVTUVfUkFNUCwKLQkJCUFSSVpPTkFfSU5fVklfUkFNUF9TSElGVCwgNywgYXJpem9uYV92b2xfcmFtcF90ZXh0KTsKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKGFyaXpvbmFfaW5fdmlfcmFtcCwKKwkJICAgICBBUklaT05BX0lOUFVUX1ZPTFVNRV9SQU1QLAorCQkgICAgIEFSSVpPTkFfSU5fVklfUkFNUF9TSElGVCwKKwkJICAgICBhcml6b25hX3ZvbF9yYW1wX3RleHQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXJpem9uYV9pbl92aV9yYW1wKTsKIAotY29uc3Qgc3RydWN0IHNvY19lbnVtIGFyaXpvbmFfb3V0X3ZkX3JhbXAgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX09VVFBVVF9WT0xVTUVfUkFNUCwKLQkJCUFSSVpPTkFfT1VUX1ZEX1JBTVBfU0hJRlQsIDcsIGFyaXpvbmFfdm9sX3JhbXBfdGV4dCk7CitTT0NfRU5VTV9TSU5HTEVfREVDTChhcml6b25hX291dF92ZF9yYW1wLAorCQkgICAgIEFSSVpPTkFfT1VUUFVUX1ZPTFVNRV9SQU1QLAorCQkgICAgIEFSSVpPTkFfT1VUX1ZEX1JBTVBfU0hJRlQsCisJCSAgICAgYXJpem9uYV92b2xfcmFtcF90ZXh0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGFyaXpvbmFfb3V0X3ZkX3JhbXApOwogCi1jb25zdCBzdHJ1Y3Qgc29jX2VudW0gYXJpem9uYV9vdXRfdmlfcmFtcCA9Ci0JU09DX0VOVU1fU0lOR0xFKEFSSVpPTkFfT1VUUFVUX1ZPTFVNRV9SQU1QLAotCQkJQVJJWk9OQV9PVVRfVklfUkFNUF9TSElGVCwgNywgYXJpem9uYV92b2xfcmFtcF90ZXh0KTsKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKGFyaXpvbmFfb3V0X3ZpX3JhbXAsCisJCSAgICAgQVJJWk9OQV9PVVRQVVRfVk9MVU1FX1JBTVAsCisJCSAgICAgQVJJWk9OQV9PVVRfVklfUkFNUF9TSElGVCwKKwkJICAgICBhcml6b25hX3ZvbF9yYW1wX3RleHQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXJpem9uYV9vdXRfdmlfcmFtcCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphcml6b25hX2xocGZfbW9kZV90ZXh0W10gPSB7CiAJIkxvdy1wYXNzIiwgIkhpZ2gtcGFzcyIKIH07CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX2xocGYxX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX0hQTFBGMV8xLCBBUklaT05BX0xIUEYxX01PREVfU0hJRlQsIDIsCi0JCQlhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKGFyaXpvbmFfbGhwZjFfbW9kZSwKKwkJICAgICBBUklaT05BX0hQTFBGMV8xLAorCQkgICAgIEFSSVpPTkFfTEhQRjFfTU9ERV9TSElGVCwKKwkJICAgICBhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGFyaXpvbmFfbGhwZjFfbW9kZSk7CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX2xocGYyX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX0hQTFBGMl8xLCBBUklaT05BX0xIUEYyX01PREVfU0hJRlQsIDIsCi0JCQlhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKGFyaXpvbmFfbGhwZjJfbW9kZSwKKwkJICAgICBBUklaT05BX0hQTFBGMl8xLAorCQkgICAgIEFSSVpPTkFfTEhQRjJfTU9ERV9TSElGVCwKKwkJICAgICBhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGFyaXpvbmFfbGhwZjJfbW9kZSk7CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX2xocGYzX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX0hQTFBGM18xLCBBUklaT05BX0xIUEYzX01PREVfU0hJRlQsIDIsCi0JCQlhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKGFyaXpvbmFfbGhwZjNfbW9kZSwKKwkJICAgICBBUklaT05BX0hQTFBGM18xLAorCQkgICAgIEFSSVpPTkFfTEhQRjNfTU9ERV9TSElGVCwKKwkJICAgICBhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGFyaXpvbmFfbGhwZjNfbW9kZSk7CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX2xocGY0X21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX0hQTFBGNF8xLCBBUklaT05BX0xIUEY0X01PREVfU0hJRlQsIDIsCi0JCQlhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKGFyaXpvbmFfbGhwZjRfbW9kZSwKKwkJICAgICBBUklaT05BX0hQTFBGNF8xLAorCQkgICAgIEFSSVpPTkFfTEhQRjRfTU9ERV9TSElGVCwKKwkJICAgICBhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGFyaXpvbmFfbGhwZjRfbW9kZSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphcml6b25hX25nX2hvbGRfdGV4dFtdID0gewogCSIzMG1zIiwgIjEyMG1zIiwgIjI1MG1zIiwgIjUwMG1zIiwKIH07CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX25nX2hvbGQgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX05PSVNFX0dBVEVfQ09OVFJPTCwgQVJJWk9OQV9OR0FURV9IT0xEX1NISUZULAotCQkJNCwgYXJpem9uYV9uZ19ob2xkX3RleHQpOworU09DX0VOVU1fU0lOR0xFX0RFQ0woYXJpem9uYV9uZ19ob2xkLAorCQkgICAgIEFSSVpPTkFfTk9JU0VfR0FURV9DT05UUk9MLAorCQkgICAgIEFSSVpPTkFfTkdBVEVfSE9MRF9TSElGVCwKKwkJICAgICBhcml6b25hX25nX2hvbGRfdGV4dCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhcml6b25hX25nX2hvbGQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFyaXpvbmFfaW5faHBmX2N1dF90ZXh0W10gPSB7CiAJIjIuNUh6IiwgIjVIeiIsICIxMEh6IiwgIjIwSHoiLCAiNDBIeiIKIH07CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX2luX2hwZl9jdXRfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFSSVpPTkFfSFBGX0NPTlRST0wsIEFSSVpPTkFfSU5fSFBGX0NVVF9TSElGVCwKLQkJCUFSUkFZX1NJWkUoYXJpem9uYV9pbl9ocGZfY3V0X3RleHQpLAotCQkJYXJpem9uYV9pbl9ocGZfY3V0X3RleHQpOworU09DX0VOVU1fU0lOR0xFX0RFQ0woYXJpem9uYV9pbl9ocGZfY3V0X2VudW0sCisJCSAgICAgQVJJWk9OQV9IUEZfQ09OVFJPTCwKKwkJICAgICBBUklaT05BX0lOX0hQRl9DVVRfU0hJRlQsCisJCSAgICAgYXJpem9uYV9pbl9ocGZfY3V0X3RleHQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXJpem9uYV9pbl9ocGZfY3V0X2VudW0pOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFyaXpvbmFfaW5fZG1pY19vc3JfdGV4dFtdID0gewpAQCAtMTM3Nyw3NCArMTM5NCwxNDcgQEAKIAlpbnQgZ2FpbjsKIH07CiAKK3N0YXRpYyBpbnQgYXJpem9uYV92YWxpZGF0ZV9mbGwoc3RydWN0IGFyaXpvbmFfZmxsICpmbGwsCisJCQkJdW5zaWduZWQgaW50IEZyZWYsCisJCQkJdW5zaWduZWQgaW50IEZvdXQpCit7CisJdW5zaWduZWQgaW50IEZ2Y29fbWluOworCisJaWYgKEZyZWYgLyBBUklaT05BX0ZMTF9NQVhfUkVGRElWID4gQVJJWk9OQV9GTExfTUFYX0ZSRUYpIHsKKwkJYXJpem9uYV9mbGxfZXJyKGZsbCwKKwkJCQkiQ2FuJ3Qgc2NhbGUgJWRNSHogaW4gdG8gPD0xMy41TUh6XG4iLAorCQkJCUZyZWYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlGdmNvX21pbiA9IEFSSVpPTkFfRkxMX01JTl9GVkNPICogZmxsLT52Y29fbXVsdDsKKwlpZiAoRm91dCAqIEFSSVpPTkFfRkxMX01BWF9PVVRESVYgPCBGdmNvX21pbikgeworCQlhcml6b25hX2ZsbF9lcnIoZmxsLCAiTm8gRkxMX09VVERJViBmb3IgRm91dD0ldUh6XG4iLAorCQkJCUZvdXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcml6b25hX2ZpbmRfZnJhdGlvKHVuc2lnbmVkIGludCBGcmVmLCBpbnQgKmZyYXRpbykKK3sKKwlpbnQgaTsKKworCS8qIEZpbmQgYW4gYXBwcm9wcmlhdGUgRkxMX0ZSQVRJTyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZsbF9mcmF0aW9zKTsgaSsrKSB7CisJCWlmIChmbGxfZnJhdGlvc1tpXS5taW4gPD0gRnJlZiAmJiBGcmVmIDw9IGZsbF9mcmF0aW9zW2ldLm1heCkgeworCQkJaWYgKGZyYXRpbykKKwkJCQkqZnJhdGlvID0gZmxsX2ZyYXRpb3NbaV0uZnJhdGlvOworCQkJcmV0dXJuIGZsbF9mcmF0aW9zW2ldLnJhdGlvOworCQl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYXJpem9uYV9jYWxjX2ZyYXRpbyhzdHJ1Y3QgYXJpem9uYV9mbGwgKmZsbCwKKwkJCSAgICAgICBzdHJ1Y3QgYXJpem9uYV9mbGxfY2ZnICpjZmcsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHRhcmdldCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgRnJlZiwgYm9vbCBzeW5jKQoreworCWludCBpbml0X3JhdGlvLCByYXRpbzsKKwlpbnQgcmVmZGl2LCBkaXY7CisKKwkvKiBGcmVmIG11c3QgYmUgPD0xMy41TUh6LCBmaW5kIGluaXRpYWwgcmVmZGl2ICovCisJZGl2ID0gMTsKKwljZmctPnJlZmRpdiA9IDA7CisJd2hpbGUgKEZyZWYgPiBBUklaT05BX0ZMTF9NQVhfRlJFRikgeworCQlkaXYgKj0gMjsKKwkJRnJlZiAvPSAyOworCQljZmctPnJlZmRpdisrOworCisJCWlmIChkaXYgPiBBUklaT05BX0ZMTF9NQVhfUkVGRElWKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRmluZCBhbiBhcHByb3ByaWF0ZSBGTExfRlJBVElPICovCisJaW5pdF9yYXRpbyA9IGFyaXpvbmFfZmluZF9mcmF0aW8oRnJlZiwgJmNmZy0+ZnJhdGlvKTsKKwlpZiAoaW5pdF9yYXRpbyA8IDApIHsKKwkJYXJpem9uYV9mbGxfZXJyKGZsbCwgIlVuYWJsZSB0byBmaW5kIEZSQVRJTyBmb3IgRnJlZj0ldUh6XG4iLAorCQkJCUZyZWYpOworCQlyZXR1cm4gaW5pdF9yYXRpbzsKKwl9CisKKwlzd2l0Y2ggKGZsbC0+YXJpem9uYS0+dHlwZSkgeworCWNhc2UgV001MTEwOgorCQlpZiAoZmxsLT5hcml6b25hLT5yZXYgPCAzIHx8IHN5bmMpCisJCQlyZXR1cm4gaW5pdF9yYXRpbzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGluaXRfcmF0aW87CisJfQorCisJY2ZnLT5mcmF0aW8gPSBpbml0X3JhdGlvIC0gMTsKKworCS8qIEFkanVzdCBGUkFUSU8vcmVmZGl2IHRvIGF2b2lkIGludGVnZXIgbW9kZSBpZiBwb3NzaWJsZSAqLworCXJlZmRpdiA9IGNmZy0+cmVmZGl2OworCisJd2hpbGUgKGRpdiA8PSBBUklaT05BX0ZMTF9NQVhfUkVGRElWKSB7CisJCWZvciAocmF0aW8gPSBpbml0X3JhdGlvOyByYXRpbyA8PSBBUklaT05BX0ZMTF9NQVhfRlJBVElPOworCQkgICAgIHJhdGlvKyspIHsKKwkJCWlmICh0YXJnZXQgJSAocmF0aW8gKiBGcmVmKSkgeworCQkJCWNmZy0+cmVmZGl2ID0gcmVmZGl2OworCQkJCWNmZy0+ZnJhdGlvID0gcmF0aW8gLSAxOworCQkJCXJldHVybiByYXRpbzsKKwkJCX0KKwkJfQorCisJCWZvciAocmF0aW8gPSBpbml0X3JhdGlvIC0gMTsgcmF0aW8gPj0gMDsgcmF0aW8tLSkgeworCQkJaWYgKEFSSVpPTkFfRkxMX1ZDT19DT1JORVIgLyAoZmxsLT52Y29fbXVsdCAqIHJhdGlvKSA8CisJCQkgICAgRnJlZikKKwkJCQlicmVhazsKKworCQkJaWYgKHRhcmdldCAlIChyYXRpbyAqIEZyZWYpKSB7CisJCQkJY2ZnLT5yZWZkaXYgPSByZWZkaXY7CisJCQkJY2ZnLT5mcmF0aW8gPSByYXRpbyAtIDE7CisJCQkJcmV0dXJuIHJhdGlvOworCQkJfQorCQl9CisKKwkJZGl2ICo9IDI7CisJCUZyZWYgLz0gMjsKKwkJcmVmZGl2Kys7CisJCWluaXRfcmF0aW8gPSBhcml6b25hX2ZpbmRfZnJhdGlvKEZyZWYsIE5VTEwpOworCX0KKworCWFyaXpvbmFfZmxsX3dhcm4oZmxsLCAiRmFsbGluZyBiYWNrIHRvIGludGVnZXIgbW9kZSBvcGVyYXRpb25cbiIpOworCXJldHVybiBjZmctPmZyYXRpbyArIDE7Cit9CisKIHN0YXRpYyBpbnQgYXJpem9uYV9jYWxjX2ZsbChzdHJ1Y3QgYXJpem9uYV9mbGwgKmZsbCwKIAkJCSAgICBzdHJ1Y3QgYXJpem9uYV9mbGxfY2ZnICpjZmcsCi0JCQkgICAgdW5zaWduZWQgaW50IEZyZWYsCi0JCQkgICAgdW5zaWduZWQgaW50IEZvdXQpCisJCQkgICAgdW5zaWduZWQgaW50IEZyZWYsIGJvb2wgc3luYykKIHsKIAl1bnNpZ25lZCBpbnQgdGFyZ2V0LCBkaXYsIGdjZF9mbGw7CiAJaW50IGksIHJhdGlvOwogCi0JYXJpem9uYV9mbGxfZGJnKGZsbCwgIkZyZWY9JXUgRm91dD0ldVxuIiwgRnJlZiwgRm91dCk7Ci0KLQkvKiBGcmVmIG11c3QgYmUgPD0xMy41TUh6ICovCi0JZGl2ID0gMTsKLQljZmctPnJlZmRpdiA9IDA7Ci0Jd2hpbGUgKChGcmVmIC8gZGl2KSA+IDEzNTAwMDAwKSB7Ci0JCWRpdiAqPSAyOwotCQljZmctPnJlZmRpdisrOwotCi0JCWlmIChkaXYgPiA4KSB7Ci0JCQlhcml6b25hX2ZsbF9lcnIoZmxsLAotCQkJCQkiQ2FuJ3Qgc2NhbGUgJWRNSHogaW4gdG8gPD0xMy41TUh6XG4iLAotCQkJCQlGcmVmKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JLyogQXBwbHkgdGhlIGRpdmlzaW9uIGZvciBvdXIgcmVtYWluaW5nIGNhbGN1bGF0aW9ucyAqLwotCUZyZWYgLz0gZGl2OworCWFyaXpvbmFfZmxsX2RiZyhmbGwsICJGcmVmPSV1IEZvdXQ9JXVcbiIsIEZyZWYsIGZsbC0+Zm91dCk7CiAKIAkvKiBGdmNvIHNob3VsZCBiZSBvdmVyIHRoZSB0YXJndDsgZG9uJ3QgY2hlY2sgdGhlIHVwcGVyIGJvdW5kICovCi0JZGl2ID0gMTsKLQl3aGlsZSAoRm91dCAqIGRpdiA8IDkwMDAwMDAwICogZmxsLT52Y29fbXVsdCkgeworCWRpdiA9IEFSSVpPTkFfRkxMX01JTl9PVVRESVY7CisJd2hpbGUgKGZsbC0+Zm91dCAqIGRpdiA8IEFSSVpPTkFfRkxMX01JTl9GVkNPICogZmxsLT52Y29fbXVsdCkgewogCQlkaXYrKzsKLQkJaWYgKGRpdiA+IDcpIHsKLQkJCWFyaXpvbmFfZmxsX2VycihmbGwsICJObyBGTExfT1VURElWIGZvciBGb3V0PSV1SHpcbiIsCi0JCQkJCUZvdXQpOworCQlpZiAoZGl2ID4gQVJJWk9OQV9GTExfTUFYX09VVERJVikKIAkJCXJldHVybiAtRUlOVkFMOwotCQl9CiAJfQotCXRhcmdldCA9IEZvdXQgKiBkaXYgLyBmbGwtPnZjb19tdWx0OworCXRhcmdldCA9IGZsbC0+Zm91dCAqIGRpdiAvIGZsbC0+dmNvX211bHQ7CiAJY2ZnLT5vdXRkaXYgPSBkaXY7CiAKIAlhcml6b25hX2ZsbF9kYmcoZmxsLCAiRnZjbz0lZEh6XG4iLCB0YXJnZXQpOwogCi0JLyogRmluZCBhbiBhcHByb3ByYWl0ZSBGTExfRlJBVElPIGFuZCBmYWN0b3IgaXQgb3V0IG9mIHRoZSB0YXJnZXQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmbGxfZnJhdGlvcyk7IGkrKykgewotCQlpZiAoZmxsX2ZyYXRpb3NbaV0ubWluIDw9IEZyZWYgJiYgRnJlZiA8PSBmbGxfZnJhdGlvc1tpXS5tYXgpIHsKLQkJCWNmZy0+ZnJhdGlvID0gZmxsX2ZyYXRpb3NbaV0uZnJhdGlvOwotCQkJcmF0aW8gPSBmbGxfZnJhdGlvc1tpXS5yYXRpbzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChpID09IEFSUkFZX1NJWkUoZmxsX2ZyYXRpb3MpKSB7Ci0JCWFyaXpvbmFfZmxsX2VycihmbGwsICJVbmFibGUgdG8gZmluZCBGUkFUSU8gZm9yIEZyZWY9JXVIelxuIiwKLQkJCQlGcmVmKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCS8qIEZpbmQgYW4gYXBwcm9wcmlhdGUgRkxMX0ZSQVRJTyBhbmQgcmVmZGl2ICovCisJcmF0aW8gPSBhcml6b25hX2NhbGNfZnJhdGlvKGZsbCwgY2ZnLCB0YXJnZXQsIEZyZWYsIHN5bmMpOworCWlmIChyYXRpbyA8IDApCisJCXJldHVybiByYXRpbzsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZsbF9nYWlucyk7IGkrKykgewotCQlpZiAoZmxsX2dhaW5zW2ldLm1pbiA8PSBGcmVmICYmIEZyZWYgPD0gZmxsX2dhaW5zW2ldLm1heCkgewotCQkJY2ZnLT5nYWluID0gZmxsX2dhaW5zW2ldLmdhaW47Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoaSA9PSBBUlJBWV9TSVpFKGZsbF9nYWlucykpIHsKLQkJYXJpem9uYV9mbGxfZXJyKGZsbCwgIlVuYWJsZSB0byBmaW5kIGdhaW4gZm9yIEZyZWY9JXVIelxuIiwKLQkJCQlGcmVmKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCS8qIEFwcGx5IHRoZSBkaXZpc2lvbiBmb3Igb3VyIHJlbWFpbmluZyBjYWxjdWxhdGlvbnMgKi8KKwlGcmVmID0gRnJlZiAvICgxIDw8IGNmZy0+cmVmZGl2KTsKIAogCWNmZy0+biA9IHRhcmdldCAvIChyYXRpbyAqIEZyZWYpOwogCkBAIC0xNDY5LDYgKzE1NTksMTggQEAKIAkJY2ZnLT5sYW1iZGEgPj49IDE7CiAJfQogCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZmxsX2dhaW5zKTsgaSsrKSB7CisJCWlmIChmbGxfZ2FpbnNbaV0ubWluIDw9IEZyZWYgJiYgRnJlZiA8PSBmbGxfZ2FpbnNbaV0ubWF4KSB7CisJCQljZmctPmdhaW4gPSBmbGxfZ2FpbnNbaV0uZ2FpbjsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpID09IEFSUkFZX1NJWkUoZmxsX2dhaW5zKSkgeworCQlhcml6b25hX2ZsbF9lcnIoZmxsLCAiVW5hYmxlIHRvIGZpbmQgZ2FpbiBmb3IgRnJlZj0ldUh6XG4iLAorCQkJCUZyZWYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlhcml6b25hX2ZsbF9kYmcoZmxsLCAiTj0leCBUSEVUQT0leCBMQU1CREE9JXhcbiIsCiAJCQljZmctPm4sIGNmZy0+dGhldGEsIGNmZy0+bGFtYmRhKTsKIAlhcml6b25hX2ZsbF9kYmcoZmxsLCAiRlJBVElPPSV4KCVkKSBPVVRESVY9JXggUkVGQ0xLX0RJVj0leFxuIiwKQEAgLTE0OTYsMTQgKzE1OTgsMTggQEAKIAkJCQkgY2ZnLT5yZWZkaXYgPDwgQVJJWk9OQV9GTEwxX0NMS19SRUZfRElWX1NISUZUIHwKIAkJCQkgc291cmNlIDw8IEFSSVpPTkFfRkxMMV9DTEtfUkVGX1NSQ19TSElGVCk7CiAKLQlpZiAoc3luYykKLQkJcmVnbWFwX3VwZGF0ZV9iaXRzX2FzeW5jKGFyaXpvbmEtPnJlZ21hcCwgYmFzZSArIDB4NywKLQkJCQkJIEFSSVpPTkFfRkxMMV9HQUlOX01BU0ssCi0JCQkJCSBjZmctPmdhaW4gPDwgQVJJWk9OQV9GTEwxX0dBSU5fU0hJRlQpOwotCWVsc2UKLQkJcmVnbWFwX3VwZGF0ZV9iaXRzX2FzeW5jKGFyaXpvbmEtPnJlZ21hcCwgYmFzZSArIDB4OSwKLQkJCQkJIEFSSVpPTkFfRkxMMV9HQUlOX01BU0ssCi0JCQkJCSBjZmctPmdhaW4gPDwgQVJJWk9OQV9GTEwxX0dBSU5fU0hJRlQpOworCWlmIChzeW5jKSB7CisJCXJlZ21hcF91cGRhdGVfYml0cyhhcml6b25hLT5yZWdtYXAsIGJhc2UgKyAweDcsCisJCQkJICAgQVJJWk9OQV9GTEwxX0dBSU5fTUFTSywKKwkJCQkgICBjZmctPmdhaW4gPDwgQVJJWk9OQV9GTEwxX0dBSU5fU0hJRlQpOworCX0gZWxzZSB7CisJCXJlZ21hcF91cGRhdGVfYml0cyhhcml6b25hLT5yZWdtYXAsIGJhc2UgKyAweDUsCisJCQkJICAgQVJJWk9OQV9GTEwxX09VVERJVl9NQVNLLAorCQkJCSAgIGNmZy0+b3V0ZGl2IDw8IEFSSVpPTkFfRkxMMV9PVVRESVZfU0hJRlQpOworCQlyZWdtYXBfdXBkYXRlX2JpdHMoYXJpem9uYS0+cmVnbWFwLCBiYXNlICsgMHg5LAorCQkJCSAgIEFSSVpPTkFfRkxMMV9HQUlOX01BU0ssCisJCQkJICAgY2ZnLT5nYWluIDw8IEFSSVpPTkFfRkxMMV9HQUlOX1NISUZUKTsKKwl9CiAKIAlyZWdtYXBfdXBkYXRlX2JpdHNfYXN5bmMoYXJpem9uYS0+cmVnbWFwLCBiYXNlICsgMiwKIAkJCQkgQVJJWk9OQV9GTEwxX0NUUkxfVVBEIHwgQVJJWk9OQV9GTEwxX05fTUFTSywKQEAgLTE1MjYsMTMgKzE2MzIsMTIgQEAKIAlyZXR1cm4gcmVnICYgQVJJWk9OQV9GTEwxX0VOQTsKIH0KIAotc3RhdGljIHZvaWQgYXJpem9uYV9lbmFibGVfZmxsKHN0cnVjdCBhcml6b25hX2ZsbCAqZmxsLAotCQkJICAgICAgc3RydWN0IGFyaXpvbmFfZmxsX2NmZyAqcmVmLAotCQkJICAgICAgc3RydWN0IGFyaXpvbmFfZmxsX2NmZyAqc3luYykKK3N0YXRpYyB2b2lkIGFyaXpvbmFfZW5hYmxlX2ZsbChzdHJ1Y3QgYXJpem9uYV9mbGwgKmZsbCkKIHsKIAlzdHJ1Y3QgYXJpem9uYSAqYXJpem9uYSA9IGZsbC0+YXJpem9uYTsKIAlpbnQgcmV0OwogCWJvb2wgdXNlX3N5bmMgPSBmYWxzZTsKKwlzdHJ1Y3QgYXJpem9uYV9mbGxfY2ZnIGNmZzsKIAogCS8qCiAJICogSWYgd2UgaGF2ZSBib3RoIFJFRkNMSyBhbmQgU1lOQ0NMSyB0aGVuIGVuYWJsZSBib3RoLApAQCAtMTU0MCwyMyArMTY0NSwyMSBAQAogCSAqLwogCWlmIChmbGwtPnJlZl9zcmMgPj0gMCAmJiBmbGwtPnJlZl9mcmVxICYmCiAJICAgIGZsbC0+cmVmX3NyYyAhPSBmbGwtPnN5bmNfc3JjKSB7Ci0JCXJlZ21hcF91cGRhdGVfYml0c19hc3luYyhhcml6b25hLT5yZWdtYXAsIGZsbC0+YmFzZSArIDUsCi0JCQkJCSBBUklaT05BX0ZMTDFfT1VURElWX01BU0ssCi0JCQkJCSByZWYtPm91dGRpdiA8PCBBUklaT05BX0ZMTDFfT1VURElWX1NISUZUKTsKKwkJYXJpem9uYV9jYWxjX2ZsbChmbGwsICZjZmcsIGZsbC0+cmVmX2ZyZXEsIGZhbHNlKTsKIAotCQlhcml6b25hX2FwcGx5X2ZsbChhcml6b25hLCBmbGwtPmJhc2UsIHJlZiwgZmxsLT5yZWZfc3JjLAorCQlhcml6b25hX2FwcGx5X2ZsbChhcml6b25hLCBmbGwtPmJhc2UsICZjZmcsIGZsbC0+cmVmX3NyYywKIAkJCQkgIGZhbHNlKTsKIAkJaWYgKGZsbC0+c3luY19zcmMgPj0gMCkgewotCQkJYXJpem9uYV9hcHBseV9mbGwoYXJpem9uYSwgZmxsLT5iYXNlICsgMHgxMCwgc3luYywKKwkJCWFyaXpvbmFfY2FsY19mbGwoZmxsLCAmY2ZnLCBmbGwtPnN5bmNfZnJlcSwgdHJ1ZSk7CisKKwkJCWFyaXpvbmFfYXBwbHlfZmxsKGFyaXpvbmEsIGZsbC0+YmFzZSArIDB4MTAsICZjZmcsCiAJCQkJCSAgZmxsLT5zeW5jX3NyYywgdHJ1ZSk7CiAJCQl1c2Vfc3luYyA9IHRydWU7CiAJCX0KIAl9IGVsc2UgaWYgKGZsbC0+c3luY19zcmMgPj0gMCkgewotCQlyZWdtYXBfdXBkYXRlX2JpdHNfYXN5bmMoYXJpem9uYS0+cmVnbWFwLCBmbGwtPmJhc2UgKyA1LAotCQkJCQkgQVJJWk9OQV9GTEwxX09VVERJVl9NQVNLLAotCQkJCQkgc3luYy0+b3V0ZGl2IDw8IEFSSVpPTkFfRkxMMV9PVVRESVZfU0hJRlQpOworCQlhcml6b25hX2NhbGNfZmxsKGZsbCwgJmNmZywgZmxsLT5zeW5jX2ZyZXEsIGZhbHNlKTsKIAotCQlhcml6b25hX2FwcGx5X2ZsbChhcml6b25hLCBmbGwtPmJhc2UsIHN5bmMsCisJCWFyaXpvbmFfYXBwbHlfZmxsKGFyaXpvbmEsIGZsbC0+YmFzZSwgJmNmZywKIAkJCQkgIGZsbC0+c3luY19zcmMsIGZhbHNlKTsKIAogCQlyZWdtYXBfdXBkYXRlX2JpdHNfYXN5bmMoYXJpem9uYS0+cmVnbWFwLCBmbGwtPmJhc2UgKyAweDExLApAQCAtMTYxOCwzMiArMTcyMSwyMiBAQAogaW50IGFyaXpvbmFfc2V0X2ZsbF9yZWZjbGsoc3RydWN0IGFyaXpvbmFfZmxsICpmbGwsIGludCBzb3VyY2UsCiAJCQkgICB1bnNpZ25lZCBpbnQgRnJlZiwgdW5zaWduZWQgaW50IEZvdXQpCiB7Ci0Jc3RydWN0IGFyaXpvbmFfZmxsX2NmZyByZWYsIHN5bmM7CiAJaW50IHJldDsKIAogCWlmIChmbGwtPnJlZl9zcmMgPT0gc291cmNlICYmIGZsbC0+cmVmX2ZyZXEgPT0gRnJlZikKIAkJcmV0dXJuIDA7CiAKLQlpZiAoZmxsLT5mb3V0KSB7Ci0JCWlmIChGcmVmID4gMCkgewotCQkJcmV0ID0gYXJpem9uYV9jYWxjX2ZsbChmbGwsICZyZWYsIEZyZWYsIGZsbC0+Zm91dCk7Ci0JCQlpZiAocmV0ICE9IDApCi0JCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCWlmIChmbGwtPnN5bmNfc3JjID49IDApIHsKLQkJCXJldCA9IGFyaXpvbmFfY2FsY19mbGwoZmxsLCAmc3luYywgZmxsLT5zeW5jX2ZyZXEsCi0JCQkJCSAgICAgICBmbGwtPmZvdXQpOwotCQkJaWYgKHJldCAhPSAwKQotCQkJCXJldHVybiByZXQ7Ci0JCX0KKwlpZiAoZmxsLT5mb3V0ICYmIEZyZWYgPiAwKSB7CisJCXJldCA9IGFyaXpvbmFfdmFsaWRhdGVfZmxsKGZsbCwgRnJlZiwgZmxsLT5mb3V0KTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcmV0dXJuIHJldDsKIAl9CiAKIAlmbGwtPnJlZl9zcmMgPSBzb3VyY2U7CiAJZmxsLT5yZWZfZnJlcSA9IEZyZWY7CiAKIAlpZiAoZmxsLT5mb3V0ICYmIEZyZWYgPiAwKSB7Ci0JCWFyaXpvbmFfZW5hYmxlX2ZsbChmbGwsICZyZWYsICZzeW5jKTsKKwkJYXJpem9uYV9lbmFibGVfZmxsKGZsbCk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNjUzLDcgKzE3NDYsNiBAQAogaW50IGFyaXpvbmFfc2V0X2ZsbChzdHJ1Y3QgYXJpem9uYV9mbGwgKmZsbCwgaW50IHNvdXJjZSwKIAkJICAgIHVuc2lnbmVkIGludCBGcmVmLCB1bnNpZ25lZCBpbnQgRm91dCkKIHsKLQlzdHJ1Y3QgYXJpem9uYV9mbGxfY2ZnIHJlZiwgc3luYzsKIAlpbnQgcmV0OwogCiAJaWYgKGZsbC0+c3luY19zcmMgPT0gc291cmNlICYmCkBAIC0xNjYyLDEzICsxNzU0LDEyIEBACiAKIAlpZiAoRm91dCkgewogCQlpZiAoZmxsLT5yZWZfc3JjID49IDApIHsKLQkJCXJldCA9IGFyaXpvbmFfY2FsY19mbGwoZmxsLCAmcmVmLCBmbGwtPnJlZl9mcmVxLAotCQkJCQkgICAgICAgRm91dCk7CisJCQlyZXQgPSBhcml6b25hX3ZhbGlkYXRlX2ZsbChmbGwsIGZsbC0+cmVmX2ZyZXEsIEZvdXQpOwogCQkJaWYgKHJldCAhPSAwKQogCQkJCXJldHVybiByZXQ7CiAJCX0KIAotCQlyZXQgPSBhcml6b25hX2NhbGNfZmxsKGZsbCwgJnN5bmMsIEZyZWYsIEZvdXQpOworCQlyZXQgPSBhcml6b25hX3ZhbGlkYXRlX2ZsbChmbGwsIEZyZWYsIEZvdXQpOwogCQlpZiAocmV0ICE9IDApCiAJCQlyZXR1cm4gcmV0OwogCX0KQEAgLTE2NzgsNyArMTc2OSw3IEBACiAJZmxsLT5mb3V0ID0gRm91dDsKIAogCWlmIChGb3V0KSB7Ci0JCWFyaXpvbmFfZW5hYmxlX2ZsbChmbGwsICZyZWYsICZzeW5jKTsKKwkJYXJpem9uYV9lbmFibGVfZmxsKGZsbCk7CiAJfSBlbHNlIHsKIAkJYXJpem9uYV9kaXNhYmxlX2ZsbChmbGwpOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3E5M3ZjLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NxOTN2Yy5jCmluZGV4IDQzNzM3YTI3Li4xZTI1YzdhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NxOTN2Yy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3E5M3ZjLmMKQEAgLTEzOCw5ICsxMzgsOCBAQAogCXN0cnVjdCBkYXZpbmNpX3ZjICpkYXZpbmNpX3ZjID0gY29kZWMtPmRldi0+cGxhdGZvcm1fZGF0YTsKIAogCWRhdmluY2lfdmMtPmNxOTN2Yy5jb2RlYyA9IGNvZGVjOwotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBkYXZpbmNpX3ZjLT5yZWdtYXA7CiAKLQlzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMzIsIDMyLCBTTkRfU09DX1JFR01BUCk7CisJc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIGRhdmluY2lfdmMtPnJlZ21hcCk7CiAKIAkvKiBPZmYsIHdpdGggcG93ZXIgb24gKi8KIAljcTkzdmNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MC5jCmluZGV4IDgzYzgzNWQuLjM5MjBlNjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyNzAuYwpAQCAtNTA2LDE1ICs1MDYsNiBAQAogCXN0cnVjdCBjczQyNzBfcHJpdmF0ZSAqY3M0MjcwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCS8qIFRlbGwgQVNvQyB3aGF0IGtpbmQgb2YgSS9PIHRvIHVzZSB0byByZWFkIHRoZSByZWdpc3RlcnMuICBBU29DIHdpbGwKLQkgKiB0aGVuIGRvIHRoZSBJMkMgdHJhbnNhY3Rpb25zIGl0c2VsZi4KLQkgKi8KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgImZhaWxlZCB0byBzZXQgY2FjaGUgSS9PIChyZXQ9JWkpXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIERpc2FibGUgYXV0by1tdXRlLiAgVGhpcyBmZWF0dXJlIGFwcGVhcnMgdG8gYmUgYnVnZ3kuICBJbiBzb21lCiAJICogc2l0dWF0aW9ucywgYXV0by1tdXRlIHdpbGwgbm90IGRlYWN0aXZhdGUgd2hlbiBpdCBzaG91bGQsIHNvIHdlIHdhbnQKIAkgKiB0aGlzIGZlYXR1cmUgZGlzYWJsZWQgYnkgZGVmYXVsdC4gIEFuIGFwcGxpY2F0aW9uIChlLmcuIGFsc2FjdGwpIGNhbgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQyNzEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcxLmMKaW5kZXggY2UwNWZkOS4uYWVmNDk2NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQyNzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MS5jCkBAIC0xNTksNyArMTU5LDYgQEAKIH0KIAogc3RydWN0IGNzNDI3MV9wcml2YXRlIHsKLQkvKiBTTkRfU09DX0kyQyBvciBTTkRfU09DX1NQSSAqLwogCXVuc2lnbmVkIGludAkJCW1jbGs7CiAJYm9vbAkJCQltYXN0ZXI7CiAJYm9vbAkJCQlkZWVtcGg7CkBAIC01NDAsMTQgKzUzOSwxMCBAQAogCXN0cnVjdCBjczQyNzFfcHJpdmF0ZSAqY3M0MjcxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJc3RydWN0IGNzNDI3MV9wbGF0Zm9ybV9kYXRhICpjczQyNzFwbGF0ID0gY29kZWMtPmRldi0+cGxhdGZvcm1fZGF0YTsKIAlpbnQgcmV0OwotCWludCBncGlvX25yZXNldCA9IC1FSU5WQUw7CiAJYm9vbCBhbXV0ZWNfZXFfYm11dGVjID0gZmFsc2U7CiAKICNpZmRlZiBDT05GSUdfT0YKIAlpZiAob2ZfbWF0Y2hfZGV2aWNlKGNzNDI3MV9kdF9pZHMsIGNvZGVjLT5kZXYpKSB7Ci0JCWdwaW9fbnJlc2V0ID0gb2ZfZ2V0X25hbWVkX2dwaW8oY29kZWMtPmRldi0+b2Zfbm9kZSwKLQkJCQkJCSJyZXNldC1ncGlvIiwgMCk7Ci0KIAkJaWYgKG9mX2dldF9wcm9wZXJ0eShjb2RlYy0+ZGV2LT5vZl9ub2RlLAogCQkJCSAgICAgImNpcnJ1cyxhbXV0ZWMtZXEtYm11dGVjIiwgTlVMTCkpCiAJCQlhbXV0ZWNfZXFfYm11dGVjID0gdHJ1ZTsKQEAgLTU1OSwyNyArNTU0LDE5IEBACiAjZW5kaWYKIAogCWlmIChjczQyNzFwbGF0KSB7Ci0JCWlmIChncGlvX2lzX3ZhbGlkKGNzNDI3MXBsYXQtPmdwaW9fbnJlc2V0KSkKLQkJCWdwaW9fbnJlc2V0ID0gY3M0MjcxcGxhdC0+Z3Bpb19ucmVzZXQ7Ci0KIAkJYW11dGVjX2VxX2JtdXRlYyA9IGNzNDI3MXBsYXQtPmFtdXRlY19lcV9ibXV0ZWM7CiAJCWNzNDI3MS0+ZW5hYmxlX3NvZnRfcmVzZXQgPSBjczQyNzFwbGF0LT5lbmFibGVfc29mdF9yZXNldDsKIAl9CiAKLQlpZiAoZ3Bpb19ucmVzZXQgPj0gMCkKLQkJaWYgKGRldm1fZ3Bpb19yZXF1ZXN0KGNvZGVjLT5kZXYsIGdwaW9fbnJlc2V0LCAiQ1M0MjcxIFJlc2V0IikpCi0JCQlncGlvX25yZXNldCA9IC1FSU5WQUw7Ci0JaWYgKGdwaW9fbnJlc2V0ID49IDApIHsKKwlpZiAoZ3Bpb19pc192YWxpZChjczQyNzEtPmdwaW9fbnJlc2V0KSkgewogCQkvKiBSZXNldCBjb2RlYyAqLwotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3Bpb19ucmVzZXQsIDApOworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoY3M0MjcxLT5ncGlvX25yZXNldCwgMCk7CiAJCXVkZWxheSgxKTsKLQkJZ3Bpb19zZXRfdmFsdWUoZ3Bpb19ucmVzZXQsIDEpOworCQlncGlvX3NldF92YWx1ZShjczQyNzEtPmdwaW9fbnJlc2V0LCAxKTsKIAkJLyogR2l2ZSB0aGUgY29kZWMgdGltZSB0byB3YWtlIHVwICovCiAJCXVkZWxheSgxKTsKIAl9CiAKLQljczQyNzEtPmdwaW9fbnJlc2V0ID0gZ3Bpb19ucmVzZXQ7Ci0KIAlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoY3M0MjcxLT5yZWdtYXAsIENTNDI3MV9NT0RFMiwKIAkJCQkgQ1M0MjcxX01PREUyX1BETiB8IENTNDI3MV9NT0RFMl9DUEVOLAogCQkJCSBDUzQyNzFfTU9ERTJfUEROIHwgQ1M0MjcxX01PREUyX0NQRU4pOwpAQCAtNjI1LDYgKzYxMiwzNiBAQAogCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGNzNDI3MV9kYXBtX3JvdXRlcyksCiB9OwogCitzdGF0aWMgaW50IGNzNDI3MV9jb21tb25fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjczQyNzFfcHJpdmF0ZSAqKmMpCit7CisJc3RydWN0IGNzNDI3MV9wbGF0Zm9ybV9kYXRhICpjczQyNzFwbGF0ID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBjczQyNzFfcHJpdmF0ZSAqY3M0MjcxOworCisJY3M0MjcxID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjczQyNzEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNzNDI3MSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAob2ZfbWF0Y2hfZGV2aWNlKGNzNDI3MV9kdF9pZHMsIGRldikpCisJCWNzNDI3MS0+Z3Bpb19ucmVzZXQgPQorCQkJb2ZfZ2V0X25hbWVkX2dwaW8oZGV2LT5vZl9ub2RlLCAicmVzZXQtZ3BpbyIsIDApOworCisJaWYgKGNzNDI3MXBsYXQpCisJCWNzNDI3MS0+Z3Bpb19ucmVzZXQgPSBjczQyNzFwbGF0LT5ncGlvX25yZXNldDsKKworCWlmIChncGlvX2lzX3ZhbGlkKGNzNDI3MS0+Z3Bpb19ucmVzZXQpKSB7CisJCWludCByZXQ7CisKKwkJcmV0ID0gZGV2bV9ncGlvX3JlcXVlc3QoZGV2LCBjczQyNzEtPmdwaW9fbnJlc2V0LAorCQkJCQkiQ1M0MjcxIFJlc2V0Iik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkqYyA9IGNzNDI3MTsKKwlyZXR1cm4gMDsKK30KKwogI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBjczQyNzFfc3BpX3JlZ21hcCA9IHsKQEAgLTY0NCwxMCArNjYxLDExIEBACiBzdGF0aWMgaW50IGNzNDI3MV9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgY3M0MjcxX3ByaXZhdGUgKmNzNDI3MTsKKwlpbnQgcmV0OwogCi0JY3M0MjcxID0gZGV2bV9remFsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpjczQyNzEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNzNDI3MSkKLQkJcmV0dXJuIC1FTk9NRU07CisJcmV0ID0gY3M0MjcxX2NvbW1vbl9wcm9iZSgmc3BpLT5kZXYsICZjczQyNzEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCiAJc3BpX3NldF9kcnZkYXRhKHNwaSwgY3M0MjcxKTsKIAljczQyNzEtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfc3BpKHNwaSwgJmNzNDI3MV9zcGlfcmVnbWFwKTsKQEAgLTY5OCwxMCArNzE2LDExIEBACiAJCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBjczQyNzFfcHJpdmF0ZSAqY3M0MjcxOworCWludCByZXQ7CiAKLQljczQyNzEgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmNzNDI3MSksIEdGUF9LRVJORUwpOwotCWlmICghY3M0MjcxKQotCQlyZXR1cm4gLUVOT01FTTsKKwlyZXQgPSBjczQyNzFfY29tbW9uX3Byb2JlKCZjbGllbnQtPmRldiwgJmNzNDI3MSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjczQyNzEpOwogCWNzNDI3MS0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmY3M0MjcxX2kyY19yZWdtYXApOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQybDUxLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTEuYwppbmRleCA2ZTllYTgzLi42YzBkYTJiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTEuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KIAogI2luY2x1ZGUgImNzNDJsNTEuaCIKIApAQCAtNDAsNyArNDEsNiBAQAogfTsKIAogc3RydWN0IGNzNDJsNTFfcHJpdmF0ZSB7Ci0JZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7CiAJdW5zaWduZWQgaW50IG1jbGs7CiAJdW5zaWduZWQgaW50IGF1ZGlvX21vZGU7CS8qIFRoZSBtb2RlIChJMlMgb3IgbGVmdC1qdXN0aWZpZWQpICovCiAJZW51bSBtYXN0ZXJfc2xhdmVfbW9kZSBmdW5jOwpAQCAtNTIsMjQgKzUyLDYgQEAKIAkJU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0JFIHwgXAogCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSAgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9CRSkKIAotc3RhdGljIGludCBjczQybDUxX2ZpbGxfY2FjaGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXU4ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGUgKyAxOwotCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50ID0gdG9faTJjX2NsaWVudChjb2RlYy0+ZGV2KTsKLQlzMzIgbGVuZ3RoOwotCi0JbGVuZ3RoID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoaTJjX2NsaWVudCwKLQkJCUNTNDJMNTFfRklSU1RSRUcgfCAweDgwLCBDUzQyTDUxX05VTVJFR1MsIGNhY2hlKTsKLQlpZiAobGVuZ3RoICE9IENTNDJMNTFfTlVNUkVHUykgewotCQlkZXZfZXJyKCZpMmNfY2xpZW50LT5kZXYsCi0JCQkJIkkyQyByZWFkIGZhaWx1cmUsIGFkZHI9MHgleCAocmV0PSVkIHZzICVkKVxuIiwKLQkJCQlpMmNfY2xpZW50LT5hZGRyLCBsZW5ndGgsIENTNDJMNTFfTlVNUkVHUyk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGNzNDJsNTFfZ2V0X2NoYW5fbWl4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CkBAIC0xMjQsOSArMTA2LDggQEAKIAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFkY19wY21fdGx2LCAtNTE1MCwgNTAsIDApOwogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHRvbmVfdGx2LCAtMTA1MCwgMTUwLCAwKTsKLS8qIFRoaXMgaXMgYSBsaWUuIGFmdGVyIC0xMDIgZGIsIGl0IHN0YXlzIGF0IC0xMDIgKi8KLS8qIG1heWJlIGEgcmFuZ2Ugd291bGQgYmUgYmV0dGVyICovCi1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYW91dF90bHYsIC0xMTU1MCwgNTAsIDApOworCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYW91dF90bHYsIC0xMDIwMCwgNTAsIDApOwogCiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYm9vc3RfdGx2LCAxNjAwLCAxNjAwLCAwKTsKIHN0YXRpYyBjb25zdCBjaGFyICpjaGFuX21peFtdID0gewpAQCAtMTM1LDEzICsxMTYsMTIgQEAKIAkiUiBMIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY3M0Mmw1MV9jaGFuX21peCA9Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKGNoYW5fbWl4KSwgY2hhbl9taXgpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChjczQybDUxX2NoYW5fbWl4LCBjaGFuX21peCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjczQybDUxX3NuZF9jb250cm9sc1tdID0gewogCVNPQ19ET1VCTEVfUl9TWF9UTFYoIlBDTSBQbGF5YmFjayBWb2x1bWUiLAogCQkJQ1M0Mkw1MV9QQ01BX1ZPTCwgQ1M0Mkw1MV9QQ01CX1ZPTCwKLQkJCTYsIDB4MTksIDB4N0YsIGFkY19wY21fdGx2KSwKKwkJCTAsIDB4MTksIDB4N0YsIGFkY19wY21fdGx2KSwKIAlTT0NfRE9VQkxFX1IoIlBDTSBQbGF5YmFjayBTd2l0Y2giLAogCQkJQ1M0Mkw1MV9QQ01BX1ZPTCwgQ1M0Mkw1MV9QQ01CX1ZPTCwgNywgMSwgMSksCiAJU09DX0RPVUJMRV9SX1NYX1RMVigiQW5hbG9nIFBsYXliYWNrIFZvbHVtZSIsCkBAIC0xNDksNyArMTI5LDcgQEAKIAkJCTAsIDB4MzQsIDB4RTQsIGFvdXRfdGx2KSwKIAlTT0NfRE9VQkxFX1JfU1hfVExWKCJBREMgTWl4ZXIgVm9sdW1lIiwKIAkJCUNTNDJMNTFfQURDQV9WT0wsIENTNDJMNTFfQURDQl9WT0wsCi0JCQk2LCAweDE5LCAweDdGLCBhZGNfcGNtX3RsdiksCisJCQkwLCAweDE5LCAweDdGLCBhZGNfcGNtX3RsdiksCiAJU09DX0RPVUJMRV9SKCJBREMgTWl4ZXIgU3dpdGNoIiwKIAkJCUNTNDJMNTFfQURDQV9WT0wsIENTNDJMNTFfQURDQl9WT0wsIDcsIDEsIDEpLAogCVNPQ19TSU5HTEUoIlBsYXliYWNrIERlZW1waGFzaXMgU3dpdGNoIiwgQ1M0Mkw1MV9EQUNfQ1RMLCAzLCAxLCAwKSwKQEAgLTE5MiwyMiArMTcyLDIyIEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICpjczQybDUxX2RhY19uYW1lc1tdID0geyJEaXJlY3QgUENNIiwKIAkiRFNQIFBDTSIsICJBREMifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY3M0Mmw1MV9kYWNfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDUxX0RBQ19DVEwsIDYsIDMsIGNzNDJsNTFfZGFjX25hbWVzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjczQybDUxX2RhY19tdXhfZW51bSwKKwkJCSAgICBDUzQyTDUxX0RBQ19DVEwsIDYsIGNzNDJsNTFfZGFjX25hbWVzKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjczQybDUxX2RhY19tdXhfY29udHJvbHMgPQogCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgY3M0Mmw1MV9kYWNfbXV4X2VudW0pOwogCiBzdGF0aWMgY29uc3QgY2hhciAqY3M0Mmw1MV9hZGNsX25hbWVzW10gPSB7IkFJTjEgTGVmdCIsICJBSU4yIExlZnQiLAogCSJNSUMgTGVmdCIsICJNSUMrcHJlYW1wIExlZnQifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY3M0Mmw1MV9hZGNsX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1MV9BRENfSU5QVVQsIDQsIDQsIGNzNDJsNTFfYWRjbF9uYW1lcyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY3M0Mmw1MV9hZGNsX211eF9lbnVtLAorCQkJICAgIENTNDJMNTFfQURDX0lOUFVULCA0LCBjczQybDUxX2FkY2xfbmFtZXMpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNzNDJsNTFfYWRjbF9tdXhfY29udHJvbHMgPQogCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgY3M0Mmw1MV9hZGNsX211eF9lbnVtKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmNzNDJsNTFfYWRjcl9uYW1lc1tdID0geyJBSU4xIFJpZ2h0IiwgIkFJTjIgUmlnaHQiLAogCSJNSUMgUmlnaHQiLCAiTUlDK3ByZWFtcCBSaWdodCJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjczQybDUxX2FkY3JfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDUxX0FEQ19JTlBVVCwgNiwgNCwgY3M0Mmw1MV9hZGNyX25hbWVzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjczQybDUxX2FkY3JfbXV4X2VudW0sCisJCQkgICAgQ1M0Mkw1MV9BRENfSU5QVVQsIDYsIGNzNDJsNTFfYWRjcl9uYW1lcyk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3M0Mmw1MV9hZGNyX211eF9jb250cm9scyA9CiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBjczQybDUxX2FkY3JfbXV4X2VudW0pOwogCkBAIC01MDUsMjEgKzQ4NSw4IEBACiAKIHN0YXRpYyBpbnQgY3M0Mmw1MV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0Jc3RydWN0IGNzNDJsNTFfcHJpdmF0ZSAqY3M0Mmw1MSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCByZXQsIHJlZzsKIAotCXJldCA9IGNzNDJsNTFfZmlsbF9jYWNoZShjb2RlYyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiZmFpbGVkIHRvIGZpbGwgcmVnaXN0ZXIgY2FjaGVcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBjczQybDUxLT5jb250cm9sX3R5cGUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKgogCSAqIERBQyBjb25maWd1cmF0aW9uCiAJICogLSBVc2Ugc2lnbmFsIHByb2Nlc3NvcgpAQCAtNTM4LDggKzUwNSw2IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2RldmljZV9jczQybDUxID0gewogCS5wcm9iZSA9IGNzNDJsNTFfcHJvYmUsCi0JLnJlZ19jYWNoZV9zaXplID0gQ1M0Mkw1MV9OVU1SRUdTICsgMSwKLQkucmVnX3dvcmRfc2l6ZSA9IHNpemVvZih1OCksCiAKIAkuY29udHJvbHMgPSBjczQybDUxX3NuZF9jb250cm9scywKIAkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShjczQybDUxX3NuZF9jb250cm9scyksCkBAIC01NDksMzggKzUxNCw1MyBAQAogCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGNzNDJsNTFfcm91dGVzKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBjczQybDUxX3JlZ21hcCA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisKKwkubWF4X3JlZ2lzdGVyID0gQ1M0Mkw1MV9DSEFSR0VfRlJFUSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKK307CisKIHN0YXRpYyBpbnQgY3M0Mmw1MV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyY19jbGllbnQsCiAJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBjczQybDUxX3ByaXZhdGUgKmNzNDJsNTE7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXVuc2lnbmVkIGludCB2YWw7CiAJaW50IHJldDsKIAorCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyY19jbGllbnQsICZjczQybDUxX3JlZ21hcCk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIocmVnbWFwKTsKKwkJZGV2X2VycigmaTJjX2NsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSByZWdtYXA6ICVkXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAkvKiBWZXJpZnkgdGhhdCB3ZSBoYXZlIGEgQ1M0Mkw1MSAqLwotCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShpMmNfY2xpZW50LCBDUzQyTDUxX0NISVBfUkVWX0lEKTsKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIENTNDJMNTFfQ0hJUF9SRVZfSUQsICZ2YWwpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmkyY19jbGllbnQtPmRldiwgImZhaWxlZCB0byByZWFkIEkyQ1xuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JaWYgKChyZXQgIT0gQ1M0Mkw1MV9NS19DSElQX1JFVihDUzQyTDUxX0NISVBfSUQsIENTNDJMNTFfQ0hJUF9SRVZfQSkpICYmCi0JICAgIChyZXQgIT0gQ1M0Mkw1MV9NS19DSElQX1JFVihDUzQyTDUxX0NISVBfSUQsIENTNDJMNTFfQ0hJUF9SRVZfQikpKSB7Ci0JCWRldl9lcnIoJmkyY19jbGllbnQtPmRldiwgIkludmFsaWQgY2hpcCBpZFxuIik7CisJaWYgKCh2YWwgIT0gQ1M0Mkw1MV9NS19DSElQX1JFVihDUzQyTDUxX0NISVBfSUQsIENTNDJMNTFfQ0hJUF9SRVZfQSkpICYmCisJICAgICh2YWwgIT0gQ1M0Mkw1MV9NS19DSElQX1JFVihDUzQyTDUxX0NISVBfSUQsIENTNDJMNTFfQ0hJUF9SRVZfQikpKSB7CisJCWRldl9lcnIoJmkyY19jbGllbnQtPmRldiwgIkludmFsaWQgY2hpcCBpZDogJXhcbiIsIHZhbCk7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyb3I7CiAJfQogCiAJZGV2X2luZm8oJmkyY19jbGllbnQtPmRldiwgImZvdW5kIGRldmljZSBjczQybDUxIHJldiAlZFxuIiwKLQkJCQlyZXQgJiA3KTsKKwkJIHZhbCAmIDcpOwogCiAJY3M0Mmw1MSA9IGRldm1fa3phbGxvYygmaTJjX2NsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IGNzNDJsNTFfcHJpdmF0ZSksCiAJCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjczQybDUxKSB7Ci0JCWRldl9lcnIoJmkyY19jbGllbnQtPmRldiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBjb2RlY1xuIik7CisJaWYgKCFjczQybDUxKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjX2NsaWVudCwgY3M0Mmw1MSk7Ci0JY3M0Mmw1MS0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CiAKIAlyZXQgPSAgc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjX2NsaWVudC0+ZGV2LAogCQkJJnNvY19jb2RlY19kZXZpY2VfY3M0Mmw1MSwgJmNzNDJsNTFfZGFpLCAxKTsKQEAgLTYwMCwxMCArNTgwLDE3IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGNzNDJsNTFfaWQpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjczQybDUxX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJjaXJydXMsY3M0Mmw1MSIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgY3M0Mmw1MV9vZl9tYXRjaCk7CisKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBjczQybDUxX2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiY3M0Mmw1MS1jb2RlYyIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBjczQybDUxX29mX21hdGNoLAogCX0sCiAJLmlkX3RhYmxlID0gY3M0Mmw1MV9pZCwKIAkucHJvYmUgPSBjczQybDUxX2kyY19wcm9iZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1Mi5jIGIvc291bmQvc29jL2NvZGVjcy9jczQybDUyLmMKaW5kZXggMGJhYzZkNS4uZjBjYTZiZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQybDUyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQybDUyLmMKQEAgLTIxMCwxMyArMjEwLDExIEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzNDJsNTJfYWRjYl90ZXh0W10gPSB7CiAJIklucHV0MUIiLCAiSW5wdXQyQiIsICJJbnB1dDNCIiwgIklucHV0NEIiLCAiUEdBIElucHV0IFJpZ2h0In07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjYV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9BRENfUEdBX0EsIDUsCi0JCUFSUkFZX1NJWkUoY3M0Mmw1Ml9hZGNhX3RleHQpLCBjczQybDUyX2FkY2FfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRjYV9lbnVtLAorCQkJICAgIENTNDJMNTJfQURDX1BHQV9BLCA1LCBjczQybDUyX2FkY2FfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjYl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9BRENfUEdBX0IsIDUsCi0JCUFSUkFZX1NJWkUoY3M0Mmw1Ml9hZGNiX3RleHQpLCBjczQybDUyX2FkY2JfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRjYl9lbnVtLAorCQkJICAgIENTNDJMNTJfQURDX1BHQV9CLCA1LCBjczQybDUyX2FkY2JfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGNhX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTGVmdCBBREMgSW5wdXQgQ2FwdHVyZSBNdXgiLCBhZGNhX2VudW0pOwpAQCAtMjI5LDI2ICsyMjcsMjIgQEAKIAkiMC44ICtWQSIsICIwLjgzICtWQSIsICIwLjkxICtWQSIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWljX2JpYXNfbGV2ZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKENTNDJMNTJfSUZBQ0VfQ1RMMiwgMCwKLQkJCUFSUkFZX1NJWkUobWljX2JpYXNfbGV2ZWxfdGV4dCksIG1pY19iaWFzX2xldmVsX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1pY19iaWFzX2xldmVsX2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9JRkFDRV9DVEwyLCAwLCBtaWNfYmlhc19sZXZlbF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjczQybDUyX21pY190ZXh0W10gPSB7ICJNSUMxIiwgIk1JQzIiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWljYV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9NSUNBX0NUTCwgNSwKLQkJCUFSUkFZX1NJWkUoY3M0Mmw1Ml9taWNfdGV4dCksIGNzNDJsNTJfbWljX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1pY2FfZW51bSwKKwkJCSAgICBDUzQyTDUyX01JQ0FfQ1RMLCA1LCBjczQybDUyX21pY190ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtaWNiX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDUyX01JQ0JfQ1RMLCA1LAotCQkJQVJSQVlfU0laRShjczQybDUyX21pY190ZXh0KSwgY3M0Mmw1Ml9taWNfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWljYl9lbnVtLAorCQkJICAgIENTNDJMNTJfTUlDQl9DVEwsIDUsIGNzNDJsNTJfbWljX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRpZ2l0YWxfb3V0cHV0X211eF90ZXh0W10gPSB7IkFEQyIsICJEU1AifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkaWdpdGFsX291dHB1dF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKENTNDJMNTJfQURDX01JU0NfQ1RMLCA2LAotCQkJQVJSQVlfU0laRShkaWdpdGFsX291dHB1dF9tdXhfdGV4dCksCi0JCQlkaWdpdGFsX291dHB1dF9tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGlnaXRhbF9vdXRwdXRfbXV4X2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9BRENfTUlTQ19DVEwsIDYsCisJCQkgICAgZGlnaXRhbF9vdXRwdXRfbXV4X3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGlnaXRhbF9vdXRwdXRfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJEaWdpdGFsIE91dHB1dCBNdXgiLCBkaWdpdGFsX291dHB1dF9tdXhfZW51bSk7CkBAIC0yNTgsMTggKzI1MiwxOCBAQAogCSIwLjcwOTkiLCAiMC44Mzk5IiwgIjEuMDAwIiwgIjEuMTQzMCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaHBfZ2Fpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9QQl9DVEwxLCA1LAotCQlBUlJBWV9TSVpFKGhwX2dhaW5fbnVtX3RleHQpLCBocF9nYWluX251bV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChocF9nYWluX2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9QQl9DVEwxLCA1LAorCQkJICAgIGhwX2dhaW5fbnVtX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJlZXBfcGl0Y2hfdGV4dFtdID0gewogCSJDNCIsICJDNSIsICJENSIsICJFNSIsICJGNSIsICJHNSIsICJBNSIsICJCNSIsCiAJIkM2IiwgIkQ2IiwgIkU2IiwgIkY2IiwgIkc2IiwgIkE2IiwgIkI2IiwgIkM3IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBiZWVwX3BpdGNoX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDUyX0JFRVBfRlJFUSwgNCwKLQkJCUFSUkFZX1NJWkUoYmVlcF9waXRjaF90ZXh0KSwgYmVlcF9waXRjaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChiZWVwX3BpdGNoX2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9CRUVQX0ZSRVEsIDQsCisJCQkgICAgYmVlcF9waXRjaF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiZWVwX29udGltZV90ZXh0W10gPSB7CiAJIjg2IG1zIiwgIjQzMCBtcyIsICI3ODAgbXMiLCAiMS4yMCBzIiwgIjEuNTAgcyIsCkBAIC0yNzcsNjYgKzI3MSw2NiBAQAogCSIzLjUwIHMiLCAiMy44MCBzIiwgIjQuMjAgcyIsICI0LjUwIHMiLCAiNC44MCBzIiwgIjUuMjAgcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYmVlcF9vbnRpbWVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKENTNDJMNTJfQkVFUF9GUkVRLCAwLAotCQkJQVJSQVlfU0laRShiZWVwX29udGltZV90ZXh0KSwgYmVlcF9vbnRpbWVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYmVlcF9vbnRpbWVfZW51bSwKKwkJCSAgICBDUzQyTDUyX0JFRVBfRlJFUSwgMCwKKwkJCSAgICBiZWVwX29udGltZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiZWVwX29mZnRpbWVfdGV4dFtdID0gewogCSIxLjIzIHMiLCAiMi41OCBzIiwgIjMuOTAgcyIsICI1LjIwIHMiLAogCSI2LjYwIHMiLCAiOC4wNSBzIiwgIjkuMzUgcyIsICIxMC44MCBzIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBiZWVwX29mZnRpbWVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKENTNDJMNTJfQkVFUF9WT0wsIDUsCi0JCQlBUlJBWV9TSVpFKGJlZXBfb2ZmdGltZV90ZXh0KSwgYmVlcF9vZmZ0aW1lX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGJlZXBfb2ZmdGltZV9lbnVtLAorCQkJICAgIENTNDJMNTJfQkVFUF9WT0wsIDUsCisJCQkgICAgYmVlcF9vZmZ0aW1lX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJlZXBfY29uZmlnX3RleHRbXSA9IHsKIAkiT2ZmIiwgIlNpbmdsZSIsICJNdWx0aXBsZSIsICJDb250aW51b3VzIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBiZWVwX2NvbmZpZ19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9CRUVQX1RPTkVfQ1RMLCA2LAotCQkJQVJSQVlfU0laRShiZWVwX2NvbmZpZ190ZXh0KSwgYmVlcF9jb25maWdfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYmVlcF9jb25maWdfZW51bSwKKwkJCSAgICBDUzQyTDUyX0JFRVBfVE9ORV9DVEwsIDYsCisJCQkgICAgYmVlcF9jb25maWdfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmVlcF9iYXNzX3RleHRbXSA9IHsKIAkiNTAgSHoiLCAiMTAwIEh6IiwgIjIwMCBIeiIsICIyNTAgSHoiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGJlZXBfYmFzc19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9CRUVQX1RPTkVfQ1RMLCAxLAotCQkJQVJSQVlfU0laRShiZWVwX2Jhc3NfdGV4dCksIGJlZXBfYmFzc190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChiZWVwX2Jhc3NfZW51bSwKKwkJCSAgICBDUzQyTDUyX0JFRVBfVE9ORV9DVEwsIDEsCisJCQkgICAgYmVlcF9iYXNzX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJlZXBfdHJlYmxlX3RleHRbXSA9IHsKIAkiNSBrSHoiLCAiNyBrSHoiLCAiMTAga0h6IiwgIiAxNSBrSHoiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGJlZXBfdHJlYmxlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDUyX0JFRVBfVE9ORV9DVEwsIDMsCi0JCQlBUlJBWV9TSVpFKGJlZXBfdHJlYmxlX3RleHQpLCBiZWVwX3RyZWJsZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChiZWVwX3RyZWJsZV9lbnVtLAorCQkJICAgIENTNDJMNTJfQkVFUF9UT05FX0NUTCwgMywKKwkJCSAgICBiZWVwX3RyZWJsZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuZ190aHJlc2hvbGRfdGV4dFtdID0gewogCSItMzRkQiIsICItMzdkQiIsICItNDBkQiIsICItNDNkQiIsCiAJIi00NmRCIiwgIi01MmRCIiwgIi01OGRCIiwgIi02NGRCIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBuZ190aHJlc2hvbGRfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKENTNDJMNTJfTk9JU0VfR0FURV9DVEwsIDIsCi0JCUFSUkFZX1NJWkUobmdfdGhyZXNob2xkX3RleHQpLCBuZ190aHJlc2hvbGRfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobmdfdGhyZXNob2xkX2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9OT0lTRV9HQVRFX0NUTCwgMiwKKwkJCSAgICBuZ190aHJlc2hvbGRfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3M0Mmw1Ml9uZ19kZWxheV90ZXh0W10gPSB7CiAJIjUwbXMiLCAiMTAwbXMiLCAiMTUwbXMiLCAiMjAwbXMifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBuZ19kZWxheV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9OT0lTRV9HQVRFX0NUTCwgMCwKLQkJQVJSQVlfU0laRShjczQybDUyX25nX2RlbGF5X3RleHQpLCBjczQybDUyX25nX2RlbGF5X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG5nX2RlbGF5X2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9OT0lTRV9HQVRFX0NUTCwgMCwKKwkJCSAgICBjczQybDUyX25nX2RlbGF5X3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzNDJsNTJfbmdfdHlwZV90ZXh0W10gPSB7CiAJIkFwcGx5IFNwZWNpZmljIiwgIkFwcGx5IEFsbCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbmdfdHlwZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9OT0lTRV9HQVRFX0NUTCwgNiwKLQkJQVJSQVlfU0laRShjczQybDUyX25nX3R5cGVfdGV4dCksIGNzNDJsNTJfbmdfdHlwZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChuZ190eXBlX2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9OT0lTRV9HQVRFX0NUTCwgNiwKKwkJCSAgICBjczQybDUyX25nX3R5cGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGVmdF9zd2FwX3RleHRbXSA9IHsKIAkiTGVmdCIsICJMUiAyIiwgIlJpZ2h0In07CkBAIC0zNDcsNyArMzQxLDcgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3dhcF92YWx1ZXNbXSA9IHsgMCwgMSwgMyB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkY2Ffc3dhcF9lbnVtID0KLQlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9BRENfUENNX01JWEVSLCAyLCAxLAorCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShDUzQyTDUyX0FEQ19QQ01fTUlYRVIsIDIsIDMsCiAJCQkgICAgICBBUlJBWV9TSVpFKGxlZnRfc3dhcF90ZXh0KSwKIAkJCSAgICAgIGxlZnRfc3dhcF90ZXh0LAogCQkJICAgICAgc3dhcF92YWx1ZXMpOwpAQCAtMzU2LDcgKzM1MCw3IEBACiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhZGNhX3N3YXBfZW51bSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcGNtYV9zd2FwX2VudW0gPQotCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShDUzQyTDUyX0FEQ19QQ01fTUlYRVIsIDYsIDEsCisJU09DX1ZBTFVFX0VOVU1fU0lOR0xFKENTNDJMNTJfQURDX1BDTV9NSVhFUiwgNiwgMywKIAkJCSAgICAgIEFSUkFZX1NJWkUobGVmdF9zd2FwX3RleHQpLAogCQkJICAgICAgbGVmdF9zd2FwX3RleHQsCiAJCQkgICAgICBzd2FwX3ZhbHVlcyk7CkBAIC0zNjUsNyArMzU5LDcgQEAKIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHBjbWFfc3dhcF9lbnVtKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNiX3N3YXBfZW51bSA9Ci0JU09DX1ZBTFVFX0VOVU1fU0lOR0xFKENTNDJMNTJfQURDX1BDTV9NSVhFUiwgMCwgMSwKKwlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9BRENfUENNX01JWEVSLCAwLCAzLAogCQkJICAgICAgQVJSQVlfU0laRShyaWdodF9zd2FwX3RleHQpLAogCQkJICAgICAgcmlnaHRfc3dhcF90ZXh0LAogCQkJICAgICAgc3dhcF92YWx1ZXMpOwpAQCAtMzc0LDcgKzM2OCw3IEBACiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhZGNiX3N3YXBfZW51bSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcGNtYl9zd2FwX2VudW0gPQotCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShDUzQyTDUyX0FEQ19QQ01fTUlYRVIsIDQsIDEsCisJU09DX1ZBTFVFX0VOVU1fU0lOR0xFKENTNDJMNTJfQURDX1BDTV9NSVhFUiwgNCwgMywKIAkJCSAgICAgIEFSUkFZX1NJWkUocmlnaHRfc3dhcF90ZXh0KSwKIAkJCSAgICAgIHJpZ2h0X3N3YXBfdGV4dCwKIAkJCSAgICAgIHN3YXBfdmFsdWVzKTsKQEAgLTExMTUsMTQgKzExMDksNyBAQAogc3RhdGljIGludCBjczQybDUyX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgY3M0Mmw1Ml9wcml2YXRlICpjczQybDUyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBjczQybDUyLT5yZWdtYXA7Ci0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQogCXJlZ2NhY2hlX2NhY2hlX29ubHkoY3M0Mmw1Mi0+cmVnbWFwLCB0cnVlKTsKIAogCWNzNDJsNTJfYWRkX21pY19jb250cm9scyhjb2RlYyk7CkBAIC0xMTM0LDcgKzExMjEsNyBAQAogCWNzNDJsNTItPnN5c2NsayA9IENTNDJMNTJfREVGQVVMVF9DTEs7CiAJY3M0Mmw1Mi0+Y29uZmlnLmZvcm1hdCA9IENTNDJMNTJfREVGQVVMVF9GT1JNQVQ7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGNzNDJsNTJfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw3My5jIGIvc291bmQvc29jL2NvZGVjcy9jczQybDczLmMKaW5kZXggNTQ5ZDVkNi4uMGVlNjBhMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQybDczLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQybDczLmMKQEAgLTI3OCwxMyArMjc4LDEzIEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzNDJsNzNfcGdhYV90ZXh0W10gPSB7ICJMaW5lIEEiLCAiTWljIDEiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzNDJsNzNfcGdhYl90ZXh0W10gPSB7ICJMaW5lIEIiLCAiTWljIDIiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcGdhYV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw3M19BRENJUEMsIDMsCi0JCUFSUkFZX1NJWkUoY3M0Mmw3M19wZ2FhX3RleHQpLCBjczQybDczX3BnYWFfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocGdhYV9lbnVtLAorCQkJICAgIENTNDJMNzNfQURDSVBDLCAzLAorCQkJICAgIGNzNDJsNzNfcGdhYV90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBwZ2FiX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDczX0FEQ0lQQywgNywKLQkJQVJSQVlfU0laRShjczQybDczX3BnYWJfdGV4dCksIGNzNDJsNzNfcGdhYl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwZ2FiX2VudW0sCisJCQkgICAgQ1M0Mkw3M19BRENJUEMsIDcsCisJCQkgICAgY3M0Mmw3M19wZ2FiX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcGdhYV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxlZnQgQW5hbG9nIElucHV0IENhcHR1cmUgTXV4IiwgcGdhYV9lbnVtKTsKQEAgLTMwOSw5ICszMDksOSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjczQybDczX25nX2RlbGF5X3RleHRbXSA9IHsKIAkiNTBtcyIsICIxMDBtcyIsICIxNTBtcyIsICIyMDBtcyIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBuZ19kZWxheV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw3M19OR0NBQiwgMCwKLQkJQVJSQVlfU0laRShjczQybDczX25nX2RlbGF5X3RleHQpLCBjczQybDczX25nX2RlbGF5X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG5nX2RlbGF5X2VudW0sCisJCQkgICAgQ1M0Mkw3M19OR0NBQiwgMCwKKwkJCSAgICBjczQybDczX25nX2RlbGF5X3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzNDJsNzNfbW9ub19taXhfdGV4dHNbXSA9IHsKIAkiTGVmdCIsICJSaWdodCIsICJNb25vIE1peCJ9OwpAQCAtMzE5LDcgKzMxOSw3IEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNzNDJsNzNfbW9ub19taXhfdmFsdWVzW10gPSB7IDAsIDEsIDIgfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzcGtfYXNwX2VudW0gPQotCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShDUzQyTDczX01NSVhDVEwsIDYsIDEsCisJU09DX1ZBTFVFX0VOVU1fU0lOR0xFKENTNDJMNzNfTU1JWENUTCwgNiwgMywKIAkJCSAgICAgIEFSUkFZX1NJWkUoY3M0Mmw3M19tb25vX21peF90ZXh0cyksCiAJCQkgICAgICBjczQybDczX21vbm9fbWl4X3RleHRzLAogCQkJICAgICAgY3M0Mmw3M19tb25vX21peF92YWx1ZXMpOwpAQCAtMzM3LDcgKzMzNyw3IEBACiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBzcGtfeHNwX2VudW0pOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGVzbF9hc3BfZW51bSA9Ci0JU09DX1ZBTFVFX0VOVU1fU0lOR0xFKENTNDJMNzNfTU1JWENUTCwgMiwgNSwKKwlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQ1M0Mkw3M19NTUlYQ1RMLCAyLCAzLAogCQkJICAgICAgQVJSQVlfU0laRShjczQybDczX21vbm9fbWl4X3RleHRzKSwKIAkJCSAgICAgIGNzNDJsNzNfbW9ub19taXhfdGV4dHMsCiAJCQkgICAgICBjczQybDczX21vbm9fbWl4X3ZhbHVlcyk7CkBAIC0zNDYsNyArMzQ2LDcgQEAKIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIGVzbF9hc3BfZW51bSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZXNsX3hzcF9lbnVtID0KLQlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQ1M0Mkw3M19NTUlYQ1RMLCAwLCA3LAorCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShDUzQyTDczX01NSVhDVEwsIDAsIDMsCiAJCQkgICAgICBBUlJBWV9TSVpFKGNzNDJsNzNfbW9ub19taXhfdGV4dHMpLAogCQkJICAgICAgY3M0Mmw3M19tb25vX21peF90ZXh0cywKIAkJCSAgICAgIGNzNDJsNzNfbW9ub19taXhfdmFsdWVzKTsKQEAgLTM1NywxOSArMzU3LDE5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzNDJsNzNfaXBfc3dhcF90ZXh0W10gPSB7CiAJIlN0ZXJlbyIsICJNb25vIEEiLCAiTW9ubyBCIiwgIlN3YXAgQS1CIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaXBfc3dhcF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw3M19NSU9QQywgNiwKLQkJQVJSQVlfU0laRShjczQybDczX2lwX3N3YXBfdGV4dCksIGNzNDJsNzNfaXBfc3dhcF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChpcF9zd2FwX2VudW0sCisJCQkgICAgQ1M0Mkw3M19NSU9QQywgNiwKKwkJCSAgICBjczQybDczX2lwX3N3YXBfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3M0Mmw3M19zcG9fbWl4ZXJfdGV4dFtdID0geyJNb25vIiwgIlN0ZXJlbyJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHZzcF9vdXRwdXRfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDczX01JWEVSQ1RMLCA1LAotCQlBUlJBWV9TSVpFKGNzNDJsNzNfc3BvX21peGVyX3RleHQpLCBjczQybDczX3Nwb19taXhlcl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh2c3Bfb3V0cHV0X211eF9lbnVtLAorCQkJICAgIENTNDJMNzNfTUlYRVJDVEwsIDUsCisJCQkgICAgY3M0Mmw3M19zcG9fbWl4ZXJfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0geHNwX291dHB1dF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKENTNDJMNzNfTUlYRVJDVEwsIDQsCi0JCUFSUkFZX1NJWkUoY3M0Mmw3M19zcG9fbWl4ZXJfdGV4dCksIGNzNDJsNzNfc3BvX21peGVyX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHhzcF9vdXRwdXRfbXV4X2VudW0sCisJCQkgICAgQ1M0Mkw3M19NSVhFUkNUTCwgNCwKKwkJCSAgICBjczQybDczX3Nwb19taXhlcl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZzcF9vdXRwdXRfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHZzcF9vdXRwdXRfbXV4X2VudW0pOwpAQCAtMTEwOCw3ICsxMTA4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHUzMiBjczQybDczX2FzcmNfcmF0ZXNbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY3M0Mmw3M19hc3JjX3JhdGVzW10gPSB7CiAJODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsCiAJMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAKIH07CkBAIC0xMjQxLDcgKzEyNDEsNyBAQAogCQkJCQkweDdGLCB0cmlzdGF0ZSA8PCA3KTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c18xMl8yNCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTJfMjQgPSB7CiAJLmNvdW50ICA9IEFSUkFZX1NJWkUoY3M0Mmw3M19hc3JjX3JhdGVzKSwKIAkubGlzdCAgID0gY3M0Mmw3M19hc3JjX3JhdGVzLAogfTsKQEAgLTEyNTUsOSArMTI1NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFNORFJWX1BDTV9SQVRFX0tOT1QgLT4gMTIwMDAsIDI0MDAwIEh6LCBsaW1pdCB3aXRoIGNvbnN0cmFpbnQgbGlzdCAqLwotI2RlZmluZSBDUzQyTDczX1JBVEVTIChTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfS05PVCkKLQogCiAjZGVmaW5lIENTNDJMNzNfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyMF8zTEUgfFwKIAlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSkKQEAgLTEyNzgsMTQgKzEyNzUsMTQgQEAKIAkJCS5zdHJlYW1fbmFtZSA9ICJYU1AgUGxheWJhY2siLAogCQkJLmNoYW5uZWxzX21pbiA9IDEsCiAJCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlcyA9IENTNDJMNzNfUkFURVMsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9LTk9ULAogCQkJLmZvcm1hdHMgPSBDUzQyTDczX0ZPUk1BVFMsCiAJCX0sCiAJCS5jYXB0dXJlID0gewogCQkJLnN0cmVhbV9uYW1lID0gIlhTUCBDYXB0dXJlIiwKIAkJCS5jaGFubmVsc19taW4gPSAxLAogCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZXMgPSBDUzQyTDczX1JBVEVTLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVCwKIAkJCS5mb3JtYXRzID0gQ1M0Mkw3M19GT1JNQVRTLAogCQl9LAogCQkub3BzID0gJmNzNDJsNzNfb3BzLApAQCAtMTI5OCwxNCArMTI5NSwxNCBAQAogCQkJLnN0cmVhbV9uYW1lID0gIkFTUCBQbGF5YmFjayIsCiAJCQkuY2hhbm5lbHNfbWluID0gMiwKIAkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVzID0gQ1M0Mkw3M19SQVRFUywKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFX0tOT1QsCiAJCQkuZm9ybWF0cyA9IENTNDJMNzNfRk9STUFUUywKIAkJfSwKIAkJLmNhcHR1cmUgPSB7CiAJCQkuc3RyZWFtX25hbWUgPSAiQVNQIENhcHR1cmUiLAogCQkJLmNoYW5uZWxzX21pbiA9IDIsCiAJCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlcyA9IENTNDJMNzNfUkFURVMsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9LTk9ULAogCQkJLmZvcm1hdHMgPSBDUzQyTDczX0ZPUk1BVFMsCiAJCX0sCiAJCS5vcHMgPSAmY3M0Mmw3M19vcHMsCkBAIC0xMzE4LDE0ICsxMzE1LDE0IEBACiAJCQkuc3RyZWFtX25hbWUgPSAiVlNQIFBsYXliYWNrIiwKIAkJCS5jaGFubmVsc19taW4gPSAxLAogCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZXMgPSBDUzQyTDczX1JBVEVTLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVCwKIAkJCS5mb3JtYXRzID0gQ1M0Mkw3M19GT1JNQVRTLAogCQl9LAogCQkuY2FwdHVyZSA9IHsKIAkJCS5zdHJlYW1fbmFtZSA9ICJWU1AgQ2FwdHVyZSIsCiAJCQkuY2hhbm5lbHNfbWluID0gMSwKIAkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVzID0gQ1M0Mkw3M19SQVRFUywKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFX0tOT1QsCiAJCQkuZm9ybWF0cyA9IENTNDJMNzNfRk9STUFUUywKIAkJfSwKIAkJLm9wcyA9ICZjczQybDczX29wcywKQEAgLTEzNDgsMTcgKzEzNDUsOCBAQAogCiBzdGF0aWMgaW50IGNzNDJsNzNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCByZXQ7CiAJc3RydWN0IGNzNDJsNzNfcHJpdmF0ZSAqY3M0Mmw3MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGNzNDJsNzMtPnJlZ21hcDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCWNzNDJsNzNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIAogCS8qIFNldCBDaGFyZ2UgUHVtcCBGcmVxdWVuY3kgKi8KQEAgLTEzNzEsNyArMTM1OSw3IEBACiAJY3M0Mmw3My0+bWNsa3NlbCA9IENTNDJMNzNfQ0xLSURfTUNMSzE7CiAJY3M0Mmw3My0+bWNsayA9IDA7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGNzNDJsNzNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mnh4OC1pMmMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mnh4OC1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTdkY2UyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LWkyYy5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDaXJydXMgTG9naWMgQ1M0MjQ0OC9DUzQyODg4IEF1ZGlvIENPREVDIERBSSBJMkMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogQXV0aG9yOiBOaWNvbGluIENoZW4gPEd1YW5neXUuQ2hlbkBmcmVlc2NhbGUuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgImNzNDJ4eDguaCIKKworc3RhdGljIGludCBjczQyeHg4X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJdTMyIHJldCA9IGNzNDJ4eDhfcHJvYmUoJmkyYy0+ZGV2LAorCQkJZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCAmY3M0Mnh4OF9yZWdtYXBfY29uZmlnKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXBtX3J1bnRpbWVfZW5hYmxlKCZpMmMtPmRldik7CisJcG1fcmVxdWVzdF9pZGxlKCZpMmMtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjczQyeHg4X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2KTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoJmkyYy0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgY3M0Mnh4OF9pMmNfaWRbXSA9IHsKKwl7ImNzNDI0NDgiLCAoa2VybmVsX3Vsb25nX3QpJmNzNDI0NDhfZGF0YX0sCisJeyJjczQyODg4IiwgKGtlcm5lbF91bG9uZ190KSZjczQyODg4X2RhdGF9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGNzNDJ4eDhfaTJjX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGNzNDJ4eDhfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJjczQyeHg4IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5wbSA9ICZjczQyeHg4X3BtLAorCX0sCisJLnByb2JlID0gY3M0Mnh4OF9pMmNfcHJvYmUsCisJLnJlbW92ZSA9IGNzNDJ4eDhfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSBjczQyeHg4X2kyY19pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKGNzNDJ4eDhfaTJjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQ2lycnVzIExvZ2ljIENTNDI0NDgvQ1M0Mjg4OCBBTFNBIFNvQyBDb2RlYyBJMkMgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJ4eDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODIyOTlhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LmMKQEAgLTAsMCArMSw2MDIgQEAKKy8qCisgKiBDaXJydXMgTG9naWMgQ1M0MjQ0OC9DUzQyODg4IEF1ZGlvIENPREVDIERpZ2l0YWwgQXVkaW8gSW50ZXJmYWNlIChEQUkpIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIEF1dGhvcjogTmljb2xpbiBDaGVuIDxHdWFuZ3l1LkNoZW5AZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisKKyNpbmNsdWRlICJjczQyeHg4LmgiCisKKyNkZWZpbmUgQ1M0MlhYOF9OVU1fU1VQUExJRVMgNAorc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNzNDJ4eDhfc3VwcGx5X25hbWVzW0NTNDJYWDhfTlVNX1NVUFBMSUVTXSA9IHsKKwkiVkEiLAorCSJWRCIsCisJIlZMUyIsCisJIlZMQyIsCit9OworCisjZGVmaW5lIENTNDJYWDhfRk9STUFUUwkoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBcCisJCQkgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwgXAorCQkJIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgXAorCQkJIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQorCisvKiBjb2RlYyBwcml2YXRlIGRhdGEgKi8KK3N0cnVjdCBjczQyeHg4X3ByaXYgeworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzW0NTNDJYWDhfTlVNX1NVUFBMSUVTXTsKKwljb25zdCBzdHJ1Y3QgY3M0Mnh4OF9kcml2ZXJfZGF0YSAqZHJ2ZGF0YTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IGNsayAqY2xrOworCisJYm9vbCBzbGF2ZV9tb2RlOworCXVuc2lnbmVkIGxvbmcgc3lzY2xrOworfTsKKworLyogLTEyNy41ZEIgdG8gMGRCIHdpdGggc3RlcCBvZiAwLjVkQiAqLworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRhY190bHYsIC0xMjc1MCwgNTAsIDEpOworLyogLTY0ZEIgdG8gMjRkQiB3aXRoIHN0ZXAgb2YgMC41ZEIgKi8KK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZGNfdGx2LCAtNjQwMCwgNTAsIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY3M0Mnh4OF9hZGNfc2luZ2xlW10gPSB7ICJEaWZmZXJlbnRpYWwiLCAiU2luZ2xlLUVuZGVkIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNzNDJ4eDhfc3pjW10gPSB7ICJJbW1lZGlhdGUgQ2hhbmdlIiwgIlplcm8gQ3Jvc3MiLAorCQkJCQkiU29mdCBSYW1wIiwgIlNvZnQgUmFtcCBvbiBaZXJvIENyb3NzIiB9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkYzFfc2luZ2xlX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShDUzQyWFg4X0FEQ0NUTCwgNCwgMiwgY3M0Mnh4OF9hZGNfc2luZ2xlKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjMl9zaW5nbGVfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKENTNDJYWDhfQURDQ1RMLCAzLCAyLCBjczQyeHg4X2FkY19zaW5nbGUpOworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGMzX3NpbmdsZV9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoQ1M0MlhYOF9BRENDVEwsIDIsIDIsIGNzNDJ4eDhfYWRjX3NpbmdsZSk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19zemNfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKENTNDJYWDhfVFhDVEwsIDUsIDQsIGNzNDJ4eDhfc3pjKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjX3N6Y19lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoQ1M0MlhYOF9UWENUTCwgMCwgNCwgY3M0Mnh4OF9zemMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3M0Mnh4OF9zbmRfY29udHJvbHNbXSA9IHsKKwlTT0NfRE9VQkxFX1JfVExWKCJEQUMxIFBsYXliYWNrIFZvbHVtZSIsIENTNDJYWDhfVk9MQU9VVDEsCisJCQkgQ1M0MlhYOF9WT0xBT1VUMiwgMCwgMHhmZiwgMSwgZGFjX3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiREFDMiBQbGF5YmFjayBWb2x1bWUiLCBDUzQyWFg4X1ZPTEFPVVQzLAorCQkJIENTNDJYWDhfVk9MQU9VVDQsIDAsIDB4ZmYsIDEsIGRhY190bHYpLAorCVNPQ19ET1VCTEVfUl9UTFYoIkRBQzMgUGxheWJhY2sgVm9sdW1lIiwgQ1M0MlhYOF9WT0xBT1VUNSwKKwkJCSBDUzQyWFg4X1ZPTEFPVVQ2LCAwLCAweGZmLCAxLCBkYWNfdGx2KSwKKwlTT0NfRE9VQkxFX1JfVExWKCJEQUM0IFBsYXliYWNrIFZvbHVtZSIsIENTNDJYWDhfVk9MQU9VVDcsCisJCQkgQ1M0MlhYOF9WT0xBT1VUOCwgMCwgMHhmZiwgMSwgZGFjX3RsdiksCisJU09DX0RPVUJMRV9SX1NfVExWKCJBREMxIENhcHR1cmUgVm9sdW1lIiwgQ1M0MlhYOF9WT0xBSU4xLAorCQkJICAgQ1M0MlhYOF9WT0xBSU4yLCAwLCAtMHg4MCwgMHgzMCwgNywgMCwgYWRjX3RsdiksCisJU09DX0RPVUJMRV9SX1NfVExWKCJBREMyIENhcHR1cmUgVm9sdW1lIiwgQ1M0MlhYOF9WT0xBSU4zLAorCQkJICAgQ1M0MlhYOF9WT0xBSU40LCAwLCAtMHg4MCwgMHgzMCwgNywgMCwgYWRjX3RsdiksCisJU09DX0RPVUJMRSgiREFDMSBJbnZlcnQgU3dpdGNoIiwgQ1M0MlhYOF9EQUNJTlYsIDAsIDEsIDEsIDApLAorCVNPQ19ET1VCTEUoIkRBQzIgSW52ZXJ0IFN3aXRjaCIsIENTNDJYWDhfREFDSU5WLCAyLCAzLCAxLCAwKSwKKwlTT0NfRE9VQkxFKCJEQUMzIEludmVydCBTd2l0Y2giLCBDUzQyWFg4X0RBQ0lOViwgNCwgNSwgMSwgMCksCisJU09DX0RPVUJMRSgiREFDNCBJbnZlcnQgU3dpdGNoIiwgQ1M0MlhYOF9EQUNJTlYsIDYsIDcsIDEsIDApLAorCVNPQ19ET1VCTEUoIkFEQzEgSW52ZXJ0IFN3aXRjaCIsIENTNDJYWDhfQURDSU5WLCAwLCAxLCAxLCAwKSwKKwlTT0NfRE9VQkxFKCJBREMyIEludmVydCBTd2l0Y2giLCBDUzQyWFg4X0FEQ0lOViwgMiwgMywgMSwgMCksCisJU09DX1NJTkdMRSgiQURDIEhpZ2gtUGFzcyBGaWx0ZXIgU3dpdGNoIiwgQ1M0MlhYOF9BRENDVEwsIDcsIDEsIDEpLAorCVNPQ19TSU5HTEUoIkRBQyBEZS1lbXBoYXNpcyBTd2l0Y2giLCBDUzQyWFg4X0FEQ0NUTCwgNSwgMSwgMCksCisJU09DX0VOVU0oIkFEQzEgU2luZ2xlIEVuZGVkIE1vZGUgU3dpdGNoIiwgYWRjMV9zaW5nbGVfZW51bSksCisJU09DX0VOVU0oIkFEQzIgU2luZ2xlIEVuZGVkIE1vZGUgU3dpdGNoIiwgYWRjMl9zaW5nbGVfZW51bSksCisJU09DX1NJTkdMRSgiREFDIFNpbmdsZSBWb2x1bWUgQ29udHJvbCBTd2l0Y2giLCBDUzQyWFg4X1RYQ1RMLCA3LCAxLCAwKSwKKwlTT0NfRU5VTSgiREFDIFNvZnQgUmFtcCAmIFplcm8gQ3Jvc3MgQ29udHJvbCBTd2l0Y2giLCBkYWNfc3pjX2VudW0pLAorCVNPQ19TSU5HTEUoIkRBQyBBdXRvIE11dGUgU3dpdGNoIiwgQ1M0MlhYOF9UWENUTCwgNCwgMSwgMCksCisJU09DX1NJTkdMRSgiTXV0ZSBBREMgU2VyaWFsIFBvcnQgU3dpdGNoIiwgQ1M0MlhYOF9UWENUTCwgMywgMSwgMCksCisJU09DX1NJTkdMRSgiQURDIFNpbmdsZSBWb2x1bWUgQ29udHJvbCBTd2l0Y2giLCBDUzQyWFg4X1RYQ1RMLCAyLCAxLCAwKSwKKwlTT0NfRU5VTSgiQURDIFNvZnQgUmFtcCAmIFplcm8gQ3Jvc3MgQ29udHJvbCBTd2l0Y2giLCBhZGNfc3pjX2VudW0pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNzNDJ4eDhfYWRjM19zbmRfY29udHJvbHNbXSA9IHsKKwlTT0NfRE9VQkxFX1JfU19UTFYoIkFEQzMgQ2FwdHVyZSBWb2x1bWUiLCBDUzQyWFg4X1ZPTEFJTjUsCisJCQkgICBDUzQyWFg4X1ZPTEFJTjYsIDAsIC0weDgwLCAweDMwLCA3LCAwLCBhZGNfdGx2KSwKKwlTT0NfRE9VQkxFKCJBREMzIEludmVydCBTd2l0Y2giLCBDUzQyWFg4X0FEQ0lOViwgNCwgNSwgMSwgMCksCisJU09DX0VOVU0oIkFEQzMgU2luZ2xlIEVuZGVkIE1vZGUgU3dpdGNoIiwgYWRjM19zaW5nbGVfZW51bSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgY3M0Mnh4OF9kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fREFDKCJEQUMxIiwgIlBsYXliYWNrIiwgQ1M0MlhYOF9QV1JDVEwsIDEsIDEpLAorCVNORF9TT0NfREFQTV9EQUMoIkRBQzIiLCAiUGxheWJhY2siLCBDUzQyWFg4X1BXUkNUTCwgMiwgMSksCisJU05EX1NPQ19EQVBNX0RBQygiREFDMyIsICJQbGF5YmFjayIsIENTNDJYWDhfUFdSQ1RMLCAzLCAxKSwKKwlTTkRfU09DX0RBUE1fREFDKCJEQUM0IiwgIlBsYXliYWNrIiwgQ1M0MlhYOF9QV1JDVEwsIDQsIDEpLAorCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDFMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDFSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDJMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDJSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDNMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDNSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDRMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDRSIiksCisKKwlTTkRfU09DX0RBUE1fQURDKCJBREMxIiwgIkNhcHR1cmUiLCBDUzQyWFg4X1BXUkNUTCwgNSwgMSksCisJU05EX1NPQ19EQVBNX0FEQygiQURDMiIsICJDYXB0dXJlIiwgQ1M0MlhYOF9QV1JDVEwsIDYsIDEpLAorCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4xTCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQUlOMVIiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjJMIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4yUiIpLAorCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUFdSIiwgQ1M0MlhYOF9QV1JDVEwsIDAsIDEsIE5VTEwsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGNzNDJ4eDhfYWRjM19kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fQURDKCJBREMzIiwgIkNhcHR1cmUiLCBDUzQyWFg4X1BXUkNUTCwgNywgMSksCisKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjNMIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4zUiIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgY3M0Mnh4OF9kYXBtX3JvdXRlc1tdID0geworCS8qIFBsYXliYWNrICovCisJeyAiQU9VVDFMIiwgTlVMTCwgIkRBQzEiIH0sCisJeyAiQU9VVDFSIiwgTlVMTCwgIkRBQzEiIH0sCisJeyAiREFDMSIsIE5VTEwsICJQV1IiIH0sCisKKwl7ICJBT1VUMkwiLCBOVUxMLCAiREFDMiIgfSwKKwl7ICJBT1VUMlIiLCBOVUxMLCAiREFDMiIgfSwKKwl7ICJEQUMyIiwgTlVMTCwgIlBXUiIgfSwKKworCXsgIkFPVVQzTCIsIE5VTEwsICJEQUMzIiB9LAorCXsgIkFPVVQzUiIsIE5VTEwsICJEQUMzIiB9LAorCXsgIkRBQzMiLCBOVUxMLCAiUFdSIiB9LAorCisJeyAiQU9VVDRMIiwgTlVMTCwgIkRBQzQiIH0sCisJeyAiQU9VVDRSIiwgTlVMTCwgIkRBQzQiIH0sCisJeyAiREFDNCIsIE5VTEwsICJQV1IiIH0sCisKKwkvKiBDYXB0dXJlICovCisJeyAiQURDMSIsIE5VTEwsICJBSU4xTCIgfSwKKwl7ICJBREMxIiwgTlVMTCwgIkFJTjFSIiB9LAorCXsgIkFEQzEiLCBOVUxMLCAiUFdSIiB9LAorCisJeyAiQURDMiIsIE5VTEwsICJBSU4yTCIgfSwKKwl7ICJBREMyIiwgTlVMTCwgIkFJTjJSIiB9LAorCXsgIkFEQzIiLCBOVUxMLCAiUFdSIiB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgY3M0Mnh4OF9hZGMzX2RhcG1fcm91dGVzW10gPSB7CisJLyogQ2FwdHVyZSAqLworCXsgIkFEQzMiLCBOVUxMLCAiQUlOM0wiIH0sCisJeyAiQURDMyIsIE5VTEwsICJBSU4zUiIgfSwKKwl7ICJBREMzIiwgTlVMTCwgIlBXUiIgfSwKK307CisKK3N0cnVjdCBjczQyeHg4X3JhdGlvcyB7CisJdW5zaWduZWQgaW50IHJhdGlvOworCXVuc2lnbmVkIGNoYXIgc3BlZWQ7CisJdW5zaWduZWQgY2hhciBtY2xrOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjczQyeHg4X3JhdGlvcyBjczQyeHg4X3JhdGlvc1tdID0geworCXsgNjQsIENTNDJYWDhfRk1fUVVBRCwgQ1M0MlhYOF9GVU5DTU9EX01GUkVRXzI1Nig0KSB9LAorCXsgOTYsIENTNDJYWDhfRk1fUVVBRCwgQ1M0MlhYOF9GVU5DTU9EX01GUkVRXzM4NCg0KSB9LAorCXsgMTI4LCBDUzQyWFg4X0ZNX1FVQUQsIENTNDJYWDhfRlVOQ01PRF9NRlJFUV81MTIoNCkgfSwKKwl7IDE5MiwgQ1M0MlhYOF9GTV9RVUFELCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfNzY4KDQpIH0sCisJeyAyNTYsIENTNDJYWDhfRk1fU0lOR0xFLCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfMjU2KDEpIH0sCisJeyAzODQsIENTNDJYWDhfRk1fU0lOR0xFLCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfMzg0KDEpIH0sCisJeyA1MTIsIENTNDJYWDhfRk1fU0lOR0xFLCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfNTEyKDEpIH0sCisJeyA3NjgsIENTNDJYWDhfRk1fU0lOR0xFLCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfNzY4KDEpIH0sCisJeyAxMDI0LCBDUzQyWFg4X0ZNX1NJTkdMRSwgQ1M0MlhYOF9GVU5DTU9EX01GUkVRXzEwMjQoMSkgfQorfTsKKworc3RhdGljIGludCBjczQyeHg4X3NldF9kYWlfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLAorCQkJCSAgaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgY3M0Mnh4OF9wcml2ICpjczQyeHg4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwljczQyeHg4LT5zeXNjbGsgPSBmcmVxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3M0Mnh4OF9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZm9ybWF0KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJc3RydWN0IGNzNDJ4eDhfcHJpdiAqY3M0Mnh4OCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXUzMiB2YWw7CisKKwkvKiBTZXQgREFJIGZvcm1hdCAqLworCXN3aXRjaCAoZm9ybWF0ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJdmFsID0gQ1M0MlhYOF9JTlRGX0RBQ19ESUZfTEVGVEogfCBDUzQyWFg4X0lOVEZfQURDX0RJRl9MRUZUSjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCXZhbCA9IENTNDJYWDhfSU5URl9EQUNfRElGX0kyUyB8IENTNDJYWDhfSU5URl9BRENfRElGX0kyUzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQl2YWwgPSBDUzQyWFg4X0lOVEZfREFDX0RJRl9SSUdIVEogfCBDUzQyWFg4X0lOVEZfQURDX0RJRl9SSUdIVEo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgInVuc3VwcG9ydGVkIGRhaSBmb3JtYXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0Mnh4OC0+cmVnbWFwLCBDUzQyWFg4X0lOVEYsCisJCQkgICBDUzQyWFg4X0lOVEZfREFDX0RJRl9NQVNLIHwKKwkJCSAgIENTNDJYWDhfSU5URl9BRENfRElGX01BU0ssIHZhbCk7CisKKwkvKiBTZXQgbWFzdGVyL3NsYXZlIGF1ZGlvIGludGVyZmFjZSAqLworCXN3aXRjaCAoZm9ybWF0ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCWNzNDJ4eDgtPnNsYXZlX21vZGUgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWNzNDJ4eDgtPnNsYXZlX21vZGUgPSBmYWxzZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAidW5zdXBwb3J0ZWQgbWFzdGVyL3NsYXZlIG1vZGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjczQyeHg4X2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBjczQyeHg4X3ByaXYgKmNzNDJ4eDggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlib29sIHR4ID0gc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzsKKwl1MzIgcmF0aW8gPSBjczQyeHg4LT5zeXNjbGsgLyBwYXJhbXNfcmF0ZShwYXJhbXMpOworCXUzMiBpLCBmbSwgdmFsLCBtYXNrOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3M0Mnh4OF9yYXRpb3MpOyBpKyspIHsKKwkJaWYgKGNzNDJ4eDhfcmF0aW9zW2ldLnJhdGlvID09IHJhdGlvKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gQVJSQVlfU0laRShjczQyeHg4X3JhdGlvcykpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAidW5zdXBwb3J0ZWQgc3lzY2xrIHJhdGlvXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWFzayA9IENTNDJYWDhfRlVOQ01PRF9NRlJFUV9NQVNLOworCXZhbCA9IGNzNDJ4eDhfcmF0aW9zW2ldLm1jbGs7CisKKwlmbSA9IGNzNDJ4eDgtPnNsYXZlX21vZGUgPyBDUzQyWFg4X0ZNX0FVVE8gOiBjczQyeHg4X3JhdGlvc1tpXS5zcGVlZDsKKworCXJlZ21hcF91cGRhdGVfYml0cyhjczQyeHg4LT5yZWdtYXAsIENTNDJYWDhfRlVOQ01PRCwKKwkJCSAgIENTNDJYWDhfRlVOQ01PRF94Q19GTV9NQVNLKHR4KSB8IG1hc2ssCisJCQkgICBDUzQyWFg4X0ZVTkNNT0RfeENfRk0odHgsIGZtKSB8IHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjczQyeHg4X2RpZ2l0YWxfbXV0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IG11dGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgY3M0Mnh4OF9wcml2ICpjczQyeHg4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0Mnh4OC0+cmVnbWFwLCBDUzQyWFg4X0RBQ01VVEUsCisJCQkgICBDUzQyWFg4X0RBQ01VVEVfQUxMLCBtdXRlID8gQ1M0MlhYOF9EQUNNVVRFX0FMTCA6IDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIGNzNDJ4eDhfZGFpX29wcyA9IHsKKwkuc2V0X2ZtdAk9IGNzNDJ4eDhfc2V0X2RhaV9mbXQsCisJLnNldF9zeXNjbGsJPSBjczQyeHg4X3NldF9kYWlfc3lzY2xrLAorCS5od19wYXJhbXMJPSBjczQyeHg4X2h3X3BhcmFtcywKKwkuZGlnaXRhbF9tdXRlCT0gY3M0Mnh4OF9kaWdpdGFsX211dGUsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBjczQyeHg4X2RhaSA9IHsKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCS5mb3JtYXRzID0gQ1M0MlhYOF9GT1JNQVRTLAorCX0sCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwLAorCQkuZm9ybWF0cyA9IENTNDJYWDhfRk9STUFUUywKKwl9LAorCS5vcHMgPSAmY3M0Mnh4OF9kYWlfb3BzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCBjczQyeHg4X3JlZ1tdID0geworCXsgMHgwMSwgMHgwMSB9LCAgIC8qIENoaXAgSS5ELiBhbmQgUmV2aXNpb24gUmVnaXN0ZXIgKi8KKwl7IDB4MDIsIDB4MDAgfSwgICAvKiBQb3dlciBDb250cm9sICovCisJeyAweDAzLCAweEYwIH0sICAgLyogRnVuY3Rpb25hbCBNb2RlICovCisJeyAweDA0LCAweDQ2IH0sICAgLyogSW50ZXJmYWNlIEZvcm1hdHMgKi8KKwl7IDB4MDUsIDB4MDAgfSwgICAvKiBBREMgQ29udHJvbCAmIERBQyBEZS1FbXBoYXNpcyAqLworCXsgMHgwNiwgMHgxMCB9LCAgIC8qIFRyYW5zaXRpb24gQ29udHJvbCAqLworCXsgMHgwNywgMHgwMCB9LCAgIC8qIERBQyBDaGFubmVsIE11dGUgKi8KKwl7IDB4MDgsIDB4MDAgfSwgICAvKiBWb2x1bWUgQ29udHJvbCBBT1VUMSAqLworCXsgMHgwOSwgMHgwMCB9LCAgIC8qIFZvbHVtZSBDb250cm9sIEFPVVQyICovCisJeyAweDBhLCAweDAwIH0sICAgLyogVm9sdW1lIENvbnRyb2wgQU9VVDMgKi8KKwl7IDB4MGIsIDB4MDAgfSwgICAvKiBWb2x1bWUgQ29udHJvbCBBT1VUNCAqLworCXsgMHgwYywgMHgwMCB9LCAgIC8qIFZvbHVtZSBDb250cm9sIEFPVVQ1ICovCisJeyAweDBkLCAweDAwIH0sICAgLyogVm9sdW1lIENvbnRyb2wgQU9VVDYgKi8KKwl7IDB4MGUsIDB4MDAgfSwgICAvKiBWb2x1bWUgQ29udHJvbCBBT1VUNyAqLworCXsgMHgwZiwgMHgwMCB9LCAgIC8qIFZvbHVtZSBDb250cm9sIEFPVVQ4ICovCisJeyAweDEwLCAweDAwIH0sICAgLyogREFDIENoYW5uZWwgSW52ZXJ0ICovCisJeyAweDExLCAweDAwIH0sICAgLyogVm9sdW1lIENvbnRyb2wgQUlOMSAqLworCXsgMHgxMiwgMHgwMCB9LCAgIC8qIFZvbHVtZSBDb250cm9sIEFJTjIgKi8KKwl7IDB4MTMsIDB4MDAgfSwgICAvKiBWb2x1bWUgQ29udHJvbCBBSU4zICovCisJeyAweDE0LCAweDAwIH0sICAgLyogVm9sdW1lIENvbnRyb2wgQUlONCAqLworCXsgMHgxNSwgMHgwMCB9LCAgIC8qIFZvbHVtZSBDb250cm9sIEFJTjUgKi8KKwl7IDB4MTYsIDB4MDAgfSwgICAvKiBWb2x1bWUgQ29udHJvbCBBSU42ICovCisJeyAweDE3LCAweDAwIH0sICAgLyogQURDIENoYW5uZWwgSW52ZXJ0ICovCisJeyAweDE4LCAweDAwIH0sICAgLyogU3RhdHVzIENvbnRyb2wgKi8KKwl7IDB4MWEsIDB4MDAgfSwgICAvKiBTdGF0dXMgTWFzayAqLworCXsgMHgxYiwgMHgwMCB9LCAgIC8qIE1VVEVDIFBpbiBDb250cm9sICovCit9OworCitzdGF0aWMgYm9vbCBjczQyeHg4X3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgQ1M0MlhYOF9TVEFUVVM6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBib29sIGNzNDJ4eDhfd3JpdGVhYmxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgQ1M0MlhYOF9DSElQSUQ6CisJY2FzZSBDUzQyWFg4X1NUQVRVUzoKKwkJcmV0dXJuIGZhbHNlOworCWRlZmF1bHQ6CisJCXJldHVybiB0cnVlOworCX0KK30KKworY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgY3M0Mnh4OF9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKKworCS5tYXhfcmVnaXN0ZXIgPSBDUzQyWFg4X0xBU1RSRUcsCisJLnJlZ19kZWZhdWx0cyA9IGNzNDJ4eDhfcmVnLAorCS5udW1fcmVnX2RlZmF1bHRzID0gQVJSQVlfU0laRShjczQyeHg4X3JlZyksCisJLnZvbGF0aWxlX3JlZyA9IGNzNDJ4eDhfdm9sYXRpbGVfcmVnaXN0ZXIsCisJLndyaXRlYWJsZV9yZWcgPSBjczQyeHg4X3dyaXRlYWJsZV9yZWdpc3RlciwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChjczQyeHg4X3JlZ21hcF9jb25maWcpOworCitzdGF0aWMgaW50IGNzNDJ4eDhfY29kZWNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBjczQyeHg4X3ByaXYgKmNzNDJ4eDggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CisKKwlzd2l0Y2ggKGNzNDJ4eDgtPmRydmRhdGEtPm51bV9hZGNzKSB7CisJY2FzZSAzOgorCQlzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgY3M0Mnh4OF9hZGMzX3NuZF9jb250cm9scywKKwkJCQkJQVJSQVlfU0laRShjczQyeHg4X2FkYzNfc25kX2NvbnRyb2xzKSk7CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgY3M0Mnh4OF9hZGMzX2RhcG1fd2lkZ2V0cywKKwkJCQkJQVJSQVlfU0laRShjczQyeHg4X2FkYzNfZGFwbV93aWRnZXRzKSk7CisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGNzNDJ4eDhfYWRjM19kYXBtX3JvdXRlcywKKwkJCQkJQVJSQVlfU0laRShjczQyeHg4X2FkYzNfZGFwbV9yb3V0ZXMpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogTXV0ZSBhbGwgREFDIGNoYW5uZWxzICovCisJcmVnbWFwX3dyaXRlKGNzNDJ4eDgtPnJlZ21hcCwgQ1M0MlhYOF9EQUNNVVRFLCBDUzQyWFg4X0RBQ01VVEVfQUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIGNzNDJ4eDhfZHJpdmVyID0geworCS5wcm9iZSA9IGNzNDJ4eDhfY29kZWNfcHJvYmUsCisJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAorCisJLmNvbnRyb2xzID0gY3M0Mnh4OF9zbmRfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoY3M0Mnh4OF9zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSBjczQyeHg4X2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoY3M0Mnh4OF9kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGNzNDJ4eDhfZGFwbV9yb3V0ZXMsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoY3M0Mnh4OF9kYXBtX3JvdXRlcyksCit9OworCitjb25zdCBzdHJ1Y3QgY3M0Mnh4OF9kcml2ZXJfZGF0YSBjczQyNDQ4X2RhdGEgPSB7CisJLm5hbWUgPSAiY3M0MjQ0OCIsCisJLm51bV9hZGNzID0gMywKK307CitFWFBPUlRfU1lNQk9MX0dQTChjczQyNDQ4X2RhdGEpOworCitjb25zdCBzdHJ1Y3QgY3M0Mnh4OF9kcml2ZXJfZGF0YSBjczQyODg4X2RhdGEgPSB7CisJLm5hbWUgPSAiY3M0Mjg4OCIsCisJLm51bV9hZGNzID0gMiwKK307CitFWFBPUlRfU1lNQk9MX0dQTChjczQyODg4X2RhdGEpOworCitjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNzNDJ4eDhfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImNpcnJ1cyxjczQyNDQ4IiwgLmRhdGEgPSAmY3M0MjQ0OF9kYXRhLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiY2lycnVzLGNzNDI4ODgiLCAuZGF0YSA9ICZjczQyODg4X2RhdGEsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgY3M0Mnh4OF9vZl9tYXRjaCk7CitFWFBPUlRfU1lNQk9MX0dQTChjczQyeHg4X29mX21hdGNoKTsKKworaW50IGNzNDJ4eDhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCit7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2UoY3M0Mnh4OF9vZl9tYXRjaCwgZGV2KTsKKwlzdHJ1Y3QgY3M0Mnh4OF9wcml2ICpjczQyeHg4OworCWludCByZXQsIHZhbCwgaTsKKworCWNzNDJ4eDggPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmNzNDJ4eDgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY3M0Mnh4OCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGNzNDJ4eDgpOworCisJaWYgKG9mX2lkKQorCQljczQyeHg4LT5kcnZkYXRhID0gb2ZfaWQtPmRhdGE7CisKKwlpZiAoIWNzNDJ4eDgtPmRydmRhdGEpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZmluZCBkcml2ZXIgZGF0YVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNzNDJ4eDgtPmNsayA9IGRldm1fY2xrX2dldChkZXYsICJtY2xrIik7CisJaWYgKElTX0VSUihjczQyeHg4LT5jbGspKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCB0aGUgY2xvY2s6ICVsZFxuIiwKKwkJCQlQVFJfRVJSKGNzNDJ4eDgtPmNsaykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljczQyeHg4LT5zeXNjbGsgPSBjbGtfZ2V0X3JhdGUoY3M0Mnh4OC0+Y2xrKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNzNDJ4eDgtPnN1cHBsaWVzKTsgaSsrKQorCQljczQyeHg4LT5zdXBwbGllc1tpXS5zdXBwbHkgPSBjczQyeHg4X3N1cHBseV9uYW1lc1tpXTsKKworCXJldCA9IGRldm1fcmVndWxhdG9yX2J1bGtfZ2V0KGRldiwKKwkJCUFSUkFZX1NJWkUoY3M0Mnh4OC0+c3VwcGxpZXMpLCBjczQyeHg4LT5zdXBwbGllcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXF1ZXN0IHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRShjczQyeHg4LT5zdXBwbGllcyksCisJCQkJICAgIGNzNDJ4eDgtPnN1cHBsaWVzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBzdXBwbGllczogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogTWFrZSBzdXJlIGhhcmR3YXJlIHJlc2V0IGRvbmUgKi8KKwltc2xlZXAoNSk7CisKKwljczQyeHg4LT5yZWdtYXAgPSByZWdtYXA7CisJaWYgKElTX0VSUihjczQyeHg4LT5yZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIoY3M0Mnh4OC0+cmVnbWFwKTsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgcmVnbWFwOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZW5hYmxlOworCX0KKworCS8qCisJICogV2UgaGF2ZW4ndCBtYXJrZWQgdGhlIGNoaXAgcmV2aXNpb24gYXMgdm9sYXRpbGUgZHVlIHRvCisJICogc2hhcmluZyBhIHJlZ2lzdGVyIHdpdGggdGhlIHJpZ2h0IGlucHV0IHZvbHVtZTsgZXhwbGljaXRseQorCSAqIGJ5cGFzcyB0aGUgY2FjaGUgdG8gcmVhZCBpdC4KKwkgKi8KKwlyZWdjYWNoZV9jYWNoZV9ieXBhc3MoY3M0Mnh4OC0+cmVnbWFwLCB0cnVlKTsKKworCS8qIFZhbGlkYXRlIHRoZSBjaGlwIElEICovCisJcmVnbWFwX3JlYWQoY3M0Mnh4OC0+cmVnbWFwLCBDUzQyWFg4X0NISVBJRCwgJnZhbCk7CisJaWYgKHZhbCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGRldmljZSBJRDogJXgiLCB2YWwpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9lbmFibGU7CisJfQorCisJLyogVGhlIHRvcCBmb3VyIGJpdHMgb2YgdGhlIGNoaXAgSUQgc2hvdWxkIGJlIDAwMDAgKi8KKwlpZiAoKHZhbCAmIENTNDJYWDhfQ0hJUElEX0NISVBfSURfTUFTSykgIT0gMHgwMCkgeworCQlkZXZfZXJyKGRldiwgInVubWF0Y2hlZCBjaGlwIElEOiAlZFxuIiwKKwkJCQl2YWwgJiBDUzQyWFg4X0NISVBJRF9DSElQX0lEX01BU0spOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9lbmFibGU7CisJfQorCisJZGV2X2luZm8oZGV2LCAiZm91bmQgZGV2aWNlLCByZXZpc2lvbiAlWFxuIiwKKwkJCXZhbCAmIENTNDJYWDhfQ0hJUElEX1JFVl9JRF9NQVNLKTsKKworCXJlZ2NhY2hlX2NhY2hlX2J5cGFzcyhjczQyeHg4LT5yZWdtYXAsIGZhbHNlKTsKKworCWNzNDJ4eDhfZGFpLm5hbWUgPSBjczQyeHg4LT5kcnZkYXRhLT5uYW1lOworCisJLyogRWFjaCBhZGMgc3VwcG9ydHMgc3RlcmVvIGlucHV0ICovCisJY3M0Mnh4OF9kYWkuY2FwdHVyZS5jaGFubmVsc19tYXggPSBjczQyeHg4LT5kcnZkYXRhLT5udW1fYWRjcyAqIDI7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJmNzNDJ4eDhfZHJpdmVyLCAmY3M0Mnh4OF9kYWksIDEpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgY29kZWM6JWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2VuYWJsZTsKKwl9CisKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KGNzNDJ4eDgtPnJlZ21hcCwgdHJ1ZSk7CisKK2Vycl9lbmFibGU6CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGNzNDJ4eDgtPnN1cHBsaWVzKSwKKwkJCSAgICAgICBjczQyeHg4LT5zdXBwbGllcyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3M0Mnh4OF9wcm9iZSk7CisKKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQorc3RhdGljIGludCBjczQyeHg4X3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY3M0Mnh4OF9wcml2ICpjczQyeHg4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShjczQyeHg4LT5jbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIG1jbGs6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKGNzNDJ4eDgtPnN1cHBsaWVzKSwKKwkJCQkgICAgY3M0Mnh4OC0+c3VwcGxpZXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfY2xrOworCX0KKworCS8qIE1ha2Ugc3VyZSBoYXJkd2FyZSByZXNldCBkb25lICovCisJbXNsZWVwKDUpOworCisJcmVnY2FjaGVfY2FjaGVfb25seShjczQyeHg4LT5yZWdtYXAsIGZhbHNlKTsKKworCXJldCA9IHJlZ2NhY2hlX3N5bmMoY3M0Mnh4OC0+cmVnbWFwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHN5bmMgcmVnbWFwOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfYnVsazsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2J1bGs6CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGNzNDJ4eDgtPnN1cHBsaWVzKSwKKwkJCSAgICAgICBjczQyeHg4LT5zdXBwbGllcyk7CitlcnJfY2xrOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShjczQyeHg4LT5jbGspOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjczQyeHg4X3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNzNDJ4eDhfcHJpdiAqY3M0Mnh4OCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmVnY2FjaGVfY2FjaGVfb25seShjczQyeHg4LT5yZWdtYXAsIHRydWUpOworCisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGNzNDJ4eDgtPnN1cHBsaWVzKSwKKwkJCSAgICAgICBjczQyeHg4LT5zdXBwbGllcyk7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoY3M0Mnh4OC0+Y2xrKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK2NvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGNzNDJ4eDhfcG0gPSB7CisJU0VUX1JVTlRJTUVfUE1fT1BTKGNzNDJ4eDhfcnVudGltZV9zdXNwZW5kLCBjczQyeHg4X3J1bnRpbWVfcmVzdW1lLCBOVUxMKQorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNzNDJ4eDhfcG0pOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkNpcnJ1cyBMb2dpYyBDUzQyNDQ4L0NTNDI4ODggQUxTQSBTb0MgQ29kZWMgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LmggYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJ4eDguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTBiOTRhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LmgKQEAgLTAsMCArMSwyMzggQEAKKy8qCisgKiBjczQyeHg4LmggLSBDaXJydXMgTG9naWMgQ1M0MjQ0OC9DUzQyODg4IEF1ZGlvIENPREVDIGRyaXZlciBoZWFkZXIgZmlsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIEF1dGhvcjogTmljb2xpbiBDaGVuIDxHdWFuZ3l1LkNoZW5AZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpZm5kZWYgX0NTNDJYWDhfSAorI2RlZmluZSBfQ1M0MlhYOF9ICisKK3N0cnVjdCBjczQyeHg4X2RyaXZlcl9kYXRhIHsKKwljaGFyIG5hbWVbMzJdOworCWludCBudW1fYWRjczsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBjczQyeHg4X3BtOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjczQyeHg4X2RyaXZlcl9kYXRhIGNzNDI0NDhfZGF0YTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgY3M0Mnh4OF9kcml2ZXJfZGF0YSBjczQyODg4X2RhdGE7CitleHRlcm4gY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgY3M0Mnh4OF9yZWdtYXBfY29uZmlnOworaW50IGNzNDJ4eDhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApOworCisvKiBDUzQyODg4IHJlZ2lzdGVyIG1hcCAqLworI2RlZmluZSBDUzQyWFg4X0NISVBJRAkJCQkweDAxCS8qIENoaXAgSUQgKi8KKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVEwJCQkJMHgwMgkvKiBQb3dlciBDb250cm9sICovCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRAkJCQkweDAzCS8qIEZ1bmN0aW9uYWwgTW9kZSAqLworI2RlZmluZSBDUzQyWFg4X0lOVEYJCQkJMHgwNAkvKiBJbnRlcmZhY2UgRm9ybWF0cyAqLworI2RlZmluZSBDUzQyWFg4X0FEQ0NUTAkJCQkweDA1CS8qIEFEQyBDb250cm9sICovCisjZGVmaW5lIENTNDJYWDhfVFhDVEwJCQkJMHgwNgkvKiBUcmFuc2l0aW9uIENvbnRyb2wgKi8KKyNkZWZpbmUgQ1M0MlhYOF9EQUNNVVRFCQkJCTB4MDcJLyogREFDIE11dGUgQ29udHJvbCAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQxCQkJMHgwOAkvKiBWb2x1bWUgQ29udHJvbCBBT1VUMSAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQyCQkJMHgwOQkvKiBWb2x1bWUgQ29udHJvbCBBT1VUMiAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQzCQkJMHgwQQkvKiBWb2x1bWUgQ29udHJvbCBBT1VUMyAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQ0CQkJMHgwQgkvKiBWb2x1bWUgQ29udHJvbCBBT1VUNCAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQ1CQkJMHgwQwkvKiBWb2x1bWUgQ29udHJvbCBBT1VUNSAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQ2CQkJMHgwRAkvKiBWb2x1bWUgQ29udHJvbCBBT1VUNiAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQ3CQkJMHgwRQkvKiBWb2x1bWUgQ29udHJvbCBBT1VUNyAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQ4CQkJMHgwRgkvKiBWb2x1bWUgQ29udHJvbCBBT1VUOCAqLworI2RlZmluZSBDUzQyWFg4X0RBQ0lOVgkJCQkweDEwCS8qIERBQyBDaGFubmVsIEludmVydCAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFJTjEJCQkJMHgxMQkvKiBWb2x1bWUgQ29udHJvbCBBSU4xICovCisjZGVmaW5lIENTNDJYWDhfVk9MQUlOMgkJCQkweDEyCS8qIFZvbHVtZSBDb250cm9sIEFJTjIgKi8KKyNkZWZpbmUgQ1M0MlhYOF9WT0xBSU4zCQkJCTB4MTMJLyogVm9sdW1lIENvbnRyb2wgQUlOMyAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFJTjQJCQkJMHgxNAkvKiBWb2x1bWUgQ29udHJvbCBBSU40ICovCisjZGVmaW5lIENTNDJYWDhfVk9MQUlONQkJCQkweDE1CS8qIFZvbHVtZSBDb250cm9sIEFJTjUgKi8KKyNkZWZpbmUgQ1M0MlhYOF9WT0xBSU42CQkJCTB4MTYJLyogVm9sdW1lIENvbnRyb2wgQUlONiAqLworI2RlZmluZSBDUzQyWFg4X0FEQ0lOVgkJCQkweDE3CS8qIEFEQyBDaGFubmVsIEludmVydCAqLworI2RlZmluZSBDUzQyWFg4X1NUQVRVU0NUTAkJCTB4MTgJLyogU3RhdHVzIENvbnRyb2wgKi8KKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVMJCQkJMHgxOQkvKiBTdGF0dXMgKi8KKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNNCQkJCTB4MUEJLyogU3RhdHVzIE1hc2sgKi8KKyNkZWZpbmUgQ1M0MlhYOF9NVVRFQwkJCQkweDFCCS8qIE1VVEVDIFBpbiBDb250cm9sICovCisKKyNkZWZpbmUgQ1M0MlhYOF9GSVJTVFJFRwkJCUNTNDJYWDhfQ0hJUElECisjZGVmaW5lIENTNDJYWDhfTEFTVFJFRwkJCQlDUzQyWFg4X01VVEVDCisjZGVmaW5lIENTNDJYWDhfTlVNUkVHUwkJCQkoQ1M0MlhYOF9MQVNUUkVHIC0gQ1M0MlhYOF9GSVJTVFJFRyArIDEpCisjZGVmaW5lIENTNDJYWDhfSTJDX0lOQ1IJCQkweDgwCisKKy8qIENoaXAgSS5ELiBhbmQgUmV2aXNpb24gUmVnaXN0ZXIgKEFkZHJlc3MgMDFoKSAqLworI2RlZmluZSBDUzQyWFg4X0NISVBJRF9DSElQX0lEX01BU0sJCTB4RjAKKyNkZWZpbmUgQ1M0MlhYOF9DSElQSURfUkVWX0lEX01BU0sJCTB4MEYKKworLyogUG93ZXIgQ29udHJvbCAoQWRkcmVzcyAwMmgpICovCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9BREMzX1NISUZUCQk3CisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9BREMzX01BU0sJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9BREMzX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fQURDMwkJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9BREMzX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fQURDMl9TSElGVAkJNgorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fQURDMl9NQVNLCQkoMSA8PCBDUzQyWFg4X1BXUkNUTF9QRE5fQURDMl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX0FEQzIJCQkoMSA8PCBDUzQyWFg4X1BXUkNUTF9QRE5fQURDMl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX0FEQzFfU0hJRlQJCTUKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX0FEQzFfTUFTSwkJKDEgPDwgQ1M0MlhYOF9QV1JDVExfUEROX0FEQzFfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9BREMxCQkJKDEgPDwgQ1M0MlhYOF9QV1JDVExfUEROX0FEQzFfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9EQUM0X1NISUZUCQk0CisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9EQUM0X01BU0sJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9EQUM0X1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fREFDNAkJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9EQUM0X1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fREFDM19TSElGVAkJMworI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fREFDM19NQVNLCQkoMSA8PCBDUzQyWFg4X1BXUkNUTF9QRE5fREFDM19TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX0RBQzMJCQkoMSA8PCBDUzQyWFg4X1BXUkNUTF9QRE5fREFDM19TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX0RBQzJfU0hJRlQJCTIKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX0RBQzJfTUFTSwkJKDEgPDwgQ1M0MlhYOF9QV1JDVExfUEROX0RBQzJfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9EQUMyCQkJKDEgPDwgQ1M0MlhYOF9QV1JDVExfUEROX0RBQzJfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9EQUMxX1NISUZUCQkxCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9EQUMxX01BU0sJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9EQUMxX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fREFDMQkJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9EQUMxX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fU0hJRlQJCTAKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX01BU0sJCQkoMSA8PCBDUzQyWFg4X1BXUkNUTF9QRE5fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETgkJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9TSElGVCkKKworLyogRnVuY3Rpb25hbCBNb2RlIChBZGRyZXNzIDAzaCkgKi8KKyNkZWZpbmUgQ1M0MlhYOF9GVU5DTU9EX0RBQ19GTV9TSElGVAkJNgorI2RlZmluZSBDUzQyWFg4X0ZVTkNNT0RfREFDX0ZNX1dJRFRICQkyCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9EQUNfRk1fTUFTSwkJKCgoMSA8PCBDUzQyWFg4X0ZVTkNNT0RfREFDX0ZNX1dJRFRIKSAtIDEpIDw8IENTNDJYWDhfRlVOQ01PRF9EQUNfRk1fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9EQUNfRk0odikJCSgodikgPDwgQ1M0MlhYOF9GVU5DTU9EX0RBQ19GTV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9GVU5DTU9EX0FEQ19GTV9TSElGVAkJNAorI2RlZmluZSBDUzQyWFg4X0ZVTkNNT0RfQURDX0ZNX1dJRFRICQkyCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9BRENfRk1fTUFTSwkJKCgoMSA8PCBDUzQyWFg4X0ZVTkNNT0RfQURDX0ZNX1dJRFRIKSAtIDEpIDw8IENTNDJYWDhfRlVOQ01PRF9BRENfRk1fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9BRENfRk0odikJCSgodikgPDwgQ1M0MlhYOF9GVU5DTU9EX0FEQ19GTV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9GVU5DTU9EX3hDX0ZNX01BU0soeCkJCSgoeCkgPyBDUzQyWFg4X0ZVTkNNT0RfREFDX0ZNX01BU0sgOiBDUzQyWFg4X0ZVTkNNT0RfQURDX0ZNX01BU0spCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF94Q19GTSh4LCB2KQkJKCh4KSA/IENTNDJYWDhfRlVOQ01PRF9EQUNfRk0odikgOiBDUzQyWFg4X0ZVTkNNT0RfQURDX0ZNKHYpKQorI2RlZmluZSBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfU0hJRlQJCTEKKyNkZWZpbmUgQ1M0MlhYOF9GVU5DTU9EX01GUkVRX1dJRFRICQkzCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9NRlJFUV9NQVNLCQkoKCgxIDw8IENTNDJYWDhfRlVOQ01PRF9NRlJFUV9XSURUSCkgLSAxKSA8PCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9NRlJFUV8yNTYocykJCSgoMCA8PCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfU0hJRlQpID4+IChzID4+IDEpKQorI2RlZmluZSBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfMzg0KHMpCQkoKDEgPDwgQ1M0MlhYOF9GVU5DTU9EX01GUkVRX1NISUZUKSA+PiAocyA+PiAxKSkKKyNkZWZpbmUgQ1M0MlhYOF9GVU5DTU9EX01GUkVRXzUxMihzKQkJKCgyIDw8IENTNDJYWDhfRlVOQ01PRF9NRlJFUV9TSElGVCkgPj4gKHMgPj4gMSkpCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9NRlJFUV83NjgocykJCSgoMyA8PCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfU0hJRlQpID4+IChzID4+IDEpKQorI2RlZmluZSBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfMTAyNChzKQkJKCg0IDw8IENTNDJYWDhfRlVOQ01PRF9NRlJFUV9TSElGVCkgPj4gKHMgPj4gMSkpCisKKyNkZWZpbmUgQ1M0MlhYOF9GTV9TSU5HTEUJCQkwCisjZGVmaW5lIENTNDJYWDhfRk1fRE9VQkxFCQkJMQorI2RlZmluZSBDUzQyWFg4X0ZNX1FVQUQJCQkJMgorI2RlZmluZSBDUzQyWFg4X0ZNX0FVVE8JCQkJMworCisvKiBJbnRlcmZhY2UgRm9ybWF0cyAoQWRkcmVzcyAwNGgpICovCisjZGVmaW5lIENTNDJYWDhfSU5URl9GUkVFWkVfU0hJRlQJCTcKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0ZSRUVaRV9NQVNLCQkoMSA8PCBDUzQyWFg4X0lOVEZfRlJFRVpFX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0lOVEZfRlJFRVpFCQkJKDEgPDwgQ1M0MlhYOF9JTlRGX0ZSRUVaRV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0FVWF9ESUZfU0hJRlQJCTYKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0FVWF9ESUZfTUFTSwkJKDEgPDwgQ1M0MlhYOF9JTlRGX0FVWF9ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9BVVhfRElGCQkJKDEgPDwgQ1M0MlhYOF9JTlRGX0FVWF9ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9EQUNfRElGX1NISUZUCQkzCisjZGVmaW5lIENTNDJYWDhfSU5URl9EQUNfRElGX1dJRFRICQkzCisjZGVmaW5lIENTNDJYWDhfSU5URl9EQUNfRElGX01BU0sJCSgoKDEgPDwgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfV0lEVEgpIC0gMSkgPDwgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9EQUNfRElGX0xFRlRKCQkoMCA8PCBDUzQyWFg4X0lOVEZfREFDX0RJRl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfSTJTCQkoMSA8PCBDUzQyWFg4X0lOVEZfREFDX0RJRl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfUklHSFRKCQkoMiA8PCBDUzQyWFg4X0lOVEZfREFDX0RJRl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfUklHSFRKXzE2CQkoMyA8PCBDUzQyWFg4X0lOVEZfREFDX0RJRl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfT05FTElORV8yMAkJKDQgPDwgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9EQUNfRElGX09ORUxJTkVfMjQJCSg2IDw8IENTNDJYWDhfSU5URl9EQUNfRElGX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0lOVEZfREFDX0RJRl9URE0JCSg3IDw8IENTNDJYWDhfSU5URl9EQUNfRElGX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0lOVEZfQURDX0RJRl9TSElGVAkJMAorI2RlZmluZSBDUzQyWFg4X0lOVEZfQURDX0RJRl9XSURUSAkJMworI2RlZmluZSBDUzQyWFg4X0lOVEZfQURDX0RJRl9NQVNLCQkoKCgxIDw8IENTNDJYWDhfSU5URl9BRENfRElGX1dJRFRIKSAtIDEpIDw8IENTNDJYWDhfSU5URl9BRENfRElGX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0lOVEZfQURDX0RJRl9MRUZUSgkJKDAgPDwgQ1M0MlhYOF9JTlRGX0FEQ19ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9BRENfRElGX0kyUwkJKDEgPDwgQ1M0MlhYOF9JTlRGX0FEQ19ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9BRENfRElGX1JJR0hUSgkJKDIgPDwgQ1M0MlhYOF9JTlRGX0FEQ19ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9BRENfRElGX1JJR0hUSl8xNgkJKDMgPDwgQ1M0MlhYOF9JTlRGX0FEQ19ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9BRENfRElGX09ORUxJTkVfMjAJCSg0IDw8IENTNDJYWDhfSU5URl9BRENfRElGX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0lOVEZfQURDX0RJRl9PTkVMSU5FXzI0CQkoNiA8PCBDUzQyWFg4X0lOVEZfQURDX0RJRl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0FEQ19ESUZfVERNCQkoNyA8PCBDUzQyWFg4X0lOVEZfQURDX0RJRl9TSElGVCkKKworLyogQURDIENvbnRyb2wgJiBEQUMgRGUtRW1waGFzaXMgKEFkZHJlc3MgMDVoKSAqLworI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9BRENfSFBGX0ZSRUVaRV9TSElGVAk3CisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0FEQ19IUEZfRlJFRVpFX01BU0sJKDEgPDwgQ1M0MlhYOF9BRENDVExfQURDX0hQRl9GUkVFWkVfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0FEQ19IUEZfRlJFRVpFCQkoMSA8PCBDUzQyWFg4X0FEQ0NUTF9BRENfSFBGX0ZSRUVaRV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfREFDX0RFTV9TSElGVAkJNQorI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9EQUNfREVNX01BU0sJCSgxIDw8IENTNDJYWDhfQURDQ1RMX0RBQ19ERU1fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0RBQ19ERU0JCQkoMSA8PCBDUzQyWFg4X0FEQ0NUTF9EQUNfREVNX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9BREMxX1NJTkdMRV9TSElGVAk0CisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0FEQzFfU0lOR0xFX01BU0sJCSgxIDw8IENTNDJYWDhfQURDQ1RMX0FEQzFfU0lOR0xFX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9BREMxX1NJTkdMRQkJKDEgPDwgQ1M0MlhYOF9BRENDVExfQURDMV9TSU5HTEVfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0FEQzJfU0lOR0xFX1NISUZUCTMKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfQURDMl9TSU5HTEVfTUFTSwkJKDEgPDwgQ1M0MlhYOF9BRENDVExfQURDMl9TSU5HTEVfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0FEQzJfU0lOR0xFCQkoMSA8PCBDUzQyWFg4X0FEQ0NUTF9BREMyX1NJTkdMRV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfQURDM19TSU5HTEVfU0hJRlQJMgorI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9BREMzX1NJTkdMRV9NQVNLCQkoMSA8PCBDUzQyWFg4X0FEQ0NUTF9BREMzX1NJTkdMRV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfQURDM19TSU5HTEUJCSgxIDw8IENTNDJYWDhfQURDQ1RMX0FEQzNfU0lOR0xFX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9BSU41X01VWF9TSElGVAkJMQorI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9BSU41X01VWF9NQVNLCQkoMSA8PCBDUzQyWFg4X0FEQ0NUTF9BSU41X01VWF9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfQUlONV9NVVgJCQkoMSA8PCBDUzQyWFg4X0FEQ0NUTF9BSU41X01VWF9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfQUlONl9NVVhfU0hJRlQJCTAKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfQUlONl9NVVhfTUFTSwkJKDEgPDwgQ1M0MlhYOF9BRENDVExfQUlONl9NVVhfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0FJTjZfTVVYCQkJKDEgPDwgQ1M0MlhYOF9BRENDVExfQUlONl9NVVhfU0hJRlQpCisKKy8qIFRyYW5zaXRpb24gQ29udHJvbCAoQWRkcmVzcyAwNmgpICovCisjZGVmaW5lIENTNDJYWDhfVFhDVExfREFDX1NOR1ZPTF9TSElGVAkJNworI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0RBQ19TTkdWT0xfTUFTSwkJKDEgPDwgQ1M0MlhYOF9UWENUTF9EQUNfU05HVk9MX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0RBQ19TTkdWT0wJCSgxIDw8IENTNDJYWDhfVFhDVExfREFDX1NOR1ZPTF9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9EQUNfU1pDX1NISUZUCQk1CisjZGVmaW5lIENTNDJYWDhfVFhDVExfREFDX1NaQ19XSURUSAkJMgorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0RBQ19TWkNfTUFTSwkJKCgoMSA8PCBDUzQyWFg4X1RYQ1RMX0RBQ19TWkNfV0lEVEgpIC0gMSkgPDwgQ1M0MlhYOF9UWENUTF9EQUNfU1pDX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0RBQ19TWkNfSUMJCSgwIDw8IENTNDJYWDhfVFhDVExfREFDX1NaQ19TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9EQUNfU1pDX1pDCQkoMSA8PCBDUzQyWFg4X1RYQ1RMX0RBQ19TWkNfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfVFhDVExfREFDX1NaQ19TUgkJKDIgPDwgQ1M0MlhYOF9UWENUTF9EQUNfU1pDX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0RBQ19TWkNfU1JaQwkJKDMgPDwgQ1M0MlhYOF9UWENUTF9EQUNfU1pDX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0FNVVRFX1NISUZUCQk0CisjZGVmaW5lIENTNDJYWDhfVFhDVExfQU1VVEVfTUFTSwkJKDEgPDwgQ1M0MlhYOF9UWENUTF9BTVVURV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9BTVVURQkJCSgxIDw8IENTNDJYWDhfVFhDVExfQU1VVEVfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfVFhDVExfTVVURV9BRENfU1BfU0hJRlQJCTMKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9NVVRFX0FEQ19TUF9NQVNLCQkoMSA8PCBDUzQyWFg4X1RYQ1RMX01VVEVfQURDX1NQX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX01VVEVfQURDX1NQCQkoMSA8PCBDUzQyWFg4X1RYQ1RMX01VVEVfQURDX1NQX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0FEQ19TTkdWT0xfU0hJRlQJCTIKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9BRENfU05HVk9MX01BU0sJCSgxIDw8IENTNDJYWDhfVFhDVExfQURDX1NOR1ZPTF9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9BRENfU05HVk9MCQkoMSA8PCBDUzQyWFg4X1RYQ1RMX0FEQ19TTkdWT0xfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfVFhDVExfQURDX1NaQ19TSElGVAkJMAorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0FEQ19TWkNfTUFTSwkJKCgoMSA8PCBDUzQyWFg4X1RYQ1RMX0FEQ19TWkNfV0lEVEgpIC0gMSkgPDwgQ1M0MlhYOF9UWENUTF9BRENfU1pDX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0FEQ19TWkNfSUMJCSgwIDw8IENTNDJYWDhfVFhDVExfQURDX1NaQ19TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9BRENfU1pDX1pDCQkoMSA8PCBDUzQyWFg4X1RYQ1RMX0FEQ19TWkNfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfVFhDVExfQURDX1NaQ19TUgkJKDIgPDwgQ1M0MlhYOF9UWENUTF9BRENfU1pDX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0FEQ19TWkNfU1JaQwkJKDMgPDwgQ1M0MlhYOF9UWENUTF9BRENfU1pDX1NISUZUKQorCisvKiBEQUMgQ2hhbm5lbCBNdXRlIChBZGRyZXNzIDA3aCkgKi8KKyNkZWZpbmUgQ1M0MlhYOF9EQUNNVVRFX0FPVVQobikJCQkoMHgxIDw8IG4pCisjZGVmaW5lIENTNDJYWDhfREFDTVVURV9BTEwJCQkweGZmCisKKy8qIFN0YXR1cyBDb250cm9sIChBZGRyZXNzIDE4aCkqLworI2RlZmluZSBDUzQyWFg4X1NUQVRVU0NUTF9JTklfU0hJRlQJCTIKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNDVExfSU5JX1dJRFRICQkyCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTQ1RMX0lOSV9NQVNLCQkoKCgxIDw8IENTNDJYWDhfU1RBVFVTQ1RMX0lOSV9XSURUSCkgLSAxKSA8PCBDUzQyWFg4X1NUQVRVU0NUTF9JTklfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTQ1RMX0lOVF9BQ1RJVkVfSElHSAkoMCA8PCBDUzQyWFg4X1NUQVRVU0NUTF9JTklfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTQ1RMX0lOVF9BQ1RJVkVfTE9XCSgxIDw8IENTNDJYWDhfU1RBVFVTQ1RMX0lOSV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNDVExfSU5UX09QRU5fRFJBSU4JKDIgPDwgQ1M0MlhYOF9TVEFUVVNDVExfSU5JX1NISUZUKQorCisvKiBTdGF0dXMgKEFkZHJlc3MgMTloKSovCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0RBQ19DTEtfRVJSX1NISUZUCTQKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfREFDX0NMS19FUlJfTUFTSwkJKDEgPDwgQ1M0MlhYOF9TVEFUVVNfREFDX0NMS19FUlJfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0FEQ19DTEtfRVJSX1NISUZUCTMKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDX0NMS19FUlJfTUFTSwkJKDEgPDwgQ1M0MlhYOF9TVEFUVVNfQURDX0NMS19FUlJfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0FEQzNfT1ZGTF9TSElGVAkJMgorI2RlZmluZSBDUzQyWFg4X1NUQVRVU19BREMzX09WRkxfTUFTSwkJKDEgPDwgQ1M0MlhYOF9TVEFUVVNfQURDM19PVkZMX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1NUQVRVU19BREMyX09WRkxfU0hJRlQJCTEKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDMl9PVkZMX01BU0sJCSgxIDw8IENTNDJYWDhfU1RBVFVTX0FEQzJfT1ZGTF9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDMV9PVkZMX1NISUZUCQkwCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0FEQzFfT1ZGTF9NQVNLCQkoMSA8PCBDUzQyWFg4X1NUQVRVU19BREMxX09WRkxfU0hJRlQpCisKKy8qIFN0YXR1cyBNYXNrIChBZGRyZXNzIDFBaCkgKi8KKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfREFDX0NMS19FUlJfTV9TSElGVAk0CisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0RBQ19DTEtfRVJSX01fTUFTSwkoMSA8PCBDUzQyWFg4X1NUQVRVU19EQUNfQ0xLX0VSUl9NX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1NUQVRVU19BRENfQ0xLX0VSUl9NX1NISUZUCTMKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDX0NMS19FUlJfTV9NQVNLCSgxIDw8IENTNDJYWDhfU1RBVFVTX0FEQ19DTEtfRVJSX01fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0FEQzNfT1ZGTF9NX1NISUZUCTIKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDM19PVkZMX01fTUFTSwkJKDEgPDwgQ1M0MlhYOF9TVEFUVVNfQURDM19PVkZMX01fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0FEQzJfT1ZGTF9NX1NISUZUCTEKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDMl9PVkZMX01fTUFTSwkJKDEgPDwgQ1M0MlhYOF9TVEFUVVNfQURDMl9PVkZMX01fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0FEQzFfT1ZGTF9NX1NISUZUCTAKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDMV9PVkZMX01fTUFTSwkJKDEgPDwgQ1M0MlhYOF9TVEFUVVNfQURDMV9PVkZMX01fU0hJRlQpCisKKy8qIE1VVEVDIFBpbiBDb250cm9sIChBZGRyZXNzIDFCaCkgKi8KKyNkZWZpbmUgQ1M0MlhYOF9NVVRFQ19NQ1BPTEFSSVRZX1NISUZUCQkxCisjZGVmaW5lIENTNDJYWDhfTVVURUNfTUNQT0xBUklUWV9NQVNLCQkoMSA8PCBDUzQyWFg4X01VVEVDX01DUE9MQVJJVFlfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfTVVURUNfTUNQT0xBUklUWV9BQ1RJVkVfTE9XCSgwIDw8IENTNDJYWDhfTVVURUNfTUNQT0xBUklUWV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9NVVRFQ19NQ1BPTEFSSVRZX0FDVElWRV9ISUdICSgxIDw8IENTNDJYWDhfTVVURUNfTUNQT0xBUklUWV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9NVVRFQ19NVVRFQ19BQ1RJVkVfU0hJRlQJMAorI2RlZmluZSBDUzQyWFg4X01VVEVDX01VVEVDX0FDVElWRV9NQVNLCQkoMSA8PCBDUzQyWFg4X01VVEVDX01VVEVDX0FDVElWRV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9NVVRFQ19NVVRFQ19BQ1RJVkUJCSgxIDw8IENTNDJYWDhfTVVURUNfTVVURUNfQUNUSVZFX1NISUZUKQorI2VuZGlmIC8qIF9DUzQyWFg4X0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEwLmMgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMC5jCmluZGV4IGU2MmUyOTQuLjEzN2U4ZWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTAuYwpAQCAtMzA3LDI5ICszMDcsMjkgQEAKIAkiRnMvODE5MipwaSIsICJGcy80MDk2KnBpIiwgIkZzLzIwNDgqcGkiLCAiRnMvMTAyNCpwaSIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEwX2RhY19ocGZfY3V0b2ZmID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MjEwX0RBQ19IUEYsIDAsIDQsIGRhNzIxMF9ocGZfY3V0b2ZmX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEwX2RhY19ocGZfY3V0b2ZmLAorCQkJICAgIERBNzIxMF9EQUNfSFBGLCAwLCBkYTcyMTBfaHBmX2N1dG9mZl90eHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxMF9hZGNfaHBmX2N1dG9mZiA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxMF9BRENfSFBGLCAwLCA0LCBkYTcyMTBfaHBmX2N1dG9mZl90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxMF9hZGNfaHBmX2N1dG9mZiwKKwkJCSAgICBEQTcyMTBfQURDX0hQRiwgMCwgZGE3MjEwX2hwZl9jdXRvZmZfdHh0KTsKIAogLyogQURDIGFuZCBEQUMgdm9pY2UgKDhrSHopIGhpZ2ggcGFzcyBjdXRvZmYgdmFsdWUgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE3MjEwX3ZmX2N1dG9mZl90eHRbXSA9IHsKIAkiMi41SHoiLCAiMjVIeiIsICI1MEh6IiwgIjEwMEh6IiwgIjE1MEh6IiwgIjIwMEh6IiwgIjMwMEh6IiwgIjQwMEh6IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTBfZGFjX3ZmX2N1dG9mZiA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxMF9EQUNfSFBGLCA0LCA4LCBkYTcyMTBfdmZfY3V0b2ZmX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEwX2RhY192Zl9jdXRvZmYsCisJCQkgICAgREE3MjEwX0RBQ19IUEYsIDQsIGRhNzIxMF92Zl9jdXRvZmZfdHh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTBfYWRjX3ZmX2N1dG9mZiA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxMF9BRENfSFBGLCA0LCA4LCBkYTcyMTBfdmZfY3V0b2ZmX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEwX2FkY192Zl9jdXRvZmYsCisJCQkgICAgREE3MjEwX0FEQ19IUEYsIDQsIGRhNzIxMF92Zl9jdXRvZmZfdHh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRhNzIxMF9ocF9tb2RlX3R4dFtdID0gewogCSJDbGFzcyBIIiwgIkNsYXNzIEciCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxMF9ocF9tb2RlX3NlbCA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxMF9IUF9DRkcsIDAsIDIsIGRhNzIxMF9ocF9tb2RlX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEwX2hwX21vZGVfc2VsLAorCQkJICAgIERBNzIxMF9IUF9DRkcsIDAsIGRhNzIxMF9ocF9tb2RlX3R4dCk7CiAKIC8qIEFMQyBjYW4gYmUgZW5hYmxlZCBvbmx5IGlmIG5vaXNlIHN1cHByZXNzaW9uIGlzIGRpc2FibGVkICovCiBzdGF0aWMgaW50IGRhNzIxMF9wdXRfYWxjX3N3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLApAQCAtMTA3MSwxNyArMTA3MSw5IEBACiBzdGF0aWMgaW50IGRhNzIxMF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGRhNzIxMF9wcml2ICpkYTcyMTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwogCiAJZGV2X2luZm8oY29kZWMtPmRldiwgIkRBNzIxMCBBdWRpbyBDb2RlYyAlc1xuIiwgREE3MjEwX1ZFUlNJT04pOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRhNzIxMC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCWRhNzIxMC0+bWNsa19yYXRlICAgICAgID0gMDsgICAgLyogVGhpcyB3aWxsIGJlIHNldCBmcm9tIHNldF9zeXNjbGsoKSAqLwogCWRhNzIxMC0+bWFzdGVyICAgICAgICAgID0gMDsgICAgLyogVGhpcyB3aWxsIGJlIHNldCBmcm9tIHNldF9mbXQoKSAqLwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMy5jIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTMuYwppbmRleCAwYzc3ZTdhLi43MzhmYTE4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEzLmMKQEAgLTYzLDMwICs2MywzMCBAQAogCSIyLjVIeiIsICIyNUh6IiwgIjUwSHoiLCAiMTAwSHoiLCAiMTUwSHoiLCAiMjAwSHoiLCAiMzAwSHoiLCAiNDAwSHoiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxM19kYWNfdm9pY2VfaHBmX2Nvcm5lciA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19EQUNfRklMVEVSUzEsIERBNzIxM19WT0lDRV9IUEZfQ09STkVSX1NISUZULAotCQkJREE3MjEzX1ZPSUNFX0hQRl9DT1JORVJfTUFYLAotCQkJZGE3MjEzX3ZvaWNlX2hwZl9jb3JuZXJfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfZGFjX3ZvaWNlX2hwZl9jb3JuZXIsCisJCQkgICAgREE3MjEzX0RBQ19GSUxURVJTMSwKKwkJCSAgICBEQTcyMTNfVk9JQ0VfSFBGX0NPUk5FUl9TSElGVCwKKwkJCSAgICBkYTcyMTNfdm9pY2VfaHBmX2Nvcm5lcl90eHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxM19hZGNfdm9pY2VfaHBmX2Nvcm5lciA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19BRENfRklMVEVSUzEsIERBNzIxM19WT0lDRV9IUEZfQ09STkVSX1NISUZULAotCQkJREE3MjEzX1ZPSUNFX0hQRl9DT1JORVJfTUFYLAotCQkJZGE3MjEzX3ZvaWNlX2hwZl9jb3JuZXJfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfYWRjX3ZvaWNlX2hwZl9jb3JuZXIsCisJCQkgICAgREE3MjEzX0FEQ19GSUxURVJTMSwKKwkJCSAgICBEQTcyMTNfVk9JQ0VfSFBGX0NPUk5FUl9TSElGVCwKKwkJCSAgICBkYTcyMTNfdm9pY2VfaHBmX2Nvcm5lcl90eHQpOwogCiAvKiBBREMgYW5kIERBQyBoaWdoIHBhc3MgZmlsdGVyIGN1dG9mZiB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTcyMTNfYXVkaW9faHBmX2Nvcm5lcl90eHRbXSA9IHsKIAkiRnMvMjQwMDAiLCAiRnMvMTIwMDAiLCAiRnMvNjAwMCIsICJGcy8zMDAwIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTNfZGFjX2F1ZGlvX2hwZl9jb3JuZXIgPQotCVNPQ19FTlVNX1NJTkdMRShEQTcyMTNfREFDX0ZJTFRFUlMxLCBEQTcyMTNfQVVESU9fSFBGX0NPUk5FUl9TSElGVCwKLQkJCURBNzIxM19BVURJT19IUEZfQ09STkVSX01BWCwKLQkJCWRhNzIxM19hdWRpb19ocGZfY29ybmVyX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEzX2RhY19hdWRpb19ocGZfY29ybmVyLAorCQkJICAgIERBNzIxM19EQUNfRklMVEVSUzEKKwkJCSAgICAsIERBNzIxM19BVURJT19IUEZfQ09STkVSX1NISUZULAorCQkJICAgIGRhNzIxM19hdWRpb19ocGZfY29ybmVyX3R4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2FkY19hdWRpb19ocGZfY29ybmVyID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MjEzX0FEQ19GSUxURVJTMSwgREE3MjEzX0FVRElPX0hQRl9DT1JORVJfU0hJRlQsCi0JCQlEQTcyMTNfQVVESU9fSFBGX0NPUk5FUl9NQVgsCi0JCQlkYTcyMTNfYXVkaW9faHBmX2Nvcm5lcl90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19hZGNfYXVkaW9faHBmX2Nvcm5lciwKKwkJCSAgICBEQTcyMTNfQURDX0ZJTFRFUlMxLAorCQkJICAgIERBNzIxM19BVURJT19IUEZfQ09STkVSX1NISUZULAorCQkJICAgIGRhNzIxM19hdWRpb19ocGZfY29ybmVyX3R4dCk7CiAKIC8qIEdhaW4gcmFtcGluZyByYXRlIHZhbHVlICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhNzIxM19nYWluX3JhbXBfcmF0ZV90eHRbXSA9IHsKQEAgLTk0LDUyICs5NCw1MCBAQAogCSJub21pbmFsIHJhdGUgLyAzMiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2dhaW5fcmFtcF9yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MjEzX0dBSU5fUkFNUF9DVFJMLCBEQTcyMTNfR0FJTl9SQU1QX1JBVEVfU0hJRlQsCi0JCQlEQTcyMTNfR0FJTl9SQU1QX1JBVEVfTUFYLCBkYTcyMTNfZ2Fpbl9yYW1wX3JhdGVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfZ2Fpbl9yYW1wX3JhdGUsCisJCQkgICAgREE3MjEzX0dBSU5fUkFNUF9DVFJMLAorCQkJICAgIERBNzIxM19HQUlOX1JBTVBfUkFURV9TSElGVCwKKwkJCSAgICBkYTcyMTNfZ2Fpbl9yYW1wX3JhdGVfdHh0KTsKIAogLyogREFDIG5vaXNlIGdhdGUgc2V0dXAgdGltZSB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTcyMTNfZGFjX25nX3NldHVwX3RpbWVfdHh0W10gPSB7CiAJIjI1NiBzYW1wbGVzIiwgIjUxMiBzYW1wbGVzIiwgIjEwMjQgc2FtcGxlcyIsICIyMDQ4IHNhbXBsZXMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxM19kYWNfbmdfc2V0dXBfdGltZSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19EQUNfTkdfU0VUVVBfVElNRSwKLQkJCURBNzIxM19EQUNfTkdfU0VUVVBfVElNRV9TSElGVCwKLQkJCURBNzIxM19EQUNfTkdfU0VUVVBfVElNRV9NQVgsCi0JCQlkYTcyMTNfZGFjX25nX3NldHVwX3RpbWVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfZGFjX25nX3NldHVwX3RpbWUsCisJCQkgICAgREE3MjEzX0RBQ19OR19TRVRVUF9USU1FLAorCQkJICAgIERBNzIxM19EQUNfTkdfU0VUVVBfVElNRV9TSElGVCwKKwkJCSAgICBkYTcyMTNfZGFjX25nX3NldHVwX3RpbWVfdHh0KTsKIAogLyogREFDIG5vaXNlIGdhdGUgcmFtcHVwIHJhdGUgdmFsdWUgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE3MjEzX2RhY19uZ19yYW1wdXBfdHh0W10gPSB7CiAJIjAuMDIgbXMvZEIiLCAiMC4xNiBtcy9kQiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2RhY19uZ19yYW1wdXBfcmF0ZSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19EQUNfTkdfU0VUVVBfVElNRSwKLQkJCURBNzIxM19EQUNfTkdfUkFNUFVQX1JBVEVfU0hJRlQsCi0JCQlEQTcyMTNfREFDX05HX1JBTVBfUkFURV9NQVgsCi0JCQlkYTcyMTNfZGFjX25nX3JhbXB1cF90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19kYWNfbmdfcmFtcHVwX3JhdGUsCisJCQkgICAgREE3MjEzX0RBQ19OR19TRVRVUF9USU1FLAorCQkJICAgIERBNzIxM19EQUNfTkdfUkFNUFVQX1JBVEVfU0hJRlQsCisJCQkgICAgZGE3MjEzX2RhY19uZ19yYW1wdXBfdHh0KTsKIAogLyogREFDIG5vaXNlIGdhdGUgcmFtcGRvd24gcmF0ZSB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTcyMTNfZGFjX25nX3JhbXBkb3duX3R4dFtdID0gewogCSIwLjY0IG1zL2RCIiwgIjIwLjQ4IG1zL2RCIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTNfZGFjX25nX3JhbXBkb3duX3JhdGUgPQotCVNPQ19FTlVNX1NJTkdMRShEQTcyMTNfREFDX05HX1NFVFVQX1RJTUUsCi0JCQlEQTcyMTNfREFDX05HX1JBTVBETl9SQVRFX1NISUZULAotCQkJREE3MjEzX0RBQ19OR19SQU1QX1JBVEVfTUFYLAotCQkJZGE3MjEzX2RhY19uZ19yYW1wZG93bl90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19kYWNfbmdfcmFtcGRvd25fcmF0ZSwKKwkJCSAgICBEQTcyMTNfREFDX05HX1NFVFVQX1RJTUUsCisJCQkgICAgREE3MjEzX0RBQ19OR19SQU1QRE5fUkFURV9TSElGVCwKKwkJCSAgICBkYTcyMTNfZGFjX25nX3JhbXBkb3duX3R4dCk7CiAKIC8qIERBQyBzb2Z0IG11dGUgcmF0ZSB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTcyMTNfZGFjX3NvZnRfbXV0ZV9yYXRlX3R4dFtdID0gewogCSIxIiwgIjIiLCAiNCIsICI4IiwgIjE2IiwgIjMyIiwgIjY0IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTNfZGFjX3NvZnRfbXV0ZV9yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MjEzX0RBQ19GSUxURVJTNSwgREE3MjEzX0RBQ19TT0ZUTVVURV9SQVRFX1NISUZULAotCQkJREE3MjEzX0RBQ19TT0ZUTVVURV9SQVRFX01BWCwKLQkJCWRhNzIxM19kYWNfc29mdF9tdXRlX3JhdGVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfZGFjX3NvZnRfbXV0ZV9yYXRlLAorCQkJICAgIERBNzIxM19EQUNfRklMVEVSUzUsCisJCQkgICAgREE3MjEzX0RBQ19TT0ZUTVVURV9SQVRFX1NISUZULAorCQkJICAgIGRhNzIxM19kYWNfc29mdF9tdXRlX3JhdGVfdHh0KTsKIAogLyogQUxDIEF0dGFjayBSYXRlIHNlbGVjdCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTcyMTNfYWxjX2F0dGFja19yYXRlX3R4dFtdID0gewpAQCAtMTQ3LDkgKzE0NSwxMCBAQAogCSI1NjMyL2ZzIiwgIjExMjY0L2ZzIiwgIjIyNTI4L2ZzIiwgIjQ1MDU2L2ZzIiwgIjkwMTEyL2ZzIiwgIjE4MDIyNC9mcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2FsY19hdHRhY2tfcmF0ZSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19BTENfQ1RSTDIsIERBNzIxM19BTENfQVRUQUNLX1NISUZULAotCQkJREE3MjEzX0FMQ19BVFRBQ0tfTUFYLCBkYTcyMTNfYWxjX2F0dGFja19yYXRlX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEzX2FsY19hdHRhY2tfcmF0ZSwKKwkJCSAgICBEQTcyMTNfQUxDX0NUUkwyLAorCQkJICAgIERBNzIxM19BTENfQVRUQUNLX1NISUZULAorCQkJICAgIGRhNzIxM19hbGNfYXR0YWNrX3JhdGVfdHh0KTsKIAogLyogQUxDIFJlbGVhc2UgUmF0ZSBzZWxlY3QgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE3MjEzX2FsY19yZWxlYXNlX3JhdGVfdHh0W10gPSB7CkBAIC0xNTcsOSArMTU2LDEwIEBACiAJIjExMjY0L2ZzIiwgIjIyNTI4L2ZzIiwgIjQ1MDU2L2ZzIiwgIjkwMTEyL2ZzIiwgIjE4MDIyNC9mcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2FsY19yZWxlYXNlX3JhdGUgPQotCVNPQ19FTlVNX1NJTkdMRShEQTcyMTNfQUxDX0NUUkwyLCBEQTcyMTNfQUxDX1JFTEVBU0VfU0hJRlQsCi0JCQlEQTcyMTNfQUxDX1JFTEVBU0VfTUFYLCBkYTcyMTNfYWxjX3JlbGVhc2VfcmF0ZV90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19hbGNfcmVsZWFzZV9yYXRlLAorCQkJICAgIERBNzIxM19BTENfQ1RSTDIsCisJCQkgICAgREE3MjEzX0FMQ19SRUxFQVNFX1NISUZULAorCQkJICAgIGRhNzIxM19hbGNfcmVsZWFzZV9yYXRlX3R4dCk7CiAKIC8qIEFMQyBIb2xkIFRpbWUgc2VsZWN0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhNzIxM19hbGNfaG9sZF90aW1lX3R4dFtdID0gewpAQCAtMTY4LDIyICsxNjgsMjUgQEAKIAkiMjUzOTUyL2ZzIiwgIjUwNzkwNC9mcyIsICIxMDE1ODA4L2ZzIiwgIjIwMzE2MTYvZnMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxM19hbGNfaG9sZF90aW1lID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MjEzX0FMQ19DVFJMMywgREE3MjEzX0FMQ19IT0xEX1NISUZULAotCQkJREE3MjEzX0FMQ19IT0xEX01BWCwgZGE3MjEzX2FsY19ob2xkX3RpbWVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfYWxjX2hvbGRfdGltZSwKKwkJCSAgICBEQTcyMTNfQUxDX0NUUkwzLAorCQkJICAgIERBNzIxM19BTENfSE9MRF9TSElGVCwKKwkJCSAgICBkYTcyMTNfYWxjX2hvbGRfdGltZV90eHQpOwogCiAvKiBBTEMgSW5wdXQgU2lnbmFsIFRyYWNraW5nIHJhdGUgc2VsZWN0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhNzIxM19hbGNfaW50ZWdfcmF0ZV90eHRbXSA9IHsKIAkiMS80IiwgIjEvMTYiLCAiMS8yNTYiLCAiMS82NTUzNiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2FsY19pbnRlZ19hdHRhY2tfcmF0ZSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19BTENfQ1RSTDMsIERBNzIxM19BTENfSU5URUdfQVRUQUNLX1NISUZULAotCQkJREE3MjEzX0FMQ19JTlRFR19NQVgsIGRhNzIxM19hbGNfaW50ZWdfcmF0ZV90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19hbGNfaW50ZWdfYXR0YWNrX3JhdGUsCisJCQkgICAgREE3MjEzX0FMQ19DVFJMMywKKwkJCSAgICBEQTcyMTNfQUxDX0lOVEVHX0FUVEFDS19TSElGVCwKKwkJCSAgICBkYTcyMTNfYWxjX2ludGVnX3JhdGVfdHh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTNfYWxjX2ludGVnX3JlbGVhc2VfcmF0ZSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19BTENfQ1RSTDMsIERBNzIxM19BTENfSU5URUdfUkVMRUFTRV9TSElGVCwKLQkJCURBNzIxM19BTENfSU5URUdfTUFYLCBkYTcyMTNfYWxjX2ludGVnX3JhdGVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfYWxjX2ludGVnX3JlbGVhc2VfcmF0ZSwKKwkJCSAgICBEQTcyMTNfQUxDX0NUUkwzLAorCQkJICAgIERBNzIxM19BTENfSU5URUdfUkVMRUFTRV9TSElGVCwKKwkJCSAgICBkYTcyMTNfYWxjX2ludGVnX3JhdGVfdHh0KTsKIAogCiAvKgpAQCAtNTg0LDE1ICs1ODcsMTcgQEAKIAkiRGlmZmVyZW50aWFsIiwgIk1JQ19QIiwgIk1JQ19OIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTNfbWljXzFfYW1wX2luX3NlbCA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19NSUNfMV9DVFJMLCBEQTcyMTNfTUlDX0FNUF9JTl9TRUxfU0hJRlQsCi0JCQlEQTcyMTNfTUlDX0FNUF9JTl9TRUxfTUFYLCBkYTcyMTNfbWljX2FtcF9pbl9zZWxfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfbWljXzFfYW1wX2luX3NlbCwKKwkJCSAgICBEQTcyMTNfTUlDXzFfQ1RSTCwKKwkJCSAgICBEQTcyMTNfTUlDX0FNUF9JTl9TRUxfU0hJRlQsCisJCQkgICAgZGE3MjEzX21pY19hbXBfaW5fc2VsX3R4dCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGE3MjEzX21pY18xX2FtcF9pbl9zZWxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJNaWMgMSBBbXAgU291cmNlIE1VWCIsIGRhNzIxM19taWNfMV9hbXBfaW5fc2VsKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTNfbWljXzJfYW1wX2luX3NlbCA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19NSUNfMl9DVFJMLCBEQTcyMTNfTUlDX0FNUF9JTl9TRUxfU0hJRlQsCi0JCQlEQTcyMTNfTUlDX0FNUF9JTl9TRUxfTUFYLCBkYTcyMTNfbWljX2FtcF9pbl9zZWxfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfbWljXzJfYW1wX2luX3NlbCwKKwkJCSAgICBEQTcyMTNfTUlDXzJfQ1RSTCwKKwkJCSAgICBEQTcyMTNfTUlDX0FNUF9JTl9TRUxfU0hJRlQsCisJCQkgICAgZGE3MjEzX21pY19hbXBfaW5fc2VsX3R4dCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGE3MjEzX21pY18yX2FtcF9pbl9zZWxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJNaWMgMiBBbXAgU291cmNlIE1VWCIsIGRhNzIxM19taWNfMl9hbXBfaW5fc2VsKTsKIApAQCAtNjAxLDE1ICs2MDYsMTcgQEAKIAkiQURDIExlZnQiLCAiQURDIFJpZ2h0IiwgIkRBSSBJbnB1dCBMZWZ0IiwgIkRBSSBJbnB1dCBSaWdodCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2RhaV9sX3NyYyA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19ESUdfUk9VVElOR19EQUksIERBNzIxM19EQUlfTF9TUkNfU0hJRlQsCi0JCQlEQTcyMTNfREFJX1NSQ19NQVgsIGRhNzIxM19kYWlfc3JjX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEzX2RhaV9sX3NyYywKKwkJCSAgICBEQTcyMTNfRElHX1JPVVRJTkdfREFJLAorCQkJICAgIERBNzIxM19EQUlfTF9TUkNfU0hJRlQsCisJCQkgICAgZGE3MjEzX2RhaV9zcmNfdHh0KTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYTcyMTNfZGFpX2xfc3JjX211eCA9CiAJU09DX0RBUE1fRU5VTSgiREFJIExlZnQgU291cmNlIE1VWCIsIGRhNzIxM19kYWlfbF9zcmMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxM19kYWlfcl9zcmMgPQotCVNPQ19FTlVNX1NJTkdMRShEQTcyMTNfRElHX1JPVVRJTkdfREFJLCBEQTcyMTNfREFJX1JfU1JDX1NISUZULAotCQkJREE3MjEzX0RBSV9TUkNfTUFYLCBkYTcyMTNfZGFpX3NyY190eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19kYWlfcl9zcmMsCisJCQkgICAgREE3MjEzX0RJR19ST1VUSU5HX0RBSSwKKwkJCSAgICBEQTcyMTNfREFJX1JfU1JDX1NISUZULAorCQkJICAgIGRhNzIxM19kYWlfc3JjX3R4dCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGE3MjEzX2RhaV9yX3NyY19tdXggPQogCVNPQ19EQVBNX0VOVU0oIkRBSSBSaWdodCBTb3VyY2UgTVVYIiwgZGE3MjEzX2RhaV9yX3NyYyk7CiAKQEAgLTYxOSwxNSArNjI2LDE3IEBACiAJIkRBSSBJbnB1dCBSaWdodCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2RhY19sX3NyYyA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19ESUdfUk9VVElOR19EQUMsIERBNzIxM19EQUNfTF9TUkNfU0hJRlQsCi0JCQlEQTcyMTNfREFDX1NSQ19NQVgsIGRhNzIxM19kYWNfc3JjX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEzX2RhY19sX3NyYywKKwkJCSAgICBEQTcyMTNfRElHX1JPVVRJTkdfREFDLAorCQkJICAgIERBNzIxM19EQUNfTF9TUkNfU0hJRlQsCisJCQkgICAgZGE3MjEzX2RhY19zcmNfdHh0KTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYTcyMTNfZGFjX2xfc3JjX211eCA9CiAJU09DX0RBUE1fRU5VTSgiREFDIExlZnQgU291cmNlIE1VWCIsIGRhNzIxM19kYWNfbF9zcmMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxM19kYWNfcl9zcmMgPQotCVNPQ19FTlVNX1NJTkdMRShEQTcyMTNfRElHX1JPVVRJTkdfREFDLCBEQTcyMTNfREFDX1JfU1JDX1NISUZULAotCQkJREE3MjEzX0RBQ19TUkNfTUFYLCBkYTcyMTNfZGFjX3NyY190eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19kYWNfcl9zcmMsCisJCQkgICAgREE3MjEzX0RJR19ST1VUSU5HX0RBQywKKwkJCSAgICBEQTcyMTNfREFDX1JfU1JDX1NISUZULAorCQkJICAgIGRhNzIxM19kYWNfc3JjX3R4dCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGE3MjEzX2RhY19yX3NyY19tdXggPQogCVNPQ19EQVBNX0VOVU0oIkRBQyBSaWdodCBTb3VyY2UgTVVYIiwgZGE3MjEzX2RhY19yX3NyYyk7CiAKQEAgLTEzODQsMTcgKzEzOTMsOSBAQAogCiBzdGF0aWMgaW50IGRhNzIxM19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgZGE3MjEzX3ByaXYgKmRhNzIxMyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXN0cnVjdCBkYTcyMTNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkYTcyMTMtPnBkYXRhOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRhNzIxMy0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIERlZmF1bHQgdG8gdXNpbmcgQUxDIGF1dG8gb2Zmc2V0IGNhbGlicmF0aW9uIG1vZGUuICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEzX0FMQ19DVFJMMSwKIAkJCSAgICBEQTcyMTNfQUxDX0NBTElCX01PREVfTUFOLCAwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MzJ4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzMyeC5jCmluZGV4IGY0ZDk2NWViYy4uN2QxNjhlYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9kYTczMnguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzMyeC5jCkBAIC0yNjksODEgKzI2OSw2NSBAQAogCSIxNTBIeiIsICIyMDBIeiIsICIzMDBIeiIsICI0MDBIeiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2RhYzFfaHBmX21vZGVfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0RBQzFfSFBGLCBEQTczMlhfSFBGX01PREVfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01PREVfTUFYLCBkYTczMnhfaHBmX21vZGUpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9kYWMxX2hwZl9tb2RlX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19EQUMxX0hQRiwgREE3MzJYX0hQRl9NT0RFX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbW9kZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2RhYzJfaHBmX21vZGVfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0RBQzJfSFBGLCBEQTczMlhfSFBGX01PREVfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01PREVfTUFYLCBkYTczMnhfaHBmX21vZGUpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9kYWMyX2hwZl9tb2RlX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19EQUMyX0hQRiwgREE3MzJYX0hQRl9NT0RFX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbW9kZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2RhYzNfaHBmX21vZGVfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0RBQzNfSFBGLCBEQTczMlhfSFBGX01PREVfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01PREVfTUFYLCBkYTczMnhfaHBmX21vZGUpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9kYWMzX2hwZl9tb2RlX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19EQUMzX0hQRiwgREE3MzJYX0hQRl9NT0RFX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbW9kZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2FkYzFfaHBmX21vZGVfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0FEQzFfSFBGLCBEQTczMlhfSFBGX01PREVfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01PREVfTUFYLCBkYTczMnhfaHBmX21vZGUpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9hZGMxX2hwZl9tb2RlX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19BREMxX0hQRiwgREE3MzJYX0hQRl9NT0RFX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbW9kZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2FkYzJfaHBmX21vZGVfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0FEQzJfSFBGLCBEQTczMlhfSFBGX01PREVfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01PREVfTUFYLCBkYTczMnhfaHBmX21vZGUpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9hZGMyX2hwZl9tb2RlX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19BREMyX0hQRiwgREE3MzJYX0hQRl9NT0RFX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbW9kZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2RhYzFfaHBfZmlsdGVyX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEUoREE3MzJYX1JFR19EQUMxX0hQRiwgREE3MzJYX0hQRl9NVVNJQ19TSElGVCwKLQkJCURBNzMyWF9IUEZfTVVTSUNfTUFYLCBkYTczMnhfaHBmX211c2ljKQotfTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTczMnhfZGFjMV9ocF9maWx0ZXJfZW51bSwKKwkJCSAgICBEQTczMlhfUkVHX0RBQzFfSFBGLCBEQTczMlhfSFBGX01VU0lDX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbXVzaWMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzMyeF9kYWMyX2hwX2ZpbHRlcl9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKERBNzMyWF9SRUdfREFDMl9IUEYsIERBNzMyWF9IUEZfTVVTSUNfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01VU0lDX01BWCwgZGE3MzJ4X2hwZl9tdXNpYykKLX07CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MzJ4X2RhYzJfaHBfZmlsdGVyX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19EQUMyX0hQRiwgREE3MzJYX0hQRl9NVVNJQ19TSElGVCwKKwkJCSAgICBkYTczMnhfaHBmX211c2ljKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTczMnhfZGFjM19ocF9maWx0ZXJfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0RBQzNfSFBGLCBEQTczMlhfSFBGX01VU0lDX1NISUZULAotCQkJREE3MzJYX0hQRl9NVVNJQ19NQVgsIGRhNzMyeF9ocGZfbXVzaWMpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9kYWMzX2hwX2ZpbHRlcl9lbnVtLAorCQkJICAgIERBNzMyWF9SRUdfREFDM19IUEYsIERBNzMyWF9IUEZfTVVTSUNfU0hJRlQsCisJCQkgICAgZGE3MzJ4X2hwZl9tdXNpYyk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2FkYzFfaHBfZmlsdGVyX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEUoREE3MzJYX1JFR19BREMxX0hQRiwgREE3MzJYX0hQRl9NVVNJQ19TSElGVCwKLQkJCURBNzMyWF9IUEZfTVVTSUNfTUFYLCBkYTczMnhfaHBmX211c2ljKQotfTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTczMnhfYWRjMV9ocF9maWx0ZXJfZW51bSwKKwkJCSAgICBEQTczMlhfUkVHX0FEQzFfSFBGLCBEQTczMlhfSFBGX01VU0lDX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbXVzaWMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzMyeF9hZGMyX2hwX2ZpbHRlcl9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKERBNzMyWF9SRUdfQURDMl9IUEYsIERBNzMyWF9IUEZfTVVTSUNfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01VU0lDX01BWCwgZGE3MzJ4X2hwZl9tdXNpYykKLX07CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MzJ4X2FkYzJfaHBfZmlsdGVyX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19BREMyX0hQRiwgREE3MzJYX0hQRl9NVVNJQ19TSElGVCwKKwkJCSAgICBkYTczMnhfaHBmX211c2ljKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTczMnhfZGFjMV92b2ljZV9maWx0ZXJfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0RBQzFfSFBGLCBEQTczMlhfSFBGX1ZPSUNFX1NISUZULAotCQkJREE3MzJYX0hQRl9WT0lDRV9NQVgsIGRhNzMyeF9ocGZfdm9pY2UpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9kYWMxX3ZvaWNlX2ZpbHRlcl9lbnVtLAorCQkJICAgIERBNzMyWF9SRUdfREFDMV9IUEYsIERBNzMyWF9IUEZfVk9JQ0VfU0hJRlQsCisJCQkgICAgZGE3MzJ4X2hwZl92b2ljZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2RhYzJfdm9pY2VfZmlsdGVyX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEUoREE3MzJYX1JFR19EQUMyX0hQRiwgREE3MzJYX0hQRl9WT0lDRV9TSElGVCwKLQkJCURBNzMyWF9IUEZfVk9JQ0VfTUFYLCBkYTczMnhfaHBmX3ZvaWNlKQotfTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTczMnhfZGFjMl92b2ljZV9maWx0ZXJfZW51bSwKKwkJCSAgICBEQTczMlhfUkVHX0RBQzJfSFBGLCBEQTczMlhfSFBGX1ZPSUNFX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfdm9pY2UpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzMyeF9kYWMzX3ZvaWNlX2ZpbHRlcl9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKERBNzMyWF9SRUdfREFDM19IUEYsIERBNzMyWF9IUEZfVk9JQ0VfU0hJRlQsCi0JCQlEQTczMlhfSFBGX1ZPSUNFX01BWCwgZGE3MzJ4X2hwZl92b2ljZSkKLX07CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MzJ4X2RhYzNfdm9pY2VfZmlsdGVyX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19EQUMzX0hQRiwgREE3MzJYX0hQRl9WT0lDRV9TSElGVCwKKwkJCSAgICBkYTczMnhfaHBmX3ZvaWNlKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTczMnhfYWRjMV92b2ljZV9maWx0ZXJfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0FEQzFfSFBGLCBEQTczMlhfSFBGX1ZPSUNFX1NISUZULAotCQkJREE3MzJYX0hQRl9WT0lDRV9NQVgsIGRhNzMyeF9ocGZfdm9pY2UpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9hZGMxX3ZvaWNlX2ZpbHRlcl9lbnVtLAorCQkJICAgIERBNzMyWF9SRUdfQURDMV9IUEYsIERBNzMyWF9IUEZfVk9JQ0VfU0hJRlQsCisJCQkgICAgZGE3MzJ4X2hwZl92b2ljZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2FkYzJfdm9pY2VfZmlsdGVyX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEUoREE3MzJYX1JFR19BREMyX0hQRiwgREE3MzJYX0hQRl9WT0lDRV9TSElGVCwKLQkJCURBNzMyWF9IUEZfVk9JQ0VfTUFYLCBkYTczMnhfaHBmX3ZvaWNlKQotfTsKLQorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9hZGMyX3ZvaWNlX2ZpbHRlcl9lbnVtLAorCQkJICAgIERBNzMyWF9SRUdfQURDMl9IUEYsIERBNzMyWF9IUEZfVk9JQ0VfU0hJRlQsCisJCQkgICAgZGE3MzJ4X2hwZl92b2ljZSk7CiAKIHN0YXRpYyBpbnQgZGE3MzJ4X2hwZl9zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQpAQCAtNzE0LDY1ICs2OTgsNjUgQEAKIH07CiAKIC8qIEFEQzFMTVVYICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkYzFsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0lOUF9NVVgsIERBNzMyWF9BREMxTF9NVVhfU0VMX1NISUZULAotCQkJREE3MzJYX0FEQ0xfTVVYX01BWCwgYWRjbF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGMxbF9lbnVtLAorCQkJICAgIERBNzMyWF9SRUdfSU5QX01VWCwgREE3MzJYX0FEQzFMX01VWF9TRUxfU0hJRlQsCisJCQkgICAgYWRjbF90ZXh0KTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGMxbF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkFEQyBSb3V0ZSIsIGFkYzFsX2VudW0pOwogCiAvKiBBREMxUk1VWCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGMxcl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MzJYX1JFR19JTlBfTVVYLCBEQTczMlhfQURDMVJfTVVYX1NFTF9TSElGVCwKLQkJCURBNzMyWF9BRENSX01VWF9NQVgsIGFkY3JfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRjMXJfZW51bSwKKwkJCSAgICBEQTczMlhfUkVHX0lOUF9NVVgsIERBNzMyWF9BREMxUl9NVVhfU0VMX1NISUZULAorCQkJICAgIGFkY3JfdGV4dCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjMXJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBREMgUm91dGUiLCBhZGMxcl9lbnVtKTsKIAogLyogQURDMkxNVVggKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjMmxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzMyWF9SRUdfSU5QX01VWCwgREE3MzJYX0FEQzJMX01VWF9TRUxfU0hJRlQsCi0JCQlEQTczMlhfQURDTF9NVVhfTUFYLCBhZGNsX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYzJsX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19JTlBfTVVYLCBEQTczMlhfQURDMkxfTVVYX1NFTF9TSElGVCwKKwkJCSAgICBhZGNsX3RleHQpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkYzJsX211eCA9CiAJU09DX0RBUE1fRU5VTSgiQURDIFJvdXRlIiwgYWRjMmxfZW51bSk7CiAKIC8qIEFEQzJSTVVYICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkYzJyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0lOUF9NVVgsIERBNzMyWF9BREMyUl9NVVhfU0VMX1NISUZULAotCQkJREE3MzJYX0FEQ1JfTVVYX01BWCwgYWRjcl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGMycl9lbnVtLAorCQkJICAgIERBNzMyWF9SRUdfSU5QX01VWCwgREE3MzJYX0FEQzJSX01VWF9TRUxfU0hJRlQsCisJCQkgICAgYWRjcl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkYzJyX211eCA9CiAJU09DX0RBUE1fRU5VTSgiQURDIFJvdXRlIiwgYWRjMnJfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2hwX2xlZnRfb3V0cHV0ID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MzJYX1JFR19IUEwsIERBNzMyWF9IUF9PVVRfREFDX0VOX1NISUZULAotCQkJREE3MzJYX0RBQ19FTl9NQVgsIGVuYWJsZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTczMnhfaHBfbGVmdF9vdXRwdXQsCisJCQkgICAgREE3MzJYX1JFR19IUEwsIERBNzMyWF9IUF9PVVRfREFDX0VOX1NISUZULAorCQkJICAgIGVuYWJsZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhwbF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkhQTCBTd2l0Y2giLCBkYTczMnhfaHBfbGVmdF9vdXRwdXQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzMyeF9ocF9yaWdodF9vdXRwdXQgPQotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0hQUiwgREE3MzJYX0hQX09VVF9EQUNfRU5fU0hJRlQsCi0JCQlEQTczMlhfREFDX0VOX01BWCwgZW5hYmxlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9ocF9yaWdodF9vdXRwdXQsCisJCQkgICAgREE3MzJYX1JFR19IUFIsIERBNzMyWF9IUF9PVVRfREFDX0VOX1NISUZULAorCQkJICAgIGVuYWJsZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhwcl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkhQUiBTd2l0Y2giLCBkYTczMnhfaHBfcmlnaHRfb3V0cHV0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTczMnhfc3BlYWtlcl9vdXRwdXQgPQotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0xJTjMsIERBNzMyWF9MT1VUX0RBQ19FTl9TSElGVCwKLQkJCURBNzMyWF9EQUNfRU5fTUFYLCBlbmFibGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MzJ4X3NwZWFrZXJfb3V0cHV0LAorCQkJICAgIERBNzMyWF9SRUdfTElOMywgREE3MzJYX0xPVVRfREFDX0VOX1NISUZULAorCQkJICAgIGVuYWJsZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwa19tdXggPQogCVNPQ19EQVBNX0VOVU0oIlNQSyBTd2l0Y2giLCBkYTczMnhfc3BlYWtlcl9vdXRwdXQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzMyeF9sb3V0NF9vdXRwdXQgPQotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0xJTjQsIERBNzMyWF9MT1VUX0RBQ19FTl9TSElGVCwKLQkJCURBNzMyWF9EQUNfRU5fTUFYLCBlbmFibGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MzJ4X2xvdXQ0X291dHB1dCwKKwkJCSAgICBEQTczMlhfUkVHX0xJTjQsIERBNzMyWF9MT1VUX0RBQ19FTl9TSElGVCwKKwkJCSAgICBlbmFibGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsb3V0NF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxPVVQ0IFN3aXRjaCIsIGRhNzMyeF9sb3V0NF9vdXRwdXQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzMyeF9sb3V0Ml9vdXRwdXQgPQotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0xJTjIsIERBNzMyWF9MT1VUX0RBQ19FTl9TSElGVCwKLQkJCURBNzMyWF9EQUNfRU5fTUFYLCBlbmFibGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MzJ4X2xvdXQyX291dHB1dCwKKwkJCSAgICBEQTczMlhfUkVHX0xJTjIsIERBNzMyWF9MT1VUX0RBQ19FTl9TSElGVCwKKwkJCSAgICBlbmFibGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsb3V0Ml9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxPVVQyIFN3aXRjaCIsIGRhNzMyeF9sb3V0Ml9vdXRwdXQpOwpAQCAtMTMxMyw5ICsxMjk3LDkgQEAKIAltc2xlZXAoREE3MzJYX1dBSVRfRk9SX1NUQUJJTElaQVRJT04pOwogCiAJLyogQ2hlY2sgREFDIG9mZnNldCBzaWduICovCi0Jc2lnbltEQTczMlhfSFBMX0RBQ10gPSAoY29kZWMtPmh3X3JlYWQoY29kZWMsIERBNzMyWF9SRUdfSFBMX0RBQ19PRkZfQ05UTCkgJgorCXNpZ25bREE3MzJYX0hQTF9EQUNdID0gKHNuZF9zb2NfcmVhZChjb2RlYywgREE3MzJYX1JFR19IUExfREFDX09GRl9DTlRMKSAmCiAJCQkJREE3MzJYX0hQX0RBQ19PRkZfQ05UTF9DT01QTyk7Ci0Jc2lnbltEQTczMlhfSFBSX0RBQ10gPSAoY29kZWMtPmh3X3JlYWQoY29kZWMsIERBNzMyWF9SRUdfSFBSX0RBQ19PRkZfQ05UTCkgJgorCXNpZ25bREE3MzJYX0hQUl9EQUNdID0gKHNuZF9zb2NfcmVhZChjb2RlYywgREE3MzJYX1JFR19IUFJfREFDX09GRl9DTlRMKSAmCiAJCQkJREE3MzJYX0hQX0RBQ19PRkZfQ05UTF9DT01QTyk7CiAKIAkvKiBCaW5hcnkgc2VhcmNoIERBQyBvZmZzZXQgdmFsdWVzIChib3RoIGNoYW5uZWxzIGF0IG9uY2UpICovCkBAIC0xMzMyLDEwICsxMzE2LDEwIEBACiAKIAkJbXNsZWVwKERBNzMyWF9XQUlUX0ZPUl9TVEFCSUxJWkFUSU9OKTsKIAotCQlpZiAoKGNvZGVjLT5od19yZWFkKGNvZGVjLCBEQTczMlhfUkVHX0hQTF9EQUNfT0ZGX0NOVEwpICYKKwkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIERBNzMyWF9SRUdfSFBMX0RBQ19PRkZfQ05UTCkgJgogCQkgICAgIERBNzMyWF9IUF9EQUNfT0ZGX0NOVExfQ09NUE8pIF4gc2lnbltEQTczMlhfSFBMX0RBQ10pCiAJCQlvZmZzZXRbREE3MzJYX0hQTF9EQUNdICY9IH5zdGVwOwotCQlpZiAoKGNvZGVjLT5od19yZWFkKGNvZGVjLCBEQTczMlhfUkVHX0hQUl9EQUNfT0ZGX0NOVEwpICYKKwkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIERBNzMyWF9SRUdfSFBSX0RBQ19PRkZfQ05UTCkgJgogCQkgICAgIERBNzMyWF9IUF9EQUNfT0ZGX0NOVExfQ09NUE8pIF4gc2lnbltEQTczMlhfSFBSX0RBQ10pCiAJCQlvZmZzZXRbREE3MzJYX0hQUl9EQUNdICY9IH5zdGVwOwogCkBAIC0xMzc2LDkgKzEzNjAsOSBAQAogCW1zbGVlcChEQTczMlhfV0FJVF9GT1JfU1RBQklMSVpBVElPTik7CiAKIAkvKiBDaGVjayBvdXRwdXQgb2Zmc2V0IHNpZ24gKi8KLQlzaWduW0RBNzMyWF9IUExfQU1QXSA9IGNvZGVjLT5od19yZWFkKGNvZGVjLCBEQTczMlhfUkVHX0hQTCkgJgorCXNpZ25bREE3MzJYX0hQTF9BTVBdID0gc25kX3NvY19yZWFkKGNvZGVjLCBEQTczMlhfUkVHX0hQTCkgJgogCQkJICAgICAgIERBNzMyWF9IUF9PVVRfQ09NUE87Ci0Jc2lnbltEQTczMlhfSFBSX0FNUF0gPSBjb2RlYy0+aHdfcmVhZChjb2RlYywgREE3MzJYX1JFR19IUFIpICYKKwlzaWduW0RBNzMyWF9IUFJfQU1QXSA9IHNuZF9zb2NfcmVhZChjb2RlYywgREE3MzJYX1JFR19IUFIpICYKIAkJCSAgICAgICBEQTczMlhfSFBfT1VUX0NPTVBPOwogCiAJc25kX3NvY193cml0ZShjb2RlYywgREE3MzJYX1JFR19IUEwsIERBNzMyWF9IUF9PVVRfQ09NUCB8CkBAIC0xMzk5LDEwICsxMzgzLDEwIEBACiAKIAkJbXNsZWVwKERBNzMyWF9XQUlUX0ZPUl9TVEFCSUxJWkFUSU9OKTsKIAotCQlpZiAoKGNvZGVjLT5od19yZWFkKGNvZGVjLCBEQTczMlhfUkVHX0hQTCkgJgorCQlpZiAoKHNuZF9zb2NfcmVhZChjb2RlYywgREE3MzJYX1JFR19IUEwpICYKIAkJICAgICBEQTczMlhfSFBfT1VUX0NPTVBPKSBeIHNpZ25bREE3MzJYX0hQTF9BTVBdKQogCQkJb2Zmc2V0W0RBNzMyWF9IUExfQU1QXSAmPSB+c3RlcDsKLQkJaWYgKChjb2RlYy0+aHdfcmVhZChjb2RlYywgREE3MzJYX1JFR19IUFIpICYKKwkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIERBNzMyWF9SRUdfSFBSKSAmCiAJCSAgICAgREE3MzJYX0hQX09VVF9DT01QTykgXiBzaWduW0RBNzMyWF9IUFJfQU1QXSkKIAkJCW9mZnNldFtEQTczMlhfSFBSX0FNUF0gJj0gfnN0ZXA7CiAKQEAgLTE0OTksOCArMTQ4Myw4IEBACiAKIAkJCWRhNzMyeF9ocF9kY19vZmZzZXRfY2FuY2VsbGF0aW9uKGNvZGVjKTsKIAotCQkJcmVnY2FjaGVfY2FjaGVfb25seShjb2RlYy0+Y29udHJvbF9kYXRhLCBmYWxzZSk7Ci0JCQlyZWdjYWNoZV9zeW5jKGNvZGVjLT5jb250cm9sX2RhdGEpOworCQkJcmVnY2FjaGVfY2FjaGVfb25seShkYTczMngtPnJlZ21hcCwgZmFsc2UpOworCQkJcmVnY2FjaGVfc3luYyhkYTczMngtPnJlZ21hcCk7CiAJCX0gZWxzZSB7CiAJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTczMlhfUkVHX0JJQVNfRU4sCiAJCQkJCSAgICBEQTczMlhfQklBU19CT09TVF9NQVNLLApAQCAtMTUxMSw3ICsxNDk1LDcgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19PRkY6Ci0JCXJlZ2NhY2hlX2NhY2hlX29ubHkoY29kZWMtPmNvbnRyb2xfZGF0YSwgdHJ1ZSk7CisJCXJlZ2NhY2hlX2NhY2hlX29ubHkoZGE3MzJ4LT5yZWdtYXAsIHRydWUpOwogCQlkYTczMnhfc2V0X2NoYXJnZV9wdW1wKGNvZGVjLCBEQTczMlhfRElTQUJMRV9DUCk7CiAJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzMyWF9SRUdfQklBU19FTiwgREE3MzJYX0JJQVNfRU4sCiAJCQkJICAgIERBNzMyWF9CSUFTX0RJUyk7CkBAIC0xNTI4LDIzICsxNTEyLDE0IEBACiB7CiAJc3RydWN0IGRhNzMyeF9wcml2ICpkYTczMnggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0JaW50IHJldCA9IDA7CiAKIAlkYTczMngtPmNvZGVjID0gY29kZWM7CiAKIAlkYXBtLT5pZGxlX2JpYXNfb2ZmID0gZmFsc2U7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gZGE3MzJ4LT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgY29kZWMuXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCiAJZGE3MzJ4X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7Ci1lcnI6Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGRhNzMyeF9yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQpAQCAtMTU2Niw3ICsxNTQxLDYgQEAKIAkuZGFwbV9yb3V0ZXMJCT0gZGE3MzJ4X2RhcG1fcm91dGVzLAogCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhNzMyeF9kYXBtX3JvdXRlcyksCiAJLnNldF9wbGwJCT0gZGE3MzJ4X3NldF9kYWlfcGxsLAotCS5yZWdfY2FjaGVfc2l6ZQkJPSBBUlJBWV9TSVpFKGRhNzMyeF9yZWdfY2FjaGUpLAogfTsKIAogc3RhdGljIGludCBkYTczMnhfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzMyeC5oIGIvc291bmQvc29jL2NvZGVjcy9kYTczMnguaAppbmRleCBjOGNlNTQ3Li4xZGNlYWZlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhNzMyeC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MzJ4LmgKQEAgLTExMyw5ICsxMTMsNiBAQAogI2RlZmluZQlEQTczMlhfRVFfT1ZFUkFMTF9WT0xfREJfTUlOCS0xODAwCiAjZGVmaW5lCURBNzMyWF9FUV9PVkVSQUxMX1ZPTF9EQl9JTkMJNjAwCiAKLSNkZWZpbmUgREE3MzJYX1NPQ19FTlVNX0RPVUJMRV9SKHhyZWcsIHhycmVnLCB4bWF4LCB4dGV4dCkgXAotCXsucmVnID0geHJlZywgLnJlZzIgPSB4cnJlZywgLm1heCA9IHhtYXgsIC50ZXh0cyA9IHh0ZXh0fQotCiBlbnVtIGRhNzMyeF9zeXNjdGwgewogCURBNzMyWF9TUl84S0haCQk9IDB4MSwKIAlEQTczMlhfU1JfMTFfMDI1S0haCT0gMHgyLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kYTkwNTUuYyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE5MDU1LmMKaW5kZXggNDIyODEyNi4uNGZmMDZiNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9kYTkwNTUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhOTA1NS5jCkBAIC0xOCw2ICsxOCw4IEBACiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpAQCAtMzIxLDIyICszMjMsMjIgQEAKIAkiRnMvMjQwMDAiLCAiRnMvMTIwMDAiLCAiRnMvNjAwMCIsICJGcy8zMDAwIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfZGFjX2hwZl9jdXRvZmYgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfREFDX0ZJTFRFUlMxLCA0LCA0LCBkYTkwNTVfaHBmX2N1dG9mZl90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhOTA1NV9kYWNfaHBmX2N1dG9mZiwKKwkJCSAgICBEQTkwNTVfREFDX0ZJTFRFUlMxLCA0LCBkYTkwNTVfaHBmX2N1dG9mZl90eHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhOTA1NV9hZGNfaHBmX2N1dG9mZiA9Ci0JU09DX0VOVU1fU0lOR0xFKERBOTA1NV9BRENfRklMVEVSUzEsIDQsIDQsIGRhOTA1NV9ocGZfY3V0b2ZmX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2FkY19ocGZfY3V0b2ZmLAorCQkJICAgIERBOTA1NV9BRENfRklMVEVSUzEsIDQsIGRhOTA1NV9ocGZfY3V0b2ZmX3R4dCk7CiAKIC8qIEFEQyBhbmQgREFDIHZvaWNlIG1vZGUgKDhrSHopIGhpZ2ggcGFzcyBjdXRvZmYgdmFsdWUgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE5MDU1X3ZmX2N1dG9mZl90eHRbXSA9IHsKIAkiMi41SHoiLCAiMjVIeiIsICI1MEh6IiwgIjEwMEh6IiwgIjE1MEh6IiwgIjIwMEh6IiwgIjMwMEh6IiwgIjQwMEh6IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfZGFjX3ZmX2N1dG9mZiA9Ci0JU09DX0VOVU1fU0lOR0xFKERBOTA1NV9EQUNfRklMVEVSUzEsIDAsIDgsIGRhOTA1NV92Zl9jdXRvZmZfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTkwNTVfZGFjX3ZmX2N1dG9mZiwKKwkJCSAgICBEQTkwNTVfREFDX0ZJTFRFUlMxLCAwLCBkYTkwNTVfdmZfY3V0b2ZmX3R4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE5MDU1X2FkY192Zl9jdXRvZmYgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfQURDX0ZJTFRFUlMxLCAwLCA4LCBkYTkwNTVfdmZfY3V0b2ZmX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2FkY192Zl9jdXRvZmYsCisJCQkgICAgREE5MDU1X0FEQ19GSUxURVJTMSwgMCwgZGE5MDU1X3ZmX2N1dG9mZl90eHQpOwogCiAvKiBHYWluIHJhbXBpbmcgcmF0ZSB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTkwNTVfZ2Fpbl9yYW1waW5nX3R4dFtdID0gewpAQCAtMzQ0LDQ0ICszNDYsNDQgQEAKIAkibm9taW5hbCByYXRlIC8gOCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE5MDU1X2dhaW5fcmFtcGluZ19yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0dBSU5fUkFNUF9DVFJMLCAwLCA0LCBkYTkwNTVfZ2Fpbl9yYW1waW5nX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2dhaW5fcmFtcGluZ19yYXRlLAorCQkJICAgIERBOTA1NV9HQUlOX1JBTVBfQ1RSTCwgMCwgZGE5MDU1X2dhaW5fcmFtcGluZ190eHQpOwogCiAvKiBEQUMgbm9pc2UgZ2F0ZSBzZXR1cCB0aW1lIHZhbHVlICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhOTA1NV9kYWNfbmdfc2V0dXBfdGltZV90eHRbXSA9IHsKIAkiMjU2IHNhbXBsZXMiLCAiNTEyIHNhbXBsZXMiLCAiMTAyNCBzYW1wbGVzIiwgIjIwNDggc2FtcGxlcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE5MDU1X2RhY19uZ19zZXR1cF90aW1lID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0RBQ19OR19TRVRVUF9USU1FLCAwLCA0LAotCQkJZGE5MDU1X2RhY19uZ19zZXR1cF90aW1lX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2RhY19uZ19zZXR1cF90aW1lLAorCQkJICAgIERBOTA1NV9EQUNfTkdfU0VUVVBfVElNRSwgMCwKKwkJCSAgICBkYTkwNTVfZGFjX25nX3NldHVwX3RpbWVfdHh0KTsKIAogLyogREFDIG5vaXNlIGdhdGUgcmFtcHVwIHJhdGUgdmFsdWUgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE5MDU1X2RhY19uZ19yYW1wdXBfdHh0W10gPSB7CiAJIjAuMDIgbXMvZEIiLCAiMC4xNiBtcy9kQiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE5MDU1X2RhY19uZ19yYW1wdXBfcmF0ZSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBOTA1NV9EQUNfTkdfU0VUVVBfVElNRSwgMiwgMiwKLQkJCWRhOTA1NV9kYWNfbmdfcmFtcHVwX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2RhY19uZ19yYW1wdXBfcmF0ZSwKKwkJCSAgICBEQTkwNTVfREFDX05HX1NFVFVQX1RJTUUsIDIsCisJCQkgICAgZGE5MDU1X2RhY19uZ19yYW1wdXBfdHh0KTsKIAogLyogREFDIG5vaXNlIGdhdGUgcmFtcGRvd24gcmF0ZSB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTkwNTVfZGFjX25nX3JhbXBkb3duX3R4dFtdID0gewogCSIwLjY0IG1zL2RCIiwgIjIwLjQ4IG1zL2RCIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfZGFjX25nX3JhbXBkb3duX3JhdGUgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfREFDX05HX1NFVFVQX1RJTUUsIDMsIDIsCi0JCQlkYTkwNTVfZGFjX25nX3JhbXBkb3duX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2RhY19uZ19yYW1wZG93bl9yYXRlLAorCQkJICAgIERBOTA1NV9EQUNfTkdfU0VUVVBfVElNRSwgMywKKwkJCSAgICBkYTkwNTVfZGFjX25nX3JhbXBkb3duX3R4dCk7CiAKIC8qIERBQyBzb2Z0IG11dGUgcmF0ZSB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTkwNTVfZGFjX3NvZnRfbXV0ZV9yYXRlX3R4dFtdID0gewogCSIxIiwgIjIiLCAiNCIsICI4IiwgIjE2IiwgIjMyIiwgIjY0IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfZGFjX3NvZnRfbXV0ZV9yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0RBQ19GSUxURVJTNSwgNCwgNywKLQkJCWRhOTA1NV9kYWNfc29mdF9tdXRlX3JhdGVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTkwNTVfZGFjX3NvZnRfbXV0ZV9yYXRlLAorCQkJICAgIERBOTA1NV9EQUNfRklMVEVSUzUsIDQsCisJCQkgICAgZGE5MDU1X2RhY19zb2Z0X211dGVfcmF0ZV90eHQpOwogCiAvKiBEQUMgcm91dGluZyBzZWxlY3QgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE5MDU1X2RhY19zcmNfdHh0W10gPSB7CkBAIC0zODksNDAgKzM5MSw0MCBAQAogCSJBSUYgaW5wdXQgcmlnaHQiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhOTA1NV9kYWNfbF9zcmMgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfRElHX1JPVVRJTkdfREFDLCAwLCA0LCBkYTkwNTVfZGFjX3NyY190eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhOTA1NV9kYWNfbF9zcmMsCisJCQkgICAgREE5MDU1X0RJR19ST1VUSU5HX0RBQywgMCwgZGE5MDU1X2RhY19zcmNfdHh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfZGFjX3Jfc3JjID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0RJR19ST1VUSU5HX0RBQywgNCwgNCwgZGE5MDU1X2RhY19zcmNfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTkwNTVfZGFjX3Jfc3JjLAorCQkJICAgIERBOTA1NV9ESUdfUk9VVElOR19EQUMsIDQsIGRhOTA1NV9kYWNfc3JjX3R4dCk7CiAKIC8qIE1JQyBQR0EgTGVmdCBzb3VyY2Ugc2VsZWN0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhOTA1NV9taWNfbF9zcmNfdHh0W10gPSB7CiAJIk1JQzFfUF9OIiwgIk1JQzFfUCIsICJNSUMxX04iLCAiTUlDMl9MIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfbWljX2xfc3JjID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X01JWElOX0xfU0VMRUNULCA0LCA0LCBkYTkwNTVfbWljX2xfc3JjX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X21pY19sX3NyYywKKwkJCSAgICBEQTkwNTVfTUlYSU5fTF9TRUxFQ1QsIDQsIGRhOTA1NV9taWNfbF9zcmNfdHh0KTsKIAogLyogTUlDIFBHQSBSaWdodCBzb3VyY2Ugc2VsZWN0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhOTA1NV9taWNfcl9zcmNfdHh0W10gPSB7CiAJIk1JQzJfUl9MIiwgIk1JQzJfUiIsICJNSUMyX0wiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhOTA1NV9taWNfcl9zcmMgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfTUlYSU5fUl9TRUxFQ1QsIDQsIDMsIGRhOTA1NV9taWNfcl9zcmNfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTkwNTVfbWljX3Jfc3JjLAorCQkJICAgIERBOTA1NV9NSVhJTl9SX1NFTEVDVCwgNCwgZGE5MDU1X21pY19yX3NyY190eHQpOwogCiAvKiBBTEMgSW5wdXQgU2lnbmFsIFRyYWNraW5nIHJhdGUgc2VsZWN0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhOTA1NV9zaWduYWxfdHJhY2tpbmdfcmF0ZV90eHRbXSA9IHsKIAkiMS80IiwgIjEvMTYiLCAiMS8yNTYiLCAiMS82NTUzNiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE5MDU1X2ludGVnX2F0dGFja19yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0FMQ19DVFJMMywgNCwgNCwKLQkJCWRhOTA1NV9zaWduYWxfdHJhY2tpbmdfcmF0ZV90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhOTA1NV9pbnRlZ19hdHRhY2tfcmF0ZSwKKwkJCSAgICBEQTkwNTVfQUxDX0NUUkwzLCA0LAorCQkJICAgIGRhOTA1NV9zaWduYWxfdHJhY2tpbmdfcmF0ZV90eHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhOTA1NV9pbnRlZ19yZWxlYXNlX3JhdGUgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfQUxDX0NUUkwzLCA2LCA0LAotCQkJZGE5MDU1X3NpZ25hbF90cmFja2luZ19yYXRlX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2ludGVnX3JlbGVhc2VfcmF0ZSwKKwkJCSAgICBEQTkwNTVfQUxDX0NUUkwzLCA2LAorCQkJICAgIGRhOTA1NV9zaWduYWxfdHJhY2tpbmdfcmF0ZV90eHQpOwogCiAvKiBBTEMgQXR0YWNrIFJhdGUgc2VsZWN0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhOTA1NV9hdHRhY2tfcmF0ZV90eHRbXSA9IHsKQEAgLTQzMCw4ICs0MzIsOCBAQAogCSI1NjMyL2ZzIiwgIjExMjY0L2ZzIiwgIjIyNTI4L2ZzIiwgIjQ1MDU2L2ZzIiwgIjkwMTEyL2ZzIiwgIjE4MDIyNC9mcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE5MDU1X2F0dGFja19yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0FMQ19DVFJMMiwgMCwgMTMsIGRhOTA1NV9hdHRhY2tfcmF0ZV90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhOTA1NV9hdHRhY2tfcmF0ZSwKKwkJCSAgICBEQTkwNTVfQUxDX0NUUkwyLCAwLCBkYTkwNTVfYXR0YWNrX3JhdGVfdHh0KTsKIAogLyogQUxDIFJlbGVhc2UgUmF0ZSBzZWxlY3QgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE5MDU1X3JlbGVhc2VfcmF0ZV90eHRbXSA9IHsKQEAgLTQzOSw4ICs0NDEsOCBAQAogCSIxMTI2NC9mcyIsICIyMjUyOC9mcyIsICI0NTA1Ni9mcyIsICI5MDExMi9mcyIsICIxODAyMjQvZnMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhOTA1NV9yZWxlYXNlX3JhdGUgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfQUxDX0NUUkwyLCA0LCAxMSwgZGE5MDU1X3JlbGVhc2VfcmF0ZV90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhOTA1NV9yZWxlYXNlX3JhdGUsCisJCQkgICAgREE5MDU1X0FMQ19DVFJMMiwgNCwgZGE5MDU1X3JlbGVhc2VfcmF0ZV90eHQpOwogCiAvKiBBTEMgSG9sZCBUaW1lIHNlbGVjdCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTkwNTVfaG9sZF90aW1lX3R4dFtdID0gewpAQCAtNDQ5LDggKzQ1MSw4IEBACiAJIjI1Mzk1Mi9mcyIsICI1MDc5MDQvZnMiLCAiMTAxNTgwOC9mcyIsICIyMDMxNjE2L2ZzIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfaG9sZF90aW1lID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0FMQ19DVFJMMywgMCwgMTYsIGRhOTA1NV9ob2xkX3RpbWVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTkwNTVfaG9sZF90aW1lLAorCQkJICAgIERBOTA1NV9BTENfQ1RSTDMsIDAsIGRhOTA1NV9ob2xkX3RpbWVfdHh0KTsKIAogc3RhdGljIGludCBkYTkwNTVfZ2V0X2FsY19kYXRhKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdTggcmVnX3ZhbCkKIHsKQEAgLTEzODEsMTYgKzEzODMsOCBAQAogCiBzdGF0aWMgaW50IGRhOTA1NV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgZGE5MDU1X3ByaXYgKmRhOTA1NSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRhOTA1NS0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIEVuYWJsZSBhbGwgR2FpbiBSYW1wcyAqLwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBOTA1NV9BVVhfTF9DVFJMLAogCQkJICAgIERBOTA1NV9HQUlOX1JBTVBJTkdfRU4sIERBOTA1NV9HQUlOX1JBTVBJTkdfRU4pOwpAQCAtMTUzNiwxMSArMTUzMCwxNyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBkYTkwNTVfaTJjX2lkKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZGE5MDU1X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJkbGcsZGE5MDU1LWNvZGVjIiwgfSwKKwl7IH0KK307CisKIC8qIEkyQyBjb2RlYyBjb250cm9sIGxheWVyICovCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZGE5MDU1X2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiZGE5MDU1LWNvZGVjIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihkYTkwNTVfb2ZfbWF0Y2gpLAogCX0sCiAJLnByb2JlCQk9IGRhOTA1NV9pMmNfcHJvYmUsCiAJLnJlbW92ZQkJPSBkYTkwNTVfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9pc2FiZWxsZS5jIGIvc291bmQvc29jL2NvZGVjcy9pc2FiZWxsZS5jCmluZGV4IGNiNzM2ZGQuLjNhODljZTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvaXNhYmVsbGUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2lzYWJlbGxlLmMKQEAgLTkxOCw4ICs5MTgsNyBAQAogCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJCQkgICAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwogCXUxNiBhaWYgPSAwOwogCXVuc2lnbmVkIGludCBmc192YWwgPSAwOwogCkBAIC0xMDkwLDIzICsxMDg5LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBpc2FiZWxsZV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQljb2RlYy0+Y29udHJvbF9kYXRhID0gZGV2X2dldF9yZWdtYXAoY29kZWMtPmRldiwgTlVMTCk7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2lzYWJlbGxlID0gewotCS5wcm9iZSA9IGlzYWJlbGxlX3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IGlzYWJlbGxlX3NldF9iaWFzX2xldmVsLAogCS5jb250cm9scyA9IGlzYWJlbGxlX3NuZF9jb250cm9scywKIAkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShpc2FiZWxsZV9zbmRfY29udHJvbHMpLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9sbTQ4NTcuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbG00ODU3LmMKaW5kZXggMGU1NzQzZS4uNGYwNDhkYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9sbTQ4NTcuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2xtNDg1Ny5jCkBAIC0xMDEsOCArMTAxLDcgQEAKIAkiSGVhZHBob25lIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbG00ODU3X21vZGVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKGxtNDg1N19tb2RlKSwgbG00ODU3X21vZGUpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChsbTQ4NTdfbW9kZV9lbnVtLCBsbTQ4NTdfbW9kZSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBsbTQ4NTdfZGFwbV93aWRnZXRzW10gPSB7CiAJU05EX1NPQ19EQVBNX0lOUFVUKCJJTiIpLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9sbTQ5NDUzLmMgYi9zb3VuZC9zb2MvY29kZWNzL2xtNDk0NTMuYwppbmRleCBlMTk0OTBjLi4yNzViM2Y3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2xtNDk0NTMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2xtNDk0NTMuYwpAQCAtMTk1LDMzICsxOTUsMzEgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmxtNDk0NTNfbWljMm1vZGVfdGV4dFtdID0geyJTaW5nbGUgRW5kZWQiLCAiRGlmZmVyZW50aWFsIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChsbTQ5NDUzX21pYzJtb2RlX2VudW0sIExNNDk0NTNfUDBfTUlDUl9SRUcsIDUsCi0JCQkJICBsbTQ5NDUzX21pYzJtb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxtNDk0NTNfbWljMm1vZGVfZW51bSwgTE00OTQ1M19QMF9NSUNSX1JFRywgNSwKKwkJCSAgICBsbTQ5NDUzX21pYzJtb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbG00OTQ1M19kbWljX2NmZ190ZXh0W10gPSB7IkRNSUNEQVQxIiwgIkRNSUNEQVQyIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChsbTQ5NDUzX2RtaWMxMl9jZmdfZW51bSwKLQkJCQkgIExNNDk0NTNfUDBfRElHSVRBTF9NSUMxX0NPTkZJR19SRUcsCi0JCQkJICA3LCBsbTQ5NDUzX2RtaWNfY2ZnX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxtNDk0NTNfZG1pYzEyX2NmZ19lbnVtLAorCQkJICAgIExNNDk0NTNfUDBfRElHSVRBTF9NSUMxX0NPTkZJR19SRUcsIDcsCisJCQkgICAgbG00OTQ1M19kbWljX2NmZ190ZXh0KTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxtNDk0NTNfZG1pYzM0X2NmZ19lbnVtLAotCQkJCSAgTE00OTQ1M19QMF9ESUdJVEFMX01JQzJfQ09ORklHX1JFRywKLQkJCQkgIDcsIGxtNDk0NTNfZG1pY19jZmdfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobG00OTQ1M19kbWljMzRfY2ZnX2VudW0sCisJCQkgICAgTE00OTQ1M19QMF9ESUdJVEFMX01JQzJfQ09ORklHX1JFRywgNywKKwkJCSAgICBsbTQ5NDUzX2RtaWNfY2ZnX3RleHQpOwogCiAvKiBNVVggQ29udHJvbHMgKi8KIHN0YXRpYyBjb25zdCBjaGFyICpsbTQ5NDUzX2FkY2xfbXV4X3RleHRbXSA9IHsgIk1JQzEiLCAiQXV4X0wiIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpsbTQ5NDUzX2FkY3JfbXV4X3RleHRbXSA9IHsgIk1JQzIiLCAiQXV4X1IiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbG00OTQ1M19hZGNsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShMTTQ5NDUzX1AwX0FOQUxPR19NSVhFUl9BRENfUkVHLCAwLAotCQkJQVJSQVlfU0laRShsbTQ5NDUzX2FkY2xfbXV4X3RleHQpLAotCQkJbG00OTQ1M19hZGNsX211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsbTQ5NDUzX2FkY2xfZW51bSwKKwkJCSAgICBMTTQ5NDUzX1AwX0FOQUxPR19NSVhFUl9BRENfUkVHLCAwLAorCQkJICAgIGxtNDk0NTNfYWRjbF9tdXhfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbG00OTQ1M19hZGNyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShMTTQ5NDUzX1AwX0FOQUxPR19NSVhFUl9BRENfUkVHLCAxLAotCQkJQVJSQVlfU0laRShsbTQ5NDUzX2FkY3JfbXV4X3RleHQpLAotCQkJbG00OTQ1M19hZGNyX211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsbTQ5NDUzX2FkY3JfZW51bSwKKwkJCSAgICBMTTQ5NDUzX1AwX0FOQUxPR19NSVhFUl9BRENfUkVHLCAxLAorCQkJICAgIGxtNDk0NTNfYWRjcl9tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsbTQ5NDUzX2FkY2xfbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIkFEQyBMZWZ0IE11eCIsIGxtNDk0NTNfYWRjbF9lbnVtKTsKQEAgLTE0MDksMjIgKzE0MDcsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGxtNDk0NTNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBsbTQ5NDUzX3ByaXYgKmxtNDk0NTMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0ID0gMDsKLQotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBsbTQ5NDUzLT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyogcG93ZXIgZG93biBjaGlwICovCiBzdGF0aWMgaW50IGxtNDk0NTNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKQEAgLTE0MzMsNyArMTQxNSw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9sbTQ5NDUzID0gewotCS5wcm9iZSA9IGxtNDk0NTNfcHJvYmUsCiAJLnJlbW92ZSA9IGxtNDk0NTNfcmVtb3ZlLAogCS5zdXNwZW5kID0gbG00OTQ1M19zdXNwZW5kLAogCS5yZXN1bWUgPSBsbTQ5NDUzX3Jlc3VtZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTc2OC5jIGIvc291bmQvc29jL2NvZGVjcy9tYXg5NzY4LmMKaW5kZXggMzFmOTE1Ni4uZWM0ODFmYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5NzY4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tYXg5NzY4LmMKQEAgLTEzNSwxMSArMTM1LDYgQEAKIAlzdHJ1Y3QgbWF4OTc2OCAqbWF4OTc2OCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCByZXQ7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gbWF4OTc2OC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAyLCA2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCWlmIChtYXg5NzY4LT5mbGFncyAmIE1BWDk3NjhfRkxBR19DTEFTU0lDX1BXTSkgewogCQlyZXQgPSBzbmRfc29jX3dyaXRlKGNvZGVjLCBNQVg5NzY4X0NUUkwsIE1BWDk3NjhfQ1RSTF9QV00pOwogCQlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA4OC5jIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODA4OC5jCmluZGV4IGVlNjYwZTIuLmVmN2NmODkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwODguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDg4LmMKQEAgLTU5NywyOCArNTk3LDI3IEBACiAgICAgICAgMHgwMCwgMHg0MywgMHgxMCwgMHgyMCwgMHgzMCwgMHg0MCwgMHgxMSwgMHgyMiwgMHgzMgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA4OF9leG1vZGVfZW51bSA9Ci0gICAgICAgU09DX1ZBTFVFX0VOVU1fU0lOR0xFKE05ODA4OF9SRUdfNDFfU1BLREhQLCAwLCAxMjcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUobWF4OTgwODhfZXhtb2RlX3RleHRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OTgwODhfZXhtb2RlX3RleHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg5ODA4OF9leG1vZGVfdmFsdWVzKTsKK3N0YXRpYyBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA4OF9leG1vZGVfZW51bSwKKwkJCQkgIE05ODA4OF9SRUdfNDFfU1BLREhQLCAwLCAxMjcsCisJCQkJICBtYXg5ODA4OF9leG1vZGVfdGV4dHMsCisJCQkJICBtYXg5ODA4OF9leG1vZGVfdmFsdWVzKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKm1heDk4MDg4X2V4X3RocmVzaFtdID0geyAvKiB2b2x0cyBQUCAqLwogICAgICAgICIwLjYiLCAiMS4yIiwgIjEuOCIsICIyLjQiLCAiMy4wIiwgIjMuNiIsICI0LjIiLCAiNC44In07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDg4X2V4X3RocmVzaF9lbnVtW10gPSB7Ci0gICAgICAgU09DX0VOVU1fU0lOR0xFKE05ODA4OF9SRUdfNDJfU1BLREhQX1RIUkVTSCwgMCwgOCwKLSAgICAgICAgICAgICAgIG1heDk4MDg4X2V4X3RocmVzaCksCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDg4X2V4X3RocmVzaF9lbnVtLAorCQkJICAgIE05ODA4OF9SRUdfNDJfU1BLREhQX1RIUkVTSCwgMCwKKwkJCSAgICBtYXg5ODA4OF9leF90aHJlc2gpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbWF4OTgwODhfZmx0cl9tb2RlW10gPSB7IlZvaWNlIiwgIk11c2ljIiB9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA4OF9maWx0ZXJfbW9kZV9lbnVtW10gPSB7Ci0gICAgICAgU09DX0VOVU1fU0lOR0xFKE05ODA4OF9SRUdfMThfREFJMV9GSUxURVJTLCA3LCAyLCBtYXg5ODA4OF9mbHRyX21vZGUpLAotfTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA4OF9maWx0ZXJfbW9kZV9lbnVtLAorCQkJICAgIE05ODA4OF9SRUdfMThfREFJMV9GSUxURVJTLCA3LAorCQkJICAgIG1heDk4MDg4X2ZsdHJfbW9kZSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICptYXg5ODA4OF9leHRtaWNfdGV4dFtdID0geyAiTm9uZSIsICJNSUMxIiwgIk1JQzIiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwODhfZXh0bWljX2VudW0gPQotICAgICAgIFNPQ19FTlVNX1NJTkdMRShNOTgwODhfUkVHXzQ4X0NGR19NSUMsIDAsIDMsIG1heDk4MDg4X2V4dG1pY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA4OF9leHRtaWNfZW51bSwKKwkJCSAgICBNOTgwODhfUkVHXzQ4X0NGR19NSUMsIDAsCisJCQkgICAgbWF4OTgwODhfZXh0bWljX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWF4OTgwODhfZXh0bWljX211eCA9CiAgICAgICAgU09DX0RBUE1fRU5VTSgiRXh0ZXJuYWwgTUlDIE11eCIsIG1heDk4MDg4X2V4dG1pY19lbnVtKTsKQEAgLTYyNiwxMiArNjI1LDEyIEBACiBzdGF0aWMgY29uc3QgY2hhciAqbWF4OTgwODhfZGFpMV9mbHRyW10gPSB7CiAgICAgICAgIk9mZiIsICJmYz0yNTgvZnM9MTZrIiwgImZjPTUwMC9mcz0xNmsiLAogICAgICAgICJmYz0yNTgvZnM9OGsiLCAiZmM9NTAwL2ZzPThrIiwgImZjPTIwMCJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA4OF9kYWkxX2RhY19maWx0ZXJfZW51bVtdID0gewotICAgICAgIFNPQ19FTlVNX1NJTkdMRShNOTgwODhfUkVHXzE4X0RBSTFfRklMVEVSUywgMCwgNiwgbWF4OTgwODhfZGFpMV9mbHRyKSwKLX07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDg4X2RhaTFfYWRjX2ZpbHRlcl9lbnVtW10gPSB7Ci0gICAgICAgU09DX0VOVU1fU0lOR0xFKE05ODA4OF9SRUdfMThfREFJMV9GSUxURVJTLCA0LCA2LCBtYXg5ODA4OF9kYWkxX2ZsdHIpLAotfTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA4OF9kYWkxX2RhY19maWx0ZXJfZW51bSwKKwkJCSAgICBNOTgwODhfUkVHXzE4X0RBSTFfRklMVEVSUywgMCwKKwkJCSAgICBtYXg5ODA4OF9kYWkxX2ZsdHIpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDg4X2RhaTFfYWRjX2ZpbHRlcl9lbnVtLAorCQkJICAgIE05ODA4OF9SRUdfMThfREFJMV9GSUxURVJTLCA0LAorCQkJICAgIG1heDk4MDg4X2RhaTFfZmx0cik7CiAKIHN0YXRpYyBpbnQgbWF4OTgwODhfbWljMXByZV9zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCkBAIC0xODQ5LDcgKzE4NDgsNyBAQAogCiAgICAgICAgLyogTm93IHBvaW50IHRoZSBzb2NfZW51bSB0byAudGV4dHMgYXJyYXkgaXRlbXMgKi8KICAgICAgICBtYXg5ODA4OC0+ZXFfZW51bS50ZXh0cyA9IG1heDk4MDg4LT5lcV90ZXh0czsKLSAgICAgICBtYXg5ODA4OC0+ZXFfZW51bS5tYXggPSBtYXg5ODA4OC0+ZXFfdGV4dGNudDsKKyAgICAgICBtYXg5ODA4OC0+ZXFfZW51bS5pdGVtcyA9IG1heDk4MDg4LT5lcV90ZXh0Y250OwogCiAgICAgICAgcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGNvbnRyb2xzLCBBUlJBWV9TSVpFKGNvbnRyb2xzKSk7CiAgICAgICAgaWYgKHJldCAhPSAwKQpAQCAtMTkxNSwxMiArMTkxNCw2IEBACiAKICAgICAgICByZWdjYWNoZV9tYXJrX2RpcnR5KG1heDk4MDg4LT5yZWdtYXApOwogCi0gICAgICAgcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIFNORF9TT0NfUkVHTUFQKTsKLSAgICAgICBpZiAocmV0ICE9IDApIHsKLSAgICAgICAgICAgICAgIGRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLSAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgfQotCiAgICAgICAgLyogaW5pdGlhbGl6ZSBwcml2YXRlIGRhdGEgKi8KIAogICAgICAgIG1heDk4MDg4LT5zeXNjbGsgPSAodW5zaWduZWQpLTE7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MDkwLmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDkwLmMKaW5kZXggOWY3MTRlYS4uOThjNmUxMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwOTAuYwpAQCAtNTEzLDY1ICs1MTMsNzUgQEAKIHN0YXRpYyBjb25zdCBjaGFyICptYXg5ODA5MF9wd3JfcGVyZl90ZXh0W10gPQogCXsgIkxvdyBQb3dlciIsICJIaWdoIFBlcmZvcm1hbmNlIiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX3ZjbWJhbmRnYXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfQklBU19DT05UUk9MLCBNOTgwOTBfVkNNX01PREVfU0hJRlQsCi0JCUFSUkFZX1NJWkUobWF4OTgwOTBfcHdyX3BlcmZfdGV4dCksIG1heDk4MDkwX3B3cl9wZXJmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDkwX3ZjbWJhbmRnYXBfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0JJQVNfQ09OVFJPTCwKKwkJCSAgICBNOTgwOTBfVkNNX01PREVfU0hJRlQsCisJCQkgICAgbWF4OTgwOTBfcHdyX3BlcmZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICptYXg5ODA5MF9vc3IxMjhfdGV4dFtdID0geyAiNjQqZnMiLCAiMTI4KmZzIiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX29zcjEyOF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19BRENfQ09OVFJPTCwgTTk4MDkwX09TUjEyOF9TSElGVCwKLQkJQVJSQVlfU0laRShtYXg5ODA5MF9vc3IxMjhfdGV4dCksIG1heDk4MDkwX29zcjEyOF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5MF9vc3IxMjhfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0FEQ19DT05UUk9MLAorCQkJICAgIE05ODA5MF9PU1IxMjhfU0hJRlQsCisJCQkgICAgbWF4OTgwOTBfb3NyMTI4X3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbWF4OTgwOTBfbW9kZV90ZXh0W10gPSB7ICJWb2ljZSIsICJNdXNpYyIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA5MF9tb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0ZJTFRFUl9DT05GSUcsIE05ODA5MF9NT0RFX1NISUZULAotCQlBUlJBWV9TSVpFKG1heDk4MDkwX21vZGVfdGV4dCksIG1heDk4MDkwX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWF4OTgwOTBfbW9kZV9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfRklMVEVSX0NPTkZJRywKKwkJCSAgICBNOTgwOTBfTU9ERV9TSElGVCwKKwkJCSAgICBtYXg5ODA5MF9tb2RlX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX2ZpbHRlcl9kbWljMzRtb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0ZJTFRFUl9DT05GSUcsCi0JCU05ODA5MF9GTFRfRE1JQzM0TU9ERV9TSElGVCwKLQkJQVJSQVlfU0laRShtYXg5ODA5MF9tb2RlX3RleHQpLCBtYXg5ODA5MF9tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDkwX2ZpbHRlcl9kbWljMzRtb2RlX2VudW0sCisJCQkgICAgTTk4MDkwX1JFR19GSUxURVJfQ09ORklHLAorCQkJICAgIE05ODA5MF9GTFRfRE1JQzM0TU9ERV9TSElGVCwKKwkJCSAgICBtYXg5ODA5MF9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbWF4OTgwOTBfZHJjYXRrX3RleHRbXSA9CiAJeyAiMC41bXMiLCAiMW1zIiwgIjVtcyIsICIxMG1zIiwgIjI1bXMiLCAiNTBtcyIsICIxMDBtcyIsICIyMDBtcyIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA5MF9kcmNhdGtfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfRFJDX1RJTUlORywgTTk4MDkwX0RSQ0FUS19TSElGVCwKLQkJQVJSQVlfU0laRShtYXg5ODA5MF9kcmNhdGtfdGV4dCksIG1heDk4MDkwX2RyY2F0a190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5MF9kcmNhdGtfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0RSQ19USU1JTkcsCisJCQkgICAgTTk4MDkwX0RSQ0FUS19TSElGVCwKKwkJCSAgICBtYXg5ODA5MF9kcmNhdGtfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICptYXg5ODA5MF9kcmNybHNfdGV4dFtdID0KIAl7ICI4cyIsICI0cyIsICIycyIsICIxcyIsICIwLjVzIiwgIjAuMjVzIiwgIjAuMTI1cyIsICIwLjA2MjVzIiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX2RyY3Jsc19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19EUkNfVElNSU5HLCBNOTgwOTBfRFJDUkxTX1NISUZULAotCQlBUlJBWV9TSVpFKG1heDk4MDkwX2RyY3Jsc190ZXh0KSwgbWF4OTgwOTBfZHJjcmxzX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDkwX2RyY3Jsc19lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfRFJDX1RJTUlORywKKwkJCSAgICBNOTgwOTBfRFJDUkxTX1NISUZULAorCQkJICAgIG1heDk4MDkwX2RyY3Jsc190ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKm1heDk4MDkwX2FsY2NtcF90ZXh0W10gPQogCXsgIjE6MSIsICIxOjEuNSIsICIxOjIiLCAiMTo0IiwgIjE6SU5GIiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX2FsY2NtcF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19EUkNfQ09NUFJFU1NPUiwgTTk4MDkwX0RSQ0NNUF9TSElGVCwKLQkJQVJSQVlfU0laRShtYXg5ODA5MF9hbGNjbXBfdGV4dCksIG1heDk4MDkwX2FsY2NtcF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5MF9hbGNjbXBfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0RSQ19DT01QUkVTU09SLAorCQkJICAgIE05ODA5MF9EUkNDTVBfU0hJRlQsCisJCQkgICAgbWF4OTgwOTBfYWxjY21wX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbWF4OTgwOTBfZHJjZXhwX3RleHRbXSA9IHsgIjE6MSIsICIyOjEiLCAiMzoxIiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX2RyY2V4cF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19EUkNfRVhQQU5ERVIsIE05ODA5MF9EUkNFWFBfU0hJRlQsCi0JCUFSUkFZX1NJWkUobWF4OTgwOTBfZHJjZXhwX3RleHQpLCBtYXg5ODA5MF9kcmNleHBfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWF4OTgwOTBfZHJjZXhwX2VudW0sCisJCQkgICAgTTk4MDkwX1JFR19EUkNfRVhQQU5ERVIsCisJCQkgICAgTTk4MDkwX0RSQ0VYUF9TSElGVCwKKwkJCSAgICBtYXg5ODA5MF9kcmNleHBfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTBfZGFjX3BlcmZtb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0RBQ19DT05UUk9MLCBNOTgwOTBfUEVSRk1PREVfU0hJRlQsCi0JCUFSUkFZX1NJWkUobWF4OTgwOTBfcGVyZl9wd3JfdGV4dCksIG1heDk4MDkwX3BlcmZfcHdyX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDkwX2RhY19wZXJmbW9kZV9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfREFDX0NPTlRST0wsCisJCQkgICAgTTk4MDkwX1BFUkZNT0RFX1NISUZULAorCQkJICAgIG1heDk4MDkwX3BlcmZfcHdyX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX2RhY2hwX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0RBQ19DT05UUk9MLCBNOTgwOTBfREFDSFBfU0hJRlQsCi0JCUFSUkFZX1NJWkUobWF4OTgwOTBfcHdyX3BlcmZfdGV4dCksIG1heDk4MDkwX3B3cl9wZXJmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDkwX2RhY2hwX2VudW0sCisJCQkgICAgTTk4MDkwX1JFR19EQUNfQ09OVFJPTCwKKwkJCSAgICBNOTgwOTBfREFDSFBfU0hJRlQsCisJCQkgICAgbWF4OTgwOTBfcHdyX3BlcmZfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTBfYWRjaHBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfQURDX0NPTlRST0wsIE05ODA5MF9BRENIUF9TSElGVCwKLQkJQVJSQVlfU0laRShtYXg5ODA5MF9wd3JfcGVyZl90ZXh0KSwgbWF4OTgwOTBfcHdyX3BlcmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWF4OTgwOTBfYWRjaHBfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0FEQ19DT05UUk9MLAorCQkJICAgIE05ODA5MF9BRENIUF9TSElGVCwKKwkJCSAgICBtYXg5ODA5MF9wd3JfcGVyZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDkwX3NuZF9jb250cm9sc1tdID0gewogCVNPQ19FTlVNKCJNSUMgQmlhcyBWQ00gQmFuZGdhcCIsIG1heDk4MDkwX3ZjbWJhbmRnYXBfZW51bSksCkBAIC04NDIsMzkgKzg1Miw0MiBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqbWljMV9tdXhfdGV4dFtdID0geyAiSU4xMiIsICJJTjU2IiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1pYzFfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0lOUFVUX01PREUsIE05ODA5MF9FWFRNSUMxX1NISUZULAotCQlBUlJBWV9TSVpFKG1pYzFfbXV4X3RleHQpLCBtaWMxX211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtaWMxX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfSU5QVVRfTU9ERSwKKwkJCSAgICBNOTgwOTBfRVhUTUlDMV9TSElGVCwKKwkJCSAgICBtaWMxX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDkwX21pYzFfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJNSUMxIE11eCIsIG1pYzFfbXV4X2VudW0pOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbWljMl9tdXhfdGV4dFtdID0geyAiSU4zNCIsICJJTjU2IiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1pYzJfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0lOUFVUX01PREUsIE05ODA5MF9FWFRNSUMyX1NISUZULAotCQlBUlJBWV9TSVpFKG1pYzJfbXV4X3RleHQpLCBtaWMyX211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtaWMyX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfSU5QVVRfTU9ERSwKKwkJCSAgICBNOTgwOTBfRVhUTUlDMl9TSElGVCwKKwkJCSAgICBtaWMyX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDkwX21pYzJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJNSUMyIE11eCIsIG1pYzJfbXV4X2VudW0pOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZG1pY19tdXhfdGV4dFtdID0geyAiQURDIiwgIkRNSUMiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZG1pY19tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKGRtaWNfbXV4X3RleHQpLCBkbWljX211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfVklSVF9ERUNMKGRtaWNfbXV4X2VudW0sIGRtaWNfbXV4X3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWF4OTgwOTBfZG1pY19tdXggPQogCVNPQ19EQVBNX0VOVU1fVklSVCgiRE1JQyBNdXgiLCBkbWljX211eF9lbnVtKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKm1heDk4MDkwX21pY3ByZV90ZXh0W10gPSB7ICJPZmYiLCAiT24iIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTBfcGExZW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfTUlDMV9JTlBVVF9MRVZFTCwgTTk4MDkwX01JQ19QQTFFTl9TSElGVCwKLQkJQVJSQVlfU0laRShtYXg5ODA5MF9taWNwcmVfdGV4dCksIG1heDk4MDkwX21pY3ByZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5MF9wYTFlbl9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfTUlDMV9JTlBVVF9MRVZFTCwKKwkJCSAgICBNOTgwOTBfTUlDX1BBMUVOX1NISUZULAorCQkJICAgIG1heDk4MDkwX21pY3ByZV90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA5MF9wYTJlbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19NSUMyX0lOUFVUX0xFVkVMLCBNOTgwOTBfTUlDX1BBMkVOX1NISUZULAotCQlBUlJBWV9TSVpFKG1heDk4MDkwX21pY3ByZV90ZXh0KSwgbWF4OTgwOTBfbWljcHJlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDkwX3BhMmVuX2VudW0sCisJCQkgICAgTTk4MDkwX1JFR19NSUMyX0lOUFVUX0xFVkVMLAorCQkJICAgIE05ODA5MF9NSUNfUEEyRU5fU0hJRlQsCisJCQkgICAgbWF4OTgwOTBfbWljcHJlX3RleHQpOwogCiAvKiBMSU5FQSBtaXhlciBzd2l0Y2ggKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtYXg5ODA5MF9saW5lYV9taXhlcl9jb250cm9sc1tdID0gewpAQCAtOTM4LDEzICs5NTEsMTUgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmx0ZW5fbXV4X3RleHRbXSA9IHsgIk5vcm1hbCIsICJMb29wdGhyb3VnaCIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsdGVubF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwgTTk4MDkwX0xURU5fU0hJRlQsCi0JCUFSUkFZX1NJWkUobHRlbl9tdXhfdGV4dCksIGx0ZW5fbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGx0ZW5sX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwKKwkJCSAgICBNOTgwOTBfTFRFTl9TSElGVCwKKwkJCSAgICBsdGVuX211eF90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsdGVucl9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwgTTk4MDkwX0xURU5fU0hJRlQsCi0JCUFSUkFZX1NJWkUobHRlbl9tdXhfdGV4dCksIGx0ZW5fbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGx0ZW5yX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwKKwkJCSAgICBNOTgwOTBfTFRFTl9TSElGVCwKKwkJCSAgICBsdGVuX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDkwX2x0ZW5sX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTFRFTkwgTXV4IiwgbHRlbmxfbXV4X2VudW0pOwpAQCAtOTU0LDEzICs5NjksMTUgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmxiZW5fbXV4X3RleHRbXSA9IHsgIk5vcm1hbCIsICJMb29wYmFjayIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsYmVubF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwgTTk4MDkwX0xCRU5fU0hJRlQsCi0JCUFSUkFZX1NJWkUobGJlbl9tdXhfdGV4dCksIGxiZW5fbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxiZW5sX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwKKwkJCSAgICBNOTgwOTBfTEJFTl9TSElGVCwKKwkJCSAgICBsYmVuX211eF90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsYmVucl9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwgTTk4MDkwX0xCRU5fU0hJRlQsCi0JCUFSUkFZX1NJWkUobGJlbl9tdXhfdGV4dCksIGxiZW5fbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxiZW5yX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwKKwkJCSAgICBNOTgwOTBfTEJFTl9TSElGVCwKKwkJCSAgICBsYmVuX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDkwX2xiZW5sX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTEJFTkwgTXV4IiwgbGJlbmxfbXV4X2VudW0pOwpAQCAtOTcyLDEzICs5ODksMTUgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKnN0ZW5yX211eF90ZXh0W10gPSB7ICJOb3JtYWwiLCAiU2lkZXRvbmUgUmlnaHQiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RlbmxfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0FEQ19TSURFVE9ORSwgTTk4MDkwX0RTVFNMX1NISUZULAotCQlBUlJBWV9TSVpFKHN0ZW5sX211eF90ZXh0KSwgc3RlbmxfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHN0ZW5sX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfQURDX1NJREVUT05FLAorCQkJICAgIE05ODA5MF9EU1RTTF9TSElGVCwKKwkJCSAgICBzdGVubF9tdXhfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RlbnJfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0FEQ19TSURFVE9ORSwgTTk4MDkwX0RTVFNSX1NISUZULAotCQlBUlJBWV9TSVpFKHN0ZW5yX211eF90ZXh0KSwgc3RlbnJfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHN0ZW5yX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfQURDX1NJREVUT05FLAorCQkJICAgIE05ODA5MF9EU1RTUl9TSElGVCwKKwkJCSAgICBzdGVucl9tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtYXg5ODA5MF9zdGVubF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlNURU5MIE11eCIsIHN0ZW5sX211eF9lbnVtKTsKQEAgLTEwODYsOSArMTEwNSwxMCBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqbGlubW9kX211eF90ZXh0W10gPSB7ICJMZWZ0IE9ubHkiLCAiTGVmdCBhbmQgUmlnaHQiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbGlubW9kX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19MT1VUUl9NSVhFUiwgTTk4MDkwX0xJTk1PRF9TSElGVCwKLQkJQVJSQVlfU0laRShsaW5tb2RfbXV4X3RleHQpLCBsaW5tb2RfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxpbm1vZF9tdXhfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0xPVVRSX01JWEVSLAorCQkJICAgIE05ODA5MF9MSU5NT0RfU0hJRlQsCisJCQkgICAgbGlubW9kX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDkwX2xpbm1vZF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxJTk1PRCBNdXgiLCBsaW5tb2RfbXV4X2VudW0pOwpAQCAtMTA5OCwxNiArMTExOCwxOCBAQAogLyoKICAqIFRoaXMgaXMgYSBtdXggYXMgaXQgc2VsZWN0cyB0aGUgSFAgb3V0cHV0LCBidXQgdG8gREFQTSBpdCBpcyBhIE1peGVyIGVuYWJsZQogICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1peGhwbHNlbF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfSFBfQ09OVFJPTCwgTTk4MDkwX01JWEhQTFNFTF9TSElGVCwKLQkJQVJSQVlfU0laRShtaXhocHNlbF9tdXhfdGV4dCksIG1peGhwc2VsX211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtaXhocGxzZWxfbXV4X2VudW0sCisJCQkgICAgTTk4MDkwX1JFR19IUF9DT05UUk9MLAorCQkJICAgIE05ODA5MF9NSVhIUExTRUxfU0hJRlQsCisJCQkgICAgbWl4aHBzZWxfbXV4X3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWF4OTgwOTBfbWl4aHBsc2VsX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTUlYSFBMU0VMIE11eCIsIG1peGhwbHNlbF9tdXhfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWl4aHByc2VsX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19IUF9DT05UUk9MLCBNOTgwOTBfTUlYSFBSU0VMX1NISUZULAotCQlBUlJBWV9TSVpFKG1peGhwc2VsX211eF90ZXh0KSwgbWl4aHBzZWxfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1peGhwcnNlbF9tdXhfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0hQX0NPTlRST0wsCisJCQkgICAgTTk4MDkwX01JWEhQUlNFTF9TSElGVCwKKwkJCSAgICBtaXhocHNlbF9tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtYXg5ODA5MF9taXhocHJzZWxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJNSVhIUFJTRUwgTXV4IiwgbWl4aHByc2VsX211eF9lbnVtKTsKQEAgLTIxOTYsMTQgKzIyMTgsNiBAQAogCiAJbWF4OTgwOTAtPmNvZGVjID0gY29kZWM7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gbWF4OTgwOTAtPnJlZ21hcDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKiBSZXNldCB0aGUgY29kZWMsIHRoZSBEU1AgY29yZSwgYW5kIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KIAltYXg5ODA5MF9yZXNldChtYXg5ODA5MCk7CiAKQEAgLTIzMjksNyArMjM0Myw2IEBACiAKIAltYXg5ODA5MC0+ZGV2dHlwZSA9IGlkLT5kcml2ZXJfZGF0YTsKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBtYXg5ODA5MCk7Ci0JbWF4OTgwOTAtPmNvbnRyb2xfZGF0YSA9IGkyYzsKIAltYXg5ODA5MC0+cGRhdGEgPSBpMmMtPmRldi5wbGF0Zm9ybV9kYXRhOwogCW1heDk4MDkwLT5pcnEgPSBpMmMtPmlycTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5MC5oIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5MC5oCmluZGV4IDdlMTAzZjIuLjFhNGUyMzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwOTAuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDkwLmgKQEAgLTE1MjMsNyArMTUyMyw2IEBACiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKIAllbnVtIG1heDk4MDkwX3R5cGUgZGV2dHlwZTsKLQl2b2lkICpjb250cm9sX2RhdGE7CiAJc3RydWN0IG1heDk4MDkwX3BkYXRhICpwZGF0YTsKIAl1bnNpZ25lZCBpbnQgc3lzY2xrOwogCXVuc2lnbmVkIGludCBiY2xrOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5NS5jIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5NS5jCmluZGV4IDNiYTExNzAuLjAzZjA1MzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwOTUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDk1LmMKQEAgLTU2MCwyNSArNTYwLDI3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWF4OTgwOTVfZmx0cl9tb2RlW10gPSB7ICJWb2ljZSIsICJNdXNpYyIgfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTVfZGFpMV9maWx0ZXJfbW9kZV9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5NV8wMkVfREFJMV9GSUxURVJTLCA3LCAyLCBtYXg5ODA5NV9mbHRyX21vZGUpLAotfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTVfZGFpMl9maWx0ZXJfbW9kZV9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5NV8wMzhfREFJMl9GSUxURVJTLCA3LCAyLCBtYXg5ODA5NV9mbHRyX21vZGUpLAotfTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5NV9kYWkxX2ZpbHRlcl9tb2RlX2VudW0sCisJCQkgICAgTTk4MDk1XzAyRV9EQUkxX0ZJTFRFUlMsIDcsCisJCQkgICAgbWF4OTgwOTVfZmx0cl9tb2RlKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5NV9kYWkyX2ZpbHRlcl9tb2RlX2VudW0sCisJCQkgICAgTTk4MDk1XzAzOF9EQUkyX0ZJTFRFUlMsIDcsCisJCQkgICAgbWF4OTgwOTVfZmx0cl9tb2RlKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtYXg5ODA5NV9leHRtaWNfdGV4dFtdID0geyAiTm9uZSIsICJNSUMxIiwgIk1JQzIiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTVfZXh0bWljX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTVfMDg3X0NGR19NSUMsIDAsIDMsIG1heDk4MDk1X2V4dG1pY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5NV9leHRtaWNfZW51bSwKKwkJCSAgICBNOTgwOTVfMDg3X0NGR19NSUMsIDAsCisJCQkgICAgbWF4OTgwOTVfZXh0bWljX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWF4OTgwOTVfZXh0bWljX211eCA9CiAJU09DX0RBUE1fRU5VTSgiRXh0ZXJuYWwgTUlDIE11eCIsIG1heDk4MDk1X2V4dG1pY19lbnVtKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtYXg5ODA5NV9saW5laW5fdGV4dFtdID0geyAiSU5BIiwgIklOQiIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA5NV9saW5laW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5NV8wODZfQ0ZHX0xJTkUsIDYsIDIsIG1heDk4MDk1X2xpbmVpbl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5NV9saW5laW5fZW51bSwKKwkJCSAgICBNOTgwOTVfMDg2X0NGR19MSU5FLCA2LAorCQkJICAgIG1heDk4MDk1X2xpbmVpbl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDk1X2xpbmVpbl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxpbmVpbiBJbnB1dCBNdXgiLCBtYXg5ODA5NV9saW5laW5fZW51bSk7CkBAIC01ODYsMjQgKzU4OCwyNiBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtYXg5ODA5NV9saW5lX21vZGVfdGV4dFtdID0gewogCSJTdGVyZW8iLCAiRGlmZmVyZW50aWFsIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTVfbGluZWluX21vZGVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5NV8wODZfQ0ZHX0xJTkUsIDcsIDIsIG1heDk4MDk1X2xpbmVfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5NV9saW5laW5fbW9kZV9lbnVtLAorCQkJICAgIE05ODA5NV8wODZfQ0ZHX0xJTkUsIDcsCisJCQkgICAgbWF4OTgwOTVfbGluZV9tb2RlX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDk1X2xpbmVvdXRfbW9kZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDk1XzA4Nl9DRkdfTElORSwgNCwgMiwgbWF4OTgwOTVfbGluZV9tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDk1X2xpbmVvdXRfbW9kZV9lbnVtLAorCQkJICAgIE05ODA5NV8wODZfQ0ZHX0xJTkUsIDQsCisJCQkgICAgbWF4OTgwOTVfbGluZV9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1heDk4MDk1X2RhaV9mbHRyW10gPSB7CiAJIk9mZiIsICJFbGxpcHRpY2FsLUhQRi0xNmsiLCAiQnV0dGVyd29ydGgtSFBGLTE2ayIsCiAJIkVsbGlwdGljYWwtSFBGLThrIiwgIkJ1dHRlcndvcnRoLUhQRi04ayIsICJCdXR0ZXJ3b3J0aC1IUEYtRnMvMjQwIn07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDk1X2RhaTFfZGFjX2ZpbHRlcl9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5NV8wMkVfREFJMV9GSUxURVJTLCAwLCA2LCBtYXg5ODA5NV9kYWlfZmx0ciksCi19Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA5NV9kYWkyX2RhY19maWx0ZXJfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTVfMDM4X0RBSTJfRklMVEVSUywgMCwgNiwgbWF4OTgwOTVfZGFpX2ZsdHIpLAotfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTVfZGFpM19kYWNfZmlsdGVyX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDk1XzA0Ml9EQUkzX0ZJTFRFUlMsIDAsIDYsIG1heDk4MDk1X2RhaV9mbHRyKSwKLX07CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWF4OTgwOTVfZGFpMV9kYWNfZmlsdGVyX2VudW0sCisJCQkgICAgTTk4MDk1XzAyRV9EQUkxX0ZJTFRFUlMsIDAsCisJCQkgICAgbWF4OTgwOTVfZGFpX2ZsdHIpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDk1X2RhaTJfZGFjX2ZpbHRlcl9lbnVtLAorCQkJICAgIE05ODA5NV8wMzhfREFJMl9GSUxURVJTLCAwLAorCQkJICAgIG1heDk4MDk1X2RhaV9mbHRyKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5NV9kYWkzX2RhY19maWx0ZXJfZW51bSwKKwkJCSAgICBNOTgwOTVfMDQyX0RBSTNfRklMVEVSUywgMCwKKwkJCSAgICBtYXg5ODA5NV9kYWlfZmx0cik7CiAKIHN0YXRpYyBpbnQgbWF4OTgwOTVfbWljMXByZV9zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCkBAIC0xODYxLDcgKzE4NjUsNyBAQAogCiAJLyogTm93IHBvaW50IHRoZSBzb2NfZW51bSB0byAudGV4dHMgYXJyYXkgaXRlbXMgKi8KIAltYXg5ODA5NS0+ZXFfZW51bS50ZXh0cyA9IG1heDk4MDk1LT5lcV90ZXh0czsKLQltYXg5ODA5NS0+ZXFfZW51bS5tYXggPSBtYXg5ODA5NS0+ZXFfdGV4dGNudDsKKwltYXg5ODA5NS0+ZXFfZW51bS5pdGVtcyA9IG1heDk4MDk1LT5lcV90ZXh0Y250OwogCiAJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGNvbnRyb2xzLCBBUlJBWV9TSVpFKGNvbnRyb2xzKSk7CiAJaWYgKHJldCAhPSAwKQpAQCAtMjAxNiw3ICsyMDIwLDcgQEAKIAogCS8qIE5vdyBwb2ludCB0aGUgc29jX2VudW0gdG8gLnRleHRzIGFycmF5IGl0ZW1zICovCiAJbWF4OTgwOTUtPmJxX2VudW0udGV4dHMgPSBtYXg5ODA5NS0+YnFfdGV4dHM7Ci0JbWF4OTgwOTUtPmJxX2VudW0ubWF4ID0gbWF4OTgwOTUtPmJxX3RleHRjbnQ7CisJbWF4OTgwOTUtPmJxX2VudW0uaXRlbXMgPSBtYXg5ODA5NS0+YnFfdGV4dGNudDsKIAogCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBjb250cm9scywgQVJSQVlfU0laRShjb250cm9scykpOwogCWlmIChyZXQgIT0gMCkKQEAgLTIyMzQsMTIgKzIyMzgsNiBAQAogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJaW50IHJldCA9IDA7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogcmVzZXQgdGhlIGNvZGVjLCB0aGUgRFNQIGNvcmUsIGFuZCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCiAJbWF4OTgwOTVfcmVzZXQoY29kZWMpOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4NTAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg1MC5jCmluZGV4IDgyNzU3ZWIuLjRmZGY1YWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg1MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg1MC5jCkBAIC0zMTIsMTQgKzMxMiw2IEBACiAKIHN0YXRpYyBpbnQgbWF4OTg1MF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIGVuYWJsZSB6ZXJvLWRldGVjdCAqLwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1BWDk4NTBfR0VORVJBTF9QVVJQT1NFLCAxLCAxKTsKIAkvKiBlbmFibGUgc2xldy1yYXRlIGNvbnRyb2wgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWMxMzc4My5jIGIvc291bmQvc29jL2NvZGVjcy9tYzEzNzgzLmMKaW5kZXggNTgyYzJiYi4uMmM1OWIxZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYzEzNzgzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tYzEzNzgzLmMKQEAgLTEwNiw4ICsxMDYsNyBAQAogCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAogCQkJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJdW5zaWduZWQgaW50IHJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOwogCWludCBpOwogCkBAIC0xMjYsOCArMTI1LDcgQEAKIAkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKIAkJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwogCXVuc2lnbmVkIGludCByYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCkBAIC00MDgsOCArNDA2LDcgQEAKIAkiTUMxTCIsICJSWElOTCIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkY2xfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKDAsIDAsIEFSUkFZX1NJWkUoYWRjbF9lbnVtX3RleHQpLCBhZGNsX2VudW1fdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX1ZJUlRfREVDTChhZGNsX2VudW0sIGFkY2xfZW51bV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxlZnRfaW5wdXRfbXV4ID0KIAlTT0NfREFQTV9FTlVNX1ZJUlQoIlJvdXRlIiwgYWRjbF9lbnVtKTsKQEAgLTQxOCw4ICs0MTUsNyBAQAogCSJNQzFSIiwgIk1DMiIsICJSWElOUiIsICJUWElOIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjcl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoMCwgMCwgQVJSQVlfU0laRShhZGNyX2VudW1fdGV4dCksIGFkY3JfZW51bV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfVklSVF9ERUNMKGFkY3JfZW51bSwgYWRjcl9lbnVtX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmlnaHRfaW5wdXRfbXV4ID0KIAlTT0NfREFQTV9FTlVNX1ZJUlQoIlJvdXRlIiwgYWRjcl9lbnVtKTsKQEAgLTQzMCw4ICs0MjYsOCBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGVha2VyX2FtcF9zb3VyY2VfdGV4dFtdID0gewogCSJDT0RFQyIsICJSaWdodCIKIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BlYWtlcl9hbXBfc291cmNlLCBNQzEzNzgzX0FVRElPX1JYMCwgNCwKLQkJCQkgIHNwZWFrZXJfYW1wX3NvdXJjZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGVha2VyX2FtcF9zb3VyY2UsIE1DMTM3ODNfQVVESU9fUlgwLCA0LAorCQkJICAgIHNwZWFrZXJfYW1wX3NvdXJjZV90ZXh0KTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzcGVha2VyX2FtcF9zb3VyY2VfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJTcGVha2VyIEFtcCBTb3VyY2UgTVVYIiwgc3BlYWtlcl9hbXBfc291cmNlKTsKIApAQCAtNDM5LDggKzQzNSw4IEBACiAJIkNPREVDIiwgIk1peGVyIgogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGhlYWRzZXRfYW1wX3NvdXJjZSwgTUMxMzc4M19BVURJT19SWDAsIDExLAotCQkJCSAgaGVhZHNldF9hbXBfc291cmNlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGhlYWRzZXRfYW1wX3NvdXJjZSwgTUMxMzc4M19BVURJT19SWDAsIDExLAorCQkJICAgIGhlYWRzZXRfYW1wX3NvdXJjZV90ZXh0KTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBoZWFkc2V0X2FtcF9zb3VyY2VfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJIZWFkc2V0IEFtcCBTb3VyY2UgTVVYIiwgaGVhZHNldF9hbXBfc291cmNlKTsKIApAQCAtNTgwLDkgKzU3Niw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1jMTM3ODNfM2RfbWl4ZXJbXSA9IHsiU3RlcmVvIiwgIlBoYXNlIE1peCIsCiAJCQkJCQkiTW9ubyIsICJNb25vIE1peCJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1jMTM3ODNfZW51bV8zZF9taXhlciA9Ci0JU09DX0VOVU1fU0lOR0xFKE1DMTM3ODNfQVVESU9fUlgxLCAxNiwgQVJSQVlfU0laRShtYzEzNzgzXzNkX21peGVyKSwKLQkJCW1jMTM3ODNfM2RfbWl4ZXIpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1jMTM3ODNfZW51bV8zZF9taXhlciwKKwkJCSAgICBNQzEzNzgzX0FVRElPX1JYMSwgMTYsCisJCQkgICAgbWMxMzc4M18zZF9taXhlcik7CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtYzEzNzgzX2NvbnRyb2xfbGlzdFtdID0gewogCVNPQ19TSU5HTEUoIkxvdWRzcGVha2VyIGVuYWJsZSIsIE1DMTM3ODNfQVVESU9fUlgwLCA1LCAxLCAwKSwKQEAgLTYxNCw4ICs2MTAsOCBAQAogCXN0cnVjdCBtYzEzNzgzX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgcmV0OwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRldl9nZXRfcmVnbWFwKGNvZGVjLT5kZXYtPnBhcmVudCwgTlVMTCk7Ci0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDI0LCBTTkRfU09DX1JFR01BUCk7CisJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsCisJCQlkZXZfZ2V0X3JlZ21hcChjb2RlYy0+ZGV2LT5wYXJlbnQsIE5VTEwpKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tbDI2MTI0LmMgYi9zb3VuZC9zb2MvY29kZWNzL21sMjYxMjQuYwppbmRleCAxODVmYTNiYy4uZTY2MWU4NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tbDI2MTI0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tbDI2MTI0LmMKQEAgLTczLDExICs3MywxMSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtbDI2MTI0X2NvbXBhbmRpbmdbXSA9IHsiMTZiaXQgUENNIiwgInUtbGF3IiwKIAkJCQkJCSAgIkEtbGF3In07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWwyNjEyNF9hZGNfY29tcGFuZGluZ19lbnVtCi0JPSBTT0NfRU5VTV9TSU5HTEUoTUwyNjEyNF9TQUlfVFJBTlNfQ1RMLCA2LCAzLCBtbDI2MTI0X2NvbXBhbmRpbmcpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1sMjYxMjRfYWRjX2NvbXBhbmRpbmdfZW51bSwKKwkJCSAgICBNTDI2MTI0X1NBSV9UUkFOU19DVEwsIDYsIG1sMjYxMjRfY29tcGFuZGluZyk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWwyNjEyNF9kYWNfY29tcGFuZGluZ19lbnVtCi0JPSBTT0NfRU5VTV9TSU5HTEUoTUwyNjEyNF9TQUlfUkNWX0NUTCwgNiwgMywgbWwyNjEyNF9jb21wYW5kaW5nKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtbDI2MTI0X2RhY19jb21wYW5kaW5nX2VudW0sCisJCQkgICAgTUwyNjEyNF9TQUlfUkNWX0NUTCwgNiwgbWwyNjEyNF9jb21wYW5kaW5nKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1sMjYxMjRfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX1NJTkdMRV9UTFYoIkNhcHR1cmUgRGlnaXRhbCBWb2x1bWUiLCBNTDI2MTI0X1JFQ09SRF9ESUdfVk9MLCAwLApAQCAtMTM2LDggKzEzNiw4IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1sMjYxMjRfaW5wdXRfc2VsZWN0W10gPSB7IkFuYWxvZyBNSUMgU2luZ2xlRW5kZWQgaW4iLAogCQkJCSJEaWdpdGFsIE1JQyBpbiIsICJBbmFsb2cgTUlDIERpZmZlcmVudGlhbCBpbiJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1sMjYxMjRfaW5zZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE1MMjYxMjRfTUlDX0lGX0NUTCwgMCwgMywgbWwyNjEyNF9pbnB1dF9zZWxlY3QpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1sMjYxMjRfaW5zZWxfZW51bSwKKwkJCSAgICBNTDI2MTI0X01JQ19JRl9DVEwsIDAsIG1sMjYxMjRfaW5wdXRfc2VsZWN0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1sMjYxMjRfaW5wdXRfbXV4X2NvbnRyb2xzID0KIAlTT0NfREFQTV9FTlVNKCJJbnB1dCBTZWxlY3QiLCBtbDI2MTI0X2luc2VsX2VudW0pOwpAQCAtNTg2LDE2ICs1ODYsNiBAQAogCiBzdGF0aWMgaW50IG1sMjYxMjRfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCByZXQ7Ci0Jc3RydWN0IG1sMjYxMjRfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBwcml2LT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgNywgOSwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKiBTb2Z0d2FyZSBSZXNldCAqLwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1MMjYxMjRfU1dfUlNULCAweDAxLCAxKTsKIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNTDI2MTI0X1NXX1JTVCwgMHgwMSwgMCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3BjbTE2ODEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtMTY4MS5jCmluZGV4IDczZjljMzYuLmU0Mjc1NDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtMTY4MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtMTY4MS5jCkBAIC0xNzIsMTYgKzE3MiwyMSBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJc3RydWN0IHBjbTE2ODFfcHJpdmF0ZSAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCB2YWwgPSAwLCByZXQ7Ci0JaW50IHBjbV9mb3JtYXQgPSBwYXJhbXNfZm9ybWF0KHBhcmFtcyk7CiAKIAlwcml2LT5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKIAogCXN3aXRjaCAocHJpdi0+Zm9ybWF0ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKIAljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6Ci0JCWlmIChwY21fZm9ybWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKQotCQkJdmFsID0gMHgwMDsKLQkJZWxzZSBpZiAocGNtX2Zvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSkKLQkJCXZhbCA9IDB4MDM7CisJCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKKwkJY2FzZSAyNDoKKwkJCXZhbCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCXZhbCA9IDM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19EQUlGTVRfSTJTOgogCQl2YWwgPSAweDA0OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9wY20xNzkyYS5jIGIvc291bmQvc29jL2NvZGVjcy9wY20xNzkyYS5jCmluZGV4IDcxNDY2NTNhLi4zYTgwYmE0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3BjbTE3OTJhLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9wY20xNzkyYS5jCkBAIC0xMDcsMjQgKzEwNywzNSBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJc3RydWN0IHBjbTE3OTJhX3ByaXZhdGUgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgdmFsID0gMCwgcmV0OwotCWludCBwY21fZm9ybWF0ID0gcGFyYW1zX2Zvcm1hdChwYXJhbXMpOwogCiAJcHJpdi0+cmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CiAKIAlzd2l0Y2ggKHByaXYtPmZvcm1hdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgotCQlpZiAocGNtX2Zvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRSB8fAotCQkgICAgcGNtX2Zvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRSkKLQkJCXZhbCA9IDB4MDI7Ci0JCWVsc2UgaWYgKHBjbV9mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUpCi0JCQl2YWwgPSAweDAwOworCQlzd2l0Y2ggKHBhcmFtc193aWR0aChwYXJhbXMpKSB7CisJCWNhc2UgMjQ6CisJCWNhc2UgMzI6CisJCQl2YWwgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQl2YWwgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCQlicmVhazsKIAljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKLQkJaWYgKHBjbV9mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEUgfHwKLQkJICAgIHBjbV9mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9TMzJfTEUpCi0JCQl2YWwgPSAweDA1OwotCQllbHNlIGlmIChwY21fZm9ybWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFKQotCQkJdmFsID0gMHgwNDsKKwkJc3dpdGNoIChwYXJhbXNfd2lkdGgocGFyYW1zKSkgeworCQljYXNlIDI0OgorCQljYXNlIDMyOgorCQkJdmFsID0gNTsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJdmFsID0gNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBEQUkgZm9ybWF0XG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC1pMmMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDYyMjMwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9wY201MTJ4LWkyYy5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBQQ001MTJ4IENPREVDcworICoKKyAqIEF1dGhvcjoJTWFyayBCcm93biA8YnJvb25pZUBsaW5hcm8ub3JnPgorICoJCUNvcHlyaWdodCAyMDE0IExpbmFybyBMdGQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworI2luY2x1ZGUgInBjbTUxMnguaCIKKworc3RhdGljIGludCBwY201MTJ4X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCisJcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCAmcGNtNTEyeF9yZWdtYXApOworCWlmIChJU19FUlIocmVnbWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKKworCXJldHVybiBwY201MTJ4X3Byb2JlKCZpMmMtPmRldiwgcmVnbWFwKTsKK30KKworc3RhdGljIGludCBwY201MTJ4X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKK3sKKwlwY201MTJ4X3JlbW92ZSgmaTJjLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcGNtNTEyeF9pMmNfaWRbXSA9IHsKKwl7ICJwY201MTIxIiwgfSwKKwl7ICJwY201MTIyIiwgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcGNtNTEyeF9pMmNfaWQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBwY201MTJ4X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ0aSxwY201MTIxIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHBjbTUxMjIiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHBjbTUxMnhfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcGNtNTEyeF9pMmNfZHJpdmVyID0geworCS5wcm9iZSAJCT0gcGNtNTEyeF9pMmNfcHJvYmUsCisJLnJlbW92ZSAJPSBwY201MTJ4X2kyY19yZW1vdmUsCisJLmlkX3RhYmxlCT0gcGNtNTEyeF9pMmNfaWQsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInBjbTUxMngiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gcGNtNTEyeF9vZl9tYXRjaCwKKwkJLnBtICAgICA9ICZwY201MTJ4X3BtX29wcywKKwl9LAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIocGNtNTEyeF9pMmNfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIFBDTTUxMnggY29kZWMgZHJpdmVyIC0gSTJDIik7CitNT0RVTEVfQVVUSE9SKCJNYXJrIEJyb3duIDxicm9vbmllQGxpbmFyby5vcmc+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3BjbTUxMngtc3BpLmMgYi9zb3VuZC9zb2MvY29kZWNzL3BjbTUxMngtc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI5NzA1OAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC1zcGkuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogRHJpdmVyIGZvciB0aGUgUENNNTEyeCBDT0RFQ3MKKyAqCisgKiBBdXRob3I6CU1hcmsgQnJvd24gPGJyb29uaWVAbGluYXJvLm9yZz4KKyAqCQlDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjaW5jbHVkZSAicGNtNTEyeC5oIgorCitzdGF0aWMgaW50IHBjbTUxMnhfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCWludCByZXQ7CisKKwlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZwY201MTJ4X3JlZ21hcCk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIocmVnbWFwKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcGNtNTEyeF9wcm9iZSgmc3BpLT5kZXYsIHJlZ21hcCk7Cit9CisKK3N0YXRpYyBpbnQgcGNtNTEyeF9zcGlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJcGNtNTEyeF9yZW1vdmUoJnNwaS0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIHBjbTUxMnhfc3BpX2lkW10gPSB7CisJeyAicGNtNTEyMSIsIH0sCisJeyAicGNtNTEyMiIsIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoc3BpLCBwY201MTJ4X3NwaV9pZCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBjbTUxMnhfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInRpLHBjbTUxMjEiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAidGkscGNtNTEyMiIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcGNtNTEyeF9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBwY201MTJ4X3NwaV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHBjbTUxMnhfc3BpX3Byb2JlLAorCS5yZW1vdmUJCT0gcGNtNTEyeF9zcGlfcmVtb3ZlLAorCS5pZF90YWJsZQk9IHBjbTUxMnhfc3BpX2lkLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInBjbTUxMngiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gcGNtNTEyeF9vZl9tYXRjaCwKKwkJLnBtICAgICA9ICZwY201MTJ4X3BtX29wcywKKwl9LAorfTsKKworbW9kdWxlX3NwaV9kcml2ZXIocGNtNTEyeF9zcGlfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC5jIGIvc291bmQvc29jL2NvZGVjcy9wY201MTJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0YzBjNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC5jCkBAIC0wLDAgKzEsNTg5IEBACisvKgorICogRHJpdmVyIGZvciB0aGUgUENNNTEyeCBDT0RFQ3MKKyAqCisgKiBBdXRob3I6CU1hcmsgQnJvd24gPGJyb29uaWVAbGluYXJvLm9yZz4KKyAqCQlDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKworI2luY2x1ZGUgInBjbTUxMnguaCIKKworI2RlZmluZSBQQ001MTJ4X05VTV9TVVBQTElFUyAzCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBjbTUxMnhfc3VwcGx5X25hbWVzW1BDTTUxMnhfTlVNX1NVUFBMSUVTXSA9IHsKKwkiQVZERCIsCisJIkRWREQiLAorCSJDUFZERCIsCit9OworCitzdHJ1Y3QgcGNtNTEyeF9wcml2IHsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IGNsayAqc2NsazsKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSBzdXBwbGllc1tQQ001MTJ4X05VTV9TVVBQTElFU107CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHN1cHBseV9uYltQQ001MTJ4X05VTV9TVVBQTElFU107Cit9OworCisvKgorICogV2UgY2FuJ3QgdXNlIHRoZSBzYW1lIG5vdGlmaWVyIGJsb2NrIGZvciBtb3JlIHRoYW4gb25lIHN1cHBseSBhbmQKKyAqIHRoZXJlJ3Mgbm8gd2F5IEkgY2FuIHNlZSB0byBnZXQgZnJvbSBhIGNhbGxiYWNrIHRvIHRoZSBjYWxsZXIKKyAqIGV4Y2VwdCBjb250YWluZXJfb2YoKS4KKyAqLworI2RlZmluZSBQQ001MTJ4X1JFR1VMQVRPUl9FVkVOVChuKSBcCitzdGF0aWMgaW50IHBjbTUxMnhfcmVndWxhdG9yX2V2ZW50XyMjbihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCBcCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqZGF0YSkgICAgXAoreyBcCisJc3RydWN0IHBjbTUxMnhfcHJpdiAqcGNtNTEyeCA9IGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IHBjbTUxMnhfcHJpdiwgXAorCQkJCQkJICAgIHN1cHBseV9uYltuXSk7IFwKKwlpZiAoZXZlbnQgJiBSRUdVTEFUT1JfRVZFTlRfRElTQUJMRSkgeyBcCisJCXJlZ2NhY2hlX21hcmtfZGlydHkocGNtNTEyeC0+cmVnbWFwKTsJXAorCQlyZWdjYWNoZV9jYWNoZV9vbmx5KHBjbTUxMngtPnJlZ21hcCwgdHJ1ZSk7CVwKKwl9IFwKKwlyZXR1cm4gMDsgXAorfQorCitQQ001MTJ4X1JFR1VMQVRPUl9FVkVOVCgwKQorUENNNTEyeF9SRUdVTEFUT1JfRVZFTlQoMSkKK1BDTTUxMnhfUkVHVUxBVE9SX0VWRU5UKDIpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgcGNtNTEyeF9yZWdfZGVmYXVsdHNbXSA9IHsKKwl7IFBDTTUxMnhfUkVTRVQsICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfUE9XRVIsICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfTVVURSwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfRFNQLCAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfUExMX1JFRiwgICAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfREFDX1JPVVRJTkcsICAgICAgIDB4MTEgfSwKKwl7IFBDTTUxMnhfRFNQX1BST0dSQU0sICAgICAgIDB4MDEgfSwKKwl7IFBDTTUxMnhfQ0xLREVULCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfQVVUT19NVVRFLCAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfRVJST1JfREVURUNULCAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfRElHSVRBTF9WT0xVTUVfMSwgIDB4MDAgfSwKKwl7IFBDTTUxMnhfRElHSVRBTF9WT0xVTUVfMiwgIDB4MzAgfSwKKwl7IFBDTTUxMnhfRElHSVRBTF9WT0xVTUVfMywgIDB4MzAgfSwKKwl7IFBDTTUxMnhfRElHSVRBTF9NVVRFXzEsICAgIDB4MjIgfSwKKwl7IFBDTTUxMnhfRElHSVRBTF9NVVRFXzIsICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfRElHSVRBTF9NVVRFXzMsICAgIDB4MDcgfSwKKwl7IFBDTTUxMnhfT1VUUFVUX0FNUExJVFVERSwgIDB4MDAgfSwKKwl7IFBDTTUxMnhfQU5BTE9HX0dBSU5fQ1RSTCwgIDB4MDAgfSwKKwl7IFBDTTUxMnhfVU5ERVJWT0xUQUdFX1BST1QsIDB4MDAgfSwKKwl7IFBDTTUxMnhfQU5BTE9HX01VVEVfQ1RSTCwgIDB4MDAgfSwKKwl7IFBDTTUxMnhfQU5BTE9HX0dBSU5fQk9PU1QsIDB4MDAgfSwKKwl7IFBDTTUxMnhfVkNPTV9DVFJMXzEsICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfVkNPTV9DVFJMXzIsICAgICAgIDB4MDEgfSwKK307CisKK3N0YXRpYyBib29sIHBjbTUxMnhfcmVhZGFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBQQ001MTJ4X1JFU0VUOgorCWNhc2UgUENNNTEyeF9QT1dFUjoKKwljYXNlIFBDTTUxMnhfTVVURToKKwljYXNlIFBDTTUxMnhfUExMX0VOOgorCWNhc2UgUENNNTEyeF9TUElfTUlTT19GVU5DVElPTjoKKwljYXNlIFBDTTUxMnhfRFNQOgorCWNhc2UgUENNNTEyeF9HUElPX0VOOgorCWNhc2UgUENNNTEyeF9CQ0xLX0xSQ0xLX0NGRzoKKwljYXNlIFBDTTUxMnhfRFNQX0dQSU9fSU5QVVQ6CisJY2FzZSBQQ001MTJ4X01BU1RFUl9NT0RFOgorCWNhc2UgUENNNTEyeF9QTExfUkVGOgorCWNhc2UgUENNNTEyeF9QTExfQ09FRkZfMDoKKwljYXNlIFBDTTUxMnhfUExMX0NPRUZGXzE6CisJY2FzZSBQQ001MTJ4X1BMTF9DT0VGRl8yOgorCWNhc2UgUENNNTEyeF9QTExfQ09FRkZfMzoKKwljYXNlIFBDTTUxMnhfUExMX0NPRUZGXzQ6CisJY2FzZSBQQ001MTJ4X0RTUF9DTEtESVY6CisJY2FzZSBQQ001MTJ4X0RBQ19DTEtESVY6CisJY2FzZSBQQ001MTJ4X05DUF9DTEtESVY6CisJY2FzZSBQQ001MTJ4X09TUl9DTEtESVY6CisJY2FzZSBQQ001MTJ4X01BU1RFUl9DTEtESVZfMToKKwljYXNlIFBDTTUxMnhfTUFTVEVSX0NMS0RJVl8yOgorCWNhc2UgUENNNTEyeF9GU19TUEVFRF9NT0RFOgorCWNhc2UgUENNNTEyeF9JREFDXzE6CisJY2FzZSBQQ001MTJ4X0lEQUNfMjoKKwljYXNlIFBDTTUxMnhfRVJST1JfREVURUNUOgorCWNhc2UgUENNNTEyeF9JMlNfMToKKwljYXNlIFBDTTUxMnhfSTJTXzI6CisJY2FzZSBQQ001MTJ4X0RBQ19ST1VUSU5HOgorCWNhc2UgUENNNTEyeF9EU1BfUFJPR1JBTToKKwljYXNlIFBDTTUxMnhfQ0xLREVUOgorCWNhc2UgUENNNTEyeF9BVVRPX01VVEU6CisJY2FzZSBQQ001MTJ4X0RJR0lUQUxfVk9MVU1FXzE6CisJY2FzZSBQQ001MTJ4X0RJR0lUQUxfVk9MVU1FXzI6CisJY2FzZSBQQ001MTJ4X0RJR0lUQUxfVk9MVU1FXzM6CisJY2FzZSBQQ001MTJ4X0RJR0lUQUxfTVVURV8xOgorCWNhc2UgUENNNTEyeF9ESUdJVEFMX01VVEVfMjoKKwljYXNlIFBDTTUxMnhfRElHSVRBTF9NVVRFXzM6CisJY2FzZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzE6CisJY2FzZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzI6CisJY2FzZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzM6CisJY2FzZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzQ6CisJY2FzZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzU6CisJY2FzZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzY6CisJY2FzZSBQQ001MTJ4X0dQSU9fQ09OVFJPTF8xOgorCWNhc2UgUENNNTEyeF9HUElPX0NPTlRST0xfMjoKKwljYXNlIFBDTTUxMnhfT1ZFUkZMT1c6CisJY2FzZSBQQ001MTJ4X1JBVEVfREVUXzE6CisJY2FzZSBQQ001MTJ4X1JBVEVfREVUXzI6CisJY2FzZSBQQ001MTJ4X1JBVEVfREVUXzM6CisJY2FzZSBQQ001MTJ4X1JBVEVfREVUXzQ6CisJY2FzZSBQQ001MTJ4X0FOQUxPR19NVVRFX0RFVDoKKwljYXNlIFBDTTUxMnhfR1BJTjoKKwljYXNlIFBDTTUxMnhfRElHSVRBTF9NVVRFX0RFVDoKKwljYXNlIFBDTTUxMnhfT1VUUFVUX0FNUExJVFVERToKKwljYXNlIFBDTTUxMnhfQU5BTE9HX0dBSU5fQ1RSTDoKKwljYXNlIFBDTTUxMnhfVU5ERVJWT0xUQUdFX1BST1Q6CisJY2FzZSBQQ001MTJ4X0FOQUxPR19NVVRFX0NUUkw6CisJY2FzZSBQQ001MTJ4X0FOQUxPR19HQUlOX0JPT1NUOgorCWNhc2UgUENNNTEyeF9WQ09NX0NUUkxfMToKKwljYXNlIFBDTTUxMnhfVkNPTV9DVFJMXzI6CisJY2FzZSBQQ001MTJ4X0NSQU1fQ1RSTDoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJLyogVGhlcmUgYXJlIDI1NiByYXcgcmVnaXN0ZXIgYWRkcmVzc2VzICovCisJCXJldHVybiByZWcgPCAweGZmOworCX0KK30KKworc3RhdGljIGJvb2wgcGNtNTEyeF92b2xhdGlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFBDTTUxMnhfUExMX0VOOgorCWNhc2UgUENNNTEyeF9PVkVSRkxPVzoKKwljYXNlIFBDTTUxMnhfUkFURV9ERVRfMToKKwljYXNlIFBDTTUxMnhfUkFURV9ERVRfMjoKKwljYXNlIFBDTTUxMnhfUkFURV9ERVRfMzoKKwljYXNlIFBDTTUxMnhfUkFURV9ERVRfNDoKKwljYXNlIFBDTTUxMnhfQU5BTE9HX01VVEVfREVUOgorCWNhc2UgUENNNTEyeF9HUElOOgorCWNhc2UgUENNNTEyeF9ESUdJVEFMX01VVEVfREVUOgorCWNhc2UgUENNNTEyeF9DUkFNX0NUUkw6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCS8qIFRoZXJlIGFyZSAyNTYgcmF3IHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworCQlyZXR1cm4gcmVnIDwgMHhmZjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkaWdpdGFsX3RsdiwgLTEwMzUwLCA1MCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYW5hbG9nX3RsdiwgLTYwMCwgNjAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShib29zdF90bHYsIDAsIDgwLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwY201MTJ4X2RzcF9wcm9ncmFtX3RleHRzW10gPSB7CisJIkZJUiBpbnRlcnBvbGF0aW9uIHdpdGggZGUtZW1waGFzaXMiLAorCSJMb3cgbGF0ZW5jeSBJSVIgd2l0aCBkZS1lbXBoYXNpcyIsCisJIkZpeGVkIHByb2Nlc3MgZmxvdyIsCisJIkhpZ2ggYXR0ZW51YXRpb24gd2l0aCBkZS1lbXBoYXNpcyIsCisJIlJpbmdpbmctbGVzcyBsb3cgbGF0ZW5jeSBGSVIiLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY201MTJ4X2RzcF9wcm9ncmFtX3ZhbHVlc1tdID0geworCTEsCisJMiwKKwkzLAorCTUsCisJNywKK307CisKK3N0YXRpYyBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChwY201MTJ4X2RzcF9wcm9ncmFtLAorCQkJCSAgUENNNTEyeF9EU1BfUFJPR1JBTSwgMCwgMHgxZiwKKwkJCQkgIHBjbTUxMnhfZHNwX3Byb2dyYW1fdGV4dHMsCisJCQkJICBwY201MTJ4X2RzcF9wcm9ncmFtX3ZhbHVlcyk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNtNTEyeF9jbGtfbWlzc2luZ190ZXh0W10gPSB7CisJIjFzIiwgIjJzIiwgIjNzIiwgIjRzIiwgIjVzIiwgIjZzIiwgIjdzIiwgIjhzIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBwY201MTJ4X2Nsa19taXNzaW5nID0KKwlTT0NfRU5VTV9TSU5HTEUoUENNNTEyeF9DTEtERVQsIDAsICA4LCBwY201MTJ4X2Nsa19taXNzaW5nX3RleHQpOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBjbTUxMnhfYXV0b21fdGV4dFtdID0geworCSIyMW1zIiwgIjEwNm1zIiwgIjIxM21zIiwgIjUzM21zIiwgIjEuMDdzIiwgIjIuMTNzIiwgIjUuMzNzIiwgIjEwLjY2cyIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcGNtNTEyeF9hdXRvbV9sID0KKwlTT0NfRU5VTV9TSU5HTEUoUENNNTEyeF9BVVRPX01VVEUsIFBDTTUxMnhfQVRNTF9TSElGVCwgOCwKKwkJCXBjbTUxMnhfYXV0b21fdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcGNtNTEyeF9hdXRvbV9yID0KKwlTT0NfRU5VTV9TSU5HTEUoUENNNTEyeF9BVVRPX01VVEUsIFBDTTUxMnhfQVRNUl9TSElGVCwgOCwKKwkJCXBjbTUxMnhfYXV0b21fdGV4dCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNtNTEyeF9yYW1wX3JhdGVfdGV4dFtdID0geworCSIxIHNhbXBsZS91cGRhdGUiLCAiMiBzYW1wbGVzL3VwZGF0ZSIsICI0IHNhbXBsZXMvdXBkYXRlIiwKKwkiSW1tZWRpYXRlIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBwY201MTJ4X3ZuZGYgPQorCVNPQ19FTlVNX1NJTkdMRShQQ001MTJ4X0RJR0lUQUxfTVVURV8xLCBQQ001MTJ4X1ZOREZfU0hJRlQsIDQsCisJCQlwY201MTJ4X3JhbXBfcmF0ZV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBwY201MTJ4X3ZudWYgPQorCVNPQ19FTlVNX1NJTkdMRShQQ001MTJ4X0RJR0lUQUxfTVVURV8xLCBQQ001MTJ4X1ZOVUZfU0hJRlQsIDQsCisJCQlwY201MTJ4X3JhbXBfcmF0ZV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBwY201MTJ4X3ZlZGYgPQorCVNPQ19FTlVNX1NJTkdMRShQQ001MTJ4X0RJR0lUQUxfTVVURV8yLCBQQ001MTJ4X1ZFREZfU0hJRlQsIDQsCisJCQlwY201MTJ4X3JhbXBfcmF0ZV90ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwY201MTJ4X3JhbXBfc3RlcF90ZXh0W10gPSB7CisJIjRkQi9zdGVwIiwgIjJkQi9zdGVwIiwgIjFkQi9zdGVwIiwgIjAuNWRCL3N0ZXAiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBjbTUxMnhfdm5kcyA9CisJU09DX0VOVU1fU0lOR0xFKFBDTTUxMnhfRElHSVRBTF9NVVRFXzEsIFBDTTUxMnhfVk5EU19TSElGVCwgNCwKKwkJCXBjbTUxMnhfcmFtcF9zdGVwX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBjbTUxMnhfdm51cyA9CisJU09DX0VOVU1fU0lOR0xFKFBDTTUxMnhfRElHSVRBTF9NVVRFXzEsIFBDTTUxMnhfVk5VU19TSElGVCwgNCwKKwkJCXBjbTUxMnhfcmFtcF9zdGVwX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBjbTUxMnhfdmVkcyA9CisJU09DX0VOVU1fU0lOR0xFKFBDTTUxMnhfRElHSVRBTF9NVVRFXzIsIFBDTTUxMnhfVkVEU19TSElGVCwgNCwKKwkJCXBjbTUxMnhfcmFtcF9zdGVwX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcGNtNTEyeF9jb250cm9sc1tdID0geworU09DX0RPVUJMRV9SX1RMVigiUGxheWJhY2sgRGlnaXRhbCBWb2x1bWUiLCBQQ001MTJ4X0RJR0lUQUxfVk9MVU1FXzIsCisJCSBQQ001MTJ4X0RJR0lUQUxfVk9MVU1FXzMsIDAsIDI1NSwgMSwgZGlnaXRhbF90bHYpLAorU09DX0RPVUJMRV9UTFYoIlBsYXliYWNrIFZvbHVtZSIsIFBDTTUxMnhfQU5BTE9HX0dBSU5fQ1RSTCwKKwkgICAgICAgUENNNTEyeF9MQUdOX1NISUZULCBQQ001MTJ4X1JBR05fU0hJRlQsIDEsIDEsIGFuYWxvZ190bHYpLAorU09DX0RPVUJMRV9UTFYoIlBsYXliYWNrIEJvb3N0IFZvbHVtZSIsIFBDTTUxMnhfQU5BTE9HX0dBSU5fQk9PU1QsCisJICAgICAgIFBDTTUxMnhfQUdCTF9TSElGVCwgUENNNTEyeF9BR0JSX1NISUZULCAxLCAwLCBib29zdF90bHYpLAorU09DX0RPVUJMRSgiUGxheWJhY2sgRGlnaXRhbCBTd2l0Y2giLCBQQ001MTJ4X01VVEUsIFBDTTUxMnhfUlFNTF9TSElGVCwKKwkgICBQQ001MTJ4X1JRTVJfU0hJRlQsIDEsIDEpLAorCitTT0NfU0lOR0xFKCJEZWVtcGhhc2lzIFN3aXRjaCIsIFBDTTUxMnhfRFNQLCBQQ001MTJ4X0RFTVBfU0hJRlQsIDEsIDEpLAorU09DX1ZBTFVFX0VOVU0oIkRTUCBQcm9ncmFtIiwgcGNtNTEyeF9kc3BfcHJvZ3JhbSksCisKK1NPQ19FTlVNKCJDbG9jayBNaXNzaW5nIFBlcmlvZCIsIHBjbTUxMnhfY2xrX21pc3NpbmcpLAorU09DX0VOVU0oIkF1dG8gTXV0ZSBUaW1lIExlZnQiLCBwY201MTJ4X2F1dG9tX2wpLAorU09DX0VOVU0oIkF1dG8gTXV0ZSBUaW1lIFJpZ2h0IiwgcGNtNTEyeF9hdXRvbV9yKSwKK1NPQ19TSU5HTEUoIkF1dG8gTXV0ZSBNb25vIFN3aXRjaCIsIFBDTTUxMnhfRElHSVRBTF9NVVRFXzMsCisJICAgUENNNTEyeF9BQ1RMX1NISUZULCAxLCAwKSwKK1NPQ19ET1VCTEUoIkF1dG8gTXV0ZSBTd2l0Y2giLCBQQ001MTJ4X0RJR0lUQUxfTVVURV8zLCBQQ001MTJ4X0FNTEVfU0hJRlQsCisJICAgUENNNTEyeF9BTUxSX1NISUZULCAxLCAwKSwKKworU09DX0VOVU0oIlZvbHVtZSBSYW1wIERvd24gUmF0ZSIsIHBjbTUxMnhfdm5kZiksCitTT0NfRU5VTSgiVm9sdW1lIFJhbXAgRG93biBTdGVwIiwgcGNtNTEyeF92bmRzKSwKK1NPQ19FTlVNKCJWb2x1bWUgUmFtcCBVcCBSYXRlIiwgcGNtNTEyeF92bnVmKSwKK1NPQ19FTlVNKCJWb2x1bWUgUmFtcCBVcCBTdGVwIiwgcGNtNTEyeF92bnVzKSwKK1NPQ19FTlVNKCJWb2x1bWUgUmFtcCBEb3duIEVtZXJnZW5jeSBSYXRlIiwgcGNtNTEyeF92ZWRmKSwKK1NPQ19FTlVNKCJWb2x1bWUgUmFtcCBEb3duIEVtZXJnZW5jeSBTdGVwIiwgcGNtNTEyeF92ZWRzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBwY201MTJ4X2RhcG1fd2lkZ2V0c1tdID0geworU05EX1NPQ19EQVBNX0RBQygiREFDTCIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCksCitTTkRfU09DX0RBUE1fREFDKCJEQUNSIiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKworU05EX1NPQ19EQVBNX09VVFBVVCgiT1VUTCIpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiT1VUUiIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgcGNtNTEyeF9kYXBtX3JvdXRlc1tdID0geworCXsgIkRBQ0wiLCBOVUxMLCAiUGxheWJhY2siIH0sCisJeyAiREFDUiIsIE5VTEwsICJQbGF5YmFjayIgfSwKKworCXsgIk9VVEwiLCBOVUxMLCAiREFDTCIgfSwKKwl7ICJPVVRSIiwgTlVMTCwgIkRBQ1IiIH0sCit9OworCitzdGF0aWMgaW50IHBjbTUxMnhfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpCit7CisJc3RydWN0IHBjbTUxMnhfcHJpdiAqcGNtNTEyeCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2KTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjbTUxMngtPnJlZ21hcCwgUENNNTEyeF9QT1dFUiwKKwkJCQkJIFBDTTUxMnhfUlFTVCwgMCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlbW92ZSBzdGFuZGJ5OiAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKKwkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjbTUxMngtPnJlZ21hcCwgUENNNTEyeF9QT1dFUiwKKwkJCQkJIFBDTTUxMnhfUlFTVCwgUENNNTEyeF9SUVNUKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBzdGFuZGJ5OiAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlicmVhazsKKwl9CisKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgcGNtNTEyeF9kYWkgPSB7CisJLm5hbWUgPSAicGNtNTEyeC1oaWZpIiwKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAorCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBwY201MTJ4X2NvZGVjX2RyaXZlciA9IHsKKwkuc2V0X2JpYXNfbGV2ZWwgPSBwY201MTJ4X3NldF9iaWFzX2xldmVsLAorCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKKworCS5jb250cm9scyA9IHBjbTUxMnhfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocGNtNTEyeF9jb250cm9scyksCisJLmRhcG1fd2lkZ2V0cyA9IHBjbTUxMnhfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShwY201MTJ4X2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gcGNtNTEyeF9kYXBtX3JvdXRlcywKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShwY201MTJ4X2RhcG1fcm91dGVzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlX2NmZyBwY201MTJ4X3JhbmdlID0geworCS5uYW1lID0gIlBhZ2VzIiwgLnJhbmdlX21pbiA9IFBDTTUxMnhfVklSVF9CQVNFLAorCS5yYW5nZV9tYXggPSBQQ001MTJ4X01BWF9SRUdJU1RFUiwKKwkuc2VsZWN0b3JfcmVnID0gUENNNTEyeF9QQUdFLAorCS5zZWxlY3Rvcl9tYXNrID0gMHhmZiwKKwkud2luZG93X3N0YXJ0ID0gMCwgLndpbmRvd19sZW4gPSAweDEwMCwKK307CisKK2NvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHBjbTUxMnhfcmVnbWFwID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKKworCS5yZWFkYWJsZV9yZWcgPSBwY201MTJ4X3JlYWRhYmxlLAorCS52b2xhdGlsZV9yZWcgPSBwY201MTJ4X3ZvbGF0aWxlLAorCisJLnJhbmdlcyA9ICZwY201MTJ4X3JhbmdlLAorCS5udW1fcmFuZ2VzID0gMSwKKworCS5tYXhfcmVnaXN0ZXIgPSBQQ001MTJ4X01BWF9SRUdJU1RFUiwKKwkucmVnX2RlZmF1bHRzID0gcGNtNTEyeF9yZWdfZGVmYXVsdHMsCisJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKHBjbTUxMnhfcmVnX2RlZmF1bHRzKSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChwY201MTJ4X3JlZ21hcCk7CisKK2ludCBwY201MTJ4X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlZ21hcCAqcmVnbWFwKQoreworCXN0cnVjdCBwY201MTJ4X3ByaXYgKnBjbTUxMng7CisJaW50IGksIHJldDsKKworCXBjbTUxMnggPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IHBjbTUxMnhfcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcGNtNTEyeCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBwY201MTJ4KTsKKwlwY201MTJ4LT5yZWdtYXAgPSByZWdtYXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwY201MTJ4LT5zdXBwbGllcyk7IGkrKykKKwkJcGNtNTEyeC0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gcGNtNTEyeF9zdXBwbHlfbmFtZXNbaV07CisKKwlyZXQgPSBkZXZtX3JlZ3VsYXRvcl9idWxrX2dldChkZXYsIEFSUkFZX1NJWkUocGNtNTEyeC0+c3VwcGxpZXMpLAorCQkJCSAgICAgIHBjbTUxMngtPnN1cHBsaWVzKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwY201MTJ4LT5zdXBwbHlfbmJbMF0ubm90aWZpZXJfY2FsbCA9IHBjbTUxMnhfcmVndWxhdG9yX2V2ZW50XzA7CisJcGNtNTEyeC0+c3VwcGx5X25iWzFdLm5vdGlmaWVyX2NhbGwgPSBwY201MTJ4X3JlZ3VsYXRvcl9ldmVudF8xOworCXBjbTUxMngtPnN1cHBseV9uYlsyXS5ub3RpZmllcl9jYWxsID0gcGNtNTEyeF9yZWd1bGF0b3JfZXZlbnRfMjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBjbTUxMngtPnN1cHBsaWVzKTsgaSsrKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9yZWdpc3Rlcl9ub3RpZmllcihwY201MTJ4LT5zdXBwbGllc1tpXS5jb25zdW1lciwKKwkJCQkJCSAgJnBjbTUxMngtPnN1cHBseV9uYltpXSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2VycihkZXYsCisJCQkJIkZhaWxlZCB0byByZWdpc3RlciByZWd1bGF0b3Igbm90aWZpZXI6ICVkXG4iLAorCQkJCXJldCk7CisJCX0KKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRShwY201MTJ4LT5zdXBwbGllcyksCisJCQkJICAgIHBjbTUxMngtPnN1cHBsaWVzKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBSZXNldCB0aGUgZGV2aWNlLCB2ZXJpZnlpbmcgSS9PIGluIHRoZSBwcm9jZXNzIGZvciBJMkMgKi8KKwlyZXQgPSByZWdtYXBfd3JpdGUocmVnbWFwLCBQQ001MTJ4X1JFU0VULAorCQkJICAgUENNNTEyeF9SU1RNIHwgUENNNTEyeF9SU1RSKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVzZXQgZGV2aWNlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gcmVnbWFwX3dyaXRlKHJlZ21hcCwgUENNNTEyeF9SRVNFVCwgMCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlc2V0IGRldmljZTogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyOworCX0KKworCXBjbTUxMngtPnNjbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKHBjbTUxMngtPnNjbGspKSB7CisJCWlmIChQVFJfRVJSKHBjbTUxMngtPnNjbGspID09IC1FUFJPQkVfREVGRVIpCisJCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKworCQlkZXZfaW5mbyhkZXYsICJObyBTQ0xLLCB1c2luZyBCQ0xLOiAlbGRcbiIsCisJCQkgUFRSX0VSUihwY201MTJ4LT5zY2xrKSk7CisKKwkJLyogRGlzYWJsZSByZXBvcnRpbmcgb2YgbWlzc2luZyBTQ0xLIGFzIGFuIGVycm9yICovCisJCXJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIFBDTTUxMnhfRVJST1JfREVURUNULAorCQkJCSAgIFBDTTUxMnhfSURDSCwgUENNNTEyeF9JRENIKTsKKworCQkvKiBTd2l0Y2ggUExMIGlucHV0IHRvIEJDTEsgKi8KKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgUENNNTEyeF9QTExfUkVGLAorCQkJCSAgIFBDTTUxMnhfU1JFRiwgUENNNTEyeF9TUkVGKTsKKwl9IGVsc2UgeworCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocGNtNTEyeC0+c2Nsayk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIFNDTEs6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCS8qIERlZmF1bHQgdG8gc3RhbmRieSBtb2RlICovCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjbTUxMngtPnJlZ21hcCwgUENNNTEyeF9QT1dFUiwKKwkJCQkgUENNNTEyeF9SUVNULCBQQ001MTJ4X1JRU1QpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZXF1ZXN0IHN0YW5kYnk6ICVkXG4iLAorCQkJcmV0KTsKKwkJZ290byBlcnJfY2xrOworCX0KKworCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZShkZXYpOworCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisJcG1fcnVudGltZV9pZGxlKGRldik7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJnBjbTUxMnhfY29kZWNfZHJpdmVyLAorCQkJCSAgICAmcGNtNTEyeF9kYWksIDEpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWdpc3RlciBDT0RFQzogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX3BtOworCX0KKworCXJldHVybiAwOworCitlcnJfcG06CisJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CitlcnJfY2xrOgorCWlmICghSVNfRVJSKHBjbTUxMngtPnNjbGspKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUocGNtNTEyeC0+c2Nsayk7CitlcnI6CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHBjbTUxMngtPnN1cHBsaWVzKSwKKwkJCQkgICAgIHBjbTUxMngtPnN1cHBsaWVzKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNtNTEyeF9wcm9iZSk7CisKK3ZvaWQgcGNtNTEyeF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY201MTJ4X3ByaXYgKnBjbTUxMnggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYyhkZXYpOworCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCWlmICghSVNfRVJSKHBjbTUxMngtPnNjbGspKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUocGNtNTEyeC0+c2Nsayk7CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHBjbTUxMngtPnN1cHBsaWVzKSwKKwkJCSAgICAgICBwY201MTJ4LT5zdXBwbGllcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY201MTJ4X3JlbW92ZSk7CisKK3N0YXRpYyBpbnQgcGNtNTEyeF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNtNTEyeF9wcml2ICpwY201MTJ4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhwY201MTJ4LT5yZWdtYXAsIFBDTTUxMnhfUE9XRVIsCisJCQkJIFBDTTUxMnhfUlFQRCwgUENNNTEyeF9SUVBEKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBwb3dlciBkb3duOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUocGNtNTEyeC0+c3VwcGxpZXMpLAorCQkJCSAgICAgcGNtNTEyeC0+c3VwcGxpZXMpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBkaXNhYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIUlTX0VSUihwY201MTJ4LT5zY2xrKSkKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBjbTUxMngtPnNjbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNtNTEyeF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY201MTJ4X3ByaXYgKnBjbTUxMnggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKCFJU19FUlIocGNtNTEyeC0+c2NsaykpIHsKKwkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHBjbTUxMngtPnNjbGspOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBTQ0xLOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRShwY201MTJ4LT5zdXBwbGllcyksCisJCQkJICAgIHBjbTUxMngtPnN1cHBsaWVzKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KHBjbTUxMngtPnJlZ21hcCwgZmFsc2UpOworCXJldCA9IHJlZ2NhY2hlX3N5bmMocGNtNTEyeC0+cmVnbWFwKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc3luYyBjYWNoZTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjbTUxMngtPnJlZ21hcCwgUENNNTEyeF9QT1dFUiwKKwkJCQkgUENNNTEyeF9SUVBELCAwKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVtb3ZlIHBvd2VyIGRvd246ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBwY201MTJ4X3BtX29wcyA9IHsKKwlTRVRfUlVOVElNRV9QTV9PUFMocGNtNTEyeF9zdXNwZW5kLCBwY201MTJ4X3Jlc3VtZSwgTlVMTCkKK307CitFWFBPUlRfU1lNQk9MX0dQTChwY201MTJ4X3BtX29wcyk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBQQ001MTJ4IGNvZGVjIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTWFyayBCcm93biA8YnJvb25pZUBsaW5hcm8ub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9wY201MTJ4LmggYi9zb3VuZC9zb2MvY29kZWNzL3BjbTUxMnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWU3NmFhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9wY201MTJ4LmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBQQ001MTJ4IENPREVDcworICoKKyAqIEF1dGhvcjoJTWFyayBCcm93biA8YnJvb25pZUBsaW5hcm8ub3JnPgorICoJCUNvcHlyaWdodCAyMDE0IExpbmFybyBMdGQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfU05EX1NPQ19QQ001MTJYCisjZGVmaW5lIF9TTkRfU09DX1BDTTUxMlgKKworI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNkZWZpbmUgUENNNTEyeF9WSVJUX0JBU0UgMHgxMDAKKyNkZWZpbmUgUENNNTEyeF9QQUdFX0xFTiAgMHgxMDAKKyNkZWZpbmUgUENNNTEyeF9QQUdFX0JBU0UobikgIChQQ001MTJ4X1ZJUlRfQkFTRSArIChQQ001MTJ4X1BBR0VfTEVOICogbikpCisKKyNkZWZpbmUgUENNNTEyeF9QQUdFICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgUENNNTEyeF9SRVNFVCAgICAgICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgIDEpCisjZGVmaW5lIFBDTTUxMnhfUE9XRVIgICAgICAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgICAyKQorI2RlZmluZSBQQ001MTJ4X01VVEUgICAgICAgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAgMykKKyNkZWZpbmUgUENNNTEyeF9QTExfRU4gICAgICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgIDQpCisjZGVmaW5lIFBDTTUxMnhfU1BJX01JU09fRlVOQ1RJT04gKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgICA2KQorI2RlZmluZSBQQ001MTJ4X0RTUCAgICAgICAgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAgNykKKyNkZWZpbmUgUENNNTEyeF9HUElPX0VOICAgICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgIDgpCisjZGVmaW5lIFBDTTUxMnhfQkNMS19MUkNMS19DRkcgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgICA5KQorI2RlZmluZSBQQ001MTJ4X0RTUF9HUElPX0lOUFVUICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAxMCkKKyNkZWZpbmUgUENNNTEyeF9NQVNURVJfTU9ERSAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgMTIpCisjZGVmaW5lIFBDTTUxMnhfUExMX1JFRiAgICAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDEzKQorI2RlZmluZSBQQ001MTJ4X1BMTF9DT0VGRl8wICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAyMCkKKyNkZWZpbmUgUENNNTEyeF9QTExfQ09FRkZfMSAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgMjEpCisjZGVmaW5lIFBDTTUxMnhfUExMX0NPRUZGXzIgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDIyKQorI2RlZmluZSBQQ001MTJ4X1BMTF9DT0VGRl8zICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAyMykKKyNkZWZpbmUgUENNNTEyeF9QTExfQ09FRkZfNCAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgMjQpCisjZGVmaW5lIFBDTTUxMnhfRFNQX0NMS0RJViAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDI3KQorI2RlZmluZSBQQ001MTJ4X0RBQ19DTEtESVYgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAyOCkKKyNkZWZpbmUgUENNNTEyeF9OQ1BfQ0xLRElWICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgMjkpCisjZGVmaW5lIFBDTTUxMnhfT1NSX0NMS0RJViAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDMwKQorI2RlZmluZSBQQ001MTJ4X01BU1RFUl9DTEtESVZfMSAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAzMikKKyNkZWZpbmUgUENNNTEyeF9NQVNURVJfQ0xLRElWXzIgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgMzMpCisjZGVmaW5lIFBDTTUxMnhfRlNfU1BFRURfTU9ERSAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDM0KQorI2RlZmluZSBQQ001MTJ4X0lEQUNfMSAgICAgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAzNSkKKyNkZWZpbmUgUENNNTEyeF9JREFDXzIgICAgICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgMzYpCisjZGVmaW5lIFBDTTUxMnhfRVJST1JfREVURUNUICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDM3KQorI2RlZmluZSBQQ001MTJ4X0kyU18xICAgICAgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA0MCkKKyNkZWZpbmUgUENNNTEyeF9JMlNfMiAgICAgICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgNDEpCisjZGVmaW5lIFBDTTUxMnhfREFDX1JPVVRJTkcgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDQyKQorI2RlZmluZSBQQ001MTJ4X0RTUF9QUk9HUkFNICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA0MykKKyNkZWZpbmUgUENNNTEyeF9DTEtERVQgICAgICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgNDQpCisjZGVmaW5lIFBDTTUxMnhfQVVUT19NVVRFICAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDU5KQorI2RlZmluZSBQQ001MTJ4X0RJR0lUQUxfVk9MVU1FXzEgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA2MCkKKyNkZWZpbmUgUENNNTEyeF9ESUdJVEFMX1ZPTFVNRV8yICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgNjEpCisjZGVmaW5lIFBDTTUxMnhfRElHSVRBTF9WT0xVTUVfMyAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDYyKQorI2RlZmluZSBQQ001MTJ4X0RJR0lUQUxfTVVURV8xICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA2MykKKyNkZWZpbmUgUENNNTEyeF9ESUdJVEFMX01VVEVfMiAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgNjQpCisjZGVmaW5lIFBDTTUxMnhfRElHSVRBTF9NVVRFXzMgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDY1KQorI2RlZmluZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzEgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA4MCkKKyNkZWZpbmUgUENNNTEyeF9HUElPX09VVFBVVF8yICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgODEpCisjZGVmaW5lIFBDTTUxMnhfR1BJT19PVVRQVVRfMyAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDgyKQorI2RlZmluZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzQgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA4MykKKyNkZWZpbmUgUENNNTEyeF9HUElPX09VVFBVVF81ICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgODQpCisjZGVmaW5lIFBDTTUxMnhfR1BJT19PVVRQVVRfNiAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDg1KQorI2RlZmluZSBQQ001MTJ4X0dQSU9fQ09OVFJPTF8xICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA4NikKKyNkZWZpbmUgUENNNTEyeF9HUElPX0NPTlRST0xfMiAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgODcpCisjZGVmaW5lIFBDTTUxMnhfT1ZFUkZMT1cgICAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDkwKQorI2RlZmluZSBQQ001MTJ4X1JBVEVfREVUXzEgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA5MSkKKyNkZWZpbmUgUENNNTEyeF9SQVRFX0RFVF8yICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgOTIpCisjZGVmaW5lIFBDTTUxMnhfUkFURV9ERVRfMyAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDkzKQorI2RlZmluZSBQQ001MTJ4X1JBVEVfREVUXzQgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA5NCkKKyNkZWZpbmUgUENNNTEyeF9BTkFMT0dfTVVURV9ERVQgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAxMDgpCisjZGVmaW5lIFBDTTUxMnhfR1BJTiAgICAgICAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgMTE5KQorI2RlZmluZSBQQ001MTJ4X0RJR0lUQUxfTVVURV9ERVQgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArIDEyMCkKKworI2RlZmluZSBQQ001MTJ4X09VVFBVVF9BTVBMSVRVREUgIChQQ001MTJ4X1BBR0VfQkFTRSgxKSArICAgMSkKKyNkZWZpbmUgUENNNTEyeF9BTkFMT0dfR0FJTl9DVFJMICAoUENNNTEyeF9QQUdFX0JBU0UoMSkgKyAgIDIpCisjZGVmaW5lIFBDTTUxMnhfVU5ERVJWT0xUQUdFX1BST1QgKFBDTTUxMnhfUEFHRV9CQVNFKDEpICsgICA1KQorI2RlZmluZSBQQ001MTJ4X0FOQUxPR19NVVRFX0NUUkwgIChQQ001MTJ4X1BBR0VfQkFTRSgxKSArICAgNikKKyNkZWZpbmUgUENNNTEyeF9BTkFMT0dfR0FJTl9CT09TVCAoUENNNTEyeF9QQUdFX0JBU0UoMSkgKyAgIDcpCisjZGVmaW5lIFBDTTUxMnhfVkNPTV9DVFJMXzEgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDEpICsgICA4KQorI2RlZmluZSBQQ001MTJ4X1ZDT01fQ1RSTF8yICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgxKSArICAgOSkKKworI2RlZmluZSBQQ001MTJ4X0NSQU1fQ1RSTCAgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSg0NCkgKyAgMSkKKworI2RlZmluZSBQQ001MTJ4X01BWF9SRUdJU1RFUiAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSg0NCkgKyAgMSkKKworLyogUGFnZSAwLCBSZWdpc3RlciAxIC0gcmVzZXQgKi8KKyNkZWZpbmUgUENNNTEyeF9SU1RSICgxIDw8IDApCisjZGVmaW5lIFBDTTUxMnhfUlNUTSAoMSA8PCA0KQorCisvKiBQYWdlIDAsIFJlZ2lzdGVyIDIgLSBwb3dlciAqLworI2RlZmluZSBQQ001MTJ4X1JRUEQgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgUENNNTEyeF9SUVBEX1NISUZUIDAKKyNkZWZpbmUgUENNNTEyeF9SUVNUICAgICAgICgxIDw8IDQpCisjZGVmaW5lIFBDTTUxMnhfUlFTVF9TSElGVCA0CisKKy8qIFBhZ2UgMCwgUmVnaXN0ZXIgMyAtIG11dGUgKi8KKyNkZWZpbmUgUENNNTEyeF9SUU1SX1NISUZUIDAKKyNkZWZpbmUgUENNNTEyeF9SUU1MX1NISUZUIDQKKworLyogUGFnZSAwLCBSZWdpc3RlciA0IC0gUExMICovCisjZGVmaW5lIFBDTTUxMnhfUExDRSAgICAgICAoMSA8PCAwKQorI2RlZmluZSBQQ001MTJ4X1JMQ0VfU0hJRlQgMAorI2RlZmluZSBQQ001MTJ4X1BMQ0sgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgUENNNTEyeF9QTENLX1NISUZUIDQKKworLyogUGFnZSAwLCBSZWdpc3RlciA3IC0gRFNQICovCisjZGVmaW5lIFBDTTUxMnhfU0RTTCAgICAgICAoMSA8PCAwKQorI2RlZmluZSBQQ001MTJ4X1NEU0xfU0hJRlQgMAorI2RlZmluZSBQQ001MTJ4X0RFTVAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgUENNNTEyeF9ERU1QX1NISUZUIDQKKworLyogUGFnZSAwLCBSZWdpc3RlciAxMyAtIFBMTCByZWZlcmVuY2UgKi8KKyNkZWZpbmUgUENNNTEyeF9TUkVGICgxIDw8IDQpCisKKy8qIFBhZ2UgMCwgUmVnaXN0ZXIgMzcgLSBFcnJvciBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUENNNTEyeF9JUExLICgxIDw8IDApCisjZGVmaW5lIFBDTTUxMnhfRENBUyAoMSA8PCAxKQorI2RlZmluZSBQQ001MTJ4X0lEQ00gKDEgPDwgMikKKyNkZWZpbmUgUENNNTEyeF9JRENIICgxIDw8IDMpCisjZGVmaW5lIFBDTTUxMnhfSURTSyAoMSA8PCA0KQorI2RlZmluZSBQQ001MTJ4X0lEQksgKDEgPDwgNSkKKyNkZWZpbmUgUENNNTEyeF9JREZTICgxIDw8IDYpCisKKy8qIFBhZ2UgMCwgUmVnaXN0ZXIgNDIgLSBEQUMgcm91dGluZyAqLworI2RlZmluZSBQQ001MTJ4X0FVUFJfU0hJRlQgMAorI2RlZmluZSBQQ001MTJ4X0FVUExfU0hJRlQgNAorCisvKiBQYWdlIDAsIFJlZ2lzdGVyIDU5IC0gYXV0byBtdXRlICovCisjZGVmaW5lIFBDTTUxMnhfQVRNUl9TSElGVCAwCisjZGVmaW5lIFBDTTUxMnhfQVRNTF9TSElGVCA0CisKKy8qIFBhZ2UgMCwgUmVnaXN0ZXIgNjMgLSByYW1wIHJhdGVzICovCisjZGVmaW5lIFBDTTUxMnhfVk5ERl9TSElGVCA2CisjZGVmaW5lIFBDTTUxMnhfVk5EU19TSElGVCA0CisjZGVmaW5lIFBDTTUxMnhfVk5VRl9TSElGVCAyCisjZGVmaW5lIFBDTTUxMnhfVk5VU19TSElGVCAwCisKKy8qIFBhZ2UgMCwgUmVnaXN0ZXIgNjQgLSBlbWVyZ2VuY3kgcmFtcCByYXRlcyAqLworI2RlZmluZSBQQ001MTJ4X1ZFREZfU0hJRlQgNgorI2RlZmluZSBQQ001MTJ4X1ZFRFNfU0hJRlQgNAorCisvKiBQYWdlIDAsIFJlZ2lzdGVyIDY1IC0gRGlnaXRhbCBtdXRlIGVuYWJsZXMgKi8KKyNkZWZpbmUgUENNNTEyeF9BQ1RMX1NISUZUIDIKKyNkZWZpbmUgUENNNTEyeF9BTUxFX1NISUZUIDEKKyNkZWZpbmUgUENNNTEyeF9BTUxSX1NISUZUIDAKKworLyogUGFnZSAxLCBSZWdpc3RlciAyIC0gYW5hbG9nIHZvbHVtZSBjb250cm9sICovCisjZGVmaW5lIFBDTTUxMnhfUkFHTl9TSElGVCAwCisjZGVmaW5lIFBDTTUxMnhfTEFHTl9TSElGVCA0CisKKy8qIFBhZ2UgMSwgUmVnaXN0ZXIgNyAtIGFuYWxvZyBib29zdCBjb250cm9sICovCisjZGVmaW5lIFBDTTUxMnhfQUdCUl9TSElGVCAwCisjZGVmaW5lIFBDTTUxMnhfQUdCTF9TSElGVCA0CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBwY201MTJ4X3BtX29wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBwY201MTJ4X3JlZ21hcDsKKworaW50IHBjbTUxMnhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApOwordm9pZCBwY201MTJ4X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjMxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTYzMS5jCmluZGV4IDkxMmM5Y2IuLmQ0YzIyOWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjMxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2MzEuYwpAQCAtMjEwLDI2ICsyMTAsMjIgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpydDU2MzFfaW5wdXRfbW9kZVtdID0gewogCSJTaW5nbGUgZW5kZWQiLCAiRGlmZmVyZW50aWFsIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfbWljMV9tb2RlX2VudW0sIFJUNTYzMV9NSUNfQ1RSTF8xLAotCVJUNTYzMV9NSUMxX0RJRkZfSU5QVVRfU0hJRlQsIHJ0NTYzMV9pbnB1dF9tb2RlKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2MzFfbWljMV9tb2RlX2VudW0sIFJUNTYzMV9NSUNfQ1RSTF8xLAorCQkJICAgIFJUNTYzMV9NSUMxX0RJRkZfSU5QVVRfU0hJRlQsIHJ0NTYzMV9pbnB1dF9tb2RlKTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9taWMyX21vZGVfZW51bSwgUlQ1NjMxX01JQ19DVFJMXzEsCi0JUlQ1NjMxX01JQzJfRElGRl9JTlBVVF9TSElGVCwgcnQ1NjMxX2lucHV0X21vZGUpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9taWMyX21vZGVfZW51bSwgUlQ1NjMxX01JQ19DVFJMXzEsCisJCQkgICAgUlQ1NjMxX01JQzJfRElGRl9JTlBVVF9TSElGVCwgcnQ1NjMxX2lucHV0X21vZGUpOwogCiAvKiBNT05PIElucHV0IFR5cGUgKi8KLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfbW9ub2luX21vZGVfZW51bSwgUlQ1NjMxX01PTk9fSU5QVVRfVk9MLAotCVJUNTYzMV9NT05PX0RJRkZfSU5QVVRfU0hJRlQsIHJ0NTYzMV9pbnB1dF9tb2RlKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2MzFfbW9ub2luX21vZGVfZW51bSwgUlQ1NjMxX01PTk9fSU5QVVRfVk9MLAorCQkJICAgIFJUNTYzMV9NT05PX0RJRkZfSU5QVVRfU0hJRlQsIHJ0NTYzMV9pbnB1dF9tb2RlKTsKIAogLyogU1BLIFJhdGlvIEdhaW4gQ29udHJvbCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9zcGtfcmF0aW9bXSA9IHsiMS4wMHgiLCAiMS4wOXgiLCAiMS4yN3giLCAiMS40NHgiLAogCQkJIjEuNTZ4IiwgIjEuNjh4IiwgIjEuOTl4IiwgIjIuMzR4In07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfc3BrX3JhdGlvX2VudW0sIFJUNTYzMV9HRU5fUFVSX0NUUkxfUkVHLAotCVJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfU0hJRlQsIHJ0NTYzMV9zcGtfcmF0aW8pOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9zcGtfcmF0aW9fZW51bSwgUlQ1NjMxX0dFTl9QVVJfQ1RSTF9SRUcsCisJCQkgICAgUlQ1NjMxX1NQS19BTVBfUkFUSU9fQ1RSTF9TSElGVCwgcnQ1NjMxX3Nwa19yYXRpbyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfc25kX2NvbnRyb2xzW10gPSB7CiAJLyogTUlDICovCkBAIC03NTksOSArNzU1LDggQEAKIC8qIExlZnQgU1BLIFZvbHVtZSBJbnB1dCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9zcGt2b2xsX3NlbFtdID0geyJWbWlkIiwgIlNQS01JWEwifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9zcGt2b2xsX2VudW0sIFJUNTYzMV9TUEtfT1VUX1ZPTCwKLQlSVDU2MzFfTF9FTl9TSElGVCwgcnQ1NjMxX3Nwa3ZvbGxfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2MzFfc3Brdm9sbF9lbnVtLCBSVDU2MzFfU1BLX09VVF9WT0wsCisJCQkgICAgUlQ1NjMxX0xfRU5fU0hJRlQsIHJ0NTYzMV9zcGt2b2xsX3NlbCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfc3Brdm9sbF9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiTGVmdCBTUEtWT0wgU1JDIiwgcnQ1NjMxX3Nwa3ZvbGxfZW51bSk7CkBAIC03NjksOSArNzY0LDggQEAKIC8qIExlZnQgSFAgVm9sdW1lIElucHV0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX2hwdm9sbF9zZWxbXSA9IHsiVm1pZCIsICJPVVRNSVhMIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfaHB2b2xsX2VudW0sIFJUNTYzMV9IUF9PVVRfVk9MLAotCVJUNTYzMV9MX0VOX1NISUZULCBydDU2MzFfaHB2b2xsX3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjMxX2hwdm9sbF9lbnVtLCBSVDU2MzFfSFBfT1VUX1ZPTCwKKwkJCSAgICBSVDU2MzFfTF9FTl9TSElGVCwgcnQ1NjMxX2hwdm9sbF9zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX2hwdm9sbF9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiTGVmdCBIUFZPTCBTUkMiLCBydDU2MzFfaHB2b2xsX2VudW0pOwpAQCAtNzc5LDkgKzc3Myw4IEBACiAvKiBMZWZ0IE91dCBWb2x1bWUgSW5wdXQgKi8KIHN0YXRpYyBjb25zdCBjaGFyICpydDU2MzFfb3V0dm9sbF9zZWxbXSA9IHsiVm1pZCIsICJPVVRNSVhMIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfb3V0dm9sbF9lbnVtLCBSVDU2MzFfTU9OT19BWE9fMV8yX1ZPTCwKLQlSVDU2MzFfTF9FTl9TSElGVCwgcnQ1NjMxX291dHZvbGxfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2MzFfb3V0dm9sbF9lbnVtLCBSVDU2MzFfTU9OT19BWE9fMV8yX1ZPTCwKKwkJCSAgICBSVDU2MzFfTF9FTl9TSElGVCwgcnQ1NjMxX291dHZvbGxfc2VsKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9vdXR2b2xsX211eF9jb250cm9sID0KIAlTT0NfREFQTV9FTlVNKCJMZWZ0IE9VVFZPTCBTUkMiLCBydDU2MzFfb3V0dm9sbF9lbnVtKTsKQEAgLTc4OSw5ICs3ODIsOCBAQAogLyogUmlnaHQgT3V0IFZvbHVtZSBJbnB1dCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9vdXR2b2xyX3NlbFtdID0geyJWbWlkIiwgIk9VVE1JWFIifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9vdXR2b2xyX2VudW0sIFJUNTYzMV9NT05PX0FYT18xXzJfVk9MLAotCVJUNTYzMV9SX0VOX1NISUZULCBydDU2MzFfb3V0dm9scl9zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9vdXR2b2xyX2VudW0sIFJUNTYzMV9NT05PX0FYT18xXzJfVk9MLAorCQkJICAgIFJUNTYzMV9SX0VOX1NISUZULCBydDU2MzFfb3V0dm9scl9zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX291dHZvbHJfbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIlJpZ2h0IE9VVFZPTCBTUkMiLCBydDU2MzFfb3V0dm9scl9lbnVtKTsKQEAgLTc5OSw5ICs3OTEsOCBAQAogLyogUmlnaHQgSFAgVm9sdW1lIElucHV0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX2hwdm9scl9zZWxbXSA9IHsiVm1pZCIsICJPVVRNSVhSIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfaHB2b2xyX2VudW0sIFJUNTYzMV9IUF9PVVRfVk9MLAotCVJUNTYzMV9SX0VOX1NISUZULCBydDU2MzFfaHB2b2xyX3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjMxX2hwdm9scl9lbnVtLCBSVDU2MzFfSFBfT1VUX1ZPTCwKKwkJCSAgICBSVDU2MzFfUl9FTl9TSElGVCwgcnQ1NjMxX2hwdm9scl9zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX2hwdm9scl9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiUmlnaHQgSFBWT0wgU1JDIiwgcnQ1NjMxX2hwdm9scl9lbnVtKTsKQEAgLTgwOSw5ICs4MDAsOCBAQAogLyogUmlnaHQgU1BLIFZvbHVtZSBJbnB1dCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9zcGt2b2xyX3NlbFtdID0geyJWbWlkIiwgIlNQS01JWFIifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9zcGt2b2xyX2VudW0sIFJUNTYzMV9TUEtfT1VUX1ZPTCwKLQlSVDU2MzFfUl9FTl9TSElGVCwgcnQ1NjMxX3Nwa3ZvbHJfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2MzFfc3Brdm9scl9lbnVtLCBSVDU2MzFfU1BLX09VVF9WT0wsCisJCQkgICAgUlQ1NjMxX1JfRU5fU0hJRlQsIHJ0NTYzMV9zcGt2b2xyX3NlbCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfc3Brdm9scl9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiUmlnaHQgU1BLVk9MIFNSQyIsIHJ0NTYzMV9zcGt2b2xyX2VudW0pOwpAQCAtODIwLDkgKzgxMCw4IEBACiBzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX3Nwb2xfc3JjX3NlbFtdID0gewogCSJTUE9MTUlYIiwgIk1PTk9JTl9SWCIsICJWREFDIiwgIkRBQ0wifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9zcG9sX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCi0JUlQ1NjMxX1NQS19MX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9zcG9sX3NyY19zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9zcG9sX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCisJCQkgICAgUlQ1NjMxX1NQS19MX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9zcG9sX3NyY19zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX3Nwb2xfbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIlNQT0wgU1JDIiwgcnQ1NjMxX3Nwb2xfc3JjX2VudW0pOwpAQCAtODMxLDkgKzgyMCw4IEBACiBzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX3Nwb3Jfc3JjX3NlbFtdID0gewogCSJTUE9STUlYIiwgIk1PTk9JTl9SWCIsICJWREFDIiwgIkRBQ1IifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9zcG9yX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCi0JUlQ1NjMxX1NQS19SX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9zcG9yX3NyY19zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9zcG9yX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCisJCQkgICAgUlQ1NjMxX1NQS19SX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9zcG9yX3NyY19zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX3Nwb3JfbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIlNQT1IgU1JDIiwgcnQ1NjMxX3Nwb3Jfc3JjX2VudW0pOwpAQCAtODQxLDkgKzgyOSw4IEBACiAvKiBNT05PIElucHV0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX21vbm9fc3JjX3NlbFtdID0geyJNT05PTUlYIiwgIk1PTk9JTl9SWCIsICJWREFDIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfbW9ub19zcmNfZW51bSwgUlQ1NjMxX1NQS19NT05PX0hQX09VVF9DVFJMLAotCVJUNTYzMV9NT05PX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9tb25vX3NyY19zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9tb25vX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCisJCQkgICAgUlQ1NjMxX01PTk9fTVVYX1NFTF9TSElGVCwgcnQ1NjMxX21vbm9fc3JjX3NlbCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfbW9ub19tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiTU9OTyBTUkMiLCBydDU2MzFfbW9ub19zcmNfZW51bSk7CkBAIC04NTEsOSArODM4LDggQEAKIC8qIExlZnQgSFBPIElucHV0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX2hwbF9zcmNfc2VsW10gPSB7IkxlZnQgSFBWT0wiLCAiTGVmdCBEQUMifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9ocGxfc3JjX2VudW0sIFJUNTYzMV9TUEtfTU9OT19IUF9PVVRfQ1RSTCwKLQlSVDU2MzFfSFBfTF9NVVhfU0VMX1NISUZULCBydDU2MzFfaHBsX3NyY19zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9ocGxfc3JjX2VudW0sIFJUNTYzMV9TUEtfTU9OT19IUF9PVVRfQ1RSTCwKKwkJCSAgICBSVDU2MzFfSFBfTF9NVVhfU0VMX1NISUZULCBydDU2MzFfaHBsX3NyY19zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX2hwbF9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiSFBMIFNSQyIsIHJ0NTYzMV9ocGxfc3JjX2VudW0pOwpAQCAtODYxLDkgKzg0Nyw4IEBACiAvKiBSaWdodCBIUE8gSW5wdXQgKi8KIHN0YXRpYyBjb25zdCBjaGFyICpydDU2MzFfaHByX3NyY19zZWxbXSA9IHsiUmlnaHQgSFBWT0wiLCAiUmlnaHQgREFDIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfaHByX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCi0JUlQ1NjMxX0hQX1JfTVVYX1NFTF9TSElGVCwgcnQ1NjMxX2hwcl9zcmNfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2MzFfaHByX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCisJCQkgICAgUlQ1NjMxX0hQX1JfTVVYX1NFTF9TSElGVCwgcnQ1NjMxX2hwcl9zcmNfc2VsKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9ocHJfbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIkhQUiBTUkMiLCBydDU2MzFfaHByX3NyY19lbnVtKTsKQEAgLTE1ODUsMTUgKzE1NzAsNiBAQAogewogCXN0cnVjdCBydDU2MzFfcHJpdiAqcnQ1NjMxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJdW5zaWduZWQgaW50IHZhbDsKLQlpbnQgcmV0OwotCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHJ0NTYzMS0+cmVnbWFwOwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CiAKIAl2YWwgPSBydDU2MzFfcmVhZF9pbmRleChjb2RlYywgUlQ1NjMxX0FEREFfTUlYRVJfSU5UTF9SRUczKTsKIAlpZiAodmFsICYgMHgwMDAyKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NDAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQwLmMKaW5kZXggODg2OTI0OS4uMDA2MWFlNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU2NDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY0MC5jCkBAIC0zNjEsMjUgKzM2MSwyNCBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBydDU2NDBfZGF0YV9zZWxlY3RbXSA9IHsKIAkiTm9ybWFsIiwgImxlZnQgY29weSB0byByaWdodCIsICJyaWdodCBjb3B5IHRvIGxlZnQiLCAiU3dhcCJ9OwogCi1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX2lmMV9kYWNfZW51bSwgUlQ1NjQwX0RJR19JTkZfREFUQSwKLQkJCQlSVDU2NDBfSUYxX0RBQ19TRUxfU0ZULCBydDU2NDBfZGF0YV9zZWxlY3QpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY0MF9pZjFfZGFjX2VudW0sIFJUNTY0MF9ESUdfSU5GX0RBVEEsCisJCQkgICAgUlQ1NjQwX0lGMV9EQUNfU0VMX1NGVCwgcnQ1NjQwX2RhdGFfc2VsZWN0KTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY0MF9pZjFfYWRjX2VudW0sIFJUNTY0MF9ESUdfSU5GX0RBVEEsCi0JCQkJUlQ1NjQwX0lGMV9BRENfU0VMX1NGVCwgcnQ1NjQwX2RhdGFfc2VsZWN0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfaWYxX2FkY19lbnVtLCBSVDU2NDBfRElHX0lORl9EQVRBLAorCQkJICAgIFJUNTY0MF9JRjFfQURDX1NFTF9TRlQsIHJ0NTY0MF9kYXRhX3NlbGVjdCk7CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfaWYyX2RhY19lbnVtLCBSVDU2NDBfRElHX0lORl9EQVRBLAotCQkJCVJUNTY0MF9JRjJfREFDX1NFTF9TRlQsIHJ0NTY0MF9kYXRhX3NlbGVjdCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX2lmMl9kYWNfZW51bSwgUlQ1NjQwX0RJR19JTkZfREFUQSwKKwkJCSAgICBSVDU2NDBfSUYyX0RBQ19TRUxfU0ZULCBydDU2NDBfZGF0YV9zZWxlY3QpOwogCi1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX2lmMl9hZGNfZW51bSwgUlQ1NjQwX0RJR19JTkZfREFUQSwKLQkJCQlSVDU2NDBfSUYyX0FEQ19TRUxfU0ZULCBydDU2NDBfZGF0YV9zZWxlY3QpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY0MF9pZjJfYWRjX2VudW0sIFJUNTY0MF9ESUdfSU5GX0RBVEEsCisJCQkgICAgUlQ1NjQwX0lGMl9BRENfU0VMX1NGVCwgcnQ1NjQwX2RhdGFfc2VsZWN0KTsKIAogLyogQ2xhc3MgRCBzcGVha2VyIGdhaW4gcmF0aW8gKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnQ1NjQwX2Nsc2Rfc3BrX3JhdGlvW10gPSB7IjEuNjZ4IiwgIjEuODN4IiwgIjEuOTR4IiwKIAkiMngiLCAiMi4xMXgiLCAiMi4yMngiLCAiMi4zM3giLCAiMi40NHgiLCAiMi41NXgiLCAiMi42NngiLCAiMi43N3gifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTY0MF9jbHNkX3Nwa19yYXRpb19lbnVtLCBSVDU2NDBfQ0xTX0RfT1VULAotCVJUNTY0MF9DTFNEX1JBVElPX1NGVCwgcnQ1NjQwX2Nsc2Rfc3BrX3JhdGlvKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfY2xzZF9zcGtfcmF0aW9fZW51bSwgUlQ1NjQwX0NMU19EX09VVCwKKwkJCSAgICBSVDU2NDBfQ0xTRF9SQVRJT19TRlQsIHJ0NTY0MF9jbHNkX3Nwa19yYXRpbyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NDBfc25kX2NvbnRyb2xzW10gPSB7CiAJLyogU3BlYWtlciBPdXRwdXQgVm9sdW1lICovCkBAIC03NTMsOSArNzUyLDggQEAKIAkiRElHIE1JWCIsICJBREMiCiB9OwogCi1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCi0JcnQ1NjQwX3N0ZXJlb19hZGMxX2VudW0sIFJUNTY0MF9TVE9fQURDX01JWEVSLAotCVJUNTY0MF9BRENfMV9TUkNfU0ZULCBydDU2NDBfc3RlcmVvX2FkYzFfc3JjKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfc3RlcmVvX2FkYzFfZW51bSwgUlQ1NjQwX1NUT19BRENfTUlYRVIsCisJCQkgICAgUlQ1NjQwX0FEQ18xX1NSQ19TRlQsIHJ0NTY0MF9zdGVyZW9fYWRjMV9zcmMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjQwX3N0b19hZGNfMV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlN0ZXJlbyBBREMxIE11eCIsIHJ0NTY0MF9zdGVyZW9fYWRjMV9lbnVtKTsKQEAgLTc2NCw5ICs3NjIsOCBAQAogCSJETUlDMSIsICJETUlDMiIsICJESUcgTUlYIgogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTY0MF9zdGVyZW9fYWRjMl9lbnVtLCBSVDU2NDBfU1RPX0FEQ19NSVhFUiwKLQlSVDU2NDBfQURDXzJfU1JDX1NGVCwgcnQ1NjQwX3N0ZXJlb19hZGMyX3NyYyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX3N0ZXJlb19hZGMyX2VudW0sIFJUNTY0MF9TVE9fQURDX01JWEVSLAorCQkJICAgIFJUNTY0MF9BRENfMl9TUkNfU0ZULCBydDU2NDBfc3RlcmVvX2FkYzJfc3JjKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY0MF9zdG9fYWRjXzJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJTdGVyZW8gQURDMiBNdXgiLCBydDU2NDBfc3RlcmVvX2FkYzJfZW51bSk7CkBAIC03NzYsOSArNzczLDggQEAKIAkiTW9ubyBEQUMgTUlYTCIsICJBRENMIgogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTY0MF9tb25vX2FkY19sMV9lbnVtLCBSVDU2NDBfTU9OT19BRENfTUlYRVIsCi0JUlQ1NjQwX01PTk9fQURDX0wxX1NSQ19TRlQsIHJ0NTY0MF9tb25vX2FkY19sMV9zcmMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY0MF9tb25vX2FkY19sMV9lbnVtLCBSVDU2NDBfTU9OT19BRENfTUlYRVIsCisJCQkgICAgUlQ1NjQwX01PTk9fQURDX0wxX1NSQ19TRlQsIHJ0NTY0MF9tb25vX2FkY19sMV9zcmMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjQwX21vbm9fYWRjX2wxX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTW9ubyBBREMxIGxlZnQgc291cmNlIiwgcnQ1NjQwX21vbm9fYWRjX2wxX2VudW0pOwpAQCAtNzg3LDkgKzc4Myw4IEBACiAJIkRNSUMgTDEiLCAiRE1JQyBMMiIsICJNb25vIERBQyBNSVhMIgogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTY0MF9tb25vX2FkY19sMl9lbnVtLCBSVDU2NDBfTU9OT19BRENfTUlYRVIsCi0JUlQ1NjQwX01PTk9fQURDX0wyX1NSQ19TRlQsIHJ0NTY0MF9tb25vX2FkY19sMl9zcmMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY0MF9tb25vX2FkY19sMl9lbnVtLCBSVDU2NDBfTU9OT19BRENfTUlYRVIsCisJCQkgICAgUlQ1NjQwX01PTk9fQURDX0wyX1NSQ19TRlQsIHJ0NTY0MF9tb25vX2FkY19sMl9zcmMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjQwX21vbm9fYWRjX2wyX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTW9ubyBBREMyIGxlZnQgc291cmNlIiwgcnQ1NjQwX21vbm9fYWRjX2wyX2VudW0pOwpAQCAtNzk4LDkgKzc5Myw4IEBACiAJIk1vbm8gREFDIE1JWFIiLCAiQURDUiIKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2NDBfbW9ub19hZGNfcjFfZW51bSwgUlQ1NjQwX01PTk9fQURDX01JWEVSLAotCVJUNTY0MF9NT05PX0FEQ19SMV9TUkNfU0ZULCBydDU2NDBfbW9ub19hZGNfcjFfc3JjKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfbW9ub19hZGNfcjFfZW51bSwgUlQ1NjQwX01PTk9fQURDX01JWEVSLAorCQkJICAgIFJUNTY0MF9NT05PX0FEQ19SMV9TUkNfU0ZULCBydDU2NDBfbW9ub19hZGNfcjFfc3JjKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY0MF9tb25vX2FkY19yMV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIk1vbm8gQURDMSByaWdodCBzb3VyY2UiLCBydDU2NDBfbW9ub19hZGNfcjFfZW51bSk7CkBAIC04MDksOSArODAzLDggQEAKIAkiRE1JQyBSMSIsICJETUlDIFIyIiwgIk1vbm8gREFDIE1JWFIiCiB9OwogCi1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCi0JcnQ1NjQwX21vbm9fYWRjX3IyX2VudW0sIFJUNTY0MF9NT05PX0FEQ19NSVhFUiwKLQlSVDU2NDBfTU9OT19BRENfUjJfU1JDX1NGVCwgcnQ1NjQwX21vbm9fYWRjX3IyX3NyYyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX21vbm9fYWRjX3IyX2VudW0sIFJUNTY0MF9NT05PX0FEQ19NSVhFUiwKKwkJCSAgICBSVDU2NDBfTU9OT19BRENfUjJfU1JDX1NGVCwgcnQ1NjQwX21vbm9fYWRjX3IyX3NyYyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NDBfbW9ub19hZGNfcjJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJNb25vIEFEQzIgcmlnaHQgc291cmNlIiwgcnQ1NjQwX21vbm9fYWRjX3IyX2VudW0pOwpAQCAtODI2LDkgKzgxOSw5IEBACiAJMywKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2NDBfZGFjX2wyX2VudW0sIFJUNTY0MF9EU1BfUEFUSDIsIFJUNTY0MF9EQUNfTDJfU0VMX1NGVCwKLQkweDMsIHJ0NTY0MF9kYWNfbDJfc3JjLCBydDU2NDBfZGFjX2wyX3ZhbHVlcyk7CitzdGF0aWMgU09DX1ZBTFVFX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX2RhY19sMl9lbnVtLAorCQkJCSAgUlQ1NjQwX0RTUF9QQVRIMiwgUlQ1NjQwX0RBQ19MMl9TRUxfU0ZULAorCQkJCSAgMHgzLCBydDU2NDBfZGFjX2wyX3NyYywgcnQ1NjQwX2RhY19sMl92YWx1ZXMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjQwX2RhY19sMl9tdXggPQogCVNPQ19EQVBNX1ZBTFVFX0VOVU0oIkRBQzIgbGVmdCBjaGFubmVsIHNvdXJjZSIsIHJ0NTY0MF9kYWNfbDJfZW51bSk7CkBAIC04NDEsOSArODM0LDkgQEAKIAkwLAogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19WQUxVRV9FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTY0MF9kYWNfcjJfZW51bSwgUlQ1NjQwX0RTUF9QQVRIMiwgUlQ1NjQwX0RBQ19SMl9TRUxfU0ZULAotCTB4MywgcnQ1NjQwX2RhY19yMl9zcmMsIHJ0NTY0MF9kYWNfcjJfdmFsdWVzKTsKK3N0YXRpYyBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfZGFjX3IyX2VudW0sCisJCQkJICBSVDU2NDBfRFNQX1BBVEgyLCBSVDU2NDBfREFDX1IyX1NFTF9TRlQsCisJCQkJICAweDMsIHJ0NTY0MF9kYWNfcjJfc3JjLCBydDU2NDBfZGFjX3IyX3ZhbHVlcyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NDBfZGFjX3IyX211eCA9CiAJU09DX0RBUE1fRU5VTSgiREFDMiByaWdodCBjaGFubmVsIHNvdXJjZSIsIHJ0NTY0MF9kYWNfcjJfZW51bSk7CkBAIC04NjAsOSArODUzLDEwIEBACiAJNywKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2NDBfZGFpX2lpc19tYXBfZW51bSwgUlQ1NjQwX0kyUzFfU0RQLCBSVDU2NDBfSTJTX0lGX1NGVCwKLQkweDcsIHJ0NTY0MF9kYWlfaWlzX21hcCwgcnQ1NjQwX2RhaV9paXNfbWFwX3ZhbHVlcyk7CitzdGF0aWMgU09DX1ZBTFVFX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX2RhaV9paXNfbWFwX2VudW0sCisJCQkJICBSVDU2NDBfSTJTMV9TRFAsIFJUNTY0MF9JMlNfSUZfU0ZULAorCQkJCSAgMHg3LCBydDU2NDBfZGFpX2lpc19tYXAsCisJCQkJICBydDU2NDBfZGFpX2lpc19tYXBfdmFsdWVzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY0MF9kYWlfbXV4ID0KIAlTT0NfREFQTV9WQUxVRV9FTlVNKCJEQUkgc2VsZWN0IiwgcnQ1NjQwX2RhaV9paXNfbWFwX2VudW0pOwpAQCAtODcyLDkgKzg2Niw4IEBACiAJIklGMSIsICJJRjIiCiB9OwogCi1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCi0JcnQ1NjQwX3NkaV9zZWxfZW51bSwgUlQ1NjQwX0kyUzJfU0RQLAotCVJUNTY0MF9JMlMyX1NESV9TRlQsIHJ0NTY0MF9zZGlfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfc2RpX3NlbF9lbnVtLCBSVDU2NDBfSTJTMl9TRFAsCisJCQkgICAgUlQ1NjQwX0kyUzJfU0RJX1NGVCwgcnQ1NjQwX3NkaV9zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjQwX3NkaV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlNESSBzZWxlY3QiLCBydDU2NDBfc2RpX3NlbF9lbnVtKTsKQEAgLTE2MDEsOCArMTU5NCw3IEBACiBzdGF0aWMgaW50IHJ0NTY0MF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJc3RydWN0IHJ0NTY0MF9wcml2ICpydDU2NDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAl1bnNpZ25lZCBpbnQgdmFsX2xlbiA9IDAsIHZhbF9jbGssIG1hc2tfY2xrOwogCWludCBkYWlfc2VsLCBwcmVfZGl2LCBiY2xrX21zLCBmcmFtZV9zaXplOwpAQCAtMTk0MywxNiArMTkzNSw4IEBACiBzdGF0aWMgaW50IHJ0NTY0MF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHJ0NTY0MF9wcml2ICpydDU2NDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwogCiAJcnQ1NjQwLT5jb2RlYyA9IGNvZGVjOwotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBydDU2NDAtPnJlZ21hcDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQogCiAJY29kZWMtPmRhcG0uaWRsZV9iaWFzX29mZiA9IDE7CiAJcnQ1NjQwX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuYwppbmRleCAwZmNiZTkwLi5kM2VkMWJlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NndGw1MDAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zZ3RsNTAwMC5jCkBAIC0xODcsOCArMTg3LDkgQEAKIAkiTUlDX0lOIiwgIkxJTkVfSU4iCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkY19lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShTR1RMNTAwMF9DSElQX0FOQV9DVFJMLCAyLCAyLCBhZGNfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkY19lbnVtLAorCQkJICAgIFNHVEw1MDAwX0NISVBfQU5BX0NUUkwsIDIsCisJCQkgICAgYWRjX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY19tdXggPQogU09DX0RBUE1fRU5VTSgiQ2FwdHVyZSBNdXgiLCBhZGNfZW51bSk7CkBAIC0xOTgsOCArMTk5LDkgQEAKIAkiREFDIiwgIkxJTkVfSU4iCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShTR1RMNTAwMF9DSElQX0FOQV9DVFJMLCA2LCAyLCBkYWNfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhY19lbnVtLAorCQkJICAgIFNHVEw1MDAwX0NISVBfQU5BX0NUUkwsIDYsCisJCQkgICAgZGFjX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhY19tdXggPQogU09DX0RBUE1fRU5VTSgiSGVhZHBob25lIE11eCIsIGRhY19lbnVtKTsKQEAgLTEzNTAsMTQgKzEzNTIsNiBAQAogCWludCByZXQ7CiAJc3RydWN0IHNndGw1MDAwX3ByaXYgKnNndGw1MDAwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKLQkvKiBzZXR1cCBpMmMgZGF0YSBvcHMgKi8KLQljb2RlYy0+Y29udHJvbF9kYXRhID0gc2d0bDUwMDAtPnJlZ21hcDsKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMTYsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHNndGw1MDAwX2VuYWJsZV9yZWd1bGF0b3JzKGNvZGVjKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zaTQ3NnguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc2k0NzZ4LmMKaW5kZXggZmEyYjhlMC4uMjQ0YzA5NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zaTQ3NnguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3NpNDc2eC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAKQEAgLTIwOSw4ICsyMTAsOSBAQAogCiBzdGF0aWMgaW50IHNpNDc2eF9jb2RlY19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRldl9nZXRfcmVnbWFwKGNvZGVjLT5kZXYtPnBhcmVudCwgTlVMTCk7Ci0JcmV0dXJuIHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAwLCAwLCBTTkRfU09DX1JFR01BUCk7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9yZWdtYXAoY29kZWMtPmRldi0+cGFyZW50LCBOVUxMKTsKKworCXJldHVybiBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgcmVnbWFwKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgc2k0NzZ4X2RhaV9vcHMgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NpcmYtYXVkaW8tY29kZWMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc2lyZi1hdWRpby1jb2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZTdjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3NpcmYtYXVkaW8tY29kZWMuYwpAQCAtMCwwICsxLDUyNCBAQAorLyoKKyAqIFNpUkYgYXVkaW8gY29kZWMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cCBjb21wYW55LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgorCisjaW5jbHVkZSAic2lyZi1hdWRpby1jb2RlYy5oIgorCitzdHJ1Y3Qgc2lyZl9hdWRpb19jb2RlYyB7CisJc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwl1MzIgcmVnX2N0cmwwLCByZWdfY3RybDE7Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlucHV0X21vZGVfbXV4W10gPSB7IlNpbmdsZS1lbmRlZCIsCisJIkRpZmZlcmVudGlhbCJ9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGlucHV0X21vZGVfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShBVURJT19JQ19DT0RFQ19DVFJMMSwgNCwgMiwgaW5wdXRfbW9kZV9tdXgpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2lyZl9hdWRpb19jb2RlY19pbnB1dF9tb2RlX2NvbnRyb2wgPQorCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgaW5wdXRfbW9kZV9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShwbGF5YmFja192b2xfdGx2LCAtMTI0MDAsIDEwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoY2FwdHVyZV92b2xfdGx2X3ByaW1hMiwgNTAwLCAxMDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1JBTkdFKGNhcHR1cmVfdm9sX3Rsdl9hdGxhczYsCisJMCwgNywgVExWX0RCX1NDQUxFX0lURU0oLTEwMCwgMTAwLCAwKSwKKwkweDIyLCAweDNGLCBUTFZfREJfU0NBTEVfSVRFTSg3MDAsIDEwMCwgMCksCispOworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdm9sdW1lX2NvbnRyb2xzX2F0bGFzNltdID0geworCVNPQ19ET1VCTEVfVExWKCJQbGF5YmFjayBWb2x1bWUiLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMjEsIDE0LAorCQkJMHg3RiwgMCwgcGxheWJhY2tfdm9sX3RsdiksCisJU09DX0RPVUJMRV9UTFYoIkNhcHR1cmUgVm9sdW1lIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsIDE2LCAxMCwKKwkJCTB4M0YsIDAsIGNhcHR1cmVfdm9sX3Rsdl9hdGxhczYpLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZvbHVtZV9jb250cm9sc19wcmltYTJbXSA9IHsKKwlTT0NfRE9VQkxFX1RMVigiU3BlYWtlciBWb2x1bWUiLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMjEsIDE0LAorCQkJMHg3RiwgMCwgcGxheWJhY2tfdm9sX3RsdiksCisJU09DX0RPVUJMRV9UTFYoIkNhcHR1cmUgVm9sdW1lIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsIDE1LCAxMCwKKwkJCTB4MUYsIDAsIGNhcHR1cmVfdm9sX3Rsdl9wcmltYTIpLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxlZnRfaW5wdXRfcGF0aF9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTGluZSBMZWZ0IFN3aXRjaCIsIEFVRElPX0lDX0NPREVDX0NUUkwxLCA2LCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1pYyBMZWZ0IFN3aXRjaCIsIEFVRElPX0lDX0NPREVDX0NUUkwxLCAzLCAxLCAwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByaWdodF9pbnB1dF9wYXRoX2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJMaW5lIFJpZ2h0IFN3aXRjaCIsIEFVRElPX0lDX0NPREVDX0NUUkwxLCA1LCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1pYyBSaWdodCBTd2l0Y2giLCBBVURJT19JQ19DT0RFQ19DVFJMMSwgMiwgMSwgMCksCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGVmdF9kYWNfdG9faHBfbGVmdF9hbXBfc3dpdGNoX2NvbnRyb2wgPQorCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDAsIDksIDEsIDApOworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGVmdF9kYWNfdG9faHBfcmlnaHRfYW1wX3N3aXRjaF9jb250cm9sID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIEFVRElPX0lDX0NPREVDX0NUUkwwLCA4LCAxLCAwKTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJpZ2h0X2RhY190b19ocF9sZWZ0X2FtcF9zd2l0Y2hfY29udHJvbCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgNywgMSwgMCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByaWdodF9kYWNfdG9faHBfcmlnaHRfYW1wX3N3aXRjaF9jb250cm9sID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIEFVRElPX0lDX0NPREVDX0NUUkwwLCA2LCAxLCAwKTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxlZnRfZGFjX3RvX3NwZWFrZXJfbGluZW91dF9zd2l0Y2hfY29udHJvbCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMTEsIDEsIDApOworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmlnaHRfZGFjX3RvX3NwZWFrZXJfbGluZW91dF9zd2l0Y2hfY29udHJvbCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMTAsIDEsIDApOworCisvKiBBZnRlciBlbmFibGUgYWRjLCBEZWxheSAyMDBtcyB0byBhdm9pZCBwb3Agbm9pc2UgKi8KK3N0YXRpYyBpbnQgYWRjX2VuYWJsZV9kZWxheV9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCW1zbGVlcCgyMDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2FuZF9yZXNldF9jb2RlYyhzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCisJCXUzMiBjb2RlY19lbmFibGVfYml0cywgdTMyIGNvZGVjX3Jlc2V0X2JpdHMpCit7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsCisJCQljb2RlY19lbmFibGVfYml0cyB8IGNvZGVjX3Jlc2V0X2JpdHMsCisJCQljb2RlY19lbmFibGVfYml0cyB8IH5jb2RlY19yZXNldF9iaXRzKTsKKwltc2xlZXAoMjApOworCXJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIEFVRElPX0lDX0NPREVDX0NUUkwxLAorCQkJY29kZWNfcmVzZXRfYml0cywgY29kZWNfcmVzZXRfYml0cyk7Cit9CisKK3N0YXRpYyBpbnQgYXRsYXM2X2NvZGVjX2VuYWJsZV9hbmRfcmVzZXRfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisjZGVmaW5lIEFUTEFTNl9DT0RFQ19FTkFCTEVfQklUUyAoMSA8PCAyOSkKKyNkZWZpbmUgQVRMQVM2X0NPREVDX1JFU0VUX0JJVFMgKDEgPDwgMjgpCisJc3RydWN0IHNpcmZfYXVkaW9fY29kZWMgKnNpcmZfYXVkaW9fY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEody0+Y29kZWMtPmRldik7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCWVuYWJsZV9hbmRfcmVzZXRfY29kZWMoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLAorCQkJQVRMQVM2X0NPREVDX0VOQUJMRV9CSVRTLCBBVExBUzZfQ09ERUNfUkVTRVRfQklUUyk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZWdtYXBfdXBkYXRlX2JpdHMoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLAorCQkJQVVESU9fSUNfQ09ERUNfQ1RSTDEsIEFUTEFTNl9DT0RFQ19FTkFCTEVfQklUUywKKwkJCX5BVExBUzZfQ09ERUNfRU5BQkxFX0JJVFMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmltYTJfY29kZWNfZW5hYmxlX2FuZF9yZXNldF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKyNkZWZpbmUgUFJJTUEyX0NPREVDX0VOQUJMRV9CSVRTICgxIDw8IDI3KQorI2RlZmluZSBQUklNQTJfQ09ERUNfUkVTRVRfQklUUyAoMSA8PCAyNikKKwlzdHJ1Y3Qgc2lyZl9hdWRpb19jb2RlYyAqc2lyZl9hdWRpb19jb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YSh3LT5jb2RlYy0+ZGV2KTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCWVuYWJsZV9hbmRfcmVzZXRfY29kZWMoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLAorCQkJUFJJTUEyX0NPREVDX0VOQUJMRV9CSVRTLCBQUklNQTJfQ09ERUNfUkVTRVRfQklUUyk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZWdtYXBfdXBkYXRlX2JpdHMoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLAorCQkJQVVESU9fSUNfQ09ERUNfQ1RSTDEsIFBSSU1BMl9DT0RFQ19FTkFCTEVfQklUUywKKwkJCX5QUklNQTJfQ09ERUNfRU5BQkxFX0JJVFMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGF0bGFzNl9vdXRwdXRfZHJpdmVyX2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9PVVRfRFJWKCJIUCBMZWZ0IERyaXZlciIsIEFVRElPX0lDX0NPREVDX0NUUkwxLAorCQkJMjUsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9PVVRfRFJWKCJIUCBSaWdodCBEcml2ZXIiLCBBVURJT19JQ19DT0RFQ19DVFJMMSwKKwkJCTI2LCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fT1VUX0RSVigiU3BlYWtlciBEcml2ZXIiLCBBVURJT19JQ19DT0RFQ19DVFJMMSwKKwkJCTI3LCAwLCBOVUxMLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBwcmltYTJfb3V0cHV0X2RyaXZlcl9kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fT1VUX0RSVigiSFAgTGVmdCBEcml2ZXIiLCBBVURJT19JQ19DT0RFQ19DVFJMMSwKKwkJCTIzLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fT1VUX0RSVigiSFAgUmlnaHQgRHJpdmVyIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsCisJCQkyNCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX09VVF9EUlYoIlNwZWFrZXIgRHJpdmVyIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsCisJCQkyNSwgMCwgTlVMTCwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYXRsYXM2X2NvZGVjX2Nsb2NrX2RhcG1fd2lkZ2V0ID0KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJjb2RlY2NsayIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCWF0bGFzNl9jb2RlY19lbmFibGVfYW5kX3Jlc2V0X2V2ZW50LAorCQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgcHJpbWEyX2NvZGVjX2Nsb2NrX2RhcG1fd2lkZ2V0ID0KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJjb2RlY2NsayIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCXByaW1hMl9jb2RlY19lbmFibGVfYW5kX3Jlc2V0X2V2ZW50LAorCQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgc2lyZl9hdWRpb19jb2RlY19kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fREFDKCJEQUMgbGVmdCIsIE5VTEwsIEFVRElPX0lDX0NPREVDX0NUUkwwLCAxLCAwKSwKKwlTTkRfU09DX0RBUE1fREFDKCJEQUMgcmlnaHQiLCBOVUxMLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiTGVmdCBkYWMgdG8gaHAgbGVmdCBhbXAiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmbGVmdF9kYWNfdG9faHBfbGVmdF9hbXBfc3dpdGNoX2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIkxlZnQgZGFjIHRvIGhwIHJpZ2h0IGFtcCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZsZWZ0X2RhY190b19ocF9yaWdodF9hbXBfc3dpdGNoX2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIlJpZ2h0IGRhYyB0byBocCBsZWZ0IGFtcCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZyaWdodF9kYWNfdG9faHBfbGVmdF9hbXBfc3dpdGNoX2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIlJpZ2h0IGRhYyB0byBocCByaWdodCBhbXAiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmcmlnaHRfZGFjX3RvX2hwX3JpZ2h0X2FtcF9zd2l0Y2hfY29udHJvbCksCisJU05EX1NPQ19EQVBNX09VVF9EUlYoIkhQIGFtcCBsZWZ0IGRyaXZlciIsIEFVRElPX0lDX0NPREVDX0NUUkwwLCAzLCAwLAorCQkJTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX09VVF9EUlYoIkhQIGFtcCByaWdodCBkcml2ZXIiLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMywgMCwKKwkJCU5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiTGVmdCBkYWMgdG8gc3BlYWtlciBsaW5lb3V0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJJmxlZnRfZGFjX3RvX3NwZWFrZXJfbGluZW91dF9zd2l0Y2hfY29udHJvbCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiUmlnaHQgZGFjIHRvIHNwZWFrZXIgbGluZW91dCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZyaWdodF9kYWNfdG9fc3BlYWtlcl9saW5lb3V0X3N3aXRjaF9jb250cm9sKSwKKwlTTkRfU09DX0RBUE1fT1VUX0RSVigiU3BlYWtlciBhbXAgZHJpdmVyIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDAsIDQsIDAsCisJCQlOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9PVVRQVVQoIkhQT1VUTCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkhQT1VUUiIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIlNQS09VVCIpLAorCisJU05EX1NPQ19EQVBNX0FEQ19FKCJBREMgbGVmdCIsIE5VTEwsIEFVRElPX0lDX0NPREVDX0NUUkwxLCA4LCAwLAorCQkJYWRjX2VuYWJsZV9kZWxheV9ldmVudCwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKwlTTkRfU09DX0RBUE1fQURDX0UoIkFEQyByaWdodCIsIE5VTEwsIEFVRElPX0lDX0NPREVDX0NUUkwxLCA3LCAwLAorCQkJYWRjX2VuYWJsZV9kZWxheV9ldmVudCwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkxlZnQgUEdBIG1peGVyIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsIDEsIDAsCisJCSZsZWZ0X2lucHV0X3BhdGhfY29udHJvbHNbMF0sCisJCUFSUkFZX1NJWkUobGVmdF9pbnB1dF9wYXRoX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSaWdodCBQR0EgbWl4ZXIiLCBBVURJT19JQ19DT0RFQ19DVFJMMSwgMCwgMCwKKwkJJnJpZ2h0X2lucHV0X3BhdGhfY29udHJvbHNbMF0sCisJCUFSUkFZX1NJWkUocmlnaHRfaW5wdXRfcGF0aF9jb250cm9scykpLAorCisJU05EX1NPQ19EQVBNX01VWCgiTWljIGlucHV0IG1vZGUgbXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJJnNpcmZfYXVkaW9fY29kZWNfaW5wdXRfbW9kZV9jb250cm9sKSwKKwlTTkRfU09DX0RBUE1fTUlDQklBUygiTWljIEJpYXMiLCBBVURJT19JQ19DT0RFQ19QV1IsIDMsIDApLAorCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDSU4xIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNSUNJTjIiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkxJTkVJTjEiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkxJTkVJTjIiKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIkhTTCBQaGFzZSBPcHBvc2l0ZSIsIEFVRElPX0lDX0NPREVDX0NUUkwwLAorCQkJMzAsIDAsIE5VTEwsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgc2lyZl9hdWRpb19jb2RlY19tYXBbXSA9IHsKKwl7IlNQS09VVCIsIE5VTEwsICJTcGVha2VyIERyaXZlciJ9LAorCXsiU3BlYWtlciBEcml2ZXIiLCBOVUxMLCAiU3BlYWtlciBhbXAgZHJpdmVyIn0sCisJeyJTcGVha2VyIGFtcCBkcml2ZXIiLCBOVUxMLCAiTGVmdCBkYWMgdG8gc3BlYWtlciBsaW5lb3V0In0sCisJeyJTcGVha2VyIGFtcCBkcml2ZXIiLCBOVUxMLCAiUmlnaHQgZGFjIHRvIHNwZWFrZXIgbGluZW91dCJ9LAorCXsiTGVmdCBkYWMgdG8gc3BlYWtlciBsaW5lb3V0IiwgIlN3aXRjaCIsICJEQUMgbGVmdCJ9LAorCXsiUmlnaHQgZGFjIHRvIHNwZWFrZXIgbGluZW91dCIsICJTd2l0Y2giLCAiREFDIHJpZ2h0In0sCisJeyJIUE9VVEwiLCBOVUxMLCAiSFAgTGVmdCBEcml2ZXIifSwKKwl7IkhQT1VUUiIsIE5VTEwsICJIUCBSaWdodCBEcml2ZXIifSwKKwl7IkhQIExlZnQgRHJpdmVyIiwgTlVMTCwgIkhQIGFtcCBsZWZ0IGRyaXZlciJ9LAorCXsiSFAgUmlnaHQgRHJpdmVyIiwgTlVMTCwgIkhQIGFtcCByaWdodCBkcml2ZXIifSwKKwl7IkhQIGFtcCBsZWZ0IGRyaXZlciIsIE5VTEwsICJSaWdodCBkYWMgdG8gaHAgbGVmdCBhbXAifSwKKwl7IkhQIGFtcCByaWdodCBkcml2ZXIiLCBOVUxMICwgIlJpZ2h0IGRhYyB0byBocCByaWdodCBhbXAifSwKKwl7IkhQIGFtcCBsZWZ0IGRyaXZlciIsIE5VTEwsICJMZWZ0IGRhYyB0byBocCBsZWZ0IGFtcCJ9LAorCXsiSFAgYW1wIHJpZ2h0IGRyaXZlciIsIE5VTEwgLCAiUmlnaHQgZGFjIHRvIGhwIHJpZ2h0IGFtcCJ9LAorCXsiUmlnaHQgZGFjIHRvIGhwIGxlZnQgYW1wIiwgIlN3aXRjaCIsICJEQUMgbGVmdCJ9LAorCXsiUmlnaHQgZGFjIHRvIGhwIHJpZ2h0IGFtcCIsICJTd2l0Y2giLCAiREFDIHJpZ2h0In0sCisJeyJMZWZ0IGRhYyB0byBocCBsZWZ0IGFtcCIsICJTd2l0Y2giLCAiREFDIGxlZnQifSwKKwl7IkxlZnQgZGFjIHRvIGhwIHJpZ2h0IGFtcCIsICJTd2l0Y2giLCAiREFDIHJpZ2h0In0sCisJeyJEQUMgbGVmdCIsIE5VTEwsICJjb2RlY2NsayJ9LAorCXsiREFDIHJpZ2h0IiwgTlVMTCwgImNvZGVjY2xrIn0sCisJeyJEQUMgbGVmdCIsIE5VTEwsICJQbGF5YmFjayJ9LAorCXsiREFDIHJpZ2h0IiwgTlVMTCwgIlBsYXliYWNrIn0sCisJeyJEQUMgbGVmdCIsIE5VTEwsICJIU0wgUGhhc2UgT3Bwb3NpdGUifSwKKwl7IkRBQyByaWdodCIsIE5VTEwsICJIU0wgUGhhc2UgT3Bwb3NpdGUifSwKKworCXsiQ2FwdHVyZSIsIE5VTEwsICJBREMgbGVmdCJ9LAorCXsiQ2FwdHVyZSIsIE5VTEwsICJBREMgcmlnaHQifSwKKwl7IkFEQyBsZWZ0IiwgTlVMTCwgImNvZGVjY2xrIn0sCisJeyJBREMgcmlnaHQiLCBOVUxMLCAiY29kZWNjbGsifSwKKwl7IkFEQyBsZWZ0IiwgTlVMTCwgIkxlZnQgUEdBIG1peGVyIn0sCisJeyJBREMgcmlnaHQiLCBOVUxMLCAiUmlnaHQgUEdBIG1peGVyIn0sCisJeyJMZWZ0IFBHQSBtaXhlciIsICJMaW5lIExlZnQgU3dpdGNoIiwgIkxJTkVJTjIifSwKKwl7IlJpZ2h0IFBHQSBtaXhlciIsICJMaW5lIFJpZ2h0IFN3aXRjaCIsICJMSU5FSU4xIn0sCisJeyJMZWZ0IFBHQSBtaXhlciIsICJNaWMgTGVmdCBTd2l0Y2giLCAiTUlDSU4yIn0sCisJeyJSaWdodCBQR0EgbWl4ZXIiLCAiTWljIFJpZ2h0IFN3aXRjaCIsICJNaWMgaW5wdXQgbW9kZSBtdXgifSwKKwl7Ik1pYyBpbnB1dCBtb2RlIG11eCIsICJTaW5nbGUtZW5kZWQiLCAiTUlDSU4xIn0sCisJeyJNaWMgaW5wdXQgbW9kZSBtdXgiLCAiRGlmZmVyZW50aWFsIiwgIk1JQ0lOMSJ9LAorfTsKKworc3RhdGljIGludCBzaXJmX2F1ZGlvX2NvZGVjX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCWludCBjbWQsCisJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCWludCBwbGF5YmFjayA9IHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwl1MzIgdmFsID0gMDsKKworCS8qCisJICogVGhpcyBpcyBhIHdvcmthcm91bmQsIFdoZW4gc3RvcCBwbGF5YmFjaywKKwkgKiBuZWVkIGRpc2FibGUgSFAgYW1wLCBhdm9pZCB0aGUgY3VycmVudCBub2lzZS4KKwkgKi8KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJaWYgKHBsYXliYWNrKQorCQkJdmFsID0gSUNfSFNMRU4gfCBJQ19IU1JFTjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBsYXliYWNrKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBVURJT19JQ19DT0RFQ19DVFJMMCwKKwkJCUlDX0hTTEVOIHwgSUNfSFNSRU4sIHZhbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzbmRfc29jX2RhaV9vcHMgc2lyZl9hdWRpb19jb2RlY19kYWlfb3BzID0geworCS50cmlnZ2VyID0gc2lyZl9hdWRpb19jb2RlY190cmlnZ2VyLAorfTsKKworc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzaXJmX2F1ZGlvX2NvZGVjX2RhaSA9IHsKKwkubmFtZSA9ICJzaXJmLWF1ZGlvLWNvZGVjIiwKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJfSwKKwkuY2FwdHVyZSA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIkNhcHR1cmUiLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCX0sCisJLm9wcyA9ICZzaXJmX2F1ZGlvX2NvZGVjX2RhaV9vcHMsCit9OworCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fY29kZWNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKworCXBtX3J1bnRpbWVfZW5hYmxlKGNvZGVjLT5kZXYpOworCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNvZGVjLT5kZXYtPm9mX25vZGUsICJzaXJmLHByaW1hMi1hdWRpby1jb2RlYyIpKSB7CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwKKwkJCXByaW1hMl9vdXRwdXRfZHJpdmVyX2RhcG1fd2lkZ2V0cywKKwkJCUFSUkFZX1NJWkUocHJpbWEyX291dHB1dF9kcml2ZXJfZGFwbV93aWRnZXRzKSk7CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwKKwkJCSZwcmltYTJfY29kZWNfY2xvY2tfZGFwbV93aWRnZXQsIDEpOworCQlyZXR1cm4gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsCisJCQl2b2x1bWVfY29udHJvbHNfcHJpbWEyLAorCQkJQVJSQVlfU0laRSh2b2x1bWVfY29udHJvbHNfcHJpbWEyKSk7CisJfQorCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShjb2RlYy0+ZGV2LT5vZl9ub2RlLCAic2lyZixhdGxhczYtYXVkaW8tY29kZWMiKSkgeworCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sCisJCQlhdGxhczZfb3V0cHV0X2RyaXZlcl9kYXBtX3dpZGdldHMsCisJCQlBUlJBWV9TSVpFKGF0bGFzNl9vdXRwdXRfZHJpdmVyX2RhcG1fd2lkZ2V0cykpOworCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sCisJCQkmYXRsYXM2X2NvZGVjX2Nsb2NrX2RhcG1fd2lkZ2V0LCAxKTsKKwkJcmV0dXJuIHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLAorCQkJdm9sdW1lX2NvbnRyb2xzX2F0bGFzNiwKKwkJCUFSUkFZX1NJWkUodm9sdW1lX2NvbnRyb2xzX2F0bGFzNikpOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fY29kZWNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlwbV9ydW50aW1lX2Rpc2FibGUoY29kZWMtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2RldmljZV9zaXJmX2F1ZGlvX2NvZGVjID0geworCS5wcm9iZSA9IHNpcmZfYXVkaW9fY29kZWNfcHJvYmUsCisJLnJlbW92ZSA9IHNpcmZfYXVkaW9fY29kZWNfcmVtb3ZlLAorCS5kYXBtX3dpZGdldHMgPSBzaXJmX2F1ZGlvX2NvZGVjX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoc2lyZl9hdWRpb19jb2RlY19kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IHNpcmZfYXVkaW9fY29kZWNfbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHNpcmZfYXVkaW9fY29kZWNfbWFwKSwKKwkuaWRsZV9iaWFzX29mZiA9IHRydWUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzaXJmX2F1ZGlvX2NvZGVjX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzaXJmLHByaW1hMi1hdWRpby1jb2RlYyIgfSwKKwl7IC5jb21wYXRpYmxlID0gInNpcmYsYXRsYXM2LWF1ZGlvLWNvZGVjIiB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc2lyZl9hdWRpb19jb2RlY19vZl9tYXRjaCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzaXJmX2F1ZGlvX2NvZGVjX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gMzIsCisJLnJlZ19zdHJpZGUgPSA0LAorCS52YWxfYml0cyA9IDMyLAorCS5tYXhfcmVnaXN0ZXIgPSBBVURJT19JQ19DT0RFQ19DVFJMMywKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX05PTkUsCit9OworCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fY29kZWNfZHJpdmVyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2lyZl9hdWRpb19jb2RlYyAqc2lyZl9hdWRpb19jb2RlYzsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IHJlc291cmNlICptZW1fcmVzOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCisJbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKHNpcmZfYXVkaW9fY29kZWNfb2ZfbWF0Y2gsIHBkZXYtPmRldi5vZl9ub2RlKTsKKworCXNpcmZfYXVkaW9fY29kZWMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKKwkJc2l6ZW9mKHN0cnVjdCBzaXJmX2F1ZGlvX2NvZGVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzaXJmX2F1ZGlvX2NvZGVjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNpcmZfYXVkaW9fY29kZWMpOworCisJbWVtX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCBtZW1fcmVzKTsKKwlpZiAoYmFzZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNpcmZfYXVkaW9fY29kZWMtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfbW1pbygmcGRldi0+ZGV2LCBiYXNlLAorCQkJCQkgICAgJnNpcmZfYXVkaW9fY29kZWNfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihzaXJmX2F1ZGlvX2NvZGVjLT5yZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihzaXJmX2F1ZGlvX2NvZGVjLT5yZWdtYXApOworCisJc2lyZl9hdWRpb19jb2RlYy0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIoc2lyZl9hdWRpb19jb2RlYy0+Y2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJHZXQgY2xvY2sgZmFpbGVkLlxuIik7CisJCXJldHVybiBQVFJfRVJSKHNpcmZfYXVkaW9fY29kZWMtPmNsayk7CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHNpcmZfYXVkaW9fY29kZWMtPmNsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJFbmFibGUgY2xvY2sgZmFpbGVkLlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmKHBkZXYtPmRldiksCisJCQkmc29jX2NvZGVjX2RldmljZV9zaXJmX2F1ZGlvX2NvZGVjLAorCQkJJnNpcmZfYXVkaW9fY29kZWNfZGFpLCAxKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlJlZ2lzdGVyIEF1ZGlvIENvZGVjIGRhaSBmYWlsZWQuXG4iKTsKKwkJZ290byBlcnJfY2xrX3B1dDsKKwl9CisKKwkvKgorCSAqIEFsd2F5cyBvcGVuIGNoYXJnZSBwdW1wLCBpZiBub3QsIHdoZW4gdGhlIGNoYXJnZSBwdW1wIGNsb3NlZCB0aGUKKwkgKiBhZGMgd2lsbCBub3Qgc3RhYmxlCisJICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNpcmZfYXVkaW9fY29kZWMtPnJlZ21hcCwgQVVESU9fSUNfQ09ERUNfQ1RSTDAsCisJCUlDX0NQRlJFUSwgSUNfQ1BGUkVRKTsKKworCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwZGV2LT5kZXYub2Zfbm9kZSwgInNpcmYsYXRsYXM2LWF1ZGlvLWNvZGVjIikpCisJCXJlZ21hcF91cGRhdGVfYml0cyhzaXJmX2F1ZGlvX2NvZGVjLT5yZWdtYXAsCisJCQkJQVVESU9fSUNfQ09ERUNfQ1RSTDAsIElDX0NQRU4sIElDX0NQRU4pOworCXJldHVybiAwOworCitlcnJfY2xrX3B1dDoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoc2lyZl9hdWRpb19jb2RlYy0+Y2xrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fY29kZWNfZHJpdmVyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzaXJmX2F1ZGlvX2NvZGVjICpzaXJmX2F1ZGlvX2NvZGVjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoc2lyZl9hdWRpb19jb2RlYy0+Y2xrKTsKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJihwZGV2LT5kZXYpKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fY29kZWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpcmZfYXVkaW9fY29kZWMgKnNpcmZfYXVkaW9fY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJlZ21hcF9yZWFkKHNpcmZfYXVkaW9fY29kZWMtPnJlZ21hcCwgQVVESU9fSUNfQ09ERUNfQ1RSTDAsCisJCSZzaXJmX2F1ZGlvX2NvZGVjLT5yZWdfY3RybDApOworCXJlZ21hcF9yZWFkKHNpcmZfYXVkaW9fY29kZWMtPnJlZ21hcCwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsCisJCSZzaXJmX2F1ZGlvX2NvZGVjLT5yZWdfY3RybDEpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShzaXJmX2F1ZGlvX2NvZGVjLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2lyZl9hdWRpb19jb2RlY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzaXJmX2F1ZGlvX2NvZGVjICpzaXJmX2F1ZGlvX2NvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShzaXJmX2F1ZGlvX2NvZGVjLT5jbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZWdtYXBfd3JpdGUoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLCBBVURJT19JQ19DT0RFQ19DVFJMMCwKKwkJc2lyZl9hdWRpb19jb2RlYy0+cmVnX2N0cmwwKTsKKwlyZWdtYXBfd3JpdGUoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLCBBVURJT19JQ19DT0RFQ19DVFJMMSwKKwkJc2lyZl9hdWRpb19jb2RlYy0+cmVnX2N0cmwxKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzaXJmX2F1ZGlvX2NvZGVjX3BtX29wcyA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhzaXJmX2F1ZGlvX2NvZGVjX3N1c3BlbmQsIHNpcmZfYXVkaW9fY29kZWNfcmVzdW1lKQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2lyZl9hdWRpb19jb2RlY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic2lyZi1hdWRpby1jb2RlYyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBzaXJmX2F1ZGlvX2NvZGVjX29mX21hdGNoLAorCQkucG0gPSAmc2lyZl9hdWRpb19jb2RlY19wbV9vcHMsCisJfSwKKwkucHJvYmUgPSBzaXJmX2F1ZGlvX2NvZGVjX2RyaXZlcl9wcm9iZSwKKwkucmVtb3ZlID0gc2lyZl9hdWRpb19jb2RlY19kcml2ZXJfcmVtb3ZlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzaXJmX2F1ZGlvX2NvZGVjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiU2lSRiBhdWRpbyBjb2RlYyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlJvbmdKdW4gWWluZyA8Um9uZ2p1bi5ZaW5nQGNzci5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NpcmYtYXVkaW8tY29kZWMuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvc2lyZi1hdWRpby1jb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzE4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3NpcmYtYXVkaW8tY29kZWMuaApAQCAtMCwwICsxLDc1IEBACisvKgorICogU2lSRiBpbm5lciBjb2RlYyBjb250cm9sbGVycyBkZWZpbmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQ2FtYnJpZGdlIFNpbGljb24gUmFkaW8gTGltaXRlZCwgYSBDU1IgcGxjIGdyb3VwIGNvbXBhbnkuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIuCisgKi8KKworI2lmbmRlZiBfU0lSRl9BVURJT19DT0RFQ19ICisjZGVmaW5lIF9TSVJGX0FVRElPX0NPREVDX0gKKworCisjZGVmaW5lIEFVRElPX0lDX0NPREVDX1BXUgkJCSgweDAwRTApCisjZGVmaW5lIEFVRElPX0lDX0NPREVDX0NUUkwwCQkJKDB4MDBFNCkKKyNkZWZpbmUgQVVESU9fSUNfQ09ERUNfQ1RSTDEJCQkoMHgwMEU4KQorI2RlZmluZSBBVURJT19JQ19DT0RFQ19DVFJMMgkJCSgweDAwRUMpCisjZGVmaW5lIEFVRElPX0lDX0NPREVDX0NUUkwzCQkJKDB4MDBGMCkKKworI2RlZmluZSBNSUNCSUFTRU4JCSgxIDw8IDMpCisKKyNkZWZpbmUgSUNfUkRBQ0VOCQkoMSA8PCAwKQorI2RlZmluZSBJQ19MREFDRU4JCSgxIDw8IDEpCisjZGVmaW5lIElDX0hTUkVOCQkoMSA8PCAyKQorI2RlZmluZSBJQ19IU0xFTgkJKDEgPDwgMykKKyNkZWZpbmUgSUNfU1BFTgkJCSgxIDw8IDQpCisjZGVmaW5lIElDX0NQRU4JCQkoMSA8PCA1KQorCisjZGVmaW5lIElDX0hQUlNFTFIJCSgxIDw8IDYpCisjZGVmaW5lIElDX0hQTFNFTFIJCSgxIDw8IDcpCisjZGVmaW5lIElDX0hQUlNFTEwJCSgxIDw8IDgpCisjZGVmaW5lIElDX0hQTFNFTEwJCSgxIDw8IDkpCisjZGVmaW5lIElDX1NQU0VMUgkJKDEgPDwgMTApCisjZGVmaW5lIElDX1NQU0VMTAkJKDEgPDwgMTEpCisKKyNkZWZpbmUgSUNfTU9OT1IJCSgxIDw8IDEyKQorI2RlZmluZSBJQ19NT05PTAkJKDEgPDwgMTMpCisKKyNkZWZpbmUgSUNfUlhPU1JTRUwJCSgxIDw8IDI4KQorI2RlZmluZSBJQ19DUEZSRVEJCSgxIDw8IDI5KQorI2RlZmluZSBJQ19IU0lOVkVOCQkoMSA8PCAzMCkKKworI2RlZmluZSBJQ19NSUNJTlJFTgkJKDEgPDwgMCkKKyNkZWZpbmUgSUNfTUlDSU5MRU4JCSgxIDw8IDEpCisjZGVmaW5lIElDX01JQ0lOMVNFTAkJKDEgPDwgMikKKyNkZWZpbmUgSUNfTUlDSU4yU0VMCQkoMSA8PCAzKQorI2RlZmluZSBJQ19NSUNESUZTRUwJCSgxIDw8IDQpCisjZGVmaW5lCUlDX0xJTkVJTjFTRUwJCSgxIDw8IDUpCisjZGVmaW5lCUlDX0xJTkVJTjJTRUwJCSgxIDw8IDYpCisjZGVmaW5lCUlDX1JBRENFTgkJKDEgPDwgNykKKyNkZWZpbmUJSUNfTEFEQ0VOCQkoMSA8PCA4KQorI2RlZmluZQlJQ19BTE0JCQkoMSA8PCA5KQorCisjZGVmaW5lIElDX0RJR01JQ0VOICAgICAgICAgICAgICgxIDw8IDIyKQorI2RlZmluZSBJQ19ESUdNSUNGUkVRICAgICAgICAgICAoMSA8PCAyMykKKyNkZWZpbmUgSUNfQURDMTRCXzEyICAgICAgICAgICAgKDEgPDwgMjQpCisjZGVmaW5lIElDX0ZJUkRBQ19IU0xfRU4gICAgICAgICgxIDw8IDI1KQorI2RlZmluZSBJQ19GSVJEQUNfSFNSX0VOICAgICAgICAoMSA8PCAyNikKKyNkZWZpbmUgSUNfRklSREFDX0xPVVRfRU4gICAgICAgKDEgPDwgMjcpCisjZGVmaW5lIElDX1BPUiAgICAgICAgICAgICAgICAgICgxIDw8IDI4KQorI2RlZmluZSBJQ19DT0RFQ19DTEtfRU4gICAgICAgICAoMSA8PCAyOSkKKyNkZWZpbmUgSUNfSFBfM0RCX0JPT1NUICAgICAgICAgKDEgPDwgMzApCisKKyNkZWZpbmUgSUNfQURDX0xFRlRfR0FJTl9TSElGVAkxNgorI2RlZmluZSBJQ19BRENfUklHSFRfR0FJTl9TSElGVCAxMAorI2RlZmluZSBJQ19BRENfR0FJTl9NQVNLCTB4M0YKKyNkZWZpbmUgSUNfTUlDX01BWF9HQUlOCQkweDM5CisKKyNkZWZpbmUgSUNfUlhQR0FSX01BU0sJCTB4M0YKKyNkZWZpbmUgSUNfUlhQR0FSX1NISUZUCQkxNAorI2RlZmluZSBJQ19SWFBHQUxfTUFTSwkJMHgzRgorI2RlZmluZSBJQ19SWFBHQUxfU0hJRlQJCTIxCisjZGVmaW5lIElDX1JYUEdBUgkJMHg3QgorI2RlZmluZSBJQ19SWFBHQUwJCTB4N0IKKworI2VuZGlmIC8qX19TSVJGX0FVRElPX0NPREVDX0gqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3NuOTUwMzEuYwppbmRleCAxMzA0NWYyLi40MmRmZjI2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NuOTUwMzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3NuOTUwMzEuYwpAQCAtMzEyLDE0ICszMTIsMTQgQEAKIC8qIG11eCBjb250cm9scyAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnNuOTUwMzFfbWljX3RleHRzW10gPSB7ICJBTUlDIiwgIkxpbmVJbiIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzbjk1MDMxX21pY2xfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFNOOTUwMzFfQURDQ09ORklHLCAxLCAyLCBzbjk1MDMxX21pY190ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc245NTAzMV9taWNsX2VudW0sCisJCQkgICAgU045NTAzMV9BRENDT05GSUcsIDEsIHNuOTUwMzFfbWljX3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuOTUwMzFfbWljbF9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBzbjk1MDMxX21pY2xfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc245NTAzMV9taWNyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTjk1MDMxX0FEQ0NPTkZJRywgMywgMiwgc245NTAzMV9taWNfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfbWljcl9lbnVtLAorCQkJICAgIFNOOTUwMzFfQURDQ09ORklHLCAzLCBzbjk1MDMxX21pY190ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbjk1MDMxX21pY3JfbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgc245NTAzMV9taWNyX2VudW0pOwpAQCAtMzI4LDI2ICszMjgsMjYgQEAKIAkJCQkJCSJETUlDNCIsICJETUlDNSIsICJETUlDNiIsCiAJCQkJCQkiQURDIExlZnQiLCAiQURDIFJpZ2h0IiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNuOTUwMzFfaW5wdXQxX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTjk1MDMxX0FVRElPTVVYMTIsIDAsIDgsIHNuOTUwMzFfaW5wdXRfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfaW5wdXQxX2VudW0sCisJCQkgICAgU045NTAzMV9BVURJT01VWDEyLCAwLCBzbjk1MDMxX2lucHV0X3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuOTUwMzFfaW5wdXQxX211eF9jb250cm9sID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHNuOTUwMzFfaW5wdXQxX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNuOTUwMzFfaW5wdXQyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTjk1MDMxX0FVRElPTVVYMTIsIDQsIDgsIHNuOTUwMzFfaW5wdXRfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfaW5wdXQyX2VudW0sCisJCQkgICAgU045NTAzMV9BVURJT01VWDEyLCA0LCBzbjk1MDMxX2lucHV0X3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuOTUwMzFfaW5wdXQyX211eF9jb250cm9sID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHNuOTUwMzFfaW5wdXQyX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNuOTUwMzFfaW5wdXQzX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTjk1MDMxX0FVRElPTVVYMzQsIDAsIDgsIHNuOTUwMzFfaW5wdXRfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfaW5wdXQzX2VudW0sCisJCQkgICAgU045NTAzMV9BVURJT01VWDM0LCAwLCBzbjk1MDMxX2lucHV0X3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuOTUwMzFfaW5wdXQzX211eF9jb250cm9sID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHNuOTUwMzFfaW5wdXQzX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNuOTUwMzFfaW5wdXQ0X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTjk1MDMxX0FVRElPTVVYMzQsIDQsIDgsIHNuOTUwMzFfaW5wdXRfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfaW5wdXQ0X2VudW0sCisJCQkgICAgU045NTAzMV9BVURJT01VWDM0LCA0LCBzbjk1MDMxX2lucHV0X3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuOTUwMzFfaW5wdXQ0X211eF9jb250cm9sID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHNuOTUwMzFfaW5wdXQ0X2VudW0pOwpAQCAtMzU5LDE5ICszNTksMTkgQEAKIC8qIDBkQiB0byAzMGRCIGluIDEwZEIgc3RlcHMgKi8KIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShtaWNfdGx2LCAwLCAxMCwgMCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc245NTAzMV9taWNtb2RlMV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoU045NTAzMV9NSUNBTVAxLCAxLCAyLCBzbjk1MDMxX21pY21vZGVfdGV4dCk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNuOTUwMzFfbWljbW9kZTJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFNOOTUwMzFfTUlDQU1QMiwgMSwgMiwgc245NTAzMV9taWNtb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfbWljbW9kZTFfZW51bSwKKwkJCSAgICBTTjk1MDMxX01JQ0FNUDEsIDEsIHNuOTUwMzFfbWljbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzbjk1MDMxX21pY21vZGUyX2VudW0sCisJCQkgICAgU045NTAzMV9NSUNBTVAyLCAxLCBzbjk1MDMxX21pY21vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzbjk1MDMxX2RtaWNfY2ZnX3RleHRbXSA9IHsiR1BPIiwgIkRNSUMifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzbjk1MDMxX2RtaWMxMl9jZmdfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFNOOTUwMzFfRE1JQ01VWCwgMCwgMiwgc245NTAzMV9kbWljX2NmZ190ZXh0KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc245NTAzMV9kbWljMzRfY2ZnX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTjk1MDMxX0RNSUNNVVgsIDEsIDIsIHNuOTUwMzFfZG1pY19jZmdfdGV4dCk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNuOTUwMzFfZG1pYzU2X2NmZ19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoU045NTAzMV9ETUlDTVVYLCAyLCAyLCBzbjk1MDMxX2RtaWNfY2ZnX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfZG1pYzEyX2NmZ19lbnVtLAorCQkJICAgIFNOOTUwMzFfRE1JQ01VWCwgMCwgc245NTAzMV9kbWljX2NmZ190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzbjk1MDMxX2RtaWMzNF9jZmdfZW51bSwKKwkJCSAgICBTTjk1MDMxX0RNSUNNVVgsIDEsIHNuOTUwMzFfZG1pY19jZmdfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc245NTAzMV9kbWljNTZfY2ZnX2VudW0sCisJCQkgICAgU045NTAzMV9ETUlDTVVYLCAyLCBzbjk1MDMxX2RtaWNfY2ZnX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc245NTAzMV9zbmRfY29udHJvbHNbXSA9IHsKIAlTT0NfRU5VTSgiTWljMU1vZGUgQ2FwdHVyZSBSb3V0ZSIsIHNuOTUwMzFfbWljbW9kZTFfZW51bSksCkBAIC04MjUsOCArODI1LDYgQEAKIHsKIAlwcl9kZWJ1ZygiY29kZWNfcHJvYmUgY2FsbGVkXG4iKTsKIAotCXNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAwLCAwLCBTTkRfU09DX1JFR01BUCk7Ci0KIAkvKiBQQ00gaW50ZXJmYWNlIGNvbmZpZwogCSAqIFRoaXMgc2V0cyB0aGUgcGNtIHJ4IHNsb3QgY29uZ3VyYXRpb24gdG8gbWF4IDYgc2xvdHMKIAkgKiBmb3IgbWF4IDQgZGFpcyAoMiBzdGVyZW8gYW5kIDIgbW9ubykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjUxOC5jIGIvc291bmQvc29jL2NvZGVjcy9zc20yNTE4LmMKaW5kZXggY2M4ZGViYy4uNTZhZGIzZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zc20yNTE4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zc20yNTE4LmMKQEAgLTE2OSwxOSArMTY5LDE5IEBACiAJIjY4Mi4yNCBtcyIsICIxMzY0IG1zIiwKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChzc20yNTE4X2RyY19wZWFrX2RldGVjdG9yX2F0dGFja190aW1lX2VudW0sCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3NtMjUxOF9kcmNfcGVha19kZXRlY3Rvcl9hdHRhY2tfdGltZV9lbnVtLAogCVNTTTI1MThfUkVHX0RSQ18yLCA0LCBzc20yNTE4X2RyY19wZWFrX2RldGVjdG9yX2F0dGFja190aW1lX3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNzbTI1MThfZHJjX3BlYWtfZGV0ZWN0b3JfcmVsZWFzZV90aW1lX2VudW0sCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3NtMjUxOF9kcmNfcGVha19kZXRlY3Rvcl9yZWxlYXNlX3RpbWVfZW51bSwKIAlTU00yNTE4X1JFR19EUkNfMiwgMCwgc3NtMjUxOF9kcmNfcGVha19kZXRlY3Rvcl9yZWxlYXNlX3RpbWVfdGV4dCk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3NtMjUxOF9kcmNfYXR0YWNrX3RpbWVfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzc20yNTE4X2RyY19hdHRhY2tfdGltZV9lbnVtLAogCVNTTTI1MThfUkVHX0RSQ182LCA0LCBzc20yNTE4X2RyY19wZWFrX2RldGVjdG9yX2F0dGFja190aW1lX3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNzbTI1MThfZHJjX2RlY2F5X3RpbWVfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzc20yNTE4X2RyY19kZWNheV90aW1lX2VudW0sCiAJU1NNMjUxOF9SRUdfRFJDXzYsIDAsIHNzbTI1MThfZHJjX3BlYWtfZGV0ZWN0b3JfcmVsZWFzZV90aW1lX3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNzbTI1MThfZHJjX2hvbGRfdGltZV9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNzbTI1MThfZHJjX2hvbGRfdGltZV9lbnVtLAogCVNTTTI1MThfUkVHX0RSQ183LCA0LCBzc20yNTE4X2RyY19ob2xkX3RpbWVfdGV4dCk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3NtMjUxOF9kcmNfbm9pc2VfZ2F0ZV9ob2xkX3RpbWVfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzc20yNTE4X2RyY19ub2lzZV9nYXRlX2hvbGRfdGltZV9lbnVtLAogCVNTTTI1MThfUkVHX0RSQ183LCAwLCBzc20yNTE4X2RyY19ob2xkX3RpbWVfdGV4dCk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3NtMjUxOF9kcmNfcm1zX2F2ZXJhZ2luZ190aW1lX2VudW0sCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3NtMjUxOF9kcmNfcm1zX2F2ZXJhZ2luZ190aW1lX2VudW0sCiAJU1NNMjUxOF9SRUdfRFJDXzksIDAsIHNzbTI1MThfZHJjX3BlYWtfZGV0ZWN0b3JfcmVsZWFzZV90aW1lX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3NtMjUxOF9zbmRfY29udHJvbHNbXSA9IHsKQEAgLTY0OCwxNiArNjQ4LDYgQEAKIAogc3RhdGljIGludCBzc20yNTE4X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzdHJ1Y3Qgc3NtMjUxOCAqc3NtMjUxOCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQ7Ci0KLQljb2RlYy0+Y29udHJvbF9kYXRhID0gc3NtMjUxOC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAwLCAwLCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldHVybiBzc20yNTE4X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLWkyYy5jIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLWkyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZDYzZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDItaTJjLmMKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIFNTTTI2MDIvU1NNMjYwMy9TU00yNjA0IEkyQyBhdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCisjaW5jbHVkZSAic3NtMjYwMi5oIgorCisvKgorICogc3NtMjYwMiAyIHdpcmUgYWRkcmVzcyBpcyBkZXRlcm1pbmVkIGJ5IEdQSU81CisgKiBzdGF0ZSBkdXJpbmcgcG93ZXJ1cC4KKyAqICAgIGxvdyAgPSAweDFhCisgKiAgICBoaWdoID0gMHgxYgorICovCitzdGF0aWMgaW50IHNzbTI2MDJfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gc3NtMjYwMl9wcm9iZSgmY2xpZW50LT5kZXYsIGlkLT5kcml2ZXJfZGF0YSwKKwkJZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmc3NtMjYwMl9yZWdtYXBfY29uZmlnKSk7Cit9CisKK3N0YXRpYyBpbnQgc3NtMjYwMl9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBzc20yNjAyX2kyY19pZFtdID0geworCXsgInNzbTI2MDIiLCBTU00yNjAyIH0sCisJeyAic3NtMjYwMyIsIFNTTTI2MDIgfSwKKwl7ICJzc20yNjA0IiwgU1NNMjYwNCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzc20yNjAyX2kyY19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzc20yNjAyX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic3NtMjYwMiIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gc3NtMjYwMl9pMmNfcHJvYmUsCisJLnJlbW92ZSA9IHNzbTI2MDJfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSBzc20yNjAyX2kyY19pZCwKK307Cittb2R1bGVfaTJjX2RyaXZlcihzc20yNjAyX2kyY19kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgU1NNMjYwMi9TU00yNjAzL1NTTTI2MDQgSTJDIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiQ2xpZmYgQ2FpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDItc3BpLmMgYi9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDItc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJmNTVlMgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi1zcGkuYwpAQCAtMCwwICsxLDQxIEBACisvKgorICogU1NNMjYwMiBTUEkgYXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTQgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlICJzc20yNjAyLmgiCisKK3N0YXRpYyBpbnQgc3NtMjYwMl9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlyZXR1cm4gc3NtMjYwMl9wcm9iZSgmc3BpLT5kZXYsIFNTTTI2MDIsCisJCWRldm1fcmVnbWFwX2luaXRfc3BpKHNwaSwgJnNzbTI2MDJfcmVnbWFwX2NvbmZpZykpOworfQorCitzdGF0aWMgaW50IHNzbTI2MDJfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgc3NtMjYwMl9zcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInNzbTI2MDIiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBzc20yNjAyX3NwaV9wcm9iZSwKKwkucmVtb3ZlCQk9IHNzbTI2MDJfc3BpX3JlbW92ZSwKK307Cittb2R1bGVfc3BpX2RyaXZlcihzc20yNjAyX3NwaV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgU1NNMjYwMiBTUEkgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJDbGlmZiBDYWkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi5jIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMKaW5kZXggYWY3NmJiZC4uOTdiMDQ1NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMKQEAgLTI3LDMyICsyNywyMCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogCiAjaW5jbHVkZSAic3NtMjYwMi5oIgogCi1lbnVtIHNzbTI2MDJfdHlwZSB7Ci0JU1NNMjYwMiwKLQlTU00yNjA0LAotfTsKLQogLyogY29kZWMgcHJpdmF0ZSBkYXRhICovCiBzdHJ1Y3Qgc3NtMjYwMl9wcml2IHsKIAl1bnNpZ25lZCBpbnQgc3lzY2xrOwotCXN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCAqc3lzY2xrX2NvbnN0cmFpbnRzOworCWNvbnN0IHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCAqc3lzY2xrX2NvbnN0cmFpbnRzOwogCiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCkBAIC03NSwxNSArNjMsMTYgQEAKIAogLypBcHBlbmRpbmcgc2V2ZXJhbCAiTm9uZSJzIGp1c3QgZm9yIE9TUyBtaXhlciB1c2UqLwogc3RhdGljIGNvbnN0IGNoYXIgKnNzbTI2MDJfaW5wdXRfc2VsZWN0W10gPSB7Ci0JIkxpbmUiLCAiTWljIiwgIk5vbmUiLCAiTm9uZSIsICJOb25lIiwKLQkiTm9uZSIsICJOb25lIiwgIk5vbmUiLAorCSJMaW5lIiwgIk1pYyIsCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqc3NtMjYwMl9kZWVtcGhbXSA9IHsiTm9uZSIsICIzMktoeiIsICI0NC4xS2h6IiwgIjQ4S2h6In07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3NtMjYwMl9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKFNTTTI2MDJfQVBBTkEsIDIsIDIsIHNzbTI2MDJfaW5wdXRfc2VsZWN0KSwKLQlTT0NfRU5VTV9TSU5HTEUoU1NNMjYwMl9BUERJR0ksIDEsIDQsIHNzbTI2MDJfZGVlbXBoKSwKKwlTT0NfRU5VTV9TSU5HTEUoU1NNMjYwMl9BUEFOQSwgMiwgQVJSQVlfU0laRShzc20yNjAyX2lucHV0X3NlbGVjdCksCisJCQlzc20yNjAyX2lucHV0X3NlbGVjdCksCisJU09DX0VOVU1fU0lOR0xFKFNTTTI2MDJfQVBESUdJLCAxLCBBUlJBWV9TSVpFKHNzbTI2MDJfZGVlbXBoKSwKKwkJCXNzbTI2MDJfZGVlbXBoKSwKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3NtMjYweF9vdXRtaXhfdGx2W10gPSB7CkBAIC0xOTcsNyArMTg2LDcgQEAKIAk4MDAwLCAxNjAwMCwgMzIwMDAsIDQ4MDAwLCA5NjAwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qgc3NtMjYwMl9jb25zdHJhaW50c18xMjI4ODAwMCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qgc3NtMjYwMl9jb25zdHJhaW50c18xMjI4ODAwMCA9IHsKIAkubGlzdCA9IHNzbTI2MDJfcmF0ZXNfMTIyODgwMDAsCiAJLmNvdW50ID0gQVJSQVlfU0laRShzc20yNjAyX3JhdGVzXzEyMjg4MDAwKSwKIH07CkBAIC0yMDYsNyArMTk1LDcgQEAKIAk4MDAwLCA0NDEwMCwgODgyMDAsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IHNzbTI2MDJfY29uc3RyYWludHNfMTEyODk2MDAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IHNzbTI2MDJfY29uc3RyYWludHNfMTEyODk2MDAgPSB7CiAJLmxpc3QgPSBzc20yNjAyX3JhdGVzXzExMjg5NjAwLAogCS5jb3VudCA9IEFSUkFZX1NJWkUoc3NtMjYwMl9yYXRlc18xMTI4OTYwMCksCiB9OwpAQCAtNTI5LDcgKzUxOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc3NtMjYwMl9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCitzdGF0aWMgaW50IHNzbTI2MDJfY29kZWNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBzc20yNjAyX3ByaXYgKnNzbTI2MDIgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CkBAIC01NTQsNyArNTQzLDcgQEAKIAkJCUFSUkFZX1NJWkUoc3NtMjYwMl9yb3V0ZXMpKTsKIH0KIAotc3RhdGljIGludCBzc20yNjA0X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3N0YXRpYyBpbnQgc3NtMjYwNF9jb2RlY19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQ7CkBAIC01NjgsMTggKzU1NywxMSBAQAogCQkJQVJSQVlfU0laRShzc20yNjA0X3JvdXRlcykpOwogfQogCi1zdGF0aWMgaW50IHNzbTI2MHhfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQorc3RhdGljIGludCBzc20yNjB4X2NvZGVjX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3Qgc3NtMjYwMl9wcml2ICpzc20yNjAyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBzc20yNjAyLT5yZWdtYXA7Ci0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDAsIDAsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcmV0ID0gcmVnbWFwX3dyaXRlKHNzbTI2MDItPnJlZ21hcCwgU1NNMjYwMl9SRVNFVCwgMCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0OiAlZFxuIiwgcmV0KTsKQEAgLTU5NywxMCArNTc5LDEwIEBACiAKIAlzd2l0Y2ggKHNzbTI2MDItPnR5cGUpIHsKIAljYXNlIFNTTTI2MDI6Ci0JCXJldCA9IHNzbTI2MDJfcHJvYmUoY29kZWMpOworCQlyZXQgPSBzc20yNjAyX2NvZGVjX3Byb2JlKGNvZGVjKTsKIAkJYnJlYWs7CiAJY2FzZSBTU00yNjA0OgotCQlyZXQgPSBzc20yNjA0X3Byb2JlKGNvZGVjKTsKKwkJcmV0ID0gc3NtMjYwNF9jb2RlY19wcm9iZShjb2RlYyk7CiAJCWJyZWFrOwogCX0KIApAQCAtNjIwLDcgKzYwMiw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9zc20yNjAyID0gewotCS5wcm9iZSA9CXNzbTI2MHhfcHJvYmUsCisJLnByb2JlID0Jc3NtMjYweF9jb2RlY19wcm9iZSwKIAkucmVtb3ZlID0Jc3NtMjYwMl9yZW1vdmUsCiAJLnN1c3BlbmQgPQlzc20yNjAyX3N1c3BlbmQsCiAJLnJlc3VtZSA9CXNzbTI2MDJfcmVzdW1lLApAQCAtNjM5LDcgKzYyMSw3IEBACiAJcmV0dXJuIHJlZyA9PSBTU00yNjAyX1JFU0VUOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgc3NtMjYwMl9yZWdtYXBfY29uZmlnID0geworY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgc3NtMjYwMl9yZWdtYXBfY29uZmlnID0gewogCS52YWxfYml0cyA9IDksCiAJLnJlZ19iaXRzID0gNywKIApAQCAtNjUwLDEzNCArNjMyLDI4IEBACiAJLnJlZ19kZWZhdWx0c19yYXcgPSBzc20yNjAyX3JlZywKIAkubnVtX3JlZ19kZWZhdWx0c19yYXcgPSBBUlJBWV9TSVpFKHNzbTI2MDJfcmVnKSwKIH07CitFWFBPUlRfU1lNQk9MX0dQTChzc20yNjAyX3JlZ21hcF9jb25maWcpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKLXN0YXRpYyBpbnQgc3NtMjYwMl9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK2ludCBzc20yNjAyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBzc20yNjAyX3R5cGUgdHlwZSwKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCiB7CiAJc3RydWN0IHNzbTI2MDJfcHJpdiAqc3NtMjYwMjsKLQlpbnQgcmV0OwogCi0Jc3NtMjYwMiA9IGRldm1fa3phbGxvYygmc3BpLT5kZXYsIHNpemVvZihzdHJ1Y3Qgc3NtMjYwMl9wcml2KSwKLQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKHJlZ21hcCkpCisJCXJldHVybiBQVFJfRVJSKHJlZ21hcCk7CisKKwlzc20yNjAyID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzc20yNjAyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNzbTI2MDIgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcGlfc2V0X2RydmRhdGEoc3BpLCBzc20yNjAyKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBzc20yNjAyKTsKIAlzc20yNjAyLT50eXBlID0gU1NNMjYwMjsKKwlzc20yNjAyLT5yZWdtYXAgPSByZWdtYXA7CiAKLQlzc20yNjAyLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZzc20yNjAyX3JlZ21hcF9jb25maWcpOwotCWlmIChJU19FUlIoc3NtMjYwMi0+cmVnbWFwKSkKLQkJcmV0dXJuIFBUUl9FUlIoc3NtMjYwMi0+cmVnbWFwKTsKLQotCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2LAotCQkJJnNvY19jb2RlY19kZXZfc3NtMjYwMiwgJnNzbTI2MDJfZGFpLCAxKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJnNvY19jb2RlY19kZXZfc3NtMjYwMiwKKwkJJnNzbTI2MDJfZGFpLCAxKTsKIH0KLQotc3RhdGljIGludCBzc20yNjAyX3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHNzbTI2MDJfc3BpX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZQk9ICJzc20yNjAyIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLQkucHJvYmUJCT0gc3NtMjYwMl9zcGlfcHJvYmUsCi0JLnJlbW92ZQkJPSBzc20yNjAyX3NwaV9yZW1vdmUsCi19OwotI2VuZGlmCi0KLSNpZiBJU19FTkFCTEVEKENPTkZJR19JMkMpCi0vKgotICogc3NtMjYwMiAyIHdpcmUgYWRkcmVzcyBpcyBkZXRlcm1pbmVkIGJ5IEdQSU81Ci0gKiBzdGF0ZSBkdXJpbmcgcG93ZXJ1cC4KLSAqICAgIGxvdyAgPSAweDFhCi0gKiAgICBoaWdoID0gMHgxYgotICovCi1zdGF0aWMgaW50IHNzbTI2MDJfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3Qgc3NtMjYwMl9wcml2ICpzc20yNjAyOwotCWludCByZXQ7Ci0KLQlzc20yNjAyID0gZGV2bV9remFsbG9jKCZpMmMtPmRldiwgc2l6ZW9mKHN0cnVjdCBzc20yNjAyX3ByaXYpLAotCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmIChzc20yNjAyID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaTJjX3NldF9jbGllbnRkYXRhKGkyYywgc3NtMjYwMik7Ci0Jc3NtMjYwMi0+dHlwZSA9IGlkLT5kcml2ZXJfZGF0YTsKLQotCXNzbTI2MDItPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyYywgJnNzbTI2MDJfcmVnbWFwX2NvbmZpZyk7Ci0JaWYgKElTX0VSUihzc20yNjAyLT5yZWdtYXApKQotCQlyZXR1cm4gUFRSX0VSUihzc20yNjAyLT5yZWdtYXApOwotCi0JcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCi0JCQkmc29jX2NvZGVjX2Rldl9zc20yNjAyLCAmc3NtMjYwMl9kYWksIDEpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc3NtMjYwMl9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBzc20yNjAyX2kyY19pZFtdID0gewotCXsgInNzbTI2MDIiLCBTU00yNjAyIH0sCi0JeyAic3NtMjYwMyIsIFNTTTI2MDIgfSwKLQl7ICJzc20yNjA0IiwgU1NNMjYwNCB9LAotCXsgfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzc20yNjAyX2kyY19pZCk7Ci0KLS8qIGNvcmdpIGkyYyBjb2RlYyBjb250cm9sIGxheWVyICovCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgc3NtMjYwMl9pMmNfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInNzbTI2MDIiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotCS5wcm9iZSA9IHNzbTI2MDJfaTJjX3Byb2JlLAotCS5yZW1vdmUgPSBzc20yNjAyX2kyY19yZW1vdmUsCi0JLmlkX3RhYmxlID0gc3NtMjYwMl9pMmNfaWQsCi19OwotI2VuZGlmCi0KLQotc3RhdGljIGludCBfX2luaXQgc3NtMjYwMl9tb2Rpbml0KHZvaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQotCXJldCA9IHNwaV9yZWdpc3Rlcl9kcml2ZXIoJnNzbTI2MDJfc3BpX2RyaXZlcik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLSNlbmRpZgotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQotCXJldCA9IGkyY19hZGRfZHJpdmVyKCZzc20yNjAyX2kyY19kcml2ZXIpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0jZW5kaWYKLQotCXJldHVybiByZXQ7Ci19Ci1tb2R1bGVfaW5pdChzc20yNjAyX21vZGluaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc3NtMjYwMl9leGl0KHZvaWQpCi17Ci0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKLQlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJnNzbTI2MDJfc3BpX2RyaXZlcik7Ci0jZW5kaWYKLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKLQlpMmNfZGVsX2RyaXZlcigmc3NtMjYwMl9pMmNfZHJpdmVyKTsKLSNlbmRpZgotfQotbW9kdWxlX2V4aXQoc3NtMjYwMl9leGl0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNzbTI2MDJfcHJvYmUpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgU1NNMjYwMi9TU00yNjAzL1NTTTI2MDQgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJDbGlmZiBDYWkiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi5oIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmgKaW5kZXggZmJkMDdkNy4uNzQ3NTM4OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmgKQEAgLTI4LDYgKzI4LDIwIEBACiAjaWZuZGVmIF9TU00yNjAyX0gKICNkZWZpbmUgX1NTTTI2MDJfSAogCisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKK3N0cnVjdCBkZXZpY2U7CisKK2VudW0gc3NtMjYwMl90eXBlIHsKKwlTU00yNjAyLAorCVNTTTI2MDQsCit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgc3NtMjYwMl9yZWdtYXBfY29uZmlnOworCitpbnQgc3NtMjYwMl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gc3NtMjYwMl90eXBlIHR5cGUsCisJc3RydWN0IHJlZ21hcCAqcmVnbWFwKTsKKwogLyogU1NNMjYwMiBDb2RlYyBSZWdpc3RlciBkZWZpbml0aW9ucyAqLwogCiAjZGVmaW5lIFNTTTI2MDJfTElOVk9MICAgMHgwMApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zdGEzMnguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhMzJ4LmMKaW5kZXggMjczNTM2MS4uMTI1Nzc3NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zdGEzMnguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3N0YTMyeC5jCkBAIC04NzIsMTYgKzg3Miw2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JLyogVGVsbCBBU29DIHdoYXQga2luZCBvZiBJL08gdG8gdXNlIHRvIHJlYWQgdGhlIHJlZ2lzdGVycy4gIEFTb0Mgd2lsbAotCSAqIHRoZW4gZG8gdGhlIEkyQyB0cmFuc2FjdGlvbnMgaXRzZWxmLgotCSAqLwotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBzdGEzMngtPnJlZ21hcDsKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgImZhaWxlZCB0byBzZXQgY2FjaGUgSS9PIChyZXQ9JWkpXG4iLCByZXQpOwotCQlnb3RvIGVycjsKLQl9Ci0KIAkvKiBDaGlwIGRvY3VtZW50YXRpb24gZXhwbGljaXRseSByZXF1aXJlcyB0aGF0IHRoZSByZXNldCB2YWx1ZXMKIAkgKiBvZiByZXNlcnZlZCByZWdpc3RlciBiaXRzIGFyZSBsZWZ0IHVudG91Y2hlZC4KIAkgKiBXcml0ZSB0aGUgcmVnaXN0ZXIgZGVmYXVsdCB2YWx1ZSB0byBjYWNoZSBmb3IgcmVzZXJ2ZWQgcmVnaXN0ZXJzLApAQCAtOTQ2LDEwICs5MzYsNiBAQAogCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShzdGEzMngtPnN1cHBsaWVzKSwgc3RhMzJ4LT5zdXBwbGllcyk7CiAKIAlyZXR1cm4gMDsKLQotZXJyOgotCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShzdGEzMngtPnN1cHBsaWVzKSwgc3RhMzJ4LT5zdXBwbGllcyk7Ci0JcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBzdGEzMnhfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhNTI5LmMgYi9zb3VuZC9zb2MvY29kZWNzL3N0YTUyOS5jCmluZGV4IDQwYzA3YmUuLmE0MGM0YjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhNTI5LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zdGE1MjkuYwpAQCAtMTQxLDcgKzE0MSw3IEBACiAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShvdXRfZ2Fpbl90bHYsIC05MTUwLCA1MCwgMCk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUobWFzdGVyX3ZvbF90bHYsIC0xMjc1MCwgNTAsIDApOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHB3bV9zcmMsIFNUQTUyOV9GRlhDRkcxLCA0LCBwd21fbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwd21fc3JjLCBTVEE1MjlfRkZYQ0ZHMSwgNCwgcHdtX21vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdGE1Mjlfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX0RPVUJMRV9SX1RMVigiRGlnaXRhbCBQbGF5YmFjayBWb2x1bWUiLCBTVEE1MjlfTFZPTCwgU1RBNTI5X1JWT0wsIDAsCkBAIC0xOTMsOCArMTkzLDcgQEAKIAkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJaW50IHBkYXRhLCBwbGF5X2ZyZXFfdmFsLCByZWNvcmRfZnJlcV92YWw7CiAJaW50IGJjbGtfdG9fZnNfcmF0aW87CiAKQEAgLTMyMiwxNiArMzIxLDYgQEAKIAogc3RhdGljIGludCBzdGE1MjlfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXN0cnVjdCBzdGE1MjkgKnN0YTUyOSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQ7Ci0KLQljb2RlYy0+Y29udHJvbF9kYXRhID0gc3RhNTI5LT5yZWdtYXA7Ci0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIFNORF9TT0NfUkVHTUFQKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CiAJc3RhNTI5X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhYzk3NjYuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhYzk3NjYuYwppbmRleCBhNTQ1NWMxLi41M2I4MTBkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3N0YWM5NzY2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zdGFjOTc2Ni5jCkBAIC02MiwyNSArNjIsMjUgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpzdGFjOTc2Nl9ib29zdDJbXSA9IHsiMGRCIiwgIjIwZEIifTsKIHN0YXRpYyBjb25zdCBjaGFyICpzdGFjOTc2Nl9zdGVyZW9fbWljW10gPSB7Ik9mZiIsICJPbiJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHN0YWM5NzY2X3JlY29yZF9lbnVtID0KLQlTT0NfRU5VTV9ET1VCTEUoQUM5N19SRUNfU0VMLCA4LCAwLCA4LCBzdGFjOTc2Nl9yZWNvcmRfbXV4KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RhYzk3NjZfbW9ub19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQUM5N19HRU5FUkFMX1BVUlBPU0UsIDksIDIsIHN0YWM5NzY2X21vbm9fbXV4KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RhYzk3NjZfbWljX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X0dFTkVSQUxfUFVSUE9TRSwgOCwgMiwgc3RhYzk3NjZfbWljX211eCk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHN0YWM5NzY2X1NQRElGX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X1NUQUNfREFfQ09OVFJPTCwgMSwgMiwgc3RhYzk3NjZfU1BESUZfbXV4KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RhYzk3NjZfcG9wYnlwYXNzX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X0dFTkVSQUxfUFVSUE9TRSwgMTUsIDIsIHN0YWM5NzY2X3BvcGJ5cGFzc19tdXgpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGFjOTc2Nl9yZWNvcmRfYWxsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X1NUQUNfQU5BTE9HX1NQRUNJQUwsIDEyLCAyLAotCQkJc3RhYzk3NjZfcmVjb3JkX2FsbF9tdXgpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGFjOTc2Nl9ib29zdDFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFDOTdfTUlDLCA2LCAyLCBzdGFjOTc2Nl9ib29zdDEpOyAvKiAwLzEwZEIgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RhYzk3NjZfYm9vc3QyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X1NUQUNfQU5BTE9HX1NQRUNJQUwsIDIsIDIsIHN0YWM5NzY2X2Jvb3N0Mik7IC8qIDAvMjBkQiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGFjOTc2Nl9zdGVyZW9fbWljX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X1NUQUNfU1RFUkVPX01JQywgMiwgMSwgc3RhYzk3NjZfc3RlcmVvX21pYyk7CitzdGF0aWMgU09DX0VOVU1fRE9VQkxFX0RFQ0woc3RhYzk3NjZfcmVjb3JkX2VudW0sCisJCQkgICAgQUM5N19SRUNfU0VMLCA4LCAwLCBzdGFjOTc2Nl9yZWNvcmRfbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGFjOTc2Nl9tb25vX2VudW0sCisJCQkgICAgQUM5N19HRU5FUkFMX1BVUlBPU0UsIDksIHN0YWM5NzY2X21vbm9fbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGFjOTc2Nl9taWNfZW51bSwKKwkJCSAgICBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgOCwgc3RhYzk3NjZfbWljX211eCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3RhYzk3NjZfU1BESUZfZW51bSwKKwkJCSAgICBBQzk3X1NUQUNfREFfQ09OVFJPTCwgMSwgc3RhYzk3NjZfU1BESUZfbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGFjOTc2Nl9wb3BieXBhc3NfZW51bSwKKwkJCSAgICBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgMTUsIHN0YWM5NzY2X3BvcGJ5cGFzc19tdXgpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHN0YWM5NzY2X3JlY29yZF9hbGxfZW51bSwKKwkJCSAgICBBQzk3X1NUQUNfQU5BTE9HX1NQRUNJQUwsIDEyLAorCQkJICAgIHN0YWM5NzY2X3JlY29yZF9hbGxfbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGFjOTc2Nl9ib29zdDFfZW51bSwKKwkJCSAgICBBQzk3X01JQywgNiwgc3RhYzk3NjZfYm9vc3QxKTsgLyogMC8xMGRCICovCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3RhYzk3NjZfYm9vc3QyX2VudW0sCisJCQkgICAgQUM5N19TVEFDX0FOQUxPR19TUEVDSUFMLCAyLCBzdGFjOTc2Nl9ib29zdDIpOyAvKiAwLzIwZEIgKi8KK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGFjOTc2Nl9zdGVyZW9fbWljX2VudW0sCisJCQkgICAgQUM5N19TVEFDX1NURVJFT19NSUMsIDIsIHN0YWM5NzY2X3N0ZXJlb19taWMpOwogCiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKG1hc3Rlcl90bHYsIC00NjAwLCAwKTsKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIocmVjb3JkX3RsdiwgMCwgMjI1MCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLWkyYy5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGZjNDYwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy1pMmMuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogQUxTQSBTb0MgVExWMzIwQUlDMjMgY29kZWMgZHJpdmVyIEkyQyBpbnRlcmZhY2UKKyAqCisgKiBBdXRob3I6ICAgICAgQXJ1biBLUywgPGFydW5rc0BtaXN0cmFsc29sdXRpb25zLmNvbT4KKyAqIENvcHlyaWdodDogICAoQykgMjAwOCBNaXN0cmFsIFNvbHV0aW9ucyBQdnQgTHRkLiwKKyAqCisgKiBCYXNlZCBvbiBzb3VuZC9zb2MvY29kZWNzL3dtODczMS5jIGJ5IFJpY2hhcmQgUHVyZGllCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlICJ0bHYzMjBhaWMyMy5oIgorCitzdGF0aWMgaW50IHRsdjMyMGFpYzIzX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaTJjX2lkKQoreworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoaTJjLT5hZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyYywgJnRsdjMyMGFpYzIzX3JlZ21hcCk7CisJcmV0dXJuIHRsdjMyMGFpYzIzX3Byb2JlKCZpMmMtPmRldiwgcmVnbWFwKTsKK30KKworc3RhdGljIGludCBfX2V4aXQgdGx2MzIwYWljMjNfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdGx2MzIwYWljMjNfaWRbXSA9IHsKKwl7InRsdjMyMGFpYzIzIiwgMH0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB0bHYzMjBhaWMyM19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB0bHYzMjBhaWMyM19pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gInRsdjMyMGFpYzIzLWNvZGVjIiwKKwkJICAgfSwKKwkucHJvYmUgPSB0bHYzMjBhaWMyM19pMmNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZXhpdF9wKHRsdjMyMGFpYzIzX2kyY19yZW1vdmUpLAorCS5pZF90YWJsZSA9IHRsdjMyMGFpYzIzX2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIodGx2MzIwYWljMjNfaTJjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBUTFYzMjBBSUMyMyBjb2RlYyBkcml2ZXIgSTJDIik7CitNT0RVTEVfQVVUSE9SKCJBcnVuIEtTIDxhcnVua3NAbWlzdHJhbHNvbHV0aW9ucy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLXNwaS5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy1zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjM4N2U0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy1zcGkuYwpAQCAtMCwwICsxLDU2IEBACisvKgorICogQUxTQSBTb0MgVExWMzIwQUlDMjMgY29kZWMgZHJpdmVyIFNQSSBpbnRlcmZhY2UKKyAqCisgKiBBdXRob3I6ICAgICAgQXJ1biBLUywgPGFydW5rc0BtaXN0cmFsc29sdXRpb25zLmNvbT4KKyAqIENvcHlyaWdodDogICAoQykgMjAwOCBNaXN0cmFsIFNvbHV0aW9ucyBQdnQgTHRkLiwKKyAqCisgKiBCYXNlZCBvbiBzb3VuZC9zb2MvY29kZWNzL3dtODczMS5jIGJ5IFJpY2hhcmQgUHVyZGllCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCisjaW5jbHVkZSAidGx2MzIwYWljMjMuaCIKKworc3RhdGljIGludCBhaWMyM19zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAicHJvYmluZyB0bHYzMjBhaWMyMyBzcGkgZGV2aWNlXG4iKTsKKworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzA7CisJcmV0ID0gc3BpX3NldHVwKHNwaSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZ0bHYzMjBhaWMyM19yZWdtYXApOworCXJldHVybiB0bHYzMjBhaWMyM19wcm9iZSgmc3BpLT5kZXYsIHJlZ21hcCk7Cit9CisKK3N0YXRpYyBpbnQgYWljMjNfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWljMjNfc3BpID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInRsdjMyMGFpYzIzIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhaWMyM19zcGlfcHJvYmUsCisJLnJlbW92ZSA9IGFpYzIzX3NwaV9yZW1vdmUsCit9OworCittb2R1bGVfc3BpX2RyaXZlcihhaWMyM19zcGkpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgVExWMzIwQUlDMjMgY29kZWMgZHJpdmVyIFNQSSIpOworTU9EVUxFX0FVVEhPUigiQXJ1biBLUyA8YXJ1bmtzQG1pc3RyYWxzb2x1dGlvbnMuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5jCmluZGV4IDVkNDMwY2MuLjIwODY0ZWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CkBAIC01MSw3ICs1MCw3IEBACiAJeyAgOSwgMHgwMDAwIH0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgdGx2MzIwYWljMjNfcmVnbWFwID0geworY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgdGx2MzIwYWljMjNfcmVnbWFwID0gewogCS5yZWdfYml0cyA9IDcsCiAJLnZhbF9iaXRzID0gOSwKIApAQCAtNjAsMjAgKzU5LDIxIEBACiAJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKHRsdjMyMGFpYzIzX3JlZyksCiAJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCiB9OworRVhQT1JUX1NZTUJPTCh0bHYzMjBhaWMyM19yZWdtYXApOwogCiBzdGF0aWMgY29uc3QgY2hhciAqcmVjX3NyY190ZXh0W10gPSB7ICJMaW5lIiwgIk1pYyIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICpkZWVtcGhfdGV4dFtdID0geyJOb25lIiwgIjMyS2h6IiwgIjQ0LjFLaHoiLCAiNDhLaHoifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByZWNfc3JjX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUTFYzMjBBSUMyM19BTkxHLCAyLCAyLCByZWNfc3JjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJlY19zcmNfZW51bSwKKwkJCSAgICBUTFYzMjBBSUMyM19BTkxHLCAyLCByZWNfc3JjX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdGx2MzIwYWljMjNfcmVjX3NyY19tdXhfY29udHJvbHMgPQogU09DX0RBUE1fRU5VTSgiSW5wdXQgU2VsZWN0IiwgcmVjX3NyY19lbnVtKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0bHYzMjBhaWMyM19yZWNfc3JjID0KLQlTT0NfRU5VTV9TSU5HTEUoVExWMzIwQUlDMjNfQU5MRywgMiwgMiwgcmVjX3NyY190ZXh0KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdGx2MzIwYWljMjNfZGVlbXBoID0KLQlTT0NfRU5VTV9TSU5HTEUoVExWMzIwQUlDMjNfRElHVCwgMSwgNCwgZGVlbXBoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHRsdjMyMGFpYzIzX3JlY19zcmMsCisJCQkgICAgVExWMzIwQUlDMjNfQU5MRywgMiwgcmVjX3NyY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh0bHYzMjBhaWMyM19kZWVtcGgsCisJCQkgICAgVExWMzIwQUlDMjNfRElHVCwgMSwgZGVlbXBoX3RleHQpOwogCiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUob3V0X2dhaW5fdGx2LCAtMTIxMDAsIDEwMCwgMCk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoaW5wdXRfZ2Fpbl90bHYsIC0xNzI1LCA3NSwgMCk7CkBAIC00MDAsNyArNDAwLDcgQEAKIAlzdHJ1Y3QgYWljMjMgKmFpYzIzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKIAkvKiBkZWFjdGl2YXRlICovCi0JaWYgKCFjb2RlYy0+YWN0aXZlKSB7CisJaWYgKCFzbmRfc29jX2NvZGVjX2lzX2FjdGl2ZShjb2RlYykpIHsKIAkJdWRlbGF5KDUwKTsKIAkJc25kX3NvY193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfQUNUSVZFLCAweDApOwogCX0KQEAgLTU1NywxNiArNTU3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0bHYzMjBhaWMyM19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCitzdGF0aWMgaW50IHRsdjMyMGFpYzIzX2NvZGVjX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogUmVzZXQgY29kZWMgKi8KIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19SRVNFVCwgMCk7CiAKQEAgLTYwNCw3ICs1OTYsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfdGx2MzIwYWljMjMgPSB7Ci0JLnByb2JlID0gdGx2MzIwYWljMjNfcHJvYmUsCisJLnByb2JlID0gdGx2MzIwYWljMjNfY29kZWNfcHJvYmUsCiAJLnJlbW92ZSA9IHRsdjMyMGFpYzIzX3JlbW92ZSwKIAkuc3VzcGVuZCA9IHRsdjMyMGFpYzIzX3N1c3BlbmQsCiAJLnJlc3VtZSA9IHRsdjMyMGFpYzIzX3Jlc3VtZSwKQEAgLTYxNyw1NiArNjA5LDI1IEBACiAJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfaW50ZXJjb24pLAogfTsKIAotLyoKLSAqIElmIHRoZSBpMmMgbGF5ZXIgd2VyZW4ndCBzbyBicm9rZW4sIHdlIGNvdWxkIHBhc3MgdGhpcyBraW5kIG9mIGRhdGEKLSAqIGFyb3VuZAotICovCi1zdGF0aWMgaW50IHRsdjMyMGFpYzIzX2NvZGVjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCi0JCQkJICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmkyY19pZCkKK2ludCB0bHYzMjBhaWMyM19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCkKIHsKIAlzdHJ1Y3QgYWljMjMgKmFpYzIzOwotCWludCByZXQ7CiAKLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGkyYy0+YWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKElTX0VSUihyZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOwogCi0JYWljMjMgPSBkZXZtX2t6YWxsb2MoJmkyYy0+ZGV2LCBzaXplb2Yoc3RydWN0IGFpYzIzKSwgR0ZQX0tFUk5FTCk7CisJYWljMjMgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IGFpYzIzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGFpYzIzID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JYWljMjMtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyYywgJnRsdjMyMGFpYzIzX3JlZ21hcCk7Ci0JaWYgKElTX0VSUihhaWMyMy0+cmVnbWFwKSkKLQkJcmV0dXJuIFBUUl9FUlIoYWljMjMtPnJlZ21hcCk7CisJYWljMjMtPnJlZ21hcCA9IHJlZ21hcDsKIAotCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGFpYzIzKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBhaWMyMyk7CiAKLQlyZXQgPSAgc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCi0JCQkmc29jX2NvZGVjX2Rldl90bHYzMjBhaWMyMywgJnRsdjMyMGFpYzIzX2RhaSwgMSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYyhkZXYsICZzb2NfY29kZWNfZGV2X3RsdjMyMGFpYzIzLAorCQkJCSAgICAgICZ0bHYzMjBhaWMyM19kYWksIDEpOwogfQotc3RhdGljIGludCBfX2V4aXQgdGx2MzIwYWljMjNfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQotewotCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdGx2MzIwYWljMjNfaWRbXSA9IHsKLQl7InRsdjMyMGFpYzIzIiwgMH0sCi0Je30KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB0bHYzMjBhaWMyM19pZCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB0bHYzMjBhaWMyM19pMmNfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCSAgIC5uYW1lID0gInRsdjMyMGFpYzIzLWNvZGVjIiwKLQkJICAgfSwKLQkucHJvYmUgPSB0bHYzMjBhaWMyM19jb2RlY19wcm9iZSwKLQkucmVtb3ZlID0gX19leGl0X3AodGx2MzIwYWljMjNfaTJjX3JlbW92ZSksCi0JLmlkX3RhYmxlID0gdGx2MzIwYWljMjNfaWQsCi19OwotCi1tb2R1bGVfaTJjX2RyaXZlcih0bHYzMjBhaWMyM19pMmNfZHJpdmVyKTsKK0VYUE9SVF9TWU1CT0wodGx2MzIwYWljMjNfcHJvYmUpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgVExWMzIwQUlDMjMgY29kZWMgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJBcnVuIEtTIDxhcnVua3NAbWlzdHJhbHNvbHV0aW9ucy5jb20+Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLmggYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLmgKaW5kZXggZTgwNDEyMC4uM2E3MjM1YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjMuaApAQCAtMTIsNiArMTIsMTIgQEAKICNpZm5kZWYgX1RMVjMyMEFJQzIzX0gKICNkZWZpbmUgX1RMVjMyMEFJQzIzX0gKIAorc3RydWN0IGRldmljZTsKK3N0cnVjdCByZWdtYXBfY29uZmlnOworCitleHRlcm4gY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgdGx2MzIwYWljMjNfcmVnbWFwOworaW50IHRsdjMyMGFpYzIzX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlZ21hcCAqcmVnbWFwKTsKKwogLyogQ29kZWMgVExWMzIwQUlDMjMgKi8KICNkZWZpbmUgVExWMzIwQUlDMjNfTElOVk9MCQkweDAwCiAjZGVmaW5lIFRMVjMyMEFJQzIzX1JJTlZPTAkJMHgwMQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyNi5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyNi5jCmluZGV4IDk0YTY1OGYuLjQzMDY5ZGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjYuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzI2LmMKQEAgLTIzOCw4ICsyMzgsOSBAQAogICogQUxTQSBjb250cm9scwogICovCiBzdGF0aWMgY29uc3QgY2hhciAqYWljMjZfY2FwdHVyZV9zcmNfdGV4dFtdID0geyJNaWMiLCAiQXV4In07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFpYzI2X2NhcHR1cmVfc3JjX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBSUMyNl9SRUdfQVVESU9fQ1RSTDEsIDEyLCAyLCBhaWMyNl9jYXB0dXJlX3NyY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWMyNl9jYXB0dXJlX3NyY19lbnVtLAorCQkJICAgIEFJQzI2X1JFR19BVURJT19DVFJMMSwgMTIsCisJCQkgICAgYWljMjZfY2FwdHVyZV9zcmNfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWMyNl9zbmRfY29udHJvbHNbXSA9IHsKIAkvKiBPdXRwdXQgKi8KQEAgLTI5NSw4ICsyOTYsNiBAQAogCXN0cnVjdCBhaWMyNiAqYWljMjYgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldik7CiAJaW50IHJldCwgcmVnOwogCi0Jc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDE2LCAxNiwgU05EX1NPQ19SRUdNQVApOwotCiAJYWljMjYtPmNvZGVjID0gY29kZWM7CiAKIAkvKiBSZXNldCB0aGUgY29kZWMgdG8gcG93ZXIgb24gZGVmYXVsdHMgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzF4eC5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMXh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmExNThjZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzF4eC5jCkBAIC0wLDAgKzEsMTI4MCBAQAorLyoKKyAqIEFMU0EgU29DIFRMVjMyMEFJQzMxWFggY29kZWMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogQXV0aG9yOiBKeXJpIFNhcmhhIDxqc2FyaGFAdGkuY29tPgorICoKKyAqIEJhc2VkIG9uIGdyb3VuZCB3b3JrIGJ5OiBBaml0IEt1bGthcm5pIDx4MDE3NTc2NUB0aS5jb20+CisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgQVMgSVMgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogVGhlIFRMVjMyMEFJQzMxeHggc2VyaWVzIG9mIGF1ZGlvIGNvZGVjIGlzIGEgbG93LXBvd2VyLCBoaWdobHkgaW50ZWdyYXRlZAorICogaGlnaCBwZXJmb3JtYW5jZSBjb2RlYyB3aGljaCBwcm92aWRlcyBhIHN0ZXJlbyBEQUMsIGEgbW9ubyBBREMsCisgKiBhbmQgbW9uby9zdGVyZW8gQ2xhc3MtRCBzcGVha2VyIGRyaXZlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL3NvdW5kL3RsdjMyMGFpYzMxeHgtbWljYmlhcy5oPgorCisjaW5jbHVkZSAidGx2MzIwYWljMzF4eC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19kZWZhdWx0IGFpYzMxeHhfcmVnX2RlZmF1bHRzW10gPSB7CisJeyBBSUMzMVhYX0NMS01VWCwgMHgwMCB9LAorCXsgQUlDMzFYWF9QTExQUiwgMHgxMSB9LAorCXsgQUlDMzFYWF9QTExKLCAweDA0IH0sCisJeyBBSUMzMVhYX1BMTERNU0IsIDB4MDAgfSwKKwl7IEFJQzMxWFhfUExMRExTQiwgMHgwMCB9LAorCXsgQUlDMzFYWF9OREFDLCAweDAxIH0sCisJeyBBSUMzMVhYX01EQUMsIDB4MDEgfSwKKwl7IEFJQzMxWFhfRE9TUk1TQiwgMHgwMCB9LAorCXsgQUlDMzFYWF9ET1NSTFNCLCAweDgwIH0sCisJeyBBSUMzMVhYX05BREMsIDB4MDEgfSwKKwl7IEFJQzMxWFhfTUFEQywgMHgwMSB9LAorCXsgQUlDMzFYWF9BT1NSLCAweDgwIH0sCisJeyBBSUMzMVhYX0lGQUNFMSwgMHgwMCB9LAorCXsgQUlDMzFYWF9EQVRBX09GRlNFVCwgMHgwMCB9LAorCXsgQUlDMzFYWF9JRkFDRTIsIDB4MDAgfSwKKwl7IEFJQzMxWFhfQkNMS04sIDB4MDEgfSwKKwl7IEFJQzMxWFhfREFDU0VUVVAsIDB4MTQgfSwKKwl7IEFJQzMxWFhfREFDTVVURSwgMHgwYyB9LAorCXsgQUlDMzFYWF9MREFDVk9MLCAweDAwIH0sCisJeyBBSUMzMVhYX1JEQUNWT0wsIDB4MDAgfSwKKwl7IEFJQzMxWFhfQURDU0VUVVAsIDB4MDAgfSwKKwl7IEFJQzMxWFhfQURDRkdBLCAweDgwIH0sCisJeyBBSUMzMVhYX0FEQ1ZPTCwgMHgwMCB9LAorCXsgQUlDMzFYWF9IUERSSVZFUiwgMHgwNCB9LAorCXsgQUlDMzFYWF9TUEtBTVAsIDB4MDYgfSwKKwl7IEFJQzMxWFhfREFDTUlYRVJST1VURSwgMHgwMCB9LAorCXsgQUlDMzFYWF9MQU5BTE9HSFBMLCAweDdmIH0sCisJeyBBSUMzMVhYX1JBTkFMT0dIUFIsIDB4N2YgfSwKKwl7IEFJQzMxWFhfTEFOQUxPR1NQTCwgMHg3ZiB9LAorCXsgQUlDMzFYWF9SQU5BTE9HU1BSLCAweDdmIH0sCisJeyBBSUMzMVhYX0hQTEdBSU4sIDB4MDIgfSwKKwl7IEFJQzMxWFhfSFBSR0FJTiwgMHgwMiB9LAorCXsgQUlDMzFYWF9TUExHQUlOLCAweDAwIH0sCisJeyBBSUMzMVhYX1NQUkdBSU4sIDB4MDAgfSwKKwl7IEFJQzMxWFhfTUlDQklBUywgMHgwMCB9LAorCXsgQUlDMzFYWF9NSUNQR0EsIDB4ODAgfSwKKwl7IEFJQzMxWFhfTUlDUEdBUEksIDB4MDAgfSwKKwl7IEFJQzMxWFhfTUlDUEdBTUksIDB4MDAgfSwKK307CisKK3N0YXRpYyBib29sIGFpYzMxeHhfdm9sYXRpbGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBBSUMzMVhYX1BBR0VDVEw6IC8qIHJlZ21hcCBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aGlzICovCisJY2FzZSBBSUMzMVhYX1JFU0VUOiAvKiBhbHdheXMgY2xlYXJzIGFmdGVyIHdyaXRlICovCisJY2FzZSBBSUMzMVhYX09UX0ZMQUc6CisJY2FzZSBBSUMzMVhYX0FEQ0ZMQUc6CisJY2FzZSBBSUMzMVhYX0RBQ0ZMQUcxOgorCWNhc2UgQUlDMzFYWF9EQUNGTEFHMjoKKwljYXNlIEFJQzMxWFhfT0ZGTEFHOiAvKiBTdGlja3kgaW50ZXJydXB0IGZsYWdzICovCisJY2FzZSBBSUMzMVhYX0lOVFJEQUNGTEFHOiAvKiBTdGlja3kgaW50ZXJydXB0IGZsYWdzICovCisJY2FzZSBBSUMzMVhYX0lOVFJBRENGTEFHOiAvKiBTdGlja3kgaW50ZXJydXB0IGZsYWdzICovCisJY2FzZSBBSUMzMVhYX0lOVFJEQUNGTEFHMjoKKwljYXNlIEFJQzMxWFhfSU5UUkFEQ0ZMQUcyOgorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBhaWMzMXh4X3dyaXRlYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIEFJQzMxWFhfT1RfRkxBRzoKKwljYXNlIEFJQzMxWFhfQURDRkxBRzoKKwljYXNlIEFJQzMxWFhfREFDRkxBRzE6CisJY2FzZSBBSUMzMVhYX0RBQ0ZMQUcyOgorCWNhc2UgQUlDMzFYWF9PRkZMQUc6IC8qIFN0aWNreSBpbnRlcnJ1cHQgZmxhZ3MgKi8KKwljYXNlIEFJQzMxWFhfSU5UUkRBQ0ZMQUc6IC8qIFN0aWNreSBpbnRlcnJ1cHQgZmxhZ3MgKi8KKwljYXNlIEFJQzMxWFhfSU5UUkFEQ0ZMQUc6IC8qIFN0aWNreSBpbnRlcnJ1cHQgZmxhZ3MgKi8KKwljYXNlIEFJQzMxWFhfSU5UUkRBQ0ZMQUcyOgorCWNhc2UgQUlDMzFYWF9JTlRSQURDRkxBRzI6CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlX2NmZyBhaWMzMXh4X3Jhbmdlc1tdID0geworCXsKKwkJLnJhbmdlX21pbiA9IDAsCisJCS5yYW5nZV9tYXggPSAxMiAqIDEyOCwKKwkJLnNlbGVjdG9yX3JlZyA9IEFJQzMxWFhfUEFHRUNUTCwKKwkJLnNlbGVjdG9yX21hc2sgPSAweGZmLAorCQkuc2VsZWN0b3Jfc2hpZnQgPSAwLAorCQkud2luZG93X3N0YXJ0ID0gMCwKKwkJLndpbmRvd19sZW4gPSAxMjgsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhaWMzMXh4X2kyY19yZWdtYXAgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSA4LAorCS53cml0ZWFibGVfcmVnID0gYWljMzF4eF93cml0ZWFibGUsCisJLnZvbGF0aWxlX3JlZyA9IGFpYzMxeHhfdm9sYXRpbGUsCisJLnJlZ19kZWZhdWx0cyA9IGFpYzMxeHhfcmVnX2RlZmF1bHRzLAorCS5udW1fcmVnX2RlZmF1bHRzID0gQVJSQVlfU0laRShhaWMzMXh4X3JlZ19kZWZhdWx0cyksCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLnJhbmdlcyA9IGFpYzMxeHhfcmFuZ2VzLAorCS5udW1fcmFuZ2VzID0gQVJSQVlfU0laRShhaWMzMXh4X3JhbmdlcyksCisJLm1heF9yZWdpc3RlciA9IDEyICogMTI4LAorfTsKKworI2RlZmluZSBBSUMzMVhYX05VTV9TVVBQTElFUwk2CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFpYzMxeHhfc3VwcGx5X25hbWVzW0FJQzMxWFhfTlVNX1NVUFBMSUVTXSA9IHsKKwkiSFBWREQiLAorCSJTUFJWREQiLAorCSJTUExWREQiLAorCSJBVkREIiwKKwkiSU9WREQiLAorCSJEVkREIiwKK307CisKK3N0cnVjdCBhaWMzMXh4X2Rpc2FibGVfbmIgeworCXN0cnVjdCBub3RpZmllcl9ibG9jayBuYjsKKwlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4OworfTsKKworc3RydWN0IGFpYzMxeHhfcHJpdiB7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXU4IGkyY19yZWdzX3N0YXR1czsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXN0cnVjdCBhaWMzMXh4X3BkYXRhIHBkYXRhOworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzW0FJQzMxWFhfTlVNX1NVUFBMSUVTXTsKKwlzdHJ1Y3QgYWljMzF4eF9kaXNhYmxlX25iIGRpc2FibGVfbmJbQUlDMzFYWF9OVU1fU1VQUExJRVNdOworCXVuc2lnbmVkIGludCBzeXNjbGs7CisJaW50IHJhdGVfZGl2X2xpbmU7Cit9OworCitzdHJ1Y3QgYWljMzF4eF9yYXRlX2RpdnMgeworCXUzMiBtY2xrOworCXUzMiByYXRlOworCXU4IHBfdmFsOworCXU4IHBsbF9qOworCXUxNiBwbGxfZDsKKwl1MTYgZG9zcjsKKwl1OCBuZGFjOworCXU4IG1kYWM7CisJdTggYW9zcjsKKwl1OCBuYWRjOworCXU4IG1hZGM7Cit9OworCisvKiBBREMgZGl2aWRlcnMgY2FuIGJlIGRpc2FibGVkIGJ5IGNvZmlndXJpbmcgdGhlbSB0byAwICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFpYzMxeHhfcmF0ZV9kaXZzIGFpYzMxeHhfZGl2c1tdID0geworCS8qIG1jbGsgICAgICByYXRlICBwbGw6IHAgIGoJIGQgICAgIGRvc3IgbmRhYyBtZGFjICBhb3JzIG5hZGMgbWFkYyAqLworCS8qIDhrIHJhdGUgKi8KKwl7MTIwMDAwMDAsICAgODAwMCwJMSwgOCwgMTkyMCwJMTI4LCAgNDgsICAyLAkxMjgsICA0OCwgIDJ9LAorCXsyNDAwMDAwMCwgICA4MDAwLAkyLCA4LCAxOTIwLAkxMjgsICA0OCwgIDIsCTEyOCwgIDQ4LCAgMn0sCisJezI1MDAwMDAwLCAgIDgwMDAsCTIsIDcsIDg2NDMsCTEyOCwgIDQ4LCAgMiwJMTI4LCAgNDgsICAyfSwKKwkvKiAxMS4wMjVrIHJhdGUgKi8KKwl7MTIwMDAwMDAsICAxMTAyNSwJMSwgNywgNTI2NCwJMTI4LCAgMzIsICAyLAkxMjgsICAzMiwgIDJ9LAorCXsyNDAwMDAwMCwgIDExMDI1LAkyLCA3LCA1MjY0LAkxMjgsICAzMiwgIDIsCTEyOCwgIDMyLCAgMn0sCisJezI1MDAwMDAwLCAgMTEwMjUsCTIsIDcsIDIyNTMsCTEyOCwgIDMyLCAgMiwJMTI4LCAgMzIsICAyfSwKKwkvKiAxNmsgcmF0ZSAqLworCXsxMjAwMDAwMCwgIDE2MDAwLAkxLCA4LCAxOTIwLAkxMjgsICAyNCwgIDIsCTEyOCwgIDI0LCAgMn0sCisJezI0MDAwMDAwLCAgMTYwMDAsCTIsIDgsIDE5MjAsCTEyOCwgIDI0LCAgMiwJMTI4LCAgMjQsICAyfSwKKwl7MjUwMDAwMDAsICAxNjAwMCwJMiwgNywgODY0MywJMTI4LCAgMjQsICAyLAkxMjgsICAyNCwgIDJ9LAorCS8qIDIyLjA1ayByYXRlICovCisJezEyMDAwMDAwLCAgMjIwNTAsCTEsIDcsIDUyNjQsCTEyOCwgIDE2LCAgMiwJMTI4LCAgMTYsICAyfSwKKwl7MjQwMDAwMDAsICAyMjA1MCwJMiwgNywgNTI2NCwJMTI4LCAgMTYsICAyLAkxMjgsICAxNiwgIDJ9LAorCXsyNTAwMDAwMCwgIDIyMDUwLAkyLCA3LCAyMjUzLAkxMjgsICAxNiwgIDIsCTEyOCwgIDE2LCAgMn0sCisJLyogMzJrIHJhdGUgKi8KKwl7MTIwMDAwMDAsICAzMjAwMCwJMSwgOCwgMTkyMCwJMTI4LCAgMTIsICAyLAkxMjgsICAxMiwgIDJ9LAorCXsyNDAwMDAwMCwgIDMyMDAwLAkyLCA4LCAxOTIwLAkxMjgsICAxMiwgIDIsCTEyOCwgIDEyLCAgMn0sCisJezI1MDAwMDAwLCAgMzIwMDAsCTIsIDcsIDg2NDMsCTEyOCwgIDEyLCAgMiwJMTI4LCAgMTIsICAyfSwKKwkvKiA0NC4xayByYXRlICovCisJezEyMDAwMDAwLCAgNDQxMDAsCTEsIDcsIDUyNjQsCTEyOCwgICA4LCAgMiwJMTI4LCAgIDgsICAyfSwKKwl7MjQwMDAwMDAsICA0NDEwMCwJMiwgNywgNTI2NCwJMTI4LCAgIDgsICAyLAkxMjgsICAgOCwgIDJ9LAorCXsyNTAwMDAwMCwgIDQ0MTAwLAkyLCA3LCAyMjUzLAkxMjgsICAgOCwgIDIsCTEyOCwgICA4LCAgMn0sCisJLyogNDhrIHJhdGUgKi8KKwl7MTIwMDAwMDAsICA0ODAwMCwJMSwgOCwgMTkyMCwJMTI4LCAgIDgsICAyLAkxMjgsICAgOCwgIDJ9LAorCXsyNDAwMDAwMCwgIDQ4MDAwLAkyLCA4LCAxOTIwLAkxMjgsICAgOCwgIDIsCTEyOCwgICA4LCAgMn0sCisJezI1MDAwMDAwLCAgNDgwMDAsCTIsIDcsIDg2NDMsCTEyOCwgICA4LCAgMiwJMTI4LCAgIDgsICAyfSwKKwkvKiA4OC4yayByYXRlICovCisJezEyMDAwMDAwLCAgODgyMDAsCTEsIDcsIDUyNjQsCSA2NCwgICA4LCAgMiwJIDY0LCAgIDgsICAyfSwKKwl7MjQwMDAwMDAsICA4ODIwMCwJMiwgNywgNTI2NCwJIDY0LCAgIDgsICAyLAkgNjQsICAgOCwgIDJ9LAorCXsyNTAwMDAwMCwgIDg4MjAwLAkyLCA3LCAyMjUzLAkgNjQsICAgOCwgIDIsCSA2NCwgICA4LCAgMn0sCisJLyogOTZrIHJhdGUgKi8KKwl7MTIwMDAwMDAsICA5NjAwMCwJMSwgOCwgMTkyMCwJIDY0LCAgIDgsICAyLAkgNjQsICAgOCwgIDJ9LAorCXsyNDAwMDAwMCwgIDk2MDAwLAkyLCA4LCAxOTIwLAkgNjQsICAgOCwgIDIsCSA2NCwgICA4LCAgMn0sCisJezI1MDAwMDAwLCAgOTYwMDAsCTIsIDcsIDg2NDMsCSA2NCwgICA4LCAgMiwJIDY0LCAgIDgsICAyfSwKKwkvKiAxNzYuNGsgcmF0ZSAqLworCXsxMjAwMDAwMCwgMTc2NDAwLAkxLCA3LCA1MjY0LAkgMzIsICAgOCwgIDIsCSAzMiwgICA4LCAgMn0sCisJezI0MDAwMDAwLCAxNzY0MDAsCTIsIDcsIDUyNjQsCSAzMiwgICA4LCAgMiwJIDMyLCAgIDgsICAyfSwKKwl7MjUwMDAwMDAsIDE3NjQwMCwJMiwgNywgMjI1MywJIDMyLCAgIDgsICAyLAkgMzIsICAgOCwgIDJ9LAorCS8qIDE5MmsgcmF0ZSAqLworCXsxMjAwMDAwMCwgMTkyMDAwLAkxLCA4LCAxOTIwLAkgMzIsICAgOCwgIDIsCSAzMiwgICA4LCAgMn0sCisJezI0MDAwMDAwLCAxOTIwMDAsCTIsIDgsIDE5MjAsCSAzMiwgICA4LCAgMiwJIDMyLCAgIDgsICAyfSwKKwl7MjUwMDAwMDAsIDE5MjAwMCwJMiwgNywgODY0MywJIDMyLCAgIDgsICAyLAkgMzIsICAgOCwgIDJ9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsZGFjX2luX3RleHRbXSA9IHsKKwkiT2ZmIiwgIkxlZnQgRGF0YSIsICJSaWdodCBEYXRhIiwgIk1vbm8iCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJkYWNfaW5fdGV4dFtdID0geworCSJPZmYiLCAiUmlnaHQgRGF0YSIsICJMZWZ0IERhdGEiLCAiTW9ubyIKK307CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsZGFjX2luX2VudW0sIEFJQzMxWFhfREFDU0VUVVAsIDQsIGxkYWNfaW5fdGV4dCk7CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChyZGFjX2luX2VudW0sIEFJQzMxWFhfREFDU0VUVVAsIDIsIHJkYWNfaW5fdGV4dCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWljX3NlbGVjdF90ZXh0W10gPSB7CisJIk9mZiIsICJGRlIgMTAgT2htIiwgIkZGUiAyMCBPaG0iLCAiRkZSIDQwIE9obSIKK307CisKK3N0YXRpYyBjb25zdAorU09DX0VOVU1fU0lOR0xFX0RFQ0wobWljMWxwX3BfZW51bSwgQUlDMzFYWF9NSUNQR0FQSSwgNiwgbWljX3NlbGVjdF90ZXh0KTsKK3N0YXRpYyBjb25zdAorU09DX0VOVU1fU0lOR0xFX0RFQ0wobWljMXJwX3BfZW51bSwgQUlDMzFYWF9NSUNQR0FQSSwgNCwgbWljX3NlbGVjdF90ZXh0KTsKK3N0YXRpYyBjb25zdAorU09DX0VOVU1fU0lOR0xFX0RFQ0wobWljMWxtX3BfZW51bSwgQUlDMzFYWF9NSUNQR0FQSSwgMiwgbWljX3NlbGVjdF90ZXh0KTsKKworc3RhdGljIGNvbnN0CitTT0NfRU5VTV9TSU5HTEVfREVDTChjbV9tX2VudW0sIEFJQzMxWFhfTUlDUEdBTUksIDYsIG1pY19zZWxlY3RfdGV4dCk7CitzdGF0aWMgY29uc3QKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKG1pYzFsbV9tX2VudW0sIEFJQzMxWFhfTUlDUEdBTUksIDQsIG1pY19zZWxlY3RfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYWNfdm9sX3RsdiwgLTYzNTAsIDUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZGNfZmdhaW5fdGx2LCAwLCAxMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYWRjX2NnYWluX3RsdiwgLTIwMDAsIDUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShtaWNfcGdhX3RsdiwgMCwgNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGhwX2Rydl90bHYsIDAsIDEwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoY2xhc3NfRF9kcnZfdGx2LCA2MDAsIDYwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoaHBfdm9sX3RsdiwgLTYzNTAsIDUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShzcF92b2xfdGx2LCAtNjM1MCwgNTAsIDApOworCisvKgorICogY29udHJvbHMgdG8gYmUgZXhwb3J0ZWQgdG8gdGhlIHVzZXIgc3BhY2UKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMxeHhfc25kX2NvbnRyb2xzW10gPSB7CisJU09DX0RPVUJMRV9SX1NfVExWKCJEQUMgUGxheWJhY2sgVm9sdW1lIiwgQUlDMzFYWF9MREFDVk9MLAorCQkJICAgQUlDMzFYWF9SREFDVk9MLCAwLCAtMTI3LCA0OCwgNywgMCwgZGFjX3ZvbF90bHYpLAorCisJU09DX1NJTkdMRV9UTFYoIkFEQyBGaW5lIENhcHR1cmUgVm9sdW1lIiwgQUlDMzFYWF9BRENGR0EsIDQsIDQsIDEsCisJCSAgICAgICBhZGNfZmdhaW5fdGx2KSwKKworCVNPQ19TSU5HTEUoIkFEQyBDYXB0dXJlIFN3aXRjaCIsIEFJQzMxWFhfQURDRkdBLCA3LCAxLCAxKSwKKwlTT0NfRE9VQkxFX1JfU19UTFYoIkFEQyBDYXB0dXJlIFZvbHVtZSIsIEFJQzMxWFhfQURDVk9MLCBBSUMzMVhYX0FEQ1ZPTCwKKwkJCSAgIDAsIC0yNCwgNDAsIDYsIDAsIGFkY19jZ2Fpbl90bHYpLAorCisJU09DX1NJTkdMRV9UTFYoIk1pYyBQR0EgQ2FwdHVyZSBWb2x1bWUiLCBBSUMzMVhYX01JQ1BHQSwgMCwKKwkJICAgICAgIDExOSwgMCwgbWljX3BnYV90bHYpLAorCisJU09DX0RPVUJMRV9SKCJIUCBEcml2ZXIgUGxheWJhY2sgU3dpdGNoIiwgQUlDMzFYWF9IUExHQUlOLAorCQkgICAgIEFJQzMxWFhfSFBSR0FJTiwgMiwgMSwgMCksCisJU09DX0RPVUJMRV9SX1RMVigiSFAgRHJpdmVyIFBsYXliYWNrIFZvbHVtZSIsIEFJQzMxWFhfSFBMR0FJTiwKKwkJCSBBSUMzMVhYX0hQUkdBSU4sIDMsIDB4MDksIDAsIGhwX2Rydl90bHYpLAorCisJU09DX0RPVUJMRV9SX1RMVigiSFAgQW5hbG9nIFBsYXliYWNrIFZvbHVtZSIsIEFJQzMxWFhfTEFOQUxPR0hQTCwKKwkJCSBBSUMzMVhYX1JBTkFMT0dIUFIsIDAsIDB4N0YsIDEsIGhwX3ZvbF90bHYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMxMXhfc25kX2NvbnRyb2xzW10gPSB7CisJU09DX0RPVUJMRV9SKCJTcGVha2VyIERyaXZlciBQbGF5YmFjayBTd2l0Y2giLCBBSUMzMVhYX1NQTEdBSU4sCisJCSAgICAgQUlDMzFYWF9TUFJHQUlOLCAyLCAxLCAwKSwKKwlTT0NfRE9VQkxFX1JfVExWKCJTcGVha2VyIERyaXZlciBQbGF5YmFjayBWb2x1bWUiLCBBSUMzMVhYX1NQTEdBSU4sCisJCQkgQUlDMzFYWF9TUFJHQUlOLCAzLCAzLCAwLCBjbGFzc19EX2Rydl90bHYpLAorCisJU09DX0RPVUJMRV9SX1RMVigiU3BlYWtlciBBbmFsb2cgUGxheWJhY2sgVm9sdW1lIiwgQUlDMzFYWF9MQU5BTE9HU1BMLAorCQkJIEFJQzMxWFhfUkFOQUxPR1NQUiwgMCwgMHg3RiwgMSwgc3Bfdm9sX3RsdiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWljMzEweF9zbmRfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFKCJTcGVha2VyIERyaXZlciBQbGF5YmFjayBTd2l0Y2giLCBBSUMzMVhYX1NQTEdBSU4sCisJCSAgIDIsIDEsIDApLAorCVNPQ19TSU5HTEVfVExWKCJTcGVha2VyIERyaXZlciBQbGF5YmFjayBWb2x1bWUiLCBBSUMzMVhYX1NQTEdBSU4sCisJCSAgICAgICAzLCAzLCAwLCBjbGFzc19EX2Rydl90bHYpLAorCisJU09DX1NJTkdMRV9UTFYoIlNwZWFrZXIgQW5hbG9nIFBsYXliYWNrIFZvbHVtZSIsIEFJQzMxWFhfTEFOQUxPR1NQTCwKKwkJICAgICAgIDAsIDB4N0YsIDEsIHNwX3ZvbF90bHYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxkYWNfaW5fY29udHJvbCA9CisJU09DX0RBUE1fRU5VTSgiREFDIExlZnQgSW5wdXQiLCBsZGFjX2luX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmRhY19pbl9jb250cm9sID0KKwlTT0NfREFQTV9FTlVNKCJEQUMgUmlnaHQgSW5wdXQiLCByZGFjX2luX2VudW0pOworCitzdGF0aWMgaW50IGFpYzMxeHhfd2FpdF9iaXRzKHN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHgsIHVuc2lnbmVkIGludCByZWcsCisJCQkgICAgIHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgd2JpdHMsIGludCBzbGVlcCwKKwkJCSAgICAgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGludCBiaXRzOworCWludCBjb3VudGVyID0gY291bnQ7CisJaW50IHJldCA9IHJlZ21hcF9yZWFkKGFpYzMxeHgtPnJlZ21hcCwgcmVnLCAmYml0cyk7CisJd2hpbGUgKChiaXRzICYgbWFzaykgIT0gd2JpdHMgJiYgY291bnRlciAmJiAhcmV0KSB7CisJCXVzbGVlcF9yYW5nZShzbGVlcCwgc2xlZXAgKiAyKTsKKwkJcmV0ID0gcmVnbWFwX3JlYWQoYWljMzF4eC0+cmVnbWFwLCByZWcsICZiaXRzKTsKKwkJY291bnRlci0tOworCX0KKwlpZiAoKGJpdHMgJiBtYXNrKSAhPSB3Yml0cykgeworCQlkZXZfZXJyKGFpYzMxeHgtPmRldiwKKwkJCSIlczogRmFpbGVkISAweCV4IHdhcyAweCV4IGV4cGVjdGVkIDB4JXggKCVkLCAweCV4LCAlZCB1cylcbiIsCisJCQlfX2Z1bmNfXywgcmVnLCBiaXRzLCB3Yml0cywgcmV0LCBtYXNrLAorCQkJKGNvdW50IC0gY291bnRlcikgKiBzbGVlcCk7CisJCXJldCA9IC0xOworCX0KKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFdJREdFVF9CSVQocmVnLCBzaGlmdCkgKCgoc2hpZnQpIDw8IDgpIHwgKHJlZykpCisKK3N0YXRpYyBpbnQgYWljMzF4eF9kYXBtX3Bvd2VyX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKHctPmNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgcmVnID0gQUlDMzFYWF9EQUNGTEFHMTsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKworCXN3aXRjaCAoV0lER0VUX0JJVCh3LT5yZWcsIHctPnNoaWZ0KSkgeworCWNhc2UgV0lER0VUX0JJVChBSUMzMVhYX0RBQ1NFVFVQLCA3KToKKwkJbWFzayA9IEFJQzMxWFhfTERBQ1BXUlNUQVRVU19NQVNLOworCQlicmVhazsKKwljYXNlIFdJREdFVF9CSVQoQUlDMzFYWF9EQUNTRVRVUCwgNik6CisJCW1hc2sgPSBBSUMzMVhYX1JEQUNQV1JTVEFUVVNfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBXSURHRVRfQklUKEFJQzMxWFhfSFBEUklWRVIsIDcpOgorCQltYXNrID0gQUlDMzFYWF9IUExEUlZQV1JTVEFUVVNfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBXSURHRVRfQklUKEFJQzMxWFhfSFBEUklWRVIsIDYpOgorCQltYXNrID0gQUlDMzFYWF9IUFJEUlZQV1JTVEFUVVNfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBXSURHRVRfQklUKEFJQzMxWFhfU1BLQU1QLCA3KToKKwkJbWFzayA9IEFJQzMxWFhfU1BMRFJWUFdSU1RBVFVTX01BU0s7CisJCWJyZWFrOworCWNhc2UgV0lER0VUX0JJVChBSUMzMVhYX1NQS0FNUCwgNik6CisJCW1hc2sgPSBBSUMzMVhYX1NQUkRSVlBXUlNUQVRVU19NQVNLOworCQlicmVhazsKKwljYXNlIFdJREdFVF9CSVQoQUlDMzFYWF9BRENTRVRVUCwgNyk6CisJCW1hc2sgPSBBSUMzMVhYX0FEQ1BXUlNUQVRVU19NQVNLOworCQlyZWcgPSBBSUMzMVhYX0FEQ0ZMQUc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIody0+Y29kZWMtPmRldiwgIlVua25vd24gd2lkZ2V0ICclcycgY2FsbGluZyAlcy9uIiwKKwkJCXctPm5hbWUsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlyZXR1cm4gYWljMzF4eF93YWl0X2JpdHMoYWljMzF4eCwgcmVnLCBtYXNrLCBtYXNrLCA1MDAwLCAxMDApOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZXR1cm4gYWljMzF4eF93YWl0X2JpdHMoYWljMzF4eCwgcmVnLCBtYXNrLCAwLCA1MDAwLCAxMDApOworCWRlZmF1bHQ6CisJCWRldl9kYmcody0+Y29kZWMtPmRldiwKKwkJCSJVbmhhbmRsZWQgZGFwbSB3aWRnZXQgZXZlbnQgJWQgZnJvbSAlc1xuIiwKKwkJCWV2ZW50LCB3LT5uYW1lKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsZWZ0X291dHB1dF9zd2l0Y2hlc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiRnJvbSBMZWZ0IERBQyIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgNiwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJGcm9tIE1JQzFMUCIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgNSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJGcm9tIE1JQzFSUCIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgNCwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmlnaHRfb3V0cHV0X3N3aXRjaGVzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJGcm9tIFJpZ2h0IERBQyIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgMiwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJGcm9tIE1JQzFSUCIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgMSwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcF90ZXJtX21pYzFscCA9CisJU09DX0RBUE1fRU5VTSgiTUlDMUxQIFAtVGVybWluYWwiLCBtaWMxbHBfcF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHBfdGVybV9taWMxcnAgPQorCVNPQ19EQVBNX0VOVU0oIk1JQzFSUCBQLVRlcm1pbmFsIiwgbWljMXJwX3BfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwX3Rlcm1fbWljMWxtID0KKwlTT0NfREFQTV9FTlVNKCJNSUMxTE0gUC1UZXJtaW5hbCIsIG1pYzFsbV9wX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbV90ZXJtX21pYzFsbSA9CisJU09DX0RBUE1fRU5VTSgiTUlDMUxNIE0tVGVybWluYWwiLCBtaWMxbG1fbV9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMxeHhfZGFwbV9ocGxfc3dpdGNoID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIEFJQzMxWFhfTEFOQUxPR0hQTCwgNywgMSwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWMzMXh4X2RhcG1faHByX3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBBSUMzMVhYX1JBTkFMT0dIUFIsIDcsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWljMzF4eF9kYXBtX3NwbF9zd2l0Y2ggPQorCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgQUlDMzFYWF9MQU5BTE9HU1BMLCA3LCAxLCAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMxeHhfZGFwbV9zcHJfc3dpdGNoID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIEFJQzMxWFhfUkFOQUxPR1NQUiwgNywgMSwgMCk7CisKK3N0YXRpYyBpbnQgbWljX2JpYXNfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdy0+Y29kZWM7CisJc3RydWN0IGFpYzMxeHhfcHJpdiAqYWljMzF4eCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJLyogY2hhbmdlIG1pYyBiaWFzIHZvbHRhZ2UgdG8gdXNlciBkZWZpbmVkICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfTUlDQklBUywKKwkJCQkgICAgQUlDMzFYWF9NSUNCSUFTX01BU0ssCisJCQkJICAgIGFpYzMxeHgtPnBkYXRhLm1pY2JpYXNfdmcgPDwKKwkJCQkgICAgQUlDMzFYWF9NSUNCSUFTX1NISUZUKTsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHR1cm5lZCBvblxuIiwgX19mdW5jX18pOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQkvKiB0dXJuIG1pYyBiaWFzIG9mZiAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX01JQ0JJQVMsCisJCQkJICAgIEFJQzMxWFhfTUlDQklBU19NQVNLLCAwKTsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHR1cm5lZCBvZmZcbiIsIF9fZnVuY19fKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYWljMzF4eF9kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJEQUMgSU4iLCAiREFDIFBsYXliYWNrIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKworCVNORF9TT0NfREFQTV9NVVgoIkRBQyBMZWZ0IElucHV0IiwKKwkJCSBTTkRfU09DX05PUE0sIDAsIDAsICZsZGFjX2luX2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9NVVgoIkRBQyBSaWdodCBJbnB1dCIsCisJCQkgU05EX1NPQ19OT1BNLCAwLCAwLCAmcmRhY19pbl9jb250cm9sKSwKKwkvKiBEQUNzICovCisJU05EX1NPQ19EQVBNX0RBQ19FKCJEQUMgTGVmdCIsICJMZWZ0IFBsYXliYWNrIiwKKwkJCSAgIEFJQzMxWFhfREFDU0VUVVAsIDcsIDAsIGFpYzMxeHhfZGFwbV9wb3dlcl9ldmVudCwKKwkJCSAgIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fREFDX0UoIkRBQyBSaWdodCIsICJSaWdodCBQbGF5YmFjayIsCisJCQkgICBBSUMzMVhYX0RBQ1NFVFVQLCA2LCAwLCBhaWMzMXh4X2RhcG1fcG93ZXJfZXZlbnQsCisJCQkgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJLyogT3V0cHV0IE1peGVycyAqLworCVNORF9TT0NfREFQTV9NSVhFUigiT3V0cHV0IExlZnQiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICBsZWZ0X291dHB1dF9zd2l0Y2hlcywKKwkJCSAgIEFSUkFZX1NJWkUobGVmdF9vdXRwdXRfc3dpdGNoZXMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIk91dHB1dCBSaWdodCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgIHJpZ2h0X291dHB1dF9zd2l0Y2hlcywKKwkJCSAgIEFSUkFZX1NJWkUocmlnaHRfb3V0cHV0X3N3aXRjaGVzKSksCisKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJIUCBMZWZ0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgICZhaWMzMXh4X2RhcG1faHBsX3N3aXRjaCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiSFAgUmlnaHQiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICAgJmFpYzMxeHhfZGFwbV9ocHJfc3dpdGNoKSwKKworCS8qIE91dHB1dCBkcml2ZXJzICovCisJU05EX1NPQ19EQVBNX09VVF9EUlZfRSgiSFBMIERyaXZlciIsIEFJQzMxWFhfSFBEUklWRVIsIDcsIDAsCisJCQkgICAgICAgTlVMTCwgMCwgYWljMzF4eF9kYXBtX3Bvd2VyX2V2ZW50LAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSksCisJU05EX1NPQ19EQVBNX09VVF9EUlZfRSgiSFBSIERyaXZlciIsIEFJQzMxWFhfSFBEUklWRVIsIDYsIDAsCisJCQkgICAgICAgTlVMTCwgMCwgYWljMzF4eF9kYXBtX3Bvd2VyX2V2ZW50LAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSksCisKKwkvKiBBREMgKi8KKwlTTkRfU09DX0RBUE1fQURDX0UoIkFEQyIsICJDYXB0dXJlIiwgQUlDMzFYWF9BRENTRVRVUCwgNywgMCwKKwkJCSAgIGFpYzMxeHhfZGFwbV9wb3dlcl9ldmVudCwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwkvKiBJbnB1dCBTZWxlY3Rpb24gdG8gTUlDX1BHQSAqLworCVNORF9TT0NfREFQTV9NVVgoIk1JQzFMUCBQLVRlcm1pbmFsIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICZwX3Rlcm1fbWljMWxwKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJNSUMxUlAgUC1UZXJtaW5hbCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAmcF90ZXJtX21pYzFycCksCisJU05EX1NPQ19EQVBNX01VWCgiTUlDMUxNIFAtVGVybWluYWwiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgJnBfdGVybV9taWMxbG0pLAorCisJU05EX1NPQ19EQVBNX01VWCgiTUlDMUxNIE0tVGVybWluYWwiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgJm1fdGVybV9taWMxbG0pLAorCS8qIEVuYWJsaW5nICYgRGlzYWJsaW5nIE1JQyBHYWluIEN0bCAqLworCVNORF9TT0NfREFQTV9QR0EoIk1JQ19HQUlOX0NUTCIsIEFJQzMxWFhfTUlDUEdBLAorCQkJIDcsIDEsIE5VTEwsIDApLAorCisJLyogTWljIEJpYXMgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJNSUNCSUFTIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBtaWNfYmlhc19ldmVudCwKKwkJCSAgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCisKKwkvKiBPdXRwdXRzICovCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFBMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFBSIiksCisKKwkvKiBJbnB1dHMgKi8KKwlTTkRfU09DX0RBUE1fSU5QVVQoIk1JQzFMUCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDMVJQIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNSUMxTE0iKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhaWMzMTF4X2RhcG1fd2lkZ2V0c1tdID0geworCS8qIEFJQzMxMTEgYW5kIEFJQzMxMTAgaGF2ZSBzdGVyZW8gY2xhc3MtRCBhbXBsaWZpZXIgKi8KKwlTTkRfU09DX0RBUE1fT1VUX0RSVl9FKCJTUEwgQ2xhc3NEIiwgQUlDMzFYWF9TUEtBTVAsIDcsIDAsIE5VTEwsIDAsCisJCQkgICAgICAgYWljMzF4eF9kYXBtX3Bvd2VyX2V2ZW50LCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX09VVF9EUlZfRSgiU1BSIENsYXNzRCIsIEFJQzMxWFhfU1BLQU1QLCA2LCAwLCBOVUxMLCAwLAorCQkJICAgICAgIGFpYzMxeHhfZGFwbV9wb3dlcl9ldmVudCwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIlNwZWFrZXIgTGVmdCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgICAmYWljMzF4eF9kYXBtX3NwbF9zd2l0Y2gpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIlNwZWFrZXIgUmlnaHQiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICAgJmFpYzMxeHhfZGFwbV9zcHJfc3dpdGNoKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEwiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUFIiKSwKK307CisKKy8qIEFJQzMxMDAgYW5kIEFJQzMxMjAgaGF2ZSBvbmx5IG1vbm8gY2xhc3MtRCBhbXBsaWZpZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhaWMzMTB4X2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9PVVRfRFJWX0UoIlNQSyBDbGFzc0QiLCBBSUMzMVhYX1NQS0FNUCwgNywgMCwgTlVMTCwgMCwKKwkJCSAgICAgICBhaWMzMXh4X2RhcG1fcG93ZXJfZXZlbnQsIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCQkgICAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJTcGVha2VyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgICZhaWMzMXh4X2RhcG1fc3BsX3N3aXRjaCksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiU1BLIiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZQorYWljMzF4eF9hdWRpb19tYXBbXSA9IHsKKwkvKiBEQUMgSW5wdXQgUm91dGluZyAqLworCXsiREFDIExlZnQgSW5wdXQiLCAiTGVmdCBEYXRhIiwgIkRBQyBJTiJ9LAorCXsiREFDIExlZnQgSW5wdXQiLCAiUmlnaHQgRGF0YSIsICJEQUMgSU4ifSwKKwl7IkRBQyBMZWZ0IElucHV0IiwgIk1vbm8iLCAiREFDIElOIn0sCisJeyJEQUMgUmlnaHQgSW5wdXQiLCAiTGVmdCBEYXRhIiwgIkRBQyBJTiJ9LAorCXsiREFDIFJpZ2h0IElucHV0IiwgIlJpZ2h0IERhdGEiLCAiREFDIElOIn0sCisJeyJEQUMgUmlnaHQgSW5wdXQiLCAiTW9ubyIsICJEQUMgSU4ifSwKKwl7IkRBQyBMZWZ0IiwgTlVMTCwgIkRBQyBMZWZ0IElucHV0In0sCisJeyJEQUMgUmlnaHQiLCBOVUxMLCAiREFDIFJpZ2h0IElucHV0In0sCisKKwkvKiBNaWMgaW5wdXQgKi8KKwl7Ik1JQzFMUCBQLVRlcm1pbmFsIiwgIkZGUiAxMCBPaG0iLCAiTUlDMUxQIn0sCisJeyJNSUMxTFAgUC1UZXJtaW5hbCIsICJGRlIgMjAgT2htIiwgIk1JQzFMUCJ9LAorCXsiTUlDMUxQIFAtVGVybWluYWwiLCAiRkZSIDQwIE9obSIsICJNSUMxTFAifSwKKwl7Ik1JQzFSUCBQLVRlcm1pbmFsIiwgIkZGUiAxMCBPaG0iLCAiTUlDMVJQIn0sCisJeyJNSUMxUlAgUC1UZXJtaW5hbCIsICJGRlIgMjAgT2htIiwgIk1JQzFSUCJ9LAorCXsiTUlDMVJQIFAtVGVybWluYWwiLCAiRkZSIDQwIE9obSIsICJNSUMxUlAifSwKKwl7Ik1JQzFMTSBQLVRlcm1pbmFsIiwgIkZGUiAxMCBPaG0iLCAiTUlDMUxNIn0sCisJeyJNSUMxTE0gUC1UZXJtaW5hbCIsICJGRlIgMjAgT2htIiwgIk1JQzFMTSJ9LAorCXsiTUlDMUxNIFAtVGVybWluYWwiLCAiRkZSIDQwIE9obSIsICJNSUMxTE0ifSwKKworCXsiTUlDMUxNIE0tVGVybWluYWwiLCAiRkZSIDEwIE9obSIsICJNSUMxTE0ifSwKKwl7Ik1JQzFMTSBNLVRlcm1pbmFsIiwgIkZGUiAyMCBPaG0iLCAiTUlDMUxNIn0sCisJeyJNSUMxTE0gTS1UZXJtaW5hbCIsICJGRlIgNDAgT2htIiwgIk1JQzFMTSJ9LAorCisJeyJNSUNfR0FJTl9DVEwiLCBOVUxMLCAiTUlDMUxQIFAtVGVybWluYWwifSwKKwl7Ik1JQ19HQUlOX0NUTCIsIE5VTEwsICJNSUMxUlAgUC1UZXJtaW5hbCJ9LAorCXsiTUlDX0dBSU5fQ1RMIiwgTlVMTCwgIk1JQzFMTSBQLVRlcm1pbmFsIn0sCisJeyJNSUNfR0FJTl9DVEwiLCBOVUxMLCAiTUlDMUxNIE0tVGVybWluYWwifSwKKworCXsiQURDIiwgTlVMTCwgIk1JQ19HQUlOX0NUTCJ9LAorCisJLyogTGVmdCBPdXRwdXQgKi8KKwl7Ik91dHB1dCBMZWZ0IiwgIkZyb20gTGVmdCBEQUMiLCAiREFDIExlZnQifSwKKwl7Ik91dHB1dCBMZWZ0IiwgIkZyb20gTUlDMUxQIiwgIk1JQzFMUCJ9LAorCXsiT3V0cHV0IExlZnQiLCAiRnJvbSBNSUMxUlAiLCAiTUlDMVJQIn0sCisKKwkvKiBSaWdodCBPdXRwdXQgKi8KKwl7Ik91dHB1dCBSaWdodCIsICJGcm9tIFJpZ2h0IERBQyIsICJEQUMgUmlnaHQifSwKKwl7Ik91dHB1dCBSaWdodCIsICJGcm9tIE1JQzFSUCIsICJNSUMxUlAifSwKKworCS8qIEhQTCBwYXRoICovCisJeyJIUCBMZWZ0IiwgIlN3aXRjaCIsICJPdXRwdXQgTGVmdCJ9LAorCXsiSFBMIERyaXZlciIsIE5VTEwsICJIUCBMZWZ0In0sCisJeyJIUEwiLCBOVUxMLCAiSFBMIERyaXZlciJ9LAorCisJLyogSFBSIHBhdGggKi8KKwl7IkhQIFJpZ2h0IiwgIlN3aXRjaCIsICJPdXRwdXQgUmlnaHQifSwKKwl7IkhQUiBEcml2ZXIiLCBOVUxMLCAiSFAgUmlnaHQifSwKKwl7IkhQUiIsIE5VTEwsICJIUFIgRHJpdmVyIn0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZQorYWljMzExeF9hdWRpb19tYXBbXSA9IHsKKwkvKiBTUCBMIHBhdGggKi8KKwl7IlNwZWFrZXIgTGVmdCIsICJTd2l0Y2giLCAiT3V0cHV0IExlZnQifSwKKwl7IlNQTCBDbGFzc0QiLCBOVUxMLCAiU3BlYWtlciBMZWZ0In0sCisJeyJTUEwiLCBOVUxMLCAiU1BMIENsYXNzRCJ9LAorCisJLyogU1AgUiBwYXRoICovCisJeyJTcGVha2VyIFJpZ2h0IiwgIlN3aXRjaCIsICJPdXRwdXQgUmlnaHQifSwKKwl7IlNQUiBDbGFzc0QiLCBOVUxMLCAiU3BlYWtlciBSaWdodCJ9LAorCXsiU1BSIiwgTlVMTCwgIlNQUiBDbGFzc0QifSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlCithaWMzMTB4X2F1ZGlvX21hcFtdID0geworCS8qIFNQIEwgcGF0aCAqLworCXsiU3BlYWtlciIsICJTd2l0Y2giLCAiT3V0cHV0IExlZnQifSwKKwl7IlNQSyBDbGFzc0QiLCBOVUxMLCAiU3BlYWtlciJ9LAorCXsiU1BLIiwgTlVMTCwgIlNQSyBDbGFzc0QifSwKK307CisKK3N0YXRpYyBpbnQgYWljMzF4eF9hZGRfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWlmIChhaWMzMXh4LT5wZGF0YS5jb2RlY190eXBlICYgQUlDMzFYWF9TVEVSRU9fQ0xBU1NfRF9CSVQpCisJCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKAorCQkJY29kZWMsIGFpYzMxMXhfc25kX2NvbnRyb2xzLAorCQkJQVJSQVlfU0laRShhaWMzMTF4X3NuZF9jb250cm9scykpOworCWVsc2UKKwkJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoCisJCQljb2RlYywgYWljMzEweF9zbmRfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKGFpYzMxMHhfc25kX2NvbnRyb2xzKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKwlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldCA9IDA7CisKKwlpZiAoYWljMzF4eC0+cGRhdGEuY29kZWNfdHlwZSAmIEFJQzMxWFhfU1RFUkVPX0NMQVNTX0RfQklUKSB7CisJCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoCisJCQlkYXBtLCBhaWMzMTF4X2RhcG1fd2lkZ2V0cywKKwkJCUFSUkFZX1NJWkUoYWljMzExeF9kYXBtX3dpZGdldHMpKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYWljMzExeF9hdWRpb19tYXAsCisJCQkJCSAgICAgIEFSUkFZX1NJWkUoYWljMzExeF9hdWRpb19tYXApKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scygKKwkJCWRhcG0sIGFpYzMxMHhfZGFwbV93aWRnZXRzLAorCQkJQVJSQVlfU0laRShhaWMzMTB4X2RhcG1fd2lkZ2V0cykpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhaWMzMTB4X2F1ZGlvX21hcCwKKwkJCQkJICAgICAgQVJSQVlfU0laRShhaWMzMTB4X2F1ZGlvX21hcCkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaWMzMXh4X3NldHVwX3BsbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgYmNsa19uID0gMDsKKwlpbnQgaTsKKworCS8qIFVzZSBQTEwgYXMgQ09ERUNfQ0xLSU4gYW5kIERBQ19DTEsgYXMgQkRJVl9DTEtJTiAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfQ0xLTVVYLAorCQkJICAgIEFJQzMxWFhfQ09ERUNfQ0xLSU5fTUFTSywgQUlDMzFYWF9DT0RFQ19DTEtJTl9QTEwpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfSUZBQ0UyLAorCQkJICAgIEFJQzMxWFhfQkRJVkNMS19NQVNLLCBBSUMzMVhYX0RBQzJCQ0xLKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFpYzMxeHhfZGl2cyk7IGkrKykgeworCQlpZiAoYWljMzF4eF9kaXZzW2ldLnJhdGUgPT0gcGFyYW1zX3JhdGUocGFyYW1zKSAmJgorCQkgICAgYWljMzF4eF9kaXZzW2ldLm1jbGsgPT0gYWljMzF4eC0+c3lzY2xrKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gQVJSQVlfU0laRShhaWMzMXh4X2RpdnMpKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBTYW1wbGluZyByYXRlICV1IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQlfX2Z1bmNfXywgcGFyYW1zX3JhdGUocGFyYW1zKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFBMTCBjb25maWd1cmF0aW9uICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9QTExQUiwgQUlDMzFYWF9QTExfTUFTSywKKwkJCSAgICAoYWljMzF4eF9kaXZzW2ldLnBfdmFsIDw8IDQpIHwgMHgwMSk7CisJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzFYWF9QTExKLCBhaWMzMXh4X2RpdnNbaV0ucGxsX2opOworCisJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzFYWF9QTExETVNCLAorCQkgICAgICBhaWMzMXh4X2RpdnNbaV0ucGxsX2QgPj4gOCk7CisJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzFYWF9QTExETFNCLAorCQkgICAgICBhaWMzMXh4X2RpdnNbaV0ucGxsX2QgJiAweGZmKTsKKworCS8qIERBQyBkaXZpZGVycyBjb25maWd1cmF0aW9uICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9OREFDLCBBSUMzMVhYX1BMTF9NQVNLLAorCQkJICAgIGFpYzMxeHhfZGl2c1tpXS5uZGFjKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX01EQUMsIEFJQzMxWFhfUExMX01BU0ssCisJCQkgICAgYWljMzF4eF9kaXZzW2ldLm1kYWMpOworCisJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzFYWF9ET1NSTVNCLCBhaWMzMXh4X2RpdnNbaV0uZG9zciA+PiA4KTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSUMzMVhYX0RPU1JMU0IsIGFpYzMxeHhfZGl2c1tpXS5kb3NyICYgMHhmZik7CisKKwkvKiBBREMgZGl2aWRlcnMgY29uZmlndXJhdGlvbi4gV3JpdGUgcmVzZXQgdmFsdWUgMSBpZiBub3QgdXNlZC4gKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX05BREMsIEFJQzMxWFhfUExMX01BU0ssCisJCQkgICAgYWljMzF4eF9kaXZzW2ldLm5hZGMgPyBhaWMzMXh4X2RpdnNbaV0ubmFkYyA6IDEpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfTUFEQywgQUlDMzFYWF9QTExfTUFTSywKKwkJCSAgICBhaWMzMXh4X2RpdnNbaV0ubWFkYyA/IGFpYzMxeHhfZGl2c1tpXS5tYWRjIDogMSk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSUMzMVhYX0FPU1IsIGFpYzMxeHhfZGl2c1tpXS5hb3NyKTsKKworCS8qIEJpdCBjbG9jayBkaXZpZGVyIGNvbmZpZ3VyYXRpb24uICovCisJYmNsa19uID0gKGFpYzMxeHhfZGl2c1tpXS5kb3NyICogYWljMzF4eF9kaXZzW2ldLm1kYWMpCisJCS8gc25kX3NvY19wYXJhbXNfdG9fZnJhbWVfc2l6ZShwYXJhbXMpOworCWlmIChiY2xrX24gPT0gMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogTm90IGVub3VnaCBCTENLIGJhbmR3aWR0aFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9CQ0xLTiwKKwkJCSAgICBBSUMzMVhYX1BMTF9NQVNLLCBiY2xrX24pOworCisJYWljMzF4eC0+cmF0ZV9kaXZfbGluZSA9IGk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCSJwbGwgJWQuJTA0ZC8lZCBkb3NyICVkIG4gJWQgbSAlZCBhb3NyICVkIG4gJWQgbSAlZCBiY2xrX24gJWRcbiIsCisJCWFpYzMxeHhfZGl2c1tpXS5wbGxfaiwgYWljMzF4eF9kaXZzW2ldLnBsbF9kLAorCQlhaWMzMXh4X2RpdnNbaV0ucF92YWwsIGFpYzMxeHhfZGl2c1tpXS5kb3NyLAorCQlhaWMzMXh4X2RpdnNbaV0ubmRhYywgYWljMzF4eF9kaXZzW2ldLm1kYWMsCisJCWFpYzMxeHhfZGl2c1tpXS5hb3NyLCBhaWMzMXh4X2RpdnNbaV0ubmFkYywKKwkJYWljMzF4eF9kaXZzW2ldLm1hZGMsIGJjbGtfbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaWMzMXh4X2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJdTggZGF0YSA9IDA7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIjIyAlczogZm9ybWF0ICVkIHdpZHRoICVkIHJhdGUgJWRcbiIsCisJCV9fZnVuY19fLCBwYXJhbXNfZm9ybWF0KHBhcmFtcyksIHBhcmFtc193aWR0aChwYXJhbXMpLAorCQlwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKworCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKKwljYXNlIDE2OgorCQlicmVhazsKKwljYXNlIDIwOgorCQlkYXRhID0gKEFJQzMxWFhfV09SRF9MRU5fMjBCSVRTIDw8CisJCQlBSUMzMVhYX0lGQUNFMV9EQVRBTEVOX1NISUZUKTsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJZGF0YSA9IChBSUMzMVhYX1dPUkRfTEVOXzI0QklUUyA8PAorCQkJQUlDMzFYWF9JRkFDRTFfREFUQUxFTl9TSElGVCk7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCWRhdGEgPSAoQUlDMzFYWF9XT1JEX0xFTl8zMkJJVFMgPDwKKwkJCUFJQzMxWFhfSUZBQ0UxX0RBVEFMRU5fU0hJRlQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogVW5zdXBwb3J0ZWQgZm9ybWF0ICVkXG4iLAorCQkJX19mdW5jX18sIHBhcmFtc19mb3JtYXQocGFyYW1zKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfSUZBQ0UxLAorCQkJICAgIEFJQzMxWFhfSUZBQ0UxX0RBVEFMRU5fTUFTSywKKwkJCSAgICBkYXRhKTsKKworCXJldHVybiBhaWMzMXh4X3NldHVwX3BsbChjb2RlYywgcGFyYW1zKTsKK30KKworc3RhdGljIGludCBhaWMzMXh4X2RhY19tdXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLCBpbnQgbXV0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCisJaWYgKG11dGUpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9EQUNNVVRFLAorCQkJCSAgICBBSUMzMVhYX0RBQ01VVEVfTUFTSywKKwkJCQkgICAgQUlDMzFYWF9EQUNNVVRFX01BU0spOworCX0gZWxzZSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfREFDTVVURSwKKwkJCQkgICAgQUlDMzFYWF9EQUNNVVRFX01BU0ssIDB4MCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWljMzF4eF9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJdTggaWZhY2VfcmVnMSA9IDA7CisJdTggaWZhY2VfcmVnMyA9IDA7CisJdTggZHNwX2FfdmFsID0gMDsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiMjICVzOiBmbXQgPSAweCV4XG4iLCBfX2Z1bmNfXywgZm10KTsKKworCS8qIHNldCBtYXN0ZXIvc2xhdmUgYXVkaW8gaW50ZXJmYWNlICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTToKKwkJaWZhY2VfcmVnMSB8PSBBSUMzMVhYX0JDTEtfTUFTVEVSIHwgQUlDMzFYWF9XQ0xLX01BU1RFUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2FsZXJ0KGNvZGVjLT5kZXYsICJJbnZhbGlkIERBSSBtYXN0ZXIvc2xhdmUgaW50ZXJmYWNlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogaW50ZXJmYWNlIGZvcm1hdCAqLworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKKwkJZHNwX2FfdmFsID0gMHgxOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCS8qIE5PVEU6IEJDTEtJTlYgYml0IHZhbHVlIDEgZXF1YXMgTkIgYW5kIDAgZXF1YWxzIElCICovCisJCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJCWlmYWNlX3JlZzMgfD0gQUlDMzFYWF9CQ0xLSU5WX01BU0s7CisJCQlicmVhazsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9ORjoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWZhY2VfcmVnMSB8PSAoQUlDMzFYWF9EU1BfTU9ERSA8PAorCQkJICAgICAgIEFJQzMxWFhfSUZBQ0UxX0RBVEFUWVBFX1NISUZUKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQlpZmFjZV9yZWcxIHw9IChBSUMzMVhYX1JJR0hUX0pVU1RJRklFRF9NT0RFIDw8CisJCQkgICAgICAgQUlDMzFYWF9JRkFDRTFfREFUQVRZUEVfU0hJRlQpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJaWZhY2VfcmVnMSB8PSAoQUlDMzFYWF9MRUZUX0pVU1RJRklFRF9NT0RFIDw8CisJCQkgICAgICAgQUlDMzFYWF9JRkFDRTFfREFUQVRZUEVfU0hJRlQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJbnZhbGlkIERBSSBpbnRlcmZhY2UgZm9ybWF0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9JRkFDRTEsCisJCQkgICAgQUlDMzFYWF9JRkFDRTFfREFUQVRZUEVfTUFTSyB8CisJCQkgICAgQUlDMzFYWF9JRkFDRTFfTUFTVEVSX01BU0ssCisJCQkgICAgaWZhY2VfcmVnMSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9EQVRBX09GRlNFVCwKKwkJCSAgICBBSUMzMVhYX0RBVEFfT0ZGU0VUX01BU0ssCisJCQkgICAgZHNwX2FfdmFsKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX0lGQUNFMiwKKwkJCSAgICBBSUMzMVhYX0JDTEtJTlZfTUFTSywKKwkJCSAgICBpZmFjZV9yZWczKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfc2V0X2RhaV9zeXNjbGsoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksCisJCQkJICBpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgaTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiMjICVzOiBjbGtfaWQgPSAlZCwgZnJlcSA9ICVkLCBkaXIgPSAlZFxuIiwKKwkJX19mdW5jX18sIGNsa19pZCwgZnJlcSwgZGlyKTsKKworCWZvciAoaSA9IDA7IGFpYzMxeHhfZGl2c1tpXS5tY2xrICE9IGZyZXE7IGkrKykgeworCQlpZiAoaSA9PSBBUlJBWV9TSVpFKGFpYzMxeHhfZGl2cykpIHsKKwkJCWRldl9lcnIoYWljMzF4eC0+ZGV2LCAiJXM6IFVuc3VwcG9ydGVkIGZyZXF1ZW5jeSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgZnJlcSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qIHNldCBjbG9jayBvbiBNQ0xLLCBCQ0xLLCBvciBHUElPMSBhcyBQTEwgaW5wdXQgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX0NMS01VWCwgQUlDMzFYWF9QTExfQ0xLSU5fTUFTSywKKwkJCSAgICBjbGtfaWQgPDwgQUlDMzFYWF9QTExfQ0xLSU5fU0hJRlQpOworCisJYWljMzF4eC0+c3lzY2xrID0gZnJlcTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaWMzMXh4X3JlZ3VsYXRvcl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGFpYzMxeHhfZGlzYWJsZV9uYiAqZGlzYWJsZV9uYiA9CisJCWNvbnRhaW5lcl9vZihuYiwgc3RydWN0IGFpYzMxeHhfZGlzYWJsZV9uYiwgbmIpOworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBkaXNhYmxlX25iLT5haWMzMXh4OworCisJaWYgKGV2ZW50ICYgUkVHVUxBVE9SX0VWRU5UX0RJU0FCTEUpIHsKKwkJLyoKKwkJICogUHV0IGNvZGVjIHRvIHJlc2V0IGFuZCBhcyBhdCBsZWFzdCBvbmUgb2YgdGhlCisJCSAqIHN1cHBsaWVzIHdhcyBkaXNhYmxlZC4KKwkJICovCisJCWlmIChncGlvX2lzX3ZhbGlkKGFpYzMxeHgtPnBkYXRhLmdwaW9fcmVzZXQpKQorCQkJZ3Bpb19zZXRfdmFsdWUoYWljMzF4eC0+cGRhdGEuZ3Bpb19yZXNldCwgMCk7CisKKwkJcmVnY2FjaGVfbWFya19kaXJ0eShhaWMzMXh4LT5yZWdtYXApOworCQlkZXZfZGJnKGFpYzMxeHgtPmRldiwgIiMjICVzOiBESVNBQkxFIHJlY2VpdmVkXG4iLCBfX2Z1bmNfXyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFpYzMxeHhfY2xrX29uKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdTggbWFzayA9IEFJQzMxWFhfUE1fTUFTSzsKKwl1OCBvbiA9IEFJQzMxWFhfUE1fTUFTSzsKKworCWRldl9kYmcoY29kZWMtPmRldiwgImNvZGVjIGNsb2NrIC0+IG9uIChyYXRlICVkKVxuIiwKKwkJYWljMzF4eF9kaXZzW2FpYzMxeHgtPnJhdGVfZGl2X2xpbmVdLnJhdGUpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfUExMUFIsIG1hc2ssIG9uKTsKKwltZGVsYXkoMTApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfTkRBQywgbWFzaywgb24pOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfTURBQywgbWFzaywgb24pOworCWlmIChhaWMzMXh4X2RpdnNbYWljMzF4eC0+cmF0ZV9kaXZfbGluZV0ubmFkYykKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9OQURDLCBtYXNrLCBvbik7CisJaWYgKGFpYzMxeHhfZGl2c1thaWMzMXh4LT5yYXRlX2Rpdl9saW5lXS5tYWRjKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX01BREMsIG1hc2ssIG9uKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX0JDTEtOLCBtYXNrLCBvbik7Cit9CisKK3N0YXRpYyB2b2lkIGFpYzMxeHhfY2xrX29mZihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJdTggbWFzayA9IEFJQzMxWFhfUE1fTUFTSzsKKwl1OCBvZmYgPSAwOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiY29kZWMgY2xvY2sgLT4gb2ZmXG4iKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX0JDTEtOLCBtYXNrLCBvZmYpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfTUFEQywgbWFzaywgb2ZmKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX05BREMsIG1hc2ssIG9mZik7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9NREFDLCBtYXNrLCBvZmYpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfTkRBQywgbWFzaywgb2ZmKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX1BMTFBSLCBtYXNrLCBvZmYpOworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfcG93ZXJfb24oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKGFpYzMxeHgtPnN1cHBsaWVzKSwKKwkJCQkgICAgYWljMzF4eC0+c3VwcGxpZXMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoZ3Bpb19pc192YWxpZChhaWMzMXh4LT5wZGF0YS5ncGlvX3Jlc2V0KSkgeworCQlncGlvX3NldF92YWx1ZShhaWMzMXh4LT5wZGF0YS5ncGlvX3Jlc2V0LCAxKTsKKwkJdWRlbGF5KDEwMCk7CisJfQorCXJlZ2NhY2hlX2NhY2hlX29ubHkoYWljMzF4eC0+cmVnbWFwLCBmYWxzZSk7CisJcmV0ID0gcmVnY2FjaGVfc3luYyhhaWMzMXh4LT5yZWdtYXApOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiRmFpbGVkIHRvIHJlc3RvcmUgY2FjaGU6ICVkXG4iLCByZXQpOworCQlyZWdjYWNoZV9jYWNoZV9vbmx5KGFpYzMxeHgtPnJlZ21hcCwgdHJ1ZSk7CisJCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShhaWMzMXh4LT5zdXBwbGllcyksCisJCQkJICAgICAgIGFpYzMxeHgtPnN1cHBsaWVzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWljMzF4eF9wb3dlcl9vZmYoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0ID0gMDsKKworCXJlZ2NhY2hlX2NhY2hlX29ubHkoYWljMzF4eC0+cmVnbWFwLCB0cnVlKTsKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUoYWljMzF4eC0+c3VwcGxpZXMpLAorCQkJCSAgICAgYWljMzF4eC0+c3VwcGxpZXMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhaWMzMXh4X3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQoreworCWRldl9kYmcoY29kZWMtPmRldiwgIiMjICVzOiAlZCAtPiAlZFxuIiwgX19mdW5jX18sCisJCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwsIGxldmVsKTsKKworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIFNORF9TT0NfQklBU19PTjoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX1NUQU5EQlkpCisJCQlhaWMzMXh4X2Nsa19vbihjb2RlYyk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCXN3aXRjaCAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCkgeworCQljYXNlIFNORF9TT0NfQklBU19PRkY6CisJCQlhaWMzMXh4X3Bvd2VyX29uKGNvZGVjKTsKKwkJCWJyZWFrOworCQljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQkJYWljMzF4eF9jbGtfb2ZmKGNvZGVjKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfU1RBTkRCWSkKKwkJCWFpYzMxeHhfcG93ZXJfb2ZmKGNvZGVjKTsKKwkJYnJlYWs7CisJfQorCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJYWljMzF4eF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWljMzF4eF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWFpYzMxeHhfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaWMzMXh4X2NvZGVjX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IGk7CisKKwlkZXZfZGJnKGFpYzMxeHgtPmRldiwgIiMjICVzXG4iLCBfX2Z1bmNfXyk7CisKKwlhaWMzMXh4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlhaWMzMXh4LT5jb2RlYyA9IGNvZGVjOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWljMzF4eC0+c3VwcGxpZXMpOyBpKyspIHsKKwkJYWljMzF4eC0+ZGlzYWJsZV9uYltpXS5uYi5ub3RpZmllcl9jYWxsID0KKwkJCWFpYzMxeHhfcmVndWxhdG9yX2V2ZW50OworCQlhaWMzMXh4LT5kaXNhYmxlX25iW2ldLmFpYzMxeHggPSBhaWMzMXh4OworCQlyZXQgPSByZWd1bGF0b3JfcmVnaXN0ZXJfbm90aWZpZXIoYWljMzF4eC0+c3VwcGxpZXNbaV0uY29uc3VtZXIsCisJCQkJCQkgICZhaWMzMXh4LT5kaXNhYmxlX25iW2ldLm5iKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gcmVxdWVzdCByZWd1bGF0b3Igbm90aWZpZXI6ICVkXG4iLAorCQkJCXJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmVnY2FjaGVfY2FjaGVfb25seShhaWMzMXh4LT5yZWdtYXAsIHRydWUpOworCXJlZ2NhY2hlX21hcmtfZGlydHkoYWljMzF4eC0+cmVnbWFwKTsKKworCXJldCA9IGFpYzMxeHhfYWRkX2NvbnRyb2xzKGNvZGVjKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYWljMzF4eF9hZGRfd2lkZ2V0cyhjb2RlYyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfY29kZWNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IGk7CisJLyogcG93ZXIgZG93biBjaGlwICovCisJYWljMzF4eF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhaWMzMXh4LT5zdXBwbGllcyk7IGkrKykKKwkJcmVndWxhdG9yX3VucmVnaXN0ZXJfbm90aWZpZXIoYWljMzF4eC0+c3VwcGxpZXNbaV0uY29uc3VtZXIsCisJCQkJCSAgICAgICZhaWMzMXh4LT5kaXNhYmxlX25iW2ldLm5iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kcml2ZXJfYWljMzF4eCA9IHsKKwkucHJvYmUJCQk9IGFpYzMxeHhfY29kZWNfcHJvYmUsCisJLnJlbW92ZQkJCT0gYWljMzF4eF9jb2RlY19yZW1vdmUsCisJLnN1c3BlbmQJCT0gYWljMzF4eF9zdXNwZW5kLAorCS5yZXN1bWUJCQk9IGFpYzMxeHhfcmVzdW1lLAorCS5zZXRfYmlhc19sZXZlbAkJPSBhaWMzMXh4X3NldF9iaWFzX2xldmVsLAorCS5jb250cm9scwkJPSBhaWMzMXh4X3NuZF9jb250cm9scywKKwkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWljMzF4eF9zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMJCT0gYWljMzF4eF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFpYzMxeHhfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMJCT0gYWljMzF4eF9hdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWljMzF4eF9hdWRpb19tYXApLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgYWljMzF4eF9kYWlfb3BzID0geworCS5od19wYXJhbXMJPSBhaWMzMXh4X2h3X3BhcmFtcywKKwkuc2V0X3N5c2Nsawk9IGFpYzMxeHhfc2V0X2RhaV9zeXNjbGssCisJLnNldF9mbXQJPSBhaWMzMXh4X3NldF9kYWlfZm10LAorCS5kaWdpdGFsX211dGUJPSBhaWMzMXh4X2RhY19tdXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgYWljMzF4eF9kYWlfZHJpdmVyW10gPSB7CisJeworCQkubmFtZSA9ICJ0bHYzMjBhaWMzMXh4LWhpZmkiLAorCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUJID0gIlBsYXliYWNrIiwKKwkJCS5jaGFubmVsc19taW4JID0gMSwKKwkJCS5jaGFubmVsc19tYXgJID0gMiwKKwkJCS5yYXRlcwkJID0gQUlDMzFYWF9SQVRFUywKKwkJCS5mb3JtYXRzCSA9IEFJQzMxWFhfRk9STUFUUywKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUJID0gIkNhcHR1cmUiLAorCQkJLmNoYW5uZWxzX21pbgkgPSAxLAorCQkJLmNoYW5uZWxzX21heAkgPSAyLAorCQkJLnJhdGVzCQkgPSBBSUMzMVhYX1JBVEVTLAorCQkJLmZvcm1hdHMJID0gQUlDMzFYWF9GT1JNQVRTLAorCQl9LAorCQkub3BzID0gJmFpYzMxeHhfZGFpX29wcywKKwkJLnN5bW1ldHJpY19yYXRlcyA9IDEsCisJfQorfTsKKworI2lmIGRlZmluZWQoQ09ORklHX09GKQorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGx2MzIwYWljMzF4eF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAidGksdGx2MzIwYWljMzEweCIgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHRsdjMyMGFpYzMxMXgiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx0bHYzMjBhaWMzMTAwIiB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksdGx2MzIwYWljMzExMCIgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHRsdjMyMGFpYzMxMjAiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx0bHYzMjBhaWMzMTExIiB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRsdjMyMGFpYzMxeHhfb2ZfbWF0Y2gpOworCitzdGF0aWMgdm9pZCBhaWMzMXh4X3BkYXRhX2Zyb21fb2Yoc3RydWN0IGFpYzMxeHhfcHJpdiAqYWljMzF4eCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gYWljMzF4eC0+ZGV2LT5vZl9ub2RlOworCXVuc2lnbmVkIGludCB2YWx1ZSA9IE1JQ0JJQVNfMl8wVjsKKwlpbnQgcmV0OworCisJb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJhaTMxeHgtbWljYmlhcy12ZyIsICZ2YWx1ZSk7CisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgTUlDQklBU18yXzBWOgorCWNhc2UgTUlDQklBU18yXzVWOgorCWNhc2UgTUlDQklBU19BVkREVjoKKwkJYWljMzF4eC0+cGRhdGEubWljYmlhc192ZyA9IHZhbHVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGFpYzMxeHgtPmRldiwKKwkJCSJCYWQgYWkzMXh4LW1pY2JpYXMtdmcgdmFsdWUgJWQgRFRcbiIsCisJCQl2YWx1ZSk7CisJCWFpYzMxeHgtPnBkYXRhLm1pY2JpYXNfdmcgPSBNSUNCSUFTXzJfMFY7CisJfQorCisJcmV0ID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJncGlvLXJlc2V0IiwgMCk7CisJaWYgKHJldCA+IDApCisJCWFpYzMxeHgtPnBkYXRhLmdwaW9fcmVzZXQgPSByZXQ7Cit9CisjZWxzZSAvKiBDT05GSUdfT0YgKi8KK3N0YXRpYyB2b2lkIGFpYzMxeHhfcGRhdGFfZnJvbV9vZihzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4KQoreworfQorI2VuZGlmIC8qIENPTkZJR19PRiAqLworCitzdGF0aWMgdm9pZCBhaWMzMXh4X2RldmljZV9pbml0KHN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHgpCit7CisJaW50IHJldCwgaTsKKworCWRldl9zZXRfZHJ2ZGF0YShhaWMzMXh4LT5kZXYsIGFpYzMxeHgpOworCisJaWYgKGRldl9nZXRfcGxhdGRhdGEoYWljMzF4eC0+ZGV2KSkKKwkJbWVtY3B5KCZhaWMzMXh4LT5wZGF0YSwgZGV2X2dldF9wbGF0ZGF0YShhaWMzMXh4LT5kZXYpLAorCQkgICAgICAgc2l6ZW9mKGFpYzMxeHgtPnBkYXRhKSk7CisJZWxzZSBpZiAoYWljMzF4eC0+ZGV2LT5vZl9ub2RlKQorCQlhaWMzMXh4X3BkYXRhX2Zyb21fb2YoYWljMzF4eCk7CisKKwlpZiAoYWljMzF4eC0+cGRhdGEuZ3Bpb19yZXNldCkgeworCQlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoYWljMzF4eC0+ZGV2LAorCQkJCQkgICAgYWljMzF4eC0+cGRhdGEuZ3Bpb19yZXNldCwKKwkJCQkJICAgIEdQSU9GX09VVF9JTklUX0hJR0gsCisJCQkJCSAgICAiYWljMzF4eC1yZXNldC1waW4iKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoYWljMzF4eC0+ZGV2LCAibm90IGFibGUgdG8gYWNxdWlyZSBncGlvXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFpYzMxeHgtPnN1cHBsaWVzKTsgaSsrKQorCQlhaWMzMXh4LT5zdXBwbGllc1tpXS5zdXBwbHkgPSBhaWMzMXh4X3N1cHBseV9uYW1lc1tpXTsKKworCXJldCA9IGRldm1fcmVndWxhdG9yX2J1bGtfZ2V0KGFpYzMxeHgtPmRldiwKKwkJCQkgICAgICBBUlJBWV9TSVpFKGFpYzMxeHgtPnN1cHBsaWVzKSwKKwkJCQkgICAgICBhaWMzMXh4LT5zdXBwbGllcyk7CisJaWYgKHJldCAhPSAwKQorCQlkZXZfZXJyKGFpYzMxeHgtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4OworCWludCByZXQ7CisJY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKnJlZ21hcF9jb25maWc7CisKKwlkZXZfZGJnKCZpMmMtPmRldiwgIiMjICVzOiAlcyBjb2RlY190eXBlID0gJWRcbiIsIF9fZnVuY19fLAorCQlpZC0+bmFtZSwgKGludCkgaWQtPmRyaXZlcl9kYXRhKTsKKworCXJlZ21hcF9jb25maWcgPSAmYWljMzF4eF9pMmNfcmVnbWFwOworCisJYWljMzF4eCA9IGRldm1fa3phbGxvYygmaTJjLT5kZXYsIHNpemVvZigqYWljMzF4eCksIEdGUF9LRVJORUwpOworCWlmIChhaWMzMXh4ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYWljMzF4eC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCByZWdtYXBfY29uZmlnKTsKKwlpZiAoSVNfRVJSKGFpYzMxeHgtPnJlZ21hcCkpIHsKKwkJcmV0ID0gUFRSX0VSUihhaWMzMXh4LT5yZWdtYXApOworCQlkZXZfZXJyKCZpMmMtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXA6ICVkXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJYWljMzF4eC0+ZGV2ID0gJmkyYy0+ZGV2OworCisJYWljMzF4eC0+cGRhdGEuY29kZWNfdHlwZSA9IGlkLT5kcml2ZXJfZGF0YTsKKworCWFpYzMxeHhfZGV2aWNlX2luaXQoYWljMzF4eCk7CisKKwlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsICZzb2NfY29kZWNfZHJpdmVyX2FpYzMxeHgsCisJCQkJICAgICBhaWMzMXh4X2RhaV9kcml2ZXIsCisJCQkJICAgICBBUlJBWV9TSVpFKGFpYzMxeHhfZGFpX2RyaXZlcikpOworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWljMzF4eF9pMmNfaWRbXSA9IHsKKwl7ICJ0bHYzMjBhaWMzMTB4IiwgQUlDMzEwMCB9LAorCXsgInRsdjMyMGFpYzMxMXgiLCBBSUMzMTEwIH0sCisJeyAidGx2MzIwYWljMzEwMCIsIEFJQzMxMDAgfSwKKwl7ICJ0bHYzMjBhaWMzMTEwIiwgQUlDMzExMCB9LAorCXsgInRsdjMyMGFpYzMxMjAiLCBBSUMzMTIwIH0sCisJeyAidGx2MzIwYWljMzExMSIsIEFJQzMxMTEgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWljMzF4eF9pMmNfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWljMzF4eF9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInRsdjMyMGFpYzMxeHgtY29kZWMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHRsdjMyMGFpYzMxeHhfb2ZfbWF0Y2gpLAorCX0sCisJLnByb2JlCQk9IGFpYzMxeHhfaTJjX3Byb2JlLAorCS5yZW1vdmUJCT0gYWljMzF4eF9pMmNfcmVtb3ZlLAorCS5pZF90YWJsZQk9IGFpYzMxeHhfaTJjX2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIoYWljMzF4eF9pMmNfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIFRMVjMyMEFJQzMxMTEgY29kZWMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJKeXJpIFNhcmhhIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMxeHguaCBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzF4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZWQ1N2MKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMxeHguaApAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIEFMU0EgU29DIFRMVjMyMEFJQzMxWFggY29kZWMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqLworI2lmbmRlZiBfVExWMzIwQUlDMzFYWF9ICisjZGVmaW5lIF9UTFYzMjBBSUMzMVhYX0gKKworI2RlZmluZSBBSUMzMVhYX1JBVEVTCVNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwCisKKyNkZWZpbmUgQUlDMzFYWF9GT1JNQVRTCShTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSBcCisJCQkgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSkKKworCisjZGVmaW5lIEFJQzMxWFhfU1RFUkVPX0NMQVNTX0RfQklUCTB4MQorI2RlZmluZSBBSUMzMVhYX01JTklEU1BfQklUCQkweDIKKworZW51bSBhaWMzMXh4X3R5cGUgeworCUFJQzMxMDAJPSAwLAorCUFJQzMxMTAgPSBBSUMzMVhYX1NURVJFT19DTEFTU19EX0JJVCwKKwlBSUMzMTIwID0gQUlDMzFYWF9NSU5JRFNQX0JJVCwKKwlBSUMzMTExID0gKEFJQzMxWFhfU1RFUkVPX0NMQVNTX0RfQklUIHwgQUlDMzFYWF9NSU5JRFNQX0JJVCksCit9OworCitzdHJ1Y3QgYWljMzF4eF9wZGF0YSB7CisJZW51bSBhaWMzMXh4X3R5cGUgY29kZWNfdHlwZTsKKwl1bnNpZ25lZCBpbnQgZ3Bpb19yZXNldDsKKwlpbnQgbWljYmlhc192ZzsKK307CisKKy8qIFBhZ2UgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX1BBR0VDVEwJCQkJMHgwMAorCisvKiBQYWdlIDAgUmVnaXN0ZXJzICovCisvKiBTb2Z0d2FyZSByZXNldCByZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX1JFU0VUCQkJCTB4MDEKKy8qIE9UIEZMQUcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUlDMzFYWF9PVF9GTEFHCQkJCTB4MDMKKy8qIENsb2NrIGNsb2NrIEdlbiBtdXhpbmcsIE11bHRpcGxleGVycyovCisjZGVmaW5lIEFJQzMxWFhfQ0xLTVVYCQkJCTB4MDQKKy8qIFBMTCBQIGFuZCBSLVZBTCByZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX1BMTFBSCQkJCTB4MDUKKy8qIFBMTCBKLVZBTCByZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX1BMTEoJCQkJMHgwNgorLyogUExMIEQtVkFMIE1TQiByZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX1BMTERNU0IJCQkJMHgwNworLyogUExMIEQtVkFMIExTQiByZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX1BMTERMU0IJCQkJMHgwOAorLyogREFDIE5EQUNfVkFMIHJlZ2lzdGVyKi8KKyNkZWZpbmUgQUlDMzFYWF9OREFDCQkJCTB4MEIKKy8qIERBQyBNREFDX1ZBTCByZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX01EQUMJCQkJMHgwQworLyogREFDIE9TUiBzZXR0aW5nIHJlZ2lzdGVyIDEsIE1TQiB2YWx1ZSAqLworI2RlZmluZSBBSUMzMVhYX0RPU1JNU0IJCQkJMHgwRAorLyogREFDIE9TUiBzZXR0aW5nIHJlZ2lzdGVyIDIsIExTQiB2YWx1ZSAqLworI2RlZmluZSBBSUMzMVhYX0RPU1JMU0IJCQkJMHgwRQorI2RlZmluZSBBSUMzMVhYX01JTklfRFNQX0lOUE9MCQkJMHgxMAorLyogQ2xvY2sgc2V0dGluZyByZWdpc3RlciA4LCBQTEwgKi8KKyNkZWZpbmUgQUlDMzFYWF9OQURDCQkJCTB4MTIKKy8qIENsb2NrIHNldHRpbmcgcmVnaXN0ZXIgOSwgUExMICovCisjZGVmaW5lIEFJQzMxWFhfTUFEQwkJCQkweDEzCisvKiBBREMgT3ZlcnNhbXBsaW5nIChBT1NSKSBSZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX0FPU1IJCQkJMHgxNAorLyogQ2xvY2sgc2V0dGluZyByZWdpc3RlciA5LCBNdWx0aXBsZXhlcnMgKi8KKyNkZWZpbmUgQUlDMzFYWF9DTEtPVVRNVVgJCQkweDE5CisvKiBDbG9jayBzZXR0aW5nIHJlZ2lzdGVyIDEwLCBDTE9DS09VVCBNIGRpdmlkZXIgdmFsdWUgKi8KKyNkZWZpbmUgQUlDMzFYWF9DTEtPVVRNVkFMCQkJMHgxQQorLyogQXVkaW8gSW50ZXJmYWNlIFNldHRpbmcgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBBSUMzMVhYX0lGQUNFMQkJCQkweDFCCisvKiBBdWRpbyBEYXRhIFNsb3QgT2Zmc2V0IFByb2dyYW1taW5nICovCisjZGVmaW5lIEFJQzMxWFhfREFUQV9PRkZTRVQJCQkweDFDCisvKiBBdWRpbyBJbnRlcmZhY2UgU2V0dGluZyBSZWdpc3RlciAyICovCisjZGVmaW5lIEFJQzMxWFhfSUZBQ0UyCQkJCTB4MUQKKy8qIENsb2NrIHNldHRpbmcgcmVnaXN0ZXIgMTEsIEJDTEsgTiBEaXZpZGVyICovCisjZGVmaW5lIEFJQzMxWFhfQkNMS04JCQkJMHgxRQorLyogQXVkaW8gSW50ZXJmYWNlIFNldHRpbmcgUmVnaXN0ZXIgMywgU2Vjb25kYXJ5IEF1ZGlvIEludGVyZmFjZSAqLworI2RlZmluZSBBSUMzMVhYX0lGQUNFU0VDMQkJCTB4MUYKKy8qIEF1ZGlvIEludGVyZmFjZSBTZXR0aW5nIFJlZ2lzdGVyIDQgKi8KKyNkZWZpbmUgQUlDMzFYWF9JRkFDRVNFQzIJCQkweDIwCisvKiBBdWRpbyBJbnRlcmZhY2UgU2V0dGluZyBSZWdpc3RlciA1ICovCisjZGVmaW5lIEFJQzMxWFhfSUZBQ0VTRUMzCQkJMHgyMQorLyogSTJDIEJ1cyBDb25kaXRpb24gKi8KKyNkZWZpbmUgQUlDMzFYWF9JMkMJCQkJMHgyMgorLyogQURDIEZMQUcgKi8KKyNkZWZpbmUgQUlDMzFYWF9BRENGTEFHCQkJCTB4MjQKKy8qIERBQyBGbGFnIFJlZ2lzdGVycyAqLworI2RlZmluZSBBSUMzMVhYX0RBQ0ZMQUcxCQkJMHgyNQorI2RlZmluZSBBSUMzMVhYX0RBQ0ZMQUcyCQkJMHgyNgorLyogU3RpY2t5IEludGVycnVwdCBmbGFnIChvdmVyZmxvdykgKi8KKyNkZWZpbmUgQUlDMzFYWF9PRkZMQUcJCQkJMHgyNworLyogU3RpY3kgREFDIEludGVycnVwdCBmbGFncyAqLworI2RlZmluZSBBSUMzMVhYX0lOVFJEQUNGTEFHCQkJMHgyQworLyogU3RpY3kgQURDIEludGVycnVwdCBmbGFncyAqLworI2RlZmluZSBBSUMzMVhYX0lOVFJBRENGTEFHCQkJMHgyRAorLyogREFDIEludGVycnVwdCBmbGFncyAyICovCisjZGVmaW5lIEFJQzMxWFhfSU5UUkRBQ0ZMQUcyCQkJMHgyRQorLyogQURDIEludGVycnVwdCBmbGFncyAyICovCisjZGVmaW5lIEFJQzMxWFhfSU5UUkFEQ0ZMQUcyCQkJMHgyRgorLyogSU5UMSBpbnRlcnJ1cHQgY29udHJvbCAqLworI2RlZmluZSBBSUMzMVhYX0lOVDFDVFJMCQkJMHgzMAorLyogSU5UMiBpbnRlcnJ1cHQgY29udHJvbCAqLworI2RlZmluZSBBSUMzMVhYX0lOVDJDVFJMCQkJMHgzMQorLyogR1BJTzEgY29udHJvbCAqLworI2RlZmluZSBBSUMzMVhYX0dQSU8xCQkJCTB4MzMKKworI2RlZmluZSBBSUMzMVhYX0RBQ1BSQgkJCQkweDNDCisvKiBBREMgSW5zdHJ1Y3Rpb24gU2V0IFJlZ2lzdGVyICovCisjZGVmaW5lIEFJQzMxWFhfQURDUFJCCQkJCTB4M0QKKy8qIERBQyBjaGFubmVsIHNldHVwIHJlZ2lzdGVyICovCisjZGVmaW5lIEFJQzMxWFhfREFDU0VUVVAJCQkweDNGCisvKiBEQUMgTXV0ZSBhbmQgdm9sdW1lIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUlDMzFYWF9EQUNNVVRFCQkJCTB4NDAKKy8qIExlZnQgREFDIGNoYW5uZWwgZGlnaXRhbCB2b2x1bWUgY29udHJvbCAqLworI2RlZmluZSBBSUMzMVhYX0xEQUNWT0wJCQkJMHg0MQorLyogUmlnaHQgREFDIGNoYW5uZWwgZGlnaXRhbCB2b2x1bWUgY29udHJvbCAqLworI2RlZmluZSBBSUMzMVhYX1JEQUNWT0wJCQkJMHg0MgorLyogSGVhZHNldCBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgQUlDMzFYWF9IU0RFVEVDVAkJCTB4NDMKKy8qIEFEQyBEaWdpdGFsIE1pYyAqLworI2RlZmluZSBBSUMzMVhYX0FEQ1NFVFVQCQkJMHg1MQorLyogQURDIERpZ2l0YWwgVm9sdW1lIENvbnRyb2wgRmluZSBBZGp1c3QgKi8KKyNkZWZpbmUgQUlDMzFYWF9BRENGR0EJCQkJMHg1MgorLyogQURDIERpZ2l0YWwgVm9sdW1lIENvbnRyb2wgQ29hcnNlIEFkanVzdCAqLworI2RlZmluZSBBSUMzMVhYX0FEQ1ZPTAkJCQkweDUzCisKKworLyogUGFnZSAxIFJlZ2lzdGVycyAqLworLyogSGVhZHBob25lIGRyaXZlcnMgKi8KKyNkZWZpbmUgQUlDMzFYWF9IUERSSVZFUgkJCTB4OUYKKy8qIENsYXNzLUQgU3BlYWtlYXIgQW1wbGlmaWVyICovCisjZGVmaW5lIEFJQzMxWFhfU1BLQU1QCQkJCTB4QTAKKy8qIEhQIE91dHB1dCBEcml2ZXJzIFBPUCBSZW1vdmFsIFNldHRpbmdzICovCisjZGVmaW5lIEFJQzMxWFhfSFBQT1AJCQkJMHhBMQorLyogT3V0cHV0IERyaXZlciBQR0EgUmFtcC1Eb3duIFBlcmlvZCBDb250cm9sICovCisjZGVmaW5lIEFJQzMxWFhfU1BQR0FSQU1QCQkJMHhBMgorLyogREFDX0wgYW5kIERBQ19SIE91dHB1dCBNaXhlciBSb3V0aW5nICovCisjZGVmaW5lIEFJQzMxWFhfREFDTUlYRVJST1VURQkJCTB4QTMKKy8qIExlZnQgQW5hbG9nIFZvbCB0byBIUEwgKi8KKyNkZWZpbmUgQUlDMzFYWF9MQU5BTE9HSFBMCQkJMHhBNAorLyogUmlnaHQgQW5hbG9nIFZvbCB0byBIUFIgKi8KKyNkZWZpbmUgQUlDMzFYWF9SQU5BTE9HSFBSCQkJMHhBNQorLyogTGVmdCBBbmFsb2cgVm9sIHRvIFNQTCAqLworI2RlZmluZSBBSUMzMVhYX0xBTkFMT0dTUEwJCQkweEE2CisvKiBSaWdodCBBbmFsb2cgVm9sIHRvIFNQUiAqLworI2RlZmluZSBBSUMzMVhYX1JBTkFMT0dTUFIJCQkweEE3CisvKiBIUEwgRHJpdmVyICovCisjZGVmaW5lIEFJQzMxWFhfSFBMR0FJTgkJCQkweEE4CisvKiBIUFIgRHJpdmVyICovCisjZGVmaW5lIEFJQzMxWFhfSFBSR0FJTgkJCQkweEE5CisvKiBTUEwgRHJpdmVyICovCisjZGVmaW5lIEFJQzMxWFhfU1BMR0FJTgkJCQkweEFBCisvKiBTUFIgRHJpdmVyICovCisjZGVmaW5lIEFJQzMxWFhfU1BSR0FJTgkJCQkweEFCCisvKiBIUCBEcml2ZXIgQ29udHJvbCAqLworI2RlZmluZSBBSUMzMVhYX0hQQ09OVFJPTAkJCTB4QUMKKy8qIE1JQyBCaWFzIENvbnRyb2wgKi8KKyNkZWZpbmUgQUlDMzFYWF9NSUNCSUFTCQkJCTB4QUUKKy8qIE1JQyBQR0EqLworI2RlZmluZSBBSUMzMVhYX01JQ1BHQQkJCQkweEFGCisvKiBEZWx0YS1TaWdtYSBNb25vIEFEQyBDaGFubmVsIEZpbmUtR2FpbiBJbnB1dCBTZWxlY3Rpb24gZm9yIFAtVGVybWluYWwgKi8KKyNkZWZpbmUgQUlDMzFYWF9NSUNQR0FQSQkJCTB4QjAKKy8qIEFEQyBJbnB1dCBTZWxlY3Rpb24gZm9yIE0tVGVybWluYWwgKi8KKyNkZWZpbmUgQUlDMzFYWF9NSUNQR0FNSQkJCTB4QjEKKy8qIElucHV0IENNIFNldHRpbmdzICovCisjZGVmaW5lIEFJQzMxWFhfTUlDUEdBQ00JCQkweEIyCisKKy8qIEJpdHMsIG1hc2tzIGFuZCBzaGlmdHMgKi8KKworLyogQUlDMzFYWF9DTEtNVVggKi8KKyNkZWZpbmUgQUlDMzFYWF9QTExfQ0xLSU5fTUFTSwkJCTB4MGMKKyNkZWZpbmUgQUlDMzFYWF9QTExfQ0xLSU5fU0hJRlQJCQkyCisjZGVmaW5lIEFJQzMxWFhfUExMX0NMS0lOX01DTEsJCQkwCisjZGVmaW5lIEFJQzMxWFhfQ09ERUNfQ0xLSU5fTUFTSwkJMHgwMworI2RlZmluZSBBSUMzMVhYX0NPREVDX0NMS0lOX1NISUZUCQkwCisjZGVmaW5lIEFJQzMxWFhfQ09ERUNfQ0xLSU5fUExMCQkJMworI2RlZmluZSBBSUMzMVhYX0NPREVDX0NMS0lOX0JDTEsJCTEKKworLyogQUlDMzFYWF9QTExQUiwgQUlDMzFYWF9OREFDLCBBSUMzMVhYX01EQUMsIEFJQzMxWFhfTkFEQywgQUlDMzFYWF9NQURDLAorICAgQUlDMzFYWF9CQ0xLTiAqLworI2RlZmluZSBBSUMzMVhYX1BMTF9NQVNLCQkweDdmCisjZGVmaW5lIEFJQzMxWFhfUE1fTUFTSwkJCTB4ODAKKworLyogQUlDMzFYWF9JRkFDRTEgKi8KKyNkZWZpbmUgQUlDMzFYWF9XT1JEX0xFTl8xNkJJVFMJCTB4MDAKKyNkZWZpbmUgQUlDMzFYWF9XT1JEX0xFTl8yMEJJVFMJCTB4MDEKKyNkZWZpbmUgQUlDMzFYWF9XT1JEX0xFTl8yNEJJVFMJCTB4MDIKKyNkZWZpbmUgQUlDMzFYWF9XT1JEX0xFTl8zMkJJVFMJCTB4MDMKKyNkZWZpbmUgQUlDMzFYWF9JRkFDRTFfREFUQUxFTl9NQVNLCTB4MzAKKyNkZWZpbmUgQUlDMzFYWF9JRkFDRTFfREFUQUxFTl9TSElGVAkoNCkKKyNkZWZpbmUgQUlDMzFYWF9JRkFDRTFfREFUQVRZUEVfTUFTSwkweEMwCisjZGVmaW5lIEFJQzMxWFhfSUZBQ0UxX0RBVEFUWVBFX1NISUZUCSg2KQorI2RlZmluZSBBSUMzMVhYX0kyU19NT0RFCQkweDAwCisjZGVmaW5lIEFJQzMxWFhfRFNQX01PREUJCTB4MDEKKyNkZWZpbmUgQUlDMzFYWF9SSUdIVF9KVVNUSUZJRURfTU9ERQkweDAyCisjZGVmaW5lIEFJQzMxWFhfTEVGVF9KVVNUSUZJRURfTU9ERQkweDAzCisjZGVmaW5lIEFJQzMxWFhfSUZBQ0UxX01BU1RFUl9NQVNLCTB4MEMKKyNkZWZpbmUgQUlDMzFYWF9CQ0xLX01BU1RFUgkJMHgwOAorI2RlZmluZSBBSUMzMVhYX1dDTEtfTUFTVEVSCQkweDA0CisKKy8qIEFJQzMxWFhfREFUQV9PRkZTRVQgKi8KKyNkZWZpbmUgQUlDMzFYWF9EQVRBX09GRlNFVF9NQVNLCTB4RkYKKworLyogQUlDMzFYWF9JRkFDRTIgKi8KKyNkZWZpbmUgQUlDMzFYWF9CQ0xLSU5WX01BU0sJCTB4MDgKKyNkZWZpbmUgQUlDMzFYWF9CRElWQ0xLX01BU0sJCTB4MDMKKyNkZWZpbmUgQUlDMzFYWF9EQUMyQkNMSwkJMHgwMAorI2RlZmluZSBBSUMzMVhYX0RBQ01PRDJCQ0xLCQkweDAxCisjZGVmaW5lIEFJQzMxWFhfQURDMkJDTEsJCTB4MDIKKyNkZWZpbmUgQUlDMzFYWF9BRENNT0QyQkNMSwkJMHgwMworCisvKiBBSUMzMVhYX0FEQ0ZMQUcgKi8KKyNkZWZpbmUgQUlDMzFYWF9BRENQV1JTVEFUVVNfTUFTSwkJMHg0MAorCisvKiBBSUMzMVhYX0RBQ0ZMQUcxICovCisjZGVmaW5lIEFJQzMxWFhfTERBQ1BXUlNUQVRVU19NQVNLCQkweDgwCisjZGVmaW5lIEFJQzMxWFhfUkRBQ1BXUlNUQVRVU19NQVNLCQkweDA4CisjZGVmaW5lIEFJQzMxWFhfSFBMRFJWUFdSU1RBVFVTX01BU0sJCTB4MjAKKyNkZWZpbmUgQUlDMzFYWF9IUFJEUlZQV1JTVEFUVVNfTUFTSwkJMHgwMgorI2RlZmluZSBBSUMzMVhYX1NQTERSVlBXUlNUQVRVU19NQVNLCQkweDEwCisjZGVmaW5lIEFJQzMxWFhfU1BSRFJWUFdSU1RBVFVTX01BU0sJCTB4MDEKKworLyogQUlDMzFYWF9JTlRSREFDRkxBRyAqLworI2RlZmluZSBBSUMzMVhYX0hQU0NERVRFQ1RfTUFTSwkJCTB4ODAKKyNkZWZpbmUgQUlDMzFYWF9CVVRUT05QUkVTU19NQVNLCQkweDIwCisjZGVmaW5lIEFJQzMxWFhfSFNQTFVHX01BU0sJCQkweDEwCisjZGVmaW5lIEFJQzMxWFhfTERSQ1RIUkVTX01BU0sJCQkweDA4CisjZGVmaW5lIEFJQzMxWFhfUkRSQ1RIUkVTX01BU0sJCQkweDA0CisjZGVmaW5lIEFJQzMxWFhfREFDU0lOVF9NQVNLCQkJMHgwMgorI2RlZmluZSBBSUMzMVhYX0RBQ0FJTlRfTUFTSwkJCTB4MDEKKworLyogQUlDMzFYWF9JTlQxQ1RSTCAqLworI2RlZmluZSBBSUMzMVhYX0hTUExVR0RFVF9NQVNLCQkJMHg4MAorI2RlZmluZSBBSUMzMVhYX0JVVFRPTlBSRVNTREVUX01BU0sJCTB4NDAKKyNkZWZpbmUgQUlDMzFYWF9EUkNUSFJFU19NQVNLCQkJMHgyMAorI2RlZmluZSBBSUMzMVhYX0FHQ05PSVNFX01BU0sJCQkweDEwCisjZGVmaW5lIEFJQzMxWFhfT0NfTUFTSwkJCQkweDA4CisjZGVmaW5lIEFJQzMxWFhfRU5HSU5FX01BU0sJCQkweDA0CisKKy8qIEFJQzMxWFhfREFDU0VUVVAgKi8KKyNkZWZpbmUgQUlDMzFYWF9TT0ZUU1RFUF9NQVNLCQkJMHgwMworCisvKiBBSUMzMVhYX0RBQ01VVEUgKi8KKyNkZWZpbmUgQUlDMzFYWF9EQUNNVVRFX01BU0sJCQkweDBDCisKKy8qIEFJQzMxWFhfTUlDQklBUyAqLworI2RlZmluZSBBSUMzMVhYX01JQ0JJQVNfTUFTSwkJCTB4MDMKKyNkZWZpbmUgQUlDMzFYWF9NSUNCSUFTX1NISUZUCQkJMAorCisjZW5kaWYJLyogX1RMVjMyMEFJQzMxWFhfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMng0LmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuYwppbmRleCA2ODgxNTFiLi4xZDliMTE3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuYwpAQCAtMjksOSArMjksMTIgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogCiAjaW5jbHVkZSA8c291bmQvdGx2MzIwYWljMzJ4NC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTY2LDIwICs2OSwzMiBAQAogCXUzMiBtaWNwZ2Ffcm91dGluZzsKIAlib29sIHN3YXBkYWNzOwogCWludCByc3RuX2dwaW87CisJc3RydWN0IGNsayAqbWNsazsKKworCXN0cnVjdCByZWd1bGF0b3IgKnN1cHBseV9sZG87CisJc3RydWN0IHJlZ3VsYXRvciAqc3VwcGx5X2lvdjsKKwlzdHJ1Y3QgcmVndWxhdG9yICpzdXBwbHlfZHY7CisJc3RydWN0IHJlZ3VsYXRvciAqc3VwcGx5X2F2OwogfTsKIAotLyogMGRCIG1pbiwgMWRCIHN0ZXBzICovCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUodGx2X3N0ZXBfMSwgMCwgMTAwLCAwKTsKIC8qIDBkQiBtaW4sIDAuNWRCIHN0ZXBzICovCiBzdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUodGx2X3N0ZXBfMF81LCAwLCA1MCwgMCk7CisvKiAtNjMuNWRCIG1pbiwgMC41ZEIgc3RlcHMgKi8KK3N0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRSh0bHZfcGNtLCAtNjM1MCwgNTAsIDApOworLyogLTZkQiBtaW4sIDFkQiBzdGVwcyAqLworc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKHRsdl9kcml2ZXJfZ2FpbiwgLTYwMCwgMTAwLCAwKTsKKy8qIC0xMmRCIG1pbiwgMC41ZEIgc3RlcHMgKi8KK3N0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRSh0bHZfYWRjX3ZvbCwgLTEyMDAsIDUwLCAwKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMyeDRfc25kX2NvbnRyb2xzW10gPSB7Ci0JU09DX0RPVUJMRV9SX1RMVigiUENNIFBsYXliYWNrIFZvbHVtZSIsIEFJQzMyWDRfTERBQ1ZPTCwKLQkJCUFJQzMyWDRfUkRBQ1ZPTCwgMCwgMHgzMCwgMCwgdGx2X3N0ZXBfMF81KSwKLQlTT0NfRE9VQkxFX1JfVExWKCJIUCBEcml2ZXIgR2FpbiBWb2x1bWUiLCBBSUMzMlg0X0hQTEdBSU4sCi0JCQlBSUMzMlg0X0hQUkdBSU4sIDAsIDB4MUQsIDAsIHRsdl9zdGVwXzEpLAotCVNPQ19ET1VCTEVfUl9UTFYoIkxPIERyaXZlciBHYWluIFZvbHVtZSIsIEFJQzMyWDRfTE9MR0FJTiwKLQkJCUFJQzMyWDRfTE9SR0FJTiwgMCwgMHgxRCwgMCwgdGx2X3N0ZXBfMSksCisJU09DX0RPVUJMRV9SX1NfVExWKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgQUlDMzJYNF9MREFDVk9MLAorCQkJQUlDMzJYNF9SREFDVk9MLCAwLCAtMHg3ZiwgMHgzMCwgNywgMCwgdGx2X3BjbSksCisJU09DX0RPVUJMRV9SX1NfVExWKCJIUCBEcml2ZXIgR2FpbiBWb2x1bWUiLCBBSUMzMlg0X0hQTEdBSU4sCisJCQlBSUMzMlg0X0hQUkdBSU4sIDAsIC0weDYsIDB4MWQsIDUsIDAsCisJCQl0bHZfZHJpdmVyX2dhaW4pLAorCVNPQ19ET1VCTEVfUl9TX1RMVigiTE8gRHJpdmVyIEdhaW4gVm9sdW1lIiwgQUlDMzJYNF9MT0xHQUlOLAorCQkJQUlDMzJYNF9MT1JHQUlOLCAwLCAtMHg2LCAweDFkLCA1LCAwLAorCQkJdGx2X2RyaXZlcl9nYWluKSwKIAlTT0NfRE9VQkxFX1IoIkhQIERBQyBQbGF5YmFjayBTd2l0Y2giLCBBSUMzMlg0X0hQTEdBSU4sCiAJCQlBSUMzMlg0X0hQUkdBSU4sIDYsIDB4MDEsIDEpLAogCVNPQ19ET1VCTEVfUigiTE8gREFDIFBsYXliYWNrIFN3aXRjaCIsIEFJQzMyWDRfTE9MR0FJTiwKQEAgLTkwLDggKzEwNSw4IEBACiAJU09DX1NJTkdMRSgiQURDRkdBIExlZnQgTXV0ZSBTd2l0Y2giLCBBSUMzMlg0X0FEQ0ZHQSwgNywgMSwgMCksCiAJU09DX1NJTkdMRSgiQURDRkdBIFJpZ2h0IE11dGUgU3dpdGNoIiwgQUlDMzJYNF9BRENGR0EsIDMsIDEsIDApLAogCi0JU09DX0RPVUJMRV9SX1RMVigiQURDIExldmVsIFZvbHVtZSIsIEFJQzMyWDRfTEFEQ1ZPTCwKLQkJCUFJQzMyWDRfUkFEQ1ZPTCwgMCwgMHgyOCwgMCwgdGx2X3N0ZXBfMF81KSwKKwlTT0NfRE9VQkxFX1JfU19UTFYoIkFEQyBMZXZlbCBWb2x1bWUiLCBBSUMzMlg0X0xBRENWT0wsCisJCQlBSUMzMlg0X1JBRENWT0wsIDAsIC0weDE4LCAweDI4LCA2LCAwLCB0bHZfYWRjX3ZvbCksCiAJU09DX0RPVUJMRV9SX1RMVigiUEdBIExldmVsIFZvbHVtZSIsIEFJQzMyWDRfTE1JQ1BHQVZPTCwKIAkJCUFJQzMyWDRfUk1JQ1BHQVZPTCwgMCwgMHg1ZiwgMCwgdGx2X3N0ZXBfMF81KSwKIApAQCAtNDgwLDggKzQ5NSwxOCBAQAogc3RhdGljIGludCBhaWMzMng0X3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAkJCQkgIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogeworCXN0cnVjdCBhaWMzMng0X3ByaXYgKmFpYzMyeDQgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0OworCiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCQkvKiBTd2l0Y2ggb24gbWFzdGVyIGNsb2NrICovCisJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShhaWMzMng0LT5tY2xrKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBtYXN0ZXIgY2xvY2tcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCiAJCS8qIFN3aXRjaCBvbiBQTEwgKi8KIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9QTExQUiwKIAkJCQkgICAgQUlDMzJYNF9QTExFTiwgQUlDMzJYNF9QTExFTik7CkBAIC01MDksMjkgKzUzNCwzMiBAQAogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6Ci0JCS8qIFN3aXRjaCBvZmYgUExMICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfUExMUFIsCi0JCQkJICAgIEFJQzMyWDRfUExMRU4sIDApOwotCi0JCS8qIFN3aXRjaCBvZmYgTkRBQyBEaXZpZGVyICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfTkRBQywKLQkJCQkgICAgQUlDMzJYNF9OREFDRU4sIDApOwotCi0JCS8qIFN3aXRjaCBvZmYgTURBQyBEaXZpZGVyICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfTURBQywKLQkJCQkgICAgQUlDMzJYNF9NREFDRU4sIDApOwotCi0JCS8qIFN3aXRjaCBvZmYgTkFEQyBEaXZpZGVyICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfTkFEQywKLQkJCQkgICAgQUlDMzJYNF9OQURDRU4sIDApOworCQkvKiBTd2l0Y2ggb2ZmIEJDTEtfTiBEaXZpZGVyICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfQkNMS04sCisJCQkJICAgIEFJQzMyWDRfQkNMS0VOLCAwKTsKIAogCQkvKiBTd2l0Y2ggb2ZmIE1BREMgRGl2aWRlciAqLwogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMlg0X01BREMsCiAJCQkJICAgIEFJQzMyWDRfTUFEQ0VOLCAwKTsKIAotCQkvKiBTd2l0Y2ggb2ZmIEJDTEtfTiBEaXZpZGVyICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfQkNMS04sCi0JCQkJICAgIEFJQzMyWDRfQkNMS0VOLCAwKTsKKwkJLyogU3dpdGNoIG9mZiBOQURDIERpdmlkZXIgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9OQURDLAorCQkJCSAgICBBSUMzMlg0X05BRENFTiwgMCk7CisKKwkJLyogU3dpdGNoIG9mZiBNREFDIERpdmlkZXIgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9NREFDLAorCQkJCSAgICBBSUMzMlg0X01EQUNFTiwgMCk7CisKKwkJLyogU3dpdGNoIG9mZiBOREFDIERpdmlkZXIgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9OREFDLAorCQkJCSAgICBBSUMzMlg0X05EQUNFTiwgMCk7CisKKwkJLyogU3dpdGNoIG9mZiBQTEwgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9QTExQUiwKKwkJCQkgICAgQUlDMzJYNF9QTExFTiwgMCk7CisKKwkJLyogU3dpdGNoIG9mZiBtYXN0ZXIgY2xvY2sgKi8KKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFpYzMyeDQtPm1jbGspOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19PRkY6CiAJCWJyZWFrOwpAQCAtNTg2LDkgKzYxNCw3IEBACiAJc3RydWN0IGFpYzMyeDRfcHJpdiAqYWljMzJ4NCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXUzMiB0bXBfcmVnOwogCi0Jc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIFNORF9TT0NfUkVHTUFQKTsKLQotCWlmIChhaWMzMng0LT5yc3RuX2dwaW8gPj0gMCkgeworCWlmIChncGlvX2lzX3ZhbGlkKGFpYzMyeDQtPnJzdG5fZ3BpbykpIHsKIAkJbmRlbGF5KDEwKTsKIAkJZ3Bpb19zZXRfdmFsdWUoYWljMzJ4NC0+cnN0bl9ncGlvLCAxKTsKIAl9CkBAIC02NjMsMTEgKzY4OSwxMjIgQEAKIAkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhaWMzMng0X2RhcG1fcm91dGVzKSwKIH07CiAKK3N0YXRpYyBpbnQgYWljMzJ4NF9wYXJzZV9kdChzdHJ1Y3QgYWljMzJ4NF9wcml2ICphaWMzMng0LAorCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCWFpYzMyeDQtPnN3YXBkYWNzID0gZmFsc2U7CisJYWljMzJ4NC0+bWljcGdhX3JvdXRpbmcgPSAwOworCWFpYzMyeDQtPnJzdG5fZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAicmVzZXQtZ3Bpb3MiLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhaWMzMng0X2Rpc2FibGVfcmVndWxhdG9ycyhzdHJ1Y3QgYWljMzJ4NF9wcml2ICphaWMzMng0KQoreworCXJlZ3VsYXRvcl9kaXNhYmxlKGFpYzMyeDQtPnN1cHBseV9pb3YpOworCisJaWYgKCFJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2xkbykpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGFpYzMyeDQtPnN1cHBseV9sZG8pOworCisJaWYgKCFJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2R2KSkKKwkJcmVndWxhdG9yX2Rpc2FibGUoYWljMzJ4NC0+c3VwcGx5X2R2KTsKKworCWlmICghSVNfRVJSKGFpYzMyeDQtPnN1cHBseV9hdikpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGFpYzMyeDQtPnN1cHBseV9hdik7Cit9CisKK3N0YXRpYyBpbnQgYWljMzJ4NF9zZXR1cF9yZWd1bGF0b3JzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGFpYzMyeDRfcHJpdiAqYWljMzJ4NCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWFpYzMyeDQtPnN1cHBseV9sZG8gPSBkZXZtX3JlZ3VsYXRvcl9nZXRfb3B0aW9uYWwoZGV2LCAibGRvaW4iKTsKKwlhaWMzMng0LT5zdXBwbHlfaW92ID0gZGV2bV9yZWd1bGF0b3JfZ2V0KGRldiwgImlvdiIpOworCWFpYzMyeDQtPnN1cHBseV9kdiA9IGRldm1fcmVndWxhdG9yX2dldF9vcHRpb25hbChkZXYsICJkdiIpOworCWFpYzMyeDQtPnN1cHBseV9hdiA9IGRldm1fcmVndWxhdG9yX2dldF9vcHRpb25hbChkZXYsICJhdiIpOworCisJLyogQ2hlY2sgaWYgdGhlIHJlZ3VsYXRvciByZXF1aXJlbWVudHMgYXJlIGZ1bGZpbGxlZCAqLworCisJaWYgKElTX0VSUihhaWMzMng0LT5zdXBwbHlfaW92KSkgeworCQlkZXZfZXJyKGRldiwgIk1pc3Npbmcgc3VwcGx5ICdpb3YnXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoYWljMzJ4NC0+c3VwcGx5X2lvdik7CisJfQorCisJaWYgKElTX0VSUihhaWMzMng0LT5zdXBwbHlfbGRvKSkgeworCQlpZiAoUFRSX0VSUihhaWMzMng0LT5zdXBwbHlfbGRvKSA9PSAtRVBST0JFX0RFRkVSKQorCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisKKwkJaWYgKElTX0VSUihhaWMzMng0LT5zdXBwbHlfZHYpKSB7CisJCQlkZXZfZXJyKGRldiwgIk1pc3Npbmcgc3VwcGx5ICdkdicgb3IgJ2xkb2luJ1xuIik7CisJCQlyZXR1cm4gUFRSX0VSUihhaWMzMng0LT5zdXBwbHlfZHYpOworCQl9CisJCWlmIChJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2F2KSkgeworCQkJZGV2X2VycihkZXYsICJNaXNzaW5nIHN1cHBseSAnYXYnIG9yICdsZG9pbidcbiIpOworCQkJcmV0dXJuIFBUUl9FUlIoYWljMzJ4NC0+c3VwcGx5X2F2KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2R2KSAmJgorCQkJCVBUUl9FUlIoYWljMzJ4NC0+c3VwcGx5X2R2KSA9PSAtRVBST0JFX0RFRkVSKQorCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJCWlmIChJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2F2KSAmJgorCQkJCVBUUl9FUlIoYWljMzJ4NC0+c3VwcGx5X2F2KSA9PSAtRVBST0JFX0RFRkVSKQorCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJfQorCisJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShhaWMzMng0LT5zdXBwbHlfaW92KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSByZWd1bGF0b3IgaW92XG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIUlTX0VSUihhaWMzMng0LT5zdXBwbHlfbGRvKSkgeworCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGFpYzMyeDQtPnN1cHBseV9sZG8pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBlbmFibGUgcmVndWxhdG9yIGxkb1xuIik7CisJCQlnb3RvIGVycm9yX2xkbzsKKwkJfQorCX0KKworCWlmICghSVNfRVJSKGFpYzMyeDQtPnN1cHBseV9kdikpIHsKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShhaWMzMng0LT5zdXBwbHlfZHYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBlbmFibGUgcmVndWxhdG9yIGR2XG4iKTsKKwkJCWdvdG8gZXJyb3JfZHY7CisJCX0KKwl9CisKKwlpZiAoIUlTX0VSUihhaWMzMng0LT5zdXBwbHlfYXYpKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoYWljMzJ4NC0+c3VwcGx5X2F2KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIHJlZ3VsYXRvciBhdlxuIik7CisJCQlnb3RvIGVycm9yX2F2OworCQl9CisJfQorCisJaWYgKCFJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2xkbykgJiYgSVNfRVJSKGFpYzMyeDQtPnN1cHBseV9hdikpCisJCWFpYzMyeDQtPnBvd2VyX2NmZyB8PSBBSUMzMlg0X1BXUl9BSUMzMlg0X0xET19FTkFCTEU7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfYXY6CisJaWYgKCFJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2R2KSkKKwkJcmVndWxhdG9yX2Rpc2FibGUoYWljMzJ4NC0+c3VwcGx5X2R2KTsKKworZXJyb3JfZHY6CisJaWYgKCFJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2xkbykpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGFpYzMyeDQtPnN1cHBseV9sZG8pOworCitlcnJvcl9sZG86CisJcmVndWxhdG9yX2Rpc2FibGUoYWljMzJ4NC0+c3VwcGx5X2lvdik7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBhaWMzMng0X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAogCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGFpYzMyeDRfcGRhdGEgKnBkYXRhID0gaTJjLT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgYWljMzJ4NF9wcml2ICphaWMzMng0OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBpMmMtPmRldi5vZl9ub2RlOwogCWludCByZXQ7CiAKIAlhaWMzMng0ID0gZGV2bV9remFsbG9jKCZpMmMtPmRldiwgc2l6ZW9mKHN0cnVjdCBhaWMzMng0X3ByaXYpLApAQCAtNjg2LDYgKzgyMywxMiBAQAogCQlhaWMzMng0LT5zd2FwZGFjcyA9IHBkYXRhLT5zd2FwZGFjczsKIAkJYWljMzJ4NC0+bWljcGdhX3JvdXRpbmcgPSBwZGF0YS0+bWljcGdhX3JvdXRpbmc7CiAJCWFpYzMyeDQtPnJzdG5fZ3BpbyA9IHBkYXRhLT5yc3RuX2dwaW87CisJfSBlbHNlIGlmIChucCkgeworCQlyZXQgPSBhaWMzMng0X3BhcnNlX2R0KGFpYzMyeDQsIG5wKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gcGFyc2UgRFQgbm9kZVxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfSBlbHNlIHsKIAkJYWljMzJ4NC0+cG93ZXJfY2ZnID0gMDsKIAkJYWljMzJ4NC0+c3dhcGRhY3MgPSBmYWxzZTsKQEAgLTY5MywyMCArODM2LDQ0IEBACiAJCWFpYzMyeDQtPnJzdG5fZ3BpbyA9IC0xOwogCX0KIAotCWlmIChhaWMzMng0LT5yc3RuX2dwaW8gPj0gMCkgeworCWFpYzMyeDQtPm1jbGsgPSBkZXZtX2Nsa19nZXQoJmkyYy0+ZGV2LCAibWNsayIpOworCWlmIChJU19FUlIoYWljMzJ4NC0+bWNsaykpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgZ2V0dGluZyB0aGUgbWNsay4gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgdXNhZ2Ugb2YgdGhpcyBjb2RlYyB3aXRob3V0IG1jbGtcbiIpOworCQlyZXR1cm4gUFRSX0VSUihhaWMzMng0LT5tY2xrKTsKKwl9CisKKwlpZiAoZ3Bpb19pc192YWxpZChhaWMzMng0LT5yc3RuX2dwaW8pKSB7CiAJCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmaTJjLT5kZXYsIGFpYzMyeDQtPnJzdG5fZ3BpbywKIAkJCQlHUElPRl9PVVRfSU5JVF9MT1csICJ0bHYzMjBhaWMzMng0IHJzdG4iKTsKIAkJaWYgKHJldCAhPSAwKQogCQkJcmV0dXJuIHJldDsKIAl9CiAKKwlyZXQgPSBhaWMzMng0X3NldHVwX3JlZ3VsYXRvcnMoJmkyYy0+ZGV2LCBhaWMzMng0KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIHNldHVwIHJlZ3VsYXRvcnNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LAogCQkJJnNvY19jb2RlY19kZXZfYWljMzJ4NCwgJmFpYzMyeDRfZGFpLCAxKTsKLQlyZXR1cm4gcmV0OworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgY29kZWNcbiIpOworCQlhaWMzMng0X2Rpc2FibGVfcmVndWxhdG9ycyhhaWMzMng0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBhaWMzMng0KTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFpYzMyeDRfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogeworCXN0cnVjdCBhaWMzMng0X3ByaXYgKmFpYzMyeDQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWFpYzMyeDRfZGlzYWJsZV9yZWd1bGF0b3JzKGFpYzMyeDQpOworCiAJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldik7CiAJcmV0dXJuIDA7CiB9CkBAIC03MTcsMTAgKzg4NCwxNyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhaWMzMng0X2kyY19pZCk7CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFpYzMyeDRfb2ZfaWRbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInRpLHRsdjMyMGFpYzMyeDQiLCB9LAorCXsgLyogc2VuaXRlbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYWljMzJ4NF9vZl9pZCk7CisKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhaWMzMng0X2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAidGx2MzIwYWljMzJ4NCIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBhaWMzMng0X29mX2lkLAogCX0sCiAJLnByb2JlID0gICAgYWljMzJ4NF9pMmNfcHJvYmUsCiAJLnJlbW92ZSA9ICAgYWljMzJ4NF9pMmNfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jCmluZGV4IDQ3MGZiZmIuLmIxODM1MTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljM3guYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmMKQEAgLTEzNDQsMTIgKzEzNDQsNiBAQAogCUlOSVRfTElTVF9IRUFEKCZhaWMzeC0+bGlzdCk7CiAJYWljM3gtPmNvZGVjID0gY29kZWM7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWljM3gtPnN1cHBsaWVzKTsgaSsrKSB7CiAJCWFpYzN4LT5kaXNhYmxlX25iW2ldLm5iLm5vdGlmaWVyX2NhbGwgPSBhaWMzeF9yZWd1bGF0b3JfZXZlbnQ7CiAJCWFpYzN4LT5kaXNhYmxlX25iW2ldLmFpYzN4ID0gYWljM3g7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGRhYzMzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGRhYzMzLmMKaW5kZXggNGYzNTgzOS4uNmJmYzhhMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBkYWMzMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwZGFjMzMuYwpAQCAtMTIyLDcgKzEyMiw2IEBACiAJdW5zaWduZWQgaW50IHV0aHI7CiAKIAllbnVtIGRhYzMzX3N0YXRlIHN0YXRlOwotCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwogCXZvaWQgKmNvbnRyb2xfZGF0YTsKIH07CiAKQEAgLTQ2MSw3ICs0NjAsNyBAQAogCWlmIChkYWMzMy0+Zmlmb19tb2RlID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQogCQlyZXR1cm4gMDsKIAkvKiBEbyBub3QgYWxsb3cgY2hhbmdlcyB3aGlsZSBzdHJlYW0gaXMgcnVubmluZyovCi0JaWYgKGNvZGVjLT5hY3RpdmUpCisJaWYgKHNuZF9zb2NfY29kZWNfaXNfYWN0aXZlKGNvZGVjKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAogCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA8IDAgfHwKQEAgLTQ3OCw5ICs0NzcsNyBAQAogCSJCeXBhc3MiLCAiTW9kZSAxIiwgIk1vZGUgNyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjMzNfZmlmb19tb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRShkYWMzM19maWZvX21vZGVfdGV4dHMpLAotCQkJICAgIGRhYzMzX2ZpZm9fbW9kZV90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGRhYzMzX2ZpZm9fbW9kZV9lbnVtLCBkYWMzM19maWZvX21vZGVfdGV4dHMpOwogCiAvKiBML1IgTGluZSBPdXRwdXQgR2FpbiAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmxyX2xpbmVvdXRfZ2Fpbl90ZXh0c1tdID0gewpAQCAtNDg4LDE1ICs0ODUsMTMgQEAKIAkiTGluZSAwZEIgREFDIDEyZEIiLCAiTGluZSA2ZEIgREFDIDE4ZEIiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsX2xpbmVvdXRfZ2Fpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoREFDMzNfTERBQ19QV1JfQ1RSTCwgMCwKLQkJCUFSUkFZX1NJWkUobHJfbGluZW91dF9nYWluX3RleHRzKSwKLQkJCWxyX2xpbmVvdXRfZ2Fpbl90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobF9saW5lb3V0X2dhaW5fZW51bSwKKwkJCSAgICBEQUMzM19MREFDX1BXUl9DVFJMLCAwLAorCQkJICAgIGxyX2xpbmVvdXRfZ2Fpbl90ZXh0cyk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcl9saW5lb3V0X2dhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBQzMzX1JEQUNfUFdSX0NUUkwsIDAsCi0JCQlBUlJBWV9TSVpFKGxyX2xpbmVvdXRfZ2Fpbl90ZXh0cyksCi0JCQlscl9saW5lb3V0X2dhaW5fdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJfbGluZW91dF9nYWluX2VudW0sCisJCQkgICAgREFDMzNfUkRBQ19QV1JfQ1RSTCwgMCwKKwkJCSAgICBscl9saW5lb3V0X2dhaW5fdGV4dHMpOwogCiAvKgogICogREFDTC9SIGRpZ2l0YWwgdm9sdW1lIGNvbnRyb2w6CkBAIC01MzQsMTggKzUyOSwxNiBAQAogLyogTE9QIEwvUiBpbnZlcnQgc2VsZWN0aW9uICovCiBzdGF0aWMgY29uc3QgY2hhciAqZGFjMzNfbHJfbG9tX3RleHRzW10gPSB7IkRBQyIsICJMT1AifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYWMzM19sZWZ0X2xvbV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoREFDMzNfT1VUX0FNUF9DVFJMLCAzLAotCQkJQVJSQVlfU0laRShkYWMzM19scl9sb21fdGV4dHMpLAotCQkJZGFjMzNfbHJfbG9tX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYWMzM19sZWZ0X2xvbV9lbnVtLAorCQkJICAgIERBQzMzX09VVF9BTVBfQ1RSTCwgMywKKwkJCSAgICBkYWMzM19scl9sb21fdGV4dHMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGFjMzNfZGFwbV9sZWZ0X2xvbV9jb250cm9sID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgZGFjMzNfbGVmdF9sb21fZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjMzNfcmlnaHRfbG9tX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShEQUMzM19PVVRfQU1QX0NUUkwsIDIsCi0JCQlBUlJBWV9TSVpFKGRhYzMzX2xyX2xvbV90ZXh0cyksCi0JCQlkYWMzM19scl9sb21fdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhYzMzX3JpZ2h0X2xvbV9lbnVtLAorCQkJICAgIERBQzMzX09VVF9BTVBfQ1RSTCwgMiwKKwkJCSAgICBkYWMzM19scl9sb21fdGV4dHMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGFjMzNfZGFwbV9yaWdodF9sb21fY29udHJvbCA9CiBTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIGRhYzMzX3JpZ2h0X2xvbV9lbnVtKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jIGIvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKaW5kZXggMDA2NjVhZC4uOTc1ZTBmNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKQEAgLTQxNSwxMCArNDE1LDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyICp0d2w0MDMwX2hhbmRzZnJlZWxfdGV4dHNbXSA9CiAJCXsiVm9pY2UiLCAiQXVkaW9MMSIsICJBdWRpb0wyIiwgIkF1ZGlvUjIifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX2hhbmRzZnJlZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX0hGTF9DVEwsIDAsCi0JCQlBUlJBWV9TSVpFKHR3bDQwMzBfaGFuZHNmcmVlbF90ZXh0cyksCi0JCQl0d2w0MDMwX2hhbmRzZnJlZWxfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHR3bDQwMzBfaGFuZHNmcmVlbF9lbnVtLAorCQkJICAgIFRXTDQwMzBfUkVHX0hGTF9DVEwsIDAsCisJCQkgICAgdHdsNDAzMF9oYW5kc2ZyZWVsX3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR3bDQwMzBfZGFwbV9oYW5kc2ZyZWVsX2NvbnRyb2wgPQogU09DX0RBUE1fRU5VTSgiUm91dGUiLCB0d2w0MDMwX2hhbmRzZnJlZWxfZW51bSk7CkBAIC00MzEsMTAgKzQzMCw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqdHdsNDAzMF9oYW5kc2ZyZWVyX3RleHRzW10gPQogCQl7IlZvaWNlIiwgIkF1ZGlvUjEiLCAiQXVkaW9SMiIsICJBdWRpb0wyIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHdsNDAzMF9oYW5kc2ZyZWVyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19IRlJfQ1RMLCAwLAotCQkJQVJSQVlfU0laRSh0d2w0MDMwX2hhbmRzZnJlZXJfdGV4dHMpLAotCQkJdHdsNDAzMF9oYW5kc2ZyZWVyX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh0d2w0MDMwX2hhbmRzZnJlZXJfZW51bSwKKwkJCSAgICBUV0w0MDMwX1JFR19IRlJfQ1RMLCAwLAorCQkJICAgIHR3bDQwMzBfaGFuZHNmcmVlcl90ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX2RhcG1faGFuZHNmcmVlcl9jb250cm9sID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9oYW5kc2ZyZWVyX2VudW0pOwpAQCAtNDQ4LDEwICs0NDYsOSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfdmlicmFfdGV4dHNbXSA9CiAJCXsiQXVkaW9MMSIsICJBdWRpb1IxIiwgIkF1ZGlvTDIiLCAiQXVkaW9SMiJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDQwMzBfdmlicmFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX1ZJQlJBX0NUTCwgMiwKLQkJCUFSUkFZX1NJWkUodHdsNDAzMF92aWJyYV90ZXh0cyksCi0JCQl0d2w0MDMwX3ZpYnJhX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh0d2w0MDMwX3ZpYnJhX2VudW0sCisJCQkgICAgVFdMNDAzMF9SRUdfVklCUkFfQ1RMLCAyLAorCQkJICAgIHR3bDQwMzBfdmlicmFfdGV4dHMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHdsNDAzMF9kYXBtX3ZpYnJhX2NvbnRyb2wgPQogU09DX0RBUE1fRU5VTSgiUm91dGUiLCB0d2w0MDMwX3ZpYnJhX2VudW0pOwpAQCAtNDYwLDEwICs0NTcsOSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfdmlicmFwYXRoX3RleHRzW10gPQogCQl7IkxvY2FsIHZpYnJhdG9yIiwgIkF1ZGlvIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHdsNDAzMF92aWJyYXBhdGhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX1ZJQlJBX0NUTCwgNCwKLQkJCUFSUkFZX1NJWkUodHdsNDAzMF92aWJyYXBhdGhfdGV4dHMpLAotCQkJdHdsNDAzMF92aWJyYXBhdGhfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHR3bDQwMzBfdmlicmFwYXRoX2VudW0sCisJCQkgICAgVFdMNDAzMF9SRUdfVklCUkFfQ1RMLCA0LAorCQkJICAgIHR3bDQwMzBfdmlicmFwYXRoX3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR3bDQwMzBfZGFwbV92aWJyYXBhdGhfY29udHJvbCA9CiBTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHR3bDQwMzBfdmlicmFwYXRoX2VudW0pOwpAQCAtNDkwLDEwICs0ODYsOSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfbWljcGF0aHR4MV90ZXh0c1tdID0KIAkJeyJBbmFsb2ciLCAiRGlnaW1pYzAifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX21pY3BhdGh0eDFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX0FEQ01JQ1NFTCwgMCwKLQkJCUFSUkFZX1NJWkUodHdsNDAzMF9taWNwYXRodHgxX3RleHRzKSwKLQkJCXR3bDQwMzBfbWljcGF0aHR4MV90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHdsNDAzMF9taWNwYXRodHgxX2VudW0sCisJCQkgICAgVFdMNDAzMF9SRUdfQURDTUlDU0VMLCAwLAorCQkJICAgIHR3bDQwMzBfbWljcGF0aHR4MV90ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX2RhcG1fbWljcGF0aHR4MV9jb250cm9sID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9taWNwYXRodHgxX2VudW0pOwpAQCAtNTAyLDEwICs0OTcsOSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfbWljcGF0aHR4Ml90ZXh0c1tdID0KIAkJeyJBbmFsb2ciLCAiRGlnaW1pYzEifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX21pY3BhdGh0eDJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX0FEQ01JQ1NFTCwgMiwKLQkJCUFSUkFZX1NJWkUodHdsNDAzMF9taWNwYXRodHgyX3RleHRzKSwKLQkJCXR3bDQwMzBfbWljcGF0aHR4Ml90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHdsNDAzMF9taWNwYXRodHgyX2VudW0sCisJCQkgICAgVFdMNDAzMF9SRUdfQURDTUlDU0VMLCAyLAorCQkJICAgIHR3bDQwMzBfbWljcGF0aHR4Ml90ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX2RhcG1fbWljcGF0aHR4Ml9jb250cm9sID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9taWNwYXRodHgyX2VudW0pOwpAQCAtOTU1LDE5ICs5NDksMTUgQEAKIAkiT3B0aW9uIDIgKHZvaWNlL2F1ZGlvKSIsICJPcHRpb24gMSAoYXVkaW8pIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX29wX21vZGVzX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19DT0RFQ19NT0RFLCAwLAotCQkJQVJSQVlfU0laRSh0d2w0MDMwX29wX21vZGVzX3RleHRzKSwKLQkJCXR3bDQwMzBfb3BfbW9kZXNfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHR3bDQwMzBfb3BfbW9kZXNfZW51bSwKKwkJCSAgICBUV0w0MDMwX1JFR19DT0RFQ19NT0RFLCAwLAorCQkJICAgIHR3bDQwMzBfb3BfbW9kZXNfdGV4dHMpOwogCiBzdGF0aWMgaW50IHNuZF9zb2NfcHV0X3R3bDQwMzBfb3Btb2RlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3QgdHdsNDAzMF9wcml2ICp0d2w0MDMwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXVuc2lnbmVkIHNob3J0IHZhbDsKLQl1bnNpZ25lZCBzaG9ydCBtYXNrOwogCiAJaWYgKHR3bDQwMzAtPmNvbmZpZ3VyZWQpIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LApAQCAtOTc1LDE5ICs5NjUsNyBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gZS0+bWF4IC0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdIDw8IGUtPnNoaWZ0X2w7Ci0JbWFzayA9IGUtPm1hc2sgPDwgZS0+c2hpZnRfbDsKLQlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKSB7Ci0JCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID4gZS0+bWF4IC0gMSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQl2YWwgfD0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA8PCBlLT5zaGlmdF9yOwotCQltYXNrIHw9IGUtPm1hc2sgPDwgZS0+c2hpZnRfcjsKLQl9Ci0KLQlyZXR1cm4gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZS0+cmVnLCBtYXNrLCB2YWwpOworCXJldHVybiBzbmRfc29jX3B1dF9lbnVtX2RvdWJsZShrY29udHJvbCwgdWNvbnRyb2wpOwogfQogCiAvKgpAQCAtMTA0NCwxMCArMTAyMiw5IEBACiAJIlZvaWNlIGhpZ2ggcHJpb3JpdHkiLCAiSGlGaSBoaWdoIHByaW9yaXR5IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX2F2YWRjX2Nsa19wcmlvcml0eV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoVFdMNDAzMF9SRUdfQVZBRENfQ1RMLCAyLAotCQkJQVJSQVlfU0laRSh0d2w0MDMwX2F2YWRjX2Nsa19wcmlvcml0eV90ZXh0cyksCi0JCQl0d2w0MDMwX2F2YWRjX2Nsa19wcmlvcml0eV90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHdsNDAzMF9hdmFkY19jbGtfcHJpb3JpdHlfZW51bSwKKwkJCSAgICBUV0w0MDMwX1JFR19BVkFEQ19DVEwsIDIsCisJCQkgICAgdHdsNDAzMF9hdmFkY19jbGtfcHJpb3JpdHlfdGV4dHMpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqdHdsNDAzMF9yYW1wZGVsYXlfdGV4dHNbXSA9IHsKIAkiMjcvMjAvMTQgbXMiLCAiNTUvNDAvMjcgbXMiLCAiMTA5LzgxLzU1IG1zIiwgIjIxOC8xNjEvMTA5IG1zIiwKQEAgLTEwNTUsNDAgKzEwMzIsMzYgQEAKIAkiMzQ5NS8yNTgxLzE3NDggbXMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDQwMzBfcmFtcGRlbGF5X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19IU19QT1BOX1NFVCwgMiwKLQkJCUFSUkFZX1NJWkUodHdsNDAzMF9yYW1wZGVsYXlfdGV4dHMpLAotCQkJdHdsNDAzMF9yYW1wZGVsYXlfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHR3bDQwMzBfcmFtcGRlbGF5X2VudW0sCisJCQkgICAgVFdMNDAzMF9SRUdfSFNfUE9QTl9TRVQsIDIsCisJCQkgICAgdHdsNDAzMF9yYW1wZGVsYXlfdGV4dHMpOwogCiAvKiBWaWJyYSBILWJyaWRnZSBkaXJlY3Rpb24gbW9kZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfdmlicmFkaXJtb2RlX3RleHRzW10gPSB7CiAJIlZpYnJhIEgtYnJpZGdlIGRpcmVjdGlvbiIsICJBdWRpbyBkYXRhIE1TQiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDQwMzBfdmlicmFkaXJtb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19WSUJSQV9DVEwsIDUsCi0JCQlBUlJBWV9TSVpFKHR3bDQwMzBfdmlicmFkaXJtb2RlX3RleHRzKSwKLQkJCXR3bDQwMzBfdmlicmFkaXJtb2RlX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh0d2w0MDMwX3ZpYnJhZGlybW9kZV9lbnVtLAorCQkJICAgIFRXTDQwMzBfUkVHX1ZJQlJBX0NUTCwgNSwKKwkJCSAgICB0d2w0MDMwX3ZpYnJhZGlybW9kZV90ZXh0cyk7CiAKIC8qIFZpYnJhIEgtYnJpZGdlIGRpcmVjdGlvbiAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfdmlicmFkaXJfdGV4dHNbXSA9IHsKIAkiUG9zaXRpdmUgcG9sYXJpdHkiLCAiTmVnYXRpdmUgcG9sYXJpdHkiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX3ZpYnJhZGlyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19WSUJSQV9DVEwsIDEsCi0JCQlBUlJBWV9TSVpFKHR3bDQwMzBfdmlicmFkaXJfdGV4dHMpLAotCQkJdHdsNDAzMF92aWJyYWRpcl90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHdsNDAzMF92aWJyYWRpcl9lbnVtLAorCQkJICAgIFRXTDQwMzBfUkVHX1ZJQlJBX0NUTCwgMSwKKwkJCSAgICB0d2w0MDMwX3ZpYnJhZGlyX3RleHRzKTsKIAogLyogRGlnaW1pYyBMZWZ0IGFuZCByaWdodCBzd2FwcGluZyAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfZGlnaW1pY3N3YXBfdGV4dHNbXSA9IHsKIAkiTm90IHN3YXBwZWQiLCAiU3dhcHBlZCIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDQwMzBfZGlnaW1pY3N3YXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX01JU0NfU0VUXzEsIDAsCi0JCQlBUlJBWV9TSVpFKHR3bDQwMzBfZGlnaW1pY3N3YXBfdGV4dHMpLAotCQkJdHdsNDAzMF9kaWdpbWljc3dhcF90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHdsNDAzMF9kaWdpbWljc3dhcF9lbnVtLAorCQkJICAgIFRXTDQwMzBfUkVHX01JU0NfU0VUXzEsIDAsCisJCQkgICAgdHdsNDAzMF9kaWdpbWljc3dhcF90ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX3NuZF9jb250cm9sc1tdID0gewogCS8qIENvZGVjIG9wZXJhdGlvbiBtb2RlIGNvbnRyb2wgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5jIGIvc291bmQvc29jL2NvZGVjcy90d2w2MDQwLmMKaW5kZXggMGFmZThiZS4uYmQzYTIwNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90d2w2MDQwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90d2w2MDQwLmMKQEAgLTgxLDcgKzgxLDcgQEAKIH07CiAKIC8qIHNldCBvZiByYXRlcyBmb3IgZWFjaCBwbGw6IGxvdy1wb3dlciBhbmQgaGlnaC1wZXJmb3JtYW5jZSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBscF9yYXRlc1tdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBscF9yYXRlc1tdID0gewogCTgwMDAsCiAJMTEyNTAsCiAJMTYwMDAsCkBAIC05Myw3ICs5Myw3IEBACiAJOTYwMDAsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGhwX3JhdGVzW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGhwX3JhdGVzW10gPSB7CiAJODAwMCwKIAkxNjAwMCwKIAkzMjAwMCwKQEAgLTEwMSw3ICsxMDEsNyBAQAogCTk2MDAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBzeXNjbGtfY29uc3RyYWludHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qgc3lzY2xrX2NvbnN0cmFpbnRzW10gPSB7CiAJeyAuY291bnQgPSBBUlJBWV9TSVpFKGxwX3JhdGVzKSwgLmxpc3QgPSBscF9yYXRlcywgfSwKIAl7IC5jb3VudCA9IEFSUkFZX1NJWkUoaHBfcmF0ZXMpLCAubGlzdCA9IGhwX3JhdGVzLCB9LAogfTsKQEAgLTM5Miw4ICszOTIsMTAgQEAKIAl7IkhlYWRzZXQgTWljIiwgIlN1YiBNaWMiLCAiQXV4L0ZNIFJpZ2h0IiwgIk9mZiJ9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDYwNDBfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShUV0w2MDQwX1JFR19NSUNMQ1RMLCAzLCA0LCB0d2w2MDQwX2FtaWNsX3RleHRzKSwKLQlTT0NfRU5VTV9TSU5HTEUoVFdMNjA0MF9SRUdfTUlDUkNUTCwgMywgNCwgdHdsNjA0MF9hbWljcl90ZXh0cyksCisJU09DX0VOVU1fU0lOR0xFKFRXTDYwNDBfUkVHX01JQ0xDVEwsIDMsCisJCQlBUlJBWV9TSVpFKHR3bDYwNDBfYW1pY2xfdGV4dHMpLCB0d2w2MDQwX2FtaWNsX3RleHRzKSwKKwlTT0NfRU5VTV9TSU5HTEUoVFdMNjA0MF9SRUdfTUlDUkNUTCwgMywKKwkJCUFSUkFZX1NJWkUodHdsNjA0MF9hbWljcl90ZXh0cyksIHR3bDYwNDBfYW1pY3JfdGV4dHMpLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDYwNDBfaHNfdGV4dHNbXSA9IHsKQEAgLTQ3Niw5ICs0NzgsOCBAQAogCSJMb3ctUG93ZXIiLCAiSGlnaC1QZXJmb3JtYW5jZSIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDYwNDBfcG93ZXJfbW9kZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUodHdsNjA0MF9wb3dlcl9tb2RlX3RleHRzKSwKLQkJCXR3bDYwNDBfcG93ZXJfbW9kZV90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHR3bDYwNDBfcG93ZXJfbW9kZV9lbnVtLAorCQkJCXR3bDYwNDBfcG93ZXJfbW9kZV90ZXh0cyk7CiAKIHN0YXRpYyBpbnQgdHdsNjA0MF9oZWFkc2V0X3Bvd2VyX2dldF9lbnVtKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy91ZGExMzR4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3VkYTEzNHguYwppbmRleCBjOTRkNGMxLi5lZGYyN2FjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3VkYTEzNHguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3VkYTEzNHguYwpAQCAtMjAzLDggKzIwMyw3IEBACiAJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKIAlzdHJ1Y3QgdWRhMTM0eF9wcml2ICp1ZGExMzR4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJdTggaHdfcGFyYW1zOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3VkYTEzODAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM4MC5jCmluZGV4IDcyNmRmNmQuLmU2MmU3MDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM4MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM4MC5jCkBAIC0xMDgsNyArMTA4LDcgQEAKIAkvKiB0aGUgaW50ZXJwb2xhdG9yICYgZGVjaW1hdG9yIHJlZ3MgbXVzdCBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUKIAkgKiBjb2RlYyBEQUkgaXMgYWN0aXZlLgogCSAqLwotCWlmICghY29kZWMtPmFjdGl2ZSAmJiAocmVnID49IFVEQTEzODBfTVZPTCkpCisJaWYgKCFzbmRfc29jX2NvZGVjX2lzX2FjdGl2ZShjb2RlYykgJiYgKHJlZyA+PSBVREExMzgwX01WT0wpKQogCQlyZXR1cm4gMDsKIAlwcl9kZWJ1ZygidWRhMTM4MDogaHcgd3JpdGUgJXggdmFsICV4XG4iLCByZWcsIHZhbHVlKTsKIAlpZiAoY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDMpID09IDMpIHsKQEAgLTIzNywyNSArMjM3LDI3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHVkYTEzODBfZGVlbXBfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShVREExMzgwX0RFRU1QLCA4LCA1LCB1ZGExMzgwX2RlZW1wKSwKLQlTT0NfRU5VTV9TSU5HTEUoVURBMTM4MF9ERUVNUCwgMCwgNSwgdWRhMTM4MF9kZWVtcCksCisJU09DX0VOVU1fU0lOR0xFKFVEQTEzODBfREVFTVAsIDgsIEFSUkFZX1NJWkUodWRhMTM4MF9kZWVtcCksCisJCQl1ZGExMzgwX2RlZW1wKSwKKwlTT0NfRU5VTV9TSU5HTEUoVURBMTM4MF9ERUVNUCwgMCwgQVJSQVlfU0laRSh1ZGExMzgwX2RlZW1wKSwKKwkJCXVkYTEzODBfZGVlbXApLAogfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdWRhMTM4MF9pbnB1dF9zZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFVEQTEzODBfQURDLCAyLCA0LCB1ZGExMzgwX2lucHV0X3NlbCk7CQkvKiBTRUxfTUlDLCBTRUxfTE5BICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHVkYTEzODBfb3V0cHV0X3NlbF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoVURBMTM4MF9QTSwgNywgMiwgdWRhMTM4MF9vdXRwdXRfc2VsKTsJCS8qIFIwMl9FTl9BVkMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdWRhMTM4MF9zcGZfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFVEQTEzODBfTU9ERSwgMTQsIDQsIHVkYTEzODBfc3BmX21vZGUpOwkJLyogTSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB1ZGExMzgwX2NhcHR1cmVfc2VsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShVREExMzgwX0lGQUNFLCA2LCAyLCB1ZGExMzgwX2NhcHR1cmVfc2VsKTsJLyogU0VMX1NPVVJDRSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB1ZGExMzgwX3NlbF9uc19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoVURBMTM4MF9NSVhFUiwgMTQsIDIsIHVkYTEzODBfc2VsX25zKTsJCS8qIFNFTF9OUyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB1ZGExMzgwX21peF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoVURBMTM4MF9NSVhFUiwgMTIsIDQsIHVkYTEzODBfbWl4X2NvbnRyb2wpOwkvKiBNSVgsIE1JWF9QT1MgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdWRhMTM4MF9zZGV0X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShVREExMzgwX01JWEVSLCA0LCA0LCB1ZGExMzgwX3NkZXRfc2V0dGluZyk7CS8qIFNEX1ZBTFVFICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHVkYTEzODBfb3NfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFVEQTEzODBfTUlYRVIsIDAsIDMsIHVkYTEzODBfb3Nfc2V0dGluZyk7CS8qIE9TICovCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodWRhMTM4MF9pbnB1dF9zZWxfZW51bSwKKwkJCSAgICBVREExMzgwX0FEQywgMiwgdWRhMTM4MF9pbnB1dF9zZWwpOwkJLyogU0VMX01JQywgU0VMX0xOQSAqLworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHVkYTEzODBfb3V0cHV0X3NlbF9lbnVtLAorCQkJICAgIFVEQTEzODBfUE0sIDcsIHVkYTEzODBfb3V0cHV0X3NlbCk7CQkvKiBSMDJfRU5fQVZDICovCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodWRhMTM4MF9zcGZfZW51bSwKKwkJCSAgICBVREExMzgwX01PREUsIDE0LCB1ZGExMzgwX3NwZl9tb2RlKTsJCS8qIE0gKi8KK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh1ZGExMzgwX2NhcHR1cmVfc2VsX2VudW0sCisJCQkgICAgVURBMTM4MF9JRkFDRSwgNiwgdWRhMTM4MF9jYXB0dXJlX3NlbCk7CS8qIFNFTF9TT1VSQ0UgKi8KK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh1ZGExMzgwX3NlbF9uc19lbnVtLAorCQkJICAgIFVEQTEzODBfTUlYRVIsIDE0LCB1ZGExMzgwX3NlbF9ucyk7CQkvKiBTRUxfTlMgKi8KK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh1ZGExMzgwX21peF9lbnVtLAorCQkJICAgIFVEQTEzODBfTUlYRVIsIDEyLCB1ZGExMzgwX21peF9jb250cm9sKTsJLyogTUlYLCBNSVhfUE9TICovCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodWRhMTM4MF9zZGV0X2VudW0sCisJCQkgICAgVURBMTM4MF9NSVhFUiwgNCwgdWRhMTM4MF9zZGV0X3NldHRpbmcpOwkvKiBTRF9WQUxVRSAqLworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHVkYTEzODBfb3NfZW51bSwKKwkJCSAgICBVREExMzgwX01JWEVSLCAwLCB1ZGExMzgwX29zX3NldHRpbmcpOwkvKiBPUyAqLwogCiAvKgogICogZnJvbSAtNDggZEIgaW4gMS41IGRCIHN0ZXBzIChtdXRlIGluc3RlYWQgb2YgLTQ5LjUgZEIpCkBAIC01NjQsOCArNTY2LDcgQEAKIHN0YXRpYyB2b2lkIHVkYTEzODBfcGNtX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJCSBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwogCXUxNiBjbGsgPSB1ZGExMzgwX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBVREExMzgwX0NMSyk7CiAKIAkvKiBzaHV0IGRvd24gV1NQTEwgcG93ZXIgaWYgcnVubmluZyBmcm9tIHRoaXMgY2xvY2sgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2wxMjczLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dsMTI3My5jCmluZGV4IGI3YWIyZWYuLjZiZTVmODAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2wxMjczLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bDEyNzMuYwpAQCAtMTk3LDcgKzE5Nyw3IEBACiAJCXJldHVybiAwOwogCiAJLyogRG8gbm90IGFsbG93IGNoYW5nZXMgd2hpbGUgc3RyZWFtIGlzIHJ1bm5pbmcgKi8KLQlpZiAoY29kZWMtPmFjdGl2ZSkKKwlpZiAoc25kX3NvY19jb2RlY19pc19hY3RpdmUoY29kZWMpKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdIDwgMCB8fApAQCAtMjA5LDggKzIwOSw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd2wxMjczX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRSh3bDEyNzNfYXVkaW9fcm91dGUpLCB3bDEyNzNfYXVkaW9fcm91dGUpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh3bDEyNzNfZW51bSwgd2wxMjczX2F1ZGlvX3JvdXRlKTsKIAogc3RhdGljIGludCBzbmRfd2wxMjczX2ZtX2F1ZGlvX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKQEAgLTI0Nyw5ICsyNDYsNyBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHdsMTI3M19hdWRpb19zdHJpbmdzW10gPSB7ICJEaWdpdGFsIiwgIkFuYWxvZyIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bDEyNzNfYXVkaW9fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKHdsMTI3M19hdWRpb19zdHJpbmdzKSwKLQkJCSAgICB3bDEyNzNfYXVkaW9fc3RyaW5ncyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHdsMTI3M19hdWRpb19lbnVtLCB3bDEyNzNfYXVkaW9fc3RyaW5ncyk7CiAKIHN0YXRpYyBpbnQgc25kX3dsMTI3M19mbV92b2x1bWVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd20yMDAwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtMjAwMC5jCmluZGV4IDhhZTUwMjcuLjgzYTJjODcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd20yMDAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTIwMDAuYwpAQCAtNzg2LDggKzc4Niw2IEBACiB7CiAJc3RydWN0IHdtMjAwMF9wcml2ICp3bTIwMDAgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldik7CiAKLQlzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMTYsIDgsIFNORF9TT0NfUkVHTUFQKTsKLQogCS8qIFRoaXMgd2lsbCB0cmlnZ2VyIGEgdHJhbnNpdGlvbiB0byBzdGFuZGJ5IG1vZGUgYnkgZGVmYXVsdCAqLwogCXdtMjAwMF9hbmNfc2V0X21vZGUod20yMDAwKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTIyMDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd20yMjAwLmMKaW5kZXggNTdiYTMxNS4uMmU3MjFlMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTIyMDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtMjIwMC5jCkBAIC0xMTEzLDExICsxMTEzLDEwIEBACiAJIk5vbmUiLCAiSU4xIiwgIklOMiIsICJJTjMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTIyMDBfcnhhbmNfaW5wdXRfc2VsID0KLQlTT0NfRU5VTV9TSU5HTEUoV00yMjAwX1JYQU5DX1NSQywKLQkJCVdNMjIwMF9JTl9SWEFOQ19TRUxfU0hJRlQsCi0JCQlBUlJBWV9TSVpFKHdtMjIwMF9yeGFuY19pbnB1dF9zZWxfdGV4dHMpLAotCQkJd20yMjAwX3J4YW5jX2lucHV0X3NlbF90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod20yMjAwX3J4YW5jX2lucHV0X3NlbCwKKwkJCSAgICBXTTIyMDBfUlhBTkNfU1JDLAorCQkJICAgIFdNMjIwMF9JTl9SWEFOQ19TRUxfU0hJRlQsCisJCQkgICAgd20yMjAwX3J4YW5jX2lucHV0X3NlbF90ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTIyMDBfc25kX2NvbnRyb2xzW10gPSB7CiBTT0NfU0lOR0xFKCJJTjEgSGlnaCBQZXJmb3JtYW5jZSBTd2l0Y2giLCBXTTIyMDBfSU4xTF9DT05UUk9MLApAQCAtMTI4OCwxMSArMTI4NywxMCBAQAogCSJPVVQxTCIsICJPVVQxUiIsICJPVVQyTCIsICJPVVQyUiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtMjIwMF9hZWNfbG9vcGJhY2sgPQotCVNPQ19FTlVNX1NJTkdMRShXTTIyMDBfREFDX0FFQ19DT05UUk9MXzEsCi0JCQlXTTIyMDBfQUVDX0xPT1BCQUNLX1NSQ19TSElGVCwKLQkJCUFSUkFZX1NJWkUod20yMjAwX2FlY19sb29wYmFja190ZXh0cyksCi0JCQl3bTIyMDBfYWVjX2xvb3BiYWNrX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTIyMDBfYWVjX2xvb3BiYWNrLAorCQkJICAgIFdNMjIwMF9EQUNfQUVDX0NPTlRST0xfMSwKKwkJCSAgICBXTTIyMDBfQUVDX0xPT1BCQUNLX1NSQ19TSElGVCwKKwkJCSAgICB3bTIyMDBfYWVjX2xvb3BiYWNrX3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtMjIwMF9hZWNfbG9vcGJhY2tfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBRUMgTG9vcGJhY2siLCB3bTIyMDBfYWVjX2xvb3BiYWNrKTsKQEAgLTE1NTYsMTUgKzE1NTQsOCBAQAogCWludCByZXQ7CiAKIAl3bTIyMDAtPmNvZGVjID0gY29kZWM7Ci0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtMjIwMC0+cmVnbWFwOwogCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfT0ZGOwogCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDE2LCAxNiwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIHdtX2Fkc3AxX2Z3X2NvbnRyb2xzLCAyKTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTUxMDAuYwppbmRleCA0ZTNlMzFhLi5lY2E5ODNmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAwLmMKQEAgLTUwNiwyMSArNTA2LDIxIEBACiAJIkxvdy1wYXNzIiwgIkhpZ2gtcGFzcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd201MTAwX2xocGYxX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTUxMDBfSFBMUEYxXzEsIFdNNTEwMF9MSFBGMV9NT0RFX1NISUZULCAyLAotCQkJd201MTAwX2xocGZfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTUxMDBfbGhwZjFfbW9kZSwKKwkJCSAgICBXTTUxMDBfSFBMUEYxXzEsIFdNNTEwMF9MSFBGMV9NT0RFX1NISUZULAorCQkJICAgIHdtNTEwMF9saHBmX21vZGVfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd201MTAwX2xocGYyX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTUxMDBfSFBMUEYyXzEsIFdNNTEwMF9MSFBGMl9NT0RFX1NISUZULCAyLAotCQkJd201MTAwX2xocGZfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTUxMDBfbGhwZjJfbW9kZSwKKwkJCSAgICBXTTUxMDBfSFBMUEYyXzEsIFdNNTEwMF9MSFBGMl9NT0RFX1NISUZULAorCQkJICAgIHdtNTEwMF9saHBmX21vZGVfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd201MTAwX2xocGYzX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTUxMDBfSFBMUEYzXzEsIFdNNTEwMF9MSFBGM19NT0RFX1NISUZULCAyLAotCQkJd201MTAwX2xocGZfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTUxMDBfbGhwZjNfbW9kZSwKKwkJCSAgICBXTTUxMDBfSFBMUEYzXzEsIFdNNTEwMF9MSFBGM19NT0RFX1NISUZULAorCQkJICAgIHdtNTEwMF9saHBmX21vZGVfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd201MTAwX2xocGY0X21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTUxMDBfSFBMUEY0XzEsIFdNNTEwMF9MSFBGNF9NT0RFX1NISUZULCAyLAotCQkJd201MTAwX2xocGZfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTUxMDBfbGhwZjRfbW9kZSwKKwkJCSAgICBXTTUxMDBfSFBMUEY0XzEsIFdNNTEwMF9MSFBGNF9NT0RFX1NISUZULAorCQkJICAgIHdtNTEwMF9saHBmX21vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTUxMDBfc25kX2NvbnRyb2xzW10gPSB7CiBTT0NfU0lOR0xFKCJJTjEgSGlnaCBQZXJmb3JtYW5jZSBTd2l0Y2giLCBXTTUxMDBfSU4xTF9DT05UUk9MLApAQCAtMjEwMCw2ICsyMTAwLDcgQEAKIGludCB3bTUxMDBfZGV0ZWN0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgc3RydWN0IHNuZF9zb2NfamFjayAqamFjaykKIHsKIAlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAogCWlmIChqYWNrKSB7CiAJCXdtNTEwMC0+amFjayA9IGphY2s7CkBAIC0yMTE3LDkgKzIxMTgsMTQgQEAKIAkJCQkgICAgV001MTAwX0FDQ0RFVF9SQVRFX01BU0spOwogCiAJCS8qIFdlIG5lZWQgdGhlIGNoYXJnZSBwdW1wIHRvIHBvd2VyIE1JQ0JJQVMgKi8KLQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiQ1AyIik7Ci0JCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIlNZU0NMSyIpOwotCQlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOworCQlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKKworCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiQ1AyIik7CisJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJTWVNDTEsiKTsKKworCQlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCQlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogCiAJCS8qIFdlIHN0YXJ0IG9mZiBqdXN0IGVuYWJsaW5nIG1pY3JvcGhvbmUgZGV0ZWN0aW9uIC0gZXZlbiBhCiAJCSAqIHBsYWluIGhlYWRwaG9uZSB3aWxsIHRyaWdnZXIgZGV0ZWN0aW9uLgpAQCAtMjMzNywxMyArMjM0Myw2IEBACiAJaW50IHJldCwgaTsKIAogCXdtNTEwMC0+Y29kZWMgPSBjb2RlYzsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd201MTAwLT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMTYsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTUxMDBfZGlnX3Z1KTsgaSsrKQogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB3bTUxMDBfZGlnX3Z1W2ldLCBXTTUxMDBfT1VUX1ZVLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTUxMDIuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAyLmMKaW5kZXggY2U5YzhlMS4uZGNmMWQxMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTUxMDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMi5jCkBAIC01ODIsNyArNTgyLDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKIAlzdHJ1Y3QgYXJpem9uYSAqYXJpem9uYSA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gYXJpem9uYS0+cmVnbWFwOwogCWNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcGF0Y2ggPSBOVUxMOwogCWludCBpLCBwYXRjaF9zaXplOwogCkBAIC02MjIsMTMgKzYyMiwxNiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtNTEwMl9ocG91dF9vc3JbXSA9IHsKIAlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQVJJWk9OQV9PVVRQVVRfUEFUSF9DT05GSUdfMUwsCi0JCQkgICAgICBBUklaT05BX09VVDFfT1NSX1NISUZULCAweDcsIDMsCisJCQkgICAgICBBUklaT05BX09VVDFfT1NSX1NISUZULCAweDcsCisJCQkgICAgICBBUlJBWV9TSVpFKHdtNTEwMl9vc3JfdGV4dCksCiAJCQkgICAgICB3bTUxMDJfb3NyX3RleHQsIHdtNTEwMl9vc3JfdmFsKSwKIAlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQVJJWk9OQV9PVVRQVVRfUEFUSF9DT05GSUdfMkwsCi0JCQkgICAgICBBUklaT05BX09VVDJfT1NSX1NISUZULCAweDcsIDMsCisJCQkgICAgICBBUklaT05BX09VVDJfT1NSX1NISUZULCAweDcsCisJCQkgICAgICBBUlJBWV9TSVpFKHdtNTEwMl9vc3JfdGV4dCksCiAJCQkgICAgICB3bTUxMDJfb3NyX3RleHQsIHdtNTEwMl9vc3JfdmFsKSwKIAlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQVJJWk9OQV9PVVRQVVRfUEFUSF9DT05GSUdfM0wsCi0JCQkgICAgICBBUklaT05BX09VVDNfT1NSX1NISUZULCAweDcsIDMsCisJCQkgICAgICBBUklaT05BX09VVDNfT1NSX1NISUZULCAweDcsCisJCQkgICAgICBBUlJBWV9TSVpFKHdtNTEwMl9vc3JfdGV4dCksCiAJCQkgICAgICB3bTUxMDJfb3NyX3RleHQsIHdtNTEwMl9vc3JfdmFsKSwKIH07CiAKQEAgLTY4NSwxNSArNjg4LDggQEAKIEFSSVpPTkFfTUlYRVJfQ09OVFJPTFMoIkVRMyIsIEFSSVpPTkFfRVEzTUlYX0lOUFVUXzFfU09VUkNFKSwKIEFSSVpPTkFfTUlYRVJfQ09OVFJPTFMoIkVRNCIsIEFSSVpPTkFfRVE0TUlYX0lOUFVUXzFfU09VUkNFKSwKIAotU05EX1NPQ19CWVRFU19NQVNLKCJFUTEgQ29lZmZpY2llbnRzIiwgQVJJWk9OQV9FUTFfMSwgMjEsCi0JCSAgIEFSSVpPTkFfRVExX0VOQV9NQVNLKSwKLVNORF9TT0NfQllURVNfTUFTSygiRVEyIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVEyXzEsIDIxLAotCQkgICBBUklaT05BX0VRMl9FTkFfTUFTSyksCi1TTkRfU09DX0JZVEVTX01BU0soIkVRMyBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRM18xLCAyMSwKLQkJICAgQVJJWk9OQV9FUTNfRU5BX01BU0spLAotU05EX1NPQ19CWVRFU19NQVNLKCJFUTQgQ29lZmZpY2llbnRzIiwgQVJJWk9OQV9FUTRfMSwgMjEsCi0JCSAgIEFSSVpPTkFfRVE0X0VOQV9NQVNLKSwKLQorU05EX1NPQ19CWVRFUygiRVExIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVExXzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRMSBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVExXzIsIEFSSVpPTkFfRVExX0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRMSBCMSBWb2x1bWUiLCBBUklaT05BX0VRMV8xLCBBUklaT05BX0VRMV9CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTEgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTFfMSwgQVJJWk9OQV9FUTFfQjJfR0FJTl9TSElGVCwKQEAgLTcwNSw2ICs3MDEsOCBAQAogU09DX1NJTkdMRV9UTFYoIkVRMSBCNSBWb2x1bWUiLCBBUklaT05BX0VRMV8yLCBBUklaT05BX0VRMV9CNV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIAorU05EX1NPQ19CWVRFUygiRVEyIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVEyXzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRMiBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVEyXzIsIEFSSVpPTkFfRVEyX0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRMiBCMSBWb2x1bWUiLCBBUklaT05BX0VRMl8xLCBBUklaT05BX0VRMl9CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTIgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTJfMSwgQVJJWk9OQV9FUTJfQjJfR0FJTl9TSElGVCwKQEAgLTcxNiw2ICs3MTQsOCBAQAogU09DX1NJTkdMRV9UTFYoIkVRMiBCNSBWb2x1bWUiLCBBUklaT05BX0VRMl8yLCBBUklaT05BX0VRMl9CNV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIAorU05EX1NPQ19CWVRFUygiRVEzIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVEzXzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRMyBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVEzXzIsIEFSSVpPTkFfRVEzX0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRMyBCMSBWb2x1bWUiLCBBUklaT05BX0VRM18xLCBBUklaT05BX0VRM19CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTMgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTNfMSwgQVJJWk9OQV9FUTNfQjJfR0FJTl9TSElGVCwKQEAgLTcyNyw2ICs3MjcsOCBAQAogU09DX1NJTkdMRV9UTFYoIkVRMyBCNSBWb2x1bWUiLCBBUklaT05BX0VRM18yLCBBUklaT05BX0VRM19CNV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIAorU05EX1NPQ19CWVRFUygiRVE0IENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVE0XzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRNCBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVE0XzIsIEFSSVpPTkFfRVE0X0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRNCBCMSBWb2x1bWUiLCBBUklaT05BX0VRNF8xLCBBUklaT05BX0VRNF9CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTQgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTRfMSwgQVJJWk9OQV9FUTRfQjJfR0FJTl9TSElGVCwKQEAgLTE3NTgsOSArMTc2MCw3IEBACiAJc3RydWN0IHdtNTEwMl9wcml2ICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBwcml2LT5jb3JlLmFyaXpvbmEtPnJlZ21hcDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAzMiwgMTYsIFNORF9TT0NfUkVHTUFQKTsKKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgcHJpdi0+Y29yZS5hcml6b25hLT5yZWdtYXApOwogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTUxMTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTEwLmMKaW5kZXggMmMzYzk2Mi4uZGY1YTM4ZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTUxMTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtNTExMC5jCkBAIC0xMzYsNyArMTM2LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKIAlzdHJ1Y3QgYXJpem9uYSAqYXJpem9uYSA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gYXJpem9uYS0+cmVnbWFwOwogCWNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcGF0Y2ggPSBOVUxMOwogCWludCBpLCBwYXRjaF9zaXplOwogCkBAIC0yNDcsMTUgKzI0Nyw4IEBACiBBUklaT05BX01JWEVSX0NPTlRST0xTKCJFUTMiLCBBUklaT05BX0VRM01JWF9JTlBVVF8xX1NPVVJDRSksCiBBUklaT05BX01JWEVSX0NPTlRST0xTKCJFUTQiLCBBUklaT05BX0VRNE1JWF9JTlBVVF8xX1NPVVJDRSksCiAKLVNORF9TT0NfQllURVNfTUFTSygiRVExIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVExXzEsIDIxLAotCQkgICBBUklaT05BX0VRMV9FTkFfTUFTSyksCi1TTkRfU09DX0JZVEVTX01BU0soIkVRMiBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRMl8xLCAyMSwKLQkJICAgQVJJWk9OQV9FUTJfRU5BX01BU0spLAotU05EX1NPQ19CWVRFU19NQVNLKCJFUTMgQ29lZmZpY2llbnRzIiwgQVJJWk9OQV9FUTNfMSwgMjEsCi0JCSAgIEFSSVpPTkFfRVEzX0VOQV9NQVNLKSwKLVNORF9TT0NfQllURVNfTUFTSygiRVE0IENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVE0XzEsIDIxLAotCQkgICBBUklaT05BX0VRNF9FTkFfTUFTSyksCi0KK1NORF9TT0NfQllURVMoIkVRMSBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRMV8zLCAxOSksCitTT0NfU0lOR0xFKCJFUTEgTW9kZSBTd2l0Y2giLCBBUklaT05BX0VRMV8yLCBBUklaT05BX0VRMV9CMV9NT0RFLCAxLCAwKSwKIFNPQ19TSU5HTEVfVExWKCJFUTEgQjEgVm9sdW1lIiwgQVJJWk9OQV9FUTFfMSwgQVJJWk9OQV9FUTFfQjFfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiBTT0NfU0lOR0xFX1RMVigiRVExIEIyIFZvbHVtZSIsIEFSSVpPTkFfRVExXzEsIEFSSVpPTkFfRVExX0IyX0dBSU5fU0hJRlQsCkBAIC0yNjcsNiArMjYwLDggQEAKIFNPQ19TSU5HTEVfVExWKCJFUTEgQjUgVm9sdW1lIiwgQVJJWk9OQV9FUTFfMiwgQVJJWk9OQV9FUTFfQjVfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiAKK1NORF9TT0NfQllURVMoIkVRMiBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRMl8zLCAxOSksCitTT0NfU0lOR0xFKCJFUTIgTW9kZSBTd2l0Y2giLCBBUklaT05BX0VRMl8yLCBBUklaT05BX0VRMl9CMV9NT0RFLCAxLCAwKSwKIFNPQ19TSU5HTEVfVExWKCJFUTIgQjEgVm9sdW1lIiwgQVJJWk9OQV9FUTJfMSwgQVJJWk9OQV9FUTJfQjFfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiBTT0NfU0lOR0xFX1RMVigiRVEyIEIyIFZvbHVtZSIsIEFSSVpPTkFfRVEyXzEsIEFSSVpPTkFfRVEyX0IyX0dBSU5fU0hJRlQsCkBAIC0yNzgsNiArMjczLDggQEAKIFNPQ19TSU5HTEVfVExWKCJFUTIgQjUgVm9sdW1lIiwgQVJJWk9OQV9FUTJfMiwgQVJJWk9OQV9FUTJfQjVfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiAKK1NORF9TT0NfQllURVMoIkVRMyBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRM18zLCAxOSksCitTT0NfU0lOR0xFKCJFUTMgTW9kZSBTd2l0Y2giLCBBUklaT05BX0VRM18yLCBBUklaT05BX0VRM19CMV9NT0RFLCAxLCAwKSwKIFNPQ19TSU5HTEVfVExWKCJFUTMgQjEgVm9sdW1lIiwgQVJJWk9OQV9FUTNfMSwgQVJJWk9OQV9FUTNfQjFfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiBTT0NfU0lOR0xFX1RMVigiRVEzIEIyIFZvbHVtZSIsIEFSSVpPTkFfRVEzXzEsIEFSSVpPTkFfRVEzX0IyX0dBSU5fU0hJRlQsCkBAIC0yODksNiArMjg2LDggQEAKIFNPQ19TSU5HTEVfVExWKCJFUTMgQjUgVm9sdW1lIiwgQVJJWk9OQV9FUTNfMiwgQVJJWk9OQV9FUTNfQjVfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiAKK1NORF9TT0NfQllURVMoIkVRNCBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRNF8zLCAxOSksCitTT0NfU0lOR0xFKCJFUTQgTW9kZSBTd2l0Y2giLCBBUklaT05BX0VRNF8yLCBBUklaT05BX0VRNF9CMV9NT0RFLCAxLCAwKSwKIFNPQ19TSU5HTEVfVExWKCJFUTQgQjEgVm9sdW1lIiwgQVJJWk9OQV9FUTRfMSwgQVJJWk9OQV9FUTRfQjFfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiBTT0NfU0lOR0xFX1RMVigiRVE0IEIyIFZvbHVtZSIsIEFSSVpPTkFfRVE0XzEsIEFSSVpPTkFfRVE0X0IyX0dBSU5fU0hJRlQsCkBAIC0xNTg4LDEwICsxNTg3LDkgQEAKIAlzdHJ1Y3Qgd201MTEwX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgcmV0OwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHByaXYtPmNvcmUuYXJpem9uYS0+cmVnbWFwOwogCXByaXYtPmNvcmUuYXJpem9uYS0+ZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAzMiwgMTYsIFNORF9TT0NfUkVHTUFQKTsKKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgcHJpdi0+Y29yZS5hcml6b25hLT5yZWdtYXApOwogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204MzUwLmMKaW5kZXggYTE4M2RjZi4uNzU3MjU2YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODM1MC5jCkBAIC0xNTA1LDkgKzE1MDUsNyBAQAogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSB3bTgzNTAtPnJlZ21hcDsKLQotCXNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19SRUdNQVApOworCXNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCB3bTgzNTAtPnJlZ21hcCk7CiAKIAkvKiBQdXQgdGhlIGNvZGVjIGludG8gcmVzZXQgaWYgaXQgd2Fzbid0IGFscmVhZHkgKi8KIAl3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9QT1dFUl9NR01UXzUsIFdNODM1MF9DT0RFQ19FTkEpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg0MDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NDAwLmMKaW5kZXggNmQ2ODRkOS4uMTQ2NTY0ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg0MDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODQwMC5jCkBAIC0xMzE2LDEwICsxMzE2LDkgQEAKIAogCXNuZF9zb2NfY29kZWNfc2V0X2RydmRhdGEoY29kZWMsIHByaXYpOwogCXByaXYtPndtODQwMCA9IHdtODQwMDsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204NDAwLT5yZWdtYXA7CiAJcHJpdi0+Y29kZWMgPSBjb2RlYzsKIAotCXNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19SRUdNQVApOworCXNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCB3bTg0MDAtPnJlZ21hcCk7CiAKIAlyZXQgPSBkZXZtX3JlZ3VsYXRvcl9idWxrX2dldCh3bTg0MDAtPmRldiwKIAkJCQkgQVJSQVlfU0laRShwb3dlciksICZwb3dlclswXSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODUxMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg1MTAuYwppbmRleCA3ZGY3ZDQ1Li4xYzFlMzI4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODUxMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTEwLmMKQEAgLTU4OSwyMCArNTg5LDEyIEBACiAKIHN0YXRpYyBpbnQgd204NTEwX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIndtODUxMDogZmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXdtODUxMF9yZXNldChjb2RlYyk7CiAKIAkvKiBwb3dlciBvbiBkZXZpY2UgKi8KIAl3bTg1MTBfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qIHBvd2VyIGRvd24gY2hpcCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg1MjMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTIzLmMKaW5kZXggNzRkMTA2ZC4uNjAxZWU4MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg1MjMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODUyMy5jCkBAIC03NSw4ICs3NSw4IEBACiAJIjIwNDgiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg1MjNfemNfY291bnQgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg1MjNfWkVST19ERVRFQ1QsIDAsIDIsIHdtODUyM196ZF9jb3VudF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg1MjNfemNfY291bnQsIFdNODUyM19aRVJPX0RFVEVDVCwgMCwKKwkJCSAgICB3bTg1MjNfemRfY291bnRfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg1MjNfY29udHJvbHNbXSA9IHsKIFNPQ19ET1VCTEVfUl9UTFYoIlBsYXliYWNrIFZvbHVtZSIsIFdNODUyM19EQUNfR0FJTkwsIFdNODUyM19EQUNfR0FJTlIsCkBAIC0zOTIsMTggKzM5MiwxMSBAQAogc3RhdGljIGludCB3bTg1MjNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB3bTg1MjNfcHJpdiAqd204NTIzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IHJldDsKIAogCXdtODUyMy0+cmF0ZV9jb25zdHJhaW50Lmxpc3QgPSAmd204NTIzLT5yYXRlX2NvbnN0cmFpbnRfbGlzdFswXTsKIAl3bTg1MjMtPnJhdGVfY29uc3RyYWludC5jb3VudCA9CiAJCUFSUkFZX1NJWkUod204NTIzLT5yYXRlX2NvbnN0cmFpbnRfbGlzdCk7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIENoYW5nZSBzb21lIGRlZmF1bHQgc2V0dGluZ3MgLSBsYXRjaCBWVSBhbmQgZW5hYmxlIFpDICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NTIzX0RBQ19HQUlOUiwKIAkJCSAgICBXTTg1MjNfREFDUl9WVSwgV004NTIzX0RBQ1JfVlUpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg1ODAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTgwLmMKaW5kZXggMzE4OTg5YS4uYWY3ZWQ4YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg1ODAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODU4MC5jCkBAIC01MDQsOCArNTA0LDcgQEAKIAkJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJCQkJIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJc3RydWN0IHdtODU4MF9wcml2ICp3bTg1ODAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAl1MTYgcGFpZmEgPSAwOwogCXUxNiBwYWlmYiA9IDA7CkBAIC04NjksMTIgKzg2OCw2IEBACiAJc3RydWN0IHdtODU4MF9wcml2ICp3bTg1ODAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgcmV0ID0gMDsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKHdtODU4MC0+c3VwcGxpZXMpLAogCQkJCSAgICB3bTg1ODAtPnN1cHBsaWVzKTsKIAlpZiAocmV0ICE9IDApIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzExLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODcxMS5jCmluZGV4IGQ5OWY5NDguLmIwZmJjYjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzExLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MTEuYwpAQCAtMjAxLDcgKzIwMSw3IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKIAogCS8qIGRlYWN0aXZhdGUgKi8KLQlpZiAoIWNvZGVjLT5hY3RpdmUpIHsKKwlpZiAoIXNuZF9zb2NfY29kZWNfaXNfYWN0aXZlKGNvZGVjKSkgewogCQl1ZGVsYXkoNTApOwogCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg3MTFfQUNUSVZFLCAweDApOwogCX0KQEAgLTM2NywxMiArMzY3LDYgQEAKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcmV0ID0gd204NzExX3Jlc2V0KGNvZGVjKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gaXNzdWUgcmVzZXRcbiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MjguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzI4LmMKaW5kZXggY2Q4OTAzMy4uYmFjN2ZjMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3MjguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODcyOC5jCkBAIC0yMjgsMTkgKzIyOCwxMCBAQAogCiBzdGF0aWMgaW50IHdtODcyOF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ3bTg3Mjg6IGZhaWxlZCB0byBjb25maWd1cmUgY2FjaGUgSS9POiAlZFxuIiwKLQkJICAgICAgIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogcG93ZXIgb24gZGV2aWNlICovCiAJd204NzI4X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHdtODcyOF9yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMKaW5kZXggMDI5NzIwMy4uZDc0ZjQzOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODczMS5jCkBAIC04Myw4ICs4Myw4IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg3MzFfaW5wdXRfc2VsZWN0W10gPSB7IkxpbmUgSW4iLCAiTWljIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204NzMxX2luc2VsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg3MzFfQVBBTkEsIDIsIDIsIHdtODczMV9pbnB1dF9zZWxlY3QpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHdtODczMV9pbnNlbF9lbnVtLAorCQkJICAgIFdNODczMV9BUEFOQSwgMiwgd204NzMxX2lucHV0X3NlbGVjdCk7CiAKIHN0YXRpYyBpbnQgd204NzMxX2RlZW1waFtdID0geyAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH07CiAKQEAgLTU4MywxMyArNTgzLDYgQEAKIAlzdHJ1Y3Qgd204NzMxX3ByaXYgKndtODczMSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCByZXQgPSAwLCBpOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODczMS0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODczMS0+c3VwcGxpZXMpOyBpKyspCiAJCXdtODczMS0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gd204NzMxX3N1cHBseV9uYW1lc1tpXTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MzcuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzM3LmMKaW5kZXggMmYxNjdhOC4uYjI3ZjI2Y2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzM3LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MzcuYwpAQCAtOTksMjkgKzk5LDI5IEBACiAJIjEwMCUiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtaWNiaWFzX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfTUlDX1BSRUFNUF9DT05UUk9MLCAwLCA0LCBtaWNiaWFzX2VudW1fdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWljYmlhc19lbnVtLAorCQkJICAgIFdNODczN19NSUNfUFJFQU1QX0NPTlRST0wsIDAsIG1pY2JpYXNfZW51bV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmxvd19jdXRvZmZfdGV4dFtdID0gewogCSJMb3ciLCAiSGlnaCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbG93XzNkID0KLQlTT0NfRU5VTV9TSU5HTEUoV004NzM3XzNEX0VOSEFOQ0UsIDYsIDIsIGxvd19jdXRvZmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobG93XzNkLAorCQkJICAgIFdNODczN18zRF9FTkhBTkNFLCA2LCBsb3dfY3V0b2ZmX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqaGlnaF9jdXRvZmZfdGV4dFtdID0gewogCSJIaWdoIiwgIkxvdyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaGlnaF8zZCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODczN18zRF9FTkhBTkNFLCA1LCAyLCBoaWdoX2N1dG9mZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChoaWdoXzNkLAorCQkJICAgIFdNODczN18zRF9FTkhBTkNFLCA1LCBoaWdoX2N1dG9mZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFsY19mbl90ZXh0W10gPSB7CiAJIkRpc2FibGVkIiwgIlJpZ2h0IiwgIkxlZnQiLCAiU3RlcmVvIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGNfZm4gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfQUxDMSwgNywgNCwgYWxjX2ZuX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsY19mbiwKKwkJCSAgICBXTTg3MzdfQUxDMSwgNywgYWxjX2ZuX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWxjX2hvbGRfdGV4dFtdID0gewogCSIwIiwgIjIuNjdtcyIsICI1LjMzbXMiLCAiMTAuNjZtcyIsICIyMS4zMm1zIiwgIjQyLjY0bXMiLCAiODUuMjhtcyIsCkBAIC0xMjksMjQgKzEyOSwyNCBAQAogCSIxMC45MTZzIiwgIjIxLjgzMnMiLCAiNDMuNjkxcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWxjX2hvbGQgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfQUxDMiwgMCwgMTYsIGFsY19ob2xkX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsY19ob2xkLAorCQkJICAgIFdNODczN19BTEMyLCAwLCBhbGNfaG9sZF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFsY19hdGtfdGV4dFtdID0gewogCSI4LjRtcyIsICIxNi44bXMiLCAiMzMuNm1zIiwgIjY3LjJtcyIsICIxMzQuNG1zIiwgIjI2OC44bXMiLCAiNTM3LjZtcyIsCiAJIjEuMDc1cyIsICIyLjE1cyIsICI0LjNzIiwgIjguNnMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsY19hdGsgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfQUxDMywgMCwgMTEsIGFsY19hdGtfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX2F0aywKKwkJCSAgICBXTTg3MzdfQUxDMywgMCwgYWxjX2F0a190ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFsY19kY3lfdGV4dFtdID0gewogCSIzMy42bXMiLCAiNjcuMm1zIiwgIjEzNC40bXMiLCAiMjY4LjhtcyIsICI1MzcuNm1zIiwgIjEuMDc1cyIsICIyLjE1cyIsCiAJIjQuM3MiLCAiOC42cyIsICIxNy4ycyIsICIzNC40MXMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsY19kY3kgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfQUxDMywgNCwgMTEsIGFsY19kY3lfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX2RjeSwKKwkJCSAgICBXTTg3MzdfQUxDMywgNCwgYWxjX2RjeV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODczN19zbmRfY29udHJvbHNbXSA9IHsKIFNPQ19ET1VCTEVfUl9UTFYoIk1pYyBCb29zdCBWb2x1bWUiLCBXTTg3MzdfQVVESU9fUEFUSF9MLCBXTTg3MzdfQVVESU9fUEFUSF9SLApAQCAtMTkxLDggKzE5MSw4IEBACiAJIkxJTlBVVDEiLCAiTElOUFVUMiIsICJMSU5QVVQzIiwgIkxJTlBVVDEgREMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsaW5zZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODczN19BVURJT19QQVRIX0wsIDcsIDQsIGxpbnNlbF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsaW5zZWxfZW51bSwKKwkJCSAgICBXTTg3MzdfQVVESU9fUEFUSF9MLCA3LCBsaW5zZWxfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsaW5zZWxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJMSU5TRUwiLCBsaW5zZWxfZW51bSk7CkBAIC0yMDIsOCArMjAyLDggQEAKIAkiUklOUFVUMSIsICJSSU5QVVQyIiwgIlJJTlBVVDMiLCAiUklOUFVUMSBEQyIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJpbnNlbF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004NzM3X0FVRElPX1BBVEhfUiwgNywgNCwgcmluc2VsX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJpbnNlbF9lbnVtLAorCQkJICAgIFdNODczN19BVURJT19QQVRIX1IsIDcsIHJpbnNlbF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJpbnNlbF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlJJTlNFTCIsIHJpbnNlbF9lbnVtKTsKQEAgLTIxMiwxNSArMjEyLDE1IEBACiAJIkRpcmVjdCIsICJQcmVhbXAiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGxieXBhc3NfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODczN19NSUNfUFJFQU1QX0NPTlRST0wsIDIsIDIsIGJ5cGFzc190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsYnlwYXNzX2VudW0sCisJCQkgICAgV004NzM3X01JQ19QUkVBTVBfQ09OVFJPTCwgMiwgYnlwYXNzX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGJ5cGFzc19tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxlZnQgQnlwYXNzIiwgbGJ5cGFzc19lbnVtKTsKIAogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJieXBhc3NfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODczN19NSUNfUFJFQU1QX0NPTlRST0wsIDMsIDIsIGJ5cGFzc190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChyYnlwYXNzX2VudW0sCisJCQkgICAgV004NzM3X01JQ19QUkVBTVBfQ09OVFJPTCwgMywgYnlwYXNzX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmJ5cGFzc19tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxlZnQgQnlwYXNzIiwgcmJ5cGFzc19lbnVtKTsKQEAgLTU3MCwxMiArNTcwLDYgQEAKIAlzdHJ1Y3Qgd204NzM3X3ByaXYgKndtODczNyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCByZXQ7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgNywgOSwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKEFSUkFZX1NJWkUod204NzM3LT5zdXBwbGllcyksCiAJCQkJICAgIHdtODczNy0+c3VwcGxpZXMpOwogCWlmIChyZXQgIT0gMCkgewpAQCAtNjQ0LDcgKzYzOCw3IEBACiAJLnZvbGF0aWxlX3JlZyA9IHdtODczN192b2xhdGlsZSwKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQogc3RhdGljIGludCB3bTg3MzdfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCiAJCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewpAQCAtNzU4LDcgKzc1Miw3IEBACiBzdGF0aWMgaW50IF9faW5pdCB3bTg3MzdfbW9kaW5pdCh2b2lkKQogewogCWludCByZXQ7Ci0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKIAlyZXQgPSBpMmNfYWRkX2RyaXZlcigmd204NzM3X2kyY19kcml2ZXIpOwogCWlmIChyZXQgIT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBXTTg3MzcgSTJDIGRyaXZlcjogJWRcbiIsCkBAIC03ODEsNyArNzc1LDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQogCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmd204NzM3X3NwaV9kcml2ZXIpOwogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKIAlpMmNfZGVsX2RyaXZlcigmd204NzM3X2kyY19kcml2ZXIpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc0MS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3NDEuYwppbmRleCAyODk1YzhkLi5iMzM1NDJhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc0MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzQxLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgc3VwcGxpZXNbV004NzQxX05VTV9TVVBQTElFU107CiAJdW5zaWduZWQgaW50IHN5c2NsazsKLQlzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgKnN5c2Nsa19jb25zdHJhaW50czsKKwljb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgKnN5c2Nsa19jb25zdHJhaW50czsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgd204NzQxX3JlZ19kZWZhdWx0c1tdID0gewpAQCAtMTIyLDc0ICsxMjIsNzQgQEAKIAl7IDYsIDc2OCB9LAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCByYXRlc18xMTI4OVtdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByYXRlc18xMTI4OVtdID0gewogCTQ0MTAwLCA4ODIzNSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTEyODkgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzExMjg5ID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMTEyODkpLAogCS5saXN0CT0gcmF0ZXNfMTEyODksCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzEyMjg4W10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzXzEyMjg4W10gPSB7CiAJMzIwMDAsIDQ4MDAwLCA5NjAwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTIyODggPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzEyMjg4ID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMTIyODgpLAogCS5saXN0CT0gcmF0ZXNfMTIyODgsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzE2Mzg0W10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzXzE2Mzg0W10gPSB7CiAJMzIwMDAsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzE2Mzg0ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c18xNjM4NCA9IHsKIAkuY291bnQJPSBBUlJBWV9TSVpFKHJhdGVzXzE2Mzg0KSwKIAkubGlzdAk9IHJhdGVzXzE2Mzg0LAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCByYXRlc18xNjkzNFtdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByYXRlc18xNjkzNFtdID0gewogCTQ0MTAwLCA4ODIzNSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTY5MzQgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzE2OTM0ID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMTY5MzQpLAogCS5saXN0CT0gcmF0ZXNfMTY5MzQsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzE4NDMyW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzXzE4NDMyW10gPSB7CiAJNDgwMDAsIDk2MDAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c18xODQzMiA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTg0MzIgPSB7CiAJLmNvdW50CT0gQVJSQVlfU0laRShyYXRlc18xODQzMiksCiAJLmxpc3QJPSByYXRlc18xODQzMiwKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZXNfMjI1NzlbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcmF0ZXNfMjI1NzlbXSA9IHsKIAk0NDEwMCwgODgyMzUsIDE3NjQwMDAKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMjI1NzkgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzIyNTc5ID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMjI1NzkpLAogCS5saXN0CT0gcmF0ZXNfMjI1NzksCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzI0NTc2W10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzXzI0NTc2W10gPSB7CiAJMzIwMDAsIDQ4MDAwLCA5NjAwMCwgMTkyMDAwCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzI0NTc2ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c18yNDU3NiA9IHsKIAkuY291bnQJPSBBUlJBWV9TSVpFKHJhdGVzXzI0NTc2KSwKIAkubGlzdAk9IHJhdGVzXzI0NTc2LAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCByYXRlc18zNjg2NFtdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByYXRlc18zNjg2NFtdID0gewogCTQ4MDAwLCA5NjAwMCwgMTkyMDAKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMzY4NjQgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzM2ODY0ID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMzY4NjQpLAogCS5saXN0CT0gcmF0ZXNfMzY4NjQsCiB9OwpAQCAtNDI5LDEyICs0MjksNiBAQAogCQlnb3RvIGVycl9nZXQ7CiAJfQogCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycl9lbmFibGU7Ci0JfQotCiAJcmV0ID0gd204NzQxX3Jlc2V0KGNvZGVjKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gaXNzdWUgcmVzZXRcbiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3NTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMKaW5kZXggNzg2MTZhNi4uMzM5OTBiNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3NTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5jCkBAIC03MDIsMTIgKzcwMiw2IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ3bTg3NTA6IGZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlyZXQgPSB3bTg3NTBfcmVzZXQoY29kZWMpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAid204NzUwOiBmYWlsZWQgdG8gcmVzZXQ6ICVkXG4iLCByZXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3NTMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUzLmMKaW5kZXggYmU4NWRhOS4uY2JiOGQ1NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3NTMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5jCkBAIC0yNTEsNyArMjUxLDcgQEAKIAlpZiAod204NzUzLT5kYWlfZnVuYyA9PSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoY29kZWMtPmFjdGl2ZSkKKwlpZiAoc25kX3NvY19jb2RlY19pc19hY3RpdmUoY29kZWMpKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJaW9jdGwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODc1M19JT0NUTCk7CkBAIC0xMzE0LDcgKzEzMTQsNyBAQAogCS8qIHRoZSBkaWdpdGFsIG11dGUgY292ZXJzIHRoZSBIaUZpIGFuZCBWb2ljZSBEQUMncyBvbiB0aGUgV004NzUzLgogCSAqIG1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGV5IGFyZSBub3QgYm90aCBhY3RpdmUgd2hlbiB3ZSBtdXRlICovCiAJaWYgKG11dGUgJiYgd204NzUzLT5kYWlfZnVuYyA9PSAxKSB7Ci0JCWlmICghY29kZWMtPmFjdGl2ZSkKKwkJaWYgKCFzbmRfc29jX2NvZGVjX2lzX2FjdGl2ZShjb2RlYykpCiAJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg3NTNfREFDLCBtdXRlX3JlZyB8IDB4OCk7CiAJfSBlbHNlIHsKIAkJaWYgKG11dGUpCkBAIC0xNDQwLDcgKzE0NDAsNiBAQAogc3RhdGljIGludCB3bTg3NTNfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJd204NzUzX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKLQljb2RlYy0+Y2FjaGVfc3luYyA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0NzEsMTMgKzE0NzAsNiBAQAogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmNvZGVjLT5kYXBtLmRlbGF5ZWRfd29yaywgd204NzUzX3dvcmspOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODc1My0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHdtODc1M19yZXNldChjb2RlYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0OiAlZFxuIiwgcmV0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzcwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc3MC5jCmluZGV4IDViY2UyMTAuLmM2MWFlYjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzcwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NzAuYwpAQCAtNTgwLDEyICs1ODAsNiBAQAogCXdtODc3MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXdtODc3MC0+Y29kZWMgPSBjb2RlYzsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKHdtODc3MC0+c3VwcGxpZXMpLAogCQkJCSAgICB3bTg3NzAtPnN1cHBsaWVzKTsKIAlpZiAocmV0KSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc3Ni5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3NzYuYwppbmRleCBlZjgyNDY3Li43MDk1MmNlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc3Ni5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204Nzc2LmMKQEAgLTQzMCwxMiArNDMwLDYgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHdtODc3Nl9yZXNldChjb2RlYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0OiAlZFxuIiwgcmV0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC5jCmluZGV4IDliYzgyMDYuLmVlNzZmMGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYwpAQCAtOTIsNyArOTIsNyBAQAogV004ODA0X1JFR1VMQVRPUl9FVkVOVCgxKQogCiBzdGF0aWMgY29uc3QgY2hhciAqdHhzcmNfdGV4dFtdID0geyAiUy9QRElGIFJYIiwgIkFJRiIgfTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodHhzcmMsIHR4c3JjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0eHNyYywgdHhzcmNfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg4MDRfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX0VOVU1fRVhUKCJJbnB1dCBTb3VyY2UiLCB0eHNyYywgdHhzcmNfZ2V0LCB0eHNyY19wdXQpLApAQCAtNTQ2LDE0ICs1NDYsNiBAQAogCiAJd204ODA0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204ODA0LT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgaS9vOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg4MDQtPnN1cHBsaWVzKTsgaSsrKQogCQl3bTg4MDQtPnN1cHBsaWVzW2ldLnN1cHBseSA9IHdtODgwNF9zdXBwbHlfbmFtZXNbaV07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMC5jCmluZGV4IDQzYzIyMDEuLmQwOWZkY2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDAuYwpAQCAtMTE3OCwxMyArMTE3OCw3IEBACiAKIHN0YXRpYyBpbnQgd204OTAwX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgcmV0ID0gMCwgcmVnOwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CisJaW50IHJlZzsKIAogCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19JRCk7CiAJaWYgKHJlZyAhPSAweDg5MDApIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMy5jCmluZGV4IGVlYmNiMWQuLmIwMDg0YTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDMuYwpAQCAtNDg5LDI4ICs0ODksMjggQEAKIAkiSGktZmkiLCAiVm9pY2UgMSIsICJWb2ljZSAyIiwgIlZvaWNlIDMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhwZl9tb2RlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FEQ19ESUdJVEFMXzAsIDUsIDQsIGhwZl9tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGhwZl9tb2RlLAorCQkJICAgIFdNODkwM19BRENfRElHSVRBTF8wLCA1LCBocGZfbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKm9zcl90ZXh0W10gPSB7CiAJIkxvdyBwb3dlciIsICJIaWdoIHBlcmZvcm1hbmNlIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNfb3NyID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FOQUxPR1VFX0FEQ18wLCAwLCAyLCBvc3JfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRjX29zciwKKwkJCSAgICBXTTg5MDNfQU5BTE9HVUVfQURDXzAsIDAsIG9zcl90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYWNfb3NyID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RBQ19ESUdJVEFMXzEsIDAsIDIsIG9zcl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYWNfb3NyLAorCQkJICAgIFdNODkwM19EQUNfRElHSVRBTF8xLCAwLCBvc3JfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkcmNfc2xvcGVfdGV4dFtdID0gewogCSIxIiwgIjEvMiIsICIxLzQiLCAiMS84IiwgIjEvMTYiLCAiMCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHJjX3Nsb3BlX3IwID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RSQ18yLCAzLCA2LCBkcmNfc2xvcGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX3Nsb3BlX3IwLAorCQkJICAgIFdNODkwM19EUkNfMiwgMywgZHJjX3Nsb3BlX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19zbG9wZV9yMSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19EUkNfMiwgMCwgNiwgZHJjX3Nsb3BlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19zbG9wZV9yMSwKKwkJCSAgICBXTTg5MDNfRFJDXzIsIDAsIGRyY19zbG9wZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19hdHRhY2tfdGV4dFtdID0gewogCSJpbnN0YW50YW5lb3VzIiwKQEAgLTUxOCwxMjUgKzUxOCwxMjUgQEAKIAkiNDYuNG1zIiwgIjkyLjhtcyIsICIxODUuNm1zIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfYXR0YWNrID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RSQ18xLCAxMiwgMTEsIGRyY19hdHRhY2tfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX2F0dGFjaywKKwkJCSAgICBXTTg5MDNfRFJDXzEsIDEyLCBkcmNfYXR0YWNrX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJjX2RlY2F5X3RleHRbXSA9IHsKIAkiMTg2bXMiLCAiMzcybXMiLCAiNzQzbXMiLCAiMS40OXMiLCAiMi45N3MiLCAiNS45NHMiLCAiMTEuODlzIiwKIAkiMjMuODdzIiwgIjQ3LjU2cyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHJjX2RlY2F5ID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RSQ18xLCA4LCA5LCBkcmNfZGVjYXlfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX2RlY2F5LAorCQkJICAgIFdNODkwM19EUkNfMSwgOCwgZHJjX2RlY2F5X3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJjX2ZmX2RlbGF5X3RleHRbXSA9IHsKIAkiNSBzYW1wbGVzIiwgIjkgc2FtcGxlcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHJjX2ZmX2RlbGF5ID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RSQ18wLCA1LCAyLCBkcmNfZmZfZGVsYXlfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX2ZmX2RlbGF5LAorCQkJICAgIFdNODkwM19EUkNfMCwgNSwgZHJjX2ZmX2RlbGF5X3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJjX3FyX2RlY2F5X3RleHRbXSA9IHsKIAkiMC43MjVtcyIsICIxLjQ1bXMiLCAiNS44bXMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19xcl9kZWNheSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19EUkNfMSwgNCwgMywgZHJjX3FyX2RlY2F5X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19xcl9kZWNheSwKKwkJCSAgICBXTTg5MDNfRFJDXzEsIDQsIGRyY19xcl9kZWNheV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19zbW9vdGhpbmdfdGV4dFtdID0gewogCSJMb3ciLCAiTWVkaXVtIiwgIkhpZ2giCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19zbW9vdGhpbmcgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfRFJDXzAsIDExLCAzLCBkcmNfc21vb3RoaW5nX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19zbW9vdGhpbmcsCisJCQkgICAgV004OTAzX0RSQ18wLCAxMSwgZHJjX3Ntb290aGluZ190ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnNvZnRfbXV0ZV90ZXh0W10gPSB7CiAJIkZhc3QgKGZzLzIpIiwgIlNsb3cgKGZzLzMyKSIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc29mdF9tdXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RBQ19ESUdJVEFMXzEsIDEwLCAyLCBzb2Z0X211dGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc29mdF9tdXRlLAorCQkJICAgIFdNODkwM19EQUNfRElHSVRBTF8xLCAxMCwgc29mdF9tdXRlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbXV0ZV9tb2RlX3RleHRbXSA9IHsKIAkiSGFyZCIsICJTb2Z0IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtdXRlX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfREFDX0RJR0lUQUxfMSwgOSwgMiwgbXV0ZV9tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG11dGVfbW9kZSwKKwkJCSAgICBXTTg5MDNfREFDX0RJR0lUQUxfMSwgOSwgbXV0ZV9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqY29tcGFuZGluZ190ZXh0W10gPSB7CiAJInVsYXciLCAiYWxhdyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjX2NvbXBhbmRpbmcgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfQVVESU9fSU5URVJGQUNFXzAsIDAsIDIsIGNvbXBhbmRpbmdfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGFjX2NvbXBhbmRpbmcsCisJCQkgICAgV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCAwLCBjb21wYW5kaW5nX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkY19jb21wYW5kaW5nID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCAyLCAyLCBjb21wYW5kaW5nX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkY19jb21wYW5kaW5nLAorCQkJICAgIFdNODkwM19BVURJT19JTlRFUkZBQ0VfMCwgMiwgY29tcGFuZGluZ190ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmlucHV0X21vZGVfdGV4dFtdID0gewogCSJTaW5nbGUtRW5kZWQiLCAiRGlmZmVyZW50aWFsIExpbmUiLCAiRGlmZmVyZW50aWFsIE1pYyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbGlucHV0X21vZGVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDAsIDMsIGlucHV0X21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobGlucHV0X21vZGVfZW51bSwKKwkJCSAgICBXTTg5MDNfQU5BTE9HVUVfTEVGVF9JTlBVVF8xLCAwLCBpbnB1dF9tb2RlX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJpbnB1dF9tb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfQU5BTE9HVUVfUklHSFRfSU5QVVRfMSwgMCwgMywgaW5wdXRfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChyaW5wdXRfbW9kZV9lbnVtLAorCQkJICAgIFdNODkwM19BTkFMT0dVRV9SSUdIVF9JTlBVVF8xLCAwLCBpbnB1dF9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbGlucHV0X211eF90ZXh0W10gPSB7CiAJIklOMUwiLCAiSU4yTCIsICJJTjNMIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsaW5wdXRfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDIsIDMsIGxpbnB1dF9tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobGlucHV0X2VudW0sCisJCQkgICAgV004OTAzX0FOQUxPR1VFX0xFRlRfSU5QVVRfMSwgMiwgbGlucHV0X211eF90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsaW5wdXRfaW52X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfQU5BTE9HVUVfTEVGVF9JTlBVVF8xLCA0LCAzLCBsaW5wdXRfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxpbnB1dF9pbnZfZW51bSwKKwkJCSAgICBXTTg5MDNfQU5BTE9HVUVfTEVGVF9JTlBVVF8xLCA0LCBsaW5wdXRfbXV4X3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqcmlucHV0X211eF90ZXh0W10gPSB7CiAJIklOMVIiLCAiSU4yUiIsICJJTjNSIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByaW5wdXRfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19BTkFMT0dVRV9SSUdIVF9JTlBVVF8xLCAyLCAzLCByaW5wdXRfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJpbnB1dF9lbnVtLAorCQkJICAgIFdNODkwM19BTkFMT0dVRV9SSUdIVF9JTlBVVF8xLCAyLCByaW5wdXRfbXV4X3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJpbnB1dF9pbnZfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19BTkFMT0dVRV9SSUdIVF9JTlBVVF8xLCA0LCAzLCByaW5wdXRfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJpbnB1dF9pbnZfZW51bSwKKwkJCSAgICBXTTg5MDNfQU5BTE9HVUVfUklHSFRfSU5QVVRfMSwgNCwgcmlucHV0X211eF90ZXh0KTsKIAogCiBzdGF0aWMgY29uc3QgY2hhciAqc2lkZXRvbmVfdGV4dFtdID0gewogCSJOb25lIiwgIkxlZnQiLCAiUmlnaHQiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGxzaWRldG9uZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RBQ19ESUdJVEFMXzAsIDIsIDMsIHNpZGV0b25lX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxzaWRldG9uZV9lbnVtLAorCQkJICAgIFdNODkwM19EQUNfRElHSVRBTF8wLCAyLCBzaWRldG9uZV90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByc2lkZXRvbmVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19EQUNfRElHSVRBTF8wLCAwLCAzLCBzaWRldG9uZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChyc2lkZXRvbmVfZW51bSwKKwkJCSAgICBXTTg5MDNfREFDX0RJR0lUQUxfMCwgMCwgc2lkZXRvbmVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphZGNpbnB1dF90ZXh0W10gPSB7CiAJIkFEQyIsICJETUlDIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNpbnB1dF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0NMT0NLX1JBVEVfVEVTVF80LCA5LCAyLCBhZGNpbnB1dF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGNpbnB1dF9lbnVtLAorCQkJICAgIFdNODkwM19DTE9DS19SQVRFX1RFU1RfNCwgOSwgYWRjaW5wdXRfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphaWZfdGV4dFtdID0gewogCSJMZWZ0IiwgIlJpZ2h0IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsY2FwdHVyZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCA3LCAyLCBhaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobGNhcHR1cmVfZW51bSwKKwkJCSAgICBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzAsIDcsIGFpZl90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByY2FwdHVyZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCA2LCAyLCBhaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocmNhcHR1cmVfZW51bSwKKwkJCSAgICBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzAsIDYsIGFpZl90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBscGxheV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCA1LCAyLCBhaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobHBsYXlfZW51bSwKKwkJCSAgICBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzAsIDUsIGFpZl90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBycGxheV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCA0LCAyLCBhaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnBsYXlfZW51bSwKKwkJCSAgICBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzAsIDQsIGFpZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODkwM19zbmRfY29udHJvbHNbXSA9IHsKIApAQCAtMTg5NywyMSArMTg5NywxMyBAQAogc3RhdGljIGludCB3bTg5MDNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB3bTg5MDNfcHJpdiAqd204OTAzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IHJldDsKIAogCXdtODkwMy0+Y29kZWMgPSBjb2RlYzsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204OTAzLT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KIAogCS8qIHBvd2VyIG9uIGRldmljZSAqLwogCXdtODkwM19zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogLyogcG93ZXIgZG93biBjaGlwICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwNC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDQuYwppbmRleCA1M2JiZmFjLi40OWMzNWMzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwNC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTA0LmMKQEAgLTU1MiwxOCArNTUyLDIwIEBACiAJIlNpbmdsZS1FbmRlZCIsICJEaWZmZXJlbnRpYWwgTGluZSIsICJEaWZmZXJlbnRpYWwgTWljIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsaW5fbW9kZSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDAsIDMsIGlucHV0X21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobGluX21vZGUsCisJCQkgICAgV004OTA0X0FOQUxPR1VFX0xFRlRfSU5QVVRfMSwgMCwKKwkJCSAgICBpbnB1dF9tb2RlX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJpbl9tb2RlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTA0X0FOQUxPR1VFX1JJR0hUX0lOUFVUXzEsIDAsIDMsIGlucHV0X21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocmluX21vZGUsCisJCQkgICAgV004OTA0X0FOQUxPR1VFX1JJR0hUX0lOUFVUXzEsIDAsCisJCQkgICAgaW5wdXRfbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmhwZl9tb2RlX3RleHRbXSA9IHsKIAkiSGktZmkiLCAiVm9pY2UgMSIsICJWb2ljZSAyIiwgIlZvaWNlIDMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhwZl9tb2RlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTA0X0FEQ19ESUdJVEFMXzAsIDUsIDQsIGhwZl9tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGhwZl9tb2RlLCBXTTg5MDRfQURDX0RJR0lUQUxfMCwgNSwKKwkJCSAgICBocGZfbW9kZV90ZXh0KTsKIAogc3RhdGljIGludCB3bTg5MDRfYWRjX29zcl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKQEAgLTYxMSw4ICs2MTMsNyBAQAogCSJBREMiLCAiREFDIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfcGF0aCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9EUkNfMCwgMTQsIDIsIGRyY19wYXRoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19wYXRoLCBXTTg5MDRfRFJDXzAsIDE0LCBkcmNfcGF0aF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODkwNF9kYWNfc25kX2NvbnRyb2xzW10gPSB7CiBTT0NfU0lOR0xFX1RMVigiRGlnaXRhbCBQbGF5YmFjayBCb29zdCBWb2x1bWUiLCAKQEAgLTg1OCwxNCArODU5LDE0IEBACiAJIklOMUwiLCAiSU4yTCIsICJJTjNMIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDIsIDMsIGxpbl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsaW5fZW51bSwgV004OTA0X0FOQUxPR1VFX0xFRlRfSU5QVVRfMSwgMiwKKwkJCSAgICBsaW5fdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsaW5fbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJMZWZ0IENhcHR1cmUgTXV4IiwgbGluX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGxpbl9pbnZfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDQsIDMsIGxpbl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsaW5faW52X2VudW0sIFdNODkwNF9BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDQsCisJCQkgICAgbGluX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGluX2ludl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxlZnQgQ2FwdHVyZSBJbnZldGluZyBNdXgiLCBsaW5faW52X2VudW0pOwpAQCAtODc0LDE0ICs4NzUsMTQgQEAKIAkiSU4xUiIsICJJTjJSIiwgIklOM1IiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTA0X0FOQUxPR1VFX1JJR0hUX0lOUFVUXzEsIDIsIDMsIHJpbl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChyaW5fZW51bSwgV004OTA0X0FOQUxPR1VFX1JJR0hUX0lOUFVUXzEsIDIsCisJCQkgICAgcmluX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmluX211eCA9CiAJU09DX0RBUE1fRU5VTSgiUmlnaHQgQ2FwdHVyZSBNdXgiLCByaW5fZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcmluX2ludl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTA0X0FOQUxPR1VFX1JJR0hUX0lOUFVUXzEsIDQsIDMsIHJpbl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChyaW5faW52X2VudW0sIFdNODkwNF9BTkFMT0dVRV9SSUdIVF9JTlBVVF8xLCA0LAorCQkJICAgIHJpbl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJpbl9pbnZfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJSaWdodCBDYXB0dXJlIEludmV0aW5nIE11eCIsIHJpbl9pbnZfZW51bSk7CkBAIC04OTAsMjYgKzg5MSwyNiBAQAogCSJMZWZ0IiwgIlJpZ2h0IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhaWZvdXRsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDRfQVVESU9fSU5URVJGQUNFXzAsIDcsIDIsIGFpZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWZvdXRsX2VudW0sIFdNODkwNF9BVURJT19JTlRFUkZBQ0VfMCwgNywKKwkJCSAgICBhaWZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWZvdXRsX211eCA9CiAJU09DX0RBUE1fRU5VTSgiQUlGT1VUTCBNdXgiLCBhaWZvdXRsX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFpZm91dHJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BVURJT19JTlRFUkZBQ0VfMCwgNiwgMiwgYWlmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFpZm91dHJfZW51bSwgV004OTA0X0FVRElPX0lOVEVSRkFDRV8wLCA2LAorCQkJICAgIGFpZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZm91dHJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBSUZPVVRSIE11eCIsIGFpZm91dHJfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWlmaW5sX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDRfQVVESU9fSU5URVJGQUNFXzAsIDUsIDIsIGFpZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWZpbmxfZW51bSwgV004OTA0X0FVRElPX0lOVEVSRkFDRV8wLCA1LAorCQkJICAgIGFpZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZmlubF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkFJRklOTCBNdXgiLCBhaWZpbmxfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWlmaW5yX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDRfQVVESU9fSU5URVJGQUNFXzAsIDQsIDIsIGFpZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWZpbnJfZW51bSwgV004OTA0X0FVRElPX0lOVEVSRkFDRV8wLCA0LAorCQkJICAgIGFpZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZmlucl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkFJRklOUiBNdXgiLCBhaWZpbnJfZW51bSk7CkBAIC05OTEsMjYgKzk5MiwyNiBAQAogCSJEQUMiLCAiQnlwYXNzIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBocGxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BTkFMT0dVRV9PVVQxMl9aQywgMywgMiwgb3V0X211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChocGxfZW51bSwgV004OTA0X0FOQUxPR1VFX09VVDEyX1pDLCAzLAorCQkJICAgIG91dF9tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBocGxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJIUEwgTXV4IiwgaHBsX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhwcl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTA0X0FOQUxPR1VFX09VVDEyX1pDLCAyLCAyLCBvdXRfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGhwcl9lbnVtLCBXTTg5MDRfQU5BTE9HVUVfT1VUMTJfWkMsIDIsCisJCQkgICAgb3V0X211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhwcl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkhQUiBNdXgiLCBocHJfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbGluZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BTkFMT0dVRV9PVVQxMl9aQywgMSwgMiwgb3V0X211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsaW5lbF9lbnVtLCBXTTg5MDRfQU5BTE9HVUVfT1VUMTJfWkMsIDEsCisJCQkgICAgb3V0X211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxpbmVsX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTElORUwgTXV4IiwgbGluZWxfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbGluZXJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BTkFMT0dVRV9PVVQxMl9aQywgMCwgMiwgb3V0X211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsaW5lcl9lbnVtLCBXTTg5MDRfQU5BTE9HVUVfT1VUMTJfWkMsIDAsCisJCQkgICAgb3V0X211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxpbmVyX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTElORVIgTXV4IiwgbGluZXJfZW51bSk7CkBAIC0xMDE5LDE0ICsxMDIwLDE0IEBACiAJIk5vbmUiLCAiTGVmdCIsICJSaWdodCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjbF9zaWRldG9uZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTA0X0RBQ19ESUdJVEFMXzAsIDIsIDMsIHNpZGV0b25lX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhY2xfc2lkZXRvbmVfZW51bSwgV004OTA0X0RBQ19ESUdJVEFMXzAsIDIsCisJCQkgICAgc2lkZXRvbmVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYWNsX3NpZGV0b25lX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTGVmdCBTaWRldG9uZSBNdXgiLCBkYWNsX3NpZGV0b25lX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY3Jfc2lkZXRvbmVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9EQUNfRElHSVRBTF8wLCAwLCAzLCBzaWRldG9uZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYWNyX3NpZGV0b25lX2VudW0sIFdNODkwNF9EQUNfRElHSVRBTF8wLCAwLAorCQkJICAgIHNpZGV0b25lX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGFjcl9zaWRldG9uZV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlJpZ2h0IFNpZGV0b25lIE11eCIsIGRhY3Jfc2lkZXRvbmVfZW51bSk7CkBAIC0xOTgxLDcgKzE5ODIsNyBAQAogCWRldl9kYmcoY29kZWMtPmRldiwgIkFsbG9jYXRlZCAlZCB1bmlxdWUgUmVUdW5lIE1vYmlsZSBuYW1lc1xuIiwKIAkJd204OTA0LT5udW1fcmV0dW5lX21vYmlsZV90ZXh0cyk7CiAKLQl3bTg5MDQtPnJldHVuZV9tb2JpbGVfZW51bS5tYXggPSB3bTg5MDQtPm51bV9yZXR1bmVfbW9iaWxlX3RleHRzOworCXdtODkwNC0+cmV0dW5lX21vYmlsZV9lbnVtLml0ZW1zID0gd204OTA0LT5udW1fcmV0dW5lX21vYmlsZV90ZXh0czsKIAl3bTg5MDQtPnJldHVuZV9tb2JpbGVfZW51bS50ZXh0cyA9IHdtODkwNC0+cmV0dW5lX21vYmlsZV90ZXh0czsKIAogCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCAmY29udHJvbCwgMSk7CkBAIC0yMDIyLDcgKzIwMjMsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9kcmNfY2ZnczsgaSsrKQogCQkJd204OTA0LT5kcmNfdGV4dHNbaV0gPSBwZGF0YS0+ZHJjX2NmZ3NbaV0ubmFtZTsKIAotCQl3bTg5MDQtPmRyY19lbnVtLm1heCA9IHBkYXRhLT5udW1fZHJjX2NmZ3M7CisJCXdtODkwNC0+ZHJjX2VudW0uaXRlbXMgPSBwZGF0YS0+bnVtX2RyY19jZmdzOwogCQl3bTg5MDQtPmRyY19lbnVtLnRleHRzID0gd204OTA0LT5kcmNfdGV4dHM7CiAKIAkJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsICZjb250cm9sLCAxKTsKQEAgLTIwNDcsOSArMjA0OCw2IEBACiBzdGF0aWMgaW50IHdtODkwNF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtODkwNF9wcml2ICp3bTg5MDQgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwotCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODkwNC0+cmVnbWFwOwogCiAJc3dpdGNoICh3bTg5MDQtPmRldnR5cGUpIHsKIAljYXNlIFdNODkwNDoKQEAgLTIwNjMsMTIgKzIwNjEsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXdtODkwNF9oYW5kbGVfcGRhdGEoY29kZWMpOwogCiAJd204OTA0X2FkZF93aWRnZXRzKGNvZGVjKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTQwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk0MC5jCmluZGV4IGI0MDRjMjYuLmZjNmVlYzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTQwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NDAuYwpAQCAtMTU0LDIyICsxNTQsMjIgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5NDBfY29tcGFuZGluZ1tdID0geyAiT2ZmIiwgIk5DIiwgInUtbGF3IiwgIkEtbGF3IiB9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5NDBfYWRjX2NvbXBhbmRpbmdfZW51bQotPSBTT0NfRU5VTV9TSU5HTEUoV004OTQwX0NPTVBBTkRJTkdDVEwsIDEsIDQsIHdtODk0MF9jb21wYW5kaW5nKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204OTQwX2RhY19jb21wYW5kaW5nX2VudW0KLT0gU09DX0VOVU1fU0lOR0xFKFdNODk0MF9DT01QQU5ESU5HQ1RMLCAzLCA0LCB3bTg5NDBfY29tcGFuZGluZyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod204OTQwX2FkY19jb21wYW5kaW5nX2VudW0sCisJCQkgICAgV004OTQwX0NPTVBBTkRJTkdDVEwsIDEsIHdtODk0MF9jb21wYW5kaW5nKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5NDBfZGFjX2NvbXBhbmRpbmdfZW51bSwKKwkJCSAgICBXTTg5NDBfQ09NUEFORElOR0NUTCwgMywgd204OTQwX2NvbXBhbmRpbmcpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqd204OTQwX2FsY19tb2RlX3RleHRbXSA9IHsiQUxDIiwgIkxpbWl0ZXIifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204OTQwX2FsY19tb2RlX2VudW0KLT0gU09DX0VOVU1fU0lOR0xFKFdNODk0MF9BTEMzLCA4LCAyLCB3bTg5NDBfYWxjX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod204OTQwX2FsY19tb2RlX2VudW0sCisJCQkgICAgV004OTQwX0FMQzMsIDgsIHdtODk0MF9hbGNfbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKndtODk0MF9taWNfYmlhc19sZXZlbF90ZXh0W10gPSB7IjAuOSIsICIwLjY1In07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk0MF9taWNfYmlhc19sZXZlbF9lbnVtCi09IFNPQ19FTlVNX1NJTkdMRShXTTg5NDBfSU5QVVRDVEwsIDgsIDIsIHdtODk0MF9taWNfYmlhc19sZXZlbF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5NDBfbWljX2JpYXNfbGV2ZWxfZW51bSwKKwkJCSAgICBXTTg5NDBfSU5QVVRDVEwsIDgsIHdtODk0MF9taWNfYmlhc19sZXZlbF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKndtODk0MF9maWx0ZXJfbW9kZV90ZXh0W10gPSB7IkF1ZGlvIiwgIkFwcGxpY2F0aW9uIn07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk0MF9maWx0ZXJfbW9kZV9lbnVtCi09IFNPQ19FTlVNX1NJTkdMRShXTTg5NDBfQURDLCA3LCAyLCB3bTg5NDBfZmlsdGVyX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod204OTQwX2ZpbHRlcl9tb2RlX2VudW0sCisJCQkgICAgV004OTQwX0FEQywgNywgd204OTQwX2ZpbHRlcl9tb2RlX3RleHQpOwogCiBzdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUod204OTQwX3Nwa192b2xfdGx2LCAtNTcwMCwgMTAwLCAxKTsKIHN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRSh3bTg5NDBfYXR0X3RsdiwgLTEwMDAsIDEwMDAsIDApOwpAQCAtNzEyLDEyICs3MTIsNiBAQAogCWludCByZXQ7CiAJdTE2IHJlZzsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlyZXQgPSB3bTg5NDBfcmVzZXQoY29kZWMpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBpc3N1ZSByZXNldFxuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk1NS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NTUuYwppbmRleCA4MmM4YmE5Li5mZWNkNGU0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk1NS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTU1LmMKQEAgLTQxNiwyMiArNDE2LDIxIEBACiAJIkxpbmVhciIsICJBZGFwdGl2ZSIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGJhc3NfbW9kZSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk1NV9CQVNTX0NPTlRST0wsIDcsIDIsIGJhc3NfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChiYXNzX21vZGUsIFdNODk1NV9CQVNTX0NPTlRST0wsIDcsIGJhc3NfbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmJhc3NfY3V0b2ZmX3RleHRbXSA9IHsKIAkiTG93IiwgIkhpZ2giCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGJhc3NfY3V0b2ZmID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTU1X0JBU1NfQ09OVFJPTCwgNiwgMiwgYmFzc19jdXRvZmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYmFzc19jdXRvZmYsIFdNODk1NV9CQVNTX0NPTlRST0wsIDYsCisJCQkgICAgYmFzc19jdXRvZmZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICp0cmVibGVfY3V0b2ZmX3RleHRbXSA9IHsKIAkiSGlnaCIsICJMb3ciCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHRyZWJsZV9jdXRvZmYgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5NTVfVFJFQkxFX0NPTlRST0wsIDYsIDIsIHRyZWJsZV9jdXRvZmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHJlYmxlX2N1dG9mZiwgV004OTU1X1RSRUJMRV9DT05UUk9MLCAyLAorCQkJICAgIHRyZWJsZV9jdXRvZmZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkaWdpdGFsX3RsdiwgLTEyNzUwLCA1MCwgMSk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYXR0ZW5fdGx2LCAtNjAwLCA2MDAsIDApOwpAQCAtODk2LDE0ICs4OTUsNiBAQAogCXN0cnVjdCB3bTg5NTVfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShjb2RlYy0+ZGV2KTsKIAlpbnQgcmV0LCBpOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODk1NS0+cmVnbWFwOwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODk1NS0+c3VwcGxpZXMpOyBpKyspCiAJCXdtODk1NS0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gd204OTU1X3N1cHBseV9uYW1lc1tpXTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NTgtZHNwMi5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NTgtZHNwMi5jCmluZGV4IGQ0MjQ4ZTAuLjdhYzJlNTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTU4LWRzcDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk1OC1kc3AyLmMKQEAgLTk0NCw3ICs5NDQsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9tYmNfY2ZnczsgaSsrKQogCQkJd204OTk0LT5tYmNfdGV4dHNbaV0gPSBwZGF0YS0+bWJjX2NmZ3NbaV0ubmFtZTsKIAotCQl3bTg5OTQtPm1iY19lbnVtLm1heCA9IHBkYXRhLT5udW1fbWJjX2NmZ3M7CisJCXdtODk5NC0+bWJjX2VudW0uaXRlbXMgPSBwZGF0YS0+bnVtX21iY19jZmdzOwogCQl3bTg5OTQtPm1iY19lbnVtLnRleHRzID0gd204OTk0LT5tYmNfdGV4dHM7CiAKIAkJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMod204OTk0LT5odWJzLmNvZGVjLApAQCAtOTczLDcgKzk3Myw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX3Zzc19jZmdzOyBpKyspCiAJCQl3bTg5OTQtPnZzc190ZXh0c1tpXSA9IHBkYXRhLT52c3NfY2Znc1tpXS5uYW1lOwogCi0JCXdtODk5NC0+dnNzX2VudW0ubWF4ID0gcGRhdGEtPm51bV92c3NfY2ZnczsKKwkJd204OTk0LT52c3NfZW51bS5pdGVtcyA9IHBkYXRhLT5udW1fdnNzX2NmZ3M7CiAJCXdtODk5NC0+dnNzX2VudW0udGV4dHMgPSB3bTg5OTQtPnZzc190ZXh0czsKIAogCQlyZXQgPSBzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyh3bTg5OTQtPmh1YnMuY29kZWMsCkBAIC0xMDAzLDcgKzEwMDMsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV92c3NfaHBmX2NmZ3M7IGkrKykKIAkJCXdtODk5NC0+dnNzX2hwZl90ZXh0c1tpXSA9IHBkYXRhLT52c3NfaHBmX2NmZ3NbaV0ubmFtZTsKIAotCQl3bTg5OTQtPnZzc19ocGZfZW51bS5tYXggPSBwZGF0YS0+bnVtX3Zzc19ocGZfY2ZnczsKKwkJd204OTk0LT52c3NfaHBmX2VudW0uaXRlbXMgPSBwZGF0YS0+bnVtX3Zzc19ocGZfY2ZnczsKIAkJd204OTk0LT52c3NfaHBmX2VudW0udGV4dHMgPSB3bTg5OTQtPnZzc19ocGZfdGV4dHM7CiAKIAkJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMod204OTk0LT5odWJzLmNvZGVjLApAQCAtMTAzNCw3ICsxMDM0LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fZW5oX2VxX2NmZ3M7IGkrKykKIAkJCXdtODk5NC0+ZW5oX2VxX3RleHRzW2ldID0gcGRhdGEtPmVuaF9lcV9jZmdzW2ldLm5hbWU7CiAKLQkJd204OTk0LT5lbmhfZXFfZW51bS5tYXggPSBwZGF0YS0+bnVtX2VuaF9lcV9jZmdzOworCQl3bTg5OTQtPmVuaF9lcV9lbnVtLml0ZW1zID0gcGRhdGEtPm51bV9lbmhfZXFfY2ZnczsKIAkJd204OTk0LT5lbmhfZXFfZW51bS50ZXh0cyA9IHdtODk5NC0+ZW5oX2VxX3RleHRzOwogCiAJCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKHdtODk5NC0+aHVicy5jb2RlYywKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2MC5jCmluZGV4IGYxNTYwMTAuLmQwNGU5Y2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjAuYwpAQCAtOTc2LDEyICs5NzYsNiBAQAogCQkJd204OTYwLT5zZXRfYmlhc19sZXZlbCA9IHdtODk2MF9zZXRfYmlhc19sZXZlbF9jYXBsZXNzOwogCX0KIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHdtODk2MF9yZXNldChjb2RlYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0XG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2MS5jCmluZGV4IDkwMDMyOGUuLjljODhmMDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjEuYwpAQCAtMzE3LDE1ICszMTcsMTUgQEAKIAkiSGktZmkiLCAiVm9pY2UgMSIsICJWb2ljZSAyIiwgIlZvaWNlIDMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNfaHBmID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTYxX0FEQ19EQUNfQ09OVFJPTF8yLCA3LCA0LCBhZGNfaHBmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkY19ocGYsCisJCQkgICAgV004OTYxX0FEQ19EQUNfQ09OVFJPTF8yLCA3LCBhZGNfaHBmX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZGFjX2RlZW1waF90ZXh0W10gPSB7CiAJIk5vbmUiLCAiMzJrSHoiLCAiNDQuMWtIeiIsICI0OGtIeiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19kZWVtcGggPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5NjFfQURDX0RBQ19DT05UUk9MXzEsIDEsIDQsIGRhY19kZWVtcGhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGFjX2RlZW1waCwKKwkJCSAgICBXTTg5NjFfQURDX0RBQ19DT05UUk9MXzEsIDEsIGRhY19kZWVtcGhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShvdXRfdGx2LCAtMTIxMDAsIDEwMCwgMSk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoaHBfc2VjX3RsdiwgLTcwMCwgMTAwLCAwKTsKQEAgLTM4NSwxMSArMzg1LDExIEBACiAJIk5vbmUiLCAiTGVmdCIsICJSaWdodCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjbF9zaWRldG9uZSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk2MV9EU1BfU0lERVRPTkVfMCwgMiwgMywgc2lkZXRvbmVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGFjbF9zaWRldG9uZSwKKwkJCSAgICBXTTg5NjFfRFNQX1NJREVUT05FXzAsIDIsIHNpZGV0b25lX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY3Jfc2lkZXRvbmUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5NjFfRFNQX1NJREVUT05FXzEsIDIsIDMsIHNpZGV0b25lX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhY3Jfc2lkZXRvbmUsCisJCQkgICAgV004OTYxX0RTUF9TSURFVE9ORV8xLCAyLCBzaWRldG9uZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhY2xfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJEQUNMIFNpZGV0b25lIiwgZGFjbF9zaWRldG9uZSk7CkBAIC04MzYsMTUgKzgzNiw4IEBACiBzdGF0aWMgaW50IHdtODk2MV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCWludCByZXQgPSAwOwogCXUxNiByZWc7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIEVuYWJsZSBjbGFzcyBXICovCiAJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NjFfQ0hBUkdFX1BVTVBfQik7CiAJcmVnIHw9IFdNODk2MV9DUF9EWU5fUFdSX01BU0s7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk2Mi5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjIuYwppbmRleCA5N2RiM2I0Li41NTIyZDI1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk2Mi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYyLmMKQEAgLTE0NzksNyArMTQ3OSw5IEBACiAKIHN0YXRpYyBpbnQgd204OTYyX2RzcDJfd3JpdGVfY29uZmlnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlyZXR1cm4gcmVnY2FjaGVfc3luY19yZWdpb24oY29kZWMtPmNvbnRyb2xfZGF0YSwKKwlzdHJ1Y3Qgd204OTYyX3ByaXYgKndtODk2MiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcmV0dXJuIHJlZ2NhY2hlX3N5bmNfcmVnaW9uKHdtODk2Mi0+cmVnbWFwLAogCQkJCSAgICBXTTg5NjJfSERCQVNTX0FJXzEsIFdNODk2Ml9NQVhfUkVHSVNURVIpOwogfQogCkBAIC0xNjU4LDE2ICsxNjYwLDE2IEBACiAJIkhpLWZpIiwgIkFwcGxpY2F0aW9uIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjYXBfaHBmX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5NjJfQURDX0RBQ19DT05UUk9MXzIsIDEwLCAyLCBjYXBfaHBmX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2FwX2hwZl9tb2RlLAorCQkJICAgIFdNODk2Ml9BRENfREFDX0NPTlRST0xfMiwgMTAsIGNhcF9ocGZfbW9kZV90ZXh0KTsKIAogCiBzdGF0aWMgY29uc3QgY2hhciAqY2FwX2xocGZfbW9kZV90ZXh0W10gPSB7CiAJIkxQRiIsICJIUEYiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNhcF9saHBmX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5NjJfTEhQRjEsIDEsIDIsIGNhcF9saHBmX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2FwX2xocGZfbW9kZSwKKwkJCSAgICBXTTg5NjJfTEhQRjEsIDEsIGNhcF9saHBmX21vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5NjJfc25kX2NvbnRyb2xzW10gPSB7CiBTT0NfRE9VQkxFKCJJbnB1dCBNaXhlciBTd2l0Y2giLCBXTTg5NjJfSU5QVVRfTUlYRVJfQ09OVFJPTF8xLCAzLCAyLCAxLCAxKSwKQEAgLTIwMTQsNDAgKzIwMTYsNDAgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKnN0X3RleHRbXSA9IHsgIk5vbmUiLCAiTGVmdCIsICJSaWdodCIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdHJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk2Ml9EQUNfRFNQX01JWElOR18xLCAyLCAzLCBzdF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdHJfZW51bSwKKwkJCSAgICBXTTg5NjJfREFDX0RTUF9NSVhJTkdfMSwgMiwgc3RfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdHJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJSaWdodCBTaWRldG9uZSIsIHN0cl9lbnVtKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk2Ml9EQUNfRFNQX01JWElOR18yLCAyLCAzLCBzdF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGxfZW51bSwKKwkJCSAgICBXTTg5NjJfREFDX0RTUF9NSVhJTkdfMiwgMiwgc3RfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdGxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJMZWZ0IFNpZGV0b25lIiwgc3RsX2VudW0pOwogCiBzdGF0aWMgY29uc3QgY2hhciAqb3V0bXV4X3RleHRbXSA9IHsgIkRBQyIsICJNaXhlciIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzcGtvdXRyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5NjJfU1BFQUtFUl9NSVhFUl8yLCA3LCAyLCBvdXRtdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3Brb3V0cl9lbnVtLAorCQkJICAgIFdNODk2Ml9TUEVBS0VSX01JWEVSXzIsIDcsIG91dG11eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwa291dHJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJTUEtPVVRSIE11eCIsIHNwa291dHJfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3Brb3V0bF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTYyX1NQRUFLRVJfTUlYRVJfMSwgNywgMiwgb3V0bXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwa291dGxfZW51bSwKKwkJCSAgICBXTTg5NjJfU1BFQUtFUl9NSVhFUl8xLCA3LCBvdXRtdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzcGtvdXRsX211eCA9CiAJU09DX0RBUE1fRU5VTSgiU1BLT1VUTCBNdXgiLCBzcGtvdXRsX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhwb3V0cl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTYyX0hFQURQSE9ORV9NSVhFUl8yLCA3LCAyLCBvdXRtdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaHBvdXRyX2VudW0sCisJCQkgICAgV004OTYyX0hFQURQSE9ORV9NSVhFUl8yLCA3LCBvdXRtdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBocG91dHJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJIUE9VVFIgTXV4IiwgaHBvdXRyX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhwb3V0bF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTYyX0hFQURQSE9ORV9NSVhFUl8xLCA3LCAyLCBvdXRtdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaHBvdXRsX2VudW0sCisJCQkgICAgV004OTYyX0hFQURQSE9ORV9NSVhFUl8xLCA3LCBvdXRtdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBocG91dGxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJIUE9VVEwgTXV4IiwgaHBvdXRsX2VudW0pOwpAQCAtMjg4NCw5ICsyODg2LDEzIEBACiAJc25kX3NvY193cml0ZShjb2RlYywgV004OTYyX0ZMTF9DT05UUk9MXzcsIGZsbF9kaXYubGFtYmRhKTsKIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NjJfRkxMX0NPTlRST0xfOCwgZmxsX2Rpdi5uKTsKIAotCXRyeV93YWl0X2Zvcl9jb21wbGV0aW9uKCZ3bTg5NjItPmZsbF9sb2NrKTsKKwlyZWluaXRfY29tcGxldGlvbigmd204OTYyLT5mbGxfbG9jayk7CiAKLQlwbV9ydW50aW1lX2dldF9zeW5jKGNvZGVjLT5kZXYpOworCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoY29kZWMtPmRldik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlc3VtZSBkZXZpY2U6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KIAogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk2Ml9GTExfQ09OVFJPTF8xLAogCQkJICAgIFdNODk2Ml9GTExfRlJBQyB8IFdNODk2Ml9GTExfUkVGQ0xLX1NSQ19NQVNLIHwKQEAgLTI4OTQsOCArMjkwMCw2IEBACiAKIAlkZXZfZGJnKGNvZGVjLT5kZXYsICJGTEwgY29uZmlndXJlZCBmb3IgJWRIei0+JWRIelxuIiwgRnJlZiwgRm91dCk7CiAKLQlyZXQgPSAwOwotCiAJLyogVGhpcyBzaG91bGQgYmUgYSBtYXNzaXZlIG92ZXJlc3RpbWF0ZSBidXQgZ28gZXZlbgogCSAqIGhpZ2hlciBpZiB3ZSdsbCBlcnJvciBvdXQKIAkgKi8KQEAgLTI5MDksMTQgKzI5MTMsMTcgQEAKIAogCWlmICh0aW1lb3V0ID09IDAgJiYgd204OTYyLT5pcnEpIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRkxMIGxvY2sgdGltZWQgb3V0Iik7Ci0JCXJldCA9IC1FVElNRURPVVQ7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk2Ml9GTExfQ09OVFJPTF8xLAorCQkJCSAgICBXTTg5NjJfRkxMX0VOQSwgMCk7CisJCXBtX3J1bnRpbWVfcHV0KGNvZGVjLT5kZXYpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9CiAKIAl3bTg5NjItPmZsbF9mcmVmID0gRnJlZjsKIAl3bTg5NjItPmZsbF9mb3V0ID0gRm91dDsKIAl3bTg5NjItPmZsbF9zcmMgPSBzb3VyY2U7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHdtODk2Ml9tdXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgbXV0ZSkKQEAgLTMwMDMsOSArMzAxMCwxNiBAQAogCXVuc2lnbmVkIGludCBhY3RpdmU7CiAJaW50IHJlZywgcmV0OwogCisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlc3VtZTogJWRcbiIsIHJldCk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKIAlyZXQgPSByZWdtYXBfcmVhZCh3bTg5NjItPnJlZ21hcCwgV004OTYyX0lOVEVSUlVQVF9TVEFUVVNfMl9NQVNLLAogCQkJICAmbWFzayk7CiAJaWYgKHJldCAhPSAwKSB7CisJCXBtX3J1bnRpbWVfcHV0KGRldik7CiAJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlYWQgaW50ZXJydXB0IG1hc2s6ICVkXG4iLAogCQkJcmV0KTsKIAkJcmV0dXJuIElSUV9OT05FOwpAQCAtMzAxMywxNCArMzAyNywxNyBAQAogCiAJcmV0ID0gcmVnbWFwX3JlYWQod204OTYyLT5yZWdtYXAsIFdNODk2Ml9JTlRFUlJVUFRfU1RBVFVTXzIsICZhY3RpdmUpOwogCWlmIChyZXQgIT0gMCkgeworCQlwbV9ydW50aW1lX3B1dChkZXYpOwogCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWFkIGludGVycnVwdDogJWRcbiIsIHJldCk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKIAlhY3RpdmUgJj0gfm1hc2s7CiAKLQlpZiAoIWFjdGl2ZSkKKwlpZiAoIWFjdGl2ZSkgeworCQlwbV9ydW50aW1lX3B1dChkZXYpOwogCQlyZXR1cm4gSVJRX05PTkU7CisJfQogCiAJLyogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdHMgKi8KIAlyZXQgPSByZWdtYXBfd3JpdGUod204OTYyLT5yZWdtYXAsIFdNODk2Ml9JTlRFUlJVUFRfU1RBVFVTXzIsIGFjdGl2ZSk7CkBAIC0zMDcwLDYgKzMwODcsOCBAQAogCQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoMjUwKSk7CiAJfQogCisJcG1fcnVudGltZV9wdXQoZGV2KTsKKwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtMzA4OSw2ICszMTA4LDcgQEAKIGludCB3bTg5NjJfbWljX2RldGVjdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHN0cnVjdCBzbmRfc29jX2phY2sgKmphY2spCiB7CiAJc3RydWN0IHdtODk2Ml9wcml2ICp3bTg5NjIgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IGlycV9tYXNrLCBlbmFibGU7CiAKIAl3bTg5NjItPmphY2sgPSBqYWNrOwpAQCAtMzEwOSwxNCArMzEyOSwxOCBAQAogCXNuZF9zb2NfamFja19yZXBvcnQod204OTYyLT5qYWNrLCAwLAogCQkJICAgIFNORF9KQUNLX01JQ1JPUEhPTkUgfCBTTkRfSkFDS19CVE5fMCk7CiAKKwlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKKwogCWlmIChqYWNrKSB7Ci0JCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIlNZU0NMSyIpOwotCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJNSUNCSUFTIik7CisJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJTWVNDTEsiKTsKKwkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1JQ0JJQVMiKTsKIAl9IGVsc2UgewotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiU1lTQ0xLIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJNSUNCSUFTIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiU1lTQ0xLIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTUlDQklBUyIpOwogCX0KIAorCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHdtODk2Ml9taWNfZGV0ZWN0KTsKQEAgLTM0MDAsMTMgKzM0MjQsNiBAQAogCWJvb2wgZG1pY2NsaywgZG1pY2RhdDsKIAogCXdtODk2Mi0+Y29kZWMgPSBjb2RlYzsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204OTYyLT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMTYsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CiAKIAl3bTg5NjItPmRpc2FibGVfbmJbMF0ubm90aWZpZXJfY2FsbCA9IHdtODk2Ml9yZWd1bGF0b3JfZXZlbnRfMDsKIAl3bTg5NjItPmRpc2FibGVfbmJbMV0ubm90aWZpZXJfY2FsbCA9IHdtODk2Ml9yZWd1bGF0b3JfZXZlbnRfMTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTcxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk3MS5jCmluZGV4IDY3YWJhNzguLjA5YjdiNDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTcxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzEuYwpAQCAtNjQ4LDEyICs2NDgsNiBAQAogCWludCByZXQgPSAwOwogCXUxNiByZWc7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgNywgOSwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAid204OTcxOiBmYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJSU5JVF9ERUxBWUVEX1dPUksoJmNvZGVjLT5kYXBtLmRlbGF5ZWRfd29yaywgd204OTcxX3dvcmspOwogCXdtODk3MV93b3JrcSA9IGNyZWF0ZV93b3JrcXVldWUoIndtODk3MSIpOwogCWlmICh3bTg5NzFfd29ya3EgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc0LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk3NC5jCmluZGV4IDE1ZjQ1YzcuLjA2MjdjNTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzQuYwpAQCAtODQsOCArODQsOCBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqd204OTc0X2F1eG1vZGVfdGV4dFtdID0geyAiQnVmZmVyIiwgIk1peGVyIiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk3NF9hdXhtb2RlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTc0X0lOUFVULCAgMywgMiwgd204OTc0X2F1eG1vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod204OTc0X2F1eG1vZGUsCisJCQkgICAgV004OTc0X0lOUFVULCAgMywgd204OTc0X2F1eG1vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkaWdpdGFsX3RsdiwgLTEyNzUwLCA1MCwgMSk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZXFfdGx2LCAtMTIwMCwgMTAwLCAwKTsKQEAgLTU5MywxMiArNTkzLDYgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHdtODk3NF9yZXNldChjb2RlYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0XG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk3OC5jCmluZGV4IGQ4ZmM1MzEuLjI4ZWY0NmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzguYwpAQCAtMTE3LDIxICsxMTcsMjEgQEAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5NzhfYWxjM1tdID0geyJBTEMiLCAiTGltaXRlciJ9Owogc3RhdGljIGNvbnN0IGNoYXIgKndtODk3OF9hbGMxW10gPSB7Ik9mZiIsICJSaWdodCIsICJMZWZ0IiwgIkJvdGgifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkY19jb21wYW5kLCBXTTg5NzhfQ09NUEFORElOR19DT05UUk9MLCAxLAotCQkJCSAgd204OTc4X2NvbXBhbmRpbmcpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhY19jb21wYW5kLCBXTTg5NzhfQ09NUEFORElOR19DT05UUk9MLCAzLAotCQkJCSAgd204OTc4X2NvbXBhbmRpbmcpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxbW9kZSwgV004OTc4X0VRMSwgOCwgd204OTc4X2VxbW9kZSk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXExLCBXTTg5NzhfRVExLCA1LCB3bTg5NzhfZXExKTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTJidywgV004OTc4X0VRMiwgOCwgd204OTc4X2J3KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTIsIFdNODk3OF9FUTIsIDUsIHdtODk3OF9lcTIpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxM2J3LCBXTTg5NzhfRVEzLCA4LCB3bTg5NzhfYncpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxMywgV004OTc4X0VRMywgNSwgd204OTc4X2VxMyk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXE0YncsIFdNODk3OF9FUTQsIDgsIHdtODk3OF9idyk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXE0LCBXTTg5NzhfRVE0LCA1LCB3bTg5NzhfZXE0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTUsIFdNODk3OF9FUTUsIDUsIHdtODk3OF9lcTUpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsYzMsIFdNODk3OF9BTENfQ09OVFJPTF8zLCA4LCB3bTg5NzhfYWxjMyk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjMSwgV004OTc4X0FMQ19DT05UUk9MXzEsIDcsIHdtODk3OF9hbGMxKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGNfY29tcGFuZCwgV004OTc4X0NPTVBBTkRJTkdfQ09OVFJPTCwgMSwKKwkJCSAgICB3bTg5NzhfY29tcGFuZGluZyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGFjX2NvbXBhbmQsIFdNODk3OF9DT01QQU5ESU5HX0NPTlRST0wsIDMsCisJCQkgICAgd204OTc4X2NvbXBhbmRpbmcpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxbW9kZSwgV004OTc4X0VRMSwgOCwgd204OTc4X2VxbW9kZSk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXExLCBXTTg5NzhfRVExLCA1LCB3bTg5NzhfZXExKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTJidywgV004OTc4X0VRMiwgOCwgd204OTc4X2J3KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTIsIFdNODk3OF9FUTIsIDUsIHdtODk3OF9lcTIpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxM2J3LCBXTTg5NzhfRVEzLCA4LCB3bTg5NzhfYncpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxMywgV004OTc4X0VRMywgNSwgd204OTc4X2VxMyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXE0YncsIFdNODk3OF9FUTQsIDgsIHdtODk3OF9idyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXE0LCBXTTg5NzhfRVE0LCA1LCB3bTg5NzhfZXE0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTUsIFdNODk3OF9FUTUsIDUsIHdtODk3OF9lcTUpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsYzMsIFdNODk3OF9BTENfQ09OVFJPTF8zLCA4LCB3bTg5NzhfYWxjMyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjMSwgV004OTc4X0FMQ19DT05UUk9MXzEsIDcsIHdtODk3OF9hbGMxKTsKIAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRpZ2l0YWxfdGx2LCAtMTI3NTAsIDUwLCAxKTsKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShlcV90bHYsIC0xMjAwLCAxMDAsIDApOwpAQCAtOTc1LDE5ICs5NzUsMTMgQEAKIHN0YXRpYyBpbnQgd204OTc4X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3Qgd204OTc4X3ByaXYgKndtODk3OCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQgPSAwLCBpOworCWludCBpOwogCiAJLyoKIAkgKiBTZXQgZGVmYXVsdCBzeXN0ZW0gY2xvY2sgdG8gUExMLCBpdCBpcyBtb3JlIHByZWNpc2UsIHRoaXMgaXMgYWxzbyB0aGUKIAkgKiBkZWZhdWx0IGhhcmR3YXJlIHNldHRpbmcKIAkgKi8KIAl3bTg5NzgtPnN5c2NsayA9IFdNODk3OF9QTEw7Ci0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODk3OC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KIAogCS8qCiAJICogU2V0IHRoZSB1cGRhdGUgYml0IGluIGFsbCByZWdpc3RlcnMsIHRoYXQgaGF2ZSBvbmUuIFRoaXMgd2F5IGFsbApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5ODMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTgzLmMKaW5kZXggYWE0MWJhMC4uMmI5YmZhNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5ODMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4My5jCkBAIC0yMDUsNDkgKzIwNSw0NCBAQAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHBnYV9ib29zdF90bHYsIDAsIDIwMDAsIDApOwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWxjX3NlbF90ZXh0W10gPSB7ICJPZmYiLCAiUmlnaHQiLCAiTGVmdCIsICJTdGVyZW8iIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX3NlbCwgV004OTgzX0FMQ19DT05UUk9MXzEsIDcsCi0JCQkJICBhbGNfc2VsX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsY19zZWwsIFdNODk4M19BTENfQ09OVFJPTF8xLCA3LCBhbGNfc2VsX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWxjX21vZGVfdGV4dFtdID0geyAiQUxDIiwgIkxpbWl0ZXIiIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX21vZGUsIFdNODk4M19BTENfQ09OVFJPTF8zLCA4LAotCQkJCSAgYWxjX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX21vZGUsIFdNODk4M19BTENfQ09OVFJPTF8zLCA4LCBhbGNfbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmZpbHRlcl9tb2RlX3RleHRbXSA9IHsgIkF1ZGlvIiwgIkFwcGxpY2F0aW9uIiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGZpbHRlcl9tb2RlLCBXTTg5ODNfQURDX0NPTlRST0wsIDcsCi0JCQkJICBmaWx0ZXJfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChmaWx0ZXJfbW9kZSwgV004OTgzX0FEQ19DT05UUk9MLCA3LAorCQkJICAgIGZpbHRlcl9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZXFfYndfdGV4dFtdID0geyAiTmFycm93IiwgIldpZGUiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqZXFtb2RlX3RleHRbXSA9IHsgIkNhcHR1cmUiLCAiUGxheWJhY2siIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGVxbW9kZSwgZXFtb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChlcW1vZGUsIGVxbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmVxMV9jdXRvZmZfdGV4dFtdID0gewogCSI4MEh6IiwgIjEwNUh6IiwgIjEzNUh6IiwgIjE3NUh6IgogfTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTFfY3V0b2ZmLCBXTTg5ODNfRVExX0xPV19TSEVMRiwgNSwKLQkJCQkgIGVxMV9jdXRvZmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXExX2N1dG9mZiwgV004OTgzX0VRMV9MT1dfU0hFTEYsIDUsCisJCQkgICAgZXExX2N1dG9mZl90ZXh0KTsKIHN0YXRpYyBjb25zdCBjaGFyICplcTJfY3V0b2ZmX3RleHRbXSA9IHsKIAkiMjMwSHoiLCAiMzAwSHoiLCAiMzg1SHoiLCAiNTAwSHoiCiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxMl9idywgV004OTgzX0VRMl9QRUFLXzEsIDgsIGVxX2J3X3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxMl9jdXRvZmYsIFdNODk4M19FUTJfUEVBS18xLCA1LAotCQkJCSAgZXEyX2N1dG9mZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTJfYncsIFdNODk4M19FUTJfUEVBS18xLCA4LCBlcV9id190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTJfY3V0b2ZmLCBXTTg5ODNfRVEyX1BFQUtfMSwgNSwgZXEyX2N1dG9mZl90ZXh0KTsKIHN0YXRpYyBjb25zdCBjaGFyICplcTNfY3V0b2ZmX3RleHRbXSA9IHsKIAkiNjUwSHoiLCAiODUwSHoiLCAiMS4xa0h6IiwgIjEuNGtIeiIKIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXEzX2J3LCBXTTg5ODNfRVEzX1BFQUtfMiwgOCwgZXFfYndfdGV4dCk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXEzX2N1dG9mZiwgV004OTgzX0VRM19QRUFLXzIsIDUsCi0JCQkJICBlcTNfY3V0b2ZmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxM19idywgV004OTgzX0VRM19QRUFLXzIsIDgsIGVxX2J3X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxM19jdXRvZmYsIFdNODk4M19FUTNfUEVBS18yLCA1LCBlcTNfY3V0b2ZmX3RleHQpOwogc3RhdGljIGNvbnN0IGNoYXIgKmVxNF9jdXRvZmZfdGV4dFtdID0gewogCSIxLjhrSHoiLCAiMi40a0h6IiwgIjMuMmtIeiIsICI0LjFrSHoiCiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxNF9idywgV004OTgzX0VRNF9QRUFLXzMsIDgsIGVxX2J3X3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxNF9jdXRvZmYsIFdNODk4M19FUTRfUEVBS18zLCA1LAotCQkJCSAgZXE0X2N1dG9mZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTRfYncsIFdNODk4M19FUTRfUEVBS18zLCA4LCBlcV9id190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTRfY3V0b2ZmLCBXTTg5ODNfRVE0X1BFQUtfMywgNSwgZXE0X2N1dG9mZl90ZXh0KTsKIHN0YXRpYyBjb25zdCBjaGFyICplcTVfY3V0b2ZmX3RleHRbXSA9IHsKIAkiNS4za0h6IiwgIjYuOWtIeiIsICI5a0h6IiwgIjExLjdrSHoiCiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxNV9jdXRvZmYsIFdNODk4M19FUTVfSElHSF9TSEVMRiwgNSwKLQkJCQkgIGVxNV9jdXRvZmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXE1X2N1dG9mZiwgV004OTgzX0VRNV9ISUdIX1NIRUxGLCA1LAorCQkJICAgIGVxNV9jdXRvZmZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkZXB0aF8zZF90ZXh0W10gPSB7CiAJIk9mZiIsCkBAIC0yNjcsOCArMjYyLDggQEAKIAkiOTMuMyUiLAogCSIxMDAlIgogfTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChkZXB0aF8zZCwgV004OTgzXzNEX0NPTlRST0wsIDAsCi0JCQkJICBkZXB0aF8zZF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkZXB0aF8zZCwgV004OTgzXzNEX0NPTlRST0wsIDAsCisJCQkgICAgZGVwdGhfM2RfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5ODNfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX1NJTkdMRSgiRGlnaXRhbCBMb29wYmFjayBTd2l0Y2giLCBXTTg5ODNfQ09NUEFORElOR19DT05UUk9MLApAQCAtMTAwMCwxMiArOTk1LDYgQEAKIAlpbnQgcmV0OwogCWludCBpOwogCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIGkvbzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcmV0ID0gc25kX3NvY193cml0ZShjb2RlYywgV004OTgzX1NPRlRXQVJFX1JFU0VULCAwKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gaXNzdWUgcmVzZXQ6ICVkXG4iLCByZXQpOwpAQCAtMTEyOSw3ICsxMTE4LDcgQEAKIH07CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JMkMpCiBzdGF0aWMgaW50IHdtODk4M19pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKIAkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CkBAIC0xMTgyLDcgKzExNzEsNyBAQAogewogCWludCByZXQgPSAwOwogCi0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKIAlyZXQgPSBpMmNfYWRkX2RyaXZlcigmd204OTgzX2kyY19kcml2ZXIpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVnaXN0ZXIgd204OTgzIEkyQyBkcml2ZXI6ICVkXG4iLApAQCAtMTIwMiw3ICsxMTkxLDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IHdtODk4M19leGl0KHZvaWQpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKIAlpMmNfZGVsX2RyaXZlcigmd204OTgzX2kyY19kcml2ZXIpOwogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg1LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4NS5jCmluZGV4IDI3MWI1MTcuLjU0NzNkYzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODUuYwpAQCAtMjI2LDUyICsyMjYsNDggQEAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShwZ2FfYm9vc3RfdGx2LCAwLCAyMDAwLCAwKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFsY19zZWxfdGV4dFtdID0geyAiT2ZmIiwgIlJpZ2h0IiwgIkxlZnQiLCAiU3RlcmVvIiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsY19zZWwsIFdNODk4NV9BTENfQ09OVFJPTF8xLCA3LAotCQkJCSAgYWxjX3NlbF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhbGNfc2VsLCBXTTg5ODVfQUxDX0NPTlRST0xfMSwgNywgYWxjX3NlbF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFsY19tb2RlX3RleHRbXSA9IHsgIkFMQyIsICJMaW1pdGVyIiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsY19tb2RlLCBXTTg5ODVfQUxDX0NPTlRST0xfMywgOCwKLQkJCQkgIGFsY19tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsY19tb2RlLCBXTTg5ODVfQUxDX0NPTlRST0xfMywgOCwgYWxjX21vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpmaWx0ZXJfbW9kZV90ZXh0W10gPSB7ICJBdWRpbyIsICJBcHBsaWNhdGlvbiIgfTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChmaWx0ZXJfbW9kZSwgV004OTg1X0FEQ19DT05UUk9MLCA3LAotCQkJCSAgZmlsdGVyX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZmlsdGVyX21vZGUsIFdNODk4NV9BRENfQ09OVFJPTCwgNywKKwkJCSAgICBmaWx0ZXJfbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmVxX2J3X3RleHRbXSA9IHsgIk5hcnJvdyIsICJXaWRlIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKmVxbW9kZV90ZXh0W10gPSB7ICJDYXB0dXJlIiwgIlBsYXliYWNrIiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChlcW1vZGUsIGVxbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woZXFtb2RlLCBlcW1vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICplcTFfY3V0b2ZmX3RleHRbXSA9IHsKIAkiODBIeiIsICIxMDVIeiIsICIxMzVIeiIsICIxNzVIeiIKIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXExX2N1dG9mZiwgV004OTg1X0VRMV9MT1dfU0hFTEYsIDUsCi0JCQkJICBlcTFfY3V0b2ZmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxMV9jdXRvZmYsIFdNODk4NV9FUTFfTE9XX1NIRUxGLCA1LAorCQkJICAgIGVxMV9jdXRvZmZfdGV4dCk7CiBzdGF0aWMgY29uc3QgY2hhciAqZXEyX2N1dG9mZl90ZXh0W10gPSB7CiAJIjIzMEh6IiwgIjMwMEh6IiwgIjM4NUh6IiwgIjUwMEh6IgogfTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTJfYncsIFdNODk4NV9FUTJfUEVBS18xLCA4LCBlcV9id190ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTJfY3V0b2ZmLCBXTTg5ODVfRVEyX1BFQUtfMSwgNSwKLQkJCQkgIGVxMl9jdXRvZmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXEyX2J3LCBXTTg5ODVfRVEyX1BFQUtfMSwgOCwgZXFfYndfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXEyX2N1dG9mZiwgV004OTg1X0VRMl9QRUFLXzEsIDUsIGVxMl9jdXRvZmZfdGV4dCk7CiBzdGF0aWMgY29uc3QgY2hhciAqZXEzX2N1dG9mZl90ZXh0W10gPSB7CiAJIjY1MEh6IiwgIjg1MEh6IiwgIjEuMWtIeiIsICIxLjRrSHoiCiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxM19idywgV004OTg1X0VRM19QRUFLXzIsIDgsIGVxX2J3X3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxM19jdXRvZmYsIFdNODk4NV9FUTNfUEVBS18yLCA1LAotCQkJCSAgZXEzX2N1dG9mZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTNfYncsIFdNODk4NV9FUTNfUEVBS18yLCA4LCBlcV9id190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTNfY3V0b2ZmLCBXTTg5ODVfRVEzX1BFQUtfMiwgNSwKKwkJCSAgICBlcTNfY3V0b2ZmX3RleHQpOwogc3RhdGljIGNvbnN0IGNoYXIgKmVxNF9jdXRvZmZfdGV4dFtdID0gewogCSIxLjhrSHoiLCAiMi40a0h6IiwgIjMuMmtIeiIsICI0LjFrSHoiCiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxNF9idywgV004OTg1X0VRNF9QRUFLXzMsIDgsIGVxX2J3X3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxNF9jdXRvZmYsIFdNODk4NV9FUTRfUEVBS18zLCA1LAotCQkJCSAgZXE0X2N1dG9mZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTRfYncsIFdNODk4NV9FUTRfUEVBS18zLCA4LCBlcV9id190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTRfY3V0b2ZmLCBXTTg5ODVfRVE0X1BFQUtfMywgNSwgZXE0X2N1dG9mZl90ZXh0KTsKIHN0YXRpYyBjb25zdCBjaGFyICplcTVfY3V0b2ZmX3RleHRbXSA9IHsKIAkiNS4za0h6IiwgIjYuOWtIeiIsICI5a0h6IiwgIjExLjdrSHoiCiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxNV9jdXRvZmYsIFdNODk4NV9FUTVfSElHSF9TSEVMRiwgNSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTVfY3V0b2ZmLCBXTTg5ODVfRVE1X0hJR0hfU0hFTEYsIDUsCiAJCQkJICBlcTVfY3V0b2ZmX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqc3BlYWtlcl9tb2RlX3RleHRbXSA9IHsgIkNsYXNzIEEvQiIsICJDbGFzcyBEIiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwZWFrZXJfbW9kZSwgMHgxNywgOCwgc3BlYWtlcl9tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwZWFrZXJfbW9kZSwgMHgxNywgOCwgc3BlYWtlcl9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZGVwdGhfM2RfdGV4dFtdID0gewogCSJPZmYiLApAQCAtMjkxLDggKzI4Nyw3IEBACiAJIjkzLjMlIiwKIAkiMTAwJSIKIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGVwdGhfM2QsIFdNODk4NV8zRF9DT05UUk9MLCAwLAotCQkJCSAgZGVwdGhfM2RfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGVwdGhfM2QsIFdNODk4NV8zRF9DT05UUk9MLCAwLCBkZXB0aF8zZF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk4NV9zbmRfY29udHJvbHNbXSA9IHsKIAlTT0NfU0lOR0xFKCJEaWdpdGFsIExvb3BiYWNrIFN3aXRjaCIsIFdNODk4NV9DT01QQU5ESU5HX0NPTlRST0wsCkBAIC0xMDAwLDEzICs5OTUsNiBAQAogCWludCByZXQ7CiAKIAl3bTg5ODUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204OTg1LT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgNywgOSwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgaS9vOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg5ODUtPnN1cHBsaWVzKTsgaSsrKQogCQl3bTg5ODUtPnN1cHBsaWVzW2ldLnN1cHBseSA9IHdtODk4NV9zdXBwbHlfbmFtZXNbaV07CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk4OC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODguYwppbmRleCBhNTVlMWMyLi4zYTFhZTRmNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5ODguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4OC5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIHN0cnVjdCB3bTg5ODhfcHJpdiB7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCXVuc2lnbmVkIGludCBzeXNjbGs7Ci0Jc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0ICpzeXNjbGtfY29uc3RyYWludHM7CisJY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0ICpzeXNjbGtfY29uc3RyYWludHM7CiB9OwogCiAjZGVmaW5lIHdtODk4OF9yZXNldChjKQlzbmRfc29jX3dyaXRlKGMsIFdNODk4OF9SRVNFVCwgMCkKQEAgLTEyNiw0NiArMTI2LDQ2IEBACiAgKi8KIAogc3RhdGljIGNvbnN0IGNoYXIgKmJhc3NfYm9vc3RfdHh0W10gPSB7IkxpbmVhciBDb250cm9sIiwgIkFkYXB0aXZlIEJvb3N0In07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGJhc3NfYm9vc3QgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5ODhfQkFTUywgNywgMiwgYmFzc19ib29zdF90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGJhc3NfYm9vc3QsCisJCQkgICAgV004OTg4X0JBU1MsIDcsIGJhc3NfYm9vc3RfdHh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmJhc3NfZmlsdGVyX3R4dFtdID0geyAiMTMwSHogQCA0OGtIeiIsICIyMDBIeiBAIDQ4a0h6IiB9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBiYXNzX2ZpbHRlciA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk4OF9CQVNTLCA2LCAyLCBiYXNzX2ZpbHRlcl90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGJhc3NfZmlsdGVyLAorCQkJICAgIFdNODk4OF9CQVNTLCA2LCBiYXNzX2ZpbHRlcl90eHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqdHJlYmxlX3R4dFtdID0geyI4a0h6IiwgIjRrSHoifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHJlYmxlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTg4X1RSRUJMRSwgNiwgMiwgdHJlYmxlX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHJlYmxlLAorCQkJICAgIFdNODk4OF9UUkVCTEUsIDYsIHRyZWJsZV90eHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqc3RlcmVvXzNkX2xjX3R4dFtdID0geyIyMDBIeiIsICI1MDBIeiJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGVyZW9fM2RfbGMgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5ODhfM0QsIDUsIDIsIHN0ZXJlb18zZF9sY190eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHN0ZXJlb18zZF9sYywKKwkJCSAgICBXTTg5ODhfM0QsIDUsIHN0ZXJlb18zZF9sY190eHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqc3RlcmVvXzNkX3VjX3R4dFtdID0geyIyLjJrSHoiLCAiMS41a0h6In07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHN0ZXJlb18zZF91YyA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk4OF8zRCwgNiwgMiwgc3RlcmVvXzNkX3VjX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3RlcmVvXzNkX3VjLAorCQkJICAgIFdNODk4OF8zRCwgNiwgc3RlcmVvXzNkX3VjX3R4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzdGVyZW9fM2RfZnVuY190eHRbXSA9IHsiQ2FwdHVyZSIsICJQbGF5YmFjayJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGVyZW9fM2RfZnVuYyA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk4OF8zRCwgNywgMiwgc3RlcmVvXzNkX2Z1bmNfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGVyZW9fM2RfZnVuYywKKwkJCSAgICBXTTg5ODhfM0QsIDcsIHN0ZXJlb18zZF9mdW5jX3R4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphbGNfZnVuY190eHRbXSA9IHsiT2ZmIiwgIlJpZ2h0IiwgIkxlZnQiLCAiU3RlcmVvIn07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsY19mdW5jID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTg4X0FMQzEsIDcsIDQsIGFsY19mdW5jX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX2Z1bmMsCisJCQkgICAgV004OTg4X0FMQzEsIDcsIGFsY19mdW5jX3R4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpuZ190eXBlX3R4dFtdID0geyJDb25zdGFudCBQR0EgR2FpbiIsCiAJCQkJICAgICJNdXRlIEFEQyBPdXRwdXQifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbmdfdHlwZSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk4OF9OR0FURSwgMSwgMiwgbmdfdHlwZV90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG5nX3R5cGUsCisJCQkgICAgV004OTg4X05HQVRFLCAxLCBuZ190eXBlX3R4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkZWVtcGhfdHh0W10gPSB7Ik5vbmUiLCAiMzJLaHoiLCAiNDQuMUtoeiIsICI0OEtoeiJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkZWVtcGggPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5ODhfQURDREFDLCAxLCA0LCBkZWVtcGhfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkZWVtcGgsCisJCQkgICAgV004OTg4X0FEQ0RBQywgMSwgZGVlbXBoX3R4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphZGNwb2xfdHh0W10gPSB7Ik5vcm1hbCIsICJMIEludmVydCIsICJSIEludmVydCIsCiAJCQkJICAgIkwgKyBSIEludmVydCJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNwb2wgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5ODhfQURDREFDLCA1LCA0LCBhZGNwb2xfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGNwb2wsCisJCQkgICAgV004OTg4X0FEQ0RBQywgNSwgYWRjcG9sX3R4dCk7CiAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShwZ2FfdGx2LCAtMTcyNSwgNzUsIDApOwogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFkY190bHYsIC05NzUwLCA1MCwgMSk7CkBAIC0zMTcsMTYgKzMxNywxNiBAQAogCiAvKiBEaWZmZXJlbnRpYWwgTXV4ICovCiBzdGF0aWMgY29uc3QgY2hhciAqd204OTg4X2RpZmZfc2VsW10gPSB7IkxpbmUgMSIsICJMaW5lIDIifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGlmZm11eCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk4OF9BRENJTiwgOCwgMiwgd204OTg4X2RpZmZfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkaWZmbXV4LAorCQkJICAgIFdNODk4OF9BRENJTiwgOCwgd204OTg4X2RpZmZfc2VsKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5ODhfZGlmZm11eF9jb250cm9scyA9CiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBkaWZmbXV4KTsKIAogLyogTW9ubyBBREMgTXV4ICovCiBzdGF0aWMgY29uc3QgY2hhciAqd204OTg4X21vbm9fbXV4W10gPSB7IlN0ZXJlbyIsICJNb25vIChMZWZ0KSIsCiAJIk1vbm8gKFJpZ2h0KSIsICJEaWdpdGFsIE1vbm8ifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbW9ub211eCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk4OF9BRENJTiwgNiwgNCwgd204OTg4X21vbm9fbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtb25vbXV4LAorCQkJICAgIFdNODk4OF9BRENJTiwgNiwgd204OTg4X21vbm9fbXV4KTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5ODhfbW9ub211eF9jb250cm9scyA9CiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBtb25vbXV4KTsKIApAQCAtNTIxLDMwICs1MjEsMzAgQEAKIAogLyogVGhlIHNldCBvZiByYXRlcyB3ZSBjYW4gZ2VuZXJhdGUgZnJvbSB0aGUgYWJvdmUgZm9yIGVhY2ggU1lTQ0xLICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZXNfMTIyODhbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcmF0ZXNfMTIyODhbXSA9IHsKIAk4MDAwLCAxMjAwMCwgMTYwMDAsIDI0MDAwLCAyNDAwMCwgMzIwMDAsIDQ4MDAwLCA5NjAwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTIyODggPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzEyMjg4ID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMTIyODgpLAogCS5saXN0CT0gcmF0ZXNfMTIyODgsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzExMjg5NltdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByYXRlc18xMTI4OTZbXSA9IHsKIAk4MDAwLCAxMTAyNSwgMjIwNTAsIDQ0MTAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c18xMTI4OTYgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzExMjg5NiA9IHsKIAkuY291bnQJPSBBUlJBWV9TSVpFKHJhdGVzXzExMjg5NiksCiAJLmxpc3QJPSByYXRlc18xMTI4OTYsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzEyW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzXzEyW10gPSB7CiAJODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAsIDMyMDAwLCA0MTEwMCwgNDgwMDAsCiAJNDgwMDAsIDg4MjM1LCA5NjAwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzEyID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMTIpLAogCS5saXN0CT0gcmF0ZXNfMTIsCiB9OwpAQCAtODEwLDE2ICs4MTAsOCBAQAogCiBzdGF0aWMgaW50IHdtODk4OF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0Jc3RydWN0IHdtODk4OF9wcml2ICp3bTg5ODggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgcmV0ID0gMDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSB3bTg5ODgtPnJlZ21hcDsKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgNywgOSwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlyZXQgPSB3bTg5ODhfcmVzZXQoY29kZWMpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBpc3N1ZSByZXNldFxuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTAuYwppbmRleCAwY2NkNGQ4Li5jNDEzYzE5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkwLmMKQEAgLTE1NywyNiArMTU3LDIzIEBACiBzdGF0aWMgY29uc3QgY2hhciAqd204OTkwX2RpZ2l0YWxfc2lkZXRvbmVbXSA9CiAJeyJOb25lIiwgIkxlZnQgQURDIiwgIlJpZ2h0IEFEQyIsICJSZXNlcnZlZCJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk5MF9sZWZ0X2RpZ2l0YWxfc2lkZXRvbmVfZW51bSA9Ci1TT0NfRU5VTV9TSU5HTEUoV004OTkwX0RJR0lUQUxfU0lERV9UT05FLAotCVdNODk5MF9BRENfVE9fREFDTF9TSElGVCwKLQlXTTg5OTBfQURDX1RPX0RBQ0xfTUFTSywKLQl3bTg5OTBfZGlnaXRhbF9zaWRldG9uZSk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod204OTkwX2xlZnRfZGlnaXRhbF9zaWRldG9uZV9lbnVtLAorCQkJICAgIFdNODk5MF9ESUdJVEFMX1NJREVfVE9ORSwKKwkJCSAgICBXTTg5OTBfQURDX1RPX0RBQ0xfU0hJRlQsCisJCQkgICAgd204OTkwX2RpZ2l0YWxfc2lkZXRvbmUpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk5MF9yaWdodF9kaWdpdGFsX3NpZGV0b25lX2VudW0gPQotU09DX0VOVU1fU0lOR0xFKFdNODk5MF9ESUdJVEFMX1NJREVfVE9ORSwKLQlXTTg5OTBfQURDX1RPX0RBQ1JfU0hJRlQsCi0JV004OTkwX0FEQ19UT19EQUNSX01BU0ssCi0Jd204OTkwX2RpZ2l0YWxfc2lkZXRvbmUpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHdtODk5MF9yaWdodF9kaWdpdGFsX3NpZGV0b25lX2VudW0sCisJCQkgICAgV004OTkwX0RJR0lUQUxfU0lERV9UT05FLAorCQkJICAgIFdNODk5MF9BRENfVE9fREFDUl9TSElGVCwKKwkJCSAgICB3bTg5OTBfZGlnaXRhbF9zaWRldG9uZSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5OTBfYWRjbW9kZVtdID0KIAl7IkhpLWZpIG1vZGUiLCAiVm9pY2UgbW9kZSAxIiwgIlZvaWNlIG1vZGUgMiIsICJWb2ljZSBtb2RlIDMifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTBfcmlnaHRfYWRjbW9kZV9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShXTTg5OTBfQURDX0NUUkwsCi0JV004OTkwX0FEQ19IUEZfQ1VUX1NISUZULAotCVdNODk5MF9BRENfSFBGX0NVVF9NQVNLLAotCXdtODk5MF9hZGNtb2RlKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTBfcmlnaHRfYWRjbW9kZV9lbnVtLAorCQkJICAgIFdNODk5MF9BRENfQ1RSTCwKKwkJCSAgICBXTTg5OTBfQURDX0hQRl9DVVRfU0hJRlQsCisJCQkgICAgd204OTkwX2FkY21vZGUpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTkwX3NuZF9jb250cm9sc1tdID0gewogLyogSU5NSVhMICovCkBAIC00NzUsOSArNDcyLDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5OTBfYWlubG11eFtdID0KIAl7IklOTUlYTCBNaXgiLCAiUlhWT0lDRSBNaXgiLCAiRElGRklOTCBNaXgifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTBfYWlubG11eF9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShXTTg5OTBfSU5QVVRfTUlYRVIxLCBXTTg5OTBfQUlOTE1PREVfU0hJRlQsCi0JQVJSQVlfU0laRSh3bTg5OTBfYWlubG11eCksIHdtODk5MF9haW5sbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTBfYWlubG11eF9lbnVtLAorCQkJICAgIFdNODk5MF9JTlBVVF9NSVhFUjEsIFdNODk5MF9BSU5MTU9ERV9TSElGVCwKKwkJCSAgICB3bTg5OTBfYWlubG11eCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5OTBfZGFwbV9haW5sbXV4X2NvbnRyb2xzID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgd204OTkwX2FpbmxtdXhfZW51bSk7CkBAIC00ODgsOSArNDg1LDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5OTBfYWlucm11eFtdID0KIAl7IklOTUlYUiBNaXgiLCAiUlhWT0lDRSBNaXgiLCAiRElGRklOUiBNaXgifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTBfYWlucm11eF9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShXTTg5OTBfSU5QVVRfTUlYRVIxLCBXTTg5OTBfQUlOUk1PREVfU0hJRlQsCi0JQVJSQVlfU0laRSh3bTg5OTBfYWlucm11eCksIHdtODk5MF9haW5ybXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTBfYWlucm11eF9lbnVtLAorCQkJICAgIFdNODk5MF9JTlBVVF9NSVhFUjEsIFdNODk5MF9BSU5STU9ERV9TSElGVCwKKwkJCSAgICB3bTg5OTBfYWlucm11eCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5OTBfZGFwbV9haW5ybXV4X2NvbnRyb2xzID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgd204OTkwX2FpbnJtdXhfZW51bSk7CkBAIC0xMjkyLDE0ICsxMjg5LDYgQEAKICAqLwogc3RhdGljIGludCB3bTg5OTBfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCByZXQ7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIndtODk5MDogZmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXdtODk5MF9yZXNldChjb2RlYyk7CiAKIAkvKiBjaGFyZ2Ugb3V0cHV0IGNhcHMgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5MS5jCmluZGV4IGRiYTAzMDYuLjg0NGNjNGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTEuYwpAQCAtMTcxLDI2ICsxNzEsMjMgQEAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5OTFfZGlnaXRhbF9zaWRldG9uZVtdID0KIHsiTm9uZSIsICJMZWZ0IEFEQyIsICJSaWdodCBBREMiLCAiUmVzZXJ2ZWQifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTFfbGVmdF9kaWdpdGFsX3NpZGV0b25lX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTFfRElHSVRBTF9TSURFX1RPTkUsCi0JCQlXTTg5OTFfQURDX1RPX0RBQ0xfU0hJRlQsCi0JCQlXTTg5OTFfQURDX1RPX0RBQ0xfTUFTSywKLQkJCXdtODk5MV9kaWdpdGFsX3NpZGV0b25lKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTFfbGVmdF9kaWdpdGFsX3NpZGV0b25lX2VudW0sCisJCQkgICAgV004OTkxX0RJR0lUQUxfU0lERV9UT05FLAorCQkJICAgIFdNODk5MV9BRENfVE9fREFDTF9TSElGVCwKKwkJCSAgICB3bTg5OTFfZGlnaXRhbF9zaWRldG9uZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204OTkxX3JpZ2h0X2RpZ2l0YWxfc2lkZXRvbmVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5MV9ESUdJVEFMX1NJREVfVE9ORSwKLQkJCVdNODk5MV9BRENfVE9fREFDUl9TSElGVCwKLQkJCVdNODk5MV9BRENfVE9fREFDUl9NQVNLLAotCQkJd204OTkxX2RpZ2l0YWxfc2lkZXRvbmUpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHdtODk5MV9yaWdodF9kaWdpdGFsX3NpZGV0b25lX2VudW0sCisJCQkgICAgV004OTkxX0RJR0lUQUxfU0lERV9UT05FLAorCQkJICAgIFdNODk5MV9BRENfVE9fREFDUl9TSElGVCwKKwkJCSAgICB3bTg5OTFfZGlnaXRhbF9zaWRldG9uZSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5OTFfYWRjbW9kZVtdID0KIHsiSGktZmkgbW9kZSIsICJWb2ljZSBtb2RlIDEiLCAiVm9pY2UgbW9kZSAyIiwgIlZvaWNlIG1vZGUgMyJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk5MV9yaWdodF9hZGNtb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTFfQURDX0NUUkwsCi0JCQlXTTg5OTFfQURDX0hQRl9DVVRfU0hJRlQsCi0JCQlXTTg5OTFfQURDX0hQRl9DVVRfTUFTSywKLQkJCXdtODk5MV9hZGNtb2RlKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTFfcmlnaHRfYWRjbW9kZV9lbnVtLAorCQkJICAgIFdNODk5MV9BRENfQ1RSTCwKKwkJCSAgICBXTTg5OTFfQURDX0hQRl9DVVRfU0hJRlQsCisJCQkgICAgd204OTkxX2FkY21vZGUpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTkxX3NuZF9jb250cm9sc1tdID0gewogCS8qIElOTUlYTCAqLwpAQCAtNDg2LDkgKzQ4Myw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqd204OTkxX2FpbmxtdXhbXSA9CiB7IklOTUlYTCBNaXgiLCAiUlhWT0lDRSBNaXgiLCAiRElGRklOTCBNaXgifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTFfYWlubG11eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTkxX0lOUFVUX01JWEVSMSwgV004OTkxX0FJTkxNT0RFX1NISUZULAotCQkJQVJSQVlfU0laRSh3bTg5OTFfYWlubG11eCksIHdtODk5MV9haW5sbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTFfYWlubG11eF9lbnVtLAorCQkJICAgIFdNODk5MV9JTlBVVF9NSVhFUjEsIFdNODk5MV9BSU5MTU9ERV9TSElGVCwKKwkJCSAgICB3bTg5OTFfYWlubG11eCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5OTFfZGFwbV9haW5sbXV4X2NvbnRyb2xzID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtODk5MV9haW5sbXV4X2VudW0pOwpAQCAtNDk5LDkgKzQ5Niw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqd204OTkxX2FpbnJtdXhbXSA9CiB7IklOTUlYUiBNaXgiLCAiUlhWT0lDRSBNaXgiLCAiRElGRklOUiBNaXgifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTFfYWlucm11eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTkxX0lOUFVUX01JWEVSMSwgV004OTkxX0FJTlJNT0RFX1NISUZULAotCQkJQVJSQVlfU0laRSh3bTg5OTFfYWlucm11eCksIHdtODk5MV9haW5ybXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTFfYWlucm11eF9lbnVtLAorCQkJICAgIFdNODk5MV9JTlBVVF9NSVhFUjEsIFdNODk5MV9BSU5STU9ERV9TSElGVCwKKwkJCSAgICB3bTg5OTFfYWlucm11eCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5OTFfZGFwbV9haW5ybXV4X2NvbnRyb2xzID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtODk5MV9haW5ybXV4X2VudW0pOwpAQCAtMTI1MSwxNyArMTI0OCw2IEBACiAKIHN0YXRpYyBpbnQgd204OTkxX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzdHJ1Y3Qgd204OTkxX3ByaXYgKndtODk5MTsKLQlpbnQgcmV0OwotCi0Jd204OTkxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIGkvbzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJd204OTkxX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5My5jCmluZGV4IDJlZTIzYTMuLmY4MjVkYzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTMuYwpAQCAtNjQ2LDggKzY0Niw4IEBACiAJIjQ4a0h6IiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjX2RlZW1waCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19EQUNfQ1RSTCwgNCwgNCwgZGFjX2RlZW1waF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYWNfZGVlbXBoLAorCQkJICAgIFdNODk5M19EQUNfQ1RSTCwgNCwgZGFjX2RlZW1waF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFkY19ocGZfdGV4dFtdID0gewogCSJIaS1GaSIsCkBAIC02NTYsMTYgKzY1NiwxNiBAQAogCSJWb2ljZSAzIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjX2hwZiA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19BRENfQ1RSTCwgNSwgNCwgYWRjX2hwZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGNfaHBmLAorCQkJICAgIFdNODk5M19BRENfQ1RSTCwgNSwgYWRjX2hwZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19wYXRoX3RleHRbXSA9IHsKIAkiQURDIiwKIAkiREFDIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfcGF0aCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19EUkNfQ09OVFJPTF8xLCAxNCwgMiwgZHJjX3BhdGhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX3BhdGgsCisJCQkgICAgV004OTkzX0RSQ19DT05UUk9MXzEsIDE0LCBkcmNfcGF0aF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19yMF90ZXh0W10gPSB7CiAJIjEiLApAQCAtNjc2LDggKzY3Niw4IEBACiAJIjAiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfcjAgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfRFJDX0NPTlRST0xfMywgOCwgNiwgZHJjX3IwX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19yMCwKKwkJCSAgICBXTTg5OTNfRFJDX0NPTlRST0xfMywgOCwgZHJjX3IwX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJjX3IxX3RleHRbXSA9IHsKIAkiMSIsCkBAIC02ODcsOCArNjg3LDggQEAKIAkiMCIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19yMSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19EUkNfQ09OVFJPTF80LCAxMywgNSwgZHJjX3IxX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19yMSwKKwkJCSAgICBXTTg5OTNfRFJDX0NPTlRST0xfNCwgMTMsIGRyY19yMV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19hdHRhY2tfdGV4dFtdID0gewogCSJSZXNlcnZlZCIsCkBAIC03MDUsOCArNzA1LDggQEAKIAkiMTg1LjZtcyIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19hdHRhY2sgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfRFJDX0NPTlRST0xfMiwgMTIsIDEyLCBkcmNfYXR0YWNrX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19hdHRhY2ssCisJCQkgICAgV004OTkzX0RSQ19DT05UUk9MXzIsIDEyLCBkcmNfYXR0YWNrX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJjX2RlY2F5X3RleHRbXSA9IHsKIAkiMTg2bXMiLApAQCAtNzIwLDE2ICs3MjAsMTYgQEAKIAkiNDcuNTZtcyIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19kZWNheSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19EUkNfQ09OVFJPTF8yLCA4LCA5LCBkcmNfZGVjYXlfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX2RlY2F5LAorCQkJICAgIFdNODk5M19EUkNfQ09OVFJPTF8yLCA4LCBkcmNfZGVjYXlfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkcmNfZmZfdGV4dFtdID0gewogCSI1IHNhbXBsZXMiLAogCSI5IHNhbXBsZXMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfZmYgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfRFJDX0NPTlRST0xfMywgNywgMiwgZHJjX2ZmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19mZiwKKwkJCSAgICBXTTg5OTNfRFJDX0NPTlRST0xfMywgNywgZHJjX2ZmX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJjX3FyX3JhdGVfdGV4dFtdID0gewogCSIwLjcyNW1zIiwKQEAgLTczNyw4ICs3MzcsOCBAQAogCSI1LjhtcyIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19xcl9yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTkzX0RSQ19DT05UUk9MXzMsIDAsIDMsIGRyY19xcl9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19xcl9yYXRlLAorCQkJICAgIFdNODk5M19EUkNfQ09OVFJPTF8zLCAwLCBkcmNfcXJfcmF0ZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19zbW9vdGhfdGV4dFtdID0gewogCSJMb3ciLApAQCAtNzQ2LDggKzc0Niw4IEBACiAJIkhpZ2giLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfc21vb3RoID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTkzX0RSQ19DT05UUk9MXzEsIDQsIDMsIGRyY19zbW9vdGhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX3Ntb290aCwKKwkJCSAgICBXTTg5OTNfRFJDX0NPTlRST0xfMSwgNCwgZHJjX3Ntb290aF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk5M19zbmRfY29udHJvbHNbXSA9IHsKIFNPQ19ET1VCTEVfVExWKCJEaWdpdGFsIFNpZGV0b25lIFZvbHVtZSIsIFdNODk5M19ESUdJVEFMX1NJREVfVE9ORSwKQEAgLTg0MSwyNiArODQxLDI2IEBACiAJIkxlZnQiLCAiUmlnaHQiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFpZm91dGxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19BVURJT19JTlRFUkZBQ0VfMSwgMTUsIDIsIGFpZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWZvdXRsX2VudW0sCisJCQkgICAgV004OTkzX0FVRElPX0lOVEVSRkFDRV8xLCAxNSwgYWlmX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmb3V0bF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkFJRk9VVEwgTXV4IiwgYWlmb3V0bF9lbnVtKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhaWZvdXRyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfQVVESU9fSU5URVJGQUNFXzEsIDE0LCAyLCBhaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWlmb3V0cl9lbnVtLAorCQkJICAgIFdNODk5M19BVURJT19JTlRFUkZBQ0VfMSwgMTQsIGFpZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZm91dHJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBSUZPVVRSIE11eCIsIGFpZm91dHJfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWlmaW5sX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfQVVESU9fSU5URVJGQUNFXzIsIDE1LCAyLCBhaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWlmaW5sX2VudW0sCisJCQkgICAgV004OTkzX0FVRElPX0lOVEVSRkFDRV8yLCAxNSwgYWlmX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmaW5sX211eCA9CiAJU09DX0RBUE1fRU5VTSgiQUlGSU5MIE11eCIsIGFpZmlubF9lbnVtKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhaWZpbnJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19BVURJT19JTlRFUkZBQ0VfMiwgMTQsIDIsIGFpZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWZpbnJfZW51bSwKKwkJCSAgICBXTTg5OTNfQVVESU9fSU5URVJGQUNFXzIsIDE0LCBhaWZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWZpbnJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBSUZJTlIgTXV4IiwgYWlmaW5yX2VudW0pOwpAQCAtODY5LDE0ICs4NjksMTQgQEAKIAkiTm9uZSIsICJMZWZ0IiwgIlJpZ2h0IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzaWRldG9uZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19ESUdJVEFMX1NJREVfVE9ORSwgMiwgMywgc2lkZXRvbmVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc2lkZXRvbmVsX2VudW0sCisJCQkgICAgV004OTkzX0RJR0lUQUxfU0lERV9UT05FLCAyLCBzaWRldG9uZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNpZGV0b25lbF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxlZnQgU2lkZXRvbmUiLCBzaWRldG9uZWxfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2lkZXRvbmVyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfRElHSVRBTF9TSURFX1RPTkUsIDAsIDMsIHNpZGV0b25lX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNpZGV0b25lcl9lbnVtLAorCQkJICAgIFdNODk5M19ESUdJVEFMX1NJREVfVE9ORSwgMCwgc2lkZXRvbmVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzaWRldG9uZXJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJSaWdodCBTaWRldG9uZSIsIHNpZGV0b25lcl9lbnVtKTsKQEAgLTE0OTMsMTMgKzE0OTMsNiBAQAogCXdtODk5My0+aHVic19kYXRhLmRjc19jb2Rlc19yID0gLTI7CiAJd204OTkzLT5odWJzX2RhdGEuc2VyaWVzX3N0YXJ0dXAgPSAxOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODk5My0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogTGF0Y2ggdm9sdW1lIHVwZGF0ZSBiaXRzIGFuZCBkZWZhdWx0IFpDIG9uICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkzX1JJR0hUX0RBQ19ESUdJVEFMX1ZPTFVNRSwKIAkJCSAgICBXTTg5OTNfREFDX1ZVLCBXTTg5OTNfREFDX1ZVKTsKQEAgLTE1NTksOCArMTU1Miw2IEBACiAKIHN0YXRpYyBpbnQgd204OTkzX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0Jc3RydWN0IHdtODk5M19wcml2ICp3bTg5OTMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQogCXdtODk5M19zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYwppbmRleCBhZGI3MjA2Li42MzAzNTM3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LmMKQEAgLTEzNDQsOCArMTM0NCw3IEBACiAJIkRNSUMiLAogfTsKIAotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkY19lbnVtLAotCQkJICAgIDAsIDAsIGFkY19tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX1ZJUlRfREVDTChhZGNfZW51bSwgYWRjX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY2xfbXV4ID0KIAlTT0NfREFQTV9FTlVNX1ZJUlQoIkFEQ0wgTXV4IiwgYWRjX2VudW0pOwpAQCAtMjU1NCw0MyArMjU1Myw1MiBAQAogaW50IHdtODk5NF92bWlkX21vZGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBlbnVtIHdtODk5NF92bWlkX21vZGUgbW9kZSkKIHsKIAlzdHJ1Y3Qgd204OTk0X3ByaXYgKndtODk5NCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgV004OTk0X1ZNSURfTk9STUFMOgorCQlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKKwogCQlpZiAod204OTk0LT5odWJzLmxpbmVvdXQxX3NlKSB7Ci0JCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLAotCQkJCQkJICJMSU5FT1VUMU4gRHJpdmVyIik7Ci0JCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLAotCQkJCQkJICJMSU5FT1VUMVAgRHJpdmVyIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwKKwkJCQkJCQkgICJMSU5FT1VUMU4gRHJpdmVyIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwKKwkJCQkJCQkgICJMSU5FT1VUMVAgRHJpdmVyIik7CiAJCX0KIAkJaWYgKHdtODk5NC0+aHVicy5saW5lb3V0Ml9zZSkgewotCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwKLQkJCQkJCSAiTElORU9VVDJOIERyaXZlciIpOwotCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwKLQkJCQkJCSAiTElORU9VVDJQIERyaXZlciIpOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sCisJCQkJCQkJICAiTElORU9VVDJOIERyaXZlciIpOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sCisJCQkJCQkJICAiTElORU9VVDJQIERyaXZlciIpOwogCQl9CiAKIAkJLyogRG8gdGhlIHN5bmMgd2l0aCB0aGUgb2xkIG1vZGUgdG8gYWxsb3cgaXQgdG8gY2xlYW4gdXAgKi8KLQkJc25kX3NvY19kYXBtX3N5bmMoJmNvZGVjLT5kYXBtKTsKKwkJc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CiAJCXdtODk5NC0+dm1pZF9tb2RlID0gbW9kZTsKKworCQlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogCQlicmVhazsKIAogCWNhc2UgV004OTk0X1ZNSURfRk9SQ0U6CisJCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOworCiAJCWlmICh3bTg5OTQtPmh1YnMubGluZW91dDFfc2UpIHsKLQkJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwKLQkJCQkJCSAgICAgICJMSU5FT1VUMU4gRHJpdmVyIik7Ci0JCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sCi0JCQkJCQkgICAgICAiTElORU9VVDFQIERyaXZlciIpOworCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwKKwkJCQkJCQkgICAgICAgIkxJTkVPVVQxTiBEcml2ZXIiKTsKKwkJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sCisJCQkJCQkJICAgICAgICJMSU5FT1VUMVAgRHJpdmVyIik7CiAJCX0KIAkJaWYgKHdtODk5NC0+aHVicy5saW5lb3V0Ml9zZSkgewotCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLAotCQkJCQkJICAgICAgIkxJTkVPVVQyTiBEcml2ZXIiKTsKLQkJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwKLQkJCQkJCSAgICAgICJMSU5FT1VUMlAgRHJpdmVyIik7CisJCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLAorCQkJCQkJCSAgICAgICAiTElORU9VVDJOIERyaXZlciIpOworCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwKKwkJCQkJCQkgICAgICAgIkxJTkVPVVQyUCBEcml2ZXIiKTsKIAkJfQogCiAJCXdtODk5NC0+dm1pZF9tb2RlID0gbW9kZTsKLQkJc25kX3NvY19kYXBtX3N5bmMoJmNvZGVjLT5kYXBtKTsKKwkJc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CisKKwkJc25kX3NvY19kYXBtX211dGV4X3VubG9jayhkYXBtKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzI0Miw3ICszMjUwLDcgQEAKIAlkZXZfZGJnKGNvZGVjLT5kZXYsICJBbGxvY2F0ZWQgJWQgdW5pcXVlIFJlVHVuZSBNb2JpbGUgbmFtZXNcbiIsCiAJCXdtODk5NC0+bnVtX3JldHVuZV9tb2JpbGVfdGV4dHMpOwogCi0Jd204OTk0LT5yZXR1bmVfbW9iaWxlX2VudW0ubWF4ID0gd204OTk0LT5udW1fcmV0dW5lX21vYmlsZV90ZXh0czsKKwl3bTg5OTQtPnJldHVuZV9tb2JpbGVfZW51bS5pdGVtcyA9IHdtODk5NC0+bnVtX3JldHVuZV9tb2JpbGVfdGV4dHM7CiAJd204OTk0LT5yZXR1bmVfbW9iaWxlX2VudW0udGV4dHMgPSB3bTg5OTQtPnJldHVuZV9tb2JpbGVfdGV4dHM7CiAKIAlyZXQgPSBzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyh3bTg5OTQtPmh1YnMuY29kZWMsIGNvbnRyb2xzLApAQCAtMzI5OCw3ICszMzA2LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fZHJjX2NmZ3M7IGkrKykKIAkJCXdtODk5NC0+ZHJjX3RleHRzW2ldID0gcGRhdGEtPmRyY19jZmdzW2ldLm5hbWU7CiAKLQkJd204OTk0LT5kcmNfZW51bS5tYXggPSBwZGF0YS0+bnVtX2RyY19jZmdzOworCQl3bTg5OTQtPmRyY19lbnVtLml0ZW1zID0gcGRhdGEtPm51bV9kcmNfY2ZnczsKIAkJd204OTk0LT5kcmNfZW51bS50ZXh0cyA9IHdtODk5NC0+ZHJjX3RleHRzOwogCiAJCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKHdtODk5NC0+aHVicy5jb2RlYywgY29udHJvbHMsCkBAIC0zOTkwLDkgKzM5OTgsOCBAQAogCWludCByZXQsIGk7CiAKIAl3bTg5OTQtPmh1YnMuY29kZWMgPSBjb2RlYzsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gY29udHJvbC0+cmVnbWFwOwogCi0Jc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDE2LCAxNiwgU05EX1NPQ19SRUdNQVApOworCXNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCBjb250cm9sLT5yZWdtYXApOwogCiAJbXV0ZXhfaW5pdCgmd204OTk0LT5hY2NkZXRfbG9jayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJndtODk5NC0+amFja2RldF9ib290c3RyYXAsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTUuYwppbmRleCA0MzAwY2FmLi5kMzE1MmNmNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NS5jCkBAIC00MjMsMjQgKzQyMywyNCBAQAogCSJEaWZmZXJlbnRpYWwiLCAiU2luZ2xlLWVuZGVkIElOMUxOIiwgIlNpbmdsZS1lbmRlZCBJTjFMUCIKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChpbjFsX2VudW0sIFdNODk5NV9MRUZUX0xJTkVfSU5QVVRfQ09OVFJPTCwKLQkJCQkgIDIsIGluMWxfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaW4xbF9lbnVtLCBXTTg5OTVfTEVGVF9MSU5FX0lOUFVUX0NPTlRST0wsCisJCQkgICAgMiwgaW4xbF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmluMXJfdGV4dFtdID0gewogCSJEaWZmZXJlbnRpYWwiLCAiU2luZ2xlLWVuZGVkIElOMVJOIiwgIlNpbmdsZS1lbmRlZCBJTjFSUCIKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChpbjFyX2VudW0sIFdNODk5NV9MRUZUX0xJTkVfSU5QVVRfQ09OVFJPTCwKLQkJCQkgIDAsIGluMXJfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaW4xcl9lbnVtLCBXTTg5OTVfTEVGVF9MSU5FX0lOUFVUX0NPTlRST0wsCisJCQkgICAgMCwgaW4xcl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRtaWNfc3JjX3RleHRbXSA9IHsKIAkiRE1JQ0RBVDEiLCAiRE1JQ0RBVDIiLCAiRE1JQ0RBVDMiCiB9OwogCi1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZG1pY19zcmMxX2VudW0sIFdNODk5NV9QT1dFUl9NQU5BR0VNRU5UXzUsCi0JCQkJICA4LCBkbWljX3NyY190ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChkbWljX3NyYzJfZW51bSwgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfNSwKLQkJCQkgIDYsIGRtaWNfc3JjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRtaWNfc3JjMV9lbnVtLCBXTTg5OTVfUE9XRVJfTUFOQUdFTUVOVF81LAorCQkJICAgIDgsIGRtaWNfc3JjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRtaWNfc3JjMl9lbnVtLCBXTTg5OTVfUE9XRVJfTUFOQUdFTUVOVF81LAorCQkJICAgIDYsIGRtaWNfc3JjX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTk1X3NuZF9jb250cm9sc1tdID0gewogCVNPQ19ET1VCTEVfUl9UTFYoIkRBQzEgVm9sdW1lIiwgV004OTk1X0RBQzFfTEVGVF9WT0xVTUUsCkBAIC01NjEsMTAgKzU2MSw4IEBACiAJCQkgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQlzdHJ1Y3Qgd204OTk1X3ByaXYgKndtODk5NTsKIAogCWNvZGVjID0gdy0+Y29kZWM7Ci0Jd204OTk1ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKQEAgLTc4MywxNCArNzgxLDEyIEBACiAJIkFEQy9ETUlDMSIsICJETUlDMiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNpZGV0b25lMV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk1X1NJREVUT05FLCAwLCAyLCBzaWRldG9uZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzaWRldG9uZTFfZW51bSwgV004OTk1X1NJREVUT05FLCAwLCBzaWRldG9uZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNpZGV0b25lMV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxlZnQgU2lkZXRvbmUgTXV4Iiwgc2lkZXRvbmUxX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNpZGV0b25lMl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk1X1NJREVUT05FLCAxLCAyLCBzaWRldG9uZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzaWRldG9uZTJfZW51bSwgV004OTk1X1NJREVUT05FLCAxLCBzaWRldG9uZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNpZGV0b25lMl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlJpZ2h0IFNpZGV0b25lIE11eCIsIHNpZGV0b25lMl9lbnVtKTsKQEAgLTg4Niw4ICs4ODIsNyBAQAogCSJETUlDIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRSgwLCAwLCAyLCBhZGNfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9WSVJUX0RFQ0woYWRjX2VudW0sIGFkY19tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGNsX211eCA9CiAJU09DX0RBUE1fRU5VTV9WSVJUKCJBRENMIE11eCIsIGFkY19lbnVtKTsKQEAgLTg5OSwxNCArODk0LDE0IEBACiAJIkRBQzFMIiwgIkRBQzFSIiwgIkRBQzJMIiwgIkRBQzJSIgogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwazFsX3NyY19lbnVtLCBXTTg5OTVfTEVGVF9QRE1fU1BFQUtFUl8xLAotCQkJCSAgMCwgc3BrX3NyY190ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGsxcl9zcmNfZW51bSwgV004OTk1X1JJR0hUX1BETV9TUEVBS0VSXzEsCi0JCQkJICAwLCBzcGtfc3JjX3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwazJsX3NyY19lbnVtLCBXTTg5OTVfTEVGVF9QRE1fU1BFQUtFUl8yLAotCQkJCSAgMCwgc3BrX3NyY190ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGsycl9zcmNfZW51bSwgV004OTk1X1JJR0hUX1BETV9TUEVBS0VSXzIsCi0JCQkJICAwLCBzcGtfc3JjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwazFsX3NyY19lbnVtLCBXTTg5OTVfTEVGVF9QRE1fU1BFQUtFUl8xLAorCQkJICAgIDAsIHNwa19zcmNfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BrMXJfc3JjX2VudW0sIFdNODk5NV9SSUdIVF9QRE1fU1BFQUtFUl8xLAorCQkJICAgIDAsIHNwa19zcmNfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BrMmxfc3JjX2VudW0sIFdNODk5NV9MRUZUX1BETV9TUEVBS0VSXzIsCisJCQkgICAgMCwgc3BrX3NyY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGsycl9zcmNfZW51bSwgV004OTk1X1JJR0hUX1BETV9TUEVBS0VSXzIsCisJCQkgICAgMCwgc3BrX3NyY190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwazFsX211eCA9CiAJU09DX0RBUE1fRU5VTSgiU1BLMUwgU1JDIiwgc3BrMWxfc3JjX2VudW0pOwpAQCAtMjA0NywxMyArMjA0Miw2IEBACiAJd204OTk1ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJd204OTk1LT5jb2RlYyA9IGNvZGVjOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODk5NS0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAxNiwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIGkvbzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTk1LT5zdXBwbGllcyk7IGkrKykKIAkJd204OTk1LT5zdXBwbGllc1tpXS5zdXBwbHkgPSB3bTg5OTVfc3VwcGx5X25hbWVzW2ldOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ni5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTYuYwppbmRleCAxYTc2NTViLi5jNmNiYjNiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ni5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk2LmMKQEAgLTMxMSwyOCArMzExLDI4IEBACiAJIjIuOWtIeiIsICIxLjVrSHoiLCAiNzM1SHoiLCAiNDAzSHoiLCAiMTk2SHoiLCAiOThIeiIsICI0OUh6IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzaWRldG9uZV9ocGYgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfU0lERVRPTkUsIDcsIDcsIHNpZGV0b25lX2hwZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzaWRldG9uZV9ocGYsCisJCQkgICAgV004OTk2X1NJREVUT05FLCA3LCBzaWRldG9uZV9ocGZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpocGZfbW9kZV90ZXh0W10gPSB7CiAJIkhpRmkiLCAiQ3VzdG9tIiwgIlZvaWNlIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkc3AxdHhfaHBmX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfRFNQMV9UWF9GSUxURVJTLCAzLCAzLCBocGZfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkc3AxdHhfaHBmX21vZGUsCisJCQkgICAgV004OTk2X0RTUDFfVFhfRklMVEVSUywgMywgaHBmX21vZGVfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHNwMnR4X2hwZl9tb2RlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk2X0RTUDJfVFhfRklMVEVSUywgMywgMywgaHBmX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHNwMnR4X2hwZl9tb2RlLAorCQkJICAgIFdNODk5Nl9EU1AyX1RYX0ZJTFRFUlMsIDMsIGhwZl9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqaHBmX2N1dG9mZl90ZXh0W10gPSB7CiAJIjUwSHoiLCAiNzVIeiIsICIxMDBIeiIsICIxNTBIeiIsICIyMDBIeiIsICIzMDBIeiIsICI0MDBIeiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHNwMXR4X2hwZl9jdXRvZmYgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfRFNQMV9UWF9GSUxURVJTLCAwLCA3LCBocGZfY3V0b2ZmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRzcDF0eF9ocGZfY3V0b2ZmLAorCQkJICAgIFdNODk5Nl9EU1AxX1RYX0ZJTFRFUlMsIDAsIGhwZl9jdXRvZmZfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHNwMnR4X2hwZl9jdXRvZmYgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfRFNQMl9UWF9GSUxURVJTLCAwLCA3LCBocGZfY3V0b2ZmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRzcDJ0eF9ocGZfY3V0b2ZmLAorCQkJICAgIFdNODk5Nl9EU1AyX1RYX0ZJTFRFUlMsIDAsIGhwZl9jdXRvZmZfdGV4dCk7CiAKIHN0YXRpYyB2b2lkIHdtODk5Nl9zZXRfcmV0dW5lX21vYmlsZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBibG9jaykKIHsKQEAgLTc4MCwxNCArNzgwLDE0IEBACiAJIklOMSIsICJJTjIiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsZWZ0X3NpZGV0b25lX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfU0lERVRPTkUsIDAsIDIsIHNpZGV0b25lX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxlZnRfc2lkZXRvbmVfZW51bSwKKwkJCSAgICBXTTg5OTZfU0lERVRPTkUsIDAsIHNpZGV0b25lX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGVmdF9zaWRldG9uZSA9CiAJU09DX0RBUE1fRU5VTSgiTGVmdCBTaWRldG9uZSIsIGxlZnRfc2lkZXRvbmVfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcmlnaHRfc2lkZXRvbmVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5Nl9TSURFVE9ORSwgMSwgMiwgc2lkZXRvbmVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocmlnaHRfc2lkZXRvbmVfZW51bSwKKwkJCSAgICBXTTg5OTZfU0lERVRPTkUsIDEsIHNpZGV0b25lX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmlnaHRfc2lkZXRvbmUgPQogCVNPQ19EQVBNX0VOVU0oIlJpZ2h0IFNpZGV0b25lIiwgcmlnaHRfc2lkZXRvbmVfZW51bSk7CkBAIC03OTYsMTQgKzc5NiwxNCBAQAogCSJEQUMxTCIsICJEQUMxUiIsICJEQUMyTCIsICJEQUMyUiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3BrbF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk2X0xFRlRfUERNX1NQRUFLRVIsIDAsIDQsIHNwa190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGtsX2VudW0sCisJCQkgICAgV004OTk2X0xFRlRfUERNX1NQRUFLRVIsIDAsIHNwa190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwa2xfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJTUEtMIiwgc3BrbF9lbnVtKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzcGtyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfUklHSFRfUERNX1NQRUFLRVIsIDAsIDQsIHNwa190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGtyX2VudW0sCisJCQkgICAgV004OTk2X1JJR0hUX1BETV9TUEVBS0VSLCAwLCBzcGtfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzcGtyX211eCA9CiAJU09DX0RBUE1fRU5VTSgiU1BLUiIsIHNwa3JfZW51bSk7CkBAIC04MTIsOCArODEyLDggQEAKIAkiQUlGMSIsICJBSUYyIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkc3AxcnhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5Nl9QT1dFUl9NQU5BR0VNRU5UXzgsIDAsIDIsIGRzcDFyeF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkc3AxcnhfZW51bSwKKwkJCSAgICBXTTg5OTZfUE9XRVJfTUFOQUdFTUVOVF84LCAwLCBkc3AxcnhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkc3AxcnggPQogCVNPQ19EQVBNX0VOVU0oIkRTUDFSWCIsIGRzcDFyeF9lbnVtKTsKQEAgLTgyMiw4ICs4MjIsOCBAQAogCSAiQUlGMiIsICJBSUYxIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkc3AycnhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5Nl9QT1dFUl9NQU5BR0VNRU5UXzgsIDQsIDIsIGRzcDJyeF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkc3AycnhfZW51bSwKKwkJCSAgICBXTTg5OTZfUE9XRVJfTUFOQUdFTUVOVF84LCA0LCBkc3AycnhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkc3AycnggPQogCVNPQ19EQVBNX0VOVU0oIkRTUDJSWCIsIGRzcDJyeF9lbnVtKTsKQEAgLTgzMiw4ICs4MzIsOCBAQAogCSJEU1AyIiwgIkRTUDEiLCAiQUlGMSIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWlmMnR4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfUE9XRVJfTUFOQUdFTUVOVF84LCA2LCAzLCBhaWYydHhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWlmMnR4X2VudW0sCisJCQkgICAgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfOCwgNiwgYWlmMnR4X3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmMnR4ID0KIAlTT0NfREFQTV9FTlVNKCJBSUYyVFgiLCBhaWYydHhfZW51bSk7CkBAIC04NDIsMTQgKzg0MiwxNCBAQAogCSJBREMiLCAiRE1JQzEiLCAiRE1JQzIiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGluMV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk2X1BPV0VSX01BTkFHRU1FTlRfNywgMCwgMywgaW5tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaW4xX2VudW0sCisJCQkgICAgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfNywgMCwgaW5tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbjFfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJJTjEgTXV4IiwgaW4xX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGluMl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk2X1BPV0VSX01BTkFHRU1FTlRfNywgNCwgMywgaW5tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaW4yX2VudW0sCisJCQkgICAgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfNywgNCwgaW5tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbjJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJJTjIgTXV4IiwgaW4yX2VudW0pOwpAQCAtMTYwOCw4ICsxNjA4LDggQEAKIAkJCQltc2xlZXAoNSk7CiAJCQl9CiAKLQkJCXJlZ2NhY2hlX2NhY2hlX29ubHkoY29kZWMtPmNvbnRyb2xfZGF0YSwgZmFsc2UpOwotCQkJcmVnY2FjaGVfc3luYyhjb2RlYy0+Y29udHJvbF9kYXRhKTsKKwkJCXJlZ2NhY2hlX2NhY2hlX29ubHkod204OTk2LT5yZWdtYXAsIGZhbHNlKTsKKwkJCXJlZ2NhY2hlX3N5bmMod204OTk2LT5yZWdtYXApOwogCQl9CiAKIAkJLyogQnlwYXNzIHRoZSBNSUNCSUFTZXMgZm9yIGxvd2VzdCBwb3dlciAqLwpAQCAtMTYyMCwxMCArMTYyMCwxMCBAQAogCQlicmVhazsKIAogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKLQkJcmVnY2FjaGVfY2FjaGVfb25seShjb2RlYy0+Y29udHJvbF9kYXRhLCB0cnVlKTsKKwkJcmVnY2FjaGVfY2FjaGVfb25seSh3bTg5OTYtPnJlZ21hcCwgdHJ1ZSk7CiAJCWlmICh3bTg5OTYtPnBkYXRhLmxkb19lbmEgPj0gMCkgewogCQkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAod204OTk2LT5wZGF0YS5sZG9fZW5hLCAwKTsKLQkJCXJlZ2NhY2hlX2NhY2hlX29ubHkoY29kZWMtPmNvbnRyb2xfZGF0YSwgdHJ1ZSk7CisJCQlyZWdjYWNoZV9jYWNoZV9vbmx5KHdtODk5Ni0+cmVnbWFwLCB0cnVlKTsKIAkJfQogCQlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUod204OTk2LT5zdXBwbGllcyksCiAJCQkJICAgICAgIHdtODk5Ni0+c3VwcGxpZXMpOwpAQCAtMjI1MSw2ICsyMjUxLDcgQEAKIAkJICB3bTg5OTZfcG9sYXJpdHlfZm4gcG9sYXJpdHlfY2IpCiB7CiAJc3RydWN0IHdtODk5Nl9wcml2ICp3bTg5OTYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKIAl3bTg5OTYtPmphY2sgPSBqYWNrOwogCXdtODk5Ni0+ZGV0ZWN0aW5nID0gdHJ1ZTsKQEAgLTIyNjcsOCArMjI2OCwxMiBAQAogCQkJICAgIFdNODk5Nl9NSUNCMl9ESVNDSCwgMCk7CiAKIAkvKiBMRE8yIHBvd2VycyB0aGUgbWljcm9waG9uZXMsIFNZU0NMSyBjbG9ja3MgZGV0ZWN0aW9uICovCi0Jc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiTERPMiIpOwotCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIlNZU0NMSyIpOworCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOworCisJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkxETzIiKTsKKwlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiU1lTQ0xLIik7CisKKwlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogCiAJLyogV2Ugc3RhcnQgb2ZmIGp1c3QgZW5hYmxpbmcgbWljcm9waG9uZSBkZXRlY3Rpb24gLSBldmVuIGEKIAkgKiBwbGFpbiBoZWFkcGhvbmUgd2lsbCB0cmlnZ2VyIGRldGVjdGlvbi4KQEAgLTI1OTUsNyArMjYwMCw3IEBACiAJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiQWxsb2NhdGVkICVkIHVuaXF1ZSBSZVR1bmUgTW9iaWxlIG5hbWVzXG4iLAogCQl3bTg5OTYtPm51bV9yZXR1bmVfbW9iaWxlX3RleHRzKTsKIAotCXdtODk5Ni0+cmV0dW5lX21vYmlsZV9lbnVtLm1heCA9IHdtODk5Ni0+bnVtX3JldHVuZV9tb2JpbGVfdGV4dHM7CisJd204OTk2LT5yZXR1bmVfbW9iaWxlX2VudW0uaXRlbXMgPSB3bTg5OTYtPm51bV9yZXR1bmVfbW9iaWxlX3RleHRzOwogCXdtODk5Ni0+cmV0dW5lX21vYmlsZV9lbnVtLnRleHRzID0gd204OTk2LT5yZXR1bmVfbW9iaWxlX3RleHRzOwogCiAJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGNvbnRyb2xzLCBBUlJBWV9TSVpFKGNvbnRyb2xzKSk7CkBAIC0yNjI4LDE0ICsyNjMzLDYgQEAKIAlpbml0X2NvbXBsZXRpb24oJndtODk5Ni0+ZGNzX2RvbmUpOwogCWluaXRfY29tcGxldGlvbigmd204OTk2LT5mbGxfbG9jayk7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204OTk2LT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMTYsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnI7Ci0JfQotCiAJaWYgKHdtODk5Ni0+cGRhdGEubnVtX3JldHVuZV9tb2JpbGVfY2ZncykKIAkJd204OTk2X3JldHVuZV9tb2JpbGVfcGRhdGEoY29kZWMpOwogCWVsc2UKQEAgLTI2NzQsMTMgKzI2NzEsMTEgQEAKIAkJfSBlbHNlIHsKIAkJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IElSUTogJWRcbiIsCiAJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKLQotZXJyOgotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgd204OTk2X3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ny5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTcuYwppbmRleCA1NTUxMTVlLi4wMDQxODZiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ny5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk3LmMKQEAgLTg2LDcgKzg2LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKIAlzdHJ1Y3QgYXJpem9uYSAqYXJpem9uYSA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gYXJpem9uYS0+cmVnbWFwOwogCWNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcGF0Y2ggPSBOVUxMOwogCWludCBpLCBwYXRjaF9zaXplOwogCkBAIC0xMjMsMTAgKzEyMywxMiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk5N19ocG91dF9vc3JbXSA9IHsKIAlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQVJJWk9OQV9PVVRQVVRfUEFUSF9DT05GSUdfMUwsCi0JCQkgICAgICBBUklaT05BX09VVDFfT1NSX1NISUZULCAweDcsIDMsCisJCQkgICAgICBBUklaT05BX09VVDFfT1NSX1NISUZULCAweDcsCisJCQkgICAgICBBUlJBWV9TSVpFKHdtODk5N19vc3JfdGV4dCksCiAJCQkgICAgICB3bTg5OTdfb3NyX3RleHQsIHdtODk5N19vc3JfdmFsKSwKIAlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQVJJWk9OQV9PVVRQVVRfUEFUSF9DT05GSUdfM0wsCi0JCQkgICAgICBBUklaT05BX09VVDNfT1NSX1NISUZULCAweDcsIDMsCisJCQkgICAgICBBUklaT05BX09VVDNfT1NSX1NISUZULCAweDcsCisJCQkgICAgICBBUlJBWV9TSVpFKHdtODk5N19vc3JfdGV4dCksCiAJCQkgICAgICB3bTg5OTdfb3NyX3RleHQsIHdtODk5N19vc3JfdmFsKSwKIH07CiAKQEAgLTE3MCwxNSArMTcyLDggQEAKIEFSSVpPTkFfTUlYRVJfQ09OVFJPTFMoIkVRMyIsIEFSSVpPTkFfRVEzTUlYX0lOUFVUXzFfU09VUkNFKSwKIEFSSVpPTkFfTUlYRVJfQ09OVFJPTFMoIkVRNCIsIEFSSVpPTkFfRVE0TUlYX0lOUFVUXzFfU09VUkNFKSwKIAotU05EX1NPQ19CWVRFU19NQVNLKCJFUTEgQ29lZmZpY2llbnRzIiwgQVJJWk9OQV9FUTFfMSwgMjEsCi0JCSAgIEFSSVpPTkFfRVExX0VOQV9NQVNLKSwKLVNORF9TT0NfQllURVNfTUFTSygiRVEyIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVEyXzEsIDIxLAotCQkgICBBUklaT05BX0VRMl9FTkFfTUFTSyksCi1TTkRfU09DX0JZVEVTX01BU0soIkVRMyBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRM18xLCAyMSwKLQkJICAgQVJJWk9OQV9FUTNfRU5BX01BU0spLAotU05EX1NPQ19CWVRFU19NQVNLKCJFUTQgQ29lZmZpY2llbnRzIiwgQVJJWk9OQV9FUTRfMSwgMjEsCi0JCSAgIEFSSVpPTkFfRVE0X0VOQV9NQVNLKSwKLQorU05EX1NPQ19CWVRFUygiRVExIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVExXzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRMSBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVExXzIsIEFSSVpPTkFfRVExX0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRMSBCMSBWb2x1bWUiLCBBUklaT05BX0VRMV8xLCBBUklaT05BX0VRMV9CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTEgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTFfMSwgQVJJWk9OQV9FUTFfQjJfR0FJTl9TSElGVCwKQEAgLTE5MCw2ICsxODUsOCBAQAogU09DX1NJTkdMRV9UTFYoIkVRMSBCNSBWb2x1bWUiLCBBUklaT05BX0VRMV8yLCBBUklaT05BX0VRMV9CNV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIAorU05EX1NPQ19CWVRFUygiRVEyIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVEyXzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRMiBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVEyXzIsIEFSSVpPTkFfRVEyX0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRMiBCMSBWb2x1bWUiLCBBUklaT05BX0VRMl8xLCBBUklaT05BX0VRMl9CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTIgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTJfMSwgQVJJWk9OQV9FUTJfQjJfR0FJTl9TSElGVCwKQEAgLTIwMSw2ICsxOTgsOCBAQAogU09DX1NJTkdMRV9UTFYoIkVRMiBCNSBWb2x1bWUiLCBBUklaT05BX0VRMl8yLCBBUklaT05BX0VRMl9CNV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIAorU05EX1NPQ19CWVRFUygiRVEzIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVEzXzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRMyBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVEzXzIsIEFSSVpPTkFfRVEzX0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRMyBCMSBWb2x1bWUiLCBBUklaT05BX0VRM18xLCBBUklaT05BX0VRM19CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTMgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTNfMSwgQVJJWk9OQV9FUTNfQjJfR0FJTl9TSElGVCwKQEAgLTIxMiw2ICsyMTEsOCBAQAogU09DX1NJTkdMRV9UTFYoIkVRMyBCNSBWb2x1bWUiLCBBUklaT05BX0VRM18yLCBBUklaT05BX0VRM19CNV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIAorU05EX1NPQ19CWVRFUygiRVE0IENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVE0XzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRNCBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVE0XzIsIEFSSVpPTkFfRVE0X0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRNCBCMSBWb2x1bWUiLCBBUklaT05BX0VRNF8xLCBBUklaT05BX0VRNF9CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTQgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTRfMSwgQVJJWk9OQV9FUTRfQjJfR0FJTl9TSElGVCwKQEAgLTEwNTIsOSArMTA1Myw3IEBACiAJc3RydWN0IHdtODk5N19wcml2ICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBwcml2LT5jb3JlLmFyaXpvbmEtPnJlZ21hcDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAzMiwgMTYsIFNORF9TT0NfUkVHTUFQKTsKKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgcHJpdi0+Y29yZS5hcml6b25hLT5yZWdtYXApOwogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTkwODEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205MDgxLmMKaW5kZXggMDk4MmMxZC4uZDE4ZWZmMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTkwODEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTA4MS5jCkBAIC0yNjgsOCArMjY4LDcgQEAKIAkiMCIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19oaWdoID0KLQlTT0NfRU5VTV9TSU5HTEUoV005MDgxX0RSQ18zLCAzLCA2LCBkcmNfaGlnaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkcmNfaGlnaCwgV005MDgxX0RSQ18zLCAzLCBkcmNfaGlnaF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19sb3dfdGV4dFtdID0gewogCSIxIiwKQEAgLTI3OSw4ICsyNzgsNyBAQAogCSIwIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHJjX2xvdyA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNOTA4MV9EUkNfMywgMCwgNSwgZHJjX2xvd190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkcmNfbG93LCBXTTkwODFfRFJDXzMsIDAsIGRyY19sb3dfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkcmNfYXRrX3RleHRbXSA9IHsKIAkiMTgxdXMiLApAQCAtMjk3LDggKzI5NSw3IEBACiAJIjE4NS42bXMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfYXRrID0KLQlTT0NfRU5VTV9TSU5HTEUoV005MDgxX0RSQ18yLCAxMiwgMTIsIGRyY19hdGtfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX2F0aywgV005MDgxX0RSQ18yLCAxMiwgZHJjX2F0a190ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19kY3lfdGV4dFtdID0gewogCSIxODZtcyIsCkBAIC0zMTIsOCArMzA5LDcgQEAKIAkiNDcuNTZzIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHJjX2RjeSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNOTA4MV9EUkNfMiwgOCwgOSwgZHJjX2RjeV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkcmNfZGN5LCBXTTkwODFfRFJDXzIsIDgsIGRyY19kY3lfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkcmNfcXJfZGN5X3RleHRbXSA9IHsKIAkiMC43MjVtcyIsCkBAIC0zMjEsOCArMzE3LDcgQEAKIAkiNS44bXMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfcXJfZGN5ID0KLQlTT0NfRU5VTV9TSU5HTEUoV005MDgxX0RSQ18yLCA0LCAzLCBkcmNfcXJfZGN5X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19xcl9kY3ksIFdNOTA4MV9EUkNfMiwgNCwgZHJjX3FyX2RjeV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRhY19kZWVtcGhfdGV4dFtdID0gewogCSJOb25lIiwKQEAgLTMzMSwxNiArMzI2LDE2IEBACiAJIjQ4a0h6IiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjX2RlZW1waCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNOTA4MV9EQUNfRElHSVRBTF8yLCAxLCA0LCBkYWNfZGVlbXBoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhY19kZWVtcGgsIFdNOTA4MV9EQUNfRElHSVRBTF8yLCAxLAorCQkJICAgIGRhY19kZWVtcGhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzcGVha2VyX21vZGVfdGV4dFtdID0gewogCSJDbGFzcyBEIiwKIAkiQ2xhc3MgQUIiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzcGVha2VyX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTkwODFfQU5BTE9HVUVfU1BFQUtFUl8yLCA2LCAyLCBzcGVha2VyX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BlYWtlcl9tb2RlLCBXTTkwODFfQU5BTE9HVUVfU1BFQUtFUl8yLCA2LAorCQkJICAgIHNwZWFrZXJfbW9kZV90ZXh0KTsKIAogc3RhdGljIGludCBzcGVha2VyX21vZGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQpAQCAtMTI2NSwxNSArMTI2MCw2IEBACiBzdGF0aWMgaW50IHdtOTA4MV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtOTA4MV9wcml2ICp3bTkwODEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwotCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtOTA4MS0+cmVnbWFwOwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CiAKIAkvKiBFbmFibGUgemVybyBjcm9zcyBieSBkZWZhdWx0ICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV005MDgxX0FOQUxPR1VFX0xJTkVPVVQsCkBAIC0xMjg4LDcgKzEyNzQsNyBAQAogCQkJCSAgICAgQVJSQVlfU0laRSh3bTkwODFfZXFfY29udHJvbHMpKTsKIAl9CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHdtOTA4MV9yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTkwOTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205MDkwLmMKaW5kZXggYTA3ZmUxNi4uODc5MzQxNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTkwOTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTA5MC5jCkBAIC01MjIsMTYgKzUyMiw2IEBACiAKIHN0YXRpYyBpbnQgd205MDkwX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzdHJ1Y3Qgd205MDkwX3ByaXYgKndtOTA5MCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2KTsKLQlpbnQgcmV0OwotCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtOTA5MC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogQ29uZmlndXJlIHNvbWUgZGVmYXVsdHM7IHRoZXkgd2lsbCBiZSB3cml0dGVuIG91dCB3aGVuIHdlCiAJICogYnJpbmcgdGhlIGJpYXMgdXAuCiAJICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtOTcwNS5jIGIvc291bmQvc29jL2NvZGVjcy93bTk3MDUuYwppbmRleCA3MGNlNjc5My4uYzBiN2Y0NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTk3MDUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcwNS5jCkBAIC02NywxMiArNjcsMTIgQEAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTk3MDVfcmVjX3NlbFtdID0geyJNaWMiLCAiQ0QiLCAiTkMiLCAiTkMiLAogCSJMaW5lIiwgIlN0ZXJlbyBNaXgiLCAiTW9ubyBNaXgiLCAiUGhvbmUifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTk3MDVfZW51bV9taWMgPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X0dFTkVSQUxfUFVSUE9TRSwgOCwgMiwgd205NzA1X21pYyk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtOTcwNV9lbnVtX3JlY19sID0KLQlTT0NfRU5VTV9TSU5HTEUoQUM5N19SRUNfU0VMLCA4LCA4LCB3bTk3MDVfcmVjX3NlbCk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtOTcwNV9lbnVtX3JlY19yID0KLQlTT0NfRU5VTV9TSU5HTEUoQUM5N19SRUNfU0VMLCAwLCA4LCB3bTk3MDVfcmVjX3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod205NzA1X2VudW1fbWljLAorCQkJICAgIEFDOTdfR0VORVJBTF9QVVJQT1NFLCA4LCB3bTk3MDVfbWljKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTk3MDVfZW51bV9yZWNfbCwKKwkJCSAgICBBQzk3X1JFQ19TRUwsIDgsIHdtOTcwNV9yZWNfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTk3MDVfZW51bV9yZWNfciwKKwkJCSAgICBBQzk3X1JFQ19TRUwsIDAsIHdtOTcwNV9yZWNfc2VsKTsKIAogLyogSGVhZHBob25lIE1peGVyICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd205NzA1X2hwX21peGVyX2NvbnRyb2xzW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtX2Fkc3AuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5jCmluZGV4IDQ0NDYyNmYuLmJiNWY3YjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5jCkBAIC02ODQsMjQgKzY4NCwzOCBAQAogCQl9CiAKIAkJaWYgKHJlZykgewotCQkJYnVmID0gd21fYWRzcF9idWZfYWxsb2MocmVnaW9uLT5kYXRhLAotCQkJCQkJbGUzMl90b19jcHUocmVnaW9uLT5sZW4pLAotCQkJCQkJJmJ1Zl9saXN0KTsKLQkJCWlmICghYnVmKSB7Ci0JCQkJYWRzcF9lcnIoZHNwLCAiT3V0IG9mIG1lbW9yeVxuIik7Ci0JCQkJcmV0ID0gLUVOT01FTTsKLQkJCQlnb3RvIG91dF9mdzsKLQkJCX0KKwkJCXNpemVfdCB0b193cml0ZSA9IFBBR0VfU0laRTsKKwkJCXNpemVfdCByZW1haW4gPSBsZTMyX3RvX2NwdShyZWdpb24tPmxlbik7CisJCQljb25zdCB1OCAqZGF0YSA9IHJlZ2lvbi0+ZGF0YTsKIAotCQkJcmV0ID0gcmVnbWFwX3Jhd193cml0ZV9hc3luYyhyZWdtYXAsIHJlZywgYnVmLT5idWYsCi0JCQkJCQkgICAgIGxlMzJfdG9fY3B1KHJlZ2lvbi0+bGVuKSk7Ci0JCQlpZiAocmV0ICE9IDApIHsKLQkJCQlhZHNwX2Vycihkc3AsCi0JCQkJCSIlcy4lZDogRmFpbGVkIHRvIHdyaXRlICVkIGJ5dGVzIGF0ICVkIGluICVzOiAlZFxuIiwKLQkJCQkJZmlsZSwgcmVnaW9ucywKLQkJCQkJbGUzMl90b19jcHUocmVnaW9uLT5sZW4pLCBvZmZzZXQsCi0JCQkJCXJlZ2lvbl9uYW1lLCByZXQpOwotCQkJCWdvdG8gb3V0X2Z3OworCQkJd2hpbGUgKHJlbWFpbiA+IDApIHsKKwkJCQlpZiAocmVtYWluIDwgUEFHRV9TSVpFKQorCQkJCQl0b193cml0ZSA9IHJlbWFpbjsKKworCQkJCWJ1ZiA9IHdtX2Fkc3BfYnVmX2FsbG9jKGRhdGEsCisJCQkJCQkJdG9fd3JpdGUsCisJCQkJCQkJJmJ1Zl9saXN0KTsKKwkJCQlpZiAoIWJ1ZikgeworCQkJCQlhZHNwX2Vycihkc3AsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQkJZ290byBvdXRfZnc7CisJCQkJfQorCisJCQkJcmV0ID0gcmVnbWFwX3Jhd193cml0ZV9hc3luYyhyZWdtYXAsIHJlZywKKwkJCQkJCQkgICAgIGJ1Zi0+YnVmLAorCQkJCQkJCSAgICAgdG9fd3JpdGUpOworCQkJCWlmIChyZXQgIT0gMCkgeworCQkJCQlhZHNwX2Vycihkc3AsCisJCQkJCQkiJXMuJWQ6IEZhaWxlZCB0byB3cml0ZSAlemQgYnl0ZXMgYXQgJWQgaW4gJXM6ICVkXG4iLAorCQkJCQkJZmlsZSwgcmVnaW9ucywKKwkJCQkJCXRvX3dyaXRlLCBvZmZzZXQsCisJCQkJCQlyZWdpb25fbmFtZSwgcmV0KTsKKwkJCQkJZ290byBvdXRfZnc7CisJCQkJfQorCisJCQkJZGF0YSArPSB0b193cml0ZTsKKwkJCQlyZWcgKz0gdG9fd3JpdGUgLyAyOworCQkJCXJlbWFpbiAtPSB0b193cml0ZTsKIAkJCX0KIAkJfQogCkBAIC0xNjc5LDYgKzE2OTMsOCBAQAogCQkJbGlzdF9kZWwoJmFsZ19yZWdpb24tPmxpc3QpOwogCQkJa2ZyZWUoYWxnX3JlZ2lvbik7CiAJCX0KKworCQlhZHNwX2RiZyhkc3AsICJTaHV0ZG93biBjb21wbGV0ZVxuIik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd21faHVicy5jIGIvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMKaW5kZXggYjM3MTA2Ni4uYjYyMDk2NiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMKQEAgLTUwLDE2ICs1MCwxNiBAQAogCSJWTUlEIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3BlYWtlcl9yZWYgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfU1BFQUtFUl9NSVhFUiwgOCwgMiwgc3BlYWtlcl9yZWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BlYWtlcl9yZWYsCisJCQkgICAgV004OTkzX1NQRUFLRVJfTUlYRVIsIDgsIHNwZWFrZXJfcmVmX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqc3BlYWtlcl9tb2RlX3RleHRbXSA9IHsKIAkiQ2xhc3MgRCIsCiAJIkNsYXNzIEFCIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3BlYWtlcl9tb2RlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTkzX1NQS01JWFJfQVRURU5VQVRJT04sIDgsIDIsIHNwZWFrZXJfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGVha2VyX21vZGUsCisJCQkgICAgV004OTkzX1NQS01JWFJfQVRURU5VQVRJT04sIDgsIHNwZWFrZXJfbW9kZV90ZXh0KTsKIAogc3RhdGljIHZvaWQgd2FpdF9mb3JfZGNfc2Vydm8oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgb3ApCiB7CkBAIC03MzUsMTUgKzczNSwxNSBAQAogCSJEQUMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBocGxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19PVVRQVVRfTUlYRVIxLCA4LCAyLCBocF9tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaHBsX2VudW0sCisJCQkgICAgV004OTkzX09VVFBVVF9NSVhFUjEsIDgsIGhwX211eF90ZXh0KTsKIAogY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd21faHVic19ocGxfbXV4ID0KIAlXTV9IVUJTX0VOVU1fVygiTGVmdCBIZWFkcGhvbmUgTXV4IiwgaHBsX2VudW0pOwogRVhQT1JUX1NZTUJPTF9HUEwod21faHVic19ocGxfbXV4KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBocHJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19PVVRQVVRfTUlYRVIyLCA4LCAyLCBocF9tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaHByX2VudW0sCisJCQkgICAgV004OTkzX09VVFBVVF9NSVhFUjIsIDgsIGhwX211eF90ZXh0KTsKIAogY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd21faHVic19ocHJfbXV4ID0KIAlXTV9IVUJTX0VOVU1fVygiUmlnaHQgSGVhZHBob25lIE11eCIsIGhwcl9lbnVtKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktZXZtLmMgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWV2bS5jCmluZGV4IDVlM2JjM2MuLmNhYjk4YTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktZXZtLmMKKysrIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1ldm0uYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvZWRtYS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpAQCAtMzAsOSArMzEsMzQgQEAKICNpbmNsdWRlICJkYXZpbmNpLWkycy5oIgogCiBzdHJ1Y3Qgc25kX3NvY19jYXJkX2RydmRhdGFfZGF2aW5jaSB7CisJc3RydWN0IGNsayAqbWNsazsKIAl1bnNpZ25lZCBzeXNjbGs7CiB9OwogCitzdGF0aWMgaW50IGV2bV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpzb2NfY2FyZCA9IHJ0ZC0+Y29kZWMtPmNhcmQ7CisJc3RydWN0IHNuZF9zb2NfY2FyZF9kcnZkYXRhX2RhdmluY2kgKmRydmRhdGEgPQorCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoc29jX2NhcmQpOworCisJaWYgKGRydmRhdGEtPm1jbGspCisJCXJldHVybiBjbGtfcHJlcGFyZV9lbmFibGUoZHJ2ZGF0YS0+bWNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXZtX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpzb2NfY2FyZCA9IHJ0ZC0+Y29kZWMtPmNhcmQ7CisJc3RydWN0IHNuZF9zb2NfY2FyZF9kcnZkYXRhX2RhdmluY2kgKmRydmRhdGEgPQorCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoc29jX2NhcmQpOworCisJaWYgKGRydmRhdGEtPm1jbGspCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnZkYXRhLT5tY2xrKTsKK30KKwogc3RhdGljIGludCBldm1faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQogewpAQCAtNTksNiArODUsOCBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGV2bV9vcHMgPSB7CisJLnN0YXJ0dXAgPSBldm1fc3RhcnR1cCwKKwkuc2h1dGRvd24gPSBldm1fc2h1dGRvd24sCiAJLmh3X3BhcmFtcyA9IGV2bV9od19wYXJhbXMsCiB9OwogCkBAIC05NSwzNSArMTIzLDI5IEBACiAvKiBMb2dpYyBmb3IgYSBhaWMzeCBhcyBjb25uZWN0ZWQgb24gYSBkYXZpbmNpLWV2bSAqLwogc3RhdGljIGludCBldm1fYWljM3hfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogeworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQ7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGNvZGVjLT5jYXJkLT5kZXYtPm9mX25vZGU7CiAJaW50IHJldDsKIAogCS8qIEFkZCBkYXZpbmNpLWV2bSBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBhaWMzeF9kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scygmY2FyZC0+ZGFwbSwgYWljM3hfZGFwbV93aWRnZXRzLAogCQkJCSAgQVJSQVlfU0laRShhaWMzeF9kYXBtX3dpZGdldHMpKTsKIAogCWlmIChucCkgewotCQlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3JvdXRpbmcoY29kZWMtPmNhcmQsCi0JCQkJCQkJInRpLGF1ZGlvLXJvdXRpbmciKTsKKwkJcmV0ID0gc25kX3NvY19vZl9wYXJzZV9hdWRpb19yb3V0aW5nKGNhcmQsICJ0aSxhdWRpby1yb3V0aW5nIik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0gZWxzZSB7CiAJCS8qIFNldCB1cCBkYXZpbmNpLWV2bSBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLwotCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKCZjYXJkLT5kYXBtLCBhdWRpb19tYXAsCisJCQkJCUFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAJfQogCiAJLyogbm90IGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTU9OT19MT1VUIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIUExDT00iKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhQUkNPTSIpOwotCi0JLyogYWx3YXlzIGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lIE91dCIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lIEluIik7CisJc25kX3NvY19kYXBtX25jX3BpbigmY29kZWMtPmRhcG0sICJNT05PX0xPVVQiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKCZjb2RlYy0+ZGFwbSwgIkhQTENPTSIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oJmNvZGVjLT5kYXBtLCAiSFBSQ09NIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM0OCw2ICszNzAsNyBAQAogCQlvZl9tYXRjaF9kZXZpY2Uob2ZfbWF0Y2hfcHRyKGRhdmluY2lfZXZtX2R0X2lkcyksICZwZGV2LT5kZXYpOwogCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWkgPSAoc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKikgbWF0Y2gtPmRhdGE7CiAJc3RydWN0IHNuZF9zb2NfY2FyZF9kcnZkYXRhX2RhdmluY2kgKmRydmRhdGEgPSBOVUxMOworCXN0cnVjdCBjbGsgKm1jbGs7CiAJaW50IHJldCA9IDA7CiAKIAlldm1fc29jX2NhcmQuZGFpX2xpbmsgPSBkYWk7CkBAIC0zNjcsMTMgKzM5MCwzOCBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwltY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJtY2xrIik7CisJaWYgKFBUUl9FUlIobWNsaykgPT0gLUVQUk9CRV9ERUZFUikgeworCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwl9IGVsc2UgaWYgKElTX0VSUihtY2xrKSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJtY2xrIG5vdCBmb3VuZC5cbiIpOworCQltY2xrID0gTlVMTDsKKwl9CisKIAlkcnZkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZHJ2ZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZHJ2ZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlkcnZkYXRhLT5tY2xrID0gbWNsazsKKwogCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksY29kZWMtY2xvY2stcmF0ZSIsICZkcnZkYXRhLT5zeXNjbGspOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChyZXQgPCAwKSB7CisJCWlmICghZHJ2ZGF0YS0+bWNsaykgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJObyBjbG9jayBvciBjbG9jayByYXRlIGRlZmluZWQuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWRydmRhdGEtPnN5c2NsayA9IGNsa19nZXRfcmF0ZShkcnZkYXRhLT5tY2xrKTsKKwl9IGVsc2UgaWYgKGRydmRhdGEtPm1jbGspIHsKKwkJdW5zaWduZWQgaW50IHJlcXVlc3RkX3JhdGUgPSBkcnZkYXRhLT5zeXNjbGs7CisJCWNsa19zZXRfcmF0ZShkcnZkYXRhLT5tY2xrLCBkcnZkYXRhLT5zeXNjbGspOworCQlkcnZkYXRhLT5zeXNjbGsgPSBjbGtfZ2V0X3JhdGUoZHJ2ZGF0YS0+bWNsayk7CisJCWlmIChkcnZkYXRhLT5zeXNjbGsgIT0gcmVxdWVzdGRfcmF0ZSkKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkJICJDb3VsZCBub3QgZ2V0IHJlcXVlc3RlZCByYXRlICV1IHVzaW5nICV1LlxuIiwKKwkJCQkgcmVxdWVzdGRfcmF0ZSwgZHJ2ZGF0YS0+c3lzY2xrKTsKKwl9CiAKIAlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoJmV2bV9zb2NfY2FyZCwgZHJ2ZGF0YSk7CiAJcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnBkZXYtPmRldiwgJmV2bV9zb2NfY2FyZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLW1jYXNwLmMgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLW1jYXNwLmMKaW5kZXggNjcwYWZhMi4uYTAxYWU5NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1tY2FzcC5jCisrKyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktbWNhc3AuYwpAQCAtMzcsNiArMzcsMTYgQEAKICNpbmNsdWRlICJkYXZpbmNpLXBjbS5oIgogI2luY2x1ZGUgImRhdmluY2ktbWNhc3AuaCIKIAorc3RydWN0IGRhdmluY2lfbWNhc3BfY29udGV4dCB7CisJdTMyCXR4Zm10Y3RsOworCXUzMglyeGZtdGN0bDsKKwl1MzIJdHhmbXQ7CisJdTMyCXJ4Zm10OworCXUzMglhY2xreGN0bDsKKwl1MzIJYWNsa3JjdGw7CisJdTMyCXBkaXI7Cit9OworCiBzdHJ1Y3QgZGF2aW5jaV9tY2FzcCB7CiAJc3RydWN0IGRhdmluY2lfcGNtX2RtYV9wYXJhbXMgZG1hX3BhcmFtc1syXTsKIAlzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgZG1hX2RhdGFbMl07CkBAIC01Myw2ICs2Myw5IEBACiAJdTE2CWJjbGtfbHJjbGtfcmF0aW87CiAJaW50CXN0cmVhbXM7CiAKKwlpbnQJc3lzY2xrX2ZyZXE7CisJYm9vbAliY2xrX21hc3RlcjsKKwogCS8qIE1jQVNQIEZJRk8gcmVsYXRlZCAqLwogCXU4CXR4bnVtZXZ0OwogCXU4CXJ4bnVtZXZ0OwpAQCAtNjAsMTUgKzczLDcgQEAKIAlib29sCWRhdF9wb3J0OwogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCi0Jc3RydWN0IHsKLQkJdTMyCXR4Zm10Y3RsOwotCQl1MzIJcnhmbXRjdGw7Ci0JCXUzMgl0eGZtdDsKLQkJdTMyCXJ4Zm10OwotCQl1MzIJYWNsa3hjdGw7Ci0JCXUzMglhY2xrcmN0bDsKLQkJdTMyCXBkaXI7Ci0JfSBjb250ZXh0OworCXN0cnVjdCBkYXZpbmNpX21jYXNwX2NvbnRleHQgY29udGV4dDsKICNlbmRpZgogfTsKIApAQCAtMjk0LDYgKzI5OSw3IEBACiAKIAkJbWNhc3Bfc2V0X2JpdHMobWNhc3AsIERBVklOQ0lfTUNBU1BfUERJUl9SRUcsIEFDTEtYIHwgQUNMS1IpOwogCQltY2FzcF9zZXRfYml0cyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9QRElSX1JFRywgQUZTWCB8IEFGU1IpOworCQltY2FzcC0+YmNsa19tYXN0ZXIgPSAxOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRlM6CiAJCS8qIGNvZGVjIGlzIGNsb2NrIG1hc3RlciBhbmQgZnJhbWUgc2xhdmUgKi8KQEAgLTMwNSw2ICszMTEsNyBAQAogCiAJCW1jYXNwX2Nscl9iaXRzKG1jYXNwLCBEQVZJTkNJX01DQVNQX1BESVJfUkVHLCBBQ0xLWCB8IEFDTEtSKTsKIAkJbWNhc3Bfc2V0X2JpdHMobWNhc3AsIERBVklOQ0lfTUNBU1BfUERJUl9SRUcsIEFGU1ggfCBBRlNSKTsKKwkJbWNhc3AtPmJjbGtfbWFzdGVyID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgogCQkvKiBjb2RlYyBpcyBjbG9jayBhbmQgZnJhbWUgbWFzdGVyICovCkBAIC0zMTYsNiArMzIzLDcgQEAKIAogCQltY2FzcF9jbHJfYml0cyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9QRElSX1JFRywKIAkJCSAgICAgICBBQ0xLWCB8IEFIQ0xLWCB8IEFGU1ggfCBBQ0xLUiB8IEFIQ0xLUiB8IEFGU1IpOworCQltY2FzcC0+YmNsa19tYXN0ZXIgPSAwOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC00MTAsNiArNDE4LDggQEAKIAkJbWNhc3BfY2xyX2JpdHMobWNhc3AsIERBVklOQ0lfTUNBU1BfUERJUl9SRUcsIEFIQ0xLWCk7CiAJfQogCisJbWNhc3AtPnN5c2Nsa19mcmVxID0gZnJlcTsKKwogCXJldHVybiAwOwogfQogCkBAIC02MDMsMjAgKzYxMywyMyBAQAogCXU4IGZpZm9fbGV2ZWw7CiAJdTggc2xvdHMgPSBtY2FzcC0+dGRtX3Nsb3RzOwogCXU4IGFjdGl2ZV9zZXJpYWxpemVyczsKLQlpbnQgY2hhbm5lbHM7CisJaW50IGNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CiAJaW50IHJldDsKLQlzdHJ1Y3Qgc25kX2ludGVydmFsICpwY21fY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCi0JCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7Ci0JY2hhbm5lbHMgPSBwY21fY2hhbm5lbHMtPm1pbjsKIAotCWFjdGl2ZV9zZXJpYWxpemVycyA9IChjaGFubmVscyArIHNsb3RzIC0gMSkgLyBzbG90czsKKwkvKiBJZiBtY2FzcCBpcyBCQ0xLIG1hc3RlciB3ZSBuZWVkIHRvIHNldCBCQ0xLIGRpdmlkZXIgKi8KKwlpZiAobWNhc3AtPmJjbGtfbWFzdGVyKSB7CisJCXVuc2lnbmVkIGludCBiY2xrX2ZyZXEgPSBzbmRfc29jX3BhcmFtc190b19iY2xrKHBhcmFtcyk7CisJCWlmIChtY2FzcC0+c3lzY2xrX2ZyZXEgJSBiY2xrX2ZyZXEgIT0gMCkgeworCQkJZGV2X2VycihtY2FzcC0+ZGV2LCAiQ2FuJ3QgcHJvZHVjZSByZXF1cmVkIEJDTEtcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZGF2aW5jaV9tY2FzcF9zZXRfY2xrZGl2KAorCQkJY3B1X2RhaSwgMSwgbWNhc3AtPnN5c2Nsa19mcmVxIC8gYmNsa19mcmVxKTsKKwl9CiAKLQlpZiAobWNhc3BfY29tbW9uX2h3X3BhcmFtKG1jYXNwLCBzdWJzdHJlYW0tPnN0cmVhbSwgY2hhbm5lbHMpID09IC1FSU5WQUwpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQlmaWZvX2xldmVsID0gbWNhc3AtPnR4bnVtZXZ0ICogYWN0aXZlX3NlcmlhbGl6ZXJzOwotCWVsc2UKLQkJZmlmb19sZXZlbCA9IG1jYXNwLT5yeG51bWV2dCAqIGFjdGl2ZV9zZXJpYWxpemVyczsKKwlyZXQgPSBtY2FzcF9jb21tb25faHdfcGFyYW0obWNhc3AsIHN1YnN0cmVhbS0+c3RyZWFtLCBjaGFubmVscyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWlmIChtY2FzcC0+b3BfbW9kZSA9PSBEQVZJTkNJX01DQVNQX0RJVF9NT0RFKQogCQlyZXQgPSBtY2FzcF9kaXRfaHdfcGFyYW0obWNhc3ApOwpAQCAtNjU4LDYgKzY3MSwxMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwkvKiBDYWxjdWxhdGUgRklGTyBsZXZlbCAqLworCWFjdGl2ZV9zZXJpYWxpemVycyA9IChjaGFubmVscyArIHNsb3RzIC0gMSkgLyBzbG90czsKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJZmlmb19sZXZlbCA9IG1jYXNwLT50eG51bWV2dCAqIGFjdGl2ZV9zZXJpYWxpemVyczsKKwllbHNlCisJCWZpZm9fbGV2ZWwgPSBtY2FzcC0+cnhudW1ldnQgKiBhY3RpdmVfc2VyaWFsaXplcnM7CisKIAlpZiAobWNhc3AtPnZlcnNpb24gPT0gTUNBU1BfVkVSU0lPTl8yICYmICFmaWZvX2xldmVsKQogCQlkbWFfcGFyYW1zLT5hY250ID0gNDsKIAllbHNlCkBAIC03MTksNiArNzM5LDQzIEBACiAJLnNldF9zeXNjbGsJPSBkYXZpbmNpX21jYXNwX3NldF9zeXNjbGssCiB9OwogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IGRhdmluY2lfbWNhc3Bfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9tY2FzcCAqbWNhc3AgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOworCXN0cnVjdCBkYXZpbmNpX21jYXNwX2NvbnRleHQgKmNvbnRleHQgPSAmbWNhc3AtPmNvbnRleHQ7CisKKwljb250ZXh0LT50eGZtdGN0bCA9IG1jYXNwX2dldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfVFhGTUNUTF9SRUcpOworCWNvbnRleHQtPnJ4Zm10Y3RsID0gbWNhc3BfZ2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9SWEZNQ1RMX1JFRyk7CisJY29udGV4dC0+dHhmbXQgPSBtY2FzcF9nZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1RYRk1UX1JFRyk7CisJY29udGV4dC0+cnhmbXQgPSBtY2FzcF9nZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1JYRk1UX1JFRyk7CisJY29udGV4dC0+YWNsa3hjdGwgPSBtY2FzcF9nZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX0FDTEtYQ1RMX1JFRyk7CisJY29udGV4dC0+YWNsa3JjdGwgPSBtY2FzcF9nZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX0FDTEtSQ1RMX1JFRyk7CisJY29udGV4dC0+cGRpciA9IG1jYXNwX2dldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfUERJUl9SRUcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGF2aW5jaV9tY2FzcF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IGRhdmluY2lfbWNhc3AgKm1jYXNwID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKKwlzdHJ1Y3QgZGF2aW5jaV9tY2FzcF9jb250ZXh0ICpjb250ZXh0ID0gJm1jYXNwLT5jb250ZXh0OworCisJbWNhc3Bfc2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9UWEZNQ1RMX1JFRywgY29udGV4dC0+dHhmbXRjdGwpOworCW1jYXNwX3NldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfUlhGTUNUTF9SRUcsIGNvbnRleHQtPnJ4Zm10Y3RsKTsKKwltY2FzcF9zZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1RYRk1UX1JFRywgY29udGV4dC0+dHhmbXQpOworCW1jYXNwX3NldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfUlhGTVRfUkVHLCBjb250ZXh0LT5yeGZtdCk7CisJbWNhc3Bfc2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9BQ0xLWENUTF9SRUcsIGNvbnRleHQtPmFjbGt4Y3RsKTsKKwltY2FzcF9zZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX0FDTEtSQ1RMX1JFRywgY29udGV4dC0+YWNsa3JjdGwpOworCW1jYXNwX3NldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfUERJUl9SRUcsIGNvbnRleHQtPnBkaXIpOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBkYXZpbmNpX21jYXNwX3N1c3BlbmQgTlVMTAorI2RlZmluZSBkYXZpbmNpX21jYXNwX3Jlc3VtZSBOVUxMCisjZW5kaWYKKwogI2RlZmluZSBEQVZJTkNJX01DQVNQX1JBVEVTCVNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwCiAKICNkZWZpbmUgREFWSU5DSV9NQ0FTUF9QQ01fRk1UUyAoU05EUlZfUENNX0ZNVEJJVF9TOCB8IFwKQEAgLTczNSw2ICs3OTIsOCBAQAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgZGF2aW5jaV9tY2FzcF9kYWlbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJkYXZpbmNpLW1jYXNwLjAiLAorCQkuc3VzcGVuZAk9IGRhdmluY2lfbWNhc3Bfc3VzcGVuZCwKKwkJLnJlc3VtZQkJPSBkYXZpbmNpX21jYXNwX3Jlc3VtZSwKIAkJLnBsYXliYWNrCT0gewogCQkJLmNoYW5uZWxzX21pbgk9IDIsCiAJCQkuY2hhbm5lbHNfbWF4CT0gMzIgKiAxNiwKQEAgLTc2OCwyOCArODI3LDI4IEBACiB9OwogCiAvKiBTb21lIEhXIHNwZWNpZmljIHZhbHVlcyBhbmQgZGVmYXVsdHMuIFRoZSByZXN0IGlzIGZpbGxlZCBpbiBmcm9tIERULiAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSBkbTY0NnhfbWNhc3BfcGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IGRhdmluY2lfbWNhc3BfcGRhdGEgZG02NDZ4X21jYXNwX3BkYXRhID0gewogCS50eF9kbWFfb2Zmc2V0ID0gMHg0MDAsCiAJLnJ4X2RtYV9vZmZzZXQgPSAweDQwMCwKIAkuYXNwX2NoYW5fcSA9IEVWRU5UUV8wLAogCS52ZXJzaW9uID0gTUNBU1BfVkVSU0lPTl8xLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSBkYTgzMF9tY2FzcF9wZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9tY2FzcF9wZGF0YSBkYTgzMF9tY2FzcF9wZGF0YSA9IHsKIAkudHhfZG1hX29mZnNldCA9IDB4MjAwMCwKIAkucnhfZG1hX29mZnNldCA9IDB4MjAwMCwKIAkuYXNwX2NoYW5fcSA9IEVWRU5UUV8wLAogCS52ZXJzaW9uID0gTUNBU1BfVkVSU0lPTl8yLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSBhbTMzeHhfbWNhc3BfcGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IGRhdmluY2lfbWNhc3BfcGRhdGEgYW0zM3h4X21jYXNwX3BkYXRhID0gewogCS50eF9kbWFfb2Zmc2V0ID0gMCwKIAkucnhfZG1hX29mZnNldCA9IDAsCiAJLmFzcF9jaGFuX3EgPSBFVkVOVFFfMCwKIAkudmVyc2lvbiA9IE1DQVNQX1ZFUlNJT05fMywKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BsYXRmb3JtX2RhdGEgZHJhN19tY2FzcF9wZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9tY2FzcF9wZGF0YSBkcmE3X21jYXNwX3BkYXRhID0gewogCS50eF9kbWFfb2Zmc2V0ID0gMHgyMDAsCiAJLnJ4X2RtYV9vZmZzZXQgPSAweDI4NCwKIAkuYXNwX2NoYW5fcSA9IEVWRU5UUV8wLApAQCAtODU3LDExICs5MTYsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wbGF0Zm9ybV9kYXRhICpkYXZpbmNpX21jYXNwX3NldF9wZGF0YV9mcm9tX29mKAorc3RhdGljIHN0cnVjdCBkYXZpbmNpX21jYXNwX3BkYXRhICpkYXZpbmNpX21jYXNwX3NldF9wZGF0YV9mcm9tX29mKAogCQkJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7Ci0Jc3RydWN0IHNuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CisJc3RydWN0IGRhdmluY2lfbWNhc3BfcGRhdGEgKnBkYXRhID0gTlVMTDsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCA9CiAJCQlvZl9tYXRjaF9kZXZpY2UobWNhc3BfZHRfaWRzLCAmcGRldi0+ZGV2KTsKIAlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzIGRtYV9zcGVjOwpAQCAtODc0LDcgKzkzMyw3IEBACiAJCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJCXJldHVybiBwZGF0YTsKIAl9IGVsc2UgaWYgKG1hdGNoKSB7Ci0JCXBkYXRhID0gKHN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSAqKSBtYXRjaC0+ZGF0YTsKKwkJcGRhdGEgPSAoc3RydWN0IGRhdmluY2lfbWNhc3BfcGRhdGEqKSBtYXRjaC0+ZGF0YTsKIAl9IGVsc2UgewogCQkvKiBjb250cm9sIHNob3VsZG4ndCByZWFjaCBoZXJlLiBzb21ldGhpbmcgaXMgd3JvbmcgKi8KIAkJcmV0ID0gLUVJTlZBTDsKQEAgLTk2Niw5ICsxMDI1LDEwIEBACiAKIHN0YXRpYyBpbnQgZGF2aW5jaV9tY2FzcF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBkYXZpbmNpX3BjbV9kbWFfcGFyYW1zICpkbWFfZGF0YTsKKwlzdHJ1Y3QgZGF2aW5jaV9wY21fZG1hX3BhcmFtcyAqZG1hX3BhcmFtczsKKwlzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgKmRtYV9kYXRhOwogCXN0cnVjdCByZXNvdXJjZSAqbWVtLCAqaW9hcmVhLCAqcmVzLCAqZGF0OwotCXN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGRhdmluY2lfbWNhc3BfcGRhdGEgKnBkYXRhOwogCXN0cnVjdCBkYXZpbmNpX21jYXNwICptY2FzcDsKIAlpbnQgcmV0OwogCkBAIC0xMDM1LDQxICsxMDk1LDQ5IEBACiAJaWYgKGRhdCkKIAkJbWNhc3AtPmRhdF9wb3J0ID0gdHJ1ZTsKIAotCWRtYV9kYXRhID0gJm1jYXNwLT5kbWFfcGFyYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdOwotCWRtYV9kYXRhLT5hc3BfY2hhbl9xID0gcGRhdGEtPmFzcF9jaGFuX3E7Ci0JZG1hX2RhdGEtPnJhbV9jaGFuX3EgPSBwZGF0YS0+cmFtX2NoYW5fcTsKLQlkbWFfZGF0YS0+c3JhbV9wb29sID0gcGRhdGEtPnNyYW1fcG9vbDsKLQlkbWFfZGF0YS0+c3JhbV9zaXplID0gcGRhdGEtPnNyYW1fc2l6ZV9wbGF5YmFjazsKKwlkbWFfcGFyYW1zID0gJm1jYXNwLT5kbWFfcGFyYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdOworCWRtYV9kYXRhID0gJm1jYXNwLT5kbWFfZGF0YVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXTsKKwlkbWFfcGFyYW1zLT5hc3BfY2hhbl9xID0gcGRhdGEtPmFzcF9jaGFuX3E7CisJZG1hX3BhcmFtcy0+cmFtX2NoYW5fcSA9IHBkYXRhLT5yYW1fY2hhbl9xOworCWRtYV9wYXJhbXMtPnNyYW1fcG9vbCA9IHBkYXRhLT5zcmFtX3Bvb2w7CisJZG1hX3BhcmFtcy0+c3JhbV9zaXplID0gcGRhdGEtPnNyYW1fc2l6ZV9wbGF5YmFjazsKIAlpZiAoZGF0KQotCQlkbWFfZGF0YS0+ZG1hX2FkZHIgPSBkYXQtPnN0YXJ0OworCQlkbWFfcGFyYW1zLT5kbWFfYWRkciA9IGRhdC0+c3RhcnQ7CiAJZWxzZQotCQlkbWFfZGF0YS0+ZG1hX2FkZHIgPSBtZW0tPnN0YXJ0ICsgcGRhdGEtPnR4X2RtYV9vZmZzZXQ7CisJCWRtYV9wYXJhbXMtPmRtYV9hZGRyID0gbWVtLT5zdGFydCArIHBkYXRhLT50eF9kbWFfb2Zmc2V0OwogCiAJLyogVW5jb25kaXRpb25hbCBkbWFlbmdpbmUgc3R1ZmYgKi8KLQltY2FzcC0+ZG1hX2RhdGFbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uYWRkciA9IGRtYV9kYXRhLT5kbWFfYWRkcjsKKwlkbWFfZGF0YS0+YWRkciA9IGRtYV9wYXJhbXMtPmRtYV9hZGRyOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAwKTsKIAlpZiAocmVzKQotCQlkbWFfZGF0YS0+Y2hhbm5lbCA9IHJlcy0+c3RhcnQ7CisJCWRtYV9wYXJhbXMtPmNoYW5uZWwgPSByZXMtPnN0YXJ0OwogCWVsc2UKLQkJZG1hX2RhdGEtPmNoYW5uZWwgPSBwZGF0YS0+dHhfZG1hX2NoYW5uZWw7CisJCWRtYV9wYXJhbXMtPmNoYW5uZWwgPSBwZGF0YS0+dHhfZG1hX2NoYW5uZWw7CiAKLQlkbWFfZGF0YSA9ICZtY2FzcC0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdOwotCWRtYV9kYXRhLT5hc3BfY2hhbl9xID0gcGRhdGEtPmFzcF9jaGFuX3E7Ci0JZG1hX2RhdGEtPnJhbV9jaGFuX3EgPSBwZGF0YS0+cmFtX2NoYW5fcTsKLQlkbWFfZGF0YS0+c3JhbV9wb29sID0gcGRhdGEtPnNyYW1fcG9vbDsKLQlkbWFfZGF0YS0+c3JhbV9zaXplID0gcGRhdGEtPnNyYW1fc2l6ZV9jYXB0dXJlOwotCWlmIChkYXQpCi0JCWRtYV9kYXRhLT5kbWFfYWRkciA9IGRhdC0+c3RhcnQ7CisJLyogZG1hZW5naW5lIGZpbHRlciBkYXRhIGZvciBEVCBhbmQgbm9uLURUIGJvb3QgKi8KKwlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCisJCWRtYV9kYXRhLT5maWx0ZXJfZGF0YSA9ICJ0eCI7CiAJZWxzZQotCQlkbWFfZGF0YS0+ZG1hX2FkZHIgPSBtZW0tPnN0YXJ0ICsgcGRhdGEtPnJ4X2RtYV9vZmZzZXQ7CisJCWRtYV9kYXRhLT5maWx0ZXJfZGF0YSA9ICZkbWFfcGFyYW1zLT5jaGFubmVsOworCisJZG1hX3BhcmFtcyA9ICZtY2FzcC0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdOworCWRtYV9kYXRhID0gJm1jYXNwLT5kbWFfZGF0YVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdOworCWRtYV9wYXJhbXMtPmFzcF9jaGFuX3EgPSBwZGF0YS0+YXNwX2NoYW5fcTsKKwlkbWFfcGFyYW1zLT5yYW1fY2hhbl9xID0gcGRhdGEtPnJhbV9jaGFuX3E7CisJZG1hX3BhcmFtcy0+c3JhbV9wb29sID0gcGRhdGEtPnNyYW1fcG9vbDsKKwlkbWFfcGFyYW1zLT5zcmFtX3NpemUgPSBwZGF0YS0+c3JhbV9zaXplX2NhcHR1cmU7CisJaWYgKGRhdCkKKwkJZG1hX3BhcmFtcy0+ZG1hX2FkZHIgPSBkYXQtPnN0YXJ0OworCWVsc2UKKwkJZG1hX3BhcmFtcy0+ZG1hX2FkZHIgPSBtZW0tPnN0YXJ0ICsgcGRhdGEtPnJ4X2RtYV9vZmZzZXQ7CiAKIAkvKiBVbmNvbmRpdGlvbmFsIGRtYWVuZ2luZSBzdHVmZiAqLwotCW1jYXNwLT5kbWFfZGF0YVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLmFkZHIgPSBkbWFfZGF0YS0+ZG1hX2FkZHI7CisJZG1hX2RhdGEtPmFkZHIgPSBkbWFfcGFyYW1zLT5kbWFfYWRkcjsKIAogCWlmIChtY2FzcC0+dmVyc2lvbiA8IE1DQVNQX1ZFUlNJT05fMykgewogCQltY2FzcC0+Zmlmb19iYXNlID0gREFWSU5DSV9NQ0FTUF9WMl9BRklGT19CQVNFOwotCQkvKiBkbWFfZGF0YS0+ZG1hX2FkZHIgaXMgcG9pbnRpbmcgdG8gdGhlIGRhdGEgcG9ydCBhZGRyZXNzICovCisJCS8qIGRtYV9wYXJhbXMtPmRtYV9hZGRyIGlzIHBvaW50aW5nIHRvIHRoZSBkYXRhIHBvcnQgYWRkcmVzcyAqLwogCQltY2FzcC0+ZGF0X3BvcnQgPSB0cnVlOwogCX0gZWxzZSB7CiAJCW1jYXNwLT5maWZvX2Jhc2UgPSBEQVZJTkNJX01DQVNQX1YzX0FGSUZPX0JBU0U7CkBAIC0xMDc3LDEzICsxMTQ1LDE1IEBACiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9ETUEsIDEpOwogCWlmIChyZXMpCi0JCWRtYV9kYXRhLT5jaGFubmVsID0gcmVzLT5zdGFydDsKKwkJZG1hX3BhcmFtcy0+Y2hhbm5lbCA9IHJlcy0+c3RhcnQ7CiAJZWxzZQotCQlkbWFfZGF0YS0+Y2hhbm5lbCA9IHBkYXRhLT5yeF9kbWFfY2hhbm5lbDsKKwkJZG1hX3BhcmFtcy0+Y2hhbm5lbCA9IHBkYXRhLT5yeF9kbWFfY2hhbm5lbDsKIAotCS8qIFVuY29uZGl0aW9uYWwgZG1hZW5naW5lIHN0dWZmICovCi0JbWNhc3AtPmRtYV9kYXRhW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLmZpbHRlcl9kYXRhID0gInR4IjsKLQltY2FzcC0+ZG1hX2RhdGFbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5maWx0ZXJfZGF0YSA9ICJyeCI7CisJLyogZG1hZW5naW5lIGZpbHRlciBkYXRhIGZvciBEVCBhbmQgbm9uLURUIGJvb3QgKi8KKwlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCisJCWRtYV9kYXRhLT5maWx0ZXJfZGF0YSA9ICJyeCI7CisJZWxzZQorCQlkbWFfZGF0YS0+ZmlsdGVyX2RhdGEgPSAmZG1hX3BhcmFtcy0+Y2hhbm5lbDsKIAogCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBtY2FzcCk7CiAKQEAgLTExMjcsNDkgKzExOTcsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QTV9TTEVFUAotc3RhdGljIGludCBkYXZpbmNpX21jYXNwX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBkYXZpbmNpX21jYXNwICptY2FzcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JbWNhc3AtPmNvbnRleHQudHhmbXRjdGwgPSBtY2FzcF9nZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1RYRk1DVExfUkVHKTsKLQltY2FzcC0+Y29udGV4dC5yeGZtdGN0bCA9IG1jYXNwX2dldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfUlhGTUNUTF9SRUcpOwotCW1jYXNwLT5jb250ZXh0LnR4Zm10ID0gbWNhc3BfZ2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9UWEZNVF9SRUcpOwotCW1jYXNwLT5jb250ZXh0LnJ4Zm10ID0gbWNhc3BfZ2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9SWEZNVF9SRUcpOwotCW1jYXNwLT5jb250ZXh0LmFjbGt4Y3RsID0gbWNhc3BfZ2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9BQ0xLWENUTF9SRUcpOwotCW1jYXNwLT5jb250ZXh0LmFjbGtyY3RsID0gbWNhc3BfZ2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9BQ0xLUkNUTF9SRUcpOwotCW1jYXNwLT5jb250ZXh0LnBkaXIgPSBtY2FzcF9nZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1BESVJfUkVHKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRhdmluY2lfbWNhc3BfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZGF2aW5jaV9tY2FzcCAqbWNhc3AgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCW1jYXNwX3NldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfVFhGTUNUTF9SRUcsIG1jYXNwLT5jb250ZXh0LnR4Zm10Y3RsKTsKLQltY2FzcF9zZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1JYRk1DVExfUkVHLCBtY2FzcC0+Y29udGV4dC5yeGZtdGN0bCk7Ci0JbWNhc3Bfc2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9UWEZNVF9SRUcsIG1jYXNwLT5jb250ZXh0LnR4Zm10KTsKLQltY2FzcF9zZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1JYRk1UX1JFRywgbWNhc3AtPmNvbnRleHQucnhmbXQpOwotCW1jYXNwX3NldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfQUNMS1hDVExfUkVHLCBtY2FzcC0+Y29udGV4dC5hY2xreGN0bCk7Ci0JbWNhc3Bfc2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9BQ0xLUkNUTF9SRUcsIG1jYXNwLT5jb250ZXh0LmFjbGtyY3RsKTsKLQltY2FzcF9zZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1BESVJfUkVHLCBtY2FzcC0+Y29udGV4dC5wZGlyKTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLVNJTVBMRV9ERVZfUE1fT1BTKGRhdmluY2lfbWNhc3BfcG1fb3BzLAotCQkgIGRhdmluY2lfbWNhc3Bfc3VzcGVuZCwKLQkJICBkYXZpbmNpX21jYXNwX3Jlc3VtZSk7Ci0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRhdmluY2lfbWNhc3BfZHJpdmVyID0gewogCS5wcm9iZQkJPSBkYXZpbmNpX21jYXNwX3Byb2JlLAogCS5yZW1vdmUJCT0gZGF2aW5jaV9tY2FzcF9yZW1vdmUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gImRhdmluY2ktbWNhc3AiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQkJLnBtCT0gJmRhdmluY2lfbWNhc3BfcG1fb3BzLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBtY2FzcF9kdF9pZHMsCiAJfSwKIH07CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZGF2aW5jaS9lZG1hLXBjbS5jIGIvc291bmQvc29jL2RhdmluY2kvZWRtYS1wY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzhhZmIxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2RhdmluY2kvZWRtYS1wY20uYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogZWRtYS1wY20uYyAtIGVETUEgUENNIGRyaXZlciB1c2luZyBkbWFlbmdpbmUgZm9yIEFNM3h4eCwgQU00eHh4CisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogQXV0aG9yOiBQZXRlciBVamZhbHVzaSA8cGV0ZXIudWpmYWx1c2lAdGkuY29tPgorICoKKyAqIEJhc2VkIG9uOiBzb3VuZC9zb2MvdGVncmEvdGVncmFfcGNtLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgorI2luY2x1ZGUgPGxpbnV4L2VkbWEuaD4KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIGVkbWFfcGNtX2hhcmR3YXJlID0geworCS5pbmZvCQkJPSBTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fQkFUQ0ggfAorCQkJCSAgU05EUlZfUENNX0lORk9fUEFVU0UgfCBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAorCQkJCSAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQsCisJLmJ1ZmZlcl9ieXRlc19tYXgJPSAxMjggKiAxMDI0LAorCS5wZXJpb2RfYnl0ZXNfbWluCT0gMzIsCisJLnBlcmlvZF9ieXRlc19tYXgJPSA2NCAqIDEwMjQsCisJLnBlcmlvZHNfbWluCQk9IDIsCisJLnBlcmlvZHNfbWF4CQk9IDE5LCAvKiBMaW1pdCBieSBlZG1hIGRtYWVuZ2luZSBkcml2ZXIgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9wY21fY29uZmlnIGVkbWFfZG1hZW5naW5lX3BjbV9jb25maWcgPSB7CisJLnBjbV9oYXJkd2FyZSA9ICZlZG1hX3BjbV9oYXJkd2FyZSwKKwkucHJlcGFyZV9zbGF2ZV9jb25maWcgPSBzbmRfZG1hZW5naW5lX3BjbV9wcmVwYXJlX3NsYXZlX2NvbmZpZywKKwkuY29tcGF0X2ZpbHRlcl9mbiA9IGVkbWFfZmlsdGVyX2ZuLAorCS5wcmVhbGxvY19idWZmZXJfc2l6ZSA9IDEyOCAqIDEwMjQsCit9OworCitpbnQgZWRtYV9wY21fcGxhdGZvcm1fcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXZtX3NuZF9kbWFlbmdpbmVfcGNtX3JlZ2lzdGVyKGRldiwgJmVkbWFfZG1hZW5naW5lX3BjbV9jb25maWcsCisJCQkJCVNORF9ETUFFTkdJTkVfUENNX0ZMQUdfQ09NUEFUKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGVkbWFfcGNtX3BsYXRmb3JtX3JlZ2lzdGVyKTsKKworTU9EVUxFX0FVVEhPUigiUGV0ZXIgVWpmYWx1c2kgPHBldGVyLnVqZmFsdXNpQHRpLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiZURNQSBQQ00gQVNvQyBwbGF0Zm9ybSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9kYXZpbmNpL2VkbWEtcGNtLmggYi9zb3VuZC9zb2MvZGF2aW5jaS9lZG1hLXBjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NGMzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9lZG1hLXBjbS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBlZG1hLXBjbS5oIC0gZURNQSBQQ00gZHJpdmVyIHVzaW5nIGRtYWVuZ2luZSBmb3IgQU0zeHh4LCBBTTR4eHgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBBdXRob3I6IFBldGVyIFVqZmFsdXNpIDxwZXRlci51amZhbHVzaUB0aS5jb20+CisgKgorICogQmFzZWQgb246IHNvdW5kL3NvYy90ZWdyYS90ZWdyYV9wY20uaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fRURNQV9QQ01fSF9fCisjZGVmaW5lIF9fRURNQV9QQ01fSF9fCisKK2ludCBlZG1hX3BjbV9wbGF0Zm9ybV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisjZW5kaWYgLyogX19FRE1BX1BDTV9IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvS2NvbmZpZyBiL3NvdW5kL3NvYy9mc2wvS2NvbmZpZwppbmRleCAwN2Y4ZjE0Li4zMzhhOTE2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL0tjb25maWcKKysrIGIvc291bmQvc29jL2ZzbC9LY29uZmlnCkBAIC0xLDUgKzEsNiBAQAogY29uZmlnIFNORF9TT0NfRlNMX1NBSQogCXRyaXN0YXRlCisJc2VsZWN0IFJFR01BUF9NTUlPCiAJc2VsZWN0IFNORF9TT0NfR0VORVJJQ19ETUFFTkdJTkVfUENNCiAKIGNvbmZpZyBTTkRfU09DX0ZTTF9TU0kKQEAgLTcsOSArOCwxMiBAQAogCiBjb25maWcgU05EX1NPQ19GU0xfU1BESUYKIAl0cmlzdGF0ZQorCXNlbGVjdCBSRUdNQVBfTU1JTwogCiBjb25maWcgU05EX1NPQ19GU0xfRVNBSQogCXRyaXN0YXRlCisJc2VsZWN0IFJFR01BUF9NTUlPCisJc2VsZWN0IFNORF9TT0NfRlNMX1VUSUxTCiAKIGNvbmZpZyBTTkRfU09DX0ZTTF9VVElMUwogCXRyaXN0YXRlCkBAIC0xMTcsNiArMTIxLDcgQEAKIAogY29uZmlnIFNORF9TT0NfSU1YX1NTSQogCXRyaXN0YXRlCisJc2VsZWN0IFNORF9TT0NfRlNMX1VUSUxTCiAKIGNvbmZpZyBTTkRfU09DX0lNWF9QQ01fRklRCiAJdHJpc3RhdGUKQEAgLTE2OCwxMiArMTczLDE0IEBACiAJZGVwZW5kcyBvbiBNQUNIX0VVS1JFQV9NQklNWDI3X0JBU0VCT0FSRCBcCiAJCXx8IE1BQ0hfRVVLUkVBX01CSU1YU0QyNV9CQVNFQk9BUkQgXAogCQl8fCBNQUNIX0VVS1JFQV9NQklNWFNEMzVfQkFTRUJPQVJEIFwKLQkJfHwgTUFDSF9FVUtSRUFfTUJJTVhTRDUxX0JBU0VCT0FSRAorCQl8fCBNQUNIX0VVS1JFQV9NQklNWFNENTFfQkFTRUJPQVJEIFwKKwkJfHwgKE9GICYmIEFSTSkKIAlkZXBlbmRzIG9uIEkyQwotCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzCi0Jc2VsZWN0IFNORF9TT0NfSU1YX1BDTV9GSVEKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyM19JMkMKIAlzZWxlY3QgU05EX1NPQ19JTVhfQVVETVVYCiAJc2VsZWN0IFNORF9TT0NfSU1YX1NTSQorCXNlbGVjdCBTTkRfU09DX0ZTTF9TU0kKKwlzZWxlY3QgU05EX1NPQ19JTVhfUENNX0RNQQogCWhlbHAKIAkgIEVuYWJsZSBJMlMgYmFzZWQgYWNjZXNzIHRvIHRoZSBUTFYzMjBBSUMyM0IgY29kZWMgYXR0YWNoZWQKIAkgIHRvIHRoZSBTU0kgaW50ZXJmYWNlCkBAIC0yMDQsNyArMjExLDYgQEAKIAl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIGkuTVggYm9hcmRzIHdpdGggUy9QRElGIgogCXNlbGVjdCBTTkRfU09DX0lNWF9QQ01fRE1BCiAJc2VsZWN0IFNORF9TT0NfRlNMX1NQRElGCi0Jc2VsZWN0IFJFR01BUF9NTUlPCiAJaGVscAogCSAgU29DIEF1ZGlvIHN1cHBvcnQgZm9yIGkuTVggYm9hcmRzIHdpdGggUy9QRElGCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIGFuIGkuTVggYm9hcmQgd2l0aApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9ldWtyZWEtdGx2MzIwLmMgYi9zb3VuZC9zb2MvZnNsL2V1a3JlYS10bHYzMjAuYwppbmRleCA1OTgzNzQwLi5lYjA5M2Q1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2V1a3JlYS10bHYzMjAuYworKysgYi9zb3VuZC9zb2MvZnNsL2V1a3JlYS10bHYzMjAuYwpAQCAtMTUsOCArMTUsMTEgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpAQCAtMjYsNiArMjksNyBAQAogCiAjaW5jbHVkZSAiLi4vY29kZWNzL3RsdjMyMGFpYzIzLmgiCiAjaW5jbHVkZSAiaW14LXNzaS5oIgorI2luY2x1ZGUgImZzbF9zc2kuaCIKICNpbmNsdWRlICJpbXgtYXVkbXV4LmgiCiAKICNkZWZpbmUgQ09ERUNfQ0xPQ0sgMTIwMDAwMDAKQEAgLTQxLDcgKzQ1LDggQEAKIAlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksIFNORF9TT0NfREFJRk1UX0kyUyB8CiAJCQkJICBTTkRfU09DX0RBSUZNVF9OQl9ORiB8CiAJCQkJICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAocmV0KSB7CisJLyogZnNsX3NzaSBsYWNrcyB0aGUgc2V0X2ZtdCBvcHMuICovCisJaWYgKHJldCAmJiByZXQgIT0gLUVOT1RTVVBQKSB7CiAJCWRldl9lcnIoY3B1X2RhaS0+ZGV2LAogCQkJIkZhaWxlZCB0byBzZXQgdGhlIGNwdSBkYWkgZm9ybWF0LlxuIik7CiAJCXJldHVybiByZXQ7CkBAIC02MywxMSArNjgsMTMgQEAKIAkJCSJGYWlsZWQgdG8gc2V0IHRoZSBjb2RlYyBzeXNjbGsuXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CisKIAlzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QoY3B1X2RhaSwgMHhmZmZmZmZjLCAweGZmZmZmZmMsIDIsIDApOwogCiAJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2NsayhjcHVfZGFpLCBJTVhfU1NQX1NZU19DTEssIDAsCiAJCQkJU05EX1NPQ19DTE9DS19JTik7Ci0JaWYgKHJldCkgeworCS8qIGZzbF9zc2kgbGFja3MgdGhlIHNldF9zeXNjbGsgb3BzICovCisJaWYgKHJldCAmJiByZXQgIT0gLUVJTlZBTCkgewogCQlkZXZfZXJyKGNwdV9kYWktPmRldiwKIAkJCSJDYW4ndCBzZXQgdGhlIElNWF9TU1BfU1lTX0NMSyBDUFUgc3lzdGVtIGNsb2NrLlxuIik7CiAJCXJldHVybiByZXQ7CkBAIC04NCwxNCArOTEsMTAgQEAKIAkubmFtZQkJPSAidGx2MzIwYWljMjMiLAogCS5zdHJlYW1fbmFtZQk9ICJUTFYzMjBBSUMyMyIsCiAJLmNvZGVjX2RhaV9uYW1lCT0gInRsdjMyMGFpYzIzLWhpZmkiLAotCS5wbGF0Zm9ybV9uYW1lCT0gImlteC1zc2kuMCIsCi0JLmNvZGVjX25hbWUJPSAidGx2MzIwYWljMjMtY29kZWMuMC0wMDFhIiwKLQkuY3B1X2RhaV9uYW1lCT0gImlteC1zc2kuMCIsCiAJLm9wcwkJPSAmZXVrcmVhX3RsdjMyMF9zbmRfb3BzLAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgZXVrcmVhX3RsdjMyMCA9IHsKLQkubmFtZQkJPSAiY3B1aW14LWF1ZGlvIiwKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRhaV9saW5rCT0gJmV1a3JlYV90bHYzMjBfZGFpLAogCS5udW1fbGlua3MJPSAxLApAQCAtMTAxLDggKzEwNCw2NSBAQAogewogCWludCByZXQ7CiAJaW50IGludF9wb3J0ID0gMCwgZXh0X3BvcnQ7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc3NpX25wLCAqY29kZWNfbnA7CiAKLQlpZiAobWFjaGluZV9pc19ldWtyZWFfY3B1aW14MjcoKSkgeworCWV1a3JlYV90bHYzMjAuZGV2ID0gJnBkZXYtPmRldjsKKwlpZiAobnApIHsKKwkJcmV0ID0gc25kX3NvY19vZl9wYXJzZV9jYXJkX25hbWUoJmV1a3JlYV90bHYzMjAsCisJCQkJCQkgImV1a3JlYSxtb2RlbCIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJImV1a3JlYSxtb2RlbCBub2RlIG1pc3Npbmcgb3IgaW52YWxpZC5cbiIpOworCQkJZ290byBlcnI7CisJCX0KKworCQlzc2lfbnAgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkgICJzc2ktY29udHJvbGxlciIsIDApOworCQlpZiAoIXNzaV9ucCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJzc2ktY29udHJvbGxlciBtaXNzaW5nIG9yIGludmFsaWQuXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWNvZGVjX25wID0gb2ZfcGFyc2VfcGhhbmRsZShzc2lfbnAsICJjb2RlYy1oYW5kbGUiLCAwKTsKKwkJaWYgKGNvZGVjX25wKQorCQkJZXVrcmVhX3RsdjMyMF9kYWkuY29kZWNfb2Zfbm9kZSA9IGNvZGVjX25wOworCQllbHNlCisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb2RlYy1oYW5kbGUgbm9kZSBtaXNzaW5nIG9yIGludmFsaWQuXG4iKTsKKworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImZzbCxtdXgtaW50LXBvcnQiLCAmaW50X3BvcnQpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJImZzbCxtdXgtaW50LXBvcnQgbm9kZSBtaXNzaW5nIG9yIGludmFsaWQuXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJmc2wsbXV4LWV4dC1wb3J0IiwgJmV4dF9wb3J0KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJmc2wsbXV4LWV4dC1wb3J0IG5vZGUgbWlzc2luZyBvciBpbnZhbGlkLlxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJLyoKKwkJICogVGhlIHBvcnQgbnVtYmVyaW5nIGluIHRoZSBoYXJkd2FyZSBtYW51YWwgc3RhcnRzIGF0IDEsIHdoaWxlCisJCSAqIHRoZSBhdWRtdXggQVBJIGV4cGVjdHMgaXQgc3RhcnRzIGF0IDAuCisJCSAqLworCQlpbnRfcG9ydC0tOworCQlleHRfcG9ydC0tOworCisJCWV1a3JlYV90bHYzMjBfZGFpLmNwdV9vZl9ub2RlID0gc3NpX25wOworCQlldWtyZWFfdGx2MzIwX2RhaS5wbGF0Zm9ybV9vZl9ub2RlID0gc3NpX25wOworCX0gZWxzZSB7CisJCWV1a3JlYV90bHYzMjBfZGFpLmNwdV9kYWlfbmFtZSA9ICJpbXgtc3NpLjAiOworCQlldWtyZWFfdGx2MzIwX2RhaS5wbGF0Zm9ybV9uYW1lID0gImlteC1zc2kuMCI7CisJCWV1a3JlYV90bHYzMjBfZGFpLmNvZGVjX25hbWUgPSAidGx2MzIwYWljMjMtY29kZWMuMC0wMDFhIjsKKwkJZXVrcmVhX3RsdjMyMC5uYW1lID0gImNwdWlteC1hdWRpbyI7CisJfQorCisJaWYgKG1hY2hpbmVfaXNfZXVrcmVhX2NwdWlteDI3KCkgfHwKKwkgICAgb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxpbXgyMS1hdWRtdXgiKSkgewogCQlpbXhfYXVkbXV4X3YxX2NvbmZpZ3VyZV9wb3J0KE1YMjdfQVVETVVYX0hQQ1IxX1NTSTAsCiAJCQlJTVhfQVVETVVYX1YxX1BDUl9TWU4gfAogCQkJSU1YX0FVRE1VWF9WMV9QQ1JfVEZTRElSIHwKQEAgLTExOSw4ICsxNzksMTIgQEAKIAkJKTsKIAl9IGVsc2UgaWYgKG1hY2hpbmVfaXNfZXVrcmVhX2NwdWlteDI1c2QoKSB8fAogCQkgICBtYWNoaW5lX2lzX2V1a3JlYV9jcHVpbXgzNXNkKCkgfHwKLQkJICAgbWFjaGluZV9pc19ldWtyZWFfY3B1aW14NTFzZCgpKSB7Ci0JCWV4dF9wb3J0ID0gbWFjaGluZV9pc19ldWtyZWFfY3B1aW14MjVzZCgpID8gNCA6IDM7CisJCSAgIG1hY2hpbmVfaXNfZXVrcmVhX2NwdWlteDUxc2QoKSB8fAorCQkgICBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLGlteDMxLWF1ZG11eCIpKSB7CisJCWlmICghbnApCisJCQlleHRfcG9ydCA9IG1hY2hpbmVfaXNfZXVrcmVhX2NwdWlteDI1c2QoKSA/CisJCQkJNCA6IDM7CisKIAkJaW14X2F1ZG11eF92Ml9jb25maWd1cmVfcG9ydChpbnRfcG9ydCwKIAkJCUlNWF9BVURNVVhfVjJfUFRDUl9TWU4gfAogCQkJSU1YX0FVRE1VWF9WMl9QVENSX1RGU0RJUiB8CkBAIC0xMzQsMTQgKzE5OCwyNyBAQAogCQkJSU1YX0FVRE1VWF9WMl9QRENSX1JYRFNFTChpbnRfcG9ydCkKIAkJKTsKIAl9IGVsc2UgewotCQkvKiByZXR1cm4gaGFwcHkuIFdlIG1pZ2h0IHJ1biBvbiBhIHRvdGFsbHkgZGlmZmVyZW50IG1hY2hpbmUgKi8KLQkJcmV0dXJuIDA7CisJCWlmIChucCkgeworCQkJLyogVGhlIGV1a3JlYSxhc29jLXRsdjMyMCBkcml2ZXIgd2FzIGV4cGxpY2l0ZWx5CisJCQkgKiByZXF1ZXN0ZWQgKHRocm91Z2ggdGhlIGRldmljZSB0cmVlKS4KKwkJCSAqLworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJNaXNzaW5nIG9yIGludmFsaWQgYXVkbXV4IERUIG5vZGUuXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9IGVsc2UgeworCQkJLyogUmV0dXJuIGhhcHB5LgorCQkJICogV2UgbWlnaHQgcnVuIG9uIGEgdG90YWxseSBkaWZmZXJlbnQgbWFjaGluZS4KKwkJCSAqLworCQkJcmV0dXJuIDA7CisJCX0KIAl9CiAKLQlldWtyZWFfdGx2MzIwLmRldiA9ICZwZGV2LT5kZXY7CiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZldWtyZWFfdGx2MzIwKTsKK2VycjoKIAlpZiAocmV0KQogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzbmRfc29jX3JlZ2lzdGVyX2NhcmQgZmFpbGVkICglZClcbiIsIHJldCk7CisJaWYgKG5wKQorCQlvZl9ub2RlX3B1dChzc2lfbnApOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE1MywxMCArMjMwLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlteF90bHYzMjBfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJldWtyZWEsYXNvYy10bHYzMjAifSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBpbXhfdGx2MzIwX2R0X2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGV1a3JlYV90bHYzMjBfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gImV1a3JlYV90bHYzMjAiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gaW14X3RsdjMyMF9kdF9pZHMsCiAJfSwKIAkucHJvYmUgPSBldWtyZWFfdGx2MzIwX3Byb2JlLAogCS5yZW1vdmUgPSBldWtyZWFfdGx2MzIwX3JlbW92ZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvZnNsX2VzYWkuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX2VzYWkuYwppbmRleCBjODQwMjZjLi5jOGU1ZGIxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2ZzbF9lc2FpLmMKKysrIGIvc291bmQvc29jL2ZzbC9mc2xfZXNhaS5jCkBAIC0xOCw2ICsxOCw3IEBACiAKICNpbmNsdWRlICJmc2xfZXNhaS5oIgogI2luY2x1ZGUgImlteC1wY20uaCIKKyNpbmNsdWRlICJmc2xfdXRpbHMuaCIKIAogI2RlZmluZSBGU0xfRVNBSV9SQVRFUwkJU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAKICNkZWZpbmUgRlNMX0VTQUlfRk9STUFUUwkoU05EUlZfUENNX0ZNVEJJVF9TOCB8IFwKQEAgLTQzMSwxNyArNDMyLDI2IEBACiBzdGF0aWMgaW50IGZzbF9lc2FpX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7CisJaW50IHJldDsKIAlzdHJ1Y3QgZnNsX2VzYWkgKmVzYWlfcHJpdiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CiAKIAkvKgogCSAqIFNvbWUgcGxhdGZvcm1zIG1pZ2h0IHVzZSB0aGUgc2FtZSBiaXQgdG8gZ2F0ZSBhbGwgdGhyZWUgb3IgdHdvIG9mCiAJICogY2xvY2tzLCBzbyBrZWVwIGFsbCBjbG9ja3Mgb3Blbi9jbG9zZSBhdCB0aGUgc2FtZSB0aW1lIGZvciBzYWZldHkKIAkgKi8KLQljbGtfcHJlcGFyZV9lbmFibGUoZXNhaV9wcml2LT5jb3JlY2xrKTsKLQlpZiAoIUlTX0VSUihlc2FpX3ByaXYtPmV4dGFsY2xrKSkKLQkJY2xrX3ByZXBhcmVfZW5hYmxlKGVzYWlfcHJpdi0+ZXh0YWxjbGspOwotCWlmICghSVNfRVJSKGVzYWlfcHJpdi0+ZnN5c2NsaykpCi0JCWNsa19wcmVwYXJlX2VuYWJsZShlc2FpX3ByaXYtPmZzeXNjbGspOworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShlc2FpX3ByaXYtPmNvcmVjbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJaWYgKCFJU19FUlIoZXNhaV9wcml2LT5leHRhbGNsaykpIHsKKwkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGVzYWlfcHJpdi0+ZXh0YWxjbGspOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfZXh0YWxjazsKKwl9CisJaWYgKCFJU19FUlIoZXNhaV9wcml2LT5mc3lzY2xrKSkgeworCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZXNhaV9wcml2LT5mc3lzY2xrKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2ZzeXNjbGs7CisJfQogCiAJaWYgKCFkYWktPmFjdGl2ZSkgewogCQkvKiBSZXNldCBQb3J0IEMgKi8KQEAgLTQ2Myw2ICs0NzMsMTQgQEAKIAl9CiAKIAlyZXR1cm4gMDsKKworZXJyX2ZzeXNjbGs6CisJaWYgKCFJU19FUlIoZXNhaV9wcml2LT5leHRhbGNsaykpCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShlc2FpX3ByaXYtPmV4dGFsY2xrKTsKK2Vycl9leHRhbGNrOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShlc2FpX3ByaXYtPmNvcmVjbGspOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBmc2xfZXNhaV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCkBAIC01NjQsNiArNTgyLDcgQEAKIAkuaHdfcGFyYW1zID0gZnNsX2VzYWlfaHdfcGFyYW1zLAogCS5zZXRfc3lzY2xrID0gZnNsX2VzYWlfc2V0X2RhaV9zeXNjbGssCiAJLnNldF9mbXQgPSBmc2xfZXNhaV9zZXRfZGFpX2ZtdCwKKwkueGxhdGVfdGRtX3Nsb3RfbWFzayA9IGZzbF9hc29jX3hsYXRlX3RkbV9zbG90X21hc2ssCiAJLnNldF90ZG1fc2xvdCA9IGZzbF9lc2FpX3NldF9kYWlfdGRtX3Nsb3QsCiB9OwogCkBAIC02NjEsNyArNjgwLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBmc2xfZXNhaV9yZWdtYXBfY29uZmlnID0geworc3RhdGljIHN0cnVjdCByZWdtYXBfY29uZmlnIGZzbF9lc2FpX3JlZ21hcF9jb25maWcgPSB7CiAJLnJlZ19iaXRzID0gMzIsCiAJLnJlZ19zdHJpZGUgPSA0LAogCS52YWxfYml0cyA9IDMyLApAQCAtNjg3LDYgKzcwNiw5IEBACiAJZXNhaV9wcml2LT5wZGV2ID0gcGRldjsKIAlzdHJjcHkoZXNhaV9wcml2LT5uYW1lLCBucC0+bmFtZSk7CiAKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYmlnLWVuZGlhbiIpKQorCQlmc2xfZXNhaV9yZWdtYXBfY29uZmlnLnZhbF9mb3JtYXRfZW5kaWFuID0gUkVHTUFQX0VORElBTl9CSUc7CisKIAkvKiBHZXQgdGhlIGFkZHJlc3NlcyBhbmQgSVJRICovCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlyZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2ZzbF9zYWkuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NhaS5jCmluZGV4IGNkZDNmYTguLmM0YTQyMzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvZnNsX3NhaS5jCisrKyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NhaS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgpAQCAtMjIsMzQgKzIzLDYgQEAKIAogI2luY2x1ZGUgImZzbF9zYWkuaCIKIAotc3RhdGljIGlubGluZSB1MzIgc2FpX3JlYWRsKHN0cnVjdCBmc2xfc2FpICpzYWksCi0JCWNvbnN0IHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQl1MzIgdmFsOwotCi0JdmFsID0gX19yYXdfcmVhZGwoYWRkcik7Ci0KLQlpZiAobGlrZWx5KHNhaS0+YmlnX2VuZGlhbl9yZWdzKSkKLQkJdmFsID0gYmUzMl90b19jcHUodmFsKTsKLQllbHNlCi0JCXZhbCA9IGxlMzJfdG9fY3B1KHZhbCk7Ci0Jcm1iKCk7Ci0KLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2FpX3dyaXRlbChzdHJ1Y3QgZnNsX3NhaSAqc2FpLAotCQl1MzIgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0Jd21iKCk7Ci0JaWYgKGxpa2VseShzYWktPmJpZ19lbmRpYW5fcmVncykpCi0JCXZhbCA9IGNwdV90b19iZTMyKHZhbCk7Ci0JZWxzZQotCQl2YWwgPSBjcHVfdG9fbGUzMih2YWwpOwotCi0JX19yYXdfd3JpdGVsKHZhbCwgYWRkcik7Ci19Ci0KIHN0YXRpYyBpbnQgZnNsX3NhaV9zZXRfZGFpX3N5c2Nsa190cihzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWksCiAJCWludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZnNsX2RpcikKIHsKQEAgLTYxLDcgKzM0LDggQEAKIAllbHNlCiAJCXJlZ19jcjIgPSBGU0xfU0FJX1JDUjI7CiAKLQl2YWxfY3IyID0gc2FpX3JlYWRsKHNhaSwgc2FpLT5iYXNlICsgcmVnX2NyMik7CisJcmVnbWFwX3JlYWQoc2FpLT5yZWdtYXAsIHJlZ19jcjIsICZ2YWxfY3IyKTsKKwogCXZhbF9jcjIgJj0gfkZTTF9TQUlfQ1IyX01TRUxfTUFTSzsKIAogCXN3aXRjaCAoY2xrX2lkKSB7CkBAIC04MSw3ICs1NSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNhaV93cml0ZWwoc2FpLCB2YWxfY3IyLCBzYWktPmJhc2UgKyByZWdfY3IyKTsKKwlyZWdtYXBfd3JpdGUoc2FpLT5yZWdtYXAsIHJlZ19jcjIsIHZhbF9jcjIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04OSwzMiArNjMsMjIgQEAKIHN0YXRpYyBpbnQgZnNsX3NhaV9zZXRfZGFpX3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWksCiAJCWludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQogewotCXN0cnVjdCBmc2xfc2FpICpzYWkgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKIAlpbnQgcmV0OwogCiAJaWYgKGRpciA9PSBTTkRfU09DX0NMT0NLX0lOKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShzYWktPmNsayk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCXJldCA9IGZzbF9zYWlfc2V0X2RhaV9zeXNjbGtfdHIoY3B1X2RhaSwgY2xrX2lkLCBmcmVxLAogCQkJCQlGU0xfRk1UX1RSQU5TTUlUVEVSKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoY3B1X2RhaS0+ZGV2LCAiQ2Fubm90IHNldCB0eCBzeXNjbGs6ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycl9jbGs7CisJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0ID0gZnNsX3NhaV9zZXRfZGFpX3N5c2Nsa190cihjcHVfZGFpLCBjbGtfaWQsIGZyZXEsCiAJCQkJCUZTTF9GTVRfUkVDRUlWRVIpOwotCWlmIChyZXQpIHsKKwlpZiAocmV0KQogCQlkZXZfZXJyKGNwdV9kYWktPmRldiwgIkNhbm5vdCBzZXQgcnggc3lzY2xrOiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJfY2xrOwotCX0KLQotZXJyX2NsazoKLQljbGtfZGlzYWJsZV91bnByZXBhcmUoc2FpLT5jbGspOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEzMyw0MyArOTcsODQgQEAKIAkJcmVnX2NyNCA9IEZTTF9TQUlfUkNSNDsKIAl9CiAKLQl2YWxfY3IyID0gc2FpX3JlYWRsKHNhaSwgc2FpLT5iYXNlICsgcmVnX2NyMik7Ci0JdmFsX2NyNCA9IHNhaV9yZWFkbChzYWksIHNhaS0+YmFzZSArIHJlZ19jcjQpOworCXJlZ21hcF9yZWFkKHNhaS0+cmVnbWFwLCByZWdfY3IyLCAmdmFsX2NyMik7CisJcmVnbWFwX3JlYWQoc2FpLT5yZWdtYXAsIHJlZ19jcjQsICZ2YWxfY3I0KTsKIAogCWlmIChzYWktPmJpZ19lbmRpYW5fZGF0YSkKIAkJdmFsX2NyNCAmPSB+RlNMX1NBSV9DUjRfTUY7CiAJZWxzZQogCQl2YWxfY3I0IHw9IEZTTF9TQUlfQ1I0X01GOwogCisJLyogREFJIG1vZGUgKi8KIAlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6Ci0JCXZhbF9jcjQgfD0gRlNMX1NBSV9DUjRfRlNFOworCQkvKgorCQkgKiBGcmFtZSBsb3csIDFjbGsgYmVmb3JlIGRhdGEsIG9uZSB3b3JkIGxlbmd0aCBmb3IgZnJhbWUgc3luYywKKwkJICogZnJhbWUgc3luYyBzdGFydHMgb25lIHNlcmlhbCBjbG9jayBjeWNsZSBlYXJsaWVyLAorCQkgKiB0aGF0IGlzLCB0b2dldGhlciB3aXRoIHRoZSBsYXN0IGJpdCBvZiB0aGUgcHJldmlvdXMKKwkJICogZGF0YSB3b3JkLgorCQkgKi8KKwkJdmFsX2NyMiAmPSB+RlNMX1NBSV9DUjJfQkNQOworCQl2YWxfY3I0IHw9IEZTTF9TQUlfQ1I0X0ZTRSB8IEZTTF9TQUlfQ1I0X0ZTUDsKIAkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCS8qCisJCSAqIEZyYW1lIGhpZ2gsIG9uZSB3b3JkIGxlbmd0aCBmb3IgZnJhbWUgc3luYywKKwkJICogZnJhbWUgc3luYyBhc3NlcnRzIHdpdGggdGhlIGZpcnN0IGJpdCBvZiB0aGUgZnJhbWUuCisJCSAqLworCQl2YWxfY3IyICY9IH5GU0xfU0FJX0NSMl9CQ1A7CisJCXZhbF9jcjQgJj0gfihGU0xfU0FJX0NSNF9GU0UgfCBGU0xfU0FJX0NSNF9GU1ApOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCQkvKgorCQkgKiBGcmFtZSBoaWdoLCAxY2xrIGJlZm9yZSBkYXRhLCBvbmUgYml0IGZvciBmcmFtZSBzeW5jLAorCQkgKiBmcmFtZSBzeW5jIHN0YXJ0cyBvbmUgc2VyaWFsIGNsb2NrIGN5Y2xlIGVhcmxpZXIsCisJCSAqIHRoYXQgaXMsIHRvZ2V0aGVyIHdpdGggdGhlIGxhc3QgYml0IG9mIHRoZSBwcmV2aW91cworCQkgKiBkYXRhIHdvcmQuCisJCSAqLworCQl2YWxfY3IyICY9IH5GU0xfU0FJX0NSMl9CQ1A7CisJCXZhbF9jcjQgJj0gfkZTTF9TQUlfQ1I0X0ZTUDsKKwkJdmFsX2NyNCB8PSBGU0xfU0FJX0NSNF9GU0U7CisJCXNhaS0+aXNfZHNwX21vZGUgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9COgorCQkvKgorCQkgKiBGcmFtZSBoaWdoLCBvbmUgYml0IGZvciBmcmFtZSBzeW5jLAorCQkgKiBmcmFtZSBzeW5jIGFzc2VydHMgd2l0aCB0aGUgZmlyc3QgYml0IG9mIHRoZSBmcmFtZS4KKwkJICovCisJCXZhbF9jcjIgJj0gfkZTTF9TQUlfQ1IyX0JDUDsKKwkJdmFsX2NyNCAmPSB+KEZTTF9TQUlfQ1I0X0ZTRSB8IEZTTF9TQUlfQ1I0X0ZTUCk7CisJCXNhaS0+aXNfZHNwX21vZGUgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6CisJCS8qIFRvIGJlIGRvbmUgKi8KIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwkvKiBEQUkgY2xvY2sgaW52ZXJzaW9uICovCiAJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgewogCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfSUY6Ci0JCXZhbF9jcjQgfD0gRlNMX1NBSV9DUjRfRlNQOwotCQl2YWxfY3IyICY9IH5GU0xfU0FJX0NSMl9CQ1A7CisJCS8qIEludmVydCBib3RoIGNsb2NrcyAqLworCQl2YWxfY3IyIF49IEZTTF9TQUlfQ1IyX0JDUDsKKwkJdmFsX2NyNCBePSBGU0xfU0FJX0NSNF9GU1A7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6Ci0JCXZhbF9jcjQgJj0gfkZTTF9TQUlfQ1I0X0ZTUDsKLQkJdmFsX2NyMiAmPSB+RlNMX1NBSV9DUjJfQkNQOworCQkvKiBJbnZlcnQgYml0IGNsb2NrICovCisJCXZhbF9jcjIgXj0gRlNMX1NBSV9DUjJfQkNQOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfREFJRk1UX05CX0lGOgotCQl2YWxfY3I0IHw9IEZTTF9TQUlfQ1I0X0ZTUDsKLQkJdmFsX2NyMiB8PSBGU0xfU0FJX0NSMl9CQ1A7CisJCS8qIEludmVydCBmcmFtZSBjbG9jayAqLworCQl2YWxfY3I0IF49IEZTTF9TQUlfQ1I0X0ZTUDsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKLQkJdmFsX2NyNCAmPSB+RlNMX1NBSV9DUjRfRlNQOwotCQl2YWxfY3IyIHw9IEZTTF9TQUlfQ1IyX0JDUDsKKwkJLyogTm90aGluZyB0byBkbyBmb3IgYm90aCBub3JtYWwgY2FzZXMgKi8KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyogREFJIGNsb2NrIG1hc3RlciBtYXNrcyAqLwogCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKIAljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CiAJCXZhbF9jcjIgfD0gRlNMX1NBSV9DUjJfQkNEX01TVFI7CkBAIC0xNzksMzkgKzE4NCwzNyBAQAogCQl2YWxfY3IyICY9IH5GU0xfU0FJX0NSMl9CQ0RfTVNUUjsKIAkJdmFsX2NyNCAmPSB+RlNMX1NBSV9DUjRfRlNEX01TVFI7CiAJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGTToKKwkJdmFsX2NyMiB8PSBGU0xfU0FJX0NSMl9CQ0RfTVNUUjsKKwkJdmFsX2NyNCAmPSB+RlNMX1NBSV9DUjRfRlNEX01TVFI7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGUzoKKwkJdmFsX2NyMiAmPSB+RlNMX1NBSV9DUjJfQkNEX01TVFI7CisJCXZhbF9jcjQgfD0gRlNMX1NBSV9DUjRfRlNEX01TVFI7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNhaV93cml0ZWwoc2FpLCB2YWxfY3IyLCBzYWktPmJhc2UgKyByZWdfY3IyKTsKLQlzYWlfd3JpdGVsKHNhaSwgdmFsX2NyNCwgc2FpLT5iYXNlICsgcmVnX2NyNCk7CisJcmVnbWFwX3dyaXRlKHNhaS0+cmVnbWFwLCByZWdfY3IyLCB2YWxfY3IyKTsKKwlyZWdtYXBfd3JpdGUoc2FpLT5yZWdtYXAsIHJlZ19jcjQsIHZhbF9jcjQpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZnNsX3NhaV9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWksIHVuc2lnbmVkIGludCBmbXQpCiB7Ci0Jc3RydWN0IGZzbF9zYWkgKnNhaSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGNwdV9kYWkpOwogCWludCByZXQ7CiAKLQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoc2FpLT5jbGspOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KIAlyZXQgPSBmc2xfc2FpX3NldF9kYWlfZm10X3RyKGNwdV9kYWksIGZtdCwgRlNMX0ZNVF9UUkFOU01JVFRFUik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGNwdV9kYWktPmRldiwgIkNhbm5vdCBzZXQgdHggZm9ybWF0OiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJfY2xrOworCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IGZzbF9zYWlfc2V0X2RhaV9mbXRfdHIoY3B1X2RhaSwgZm10LCBGU0xfRk1UX1JFQ0VJVkVSKTsKLQlpZiAocmV0KSB7CisJaWYgKHJldCkKIAkJZGV2X2VycihjcHVfZGFpLT5kZXYsICJDYW5ub3Qgc2V0IHJ4IGZvcm1hdDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyX2NsazsKLQl9Ci0KLWVycl9jbGs6Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNhaS0+Y2xrKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yMzUsMTYgKzIzOCwxOSBAQAogCQlyZWdfbXIgPSBGU0xfU0FJX1JNUjsKIAl9CiAKLQl2YWxfY3I0ID0gc2FpX3JlYWRsKHNhaSwgc2FpLT5iYXNlICsgcmVnX2NyNCk7CisJcmVnbWFwX3JlYWQoc2FpLT5yZWdtYXAsIHJlZ19jcjQsICZ2YWxfY3I0KTsKKwlyZWdtYXBfcmVhZChzYWktPnJlZ21hcCwgcmVnX2NyNCwgJnZhbF9jcjUpOworCiAJdmFsX2NyNCAmPSB+RlNMX1NBSV9DUjRfU1lXRF9NQVNLOwogCXZhbF9jcjQgJj0gfkZTTF9TQUlfQ1I0X0ZSU1pfTUFTSzsKIAotCXZhbF9jcjUgPSBzYWlfcmVhZGwoc2FpLCBzYWktPmJhc2UgKyByZWdfY3I1KTsKIAl2YWxfY3I1ICY9IH5GU0xfU0FJX0NSNV9XTldfTUFTSzsKIAl2YWxfY3I1ICY9IH5GU0xfU0FJX0NSNV9XMFdfTUFTSzsKIAl2YWxfY3I1ICY9IH5GU0xfU0FJX0NSNV9GQlRfTUFTSzsKIAotCXZhbF9jcjQgfD0gRlNMX1NBSV9DUjRfU1lXRCh3b3JkX3dpZHRoKTsKKwlpZiAoIXNhaS0+aXNfZHNwX21vZGUpCisJCXZhbF9jcjQgfD0gRlNMX1NBSV9DUjRfU1lXRCh3b3JkX3dpZHRoKTsKKwogCXZhbF9jcjUgfD0gRlNMX1NBSV9DUjVfV05XKHdvcmRfd2lkdGgpOwogCXZhbF9jcjUgfD0gRlNMX1NBSV9DUjVfVzBXKHdvcmRfd2lkdGgpOwogCkBAIC0yNTcsOSArMjYzLDkgQEAKIAl2YWxfY3I0IHw9IEZTTF9TQUlfQ1I0X0ZSU1ooY2hhbm5lbHMpOwogCXZhbF9tciA9IH4wVUwgLSAoKDEgPDwgY2hhbm5lbHMpIC0gMSk7CiAKLQlzYWlfd3JpdGVsKHNhaSwgdmFsX2NyNCwgc2FpLT5iYXNlICsgcmVnX2NyNCk7Ci0Jc2FpX3dyaXRlbChzYWksIHZhbF9jcjUsIHNhaS0+YmFzZSArIHJlZ19jcjUpOwotCXNhaV93cml0ZWwoc2FpLCB2YWxfbXIsIHNhaS0+YmFzZSArIHJlZ19tcik7CisJcmVnbWFwX3dyaXRlKHNhaS0+cmVnbWFwLCByZWdfY3I0LCB2YWxfY3I0KTsKKwlyZWdtYXBfd3JpdGUoc2FpLT5yZWdtYXAsIHJlZ19jcjUsIHZhbF9jcjUpOworCXJlZ21hcF93cml0ZShzYWktPnJlZ21hcCwgcmVnX21yLCB2YWxfbXIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNjgsNDQgKzI3NCw0MiBAQAogCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkpCiB7CiAJc3RydWN0IGZzbF9zYWkgKnNhaSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGNwdV9kYWkpOwotCXUzMiB0Y3NyLCByY3NyLCB2YWxfY3IyLCB2YWxfY3IzLCByZWdfY3IzOworCXUzMiB0Y3NyLCByY3NyOwogCi0JdmFsX2NyMiA9IHNhaV9yZWFkbChzYWksIHNhaS0+YmFzZSArIEZTTF9TQUlfVENSMik7Ci0JdmFsX2NyMiAmPSB+RlNMX1NBSV9DUjJfU1lOQzsKLQlzYWlfd3JpdGVsKHNhaSwgdmFsX2NyMiwgc2FpLT5iYXNlICsgRlNMX1NBSV9UQ1IyKTsKKwkvKgorCSAqIFRoZSB0cmFuc21pdHRlciBiaXQgY2xvY2sgYW5kIGZyYW1lIHN5bmMgYXJlIHRvIGJlCisJICogdXNlZCBieSBib3RoIHRoZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIuCisJICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1RDUjIsIEZTTF9TQUlfQ1IyX1NZTkMsCisJCQkgICB+RlNMX1NBSV9DUjJfU1lOQyk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1JDUjIsIEZTTF9TQUlfQ1IyX1NZTkMsCisJCQkgICBGU0xfU0FJX0NSMl9TWU5DKTsKIAotCXZhbF9jcjIgPSBzYWlfcmVhZGwoc2FpLCBzYWktPmJhc2UgKyBGU0xfU0FJX1JDUjIpOwotCXZhbF9jcjIgfD0gRlNMX1NBSV9DUjJfU1lOQzsKLQlzYWlfd3JpdGVsKHNhaSwgdmFsX2NyMiwgc2FpLT5iYXNlICsgRlNMX1NBSV9SQ1IyKTsKLQotCXRjc3IgPSBzYWlfcmVhZGwoc2FpLCBzYWktPmJhc2UgKyBGU0xfU0FJX1RDU1IpOwotCXJjc3IgPSBzYWlfcmVhZGwoc2FpLCBzYWktPmJhc2UgKyBGU0xfU0FJX1JDU1IpOworCXJlZ21hcF9yZWFkKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1RDU1IsICZ0Y3NyKTsKKwlyZWdtYXBfcmVhZChzYWktPnJlZ21hcCwgRlNMX1NBSV9SQ1NSLCAmcmNzcik7CiAKIAlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewogCQl0Y3NyIHw9IEZTTF9TQUlfQ1NSX0ZSREU7CiAJCXJjc3IgJj0gfkZTTF9TQUlfQ1NSX0ZSREU7Ci0JCXJlZ19jcjMgPSBGU0xfU0FJX1RDUjM7CiAJfSBlbHNlIHsKIAkJcmNzciB8PSBGU0xfU0FJX0NTUl9GUkRFOwogCQl0Y3NyICY9IH5GU0xfU0FJX0NTUl9GUkRFOwotCQlyZWdfY3IzID0gRlNMX1NBSV9SQ1IzOwogCX0KIAotCXZhbF9jcjMgPSBzYWlfcmVhZGwoc2FpLCBzYWktPmJhc2UgKyByZWdfY3IzKTsKLQorCS8qCisJICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgdHJhbnNtaXR0ZXIgaXMgdGhlIGxhc3QgZW5hYmxlZAorCSAqIGFuZCB0aGUgZmlyc3QgZGlzYWJsZWQuCisJICovCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKIAkJdGNzciB8PSBGU0xfU0FJX0NTUl9URVJFOwogCQlyY3NyIHw9IEZTTF9TQUlfQ1NSX1RFUkU7Ci0JCXZhbF9jcjMgfD0gRlNMX1NBSV9DUjNfVFJDRTsKIAotCQlzYWlfd3JpdGVsKHNhaSwgdmFsX2NyMywgc2FpLT5iYXNlICsgcmVnX2NyMyk7Ci0JCXNhaV93cml0ZWwoc2FpLCByY3NyLCBzYWktPmJhc2UgKyBGU0xfU0FJX1JDU1IpOwotCQlzYWlfd3JpdGVsKHNhaSwgdGNzciwgc2FpLT5iYXNlICsgRlNMX1NBSV9UQ1NSKTsKKwkJcmVnbWFwX3dyaXRlKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1JDU1IsIHJjc3IpOworCQlyZWdtYXBfd3JpdGUoc2FpLT5yZWdtYXAsIEZTTF9TQUlfVENTUiwgdGNzcik7CiAJCWJyZWFrOwotCiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CkBAIC0zMTQsMTEgKzMxOCw4IEBACiAJCQlyY3NyICY9IH5GU0xfU0FJX0NTUl9URVJFOwogCQl9CiAKLQkJdmFsX2NyMyAmPSB+RlNMX1NBSV9DUjNfVFJDRTsKLQotCQlzYWlfd3JpdGVsKHNhaSwgdGNzciwgc2FpLT5iYXNlICsgRlNMX1NBSV9UQ1NSKTsKLQkJc2FpX3dyaXRlbChzYWksIHJjc3IsIHNhaS0+YmFzZSArIEZTTF9TQUlfUkNTUik7Ci0JCXNhaV93cml0ZWwoc2FpLCB2YWxfY3IzLCBzYWktPmJhc2UgKyByZWdfY3IzKTsKKwkJcmVnbWFwX3dyaXRlKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1RDU1IsIHRjc3IpOworCQlyZWdtYXBfd3JpdGUoc2FpLT5yZWdtYXAsIEZTTF9TQUlfUkNTUiwgcmNzcik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzMxLDE2ICszMzIsMzIgQEAKIAkJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpKQogewogCXN0cnVjdCBmc2xfc2FpICpzYWkgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKKwl1MzIgcmVnOwogCi0JcmV0dXJuIGNsa19wcmVwYXJlX2VuYWJsZShzYWktPmNsayk7CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXJlZyA9IEZTTF9TQUlfVENSMzsKKwllbHNlCisJCXJlZyA9IEZTTF9TQUlfUkNSMzsKKworCXJlZ21hcF91cGRhdGVfYml0cyhzYWktPnJlZ21hcCwgcmVnLCBGU0xfU0FJX0NSM19UUkNFLAorCQkJICAgRlNMX1NBSV9DUjNfVFJDRSk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZnNsX3NhaV9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpKQogewogCXN0cnVjdCBmc2xfc2FpICpzYWkgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKKwl1MzIgcmVnOwogCi0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNhaS0+Y2xrKTsKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJcmVnID0gRlNMX1NBSV9UQ1IzOworCWVsc2UKKwkJcmVnID0gRlNMX1NBSV9SQ1IzOworCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNhaS0+cmVnbWFwLCByZWcsIEZTTF9TQUlfQ1IzX1RSQ0UsCisJCQkgICB+RlNMX1NBSV9DUjNfVFJDRSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIGZzbF9zYWlfcGNtX2RhaV9vcHMgPSB7CkBAIC0zNTUsMTggKzM3MiwxMyBAQAogc3RhdGljIGludCBmc2xfc2FpX2RhaV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkpCiB7CiAJc3RydWN0IGZzbF9zYWkgKnNhaSA9IGRldl9nZXRfZHJ2ZGF0YShjcHVfZGFpLT5kZXYpOwotCWludCByZXQ7CiAKLQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoc2FpLT5jbGspOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlzYWlfd3JpdGVsKHNhaSwgMHgwLCBzYWktPmJhc2UgKyBGU0xfU0FJX1JDU1IpOwotCXNhaV93cml0ZWwoc2FpLCAweDAsIHNhaS0+YmFzZSArIEZTTF9TQUlfVENTUik7Ci0Jc2FpX3dyaXRlbChzYWksIEZTTF9TQUlfTUFYQlVSU1RfVFggKiAyLCBzYWktPmJhc2UgKyBGU0xfU0FJX1RDUjEpOwotCXNhaV93cml0ZWwoc2FpLCBGU0xfU0FJX01BWEJVUlNUX1JYIC0gMSwgc2FpLT5iYXNlICsgRlNMX1NBSV9SQ1IxKTsKLQotCWNsa19kaXNhYmxlX3VucHJlcGFyZShzYWktPmNsayk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1RDU1IsIDB4ZmZmZmZmZmYsIDB4MCk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1JDU1IsIDB4ZmZmZmZmZmYsIDB4MCk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1RDUjEsIEZTTF9TQUlfQ1IxX1JGV19NQVNLLAorCQkJICAgRlNMX1NBSV9NQVhCVVJTVF9UWCAqIDIpOworCXJlZ21hcF91cGRhdGVfYml0cyhzYWktPnJlZ21hcCwgRlNMX1NBSV9SQ1IxLCBGU0xfU0FJX0NSMV9SRldfTUFTSywKKwkJCSAgIEZTTF9TQUlfTUFYQlVSU1RfUlggLSAxKTsKIAogCXNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEoY3B1X2RhaSwgJnNhaS0+ZG1hX3BhcmFtc190eCwKIAkJCQkmc2FpLT5kbWFfcGFyYW1zX3J4KTsKQEAgLTM5NywyNiArNDA5LDEwOSBAQAogCS5uYW1lICAgICAgICAgICA9ICJmc2wtc2FpIiwKIH07CiAKK3N0YXRpYyBib29sIGZzbF9zYWlfcmVhZGFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgRlNMX1NBSV9UQ1NSOgorCWNhc2UgRlNMX1NBSV9UQ1IxOgorCWNhc2UgRlNMX1NBSV9UQ1IyOgorCWNhc2UgRlNMX1NBSV9UQ1IzOgorCWNhc2UgRlNMX1NBSV9UQ1I0OgorCWNhc2UgRlNMX1NBSV9UQ1I1OgorCWNhc2UgRlNMX1NBSV9URlI6CisJY2FzZSBGU0xfU0FJX1RNUjoKKwljYXNlIEZTTF9TQUlfUkNTUjoKKwljYXNlIEZTTF9TQUlfUkNSMToKKwljYXNlIEZTTF9TQUlfUkNSMjoKKwljYXNlIEZTTF9TQUlfUkNSMzoKKwljYXNlIEZTTF9TQUlfUkNSNDoKKwljYXNlIEZTTF9TQUlfUkNSNToKKwljYXNlIEZTTF9TQUlfUkRSOgorCWNhc2UgRlNMX1NBSV9SRlI6CisJY2FzZSBGU0xfU0FJX1JNUjoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIGJvb2wgZnNsX3NhaV92b2xhdGlsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBGU0xfU0FJX1RGUjoKKwljYXNlIEZTTF9TQUlfUkZSOgorCWNhc2UgRlNMX1NBSV9URFI6CisJY2FzZSBGU0xfU0FJX1JEUjoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKworfQorCitzdGF0aWMgYm9vbCBmc2xfc2FpX3dyaXRlYWJsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBGU0xfU0FJX1RDU1I6CisJY2FzZSBGU0xfU0FJX1RDUjE6CisJY2FzZSBGU0xfU0FJX1RDUjI6CisJY2FzZSBGU0xfU0FJX1RDUjM6CisJY2FzZSBGU0xfU0FJX1RDUjQ6CisJY2FzZSBGU0xfU0FJX1RDUjU6CisJY2FzZSBGU0xfU0FJX1REUjoKKwljYXNlIEZTTF9TQUlfVE1SOgorCWNhc2UgRlNMX1NBSV9SQ1NSOgorCWNhc2UgRlNMX1NBSV9SQ1IxOgorCWNhc2UgRlNMX1NBSV9SQ1IyOgorCWNhc2UgRlNMX1NBSV9SQ1IzOgorCWNhc2UgRlNMX1NBSV9SQ1I0OgorCWNhc2UgRlNMX1NBSV9SQ1I1OgorCWNhc2UgRlNMX1NBSV9STVI6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBmc2xfc2FpX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gMzIsCisJLnJlZ19zdHJpZGUgPSA0LAorCS52YWxfYml0cyA9IDMyLAorCisJLm1heF9yZWdpc3RlciA9IEZTTF9TQUlfUk1SLAorCS5yZWFkYWJsZV9yZWcgPSBmc2xfc2FpX3JlYWRhYmxlX3JlZywKKwkudm9sYXRpbGVfcmVnID0gZnNsX3NhaV92b2xhdGlsZV9yZWcsCisJLndyaXRlYWJsZV9yZWcgPSBmc2xfc2FpX3dyaXRlYWJsZV9yZWcsCit9OworCiBzdGF0aWMgaW50IGZzbF9zYWlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJc3RydWN0IGZzbF9zYWkgKnNhaTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CiAJaW50IHJldDsKIAogCXNhaSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnNhaSksIEdGUF9LRVJORUwpOwogCWlmICghc2FpKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0Jc2FpLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7Ci0JaWYgKElTX0VSUihzYWktPmJhc2UpKQotCQlyZXR1cm4gUFRSX0VSUihzYWktPmJhc2UpOworCXNhaS0+YmlnX2VuZGlhbl9yZWdzID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYmlnLWVuZGlhbi1yZWdzIik7CisJaWYgKHNhaS0+YmlnX2VuZGlhbl9yZWdzKQorCQlmc2xfc2FpX3JlZ21hcF9jb25maWcudmFsX2Zvcm1hdF9lbmRpYW4gPSBSRUdNQVBfRU5ESUFOX0JJRzsKIAotCXNhaS0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJzYWkiKTsKLQlpZiAoSVNfRVJSKHNhaS0+Y2xrKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgZ2V0IFNBSSdzIGNsb2NrXG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIoc2FpLT5jbGspOworCXNhaS0+YmlnX2VuZGlhbl9kYXRhID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYmlnLWVuZGlhbi1kYXRhIik7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihiYXNlKTsKKworCXNhaS0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9tbWlvX2NsaygmcGRldi0+ZGV2LAorCQkJInNhaSIsIGJhc2UsICZmc2xfc2FpX3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIoc2FpLT5yZWdtYXApKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlZ21hcCBpbml0IGZhaWxlZFxuIik7CisJCXJldHVybiBQVFJfRVJSKHNhaS0+cmVnbWFwKTsKIAl9CiAKIAlzYWktPmRtYV9wYXJhbXNfcnguYWRkciA9IHJlcy0+c3RhcnQgKyBGU0xfU0FJX1JEUjsKQEAgLTQyNCw5ICs1MTksNiBAQAogCXNhaS0+ZG1hX3BhcmFtc19yeC5tYXhidXJzdCA9IEZTTF9TQUlfTUFYQlVSU1RfUlg7CiAJc2FpLT5kbWFfcGFyYW1zX3R4Lm1heGJ1cnN0ID0gRlNMX1NBSV9NQVhCVVJTVF9UWDsKIAotCXNhaS0+YmlnX2VuZGlhbl9yZWdzID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYmlnLWVuZGlhbi1yZWdzIik7Ci0Jc2FpLT5iaWdfZW5kaWFuX2RhdGEgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJiaWctZW5kaWFuLWRhdGEiKTsKLQogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNhaSk7CiAKIAlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsICZmc2xfY29tcG9uZW50LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9mc2xfc2FpLmggYi9zb3VuZC9zb2MvZnNsL2ZzbF9zYWkuaAppbmRleCA0MWJiNjJlNi4uZTQzMjI2MCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9mc2xfc2FpLmgKKysrIGIvc291bmQvc29jL2ZzbC9mc2xfc2FpLmgKQEAgLTE1LDMxICsxNSwzNiBAQAogCQkJIFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8XAogCQkJIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKQogCisvKiBTQUkgUmVnaXN0ZXIgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lIEZTTF9TQUlfVENTUgkweDAwIC8qIFNBSSBUcmFuc21pdCBDb250cm9sICovCisjZGVmaW5lIEZTTF9TQUlfVENSMQkweDA0IC8qIFNBSSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgKi8KKyNkZWZpbmUgRlNMX1NBSV9UQ1IyCTB4MDggLyogU0FJIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiAqLworI2RlZmluZSBGU0xfU0FJX1RDUjMJMHgwYyAvKiBTQUkgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAzICovCisjZGVmaW5lIEZTTF9TQUlfVENSNAkweDEwIC8qIFNBSSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDQgKi8KKyNkZWZpbmUgRlNMX1NBSV9UQ1I1CTB4MTQgLyogU0FJIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gNSAqLworI2RlZmluZSBGU0xfU0FJX1REUgkweDIwIC8qIFNBSSBUcmFuc21pdCBEYXRhICovCisjZGVmaW5lIEZTTF9TQUlfVEZSCTB4NDAgLyogU0FJIFRyYW5zbWl0IEZJRk8gKi8KKyNkZWZpbmUgRlNMX1NBSV9UTVIJMHg2MCAvKiBTQUkgVHJhbnNtaXQgTWFzayAqLworI2RlZmluZSBGU0xfU0FJX1JDU1IJMHg4MCAvKiBTQUkgUmVjZWl2ZSBDb250cm9sICovCisjZGVmaW5lIEZTTF9TQUlfUkNSMQkweDg0IC8qIFNBSSBSZWNlaXZlIENvbmZpZ3VyYXRpb24gMSAqLworI2RlZmluZSBGU0xfU0FJX1JDUjIJMHg4OCAvKiBTQUkgUmVjZWl2ZSBDb25maWd1cmF0aW9uIDIgKi8KKyNkZWZpbmUgRlNMX1NBSV9SQ1IzCTB4OGMgLyogU0FJIFJlY2VpdmUgQ29uZmlndXJhdGlvbiAzICovCisjZGVmaW5lIEZTTF9TQUlfUkNSNAkweDkwIC8qIFNBSSBSZWNlaXZlIENvbmZpZ3VyYXRpb24gNCAqLworI2RlZmluZSBGU0xfU0FJX1JDUjUJMHg5NCAvKiBTQUkgUmVjZWl2ZSBDb25maWd1cmF0aW9uIDUgKi8KKyNkZWZpbmUgRlNMX1NBSV9SRFIJMHhhMCAvKiBTQUkgUmVjZWl2ZSBEYXRhICovCisjZGVmaW5lIEZTTF9TQUlfUkZSCTB4YzAgLyogU0FJIFJlY2VpdmUgRklGTyAqLworI2RlZmluZSBGU0xfU0FJX1JNUgkweGUwIC8qIFNBSSBSZWNlaXZlIE1hc2sgKi8KKwogLyogU0FJIFRyYW5zbWl0L1JlY2lldmUgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBGU0xfU0FJX1RDU1IJCTB4MDAKLSNkZWZpbmUgRlNMX1NBSV9SQ1NSCQkweDgwCiAjZGVmaW5lIEZTTF9TQUlfQ1NSX1RFUkUJQklUKDMxKQogI2RlZmluZSBGU0xfU0FJX0NTUl9GV0YJCUJJVCgxNykKICNkZWZpbmUgRlNMX1NBSV9DU1JfRlJJRQlCSVQoOCkKICNkZWZpbmUgRlNMX1NBSV9DU1JfRlJERQlCSVQoMCkKIAotLyogU0FJIFRyYW5zbWl0IERhdGEvRklGTy9NQVNLIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZTTF9TQUlfVERSCQkweDIwCi0jZGVmaW5lIEZTTF9TQUlfVEZSCQkweDQwCi0jZGVmaW5lIEZTTF9TQUlfVE1SCQkweDYwCi0KLS8qIFNBSSBSZWNpZXZlIERhdGEvRklGTy9NQVNLIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZTTF9TQUlfUkRSCQkweGEwCi0jZGVmaW5lIEZTTF9TQUlfUkZSCQkweGMwCi0jZGVmaW5lIEZTTF9TQUlfUk1SCQkweGUwCi0KIC8qIFNBSSBUcmFuc21pdCBhbmQgUmVjaWV2ZSBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRlNMX1NBSV9UQ1IxCQkweDA0Ci0jZGVmaW5lIEZTTF9TQUlfUkNSMQkJMHg4NAorI2RlZmluZSBGU0xfU0FJX0NSMV9SRldfTUFTSwkweDFmCiAKIC8qIFNBSSBUcmFuc21pdCBhbmQgUmVjaWV2ZSBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRlNMX1NBSV9UQ1IyCQkweDA4Ci0jZGVmaW5lIEZTTF9TQUlfUkNSMgkJMHg4OAogI2RlZmluZSBGU0xfU0FJX0NSMl9TWU5DCUJJVCgzMCkKICNkZWZpbmUgRlNMX1NBSV9DUjJfTVNFTF9NQVNLCSgweGZmIDw8IDI2KQogI2RlZmluZSBGU0xfU0FJX0NSMl9NU0VMX0JVUwkwCkBAIC01MCwxNSArNTUsMTEgQEAKICNkZWZpbmUgRlNMX1NBSV9DUjJfQkNEX01TVFIJQklUKDI0KQogCiAvKiBTQUkgVHJhbnNtaXQgYW5kIFJlY2lldmUgQ29uZmlndXJhdGlvbiAzIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZTTF9TQUlfVENSMwkJMHgwYwotI2RlZmluZSBGU0xfU0FJX1JDUjMJCTB4OGMKICNkZWZpbmUgRlNMX1NBSV9DUjNfVFJDRQlCSVQoMTYpCiAjZGVmaW5lIEZTTF9TQUlfQ1IzX1dERkwoeCkJKHgpCiAjZGVmaW5lIEZTTF9TQUlfQ1IzX1dERkxfTUFTSwkweDFmCiAKIC8qIFNBSSBUcmFuc21pdCBhbmQgUmVjaWV2ZSBDb25maWd1cmF0aW9uIDQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRlNMX1NBSV9UQ1I0CQkweDEwCi0jZGVmaW5lIEZTTF9TQUlfUkNSNAkJMHg5MAogI2RlZmluZSBGU0xfU0FJX0NSNF9GUlNaKHgpCSgoKHgpIC0gMSkgPDwgMTYpCiAjZGVmaW5lIEZTTF9TQUlfQ1I0X0ZSU1pfTUFTSwkoMHgxZiA8PCAxNikKICNkZWZpbmUgRlNMX1NBSV9DUjRfU1lXRCh4KQkoKCh4KSAtIDEpIDw8IDgpCkBAIC02OSw4ICs3MCw2IEBACiAjZGVmaW5lIEZTTF9TQUlfQ1I0X0ZTRF9NU1RSCUJJVCgwKQogCiAvKiBTQUkgVHJhbnNtaXQgYW5kIFJlY2lldmUgQ29uZmlndXJhdGlvbiA1IFJlZ2lzdGVyICovCi0jZGVmaW5lIEZTTF9TQUlfVENSNQkJMHgxNAotI2RlZmluZSBGU0xfU0FJX1JDUjUJCTB4OTQKICNkZWZpbmUgRlNMX1NBSV9DUjVfV05XKHgpCSgoKHgpIC0gMSkgPDwgMjQpCiAjZGVmaW5lIEZTTF9TQUlfQ1I1X1dOV19NQVNLCSgweDFmIDw8IDI0KQogI2RlZmluZSBGU0xfU0FJX0NSNV9XMFcoeCkJKCgoeCkgLSAxKSA8PCAxNikKQEAgLTEwMCwxMiArOTksMTEgQEAKICNkZWZpbmUgRlNMX1NBSV9NQVhCVVJTVF9SWCA2CiAKIHN0cnVjdCBmc2xfc2FpIHsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0KLQl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCiAJYm9vbCBiaWdfZW5kaWFuX3JlZ3M7CiAJYm9vbCBiaWdfZW5kaWFuX2RhdGE7CisJYm9vbCBpc19kc3BfbW9kZTsKIAogCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSBkbWFfcGFyYW1zX3J4OwogCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSBkbWFfcGFyYW1zX3R4OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9mc2xfc3BkaWYuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NwZGlmLmMKaW5kZXggNGQwNzVmMS4uNjQ1MmNhOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9mc2xfc3BkaWYuYworKysgYi9zb3VuZC9zb2MvZnNsL2ZzbF9zcGRpZi5jCkBAIC05MTEsOCArOTExLDggQEAKIHsKIAlzdHJ1Y3QgZnNsX3NwZGlmX3ByaXYgKnNwZGlmX3ByaXZhdGUgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwogCi0JZGFpLT5wbGF5YmFja19kbWFfZGF0YSA9ICZzcGRpZl9wcml2YXRlLT5kbWFfcGFyYW1zX3R4OwotCWRhaS0+Y2FwdHVyZV9kbWFfZGF0YSA9ICZzcGRpZl9wcml2YXRlLT5kbWFfcGFyYW1zX3J4OworCXNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEoZGFpLCAmc3BkaWZfcHJpdmF0ZS0+ZG1hX3BhcmFtc190eCwKKwkJCQkgICZzcGRpZl9wcml2YXRlLT5kbWFfcGFyYW1zX3J4KTsKIAogCXNuZF9zb2NfYWRkX2RhaV9jb250cm9scyhkYWksIGZzbF9zcGRpZl9jdHJscywgQVJSQVlfU0laRShmc2xfc3BkaWZfY3RybHMpKTsKIApAQCAtOTg1LDcgKzk4NSw3IEBACiAJfQogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgZnNsX3NwZGlmX3JlZ21hcF9jb25maWcgPSB7CitzdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgZnNsX3NwZGlmX3JlZ21hcF9jb25maWcgPSB7CiAJLnJlZ19iaXRzID0gMzIsCiAJLnJlZ19zdHJpZGUgPSA0LAogCS52YWxfYml0cyA9IDMyLApAQCAtMTEwNSw2ICsxMTA1LDkgQEAKIAltZW1jcHkoJnNwZGlmX3ByaXYtPmNwdV9kYWlfZHJ2LCAmZnNsX3NwZGlmX2RhaSwgc2l6ZW9mKGZzbF9zcGRpZl9kYWkpKTsKIAlzcGRpZl9wcml2LT5jcHVfZGFpX2Rydi5uYW1lID0gc3BkaWZfcHJpdi0+bmFtZTsKIAorCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJiaWctZW5kaWFuIikpCisJCWZzbF9zcGRpZl9yZWdtYXBfY29uZmlnLnZhbF9mb3JtYXRfZW5kaWFuID0gUkVHTUFQX0VORElBTl9CSUc7CisKIAkvKiBHZXQgdGhlIGFkZHJlc3NlcyBhbmQgSVJRICovCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlyZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2ZzbF91dGlscy5jIGIvc291bmQvc29jL2ZzbC9mc2xfdXRpbHMuYwppbmRleCBiOWU0MmI1Li4yYWM3NzU1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2ZzbF91dGlscy5jCisrKyBiL3NvdW5kL3NvYy9mc2wvZnNsX3V0aWxzLmMKQEAgLTg2LDYgKzg2LDMzIEBACiB9CiBFWFBPUlRfU1lNQk9MKGZzbF9hc29jX2dldF9kbWFfY2hhbm5lbCk7CiAKKy8qKgorICogZnNsX2Fzb2NfeGxhdGVfdGRtX3Nsb3RfbWFzayAtIGdlbmVyYXRlIFRETSBzbG90IFRYL1JYIG1hc2suCisgKgorICogQHNsb3RzOiBOdW1iZXIgb2Ygc2xvdHMgaW4gdXNlLgorICogQHR4X21hc2s6IGJpdG1hc2sgcmVwcmVzZW50aW5nIGFjdGl2ZSBUWCBzbG90cy4KKyAqIEByeF9tYXNrOiBiaXRtYXNrIHJlcHJlc2VudGluZyBhY3RpdmUgUlggc2xvdHMuCisgKgorICogVGhpcyBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBURE0gc2xvdCBUWC9SWCBtYXNrLiBBbmQgdGhlIFRYL1JYCisgKiBtYXNrIHdpbGwgdXNlIGEgMCBiaXQgZm9yIGFuIGFjdGl2ZSBzbG90IGFzIGRlZmF1bHQsIGFuZCB0aGUgZGVmYXVsdAorICogYWN0aXZlIGJpdHMgYXJlIGF0IHRoZSBMU0Igb2YgdGhlIG1hc2sgdmFsdWUuCisgKi8KK2ludCBmc2xfYXNvY194bGF0ZV90ZG1fc2xvdF9tYXNrKHVuc2lnbmVkIGludCBzbG90cywKKwkJCQkgICAgdW5zaWduZWQgaW50ICp0eF9tYXNrLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKnJ4X21hc2spCit7CisJaWYgKCFzbG90cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodHhfbWFzaykKKwkJKnR4X21hc2sgPSB+KCgxIDw8IHNsb3RzKSAtIDEpOworCWlmIChyeF9tYXNrKQorCQkqcnhfbWFzayA9IH4oKDEgPDwgc2xvdHMpIC0gMSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9hc29jX3hsYXRlX3RkbV9zbG90X21hc2spOworCiBNT0RVTEVfQVVUSE9SKCJUaW11ciBUYWJpIDx0aW11ckBmcmVlc2NhbGUuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJGcmVlc2NhbGUgQVNvQyB1dGlsaXR5IGNvZGUiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvZnNsX3V0aWxzLmggYi9zb3VuZC9zb2MvZnNsL2ZzbF91dGlscy5oCmluZGV4IGIyOTUxMTIuLmRmNTM1ZGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvZnNsX3V0aWxzLmgKKysrIGIvc291bmQvc29jL2ZzbC9mc2xfdXRpbHMuaApAQCAtMjIsNSArMjIsNyBAQAogCQkJICAgICBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpLAogCQkJICAgICB1bnNpZ25lZCBpbnQgKmRtYV9jaGFubmVsX2lkLAogCQkJICAgICB1bnNpZ25lZCBpbnQgKmRtYV9pZCk7Ci0KK2ludCBmc2xfYXNvY194bGF0ZV90ZG1fc2xvdF9tYXNrKHVuc2lnbmVkIGludCBzbG90cywKKwkJCQkgICAgdW5zaWduZWQgaW50ICp0eF9tYXNrLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKnJ4X21hc2spOwogI2VuZGlmIC8qIF9GU0xfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9pbXgtcGNtLWZpcS5jIGIvc291bmQvc29jL2ZzbC9pbXgtcGNtLWZpcS5jCmluZGV4IDY1NTMyMDIuLjdhYmY2YTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvaW14LXBjbS1maXEuYworKysgYi9zb3VuZC9zb2MvZnNsL2lteC1wY20tZmlxLmMKQEAgLTI3MCwxOCArMjcwLDE3IEBACiAJCXJldCA9IGlteF9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihwY20sCiAJCQlTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OworCQkJcmV0dXJuIHJldDsKIAl9CiAKIAlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtKSB7CiAJCXJldCA9IGlteF9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihwY20sCiAJCQlTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOwogCQlpZiAocmV0KQotCQkJZ290byBvdXQ7CisJCQlyZXR1cm4gcmV0OwogCX0KIAotb3V0OgotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc3NpX2lycSA9IDA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2lteC1zc2kuYyBiL3NvdW5kL3NvYy9mc2wvaW14LXNzaS5jCmluZGV4IGRmNTUyZmEuLmFiMmZkZDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvaW14LXNzaS5jCisrKyBiL3NvdW5kL3NvYy9mc2wvaW14LXNzaS5jCkBAIC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9hc29jLWlteC1zc2kuaD4KIAogI2luY2x1ZGUgImlteC1zc2kuaCIKKyNpbmNsdWRlICJmc2xfdXRpbHMuaCIKIAogI2RlZmluZSBTU0lfU0FDTlRfREVGQVVMVCAoU1NJX1NBQ05UX0FDOTdFTiB8IFNTSV9TQUNOVF9GVikKIApAQCAtMzM5LDYgKzM0MCw3IEBACiAJLnNldF9mbXQJPSBpbXhfc3NpX3NldF9kYWlfZm10LAogCS5zZXRfY2xrZGl2CT0gaW14X3NzaV9zZXRfZGFpX2Nsa2RpdiwKIAkuc2V0X3N5c2Nsawk9IGlteF9zc2lfc2V0X2RhaV9zeXNjbGssCisJLnhsYXRlX3RkbV9zbG90X21hc2sgPSBmc2xfYXNvY194bGF0ZV90ZG1fc2xvdF9tYXNrLAogCS5zZXRfdGRtX3Nsb3QJPSBpbXhfc3NpX3NldF9kYWlfdGRtX3Nsb3QsCiAJLnRyaWdnZXIJPSBpbXhfc3NpX3RyaWdnZXIsCiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC93bTExMzMtZXYxLmMgYi9zb3VuZC9zb2MvZnNsL3dtMTEzMy1ldjEuYwppbmRleCBmY2U2MzI1Li44MDQ3NDlhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL3dtMTEzMy1ldjEuYworKysgYi9zb3VuZC9zb2MvZnNsL3dtMTEzMy1ldjEuYwpAQCAtMjE0LDEyICsyMTQsNiBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTExMzNfZXYxX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHdtMTEzM19ldjFfd2lkZ2V0cykpOwotCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgd20xMTMzX2V2MV9tYXAsCi0JCQkJQVJSQVlfU0laRSh3bTExMzNfZXYxX21hcCkpOwotCiAJLyogSGVhZHBob25lIGphY2sgZGV0ZWN0aW9uICovCiAJc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRwaG9uZSIsIFNORF9KQUNLX0hFQURQSE9ORSwgJmhwX2phY2spOwogCXNuZF9zb2NfamFja19hZGRfcGlucygmaHBfamFjaywgQVJSQVlfU0laRShocF9qYWNrX3BpbnMpLApAQCAtMjU3LDYgKzI1MSwxMSBAQAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5kYWlfbGluayA9ICZ3bTExMzNfZXYxX2RhaSwKIAkubnVtX2xpbmtzID0gMSwKKworCS5kYXBtX3dpZGdldHMgPSB3bTExMzNfZXYxX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtMTEzM19ldjFfd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gd20xMTMzX2V2MV9tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod20xMTMzX2V2MV9tYXApLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKndtMTEzM19ldjFfc25kX2RldmljZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLmMgYi9zb3VuZC9zb2MvZ2VuZXJpYy9zaW1wbGUtY2FyZC5jCmluZGV4IDJhMWIxYjUuLjIxZjFjY2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLmMKKysrIGIvc291bmQvc29jL2dlbmVyaWMvc2ltcGxlLWNhcmQuYwpAQCAtOSw0OCArOSw3NyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPHNvdW5kL3NpbXBsZV9jYXJkLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhaS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCitzdHJ1Y3Qgc2ltcGxlX2NhcmRfZGF0YSB7CisJc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfY2FyZDsKKwlzdHJ1Y3Qgc2ltcGxlX2RhaV9wcm9wcyB7CisJCXN0cnVjdCBhc29jX3NpbXBsZV9kYWkgY3B1X2RhaTsKKwkJc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSBjb2RlY19kYWk7CisJfSAqZGFpX3Byb3BzOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGRhaV9saW5rW107CS8qIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCAqLworfTsKIAogc3RhdGljIGludCBfX2Fzb2Nfc2ltcGxlX2NhcmRfZGFpX2luaXQoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCi0JCQkJICAgICAgIHN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKnNldCwKLQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRhaWZtdCkKKwkJCQkgICAgICAgc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqc2V0KQogewotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKLQlkYWlmbXQgfD0gc2V0LT5mbXQ7Ci0KLQlpZiAoZGFpZm10KQotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGRhaSwgZGFpZm10KTsKLQotCWlmIChyZXQgPT0gLUVOT1RTVVBQKSB7Ci0JCWRldl9kYmcoZGFpLT5kZXYsICJBU29DOiBzZXRfZm10IGlzIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQlyZXQgPSAwOworCWlmIChzZXQtPmZtdCkgeworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGRhaSwgc2V0LT5mbXQpOworCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PVFNVUFApIHsKKwkJCWRldl9lcnIoZGFpLT5kZXYsICJzaW1wbGUtY2FyZDogc2V0X2ZtdCBlcnJvclxuIik7CisJCQlnb3RvIGVycjsKKwkJfQogCX0KIAotCWlmICghcmV0ICYmIHNldC0+c3lzY2xrKQorCWlmIChzZXQtPnN5c2NsaykgewogCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGRhaSwgMCwgc2V0LT5zeXNjbGssIDApOworCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PVFNVUFApIHsKKwkJCWRldl9lcnIoZGFpLT5kZXYsICJzaW1wbGUtY2FyZDogc2V0X3N5c2NsayBlcnJvclxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KIAorCWlmIChzZXQtPnNsb3RzKSB7CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdChkYWksIDAsIDAsCisJCQkJCQlzZXQtPnNsb3RzLAorCQkJCQkJc2V0LT5zbG90X3dpZHRoKTsKKwkJaWYgKHJldCAmJiByZXQgIT0gLUVOT1RTVVBQKSB7CisJCQlkZXZfZXJyKGRhaS0+ZGV2LCAic2ltcGxlLWNhcmQ6IHNldF90ZG1fc2xvdCBlcnJvclxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCXJldCA9IDA7CisKK2VycjoKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGFzb2Nfc2ltcGxlX2NhcmRfZGFpX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKLQlzdHJ1Y3QgYXNvY19zaW1wbGVfY2FyZF9pbmZvICppbmZvID0KKwlzdHJ1Y3Qgc2ltcGxlX2NhcmRfZGF0YSAqcHJpdiA9CiAJCQkJc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlYyA9IHJ0ZC0+Y29kZWNfZGFpOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1ID0gcnRkLT5jcHVfZGFpOwotCXVuc2lnbmVkIGludCBkYWlmbXQgPSBpbmZvLT5kYWlmbXQ7Ci0JaW50IHJldDsKKwlzdHJ1Y3Qgc2ltcGxlX2RhaV9wcm9wcyAqZGFpX3Byb3BzOworCWludCBudW0sIHJldDsKIAotCXJldCA9IF9fYXNvY19zaW1wbGVfY2FyZF9kYWlfaW5pdChjb2RlYywgJmluZm8tPmNvZGVjX2RhaSwgZGFpZm10KTsKKwludW0gPSBydGQgLSBydGQtPmNhcmQtPnJ0ZDsKKwlkYWlfcHJvcHMgPSAmcHJpdi0+ZGFpX3Byb3BzW251bV07CisJcmV0ID0gX19hc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0KGNvZGVjLCAmZGFpX3Byb3BzLT5jb2RlY19kYWkpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gX19hc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0KGNwdSwgJmluZm8tPmNwdV9kYWksIGRhaWZtdCk7CisJcmV0ID0gX19hc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0KGNwdSwgJmRhaV9wcm9wcy0+Y3B1X2RhaSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTU5LDkgKzg4LDEyIEBACiAKIHN0YXRpYyBpbnQKIGFzb2Nfc2ltcGxlX2NhcmRfc3ViX3BhcnNlX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgZGFpZm10LAogCQkJICAgICAgc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqZGFpLAotCQkJICAgICAgc3RydWN0IGRldmljZV9ub2RlICoqbm9kZSkKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqKnBfbm9kZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKipuYW1lKQogeworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJaW50IHJldDsKIApAQCAtNjksMTQgKzEwMSwyMCBAQAogCSAqIGdldCBub2RlIHZpYSAic291bmQtZGFpID0gPCZwaGFuZGxlIHBvcnQ+IgogCSAqIGl0IHdpbGwgYmUgdXNlZCBhcyB4eHhfb2Zfbm9kZSBvbiBzb2NfYmluZF9kYWlfbGluaygpCiAJICovCi0JKm5vZGUgPSBvZl9wYXJzZV9waGFuZGxlKG5wLCAic291bmQtZGFpIiwgMCk7Ci0JaWYgKCEqbm9kZSkKKwlub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgInNvdW5kLWRhaSIsIDApOworCWlmICghbm9kZSkKIAkJcmV0dXJuIC1FTk9ERVY7CisJKnBfbm9kZSA9IG5vZGU7CiAKIAkvKiBnZXQgZGFpLT5uYW1lICovCi0JcmV0ID0gc25kX3NvY19vZl9nZXRfZGFpX25hbWUobnAsICZkYWktPm5hbWUpOworCXJldCA9IHNuZF9zb2Nfb2ZfZ2V0X2RhaV9uYW1lKG5wLCBuYW1lKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBwYXJzZV9lcnJvcjsKKwkJcmV0dXJuIHJldDsKKworCS8qIHBhcnNlIFRETSBzbG90ICovCisJcmV0ID0gc25kX3NvY19vZl9wYXJzZV90ZG1fc2xvdChucCwgJmRhaS0+c2xvdHMsICZkYWktPnNsb3Rfd2lkdGgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAkvKgogCSAqIGJpdGNsb2NrLWludmVyc2lvbiwgZnJhbWUtaW52ZXJzaW9uCkBAIC04NCw2ICsxMjIsNyBAQAogCSAqIGFuZCBzcGVjaWZpYyAiZm9ybWF0IiBpZiBpdCBoYXMKIAkgKi8KIAlkYWktPmZtdCA9IHNuZF9zb2Nfb2ZfcGFyc2VfZGFpZm10KG5wLCBOVUxMKTsKKwlkYWktPmZtdCB8PSBkYWlmbXQ7CiAKIAkvKgogCSAqIGRhaS0+c3lzY2xrIGNvbWUgZnJvbQpAQCAtOTUsNyArMTM0LDcgQEAKIAkJY2xrID0gb2ZfY2xrX2dldChucCwgMCk7CiAJCWlmIChJU19FUlIoY2xrKSkgewogCQkJcmV0ID0gUFRSX0VSUihjbGspOwotCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAogCQlkYWktPnN5c2NsayA9IGNsa19nZXRfcmF0ZShjbGspOwpAQCAtMTA0LDE2NCArMTQzLDI3OCBAQAogCQkJCSAgICAgInN5c3RlbS1jbG9jay1mcmVxdWVuY3kiLAogCQkJCSAgICAgJmRhaS0+c3lzY2xrKTsKIAl9IGVsc2UgewotCQljbGsgPSBvZl9jbGtfZ2V0KCpub2RlLCAwKTsKKwkJY2xrID0gb2ZfY2xrX2dldChub2RlLCAwKTsKIAkJaWYgKCFJU19FUlIoY2xrKSkKIAkJCWRhaS0+c3lzY2xrID0gY2xrX2dldF9yYXRlKGNsayk7CiAJfQogCi0JcmV0ID0gMDsKLQotcGFyc2VfZXJyb3I6Ci0Jb2Zfbm9kZV9wdXQoKm5vZGUpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKLQkJCQkgICAgIHN0cnVjdCBhc29jX3NpbXBsZV9jYXJkX2luZm8gKmluZm8sCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKipvZl9jcHUsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKipvZl9jb2RlYywKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKm9mX3BsYXRmb3JtKQorc3RhdGljIGludCBzaW1wbGVfY2FyZF9jcHVfY29kZWNfb2Yoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCWludCBkYWlmbXQsCisJCQkJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rLAorCQkJCXN0cnVjdCBzaW1wbGVfZGFpX3Byb3BzICpkYWlfcHJvcHMpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKLQljaGFyICpuYW1lOwogCWludCByZXQ7CiAKLQkvKiBnZXQgQ1BVL0NPREVDIGNvbW1vbiBmb3JtYXQgdmlhIHNpbXBsZS1hdWRpby1jYXJkLGZvcm1hdCAqLwotCWluZm8tPmRhaWZtdCA9IHNuZF9zb2Nfb2ZfcGFyc2VfZGFpZm10KG5vZGUsICJzaW1wbGUtYXVkaW8tY2FyZCwiKSAmCi0JCShTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSyB8IFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKTsKLQotCS8qIERBUE0gcm91dGVzICovCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChub2RlLCAic2ltcGxlLWF1ZGlvLWNhcmQscm91dGluZyIpKSB7Ci0JCXJldCA9IHNuZF9zb2Nfb2ZfcGFyc2VfYXVkaW9fcm91dGluZygmaW5mby0+c25kX2NhcmQsCi0JCQkJCSJzaW1wbGUtYXVkaW8tY2FyZCxyb3V0aW5nIik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIENQVSBzdWItbm9kZSAqLwogCXJldCA9IC1FSU5WQUw7CiAJbnAgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShub2RlLCAic2ltcGxlLWF1ZGlvLWNhcmQsY3B1Iik7Ci0JaWYgKG5wKQotCQlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3N1Yl9wYXJzZV9vZihucCwKLQkJCQkJCSAgJmluZm8tPmNwdV9kYWksCi0JCQkJCQkgIG9mX2NwdSk7CisJaWYgKG5wKSB7CisJCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfc3ViX3BhcnNlX29mKG5wLCBkYWlmbXQsCisJCQkJCQkmZGFpX3Byb3BzLT5jcHVfZGFpLAorCQkJCQkJJmRhaV9saW5rLT5jcHVfb2Zfbm9kZSwKKwkJCQkJCSZkYWlfbGluay0+Y3B1X2RhaV9uYW1lKTsKKwkJb2Zfbm9kZV9wdXQobnApOworCX0KIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAogCS8qIENPREVDIHN1Yi1ub2RlICovCiAJcmV0ID0gLUVJTlZBTDsKIAlucCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5vZGUsICJzaW1wbGUtYXVkaW8tY2FyZCxjb2RlYyIpOwotCWlmIChucCkKLQkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9zdWJfcGFyc2Vfb2YobnAsCi0JCQkJCQkgICZpbmZvLT5jb2RlY19kYWksCi0JCQkJCQkgIG9mX2NvZGVjKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwlpZiAobnApIHsKKwkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9zdWJfcGFyc2Vfb2YobnAsIGRhaWZtdCwKKwkJCQkJCSZkYWlfcHJvcHMtPmNvZGVjX2RhaSwKKwkJCQkJCSZkYWlfbGluay0+Y29kZWNfb2Zfbm9kZSwKKwkJCQkJCSZkYWlfbGluay0+Y29kZWNfZGFpX25hbWUpOworCQlvZl9ub2RlX3B1dChucCk7CisJfQorCXJldHVybiByZXQ7Cit9CiAKLQlpZiAoIWluZm8tPmNwdV9kYWkubmFtZSB8fCAhaW5mby0+Y29kZWNfZGFpLm5hbWUpCi0JCXJldHVybiAtRUlOVkFMOworc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkgICAgIHN0cnVjdCBzaW1wbGVfY2FyZF9kYXRhICpwcml2LAorCQkJCSAgICAgc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgaW50IG11bHRpKQoreworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IHByaXYtPnNuZF9jYXJkLmRhaV9saW5rOworCXN0cnVjdCBzaW1wbGVfZGFpX3Byb3BzICpkYWlfcHJvcHMgPSBwcml2LT5kYWlfcHJvcHM7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwljaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBkYWlmbXQ7CisJaW50IHJldDsKKworCS8qIHBhcnNpbmcgdGhlIGNhcmQgbmFtZSBmcm9tIERUICovCisJc25kX3NvY19vZl9wYXJzZV9jYXJkX25hbWUoJnByaXYtPnNuZF9jYXJkLCAic2ltcGxlLWF1ZGlvLWNhcmQsbmFtZSIpOworCisJLyogZ2V0IENQVS9DT0RFQyBjb21tb24gZm9ybWF0IHZpYSBzaW1wbGUtYXVkaW8tY2FyZCxmb3JtYXQgKi8KKwlkYWlmbXQgPSBzbmRfc29jX29mX3BhcnNlX2RhaWZtdChub2RlLCAic2ltcGxlLWF1ZGlvLWNhcmQsIikgJgorCQkoU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0sgfCBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSyk7CisKKwkvKiBvZmYtY29kZWMgd2lkZ2V0cyAqLworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobm9kZSwgInNpbXBsZS1hdWRpby1jYXJkLHdpZGdldHMiKSkgeworCQlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3NpbXBsZV93aWRnZXRzKCZwcml2LT5zbmRfY2FyZCwKKwkJCQkJInNpbXBsZS1hdWRpby1jYXJkLHdpZGdldHMiKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogREFQTSByb3V0ZXMgKi8KKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5vZGUsICJzaW1wbGUtYXVkaW8tY2FyZCxyb3V0aW5nIikpIHsKKwkJcmV0ID0gc25kX3NvY19vZl9wYXJzZV9hdWRpb19yb3V0aW5nKCZwcml2LT5zbmRfY2FyZCwKKwkJCQkJInNpbXBsZS1hdWRpby1jYXJkLHJvdXRpbmciKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogbG9vcCBvbiB0aGUgREFJIGxpbmtzICovCisJbnAgPSBOVUxMOworCWZvciAoOzspIHsKKwkJaWYgKG11bHRpKSB7CisJCQlucCA9IG9mX2dldF9uZXh0X2NoaWxkKG5vZGUsIG5wKTsKKwkJCWlmICghbnApCisJCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSBzaW1wbGVfY2FyZF9jcHVfY29kZWNfb2YobXVsdGkgPyBucCA6IG5vZGUsCisJCQkJCWRhaWZtdCwgZGFpX2xpbmssIGRhaV9wcm9wcyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnI7CisKKwkJLyoKKwkJICogb3ZlcndyaXRlIGNwdV9kYWktPmZtdCBhcyBpdHMgREFJRk1UX01BU1RFUiBiaXQgaXMgYmFzZWQgb24gQ09ERUMKKwkJICogd2hpbGUgdGhlIG90aGVyIGJpdHMgc2hvdWxkIGJlIGlkZW50aWNhbCB1bmxlc3MgYnVnZ3kgU1cvSFcgZGVzaWduLgorCQkgKi8KKwkJZGFpX3Byb3BzLT5jcHVfZGFpLmZtdCA9IGRhaV9wcm9wcy0+Y29kZWNfZGFpLmZtdDsKKworCQlpZiAoIWRhaV9saW5rLT5jcHVfZGFpX25hbWUgfHwgIWRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJLyogc2ltcGxlLWNhcmQgYXNzdW1lcyBwbGF0Zm9ybSA9PSBjcHUgKi8KKwkJZGFpX2xpbmstPnBsYXRmb3JtX29mX25vZGUgPSBkYWlfbGluay0+Y3B1X29mX25vZGU7CisKKwkJbmFtZSA9IGRldm1fa3phbGxvYyhkZXYsCisJCQkJICAgIHN0cmxlbihkYWlfbGluay0+Y3B1X2RhaV9uYW1lKSAgICsKKwkJCQkgICAgc3RybGVuKGRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSkgKyAyLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJc3ByaW50ZihuYW1lLCAiJXMtJXMiLCBkYWlfbGluay0+Y3B1X2RhaV9uYW1lLAorCQkJCQlkYWlfbGluay0+Y29kZWNfZGFpX25hbWUpOworCQlkYWlfbGluay0+bmFtZSA9IGRhaV9saW5rLT5zdHJlYW1fbmFtZSA9IG5hbWU7CisKKwkJaWYgKCFtdWx0aSkKKwkJCWJyZWFrOworCisJCWRhaV9saW5rKys7CisJCWRhaV9wcm9wcysrOworCX0KIAogCS8qIGNhcmQgbmFtZSBpcyBjcmVhdGVkIGZyb20gQ1BVL0NPREVDIGRhaSBuYW1lICovCi0JbmFtZSA9IGRldm1fa3phbGxvYyhkZXYsCi0JCQkgICAgc3RybGVuKGluZm8tPmNwdV9kYWkubmFtZSkgICArCi0JCQkgICAgc3RybGVuKGluZm8tPmNvZGVjX2RhaS5uYW1lKSArIDIsCi0JCQkgICAgR0ZQX0tFUk5FTCk7Ci0Jc3ByaW50ZihuYW1lLCAiJXMtJXMiLCBpbmZvLT5jcHVfZGFpLm5hbWUsIGluZm8tPmNvZGVjX2RhaS5uYW1lKTsKLQlpbmZvLT5uYW1lID0gaW5mby0+Y2FyZCA9IG5hbWU7CisJZGFpX2xpbmsgPSBwcml2LT5zbmRfY2FyZC5kYWlfbGluazsKKwlpZiAoIXByaXYtPnNuZF9jYXJkLm5hbWUpCisJCXByaXYtPnNuZF9jYXJkLm5hbWUgPSBkYWlfbGluay0+bmFtZTsKIAotCS8qIHNpbXBsZS1jYXJkIGFzc3VtZXMgcGxhdGZvcm0gPT0gY3B1ICovCi0JKm9mX3BsYXRmb3JtID0gKm9mX2NwdTsKLQotCWRldl9kYmcoZGV2LCAiY2FyZC1uYW1lIDogJXNcbiIsIGluZm8tPmNhcmQpOwotCWRldl9kYmcoZGV2LCAicGxhdGZvcm0gOiAlMDR4XG4iLCBpbmZvLT5kYWlmbXQpOworCWRldl9kYmcoZGV2LCAiY2FyZC1uYW1lIDogJXNcbiIsIHByaXYtPnNuZF9jYXJkLm5hbWUpOworCWRldl9kYmcoZGV2LCAicGxhdGZvcm0gOiAlMDR4XG4iLCBkYWlmbXQpOworCWRhaV9wcm9wcyA9IHByaXYtPmRhaV9wcm9wczsKIAlkZXZfZGJnKGRldiwgImNwdSA6ICVzIC8gJTA0eCAvICVkXG4iLAotCQlpbmZvLT5jcHVfZGFpLm5hbWUsCi0JCWluZm8tPmNwdV9kYWkuZm10LAotCQlpbmZvLT5jcHVfZGFpLnN5c2Nsayk7CisJCWRhaV9saW5rLT5jcHVfZGFpX25hbWUsCisJCWRhaV9wcm9wcy0+Y3B1X2RhaS5mbXQsCisJCWRhaV9wcm9wcy0+Y3B1X2RhaS5zeXNjbGspOwogCWRldl9kYmcoZGV2LCAiY29kZWMgOiAlcyAvICUwNHggLyAlZFxuIiwKLQkJaW5mby0+Y29kZWNfZGFpLm5hbWUsCi0JCWluZm8tPmNvZGVjX2RhaS5mbXQsCi0JCWluZm8tPmNvZGVjX2RhaS5zeXNjbGspOworCQlkYWlfbGluay0+Y29kZWNfZGFpX25hbWUsCisJCWRhaV9wcm9wcy0+Y29kZWNfZGFpLmZtdCwKKwkJZGFpX3Byb3BzLT5jb2RlY19kYWkuc3lzY2xrKTsKIAogCXJldHVybiAwOworCitlcnI6CisJb2Zfbm9kZV9wdXQobnApOworCXJldHVybiByZXQ7Cit9CisKKy8qIHVwZGF0ZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBkZXZpY2VzIG5vZGVzIGF0IGVuZCBvZiBwcm9iZSAqLworc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3VucmVmKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCWludCBudW1fbGlua3M7CisKKwlmb3IgKG51bV9saW5rcyA9IDAsIGRhaV9saW5rID0gY2FyZC0+ZGFpX2xpbms7CisJICAgICBudW1fbGlua3MgPCBjYXJkLT5udW1fbGlua3M7CisJICAgICBudW1fbGlua3MrKywgZGFpX2xpbmsrKykgeworCQlucCA9IChzdHJ1Y3QgZGV2aWNlX25vZGUgKikgZGFpX2xpbmstPmNwdV9vZl9ub2RlOworCQlpZiAobnApCisJCQlvZl9ub2RlX3B1dChucCk7CisJCW5wID0gKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKSBkYWlfbGluay0+Y29kZWNfb2Zfbm9kZTsKKwkJaWYgKG5wKQorCQkJb2Zfbm9kZV9wdXQobnApOworCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGFzb2Nfc2ltcGxlX2NhcmRfaW5mbyAqY2luZm87CisJc3RydWN0IHNpbXBsZV9jYXJkX2RhdGEgKnByaXY7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2NwdSwgKm9mX2NvZGVjLCAqb2ZfcGxhdGZvcm07CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlpbnQgcmV0OworCWludCBudW1fbGlua3MsIG11bHRpLCByZXQ7CiAKLQljaW5mbwkJPSBOVUxMOwotCW9mX2NwdQkJPSBOVUxMOwotCW9mX2NvZGVjCT0gTlVMTDsKLQlvZl9wbGF0Zm9ybQk9IE5VTEw7CisJLyogZ2V0IHRoZSBudW1iZXIgb2YgREFJIGxpbmtzICovCisJaWYgKG5wICYmIG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAic2ltcGxlLWF1ZGlvLWNhcmQsZGFpLWxpbmsiKSkgeworCQludW1fbGlua3MgPSBvZl9nZXRfY2hpbGRfY291bnQobnApOworCQltdWx0aSA9IDE7CisJfSBlbHNlIHsKKwkJbnVtX2xpbmtzID0gMTsKKwkJbXVsdGkgPSAwOworCX0KIAotCWNpbmZvID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghY2luZm8pCisJLyogYWxsb2NhdGUgdGhlIHByaXZhdGUgZGF0YSBhbmQgdGhlIERBSSBsaW5rIGFycmF5ICovCisJcHJpdiA9IGRldm1fa3phbGxvYyhkZXYsCisJCQlzaXplb2YoKnByaXYpICsgc2l6ZW9mKCpkYWlfbGluaykgKiBudW1fbGlua3MsCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBpbml0IHNuZF9zb2NfY2FyZAorCSAqLworCXByaXYtPnNuZF9jYXJkLm93bmVyID0gVEhJU19NT0RVTEU7CisJcHJpdi0+c25kX2NhcmQuZGV2ID0gZGV2OworCWRhaV9saW5rID0gcHJpdi0+ZGFpX2xpbms7CisJcHJpdi0+c25kX2NhcmQuZGFpX2xpbmsgPSBkYWlfbGluazsKKwlwcml2LT5zbmRfY2FyZC5udW1fbGlua3MgPSBudW1fbGlua3M7CisKKwkvKiBnZXQgcm9vbSBmb3IgdGhlIG90aGVyIHByb3BlcnRpZXMgKi8KKwlwcml2LT5kYWlfcHJvcHMgPSBkZXZtX2t6YWxsb2MoZGV2LAorCQkJc2l6ZW9mKCpwcml2LT5kYWlfcHJvcHMpICogbnVtX2xpbmtzLAorCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2LT5kYWlfcHJvcHMpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKG5wICYmIG9mX2RldmljZV9pc19hdmFpbGFibGUobnApKSB7Ci0JCWNpbmZvLT5zbmRfY2FyZC5kZXYgPSBkZXY7CiAKLQkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9vZihucCwgY2luZm8sIGRldiwKLQkJCQkJCSZvZl9jcHUsCi0JCQkJCQkmb2ZfY29kZWMsCi0JCQkJCQkmb2ZfcGxhdGZvcm0pOworCQlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX29mKG5wLCBwcml2LCBkZXYsIG11bHRpKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWlmIChyZXQgIT0gLUVQUk9CRV9ERUZFUikKIAkJCQlkZXZfZXJyKGRldiwgInBhcnNlIGVycm9yICVkXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gZXJyOwogCQl9CisKKwkJLyoKKwkJICogc29jX2JpbmRfZGFpX2xpbmsoKSB3aWxsIGNoZWNrIGNwdSBuYW1lCisJCSAqIGFmdGVyIG9mX25vZGUgbWF0Y2hpbmcgaWYgZGFpX2xpbmsgaGFzIGNwdV9kYWlfbmFtZS4KKwkJICogYnV0LCBpdCB3aWxsIG5ldmVyIG1hdGNoIGlmIG5hbWUgd2FzIGNyZWF0ZWQgYnkgZm10X3NpbmdsZV9uYW1lKCkKKwkJICogcmVtb3ZlIGNwdV9kYWlfbmFtZSB0byBlc2NhcGUgbmFtZSBtYXRjaGluZy4KKwkJICogc2VlCisJCSAqCWZtdF9zaW5nbGVfbmFtZSgpCisJCSAqCWZtdF9tdWx0aXBsZV9uYW1lKCkKKwkJICovCisJCWlmIChudW1fbGlua3MgPT0gMSkKKwkJCWRhaV9saW5rLT5jcHVfZGFpX25hbWUgPSBOVUxMOworCiAJfSBlbHNlIHsKLQkJaWYgKCFkZXYtPnBsYXRmb3JtX2RhdGEpIHsKKwkJc3RydWN0IGFzb2Nfc2ltcGxlX2NhcmRfaW5mbyAqY2luZm87CisKKwkJY2luZm8gPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJCWlmICghY2luZm8pIHsKIAkJCWRldl9lcnIoZGV2LCAibm8gaW5mbyBmb3IgYXNvYy1zaW1wbGUtY2FyZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCW1lbWNweShjaW5mbywgZGV2LT5wbGF0Zm9ybV9kYXRhLCBzaXplb2YoKmNpbmZvKSk7Ci0JCWNpbmZvLT5zbmRfY2FyZC5kZXYgPSBkZXY7Ci0JfQorCQlpZiAoIWNpbmZvLT5uYW1lCXx8CisJCSAgICAhY2luZm8tPmNvZGVjX2RhaS5uYW1lCXx8CisJCSAgICAhY2luZm8tPmNvZGVjCXx8CisJCSAgICAhY2luZm8tPnBsYXRmb3JtCXx8CisJCSAgICAhY2luZm8tPmNwdV9kYWkubmFtZSkgeworCQkJZGV2X2VycihkZXYsICJpbnN1ZmZpY2llbnQgYXNvY19zaW1wbGVfY2FyZF9pbmZvIHNldHRpbmdzXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAKLQlpZiAoIWNpbmZvLT5uYW1lCXx8Ci0JICAgICFjaW5mby0+Y2FyZAl8fAotCSAgICAhY2luZm8tPmNvZGVjX2RhaS5uYW1lCXx8Ci0JICAgICEoY2luZm8tPmNvZGVjCQl8fCBvZl9jb2RlYykJfHwKLQkgICAgIShjaW5mby0+cGxhdGZvcm0JCXx8IG9mX3BsYXRmb3JtKQl8fAotCSAgICAhKGNpbmZvLT5jcHVfZGFpLm5hbWUJfHwgb2ZfY3B1KSkgewotCQlkZXZfZXJyKGRldiwgImluc3VmZmljaWVudCBhc29jX3NpbXBsZV9jYXJkX2luZm8gc2V0dGluZ3NcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcHJpdi0+c25kX2NhcmQubmFtZQk9IChjaW5mby0+Y2FyZCkgPyBjaW5mby0+Y2FyZCA6IGNpbmZvLT5uYW1lOworCQlkYWlfbGluay0+bmFtZQkJPSBjaW5mby0+bmFtZTsKKwkJZGFpX2xpbmstPnN0cmVhbV9uYW1lCT0gY2luZm8tPm5hbWU7CisJCWRhaV9saW5rLT5wbGF0Zm9ybV9uYW1lCT0gY2luZm8tPnBsYXRmb3JtOworCQlkYWlfbGluay0+Y29kZWNfbmFtZQk9IGNpbmZvLT5jb2RlYzsKKwkJZGFpX2xpbmstPmNwdV9kYWlfbmFtZQk9IGNpbmZvLT5jcHVfZGFpLm5hbWU7CisJCWRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSA9IGNpbmZvLT5jb2RlY19kYWkubmFtZTsKKwkJbWVtY3B5KCZwcml2LT5kYWlfcHJvcHMtPmNwdV9kYWksICZjaW5mby0+Y3B1X2RhaSwKKwkJCQkJc2l6ZW9mKHByaXYtPmRhaV9wcm9wcy0+Y3B1X2RhaSkpOworCQltZW1jcHkoJnByaXYtPmRhaV9wcm9wcy0+Y29kZWNfZGFpLCAmY2luZm8tPmNvZGVjX2RhaSwKKwkJCQkJc2l6ZW9mKHByaXYtPmRhaV9wcm9wcy0+Y29kZWNfZGFpKSk7CisKKwkJcHJpdi0+ZGFpX3Byb3BzLT5jcHVfZGFpLmZtdAl8PSBjaW5mby0+ZGFpZm10OworCQlwcml2LT5kYWlfcHJvcHMtPmNvZGVjX2RhaS5mbXQJfD0gY2luZm8tPmRhaWZtdDsKIAl9CiAKIAkvKgogCSAqIGluaXQgc25kX3NvY19kYWlfbGluawogCSAqLwotCWNpbmZvLT5zbmRfbGluay5uYW1lCQk9IGNpbmZvLT5uYW1lOwotCWNpbmZvLT5zbmRfbGluay5zdHJlYW1fbmFtZQk9IGNpbmZvLT5uYW1lOwotCWNpbmZvLT5zbmRfbGluay5jcHVfZGFpX25hbWUJPSBjaW5mby0+Y3B1X2RhaS5uYW1lOwotCWNpbmZvLT5zbmRfbGluay5wbGF0Zm9ybV9uYW1lCT0gY2luZm8tPnBsYXRmb3JtOwotCWNpbmZvLT5zbmRfbGluay5jb2RlY19uYW1lCT0gY2luZm8tPmNvZGVjOwotCWNpbmZvLT5zbmRfbGluay5jb2RlY19kYWlfbmFtZQk9IGNpbmZvLT5jb2RlY19kYWkubmFtZTsKLQljaW5mby0+c25kX2xpbmsuY3B1X29mX25vZGUJPSBvZl9jcHU7Ci0JY2luZm8tPnNuZF9saW5rLmNvZGVjX29mX25vZGUJPSBvZl9jb2RlYzsKLQljaW5mby0+c25kX2xpbmsucGxhdGZvcm1fb2Zfbm9kZSA9IG9mX3BsYXRmb3JtOwotCWNpbmZvLT5zbmRfbGluay5pbml0CQk9IGFzb2Nfc2ltcGxlX2NhcmRfZGFpX2luaXQ7CisJZGFpX2xpbmstPmluaXQgPSBhc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0OwogCi0JLyoKLQkgKiBpbml0IHNuZF9zb2NfY2FyZAotCSAqLwotCWNpbmZvLT5zbmRfY2FyZC5uYW1lCQk9IGNpbmZvLT5jYXJkOwotCWNpbmZvLT5zbmRfY2FyZC5vd25lcgkJPSBUSElTX01PRFVMRTsKLQljaW5mby0+c25kX2NhcmQuZGFpX2xpbmsJPSAmY2luZm8tPnNuZF9saW5rOwotCWNpbmZvLT5zbmRfY2FyZC5udW1fbGlua3MJPSAxOworCXNuZF9zb2NfY2FyZF9zZXRfZHJ2ZGF0YSgmcHJpdi0+c25kX2NhcmQsIHByaXYpOwogCi0Jc25kX3NvY19jYXJkX3NldF9kcnZkYXRhKCZjaW5mby0+c25kX2NhcmQsIGNpbmZvKTsKKwlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCAmcHJpdi0+c25kX2NhcmQpOwogCi0JcmV0dXJuIGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsICZjaW5mby0+c25kX2NhcmQpOworZXJyOgorCWFzb2Nfc2ltcGxlX2NhcmRfdW5yZWYocGRldik7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXNvY19zaW1wbGVfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9LY29uZmlnIGIvc291bmQvc29jL2ludGVsL0tjb25maWcKaW5kZXggNjFjMTBiZi4uM2M4MWIzOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL0tjb25maWcKKysrIGIvc291bmQvc29jL2ludGVsL0tjb25maWcKQEAgLTIsMTIgKzIsNTAgQEAKIAl0cmlzdGF0ZSAiU09DIE1hY2hpbmUgQXVkaW8gZHJpdmVyIGZvciBJbnRlbCBNZWRmaWVsZCBNSUQgcGxhdGZvcm0iCiAJZGVwZW5kcyBvbiBJTlRFTF9TQ1VfSVBDCiAJc2VsZWN0IFNORF9TT0NfU045NTAzMQotCXNlbGVjdCBTTkRfU1NUX1BMQVRGT1JNCisJc2VsZWN0IFNORF9TU1RfTUZMRF9QTEFURk9STQogCWhlbHAKICAgICAgICAgICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgQVNvQyBtYWNoaW5lIGRyaXZlciBmb3IgSW50ZWwoUikgTUlEIE1lZGZpZWxkIHBsYXRmb3JtCiAgICAgICAgICAgdXNlZCBhcyBhbHNhIGRldmljZSBpbiBhdWRpbyBzdWJzdGVtIGluIEludGVsKFIpIE1JRCBkZXZpY2VzCiAgICAgICAgICAgU2F5IFkgaWYgeW91IGhhdmUgc3VjaCBhIGRldmljZQogICAgICAgICAgIElmIHVuc3VyZSBzZWxlY3QgIk4iLgogCi1jb25maWcgU05EX1NTVF9QTEFURk9STQorY29uZmlnIFNORF9TU1RfTUZMRF9QTEFURk9STQogCXRyaXN0YXRlCisKK2NvbmZpZyBTTkRfU09DX0lOVEVMX1NTVAorCXRyaXN0YXRlICJBU29DIHN1cHBvcnQgZm9yIEludGVsKFIpIFNtYXJ0IFNvdW5kIFRlY2hub2xvZ3kiCisJc2VsZWN0IFNORF9TT0NfSU5URUxfU1NUX0FDUEkgaWYgQUNQSQorCWRlcGVuZHMgb24gKFg4NiB8fCBDT01QSUxFX1RFU1QpCisJaGVscAorICAgICAgICAgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBJbnRlbChSKSBTbWFydCBTb3VuZCBUZWNobm9sb2d5IChTU1QpLgorICAgICAgICAgIFNheSBZIGlmIHlvdSBoYXZlIHN1Y2ggYSBkZXZpY2UKKyAgICAgICAgICBJZiB1bnN1cmUgc2VsZWN0ICJOIi4KKworY29uZmlnIFNORF9TT0NfSU5URUxfU1NUX0FDUEkKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19JTlRFTF9IQVNXRUxMCisJdHJpc3RhdGUKKworY29uZmlnIFNORF9TT0NfSU5URUxfQkFZVFJBSUwKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19JTlRFTF9IQVNXRUxMX01BQ0gKKwl0cmlzdGF0ZSAiQVNvQyBBdWRpbyBEU1Agc3VwcG9ydCBmb3IgSW50ZWwgSGFzd2VsbCBMeW54cG9pbnQiCisJZGVwZW5kcyBvbiBTTkRfU09DX0lOVEVMX1NTVCAmJiBYODZfSU5URUxfTFBTUyAmJiBJMkMKKwlzZWxlY3QgU05EX1NPQ19JTlRFTF9IQVNXRUxMCisJc2VsZWN0IFNORF9TT0NfUlQ1NjQwCisJaGVscAorCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIHRoZSBMeW54cG9pbnQgQXVkaW8gRFNQIG9uIEludGVsKFIpIEhhc3dlbGwKKwkgIFVsdHJhYm9vayBwbGF0Zm9ybXMuCisJICBTYXkgWSBpZiB5b3UgaGF2ZSBzdWNoIGEgZGV2aWNlCisJICBJZiB1bnN1cmUgc2VsZWN0ICJOIi4KKworY29uZmlnIFNORF9TT0NfSU5URUxfQllUX1JUNTY0MF9NQUNICisJdHJpc3RhdGUgIkFTb0MgQXVkaW8gZHJpdmVyIGZvciBJbnRlbCBCYXl0cmFpbCB3aXRoIFJUNTY0MCBjb2RlYyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSU5URUxfU1NUICYmIFg4Nl9JTlRFTF9MUFNTICYmIEkyQworCXNlbGVjdCBTTkRfU09DX0lOVEVMX0JBWVRSQUlMCisJc2VsZWN0IFNORF9TT0NfUlQ1NjQwCisJaGVscAorCSAgVGhpcyBhZGRzIGF1ZGlvIGRyaXZlciBmb3IgSW50ZWwgQmF5dHJhaWwgcGxhdGZvcm0gYmFzZWQgYm9hcmRzCisJICB3aXRoIHRoZSBSVDU2NDAgYXVkaW8gY29kZWMuCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvTWFrZWZpbGUgYi9zb3VuZC9zb2MvaW50ZWwvTWFrZWZpbGUKaW5kZXggNjM5ODgzMy4uZWRlYjc5YWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvaW50ZWwvTWFrZWZpbGUKQEAgLTEsNSArMSwyOCBAQAotc25kLXNvYy1zc3QtcGxhdGZvcm0tb2JqcyA6PSBzc3RfcGxhdGZvcm0ubworIyBDb3JlIHN1cHBvcnQKK3NuZC1zb2Mtc3N0LWRzcC1vYmpzIDo9IHNzdC1kc3AubyBzc3QtZmlybXdhcmUubworc25kLXNvYy1zc3QtYWNwaS1vYmpzIDo9IHNzdC1hY3BpLm8KKworc25kLXNvYy1zc3QtbWZsZC1wbGF0Zm9ybS1vYmpzIDo9IHNzdC1tZmxkLXBsYXRmb3JtLm8KIHNuZC1zb2MtbWZsZC1tYWNoaW5lLW9ianMgOj0gbWZsZF9tYWNoaW5lLm8KIAotb2JqLSQoQ09ORklHX1NORF9TU1RfUExBVEZPUk0pICs9IHNuZC1zb2Mtc3N0LXBsYXRmb3JtLm8KK29iai0kKENPTkZJR19TTkRfU1NUX01GTERfUExBVEZPUk0pICs9IHNuZC1zb2Mtc3N0LW1mbGQtcGxhdGZvcm0ubwogb2JqLSQoQ09ORklHX1NORF9NRkxEX01BQ0hJTkUpICs9IHNuZC1zb2MtbWZsZC1tYWNoaW5lLm8KKworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfU1NUKSArPSBzbmQtc29jLXNzdC1kc3Aubworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfU1NUX0FDUEkpICs9IHNuZC1zb2Mtc3N0LWFjcGkubworCisjIFBsYXRmb3JtIFN1cHBvcnQKK3NuZC1zb2Mtc3N0LWhhc3dlbGwtcGNtLW9ianMgOj0gXAorCXNzdC1oYXN3ZWxsLWlwYy5vIHNzdC1oYXN3ZWxsLXBjbS5vIHNzdC1oYXN3ZWxsLWRzcC5vCitzbmQtc29jLXNzdC1iYXl0cmFpbC1wY20tb2JqcyA6PSBcCisJc3N0LWJheXRyYWlsLWlwYy5vIHNzdC1iYXl0cmFpbC1wY20ubyBzc3QtYmF5dHJhaWwtZHNwLm8KKworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfSEFTV0VMTCkgKz0gc25kLXNvYy1zc3QtaGFzd2VsbC1wY20ubworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQkFZVFJBSUwpICs9IHNuZC1zb2Mtc3N0LWJheXRyYWlsLXBjbS5vCisKKyMgTWFjaGluZSBzdXBwb3J0CitzbmQtc29jLXNzdC1oYXN3ZWxsLW9ianMgOj0gaGFzd2VsbC5vCitzbmQtc29jLXNzdC1ieXQtcnQ1NjQwLW1hY2gtb2JqcyA6PSBieXQtcnQ1NjQwLm8KKworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfSEFTV0VMTF9NQUNIKSArPSBzbmQtc29jLXNzdC1oYXN3ZWxsLm8KK29iai0kKENPTkZJR19TTkRfU09DX0lOVEVMX0JZVF9SVDU2NDBfTUFDSCkgKz0gc25kLXNvYy1zc3QtYnl0LXJ0NTY0MC1tYWNoLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9ieXQtcnQ1NjQwLmMgYi9zb3VuZC9zb2MvaW50ZWwvYnl0LXJ0NTY0MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZjk3YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvYnl0LXJ0NTY0MC5jCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogSW50ZWwgQmF5dHJhaWwgU1NUIFJUNTY0MCBtYWNoaW5lIGRyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CisjaW5jbHVkZSAiLi4vY29kZWNzL3J0NTY0MC5oIgorCisjaW5jbHVkZSAic3N0LWRzcC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYnl0X3J0NTY0MF93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkludGVybmFsIE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIlNwZWFrZXIiLCBOVUxMKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJ5dF9ydDU2NDBfYXVkaW9fbWFwW10gPSB7CisJeyJJTjJQIiwgTlVMTCwgIkhlYWRzZXQgTWljIn0sCisJeyJJTjJOIiwgTlVMTCwgIkhlYWRzZXQgTWljIn0sCisJeyJETUlDMSIsIE5VTEwsICJJbnRlcm5hbCBNaWMifSwKKwl7IkhlYWRwaG9uZSIsIE5VTEwsICJIUE9MIn0sCisJeyJIZWFkcGhvbmUiLCBOVUxMLCAiSFBPUiJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJTUE9MUCJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJTUE9MTiJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJTUE9SUCJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJTUE9STiJ9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGJ5dF9ydDU2NDBfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkcGhvbmUiKSwKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkc2V0IE1pYyIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkludGVybmFsIE1pYyIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIlNwZWFrZXIiKSwKK307CisKK3N0YXRpYyBpbnQgYnl0X3J0NTY0MF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJaW50IHJldDsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBSVDU2NDBfU0NMS19TX1BMTDEsCisJCQkJICAgICBwYXJhbXNfcmF0ZShwYXJhbXMpICogMjU2LAorCQkJCSAgICAgU05EX1NPQ19DTE9DS19JTik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlY19kYWktPmRldiwgImNhbid0IHNldCBjb2RlYyBjbG9jayAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIDAsIFJUNTY0MF9QTEwxX1NfQkNMSzEsCisJCQkJICBwYXJhbXNfcmF0ZShwYXJhbXMpICogNjQsCisJCQkJICBwYXJhbXNfcmF0ZShwYXJhbXMpICogMjU2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjX2RhaS0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIHBsbDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ5dF9ydDU2NDBfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnVudGltZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ1bnRpbWUtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcnVudGltZS0+Y2FyZDsKKworCWNhcmQtPmRhcG0uaWRsZV9iaWFzX29mZiA9IHRydWU7CisKKwlyZXQgPSBzbmRfc29jX2FkZF9jYXJkX2NvbnRyb2xzKGNhcmQsIGJ5dF9ydDU2NDBfY29udHJvbHMsCisJCQkJCUFSUkFZX1NJWkUoYnl0X3J0NTY0MF9jb250cm9scykpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gYWRkIGNhcmQgY29udHJvbHNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSFBPTCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSFBPUiIpOworCisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTUE9MUCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiU1BPTE4iKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNQT1JQIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTUE9STiIpOworCisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgTWljIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJTcGVha2VyIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkludGVybmFsIE1pYyIpOworCisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBieXRfcnQ1NjQwX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gYnl0X3J0NTY0MF9od19wYXJhbXMsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgYnl0X3J0NTY0MF9kYWlzW10gPSB7CisJeworCQkubmFtZSA9ICJCYXl0cmFpbCBBdWRpbyIsCisJCS5zdHJlYW1fbmFtZSA9ICJBdWRpbyIsCisJCS5jcHVfZGFpX25hbWUgPSAiRnJvbnQtY3B1LWRhaSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJydDU2NDAtYWlmMSIsCisJCS5jb2RlY19uYW1lID0gImkyYy0xMEVDNTY0MDowMCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gImJheXRyYWlsLXBjbS1hdWRpbyIsCisJCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAorCQkJICAgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUywKKwkJLmluaXQgPSBieXRfcnQ1NjQwX2luaXQsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5vcHMgPSAmYnl0X3J0NTY0MF9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gIkJheXRyYWlsIFZvaWNlIiwKKwkJLnN0cmVhbV9uYW1lID0gIlZvaWNlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNaWMxLWNwdS1kYWkiLAorCQkuY29kZWNfZGFpX25hbWUgPSAicnQ1NjQwLWFpZjEiLAorCQkuY29kZWNfbmFtZSA9ICJpMmMtMTBFQzU2NDA6MDAiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJiYXl0cmFpbC1wY20tYXVkaW8iLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GIHwKKwkJCSAgIFNORF9TT0NfREFJRk1UX0NCU19DRlMsCisJCS5pbml0ID0gTlVMTCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm9wcyA9ICZieXRfcnQ1NjQwX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgYnl0X3J0NTY0MF9jYXJkID0geworCS5uYW1lID0gImJ5dC1ydDU2NDAiLAorCS5kYWlfbGluayA9IGJ5dF9ydDU2NDBfZGFpcywKKwkubnVtX2xpbmtzID0gQVJSQVlfU0laRShieXRfcnQ1NjQwX2RhaXMpLAorCS5kYXBtX3dpZGdldHMgPSBieXRfcnQ1NjQwX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGJ5dF9ydDU2NDBfd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYnl0X3J0NTY0MF9hdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYnl0X3J0NTY0MF9hdWRpb19tYXApLAorfTsKKworc3RhdGljIGludCBieXRfcnQ1NjQwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9ICZieXRfcnQ1NjQwX2NhcmQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKworCWNhcmQtPmRldiA9ICZwZGV2LT5kZXY7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgY2FyZCk7CisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChjYXJkKTsKK30KKworc3RhdGljIGludCBieXRfcnQ1NjQwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jYXJkKGNhcmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJ5dF9ydDU2NDBfYXVkaW8gPSB7CisJLnByb2JlID0gYnl0X3J0NTY0MF9wcm9iZSwKKwkucmVtb3ZlID0gYnl0X3J0NTY0MF9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYnl0LXJ0NTY0MCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihieXRfcnQ1NjQwX2F1ZGlvKQorCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgSW50ZWwoUikgQmF5dHJhaWwgTWFjaGluZSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk9tYWlyIE1kIEFiZHVsbGFoLCBKYXJra28gTmlrdWxhIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmJ5dC1ydDU2NDAiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9oYXN3ZWxsLmMgYi9zb3VuZC9zb2MvaW50ZWwvaGFzd2VsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MzQ1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvaGFzd2VsbC5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogSW50ZWwgSGFzd2VsbCBMeW54cG9pbnQgU1NUIEF1ZGlvCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorCisjaW5jbHVkZSAic3N0LWRzcC5oIgorI2luY2x1ZGUgInNzdC1oYXN3ZWxsLWlwYy5oIgorCisjaW5jbHVkZSAiLi4vY29kZWNzL3J0NTY0MC5oIgorCisvKiBIYXN3ZWxsIFVMVCBwbGF0Zm9ybXMgaGF2ZSBhIEhlYWRwaG9uZSBhbmQgTWljIGphY2sgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBoYXN3ZWxsX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fSFAoIkhlYWRwaG9uZXMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJNaWMiLCBOVUxMKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGhhc3dlbGxfcnQ1NjQwX21hcFtdID0geworCisJeyJIZWFkcGhvbmVzIiwgTlVMTCwgIkhQT1IifSwKKwl7IkhlYWRwaG9uZXMiLCBOVUxMLCAiSFBPTCJ9LAorCXsiSU4yUCIsIE5VTEwsICJNaWMifSwKKworCS8qIENPREVDIEJFIGNvbm5lY3Rpb25zICovCisJeyJTU1AwIENPREVDIElOIiwgTlVMTCwgIkFJRjEgQ2FwdHVyZSJ9LAorCXsiQUlGMSBQbGF5YmFjayIsIE5VTEwsICJTU1AwIENPREVDIE9VVCJ9LAorfTsKKworc3RhdGljIGludCBoYXN3ZWxsX3NzcDBfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKKwkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMpOworCisJLyogVGhlIEFEU1Agd2lsbCBjb3ZlcnQgdGhlIEZFIHJhdGUgdG8gNDhrLCBzdGVyZW8gKi8KKwlyYXRlLT5taW4gPSByYXRlLT5tYXggPSA0ODAwMDsKKwljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IDI7CisKKwkvKiBzZXQgU1NQMCB0byAxNiBiaXQgKi8KKwlzbmRfbWFza19zZXQoJnBhcmFtcy0+bWFza3NbU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCAtCisJCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9GSVJTVF9NQVNLXSwKKwkJCQkgICAgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhc3dlbGxfcnQ1NjQwX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlpbnQgcmV0OworCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIFJUNTY0MF9TQ0xLX1NfTUNMSywgMTIyODgwMDAsCisJCVNORF9TT0NfQ0xPQ0tfSU4pOworCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImNhbid0IHNldCBjb2RlYyBzeXNjbGsgY29uZmlndXJhdGlvblxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogc2V0IGNvcnJlY3QgY29kZWMgZmlsdGVyIGZvciBEQUkgZm9ybWF0IGFuZCBjbG9jayBjb25maWcgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKHJ0ZC0+Y29kZWMsIDB4ODMsIDB4ZmZmZiwgMHg4MDAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgaGFzd2VsbF9ydDU2NDBfb3BzID0geworCS5od19wYXJhbXMgPSBoYXN3ZWxsX3J0NTY0MF9od19wYXJhbXMsCit9OworCitzdGF0aWMgaW50IGhhc3dlbGxfcnRkX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKwlzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEocnRkLT5wbGF0Zm9ybS0+ZGV2KTsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaGFzd2VsbCA9IHBkYXRhLT5kc3A7CisJaW50IHJldDsKKworCS8qIFNldCBBRFNQIFNTUCBwb3J0IHNldHRpbmdzICovCisJcmV0ID0gc3N0X2hzd19kZXZpY2Vfc2V0X2NvbmZpZyhoYXN3ZWxsLCBTU1RfSFNXX0RFVklDRV9TU1BfMCwKKwkJU1NUX0hTV19ERVZJQ0VfTUNMS19GUkVRXzI0X01IWiwKKwkJU1NUX0hTV19ERVZJQ0VfQ0xPQ0tfTUFTVEVSLCA5KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZmFpbGVkIHRvIHNldCBkZXZpY2UgY29uZmlnXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBhbHdheXMgY29ubmVjdGVkICovCisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZXMiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGhhc3dlbGxfcnQ1NjQwX2RhaXNbXSA9IHsKKwkvKiBGcm9udCBFbmQgREFJIGxpbmtzICovCisJeworCQkubmFtZSA9ICJTeXN0ZW0iLAorCQkuc3RyZWFtX25hbWUgPSAiU3lzdGVtIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJTeXN0ZW0gUGluIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAiaGFzd2VsbC1wY20tYXVkaW8iLAorCQkuZHluYW1pYyA9IDEsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuaW5pdCA9IGhhc3dlbGxfcnRkX2luaXQsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIk9mZmxvYWQwIiwKKwkJLnN0cmVhbV9uYW1lID0gIk9mZmxvYWQwIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJPZmZsb2FkMCBQaW4iLAorCQkucGxhdGZvcm1fbmFtZSA9ICJoYXN3ZWxsLXBjbS1hdWRpbyIsCisJCS5keW5hbWljID0gMSwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIk9mZmxvYWQxIiwKKwkJLnN0cmVhbV9uYW1lID0gIk9mZmxvYWQxIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJPZmZsb2FkMSBQaW4iLAorCQkucGxhdGZvcm1fbmFtZSA9ICJoYXN3ZWxsLXBjbS1hdWRpbyIsCisJCS5keW5hbWljID0gMSwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIkxvb3BiYWNrIiwKKwkJLnN0cmVhbV9uYW1lID0gIkxvb3BiYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJMb29wYmFjayBQaW4iLAorCQkucGxhdGZvcm1fbmFtZSA9ICJoYXN3ZWxsLXBjbS1hdWRpbyIsCisJCS5keW5hbWljID0gMCwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiQ2FwdHVyZSIsCisJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJDYXB0dXJlIFBpbiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCX0sCisKKwkvKiBCYWNrIEVuZCBEQUkgbGlua3MgKi8KKwl7CisJCS8qIFNTUDAgLSBDb2RlYyAqLworCQkubmFtZSA9ICJDb2RlYyIsCisJCS5iZV9pZCA9IDAsCisJCS5jcHVfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5jb2RlY19uYW1lID0gImkyYy1JTlQzM0NBOjAwIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInJ0NTY0MC1haWYxIiwKKwkJLmRhaV9mbXQgPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9OQl9ORiB8CisJCQlTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IGhhc3dlbGxfc3NwMF9maXh1cCwKKwkJLm9wcyA9ICZoYXN3ZWxsX3J0NTY0MF9vcHMsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJfSwKK307CisKKy8qIGF1ZGlvIG1hY2hpbmUgZHJpdmVyIGZvciBIYXN3ZWxsIEx5bnhwb2ludCBEU1AgKyBSVDU2NDAgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIGhhc3dlbGxfcnQ1NjQwID0geworCS5uYW1lID0gImhhc3dlbGwtcnQ1NjQwIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuZGFpX2xpbmsgPSBoYXN3ZWxsX3J0NTY0MF9kYWlzLAorCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKGhhc3dlbGxfcnQ1NjQwX2RhaXMpLAorCS5kYXBtX3dpZGdldHMgPSBoYXN3ZWxsX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGhhc3dlbGxfd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gaGFzd2VsbF9ydDU2NDBfbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGhhc3dlbGxfcnQ1NjQwX21hcCksCisJLmZ1bGx5X3JvdXRlZCA9IHRydWUsCit9OworCitzdGF0aWMgaW50IGhhc3dlbGxfYXVkaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwloYXN3ZWxsX3J0NTY0MC5kZXYgPSAmcGRldi0+ZGV2OworCisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmaGFzd2VsbF9ydDU2NDApOworfQorCitzdGF0aWMgaW50IGhhc3dlbGxfYXVkaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NhcmQoJmhhc3dlbGxfcnQ1NjQwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaGFzd2VsbF9hdWRpbyA9IHsKKwkucHJvYmUgPSBoYXN3ZWxsX2F1ZGlvX3Byb2JlLAorCS5yZW1vdmUgPSBoYXN3ZWxsX2F1ZGlvX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJoYXN3ZWxsLWF1ZGlvIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoaGFzd2VsbF9hdWRpbykKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJMaWFtIEdpcmR3b29kLCBYaW5nY2hhbyBXYW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIFNTVCBBdWRpbyBmb3IgSGFzd2VsbCBMeW54cG9pbnQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06aGFzd2VsbC1hdWRpbyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL21mbGRfbWFjaGluZS5jIGIvc291bmQvc29jL2ludGVsL21mbGRfbWFjaGluZS5jCmluZGV4IGQzZDRjMzIuLjAzMWQ3ODcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9tZmxkX21hY2hpbmUuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvbWZsZF9tYWNoaW5lLmMKQEAgLTUzLDYgKzUzLDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludAloc19zd2l0Y2g7CiBzdGF0aWMgdW5zaWduZWQgaW50CWxvX2RhYzsKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqbWZsZF9jb2RlYzsKIAogc3RydWN0IG1mbGRfbWNfcHJpdmF0ZSB7CiAJdm9pZCBfX2lvbWVtICppbnRfYmFzZTsKQEAgLTEwMCw0MCArMTAxLDQ3IEBACiBzdGF0aWMgaW50IGhlYWRzZXRfc2V0X3N3aXRjaChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSAgc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNhcmQtPmRhcG07CiAKIAlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPT0gaHNfc3dpdGNoKQogCQlyZXR1cm4gMDsKIAorCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOworCiAJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CiAJCXByX2RlYnVnKCJoc19zZXQgSFMgcGF0aFxuIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkhlYWRwaG9uZXMiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkVQT1VUIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmVzIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRVBPVVQiKTsKIAl9IGVsc2UgewogCQlwcl9kZWJ1ZygiaHNfc2V0IEVQIHBhdGhcbiIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiSGVhZHBob25lcyIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJFUE9VVCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZXMiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkVQT1VUIik7CiAJfQotCXNuZF9zb2NfZGFwbV9zeW5jKCZjb2RlYy0+ZGFwbSk7CisKKwlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7CisKIAloc19zd2l0Y2ggPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBsb19lbmFibGVfb3V0X3BpbnMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQorc3RhdGljIHZvaWQgbG9fZW5hYmxlX291dF9waW5zKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSkKIHsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJJSEZPVVRMIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiSUhGT1VUUiIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkxJTkVPVVRMIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiTElORU9VVFIiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJWSUIxT1VUIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiVklCMk9VVCIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJJSEZPVVRMIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIklIRk9VVFIiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTElORU9VVEwiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTElORU9VVFIiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiVklCMU9VVCIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJWSUIyT1VUIik7CiAJaWYgKGhzX3N3aXRjaCkgewotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJIZWFkcGhvbmVzIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJFUE9VVCIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lcyIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkVQT1VUIik7CiAJfSBlbHNlIHsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkhlYWRwaG9uZXMiKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiRVBPVVQiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmVzIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJFUE9VVCIpOwogCX0KIH0KIApAQCAtMTQ3LDQ1ICsxNTUsNTMgQEAKIHN0YXRpYyBpbnQgbG9fc2V0X3N3aXRjaChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSAgc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNhcmQtPmRhcG07CiAKIAlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPT0gbG9fZGFjKQogCQlyZXR1cm4gMDsKIAorCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOworCiAJLyogd2UgZG9udCB3YW50IHRvIHdvcmsgd2l0aCBsYXN0IHN0YXRlIG9mIGxpbmVvdXQgc28ganVzdCBlbmFibGUgYWxsCiAJICogcGlucyBhbmQgdGhlbiBkaXNhYmxlIHBpbnMgbm90IHJlcXVpcmVkCiAJICovCi0JbG9fZW5hYmxlX291dF9waW5zKGNvZGVjKTsKKwlsb19lbmFibGVfb3V0X3BpbnMoZGFwbSk7CisKIAlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CiAJY2FzZSAwOgogCQlwcl9kZWJ1Zygic2V0IHZpYnJhIHBhdGhcbiIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiVklCMU9VVCIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiVklCMk9VVCIpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBTTjk1MDMxX0xPQ1RMLCAweDY2LCAwKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJWSUIxT1VUIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiVklCMk9VVCIpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKG1mbGRfY29kZWMsIFNOOTUwMzFfTE9DVEwsIDB4NjYsIDApOwogCQlicmVhazsKIAogCWNhc2UgMToKIAkJcHJfZGVidWcoInNldCBocyAgcGF0aFxuIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJIZWFkcGhvbmVzIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJFUE9VVCIpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBTTjk1MDMxX0xPQ1RMLCAweDY2LCAweDIyKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmVzIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRVBPVVQiKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhtZmxkX2NvZGVjLCBTTjk1MDMxX0xPQ1RMLCAweDY2LCAweDIyKTsKIAkJYnJlYWs7CiAKIAljYXNlIDI6CiAJCXByX2RlYnVnKCJzZXQgc3BrciBwYXRoXG4iKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIklIRk9VVEwiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIklIRk9VVFIiKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgU045NTAzMV9MT0NUTCwgMHg2NiwgMHg0NCk7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSUhGT1VUTCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIklIRk9VVFIiKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhtZmxkX2NvZGVjLCBTTjk1MDMxX0xPQ1RMLCAweDY2LCAweDQ0KTsKIAkJYnJlYWs7CiAKIAljYXNlIDM6CiAJCXByX2RlYnVnKCJzZXQgbnVsbCBwYXRoXG4iKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkxJTkVPVVRMIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJMSU5FT1VUUiIpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBTTjk1MDMxX0xPQ1RMLCAweDY2LCAweDY2KTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJMSU5FT1VUTCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkxJTkVPVVRSIik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMobWZsZF9jb2RlYywgU045NTAzMV9MT0NUTCwgMHg2NiwgMHg2Nik7CiAJCWJyZWFrOwogCX0KLQlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOworCisJc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CisKKwlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOworCiAJbG9fZGFjID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CiAJcmV0dXJuIDA7CiB9CkBAIC0yMjEsMjYgKzIzNywxMSBAQAogCiBzdGF0aWMgaW50IG1mbGRfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnVudGltZSkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydW50aW1lLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJnJ1bnRpbWUtPmNhcmQtPmRhcG07CiAJaW50IHJldF92YWw7CiAKLQkvKiBBZGQgamFjayBzZW5zZSB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBtZmxkX3dpZGdldHMsIEFSUkFZX1NJWkUobWZsZF93aWRnZXRzKSk7CisJbWZsZF9jb2RlYyA9IHJ1bnRpbWUtPmNvZGVjOwogCi0JLyogU2V0IHVwIHRoZSBtYXAgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBtZmxkX21hcCwgQVJSQVlfU0laRShtZmxkX21hcCkpOwotCi0JLyogYWx3YXlzIGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkcGhvbmVzIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1pYyIpOwotCi0JcmV0X3ZhbCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBtZmxkX3NuZF9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKG1mbGRfc25kX2NvbnRyb2xzKSk7Ci0JaWYgKHJldF92YWwpIHsKLQkJcHJfZXJyKCJzb2NfYWRkX2NvbnRyb2xzIGZhaWxlZCAlZCIsIHJldF92YWwpOwotCQlyZXR1cm4gcmV0X3ZhbDsKLQl9CiAJLyogZGVmYXVsdCBpcyBlYXJwaWVjZSBwaW4sIHVzZXJzcGFjZSBzZXRzIGl0IGV4cGxjaXRseSAqLwogCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lcyIpOwogCS8qIGRlZmF1bHQgaXMgbGluZW91dCBOQywgdXNlcnNwYWNlIHNldHMgaXQgZXhwbGNpdGx5ICovCkBAIC0yNTMsNyArMjU0LDcgQEAKIAlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxJTkVJTlIiKTsKIAogCS8qIEhlYWRzZXQgYW5kIGJ1dHRvbiBqYWNrIGRldGVjdGlvbiAqLwotCXJldF92YWwgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSW50ZWwoUikgTUlEIEF1ZGlvIEphY2siLAorCXJldF92YWwgPSBzbmRfc29jX2phY2tfbmV3KG1mbGRfY29kZWMsICJJbnRlbChSKSBNSUQgQXVkaW8gSmFjayIsCiAJCQlTTkRfSkFDS19IRUFEU0VUIHwgU05EX0pBQ0tfQlROXzAgfAogCQkJU05EX0pBQ0tfQlROXzEsICZtZmxkX2phY2spOwogCWlmIChyZXRfdmFsKSB7CkBAIC0zMzUsNiArMzM2LDEzIEBACiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLmRhaV9saW5rID0gbWZsZF9tc2ljX2RhaWxpbmssCiAJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUobWZsZF9tc2ljX2RhaWxpbmspLAorCisJLmNvbnRyb2xzID0gbWZsZF9zbmRfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobWZsZF9zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSBtZmxkX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1mbGRfd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gbWZsZF9tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUobWZsZF9tYXApLAogfTsKIAogc3RhdGljIGlycXJldHVybl90IHNuZF9tZmxkX2phY2tfaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtYWNwaS5jIGIvc291bmQvc29jL2ludGVsL3NzdC1hY3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQwNmVlYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtYWNwaS5jCkBAIC0wLDAgKzEsMjg0IEBACisvKgorICogSW50ZWwgU1NUIGxvYWRlciBvbiBBQ1BJIHN5c3RlbXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSAic3N0LWRzcC5oIgorCisjZGVmaW5lIFNTVF9MUFRfRFNQX0RNQV9BRERSX09GRlNFVAkweDBGMDAwMAorI2RlZmluZSBTU1RfV1BUX0RTUF9ETUFfQUREUl9PRkZTRVQJMHgwRkUwMDAKKyNkZWZpbmUgU1NUX0xQVF9EU1BfRE1BX1NJWkUJCSgxMDI0IC0gMSkKKworLyogRGVzY3JpcHRvciBmb3IgU1NUIEFTb0MgbWFjaGluZSBkcml2ZXIgKi8KK3N0cnVjdCBzc3RfYWNwaV9tYWNoIHsKKwkvKiBBQ1BJIElEIGZvciB0aGUgbWF0Y2hpbmcgbWFjaGluZSBkcml2ZXIuIEF1ZGlvIGNvZGVjIGZvciBpbnN0YW5jZSAqLworCWNvbnN0IHU4IGlkW0FDUElfSURfTEVOXTsKKwkvKiBtYWNoaW5lIGRyaXZlciBuYW1lICovCisJY29uc3QgY2hhciAqZHJ2X25hbWU7CisJLyogZmlybXdhcmUgZmlsZSBuYW1lICovCisJY29uc3QgY2hhciAqZndfZmlsZW5hbWU7Cit9OworCisvKiBEZXNjcmlwdG9yIGZvciBzZXR0aW5nIHVwIFNTVCBwbGF0Zm9ybSBkYXRhICovCitzdHJ1Y3Qgc3N0X2FjcGlfZGVzYyB7CisJY29uc3QgY2hhciAqZHJ2X25hbWU7CisJc3RydWN0IHNzdF9hY3BpX21hY2ggKm1hY2hpbmVzOworCS8qIFBsYXRmb3JtIHJlc291cmNlIGluZGV4ZXMuIE11c3Qgc2V0IHRvIC0xIGlmIG5vdCB1c2VkICovCisJaW50IHJlc2luZGV4X2xwZV9iYXNlOworCWludCByZXNpbmRleF9wY2ljZmdfYmFzZTsKKwlpbnQgcmVzaW5kZXhfZndfYmFzZTsKKwlpbnQgaXJxaW5kZXhfaG9zdF9pcGM7CisJaW50IHJlc2luZGV4X2RtYV9iYXNlOworCS8qIFVuaXF1ZSBudW1iZXIgaWRlbnRpZnlpbmcgdGhlIFNTVCBjb3JlIG9uIHBsYXRmb3JtICovCisJaW50IHNzdF9pZDsKKwkvKiBETUEgb25seSB2YWxpZCB3aGVuIHJlc2luZGV4X2RtYV9iYXNlICE9IC0xKi8KKwlpbnQgZG1hX2VuZ2luZTsKKwlpbnQgZG1hX3NpemU7Cit9OworCitzdHJ1Y3Qgc3N0X2FjcGlfcHJpdiB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldl9tYWNoOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXZfcGNtOworCXN0cnVjdCBzc3RfcGRhdGEgc3N0X3BkYXRhOworCXN0cnVjdCBzc3RfYWNwaV9kZXNjICpkZXNjOworCXN0cnVjdCBzc3RfYWNwaV9tYWNoICptYWNoOworfTsKKworc3RhdGljIHZvaWQgc3N0X2FjcGlfZndfY2IoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gY29udGV4dDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBzc3RfYWNwaV9wcml2ICpzc3RfYWNwaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzc3RfcGRhdGEgKnNzdF9wZGF0YSA9ICZzc3RfYWNwaS0+c3N0X3BkYXRhOworCXN0cnVjdCBzc3RfYWNwaV9kZXNjICpkZXNjID0gc3N0X2FjcGktPmRlc2M7CisJc3RydWN0IHNzdF9hY3BpX21hY2ggKm1hY2ggPSBzc3RfYWNwaS0+bWFjaDsKKworCXNzdF9wZGF0YS0+ZncgPSBmdzsKKwlpZiAoIWZ3KSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGxvYWQgZmlybXdhcmUgJXNcbiIsIG1hY2gtPmZ3X2ZpbGVuYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHJlZ2lzdGVyIFBDTSBhbmQgREFJIGRyaXZlciAqLworCXNzdF9hY3BpLT5wZGV2X3BjbSA9CisJCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9kYXRhKGRldiwgZGVzYy0+ZHJ2X25hbWUsIC0xLAorCQkJCQkgICAgICBzc3RfcGRhdGEsIHNpemVvZigqc3N0X3BkYXRhKSk7CisJaWYgKElTX0VSUihzc3RfYWNwaS0+cGRldl9wY20pKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IHJlZ2lzdGVyIGRldmljZSAlcy4gRXJyb3IgJWRcbiIsCisJCQlkZXNjLT5kcnZfbmFtZSwgKGludClQVFJfRVJSKHNzdF9hY3BpLT5wZGV2X3BjbSkpOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIHNzdF9hY3BpX21hY2hfbWF0Y2goYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbGV2ZWwsCisJCQkJICAgICAgIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXQpCit7CisJKihib29sICopY29udGV4dCA9IHRydWU7CisJcmV0dXJuIEFFX09LOworfQorCitzdGF0aWMgc3RydWN0IHNzdF9hY3BpX21hY2ggKnNzdF9hY3BpX2ZpbmRfbWFjaGluZSgKKwlzdHJ1Y3Qgc3N0X2FjcGlfbWFjaCAqbWFjaGluZXMpCit7CisJc3RydWN0IHNzdF9hY3BpX21hY2ggKm1hY2g7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCisJZm9yIChtYWNoID0gbWFjaGluZXM7IG1hY2gtPmlkWzBdOyBtYWNoKyspCisJCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfZGV2aWNlcyhtYWNoLT5pZCwKKwkJCQkJCSAgc3N0X2FjcGlfbWFjaF9tYXRjaCwKKwkJCQkJCSAgJmZvdW5kLCBOVUxMKSkgJiYgZm91bmQpCisJCQlyZXR1cm4gbWFjaDsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHNzdF9hY3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkICppZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBzc3RfYWNwaV9wcml2ICpzc3RfYWNwaTsKKwlzdHJ1Y3Qgc3N0X3BkYXRhICpzc3RfcGRhdGE7CisJc3RydWN0IHNzdF9hY3BpX21hY2ggKm1hY2g7CisJc3RydWN0IHNzdF9hY3BpX2Rlc2MgKmRlc2M7CisJc3RydWN0IHJlc291cmNlICptbWlvOworCWludCByZXQgPSAwOworCisJc3N0X2FjcGkgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnNzdF9hY3BpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNzdF9hY3BpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWQgPSBhY3BpX21hdGNoX2RldmljZShkZXYtPmRyaXZlci0+YWNwaV9tYXRjaF90YWJsZSwgZGV2KTsKKwlpZiAoIWlkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRlc2MgPSAoc3RydWN0IHNzdF9hY3BpX2Rlc2MgKilpZC0+ZHJpdmVyX2RhdGE7CisJbWFjaCA9IHNzdF9hY3BpX2ZpbmRfbWFjaGluZShkZXNjLT5tYWNoaW5lcyk7CisJaWYgKG1hY2ggPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIk5vIG1hdGNoaW5nIEFTb0MgbWFjaGluZSBkcml2ZXIgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzc3RfcGRhdGEgPSAmc3N0X2FjcGktPnNzdF9wZGF0YTsKKwlzc3RfcGRhdGEtPmlkID0gZGVzYy0+c3N0X2lkOworCXNzdF9hY3BpLT5kZXNjID0gZGVzYzsKKwlzc3RfYWNwaS0+bWFjaCA9IG1hY2g7CisKKwlpZiAoZGVzYy0+cmVzaW5kZXhfZG1hX2Jhc2UgPj0gMCkgeworCQlzc3RfcGRhdGEtPmRtYV9lbmdpbmUgPSBkZXNjLT5kbWFfZW5naW5lOworCQlzc3RfcGRhdGEtPmRtYV9iYXNlID0gZGVzYy0+cmVzaW5kZXhfZG1hX2Jhc2U7CisJCXNzdF9wZGF0YS0+ZG1hX3NpemUgPSBkZXNjLT5kbWFfc2l6ZTsKKwl9CisKKwlpZiAoZGVzYy0+aXJxaW5kZXhfaG9zdF9pcGMgPj0gMCkKKwkJc3N0X3BkYXRhLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIGRlc2MtPmlycWluZGV4X2hvc3RfaXBjKTsKKworCWlmIChkZXNjLT5yZXNpbmRleF9scGVfYmFzZSA+PSAwKSB7CisJCW1taW8gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sCisJCQkJCSAgICAgZGVzYy0+cmVzaW5kZXhfbHBlX2Jhc2UpOworCQlpZiAobW1pbykgeworCQkJc3N0X3BkYXRhLT5scGVfYmFzZSA9IG1taW8tPnN0YXJ0OworCQkJc3N0X3BkYXRhLT5scGVfc2l6ZSA9IHJlc291cmNlX3NpemUobW1pbyk7CisJCX0KKwl9CisKKwlpZiAoZGVzYy0+cmVzaW5kZXhfcGNpY2ZnX2Jhc2UgPj0gMCkgeworCQltbWlvID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAorCQkJCQkgICAgIGRlc2MtPnJlc2luZGV4X3BjaWNmZ19iYXNlKTsKKwkJaWYgKG1taW8pIHsKKwkJCXNzdF9wZGF0YS0+cGNpY2ZnX2Jhc2UgPSBtbWlvLT5zdGFydDsKKwkJCXNzdF9wZGF0YS0+cGNpY2ZnX3NpemUgPSByZXNvdXJjZV9zaXplKG1taW8pOworCQl9CisJfQorCisJaWYgKGRlc2MtPnJlc2luZGV4X2Z3X2Jhc2UgPj0gMCkgeworCQltbWlvID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAorCQkJCQkgICAgIGRlc2MtPnJlc2luZGV4X2Z3X2Jhc2UpOworCQlpZiAobW1pbykgeworCQkJc3N0X3BkYXRhLT5md19iYXNlID0gbW1pby0+c3RhcnQ7CisJCQlzc3RfcGRhdGEtPmZ3X3NpemUgPSByZXNvdXJjZV9zaXplKG1taW8pOworCQl9CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgc3N0X2FjcGkpOworCisJLyogcmVnaXN0ZXIgbWFjaGluZSBkcml2ZXIgKi8KKwlzc3RfYWNwaS0+cGRldl9tYWNoID0KKwkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2RhdGEoZGV2LCBtYWNoLT5kcnZfbmFtZSwgLTEsCisJCQkJCSAgICAgIHNzdF9wZGF0YSwgc2l6ZW9mKCpzc3RfcGRhdGEpKTsKKwlpZiAoSVNfRVJSKHNzdF9hY3BpLT5wZGV2X21hY2gpKQorCQlyZXR1cm4gUFRSX0VSUihzc3RfYWNwaS0+cGRldl9tYWNoKTsKKworCS8qIGNvbnRpbnVlIFNTVCBwcm9iaW5nIGFmdGVyIGZpcm13YXJlIGlzIGxvYWRlZCAqLworCXJldCA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCB0cnVlLCBtYWNoLT5md19maWxlbmFtZSwKKwkJCQkgICAgICBkZXYsIEdGUF9LRVJORUwsIHBkZXYsIHNzdF9hY3BpX2Z3X2NiKTsKKwlpZiAocmV0KQorCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihzc3RfYWNwaS0+cGRldl9tYWNoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2FjcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNzdF9hY3BpX3ByaXYgKnNzdF9hY3BpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNzdF9wZGF0YSAqc3N0X3BkYXRhID0gJnNzdF9hY3BpLT5zc3RfcGRhdGE7CisKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihzc3RfYWNwaS0+cGRldl9tYWNoKTsKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKHNzdF9hY3BpLT5wZGV2X3BjbSkpCisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNzdF9hY3BpLT5wZGV2X3BjbSk7CisJcmVsZWFzZV9maXJtd2FyZShzc3RfcGRhdGEtPmZ3KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNzdF9hY3BpX21hY2ggaGFzd2VsbF9tYWNoaW5lc1tdID0geworCXsgIklOVDMzQ0EiLCAiaGFzd2VsbC1hdWRpbyIsICJpbnRlbC9JbnRjU1NUMS5iaW4iIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2FjcGlfZGVzYyBzc3RfYWNwaV9oYXN3ZWxsX2Rlc2MgPSB7CisJLmRydl9uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKKwkubWFjaGluZXMgPSBoYXN3ZWxsX21hY2hpbmVzLAorCS5yZXNpbmRleF9scGVfYmFzZSA9IDAsCisJLnJlc2luZGV4X3BjaWNmZ19iYXNlID0gMSwKKwkucmVzaW5kZXhfZndfYmFzZSA9IC0xLAorCS5pcnFpbmRleF9ob3N0X2lwYyA9IDAsCisJLnNzdF9pZCA9IFNTVF9ERVZfSURfTFlOWF9QT0lOVCwKKwkuZG1hX2VuZ2luZSA9IFNTVF9ETUFfVFlQRV9EVywKKwkucmVzaW5kZXhfZG1hX2Jhc2UgPSBTU1RfTFBUX0RTUF9ETUFfQUREUl9PRkZTRVQsCisJLmRtYV9zaXplID0gU1NUX0xQVF9EU1BfRE1BX1NJWkUsCit9OworCitzdGF0aWMgc3RydWN0IHNzdF9hY3BpX21hY2ggYnJvYWR3ZWxsX21hY2hpbmVzW10gPSB7CisJeyAiSU5UMzQzQSIsICJicm9hZHdlbGwtYXVkaW8iLCAiaW50ZWwvSW50Y1NTVDIuYmluIiB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHNzdF9hY3BpX2Rlc2Mgc3N0X2FjcGlfYnJvYWR3ZWxsX2Rlc2MgPSB7CisJLmRydl9uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKKwkubWFjaGluZXMgPSBicm9hZHdlbGxfbWFjaGluZXMsCisJLnJlc2luZGV4X2xwZV9iYXNlID0gMCwKKwkucmVzaW5kZXhfcGNpY2ZnX2Jhc2UgPSAxLAorCS5yZXNpbmRleF9md19iYXNlID0gLTEsCisJLmlycWluZGV4X2hvc3RfaXBjID0gMCwKKwkuc3N0X2lkID0gU1NUX0RFVl9JRF9XSUxEQ0FUX1BPSU5ULAorCS5kbWFfZW5naW5lID0gU1NUX0RNQV9UWVBFX0RXLAorCS5yZXNpbmRleF9kbWFfYmFzZSA9IFNTVF9XUFRfRFNQX0RNQV9BRERSX09GRlNFVCwKKwkuZG1hX3NpemUgPSBTU1RfTFBUX0RTUF9ETUFfU0laRSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2FjcGlfbWFjaCBiYXl0cmFpbF9tYWNoaW5lc1tdID0geworCXsgIjEwRUM1NjQwIiwgImJ5dC1ydDU2NDAiLCAiaW50ZWwvZndfc3N0XzBmMjguYmluLWkyc19tYXN0ZXIiIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2FjcGlfZGVzYyBzc3RfYWNwaV9iYXl0cmFpbF9kZXNjID0geworCS5kcnZfbmFtZSA9ICJiYXl0cmFpbC1wY20tYXVkaW8iLAorCS5tYWNoaW5lcyA9IGJheXRyYWlsX21hY2hpbmVzLAorCS5yZXNpbmRleF9scGVfYmFzZSA9IDAsCisJLnJlc2luZGV4X3BjaWNmZ19iYXNlID0gMSwKKwkucmVzaW5kZXhfZndfYmFzZSA9IDIsCisJLmlycWluZGV4X2hvc3RfaXBjID0gNSwKKwkuc3N0X2lkID0gU1NUX0RFVl9JRF9CWVQsCisJLnJlc2luZGV4X2RtYV9iYXNlID0gLTEsCit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHNzdF9hY3BpX21hdGNoW10gPSB7CisJeyAiSU5UMzNDOCIsICh1bnNpZ25lZCBsb25nKSZzc3RfYWNwaV9oYXN3ZWxsX2Rlc2MgfSwKKwl7ICJJTlQzNDM4IiwgKHVuc2lnbmVkIGxvbmcpJnNzdF9hY3BpX2Jyb2Fkd2VsbF9kZXNjIH0sCisJeyAiODA4NjBGMjgiLCAodW5zaWduZWQgbG9uZykmc3N0X2FjcGlfYmF5dHJhaWxfZGVzYyB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgc3N0X2FjcGlfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzc3RfYWNwaV9kcml2ZXIgPSB7CisJLnByb2JlID0gc3N0X2FjcGlfcHJvYmUsCisJLnJlbW92ZSA9IHNzdF9hY3BpX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzc3QtYWNwaSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElfUFRSKHNzdF9hY3BpX21hdGNoKSwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3N0X2FjcGlfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSmFya2tvIE5pa3VsYSA8amFya2tvLm5pa3VsYUBsaW51eC5pbnRlbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIFNTVCBsb2FkZXIgb24gQUNQSSBzeXN0ZW1zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLWRzcC5jIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1kc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTBiZjdmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1kc3AuYwpAQCAtMCwwICsxLDM3MiBAQAorLyoKKyAqIEludGVsIEJheXRyYWlsIFNTVCBEU1AgZHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisKKyNpbmNsdWRlICJzc3QtZHNwLmgiCisjaW5jbHVkZSAic3N0LWRzcC1wcml2LmgiCisjaW5jbHVkZSAic3N0LWJheXRyYWlsLWlwYy5oIgorCisjZGVmaW5lIFNTVF9CWVRfRldfU0lHTkFUVVJFX1NJWkUJNAorI2RlZmluZSBTU1RfQllUX0ZXX1NJR04JCQkiJFNTVCIKKworI2RlZmluZSBTU1RfQllUX0lSQU1fT0ZGU0VUCTB4QzAwMDAKKyNkZWZpbmUgU1NUX0JZVF9EUkFNX09GRlNFVAkweDEwMDAwMAorI2RlZmluZSBTU1RfQllUX1NISU1fT0ZGU0VUCTB4MTQwMDAwCisKK2VudW0gc3N0X3JhbV90eXBlIHsKKwlTU1RfQllUX0lSQU0JPSAxLAorCVNTVF9CWVRfRFJBTQk9IDIsCisJU1NUX0JZVF9DQUNIRQk9IDMsCit9OworCitzdHJ1Y3QgZG1hX2Jsb2NrX2luZm8geworCWVudW0gc3N0X3JhbV90eXBlCXR5cGU7CS8qIElSQU0vRFJBTSAqLworCXUzMgkJCXNpemU7CS8qIEJ5dGVzICovCisJdTMyCQkJcmFtX29mZnNldDsgLyogT2Zmc2V0IGluIEkvRFJBTSAqLworCXUzMgkJCXJzdmQ7CS8qIFJlc2VydmVkIGZpZWxkICovCit9OworCitzdHJ1Y3QgZndfaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtTU1RfQllUX0ZXX1NJR05BVFVSRV9TSVpFXTsKKwl1MzIgZmlsZV9zaXplOyAvKiBzaXplIG9mIGZ3IG1pbnVzIHRoaXMgaGVhZGVyICovCisJdTMyIG1vZHVsZXM7IC8qICAjIG9mIG1vZHVsZXMgKi8KKwl1MzIgZmlsZV9mb3JtYXQ7IC8qIHZlcnNpb24gb2YgaGVhZGVyIGZvcm1hdCAqLworCXUzMiByZXNlcnZlZFs0XTsKK307CisKK3N0cnVjdCBzc3RfYnl0X2Z3X21vZHVsZV9oZWFkZXIgeworCXVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlW1NTVF9CWVRfRldfU0lHTkFUVVJFX1NJWkVdOworCXUzMiBtb2Rfc2l6ZTsgLyogc2l6ZSBvZiBtb2R1bGUgKi8KKwl1MzIgYmxvY2tzOyAvKiAjIG9mIGJsb2NrcyAqLworCXUzMiB0eXBlOyAvKiBjb2RlYyB0eXBlLCBwcCBsaWIgKi8KKwl1MzIgZW50cnlfcG9pbnQ7Cit9OworCitzdGF0aWMgaW50IHNzdF9ieXRfcGFyc2VfbW9kdWxlKHN0cnVjdCBzc3RfZHNwICpkc3AsIHN0cnVjdCBzc3RfZncgKmZ3LAorCQkJCXN0cnVjdCBzc3RfYnl0X2Z3X21vZHVsZV9oZWFkZXIgKm1vZHVsZSkKK3sKKwlzdHJ1Y3QgZG1hX2Jsb2NrX2luZm8gKmJsb2NrOworCXN0cnVjdCBzc3RfbW9kdWxlICptb2Q7CisJc3RydWN0IHNzdF9tb2R1bGVfZGF0YSBibG9ja19kYXRhOworCXN0cnVjdCBzc3RfbW9kdWxlX3RlbXBsYXRlIHRlbXBsYXRlOworCWludCBjb3VudDsKKworCW1lbXNldCgmdGVtcGxhdGUsIDAsIHNpemVvZih0ZW1wbGF0ZSkpOworCXRlbXBsYXRlLmlkID0gbW9kdWxlLT50eXBlOworCXRlbXBsYXRlLmVudHJ5ID0gbW9kdWxlLT5lbnRyeV9wb2ludDsKKwl0ZW1wbGF0ZS5wLnR5cGUgPSBTU1RfTUVNX0RSQU07CisJdGVtcGxhdGUucC5kYXRhX3R5cGUgPSBTU1RfREFUQV9QOworCXRlbXBsYXRlLnMudHlwZSA9IFNTVF9NRU1fRFJBTTsKKwl0ZW1wbGF0ZS5zLmRhdGFfdHlwZSA9IFNTVF9EQVRBX1M7CisKKwltb2QgPSBzc3RfbW9kdWxlX25ldyhmdywgJnRlbXBsYXRlLCBOVUxMKTsKKwlpZiAobW9kID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYmxvY2sgPSAodm9pZCAqKW1vZHVsZSArIHNpemVvZigqbW9kdWxlKTsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IG1vZHVsZS0+YmxvY2tzOyBjb3VudCsrKSB7CisKKwkJaWYgKGJsb2NrLT5zaXplIDw9IDApIHsKKwkJCWRldl9lcnIoZHNwLT5kZXYsICJibG9jayAlZCBzaXplIGludmFsaWRcbiIsIGNvdW50KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJc3dpdGNoIChibG9jay0+dHlwZSkgeworCQljYXNlIFNTVF9CWVRfSVJBTToKKwkJCWJsb2NrX2RhdGEub2Zmc2V0ID0gYmxvY2stPnJhbV9vZmZzZXQgKworCQkJCQkgICAgZHNwLT5hZGRyLmlyYW1fb2Zmc2V0OworCQkJYmxvY2tfZGF0YS50eXBlID0gU1NUX01FTV9JUkFNOworCQkJYnJlYWs7CisJCWNhc2UgU1NUX0JZVF9EUkFNOgorCQkJYmxvY2tfZGF0YS5vZmZzZXQgPSBibG9jay0+cmFtX29mZnNldCArCisJCQkJCSAgICBkc3AtPmFkZHIuZHJhbV9vZmZzZXQ7CisJCQlibG9ja19kYXRhLnR5cGUgPSBTU1RfTUVNX0RSQU07CisJCQlicmVhazsKKwkJY2FzZSBTU1RfQllUX0NBQ0hFOgorCQkJYmxvY2tfZGF0YS5vZmZzZXQgPSBibG9jay0+cmFtX29mZnNldCArCisJCQkJCSAgICAoZHNwLT5hZGRyLmZ3X2V4dCAtIGRzcC0+YWRkci5scGUpOworCQkJYmxvY2tfZGF0YS50eXBlID0gU1NUX01FTV9DQUNIRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2Vycihkc3AtPmRldiwgIndyb25nIHJhbSB0eXBlIDB4JXggaW4gYmxvY2sweCV4XG4iLAorCQkJCWJsb2NrLT50eXBlLCBjb3VudCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWJsb2NrX2RhdGEuc2l6ZSA9IGJsb2NrLT5zaXplOworCQlibG9ja19kYXRhLmRhdGFfdHlwZSA9IFNTVF9EQVRBX007CisJCWJsb2NrX2RhdGEuZGF0YSA9ICh2b2lkICopYmxvY2sgKyBzaXplb2YoKmJsb2NrKTsKKworCQlzc3RfbW9kdWxlX2luc2VydF9maXhlZF9ibG9jayhtb2QsICZibG9ja19kYXRhKTsKKworCQlibG9jayA9ICh2b2lkICopYmxvY2sgKyBzaXplb2YoKmJsb2NrKSArIGJsb2NrLT5zaXplOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3BhcnNlX2Z3X2ltYWdlKHN0cnVjdCBzc3RfZncgKnNzdF9mdykKK3sKKwlzdHJ1Y3QgZndfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IHNzdF9ieXRfZndfbW9kdWxlX2hlYWRlciAqbW9kdWxlOworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBzc3RfZnctPmRzcDsKKwlpbnQgcmV0LCBjb3VudDsKKworCS8qIFJlYWQgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkYXRhIHBvaW50ZXIgKi8KKwloZWFkZXIgPSAoc3RydWN0IGZ3X2hlYWRlciAqKXNzdF9mdy0+ZG1hX2J1ZjsKKworCS8qIHZlcmlmeSBGVyAqLworCWlmICgoc3RybmNtcChoZWFkZXItPnNpZ25hdHVyZSwgU1NUX0JZVF9GV19TSUdOLCA0KSAhPSAwKSB8fAorCSAgICAoc3N0X2Z3LT5zaXplICE9IGhlYWRlci0+ZmlsZV9zaXplICsgc2l6ZW9mKCpoZWFkZXIpKSkgeworCQkvKiBJbnZhbGlkIEZXIHNpZ25hdHVyZSAqLworCQlkZXZfZXJyKGRzcC0+ZGV2LCAiSW52YWxpZCBGVyBzaWduL2ZpbGVzaXplIG1pc21hdGNoXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZyhkc3AtPmRldiwKKwkJImhlYWRlciBzaWduPSU0cyBzaXplPTB4JXggbW9kdWxlcz0weCV4IGZtdD0weCV4IHNpemU9JXp1XG4iLAorCQloZWFkZXItPnNpZ25hdHVyZSwgaGVhZGVyLT5maWxlX3NpemUsIGhlYWRlci0+bW9kdWxlcywKKwkJaGVhZGVyLT5maWxlX2Zvcm1hdCwgc2l6ZW9mKCpoZWFkZXIpKTsKKworCW1vZHVsZSA9ICh2b2lkICopc3N0X2Z3LT5kbWFfYnVmICsgc2l6ZW9mKCpoZWFkZXIpOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGhlYWRlci0+bW9kdWxlczsgY291bnQrKykgeworCQkvKiBtb2R1bGUgKi8KKwkJcmV0ID0gc3N0X2J5dF9wYXJzZV9tb2R1bGUoZHNwLCBzc3RfZncsIG1vZHVsZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRzcC0+ZGV2LCAiaW52YWxpZCBtb2R1bGUgJWRcbiIsIGNvdW50KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJbW9kdWxlID0gKHZvaWQgKiltb2R1bGUgKyBzaXplb2YoKm1vZHVsZSkgKyBtb2R1bGUtPm1vZF9zaXplOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzc3RfYnl0X2R1bXBfc2hpbShzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQoreworCWludCBpOworCXU2NCByZWc7CisKKwlmb3IgKGkgPSAwOyBpIDw9IDB4RjA7IGkgKz0gOCkgeworCQlyZWcgPSBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHNzdCwgaSk7CisJCWlmIChyZWcpCisJCQlkZXZfZGJnKHNzdC0+ZGV2LCAic2hpbSAweCUyLjJ4IHZhbHVlIDB4JTE2LjE2bGx4XG4iLAorCQkJCWksIHJlZyk7CisJfQorCisJZm9yIChpID0gMHgwMDsgaSA8PSAweGZmOyBpICs9IDQpIHsKKwkJcmVnID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBpKTsKKwkJaWYgKHJlZykKKwkJCWRldl9kYmcoc3N0LT5kZXYsICJwY2kgMHglMi4yeCB2YWx1ZSAweCU4Ljh4XG4iLAorCQkJCWksICh1MzIpcmVnKTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzc3RfYnl0X2lycShpbnQgaXJxLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSAoc3RydWN0IHNzdF9kc3AgKikgY29udGV4dDsKKwl1NjQgaXNyeDsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmc3N0LT5zcGlubG9jayk7CisKKwlpc3J4ID0gc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChzc3QsIFNTVF9JU1JYKTsKKwlpZiAoaXNyeCAmIFNTVF9JU1JYX0RPTkUpIHsKKwkJLyogQURTUCBoYXMgcHJvY2Vzc2VkIHRoZSBtZXNzYWdlIHJlcXVlc3QgZnJvbSBJQSAqLworCQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NF91bmxvY2tlZChzc3QsIFNTVF9JUENYLAorCQkJCQkJICAgIFNTVF9CWVRfSVBDWF9ET05FLCAwKTsKKwkJcmV0ID0gSVJRX1dBS0VfVEhSRUFEOworCX0KKwlpZiAoaXNyeCAmIFNTVF9CWVRfSVNSWF9SRVFVRVNUKSB7CisJCS8qIG1hc2sgbWVzc2FnZSByZXF1ZXN0IGZyb20gQURTUCBhbmQgZG8gcHJvY2Vzc2luZyBsYXRlciAqLworCQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NF91bmxvY2tlZChzc3QsIFNTVF9JTVJYLAorCQkJCQkJICAgIFNTVF9CWVRfSU1SWF9SRVFVRVNULAorCQkJCQkJICAgIFNTVF9CWVRfSU1SWF9SRVFVRVNUKTsKKwkJcmV0ID0gSVJRX1dBS0VfVEhSRUFEOworCX0KKworCXNwaW5fdW5sb2NrKCZzc3QtPnNwaW5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNzdF9ieXRfYm9vdChzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQoreworCWludCB0cmllcyA9IDEwOworCisJLyogcmVsZWFzZSBzdGFsbCBhbmQgd2FpdCB0byB1bnN0YWxsICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjQoc3N0LCBTU1RfQ1NSLCBTU1RfQllUX0NTUl9TVEFMTCwgMHgwKTsKKwl3aGlsZSAodHJpZXMtLSkgeworCQlpZiAoIShzc3RfZHNwX3NoaW1fcmVhZDY0KHNzdCwgU1NUX0NTUikgJgorCQkgICAgICBTU1RfQllUX0NTUl9QV0FJVE1PREUpKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxMDApOworCX0KKwlpZiAodHJpZXMgPCAwKSB7CisJCWRldl9lcnIoc3N0LT5kZXYsICJ1bmFibGUgdG8gc3RhcnQgRFNQXG4iKTsKKwkJc3N0X2J5dF9kdW1wX3NoaW0oc3N0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNzdF9ieXRfcmVzZXQoc3RydWN0IHNzdF9kc3AgKnNzdCkKK3sKKwkvKiBwdXQgRFNQIGludG8gcmVzZXQsIHNldCByZXNldCB2ZWN0b3IgYW5kIHN0YWxsICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjQoc3N0LCBTU1RfQ1NSLAorCQlTU1RfQllUX0NTUl9SU1QgfCBTU1RfQllUX0NTUl9WRUNUT1JfU0VMIHwgU1NUX0JZVF9DU1JfU1RBTEwsCisJCVNTVF9CWVRfQ1NSX1JTVCB8IFNTVF9CWVRfQ1NSX1ZFQ1RPUl9TRUwgfCBTU1RfQllUX0NTUl9TVEFMTCk7CisKKwl1ZGVsYXkoMTApOworCisJLyogdGFrZSBEU1Agb3V0IG9mIHJlc2V0IGFuZCBrZWVwIHN0YWxsZWQgZm9yIEZXIGxvYWRpbmcgKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NChzc3QsIFNTVF9DU1IsIFNTVF9CWVRfQ1NSX1JTVCwgMCk7Cit9CisKK3N0cnVjdCBzc3RfYWRzcF9tZW1yZWdpb24geworCXUzMiBzdGFydDsKKwl1MzIgZW5kOworCWludCBibG9ja3M7CisJZW51bSBzc3RfbWVtX3R5cGUgdHlwZTsKK307CisKKy8qIEJZVCB0ZXN0IHN0dWZmICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNzdF9hZHNwX21lbXJlZ2lvbiBieXRfcmVnaW9uW10gPSB7CisJezB4QzAwMDAsIDB4MTAwMDAwLCA4LCBTU1RfTUVNX0lSQU19LCAvKiBJLVNSQU0gLSA4ICogMzJrQiAqLworCXsweDEwMDAwMCwgMHgxNDAwMDAsIDgsIFNTVF9NRU1fRFJBTX0sIC8qIEQtU1JBTTAgLSA4ICogMzJrQiAqLworfTsKKworc3RhdGljIGludCBzc3RfYnl0X3Jlc291cmNlX21hcChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCBzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSkKK3sKKwlzc3QtPmFkZHIubHBlX2Jhc2UgPSBwZGF0YS0+bHBlX2Jhc2U7CisJc3N0LT5hZGRyLmxwZSA9IGlvcmVtYXAocGRhdGEtPmxwZV9iYXNlLCBwZGF0YS0+bHBlX3NpemUpOworCWlmICghc3N0LT5hZGRyLmxwZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBBRFNQIFBDSSBNTUlPIGNvbmZpZyBzcGFjZSAqLworCXNzdC0+YWRkci5wY2lfY2ZnID0gaW9yZW1hcChwZGF0YS0+cGNpY2ZnX2Jhc2UsIHBkYXRhLT5wY2ljZmdfc2l6ZSk7CisJaWYgKCFzc3QtPmFkZHIucGNpX2NmZykgeworCQlpb3VubWFwKHNzdC0+YWRkci5scGUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBTU1QgRXh0ZW5kZWQgRlcgYWxsb2NhdGlvbiAqLworCXNzdC0+YWRkci5md19leHQgPSBpb3JlbWFwKHBkYXRhLT5md19iYXNlLCBwZGF0YS0+Zndfc2l6ZSk7CisJaWYgKCFzc3QtPmFkZHIuZndfZXh0KSB7CisJCWlvdW5tYXAoc3N0LT5hZGRyLnBjaV9jZmcpOworCQlpb3VubWFwKHNzdC0+YWRkci5scGUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBTU1QgU2hpbSAqLworCXNzdC0+YWRkci5zaGltID0gc3N0LT5hZGRyLmxwZSArIHNzdC0+YWRkci5zaGltX29mZnNldDsKKworCXNzdF9kc3BfbWFpbGJveF9pbml0KHNzdCwgU1NUX0JZVF9NQUlMQk9YX09GRlNFVCArIDB4MjA0LAorCQkJICAgICBTU1RfQllUX0lQQ19NQVhfUEFZTE9BRF9TSVpFLAorCQkJICAgICBTU1RfQllUX01BSUxCT1hfT0ZGU0VULAorCQkJICAgICBTU1RfQllUX0lQQ19NQVhfUEFZTE9BRF9TSVpFKTsKKworCXNzdC0+aXJxID0gcGRhdGEtPmlycTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNzdF9ieXRfaW5pdChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCBzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3Qgc3N0X2Fkc3BfbWVtcmVnaW9uICpyZWdpb247CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCByZXQgPSAtRU5PREVWLCBpLCBqLCByZWdpb25fY291bnQ7CisJdTMyIG9mZnNldCwgc2l6ZTsKKworCWRldiA9IHNzdC0+ZGV2OworCisJc3dpdGNoIChzc3QtPmlkKSB7CisJY2FzZSBTU1RfREVWX0lEX0JZVDoKKwkJcmVnaW9uID0gYnl0X3JlZ2lvbjsKKwkJcmVnaW9uX2NvdW50ID0gQVJSQVlfU0laRShieXRfcmVnaW9uKTsKKwkJc3N0LT5hZGRyLmlyYW1fb2Zmc2V0ID0gU1NUX0JZVF9JUkFNX09GRlNFVDsKKwkJc3N0LT5hZGRyLmRyYW1fb2Zmc2V0ID0gU1NUX0JZVF9EUkFNX09GRlNFVDsKKwkJc3N0LT5hZGRyLnNoaW1fb2Zmc2V0ID0gU1NUX0JZVF9TSElNX09GRlNFVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IG1lbSByZXNvdXJjZXNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNzdF9ieXRfcmVzb3VyY2VfbWFwKHNzdCwgcGRhdGEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIG1hcCByZXNvdXJjZXNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogc2F2ZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBleHRlbmRlZCBmaXJtd2FyZSBibG9jayBpbiB0aGUgZmlyc3QKKwkgKiA0IGJ5dGVzIG9mIHRoZSBtYWlsYm94CisJICovCisJbWVtY3B5X3RvaW8oc3N0LT5hZGRyLmxwZSArIFNTVF9CWVRfTUFJTEJPWF9PRkZTRVQsCisJICAgICAgICZwZGF0YS0+ZndfYmFzZSwgc2l6ZW9mKHUzMikpOworCisJcmV0ID0gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudChkZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBlbmFibGUgSW50ZXJydXB0IGZyb20gYm90aCBzaWRlcyAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0czY0KHNzdCwgU1NUX0lNUlgsIDB4MywgMHgwKTsKKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NChzc3QsIFNTVF9JTVJELCAweDMsIDB4MCk7CisKKwkvKiByZWdpc3RlciBEU1AgbWVtb3J5IGJsb2NrcyAtIGlkZWFsbHkgd2Ugc2hvdWxkIGdldCB0aGlzIGZyb20gQUNQSSAqLworCWZvciAoaSA9IDA7IGkgPCByZWdpb25fY291bnQ7IGkrKykgeworCQlvZmZzZXQgPSByZWdpb25baV0uc3RhcnQ7CisJCXNpemUgPSAocmVnaW9uW2ldLmVuZCAtIHJlZ2lvbltpXS5zdGFydCkgLyByZWdpb25baV0uYmxvY2tzOworCisJCS8qIHJlZ2lzdGVyIGluZGl2aWR1YWwgbWVtb3J5IGJsb2NrcyAqLworCQlmb3IgKGogPSAwOyBqIDwgcmVnaW9uW2ldLmJsb2NrczsgaisrKSB7CisJCQlzc3RfbWVtX2Jsb2NrX3JlZ2lzdGVyKHNzdCwgb2Zmc2V0LCBzaXplLAorCQkJCQkgICAgICAgcmVnaW9uW2ldLnR5cGUsIE5VTEwsIGosIHNzdCk7CisJCQlvZmZzZXQgKz0gc2l6ZTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzc3RfYnl0X2ZyZWUoc3RydWN0IHNzdF9kc3AgKnNzdCkKK3sKKwlzc3RfbWVtX2Jsb2NrX3VucmVnaXN0ZXJfYWxsKHNzdCk7CisJaW91bm1hcChzc3QtPmFkZHIubHBlKTsKKwlpb3VubWFwKHNzdC0+YWRkci5wY2lfY2ZnKTsKKwlpb3VubWFwKHNzdC0+YWRkci5md19leHQpOworfQorCitzdHJ1Y3Qgc3N0X29wcyBzc3RfYnl0X29wcyA9IHsKKwkucmVzZXQgPSBzc3RfYnl0X3Jlc2V0LAorCS5ib290ID0gc3N0X2J5dF9ib290LAorCS53cml0ZSA9IHNzdF9zaGltMzJfd3JpdGUsCisJLnJlYWQgPSBzc3Rfc2hpbTMyX3JlYWQsCisJLndyaXRlNjQgPSBzc3Rfc2hpbTMyX3dyaXRlNjQsCisJLnJlYWQ2NCA9IHNzdF9zaGltMzJfcmVhZDY0LAorCS5yYW1fcmVhZCA9IHNzdF9tZW1jcHlfZnJvbWlvXzMyLAorCS5yYW1fd3JpdGUgPSBzc3RfbWVtY3B5X3RvaW9fMzIsCisJLmlycV9oYW5kbGVyID0gc3N0X2J5dF9pcnEsCisJLmluaXQgPSBzc3RfYnl0X2luaXQsCisJLmZyZWUgPSBzc3RfYnl0X2ZyZWUsCisJLnBhcnNlX2Z3ID0gc3N0X2J5dF9wYXJzZV9md19pbWFnZSwKK307CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLWlwYy5jIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1pcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGVhZWVlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1pcGMuYwpAQCAtMCwwICsxLDg2NyBAQAorLyoKKyAqIEludGVsIEJheXRyYWlsIFNTVCBJUEMgU3VwcG9ydAorICogQ29weXJpZ2h0IChjKSAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSAic3N0LWJheXRyYWlsLWlwYy5oIgorI2luY2x1ZGUgInNzdC1kc3AuaCIKKyNpbmNsdWRlICJzc3QtZHNwLXByaXYuaCIKKworLyogSVBDIG1lc3NhZ2UgdGltZW91dCAqLworI2RlZmluZSBJUENfVElNRU9VVF9NU0VDUwkzMDAKKyNkZWZpbmUgSVBDX0JPT1RfTVNFQ1MJCTIwMAorCisjZGVmaW5lIElQQ19FTVBUWV9MSVNUX1NJWkUJOAorCisvKiBJUEMgaGVhZGVyIGJpdHMgKi8KKyNkZWZpbmUgSVBDX0hFQURFUl9NU0dfSURfTUFTSwkweGZmCisjZGVmaW5lIElQQ19IRUFERVJfTVNHX0lEKHgpCSgoeCkgJiBJUENfSEVBREVSX01TR19JRF9NQVNLKQorI2RlZmluZSBJUENfSEVBREVSX1NUUl9JRF9TSElGVAk4CisjZGVmaW5lIElQQ19IRUFERVJfU1RSX0lEX01BU0sJMHgxZgorI2RlZmluZSBJUENfSEVBREVSX1NUUl9JRCh4KQkoKCh4KSAmIDB4MWYpIDw8IElQQ19IRUFERVJfU1RSX0lEX1NISUZUKQorI2RlZmluZSBJUENfSEVBREVSX0xBUkdFX1NISUZUCTEzCisjZGVmaW5lIElQQ19IRUFERVJfTEFSR0UoeCkJKCgoeCkgJiAweDEpIDw8IElQQ19IRUFERVJfTEFSR0VfU0hJRlQpCisjZGVmaW5lIElQQ19IRUFERVJfREFUQV9TSElGVAkxNgorI2RlZmluZSBJUENfSEVBREVSX0RBVEFfTUFTSwkweDNmZmYKKyNkZWZpbmUgSVBDX0hFQURFUl9EQVRBKHgpCSgoKHgpICYgMHgzZmZmKSA8PCBJUENfSEVBREVSX0RBVEFfU0hJRlQpCisKKy8qIG1hc2sgZm9yIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIG5vdGlmaWNhdGlvbiBhbmQgcmVwbHkgbWVzc2FnZSAqLworI2RlZmluZSBJUENfTk9USUZJQ0FUSU9OCSgweDEgPDwgNykKKworLyogSTJMIFN0cmVhbSBjb25maWcvY29udHJvbCBtc2dzICovCisjZGVmaW5lIElQQ19JQV9BTExPQ19TVFJFQU0JMHgyMAorI2RlZmluZSBJUENfSUFfRlJFRV9TVFJFQU0JMHgyMQorI2RlZmluZSBJUENfSUFfUEFVU0VfU1RSRUFNCTB4MjQKKyNkZWZpbmUgSVBDX0lBX1JFU1VNRV9TVFJFQU0JMHgyNQorI2RlZmluZSBJUENfSUFfRFJPUF9TVFJFQU0JMHgyNgorI2RlZmluZSBJUENfSUFfU1RBUlRfU1RSRUFNCTB4MzAKKworLyogbm90aWZpY2F0aW9uIG1lc3NhZ2VzICovCisjZGVmaW5lIElQQ19JQV9GV19JTklUX0NNUExUCTB4ODEKKyNkZWZpbmUgSVBDX1NTVF9QRVJJT0RfRUxBUFNFRAkweDk3CisKKy8qIElQQyBtZXNzYWdlcyBiZXR3ZWVuIGhvc3QgYW5kIEFEU1AgKi8KK3N0cnVjdCBzc3RfYnl0X2FkZHJlc3NfaW5mbyB7CisJdTMyIGFkZHI7CisJdTMyIHNpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF9zdHJfdHlwZSB7CisJdTggY29kZWNfdHlwZTsKKwl1OCBzdHJfdHlwZTsKKwl1OCBvcGVyYXRpb247CisJdTggcHJvdGVjdGVkX3N0cjsKKwl1OCB0aW1lX3Nsb3RzOworCXU4IHJlc2VydmVkOworCXUxNiByZXN1bHQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF9wY21fcGFyYW1zIHsKKwl1OCBudW1fY2hhbjsKKwl1OCBwY21fd2Rfc3o7CisJdTggdXNlX29mZmxvYWRfcGF0aDsKKwl1OCByZXNlcnZlZDsKKwl1MzIgc2ZyZXE7CisJdTggY2hhbm5lbF9tYXBbOF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF9mcmFtZXNfaW5mbyB7CisJdTE2IG51bV9lbnRyaWVzOworCXUxNiByc3J2ZDsKKwl1MzIgZnJhZ19zaXplOworCXN0cnVjdCBzc3RfYnl0X2FkZHJlc3NfaW5mbyByaW5nX2J1Zl9pbmZvWzhdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHNzdF9ieXRfYWxsb2NfcGFyYW1zIHsKKwlzdHJ1Y3Qgc3N0X2J5dF9zdHJfdHlwZSBzdHJfdHlwZTsKKwlzdHJ1Y3Qgc3N0X2J5dF9wY21fcGFyYW1zIHBjbV9wYXJhbXM7CisJc3RydWN0IHNzdF9ieXRfZnJhbWVzX2luZm8gZnJhbWVfaW5mbzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzc3RfYnl0X2FsbG9jX3Jlc3BvbnNlIHsKKwlzdHJ1Y3Qgc3N0X2J5dF9zdHJfdHlwZSBzdHJfdHlwZTsKKwl1OCByZXNlcnZlZFs4OF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF9zdGFydF9zdHJlYW1fcGFyYW1zIHsKKwl1MzIgYnl0ZV9vZmZzZXQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF90c3RhbXAgeworCXU2NCByaW5nX2J1ZmZlcl9jb3VudGVyOworCXU2NCBoYXJkd2FyZV9jb3VudGVyOworCXU2NCBmcmFtZXNfZGVjb2RlZDsKKwl1NjQgYnl0ZXNfZGVjb2RlZDsKKwl1NjQgYnl0ZXNfY29waWVkOworCXUzMiBzYW1wbGluZ19mcmVxdWVuY3k7CisJdTMyIGNoYW5uZWxfcGVha1s4XTsKK30gX19wYWNrZWQ7CisKKy8qIGRyaXZlciBpbnRlcm5hbCBJUEMgbWVzc2FnZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBpcGNfbWVzc2FnZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXU2NCBoZWFkZXI7CisKKwkvKiBkaXJlY3Rpb24gd3J0IGhvc3QgQ1BVICovCisJY2hhciB0eF9kYXRhW1NTVF9CWVRfSVBDX01BWF9QQVlMT0FEX1NJWkVdOworCXNpemVfdCB0eF9zaXplOworCWNoYXIgcnhfZGF0YVtTU1RfQllUX0lQQ19NQVhfUEFZTE9BRF9TSVpFXTsKKwlzaXplX3Qgcnhfc2l6ZTsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOworCWJvb2wgY29tcGxldGU7CisJYm9vbCB3YWl0OworCWludCBlcnJubzsKK307CisKK3N0cnVjdCBzc3RfYnl0X3N0cmVhbTsKK3N0cnVjdCBzc3RfYnl0OworCisvKiBzdHJlYW0gaW5mb21hdGlvbiAqLworc3RydWN0IHNzdF9ieXRfc3RyZWFtIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisKKwkvKiBjb25maWd1cmF0aW9uICovCisJc3RydWN0IHNzdF9ieXRfYWxsb2NfcGFyYW1zIHJlcXVlc3Q7CisJc3RydWN0IHNzdF9ieXRfYWxsb2NfcmVzcG9uc2UgcmVwbHk7CisKKwkvKiBydW50aW1lIGluZm8gKi8KKwlzdHJ1Y3Qgc3N0X2J5dCAqYnl0OworCWludCBzdHJfaWQ7CisJYm9vbCBjb21taXRlZDsKKwlib29sIHJ1bm5pbmc7CisKKwkvKiBkcml2ZXIgY2FsbGJhY2sgKi8KKwl1MzIgKCpub3RpZnlfcG9zaXRpb24pKHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhKTsKKwl2b2lkICpwZGF0YTsKK307CisKKy8qIFNTVCBCYXl0cmFpbCBJUEMgZGF0YSAqLworc3RydWN0IHNzdF9ieXQgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwOworCisJLyogc3RyZWFtICovCisJc3RydWN0IGxpc3RfaGVhZCBzdHJlYW1fbGlzdDsKKworCS8qIGJvb3QgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBib290X3dhaXQ7CisJYm9vbCBib290X2NvbXBsZXRlOworCisJLyogSVBDIG1lc3NhZ2luZyAqLworCXN0cnVjdCBsaXN0X2hlYWQgdHhfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJ4X2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBlbXB0eV9saXN0OworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfdHhxOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHhfdGhyZWFkOworCXN0cnVjdCBrdGhyZWFkX3dvcmtlciBrd29ya2VyOworCXN0cnVjdCBrdGhyZWFkX3dvcmsga3dvcms7CisJc3RydWN0IGlwY19tZXNzYWdlICptc2c7Cit9OworCitzdGF0aWMgaW5saW5lIHU2NCBzc3RfYnl0X2hlYWRlcihpbnQgbXNnX2lkLCBpbnQgZGF0YSwgYm9vbCBsYXJnZSwgaW50IHN0cl9pZCkKK3sKKwl1NjQgaGVhZGVyOworCisJaGVhZGVyID0gSVBDX0hFQURFUl9NU0dfSUQobXNnX2lkKSB8CisJCSBJUENfSEVBREVSX1NUUl9JRChzdHJfaWQpIHwKKwkJIElQQ19IRUFERVJfTEFSR0UobGFyZ2UpIHwKKwkJIElQQ19IRUFERVJfREFUQShkYXRhKSB8CisJCSBTU1RfQllUX0lQQ1hfQlVTWTsKKworCXJldHVybiBoZWFkZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHNzdF9ieXRfaGVhZGVyX21zZ19pZCh1NjQgaGVhZGVyKQoreworCXJldHVybiBoZWFkZXIgJiBJUENfSEVBREVSX01TR19JRF9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHU4IHNzdF9ieXRfaGVhZGVyX3N0cl9pZCh1NjQgaGVhZGVyKQoreworCXJldHVybiAoaGVhZGVyID4+IElQQ19IRUFERVJfU1RSX0lEX1NISUZUKSAmIElQQ19IRUFERVJfU1RSX0lEX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHNzdF9ieXRfaGVhZGVyX2RhdGEodTY0IGhlYWRlcikKK3sKKwlyZXR1cm4gKGhlYWRlciA+PiBJUENfSEVBREVSX0RBVEFfU0hJRlQpICYgSVBDX0hFQURFUl9EQVRBX01BU0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnNzdF9ieXRfZ2V0X3N0cmVhbShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LAorCQkJCQkJIGludCBzdHJlYW1faWQpCit7CisJc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW07CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0cmVhbSwgJmJ5dC0+c3RyZWFtX2xpc3QsIG5vZGUpIHsKKwkJaWYgKHN0cmVhbS0+c3RyX2lkID09IHN0cmVhbV9pZCkKKwkJCXJldHVybiBzdHJlYW07CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNzdF9ieXRfaXBjX3NoaW1fZGJnKHN0cnVjdCBzc3RfYnl0ICpieXQsIGNvbnN0IGNoYXIgKnRleHQpCit7CisJc3RydWN0IHNzdF9kc3AgKnNzdCA9IGJ5dC0+ZHNwOworCXU2NCBpc3IsIGlwY2QsIGltcngsIGlwY3g7CisKKwlpcGN4ID0gc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChzc3QsIFNTVF9JUENYKTsKKwlpc3IgPSBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHNzdCwgU1NUX0lTUlgpOworCWlwY2QgPSBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHNzdCwgU1NUX0lQQ0QpOworCWltcnggPSBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHNzdCwgU1NUX0lNUlgpOworCisJZGV2X2VycihieXQtPmRldiwKKwkJImlwYzogLS0lcy0tIGlwY3ggMHglbGx4IGlzciAweCVsbHggaXBjZCAweCVsbHggaW1yeCAweCVsbHhcbiIsCisJCXRleHQsIGlwY3gsIGlzciwgaXBjZCwgaW1yeCk7Cit9CisKKy8qIGxvY2tzIGhlbGQgYnkgY2FsbGVyICovCitzdGF0aWMgc3RydWN0IGlwY19tZXNzYWdlICpzc3RfYnl0X21zZ19nZXRfZW1wdHkoc3RydWN0IHNzdF9ieXQgKmJ5dCkKK3sKKwlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZyA9IE5VTEw7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmJ5dC0+ZW1wdHlfbGlzdCkpIHsKKwkJbXNnID0gbGlzdF9maXJzdF9lbnRyeSgmYnl0LT5lbXB0eV9saXN0LAorCQkJCSAgICAgICBzdHJ1Y3QgaXBjX21lc3NhZ2UsIGxpc3QpOworCQlsaXN0X2RlbCgmbXNnLT5saXN0KTsKKwl9CisKKwlyZXR1cm4gbXNnOworfQorCitzdGF0aWMgdm9pZCBzc3RfYnl0X2lwY190eF9tc2dzKHN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspCit7CisJc3RydWN0IHNzdF9ieXQgKmJ5dCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc3N0X2J5dCwga3dvcmspOworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOworCXU2NCBpcGN4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnl0LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKGxpc3RfZW1wdHkoJmJ5dC0+dHhfbGlzdCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnl0LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBpZiB0aGUgRFNQIGlzIGJ1c3kgd2Ugd2lsbCBUWCBtZXNzYWdlcyBhZnRlciBJUlEgKi8KKwlpcGN4ID0gc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChieXQtPmRzcCwgU1NUX0lQQ1gpOworCWlmIChpcGN4ICYgU1NUX0JZVF9JUENYX0JVU1kpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnl0LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwltc2cgPSBsaXN0X2ZpcnN0X2VudHJ5KCZieXQtPnR4X2xpc3QsIHN0cnVjdCBpcGNfbWVzc2FnZSwgbGlzdCk7CisKKwlsaXN0X21vdmUoJm1zZy0+bGlzdCwgJmJ5dC0+cnhfbGlzdCk7CisKKwkvKiBzZW5kIHRoZSBtZXNzYWdlICovCisJaWYgKG1zZy0+aGVhZGVyICYgSVBDX0hFQURFUl9MQVJHRSh0cnVlKSkKKwkJc3N0X2RzcF9vdXRib3hfd3JpdGUoYnl0LT5kc3AsIG1zZy0+dHhfZGF0YSwgbXNnLT50eF9zaXplKTsKKwlzc3RfZHNwX3NoaW1fd3JpdGU2NF91bmxvY2tlZChieXQtPmRzcCwgU1NUX0lQQ1gsIG1zZy0+aGVhZGVyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ5dC0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3N0X2J5dF90eF9tc2dfcmVwbHlfY29tcGxldGUoc3RydWN0IHNzdF9ieXQgKmJ5dCwKKwkJCQkJCSBzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZykKK3sKKwltc2ctPmNvbXBsZXRlID0gdHJ1ZTsKKworCWlmICghbXNnLT53YWl0KQorCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsICZieXQtPmVtcHR5X2xpc3QpOworCWVsc2UKKwkJd2FrZV91cCgmbXNnLT53YWl0cSk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2J5dF90eF93YWl0X2RvbmUoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IGlwY19tZXNzYWdlICptc2csCisJCQkJdm9pZCAqcnhfZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwkvKiB3YWl0IGZvciBEU1AgY29tcGxldGlvbiAqLworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChtc2ctPndhaXRxLCBtc2ctPmNvbXBsZXRlLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKElQQ19USU1FT1VUX01TRUNTKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnl0LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKHJldCA9PSAwKSB7CisJCWxpc3RfZGVsKCZtc2ctPmxpc3QpOworCQlzc3RfYnl0X2lwY19zaGltX2RiZyhieXQsICJtZXNzYWdlIHRpbWVvdXQiKTsKKworCQlyZXQgPSAtRVRJTUVET1VUOworCX0gZWxzZSB7CisKKwkJLyogY29weSB0aGUgZGF0YSByZXR1cm5lZCBmcm9tIERTUCAqLworCQlpZiAobXNnLT5yeF9zaXplKQorCQkJbWVtY3B5KHJ4X2RhdGEsIG1zZy0+cnhfZGF0YSwgbXNnLT5yeF9zaXplKTsKKwkJcmV0ID0gbXNnLT5lcnJubzsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsICZieXQtPmVtcHR5X2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ5dC0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2J5dF9pcGNfdHhfbWVzc2FnZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyLAorCQkJCSAgdm9pZCAqdHhfZGF0YSwgc2l6ZV90IHR4X2J5dGVzLAorCQkJCSAgdm9pZCAqcnhfZGF0YSwgc2l6ZV90IHJ4X2J5dGVzLCBpbnQgd2FpdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJ5dC0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCisJbXNnID0gc3N0X2J5dF9tc2dfZ2V0X2VtcHR5KGJ5dCk7CisJaWYgKG1zZyA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ5dC0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCW1zZy0+aGVhZGVyID0gaGVhZGVyOworCW1zZy0+dHhfc2l6ZSA9IHR4X2J5dGVzOworCW1zZy0+cnhfc2l6ZSA9IHJ4X2J5dGVzOworCW1zZy0+d2FpdCA9IHdhaXQ7CisJbXNnLT5lcnJubyA9IDA7CisJbXNnLT5jb21wbGV0ZSA9IGZhbHNlOworCisJaWYgKHR4X2J5dGVzKSB7CisJCS8qIG1zZyBjb250ZW50ID0gbG93ZXIgMzItYml0IG9mIHRoZSBoZWFkZXIgKyBkYXRhICovCisJCSoodTMyICopbXNnLT50eF9kYXRhID0gKHUzMikoaGVhZGVyICYgKHUzMiktMSk7CisJCW1lbWNweShtc2ctPnR4X2RhdGEgKyBzaXplb2YodTMyKSwgdHhfZGF0YSwgdHhfYnl0ZXMpOworCQltc2ctPnR4X3NpemUgKz0gc2l6ZW9mKHUzMik7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmbXNnLT5saXN0LCAmYnl0LT50eF9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZieXQtPmRzcC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXF1ZXVlX2t0aHJlYWRfd29yaygmYnl0LT5rd29ya2VyLCAmYnl0LT5rd29yayk7CisKKwlpZiAod2FpdCkKKwkJcmV0dXJuIHNzdF9ieXRfdHhfd2FpdF9kb25lKGJ5dCwgbXNnLCByeF9kYXRhKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzc3RfYnl0X2lwY190eF9tc2dfd2FpdChzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyLAorCQkJCQkgIHZvaWQgKnR4X2RhdGEsIHNpemVfdCB0eF9ieXRlcywKKwkJCQkJICB2b2lkICpyeF9kYXRhLCBzaXplX3QgcnhfYnl0ZXMpCit7CisJcmV0dXJuIHNzdF9ieXRfaXBjX3R4X21lc3NhZ2UoYnl0LCBoZWFkZXIsIHR4X2RhdGEsIHR4X2J5dGVzLAorCQkJCSAgICAgIHJ4X2RhdGEsIHJ4X2J5dGVzLCAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3N0X2J5dF9pcGNfdHhfbXNnX25vd2FpdChzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyLAorCQkJCQkJdm9pZCAqdHhfZGF0YSwgc2l6ZV90IHR4X2J5dGVzKQoreworCXJldHVybiBzc3RfYnl0X2lwY190eF9tZXNzYWdlKGJ5dCwgaGVhZGVyLCB0eF9kYXRhLCB0eF9ieXRlcywKKwkJCQkgICAgICBOVUxMLCAwLCAwKTsKK30KKworc3RhdGljIHN0cnVjdCBpcGNfbWVzc2FnZSAqc3N0X2J5dF9yZXBseV9maW5kX21zZyhzdHJ1Y3Qgc3N0X2J5dCAqYnl0LAorCQkJCQkJICB1NjQgaGVhZGVyKQoreworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnID0gTlVMTCwgKl9tc2c7CisJdTY0IG1hc2s7CisKKwkvKiBtYXRjaCByZXBseSB0byBtZXNzYWdlIHNlbnQgYmFzZWQgb24gbXNnIGFuZCBzdHJlYW0gSURzICovCisJbWFzayA9IElQQ19IRUFERVJfTVNHX0lEX01BU0sgfAorCSAgICAgICBJUENfSEVBREVSX1NUUl9JRF9NQVNLIDw8IElQQ19IRUFERVJfU1RSX0lEX1NISUZUOworCWhlYWRlciAmPSBtYXNrOworCisJaWYgKGxpc3RfZW1wdHkoJmJ5dC0+cnhfbGlzdCkpIHsKKwkJZGV2X2VycihieXQtPmRldiwKKwkJCSJpcGM6IHJ4IGxpc3QgaXMgZW1wdHkgYnV0IHJlY2VpdmVkIDB4JWxseFxuIiwgaGVhZGVyKTsKKwkJZ290byBvdXQ7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShfbXNnLCAmYnl0LT5yeF9saXN0LCBsaXN0KSB7CisJCWlmICgoX21zZy0+aGVhZGVyICYgbWFzaykgPT0gaGVhZGVyKSB7CisJCQltc2cgPSBfbXNnOworCQkJYnJlYWs7CisJCX0KKwl9CisKK291dDoKKwlyZXR1cm4gbXNnOworfQorCitzdGF0aWMgdm9pZCBzc3RfYnl0X3N0cmVhbV91cGRhdGUoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IGlwY19tZXNzYWdlICptc2cpCit7CisJc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW07CisJdTY0IGhlYWRlciA9IG1zZy0+aGVhZGVyOworCXU4IHN0cmVhbV9pZCA9IHNzdF9ieXRfaGVhZGVyX3N0cl9pZChoZWFkZXIpOworCXU4IHN0cmVhbV9tc2cgPSBzc3RfYnl0X2hlYWRlcl9tc2dfaWQoaGVhZGVyKTsKKworCXN0cmVhbSA9IHNzdF9ieXRfZ2V0X3N0cmVhbShieXQsIHN0cmVhbV9pZCk7CisJaWYgKHN0cmVhbSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHN0cmVhbV9tc2cpIHsKKwljYXNlIElQQ19JQV9EUk9QX1NUUkVBTToKKwljYXNlIElQQ19JQV9QQVVTRV9TVFJFQU06CisJY2FzZSBJUENfSUFfRlJFRV9TVFJFQU06CisJCXN0cmVhbS0+cnVubmluZyA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIElQQ19JQV9TVEFSVF9TVFJFQU06CisJY2FzZSBJUENfSUFfUkVTVU1FX1NUUkVBTToKKwkJc3RyZWFtLT5ydW5uaW5nID0gdHJ1ZTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcHJvY2Vzc19yZXBseShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyKQoreworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOworCisJbXNnID0gc3N0X2J5dF9yZXBseV9maW5kX21zZyhieXQsIGhlYWRlcik7CisJaWYgKG1zZyA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCWlmIChoZWFkZXIgJiBJUENfSEVBREVSX0xBUkdFKHRydWUpKSB7CisJCW1zZy0+cnhfc2l6ZSA9IHNzdF9ieXRfaGVhZGVyX2RhdGEoaGVhZGVyKTsKKwkJc3N0X2RzcF9pbmJveF9yZWFkKGJ5dC0+ZHNwLCBtc2ctPnJ4X2RhdGEsIG1zZy0+cnhfc2l6ZSk7CisJfQorCisJLyogdXBkYXRlIGFueSBzdHJlYW0gc3RhdGVzICovCisJc3N0X2J5dF9zdHJlYW1fdXBkYXRlKGJ5dCwgbXNnKTsKKworCWxpc3RfZGVsKCZtc2ctPmxpc3QpOworCS8qIHdha2UgdXAgKi8KKwlzc3RfYnl0X3R4X21zZ19yZXBseV9jb21wbGV0ZShieXQsIG1zZyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgc3N0X2J5dF9md19yZWFkeShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyKQoreworCWRldl9kYmcoYnl0LT5kZXYsICJpcGM6IERTUCBpcyByZWFkeSAweCVsbFhcbiIsIGhlYWRlcik7CisKKwlieXQtPmJvb3RfY29tcGxldGUgPSB0cnVlOworCXdha2VfdXAoJmJ5dC0+Ym9vdF93YWl0KTsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3Byb2Nlc3Nfbm90aWZpY2F0aW9uKHN0cnVjdCBzc3RfYnl0ICpieXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBieXQtPmRzcDsKKwlzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbTsKKwl1NjQgaGVhZGVyOworCXU4IG1zZ19pZCwgc3RyZWFtX2lkOworCWludCBoYW5kbGVkID0gMTsKKworCWhlYWRlciA9IHNzdF9kc3Bfc2hpbV9yZWFkNjRfdW5sb2NrZWQoc3N0LCBTU1RfSVBDRCk7CisJbXNnX2lkID0gc3N0X2J5dF9oZWFkZXJfbXNnX2lkKGhlYWRlcik7CisKKwlzd2l0Y2ggKG1zZ19pZCkgeworCWNhc2UgSVBDX1NTVF9QRVJJT0RfRUxBUFNFRDoKKwkJc3RyZWFtX2lkID0gc3N0X2J5dF9oZWFkZXJfc3RyX2lkKGhlYWRlcik7CisJCXN0cmVhbSA9IHNzdF9ieXRfZ2V0X3N0cmVhbShieXQsIHN0cmVhbV9pZCk7CisJCWlmIChzdHJlYW0gJiYgc3RyZWFtLT5ydW5uaW5nICYmIHN0cmVhbS0+bm90aWZ5X3Bvc2l0aW9uKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3QtPnNwaW5sb2NrLCAqZmxhZ3MpOworCQkJc3RyZWFtLT5ub3RpZnlfcG9zaXRpb24oc3RyZWFtLCBzdHJlYW0tPnBkYXRhKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPnNwaW5sb2NrLCAqZmxhZ3MpOworCQl9CisJCWJyZWFrOworCWNhc2UgSVBDX0lBX0ZXX0lOSVRfQ01QTFQ6CisJCXNzdF9ieXRfZndfcmVhZHkoYnl0LCBoZWFkZXIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaGFuZGxlZDsKK30KKworc3RhdGljIGlycXJldHVybl90IHNzdF9ieXRfaXJxX3RocmVhZChpbnQgaXJxLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSAoc3RydWN0IHNzdF9kc3AgKikgY29udGV4dDsKKwlzdHJ1Y3Qgc3N0X2J5dCAqYnl0ID0gc3N0X2RzcF9nZXRfdGhyZWFkX2NvbnRleHQoc3N0KTsKKwl1NjQgaGVhZGVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCisJaGVhZGVyID0gc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChzc3QsIFNTVF9JUENEKTsKKwlpZiAoaGVhZGVyICYgU1NUX0JZVF9JUENEX0JVU1kpIHsKKwkJaWYgKGhlYWRlciAmIElQQ19OT1RJRklDQVRJT04pIHsKKwkJCS8qIG1lc3NhZ2UgZnJvbSBBRFNQICovCisJCQlzc3RfYnl0X3Byb2Nlc3Nfbm90aWZpY2F0aW9uKGJ5dCwgJmZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHJlcGx5IGZyb20gQURTUCAqLworCQkJc3N0X2J5dF9wcm9jZXNzX3JlcGx5KGJ5dCwgaGVhZGVyKTsKKwkJfQorCQkvKgorCQkgKiBjbGVhciBJUENEIEJVU1kgYml0IGFuZCBzZXQgRE9ORSBiaXQuIFRlbGwgRFNQIHdlIGhhdmUKKwkJICogcHJvY2Vzc2VkIHRoZSBtZXNzYWdlIGFuZCBjYW4gYWNjZXB0IG5ldy4gQ2xlYXIgZGF0YSBwYXJ0CisJCSAqIG9mIHRoZSBoZWFkZXIKKwkJICovCisJCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0czY0X3VubG9ja2VkKHNzdCwgU1NUX0lQQ0QsCisJCQlTU1RfQllUX0lQQ0RfRE9ORSB8IFNTVF9CWVRfSVBDRF9CVVNZIHwKKwkJCUlQQ19IRUFERVJfREFUQShJUENfSEVBREVSX0RBVEFfTUFTSyksCisJCQlTU1RfQllUX0lQQ0RfRE9ORSk7CisJCS8qIHVubWFzayBtZXNzYWdlIHJlcXVlc3QgaW50ZXJydXB0cyAqLworCQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NF91bmxvY2tlZChzc3QsIFNTVF9JTVJYLAorCQkJU1NUX0JZVF9JTVJYX1JFUVVFU1QsIDApOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCS8qIGNvbnRpbnVlIHRvIHNlbmQgYW55IHJlbWFpbmluZyBtZXNzYWdlcy4uLiAqLworCXF1ZXVlX2t0aHJlYWRfd29yaygmYnl0LT5rd29ya2VyLCAmYnl0LT5rd29yayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIHN0cmVhbSBBUEkgKi8KK3N0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3N0X2J5dF9zdHJlYW1fbmV3KHN0cnVjdCBzc3RfYnl0ICpieXQsIGludCBpZCwKKwl1MzIgKCpub3RpZnlfcG9zaXRpb24pKHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhKSwKKwl2b2lkICpkYXRhKQoreworCXN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtOworCisJc3RyZWFtID0ga3phbGxvYyhzaXplb2YoKnN0cmVhbSksIEdGUF9LRVJORUwpOworCWlmIChzdHJlYW0gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaXN0X2FkZCgmc3RyZWFtLT5ub2RlLCAmYnl0LT5zdHJlYW1fbGlzdCk7CisJc3RyZWFtLT5ub3RpZnlfcG9zaXRpb24gPSBub3RpZnlfcG9zaXRpb247CisJc3RyZWFtLT5wZGF0YSA9IGRhdGE7CisJc3RyZWFtLT5ieXQgPSBieXQ7CisJc3RyZWFtLT5zdHJfaWQgPSBpZDsKKworCXJldHVybiBzdHJlYW07Cit9CisKK2ludCBzc3RfYnl0X3N0cmVhbV9zZXRfYml0cyhzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgICBpbnQgYml0cykKK3sKKwlzdHJlYW0tPnJlcXVlc3QucGNtX3BhcmFtcy5wY21fd2Rfc3ogPSBiaXRzOworCXJldHVybiAwOworfQorCitpbnQgc3N0X2J5dF9zdHJlYW1fc2V0X2NoYW5uZWxzKHN0cnVjdCBzc3RfYnl0ICpieXQsCisJCQkJc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0sIHU4IGNoYW5uZWxzKQoreworCXN0cmVhbS0+cmVxdWVzdC5wY21fcGFyYW1zLm51bV9jaGFuID0gY2hhbm5lbHM7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfYnl0X3N0cmVhbV9zZXRfcmF0ZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwlzdHJlYW0tPnJlcXVlc3QucGNtX3BhcmFtcy5zZnJlcSA9IHJhdGU7CisJcmV0dXJuIDA7Cit9CisKKy8qIHN0cmVhbSBzb25maWd1cmF0aW9uICovCitpbnQgc3N0X2J5dF9zdHJlYW1fdHlwZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCWludCBjb2RlY190eXBlLCBpbnQgc3RyZWFtX3R5cGUsIGludCBvcGVyYXRpb24pCit7CisJc3RyZWFtLT5yZXF1ZXN0LnN0cl90eXBlLmNvZGVjX3R5cGUgPSBjb2RlY190eXBlOworCXN0cmVhbS0+cmVxdWVzdC5zdHJfdHlwZS5zdHJfdHlwZSA9IHN0cmVhbV90eXBlOworCXN0cmVhbS0+cmVxdWVzdC5zdHJfdHlwZS5vcGVyYXRpb24gPSBvcGVyYXRpb247CisJc3RyZWFtLT5yZXF1ZXN0LnN0cl90eXBlLnRpbWVfc2xvdHMgPSAweGM7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9ieXRfc3RyZWFtX2J1ZmZlcihzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgdWludDMyX3QgYnVmZmVyX2FkZHIsIHVpbnQzMl90IGJ1ZmZlcl9zaXplKQoreworCXN0cmVhbS0+cmVxdWVzdC5mcmFtZV9pbmZvLm51bV9lbnRyaWVzID0gMTsKKwlzdHJlYW0tPnJlcXVlc3QuZnJhbWVfaW5mby5yaW5nX2J1Zl9pbmZvWzBdLmFkZHIgPSBidWZmZXJfYWRkcjsKKwlzdHJlYW0tPnJlcXVlc3QuZnJhbWVfaW5mby5yaW5nX2J1Zl9pbmZvWzBdLnNpemUgPSBidWZmZXJfc2l6ZTsKKwkvKiBjYWxjdWxhdGUgYnl0ZXMgcGVyIDQgbXMgZnJhZ21lbnQgKi8KKwlzdHJlYW0tPnJlcXVlc3QuZnJhbWVfaW5mby5mcmFnX3NpemUgPQorCQlzdHJlYW0tPnJlcXVlc3QucGNtX3BhcmFtcy5zZnJlcSAqCisJCXN0cmVhbS0+cmVxdWVzdC5wY21fcGFyYW1zLm51bV9jaGFuICoKKwkJc3RyZWFtLT5yZXF1ZXN0LnBjbV9wYXJhbXMucGNtX3dkX3N6IC8gOCAqCisJCTQgLyAxMDAwOworCXJldHVybiAwOworfQorCitpbnQgc3N0X2J5dF9zdHJlYW1fY29tbWl0KHN0cnVjdCBzc3RfYnl0ICpieXQsIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtKQoreworCXN0cnVjdCBzc3RfYnl0X2FsbG9jX3BhcmFtcyAqc3RyX3JlcSA9ICZzdHJlYW0tPnJlcXVlc3Q7CisJc3RydWN0IHNzdF9ieXRfYWxsb2NfcmVzcG9uc2UgKnJlcGx5ID0gJnN0cmVhbS0+cmVwbHk7CisJdTY0IGhlYWRlcjsKKwlpbnQgcmV0OworCisJaGVhZGVyID0gc3N0X2J5dF9oZWFkZXIoSVBDX0lBX0FMTE9DX1NUUkVBTSwKKwkJCQlzaXplb2YoKnN0cl9yZXEpICsgc2l6ZW9mKHUzMiksCisJCQkJdHJ1ZSwgc3RyZWFtLT5zdHJfaWQpOworCXJldCA9IHNzdF9ieXRfaXBjX3R4X21zZ193YWl0KGJ5dCwgaGVhZGVyLCBzdHJfcmVxLCBzaXplb2YoKnN0cl9yZXEpLAorCQkJCSAgICAgIHJlcGx5LCBzaXplb2YoKnJlcGx5KSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihieXQtPmRldiwgImlwYzogZXJyb3Igc3RyZWFtIGNvbW1pdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXN0cmVhbS0+Y29tbWl0ZWQgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfYnl0X3N0cmVhbV9mcmVlKHN0cnVjdCBzc3RfYnl0ICpieXQsIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtKQoreworCXU2NCBoZWFkZXI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXN0cmVhbS0+Y29tbWl0ZWQpCisJCWdvdG8gb3V0OworCisJaGVhZGVyID0gc3N0X2J5dF9oZWFkZXIoSVBDX0lBX0ZSRUVfU1RSRUFNLCAwLCBmYWxzZSwgc3RyZWFtLT5zdHJfaWQpOworCXJldCA9IHNzdF9ieXRfaXBjX3R4X21zZ193YWl0KGJ5dCwgaGVhZGVyLCBOVUxMLCAwLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBmcmVlIHN0cmVhbSAlZCBmYWlsZWRcbiIsCisJCQlzdHJlYW0tPnN0cl9pZCk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXN0cmVhbS0+Y29tbWl0ZWQgPSBmYWxzZTsKK291dDoKKwlsaXN0X2RlbCgmc3RyZWFtLT5ub2RlKTsKKwlrZnJlZShzdHJlYW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3N0cmVhbV9vcGVyYXRpb25zKHN0cnVjdCBzc3RfYnl0ICpieXQsIGludCB0eXBlLAorCQkJCSAgICAgaW50IHN0cmVhbV9pZCwgaW50IHdhaXQpCit7CisJc3RydWN0IHNzdF9ieXRfc3RhcnRfc3RyZWFtX3BhcmFtcyBzdGFydF9zdHJlYW07CisJdTY0IGhlYWRlcjsKKwl2b2lkICp0eF9tc2cgPSBOVUxMOworCXNpemVfdCBzaXplID0gMDsKKworCWlmICh0eXBlICE9IElQQ19JQV9TVEFSVF9TVFJFQU0pIHsKKwkJaGVhZGVyID0gc3N0X2J5dF9oZWFkZXIodHlwZSwgMCwgZmFsc2UsIHN0cmVhbV9pZCk7CisJfSBlbHNlIHsKKwkJc3RhcnRfc3RyZWFtLmJ5dGVfb2Zmc2V0ID0gMDsKKwkJaGVhZGVyID0gc3N0X2J5dF9oZWFkZXIoSVBDX0lBX1NUQVJUX1NUUkVBTSwKKwkJCQkJc2l6ZW9mKHN0YXJ0X3N0cmVhbSkgKyBzaXplb2YodTMyKSwKKwkJCQkJdHJ1ZSwgc3RyZWFtX2lkKTsKKwkJdHhfbXNnID0gJnN0YXJ0X3N0cmVhbTsKKwkJc2l6ZSA9IHNpemVvZihzdGFydF9zdHJlYW0pOworCX0KKworCWlmICh3YWl0KQorCQlyZXR1cm4gc3N0X2J5dF9pcGNfdHhfbXNnX3dhaXQoYnl0LCBoZWFkZXIsCisJCQkJCSAgICAgICB0eF9tc2csIHNpemUsIE5VTEwsIDApOworCWVsc2UKKwkJcmV0dXJuIHNzdF9ieXRfaXBjX3R4X21zZ19ub3dhaXQoYnl0LCBoZWFkZXIsIHR4X21zZywgc2l6ZSk7Cit9CisKKy8qIHN0cmVhbSBBTFNBIHRyaWdnZXIgb3BlcmF0aW9ucyAqLworaW50IHNzdF9ieXRfc3RyZWFtX3N0YXJ0KHN0cnVjdCBzc3RfYnl0ICpieXQsIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzc3RfYnl0X3N0cmVhbV9vcGVyYXRpb25zKGJ5dCwgSVBDX0lBX1NUQVJUX1NUUkVBTSwKKwkJCQkJc3RyZWFtLT5zdHJfaWQsIDApOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBlcnJvciBmYWlsZWQgdG8gc3RhcnQgc3RyZWFtICVkXG4iLAorCQkJc3RyZWFtLT5zdHJfaWQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHNzdF9ieXRfc3RyZWFtX3N0b3Aoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0pCit7CisJaW50IHJldDsKKworCS8qIGRvbid0IHN0b3Agc3RyZWFtcyB0aGF0IGFyZSBub3QgY29tbWl0ZWQgKi8KKwlpZiAoIXN0cmVhbS0+Y29tbWl0ZWQpCisJCXJldHVybiAwOworCisJcmV0ID0gc3N0X2J5dF9zdHJlYW1fb3BlcmF0aW9ucyhieXQsIElQQ19JQV9EUk9QX1NUUkVBTSwKKwkJCQkJc3RyZWFtLT5zdHJfaWQsIDApOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBlcnJvciBmYWlsZWQgdG8gc3RvcCBzdHJlYW0gJWRcbiIsCisJCQlzdHJlYW0tPnN0cl9pZCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHNzdF9ieXRfc3RyZWFtX3BhdXNlKHN0cnVjdCBzc3RfYnl0ICpieXQsIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzc3RfYnl0X3N0cmVhbV9vcGVyYXRpb25zKGJ5dCwgSVBDX0lBX1BBVVNFX1NUUkVBTSwKKwkJCQkJc3RyZWFtLT5zdHJfaWQsIDApOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBlcnJvciBmYWlsZWQgdG8gcGF1c2Ugc3RyZWFtICVkXG4iLAorCQkJc3RyZWFtLT5zdHJfaWQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHNzdF9ieXRfc3RyZWFtX3Jlc3VtZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc3N0X2J5dF9zdHJlYW1fb3BlcmF0aW9ucyhieXQsIElQQ19JQV9SRVNVTUVfU1RSRUFNLAorCQkJCQlzdHJlYW0tPnN0cl9pZCwgMCk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoYnl0LT5kZXYsICJpcGM6IGVycm9yIGZhaWxlZCB0byByZXN1bWUgc3RyZWFtICVkXG4iLAorCQkJc3RyZWFtLT5zdHJfaWQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHNzdF9ieXRfZ2V0X2RzcF9wb3NpdGlvbihzdHJ1Y3Qgc3N0X2J5dCAqYnl0LAorCQkJICAgICBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwgaW50IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBieXQtPmRzcDsKKwlzdHJ1Y3Qgc3N0X2J5dF90c3RhbXAgZndfdHN0YW1wOworCXU4IHN0cl9pZCA9IHN0cmVhbS0+c3RyX2lkOworCXUzMiB0c3RhbXBfb2Zmc2V0OworCisJdHN0YW1wX29mZnNldCA9IFNTVF9CWVRfVElNRVNUQU1QX09GRlNFVCArIHN0cl9pZCAqIHNpemVvZihmd190c3RhbXApOworCW1lbWNweV9mcm9taW8oJmZ3X3RzdGFtcCwKKwkJICAgICAgc3N0LT5hZGRyLmxwZSArIHRzdGFtcF9vZmZzZXQsIHNpemVvZihmd190c3RhbXApKTsKKworCXJldHVybiBkb19kaXYoZndfdHN0YW1wLnJpbmdfYnVmZmVyX2NvdW50ZXIsIGJ1ZmZlcl9zaXplKTsKK30KKworc3RhdGljIGludCBtc2dfZW1wdHlfbGlzdF9pbml0KHN0cnVjdCBzc3RfYnl0ICpieXQpCit7CisJc3RydWN0IGlwY19tZXNzYWdlICptc2c7CisJaW50IGk7CisKKwlieXQtPm1zZyA9IGt6YWxsb2Moc2l6ZW9mKCptc2cpICogSVBDX0VNUFRZX0xJU1RfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ5dC0+bXNnID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IElQQ19FTVBUWV9MSVNUX1NJWkU7IGkrKykgeworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZieXQtPm1zZ1tpXS53YWl0cSk7CisJCWxpc3RfYWRkKCZieXQtPm1zZ1tpXS5saXN0LCAmYnl0LT5lbXB0eV9saXN0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHNzdF9kc3AgKnNzdF9ieXRfZ2V0X2RzcChzdHJ1Y3Qgc3N0X2J5dCAqYnl0KQoreworCXJldHVybiBieXQtPmRzcDsKK30KKworc3RhdGljIHN0cnVjdCBzc3RfZHNwX2RldmljZSBieXRfZGV2ID0geworCS50aHJlYWQgPSBzc3RfYnl0X2lycV90aHJlYWQsCisJLm9wcyA9ICZzc3RfYnl0X29wcywKK307CisKK2ludCBzc3RfYnl0X2RzcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHNzdF9ieXQgKmJ5dDsKKwlzdHJ1Y3Qgc3N0X2Z3ICpieXRfc3N0X2Z3OworCWludCBlcnI7CisKKwlkZXZfZGJnKGRldiwgImluaXRpYWxpc2luZyBCeXQgRFNQIElQQ1xuIik7CisKKwlieXQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmJ5dCksIEdGUF9LRVJORUwpOworCWlmIChieXQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlieXQtPmRldiA9IGRldjsKKwlJTklUX0xJU1RfSEVBRCgmYnl0LT5zdHJlYW1fbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJ5dC0+dHhfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJ5dC0+cnhfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJ5dC0+ZW1wdHlfbGlzdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYnl0LT5ib290X3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJ5dC0+d2FpdF90eHEpOworCisJZXJyID0gbXNnX2VtcHR5X2xpc3RfaW5pdChieXQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHN0YXJ0IHRoZSBJUEMgbWVzc2FnZSB0aHJlYWQgKi8KKwlpbml0X2t0aHJlYWRfd29ya2VyKCZieXQtPmt3b3JrZXIpOworCWJ5dC0+dHhfdGhyZWFkID0ga3RocmVhZF9ydW4oa3RocmVhZF93b3JrZXJfZm4sCisJCQkJICAgICAmYnl0LT5rd29ya2VyLAorCQkJCSAgICAgZGV2X25hbWUoYnl0LT5kZXYpKTsKKwlpZiAoSVNfRVJSKGJ5dC0+dHhfdGhyZWFkKSkgeworCQllcnIgPSBQVFJfRVJSKGJ5dC0+dHhfdGhyZWFkKTsKKwkJZGV2X2VycihieXQtPmRldiwgImVycm9yIGZhaWxlZCB0byBjcmVhdGUgbWVzc2FnZSBUWCB0YXNrXG4iKTsKKwkJZ290byBlcnJfZnJlZV9tc2c7CisJfQorCWluaXRfa3RocmVhZF93b3JrKCZieXQtPmt3b3JrLCBzc3RfYnl0X2lwY190eF9tc2dzKTsKKworCWJ5dF9kZXYudGhyZWFkX2NvbnRleHQgPSBieXQ7CisKKwkvKiBpbml0IFNTVCBzaGltICovCisJYnl0LT5kc3AgPSBzc3RfZHNwX25ldyhkZXYsICZieXRfZGV2LCBwZGF0YSk7CisJaWYgKGJ5dC0+ZHNwID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZnJlZV9tc2c7CisJfQorCisJLyoga2VlcCB0aGUgRFNQIGluIHJlc2V0IHN0YXRlIGZvciBiYXNlIEZXIGxvYWRpbmcgKi8KKwlzc3RfZHNwX3Jlc2V0KGJ5dC0+ZHNwKTsKKworCWJ5dF9zc3RfZncgPSBzc3RfZndfbmV3KGJ5dC0+ZHNwLCBwZGF0YS0+ZncsIGJ5dCk7CisJaWYgKGJ5dF9zc3RfZncgID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZGV2X2VycihkZXYsICJlcnJvcjogZmFpbGVkIHRvIGxvYWQgZmlybXdhcmVcbiIpOworCQlnb3RvIGZ3X2VycjsKKwl9CisKKwkvKiB3YWl0IGZvciBEU1AgYm9vdCBjb21wbGV0aW9uICovCisJc3N0X2RzcF9ib290KGJ5dC0+ZHNwKTsKKwllcnIgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYnl0LT5ib290X3dhaXQsIGJ5dC0+Ym9vdF9jb21wbGV0ZSwKKwkJCQkgbXNlY3NfdG9famlmZmllcyhJUENfQk9PVF9NU0VDUykpOworCWlmIChlcnIgPT0gMCkgeworCQllcnIgPSAtRUlPOworCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBlcnJvciBEU1AgYm9vdCB0aW1lb3V0XG4iKTsKKwkJZ290byBib290X2VycjsKKwl9CisKKwlwZGF0YS0+ZHNwID0gYnl0OworCisJcmV0dXJuIDA7CisKK2Jvb3RfZXJyOgorCXNzdF9kc3BfcmVzZXQoYnl0LT5kc3ApOworCXNzdF9md19mcmVlKGJ5dF9zc3RfZncpOworZndfZXJyOgorCXNzdF9kc3BfZnJlZShieXQtPmRzcCk7CitlcnJfZnJlZV9tc2c6CisJa2ZyZWUoYnl0LT5tc2cpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9ieXRfZHNwX2luaXQpOworCit2b2lkIHNzdF9ieXRfZHNwX2ZyZWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3Qgc3N0X2J5dCAqYnl0ID0gcGRhdGEtPmRzcDsKKworCXNzdF9kc3BfcmVzZXQoYnl0LT5kc3ApOworCXNzdF9md19mcmVlX2FsbChieXQtPmRzcCk7CisJc3N0X2RzcF9mcmVlKGJ5dC0+ZHNwKTsKKwlrZnJlZShieXQtPm1zZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfYnl0X2RzcF9mcmVlKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtYmF5dHJhaWwtaXBjLmggYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLWlwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNzJiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLWlwYy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBJbnRlbCBCYXl0cmFpbCBTU1QgSVBDIFN1cHBvcnQKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19TU1RfQllUX0lQQ19ICisjZGVmaW5lIF9fU1NUX0JZVF9JUENfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IHNzdF9ieXQ7CitzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW07CitzdHJ1Y3Qgc3N0X3BkYXRhOworZXh0ZXJuIHN0cnVjdCBzc3Rfb3BzIHNzdF9ieXRfb3BzOworCisKKyNkZWZpbmUgU1NUX0JZVF9NQUlMQk9YX09GRlNFVAkJMHgxNDQwMDAKKyNkZWZpbmUgU1NUX0JZVF9USU1FU1RBTVBfT0ZGU0VUCShTU1RfQllUX01BSUxCT1hfT0ZGU0VUICsgMHg4MDApCisKKy8qKgorICogVXBmcm9udCBkZWZpbmVkIG1heGltdW0gbWVzc2FnZSBzaXplIHRoYXQgaXMKKyAqIGV4cGVjdGVkIGJ5IHRoZSBpbi9vdXQgY29tbXVuaWNhdGlvbiBwaXBlcyBpbiBGVy4KKyAqLworI2RlZmluZSBTU1RfQllUX0lQQ19NQVhfUEFZTE9BRF9TSVpFCTIwMAorCisvKiBzdHJlYW0gQVBJICovCitzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnNzdF9ieXRfc3RyZWFtX25ldyhzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBpbnQgaWQsCisJdWludDMyX3QgKCpnZXRfd3JpdGVfcG9zaXRpb24pKHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLAorCQkJCSAgICAgICB2b2lkICpkYXRhKSwKKwl2b2lkICpkYXRhKTsKKworLyogc3RyZWFtIGNvbmZpZ3VyYXRpb24gKi8KK2ludCBzc3RfYnl0X3N0cmVhbV9zZXRfYml0cyhzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgICBpbnQgYml0cyk7CitpbnQgc3N0X2J5dF9zdHJlYW1fc2V0X2NoYW5uZWxzKHN0cnVjdCBzc3RfYnl0ICpieXQsCisJCQkJc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0sIHU4IGNoYW5uZWxzKTsKK2ludCBzc3RfYnl0X3N0cmVhbV9zZXRfcmF0ZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgcmF0ZSk7CitpbnQgc3N0X2J5dF9zdHJlYW1fdHlwZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCWludCBjb2RlY190eXBlLCBpbnQgc3RyZWFtX3R5cGUsIGludCBvcGVyYXRpb24pOworaW50IHNzdF9ieXRfc3RyZWFtX2J1ZmZlcihzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgdWludDMyX3QgYnVmZmVyX2FkZHIsIHVpbnQzMl90IGJ1ZmZlcl9zaXplKTsKK2ludCBzc3RfYnl0X3N0cmVhbV9jb21taXQoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0pOworaW50IHNzdF9ieXRfc3RyZWFtX2ZyZWUoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0pOworCisvKiBzdHJlYW0gQUxTQSB0cmlnZ2VyIG9wZXJhdGlvbnMgKi8KK2ludCBzc3RfYnl0X3N0cmVhbV9zdGFydChzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSk7CitpbnQgc3N0X2J5dF9zdHJlYW1fc3RvcChzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSk7CitpbnQgc3N0X2J5dF9zdHJlYW1fcGF1c2Uoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0pOworaW50IHNzdF9ieXRfc3RyZWFtX3Jlc3VtZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSk7CisKK2ludCBzc3RfYnl0X2dldF9kc3BfcG9zaXRpb24oc3RydWN0IHNzdF9ieXQgKmJ5dCwKKwkJCSAgICAgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0sIGludCBidWZmZXJfc2l6ZSk7CisKKy8qIGluaXQgKi8KK2ludCBzc3RfYnl0X2RzcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpOwordm9pZCBzc3RfYnl0X2RzcF9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpOworc3RydWN0IHNzdF9kc3AgKnNzdF9ieXRfZ2V0X2RzcChzdHJ1Y3Qgc3N0X2J5dCAqYnl0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLXBjbS5jIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1wY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDEwMWYzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1wY20uYwpAQCAtMCwwICsxLDQyMiBAQAorLyoKKyAqIEludGVsIEJheXRyYWlsIFNTVCBQQ00gU3VwcG9ydAorICogQ29weXJpZ2h0IChjKSAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSAic3N0LWJheXRyYWlsLWlwYy5oIgorI2luY2x1ZGUgInNzdC1kc3AtcHJpdi5oIgorI2luY2x1ZGUgInNzdC1kc3AuaCIKKworI2RlZmluZSBCWVRfUENNX0NPVU5UCQkyCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzc3RfYnl0X3BjbV9oYXJkd2FyZSA9IHsKKwkuaW5mbwkJCT0gU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX1JFU1VNRSwKKwkuZm9ybWF0cwkJPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRSwKKwkucGVyaW9kX2J5dGVzX21pbgk9IDM4NCwKKwkucGVyaW9kX2J5dGVzX21heAk9IDQ4MDAwLAorCS5wZXJpb2RzX21pbgkJPSAyLAorCS5wZXJpb2RzX21heAkJPSAyNTAsCisJLmJ1ZmZlcl9ieXRlc19tYXgJPSA5NjAwMCwKK307CisKKy8qIHByaXZhdGUgZGF0YSBmb3IgZWFjaCBQQ00gRFNQIHN0cmVhbSAqLworc3RydWN0IHNzdF9ieXRfcGNtX2RhdGEgeworCXN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCXN0cnVjdCBtdXRleCBtdXRleDsKK307CisKKy8qIHByaXZhdGUgZGF0YSBmb3IgdGhlIGRyaXZlciAqLworc3RydWN0IHNzdF9ieXRfcHJpdl9kYXRhIHsKKwkvKiBydW50aW1lIERTUCAqLworCXN0cnVjdCBzc3RfYnl0ICpieXQ7CisKKwkvKiBEQUkgZGF0YSAqLworCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhIHBjbVtCWVRfUENNX0NPVU5UXTsKK307CisKKy8qIHRoaXMgbWF5IGdldCBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBieSBvc3MgZW11bGF0aW9uICovCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzc3RfYnl0X3ByaXZfZGF0YSAqcGRhdGEgPQorCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOworCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHJ0ZCk7CisJc3RydWN0IHNzdF9ieXQgKmJ5dCA9IHBkYXRhLT5ieXQ7CisJdTMyIHJhdGUsIGJpdHM7CisJdTggY2hhbm5lbHM7CisJaW50IHJldCwgcGxheWJhY2sgPSAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyk7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiBod19wYXJhbXMsIHBjbV9kYXRhICVwXG4iLCBwY21fZGF0YSk7CisKKwlyZXQgPSBzc3RfYnl0X3N0cmVhbV90eXBlKGJ5dCwgcGNtX2RhdGEtPnN0cmVhbSwKKwkJCQkgIDEsIDEsICFwbGF5YmFjayk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImZhaWxlZCB0byBzZXQgc3RyZWFtIGZvcm1hdCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKwlyZXQgPSBzc3RfYnl0X3N0cmVhbV9zZXRfcmF0ZShieXQsIHBjbV9kYXRhLT5zdHJlYW0sIHJhdGUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJjb3VsZCBub3Qgc2V0IHJhdGUgJWRcbiIsIHJhdGUpOworCQlyZXR1cm4gcmV0OworCX0KKworCWJpdHMgPSBzbmRfcGNtX2Zvcm1hdF93aWR0aChwYXJhbXNfZm9ybWF0KHBhcmFtcykpOworCXJldCA9IHNzdF9ieXRfc3RyZWFtX3NldF9iaXRzKGJ5dCwgcGNtX2RhdGEtPnN0cmVhbSwgYml0cyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImNvdWxkIG5vdCBzZXQgZm9ybWF0cyAlZFxuIiwKKwkJCXBhcmFtc19yYXRlKHBhcmFtcykpOworCQlyZXR1cm4gcmV0OworCX0KKworCWNoYW5uZWxzID0gKHU4KShwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSAmIDB4Rik7CisJcmV0ID0gc3N0X2J5dF9zdHJlYW1fc2V0X2NoYW5uZWxzKGJ5dCwgcGNtX2RhdGEtPnN0cmVhbSwgY2hhbm5lbHMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJjb3VsZCBub3Qgc2V0IGNoYW5uZWxzICVkXG4iLAorCQkJcGFyYW1zX3JhdGUocGFyYW1zKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpKTsKKworCXJldCA9IHNzdF9ieXRfc3RyZWFtX2J1ZmZlcihieXQsIHBjbV9kYXRhLT5zdHJlYW0sCisJCQkJICAgIHN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5hZGRyLAorCQkJCSAgICBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJQQ006IGZhaWxlZCB0byBzZXQgRE1BIGJ1ZmZlciAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzc3RfYnl0X3N0cmVhbV9jb21taXQoYnl0LCBwY21fZGF0YS0+c3RyZWFtKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiUENNOiBmYWlsZWQgc3RyZWFtIGNvbW1pdCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3BjbV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKworCWRldl9kYmcocnRkLT5kZXYsICJQQ006IGh3X2ZyZWVcbiIpOworCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzc3RfYnl0X3ByaXZfZGF0YSAqcGRhdGEgPQorCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOworCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHJ0ZCk7CisJc3RydWN0IHNzdF9ieXQgKmJ5dCA9IHBkYXRhLT5ieXQ7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiB0cmlnZ2VyICVkXG4iLCBjbWQpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlzc3RfYnl0X3N0cmVhbV9zdGFydChieXQsIHBjbV9kYXRhLT5zdHJlYW0pOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCXNzdF9ieXRfc3RyZWFtX3Jlc3VtZShieXQsIHBjbV9kYXRhLT5zdHJlYW0pOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCXNzdF9ieXRfc3RyZWFtX3N0b3AoYnl0LCBwY21fZGF0YS0+c3RyZWFtKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJc3N0X2J5dF9zdHJlYW1fcGF1c2UoYnl0LCBwY21fZGF0YS0+c3RyZWFtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgYnl0X25vdGlmeV9wb2ludGVyKHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhICpwY21fZGF0YSA9IGRhdGE7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBwY21fZGF0YS0+c3Vic3RyZWFtOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXUzMiBwb3M7CisKKwlwb3MgPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwKKwkJCSAgICAgIChydW50aW1lLT5jb250cm9sLT5hcHBsX3B0ciAlCisJCQkgICAgICAgcnVudGltZS0+YnVmZmVyX3NpemUpKTsKKworCWRldl9kYmcocnRkLT5kZXYsICJQQ006IEFwcCBwb2ludGVyICVkIGJ5dGVzXG4iLCBwb3MpOworCisJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzc3RfYnl0X3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzc3RfYnl0X3ByaXZfZGF0YSAqcGRhdGEgPQorCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOworCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHJ0ZCk7CisJc3RydWN0IHNzdF9ieXQgKmJ5dCA9IHBkYXRhLT5ieXQ7CisJc25kX3BjbV91ZnJhbWVzX3Qgb2Zmc2V0OworCWludCBwb3M7CisKKwlwb3MgPSBzc3RfYnl0X2dldF9kc3BfcG9zaXRpb24oYnl0LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJCSAgICAgICBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKSk7CisJb2Zmc2V0ID0gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIHBvcyk7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiBETUEgcG9pbnRlciAlenUgYnl0ZXNcbiIsCisJCWZyYW1lc190b19ieXRlcyhydW50aW1lLCAodTMyKW9mZnNldCkpOworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2J5dF9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNzdF9ieXRfcHJpdl9kYXRhICpwZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7CisJc3RydWN0IHNzdF9ieXRfcGNtX2RhdGEgKnBjbV9kYXRhID0gc25kX3NvY19wY21fZ2V0X2RydmRhdGEocnRkKTsKKwlzdHJ1Y3Qgc3N0X2J5dCAqYnl0ID0gcGRhdGEtPmJ5dDsKKworCWRldl9kYmcocnRkLT5kZXYsICJQQ006IG9wZW5cbiIpOworCisJcGNtX2RhdGEgPSAmcGRhdGEtPnBjbVtydGQtPmNwdV9kYWktPmlkXTsKKwltdXRleF9sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCisJc25kX3NvY19wY21fc2V0X2RydmRhdGEocnRkLCBwY21fZGF0YSk7CisJcGNtX2RhdGEtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKworCXNuZF9zb2Nfc2V0X3J1bnRpbWVfaHdwYXJhbXMoc3Vic3RyZWFtLCAmc3N0X2J5dF9wY21faGFyZHdhcmUpOworCisJcGNtX2RhdGEtPnN0cmVhbSA9IHNzdF9ieXRfc3RyZWFtX25ldyhieXQsIHJ0ZC0+Y3B1X2RhaS0+aWQgKyAxLAorCQkJCQkgICAgICBieXRfbm90aWZ5X3BvaW50ZXIsIHBjbV9kYXRhKTsKKwlpZiAocGNtX2RhdGEtPnN0cmVhbSA9PSBOVUxMKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN0cmVhbVxuIik7CisJCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc3N0X2J5dF9wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKKwlzdHJ1Y3Qgc3N0X2J5dF9wY21fZGF0YSAqcGNtX2RhdGEgPSBzbmRfc29jX3BjbV9nZXRfZHJ2ZGF0YShydGQpOworCXN0cnVjdCBzc3RfYnl0ICpieXQgPSBwZGF0YS0+Ynl0OworCWludCByZXQ7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiBjbG9zZVxuIik7CisKKwltdXRleF9sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCXJldCA9IHNzdF9ieXRfc3RyZWFtX2ZyZWUoYnl0LCBwY21fZGF0YS0+c3RyZWFtKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiRnJlZSBzdHJlYW0gZmFpbFxuIik7CisJCWdvdG8gb3V0OworCX0KKwlwY21fZGF0YS0+c3RyZWFtID0gTlVMTDsKKworb3V0OgorCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCisJZGV2X2RiZyhydGQtPmRldiwgIlBDTTogbW1hcFxuIik7CisJcmV0dXJuIHNuZF9wY21fbGliX2RlZmF1bHRfbW1hcChzdWJzdHJlYW0sIHZtYSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc3N0X2J5dF9wY21fb3BzID0geworCS5vcGVuCQk9IHNzdF9ieXRfcGNtX29wZW4sCisJLmNsb3NlCQk9IHNzdF9ieXRfcGNtX2Nsb3NlLAorCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zCT0gc3N0X2J5dF9wY21faHdfcGFyYW1zLAorCS5od19mcmVlCT0gc3N0X2J5dF9wY21faHdfZnJlZSwKKwkudHJpZ2dlcgk9IHNzdF9ieXRfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIJPSBzc3RfYnl0X3BjbV9wb2ludGVyLAorCS5tbWFwCQk9IHNzdF9ieXRfcGNtX21tYXAsCit9OworCitzdGF0aWMgdm9pZCBzc3RfYnl0X3BjbV9mcmVlKHN0cnVjdCBzbmRfcGNtICpwY20pCit7CisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2J5dF9wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOworCXNpemVfdCBzaXplOworCWludCByZXQgPSAwOworCisJcmV0ID0gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudChydGQtPmNhcmQtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtIHx8CisJICAgIHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbSkgeworCQlzaXplID0gc3N0X2J5dF9wY21faGFyZHdhcmUuYnVmZmVyX2J5dGVzX21heDsKKwkJcmV0ID0gc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sCisJCQkJCQkJICAgIFNORFJWX0RNQV9UWVBFX0RFViwKKwkJCQkJCQkgICAgcnRkLT5jYXJkLT5kZXYsCisJCQkJCQkJICAgIHNpemUsIHNpemUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZG1hIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGJ5dF9kYWlzW10gPSB7CisJeworCQkubmFtZSAgPSAiRnJvbnQtY3B1LWRhaSIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTeXN0ZW0gUGxheWJhY2siLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAorCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQl9LAorCX0sCisJeworCQkubmFtZSAgPSAiTWljMS1jcHUtZGFpIiwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQW5hbG9nIENhcHR1cmUiLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIGludCBzc3RfYnl0X3BjbV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc3RydWN0IHNzdF9wZGF0YSAqcGxhdF9kYXRhID0gZGV2X2dldF9wbGF0ZGF0YShwbGF0Zm9ybS0+ZGV2KTsKKwlzdHJ1Y3Qgc3N0X2J5dF9wcml2X2RhdGEgKnByaXZfZGF0YTsKKwlpbnQgaTsKKworCWlmICghcGxhdF9kYXRhKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByaXZfZGF0YSA9IGRldm1fa3phbGxvYyhwbGF0Zm9ybS0+ZGV2LCBzaXplb2YoKnByaXZfZGF0YSksCisJCQkJIEdGUF9LRVJORUwpOworCXByaXZfZGF0YS0+Ynl0ID0gcGxhdF9kYXRhLT5kc3A7CisJc25kX3NvY19wbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwbGF0Zm9ybSwgcHJpdl9kYXRhKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJ5dF9kYWlzKTsgaSsrKQorCQltdXRleF9pbml0KCZwcml2X2RhdGEtPnBjbVtpXS5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3BjbV9yZW1vdmUoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIGJ5dF9zb2NfcGxhdGZvcm0gPSB7CisJLnByb2JlCQk9IHNzdF9ieXRfcGNtX3Byb2JlLAorCS5yZW1vdmUJCT0gc3N0X2J5dF9wY21fcmVtb3ZlLAorCS5vcHMJCT0gJnNzdF9ieXRfcGNtX29wcywKKwkucGNtX25ldwk9IHNzdF9ieXRfcGNtX25ldywKKwkucGNtX2ZyZWUJPSBzc3RfYnl0X3BjbV9mcmVlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgYnl0X2RhaV9jb21wb25lbnQgPSB7CisJLm5hbWUJCT0gImJ5dC1kYWkiLAorfTsKKworc3RhdGljIGludCBzc3RfYnl0X3BjbV9kZXZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3N0X3BkYXRhICpzc3RfcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBzc3RfYnl0X2RzcF9pbml0KCZwZGV2LT5kZXYsIHNzdF9wZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LCAmYnl0X3NvY19wbGF0Zm9ybSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3BsYXQ7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LCAmYnl0X2RhaV9jb21wb25lbnQsCisJCQkJCSBieXRfZGFpcywgQVJSQVlfU0laRShieXRfZGFpcykpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9jb21wOworCisJcmV0dXJuIDA7CisKK2Vycl9jb21wOgorCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKK2Vycl9wbGF0OgorCXNzdF9ieXRfZHNwX2ZyZWUoJnBkZXYtPmRldiwgc3N0X3BkYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX2Rldl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3N0X3BkYXRhICpzc3RfcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCisJc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYpOworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldik7CisJc3N0X2J5dF9kc3BfZnJlZSgmcGRldi0+ZGV2LCBzc3RfcGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNzdF9ieXRfcGNtX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJiYXl0cmFpbC1wY20tYXVkaW8iLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCisJLnByb2JlID0gc3N0X2J5dF9wY21fZGV2X3Byb2JlLAorCS5yZW1vdmUgPSBzc3RfYnl0X3BjbV9kZXZfcmVtb3ZlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3N0X2J5dF9wY21fZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSmFya2tvIE5pa3VsYSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCYXl0cmFpbCBQQ00iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YmF5dHJhaWwtcGNtLWF1ZGlvIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWRzcC1wcml2LmggYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWRzcC1wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4ZTgxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWRzcC1wcml2LmgKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBJbnRlbCBTbWFydCBTb3VuZCBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX19TT1VORF9TT0NfU1NUX0RTUF9QUklWX0gKKyNkZWZpbmUgX19TT1VORF9TT0NfU1NUX0RTUF9QUklWX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKworc3RydWN0IHNzdF9tZW1fYmxvY2s7CitzdHJ1Y3Qgc3N0X21vZHVsZTsKK3N0cnVjdCBzc3RfZnc7CisKKy8qCisgKiBEU1AgT3BlcmF0aW9ucyBleHBvcnRlZCBieSBwbGF0Zm9ybSBBdWRpbyBEU1AgZHJpdmVyLgorICovCitzdHJ1Y3Qgc3N0X29wcyB7CisJLyogRFNQIGNvcmUgYm9vdCAvIHJlc2V0ICovCisJdm9pZCAoKmJvb3QpKHN0cnVjdCBzc3RfZHNwICopOworCXZvaWQgKCpyZXNldCkoc3RydWN0IHNzdF9kc3AgKik7CisKKwkvKiBTaGltIElPICovCisJdm9pZCAoKndyaXRlKSh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSk7CisJdTMyICgqcmVhZCkodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0KTsKKwl2b2lkICgqd3JpdGU2NCkodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpOworCXU2NCAoKnJlYWQ2NCkodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0KTsKKworCS8qIERTUCBJL0RSQU0gSU8gKi8KKwl2b2lkICgqcmFtX3JlYWQpKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgICpkZXN0LCB2b2lkIF9faW9tZW0gKnNyYywKKwkJc2l6ZV90IGJ5dGVzKTsKKwl2b2lkICgqcmFtX3dyaXRlKShzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB2b2lkIF9faW9tZW0gKmRlc3QsIHZvaWQgKnNyYywKKwkJc2l6ZV90IGJ5dGVzKTsKKworCXZvaWQgKCpkdW1wKShzdHJ1Y3Qgc3N0X2RzcCAqKTsKKworCS8qIElSUSBoYW5kbGVycyAqLworCWlycXJldHVybl90ICgqaXJxX2hhbmRsZXIpKGludCBpcnEsIHZvaWQgKmNvbnRleHQpOworCisJLyogU1NUIGluaXQgYW5kIGZyZWUgKi8KKwlpbnQgKCppbml0KShzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCBzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSk7CisJdm9pZCAoKmZyZWUpKHN0cnVjdCBzc3RfZHNwICpzc3QpOworCisJLyogRlcgbW9kdWxlIHBhcnNlci9sb2FkZXIgKi8KKwlpbnQgKCpwYXJzZV9mdykoc3RydWN0IHNzdF9mdyAqc3N0X2Z3KTsKK307CisKKy8qCisgKiBBdWRpbyBEU1AgbWVtb3J5IG9mZnNldHMgYW5kIGFkZHJlc3Nlcy4KKyAqLworc3RydWN0IHNzdF9hZGRyIHsKKwl1MzIgbHBlX2Jhc2U7CisJdTMyIHNoaW1fb2Zmc2V0OworCXUzMiBpcmFtX29mZnNldDsKKwl1MzIgZHJhbV9vZmZzZXQ7CisJdm9pZCBfX2lvbWVtICpscGU7CisJdm9pZCBfX2lvbWVtICpzaGltOworCXZvaWQgX19pb21lbSAqcGNpX2NmZzsKKwl2b2lkIF9faW9tZW0gKmZ3X2V4dDsKK307CisKKy8qCisgKiBBdWRpbyBEU1AgTWFpbGJveCBjb25maWd1cmF0aW9uLgorICovCitzdHJ1Y3Qgc3N0X21haWxib3ggeworCXZvaWQgX19pb21lbSAqaW5fYmFzZTsKKwl2b2lkIF9faW9tZW0gKm91dF9iYXNlOworCXNpemVfdCBpbl9zaXplOworCXNpemVfdCBvdXRfc2l6ZTsKK307CisKKy8qCisgKiBBdWRpbyBEU1AgRmlybXdhcmUgZGF0YSB0eXBlcy4KKyAqLworZW51bSBzc3RfZGF0YV90eXBlIHsKKwlTU1RfREFUQV9NCT0gMCwgLyogbW9kdWxlIGJsb2NrIGRhdGEgKi8KKwlTU1RfREFUQV9QCT0gMSwgLyogcGVyaXN0YW50IGRhdGEgKHRleHQsIGRhdGEpICovCisJU1NUX0RBVEFfUwk9IDIsIC8qIHNjcmF0Y2ggZGF0YSAodXN1YWxseSBidWZmZXJzKSAqLworfTsKKworLyoKKyAqIEF1ZGlvIERTUCBtZW1vcnkgYmxvY2sgdHlwZXMuCisgKi8KK2VudW0gc3N0X21lbV90eXBlIHsKKwlTU1RfTUVNX0lSQU0gPSAwLAorCVNTVF9NRU1fRFJBTSA9IDEsCisJU1NUX01FTV9BTlkgID0gMiwKKwlTU1RfTUVNX0NBQ0hFPSAzLAorfTsKKworLyoKKyAqIEF1ZGlvIERTUCBHZW5lcmljIEZpcm13YXJlIEZpbGUuCisgKgorICogU1NUIEZpcm13YXJlIGZpbGVzIGNhbiBjb25zaXN0IG9mIDEuLk4gbW9kdWxlcy4gVGhpcyBnZW5lcmljIHN0cnVjdHVyZSBpcworICogdXNlZCB0byBtYW5hZ2UgZWFjaCBmaXJtd2FyZSBmaWxlIGFuZCBpdCdzIG1vZHVsZXMgcmVnYXJkbGVzcyBvZiBTU1QgZmlybXdhcmUKKyAqIHR5cGUuIEEgU1NUIGRyaXZlciBtYXkgbG9hZCBtdWx0aXBsZSBGVyBmaWxlcy4KKyAqLworc3RydWN0IHNzdF9mdyB7CisJc3RydWN0IHNzdF9kc3AgKmRzcDsKKworCS8qIGJhc2UgYWRkcmVzc2VzIG9mIEZXIGZpbGUgZGF0YSAqLworCWRtYV9hZGRyX3QgZG1hYmxlX2Z3X3BhZGRyOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIGZ3IGRhdGEgKi8KKwl2b2lkICpkbWFfYnVmOwkJCS8qIHZpcnR1YWwgYWRkcmVzcyBvZiBmdyBkYXRhICovCisJdTMyIHNpemU7CQkJLyogc2l6ZSBvZiBmdyBkYXRhICovCisKKwkvKiBsaXN0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qIERTUCBsaXN0IG9mIEZXICovCisJc3RydWN0IGxpc3RfaGVhZCBtb2R1bGVfbGlzdDsJLyogRlcgbGlzdCBvZiBtb2R1bGVzICovCisKKwl2b2lkICpwcml2YXRlOwkJCS8qIGNvcmUgZG9lc24ndCB0b3VjaCB0aGlzICovCit9OworCisvKgorICogQXVkaW8gRFNQIEdlbmVyaWMgTW9kdWxlIGRhdGEuCisgKgorICogVGhpcyBpcyB1c2VkIHRvIGRzZWNyaWJlIGFueSBzZWN0aW9ucyBvZiBwZXJzaXN0ZW50ICh0ZXh0IGFuZCBkYXRhKSBhbmQKKyAqIHNjcmF0Y2ggKGJ1ZmZlcnMpIG9mIG1vZHVsZSBkYXRhIGluIEFEU1AgbWVtb3J5IHNwYWNlLgorICovCitzdHJ1Y3Qgc3N0X21vZHVsZV9kYXRhIHsKKworCWVudW0gc3N0X21lbV90eXBlIHR5cGU7CQkvKiBkZXN0aW5hdGlvbiBtZW1vcnkgdHlwZSAqLworCWVudW0gc3N0X2RhdGFfdHlwZSBkYXRhX3R5cGU7CS8qIHR5cGUgb2YgbW9kdWxlIGRhdGEgKi8KKworCXUzMiBzaXplOwkJLyogc2l6ZSBpbiBieXRlcyAqLworCXUzMiBvZmZzZXQ7CQkvKiBvZmZzZXQgaW4gRlcgZmlsZSAqLworCXUzMiBkYXRhX29mZnNldDsJLyogb2Zmc2V0IGluIEFEU1AgbWVtb3J5IHNwYWNlICovCisJdm9pZCAqZGF0YTsJCS8qIG1vZHVsZSBkYXRhICovCit9OworCisvKgorICogQXVkaW8gRFNQIEdlbmVyaWMgTW9kdWxlIFRlbXBsYXRlLgorICoKKyAqIFVzZWQgdG8gZGVmaW5lIGFuZCByZWdpc3RlciBhIG5ldyBGVyBtb2R1bGUuIFRoaXMgZGF0YSBpcyBleHRyYWN0ZWQgZnJvbQorICogRlcgbW9kdWxlIGhlYWRlciBpbmZvcm1hdGlvbi4KKyAqLworc3RydWN0IHNzdF9tb2R1bGVfdGVtcGxhdGUgeworCXUzMiBpZDsKKwl1MzIgZW50cnk7CQkJLyogZW50cnkgcG9pbnQgKi8KKwlzdHJ1Y3Qgc3N0X21vZHVsZV9kYXRhIHM7CS8qIHNjcmF0Y2ggZGF0YSAqLworCXN0cnVjdCBzc3RfbW9kdWxlX2RhdGEgcDsJLyogcGVyaXN0YW50IGRhdGEgKi8KK307CisKKy8qCisgKiBBdWRpbyBEU1AgR2VuZXJpYyBNb2R1bGUuCisgKgorICogRWFjaCBGaXJtd2FyZSBmaWxlIGNhbiBjb25zaXN0IG9mIDEuLk4gbW9kdWxlcy4gQSBtb2R1bGUgY2FuIHNwYW4gbXVsdGlwbGUKKyAqIEFEU1AgbWVtb3J5IGJsb2Nrcy4gVGhlIHNpbXBsZXN0IEZXIHdpbGwgYmUgYSBmaWxlIHdpdGggMSBtb2R1bGUuCisgKi8KK3N0cnVjdCBzc3RfbW9kdWxlIHsKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwOworCXN0cnVjdCBzc3RfZncgKnNzdF9mdzsJCS8qIHBhcmVudCBGVyB3ZSBiZWxvbmcgdG9vICovCisKKwkvKiBtb2R1bGUgY29uZmlndXJhdGlvbiAqLworCXUzMiBpZDsKKwl1MzIgZW50cnk7CQkJLyogbW9kdWxlIGVudHJ5IHBvaW50ICovCisJdTMyIG9mZnNldDsJCQkvKiBtb2R1bGUgb2Zmc2V0IGluIGZpcm13YXJlIGZpbGUgKi8KKwl1MzIgc2l6ZTsJCQkvKiBtb2R1bGUgc2l6ZSAqLworCXN0cnVjdCBzc3RfbW9kdWxlX2RhdGEgczsJLyogc2NyYXRjaCBkYXRhICovCisJc3RydWN0IHNzdF9tb2R1bGVfZGF0YSBwOwkvKiBwZXJpc3RhbnQgZGF0YSAqLworCisJLyogcnVudGltZSAqLworCXUzMiB1c2FnZV9jb3VudDsJCS8qIGNhbiBiZSB1bmxvYWRlZCBpZiBjb3VudCA9PSAwICovCisJdm9pZCAqcHJpdmF0ZTsJCQkvKiBjb3JlIGRvZXNuJ3QgdG91Y2ggdGhpcyAqLworCisJLyogbGlzdHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGJsb2NrX2xpc3Q7CS8qIE1vZHVsZSBsaXN0IG9mIGJsb2NrcyBpbiB1c2UgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBEU1AgbGlzdCBvZiBtb2R1bGVzICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X2Z3OwkvKiBGVyBsaXN0IG9mIG1vZHVsZXMgKi8KK307CisKKy8qCisgKiBTU1QgTWVtb3J5IEJsb2NrIG9wZXJhdGlvbnMuCisgKi8KK3N0cnVjdCBzc3RfYmxvY2tfb3BzIHsKKwlpbnQgKCplbmFibGUpKHN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jayk7CisJaW50ICgqZGlzYWJsZSkoc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrKTsKK307CisKKy8qCisgKiBTU1QgR2VuZXJpYyBNZW1vcnkgQmxvY2suCisgKgorICogU1NUIEFEUCAgbWVtb3J5IGhhcyBtdWx0aXBsZSBJUkFNIGFuZCBEUkFNIGJsb2Nrcy4gU29tZSBBRFNQIGJsb2NrcyBjYW4gYmUKKyAqIHBvd2VyIGdhdGVkLgorICovCitzdHJ1Y3Qgc3N0X21lbV9ibG9jayB7CisJc3RydWN0IHNzdF9kc3AgKmRzcDsKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlOwkvKiBtb2R1bGUgdGhhdCB1c2VzIHRoaXMgYmxvY2sgKi8KKworCS8qIGJsb2NrIGNvbmZpZyAqLworCXUzMiBvZmZzZXQ7CQkJLyogb2Zmc2V0IGZyb20gYmFzZSAqLworCXUzMiBzaXplOwkJCS8qIGJsb2NrIHNpemUgKi8KKwl1MzIgaW5kZXg7CQkJLyogYmxvY2sgaW5kZXggMC4uTiAqLworCWVudW0gc3N0X21lbV90eXBlIHR5cGU7CQkvKiBibG9jayBtZW1vcnkgdHlwZSBJUkFNL0RSQU0gKi8KKwlzdHJ1Y3Qgc3N0X2Jsb2NrX29wcyAqb3BzOwkvKiBibG9jayBvcGVyYXRpb25zLCBpZiBhbnkgKi8KKworCS8qIGJsb2NrIHN0YXR1cyAqLworCWVudW0gc3N0X2RhdGFfdHlwZSBkYXRhX3R5cGU7CS8qIGRhdGEgdHlwZSBoZWxkIGluIHRoaXMgYmxvY2sgKi8KKwl1MzIgYnl0ZXNfdXNlZDsJCQkvKiBieXRlcyBpbiB1c2UgYnkgbW9kdWxlcyAqLworCXZvaWQgKnByaXZhdGU7CQkJLyogZ2VuZXJpYyBjb3JlIGRvZXMgbm90IHRvdWNoIHRoaXMgKi8KKwlpbnQgdXNlcnM7CQkJLyogbnVtYmVyIG9mIG1vZHVsZXMgdXNpbmcgdGhpcyBibG9jayAqLworCisJLyogYmxvY2sgbGlzdHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG1vZHVsZV9saXN0OwkvKiBNb2R1bGUgbGlzdCBvZiBibG9ja3MgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBNYXAgbGlzdCBvZiBmcmVlL3VzZWQgYmxvY2tzICovCit9OworCisvKgorICogR2VuZXJpYyBTU1QgU2hpbSBJbnRlcmZhY2UuCisgKi8KK3N0cnVjdCBzc3RfZHNwIHsKKworCS8qIHJ1bnRpbWUgKi8KKwlzdHJ1Y3Qgc3N0X2RzcF9kZXZpY2UgKnNzdF9kZXY7CisJc3BpbmxvY2tfdCBzcGlubG9jazsJLyogSVBDIGxvY2tpbmcgKi8KKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CS8qIERTUCBGVyBsb2NrICovCisJc3RydWN0IGRldmljZSAqZGV2OworCXZvaWQgKnRocmVhZF9jb250ZXh0OworCWludCBpcnE7CisJdTMyIGlkOworCisJLyogbGlzdCBvZiBmcmVlIGFuZCB1c2VkIEFEU1AgbWVtb3J5IGJsb2NrcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgdXNlZF9ibG9ja19saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9ibG9ja19saXN0OworCisJLyogb3BlcmF0aW9ucyAqLworCXN0cnVjdCBzc3Rfb3BzICpvcHM7CisKKwkvKiBkZWJ1ZyBGUyAqLworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcm9vdDsKKworCS8qIGJhc2UgYWRkcmVzc2VzICovCisJc3RydWN0IHNzdF9hZGRyIGFkZHI7CisKKwkvKiBtYWlsYm94ICovCisJc3RydWN0IHNzdF9tYWlsYm94IG1haWxib3g7CisKKwkvKiBTU1QgRlcgZmlsZXMgbG9hZGVkIGFuZCB0aGVpciBtb2R1bGVzICovCisJc3RydWN0IGxpc3RfaGVhZCBtb2R1bGVfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZ3X2xpc3Q7CisKKwkvKiBwbGF0Zm9ybSBkYXRhICovCisJc3RydWN0IHNzdF9wZGF0YSAqcGRhdGE7CisKKwkvKiBETUEgRlcgbG9hZGluZyAqLworCXN0cnVjdCBzc3RfZG1hICpkbWE7CisJYm9vbCBmd191c2VfZG1hOworfTsKKworLyogU2l6ZSBvcHRpbWlzZWQgRFJBTS9JUkFNIG1lbWNweSAqLworc3RhdGljIGlubGluZSB2b2lkIHNzdF9kc3Bfd3JpdGUoc3RydWN0IHNzdF9kc3AgKnNzdCwgdm9pZCAqc3JjLAorCXUzMiBkZXN0X29mZnNldCwgc2l6ZV90IGJ5dGVzKQoreworCXNzdC0+b3BzLT5yYW1fd3JpdGUoc3N0LCBzc3QtPmFkZHIubHBlICsgZGVzdF9vZmZzZXQsIHNyYywgYnl0ZXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3N0X2RzcF9yZWFkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgKmRlc3QsCisJdTMyIHNyY19vZmZzZXQsIHNpemVfdCBieXRlcykKK3sKKwlzc3QtPm9wcy0+cmFtX3JlYWQoc3N0LCBkZXN0LCBzc3QtPmFkZHIubHBlICsgc3JjX29mZnNldCwgYnl0ZXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnNzdF9kc3BfZ2V0X3RocmVhZF9jb250ZXh0KHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJcmV0dXJuIHNzdC0+dGhyZWFkX2NvbnRleHQ7Cit9CisKKy8qIENyZWF0ZS9GcmVlIEZXIGZpbGVzIC0gY2FuIGNvbnRhaW4gbXVsdGlwbGUgbW9kdWxlcyAqLworc3RydWN0IHNzdF9mdyAqc3N0X2Z3X25ldyhzdHJ1Y3Qgc3N0X2RzcCAqZHNwLAorCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKnByaXZhdGUpOwordm9pZCBzc3RfZndfZnJlZShzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncpOwordm9pZCBzc3RfZndfZnJlZV9hbGwoc3RydWN0IHNzdF9kc3AgKmRzcCk7CisKKy8qIENyZWF0ZS9GcmVlIGZpcm13YXJlIG1vZHVsZXMgKi8KK3N0cnVjdCBzc3RfbW9kdWxlICpzc3RfbW9kdWxlX25ldyhzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncsCisJc3RydWN0IHNzdF9tb2R1bGVfdGVtcGxhdGUgKnRlbXBsYXRlLCB2b2lkICpwcml2YXRlKTsKK3ZvaWQgc3N0X21vZHVsZV9mcmVlKHN0cnVjdCBzc3RfbW9kdWxlICpzc3RfbW9kdWxlKTsKK2ludCBzc3RfbW9kdWxlX2luc2VydChzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZSk7CitpbnQgc3N0X21vZHVsZV9yZW1vdmUoc3RydWN0IHNzdF9tb2R1bGUgKnNzdF9tb2R1bGUpOworaW50IHNzdF9tb2R1bGVfaW5zZXJ0X2ZpeGVkX2Jsb2NrKHN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUsCisJc3RydWN0IHNzdF9tb2R1bGVfZGF0YSAqZGF0YSk7CitzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZV9nZXRfZnJvbV9pZChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCB1MzIgaWQpOworCisvKiBhbGxvY2F0ZS9mcmVlIHBlc2lzdGVudC9zY3JhdGNoIG1lbW9yeSByZWdpb25zIG1hbmFnZWQgYnkgZHJ2ICovCitzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21lbV9ibG9ja19hbGxvY19zY3JhdGNoKHN0cnVjdCBzc3RfZHNwICpkc3ApOwordm9pZCBzc3RfbWVtX2Jsb2NrX2ZyZWVfc2NyYXRjaChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLAorCXN0cnVjdCBzc3RfbW9kdWxlICpzY3JhdGNoKTsKK2ludCBzc3RfYmxvY2tfbW9kdWxlX3JlbW92ZShzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlKTsKKworLyogUmVnaXN0ZXIgdGhlIERTUHMgbWVtb3J5IGJsb2NrcyAtIHdvdWxkIGJlIG5pY2UgdG8gcmVhZCBmcm9tIEFDUEkgKi8KK3N0cnVjdCBzc3RfbWVtX2Jsb2NrICpzc3RfbWVtX2Jsb2NrX3JlZ2lzdGVyKHN0cnVjdCBzc3RfZHNwICpkc3AsIHUzMiBvZmZzZXQsCisJdTMyIHNpemUsIGVudW0gc3N0X21lbV90eXBlIHR5cGUsIHN0cnVjdCBzc3RfYmxvY2tfb3BzICpvcHMsIHUzMiBpbmRleCwKKwl2b2lkICpwcml2YXRlKTsKK3ZvaWQgc3N0X21lbV9ibG9ja191bnJlZ2lzdGVyX2FsbChzdHJ1Y3Qgc3N0X2RzcCAqZHNwKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWRzcC5jIGIvc291bmQvc29jL2ludGVsL3NzdC1kc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzEyOWZkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1kc3AuYwpAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqIEludGVsIFNtYXJ0IFNvdW5kIFRlY2hub2xvZ3kgKFNTVCkgRFNQIENvcmUgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgInNzdC1kc3AuaCIKKyNpbmNsdWRlICJzc3QtZHNwLXByaXYuaCIKKworI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2ludGVsLXNzdC5oPgorCisvKiBJbnRlcm5hbCBnZW5lcmljIGxvdy1sZXZlbCBTU1QgSU8gZnVuY3Rpb25zIC0gY2FuIGJlIG92ZXJpZGRlbiAqLwordm9pZCBzc3Rfc2hpbTMyX3dyaXRlKHZvaWQgX19pb21lbSAqYWRkciwgdTMyIG9mZnNldCwgdTMyIHZhbHVlKQoreworCXdyaXRlbCh2YWx1ZSwgYWRkciArIG9mZnNldCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3Rfc2hpbTMyX3dyaXRlKTsKKwordTMyIHNzdF9zaGltMzJfcmVhZCh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQpCit7CisJcmV0dXJuIHJlYWRsKGFkZHIgKyBvZmZzZXQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X3NoaW0zMl9yZWFkKTsKKwordm9pZCBzc3Rfc2hpbTMyX3dyaXRlNjQodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpCit7CisJbWVtY3B5X3RvaW8oYWRkciArIG9mZnNldCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9zaGltMzJfd3JpdGU2NCk7CisKK3U2NCBzc3Rfc2hpbTMyX3JlYWQ2NCh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQpCit7CisJdTY0IHZhbDsKKworCW1lbWNweV9mcm9taW8oJnZhbCwgYWRkciArIG9mZnNldCwgc2l6ZW9mKHZhbCkpOworCXJldHVybiB2YWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3Rfc2hpbTMyX3JlYWQ2NCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfc3N0X21lbWNweV90b2lvXzMyKHZvbGF0aWxlIHUzMiBfX2lvbWVtICpkZXN0LAorCXUzMiAqc3JjLCBzaXplX3QgYnl0ZXMpCit7CisJaW50IGksIHdvcmRzID0gYnl0ZXMgPj4gMjsKKworCWZvciAoaSA9IDA7IGkgPCB3b3JkczsgaSsrKQorCQl3cml0ZWwoc3JjW2ldLCBkZXN0ICsgaSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfc3N0X21lbWNweV9mcm9taW9fMzIodTMyICpkZXN0LAorCWNvbnN0IHZvbGF0aWxlIF9faW9tZW0gdTMyICpzcmMsIHNpemVfdCBieXRlcykKK3sKKwlpbnQgaSwgd29yZHMgPSBieXRlcyA+PiAyOworCisJZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspCisJCWRlc3RbaV0gPSByZWFkbChzcmMgKyBpKTsKK30KKwordm9pZCBzc3RfbWVtY3B5X3RvaW9fMzIoc3RydWN0IHNzdF9kc3AgKnNzdCwKKwl2b2lkIF9faW9tZW0gKmRlc3QsIHZvaWQgKnNyYywgc2l6ZV90IGJ5dGVzKQoreworCV9zc3RfbWVtY3B5X3RvaW9fMzIoZGVzdCwgc3JjLCBieXRlcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbWVtY3B5X3RvaW9fMzIpOworCit2b2lkIHNzdF9tZW1jcHlfZnJvbWlvXzMyKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgKmRlc3QsCisJdm9pZCBfX2lvbWVtICpzcmMsIHNpemVfdCBieXRlcykKK3sKKwlfc3N0X21lbWNweV9mcm9taW9fMzIoZGVzdCwgc3JjLCBieXRlcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbWVtY3B5X2Zyb21pb18zMik7CisKKy8qIFB1YmxpYyBBUEkgKi8KK3ZvaWQgc3N0X2RzcF9zaGltX3dyaXRlKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKKwlzc3QtPm9wcy0+d3JpdGUoc3N0LT5hZGRyLnNoaW0sIG9mZnNldCwgdmFsdWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV93cml0ZSk7CisKK3UzMiBzc3RfZHNwX3NoaW1fcmVhZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisJdmFsID0gc3N0LT5vcHMtPnJlYWQoc3N0LT5hZGRyLnNoaW0sIG9mZnNldCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHZhbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV9yZWFkKTsKKwordm9pZCBzc3RfZHNwX3NoaW1fd3JpdGU2NChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisJc3N0LT5vcHMtPndyaXRlNjQoc3N0LT5hZGRyLnNoaW0sIG9mZnNldCwgdmFsdWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV93cml0ZTY0KTsKKwordTY0IHNzdF9kc3Bfc2hpbV9yZWFkNjQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU2NCB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCXZhbCA9IHNzdC0+b3BzLT5yZWFkNjQoc3N0LT5hZGRyLnNoaW0sIG9mZnNldCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHZhbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV9yZWFkNjQpOworCit2b2lkIHNzdF9kc3Bfc2hpbV93cml0ZV91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpCit7CisJc3N0LT5vcHMtPndyaXRlKHNzdC0+YWRkci5zaGltLCBvZmZzZXQsIHZhbHVlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV93cml0ZV91bmxvY2tlZCk7CisKK3UzMiBzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0KQoreworCXJldHVybiBzc3QtPm9wcy0+cmVhZChzc3QtPmFkZHIuc2hpbSwgb2Zmc2V0KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKTsKKwordm9pZCBzc3RfZHNwX3NoaW1fd3JpdGU2NF91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpCit7CisJc3N0LT5vcHMtPndyaXRlNjQoc3N0LT5hZGRyLnNoaW0sIG9mZnNldCwgdmFsdWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9zaGltX3dyaXRlNjRfdW5sb2NrZWQpOworCit1NjQgc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0KQoreworCXJldHVybiBzc3QtPm9wcy0+cmVhZDY0KHNzdC0+YWRkci5zaGltLCBvZmZzZXQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZCk7CisKK2ludCBzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCwKKwkJCQl1MzIgbWFzaywgdTMyIHZhbHVlKQoreworCWJvb2wgY2hhbmdlOworCXVuc2lnbmVkIGludCBvbGQsIG5ldzsKKwl1MzIgcmV0OworCisJcmV0ID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBvZmZzZXQpOworCisJb2xkID0gcmV0OworCW5ldyA9IChvbGQgJiAofm1hc2spKSB8ICh2YWx1ZSAmIG1hc2spOworCisJY2hhbmdlID0gKG9sZCAhPSBuZXcpOworCWlmIChjaGFuZ2UpCisJCXNzdF9kc3Bfc2hpbV93cml0ZV91bmxvY2tlZChzc3QsIG9mZnNldCwgbmV3KTsKKworCXJldHVybiBjaGFuZ2U7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQpOworCitpbnQgc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjRfdW5sb2NrZWQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCwKKwkJCQl1NjQgbWFzaywgdTY0IHZhbHVlKQoreworCWJvb2wgY2hhbmdlOworCXU2NCBvbGQsIG5ldzsKKworCW9sZCA9IHNzdF9kc3Bfc2hpbV9yZWFkNjRfdW5sb2NrZWQoc3N0LCBvZmZzZXQpOworCisJbmV3ID0gKG9sZCAmICh+bWFzaykpIHwgKHZhbHVlICYgbWFzayk7CisKKwljaGFuZ2UgPSAob2xkICE9IG5ldyk7CisJaWYgKGNoYW5nZSkKKwkJc3N0X2RzcF9zaGltX3dyaXRlNjRfdW5sb2NrZWQoc3N0LCBvZmZzZXQsIG5ldyk7CisKKwlyZXR1cm4gY2hhbmdlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjRfdW5sb2NrZWQpOworCitpbnQgc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQsCisJCQkJdTMyIG1hc2ssIHUzMiB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgY2hhbmdlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKKwljaGFuZ2UgPSBzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBvZmZzZXQsIG1hc2ssIHZhbHVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGNoYW5nZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV91cGRhdGVfYml0cyk7CisKK2ludCBzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LAorCQkJCXU2NCBtYXNrLCB1NjQgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIGNoYW5nZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisJY2hhbmdlID0gc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjRfdW5sb2NrZWQoc3N0LCBvZmZzZXQsIG1hc2ssIHZhbHVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGNoYW5nZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV91cGRhdGVfYml0czY0KTsKKwordm9pZCBzc3RfZHNwX2R1bXAoc3RydWN0IHNzdF9kc3AgKnNzdCkKK3sKKwlzc3QtPm9wcy0+ZHVtcChzc3QpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9kdW1wKTsKKwordm9pZCBzc3RfZHNwX3Jlc2V0KHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJc3N0LT5vcHMtPnJlc2V0KHNzdCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZHNwX3Jlc2V0KTsKKworaW50IHNzdF9kc3BfYm9vdChzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQoreworCXNzdC0+b3BzLT5ib290KHNzdCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZHNwX2Jvb3QpOworCit2b2lkIHNzdF9kc3BfaXBjX21zZ190eChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCB1MzIgbXNnKQoreworCXNzdF9kc3Bfc2hpbV93cml0ZV91bmxvY2tlZChkc3AsIFNTVF9JUENYLCBtc2cgfCBTU1RfSVBDWF9CVVNZKTsKKwl0cmFjZV9zc3RfaXBjX21zZ190eChtc2cpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9pcGNfbXNnX3R4KTsKKwordTMyIHNzdF9kc3BfaXBjX21zZ19yeChzdHJ1Y3Qgc3N0X2RzcCAqZHNwKQoreworCXUzMiBtc2c7CisKKwltc2cgPSBzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChkc3AsIFNTVF9JUENYKTsKKwl0cmFjZV9zc3RfaXBjX21zZ19yeChtc2cpOworCisJcmV0dXJuIG1zZzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3BfaXBjX21zZ19yeCk7CisKK2ludCBzc3RfZHNwX21haWxib3hfaW5pdChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgaW5ib3hfb2Zmc2V0LCBzaXplX3QgaW5ib3hfc2l6ZSwKKwl1MzIgb3V0Ym94X29mZnNldCwgc2l6ZV90IG91dGJveF9zaXplKQoreworCXNzdC0+bWFpbGJveC5pbl9iYXNlID0gc3N0LT5hZGRyLmxwZSArIGluYm94X29mZnNldDsKKwlzc3QtPm1haWxib3gub3V0X2Jhc2UgPSBzc3QtPmFkZHIubHBlICsgb3V0Ym94X29mZnNldDsKKwlzc3QtPm1haWxib3guaW5fc2l6ZSA9IGluYm94X3NpemU7CisJc3N0LT5tYWlsYm94Lm91dF9zaXplID0gb3V0Ym94X3NpemU7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZHNwX21haWxib3hfaW5pdCk7CisKK3ZvaWQgc3N0X2RzcF9vdXRib3hfd3JpdGUoc3RydWN0IHNzdF9kc3AgKnNzdCwgdm9pZCAqbWVzc2FnZSwgc2l6ZV90IGJ5dGVzKQoreworCXUzMiBpOworCisJdHJhY2Vfc3N0X2lwY19vdXRib3hfd3JpdGUoYnl0ZXMpOworCisJbWVtY3B5X3RvaW8oc3N0LT5tYWlsYm94Lm91dF9iYXNlLCBtZXNzYWdlLCBieXRlcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkgKz0gNCkKKwkJdHJhY2Vfc3N0X2lwY19vdXRib3hfd2RhdGEoaSwgKih1MzIgKikobWVzc2FnZSArIGkpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfb3V0Ym94X3dyaXRlKTsKKwordm9pZCBzc3RfZHNwX291dGJveF9yZWFkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBieXRlcykKK3sKKwl1MzIgaTsKKworCXRyYWNlX3NzdF9pcGNfb3V0Ym94X3JlYWQoYnl0ZXMpOworCisJbWVtY3B5X2Zyb21pbyhtZXNzYWdlLCBzc3QtPm1haWxib3gub3V0X2Jhc2UsIGJ5dGVzKTsKKworCWZvciAoaSA9IDA7IGkgPCBieXRlczsgaSArPSA0KQorCQl0cmFjZV9zc3RfaXBjX291dGJveF9yZGF0YShpLCAqKHUzMiAqKShtZXNzYWdlICsgaSkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9vdXRib3hfcmVhZCk7CisKK3ZvaWQgc3N0X2RzcF9pbmJveF93cml0ZShzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB2b2lkICptZXNzYWdlLCBzaXplX3QgYnl0ZXMpCit7CisJdTMyIGk7CisKKwl0cmFjZV9zc3RfaXBjX2luYm94X3dyaXRlKGJ5dGVzKTsKKworCW1lbWNweV90b2lvKHNzdC0+bWFpbGJveC5pbl9iYXNlLCBtZXNzYWdlLCBieXRlcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkgKz0gNCkKKwkJdHJhY2Vfc3N0X2lwY19pbmJveF93ZGF0YShpLCAqKHUzMiAqKShtZXNzYWdlICsgaSkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9pbmJveF93cml0ZSk7CisKK3ZvaWQgc3N0X2RzcF9pbmJveF9yZWFkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBieXRlcykKK3sKKwl1MzIgaTsKKworCXRyYWNlX3NzdF9pcGNfaW5ib3hfcmVhZChieXRlcyk7CisKKwltZW1jcHlfZnJvbWlvKG1lc3NhZ2UsIHNzdC0+bWFpbGJveC5pbl9iYXNlLCBieXRlcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkgKz0gNCkKKwkJdHJhY2Vfc3N0X2lwY19pbmJveF9yZGF0YShpLCAqKHUzMiAqKShtZXNzYWdlICsgaSkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9pbmJveF9yZWFkKTsKKworc3RydWN0IHNzdF9kc3AgKnNzdF9kc3BfbmV3KHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3Qgc3N0X2RzcF9kZXZpY2UgKnNzdF9kZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQoreworCXN0cnVjdCBzc3RfZHNwICpzc3Q7CisJaW50IGVycjsKKworCWRldl9kYmcoZGV2LCAiaW5pdGlhbGlzaW5nIGF1ZGlvIERTUCBpZCAweCV4XG4iLCBwZGF0YS0+aWQpOworCisJc3N0ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3N0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrX2luaXQoJnNzdC0+c3BpbmxvY2spOworCW11dGV4X2luaXQoJnNzdC0+bXV0ZXgpOworCXNzdC0+ZGV2ID0gZGV2OworCXNzdC0+dGhyZWFkX2NvbnRleHQgPSBzc3RfZGV2LT50aHJlYWRfY29udGV4dDsKKwlzc3QtPnNzdF9kZXYgPSBzc3RfZGV2OworCXNzdC0+aWQgPSBwZGF0YS0+aWQ7CisJc3N0LT5pcnEgPSBwZGF0YS0+aXJxOworCXNzdC0+b3BzID0gc3N0X2Rldi0+b3BzOworCXNzdC0+cGRhdGEgPSBwZGF0YTsKKwlJTklUX0xJU1RfSEVBRCgmc3N0LT51c2VkX2Jsb2NrX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZzc3QtPmZyZWVfYmxvY2tfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnNzdC0+bW9kdWxlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZzc3QtPmZ3X2xpc3QpOworCisJLyogSW5pdGlhbGlzZSBTU1QgQXVkaW8gRFNQICovCisJaWYgKHNzdC0+b3BzLT5pbml0KSB7CisJCWVyciA9IHNzdC0+b3BzLT5pbml0KHNzdCwgcGRhdGEpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBOVUxMOworCX0KKworCS8qIFJlZ2lzdGVyIHRoZSBJU1IgKi8KKwllcnIgPSByZXF1ZXN0X3RocmVhZGVkX2lycShzc3QtPmlycSwgc3N0LT5vcHMtPmlycV9oYW5kbGVyLAorCQlzc3RfZGV2LT50aHJlYWQsIElSUUZfU0hBUkVELCAiQXVkaW9EU1AiLCBzc3QpOworCWlmIChlcnIpCisJCWdvdG8gaXJxX2VycjsKKworCXJldHVybiBzc3Q7CisKK2lycV9lcnI6CisJaWYgKHNzdC0+b3BzLT5mcmVlKQorCQlzc3QtPm9wcy0+ZnJlZShzc3QpOworCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZHNwX25ldyk7CisKK3ZvaWQgc3N0X2RzcF9mcmVlKHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJZnJlZV9pcnEoc3N0LT5pcnEsIHNzdCk7CisJaWYgKHNzdC0+b3BzLT5mcmVlKQorCQlzc3QtPm9wcy0+ZnJlZShzc3QpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9mcmVlKTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJMaWFtIEdpcmR3b29kIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIFNTVCBDb3JlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWRzcC5oIGIvc291bmQvc29jL2ludGVsL3NzdC1kc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDA1MmI1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1kc3AuaApAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqIEludGVsIFNtYXJ0IFNvdW5kIFRlY2hub2xvZ3kgKFNTVCkgQ29yZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9fU09VTkRfU09DX1NTVF9EU1BfSAorI2RlZmluZSBfX1NPVU5EX1NPQ19TU1RfRFNQX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKy8qIFNTVCBEZXZpY2UgSURzICAqLworI2RlZmluZSBTU1RfREVWX0lEX0xZTlhfUE9JTlQJCTB4MzNDOAorI2RlZmluZSBTU1RfREVWX0lEX1dJTERDQVRfUE9JTlQJMHgzNDM4CisjZGVmaW5lIFNTVF9ERVZfSURfQllUCQkJMHgwRjI4CisKKy8qIFN1cHBvcnRlZCBTU1QgRE1BIERldmljZXMgKi8KKyNkZWZpbmUgU1NUX0RNQV9UWVBFX0RXCQkxCisjZGVmaW5lIFNTVF9ETUFfVFlQRV9NSUQJMgorCisvKiBTU1QgU2hpbSByZWdpc3RlciBtYXAKKyAqIFRoZSByZWdpc3RlciBuYW1pbmcgY2FuIGRpZmZlciBiZXR3ZWVuIHByb2R1Y3RzLiBTb21lIHByb2R1Y3RzIGFsc28KKyAqIGNvbnRhaW4gZXh0cmEgZnVuY3Rpb25hbGl0eS4KKyAqLworI2RlZmluZSBTU1RfQ1NSCQkJMHgwMAorI2RlZmluZSBTU1RfUElTUgkJMHgwOAorI2RlZmluZSBTU1RfUElNUgkJMHgxMAorI2RlZmluZSBTU1RfSVNSWAkJMHgxOAorI2RlZmluZSBTU1RfSVNSRAkJMHgyMAorI2RlZmluZSBTU1RfSU1SWAkJMHgyOAorI2RlZmluZSBTU1RfSU1SRAkJMHgzMAorI2RlZmluZSBTU1RfSVBDWAkJMHgzOCAvKiBJUEMgSUEgLT4gU1NUICovCisjZGVmaW5lIFNTVF9JUENECQkweDQwIC8qIElQQyBTU1QgLT4gSUEgKi8KKyNkZWZpbmUgU1NUX0lTUlNDCQkweDQ4CisjZGVmaW5lIFNTVF9JU1JMUEVTQwkJMHg1MAorI2RlZmluZSBTU1RfSU1SU0MJCTB4NTgKKyNkZWZpbmUgU1NUX0lNUkxQRVNDCQkweDYwCisjZGVmaW5lIFNTVF9JUENTQwkJMHg2OAorI2RlZmluZSBTU1RfSVBDTFBFU0MJCTB4NzAKKyNkZWZpbmUgU1NUX0NMS0NUTAkJMHg3OAorI2RlZmluZSBTU1RfQ1NSMgkJMHg4MAorI2RlZmluZSBTU1RfTFRSQwkJMHhFMAorI2RlZmluZSBTU1RfSERNQwkJMHhFOAorI2RlZmluZSBTU1RfREJHTwkJMHhGMAorCisjZGVmaW5lIFNTVF9TSElNX1NJWkUJCTB4MTAwCisjZGVmaW5lIFNTVF9QV01DVFJMICAgICAgICAgICAgIDB4MTAwMAorCisvKiBTU1QgU2hpbSBSZWdpc3RlciBiaXRzCisgKiBUaGUgcmVnaXN0ZXIgYml0IG5hbWluZyBjYW4gZGlmZmVyIGJldHdlZW4gcHJvZHVjdHMuIFNvbWUgcHJvZHVjdHMgYWxzbworICogY29udGFpbiBleHRyYSBmdW5jdGlvbmFsaXR5LgorICovCisKKy8qIENTUiAvIENTICovCisjZGVmaW5lIFNTVF9DU1JfUlNUCQkoMHgxIDw8IDEpCisjZGVmaW5lIFNTVF9DU1JfU0JDUzAJCSgweDEgPDwgMikKKyNkZWZpbmUgU1NUX0NTUl9TQkNTMQkJKDB4MSA8PCAzKQorI2RlZmluZSBTU1RfQ1NSX0RDUyh4KQkJKHggPDwgNCkKKyNkZWZpbmUgU1NUX0NTUl9EQ1NfTUFTSwkoMHg3IDw8IDQpCisjZGVmaW5lIFNTVF9DU1JfU1RBTEwJCSgweDEgPDwgMTApCisjZGVmaW5lIFNTVF9DU1JfUzBJT0NTCQkoMHgxIDw8IDIxKQorI2RlZmluZSBTU1RfQ1NSX1MxSU9DUwkJKDB4MSA8PCAyMykKKyNkZWZpbmUgU1NUX0NTUl9MUENTCQkoMHgxIDw8IDMxKQorI2RlZmluZSBTU1RfQllUX0NTUl9SU1QJCSgweDEgPDwgMCkKKyNkZWZpbmUgU1NUX0JZVF9DU1JfVkVDVE9SX1NFTAkoMHgxIDw8IDEpCisjZGVmaW5lIFNTVF9CWVRfQ1NSX1NUQUxMCSgweDEgPDwgMikKKyNkZWZpbmUgU1NUX0JZVF9DU1JfUFdBSVRNT0RFCSgweDEgPDwgMykKKworLyogIElTUlggLyBJU0MgKi8KKyNkZWZpbmUgU1NUX0lTUlhfQlVTWQkJKDB4MSA8PCAxKQorI2RlZmluZSBTU1RfSVNSWF9ET05FCQkoMHgxIDw8IDApCisjZGVmaW5lIFNTVF9CWVRfSVNSWF9SRVFVRVNUCSgweDEgPDwgMSkKKworLyogIElTUkQgLyBJU0QgKi8KKyNkZWZpbmUgU1NUX0lTUkRfQlVTWQkJKDB4MSA8PCAxKQorI2RlZmluZSBTU1RfSVNSRF9ET05FCQkoMHgxIDw8IDApCisKKy8qIElNUlggLyBJTUMgKi8KKyNkZWZpbmUgU1NUX0lNUlhfQlVTWQkJKDB4MSA8PCAxKQorI2RlZmluZSBTU1RfSU1SWF9ET05FCQkoMHgxIDw8IDApCisjZGVmaW5lIFNTVF9CWVRfSU1SWF9SRVFVRVNUCSgweDEgPDwgMSkKKworLyogIElQQ1ggLyBJUENDICovCisjZGVmaW5lCVNTVF9JUENYX0RPTkUJCSgweDEgPDwgMzApCisjZGVmaW5lCVNTVF9JUENYX0JVU1kJCSgweDEgPDwgMzEpCisjZGVmaW5lIFNTVF9CWVRfSVBDWF9ET05FCSgodTY0KTB4MSA8PCA2MikKKyNkZWZpbmUgU1NUX0JZVF9JUENYX0JVU1kJKCh1NjQpMHgxIDw8IDYzKQorCisvKiAgSVBDRCAqLworI2RlZmluZQlTU1RfSVBDRF9ET05FCQkoMHgxIDw8IDMwKQorI2RlZmluZQlTU1RfSVBDRF9CVVNZCQkoMHgxIDw8IDMxKQorI2RlZmluZSBTU1RfQllUX0lQQ0RfRE9ORQkoKHU2NCkweDEgPDwgNjIpCisjZGVmaW5lIFNTVF9CWVRfSVBDRF9CVVNZCSgodTY0KTB4MSA8PCA2MykKKworLyogQ0xLQ1RMICovCisjZGVmaW5lIFNTVF9DTEtDVExfU01PUyh4KQkoeCA8PCAyNCkKKyNkZWZpbmUgU1NUX0NMS0NUTF9NQVNLCQkoMyA8PCAyNCkKKyNkZWZpbmUgU1NUX0NMS0NUTF9EQ1BMQ0cJKDEgPDwgMTgpCisjZGVmaW5lIFNTVF9DTEtDVExfU0NPRTEJKDEgPDwgMTcpCisjZGVmaW5lIFNTVF9DTEtDVExfU0NPRTAJKDEgPDwgMTYpCisKKy8qIENTUjIgLyBDUzIgKi8KKyNkZWZpbmUgU1NUX0NTUjJfU0RGRF9TU1AwCSgxIDw8IDEpCisjZGVmaW5lIFNTVF9DU1IyX1NERkRfU1NQMQkoMSA8PCAyKQorCisvKiBMVFJDICovCisjZGVmaW5lIFNTVF9MVFJDX1ZBTCh4KQkJKHggPDwgMCkKKworLyogSERNQyAqLworI2RlZmluZSBTU1RfSERNQ19IRERBMCh4KQkoeCA8PCAwKQorI2RlZmluZSBTU1RfSERNQ19IRERBMSh4KQkoeCA8PCA3KQorCisKKy8qIFNTVCBWZW5kb3IgRGVmaW5lZCBSZWdpc3RlcnMgYW5kIGJpdHMgKi8KKyNkZWZpbmUgU1NUX1ZEUlRDVEwwCQkweGEwCisjZGVmaW5lIFNTVF9WRFJUQ1RMMQkJMHhhNAorI2RlZmluZSBTU1RfVkRSVENUTDIJCTB4YTgKKyNkZWZpbmUgU1NUX1ZEUlRDVEwzCQkweGFDCisKKy8qIFZEUlRDVEwwICovCisjZGVmaW5lIFNTVF9WRFJUQ0wwX0RTUkFNUEdFX1NISUZUCTE2CisjZGVmaW5lIFNTVF9WRFJUQ0wwX0RTUkFNUEdFX01BU0sJKDB4ZmZmZiA8PCBTU1RfVkRSVENMMF9EU1JBTVBHRV9TSElGVCkKKyNkZWZpbmUgU1NUX1ZEUlRDTDBfSVNSQU1QR0VfU0hJRlQJNgorI2RlZmluZSBTU1RfVkRSVENMMF9JU1JBTVBHRV9NQVNLCSgweDNmZiA8PCBTU1RfVkRSVENMMF9JU1JBTVBHRV9TSElGVCkKKworc3RydWN0IHNzdF9kc3A7CisKKy8qCisgKiBTU1QgRGV2aWNlLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHBvcHVsYXRlZCBieSB0aGUgU1NUIGNvcmUgZHJpdmVyLgorICovCitzdHJ1Y3Qgc3N0X2RzcF9kZXZpY2UgeworCS8qIE1hbmRhdG9yeSBmaWVsZHMgKi8KKwlzdHJ1Y3Qgc3N0X29wcyAqb3BzOworCWlycXJldHVybl90ICgqdGhyZWFkKShpbnQgaXJxLCB2b2lkICpjb250ZXh0KTsKKwl2b2lkICp0aHJlYWRfY29udGV4dDsKK307CisKKy8qCisgKiBTU1QgUGxhdGZvcm0gRGF0YS4KKyAqLworc3RydWN0IHNzdF9wZGF0YSB7CisJLyogQUNQSSBkYXRhICovCisJdTMyIGxwZV9iYXNlOworCXUzMiBscGVfc2l6ZTsKKwl1MzIgcGNpY2ZnX2Jhc2U7CisJdTMyIHBjaWNmZ19zaXplOworCXUzMiBmd19iYXNlOworCXUzMiBmd19zaXplOworCWludCBpcnE7CisKKwkvKiBGaXJtd2FyZSAqLworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisKKwkvKiBETUEgKi8KKwl1MzIgZG1hX2Jhc2U7CisJdTMyIGRtYV9zaXplOworCWludCBkbWFfZW5naW5lOworCisJLyogRFNQICovCisJdTMyIGlkOworCXZvaWQgKmRzcDsKK307CisKKy8qIEluaXRpYWxpemF0aW9uICovCitzdHJ1Y3Qgc3N0X2RzcCAqc3N0X2RzcF9uZXcoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBzc3RfZHNwX2RldmljZSAqc3N0X2Rldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpOwordm9pZCBzc3RfZHNwX2ZyZWUoc3RydWN0IHNzdF9kc3AgKnNzdCk7CisKKy8qIFNISU0gUmVhZCAvIFdyaXRlICovCit2b2lkIHNzdF9kc3Bfc2hpbV93cml0ZShzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpOwordTMyIHNzdF9kc3Bfc2hpbV9yZWFkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQpOworaW50IHNzdF9kc3Bfc2hpbV91cGRhdGVfYml0cyhzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LAorCQkJCXUzMiBtYXNrLCB1MzIgdmFsdWUpOwordm9pZCBzc3RfZHNwX3NoaW1fd3JpdGU2NChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpOwordTY0IHNzdF9kc3Bfc2hpbV9yZWFkNjQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCk7CitpbnQgc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCwKKwkJCQl1NjQgbWFzaywgdTY0IHZhbHVlKTsKKworLyogU0hJTSBSZWFkIC8gV3JpdGUgVW5sb2NrZWQgZm9yIGNhbGxlcnMgYWxyZWFkeSBob2xkaW5nIHNzdCBsb2NrICovCit2b2lkIHNzdF9kc3Bfc2hpbV93cml0ZV91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpOwordTMyIHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQpOworaW50IHNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LAorCQkJCXUzMiBtYXNrLCB1MzIgdmFsdWUpOwordm9pZCBzc3RfZHNwX3NoaW1fd3JpdGU2NF91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpOwordTY0IHNzdF9kc3Bfc2hpbV9yZWFkNjRfdW5sb2NrZWQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCk7CitpbnQgc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjRfdW5sb2NrZWQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCwKKwkJCQkJdTY0IG1hc2ssIHU2NCB2YWx1ZSk7CisKKy8qIEludGVybmFsIGdlbmVyaWMgbG93LWxldmVsIFNTVCBJTyBmdW5jdGlvbnMgLSBjYW4gYmUgb3ZlcmlkZGVuICovCit2b2lkIHNzdF9zaGltMzJfd3JpdGUodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpOwordTMyIHNzdF9zaGltMzJfcmVhZCh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQpOwordm9pZCBzc3Rfc2hpbTMyX3dyaXRlNjQodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpOwordTY0IHNzdF9zaGltMzJfcmVhZDY0KHZvaWQgX19pb21lbSAqYWRkciwgdTMyIG9mZnNldCk7Cit2b2lkIHNzdF9tZW1jcHlfdG9pb18zMihzdHJ1Y3Qgc3N0X2RzcCAqc3N0LAorCQkJdm9pZCBfX2lvbWVtICpkZXN0LCB2b2lkICpzcmMsIHNpemVfdCBieXRlcyk7Cit2b2lkIHNzdF9tZW1jcHlfZnJvbWlvXzMyKHN0cnVjdCBzc3RfZHNwICpzc3QsCisJCQkgIHZvaWQgKmRlc3QsIHZvaWQgX19pb21lbSAqc3JjLCBzaXplX3QgYnl0ZXMpOworCisvKiBEU1AgcmVzZXQgJiBib290ICovCit2b2lkIHNzdF9kc3BfcmVzZXQoc3RydWN0IHNzdF9kc3AgKnNzdCk7CitpbnQgc3N0X2RzcF9ib290KHN0cnVjdCBzc3RfZHNwICpzc3QpOworCisvKiBNc2cgSU8gKi8KK3ZvaWQgc3N0X2RzcF9pcGNfbXNnX3R4KHN0cnVjdCBzc3RfZHNwICpkc3AsIHUzMiBtc2cpOwordTMyIHNzdF9kc3BfaXBjX21zZ19yeChzdHJ1Y3Qgc3N0X2RzcCAqZHNwKTsKKworLyogTWFpbGJveCBtYW5hZ2VtZW50ICovCitpbnQgc3N0X2RzcF9tYWlsYm94X2luaXQoc3RydWN0IHNzdF9kc3AgKmRzcCwgdTMyIGluYm94X29mZnNldCwKKwlzaXplX3QgaW5ib3hfc2l6ZSwgdTMyIG91dGJveF9vZmZzZXQsIHNpemVfdCBvdXRib3hfc2l6ZSk7Cit2b2lkIHNzdF9kc3BfaW5ib3hfd3JpdGUoc3RydWN0IHNzdF9kc3AgKmRzcCwgdm9pZCAqbWVzc2FnZSwgc2l6ZV90IGJ5dGVzKTsKK3ZvaWQgc3N0X2RzcF9pbmJveF9yZWFkKHN0cnVjdCBzc3RfZHNwICpkc3AsIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBieXRlcyk7Cit2b2lkIHNzdF9kc3Bfb3V0Ym94X3dyaXRlKHN0cnVjdCBzc3RfZHNwICpkc3AsIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBieXRlcyk7Cit2b2lkIHNzdF9kc3Bfb3V0Ym94X3JlYWQoc3RydWN0IHNzdF9kc3AgKmRzcCwgdm9pZCAqbWVzc2FnZSwgc2l6ZV90IGJ5dGVzKTsKK3ZvaWQgc3N0X2RzcF9tYWlsYm94X2R1bXAoc3RydWN0IHNzdF9kc3AgKmRzcCwgc2l6ZV90IGJ5dGVzKTsKKworLyogRGVidWcgKi8KK3ZvaWQgc3N0X2RzcF9kdW1wKHN0cnVjdCBzc3RfZHNwICpzc3QpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtZmlybXdhcmUuYyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtZmlybXdhcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzY4NzEwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1maXJtd2FyZS5jCkBAIC0wLDAgKzEsNTg3IEBACisvKgorICogSW50ZWwgU1NUIEZpcm13YXJlIExvYWRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisjaW5jbHVkZSAic3N0LWRzcC5oIgorI2luY2x1ZGUgInNzdC1kc3AtcHJpdi5oIgorCitzdGF0aWMgdm9pZCBzc3RfbWVtY3B5MzIodm9sYXRpbGUgdm9pZCBfX2lvbWVtICpkZXN0LCB2b2lkICpzcmMsIHUzMiBieXRlcykKK3sKKwl1MzIgaTsKKworCS8qIGNvcHkgb25lIDMyIGJpdCB3b3JkIGF0IGEgdGltZSBhcyA2NCBiaXQgYWNjZXNzIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkgKz0gNCkKKwkJbWVtY3B5X3RvaW8oZGVzdCArIGksIHNyYyArIGksIDQpOworfQorCisvKiBjcmVhdGUgbmV3IGdlbmVyaWMgZmlybXdhcmUgb2JqZWN0ICovCitzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZndfbmV3KHN0cnVjdCBzc3RfZHNwICpkc3AsIAorCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IHNzdF9mdyAqc3N0X2Z3OworCWludCBlcnI7CisKKwlpZiAoIWRzcC0+b3BzLT5wYXJzZV9mdykKKwkJcmV0dXJuIE5VTEw7CisKKwlzc3RfZncgPSBremFsbG9jKHNpemVvZigqc3N0X2Z3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNzdF9mdyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXNzdF9mdy0+ZHNwID0gZHNwOworCXNzdF9mdy0+cHJpdmF0ZSA9IHByaXZhdGU7CisJc3N0X2Z3LT5zaXplID0gZnctPnNpemU7CisKKwllcnIgPSBkbWFfY29lcmNlX21hc2tfYW5kX2NvaGVyZW50KGRzcC0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwlpZiAoZXJyIDwgMCkgeworCQlrZnJlZShzc3RfZncpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBhbGxvY2F0ZSBETUEgYnVmZmVyIHRvIHN0b3JlIEZXIGRhdGEgKi8KKwlzc3RfZnctPmRtYV9idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoZHNwLT5kZXYsIHNzdF9mdy0+c2l6ZSwKKwkJCQkmc3N0X2Z3LT5kbWFibGVfZndfcGFkZHIsIEdGUF9ETUEgfCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNzdF9mdy0+ZG1hX2J1ZikgeworCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IERNQSBhbGxvYyBmYWlsZWRcbiIpOworCQlrZnJlZShzc3RfZncpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBjb3B5IEZXIGRhdGEgdG8gRE1BLWFibGUgbWVtb3J5ICovCisJbWVtY3B5KCh2b2lkICopc3N0X2Z3LT5kbWFfYnVmLCAodm9pZCAqKWZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisKKwkvKiBjYWxsIGNvcmUgc3BlY2lmaWMgRlcgcGFzZXIgdG8gbG9hZCBGVyBkYXRhIGludG8gRFNQICovCisJZXJyID0gZHNwLT5vcHMtPnBhcnNlX2Z3KHNzdF9mdyk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBwYXJzZSBmdyBmYWlsZWQgJWRcbiIsIGVycik7CisJCWdvdG8gcGFyc2VfZXJyOworCX0KKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWxpc3RfYWRkKCZzc3RfZnctPmxpc3QsICZkc3AtPmZ3X2xpc3QpOworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisKKwlyZXR1cm4gc3N0X2Z3OworCitwYXJzZV9lcnI6CisJZG1hX2ZyZWVfY29oZXJlbnQoZHNwLT5kZXYsIHNzdF9mdy0+c2l6ZSwKKwkJCQlzc3RfZnctPmRtYV9idWYsCisJCQkJc3N0X2Z3LT5kbWFibGVfZndfcGFkZHIpOworCWtmcmVlKHNzdF9mdyk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZndfbmV3KTsKKworLyogZnJlZSBzaW5nbGUgZmlybXdhcmUgb2JqZWN0ICovCit2b2lkIHNzdF9md19mcmVlKHN0cnVjdCBzc3RfZncgKnNzdF9mdykKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gc3N0X2Z3LT5kc3A7CisKKwltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKKwlsaXN0X2RlbCgmc3N0X2Z3LT5saXN0KTsKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCisJZG1hX2ZyZWVfY29oZXJlbnQoZHNwLT5kZXYsIHNzdF9mdy0+c2l6ZSwgc3N0X2Z3LT5kbWFfYnVmLAorCQkJc3N0X2Z3LT5kbWFibGVfZndfcGFkZHIpOworCWtmcmVlKHNzdF9mdyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZndfZnJlZSk7CisKKy8qIGZyZWUgYWxsIGZpcm13YXJlIG9iamVjdHMgKi8KK3ZvaWQgc3N0X2Z3X2ZyZWVfYWxsKHN0cnVjdCBzc3RfZHNwICpkc3ApCit7CisJc3RydWN0IHNzdF9mdyAqc3N0X2Z3LCAqdDsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzc3RfZncsIHQsICZkc3AtPmZ3X2xpc3QsIGxpc3QpIHsKKworCQlsaXN0X2RlbCgmc3N0X2Z3LT5saXN0KTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZHNwLT5kZXYsIHNzdF9mdy0+c2l6ZSwgc3N0X2Z3LT5kbWFfYnVmLAorCQkJc3N0X2Z3LT5kbWFibGVfZndfcGFkZHIpOworCQlrZnJlZShzc3RfZncpOworCX0KKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2Z3X2ZyZWVfYWxsKTsKKworLyogY3JlYXRlIGEgbmV3IFNTVCBnZW5lcmljIG1vZHVsZSBmcm9tIEZXIHRlbXBsYXRlICovCitzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZV9uZXcoc3RydWN0IHNzdF9mdyAqc3N0X2Z3LAorCXN0cnVjdCBzc3RfbW9kdWxlX3RlbXBsYXRlICp0ZW1wbGF0ZSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gc3N0X2Z3LT5kc3A7CisJc3RydWN0IHNzdF9tb2R1bGUgKnNzdF9tb2R1bGU7CisKKwlzc3RfbW9kdWxlID0ga3phbGxvYyhzaXplb2YoKnNzdF9tb2R1bGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3N0X21vZHVsZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXNzdF9tb2R1bGUtPmlkID0gdGVtcGxhdGUtPmlkOworCXNzdF9tb2R1bGUtPmRzcCA9IGRzcDsKKwlzc3RfbW9kdWxlLT5zc3RfZncgPSBzc3RfZnc7CisKKwltZW1jcHkoJnNzdF9tb2R1bGUtPnMsICZ0ZW1wbGF0ZS0+cywgc2l6ZW9mKHN0cnVjdCBzc3RfbW9kdWxlX2RhdGEpKTsKKwltZW1jcHkoJnNzdF9tb2R1bGUtPnAsICZ0ZW1wbGF0ZS0+cCwgc2l6ZW9mKHN0cnVjdCBzc3RfbW9kdWxlX2RhdGEpKTsKKworCUlOSVRfTElTVF9IRUFEKCZzc3RfbW9kdWxlLT5ibG9ja19saXN0KTsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWxpc3RfYWRkKCZzc3RfbW9kdWxlLT5saXN0LCAmZHNwLT5tb2R1bGVfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKKworCXJldHVybiBzc3RfbW9kdWxlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21vZHVsZV9uZXcpOworCisvKiBmcmVlIGZpcm13YXJlIG1vZHVsZSBhbmQgcmVtb3ZlIGZyb20gYXZhaWxhYmxlIGxpc3QgKi8KK3ZvaWQgc3N0X21vZHVsZV9mcmVlKHN0cnVjdCBzc3RfbW9kdWxlICpzc3RfbW9kdWxlKQoreworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBzc3RfbW9kdWxlLT5kc3A7CisKKwltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKKwlsaXN0X2RlbCgmc3N0X21vZHVsZS0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKKworCWtmcmVlKHNzdF9tb2R1bGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21vZHVsZV9mcmVlKTsKKworc3RhdGljIHN0cnVjdCBzc3RfbWVtX2Jsb2NrICpmaW5kX2Jsb2NrKHN0cnVjdCBzc3RfZHNwICpkc3AsIGludCB0eXBlLAorCXUzMiBvZmZzZXQpCit7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShibG9jaywgJmRzcC0+ZnJlZV9ibG9ja19saXN0LCBsaXN0KSB7CisJCWlmIChibG9jay0+dHlwZSA9PSB0eXBlICYmIGJsb2NrLT5vZmZzZXQgPT0gb2Zmc2V0KQorCQkJcmV0dXJuIGJsb2NrOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGJsb2NrX2FsbG9jX2NvbnRpZ3VvdXMoc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZSwKKwlzdHJ1Y3Qgc3N0X21vZHVsZV9kYXRhICpkYXRhLCB1MzIgb2Zmc2V0LCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRtcCA9IExJU1RfSEVBRF9JTklUKHRtcCk7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IG1vZHVsZS0+ZHNwOworCXN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jazsKKworCXdoaWxlIChzaXplID4gMCkgeworCQlibG9jayA9IGZpbmRfYmxvY2soZHNwLCBkYXRhLT50eXBlLCBvZmZzZXQpOworCQlpZiAoIWJsb2NrKSB7CisJCQlsaXN0X3NwbGljZSgmdG1wLCAmZHNwLT5mcmVlX2Jsb2NrX2xpc3QpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlsaXN0X21vdmVfdGFpbCgmYmxvY2stPmxpc3QsICZ0bXApOworCQlvZmZzZXQgKz0gYmxvY2stPnNpemU7CisJCXNpemUgLT0gYmxvY2stPnNpemU7CisJfQorCisJbGlzdF9zcGxpY2UoJnRtcCwgJmRzcC0+dXNlZF9ibG9ja19saXN0KTsKKwlyZXR1cm4gMDsKK30KKworLyogYWxsb2NhdGUgZnJlZSBEU1AgYmxvY2tzIGZvciBtb2R1bGUgZGF0YSAtIGNhbGxlcnMgaG9sZCBsb2NrcyAqLworc3RhdGljIGludCBibG9ja19hbGxvYyhzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlLAorCXN0cnVjdCBzc3RfbW9kdWxlX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IG1vZHVsZS0+ZHNwOworCXN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaywgKnRtcDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkYXRhLT5zaXplID09IDApCisJCXJldHVybiAwOworCisJLyogZmluZCBmaXJzdCBmcmVlIHdob2xlIGJsb2NrcyB0aGF0IGNhbiBob2xkIG1vZHVsZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShibG9jaywgdG1wLCAmZHNwLT5mcmVlX2Jsb2NrX2xpc3QsIGxpc3QpIHsKKworCQkvKiBpZ25vcmUgYmxvY2tzIHdpdGggd3JvbmcgdHlwZSAqLworCQlpZiAoYmxvY2stPnR5cGUgIT0gZGF0YS0+dHlwZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkYXRhLT5zaXplID4gYmxvY2stPnNpemUpCisJCQljb250aW51ZTsKKworCQlkYXRhLT5vZmZzZXQgPSBibG9jay0+b2Zmc2V0OworCQlibG9jay0+ZGF0YV90eXBlID0gZGF0YS0+ZGF0YV90eXBlOworCQlibG9jay0+Ynl0ZXNfdXNlZCA9IGRhdGEtPnNpemUgJSBibG9jay0+c2l6ZTsKKwkJbGlzdF9hZGQoJmJsb2NrLT5tb2R1bGVfbGlzdCwgJm1vZHVsZS0+YmxvY2tfbGlzdCk7CisJCWxpc3RfbW92ZSgmYmxvY2stPmxpc3QsICZkc3AtPnVzZWRfYmxvY2tfbGlzdCk7CisJCWRldl9kYmcoZHNwLT5kZXYsICIgKm1vZHVsZSAlZCBhZGRlZCBibG9jayAlZDolZFxuIiwKKwkJCW1vZHVsZS0+aWQsIGJsb2NrLT50eXBlLCBibG9jay0+aW5kZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB0aGVuIGZpbmQgZnJlZSBtdWx0aXBsZSBibG9ja3MgdGhhdCBjYW4gaG9sZCBtb2R1bGUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmxvY2ssIHRtcCwgJmRzcC0+ZnJlZV9ibG9ja19saXN0LCBsaXN0KSB7CisKKwkJLyogaWdub3JlIGJsb2NrcyB3aXRoIHdyb25nIHR5cGUgKi8KKwkJaWYgKGJsb2NrLT50eXBlICE9IGRhdGEtPnR5cGUpCisJCQljb250aW51ZTsKKworCQkvKiBkbyB3ZSBzcGFuID4gMSBibG9ja3MgKi8KKwkJaWYgKGRhdGEtPnNpemUgPiBibG9jay0+c2l6ZSkgeworCQkJcmV0ID0gYmxvY2tfYWxsb2NfY29udGlndW91cyhtb2R1bGUsIGRhdGEsCisJCQkJYmxvY2stPm9mZnNldCArIGJsb2NrLT5zaXplLAorCQkJCWRhdGEtPnNpemUgLSBibG9jay0+c2l6ZSk7CisJCQlpZiAocmV0ID09IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCS8qIG5vdCBlbm91Z2ggZnJlZSBibG9jayBzcGFjZSAqLworCXJldHVybiAtRU5PTUVNOworfQorCisvKiByZW1vdmUgbW9kdWxlIGZyb20gbWVtb3J5IC0gY2FsbGVycyBob2xkIGxvY2tzICovCitzdGF0aWMgdm9pZCBibG9ja19tb2R1bGVfcmVtb3ZlKHN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUpCit7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrLCAqdG1wOworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBtb2R1bGUtPmRzcDsKKwlpbnQgZXJyOworCisJLyogZGlzYWJsZSBlYWNoIGJsb2NrICAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmxvY2ssICZtb2R1bGUtPmJsb2NrX2xpc3QsIG1vZHVsZV9saXN0KSB7CisKKwkJaWYgKGJsb2NrLT5vcHMgJiYgYmxvY2stPm9wcy0+ZGlzYWJsZSkgeworCQkJZXJyID0gYmxvY2stPm9wcy0+ZGlzYWJsZShibG9jayk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlkZXZfZXJyKGRzcC0+ZGV2LAorCQkJCQkiZXJyb3I6IGNhbnQgZGlzYWJsZSBibG9jayAlZDolZFxuIiwKKwkJCQkJYmxvY2stPnR5cGUsIGJsb2NrLT5pbmRleCk7CisJCX0KKwl9CisKKwkvKiBtYXJrIGVhY2ggYmxvY2sgYXMgZnJlZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShibG9jaywgdG1wLCAmbW9kdWxlLT5ibG9ja19saXN0LCBtb2R1bGVfbGlzdCkgeworCQlsaXN0X2RlbCgmYmxvY2stPm1vZHVsZV9saXN0KTsKKwkJbGlzdF9tb3ZlKCZibG9jay0+bGlzdCwgJmRzcC0+ZnJlZV9ibG9ja19saXN0KTsKKwl9Cit9CisKKy8qIHByZXBhcmUgdGhlIG1lbW9yeSBibG9jayB0byByZWNlaXZlIGRhdGEgZnJvbSBob3N0IC0gY2FsbGVycyBob2xkIGxvY2tzICovCitzdGF0aWMgaW50IGJsb2NrX21vZHVsZV9wcmVwYXJlKHN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUpCit7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrOworCWludCByZXQgPSAwOworCisJLyogZW5hYmxlIGVhY2ggYmxvY2sgc28gdGhhdCdzIGl0J2UgcmVhZHkgZm9yIG1vZHVsZSBQL1MgZGF0YSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmxvY2ssICZtb2R1bGUtPmJsb2NrX2xpc3QsIG1vZHVsZV9saXN0KSB7CisKKwkJaWYgKGJsb2NrLT5vcHMgJiYgYmxvY2stPm9wcy0+ZW5hYmxlKSB7CisJCQlyZXQgPSBibG9jay0+b3BzLT5lbmFibGUoYmxvY2spOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlkZXZfZXJyKG1vZHVsZS0+ZHNwLT5kZXYsCisJCQkJCSJlcnJvcjogY2FudCBkaXNhYmxlIGJsb2NrICVkOiVkXG4iLAorCQkJCQlibG9jay0+dHlwZSwgYmxvY2stPmluZGV4KTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmV0OworCitlcnI6CisJbGlzdF9mb3JfZWFjaF9lbnRyeShibG9jaywgJm1vZHVsZS0+YmxvY2tfbGlzdCwgbW9kdWxlX2xpc3QpIHsKKwkJaWYgKGJsb2NrLT5vcHMgJiYgYmxvY2stPm9wcy0+ZGlzYWJsZSkKKwkJCWJsb2NrLT5vcHMtPmRpc2FibGUoYmxvY2spOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBhbGxvY2F0ZSBtZW1vcnkgYmxvY2tzIGZvciBzdGF0aWMgbW9kdWxlIGFkZHJlc3NlcyAtIGNhbGxlcnMgaG9sZCBsb2NrcyAqLworc3RhdGljIGludCBibG9ja19hbGxvY19maXhlZChzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlLAorCXN0cnVjdCBzc3RfbW9kdWxlX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IG1vZHVsZS0+ZHNwOworCXN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaywgKnRtcDsKKwl1MzIgZW5kID0gZGF0YS0+b2Zmc2V0ICsgZGF0YS0+c2l6ZSwgYmxvY2tfZW5kOworCWludCBlcnI7CisKKwkvKiBvbmx5IElSQU0vRFJBTSBibG9ja3MgYXJlIG1hbmFnZWQgKi8KKwlpZiAoZGF0YS0+dHlwZSAhPSBTU1RfTUVNX0lSQU0gJiYgZGF0YS0+dHlwZSAhPSBTU1RfTUVNX0RSQU0pCisJCXJldHVybiAwOworCisJLyogYXJlIGJsb2NrcyBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoaXMgbW9kdWxlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJsb2NrLCB0bXAsICZtb2R1bGUtPmJsb2NrX2xpc3QsIG1vZHVsZV9saXN0KSB7CisKKwkJLyogZm9yY2UgY29tcGFjdGluZyBtZW0gYmxvY2tzIG9mIHRoZSBzYW1lIGRhdGFfdHlwZSAqLworCQlpZiAoYmxvY2stPmRhdGFfdHlwZSAhPSBkYXRhLT5kYXRhX3R5cGUpCisJCQljb250aW51ZTsKKworCQlibG9ja19lbmQgPSBibG9jay0+b2Zmc2V0ICsgYmxvY2stPnNpemU7CisKKwkJLyogZmluZCBibG9jayB0aGF0IGhvbGRzIHNlY3Rpb24gKi8KKwkJaWYgKGRhdGEtPm9mZnNldCA+PSBibG9jay0+b2Zmc2V0ICYmIGVuZCA8IGJsb2NrX2VuZCkKKwkJCXJldHVybiAwOworCisJCS8qIGRvZXMgYmxvY2sgc3BhbiBtb3JlIHRoYW4gMSBzZWN0aW9uICovCisJCWlmIChkYXRhLT5vZmZzZXQgPj0gYmxvY2stPm9mZnNldCAmJiBkYXRhLT5vZmZzZXQgPCBibG9ja19lbmQpIHsKKworCQkJZXJyID0gYmxvY2tfYWxsb2NfY29udGlndW91cyhtb2R1bGUsIGRhdGEsCisJCQkJYmxvY2stPm9mZnNldCArIGJsb2NrLT5zaXplLAorCQkJCWRhdGEtPnNpemUgLSBibG9jay0+c2l6ZSArIGRhdGEtPm9mZnNldCAtIGJsb2NrLT5vZmZzZXQpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCS8qIG1vZHVsZSBhbHJlYWR5IG93bnMgYmxvY2tzICovCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qIGZpbmQgZmlyc3QgZnJlZSBibG9ja3MgdGhhdCBjYW4gaG9sZCBzZWN0aW9uIGluIGZyZWUgbGlzdCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShibG9jaywgdG1wLCAmZHNwLT5mcmVlX2Jsb2NrX2xpc3QsIGxpc3QpIHsKKwkJYmxvY2tfZW5kID0gYmxvY2stPm9mZnNldCArIGJsb2NrLT5zaXplOworCisJCS8qIGZpbmQgYmxvY2sgdGhhdCBob2xkcyBzZWN0aW9uICovCisJCWlmIChkYXRhLT5vZmZzZXQgPj0gYmxvY2stPm9mZnNldCAmJiBlbmQgPCBibG9ja19lbmQpIHsKKworCQkJLyogYWRkIGJsb2NrICovCisJCQlibG9jay0+ZGF0YV90eXBlID0gZGF0YS0+ZGF0YV90eXBlOworCQkJbGlzdF9tb3ZlKCZibG9jay0+bGlzdCwgJmRzcC0+dXNlZF9ibG9ja19saXN0KTsKKwkJCWxpc3RfYWRkKCZibG9jay0+bW9kdWxlX2xpc3QsICZtb2R1bGUtPmJsb2NrX2xpc3QpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBkb2VzIGJsb2NrIHNwYW4gbW9yZSB0aGFuIDEgc2VjdGlvbiAqLworCQlpZiAoZGF0YS0+b2Zmc2V0ID49IGJsb2NrLT5vZmZzZXQgJiYgZGF0YS0+b2Zmc2V0IDwgYmxvY2tfZW5kKSB7CisKKwkJCWVyciA9IGJsb2NrX2FsbG9jX2NvbnRpZ3VvdXMobW9kdWxlLCBkYXRhLAorCQkJCWJsb2NrLT5vZmZzZXQgKyBibG9jay0+c2l6ZSwKKwkJCQlkYXRhLT5zaXplIC0gYmxvY2stPnNpemUpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCS8qIGFkZCBibG9jayAqLworCQkJYmxvY2stPmRhdGFfdHlwZSA9IGRhdGEtPmRhdGFfdHlwZTsKKwkJCWxpc3RfbW92ZSgmYmxvY2stPmxpc3QsICZkc3AtPnVzZWRfYmxvY2tfbGlzdCk7CisJCQlsaXN0X2FkZCgmYmxvY2stPm1vZHVsZV9saXN0LCAmbW9kdWxlLT5ibG9ja19saXN0KTsKKwkJCXJldHVybiAwOworCQl9CisKKwl9CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyogTG9hZCBmaXhlZCBtb2R1bGUgZGF0YSBpbnRvIERTUCBtZW1vcnkgYmxvY2tzICovCitpbnQgc3N0X21vZHVsZV9pbnNlcnRfZml4ZWRfYmxvY2soc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZSwKKwlzdHJ1Y3Qgc3N0X21vZHVsZV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBtb2R1bGUtPmRzcDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7CisKKwkvKiBhbGxvYyBibG9ja3MgdGhhdCBpbmNsdWRlcyB0aGlzIHNlY3Rpb24gKi8KKwlyZXQgPSBibG9ja19hbGxvY19maXhlZChtb2R1bGUsIGRhdGEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZHNwLT5kZXYsCisJCQkiZXJyb3I6IG5vIGZyZWUgYmxvY2tzIGZvciBzZWN0aW9uIGF0IG9mZnNldCAweCV4IHNpemUgMHgleFxuIiwKKwkJCWRhdGEtPm9mZnNldCwgZGF0YS0+c2l6ZSk7CisJCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIHByZXBhcmUgRFNQIGJsb2NrcyBmb3IgbW9kdWxlIGNvcHkgKi8KKwlyZXQgPSBibG9ja19tb2R1bGVfcHJlcGFyZShtb2R1bGUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZHNwLT5kZXYsICJlcnJvcjogZncgbW9kdWxlIHByZXBhcmUgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogY29weSBwYXJ0aWFsIG1vZHVsZSBkYXRhIHRvIGJsb2NrcyAqLworCXNzdF9tZW1jcHkzMihkc3AtPmFkZHIubHBlICsgZGF0YS0+b2Zmc2V0LCBkYXRhLT5kYXRhLCBkYXRhLT5zaXplKTsKKworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJcmV0dXJuIHJldDsKKworZXJyOgorCWJsb2NrX21vZHVsZV9yZW1vdmUobW9kdWxlKTsKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbW9kdWxlX2luc2VydF9maXhlZF9ibG9jayk7CisKKy8qIFVubG9hZCBlbnRpcmUgbW9kdWxlIGZyb20gRFNQIG1lbW9yeSAqLworaW50IHNzdF9ibG9ja19tb2R1bGVfcmVtb3ZlKHN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUpCit7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IG1vZHVsZS0+ZHNwOworCisJbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7CisJYmxvY2tfbW9kdWxlX3JlbW92ZShtb2R1bGUpOworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfYmxvY2tfbW9kdWxlX3JlbW92ZSk7CisKKy8qIHJlZ2lzdGVyIGEgRFNQIG1lbW9yeSBibG9jayBmb3IgdXNlIHdpdGggRlcgYmFzZWQgbW9kdWxlcyAqLworc3RydWN0IHNzdF9tZW1fYmxvY2sgKnNzdF9tZW1fYmxvY2tfcmVnaXN0ZXIoc3RydWN0IHNzdF9kc3AgKmRzcCwgdTMyIG9mZnNldCwKKwl1MzIgc2l6ZSwgZW51bSBzc3RfbWVtX3R5cGUgdHlwZSwgc3RydWN0IHNzdF9ibG9ja19vcHMgKm9wcywgdTMyIGluZGV4LAorCXZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrOworCisJYmxvY2sgPSBremFsbG9jKHNpemVvZigqYmxvY2spLCBHRlBfS0VSTkVMKTsKKwlpZiAoYmxvY2sgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlibG9jay0+b2Zmc2V0ID0gb2Zmc2V0OworCWJsb2NrLT5zaXplID0gc2l6ZTsKKwlibG9jay0+aW5kZXggPSBpbmRleDsKKwlibG9jay0+dHlwZSA9IHR5cGU7CisJYmxvY2stPmRzcCA9IGRzcDsKKwlibG9jay0+cHJpdmF0ZSA9IHByaXZhdGU7CisJYmxvY2stPm9wcyA9IG9wczsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWxpc3RfYWRkKCZibG9jay0+bGlzdCwgJmRzcC0+ZnJlZV9ibG9ja19saXN0KTsKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCisJcmV0dXJuIGJsb2NrOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21lbV9ibG9ja19yZWdpc3Rlcik7CisKKy8qIHVucmVnaXN0ZXIgYWxsIERTUCBtZW1vcnkgYmxvY2tzICovCit2b2lkIHNzdF9tZW1fYmxvY2tfdW5yZWdpc3Rlcl9hbGwoc3RydWN0IHNzdF9kc3AgKmRzcCkKK3sKKwlzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqYmxvY2ssICp0bXA7CisKKwltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKKworCS8qIHVucmVnaXN0ZXIgdXNlZCBibG9ja3MgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmxvY2ssIHRtcCwgJmRzcC0+dXNlZF9ibG9ja19saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZibG9jay0+bGlzdCk7CisJCWtmcmVlKGJsb2NrKTsKKwl9CisKKwkvKiB1bnJlZ2lzdGVyIGZyZWUgYmxvY2tzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJsb2NrLCB0bXAsICZkc3AtPmZyZWVfYmxvY2tfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmYmxvY2stPmxpc3QpOworCQlrZnJlZShibG9jayk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9tZW1fYmxvY2tfdW5yZWdpc3Rlcl9hbGwpOworCisvKiBhbGxvY2F0ZSBzY3JhdGNoIGJ1ZmZlciBibG9ja3MgKi8KK3N0cnVjdCBzc3RfbW9kdWxlICpzc3RfbWVtX2Jsb2NrX2FsbG9jX3NjcmF0Y2goc3RydWN0IHNzdF9kc3AgKmRzcCkKK3sKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZSwgKnNjcmF0Y2g7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrLCAqdG1wOworCXUzMiBibG9ja19zaXplOworCWludCByZXQgPSAwOworCisJc2NyYXRjaCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzc3RfbW9kdWxlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNjcmF0Y2ggPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKKworCS8qIGNhbGN1bGF0ZSByZXF1aXJlZCBzY3JhdGNoIHNpemUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNzdF9tb2R1bGUsICZkc3AtPm1vZHVsZV9saXN0LCBsaXN0KSB7CisJCWlmIChzY3JhdGNoLT5zLnNpemUgPiBzc3RfbW9kdWxlLT5zLnNpemUpCisJCQlzY3JhdGNoLT5zLnNpemUgPSBzY3JhdGNoLT5zLnNpemU7CisJCWVsc2UKKwkJCXNjcmF0Y2gtPnMuc2l6ZSA9IHNzdF9tb2R1bGUtPnMuc2l6ZTsKKwl9CisKKwlkZXZfZGJnKGRzcC0+ZGV2LCAic2NyYXRjaCBidWZmZXIgcmVxdWlyZWQgaXMgJWQgYnl0ZXNcbiIsCisJCXNjcmF0Y2gtPnMuc2l6ZSk7CisKKwkvKiBpbml0IHNjcmF0Y2ggbW9kdWxlICovCisJc2NyYXRjaC0+ZHNwID0gZHNwOworCXNjcmF0Y2gtPnMudHlwZSA9IFNTVF9NRU1fRFJBTTsKKwlzY3JhdGNoLT5zLmRhdGFfdHlwZSA9IFNTVF9EQVRBX1M7CisJSU5JVF9MSVNUX0hFQUQoJnNjcmF0Y2gtPmJsb2NrX2xpc3QpOworCisJLyogY2hlY2sgZnJlZSBibG9ja3MgYmVmb3JlIGxvb2tpbmcgYXQgdXNlZCBibG9ja3MgZm9yIHNwYWNlICovCisJaWYgKCFsaXN0X2VtcHR5KCZkc3AtPmZyZWVfYmxvY2tfbGlzdCkpCisJCWJsb2NrID0gbGlzdF9maXJzdF9lbnRyeSgmZHNwLT5mcmVlX2Jsb2NrX2xpc3QsCisJCQlzdHJ1Y3Qgc3N0X21lbV9ibG9jaywgbGlzdCk7CisJZWxzZQorCQlibG9jayA9IGxpc3RfZmlyc3RfZW50cnkoJmRzcC0+dXNlZF9ibG9ja19saXN0LAorCQkJc3RydWN0IHNzdF9tZW1fYmxvY2ssIGxpc3QpOworCWJsb2NrX3NpemUgPSBibG9jay0+c2l6ZTsKKworCS8qIGFsbG9jYXRlIGJsb2NrcyBmb3IgbW9kdWxlIHNjcmF0Y2ggYnVmZmVycyAqLworCWRldl9kYmcoZHNwLT5kZXYsICJhbGxvY2F0aW5nIHNjcmF0Y2ggYmxvY2tzXG4iKTsKKwlyZXQgPSBibG9ja19hbGxvYyhzY3JhdGNoLCAmc2NyYXRjaC0+cyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBjYW4ndCBhbGxvYyBzY3JhdGNoIGJsb2Nrc1xuIik7CisJCWdvdG8gZXJyOworCX0KKworCS8qIGFzc2lnbiB0aGUgc2FtZSBvZmZzZXQgb2Ygc2NyYXRjaCB0byBlYWNoIG1vZHVsZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3N0X21vZHVsZSwgJmRzcC0+bW9kdWxlX2xpc3QsIGxpc3QpCisJCXNzdF9tb2R1bGUtPnMub2Zmc2V0ID0gc2NyYXRjaC0+cy5vZmZzZXQ7CisKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCXJldHVybiBzY3JhdGNoOworCitlcnI6CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJsb2NrLCB0bXAsICZzY3JhdGNoLT5ibG9ja19saXN0LCBtb2R1bGVfbGlzdCkKKwkJbGlzdF9kZWwoJmJsb2NrLT5tb2R1bGVfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9tZW1fYmxvY2tfYWxsb2Nfc2NyYXRjaCk7CisKKy8qIGZyZWUgYWxsIHNjcmF0Y2ggYmxvY2tzICovCit2b2lkIHNzdF9tZW1fYmxvY2tfZnJlZV9zY3JhdGNoKHN0cnVjdCBzc3RfZHNwICpkc3AsCisJc3RydWN0IHNzdF9tb2R1bGUgKnNjcmF0Y2gpCit7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrLCAqdG1wOworCisJbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmxvY2ssIHRtcCwgJnNjcmF0Y2gtPmJsb2NrX2xpc3QsIG1vZHVsZV9saXN0KQorCQlsaXN0X2RlbCgmYmxvY2stPm1vZHVsZV9saXN0KTsKKworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbWVtX2Jsb2NrX2ZyZWVfc2NyYXRjaCk7CisKKy8qIGdldCBhIG1vZHVsZSBmcm9tIGl0J3MgdW5pcXVlIElEICovCitzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZV9nZXRfZnJvbV9pZChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCB1MzIgaWQpCit7CisJc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZTsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2R1bGUsICZkc3AtPm1vZHVsZV9saXN0LCBsaXN0KSB7CisJCWlmIChtb2R1bGUtPmlkID09IGlkKSB7CisJCQltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCQkJcmV0dXJuIG1vZHVsZTsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbW9kdWxlX2dldF9mcm9tX2lkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtaGFzd2VsbC1kc3AuYyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtaGFzd2VsbC1kc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWViZjM2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1oYXN3ZWxsLWRzcC5jCkBAIC0wLDAgKzEsNTE3IEBACisvKgorICogSW50ZWwgSGFzd2VsbCBTU1QgRFNQIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgorCisjaW5jbHVkZSAic3N0LWRzcC5oIgorI2luY2x1ZGUgInNzdC1kc3AtcHJpdi5oIgorI2luY2x1ZGUgInNzdC1oYXN3ZWxsLWlwYy5oIgorCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2hzd2Fkc3AuaD4KKworI2RlZmluZSBTU1RfSFNXX0ZXX1NJR05BVFVSRV9TSVpFCTQKKyNkZWZpbmUgU1NUX0hTV19GV19TSUdOCQkJIiRTU1QiCisjZGVmaW5lIFNTVF9IU1dfRldfTElCX1NJR04JCSIkTElCIgorCisjZGVmaW5lIFNTVF9XUFRfU0hJTV9PRkZTRVQJMHhGQjAwMAorI2RlZmluZSBTU1RfTFBfU0hJTV9PRkZTRVQJMHhFNzAwMAorI2RlZmluZSBTU1RfV1BUX0lSQU1fT0ZGU0VUCTB4QTAwMDAKKyNkZWZpbmUgU1NUX0xQX0lSQU1fT0ZGU0VUCTB4ODAwMDAKKworI2RlZmluZSBTU1RfU0hJTV9QTV9SRUcJCTB4ODQKKworI2RlZmluZSBTU1RfSFNXX0lSQU0JMQorI2RlZmluZSBTU1RfSFNXX0RSQU0JMgorI2RlZmluZSBTU1RfSFNXX1JFR1MJMworCitzdHJ1Y3QgZG1hX2Jsb2NrX2luZm8geworCV9fbGUzMiB0eXBlOwkJLyogSVJBTS9EUkFNICovCisJX19sZTMyIHNpemU7CQkvKiBCeXRlcyAqLworCV9fbGUzMiByYW1fb2Zmc2V0OwkvKiBPZmZzZXQgaW4gSS9EUkFNICovCisJX19sZTMyIHJzdmQ7CQkvKiBSZXNlcnZlZCBmaWVsZCAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGZ3X21vZHVsZV9pbmZvIHsKKwlfX2xlMzIgcGVyc2lzdGVudF9zaXplOworCV9fbGUzMiBzY3JhdGNoX3NpemU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZndfaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtTU1RfSFNXX0ZXX1NJR05BVFVSRV9TSVpFXTsgLyogRlcgc2lnbmF0dXJlICovCisJX19sZTMyIGZpbGVfc2l6ZTsJCS8qIHNpemUgb2YgZncgbWludXMgdGhpcyBoZWFkZXIgKi8KKwlfX2xlMzIgbW9kdWxlczsJCS8qICAjIG9mIG1vZHVsZXMgKi8KKwlfX2xlMzIgZmlsZV9mb3JtYXQ7CS8qIHZlcnNpb24gb2YgaGVhZGVyIGZvcm1hdCAqLworCV9fbGUzMiByZXNlcnZlZFs0XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBmd19tb2R1bGVfaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtTU1RfSFNXX0ZXX1NJR05BVFVSRV9TSVpFXTsgLyogbW9kdWxlIHNpZ25hdHVyZSAqLworCV9fbGUzMiBtb2Rfc2l6ZTsJLyogc2l6ZSBvZiBtb2R1bGUgKi8KKwlfX2xlMzIgYmxvY2tzOwkvKiAjIG9mIGJsb2NrcyAqLworCV9fbGUxNiBwYWRkaW5nOworCV9fbGUxNiB0eXBlOwkvKiBjb2RlYyB0eXBlLCBwcCBsaWIgKi8KKwlfX2xlMzIgZW50cnlfcG9pbnQ7CisJc3RydWN0IGZ3X21vZHVsZV9pbmZvIGluZm87Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdGF0aWMgdm9pZCBoc3dfZnJlZShzdHJ1Y3Qgc3N0X2RzcCAqc3N0KTsKKworc3RhdGljIGludCBoc3dfcGFyc2VfbW9kdWxlKHN0cnVjdCBzc3RfZHNwICpkc3AsIHN0cnVjdCBzc3RfZncgKmZ3LAorCXN0cnVjdCBmd19tb2R1bGVfaGVhZGVyICptb2R1bGUpCit7CisJc3RydWN0IGRtYV9ibG9ja19pbmZvICpibG9jazsKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kOworCXN0cnVjdCBzc3RfbW9kdWxlX2RhdGEgYmxvY2tfZGF0YTsKKwlzdHJ1Y3Qgc3N0X21vZHVsZV90ZW1wbGF0ZSB0ZW1wbGF0ZTsKKwlpbnQgY291bnQ7CisJdm9pZCBfX2lvbWVtICpyYW07CisKKwkvKiBUT0RPOiBhbGxvd2VkIG1vZHVsZSB0eXBlcyBuZWVkIHRvIGJlIGNvbmZpZ3VyYWJsZSAqLworCWlmIChtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfQkFTRV9GVworCQkmJiBtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfUENNX1NZU1RFTQorCQkmJiBtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfUENNCisJCSYmIG1vZHVsZS0+dHlwZSAhPSBTU1RfSFNXX01PRFVMRV9QQ01fUkVGRVJFTkNFCisJCSYmIG1vZHVsZS0+dHlwZSAhPSBTU1RfSFNXX01PRFVMRV9QQ01fQ0FQVFVSRQorCQkmJiBtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfTFBBTCkKKwkJcmV0dXJuIDA7CisKKwlkZXZfZGJnKGRzcC0+ZGV2LCAibmV3IG1vZHVsZSBzaWduIDB4JXMgc2l6ZSAweCV4IGJsb2NrcyAweCV4IHR5cGUgMHgleFxuIiwKKwkJbW9kdWxlLT5zaWduYXR1cmUsIG1vZHVsZS0+bW9kX3NpemUsCisJCW1vZHVsZS0+YmxvY2tzLCBtb2R1bGUtPnR5cGUpOworCWRldl9kYmcoZHNwLT5kZXYsICIgZW50cnlwb2ludCAweCV4XG4iLCBtb2R1bGUtPmVudHJ5X3BvaW50KTsKKwlkZXZfZGJnKGRzcC0+ZGV2LCAiIHBlcnNpc3RlbnQgMHgleCBzY3JhdGNoIDB4JXhcbiIsCisJCW1vZHVsZS0+aW5mby5wZXJzaXN0ZW50X3NpemUsIG1vZHVsZS0+aW5mby5zY3JhdGNoX3NpemUpOworCisJbWVtc2V0KCZ0ZW1wbGF0ZSwgMCwgc2l6ZW9mKHRlbXBsYXRlKSk7CisJdGVtcGxhdGUuaWQgPSBtb2R1bGUtPnR5cGU7CisJdGVtcGxhdGUuZW50cnkgPSBtb2R1bGUtPmVudHJ5X3BvaW50OworCXRlbXBsYXRlLnAuc2l6ZSA9IG1vZHVsZS0+aW5mby5wZXJzaXN0ZW50X3NpemU7CisJdGVtcGxhdGUucC50eXBlID0gU1NUX01FTV9EUkFNOworCXRlbXBsYXRlLnAuZGF0YV90eXBlID0gU1NUX0RBVEFfUDsKKwl0ZW1wbGF0ZS5zLnNpemUgPSBtb2R1bGUtPmluZm8uc2NyYXRjaF9zaXplOworCXRlbXBsYXRlLnMudHlwZSA9IFNTVF9NRU1fRFJBTTsKKwl0ZW1wbGF0ZS5zLmRhdGFfdHlwZSA9IFNTVF9EQVRBX1M7CisKKwltb2QgPSBzc3RfbW9kdWxlX25ldyhmdywgJnRlbXBsYXRlLCBOVUxMKTsKKwlpZiAobW9kID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYmxvY2sgPSAodm9pZCAqKW1vZHVsZSArIHNpemVvZigqbW9kdWxlKTsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IG1vZHVsZS0+YmxvY2tzOyBjb3VudCsrKSB7CisKKwkJaWYgKGJsb2NrLT5zaXplIDw9IDApIHsKKwkJCWRldl9lcnIoZHNwLT5kZXYsCisJCQkJImVycm9yOiBibG9jayAlZCBzaXplIGludmFsaWRcbiIsIGNvdW50KTsKKwkJCXNzdF9tb2R1bGVfZnJlZShtb2QpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlzd2l0Y2ggKGJsb2NrLT50eXBlKSB7CisJCWNhc2UgU1NUX0hTV19JUkFNOgorCQkJcmFtID0gZHNwLT5hZGRyLmxwZTsKKwkJCWJsb2NrX2RhdGEub2Zmc2V0ID0KKwkJCQlibG9jay0+cmFtX29mZnNldCArIGRzcC0+YWRkci5pcmFtX29mZnNldDsKKwkJCWJsb2NrX2RhdGEudHlwZSA9IFNTVF9NRU1fSVJBTTsKKwkJCWJyZWFrOworCQljYXNlIFNTVF9IU1dfRFJBTToKKwkJCXJhbSA9IGRzcC0+YWRkci5scGU7CisJCQlibG9ja19kYXRhLm9mZnNldCA9IGJsb2NrLT5yYW1fb2Zmc2V0OworCQkJYmxvY2tfZGF0YS50eXBlID0gU1NUX01FTV9EUkFNOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IGJhZCB0eXBlIDB4JXggZm9yIGJsb2NrIDB4JXhcbiIsCisJCQkJYmxvY2stPnR5cGUsIGNvdW50KTsKKwkJCXNzdF9tb2R1bGVfZnJlZShtb2QpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlibG9ja19kYXRhLnNpemUgPSBibG9jay0+c2l6ZTsKKwkJYmxvY2tfZGF0YS5kYXRhX3R5cGUgPSBTU1RfREFUQV9NOworCQlibG9ja19kYXRhLmRhdGEgPSAodm9pZCAqKWJsb2NrICsgc2l6ZW9mKCpibG9jayk7CisJCWJsb2NrX2RhdGEuZGF0YV9vZmZzZXQgPSBibG9ja19kYXRhLmRhdGEgLSBmdy0+ZG1hX2J1ZjsKKworCQlkZXZfZGJnKGRzcC0+ZGV2LCAiY29weSBmaXJtd2FyZSBibG9jayAlZCB0eXBlIDB4JXggIgorCQkJInNpemUgMHgleCA9PT4gcmFtICVwIG9mZnNldCAweCV4XG4iLAorCQkJY291bnQsIGJsb2NrLT50eXBlLCBibG9jay0+c2l6ZSwgcmFtLAorCQkJYmxvY2stPnJhbV9vZmZzZXQpOworCisJCXNzdF9tb2R1bGVfaW5zZXJ0X2ZpeGVkX2Jsb2NrKG1vZCwgJmJsb2NrX2RhdGEpOworCisJCWJsb2NrID0gKHZvaWQgKilibG9jayArIHNpemVvZigqYmxvY2spICsgYmxvY2stPnNpemU7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhzd19wYXJzZV9md19pbWFnZShzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncpCit7CisJc3RydWN0IGZ3X2hlYWRlciAqaGVhZGVyOworCXN0cnVjdCBzc3RfbW9kdWxlICpzY3JhdGNoOworCXN0cnVjdCBmd19tb2R1bGVfaGVhZGVyICptb2R1bGU7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IHNzdF9mdy0+ZHNwOworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBzc3RfZnctPnByaXZhdGU7CisJaW50IHJldCwgY291bnQ7CisKKwkvKiBSZWFkIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGF0YSBwb2ludGVyICovCisJaGVhZGVyID0gKHN0cnVjdCBmd19oZWFkZXIgKilzc3RfZnctPmRtYV9idWY7CisKKwkvKiB2ZXJpZnkgRlcgKi8KKwlpZiAoKHN0cm5jbXAoaGVhZGVyLT5zaWduYXR1cmUsIFNTVF9IU1dfRldfU0lHTiwgNCkgIT0gMCkgfHwKKwkJKHNzdF9mdy0+c2l6ZSAhPSBoZWFkZXItPmZpbGVfc2l6ZSArIHNpemVvZigqaGVhZGVyKSkpIHsKKwkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBpbnZhbGlkIGZ3IHNpZ24vZmlsZXNpemUgbWlzbWF0Y2hcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfZGJnKGRzcC0+ZGV2LCAiaGVhZGVyIHNpemU9MHgleCBtb2R1bGVzPTB4JXggZm10PTB4JXggc2l6ZT0lenVcbiIsCisJCWhlYWRlci0+ZmlsZV9zaXplLCBoZWFkZXItPm1vZHVsZXMsCisJCWhlYWRlci0+ZmlsZV9mb3JtYXQsIHNpemVvZigqaGVhZGVyKSk7CisKKwkvKiBwYXJzZSBlYWNoIG1vZHVsZSAqLworCW1vZHVsZSA9ICh2b2lkICopc3N0X2Z3LT5kbWFfYnVmICsgc2l6ZW9mKCpoZWFkZXIpOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGhlYWRlci0+bW9kdWxlczsgY291bnQrKykgeworCisJCS8qIG1vZHVsZSAqLworCQlyZXQgPSBoc3dfcGFyc2VfbW9kdWxlKGRzcCwgc3N0X2Z3LCBtb2R1bGUpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBpbnZhbGlkIG1vZHVsZSAlZFxuIiwgY291bnQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQltb2R1bGUgPSAodm9pZCAqKW1vZHVsZSArIHNpemVvZigqbW9kdWxlKSArIG1vZHVsZS0+bW9kX3NpemU7CisJfQorCisJLyogYWxsb2NhdGUgcGVyc2lzdGVudC9zY3JhdGNoIG1lbSByZWdpb25zICovCisJc2NyYXRjaCA9IHNzdF9tZW1fYmxvY2tfYWxsb2Nfc2NyYXRjaChkc3ApOworCWlmIChzY3JhdGNoID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc3N0X2hzd19zZXRfc2NyYXRjaF9tb2R1bGUoaHN3LCBzY3JhdGNoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaHN3X2lycShpbnQgaXJxLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSAoc3RydWN0IHNzdF9kc3AgKikgY29udGV4dDsKKwl1MzIgaXNyOworCWludCByZXQgPSBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmc3N0LT5zcGlubG9jayk7CisKKwkvKiBJbnRlcnJ1cHQgYXJyaXZlZCwgY2hlY2sgc3JjICovCisJaXNyID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBTU1RfSVNSWCk7CisJaWYgKGlzciAmIFNTVF9JU1JYX0RPTkUpIHsKKwkJdHJhY2Vfc3N0X2lycV9kb25lKGlzciwKKwkJCXNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHNzdCwgU1NUX0lNUlgpKTsKKworCQkvKiBNYXNrIERvbmUgaW50ZXJydXB0IGJlZm9yZSByZXR1cm4gKi8KKwkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0lNUlgsCisJCQlTU1RfSU1SWF9ET05FLCBTU1RfSU1SWF9ET05FKTsKKwkJcmV0ID0gSVJRX1dBS0VfVEhSRUFEOworCX0KKworCWlmIChpc3IgJiBTU1RfSVNSWF9CVVNZKSB7CisJCXRyYWNlX3NzdF9pcnFfYnVzeShpc3IsCisJCQlzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzc3QsIFNTVF9JTVJYKSk7CisKKwkJLyogTWFzayBCdXN5IGludGVycnVwdCBiZWZvcmUgcmV0dXJuICovCisJCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9JTVJYLAorCQkJU1NUX0lNUlhfQlVTWSwgU1NUX0lNUlhfQlVTWSk7CisJCXJldCA9IElSUV9XQUtFX1RIUkVBRDsKKwl9CisKKwlzcGluX3VubG9jaygmc3N0LT5zcGlubG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaHN3X2Jvb3Qoc3RydWN0IHNzdF9kc3AgKnNzdCkKK3sKKwkvKiBzZWxlY3QgU1NQMSAxOS4yTUh6IGJhc2UgY2xvY2ssIFNTUCBjbG9jayAwLCB0dXJuIG9mZiBMb3cgUG93ZXIgQ2xvY2sgKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBTU1RfQ1NSLAorCQlTU1RfQ1NSX1MxSU9DUyB8IFNTVF9DU1JfU0JDUzEgfCBTU1RfQ1NSX0xQQ1MsIDB4MCk7CisKKwkvKiBzdGFsbCBEU1AgY29yZSwgc2V0IGNsayB0byAxOTIvOTZNaHogKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LAorCQlTU1RfQ1NSLCBTU1RfQ1NSX1NUQUxMIHwgU1NUX0NTUl9EQ1NfTUFTSywKKwkJU1NUX0NTUl9TVEFMTCB8IFNTVF9DU1JfRENTKDQpKTsKKworCS8qIFNldCAyNE1IeiBNQ0xLLCBwcmV2ZW50IGxvY2FsIGNsb2NrIGdhdGluZywgZW5hYmxlIFNTUDAgY2xvY2sgKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBTU1RfQ0xLQ1RMLAorCQlTU1RfQ0xLQ1RMX01BU0sgfCBTU1RfQ0xLQ1RMX0RDUExDRyB8IFNTVF9DTEtDVExfU0NPRTAsCisJCVNTVF9DTEtDVExfTUFTSyB8IFNTVF9DTEtDVExfRENQTENHIHwgU1NUX0NMS0NUTF9TQ09FMCk7CisKKwkvKiBkaXNhYmxlIERNQSBmaW5pc2ggZnVuY3Rpb24gZm9yIFNTUDAgJiBTU1AxICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0NTUjIsIFNTVF9DU1IyX1NERkRfU1NQMSwKKwkJU1NUX0NTUjJfU0RGRF9TU1AxKTsKKworCS8qIGVuYWJsZSBETUEgZW5naW5lIDAsMSBhbGwgY2hhbm5lbHMgdG8gYWNjZXNzIGhvc3QgbWVtb3J5ICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0hETUMsCisJCVNTVF9IRE1DX0hEREExKDB4ZmYpICB8IFNTVF9IRE1DX0hEREEwKDB4ZmYpLAorCQlTU1RfSERNQ19IRERBMSgweGZmKSB8IFNTVF9IRE1DX0hEREEwKDB4ZmYpKTsKKworCS8qIGRpc2FibGUgYWxsIGNsb2NrIGdhdGluZyAqLworCXdyaXRlbCgweDAsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwyKTsKKworCS8qIHNldCBEU1AgdG8gUlVOICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0NTUiwgU1NUX0NTUl9TVEFMTCwgMHgwKTsKK30KKworc3RhdGljIHZvaWQgaHN3X3Jlc2V0KHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJLyogcHV0IERTUCBpbnRvIHJlc2V0IGFuZCBzdGFsbCAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9DU1IsCisJCVNTVF9DU1JfUlNUIHwgU1NUX0NTUl9TVEFMTCwgU1NUX0NTUl9SU1QgfCBTU1RfQ1NSX1NUQUxMKTsKKworCS8qIGtlZXAgaW4gcmVzZXQgZm9yIDEwbXMgKi8KKwltZGVsYXkoMTApOworCisJLyogdGFrZSBEU1Agb3V0IG9mIHJlc2V0IGFuZCBrZWVwIHN0YWxsZWQgZm9yIEZXIGxvYWRpbmcgKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBTU1RfQ1NSLAorCQlTU1RfQ1NSX1JTVCB8IFNTVF9DU1JfU1RBTEwsIFNTVF9DU1JfU1RBTEwpOworfQorCitzdHJ1Y3Qgc3N0X2Fkc3BfbWVtcmVnaW9uIHsKKwl1MzIgc3RhcnQ7CisJdTMyIGVuZDsKKwlpbnQgYmxvY2tzOworCWVudW0gc3N0X21lbV90eXBlIHR5cGU7Cit9OworCisvKiBseW54IHBvaW50IEFEU1AgbWVtIHJlZ2lvbnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3N0X2Fkc3BfbWVtcmVnaW9uIGxwX3JlZ2lvbltdID0geworCXsweDAwMDAwLCAweDQwMDAwLCA4LCBTU1RfTUVNX0RSQU19LCAvKiBELVNSQU0wIC0gOCAqIDMya0IgKi8KKwl7MHg0MDAwMCwgMHg4MDAwMCwgOCwgU1NUX01FTV9EUkFNfSwgLyogRC1TUkFNMSAtIDggKiAzMmtCICovCisJezB4ODAwMDAsIDB4RTAwMDAsIDEyLCBTU1RfTUVNX0lSQU19LCAvKiBJLVNSQU0gLSAxMiAqIDMya0IgKi8KK307CisKKy8qIHdpbGQgY2F0IHBvaW50IEFEU1AgbWVtIHJlZ2lvbnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3N0X2Fkc3BfbWVtcmVnaW9uIHdwdF9yZWdpb25bXSA9IHsKKwl7MHgwMDAwMCwgMHg0MDAwMCwgOCwgU1NUX01FTV9EUkFNfSwgLyogRC1TUkFNMCAtIDggKiAzMmtCICovCisJezB4NDAwMDAsIDB4ODAwMDAsIDgsIFNTVF9NRU1fRFJBTX0sIC8qIEQtU1JBTTEgLSA4ICogMzJrQiAqLworCXsweDgwMDAwLCAweEEwMDAwLCA0LCBTU1RfTUVNX0RSQU19LCAvKiBELVNSQU0yIC0gNCAqIDMya0IgKi8KKwl7MHhBMDAwMCwgMHhGMDAwMCwgMTAsIFNTVF9NRU1fSVJBTX0sIC8qIEktU1JBTSAtIDEwICogMzJrQiAqLworfTsKKworc3RhdGljIGludCBoc3dfYWNwaV9yZXNvdXJjZV9tYXAoc3RydWN0IHNzdF9kc3AgKnNzdCwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpCit7CisJLyogQURTUCBEUkFNICYgSVJBTSAqLworCXNzdC0+YWRkci5scGVfYmFzZSA9IHBkYXRhLT5scGVfYmFzZTsKKwlzc3QtPmFkZHIubHBlID0gaW9yZW1hcChwZGF0YS0+bHBlX2Jhc2UsIHBkYXRhLT5scGVfc2l6ZSk7CisJaWYgKCFzc3QtPmFkZHIubHBlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIEFEU1AgUENJIE1NSU8gY29uZmlnIHNwYWNlICovCisJc3N0LT5hZGRyLnBjaV9jZmcgPSBpb3JlbWFwKHBkYXRhLT5wY2ljZmdfYmFzZSwgcGRhdGEtPnBjaWNmZ19zaXplKTsKKwlpZiAoIXNzdC0+YWRkci5wY2lfY2ZnKSB7CisJCWlvdW5tYXAoc3N0LT5hZGRyLmxwZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFNTVCBTaGltICovCisJc3N0LT5hZGRyLnNoaW0gPSBzc3QtPmFkZHIubHBlICsgc3N0LT5hZGRyLnNoaW1fb2Zmc2V0OworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGhzd19ibG9ja19nZXRfYml0KHN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaykKK3sKKwl1MzIgYml0ID0gMCwgc2hpZnQgPSAwOworCisJc3dpdGNoIChibG9jay0+dHlwZSkgeworCWNhc2UgU1NUX01FTV9EUkFNOgorCQlzaGlmdCA9IDE2OworCQlicmVhazsKKwljYXNlIFNTVF9NRU1fSVJBTToKKwkJc2hpZnQgPSA2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwliaXQgPSAxIDw8IChibG9jay0+aW5kZXggKyBzaGlmdCk7CisKKwlyZXR1cm4gYml0OworfQorCisvKiBlbmFibGUgMzJrQiBtZW1vcnkgYmxvY2sgLSBsb2NrcyBoZWxkIGJ5IGNhbGxlciAqLworc3RhdGljIGludCBoc3dfYmxvY2tfZW5hYmxlKHN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaykKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gYmxvY2stPmRzcDsKKwl1MzIgYml0LCB2YWw7CisKKwlpZiAoYmxvY2stPnVzZXJzKysgPiAwKQorCQlyZXR1cm4gMDsKKworCWRldl9kYmcoYmxvY2stPmRzcC0+ZGV2LCAiIGVuYWJsZWQgYmxvY2sgJWQ6JWQgYXQgb2Zmc2V0IDB4JXhcbiIsCisJCWJsb2NrLT50eXBlLCBibG9jay0+aW5kZXgsIGJsb2NrLT5vZmZzZXQpOworCisJdmFsID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDApOworCWJpdCA9IGhzd19ibG9ja19nZXRfYml0KGJsb2NrKTsKKwl3cml0ZWwodmFsICYgfmJpdCwgc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDApOworCisJLyogd2FpdCAxOCBEU1AgY2xvY2sgdGlja3MgKi8KKwl1ZGVsYXkoMTApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRpc2FibGUgMzJrQiBtZW1vcnkgYmxvY2sgLSBsb2NrcyBoZWxkIGJ5IGNhbGxlciAqLworc3RhdGljIGludCBoc3dfYmxvY2tfZGlzYWJsZShzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqYmxvY2spCit7CisJc3RydWN0IHNzdF9kc3AgKnNzdCA9IGJsb2NrLT5kc3A7CisJdTMyIGJpdCwgdmFsOworCisJaWYgKC0tYmxvY2stPnVzZXJzID4gMCkKKwkJcmV0dXJuIDA7CisKKwlkZXZfZGJnKGJsb2NrLT5kc3AtPmRldiwgIiBkaXNhYmxlZCBibG9jayAlZDolZCBhdCBvZmZzZXQgMHgleFxuIiwKKwkJYmxvY2stPnR5cGUsIGJsb2NrLT5pbmRleCwgYmxvY2stPm9mZnNldCk7CisKKwl2YWwgPSByZWFkbChzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMCk7CisJYml0ID0gaHN3X2Jsb2NrX2dldF9iaXQoYmxvY2spOworCXdyaXRlbCh2YWwgfCBiaXQsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNzdF9ibG9ja19vcHMgc3N0X2hzd19vcHMgPSB7CisJLmVuYWJsZSA9IGhzd19ibG9ja19lbmFibGUsCisJLmRpc2FibGUgPSBoc3dfYmxvY2tfZGlzYWJsZSwKK307CisKK3N0YXRpYyBpbnQgaHN3X2VuYWJsZV9zaGltKHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJaW50IHRyaWVzID0gMTA7CisJdTMyIHJlZzsKKworCS8qIGVuYWJsZSBzaGltICovCisJcmVnID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfU0hJTV9QTV9SRUcpOworCXdyaXRlbChyZWcgJiB+MHgzLCBzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9TSElNX1BNX1JFRyk7CisKKwkvKiBjaGVjayB0aGF0IEFEU1Agc2hpbSBpcyBlbmFibGVkICovCisJd2hpbGUgKHRyaWVzLS0pIHsKKwkJcmVnID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBTU1RfQ1NSKTsKKwkJaWYgKHJlZyAhPSAweGZmZmZmZmZmKQorCQkJcmV0dXJuIDA7CisKKwkJbXNsZWVwKDEpOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGhzd19pbml0KHN0cnVjdCBzc3RfZHNwICpzc3QsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQoreworCWNvbnN0IHN0cnVjdCBzc3RfYWRzcF9tZW1yZWdpb24gKnJlZ2lvbjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IHJldCA9IC1FTk9ERVYsIGksIGosIHJlZ2lvbl9jb3VudDsKKwl1MzIgb2Zmc2V0LCBzaXplOworCisJZGV2ID0gc3N0LT5kZXY7CisKKwlzd2l0Y2ggKHNzdC0+aWQpIHsKKwljYXNlIFNTVF9ERVZfSURfTFlOWF9QT0lOVDoKKwkJcmVnaW9uID0gbHBfcmVnaW9uOworCQlyZWdpb25fY291bnQgPSBBUlJBWV9TSVpFKGxwX3JlZ2lvbik7CisJCXNzdC0+YWRkci5pcmFtX29mZnNldCA9IFNTVF9MUF9JUkFNX09GRlNFVDsKKwkJc3N0LT5hZGRyLnNoaW1fb2Zmc2V0ID0gU1NUX0xQX1NISU1fT0ZGU0VUOworCQlicmVhazsKKwljYXNlIFNTVF9ERVZfSURfV0lMRENBVF9QT0lOVDoKKwkJcmVnaW9uID0gd3B0X3JlZ2lvbjsKKwkJcmVnaW9uX2NvdW50ID0gQVJSQVlfU0laRSh3cHRfcmVnaW9uKTsKKwkJc3N0LT5hZGRyLmlyYW1fb2Zmc2V0ID0gU1NUX1dQVF9JUkFNX09GRlNFVDsKKwkJc3N0LT5hZGRyLnNoaW1fb2Zmc2V0ID0gU1NUX1dQVF9TSElNX09GRlNFVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJlcnJvcjogZmFpbGVkIHRvIGdldCBtZW0gcmVzb3VyY2VzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBoc3dfYWNwaV9yZXNvdXJjZV9tYXAoc3N0LCBwZGF0YSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJlcnJvcjogZmFpbGVkIHRvIG1hcCByZXNvdXJjZXNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGVuYWJsZSB0aGUgRFNQIFNISU0gKi8KKwlyZXQgPSBoc3dfZW5hYmxlX3NoaW0oc3N0KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImVycm9yOiBmYWlsZWQgdG8gc2V0IERTUCBEMCBhbmQgcmVzZXQgU0hJTVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudChkZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBFbmFibGUgSW50ZXJydXB0IGZyb20gYm90aCBzaWRlcyAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9JTVJYLCAweDMsIDB4MCk7CisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0lNUkQsCisJCSgweDMgfCAweDEgPDwgMTYgfCAweDMgPDwgMjEpLCAweDApOworCisJLyogcmVnaXN0ZXIgRFNQIG1lbW9yeSBibG9ja3MgLSBpZGVhbGx5IHdlIHNob3VsZCBnZXQgdGhpcyBmcm9tIEFDUEkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcmVnaW9uX2NvdW50OyBpKyspIHsKKwkJb2Zmc2V0ID0gcmVnaW9uW2ldLnN0YXJ0OworCQlzaXplID0gKHJlZ2lvbltpXS5lbmQgLSByZWdpb25baV0uc3RhcnQpIC8gcmVnaW9uW2ldLmJsb2NrczsKKworCQkvKiByZWdpc3RlciBpbmRpdmlkdWFsIG1lbW9yeSBibG9ja3MgKi8KKwkJZm9yIChqID0gMDsgaiA8IHJlZ2lvbltpXS5ibG9ja3M7IGorKykgeworCQkJc3N0X21lbV9ibG9ja19yZWdpc3Rlcihzc3QsIG9mZnNldCwgc2l6ZSwKKwkJCQlyZWdpb25baV0udHlwZSwgJnNzdF9oc3dfb3BzLCBqLCBzc3QpOworCQkJb2Zmc2V0ICs9IHNpemU7CisJCX0KKwl9CisKKwkvKiBzZXQgZGVmYXVsdCBwb3dlciBnYXRpbmcgbWFzayAqLworCXdyaXRlbCgweDAsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoc3dfZnJlZShzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQoreworCXNzdF9tZW1fYmxvY2tfdW5yZWdpc3Rlcl9hbGwoc3N0KTsKKwlpb3VubWFwKHNzdC0+YWRkci5scGUpOworCWlvdW5tYXAoc3N0LT5hZGRyLnBjaV9jZmcpOworfQorCitzdHJ1Y3Qgc3N0X29wcyBoYXN3ZWxsX29wcyA9IHsKKwkucmVzZXQgPSBoc3dfcmVzZXQsCisJLmJvb3QgPSBoc3dfYm9vdCwKKwkud3JpdGUgPSBzc3Rfc2hpbTMyX3dyaXRlLAorCS5yZWFkID0gc3N0X3NoaW0zMl9yZWFkLAorCS53cml0ZTY0ID0gc3N0X3NoaW0zMl93cml0ZTY0LAorCS5yZWFkNjQgPSBzc3Rfc2hpbTMyX3JlYWQ2NCwKKwkucmFtX3JlYWQgPSBzc3RfbWVtY3B5X2Zyb21pb18zMiwKKwkucmFtX3dyaXRlID0gc3N0X21lbWNweV90b2lvXzMyLAorCS5pcnFfaGFuZGxlciA9IGhzd19pcnEsCisJLmluaXQgPSBoc3dfaW5pdCwKKwkuZnJlZSA9IGhzd19mcmVlLAorCS5wYXJzZV9mdyA9IGhzd19wYXJzZV9md19pbWFnZSwKK307CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtaXBjLmMgYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtaXBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ2YmI0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtaGFzd2VsbC1pcGMuYwpAQCAtMCwwICsxLDE3ODUgQEAKKy8qCisgKiAgSW50ZWwgU1NUIEhhc3dlbGwvQnJvYWR3ZWxsIElQQyBTdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKworI2luY2x1ZGUgInNzdC1oYXN3ZWxsLWlwYy5oIgorI2luY2x1ZGUgInNzdC1kc3AuaCIKKyNpbmNsdWRlICJzc3QtZHNwLXByaXYuaCIKKworLyogR2xvYmFsIE1lc3NhZ2UgLSBHZW5lcmljICovCisjZGVmaW5lIElQQ19HTEJfVFlQRV9TSElGVAkyNAorI2RlZmluZSBJUENfR0xCX1RZUEVfTUFTSwkoMHgxZiA8PCBJUENfR0xCX1RZUEVfU0hJRlQpCisjZGVmaW5lIElQQ19HTEJfVFlQRSh4KQkJKHggPDwgSVBDX0dMQl9UWVBFX1NISUZUKQorCisvKiBHbG9iYWwgTWVzc2FnZSAtIFJlcGx5ICovCisjZGVmaW5lIElQQ19HTEJfUkVQTFlfU0hJRlQJMAorI2RlZmluZSBJUENfR0xCX1JFUExZX01BU0sJKDB4MWYgPDwgSVBDX0dMQl9SRVBMWV9TSElGVCkKKyNkZWZpbmUgSVBDX0dMQl9SRVBMWV9UWVBFKHgpCSh4IDw8IElQQ19HTEJfUkVQTFlfVFlQRV9TSElGVCkKKworLyogU3RyZWFtIE1lc3NhZ2UgLSBHZW5lcmljICovCisjZGVmaW5lIElQQ19TVFJfVFlQRV9TSElGVAkyMAorI2RlZmluZSBJUENfU1RSX1RZUEVfTUFTSwkoMHhmIDw8IElQQ19TVFJfVFlQRV9TSElGVCkKKyNkZWZpbmUgSVBDX1NUUl9UWVBFKHgpCQkoeCA8PCBJUENfU1RSX1RZUEVfU0hJRlQpCisjZGVmaW5lIElQQ19TVFJfSURfU0hJRlQJMTYKKyNkZWZpbmUgSVBDX1NUUl9JRF9NQVNLCQkoMHhmIDw8IElQQ19TVFJfSURfU0hJRlQpCisjZGVmaW5lIElQQ19TVFJfSUQoeCkJCSh4IDw8IElQQ19TVFJfSURfU0hJRlQpCisKKy8qIFN0cmVhbSBNZXNzYWdlIC0gUmVwbHkgKi8KKyNkZWZpbmUgSVBDX1NUUl9SRVBMWV9TSElGVAkwCisjZGVmaW5lIElQQ19TVFJfUkVQTFlfTUFTSwkoMHgxZiA8PCBJUENfU1RSX1JFUExZX1NISUZUKQorCisvKiBTdHJlYW0gU3RhZ2UgTWVzc2FnZSAtIEdlbmVyaWMgKi8KKyNkZWZpbmUgSVBDX1NUR19UWVBFX1NISUZUCTEyCisjZGVmaW5lIElQQ19TVEdfVFlQRV9NQVNLCSgweGYgPDwgSVBDX1NUR19UWVBFX1NISUZUKQorI2RlZmluZSBJUENfU1RHX1RZUEUoeCkJCSh4IDw8IElQQ19TVEdfVFlQRV9TSElGVCkKKyNkZWZpbmUgSVBDX1NUR19JRF9TSElGVAkxMAorI2RlZmluZSBJUENfU1RHX0lEX01BU0sJCSgweDMgPDwgSVBDX1NUR19JRF9TSElGVCkKKyNkZWZpbmUgSVBDX1NUR19JRCh4KQkJKHggPDwgSVBDX1NUR19JRF9TSElGVCkKKworLyogU3RyZWFtIFN0YWdlIE1lc3NhZ2UgLSBSZXBseSAqLworI2RlZmluZSBJUENfU1RHX1JFUExZX1NISUZUCTAKKyNkZWZpbmUgSVBDX1NUR19SRVBMWV9NQVNLCSgweDFmIDw8IElQQ19TVEdfUkVQTFlfU0hJRlQpCisKKy8qIERlYnVnIExvZyBNZXNzYWdlIC0gR2VuZXJpYyAqLworI2RlZmluZSBJUENfTE9HX09QX1NISUZUCTIwCisjZGVmaW5lIElQQ19MT0dfT1BfTUFTSwkJKDB4ZiA8PCBJUENfTE9HX09QX1NISUZUKQorI2RlZmluZSBJUENfTE9HX09QX1RZUEUoeCkJKHggPDwgSVBDX0xPR19PUF9TSElGVCkKKyNkZWZpbmUgSVBDX0xPR19JRF9TSElGVAkxNgorI2RlZmluZSBJUENfTE9HX0lEX01BU0sJCSgweGYgPDwgSVBDX0xPR19JRF9TSElGVCkKKyNkZWZpbmUgSVBDX0xPR19JRCh4KQkJKHggPDwgSVBDX0xPR19JRF9TSElGVCkKKworLyogSVBDIG1lc3NhZ2UgdGltZW91dCAobXNlY3MpICovCisjZGVmaW5lIElQQ19USU1FT1VUX01TRUNTCTMwMAorI2RlZmluZSBJUENfQk9PVF9NU0VDUwkJMjAwCisjZGVmaW5lIElQQ19NU0dfV0FJVAkJMAorI2RlZmluZSBJUENfTVNHX05PV0FJVAkJMQorCisvKiBGaXJtd2FyZSBSZWFkeSBNZXNzYWdlICovCisjZGVmaW5lIElQQ19GV19SRUFEWQkJKDB4MSA8PCAyOSkKKyNkZWZpbmUgSVBDX1NUQVRVU19NQVNLCQkoMHgzIDw8IDMwKQorCisjZGVmaW5lIElQQ19FTVBUWV9MSVNUX1NJWkUJOAorI2RlZmluZSBJUENfTUFYX1NUUkVBTVMJCTQKKworLyogTWFpbGJveCAqLworI2RlZmluZSBJUENfTUFYX01BSUxCT1hfQllURVMJMjU2CisKKy8qIEdsb2JhbCBNZXNzYWdlIC0gVHlwZXMgYW5kIFJlcGxpZXMgKi8KK2VudW0gaXBjX2dsYl90eXBlIHsKKwlJUENfR0xCX0dFVF9GV19WRVJTSU9OID0gMCwJCS8qIFJldHJpZXZlcyBmaXJtd2FyZSB2ZXJzaW9uICovCisJSVBDX0dMQl9QRVJGT1JNQU5DRV9NT05JVE9SID0gMSwJLyogUGVyZm9ybWFuY2UgbW9uaXRvcmluZyBhY3Rpb25zICovCisJSVBDX0dMQl9BTExPQ0FURV9TVFJFQU0gPSAzLAkJLyogUmVxdWVzdCB0byBhbGxvY2F0ZSBuZXcgc3RyZWFtICovCisJSVBDX0dMQl9GUkVFX1NUUkVBTSA9IDQsCQkvKiBSZXF1ZXN0IHRvIGZyZWUgc3RyZWFtICovCisJSVBDX0dMQl9HRVRfRldfQ0FQQUJJTElUSUVTID0gNSwJLyogUmV0cmlldmVzIGZpcm13YXJlIGNhcGFiaWxpdGllcyAqLworCUlQQ19HTEJfU1RSRUFNX01FU1NBR0UgPSA2LAkJLyogTWVzc2FnZSBkaXJlY3RlZCB0byBzdHJlYW0gb3IgaXRzIHN0YWdlcyAqLworCS8qIFJlcXVlc3QgdG8gc3RvcmUgZmlybXdhcmUgY29udGV4dCBkdXJpbmcgRDAtPkQzIHRyYW5zaXRpb24gKi8KKwlJUENfR0xCX1JFUVVFU1RfRFVNUCA9IDcsCisJLyogUmVxdWVzdCB0byByZXN0b3JlIGZpcm13YXJlIGNvbnRleHQgZHVyaW5nIEQzLT5EMCB0cmFuc2l0aW9uICovCisJSVBDX0dMQl9SRVNUT1JFX0NPTlRFWFQgPSA4LAorCUlQQ19HTEJfR0VUX0RFVklDRV9GT1JNQVRTID0gOSwJCS8qIFNldCBkZXZpY2UgZm9ybWF0ICovCisJSVBDX0dMQl9TRVRfREVWSUNFX0ZPUk1BVFMgPSAxMCwJLyogR2V0IGRldmljZSBmb3JtYXQgKi8KKwlJUENfR0xCX1NIT1JUX1JFUExZID0gMTEsCisJSVBDX0dMQl9FTlRFUl9EWF9TVEFURSA9IDEyLAorCUlQQ19HTEJfR0VUX01JWEVSX1NUUkVBTV9JTkZPID0gMTMsCS8qIFJlcXVlc3QgbWl4ZXIgc3RyZWFtIHBhcmFtcyAqLworCUlQQ19HTEJfREVCVUdfTE9HX01FU1NBR0UgPSAxNCwJCS8qIE1lc3NhZ2UgdG8gb3IgZnJvbSB0aGUgZGVidWcgbG9nZ2VyLiAqLworCUlQQ19HTEJfUkVRVUVTVF9UUkFOU0ZFUiA9IDE2LCAJCS8qIDwgUmVxdWVzdCBUcmFuc2ZlciBmb3IgaG9zdCAqLworCUlQQ19HTEJfTUFYX0lQQ19NRVNTQUdFX1RZUEUgPSAxNywJLyogTWF4aW11bSBtZXNzYWdlIG51bWJlciAqLworfTsKKworZW51bSBpcGNfZ2xiX3JlcGx5IHsKKwlJUENfR0xCX1JFUExZX1NVQ0NFU1MgPSAwLAkJLyogVGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gKi8KKwlJUENfR0xCX1JFUExZX0VSUk9SX0lOVkFMSURfUEFSQU0gPSAxLAkvKiBJbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkLiAqLworCUlQQ19HTEJfUkVQTFlfVU5LTk9XTl9NRVNTQUdFX1RZUEUgPSAyLAkvKiBVa25vd24gbWVzc2FnZSB0eXBlIHdhcyByZXNjZWl2ZWQuICovCisJSVBDX0dMQl9SRVBMWV9PVVRfT0ZfUkVTT1VSQ0VTID0gMywJLyogTm8gcmVzb3VyY2VzIHRvIHNhdGlzZnkgdGhlIHJlcXVlc3QuICovCisJSVBDX0dMQl9SRVBMWV9CVVNZID0gNCwJCQkvKiBUaGUgc3lzdGVtIG9yIHJlc291cmNlIGlzIGJ1c3kuICovCisJSVBDX0dMQl9SRVBMWV9QRU5ESU5HID0gNSwJCS8qIFRoZSBhY3Rpb24gd2FzIHNjaGVkdWxlZCBmb3IgcHJvY2Vzc2luZy4gICovCisJSVBDX0dMQl9SRVBMWV9GQUlMVVJFID0gNiwJCS8qIENyaXRpY2FsIGVycm9yIGhhcHBlbmVkLiAqLworCUlQQ19HTEJfUkVQTFlfSU5WQUxJRF9SRVFVRVNUID0gNywJLyogUmVxdWVzdCBjYW4gbm90IGJlIGNvbXBsZXRlZC4gKi8KKwlJUENfR0xCX1JFUExZX1NUQUdFX1VOSU5JVElBTElaRUQgPSA4LAkvKiBQcm9jZXNzaW5nIHN0YWdlIHdhcyB1bmluaXRpYWxpemVkLiAqLworCUlQQ19HTEJfUkVQTFlfTk9UX0ZPVU5EID0gOSwJCS8qIFJlcXVpcmVkIHJlc291cmNlIGNhbiBub3QgYmUgZm91bmQuICovCisJSVBDX0dMQl9SRVBMWV9TT1VSQ0VfTk9UX1NUQVJURUQgPSAxMCwJLyogU291cmNlIHdhcyBub3Qgc3RhcnRlZC4gKi8KK307CisKKy8qIFN0cmVhbSBNZXNzYWdlIC0gVHlwZXMgKi8KK2VudW0gaXBjX3N0cl9vcGVyYXRpb24geworCUlQQ19TVFJfUkVTRVQgPSAwLAorCUlQQ19TVFJfUEFVU0UgPSAxLAorCUlQQ19TVFJfUkVTVU1FID0gMiwKKwlJUENfU1RSX1NUQUdFX01FU1NBR0UgPSAzLAorCUlQQ19TVFJfTk9USUZJQ0FUSU9OID0gNCwKKwlJUENfU1RSX01BWF9NRVNTQUdFCit9OworCisvKiBTdHJlYW0gU3RhZ2UgTWVzc2FnZSBUeXBlcyAqLworZW51bSBpcGNfc3RnX29wZXJhdGlvbiB7CisJSVBDX1NUR19HRVRfVk9MVU1FID0gMCwKKwlJUENfU1RHX1NFVF9WT0xVTUUsCisJSVBDX1NUR19TRVRfV1JJVEVfUE9TSVRJT04sCisJSVBDX1NUR19TRVRfRlhfRU5BQkxFLAorCUlQQ19TVEdfU0VUX0ZYX0RJU0FCTEUsCisJSVBDX1NUR19TRVRfRlhfR0VUX1BBUkFNLAorCUlQQ19TVEdfU0VUX0ZYX1NFVF9QQVJBTSwKKwlJUENfU1RHX1NFVF9GWF9HRVRfSU5GTywKKwlJUENfU1RHX01VVEVfTE9PUEJBQ0ssCisJSVBDX1NUR19NQVhfTUVTU0FHRQorfTsKKworLyogU3RyZWFtIFN0YWdlIE1lc3NhZ2UgVHlwZXMgRm9yIE5vdGlmaWNhdGlvbiovCitlbnVtIGlwY19zdGdfb3BlcmF0aW9uX25vdGlmeSB7CisJSVBDX1BPU0lUSU9OX0NIQU5HRUQgPSAwLAorCUlQQ19TVEdfR0xJVENILAorCUlQQ19TVEdfTUFYX05PVElGWQorfTsKKworZW51bSBpcGNfZ2xpdGNoX3R5cGUgeworCUlQQ19HTElUQ0hfVU5ERVJSVU4gPSAxLAorCUlQQ19HTElUQ0hfREVDT0RFUl9FUlJPUiwKKwlJUENfR0xJVENIX0RPVUJMRURfV1JJVEVfUE9TLAorCUlQQ19HTElUQ0hfTUFYCit9OworCisvKiBEZWJ1ZyBDb250cm9sICovCitlbnVtIGlwY19kZWJ1Z19vcGVyYXRpb24geworCUlQQ19ERUJVR19FTkFCTEVfTE9HID0gMCwKKwlJUENfREVCVUdfRElTQUJMRV9MT0cgPSAxLAorCUlQQ19ERUJVR19SRVFVRVNUX0xPR19EVU1QID0gMiwKKwlJUENfREVCVUdfTk9USUZZX0xPR19EVU1QID0gMywKKwlJUENfREVCVUdfTUFYX0RFQlVHX0xPRworfTsKKworLyogRmlybXdhcmUgUmVhZHkgKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19md19yZWFkeSB7CisJdTMyIGluYm94X29mZnNldDsKKwl1MzIgb3V0Ym94X29mZnNldDsKKwl1MzIgaW5ib3hfc2l6ZTsKKwl1MzIgb3V0Ym94X3NpemU7CisJdTMyIGZ3X2luZm9fc2l6ZTsKKwl1OCBmd19pbmZvWzFdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGlwY19tZXNzYWdlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdTMyIGhlYWRlcjsKKworCS8qIGRpcmVjdGlvbiB3cnQgaG9zdCBDUFUgKi8KKwljaGFyIHR4X2RhdGFbSVBDX01BWF9NQUlMQk9YX0JZVEVTXTsKKwlzaXplX3QgdHhfc2l6ZTsKKwljaGFyIHJ4X2RhdGFbSVBDX01BWF9NQUlMQk9YX0JZVEVTXTsKKwlzaXplX3Qgcnhfc2l6ZTsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOworCWJvb2wgcGVuZGluZzsKKwlib29sIGNvbXBsZXRlOworCWJvb2wgd2FpdDsKKwlpbnQgZXJybm87Cit9OworCitzdHJ1Y3Qgc3N0X2hzd19zdHJlYW07CitzdHJ1Y3Qgc3N0X2hzdzsKKworLyogU3RyZWFtIGluZm9tYXRpb24gKi8KK3N0cnVjdCBzc3RfaHN3X3N0cmVhbSB7CisJLyogY29uZmlndXJhdGlvbiAqLworCXN0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fYWxsb2NfcmVxIHJlcXVlc3Q7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9hbGxvY19yZXBseSByZXBseTsKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2ZyZWVfcmVxIGZyZWVfcmVxOworCisJLyogTWl4ZXIgaW5mbyAqLworCXUzMiBtdXRlX3ZvbHVtZVtTU1RfSFNXX05PX0NIQU5ORUxTXTsKKwl1MzIgbXV0ZVtTU1RfSFNXX05PX0NIQU5ORUxTXTsKKworCS8qIHJ1bnRpbWUgaW5mbyAqLworCXN0cnVjdCBzc3RfaHN3ICpoc3c7CisJaW50IGhvc3RfaWQ7CisJYm9vbCBjb21taXRlZDsKKwlib29sIHJ1bm5pbmc7CisKKwkvKiBOb3RpZmljYXRpb24gd29yayAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBub3RpZnlfd29yazsKKwl1MzIgaGVhZGVyOworCisJLyogUG9zaXRpb24gaW5mbyBmcm9tIERTUCAqLworCXN0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fc2V0X3Bvc2l0aW9uIHdwb3M7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9nZXRfcG9zaXRpb24gcnBvczsKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2dsaXRjaF9wb3NpdGlvbiBnbGl0Y2g7CisKKwkvKiBWb2x1bWUgaW5mbyAqLworCXN0cnVjdCBzc3RfaHN3X2lwY192b2x1bWVfcmVxIHZvbF9yZXE7CisKKwkvKiBkcml2ZXIgY2FsbGJhY2sgKi8KKwl1MzIgKCpub3RpZnlfcG9zaXRpb24pKHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhKTsKKwl2b2lkICpwZGF0YTsKKworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKK307CisKKy8qIEZXIGxvZyByaW5nIGluZm9ybWF0aW9uICovCitzdHJ1Y3Qgc3N0X2hzd19sb2dfc3RyZWFtIHsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCXVuc2lnbmVkIGNoYXIgKmRtYV9hcmVhOworCXVuc2lnbmVkIGNoYXIgKnJpbmdfZGVzY3I7CisJaW50IHBhZ2VzOworCWludCBzaXplOworCisJLyogTm90aWZpY2F0aW9uIHdvcmsgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgbm90aWZ5X3dvcms7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZGVyc193YWl0X3E7CisJc3RydWN0IG11dGV4IHJ3X211dGV4OworCisJdTMyIGxhc3RfcG9zOworCXUzMiBjdXJyX3BvczsKKwl1MzIgcmVhZGVyX3BvczsKKworCS8qIGZ3IGxvZyBjb25maWcgKi8KKwl1MzIgY29uZmlnW1NTVF9IU1dfRldfTE9HX0NPTkZJR19EV09SRFNdOworCisJc3RydWN0IHNzdF9oc3cgKmhzdzsKK307CisKKy8qIFNTVCBIYXN3ZWxsIElQQyBkYXRhICovCitzdHJ1Y3Qgc3N0X2hzdyB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBzc3RfZHNwICpkc3A7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldl9wY207CisKKwkvKiBGVyBjb25maWcgKi8KKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfZndfcmVhZHkgZndfcmVhZHk7CisJc3RydWN0IHNzdF9oc3dfaXBjX2Z3X3ZlcnNpb24gdmVyc2lvbjsKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqc2NyYXRjaDsKKwlib29sIGZ3X2RvbmU7CisKKwkvKiBzdHJlYW0gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHN0cmVhbV9saXN0OworCisJLyogZ2xvYmFsIG1peGVyICovCisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9pbmZvX3JlcGx5IG1peGVyX2luZm87CisJZW51bSBzc3RfaHN3X3ZvbHVtZV9jdXJ2ZSBjdXJ2ZV90eXBlOworCXUzMiBjdXJ2ZV9kdXJhdGlvbjsKKwl1MzIgbXV0ZVtTU1RfSFNXX05PX0NIQU5ORUxTXTsKKwl1MzIgbXV0ZV92b2x1bWVbU1NUX0hTV19OT19DSEFOTkVMU107CisKKwkvKiBEWCAqLworCXN0cnVjdCBzc3RfaHN3X2lwY19keF9yZXBseSBkeDsKKworCS8qIGJvb3QgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBib290X3dhaXQ7CisJYm9vbCBib290X2NvbXBsZXRlOworCWJvb2wgc2h1dGRvd247CisKKwkvKiBJUEMgbWVzc2FnaW5nICovCisJc3RydWN0IGxpc3RfaGVhZCB0eF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgcnhfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVtcHR5X2xpc3Q7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF90eHE7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0eF90aHJlYWQ7CisJc3RydWN0IGt0aHJlYWRfd29ya2VyIGt3b3JrZXI7CisJc3RydWN0IGt0aHJlYWRfd29yayBrd29yazsKKwlib29sIHBlbmRpbmc7CisJc3RydWN0IGlwY19tZXNzYWdlICptc2c7CisKKwkvKiBGVyBsb2cgc3RyZWFtICovCisJc3RydWN0IHNzdF9oc3dfbG9nX3N0cmVhbSBsb2dfc3RyZWFtOworfTsKKworI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2hzd2Fkc3AuaD4KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2dldF9nbG9iYWxfdHlwZSh1MzIgbXNnKQoreworCXJldHVybiAobXNnICYgSVBDX0dMQl9UWVBFX01BU0spID4+IElQQ19HTEJfVFlQRV9TSElGVDsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2dldF9nbG9iYWxfcmVwbHkodTMyIG1zZykKK3sKKwlyZXR1cm4gKG1zZyAmIElQQ19HTEJfUkVQTFlfTUFTSykgPj4gSVBDX0dMQl9SRVBMWV9TSElGVDsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2dldF9zdHJlYW1fdHlwZSh1MzIgbXNnKQoreworCXJldHVybiAobXNnICYgSVBDX1NUUl9UWVBFX01BU0spID4+ICBJUENfU1RSX1RZUEVfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19nZXRfc3RhZ2VfdHlwZSh1MzIgbXNnKQoreworCXJldHVybiAobXNnICYgSVBDX1NUR19UWVBFX01BU0spID4+ICBJUENfU1RHX1RZUEVfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19zZXRfc3RhZ2VfdHlwZSh1MzIgbXNnLCB1MzIgdHlwZSkKK3sKKwlyZXR1cm4gKG1zZyAmIH5JUENfU1RHX1RZUEVfTUFTSykgKworCQkodHlwZSA8PCBJUENfU1RHX1RZUEVfU0hJRlQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfZ2V0X3N0cmVhbV9pZCh1MzIgbXNnKQoreworCXJldHVybiAobXNnICYgSVBDX1NUUl9JRF9NQVNLKSA+PiAgSVBDX1NUUl9JRF9TSElGVDsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2dldF9ub3RpZnlfcmVhc29uKHUzMiBtc2cpCit7CisJcmV0dXJuIChtc2cgJiBJUENfU1RHX1RZUEVfTUFTSykgPj4gSVBDX1NUR19UWVBFX1NISUZUOworfQorCit1MzIgY3JlYXRlX2NoYW5uZWxfbWFwKGVudW0gc3N0X2hzd19jaGFubmVsX2NvbmZpZyBjb25maWcpCit7CisJc3dpdGNoIChjb25maWcpIHsKKwljYXNlIFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfTU9OTzoKKwkJcmV0dXJuICgweEZGRkZGRkYwIHwgU1NUX0hTV19DSEFOTkVMX0NFTlRFUik7CisJY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHX1NURVJFTzoKKwkJcmV0dXJuICgweEZGRkZGRjAwIHwgU1NUX0hTV19DSEFOTkVMX0xFRlQKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVCA8PCA0KSk7CisJY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzJfUE9JTlRfMToKKwkJcmV0dXJuICgweEZGRkZGMDAwIHwgU1NUX0hTV19DSEFOTkVMX0xFRlQKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVCA8PCA0KQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX0xGRSA8PCA4ICkpOworCWNhc2UgU1NUX0hTV19DSEFOTkVMX0NPTkZJR18zX1BPSU5UXzA6CisJCXJldHVybiAoMHhGRkZGRjAwMCB8IFNTVF9IU1dfQ0hBTk5FTF9MRUZUCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfQ0VOVEVSIDw8IDQpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfUklHSFQgPDwgOCkpOworCWNhc2UgU1NUX0hTV19DSEFOTkVMX0NPTkZJR18zX1BPSU5UXzE6CisJCXJldHVybiAoMHhGRkZGMDAwMCB8IFNTVF9IU1dfQ0hBTk5FTF9MRUZUCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfQ0VOVEVSIDw8IDQpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfUklHSFQgPDwgOCkKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9MRkUgPDwgMTIpKTsKKwljYXNlIFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfUVVBVFJPOgorCQlyZXR1cm4gKDB4RkZGRjAwMDAgfCBTU1RfSFNXX0NIQU5ORUxfTEVGVAorCQkJfCAoU1NUX0hTV19DSEFOTkVMX1JJR0hUIDw8IDQpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfTEVGVF9TVVJST1VORCA8PCA4KQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX1JJR0hUX1NVUlJPVU5EIDw8IDEyKSk7CisJY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzRfUE9JTlRfMDoKKwkJcmV0dXJuICgweEZGRkYwMDAwIHwgU1NUX0hTV19DSEFOTkVMX0xFRlQKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9DRU5URVIgPDwgNCkKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVCA8PCA4KQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX0NFTlRFUl9TVVJST1VORCA8PCAxMikpOworCWNhc2UgU1NUX0hTV19DSEFOTkVMX0NPTkZJR181X1BPSU5UXzA6CisJCXJldHVybiAoMHhGRkYwMDAwMCB8IFNTVF9IU1dfQ0hBTk5FTF9MRUZUCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfQ0VOVEVSIDw8IDQpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfUklHSFQgPDwgOCkKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9MRUZUX1NVUlJPVU5EIDw8IDEyKQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX1JJR0hUX1NVUlJPVU5EIDw8IDE2KSk7CisJY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzVfUE9JTlRfMToKKwkJcmV0dXJuICgweEZGMDAwMDAwIHwgU1NUX0hTV19DSEFOTkVMX0NFTlRFUgorCQkJfCAoU1NUX0hTV19DSEFOTkVMX0xFRlQgPDwgNCkKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVCA8PCA4KQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX0xFRlRfU1VSUk9VTkQgPDwgMTIpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfUklHSFRfU1VSUk9VTkQgPDwgMTYpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfTEZFIDw8IDIwKSk7CisJY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHX0RVQUxfTU9OTzoKKwkJcmV0dXJuICgweEZGRkZGRjAwIHwgU1NUX0hTV19DSEFOTkVMX0xFRlQKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9MRUZUIDw8IDQpKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMHhGRkZGRkZGRjsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKmdldF9zdHJlYW1fYnlfaWQoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlpbnQgc3RyZWFtX2lkKQoreworCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdHJlYW0sICZoc3ctPnN0cmVhbV9saXN0LCBub2RlKSB7CisJCWlmIChzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCA9PSBzdHJlYW1faWQpCisJCQlyZXR1cm4gc3RyZWFtOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBpcGNfc2hpbV9kYmcoc3RydWN0IHNzdF9oc3cgKmhzdywgY29uc3QgY2hhciAqdGV4dCkKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gaHN3LT5kc3A7CisJdTMyIGlzciwgaXBjZCwgaW1yeCwgaXBjeDsKKworCWlwY3ggPSBzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzc3QsIFNTVF9JUENYKTsKKwlpc3IgPSBzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzc3QsIFNTVF9JU1JYKTsKKwlpcGNkID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBTU1RfSVBDRCk7CisJaW1yeCA9IHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHNzdCwgU1NUX0lNUlgpOworCisJZGV2X2Vycihoc3ctPmRldiwgImlwYzogLS0lcy0tIGlwY3ggMHglOC44eCBpc3IgMHglOC44eCBpcGNkIDB4JTguOHggaW1yeCAweCU4Ljh4XG4iLAorCQl0ZXh0LCBpcGN4LCBpc3IsIGlwY2QsIGltcngpOworfQorCisvKiBsb2NrcyBoZWxkIGJ5IGNhbGxlciAqLworc3RhdGljIHN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnX2dldF9lbXB0eShzdHJ1Y3Qgc3N0X2hzdyAqaHN3KQoreworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnID0gTlVMTDsKKworCWlmICghbGlzdF9lbXB0eSgmaHN3LT5lbXB0eV9saXN0KSkgeworCQltc2cgPSBsaXN0X2ZpcnN0X2VudHJ5KCZoc3ctPmVtcHR5X2xpc3QsIHN0cnVjdCBpcGNfbWVzc2FnZSwKKwkJCWxpc3QpOworCQlsaXN0X2RlbCgmbXNnLT5saXN0KTsKKwl9CisKKwlyZXR1cm4gbXNnOworfQorCitzdGF0aWMgdm9pZCBpcGNfdHhfbXNncyhzdHJ1Y3Qga3RocmVhZF93b3JrICp3b3JrKQoreworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNzdF9oc3csIGt3b3JrKTsKKwlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBpcGN4OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhzdy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCisJaWYgKGxpc3RfZW1wdHkoJmhzdy0+dHhfbGlzdCkgfHwgaHN3LT5wZW5kaW5nKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhzdy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogaWYgdGhlIERTUCBpcyBidXN5IHdlIHdpbGwgVFggbWVzc2FnZXMgYWZ0ZXIgSVJRICovCisJaXBjeCA9IHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKGhzdy0+ZHNwLCBTU1RfSVBDWCk7CisJaWYgKGlwY3ggJiBTU1RfSVBDWF9CVVNZKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhzdy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJbXNnID0gbGlzdF9maXJzdF9lbnRyeSgmaHN3LT50eF9saXN0LCBzdHJ1Y3QgaXBjX21lc3NhZ2UsIGxpc3QpOworCisJbGlzdF9tb3ZlKCZtc2ctPmxpc3QsICZoc3ctPnJ4X2xpc3QpOworCisJLyogc2VuZCB0aGUgbWVzc2FnZSAqLworCXNzdF9kc3Bfb3V0Ym94X3dyaXRlKGhzdy0+ZHNwLCBtc2ctPnR4X2RhdGEsIG1zZy0+dHhfc2l6ZSk7CisJc3N0X2RzcF9pcGNfbXNnX3R4KGhzdy0+ZHNwLCBtc2ctPmhlYWRlciB8IFNTVF9JUENYX0JVU1kpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHN3LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7Cit9CisKKy8qIGxvY2tzIGhlbGQgYnkgY2FsbGVyICovCitzdGF0aWMgdm9pZCB0eF9tc2dfcmVwbHlfY29tcGxldGUoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IGlwY19tZXNzYWdlICptc2cpCit7CisJbXNnLT5jb21wbGV0ZSA9IHRydWU7CisJdHJhY2VfaXBjX3JlcGx5KCJjb21wbGV0ZWQiLCBtc2ctPmhlYWRlcik7CisKKwlpZiAoIW1zZy0+d2FpdCkKKwkJbGlzdF9hZGRfdGFpbCgmbXNnLT5saXN0LCAmaHN3LT5lbXB0eV9saXN0KTsKKwllbHNlCisJCXdha2VfdXAoJm1zZy0+d2FpdHEpOworfQorCitzdGF0aWMgaW50IHR4X3dhaXRfZG9uZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZywKKwl2b2lkICpyeF9kYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCS8qIHdhaXQgZm9yIERTUCBjb21wbGV0aW9uIChpbiBhbGwgY2FzZXMgYXRtIGluYyBwZW5kaW5nKSAqLworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChtc2ctPndhaXRxLCBtc2ctPmNvbXBsZXRlLAorCQltc2Vjc190b19qaWZmaWVzKElQQ19USU1FT1VUX01TRUNTKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHN3LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKHJldCA9PSAwKSB7CisJCWlwY19zaGltX2RiZyhoc3csICJtZXNzYWdlIHRpbWVvdXQiKTsKKworCQl0cmFjZV9pcGNfZXJyb3IoImVycm9yIG1lc3NhZ2UgdGltZW91dCBmb3IiLCBtc2ctPmhlYWRlcik7CisJCXJldCA9IC1FVElNRURPVVQ7CisJfSBlbHNlIHsKKworCQkvKiBjb3B5IHRoZSBkYXRhIHJldHVybmVkIGZyb20gRFNQICovCisJCWlmIChtc2ctPnJ4X3NpemUpCisJCQltZW1jcHkocnhfZGF0YSwgbXNnLT5yeF9kYXRhLCBtc2ctPnJ4X3NpemUpOworCQlyZXQgPSBtc2ctPmVycm5vOworCX0KKworCWxpc3RfYWRkX3RhaWwoJm1zZy0+bGlzdCwgJmhzdy0+ZW1wdHlfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHN3LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpcGNfdHhfbWVzc2FnZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaGVhZGVyLCB2b2lkICp0eF9kYXRhLAorCXNpemVfdCB0eF9ieXRlcywgdm9pZCAqcnhfZGF0YSwgc2l6ZV90IHJ4X2J5dGVzLCBpbnQgd2FpdCkKK3sKKwlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhzdy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCisJbXNnID0gbXNnX2dldF9lbXB0eShoc3cpOworCWlmIChtc2cgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoc3ctPmRzcC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAodHhfYnl0ZXMpCisJCW1lbWNweShtc2ctPnR4X2RhdGEsIHR4X2RhdGEsIHR4X2J5dGVzKTsKKworCW1zZy0+aGVhZGVyID0gaGVhZGVyOworCW1zZy0+dHhfc2l6ZSA9IHR4X2J5dGVzOworCW1zZy0+cnhfc2l6ZSA9IHJ4X2J5dGVzOworCW1zZy0+d2FpdCA9IHdhaXQ7CisJbXNnLT5lcnJubyA9IDA7CisJbXNnLT5wZW5kaW5nID0gZmFsc2U7CisJbXNnLT5jb21wbGV0ZSA9IGZhbHNlOworCisJbGlzdF9hZGRfdGFpbCgmbXNnLT5saXN0LCAmaHN3LT50eF9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoc3ctPmRzcC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXF1ZXVlX2t0aHJlYWRfd29yaygmaHN3LT5rd29ya2VyLCAmaHN3LT5rd29yayk7CisKKwlpZiAod2FpdCkKKwkJcmV0dXJuIHR4X3dhaXRfZG9uZShoc3csIG1zZywgcnhfZGF0YSk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXBjX3R4X21lc3NhZ2Vfd2FpdChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaGVhZGVyLAorCXZvaWQgKnR4X2RhdGEsIHNpemVfdCB0eF9ieXRlcywgdm9pZCAqcnhfZGF0YSwgc2l6ZV90IHJ4X2J5dGVzKQoreworCXJldHVybiBpcGNfdHhfbWVzc2FnZShoc3csIGhlYWRlciwgdHhfZGF0YSwgdHhfYnl0ZXMsIHJ4X2RhdGEsCisJCXJ4X2J5dGVzLCAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXBjX3R4X21lc3NhZ2Vfbm93YWl0KHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBoZWFkZXIsCisJdm9pZCAqdHhfZGF0YSwgc2l6ZV90IHR4X2J5dGVzKQoreworCXJldHVybiBpcGNfdHhfbWVzc2FnZShoc3csIGhlYWRlciwgdHhfZGF0YSwgdHhfYnl0ZXMsIE5VTEwsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBoc3dfZndfcmVhZHkoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIGhlYWRlcikKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfZndfcmVhZHkgZndfcmVhZHk7CisJdTMyIG9mZnNldDsKKworCW9mZnNldCA9IChoZWFkZXIgJiAweDFGRkZGRkZGKSA8PCAzOworCisJZGV2X2RiZyhoc3ctPmRldiwgImlwYzogRFNQIGlzIHJlYWR5IDB4JTguOHggb2Zmc2V0ICVkXG4iLAorCQloZWFkZXIsIG9mZnNldCk7CisKKwkvKiBjb3B5IGRhdGEgZnJvbSB0aGUgRFNQIEZXIHJlYWR5IG9mZnNldCAqLworCXNzdF9kc3BfcmVhZChoc3ctPmRzcCwgJmZ3X3JlYWR5LCBvZmZzZXQsIHNpemVvZihmd19yZWFkeSkpOworCisJc3N0X2RzcF9tYWlsYm94X2luaXQoaHN3LT5kc3AsIGZ3X3JlYWR5LmluYm94X29mZnNldCwKKwkJZndfcmVhZHkuaW5ib3hfc2l6ZSwgZndfcmVhZHkub3V0Ym94X29mZnNldCwKKwkJZndfcmVhZHkub3V0Ym94X3NpemUpOworCisJaHN3LT5ib290X2NvbXBsZXRlID0gdHJ1ZTsKKwl3YWtlX3VwKCZoc3ctPmJvb3Rfd2FpdCk7CisKKwlkZXZfZGJnKGhzdy0+ZGV2LCAiIG1haWxib3ggdXBzdHJlYW0gMHgleCAtIHNpemUgMHgleFxuIiwKKwkJZndfcmVhZHkuaW5ib3hfb2Zmc2V0LCBmd19yZWFkeS5pbmJveF9zaXplKTsKKwlkZXZfZGJnKGhzdy0+ZGV2LCAiIG1haWxib3ggZG93bnN0cmVhbSAweCV4IC0gc2l6ZSAweCV4XG4iLAorCQlmd19yZWFkeS5vdXRib3hfb2Zmc2V0LCBmd19yZWFkeS5vdXRib3hfc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGhzd19ub3RpZmljYXRpb25fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0gPSBjb250YWluZXJfb2Yod29yaywKKwkJCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSwgbm90aWZ5X3dvcmspOworCXN0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fZ2xpdGNoX3Bvc2l0aW9uICpnbGl0Y2ggPSAmc3RyZWFtLT5nbGl0Y2g7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9nZXRfcG9zaXRpb24gKnBvcyA9ICZzdHJlYW0tPnJwb3M7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHN0cmVhbS0+aHN3OworCXUzMiByZWFzb247CisKKwlyZWFzb24gPSBtc2dfZ2V0X25vdGlmeV9yZWFzb24oc3RyZWFtLT5oZWFkZXIpOworCisJc3dpdGNoIChyZWFzb24pIHsKKwljYXNlIElQQ19TVEdfR0xJVENIOgorCQl0cmFjZV9pcGNfbm90aWZpY2F0aW9uKCJEU1Agc3RyZWFtIHVuZGVyL292ZXJydW4iLAorCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOworCQlzc3RfZHNwX2luYm94X3JlYWQoaHN3LT5kc3AsIGdsaXRjaCwgc2l6ZW9mKCpnbGl0Y2gpKTsKKworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZ2xpdGNoICVkIHBvcyAweCV4IHdyaXRlIHBvcyAweCV4XG4iLAorCQkJZ2xpdGNoLT5nbGl0Y2hfdHlwZSwgZ2xpdGNoLT5wcmVzZW50X3BvcywKKwkJCWdsaXRjaC0+d3JpdGVfcG9zKTsKKwkJYnJlYWs7CisKKwljYXNlIElQQ19QT1NJVElPTl9DSEFOR0VEOgorCQl0cmFjZV9pcGNfbm90aWZpY2F0aW9uKCJEU1Agc3RyZWFtIHBvc2l0aW9uIGNoYW5nZWQgZm9yIiwKKwkJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKwkJc3N0X2RzcF9pbmJveF9yZWFkKGhzdy0+ZHNwLCBwb3MsIHNpemVvZihwb3MpKTsKKworCQlpZiAoc3RyZWFtLT5ub3RpZnlfcG9zaXRpb24pCisJCQlzdHJlYW0tPm5vdGlmeV9wb3NpdGlvbihzdHJlYW0sIHN0cmVhbS0+cGRhdGEpOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogdW5rbm93biBub3RpZmljYXRpb24gMHgleFxuIiwKKwkJCXN0cmVhbS0+aGVhZGVyKTsKKwkJYnJlYWs7CisJfQorCisJLyogdGVsbCBEU1AgdGhhdCBub3RpZmljYXRpb24gaGFzIGJlZW4gaGFuZGxlZCAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChoc3ctPmRzcCwgU1NUX0lQQ0QsCisJCVNTVF9JUENEX0JVU1kgfCBTU1RfSVBDRF9ET05FLCBTU1RfSVBDRF9ET05FKTsKKworCS8qIHVubWFzayBidXN5IGludGVycnVwdCAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChoc3ctPmRzcCwgU1NUX0lNUlgsIFNTVF9JTVJYX0JVU1ksIDApOworfQorCitzdGF0aWMgc3RydWN0IGlwY19tZXNzYWdlICpyZXBseV9maW5kX21zZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaGVhZGVyKQoreworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOworCisJLyogY2xlYXIgcmVwbHkgYml0cyAmIHN0YXR1cyBiaXRzICovCisJaGVhZGVyICY9IH4oSVBDX1NUQVRVU19NQVNLIHwgSVBDX0dMQl9SRVBMWV9NQVNLKTsKKworCWlmIChsaXN0X2VtcHR5KCZoc3ctPnJ4X2xpc3QpKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogcnggbGlzdCBlbXB0eSBidXQgcmVjZWl2ZWQgMHgleFxuIiwKKwkJCWhlYWRlcik7CisJCXJldHVybiBOVUxMOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkobXNnLCAmaHN3LT5yeF9saXN0LCBsaXN0KSB7CisJCWlmIChtc2ctPmhlYWRlciA9PSBoZWFkZXIpCisJCQlyZXR1cm4gbXNnOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBoc3dfc3RyZWFtX3VwZGF0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbTsKKwl1MzIgaGVhZGVyID0gbXNnLT5oZWFkZXIgJiB+KElQQ19TVEFUVVNfTUFTSyB8IElQQ19HTEJfUkVQTFlfTUFTSyk7CisJdTMyIHN0cmVhbV9pZCA9IG1zZ19nZXRfc3RyZWFtX2lkKGhlYWRlcik7CisJdTMyIHN0cmVhbV9tc2cgPSBtc2dfZ2V0X3N0cmVhbV90eXBlKGhlYWRlcik7CisKKwlzdHJlYW0gPSBnZXRfc3RyZWFtX2J5X2lkKGhzdywgc3RyZWFtX2lkKTsKKwlpZiAoc3RyZWFtID09IE5VTEwpCisJCXJldHVybjsKKworCXN3aXRjaCAoc3RyZWFtX21zZykgeworCWNhc2UgSVBDX1NUUl9TVEFHRV9NRVNTQUdFOgorCWNhc2UgSVBDX1NUUl9OT1RJRklDQVRJT046CisJY2FzZSBJUENfU1RSX1JFU0VUOgorCQlicmVhazsKKwljYXNlIElQQ19TVFJfUEFVU0U6CisJCXN0cmVhbS0+cnVubmluZyA9IGZhbHNlOworCQl0cmFjZV9pcGNfbm90aWZpY2F0aW9uKCJzdHJlYW0gcGF1c2VkIiwKKwkJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKwkJYnJlYWs7CisJY2FzZSBJUENfU1RSX1JFU1VNRToKKwkJc3RyZWFtLT5ydW5uaW5nID0gdHJ1ZTsKKwkJdHJhY2VfaXBjX25vdGlmaWNhdGlvbigic3RyZWFtIHJ1bm5pbmciLAorCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaHN3X3Byb2Nlc3NfcmVwbHkoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIGhlYWRlcikKK3sKKwlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZzsKKwl1MzIgcmVwbHkgPSBtc2dfZ2V0X2dsb2JhbF9yZXBseShoZWFkZXIpOworCisJdHJhY2VfaXBjX3JlcGx5KCJwcm9jZXNzaW5nIC0tPiIsIGhlYWRlcik7CisKKwltc2cgPSByZXBseV9maW5kX21zZyhoc3csIGhlYWRlcik7CisJaWYgKG1zZyA9PSBOVUxMKSB7CisJCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IGNhbid0IGZpbmQgbWVzc2FnZSBoZWFkZXIiLCBoZWFkZXIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBmaXJzdCBwcm9jZXNzIHRoZSBoZWFkZXIgKi8KKwlzd2l0Y2ggKHJlcGx5KSB7CisJY2FzZSBJUENfR0xCX1JFUExZX1BFTkRJTkc6CisJCXRyYWNlX2lwY19wZW5kaW5nX3JlcGx5KCJyZWNlaXZlZCIsIGhlYWRlcik7CisJCW1zZy0+cGVuZGluZyA9IHRydWU7CisJCWhzdy0+cGVuZGluZyA9IHRydWU7CisJCXJldHVybiAxOworCWNhc2UgSVBDX0dMQl9SRVBMWV9TVUNDRVNTOgorCQlpZiAobXNnLT5wZW5kaW5nKSB7CisJCQl0cmFjZV9pcGNfcGVuZGluZ19yZXBseSgiY29tcGxldGVkIiwgaGVhZGVyKTsKKwkJCXNzdF9kc3BfaW5ib3hfcmVhZChoc3ctPmRzcCwgbXNnLT5yeF9kYXRhLAorCQkJCW1zZy0+cnhfc2l6ZSk7CisJCQloc3ctPnBlbmRpbmcgPSBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCS8qIGNvcHkgZGF0YSBmcm9tIHRoZSBEU1AgKi8KKwkJCXNzdF9kc3Bfb3V0Ym94X3JlYWQoaHN3LT5kc3AsIG1zZy0+cnhfZGF0YSwKKwkJCQltc2ctPnJ4X3NpemUpOworCQl9CisJCWJyZWFrOworCS8qIHRoZXNlIHdpbGwgYmUgcmFyZSAtIGJ1dCB1c2VmdWwgZm9yIGRlYnVnICovCisJY2FzZSBJUENfR0xCX1JFUExZX1VOS05PV05fTUVTU0FHRV9UWVBFOgorCQl0cmFjZV9pcGNfZXJyb3IoImVycm9yOiB1bmtub3duIG1lc3NhZ2UgdHlwZSIsIGhlYWRlcik7CisJCW1zZy0+ZXJybm8gPSAtRUJBRE1TRzsKKwkJYnJlYWs7CisJY2FzZSBJUENfR0xCX1JFUExZX09VVF9PRl9SRVNPVVJDRVM6CisJCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IG91dCBvZiByZXNvdXJjZXMiLCBoZWFkZXIpOworCQltc2ctPmVycm5vID0gLUVOT01FTTsKKwkJYnJlYWs7CisJY2FzZSBJUENfR0xCX1JFUExZX0JVU1k6CisJCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IHJlcGx5IGJ1c3kiLCBoZWFkZXIpOworCQltc2ctPmVycm5vID0gLUVCVVNZOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfUkVQTFlfRkFJTFVSRToKKwkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogcmVwbHkgZmFpbHVyZSIsIGhlYWRlcik7CisJCW1zZy0+ZXJybm8gPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfUkVQTFlfU1RBR0VfVU5JTklUSUFMSVpFRDoKKwkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogc3RhZ2UgdW5pbml0aWFsaXplZCIsIGhlYWRlcik7CisJCW1zZy0+ZXJybm8gPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfUkVQTFlfTk9UX0ZPVU5EOgorCQl0cmFjZV9pcGNfZXJyb3IoImVycm9yOiByZXBseSBub3QgZm91bmQiLCBoZWFkZXIpOworCQltc2ctPmVycm5vID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBJUENfR0xCX1JFUExZX1NPVVJDRV9OT1RfU1RBUlRFRDoKKwkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogc291cmNlIG5vdCBzdGFydGVkIiwgaGVhZGVyKTsKKwkJbXNnLT5lcnJubyA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgSVBDX0dMQl9SRVBMWV9JTlZBTElEX1JFUVVFU1Q6CisJCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IGludmFsaWQgcmVxdWVzdCIsIGhlYWRlcik7CisJCW1zZy0+ZXJybm8gPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfUkVQTFlfRVJST1JfSU5WQUxJRF9QQVJBTToKKwkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogaW52YWxpZCBwYXJhbWV0ZXIiLCBoZWFkZXIpOworCQltc2ctPmVycm5vID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogdW5rbm93biByZXBseSIsIGhlYWRlcik7CisJCW1zZy0+ZXJybm8gPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwkvKiB1cGRhdGUgYW55IHN0cmVhbSBzdGF0ZXMgKi8KKwloc3dfc3RyZWFtX3VwZGF0ZShoc3csIG1zZyk7CisKKwkvKiB3YWtlIHVwIGFuZCByZXR1cm4gdGhlIGVycm9yIGlmIHdlIGhhdmUgd2FpdGVycyBvbiB0aGlzIG1lc3NhZ2UgPyAqLworCWxpc3RfZGVsKCZtc2ctPmxpc3QpOworCXR4X21zZ19yZXBseV9jb21wbGV0ZShoc3csIG1zZyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoc3dfc3RyZWFtX21lc3NhZ2Uoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIGhlYWRlcikKK3sKKwl1MzIgc3RyZWFtX21zZywgc3RyZWFtX2lkLCBzdGFnZV90eXBlOworCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtOworCWludCBoYW5kbGVkID0gMDsKKworCXN0cmVhbV9tc2cgPSBtc2dfZ2V0X3N0cmVhbV90eXBlKGhlYWRlcik7CisJc3RyZWFtX2lkID0gbXNnX2dldF9zdHJlYW1faWQoaGVhZGVyKTsKKwlzdGFnZV90eXBlID0gbXNnX2dldF9zdGFnZV90eXBlKGhlYWRlcik7CisKKwlzdHJlYW0gPSBnZXRfc3RyZWFtX2J5X2lkKGhzdywgc3RyZWFtX2lkKTsKKwlpZiAoc3RyZWFtID09IE5VTEwpCisJCXJldHVybiBoYW5kbGVkOworCisJc3RyZWFtLT5oZWFkZXIgPSBoZWFkZXI7CisKKwlzd2l0Y2ggKHN0cmVhbV9tc2cpIHsKKwljYXNlIElQQ19TVFJfU1RBR0VfTUVTU0FHRToKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdGFnZSBtc2cgbm90IGltcGxlbWVudGVkIDB4JTguOHhcbiIsCisJCQloZWFkZXIpOworCQlicmVhazsKKwljYXNlIElQQ19TVFJfTk9USUZJQ0FUSU9OOgorCQlzY2hlZHVsZV93b3JrKCZzdHJlYW0tPm5vdGlmeV93b3JrKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogaGFuZGxlIHBlbmRpbmcgbWVzc2FnZSBjb21wbGV0ZSByZXF1ZXN0ICovCisJCWhhbmRsZWQgPSBoc3dfcHJvY2Vzc19yZXBseShoc3csIGhlYWRlcik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBoYW5kbGVkOworfQorCitzdGF0aWMgaW50IGhzd19sb2dfbWVzc2FnZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaGVhZGVyKQoreworCXUzMiBvcGVyYXRpb24gPSAoaGVhZGVyICYgSVBDX0xPR19PUF9NQVNLKSA+PiAgSVBDX0xPR19PUF9TSElGVDsKKwlzdHJ1Y3Qgc3N0X2hzd19sb2dfc3RyZWFtICpzdHJlYW0gPSAmaHN3LT5sb2dfc3RyZWFtOworCWludCByZXQgPSAxOworCisJaWYgKG9wZXJhdGlvbiAhPSBJUENfREVCVUdfUkVRVUVTVF9MT0dfRFVNUCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LAorCQkJImVycm9yOiBsb2cgbXNnIG5vdCBpbXBsZW1lbnRlZCAweCU4Ljh4XG4iLCBoZWFkZXIpOworCQlyZXR1cm4gMDsKKwl9CisKKwltdXRleF9sb2NrKCZzdHJlYW0tPnJ3X211dGV4KTsKKwlzdHJlYW0tPmxhc3RfcG9zID0gc3RyZWFtLT5jdXJyX3BvczsKKwlzc3RfZHNwX2luYm94X3JlYWQoCisJCWhzdy0+ZHNwLCAmc3RyZWFtLT5jdXJyX3Bvcywgc2l6ZW9mKHN0cmVhbS0+Y3Vycl9wb3MpKTsKKwltdXRleF91bmxvY2soJnN0cmVhbS0+cndfbXV0ZXgpOworCisJc2NoZWR1bGVfd29yaygmc3RyZWFtLT5ub3RpZnlfd29yayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGhzd19wcm9jZXNzX25vdGlmaWNhdGlvbihzdHJ1Y3Qgc3N0X2hzdyAqaHN3KQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBoc3ctPmRzcDsKKwl1MzIgdHlwZSwgaGVhZGVyOworCWludCBoYW5kbGVkID0gMTsKKworCWhlYWRlciA9IHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHNzdCwgU1NUX0lQQ0QpOworCXR5cGUgPSBtc2dfZ2V0X2dsb2JhbF90eXBlKGhlYWRlcik7CisKKwl0cmFjZV9pcGNfcmVxdWVzdCgicHJvY2Vzc2luZyAtLT4iLCBoZWFkZXIpOworCisJLyogRlcgUmVhZHkgaXMgYSBzcGVjaWFsIGNhc2UgKi8KKwlpZiAoIWhzdy0+Ym9vdF9jb21wbGV0ZSAmJiBoZWFkZXIgJiBJUENfRldfUkVBRFkpIHsKKwkJaHN3X2Z3X3JlYWR5KGhzdywgaGVhZGVyKTsKKwkJcmV0dXJuIGhhbmRsZWQ7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJUENfR0xCX0dFVF9GV19WRVJTSU9OOgorCWNhc2UgSVBDX0dMQl9BTExPQ0FURV9TVFJFQU06CisJY2FzZSBJUENfR0xCX0ZSRUVfU1RSRUFNOgorCWNhc2UgSVBDX0dMQl9HRVRfRldfQ0FQQUJJTElUSUVTOgorCWNhc2UgSVBDX0dMQl9SRVFVRVNUX0RVTVA6CisJY2FzZSBJUENfR0xCX0dFVF9ERVZJQ0VfRk9STUFUUzoKKwljYXNlIElQQ19HTEJfU0VUX0RFVklDRV9GT1JNQVRTOgorCWNhc2UgSVBDX0dMQl9FTlRFUl9EWF9TVEFURToKKwljYXNlIElQQ19HTEJfR0VUX01JWEVSX1NUUkVBTV9JTkZPOgorCWNhc2UgSVBDX0dMQl9NQVhfSVBDX01FU1NBR0VfVFlQRToKKwljYXNlIElQQ19HTEJfUkVTVE9SRV9DT05URVhUOgorCWNhc2UgSVBDX0dMQl9TSE9SVF9SRVBMWToKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBtZXNzYWdlIHR5cGUgJWQgaGVhZGVyIDB4JXhcbiIsCisJCQl0eXBlLCBoZWFkZXIpOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfU1RSRUFNX01FU1NBR0U6CisJCWhhbmRsZWQgPSBoc3dfc3RyZWFtX21lc3NhZ2UoaHN3LCBoZWFkZXIpOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfREVCVUdfTE9HX01FU1NBR0U6CisJCWhhbmRsZWQgPSBoc3dfbG9nX21lc3NhZ2UoaHN3LCBoZWFkZXIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHVuZXhwZWN0ZWQgdHlwZSAlZCBoZHIgMHglOC44eFxuIiwKKwkJCXR5cGUsIGhlYWRlcik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBoYW5kbGVkOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaHN3X2lycV90aHJlYWQoaW50IGlycSwgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gKHN0cnVjdCBzc3RfZHNwICopIGNvbnRleHQ7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHNzdF9kc3BfZ2V0X3RocmVhZF9jb250ZXh0KHNzdCk7CisJdTMyIGlwY3gsIGlwY2Q7CisJaW50IGhhbmRsZWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlpcGN4ID0gc3N0X2RzcF9pcGNfbXNnX3J4KGhzdy0+ZHNwKTsKKwlpcGNkID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBTU1RfSVBDRCk7CisKKwkvKiByZXBseSBtZXNzYWdlIGZyb20gRFNQICovCisJaWYgKGlwY3ggJiBTU1RfSVBDWF9ET05FKSB7CisKKwkJLyogSGFuZGxlIEltbWVkaWF0ZSByZXBseSBmcm9tIERTUCBDb3JlICovCisJCWhhbmRsZWQgPSBoc3dfcHJvY2Vzc19yZXBseShoc3csIGlwY3gpOworCisJCWlmIChoYW5kbGVkID4gMCkgeworCQkJLyogY2xlYXIgRE9ORSBiaXQgLSB0ZWxsIERTUCB3ZSBoYXZlIGNvbXBsZXRlZCAqLworCQkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0lQQ1gsCisJCQkJU1NUX0lQQ1hfRE9ORSwgMCk7CisKKwkJCS8qIHVubWFzayBEb25lIGludGVycnVwdCAqLworCQkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0lNUlgsCisJCQkJU1NUX0lNUlhfRE9ORSwgMCk7CisJCX0KKwl9CisKKwkvKiBuZXcgbWVzc2FnZSBmcm9tIERTUCAqLworCWlmIChpcGNkICYgU1NUX0lQQ0RfQlVTWSkgeworCisJCS8qIEhhbmRsZSBOb3RpZmljYXRpb24gYW5kIERlbGF5ZWQgcmVwbHkgZnJvbSBEU1AgQ29yZSAqLworCQloYW5kbGVkID0gaHN3X3Byb2Nlc3Nfbm90aWZpY2F0aW9uKGhzdyk7CisKKwkJLyogY2xlYXIgQlVTWSBiaXQgYW5kIHNldCBET05FIGJpdCAtIGFjY2VwdCBuZXcgbWVzc2FnZXMgKi8KKwkJaWYgKGhhbmRsZWQgPiAwKSB7CisJCQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBTU1RfSVBDRCwKKwkJCQlTU1RfSVBDRF9CVVNZIHwgU1NUX0lQQ0RfRE9ORSwgU1NUX0lQQ0RfRE9ORSk7CisKKwkJCS8qIHVubWFzayBidXN5IGludGVycnVwdCAqLworCQkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0lNUlgsCisJCQkJU1NUX0lNUlhfQlVTWSwgMCk7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBjb250aW51ZSB0byBzZW5kIGFueSByZW1haW5pbmcgbWVzc2FnZXMuLi4gKi8KKwlxdWV1ZV9rdGhyZWFkX3dvcmsoJmhzdy0+a3dvcmtlciwgJmhzdy0+a3dvcmspOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpbnQgc3N0X2hzd19md19nZXRfdmVyc2lvbihzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X2lwY19md192ZXJzaW9uICp2ZXJzaW9uKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpcGNfdHhfbWVzc2FnZV93YWl0KGhzdywgSVBDX0dMQl9UWVBFKElQQ19HTEJfR0VUX0ZXX1ZFUlNJT04pLAorCQlOVUxMLCAwLCB2ZXJzaW9uLCBzaXplb2YoKnZlcnNpb24pKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBnZXQgdmVyc2lvbiBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworLyogTWl4ZXIgQ29udHJvbHMgKi8KK2ludCBzc3RfaHN3X3N0cmVhbV9tdXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCXUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwpCit7CisJaW50IHJldDsKKworCXJldCA9IHNzdF9oc3dfc3RyZWFtX2dldF92b2x1bWUoaHN3LCBzdHJlYW0sIHN0YWdlX2lkLCBjaGFubmVsLAorCQkmc3RyZWFtLT5tdXRlX3ZvbHVtZVtjaGFubmVsXSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzc3RfaHN3X3N0cmVhbV9zZXRfdm9sdW1lKGhzdywgc3RyZWFtLCBzdGFnZV9pZCwgY2hhbm5lbCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBjYW4ndCB1bm11dGUgc3RyZWFtICVkIGNoYW5uZWwgJWRcbiIsCisJCQlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCwgY2hhbm5lbCk7CisJCXJldHVybiByZXQ7CisJfQorCisJc3RyZWFtLT5tdXRlW2NoYW5uZWxdID0gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3VubXV0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwl1MzIgc3RhZ2VfaWQsIHUzMiBjaGFubmVsKQorCit7CisJaW50IHJldDsKKworCXN0cmVhbS0+bXV0ZVtjaGFubmVsXSA9IDA7CisJcmV0ID0gc3N0X2hzd19zdHJlYW1fc2V0X3ZvbHVtZShoc3csIHN0cmVhbSwgc3RhZ2VfaWQsIGNoYW5uZWwsCisJCXN0cmVhbS0+bXV0ZV92b2x1bWVbY2hhbm5lbF0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogY2FuJ3QgdW5tdXRlIHN0cmVhbSAlZCBjaGFubmVsICVkXG4iLAorCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQsIGNoYW5uZWwpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fZ2V0X3ZvbHVtZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwl1MzIgc3RhZ2VfaWQsIHUzMiBjaGFubmVsLCB1MzIgKnZvbHVtZSkKK3sKKwlpZiAoY2hhbm5lbCA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJc3N0X2RzcF9yZWFkKGhzdy0+ZHNwLCB2b2x1bWUsCisJCXN0cmVhbS0+cmVwbHkudm9sdW1lX3JlZ2lzdGVyX2FkZHJlc3NbY2hhbm5lbF0sIHNpemVvZih2b2x1bWUpKTsKKworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3ZvbHVtZV9jdXJ2ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1NjQgY3VydmVfZHVyYXRpb24sCisJZW51bSBzc3RfaHN3X3ZvbHVtZV9jdXJ2ZSBjdXJ2ZSkKK3sKKwkvKiBjdXJ2ZSBkdXJhdGlvbiBpbiBzdGVwcyBvZiAxMDBucyAqLworCXN0cmVhbS0+dm9sX3JlcS5jdXJ2ZV9kdXJhdGlvbiA9IGN1cnZlX2R1cmF0aW9uOworCXN0cmVhbS0+dm9sX3JlcS5jdXJ2ZV90eXBlID0gY3VydmU7CisKKwlyZXR1cm4gMDsKK30KKworLyogc3RyZWFtIHZvbHVtZSAqLworaW50IHNzdF9oc3dfc3RyZWFtX3NldF92b2x1bWUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCwgdTMyIHZvbHVtZSkKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfdm9sdW1lX3JlcSAqcmVxOworCXUzMiBoZWFkZXI7CisJaW50IHJldDsKKworCXRyYWNlX2lwY19yZXF1ZXN0KCJzZXQgc3RyZWFtIHZvbHVtZSIsIHN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKworCWlmIChjaGFubmVsID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3RyZWFtLT5tdXRlW2NoYW5uZWxdKSB7CisJCXN0cmVhbS0+bXV0ZV92b2x1bWVbY2hhbm5lbF0gPSB2b2x1bWU7CisJCXJldHVybiAwOworCX0KKworCWhlYWRlciA9IElQQ19HTEJfVFlQRShJUENfR0xCX1NUUkVBTV9NRVNTQUdFKSB8CisJCUlQQ19TVFJfVFlQRShJUENfU1RSX1NUQUdFX01FU1NBR0UpOworCWhlYWRlciB8PSAoc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQgPDwgSVBDX1NUUl9JRF9TSElGVCk7CisJaGVhZGVyIHw9IChJUENfU1RHX1NFVF9WT0xVTUUgPDwgSVBDX1NUR19UWVBFX1NISUZUKTsKKwloZWFkZXIgfD0gKHN0YWdlX2lkIDw8IElQQ19TVEdfSURfU0hJRlQpOworCisJcmVxID0gJnN0cmVhbS0+dm9sX3JlcTsKKwlyZXEtPmNoYW5uZWwgPSBjaGFubmVsOworCXJlcS0+dGFyZ2V0X3ZvbHVtZSA9IHZvbHVtZTsKKworCXJldCA9IGlwY190eF9tZXNzYWdlX3dhaXQoaHN3LCBoZWFkZXIsIHJlcSwgc2l6ZW9mKCpyZXEpLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHNldCBzdHJlYW0gdm9sdW1lIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfaHN3X21peGVyX211dGUoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc3N0X2hzd19taXhlcl9nZXRfdm9sdW1lKGhzdywgc3RhZ2VfaWQsIGNoYW5uZWwsCisJCSZoc3ctPm11dGVfdm9sdW1lW2NoYW5uZWxdKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNzdF9oc3dfbWl4ZXJfc2V0X3ZvbHVtZShoc3csIHN0YWdlX2lkLCBjaGFubmVsLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byB1bm11dGUgbWl4ZXIgY2hhbm5lbCAlZFxuIiwKKwkJCWNoYW5uZWwpOworCQlyZXR1cm4gcmV0OworCX0KKworCWhzdy0+bXV0ZVtjaGFubmVsXSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfaHN3X21peGVyX3VubXV0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgc3RhZ2VfaWQsIHUzMiBjaGFubmVsKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzc3RfaHN3X21peGVyX3NldF92b2x1bWUoaHN3LCBzdGFnZV9pZCwgY2hhbm5lbCwKKwkJaHN3LT5taXhlcl9pbmZvLnZvbHVtZV9yZWdpc3Rlcl9hZGRyZXNzW2NoYW5uZWxdKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byB1bm11dGUgbWl4ZXIgY2hhbm5lbCAlZFxuIiwKKwkJCWNoYW5uZWwpOworCQlyZXR1cm4gcmV0OworCX0KKworCWhzdy0+bXV0ZVtjaGFubmVsXSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfaHN3X21peGVyX2dldF92b2x1bWUoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCwKKwl1MzIgKnZvbHVtZSkKK3sKKwlpZiAoY2hhbm5lbCA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJc3N0X2RzcF9yZWFkKGhzdy0+ZHNwLCB2b2x1bWUsCisJCWhzdy0+bWl4ZXJfaW5mby52b2x1bWVfcmVnaXN0ZXJfYWRkcmVzc1tjaGFubmVsXSwKKwkJc2l6ZW9mKCp2b2x1bWUpKTsKKworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lX2N1cnZlKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJIHU2NCBjdXJ2ZV9kdXJhdGlvbiwgZW51bSBzc3RfaHN3X3ZvbHVtZV9jdXJ2ZSBjdXJ2ZSkKK3sKKwkvKiBjdXJ2ZSBkdXJhdGlvbiBpbiBzdGVwcyBvZiAxMDBucyAqLworCWhzdy0+Y3VydmVfZHVyYXRpb24gPSBjdXJ2ZV9kdXJhdGlvbjsKKwloc3ctPmN1cnZlX3R5cGUgPSBjdXJ2ZTsKKworCXJldHVybiAwOworfQorCisvKiBnbG9iYWwgbWl4ZXIgdm9sdW1lICovCitpbnQgc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwsCisJdTMyIHZvbHVtZSkKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfdm9sdW1lX3JlcSByZXE7CisJdTMyIGhlYWRlcjsKKwlpbnQgcmV0OworCisJdHJhY2VfaXBjX3JlcXVlc3QoInNldCBtaXhlciB2b2x1bWUiLCB2b2x1bWUpOworCisJLyogc2V0IGJvdGggYXQgc2FtZSB0aW1lID8gKi8KKwlpZiAoY2hhbm5lbCA9PSAyKSB7CisJCWlmIChoc3ctPm11dGVbMF0gJiYgaHN3LT5tdXRlWzFdKSB7CisJCQloc3ctPm11dGVfdm9sdW1lWzBdID0gaHN3LT5tdXRlX3ZvbHVtZVsxXSA9IHZvbHVtZTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKGhzdy0+bXV0ZVswXSkKKwkJCXJlcS5jaGFubmVsID0gMTsKKwkJZWxzZSBpZiAoaHN3LT5tdXRlWzFdKQorCQkJcmVxLmNoYW5uZWwgPSAwOworCQllbHNlCisJCQlyZXEuY2hhbm5lbCA9IDB4ZmZmZmZmZmY7CisJfSBlbHNlIHsKKwkJLyogc2V0IG9ubHkgMSBjaGFubmVsICovCisJCWlmIChoc3ctPm11dGVbY2hhbm5lbF0pIHsKKwkJCWhzdy0+bXV0ZV92b2x1bWVbY2hhbm5lbF0gPSB2b2x1bWU7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXEuY2hhbm5lbCA9IGNoYW5uZWw7CisJfQorCisJaGVhZGVyID0gSVBDX0dMQl9UWVBFKElQQ19HTEJfU1RSRUFNX01FU1NBR0UpIHwKKwkJSVBDX1NUUl9UWVBFKElQQ19TVFJfU1RBR0VfTUVTU0FHRSk7CisJaGVhZGVyIHw9IChoc3ctPm1peGVyX2luZm8ubWl4ZXJfaHdfaWQgPDwgSVBDX1NUUl9JRF9TSElGVCk7CisJaGVhZGVyIHw9IChJUENfU1RHX1NFVF9WT0xVTUUgPDwgSVBDX1NUR19UWVBFX1NISUZUKTsKKwloZWFkZXIgfD0gKHN0YWdlX2lkIDw8IElQQ19TVEdfSURfU0hJRlQpOworCisJcmVxLmN1cnZlX2R1cmF0aW9uID0gaHN3LT5jdXJ2ZV9kdXJhdGlvbjsKKwlyZXEuY3VydmVfdHlwZSA9IGhzdy0+Y3VydmVfdHlwZTsKKwlyZXEudGFyZ2V0X3ZvbHVtZSA9IHZvbHVtZTsKKworCXJldCA9IGlwY190eF9tZXNzYWdlX3dhaXQoaHN3LCBoZWFkZXIsICZyZXEsIHNpemVvZihyZXEpLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHNldCBtaXhlciB2b2x1bWUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogU3RyZWFtIEFQSSAqLworc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzc3RfaHN3X3N0cmVhbV9uZXcoc3RydWN0IHNzdF9oc3cgKmhzdywgaW50IGlkLAorCXUzMiAoKm5vdGlmeV9wb3NpdGlvbikoc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHZvaWQgKmRhdGEpLAorCXZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW07CisKKwlzdHJlYW0gPSBremFsbG9jKHNpemVvZigqc3RyZWFtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0cmVhbSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfYWRkKCZzdHJlYW0tPm5vZGUsICZoc3ctPnN0cmVhbV9saXN0KTsKKwlzdHJlYW0tPm5vdGlmeV9wb3NpdGlvbiA9IG5vdGlmeV9wb3NpdGlvbjsKKwlzdHJlYW0tPnBkYXRhID0gZGF0YTsKKwlzdHJlYW0tPmhzdyA9IGhzdzsKKwlzdHJlYW0tPmhvc3RfaWQgPSBpZDsKKworCS8qIHdvcmsgdG8gcHJvY2VzcyBub3RpZmljYXRpb24gbWVzc2FnZXMgKi8KKwlJTklUX1dPUksoJnN0cmVhbS0+bm90aWZ5X3dvcmssIGhzd19ub3RpZmljYXRpb25fd29yayk7CisKKwlyZXR1cm4gc3RyZWFtOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fZnJlZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwl1MzIgaGVhZGVyOworCWludCByZXQgPSAwOworCisJLyogZG9udCBmcmVlIERTUCBzdHJlYW1zIHRoYXQgYXJlIG5vdCBjb21taXRlZCAqLworCWlmICghc3RyZWFtLT5jb21taXRlZCkKKwkJZ290byBvdXQ7CisKKwl0cmFjZV9pcGNfcmVxdWVzdCgic3RyZWFtIGZyZWUiLCBzdHJlYW0tPmhvc3RfaWQpOworCisJc3RyZWFtLT5mcmVlX3JlcS5zdHJlYW1faWQgPSBzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZDsKKwloZWFkZXIgPSBJUENfR0xCX1RZUEUoSVBDX0dMQl9GUkVFX1NUUkVBTSk7CisKKwlyZXQgPSBpcGNfdHhfbWVzc2FnZV93YWl0KGhzdywgaGVhZGVyLCAmc3RyZWFtLT5mcmVlX3JlcSwKKwkJc2l6ZW9mKHN0cmVhbS0+ZnJlZV9yZXEpLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGZyZWUgc3RyZWFtICVkIGZhaWxlZFxuIiwKKwkJCXN0cmVhbS0+ZnJlZV9yZXEuc3RyZWFtX2lkKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJdHJhY2VfaHN3X3N0cmVhbV9mcmVlX3JlcShzdHJlYW0sICZzdHJlYW0tPmZyZWVfcmVxKTsKKworb3V0OgorCWxpc3RfZGVsKCZzdHJlYW0tPm5vZGUpOworCWtmcmVlKHN0cmVhbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X2JpdHMoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgZW51bSBzc3RfaHN3X2JpdGRlcHRoIGJpdHMpCit7CisJaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBzZXQgYml0c1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0cmVhbS0+cmVxdWVzdC5mb3JtYXQuYml0ZGVwdGggPSBiaXRzOworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X2NoYW5uZWxzKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIGludCBjaGFubmVscykKK3sKKwlpZiAoc3RyZWFtLT5jb21taXRlZCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXR0ZWQgZm9yIHNldCBjaGFubmVsc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHN0ZXJlbyBpcyBvbmx5IHN1cHBvcnRlZCBhdG0gKi8KKwlpZiAoY2hhbm5lbHMgIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdHJlYW0tPnJlcXVlc3QuZm9ybWF0LmNoX251bSA9IGNoYW5uZWxzOworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3JhdGUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgaW50IHJhdGUpCit7CisJaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBzZXQgcmF0ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0cmVhbS0+cmVxdWVzdC5mb3JtYXQuZnJlcXVlbmN5ID0gcmF0ZTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9tYXBfY29uZmlnKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBtYXAsCisJZW51bSBzc3RfaHN3X2NoYW5uZWxfY29uZmlnIGNvbmZpZykKK3sKKwlpZiAoc3RyZWFtLT5jb21taXRlZCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXR0ZWQgZm9yIHNldCBtYXBcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdHJlYW0tPnJlcXVlc3QuZm9ybWF0Lm1hcCA9IG1hcDsKKwlzdHJlYW0tPnJlcXVlc3QuZm9ybWF0LmNvbmZpZyA9IGNvbmZpZzsKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9zdHlsZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCBlbnVtIHNzdF9oc3dfaW50ZXJsZWF2aW5nIHN0eWxlKQoreworCWlmIChzdHJlYW0tPmNvbW1pdGVkKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc3RyZWFtIGNvbW1pdHRlZCBmb3Igc2V0IHN0eWxlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RyZWFtLT5yZXF1ZXN0LmZvcm1hdC5zdHlsZSA9IHN0eWxlOworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3ZhbGlkKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBiaXRzKQoreworCWlmIChzdHJlYW0tPmNvbW1pdGVkKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc3RyZWFtIGNvbW1pdHRlZCBmb3Igc2V0IHZhbGlkIGJpdHNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdHJlYW0tPnJlcXVlc3QuZm9ybWF0LnZhbGlkX2JpdCA9IGJpdHM7CisJcmV0dXJuIDA7Cit9CisKKy8qIFN0cmVhbSBDb25maWd1cmF0aW9uICovCitpbnQgc3N0X2hzd19zdHJlYW1fZm9ybWF0KHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCWVudW0gc3N0X2hzd19zdHJlYW1fcGF0aF9pZCBwYXRoX2lkLAorCWVudW0gc3N0X2hzd19zdHJlYW1fdHlwZSBzdHJlYW1fdHlwZSwKKwllbnVtIHNzdF9oc3dfc3RyZWFtX2Zvcm1hdCBmb3JtYXRfaWQpCit7CisJaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBzZXQgZm9ybWF0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RyZWFtLT5yZXF1ZXN0LnBhdGhfaWQgPSBwYXRoX2lkOworCXN0cmVhbS0+cmVxdWVzdC5zdHJlYW1fdHlwZSA9IHN0cmVhbV90eXBlOworCXN0cmVhbS0+cmVxdWVzdC5mb3JtYXRfaWQgPSBmb3JtYXRfaWQ7CisKKwl0cmFjZV9oc3dfc3RyZWFtX2FsbG9jX3JlcXVlc3Qoc3RyZWFtLCAmc3RyZWFtLT5yZXF1ZXN0KTsKKworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fYnVmZmVyKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCXUzMiByaW5nX3B0X2FkZHJlc3MsIHUzMiBudW1fcGFnZXMsCisJdTMyIHJpbmdfc2l6ZSwgdTMyIHJpbmdfb2Zmc2V0LCB1MzIgcmluZ19maXJzdF9wZm4pCit7CisJaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBidWZmZXJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19wdF9hZGRyZXNzID0gcmluZ19wdF9hZGRyZXNzOworCXN0cmVhbS0+cmVxdWVzdC5yaW5naW5mby5udW1fcGFnZXMgPSBudW1fcGFnZXM7CisJc3RyZWFtLT5yZXF1ZXN0LnJpbmdpbmZvLnJpbmdfc2l6ZSA9IHJpbmdfc2l6ZTsKKwlzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19vZmZzZXQgPSByaW5nX29mZnNldDsKKwlzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19maXJzdF9wZm4gPSByaW5nX2ZpcnN0X3BmbjsKKworCXRyYWNlX2hzd19zdHJlYW1fYnVmZmVyKHN0cmVhbSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9tb2R1bGVfaW5mbyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCBlbnVtIHNzdF9oc3dfbW9kdWxlX2lkIG1vZHVsZV9pZCwKKwl1MzIgZW50cnlfcG9pbnQpCit7CisJc3RydWN0IHNzdF9oc3dfbW9kdWxlX21hcCAqbWFwID0gJnN0cmVhbS0+cmVxdWVzdC5tYXA7CisKKwlpZiAoc3RyZWFtLT5jb21taXRlZCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXR0ZWQgZm9yIHNldCBtb2R1bGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBvbmx5IHN1cHBvcnQgaW5pdGlhbCBtb2R1bGUgYXRtICovCisJbWFwLT5tb2R1bGVfZW50cmllc19jb3VudCA9IDE7CisJbWFwLT5tb2R1bGVfZW50cmllc1swXS5tb2R1bGVfaWQgPSBtb2R1bGVfaWQ7CisJbWFwLT5tb2R1bGVfZW50cmllc1swXS5lbnRyeV9wb2ludCA9IGVudHJ5X3BvaW50OworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfcG1lbW9yeV9pbmZvKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBvZmZzZXQsIHUzMiBzaXplKQoreworCWlmIChzdHJlYW0tPmNvbW1pdGVkKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc3RyZWFtIGNvbW1pdHRlZCBmb3Igc2V0IHBtZW1cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdHJlYW0tPnJlcXVlc3QucGVyc2lzdGVudF9tZW0ub2Zmc2V0ID0gb2Zmc2V0OworCXN0cmVhbS0+cmVxdWVzdC5wZXJzaXN0ZW50X21lbS5zaXplID0gc2l6ZTsKKworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3NtZW1vcnlfaW5mbyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1MzIgb2Zmc2V0LCB1MzIgc2l6ZSkKK3sKKwlpZiAoc3RyZWFtLT5jb21taXRlZCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXR0ZWQgZm9yIHNldCBzbWVtXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RyZWFtLT5yZXF1ZXN0LnNjcmF0Y2hfbWVtLm9mZnNldCA9IG9mZnNldDsKKwlzdHJlYW0tPnJlcXVlc3Quc2NyYXRjaF9tZW0uc2l6ZSA9IHNpemU7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX2NvbW1pdChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2FsbG9jX3JlcSAqc3RyX3JlcSA9ICZzdHJlYW0tPnJlcXVlc3Q7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9hbGxvY19yZXBseSAqcmVwbHkgPSAmc3RyZWFtLT5yZXBseTsKKwl1MzIgaGVhZGVyOworCWludCByZXQ7CisKKwl0cmFjZV9pcGNfcmVxdWVzdCgic3RyZWFtIGFsbG9jIiwgc3RyZWFtLT5ob3N0X2lkKTsKKworCWhlYWRlciA9IElQQ19HTEJfVFlQRShJUENfR0xCX0FMTE9DQVRFX1NUUkVBTSk7CisKKwlyZXQgPSBpcGNfdHhfbWVzc2FnZV93YWl0KGhzdywgaGVhZGVyLCBzdHJfcmVxLCBzaXplb2YoKnN0cl9yZXEpLAorCQlyZXBseSwgc2l6ZW9mKCpyZXBseSkpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc3RyZWFtIGNvbW1pdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXN0cmVhbS0+Y29tbWl0ZWQgPSAxOworCXRyYWNlX2hzd19zdHJlYW1fYWxsb2NfcmVwbHkoc3RyZWFtKTsKKworCXJldHVybiAwOworfQorCisvKiBTdHJlYW0gSW5mb3JtYXRpb24gLSB0aGVzZSBjYWxscyBjb3VsZCBiZSBpbmxpbmUgYnV0IHdlIHdhbnQgdGhlIElQQworIEFCSSB0byBiZSBvcGFxdWUgdG8gY2xpZW50IFBDTSBkcml2ZXJzIHRvIGNvcGUgd2l0aCBhbnkgZnV0dXJlIEFCSSBjaGFuZ2VzICovCitpbnQgc3N0X2hzd19zdHJlYW1fZ2V0X2h3X2lkKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pCit7CisJcmV0dXJuIHN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fZ2V0X21peGVyX2lkKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pCit7CisJcmV0dXJuIHN0cmVhbS0+cmVwbHkubWl4ZXJfaHdfaWQ7Cit9CisKK3UzMiBzc3RfaHN3X3N0cmVhbV9nZXRfcmVhZF9yZWcoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwlyZXR1cm4gc3RyZWFtLT5yZXBseS5yZWFkX3Bvc2l0aW9uX3JlZ2lzdGVyX2FkZHJlc3M7Cit9CisKK3UzMiBzc3RfaHN3X3N0cmVhbV9nZXRfcG9pbnRlcl9yZWcoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwlyZXR1cm4gc3RyZWFtLT5yZXBseS5wcmVzZW50YXRpb25fcG9zaXRpb25fcmVnaXN0ZXJfYWRkcmVzczsKK30KKwordTMyIHNzdF9oc3dfc3RyZWFtX2dldF9wZWFrX3JlZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1MzIgY2hhbm5lbCkKK3sKKwlpZiAoY2hhbm5lbCA+PSAyKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzdHJlYW0tPnJlcGx5LnBlYWtfbWV0ZXJfcmVnaXN0ZXJfYWRkcmVzc1tjaGFubmVsXTsKK30KKwordTMyIHNzdF9oc3dfc3RyZWFtX2dldF92b2xfcmVnKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBjaGFubmVsKQoreworCWlmIChjaGFubmVsID49IDIpCisJCXJldHVybiAwOworCisJcmV0dXJuIHN0cmVhbS0+cmVwbHkudm9sdW1lX3JlZ2lzdGVyX2FkZHJlc3NbY2hhbm5lbF07Cit9CisKK2ludCBzc3RfaHN3X21peGVyX2dldF9pbmZvKHN0cnVjdCBzc3RfaHN3ICpoc3cpCit7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9pbmZvX3JlcGx5ICpyZXBseTsKKwl1MzIgaGVhZGVyOworCWludCByZXQ7CisKKwlyZXBseSA9ICZoc3ctPm1peGVyX2luZm87CisJaGVhZGVyID0gSVBDX0dMQl9UWVBFKElQQ19HTEJfR0VUX01JWEVSX1NUUkVBTV9JTkZPKTsKKworCXRyYWNlX2lwY19yZXF1ZXN0KCJnZXQgZ2xvYmFsIG1peGVyIGluZm8iLCAwKTsKKworCXJldCA9IGlwY190eF9tZXNzYWdlX3dhaXQoaHN3LCBoZWFkZXIsIE5VTEwsIDAsIHJlcGx5LCBzaXplb2YoKnJlcGx5KSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBnZXQgc3RyZWFtIGluZm8gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl0cmFjZV9oc3dfbWl4ZXJfaW5mb19yZXBseShyZXBseSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogU2VuZCBzdHJlYW0gY29tbWFuZCAqLworc3RhdGljIGludCBzc3RfaHN3X3N0cmVhbV9vcGVyYXRpb25zKHN0cnVjdCBzc3RfaHN3ICpoc3csIGludCB0eXBlLAorCWludCBzdHJlYW1faWQsIGludCB3YWl0KQoreworCXUzMiBoZWFkZXI7CisKKwloZWFkZXIgPSBJUENfR0xCX1RZUEUoSVBDX0dMQl9TVFJFQU1fTUVTU0FHRSkgfCBJUENfU1RSX1RZUEUodHlwZSk7CisJaGVhZGVyIHw9IChzdHJlYW1faWQgPDwgSVBDX1NUUl9JRF9TSElGVCk7CisKKwlpZiAod2FpdCkKKwkJcmV0dXJuIGlwY190eF9tZXNzYWdlX3dhaXQoaHN3LCBoZWFkZXIsIE5VTEwsIDAsIE5VTEwsIDApOworCWVsc2UKKwkJcmV0dXJuIGlwY190eF9tZXNzYWdlX25vd2FpdChoc3csIGhlYWRlciwgTlVMTCwgMCk7Cit9CisKKy8qIFN0cmVhbSBBTFNBIHRyaWdnZXIgb3BlcmF0aW9ucyAqLworaW50IHNzdF9oc3dfc3RyZWFtX3BhdXNlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCWludCB3YWl0KQoreworCWludCByZXQ7CisKKwl0cmFjZV9pcGNfcmVxdWVzdCgic3RyZWFtIHBhdXNlIiwgc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOworCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fb3BlcmF0aW9ucyhoc3csIElQQ19TVFJfUEFVU0UsCisJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkLCB3YWl0KTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBmYWlsZWQgdG8gcGF1c2Ugc3RyZWFtICVkXG4iLAorCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3Jlc3VtZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwlpbnQgd2FpdCkKK3sKKwlpbnQgcmV0OworCisJdHJhY2VfaXBjX3JlcXVlc3QoInN0cmVhbSByZXN1bWUiLCBzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCk7CisKKwlyZXQgPSBzc3RfaHN3X3N0cmVhbV9vcGVyYXRpb25zKGhzdywgSVBDX1NUUl9SRVNVTUUsCisJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkLCB3YWl0KTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBmYWlsZWQgdG8gcmVzdW1lIHN0cmVhbSAlZFxuIiwKKwkJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBzc3RfaHN3X3N0cmVhbV9yZXNldChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwlpbnQgcmV0LCB0cmllcyA9IDEwOworCisJLyogZG9udCByZXNldCBzdHJlYW1zIHRoYXQgYXJlIG5vdCBjb21taXRlZCAqLworCWlmICghc3RyZWFtLT5jb21taXRlZCkKKwkJcmV0dXJuIDA7CisKKwkvKiB3YWl0IGZvciBwYXVzZSB0byBjb21wbGV0ZSBiZWZvcmUgd2UgcmVzZXQgdGhlIHN0cmVhbSAqLworCXdoaWxlIChzdHJlYW0tPnJ1bm5pbmcgJiYgdHJpZXMtLSkKKwkJbXNsZWVwKDEpOworCWlmICghdHJpZXMpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiByZXNldCBzdHJlYW0gJWQgc3RpbGwgcnVubmluZ1xuIiwKKwkJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdHJhY2VfaXBjX3JlcXVlc3QoInN0cmVhbSByZXNldCIsIHN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKworCXJldCA9IHNzdF9oc3dfc3RyZWFtX29wZXJhdGlvbnMoaHN3LCBJUENfU1RSX1JFU0VULAorCQlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCwgMSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIHJlc2V0IHN0cmVhbSAlZFxuIiwKKwkJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBTdHJlYW0gcG9pbnRlciBwb3NpdGlvbnMgKi8KK2ludCBzc3RfaHN3X2dldF9kc3BfcG9zaXRpb24oc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwlyZXR1cm4gc3RyZWFtLT5ycG9zLnBvc2l0aW9uOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3dyaXRlX3Bvc2l0aW9uKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBzdGFnZV9pZCwgdTMyIHBvc2l0aW9uKQoreworCXUzMiBoZWFkZXI7CisJaW50IHJldDsKKworCXRyYWNlX3N0cmVhbV93cml0ZV9wb3NpdGlvbihzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCwgcG9zaXRpb24pOworCisJaGVhZGVyID0gSVBDX0dMQl9UWVBFKElQQ19HTEJfU1RSRUFNX01FU1NBR0UpIHwKKwkJSVBDX1NUUl9UWVBFKElQQ19TVFJfU1RBR0VfTUVTU0FHRSk7CisJaGVhZGVyIHw9IChzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCA8PCBJUENfU1RSX0lEX1NISUZUKTsKKwloZWFkZXIgfD0gKElQQ19TVEdfU0VUX1dSSVRFX1BPU0lUSU9OIDw8IElQQ19TVEdfVFlQRV9TSElGVCk7CisJaGVhZGVyIHw9IChzdGFnZV9pZCA8PCBJUENfU1RHX0lEX1NISUZUKTsKKwlzdHJlYW0tPndwb3MucG9zaXRpb24gPSBwb3NpdGlvbjsKKworCXJldCA9IGlwY190eF9tZXNzYWdlX25vd2FpdChoc3csIGhlYWRlciwgJnN0cmVhbS0+d3BvcywKKwkJc2l6ZW9mKHN0cmVhbS0+d3BvcykpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSAlZCBzZXQgcG9zaXRpb24gJWQgZmFpbGVkXG4iLAorCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQsIHBvc2l0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIHBoeXNpY2FsIEJFIGNvbmZpZyAqLworaW50IHNzdF9oc3dfZGV2aWNlX3NldF9jb25maWcoc3RydWN0IHNzdF9oc3cgKmhzdywKKwllbnVtIHNzdF9oc3dfZGV2aWNlX2lkIGRldiwgZW51bSBzc3RfaHN3X2RldmljZV9tY2xrIG1jbGssCisJZW51bSBzc3RfaHN3X2RldmljZV9tb2RlIG1vZGUsIHUzMiBjbG9ja19kaXZpZGVyKQoreworCXN0cnVjdCBzc3RfaHN3X2lwY19kZXZpY2VfY29uZmlnX3JlcSBjb25maWc7CisJdTMyIGhlYWRlcjsKKwlpbnQgcmV0OworCisJdHJhY2VfaXBjX3JlcXVlc3QoInNldCBkZXZpY2UgY29uZmlnIiwgZGV2KTsKKworCWNvbmZpZy5zc3BfaW50ZXJmYWNlID0gZGV2OworCWNvbmZpZy5jbG9ja19mcmVxdWVuY3kgPSBtY2xrOworCWNvbmZpZy5tb2RlID0gbW9kZTsKKwljb25maWcuY2xvY2tfZGl2aWRlciA9IGNsb2NrX2RpdmlkZXI7CisKKwl0cmFjZV9oc3dfZGV2aWNlX2NvbmZpZ19yZXEoJmNvbmZpZyk7CisKKwloZWFkZXIgPSBJUENfR0xCX1RZUEUoSVBDX0dMQl9TRVRfREVWSUNFX0ZPUk1BVFMpOworCisJcmV0ID0gaXBjX3R4X21lc3NhZ2Vfd2FpdChoc3csIGhlYWRlciwgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZyksCisJCU5VTEwsIDApOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHNldCBkZXZpY2UgZm9ybWF0cyBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9oc3dfZGV2aWNlX3NldF9jb25maWcpOworCisvKiBEWCBDb25maWcgKi8KK2ludCBzc3RfaHN3X2R4X3NldF9zdGF0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCWVudW0gc3N0X2hzd19keF9zdGF0ZSBzdGF0ZSwgc3RydWN0IHNzdF9oc3dfaXBjX2R4X3JlcGx5ICpkeCkKK3sKKwl1MzIgaGVhZGVyLCBzdGF0ZV87CisJaW50IHJldDsKKworCWhlYWRlciA9IElQQ19HTEJfVFlQRShJUENfR0xCX0VOVEVSX0RYX1NUQVRFKTsKKwlzdGF0ZV8gPSBzdGF0ZTsKKworCXRyYWNlX2lwY19yZXF1ZXN0KCJQTSBlbnRlciBEeCBzdGF0ZSIsIHN0YXRlKTsKKworCXJldCA9IGlwY190eF9tZXNzYWdlX3dhaXQoaHN3LCBoZWFkZXIsICZzdGF0ZV8sIHNpemVvZihzdGF0ZV8pLAorCQlkeCwgc2l6ZW9mKGR4KSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImlwYzogZXJyb3Igc2V0IGR4IHN0YXRlICVkIGZhaWxlZFxuIiwgc3RhdGUpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9kYmcoaHN3LT5kZXYsICJpcGM6IGdvdCAlZCBlbnRyeSBudW1iZXJzIGZvciBzdGF0ZSAlZFxuIiwKKwkJZHgtPmVudHJpZXNfbm8sIHN0YXRlKTsKKworCW1lbWNweSgmaHN3LT5keCwgZHgsIHNpemVvZigqZHgpKTsKKwlyZXR1cm4gMDsKK30KKworLyogVXNlZCB0byBzYXZlIHN0YXRlIGludG8gaHN3LT5keF9yZXBseSAqLworaW50IHNzdF9oc3dfZHhfZ2V0X3N0YXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBpdGVtLAorCXUzMiAqb2Zmc2V0LCB1MzIgKnNpemUsIHUzMiAqc291cmNlKQoreworCXN0cnVjdCBzc3RfaHN3X2lwY19keF9tZW1vcnlfaXRlbSAqZHhfbWVtOworCXN0cnVjdCBzc3RfaHN3X2lwY19keF9yZXBseSAqZHhfcmVwbHk7CisJaW50IGVudHJ5X25vOworCisJZHhfcmVwbHkgPSAmaHN3LT5keDsKKwllbnRyeV9ubyA9IGR4X3JlcGx5LT5lbnRyaWVzX25vOworCisJdHJhY2VfaXBjX3JlcXVlc3QoIlBNIGdldCBEeCBzdGF0ZSIsIGVudHJ5X25vKTsKKworCWlmIChpdGVtID49IGVudHJ5X25vKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWR4X21lbSA9ICZkeF9yZXBseS0+bWVtX2luZm9baXRlbV07CisJKm9mZnNldCA9IGR4X21lbS0+b2Zmc2V0OworCSpzaXplID0gZHhfbWVtLT5zaXplOworCSpzb3VyY2UgPSBkeF9tZW0tPnNvdXJjZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zZ19lbXB0eV9saXN0X2luaXQoc3RydWN0IHNzdF9oc3cgKmhzdykKK3sKKwlpbnQgaTsKKworCWhzdy0+bXNnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlwY19tZXNzYWdlKSAqCisJCUlQQ19FTVBUWV9MSVNUX1NJWkUsIEdGUF9LRVJORUwpOworCWlmIChoc3ctPm1zZyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBJUENfRU1QVFlfTElTVF9TSVpFOyBpKyspIHsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaHN3LT5tc2dbaV0ud2FpdHEpOworCQlsaXN0X2FkZCgmaHN3LT5tc2dbaV0ubGlzdCwgJmhzdy0+ZW1wdHlfbGlzdCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc3N0X2hzd19zZXRfc2NyYXRjaF9tb2R1bGUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqc2NyYXRjaCkKK3sKKwloc3ctPnNjcmF0Y2ggPSBzY3JhdGNoOworfQorCitzdHJ1Y3Qgc3N0X2RzcCAqc3N0X2hzd19nZXRfZHNwKHN0cnVjdCBzc3RfaHN3ICpoc3cpCit7CisJcmV0dXJuIGhzdy0+ZHNwOworfQorCitzdGF0aWMgc3RydWN0IHNzdF9kc3BfZGV2aWNlIGhzd19kZXYgPSB7CisJLnRocmVhZCA9IGhzd19pcnFfdGhyZWFkLAorCS5vcHMgPSAmaGFzd2VsbF9vcHMsCit9OworCitpbnQgc3N0X2hzd19kc3BfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQoreworCXN0cnVjdCBzc3RfaHN3X2lwY19md192ZXJzaW9uIHZlcnNpb247CisJc3RydWN0IHNzdF9oc3cgKmhzdzsKKwlzdHJ1Y3Qgc3N0X2Z3ICpoc3dfc3N0X2Z3OworCWludCByZXQ7CisKKwlkZXZfZGJnKGRldiwgImluaXRpYWxpc2luZyBBdWRpbyBEU1AgSVBDXG4iKTsKKworCWhzdyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaHN3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGhzdyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhzdy0+ZGV2ID0gZGV2OworCUlOSVRfTElTVF9IRUFEKCZoc3ctPnN0cmVhbV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaHN3LT50eF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaHN3LT5yeF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaHN3LT5lbXB0eV9saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZoc3ctPmJvb3Rfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaHN3LT53YWl0X3R4cSk7CisKKwlyZXQgPSBtc2dfZW1wdHlfbGlzdF9pbml0KGhzdyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gbGlzdF9lcnI7CisKKwkvKiBzdGFydCB0aGUgSVBDIG1lc3NhZ2UgdGhyZWFkICovCisJaW5pdF9rdGhyZWFkX3dvcmtlcigmaHN3LT5rd29ya2VyKTsKKwloc3ctPnR4X3RocmVhZCA9IGt0aHJlYWRfcnVuKGt0aHJlYWRfd29ya2VyX2ZuLAorCQkJCQkgICAmaHN3LT5rd29ya2VyLAorCQkJCQkgICBkZXZfbmFtZShoc3ctPmRldikpOworCWlmIChJU19FUlIoaHN3LT50eF90aHJlYWQpKSB7CisJCXJldCA9IFBUUl9FUlIoaHN3LT50eF90aHJlYWQpOworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBjcmVhdGUgbWVzc2FnZSBUWCB0YXNrXG4iKTsKKwkJZ290byBsaXN0X2VycjsKKwl9CisJaW5pdF9rdGhyZWFkX3dvcmsoJmhzdy0+a3dvcmssIGlwY190eF9tc2dzKTsKKworCWhzd19kZXYudGhyZWFkX2NvbnRleHQgPSBoc3c7CisKKwkvKiBpbml0IFNTVCBzaGltICovCisJaHN3LT5kc3AgPSBzc3RfZHNwX25ldyhkZXYsICZoc3dfZGV2LCBwZGF0YSk7CisJaWYgKGhzdy0+ZHNwID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBsaXN0X2VycjsKKwl9CisKKwkvKiBrZWVwIHRoZSBEU1AgaW4gcmVzZXQgc3RhdGUgZm9yIGJhc2UgRlcgbG9hZGluZyAqLworCXNzdF9kc3BfcmVzZXQoaHN3LT5kc3ApOworCisJaHN3X3NzdF9mdyA9IHNzdF9md19uZXcoaHN3LT5kc3AsIHBkYXRhLT5mdywgaHN3KTsKKworCWlmIChoc3dfc3N0X2Z3ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZGV2X2VycihkZXYsICJlcnJvcjogZmFpbGVkIHRvIGxvYWQgZmlybXdhcmVcbiIpOworCQlnb3RvIGZ3X2VycjsKKwl9CisKKwkvKiB3YWl0IGZvciBEU1AgYm9vdCBjb21wbGV0aW9uICovCisJc3N0X2RzcF9ib290KGhzdy0+ZHNwKTsKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoaHN3LT5ib290X3dhaXQsIGhzdy0+Ym9vdF9jb21wbGV0ZSwKKwkJbXNlY3NfdG9famlmZmllcyhJUENfQk9PVF9NU0VDUykpOworCWlmIChyZXQgPT0gMCkgeworCQlyZXQgPSAtRUlPOworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IEFEU1AgYm9vdCB0aW1lb3V0XG4iKTsKKwkJZ290byBib290X2VycjsKKwl9CisKKwkvKiBnZXQgdGhlIEZXIHZlcnNpb24gKi8KKwlzc3RfaHN3X2Z3X2dldF92ZXJzaW9uKGhzdywgJnZlcnNpb24pOworCWRldl9pbmZvKGhzdy0+ZGV2LCAiRlcgbG9hZGVkOiB0eXBlICVkIC0gdmVyc2lvbjogJWQuJWQgYnVpbGQgJWRcbiIsCisJCXZlcnNpb24udHlwZSwgdmVyc2lvbi5tYWpvciwgdmVyc2lvbi5taW5vciwgdmVyc2lvbi5idWlsZCk7CisKKwkvKiBnZXQgdGhlIGdsb2JhbG1peGVyICovCisJcmV0ID0gc3N0X2hzd19taXhlcl9nZXRfaW5mbyhoc3cpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIGdldCBzdHJlYW0gaW5mb1xuIik7CisJCWdvdG8gYm9vdF9lcnI7CisJfQorCisJcGRhdGEtPmRzcCA9IGhzdzsKKwlyZXR1cm4gMDsKKworYm9vdF9lcnI6CisJc3N0X2RzcF9yZXNldChoc3ctPmRzcCk7CisJc3N0X2Z3X2ZyZWUoaHN3X3NzdF9mdyk7Citmd19lcnI6CisJc3N0X2RzcF9mcmVlKGhzdy0+ZHNwKTsKKwlrZnJlZShoc3ctPm1zZyk7CitsaXN0X2VycjoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2hzd19kc3BfaW5pdCk7CisKK3ZvaWQgc3N0X2hzd19kc3BfZnJlZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQoreworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+ZHNwOworCisJc3N0X2RzcF9yZXNldChoc3ctPmRzcCk7CisJc3N0X2Z3X2ZyZWVfYWxsKGhzdy0+ZHNwKTsKKwlzc3RfZHNwX2ZyZWUoaHN3LT5kc3ApOworCWtmcmVlKGhzdy0+c2NyYXRjaCk7CisJa2ZyZWUoaHN3LT5tc2cpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2hzd19kc3BfZnJlZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtaXBjLmggYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtaXBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxNzkyOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtaGFzd2VsbC1pcGMuaApAQCAtMCwwICsxLDQ4OCBAQAorLyoKKyAqIEludGVsIFNTVCBIYXN3ZWxsL0Jyb2Fkd2VsbCBJUEMgU3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9fU1NUX0hBU1dFTExfSVBDX0gKKyNkZWZpbmUgX19TU1RfSEFTV0VMTF9JUENfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2RlZmluZSBTU1RfSFNXX05PX0NIQU5ORUxTCQkyCisjZGVmaW5lIFNTVF9IU1dfTUFYX0RYX1JFR0lPTlMJCTE0CisKKyNkZWZpbmUgU1NUX0hTV19GV19MT0dfQ09ORklHX0RXT1JEUwkxMgorI2RlZmluZSBTU1RfSFNXX0dMT0JBTF9MT0cJCTE1CisKKy8qKgorICogVXBmcm9udCBkZWZpbmVkIG1heGltdW0gbWVzc2FnZSBzaXplIHRoYXQgaXMKKyAqIGV4cGVjdGVkIGJ5IHRoZSBpbi9vdXQgY29tbXVuaWNhdGlvbiBwaXBlcyBpbiBGVy4KKyAqLworI2RlZmluZSBTU1RfSFNXX0lQQ19NQVhfUEFZTE9BRF9TSVpFCTQwMAorI2RlZmluZSBTU1RfSFNXX01BWF9JTkZPX1NJWkUJCTY0CisjZGVmaW5lIFNTVF9IU1dfQlVJTERfSEFTSF9MRU5HVEgJNDAKKworc3RydWN0IHNzdF9oc3c7CitzdHJ1Y3Qgc3N0X2hzd19zdHJlYW07CitzdHJ1Y3Qgc3N0X2hzd19sb2dfc3RyZWFtOworc3RydWN0IHNzdF9wZGF0YTsKK3N0cnVjdCBzc3RfbW9kdWxlOworZXh0ZXJuIHN0cnVjdCBzc3Rfb3BzIGhhc3dlbGxfb3BzOworCisvKiBTdHJlYW0gQWxsb2NhdGUgUGF0aCBJRCAqLworZW51bSBzc3RfaHN3X3N0cmVhbV9wYXRoX2lkIHsKKwlTU1RfSFNXX1NUUkVBTV9QQVRIX1NTUDBfT1VUID0gMCwKKwlTU1RfSFNXX1NUUkVBTV9QQVRIX1NTUDBfSU4gPSAxLAorCVNTVF9IU1dfU1RSRUFNX1BBVEhfTUFYX1BBVEhfSUQgPSAyLAorfTsKKworLyogU3RyZWFtIEFsbG9jYXRlIFN0cmVhbSBUeXBlICovCitlbnVtIHNzdF9oc3dfc3RyZWFtX3R5cGUgeworCVNTVF9IU1dfU1RSRUFNX1RZUEVfUkVOREVSID0gMCwKKwlTU1RfSFNXX1NUUkVBTV9UWVBFX1NZU1RFTSA9IDEsCisJU1NUX0hTV19TVFJFQU1fVFlQRV9DQVBUVVJFID0gMiwKKwlTU1RfSFNXX1NUUkVBTV9UWVBFX0xPT1BCQUNLID0gMywKKwlTU1RfSFNXX1NUUkVBTV9UWVBFX01BWF9TVFJFQU1fVFlQRSA9IDQsCit9OworCisvKiBTdHJlYW0gQWxsb2NhdGUgU3RyZWFtIEZvcm1hdCAqLworZW51bSBzc3RfaHN3X3N0cmVhbV9mb3JtYXQgeworCVNTVF9IU1dfU1RSRUFNX0ZPUk1BVF9QQ01fRk9STUFUID0gMCwKKwlTU1RfSFNXX1NUUkVBTV9GT1JNQVRfTVAzX0ZPUk1BVCA9IDEsCisJU1NUX0hTV19TVFJFQU1fRk9STUFUX0FBQ19GT1JNQVQgPSAyLAorCVNTVF9IU1dfU1RSRUFNX0ZPUk1BVF9NQVhfRk9STUFUX0lEID0gMywKK307CisKKy8qIERldmljZSBJRCAqLworZW51bSBzc3RfaHN3X2RldmljZV9pZCB7CisJU1NUX0hTV19ERVZJQ0VfU1NQXzAgICA9IDAsCisJU1NUX0hTV19ERVZJQ0VfU1NQXzEgICA9IDEsCit9OworCisvKiBEZXZpY2UgTWFzdGVyIENsb2NrIEZyZXF1ZW5jeSAqLworZW51bSBzc3RfaHN3X2RldmljZV9tY2xrIHsKKwlTU1RfSFNXX0RFVklDRV9NQ0xLX09GRiAgICAgICAgID0gMCwKKwlTU1RfSFNXX0RFVklDRV9NQ0xLX0ZSRVFfNl9NSFogID0gMSwKKwlTU1RfSFNXX0RFVklDRV9NQ0xLX0ZSRVFfMTJfTUhaID0gMiwKKwlTU1RfSFNXX0RFVklDRV9NQ0xLX0ZSRVFfMjRfTUhaID0gMywKK307CisKKy8qIERldmljZSBDbG9jayBNYXN0ZXIgKi8KK2VudW0gc3N0X2hzd19kZXZpY2VfbW9kZSB7CisJU1NUX0hTV19ERVZJQ0VfQ0xPQ0tfU0xBVkUgICA9IDAsCisJU1NUX0hTV19ERVZJQ0VfQ0xPQ0tfTUFTVEVSICA9IDEsCit9OworCisvKiBEWCBQb3dlciBTdGF0ZSAqLworZW51bSBzc3RfaHN3X2R4X3N0YXRlIHsKKwlTU1RfSFNXX0RYX1NUQVRFX0QwICAgICA9IDAsCisJU1NUX0hTV19EWF9TVEFURV9EMSAgICAgPSAxLAorCVNTVF9IU1dfRFhfU1RBVEVfRDMgICAgID0gMywKKwlTU1RfSFNXX0RYX1NUQVRFX01BWAk9IDMsCit9OworCisvKiBBdWRpbyBzdHJlYW0gc3RhZ2UgSURzICovCitlbnVtIHNzdF9oc3dfZnhfc3RhZ2VfaWQgeworCVNTVF9IU1dfU1RBR0VfSURfV0FWRVMgPSAwLAorCVNTVF9IU1dfU1RBR0VfSURfRFRTICAgPSAxLAorCVNTVF9IU1dfU1RBR0VfSURfRE9MQlkgPSAyLAorCVNTVF9IU1dfU1RBR0VfSURfQk9PU1QgPSAzLAorCVNTVF9IU1dfU1RBR0VfSURfTUFYX0ZYX0lECit9OworCisvKiBEWCBTdGF0ZSBUeXBlICovCitlbnVtIHNzdF9oc3dfZHhfdHlwZSB7CisJU1NUX0hTV19EWF9UWVBFX0ZXX0lNQUdFID0gMCwKKwlTU1RfSFNXX0RYX1RZUEVfTUVNT1JZX0RVTVAgPSAxCit9OworCisvKiBWb2x1bWUgQ3VydmUgVHlwZSovCitlbnVtIHNzdF9oc3dfdm9sdW1lX2N1cnZlIHsKKwlTU1RfSFNXX1ZPTFVNRV9DVVJWRV9OT05FID0gMCwKKwlTU1RfSFNXX1ZPTFVNRV9DVVJWRV9GQURFID0gMQorfTsKKworLyogU2FtcGxlIG9yZGVyaW5nICovCitlbnVtIHNzdF9oc3dfaW50ZXJsZWF2aW5nIHsKKwlTU1RfSFNXX0lOVEVSTEVBVklOR19QRVJfQ0hBTk5FTCA9IDAsCisJU1NUX0hTV19JTlRFUkxFQVZJTkdfUEVSX1NBTVBMRSAgPSAxLAorfTsKKworLyogQ2hhbm5lbCBpbmRpY2VzICovCitlbnVtIHNzdF9oc3dfY2hhbm5lbF9pbmRleCB7CisJU1NUX0hTV19DSEFOTkVMX0xFRlQgICAgICAgICAgICA9IDAsCisJU1NUX0hTV19DSEFOTkVMX0NFTlRFUiAgICAgICAgICA9IDEsCisJU1NUX0hTV19DSEFOTkVMX1JJR0hUICAgICAgICAgICA9IDIsCisJU1NUX0hTV19DSEFOTkVMX0xFRlRfU1VSUk9VTkQgICA9IDMsCisJU1NUX0hTV19DSEFOTkVMX0NFTlRFUl9TVVJST1VORCA9IDMsCisJU1NUX0hTV19DSEFOTkVMX1JJR0hUX1NVUlJPVU5EICA9IDQsCisJU1NUX0hTV19DSEFOTkVMX0xGRSAgICAgICAgICAgICA9IDcsCisJU1NUX0hTV19DSEFOTkVMX0lOVkFMSUQgICAgICAgICA9IDB4RiwKK307CisKKy8qIExpc3Qgb2Ygc3VwcG9ydGVkIGNoYW5uZWwgbWFwcy4gKi8KK2VudW0gc3N0X2hzd19jaGFubmVsX2NvbmZpZyB7CisJU1NUX0hTV19DSEFOTkVMX0NPTkZJR19NT05PICAgICAgPSAwLCAvKiBtb25vIG9ubHkuICovCisJU1NUX0hTV19DSEFOTkVMX0NPTkZJR19TVEVSRU8gICAgPSAxLCAvKiBMICYgUi4gKi8KKwlTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzJfUE9JTlRfMSA9IDIsIC8qIEwsIFIgJiBMRkU7IFBDTSBvbmx5LiAqLworCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfM19QT0lOVF8wID0gMywgLyogTCwgQyAmIFI7IE1QMyAmIEFBQyBvbmx5LiAqLworCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfM19QT0lOVF8xID0gNCwgLyogTCwgQywgUiAmIExGRTsgUENNIG9ubHkuICovCisJU1NUX0hTV19DSEFOTkVMX0NPTkZJR19RVUFUUk8gICAgPSA1LCAvKiBMLCBSLCBMcyAmIFJzOyBQQ00gb25seS4gKi8KKwlTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzRfUE9JTlRfMCA9IDYsIC8qIEwsIEMsIFIgJiBDczsgTVAzICYgQUFDIG9ubHkuICovCisJU1NUX0hTV19DSEFOTkVMX0NPTkZJR181X1BPSU5UXzAgPSA3LCAvKiBMLCBDLCBSLCBMcyAmIFJzLiAqLworCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfNV9QT0lOVF8xID0gOCwgLyogTCwgQywgUiwgTHMsIFJzICYgTEZFLiAqLworCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfRFVBTF9NT05PID0gOSwgLyogT25lIGNoYW5uZWwgcmVwbGljYXRlZCBpbiB0d28uICovCisJU1NUX0hTV19DSEFOTkVMX0NPTkZJR19JTlZBTElELAorfTsKKworLyogTGlzdCBvZiBzdXBwb3J0ZWQgYml0IGRlcHRocy4gKi8KK2VudW0gc3N0X2hzd19iaXRkZXB0aCB7CisJU1NUX0hTV19ERVBUSF84QklUICA9IDgsCisJU1NUX0hTV19ERVBUSF8xNkJJVCA9IDE2LAorCVNTVF9IU1dfREVQVEhfMjRCSVQgPSAyNCwgLyogRGVmYXVsdC4gKi8KKwlTU1RfSFNXX0RFUFRIXzMyQklUID0gMzIsCisJU1NUX0hTV19ERVBUSF9JTlZBTElEID0gMzMsCit9OworCitlbnVtIHNzdF9oc3dfbW9kdWxlX2lkIHsKKwlTU1RfSFNXX01PRFVMRV9CQVNFX0ZXID0gMHgwLAorCVNTVF9IU1dfTU9EVUxFX01QMyAgICAgPSAweDEsCisJU1NUX0hTV19NT0RVTEVfQUFDXzVfMSA9IDB4MiwKKwlTU1RfSFNXX01PRFVMRV9BQUNfMl8wID0gMHgzLAorCVNTVF9IU1dfTU9EVUxFX1NSQyAgICAgPSAweDQsCisJU1NUX0hTV19NT0RVTEVfV0FWRVMgICA9IDB4NSwKKwlTU1RfSFNXX01PRFVMRV9ET0xCWSAgID0gMHg2LAorCVNTVF9IU1dfTU9EVUxFX0JPT1NUICAgPSAweDcsCisJU1NUX0hTV19NT0RVTEVfTFBBTCAgICA9IDB4OCwKKwlTU1RfSFNXX01PRFVMRV9EVFMgICAgID0gMHg5LAorCVNTVF9IU1dfTU9EVUxFX1BDTV9DQVBUVVJFID0gMHhBLAorCVNTVF9IU1dfTU9EVUxFX1BDTV9TWVNURU0gPSAweEIsCisJU1NUX0hTV19NT0RVTEVfUENNX1JFRkVSRU5DRSA9IDB4QywKKwlTU1RfSFNXX01PRFVMRV9QQ00gPSAweEQsCisJU1NUX0hTV19NT0RVTEVfQkxVRVRPT1RIX1JFTkRFUl9NT0RVTEUgPSAweEUsCisJU1NUX0hTV19NT0RVTEVfQkxVRVRPT1RIX0NBUFRVUkVfTU9EVUxFID0gMHhGLAorCVNTVF9IU1dfTUFYX01PRFVMRV9JRCwKK307CisKK2VudW0gc3N0X2hzd19wZXJmb3JtYW5jZV9hY3Rpb24geworCVNTVF9IU1dfUEVSRl9TVEFSVCA9IDAsCisJU1NUX0hTV19QRVJGX1NUT1AgPSAxLAorfTsKKworLyogU1NUIGZpcm13YXJlIG1vZHVsZSBpbmZvICovCitzdHJ1Y3Qgc3N0X2hzd19tb2R1bGVfaW5mbyB7CisJdTggbmFtZVtTU1RfSFNXX01BWF9JTkZPX1NJWkVdOworCXU4IHZlcnNpb25bU1NUX0hTV19NQVhfSU5GT19TSVpFXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIE1vZHVsZSBlbnRyeSBwb2ludCAqLworc3RydWN0IHNzdF9oc3dfbW9kdWxlX2VudHJ5IHsKKwllbnVtIHNzdF9oc3dfbW9kdWxlX2lkIG1vZHVsZV9pZDsKKwl1MzIgZW50cnlfcG9pbnQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBNb2R1bGUgbWFwIC0gYWxpZ25lbWVudCBtYXRjaGVzIERTUCAqLworc3RydWN0IHNzdF9oc3dfbW9kdWxlX21hcCB7CisJdTggbW9kdWxlX2VudHJpZXNfY291bnQ7CisJc3RydWN0IHNzdF9oc3dfbW9kdWxlX2VudHJ5IG1vZHVsZV9lbnRyaWVzWzFdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNzdF9oc3dfbWVtb3J5X2luZm8geworCXUzMiBvZmZzZXQ7CisJdTMyIHNpemU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc3N0X2hzd19meF9lbmFibGUgeworCXN0cnVjdCBzc3RfaHN3X21vZHVsZV9tYXAgbW9kdWxlX21hcDsKKwlzdHJ1Y3Qgc3N0X2hzd19tZW1vcnlfaW5mbyBwZXJzaXN0ZW50X21lbTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzc3RfaHN3X2dldF9meF9wYXJhbSB7CisJdTMyIHBhcmFtZXRlcl9pZDsKKwl1MzIgcGFyYW1fc2l6ZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzc3RfaHN3X3BlcmZfYWN0aW9uIHsKKwl1MzIgYWN0aW9uOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNzdF9oc3dfcGVyZl9kYXRhIHsKKwl1NjQgdGltZXN0YW1wOworCXU2NCBjeWNsZXM7CisJdTY0IGRhdGF0aW1lOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogRlcgdmVyc2lvbiAqLworc3RydWN0IHNzdF9oc3dfaXBjX2Z3X3ZlcnNpb24geworCXU4IGJ1aWxkOworCXU4IG1pbm9yOworCXU4IG1ham9yOworCXU4IHR5cGU7CisJdTggZndfYnVpbGRfaGFzaFtTU1RfSFNXX0JVSUxEX0hBU0hfTEVOR1RIXTsKKwl1MzIgZndfbG9nX3Byb3ZpZGVyc19oYXNoOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogU3RyZWFtIHJpbmcgaW5mbyAqLworc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9yaW5nIHsKKwl1MzIgcmluZ19wdF9hZGRyZXNzOworCXUzMiBudW1fcGFnZXM7CisJdTMyIHJpbmdfc2l6ZTsKKwl1MzIgcmluZ19vZmZzZXQ7CisJdTMyIHJpbmdfZmlyc3RfcGZuOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogRGVidWcgRHVtcCBMb2cgRW5hYmxlIFJlcXVlc3QgKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19kZWJ1Z19sb2dfZW5hYmxlX3JlcSB7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9yaW5nIHJpbmdpbmZvOworCXUzMiBjb25maWdbU1NUX0hTV19GV19MT0dfQ09ORklHX0RXT1JEU107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBEZWJ1ZyBEdW1wIExvZyBSZXBseSAqLworc3RydWN0IHNzdF9oc3dfaXBjX2RlYnVnX2xvZ19yZXBseSB7CisJdTMyIGxvZ19idWZmZXJfYmVnaW5pbmc7CisJdTMyIGxvZ19idWZmZXJfc2l6ZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFN0cmVhbSBnbGl0Y2ggcG9zaXRpb24gKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fZ2xpdGNoX3Bvc2l0aW9uIHsKKwl1MzIgZ2xpdGNoX3R5cGU7CisJdTMyIHByZXNlbnRfcG9zOworCXUzMiB3cml0ZV9wb3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBTdHJlYW0gZ2V0IHBvc2l0aW9uICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2dldF9wb3NpdGlvbiB7CisJdTMyIHBvc2l0aW9uOworCXUzMiBmd19jeWNsZV9jb3VudDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFN0cmVhbSBzZXQgcG9zaXRpb24gKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fc2V0X3Bvc2l0aW9uIHsKKwl1MzIgcG9zaXRpb247CisJdTMyIGVuZF9vZl9idWZmZXI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBTdHJlYW0gRnJlZSBSZXF1ZXN0ICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2ZyZWVfcmVxIHsKKwl1OCBzdHJlYW1faWQ7CisJdTggcmVzZXJ2ZWRbM107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBTZXQgVm9sdW1lIFJlcXVlc3QgKi8KK3N0cnVjdCBzc3RfaHN3X2lwY192b2x1bWVfcmVxIHsKKwl1MzIgY2hhbm5lbDsKKwl1MzIgdGFyZ2V0X3ZvbHVtZTsKKwl1NjQgY3VydmVfZHVyYXRpb247CisJdTMyIGN1cnZlX3R5cGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBEZXZpY2UgQ29uZmlndXJhdGlvbiBSZXF1ZXN0ICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfZGV2aWNlX2NvbmZpZ19yZXEgeworCXUzMiBzc3BfaW50ZXJmYWNlOworCXUzMiBjbG9ja19mcmVxdWVuY3k7CisJdTMyIG1vZGU7CisJdTE2IGNsb2NrX2RpdmlkZXI7CisJdTE2IHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogQXVkaW8gRGF0YSBmb3JtYXRzICovCitzdHJ1Y3Qgc3N0X2hzd19hdWRpb19kYXRhX2Zvcm1hdF9pcGMgeworCXUzMiBmcmVxdWVuY3k7CisJdTMyIGJpdGRlcHRoOworCXUzMiBtYXA7CisJdTMyIGNvbmZpZzsKKwl1MzIgc3R5bGU7CisJdTggY2hfbnVtOworCXU4IHZhbGlkX2JpdDsKKwl1OCByZXNlcnZlZFsyXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFN0cmVhbSBBbGxvY2F0ZSBSZXF1ZXN0ICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2FsbG9jX3JlcSB7CisJdTggcGF0aF9pZDsKKwl1OCBzdHJlYW1fdHlwZTsKKwl1OCBmb3JtYXRfaWQ7CisJdTggcmVzZXJ2ZWQ7CisJc3RydWN0IHNzdF9oc3dfYXVkaW9fZGF0YV9mb3JtYXRfaXBjIGZvcm1hdDsKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX3JpbmcgcmluZ2luZm87CisJc3RydWN0IHNzdF9oc3dfbW9kdWxlX21hcCBtYXA7CisJc3RydWN0IHNzdF9oc3dfbWVtb3J5X2luZm8gcGVyc2lzdGVudF9tZW07CisJc3RydWN0IHNzdF9oc3dfbWVtb3J5X2luZm8gc2NyYXRjaF9tZW07CisJdTMyIG51bWJlcl9vZl9ub3RpZmljYXRpb25zOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogU3RyZWFtIEFsbG9jYXRlIFJlcGx5ICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2FsbG9jX3JlcGx5IHsKKwl1MzIgc3RyZWFtX2h3X2lkOworCXUzMiBtaXhlcl9od19pZDsgLy8gcmV0dXJucyByYXRlID8/Pz8KKwl1MzIgcmVhZF9wb3NpdGlvbl9yZWdpc3Rlcl9hZGRyZXNzOworCXUzMiBwcmVzZW50YXRpb25fcG9zaXRpb25fcmVnaXN0ZXJfYWRkcmVzczsKKwl1MzIgcGVha19tZXRlcl9yZWdpc3Rlcl9hZGRyZXNzW1NTVF9IU1dfTk9fQ0hBTk5FTFNdOworCXUzMiB2b2x1bWVfcmVnaXN0ZXJfYWRkcmVzc1tTU1RfSFNXX05PX0NIQU5ORUxTXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIEdldCBNaXhlciBTdHJlYW0gSW5mbyAqLworc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9pbmZvX3JlcGx5IHsKKwl1MzIgbWl4ZXJfaHdfaWQ7CisJdTMyIHBlYWtfbWV0ZXJfcmVnaXN0ZXJfYWRkcmVzc1tTU1RfSFNXX05PX0NIQU5ORUxTXTsKKwl1MzIgdm9sdW1lX3JlZ2lzdGVyX2FkZHJlc3NbU1NUX0hTV19OT19DSEFOTkVMU107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBEWCBTdGF0ZSBSZXF1ZXN0ICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfZHhfcmVxIHsKKwl1OCBzdGF0ZTsKKwl1OCByZXNlcnZlZFszXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIERYIFN0YXRlIFJlcGx5IE1lbW9yeSBJbmZvIEl0ZW0gKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19keF9tZW1vcnlfaXRlbSB7CisJdTMyIG9mZnNldDsKKwl1MzIgc2l6ZTsKKwl1MzIgc291cmNlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogRFggU3RhdGUgUmVwbHkgKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19keF9yZXBseSB7CisJdTMyIGVudHJpZXNfbm87CisJc3RydWN0IHNzdF9oc3dfaXBjX2R4X21lbW9yeV9pdGVtIG1lbV9pbmZvW1NTVF9IU1dfTUFYX0RYX1JFR0lPTlNdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNzdF9oc3dfaXBjX2Z3X3ZlcnNpb247CisKKy8qIFNTVCBJbml0ICYgRnJlZSAqLworc3RydWN0IHNzdF9oc3cgKnNzdF9oc3dfbmV3KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgdTggKmZ3LCBzaXplX3QgZndfbGVuZ3RoLAorCXUzMiBmd19vZmZzZXQpOwordm9pZCBzc3RfaHN3X2ZyZWUoc3RydWN0IHNzdF9oc3cgKmhzdyk7CitpbnQgc3N0X2hzd19md19nZXRfdmVyc2lvbihzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X2lwY19md192ZXJzaW9uICp2ZXJzaW9uKTsKK3UzMiBjcmVhdGVfY2hhbm5lbF9tYXAoZW51bSBzc3RfaHN3X2NoYW5uZWxfY29uZmlnIGNvbmZpZyk7CisKKy8qIFN0cmVhbSBNaXhlciBDb250cm9scyAtICovCitpbnQgc3N0X2hzd19zdHJlYW1fbXV0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwl1MzIgc3RhZ2VfaWQsIHUzMiBjaGFubmVsKTsKK2ludCBzc3RfaHN3X3N0cmVhbV91bm11dGUoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCisJdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCk7CisKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfdm9sdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwsIHUzMiB2b2x1bWUpOworaW50IHNzdF9oc3dfc3RyZWFtX2dldF92b2x1bWUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCwgdTMyICp2b2x1bWUpOworCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3ZvbHVtZV9jdXJ2ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1NjQgY3VydmVfZHVyYXRpb24sCisJZW51bSBzc3RfaHN3X3ZvbHVtZV9jdXJ2ZSBjdXJ2ZSk7CisKKy8qIEdsb2JhbCBNaXhlciBDb250cm9scyAtICovCitpbnQgc3N0X2hzd19taXhlcl9tdXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwpOworaW50IHNzdF9oc3dfbWl4ZXJfdW5tdXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwpOworCitpbnQgc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwsCisJdTMyIHZvbHVtZSk7CitpbnQgc3N0X2hzd19taXhlcl9nZXRfdm9sdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwsCisJdTMyICp2b2x1bWUpOworCitpbnQgc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lX2N1cnZlKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJdTY0IGN1cnZlX2R1cmF0aW9uLCBlbnVtIHNzdF9oc3dfdm9sdW1lX2N1cnZlIGN1cnZlKTsKKworLyogU3RyZWFtIEFQSSAqLworc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzc3RfaHN3X3N0cmVhbV9uZXcoc3RydWN0IHNzdF9oc3cgKmhzdywgaW50IGlkLAorCXUzMiAoKmdldF93cml0ZV9wb3NpdGlvbikoc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHZvaWQgKmRhdGEpLAorCXZvaWQgKmRhdGEpOworCitpbnQgc3N0X2hzd19zdHJlYW1fZnJlZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSk7CisKKy8qIFN0cmVhbSBDb25maWd1cmF0aW9uICovCitpbnQgc3N0X2hzd19zdHJlYW1fZm9ybWF0KHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCWVudW0gc3N0X2hzd19zdHJlYW1fcGF0aF9pZCBwYXRoX2lkLAorCWVudW0gc3N0X2hzd19zdHJlYW1fdHlwZSBzdHJlYW1fdHlwZSwKKwllbnVtIHNzdF9oc3dfc3RyZWFtX2Zvcm1hdCBmb3JtYXRfaWQpOworCitpbnQgc3N0X2hzd19zdHJlYW1fYnVmZmVyKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCXUzMiByaW5nX3B0X2FkZHJlc3MsIHUzMiBudW1fcGFnZXMsCisJdTMyIHJpbmdfc2l6ZSwgdTMyIHJpbmdfb2Zmc2V0LCB1MzIgcmluZ19maXJzdF9wZm4pOworCitpbnQgc3N0X2hzd19zdHJlYW1fY29tbWl0KHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtKTsKKworaW50IHNzdF9oc3dfc3RyZWFtX3NldF92YWxpZChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwl1MzIgYml0cyk7CitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3JhdGUoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCisJaW50IHJhdGUpOworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9iaXRzKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCWVudW0gc3N0X2hzd19iaXRkZXB0aCBiaXRzKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfY2hhbm5lbHMoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgaW50IGNoYW5uZWxzKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfbWFwX2NvbmZpZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1MzIgbWFwLAorCWVudW0gc3N0X2hzd19jaGFubmVsX2NvbmZpZyBjb25maWcpOworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9zdHlsZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwllbnVtIHNzdF9oc3dfaW50ZXJsZWF2aW5nIHN0eWxlKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfbW9kdWxlX2luZm8oc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgZW51bSBzc3RfaHN3X21vZHVsZV9pZCBtb2R1bGVfaWQsCisJdTMyIGVudHJ5X3BvaW50KTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfcG1lbW9yeV9pbmZvKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBvZmZzZXQsIHUzMiBzaXplKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfc21lbW9yeV9pbmZvKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBvZmZzZXQsIHUzMiBzaXplKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9nZXRfaHdfaWQoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSk7CitpbnQgc3N0X2hzd19zdHJlYW1fZ2V0X21peGVyX2lkKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pOwordTMyIHNzdF9oc3dfc3RyZWFtX2dldF9yZWFkX3JlZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtKTsKK3UzMiBzc3RfaHN3X3N0cmVhbV9nZXRfcG9pbnRlcl9yZWcoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSk7Cit1MzIgc3N0X2hzd19zdHJlYW1fZ2V0X3BlYWtfcmVnKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBjaGFubmVsKTsKK3UzMiBzc3RfaHN3X3N0cmVhbV9nZXRfdm9sX3JlZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1MzIgY2hhbm5lbCk7CitpbnQgc3N0X2hzd19taXhlcl9nZXRfaW5mbyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3KTsKKworLyogU3RyZWFtIEFMU0EgdHJpZ2dlciBvcGVyYXRpb25zICovCitpbnQgc3N0X2hzd19zdHJlYW1fcGF1c2Uoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCisJaW50IHdhaXQpOworaW50IHNzdF9oc3dfc3RyZWFtX3Jlc3VtZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwlpbnQgd2FpdCk7CitpbnQgc3N0X2hzd19zdHJlYW1fcmVzZXQoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pOworCisvKiBTdHJlYW0gcG9pbnRlciBwb3NpdGlvbnMgKi8KK2ludCBzc3RfaHN3X3N0cmVhbV9nZXRfcmVhZF9wb3Moc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyICpwb3NpdGlvbik7CitpbnQgc3N0X2hzd19zdHJlYW1fZ2V0X3dyaXRlX3BvcyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1MzIgKnBvc2l0aW9uKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfd3JpdGVfcG9zaXRpb24oc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyIHN0YWdlX2lkLCB1MzIgcG9zaXRpb24pOworaW50IHNzdF9oc3dfZ2V0X2RzcF9wb3NpdGlvbihzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtKTsKKworLyogSFcgcG9ydCBjb25maWcgKi8KK2ludCBzc3RfaHN3X2RldmljZV9zZXRfY29uZmlnKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJZW51bSBzc3RfaHN3X2RldmljZV9pZCBkZXYsIGVudW0gc3N0X2hzd19kZXZpY2VfbWNsayBtY2xrLAorCWVudW0gc3N0X2hzd19kZXZpY2VfbW9kZSBtb2RlLCB1MzIgY2xvY2tfZGl2aWRlcik7CisKKy8qIERYIENvbmZpZyAqLworaW50IHNzdF9oc3dfZHhfc2V0X3N0YXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJZW51bSBzc3RfaHN3X2R4X3N0YXRlIHN0YXRlLCBzdHJ1Y3Qgc3N0X2hzd19pcGNfZHhfcmVwbHkgKmR4KTsKK2ludCBzc3RfaHN3X2R4X2dldF9zdGF0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaXRlbSwKKwl1MzIgKm9mZnNldCwgdTMyICpzaXplLCB1MzIgKnNvdXJjZSk7CisKKy8qIGluaXQgKi8KK2ludCBzc3RfaHN3X2RzcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpOwordm9pZCBzc3RfaHN3X2RzcF9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpOworc3RydWN0IHNzdF9kc3AgKnNzdF9oc3dfZ2V0X2RzcChzdHJ1Y3Qgc3N0X2hzdyAqaHN3KTsKK3ZvaWQgc3N0X2hzd19zZXRfc2NyYXRjaF9tb2R1bGUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqc2NyYXRjaCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NzdC1oYXN3ZWxsLXBjbS5jIGIvc291bmQvc29jL2ludGVsL3NzdC1oYXN3ZWxsLXBjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzJkZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtcGNtLmMKQEAgLTAsMCArMSw4NzIgQEAKKy8qCisgKiBJbnRlbCBTU1QgSGFzd2VsbC9Ccm9hZHdlbGwgUENNIFN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbXByZXNzX2RyaXZlci5oPgorCisjaW5jbHVkZSAic3N0LWhhc3dlbGwtaXBjLmgiCisjaW5jbHVkZSAic3N0LWRzcC1wcml2LmgiCisjaW5jbHVkZSAic3N0LWRzcC5oIgorCisjZGVmaW5lIEhTV19QQ01fQ09VTlQJCTYKKyNkZWZpbmUgSFNXX1ZPTFVNRV9NQVgJCTB4N0ZGRkZGRkYJLyogMGRCICovCisKKy8qIHNpbXBsZSB2b2x1bWUgdGFibGUgKi8KK3N0YXRpYyBjb25zdCB1MzIgdm9sdW1lX21hcFtdID0geworCUhTV19WT0xVTUVfTUFYID4+IDMwLAorCUhTV19WT0xVTUVfTUFYID4+IDI5LAorCUhTV19WT0xVTUVfTUFYID4+IDI4LAorCUhTV19WT0xVTUVfTUFYID4+IDI3LAorCUhTV19WT0xVTUVfTUFYID4+IDI2LAorCUhTV19WT0xVTUVfTUFYID4+IDI1LAorCUhTV19WT0xVTUVfTUFYID4+IDI0LAorCUhTV19WT0xVTUVfTUFYID4+IDIzLAorCUhTV19WT0xVTUVfTUFYID4+IDIyLAorCUhTV19WT0xVTUVfTUFYID4+IDIxLAorCUhTV19WT0xVTUVfTUFYID4+IDIwLAorCUhTV19WT0xVTUVfTUFYID4+IDE5LAorCUhTV19WT0xVTUVfTUFYID4+IDE4LAorCUhTV19WT0xVTUVfTUFYID4+IDE3LAorCUhTV19WT0xVTUVfTUFYID4+IDE2LAorCUhTV19WT0xVTUVfTUFYID4+IDE1LAorCUhTV19WT0xVTUVfTUFYID4+IDE0LAorCUhTV19WT0xVTUVfTUFYID4+IDEzLAorCUhTV19WT0xVTUVfTUFYID4+IDEyLAorCUhTV19WT0xVTUVfTUFYID4+IDExLAorCUhTV19WT0xVTUVfTUFYID4+IDEwLAorCUhTV19WT0xVTUVfTUFYID4+IDksCisJSFNXX1ZPTFVNRV9NQVggPj4gOCwKKwlIU1dfVk9MVU1FX01BWCA+PiA3LAorCUhTV19WT0xVTUVfTUFYID4+IDYsCisJSFNXX1ZPTFVNRV9NQVggPj4gNSwKKwlIU1dfVk9MVU1FX01BWCA+PiA0LAorCUhTV19WT0xVTUVfTUFYID4+IDMsCisJSFNXX1ZPTFVNRV9NQVggPj4gMiwKKwlIU1dfVk9MVU1FX01BWCA+PiAxLAorCUhTV19WT0xVTUVfTUFYID4+IDAsCit9OworCisjZGVmaW5lIEhTV19QQ01fUEVSSU9EU19NQVgJNjQKKyNkZWZpbmUgSFNXX1BDTV9QRVJJT0RTX01JTgkyCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBoc3dfcGNtX2hhcmR3YXJlID0geworCS5pbmZvCQkJPSBTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fUEFVU0UgfAorCQkJCSAgU05EUlZfUENNX0lORk9fUkVTVU1FIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX05PX1BFUklPRF9XQUtFVVAsCisJLmZvcm1hdHMJCT0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRSB8CisJCQkJICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKKwkucGVyaW9kX2J5dGVzX21pbgk9IFBBR0VfU0laRSwKKwkucGVyaW9kX2J5dGVzX21heAk9IChIU1dfUENNX1BFUklPRFNfTUFYIC8gSFNXX1BDTV9QRVJJT0RTX01JTikgKiBQQUdFX1NJWkUsCisJLnBlcmlvZHNfbWluCQk9IEhTV19QQ01fUEVSSU9EU19NSU4sCisJLnBlcmlvZHNfbWF4CQk9IEhTV19QQ01fUEVSSU9EU19NQVgsCisJLmJ1ZmZlcl9ieXRlc19tYXgJPSBIU1dfUENNX1BFUklPRFNfTUFYICogUEFHRV9TSVpFLAorfTsKKworLyogcHJpdmF0ZSBkYXRhIGZvciBlYWNoIFBDTSBEU1Agc3RyZWFtICovCitzdHJ1Y3QgaHN3X3BjbV9kYXRhIHsKKwlpbnQgZGFpX2lkOworCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtOworCXUzMiB2b2x1bWVbMl07CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CisJc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW07CisJdW5zaWduZWQgaW50IHdwb3M7CisJc3RydWN0IG11dGV4IG11dGV4OworfTsKKworLyogcHJpdmF0ZSBkYXRhIGZvciB0aGUgZHJpdmVyICovCitzdHJ1Y3QgaHN3X3ByaXZfZGF0YSB7CisJLyogcnVudGltZSBEU1AgKi8KKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3OworCisJLyogcGFnZSB0YWJsZXMgKi8KKwl1bnNpZ25lZCBjaGFyICpwY21fcGdbSFNXX1BDTV9DT1VOVF1bMl07CisKKwkvKiBEQUkgZGF0YSAqLworCXN0cnVjdCBoc3dfcGNtX2RhdGEgcGNtW0hTV19QQ01fQ09VTlRdOworfTsKKworc3RhdGljIGlubGluZSB1MzIgaHN3X21peGVyX3RvX2lwYyh1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJaWYgKHZhbHVlID49IEFSUkFZX1NJWkUodm9sdW1lX21hcCkpCisJCXJldHVybiB2b2x1bWVfbWFwWzBdOworCWVsc2UKKwkJcmV0dXJuIHZvbHVtZV9tYXBbdmFsdWVdOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBoc3dfaXBjX3RvX21peGVyKHUzMiB2YWx1ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZvbHVtZV9tYXApOyBpKyspIHsKKwkJaWYgKHZvbHVtZV9tYXBbaV0gPj0gdmFsdWUpCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gaSAtIDE7Cit9CisKK3N0YXRpYyBpbnQgaHN3X3N0cmVhbV92b2x1bWVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KKwkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocGxhdGZvcm0pOworCXN0cnVjdCBoc3dfcGNtX2RhdGEgKnBjbV9kYXRhID0gJnBkYXRhLT5wY21bbWMtPnJlZ107CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisJdTMyIHZvbHVtZTsKKworCW11dGV4X2xvY2soJnBjbV9kYXRhLT5tdXRleCk7CisKKwlpZiAoIXBjbV9kYXRhLT5zdHJlYW0pIHsKKwkJcGNtX2RhdGEtPnZvbHVtZVswXSA9CisJCQloc3dfbWl4ZXJfdG9faXBjKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwkJcGNtX2RhdGEtPnZvbHVtZVsxXSA9CisJCQloc3dfbWl4ZXJfdG9faXBjKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKTsKKwkJbXV0ZXhfdW5sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPT0KKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pIHsKKwkJdm9sdW1lID0gaHN3X21peGVyX3RvX2lwYyh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJCXNzdF9oc3dfc3RyZWFtX3NldF92b2x1bWUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwLCAyLCB2b2x1bWUpOworCX0gZWxzZSB7CisJCXZvbHVtZSA9IGhzd19taXhlcl90b19pcGModWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCQlzc3RfaHN3X3N0cmVhbV9zZXRfdm9sdW1lKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMCwgMCwgdm9sdW1lKTsKKwkJdm9sdW1lID0gaHN3X21peGVyX3RvX2lwYyh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSk7CisJCXNzdF9oc3dfc3RyZWFtX3NldF92b2x1bWUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwLCAxLCB2b2x1bWUpOworCX0KKworCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoc3dfc3RyZWFtX3ZvbHVtZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQorCQkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwbGF0Zm9ybSk7CisJc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGEgPSAmcGRhdGEtPnBjbVttYy0+cmVnXTsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3ID0gcGRhdGEtPmhzdzsKKwl1MzIgdm9sdW1lOworCisJbXV0ZXhfbG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKworCWlmICghcGNtX2RhdGEtPnN0cmVhbSkgeworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CisJCQloc3dfaXBjX3RvX21peGVyKHBjbV9kYXRhLT52b2x1bWVbMF0pOworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9CisJCQloc3dfaXBjX3RvX21peGVyKHBjbV9kYXRhLT52b2x1bWVbMV0pOworCQltdXRleF91bmxvY2soJnBjbV9kYXRhLT5tdXRleCk7CisJCXJldHVybiAwOworCX0KKworCXNzdF9oc3dfc3RyZWFtX2dldF92b2x1bWUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwLCAwLCAmdm9sdW1lKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGhzd19pcGNfdG9fbWl4ZXIodm9sdW1lKTsKKwlzc3RfaHN3X3N0cmVhbV9nZXRfdm9sdW1lKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMCwgMSwgJnZvbHVtZSk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBoc3dfaXBjX3RvX21peGVyKHZvbHVtZSk7CisJbXV0ZXhfdW5sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHN3X3ZvbHVtZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9IHNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocGxhdGZvcm0pOworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+aHN3OworCXUzMiB2b2x1bWU7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPT0KKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pIHsKKworCQl2b2x1bWUgPSBoc3dfbWl4ZXJfdG9faXBjKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwkJc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lKGhzdywgMCwgMiwgdm9sdW1lKTsKKworCX0gZWxzZSB7CisJCXZvbHVtZSA9IGhzd19taXhlcl90b19pcGModWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCQlzc3RfaHN3X21peGVyX3NldF92b2x1bWUoaHN3LCAwLCAwLCB2b2x1bWUpOworCisJCXZvbHVtZSA9IGhzd19taXhlcl90b19pcGModWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pOworCQlzc3RfaHN3X21peGVyX3NldF92b2x1bWUoaHN3LCAwLCAxLCB2b2x1bWUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhzd192b2x1bWVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgaHN3X3ByaXZfZGF0YSAqcGRhdGEgPSBzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHBsYXRmb3JtKTsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3ID0gcGRhdGEtPmhzdzsKKwl1bnNpZ25lZCBpbnQgdm9sdW1lID0gMDsKKworCXNzdF9oc3dfbWl4ZXJfZ2V0X3ZvbHVtZShoc3csIDAsIDAsICZ2b2x1bWUpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaHN3X2lwY190b19taXhlcih2b2x1bWUpOworCisJc3N0X2hzd19taXhlcl9nZXRfdm9sdW1lKGhzdywgMCwgMSwgJnZvbHVtZSk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBoc3dfaXBjX3RvX21peGVyKHZvbHVtZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVExWIHVzZWQgYnkgYm90aCBnbG9iYWwgYW5kIHN0cmVhbSB2b2x1bWVzICovCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoaHN3X3ZvbF90bHYsIC05MDAwLCAzMDAsIDEpOworCisvKiBTeXN0ZW0gUGluIGhhcyBubyB2b2x1bWUgY29udHJvbCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhzd192b2x1bWVfY29udHJvbHNbXSA9IHsKKwkvKiBHbG9iYWwgRFNQIHZvbHVtZSAqLworCVNPQ19ET1VCTEVfRVhUX1RMVigiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDAsIDAsIDgsCisJCUFSUkFZX1NJWkUodm9sdW1lX21hcCkgLTEsIDAsCisJCWhzd192b2x1bWVfZ2V0LCBoc3dfdm9sdW1lX3B1dCwgaHN3X3ZvbF90bHYpLAorCS8qIE9mZmxvYWQgMCB2b2x1bWUgKi8KKwlTT0NfRE9VQkxFX0VYVF9UTFYoIk1lZGlhMCBQbGF5YmFjayBWb2x1bWUiLCAxLCAwLCA4LAorCQlBUlJBWV9TSVpFKHZvbHVtZV9tYXApLCAwLAorCQloc3dfc3RyZWFtX3ZvbHVtZV9nZXQsIGhzd19zdHJlYW1fdm9sdW1lX3B1dCwgaHN3X3ZvbF90bHYpLAorCS8qIE9mZmxvYWQgMSB2b2x1bWUgKi8KKwlTT0NfRE9VQkxFX0VYVF9UTFYoIk1lZGlhMSBQbGF5YmFjayBWb2x1bWUiLCAyLCAwLCA4LAorCQlBUlJBWV9TSVpFKHZvbHVtZV9tYXApLCAwLAorCQloc3dfc3RyZWFtX3ZvbHVtZV9nZXQsIGhzd19zdHJlYW1fdm9sdW1lX3B1dCwgaHN3X3ZvbF90bHYpLAorCS8qIExvb3BiYWNrIHZvbHVtZSAqLworCVNPQ19ET1VCTEVfRVhUX1RMVigiTG9vcGJhY2sgQ2FwdHVyZSBWb2x1bWUiLCAzLCAwLCA4LAorCQlBUlJBWV9TSVpFKHZvbHVtZV9tYXApLCAwLAorCQloc3dfc3RyZWFtX3ZvbHVtZV9nZXQsIGhzd19zdHJlYW1fdm9sdW1lX3B1dCwgaHN3X3ZvbF90bHYpLAorCS8qIE1pYyBDYXB0dXJlIHZvbHVtZSAqLworCVNPQ19ET1VCTEVfRVhUX1RMVigiTWljIENhcHR1cmUgVm9sdW1lIiwgNCwgMCwgOCwKKwkJQVJSQVlfU0laRSh2b2x1bWVfbWFwKSwgMCwKKwkJaHN3X3N0cmVhbV92b2x1bWVfZ2V0LCBoc3dfc3RyZWFtX3ZvbHVtZV9wdXQsIGhzd192b2xfdGx2KSwKK307CisKKy8qIENyZWF0ZSBETUEgYnVmZmVyIHBhZ2UgdGFibGUgZm9yIERTUCAqLworc3RhdGljIGludCBjcmVhdGVfYWRzcF9wYWdlX3RhYmxlKHN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSwKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAorCXVuc2lnbmVkIGNoYXIgKmRtYV9hcmVhLCBzaXplX3Qgc2l6ZSwgaW50IHBjbSwgaW50IHN0cmVhbSkKK3sKKwlpbnQgaSwgcGFnZXM7CisKKwlpZiAoc2l6ZSAlIFBBR0VfU0laRSkKKwkJcGFnZXMgPSAoc2l6ZSAvIFBBR0VfU0laRSkgKyAxOworCWVsc2UKKwkJcGFnZXMgPSBzaXplIC8gUEFHRV9TSVpFOworCisJZGV2X2RiZyhydGQtPmRldiwgImdlbmVyYXRpbmcgcGFnZSB0YWJsZSBmb3IgJXAgc2l6ZSAweCV6dSBwYWdlcyAlZFxuIiwKKwkJZG1hX2FyZWEsIHNpemUsIHBhZ2VzKTsKKworCWZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7CisJCXUzMiBpZHggPSAoKChpIDw8IDIpICsgaSkpID4+IDE7CisJCXUzMiBwZm4gPSAodmlydF90b19waHlzKGRtYV9hcmVhICsgaSAqIFBBR0VfU0laRSkpID4+IFBBR0VfU0hJRlQ7CisJCXUzMiAqcGdfdGFibGU7CisKKwkJZGV2X2RiZyhydGQtPmRldiwgInBmbiBpICVpIGlkeCAlZCBwZm4gJXhcbiIsIGksIGlkeCwgcGZuKTsKKworCQlwZ190YWJsZSA9ICh1MzIqKShwZGF0YS0+cGNtX3BnW3BjbV1bc3RyZWFtXSArIGlkeCk7CisKKwkJaWYgKGkgJiAxKQorCQkJKnBnX3RhYmxlIHw9IChwZm4gPDwgNCk7CisJCWVsc2UKKwkJCSpwZ190YWJsZSB8PSBwZm47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHRoaXMgbWF5IGdldCBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBieSBvc3MgZW11bGF0aW9uICovCitzdGF0aWMgaW50IGhzd19wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKKwlzdHJ1Y3QgaHN3X3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHJ0ZCk7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisJc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZV9kYXRhOworCXN0cnVjdCBzc3RfZHNwICpkc3A7CisJZW51bSBzc3RfaHN3X3N0cmVhbV90eXBlIHN0cmVhbV90eXBlOworCWVudW0gc3N0X2hzd19zdHJlYW1fcGF0aF9pZCBwYXRoX2lkOworCXUzMiByYXRlLCBiaXRzLCBtYXAsIHBhZ2VzLCBtb2R1bGVfaWQ7CisJdTggY2hhbm5lbHM7CisJaW50IHJldDsKKworCS8qIHN0cmVhbSBkaXJlY3Rpb24gKi8KKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJcGF0aF9pZCA9IFNTVF9IU1dfU1RSRUFNX1BBVEhfU1NQMF9PVVQ7CisJZWxzZQorCQlwYXRoX2lkID0gU1NUX0hTV19TVFJFQU1fUEFUSF9TU1AwX0lOOworCisJLyogRFNQIHN0cmVhbSB0eXBlIGRlcGVuZHMgb24gREFJIElEICovCisJc3dpdGNoIChydGQtPmNwdV9kYWktPmlkKSB7CisJY2FzZSAwOgorCQlzdHJlYW1fdHlwZSA9IFNTVF9IU1dfU1RSRUFNX1RZUEVfU1lTVEVNOworCQltb2R1bGVfaWQgPSBTU1RfSFNXX01PRFVMRV9QQ01fU1lTVEVNOworCQlicmVhazsKKwljYXNlIDE6CisJY2FzZSAyOgorCQlzdHJlYW1fdHlwZSA9IFNTVF9IU1dfU1RSRUFNX1RZUEVfUkVOREVSOworCQltb2R1bGVfaWQgPSBTU1RfSFNXX01PRFVMRV9QQ007CisJCWJyZWFrOworCWNhc2UgMzoKKwkJLyogcGF0aCBJRCBuZWVkcyB0byBiZSBPVVQgZm9yIGxvb3BiYWNrICovCisJCXN0cmVhbV90eXBlID0gU1NUX0hTV19TVFJFQU1fVFlQRV9MT09QQkFDSzsKKwkJcGF0aF9pZCA9IFNTVF9IU1dfU1RSRUFNX1BBVEhfU1NQMF9PVVQ7CisJCW1vZHVsZV9pZCA9IFNTVF9IU1dfTU9EVUxFX1BDTV9SRUZFUkVOQ0U7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJc3RyZWFtX3R5cGUgPSBTU1RfSFNXX1NUUkVBTV9UWVBFX0NBUFRVUkU7CisJCW1vZHVsZV9pZCA9IFNTVF9IU1dfTU9EVUxFX1BDTV9DQVBUVVJFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGludmFsaWQgREFJIElEICVkXG4iLAorCQkJcnRkLT5jcHVfZGFpLT5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX07CisKKwlyZXQgPSBzc3RfaHN3X3N0cmVhbV9mb3JtYXQoaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQlwYXRoX2lkLCBzdHJlYW1fdHlwZSwgU1NUX0hTV19TVFJFQU1fRk9STUFUX1BDTV9GT1JNQVQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIHNldCBmb3JtYXQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJcmV0ID0gc3N0X2hzd19zdHJlYW1fc2V0X3JhdGUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCByYXRlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGNvdWxkIG5vdCBzZXQgcmF0ZSAlZFxuIiwgcmF0ZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQliaXRzID0gU1NUX0hTV19ERVBUSF8xNkJJVDsKKwkJc3N0X2hzd19zdHJlYW1fc2V0X3ZhbGlkKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMTYpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQliaXRzID0gU1NUX0hTV19ERVBUSF8yNEJJVDsKKwkJc3N0X2hzd19zdHJlYW1fc2V0X3ZhbGlkKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMzIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGludmFsaWQgZm9ybWF0ICVkXG4iLAorCQkJcGFyYW1zX2Zvcm1hdChwYXJhbXMpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fc2V0X2JpdHMoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCBiaXRzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGNvdWxkIG5vdCBzZXQgYml0cyAlZFxuIiwgYml0cyk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogd2Ugb25seSBzdXBwb3J0IHN0ZXJlbyBhdG0gKi8KKwljaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOworCWlmIChjaGFubmVscyAhPSAyKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogaW52YWxpZCBjaGFubmVscyAlZFxuIiwgY2hhbm5lbHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltYXAgPSBjcmVhdGVfY2hhbm5lbF9tYXAoU1NUX0hTV19DSEFOTkVMX0NPTkZJR19TVEVSRU8pOworCXNzdF9oc3dfc3RyZWFtX3NldF9tYXBfY29uZmlnKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwKKwkJCW1hcCwgU1NUX0hTV19DSEFOTkVMX0NPTkZJR19TVEVSRU8pOworCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fc2V0X2NoYW5uZWxzKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgY2hhbm5lbHMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogY291bGQgbm90IHNldCBjaGFubmVscyAlZFxuIiwKKwkJCWNoYW5uZWxzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogY291bGQgbm90IGFsbG9jYXRlICVkIGJ5dGVzIGZvciBQQ00gJWRcbiIsCisJCQlwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcyksIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gY3JlYXRlX2Fkc3BfcGFnZV90YWJsZShwZGF0YSwgcnRkLCBydW50aW1lLT5kbWFfYXJlYSwKKwkJcnVudGltZS0+ZG1hX2J5dGVzLCBydGQtPmNwdV9kYWktPmlkLCBzdWJzdHJlYW0tPnN0cmVhbSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzc3RfaHN3X3N0cmVhbV9zZXRfc3R5bGUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQlTU1RfSFNXX0lOVEVSTEVBVklOR19QRVJfQ0hBTk5FTCk7CisKKwlpZiAocnVudGltZS0+ZG1hX2J5dGVzICUgUEFHRV9TSVpFKQorCQlwYWdlcyA9IChydW50aW1lLT5kbWFfYnl0ZXMgLyBQQUdFX1NJWkUpICsgMTsKKwllbHNlCisJCXBhZ2VzID0gcnVudGltZS0+ZG1hX2J5dGVzIC8gUEFHRV9TSVpFOworCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fYnVmZmVyKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwKKwkJdmlydF90b19waHlzKHBkYXRhLT5wY21fcGdbcnRkLT5jcHVfZGFpLT5pZF1bc3Vic3RyZWFtLT5zdHJlYW1dKSwKKwkJcGFnZXMsIHJ1bnRpbWUtPmRtYV9ieXRlcywgMCwKKwkJKHUzMikodmlydF90b19waHlzKHJ1bnRpbWUtPmRtYV9hcmVhKSA+PiBQQUdFX1NISUZUKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBmYWlsZWQgdG8gc2V0IERNQSBidWZmZXIgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZHNwID0gc3N0X2hzd19nZXRfZHNwKGhzdyk7CisKKwltb2R1bGVfZGF0YSA9IHNzdF9tb2R1bGVfZ2V0X2Zyb21faWQoZHNwLCBtb2R1bGVfaWQpOworCWlmIChtb2R1bGVfZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIGdldCBtb2R1bGUgY29uZmlnXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogd2UgdXNlIGhhcmRjb2RlZCBtZW1vcnkgb2Zmc2V0cyBhdG0sIHdpbGwgYmUgdXBkYXRlZCBmb3IgbmV3IEZXICovCisJaWYgKHN0cmVhbV90eXBlID09IFNTVF9IU1dfU1RSRUFNX1RZUEVfQ0FQVFVSRSkgeworCQlzc3RfaHN3X3N0cmVhbV9zZXRfbW9kdWxlX2luZm8oaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJU1NUX0hTV19NT0RVTEVfUENNX0NBUFRVUkUsIG1vZHVsZV9kYXRhLT5lbnRyeSk7CisJCXNzdF9oc3dfc3RyZWFtX3NldF9wbWVtb3J5X2luZm8oaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJMHg0NDk0MDAsIDB4NDAwMCk7CisJCXNzdF9oc3dfc3RyZWFtX3NldF9zbWVtb3J5X2luZm8oaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJMHg0MDAwMDAsIDApOworCX0gZWxzZSB7IC8qIHN0cmVhbV90eXBlID09IFNTVF9IU1dfU1RSRUFNX1RZUEVfU1lTVEVNICovCisJCXNzdF9oc3dfc3RyZWFtX3NldF9tb2R1bGVfaW5mbyhoc3csIHBjbV9kYXRhLT5zdHJlYW0sCisJCQlTU1RfSFNXX01PRFVMRV9QQ01fU1lTVEVNLCBtb2R1bGVfZGF0YS0+ZW50cnkpOworCisJCXNzdF9oc3dfc3RyZWFtX3NldF9wbWVtb3J5X2luZm8oaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJbW9kdWxlX2RhdGEtPm9mZnNldCwgbW9kdWxlX2RhdGEtPnNpemUpOworCQlzc3RfaHN3X3N0cmVhbV9zZXRfcG1lbW9yeV9pbmZvKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwKKwkJCTB4NDRkNDAwLCAweDM4MDApOworCisJCXNzdF9oc3dfc3RyZWFtX3NldF9zbWVtb3J5X2luZm8oaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJbW9kdWxlX2RhdGEtPm9mZnNldCwgbW9kdWxlX2RhdGEtPnNpemUpOworCQlzc3RfaHN3X3N0cmVhbV9zZXRfc21lbW9yeV9pbmZvKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwKKwkJCTB4NDAwMDAwLCAwKTsKKwl9CisKKwlyZXQgPSBzc3RfaHN3X3N0cmVhbV9jb21taXQoaHN3LCBwY21fZGF0YS0+c3RyZWFtKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBjb21taXQgc3RyZWFtICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNzdF9oc3dfc3RyZWFtX3BhdXNlKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIHBhdXNlICVkXG4iLCByZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHN3X3BjbV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoc3dfcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7CisJc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGEgPSBzbmRfc29jX3BjbV9nZXRfZHJ2ZGF0YShydGQpOworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+aHN3OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJc3N0X2hzd19zdHJlYW1fcmVzdW1lKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMCk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQlzc3RfaHN3X3N0cmVhbV9wYXVzZShoc3csIHBjbV9kYXRhLT5zdHJlYW0sIDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBoc3dfbm90aWZ5X3BvaW50ZXIoc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGEgPSBkYXRhOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gcGNtX2RhdGEtPnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwl1MzIgcG9zOworCisJcG9zID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsCisJCShydW50aW1lLT5jb250cm9sLT5hcHBsX3B0ciAlIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKSk7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiBBcHAgcG9pbnRlciAlZCBieXRlc1xuIiwgcG9zKTsKKworCS8qIGxldCBhbHNhIGtub3cgd2UgaGF2ZSBwbGF5IGEgcGVyaW9kICovCisJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBoc3dfcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKKwlzdHJ1Y3QgaHN3X3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHJ0ZCk7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisJc25kX3BjbV91ZnJhbWVzX3Qgb2Zmc2V0OworCisJb2Zmc2V0ID0gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsCisJCXNzdF9oc3dfZ2V0X2RzcF9wb3NpdGlvbihoc3csIHBjbV9kYXRhLT5zdHJlYW0pKTsKKworCWRldl9kYmcocnRkLT5kZXYsICJQQ006IERNQSBwb2ludGVyICV6dSBieXRlc1xuIiwKKwkJZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsICh1MzIpb2Zmc2V0KSk7CisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGludCBoc3dfcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7CisJc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGE7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisKKwlwY21fZGF0YSA9ICZwZGF0YS0+cGNtW3J0ZC0+Y3B1X2RhaS0+aWRdOworCisJbXV0ZXhfbG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKworCXNuZF9zb2NfcGNtX3NldF9kcnZkYXRhKHJ0ZCwgcGNtX2RhdGEpOworCXBjbV9kYXRhLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisKKwlzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN1YnN0cmVhbSwgJmhzd19wY21faGFyZHdhcmUpOworCisJcGNtX2RhdGEtPnN0cmVhbSA9IHNzdF9oc3dfc3RyZWFtX25ldyhoc3csIHJ0ZC0+Y3B1X2RhaS0+aWQsCisJCWhzd19ub3RpZnlfcG9pbnRlciwgcGNtX2RhdGEpOworCWlmIChwY21fZGF0YS0+c3RyZWFtID09IE5VTEwpIHsKKwkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBmYWlsZWQgdG8gY3JlYXRlIHN0cmVhbVxuIik7CisJCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2V0IHByZXZpb3VzIHNhdmVkIHZvbHVtZSAqLworCXNzdF9oc3dfc3RyZWFtX3NldF92b2x1bWUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwLAorCQkJMCwgcGNtX2RhdGEtPnZvbHVtZVswXSk7CisJc3N0X2hzd19zdHJlYW1fc2V0X3ZvbHVtZShoc3csIHBjbV9kYXRhLT5zdHJlYW0sIDAsCisJCQkxLCBwY21fZGF0YS0+dm9sdW1lWzFdKTsKKworCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoc3dfcGNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaHN3X3ByaXZfZGF0YSAqcGRhdGEgPQorCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOworCXN0cnVjdCBoc3dfcGNtX2RhdGEgKnBjbV9kYXRhID0gc25kX3NvY19wY21fZ2V0X2RydmRhdGEocnRkKTsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3ID0gcGRhdGEtPmhzdzsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwlyZXQgPSBzc3RfaHN3X3N0cmVhbV9yZXNldChoc3csIHBjbV9kYXRhLT5zdHJlYW0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9kYmcocnRkLT5kZXYsICJlcnJvcjogcmVzZXQgc3RyZWFtIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fZnJlZShoc3csIHBjbV9kYXRhLT5zdHJlYW0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9kYmcocnRkLT5kZXYsICJlcnJvcjogZnJlZSBzdHJlYW0gZmFpbGVkICVkXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisJcGNtX2RhdGEtPnN0cmVhbSA9IE5VTEw7CisKK291dDoKKwltdXRleF91bmxvY2soJnBjbV9kYXRhLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBoc3dfcGNtX29wcyA9IHsKKwkub3BlbgkJPSBoc3dfcGNtX29wZW4sCisJLmNsb3NlCQk9IGhzd19wY21fY2xvc2UsCisJLmlvY3RsCQk9IHNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMJPSBoc3dfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZQk9IGhzd19wY21faHdfZnJlZSwKKwkudHJpZ2dlcgk9IGhzd19wY21fdHJpZ2dlciwKKwkucG9pbnRlcgk9IGhzd19wY21fcG9pbnRlciwKKwkubW1hcAkJPSBzbmRfcGNtX2xpYl9kZWZhdWx0X21tYXAsCit9OworCitzdGF0aWMgdm9pZCBoc3dfcGNtX2ZyZWUoc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9mcmVlX2Zvcl9hbGwocGNtKTsKK30KKworc3RhdGljIGludCBoc3dfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGRtYV9jb2VyY2VfbWFza19hbmRfY29oZXJlbnQocnRkLT5jYXJkLT5kZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbSB8fAorCQkJcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtKSB7CisJCXJldCA9IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLAorCQkJU05EUlZfRE1BX1RZUEVfREVWLAorCQkJcnRkLT5jYXJkLT5kZXYsCisJCQloc3dfcGNtX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXgsCisJCQloc3dfcGNtX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXgpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZG1hIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgSFNXX0ZPUk1BVFMgXAorCShTTkRSVl9QQ01fRk1UQklUX1MyMF8zTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8XAorCSBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSkKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgaHN3X2RhaXNbXSA9IHsKKwl7CisJCS5uYW1lICA9ICJTeXN0ZW0gUGluIiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlN5c3RlbSBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQl9LAorCX0sCisJeworCQkvKiBQQ00gKi8KKwkJLm5hbWUgID0gIk9mZmxvYWQwIFBpbiIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJPZmZsb2FkMCBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IEhTV19GT1JNQVRTLAorCQl9LAorCX0sCisJeworCQkvKiBQQ00gKi8KKwkJLm5hbWUgID0gIk9mZmxvYWQxIFBpbiIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJPZmZsb2FkMSBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IEhTV19GT1JNQVRTLAorCQl9LAorCX0sCisJeworCQkubmFtZSAgPSAiTG9vcGJhY2sgUGluIiwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiTG9vcGJhY2sgQ2FwdHVyZSIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IEhTV19GT1JNQVRTLAorCQl9LAorCX0sCisJeworCQkubmFtZSAgPSAiQ2FwdHVyZSBQaW4iLAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBbmFsb2cgQ2FwdHVyZSIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IEhTV19GT1JNQVRTLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd2lkZ2V0c1tdID0geworCisJLyogQmFja2VuZCBEQUlzICAqLworCVNORF9TT0NfREFQTV9BSUZfSU4oIlNTUDAgQ09ERUMgSU4iLCBOVUxMLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTU1AwIENPREVDIE9VVCIsIE5VTEwsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiU1NQMSBCVCBJTiIsIE5VTEwsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNTUDEgQlQgT1VUIiwgTlVMTCwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKworCS8qIEdsb2JhbCBQbGF5YmFjayBNaXhlciAqLworCVNORF9TT0NfREFQTV9NSVhFUigiUGxheWJhY2sgVk1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGdyYXBoW10gPSB7CisKKwkvKiBQbGF5YmFjayBNaXhlciAqLworCXsiUGxheWJhY2sgVk1peGVyIiwgTlVMTCwgIlN5c3RlbSBQbGF5YmFjayJ9LAorCXsiUGxheWJhY2sgVk1peGVyIiwgTlVMTCwgIk9mZmxvYWQwIFBsYXliYWNrIn0sCisJeyJQbGF5YmFjayBWTWl4ZXIiLCBOVUxMLCAiT2ZmbG9hZDEgUGxheWJhY2sifSwKKworCXsiU1NQMCBDT0RFQyBPVVQiLCBOVUxMLCAiUGxheWJhY2sgVk1peGVyIn0sCisKKwl7IkFuYWxvZyBDYXB0dXJlIiwgTlVMTCwgIlNTUDAgQ09ERUMgSU4ifSwKK307CisKK3N0YXRpYyBpbnQgaHN3X3BjbV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKHBsYXRmb3JtLT5kZXYpOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwcml2X2RhdGE7CisJaW50IGk7CisKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByaXZfZGF0YSA9IGRldm1fa3phbGxvYyhwbGF0Zm9ybS0+ZGV2LCBzaXplb2YoKnByaXZfZGF0YSksIEdGUF9LRVJORUwpOworCXByaXZfZGF0YS0+aHN3ID0gcGRhdGEtPmRzcDsKKwlzbmRfc29jX3BsYXRmb3JtX3NldF9kcnZkYXRhKHBsYXRmb3JtLCBwcml2X2RhdGEpOworCisJLyogYWxsb2NhdGUgRFNQIGJ1ZmZlciBwYWdlIHRhYmxlcyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhzd19kYWlzKTsgaSsrKSB7CisKKwkJbXV0ZXhfaW5pdCgmcHJpdl9kYXRhLT5wY21baV0ubXV0ZXgpOworCisJCS8qIHBsYXliYWNrICovCisJCWlmIChoc3dfZGFpc1tpXS5wbGF5YmFjay5jaGFubmVsc19taW4pIHsKKwkJCXByaXZfZGF0YS0+cGNtX3BnW2ldWzBdID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9ETUEpOworCQkJaWYgKHByaXZfZGF0YS0+cGNtX3BnW2ldWzBdID09IE5VTEwpCisJCQkJZ290byBlcnI7CisJCX0KKworCQkvKiBjYXB0dXJlICovCisJCWlmIChoc3dfZGFpc1tpXS5jYXB0dXJlLmNoYW5uZWxzX21pbikgeworCQkJcHJpdl9kYXRhLT5wY21fcGdbaV1bMV0gPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0RNQSk7CisJCQlpZiAocHJpdl9kYXRhLT5wY21fcGdbaV1bMV0gPT0gTlVMTCkKKwkJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCXJldHVybiAwOworCitlcnI6CisJZm9yICg7aSA+PSAwOyBpLS0pIHsKKwkJaWYgKGhzd19kYWlzW2ldLnBsYXliYWNrLmNoYW5uZWxzX21pbikKKwkJCWtmcmVlKHByaXZfZGF0YS0+cGNtX3BnW2ldWzBdKTsKKwkJaWYgKGhzd19kYWlzW2ldLmNhcHR1cmUuY2hhbm5lbHNfbWluKQorCQkJa2ZyZWUocHJpdl9kYXRhLT5wY21fcGdbaV1bMV0pOworCX0KKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludCBoc3dfcGNtX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnByaXZfZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocGxhdGZvcm0pOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaHN3X2RhaXMpOyBpKyspIHsKKwkJaWYgKGhzd19kYWlzW2ldLnBsYXliYWNrLmNoYW5uZWxzX21pbikKKwkJCWtmcmVlKHByaXZfZGF0YS0+cGNtX3BnW2ldWzBdKTsKKwkJaWYgKGhzd19kYWlzW2ldLmNhcHR1cmUuY2hhbm5lbHNfbWluKQorCQkJa2ZyZWUocHJpdl9kYXRhLT5wY21fcGdbaV1bMV0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIGhzd19zb2NfcGxhdGZvcm0gPSB7CisJLnByb2JlCQk9IGhzd19wY21fcHJvYmUsCisJLnJlbW92ZQkJPSBoc3dfcGNtX3JlbW92ZSwKKwkub3BzCQk9ICZoc3dfcGNtX29wcywKKwkucGNtX25ldwk9IGhzd19wY21fbmV3LAorCS5wY21fZnJlZQk9IGhzd19wY21fZnJlZSwKKwkuY29udHJvbHMJPSBoc3dfdm9sdW1lX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMJPSBBUlJBWV9TSVpFKGhzd192b2x1bWVfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMJPSB3aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMJPSBncmFwaCwKKwkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShncmFwaCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2RyaXZlciBoc3dfZGFpX2NvbXBvbmVudCA9IHsKKwkubmFtZQkJPSAiaGFzd2VsbC1kYWkiLAorfTsKKworc3RhdGljIGludCBoc3dfcGNtX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzc3RfcGRhdGEgKnNzdF9wZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJaW50IHJldDsKKworCXJldCA9IHNzdF9oc3dfZHNwX2luaXQoJnBkZXYtPmRldiwgc3N0X3BkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYsICZoc3dfc29jX3BsYXRmb3JtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcGxhdDsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsICZoc3dfZGFpX2NvbXBvbmVudCwKKwkJaHN3X2RhaXMsIEFSUkFZX1NJWkUoaHN3X2RhaXMpKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfY29tcDsKKworCXJldHVybiAwOworCitlcnJfY29tcDoKKwlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7CitlcnJfcGxhdDoKKwlzc3RfaHN3X2RzcF9mcmVlKCZwZGV2LT5kZXYsIHNzdF9wZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHN3X3BjbV9kZXZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNzdF9wZGF0YSAqc3N0X3BkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYpOworCXNzdF9oc3dfZHNwX2ZyZWUoJnBkZXYtPmRldiwgc3N0X3BkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBoc3dfcGNtX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJoYXN3ZWxsLXBjbS1hdWRpbyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisKKwkucHJvYmUgPSBoc3dfcGNtX2Rldl9wcm9iZSwKKwkucmVtb3ZlID0gaHN3X3BjbV9kZXZfcmVtb3ZlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoaHN3X3BjbV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJMaWFtIEdpcmR3b29kLCBYaW5nY2hhbyBXYW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhhc3dlbGwvTHlueHBvaW50ICsgQnJvYWR3ZWxsL1dpbGRjYXRwb2ludCBQQ00iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06aGFzd2VsbC1wY20tYXVkaW8iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3RfZHNwLmggYi9zb3VuZC9zb2MvaW50ZWwvc3N0LW1mbGQtZHNwLmgKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gc291bmQvc29jL2ludGVsL3NzdF9kc3AuaApyZW5hbWUgdG8gc291bmQvc29jL2ludGVsL3NzdC1tZmxkLWRzcC5oCmluZGV4IDBmY2UxZGUuLjNiNjNlZGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9zc3RfZHNwLmgKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1tZmxkLWRzcC5oCkBAIC0xLDcgKzEsNyBAQAotI2lmbmRlZiBfX1NTVF9EU1BfSF9fCi0jZGVmaW5lIF9fU1NUX0RTUF9IX18KKyNpZm5kZWYgX19TU1RfTUZMRF9EU1BfSF9fCisjZGVmaW5lIF9fU1NUX01GTERfRFNQX0hfXwogLyoKLSAqICBzc3RfZHNwLmggLSBJbnRlbCBTU1QgRHJpdmVyIGZvciBhdWRpbyBlbmdpbmUKKyAqICBzc3RfbWZsZF9kc3AuaCAtIEludGVsIFNTVCBEcml2ZXIgZm9yIGF1ZGlvIGVuZ2luZQogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMTIgSW50ZWwgQ29ycG9yYXRpb24KICAqICBBdXRob3JzOglWaW5vZCBLb3VsIDx2aW5vZC5rb3VsQGxpbnV4LmludGVsLmNvbT4KQEAgLTEzMSw0ICsxMzEsNCBAQAogCXN0cnVjdCBzbmRfc3N0X2FsbG9jX3BhcmFtc19leHQgYXBhcmFtczsKIH07CiAKLSNlbmRpZiAvKiBfX1NTVF9EU1BfSF9fICovCisjZW5kaWYgLyogX19TU1RfTUZMRF9EU1BfSF9fICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0X3BsYXRmb3JtLmMgYi9zb3VuZC9zb2MvaW50ZWwvc3N0LW1mbGQtcGxhdGZvcm0uYwpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvaW50ZWwvc3N0X3BsYXRmb3JtLmMKcmVuYW1lIHRvIHNvdW5kL3NvYy9pbnRlbC9zc3QtbWZsZC1wbGF0Zm9ybS5jCmluZGV4IGY0NjVhODEuLjg0MDMwNmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9zc3RfcGxhdGZvcm0uYworKysgYi9zb3VuZC9zb2MvaW50ZWwvc3N0LW1mbGQtcGxhdGZvcm0uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAgc3N0X3BsYXRmb3JtLmMgLSBJbnRlbCBNSUQgUGxhdGZvcm0gZHJpdmVyCisgKiAgc3N0X21mbGRfcGxhdGZvcm0uYyAtIEludGVsIE1JRCBQbGF0Zm9ybSBkcml2ZXIKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgSW50ZWwgQ29ycAogICogIEF1dGhvcjogVmlub2QgS291bCA8dmlub2Qua291bEBpbnRlbC5jb20+CkBAIC0zMyw3ICszMyw3IEBACiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbXByZXNzX2RyaXZlci5oPgotI2luY2x1ZGUgInNzdF9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInNzdC1tZmxkLXBsYXRmb3JtLmgiCiAKIHN0YXRpYyBzdHJ1Y3Qgc3N0X2RldmljZSAqc3N0Owogc3RhdGljIERFRklORV9NVVRFWChzc3RfbG9jayk7CkBAIC03MDksNyArNzA5LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3N0X3BsYXRmb3JtX2RyaXZlciA9IHsKIAkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJCT0gInNzdC1wbGF0Zm9ybSIsCisJCS5uYW1lCQk9ICJzc3QtbWZsZC1wbGF0Zm9ybSIsCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAl9LAogCS5wcm9iZQkJPSBzc3RfcGxhdGZvcm1fcHJvYmUsCkBAIC03MjIsNCArNzIyLDQgQEAKIE1PRFVMRV9BVVRIT1IoIlZpbm9kIEtvdWwgPHZpbm9kLmtvdWxAaW50ZWwuY29tPiIpOwogTU9EVUxFX0FVVEhPUigiSGFyc2hhIFByaXlhIDxwcml5YS5oYXJzaGFAaW50ZWwuY29tPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzc3QtcGxhdGZvcm0iKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06c3N0LW1mbGQtcGxhdGZvcm0iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3RfcGxhdGZvcm0uaCBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtbWZsZC1wbGF0Zm9ybS5oCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIHNvdW5kL3NvYy9pbnRlbC9zc3RfcGxhdGZvcm0uaApyZW5hbWUgdG8gc291bmQvc29jL2ludGVsL3NzdC1tZmxkLXBsYXRmb3JtLmgKaW5kZXggYmVlNjRmYi4uMGM0ZTJkZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL3NzdF9wbGF0Zm9ybS5oCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtbWZsZC1wbGF0Zm9ybS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICBzc3RfcGxhdGZvcm0uaCAtIEludGVsIE1JRCBQbGF0Zm9ybSBkcml2ZXIgaGVhZGVyIGZpbGUKKyAqICBzc3RfbWZsZF9wbGF0Zm9ybS5oIC0gSW50ZWwgTUlEIFBsYXRmb3JtIGRyaXZlciBoZWFkZXIgZmlsZQogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMTAgSW50ZWwgQ29ycAogICogIEF1dGhvcjogVmlub2QgS291bCA8dmlub2Qua291bEBpbnRlbC5jb20+CkBAIC0yNyw3ICsyNyw3IEBACiAjaWZuZGVmIF9fU1NUX1BMQVRGT1JNRFJWX0hfXwogI2RlZmluZSBfX1NTVF9QTEFURk9STURSVl9IX18KIAotI2luY2x1ZGUgInNzdF9kc3AuaCIKKyNpbmNsdWRlICJzc3QtbWZsZC1kc3AuaCIKIAogI2RlZmluZSBTU1RfTU9OTwkJMQogI2RlZmluZSBTU1RfU1RFUkVPCQkyCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mva2lya3dvb2QvS2NvbmZpZyBiL3NvdW5kL3NvYy9raXJrd29vZC9LY29uZmlnCmluZGV4IDc4ZWQ0YTQuLjQ5Zjg0MzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9raXJrd29vZC9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9raXJrd29vZC9LY29uZmlnCkBAIC0xLDExICsxLDIwIEBACiBjb25maWcgU05EX0tJUktXT09EX1NPQwogCXRyaXN0YXRlICJTb0MgQXVkaW8gZm9yIHRoZSBNYXJ2ZWxsIEtpcmt3b29kIGFuZCBEb3ZlIGNoaXBzIgotCWRlcGVuZHMgb24gQVJDSF9LSVJLV09PRCB8fCBBUkNIX0RPVkUgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBBUkNIX0tJUktXT09EIHx8IEFSQ0hfRE9WRSB8fCBBUkNIX01WRUJVIHx8IENPTVBJTEVfVEVTVAogCWhlbHAKIAkgIFNheSBZIG9yIE0gaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIGNvZGVjcyBhdHRhY2hlZCB0bwogCSAgdGhlIEtpcmt3b29kIEkyUyBpbnRlcmZhY2UuIFlvdSB3aWxsIGFsc28gbmVlZCB0byBzZWxlY3QgdGhlCiAJICBhdWRpbyBpbnRlcmZhY2VzIHRvIHN1cHBvcnQgYmVsb3cuCiAKK2NvbmZpZyBTTkRfS0lSS1dPT0RfU09DX0FSTUFEQTM3MF9EQgorCXRyaXN0YXRlICJTb0MgQXVkaW8gc3VwcG9ydCBmb3IgQXJtYWRhIDM3MCBEQiIKKwlkZXBlbmRzIG9uIFNORF9LSVJLV09PRF9TT0MgJiYgKEFSQ0hfTVZFQlUgfHwgQ09NUElMRV9URVNUKSAmJiBJMkMKKwlzZWxlY3QgU05EX1NPQ19DUzQyTDUxCisJc2VsZWN0IFNORF9TT0NfU1BESUYKKwloZWxwCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uCisJICB0aGUgQXJtYWRhIDM3MCBEZXZlbG9wbWVudCBCb2FyZC4KKwogY29uZmlnIFNORF9LSVJLV09PRF9TT0NfT1BFTlJECiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBLaXJrd29vZCBPcGVucmQgQ2xpZW50IgogCWRlcGVuZHMgb24gU05EX0tJUktXT09EX1NPQyAmJiAoTUFDSF9PUEVOUkRfQ0xJRU5UIHx8IE1BQ0hfT1BFTlJEX1VMVElNQVRFIHx8IENPTVBJTEVfVEVTVCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9raXJrd29vZC9NYWtlZmlsZSBiL3NvdW5kL3NvYy9raXJrd29vZC9NYWtlZmlsZQppbmRleCA5ZTc4MTM4Li43YzFkOGZlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mva2lya3dvb2QvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL2tpcmt3b29kL01ha2VmaWxlCkBAIC00LDYgKzQsOCBAQAogCiBzbmQtc29jLW9wZW5yZC1vYmpzIDo9IGtpcmt3b29kLW9wZW5yZC5vCiBzbmQtc29jLXQ1MzI1LW9ianMgOj0ga2lya3dvb2QtdDUzMjUubworc25kLXNvYy1hcm1hZGEtMzcwLWRiLW9ianMgOj0gYXJtYWRhLTM3MC1kYi5vCiAKK29iai0kKENPTkZJR19TTkRfS0lSS1dPT0RfU09DX0FSTUFEQTM3MF9EQikgKz0gc25kLXNvYy1hcm1hZGEtMzcwLWRiLm8KIG9iai0kKENPTkZJR19TTkRfS0lSS1dPT0RfU09DX09QRU5SRCkgKz0gc25kLXNvYy1vcGVucmQubwogb2JqLSQoQ09ORklHX1NORF9LSVJLV09PRF9TT0NfVDUzMjUpICs9IHNuZC1zb2MtdDUzMjUubwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2tpcmt3b29kL2FybWFkYS0zNzAtZGIuYyBiL3NvdW5kL3NvYy9raXJrd29vZC9hcm1hZGEtMzcwLWRiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0MzMzOAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9raXJrd29vZC9hcm1hZGEtMzcwLWRiLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgTWFydmVsbAorICoKKyAqIFRob21hcyBQZXRhenpvbmkgPHRob21hcy5wZXRhenpvbmlAZnJlZS1lbGVjdHJvbnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9hc29jLWtpcmt3b29kLmg+CisjaW5jbHVkZSAiLi4vY29kZWNzL2NzNDJsNTEuaCIKKworc3RhdGljIGludCBhMzcwZGJfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCXVuc2lnbmVkIGludCBmcmVxOworCisJc3dpdGNoIChwYXJhbXNfcmF0ZShwYXJhbXMpKSB7CisJZGVmYXVsdDoKKwljYXNlIDQ0MTAwOgorCQlmcmVxID0gMTEyODk2MDA7CisJCWJyZWFrOworCWNhc2UgNDgwMDA6CisJCWZyZXEgPSAxMjI4ODAwMDsKKwkJYnJlYWs7CisJY2FzZSA5NjAwMDoKKwkJZnJlcSA9IDI0NTc2MDAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIDAsIGZyZXEsIFNORF9TT0NfQ0xPQ0tfSU4pOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGEzNzBkYl9vcHMgPSB7CisJLmh3X3BhcmFtcyA9IGEzNzBkYl9od19wYXJhbXMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYTM3MGRiX2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9IUCgiT3V0IEphY2siLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTElORSgiSW4gSmFjayIsIE5VTEwpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYTM3MGRiX3JvdXRlW10gPSB7CisJeyAiT3V0IEphY2siLAlOVUxMLAkiSFBMIiB9LAorCXsgIk91dCBKYWNrIiwJTlVMTCwJIkhQUiIgfSwKKwl7ICJBSU4xTCIsCU5VTEwsCSJJbiBKYWNrIiB9LAorCXsgIkFJTjFMIiwJTlVMTCwJIkluIEphY2siIH0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgYTM3MGRiX2RhaVtdID0geworeworCS5uYW1lID0gIkNTNDJMNTEiLAorCS5zdHJlYW1fbmFtZSA9ICJhbmFsb2ciLAorCS5jcHVfZGFpX25hbWUgPSAiaTJzIiwKKwkuY29kZWNfZGFpX25hbWUgPSAiY3M0Mmw1MS1oaWZpIiwKKwkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX0NCU19DRlMsCisJLm9wcyA9ICZhMzcwZGJfb3BzLAorfSwKK3sKKwkubmFtZSA9ICJTL1BESUYgb3V0IiwKKwkuc3RyZWFtX25hbWUgPSAic3BkaWYtb3V0IiwKKwkuY3B1X2RhaV9uYW1lID0gInNwZGlmIiwKKwkuY29kZWNfZGFpX25hbWUgPSAiZGl0LWhpZmkiLAorCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUywKK30sCit7CisJLm5hbWUgPSAiUy9QRElGIGluIiwKKwkuc3RyZWFtX25hbWUgPSAic3BkaWYtaW4iLAorCS5jcHVfZGFpX25hbWUgPSAic3BkaWYiLAorCS5jb2RlY19kYWlfbmFtZSA9ICJkaXItaGlmaSIsCisJLmRhaV9mbXQgPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAorfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIGEzNzBkYiA9IHsKKwkubmFtZSA9ICJhMzcwZGIiLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5kYWlfbGluayA9IGEzNzBkYl9kYWksCisJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUoYTM3MGRiX2RhaSksCisJLmRhcG1fd2lkZ2V0cyA9IGEzNzBkYl9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGEzNzBkYl9kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGEzNzBkYl9yb3V0ZSwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhMzcwZGJfcm91dGUpLAorfTsKKworc3RhdGljIGludCBhMzcwZGJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gJmEzNzBkYjsKKworCWNhcmQtPmRldiA9ICZwZGV2LT5kZXY7CisKKwlhMzcwZGJfZGFpWzBdLmNwdV9vZl9ub2RlID0KKwkJb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkgIm1hcnZlbGwsYXVkaW8tY29udHJvbGxlciIsIDApOworCWEzNzBkYl9kYWlbMF0ucGxhdGZvcm1fb2Zfbm9kZSA9IGEzNzBkYl9kYWlbMF0uY3B1X29mX25vZGU7CisKKwlhMzcwZGJfZGFpWzBdLmNvZGVjX29mX25vZGUgPQorCQlvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCSAibWFydmVsbCxhdWRpby1jb2RlYyIsIDApOworCisJYTM3MGRiX2RhaVsxXS5jcHVfb2Zfbm9kZSA9IGEzNzBkYl9kYWlbMF0uY3B1X29mX25vZGU7CisJYTM3MGRiX2RhaVsxXS5wbGF0Zm9ybV9vZl9ub2RlID0gYTM3MGRiX2RhaVswXS5jcHVfb2Zfbm9kZTsKKworCWEzNzBkYl9kYWlbMV0uY29kZWNfb2Zfbm9kZSA9CisJCW9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJICJtYXJ2ZWxsLGF1ZGlvLWNvZGVjIiwgMSk7CisKKwlhMzcwZGJfZGFpWzJdLmNwdV9vZl9ub2RlID0gYTM3MGRiX2RhaVswXS5jcHVfb2Zfbm9kZTsKKwlhMzcwZGJfZGFpWzJdLnBsYXRmb3JtX29mX25vZGUgPSBhMzcwZGJfZGFpWzBdLmNwdV9vZl9ub2RlOworCisJYTM3MGRiX2RhaVsyXS5jb2RlY19vZl9ub2RlID0KKwkJb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkgIm1hcnZlbGwsYXVkaW8tY29kZWMiLCAyKTsKKworCXJldHVybiBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZChjYXJkLT5kZXYsIGNhcmQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhMzcwZGJfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGEzNzBkYi1hdWRpbyIgfSwKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhMzcwZGJfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJhMzcwZGItYXVkaW8iLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGEzNzBkYl9kdF9pZHMpLAorCX0sCisJLnByb2JlCQk9IGEzNzBkYl9wcm9iZSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYTM3MGRiX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlRob21hcyBQZXRhenpvbmkgPHRob21hcy5wZXRhenpvbmlAZnJlZS1lbGVjdHJvbnMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBhMzcwZGIgYXVkaW8gY2xpZW50Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmEzNzBkYi1hdWRpbyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLWkycy5jIGIvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLWkycy5jCmluZGV4IDM5MjBhNWUuLjlmODQyMjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9raXJrd29vZC9raXJrd29vZC1pMnMuYworKysgYi9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtaTJzLmMKQEAgLTYzMyw2ICs2MzMsNyBAQAogc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbXZlYnVfYXVkaW9fb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gIm1hcnZlbGwsa2lya3dvb2QtYXVkaW8iIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGRvdmUtYXVkaW8iIH0sCisJeyAuY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGFybWFkYTM3MC1hdWRpbyIgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtdmVidV9hdWRpb19vZl9tYXRjaCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9LY29uZmlnIGIvc291bmQvc29jL29tYXAvS2NvbmZpZwppbmRleCAyMmFkOWM1Li5lMDA2NTkzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9vbWFwL0tjb25maWcKQEAgLTU4LDcgKzU4LDcgQEAKIAl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIG9tYXAgb3NrNTkxMiIKIAlkZXBlbmRzIG9uIFNORF9PTUFQX1NPQyAmJiBNQUNIX09NQVBfT1NLICYmIEkyQwogCXNlbGVjdCBTTkRfT01BUF9TT0NfTUNCU1AKLQlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyMworCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzX0kyQwogCWhlbHAKIAkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gb3NrNTkxMi4KIApAQCAtNjYsNyArNjYsNyBAQAogCXRyaXN0YXRlICJTb0MgQXVkaW8gc3VwcG9ydCBmb3IgT01BUDM1MTcgLyBBTTM1MTcgRVZNIgogCWRlcGVuZHMgb24gU05EX09NQVBfU09DICYmIE1BQ0hfT01BUDM1MTdFVk0gJiYgSTJDCiAJc2VsZWN0IFNORF9PTUFQX1NPQ19NQ0JTUAotCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzCisJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjNfSTJDCiAJaGVscAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiB0aGUgT01BUDM1MTcgLyBBTTM1MTcKIAkgIEVWTS4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL2Ftcy1kZWx0YS5jIGIvc291bmQvc29jL29tYXAvYW1zLWRlbHRhLmMKaW5kZXggNjI5NDQ2NC4uNTZhNTIxOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvYW1zLWRlbHRhLmMKKysrIGIvc291bmQvc29jL29tYXAvYW1zLWRlbHRhLmMKQEAgLTEwMyw2MCArMTAzLDYyIEBACiAJaWYgKCFjb2RlYy0+aHdfd3JpdGUpCiAJCXJldHVybiAtRVVOQVRDSDsKIAotCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID49IGNvbnRyb2wtPm1heCkKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+PSBjb250cm9sLT5pdGVtcykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOworCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOwogCiAJLyogVHJhbnNsYXRlIHNlbGVjdGlvbiB0byBiaXRtYXAgKi8KIAlwaW5zID0gYW1zX2RlbHRhX2F1ZGlvX21vZGVfcGluc1t1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdXTsKIAogCS8qIFNldHVwIHBpbnMgYWZ0ZXIgY29ycmVzcG9uZGluZyBiaXRzIGlmIGNoYW5nZWQgKi8KIAlwaW4gPSAhIShwaW5zICYgKDEgPDwgQU1TX0RFTFRBX01PVVRIUElFQ0UpKTsKKwogCWlmIChwaW4gIT0gc25kX3NvY19kYXBtX2dldF9waW5fc3RhdHVzKGRhcG0sICJNb3V0aHBpZWNlIikpIHsKIAkJY2hhbmdlZCA9IDE7CiAJCWlmIChwaW4pCi0JCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTW91dGhwaWVjZSIpOworCQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1vdXRocGllY2UiKTsKIAkJZWxzZQotCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNb3V0aHBpZWNlIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1vdXRocGllY2UiKTsKIAl9CiAJcGluID0gISEocGlucyAmICgxIDw8IEFNU19ERUxUQV9FQVJQSUVDRSkpOwogCWlmIChwaW4gIT0gc25kX3NvY19kYXBtX2dldF9waW5fc3RhdHVzKGRhcG0sICJFYXJwaWVjZSIpKSB7CiAJCWNoYW5nZWQgPSAxOwogCQlpZiAocGluKQotCQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkVhcnBpZWNlIik7CisJCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRWFycGllY2UiKTsKIAkJZWxzZQotCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJFYXJwaWVjZSIpOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJFYXJwaWVjZSIpOwogCX0KIAlwaW4gPSAhIShwaW5zICYgKDEgPDwgQU1TX0RFTFRBX01JQ1JPUEhPTkUpKTsKIAlpZiAocGluICE9IHNuZF9zb2NfZGFwbV9nZXRfcGluX3N0YXR1cyhkYXBtLCAiTWljcm9waG9uZSIpKSB7CiAJCWNoYW5nZWQgPSAxOwogCQlpZiAocGluKQotCQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1pY3JvcGhvbmUiKTsKKwkJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJNaWNyb3Bob25lIik7CiAJCWVsc2UKLQkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTWljcm9waG9uZSIpOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJNaWNyb3Bob25lIik7CiAJfQogCXBpbiA9ICEhKHBpbnMgJiAoMSA8PCBBTVNfREVMVEFfU1BFQUtFUikpOwogCWlmIChwaW4gIT0gc25kX3NvY19kYXBtX2dldF9waW5fc3RhdHVzKGRhcG0sICJTcGVha2VyIikpIHsKIAkJY2hhbmdlZCA9IDE7CiAJCWlmIChwaW4pCi0JCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOworCQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlNwZWFrZXIiKTsKIAkJZWxzZQotCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJTcGVha2VyIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlNwZWFrZXIiKTsKIAl9CiAJcGluID0gISEocGlucyAmICgxIDw8IEFNU19ERUxUQV9BR0MpKTsKIAlpZiAocGluICE9IGFtc19kZWx0YV9hdWRpb19hZ2MpIHsKIAkJYW1zX2RlbHRhX2F1ZGlvX2FnYyA9IHBpbjsKIAkJY2hhbmdlZCA9IDE7CiAJCWlmIChwaW4pCi0JCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQUdDSU4iKTsKKwkJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJBR0NJTiIpOwogCQllbHNlCi0JCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFHQ0lOIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkFHQ0lOIik7CiAJfQotCWlmIChjaGFuZ2VkKQotCQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAotCW11dGV4X3VubG9jaygmY29kZWMtPm11dGV4KTsKKwlpZiAoY2hhbmdlZCkKKwkJc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CisKKwlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogCiAJcmV0dXJuIGNoYW5nZWQ7CiB9CkBAIC0xOTQsMTMgKzE5NiwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFtc19kZWx0YV9hdWRpb19lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKGFtc19kZWx0YV9hdWRpb19tb2RlKSwKLQkJCQkJCWFtc19kZWx0YV9hdWRpb19tb2RlKSwKLX07CitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGFtc19kZWx0YV9hdWRpb19lbnVtLAorCQkJCSAgICAgIGFtc19kZWx0YV9hdWRpb19tb2RlKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFtc19kZWx0YV9hdWRpb19jb250cm9sc1tdID0gewotCVNPQ19FTlVNX0VYVCgiQXVkaW8gTW9kZSIsIGFtc19kZWx0YV9hdWRpb19lbnVtWzBdLAorCVNPQ19FTlVNX0VYVCgiQXVkaW8gTW9kZSIsIGFtc19kZWx0YV9hdWRpb19lbnVtLAogCQkJYW1zX2RlbHRhX2dldF9hdWRpb19tb2RlLCBhbXNfZGVsdGFfc2V0X2F1ZGlvX21vZGUpLAogfTsKIApAQCAtMzE1LDEyICszMTUsMTcgQEAKIAl2MjUzX29wcy5jbG9zZSh0dHkpOwogCiAJLyogUmV2ZXJ0IGJhY2sgdG8gZGVmYXVsdCBhdWRpbyBpbnB1dC9vdXRwdXQgY29uc3RlbGxhdGlvbiAqLwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTW91dGhwaWVjZSIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFYXJwaWVjZSIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWNyb3Bob25lIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJTcGVha2VyIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBR0NJTiIpOwotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOworCisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJNb3V0aHBpZWNlIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkVhcnBpZWNlIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1pY3JvcGhvbmUiKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlNwZWFrZXIiKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkFHQ0lOIik7CisKKwlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7CiB9CiAKIC8qIExpbmUgZGlzY2lwbGluZSAuaGFuZ3VwKCkgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL244MTAuYyBiL3NvdW5kL3NvYy9vbWFwL244MTAuYwppbmRleCBkMTYzZTE4Li5mZDRkOWM4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9uODEwLmMKKysrIGIvc291bmQvc29jL29tYXAvbjgxMC5jCkBAIC02OCwyNiArNjgsMzAgQEAKIAkJYnJlYWs7CiAJfQogCisJc25kX3NvY19kYXBtX211dGV4X2xvY2soZGFwbSk7CisKIAlpZiAobjgxMF9zcGtfZnVuYykKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkV4dCBTcGsiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkV4dCBTcGsiKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiRXh0IFNwayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkV4dCBTcGsiKTsKIAogCWlmIChocCkKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwogCWVsc2UKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAJaWYgKGxpbmUxbCkKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxJTkUxTCIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTElORTFMIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxJTkUxTCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkxJTkUxTCIpOwogCiAJaWYgKG44MTBfZG1pY19mdW5jKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRE1pYyIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRE1pYyIpOwogCWVsc2UKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJETWljIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRE1pYyIpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CisKKwlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogfQogCiBzdGF0aWMgaW50IG44MTBfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL29tYXAtYWJlLXR3bDYwNDAuYyBiL3NvdW5kL3NvYy9vbWFwL29tYXAtYWJlLXR3bDYwNDAuYwppbmRleCBlYmIxMzkwLi4wMjRkYWZjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9vbWFwLWFiZS10d2w2MDQwLmMKKysrIGIvc291bmQvc29jL29tYXAvb21hcC1hYmUtdHdsNjA0MC5jCkBAIC0yMDMsOCArMjAzLDcgQEAKIAogc3RhdGljIGludCBvbWFwX2FiZV9kbWljX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmcnRkLT5jYXJkLT5kYXBtOwogCiAJcmV0dXJuIHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGRtaWNfYXVkaW9fbWFwLAogCQkJCUFSUkFZX1NJWkUoZG1pY19hdWRpb19tYXApKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL3J4NTEuYyBiL3NvdW5kL3NvYy9vbWFwL3J4NTEuYwppbmRleCA2MTExNzljLi43ZmIzZDRiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9yeDUxLmMKKysrIGIvc291bmQvc29jL29tYXAvcng1MS5jCkBAIC03NCwyNiArNzQsMzAgQEAKIAkJYnJlYWs7CiAJfQogCisJc25kX3NvY19kYXBtX211dGV4X2xvY2soZGFwbSk7CisKIAlpZiAocng1MV9zcGtfZnVuYykKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkV4dCBTcGsiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkV4dCBTcGsiKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiRXh0IFNwayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkV4dCBTcGsiKTsKIAlpZiAocng1MV9kbWljX2Z1bmMpCi0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJETWljIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJETWljIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkRNaWMiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJETWljIik7CiAJaWYgKGhwKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKIAlpZiAoaHMpCi0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIUyBNaWMiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhTIE1pYyIpOwogCWVsc2UKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIUyBNaWMiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIUyBNaWMiKTsKIAogCWdwaW9fc2V0X3ZhbHVlKFJYNTFfVFZPVVRfU0VMX0dQSU8sIHR2b3V0KTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCXNuZF9zb2NfZGFwbV9zeW5jX3VubG9ja2VkKGRhcG0pOworCisJc25kX3NvY19kYXBtX211dGV4X3VubG9jayhkYXBtKTsKIH0KIAogc3RhdGljIGludCByeDUxX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL2NvcmdpLmMgYi9zb3VuZC9zb2MvcHhhL2NvcmdpLmMKaW5kZXggMTg1M2Q0MS4uNWE4ODEzNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9jb3JnaS5jCisrKyBiL3NvdW5kL3NvYy9weGEvY29yZ2kuYwpAQCAtNDcsNjQgKzQ3LDYzIEBACiAKIHN0YXRpYyB2b2lkIGNvcmdpX2V4dF9jb250cm9sKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSkKIHsKKwlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKKwogCS8qIHNldCB1cCBqYWNrIGNvbm5lY3Rpb24gKi8KIAlzd2l0Y2ggKGNvcmdpX2phY2tfZnVuYykgewogCWNhc2UgQ09SR0lfSFA6CiAJCS8qIHNldCA9IHVubXV0ZSBoZWFkcGhvbmUgKi8KIAkJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19NVVRFX0wsIDEpOwogCQlncGlvX3NldF92YWx1ZShDT1JHSV9HUElPX01VVEVfUiwgMSk7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMaW5lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTWljIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJMaW5lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHNldCBKYWNrIik7CiAJCWJyZWFrOwogCWNhc2UgQ09SR0lfTUlDOgogCQkvKiByZXNldCA9IG11dGUgaGVhZHBob25lICovCiAJCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fTVVURV9MLCAwKTsKIAkJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19NVVRFX1IsIDApOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMaW5lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTWljIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJMaW5lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRzZXQgSmFjayIpOwogCQlicmVhazsKIAljYXNlIENPUkdJX0xJTkU6CiAJCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fTVVURV9MLCAwKTsKIAkJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19NVVRFX1IsIDApOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1pYyBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1pYyBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJMaW5lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRzZXQgSmFjayIpOwogCQlicmVhazsKIAljYXNlIENPUkdJX0hFQURTRVQ6CiAJCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fTVVURV9MLCAwKTsKIAkJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19NVVRFX1IsIDEpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMaW5lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHNldCBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJNaWMgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkxpbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkc2V0IEphY2siKTsKIAkJYnJlYWs7CiAJfQogCiAJaWYgKGNvcmdpX3Nwa19mdW5jID09IENPUkdJX1NQS19PTikKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkV4dCBTcGsiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkV4dCBTcGsiKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiRXh0IFNwayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkV4dCBTcGsiKTsKIAogCS8qIHNpZ25hbCBhIERBUE0gZXZlbnQgKi8KLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKKwlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7CiB9CiAKIHN0YXRpYyBpbnQgY29yZ2lfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQotCW11dGV4X2xvY2soJmNvZGVjLT5tdXRleCk7CiAKIAkvKiBjaGVjayB0aGUgamFjayBzdGF0dXMgYXQgc3RyZWFtIHN0YXJ0dXAgKi8KLQljb3JnaV9leHRfY29udHJvbCgmY29kZWMtPmRhcG0pOwotCi0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCWNvcmdpX2V4dF9jb250cm9sKCZydGQtPmNhcmQtPmRhcG0pOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL2U3NDBfd205NzA1LmMgYi9zb3VuZC9zb2MvcHhhL2U3NDBfd205NzA1LmMKaW5kZXggNDRiNWMwOS4uYzI5ZmVkYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9lNzQwX3dtOTcwNS5jCisrKyBiL3NvdW5kL3NvYy9weGEvZTc0MF93bTk3MDUuYwpAQCAtMTAzLDExICsxMDMsNiBAQAogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIlBDQkVFUCIpOwogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk1JQzIiKTsKIAotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgZTc0MF9kYXBtX3dpZGdldHMsCi0JCQkJCUFSUkFZX1NJWkUoZTc0MF9kYXBtX3dpZGdldHMpKTsKLQotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMzYsNiArMTMxLDExIEBACiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLmRhaV9saW5rID0gZTc0MF9kYWksCiAJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUoZTc0MF9kYWkpLAorCisJLmRhcG1fd2lkZ2V0cyA9IGU3NDBfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShlNzQwX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGdwaW8gZTc0MF9hdWRpb19ncGlvc1tdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9lNzUwX3dtOTcwNS5jIGIvc291bmQvc29jL3B4YS9lNzUwX3dtOTcwNS5jCmluZGV4IGMzNGU0NDcuLmVlMzZhYmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvZTc1MF93bTk3MDUuYworKysgYi9zb3VuZC9zb2MvcHhhL2U3NTBfd205NzA1LmMKQEAgLTg1LDExICs4NSw2IEBACiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiUENCRUVQIik7CiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTUlDMiIpOwogCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBlNzUwX2RhcG1fd2lkZ2V0cywKLQkJCQkJQVJSQVlfU0laRShlNzUwX2RhcG1fd2lkZ2V0cykpOwotCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExOSw2ICsxMTQsMTEgQEAKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkuZGFpX2xpbmsgPSBlNzUwX2RhaSwKIAkubnVtX2xpbmtzID0gQVJSQVlfU0laRShlNzUwX2RhaSksCisKKwkuZGFwbV93aWRnZXRzID0gZTc1MF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGU3NTBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZ3BpbyBlNzUwX2F1ZGlvX2dwaW9zW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL2U4MDBfd205NzEyLmMgYi9zb3VuZC9zb2MvcHhhL2U4MDBfd205NzEyLmMKaW5kZXggMzEzN2Y4MC4uMjRjMjA3OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9lODAwX3dtOTcxMi5jCisrKyBiL3NvdW5kL3NvYy9weGEvZTgwMF93bTk3MTIuYwpAQCAtNzEsMTkgKzcxLDYgQEAKIAl7Ik1JQzIiLCBOVUxMLCAiTWljIChJbnRlcm5hbDIpIn0sCiB9OwogCi1zdGF0aWMgaW50IGU4MDBfYWM5N19pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGU4MDBfZGFwbV93aWRnZXRzLAotCQkJCQlBUlJBWV9TSVpFKGU4MDBfZGFwbV93aWRnZXRzKSk7Ci0KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGU4MDBfZGFpW10gPSB7CiAJewogCQkubmFtZSA9ICJBQzk3IiwKQEAgLTkyLDcgKzc5LDYgQEAKIAkJLmNvZGVjX2RhaV9uYW1lID0gIndtOTcxMi1oaWZpIiwKIAkJLnBsYXRmb3JtX25hbWUgPSAicHhhLXBjbS1hdWRpbyIsCiAJCS5jb2RlY19uYW1lID0gIndtOTcxMi1jb2RlYyIsCi0JCS5pbml0ID0gZTgwMF9hYzk3X2luaXQsCiAJfSwKIAl7CiAJCS5uYW1lID0gIkFDOTcgQXV4IiwKQEAgLTEwOSw2ICs5NSwxMSBAQAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5kYWlfbGluayA9IGU4MDBfZGFpLAogCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKGU4MDBfZGFpKSwKKworCS5kYXBtX3dpZGdldHMgPSBlODAwX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoZTgwMF9kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGF1ZGlvX21hcCwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhdWRpb19tYXApLAogfTsKIAogc3RhdGljIHN0cnVjdCBncGlvIGU4MDBfYXVkaW9fZ3Bpb3NbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvbWFnaWNpYW4uYyBiL3NvdW5kL3NvYy9weGEvbWFnaWNpYW4uYwppbmRleCBhYWNlMTllLi4yNTllMDQ4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL21hZ2ljaWFuLmMKKysrIGIvc291bmQvc29jL3B4YS9tYWdpY2lhbi5jCkBAIC00MSw0NCArNDEsNDIgQEAKIHN0YXRpYyBpbnQgbWFnaWNpYW5fc3BrX3N3aXRjaCA9IDE7CiBzdGF0aWMgaW50IG1hZ2ljaWFuX2luX3NlbCA9IE1BR0lDSUFOX01JQzsKIAotc3RhdGljIHZvaWQgbWFnaWNpYW5fZXh0X2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQorc3RhdGljIHZvaWQgbWFnaWNpYW5fZXh0X2NvbnRyb2woc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtKQogewotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKworCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOwogCiAJaWYgKG1hZ2ljaWFuX3Nwa19zd2l0Y2gpCi0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJTcGVha2VyIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJTcGVha2VyIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIlNwZWFrZXIiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJTcGVha2VyIik7CiAJaWYgKG1hZ2ljaWFuX2hwX3N3aXRjaCkKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwogCWVsc2UKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAKIAlzd2l0Y2ggKG1hZ2ljaWFuX2luX3NlbCkgewogCWNhc2UgTUFHSUNJQU5fTUlDOgotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgTWljIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJDYWxsIE1pYyIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRzZXQgTWljIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJDYWxsIE1pYyIpOwogCQlicmVhazsKIAljYXNlIE1BR0lDSUFOX01JQ19FWFQ6Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQ2FsbCBNaWMiKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgTWljIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiQ2FsbCBNaWMiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRzZXQgTWljIik7CiAJCWJyZWFrOwogCX0KIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCXNuZF9zb2NfZGFwbV9zeW5jX3VubG9ja2VkKGRhcG0pOworCisJc25kX3NvY19kYXBtX211dGV4X3VubG9jayhkYXBtKTsKIH0KIAogc3RhdGljIGludCBtYWdpY2lhbl9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCi0JbXV0ZXhfbG9jaygmY29kZWMtPm11dGV4KTsKIAogCS8qIGNoZWNrIHRoZSBqYWNrIHN0YXR1cyBhdCBzdHJlYW0gc3RhcnR1cCAqLwotCW1hZ2ljaWFuX2V4dF9jb250cm9sKGNvZGVjKTsKLQotCW11dGV4X3VubG9jaygmY29kZWMtPm11dGV4KTsKKwltYWdpY2lhbl9leHRfY29udHJvbCgmcnRkLT5jYXJkLT5kYXBtKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjc3LDEzICsyNzUsMTMgQEAKIHN0YXRpYyBpbnQgbWFnaWNpYW5fc2V0X2hwKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAogCWlmIChtYWdpY2lhbl9ocF9zd2l0Y2ggPT0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCiAJCXJldHVybiAwOwogCiAJbWFnaWNpYW5faHBfc3dpdGNoID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JbWFnaWNpYW5fZXh0X2NvbnRyb2woY29kZWMpOworCW1hZ2ljaWFuX2V4dF9jb250cm9sKCZjYXJkLT5kYXBtKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMjk3LDEzICsyOTUsMTMgQEAKIHN0YXRpYyBpbnQgbWFnaWNpYW5fc2V0X3NwayhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAogCWlmIChtYWdpY2lhbl9zcGtfc3dpdGNoID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQogCQlyZXR1cm4gMDsKIAogCW1hZ2ljaWFuX3Nwa19zd2l0Y2ggPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQltYWdpY2lhbl9leHRfY29udHJvbChjb2RlYyk7CisJbWFnaWNpYW5fZXh0X2NvbnRyb2woJmNhcmQtPmRhcG0pOwogCXJldHVybiAxOwogfQogCkBAIC00MDAsNyArMzk4LDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQlpbnQgZXJyOwogCiAJLyogTkMgY29kZWMgcGlucyAqLwogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIlZPVVRMSFAiKTsKQEAgLTQxMCwxOSArNDA3LDYgQEAKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJWSU5MIik7CiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiVklOUiIpOwogCi0JLyogQWRkIG1hZ2ljaWFuIHNwZWNpZmljIGNvbnRyb2xzICovCi0JZXJyID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIHVkYTEzODBfbWFnaWNpYW5fY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRSh1ZGExMzgwX21hZ2ljaWFuX2NvbnRyb2xzKSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQkvKiBBZGQgbWFnaWNpYW4gc3BlY2lmaWMgd2lkZ2V0cyAqLwotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgdWRhMTM4MF9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHVkYTEzODBfZGFwbV93aWRnZXRzKSk7Ci0KLQkvKiBTZXQgdXAgbWFnaWNpYW4gc3BlY2lmaWMgYXVkaW8gcGF0aCBpbnRlcmNvbm5lY3RzICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ1Niw2ICs0NDAsMTIgQEAKIAkuZGFpX2xpbmsgPSBtYWdpY2lhbl9kYWksCiAJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUobWFnaWNpYW5fZGFpKSwKIAorCS5jb250cm9scyA9IHVkYTEzODBfbWFnaWNpYW5fY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUodWRhMTM4MF9tYWdpY2lhbl9jb250cm9scyksCisJLmRhcG1fd2lkZ2V0cyA9IHVkYTEzODBfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh1ZGExMzgwX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbWFnaWNpYW5fc25kX2RldmljZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvbWlvYTcwMV93bTk3MTMuYyBiL3NvdW5kL3NvYy9weGEvbWlvYTcwMV93bTk3MTMuYwppbmRleCAxNjBjNTI0Li41OTVlZWUzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL21pb2E3MDFfd205NzEzLmMKKysrIGIvc291bmQvc29jL3B4YS9taW9hNzAxX3dtOTcxMy5jCkBAIC0xMjcsMTYgKzEyNyw4IEBACiBzdGF0aWMgaW50IG1pb2E3MDFfd205NzEzX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAl1bnNpZ25lZCBzaG9ydCByZWc7CiAKLQkvKiBBZGQgbWlvYTcwMSBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBtaW9hNzAxX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUobWlvYTcwMV9kYXBtX3dpZGdldHMpKTsKLQotCS8qIFNldCB1cCBtaW9hNzAxIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwbmVjdHMgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7Ci0KIAkvKiBQcmVwYXJlIEdQSU84IGZvciByZWFyIHNwZWFrZXIgYW1wbGlmaWVyICovCiAJcmVnID0gY29kZWMtPmRyaXZlci0+cmVhZChjb2RlYywgQUM5N19HUElPX0NGRyk7CiAJY29kZWMtPmRyaXZlci0+d3JpdGUoY29kZWMsIEFDOTdfR1BJT19DRkcsIHJlZyB8IDB4MDEwMCk7CkBAIC0xNDUsMTIgKzEzNyw2IEBACiAJcmVnID0gY29kZWMtPmRyaXZlci0+cmVhZChjb2RlYywgQUM5N18zRF9DT05UUk9MKTsKIAljb2RlYy0+ZHJpdmVyLT53cml0ZShjb2RlYywgQUM5N18zRF9DT05UUk9MLCByZWcgfCAweGMwMDApOwogCi0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkZyb250IFNwZWFrZXIiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiUmVhciBTcGVha2VyIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkZyb250IE1pYyIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJHU00gTGluZSBJbiIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJHU00gTGluZSBPdXQiKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xODMsNiArMTY5LDExIEBACiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLmRhaV9saW5rID0gbWlvYTcwMV9kYWksCiAJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUobWlvYTcwMV9kYWkpLAorCisJLmRhcG1fd2lkZ2V0cyA9IG1pb2E3MDFfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShtaW9hNzAxX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCiB9OwogCiBzdGF0aWMgaW50IG1pb2E3MDFfd205NzEzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3Bvb2RsZS5jIGIvc291bmQvc29jL3B4YS9wb29kbGUuYwppbmRleCBjOTNlMTM4Li5jNmJkYzZjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3Bvb2RsZS5jCisrKyBiL3NvdW5kL3NvYy9weGEvcG9vZGxlLmMKQEAgLTc0LDE0ICs3NCw5IEBACiBzdGF0aWMgaW50IHBvb2RsZV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCi0JbXV0ZXhfbG9jaygmY29kZWMtPm11dGV4KTsKIAogCS8qIGNoZWNrIHRoZSBqYWNrIHN0YXR1cyBhdCBzdHJlYW0gc3RhcnR1cCAqLwotCXBvb2RsZV9leHRfY29udHJvbCgmY29kZWMtPmRhcG0pOwotCi0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCXBvb2RsZV9leHRfY29udHJvbCgmcnRkLT5jYXJkLT5kYXBtKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9zcGl0ei5jIGIvc291bmQvc29jL3B4YS9zcGl0ei5jCmluZGV4IGZjMDUyZDguLjEzNzNiMDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvc3BpdHouYworKysgYi9zb3VuZC9zb2MvcHhhL3NwaXR6LmMKQEAgLTQ2LDc0ICs0Niw3NCBAQAogCiBzdGF0aWMgdm9pZCBzcGl0el9leHRfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCiB7CisJc25kX3NvY19kYXBtX211dGV4X2xvY2soZGFwbSk7CisKIAlpZiAoc3BpdHpfc3BrX2Z1bmMgPT0gU1BJVFpfU1BLX09OKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRXh0IFNwayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRXh0IFNwayIpOwogCWVsc2UKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJFeHQgU3BrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRXh0IFNwayIpOwogCiAJLyogc2V0IHVwIGphY2sgY29ubmVjdGlvbiAqLwogCXN3aXRjaCAoc3BpdHpfamFja19mdW5jKSB7CiAJY2FzZSBTUElUWl9IUDoKIAkJLyogZW5hYmxlIGFuZCB1bm11dGUgaHAgamFjaywgZGlzYWJsZSBtaWMgYmlhcyAqLwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1pYyBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTGluZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRzZXQgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1pYyBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTGluZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwogCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX01VVEVfTCwgMSk7CiAJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTVVURV9SLCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBTUElUWl9NSUM6CiAJCS8qIGVuYWJsZSBtaWMgamFjayBhbmQgYmlhcywgbXV0ZSBocCAqLwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTGluZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHNldCBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTGluZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJNaWMgSmFjayIpOwogCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX01VVEVfTCwgMCk7CiAJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTVVURV9SLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBTUElUWl9MSU5FOgogCQkvKiBlbmFibGUgbGluZSBqYWNrLCBkaXNhYmxlIG1pYyBiaWFzIGFuZCBtdXRlIGhwICovCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkc2V0IEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkc2V0IEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJNaWMgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTGluZSBKYWNrIik7CiAJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTVVURV9MLCAwKTsKIAkJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19NVVRFX1IsIDApOwogCQlicmVhazsKIAljYXNlIFNQSVRaX0hFQURTRVQ6CiAJCS8qIGVuYWJsZSBhbmQgdW5tdXRlIGhlYWRzZXQgamFjayBlbmFibGUgbWljIGJpYXMsIG11dGUgTCBocCAqLwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxpbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHNldCBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1pYyBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTGluZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkc2V0IEphY2siKTsKIAkJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19NVVRFX0wsIDApOwogCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX01VVEVfUiwgMSk7CiAJCWJyZWFrOwogCWNhc2UgU1BJVFpfSFBfT0ZGOgogCiAJCS8qIGphY2sgcmVtb3ZlZCwgZXZlcnl0aGluZyBvZmYgKi8KLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1pYyBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTGluZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkc2V0IEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJNaWMgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkxpbmUgSmFjayIpOwogCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX01VVEVfTCwgMCk7CiAJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTVVURV9SLCAwKTsKIAkJYnJlYWs7CiAJfQotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCisJc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CisKKwlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogfQogCiBzdGF0aWMgaW50IHNwaXR6X3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0KLQltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOwogCiAJLyogY2hlY2sgdGhlIGphY2sgc3RhdHVzIGF0IHN0cmVhbSBzdGFydHVwICovCi0Jc3BpdHpfZXh0X2NvbnRyb2woJmNvZGVjLT5kYXBtKTsKLQotCW11dGV4X3VubG9jaygmY29kZWMtPm11dGV4KTsKKwlzcGl0el9leHRfY29udHJvbCgmcnRkLT5jYXJkLT5kYXBtKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS90b3NhLmMgYi9zb3VuZC9zb2MvcHhhL3Rvc2EuYwppbmRleCAxZDljMmVkLi40YTk1NmQxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3Rvc2EuYworKysgYi9zb3VuZC9zb2MvcHhhL3Rvc2EuYwpAQCAtNDQsNDggKzQ0LDQ2IEBACiBzdGF0aWMgaW50IHRvc2FfamFja19mdW5jOwogc3RhdGljIGludCB0b3NhX3Nwa19mdW5jOwogCi1zdGF0aWMgdm9pZCB0b3NhX2V4dF9jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3N0YXRpYyB2b2lkIHRvc2FfZXh0X2NvbnRyb2woc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtKQogewotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKworCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOwogCiAJLyogc2V0IHVwIGphY2sgY29ubmVjdGlvbiAqLwogCXN3aXRjaCAodG9zYV9qYWNrX2Z1bmMpIHsKIAljYXNlIFRPU0FfSFA6Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTWljIChJbnRlcm5hbCkiKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTWljIChJbnRlcm5hbCkiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHNldCBKYWNrIik7CiAJCWJyZWFrOwogCWNhc2UgVE9TQV9NSUNfSU5UOgotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljIChJbnRlcm5hbCkiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTWljIChJbnRlcm5hbCkiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRzZXQgSmFjayIpOwogCQlicmVhazsKIAljYXNlIFRPU0FfSEVBRFNFVDoKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNaWMgKEludGVybmFsKSIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkc2V0IEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJNaWMgKEludGVybmFsKSIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkc2V0IEphY2siKTsKIAkJYnJlYWs7CiAJfQogCiAJaWYgKHRvc2Ffc3BrX2Z1bmMgPT0gVE9TQV9TUEtfT04pCi0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJTcGVha2VyIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJTcGVha2VyIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIlNwZWFrZXIiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJTcGVha2VyIik7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKKwlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7CiB9CiAKIHN0YXRpYyBpbnQgdG9zYV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCi0JbXV0ZXhfbG9jaygmY29kZWMtPm11dGV4KTsKIAogCS8qIGNoZWNrIHRoZSBqYWNrIHN0YXR1cyBhdCBzdHJlYW0gc3RhcnR1cCAqLwotCXRvc2FfZXh0X2NvbnRyb2woY29kZWMpOwotCi0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCXRvc2FfZXh0X2NvbnRyb2woJnJ0ZC0+Y2FyZC0+ZGFwbSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwNCwxMyArMTAyLDEzIEBACiBzdGF0aWMgaW50IHRvc2Ffc2V0X2phY2soc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gIHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCiAJaWYgKHRvc2FfamFja19mdW5jID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQogCQlyZXR1cm4gMDsKIAogCXRvc2FfamFja19mdW5jID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JdG9zYV9leHRfY29udHJvbChjb2RlYyk7CisJdG9zYV9leHRfY29udHJvbCgmY2FyZC0+ZGFwbSk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTEyNCwxMyArMTIyLDEzIEBACiBzdGF0aWMgaW50IHRvc2Ffc2V0X3NwayhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSAgc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAKIAlpZiAodG9zYV9zcGtfZnVuYyA9PSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKIAkJcmV0dXJuIDA7CiAKIAl0b3NhX3Nwa19mdW5jID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JdG9zYV9leHRfY29udHJvbChjb2RlYyk7CisJdG9zYV9leHRfY29udHJvbCgmY2FyZC0+ZGFwbSk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTE5MSwyNCArMTg5LDEwIEBACiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0JaW50IGVycjsKIAogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk9VVDMiKTsKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJNT05PT1VUIik7CiAKLQkvKiBhZGQgdG9zYSBzcGVjaWZpYyBjb250cm9scyAqLwotCWVyciA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCB0b3NhX2NvbnRyb2xzLAotCQkJCUFSUkFZX1NJWkUodG9zYV9jb250cm9scykpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JLyogYWRkIHRvc2Egc3BlY2lmaWMgd2lkZ2V0cyAqLwotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgdG9zYV9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHRvc2FfZGFwbV93aWRnZXRzKSk7Ci0KLQkvKiBzZXQgdXAgdG9zYSBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0yMzksNiArMjIzLDEzIEBACiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLmRhaV9saW5rID0gdG9zYV9kYWksCiAJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUodG9zYV9kYWkpLAorCisJLmNvbnRyb2xzID0gdG9zYV9jb250cm9scywKKwkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh0b3NhX2NvbnRyb2xzKSwKKwkuZGFwbV93aWRnZXRzID0gdG9zYV9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHRvc2FfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBpbnQgdG9zYV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS96eWxvbml0ZS5jIGIvc291bmQvc29jL3B4YS96eWxvbml0ZS5jCmluZGV4IGRiOGFhZGYuLjIzYmY5OTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvenlsb25pdGUuYworKysgYi9zb3VuZC9zb2MvcHhhL3p5bG9uaXRlLmMKQEAgLTcxLDIyICs3MSwxMCBAQAogCiBzdGF0aWMgaW50IHp5bG9uaXRlX3dtOTcxM19pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0KIAlpZiAoY2xrX3BvdXQpCiAJCXNuZF9zb2NfZGFpX3NldF9wbGwocnRkLT5jb2RlY19kYWksIDAsIDAsCiAJCQkJICAgIGNsa19nZXRfcmF0ZShwb3V0KSwgMCk7CiAKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHp5bG9uaXRlX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUoenlsb25pdGVfZGFwbV93aWRnZXRzKSk7Ci0KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7Ci0KLQkvKiBTdGF0aWMgc2V0dXAgZm9yIG5vdyAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkcGhvbmUiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHNldCBFYXJwaWVjZSIpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI1Niw2ICsyNDQsMTEgQEAKIAkucmVzdW1lX3ByZSA9ICZ6eWxvbml0ZV9yZXN1bWVfcHJlLAogCS5kYWlfbGluayA9IHp5bG9uaXRlX2RhaSwKIAkubnVtX2xpbmtzID0gQVJSQVlfU0laRSh6eWxvbml0ZV9kYWkpLAorCisJLmRhcG1fd2lkZ2V0cyA9IHp5bG9uaXRlX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoenlsb25pdGVfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp6eWxvbml0ZV9zbmRfYWM5N19kZXZpY2U7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczYwMDAvczYxMDUtaXBjYW0uYyBiL3NvdW5kL3NvYy9zNjAwMC9zNjEwNS1pcGNhbS5jCmluZGV4IDk0NWU4YWIuLjBiMjFkMWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zNjAwMC9zNjEwNS1pcGNhbS5jCisrKyBiL3NvdW5kL3NvYy9zNjAwMC9zNjEwNS1pcGNhbS5jCkBAIC0xMDQsOCArMTA0LDggQEAKIHN0YXRpYyBpbnQgb3V0cHV0X3R5cGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNhcmQtPmRhcG07CiAJdW5zaWduZWQgaW50IHZhbCA9ICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICE9IDApOwogCWNoYXIgKmRpZmZlcmVudGlhbCA9ICJBdWRpbyBPdXQgRGlmZmVyZW50aWFsIjsKIAljaGFyICpzdGVyZW8gPSAiQXVkaW8gT3V0IFN0ZXJlbyI7CkBAIC0xMzcsMTMgKzEzNyw3IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0KLQkvKiBBZGQgczYxMDUgc3BlY2lmaWMgd2lkZ2V0cyAqLwotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgYWljM3hfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRShhaWMzeF9kYXBtX3dpZGdldHMpKTsKLQotCS8qIFNldCB1cCBzNjEwNSBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcnRkLT5jYXJkOwogCiAJLyogbm90IHByZXNlbnQgKi8KIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJNT05PX0xPVVQiKTsKQEAgLTE1NywxNyArMTUxLDEwIEBACiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiUkxPVVQiKTsKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJIUFJDT00iKTsKIAotCS8qIGFsd2F5cyBjb25uZWN0ZWQgKi8KLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQXVkaW8gSW4iKTsKLQogCS8qIG11c3QgY29ycmVzcG9uZCB0byBhdWRpb19vdXRfbXV4LnByaXZhdGVfdmFsdWUgaW5pdGlhbGl6ZXIgKi8KLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkF1ZGlvIE91dCBEaWZmZXJlbnRpYWwiKTsKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQXVkaW8gT3V0IFN0ZXJlbyIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY2FyZC0+ZGFwbSwgIkF1ZGlvIE91dCBEaWZmZXJlbnRpYWwiKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCi0Jc25kX2N0bF9hZGQoY29kZWMtPmNhcmQtPnNuZF9jYXJkLCBzbmRfY3RsX25ldzEoJmF1ZGlvX291dF9tdXgsIGNvZGVjKSk7CisJc25kX2N0bF9hZGQoY2FyZC0+c25kX2NhcmQsIHNuZF9jdGxfbmV3MSgmYXVkaW9fb3V0X211eCwgY2FyZCkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xOTAsNiArMTc3LDExIEBACiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLmRhaV9saW5rID0gJnM2MTA1X2RhaSwKIAkubnVtX2xpbmtzID0gMSwKKworCS5kYXBtX3dpZGdldHMgPSBhaWMzeF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFpYzN4X2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCiB9OwogCiBzdGF0aWMgc3RydWN0IHM2MDAwX3NuZF9wbGF0Zm9ybV9kYXRhIHM2MTA1X3NuZF9kYXRhIF9faW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9LY29uZmlnIGIvc291bmQvc29jL3NhbXN1bmcvS2NvbmZpZwppbmRleCAzNTA3NTc0Li5mMmUyODkxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL0tjb25maWcKQEAgLTExNyw3ICsxMTcsNyBAQAogCXRyaXN0YXRlICJTb0MgSTJTIEF1ZGlvIHN1cHBvcnQgZm9yIFRMVjMyMEFJQzIzIG9uIFNpbXRlYyBib2FyZHMiCiAJZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgQVJDSF9TM0MyNFhYCiAJc2VsZWN0IFNORF9TM0MyNFhYX0kyUwotCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzCisJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjNfSTJDCiAJc2VsZWN0IFNORF9TT0NfU0FNU1VOR19TSU1URUMKIAogY29uZmlnIFNORF9TT0NfU0FNU1VOR19TSU1URUNfSEVSTUVTCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9oMTk0MF91ZGExMzgwLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9oMTk0MF91ZGExMzgwLmMKaW5kZXggZmJjZWQ1OC4uODhiMDllMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvaDE5NDBfdWRhMTM4MC5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2gxOTQwX3VkYTEzODAuYwpAQCAtNjYsMTAgKzY2LDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCi0JcnVudGltZS0+aHcucmF0ZV9taW4gPSBod19yYXRlcy5saXN0WzBdOwotCXJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0gaHdfcmF0ZXMubGlzdFtod19yYXRlcy5jb3VudCAtIDFdOwotCXJ1bnRpbWUtPmh3LnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVDsKLQogCXJldHVybiBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLAogCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKIAkJCQkJJmh3X3JhdGVzKTsKQEAgLTk0LDcgKzkwLDcgQEAKIAkJCWRpdisrOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKCZydGQtPmRldiwgIiVzOiByYXRlICVkIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCisJCWRldl9lcnIocnRkLT5kZXYsICIlczogcmF0ZSAlZCBpcyBub3Qgc3VwcG9ydGVkXG4iLAogCQkJX19mdW5jX18sIHJhdGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xODEsNyArMTc3LDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQlpbnQgZXJyOwogCiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIlNwZWFrZXIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL25lbzE5NzNfd204NzUzLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9uZW8xOTczX3dtODc1My5jCmluZGV4IDk4YTA0YzEuLmIwODAwMzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL25lbzE5NzNfd204NzUzLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvbmVvMTk3M193bTg3NTMuYwpAQCAtMTkyLDQ0ICsxOTIsNiBAQAogCS5od19mcmVlID0gbmVvMTk3M192b2ljZV9od19mcmVlLAogfTsKIAotLyogU2hhcmVkIHJvdXRlcyBhbmQgY29udHJvbHMgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IG5lbzE5NzNfd204NzUzX2RhcG1fd2lkZ2V0c1tdID0gewotCVNORF9TT0NfREFQTV9MSU5FKCJHU00gTGluZSBPdXQiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTElORSgiR1NNIExpbmUgSW4iLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9NSUMoIkhhbmRzZXQgTWljIiwgTlVMTCksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBuZW8xOTczX3dtODc1M19yb3V0ZXNbXSA9IHsKLQkvKiBDb25uZWN0aW9ucyB0byB0aGUgR1NNIE1vZHVsZSAqLwotCXsiR1NNIExpbmUgT3V0IiwgTlVMTCwgIk1PTk8xIn0sCi0JeyJHU00gTGluZSBPdXQiLCBOVUxMLCAiTU9OTzIifSwKLQl7IlJYUCIsIE5VTEwsICJHU00gTGluZSBJbiJ9LAotCXsiUlhOIiwgTlVMTCwgIkdTTSBMaW5lIEluIn0sCi0KLQkvKiBDb25uZWN0aW9ucyB0byBIZWFkc2V0ICovCi0JeyJNSUMxIiwgTlVMTCwgIk1pYyBCaWFzIn0sCi0JeyJNaWMgQmlhcyIsIE5VTEwsICJIZWFkc2V0IE1pYyJ9LAotCi0JLyogQ2FsbCBNaWMgKi8KLQl7Ik1JQzIiLCBOVUxMLCAiTWljIEJpYXMifSwKLQl7Ik1JQzJOIiwgTlVMTCwgIk1pYyBCaWFzIn0sCi0JeyJNaWMgQmlhcyIsIE5VTEwsICJIYW5kc2V0IE1pYyJ9LAotCi0JLyogQ29ubmVjdCB0aGUgQUxDIHBpbnMgKi8KLQl7IkFDSU4iLCBOVUxMLCAiQUNPUCJ9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG5lbzE5NzNfd204NzUzX2NvbnRyb2xzW10gPSB7Ci0JU09DX0RBUE1fUElOX1NXSVRDSCgiR1NNIExpbmUgT3V0IiksCi0JU09DX0RBUE1fUElOX1NXSVRDSCgiR1NNIExpbmUgSW4iKSwKLQlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkc2V0IE1pYyIpLAotCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhhbmRzZXQgTWljIiksCi19OwotCi0vKiBHVEEwMiBzcGVjaWZpYyByb3V0ZXMgYW5kIGNvbnRyb2xzICovCi0KIHN0YXRpYyBpbnQgZ3RhMDJfc3BlYWtlcl9lbmFibGVkOwogCiBzdGF0aWMgaW50IGxtNDg1M19zZXRfc3BrKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLApAQCAtMjU3LDcgKzIxOSwzNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBuZW8xOTczX2d0YTAyX3JvdXRlc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IG5lbzE5NzNfd204NzUzX2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9MSU5FKCJHU00gTGluZSBPdXQiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTElORSgiR1NNIExpbmUgSW4iLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkhhbmRzZXQgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX1NQSygiSGFuZHNldCBTcGsiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fU1BLKCJTdGVyZW8gT3V0IiwgbG00ODUzX2V2ZW50KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIG5lbzE5NzNfd204NzUzX3JvdXRlc1tdID0geworCS8qIENvbm5lY3Rpb25zIHRvIHRoZSBHU00gTW9kdWxlICovCisJeyJHU00gTGluZSBPdXQiLCBOVUxMLCAiTU9OTzEifSwKKwl7IkdTTSBMaW5lIE91dCIsIE5VTEwsICJNT05PMiJ9LAorCXsiUlhQIiwgTlVMTCwgIkdTTSBMaW5lIEluIn0sCisJeyJSWE4iLCBOVUxMLCAiR1NNIExpbmUgSW4ifSwKKworCS8qIENvbm5lY3Rpb25zIHRvIEhlYWRzZXQgKi8KKwl7Ik1JQzEiLCBOVUxMLCAiTWljIEJpYXMifSwKKwl7Ik1pYyBCaWFzIiwgTlVMTCwgIkhlYWRzZXQgTWljIn0sCisKKwkvKiBDYWxsIE1pYyAqLworCXsiTUlDMiIsIE5VTEwsICJNaWMgQmlhcyJ9LAorCXsiTUlDMk4iLCBOVUxMLCAiTWljIEJpYXMifSwKKwl7Ik1pYyBCaWFzIiwgTlVMTCwgIkhhbmRzZXQgTWljIn0sCisKKwkvKiBDb25uZWN0IHRoZSBBTEMgcGlucyAqLworCXsiQUNJTiIsIE5VTEwsICJBQ09QIn0sCisKIAkvKiBDb25uZWN0aW9ucyB0byB0aGUgYW1wICovCiAJeyJTdGVyZW8gT3V0IiwgTlVMTCwgIkxPVVQxIn0sCiAJeyJTdGVyZW8gT3V0IiwgTlVMTCwgIlJPVVQxIn0sCkBAIC0yNjcsNyArMjU2LDExIEBACiAJeyJIYW5kc2V0IFNwayIsIE5VTEwsICJST1VUMiJ9LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG5lbzE5NzNfZ3RhMDJfd204NzUzX2NvbnRyb2xzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbmVvMTk3M193bTg3NTNfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJHU00gTGluZSBPdXQiKSwKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJHU00gTGluZSBJbiIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRzZXQgTWljIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiSGFuZHNldCBNaWMiKSwKIAlTT0NfREFQTV9QSU5fU1dJVENIKCJIYW5kc2V0IFNwayIpLAogCVNPQ19EQVBNX1BJTl9TV0lUQ0goIlN0ZXJlbyBPdXQiKSwKIApAQCAtMjc2LDg2ICsyNjksMzIgQEAKIAkJbG00ODUzX3NldF9zcGspLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IG5lbzE5NzNfZ3RhMDJfd204NzUzX2RhcG1fd2lkZ2V0c1tdID0gewotCVNORF9TT0NfREFQTV9TUEsoIkhhbmRzZXQgU3BrIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX1NQSygiU3RlcmVvIE91dCIsIGxtNDg1M19ldmVudCksCi19OwotCi1zdGF0aWMgaW50IG5lbzE5NzNfZ3RhMDJfd204NzUzX2luaXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBuZW8xOTczX2d0YTAyX3dtODc1M19kYXBtX3dpZGdldHMsCi0JCQlBUlJBWV9TSVpFKG5lbzE5NzNfZ3RhMDJfd204NzUzX2RhcG1fd2lkZ2V0cykpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBuZW8xOTczX2d0YTAyX3JvdXRlcywKLQkJCUFSUkFZX1NJWkUobmVvMTk3M19ndGEwMl9yb3V0ZXMpKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gc25kX3NvY19hZGRfY2FyZF9jb250cm9scyhjb2RlYy0+Y2FyZCwgbmVvMTk3M19ndGEwMl93bTg3NTNfY29udHJvbHMsCi0JCQlBUlJBWV9TSVpFKG5lbzE5NzNfZ3RhMDJfd204NzUzX2NvbnRyb2xzKSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiU3RlcmVvIE91dCIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGFuZHNldCBTcGsiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlN0ZXJlbyBPdXQiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkhhbmRzZXQgU3BrIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBuZW8xOTczX3dtODc1M19pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0JaW50IHJldDsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcnRkLT5jYXJkOwogCiAJLyogc2V0IHVwIE5DIGNvZGVjIHBpbnMgKi8KLQlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJPVVQzIik7Ci0Jc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiT1VUNCIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkxJTkUxIik7Ci0Jc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORTIiKTsKLQotCS8qIEFkZCBuZW8xOTczIHNwZWNpZmljIHdpZGdldHMgKi8KLQlyZXQgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIG5lbzE5NzNfd204NzUzX2RhcG1fd2lkZ2V0cywKLQkJCUFSUkFZX1NJWkUobmVvMTk3M193bTg3NTNfZGFwbV93aWRnZXRzKSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIGFkZCBuZW8xOTczIHNwZWNpZmljIGNvbnRyb2xzICovCi0JcmV0ID0gc25kX3NvY19hZGRfY2FyZF9jb250cm9scyhydGQtPmNhcmQsIG5lbzE5NzNfd204NzUzX2NvbnRyb2xzLAotCQkJQVJSQVlfU0laRShuZW8xOTczX3dtODc1M19jb250cm9scykpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBzZXQgdXAgbmVvMTk3MyBzcGVjaWZpYyBhdWRpbyByb3V0ZXMgKi8KLQlyZXQgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBuZW8xOTczX3dtODc1M19yb3V0ZXMsCi0JCQlBUlJBWV9TSVpFKG5lbzE5NzNfd204NzUzX3JvdXRlcykpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJc25kX3NvY19kYXBtX25jX3BpbigmY29kZWMtPmRhcG0sICJPVVQzIik7CisJc25kX3NvY19kYXBtX25jX3BpbigmY29kZWMtPmRhcG0sICJPVVQ0Iik7CisJc25kX3NvY19kYXBtX25jX3BpbigmY29kZWMtPmRhcG0sICJMSU5FMSIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oJmNvZGVjLT5kYXBtLCAiTElORTIiKTsKIAogCS8qIHNldCBlbmRwb2ludHMgdG8gZGVmYXVsdCBvZmYgbW9kZSAqLwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiR1NNIExpbmUgT3V0Iik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJHU00gTGluZSBJbiIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhhbmRzZXQgTWljIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjYXJkLT5kYXBtLCAiR1NNIExpbmUgT3V0Iik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjYXJkLT5kYXBtLCAiR1NNIExpbmUgSW4iKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNhcmQtPmRhcG0sICJIZWFkc2V0IE1pYyIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY2FyZC0+ZGFwbSwgIkhhbmRzZXQgTWljIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjYXJkLT5kYXBtLCAiU3RlcmVvIE91dCIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY2FyZC0+ZGFwbSwgIkhhbmRzZXQgU3BrIik7CiAKIAkvKiBhbGxvdyBhdWRpbyBwYXRocyBmcm9tIHRoZSBHU00gbW9kZW0gdG8gcnVuIGR1cmluZyBzdXNwZW5kICovCi0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJHU00gTGluZSBPdXQiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkdTTSBMaW5lIEluIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJIZWFkc2V0IE1pYyIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSGFuZHNldCBNaWMiKTsKLQotCWlmIChtYWNoaW5lX2lzX25lbzE5NzNfZ3RhMDIoKSkgewotCQlyZXQgPSBuZW8xOTczX2d0YTAyX3dtODc1M19pbml0KGNvZGVjKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQorCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZCgmY2FyZC0+ZGFwbSwgIkdTTSBMaW5lIE91dCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZCgmY2FyZC0+ZGFwbSwgIkdTTSBMaW5lIEluIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKCZjYXJkLT5kYXBtLCAiSGVhZHNldCBNaWMiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoJmNhcmQtPmRhcG0sICJIYW5kc2V0IE1pYyIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZCgmY2FyZC0+ZGFwbSwgIlN0ZXJlbyBPdXQiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoJmNhcmQtPmRhcG0sICJIYW5kc2V0IFNwayIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MDksNiArMzQ4LDEzIEBACiAJLm51bV9hdXhfZGV2cyA9IEFSUkFZX1NJWkUobmVvMTk3M19hdXhfZGV2cyksCiAJLmNvZGVjX2NvbmYgPSBuZW8xOTczX2NvZGVjX2NvbmYsCiAJLm51bV9jb25maWdzID0gQVJSQVlfU0laRShuZW8xOTczX2NvZGVjX2NvbmYpLAorCisJLmNvbnRyb2xzID0gbmVvMTk3M193bTg3NTNfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobmVvMTk3M193bTg3NTNfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSBuZW8xOTczX3dtODc1M19kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG5lbzE5NzNfd204NzUzX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gbmVvMTk3M193bTg3NTNfcm91dGVzLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKG5lbzE5NzNfd204NzUzX3JvdXRlcyksCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbmVvMTk3M19zbmRfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvcngxOTUwX3VkYTEzODAuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3J4MTk1MF91ZGExMzgwLmMKaW5kZXggMDZlYmRjMC4uMjk4MmQ5ZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvcngxOTUwX3VkYTEzODAuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9yeDE5NTBfdWRhMTM4MC5jCkBAIC0xMzEsMTAgKzEzMSw2IEBACiB7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAotCXJ1bnRpbWUtPmh3LnJhdGVfbWluID0gaHdfcmF0ZXMubGlzdFswXTsKLQlydW50aW1lLT5ody5yYXRlX21heCA9IGh3X3JhdGVzLmxpc3RbaHdfcmF0ZXMuY291bnQgLSAxXTsKLQlydW50aW1lLT5ody5yYXRlcyA9IFNORFJWX1BDTV9SQVRFX0tOT1Q7Ci0KIAlyZXR1cm4gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwKIAkJCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCiAJCQkJCSZod19yYXRlcyk7CkBAIC0yMjYsNyArMjIyLDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQlpbnQgZXJyOwogCiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIlNwZWFrZXIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0LmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NC5jCmluZGV4IGQzOGFlOTguLjY4MmViNGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0LmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg5OTQuYwpAQCAtMjAyLDcgKzIwMiw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNtZGtfYXVkaW9fZHJpdmVyID0gewogCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJzbWRrLWF1ZGlvLXdtODg5NCIsCisJCS5uYW1lCT0gInNtZGstYXVkaW8td204OTk0IiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihzYW1zdW5nX3dtODk5NF9vZl9tYXRjaCksCiAJCS5wbQk9ICZzbmRfc29jX3BtX29wcywKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3RvYmVybW9yeS5jIGIvc291bmQvc29jL3NhbXN1bmcvdG9iZXJtb3J5LmMKaW5kZXggZjIxZmY2MC4uMTgwN2I3NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvdG9iZXJtb3J5LmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvdG9iZXJtb3J5LmMKQEAgLTQ0LDYgKzQ0LDggQEAKIAkJCQkJCSAgICAgU05EX1NPQ19DTE9DS19JTik7CiAJCQlpZiAocmV0IDwgMCkgewogCQkJCXByX2VycigiRmFpbGVkIHRvIHNldCBTWVNDTEs6ICVkXG4iLCByZXQpOworCQkJCXNuZF9zb2NfZGFpX3NldF9wbGwoY29kZWNfZGFpLCBXTTg5NjJfRkxMLAorCQkJCQkJICAgIDAsIDAsIDApOwogCQkJCXJldHVybiByZXQ7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9mc2kuYyBiL3NvdW5kL3NvYy9zaC9mc2kuYwppbmRleCAxOTY3ZjQ0Li43MTBhMDc5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvZnNpLmMKKysrIGIvc291bmQvc29jL3NoL2ZzaS5jCkBAIC0xNzExLDkgKzE3MTEsOSBAQAogCS8qIHNldCBtYXN0ZXIvc2xhdmUgYXVkaW8gaW50ZXJmYWNlICovCiAJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgewogCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTToKLQkJZnNpLT5jbGtfbWFzdGVyID0gMTsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQlmc2ktPmNsa19tYXN0ZXIgPSAxOyAvKiBjb2RlYyBpcyBzbGF2ZSwgY3B1IGlzIG1hc3RlciAqLwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9taWdvci5jIGIvc291bmQvc29jL3NoL21pZ29yLmMKaW5kZXggNTAxNGE4OC4uYzU4YzI1MiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL21pZ29yLmMKKysrIGIvc291bmQvc29jL3NoL21pZ29yLmMKQEAgLTEzNiwxOSArMTM2LDYgQEAKIAl7ICJNaWMgQmlhcyIsIE5VTEwsICJFeHRlcm5hbCBNaWNyb3Bob25lIiB9LAogfTsKIAotc3RhdGljIGludCBtaWdvcl9kYWlfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBtaWdvcl9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKG1pZ29yX2RhcG1fd2lkZ2V0cykpOwotCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qIG1pZ29yIGRpZ2l0YWwgYXVkaW8gaW50ZXJmYWNlIGdsdWUgLSBjb25uZWN0cyBjb2RlYyA8LS0+IENQVSAqLwogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1pZ29yX2RhaSA9IHsKIAkubmFtZSA9ICJ3bTg5NzgiLApAQCAtMTU4LDcgKzE0NSw2IEBACiAJLnBsYXRmb3JtX25hbWUgPSAic2l1LXBjbS1hdWRpbyIsCiAJLmNvZGVjX25hbWUgPSAid204OTc4LjAtMDAxYSIsCiAJLm9wcyA9ICZtaWdvcl9kYWlfb3BzLAotCS5pbml0ID0gbWlnb3JfZGFpX2luaXQsCiB9OwogCiAvKiBtaWdvciBhdWRpbyBtYWNoaW5lIGRyaXZlciAqLwpAQCAtMTY3LDYgKzE1MywxMSBAQAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5kYWlfbGluayA9ICZtaWdvcl9kYWksCiAJLm51bV9saW5rcyA9IDEsCisKKwkuZGFwbV93aWRnZXRzID0gbWlnb3JfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShtaWdvcl9kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGF1ZGlvX21hcCwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhdWRpb19tYXApLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm1pZ29yX3NuZF9kZXZpY2U7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvcmNhci9NYWtlZmlsZSBiL3NvdW5kL3NvYy9zaC9yY2FyL01ha2VmaWxlCmluZGV4IDBmZjQ5MmQuLjdkMDA1MWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9yY2FyL01ha2VmaWxlCisrKyBiL3NvdW5kL3NvYy9zaC9yY2FyL01ha2VmaWxlCkBAIC0xLDIgKzEsMiBAQAotc25kLXNvYy1yY2FyLW9ianMJOj0gY29yZS5vIGdlbi5vIHNjdS5vIGFkZy5vIHNzaS5vCitzbmQtc29jLXJjYXItb2Jqcwk6PSBjb3JlLm8gZ2VuLm8gc3JjLm8gYWRnLm8gc3NpLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1JDQVIpCSs9IHNuZC1zb2MtcmNhci5vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvYWRnLmMgYi9zb3VuZC9zb2Mvc2gvcmNhci9hZGcuYwppbmRleCBhNTMyMzVjLi42OWM0NDI2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvcmNhci9hZGcuYworKysgYi9zb3VuZC9zb2Mvc2gvcmNhci9hZGcuYwpAQCAtMjUsMTUgKzI1LDE2NSBAQAogfTsKIAogI2RlZmluZSBmb3JfZWFjaF9yc25kX2Nsayhwb3MsIGFkZywgaSkJCVwKLQlmb3IgKGkgPSAwLCAocG9zKSA9IGFkZy0+Y2xrW2ldOwlcCi0JICAgICBpIDwgQ0xLTUFYOwkJCVwKLQkgICAgIGkrKywgKHBvcykgPSBhZGctPmNsa1tpXSkKKwlmb3IgKGkgPSAwOwkJCQlcCisJICAgICAoaSA8IENMS01BWCkgJiYJCQlcCisJICAgICAoKHBvcykgPSBhZGctPmNsa1tpXSk7CQlcCisJICAgICBpKyspCiAjZGVmaW5lIHJzbmRfcHJpdl90b19hZGcocHJpdikgKChzdHJ1Y3QgcnNuZF9hZGcgKikocHJpdiktPmFkZykKIAotc3RhdGljIGludCByc25kX2FkZ19zZXRfY29udmVydF9jbGtfZ2VuMShzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAotCQkJCQkgc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCQkJCSB1bnNpZ25lZCBpbnQgc3JjX3JhdGUsCi0JCQkJCSB1bnNpZ25lZCBpbnQgZHN0X3JhdGUpCisKK3N0YXRpYyB1MzIgcnNuZF9hZGdfc3NpX3dzX3RpbWluZ19nZW4yKHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCXN0cnVjdCByc25kX21vZCAqbW9kID0gcnNuZF9pb190b19tb2Rfc3NpKGlvKTsKKwlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOworCWludCBpZCA9IHJzbmRfbW9kX2lkKG1vZCk7CisJaW50IHdzID0gaWQ7CisKKwlpZiAocnNuZF9zc2lfaXNfcGluX3NoYXJpbmcocnNuZF9zc2lfbW9kX2dldChwcml2LCBpZCkpKSB7CisJCXN3aXRjaCAoaWQpIHsKKwkJY2FzZSAxOgorCQljYXNlIDI6CisJCQl3cyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJd3MgPSAzOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCXdzID0gNzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuICgweDYgKyB3cykgPDwgODsKK30KKworc3RhdGljIGludCByc25kX2FkZ19zZXRfc3JjX3RpbXNlbF9nZW4yKHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCQkJc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkJCXN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvLAorCQkJCQl1MzIgdGltc2VsKQoreworCWludCBpc19wbGF5ID0gcnNuZF9kYWlfaXNfcGxheShyZGFpLCBpbyk7CisJaW50IGlkID0gcnNuZF9tb2RfaWQobW9kKTsKKwlpbnQgc2hpZnQgPSAoaWQgJSAyKSA/IDE2IDogMDsKKwl1MzIgbWFzaywgd3M7CisJdTMyIGluLCBvdXQ7CisKKwl3cyA9IHJzbmRfYWRnX3NzaV93c190aW1pbmdfZ2VuMihpbyk7CisKKwlpbiAgPSAoaXNfcGxheSkgPyB0aW1zZWwgOiB3czsKKwlvdXQgPSAoaXNfcGxheSkgPyB3cyAgICAgOiB0aW1zZWw7CisKKwlpbiAgID0gaW4JPDwgc2hpZnQ7CisJb3V0ICA9IG91dAk8PCBzaGlmdDsKKwltYXNrID0gMHhmZmZmCTw8IHNoaWZ0OworCisJc3dpdGNoIChpZCAvIDIpIHsKKwljYXNlIDA6CisJCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNJTl9USU1TRUwwLCAgbWFzaywgaW4pOworCQlyc25kX21vZF9ic2V0KG1vZCwgU1JDT1VUX1RJTVNFTDAsIG1hc2ssIG91dCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcnNuZF9tb2RfYnNldChtb2QsIFNSQ0lOX1RJTVNFTDEsICBtYXNrLCBpbik7CisJCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNPVVRfVElNU0VMMSwgbWFzaywgb3V0KTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlyc25kX21vZF9ic2V0KG1vZCwgU1JDSU5fVElNU0VMMiwgIG1hc2ssIGluKTsKKwkJcnNuZF9tb2RfYnNldChtb2QsIFNSQ09VVF9USU1TRUwyLCBtYXNrLCBvdXQpOworCQlicmVhazsKKwljYXNlIDM6CisJCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNJTl9USU1TRUwzLCAgbWFzaywgaW4pOworCQlyc25kX21vZF9ic2V0KG1vZCwgU1JDT1VUX1RJTVNFTDMsIG1hc2ssIG91dCk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJcnNuZF9tb2RfYnNldChtb2QsIFNSQ0lOX1RJTVNFTDQsICBtYXNrLCBpbik7CisJCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNPVVRfVElNU0VMNCwgbWFzaywgb3V0KTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCByc25kX2FkZ19zZXRfY29udmVydF9jbGtfZ2VuMihzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCQkgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCQkgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvLAorCQkJCSAgdW5zaWduZWQgaW50IHNyY19yYXRlLAorCQkJCSAgdW5zaWduZWQgaW50IGRzdF9yYXRlKQoreworCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7CisJc3RydWN0IHJzbmRfYWRnICphZGcgPSByc25kX3ByaXZfdG9fYWRnKHByaXYpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CisJaW50IGlkeCwgc2VsLCBkaXYsIHN0ZXAsIHJldDsKKwl1MzIgdmFsLCBlbjsKKwl1bnNpZ25lZCBpbnQgbWluLCBkaWZmOworCXVuc2lnbmVkIGludCBzZWxfcmF0ZSBbXSA9IHsKKwkJY2xrX2dldF9yYXRlKGFkZy0+Y2xrW0NMS0FdKSwJLyogMDAwMDogQ0xLQSAqLworCQljbGtfZ2V0X3JhdGUoYWRnLT5jbGtbQ0xLQl0pLAkvKiAwMDAxOiBDTEtCICovCisJCWNsa19nZXRfcmF0ZShhZGctPmNsa1tDTEtDXSksCS8qIDAwMTA6IENMS0MgKi8KKwkJYWRnLT5yYmdhX3JhdGVfZm9yXzQ0MWtoel9kaXZfNiwvKiAwMDExOiBSQkdBICovCisJCWFkZy0+cmJnYl9yYXRlX2Zvcl80OGtoel9kaXZfNiwJLyogMDEwMDogUkJHQiAqLworCX07CisKKwltaW4gPSB+MDsKKwl2YWwgPSAwOworCWVuID0gMDsKKwlmb3IgKHNlbCA9IDA7IHNlbCA8IEFSUkFZX1NJWkUoc2VsX3JhdGUpOyBzZWwrKykgeworCQlpZHggPSAwOworCQlzdGVwID0gMjsKKworCQlpZiAoIXNlbF9yYXRlW3NlbF0pCisJCQljb250aW51ZTsKKworCQlmb3IgKGRpdiA9IDI7IGRpdiA8PSA5ODMwNDsgZGl2ICs9IHN0ZXApIHsKKwkJCWRpZmYgPSBhYnMoc3JjX3JhdGUgLSBzZWxfcmF0ZVtzZWxdIC8gZGl2KTsKKwkJCWlmIChtaW4gPiBkaWZmKSB7CisJCQkJdmFsID0gKHNlbCA8PCA4KSB8IGlkeDsKKwkJCQltaW4gPSBkaWZmOworCQkJCWVuID0gMSA8PCAoc2VsICsgMSk7IC8qIGZpeG1lICovCisJCQl9CisKKwkJCS8qCisJCQkgKiBzdGVwIG9mIDBfMDAwMCAvIDBfMDAwMSAvIDBfMTEwMQorCQkJICogYXJlIG91dCBvZiBvcmRlcgorCQkJICovCisJCQlpZiAoKGlkeCA+IDIpICYmIChpZHggJSAyKSkKKwkJCQlzdGVwICo9IDI7CisJCQlpZiAoaWR4ID09IDB4MWMpIHsKKwkJCQlkaXYgKz0gc3RlcDsKKwkJCQlzdGVwICo9IDI7CisJCQl9CisJCQlpZHgrKzsKKwkJfQorCX0KKworCWlmIChtaW4gPT0gfjApIHsKKwkJZGV2X2VycihkZXYsICJubyBJbnB1dCBjbG9ja1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldCA9IHJzbmRfYWRnX3NldF9zcmNfdGltc2VsX2dlbjIocmRhaSwgbW9kLCBpbywgdmFsKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgInRpbXNlbCBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcnNuZF9tb2RfYnNldChtb2QsIERJVl9FTiwgZW4sIGVuKTsKKworCXJldHVybiAwOworfQorCitpbnQgcnNuZF9hZGdfc2V0X2NvbnZlcnRfdGltaW5nX2dlbjIoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkJICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkJICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwl1MzIgdmFsID0gcnNuZF9hZGdfc3NpX3dzX3RpbWluZ19nZW4yKGlvKTsKKworCXJldHVybiByc25kX2FkZ19zZXRfc3JjX3RpbXNlbF9nZW4yKHJkYWksIG1vZCwgaW8sIHZhbCk7Cit9CisKK2ludCByc25kX2FkZ19zZXRfY29udmVydF9jbGtfZ2VuMShzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAorCQkJCSAgc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkJICB1bnNpZ25lZCBpbnQgc3JjX3JhdGUsCisJCQkJICB1bnNpZ25lZCBpbnQgZHN0X3JhdGUpCiB7CiAJc3RydWN0IHJzbmRfYWRnICphZGcgPSByc25kX3ByaXZfdG9fYWRnKHByaXYpOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CkBAIC05MSwxOCArMjQxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHJzbmRfYWRnX3NldF9jb252ZXJ0X2NsayhzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAotCQkJICAgICBzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKLQkJCSAgICAgdW5zaWduZWQgaW50IHNyY19yYXRlLAotCQkJICAgICB1bnNpZ25lZCBpbnQgZHN0X3JhdGUpCi17Ci0JaWYgKHJzbmRfaXNfZ2VuMShwcml2KSkKLQkJcmV0dXJuIHJzbmRfYWRnX3NldF9jb252ZXJ0X2Nsa19nZW4xKHByaXYsIG1vZCwKLQkJCQkJCSAgICAgc3JjX3JhdGUsIGRzdF9yYXRlKTsKLQotCXJldHVybiAtRUlOVkFMOwotfQotCiBzdGF0aWMgdm9pZCByc25kX2FkZ19zZXRfc3NpX2NsayhzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwgdTMyIHZhbCkKIHsKIAlpbnQgaWQgPSByc25kX21vZF9pZChtb2QpOwpAQCAtMjU0LDEzICszOTIsMTQgQEAKIH0KIAogaW50IHJzbmRfYWRnX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgIHN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvLAorCQkgICBjb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhLAogCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KQogewogCXN0cnVjdCByc25kX2FkZyAqYWRnOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGsgKmNsaywgKmNsa19vcmlnOwogCWludCBpOworCWJvb2wgdXNlX29sZF9zdHlsZSA9IGZhbHNlOwogCiAJYWRnID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCphZGcpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFkZykgewpAQCAtMjY4LDEwICs0MDcsMzkgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JYWRnLT5jbGtbQ0xLQV0gPSBjbGtfZ2V0KE5VTEwsICJhdWRpb19jbGtfYSIpOwotCWFkZy0+Y2xrW0NMS0JdID0gY2xrX2dldChOVUxMLCAiYXVkaW9fY2xrX2IiKTsKLQlhZGctPmNsa1tDTEtDXSA9IGNsa19nZXQoTlVMTCwgImF1ZGlvX2Nsa19jIik7Ci0JYWRnLT5jbGtbQ0xLSV0gPSBjbGtfZ2V0KE5VTEwsICJhdWRpb19jbGtfaW50ZXJuYWwiKTsKKwljbGtfb3JpZwk9IGRldm1fY2xrX2dldChkZXYsIE5VTEwpOworCWFkZy0+Y2xrW0NMS0FdCT0gZGV2bV9jbGtfZ2V0KGRldiwgImNsa19hIik7CisJYWRnLT5jbGtbQ0xLQl0JPSBkZXZtX2Nsa19nZXQoZGV2LCAiY2xrX2IiKTsKKwlhZGctPmNsa1tDTEtDXQk9IGRldm1fY2xrX2dldChkZXYsICJjbGtfYyIpOworCWFkZy0+Y2xrW0NMS0ldCT0gZGV2bV9jbGtfZ2V0KGRldiwgImNsa19pIik7CisKKwkvKgorCSAqIEl0IHJlcXVlc3QgZGV2aWNlIGRlcGVuZGVudCBhdWRpbyBjbG9jay4KKwkgKiBCdXQgYWJvdmUgYWxsIGNsa3Mgd2lsbCBpbmRpY2F0ZSByc25kIG1vZHVsZSBjbG9jaworCSAqIGlmIHBsYXRmb3JtIGRvZXNuJ3QgaXQKKwkgKi8KKwlmb3JfZWFjaF9yc25kX2NsayhjbGssIGFkZywgaSkgeworCQlpZiAoY2xrX29yaWcgPT0gY2xrKSB7CisJCQlkZXZfd2FybihkZXYsCisJCQkJICJkb2Vzbid0IGhhdmUgZGV2aWNlIGRlcGVuZGVudCBjbG9jaywgdXNlIGluZGVwZW5kZW50IGNsb2NrXG4iKTsKKwkJCXVzZV9vbGRfc3R5bGUgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIG5vdGU6CisJICogdGhlc2UgZXhpc3QgaW4gb3JkZXIgdG8ga2VlcCBjb21wYXRpYmxlIHdpdGgKKwkgKiBwbGF0Zm9ybSB3aGljaCBoYXMgZGV2aWNlIGluZGVwZW5kZW50IGF1ZGlvIGNsb2NrLAorCSAqIGJ1dCB3aWxsIGJlIHJlbW92ZWQgc29vbgorCSAqLworCWlmICh1c2Vfb2xkX3N0eWxlKSB7CisJCWFkZy0+Y2xrW0NMS0FdID0gZGV2bV9jbGtfZ2V0KE5VTEwsICJhdWRpb19jbGtfYSIpOworCQlhZGctPmNsa1tDTEtCXSA9IGRldm1fY2xrX2dldChOVUxMLCAiYXVkaW9fY2xrX2IiKTsKKwkJYWRnLT5jbGtbQ0xLQ10gPSBkZXZtX2Nsa19nZXQoTlVMTCwgImF1ZGlvX2Nsa19jIik7CisJCWFkZy0+Y2xrW0NMS0ldID0gZGV2bV9jbGtfZ2V0KE5VTEwsICJhdWRpb19jbGtfaW50ZXJuYWwiKTsKKwl9CisKIAlmb3JfZWFjaF9yc25kX2NsayhjbGssIGFkZywgaSkgewogCQlpZiAoSVNfRVJSKGNsaykpIHsKIAkJCWRldl9lcnIoZGV2LCAiQXVkaW8gY2xvY2sgZmFpbGVkXG4iKTsKQEAgLTI4NywxNCArNDU1LDMgQEAKIAogCXJldHVybiAwOwogfQotCi12b2lkIHJzbmRfYWRnX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkgICAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IHJzbmRfYWRnICphZGcgPSBwcml2LT5hZGc7Ci0Jc3RydWN0IGNsayAqY2xrOwotCWludCBpOwotCi0JZm9yX2VhY2hfcnNuZF9jbGsoY2xrLCBhZGcsIGkpCi0JCWNsa19wdXQoY2xrKTsKLX0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9yY2FyL2NvcmUuYyBiL3NvdW5kL3NvYy9zaC9yY2FyL2NvcmUuYwppbmRleCA3NDNkZTVlLi4yMTViNjY4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvcmNhci9jb3JlLmMKKysrIGIvc291bmQvc29jL3NoL3JjYXIvY29yZS5jCkBAIC03MywxMyArNzMsMTMgQEAKICAqICAgfCAgKy0gc3NpWzJdCiAgKiAgIHwgIC4uLgogICogICB8Ci0gKiAgIHwgKiogdGhlc2UgY29udHJvbCBzY3UKKyAqICAgfCAqKiB0aGVzZSBjb250cm9sIHNyYwogICogICB8Ci0gKiAgICstIHNjdQorICogICArLSBzcmMKICAqICAgICAgfAotICogICAgICArLSBzY3VbMF0KLSAqICAgICAgKy0gc2N1WzFdCi0gKiAgICAgICstIHNjdVsyXQorICogICAgICArLSBzcmNbMF0KKyAqICAgICAgKy0gc3JjWzFdCisgKiAgICAgICstIHNyY1syXQogICogICAgICAuLi4KICAqCiAgKgpAQCAtMTAwLDYgKzEwMCwyMSBAQAogI2RlZmluZSBSU05EX1JBVEVTIFNORFJWX1BDTV9SQVRFXzgwMDBfOTYwMDAKICNkZWZpbmUgUlNORF9GTVRTIChTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFKQogCitzdGF0aWMgc3RydWN0IHJzbmRfb2ZfZGF0YSByc25kX29mX2RhdGFfZ2VuMSA9IHsKKwkuZmxhZ3MgPSBSU05EX0dFTjEsCit9OworCitzdGF0aWMgc3RydWN0IHJzbmRfb2ZfZGF0YSByc25kX29mX2RhdGFfZ2VuMiA9IHsKKwkuZmxhZ3MgPSBSU05EX0dFTjIsCit9OworCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCByc25kX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHJjYXJfc291bmQtZ2VuMSIsIC5kYXRhID0gJnJzbmRfb2ZfZGF0YV9nZW4xIH0sCisJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHJjYXJfc291bmQtZ2VuMiIsIC5kYXRhID0gJnJzbmRfb2ZfZGF0YV9nZW4yIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcnNuZF9vZl9tYXRjaCk7CisKIC8qCiAgKglyc25kX3BsYXRmb3JtIGZ1bmN0aW9ucwogICovCkBAIC0xMDcsNiArMTIyLDExIEBACiAJKCEocHJpdi0+aW5mby0+ZnVuYykgPyAwIDoJCVwKIAkgcHJpdi0+aW5mby0+ZnVuYyhwYXJhbSkpCiAKKyNkZWZpbmUgcnNuZF9pc19lbmFibGVfcGF0aChpbywgbmFtZSkgXAorCSgoaW8pLT5pbmZvID8gKGlvKS0+aW5mby0+bmFtZSA6IE5VTEwpCisjZGVmaW5lIHJzbmRfaW5mb19pZChwcml2LCBpbywgbmFtZSkgXAorCSgoaW8pLT5pbmZvLT5uYW1lIC0gcHJpdi0+aW5mby0+bmFtZSMjX2luZm8pCisKIC8qCiAgKglyc25kX21vZCBmdW5jdGlvbnMKICAqLwpAQCAtMTIxLDE3ICsxNDEsMTkgQEAKIHZvaWQgcnNuZF9tb2RfaW5pdChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAogCQkgICBzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKIAkJICAgc3RydWN0IHJzbmRfbW9kX29wcyAqb3BzLAorCQkgICBlbnVtIHJzbmRfbW9kX3R5cGUgdHlwZSwKIAkJICAgaW50IGlkKQogewogCW1vZC0+cHJpdgk9IHByaXY7CiAJbW9kLT5pZAkJPSBpZDsKIAltb2QtPm9wcwk9IG9wczsKLQlJTklUX0xJU1RfSEVBRCgmbW9kLT5saXN0KTsKKwltb2QtPnR5cGUJPSB0eXBlOwogfQogCiAvKgogICoJcnNuZF9kbWEgZnVuY3Rpb25zCiAgKi8KK3N0YXRpYyB2b2lkIF9fcnNuZF9kbWFfc3RhcnQoc3RydWN0IHJzbmRfZG1hICpkbWEpOwogc3RhdGljIHZvaWQgcnNuZF9kbWFfY29udGludWUoc3RydWN0IHJzbmRfZG1hICpkbWEpCiB7CiAJLyogcHVzaCBuZXh0IEEgb3IgQiBwbGFuZSAqLwpAQCAtMTQyLDggKzE2NCw5IEBACiB2b2lkIHJzbmRfZG1hX3N0YXJ0KHN0cnVjdCByc25kX2RtYSAqZG1hKQogewogCS8qIHB1c2ggYm90aCBBIGFuZCBCIHBsYW5lKi8KKwlkbWEtPm9mZnNldCA9IDA7CiAJZG1hLT5zdWJtaXRfbG9vcCA9IDI7Ci0Jc2NoZWR1bGVfd29yaygmZG1hLT53b3JrKTsKKwlfX3JzbmRfZG1hX3N0YXJ0KGRtYSk7CiB9CiAKIHZvaWQgcnNuZF9kbWFfc3RvcChzdHJ1Y3QgcnNuZF9kbWEgKmRtYSkKQEAgLTE1NiwxMiArMTc5LDI2IEBACiBzdGF0aWMgdm9pZCByc25kX2RtYV9jb21wbGV0ZSh2b2lkICpkYXRhKQogewogCXN0cnVjdCByc25kX2RtYSAqZG1hID0gKHN0cnVjdCByc25kX2RtYSAqKWRhdGE7Ci0Jc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IGRtYS0+cHJpdjsKKwlzdHJ1Y3QgcnNuZF9tb2QgKm1vZCA9IHJzbmRfZG1hX3RvX21vZChkbWEpOworCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KHJzbmRfZG1hX3RvX21vZChkbWEpKTsKKwlzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyA9IHJzbmRfbW9kX3RvX2lvKG1vZCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXJzbmRfbG9jayhwcml2LCBmbGFncyk7CiAKLQlkbWEtPmNvbXBsZXRlKGRtYSk7CisJLyoKKwkgKiBSZW5lc2FzIHNvdW5kIEdlbjEgbmVlZHMgMSBETUFDLAorCSAqIEdlbjIgbmVlZHMgMiBETUFDLgorCSAqIEluIEdlbjIgY2FzZSwgaXQgYXJlIEF1ZGlvLURNQUMsIGFuZCBBdWRpby1ETUFDLXBlcmktcGVyaS4KKwkgKiBCdXQsIEF1ZGlvLURNQUMtcGVyaS1wZXJpIGRvZXNuJ3QgaGF2ZSBpbnRlcnJ1cHQsCisJICogYW5kIHRoaXMgZHJpdmVyIGlzIGFzc3VtaW5nIHRoYXQgaGVyZS4KKwkgKgorCSAqIElmIEF1ZGlvLURNQUMtcGVyaS1wZXJpIGhhcyBpbnRlcnJwdCwKKwkgKiByc25kX2RhaV9wb2ludGVyX3VwZGF0ZSgpIHdpbGwgYmUgY2FsbGVkIHR3aWNlLAorCSAqIGFudCBpdCB3aWxsIGJyZWFrcyBpby0+Ynl0ZV9wb3MKKwkgKi8KKworCXJzbmRfZGFpX3BvaW50ZXJfdXBkYXRlKGlvLCBpby0+Ynl0ZV9wZXJfcGVyaW9kKTsKIAogCWlmIChkbWEtPnN1Ym1pdF9sb29wKQogCQlyc25kX2RtYV9jb250aW51ZShkbWEpOwpAQCAtMTY5LDIwICsyMDYsMjMgQEAKIAlyc25kX3VubG9jayhwcml2LCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIHJzbmRfZG1hX2RvX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgX19yc25kX2RtYV9zdGFydChzdHJ1Y3QgcnNuZF9kbWEgKmRtYSkKIHsKLQlzdHJ1Y3QgcnNuZF9kbWEgKmRtYSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnNuZF9kbWEsIHdvcmspOwotCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSBkbWEtPnByaXY7CisJc3RydWN0IHJzbmRfbW9kICptb2QgPSByc25kX2RtYV90b19tb2QoZG1hKTsKKwlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOworCXN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvID0gcnNuZF9tb2RfdG9faW8obW9kKTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gcnNuZF9pb190b19ydW50aW1lKGlvKTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc25kX3ByaXZfdG9fZGV2KHByaXYpOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYzsKIAlkbWFfYWRkcl90IGJ1ZjsKLQlzaXplX3QgbGVuOworCXNpemVfdCBsZW4gPSBpby0+Ynl0ZV9wZXJfcGVyaW9kOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGRtYS0+c3VibWl0X2xvb3A7IGkrKykgewogCi0JCWlmIChkbWEtPmlucXVpcnkoZG1hLCAmYnVmLCAmbGVuKSA8IDApCi0JCQlyZXR1cm47CisJCWJ1ZiA9IHJ1bnRpbWUtPmRtYV9hZGRyICsKKwkJCXJzbmRfZGFpX3BvaW50ZXJfb2Zmc2V0KGlvLCBkbWEtPm9mZnNldCArIGxlbik7CisJCWRtYS0+b2Zmc2V0ID0gbGVuOwogCiAJCWRlc2MgPSBkbWFlbmdpbmVfcHJlcF9zbGF2ZV9zaW5nbGUoCiAJCQlkbWEtPmNoYW4sIGJ1ZiwgbGVuLCBkbWEtPmRpciwKQEAgLTIwNCwxNiArMjQ0LDIwIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCByc25kX2RtYV9kb193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcnNuZF9kbWEgKmRtYSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnNuZF9kbWEsIHdvcmspOworCisJX19yc25kX2RtYV9zdGFydChkbWEpOworfQorCiBpbnQgcnNuZF9kbWFfYXZhaWxhYmxlKHN0cnVjdCByc25kX2RtYSAqZG1hKQogewogCXJldHVybiAhIWRtYS0+Y2hhbjsKIH0KIAogaW50IHJzbmRfZG1hX2luaXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwgc3RydWN0IHJzbmRfZG1hICpkbWEsCi0JCSAgaW50IGlzX3BsYXksIGludCBpZCwKLQkJICBpbnQgKCppbnF1aXJ5KShzdHJ1Y3QgcnNuZF9kbWEgKmRtYSwKLQkJCQkgIGRtYV9hZGRyX3QgKmJ1ZiwgaW50ICpsZW4pLAotCQkgIGludCAoKmNvbXBsZXRlKShzdHJ1Y3QgcnNuZF9kbWEgKmRtYSkpCisJCSAgaW50IGlzX3BsYXksIGludCBpZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc25kX3ByaXZfdG9fZGV2KHByaXYpOwogCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGNmZzsKQEAgLTI0Niw5ICsyOTAsNiBAQAogCQlnb3RvIHJzbmRfZG1hX2luaXRfZXJyOwogCiAJZG1hLT5kaXIgPSBpc19wbGF5ID8gRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRTsKLQlkbWEtPnByaXYgPSBwcml2OwotCWRtYS0+aW5xdWlyeSA9IGlucXVpcnk7Ci0JZG1hLT5jb21wbGV0ZSA9IGNvbXBsZXRlOwogCUlOSVRfV09SSygmZG1hLT53b3JrLCByc25kX2RtYV9kb193b3JrKTsKIAogCXJldHVybiAwOwpAQCAtMjcxLDI2ICszMTIsNDIgQEAKIC8qCiAgKglyc25kX2RhaSBmdW5jdGlvbnMKICAqLwotI2RlZmluZSByc25kX2RhaV9jYWxsKHJkYWksIGlvLCBmbikJCQlcCi0oewkJCQkJCQlcCi0Jc3RydWN0IHJzbmRfbW9kICptb2QsICpuOwkJCVwKLQlpbnQgcmV0ID0gMDsJCQkJCVwKLQlmb3JfZWFjaF9yc25kX21vZChtb2QsIG4sIGlvKSB7CQkJXAotCQlyZXQgPSByc25kX21vZF9jYWxsKG1vZCwgZm4sIHJkYWksIGlvKTsJXAotCQlpZiAocmV0IDwgMCkJCQkJXAotCQkJYnJlYWs7CQkJCVwKLQl9CQkJCQkJXAotCXJldDsJCQkJCQlcCisjZGVmaW5lIF9fcnNuZF9tb2RfY2FsbChtb2QsIGZ1bmMsIHJkYWksIGlvKQkJCVwKKyh7CQkJCQkJCQlcCisJc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IHJzbmRfbW9kX3RvX3ByaXYobW9kKTsJCVwKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc25kX3ByaXZfdG9fZGV2KHByaXYpOwkJXAorCWRldl9kYmcoZGV2LCAiJXMgWyVkXSAlc1xuIiwJCQkJXAorCQlyc25kX21vZF9uYW1lKG1vZCksIHJzbmRfbW9kX2lkKG1vZCksICNmdW5jKTsJXAorCShtb2QpLT5vcHMtPmZ1bmMobW9kLCByZGFpLCBpbyk7CQkJXAogfSkKIAotaW50IHJzbmRfZGFpX2Nvbm5lY3Qoc3RydWN0IHJzbmRfZGFpICpyZGFpLAotCQkgICAgIHN0cnVjdCByc25kX21vZCAqbW9kLAotCQkgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQorI2RlZmluZSByc25kX21vZF9jYWxsKG1vZCwgZnVuYywgcmRhaSwgaW8pCVwKKwkoIShtb2QpID8gLUVOT0RFViA6CQkJXAorCSAhKChtb2QpLT5vcHMtPmZ1bmMpID8gMCA6CQlcCisJIF9fcnNuZF9tb2RfY2FsbChtb2QsIGZ1bmMsIChyZGFpKSwgKGlvKSkpCisKKyNkZWZpbmUgcnNuZF9kYWlfY2FsbChyZGFpLCBpbywgZm4pCQkJCVwKKyh7CQkJCQkJCQlcCisJc3RydWN0IHJzbmRfbW9kICptb2Q7CQkJCQlcCisJaW50IHJldCA9IDAsIGk7CQkJCQkJXAorCWZvciAoaSA9IDA7IGkgPCBSU05EX01PRF9NQVg7IGkrKykgewkJCVwKKwkJbW9kID0gKGlvKS0+bW9kW2ldOwkJCQlcCisJCWlmICghbW9kKQkJCQkJXAorCQkJY29udGludWU7CQkJCVwKKwkJcmV0ID0gcnNuZF9tb2RfY2FsbChtb2QsIGZuLCAocmRhaSksIChpbykpOwlcCisJCWlmIChyZXQgPCAwKQkJCQkJXAorCQkJYnJlYWs7CQkJCQlcCisJfQkJCQkJCQlcCisJcmV0OwkJCQkJCQlcCit9KQorCitzdGF0aWMgaW50IHJzbmRfZGFpX2Nvbm5lY3Qoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCiB7CiAJaWYgKCFtb2QpCiAJCXJldHVybiAtRUlPOwogCi0JaWYgKCFsaXN0X2VtcHR5KCZtb2QtPmxpc3QpKSB7CisJaWYgKGlvLT5tb2RbbW9kLT50eXBlXSkgewogCQlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOwogCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc25kX3ByaXZfdG9fZGV2KHByaXYpOwogCkBAIC0zMDAsMTQgKzM1Nyw4IEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCWxpc3RfYWRkX3RhaWwoJm1vZC0+bGlzdCwgJmlvLT5oZWFkKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgcnNuZF9kYWlfZGlzY29ubmVjdChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCkKLXsKLQlsaXN0X2RlbF9pbml0KCZtb2QtPmxpc3QpOworCWlvLT5tb2RbbW9kLT50eXBlXSA9IG1vZDsKKwltb2QtPmlvID0gaW87CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMxNiw3ICszNjcsNyBAQAogewogCWludCBpZCA9IHJkYWkgLSBwcml2LT5yZGFpOwogCi0JaWYgKChpZCA8IDApIHx8IChpZCA+PSByc25kX2RhaV9ucihwcml2KSkpCisJaWYgKChpZCA8IDApIHx8IChpZCA+PSByc25kX3JkYWlfbnIocHJpdikpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiBpZDsKQEAgLTMyNCw3ICszNzUsNyBAQAogCiBzdHJ1Y3QgcnNuZF9kYWkgKnJzbmRfZGFpX2dldChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LCBpbnQgaWQpCiB7Ci0JaWYgKChpZCA8IDApIHx8IChpZCA+PSByc25kX2RhaV9ucihwcml2KSkpCisJaWYgKChpZCA8IDApIHx8IChpZCA+PSByc25kX3JkYWlfbnIocHJpdikpKQogCQlyZXR1cm4gTlVMTDsKIAogCXJldHVybiBwcml2LT5yZGFpICsgaWQ7CkBAIC0zODIsMTAgKzQzMyw2IEBACiB7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAotCWlmICghbGlzdF9lbXB0eSgmaW8tPmhlYWQpKQotCQlyZXR1cm4gLUVJTzsKLQotCUlOSVRfTElTVF9IRUFEKCZpby0+aGVhZCk7CiAJaW8tPnN1YnN0cmVhbQkJPSBzdWJzdHJlYW07CiAJaW8tPmJ5dGVfcG9zCQk9IDA7CiAJaW8tPnBlcmlvZF9wb3MJCT0gMDsKQEAgLTQ0MCwxMCArNDg3LDYgQEAKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIGRhaV90cmlnZ2VyX2VuZDsKIAotCQlyZXQgPSByc25kX2dlbl9wYXRoX2luaXQocHJpdiwgcmRhaSwgaW8pOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZGFpX3RyaWdnZXJfZW5kOwotCiAJCXJldCA9IHJzbmRfZGFpX2NhbGwocmRhaSwgaW8sIGluaXQpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZGFpX3RyaWdnZXJfZW5kOwpAQCAtNDYxLDEwICs1MDQsNiBAQAogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZGFpX3RyaWdnZXJfZW5kOwogCi0JCXJldCA9IHJzbmRfZ2VuX3BhdGhfZXhpdChwcml2LCByZGFpLCBpbyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBkYWlfdHJpZ2dlcl9lbmQ7Ci0KIAkJcmV0ID0gcnNuZF9wbGF0Zm9ybV9jYWxsKHByaXYsIGRhaSwgc3RvcCwgc3NpX2lkKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIGRhaV90cmlnZ2VyX2VuZDsKQEAgLTQ4NiwxMCArNTI1LDEwIEBACiAJLyogc2V0IG1hc3Rlci9zbGF2ZSBhdWRpbyBpbnRlcmZhY2UgKi8KIAlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgotCQlyZGFpLT5jbGtfbWFzdGVyID0gMTsKKwkJcmRhaS0+Y2xrX21hc3RlciA9IDA7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKLQkJcmRhaS0+Y2xrX21hc3RlciA9IDA7CisJCXJkYWktPmNsa19tYXN0ZXIgPSAxOyAvKiBjb2RlYyBpcyBzbGF2ZSwgY3B1IGlzIG1hc3RlciAqLwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTU0MCwyNCArNTc5LDE3NCBAQAogCS5zZXRfZm10CT0gcnNuZF9zb2NfZGFpX3NldF9mbXQsCiB9OwogCitzdGF0aWMgaW50IHJzbmRfcGF0aF9pbml0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsCisJCQkgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHJzbmRfbW9kICptb2Q7CisJc3RydWN0IHJzbmRfZGFpX3BsYXRmb3JtX2luZm8gKmRhaV9pbmZvID0gcmRhaS0+aW5mbzsKKwlpbnQgcmV0OworCWludCBzc2lfaWQgPSAtMTsKKwlpbnQgc3JjX2lkID0gLTE7CisKKwkvKgorCSAqIEdlbjEgaXMgY3JlYXRlZCBieSBTUlUvU1NJLCBhbmQgdGhpcyBTUlUgaXMgYmFzZSBtb2R1bGUgb2YKKwkgKiBHZW4yJ3MgU0NVL1NTSVUvU1NJLiAoR2VuMiBTQ1UvU1NJVSBjYW1lIGZyb20gU1JVKQorCSAqCisJICogRWFzeSBpbWFnZSBpcy4uCisJICoJR2VuMSBTUlUgPSBHZW4yIFNDVSArIFNTSVUgKyBldGMKKwkgKgorCSAqIEdlbjIgU0NVIHBhdGggaXMgdmVyeSBmbGV4aWJsZSwgYnV0LCBHZW4xIFNSVSAoU0NVIHBhcnRzKSBpcworCSAqIHVzaW5nIGZpeGVkIHBhdGguCisJICovCisJaWYgKGRhaV9pbmZvKSB7CisJCWlmIChyc25kX2lzX2VuYWJsZV9wYXRoKGlvLCBzc2kpKQorCQkJc3NpX2lkID0gcnNuZF9pbmZvX2lkKHByaXYsIGlvLCBzc2kpOworCQlpZiAocnNuZF9pc19lbmFibGVfcGF0aChpbywgc3JjKSkKKwkJCXNyY19pZCA9IHJzbmRfaW5mb19pZChwcml2LCBpbywgc3JjKTsKKwl9IGVsc2UgeworCQkvKiBnZXQgU1NJJ3MgSUQgKi8KKwkJbW9kID0gcnNuZF9zc2lfbW9kX2dldF9mcm1fZGFpKHByaXYsCisJCQkJCSAgICAgICByc25kX2RhaV9pZChwcml2LCByZGFpKSwKKwkJCQkJICAgICAgIHJzbmRfZGFpX2lzX3BsYXkocmRhaSwgaW8pKTsKKwkJaWYgKCFtb2QpCisJCQlyZXR1cm4gMDsKKwkJc3NpX2lkID0gc3JjX2lkID0gcnNuZF9tb2RfaWQobW9kKTsKKwl9CisKKwlyZXQgPSAwOworCisJLyogU1JDICovCisJaWYgKHNyY19pZCA+PSAwKSB7CisJCW1vZCA9IHJzbmRfc3JjX21vZF9nZXQocHJpdiwgc3JjX2lkKTsKKwkJcmV0ID0gcnNuZF9kYWlfY29ubmVjdChtb2QsIGlvKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFNTSSAqLworCWlmIChzc2lfaWQgPj0gMCkgeworCQltb2QgPSByc25kX3NzaV9tb2RfZ2V0KHByaXYsIHNzaV9pZCk7CisJCXJldCA9IHJzbmRfZGFpX2Nvbm5lY3QobW9kLCBpbyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCByc25kX29mX3BhcnNlX2RhaShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHJzbmRfb2ZfZGF0YSAqb2ZfZGF0YSwKKwkJCSAgICAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkYWlfbm9kZSwJKmRhaV9ucDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnNzaV9ub2RlLAkqc3NpX25wOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc3JjX25vZGUsCSpzcmNfbnA7CisJc3RydWN0IGRldmljZV9ub2RlICpwbGF5YmFjaywgKmNhcHR1cmU7CisJc3RydWN0IHJzbmRfZGFpX3BsYXRmb3JtX2luZm8gKmRhaV9pbmZvOworCXN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvID0gcnNuZF9wcml2X3RvX2luZm8ocHJpdik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlpbnQgbnIsIGk7CisJaW50IGRhaV9pLCBzc2lfaSwgc3JjX2k7CisKKwlpZiAoIW9mX2RhdGEpCisJCXJldHVybjsKKworCWRhaV9ub2RlID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUoZGV2LT5vZl9ub2RlLCAicmNhcl9zb3VuZCxkYWkiKTsKKwlpZiAoIWRhaV9ub2RlKQorCQlyZXR1cm47CisKKwluciA9IG9mX2dldF9jaGlsZF9jb3VudChkYWlfbm9kZSk7CisJaWYgKCFucikKKwkJcmV0dXJuOworCisJZGFpX2luZm8gPSBkZXZtX2t6YWxsb2MoZGV2LAorCQkJCXNpemVvZihzdHJ1Y3QgcnNuZF9kYWlfcGxhdGZvcm1faW5mbykgKiBuciwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWRhaV9pbmZvKSB7CisJCWRldl9lcnIoZGV2LCAiZGFpIGluZm8gYWxsb2NhdGlvbiBlcnJvclxuIik7CisJCXJldHVybjsKKwl9CisKKwlpbmZvLT5kYWlfaW5mb19ucgk9IG5yOworCWluZm8tPmRhaV9pbmZvCQk9IGRhaV9pbmZvOworCisJc3NpX25vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShkZXYtPm9mX25vZGUsICJyY2FyX3NvdW5kLHNzaSIpOworCXNyY19ub2RlID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUoZGV2LT5vZl9ub2RlLCAicmNhcl9zb3VuZCxzcmMiKTsKKworI2RlZmluZSBtb2RfcGFyc2UobmFtZSkJCQkJCQkJXAoraWYgKG5hbWUjI19ub2RlKSB7CQkJCQkJCVwKKwlzdHJ1Y3QgcnNuZF8jI25hbWUjI19wbGF0Zm9ybV9pbmZvICpuYW1lIyNfaW5mbzsJCVwKKwkJCQkJCQkJCVwKKwluYW1lIyNfaSA9IDA7CQkJCQkJCVwKKwlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG5hbWUjI19ub2RlLCBuYW1lIyNfbnApIHsJCVwKKwkJbmFtZSMjX2luZm8gPSBpbmZvLT5uYW1lIyNfaW5mbyArIG5hbWUjI19pOwkJXAorCQkJCQkJCQkJXAorCQlpZiAobmFtZSMjX25wID09IHBsYXliYWNrKQkJCQlcCisJCQlkYWlfaW5mby0+cGxheWJhY2submFtZSA9IG5hbWUjI19pbmZvOwkJXAorCQlpZiAobmFtZSMjX25wID09IGNhcHR1cmUpCQkJCVwKKwkJCWRhaV9pbmZvLT5jYXB0dXJlLm5hbWUgPSBuYW1lIyNfaW5mbzsJCVwKKwkJCQkJCQkJCVwKKwkJbmFtZSMjX2krKzsJCQkJCQlcCisJfQkJCQkJCQkJXAorfQorCisJLyoKKwkgKiBwYXJzZSBhbGwgZGFpCisJICovCisJZGFpX2kgPSAwOworCWZvcl9lYWNoX2NoaWxkX29mX25vZGUoZGFpX25vZGUsIGRhaV9ucCkgeworCQlkYWlfaW5mbyA9IGluZm8tPmRhaV9pbmZvICsgZGFpX2k7CisKKwkJZm9yIChpID0gMDs7IGkrKykgeworCisJCQlwbGF5YmFjayA9IG9mX3BhcnNlX3BoYW5kbGUoZGFpX25wLCAicGxheWJhY2siLCBpKTsKKwkJCWNhcHR1cmUgID0gb2ZfcGFyc2VfcGhhbmRsZShkYWlfbnAsICJjYXB0dXJlIiwgaSk7CisKKwkJCWlmICghcGxheWJhY2sgJiYgIWNhcHR1cmUpCisJCQkJYnJlYWs7CisKKwkJCW1vZF9wYXJzZShzc2kpOworCQkJbW9kX3BhcnNlKHNyYyk7CisKKwkJCWlmIChwbGF5YmFjaykKKwkJCQlvZl9ub2RlX3B1dChwbGF5YmFjayk7CisJCQlpZiAoY2FwdHVyZSkKKwkJCQlvZl9ub2RlX3B1dChjYXB0dXJlKTsKKwkJfQorCisJCWRhaV9pKys7CisJfQorfQorCiBzdGF0aWMgaW50IHJzbmRfZGFpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCQkgIHN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvLAorCQkJICBjb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhLAogCQkJICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KQogewogCXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRydjsKKwlzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbyA9IHJzbmRfcHJpdl90b19pbmZvKHByaXYpOwogCXN0cnVjdCByc25kX2RhaSAqcmRhaTsKIAlzdHJ1Y3QgcnNuZF9tb2QgKnBtb2QsICpjbW9kOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CiAJaW50IGRhaV9ucjsKIAlpbnQgaTsKIAotCS8qIGdldCBtYXggZGFpIG5yICovCi0JZm9yIChkYWlfbnIgPSAwOyBkYWlfbnIgPCAzMjsgZGFpX25yKyspIHsKLQkJcG1vZCA9IHJzbmRfc3NpX21vZF9nZXRfZnJtX2RhaShwcml2LCBkYWlfbnIsIDEpOwotCQljbW9kID0gcnNuZF9zc2lfbW9kX2dldF9mcm1fZGFpKHByaXYsIGRhaV9uciwgMCk7CisJcnNuZF9vZl9wYXJzZV9kYWkocGRldiwgb2ZfZGF0YSwgcHJpdik7CiAKLQkJaWYgKCFwbW9kICYmICFjbW9kKQotCQkJYnJlYWs7CisJLyoKKwkgKiBkYWlfbnIgc2hvdWxkIGJlIHNldCB2aWEgZGFpX2luZm9fbnIsCisJICogYnV0IGFsbG93IGl0IHRvIGtlZXBpbmcgY29tcGF0aWJsZQorCSAqLworCWRhaV9uciA9IGluZm8tPmRhaV9pbmZvX25yOworCWlmICghZGFpX25yKSB7CisJCS8qIGdldCBtYXggZGFpIG5yICovCisJCWZvciAoZGFpX25yID0gMDsgZGFpX25yIDwgMzI7IGRhaV9ucisrKSB7CisJCQlwbW9kID0gcnNuZF9zc2lfbW9kX2dldF9mcm1fZGFpKHByaXYsIGRhaV9uciwgMSk7CisJCQljbW9kID0gcnNuZF9zc2lfbW9kX2dldF9mcm1fZGFpKHByaXYsIGRhaV9uciwgMCk7CisKKwkJCWlmICghcG1vZCAmJiAhY21vZCkKKwkJCQlicmVhazsKKwkJfQogCX0KIAogCWlmICghZGFpX25yKSB7CkBAIC01NzIsNyArNzYxLDEzIEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCXByaXYtPnJkYWlfbnIJPSBkYWlfbnI7CisJcHJpdi0+ZGFpZHJ2CT0gZHJ2OworCXByaXYtPnJkYWkJPSByZGFpOworCiAJZm9yIChpID0gMDsgaSA8IGRhaV9ucjsgaSsrKSB7CisJCWlmIChpbmZvLT5kYWlfaW5mbykKKwkJCXJkYWlbaV0uaW5mbyA9ICZpbmZvLT5kYWlfaW5mb1tpXTsKIAogCQlwbW9kID0gcnNuZF9zc2lfbW9kX2dldF9mcm1fZGFpKHByaXYsIGksIDEpOwogCQljbW9kID0gcnNuZF9zc2lfbW9kX2dldF9mcm1fZGFpKHByaXYsIGksIDApOwpAQCAtNTgwLDkgKzc3NSw2IEBACiAJCS8qCiAJCSAqCWluaXQgcnNuZF9kYWkKIAkJICovCi0JCUlOSVRfTElTVF9IRUFEKCZyZGFpW2ldLnBsYXliYWNrLmhlYWQpOwotCQlJTklUX0xJU1RfSEVBRCgmcmRhaVtpXS5jYXB0dXJlLmhlYWQpOwotCiAJCXNucHJpbnRmKHJkYWlbaV0ubmFtZSwgUlNORF9EQUlfTkFNRV9TSVpFLCAicnNuZC1kYWkuJWQiLCBpKTsKIAogCQkvKgpAQCAtNTk1LDEyICs3ODcsMjAgQEAKIAkJCWRydltpXS5wbGF5YmFjay5mb3JtYXRzCQk9IFJTTkRfRk1UUzsKIAkJCWRydltpXS5wbGF5YmFjay5jaGFubmVsc19taW4JPSAyOwogCQkJZHJ2W2ldLnBsYXliYWNrLmNoYW5uZWxzX21heAk9IDI7CisKKwkJCWlmIChpbmZvLT5kYWlfaW5mbykKKwkJCQlyZGFpW2ldLnBsYXliYWNrLmluZm8gPSAmaW5mby0+ZGFpX2luZm9baV0ucGxheWJhY2s7CisJCQlyc25kX3BhdGhfaW5pdChwcml2LCAmcmRhaVtpXSwgJnJkYWlbaV0ucGxheWJhY2spOwogCQl9CiAJCWlmIChjbW9kKSB7CiAJCQlkcnZbaV0uY2FwdHVyZS5yYXRlcwkJPSBSU05EX1JBVEVTOwogCQkJZHJ2W2ldLmNhcHR1cmUuZm9ybWF0cwkJPSBSU05EX0ZNVFM7CiAJCQlkcnZbaV0uY2FwdHVyZS5jaGFubmVsc19taW4JPSAyOwogCQkJZHJ2W2ldLmNhcHR1cmUuY2hhbm5lbHNfbWF4CT0gMjsKKworCQkJaWYgKGluZm8tPmRhaV9pbmZvKQorCQkJCXJkYWlbaV0uY2FwdHVyZS5pbmZvID0gJmluZm8tPmRhaV9pbmZvW2ldLmNhcHR1cmU7CisJCQlyc25kX3BhdGhfaW5pdChwcml2LCAmcmRhaVtpXSwgJnJkYWlbaV0uY2FwdHVyZSk7CiAJCX0KIAogCQlkZXZfZGJnKGRldiwgIiVzICglcy8lcylcbiIsIHJkYWlbaV0ubmFtZSwKQEAgLTYwOCwxOCArODA4LDkgQEAKIAkJCWNtb2QgPyAiY2FwdHVyZSIgOiAiICAtLSAgICIpOwogCX0KIAotCXByaXYtPmRhaV9ucgk9IGRhaV9ucjsKLQlwcml2LT5kYWlkcnYJPSBkcnY7Ci0JcHJpdi0+cmRhaQk9IHJkYWk7Ci0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcnNuZF9kYWlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCQkgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCi17Ci19Ci0KIC8qCiAgKgkJcGNtIG9wcwogICovCkBAIC03MTMsOSArOTA0LDMwIEBACiAJc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm87CiAJc3RydWN0IHJzbmRfcHJpdiAqcHJpdjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCWludCByZXQ7CisJc3RydWN0IHJzbmRfZGFpICpyZGFpOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKHJzbmRfb2ZfbWF0Y2gsIGRldik7CisJY29uc3Qgc3RydWN0IHJzbmRfb2ZfZGF0YSAqb2ZfZGF0YTsKKwlpbnQgKCpwcm9iZV9mdW5jW10pKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkgICAgY29uc3Qgc3RydWN0IHJzbmRfb2ZfZGF0YSAqb2ZfZGF0YSwKKwkJCSAgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KSA9IHsKKwkJcnNuZF9nZW5fcHJvYmUsCisJCXJzbmRfc3NpX3Byb2JlLAorCQlyc25kX3NyY19wcm9iZSwKKwkJcnNuZF9hZGdfcHJvYmUsCisJCXJzbmRfZGFpX3Byb2JlLAorCX07CisJaW50IHJldCwgaTsKIAotCWluZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbmZvID0gTlVMTDsKKwlvZl9kYXRhID0gTlVMTDsKKwlpZiAob2ZfaWQpIHsKKwkJaW5mbyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHJjYXJfc25kX2luZm8pLCBHRlBfS0VSTkVMKTsKKwkJb2ZfZGF0YSA9IG9mX2lkLT5kYXRhOworCX0gZWxzZSB7CisJCWluZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwl9CisKIAlpZiAoIWluZm8pIHsKIAkJZGV2X2VycihkZXYsICJkcml2ZXIgbmVlZHMgUi1DYXIgc291bmQgaW5mb3JtYXRpb25cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTczNywyNSArOTQ5LDIxIEBACiAJLyoKIAkgKglpbml0IGVhY2ggbW9kdWxlCiAJICovCi0JcmV0ID0gcnNuZF9nZW5fcHJvYmUocGRldiwgaW5mbywgcHJpdik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHJvYmVfZnVuYyk7IGkrKykgeworCQlyZXQgPSBwcm9iZV9mdW5jW2ldKHBkZXYsIG9mX2RhdGEsIHByaXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CiAKLQlyZXQgPSByc25kX3NjdV9wcm9iZShwZGV2LCBpbmZvLCBwcml2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwlmb3JfZWFjaF9yc25kX2RhaShyZGFpLCBwcml2LCBpKSB7CisJCXJldCA9IHJzbmRfZGFpX2NhbGwocmRhaSwgJnJkYWktPnBsYXliYWNrLCBwcm9iZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gcnNuZF9hZGdfcHJvYmUocGRldiwgaW5mbywgcHJpdik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSByc25kX3NzaV9wcm9iZShwZGV2LCBpbmZvLCBwcml2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHJzbmRfZGFpX3Byb2JlKHBkZXYsIGluZm8sIHByaXYpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCQlyZXQgPSByc25kX2RhaV9jYWxsKHJkYWksICZyZGFpLT5jYXB0dXJlLCBwcm9iZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KIAogCS8qCiAJICoJYXNvYyByZWdpc3RlcgpAQCAtNzY3LDcgKzk3NSw3IEBACiAJfQogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoZGV2LCAmcnNuZF9zb2NfY29tcG9uZW50LAotCQkJCQkgcHJpdi0+ZGFpZHJ2LCByc25kX2RhaV9ucihwcml2KSk7CisJCQkJCSBwcml2LT5kYWlkcnYsIHJzbmRfcmRhaV9ucihwcml2KSk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihkZXYsICJjYW5ub3Qgc25kIGRhaSByZWdpc3RlclxuIik7CiAJCWdvdG8gZXhpdF9zbmRfc29jOwpAQCAtNzg5LDE3ICs5OTcsMjAgQEAKIHN0YXRpYyBpbnQgcnNuZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCByc25kX2RhaSAqcmRhaTsKKwlpbnQgcmV0LCBpOwogCiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwogCi0JLyoKLQkgKglyZW1vdmUgZWFjaCBtb2R1bGUKLQkgKi8KLQlyc25kX3NzaV9yZW1vdmUocGRldiwgcHJpdik7Ci0JcnNuZF9hZGdfcmVtb3ZlKHBkZXYsIHByaXYpOwotCXJzbmRfc2N1X3JlbW92ZShwZGV2LCBwcml2KTsKLQlyc25kX2RhaV9yZW1vdmUocGRldiwgcHJpdik7Ci0JcnNuZF9nZW5fcmVtb3ZlKHBkZXYsIHByaXYpOworCWZvcl9lYWNoX3JzbmRfZGFpKHJkYWksIHByaXYsIGkpIHsKKwkJcmV0ID0gcnNuZF9kYWlfY2FsbChyZGFpLCAmcmRhaS0+cGxheWJhY2ssIHJlbW92ZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IHJzbmRfZGFpX2NhbGwocmRhaSwgJnJkYWktPmNhcHR1cmUsIHJlbW92ZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KIAogCXJldHVybiAwOwogfQpAQCAtODA3LDYgKzEwMTgsNyBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcnNuZF9kcml2ZXIgPSB7CiAJLmRyaXZlcgk9IHsKIAkJLm5hbWUJPSAicmNhcl9zb3VuZCIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHJzbmRfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUJCT0gcnNuZF9wcm9iZSwKIAkucmVtb3ZlCQk9IHJzbmRfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvZ2VuLmMgYi9zb3VuZC9zb2Mvc2gvcmNhci9nZW4uYwppbmRleCBhZGQwODhiLi41MGExZWYzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvcmNhci9nZW4uYworKysgYi9zb3VuZC9zb2Mvc2gvcmNhci9nZW4uYwpAQCAtMTU1LDYyICsxNTUsNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcnNuZF9nZW5fcGF0aF9pbml0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsCi0JCSAgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCi0JCSAgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKLXsKLQlzdHJ1Y3QgcnNuZF9tb2QgKm1vZDsKLQlpbnQgcmV0OwotCWludCBpZDsKLQotCS8qCi0JICogR2VuMSBpcyBjcmVhdGVkIGJ5IFNSVS9TU0ksIGFuZCB0aGlzIFNSVSBpcyBiYXNlIG1vZHVsZSBvZgotCSAqIEdlbjIncyBTQ1UvU1NJVS9TU0kuIChHZW4yIFNDVS9TU0lVIGNhbWUgZnJvbSBTUlUpCi0JICoKLQkgKiBFYXN5IGltYWdlIGlzLi4KLQkgKglHZW4xIFNSVSA9IEdlbjIgU0NVICsgU1NJVSArIGV0YwotCSAqCi0JICogR2VuMiBTQ1UgcGF0aCBpcyB2ZXJ5IGZsZXhpYmxlLCBidXQsIEdlbjEgU1JVIChTQ1UgcGFydHMpIGlzCi0JICogdXNpbmcgZml4ZWQgcGF0aC4KLQkgKgotCSAqIFRoZW4sIFNTSSBpZCA9IFNDVSBpZCBoZXJlCi0JICovCi0KLQkvKiBnZXQgU1NJJ3MgSUQgKi8KLQltb2QgPSByc25kX3NzaV9tb2RfZ2V0X2ZybV9kYWkocHJpdiwKLQkJCQkgICAgICAgcnNuZF9kYWlfaWQocHJpdiwgcmRhaSksCi0JCQkJICAgICAgIHJzbmRfZGFpX2lzX3BsYXkocmRhaSwgaW8pKTsKLQlpZCA9IHJzbmRfbW9kX2lkKG1vZCk7Ci0KLQkvKiBTU0kgKi8KLQltb2QgPSByc25kX3NzaV9tb2RfZ2V0KHByaXYsIGlkKTsKLQlyZXQgPSByc25kX2RhaV9jb25uZWN0KHJkYWksIG1vZCwgaW8pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogU0NVICovCi0JbW9kID0gcnNuZF9zY3VfbW9kX2dldChwcml2LCBpZCk7Ci0JcmV0ID0gcnNuZF9kYWlfY29ubmVjdChyZGFpLCBtb2QsIGlvKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCByc25kX2dlbl9wYXRoX2V4aXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKLQkJICAgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKLQkJICAgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQotewotCXN0cnVjdCByc25kX21vZCAqbW9kLCAqbjsKLQlpbnQgcmV0ID0gMDsKLQotCS8qCi0JICogcmVtb3ZlIGFsbCBtb2QgZnJvbSByZGFpCi0JICovCi0JZm9yX2VhY2hfcnNuZF9tb2QobW9kLCBuLCBpbykKLQkJcmV0IHw9IHJzbmRfZGFpX2Rpc2Nvbm5lY3QobW9kKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIC8qCiAgKgkJR2VuMgogICovCkBAIC0yMjksMTQgKzE3Myw0MCBAQAogCQlSU05EX0dFTjJfU19SRUcoZ2VuLCBTU0lVLAlTU0lfTU9ERTAsCTB4ODAwKSwKIAkJUlNORF9HRU4yX1NfUkVHKGdlbiwgU1NJVSwJU1NJX01PREUxLAkweDgwNCksCiAJCS8qIEZJWE1FOiBpdCBuZWVkcyBTU0lfTU9ERTIvMyBpbiB0aGUgZnV0dXJlICovCisJCVJTTkRfR0VOMl9NX1JFRyhnZW4sIFNTSVUsCVNTSV9CVVNJRl9NT0RFLAkweDAsCTB4ODApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTU0lVLAlTU0lfQlVTSUZfQURJTlIsMHg0LAkweDgwKSwKKwkJUlNORF9HRU4yX01fUkVHKGdlbiwgU1NJVSwJU1NJX0NUUkwsCTB4MTAsCTB4ODApLAogCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTU0lVLAlJTlRfRU5BQkxFLAkweDE4LAkweDgwKSwKIAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19CVVNJRl9NT0RFLAkweDAsCTB4MjApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19ST1VURV9NT0RFMCwweGMsCTB4MjApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19DVFJMLAkweDEwLAkweDIwKSwKKwkJUlNORF9HRU4yX01fUkVHKGdlbiwgU0NVLAlTUkNfU1dSU1IsCTB4MjAwLAkweDQwKSwKKwkJUlNORF9HRU4yX01fUkVHKGdlbiwgU0NVLAlTUkNfU1JDSVIsCTB4MjA0LAkweDQwKSwKKwkJUlNORF9HRU4yX01fUkVHKGdlbiwgU0NVLAlTUkNfQURJTlIsCTB4MjE0LAkweDQwKSwKKwkJUlNORF9HRU4yX01fUkVHKGdlbiwgU0NVLAlTUkNfSUZTQ1IsCTB4MjFjLAkweDQwKSwKKwkJUlNORF9HRU4yX01fUkVHKGdlbiwgU0NVLAlTUkNfSUZTVlIsCTB4MjIwLAkweDQwKSwKKwkJUlNORF9HRU4yX01fUkVHKGdlbiwgU0NVLAlTUkNfU1JDQ1IsCTB4MjI0LAkweDQwKSwKKwkJUlNORF9HRU4yX01fUkVHKGdlbiwgU0NVLAlTUkNfQlNEU1IsCTB4MjJjLAkweDQwKSwKKwkJUlNORF9HRU4yX01fUkVHKGdlbiwgU0NVLAlTUkNfQlNJU1IsCTB4MjM4LAkweDQwKSwKKwogCQlSU05EX0dFTjJfU19SRUcoZ2VuLCBBREcsCUJSUkEsCQkweDAwKSwKIAkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlCUlJCLAkJMHgwNCksCiAJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIEFERywJU1NJQ0tSLAkJMHgwOCksCiAJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIEFERywJQVVESU9fQ0xLX1NFTDAsCTB4MGMpLAogCQlSU05EX0dFTjJfU19SRUcoZ2VuLCBBREcsCUFVRElPX0NMS19TRUwxLAkweDEwKSwKIAkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlBVURJT19DTEtfU0VMMiwJMHgxNCksCisJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIEFERywJRElWX0VOLAkJMHgzMCksCisJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIEFERywJU1JDSU5fVElNU0VMMCwJMHgzNCksCisJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIEFERywJU1JDSU5fVElNU0VMMSwJMHgzOCksCisJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIEFERywJU1JDSU5fVElNU0VMMiwJMHgzYyksCisJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIEFERywJU1JDSU5fVElNU0VMMywJMHg0MCksCisJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIEFERywJU1JDSU5fVElNU0VMNCwJMHg0NCksCisJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIEFERywJU1JDT1VUX1RJTVNFTDAsCTB4NDgpLAorCQlSU05EX0dFTjJfU19SRUcoZ2VuLCBBREcsCVNSQ09VVF9USU1TRUwxLAkweDRjKSwKKwkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlTUkNPVVRfVElNU0VMMiwJMHg1MCksCisJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIEFERywJU1JDT1VUX1RJTVNFTDMsCTB4NTQpLAorCQlSU05EX0dFTjJfU19SRUcoZ2VuLCBBREcsCVNSQ09VVF9USU1TRUw0LAkweDU4KSwKIAogCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTU0ksCVNTSUNSLAkJMHgwMCwJMHg0MCksCiAJCVJTTkRfR0VOMl9NX1JFRyhnZW4sIFNTSSwJU1NJU1IsCQkweDA0LAkweDQwKSwKQEAgLTI0OSw3ICsyMTksNiBAQAogfQogCiBzdGF0aWMgaW50IHJzbmRfZ2VuMl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkJICAgc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8sCiAJCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CkBAIC0yODMsNyArMjUyLDcgQEAKIAkJcmV0dXJuIHJldDsKIAogCWRldl9kYmcoZGV2LCAiR2VuMiBkZXZpY2UgcHJvYmVkXG4iKTsKLQlkZXZfZGJnKGRldiwgIlNSVSAgOiAlMDh4ID0+ICVwXG4iLCBzY3VfcmVzLT5zdGFydCwKKwlkZXZfZGJnKGRldiwgIlNDVSAgOiAlMDh4ID0+ICVwXG4iLCBzY3VfcmVzLT5zdGFydCwKIAkJZ2VuLT5iYXNlW1JTTkRfR0VOMl9TQ1VdKTsKIAlkZXZfZGJnKGRldiwgIkFERyAgOiAlMDh4ID0+ICVwXG4iLCBhZGdfcmVzLT5zdGFydCwKIAkJZ2VuLT5iYXNlW1JTTkRfR0VOMl9BREddKTsKQEAgLTMxNyw3ICsyODYsNyBAQAogCQlSU05EX0dFTjFfU19SRUcoZ2VuLCBTUlUsCVNSQ19ST1VURV9DVFJMLAkweGMwKSwKIAkJUlNORF9HRU4xX1NfUkVHKGdlbiwgU1JVLAlTU0lfTU9ERTAsCTB4RDApLAogCQlSU05EX0dFTjFfU19SRUcoZ2VuLCBTUlUsCVNTSV9NT0RFMSwJMHhENCksCi0JCVJTTkRfR0VOMV9NX1JFRyhnZW4sIFNSVSwJQlVTSUZfTU9ERSwJMHgyMCwJMHg0KSwKKwkJUlNORF9HRU4xX01fUkVHKGdlbiwgU1JVLAlTUkNfQlVTSUZfTU9ERSwJMHgyMCwJMHg0KSwKIAkJUlNORF9HRU4xX01fUkVHKGdlbiwgU1JVLAlTUkNfUk9VVEVfTU9ERTAsMHg1MCwJMHg4KSwKIAkJUlNORF9HRU4xX01fUkVHKGdlbiwgU1JVLAlTUkNfU1dSU1IsCTB4MjAwLAkweDQwKSwKIAkJUlNORF9HRU4xX01fUkVHKGdlbiwgU1JVLAlTUkNfU1JDSVIsCTB4MjA0LAkweDQwKSwKQEAgLTM0Nyw3ICszMTYsNiBAQAogfQogCiBzdGF0aWMgaW50IHJzbmRfZ2VuMV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkJICAgc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8sCiAJCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CkBAIC0zOTEsMTQgKzM1OSwyOCBAQAogLyoKICAqCQlHZW4KICAqLworc3RhdGljIHZvaWQgcnNuZF9vZl9wYXJzZV9nZW4oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCByc25kX29mX2RhdGEgKm9mX2RhdGEsCisJCQkgICAgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KQoreworCXN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvID0gcHJpdi0+aW5mbzsKKworCWlmICghb2ZfZGF0YSkKKwkJcmV0dXJuOworCisJaW5mby0+ZmxhZ3MgPSBvZl9kYXRhLT5mbGFnczsKK30KKwogaW50IHJzbmRfZ2VuX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgIHN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvLAorCQkgICBjb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhLAogCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CiAJc3RydWN0IHJzbmRfZ2VuICpnZW47CiAJaW50IHJldDsKIAorCXJzbmRfb2ZfcGFyc2VfZ2VuKHBkZXYsIG9mX2RhdGEsIHByaXYpOworCiAJZ2VuID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpnZW4pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdlbikgewogCQlkZXZfZXJyKGRldiwgIkdFTiBhbGxvY2F0ZSBmYWlsZWRcbiIpOwpAQCAtNDA5LDE3ICszOTEsMTIgQEAKIAogCXJldCA9IC1FTk9ERVY7CiAJaWYgKHJzbmRfaXNfZ2VuMShwcml2KSkKLQkJcmV0ID0gcnNuZF9nZW4xX3Byb2JlKHBkZXYsIGluZm8sIHByaXYpOworCQlyZXQgPSByc25kX2dlbjFfcHJvYmUocGRldiwgcHJpdik7CiAJZWxzZSBpZiAocnNuZF9pc19nZW4yKHByaXYpKQotCQlyZXQgPSByc25kX2dlbjJfcHJvYmUocGRldiwgaW5mbywgcHJpdik7CisJCXJldCA9IHJzbmRfZ2VuMl9wcm9iZShwZGV2LCBwcml2KTsKIAogCWlmIChyZXQgPCAwKQogCQlkZXZfZXJyKGRldiwgInVua25vd24gZ2VuZXJhdGlvbiBSLUNhciBzb3VuZCBkZXZpY2VcbiIpOwogCiAJcmV0dXJuIHJldDsKIH0KLQotdm9pZCByc25kX2dlbl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KQotewotfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvcnNuZC5oIGIvc291bmQvc29jL3NoL3JjYXIvcnNuZC5oCmluZGV4IDRjYTY2Y2QuLjYxOWQxOTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9yY2FyL3JzbmQuaAorKysgYi9zb3VuZC9zb2Mvc2gvcmNhci9yc25kLmgKQEAgLTE3LDYgKzE3LDggQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zaF9kbWEuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxzb3VuZC9yY2FyX3NuZC5oPgpAQCAtMzIsMTUgKzM0LDkgQEAKICAqLwogZW51bSByc25kX3JlZyB7CiAJLyogU1JVL1NDVS9TU0lVICovCi0JUlNORF9SRUdfU1JDX1JPVVRFX1NFTCwJCS8qIGZvciBHZW4xICovCi0JUlNORF9SRUdfU1JDX1RNR19TRUwwLAkJLyogZm9yIEdlbjEgKi8KLQlSU05EX1JFR19TUkNfVE1HX1NFTDEsCQkvKiBmb3IgR2VuMSAqLwotCVJTTkRfUkVHX1NSQ19UTUdfU0VMMiwJCS8qIGZvciBHZW4xICovCi0JUlNORF9SRUdfU1JDX1JPVVRFX0NUUkwsCS8qIGZvciBHZW4xICovCiAJUlNORF9SRUdfU1NJX01PREUwLAogCVJTTkRfUkVHX1NTSV9NT0RFMSwKLQlSU05EX1JFR19CVVNJRl9NT0RFLAotCVJTTkRfUkVHX0lOVF9FTkFCTEUsCQkvKiBmb3IgR2VuMiAqLworCVJTTkRfUkVHX1NSQ19CVVNJRl9NT0RFLAogCVJTTkRfUkVHX1NSQ19ST1VURV9NT0RFMCwKIAlSU05EX1JFR19TUkNfU1dSU1IsCiAJUlNORF9SRUdfU1JDX1NSQ0lSLApAQCAtNDgsNyArNDQsNiBAQAogCVJTTkRfUkVHX1NSQ19JRlNDUiwKIAlSU05EX1JFR19TUkNfSUZTVlIsCiAJUlNORF9SRUdfU1JDX1NSQ0NSLAotCVJTTkRfUkVHX1NSQ19NTkZTUiwKIAogCS8qIEFERyAqLwogCVJTTkRfUkVHX0JSUkEsCkBAIC01NiwxMCArNTEsNiBAQAogCVJTTkRfUkVHX1NTSUNLUiwKIAlSU05EX1JFR19BVURJT19DTEtfU0VMMCwKIAlSU05EX1JFR19BVURJT19DTEtfU0VMMSwKLQlSU05EX1JFR19BVURJT19DTEtfU0VMMiwKLQlSU05EX1JFR19BVURJT19DTEtfU0VMMywJLyogZm9yIEdlbjEgKi8KLQlSU05EX1JFR19BVURJT19DTEtfU0VMNCwJLyogZm9yIEdlbjEgKi8KLQlSU05EX1JFR19BVURJT19DTEtfU0VMNSwJLyogZm9yIEdlbjEgKi8KIAogCS8qIFNTSSAqLwogCVJTTkRfUkVHX1NTSUNSLApAQCAtNjgsOSArNTksNjMgQEAKIAlSU05EX1JFR19TU0lSRFIsCiAJUlNORF9SRUdfU1NJV1NSLAogCisJLyogU0hBUkUgc2VlIGJlbG93ICovCisJUlNORF9SRUdfU0hBUkUwMSwKKwlSU05EX1JFR19TSEFSRTAyLAorCVJTTkRfUkVHX1NIQVJFMDMsCisJUlNORF9SRUdfU0hBUkUwNCwKKwlSU05EX1JFR19TSEFSRTA1LAorCVJTTkRfUkVHX1NIQVJFMDYsCisJUlNORF9SRUdfU0hBUkUwNywKKwlSU05EX1JFR19TSEFSRTA4LAorCVJTTkRfUkVHX1NIQVJFMDksCisJUlNORF9SRUdfU0hBUkUxMCwKKwlSU05EX1JFR19TSEFSRTExLAorCVJTTkRfUkVHX1NIQVJFMTIsCisJUlNORF9SRUdfU0hBUkUxMywKKwlSU05EX1JFR19TSEFSRTE0LAorCVJTTkRfUkVHX1NIQVJFMTUsCisJUlNORF9SRUdfU0hBUkUxNiwKKwlSU05EX1JFR19TSEFSRTE3LAorCVJTTkRfUkVHX1NIQVJFMTgsCisJUlNORF9SRUdfU0hBUkUxOSwKKwogCVJTTkRfUkVHX01BWCwKIH07CiAKKy8qIEdlbjEgb25seSAqLworI2RlZmluZSBSU05EX1JFR19TUkNfUk9VVEVfU0VMCQlSU05EX1JFR19TSEFSRTAxCisjZGVmaW5lIFJTTkRfUkVHX1NSQ19UTUdfU0VMMAkJUlNORF9SRUdfU0hBUkUwMgorI2RlZmluZSBSU05EX1JFR19TUkNfVE1HX1NFTDEJCVJTTkRfUkVHX1NIQVJFMDMKKyNkZWZpbmUgUlNORF9SRUdfU1JDX1RNR19TRUwyCQlSU05EX1JFR19TSEFSRTA0CisjZGVmaW5lIFJTTkRfUkVHX1NSQ19ST1VURV9DVFJMCQlSU05EX1JFR19TSEFSRTA1CisjZGVmaW5lIFJTTkRfUkVHX1NSQ19NTkZTUgkJUlNORF9SRUdfU0hBUkUwNgorI2RlZmluZSBSU05EX1JFR19BVURJT19DTEtfU0VMMwkJUlNORF9SRUdfU0hBUkUwNworI2RlZmluZSBSU05EX1JFR19BVURJT19DTEtfU0VMNAkJUlNORF9SRUdfU0hBUkUwOAorI2RlZmluZSBSU05EX1JFR19BVURJT19DTEtfU0VMNQkJUlNORF9SRUdfU0hBUkUwOQorCisvKiBHZW4yIG9ubHkgKi8KKyNkZWZpbmUgUlNORF9SRUdfU1JDX0NUUkwJCVJTTkRfUkVHX1NIQVJFMDEKKyNkZWZpbmUgUlNORF9SRUdfU1NJX0NUUkwJCVJTTkRfUkVHX1NIQVJFMDIKKyNkZWZpbmUgUlNORF9SRUdfU1NJX0JVU0lGX01PREUJCVJTTkRfUkVHX1NIQVJFMDMKKyNkZWZpbmUgUlNORF9SRUdfU1NJX0JVU0lGX0FESU5SCVJTTkRfUkVHX1NIQVJFMDQKKyNkZWZpbmUgUlNORF9SRUdfSU5UX0VOQUJMRQkJUlNORF9SRUdfU0hBUkUwNQorI2RlZmluZSBSU05EX1JFR19TUkNfQlNEU1IJCVJTTkRfUkVHX1NIQVJFMDYKKyNkZWZpbmUgUlNORF9SRUdfU1JDX0JTSVNSCQlSU05EX1JFR19TSEFSRTA3CisjZGVmaW5lIFJTTkRfUkVHX0RJVl9FTgkJCVJTTkRfUkVHX1NIQVJFMDgKKyNkZWZpbmUgUlNORF9SRUdfU1JDSU5fVElNU0VMMAkJUlNORF9SRUdfU0hBUkUwOQorI2RlZmluZSBSU05EX1JFR19TUkNJTl9USU1TRUwxCQlSU05EX1JFR19TSEFSRTEwCisjZGVmaW5lIFJTTkRfUkVHX1NSQ0lOX1RJTVNFTDIJCVJTTkRfUkVHX1NIQVJFMTEKKyNkZWZpbmUgUlNORF9SRUdfU1JDSU5fVElNU0VMMwkJUlNORF9SRUdfU0hBUkUxMgorI2RlZmluZSBSU05EX1JFR19TUkNJTl9USU1TRUw0CQlSU05EX1JFR19TSEFSRTEzCisjZGVmaW5lIFJTTkRfUkVHX1NSQ09VVF9USU1TRUwwCQlSU05EX1JFR19TSEFSRTE0CisjZGVmaW5lIFJTTkRfUkVHX1NSQ09VVF9USU1TRUwxCQlSU05EX1JFR19TSEFSRTE1CisjZGVmaW5lIFJTTkRfUkVHX1NSQ09VVF9USU1TRUwyCQlSU05EX1JFR19TSEFSRTE2CisjZGVmaW5lIFJTTkRfUkVHX1NSQ09VVF9USU1TRUwzCQlSU05EX1JFR19TSEFSRTE3CisjZGVmaW5lIFJTTkRfUkVHX1NSQ09VVF9USU1TRUw0CQlSU05EX1JFR19TSEFSRTE4CisjZGVmaW5lIFJTTkRfUkVHX0FVRElPX0NMS19TRUwyCQlSU05EX1JFR19TSEFSRTE5CisKK3N0cnVjdCByc25kX29mX2RhdGE7CiBzdHJ1Y3QgcnNuZF9wcml2Owogc3RydWN0IHJzbmRfbW9kOwogc3RydWN0IHJzbmRfZGFpOwpAQCAtOTYsMjQgKzE0MSwyMCBAQAogICoJUi1DYXIgRE1BCiAgKi8KIHN0cnVjdCByc25kX2RtYSB7Ci0Jc3RydWN0IHJzbmRfcHJpdgkqcHJpdjsKIAlzdHJ1Y3Qgc2hfZG1hZV9zbGF2ZQlzbGF2ZTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKIAlzdHJ1Y3QgZG1hX2NoYW4JCSpjaGFuOwogCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcjsKLQlpbnQgKCppbnF1aXJ5KShzdHJ1Y3QgcnNuZF9kbWEgKmRtYSwgZG1hX2FkZHJfdCAqYnVmLCBpbnQgKmxlbik7Ci0JaW50ICgqY29tcGxldGUpKHN0cnVjdCByc25kX2RtYSAqZG1hKTsKIAogCWludCBzdWJtaXRfbG9vcDsKKwlpbnQgb2Zmc2V0OyAvKiBpdCBjYXJlcyBBL0IgcGxhbmUgKi8KIH07CiAKIHZvaWQgcnNuZF9kbWFfc3RhcnQoc3RydWN0IHJzbmRfZG1hICpkbWEpOwogdm9pZCByc25kX2RtYV9zdG9wKHN0cnVjdCByc25kX2RtYSAqZG1hKTsKIGludCByc25kX2RtYV9hdmFpbGFibGUoc3RydWN0IHJzbmRfZG1hICpkbWEpOwogaW50IHJzbmRfZG1hX2luaXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwgc3RydWN0IHJzbmRfZG1hICpkbWEsCi0JaW50IGlzX3BsYXksIGludCBpZCwKLQlpbnQgKCppbnF1aXJ5KShzdHJ1Y3QgcnNuZF9kbWEgKmRtYSwgZG1hX2FkZHJfdCAqYnVmLCBpbnQgKmxlbiksCi0JaW50ICgqY29tcGxldGUpKHN0cnVjdCByc25kX2RtYSAqZG1hKSk7CisJaW50IGlzX3BsYXksIGludCBpZCk7CiB2b2lkICByc25kX2RtYV9xdWl0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsCiAJCSAgICBzdHJ1Y3QgcnNuZF9kbWEgKmRtYSk7CiAKQEAgLTEyMSw5ICsxNjIsMjAgQEAKIC8qCiAgKglSLUNhciBzb3VuZCBtb2QKICAqLworZW51bSByc25kX21vZF90eXBlIHsKKwlSU05EX01PRF9TUkMgPSAwLAorCVJTTkRfTU9EX1NTSSwKKwlSU05EX01PRF9NQVgsCit9OwogCiBzdHJ1Y3QgcnNuZF9tb2Rfb3BzIHsKIAljaGFyICpuYW1lOworCWludCAoKnByb2JlKShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCSAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pOworCWludCAoKnJlbW92ZSkoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCSAgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJICAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pOwogCWludCAoKmluaXQpKHN0cnVjdCByc25kX21vZCAqbW9kLAogCQkgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAogCQkgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pOwpAQCAtMTM4LDI4ICsxOTAsMjYgQEAKIAkJICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKTsKIH07CiAKK3N0cnVjdCByc25kX2RhaV9zdHJlYW07CiBzdHJ1Y3QgcnNuZF9tb2QgewogCWludCBpZDsKKwllbnVtIHJzbmRfbW9kX3R5cGUgdHlwZTsKIAlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2OwogCXN0cnVjdCByc25kX21vZF9vcHMgKm9wczsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7IC8qIGNvbm5lY3QgdG8gcnNuZF9kYWkgcGxheWJhY2svY2FwdHVyZSAqLwogCXN0cnVjdCByc25kX2RtYSBkbWE7CisJc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW87CiB9OwogCiAjZGVmaW5lIHJzbmRfbW9kX3RvX3ByaXYobW9kKSAoKG1vZCktPnByaXYpCiAjZGVmaW5lIHJzbmRfbW9kX3RvX2RtYShtb2QpICgmKG1vZCktPmRtYSkKICNkZWZpbmUgcnNuZF9kbWFfdG9fbW9kKF9kbWEpIGNvbnRhaW5lcl9vZigoX2RtYSksIHN0cnVjdCByc25kX21vZCwgZG1hKQorI2RlZmluZSByc25kX21vZF90b19pbyhtb2QpICgobW9kKS0+aW8pCiAjZGVmaW5lIHJzbmRfbW9kX2lkKG1vZCkgKChtb2QpLT5pZCkKLSNkZWZpbmUgZm9yX2VhY2hfcnNuZF9tb2QocG9zLCBuLCBpbykJXAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG4sICYoaW8pLT5oZWFkLCBsaXN0KQotI2RlZmluZSByc25kX21vZF9jYWxsKG1vZCwgZnVuYywgcmRhaSwgaW8pCVwKLQkoIShtb2QpID8gLUVOT0RFViA6CQkJXAotCSAhKChtb2QpLT5vcHMtPmZ1bmMpID8gMCA6CQlcCi0JIChtb2QpLT5vcHMtPmZ1bmMobW9kLCByZGFpLCBpbykpCiAKIHZvaWQgcnNuZF9tb2RfaW5pdChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAogCQkgICBzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKIAkJICAgc3RydWN0IHJzbmRfbW9kX29wcyAqb3BzLAorCQkgICBlbnVtIHJzbmRfbW9kX3R5cGUgdHlwZSwKIAkJICAgaW50IGlkKTsKIGNoYXIgKnJzbmRfbW9kX25hbWUoc3RydWN0IHJzbmRfbW9kICptb2QpOwogCkBAIC0xNjgsMTMgKzIxOCwxNiBAQAogICovCiAjZGVmaW5lIFJTTkRfREFJX05BTUVfU0laRQkxNgogc3RydWN0IHJzbmRfZGFpX3N0cmVhbSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBoZWFkOyAvKiBoZWFkIG9mIHJzbmRfbW9kIGxpc3QgKi8KIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKKwlzdHJ1Y3QgcnNuZF9tb2QgKm1vZFtSU05EX01PRF9NQVhdOworCXN0cnVjdCByc25kX2RhaV9wYXRoX2luZm8gKmluZm87IC8qIHJjYXJfc25kLmggKi8KIAlpbnQgYnl0ZV9wb3M7CiAJaW50IHBlcmlvZF9wb3M7CiAJaW50IGJ5dGVfcGVyX3BlcmlvZDsKIAlpbnQgbmV4dF9wZXJpb2RfYnl0ZTsKIH07CisjZGVmaW5lIHJzbmRfaW9fdG9fbW9kX3NzaShpbykJKChpbyktPm1vZFtSU05EX01PRF9TU0ldKQorI2RlZmluZSByc25kX2lvX3RvX21vZF9zcmMoaW8pCSgoaW8pLT5tb2RbUlNORF9NT0RfU1JDXSkKIAogc3RydWN0IHJzbmRfZGFpIHsKIAljaGFyIG5hbWVbUlNORF9EQUlfTkFNRV9TSVpFXTsKQEAgLTE4OSwxNiArMjQyLDE0IEBACiAJdW5zaWduZWQgaW50IGRhdGFfYWxpZ25tZW50OjE7CiB9OwogCi0jZGVmaW5lIHJzbmRfZGFpX25yKHByaXYpICgocHJpdiktPmRhaV9ucikKKyNkZWZpbmUgcnNuZF9yZGFpX25yKHByaXYpICgocHJpdiktPnJkYWlfbnIpCiAjZGVmaW5lIGZvcl9lYWNoX3JzbmRfZGFpKHJkYWksIHByaXYsIGkpCQlcCi0JZm9yIChpID0gMCwgKHJkYWkpID0gcnNuZF9kYWlfZ2V0KHByaXYsIGkpOwlcCi0JICAgICBpIDwgcnNuZF9kYWlfbnIocHJpdik7CQkJXAotCSAgICAgaSsrLCAocmRhaSkgPSByc25kX2RhaV9nZXQocHJpdiwgaSkpCisJZm9yIChpID0gMDsJCQkJCVwKKwkgICAgIChpIDwgcnNuZF9yZGFpX25yKHByaXYpKSAmJgkJXAorCSAgICAgKChyZGFpKSA9IHJzbmRfZGFpX2dldChwcml2LCBpKSk7CQlcCisJICAgICBpKyspCiAKIHN0cnVjdCByc25kX2RhaSAqcnNuZF9kYWlfZ2V0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsIGludCBpZCk7Ci1pbnQgcnNuZF9kYWlfZGlzY29ubmVjdChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCk7Ci1pbnQgcnNuZF9kYWlfY29ubmVjdChzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksIHN0cnVjdCByc25kX21vZCAqbW9kLAotCQkgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKTsKIGludCByc25kX2RhaV9pc19wbGF5KHN0cnVjdCByc25kX2RhaSAqcmRhaSwgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pOwogaW50IHJzbmRfZGFpX2lkKHN0cnVjdCByc25kX3ByaXYgKnByaXYsIHN0cnVjdCByc25kX2RhaSAqcmRhaSk7CiAjZGVmaW5lIHJzbmRfZGFpX2dldF9wbGF0Zm9ybV9pbmZvKHJkYWkpICgocmRhaSktPmluZm8pCkBAIC0yMDYsMjEgKzI1NywxNCBAQAogCiB2b2lkIHJzbmRfZGFpX3BvaW50ZXJfdXBkYXRlKHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvLCBpbnQgY250KTsKIGludCByc25kX2RhaV9wb2ludGVyX29mZnNldChzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbywgaW50IGFkZGl0aW9uYWwpOworI2RlZmluZSByc25kX2RhaV9pc19jbGtfbWFzdGVyKHJkYWkpICgocmRhaSktPmNsa19tYXN0ZXIpCiAKIC8qCiAgKglSLUNhciBHZW4xL0dlbjIKICAqLwogaW50IHJzbmRfZ2VuX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgIHN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvLAorCQkgICBjb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhLAogCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KTsKLXZvaWQgcnNuZF9nZW5fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdik7Ci1pbnQgcnNuZF9nZW5fcGF0aF9pbml0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsCi0JCSAgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCi0JCSAgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyk7Ci1pbnQgcnNuZF9nZW5fcGF0aF9leGl0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsCi0JCSAgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCi0JCSAgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyk7CiB2b2lkIF9faW9tZW0gKnJzbmRfZ2VuX3JlZ19nZXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKIAkJCSAgICAgICBzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKIAkJCSAgICAgICBlbnVtIHJzbmRfcmVnIHJlZyk7CkBAIC0yMzMsMTggKzI3NywyOCBAQAogaW50IHJzbmRfYWRnX3NzaV9jbGtfc3RvcChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCk7CiBpbnQgcnNuZF9hZGdfc3NpX2Nsa190cnlfc3RhcnQoc3RydWN0IHJzbmRfbW9kICptb2QsIHVuc2lnbmVkIGludCByYXRlKTsKIGludCByc25kX2FkZ19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkgICBzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbywKKwkJICAgY29uc3Qgc3RydWN0IHJzbmRfb2ZfZGF0YSAqb2ZfZGF0YSwKIAkJICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdik7Ci12b2lkIHJzbmRfYWRnX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KTsKLWludCByc25kX2FkZ19zZXRfY29udmVydF9jbGsoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKLQkJCSAgICAgc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCQkgICAgIHVuc2lnbmVkIGludCBzcmNfcmF0ZSwKLQkJCSAgICAgdW5zaWduZWQgaW50IGRzdF9yYXRlKTsKK2ludCByc25kX2FkZ19zZXRfY29udmVydF9jbGtfZ2VuMShzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAorCQkJCSAgc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkJICB1bnNpZ25lZCBpbnQgc3JjX3JhdGUsCisJCQkJICB1bnNpZ25lZCBpbnQgZHN0X3JhdGUpOworaW50IHJzbmRfYWRnX3NldF9jb252ZXJ0X2Nsa19nZW4yKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJCSAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJCSAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8sCisJCQkJICB1bnNpZ25lZCBpbnQgc3JjX3JhdGUsCisJCQkJICB1bnNpZ25lZCBpbnQgZHN0X3JhdGUpOworaW50IHJzbmRfYWRnX3NldF9jb252ZXJ0X3RpbWluZ19nZW4yKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJCSAgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJCSAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pOwogCiAvKgogICoJUi1DYXIgc291bmQgcHJpdgogICovCitzdHJ1Y3QgcnNuZF9vZl9kYXRhIHsKKwl1MzIgZmxhZ3M7Cit9OworCiBzdHJ1Y3QgcnNuZF9wcml2IHsKIAogCXN0cnVjdCBkZXZpY2UgKmRldjsKQEAgLTI1NywxMCArMzExLDEwIEBACiAJdm9pZCAqZ2VuOwogCiAJLyoKLQkgKiBiZWxvdyB2YWx1ZSB3aWxsIGJlIGZpbGxlZCBvbiByc25kX3NjdV9wcm9iZSgpCisJICogYmVsb3cgdmFsdWUgd2lsbCBiZSBmaWxsZWQgb24gcnNuZF9zcmNfcHJvYmUoKQogCSAqLwotCXZvaWQgKnNjdTsKLQlpbnQgc2N1X25yOworCXZvaWQgKnNyYzsKKwlpbnQgc3JjX25yOwogCiAJLyoKIAkgKiBiZWxvdyB2YWx1ZSB3aWxsIGJlIGZpbGxlZCBvbiByc25kX2FkZ19wcm9iZSgpCkBAIC0yNzAsNDYgKzMyNCw2NCBAQAogCS8qCiAJICogYmVsb3cgdmFsdWUgd2lsbCBiZSBmaWxsZWQgb24gcnNuZF9zc2lfcHJvYmUoKQogCSAqLwotCXZvaWQgKnNzaXU7CisJdm9pZCAqc3NpOworCWludCBzc2lfbnI7CiAKIAkvKgogCSAqIGJlbG93IHZhbHVlIHdpbGwgYmUgZmlsbGVkIG9uIHJzbmRfZGFpX3Byb2JlKCkKIAkgKi8KIAlzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyICpkYWlkcnY7CiAJc3RydWN0IHJzbmRfZGFpICpyZGFpOwotCWludCBkYWlfbnI7CisJaW50IHJkYWlfbnI7CiB9OwogCiAjZGVmaW5lIHJzbmRfcHJpdl90b19kZXYocHJpdikJKChwcml2KS0+ZGV2KQorI2RlZmluZSByc25kX3ByaXZfdG9faW5mbyhwcml2KQkoKHByaXYpLT5pbmZvKQogI2RlZmluZSByc25kX2xvY2socHJpdiwgZmxhZ3MpIHNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncykKICNkZWZpbmUgcnNuZF91bmxvY2socHJpdiwgZmxhZ3MpIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKQogCi0vKgotICoJUi1DYXIgU0NVCi0gKi8KLWludCByc25kX3NjdV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkgICBzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbywKLQkJICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdik7Ci12b2lkIHJzbmRfc2N1X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkgICAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpOwotc3RydWN0IHJzbmRfbW9kICpyc25kX3NjdV9tb2RfZ2V0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsIGludCBpZCk7Ci1ib29sIHJzbmRfc2N1X2hwYmlmX2lzX2VuYWJsZShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCk7Ci11bnNpZ25lZCBpbnQgcnNuZF9zY3VfZ2V0X3NzaV9yYXRlKHN0cnVjdCByc25kX3ByaXYgKnByaXYsCi0JCQkJICAgc3RydWN0IHJzbmRfbW9kICpzc2lfbW9kLAotCQkJCSAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUpOworI2RlZmluZSByc25kX2luZm9faXNfcGxheWJhY2socHJpdiwgdHlwZSkJCQkJXAorKHsJCQkJCQkJCQlcCisJc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8gPSByc25kX3ByaXZfdG9faW5mbyhwcml2KTsJCVwKKwlpbnQgaSwgaXNfcGxheSA9IDA7CQkJCQkJXAorCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5kYWlfaW5mb19ucjsgaSsrKSB7CQkJXAorCQlpZiAoaW5mby0+ZGFpX2luZm9baV0ucGxheWJhY2sudHlwZSA9PSAodHlwZSktPmluZm8pIHsJXAorCQkJaXNfcGxheSA9IDE7CQkJCQlcCisJCQlicmVhazsJCQkJCQlcCisJCX0JCQkJCQkJXAorCX0JCQkJCQkJCVwKKwlpc19wbGF5OwkJCQkJCQlcCit9KQogCi0jZGVmaW5lIHJzbmRfc2N1X25yKHByaXYpICgocHJpdiktPnNjdV9ucikKKy8qCisgKglSLUNhciBTUkMKKyAqLworaW50IHJzbmRfc3JjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCSAgIGNvbnN0IHN0cnVjdCByc25kX29mX2RhdGEgKm9mX2RhdGEsCisJCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpOworc3RydWN0IHJzbmRfbW9kICpyc25kX3NyY19tb2RfZ2V0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsIGludCBpZCk7Cit1bnNpZ25lZCBpbnQgcnNuZF9zcmNfZ2V0X3NzaV9yYXRlKHN0cnVjdCByc25kX3ByaXYgKnByaXYsCisJCQkJICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8sCisJCQkJICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSk7CitpbnQgcnNuZF9zcmNfc3NpX21vZGVfaW5pdChzdHJ1Y3QgcnNuZF9tb2QgKnNzaV9tb2QsCisJCQkgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyk7CitpbnQgcnNuZF9zcmNfZW5hYmxlX3NzaV9pcnEoc3RydWN0IHJzbmRfbW9kICpzc2lfbW9kLAorCQkJICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyk7CisKKyNkZWZpbmUgcnNuZF9zcmNfbnIocHJpdikgKChwcml2KS0+c3JjX25yKQogCiAvKgogICoJUi1DYXIgU1NJCiAgKi8KIGludCByc25kX3NzaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkgICBzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbywKLQkJICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdik7Ci12b2lkIHJzbmRfc3NpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkgICBjb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhLAogCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KTsKIHN0cnVjdCByc25kX21vZCAqcnNuZF9zc2lfbW9kX2dldChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LCBpbnQgaWQpOwogc3RydWN0IHJzbmRfbW9kICpyc25kX3NzaV9tb2RfZ2V0X2ZybV9kYWkoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKIAkJCQkJICBpbnQgZGFpX2lkLCBpbnQgaXNfcGxheSk7CitpbnQgcnNuZF9zc2lfaXNfcGluX3NoYXJpbmcoc3RydWN0IHJzbmRfbW9kICptb2QpOworaW50IHJzbmRfc3NpX2lzX3BsYXkoc3RydWN0IHJzbmRfbW9kICptb2QpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9yY2FyL3NjdS5jIGIvc291bmQvc29jL3NoL3JjYXIvc2N1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYjA4YmIuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL3NoL3JjYXIvc2N1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotLyoKLSAqIFJlbmVzYXMgUi1DYXIgU0NVIHN1cHBvcnQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgUmVuZXNhcyBTb2x1dGlvbnMgQ29ycC4KLSAqIEt1bmlub3JpIE1vcmltb3RvIDxrdW5pbm9yaS5tb3JpbW90by5neEByZW5lc2FzLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0jaW5jbHVkZSAicnNuZC5oIgotCi1zdHJ1Y3QgcnNuZF9zY3UgewotCXN0cnVjdCByc25kX3NjdV9wbGF0Zm9ybV9pbmZvICppbmZvOyAvKiByY2FyX3NuZC5oICovCi0Jc3RydWN0IHJzbmRfbW9kIG1vZDsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci19OwotCi0jZGVmaW5lIHJzbmRfc2N1X21vZGVfZmxhZ3MocCkgKChwKS0+aW5mby0+ZmxhZ3MpCi0jZGVmaW5lIHJzbmRfc2N1X2NvbnZlcnRfcmF0ZShwKSAoKHApLT5pbmZvLT5jb252ZXJ0X3JhdGUpCi0KLSNkZWZpbmUgUlNORF9TQ1VfTkFNRV9TSVpFIDE2Ci0KLS8qCi0gKiBBRElOUgotICovCi0jZGVmaW5lIE9UQkxfMjQJCSgwIDw8IDE2KQotI2RlZmluZSBPVEJMXzIyCQkoMiA8PCAxNikKLSNkZWZpbmUgT1RCTF8yMAkJKDQgPDwgMTYpCi0jZGVmaW5lIE9UQkxfMTgJCSg2IDw8IDE2KQotI2RlZmluZSBPVEJMXzE2CQkoOCA8PCAxNikKLQotLyoKLSAqCQlpbWFnZSBvZiBTUkMgKFNhbXBsaW5nIFJhdGUgQ29udmVydGVyKQotICoKLSAqIDk2a0h6ICAgPC0+ICstLS0tLSsJNDhrSHoJKy0tLS0tKwkgNDhrSHoJKy0tLS0tLS0rCi0gKiA0OGtIeiAgIDwtPiB8IFNSQyB8IDwtLS0tLS0+CXwgU1NJIHwJPC0tLS0tPgl8IGNvZGVjIHwKLSAqIDQ0LjFrSHogPC0+ICstLS0tLSsJCSstLS0tLSsJCSstLS0tLS0tKwotICogLi4uCi0gKgotICovCi0KLSNkZWZpbmUgcnNuZF9tb2RfdG9fc2N1KF9tb2QpCVwKLQljb250YWluZXJfb2YoKF9tb2QpLCBzdHJ1Y3QgcnNuZF9zY3UsIG1vZCkKLQotI2RlZmluZSBmb3JfZWFjaF9yc25kX3NjdShwb3MsIHByaXYsIGkpCQkJCQlcCi0JZm9yICgoaSkgPSAwOwkJCQkJCQlcCi0JICAgICAoKGkpIDwgcnNuZF9zY3VfbnIocHJpdikpICYmCQkJCVwKLQkJICAgICAoKHBvcykgPSAoc3RydWN0IHJzbmRfc2N1ICopKHByaXYpLT5zY3UgKyBpKTsJXAotCSAgICAgaSsrKQotCi0vKiBHZW4xIG9ubHkgKi8KLXN0YXRpYyBpbnQgcnNuZF9zcmNfc2V0X3JvdXRlX2lmX2dlbjEoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCByc25kX21vZCAqbW9kLAotCQkJICAgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAotCQkJICAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCi17Ci0Jc3RydWN0IHNjdV9yb3V0ZV9jb25maWcgewotCQl1MzIgbWFzazsKLQkJaW50IHNoaWZ0OwotCX0gcm91dGVzW10gPSB7Ci0JCXsgMHhGLCAgMCwgfSwgLyogMCAqLwotCQl7IDB4RiwgIDQsIH0sIC8qIDEgKi8KLQkJeyAweEYsICA4LCB9LCAvKiAyICovCi0JCXsgMHg3LCAxMiwgfSwgLyogMyAqLwotCQl7IDB4NywgMTYsIH0sIC8qIDQgKi8KLQkJeyAweDcsIDIwLCB9LCAvKiA1ICovCi0JCXsgMHg3LCAyNCwgfSwgLyogNiAqLwotCQl7IDB4MywgMjgsIH0sIC8qIDcgKi8KLQkJeyAweDMsIDMwLCB9LCAvKiA4ICovCi0JfTsKLQlzdHJ1Y3QgcnNuZF9zY3UgKnNjdSA9IHJzbmRfbW9kX3RvX3NjdShtb2QpOwotCXUzMiBtYXNrOwotCXUzMiB2YWw7Ci0JaW50IHNoaWZ0OwotCWludCBpZDsKLQotCS8qCi0JICogR2VuMSBvbmx5Ci0JICovCi0JaWYgKCFyc25kX2lzX2dlbjEocHJpdikpCi0JCXJldHVybiAwOwotCi0JaWQgPSByc25kX21vZF9pZChtb2QpOwotCWlmIChpZCA8IDAgfHwgaWQgPj0gQVJSQVlfU0laRShyb3V0ZXMpKQotCQlyZXR1cm4gLUVJTzsKLQotCS8qCi0JICogU1JDX1JPVVRFX1NFTEVDVAotCSAqLwotCXZhbCA9IHJzbmRfZGFpX2lzX3BsYXkocmRhaSwgaW8pID8gMHgxIDogMHgyOwotCXZhbCA9IHZhbAkJPDwgcm91dGVzW2lkXS5zaGlmdDsKLQltYXNrID0gcm91dGVzW2lkXS5tYXNrCTw8IHJvdXRlc1tpZF0uc2hpZnQ7Ci0KLQlyc25kX21vZF9ic2V0KG1vZCwgU1JDX1JPVVRFX1NFTCwgbWFzaywgdmFsKTsKLQotCS8qCi0JICogU1JDX1RJTUlOR19TRUxFQ1QKLQkgKi8KLQlzaGlmdAk9IChpZCAlIDQpICogODsKLQltYXNrCT0gMHgxRiA8PCBzaGlmdDsKLQotCS8qCi0JICogQURHIGlzIHVzZWQgYXMgc291cmNlIGNsb2NrIGlmIFNSQyB3YXMgdXNlZCwKLQkgKiB0aGVuLCBTU0kgV1MgaXMgdXNlZCBhcyBkZXN0aW5hdGlvbiBjbG9jay4KLQkgKiBTU0kgV1MgaXMgdXNlZCBhcyBzb3VyY2UgY2xvY2sgaWYgU1JDIGlzIG5vdCB1c2VkCi0JICogKHdoZW4gcGxheWJhY2ssIHNvdXJjZS9kZXN0aW5hdGlvbiBiZWNvbWUgcmV2ZXJzZSB3aGVuIGNhcHR1cmUpCi0JICovCi0JaWYgKHJzbmRfc2N1X2NvbnZlcnRfcmF0ZShzY3UpKQkvKiB1c2UgQURHICovCi0JCXZhbCA9IDA7Ci0JZWxzZSBpZiAoOCA9PSBpZCkJCS8qIHVzZSBTU0kgV1MsIGJ1dCBTUlU4IGlzIHNwZWNpYWwgKi8KLQkJdmFsID0gaWQgPDwgc2hpZnQ7Ci0JZWxzZQkJCQkvKiB1c2UgU1NJIFdTICovCi0JCXZhbCA9IChpZCArIDEpIDw8IHNoaWZ0OwotCi0Jc3dpdGNoIChpZCAvIDQpIHsKLQljYXNlIDA6Ci0JCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNfVE1HX1NFTDAsIG1hc2ssIHZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJcnNuZF9tb2RfYnNldChtb2QsIFNSQ19UTUdfU0VMMSwgbWFzaywgdmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlyc25kX21vZF9ic2V0KG1vZCwgU1JDX1RNR19TRUwyLCBtYXNrLCB2YWwpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotdW5zaWduZWQgaW50IHJzbmRfc2N1X2dldF9zc2lfcmF0ZShzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAotCQkJCSAgIHN0cnVjdCByc25kX21vZCAqc3NpX21vZCwKLQkJCQkgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lKQotewotCXN0cnVjdCByc25kX3NjdSAqc2N1OwotCXVuc2lnbmVkIGludCByYXRlOwotCi0JLyogdGhpcyBmdW5jdGlvbiBpcyBhc3N1bWluZyBTU0kgaWQgPSBTQ1UgaWQgaGVyZSAqLwotCXNjdSA9IHJzbmRfbW9kX3RvX3NjdShyc25kX3NjdV9tb2RfZ2V0KHByaXYsIHJzbmRfbW9kX2lkKHNzaV9tb2QpKSk7Ci0KLQkvKgotCSAqIHJldHVybiBjb252ZXJ0IHJhdGUgaWYgU1JDIGlzIHVzZWQsCi0JICogb3RoZXJ3aXNlLCByZXR1cm4gcnVudGltZS0+cmF0ZSBhcyB1c3VhbAotCSAqLwotCXJhdGUgPSByc25kX3NjdV9jb252ZXJ0X3JhdGUoc2N1KTsKLQlpZiAoIXJhdGUpCi0JCXJhdGUgPSBydW50aW1lLT5yYXRlOwotCi0JcmV0dXJuIHJhdGU7Ci19Ci0KLXN0YXRpYyBpbnQgcnNuZF9zY3VfY29udmVydF9yYXRlX2N0cmwoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCByc25kX21vZCAqbW9kLAotCQkJICAgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAotCQkJICAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHJzbmRfaW9fdG9fcnVudGltZShpbyk7Ci0Jc3RydWN0IHJzbmRfc2N1ICpzY3UgPSByc25kX21vZF90b19zY3UobW9kKTsKLQl1MzIgY29udmVydF9yYXRlID0gcnNuZF9zY3VfY29udmVydF9yYXRlKHNjdSk7Ci0JdTMyIGFkaW5yID0gcnVudGltZS0+Y2hhbm5lbHM7Ci0KLQkvKiBzZXQvY2xlYXIgc29mdCByZXNldCAqLwotCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX1NXUlNSLCAwKTsKLQlyc25kX21vZF93cml0ZShtb2QsIFNSQ19TV1JTUiwgMSk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBvcGVyYXRpb24gb2YgdGhlIFNSQyBpbnRlcm5hbCBjaXJjdWl0cyAqLwotCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX1NSQ0lSLCAxKTsKLQotCS8qIFNldCBjaGFubmVsIG51bWJlciBhbmQgb3V0cHV0IGJpdCBsZW5ndGggKi8KLQlzd2l0Y2ggKHJ1bnRpbWUtPnNhbXBsZV9iaXRzKSB7Ci0JY2FzZSAxNjoKLQkJYWRpbnIgfD0gT1RCTF8xNjsKLQkJYnJlYWs7Ci0JY2FzZSAzMjoKLQkJYWRpbnIgfD0gT1RCTF8yNDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU87Ci0JfQotCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX0FESU5SLCBhZGlucik7Ci0KLQlpZiAoY29udmVydF9yYXRlKSB7Ci0JCXUzMiBmc3JhdGUgPSAweDA0MDAwMDAgLyBjb252ZXJ0X3JhdGUgKiBydW50aW1lLT5yYXRlOwotCQlpbnQgcmV0OwotCi0JCS8qIEVuYWJsZSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBJRlMgKi8KLQkJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfSUZTQ1IsIDEpOwotCi0JCS8qIFNldCBpbml0aWFsIHZhbHVlIG9mIElGUyAqLwotCQlyc25kX21vZF93cml0ZShtb2QsIFNSQ19JRlNWUiwgZnNyYXRlKTsKLQotCQkvKiBTZWxlY3QgU1JDIG1vZGUgKGZpeGVkIHZhbHVlKSAqLwotCQlyc25kX21vZF93cml0ZShtb2QsIFNSQ19TUkNDUiwgMHgwMDAxMDExMCk7Ci0KLQkJLyogU2V0IHRoZSByZXN0cmljdGlvbiB2YWx1ZSBvZiB0aGUgRlMgcmF0aW8gKDk4JSkgKi8KLQkJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfTU5GU1IsIGZzcmF0ZSAvIDEwMCAqIDk4KTsKLQotCQlpZiAocnNuZF9pc19nZW4xKHByaXYpKSB7Ci0JCQkvKiBubyBTUkNfQkZTU1Igc2V0dGluZ3MsIHNpbmNlIFNSQ19TUkNDUjo6QlVGTUQgaXMgMCAqLwotCQl9Ci0KLQkJLyogc2V0IGNvbnZlcnQgY2xvY2sgKi8KLQkJcmV0ID0gcnNuZF9hZGdfc2V0X2NvbnZlcnRfY2xrKHByaXYsIG1vZCwKLQkJCQkJICAgICAgIHJ1bnRpbWUtPnJhdGUsCi0JCQkJCSAgICAgICBjb252ZXJ0X3JhdGUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JLyogQ2FuY2VsIHRoZSBpbml0aWFsaXphdGlvbiBhbmQgb3BlcmF0ZSB0aGUgU1JDIGZ1bmN0aW9uICovCi0JcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfU1JDSVIsIDApOwotCi0JLyogdXNlIERNQSB0cmFuc2ZlciAqLwotCXJzbmRfbW9kX3dyaXRlKG1vZCwgQlVTSUZfTU9ERSwgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByc25kX3NjdV90cmFuc2Zlcl9zdGFydChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAotCQkJCSAgIHN0cnVjdCByc25kX21vZCAqbW9kLAotCQkJCSAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKLQkJCQkgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKLXsKLQlzdHJ1Y3QgcnNuZF9zY3UgKnNjdSA9IHJzbmRfbW9kX3RvX3NjdShtb2QpOwotCWludCBpZCA9IHJzbmRfbW9kX2lkKG1vZCk7Ci0JdTMyIHZhbDsKLQotCWlmIChyc25kX2lzX2dlbjEocHJpdikpIHsKLQkJdmFsID0gKDEgPDwgaWQpOwotCQlyc25kX21vZF9ic2V0KG1vZCwgU1JDX1JPVVRFX0NUUkwsIHZhbCwgdmFsKTsKLQl9Ci0KLQlpZiAocnNuZF9zY3VfY29udmVydF9yYXRlKHNjdSkpCi0JCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX1JPVVRFX01PREUwLCAxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJzbmRfc2N1X3RyYW5zZmVyX3N0b3Aoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKLQkJCQkgIHN0cnVjdCByc25kX21vZCAqbW9kLAotCQkJCSAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAotCQkJCSAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCi17Ci0Jc3RydWN0IHJzbmRfc2N1ICpzY3UgPSByc25kX21vZF90b19zY3UobW9kKTsKLQlpbnQgaWQgPSByc25kX21vZF9pZChtb2QpOwotCXUzMiBtYXNrOwotCi0JaWYgKHJzbmRfaXNfZ2VuMShwcml2KSkgewotCQltYXNrID0gKDEgPDwgaWQpOwotCQlyc25kX21vZF9ic2V0KG1vZCwgU1JDX1JPVVRFX0NUUkwsIG1hc2ssIDApOwotCX0KLQotCWlmIChyc25kX3NjdV9jb252ZXJ0X3JhdGUoc2N1KSkKLQkJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfUk9VVEVfTU9ERTAsIDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWJvb2wgcnNuZF9zY3VfaHBiaWZfaXNfZW5hYmxlKHN0cnVjdCByc25kX21vZCAqbW9kKQotewotCXN0cnVjdCByc25kX3NjdSAqc2N1ID0gcnNuZF9tb2RfdG9fc2N1KG1vZCk7Ci0JdTMyIGZsYWdzID0gcnNuZF9zY3VfbW9kZV9mbGFncyhzY3UpOwotCi0JcmV0dXJuICEhKGZsYWdzICYgUlNORF9TQ1VfVVNFX0hQQklGKTsKLX0KLQotc3RhdGljIGludCByc25kX3NjdV9zdGFydChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKLQkJCSAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAotCQkJICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKLXsKLQlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOwotCXN0cnVjdCByc25kX3NjdSAqc2N1ID0gcnNuZF9tb2RfdG9fc2N1KG1vZCk7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKLQlpbnQgcmV0OwotCi0JLyoKLQkgKiBTQ1Ugd2lsbCBiZSB1c2VkIGlmIGl0IGhhcyBSU05EX1NDVV9VU0VfSFBCSUYgZmxhZ3MKLQkgKi8KLQlpZiAoIXJzbmRfc2N1X2hwYmlmX2lzX2VuYWJsZShtb2QpKSB7Ci0JCS8qIGl0IHVzZSBQSU8gdHJhbnN0ZXIgKi8KLQkJZGV2X2RiZyhkZXYsICIlcyVkIGlzIG5vdCB1c2VkXG4iLAotCQkJcnNuZF9tb2RfbmFtZShtb2QpLCByc25kX21vZF9pZChtb2QpKTsKLQotCQlyZXR1cm4gMDsKLQl9Ci0KLQljbGtfZW5hYmxlKHNjdS0+Y2xrKTsKLQotCS8qIGl0IHVzZSBETUEgdHJhbnN0ZXIgKi8KLQotCXJldCA9IHJzbmRfc3JjX3NldF9yb3V0ZV9pZl9nZW4xKHByaXYsIG1vZCwgcmRhaSwgaW8pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gcnNuZF9zY3VfY29udmVydF9yYXRlX2N0cmwocHJpdiwgbW9kLCByZGFpLCBpbyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSByc25kX3NjdV90cmFuc2Zlcl9zdGFydChwcml2LCBtb2QsIHJkYWksIGlvKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWRldl9kYmcoZGV2LCAiJXMlZCBzdGFydFxuIiwgcnNuZF9tb2RfbmFtZShtb2QpLCByc25kX21vZF9pZChtb2QpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJzbmRfc2N1X3N0b3Aoc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCQkgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKLQkJCSAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCi17Ci0Jc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IHJzbmRfbW9kX3RvX3ByaXYobW9kKTsKLQlzdHJ1Y3QgcnNuZF9zY3UgKnNjdSA9IHJzbmRfbW9kX3RvX3NjdShtb2QpOwotCi0JaWYgKCFyc25kX3NjdV9ocGJpZl9pc19lbmFibGUobW9kKSkKLQkJcmV0dXJuIDA7Ci0KLQlyc25kX3NjdV90cmFuc2Zlcl9zdG9wKHByaXYsIG1vZCwgcmRhaSwgaW8pOwotCi0JY2xrX2Rpc2FibGUoc2N1LT5jbGspOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcnNuZF9tb2Rfb3BzIHJzbmRfc2N1X29wcyA9IHsKLQkubmFtZQk9ICJzY3UiLAotCS5zdGFydAk9IHJzbmRfc2N1X3N0YXJ0LAotCS5zdG9wCT0gcnNuZF9zY3Vfc3RvcCwKLX07Ci0KLXN0cnVjdCByc25kX21vZCAqcnNuZF9zY3VfbW9kX2dldChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LCBpbnQgaWQpCi17Ci0JaWYgKFdBUk5fT04oaWQgPCAwIHx8IGlkID49IHJzbmRfc2N1X25yKHByaXYpKSkKLQkJaWQgPSAwOwotCi0JcmV0dXJuICYoKHN0cnVjdCByc25kX3NjdSAqKShwcml2LT5zY3UpICsgaWQpLT5tb2Q7Ci19Ci0KLWludCByc25kX3NjdV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkgICBzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbywKLQkJICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc25kX3ByaXZfdG9fZGV2KHByaXYpOwotCXN0cnVjdCByc25kX3NjdSAqc2N1OwotCXN0cnVjdCBjbGsgKmNsazsKLQljaGFyIG5hbWVbUlNORF9TQ1VfTkFNRV9TSVpFXTsKLQlpbnQgaSwgbnI7Ci0KLQkvKgotCSAqIGluaXQgU0NVCi0JICovCi0JbnIJPSBpbmZvLT5zY3VfaW5mb19ucjsKLQlzY3UJPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnNjdSkgKiBuciwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzY3UpIHsKLQkJZGV2X2VycihkZXYsICJTQ1UgYWxsb2NhdGUgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcHJpdi0+c2N1X25yCT0gbnI7Ci0JcHJpdi0+c2N1CT0gc2N1OwotCi0JZm9yX2VhY2hfcnNuZF9zY3Uoc2N1LCBwcml2LCBpKSB7Ci0JCXNucHJpbnRmKG5hbWUsIFJTTkRfU0NVX05BTUVfU0laRSwgInNjdS4lZCIsIGkpOwotCi0JCWNsayA9IGRldm1fY2xrX2dldChkZXYsIG5hbWUpOwotCQlpZiAoSVNfRVJSKGNsaykpCi0JCQlyZXR1cm4gUFRSX0VSUihjbGspOwotCi0JCXJzbmRfbW9kX2luaXQocHJpdiwgJnNjdS0+bW9kLAotCQkJICAgICAgJnJzbmRfc2N1X29wcywgaSk7Ci0JCXNjdS0+aW5mbyA9ICZpbmZvLT5zY3VfaW5mb1tpXTsKLQkJc2N1LT5jbGsgPSBjbGs7Ci0KLQkJZGV2X2RiZyhkZXYsICJTQ1UlZCBwcm9iZWRcbiIsIGkpOwotCX0KLQlkZXZfZGJnKGRldiwgInNjdSBwcm9iZWRcbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcnNuZF9zY3VfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikKLXsKLX0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9yY2FyL3NyYy5jIGIvc291bmQvc29jL3NoL3JjYXIvc3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzMmI3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9zaC9yY2FyL3NyYy5jCkBAIC0wLDAgKzEsNzI3IEBACisvKgorICogUmVuZXNhcyBSLUNhciBTUkMgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgorICogS3VuaW5vcmkgTW9yaW1vdG8gPGt1bmlub3JpLm1vcmltb3RvLmd4QHJlbmVzYXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlICJyc25kLmgiCisKK3N0cnVjdCByc25kX3NyYyB7CisJc3RydWN0IHJzbmRfc3JjX3BsYXRmb3JtX2luZm8gKmluZm87IC8qIHJjYXJfc25kLmggKi8KKwlzdHJ1Y3QgcnNuZF9tb2QgbW9kOworCXN0cnVjdCBjbGsgKmNsazsKK307CisKKyNkZWZpbmUgUlNORF9TUkNfTkFNRV9TSVpFIDE2CisKKy8qCisgKiBBRElOUgorICovCisjZGVmaW5lIE9UQkxfMjQJCSgwIDw8IDE2KQorI2RlZmluZSBPVEJMXzIyCQkoMiA8PCAxNikKKyNkZWZpbmUgT1RCTF8yMAkJKDQgPDwgMTYpCisjZGVmaW5lIE9UQkxfMTgJCSg2IDw8IDE2KQorI2RlZmluZSBPVEJMXzE2CQkoOCA8PCAxNikKKworI2RlZmluZSByc25kX3NyY19tb2RlX2ZsYWdzKHApICgocCktPmluZm8tPmZsYWdzKQorI2RlZmluZSByc25kX3NyY19jb252ZXJ0X3JhdGUocCkgKChwKS0+aW5mby0+Y29udmVydF9yYXRlKQorI2RlZmluZSByc25kX21vZF90b19zcmMoX21vZCkJCQkJXAorCWNvbnRhaW5lcl9vZigoX21vZCksIHN0cnVjdCByc25kX3NyYywgbW9kKQorI2RlZmluZSByc25kX3NyY19ocGJpZl9pc19lbmFibGUoc3JjKQlcCisJKHJzbmRfc3JjX21vZGVfZmxhZ3Moc3JjKSAmIFJTTkRfU0NVX1VTRV9IUEJJRikKKyNkZWZpbmUgcnNuZF9zcmNfZG1hX2F2YWlsYWJsZShzcmMpIFwKKwlyc25kX2RtYV9hdmFpbGFibGUocnNuZF9tb2RfdG9fZG1hKCYoc3JjKS0+bW9kKSkKKworI2RlZmluZSBmb3JfZWFjaF9yc25kX3NyYyhwb3MsIHByaXYsIGkpCQkJCVwKKwlmb3IgKChpKSA9IDA7CQkJCQkJXAorCSAgICAgKChpKSA8IHJzbmRfc3JjX25yKHByaXYpKSAmJgkJCVwKKwkgICAgICgocG9zKSA9IChzdHJ1Y3QgcnNuZF9zcmMgKikocHJpdiktPnNyYyArIGkpOwlcCisJICAgICBpKyspCisKKworLyoKKyAqCQlpbWFnZSBvZiBTUkMgKFNhbXBsaW5nIFJhdGUgQ29udmVydGVyKQorICoKKyAqIDk2a0h6ICAgPC0+ICstLS0tLSsJNDhrSHoJKy0tLS0tKwkgNDhrSHoJKy0tLS0tLS0rCisgKiA0OGtIeiAgIDwtPiB8IFNSQyB8IDwtLS0tLS0+CXwgU1NJIHwJPC0tLS0tPgl8IGNvZGVjIHwKKyAqIDQ0LjFrSHogPC0+ICstLS0tLSsJCSstLS0tLSsJCSstLS0tLS0tKworICogLi4uCisgKgorICovCisKKy8qCisgKiBzcmMuYyBpcyBjYXJpbmcuLi4KKyAqCisgKiBHZW4xCisgKgorICogW21lbV0gLT4gW1NSVV0gLT4gW1NTSV0KKyAqICAgICAgICB8LS0tLS0tLS18CisgKgorICogR2VuMgorICoKKyAqIFttZW1dIC0+IFtTUkNdIC0+IFtTU0lVXSAtPiBbU1NJXQorICogICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLXwKKyAqLworCisvKgorICoJSG93IHRvIHVzZSBTUkMgYnlwYXNzIG1vZGUgZm9yIGRlYnVnZ2luZworICoKKyAqIFNSQyBoYXMgYnlwYXNzIG1vZGUsIGFuZCBpdCBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KKyAqIEluIEdlbjIgY2FzZSwKKyAqIFNSQ21fTU9ERSBjb250cm9scyB3aGV0aGVyIFNSQyBpcyB1c2VkIG9yIG5vdAorICogU1NJX01PREUwIGNvbnRyb2xzIHdoZXRoZXIgU1NJVSB3aGljaCByZWNlaXZlcyBTUkMgZGF0YQorICogaXMgdXNlZCBvciBub3QuCisgKiBCb3RoIFNSQ21fTU9ERS9TU0lfTU9ERTAgc2V0dGluZ3MgYXJlIG5lZWRlZCBpZiB5b3UgdXNlIFNSQywKKyAqIGJ1dCBTUkMgYnlwYXNzIG1vZGUgbmVlZHMgU1NJX01PREUwIG9ubHkuCisgKgorICogVGhpcyBkcml2ZXIgcmVxdWVzdAorICogc3RydWN0IHJzbmRfc3JjX3BsYXRmb3JtX2luZm8geworICoJdTMyIGZsYWdzOworICoJdTMyIGNvbnZlcnRfcmF0ZTsKKyAqIH0KKyAqCisgKiByc25kX3NyY19ocGJpZl9pc19lbmFibGUoKSB3aWxsIGJlIHRydWUKKyAqIGlmIGZsYWdzIGhhZCBSU05EX1NSQ19VU0VfSFBCSUYsCisgKiBhbmQgaXQgY29udHJvbHMgd2hldGhlciBTU0lVIGlzIHVzZWQgb3Igbm90LgorICoKKyAqIHJzbmRfc3JjX2NvbnZlcnRfcmF0ZSgpIGluZGljYXRlcworICogYWJvdmUgY29udmVydF9yYXRlLCBhbmQgaXQgY29udHJvbHMKKyAqIHdoZXRoZXIgU1JDIGlzIHVzZWQgb3Igbm90LgorICoKKyAqIGV4KSBkb2Vzbid0IHVzZSBTUkMKKyAqIHN0cnVjdCByc25kX3NyY19wbGF0Zm9ybV9pbmZvIGluZm8gPSB7CisgKgkuZmxhZ3MgPSAwLAorICoJLmNvbnZlcnRfcmF0ZSA9IDAsCisgKiB9OworICoKKyAqIGV4KSB1c2VzIFNSQworICogc3RydWN0IHJzbmRfc3JjX3BsYXRmb3JtX2luZm8gaW5mbyA9IHsKKyAqCS5mbGFncyA9IFJTTkRfU1JDX1VTRV9IUEJJRiwKKyAqCS5jb252ZXJ0X3JhdGUgPSA0ODAwMCwKKyAqIH07CisgKgorICogZXgpIHVzZXMgU1JDIGJ5cGFzcyBtb2RlCisgKiBzdHJ1Y3QgcnNuZF9zcmNfcGxhdGZvcm1faW5mbyBpbmZvID0geworICoJLmZsYWdzID0gUlNORF9TUkNfVVNFX0hQQklGLAorICoJLmNvbnZlcnRfcmF0ZSA9IDAsCisgKiB9OworICoKKyAqLworCisvKgorICoJCUdlbjEvR2VuMiBjb21tb24gZnVuY3Rpb25zCisgKi8KK2ludCByc25kX3NyY19zc2lfbW9kZV9pbml0KHN0cnVjdCByc25kX21vZCAqc3NpX21vZCwKKwkJCSAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KHNzaV9tb2QpOworCXN0cnVjdCByc25kX21vZCAqc3JjX21vZCA9IHJzbmRfaW9fdG9fbW9kX3NyYyhpbyk7CisJc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8gPSByc25kX3ByaXZfdG9faW5mbyhwcml2KTsKKwlpbnQgc3NpX2lkID0gcnNuZF9tb2RfaWQoc3NpX21vZCk7CisJaW50IGhhc19zcmMgPSAwOworCisJLyoKKwkgKiBTU0lfTU9ERTAKKwkgKi8KKwlpZiAoaW5mby0+ZGFpX2luZm8pIHsKKwkJaGFzX3NyYyA9ICEhc3JjX21vZDsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgcnNuZF9zcmMgKnNyYyA9IHJzbmRfbW9kX3RvX3NyYyhzcmNfbW9kKTsKKwkJaGFzX3NyYyA9IHJzbmRfc3JjX2hwYmlmX2lzX2VuYWJsZShzcmMpOworCX0KKworCXJzbmRfbW9kX2JzZXQoc3NpX21vZCwgU1NJX01PREUwLCAoMSA8PCBzc2lfaWQpLAorCQkgICAgICBoYXNfc3JjID8gMCA6ICgxIDw8IHNzaV9pZCkpOworCisJLyoKKwkgKiBTU0lfTU9ERTEKKwkgKi8KKwlpZiAocnNuZF9zc2lfaXNfcGluX3NoYXJpbmcoc3NpX21vZCkpIHsKKwkJaW50IHNoaWZ0ID0gLTE7CisJCXN3aXRjaCAoc3NpX2lkKSB7CisJCWNhc2UgMToKKwkJCXNoaWZ0ID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlzaGlmdCA9IDI7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJc2hpZnQgPSAxNjsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNoaWZ0ID49IDApCisJCQlyc25kX21vZF9ic2V0KHNzaV9tb2QsIFNTSV9NT0RFMSwKKwkJCQkgICAgICAweDMgPDwgc2hpZnQsCisJCQkJICAgICAgcnNuZF9kYWlfaXNfY2xrX21hc3RlcihyZGFpKSA/CisJCQkJICAgICAgMHgyIDw8IHNoaWZ0IDogMHgxIDw8IHNoaWZ0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJzbmRfc3JjX2VuYWJsZV9zc2lfaXJxKHN0cnVjdCByc25kX21vZCAqc3NpX21vZCwKKwkJCSAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IHJzbmRfbW9kX3RvX3ByaXYoc3NpX21vZCk7CisKKwkvKiBlbmFibGUgUElPIGludGVycnVwdCBpZiBHZW4yICovCisJaWYgKHJzbmRfaXNfZ2VuMihwcml2KSkKKwkJcnNuZF9tb2Rfd3JpdGUoc3NpX21vZCwgSU5UX0VOQUJMRSwgMHgwZjAwMDAwMCk7CisKKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgaW50IHJzbmRfc3JjX2dldF9zc2lfcmF0ZShzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAorCQkJCSAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvLAorCQkJCSAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUpCit7CisJc3RydWN0IHJzbmRfbW9kICpzcmNfbW9kID0gcnNuZF9pb190b19tb2Rfc3JjKGlvKTsKKwlzdHJ1Y3QgcnNuZF9zcmMgKnNyYzsKKwl1bnNpZ25lZCBpbnQgcmF0ZSA9IDA7CisKKwlpZiAoc3JjX21vZCkgeworCQlzcmMgPSByc25kX21vZF90b19zcmMoc3JjX21vZCk7CisKKwkJLyoKKwkJICogcmV0dXJuIGNvbnZlcnQgcmF0ZSBpZiBTUkMgaXMgdXNlZCwKKwkJICogb3RoZXJ3aXNlLCByZXR1cm4gcnVudGltZS0+cmF0ZSBhcyB1c3VhbAorCQkgKi8KKwkJcmF0ZSA9IHJzbmRfc3JjX2NvbnZlcnRfcmF0ZShzcmMpOworCX0KKworCWlmICghcmF0ZSkKKwkJcmF0ZSA9IHJ1bnRpbWUtPnJhdGU7CisKKwlyZXR1cm4gcmF0ZTsKK30KKworc3RhdGljIGludCByc25kX3NyY19zZXRfY29udmVydF9yYXRlKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJCSAgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJCSAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHJzbmRfaW9fdG9fcnVudGltZShpbyk7CisJc3RydWN0IHJzbmRfc3JjICpzcmMgPSByc25kX21vZF90b19zcmMobW9kKTsKKwl1MzIgY29udmVydF9yYXRlID0gcnNuZF9zcmNfY29udmVydF9yYXRlKHNyYyk7CisJdTMyIGFkaW5yID0gcnVudGltZS0+Y2hhbm5lbHM7CisJdTMyIGZzcmF0ZSA9IDA7CisKKwlpZiAoY29udmVydF9yYXRlKQorCQlmc3JhdGUgPSAweDA0MDAwMDAgLyBjb252ZXJ0X3JhdGUgKiBydW50aW1lLT5yYXRlOworCisJLyogc2V0L2NsZWFyIHNvZnQgcmVzZXQgKi8KKwlyc25kX21vZF93cml0ZShtb2QsIFNSQ19TV1JTUiwgMCk7CisJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfU1dSU1IsIDEpOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBvcGVyYXRpb24gb2YgdGhlIFNSQyBpbnRlcm5hbCBjaXJjdWl0cworCSAqIHNlZSByc25kX3NyY19zdGFydCgpCisJICovCisJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfU1JDSVIsIDEpOworCisJLyogU2V0IGNoYW5uZWwgbnVtYmVyIGFuZCBvdXRwdXQgYml0IGxlbmd0aCAqLworCXN3aXRjaCAocnVudGltZS0+c2FtcGxlX2JpdHMpIHsKKwljYXNlIDE2OgorCQlhZGluciB8PSBPVEJMXzE2OworCQlicmVhazsKKwljYXNlIDMyOgorCQlhZGluciB8PSBPVEJMXzI0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTzsKKwl9CisJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfQURJTlIsIGFkaW5yKTsKKworCS8qIEVuYWJsZSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBJRlMgKi8KKwlpZiAoZnNyYXRlKSB7CisJCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX0lGU0NSLCAxKTsKKworCQkvKiBTZXQgaW5pdGlhbCB2YWx1ZSBvZiBJRlMgKi8KKwkJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfSUZTVlIsIGZzcmF0ZSk7CisJfQorCisJLyogdXNlIERNQSB0cmFuc2ZlciAqLworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX0JVU0lGX01PREUsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNuZF9zcmNfaW5pdChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCSBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHJzbmRfc3JjICpzcmMgPSByc25kX21vZF90b19zcmMobW9kKTsKKworCWNsa19lbmFibGUoc3JjLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNuZF9zcmNfcXVpdChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCSBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHJzbmRfc3JjICpzcmMgPSByc25kX21vZF90b19zcmMobW9kKTsKKworCWNsa19kaXNhYmxlKHNyYy0+Y2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJzbmRfc3JjX3N0YXJ0KHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCXN0cnVjdCByc25kX3NyYyAqc3JjID0gcnNuZF9tb2RfdG9fc3JjKG1vZCk7CisKKwkvKgorCSAqIENhbmNlbCB0aGUgaW5pdGlhbGl6YXRpb24gYW5kIG9wZXJhdGUgdGhlIFNSQyBmdW5jdGlvbgorCSAqIHNlZSByc25kX3NyY19zZXRfY29udmVydF9yYXRlKCkKKwkgKi8KKwlyc25kX21vZF93cml0ZShtb2QsIFNSQ19TUkNJUiwgMCk7CisKKwlpZiAocnNuZF9zcmNfY29udmVydF9yYXRlKHNyYykpCisJCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX1JPVVRFX01PREUwLCAxKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcnNuZF9zcmNfc3RvcChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCSBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHJzbmRfc3JjICpzcmMgPSByc25kX21vZF90b19zcmMobW9kKTsKKworCWlmIChyc25kX3NyY19jb252ZXJ0X3JhdGUoc3JjKSkKKwkJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfUk9VVEVfTU9ERTAsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnNuZF9tb2Rfb3BzIHJzbmRfc3JjX25vbl9vcHMgPSB7CisJLm5hbWUJPSAic3JjIChub24pIiwKK307CisKKy8qCisgKgkJR2VuMSBmdW5jdGlvbnMKKyAqLworc3RhdGljIGludCByc25kX3NyY19zZXRfcm91dGVfZ2VuMShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCQkgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkJICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHNyY19yb3V0ZV9jb25maWcgeworCQl1MzIgbWFzazsKKwkJaW50IHNoaWZ0OworCX0gcm91dGVzW10gPSB7CisJCXsgMHhGLCAgMCwgfSwgLyogMCAqLworCQl7IDB4RiwgIDQsIH0sIC8qIDEgKi8KKwkJeyAweEYsICA4LCB9LCAvKiAyICovCisJCXsgMHg3LCAxMiwgfSwgLyogMyAqLworCQl7IDB4NywgMTYsIH0sIC8qIDQgKi8KKwkJeyAweDcsIDIwLCB9LCAvKiA1ICovCisJCXsgMHg3LCAyNCwgfSwgLyogNiAqLworCQl7IDB4MywgMjgsIH0sIC8qIDcgKi8KKwkJeyAweDMsIDMwLCB9LCAvKiA4ICovCisJfTsKKwl1MzIgbWFzazsKKwl1MzIgdmFsOworCWludCBpZDsKKworCWlkID0gcnNuZF9tb2RfaWQobW9kKTsKKwlpZiAoaWQgPCAwIHx8IGlkID49IEFSUkFZX1NJWkUocm91dGVzKSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKgorCSAqIFNSQ19ST1VURV9TRUxFQ1QKKwkgKi8KKwl2YWwgPSByc25kX2RhaV9pc19wbGF5KHJkYWksIGlvKSA/IDB4MSA6IDB4MjsKKwl2YWwgPSB2YWwJCTw8IHJvdXRlc1tpZF0uc2hpZnQ7CisJbWFzayA9IHJvdXRlc1tpZF0ubWFzawk8PCByb3V0ZXNbaWRdLnNoaWZ0OworCisJcnNuZF9tb2RfYnNldChtb2QsIFNSQ19ST1VURV9TRUwsIG1hc2ssIHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByc25kX3NyY19zZXRfY29udmVydF90aW1pbmdfZ2VuMShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCQkJICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCQkJICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7CisJc3RydWN0IHJzbmRfc3JjICpzcmMgPSByc25kX21vZF90b19zcmMobW9kKTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gcnNuZF9pb190b19ydW50aW1lKGlvKTsKKwl1MzIgY29udmVydF9yYXRlID0gcnNuZF9zcmNfY29udmVydF9yYXRlKHNyYyk7CisJdTMyIG1hc2s7CisJdTMyIHZhbDsKKwlpbnQgc2hpZnQ7CisJaW50IGlkID0gcnNuZF9tb2RfaWQobW9kKTsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBTUkNfVElNSU5HX1NFTEVDVAorCSAqLworCXNoaWZ0CT0gKGlkICUgNCkgKiA4OworCW1hc2sJPSAweDFGIDw8IHNoaWZ0OworCisJLyoKKwkgKiBBREcgaXMgdXNlZCBhcyBzb3VyY2UgY2xvY2sgaWYgU1JDIHdhcyB1c2VkLAorCSAqIHRoZW4sIFNTSSBXUyBpcyB1c2VkIGFzIGRlc3RpbmF0aW9uIGNsb2NrLgorCSAqIFNTSSBXUyBpcyB1c2VkIGFzIHNvdXJjZSBjbG9jayBpZiBTUkMgaXMgbm90IHVzZWQKKwkgKiAod2hlbiBwbGF5YmFjaywgc291cmNlL2Rlc3RpbmF0aW9uIGJlY29tZSByZXZlcnNlIHdoZW4gY2FwdHVyZSkKKwkgKi8KKwlyZXQgPSAwOworCWlmIChjb252ZXJ0X3JhdGUpIHsKKwkJLyogdXNlIEFERyAqLworCQl2YWwgPSAwOworCQlyZXQgPSByc25kX2FkZ19zZXRfY29udmVydF9jbGtfZ2VuMShwcml2LCBtb2QsCisJCQkJCQkgICAgcnVudGltZS0+cmF0ZSwKKwkJCQkJCSAgICBjb252ZXJ0X3JhdGUpOworCX0gZWxzZSBpZiAoOCA9PSBpZCkgeworCQkvKiB1c2UgU1NJIFdTLCBidXQgU1JVOCBpcyBzcGVjaWFsICovCisJCXZhbCA9IGlkIDw8IHNoaWZ0OworCX0gZWxzZSB7CisJCS8qIHVzZSBTU0kgV1MgKi8KKwkJdmFsID0gKGlkICsgMSkgPDwgc2hpZnQ7CisJfQorCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKGlkIC8gNCkgeworCWNhc2UgMDoKKwkJcnNuZF9tb2RfYnNldChtb2QsIFNSQ19UTUdfU0VMMCwgbWFzaywgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlyc25kX21vZF9ic2V0KG1vZCwgU1JDX1RNR19TRUwxLCBtYXNrLCB2YWwpOworCQlicmVhazsKKwljYXNlIDI6CisJCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNfVE1HX1NFTDIsIG1hc2ssIHZhbCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJzbmRfc3JjX3NldF9jb252ZXJ0X3JhdGVfZ2VuMShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCQkJICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkJCSAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJaW50IHJldDsKKworCXJldCA9IHJzbmRfc3JjX3NldF9jb252ZXJ0X3JhdGUobW9kLCByZGFpLCBpbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBTZWxlY3QgU1JDIG1vZGUgKGZpeGVkIHZhbHVlKSAqLworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX1NSQ0NSLCAweDAwMDEwMTEwKTsKKworCS8qIFNldCB0aGUgcmVzdHJpY3Rpb24gdmFsdWUgb2YgdGhlIEZTIHJhdGlvICg5OCUpICovCisJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfTU5GU1IsCisJCSAgICAgICByc25kX21vZF9yZWFkKG1vZCwgU1JDX0lGU1ZSKSAvIDEwMCAqIDk4KTsKKworCS8qIG5vIFNSQ19CRlNTUiBzZXR0aW5ncywgc2luY2UgU1JDX1NSQ0NSOjpCVUZNRCBpcyAwICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByc25kX3NyY19pbml0X2dlbjEoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcnNuZF9zcmNfaW5pdChtb2QsIHJkYWksIGlvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHJzbmRfc3JjX3NldF9yb3V0ZV9nZW4xKG1vZCwgcmRhaSwgaW8pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcnNuZF9zcmNfc2V0X2NvbnZlcnRfcmF0ZV9nZW4xKG1vZCwgcmRhaSwgaW8pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcnNuZF9zcmNfc2V0X2NvbnZlcnRfdGltaW5nX2dlbjEobW9kLCByZGFpLCBpbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByc25kX3NyY19zdGFydF9nZW4xKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJICAgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSAgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlpbnQgaWQgPSByc25kX21vZF9pZChtb2QpOworCisJcnNuZF9tb2RfYnNldChtb2QsIFNSQ19ST1VURV9DVFJMLCAoMSA8PCBpZCksICgxIDw8IGlkKSk7CisKKwlyZXR1cm4gcnNuZF9zcmNfc3RhcnQobW9kLCByZGFpLCBpbyk7Cit9CisKK3N0YXRpYyBpbnQgcnNuZF9zcmNfc3RvcF9nZW4xKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJICAgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJICAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJaW50IGlkID0gcnNuZF9tb2RfaWQobW9kKTsKKworCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNfUk9VVEVfQ1RSTCwgKDEgPDwgaWQpLCAwKTsKKworCXJldHVybiByc25kX3NyY19zdG9wKG1vZCwgcmRhaSwgaW8pOworfQorCitzdGF0aWMgc3RydWN0IHJzbmRfbW9kX29wcyByc25kX3NyY19nZW4xX29wcyA9IHsKKwkubmFtZQk9ICJzcnUgKGdlbjEpIiwKKwkuaW5pdAk9IHJzbmRfc3JjX2luaXRfZ2VuMSwKKwkucXVpdAk9IHJzbmRfc3JjX3F1aXQsCisJLnN0YXJ0CT0gcnNuZF9zcmNfc3RhcnRfZ2VuMSwKKwkuc3RvcAk9IHJzbmRfc3JjX3N0b3BfZ2VuMSwKK307CisKKy8qCisgKgkJR2VuMiBmdW5jdGlvbnMKKyAqLworc3RhdGljIGludCByc25kX3NyY19zZXRfY29udmVydF9yYXRlX2dlbjIoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkJCSAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJCQkgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCWludCByZXQ7CisKKwlyZXQgPSByc25kX3NyY19zZXRfY29udmVydF9yYXRlKG1vZCwgcmRhaSwgaW8pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcnNuZF9tb2Rfd3JpdGUobW9kLCBTU0lfQlVTSUZfQURJTlIsIHJzbmRfbW9kX3JlYWQobW9kLCBTUkNfQURJTlIpKTsKKwlyc25kX21vZF93cml0ZShtb2QsIFNTSV9CVVNJRl9NT0RFLCAgcnNuZF9tb2RfcmVhZChtb2QsIFNSQ19CVVNJRl9NT0RFKSk7CisKKwlyc25kX21vZF93cml0ZShtb2QsIFNSQ19TUkNDUiwgMHgwMDAxMTExMCk7CisKKwlyc25kX21vZF93cml0ZShtb2QsIFNSQ19CU0RTUiwgMHgwMTgwMDAwMCk7CisJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfQlNJU1IsIDB4MDAxMDAwNjApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNuZF9zcmNfc2V0X2NvbnZlcnRfdGltaW5nX2dlbjIoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkJCSAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkJCSAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gcnNuZF9pb190b19ydW50aW1lKGlvKTsKKwlzdHJ1Y3QgcnNuZF9zcmMgKnNyYyA9IHJzbmRfbW9kX3RvX3NyYyhtb2QpOworCXUzMiBjb252ZXJ0X3JhdGUgPSByc25kX3NyY19jb252ZXJ0X3JhdGUoc3JjKTsKKwlpbnQgcmV0OworCisJaWYgKGNvbnZlcnRfcmF0ZSkKKwkJcmV0ID0gcnNuZF9hZGdfc2V0X2NvbnZlcnRfY2xrX2dlbjIobW9kLCByZGFpLCBpbywKKwkJCQkJCSAgICBydW50aW1lLT5yYXRlLAorCQkJCQkJICAgIGNvbnZlcnRfcmF0ZSk7CisJZWxzZQorCQlyZXQgPSByc25kX2FkZ19zZXRfY29udmVydF90aW1pbmdfZ2VuMihtb2QsIHJkYWksIGlvKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnNuZF9zcmNfcHJvYmVfZ2VuMihzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCSAgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgICAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IHJzbmRfbW9kX3RvX3ByaXYobW9kKTsKKwlzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbyA9IHJzbmRfcHJpdl90b19pbmZvKHByaXYpOworCXN0cnVjdCByc25kX3NyYyAqc3JjID0gcnNuZF9tb2RfdG9fc3JjKG1vZCk7CisJc3RydWN0IHJzbmRfbW9kICpzc2kgPSByc25kX3NzaV9tb2RfZ2V0KHByaXYsIHJzbmRfbW9kX2lkKG1vZCkpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CisJaW50IHJldDsKKwlpbnQgaXNfcGxheTsKKworCWlmIChpbmZvLT5kYWlfaW5mbykKKwkJaXNfcGxheSA9IHJzbmRfaW5mb19pc19wbGF5YmFjayhwcml2LCBzcmMpOworCWVsc2UKKwkJaXNfcGxheSA9IHJzbmRfc3NpX2lzX3BsYXkoc3NpKTsKKworCXJldCA9IHJzbmRfZG1hX2luaXQocHJpdiwKKwkJCSAgICByc25kX21vZF90b19kbWEobW9kKSwKKwkJCSAgICBpc19wbGF5LAorCQkJICAgIHNyYy0+aW5mby0+ZG1hX2lkKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihkZXYsICJTUkMgRE1BIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJzbmRfc3JjX3JlbW92ZV9nZW4yKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJCXN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCQlzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlyc25kX2RtYV9xdWl0KHJzbmRfbW9kX3RvX3ByaXYobW9kKSwgcnNuZF9tb2RfdG9fZG1hKG1vZCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNuZF9zcmNfaW5pdF9nZW4yKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJICAgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJICAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJaW50IHJldDsKKworCXJldCA9IHJzbmRfc3JjX2luaXQobW9kLCByZGFpLCBpbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSByc25kX3NyY19zZXRfY29udmVydF9yYXRlX2dlbjIobW9kLCByZGFpLCBpbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSByc25kX3NyY19zZXRfY29udmVydF90aW1pbmdfZ2VuMihtb2QsIHJkYWksIGlvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJzbmRfc3JjX3N0YXJ0X2dlbjIoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkgICAgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJICAgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCXN0cnVjdCByc25kX3NyYyAqc3JjID0gcnNuZF9tb2RfdG9fc3JjKG1vZCk7CisKKwlyc25kX2RtYV9zdGFydChyc25kX21vZF90b19kbWEoJnNyYy0+bW9kKSk7CisKKwlyc25kX21vZF93cml0ZShtb2QsIFNTSV9DVFJMLCAweDEpOworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX0NUUkwsIDB4MTEpOworCisJcmV0dXJuIHJzbmRfc3JjX3N0YXJ0KG1vZCwgcmRhaSwgaW8pOworfQorCitzdGF0aWMgaW50IHJzbmRfc3JjX3N0b3BfZ2VuMihzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCSAgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSAgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCXN0cnVjdCByc25kX3NyYyAqc3JjID0gcnNuZF9tb2RfdG9fc3JjKG1vZCk7CisKKwlyc25kX21vZF93cml0ZShtb2QsIFNTSV9DVFJMLCAwKTsKKwlyc25kX21vZF93cml0ZShtb2QsIFNSQ19DVFJMLCAwKTsKKworCXJzbmRfZG1hX3N0b3AocnNuZF9tb2RfdG9fZG1hKCZzcmMtPm1vZCkpOworCisJcmV0dXJuIHJzbmRfc3JjX3N0b3AobW9kLCByZGFpLCBpbyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnNuZF9tb2Rfb3BzIHJzbmRfc3JjX2dlbjJfb3BzID0geworCS5uYW1lCT0gInNyYyAoZ2VuMikiLAorCS5wcm9iZQk9IHJzbmRfc3JjX3Byb2JlX2dlbjIsCisJLnJlbW92ZQk9IHJzbmRfc3JjX3JlbW92ZV9nZW4yLAorCS5pbml0CT0gcnNuZF9zcmNfaW5pdF9nZW4yLAorCS5xdWl0CT0gcnNuZF9zcmNfcXVpdCwKKwkuc3RhcnQJPSByc25kX3NyY19zdGFydF9nZW4yLAorCS5zdG9wCT0gcnNuZF9zcmNfc3RvcF9nZW4yLAorfTsKKworc3RydWN0IHJzbmRfbW9kICpyc25kX3NyY19tb2RfZ2V0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsIGludCBpZCkKK3sKKwlpZiAoV0FSTl9PTihpZCA8IDAgfHwgaWQgPj0gcnNuZF9zcmNfbnIocHJpdikpKQorCQlpZCA9IDA7CisKKwlyZXR1cm4gJigoc3RydWN0IHJzbmRfc3JjICopKHByaXYtPnNyYykgKyBpZCktPm1vZDsKK30KKworc3RhdGljIHZvaWQgcnNuZF9vZl9wYXJzZV9zcmMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCByc25kX29mX2RhdGEgKm9mX2RhdGEsCisJCQkgICAgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc3JjX25vZGU7CisJc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8gPSByc25kX3ByaXZfdG9faW5mbyhwcml2KTsKKwlzdHJ1Y3QgcnNuZF9zcmNfcGxhdGZvcm1faW5mbyAqc3JjX2luZm87CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlpbnQgbnI7CisKKwlpZiAoIW9mX2RhdGEpCisJCXJldHVybjsKKworCXNyY19ub2RlID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUoZGV2LT5vZl9ub2RlLCAicmNhcl9zb3VuZCxzcmMiKTsKKwlpZiAoIXNyY19ub2RlKQorCQlyZXR1cm47CisKKwluciA9IG9mX2dldF9jaGlsZF9jb3VudChzcmNfbm9kZSk7CisJaWYgKCFucikKKwkJcmV0dXJuOworCisJc3JjX2luZm8gPSBkZXZtX2t6YWxsb2MoZGV2LAorCQkJCXNpemVvZihzdHJ1Y3QgcnNuZF9zcmNfcGxhdGZvcm1faW5mbykgKiBuciwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXNyY19pbmZvKSB7CisJCWRldl9lcnIoZGV2LCAic3JjIGluZm8gYWxsb2NhdGlvbiBlcnJvclxuIik7CisJCXJldHVybjsKKwl9CisKKwlpbmZvLT5zcmNfaW5mbwkJPSBzcmNfaW5mbzsKKwlpbmZvLT5zcmNfaW5mb19ucgk9IG5yOworfQorCitpbnQgcnNuZF9zcmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJICAgY29uc3Qgc3RydWN0IHJzbmRfb2ZfZGF0YSAqb2ZfZGF0YSwKKwkJICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbyA9IHJzbmRfcHJpdl90b19pbmZvKHByaXYpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CisJc3RydWN0IHJzbmRfc3JjICpzcmM7CisJc3RydWN0IHJzbmRfbW9kX29wcyAqb3BzOworCXN0cnVjdCBjbGsgKmNsazsKKwljaGFyIG5hbWVbUlNORF9TUkNfTkFNRV9TSVpFXTsKKwlpbnQgaSwgbnI7CisKKwlyc25kX29mX3BhcnNlX3NyYyhwZGV2LCBvZl9kYXRhLCBwcml2KTsKKworCS8qCisJICogaW5pdCBTUkMKKwkgKi8KKwlucgk9IGluZm8tPnNyY19pbmZvX25yOworCWlmICghbnIpCisJCXJldHVybiAwOworCisJc3JjCT0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzcmMpICogbnIsIEdGUF9LRVJORUwpOworCWlmICghc3JjKSB7CisJCWRldl9lcnIoZGV2LCAiU1JDIGFsbG9jYXRlIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByaXYtPnNyY19ucgk9IG5yOworCXByaXYtPnNyYwk9IHNyYzsKKworCWZvcl9lYWNoX3JzbmRfc3JjKHNyYywgcHJpdiwgaSkgeworCQlzbnByaW50ZihuYW1lLCBSU05EX1NSQ19OQU1FX1NJWkUsICJzcmMuJWQiLCBpKTsKKworCQljbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCBuYW1lKTsKKwkJaWYgKElTX0VSUihjbGspKSB7CisJCQlzbnByaW50ZihuYW1lLCBSU05EX1NSQ19OQU1FX1NJWkUsICJzY3UuJWQiLCBpKTsKKwkJCWNsayA9IGRldm1fY2xrX2dldChkZXYsIG5hbWUpOworCQl9CisKKwkJaWYgKElTX0VSUihjbGspKQorCQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKworCQlzcmMtPmluZm8gPSAmaW5mby0+c3JjX2luZm9baV07CisJCXNyYy0+Y2xrID0gY2xrOworCisJCW9wcyA9ICZyc25kX3NyY19ub25fb3BzOworCQlpZiAocnNuZF9zcmNfaHBiaWZfaXNfZW5hYmxlKHNyYykpIHsKKwkJCWlmIChyc25kX2lzX2dlbjEocHJpdikpCisJCQkJb3BzID0gJnJzbmRfc3JjX2dlbjFfb3BzOworCQkJaWYgKHJzbmRfaXNfZ2VuMihwcml2KSkKKwkJCQlvcHMgPSAmcnNuZF9zcmNfZ2VuMl9vcHM7CisJCX0KKworCQlyc25kX21vZF9pbml0KHByaXYsICZzcmMtPm1vZCwgb3BzLCBSU05EX01PRF9TUkMsIGkpOworCisJCWRldl9kYmcoZGV2LCAiU1JDJWQgcHJvYmVkXG4iLCBpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9yY2FyL3NzaS5jIGIvc291bmQvc29jL3NoL3JjYXIvc3NpLmMKaW5kZXggNGI4Y2Y3Yy4uNGI3ZTIwNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL3JjYXIvc3NpLmMKKysrIGIvc291bmQvc29jL3NoL3JjYXIvc3NpLmMKQEAgLTY0LDEwOCArNjQsMjkgQEAKIAlzdHJ1Y3QgcnNuZF9tb2QgbW9kOwogCiAJc3RydWN0IHJzbmRfZGFpICpyZGFpOwotCXN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvOwogCXUzMiBjcl9vd247CiAJdTMyIGNyX2NsazsKIAl1MzIgY3JfZXRjOwogCWludCBlcnI7Ci0JaW50IGRtYV9vZmZzZXQ7CiAJdW5zaWduZWQgaW50IHVzcmNudDsKIAl1bnNpZ25lZCBpbnQgcmF0ZTsKIH07CiAKLXN0cnVjdCByc25kX3NzaXUgewotCXUzMiBzc2lfbW9kZTA7Ci0JdTMyIHNzaV9tb2RlMTsKLQotCWludCBzc2lfbnI7Ci0Jc3RydWN0IHJzbmRfc3NpICpzc2k7Ci19OwotCiAjZGVmaW5lIGZvcl9lYWNoX3JzbmRfc3NpKHBvcywgcHJpdiwgaSkJCQkJCVwKIAlmb3IgKGkgPSAwOwkJCQkJCQlcCiAJICAgICAoaSA8IHJzbmRfc3NpX25yKHByaXYpKSAmJgkJCQkJXAotCQkoKHBvcykgPSAoKHN0cnVjdCByc25kX3NzaXUgKikoKHByaXYpLT5zc2l1KSktPnNzaSArIGkpOyBcCisJCSgocG9zKSA9ICgoc3RydWN0IHJzbmRfc3NpICopKHByaXYpLT5zc2kgKyBpKSk7CQlcCiAJICAgICBpKyspCiAKLSNkZWZpbmUgcnNuZF9zc2lfbnIocHJpdikgKCgoc3RydWN0IHJzbmRfc3NpdSAqKSgocHJpdiktPnNzaXUpKS0+c3NpX25yKQorI2RlZmluZSByc25kX3NzaV9ucihwcml2KSAoKHByaXYpLT5zc2lfbnIpCiAjZGVmaW5lIHJzbmRfbW9kX3RvX3NzaShfbW9kKSBjb250YWluZXJfb2YoKF9tb2QpLCBzdHJ1Y3QgcnNuZF9zc2ksIG1vZCkKICNkZWZpbmUgcnNuZF9kbWFfdG9fc3NpKGRtYSkgIHJzbmRfbW9kX3RvX3NzaShyc25kX2RtYV90b19tb2QoZG1hKSkKICNkZWZpbmUgcnNuZF9zc2lfcGlvX2F2YWlsYWJsZShzc2kpICgoc3NpKS0+aW5mby0+cGlvX2lycSA+IDApCiAjZGVmaW5lIHJzbmRfc3NpX2RtYV9hdmFpbGFibGUoc3NpKSBcCiAJcnNuZF9kbWFfYXZhaWxhYmxlKHJzbmRfbW9kX3RvX2RtYSgmKHNzaSktPm1vZCkpCiAjZGVmaW5lIHJzbmRfc3NpX2Nsa19mcm9tX3BhcmVudChzc2kpICgoc3NpKS0+cGFyZW50KQotI2RlZmluZSByc25kX3JkYWlfaXNfY2xrX21hc3RlcihyZGFpKSAoKHJkYWkpLT5jbGtfbWFzdGVyKQogI2RlZmluZSByc25kX3NzaV9tb2RlX2ZsYWdzKHApICgocCktPmluZm8tPmZsYWdzKQogI2RlZmluZSByc25kX3NzaV9kYWlfaWQoc3NpKSAoKHNzaSktPmluZm8tPmRhaV9pZCkKLSNkZWZpbmUgcnNuZF9zc2lfdG9fc3NpdShzc2kpXAotCSgoKHN0cnVjdCByc25kX3NzaXUgKikoKHNzaSkgLSByc25kX21vZF9pZCgmKHNzaSktPm1vZCkpKSAtIDEpCi0KLXN0YXRpYyB2b2lkIHJzbmRfc3NpX21vZGVfc2V0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCi0JCQkgICAgICBzdHJ1Y3QgcnNuZF9zc2kgKnNzaSkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc25kX3ByaXZfdG9fZGV2KHByaXYpOwotCXN0cnVjdCByc25kX21vZCAqc2N1OwotCXN0cnVjdCByc25kX3NzaXUgKnNzaXUgPSByc25kX3NzaV90b19zc2l1KHNzaSk7Ci0JaW50IGlkID0gcnNuZF9tb2RfaWQoJnNzaS0+bW9kKTsKLQl1MzIgZmxhZ3M7Ci0JdTMyIHZhbDsKLQotCXNjdSAgID0gcnNuZF9zY3VfbW9kX2dldChwcml2LCByc25kX21vZF9pZCgmc3NpLT5tb2QpKTsKLQotCS8qCi0JICogU1NJX01PREUwCi0JICovCi0KLQkvKiBzZWUgYWxzbyBCVVNJRl9NT0RFICovCi0JaWYgKHJzbmRfc2N1X2hwYmlmX2lzX2VuYWJsZShzY3UpKSB7Ci0JCXNzaXUtPnNzaV9tb2RlMCAmPSB+KDEgPDwgaWQpOwotCQlkZXZfZGJnKGRldiwgIlNTSSVkIHVzZXMgREVQRU5ERU5UIG1vZGVcbiIsIGlkKTsKLQl9IGVsc2UgewotCQlzc2l1LT5zc2lfbW9kZTAgfD0gKDEgPDwgaWQpOwotCQlkZXZfZGJnKGRldiwgIlNTSSVkIHVzZXMgSU5ERVBFTkRFTlQgbW9kZVxuIiwgaWQpOwotCX0KLQotCS8qCi0JICogU1NJX01PREUxCi0JICovCi0jZGVmaW5lIHNzaV9wYXJlbnRfc2V0KHAsIHN5bmMsIGFkZywgZXh0KQkJXAotCWRvIHsJCQkJCQlcCi0JCXNzaS0+cGFyZW50ID0gc3NpdS0+c3NpICsgcDsJCVwKLQkJaWYgKHJzbmRfcmRhaV9pc19jbGtfbWFzdGVyKHJkYWkpKQlcCi0JCQl2YWwgPSBhZGc7CQkJXAotCQllbHNlCQkJCQlcCi0JCQl2YWwgPSBleHQ7CQkJXAotCQlpZiAoZmxhZ3MgJiBSU05EX1NTSV9TWU5DKQkJXAotCQkJdmFsIHw9IHN5bmM7CQkJXAotCX0gd2hpbGUgKDApCi0KLQlmbGFncyA9IHJzbmRfc3NpX21vZGVfZmxhZ3Moc3NpKTsKLQlpZiAoZmxhZ3MgJiBSU05EX1NTSV9DTEtfUElOX1NIQVJFKSB7Ci0KLQkJdmFsID0gMDsKLQkJc3dpdGNoIChpZCkgewotCQljYXNlIDE6Ci0JCQlzc2lfcGFyZW50X3NldCgwLCAoMSA8PCA0KSwgKDB4MiA8PCAwKSwgKDB4MSA8PCAwKSk7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJc3NpX3BhcmVudF9zZXQoMCwgKDEgPDwgNCksICgweDIgPDwgMiksICgweDEgPDwgMikpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCXNzaV9wYXJlbnRfc2V0KDMsICgxIDw8IDIwKSwgKDB4MiA8PCAxNiksICgweDEgPDwgMTYpKTsKLQkJCWJyZWFrOwotCQljYXNlIDg6Ci0JCQlzc2lfcGFyZW50X3NldCg3LCAwLCAwLCAwKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3NpdS0+c3NpX21vZGUxIHw9IHZhbDsKLQl9Ci0KLQlyc25kX21vZF93cml0ZSgmc3NpLT5tb2QsIFNTSV9NT0RFMCwgc3NpdS0+c3NpX21vZGUwKTsKLQlyc25kX21vZF93cml0ZSgmc3NpLT5tb2QsIFNTSV9NT0RFMSwgc3NpdS0+c3NpX21vZGUxKTsKLX0KIAogc3RhdGljIHZvaWQgcnNuZF9zc2lfc3RhdHVzX2NoZWNrKHN0cnVjdCByc25kX21vZCAqbW9kLAogCQkJCSAgdTMyIGJpdCkKQEAgLTIwMCw3ICsxMjEsNyBAQAogCQkxLCAyLCA0LCA4LCAxNiwgNiwgMTIsCiAJfTsKIAl1bnNpZ25lZCBpbnQgbWFpbl9yYXRlOwotCXVuc2lnbmVkIGludCByYXRlID0gcnNuZF9zY3VfZ2V0X3NzaV9yYXRlKHByaXYsICZzc2ktPm1vZCwgcnVudGltZSk7CisJdW5zaWduZWQgaW50IHJhdGUgPSByc25kX3NyY19nZXRfc3NpX3JhdGUocHJpdiwgaW8sIHJ1bnRpbWUpOwogCiAJLyoKIAkgKiBGaW5kIGJlc3QgY2xvY2ssIGFuZCB0cnkgdG8gc3RhcnQgQURHCkBAIC0yNTIsNyArMTczLDcgQEAKIAlpZiAoMCA9PSBzc2ktPnVzcmNudCkgewogCQljbGtfZW5hYmxlKHNzaS0+Y2xrKTsKIAotCQlpZiAocnNuZF9yZGFpX2lzX2Nsa19tYXN0ZXIocmRhaSkpIHsKKwkJaWYgKHJzbmRfZGFpX2lzX2Nsa19tYXN0ZXIocmRhaSkpIHsKIAkJCWlmIChyc25kX3NzaV9jbGtfZnJvbV9wYXJlbnQoc3NpKSkKIAkJCQlyc25kX3NzaV9od19zdGFydChzc2ktPnBhcmVudCwgcmRhaSwgaW8pOwogCQkJZWxzZQpAQCAtMzAyLDcgKzIyMyw3IEBACiAJCXJzbmRfbW9kX3dyaXRlKCZzc2ktPm1vZCwgU1NJQ1IsIGNyKTsJLyogZGlzYWJsZWQgYWxsICovCiAJCXJzbmRfc3NpX3N0YXR1c19jaGVjaygmc3NpLT5tb2QsIElJUlEpOwogCi0JCWlmIChyc25kX3JkYWlfaXNfY2xrX21hc3RlcihyZGFpKSkgeworCQlpZiAocnNuZF9kYWlfaXNfY2xrX21hc3RlcihyZGFpKSkgewogCQkJaWYgKHJzbmRfc3NpX2Nsa19mcm9tX3BhcmVudChzc2kpKQogCQkJCXJzbmRfc3NpX2h3X3N0b3Aoc3NpLT5wYXJlbnQsIHJkYWkpOwogCQkJZWxzZQpAQCAtMzIzLDggKzI0NCw2IEBACiAJCQkgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCiB7CiAJc3RydWN0IHJzbmRfc3NpICpzc2kgPSByc25kX21vZF90b19zc2kobW9kKTsKLQlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHJzbmRfaW9fdG9fcnVudGltZShpbyk7CiAJdTMyIGNyOwogCkBAIC0zNjUsMTMgKzI4NCwxMCBAQAogCSAqIHNldCBzc2kgcGFyYW1ldGVyCiAJICovCiAJc3NpLT5yZGFpCT0gcmRhaTsKLQlzc2ktPmlvCQk9IGlvOwogCXNzaS0+Y3Jfb3duCT0gY3I7CiAJc3NpLT5lcnIJPSAtMTsgLyogaWdub3JlIDFzdCBlcnJvciAqLwogCi0JcnNuZF9zc2lfbW9kZV9zZXQocHJpdiwgcmRhaSwgc3NpKTsKLQotCWRldl9kYmcoZGV2LCAiJXMuJWQgaW5pdFxuIiwgcnNuZF9tb2RfbmFtZShtb2QpLCByc25kX21vZF9pZChtb2QpKTsKKwlyc25kX3NyY19zc2lfbW9kZV9pbml0KG1vZCwgcmRhaSwgaW8pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zODQsMTMgKzMwMCwxMCBAQAogCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKIAotCWRldl9kYmcoZGV2LCAiJXMuJWQgcXVpdFxuIiwgcnNuZF9tb2RfbmFtZShtb2QpLCByc25kX21vZF9pZChtb2QpKTsKLQogCWlmIChzc2ktPmVyciA+IDApCiAJCWRldl93YXJuKGRldiwgInNzaSB1bmRlci9vdmVyIGZsb3cgZXJyID0gJWRcbiIsIHNzaS0+ZXJyKTsKIAogCXNzaS0+cmRhaQk9IE5VTEw7Ci0Jc3NpLT5pbwkJPSBOVUxMOwogCXNzaS0+Y3Jfb3duCT0gMDsKIAlzc2ktPmVycgk9IDA7CiAKQEAgLTQxNCw4ICszMjcsOSBAQAogc3RhdGljIGlycXJldHVybl90IHJzbmRfc3NpX3Bpb19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcnNuZF9zc2kgKnNzaSA9IGRhdGE7Ci0Jc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8gPSBzc2ktPmlvOwotCXUzMiBzdGF0dXMgPSByc25kX21vZF9yZWFkKCZzc2ktPm1vZCwgU1NJU1IpOworCXN0cnVjdCByc25kX21vZCAqbW9kID0gJnNzaS0+bW9kOworCXN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvID0gcnNuZF9tb2RfdG9faW8obW9kKTsKKwl1MzIgc3RhdHVzID0gcnNuZF9tb2RfcmVhZChtb2QsIFNTSVNSKTsKIAlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKIAogCWlmIChpbyAmJiAoc3RhdHVzICYgRElSUSkpIHsKQEAgLTQzMiw5ICszNDYsOSBAQAogCQkgKiBzZWUgcnNuZF9zc2lfaW5pdCgpCiAJCSAqLwogCQlpZiAocnNuZF9kYWlfaXNfcGxheShyZGFpLCBpbykpCi0JCQlyc25kX21vZF93cml0ZSgmc3NpLT5tb2QsIFNTSVREUiwgKmJ1Zik7CisJCQlyc25kX21vZF93cml0ZShtb2QsIFNTSVREUiwgKmJ1Zik7CiAJCWVsc2UKLQkJCSpidWYgPSByc25kX21vZF9yZWFkKCZzc2ktPm1vZCwgU1NJUkRSKTsKKwkJCSpidWYgPSByc25kX21vZF9yZWFkKG1vZCwgU1NJUkRSKTsKIAogCQlyc25kX2RhaV9wb2ludGVyX3VwZGF0ZShpbywgc2l6ZW9mKCpidWYpKTsKIApAQCAtNDQ0LDI1ICszNTgsMzkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHJzbmRfc3NpX3Bpb19zdGFydChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKK3N0YXRpYyBpbnQgcnNuZF9zc2lfcGlvX3Byb2JlKHN0cnVjdCByc25kX21vZCAqbW9kLAogCQkJICAgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAogCQkJICAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCiB7CiAJc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IHJzbmRfbW9kX3RvX3ByaXYobW9kKTsKLQlzdHJ1Y3QgcnNuZF9zc2kgKnNzaSA9IHJzbmRfbW9kX3RvX3NzaShtb2QpOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CisJc3RydWN0IHJzbmRfc3NpICpzc2kgPSByc25kX21vZF90b19zc2kobW9kKTsKKwlpbnQgaXJxID0gc3NpLT5pbmZvLT5waW9faXJxOworCWludCByZXQ7CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgaXJxLAorCQkJICAgICAgIHJzbmRfc3NpX3Bpb19pbnRlcnJ1cHQsCisJCQkgICAgICAgSVJRRl9TSEFSRUQsCisJCQkgICAgICAgZGV2X25hbWUoZGV2KSwgc3NpKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGRldiwgIlNTSSByZXF1ZXN0IGludGVycnVwdCBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByc25kX3NzaV9waW9fc3RhcnQoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlzdHJ1Y3QgcnNuZF9zc2kgKnNzaSA9IHJzbmRfbW9kX3RvX3NzaShtb2QpOwogCiAJLyogZW5hYmxlIFBJTyBJUlEgKi8KIAlzc2ktPmNyX2V0YyA9IFVJRU4gfCBPSUVOIHwgRElFTjsKIAotCS8qIGVuYWJsZSBQSU8gaW50ZXJydXB0IGlmIGdlbjIgKi8KLQlpZiAocnNuZF9pc19nZW4yKHByaXYpKQotCQlyc25kX21vZF93cml0ZSgmc3NpLT5tb2QsIElOVF9FTkFCTEUsIDB4MGYwMDAwMDApOworCXJzbmRfc3JjX2VuYWJsZV9zc2lfaXJxKG1vZCwgcmRhaSwgaW8pOwogCiAJcnNuZF9zc2lfaHdfc3RhcnQoc3NpLCByZGFpLCBpbyk7CiAKLQlkZXZfZGJnKGRldiwgIiVzLiVkIHN0YXJ0XG4iLCByc25kX21vZF9uYW1lKG1vZCksIHJzbmRfbW9kX2lkKG1vZCkpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ3MCwxMiArMzk4LDggQEAKIAkJCSAgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAogCQkJICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKIHsKLQlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CiAJc3RydWN0IHJzbmRfc3NpICpzc2kgPSByc25kX21vZF90b19zc2kobW9kKTsKIAotCWRldl9kYmcoZGV2LCAiJXMuJWQgc3RvcFxuIiwgcnNuZF9tb2RfbmFtZShtb2QpLCByc25kX21vZF9pZChtb2QpKTsKLQogCXNzaS0+Y3JfZXRjID0gMDsKIAogCXJzbmRfc3NpX2h3X3N0b3Aoc3NpLCByZGFpKTsKQEAgLTQ4NSwzNSArNDA5LDQ2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcnNuZF9tb2Rfb3BzIHJzbmRfc3NpX3Bpb19vcHMgPSB7CiAJLm5hbWUJPSAic3NpIChwaW8pIiwKKwkucHJvYmUJPSByc25kX3NzaV9waW9fcHJvYmUsCiAJLmluaXQJPSByc25kX3NzaV9pbml0LAogCS5xdWl0CT0gcnNuZF9zc2lfcXVpdCwKIAkuc3RhcnQJPSByc25kX3NzaV9waW9fc3RhcnQsCiAJLnN0b3AJPSByc25kX3NzaV9waW9fc3RvcCwKIH07CiAKLXN0YXRpYyBpbnQgcnNuZF9zc2lfZG1hX2lucXVpcnkoc3RydWN0IHJzbmRfZG1hICpkbWEsIGRtYV9hZGRyX3QgKmJ1ZiwgaW50ICpsZW4pCitzdGF0aWMgaW50IHJzbmRfc3NpX2RtYV9wcm9iZShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCSAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKIHsKLQlzdHJ1Y3QgcnNuZF9zc2kgKnNzaSA9IHJzbmRfZG1hX3RvX3NzaShkbWEpOwotCXN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvID0gc3NpLT5pbzsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gcnNuZF9pb190b19ydW50aW1lKGlvKTsKKwlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOworCXN0cnVjdCByc25kX3NzaSAqc3NpID0gcnNuZF9tb2RfdG9fc3NpKG1vZCk7CisJc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8gPSByc25kX3ByaXZfdG9faW5mbyhwcml2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc25kX3ByaXZfdG9fZGV2KHByaXYpOworCWludCBkbWFfaWQgPSBzc2ktPmluZm8tPmRtYV9pZDsKKwlpbnQgaXNfcGxheTsKKwlpbnQgcmV0OwogCi0JKmxlbiA9IGlvLT5ieXRlX3Blcl9wZXJpb2Q7Ci0JKmJ1ZiA9IHJ1bnRpbWUtPmRtYV9hZGRyICsKLQkJcnNuZF9kYWlfcG9pbnRlcl9vZmZzZXQoaW8sIHNzaS0+ZG1hX29mZnNldCArICpsZW4pOwotCXNzaS0+ZG1hX29mZnNldCA9ICpsZW47IC8qIGl0IGNhcmVzIEEvQiBwbGFuZSAqLworCWlmIChpbmZvLT5kYWlfaW5mbykKKwkJaXNfcGxheSA9IHJzbmRfaW5mb19pc19wbGF5YmFjayhwcml2LCBzc2kpOworCWVsc2UKKwkJaXNfcGxheSA9IHJzbmRfc3NpX2lzX3BsYXkoJnNzaS0+bW9kKTsKIAotCXJldHVybiAwOworCXJldCA9IHJzbmRfZG1hX2luaXQoCisJCXByaXYsIHJzbmRfbW9kX3RvX2RtYShtb2QpLAorCQlpc19wbGF5LAorCQlkbWFfaWQpOworCisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoZGV2LCAiU1NJIERNQSBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCByc25kX3NzaV9kbWFfY29tcGxldGUoc3RydWN0IHJzbmRfZG1hICpkbWEpCitzdGF0aWMgaW50IHJzbmRfc3NpX2RtYV9yZW1vdmUoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkgICAgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJICAgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQogewotCXN0cnVjdCByc25kX3NzaSAqc3NpID0gcnNuZF9kbWFfdG9fc3NpKGRtYSk7Ci0Jc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8gPSBzc2ktPmlvOwotCXUzMiBzdGF0dXMgPSByc25kX21vZF9yZWFkKCZzc2ktPm1vZCwgU1NJU1IpOwotCi0JcnNuZF9zc2lfcmVjb3JkX2Vycm9yKHNzaSwgc3RhdHVzKTsKLQotCXJzbmRfZGFpX3BvaW50ZXJfdXBkYXRlKHNzaS0+aW8sIGlvLT5ieXRlX3Blcl9wZXJpb2QpOworCXJzbmRfZG1hX3F1aXQocnNuZF9tb2RfdG9fcHJpdihtb2QpLCByc25kX21vZF90b19kbWEobW9kKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUyNywxNCArNDYyLDEzIEBACiAKIAkvKiBlbmFibGUgRE1BIHRyYW5zZmVyICovCiAJc3NpLT5jcl9ldGMgPSBETUVOOwotCXNzaS0+ZG1hX29mZnNldCA9IDA7CiAKIAlyc25kX2RtYV9zdGFydChkbWEpOwogCiAJcnNuZF9zc2lfaHdfc3RhcnQoc3NpLCBzc2ktPnJkYWksIGlvKTsKIAogCS8qIGVuYWJsZSBXUyBjb250aW51ZSAqLwotCWlmIChyc25kX3JkYWlfaXNfY2xrX21hc3RlcihyZGFpKSkKKwlpZiAocnNuZF9kYWlfaXNfY2xrX21hc3RlcihyZGFpKSkKIAkJcnNuZF9tb2Rfd3JpdGUoJnNzaS0+bW9kLCBTU0lXU1IsIENPTlQpOwogCiAJcmV0dXJuIDA7CkBAIC01NDksNiArNDgzLDggQEAKIAogCXNzaS0+Y3JfZXRjID0gMDsKIAorCXJzbmRfc3NpX3JlY29yZF9lcnJvcihzc2ksIHJzbmRfbW9kX3JlYWQobW9kLCBTU0lTUikpOworCiAJcnNuZF9zc2lfaHdfc3RvcChzc2ksIHJkYWkpOwogCiAJcnNuZF9kbWFfc3RvcChkbWEpOwpAQCAtNTU4LDYgKzQ5NCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcnNuZF9tb2Rfb3BzIHJzbmRfc3NpX2RtYV9vcHMgPSB7CiAJLm5hbWUJPSAic3NpIChkbWEpIiwKKwkucHJvYmUJPSByc25kX3NzaV9kbWFfcHJvYmUsCisJLnJlbW92ZQk9IHJzbmRfc3NpX2RtYV9yZW1vdmUsCiAJLmluaXQJPSByc25kX3NzaV9pbml0LAogCS5xdWl0CT0gcnNuZF9zc2lfcXVpdCwKIAkuc3RhcnQJPSByc25kX3NzaV9kbWFfc3RhcnQsCkBAIC01NjcsMjQgKzUwNSw4IEBACiAvKgogICoJCU5vbiBTU0kKICAqLwotc3RhdGljIGludCByc25kX3NzaV9ub24oc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCQlzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCi0JCQlzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKLXsKLQlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7Ci0KLQlkZXZfZGJnKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCByc25kX21vZF9vcHMgcnNuZF9zc2lfbm9uX29wcyA9IHsKIAkubmFtZQk9ICJzc2kgKG5vbikiLAotCS5pbml0CT0gcnNuZF9zc2lfbm9uLAotCS5xdWl0CT0gcnNuZF9zc2lfbm9uLAotCS5zdGFydAk9IHJzbmRfc3NpX25vbiwKLQkuc3RvcAk9IHJzbmRfc3NpX25vbiwKIH07CiAKIC8qCkBAIC01OTMsMTYgKzUxNSwzMCBAQAogc3RydWN0IHJzbmRfbW9kICpyc25kX3NzaV9tb2RfZ2V0X2ZybV9kYWkoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKIAkJCQkJICBpbnQgZGFpX2lkLCBpbnQgaXNfcGxheSkKIHsKKwlzdHJ1Y3QgcnNuZF9kYWlfcGxhdGZvcm1faW5mbyAqZGFpX2luZm8gPSBOVUxMOworCXN0cnVjdCByc25kX2RhaV9wYXRoX2luZm8gKnBhdGhfaW5mbyA9IE5VTEw7CisJc3RydWN0IHJzbmRfc3NpX3BsYXRmb3JtX2luZm8gKnRhcmdldF9pbmZvID0gTlVMTDsKIAlzdHJ1Y3QgcnNuZF9zc2kgKnNzaTsKIAlpbnQgaSwgaGFzX3BsYXk7CiAKKwlpZiAocHJpdi0+cmRhaSkKKwkJZGFpX2luZm8gPSBwcml2LT5yZGFpW2RhaV9pZF0uaW5mbzsKKwlpZiAoZGFpX2luZm8pCisJCXBhdGhfaW5mbyA9IChpc19wbGF5KSA/ICZkYWlfaW5mby0+cGxheWJhY2sgOiAmZGFpX2luZm8tPmNhcHR1cmU7CisJaWYgKHBhdGhfaW5mbykKKwkJdGFyZ2V0X2luZm8gPSBwYXRoX2luZm8tPnNzaTsKKwogCWlzX3BsYXkgPSAhIWlzX3BsYXk7CiAKIAlmb3JfZWFjaF9yc25kX3NzaShzc2ksIHByaXYsIGkpIHsKKwkJaWYgKHRhcmdldF9pbmZvID09IHNzaS0+aW5mbykKKwkJCXJldHVybiAmc3NpLT5tb2Q7CisKKwkJLyogZm9yIGNvbXBhdGlibGUgKi8KIAkJaWYgKHJzbmRfc3NpX2RhaV9pZChzc2kpICE9IGRhaV9pZCkKIAkJCWNvbnRpbnVlOwogCi0JCWhhc19wbGF5ID0gISEocnNuZF9zc2lfbW9kZV9mbGFncyhzc2kpICYgUlNORF9TU0lfUExBWSk7CisJCWhhc19wbGF5ID0gcnNuZF9zc2lfaXNfcGxheSgmc3NpLT5tb2QpOwogCiAJCWlmIChpc19wbGF5ID09IGhhc19wbGF5KQogCQkJcmV0dXJuICZzc2ktPm1vZDsKQEAgLTYxNiwzNiArNTUyLDEyMiBAQAogCWlmIChXQVJOX09OKGlkIDwgMCB8fCBpZCA+PSByc25kX3NzaV9ucihwcml2KSkpCiAJCWlkID0gMDsKIAotCXJldHVybiAmKCgoc3RydWN0IHJzbmRfc3NpdSAqKShwcml2LT5zc2l1KSktPnNzaSArIGlkKS0+bW9kOworCXJldHVybiAmKChzdHJ1Y3QgcnNuZF9zc2kgKikocHJpdi0+c3NpKSArIGlkKS0+bW9kOworfQorCitpbnQgcnNuZF9zc2lfaXNfcGluX3NoYXJpbmcoc3RydWN0IHJzbmRfbW9kICptb2QpCit7CisJc3RydWN0IHJzbmRfc3NpICpzc2kgPSByc25kX21vZF90b19zc2kobW9kKTsKKworCXJldHVybiAhIShyc25kX3NzaV9tb2RlX2ZsYWdzKHNzaSkgJiBSU05EX1NTSV9DTEtfUElOX1NIQVJFKTsKK30KKworaW50IHJzbmRfc3NpX2lzX3BsYXkoc3RydWN0IHJzbmRfbW9kICptb2QpCit7CisJc3RydWN0IHJzbmRfc3NpICpzc2kgPSByc25kX21vZF90b19zc2kobW9kKTsKKworCXJldHVybiAhIShyc25kX3NzaV9tb2RlX2ZsYWdzKHNzaSkgJiBSU05EX1NTSV9QTEFZKTsKK30KKworc3RhdGljIHZvaWQgcnNuZF9zc2lfcGFyZW50X2Nsa19zZXR1cChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LCBzdHJ1Y3QgcnNuZF9zc2kgKnNzaSkKK3sKKwlpZiAoIXJzbmRfc3NpX2lzX3Bpbl9zaGFyaW5nKCZzc2ktPm1vZCkpCisJCXJldHVybjsKKworCXN3aXRjaCAocnNuZF9tb2RfaWQoJnNzaS0+bW9kKSkgeworCWNhc2UgMToKKwljYXNlIDI6CisJCXNzaS0+cGFyZW50ID0gcnNuZF9tb2RfdG9fc3NpKHJzbmRfc3NpX21vZF9nZXQocHJpdiwgMCkpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXNzaS0+cGFyZW50ID0gcnNuZF9tb2RfdG9fc3NpKHJzbmRfc3NpX21vZF9nZXQocHJpdiwgMykpOworCQlicmVhazsKKwljYXNlIDg6CisJCXNzaS0+cGFyZW50ID0gcnNuZF9tb2RfdG9fc3NpKHJzbmRfc3NpX21vZF9nZXQocHJpdiwgNykpOworCQlicmVhazsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgcnNuZF9vZl9wYXJzZV9zc2koc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCByc25kX29mX2RhdGEgKm9mX2RhdGEsCisJCQkgICAgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXN0cnVjdCByc25kX3NzaV9wbGF0Zm9ybV9pbmZvICpzc2lfaW5mbzsKKwlzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbyA9IHJzbmRfcHJpdl90b19pbmZvKHByaXYpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJaW50IG5yLCBpOworCisJaWYgKCFvZl9kYXRhKQorCQlyZXR1cm47CisKKwlub2RlID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUoZGV2LT5vZl9ub2RlLCAicmNhcl9zb3VuZCxzc2kiKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybjsKKworCW5yID0gb2ZfZ2V0X2NoaWxkX2NvdW50KG5vZGUpOworCWlmICghbnIpCisJCXJldHVybjsKKworCXNzaV9pbmZvID0gZGV2bV9remFsbG9jKGRldiwKKwkJCQlzaXplb2Yoc3RydWN0IHJzbmRfc3NpX3BsYXRmb3JtX2luZm8pICogbnIsCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFzc2lfaW5mbykgeworCQlkZXZfZXJyKGRldiwgInNzaSBpbmZvIGFsbG9jYXRpb24gZXJyb3JcbiIpOworCQlyZXR1cm47CisJfQorCisJaW5mby0+c3NpX2luZm8JCT0gc3NpX2luZm87CisJaW5mby0+c3NpX2luZm9fbnIJPSBucjsKKworCWkgPSAtMTsKKwlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG5vZGUsIG5wKSB7CisJCWkrKzsKKworCQlzc2lfaW5mbyA9IGluZm8tPnNzaV9pbmZvICsgaTsKKworCQkvKgorCQkgKiBwaW4gc2V0dGluZ3MKKwkJICovCisJCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJzaGFyZWQtcGluIiwgTlVMTCkpCisJCQlzc2lfaW5mby0+ZmxhZ3MgfD0gUlNORF9TU0lfQ0xLX1BJTl9TSEFSRTsKKworCQkvKgorCQkgKiBpcnEKKwkJICovCisJCXNzaV9pbmZvLT5waW9faXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOworCX0KIH0KIAogaW50IHJzbmRfc3NpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgIHN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvLAorCQkgICBjb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhLAogCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KQogeworCXN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvID0gcnNuZF9wcml2X3RvX2luZm8ocHJpdik7CiAJc3RydWN0IHJzbmRfc3NpX3BsYXRmb3JtX2luZm8gKnBpbmZvOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CiAJc3RydWN0IHJzbmRfbW9kX29wcyAqb3BzOwogCXN0cnVjdCBjbGsgKmNsazsKLQlzdHJ1Y3QgcnNuZF9zc2l1ICpzc2l1OwogCXN0cnVjdCByc25kX3NzaSAqc3NpOwogCWNoYXIgbmFtZVtSU05EX1NTSV9OQU1FX1NJWkVdOwotCWludCBpLCBuciwgcmV0OworCWludCBpLCBucjsKKworCXJzbmRfb2ZfcGFyc2Vfc3NpKHBkZXYsIG9mX2RhdGEsIHByaXYpOwogCiAJLyoKIAkgKglpbml0IFNTSQogCSAqLwogCW5yCT0gaW5mby0+c3NpX2luZm9fbnI7Ci0Jc3NpdQk9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqc3NpdSkgKyAoc2l6ZW9mKCpzc2kpICogbnIpLAotCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghc3NpdSkgeworCXNzaQk9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqc3NpKSAqIG5yLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNzaSkgewogCQlkZXZfZXJyKGRldiwgIlNTSSBhbGxvY2F0ZSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlwcml2LT5zc2l1CT0gc3NpdTsKLQlzc2l1LT5zc2kJPSAoc3RydWN0IHJzbmRfc3NpICopKHNzaXUgKyAxKTsKLQlzc2l1LT5zc2lfbnIJPSBucjsKKwlwcml2LT5zc2kJPSBzc2k7CisJcHJpdi0+c3NpX25yCT0gbnI7CiAKIAlmb3JfZWFjaF9yc25kX3NzaShzc2ksIHByaXYsIGkpIHsKIAkJcGluZm8gPSAmaW5mby0+c3NpX2luZm9baV07CkBAIC02NjAsNjEgKzY4MiwxNSBAQAogCQlzc2ktPmNsawk9IGNsazsKIAogCQlvcHMgPSAmcnNuZF9zc2lfbm9uX29wczsKKwkJaWYgKHBpbmZvLT5kbWFfaWQgPiAwKQorCQkJb3BzID0gJnJzbmRfc3NpX2RtYV9vcHM7CisJCWVsc2UgaWYgKHJzbmRfc3NpX3Bpb19hdmFpbGFibGUoc3NpKSkKKwkJCW9wcyA9ICZyc25kX3NzaV9waW9fb3BzOwogCi0JCS8qCi0JCSAqIFNTSSBETUEgY2FzZQotCQkgKi8KLQkJaWYgKHBpbmZvLT5kbWFfaWQgPiAwKSB7Ci0JCQlyZXQgPSByc25kX2RtYV9pbml0KAotCQkJCXByaXYsIHJzbmRfbW9kX3RvX2RtYSgmc3NpLT5tb2QpLAotCQkJCShyc25kX3NzaV9tb2RlX2ZsYWdzKHNzaSkgJiBSU05EX1NTSV9QTEFZKSwKLQkJCQlwaW5mby0+ZG1hX2lkLAotCQkJCXJzbmRfc3NpX2RtYV9pbnF1aXJ5LAotCQkJCXJzbmRfc3NpX2RtYV9jb21wbGV0ZSk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlkZXZfaW5mbyhkZXYsICJTU0kgRE1BIGZhaWxlZC4gdHJ5IFBJTyB0cmFuc3RlclxuIik7Ci0JCQllbHNlCi0JCQkJb3BzCT0gJnJzbmRfc3NpX2RtYV9vcHM7CisJCXJzbmRfbW9kX2luaXQocHJpdiwgJnNzaS0+bW9kLCBvcHMsIFJTTkRfTU9EX1NTSSwgaSk7CiAKLQkJCWRldl9kYmcoZGV2LCAiU1NJJWQgdXNlIERNQSB0cmFuc2ZlclxuIiwgaSk7Ci0JCX0KLQotCQkvKgotCQkgKiBTU0kgUElPIGNhc2UKLQkJICovCi0JCWlmICghcnNuZF9zc2lfZG1hX2F2YWlsYWJsZShzc2kpICYmCi0JCSAgICAgcnNuZF9zc2lfcGlvX2F2YWlsYWJsZShzc2kpKSB7Ci0JCQlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgcGluZm8tPnBpb19pcnEsCi0JCQkJCSAgICAgICAmcnNuZF9zc2lfcGlvX2ludGVycnVwdCwKLQkJCQkJICAgICAgIElSUUZfU0hBUkVELAotCQkJCQkgICAgICAgZGV2X25hbWUoZGV2KSwgc3NpKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlkZXZfZXJyKGRldiwgIlNTSSByZXF1ZXN0IGludGVycnVwdCBmYWlsZWRcbiIpOwotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0KLQkJCW9wcwk9ICZyc25kX3NzaV9waW9fb3BzOwotCi0JCQlkZXZfZGJnKGRldiwgIlNTSSVkIHVzZSBQSU8gdHJhbnNmZXJcbiIsIGkpOwotCQl9Ci0KLQkJcnNuZF9tb2RfaW5pdChwcml2LCAmc3NpLT5tb2QsIG9wcywgaSk7CisJCXJzbmRfc3NpX3BhcmVudF9jbGtfc2V0dXAocHJpdiwgc3NpKTsKIAl9CiAKLQlkZXZfZGJnKGRldiwgInNzaSBwcm9iZWRcbiIpOwotCiAJcmV0dXJuIDA7CiB9Ci0KLXZvaWQgcnNuZF9zc2lfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IHJzbmRfc3NpICpzc2k7Ci0JaW50IGk7Ci0KLQlmb3JfZWFjaF9yc25kX3NzaShzc2ksIHByaXYsIGkpIHsKLQkJaWYgKHJzbmRfc3NpX2RtYV9hdmFpbGFibGUoc3NpKSkKLQkJCXJzbmRfZG1hX3F1aXQocHJpdiwgcnNuZF9tb2RfdG9fZG1hKCZzc2ktPm1vZCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NpcmYvS2NvbmZpZyBiL3NvdW5kL3NvYy9zaXJmL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODllODk0MgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9zaXJmL0tjb25maWcKQEAgLTAsMCArMSwxNCBAQAorY29uZmlnIFNORF9TT0NfU0lSRgorCXRyaXN0YXRlICJTb0MgQXVkaW8gZm9yIHRoZSBTaVJGIFNvQyBjaGlwcyIKKwlkZXBlbmRzIG9uIEFSQ0hfU0lSRiB8fCBDT01QSUxFX1RFU1QKKwlzZWxlY3QgU05EX1NPQ19HRU5FUklDX0RNQUVOR0lORV9QQ00KKworY29uZmlnIFNORF9TT0NfU0lSRl9BVURJTworCXRyaXN0YXRlICJTb0MgQXVkaW8gc3VwcG9ydCBmb3IgU2lSRiBpbnRlcm5hbCBhdWRpbyBjb2RlYyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfU0lSRgorCXNlbGVjdCBTTkRfU09DX1NJUkZfQVVESU9fQ09ERUMKKwlzZWxlY3QgU05EX1NPQ19TSVJGX0FVRElPX1BPUlQKKworY29uZmlnIFNORF9TT0NfU0lSRl9BVURJT19QT1JUCisJc2VsZWN0IFJFR01BUF9NTUlPCisJdHJpc3RhdGUKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaXJmL01ha2VmaWxlIGIvc291bmQvc29jL3NpcmYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzYjkzMgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9zaXJmL01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorc25kLXNvYy1zaXJmLWF1ZGlvLW9ianMgOj0gc2lyZi1hdWRpby5vCitzbmQtc29jLXNpcmYtYXVkaW8tcG9ydC1vYmpzIDo9IHNpcmYtYXVkaW8tcG9ydC5vCisKK29iai0kKENPTkZJR19TTkRfU09DX1NJUkZfQVVESU8pICs9IHNuZC1zb2Mtc2lyZi1hdWRpby5vCitvYmotJChDT05GSUdfU05EX1NPQ19TSVJGX0FVRElPX1BPUlQpICs9IHNuZC1zb2Mtc2lyZi1hdWRpby1wb3J0Lm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaXJmL3NpcmYtYXVkaW8tcG9ydC5jIGIvc291bmQvc29jL3NpcmYvc2lyZi1hdWRpby1wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA0YTUzZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9zaXJmL3NpcmYtYXVkaW8tcG9ydC5jCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogU2lSRiBBdWRpbyBwb3J0IGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBDYW1icmlkZ2UgU2lsaWNvbiBSYWRpbyBMaW1pdGVkLCBhIENTUiBwbGMgZ3JvdXAgY29tcGFueS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgorCisjaW5jbHVkZSAic2lyZi1hdWRpby1wb3J0LmgiCisKK3N0cnVjdCBzaXJmX2F1ZGlvX3BvcnQgeworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwlzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgcGxheWJhY2tfZG1hX2RhdGE7CisJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhIGNhcHR1cmVfZG1hX2RhdGE7Cit9OworCitzdGF0aWMgdm9pZCBzaXJmX2F1ZGlvX3BvcnRfdHhfZW5hYmxlKHN0cnVjdCBzaXJmX2F1ZGlvX3BvcnQgKnBvcnQpCit7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHBvcnQtPnJlZ21hcCwgQVVESU9fUE9SVF9JQ19UWEZJRk9fT1AsCisJCUFVRElPX0ZJRk9fUkVTRVQsIEFVRElPX0ZJRk9fUkVTRVQpOworCXJlZ21hcF93cml0ZShwb3J0LT5yZWdtYXAsIEFVRElPX1BPUlRfSUNfVFhGSUZPX0lOVF9NU0ssIDApOworCXJlZ21hcF93cml0ZShwb3J0LT5yZWdtYXAsIEFVRElPX1BPUlRfSUNfVFhGSUZPX09QLCAwKTsKKwlyZWdtYXBfdXBkYXRlX2JpdHMocG9ydC0+cmVnbWFwLCBBVURJT19QT1JUX0lDX1RYRklGT19PUCwKKwkJQVVESU9fRklGT19TVEFSVCwgQVVESU9fRklGT19TVEFSVCk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHBvcnQtPnJlZ21hcCwgQVVESU9fUE9SVF9JQ19DT0RFQ19UWF9DVFJMLAorCQlJQ19UWF9FTkFCTEUsIElDX1RYX0VOQUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkIHNpcmZfYXVkaW9fcG9ydF90eF9kaXNhYmxlKHN0cnVjdCBzaXJmX2F1ZGlvX3BvcnQgKnBvcnQpCit7CisJcmVnbWFwX3dyaXRlKHBvcnQtPnJlZ21hcCwgQVVESU9fUE9SVF9JQ19UWEZJRk9fT1AsIDApOworCXJlZ21hcF91cGRhdGVfYml0cyhwb3J0LT5yZWdtYXAsIEFVRElPX1BPUlRfSUNfQ09ERUNfVFhfQ1RSTCwKKwkJSUNfVFhfRU5BQkxFLCB+SUNfVFhfRU5BQkxFKTsKK30KKworc3RhdGljIHZvaWQgc2lyZl9hdWRpb19wb3J0X3J4X2VuYWJsZShzdHJ1Y3Qgc2lyZl9hdWRpb19wb3J0ICpwb3J0LAorCWludCBjaGFubmVscykKK3sKKwlyZWdtYXBfdXBkYXRlX2JpdHMocG9ydC0+cmVnbWFwLCBBVURJT19QT1JUX0lDX1JYRklGT19PUCwKKwkJQVVESU9fRklGT19SRVNFVCwgQVVESU9fRklGT19SRVNFVCk7CisJcmVnbWFwX3dyaXRlKHBvcnQtPnJlZ21hcCwgQVVESU9fUE9SVF9JQ19SWEZJRk9fSU5UX01TSywgMCk7CisJcmVnbWFwX3dyaXRlKHBvcnQtPnJlZ21hcCwgQVVESU9fUE9SVF9JQ19SWEZJRk9fT1AsIDApOworCXJlZ21hcF91cGRhdGVfYml0cyhwb3J0LT5yZWdtYXAsIEFVRElPX1BPUlRfSUNfUlhGSUZPX09QLAorCQlBVURJT19GSUZPX1NUQVJULCBBVURJT19GSUZPX1NUQVJUKTsKKwlpZiAoY2hhbm5lbHMgPT0gMSkKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHBvcnQtPnJlZ21hcCwgQVVESU9fUE9SVF9JQ19DT0RFQ19SWF9DVFJMLAorCQkJSUNfUlhfRU5BQkxFX01PTk8sIElDX1JYX0VOQUJMRV9NT05PKTsKKwllbHNlCisJCXJlZ21hcF91cGRhdGVfYml0cyhwb3J0LT5yZWdtYXAsIEFVRElPX1BPUlRfSUNfQ09ERUNfUlhfQ1RSTCwKKwkJCUlDX1JYX0VOQUJMRV9TVEVSRU8sIElDX1JYX0VOQUJMRV9TVEVSRU8pOworfQorCitzdGF0aWMgdm9pZCBzaXJmX2F1ZGlvX3BvcnRfcnhfZGlzYWJsZShzdHJ1Y3Qgc2lyZl9hdWRpb19wb3J0ICpwb3J0KQoreworCXJlZ21hcF91cGRhdGVfYml0cyhwb3J0LT5yZWdtYXAsIEFVRElPX1BPUlRfSUNfQ09ERUNfUlhfQ1RSTCwKKwkJCUlDX1JYX0VOQUJMRV9TVEVSRU8sIH5JQ19SWF9FTkFCTEVfU1RFUkVPKTsKK30KKworc3RhdGljIGludCBzaXJmX2F1ZGlvX3BvcnRfZGFpX3Byb2JlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzaXJmX2F1ZGlvX3BvcnQgKnBvcnQgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOworCXNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEoZGFpLCAmcG9ydC0+cGxheWJhY2tfZG1hX2RhdGEsCisJCQkmcG9ydC0+Y2FwdHVyZV9kbWFfZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2lyZl9hdWRpb19wb3J0X3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQsCisJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNpcmZfYXVkaW9fcG9ydCAqcG9ydCA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisJaW50IHBsYXliYWNrID0gc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCWlmIChwbGF5YmFjaykKKwkJCXNpcmZfYXVkaW9fcG9ydF90eF9kaXNhYmxlKHBvcnQpOworCQllbHNlCisJCQlzaXJmX2F1ZGlvX3BvcnRfcnhfZGlzYWJsZShwb3J0KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCWlmIChwbGF5YmFjaykKKwkJCXNpcmZfYXVkaW9fcG9ydF90eF9lbmFibGUocG9ydCk7CisJCWVsc2UKKwkJCXNpcmZfYXVkaW9fcG9ydF9yeF9lbmFibGUocG9ydCwKKwkJCQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIHNpcmZfYXVkaW9fcG9ydF9kYWlfb3BzID0geworCS50cmlnZ2VyID0gc2lyZl9hdWRpb19wb3J0X3RyaWdnZXIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzaXJmX2F1ZGlvX3BvcnRfZGFpID0geworCS5wcm9iZSA9IHNpcmZfYXVkaW9fcG9ydF9kYWlfcHJvYmUsCisJLm5hbWUgPSAic2lyZi1hdWRpby1wb3J0IiwKKwkuaWQgPSAwLAorCS5wbGF5YmFjayA9IHsKKwkJLmNoYW5uZWxzX21pbiA9IDIsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwl9LAorCS5jYXB0dXJlID0geworCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCX0sCisJLm9wcyA9ICZzaXJmX2F1ZGlvX3BvcnRfZGFpX29wcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyIHNpcmZfYXVkaW9fcG9ydF9jb21wb25lbnQgPSB7CisJLm5hbWUgICAgICAgPSAic2lyZi1hdWRpby1wb3J0IiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzaXJmX2F1ZGlvX3BvcnRfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSAzMiwKKwkucmVnX3N0cmlkZSA9IDQsCisJLnZhbF9iaXRzID0gMzIsCisJLm1heF9yZWdpc3RlciA9IEFVRElPX1BPUlRfSUNfUlhGSUZPX0lOVF9NU0ssCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9OT05FLAorfTsKKworc3RhdGljIGludCBzaXJmX2F1ZGlvX3BvcnRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzaXJmX2F1ZGlvX3BvcnQgKnBvcnQ7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXN0cnVjdCByZXNvdXJjZSAqbWVtX3JlczsKKworCXBvcnQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKKwkJCXNpemVvZihzdHJ1Y3Qgc2lyZl9hdWRpb19wb3J0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwb3J0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbV9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghbWVtX3JlcykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBtZW0gcmVzb3VyY2U/XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJYmFzZSA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCBtZW1fcmVzLT5zdGFydCwKKwkJCXJlc291cmNlX3NpemUobWVtX3JlcykpOworCWlmIChiYXNlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcG9ydC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9tbWlvKCZwZGV2LT5kZXYsIGJhc2UsCisJCQkJCSAgICAmc2lyZl9hdWRpb19wb3J0X3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIocG9ydC0+cmVnbWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIocG9ydC0+cmVnbWFwKTsKKworCXJldCA9IGRldm1fc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwKKwkJCSZzaXJmX2F1ZGlvX3BvcnRfY29tcG9uZW50LCAmc2lyZl9hdWRpb19wb3J0X2RhaSwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBvcnQpOworCXJldHVybiBkZXZtX3NuZF9kbWFlbmdpbmVfcGNtX3JlZ2lzdGVyKCZwZGV2LT5kZXYsIE5VTEwsIDApOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzaXJmX2F1ZGlvX3BvcnRfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInNpcmYsYXVkaW8tcG9ydCIsIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzaXJmX2F1ZGlvX3BvcnRfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzaXJmX2F1ZGlvX3BvcnRfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInNpcmYtYXVkaW8tcG9ydCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBzaXJmX2F1ZGlvX3BvcnRfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBzaXJmX2F1ZGlvX3BvcnRfcHJvYmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHNpcmZfYXVkaW9fcG9ydF9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNpUkYgQXVkaW8gUG9ydCBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlJvbmdKdW4gWWluZyA8Um9uZ2p1bi5ZaW5nQGNzci5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2lyZi9zaXJmLWF1ZGlvLXBvcnQuaCBiL3NvdW5kL3NvYy9zaXJmL3NpcmYtYXVkaW8tcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMmRjNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2Mvc2lyZi9zaXJmLWF1ZGlvLXBvcnQuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogU2lSRiBBdWRpbyBwb3J0IGNvbnRyb2xsZXJzIGRlZmluZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBDYW1icmlkZ2UgU2lsaWNvbiBSYWRpbyBMaW1pdGVkLCBhIENTUiBwbGMgZ3JvdXAgY29tcGFueS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9TSVJGX0FVRElPX1BPUlRfSAorI2RlZmluZSBfU0lSRl9BVURJT19QT1JUX0gKKworI2RlZmluZSBBVURJT19QT1JUX1RYX0ZJRk9fTEVWRUxfQ0hFQ0tfTUFTSyAgICAgMHgzRgorI2RlZmluZSBBVURJT19QT1JUX1RYX0ZJRk9fU0NfT0ZGU0VUICAgIDAKKyNkZWZpbmUgQVVESU9fUE9SVF9UWF9GSUZPX0xDX09GRlNFVCAgICAxMAorI2RlZmluZSBBVURJT19QT1JUX1RYX0ZJRk9fSENfT0ZGU0VUICAgIDIwCisKKyNkZWZpbmUgVFhfRklGT19TQyh4KSAgICAgICAgICAgKCgoeCkgJiBBVURJT19QT1JUX1RYX0ZJRk9fTEVWRUxfQ0hFQ0tfTUFTSykgXAorCQkJCTw8IEFVRElPX1BPUlRfVFhfRklGT19TQ19PRkZTRVQpCisjZGVmaW5lIFRYX0ZJRk9fTEMoeCkgICAgICAgICAgICgoKHgpICYgQVVESU9fUE9SVF9UWF9GSUZPX0xFVkVMX0NIRUNLX01BU0spIFwKKwkJCQk8PCBBVURJT19QT1JUX1RYX0ZJRk9fTENfT0ZGU0VUKQorI2RlZmluZSBUWF9GSUZPX0hDKHgpICAgICAgICAgICAoKCh4KSAmIEFVRElPX1BPUlRfVFhfRklGT19MRVZFTF9DSEVDS19NQVNLKSBcCisJCQkJPDwgQVVESU9fUE9SVF9UWF9GSUZPX0hDX09GRlNFVCkKKworI2RlZmluZSBBVURJT19QT1JUX1JYX0ZJRk9fTEVWRUxfQ0hFQ0tfTUFTSyAgICAgMHgwRgorI2RlZmluZSBBVURJT19QT1JUX1JYX0ZJRk9fU0NfT0ZGU0VUICAgIDAKKyNkZWZpbmUgQVVESU9fUE9SVF9SWF9GSUZPX0xDX09GRlNFVCAgICAxMAorI2RlZmluZSBBVURJT19QT1JUX1JYX0ZJRk9fSENfT0ZGU0VUICAgIDIwCisKKyNkZWZpbmUgUlhfRklGT19TQyh4KSAgICAgICAgICAgKCgoeCkgJiBBVURJT19QT1JUX1JYX0ZJRk9fTEVWRUxfQ0hFQ0tfTUFTSykgXAorCQkJCTw8IEFVRElPX1BPUlRfUlhfRklGT19TQ19PRkZTRVQpCisjZGVmaW5lIFJYX0ZJRk9fTEMoeCkgICAgICAgICAgICgoKHgpICYgQVVESU9fUE9SVF9SWF9GSUZPX0xFVkVMX0NIRUNLX01BU0spIFwKKwkJCQk8PCBBVURJT19QT1JUX1JYX0ZJRk9fTENfT0ZGU0VUKQorI2RlZmluZSBSWF9GSUZPX0hDKHgpICAgICAgICAgICAoKCh4KSAmIEFVRElPX1BPUlRfUlhfRklGT19MRVZFTF9DSEVDS19NQVNLKSBcCisJCQkJPDwgQVVESU9fUE9SVF9SWF9GSUZPX0hDX09GRlNFVCkKKyNkZWZpbmUgQVVESU9fUE9SVF9JQ19DT0RFQ19UWF9DVFJMCQkoMHgwMEY0KQorI2RlZmluZSBBVURJT19QT1JUX0lDX0NPREVDX1JYX0NUUkwJCSgweDAwRjgpCisKKyNkZWZpbmUgQVVESU9fUE9SVF9JQ19UWEZJRk9fT1AJCQkoMHgwMEZDKQorI2RlZmluZSBBVURJT19QT1JUX0lDX1RYRklGT19MRVZfQ0hLCQkoMHgwMTAwKQorI2RlZmluZSBBVURJT19QT1JUX0lDX1RYRklGT19TVFMJCSgweDAxMDQpCisjZGVmaW5lIEFVRElPX1BPUlRfSUNfVFhGSUZPX0lOVAkJKDB4MDEwOCkKKyNkZWZpbmUgQVVESU9fUE9SVF9JQ19UWEZJRk9fSU5UX01TSwkJKDB4MDEwQykKKworI2RlZmluZSBBVURJT19QT1JUX0lDX1JYRklGT19PUAkJCSgweDAxMTApCisjZGVmaW5lIEFVRElPX1BPUlRfSUNfUlhGSUZPX0xFVl9DSEsJCSgweDAxMTQpCisjZGVmaW5lIEFVRElPX1BPUlRfSUNfUlhGSUZPX1NUUwkJKDB4MDExOCkKKyNkZWZpbmUgQVVESU9fUE9SVF9JQ19SWEZJRk9fSU5UCQkoMHgwMTFDKQorI2RlZmluZSBBVURJT19QT1JUX0lDX1JYRklGT19JTlRfTVNLCQkoMHgwMTIwKQorCisjZGVmaW5lIEFVRElPX0ZJRk9fU1RBUlQJCSgxIDw8IDApCisjZGVmaW5lIEFVRElPX0ZJRk9fUkVTRVQJCSgxIDw8IDEpCisKKyNkZWZpbmUgQVVESU9fRklGT19GVUxMCQkJKDEgPDwgMCkKKyNkZWZpbmUgQVVESU9fRklGT19FTVBUWQkJKDEgPDwgMSkKKyNkZWZpbmUgQVVESU9fRklGT19PRkxPVwkJKDEgPDwgMikKKyNkZWZpbmUgQVVESU9fRklGT19VRkxPVwkJKDEgPDwgMykKKworI2RlZmluZSBJQ19UWF9FTkFCTEUJCSgweDAzKQorI2RlZmluZSBJQ19SWF9FTkFCTEVfTU9OTwkoMHgwMSkKKyNkZWZpbmUgSUNfUlhfRU5BQkxFX1NURVJFTwkoMHgwMykKKworI2VuZGlmIC8qX19TSVJGX0FVRElPX1BPUlRfSCovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2lyZi9zaXJmLWF1ZGlvLmMgYi9zb3VuZC9zb2Mvc2lyZi9zaXJmLWF1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlZjUxMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9zaXJmL3NpcmYtYXVkaW8uYwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIFNpUkYgYXVkaW8gY2FyZCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQ2FtYnJpZGdlIFNpbGljb24gUmFkaW8gTGltaXRlZCwgYSBDU1IgcGxjIGdyb3VwIGNvbXBhbnkuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKK3N0cnVjdCBzaXJmX2F1ZGlvX2NhcmQgeworCXVuc2lnbmVkIGludCAgICAgICAgICAgIGdwaW9faHBfcGE7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgZ3Bpb19zcGtfcGE7Cit9OworCitzdGF0aWMgaW50IHNpcmZfYXVkaW9faHBfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqY3RybCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHctPmRhcG07CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGRhcG0tPmNhcmQ7CisJc3RydWN0IHNpcmZfYXVkaW9fY2FyZCAqc2lyZl9hdWRpb19jYXJkID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOworCWludCBvbiA9ICFTTkRfU09DX0RBUE1fRVZFTlRfT0ZGKGV2ZW50KTsKKwlpZiAoZ3Bpb19pc192YWxpZChzaXJmX2F1ZGlvX2NhcmQtPmdwaW9faHBfcGEpKQorCQlncGlvX3NldF92YWx1ZShzaXJmX2F1ZGlvX2NhcmQtPmdwaW9faHBfcGEsIG9uKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaXJmX2F1ZGlvX3Nwa19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICpjdHJsLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gdy0+ZGFwbTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gZGFwbS0+Y2FyZDsKKwlzdHJ1Y3Qgc2lyZl9hdWRpb19jYXJkICpzaXJmX2F1ZGlvX2NhcmQgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CisJaW50IG9uID0gIVNORF9TT0NfREFQTV9FVkVOVF9PRkYoZXZlbnQpOworCisJaWYgKGdwaW9faXNfdmFsaWQoc2lyZl9hdWRpb19jYXJkLT5ncGlvX3Nwa19wYSkpCisJCWdwaW9fc2V0X3ZhbHVlKHNpcmZfYXVkaW9fY2FyZC0+Z3Bpb19zcGtfcGEsIG9uKTsKKworCXJldHVybiAwOworfQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHNpcmZfYXVkaW9fZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0hQKCJIcCIsIHNpcmZfYXVkaW9faHBfZXZlbnQpLAorCVNORF9TT0NfREFQTV9TUEsoIkV4dCBTcGsiLCBzaXJmX2F1ZGlvX3Nwa19ldmVudCksCisJU05EX1NPQ19EQVBNX01JQygiRXh0IE1pYyIsIE5VTEwpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgaW50ZXJjb25bXSA9IHsKKwl7IkhwIiwgTlVMTCwgIkhQT1VUTCJ9LAorCXsiSHAiLCBOVUxMLCAiSFBPVVRSIn0sCisJeyJFeHQgU3BrIiwgTlVMTCwgIlNQS09VVCJ9LAorCXsiTUlDSU4xIiwgTlVMTCwgIk1pYyBCaWFzIn0sCisJeyJNaWMgQmlhcyIsIE5VTEwsICJFeHQgTWljIn0sCit9OworCisvKiBEaWdpdGFsIGF1ZGlvIGludGVyZmFjZSBnbHVlIC0gY29ubmVjdHMgY29kZWMgPC0tPiBDUFUgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBzaXJmX2F1ZGlvX2RhaV9saW5rW10gPSB7CisJeworCQkubmFtZSA9ICJTaVJGIGF1ZGlvIGNhcmQiLAorCQkuc3RyZWFtX25hbWUgPSAiU2lSRiBhdWRpbyBIaUZpIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNpcmYtYXVkaW8tY29kZWMiLAorCX0sCit9OworCisvKiBBdWRpbyBtYWNoaW5lIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgc25kX3NvY19zaXJmX2F1ZGlvX2NhcmQgPSB7CisJLm5hbWUgPSAiU2lSRiBhdWRpbyBjYXJkIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuZGFpX2xpbmsgPSBzaXJmX2F1ZGlvX2RhaV9saW5rLAorCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKHNpcmZfYXVkaW9fZGFpX2xpbmspLAorCS5kYXBtX3dpZGdldHMgPSBzaXJmX2F1ZGlvX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoc2lyZl9hdWRpb19kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGludGVyY29uLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGludGVyY29uKSwKK307CisKK3N0YXRpYyBpbnQgc2lyZl9hdWRpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSAmc25kX3NvY19zaXJmX2F1ZGlvX2NhcmQ7CisJc3RydWN0IHNpcmZfYXVkaW9fY2FyZCAqc2lyZl9hdWRpb19jYXJkOworCWludCByZXQ7CisKKwlzaXJmX2F1ZGlvX2NhcmQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBzaXJmX2F1ZGlvX2NhcmQpLAorCQkJR0ZQX0tFUk5FTCk7CisJaWYgKHNpcmZfYXVkaW9fY2FyZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNpcmZfYXVkaW9fZGFpX2xpbmtbMF0uY3B1X29mX25vZGUgPQorCQlvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLCAic2lyZixhdWRpby1wbGF0Zm9ybSIsIDApOworCXNpcmZfYXVkaW9fZGFpX2xpbmtbMF0ucGxhdGZvcm1fb2Zfbm9kZSA9CisJCW9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsICJzaXJmLGF1ZGlvLXBsYXRmb3JtIiwgMCk7CisJc2lyZl9hdWRpb19kYWlfbGlua1swXS5jb2RlY19vZl9ub2RlID0KKwkJb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwgInNpcmYsYXVkaW8tY29kZWMiLCAwKTsKKwlzaXJmX2F1ZGlvX2NhcmQtPmdwaW9fc3BrX3BhID0gb2ZfZ2V0X25hbWVkX2dwaW8ocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkic3BrLXBhLWdwaW9zIiwgMCk7CisJc2lyZl9hdWRpb19jYXJkLT5ncGlvX2hwX3BhID0gIG9mX2dldF9uYW1lZF9ncGlvKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJImhwLXBhLWdwaW9zIiwgMCk7CisJaWYgKGdwaW9faXNfdmFsaWQoc2lyZl9hdWRpb19jYXJkLT5ncGlvX3Nwa19wYSkpIHsKKwkJcmV0ID0gZGV2bV9ncGlvX3JlcXVlc3Rfb25lKCZwZGV2LT5kZXYsCisJCQkJc2lyZl9hdWRpb19jYXJkLT5ncGlvX3Nwa19wYSwKKwkJCQlHUElPRl9PVVRfSU5JVF9MT1csICJTUEFfUEFfU0QiKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gcmVxdWVzdCBHUElPXyVkIGZvciByZXNldDogJWRcbiIsCisJCQkJc2lyZl9hdWRpb19jYXJkLT5ncGlvX3Nwa19wYSwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJaWYgKGdwaW9faXNfdmFsaWQoc2lyZl9hdWRpb19jYXJkLT5ncGlvX2hwX3BhKSkgeworCQlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoJnBkZXYtPmRldiwKKwkJCQlzaXJmX2F1ZGlvX2NhcmQtPmdwaW9faHBfcGEsCisJCQkJR1BJT0ZfT1VUX0lOSVRfTE9XLCAiSFBfUEFfU0QiKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gcmVxdWVzdCBHUElPXyVkIGZvciByZXNldDogJWRcbiIsCisJCQkJc2lyZl9hdWRpb19jYXJkLT5ncGlvX2hwX3BhLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWNhcmQtPmRldiA9ICZwZGV2LT5kZXY7CisJc25kX3NvY19jYXJkX3NldF9kcnZkYXRhKGNhcmQsIHNpcmZfYXVkaW9fY2FyZCk7CisKKwlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCBjYXJkKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzbmRfc29jX3JlZ2lzdGVyX2NhcmQoKSBmYWlsZWQ6JWRcbiIsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzaXJmX2F1ZGlvX29mX21hdGNoW10gPSB7CisJey5jb21wYXRpYmxlID0gInNpcmYsc2lyZi1hdWRpby1jYXJkIiwgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc2lyZl9hdWRpb19vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNpcmZfYXVkaW9fZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInNpcmYtYXVkaW8tY2FyZCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkucG0gPSAmc25kX3NvY19wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IHNpcmZfYXVkaW9fb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBzaXJmX2F1ZGlvX3Byb2JlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc2lyZl9hdWRpb19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJSb25nSnVuIFlpbmcgPFJvbmdKdW4uWWluZ0Bjc3IuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBTSVJGIGF1ZGlvIGNhcmQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWNhY2hlLmMgYi9zb3VuZC9zb2Mvc29jLWNhY2hlLmMKaW5kZXggMzc1ZGM2ZC4uYmZlZDNlNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1jYWNoZS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtY2FjaGUuYwpAQCAtOTYsOCArOTYsNyBAQAogewogCWRldl9kYmcoY29kZWMtPmRldiwgIkFTb0M6IERlc3Ryb3lpbmcgY2FjaGUgZm9yICVzIGNvZGVjXG4iLAogCQkJY29kZWMtPm5hbWUpOwotCWlmICghY29kZWMtPnJlZ19jYWNoZSkKLQkJcmV0dXJuIDA7CisKIAlrZnJlZShjb2RlYy0+cmVnX2NhY2hlKTsKIAljb2RlYy0+cmVnX2NhY2hlID0gTlVMTDsKIAlyZXR1cm4gMDsKQEAgLTExNyw4ICsxMTYsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW11dGV4X2xvY2soJmNvZGVjLT5jYWNoZV9yd19tdXRleCk7Ci0JKnZhbHVlID0gc25kX3NvY19nZXRfY2FjaGVfdmFsKGNvZGVjLT5yZWdfY2FjaGUsIHJlZywKLQkJCQkgICAgICAgY29kZWMtPmRyaXZlci0+cmVnX3dvcmRfc2l6ZSk7CisJaWYgKCFaRVJPX09SX05VTExfUFRSKGNvZGVjLT5yZWdfY2FjaGUpKQorCQkqdmFsdWUgPSBzbmRfc29jX2dldF9jYWNoZV92YWwoY29kZWMtPnJlZ19jYWNoZSwgcmVnLAorCQkJCQkgICAgICAgY29kZWMtPmRyaXZlci0+cmVnX3dvcmRfc2l6ZSk7CiAJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+Y2FjaGVfcndfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CkBAIC0xMzYsOCArMTM2LDkgQEAKIAkJCXVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKIHsKIAltdXRleF9sb2NrKCZjb2RlYy0+Y2FjaGVfcndfbXV0ZXgpOwotCXNuZF9zb2Nfc2V0X2NhY2hlX3ZhbChjb2RlYy0+cmVnX2NhY2hlLCByZWcsIHZhbHVlLAotCQkJICAgICAgY29kZWMtPmRyaXZlci0+cmVnX3dvcmRfc2l6ZSk7CisJaWYgKCFaRVJPX09SX05VTExfUFRSKGNvZGVjLT5yZWdfY2FjaGUpKQorCQlzbmRfc29jX3NldF9jYWNoZV92YWwoY29kZWMtPnJlZ19jYWNoZSwgcmVnLCB2YWx1ZSwKKwkJCQkgICAgICBjb2RlYy0+ZHJpdmVyLT5yZWdfd29yZF9zaXplKTsKIAltdXRleF91bmxvY2soJmNvZGVjLT5jYWNoZV9yd19tdXRleCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtY29tcHJlc3MuYyBiL3NvdW5kL3NvYy9zb2MtY29tcHJlc3MuYwppbmRleCA1ZTk2OTBjLi45MTA4M2U2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWNvbXByZXNzLmMKKysrIGIvc291bmQvc29jL3NvYy1jb21wcmVzcy5jCkBAIC0zMCw4ICszMCw2IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IGNzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0gPSBydGQtPnBsYXRmb3JtOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwogCWludCByZXQgPSAwOwogCiAJbXV0ZXhfbG9ja19uZXN0ZWQoJnJ0ZC0+cGNtX211dGV4LCBydGQtPnBjbV9zdWJjbGFzcyk7CkBAIC01MiwxNyArNTAsNyBAQAogCQl9CiAJfQogCi0JaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfUExBWUJBQ0spIHsKLQkJY3B1X2RhaS0+cGxheWJhY2tfYWN0aXZlKys7Ci0JCWNvZGVjX2RhaS0+cGxheWJhY2tfYWN0aXZlKys7Ci0JfSBlbHNlIHsKLQkJY3B1X2RhaS0+Y2FwdHVyZV9hY3RpdmUrKzsKLQkJY29kZWNfZGFpLT5jYXB0dXJlX2FjdGl2ZSsrOwotCX0KLQotCWNwdV9kYWktPmFjdGl2ZSsrOwotCWNvZGVjX2RhaS0+YWN0aXZlKys7Ci0JcnRkLT5jb2RlYy0+YWN0aXZlKys7CisJc25kX3NvY19ydW50aW1lX2FjdGl2YXRlKHJ0ZCwgY3N0cmVhbS0+ZGlyZWN0aW9uKTsKIAogCW11dGV4X3VubG9jaygmcnRkLT5wY21fbXV0ZXgpOwogCkBAIC04MSw4ICs2OSw2IEBACiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKmZlID0gY3N0cmVhbS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqZmVfc3Vic3RyZWFtID0gZmUtPnBjbS0+c3RyZWFtc1swXS5zdWJzdHJlYW07CiAJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gZmUtPnBsYXRmb3JtOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IGZlLT5jcHVfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gZmUtPmNvZGVjX2RhaTsKIAlzdHJ1Y3Qgc25kX3NvY19kcGNtICpkcGNtOwogCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0X2xpc3QgKmxpc3Q7CiAJaW50IHN0cmVhbTsKQEAgLTE0MCwxNyArMTI2LDcgQEAKIAlmZS0+ZHBjbVtzdHJlYW1dLnN0YXRlID0gU05EX1NPQ19EUENNX1NUQVRFX09QRU47CiAJZmUtPmRwY21bc3RyZWFtXS5ydW50aW1lX3VwZGF0ZSA9IFNORF9TT0NfRFBDTV9VUERBVEVfTk87CiAKLQlpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykgewotCQljcHVfZGFpLT5wbGF5YmFja19hY3RpdmUrKzsKLQkJY29kZWNfZGFpLT5wbGF5YmFja19hY3RpdmUrKzsKLQl9IGVsc2UgewotCQljcHVfZGFpLT5jYXB0dXJlX2FjdGl2ZSsrOwotCQljb2RlY19kYWktPmNhcHR1cmVfYWN0aXZlKys7Ci0JfQotCi0JY3B1X2RhaS0+YWN0aXZlKys7Ci0JY29kZWNfZGFpLT5hY3RpdmUrKzsKLQlmZS0+Y29kZWMtPmFjdGl2ZSsrOworCXNuZF9zb2NfcnVudGltZV9hY3RpdmF0ZShmZSwgc3RyZWFtKTsKIAogCW11dGV4X3VubG9jaygmZmUtPmNhcmQtPm11dGV4KTsKIApAQCAtMjAyLDI0ICsxNzgsMTkgQEAKIAlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0gPSBydGQtPnBsYXRmb3JtOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJaW50IHN0cmVhbTsKIAogCW11dGV4X2xvY2tfbmVzdGVkKCZydGQtPnBjbV9tdXRleCwgcnRkLT5wY21fc3ViY2xhc3MpOwogCi0JaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfUExBWUJBQ0spIHsKLQkJY3B1X2RhaS0+cGxheWJhY2tfYWN0aXZlLS07Ci0JCWNvZGVjX2RhaS0+cGxheWJhY2tfYWN0aXZlLS07Ci0JfSBlbHNlIHsKLQkJY3B1X2RhaS0+Y2FwdHVyZV9hY3RpdmUtLTsKLQkJY29kZWNfZGFpLT5jYXB0dXJlX2FjdGl2ZS0tOwotCX0KKwlpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykKKwkJc3RyZWFtID0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzsKKwllbHNlCisJCXN0cmVhbSA9IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRTsKKworCXNuZF9zb2NfcnVudGltZV9kZWFjdGl2YXRlKHJ0ZCwgc3RyZWFtKTsKIAogCXNuZF9zb2NfZGFpX2RpZ2l0YWxfbXV0ZShjb2RlY19kYWksIDEsIGNzdHJlYW0tPmRpcmVjdGlvbik7CiAKLQljcHVfZGFpLT5hY3RpdmUtLTsKLQljb2RlY19kYWktPmFjdGl2ZS0tOwotCWNvZGVjLT5hY3RpdmUtLTsKLQogCWlmICghY3B1X2RhaS0+YWN0aXZlKQogCQljcHVfZGFpLT5yYXRlID0gMDsKIApAQCAtMjM1LDggKzIwNiw3IEBACiAJY3B1X2RhaS0+cnVudGltZSA9IE5VTEw7CiAKIAlpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykgewotCQlpZiAoIXJ0ZC0+cG1kb3duX3RpbWUgfHwgY29kZWMtPmlnbm9yZV9wbWRvd25fdGltZSB8fAotCQkgICAgcnRkLT5kYWlfbGluay0+aWdub3JlX3BtZG93bl90aW1lKSB7CisJCWlmIChzbmRfc29jX3J1bnRpbWVfaWdub3JlX3BtZG93bl90aW1lKHJ0ZCkpIHsKIAkJCXNuZF9zb2NfZGFwbV9zdHJlYW1fZXZlbnQocnRkLAogCQkJCQlTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAogCQkJCQlTTkRfU09DX0RBUE1fU1RSRUFNX1NUT1ApOwpAQCAtMjYxLDI2ICsyMzEsMTcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqZmUgPSBjc3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gZmUtPnBsYXRmb3JtOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IGZlLT5jcHVfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gZmUtPmNvZGVjX2RhaTsKIAlzdHJ1Y3Qgc25kX3NvY19kcGNtICpkcGNtOwogCWludCBzdHJlYW0sIHJldDsKIAogCW11dGV4X2xvY2tfbmVzdGVkKCZmZS0+Y2FyZC0+bXV0ZXgsIFNORF9TT0NfQ0FSRF9DTEFTU19SVU5USU1FKTsKIAotCWlmIChjc3RyZWFtLT5kaXJlY3Rpb24gPT0gU05EX0NPTVBSRVNTX1BMQVlCQUNLKSB7CisJaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfUExBWUJBQ0spCiAJCXN0cmVhbSA9IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s7Ci0JCWNwdV9kYWktPnBsYXliYWNrX2FjdGl2ZS0tOwotCQljb2RlY19kYWktPnBsYXliYWNrX2FjdGl2ZS0tOwotCX0gZWxzZSB7CisJZWxzZQogCQlzdHJlYW0gPSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkU7Ci0JCWNwdV9kYWktPmNhcHR1cmVfYWN0aXZlLS07Ci0JCWNvZGVjX2RhaS0+Y2FwdHVyZV9hY3RpdmUtLTsKLQl9CiAKLQljcHVfZGFpLT5hY3RpdmUtLTsKLQljb2RlY19kYWktPmFjdGl2ZS0tOwotCWZlLT5jb2RlYy0+YWN0aXZlLS07CisJc25kX3NvY19ydW50aW1lX2RlYWN0aXZhdGUoZmUsIHN0cmVhbSk7CiAKIAlmZS0+ZHBjbVtzdHJlYW1dLnJ1bnRpbWVfdXBkYXRlID0gU05EX1NPQ19EUENNX1VQREFURV9GRTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1jb3JlLmMgYi9zb3VuZC9zb2Mvc29jLWNvcmUuYwppbmRleCBmZTFkZjUwLi4wNTFjMDA2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWNvcmUuYworKysgYi9zb3VuZC9zb2Mvc29jLWNvcmUuYwpAQCAtNTYsNyArNTYsNiBAQAogI2VuZGlmCiAKIHN0YXRpYyBERUZJTkVfTVVURVgoY2xpZW50X211dGV4KTsKLXN0YXRpYyBMSVNUX0hFQUQoZGFpX2xpc3QpOwogc3RhdGljIExJU1RfSEVBRChwbGF0Zm9ybV9saXN0KTsKIHN0YXRpYyBMSVNUX0hFQUQoY29kZWNfbGlzdCk7CiBzdGF0aWMgTElTVF9IRUFEKGNvbXBvbmVudF9saXN0KTsKQEAgLTM3MCwxOCArMzY5LDIyIEBACiB7CiAJY2hhciAqYnVmID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwogCXNzaXplX3QgbGVuLCByZXQgPSAwOworCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50OwogCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpOwogCiAJaWYgKCFidWYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkYWksICZkYWlfbGlzdCwgbGlzdCkgewotCQlsZW4gPSBzbnByaW50ZihidWYgKyByZXQsIFBBR0VfU0laRSAtIHJldCwgIiVzXG4iLCBkYWktPm5hbWUpOwotCQlpZiAobGVuID49IDApCi0JCQlyZXQgKz0gbGVuOwotCQlpZiAocmV0ID4gUEFHRV9TSVpFKSB7Ci0JCQlyZXQgPSBQQUdFX1NJWkU7Ci0JCQlicmVhazsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbXBvbmVudCwgJmNvbXBvbmVudF9saXN0LCBsaXN0KSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGFpLCAmY29tcG9uZW50LT5kYWlfbGlzdCwgbGlzdCkgeworCQkJbGVuID0gc25wcmludGYoYnVmICsgcmV0LCBQQUdFX1NJWkUgLSByZXQsICIlc1xuIiwKKwkJCQlkYWktPm5hbWUpOworCQkJaWYgKGxlbiA+PSAwKQorCQkJCXJldCArPSBsZW47CisJCQlpZiAocmV0ID4gUEFHRV9TSVpFKSB7CisJCQkJcmV0ID0gUEFHRV9TSVpFOworCQkJCWJyZWFrOworCQkJfQogCQl9CiAJfQogCkBAIC04NTUsNiArODU4LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSAmY2FyZC0+ZGFpX2xpbmtbbnVtXTsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gJmNhcmQtPnJ0ZFtudW1dOworCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50OwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKIAlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm07CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksICpjcHVfZGFpOwpAQCAtODYzLDE4ICs4NjcsMjAgQEAKIAlkZXZfZGJnKGNhcmQtPmRldiwgIkFTb0M6IGJpbmRpbmcgJXMgYXQgaWR4ICVkXG4iLCBkYWlfbGluay0+bmFtZSwgbnVtKTsKIAogCS8qIEZpbmQgQ1BVIERBSSBmcm9tIHJlZ2lzdGVyZWQgREFJcyovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjcHVfZGFpLCAmZGFpX2xpc3QsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbXBvbmVudCwgJmNvbXBvbmVudF9saXN0LCBsaXN0KSB7CiAJCWlmIChkYWlfbGluay0+Y3B1X29mX25vZGUgJiYKLQkJICAgIChjcHVfZGFpLT5kZXYtPm9mX25vZGUgIT0gZGFpX2xpbmstPmNwdV9vZl9ub2RlKSkKKwkJCWNvbXBvbmVudC0+ZGV2LT5vZl9ub2RlICE9IGRhaV9saW5rLT5jcHVfb2Zfbm9kZSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoZGFpX2xpbmstPmNwdV9uYW1lICYmCi0JCSAgICBzdHJjbXAoZGV2X25hbWUoY3B1X2RhaS0+ZGV2KSwgZGFpX2xpbmstPmNwdV9uYW1lKSkKKwkJCXN0cmNtcChkZXZfbmFtZShjb21wb25lbnQtPmRldiksIGRhaV9saW5rLT5jcHVfbmFtZSkpCiAJCQljb250aW51ZTsKLQkJaWYgKGRhaV9saW5rLT5jcHVfZGFpX25hbWUgJiYKLQkJICAgIHN0cmNtcChjcHVfZGFpLT5uYW1lLCBkYWlfbGluay0+Y3B1X2RhaV9uYW1lKSkKLQkJCWNvbnRpbnVlOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwdV9kYWksICZjb21wb25lbnQtPmRhaV9saXN0LCBsaXN0KSB7CisJCQlpZiAoZGFpX2xpbmstPmNwdV9kYWlfbmFtZSAmJgorCQkJCXN0cmNtcChjcHVfZGFpLT5uYW1lLCBkYWlfbGluay0+Y3B1X2RhaV9uYW1lKSkKKwkJCQljb250aW51ZTsKIAotCQlydGQtPmNwdV9kYWkgPSBjcHVfZGFpOworCQkJcnRkLT5jcHVfZGFpID0gY3B1X2RhaTsKKwkJfQogCX0KIAogCWlmICghcnRkLT5jcHVfZGFpKSB7CkBAIC04OTksMTIgKzkwNSwxMCBAQAogCQkgKiBDT0RFQyBmb3VuZCwgc28gZmluZCBDT0RFQyBEQUkgZnJvbSByZWdpc3RlcmVkIERBSXMgZnJvbQogCQkgKiB0aGlzIENPREVDCiAJCSAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjX2RhaSwgJmRhaV9saXN0LCBsaXN0KSB7Ci0JCQlpZiAoY29kZWMtPmRldiA9PSBjb2RlY19kYWktPmRldiAmJgotCQkJCSFzdHJjbXAoY29kZWNfZGFpLT5uYW1lLAotCQkJCQlkYWlfbGluay0+Y29kZWNfZGFpX25hbWUpKSB7Ci0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjb2RlY19kYWksICZjb2RlYy0+Y29tcG9uZW50LmRhaV9saXN0LCBsaXN0KSB7CisJCQlpZiAoIXN0cmNtcChjb2RlY19kYWktPm5hbWUsIGRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSkpIHsKIAkJCQlydGQtPmNvZGVjX2RhaSA9IGNvZGVjX2RhaTsKKwkJCQlicmVhazsKIAkJCX0KIAkJfQogCkBAIC0xMTI4LDE1ICsxMTMyLDIxIEBACiAJCQkJCSAgZHJpdmVyLT5udW1fZGFwbV93aWRnZXRzKTsKIAogCS8qIENyZWF0ZSBEQVBNIHdpZGdldHMgZm9yIGVhY2ggREFJIHN0cmVhbSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGFpLCAmZGFpX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGRhaS0+ZGV2ICE9IGNvZGVjLT5kZXYpCi0JCQljb250aW51ZTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZGFpLCAmY29kZWMtPmNvbXBvbmVudC5kYWlfbGlzdCwgbGlzdCkKIAkJc25kX3NvY19kYXBtX25ld19kYWlfd2lkZ2V0cygmY29kZWMtPmRhcG0sIGRhaSk7Ci0JfQogCiAJY29kZWMtPmRhcG0uaWRsZV9iaWFzX29mZiA9IGRyaXZlci0+aWRsZV9iaWFzX29mZjsKIAorCWlmICghY29kZWMtPndyaXRlICYmIGRldl9nZXRfcmVnbWFwKGNvZGVjLT5kZXYsIE5VTEwpKSB7CisJCS8qIFNldCB0aGUgZGVmYXVsdCBJL08gdXAgdHJ5IHJlZ21hcCAqLworCQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgTlVMTCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gZXJyX3Byb2JlOworCQl9CisJfQorCiAJaWYgKGRyaXZlci0+cHJvYmUpIHsKIAkJcmV0ID0gZHJpdmVyLT5wcm9iZShjb2RlYyk7CiAJCWlmIChyZXQgPCAwKSB7CkBAIC0xMTUwLDEwICsxMTYwLDYgQEAKIAkJCWNvZGVjLT5uYW1lKTsKIAl9CiAKLQkvKiBJZiB0aGUgZHJpdmVyIGRpZG4ndCBzZXQgSS9PIHVwIHRyeSByZWdtYXAgKi8KLQlpZiAoIWNvZGVjLT53cml0ZSAmJiBkZXZfZ2V0X3JlZ21hcChjb2RlYy0+ZGV2LCBOVUxMKSkKLQkJc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDAsIDAsIFNORF9TT0NfUkVHTUFQKTsKLQogCWlmIChkcml2ZXItPmNvbnRyb2xzKQogCQlzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgZHJpdmVyLT5jb250cm9scywKIAkJCQkgICAgIGRyaXZlci0+bnVtX2NvbnRyb2xzKTsKQEAgLTExODAsNiArMTE4Niw3IEBACiB7CiAJaW50IHJldCA9IDA7CiAJY29uc3Qgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyICpkcml2ZXIgPSBwbGF0Zm9ybS0+ZHJpdmVyOworCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50OwogCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpOwogCiAJcGxhdGZvcm0tPmNhcmQgPSBjYXJkOwpAQCAtMTE5NSwxMSArMTIwMiwxMSBAQAogCQkJZHJpdmVyLT5kYXBtX3dpZGdldHMsIGRyaXZlci0+bnVtX2RhcG1fd2lkZ2V0cyk7CiAKIAkvKiBDcmVhdGUgREFQTSB3aWRnZXRzIGZvciBlYWNoIERBSSBzdHJlYW0gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRhaSwgJmRhaV9saXN0LCBsaXN0KSB7Ci0JCWlmIChkYWktPmRldiAhPSBwbGF0Zm9ybS0+ZGV2KQorCWxpc3RfZm9yX2VhY2hfZW50cnkoY29tcG9uZW50LCAmY29tcG9uZW50X2xpc3QsIGxpc3QpIHsKKwkJaWYgKGNvbXBvbmVudC0+ZGV2ICE9IHBsYXRmb3JtLT5kZXYpCiAJCQljb250aW51ZTsKLQotCQlzbmRfc29jX2RhcG1fbmV3X2RhaV93aWRnZXRzKCZwbGF0Zm9ybS0+ZGFwbSwgZGFpKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShkYWksICZjb21wb25lbnQtPmRhaV9saXN0LCBsaXN0KQorCQkJc25kX3NvY19kYXBtX25ld19kYWlfd2lkZ2V0cygmcGxhdGZvcm0tPmRhcG0sIGRhaSk7CiAJfQogCiAJcGxhdGZvcm0tPmRhcG0uaWRsZV9iaWFzX29mZiA9IDE7CkBAIC0xMjQ2LDcgKzEyNTMsNyBAQAogCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IE5VTEw7CiAJc3RydWN0IHNuZF9zb2NfYXV4X2RldiAqYXV4X2RldiA9IE5VTEw7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKLQljb25zdCBjaGFyICp0ZW1wLCAqbmFtZTsKKwljb25zdCBjaGFyICpuYW1lOwogCWludCByZXQgPSAwOwogCiAJaWYgKCFkYWlsZXNzKSB7CkBAIC0xMjYwLDEwICsxMjY3LDYgQEAKIAl9CiAJcnRkLT5jYXJkID0gY2FyZDsKIAotCS8qIG1hY2hpbmUgY29udHJvbHMsIHJvdXRlcyBhbmQgd2lkZ2V0cyBhcmUgbm90IHByZWZpeGVkICovCi0JdGVtcCA9IGNvZGVjLT5uYW1lX3ByZWZpeDsKLQljb2RlYy0+bmFtZV9wcmVmaXggPSBOVUxMOwotCiAJLyogZG8gbWFjaGluZSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiAqLwogCWlmICghZGFpbGVzcyAmJiBkYWlfbGluay0+aW5pdCkKIAkJcmV0ID0gZGFpX2xpbmstPmluaXQocnRkKTsKQEAgLTEyNzMsNyArMTI3Niw2IEBACiAJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQVNvQzogZmFpbGVkIHRvIGluaXQgJXM6ICVkXG4iLCBuYW1lLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KLQljb2RlYy0+bmFtZV9wcmVmaXggPSB0ZW1wOwogCiAJLyogcmVnaXN0ZXIgdGhlIHJ0ZCBkZXZpY2UgKi8KIAlydGQtPmNvZGVjID0gY29kZWM7CkBAIC0xNjU0LDcgKzE2NTYsNyBAQAogCX0KIAogCS8qIGNhcmQgYmluZCBjb21wbGV0ZSBzbyByZWdpc3RlciBhIHNvdW5kIGNhcmQgKi8KLQlyZXQgPSBzbmRfY2FyZF9jcmVhdGUoU05EUlZfREVGQVVMVF9JRFgxLCBTTkRSVl9ERUZBVUxUX1NUUjEsCisJcmV0ID0gc25kX2NhcmRfbmV3KGNhcmQtPmRldiwgU05EUlZfREVGQVVMVF9JRFgxLCBTTkRSVl9ERUZBVUxUX1NUUjEsCiAJCQljYXJkLT5vd25lciwgMCwgJmNhcmQtPnNuZF9jYXJkKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNhcmQtPmRldiwKQEAgLTE2NjIsNyArMTY2NCw2IEBACiAJCQljYXJkLT5uYW1lLCByZXQpOwogCQlnb3RvIGJhc2VfZXJyb3I7CiAJfQotCWNhcmQtPnNuZF9jYXJkLT5kZXYgPSBjYXJkLT5kZXY7CiAKIAljYXJkLT5kYXBtLmJpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfT0ZGOwogCWNhcmQtPmRhcG0uZGV2ID0gY2FyZC0+ZGV2OwpAQCAtMjU3MSwxMCArMjU3MiwxMCBAQAogCiAJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CiAJdWluZm8tPmNvdW50ID0gZS0+c2hpZnRfbCA9PSBlLT5zaGlmdF9yID8gMSA6IDI7Ci0JdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSBlLT5tYXg7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSBlLT5pdGVtczsKIAotCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gZS0+bWF4IC0gMSkKLQkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IGUtPm1heCAtIDE7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gZS0+aXRlbXMpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSBlLT5pdGVtcyAtIDE7CiAJc3RybGNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLAogCQllLT50ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSwKIAkJc2l6ZW9mKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUpKTsKQEAgLTI1OTYsMTQgKzI1OTcsMTggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXVuc2lnbmVkIGludCB2YWw7CisJdW5zaWduZWQgaW50IHZhbCwgaXRlbTsKKwl1bnNpZ25lZCBpbnQgcmVnX3ZhbDsKIAotCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgZS0+cmVnKTsKLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdCi0JCT0gKHZhbCA+PiBlLT5zaGlmdF9sKSAmIGUtPm1hc2s7Ci0JaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikKLQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA9Ci0JCQkodmFsID4+IGUtPnNoaWZ0X3IpICYgZS0+bWFzazsKKwlyZWdfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBlLT5yZWcpOworCXZhbCA9IChyZWdfdmFsID4+IGUtPnNoaWZ0X2wpICYgZS0+bWFzazsKKwlpdGVtID0gc25kX3NvY19lbnVtX3ZhbF90b19pdGVtKGUsIHZhbCk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGl0ZW07CisJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgeworCQl2YWwgPSAocmVnX3ZhbCA+PiBlLT5zaGlmdF9sKSAmIGUtPm1hc2s7CisJCWl0ZW0gPSBzbmRfc29jX2VudW1fdmFsX3RvX2l0ZW0oZSwgdmFsKTsKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA9IGl0ZW07CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNjIzLDE3ICsyNjI4LDE4IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBpbnQgKml0ZW0gPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtOwogCXVuc2lnbmVkIGludCB2YWw7CiAJdW5zaWduZWQgaW50IG1hc2s7CiAKLQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IGUtPm1heCAtIDEpCisJaWYgKGl0ZW1bMF0gPj0gZS0+aXRlbXMpCiAJCXJldHVybiAtRUlOVkFMOwotCXZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPDwgZS0+c2hpZnRfbDsKKwl2YWwgPSBzbmRfc29jX2VudW1faXRlbV90b192YWwoZSwgaXRlbVswXSkgPDwgZS0+c2hpZnRfbDsKIAltYXNrID0gZS0+bWFzayA8PCBlLT5zaGlmdF9sOwogCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpIHsKLQkJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPiBlLT5tYXggLSAxKQorCQlpZiAoaXRlbVsxXSA+PSBlLT5pdGVtcykKIAkJCXJldHVybiAtRUlOVkFMOwotCQl2YWwgfD0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA8PCBlLT5zaGlmdF9yOworCQl2YWwgfD0gc25kX3NvY19lbnVtX2l0ZW1fdG9fdmFsKGUsIGl0ZW1bMV0pIDw8IGUtPnNoaWZ0X3I7CiAJCW1hc2sgfD0gZS0+bWFzayA8PCBlLT5zaGlmdF9yOwogCX0KIApAQCAtMjY0Miw3OCArMjY0OCw0NiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19wdXRfZW51bV9kb3VibGUpOwogCiAvKioKLSAqIHNuZF9zb2NfZ2V0X3ZhbHVlX2VudW1fZG91YmxlIC0gc2VtaSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBnZXQgY2FsbGJhY2sKLSAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAotICogQHVjb250cm9sOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqIHNuZF9zb2NfcmVhZF9zaWduZWQgLSBSZWFkIGEgY29kZWMgcmVnaXN0ZXIgYW5kIGludGVycHJldGUgYXMgc2lnbmVkIHZhbHVlCisgKiBAY29kZWM6IGNvZGVjCisgKiBAcmVnOiBSZWdpc3RlciB0byByZWFkCisgKiBAbWFzazogTWFzayB0byB1c2UgYWZ0ZXIgc2hpZnRpbmcgdGhlIHJlZ2lzdGVyIHZhbHVlCisgKiBAc2hpZnQ6IFJpZ2h0IHNoaWZ0IG9mIHJlZ2lzdGVyIHZhbHVlCisgKiBAc2lnbl9iaXQ6IEJpdCB0aGF0IGRlc2NyaWJlcyBpZiBhIG51bWJlciBpcyBuZWdhdGl2ZSBvciBub3QuCiAgKgotICogQ2FsbGJhY2sgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhIGRvdWJsZSBzZW1pIGVudW1lcmF0ZWQgbWl4ZXIuCisgKiBUaGlzIGZ1bmN0aW9ucyByZWFkcyBhIGNvZGVjIHJlZ2lzdGVyLiBUaGUgcmVnaXN0ZXIgdmFsdWUgaXMgc2hpZnRlZCByaWdodAorICogYnkgJ3NoaWZ0JyBiaXRzIGFuZCBtYXNrZWQgd2l0aCB0aGUgZ2l2ZW4gJ21hc2snLiBBZnRlcndhcmRzIGl0IHRyYW5zbGF0ZXMKKyAqIHRoZSBnaXZlbiByZWdpc3RlcnZhbHVlIGludG8gYSBzaWduZWQgaW50ZWdlciBpZiBzaWduX2JpdCBpcyBub24temVyby4KICAqCi0gKiBTZW1pIGVudW1lcmF0ZWQgbWl4ZXI6IHRoZSBlbnVtZXJhdGVkIGl0ZW1zIGFyZSByZWZlcnJlZCBhcyB2YWx1ZXMuIENhbiBiZQotICogdXNlZCBmb3IgaGFuZGxpbmcgYml0ZmllbGQgY29kZWQgZW51bWVyYXRpb24gZm9yIGV4YW1wbGUuCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICogUmV0dXJucyB0aGUgcmVnaXN0ZXIgdmFsdWUgYXMgc2lnbmVkIGludC4KICAqLwotaW50IHNuZF9zb2NfZ2V0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorc3RhdGljIGludCBzbmRfc29jX3JlYWRfc2lnbmVkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwkJdW5zaWduZWQgaW50IG1hc2ssIHVuc2lnbmVkIGludCBzaGlmdCwgdW5zaWduZWQgaW50IHNpZ25fYml0KQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0JdW5zaWduZWQgaW50IHJlZ192YWwsIHZhbCwgbXV4OwotCi0JcmVnX3ZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgZS0+cmVnKTsKLQl2YWwgPSAocmVnX3ZhbCA+PiBlLT5zaGlmdF9sKSAmIGUtPm1hc2s7Ci0JZm9yIChtdXggPSAwOyBtdXggPCBlLT5tYXg7IG11eCsrKSB7Ci0JCWlmICh2YWwgPT0gZS0+dmFsdWVzW211eF0pCi0JCQlicmVhazsKLQl9Ci0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IG11eDsKLQlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKSB7Ci0JCXZhbCA9IChyZWdfdmFsID4+IGUtPnNoaWZ0X3IpICYgZS0+bWFzazsKLQkJZm9yIChtdXggPSAwOyBtdXggPCBlLT5tYXg7IG11eCsrKSB7Ci0JCQlpZiAodmFsID09IGUtPnZhbHVlc1ttdXhdKQotCQkJCWJyZWFrOwotCQl9Ci0JCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPSBtdXg7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2dldF92YWx1ZV9lbnVtX2RvdWJsZSk7Ci0KLS8qKgotICogc25kX3NvY19wdXRfdmFsdWVfZW51bV9kb3VibGUgLSBzZW1pIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIHB1dCBjYWxsYmFjawotICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCi0gKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgotICoKLSAqIENhbGxiYWNrIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBkb3VibGUgc2VtaSBlbnVtZXJhdGVkIG1peGVyLgotICoKLSAqIFNlbWkgZW51bWVyYXRlZCBtaXhlcjogdGhlIGVudW1lcmF0ZWQgaXRlbXMgYXJlIHJlZmVycmVkIGFzIHZhbHVlcy4gQ2FuIGJlCi0gKiB1c2VkIGZvciBoYW5kbGluZyBiaXRmaWVsZCBjb2RlZCBlbnVtZXJhdGlvbiBmb3IgZXhhbXBsZS4KLSAqCi0gKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCi0gKi8KLWludCBzbmRfc29jX3B1dF92YWx1ZV9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCWludCByZXQ7CiAJdW5zaWduZWQgaW50IHZhbDsKLQl1bnNpZ25lZCBpbnQgbWFzazsKIAotCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gZS0+bWF4IC0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JdmFsID0gZS0+dmFsdWVzW3Vjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF1dIDw8IGUtPnNoaWZ0X2w7Ci0JbWFzayA9IGUtPm1hc2sgPDwgZS0+c2hpZnRfbDsKLQlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKSB7Ci0JCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID4gZS0+bWF4IC0gMSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQl2YWwgfD0gZS0+dmFsdWVzW3Vjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV1dIDw8IGUtPnNoaWZ0X3I7Ci0JCW1hc2sgfD0gZS0+bWFzayA8PCBlLT5zaGlmdF9yOwotCX0KKwl2YWwgPSAoc25kX3NvY19yZWFkKGNvZGVjLCByZWcpID4+IHNoaWZ0KSAmIG1hc2s7CiAKLQlyZXR1cm4gc25kX3NvY191cGRhdGVfYml0c19sb2NrZWQoY29kZWMsIGUtPnJlZywgbWFzaywgdmFsKTsKKwlpZiAoIXNpZ25fYml0KQorCQlyZXR1cm4gdmFsOworCisJLyogbm9uLW5lZ2F0aXZlIG51bWJlciAqLworCWlmICghKHZhbCAmIEJJVChzaWduX2JpdCkpKQorCQlyZXR1cm4gdmFsOworCisJcmV0ID0gdmFsOworCisJLyoKKwkgKiBUaGUgcmVnaXN0ZXIgbW9zdCBwcm9iYWJseSBkb2VzIG5vdCBjb250YWluIGEgZnVsbC1zaXplZCBpbnQuCisJICogSW5zdGVhZCB3ZSBoYXZlIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgYml0cyBpbiBhIHNpZ25lZAorCSAqIHJlcHJlc2VudGF0aW9uIHdoaWNoIGhhcyB0byBiZSB0cmFuc2xhdGVkIGludG8gYSBmdWxsLXNpemVkIGludC4KKwkgKiBUaGlzIGlzIGRvbmUgYnkgZmlsbGluZyB1cCBhbGwgYml0cyBhYm92ZSB0aGUgc2lnbi1iaXQuCisJICovCisJcmV0IHw9IH4oKGludCkoQklUKHNpZ25fYml0KSAtIDEpKTsKKworCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3B1dF92YWx1ZV9lbnVtX2RvdWJsZSk7CiAKIC8qKgogICogc25kX3NvY19pbmZvX3ZvbHN3IC0gc2luZ2xlIG1peGVyIGluZm8gY2FsbGJhY2sKQEAgLTI3NDMsNyArMjcxNyw3IEBACiAKIAl1aW5mby0+Y291bnQgPSBzbmRfc29jX3ZvbHN3X2lzX3N0ZXJlbyhtYykgPyAyIDogMTsKIAl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IHBsYXRmb3JtX21heDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBwbGF0Zm9ybV9tYXggLSBtYy0+bWluOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19pbmZvX3ZvbHN3KTsKQEAgLTI3NjksMTEgKzI3NDMsMTYgQEAKIAl1bnNpZ25lZCBpbnQgc2hpZnQgPSBtYy0+c2hpZnQ7CiAJdW5zaWduZWQgaW50IHJzaGlmdCA9IG1jLT5yc2hpZnQ7CiAJaW50IG1heCA9IG1jLT5tYXg7CisJaW50IG1pbiA9IG1jLT5taW47CisJaW50IHNpZ25fYml0ID0gbWMtPnNpZ25fYml0OwogCXVuc2lnbmVkIGludCBtYXNrID0gKDEgPDwgZmxzKG1heCkpIC0gMTsKIAl1bnNpZ25lZCBpbnQgaW52ZXJ0ID0gbWMtPmludmVydDsKIAotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KLQkJKHNuZF9zb2NfcmVhZChjb2RlYywgcmVnKSA+PiBzaGlmdCkgJiBtYXNrOworCWlmIChzaWduX2JpdCkKKwkJbWFzayA9IEJJVChzaWduX2JpdCArIDEpIC0gMTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc25kX3NvY19yZWFkX3NpZ25lZChjb2RlYywgcmVnLCBtYXNrLAorCQkJc2hpZnQsIHNpZ25fYml0KSAtIG1pbjsKIAlpZiAoaW52ZXJ0KQogCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CiAJCQltYXggLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKQEAgLTI3ODEsMTAgKzI3NjAsMTIgQEAKIAlpZiAoc25kX3NvY192b2xzd19pc19zdGVyZW8obWMpKSB7CiAJCWlmIChyZWcgPT0gcmVnMikKIAkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0KLQkJCQkoc25kX3NvY19yZWFkKGNvZGVjLCByZWcpID4+IHJzaGlmdCkgJiBtYXNrOworCQkJCXNuZF9zb2NfcmVhZF9zaWduZWQoY29kZWMsIHJlZywgbWFzaywgcnNoaWZ0LAorCQkJCQkJc2lnbl9iaXQpIC0gbWluOwogCQllbHNlCiAJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9Ci0JCQkJKHNuZF9zb2NfcmVhZChjb2RlYywgcmVnMikgPj4gc2hpZnQpICYgbWFzazsKKwkJCQlzbmRfc29jX3JlYWRfc2lnbmVkKGNvZGVjLCByZWcyLCBtYXNrLCBzaGlmdCwKKwkJCQkJCXNpZ25fYml0KSAtIG1pbjsKIAkJaWYgKGludmVydCkKIAkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0KIAkJCQltYXggLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKQEAgLTI4MTUsMjAgKzI3OTYsMjUgQEAKIAl1bnNpZ25lZCBpbnQgc2hpZnQgPSBtYy0+c2hpZnQ7CiAJdW5zaWduZWQgaW50IHJzaGlmdCA9IG1jLT5yc2hpZnQ7CiAJaW50IG1heCA9IG1jLT5tYXg7CisJaW50IG1pbiA9IG1jLT5taW47CisJdW5zaWduZWQgaW50IHNpZ25fYml0ID0gbWMtPnNpZ25fYml0OwogCXVuc2lnbmVkIGludCBtYXNrID0gKDEgPDwgZmxzKG1heCkpIC0gMTsKIAl1bnNpZ25lZCBpbnQgaW52ZXJ0ID0gbWMtPmludmVydDsKIAlpbnQgZXJyOwotCWJvb2wgdHlwZV8yciA9IDA7CisJYm9vbCB0eXBlXzJyID0gZmFsc2U7CiAJdW5zaWduZWQgaW50IHZhbDIgPSAwOwogCXVuc2lnbmVkIGludCB2YWwsIHZhbF9tYXNrOwogCi0JdmFsID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzayk7CisJaWYgKHNpZ25fYml0KQorCQltYXNrID0gQklUKHNpZ25fYml0ICsgMSkgLSAxOworCisJdmFsID0gKCh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSArIG1pbikgJiBtYXNrKTsKIAlpZiAoaW52ZXJ0KQogCQl2YWwgPSBtYXggLSB2YWw7CiAJdmFsX21hc2sgPSBtYXNrIDw8IHNoaWZ0OwogCXZhbCA9IHZhbCA8PCBzaGlmdDsKIAlpZiAoc25kX3NvY192b2xzd19pc19zdGVyZW8obWMpKSB7Ci0JCXZhbDIgPSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gJiBtYXNrKTsKKwkJdmFsMiA9ICgodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gKyBtaW4pICYgbWFzayk7CiAJCWlmIChpbnZlcnQpCiAJCQl2YWwyID0gbWF4IC0gdmFsMjsKIAkJaWYgKHJlZyA9PSByZWcyKSB7CkBAIC0yODM2LDcgKzI4MjIsNyBAQAogCQkJdmFsIHw9IHZhbDIgPDwgcnNoaWZ0OwogCQl9IGVsc2UgewogCQkJdmFsMiA9IHZhbDIgPDwgc2hpZnQ7Ci0JCQl0eXBlXzJyID0gMTsKKwkJCXR5cGVfMnIgPSB0cnVlOwogCQl9CiAJfQogCWVyciA9IHNuZF9zb2NfdXBkYXRlX2JpdHNfbG9ja2VkKGNvZGVjLCByZWcsIHZhbF9tYXNrLCB2YWwpOwpAQCAtMzIzNCw3ICszMjIwLDcgQEAKIAlzdHJ1Y3Qgc29jX2J5dGVzICpwYXJhbXMgPSAodm9pZCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlpbnQgcmV0LCBsZW47Ci0JdW5zaWduZWQgaW50IHZhbDsKKwl1bnNpZ25lZCBpbnQgdmFsLCBtYXNrOwogCXZvaWQgKmRhdGE7CiAKIAlpZiAoIWNvZGVjLT51c2luZ19yZWdtYXApCkBAIC0zMjY0LDEyICszMjUwLDM2IEBACiAJCQkoKHU4ICopZGF0YSlbMF0gfD0gdmFsOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoKLQkJCSgodTE2ICopZGF0YSlbMF0gJj0gY3B1X3RvX2JlMTYofnBhcmFtcy0+bWFzayk7Ci0JCQkoKHUxNiAqKWRhdGEpWzBdIHw9IGNwdV90b19iZTE2KHZhbCk7CisJCQltYXNrID0gfnBhcmFtcy0+bWFzazsKKwkJCXJldCA9IHJlZ21hcF9wYXJzZV92YWwoY29kZWMtPmNvbnRyb2xfZGF0YSwKKwkJCQkJCQkmbWFzaywgJm1hc2spOworCQkJaWYgKHJldCAhPSAwKQorCQkJCWdvdG8gb3V0OworCisJCQkoKHUxNiAqKWRhdGEpWzBdICY9IG1hc2s7CisKKwkJCXJldCA9IHJlZ21hcF9wYXJzZV92YWwoY29kZWMtPmNvbnRyb2xfZGF0YSwKKwkJCQkJCQkmdmFsLCAmdmFsKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlnb3RvIG91dDsKKworCQkJKCh1MTYgKilkYXRhKVswXSB8PSB2YWw7CiAJCQlicmVhazsKIAkJY2FzZSA0OgotCQkJKCh1MzIgKilkYXRhKVswXSAmPSBjcHVfdG9fYmUzMih+cGFyYW1zLT5tYXNrKTsKLQkJCSgodTMyICopZGF0YSlbMF0gfD0gY3B1X3RvX2JlMzIodmFsKTsKKwkJCW1hc2sgPSB+cGFyYW1zLT5tYXNrOworCQkJcmV0ID0gcmVnbWFwX3BhcnNlX3ZhbChjb2RlYy0+Y29udHJvbF9kYXRhLAorCQkJCQkJCSZtYXNrLCAmbWFzayk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJZ290byBvdXQ7CisKKwkJCSgodTMyICopZGF0YSlbMF0gJj0gbWFzazsKKworCQkJcmV0ID0gcmVnbWFwX3BhcnNlX3ZhbChjb2RlYy0+Y29udHJvbF9kYXRhLAorCQkJCQkJCSZ2YWwsICZ2YWwpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCWdvdG8gb3V0OworCisJCQkoKHUzMiAqKWRhdGEpWzBdIHw9IHZhbDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0ID0gLUVJTlZBTDsKQEAgLTM2MDksNiArMzYxOSwzMCBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYWlfc2V0X2ZtdCk7CiAKIC8qKgorICogc25kX3NvY194bGF0ZV90ZG1fc2xvdCAtIGdlbmVyYXRlIHR4L3J4IHNsb3QgbWFzay4KKyAqIEBzbG90czogTnVtYmVyIG9mIHNsb3RzIGluIHVzZS4KKyAqIEB0eF9tYXNrOiBiaXRtYXNrIHJlcHJlc2VudGluZyBhY3RpdmUgVFggc2xvdHMuCisgKiBAcnhfbWFzazogYml0bWFzayByZXByZXNlbnRpbmcgYWN0aXZlIFJYIHNsb3RzLgorICoKKyAqIEdlbmVyYXRlcyB0aGUgVERNIHR4IGFuZCByeCBzbG90IGRlZmF1bHQgbWFza3MgZm9yIERBSS4KKyAqLworc3RhdGljIGludCBzbmRfc29jX3hsYXRlX3RkbV9zbG90X21hc2sodW5zaWduZWQgaW50IHNsb3RzLAorCQkJCQkgIHVuc2lnbmVkIGludCAqdHhfbWFzaywKKwkJCQkJICB1bnNpZ25lZCBpbnQgKnJ4X21hc2spCit7CisJaWYgKCp0eF9tYXNrIHx8ICpyeF9tYXNrKQorCQlyZXR1cm4gMDsKKworCWlmICghc2xvdHMpCisJCXJldHVybiAtRUlOVkFMOworCisJKnR4X21hc2sgPSAoMSA8PCBzbG90cykgLSAxOworCSpyeF9tYXNrID0gKDEgPDwgc2xvdHMpIC0gMTsKKworCXJldHVybiAwOworfQorCisvKioKICAqIHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdCAtIGNvbmZpZ3VyZSBEQUkgVERNLgogICogQGRhaTogREFJCiAgKiBAdHhfbWFzazogYml0bWFzayByZXByZXNlbnRpbmcgYWN0aXZlIFRYIHNsb3RzLgpAQCAtMzYyMiwxMSArMzY1NiwxNyBAQAogaW50IHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKIAl1bnNpZ25lZCBpbnQgdHhfbWFzaywgdW5zaWduZWQgaW50IHJ4X21hc2ssIGludCBzbG90cywgaW50IHNsb3Rfd2lkdGgpCiB7CisJaWYgKGRhaS0+ZHJpdmVyICYmIGRhaS0+ZHJpdmVyLT5vcHMtPnhsYXRlX3RkbV9zbG90X21hc2spCisJCWRhaS0+ZHJpdmVyLT5vcHMtPnhsYXRlX3RkbV9zbG90X21hc2soc2xvdHMsCisJCQkJCQkmdHhfbWFzaywgJnJ4X21hc2spOworCWVsc2UKKwkJc25kX3NvY194bGF0ZV90ZG1fc2xvdF9tYXNrKHNsb3RzLCAmdHhfbWFzaywgJnJ4X21hc2spOworCiAJaWYgKGRhaS0+ZHJpdmVyICYmIGRhaS0+ZHJpdmVyLT5vcHMtPnNldF90ZG1fc2xvdCkKIAkJcmV0dXJuIGRhaS0+ZHJpdmVyLT5vcHMtPnNldF90ZG1fc2xvdChkYWksIHR4X21hc2ssIHJ4X21hc2ssCiAJCQkJc2xvdHMsIHNsb3Rfd2lkdGgpOwogCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAtRU5PVFNVUFA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QpOwogCkBAIC0zODgyLDk1ICszOTIyLDQyIEBACiB9CiAKIC8qKgotICogc25kX3NvY19yZWdpc3Rlcl9kYWkgLSBSZWdpc3RlciBhIERBSSB3aXRoIHRoZSBBU29DIGNvcmUKKyAqIHNuZF9zb2NfdW5yZWdpc3Rlcl9kYWkgLSBVbnJlZ2lzdGVyIERBSXMgZnJvbSB0aGUgQVNvQyBjb3JlCiAgKgotICogQGRhaTogREFJIHRvIHJlZ2lzdGVyCisgKiBAY29tcG9uZW50OiBUaGUgY29tcG9uZW50IGZvciB3aGljaCB0aGUgREFJcyBzaG91bGQgYmUgdW5yZWdpc3RlcmVkCiAgKi8KLXN0YXRpYyBpbnQgc25kX3NvY19yZWdpc3Rlcl9kYWkoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyICpkYWlfZHJ2KQorc3RhdGljIHZvaWQgc25kX3NvY191bnJlZ2lzdGVyX2RhaXMoc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCAqX2RhaTsKIAotCWRldl9kYmcoZGV2LCAiQVNvQzogZGFpIHJlZ2lzdGVyICVzXG4iLCBkZXZfbmFtZShkZXYpKTsKLQotCWRhaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbmRfc29jX2RhaSksIEdGUF9LRVJORUwpOwotCWlmIChkYWkgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBjcmVhdGUgREFJIGNvbXBvbmVudCBuYW1lICovCi0JZGFpLT5uYW1lID0gZm10X3NpbmdsZV9uYW1lKGRldiwgJmRhaS0+aWQpOwotCWlmIChkYWktPm5hbWUgPT0gTlVMTCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkYWksIF9kYWksICZjb21wb25lbnQtPmRhaV9saXN0LCBsaXN0KSB7CisJCWRldl9kYmcoY29tcG9uZW50LT5kZXYsICJBU29DOiBVbnJlZ2lzdGVyZWQgREFJICclcydcbiIsCisJCQlkYWktPm5hbWUpOworCQlsaXN0X2RlbCgmZGFpLT5saXN0KTsKKwkJa2ZyZWUoZGFpLT5uYW1lKTsKIAkJa2ZyZWUoZGFpKTsKLQkJcmV0dXJuIC1FTk9NRU07CiAJfQotCi0JZGFpLT5kZXYgPSBkZXY7Ci0JZGFpLT5kcml2ZXIgPSBkYWlfZHJ2OwotCWRhaS0+ZGFwbS5kZXYgPSBkZXY7Ci0JaWYgKCFkYWktPmRyaXZlci0+b3BzKQotCQlkYWktPmRyaXZlci0+b3BzID0gJm51bGxfZGFpX29wczsKLQotCW11dGV4X2xvY2soJmNsaWVudF9tdXRleCk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjLCAmY29kZWNfbGlzdCwgbGlzdCkgewotCQlpZiAoY29kZWMtPmRldiA9PSBkZXYpIHsKLQkJCWRldl9kYmcoZGV2LCAiQVNvQzogTWFwcGVkIERBSSAlcyB0byBDT0RFQyAlc1xuIiwKLQkJCQlkYWktPm5hbWUsIGNvZGVjLT5uYW1lKTsKLQkJCWRhaS0+Y29kZWMgPSBjb2RlYzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKCFkYWktPmNvZGVjKQotCQlkYWktPmRhcG0uaWRsZV9iaWFzX29mZiA9IDE7Ci0KLQlsaXN0X2FkZCgmZGFpLT5saXN0LCAmZGFpX2xpc3QpOwotCi0JbXV0ZXhfdW5sb2NrKCZjbGllbnRfbXV0ZXgpOwotCi0JZGV2X2RiZyhkZXYsICJBU29DOiBSZWdpc3RlcmVkIERBSSAnJXMnXG4iLCBkYWktPm5hbWUpOwotCi0JcmV0dXJuIDA7CiB9CiAKIC8qKgotICogc25kX3NvY191bnJlZ2lzdGVyX2RhaSAtIFVucmVnaXN0ZXIgYSBEQUkgZnJvbSB0aGUgQVNvQyBjb3JlCisgKiBzbmRfc29jX3JlZ2lzdGVyX2RhaXMgLSBSZWdpc3RlciBhIERBSSB3aXRoIHRoZSBBU29DIGNvcmUKICAqCi0gKiBAZGFpOiBEQUkgdG8gdW5yZWdpc3RlcgotICovCi1zdGF0aWMgdm9pZCBzbmRfc29jX3VucmVnaXN0ZXJfZGFpKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGFpLCAmZGFpX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGRldiA9PSBkYWktPmRldikKLQkJCWdvdG8gZm91bmQ7Ci0JfQotCXJldHVybjsKLQotZm91bmQ6Ci0JbXV0ZXhfbG9jaygmY2xpZW50X211dGV4KTsKLQlsaXN0X2RlbCgmZGFpLT5saXN0KTsKLQltdXRleF91bmxvY2soJmNsaWVudF9tdXRleCk7Ci0KLQlkZXZfZGJnKGRldiwgIkFTb0M6IFVucmVnaXN0ZXJlZCBEQUkgJyVzJ1xuIiwgZGFpLT5uYW1lKTsKLQlrZnJlZShkYWktPm5hbWUpOwotCWtmcmVlKGRhaSk7Ci19Ci0KLS8qKgotICogc25kX3NvY19yZWdpc3Rlcl9kYWlzIC0gUmVnaXN0ZXIgbXVsdGlwbGUgREFJcyB3aXRoIHRoZSBBU29DIGNvcmUKLSAqCi0gKiBAZGFpOiBBcnJheSBvZiBEQUlzIHRvIHJlZ2lzdGVyCisgKiBAY29tcG9uZW50OiBUaGUgY29tcG9uZW50IHRoZSBEQUlzIGFyZSByZWdpc3RlcmVkIGZvcgorICogQGNvZGVjOiBUaGUgQ09ERUMgdGhhdCB0aGUgREFJcyBhcmUgcmVnaXN0ZXJlZCBmb3IsIE5VTEwgaWYgdGhlIGNvbXBvbmVudCBpcworICogICAgICAgICBub3QgYSBDT0RFQy4KKyAqIEBkYWlfZHJ2OiBEQUkgZHJpdmVyIHRvIHVzZSBmb3IgdGhlIERBSXMKICAqIEBjb3VudDogTnVtYmVyIG9mIERBSXMKKyAqIEBsZWdhY3lfZGFpX25hbWluZzogVXNlIHRoZSBsZWdhY3kgbmFtaW5nIHNjaGVtZSBhbmQgbGV0IHRoZSBEQUkgaW5oZXJpdCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgcGFyZW50J3MgbmFtZS4KICAqLwotc3RhdGljIGludCBzbmRfc29jX3JlZ2lzdGVyX2RhaXMoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyICpkYWlfZHJ2LCBzaXplX3QgY291bnQpCitzdGF0aWMgaW50IHNuZF9zb2NfcmVnaXN0ZXJfZGFpcyhzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCwKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaV9kcnYsCisJc2l6ZV90IGNvdW50LCBib29sIGxlZ2FjeV9kYWlfbmFtaW5nKQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb21wb25lbnQtPmRldjsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaTsKLQlpbnQgaSwgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OwogCiAJZGV2X2RiZyhkZXYsICJBU29DOiBkYWkgcmVnaXN0ZXIgJXMgIyVadVxuIiwgZGV2X25hbWUoZGV2KSwgY291bnQpOwogCkBAIC0zOTgyLDcwICszOTY5LDU0IEBACiAJCQlnb3RvIGVycjsKIAkJfQogCi0JCS8qIGNyZWF0ZSBEQUkgY29tcG9uZW50IG5hbWUgKi8KLQkJZGFpLT5uYW1lID0gZm10X211bHRpcGxlX25hbWUoZGV2LCAmZGFpX2RydltpXSk7CisJCS8qCisJCSAqIEJhY2sgaW4gdGhlIG9sZCBkYXlzIHdoZW4gd2Ugc3RpbGwgaGFkIGNvbXBvbmVudC1sZXNzIERBSXMsCisJCSAqIGluc3RlYWQgb2YgaGF2aW5nIGEgc3RhdGljIG5hbWUsIGNvbXBvbmVudC1sZXNzIERBSXMgd291bGQKKwkJICogaW5oZXJpdCB0aGUgbmFtZSBvZiB0aGUgcGFyZW50IGRldmljZSBzbyBpdCBpcyBwb3NzaWJsZSB0bworCQkgKiByZWdpc3RlciBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIERBSS4gV2Ugc3RpbGwgbmVlZCB0byBrZWVwCisJCSAqIHRoZSBzYW1lIG5hbWluZyBzdHlsZSBldmVuIHRob3VnaCB0aG9zZSBEQUlzIGFyZSBub3QKKwkJICogY29tcG9uZW50LWxlc3MgYW55bW9yZS4KKwkJICovCisJCWlmIChjb3VudCA9PSAxICYmIGxlZ2FjeV9kYWlfbmFtaW5nKSB7CisJCQlkYWktPm5hbWUgPSBmbXRfc2luZ2xlX25hbWUoZGV2LCAmZGFpLT5pZCk7CisJCX0gZWxzZSB7CisJCQlkYWktPm5hbWUgPSBmbXRfbXVsdGlwbGVfbmFtZShkZXYsICZkYWlfZHJ2W2ldKTsKKwkJCWlmIChkYWlfZHJ2W2ldLmlkKQorCQkJCWRhaS0+aWQgPSBkYWlfZHJ2W2ldLmlkOworCQkJZWxzZQorCQkJCWRhaS0+aWQgPSBpOworCQl9CiAJCWlmIChkYWktPm5hbWUgPT0gTlVMTCkgewogCQkJa2ZyZWUoZGFpKTsKLQkJCXJldCA9IC1FSU5WQUw7CisJCQlyZXQgPSAtRU5PTUVNOwogCQkJZ290byBlcnI7CiAJCX0KIAorCQlkYWktPmNvbXBvbmVudCA9IGNvbXBvbmVudDsKKwkJZGFpLT5jb2RlYyA9IGNvZGVjOwogCQlkYWktPmRldiA9IGRldjsKIAkJZGFpLT5kcml2ZXIgPSAmZGFpX2RydltpXTsKLQkJaWYgKGRhaS0+ZHJpdmVyLT5pZCkKLQkJCWRhaS0+aWQgPSBkYWktPmRyaXZlci0+aWQ7Ci0JCWVsc2UKLQkJCWRhaS0+aWQgPSBpOwogCQlkYWktPmRhcG0uZGV2ID0gZGV2OwogCQlpZiAoIWRhaS0+ZHJpdmVyLT5vcHMpCiAJCQlkYWktPmRyaXZlci0+b3BzID0gJm51bGxfZGFpX29wczsKIAotCQltdXRleF9sb2NrKCZjbGllbnRfbXV0ZXgpOwotCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZjb2RlY19saXN0LCBsaXN0KSB7Ci0JCQlpZiAoY29kZWMtPmRldiA9PSBkZXYpIHsKLQkJCQlkZXZfZGJnKGRldiwKLQkJCQkJIkFTb0M6IE1hcHBlZCBEQUkgJXMgdG8gQ09ERUMgJXNcbiIsCi0JCQkJCWRhaS0+bmFtZSwgY29kZWMtPm5hbWUpOwotCQkJCWRhaS0+Y29kZWMgPSBjb2RlYzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCiAJCWlmICghZGFpLT5jb2RlYykKIAkJCWRhaS0+ZGFwbS5pZGxlX2JpYXNfb2ZmID0gMTsKIAotCQlsaXN0X2FkZCgmZGFpLT5saXN0LCAmZGFpX2xpc3QpOworCQlsaXN0X2FkZCgmZGFpLT5saXN0LCAmY29tcG9uZW50LT5kYWlfbGlzdCk7CiAKLQkJbXV0ZXhfdW5sb2NrKCZjbGllbnRfbXV0ZXgpOwotCi0JCWRldl9kYmcoZGFpLT5kZXYsICJBU29DOiBSZWdpc3RlcmVkIERBSSAnJXMnXG4iLCBkYWktPm5hbWUpOworCQlkZXZfZGJnKGRldiwgIkFTb0M6IFJlZ2lzdGVyZWQgREFJICclcydcbiIsIGRhaS0+bmFtZSk7CiAJfQogCiAJcmV0dXJuIDA7CiAKIGVycjoKLQlmb3IgKGktLTsgaSA+PSAwOyBpLS0pCi0JCXNuZF9zb2NfdW5yZWdpc3Rlcl9kYWkoZGV2KTsKKwlzbmRfc29jX3VucmVnaXN0ZXJfZGFpcyhjb21wb25lbnQpOwogCiAJcmV0dXJuIHJldDsKIH0KIAogLyoqCi0gKiBzbmRfc29jX3VucmVnaXN0ZXJfZGFpcyAtIFVucmVnaXN0ZXIgbXVsdGlwbGUgREFJcyBmcm9tIHRoZSBBU29DIGNvcmUKLSAqCi0gKiBAZGFpOiBBcnJheSBvZiBEQUlzIHRvIHVucmVnaXN0ZXIKLSAqIEBjb3VudDogTnVtYmVyIG9mIERBSXMKLSAqLwotc3RhdGljIHZvaWQgc25kX3NvY191bnJlZ2lzdGVyX2RhaXMoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3QgY291bnQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJc25kX3NvY191bnJlZ2lzdGVyX2RhaShkZXYpOwotfQotCi0vKioKICAqIHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50IC0gUmVnaXN0ZXIgYSBjb21wb25lbnQgd2l0aCB0aGUgQVNvQyBjb3JlCiAgKgogICovCkBAIC00MDUzLDYgKzQwMjQsNyBAQAogX19zbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgIHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY21wbnQsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgKmNtcG50X2RydiwKKwkJCSAgICAgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCQkJICAgICBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyICpkYWlfZHJ2LAogCQkJICAgICBpbnQgbnVtX2RhaSwgYm9vbCBhbGxvd19zaW5nbGVfZGFpKQogewpAQCAtNDA3NSwyMCArNDA0NywxMCBAQAogCWNtcG50LT5kcml2ZXIJPSBjbXBudF9kcnY7CiAJY21wbnQtPmRhaV9kcnYJPSBkYWlfZHJ2OwogCWNtcG50LT5udW1fZGFpCT0gbnVtX2RhaTsKKwlJTklUX0xJU1RfSEVBRCgmY21wbnQtPmRhaV9saXN0KTsKIAotCS8qCi0JICogc25kX3NvY19yZWdpc3Rlcl9kYWkoKSAgdXNlcyBmbXRfc2luZ2xlX25hbWUoKSwgYW5kCi0JICogc25kX3NvY19yZWdpc3Rlcl9kYWlzKCkgdXNlcyBmbXRfbXVsdGlwbGVfbmFtZSgpCi0JICogZm9yIGRhaS0+bmFtZSB3aGljaCBpcyB1c2VkIGZvciBuYW1lIGJhc2VkIG1hdGNoaW5nCi0JICoKLQkgKiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgZnJvbSBjcHUvY29kZWMuCi0JICogYWxsb3dfc2luZ2xlX2RhaSBmbGFnIGNhbiBpZ25vcmUgImNvZGVjIiBkcml2ZXIgcmV3b3JraW5nCi0JICogc2luY2UgaXQgaGFkIGJlZW4gdXNlZCBzbmRfc29jX3JlZ2lzdGVyX2RhaXMoKSwKLQkgKi8KLQlpZiAoKDEgPT0gbnVtX2RhaSkgJiYgYWxsb3dfc2luZ2xlX2RhaSkKLQkJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9kYWkoZGV2LCBkYWlfZHJ2KTsKLQllbHNlCi0JCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfZGFpcyhkZXYsIGRhaV9kcnYsIG51bV9kYWkpOworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfZGFpcyhjbXBudCwgY29kZWMsIGRhaV9kcnYsIG51bV9kYWksCisJCWFsbG93X3NpbmdsZV9kYWkpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoZGV2LCAiQVNvQzogRmFpbGVkIHRvIHJlZ3N0ZXIgREFJczogJWRcbiIsIHJldCk7CiAJCWdvdG8gZXJyb3JfY29tcG9uZW50X25hbWU7CkBAIC00MTIxLDcgKzQwODMsOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlyZXR1cm4gX19zbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudChkZXYsIGNtcG50LCBjbXBudF9kcnYsCisJY21wbnQtPmlnbm9yZV9wbWRvd25fdGltZSA9IHRydWU7CisKKwlyZXR1cm4gX19zbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudChkZXYsIGNtcG50LCBjbXBudF9kcnYsIE5VTEwsCiAJCQkJCSAgICBkYWlfZHJ2LCBudW1fZGFpLCB0cnVlKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KTsKQEAgLTQxNDEsNyArNDEwNSw3IEBACiAJcmV0dXJuOwogCiBmb3VuZDoKLQlzbmRfc29jX3VucmVnaXN0ZXJfZGFpcyhkZXYsIGNtcG50LT5udW1fZGFpKTsKKwlzbmRfc29jX3VucmVnaXN0ZXJfZGFpcyhjbXBudCk7CiAKIAltdXRleF9sb2NrKCZjbGllbnRfbXV0ZXgpOwogCWxpc3RfZGVsKCZjbXBudC0+bGlzdCk7CkBAIC00MzE5LDcgKzQyODMsNyBAQAogCWNvZGVjLT52b2xhdGlsZV9yZWdpc3RlciA9IGNvZGVjX2Rydi0+dm9sYXRpbGVfcmVnaXN0ZXI7CiAJY29kZWMtPnJlYWRhYmxlX3JlZ2lzdGVyID0gY29kZWNfZHJ2LT5yZWFkYWJsZV9yZWdpc3RlcjsKIAljb2RlYy0+d3JpdGFibGVfcmVnaXN0ZXIgPSBjb2RlY19kcnYtPndyaXRhYmxlX3JlZ2lzdGVyOwotCWNvZGVjLT5pZ25vcmVfcG1kb3duX3RpbWUgPSBjb2RlY19kcnYtPmlnbm9yZV9wbWRvd25fdGltZTsKKwljb2RlYy0+Y29tcG9uZW50Lmlnbm9yZV9wbWRvd25fdGltZSA9IGNvZGVjX2Rydi0+aWdub3JlX3BtZG93bl90aW1lOwogCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfT0ZGOwogCWNvZGVjLT5kYXBtLmRldiA9IGRldjsKIAljb2RlYy0+ZGFwbS5jb2RlYyA9IGNvZGVjOwpAQCAtNDM0Miw3ICs0MzA2LDcgQEAKIAkvKiByZWdpc3RlciBjb21wb25lbnQgKi8KIAlyZXQgPSBfX3NuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KGRldiwgJmNvZGVjLT5jb21wb25lbnQsCiAJCQkJCSAgICZjb2RlY19kcnYtPmNvbXBvbmVudF9kcml2ZXIsCi0JCQkJCSAgIGRhaV9kcnYsIG51bV9kYWksIGZhbHNlKTsKKwkJCQkJICAgY29kZWMsIGRhaV9kcnYsIG51bV9kYWksIGZhbHNlKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJBU29DOiBGYWlsZWQgdG8gcmVnc3RlciBjb21wb25lbnQ6ICVkXG4iLCByZXQpOwogCQlnb3RvIGZhaWxfY29kZWNfbmFtZTsKQEAgLTQ0MTcsNiArNDM4MSwxMjIgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2Nfb2ZfcGFyc2VfY2FyZF9uYW1lKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHNpbXBsZV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX01JQygiTWljcm9waG9uZSIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9MSU5FKCJMaW5lIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fU1BLKCJTcGVha2VyIiwgTlVMTCksCit9OworCitpbnQgc25kX3NvY19vZl9wYXJzZV9hdWRpb19zaW1wbGVfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkLAorCQkJCQkgIGNvbnN0IGNoYXIgKnByb3BuYW1lKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBjYXJkLT5kZXYtPm9mX25vZGU7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldHM7CisJY29uc3QgY2hhciAqdGVtcGxhdGUsICp3bmFtZTsKKwlpbnQgaSwgaiwgbnVtX3dpZGdldHMsIHJldDsKKworCW51bV93aWRnZXRzID0gb2ZfcHJvcGVydHlfY291bnRfc3RyaW5ncyhucCwgcHJvcG5hbWUpOworCWlmIChudW1fd2lkZ2V0cyA8IDApIHsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiQVNvQzogUHJvcGVydHkgJyVzJyBkb2VzIG5vdCBleGlzdFxuIiwJcHJvcG5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG51bV93aWRnZXRzICYgMSkgeworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJBU29DOiBQcm9wZXJ0eSAnJXMnIGxlbmd0aCBpcyBub3QgZXZlblxuIiwgcHJvcG5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwludW1fd2lkZ2V0cyAvPSAyOworCWlmICghbnVtX3dpZGdldHMpIHsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJBU29DOiBQcm9wZXJ0eSAnJXMncyBsZW5ndGggaXMgemVyb1xuIiwKKwkJCXByb3BuYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd2lkZ2V0cyA9IGRldm1fa2NhbGxvYyhjYXJkLT5kZXYsIG51bV93aWRnZXRzLCBzaXplb2YoKndpZGdldHMpLAorCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghd2lkZ2V0cykgeworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJBU29DOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB3aWRnZXRzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV93aWRnZXRzOyBpKyspIHsKKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgobnAsIHByb3BuYW1lLAorCQkJMiAqIGksICZ0ZW1wbGF0ZSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCSJBU29DOiBQcm9wZXJ0eSAnJXMnIGluZGV4ICVkIHJlYWQgZXJyb3I6JWRcbiIsCisJCQkJcHJvcG5hbWUsIDIgKiBpLCByZXQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShzaW1wbGVfd2lkZ2V0cyk7IGorKykgeworCQkJaWYgKCFzdHJuY21wKHRlbXBsYXRlLCBzaW1wbGVfd2lkZ2V0c1tqXS5uYW1lLAorCQkJCSAgICAgc3RybGVuKHNpbXBsZV93aWRnZXRzW2pdLm5hbWUpKSkgeworCQkJCXdpZGdldHNbaV0gPSBzaW1wbGVfd2lkZ2V0c1tqXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChqID49IEFSUkFZX1NJWkUoc2ltcGxlX3dpZGdldHMpKSB7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCQkiQVNvQzogREFQTSB3aWRnZXQgJyVzJyBpcyBub3Qgc3VwcG9ydGVkXG4iLAorCQkJCXRlbXBsYXRlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgobnAsIHByb3BuYW1lLAorCQkJCQkJICAgICgyICogaSkgKyAxLAorCQkJCQkJICAgICZ3bmFtZSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCSJBU29DOiBQcm9wZXJ0eSAnJXMnIGluZGV4ICVkIHJlYWQgZXJyb3I6JWRcbiIsCisJCQkJcHJvcG5hbWUsICgyICogaSkgKyAxLCByZXQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQl3aWRnZXRzW2ldLm5hbWUgPSB3bmFtZTsKKwl9CisKKwljYXJkLT5kYXBtX3dpZGdldHMgPSB3aWRnZXRzOworCWNhcmQtPm51bV9kYXBtX3dpZGdldHMgPSBudW1fd2lkZ2V0czsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19vZl9wYXJzZV9hdWRpb19zaW1wbGVfd2lkZ2V0cyk7CisKK2ludCBzbmRfc29jX29mX3BhcnNlX3RkbV9zbG90KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKnNsb3RzLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpzbG90X3dpZHRoKQoreworCXUzMiB2YWw7CisJaW50IHJldDsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJkYWktdGRtLXNsb3QtbnVtIikpIHsKKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJkYWktdGRtLXNsb3QtbnVtIiwgJnZhbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWlmIChzbG90cykKKwkJCSpzbG90cyA9IHZhbDsKKwl9CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiZGFpLXRkbS1zbG90LXdpZHRoIikpIHsKKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJkYWktdGRtLXNsb3Qtd2lkdGgiLCAmdmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKHNsb3Rfd2lkdGgpCisJCQkqc2xvdF93aWR0aCA9IHZhbDsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2Nfb2ZfcGFyc2VfdGRtX3Nsb3QpOworCiBpbnQgc25kX3NvY19vZl9wYXJzZV9hdWRpb19yb3V0aW5nKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQsCiAJCQkJICAgY29uc3QgY2hhciAqcHJvcG5hbWUpCiB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWRhcG0uYyBiL3NvdW5kL3NvYy9zb2MtZGFwbS5jCmluZGV4IGI5ZGM2YWMuLmM4YTc4MGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtZGFwbS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtZGFwbS5jCkBAIC03MCw4ICs3MCw2IEBACiAJW3NuZF9zb2NfZGFwbV9haWZfb3V0XSA9IDQsCiAJW3NuZF9zb2NfZGFwbV9taWNdID0gNSwKIAlbc25kX3NvY19kYXBtX211eF0gPSA2LAotCVtzbmRfc29jX2RhcG1fdmlydF9tdXhdID0gNiwKLQlbc25kX3NvY19kYXBtX3ZhbHVlX211eF0gPSA2LAogCVtzbmRfc29jX2RhcG1fZGFjXSA9IDcsCiAJW3NuZF9zb2NfZGFwbV9zd2l0Y2hdID0gOCwKIAlbc25kX3NvY19kYXBtX21peGVyXSA9IDgsCkBAIC0xMDIsOCArMTAwLDYgQEAKIAlbc25kX3NvY19kYXBtX21pY10gPSA3LAogCVtzbmRfc29jX2RhcG1fbWljYmlhc10gPSA4LAogCVtzbmRfc29jX2RhcG1fbXV4XSA9IDksCi0JW3NuZF9zb2NfZGFwbV92aXJ0X211eF0gPSA5LAotCVtzbmRfc29jX2RhcG1fdmFsdWVfbXV4XSA9IDksCiAJW3NuZF9zb2NfZGFwbV9haWZfaW5dID0gMTAsCiAJW3NuZF9zb2NfZGFwbV9haWZfb3V0XSA9IDEwLAogCVtzbmRfc29jX2RhcG1fZGFpX2luXSA9IDEwLApAQCAtMTE1LDYgKzExMSwxMiBAQAogCVtzbmRfc29jX2RhcG1fcG9zdF0gPSAxNCwKIH07CiAKK3N0YXRpYyB2b2lkIGRhcG1fYXNzZXJ0X2xvY2tlZChzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCit7CisJaWYgKGRhcG0tPmNhcmQgJiYgZGFwbS0+Y2FyZC0+aW5zdGFudGlhdGVkKQorCQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZkYXBtLT5jYXJkLT5kYXBtX211dGV4KTsKK30KKwogc3RhdGljIHZvaWQgcG9wX3dhaXQodTMyIHBvcF90aW1lKQogewogCWlmIChwb3BfdGltZSkKQEAgLTE0NiwxNSArMTQ4LDE2IEBACiAJcmV0dXJuICFsaXN0X2VtcHR5KCZ3LT5kaXJ0eSk7CiB9CiAKLXZvaWQgZGFwbV9tYXJrX2RpcnR5KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LCBjb25zdCBjaGFyICpyZWFzb24pCitzdGF0aWMgdm9pZCBkYXBtX21hcmtfZGlydHkoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGNvbnN0IGNoYXIgKnJlYXNvbikKIHsKKwlkYXBtX2Fzc2VydF9sb2NrZWQody0+ZGFwbSk7CisKIAlpZiAoIWRhcG1fZGlydHlfd2lkZ2V0KHcpKSB7CiAJCWRldl92ZGJnKHctPmRhcG0tPmRldiwgIk1hcmtpbmcgJXMgZGlydHkgZHVlIHRvICVzXG4iLAogCQkJIHctPm5hbWUsIHJlYXNvbik7CiAJCWxpc3RfYWRkX3RhaWwoJnctPmRpcnR5LCAmdy0+ZGFwbS0+Y2FyZC0+ZGFwbV9kaXJ0eSk7CiAJfQogfQotRVhQT1JUX1NZTUJPTF9HUEwoZGFwbV9tYXJrX2RpcnR5KTsKIAogdm9pZCBkYXBtX21hcmtfaW9fZGlydHkoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtKQogewpAQCAtMzYxLDYgKzM2NCw4IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnc7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZjYXJkLT5kYXBtX211dGV4KTsKKwogCW1lbXNldCgmY2FyZC0+ZGFwbV9zdGF0cywgMCwgc2l6ZW9mKGNhcmQtPmRhcG1fc3RhdHMpKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNhcmQtPndpZGdldHMsIGxpc3QpIHsKQEAgLTM4Niw3ICszOTEsOCBAQAogCXJldHVybiAtMTsKIH0KIAotc3RhdGljIGludCBzb2Nfd2lkZ2V0X3dyaXRlKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LCBpbnQgcmVnLCBpbnQgdmFsKQorc3RhdGljIGludCBzb2Nfd2lkZ2V0X3dyaXRlKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LCBpbnQgcmVnLAorCXVuc2lnbmVkIGludCB2YWwpCiB7CiAJaWYgKHctPmNvZGVjKQogCQlyZXR1cm4gc25kX3NvY193cml0ZSh3LT5jb2RlYywgcmVnLCB2YWwpOwpAQCAtNDk4LDExNSArNTA0LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBzZXQgdXAgaW5pdGlhbCBjb2RlYyBwYXRocyAqLwotc3RhdGljIHZvaWQgZGFwbV9zZXRfcGF0aF9zdGF0dXMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0Jc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwLCBpbnQgaSkKLXsKLQlzd2l0Y2ggKHctPmlkKSB7Ci0JY2FzZSBzbmRfc29jX2RhcG1fc3dpdGNoOgotCWNhc2Ugc25kX3NvY19kYXBtX21peGVyOgotCWNhc2Ugc25kX3NvY19kYXBtX21peGVyX25hbWVkX2N0bDogewotCQlpbnQgdmFsOwotCQlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0gKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKQotCQkJdy0+a2NvbnRyb2xfbmV3c1tpXS5wcml2YXRlX3ZhbHVlOwotCQlpbnQgcmVnID0gbWMtPnJlZzsKLQkJdW5zaWduZWQgaW50IHNoaWZ0ID0gbWMtPnNoaWZ0OwotCQlpbnQgbWF4ID0gbWMtPm1heDsKLQkJdW5zaWduZWQgaW50IG1hc2sgPSAoMSA8PCBmbHMobWF4KSkgLSAxOwotCQl1bnNpZ25lZCBpbnQgaW52ZXJ0ID0gbWMtPmludmVydDsKLQotCQlpZiAocmVnICE9IFNORF9TT0NfTk9QTSkgewotCQkJc29jX3dpZGdldF9yZWFkKHcsIHJlZywgJnZhbCk7Ci0JCQl2YWwgPSAodmFsID4+IHNoaWZ0KSAmIG1hc2s7Ci0JCQlpZiAoaW52ZXJ0KQotCQkJCXZhbCA9IG1heCAtIHZhbDsKLQkJCXAtPmNvbm5lY3QgPSAhIXZhbDsKLQkJfSBlbHNlIHsKLQkJCXAtPmNvbm5lY3QgPSAwOwotCQl9Ci0KLQl9Ci0JYnJlYWs7Ci0JY2FzZSBzbmRfc29jX2RhcG1fbXV4OiB7Ci0JCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKikKLQkJCXctPmtjb250cm9sX25ld3NbaV0ucHJpdmF0ZV92YWx1ZTsKLQkJaW50IHZhbCwgaXRlbTsKLQotCQlzb2Nfd2lkZ2V0X3JlYWQodywgZS0+cmVnLCAmdmFsKTsKLQkJaXRlbSA9ICh2YWwgPj4gZS0+c2hpZnRfbCkgJiBlLT5tYXNrOwotCi0JCWlmIChpdGVtIDwgZS0+bWF4ICYmICFzdHJjbXAocC0+bmFtZSwgZS0+dGV4dHNbaXRlbV0pKQotCQkJcC0+Y29ubmVjdCA9IDE7Ci0JCWVsc2UKLQkJCXAtPmNvbm5lY3QgPSAwOwotCX0KLQlicmVhazsKLQljYXNlIHNuZF9zb2NfZGFwbV92aXJ0X211eDogewotCQlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopCi0JCQl3LT5rY29udHJvbF9uZXdzW2ldLnByaXZhdGVfdmFsdWU7Ci0KLQkJcC0+Y29ubmVjdCA9IDA7Ci0JCS8qIHNpbmNlIGEgdmlydHVhbCBtdXggaGFzIG5vIGJhY2tpbmcgcmVnaXN0ZXJzIHRvCi0JCSAqIGRlY2lkZSB3aGljaCBwYXRoIHRvIGNvbm5lY3QsIGl0IHdpbGwgdHJ5IHRvIG1hdGNoCi0JCSAqIHdpdGggdGhlIGZpcnN0IGVudW1lcmF0aW9uLiAgVGhpcyBpcyB0byBlbnN1cmUKLQkJICogdGhhdCB0aGUgZGVmYXVsdCBtdXggY2hvaWNlICh0aGUgZmlyc3QpIHdpbGwgYmUKLQkJICogY29ycmVjdGx5IHBvd2VyZWQgdXAgZHVyaW5nIGluaXRpYWxpemF0aW9uLgotCQkgKi8KLQkJaWYgKCFzdHJjbXAocC0+bmFtZSwgZS0+dGV4dHNbMF0pKQotCQkJcC0+Y29ubmVjdCA9IDE7Ci0JfQotCWJyZWFrOwotCWNhc2Ugc25kX3NvY19kYXBtX3ZhbHVlX211eDogewotCQlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopCi0JCQl3LT5rY29udHJvbF9uZXdzW2ldLnByaXZhdGVfdmFsdWU7Ci0JCWludCB2YWwsIGl0ZW07Ci0KLQkJc29jX3dpZGdldF9yZWFkKHcsIGUtPnJlZywgJnZhbCk7Ci0JCXZhbCA9ICh2YWwgPj4gZS0+c2hpZnRfbCkgJiBlLT5tYXNrOwotCQlmb3IgKGl0ZW0gPSAwOyBpdGVtIDwgZS0+bWF4OyBpdGVtKyspIHsKLQkJCWlmICh2YWwgPT0gZS0+dmFsdWVzW2l0ZW1dKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGl0ZW0gPCBlLT5tYXggJiYgIXN0cmNtcChwLT5uYW1lLCBlLT50ZXh0c1tpdGVtXSkpCi0JCQlwLT5jb25uZWN0ID0gMTsKLQkJZWxzZQotCQkJcC0+Y29ubmVjdCA9IDA7Ci0JfQotCWJyZWFrOwotCS8qIGRvZXMgbm90IGFmZmVjdCByb3V0aW5nIC0gYWx3YXlzIGNvbm5lY3RlZCAqLwotCWNhc2Ugc25kX3NvY19kYXBtX3BnYToKLQljYXNlIHNuZF9zb2NfZGFwbV9vdXRfZHJ2OgotCWNhc2Ugc25kX3NvY19kYXBtX291dHB1dDoKLQljYXNlIHNuZF9zb2NfZGFwbV9hZGM6Ci0JY2FzZSBzbmRfc29jX2RhcG1faW5wdXQ6Ci0JY2FzZSBzbmRfc29jX2RhcG1fc2lnZ2VuOgotCWNhc2Ugc25kX3NvY19kYXBtX2RhYzoKLQljYXNlIHNuZF9zb2NfZGFwbV9taWNiaWFzOgotCWNhc2Ugc25kX3NvY19kYXBtX3ZtaWQ6Ci0JY2FzZSBzbmRfc29jX2RhcG1fc3VwcGx5OgotCWNhc2Ugc25kX3NvY19kYXBtX3JlZ3VsYXRvcl9zdXBwbHk6Ci0JY2FzZSBzbmRfc29jX2RhcG1fY2xvY2tfc3VwcGx5OgotCWNhc2Ugc25kX3NvY19kYXBtX2FpZl9pbjoKLQljYXNlIHNuZF9zb2NfZGFwbV9haWZfb3V0OgotCWNhc2Ugc25kX3NvY19kYXBtX2RhaV9pbjoKLQljYXNlIHNuZF9zb2NfZGFwbV9kYWlfb3V0OgotCWNhc2Ugc25kX3NvY19kYXBtX2hwOgotCWNhc2Ugc25kX3NvY19kYXBtX21pYzoKLQljYXNlIHNuZF9zb2NfZGFwbV9zcGs6Ci0JY2FzZSBzbmRfc29jX2RhcG1fbGluZToKLQljYXNlIHNuZF9zb2NfZGFwbV9kYWlfbGluazoKLQljYXNlIHNuZF9zb2NfZGFwbV9rY29udHJvbDoKLQkJcC0+Y29ubmVjdCA9IDE7Ci0JYnJlYWs7Ci0JLyogZG9lcyBhZmZlY3Qgcm91dGluZyAtIGR5bmFtaWNhbGx5IGNvbm5lY3RlZCAqLwotCWNhc2Ugc25kX3NvY19kYXBtX3ByZToKLQljYXNlIHNuZF9zb2NfZGFwbV9wb3N0OgotCQlwLT5jb25uZWN0ID0gMDsKLQlicmVhazsKLQl9Ci19Ci0KIC8qIGNvbm5lY3QgbXV4IHdpZGdldCB0byBpdHMgaW50ZXJjb25uZWN0aW5nIGF1ZGlvIHBhdGhzICovCiBzdGF0aWMgaW50IGRhcG1fY29ubmVjdF9tdXgoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAogCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzcmMsIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpkZXN0LApAQCAtNjE0LDE1ICs1MTEsMzMgQEAKIAljb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa2NvbnRyb2wpCiB7CiAJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIGludCB2YWwsIGl0ZW07CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZS0+bWF4OyBpKyspIHsKKwlpZiAoZS0+cmVnICE9IFNORF9TT0NfTk9QTSkgeworCQlzb2Nfd2lkZ2V0X3JlYWQoZGVzdCwgZS0+cmVnLCAmdmFsKTsKKwkJdmFsID0gKHZhbCA+PiBlLT5zaGlmdF9sKSAmIGUtPm1hc2s7CisJCWl0ZW0gPSBzbmRfc29jX2VudW1fdmFsX3RvX2l0ZW0oZSwgdmFsKTsKKwl9IGVsc2UgeworCQkvKiBzaW5jZSBhIHZpcnR1YWwgbXV4IGhhcyBubyBiYWNraW5nIHJlZ2lzdGVycyB0bworCQkgKiBkZWNpZGUgd2hpY2ggcGF0aCB0byBjb25uZWN0LCBpdCB3aWxsIHRyeSB0byBtYXRjaAorCQkgKiB3aXRoIHRoZSBmaXJzdCBlbnVtZXJhdGlvbi4gIFRoaXMgaXMgdG8gZW5zdXJlCisJCSAqIHRoYXQgdGhlIGRlZmF1bHQgbXV4IGNob2ljZSAodGhlIGZpcnN0KSB3aWxsIGJlCisJCSAqIGNvcnJlY3RseSBwb3dlcmVkIHVwIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKwkJICovCisJCWl0ZW0gPSAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBlLT5pdGVtczsgaSsrKSB7CiAJCWlmICghKHN0cmNtcChjb250cm9sX25hbWUsIGUtPnRleHRzW2ldKSkpIHsKIAkJCWxpc3RfYWRkKCZwYXRoLT5saXN0LCAmZGFwbS0+Y2FyZC0+cGF0aHMpOwogCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc2luaywgJmRlc3QtPnNvdXJjZXMpOwogCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc291cmNlLCAmc3JjLT5zaW5rcyk7CiAJCQlwYXRoLT5uYW1lID0gKGNoYXIqKWUtPnRleHRzW2ldOwotCQkJZGFwbV9zZXRfcGF0aF9zdGF0dXMoZGVzdCwgcGF0aCwgMCk7CisJCQlpZiAoaSA9PSBpdGVtKQorCQkJCXBhdGgtPmNvbm5lY3QgPSAxOworCQkJZWxzZQorCQkJCXBhdGgtPmNvbm5lY3QgPSAwOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC02MzAsNiArNTQ1LDMwIEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKKy8qIHNldCB1cCBpbml0aWFsIGNvZGVjIHBhdGhzICovCitzdGF0aWMgdm9pZCBkYXBtX3NldF9taXhlcl9wYXRoX3N0YXR1cyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnAsIGludCBpKQoreworCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPSAoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopCisJCXctPmtjb250cm9sX25ld3NbaV0ucHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBpbnQgcmVnID0gbWMtPnJlZzsKKwl1bnNpZ25lZCBpbnQgc2hpZnQgPSBtYy0+c2hpZnQ7CisJdW5zaWduZWQgaW50IG1heCA9IG1jLT5tYXg7CisJdW5zaWduZWQgaW50IG1hc2sgPSAoMSA8PCBmbHMobWF4KSkgLSAxOworCXVuc2lnbmVkIGludCBpbnZlcnQgPSBtYy0+aW52ZXJ0OworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAocmVnICE9IFNORF9TT0NfTk9QTSkgeworCQlzb2Nfd2lkZ2V0X3JlYWQodywgcmVnLCAmdmFsKTsKKwkJdmFsID0gKHZhbCA+PiBzaGlmdCkgJiBtYXNrOworCQlpZiAoaW52ZXJ0KQorCQkJdmFsID0gbWF4IC0gdmFsOworCQlwLT5jb25uZWN0ID0gISF2YWw7CisJfSBlbHNlIHsKKwkJcC0+Y29ubmVjdCA9IDA7CisJfQorfQorCiAvKiBjb25uZWN0IG1peGVyIHdpZGdldCB0byBpdHMgaW50ZXJjb25uZWN0aW5nIGF1ZGlvIHBhdGhzICovCiBzdGF0aWMgaW50IGRhcG1fY29ubmVjdF9taXhlcihzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNyYywgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKmRlc3QsCkBAIC02NDQsNyArNTgzLDcgQEAKIAkJCWxpc3RfYWRkKCZwYXRoLT5saXN0X3NpbmssICZkZXN0LT5zb3VyY2VzKTsKIAkJCWxpc3RfYWRkKCZwYXRoLT5saXN0X3NvdXJjZSwgJnNyYy0+c2lua3MpOwogCQkJcGF0aC0+bmFtZSA9IGRlc3QtPmtjb250cm9sX25ld3NbaV0ubmFtZTsKLQkJCWRhcG1fc2V0X3BhdGhfc3RhdHVzKGRlc3QsIHBhdGgsIGkpOworCQkJZGFwbV9zZXRfbWl4ZXJfcGF0aF9zdGF0dXMoZGVzdCwgcGF0aCwgaSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTcyMyw4ICs2NjIsNiBAQAogCQkJCWtjbmFtZV9pbl9sb25nX25hbWUgPSB0cnVlOwogCQkJCWJyZWFrOwogCQkJY2FzZSBzbmRfc29jX2RhcG1fbXV4OgotCQkJY2FzZSBzbmRfc29jX2RhcG1fdmlydF9tdXg6Ci0JCQljYXNlIHNuZF9zb2NfZGFwbV92YWx1ZV9tdXg6CiAJCQkJd25hbWVfaW5fbG9uZ19uYW1lID0gdHJ1ZTsKIAkJCQlrY25hbWVfaW5fbG9uZ19uYW1lID0gZmFsc2U7CiAJCQkJYnJlYWs7CkBAIC0xODIzLDYgKzE3NjAsOCBAQAogCUFTWU5DX0RPTUFJTl9FWENMVVNJVkUoYXN5bmNfZG9tYWluKTsKIAllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBiaWFzOwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmY2FyZC0+ZGFwbV9tdXRleCk7CisKIAl0cmFjZV9zbmRfc29jX2RhcG1fc3RhcnQoY2FyZCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZjYXJkLT5kYXBtX2xpc3QsIGxpc3QpIHsKQEAgLTE4OTcsMTAgKzE4MzYsMTQgQEAKIAogCXRyYWNlX3NuZF9zb2NfZGFwbV93YWxrX2RvbmUoY2FyZCk7CiAKLQkvKiBSdW4gYWxsIHRoZSBiaWFzIGNoYW5nZXMgaW4gcGFyYWxsZWwgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZjYXJkLT5kYXBtX2xpc3QsIGxpc3QpCi0JCWFzeW5jX3NjaGVkdWxlX2RvbWFpbihkYXBtX3ByZV9zZXF1ZW5jZV9hc3luYywgZCwKLQkJCQkJJmFzeW5jX2RvbWFpbik7CisJLyogUnVuIGNhcmQgYmlhcyBjaGFuZ2VzIGF0IGZpcnN0ICovCisJZGFwbV9wcmVfc2VxdWVuY2VfYXN5bmMoJmNhcmQtPmRhcG0sIDApOworCS8qIFJ1biBvdGhlciBiaWFzIGNoYW5nZXMgaW4gcGFyYWxsZWwgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZjYXJkLT5kYXBtX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGQgIT0gJmNhcmQtPmRhcG0pCisJCQlhc3luY19zY2hlZHVsZV9kb21haW4oZGFwbV9wcmVfc2VxdWVuY2VfYXN5bmMsIGQsCisJCQkJCQkmYXN5bmNfZG9tYWluKTsKKwl9CiAJYXN5bmNfc3luY2hyb25pemVfZnVsbF9kb21haW4oJmFzeW5jX2RvbWFpbik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZkb3duX2xpc3QsIHBvd2VyX2xpc3QpIHsKQEAgLTE5MjAsMTAgKzE4NjMsMTQgQEAKIAlkYXBtX3NlcV9ydW4oY2FyZCwgJnVwX2xpc3QsIGV2ZW50LCB0cnVlKTsKIAogCS8qIFJ1biBhbGwgdGhlIGJpYXMgY2hhbmdlcyBpbiBwYXJhbGxlbCAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmNhcmQtPmRhcG1fbGlzdCwgbGlzdCkKLQkJYXN5bmNfc2NoZWR1bGVfZG9tYWluKGRhcG1fcG9zdF9zZXF1ZW5jZV9hc3luYywgZCwKLQkJCQkJJmFzeW5jX2RvbWFpbik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmY2FyZC0+ZGFwbV9saXN0LCBsaXN0KSB7CisJCWlmIChkICE9ICZjYXJkLT5kYXBtKQorCQkJYXN5bmNfc2NoZWR1bGVfZG9tYWluKGRhcG1fcG9zdF9zZXF1ZW5jZV9hc3luYywgZCwKKwkJCQkJCSZhc3luY19kb21haW4pOworCX0KIAlhc3luY19zeW5jaHJvbml6ZV9mdWxsX2RvbWFpbigmYXN5bmNfZG9tYWluKTsKKwkvKiBSdW4gY2FyZCBiaWFzIGNoYW5nZXMgYXQgbGFzdCAqLworCWRhcG1fcG9zdF9zZXF1ZW5jZV9hc3luYygmY2FyZC0+ZGFwbSwgMCk7CiAKIAkvKiBkbyB3ZSBuZWVkIHRvIG5vdGlmeSBhbnkgY2xpZW50cyB0aGF0IERBUE0gZXZlbnQgaXMgY29tcGxldGUgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZjYXJkLT5kYXBtX2xpc3QsIGxpc3QpIHsKQEAgLTIxMTAsNiArMjA1Nyw4IEBACiAJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoOwogCWludCBmb3VuZCA9IDA7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZjYXJkLT5kYXBtX211dGV4KTsKKwogCS8qIGZpbmQgZGFwbSB3aWRnZXQgcGF0aCBhc3NvYyB3aXRoIGtjb250cm9sICovCiAJZGFwbV9rY29udHJvbF9mb3JfZWFjaF9wYXRoKHBhdGgsIGtjb250cm9sKSB7CiAJCWlmICghcGF0aC0+bmFtZSB8fCAhZS0+dGV4dHNbbXV4XSkKQEAgLTIxNjAsNiArMjEwOSw4IEBACiAJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoOwogCWludCBmb3VuZCA9IDA7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZjYXJkLT5kYXBtX211dGV4KTsKKwogCS8qIGZpbmQgZGFwbSB3aWRnZXQgcGF0aCBhc3NvYyB3aXRoIGtjb250cm9sICovCiAJZGFwbV9rY29udHJvbF9mb3JfZWFjaF9wYXRoKHBhdGgsIGtjb250cm9sKSB7CiAJCWZvdW5kID0gMTsKQEAgLTIzMjUsNiArMjI3Niw4IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncgPSBkYXBtX2ZpbmRfd2lkZ2V0KGRhcG0sIHBpbiwgdHJ1ZSk7CiAKKwlkYXBtX2Fzc2VydF9sb2NrZWQoZGFwbSk7CisKIAlpZiAoIXcpIHsKIAkJZGV2X2VycihkYXBtLT5kZXYsICJBU29DOiBEQVBNIHVua25vd24gcGluICVzXG4iLCBwaW4pOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIzNDEsNiArMjI5NCwzMCBAQAogfQogCiAvKioKKyAqIHNuZF9zb2NfZGFwbV9zeW5jX3VubG9ja2VkIC0gc2NhbiBhbmQgcG93ZXIgZGFwbSBwYXRocworICogQGRhcG06IERBUE0gY29udGV4dAorICoKKyAqIFdhbGtzIGFsbCBkYXBtIGF1ZGlvIHBhdGhzIGFuZCBwb3dlcnMgd2lkZ2V0cyBhY2NvcmRpbmcgdG8gdGhlaXIKKyAqIHN0cmVhbSBvciBwYXRoIHVzYWdlLgorICoKKyAqIFJlcXVpcmVzIGV4dGVybmFsIGxvY2tpbmcuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICovCitpbnQgc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtKQoreworCS8qCisJICogU3VwcHJlc3MgZWFybHkgcmVwb3J0cyAoZWcsIGphY2tzIHN5bmNpbmcgdGhlaXIgc3RhdGUpIHRvIGF2b2lkCisJICogc2lsbHkgREFQTSBydW5zIGR1cmluZyBjYXJkIHN0YXJ0dXAuCisJICovCisJaWYgKCFkYXBtLT5jYXJkIHx8ICFkYXBtLT5jYXJkLT5pbnN0YW50aWF0ZWQpCisJCXJldHVybiAwOworCisJcmV0dXJuIGRhcG1fcG93ZXJfd2lkZ2V0cyhkYXBtLT5jYXJkLCBTTkRfU09DX0RBUE1fU1RSRUFNX05PUCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZCk7CisKKy8qKgogICogc25kX3NvY19kYXBtX3N5bmMgLSBzY2FuIGFuZCBwb3dlciBkYXBtIHBhdGhzCiAgKiBAZGFwbTogREFQTSBjb250ZXh0CiAgKgpAQCAtMjM1MywxNSArMjMzMCw4IEBACiB7CiAJaW50IHJldDsKIAotCS8qCi0JICogU3VwcHJlc3MgZWFybHkgcmVwb3J0cyAoZWcsIGphY2tzIHN5bmNpbmcgdGhlaXIgc3RhdGUpIHRvIGF2b2lkCi0JICogc2lsbHkgREFQTSBydW5zIGR1cmluZyBjYXJkIHN0YXJ0dXAuCi0JICovCi0JaWYgKCFkYXBtLT5jYXJkIHx8ICFkYXBtLT5jYXJkLT5pbnN0YW50aWF0ZWQpCi0JCXJldHVybiAwOwotCiAJbXV0ZXhfbG9ja19uZXN0ZWQoJmRhcG0tPmNhcmQtPmRhcG1fbXV0ZXgsIFNORF9TT0NfREFQTV9DTEFTU19SVU5USU1FKTsKLQlyZXQgPSBkYXBtX3Bvd2VyX3dpZGdldHMoZGFwbS0+Y2FyZCwgU05EX1NPQ19EQVBNX1NUUkVBTV9OT1ApOworCXJldCA9IHNuZF9zb2NfZGFwbV9zeW5jX3VubG9ja2VkKGRhcG0pOwogCW11dGV4X3VubG9jaygmZGFwbS0+Y2FyZC0+ZGFwbV9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTI0NDQsOCArMjQxNCw2IEBACiAJCXBhdGgtPmNvbm5lY3QgPSAxOwogCQlyZXR1cm4gMDsKIAljYXNlIHNuZF9zb2NfZGFwbV9tdXg6Ci0JY2FzZSBzbmRfc29jX2RhcG1fdmlydF9tdXg6Ci0JY2FzZSBzbmRfc29jX2RhcG1fdmFsdWVfbXV4OgogCQlyZXQgPSBkYXBtX2Nvbm5lY3RfbXV4KGRhcG0sIHdzb3VyY2UsIHdzaW5rLCBwYXRoLCBjb250cm9sLAogCQkJJndzaW5rLT5rY29udHJvbF9uZXdzWzBdKTsKIAkJaWYgKHJldCAhPSAwKQpAQCAtMjc3Miw4ICsyNzQwLDYgQEAKIAkJCWRhcG1fbmV3X21peGVyKHcpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc25kX3NvY19kYXBtX211eDoKLQkJY2FzZSBzbmRfc29jX2RhcG1fdmlydF9tdXg6Ci0JCWNhc2Ugc25kX3NvY19kYXBtX3ZhbHVlX211eDoKIAkJCWRhcG1fbmV3X211eCh3KTsKIAkJCWJyZWFrOwogCQljYXNlIHNuZF9zb2NfZGFwbV9wZ2E6CkBAIC0yOTM1LDEzICsyOTAxLDIwIEBACiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKIAlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0JdW5zaWduZWQgaW50IHZhbDsKKwl1bnNpZ25lZCBpbnQgcmVnX3ZhbCwgdmFsOwogCi0JdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBlLT5yZWcpOwotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAodmFsID4+IGUtPnNoaWZ0X2wpICYgZS0+bWFzazsKLQlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKQotCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0KLQkJCSh2YWwgPj4gZS0+c2hpZnRfcikgJiBlLT5tYXNrOworCWlmIChlLT5yZWcgIT0gU05EX1NPQ19OT1BNKQorCQlyZWdfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBlLT5yZWcpOworCWVsc2UKKwkJcmVnX3ZhbCA9IGRhcG1fa2NvbnRyb2xfZ2V0X3ZhbHVlKGtjb250cm9sKTsKKworCXZhbCA9IChyZWdfdmFsID4+IGUtPnNoaWZ0X2wpICYgZS0+bWFzazsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gc25kX3NvY19lbnVtX3ZhbF90b19pdGVtKGUsIHZhbCk7CisJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgeworCQl2YWwgPSAocmVnX3ZhbCA+PiBlLT5zaGlmdF9yKSAmIGUtPm1hc2s7CisJCXZhbCA9IHNuZF9zb2NfZW51bV92YWxfdG9faXRlbShlLCB2YWwpOworCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0gdmFsOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMjk2MiwzNCArMjkzNSw0MSBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV9rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CiAJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGNvZGVjLT5jYXJkOwogCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQl1bnNpZ25lZCBpbnQgdmFsLCBtdXgsIGNoYW5nZTsKKwl1bnNpZ25lZCBpbnQgKml0ZW0gPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtOworCXVuc2lnbmVkIGludCB2YWwsIGNoYW5nZTsKIAl1bnNpZ25lZCBpbnQgbWFzazsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3VwZGF0ZSB1cGRhdGU7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IGUtPm1heCAtIDEpCisJaWYgKGl0ZW1bMF0gPj0gZS0+aXRlbXMpCiAJCXJldHVybiAtRUlOVkFMOwotCW11eCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07Ci0JdmFsID0gbXV4IDw8IGUtPnNoaWZ0X2w7CisKKwl2YWwgPSBzbmRfc29jX2VudW1faXRlbV90b192YWwoZSwgaXRlbVswXSkgPDwgZS0+c2hpZnRfbDsKIAltYXNrID0gZS0+bWFzayA8PCBlLT5zaGlmdF9sOwogCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpIHsKLQkJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPiBlLT5tYXggLSAxKQorCQlpZiAoaXRlbVsxXSA+IGUtPml0ZW1zKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXZhbCB8PSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdIDw8IGUtPnNoaWZ0X3I7CisJCXZhbCB8PSBzbmRfc29jX2VudW1faXRlbV90b192YWwoZSwgaXRlbVsxXSkgPDwgZS0+c2hpZnRfbDsKIAkJbWFzayB8PSBlLT5tYXNrIDw8IGUtPnNoaWZ0X3I7CiAJfQogCiAJbXV0ZXhfbG9ja19uZXN0ZWQoJmNhcmQtPmRhcG1fbXV0ZXgsIFNORF9TT0NfREFQTV9DTEFTU19SVU5USU1FKTsKIAotCWNoYW5nZSA9IHNuZF9zb2NfdGVzdF9iaXRzKGNvZGVjLCBlLT5yZWcsIG1hc2ssIHZhbCk7Ci0JaWYgKGNoYW5nZSkgewotCQl1cGRhdGUua2NvbnRyb2wgPSBrY29udHJvbDsKLQkJdXBkYXRlLnJlZyA9IGUtPnJlZzsKLQkJdXBkYXRlLm1hc2sgPSBtYXNrOwotCQl1cGRhdGUudmFsID0gdmFsOwotCQljYXJkLT51cGRhdGUgPSAmdXBkYXRlOworCWlmIChlLT5yZWcgIT0gU05EX1NPQ19OT1BNKQorCQljaGFuZ2UgPSBzbmRfc29jX3Rlc3RfYml0cyhjb2RlYywgZS0+cmVnLCBtYXNrLCB2YWwpOworCWVsc2UKKwkJY2hhbmdlID0gZGFwbV9rY29udHJvbF9zZXRfdmFsdWUoa2NvbnRyb2wsIHZhbCk7CiAKLQkJcmV0ID0gc29jX2RhcG1fbXV4X3VwZGF0ZV9wb3dlcihjYXJkLCBrY29udHJvbCwgbXV4LCBlKTsKKwlpZiAoY2hhbmdlKSB7CisJCWlmIChlLT5yZWcgIT0gU05EX1NPQ19OT1BNKSB7CisJCQl1cGRhdGUua2NvbnRyb2wgPSBrY29udHJvbDsKKwkJCXVwZGF0ZS5yZWcgPSBlLT5yZWc7CisJCQl1cGRhdGUubWFzayA9IG1hc2s7CisJCQl1cGRhdGUudmFsID0gdmFsOworCQkJY2FyZC0+dXBkYXRlID0gJnVwZGF0ZTsKKwkJfQorCisJCXJldCA9IHNvY19kYXBtX211eF91cGRhdGVfcG93ZXIoY2FyZCwga2NvbnRyb2wsIGl0ZW1bMF0sIGUpOwogCiAJCWNhcmQtPnVwZGF0ZSA9IE5VTEw7CiAJfQpAQCAtMzAwNCwxNTggKzI5ODQsNiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZSk7CiAKIC8qKgotICogc25kX3NvY19kYXBtX2dldF9lbnVtX3ZpcnQgLSBHZXQgdmlydHVhbCBEQVBNIG11eAotICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCi0gKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgotICoKLSAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KLSAqLwotaW50IHNuZF9zb2NfZGFwbV9nZXRfZW51bV92aXJ0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBkYXBtX2tjb250cm9sX2dldF92YWx1ZShrY29udHJvbCk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fZ2V0X2VudW1fdmlydCk7Ci0KLS8qKgotICogc25kX3NvY19kYXBtX3B1dF9lbnVtX3ZpcnQgLSBTZXQgdmlydHVhbCBEQVBNIG11eAotICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCi0gKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgotICoKLSAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KLSAqLwotaW50IHNuZF9zb2NfZGFwbV9wdXRfZW51bV92aXJ0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV9rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGNvZGVjLT5jYXJkOwotCXVuc2lnbmVkIGludCB2YWx1ZTsKLQlzdHJ1Y3Qgc29jX2VudW0gKmUgPQotCQkoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0JaW50IGNoYW5nZTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID49IGUtPm1heCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrX25lc3RlZCgmY2FyZC0+ZGFwbV9tdXRleCwgU05EX1NPQ19EQVBNX0NMQVNTX1JVTlRJTUUpOwotCi0JdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwotCWNoYW5nZSA9IGRhcG1fa2NvbnRyb2xfc2V0X3ZhbHVlKGtjb250cm9sLCB2YWx1ZSk7Ci0JaWYgKGNoYW5nZSkKLQkJcmV0ID0gc29jX2RhcG1fbXV4X3VwZGF0ZV9wb3dlcihjYXJkLCBrY29udHJvbCwgdmFsdWUsIGUpOwotCi0JbXV0ZXhfdW5sb2NrKCZjYXJkLT5kYXBtX211dGV4KTsKLQotCWlmIChyZXQgPiAwKQotCQlzb2NfZHBjbV9ydW50aW1lX3VwZGF0ZShjYXJkKTsKLQotCXJldHVybiBjaGFuZ2U7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fcHV0X2VudW1fdmlydCk7Ci0KLS8qKgotICogc25kX3NvY19kYXBtX2dldF92YWx1ZV9lbnVtX2RvdWJsZSAtIGRhcG0gc2VtaSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBnZXQKLSAqCQkJCQljYWxsYmFjawotICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCi0gKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgotICoKLSAqIENhbGxiYWNrIHRvIGdldCB0aGUgdmFsdWUgb2YgYSBkYXBtIHNlbWkgZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgY29udHJvbC4KLSAqCi0gKiBTZW1pIGVudW1lcmF0ZWQgbWl4ZXI6IHRoZSBlbnVtZXJhdGVkIGl0ZW1zIGFyZSByZWZlcnJlZCBhcyB2YWx1ZXMuIENhbiBiZQotICogdXNlZCBmb3IgaGFuZGxpbmcgYml0ZmllbGQgY29kZWQgZW51bWVyYXRpb24gZm9yIGV4YW1wbGUuCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgotICovCi1pbnQgc25kX3NvY19kYXBtX2dldF92YWx1ZV9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQl1bnNpZ25lZCBpbnQgcmVnX3ZhbCwgdmFsLCBtdXg7Ci0KLQlyZWdfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBlLT5yZWcpOwotCXZhbCA9IChyZWdfdmFsID4+IGUtPnNoaWZ0X2wpICYgZS0+bWFzazsKLQlmb3IgKG11eCA9IDA7IG11eCA8IGUtPm1heDsgbXV4KyspIHsKLQkJaWYgKHZhbCA9PSBlLT52YWx1ZXNbbXV4XSkKLQkJCWJyZWFrOwotCX0KLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gbXV4OwotCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpIHsKLQkJdmFsID0gKHJlZ192YWwgPj4gZS0+c2hpZnRfcikgJiBlLT5tYXNrOwotCQlmb3IgKG11eCA9IDA7IG11eCA8IGUtPm1heDsgbXV4KyspIHsKLQkJCWlmICh2YWwgPT0gZS0+dmFsdWVzW211eF0pCi0JCQkJYnJlYWs7Ci0JCX0KLQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA9IG11eDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9nZXRfdmFsdWVfZW51bV9kb3VibGUpOwotCi0vKioKLSAqIHNuZF9zb2NfZGFwbV9wdXRfdmFsdWVfZW51bV9kb3VibGUgLSBkYXBtIHNlbWkgZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgc2V0Ci0gKgkJCQkJY2FsbGJhY2sKLSAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAotICogQHVjb250cm9sOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KLSAqCi0gKiBDYWxsYmFjayB0byBzZXQgdGhlIHZhbHVlIG9mIGEgZGFwbSBzZW1pIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIGNvbnRyb2wuCi0gKgotICogU2VtaSBlbnVtZXJhdGVkIG1peGVyOiB0aGUgZW51bWVyYXRlZCBpdGVtcyBhcmUgcmVmZXJyZWQgYXMgdmFsdWVzLiBDYW4gYmUKLSAqIHVzZWQgZm9yIGhhbmRsaW5nIGJpdGZpZWxkIGNvZGVkIGVudW1lcmF0aW9uIGZvciBleGFtcGxlLgotICoKLSAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KLSAqLwotaW50IHNuZF9zb2NfZGFwbV9wdXRfdmFsdWVfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNhcmQ7Ci0Jc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXVuc2lnbmVkIGludCB2YWwsIG11eCwgY2hhbmdlOwotCXVuc2lnbmVkIGludCBtYXNrOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlIHVwZGF0ZTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gZS0+bWF4IC0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JbXV4ID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKLQl2YWwgPSBlLT52YWx1ZXNbdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXV0gPDwgZS0+c2hpZnRfbDsKLQltYXNrID0gZS0+bWFzayA8PCBlLT5zaGlmdF9sOwotCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpIHsKLQkJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPiBlLT5tYXggLSAxKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXZhbCB8PSBlLT52YWx1ZXNbdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXV0gPDwgZS0+c2hpZnRfcjsKLQkJbWFzayB8PSBlLT5tYXNrIDw8IGUtPnNoaWZ0X3I7Ci0JfQotCi0JbXV0ZXhfbG9ja19uZXN0ZWQoJmNhcmQtPmRhcG1fbXV0ZXgsIFNORF9TT0NfREFQTV9DTEFTU19SVU5USU1FKTsKLQotCWNoYW5nZSA9IHNuZF9zb2NfdGVzdF9iaXRzKGNvZGVjLCBlLT5yZWcsIG1hc2ssIHZhbCk7Ci0JaWYgKGNoYW5nZSkgewotCQl1cGRhdGUua2NvbnRyb2wgPSBrY29udHJvbDsKLQkJdXBkYXRlLnJlZyA9IGUtPnJlZzsKLQkJdXBkYXRlLm1hc2sgPSBtYXNrOwotCQl1cGRhdGUudmFsID0gdmFsOwotCQljYXJkLT51cGRhdGUgPSAmdXBkYXRlOwotCi0JCXJldCA9IHNvY19kYXBtX211eF91cGRhdGVfcG93ZXIoY2FyZCwga2NvbnRyb2wsIG11eCwgZSk7Ci0KLQkJY2FyZC0+dXBkYXRlID0gTlVMTDsKLQl9Ci0KLQltdXRleF91bmxvY2soJmNhcmQtPmRhcG1fbXV0ZXgpOwotCi0JaWYgKHJldCA+IDApCi0JCXNvY19kcGNtX3J1bnRpbWVfdXBkYXRlKGNhcmQpOwotCi0JcmV0dXJuIGNoYW5nZTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9wdXRfdmFsdWVfZW51bV9kb3VibGUpOwotCi0vKioKICAqIHNuZF9zb2NfZGFwbV9pbmZvX3Bpbl9zd2l0Y2ggLSBJbmZvIGZvciBhIHBpbiBzd2l0Y2gKICAqCiAgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKQEAgLTMyODMsOCArMzExMSw2IEBACiAJCXctPnBvd2VyX2NoZWNrID0gZGFwbV9nZW5lcmljX2NoZWNrX3Bvd2VyOwogCQlicmVhazsKIAljYXNlIHNuZF9zb2NfZGFwbV9tdXg6Ci0JY2FzZSBzbmRfc29jX2RhcG1fdmlydF9tdXg6Ci0JY2FzZSBzbmRfc29jX2RhcG1fdmFsdWVfbXV4OgogCQl3LT5wb3dlcl9jaGVjayA9IGRhcG1fZ2VuZXJpY19jaGVja19wb3dlcjsKIAkJYnJlYWs7CiAJY2FzZSBzbmRfc29jX2RhcG1fZGFpX291dDoKQEAgLTQwOTgsNyArMzkyNCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fZnJlZSk7CiAKLXN0YXRpYyB2b2lkIHNvY19kYXBtX3NodXRkb3duX2NvZGVjKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSkKK3N0YXRpYyB2b2lkIHNvY19kYXBtX3NodXRkb3duX2RhcG0oc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtKQogewogCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBkYXBtLT5jYXJkOwogCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3OwpAQCAtNDEzOCwxNCArMzk2NCwyMSBAQAogICovCiB2b2lkIHNuZF9zb2NfZGFwbV9zaHV0ZG93bihzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG07CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjLCAmY2FyZC0+Y29kZWNfZGV2X2xpc3QsIGNhcmRfbGlzdCkgewotCQlzb2NfZGFwbV9zaHV0ZG93bl9jb2RlYygmY29kZWMtPmRhcG0pOwotCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfU1RBTkRCWSkKLQkJCXNuZF9zb2NfZGFwbV9zZXRfYmlhc19sZXZlbCgmY29kZWMtPmRhcG0sCi0JCQkJCQkgICAgU05EX1NPQ19CSUFTX09GRik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkYXBtLCAmY2FyZC0+ZGFwbV9saXN0LCBsaXN0KSB7CisJCWlmIChkYXBtICE9ICZjYXJkLT5kYXBtKSB7CisJCQlzb2NfZGFwbV9zaHV0ZG93bl9kYXBtKGRhcG0pOworCQkJaWYgKGRhcG0tPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX1NUQU5EQlkpCisJCQkJc25kX3NvY19kYXBtX3NldF9iaWFzX2xldmVsKGRhcG0sCisJCQkJCQkJICAgIFNORF9TT0NfQklBU19PRkYpOworCQl9CiAJfQorCisJc29jX2RhcG1fc2h1dGRvd25fZGFwbSgmY2FyZC0+ZGFwbSk7CisJaWYgKGNhcmQtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfU1RBTkRCWSkKKwkJc25kX3NvY19kYXBtX3NldF9iaWFzX2xldmVsKCZjYXJkLT5kYXBtLAorCQkJCQkgICAgU05EX1NPQ19CSUFTX09GRik7CiB9CiAKIC8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1pby5jIGIvc291bmQvc29jL3NvYy1pby5jCmluZGV4IGFhODg2Y2MuLjI2MGVmYzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtaW8uYworKysgYi9zb3VuZC9zb2Mvc29jLWlvLmMKQEAgLTIzLDIxICsyMyw2IEBACiBzdGF0aWMgaW50IGh3X3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKIAkJICAgIHVuc2lnbmVkIGludCB2YWx1ZSkKIHsKLQlpbnQgcmV0OwotCi0JaWYgKCFzbmRfc29jX2NvZGVjX3ZvbGF0aWxlX3JlZ2lzdGVyKGNvZGVjLCByZWcpICYmCi0JICAgIHJlZyA8IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplICYmCi0JICAgICFjb2RlYy0+Y2FjaGVfYnlwYXNzKSB7Ci0JCXJldCA9IHNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIHJlZywgdmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoY29kZWMtPmNhY2hlX29ubHkpIHsKLQkJY29kZWMtPmNhY2hlX3N5bmMgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlyZXR1cm4gcmVnbWFwX3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIHJlZywgdmFsdWUpOwogfQogCkBAIC00NiwzMiArMzEsMTggQEAKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGludCB2YWw7CiAKLQlpZiAocmVnID49IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplIHx8Ci0JICAgIHNuZF9zb2NfY29kZWNfdm9sYXRpbGVfcmVnaXN0ZXIoY29kZWMsIHJlZykgfHwKLQkgICAgY29kZWMtPmNhY2hlX2J5cGFzcykgewotCQlpZiAoY29kZWMtPmNhY2hlX29ubHkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJcmV0ID0gcmVnbWFwX3JlYWQoY29kZWMtPmNvbnRyb2xfZGF0YSwgcmVnLCAmdmFsKTsKLQkJaWYgKHJldCA9PSAwKQotCQkJcmV0dXJuIHZhbDsKLQkJZWxzZQotCQkJcmV0dXJuIC0xOwotCX0KLQotCXJldCA9IHNuZF9zb2NfY2FjaGVfcmVhZChjb2RlYywgcmVnLCAmdmFsKTsKLQlpZiAocmV0IDwgMCkKKwlyZXQgPSByZWdtYXBfcmVhZChjb2RlYy0+Y29udHJvbF9kYXRhLCByZWcsICZ2YWwpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIHZhbDsKKwllbHNlCiAJCXJldHVybiAtMTsKLQlyZXR1cm4gdmFsOwogfQogCiAvKioKICAqIHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvOiBTZXQgdXAgc3RhbmRhcmQgSS9PIGZ1bmN0aW9ucy4KICAqCiAgKiBAY29kZWM6IENPREVDIHRvIGNvbmZpZ3VyZS4KLSAqIEBhZGRyX2JpdHM6IE51bWJlciBvZiBiaXRzIG9mIHJlZ2lzdGVyIGFkZHJlc3MgZGF0YS4KLSAqIEBkYXRhX2JpdHM6IE51bWJlciBvZiBiaXRzIG9mIGRhdGEgcGVyIHJlZ2lzdGVyLgotICogQGNvbnRyb2w6IENvbnRyb2wgYnVzIHVzZWQuCisgKiBAbWFwOiBSZWdpc3RlciBtYXAgdG8gd3JpdGUgdG8KICAqCiAgKiBSZWdpc3RlciBmb3JtYXRzIGFyZSBmcmVxdWVudGx5IHNoYXJlZCBiZXR3ZWVuIG1hbnkgSTJDIGFuZCBTUEkKICAqIGRldmljZXMuICBJbiBvcmRlciB0byBwcm9tb3RlIGNvZGUgcmV1c2UgdGhlIEFTb0MgY29yZSBwcm92aWRlcwpAQCAtODUsNjAgKzU2LDM2IEBACiAgKiB2b2xhdGlsZSByZWdpc3RlcnMuCiAgKi8KIGludCBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkgICAgICAgaW50IGFkZHJfYml0cywgaW50IGRhdGFfYml0cywKLQkJCSAgICAgICBlbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2wpCisJCQkgICAgICAgc3RydWN0IHJlZ21hcCAqcmVnbWFwKQogewotCXN0cnVjdCByZWdtYXBfY29uZmlnIGNvbmZpZzsKIAlpbnQgcmV0OwogCi0JbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKKwkvKiBEZXZpY2UgaGFzIG1hZGUgaXRzIG93biByZWdtYXAgYXJyYW5nZW1lbnRzICovCisJaWYgKCFyZWdtYXApCisJCWNvZGVjLT5jb250cm9sX2RhdGEgPSBkZXZfZ2V0X3JlZ21hcChjb2RlYy0+ZGV2LCBOVUxMKTsKKwllbHNlCisJCWNvZGVjLT5jb250cm9sX2RhdGEgPSByZWdtYXA7CisKKwlpZiAoSVNfRVJSKGNvZGVjLT5jb250cm9sX2RhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihjb2RlYy0+Y29udHJvbF9kYXRhKTsKKwogCWNvZGVjLT53cml0ZSA9IGh3X3dyaXRlOwogCWNvZGVjLT5yZWFkID0gaHdfcmVhZDsKIAotCWNvbmZpZy5yZWdfYml0cyA9IGFkZHJfYml0czsKLQljb25maWcudmFsX2JpdHMgPSBkYXRhX2JpdHM7CisJcmV0ID0gcmVnbWFwX2dldF92YWxfYnl0ZXMoY29kZWMtPmNvbnRyb2xfZGF0YSk7CisJLyogRXJyb3JzIGFyZSBsZWdpdGltYXRlIGZvciBub24taW50ZWdlciBieXRlCisJICogbXVsdGlwbGVzICovCisJaWYgKHJldCA+IDApCisJCWNvZGVjLT52YWxfYnl0ZXMgPSByZXQ7CiAKLQlzd2l0Y2ggKGNvbnRyb2wpIHsKLSNpZiBJU19FTkFCTEVEKENPTkZJR19SRUdNQVBfSTJDKQotCWNhc2UgU05EX1NPQ19JMkM6Ci0JCWNvZGVjLT5jb250cm9sX2RhdGEgPSByZWdtYXBfaW5pdF9pMmModG9faTJjX2NsaWVudChjb2RlYy0+ZGV2KSwKLQkJCQkJCSAgICAgICZjb25maWcpOwotCQlicmVhazsKLSNlbmRpZgorCWNvZGVjLT51c2luZ19yZWdtYXAgPSB0cnVlOwogCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfUkVHTUFQX1NQSSkKLQljYXNlIFNORF9TT0NfU1BJOgotCQljb2RlYy0+Y29udHJvbF9kYXRhID0gcmVnbWFwX2luaXRfc3BpKHRvX3NwaV9kZXZpY2UoY29kZWMtPmRldiksCi0JCQkJCQkgICAgICAmY29uZmlnKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQotCWNhc2UgU05EX1NPQ19SRUdNQVA6Ci0JCS8qIERldmljZSBoYXMgbWFkZSBpdHMgb3duIHJlZ21hcCBhcnJhbmdlbWVudHMgKi8KLQkJY29kZWMtPnVzaW5nX3JlZ21hcCA9IHRydWU7Ci0JCWlmICghY29kZWMtPmNvbnRyb2xfZGF0YSkKLQkJCWNvZGVjLT5jb250cm9sX2RhdGEgPSBkZXZfZ2V0X3JlZ21hcChjb2RlYy0+ZGV2LCBOVUxMKTsKLQotCQlpZiAoY29kZWMtPmNvbnRyb2xfZGF0YSkgewotCQkJcmV0ID0gcmVnbWFwX2dldF92YWxfYnl0ZXMoY29kZWMtPmNvbnRyb2xfZGF0YSk7Ci0JCQkvKiBFcnJvcnMgYXJlIGxlZ2l0aW1hdGUgZm9yIG5vbi1pbnRlZ2VyIGJ5dGUKLQkJCSAqIG11bHRpcGxlcyAqLwotCQkJaWYgKHJldCA+IDApCi0JCQkJY29kZWMtPnZhbF9ieXRlcyA9IHJldDsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiBQVFJfRVJSX09SX1pFUk8oY29kZWMtPmNvbnRyb2xfZGF0YSk7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyk7CiAjZWxzZQogaW50IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCSAgICAgICBpbnQgYWRkcl9iaXRzLCBpbnQgZGF0YV9iaXRzLAotCQkJICAgICAgIGVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbCkKKwkJCSAgICAgICBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCiB7CiAJcmV0dXJuIC1FTk9UU1VQUDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtamFjay5jIGIvc291bmQvc29jL3NvYy1qYWNrLmMKaW5kZXggMjNkNDNkYS4uYjkwM2Y4MiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1qYWNrLmMKKysrIGIvc291bmQvc29jL3NvYy1qYWNrLmMKQEAgLTI1MCw3ICsyNTAsNyBAQAogCQlyZXBvcnQgPSAwOwogCiAJaWYgKGdwaW8tPmphY2tfc3RhdHVzX2NoZWNrKQotCQlyZXBvcnQgPSBncGlvLT5qYWNrX3N0YXR1c19jaGVjaygpOworCQlyZXBvcnQgPSBncGlvLT5qYWNrX3N0YXR1c19jaGVjayhncGlvLT5kYXRhKTsKIAogCXNuZF9zb2NfamFja19yZXBvcnQoamFjaywgcmVwb3J0LCBncGlvLT5yZXBvcnQpOwogfQpAQCAtMzQyLDcgKzM0Miw4IEBACiAJCWdwaW9fZXhwb3J0KGdwaW9zW2ldLmdwaW8sIGZhbHNlKTsKIAogCQkvKiBVcGRhdGUgaW5pdGlhbCBqYWNrIHN0YXR1cyAqLwotCQlzbmRfc29jX2phY2tfZ3Bpb19kZXRlY3QoJmdwaW9zW2ldKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZncGlvc1tpXS53b3JrLAorCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoZ3Bpb3NbaV0uZGVib3VuY2VfdGltZSkpOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1wY20uYyBiL3NvdW5kL3NvYy9zb2MtcGNtLmMKaW5kZXggMjg1MjJiZC4uMmNlZGYwOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1wY20uYworKysgYi9zb3VuZC9zb2Mvc29jLXBjbS5jCkBAIC0zNSw2ICszNSw4NiBAQAogI2RlZmluZSBEUENNX01BWF9CRV9VU0VSUwk4CiAKIC8qKgorICogc25kX3NvY19ydW50aW1lX2FjdGl2YXRlKCkgLSBJbmNyZW1lbnQgYWN0aXZlIGNvdW50IGZvciBQQ00gcnVudGltZSBjb21wb25lbnRzCisgKiBAcnRkOiBBU29DIFBDTSBydW50aW1lIHRoYXQgaXMgYWN0aXZhdGVkCisgKiBAc3RyZWFtOiBEaXJlY3Rpb24gb2YgdGhlIFBDTSBzdHJlYW0KKyAqCisgKiBJbmNyZW1lbnRzIHRoZSBhY3RpdmUgY291bnQgZm9yIGFsbCB0aGUgREFJcyBhbmQgY29tcG9uZW50cyBhdHRhY2hlZCB0byBhIFBDTQorICogcnVudGltZS4gU2hvdWxkIHR5cGljYWxseSBiZSBjYWxsZWQgd2hlbiBhIHN0cmVhbSBpcyBvcGVuZWQuCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgcnRkLT5wY21fbXV0ZXggYmVpbmcgaGVsZAorICovCit2b2lkIHNuZF9zb2NfcnVudGltZV9hY3RpdmF0ZShzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLCBpbnQgc3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcnRkLT5wY21fbXV0ZXgpOworCisJaWYgKHN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCWNwdV9kYWktPnBsYXliYWNrX2FjdGl2ZSsrOworCQljb2RlY19kYWktPnBsYXliYWNrX2FjdGl2ZSsrOworCX0gZWxzZSB7CisJCWNwdV9kYWktPmNhcHR1cmVfYWN0aXZlKys7CisJCWNvZGVjX2RhaS0+Y2FwdHVyZV9hY3RpdmUrKzsKKwl9CisKKwljcHVfZGFpLT5hY3RpdmUrKzsKKwljb2RlY19kYWktPmFjdGl2ZSsrOworCWNwdV9kYWktPmNvbXBvbmVudC0+YWN0aXZlKys7CisJY29kZWNfZGFpLT5jb21wb25lbnQtPmFjdGl2ZSsrOworfQorCisvKioKKyAqIHNuZF9zb2NfcnVudGltZV9kZWFjdGl2YXRlKCkgLSBEZWNyZW1lbnQgYWN0aXZlIGNvdW50IGZvciBQQ00gcnVudGltZSBjb21wb25lbnRzCisgKiBAcnRkOiBBU29DIFBDTSBydW50aW1lIHRoYXQgaXMgZGVhY3RpdmF0ZWQKKyAqIEBzdHJlYW06IERpcmVjdGlvbiBvZiB0aGUgUENNIHN0cmVhbQorICoKKyAqIERlY3JlbWVudHMgdGhlIGFjdGl2ZSBjb3VudCBmb3IgYWxsIHRoZSBEQUlzIGFuZCBjb21wb25lbnRzIGF0dGFjaGVkIHRvIGEgUENNCisgKiBydW50aW1lLiBTaG91bGQgdHlwaWNhbGx5IGJlIGNhbGxlZCB3aGVuIGEgc3RyZWFtIGlzIGNsb3NlZC4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBydGQtPnBjbV9tdXRleCBiZWluZyBoZWxkCisgKi8KK3ZvaWQgc25kX3NvY19ydW50aW1lX2RlYWN0aXZhdGUoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwgaW50IHN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnJ0ZC0+cGNtX211dGV4KTsKKworCWlmIChzdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQljcHVfZGFpLT5wbGF5YmFja19hY3RpdmUtLTsKKwkJY29kZWNfZGFpLT5wbGF5YmFja19hY3RpdmUtLTsKKwl9IGVsc2UgeworCQljcHVfZGFpLT5jYXB0dXJlX2FjdGl2ZS0tOworCQljb2RlY19kYWktPmNhcHR1cmVfYWN0aXZlLS07CisJfQorCisJY3B1X2RhaS0+YWN0aXZlLS07CisJY29kZWNfZGFpLT5hY3RpdmUtLTsKKwljcHVfZGFpLT5jb21wb25lbnQtPmFjdGl2ZS0tOworCWNvZGVjX2RhaS0+Y29tcG9uZW50LT5hY3RpdmUtLTsKK30KKworLyoqCisgKiBzbmRfc29jX3J1bnRpbWVfaWdub3JlX3BtZG93bl90aW1lKCkgLSBDaGVjayB3aGV0aGVyIHRvIGlnbm9yZSB0aGUgcG93ZXIgZG93biBkZWxheQorICogQHJ0ZDogVGhlIEFTb0MgUENNIHJ1bnRpbWUgdGhhdCBzaG91bGQgYmUgY2hlY2tlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZSBwb3dlciBkb3duIGRlbGF5IHNob3VsZCBiZSBpZ25vcmVkIGZvciBhCisgKiBzcGVjaWZpYyBQQ00gcnVudGltZS4gUmV0dXJucyB0cnVlIGlmIHRoZSBkZWxheSBpcyAwLCBpZiBpdCB0aGUgREFJIGxpbmsgaGFzCisgKiBiZWVuIGNvbmZpZ3VyZWQgdG8gaWdub3JlIHRoZSBkZWxheSwgb3IgaWYgbm9uZSBvZiB0aGUgY29tcG9uZW50cyBiZW5lZml0cworICogZnJvbSBoYXZpbmcgdGhlIGRlbGF5LgorICovCitib29sIHNuZF9zb2NfcnVudGltZV9pZ25vcmVfcG1kb3duX3RpbWUoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlpZiAoIXJ0ZC0+cG1kb3duX3RpbWUgfHwgcnRkLT5kYWlfbGluay0+aWdub3JlX3BtZG93bl90aW1lKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBydGQtPmNwdV9kYWktPmNvbXBvbmVudC0+aWdub3JlX3BtZG93bl90aW1lICYmCisJCQlydGQtPmNvZGVjX2RhaS0+Y29tcG9uZW50LT5pZ25vcmVfcG1kb3duX3RpbWU7Cit9CisKKy8qKgogICogc25kX3NvY19zZXRfcnVudGltZV9od3BhcmFtcyAtIHNldCB0aGUgcnVudGltZSBoYXJkd2FyZSBwYXJhbWV0ZXJzCiAgKiBAc3Vic3RyZWFtOiB0aGUgcGNtIHN1YnN0cmVhbQogICogQGh3OiB0aGUgaGFyZHdhcmUgcGFyYW1ldGVycwpAQCAtMzc4LDE2ICs0NTgsOSBAQAogCQkgcnVudGltZS0+aHcucmF0ZV9tYXgpOwogCiBkeW5hbWljOgotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCWNwdV9kYWktPnBsYXliYWNrX2FjdGl2ZSsrOwotCQljb2RlY19kYWktPnBsYXliYWNrX2FjdGl2ZSsrOwotCX0gZWxzZSB7Ci0JCWNwdV9kYWktPmNhcHR1cmVfYWN0aXZlKys7Ci0JCWNvZGVjX2RhaS0+Y2FwdHVyZV9hY3RpdmUrKzsKLQl9Ci0JY3B1X2RhaS0+YWN0aXZlKys7Ci0JY29kZWNfZGFpLT5hY3RpdmUrKzsKLQlydGQtPmNvZGVjLT5hY3RpdmUrKzsKKworCXNuZF9zb2NfcnVudGltZV9hY3RpdmF0ZShydGQsIHN1YnN0cmVhbS0+c3RyZWFtKTsKKwogCW11dGV4X3VubG9jaygmcnRkLT5wY21fbXV0ZXgpOwogCXJldHVybiAwOwogCkBAIC00NTksMjEgKzUzMiwxMCBAQAogCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHJ0ZC0+cGxhdGZvcm07CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKIAogCW11dGV4X2xvY2tfbmVzdGVkKCZydGQtPnBjbV9tdXRleCwgcnRkLT5wY21fc3ViY2xhc3MpOwogCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJY3B1X2RhaS0+cGxheWJhY2tfYWN0aXZlLS07Ci0JCWNvZGVjX2RhaS0+cGxheWJhY2tfYWN0aXZlLS07Ci0JfSBlbHNlIHsKLQkJY3B1X2RhaS0+Y2FwdHVyZV9hY3RpdmUtLTsKLQkJY29kZWNfZGFpLT5jYXB0dXJlX2FjdGl2ZS0tOwotCX0KLQotCWNwdV9kYWktPmFjdGl2ZS0tOwotCWNvZGVjX2RhaS0+YWN0aXZlLS07Ci0JY29kZWMtPmFjdGl2ZS0tOworCXNuZF9zb2NfcnVudGltZV9kZWFjdGl2YXRlKHJ0ZCwgc3Vic3RyZWFtLT5zdHJlYW0pOwogCiAJLyogY2xlYXIgdGhlIGNvcnJlc3BvbmRpbmcgREFJcyByYXRlIHdoZW4gaW5hY3RpdmUgKi8KIAlpZiAoIWNwdV9kYWktPmFjdGl2ZSkKQEAgLTQ5Niw4ICs1NTgsNyBAQAogCWNwdV9kYWktPnJ1bnRpbWUgPSBOVUxMOwogCiAJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJaWYgKCFydGQtPnBtZG93bl90aW1lIHx8IGNvZGVjLT5pZ25vcmVfcG1kb3duX3RpbWUgfHwKLQkJICAgIHJ0ZC0+ZGFpX2xpbmstPmlnbm9yZV9wbWRvd25fdGltZSkgeworCQlpZiAoc25kX3NvY19ydW50aW1lX2lnbm9yZV9wbWRvd25fdGltZShydGQpKSB7CiAJCQkvKiBwb3dlcmVkIGRvd24gcGxheWJhY2sgc3RyZWFtIG5vdyAqLwogCQkJc25kX3NvY19kYXBtX3N0cmVhbV9ldmVudChydGQsCiAJCQkJCQkgIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCkBAIC0xOTg5LDcgKzIwNTAsNiBAQAogCiAJCXBhdGhzID0gZHBjbV9wYXRoX2dldChmZSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJmxpc3QpOwogCQlpZiAocGF0aHMgPCAwKSB7Ci0JCQlkcGNtX3BhdGhfcHV0KCZsaXN0KTsKIAkJCWRldl93YXJuKGZlLT5kZXYsICJBU29DOiAlcyBubyB2YWxpZCAlcyBwYXRoXG4iLAogCQkJCQlmZS0+ZGFpX2xpbmstPm5hbWUsICAicGxheWJhY2siKTsKIAkJCW11dGV4X3VubG9jaygmY2FyZC0+bXV0ZXgpOwpAQCAtMjAxOSw3ICsyMDc5LDYgQEAKIAogCQlwYXRocyA9IGRwY21fcGF0aF9nZXQoZmUsIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJmxpc3QpOwogCQlpZiAocGF0aHMgPCAwKSB7Ci0JCQlkcGNtX3BhdGhfcHV0KCZsaXN0KTsKIAkJCWRldl93YXJuKGZlLT5kZXYsICJBU29DOiAlcyBubyB2YWxpZCAlcyBwYXRoXG4iLAogCQkJCQlmZS0+ZGFpX2xpbmstPm5hbWUsICAiY2FwdHVyZSIpOwogCQkJbXV0ZXhfdW5sb2NrKCZjYXJkLT5tdXRleCk7CkBAIC0yMDg0LDcgKzIxNDMsNiBAQAogCWZlLT5kcGNtW3N0cmVhbV0ucnVudGltZSA9IGZlX3N1YnN0cmVhbS0+cnVudGltZTsKIAogCWlmIChkcGNtX3BhdGhfZ2V0KGZlLCBzdHJlYW0sICZsaXN0KSA8PSAwKSB7Ci0JCWRwY21fcGF0aF9wdXQoJmxpc3QpOwogCQlkZXZfZGJnKGZlLT5kZXYsICJBU29DOiAlcyBubyB2YWxpZCAlcyByb3V0ZVxuIiwKIAkJCWZlLT5kYWlfbGluay0+bmFtZSwgc3RyZWFtID8gImNhcHR1cmUiIDogInBsYXliYWNrIik7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NwZWFyL3NwZGlmX291dC5jIGIvc291bmQvc29jL3NwZWFyL3NwZGlmX291dC5jCmluZGV4IGZlOTlmNDYuLjE5Y2NhMDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zcGVhci9zcGRpZl9vdXQuYworKysgYi9zb3VuZC9zb2Mvc3BlYXIvc3BkaWZfb3V0LmMKQEAgLTIxMywxMCArMjEzLDcgQEAKIHN0YXRpYyBpbnQgc3BkaWZfbXV0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNhcmQ7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IGNhcmQtPnJ0ZDsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXN0cnVjdCBzcGRpZl9vdXRfZGV2ICpob3N0ID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoY3B1X2RhaSk7CiAKIAl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGhvc3QtPnNhdmVkX3BhcmFtcy5tdXRlOwpAQCAtMjI2LDEwICsyMjMsNyBAQAogc3RhdGljIGludCBzcGRpZl9tdXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y2FyZDsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gY2FyZC0+cnRkOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc3RydWN0IHNwZGlmX291dF9kZXYgKmhvc3QgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKIAogCWlmIChob3N0LT5zYXZlZF9wYXJhbXMubXV0ZSA9PSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS9LY29uZmlnIGIvc291bmQvc29jL3RlZ3JhL0tjb25maWcKaW5kZXggOWY5YzE4NS4uMzExOThjZjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy90ZWdyYS9LY29uZmlnCkBAIC0xMDUsNyArMTA1LDcgQEAKIAl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIFRyaW1TbGljZSBib2FyZCIKIAlkZXBlbmRzIG9uIFNORF9TT0NfVEVHUkEgJiYgSTJDCiAJc2VsZWN0IFNORF9TT0NfVEVHUkEyMF9JMlMgaWYgQVJDSF9URUdSQV8yeF9TT0MKLQlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyMworCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzX0kyQwogCWhlbHAKIAkgIFNheSBZIG9yIE0gaGVyZSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIHRoZQogCSAgVHJpbVNsaWNlIHBsYXRmb3JtLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhMjBfYWM5Ny5jIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhMjBfYWM5Ny5jCmluZGV4IGNmNWUxY2YuLjNiMGZhMTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2FjOTcuYworKysgYi9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9hYzk3LmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9kbWFlbmdpbmVfcGNtLmg+CiAKLSNpbmNsdWRlICJ0ZWdyYV9hc29jX3V0aWxzLmgiCiAjaW5jbHVkZSAidGVncmEyMF9hYzk3LmgiCiAKICNkZWZpbmUgRFJWX05BTUUgInRlZ3JhMjAtYWM5NyIKQEAgLTMwNiw3ICszMDUsNyBAQAogCS5yZWFkYWJsZV9yZWcgPSB0ZWdyYTIwX2FjOTdfd3JfcmRfcmVnLAogCS52b2xhdGlsZV9yZWcgPSB0ZWdyYTIwX2FjOTdfdm9sYXRpbGVfcmVnLAogCS5wcmVjaW91c19yZWcgPSB0ZWdyYTIwX2FjOTdfcHJlY2lvdXNfcmVnLAotCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfRkxBVCwKIH07CiAKIHN0YXRpYyBpbnQgdGVncmEyMF9hYzk3X3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0zNzYsMTggKzM3NSwxMCBAQAogCWFjOTctPnBsYXliYWNrX2RtYV9kYXRhLmFkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUzsKIAlhYzk3LT5wbGF5YmFja19kbWFfZGF0YS5tYXhidXJzdCA9IDQ7CiAKLQlyZXQgPSB0ZWdyYV9hc29jX3V0aWxzX2luaXQoJmFjOTctPnV0aWxfZGF0YSwgJnBkZXYtPmRldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfY2xrX3B1dDsKLQotCXJldCA9IHRlZ3JhX2Fzb2NfdXRpbHNfc2V0X2FjOTdfcmF0ZSgmYWM5Ny0+dXRpbF9kYXRhKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9hc29jX3V0aWxzX2Zpbmk7Ci0KIAlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoYWM5Ny0+Y2xrX2FjOTcpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2xrX2VuYWJsZSBmYWlsZWQ6ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycl9hc29jX3V0aWxzX2Zpbmk7CisJCWdvdG8gZXJyOwogCX0KIAogCXJldCA9IHNuZF9zb2Nfc2V0X2FjOTdfb3BzKCZ0ZWdyYTIwX2FjOTdfb3BzKTsKQEAgLTQxOSw4ICs0MTAsNiBAQAogCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldik7CiBlcnJfY2xrX2Rpc2FibGVfdW5wcmVwYXJlOgogCWNsa19kaXNhYmxlX3VucHJlcGFyZShhYzk3LT5jbGtfYWM5Nyk7Ci1lcnJfYXNvY191dGlsc19maW5pOgotCXRlZ3JhX2Fzb2NfdXRpbHNfZmluaSgmYWM5Ny0+dXRpbF9kYXRhKTsKIGVycl9jbGtfcHV0OgogZXJyOgogCXNuZF9zb2Nfc2V0X2FjOTdfb3BzKE5VTEwpOwpAQCAtNDM0LDggKzQyMyw2IEBACiAJdGVncmFfcGNtX3BsYXRmb3JtX3VucmVnaXN0ZXIoJnBkZXYtPmRldik7CiAJc25kX3NvY191bnJlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2KTsKIAotCXRlZ3JhX2Fzb2NfdXRpbHNfZmluaSgmYWM5Ny0+dXRpbF9kYXRhKTsKLQogCWNsa19kaXNhYmxlX3VucHJlcGFyZShhYzk3LT5jbGtfYWM5Nyk7CiAKIAlzbmRfc29jX3NldF9hYzk3X29wcyhOVUxMKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2FjOTcuaCBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2FjOTcuaAppbmRleCA0YWNiM2FhLi4wYTM5ZDgyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9hYzk3LmgKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhMjBfYWM5Ny5oCkBAIC05MCw2ICs5MCw1IEBACiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCWludCByZXNldF9ncGlvOwogCWludCBzeW5jX2dwaW87Ci0Jc3RydWN0IHRlZ3JhX2Fzb2NfdXRpbHNfZGF0YSB1dGlsX2RhdGE7CiB9OwogI2VuZGlmIC8qIF9fVEVHUkEyMF9BQzk3X0hfXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhMjBfZGFzLmMgYi9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9kYXMuYwppbmRleCBlNzIzOTI5Li5hNjM0ZjEzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9kYXMuYworKysgYi9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9kYXMuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiAJLm1heF9yZWdpc3RlciA9IExBU1RfUkVHKERBQ19JTlBVVF9EQVRBX0NMS19TRUwpLAogCS53cml0ZWFibGVfcmVnID0gdGVncmEyMF9kYXNfd3JfcmRfcmVnLAogCS5yZWFkYWJsZV9yZWcgPSB0ZWdyYTIwX2Rhc193cl9yZF9yZWcsCi0JLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAogfTsKIAogc3RhdGljIGludCB0ZWdyYTIwX2Rhc19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhMjBfaTJzLmMgYi9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9pMnMuYwppbmRleCA0MmMxZjZiLi43OWE5OTMyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9pMnMuYworKysgYi9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9pMnMuYwpAQCAtMzMzLDcgKzMzMyw3IEBACiAJLnJlYWRhYmxlX3JlZyA9IHRlZ3JhMjBfaTJzX3dyX3JkX3JlZywKIAkudm9sYXRpbGVfcmVnID0gdGVncmEyMF9pMnNfdm9sYXRpbGVfcmVnLAogCS5wcmVjaW91c19yZWcgPSB0ZWdyYTIwX2kyc19wcmVjaW91c19yZWcsCi0JLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAogfTsKIAogc3RhdGljIGludCB0ZWdyYTIwX2kyc19wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhMjBfc3BkaWYuYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX3NwZGlmLmMKaW5kZXggOGM3YzEwMi4uYTBjZTkyNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhMjBfc3BkaWYuYworKysgYi9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9zcGRpZi5jCkBAIC0yNTksNyArMjU5LDcgQEAKIAkucmVhZGFibGVfcmVnID0gdGVncmEyMF9zcGRpZl93cl9yZF9yZWcsCiAJLnZvbGF0aWxlX3JlZyA9IHRlZ3JhMjBfc3BkaWZfdm9sYXRpbGVfcmVnLAogCS5wcmVjaW91c19yZWcgPSB0ZWdyYTIwX3NwZGlmX3ByZWNpb3VzX3JlZywKLQkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCiB9OwogCiBzdGF0aWMgaW50IHRlZ3JhMjBfc3BkaWZfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTMwX2FodWIuYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTMwX2FodWIuYwppbmRleCBkNmY0Yzk5Li4wZGI2OGY0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvdGVncmEzMF9haHViLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhMzBfYWh1Yi5jCkBAIC00NzEsNyArNDcxLDcgQEAKIAkucmVhZGFibGVfcmVnID0gdGVncmEzMF9haHViX2FwYmlmX3dyX3JkX3JlZywKIAkudm9sYXRpbGVfcmVnID0gdGVncmEzMF9haHViX2FwYmlmX3ZvbGF0aWxlX3JlZywKIAkucHJlY2lvdXNfcmVnID0gdGVncmEzMF9haHViX2FwYmlmX3ByZWNpb3VzX3JlZywKLQkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCiB9OwogCiBzdGF0aWMgYm9vbCB0ZWdyYTMwX2FodWJfYWh1Yl93cl9yZF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQpAQCAtNDkwLDcgKzQ5MCw3IEBACiAJLm1heF9yZWdpc3RlciA9IExBU1RfUkVHKEFVRElPX1JYKSwKIAkud3JpdGVhYmxlX3JlZyA9IHRlZ3JhMzBfYWh1Yl9haHViX3dyX3JkX3JlZywKIAkucmVhZGFibGVfcmVnID0gdGVncmEzMF9haHViX2FodWJfd3JfcmRfcmVnLAotCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfRkxBVCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdGVncmEzMF9haHViX3NvY19kYXRhIHNvY19kYXRhX3RlZ3JhMzAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdGVncmEvdGVncmEzMF9pMnMuYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTMwX2kycy5jCmluZGV4IDQ5YWQ5MzYuLmYxNDZjNDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTMwX2kycy5jCisrKyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTMwX2kycy5jCkBAIC0zNTcsNyArMzU3LDcgQEAKIAkud3JpdGVhYmxlX3JlZyA9IHRlZ3JhMzBfaTJzX3dyX3JkX3JlZywKIAkucmVhZGFibGVfcmVnID0gdGVncmEzMF9pMnNfd3JfcmRfcmVnLAogCS52b2xhdGlsZV9yZWcgPSB0ZWdyYTMwX2kyc192b2xhdGlsZV9yZWcsCi0JLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYTMwX2kyc19zb2NfZGF0YSB0ZWdyYTMwX2kyc19jb25maWcgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdGVncmEvdGVncmFfd205NzEyLmMgYi9zb3VuZC9zb2MvdGVncmEvdGVncmFfd205NzEyLmMKaW5kZXggNDViNTc4OS4uMjVhN2Y4MiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3dtOTcxMi5jCisrKyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV93bTk3MTIuYwpAQCAtMjksMTAgKzI5LDEzIEBACiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogCisjaW5jbHVkZSAidGVncmFfYXNvY191dGlscy5oIgorCiAjZGVmaW5lIERSVl9OQU1FICJ0ZWdyYS1zbmQtd205NzEyIgogCiBzdHJ1Y3QgdGVncmFfd205NzEyIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpjb2RlYzsKKwlzdHJ1Y3QgdGVncmFfYXNvY191dGlsc19kYXRhIHV0aWxfZGF0YTsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB0ZWdyYV93bTk3MTJfZGFwbV93aWRnZXRzW10gPSB7CkBAIC0xMTgsMTUgKzEyMSwyNSBAQAogCiAJdGVncmFfd205NzEyX2RhaS5wbGF0Zm9ybV9vZl9ub2RlID0gdGVncmFfd205NzEyX2RhaS5jcHVfb2Zfbm9kZTsKIAorCXJldCA9IHRlZ3JhX2Fzb2NfdXRpbHNfaW5pdCgmbWFjaGluZS0+dXRpbF9kYXRhLCAmcGRldi0+ZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGNvZGVjX3VucmVnaXN0ZXI7CisKKwlyZXQgPSB0ZWdyYV9hc29jX3V0aWxzX3NldF9hYzk3X3JhdGUoJm1hY2hpbmUtPnV0aWxfZGF0YSk7CisJaWYgKHJldCkKKwkJZ290byBhc29jX3V0aWxzX2Zpbmk7CisKIAlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NhcmQoY2FyZCk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzbmRfc29jX3JlZ2lzdGVyX2NhcmQgZmFpbGVkICglZClcbiIsCiAJCQlyZXQpOwotCQlnb3RvIGNvZGVjX3VucmVnaXN0ZXI7CisJCWdvdG8gYXNvY191dGlsc19maW5pOwogCX0KIAogCXJldHVybiAwOwogCithc29jX3V0aWxzX2Zpbmk6CisJdGVncmFfYXNvY191dGlsc19maW5pKCZtYWNoaW5lLT51dGlsX2RhdGEpOwogY29kZWNfdW5yZWdpc3RlcjoKIAlwbGF0Zm9ybV9kZXZpY2VfZGVsKG1hY2hpbmUtPmNvZGVjKTsKIGNvZGVjX3B1dDoKQEAgLTE0MSw2ICsxNTQsOCBAQAogCiAJc25kX3NvY191bnJlZ2lzdGVyX2NhcmQoY2FyZCk7CiAKKwl0ZWdyYV9hc29jX3V0aWxzX2ZpbmkoJm1hY2hpbmUtPnV0aWxfZGF0YSk7CisKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihtYWNoaW5lLT5jb2RlYyk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NwYXJjL2FtZDc5MzAuYyBiL3NvdW5kL3NwYXJjL2FtZDc5MzAuYwppbmRleCAxNzRkMjFmLi40YTg1ZTE0IDEwMDY0NAotLS0gYS9zb3VuZC9zcGFyYy9hbWQ3OTMwLmMKKysrIGIvc291bmQvc3BhcmMvYW1kNzkzMC5jCkBAIC0xMDE5LDggKzEwMTksOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2X251bV0sIGlkW2Rldl9udW1dLCBUSElTX01PRFVMRSwgMCwKLQkJCSAgICAgICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJm9wLT5kZXYsIGluZGV4W2Rldl9udW1dLCBpZFtkZXZfbnVtXSwKKwkJCSAgIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NwYXJjL2NzNDIzMS5jIGIvc291bmQvc3BhcmMvY3M0MjMxLmMKaW5kZXggZGJiMWI2MjUuLjRlOTFiY2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NwYXJjL2NzNDIzMS5jCisrKyBiL3NvdW5kL3NwYXJjL2NzNDIzMS5jCkBAIC0xNTY1LDcgKzE1NjUsOCBAQAogCiBzdGF0aWMgaW50IGRldjsKIAotc3RhdGljIGludCBjczQyMzFfYXR0YWNoX2JlZ2luKHN0cnVjdCBzbmRfY2FyZCAqKnJjYXJkKQorc3RhdGljIGludCBjczQyMzFfYXR0YWNoX2JlZ2luKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY2FyZCAqKnJjYXJkKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcDsKQEAgLTE1ODEsOCArMTU4Miw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2NzNDIzMSksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJm9wLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfY3M0MjMxKSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xODY5LDcgKzE4NzAsNyBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gY3M0MjMxX2F0dGFjaF9iZWdpbigmY2FyZCk7CisJZXJyID0gY3M0MjMxX2F0dGFjaF9iZWdpbihvcCwgJmNhcmQpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTIwNjAsNyArMjA2MSw3IEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBlcnI7CiAKLQllcnIgPSBjczQyMzFfYXR0YWNoX2JlZ2luKCZjYXJkKTsKKwllcnIgPSBjczQyMzFfYXR0YWNoX2JlZ2luKG9wLCAmY2FyZCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvc3BhcmMvZGJyaS5jIGIvc291bmQvc3BhcmMvZGJyaS5jCmluZGV4IGVlZTdhZmMuLmJlMWIxYWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NwYXJjL2RicmkuYworKysgYi9zb3VuZC9zcGFyYy9kYnJpLmMKQEAgLTI2MTUsOCArMjYxNSw4IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2RicmkpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZvcC0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX2RicmkpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NwaS9hdDczYzIxMy5jIGIvc291bmQvc3BpL2F0NzNjMjEzLmMKaW5kZXggMjVjMzhhZi4uMzk1MjIzNiAxMDA2NDQKLS0tIGEvc291bmQvc3BpL2F0NzNjMjEzLmMKKysrIGIvc291bmQvc3BpL2F0NzNjMjEzLmMKQEAgLTkyNyw4ICs5MjcsNiBAQAogCWlmIChyZXR2YWwpCiAJCWdvdG8gb3V0X3NuZF9kZXY7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZzcGktPmRldik7Ci0KIAlnb3RvIG91dDsKIAogb3V0X3NuZF9kZXY6CkBAIC05NjYsOCArOTY0LDggQEAKIAogCS8qIEFsbG9jYXRlICJjYXJkIiB1c2luZyBzb21lIHVudXNlZCBpZGVudGlmaWVycy4gKi8KIAlzbnByaW50ZihpZCwgc2l6ZW9mIGlkLCAiYXQ3M2MyMTNfJWQiLCBib2FyZC0+c3NjX2lkKTsKLQlyZXR2YWwgPSBzbmRfY2FyZF9jcmVhdGUoLTEsIGlkLCBUSElTX01PRFVMRSwKLQkJCQkgc2l6ZW9mKHN0cnVjdCBzbmRfYXQ3M2MyMTMpLCAmY2FyZCk7CisJcmV0dmFsID0gc25kX2NhcmRfbmV3KCZzcGktPmRldiwgLTEsIGlkLCBUSElTX01PRFVMRSwKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2F0NzNjMjEzKSwgJmNhcmQpOwogCWlmIChyZXR2YWwgPCAwKQogCQlnb3RvIG91dDsKIApkaWZmIC0tZ2l0IGEvc291bmQvdXNiLzZmaXJlL2NoaXAuYyBiL3NvdW5kL3VzYi82ZmlyZS9jaGlwLmMKaW5kZXggNjZlZGM0YS4uZGNkZGZjMyAxMDA2NDQKLS0tIGEvc291bmQvdXNiLzZmaXJlL2NoaXAuYworKysgYi9zb3VuZC91c2IvNmZpcmUvY2hpcC5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIAl9CiAJaWYgKHJlZ2lkeCA8IDApIHsKIAkJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJ0b28gbWFueSBjYXJkcyByZWdpc3RlcmVkLlxuIik7CisJCWRldl9lcnIoJmludGYtPmRldiwgInRvbyBtYW55IGNhcmRzIHJlZ2lzdGVyZWQuXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWRldmljZXNbcmVnaWR4XSA9IGRldmljZTsKQEAgLTEyMSwyMCArMTIxLDE5IEBACiAKIAkvKiBpZiB3ZSBhcmUgaGVyZSwgY2FyZCBjYW4gYmUgcmVnaXN0ZXJlZCBpbiBhbHNhLiAqLwogCWlmICh1c2Jfc2V0X2ludGVyZmFjZShkZXZpY2UsIDAsIDApICE9IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggImNhbid0IHNldCBmaXJzdCBpbnRlcmZhY2UuXG4iKTsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiY2FuJ3Qgc2V0IGZpcnN0IGludGVyZmFjZS5cbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0JcmV0ID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W3JlZ2lkeF0sIGlkW3JlZ2lkeF0sIFRISVNfTU9EVUxFLAotCQkJc2l6ZW9mKHN0cnVjdCBzZmlyZV9jaGlwKSwgJmNhcmQpOworCXJldCA9IHNuZF9jYXJkX25ldygmaW50Zi0+ZGV2LCBpbmRleFtyZWdpZHhdLCBpZFtyZWdpZHhdLAorCQkJICAgVEhJU19NT0RVTEUsIHNpemVvZihzdHJ1Y3Qgc2ZpcmVfY2hpcCksICZjYXJkKTsKIAlpZiAocmV0IDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiY2Fubm90IGNyZWF0ZSBhbHNhIGNhcmQuXG4iKTsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiY2Fubm90IGNyZWF0ZSBhbHNhIGNhcmQuXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgIjZGaXJlVVNCIik7CiAJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIlRlcnJhVGVjIERNWDZGaXJlVVNCIik7CiAJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0ICVkOiVkIiwgY2FyZC0+c2hvcnRuYW1lLAogCQkJZGV2aWNlLT5idXMtPmJ1c251bSwgZGV2aWNlLT5kZXZudW0pOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmludGYtPmRldik7CiAKIAljaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCWNoaXBzW3JlZ2lkeF0gPSBjaGlwOwpAQCAtMTY5LDcgKzE2OCw3IEBACiAKIAlyZXQgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAocmV0IDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiY2Fubm90IHJlZ2lzdGVyIGNhcmQuIik7CisJCWRldl9lcnIoJmludGYtPmRldiwgImNhbm5vdCByZWdpc3RlciBjYXJkLiIpOwogCQl1c2I2ZmlyZV9jaGlwX2Rlc3Ryb3koY2hpcCk7CiAJCXJldHVybiByZXQ7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvdXNiLzZmaXJlL2NvbW0uYyBiL3NvdW5kL3VzYi82ZmlyZS9jb21tLmMKaW5kZXggMjM0NTJlZS4uMTYxMjE1ZCAxMDA2NDQKLS0tIGEvc291bmQvdXNiLzZmaXJlL2NvbW0uYworKysgYi9zb3VuZC91c2IvNmZpcmUvY29tbS5jCkBAIC01MSw3ICs1MSw3IEBACiAJCXVyYi0+c3RhdHVzID0gMDsKIAkJdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKIAkJaWYgKHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykgPCAwKQotCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCisJCQlkZXZfd2FybigmdXJiLT5kZXYtPmRldiwKIAkJCQkJImNvbW0gZGF0YSByZWNlaXZlciBhYm9ydGVkLlxuIik7CiAJfQogfQpAQCAtMTc5LDcgKzE3OSw3IEBACiAJaWYgKHJldCA8IDApIHsKIAkJa2ZyZWUocnQtPnJlY2VpdmVyX2J1ZmZlcik7CiAJCWtmcmVlKHJ0KTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggImNhbm5vdCBjcmVhdGUgY29tbSBkYXRhIHJlY2VpdmVyLiIpOworCQlkZXZfZXJyKCZjaGlwLT5kZXYtPmRldiwgImNhbm5vdCBjcmVhdGUgY29tbSBkYXRhIHJlY2VpdmVyLiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAljaGlwLT5jb21tID0gcnQ7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvNmZpcmUvY29udHJvbC5jIGIvc291bmQvdXNiLzZmaXJlL2NvbnRyb2wuYwppbmRleCBmNjQzNGMyLi4xODRlMzk4IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvNmZpcmUvY29udHJvbC5jCisrKyBiL3NvdW5kL3VzYi82ZmlyZS9jb250cm9sLmMKQEAgLTE5NCw3ICsxOTQsOCBAQAogCWludCBjaGFuZ2VkID0gMDsKIAogCWlmIChjaCA+IDQpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggIkludmFsaWQgY2hhbm5lbCBpbiB2b2x1bWUgY29udHJvbC4iKTsKKwkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LAorCQkJIkludmFsaWQgY2hhbm5lbCBpbiB2b2x1bWUgY29udHJvbC4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMjIsNyArMjIzLDggQEAKIAl1bnNpZ25lZCBpbnQgY2ggPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKIAogCWlmIChjaCA+IDQpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggIkludmFsaWQgY2hhbm5lbCBpbiB2b2x1bWUgY29udHJvbC4iKTsKKwkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LAorCQkJIkludmFsaWQgY2hhbm5lbCBpbiB2b2x1bWUgY29udHJvbC4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNDAsNyArMjQyLDggQEAKIAl1OCB2YWx1ZSA9IDA7CiAKIAlpZiAoY2ggPiA0KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJJbnZhbGlkIGNoYW5uZWwgaW4gdm9sdW1lIGNvbnRyb2wuIik7CisJCWRldl9lcnIoJnJ0LT5jaGlwLT5kZXYtPmRldiwKKwkJCSJJbnZhbGlkIGNoYW5uZWwgaW4gdm9sdW1lIGNvbnRyb2wuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjY1LDcgKzI2OCw4IEBACiAJdTggdmFsdWUgPSBydC0+b3V0cHV0X211dGUgPj4gY2g7CiAKIAlpZiAoY2ggPiA0KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJJbnZhbGlkIGNoYW5uZWwgaW4gdm9sdW1lIGNvbnRyb2wuIik7CisJCWRldl9lcnIoJnJ0LT5jaGlwLT5kZXYtPmRldiwKKwkJCSJJbnZhbGlkIGNoYW5uZWwgaW4gdm9sdW1lIGNvbnRyb2wuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNTk0LDE0ICs1OTgsMTQgQEAKIAlyZXQgPSB1c2I2ZmlyZV9jb250cm9sX2FkZF92aXJ0dWFsKHJ0LCBjaGlwLT5jYXJkLAogCQkiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIHZvbF9lbGVtZW50cyk7CiAJaWYgKHJldCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiY2Fubm90IGFkZCBjb250cm9sLlxuIik7CisJCWRldl9lcnIoJmNoaXAtPmRldi0+ZGV2LCAiY2Fubm90IGFkZCBjb250cm9sLlxuIik7CiAJCWtmcmVlKHJ0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJcmV0ID0gdXNiNmZpcmVfY29udHJvbF9hZGRfdmlydHVhbChydCwgY2hpcC0+Y2FyZCwKIAkJIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCBtdXRlX2VsZW1lbnRzKTsKIAlpZiAocmV0KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJjYW5ub3QgYWRkIGNvbnRyb2wuXG4iKTsKKwkJZGV2X2VycigmY2hpcC0+ZGV2LT5kZXYsICJjYW5ub3QgYWRkIGNvbnRyb2wuXG4iKTsKIAkJa2ZyZWUocnQpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTYxMSw3ICs2MTUsNyBAQAogCQlyZXQgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBzbmRfY3RsX25ldzEoJmVsZW1lbnRzW2ldLCBydCkpOwogCQlpZiAocmV0IDwgMCkgewogCQkJa2ZyZWUocnQpOwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggImNhbm5vdCBhZGQgY29udHJvbC5cbiIpOworCQkJZGV2X2VycigmY2hpcC0+ZGV2LT5kZXYsICJjYW5ub3QgYWRkIGNvbnRyb2wuXG4iKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAkJaSsrOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiLzZmaXJlL2Zpcm13YXJlLmMgYi9zb3VuZC91c2IvNmZpcmUvZmlybXdhcmUuYwppbmRleCA3ODBiZjNmLi4zYjAyZTU0IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvNmZpcmUvZmlybXdhcmUuYworKysgYi9zb3VuZC91c2IvNmZpcmUvZmlybXdhcmUuYwpAQCAtMjE5LDE2ICsyMTksMTYgQEAKIAlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZnduYW1lLCAmZGV2aWNlLT5kZXYpOwogCWlmIChyZXQgPCAwKSB7CiAJCWtmcmVlKHJlYyk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJlcnJvciByZXF1ZXN0aW5nIGV6dXNiICIKLQkJCQkiZmlybXdhcmUgJXMuXG4iLCBmd25hbWUpOworCQlkZXZfZXJyKCZpbnRmLT5kZXYsCisJCQkiZXJyb3IgcmVxdWVzdGluZyBlenVzYiBmaXJtd2FyZSAlcy5cbiIsIGZ3bmFtZSk7CiAJCXJldHVybiByZXQ7CiAJfQogCXJldCA9IHVzYjZmaXJlX2Z3X2loZXhfaW5pdChmdywgcmVjKTsKIAlpZiAocmV0IDwgMCkgewogCQlrZnJlZShyZWMpOwogCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggImVycm9yIHZhbGlkYXRpbmcgZXp1c2IgIgotCQkJCSJmaXJtd2FyZSAlcy5cbiIsIGZ3bmFtZSk7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJlcnJvciB2YWxpZGF0aW5nIGV6dXNiIGZpcm13YXJlICVzLlxuIiwgZnduYW1lKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJLyogdXBsb2FkIGZpcm13YXJlIGltYWdlICovCkBAIC0yMzcsOCArMjM3LDkgQEAKIAlpZiAocmV0IDwgMCkgewogCQlrZnJlZShyZWMpOwogCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggInVuYWJsZSB0byB1cGxvYWQgZXp1c2IgIgotCQkJCSJmaXJtd2FyZSAlczogYmVnaW4gbWVzc2FnZS5cbiIsIGZ3bmFtZSk7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJ1bmFibGUgdG8gdXBsb2FkIGV6dXNiIGZpcm13YXJlICVzOiBiZWdpbiBtZXNzYWdlLlxuIiwKKwkJCWZ3bmFtZSk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0yNDgsOCArMjQ5LDkgQEAKIAkJaWYgKHJldCA8IDApIHsKIAkJCWtmcmVlKHJlYyk7CiAJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJ1bmFibGUgdG8gdXBsb2FkIGV6dXNiICIKLQkJCQkJImZpcm13YXJlICVzOiBkYXRhIHVyYi5cbiIsIGZ3bmFtZSk7CisJCQlkZXZfZXJyKCZpbnRmLT5kZXYsCisJCQkJInVuYWJsZSB0byB1cGxvYWQgZXp1c2IgZmlybXdhcmUgJXM6IGRhdGEgdXJiLlxuIiwKKwkJCQlmd25hbWUpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KQEAgLTI2MCw4ICsyNjIsOSBAQAogCQlyZXQgPSB1c2I2ZmlyZV9md19lenVzYl93cml0ZShkZXZpY2UsIDB4YTAsIHBvc3RhZGRyLAogCQkJCXBvc3RkYXRhLCBwb3N0bGVuKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJ1bmFibGUgdG8gdXBsb2FkIGV6dXNiICIKLQkJCQkJImZpcm13YXJlICVzOiBwb3N0IHVyYi5cbiIsIGZ3bmFtZSk7CisJCQlkZXZfZXJyKCZpbnRmLT5kZXYsCisJCQkJInVuYWJsZSB0byB1cGxvYWQgZXp1c2IgZmlybXdhcmUgJXM6IHBvc3QgdXJiLlxuIiwKKwkJCQlmd25hbWUpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KQEAgLTI2OSw4ICsyNzIsOSBAQAogCWRhdGEgPSAweDAwOyAvKiByZXN1bWUgZXp1c2IgY3B1ICovCiAJcmV0ID0gdXNiNmZpcmVfZndfZXp1c2Jfd3JpdGUoZGV2aWNlLCAweGEwLCAweGU2MDAsICZkYXRhLCAxKTsKIAlpZiAocmV0IDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAidW5hYmxlIHRvIHVwbG9hZCBlenVzYiAiCi0JCQkJImZpcm13YXJlICVzOiBlbmQgbWVzc2FnZS5cbiIsIGZ3bmFtZSk7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJ1bmFibGUgdG8gdXBsb2FkIGV6dXNiIGZpcm13YXJlICVzOiBlbmQgbWVzc2FnZS5cbiIsCisJCQlmd25hbWUpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlyZXR1cm4gMDsKQEAgLTI5Miw3ICsyOTYsNyBAQAogCiAJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3bmFtZSwgJmRldmljZS0+ZGV2KTsKIAlpZiAocmV0IDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAidW5hYmxlIHRvIGdldCBmcGdhIGZpcm13YXJlICVzLlxuIiwKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAidW5hYmxlIHRvIGdldCBmcGdhIGZpcm13YXJlICVzLlxuIiwKIAkJCQlmd25hbWUpOwogCQlrZnJlZShidWZmZXIpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTMwNSw4ICszMDksOCBAQAogCWlmIChyZXQgPCAwKSB7CiAJCWtmcmVlKGJ1ZmZlcik7CiAJCXJlbGVhc2VfZmlybXdhcmUoZncpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAidW5hYmxlIHRvIHVwbG9hZCBmcGdhIGZpcm13YXJlOiAiCi0JCQkJImJlZ2luIHVyYi5cbiIpOworCQlkZXZfZXJyKCZpbnRmLT5kZXYsCisJCQkidW5hYmxlIHRvIHVwbG9hZCBmcGdhIGZpcm13YXJlOiBiZWdpbiB1cmIuXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTMxOCw4ICszMjIsOCBAQAogCQlpZiAocmV0IDwgMCkgewogCQkJcmVsZWFzZV9maXJtd2FyZShmdyk7CiAJCQlrZnJlZShidWZmZXIpOwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggInVuYWJsZSB0byB1cGxvYWQgZnBnYSAiCi0JCQkJCSJmaXJtd2FyZTogZncgdXJiLlxuIik7CisJCQlkZXZfZXJyKCZpbnRmLT5kZXYsCisJCQkJInVuYWJsZSB0byB1cGxvYWQgZnBnYSBmaXJtd2FyZTogZncgdXJiLlxuIik7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQpAQCAtMzI4LDggKzMzMiw4IEBACiAKIAlyZXQgPSB1c2I2ZmlyZV9md19lenVzYl93cml0ZShkZXZpY2UsIDksIDAsIE5VTEwsIDApOwogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJ1bmFibGUgdG8gdXBsb2FkIGZwZ2EgZmlybXdhcmU6ICIKLQkJCQkiZW5kIHVyYi5cbiIpOworCQlkZXZfZXJyKCZpbnRmLT5kZXYsCisJCQkidW5hYmxlIHRvIHVwbG9hZCBmcGdhIGZpcm13YXJlOiBlbmQgdXJiLlxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCXJldHVybiAwOwpAQCAtMzM4LDcgKzM0Miw3IEBACiAvKiBjaGVjaywgaWYgdGhlIGZpcm13YXJlIHZlcnNpb24gdGhlIGRldmljZXMgaGFzIGN1cnJlbnRseSBsb2FkZWQKICAqIGlzIGtub3duIGJ5IHRoaXMgZHJpdmVyLiAndmVyc2lvbicgbmVlZHMgdG8gaGF2ZSA0IGJ5dGVzIHZlcnNpb24KICAqIGluZm8gZGF0YS4gKi8KLXN0YXRpYyBpbnQgdXNiNmZpcmVfZndfY2hlY2sodTggKnZlcnNpb24pCitzdGF0aWMgaW50IHVzYjZmaXJlX2Z3X2NoZWNrKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCB1OCAqdmVyc2lvbikKIHsKIAlpbnQgaTsKIApAQCAtMzQ2LDcgKzM1MCw3IEBACiAJCWlmICghbWVtY21wKHZlcnNpb24sIGtub3duX2Z3X3ZlcnNpb25zICsgaSwgMikpCiAJCQlyZXR1cm4gMDsKIAotCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJpbnZhbGlkIGZpbXdhcmUgdmVyc2lvbiBpbiBkZXZpY2U6ICU0cGguICIKKwlkZXZfZXJyKCZpbnRmLT5kZXYsICJpbnZhbGlkIGZpbXdhcmUgdmVyc2lvbiBpbiBkZXZpY2U6ICU0cGguICIKIAkJCSJwbGVhc2UgcmVjb25uZWN0IHRvIHBvd2VyLiBpZiB0aGlzIGZhaWx1cmUgIgogCQkJInN0aWxsIGhhcHBlbnMsIGNoZWNrIHlvdXIgZmlybXdhcmUgaW5zdGFsbGF0aW9uLiIsCiAJCQl2ZXJzaW9uKTsKQEAgLTM2NCwxNiArMzY4LDE2IEBACiAKIAlyZXQgPSB1c2I2ZmlyZV9md19lenVzYl9yZWFkKGRldmljZSwgMSwgMCwgYnVmZmVyLCA4KTsKIAlpZiAocmV0IDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAidW5hYmxlIHRvIHJlY2VpdmUgZGV2aWNlICIKLQkJCQkiZmlybXdhcmUgc3RhdGUuXG4iKTsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJInVuYWJsZSB0byByZWNlaXZlIGRldmljZSBmaXJtd2FyZSBzdGF0ZS5cbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlpZiAoYnVmZmVyWzBdICE9IDB4ZWIgfHwgYnVmZmVyWzFdICE9IDB4YWEgfHwgYnVmZmVyWzJdICE9IDB4NTUpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggInVua25vd24gZGV2aWNlIGZpcm13YXJlIHN0YXRlICIKLQkJCQkicmVjZWl2ZWQgZnJvbSBkZXZpY2U6ICIpOworCQlkZXZfZXJyKCZpbnRmLT5kZXYsCisJCQkidW5rbm93biBkZXZpY2UgZmlybXdhcmUgc3RhdGUgcmVjZWl2ZWQgZnJvbSBkZXZpY2U6Iik7CiAJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQlzbmRfcHJpbnRrKCIlMDJ4ICIsIGJ1ZmZlcltpXSk7Ci0JCXNuZF9wcmludGsoIlxuIik7CisJCQlwcmludGsoS0VSTl9DT05UICIlMDJ4ICIsIGJ1ZmZlcltpXSk7CisJCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAkvKiBkbyB3ZSBuZWVkIGZwZ2EgbG9hZGVyIGV6dXNiIGZpcm13YXJlPyAqLwpAQCAtMzg2LDcgKzM5MCw3IEBACiAJfQogCS8qIGRvIHdlIG5lZWQgZnBnYSBmaXJtd2FyZSBhbmQgYXBwbGljYXRpb24gZXp1c2IgZmlybXdhcmU/ICovCiAJZWxzZSBpZiAoYnVmZmVyWzNdID09IDB4MDIpIHsKLQkJcmV0ID0gdXNiNmZpcmVfZndfY2hlY2soYnVmZmVyICsgNCk7CisJCXJldCA9IHVzYjZmaXJlX2Z3X2NoZWNrKGludGYsIGJ1ZmZlciArIDQpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJCXJldCA9IHVzYjZmaXJlX2Z3X2ZwZ2FfdXBsb2FkKGludGYsICI2ZmlyZS9kbXg2ZmlyZWNmLmJpbiIpOwpAQCAtNDAyLDE0ICs0MDYsMTQgQEAKIAl9CiAJLyogYWxsIGZ3IGxvYWRlZD8gKi8KIAllbHNlIGlmIChidWZmZXJbM10gPT0gMHgwMykKLQkJcmV0dXJuIHVzYjZmaXJlX2Z3X2NoZWNrKGJ1ZmZlciArIDQpOworCQlyZXR1cm4gdXNiNmZpcmVfZndfY2hlY2soaW50ZiwgYnVmZmVyICsgNCk7CiAJLyogdW5rbm93biBkYXRhPyAqLwogCWVsc2UgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAidW5rbm93biBkZXZpY2UgZmlybXdhcmUgc3RhdGUgIgotCQkJCSJyZWNlaXZlZCBmcm9tIGRldmljZTogIik7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJ1bmtub3duIGRldmljZSBmaXJtd2FyZSBzdGF0ZSByZWNlaXZlZCBmcm9tIGRldmljZTogIik7CiAJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQlzbmRfcHJpbnRrKCIlMDJ4ICIsIGJ1ZmZlcltpXSk7Ci0JCXNuZF9wcmludGsoIlxuIik7CisJCQlwcmludGsoS0VSTl9DT05UICIlMDJ4ICIsIGJ1ZmZlcltpXSk7CisJCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi82ZmlyZS9taWRpLmMgYi9zb3VuZC91c2IvNmZpcmUvbWlkaS5jCmluZGV4IGYzZGQ3MjYuLjNkNDEwOTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi82ZmlyZS9taWRpLmMKKysrIGIvc291bmQvdXNiLzZmaXJlL21pZGkuYwpAQCAtNDEsOCArNDEsOSBAQAogCiAJCQlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQkJaWYgKHJldCA8IDApCi0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggIm1pZGkgb3V0IHVyYiAiCi0JCQkJCQkic3VibWl0IGZhaWxlZDogJWRcbiIsIHJldCk7CisJCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKKwkJCQkJIm1pZGkgb3V0IHVyYiBzdWJtaXQgZmFpbGVkOiAlZFxuIiwKKwkJCQkJcmV0KTsKIAkJfSBlbHNlIC8qIG5vIG1vcmUgZGF0YSB0byB0cmFuc21pdCAqLwogCQkJcnQtPm91dCA9IE5VTEw7CiAJfQpAQCAtOTQsOCArOTUsOSBAQAogCiAJCQlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQkJaWYgKHJldCA8IDApCi0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggIm1pZGkgb3V0IHVyYiAiCi0JCQkJCQkic3VibWl0IGZhaWxlZDogJWRcbiIsIHJldCk7CisJCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKKwkJCQkJIm1pZGkgb3V0IHVyYiBzdWJtaXQgZmFpbGVkOiAlZFxuIiwKKwkJCQkJcmV0KTsKIAkJCWVsc2UKIAkJCQlydC0+b3V0ID0gYWxzYV9zdWI7CiAJCX0KQEAgLTE4MSw3ICsxODMsNyBAQAogCWlmIChyZXQgPCAwKSB7CiAJCWtmcmVlKHJ0LT5vdXRfYnVmZmVyKTsKIAkJa2ZyZWUocnQpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAidW5hYmxlIHRvIGNyZWF0ZSBtaWRpLlxuIik7CisJCWRldl9lcnIoJmNoaXAtPmRldi0+ZGV2LCAidW5hYmxlIHRvIGNyZWF0ZSBtaWRpLlxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCXJ0LT5pbnN0YW5jZS0+cHJpdmF0ZV9kYXRhID0gcnQ7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvNmZpcmUvcGNtLmMgYi9zb3VuZC91c2IvNmZpcmUvcGNtLmMKaW5kZXggYjVlYjk3Zi4uYmE0MDQ4OSAxMDA2NDQKLS0tIGEvc291bmQvdXNiLzZmaXJlL3BjbS5jCisrKyBiL3NvdW5kL3VzYi82ZmlyZS9wY20uYwpAQCAtNzksMzIgKzc5LDM1IEBACiAJY3RybF9ydC0+dXNiX3N0cmVhbWluZyA9IGZhbHNlOwogCXJldCA9IGN0cmxfcnQtPnVwZGF0ZV9zdHJlYW1pbmcoY3RybF9ydCk7CiAJaWYgKHJldCA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggImVycm9yIHN0b3BwaW5nIHN0cmVhbWluZyB3aGlsZSAiCi0JCQkJInNldHRpbmcgc2FtcGxlcmF0ZSAlZC5cbiIsIHJhdGVzW3J0LT5yYXRlXSk7CisJCWRldl9lcnIoJnJ0LT5jaGlwLT5kZXYtPmRldiwKKwkJCSJlcnJvciBzdG9wcGluZyBzdHJlYW1pbmcgd2hpbGUgc2V0dGluZyBzYW1wbGVyYXRlICVkLlxuIiwKKwkJCXJhdGVzW3J0LT5yYXRlXSk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0ID0gY3RybF9ydC0+c2V0X3JhdGUoY3RybF9ydCwgcnQtPnJhdGUpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJlcnJvciBzZXR0aW5nIHNhbXBsZXJhdGUgJWQuXG4iLAotCQkJCXJhdGVzW3J0LT5yYXRlXSk7CisJCWRldl9lcnIoJnJ0LT5jaGlwLT5kZXYtPmRldiwKKwkJCSJlcnJvciBzZXR0aW5nIHNhbXBsZXJhdGUgJWQuXG4iLAorCQkJcmF0ZXNbcnQtPnJhdGVdKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXQgPSBjdHJsX3J0LT5zZXRfY2hhbm5lbHMoY3RybF9ydCwgT1VUX05fQ0hBTk5FTFMsIElOX05fQ0hBTk5FTFMsCiAJCQlmYWxzZSwgZmFsc2UpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJlcnJvciBpbml0aWFsaXppbmcgY2hhbm5lbHMgIgotCQkJCSJ3aGlsZSBzZXR0aW5nIHNhbXBsZXJhdGUgJWQuXG4iLAotCQkJCXJhdGVzW3J0LT5yYXRlXSk7CisJCWRldl9lcnIoJnJ0LT5jaGlwLT5kZXYtPmRldiwKKwkJCSJlcnJvciBpbml0aWFsaXppbmcgY2hhbm5lbHMgd2hpbGUgc2V0dGluZyBzYW1wbGVyYXRlICVkLlxuIiwKKwkJCXJhdGVzW3J0LT5yYXRlXSk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJY3RybF9ydC0+dXNiX3N0cmVhbWluZyA9IHRydWU7CiAJcmV0ID0gY3RybF9ydC0+dXBkYXRlX3N0cmVhbWluZyhjdHJsX3J0KTsKIAlpZiAocmV0IDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiZXJyb3Igc3RhcnRpbmcgc3RyZWFtaW5nIHdoaWxlICIKLQkJCQkic2V0dGluZyBzYW1wbGVyYXRlICVkLlxuIiwgcmF0ZXNbcnQtPnJhdGVdKTsKKwkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LAorCQkJImVycm9yIHN0YXJ0aW5nIHN0cmVhbWluZyB3aGlsZSBzZXR0aW5nIHNhbXBsZXJhdGUgJWQuXG4iLAorCQkJcmF0ZXNbcnQtPnJhdGVdKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTEyNCw3ICsxMjcsNyBAQAogCQlyZXR1cm4gJnJ0LT5wbGF5YmFjazsKIAllbHNlIGlmIChhbHNhX3N1Yi0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKIAkJcmV0dXJuICZydC0+Y2FwdHVyZTsKLQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiZXJyb3IgZ2V0dGluZyBwY20gc3Vic3RyZWFtIHNsb3QuXG4iKTsKKwlkZXZfZXJyKCZydC0+Y2hpcC0+ZGV2LT5kZXYsICJlcnJvciBnZXR0aW5nIHBjbSBzdWJzdHJlYW0gc2xvdC5cbiIpOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0yNTcsNyArMjYwLDcgQEAKIAllbHNlIGlmIChhbHNhX3J0LT5mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEUpCiAJCWRlc3QgPSAodTMyICopICh1cmItPmJ1ZmZlcik7CiAJZWxzZSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJVbmtub3duIHNhbXBsZSBmb3JtYXQuIik7CisJCWRldl9lcnIoJnJ0LT5jaGlwLT5kZXYtPmRldiwgIlVua25vd24gc2FtcGxlIGZvcm1hdC4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzA3LDggKzMxMCw4IEBACiAJCX0KIAogCWlmIChydC0+c3RyZWFtX3N0YXRlID09IFNUUkVBTV9ESVNBQkxFRCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiaW50ZXJuYWwgZXJyb3I6ICIKLQkJCQkic3RyZWFtIGRpc2FibGVkIGluIGluLXVyYiBoYW5kbGVyLlxuIik7CisJCWRldl9lcnIoJnJ0LT5jaGlwLT5kZXYtPmRldiwKKwkJCSJpbnRlcm5hbCBlcnJvcjogc3RyZWFtIGRpc2FibGVkIGluIGluLXVyYiBoYW5kbGVyLlxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQxMCw3ICs0MTMsNyBAQAogCiAJaWYgKCFzdWIpIHsKIAkJbXV0ZXhfdW5sb2NrKCZydC0+c3RyZWFtX211dGV4KTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggImludmFsaWQgc3RyZWFtIHR5cGUuXG4iKTsKKwkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LCAiaW52YWxpZCBzdHJlYW0gdHlwZS5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTQ4MSw4ICs0ODQsOSBAQAogCQkJCWJyZWFrOwogCQlpZiAocnQtPnJhdGUgPT0gQVJSQVlfU0laRShyYXRlcykpIHsKIAkJCW11dGV4X3VubG9jaygmcnQtPnN0cmVhbV9tdXRleCk7Ci0JCQlzbmRfcHJpbnRrKCJpbnZhbGlkIHJhdGUgJWQgaW4gcHJlcGFyZS5cbiIsCi0JCQkJCWFsc2FfcnQtPnJhdGUpOworCQkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LAorCQkJCSJpbnZhbGlkIHJhdGUgJWQgaW4gcHJlcGFyZS5cbiIsCisJCQkJYWxzYV9ydC0+cmF0ZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC00OTQsOCArNDk4LDggQEAKIAkJcmV0ID0gdXNiNmZpcmVfcGNtX3N0cmVhbV9zdGFydChydCk7CiAJCWlmIChyZXQpIHsKIAkJCW11dGV4X3VubG9jaygmcnQtPnN0cmVhbV9tdXRleCk7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAotCQkJCQkiY291bGQgbm90IHN0YXJ0IHBjbSBzdHJlYW0uXG4iKTsKKwkJCWRldl9lcnIoJnJ0LT5jaGlwLT5kZXYtPmRldiwKKwkJCQkiY291bGQgbm90IHN0YXJ0IHBjbSBzdHJlYW0uXG4iKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9CkBAIC02NTAsNyArNjU0LDcgQEAKIAlpZiAocmV0IDwgMCkgewogCQl1c2I2ZmlyZV9wY21fYnVmZmVyc19kZXN0cm95KHJ0KTsKIAkJa2ZyZWUocnQpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiY2Fubm90IGNyZWF0ZSBwY20gaW5zdGFuY2UuXG4iKTsKKwkJZGV2X2VycigmY2hpcC0+ZGV2LT5kZXYsICJjYW5ub3QgY3JlYXRlIHBjbSBpbnN0YW5jZS5cbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNjYyLDggKzY2Niw4IEBACiAJaWYgKHJldCkgewogCQl1c2I2ZmlyZV9wY21fYnVmZmVyc19kZXN0cm95KHJ0KTsKIAkJa2ZyZWUocnQpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAotCQkJCSJlcnJvciBwcmVhbGxvY2F0aW5nIHBjbSBidWZmZXJzLlxuIik7CisJCWRldl9lcnIoJmNoaXAtPmRldi0+ZGV2LAorCQkJImVycm9yIHByZWFsbG9jYXRpbmcgcGNtIGJ1ZmZlcnMuXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJcnQtPmluc3RhbmNlID0gcGNtOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2NhaWFxL2RldmljZS5jIGIvc291bmQvdXNiL2NhaWFxL2RldmljZS5jCmluZGV4IGJjNTVmNzAuLmI4NzFiYTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9jYWlhcS9kZXZpY2UuYworKysgYi9zb3VuZC91c2IvY2FpYXEvZGV2aWNlLmMKQEAgLTQxOCw4ICs0MTgsOSBAQAogCWlmIChkZXZudW0gPj0gU05EUlZfQ0FSRFMpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldm51bV0sIGlkW2Rldm51bV0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfdXNiX2NhaWFxZGV2KSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmaW50Zi0+ZGV2LAorCQkJICAgaW5kZXhbZGV2bnVtXSwgaWRbZGV2bnVtXSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNuZF91c2JfY2FpYXFkZXYpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTQyOSw3ICs0MzAsNiBAQAogCWNkZXYtPmNoaXAudXNiX2lkID0gVVNCX0lEKGxlMTZfdG9fY3B1KHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAogCQkJCSAgbGUxNl90b19jcHUodXNiX2Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKIAlzcGluX2xvY2tfaW5pdCgmY2Rldi0+c3BpbmxvY2spOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmludGYtPmRldik7CiAKIAkqY2FyZHAgPSBjYXJkOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2NhcmQuYyBiL3NvdW5kL3VzYi9jYXJkLmMKaW5kZXggZDk3OTA1MC4uODkzZDVhMSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2NhcmQuYworKysgYi9zb3VuZC91c2IvY2FyZC5jCkBAIC0xMzksOCArMTM5LDggQEAKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UgPSB1c2JfaWZudW1fdG9faWYoZGV2LCBpbnRlcmZhY2UpOwogCiAJaWYgKCFpZmFjZSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IGRvZXMgbm90IGV4aXN0XG4iLAotCQkJICAgZGV2LT5kZXZudW0sIGN0cmxpZiwgaW50ZXJmYWNlKTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICIldTolZCA6IGRvZXMgbm90IGV4aXN0XG4iLAorCQkJY3RybGlmLCBpbnRlcmZhY2UpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE2NSw4ICsxNjUsOCBAQAogCX0KIAogCWlmICh1c2JfaW50ZXJmYWNlX2NsYWltZWQoaWZhY2UpKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiJWQ6JWQ6JWQ6IHNraXBwaW5nLCBhbHJlYWR5IGNsYWltZWRcbiIsCi0JCQkJCQlkZXYtPmRldm51bSwgY3RybGlmLCBpbnRlcmZhY2UpOworCQlkZXZfZGJnKCZkZXYtPmRldiwgIiVkOiVkOiBza2lwcGluZywgYWxyZWFkeSBjbGFpbWVkXG4iLAorCQkJY3RybGlmLCBpbnRlcmZhY2UpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE3Niw4ICsxNzYsOSBAQAogCQlpbnQgZXJyID0gc25kX3VzYm1pZGlfY3JlYXRlKGNoaXAtPmNhcmQsIGlmYWNlLAogCQkJCQkgICAgICZjaGlwLT5taWRpX2xpc3QsIE5VTEwpOwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JXU6JWQ6IGNhbm5vdCBjcmVhdGUgc2VxdWVuY2VyIGRldmljZVxuIiwKLQkJCQkJCWRldi0+ZGV2bnVtLCBjdHJsaWYsIGludGVyZmFjZSk7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCQkiJXU6JWQ6IGNhbm5vdCBjcmVhdGUgc2VxdWVuY2VyIGRldmljZVxuIiwKKwkJCQljdHJsaWYsIGludGVyZmFjZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQl1c2JfZHJpdmVyX2NsYWltX2ludGVyZmFjZSgmdXNiX2F1ZGlvX2RyaXZlciwgaWZhY2UsICh2b2lkICopLTFMKTsKQEAgLTE4OCwxNCArMTg5LDE1IEBACiAJaWYgKChhbHRzZC0+YkludGVyZmFjZUNsYXNzICE9IFVTQl9DTEFTU19BVURJTyAmJgogCSAgICAgYWx0c2QtPmJJbnRlcmZhY2VDbGFzcyAhPSBVU0JfQ0xBU1NfVkVORE9SX1NQRUMpIHx8CiAJICAgIGFsdHNkLT5iSW50ZXJmYWNlU3ViQ2xhc3MgIT0gVVNCX1NVQkNMQVNTX0FVRElPU1RSRUFNSU5HKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICIlZDoldTolZDogc2tpcHBpbmcgbm9uLXN1cHBvcnRlZCBpbnRlcmZhY2UgJWRcbiIsCi0JCQkJCWRldi0+ZGV2bnVtLCBjdHJsaWYsIGludGVyZmFjZSwgYWx0c2QtPmJJbnRlcmZhY2VDbGFzcyk7CisJCWRldl9kYmcoJmRldi0+ZGV2LAorCQkJIiV1OiVkOiBza2lwcGluZyBub24tc3VwcG9ydGVkIGludGVyZmFjZSAlZFxuIiwKKwkJCWN0cmxpZiwgaW50ZXJmYWNlLCBhbHRzZC0+YkludGVyZmFjZUNsYXNzKTsKIAkJLyogc2tpcCBub24tc3VwcG9ydGVkIGNsYXNzZXMgKi8KIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKHNuZF91c2JfZ2V0X3NwZWVkKGRldikgPT0gVVNCX1NQRUVEX0xPVykgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJsb3cgc3BlZWQgYXVkaW8gc3RyZWFtaW5nIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlkZXZfZXJyKCZkZXYtPmRldiwgImxvdyBzcGVlZCBhdWRpbyBzdHJlYW1pbmcgbm90IHN1cHBvcnRlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjI4LDI2ICsyMzAsMjcgQEAKIAlwcm90b2NvbCA9IGFsdHNkLT5iSW50ZXJmYWNlUHJvdG9jb2w7CiAKIAlpZiAoIWNvbnRyb2xfaGVhZGVyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBmaW5kIFVBQ19IRUFERVJcbiIpOworCQlkZXZfZXJyKCZkZXYtPmRldiwgImNhbm5vdCBmaW5kIFVBQ19IRUFERVJcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlzd2l0Y2ggKHByb3RvY29sKSB7CiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ZGQoS0VSTl9XQVJOSU5HICJ1bmtub3duIGludGVyZmFjZSBwcm90b2NvbCAlIzAyeCwgYXNzdW1pbmcgdjFcbiIsCi0JCQkgICAgcHJvdG9jb2wpOworCQlkZXZfd2FybigmZGV2LT5kZXYsCisJCQkgInVua25vd24gaW50ZXJmYWNlIHByb3RvY29sICUjMDJ4LCBhc3N1bWluZyB2MVxuIiwKKwkJCSBwcm90b2NvbCk7CiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCiAJY2FzZSBVQUNfVkVSU0lPTl8xOiB7CiAJCXN0cnVjdCB1YWMxX2FjX2hlYWRlcl9kZXNjcmlwdG9yICpoMSA9IGNvbnRyb2xfaGVhZGVyOwogCiAJCWlmICghaDEtPmJJbkNvbGxlY3Rpb24pIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJza2lwcGluZyBlbXB0eSBhdWRpbyBpbnRlcmZhY2UgKHYxKVxuIik7CisJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJza2lwcGluZyBlbXB0eSBhdWRpbyBpbnRlcmZhY2UgKHYxKVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCiAJCWlmIChoMS0+Ykxlbmd0aCA8IHNpemVvZigqaDEpICsgaDEtPmJJbkNvbGxlY3Rpb24pIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgVUFDX0hFQURFUiAodjEpXG4iKTsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiaW52YWxpZCBVQUNfSEVBREVSICh2MSlcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIApAQCAtMjc3LDcgKzI4MCw3IEBACiAJCX0KIAogCQlpZiAoIWFzc29jKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBdWRpbyBjbGFzcyB2MiBpbnRlcmZhY2VzIG5lZWQgYW4gaW50ZXJmYWNlIGFzc29jaWF0aW9uXG4iKTsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiQXVkaW8gY2xhc3MgdjIgaW50ZXJmYWNlcyBuZWVkIGFuIGludGVyZmFjZSBhc3NvY2lhdGlvblxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC0zMjgsNyArMzMxLDggQEAKIC8qCiAgKiBjcmVhdGUgYSBjaGlwIGluc3RhbmNlIGFuZCBzZXQgaXRzIG5hbWVzLgogICovCi1zdGF0aWMgaW50IHNuZF91c2JfYXVkaW9fY3JlYXRlKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBpZHgsCitzdGF0aWMgaW50IHNuZF91c2JfYXVkaW9fY3JlYXRlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBpZHgsCiAJCQkJY29uc3Qgc3RydWN0IHNuZF91c2JfYXVkaW9fcXVpcmsgKnF1aXJrLAogCQkJCXN0cnVjdCBzbmRfdXNiX2F1ZGlvICoqcmNoaXApCiB7CkBAIC0zNTAsMTMgKzM1NCwxNCBAQAogCWNhc2UgVVNCX1NQRUVEX1NVUEVSOgogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmtub3duIGRldmljZSBzcGVlZCAlZFxuIiwgc25kX3VzYl9nZXRfc3BlZWQoZGV2KSk7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAidW5rbm93biBkZXZpY2Ugc3BlZWQgJWRcbiIsIHNuZF91c2JfZ2V0X3NwZWVkKGRldikpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtpZHhdLCBpZFtpZHhdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmaW50Zi0+ZGV2LCBpbmRleFtpZHhdLCBpZFtpZHhdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgY3JlYXRlIGNhcmQgaW5zdGFuY2UgJWRcbiIsIGlkeCk7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiY2Fubm90IGNyZWF0ZSBjYXJkIGluc3RhbmNlICVkXG4iLCBpZHgpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNDk3LDcgKzUwMiw3IEBACiAJZm9yIChpID0gMDsgaSA8IFNORFJWX0NBUkRTOyBpKyspIHsKIAkJaWYgKHVzYl9jaGlwW2ldICYmIHVzYl9jaGlwW2ldLT5kZXYgPT0gZGV2KSB7CiAJCQlpZiAodXNiX2NoaXBbaV0tPnNodXRkb3duKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiVVNCIGRldmljZSBpcyBpbiB0aGUgc2h1dGRvd24gc3RhdGUsIGNhbm5vdCBjcmVhdGUgYSBjYXJkIGluc3RhbmNlXG4iKTsKKwkJCQlkZXZfZXJyKCZkZXYtPmRldiwgIlVTQiBkZXZpY2UgaXMgaW4gdGhlIHNodXRkb3duIHN0YXRlLCBjYW5ub3QgY3JlYXRlIGEgY2FyZCBpbnN0YW5jZVxuIik7CiAJCQkJZ290byBfX2Vycm9yOwogCQkJfQogCQkJY2hpcCA9IHVzYl9jaGlwW2ldOwpAQCAtNTEzLDE1ICs1MTgsMTUgQEAKIAkJCWlmIChlbmFibGVbaV0gJiYgISB1c2JfY2hpcFtpXSAmJgogCQkJICAgICh2aWRbaV0gPT0gLTEgfHwgdmlkW2ldID09IFVTQl9JRF9WRU5ET1IoaWQpKSAmJgogCQkJICAgIChwaWRbaV0gPT0gLTEgfHwgcGlkW2ldID09IFVTQl9JRF9QUk9EVUNUKGlkKSkpIHsKLQkJCQlpZiAoc25kX3VzYl9hdWRpb19jcmVhdGUoZGV2LCBpLCBxdWlyaywgJmNoaXApIDwgMCkgeworCQkJCWlmIChzbmRfdXNiX2F1ZGlvX2NyZWF0ZShpbnRmLCBkZXYsIGksIHF1aXJrLAorCQkJCQkJCSAmY2hpcCkgPCAwKSB7CiAJCQkJCWdvdG8gX19lcnJvcjsKIAkJCQl9Ci0JCQkJc25kX2NhcmRfc2V0X2RldihjaGlwLT5jYXJkLCAmaW50Zi0+ZGV2KTsKIAkJCQljaGlwLT5wbV9pbnRmID0gaW50ZjsKIAkJCQlicmVhazsKIAkJCX0KIAkJaWYgKCFjaGlwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIm5vIGF2YWlsYWJsZSB1c2IgYXVkaW8gZGV2aWNlXG4iKTsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAibm8gYXZhaWxhYmxlIHVzYiBhdWRpbyBkZXZpY2VcbiIpOwogCQkJZ290byBfX2Vycm9yOwogCQl9CiAJfQpAQCAtNjkxLDEyICs2OTYsMTIgQEAKIAl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1peGVyLCAmY2hpcC0+bWl4ZXJfbGlzdCwgbGlzdCkKLQkJc25kX3VzYl9taXhlcl9pbmFjdGl2YXRlKG1peGVyKTsKKwkJc25kX3VzYl9taXhlcl9zdXNwZW5kKG1peGVyKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVzYl9hdWRpb19yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCitzdGF0aWMgaW50IF9fdXNiX2F1ZGlvX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgYm9vbCByZXNldF9yZXN1bWUpCiB7CiAJc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcjsKQEAgLTcxMSw3ICs3MTYsNyBAQAogCSAqIHdlIGp1c3Qgbm90aWZ5IGFuZCByZXN0YXJ0IHRoZSBtaXhlcnMKIAkgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1peGVyLCAmY2hpcC0+bWl4ZXJfbGlzdCwgbGlzdCkgewotCQllcnIgPSBzbmRfdXNiX21peGVyX2FjdGl2YXRlKG1peGVyKTsKKwkJZXJyID0gc25kX3VzYl9taXhlcl9yZXN1bWUobWl4ZXIsIHJlc2V0X3Jlc3VtZSk7CiAJCWlmIChlcnIgPCAwKQogCQkJZ290byBlcnJfb3V0OwogCX0KQEAgLTcyMyw5ICs3MjgsMjAgQEAKIGVycl9vdXQ6CiAJcmV0dXJuIGVycjsKIH0KKworc3RhdGljIGludCB1c2JfYXVkaW9fcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXJldHVybiBfX3VzYl9hdWRpb19yZXN1bWUoaW50ZiwgZmFsc2UpOworfQorCitzdGF0aWMgaW50IHVzYl9hdWRpb19yZXNldF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJcmV0dXJuIF9fdXNiX2F1ZGlvX3Jlc3VtZShpbnRmLCB0cnVlKTsKK30KICNlbHNlCiAjZGVmaW5lIHVzYl9hdWRpb19zdXNwZW5kCU5VTEwKICNkZWZpbmUgdXNiX2F1ZGlvX3Jlc3VtZQlOVUxMCisjZGVmaW5lIHVzYl9hdWRpb19yZXNldF9yZXN1bWUJTlVMTAogI2VuZGlmCQkvKiBDT05GSUdfUE0gKi8KIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYl9hdWRpb19pZHMgW10gPSB7CkBAIC03NDcsNiArNzYzLDcgQEAKIAkuZGlzY29ubmVjdCA9CXVzYl9hdWRpb19kaXNjb25uZWN0LAogCS5zdXNwZW5kID0JdXNiX2F1ZGlvX3N1c3BlbmQsCiAJLnJlc3VtZSA9CXVzYl9hdWRpb19yZXN1bWUsCisJLnJlc2V0X3Jlc3VtZSA9CXVzYl9hdWRpb19yZXNldF9yZXN1bWUsCiAJLmlkX3RhYmxlID0JdXNiX2F1ZGlvX2lkcywKIAkuc3VwcG9ydHNfYXV0b3N1c3BlbmQgPSAxLAogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9jbG9jay5jIGIvc291bmQvdXNiL2Nsb2NrLmMKaW5kZXggODZmODBjNi4uMDNmZWQ2NiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2Nsb2NrLmMKKysrIGIvc291bmQvdXNiL2Nsb2NrLmMKQEAgLTExNSw5ICsxMTUsOSBAQAogCQlyZXR1cm4gcmV0OwogCiAJaWYgKHJldCAhPSBzaXplb2YocGluKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSCi0JCQkidXNiLWF1ZGlvOiVkOiBzZXR0aW5nIHNlbGVjdG9yIChpZCAlZCkgdW5leHBlY3RlZCBsZW5ndGggJWRcbiIsCi0JCQljaGlwLT5kZXYtPmRldm51bSwgc2VsZWN0b3JfaWQsIHJldCk7CisJCXVzYl9hdWRpb19lcnIoY2hpcCwKKwkJCSJzZXR0aW5nIHNlbGVjdG9yIChpZCAlZCkgdW5leHBlY3RlZCBsZW5ndGggJWRcbiIsCisJCQlzZWxlY3Rvcl9pZCwgcmV0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMjYsOSArMTI2LDkgQEAKIAkJcmV0dXJuIHJldDsKIAogCWlmIChyZXQgIT0gcGluKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIKLQkJCSJ1c2ItYXVkaW86JWQ6IHNldHRpbmcgc2VsZWN0b3IgKGlkICVkKSB0byAleCBmYWlsZWQgKGN1cnJlbnQ6ICVkKVxuIiwKLQkJCWNoaXAtPmRldi0+ZGV2bnVtLCBzZWxlY3Rvcl9pZCwgcGluLCByZXQpOworCQl1c2JfYXVkaW9fZXJyKGNoaXAsCisJCQkic2V0dGluZyBzZWxlY3RvciAoaWQgJWQpIHRvICV4IGZhaWxlZCAoY3VycmVudDogJWQpXG4iLAorCQkJc2VsZWN0b3JfaWQsIHBpbiwgcmV0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNTgsNyArMTU4LDggQEAKIAkJCSAgICAgICZkYXRhLCBzaXplb2YoZGF0YSkpOwogCiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIiVzKCk6IGNhbm5vdCBnZXQgY2xvY2sgdmFsaWRpdHkgZm9yIGlkICVkXG4iLAorCQlkZXZfd2FybigmZGV2LT5kZXYsCisJCQkgIiVzKCk6IGNhbm5vdCBnZXQgY2xvY2sgdmFsaWRpdHkgZm9yIGlkICVkXG4iLAogCQkJICAgX19mdW5jX18sIHNvdXJjZV9pZCk7CiAJCXJldHVybiAwOwogCX0KQEAgLTE3Nyw5ICsxNzgsOSBAQAogCWVudGl0eV9pZCAmPSAweGZmOwogCiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoZW50aXR5X2lkLCB2aXNpdGVkKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORwotCQkJIiVzKCk6IHJlY3Vyc2l2ZSBjbG9jayB0b3BvbG9neSBkZXRlY3RlZCwgaWQgJWQuXG4iLAotCQkJX19mdW5jX18sIGVudGl0eV9pZCk7CisJCXVzYl9hdWRpb193YXJuKGNoaXAsCisJCQkgIiVzKCk6IHJlY3Vyc2l2ZSBjbG9jayB0b3BvbG9neSBkZXRlY3RlZCwgaWQgJWQuXG4iLAorCQkJIF9fZnVuY19fLCBlbnRpdHlfaWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE4OCw4ICsxODksOSBAQAogCWlmIChzb3VyY2UpIHsKIAkJZW50aXR5X2lkID0gc291cmNlLT5iQ2xvY2tJRDsKIAkJaWYgKHZhbGlkYXRlICYmICF1YWNfY2xvY2tfc291cmNlX2lzX3ZhbGlkKGNoaXAsIGVudGl0eV9pZCkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInVzYi1hdWRpbzolZDogY2xvY2sgc291cmNlICVkIGlzIG5vdCB2YWxpZCwgY2Fubm90IHVzZVxuIiwKLQkJCQkgICBjaGlwLT5kZXYtPmRldm51bSwgZW50aXR5X2lkKTsKKwkJCXVzYl9hdWRpb19lcnIoY2hpcCwKKwkJCQkiY2xvY2sgc291cmNlICVkIGlzIG5vdCB2YWxpZCwgY2Fubm90IHVzZVxuIiwKKwkJCQllbnRpdHlfaWQpOwogCQkJcmV0dXJuIC1FTlhJTzsKIAkJfQogCQlyZXR1cm4gZW50aXR5X2lkOwpAQCAtMjA4LDcgKzIxMCw3IEBACiAJCS8qIFNlbGVjdG9yIHZhbHVlcyBhcmUgb25lLWJhc2VkICovCiAKIAkJaWYgKHJldCA+IHNlbGVjdG9yLT5iTnJJblBpbnMgfHwgcmV0IDwgMSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUgorCQkJdXNiX2F1ZGlvX2VycihjaGlwLAogCQkJCSIlcygpOiBzZWxlY3RvciByZXBvcnRlZCBpbGxlZ2FsIHZhbHVlLCBpZCAlZCwgcmV0ICVkXG4iLAogCQkJCV9fZnVuY19fLCBzZWxlY3Rvci0+YkNsb2NrSUQsIHJldCk7CiAKQEAgLTIzNyw5ICsyMzksOSBAQAogCQkJaWYgKGVyciA8IDApCiAJCQkJY29udGludWU7CiAKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPCi0JCQkJInVzYi1hdWRpbzolZDogZm91bmQgYW5kIHNlbGVjdGVkIHZhbGlkIGNsb2NrIHNvdXJjZSAlZFxuIiwKLQkJCQljaGlwLT5kZXYtPmRldm51bSwgcmV0KTsKKwkJCXVzYl9hdWRpb19pbmZvKGNoaXAsCisJCQkJICJmb3VuZCBhbmQgc2VsZWN0ZWQgdmFsaWQgY2xvY2sgc291cmNlICVkXG4iLAorCQkJCSByZXQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCkBAIC0yOTYsOCArMjk4LDggQEAKIAkJCQkgICBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9FTkRQT0lOVCB8IFVTQl9ESVJfT1VULAogCQkJCSAgIFVBQ19FUF9DU19BVFRSX1NBTVBMRV9SQVRFIDw8IDgsIGVwLAogCQkJCSAgIGRhdGEsIHNpemVvZihkYXRhKSkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDolZDolZDogY2Fubm90IHNldCBmcmVxICVkIHRvIGVwICUjeFxuIiwKLQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZSwgZm10LT5hbHRzZXR0aW5nLCByYXRlLCBlcCk7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiJWQ6JWQ6IGNhbm5vdCBzZXQgZnJlcSAlZCB0byBlcCAlI3hcbiIsCisJCQlpZmFjZSwgZm10LT5hbHRzZXR0aW5nLCByYXRlLCBlcCk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0zMDUsMTQgKzMwNywxNCBAQAogCQkJCSAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0VORFBPSU5UIHwgVVNCX0RJUl9JTiwKIAkJCQkgICBVQUNfRVBfQ1NfQVRUUl9TQU1QTEVfUkFURSA8PCA4LCBlcCwKIAkJCQkgICBkYXRhLCBzaXplb2YoZGF0YSkpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIiVkOiVkOiVkOiBjYW5ub3QgZ2V0IGZyZXEgYXQgZXAgJSN4XG4iLAotCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlLCBmbXQtPmFsdHNldHRpbmcsIGVwKTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICIlZDolZDogY2Fubm90IGdldCBmcmVxIGF0IGVwICUjeFxuIiwKKwkJCWlmYWNlLCBmbXQtPmFsdHNldHRpbmcsIGVwKTsKIAkJcmV0dXJuIDA7IC8qIHNvbWUgZGV2aWNlcyBkb24ndCBzdXBwb3J0IHJlYWRpbmcgKi8KIAl9CiAKIAljcmF0ZSA9IGRhdGFbMF0gfCAoZGF0YVsxXSA8PCA4KSB8IChkYXRhWzJdIDw8IDE2KTsKIAlpZiAoY3JhdGUgIT0gcmF0ZSkgewotCQlzbmRfcHJpbnRkKEtFUk5fV0FSTklORyAiY3VycmVudCByYXRlICVkIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBydW50aW1lIHJhdGUgJWRcbiIsIGNyYXRlLCByYXRlKTsKKwkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiY3VycmVudCByYXRlICVkIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBydW50aW1lIHJhdGUgJWRcbiIsIGNyYXRlLCByYXRlKTsKIAkJLy8gcnVudGltZS0+cmF0ZSA9IGNyYXRlOwogCX0KIApAQCAtMzMyLDggKzMzNCw4IEBACiAJCQkgICAgICBzbmRfdXNiX2N0cmxfaW50ZihjaGlwKSB8IChjbG9jayA8PCA4KSwKIAkJCSAgICAgICZkYXRhLCBzaXplb2YoZGF0YSkpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICIlZDolZDolZDogY2Fubm90IGdldCBmcmVxICh2Mik6IGVyciAlZFxuIiwKLQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZSwgYWx0c2V0dGluZywgZXJyKTsKKwkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiJWQ6JWQ6IGNhbm5vdCBnZXQgZnJlcSAodjIpOiBlcnIgJWRcbiIsCisJCQkgaWZhY2UsIGFsdHNldHRpbmcsIGVycik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMzY5LDggKzM3MSw5IEBACiAJCQkJICAgICAgc25kX3VzYl9jdHJsX2ludGYoY2hpcCkgfCAoY2xvY2sgPDwgOCksCiAJCQkJICAgICAgJmRhdGEsIHNpemVvZihkYXRhKSk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDolZDolZDogY2Fubm90IHNldCBmcmVxICVkICh2Mik6IGVyciAlZFxuIiwKLQkJCQkgICBkZXYtPmRldm51bSwgaWZhY2UsIGZtdC0+YWx0c2V0dGluZywgcmF0ZSwgZXJyKTsKKwkJCXVzYl9hdWRpb19lcnIoY2hpcCwKKwkJCQkiJWQ6JWQ6IGNhbm5vdCBzZXQgZnJlcSAlZCAodjIpOiBlcnIgJWRcbiIsCisJCQkJaWZhY2UsIGZtdC0+YWx0c2V0dGluZywgcmF0ZSwgZXJyKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIApAQCAtMzgxLDE0ICszODQsMTQgQEAKIAogCWlmIChjdXJfcmF0ZSAhPSByYXRlKSB7CiAJCWlmICghd3JpdGVhYmxlKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSAgICIlZDolZDolZDogZnJlcSBtaXNtYXRjaCAoUk8gY2xvY2spOiByZXEgJWQsIGNsb2NrIHJ1bnMgQCVkXG4iLAotCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZSwgZm10LT5hbHRzZXR0aW5nLCByYXRlLCBjdXJfcmF0ZSk7CisJCQl1c2JfYXVkaW9fd2FybihjaGlwLAorCQkJCSAiJWQ6JWQ6IGZyZXEgbWlzbWF0Y2ggKFJPIGNsb2NrKTogcmVxICVkLCBjbG9jayBydW5zIEAlZFxuIiwKKwkJCQkgaWZhY2UsIGZtdC0+YWx0c2V0dGluZywgcmF0ZSwgY3VyX3JhdGUpOwogCQkJcmV0dXJuIC1FTlhJTzsKIAkJfQotCQlzbmRfcHJpbnRkKEtFUk5fV0FSTklORwotCQkJICAgImN1cnJlbnQgcmF0ZSAlZCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgcnVudGltZSByYXRlICVkXG4iLAotCQkJICAgY3VyX3JhdGUsIHJhdGUpOworCQl1c2JfYXVkaW9fZGJnKGNoaXAsCisJCQkiY3VycmVudCByYXRlICVkIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBydW50aW1lIHJhdGUgJWRcbiIsCisJCQljdXJfcmF0ZSwgcmF0ZSk7CiAJfQogCiAJLyogU29tZSBkZXZpY2VzIGRvZXNuJ3QgcmVzcG9uZCB0byBzYW1wbGUgcmF0ZSBjaGFuZ2VzIHdoaWxlIHRoZQpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2VuZHBvaW50LmMgYi9zb3VuZC91c2IvZW5kcG9pbnQuYwppbmRleCA4M2FhYmVhMi4uZTcwYTg3ZSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2VuZHBvaW50LmMKKysrIGIvc291bmQvdXNiL2VuZHBvaW50LmMKQEAgLTMzMyw4ICszMzMsOSBAQAogCiAJCWVyciA9IHVzYl9zdWJtaXRfdXJiKGN0eC0+dXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKGVyciA8IDApCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gc3VibWl0IHVyYiAjJWQ6ICVkICh1cmIgJXApXG4iLAotCQkJCSAgIGN0eC0+aW5kZXgsIGVyciwgY3R4LT51cmIpOworCQkJdXNiX2F1ZGlvX2VycihlcC0+Y2hpcCwKKwkJCQkiVW5hYmxlIHRvIHN1Ym1pdCB1cmIgIyVkOiAlZCAodXJiICVwKVxuIiwKKwkJCQljdHgtPmluZGV4LCBlcnIsIGN0eC0+dXJiKTsKIAkJZWxzZQogCQkJc2V0X2JpdChjdHgtPmluZGV4LCAmZXAtPmFjdGl2ZV9tYXNrKTsKIAl9CkBAIC0zODcsNyArMzg4LDcgQEAKIAlpZiAoZXJyID09IDApCiAJCXJldHVybjsKIAotCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBzdWJtaXQgdXJiIChlcnIgPSAlZClcbiIsIGVycik7CisJdXNiX2F1ZGlvX2VycihlcC0+Y2hpcCwgImNhbm5vdCBzdWJtaXQgdXJiIChlcnIgPSAlZClcbiIsIGVycik7CiAJLy9zbmRfcGNtX3N0b3Aoc3Vic3RyZWFtLCBTTkRSVl9QQ01fU1RBVEVfWFJVTik7CiAKIGV4aXRfY2xlYXI6CkBAIC00MjYsMTMgKzQyNywxNCBAQAogCQlpZiAoZXAtPmVwX251bSA9PSBlcF9udW0gJiYKIAkJICAgIGVwLT5pZmFjZSA9PSBhbHRzLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIgJiYKIAkJICAgIGVwLT5hbHRzZXR0aW5nID09IGFsdHMtPmRlc2MuYkFsdGVybmF0ZVNldHRpbmcpIHsKLQkJCXNuZF9wcmludGRkKEtFUk5fREVCVUcgIlJlLXVzaW5nIEVQICV4IGluIGlmYWNlICVkLCVkIEAlcFxuIiwKKwkJCXVzYl9hdWRpb19kYmcoZXAtPmNoaXAsCisJCQkJICAgICAgIlJlLXVzaW5nIEVQICV4IGluIGlmYWNlICVkLCVkIEAlcFxuIiwKIAkJCQkJZXBfbnVtLCBlcC0+aWZhY2UsIGVwLT5hbHRzZXR0aW5nLCBlcCk7CiAJCQlnb3RvIF9fZXhpdF91bmxvY2s7CiAJCX0KIAl9CiAKLQlzbmRfcHJpbnRkZChLRVJOX0RFQlVHICJDcmVhdGluZyBuZXcgJXMgJXMgZW5kcG9pbnQgIyV4XG4iLAorCXVzYl9hdWRpb19kYmcoY2hpcCwgIkNyZWF0aW5nIG5ldyAlcyAlcyBlbmRwb2ludCAjJXhcbiIsCiAJCSAgICBpc19wbGF5YmFjayA/ICJwbGF5YmFjayIgOiAiY2FwdHVyZSIsCiAJCSAgICB0eXBlID09IFNORF9VU0JfRU5EUE9JTlRfVFlQRV9EQVRBID8gImRhdGEiIDogInN5bmMiLAogCQkgICAgZXBfbnVtKTsKQEAgLTQ5Niw4ICs0OTgsOSBAQAogCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF90aW1lKSk7CiAKIAlpZiAoYWxpdmUpCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgInRpbWVvdXQ6IHN0aWxsICVkIGFjdGl2ZSB1cmJzIG9uIEVQICMleFxuIiwKLQkJCQkJYWxpdmUsIGVwLT5lcF9udW0pOworCQl1c2JfYXVkaW9fZXJyKGVwLT5jaGlwLAorCQkJInRpbWVvdXQ6IHN0aWxsICVkIGFjdGl2ZSB1cmJzIG9uIEVQICMleFxuIiwKKwkJCWFsaXZlLCBlcC0+ZXBfbnVtKTsKIAljbGVhcl9iaXQoRVBfRkxBR19TVE9QUElORywgJmVwLT5mbGFncyk7CiAKIAlyZXR1cm4gMDsKQEAgLTc5NCw4ICs3OTcsOSBAQAogCWludCBlcnI7CiAKIAlpZiAoZXAtPnVzZV9jb3VudCAhPSAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJVbmFibGUgdG8gY2hhbmdlIGZvcm1hdCBvbiBlcCAjJXg6IGFscmVhZHkgaW4gdXNlXG4iLAotCQkJICAgZXAtPmVwX251bSk7CisJCXVzYl9hdWRpb193YXJuKGVwLT5jaGlwLAorCQkJICJVbmFibGUgdG8gY2hhbmdlIGZvcm1hdCBvbiBlcCAjJXg6IGFscmVhZHkgaW4gdXNlXG4iLAorCQkJIGVwLT5lcF9udW0pOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtODMwLDggKzgzNCw5IEBACiAJCWVyciA9IC1FSU5WQUw7CiAJfQogCi0Jc25kX3ByaW50ZGQoS0VSTl9ERUJVRyAiU2V0dGluZyBwYXJhbXMgZm9yIGVwICMleCAodHlwZSAlZCwgJWQgdXJicyksIHJldD0lZFxuIiwKLQkJICAgZXAtPmVwX251bSwgZXAtPnR5cGUsIGVwLT5udXJicywgZXJyKTsKKwl1c2JfYXVkaW9fZGJnKGVwLT5jaGlwLAorCQkiU2V0dGluZyBwYXJhbXMgZm9yIGVwICMleCAodHlwZSAlZCwgJWQgdXJicyksIHJldD0lZFxuIiwKKwkJZXAtPmVwX251bSwgZXAtPnR5cGUsIGVwLT5udXJicywgZXJyKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC05MDYsOCArOTExLDkgQEAKIAogCQllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IHN1Ym1pdCB1cmIgJWQsIGVycm9yICVkOiAlc1xuIiwKLQkJCQkgICBpLCBlcnIsIHVzYl9lcnJvcl9zdHJpbmcoZXJyKSk7CisJCQl1c2JfYXVkaW9fZXJyKGVwLT5jaGlwLAorCQkJCSJjYW5ub3Qgc3VibWl0IHVyYiAlZCwgZXJyb3IgJWQ6ICVzXG4iLAorCQkJCWksIGVyciwgdXNiX2Vycm9yX3N0cmluZyhlcnIpKTsKIAkJCWdvdG8gX19lcnJvcjsKIAkJfQogCQlzZXRfYml0KGksICZlcC0+YWN0aXZlX21hc2spOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2Zvcm1hdC5jIGIvc291bmQvdXNiL2Zvcm1hdC5jCmluZGV4IGQyNDRmZDMuLjhiY2M4N2MgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9mb3JtYXQuYworKysgYi9zb3VuZC91c2IvZm9ybWF0LmMKQEAgLTc0LDggKzc0LDggQEAKIAlpZiAoKHBjbV9mb3JtYXRzID09IDApICYmCiAJICAgIChmb3JtYXQgPT0gMCB8fCBmb3JtYXQgPT0gKDEgPDwgVUFDX0ZPUk1BVF9UWVBFX0lfVU5ERUZJTkVEKSkpIHsKIAkJLyogc29tZSBkZXZpY2VzIGRvbid0IGRlZmluZSB0aGlzIGNvcnJlY3RseS4uLiAqLwotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIiVkOiV1OiVkIDogZm9ybWF0IHR5cGUgMCBpcyBkZXRlY3RlZCwgcHJvY2Vzc2VkIGFzIFBDTVxuIiwKLQkJCSAgICBjaGlwLT5kZXYtPmRldm51bSwgZnAtPmlmYWNlLCBmcC0+YWx0c2V0dGluZyk7CisJCXVzYl9hdWRpb19pbmZvKGNoaXAsICIldTolZCA6IGZvcm1hdCB0eXBlIDAgaXMgZGV0ZWN0ZWQsIHByb2Nlc3NlZCBhcyBQQ01cbiIsCisJCQlmcC0+aWZhY2UsIGZwLT5hbHRzZXR0aW5nKTsKIAkJZm9ybWF0ID0gMSA8PCBVQUNfRk9STUFUX1RZUEVfSV9QQ007CiAJfQogCWlmIChmb3JtYXQgJiAoMSA8PCBVQUNfRk9STUFUX1RZUEVfSV9QQ00pKSB7CkBAIC04Myw5ICs4Myw5IEBACiAJCSAgICBzYW1wbGVfd2lkdGggPT0gMjQgJiYgc2FtcGxlX2J5dGVzID09IDIpCiAJCQlzYW1wbGVfYnl0ZXMgPSAzOwogCQllbHNlIGlmIChzYW1wbGVfd2lkdGggPiBzYW1wbGVfYnl0ZXMgKiA4KSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiJWQ6JXU6JWQgOiBzYW1wbGUgYml0d2lkdGggJWQgaW4gb3ZlciBzYW1wbGUgYnl0ZXMgJWRcbiIsCi0JCQkJICAgY2hpcC0+ZGV2LT5kZXZudW0sIGZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcsCi0JCQkJICAgc2FtcGxlX3dpZHRoLCBzYW1wbGVfYnl0ZXMpOworCQkJdXNiX2F1ZGlvX2luZm8oY2hpcCwgIiV1OiVkIDogc2FtcGxlIGJpdHdpZHRoICVkIGluIG92ZXIgc2FtcGxlIGJ5dGVzICVkXG4iLAorCQkJCSBmcC0+aWZhY2UsIGZwLT5hbHRzZXR0aW5nLAorCQkJCSBzYW1wbGVfd2lkdGgsIHNhbXBsZV9ieXRlcyk7CiAJCX0KIAkJLyogY2hlY2sgdGhlIGZvcm1hdCBieXRlIHNpemUgKi8KIAkJc3dpdGNoIChzYW1wbGVfYnl0ZXMpIHsKQEAgLTEwOCw5ICsxMDgsMTAgQEAKIAkJCXBjbV9mb3JtYXRzIHw9IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiJWQ6JXU6JWQgOiB1bnN1cHBvcnRlZCBzYW1wbGUgYml0d2lkdGggJWQgaW4gJWQgYnl0ZXNcbiIsCi0JCQkJICAgY2hpcC0+ZGV2LT5kZXZudW0sIGZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcsCi0JCQkJICAgc2FtcGxlX3dpZHRoLCBzYW1wbGVfYnl0ZXMpOworCQkJdXNiX2F1ZGlvX2luZm8oY2hpcCwKKwkJCQkgIiV1OiVkIDogdW5zdXBwb3J0ZWQgc2FtcGxlIGJpdHdpZHRoICVkIGluICVkIGJ5dGVzXG4iLAorCQkJCSBmcC0+aWZhY2UsIGZwLT5hbHRzZXR0aW5nLAorCQkJCSBzYW1wbGVfd2lkdGgsIHNhbXBsZV9ieXRlcyk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTEzMiw4ICsxMzMsOSBAQAogCQlwY21fZm9ybWF0cyB8PSBTTkRSVl9QQ01fRk1UQklUX01VX0xBVzsKIAl9CiAJaWYgKGZvcm1hdCAmIH4weDNmKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPICIlZDoldTolZCA6IHVuc3VwcG9ydGVkIGZvcm1hdCBiaXRzICUjeFxuIiwKLQkJCSAgIGNoaXAtPmRldi0+ZGV2bnVtLCBmcC0+aWZhY2UsIGZwLT5hbHRzZXR0aW5nLCBmb3JtYXQpOworCQl1c2JfYXVkaW9faW5mbyhjaGlwLAorCQkJICIldTolZCA6IHVuc3VwcG9ydGVkIGZvcm1hdCBiaXRzICUjeFxuIiwKKwkJCSBmcC0+aWZhY2UsIGZwLT5hbHRzZXR0aW5nLCBmb3JtYXQpOwogCX0KIAogCXBjbV9mb3JtYXRzIHw9IHNuZF91c2JfaW50ZXJmYWNlX2RzZF9mb3JtYXRfcXVpcmtzKGNoaXAsIGZwLCBzYW1wbGVfYnl0ZXMpOwpAQCAtMTU4LDggKzE2MCw5IEBACiAJaW50IG5yX3JhdGVzID0gZm10W29mZnNldF07CiAKIAlpZiAoZm10WzBdIDwgb2Zmc2V0ICsgMSArIDMgKiAobnJfcmF0ZXMgPyBucl9yYXRlcyA6IDIpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiV1OiVkIDogaW52YWxpZCBVQUNfRk9STUFUX1RZUEUgZGVzY1xuIiwKLQkJCQkgICBjaGlwLT5kZXYtPmRldm51bSwgZnAtPmlmYWNlLCBmcC0+YWx0c2V0dGluZyk7CisJCXVzYl9hdWRpb19lcnIoY2hpcCwKKwkJCSIldTolZCA6IGludmFsaWQgVUFDX0ZPUk1BVF9UWVBFIGRlc2NcbiIsCisJCQlmcC0+aWZhY2UsIGZwLT5hbHRzZXR0aW5nKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNzEsNyArMTc0LDcgQEAKIAogCQlmcC0+cmF0ZV90YWJsZSA9IGttYWxsb2Moc2l6ZW9mKGludCkgKiBucl9yYXRlcywgR0ZQX0tFUk5FTCk7CiAJCWlmIChmcC0+cmF0ZV90YWJsZSA9PSBOVUxMKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgbWFsbG9jXG4iKTsKKwkJCXVzYl9hdWRpb19lcnIoY2hpcCwgImNhbm5vdCBtYWxsb2NcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIApAQCAtMjIyLDcgKzIyNSw4IEBACiAgKiBnZXQgdG8ga25vdyBob3cgbWFueSBzYW1wbGUgcmF0ZXMgd2UgaGF2ZSB0byBleHBlY3QuCiAgKiBUaGVuIGZwLT5yYXRlX3RhYmxlIGNhbiBiZSBhbGxvY2F0ZWQgYW5kIGZpbGxlZC4KICAqLwotc3RhdGljIGludCBwYXJzZV91YWMyX3NhbXBsZV9yYXRlX3JhbmdlKHN0cnVjdCBhdWRpb2Zvcm1hdCAqZnAsIGludCBucl90cmlwbGV0cywKK3N0YXRpYyBpbnQgcGFyc2VfdWFjMl9zYW1wbGVfcmF0ZV9yYW5nZShzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCwKKwkJCQkJc3RydWN0IGF1ZGlvZm9ybWF0ICpmcCwgaW50IG5yX3RyaXBsZXRzLAogCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKQogewogCWludCBpLCBucl9yYXRlcyA9IDA7CkBAIC0yNjEsNyArMjY1LDcgQEAKIAogCQkJbnJfcmF0ZXMrKzsKIAkJCWlmIChucl9yYXRlcyA+PSBNQVhfTlJfUkFURVMpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnZhbGlkIHVhYzIgcmF0ZXNcbiIpOworCQkJCXVzYl9hdWRpb19lcnIoY2hpcCwgImludmFsaWQgdWFjMiByYXRlc1xuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTI4Nyw3ICsyOTEsOCBAQAogCWludCBjbG9jayA9IHNuZF91c2JfY2xvY2tfZmluZF9zb3VyY2UoY2hpcCwgZnAtPmNsb2NrLCBmYWxzZSk7CiAKIAlpZiAoY2xvY2sgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIiVzKCk6IHVuYWJsZSB0byBmaW5kIGNsb2NrIHNvdXJjZSAoY2xvY2sgJWQpXG4iLAorCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCSIlcygpOiB1bmFibGUgdG8gZmluZCBjbG9jayBzb3VyY2UgKGNsb2NrICVkKVxuIiwKIAkJCQlfX2Z1bmNfXywgY2xvY2spOwogCQlnb3RvIGVycjsKIAl9CkBAIC0zMDAsNyArMzA1LDggQEAKIAkJCSAgICAgIHRtcCwgc2l6ZW9mKHRtcCkpOwogCiAJaWYgKHJldCA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJXMoKTogdW5hYmxlIHRvIHJldHJpZXZlIG51bWJlciBvZiBzYW1wbGUgcmF0ZXMgKGNsb2NrICVkKVxuIiwKKwkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkiJXMoKTogdW5hYmxlIHRvIHJldHJpZXZlIG51bWJlciBvZiBzYW1wbGUgcmF0ZXMgKGNsb2NrICVkKVxuIiwKIAkJCQlfX2Z1bmNfXywgY2xvY2spOwogCQlnb3RvIGVycjsKIAl9CkBAIC0zMjEsNyArMzI3LDggQEAKIAkJCSAgICAgIGRhdGEsIGRhdGFfc2l6ZSk7CiAKIAlpZiAocmV0IDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlcygpOiB1bmFibGUgdG8gcmV0cmlldmUgc2FtcGxlIHJhdGUgcmFuZ2UgKGNsb2NrICVkKVxuIiwKKwkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkiJXMoKTogdW5hYmxlIHRvIHJldHJpZXZlIHNhbXBsZSByYXRlIHJhbmdlIChjbG9jayAlZClcbiIsCiAJCQkJX19mdW5jX18sIGNsb2NrKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnJfZnJlZTsKQEAgLTMzMiw3ICszMzksNyBAQAogCSAqIHdpbGwgaGF2ZSB0byBkZWFsIHdpdGguICovCiAJa2ZyZWUoZnAtPnJhdGVfdGFibGUpOwogCWZwLT5yYXRlX3RhYmxlID0gTlVMTDsKLQlmcC0+bnJfcmF0ZXMgPSBwYXJzZV91YWMyX3NhbXBsZV9yYXRlX3JhbmdlKGZwLCBucl90cmlwbGV0cywgZGF0YSk7CisJZnAtPm5yX3JhdGVzID0gcGFyc2VfdWFjMl9zYW1wbGVfcmF0ZV9yYW5nZShjaGlwLCBmcCwgbnJfdHJpcGxldHMsIGRhdGEpOwogCiAJaWYgKGZwLT5ucl9yYXRlcyA9PSAwKSB7CiAJCS8qIFNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMgKi8KQEAgLTM0OCw3ICszNTUsNyBAQAogCiAJLyogQ2FsbCB0aGUgdHJpcGxldCBwYXJzZXIgYWdhaW4sIGJ1dCB0aGlzIHRpbWUsIGZwLT5yYXRlX3RhYmxlIGlzCiAJICogYWxsb2NhdGVkLCBzbyB0aGUgcmF0ZXMgd2lsbCBiZSBzdG9yZWQgKi8KLQlwYXJzZV91YWMyX3NhbXBsZV9yYXRlX3JhbmdlKGZwLCBucl90cmlwbGV0cywgZGF0YSk7CisJcGFyc2VfdWFjMl9zYW1wbGVfcmF0ZV9yYW5nZShjaGlwLCBmcCwgbnJfdHJpcGxldHMsIGRhdGEpOwogCiBlcnJfZnJlZToKIAlrZnJlZShkYXRhKTsKQEAgLTQwOCw4ICs0MTUsOSBAQAogCX0KIAogCWlmIChmcC0+Y2hhbm5lbHMgPCAxKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiV1OiVkIDogaW52YWxpZCBjaGFubmVscyAlZFxuIiwKLQkJCSAgIGNoaXAtPmRldi0+ZGV2bnVtLCBmcC0+aWZhY2UsIGZwLT5hbHRzZXR0aW5nLCBmcC0+Y2hhbm5lbHMpOworCQl1c2JfYXVkaW9fZXJyKGNoaXAsCisJCQkiJXU6JWQgOiBpbnZhbGlkIGNoYW5uZWxzICVkXG4iLAorCQkJZnAtPmlmYWNlLCBmcC0+YWx0c2V0dGluZywgZnAtPmNoYW5uZWxzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00MzUsOCArNDQzLDkgQEAKIAkJZnAtPmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX01QRUc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGQoS0VSTl9JTkZPICIlZDoldTolZCA6IHVua25vd24gZm9ybWF0IHRhZyAlI3ggaXMgZGV0ZWN0ZWQuICBwcm9jZXNzZWQgYXMgTVBFRy5cbiIsCi0JCQkgICBjaGlwLT5kZXYtPmRldm51bSwgZnAtPmlmYWNlLCBmcC0+YWx0c2V0dGluZywgZm9ybWF0KTsKKwkJdXNiX2F1ZGlvX2luZm8oY2hpcCwKKwkJCSAiJXU6JWQgOiB1bmtub3duIGZvcm1hdCB0YWcgJSN4IGlzIGRldGVjdGVkLiAgcHJvY2Vzc2VkIGFzIE1QRUcuXG4iLAorCQkJIGZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcsIGZvcm1hdCk7CiAJCWZwLT5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9NUEVHOwogCQlicmVhazsKIAl9CkBAIC00NDksNyArNDU4LDcgQEAKIAkJc3RydWN0IHVhY19mb3JtYXRfdHlwZV9paV9kaXNjcmV0ZV9kZXNjcmlwdG9yICpmbXQgPSBfZm10OwogCQlicmF0ZSA9IGxlMTZfdG9fY3B1KGZtdC0+d01heEJpdFJhdGUpOwogCQlmcmFtZXNpemUgPSBsZTE2X3RvX2NwdShmbXQtPndTYW1wbGVzUGVyRnJhbWUpOwotCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiZm91bmQgZm9ybWF0IElJIHdpdGggbWF4LmJpdHJhdGUgPSAlZCwgZnJhbWUgc2l6ZT0lZFxuIiwgYnJhdGUsIGZyYW1lc2l6ZSk7CisJCXVzYl9hdWRpb19pbmZvKGNoaXAsICJmb3VuZCBmb3JtYXQgSUkgd2l0aCBtYXguYml0cmF0ZSA9ICVkLCBmcmFtZSBzaXplPSVkXG4iLCBicmF0ZSwgZnJhbWVzaXplKTsKIAkJZnAtPmZyYW1lX3NpemUgPSBmcmFtZXNpemU7CiAJCXJldCA9IHBhcnNlX2F1ZGlvX2Zvcm1hdF9yYXRlc192MShjaGlwLCBmcCwgX2ZtdCwgOCk7IC8qIGZtdFs4Li5dIHNhbXBsZSByYXRlcyAqLwogCQlicmVhazsKQEAgLTQ1OCw3ICs0NjcsNyBAQAogCQlzdHJ1Y3QgdWFjX2Zvcm1hdF90eXBlX2lpX2V4dF9kZXNjcmlwdG9yICpmbXQgPSBfZm10OwogCQlicmF0ZSA9IGxlMTZfdG9fY3B1KGZtdC0+d01heEJpdFJhdGUpOwogCQlmcmFtZXNpemUgPSBsZTE2X3RvX2NwdShmbXQtPndTYW1wbGVzUGVyRnJhbWUpOwotCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiZm91bmQgZm9ybWF0IElJIHdpdGggbWF4LmJpdHJhdGUgPSAlZCwgZnJhbWUgc2l6ZT0lZFxuIiwgYnJhdGUsIGZyYW1lc2l6ZSk7CisJCXVzYl9hdWRpb19pbmZvKGNoaXAsICJmb3VuZCBmb3JtYXQgSUkgd2l0aCBtYXguYml0cmF0ZSA9ICVkLCBmcmFtZSBzaXplPSVkXG4iLCBicmF0ZSwgZnJhbWVzaXplKTsKIAkJZnAtPmZyYW1lX3NpemUgPSBmcmFtZXNpemU7CiAJCXJldCA9IHBhcnNlX2F1ZGlvX2Zvcm1hdF9yYXRlc192MihjaGlwLCBmcCk7CiAJCWJyZWFrOwpAQCAtNDg0LDkgKzQ5MywxMCBAQAogCQllcnIgPSBwYXJzZV9hdWRpb19mb3JtYXRfaWkoY2hpcCwgZnAsIGZvcm1hdCwgZm10KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ZChLRVJOX0lORk8gIiVkOiV1OiVkIDogZm9ybWF0IHR5cGUgJWQgaXMgbm90IHN1cHBvcnRlZCB5ZXRcbiIsCi0JCQkgICBjaGlwLT5kZXYtPmRldm51bSwgZnAtPmlmYWNlLCBmcC0+YWx0c2V0dGluZywKLQkJCSAgIGZtdC0+YkZvcm1hdFR5cGUpOworCQl1c2JfYXVkaW9faW5mbyhjaGlwLAorCQkJICIldTolZCA6IGZvcm1hdCB0eXBlICVkIGlzIG5vdCBzdXBwb3J0ZWQgeWV0XG4iLAorCQkJIGZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcsCisJCQkgZm10LT5iRm9ybWF0VHlwZSk7CiAJCXJldHVybiAtRU5PVFNVUFA7CiAJfQogCWZwLT5mbXRfdHlwZSA9IGZtdC0+YkZvcm1hdFR5cGU7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvaGlmYWNlL2NoaXAuYyBiL3NvdW5kL3VzYi9oaWZhY2UvY2hpcC5jCmluZGV4IGIwZGNiMzkuLjI2NzBkNjQ2IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvaGlmYWNlL2NoaXAuYworKysgYi9zb3VuZC91c2IvaGlmYWNlL2NoaXAuYwpAQCAtNjQsNyArNjQsOCBAQAogCXU4IGV4dHJhX2ZyZXE7CiB9OwogCi1zdGF0aWMgaW50IGhpZmFjZV9jaGlwX2NyZWF0ZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlLCBpbnQgaWR4LAorc3RhdGljIGludCBoaWZhY2VfY2hpcF9jcmVhdGUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkgICAgICBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlLCBpbnQgaWR4LAogCQkJICAgICAgY29uc3Qgc3RydWN0IGhpZmFjZV92ZW5kb3JfcXVpcmsgKnF1aXJrLAogCQkJICAgICAgc3RydWN0IGhpZmFjZV9jaGlwICoqcmNoaXApCiB7CkBAIC03Niw3ICs3Nyw4IEBACiAJKnJjaGlwID0gTlVMTDsKIAogCS8qIGlmIHdlIGFyZSBoZXJlLCBjYXJkIGNhbiBiZSByZWdpc3RlcmVkIGluIGFsc2EuICovCi0JcmV0ID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2lkeF0sIGlkW2lkeF0sIFRISVNfTU9EVUxFLCBzaXplb2YoKmNoaXApLCAmY2FyZCk7CisJcmV0ID0gc25kX2NhcmRfbmV3KCZpbnRmLT5kZXYsIGluZGV4W2lkeF0sIGlkW2lkeF0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKCpjaGlwKSwgJmNhcmQpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmRldmljZS0+ZGV2LCAiY2Fubm90IGNyZWF0ZSBhbHNhIGNhcmQuXG4iKTsKIAkJcmV0dXJuIHJldDsKQEAgLTEzMiwxMiArMTM0LDEwIEBACiAJCWdvdG8gZXJyOwogCX0KIAotCXJldCA9IGhpZmFjZV9jaGlwX2NyZWF0ZShkZXZpY2UsIGksIHF1aXJrLCAmY2hpcCk7CisJcmV0ID0gaGlmYWNlX2NoaXBfY3JlYXRlKGludGYsIGRldmljZSwgaSwgcXVpcmssICZjaGlwKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnI7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNoaXAtPmNhcmQsICZpbnRmLT5kZXYpOwotCiAJcmV0ID0gaGlmYWNlX3BjbV9pbml0KGNoaXAsIHF1aXJrID8gcXVpcmstPmV4dHJhX2ZyZXEgOiAwKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJfY2hpcF9kZXN0cm95OwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL21pZGkuYyBiL3NvdW5kL3VzYi9taWRpLmMKaW5kZXggYjkwMWY0Ni4uOWRhNzRkMiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL21pZGkuYworKysgYi9zb3VuZC91c2IvbWlkaS5jCkBAIC0xOTEsMTYgKzE5MSwxNiBAQAogewogCWludCBlcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIGZsYWdzKTsKIAlpZiAoZXJyIDwgMCAmJiBlcnIgIT0gLUVOT0RFVikKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidXNiX3N1Ym1pdF91cmI6ICVkXG4iLCBlcnIpOworCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAidXNiX3N1Ym1pdF91cmI6ICVkXG4iLCBlcnIpOwogCXJldHVybiBlcnI7CiB9CiAKIC8qCiAgKiBFcnJvciBoYW5kbGluZyBmb3IgVVJCIGNvbXBsZXRpb24gZnVuY3Rpb25zLgogICovCi1zdGF0aWMgaW50IHNuZF91c2JtaWRpX3VyYl9lcnJvcihpbnQgc3RhdHVzKQorc3RhdGljIGludCBzbmRfdXNibWlkaV91cmJfZXJyb3IoY29uc3Qgc3RydWN0IHVyYiAqdXJiKQogewotCXN3aXRjaCAoc3RhdHVzKSB7CisJc3dpdGNoICh1cmItPnN0YXR1cykgewogCS8qIG1hbnVhbGx5IHVubGlua2VkLCBvciBkZXZpY2UgZ29uZSAqLwogCWNhc2UgLUVOT0VOVDoKIAljYXNlIC1FQ09OTlJFU0VUOgpAQCAtMjEzLDcgKzIxMyw3IEBACiAJY2FzZSAtRUlMU0VROgogCQlyZXR1cm4gLUVJTzsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1cmIgc3RhdHVzICVkXG4iLCBzdGF0dXMpOworCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAidXJiIHN0YXR1cyAlZFxuIiwgdXJiLT5zdGF0dXMpOwogCQlyZXR1cm4gMDsgLyogY29udGludWUgKi8KIAl9CiB9CkBAIC0yMjcsNyArMjI3LDcgQEAKIAlzdHJ1Y3QgdXNibWlkaV9pbl9wb3J0KiBwb3J0ID0gJmVwLT5wb3J0c1twb3J0aWR4XTsKIAogCWlmICghcG9ydC0+c3Vic3RyZWFtKSB7Ci0JCXNuZF9wcmludGQoInVuZXhwZWN0ZWQgcG9ydCAlZCFcbiIsIHBvcnRpZHgpOworCQlkZXZfZGJnKCZlcC0+dW1pZGktPmRldi0+ZGV2LCAidW5leHBlY3RlZCBwb3J0ICVkIVxuIiwgcG9ydGlkeCk7CiAJCXJldHVybjsKIAl9CiAJaWYgKCF0ZXN0X2JpdChwb3J0LT5zdWJzdHJlYW0tPm51bWJlciwgJmVwLT51bWlkaS0+aW5wdXRfdHJpZ2dlcmVkKSkKQEAgLTI1OSw3ICsyNTksNyBAQAogCQllcC0+dW1pZGktPnVzYl9wcm90b2NvbF9vcHMtPmlucHV0KGVwLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwKIAkJCQkJCSAgIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJfSBlbHNlIHsKLQkJaW50IGVyciA9IHNuZF91c2JtaWRpX3VyYl9lcnJvcih1cmItPnN0YXR1cyk7CisJCWludCBlcnIgPSBzbmRfdXNibWlkaV91cmJfZXJyb3IodXJiKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCWlmIChlcnIgIT0gLUVOT0RFVikgewogCQkJCWVwLT5lcnJvcl9yZXN1Ym1pdCA9IDE7CkBAIC0yODksNyArMjg5LDcgQEAKIAl9CiAJc3Bpbl91bmxvY2soJmVwLT5idWZmZXJfbG9jayk7CiAJaWYgKHVyYi0+c3RhdHVzIDwgMCkgewotCQlpbnQgZXJyID0gc25kX3VzYm1pZGlfdXJiX2Vycm9yKHVyYi0+c3RhdHVzKTsKKwkJaW50IGVyciA9IHNuZF91c2JtaWRpX3VyYl9lcnJvcih1cmIpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJaWYgKGVyciAhPSAtRU5PREVWKQogCQkJCW1vZF90aW1lcigmZXAtPnVtaWRpLT5lcnJvcl90aW1lciwKQEAgLTE2NjgsNyArMTY2OCw3IEBACiAKIAlzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBzbmRfdXNibWlkaV9maW5kX3N1YnN0cmVhbSh1bWlkaSwgc3RyZWFtLCBudW1iZXIpOwogCWlmICghc3Vic3RyZWFtKSB7Ci0JCXNuZF9wcmludGQoS0VSTl9FUlIgInN1YnN0cmVhbSAlZDolZCBub3QgZm91bmRcbiIsIHN0cmVhbSwgbnVtYmVyKTsKKwkJZGV2X2VycigmdW1pZGktPmRldi0+ZGV2LCAic3Vic3RyZWFtICVkOiVkIG5vdCBmb3VuZFxuIiwgc3RyZWFtLCBudW1iZXIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNzE3LDcgKzE3MTcsNyBAQAogCQkJfQogCQl9CiAJfQotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiY3JlYXRlZCAlZCBvdXRwdXQgYW5kICVkIGlucHV0IHBvcnRzXG4iLAorCWRldl9kYmcoJnVtaWRpLT5kZXYtPmRldiwgImNyZWF0ZWQgJWQgb3V0cHV0IGFuZCAlZCBpbnB1dCBwb3J0c1xuIiwKIAkJICAgIG91dF9wb3J0cywgaW5fcG9ydHMpOwogCXJldHVybiAwOwogfQpAQCAtMTc0NywxMCArMTc0NywxMSBAQAogCSAgICBtc19oZWFkZXItPmJMZW5ndGggPj0gNyAmJgogCSAgICBtc19oZWFkZXItPmJEZXNjcmlwdG9yVHlwZSA9PSBVU0JfRFRfQ1NfSU5URVJGQUNFICYmCiAJICAgIG1zX2hlYWRlci0+YkRlc2NyaXB0b3JTdWJ0eXBlID09IFVBQ19IRUFERVIpCi0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiTUlESVN0cmVhbWluZyB2ZXJzaW9uICUwMnguJTAyeFxuIiwKKwkJZGV2X2RiZygmdW1pZGktPmRldi0+ZGV2LCAiTUlESVN0cmVhbWluZyB2ZXJzaW9uICUwMnguJTAyeFxuIiwKIAkJCSAgICBtc19oZWFkZXItPmJjZE1TQ1sxXSwgbXNfaGVhZGVyLT5iY2RNU0NbMF0pOwogCWVsc2UKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIk1JRElTdHJlYW1pbmcgaW50ZXJmYWNlIGRlc2NyaXB0b3Igbm90IGZvdW5kXG4iKTsKKwkJZGV2X3dhcm4oJnVtaWRpLT5kZXYtPmRldiwKKwkJCSAiTUlESVN0cmVhbWluZyBpbnRlcmZhY2UgZGVzY3JpcHRvciBub3QgZm91bmRcbiIpOwogCiAJZXBpZHggPSAwOwogCWZvciAoaSA9IDA7IGkgPCBpbnRmZC0+Yk51bUVuZHBvaW50czsgKytpKSB7CkBAIC0xNzY3LDcgKzE3NjgsOCBAQAogCQlpZiAodXNiX2VuZHBvaW50X2Rpcl9vdXQoZXApKSB7CiAJCQlpZiAoZW5kcG9pbnRzW2VwaWR4XS5vdXRfZXApIHsKIAkJCQlpZiAoKytlcGlkeCA+PSBNSURJX01BWF9FTkRQT0lOVFMpIHsKLQkJCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgInRvbyBtYW55IGVuZHBvaW50c1xuIik7CisJCQkJCWRldl93YXJuKCZ1bWlkaS0+ZGV2LT5kZXYsCisJCQkJCQkgInRvbyBtYW55IGVuZHBvaW50c1xuIik7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KQEAgLTE3ODIsMTIgKzE3ODQsMTMgQEAKIAkJCQkgKi8KIAkJCQllbmRwb2ludHNbZXBpZHhdLm91dF9pbnRlcnZhbCA9IDE7CiAJCQllbmRwb2ludHNbZXBpZHhdLm91dF9jYWJsZXMgPSAoMSA8PCBtc19lcC0+Yk51bUVtYk1JRElKYWNrKSAtIDE7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIkVQICUwMlg6ICVkIGphY2socylcbiIsCisJCQlkZXZfZGJnKCZ1bWlkaS0+ZGV2LT5kZXYsICJFUCAlMDJYOiAlZCBqYWNrKHMpXG4iLAogCQkJCSAgICBlcC0+YkVuZHBvaW50QWRkcmVzcywgbXNfZXAtPmJOdW1FbWJNSURJSmFjayk7CiAJCX0gZWxzZSB7CiAJCQlpZiAoZW5kcG9pbnRzW2VwaWR4XS5pbl9lcCkgewogCQkJCWlmICgrK2VwaWR4ID49IE1JRElfTUFYX0VORFBPSU5UUykgewotCQkJCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAidG9vIG1hbnkgZW5kcG9pbnRzXG4iKTsKKwkJCQkJZGV2X3dhcm4oJnVtaWRpLT5kZXYtPmRldiwKKwkJCQkJCSAidG9vIG1hbnkgZW5kcG9pbnRzXG4iKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQpAQCAtMTc5Nyw3ICsxODAwLDcgQEAKIAkJCWVsc2UgaWYgKHNuZF91c2JfZ2V0X3NwZWVkKHVtaWRpLT5kZXYpID09IFVTQl9TUEVFRF9MT1cpCiAJCQkJZW5kcG9pbnRzW2VwaWR4XS5pbl9pbnRlcnZhbCA9IDE7CiAJCQllbmRwb2ludHNbZXBpZHhdLmluX2NhYmxlcyA9ICgxIDw8IG1zX2VwLT5iTnVtRW1iTUlESUphY2spIC0gMTsKLQkJCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiRVAgJTAyWDogJWQgamFjayhzKVxuIiwKKwkJCWRldl9kYmcoJnVtaWRpLT5kZXYtPmRldiwgIkVQICUwMlg6ICVkIGphY2socylcbiIsCiAJCQkJICAgIGVwLT5iRW5kcG9pbnRBZGRyZXNzLCBtc19lcC0+Yk51bUVtYk1JRElKYWNrKTsKIAkJfQogCX0KQEAgLTE4NjUsNyArMTg2OCw3IEBACiAJICAgIChnZXRfZW5kcG9pbnQoaG9zdGlmLCAxKS0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spICE9IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkKIAkJcmV0dXJuOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJzd2l0Y2hpbmcgdG8gYWx0c2V0dGluZyAlZCB3aXRoIGludCBlcFxuIiwKKwlkZXZfZGJnKCZ1bWlkaS0+ZGV2LT5kZXYsICJzd2l0Y2hpbmcgdG8gYWx0c2V0dGluZyAlZCB3aXRoIGludCBlcFxuIiwKIAkJICAgIGludGZkLT5iQWx0ZXJuYXRlU2V0dGluZyk7CiAJdXNiX3NldF9pbnRlcmZhY2UodW1pZGktPmRldiwgaW50ZmQtPmJJbnRlcmZhY2VOdW1iZXIsCiAJCQkgIGludGZkLT5iQWx0ZXJuYXRlU2V0dGluZyk7CkBAIC0yMDQ3LDI1ICsyMDUwLDI1IEBACiAJICogaW5wdXQgYnVsayBlbmRwb2ludHMgKGF0IGluZGljZXMgMSBhbmQgMykgd2hpY2ggYXJlbid0IHVzZWQuCiAJICovCiAJaWYgKGludGZkLT5iTnVtRW5kcG9pbnRzIDwgKGVuZHBvaW50LT5vdXRfY2FibGVzID4gMHgwMDAxID8gNSA6IDMpKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJub3QgZW5vdWdoIGVuZHBvaW50c1xuIik7CisJCWRldl9kYmcoJnVtaWRpLT5kZXYtPmRldiwgIm5vdCBlbm91Z2ggZW5kcG9pbnRzXG4iKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCiAJZXBkID0gZ2V0X2VuZHBvaW50KGhvc3RpZiwgMCk7CiAJaWYgKCF1c2JfZW5kcG9pbnRfZGlyX2luKGVwZCkgfHwgIXVzYl9lbmRwb2ludF94ZmVyX2ludChlcGQpKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJlbmRwb2ludFswXSBpc24ndCBpbnRlcnJ1cHRcbiIpOworCQlkZXZfZGJnKCZ1bWlkaS0+ZGV2LT5kZXYsICJlbmRwb2ludFswXSBpc24ndCBpbnRlcnJ1cHRcbiIpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIAllcGQgPSBnZXRfZW5kcG9pbnQoaG9zdGlmLCAyKTsKIAlpZiAoIXVzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCkgfHwgIXVzYl9lbmRwb2ludF94ZmVyX2J1bGsoZXBkKSkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiZW5kcG9pbnRbMl0gaXNuJ3QgYnVsayBvdXRwdXRcbiIpOworCQlkZXZfZGJnKCZ1bWlkaS0+ZGV2LT5kZXYsICJlbmRwb2ludFsyXSBpc24ndCBidWxrIG91dHB1dFxuIik7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCWlmIChlbmRwb2ludC0+b3V0X2NhYmxlcyA+IDB4MDAwMSkgewogCQllcGQgPSBnZXRfZW5kcG9pbnQoaG9zdGlmLCA0KTsKIAkJaWYgKCF1c2JfZW5kcG9pbnRfZGlyX291dChlcGQpIHx8CiAJCSAgICAhdXNiX2VuZHBvaW50X3hmZXJfYnVsayhlcGQpKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiZW5kcG9pbnRbNF0gaXNuJ3QgYnVsayBvdXRwdXRcbiIpOworCQkJZGV2X2RiZygmdW1pZGktPmRldi0+ZGV2LCAiZW5kcG9pbnRbNF0gaXNuJ3QgYnVsayBvdXRwdXRcbiIpOwogCQkJcmV0dXJuIC1FTlhJTzsKIAkJfQogCX0KQEAgLTIyODksNyArMjI5Miw3IEBACiAJCWVyciA9IHNuZF91c2JtaWRpX2RldGVjdF9wZXJfcG9ydF9lbmRwb2ludHModW1pZGksIGVuZHBvaW50cyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGQoS0VSTl9FUlIgImludmFsaWQgcXVpcmsgdHlwZSAlZFxuIiwgcXVpcmstPnR5cGUpOworCQlkZXZfZXJyKCZ1bWlkaS0+ZGV2LT5kZXYsICJpbnZhbGlkIHF1aXJrIHR5cGUgJWRcbiIsIHF1aXJrLT50eXBlKTsKIAkJZXJyID0gLUVOWElPOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWlzYy91YTEwMS5jIGIvc291bmQvdXNiL21pc2MvdWExMDEuYwppbmRleCA1MDkzMTU5Li5hMWJhYjE0IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbWlzYy91YTEwMS5jCisrKyBiL3NvdW5kL3VzYi9taXNjL3VhMTAxLmMKQEAgLTEyNDMsOCArMTI0Myw5IEBACiAJCW11dGV4X3VubG9jaygmZGV2aWNlc19tdXRleCk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbY2FyZF9pbmRleF0sIGlkW2NhcmRfaW5kZXhdLCBUSElTX01PRFVMRSwKLQkJCSAgICAgIHNpemVvZigqdWEpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZpbnRlcmZhY2UtPmRldiwKKwkJCSAgIGluZGV4W2NhcmRfaW5kZXhdLCBpZFtjYXJkX2luZGV4XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2YoKnVhKSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKSB7CiAJCW11dGV4X3VubG9jaygmZGV2aWNlc19tdXRleCk7CiAJCXJldHVybiBlcnI7CkBAIC0xMjgzLDggKzEyODQsNiBAQAogCQl9CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmaW50ZXJmYWNlLT5kZXYpOwotCiAJZXJyID0gZGV0ZWN0X3VzYl9mb3JtYXQodWEpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIHByb2JlX2Vycm9yOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL21peGVyLmMgYi9zb3VuZC91c2IvbWl4ZXIuYwppbmRleCAxYmVkNzgwLi5kNDBhMjg1IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbWl4ZXIuYworKysgYi9zb3VuZC91c2IvbWl4ZXIuYwpAQCAtMzA1LDggKzMwNSw5IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCX0KLQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiY2Fubm90IGdldCBjdGwgdmFsdWU6IHJlcSA9ICUjeCwgd1ZhbHVlID0gJSN4LCB3SW5kZXggPSAlI3gsIHR5cGUgPSAlZFxuIiwKLQkJICAgIHJlcXVlc3QsIHZhbGlkeCwgaWR4LCBjdmFsLT52YWxfdHlwZSk7CisJdXNiX2F1ZGlvX2RiZyhjaGlwLAorCQkiY2Fubm90IGdldCBjdGwgdmFsdWU6IHJlcSA9ICUjeCwgd1ZhbHVlID0gJSN4LCB3SW5kZXggPSAlI3gsIHR5cGUgPSAlZFxuIiwKKwkJcmVxdWVzdCwgdmFsaWR4LCBpZHgsIGN2YWwtPnZhbF90eXBlKTsKIAllcnIgPSAtRUlOVkFMOwogCiAgb3V0OgpAQCAtMzUxLDggKzM1Miw5IEBACiAKIAlpZiAocmV0IDwgMCkgewogZXJyb3I6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBnZXQgY3RsIHZhbHVlOiByZXEgPSAlI3gsIHdWYWx1ZSA9ICUjeCwgd0luZGV4ID0gJSN4LCB0eXBlID0gJWRcbiIsCi0JCQkgICByZXF1ZXN0LCB2YWxpZHgsIGlkeCwgY3ZhbC0+dmFsX3R5cGUpOworCQl1c2JfYXVkaW9fZXJyKGNoaXAsCisJCQkiY2Fubm90IGdldCBjdGwgdmFsdWU6IHJlcSA9ICUjeCwgd1ZhbHVlID0gJSN4LCB3SW5kZXggPSAlI3gsIHR5cGUgPSAlZFxuIiwKKwkJCXJlcXVlc3QsIHZhbGlkeCwgaWR4LCBjdmFsLT52YWxfdHlwZSk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC00MTMsNyArNDE1LDggQEAKIAllcnIgPSBnZXRfY3VyX21peF9yYXcoY3ZhbCwgY2hhbm5lbCwgdmFsdWUpOwogCWlmIChlcnIgPCAwKSB7CiAJCWlmICghY3ZhbC0+bWl4ZXItPmlnbm9yZV9jdGxfZXJyb3IpCi0JCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJjYW5ub3QgZ2V0IGN1cnJlbnQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgY2ggJWQ6IGVyciA9ICVkXG4iLAorCQkJdXNiX2F1ZGlvX2RiZyhjdmFsLT5taXhlci0+Y2hpcCwKKwkJCQkiY2Fubm90IGdldCBjdXJyZW50IHZhbHVlIGZvciBjb250cm9sICVkIGNoICVkOiBlcnIgPSAlZFxuIiwKIAkJCQkgICBjdmFsLT5jb250cm9sLCBjaGFubmVsLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTQ0NCw3ICs0NDcsNyBAQAogCiAJCS8qIEZJWE1FICovCiAJCWlmIChyZXF1ZXN0ICE9IFVBQ19TRVRfQ1VSKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX1dBUk5JTkcgIlJBTkdFIHNldHRpbmcgbm90IHlldCBzdXBwb3J0ZWRcbiIpOworCQkJdXNiX2F1ZGlvX2RiZyhjaGlwLCAiUkFOR0Ugc2V0dGluZyBub3QgeWV0IHN1cHBvcnRlZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC00NzAsNyArNDczLDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQotCXNuZF9wcmludGRkKEtFUk5fRVJSICJjYW5ub3Qgc2V0IGN0bCB2YWx1ZTogcmVxID0gJSN4LCB3VmFsdWUgPSAlI3gsIHdJbmRleCA9ICUjeCwgdHlwZSA9ICVkLCBkYXRhID0gJSN4LyUjeFxuIiwKKwl1c2JfYXVkaW9fZGJnKGNoaXAsICJjYW5ub3Qgc2V0IGN0bCB2YWx1ZTogcmVxID0gJSN4LCB3VmFsdWUgPSAlI3gsIHdJbmRleCA9ICUjeCwgdHlwZSA9ICVkLCBkYXRhID0gJSN4LyUjeFxuIiwKIAkJICAgIHJlcXVlc3QsIHZhbGlkeCwgaWR4LCBjdmFsLT52YWxfdHlwZSwgYnVmWzBdLCBidWZbMV0pOwogCWVyciA9IC1FSU5WQUw7CiAKQEAgLTQ5NCw3ICs0OTcsOCBAQAogCQljdmFsLT5jaF9yZWFkb25seSAmICgxIDw8IChjaGFubmVsIC0gMSkpOwogCiAJaWYgKHJlYWRfb25seSkgewotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIiVzKCk6IGNoYW5uZWwgJWQgb2YgY29udHJvbCAlZCBpcyByZWFkX29ubHlcbiIsCisJCXVzYl9hdWRpb19kYmcoY3ZhbC0+bWl4ZXItPmNoaXAsCisJCQkgICAgICAiJXMoKTogY2hhbm5lbCAlZCBvZiBjb250cm9sICVkIGlzIHJlYWRfb25seVxuIiwKIAkJCSAgICBfX2Z1bmNfXywgY2hhbm5lbCwgY3ZhbC0+Y29udHJvbCk7CiAJCXJldHVybiAwOwogCX0KQEAgLTU2MCw3ICs1NjQsNyBAQAogCXdoaWxlIChzbmRfY3RsX2ZpbmRfaWQobWl4ZXItPmNoaXAtPmNhcmQsICZrY3RsLT5pZCkpCiAJCWtjdGwtPmlkLmluZGV4Kys7CiAJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChtaXhlci0+Y2hpcC0+Y2FyZCwga2N0bCkpIDwgMCkgewotCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJjYW5ub3QgYWRkIGNvbnRyb2wgKGVyciA9ICVkKVxuIiwgZXJyKTsKKwkJdXNiX2F1ZGlvX2RiZyhtaXhlci0+Y2hpcCwgImNhbm5vdCBhZGQgY29udHJvbCAoZXJyID0gJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAljdmFsLT5lbGVtX2lkID0gJmtjdGwtPmlkOwpAQCAtODA3LDcgKzgxMSw4IEBACiBzdGF0aWMgdm9pZCB2b2x1bWVfY29udHJvbF9xdWlya3Moc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmN2YWwsCiAJCQkJICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsKQogewotCXN3aXRjaCAoY3ZhbC0+bWl4ZXItPmNoaXAtPnVzYl9pZCkgeworCXN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwID0gY3ZhbC0+bWl4ZXItPmNoaXA7CisJc3dpdGNoIChjaGlwLT51c2JfaWQpIHsKIAljYXNlIFVTQl9JRCgweDA3NjMsIDB4MjAzMCk6IC8qIE0tQXVkaW8gRmFzdCBUcmFjayBDNDAwICovCiAJY2FzZSBVU0JfSUQoMHgwNzYzLCAweDIwMzEpOiAvKiBNLUF1ZGlvIEZhc3QgVHJhY2sgQzYwMCAqLwogCQlpZiAoc3RyY21wKGtjdGwtPmlkLm5hbWUsICJFZmZlY3QgRHVyYXRpb24iKSA9PSAwKSB7CkBAIC04MzksOCArODQ0LDggQEAKIAljYXNlIFVTQl9JRCgweDA3NjMsIDB4MjA4MSk6IC8qIE0tQXVkaW8gRmFzdCBUcmFjayBVbHRyYSA4UiAqLwogCWNhc2UgVVNCX0lEKDB4MDc2MywgMHgyMDgwKTogLyogTS1BdWRpbyBGYXN0IFRyYWNrIFVsdHJhICovCiAJCWlmIChzdHJjbXAoa2N0bC0+aWQubmFtZSwgIkVmZmVjdCBEdXJhdGlvbiIpID09IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPCi0JCQkJInVzYi1hdWRpbzogc2V0IHF1aXJrIGZvciBGVFUgRWZmZWN0IER1cmF0aW9uXG4iKTsKKwkJCXVzYl9hdWRpb19pbmZvKGNoaXAsCisJCQkJICAgICAgICJzZXQgcXVpcmsgZm9yIEZUVSBFZmZlY3QgRHVyYXRpb25cbiIpOwogCQkJY3ZhbC0+bWluID0gMHgwMDAwOwogCQkJY3ZhbC0+bWF4ID0gMHg3ZjAwOwogCQkJY3ZhbC0+cmVzID0gMHgwMTAwOwpAQCAtODQ4LDggKzg1Myw4IEBACiAJCX0KIAkJaWYgKHN0cmNtcChrY3RsLT5pZC5uYW1lLCAiRWZmZWN0IFZvbHVtZSIpID09IDAgfHwKIAkJICAgIHN0cmNtcChrY3RsLT5pZC5uYW1lLCAiRWZmZWN0IEZlZWRiYWNrIFZvbHVtZSIpID09IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPCi0JCQkJInVzYi1hdWRpbzogc2V0IHF1aXJrcyBmb3IgRlRVIEVmZmVjdCBGZWVkYmFjay9Wb2x1bWVcbiIpOworCQkJdXNiX2F1ZGlvX2luZm8oY2hpcCwKKwkJCQkgICAgICAgInNldCBxdWlya3MgZm9yIEZUVSBFZmZlY3QgRmVlZGJhY2svVm9sdW1lXG4iKTsKIAkJCWN2YWwtPm1pbiA9IDB4MDA7CiAJCQljdmFsLT5tYXggPSAweDdmOwogCQkJYnJlYWs7CkBAIC04NjcsNyArODcyLDcgQEAKIAkgKi8KIAkJaWYgKCFzdHJjbXAoa2N0bC0+aWQubmFtZSwgIlBDTSBQbGF5YmFjayBWb2x1bWUiKSAmJgogCQkgICAgY3ZhbC0+bWluID09IC0xNTYxNikgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8KKwkJCXVzYl9hdWRpb19pbmZvKGNoaXAsCiAJCQkJICJzZXQgdm9sdW1lIHF1aXJrIGZvciBVREExMzIxL04xMDEgY2hpcFxuIik7CiAJCQljdmFsLT5tYXggPSAtMjU2OwogCQl9CkBAIC04NzUsNyArODgwLDcgQEAKIAogCWNhc2UgVVNCX0lEKDB4MDQ2ZCwgMHgwOWE0KToKIAkJaWYgKCFzdHJjbXAoa2N0bC0+aWQubmFtZSwgIk1pYyBDYXB0dXJlIFZvbHVtZSIpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTworCQkJdXNiX2F1ZGlvX2luZm8oY2hpcCwKIAkJCQkic2V0IHZvbHVtZSBxdWlyayBmb3IgUXVpY2tDYW0gRTM1MDBcbiIpOwogCQkJY3ZhbC0+bWluID0gNjA4MDsKIAkJCWN2YWwtPm1heCA9IDg3Njg7CkBAIC04OTYsNyArOTAxLDcgQEAKIAkgKiBQcm9ib2x5IHRoZXJlIGlzIHNvbWUgbG9naXRlY2ggbWFnaWMgYmVoaW5kIHRoaXMgbnVtYmVyIC0tZmlzaG9yCiAJICovCiAJCWlmICghc3RyY21wKGtjdGwtPmlkLm5hbWUsICJNaWMgQ2FwdHVyZSBWb2x1bWUiKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8KKwkJCXVzYl9hdWRpb19pbmZvKGNoaXAsCiAJCQkJInNldCByZXNvbHV0aW9uIHF1aXJrOiBjdmFsLT5yZXMgPSAzODRcbiIpOwogCQkJY3ZhbC0+cmVzID0gMzg0OwogCQl9CkBAIC05MzIsNyArOTM3LDggQEAKIAkJfQogCQlpZiAoZ2V0X2N0bF92YWx1ZShjdmFsLCBVQUNfR0VUX01BWCwgKGN2YWwtPmNvbnRyb2wgPDwgOCkgfCBtaW5jaG4sICZjdmFsLT5tYXgpIDwgMCB8fAogCQkgICAgZ2V0X2N0bF92YWx1ZShjdmFsLCBVQUNfR0VUX01JTiwgKGN2YWwtPmNvbnRyb2wgPDwgOCkgfCBtaW5jaG4sICZjdmFsLT5taW4pIDwgMCkgewotCQkJc25kX3ByaW50ZChLRVJOX0VSUiAiJWQ6JWQ6IGNhbm5vdCBnZXQgbWluL21heCB2YWx1ZXMgZm9yIGNvbnRyb2wgJWQgKGlkICVkKVxuIiwKKwkJCXVzYl9hdWRpb19lcnIoY3ZhbC0+bWl4ZXItPmNoaXAsCisJCQkJICAgICAgIiVkOiVkOiBjYW5ub3QgZ2V0IG1pbi9tYXggdmFsdWVzIGZvciBjb250cm9sICVkIChpZCAlZClcbiIsCiAJCQkJICAgY3ZhbC0+aWQsIHNuZF91c2JfY3RybF9pbnRmKGN2YWwtPm1peGVyLT5jaGlwKSwgY3ZhbC0+Y29udHJvbCwgY3ZhbC0+aWQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTExOTYsNyArMTIwMiw3IEBACiAKIAljdmFsID0ga3phbGxvYyhzaXplb2YoKmN2YWwpLCBHRlBfS0VSTkVMKTsKIAlpZiAoISBjdmFsKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBtYWxsb2Mga2NvbnRyb2xcbiIpOworCQl1c2JfYXVkaW9fZXJyKHN0YXRlLT5jaGlwLCAiY2Fubm90IG1hbGxvYyBrY29udHJvbFxuIik7CiAJCXJldHVybjsKIAl9CiAJY3ZhbC0+bWl4ZXIgPSBzdGF0ZS0+bWl4ZXI7CkBAIC0xMjI1LDcgKzEyMzEsNyBAQAogCQlrY3RsID0gc25kX2N0bF9uZXcxKCZ1c2JfZmVhdHVyZV91bml0X2N0bCwgY3ZhbCk7CiAKIAlpZiAoISBrY3RsKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBtYWxsb2Mga2NvbnRyb2xcbiIpOworCQl1c2JfYXVkaW9fZXJyKHN0YXRlLT5jaGlwLCAiY2Fubm90IG1hbGxvYyBrY29udHJvbFxuIik7CiAJCWtmcmVlKGN2YWwpOwogCQlyZXR1cm47CiAJfQpAQCAtMTI5OSwxNiArMTMwNSwxNiBAQAogCSAqIGRldmljZXMuIEl0IHdpbGwgZGVmaW5pdGl2ZWx5IGNhdGNoIGFsbCBidWdneSBMb2dpdGVjaCBkZXZpY2VzLgogCSAqLwogCWlmIChyYW5nZSA+IDM4NCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAidXNiX2F1ZGlvOiBXYXJuaW5nISBVbmxpa2VseSBiaWcgIgorCQl1c2JfYXVkaW9fd2FybihzdGF0ZS0+Y2hpcCwgIldhcm5pbmchIFVubGlrZWx5IGJpZyAiCiAJCQkgICAidm9sdW1lIHJhbmdlICg9JXUpLCBjdmFsLT5yZXMgaXMgcHJvYmFibHkgd3JvbmcuIiwKIAkJCSAgIHJhbmdlKTsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgInVzYl9hdWRpbzogWyVkXSBGVSBbJXNdIGNoID0gJWQsICIKKwkJdXNiX2F1ZGlvX3dhcm4oc3RhdGUtPmNoaXAsICJbJWRdIEZVIFslc10gY2ggPSAlZCwgIgogCQkJICAgInZhbCA9ICVkLyVkLyVkIiwgY3ZhbC0+aWQsCiAJCQkgICBrY3RsLT5pZC5uYW1lLCBjdmFsLT5jaGFubmVscywKIAkJCSAgIGN2YWwtPm1pbiwgY3ZhbC0+bWF4LCBjdmFsLT5yZXMpOwogCX0KIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiWyVkXSBGVSBbJXNdIGNoID0gJWQsIHZhbCA9ICVkLyVkLyVkXG4iLAorCXVzYl9hdWRpb19kYmcoc3RhdGUtPmNoaXAsICJbJWRdIEZVIFslc10gY2ggPSAlZCwgdmFsID0gJWQvJWQvJWRcbiIsCiAJCSAgICBjdmFsLT5pZCwga2N0bC0+aWQubmFtZSwgY3ZhbC0+Y2hhbm5lbHMsIGN2YWwtPm1pbiwgY3ZhbC0+bWF4LCBjdmFsLT5yZXMpOwogCXNuZF91c2JfbWl4ZXJfYWRkX2NvbnRyb2woc3RhdGUtPm1peGVyLCBrY3RsKTsKIH0KQEAgLTEzMzIsMTYgKzEzMzgsMTcgQEAKIAlpZiAoc3RhdGUtPm1peGVyLT5wcm90b2NvbCA9PSBVQUNfVkVSU0lPTl8xKSB7CiAJCWNzaXplID0gaGRyLT5iQ29udHJvbFNpemU7CiAJCWlmICghY3NpemUpIHsKLQkJCXNuZF9wcmludGRkKEtFUk5fRVJSICJ1c2JhdWRpbzogdW5pdCAldTogIgotCQkJCSAgICAiaW52YWxpZCBiQ29udHJvbFNpemUgPT0gMFxuIiwgdW5pdGlkKTsKKwkJCXVzYl9hdWRpb19kYmcoc3RhdGUtPmNoaXAsCisJCQkJICAgICAgInVuaXQgJXU6IGludmFsaWQgYkNvbnRyb2xTaXplID09IDBcbiIsCisJCQkJICAgICAgdW5pdGlkKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWNoYW5uZWxzID0gKGhkci0+Ykxlbmd0aCAtIDcpIC8gY3NpemUgLSAxOwogCQlibWFDb250cm9scyA9IGhkci0+Ym1hQ29udHJvbHM7CiAJCWlmIChoZHItPmJMZW5ndGggPCA3ICsgY3NpemUpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInVzYmF1ZGlvOiB1bml0ICV1OiAiCi0JCQkJICAgImludmFsaWQgVUFDX0ZFQVRVUkVfVU5JVCBkZXNjcmlwdG9yXG4iLAotCQkJCSAgIHVuaXRpZCk7CisJCQl1c2JfYXVkaW9fZXJyKHN0YXRlLT5jaGlwLAorCQkJCSAgICAgICJ1bml0ICV1OiBpbnZhbGlkIFVBQ19GRUFUVVJFX1VOSVQgZGVzY3JpcHRvclxuIiwKKwkJCQkgICAgICB1bml0aWQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9IGVsc2UgewpAQCAtMTM1MCw5ICsxMzU3LDkgQEAKIAkJY2hhbm5lbHMgPSAoaGRyLT5iTGVuZ3RoIC0gNikgLyA0IC0gMTsKIAkJYm1hQ29udHJvbHMgPSBmdHItPmJtYUNvbnRyb2xzOwogCQlpZiAoaGRyLT5iTGVuZ3RoIDwgNiArIGNzaXplKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1c2JhdWRpbzogdW5pdCAldTogIgotCQkJCSAgICJpbnZhbGlkIFVBQ19GRUFUVVJFX1VOSVQgZGVzY3JpcHRvclxuIiwKLQkJCQkgICB1bml0aWQpOworCQkJdXNiX2F1ZGlvX2VycihzdGF0ZS0+Y2hpcCwKKwkJCQkgICAgICAidW5pdCAldTogaW52YWxpZCBVQUNfRkVBVFVSRV9VTklUIGRlc2NyaXB0b3JcbiIsCisJCQkJICAgICAgdW5pdGlkKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMTM3MCwxNCArMTM3NywxNCBAQAogCS8qIG1hc3RlciBjb25maWd1cmF0aW9uIHF1aXJrcyAqLwogCXN3aXRjaCAoc3RhdGUtPmNoaXAtPnVzYl9pZCkgewogCWNhc2UgVVNCX0lEKDB4MDhiYiwgMHgyNzAyKToKLQkJc25kX3ByaW50ayhLRVJOX0lORk8KLQkJCSAgICJ1c2JtaXhlcjogbWFzdGVyIHZvbHVtZSBxdWlyayBmb3IgUENNMjcwMiBjaGlwXG4iKTsKKwkJdXNiX2F1ZGlvX2luZm8oc3RhdGUtPmNoaXAsCisJCQkgICAgICAgInVzYm1peGVyOiBtYXN0ZXIgdm9sdW1lIHF1aXJrIGZvciBQQ00yNzAyIGNoaXBcbiIpOwogCQkvKiBkaXNhYmxlIG5vbi1mdW5jdGlvbmFsIHZvbHVtZSBjb250cm9sICovCiAJCW1hc3Rlcl9iaXRzICY9IH5VQUNfQ09OVFJPTF9CSVQoVUFDX0ZVX1ZPTFVNRSk7CiAJCWJyZWFrOwogCWNhc2UgVVNCX0lEKDB4MTEzMCwgMHhmMjExKToKLQkJc25kX3ByaW50ayhLRVJOX0lORk8KLQkJCSAgICJ1c2JtaXhlcjogdm9sdW1lIGNvbnRyb2wgcXVpcmsgZm9yIFRlbnggVFA2OTExIEF1ZGlvIEhlYWRzZXRcbiIpOworCQl1c2JfYXVkaW9faW5mbyhzdGF0ZS0+Y2hpcCwKKwkJCSAgICAgICAidXNibWl4ZXI6IHZvbHVtZSBjb250cm9sIHF1aXJrIGZvciBUZW54IFRQNjkxMSBBdWRpbyBIZWFkc2V0XG4iKTsKIAkJLyogZGlzYWJsZSBub24tZnVuY3Rpb25hbCB2b2x1bWUgY29udHJvbCAqLwogCQljaGFubmVscyA9IDA7CiAJCWJyZWFrOwpAQCAtMTQ3OSw3ICsxNDg2LDcgQEAKIAogCWtjdGwgPSBzbmRfY3RsX25ldzEoJnVzYl9mZWF0dXJlX3VuaXRfY3RsLCBjdmFsKTsKIAlpZiAoISBrY3RsKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBtYWxsb2Mga2NvbnRyb2xcbiIpOworCQl1c2JfYXVkaW9fZXJyKHN0YXRlLT5jaGlwLCAiY2Fubm90IG1hbGxvYyBrY29udHJvbFxuIik7CiAJCWtmcmVlKGN2YWwpOwogCQlyZXR1cm47CiAJfQpAQCAtMTQ5Miw3ICsxNDk5LDcgQEAKIAkJbGVuID0gc3ByaW50ZihrY3RsLT5pZC5uYW1lLCAiTWl4ZXIgU291cmNlICVkIiwgaW5fY2ggKyAxKTsKIAlhcHBlbmRfY3RsX25hbWUoa2N0bCwgIiBWb2x1bWUiKTsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiWyVkXSBNVSBbJXNdIGNoID0gJWQsIHZhbCA9ICVkLyVkXG4iLAorCXVzYl9hdWRpb19kYmcoc3RhdGUtPmNoaXAsICJbJWRdIE1VIFslc10gY2ggPSAlZCwgdmFsID0gJWQvJWRcbiIsCiAJCSAgICBjdmFsLT5pZCwga2N0bC0+aWQubmFtZSwgY3ZhbC0+Y2hhbm5lbHMsIGN2YWwtPm1pbiwgY3ZhbC0+bWF4KTsKIAlzbmRfdXNiX21peGVyX2FkZF9jb250cm9sKHN0YXRlLT5taXhlciwga2N0bCk7CiB9CkBAIC0xNTA5LDEyICsxNTE2LDEyIEBACiAJaW50IHBpbiwgaWNoLCBlcnI7CiAKIAlpZiAoZGVzYy0+Ykxlbmd0aCA8IDExIHx8ICEgKGlucHV0X3BpbnMgPSBkZXNjLT5iTnJJblBpbnMpIHx8ICEgKG51bV9vdXRzID0gdWFjX21peGVyX3VuaXRfYk5yQ2hhbm5lbHMoZGVzYykpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgTUlYRVIgVU5JVCBkZXNjcmlwdG9yICVkXG4iLCB1bml0aWQpOworCQl1c2JfYXVkaW9fZXJyKHN0YXRlLT5jaGlwLCAiaW52YWxpZCBNSVhFUiBVTklUIGRlc2NyaXB0b3IgJWRcbiIsIHVuaXRpZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAkvKiBubyBibUNvbnRyb2xzIGZpZWxkIChlLmcuIE1heWE0NCkgLT4gaWdub3JlICovCiAJaWYgKGRlc2MtPmJMZW5ndGggPD0gMTAgKyBpbnB1dF9waW5zKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiTVUgJWQgaGFzIG5vIGJtQ29udHJvbHMgZmllbGRcbiIsIHVuaXRpZCk7CisJCXVzYl9hdWRpb19kYmcoc3RhdGUtPmNoaXAsICJNVSAlZCBoYXMgbm8gYm1Db250cm9scyBmaWVsZFxuIiwgdW5pdGlkKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xNzEzLDcgKzE3MjAsNyBAQAogCiAJaWYgKGRlc2MtPmJMZW5ndGggPCAxMyB8fCBkZXNjLT5iTGVuZ3RoIDwgMTMgKyBudW1faW5zIHx8CiAJICAgIGRlc2MtPmJMZW5ndGggPCBudW1faW5zICsgdWFjX3Byb2Nlc3NpbmdfdW5pdF9iQ29udHJvbFNpemUoZGVzYywgc3RhdGUtPm1peGVyLT5wcm90b2NvbCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW52YWxpZCAlcyBkZXNjcmlwdG9yIChpZCAlZClcbiIsIG5hbWUsIHVuaXRpZCk7CisJCXVzYl9hdWRpb19lcnIoc3RhdGUtPmNoaXAsICJpbnZhbGlkICVzIGRlc2NyaXB0b3IgKGlkICVkKVxuIiwgbmFtZSwgdW5pdGlkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNzM5LDcgKzE3NDYsNyBAQAogCQkJY29udGludWU7CiAJCWN2YWwgPSBremFsbG9jKHNpemVvZigqY3ZhbCksIEdGUF9LRVJORUwpOwogCQlpZiAoISBjdmFsKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgbWFsbG9jIGtjb250cm9sXG4iKTsKKwkJCXVzYl9hdWRpb19lcnIoc3RhdGUtPmNoaXAsICJjYW5ub3QgbWFsbG9jIGtjb250cm9sXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCWN2YWwtPm1peGVyID0gc3RhdGUtPm1peGVyOwpAQCAtMTc3MSw3ICsxNzc4LDcgQEAKIAogCQlrY3RsID0gc25kX2N0bF9uZXcxKCZtaXhlcl9wcm9jdW5pdF9jdGwsIGN2YWwpOwogCQlpZiAoISBrY3RsKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgbWFsbG9jIGtjb250cm9sXG4iKTsKKwkJCXVzYl9hdWRpb19lcnIoc3RhdGUtPmNoaXAsICJjYW5ub3QgbWFsbG9jIGtjb250cm9sXG4iKTsKIAkJCWtmcmVlKGN2YWwpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTE3OTMsNyArMTgwMCw4IEBACiAJCWFwcGVuZF9jdGxfbmFtZShrY3RsLCAiICIpOwogCQlhcHBlbmRfY3RsX25hbWUoa2N0bCwgdmFsaW5mby0+c3VmZml4KTsKIAotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIlslZF0gUFUgWyVzXSBjaCA9ICVkLCB2YWwgPSAlZC8lZFxuIiwKKwkJdXNiX2F1ZGlvX2RiZyhzdGF0ZS0+Y2hpcCwKKwkJCSJbJWRdIFBVIFslc10gY2ggPSAlZCwgdmFsID0gJWQvJWRcbiIsCiAJCQkgICAgY3ZhbC0+aWQsIGtjdGwtPmlkLm5hbWUsIGN2YWwtPmNoYW5uZWxzLCBjdmFsLT5taW4sIGN2YWwtPm1heCk7CiAJCWlmICgoZXJyID0gc25kX3VzYl9taXhlcl9hZGRfY29udHJvbChzdGF0ZS0+bWl4ZXIsIGtjdGwpKSA8IDApCiAJCQlyZXR1cm4gZXJyOwpAQCAtMTkxOCw3ICsxOTI2LDggQEAKIAljaGFyICoqbmFtZWxpc3Q7CiAKIAlpZiAoIWRlc2MtPmJOckluUGlucyB8fCBkZXNjLT5iTGVuZ3RoIDwgNSArIGRlc2MtPmJOckluUGlucykgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnZhbGlkIFNFTEVDVE9SIFVOSVQgZGVzY3JpcHRvciAlZFxuIiwgdW5pdGlkKTsKKwkJdXNiX2F1ZGlvX2VycihzdGF0ZS0+Y2hpcCwKKwkJCSJpbnZhbGlkIFNFTEVDVE9SIFVOSVQgZGVzY3JpcHRvciAlZFxuIiwgdW5pdGlkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xOTM2LDcgKzE5NDUsNyBAQAogCiAJY3ZhbCA9IGt6YWxsb2Moc2l6ZW9mKCpjdmFsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCEgY3ZhbCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgbWFsbG9jIGtjb250cm9sXG4iKTsKKwkJdXNiX2F1ZGlvX2VycihzdGF0ZS0+Y2hpcCwgImNhbm5vdCBtYWxsb2Mga2NvbnRyb2xcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJY3ZhbC0+bWl4ZXIgPSBzdGF0ZS0+bWl4ZXI7CkBAIC0xOTU1LDcgKzE5NjQsNyBAQAogCiAJbmFtZWxpc3QgPSBrbWFsbG9jKHNpemVvZihjaGFyICopICogZGVzYy0+Yk5ySW5QaW5zLCBHRlBfS0VSTkVMKTsKIAlpZiAoISBuYW1lbGlzdCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgbWFsbG9jXG4iKTsKKwkJdXNiX2F1ZGlvX2VycihzdGF0ZS0+Y2hpcCwgImNhbm5vdCBtYWxsb2NcbiIpOwogCQlrZnJlZShjdmFsKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTk2NSw3ICsxOTc0LDcgQEAKIAkJbGVuID0gMDsKIAkJbmFtZWxpc3RbaV0gPSBrbWFsbG9jKE1BWF9JVEVNX05BTUVfTEVOLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCEgbmFtZWxpc3RbaV0pIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBtYWxsb2NcbiIpOworCQkJdXNiX2F1ZGlvX2VycihzdGF0ZS0+Y2hpcCwgImNhbm5vdCBtYWxsb2NcbiIpOwogCQkJd2hpbGUgKGktLSkKIAkJCQlrZnJlZShuYW1lbGlzdFtpXSk7CiAJCQlrZnJlZShuYW1lbGlzdCk7CkBAIC0xOTgyLDcgKzE5OTEsNyBAQAogCiAJa2N0bCA9IHNuZF9jdGxfbmV3MSgmbWl4ZXJfc2VsZWN0dW5pdF9jdGwsIGN2YWwpOwogCWlmICghIGtjdGwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IG1hbGxvYyBrY29udHJvbFxuIik7CisJCXVzYl9hdWRpb19lcnIoc3RhdGUtPmNoaXAsICJjYW5ub3QgbWFsbG9jIGtjb250cm9sXG4iKTsKIAkJa2ZyZWUobmFtZWxpc3QpOwogCQlrZnJlZShjdmFsKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0yMDEwLDcgKzIwMTksNyBAQAogCQkJYXBwZW5kX2N0bF9uYW1lKGtjdGwsICIgUGxheWJhY2sgU291cmNlIik7CiAJfQogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJbJWRdIFNVIFslc10gaXRlbXMgPSAlZFxuIiwKKwl1c2JfYXVkaW9fZGJnKHN0YXRlLT5jaGlwLCAiWyVkXSBTVSBbJXNdIGl0ZW1zID0gJWRcbiIsCiAJCSAgICBjdmFsLT5pZCwga2N0bC0+aWQubmFtZSwgZGVzYy0+Yk5ySW5QaW5zKTsKIAlpZiAoKGVyciA9IHNuZF91c2JfbWl4ZXJfYWRkX2NvbnRyb2woc3RhdGUtPm1peGVyLCBrY3RsKSkgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtMjAzMiw3ICsyMDQxLDcgQEAKIAogCXAxID0gZmluZF9hdWRpb19jb250cm9sX3VuaXQoc3RhdGUsIHVuaXRpZCk7CiAJaWYgKCFwMSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1c2JhdWRpbzogdW5pdCAlZCBub3QgZm91bmQhXG4iLCB1bml0aWQpOworCQl1c2JfYXVkaW9fZXJyKHN0YXRlLT5jaGlwLCAidW5pdCAlZCBub3QgZm91bmQhXG4iLCB1bml0aWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTIwNjIsNyArMjA3MSw4IEBACiAJY2FzZSBVQUMyX0VYVEVOU0lPTl9VTklUX1YyOgogCQlyZXR1cm4gcGFyc2VfYXVkaW9fZXh0ZW5zaW9uX3VuaXQoc3RhdGUsIHVuaXRpZCwgcDEpOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVzYmF1ZGlvOiB1bml0ICV1OiB1bmV4cGVjdGVkIHR5cGUgMHglMDJ4XG4iLCB1bml0aWQsIHAxWzJdKTsKKwkJdXNiX2F1ZGlvX2VycihzdGF0ZS0+Y2hpcCwKKwkJCSJ1bml0ICV1OiB1bmV4cGVjdGVkIHR5cGUgMHglMDJ4XG4iLCB1bml0aWQsIHAxWzJdKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogfQpAQCAtMjIxMCw4ICsyMjIwLDkgQEAKIAlfX3U4IGNoYW5uZWwgPSB2YWx1ZSAmIDB4ZmY7CiAKIAlpZiAoY2hhbm5lbCA+PSBNQVhfQ0hBTk5FTFMpIHsKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICIlcygpOiBib2d1cyBjaGFubmVsIG51bWJlciAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgY2hhbm5lbCk7CisJCXVzYl9hdWRpb19kYmcobWl4ZXItPmNoaXAsCisJCQkiJXMoKTogYm9ndXMgY2hhbm5lbCBudW1iZXIgJWRcbiIsCisJCQlfX2Z1bmNfXywgY2hhbm5lbCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIyNDAsOCArMjI1MSw5IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJ1bmtub3duIGF0dHJpYnV0ZSAlZCBpbiBpbnRlcnJ1cHRcbiIsCi0JCQkJCQlhdHRyaWJ1dGUpOworCQkJdXNiX2F1ZGlvX2RiZyhtaXhlci0+Y2hpcCwKKwkJCQkidW5rbm93biBhdHRyaWJ1dGUgJWQgaW4gaW50ZXJydXB0XG4iLAorCQkJCWF0dHJpYnV0ZSk7CiAJCQlicmVhazsKIAkJfSAvKiBzd2l0Y2ggKi8KIAl9CkBAIC0yMjYyLDcgKzIyNzQsNyBAQAogCQlmb3IgKHN0YXR1cyA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCQkgICAgIGxlbiA+PSBzaXplb2YoKnN0YXR1cyk7CiAJCSAgICAgbGVuIC09IHNpemVvZigqc3RhdHVzKSwgc3RhdHVzKyspIHsKLQkJCXNuZF9wcmludGQoS0VSTl9ERUJVRyAic3RhdHVzIGludGVycnVwdDogJTAyeCAlMDJ4XG4iLAorCQkJZGV2X2RiZygmdXJiLT5kZXYtPmRldiwgInN0YXR1cyBpbnRlcnJ1cHQ6ICUwMnggJTAyeFxuIiwKIAkJCQkJCXN0YXR1cy0+YlN0YXR1c1R5cGUsCiAJCQkJCQlzdGF0dXMtPmJPcmlnaW5hdG9yKTsKIApAQCAtMjMwMCwyNiArMjMxMiw2IEBACiAJfQogfQogCi0vKiBzdG9wIGFueSBidXMgYWN0aXZpdHkgb2YgYSBtaXhlciAqLwotdm9pZCBzbmRfdXNiX21peGVyX2luYWN0aXZhdGUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQotewotCXVzYl9raWxsX3VyYihtaXhlci0+dXJiKTsKLQl1c2Jfa2lsbF91cmIobWl4ZXItPnJjX3VyYik7Ci19Ci0KLWludCBzbmRfdXNiX21peGVyX2FjdGl2YXRlKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKLXsKLQlpbnQgZXJyOwotCi0JaWYgKG1peGVyLT51cmIpIHsKLQkJZXJyID0gdXNiX3N1Ym1pdF91cmIobWl4ZXItPnVyYiwgR0ZQX05PSU8pOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qIGNyZWF0ZSB0aGUgaGFuZGxlciBmb3IgdGhlIG9wdGlvbmFsIHN0YXR1cyBpbnRlcnJ1cHQgZW5kcG9pbnQgKi8KIHN0YXRpYyBpbnQgc25kX3VzYl9taXhlcl9zdGF0dXNfY3JlYXRlKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKIHsKQEAgLTIzOTQsNyArMjM4Niw3IEBACiAKIAlzbmRfdXNiX21peGVyX2FwcGx5X2NyZWF0ZV9xdWlyayhtaXhlcik7CiAKLQllcnIgPSBzbmRfZGV2aWNlX25ldyhjaGlwLT5jYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIG1peGVyLCAmZGV2X29wcyk7CisJZXJyID0gc25kX2RldmljZV9uZXcoY2hpcC0+Y2FyZCwgU05EUlZfREVWX0NPREVDLCBtaXhlciwgJmRldl9vcHMpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIF9lcnJvcjsKIApAQCAtMjQxOCwzICsyNDEwLDgyIEBACiAJdXNiX2tpbGxfdXJiKG1peGVyLT51cmIpOwogCXVzYl9raWxsX3VyYihtaXhlci0+cmNfdXJiKTsKIH0KKworI2lmZGVmIENPTkZJR19QTQorLyogc3RvcCBhbnkgYnVzIGFjdGl2aXR5IG9mIGEgbWl4ZXIgKi8KK3N0YXRpYyB2b2lkIHNuZF91c2JfbWl4ZXJfaW5hY3RpdmF0ZShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCit7CisJdXNiX2tpbGxfdXJiKG1peGVyLT51cmIpOworCXVzYl9raWxsX3VyYihtaXhlci0+cmNfdXJiKTsKK30KKworc3RhdGljIGludCBzbmRfdXNiX21peGVyX2FjdGl2YXRlKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKK3sKKwlpbnQgZXJyOworCisJaWYgKG1peGVyLT51cmIpIHsKKwkJZXJyID0gdXNiX3N1Ym1pdF91cmIobWl4ZXItPnVyYiwgR0ZQX05PSU8pOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBzbmRfdXNiX21peGVyX3N1c3BlbmQoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCXNuZF91c2JfbWl4ZXJfaW5hY3RpdmF0ZShtaXhlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVzdG9yZV9taXhlcl92YWx1ZShzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqY3ZhbCkKK3sKKwlpbnQgYywgZXJyLCBpZHg7CisKKwlpZiAoY3ZhbC0+Y21hc2spIHsKKwkJaWR4ID0gMDsKKwkJZm9yIChjID0gMDsgYyA8IE1BWF9DSEFOTkVMUzsgYysrKSB7CisJCQlpZiAoIShjdmFsLT5jbWFzayAmICgxIDw8IGMpKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChjdmFsLT5jYWNoZWQgJiAoMSA8PCBjKSkgeworCQkJCWVyciA9IHNldF9jdXJfbWl4X3ZhbHVlKGN2YWwsIGMgKyAxLCBpZHgsCisJCQkJCQkJY3ZhbC0+Y2FjaGVfdmFsW2lkeF0pOworCQkJCWlmIChlcnIgPCAwKQorCQkJCQlyZXR1cm4gZXJyOworCQkJfQorCQkJaWR4Kys7CisJCX0KKwl9IGVsc2UgeworCQkvKiBtYXN0ZXIgKi8KKwkJaWYgKGN2YWwtPmNhY2hlZCkgeworCQkJZXJyID0gc2V0X2N1cl9taXhfdmFsdWUoY3ZhbCwgMCwgMCwgKmN2YWwtPmNhY2hlX3ZhbCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBzbmRfdXNiX21peGVyX3Jlc3VtZShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIsIGJvb2wgcmVzZXRfcmVzdW1lKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICpjdmFsOworCWludCBpZCwgZXJyOworCisJLyogRklYTUU6IGFueSBtaXhlciBxdWlya3M/ICovCisKKwlpZiAocmVzZXRfcmVzdW1lKSB7CisJCS8qIHJlc3RvcmUgY2FjaGVkIG1peGVyIHZhbHVlcyAqLworCQlmb3IgKGlkID0gMDsgaWQgPCBNQVhfSURfRUxFTVM7IGlkKyspIHsKKwkJCWZvciAoY3ZhbCA9IG1peGVyLT5pZF9lbGVtc1tpZF07IGN2YWw7CisJCQkgICAgIGN2YWwgPSBjdmFsLT5uZXh0X2lkX2VsZW0pIHsKKwkJCQllcnIgPSByZXN0b3JlX21peGVyX3ZhbHVlKGN2YWwpOworCQkJCWlmIChlcnIgPCAwKQorCQkJCQlyZXR1cm4gZXJyOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHNuZF91c2JfbWl4ZXJfYWN0aXZhdGUobWl4ZXIpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWl4ZXIuaCBiL3NvdW5kL3VzYi9taXhlci5oCmluZGV4IGFhYjgwZGYuLjczYjFmNjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9taXhlci5oCisrKyBiL3NvdW5kL3VzYi9taXhlci5oCkBAIC02Myw4ICs2Myw2IEBACiAKIGludCBzbmRfdXNiX21peGVyX3NldF9jdGxfdmFsdWUoc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmN2YWwsCiAJCQkJaW50IHJlcXVlc3QsIGludCB2YWxpZHgsIGludCB2YWx1ZV9zZXQpOwotdm9pZCBzbmRfdXNiX21peGVyX2luYWN0aXZhdGUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKTsKLWludCBzbmRfdXNiX21peGVyX2FjdGl2YXRlKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcik7CiAKIGludCBzbmRfdXNiX21peGVyX2FkZF9jb250cm9sKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciwKIAkJCSAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwpOwpAQCAtNzIsNCArNzAsOSBAQAogaW50IHNuZF91c2JfbWl4ZXJfdm9sX3RsdihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IG9wX2ZsYWcsCiAJCQkgIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBpbnQgX191c2VyICpfdGx2KTsKIAorI2lmZGVmIENPTkZJR19QTQoraW50IHNuZF91c2JfbWl4ZXJfc3VzcGVuZChzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpOworaW50IHNuZF91c2JfbWl4ZXJfcmVzdW1lKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciwgYm9vbCByZXNldF9yZXN1bWUpOworI2VuZGlmCisKICNlbmRpZiAvKiBfX1VTQk1JWEVSX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9taXhlcl9xdWlya3MuYyBiL3NvdW5kL3VzYi9taXhlcl9xdWlya3MuYwppbmRleCBmNGIxMmMyLi5mMTE5YTQxIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbWl4ZXJfcXVpcmtzLmMKKysrIGIvc291bmQvdXNiL21peGVyX3F1aXJrcy5jCkBAIC02MDAsOCArNjAwLDggQEAKIAl1cF9yZWFkKCZtaXhlci0+Y2hpcC0+c2h1dGRvd25fcndzZW0pOwogCiAJaWYgKHJldCA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUgotCQkJICAgInVuYWJsZSB0byBpc3N1ZSB2ZW5kb3IgcmVhZCByZXF1ZXN0IChyZXQgPSAlZCkiLCByZXQpOworCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCSJ1bmFibGUgdG8gaXNzdWUgdmVuZG9yIHJlYWQgcmVxdWVzdCAocmV0ID0gJWQpIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTYzMSw4ICs2MzEsOCBAQAogCXVwX3JlYWQoJm1peGVyLT5jaGlwLT5zaHV0ZG93bl9yd3NlbSk7CiAKIAlpZiAocmV0IDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAidW5hYmxlIHRvIGlzc3VlIHZlbmRvciB3cml0ZSByZXF1ZXN0IChyZXQgPSAlZCkiLCByZXQpOworCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCSJ1bmFibGUgdG8gaXNzdWUgdmVuZG9yIHdyaXRlIHJlcXVlc3QgKHJldCA9ICVkKSIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0xNjk5LDcgKzE2OTksNyBAQAogCQkJc25kX3VzYl9taXhlcl9ub3RpZnlfaWQobWl4ZXIsIG1peGVyLT5yY19jZmctPm11dGVfbWl4ZXJfaWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRkKEtFUk5fREVCVUcgIm1lbW9yeSBjaGFuZ2UgaW4gdW5rbm93biB1bml0ICVkXG4iLCB1bml0aWQpOworCQl1c2JfYXVkaW9fZGJnKG1peGVyLT5jaGlwLCAibWVtb3J5IGNoYW5nZSBpbiB1bmtub3duIHVuaXQgJWRcbiIsIHVuaXRpZCk7CiAJCWJyZWFrOwogCX0KIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9wY20uYyBiL3NvdW5kL3VzYi9wY20uYwppbmRleCBjYTMyNTZkLi40OWRlNWMxIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvcGNtLmMKKysrIGIvc291bmQvdXNiL3BjbS5jCkBAIC0xNjYsOCArMTY2LDggQEAKIAkJCQkgICBVU0JfVFlQRV9DTEFTU3xVU0JfUkVDSVBfRU5EUE9JTlR8VVNCX0RJUl9PVVQsCiAJCQkJICAgVUFDX0VQX0NTX0FUVFJfUElUQ0hfQ09OVFJPTCA8PCA4LCBlcCwKIAkJCQkgICBkYXRhLCBzaXplb2YoZGF0YSkpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JWQ6JWQ6IGNhbm5vdCBzZXQgZW5hYmxlIFBJVENIXG4iLAotCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlLCBlcCk7CisJCXVzYl9hdWRpb19lcnIoY2hpcCwgIiVkOiVkOiBjYW5ub3Qgc2V0IGVuYWJsZSBQSVRDSFxuIiwKKwkJCSAgICAgIGlmYWNlLCBlcCk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xODcsOCArMTg3LDggQEAKIAkJCQkgICBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9FTkRQT0lOVCB8IFVTQl9ESVJfT1VULAogCQkJCSAgIFVBQzJfRVBfQ1NfUElUQ0ggPDwgOCwgMCwKIAkJCQkgICBkYXRhLCBzaXplb2YoZGF0YSkpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JWQ6JWQ6IGNhbm5vdCBzZXQgZW5hYmxlIFBJVENIICh2MilcbiIsCi0JCQkgICBkZXYtPmRldm51bSwgaWZhY2UsIGZtdC0+YWx0c2V0dGluZyk7CisJCXVzYl9hdWRpb19lcnIoY2hpcCwgIiVkOiVkOiBjYW5ub3Qgc2V0IGVuYWJsZSBQSVRDSCAodjIpXG4iLAorCQkJICAgICAgaWZhY2UsIGZtdC0+YWx0c2V0dGluZyk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0yMjYsNyArMjI2LDcgQEAKIAlpZiAoIXRlc3RfYW5kX3NldF9iaXQoU1VCU1RSRUFNX0ZMQUdfREFUQV9FUF9TVEFSVEVELCAmc3Vicy0+ZmxhZ3MpKSB7CiAJCXN0cnVjdCBzbmRfdXNiX2VuZHBvaW50ICplcCA9IHN1YnMtPmRhdGFfZW5kcG9pbnQ7CiAKLQkJc25kX3ByaW50ZGQoS0VSTl9ERUJVRyAiU3RhcnRpbmcgZGF0YSBFUCBAJXBcbiIsIGVwKTsKKwkJZGV2X2RiZygmc3Vicy0+ZGV2LT5kZXYsICJTdGFydGluZyBkYXRhIEVQIEAlcFxuIiwgZXApOwogCiAJCWVwLT5kYXRhX3N1YnMgPSBzdWJzOwogCQllcnIgPSBzbmRfdXNiX2VuZHBvaW50X3N0YXJ0KGVwLCBjYW5fc2xlZXApOwpAQCAtMjQ3LDE2ICsyNDcsMTUgQEAKIAkJCQkJCXN1YnMtPnN5bmNfZW5kcG9pbnQtPmFsdHNldHRpbmcpOwogCQkJaWYgKGVyciA8IDApIHsKIAkJCQljbGVhcl9iaXQoU1VCU1RSRUFNX0ZMQUdfU1lOQ19FUF9TVEFSVEVELCAmc3Vicy0+ZmxhZ3MpOwotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIKLQkJCQkJICAgIiVkOiVkOiVkOiBjYW5ub3Qgc2V0IGludGVyZmFjZSAoJWQpXG4iLAotCQkJCQkgICBzdWJzLT5kZXYtPmRldm51bSwKKwkJCQlkZXZfZXJyKCZzdWJzLT5kZXYtPmRldiwKKwkJCQkJICAgIiVkOiVkOiBjYW5ub3Qgc2V0IGludGVyZmFjZSAoJWQpXG4iLAogCQkJCQkgICBzdWJzLT5zeW5jX2VuZHBvaW50LT5pZmFjZSwKIAkJCQkJICAgc3Vicy0+c3luY19lbmRwb2ludC0+YWx0c2V0dGluZywgZXJyKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KIAkJfQogCi0JCXNuZF9wcmludGRkKEtFUk5fREVCVUcgIlN0YXJ0aW5nIHN5bmMgRVAgQCVwXG4iLCBlcCk7CisJCWRldl9kYmcoJnN1YnMtPmRldi0+ZGV2LCAiU3RhcnRpbmcgc3luYyBFUCBAJXBcbiIsIGVwKTsKIAogCQllcC0+c3luY19zbGF2ZSA9IHN1YnMtPmRhdGFfZW5kcG9pbnQ7CiAJCWVyciA9IHNuZF91c2JfZW5kcG9pbnRfc3RhcnQoZXAsIGNhbl9zbGVlcCk7CkBAIC00MTAsOCArNDA5LDkgQEAKIAlpZiAoKGdldF9lbmRwb2ludChhbHRzLCAxKS0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spICE9IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MgfHwKIAkgICAgKGdldF9lbmRwb2ludChhbHRzLCAxKS0+Ykxlbmd0aCA+PSBVU0JfRFRfRU5EUE9JTlRfQVVESU9fU0laRSAmJgogCSAgICAgZ2V0X2VuZHBvaW50KGFsdHMsIDEpLT5iU3luY2hBZGRyZXNzICE9IDApKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiVkOiVkIDogaW52YWxpZCBzeW5jIHBpcGUuIGJtQXR0cmlidXRlcyAlMDJ4LCBiTGVuZ3RoICVkLCBiU3luY2hBZGRyZXNzICUwMnhcbiIsCi0JCQkgICBkZXYtPmRldm51bSwgZm10LT5pZmFjZSwgZm10LT5hbHRzZXR0aW5nLAorCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCSIlZDolZCA6IGludmFsaWQgc3luYyBwaXBlLiBibUF0dHJpYnV0ZXMgJTAyeCwgYkxlbmd0aCAlZCwgYlN5bmNoQWRkcmVzcyAlMDJ4XG4iLAorCQkJICAgZm10LT5pZmFjZSwgZm10LT5hbHRzZXR0aW5nLAogCQkJICAgZ2V0X2VuZHBvaW50KGFsdHMsIDEpLT5ibUF0dHJpYnV0ZXMsCiAJCQkgICBnZXRfZW5kcG9pbnQoYWx0cywgMSktPmJMZW5ndGgsCiAJCQkgICBnZXRfZW5kcG9pbnQoYWx0cywgMSktPmJTeW5jaEFkZHJlc3MpOwpAQCAtNDIxLDggKzQyMSw5IEBACiAJaWYgKGdldF9lbmRwb2ludChhbHRzLCAwKS0+Ykxlbmd0aCA+PSBVU0JfRFRfRU5EUE9JTlRfQVVESU9fU0laRSAmJgogCSAgICAoKGlzX3BsYXliYWNrICYmIGVwICE9ICh1bnNpZ25lZCBpbnQpKGdldF9lbmRwb2ludChhbHRzLCAwKS0+YlN5bmNoQWRkcmVzcyB8IFVTQl9ESVJfSU4pKSB8fAogCSAgICAgKCFpc19wbGF5YmFjayAmJiBlcCAhPSAodW5zaWduZWQgaW50KShnZXRfZW5kcG9pbnQoYWx0cywgMCktPmJTeW5jaEFkZHJlc3MgJiB+VVNCX0RJUl9JTikpKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDolZDolZCA6IGludmFsaWQgc3luYyBwaXBlLiBpc19wbGF5YmFjayAlZCwgZXAgJTAyeCwgYlN5bmNoQWRkcmVzcyAlMDJ4XG4iLAotCQkJICAgZGV2LT5kZXZudW0sIGZtdC0+aWZhY2UsIGZtdC0+YWx0c2V0dGluZywKKwkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkiJWQ6JWQgOiBpbnZhbGlkIHN5bmMgcGlwZS4gaXNfcGxheWJhY2sgJWQsIGVwICUwMngsIGJTeW5jaEFkZHJlc3MgJTAyeFxuIiwKKwkJCSAgIGZtdC0+aWZhY2UsIGZtdC0+YWx0c2V0dGluZywKIAkJCSAgIGlzX3BsYXliYWNrLCBlcCwgZ2V0X2VuZHBvaW50KGFsdHMsIDApLT5iU3luY2hBZGRyZXNzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNDY5LDggKzQ3MCw5IEBACiAJaWYgKHN1YnMtPmludGVyZmFjZSA+PSAwICYmIHN1YnMtPmludGVyZmFjZSAhPSBmbXQtPmlmYWNlKSB7CiAJCWVyciA9IHVzYl9zZXRfaW50ZXJmYWNlKHN1YnMtPmRldiwgc3Vicy0+aW50ZXJmYWNlLCAwKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiVkOiVkOiByZXR1cm4gdG8gc2V0dGluZyAwIGZhaWxlZCAoJWQpXG4iLAotCQkJCWRldi0+ZGV2bnVtLCBmbXQtPmlmYWNlLCBmbXQtPmFsdHNldHRpbmcsIGVycik7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCQkiJWQ6JWQ6IHJldHVybiB0byBzZXR0aW5nIDAgZmFpbGVkICglZClcbiIsCisJCQkJZm10LT5pZmFjZSwgZm10LT5hbHRzZXR0aW5nLCBlcnIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAkJc3Vicy0+aW50ZXJmYWNlID0gLTE7CkBAIC00ODIsMTIgKzQ4NCwxMyBAQAogCSAgICBzdWJzLT5hbHRzZXRfaWR4ICE9IGZtdC0+YWx0c2V0X2lkeCkgewogCQllcnIgPSB1c2Jfc2V0X2ludGVyZmFjZShkZXYsIGZtdC0+aWZhY2UsIGZtdC0+YWx0c2V0dGluZyk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDolZDolZDogdXNiX3NldF9pbnRlcmZhY2UgZmFpbGVkICglZClcbiIsCi0JCQkJICAgZGV2LT5kZXZudW0sIGZtdC0+aWZhY2UsIGZtdC0+YWx0c2V0dGluZywgZXJyKTsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJCSIlZDolZDogdXNiX3NldF9pbnRlcmZhY2UgZmFpbGVkICglZClcbiIsCisJCQkJZm10LT5pZmFjZSwgZm10LT5hbHRzZXR0aW5nLCBlcnIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJzZXR0aW5nIHVzYiBpbnRlcmZhY2UgJWQ6JWRcbiIsCi0JCQkJZm10LT5pZmFjZSwgZm10LT5hbHRzZXR0aW5nKTsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJzZXR0aW5nIHVzYiBpbnRlcmZhY2UgJWQ6JWRcbiIsCisJCQlmbXQtPmlmYWNlLCBmbXQtPmFsdHNldHRpbmcpOwogCQlzdWJzLT5pbnRlcmZhY2UgPSBmbXQtPmlmYWNlOwogCQlzdWJzLT5hbHRzZXRfaWR4ID0gZm10LT5hbHRzZXRfaWR4OwogCkBAIC01MjMsMjAgKzUyNiwyMyBAQAogICogLSBSZXF1ZXN0ZWQgUENNIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLgogICogLSBSZXF1ZXN0ZWQgc2FtcGxlIHJhdGUgaXMgbm90IHN1cHBvcnRlZC4KICAqLwotc3RhdGljIGludCBtYXRjaF9lbmRwb2ludF9hdWRpb2Zvcm1hdHMoc3RydWN0IGF1ZGlvZm9ybWF0ICpmcCwKLQlzdHJ1Y3QgYXVkaW9mb3JtYXQgKm1hdGNoLCBpbnQgcmF0ZSwKLQlzbmRfcGNtX2Zvcm1hdF90IHBjbV9mb3JtYXQpCitzdGF0aWMgaW50IG1hdGNoX2VuZHBvaW50X2F1ZGlvZm9ybWF0cyhzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkJICAgICAgIHN0cnVjdCBhdWRpb2Zvcm1hdCAqZnAsCisJCQkJICAgICAgIHN0cnVjdCBhdWRpb2Zvcm1hdCAqbWF0Y2gsIGludCByYXRlLAorCQkJCSAgICAgICBzbmRfcGNtX2Zvcm1hdF90IHBjbV9mb3JtYXQpCiB7CiAJaW50IGk7CiAJaW50IHNjb3JlID0gMDsKIAogCWlmIChmcC0+Y2hhbm5lbHMgPCAxKSB7Ci0JCXNuZF9wcmludGRkKCIlczogKGZtdCBAJXApIG5vIGNoYW5uZWxzXG4iLCBfX2Z1bmNfXywgZnApOworCQlkZXZfZGJnKCZzdWJzLT5kZXYtPmRldiwKKwkJCSIlczogKGZtdCBAJXApIG5vIGNoYW5uZWxzXG4iLCBfX2Z1bmNfXywgZnApOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAoIShmcC0+Zm9ybWF0cyAmIHBjbV9mb3JtYXRfdG9fYml0cyhwY21fZm9ybWF0KSkpIHsKLQkJc25kX3ByaW50ZGQoIiVzOiAoZm10IEAlcCkgbm8gbWF0Y2ggZm9yIGZvcm1hdCAlZFxuIiwgX19mdW5jX18sCisJCWRldl9kYmcoJnN1YnMtPmRldi0+ZGV2LAorCQkJIiVzOiAoZm10IEAlcCkgbm8gbWF0Y2ggZm9yIGZvcm1hdCAlZFxuIiwgX19mdW5jX18sCiAJCQlmcCwgcGNtX2Zvcm1hdCk7CiAJCXJldHVybiAwOwogCX0KQEAgLTU0OCw3ICs1NTQsOCBAQAogCQl9CiAJfQogCWlmICghc2NvcmUpIHsKLQkJc25kX3ByaW50ZGQoIiVzOiAoZm10IEAlcCkgbm8gbWF0Y2ggZm9yIHJhdGUgJWRcbiIsIF9fZnVuY19fLAorCQlkZXZfZGJnKCZzdWJzLT5kZXYtPmRldiwKKwkJCSIlczogKGZtdCBAJXApIG5vIG1hdGNoIGZvciByYXRlICVkXG4iLCBfX2Z1bmNfXywKIAkJCWZwLCByYXRlKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNTU2LDcgKzU2Myw4IEBACiAJaWYgKGZwLT5jaGFubmVscyA9PSBtYXRjaC0+Y2hhbm5lbHMpCiAJCXNjb3JlKys7CiAKLQlzbmRfcHJpbnRkZCgiJXM6IChmbXQgQCVwKSBzY29yZSAlZFxuIiwgX19mdW5jX18sIGZwLCBzY29yZSk7CisJZGV2X2RiZygmc3Vicy0+ZGV2LT5kZXYsCisJCSIlczogKGZtdCBAJXApIHNjb3JlICVkXG4iLCBfX2Z1bmNfXywgZnAsIHNjb3JlKTsKIAogCXJldHVybiBzY29yZTsKIH0KQEAgLTU4Nyw3ICs1OTUsOCBAQAogCiAJLyogVHJ5IHRvIGZpbmQgdGhlIGJlc3QgbWF0Y2hpbmcgYXVkaW9mb3JtYXQuICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmcCwgJnN5bmNfc3Vicy0+Zm10X2xpc3QsIGxpc3QpIHsKLQkJaW50IHNjb3JlID0gbWF0Y2hfZW5kcG9pbnRfYXVkaW9mb3JtYXRzKGZwLCBzdWJzLT5jdXJfYXVkaW9mbXQsCisJCWludCBzY29yZSA9IG1hdGNoX2VuZHBvaW50X2F1ZGlvZm9ybWF0cyhzdWJzLAorCQkJCQkJCWZwLCBzdWJzLT5jdXJfYXVkaW9mbXQsCiAJCQlzdWJzLT5jdXJfcmF0ZSwgc3Vicy0+cGNtX2Zvcm1hdCk7CiAKIAkJaWYgKHNjb3JlID4gY3VyX3Njb3JlKSB7CkBAIC01OTcsNyArNjA2LDggQEAKIAl9CiAKIAlpZiAodW5saWtlbHkoc3luY19mcCA9PSBOVUxMKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlczogbm8gdmFsaWQgYXVkaW9mb3JtYXQgZm9yIHN5bmMgZXAgJXggZm91bmRcbiIsCisJCWRldl9lcnIoJnN1YnMtPmRldi0+ZGV2LAorCQkJIiVzOiBubyB2YWxpZCBhdWRpb2Zvcm1hdCBmb3Igc3luYyBlcCAleCBmb3VuZFxuIiwKIAkJCV9fZnVuY19fLCBzeW5jX3N1YnMtPmVwX251bSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTYwOSw3ICs2MTksOCBAQAogCWlmIChzeW5jX2ZwLT5jaGFubmVscyAhPSBzdWJzLT5jaGFubmVscykgewogCQlzeW5jX3BlcmlvZF9ieXRlcyA9IChzdWJzLT5wZXJpb2RfYnl0ZXMgLyBzdWJzLT5jaGFubmVscykgKgogCQkJc3luY19mcC0+Y2hhbm5lbHM7Ci0JCXNuZF9wcmludGRkKCIlczogYWRqdXN0ZWQgc3luYyBlcCBwZXJpb2QgYnl0ZXMgKCVkIC0+ICVkKVxuIiwKKwkJZGV2X2RiZygmc3Vicy0+ZGV2LT5kZXYsCisJCQkiJXM6IGFkanVzdGVkIHN5bmMgZXAgcGVyaW9kIGJ5dGVzICglZCAtPiAlZClcbiIsCiAJCQlfX2Z1bmNfXywgc3Vicy0+cGVyaW9kX2J5dGVzLCBzeW5jX3BlcmlvZF9ieXRlcyk7CiAJfQogCkBAIC02ODUsNyArNjk2LDggQEAKIAogCWZtdCA9IGZpbmRfZm9ybWF0KHN1YnMpOwogCWlmICghZm10KSB7Ci0JCXNuZF9wcmludGQoS0VSTl9ERUJVRyAiY2Fubm90IHNldCBmb3JtYXQ6IGZvcm1hdCA9ICUjeCwgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkXG4iLAorCQlkZXZfZGJnKCZzdWJzLT5kZXYtPmRldiwKKwkJCSJjYW5ub3Qgc2V0IGZvcm1hdDogZm9ybWF0ID0gJSN4LCByYXRlID0gJWQsIGNoYW5uZWxzID0gJWRcbiIsCiAJCQkgICBzdWJzLT5wY21fZm9ybWF0LCBzdWJzLT5jdXJfcmF0ZSwgc3Vicy0+Y2hhbm5lbHMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC03NDIsNyArNzU0LDcgQEAKIAlpbnQgcmV0OwogCiAJaWYgKCEgc3Vicy0+Y3VyX2F1ZGlvZm10KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVzYmF1ZGlvOiBubyBmb3JtYXQgaXMgc3BlY2lmaWVkIVxuIik7CisJCWRldl9lcnIoJnN1YnMtPmRldi0+ZGV2LCAibm8gZm9ybWF0IGlzIHNwZWNpZmllZCFcbiIpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIApAQCAtMTIzNSw3ICsxMjQ3LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7CiAJCWNwID0gKHVuc2lnbmVkIGNoYXIgKil1cmItPnRyYW5zZmVyX2J1ZmZlciArIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0ICsgc3Vicy0+cGt0X29mZnNldF9hZGo7CiAJCWlmICh1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyAmJiBwcmludGtfcmF0ZWxpbWl0KCkpIHsKLQkJCXNuZF9wcmludGRkKEtFUk5fRVJSICJmcmFtZSAlZCBhY3RpdmU6ICVkXG4iLCBpLCB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyk7CisJCQlkZXZfZGJnKCZzdWJzLT5kZXYtPmRldiwgImZyYW1lICVkIGFjdGl2ZTogJWRcbiIsCisJCQkJaSwgdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMpOwogCQkJLy8gY29udGludWU7CiAJCX0KIAkJYnl0ZXMgPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGg7CkBAIC0xMjQ1LDcgKzEyNTgsOCBAQAogCQlpZiAoYnl0ZXMgJSAocnVudGltZS0+c2FtcGxlX2JpdHMgPj4gMykgIT0gMCkgewogCQkJaW50IG9sZGJ5dGVzID0gYnl0ZXM7CiAJCQlieXRlcyA9IGZyYW1lcyAqIHN0cmlkZTsKLQkJCXNuZF9wcmludGRkKEtFUk5fRVJSICJDb3JyZWN0ZWQgdXJiIGRhdGEgbGVuLiAlZC0+JWRcbiIsCisJCQlkZXZfd2Fybigmc3Vicy0+ZGV2LT5kZXYsCisJCQkJICJDb3JyZWN0ZWQgdXJiIGRhdGEgbGVuLiAlZC0+JWRcbiIsCiAJCQkJCQkJb2xkYnl0ZXMsIGJ5dGVzKTsKIAkJfQogCQkvKiB1cGRhdGUgdGhlIGN1cnJlbnQgcG9pbnRlciAqLwpAQCAtMTQ4OCw3ICsxNTAyLDggQEAKIAkgKiBvbiB0d28gcmVhZHMgb2YgYSBjb3VudGVyIHVwZGF0ZWQgZXZlcnkgbXMuCiAJICovCiAJaWYgKGFicyhlc3RfZGVsYXkgLSBzdWJzLT5sYXN0X2RlbGF5KSAqIDEwMDAgPiBydW50aW1lLT5yYXRlICogMikKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJkZWxheTogZXN0aW1hdGVkICVkLCBhY3R1YWwgJWRcbiIsCisJCWRldl9kYmcoJnN1YnMtPmRldi0+ZGV2LAorCQkJImRlbGF5OiBlc3RpbWF0ZWQgJWQsIGFjdHVhbCAlZFxuIiwKIAkJCWVzdF9kZWxheSwgc3Vicy0+bGFzdF9kZWxheSk7CiAKIAlpZiAoIXN1YnMtPnJ1bm5pbmcpIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9xdWlya3MuYyBiL3NvdW5kL3VzYi9xdWlya3MuYwppbmRleCA4OTczMDcwNzYuLjdjNTdmMjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9xdWlya3MuYworKysgYi9zb3VuZC91c2IvcXVpcmtzLmMKQEAgLTExMCw3ICsxMTAsNyBAQAogCWFsdHNkID0gZ2V0X2lmYWNlX2Rlc2MoYWx0cyk7CiAJZXJyID0gc25kX3VzYl9wYXJzZV9hdWRpb19pbnRlcmZhY2UoY2hpcCwgYWx0c2QtPmJJbnRlcmZhY2VOdW1iZXIpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBzZXR1cCBpZiAlZDogZXJyb3IgJWRcbiIsCisJCXVzYl9hdWRpb19lcnIoY2hpcCwgImNhbm5vdCBzZXR1cCBpZiAlZDogZXJyb3IgJWRcbiIsCiAJCQkgICBhbHRzZC0+YkludGVyZmFjZU51bWJlciwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC0xMzUsNyArMTM1LDcgQEAKIAogCWZwID0ga21lbWR1cChxdWlyay0+ZGF0YSwgc2l6ZW9mKCpmcCksIEdGUF9LRVJORUwpOwogCWlmICghZnApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IG1lbWR1cFxuIik7CisJCXVzYl9hdWRpb19lcnIoY2hpcCwgImNhbm5vdCBtZW1kdXBcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJaWYgKGZwLT5ucl9yYXRlcyA+IE1BWF9OUl9SQVRFUykgewpAQCAtNDY0LDcgKzQ2NCw3IEBACiAJCWZwLT5yYXRlX21heCA9IGZwLT5yYXRlX21pbiA9IDk2MDAwOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmtub3duIHNhbXBsZSByYXRlXG4iKTsKKwkJdXNiX2F1ZGlvX2VycihjaGlwLCAidW5rbm93biBzYW1wbGUgcmF0ZVxuIik7CiAJCWtmcmVlKGZwKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC01MzYsNyArNTM2LDcgQEAKIAlpZiAocXVpcmstPnR5cGUgPCBRVUlSS19UWVBFX0NPVU5UKSB7CiAJCXJldHVybiBxdWlya19mdW5jc1txdWlyay0+dHlwZV0oY2hpcCwgaWZhY2UsIGRyaXZlciwgcXVpcmspOwogCX0gZWxzZSB7Ci0JCXNuZF9wcmludGQoS0VSTl9FUlIgImludmFsaWQgcXVpcmsgdHlwZSAlZFxuIiwgcXVpcmstPnR5cGUpOworCQl1c2JfYXVkaW9fZXJyKGNoaXAsICJpbnZhbGlkIHF1aXJrIHR5cGUgJWRcbiIsIHF1aXJrLT50eXBlKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiB9CkBAIC01NTUsMTggKzU1NSwyMSBAQAogCiAJaWYgKGxlMTZfdG9fY3B1KGdldF9jZmdfZGVzYyhjb25maWcpLT53VG90YWxMZW5ndGgpID09IEVYVElHWV9GSVJNV0FSRV9TSVpFX09MRCB8fAogCSAgICBsZTE2X3RvX2NwdShnZXRfY2ZnX2Rlc2MoY29uZmlnKS0+d1RvdGFsTGVuZ3RoKSA9PSBFWFRJR1lfRklSTVdBUkVfU0laRV9ORVcpIHsKLQkJc25kX3ByaW50ZGQoInNlbmRpbmcgRXh0aWd5IGJvb3Qgc2VxdWVuY2UuLi5cbiIpOworCQlkZXZfZGJnKCZkZXYtPmRldiwgInNlbmRpbmcgRXh0aWd5IGJvb3Qgc2VxdWVuY2UuLi5cbiIpOwogCQkvKiBTZW5kIG1lc3NhZ2UgdG8gZm9yY2UgaXQgdG8gcmVjb25uZWN0IHdpdGggZnVsbCBpbnRlcmZhY2UuICovCiAJCWVyciA9IHNuZF91c2JfY3RsX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsMCksCiAJCQkJICAgICAgMHgxMCwgMHg0MywgMHgwMDAxLCAweDAwMGEsIE5VTEwsIDApOwotCQlpZiAoZXJyIDwgMCkgc25kX3ByaW50ZGQoImVycm9yIHNlbmRpbmcgYm9vdCBtZXNzYWdlOiAlZFxuIiwgZXJyKTsKKwkJaWYgKGVyciA8IDApCisJCQlkZXZfZGJnKCZkZXYtPmRldiwgImVycm9yIHNlbmRpbmcgYm9vdCBtZXNzYWdlOiAlZFxuIiwgZXJyKTsKIAkJZXJyID0gdXNiX2dldF9kZXNjcmlwdG9yKGRldiwgVVNCX0RUX0RFVklDRSwgMCwKIAkJCQkmZGV2LT5kZXNjcmlwdG9yLCBzaXplb2YoZGV2LT5kZXNjcmlwdG9yKSk7CiAJCWNvbmZpZyA9IGRldi0+YWN0Y29uZmlnOwotCQlpZiAoZXJyIDwgMCkgc25kX3ByaW50ZGQoImVycm9yIHVzYl9nZXRfZGVzY3JpcHRvcjogJWRcbiIsIGVycik7CisJCWlmIChlcnIgPCAwKQorCQkJZGV2X2RiZygmZGV2LT5kZXYsICJlcnJvciB1c2JfZ2V0X2Rlc2NyaXB0b3I6ICVkXG4iLCBlcnIpOwogCQllcnIgPSB1c2JfcmVzZXRfY29uZmlndXJhdGlvbihkZXYpOwotCQlpZiAoZXJyIDwgMCkgc25kX3ByaW50ZGQoImVycm9yIHVzYl9yZXNldF9jb25maWd1cmF0aW9uOiAlZFxuIiwgZXJyKTsKLQkJc25kX3ByaW50ZGQoImV4dGlneV9ib290OiBuZXcgYm9vdCBsZW5ndGggPSAlZFxuIiwKKwkJaWYgKGVyciA8IDApCisJCQlkZXZfZGJnKCZkZXYtPmRldiwgImVycm9yIHVzYl9yZXNldF9jb25maWd1cmF0aW9uOiAlZFxuIiwgZXJyKTsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJleHRpZ3lfYm9vdDogbmV3IGJvb3QgbGVuZ3RoID0gJWRcbiIsCiAJCQkgICAgbGUxNl90b19jcHUoZ2V0X2NmZ19kZXNjKGNvbmZpZyktPndUb3RhbExlbmd0aCkpOwogCQlyZXR1cm4gLUVOT0RFVjsgLyogcXVpdCB0aGlzIGFueXdheSAqLwogCX0KQEAgLTU5NCw3ICs1OTcsNyBAQAogCWludCBlcnI7CiAKIAlpZiAoZGV2LT5hY3Rjb25maWctPmRlc2MuYkNvbmZpZ3VyYXRpb25WYWx1ZSA9PSAxKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJ1c2ItYXVkaW86ICIKKwkJZGV2X2luZm8oJmRldi0+ZGV2LAogCQkJICAgIkZhc3QgVHJhY2sgUHJvIHN3aXRjaGluZyB0byBjb25maWcgIzJcbiIpOwogCQkvKiBUaGlzIGZ1bmN0aW9uIGhhcyB0byBiZSBhdmFpbGFibGUgYnkgdGhlIHVzYiBjb3JlIG1vZHVsZS4KIAkJICogaWYgaXQgaXMgbm90IGF2aWFsYWJsZSB0aGUgYm9vdCBxdWlyayBoYXMgdG8gYmUgbGVmdCBvdXQKQEAgLTYwMywxNCArNjA2LDE1IEBACiAJCSAqLwogCQllcnIgPSB1c2JfZHJpdmVyX3NldF9jb25maWd1cmF0aW9uKGRldiwgMik7CiAJCWlmIChlcnIgPCAwKQotCQkJc25kX3ByaW50ZGQoImVycm9yIHVzYl9kcml2ZXJfc2V0X2NvbmZpZ3VyYXRpb246ICVkXG4iLAotCQkJCSAgICBlcnIpOworCQkJZGV2X2RiZygmZGV2LT5kZXYsCisJCQkJImVycm9yIHVzYl9kcml2ZXJfc2V0X2NvbmZpZ3VyYXRpb246ICVkXG4iLAorCQkJCWVycik7CiAJCS8qIEFsd2F5cyByZXR1cm4gYW4gZXJyb3IsIHNvIHRoYXQgd2Ugc3RvcCBjcmVhdGluZyBhIGRldmljZQogCQkgICB0aGF0IHdpbGwganVzdCBiZSBkZXN0cm95ZWQgYW5kIHJlY3JlYXRlZCB3aXRoIGEgbmV3CiAJCSAgIGNvbmZpZ3VyYXRpb24gKi8KIAkJcmV0dXJuIC1FTk9ERVY7CiAJfSBlbHNlCi0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJ1c2ItYXVkaW86IEZhc3QgVHJhY2sgUHJvIGNvbmZpZyBPS1xuIik7CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIkZhc3QgVHJhY2sgUHJvIGNvbmZpZyBPS1xuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc3OSwxMSArNzgzLDExIEBACiAJZndzaXplID0gbGUxNl90b19jcHUoZ2V0X2NmZ19kZXNjKGNvbmZpZyktPndUb3RhbExlbmd0aCk7CiAKIAlpZiAoZndzaXplICE9IE1CT1gyX0ZJUk1XQVJFX1NJWkUpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidXNiLWF1ZGlvOiBJbnZhbGlkIGZpcm13YXJlIHNpemU9JWQuXG4iLCBmd3NpemUpOworCQlkZXZfZXJyKCZkZXYtPmRldiwgIkludmFsaWQgZmlybXdhcmUgc2l6ZT0lZC5cbiIsIGZ3c2l6ZSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXNuZF9wcmludGQoInVzYi1hdWRpbzogU2VuZGluZyBEaWdpZGVzaWduIE1ib3ggMiBib290IHNlcXVlbmNlLi4uXG4iKTsKKwlkZXZfZGJnKCZkZXYtPmRldiwgIlNlbmRpbmcgRGlnaWRlc2lnbiBNYm94IDIgYm9vdCBzZXF1ZW5jZS4uLlxuIik7CiAKIAljb3VudCA9IDA7CiAJYm9vdHJlc3BvbnNlWzBdID0gTUJPWDJfQk9PVF9MT0FESU5HOwpAQCAtNzk0LDMyICs3OTgsMzIgQEAKIAkJCTB4ODUsIDB4YzAsIDB4MDAwMSwgMHgwMDAwLCAmYm9vdHJlc3BvbnNlLCAweDAwMTIpOwogCQlpZiAoYm9vdHJlc3BvbnNlWzBdID09IE1CT1gyX0JPT1RfUkVBRFkpCiAJCQlicmVhazsKLQkJc25kX3ByaW50ZCgidXNiLWF1ZGlvOiBkZXZpY2Ugbm90IHJlYWR5LCByZXNlbmRpbmcgYm9vdCBzZXF1ZW5jZS4uLlxuIik7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAiZGV2aWNlIG5vdCByZWFkeSwgcmVzZW5kaW5nIGJvb3Qgc2VxdWVuY2UuLi5cbiIpOwogCQljb3VudCsrOwogCX0KIAogCWlmIChib290cmVzcG9uc2VbMF0gIT0gTUJPWDJfQk9PVF9SRUFEWSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1c2ItYXVkaW86IFVua25vd24gYm9vdHJlc3BvbnNlPSVkLCBvciB0aW1lZCBvdXQsIGlnbm9yaW5nIGRldmljZS5cbiIsIGJvb3RyZXNwb25zZVswXSk7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiVW5rbm93biBib290cmVzcG9uc2U9JWQsIG9yIHRpbWVkIG91dCwgaWdub3JpbmcgZGV2aWNlLlxuIiwgYm9vdHJlc3BvbnNlWzBdKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc25kX3ByaW50ZGQoInVzYi1hdWRpbzogZGV2aWNlIGluaXRpYWxpc2VkIVxuIik7CisJZGV2X2RiZygmZGV2LT5kZXYsICJkZXZpY2UgaW5pdGlhbGlzZWQhXG4iKTsKIAogCWVyciA9IHVzYl9nZXRfZGVzY3JpcHRvcihkZXYsIFVTQl9EVF9ERVZJQ0UsIDAsCiAJCSZkZXYtPmRlc2NyaXB0b3IsIHNpemVvZihkZXYtPmRlc2NyaXB0b3IpKTsKIAljb25maWcgPSBkZXYtPmFjdGNvbmZpZzsKIAlpZiAoZXJyIDwgMCkKLQkJc25kX3ByaW50ZCgiZXJyb3IgdXNiX2dldF9kZXNjcmlwdG9yOiAlZFxuIiwgZXJyKTsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJlcnJvciB1c2JfZ2V0X2Rlc2NyaXB0b3I6ICVkXG4iLCBlcnIpOwogCiAJZXJyID0gdXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb24oZGV2KTsKIAlpZiAoZXJyIDwgMCkKLQkJc25kX3ByaW50ZCgiZXJyb3IgdXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb246ICVkXG4iLCBlcnIpOwotCXNuZF9wcmludGRkKCJtYm94Ml9ib290OiBuZXcgYm9vdCBsZW5ndGggPSAlZFxuIiwKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJlcnJvciB1c2JfcmVzZXRfY29uZmlndXJhdGlvbjogJWRcbiIsIGVycik7CisJZGV2X2RiZygmZGV2LT5kZXYsICJtYm94Ml9ib290OiBuZXcgYm9vdCBsZW5ndGggPSAlZFxuIiwKIAkJbGUxNl90b19jcHUoZ2V0X2NmZ19kZXNjKGNvbmZpZyktPndUb3RhbExlbmd0aCkpOwogCiAJbWJveDJfc2V0dXBfNDhfMjRfbWFnaWMoZGV2KTsKIAotCXNuZF9wcmludGsoS0VSTl9JTkZPICJ1c2ItYXVkaW86IERpZ2lkZXNpZ24gTWJveCAyOiAyNGJpdCA0OGtIeiIpOworCWRldl9pbmZvKCZkZXYtPmRldiwgIkRpZ2lkZXNpZ24gTWJveCAyOiAyNGJpdCA0OGtIeiIpOwogCiAJcmV0dXJuIDA7IC8qIFN1Y2Nlc3NmdWwgYm9vdCAqLwogfQpAQCAtODY1LDcgKzg2OSw3IEBACiAJCQkJcmV0dXJuIDE7IC8qIHNraXAgdGhpcyBhbHRzZXR0aW5nICovCiAJCX0KIAl9Ci0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPCisJdXNiX2F1ZGlvX2RiZyhjaGlwLAogCQkgICAgInVzaW5nIGFsdHNldHRpbmcgJWQgZm9yIGludGVyZmFjZSAlZCBjb25maWcgJWRcbiIsCiAJCSAgICBhbHRubywgaWZhY2UsIGNoaXAtPnNldHVwKTsKIAlyZXR1cm4gMDsgLyoga2VlcCB0aGlzIGFsdHNldHRpbmcgKi8KQEAgLTkzMiw3ICs5MzYsNyBAQAogCQkJcmV0dXJuIDE7CiAJfQogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPCisJdXNiX2F1ZGlvX2RiZyhjaGlwLAogCQkgICAgInVzaW5nIGFsdHNldHRpbmcgJWQgZm9yIGludGVyZmFjZSAlZCBjb25maWcgJWRcbiIsCiAJCSAgICBhbHRubywgaWZhY2UsIGNoaXAtPnNldHVwKTsKIAlyZXR1cm4gMDsgLyoga2VlcCB0aGlzIGFsdHNldHRpbmcgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9zdHJlYW0uYyBiL3NvdW5kL3VzYi9zdHJlYW0uYwppbmRleCAyZmI3MWJlLi4zMTBhMzgyIDEwMDY0NAotLS0gYS9zb3VuZC91c2Ivc3RyZWFtLmMKKysrIGIvc291bmQvdXNiL3N0cmVhbS5jCkBAIC00MTEsMTAgKzQxMSw5IEBACiAKIAlpZiAoIWNzZXAgfHwgY3NlcC0+Ykxlbmd0aCA8IDcgfHwKIAkgICAgY3NlcC0+YkRlc2NyaXB0b3JTdWJ0eXBlICE9IFVBQ19FUF9HRU5FUkFMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICIlZDoldTolZCA6IG5vIG9yIGludmFsaWQiCi0JCQkgICAiIGNsYXNzIHNwZWNpZmljIGVuZHBvaW50IGRlc2NyaXB0b3JcbiIsCi0JCQkgICBjaGlwLT5kZXYtPmRldm51bSwgaWZhY2Vfbm8sCi0JCQkgICBhbHRzZC0+YkFsdGVybmF0ZVNldHRpbmcpOworCQl1c2JfYXVkaW9fd2FybihjaGlwLAorCQkJICAgICAgICIldTolZCA6IG5vIG9yIGludmFsaWQgY2xhc3Mgc3BlY2lmaWMgZW5kcG9pbnQgZGVzY3JpcHRvclxuIiwKKwkJCSAgICAgICBpZmFjZV9ubywgYWx0c2QtPmJBbHRlcm5hdGVTZXR0aW5nKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC01MzMsOCArNTMyLDggQEAKIAkJLyogZ2V0IGF1ZGlvIGZvcm1hdHMgKi8KIAkJc3dpdGNoIChwcm90b2NvbCkgewogCQlkZWZhdWx0OgotCQkJc25kX3ByaW50ZGQoS0VSTl9XQVJOSU5HICIlZDoldTolZDogdW5rbm93biBpbnRlcmZhY2UgcHJvdG9jb2wgJSMwMngsIGFzc3VtaW5nIHYxXG4iLAotCQkJCSAgICBkZXYtPmRldm51bSwgaWZhY2Vfbm8sIGFsdG5vLCBwcm90b2NvbCk7CisJCQlkZXZfZGJnKCZkZXYtPmRldiwgIiV1OiVkOiB1bmtub3duIGludGVyZmFjZSBwcm90b2NvbCAlIzAyeCwgYXNzdW1pbmcgdjFcbiIsCisJCQkJaWZhY2Vfbm8sIGFsdG5vLCBwcm90b2NvbCk7CiAJCQlwcm90b2NvbCA9IFVBQ19WRVJTSU9OXzE7CiAJCQkvKiBmYWxsIHRocm91Z2ggKi8KIApAQCAtNTQ0LDE0ICs1NDMsMTYgQEAKIAkJCXN0cnVjdCB1YWNfaW5wdXRfdGVybWluYWxfZGVzY3JpcHRvciAqaXRlcm07CiAKIAkJCWlmICghYXMpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IFVBQ19BU19HRU5FUkFMIGRlc2NyaXB0b3Igbm90IGZvdW5kXG4iLAotCQkJCQkgICBkZXYtPmRldm51bSwgaWZhY2Vfbm8sIGFsdG5vKTsKKwkJCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCQkJIiV1OiVkIDogVUFDX0FTX0dFTkVSQUwgZGVzY3JpcHRvciBub3QgZm91bmRcbiIsCisJCQkJCWlmYWNlX25vLCBhbHRubyk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKIAkJCWlmIChhcy0+Ykxlbmd0aCA8IHNpemVvZigqYXMpKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JXU6JWQgOiBpbnZhbGlkIFVBQ19BU19HRU5FUkFMIGRlc2NcbiIsCi0JCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8pOworCQkJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJCQkiJXU6JWQgOiBpbnZhbGlkIFVBQ19BU19HRU5FUkFMIGRlc2NcbiIsCisJCQkJCWlmYWNlX25vLCBhbHRubyk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKQEAgLTU3NCwxNCArNTc1LDE2IEBACiAJCQkJc25kX3VzYl9maW5kX2NzaW50X2Rlc2MoYWx0cy0+ZXh0cmEsIGFsdHMtPmV4dHJhbGVuLCBOVUxMLCBVQUNfQVNfR0VORVJBTCk7CiAKIAkJCWlmICghYXMpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IFVBQ19BU19HRU5FUkFMIGRlc2NyaXB0b3Igbm90IGZvdW5kXG4iLAotCQkJCQkgICBkZXYtPmRldm51bSwgaWZhY2Vfbm8sIGFsdG5vKTsKKwkJCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCQkJIiV1OiVkIDogVUFDX0FTX0dFTkVSQUwgZGVzY3JpcHRvciBub3QgZm91bmRcbiIsCisJCQkJCWlmYWNlX25vLCBhbHRubyk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKIAkJCWlmIChhcy0+Ykxlbmd0aCA8IHNpemVvZigqYXMpKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JXU6JWQgOiBpbnZhbGlkIFVBQ19BU19HRU5FUkFMIGRlc2NcbiIsCi0JCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8pOworCQkJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJCQkiJXU6JWQgOiBpbnZhbGlkIFVBQ19BU19HRU5FUkFMIGRlc2NcbiIsCisJCQkJCWlmYWNlX25vLCBhbHRubyk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKQEAgLTYwNyw4ICs2MTAsOSBAQAogCQkJCWJyZWFrOwogCQkJfQogCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IGJvZ3VzIGJUZXJtaW5hbExpbmsgJWRcbiIsCi0JCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubywgYXMtPmJUZXJtaW5hbExpbmspOworCQkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkJIiV1OiVkIDogYm9ndXMgYlRlcm1pbmFsTGluayAlZFxuIiwKKwkJCQlpZmFjZV9ubywgYWx0bm8sIGFzLT5iVGVybWluYWxMaW5rKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCX0KQEAgLTYxNiwxNCArNjIwLDE2IEBACiAJCS8qIGdldCBmb3JtYXQgdHlwZSAqLwogCQlmbXQgPSBzbmRfdXNiX2ZpbmRfY3NpbnRfZGVzYyhhbHRzLT5leHRyYSwgYWx0cy0+ZXh0cmFsZW4sIE5VTEwsIFVBQ19GT1JNQVRfVFlQRSk7CiAJCWlmICghZm10KSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IG5vIFVBQ19GT1JNQVRfVFlQRSBkZXNjXG4iLAotCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8pOworCQkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkJIiV1OiVkIDogbm8gVUFDX0ZPUk1BVF9UWVBFIGRlc2NcbiIsCisJCQkJaWZhY2Vfbm8sIGFsdG5vKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmICgoKHByb3RvY29sID09IFVBQ19WRVJTSU9OXzEpICYmIChmbXQtPmJMZW5ndGggPCA4KSkgfHwKIAkJICAgICgocHJvdG9jb2wgPT0gVUFDX1ZFUlNJT05fMikgJiYgKGZtdC0+Ykxlbmd0aCA8IDYpKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JXU6JWQgOiBpbnZhbGlkIFVBQ19GT1JNQVRfVFlQRSBkZXNjXG4iLAotCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8pOworCQkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkJIiV1OiVkIDogaW52YWxpZCBVQUNfRk9STUFUX1RZUEUgZGVzY1xuIiwKKwkJCQlpZmFjZV9ubywgYWx0bm8pOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtNjQ0LDcgKzY1MCw3IEBACiAKIAkJZnAgPSBremFsbG9jKHNpemVvZigqZnApLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCEgZnApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBtYWxsb2NcbiIpOworCQkJZGV2X2VycigmZGV2LT5kZXYsICJjYW5ub3QgbWFsbG9jXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKQEAgLTcwNyw3ICs3MTMsNyBAQAogCQkJY2hjb25maWcgPSAwOwogCQlmcC0+Y2htYXAgPSBjb252ZXJ0X2NobWFwKGZwLT5jaGFubmVscywgY2hjb25maWcsIHByb3RvY29sKTsKIAotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIiVkOiV1OiVkOiBhZGQgYXVkaW8gZW5kcG9pbnQgJSN4XG4iLCBkZXYtPmRldm51bSwgaWZhY2Vfbm8sIGFsdG5vLCBmcC0+ZW5kcG9pbnQpOworCQlkZXZfZGJnKCZkZXYtPmRldiwgIiV1OiVkOiBhZGQgYXVkaW8gZW5kcG9pbnQgJSN4XG4iLCBpZmFjZV9ubywgYWx0bm8sIGZwLT5lbmRwb2ludCk7CiAJCWVyciA9IHNuZF91c2JfYWRkX2F1ZGlvX3N0cmVhbShjaGlwLCBzdHJlYW0sIGZwKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCWtmcmVlKGZwLT5yYXRlX3RhYmxlKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c2JhdWRpby5oIGIvc291bmQvdXNiL3VzYmF1ZGlvLmgKaW5kZXggNWQyZmUwNS4uMjVjNGM3ZSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzYmF1ZGlvLmgKKysrIGIvc291bmQvdXNiL3VzYmF1ZGlvLmgKQEAgLTYwLDYgKzYwLDE1IEBACiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqY3RybF9pbnRmOwkvKiB0aGUgYXVkaW8gY29udHJvbCBpbnRlcmZhY2UgKi8KIH07CiAKKyNkZWZpbmUgdXNiX2F1ZGlvX2VycihjaGlwLCBmbXQsIGFyZ3MuLi4pIFwKKwlkZXZfZXJyKCYoY2hpcCktPmRldi0+ZGV2LCBmbXQsICMjYXJncykKKyNkZWZpbmUgdXNiX2F1ZGlvX3dhcm4oY2hpcCwgZm10LCBhcmdzLi4uKSBcCisJZGV2X3dhcm4oJihjaGlwKS0+ZGV2LT5kZXYsIGZtdCwgIyNhcmdzKQorI2RlZmluZSB1c2JfYXVkaW9faW5mbyhjaGlwLCBmbXQsIGFyZ3MuLi4pIFwKKwlkZXZfaW5mbygmKGNoaXApLT5kZXYtPmRldiwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIHVzYl9hdWRpb19kYmcoY2hpcCwgZm10LCBhcmdzLi4uKSBcCisJZGV2X2RiZygmKGNoaXApLT5kZXYtPmRldiwgZm10LCAjI2FyZ3MpCisKIC8qCiAgKiBJbmZvcm1hdGlvbiBhYm91dCBkZXZpY2VzIHdpdGggYnJva2VuIGRlc2NyaXB0b3JzCiAgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c3gyeS91czEyMmwuYyBiL3NvdW5kL3VzYi91c3gyeS91czEyMmwuYwppbmRleCA5OTk1NTBiLi5jZjVkYzMzIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXN4MnkvdXMxMjJsLmMKKysrIGIvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5jCkBAIC01MzUsNyArNTM1LDkgQEAKIAkJc25kX3VzMTIybF9jYXJkX3VzZWRbaW5kZXhdID0gMDsKIH0KIAotc3RhdGljIGludCB1c3gyeV9jcmVhdGVfY2FyZChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKK3N0YXRpYyBpbnQgdXN4MnlfY3JlYXRlX2NhcmQoc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSwKKwkJCSAgICAgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkgICAgIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQogewogCWludAkJZGV2OwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKQEAgLTU0Niw4ICs1NDgsOCBAQAogCQkJYnJlYWs7CiAJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCB1czEyMmwpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZpbnRmLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCB1czEyMmwpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJc25kX3VzMTIybF9jYXJkX3VzZWRbVVMxMjJMKGNhcmQpLT5jYXJkX2luZGV4ID0gZGV2XSA9IDE7CkBAIC01NzgsMTEgKzU4MCwxMCBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gdXN4MnlfY3JlYXRlX2NhcmQoZGV2aWNlLCAmY2FyZCk7CisJZXJyID0gdXN4MnlfY3JlYXRlX2NhcmQoZGV2aWNlLCBpbnRmLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZpbnRmLT5kZXYpOwogCWlmICghdXMxMjJsX2NyZWF0ZV9jYXJkKGNhcmQpKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5LmMgYi9zb3VuZC91c2IvdXN4MnkvdXNidXN4MnkuYwppbmRleCA1YTUxYjE4Li45MWUwZTJhIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXN4MnkvdXNidXN4MnkuYworKysgYi9zb3VuZC91c2IvdXN4MnkvdXNidXN4MnkuYwpAQCAtMzMyLDcgKzMzMiw5IEBACiAJeyAvKiB0ZXJtaW5hdG9yICovIH0KIH07CiAKLXN0YXRpYyBpbnQgdXNYMllfY3JlYXRlX2NhcmQoc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSwgc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCitzdGF0aWMgaW50IHVzWDJZX2NyZWF0ZV9jYXJkKHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UsCisJCQkgICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJICAgICBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKIHsKIAlpbnQJCWRldjsKIAlzdHJ1Y3Qgc25kX2NhcmQgKgljYXJkOwpAQCAtMzQzLDE1ICszNDUsMTUgQEAKIAkJCWJyZWFrOwogCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCiAJCXJldHVybiAtRU5PREVWOwotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgdXNYMllkZXYpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZpbnRmLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCB1c1gyWWRldiksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlzbmRfdXNYMllfY2FyZF91c2VkW3VzWDJZKGNhcmQpLT5jYXJkX2luZGV4ID0gZGV2XSA9IDE7CiAJY2FyZC0+cHJpdmF0ZV9mcmVlID0gc25kX3VzWDJZX2NhcmRfcHJpdmF0ZV9mcmVlOwogCXVzWDJZKGNhcmQpLT5kZXYgPSBkZXZpY2U7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmdXNYMlkoY2FyZCktPnByZXBhcmVfd2FpdF9xdWV1ZSk7Ci0JbXV0ZXhfaW5pdCgmdXNYMlkoY2FyZCktPnByZXBhcmVfbXV0ZXgpOworCW11dGV4X2luaXQoJnVzWDJZKGNhcmQpLT5wY21fbXV0ZXgpOwogCUlOSVRfTElTVF9IRUFEKCZ1c1gyWShjYXJkKS0+bWlkaV9saXN0KTsKIAlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiVVNCICJOQU1FX0FMTENBUFMiIik7CiAJc3ByaW50ZihjYXJkLT5zaG9ydG5hbWUsICJUQVNDQU0gIk5BTUVfQUxMQ0FQUyIiKTsKQEAgLTM4MiwxMCArMzg0LDkgQEAKIAkgICAgIGxlMTZfdG9fY3B1KGRldmljZS0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpICE9IFVTQl9JRF9VUzQyOCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZXJyID0gdXNYMllfY3JlYXRlX2NhcmQoZGV2aWNlLCAmY2FyZCk7CisJZXJyID0gdXNYMllfY3JlYXRlX2NhcmQoZGV2aWNlLCBpbnRmLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmaW50Zi0+ZGV2KTsKIAlpZiAoKGVyciA9IHVzWDJZX2h3ZGVwX25ldyhjYXJkLCBkZXZpY2UpKSA8IDAgIHx8CiAJICAgIChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXN4MnkvdXNidXN4MnkuaCBiL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeS5oCmluZGV4IGU0M2MwYTguLjZhZTZiMDggMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeS5oCisrKyBiL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeS5oCkBAIC0zNiw3ICszNiw3IEBACiAJdW5zaWduZWQgaW50CQlyYXRlLAogCQkJCWZvcm1hdDsKIAlpbnQJCQljaGlwX3N0YXR1czsKLQlzdHJ1Y3QgbXV0ZXgJCXByZXBhcmVfbXV0ZXg7CisJc3RydWN0IG11dGV4CQlwY21fbXV0ZXg7CiAJc3RydWN0IHVzNDI4Y3Rsc19zaGFyZWRtZW0JKnVzNDI4Y3Rsc19zaGFyZWRtZW07CiAJaW50CQkJd2FpdF9pc29fZnJhbWU7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJdXM0MjhjdGxzX3dhaXRfcXVldWVfaGVhZDsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeWF1ZGlvLmMgYi9zb3VuZC91c2IvdXN4MnkvdXNidXN4MnlhdWRpby5jCmluZGV4IDYyMzRhNTEuLmE2MzMzMGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeWF1ZGlvLmMKKysrIGIvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5YXVkaW8uYwpAQCAtNzUyLDM2ICs3NTIsNDQgQEAKIAl1bnNpZ25lZCBpbnQJCXJhdGUgPSBwYXJhbXNfcmF0ZShod19wYXJhbXMpOwogCXNuZF9wY21fZm9ybWF0X3QJZm9ybWF0ID0gcGFyYW1zX2Zvcm1hdChod19wYXJhbXMpOwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHN1YnN0cmVhbS0+cHN0ci0+cGNtLT5jYXJkOwotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IHVzWDJZZGV2CSpkZXYgPSB1c1gyWShjYXJkKTsKKwlpbnQgaTsKIAorCW11dGV4X2xvY2soJnVzWDJZKGNhcmQpLT5wY21fbXV0ZXgpOwogCXNuZF9wcmludGRkKCJzbmRfdXNYMllfaHdfcGFyYW1zKCVwLCAlcClcbiIsIHN1YnN0cmVhbSwgaHdfcGFyYW1zKTsKLQkvLyBhbGwgcGNtIHN1YnN0cmVhbXMgb2ZmIG9uZSB1c1gyWSBoYXZlIHRvIG9wZXJhdGUgYXQgdGhlIHNhbWUgcmF0ZSAmIGZvcm1hdAotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmNhcmQtPmRldmljZXMpIHsKLQkJc3RydWN0IHNuZF9kZXZpY2UgKmRldjsKLQkJc3RydWN0IHNuZF9wY20gKnBjbTsKLQkJaW50IHM7Ci0JCWRldiA9IHNuZF9kZXZpY2UobGlzdCk7Ci0JCWlmIChkZXYtPnR5cGUgIT0gU05EUlZfREVWX1BDTSkKKwkvKiBhbGwgcGNtIHN1YnN0cmVhbXMgb2ZmIG9uZSB1c1gyWSBoYXZlIHRvIG9wZXJhdGUgYXQgdGhlIHNhbWUKKwkgKiByYXRlICYgZm9ybWF0CisJICovCisJZm9yIChpID0gMDsgaSA8IGRldi0+cGNtX2RldnMgKiAyOyBpKyspIHsKKwkJc3RydWN0IHNuZF91c1gyWV9zdWJzdHJlYW0gKnN1YnMgPSBkZXYtPnN1YnNbaV07CisJCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqdGVzdF9zdWJzdHJlYW07CisKKwkJaWYgKCFzdWJzKQogCQkJY29udGludWU7Ci0JCXBjbSA9IGRldi0+ZGV2aWNlX2RhdGE7Ci0JCWZvciAocyA9IDA7IHMgPCAyOyArK3MpIHsKLQkJCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqdGVzdF9zdWJzdHJlYW07Ci0JCQl0ZXN0X3N1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tzXS5zdWJzdHJlYW07Ci0JCQlpZiAodGVzdF9zdWJzdHJlYW0gJiYgdGVzdF9zdWJzdHJlYW0gIT0gc3Vic3RyZWFtICAmJgotCQkJICAgIHRlc3Rfc3Vic3RyZWFtLT5ydW50aW1lICYmCi0JCQkgICAgKCh0ZXN0X3N1YnN0cmVhbS0+cnVudGltZS0+Zm9ybWF0ICYmCi0JCQkgICAgICB0ZXN0X3N1YnN0cmVhbS0+cnVudGltZS0+Zm9ybWF0ICE9IGZvcm1hdCkgfHwKLQkJCSAgICAgKHRlc3Rfc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlICYmCi0JCQkgICAgICB0ZXN0X3N1YnN0cmVhbS0+cnVudGltZS0+cmF0ZSAhPSByYXRlKSkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CisJCXRlc3Rfc3Vic3RyZWFtID0gc3Vicy0+cGNtX3N1YnN0cmVhbTsKKwkJaWYgKCF0ZXN0X3N1YnN0cmVhbSB8fCB0ZXN0X3N1YnN0cmVhbSA9PSBzdWJzdHJlYW0gfHwKKwkJICAgICF0ZXN0X3N1YnN0cmVhbS0+cnVudGltZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKHRlc3Rfc3Vic3RyZWFtLT5ydW50aW1lLT5mb3JtYXQgJiYKKwkJICAgICB0ZXN0X3N1YnN0cmVhbS0+cnVudGltZS0+Zm9ybWF0ICE9IGZvcm1hdCkgfHwKKwkJICAgICh0ZXN0X3N1YnN0cmVhbS0+cnVudGltZS0+cmF0ZSAmJgorCQkgICAgIHRlc3Rfc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlICE9IHJhdGUpKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKIAkJfQogCX0KLQlpZiAoMCA+IChlcnIgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpKSkgeworCisJZXJyID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwKKwkJCQkgICAgICAgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKKwlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoJXAsICVpKSByZXR1cm5lZCAlaVxuIiwKIAkJCSAgIHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpLCBlcnIpOwotCQlyZXR1cm4gZXJyOworCQlnb3RvIGVycm9yOwogCX0KLQlyZXR1cm4gMDsKKworIGVycm9yOgorCW11dGV4X3VubG9jaygmdXNYMlkoY2FyZCktPnBjbV9tdXRleCk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTc5MSw3ICs3OTksNyBAQAogewogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJc3RydWN0IHNuZF91c1gyWV9zdWJzdHJlYW0gKnN1YnMgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JbXV0ZXhfbG9jaygmc3Vicy0+dXNYMlktPnByZXBhcmVfbXV0ZXgpOworCW11dGV4X2xvY2soJnN1YnMtPnVzWDJZLT5wY21fbXV0ZXgpOwogCXNuZF9wcmludGRkKCJzbmRfdXNYMllfaHdfZnJlZSglcClcbiIsIHN1YnN0cmVhbSk7CiAKIAlpZiAoU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA9PSBzdWJzdHJlYW0tPnN0cmVhbSkgewpAQCAtODEyLDcgKzgyMCw3IEBACiAJCQl1c1gyWV91cmJzX3JlbGVhc2Uoc3Vicyk7CiAJCX0KIAl9Ci0JbXV0ZXhfdW5sb2NrKCZzdWJzLT51c1gyWS0+cHJlcGFyZV9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZzdWJzLT51c1gyWS0+cGNtX211dGV4KTsKIAlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwogfQogLyoKQEAgLTgyOSw3ICs4MzcsNyBAQAogCWludCBlcnIgPSAwOwogCXNuZF9wcmludGRkKCJzbmRfdXNYMllfcGNtX3ByZXBhcmUoJXApXG4iLCBzdWJzdHJlYW0pOwogCi0JbXV0ZXhfbG9jaygmdXNYMlktPnByZXBhcmVfbXV0ZXgpOworCW11dGV4X2xvY2soJnVzWDJZLT5wY21fbXV0ZXgpOwogCXVzWDJZX3N1YnNfcHJlcGFyZShzdWJzKTsKIC8vIFN0YXJ0IGhhcmR3YXJlIHN0cmVhbXMKIC8vIFN5bmNTdHJlYW0gZmlyc3QuLi4uCkBAIC04NDksNyArODU3LDcgQEAKIAkJZXJyID0gdXNYMllfdXJic19zdGFydChzdWJzKTsKIAogIHVwX3ByZXBhcmVfbXV0ZXg6Ci0JbXV0ZXhfdW5sb2NrKCZ1c1gyWS0+cHJlcGFyZV9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZ1c1gyWS0+cGNtX211dGV4KTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXN4MnkvdXN4Mnlod2RlcHBjbS5jIGIvc291bmQvdXNiL3VzeDJ5L3VzeDJ5aHdkZXBwY20uYwppbmRleCA4MTRkMGU4Li45MDc2NmE5IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXN4MnkvdXN4Mnlod2RlcHBjbS5jCisrKyBiL3NvdW5kL3VzYi91c3gyeS91c3gyeWh3ZGVwcGNtLmMKQEAgLTM1OCw3ICszNTgsNyBAQAogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJc3RydWN0IHNuZF91c1gyWV9zdWJzdHJlYW0gKnN1YnMgPSBydW50aW1lLT5wcml2YXRlX2RhdGEsCiAJCSpjYXBfc3ViczIgPSBzdWJzLT51c1gyWS0+c3Vic1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUgKyAyXTsKLQltdXRleF9sb2NrKCZzdWJzLT51c1gyWS0+cHJlcGFyZV9tdXRleCk7CisJbXV0ZXhfbG9jaygmc3Vicy0+dXNYMlktPnBjbV9tdXRleCk7CiAJc25kX3ByaW50ZGQoInNuZF91c1gyWV91c2JwY21faHdfZnJlZSglcClcbiIsIHN1YnN0cmVhbSk7CiAKIAlpZiAoU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA9PSBzdWJzdHJlYW0tPnN0cmVhbSkgewpAQCAtMzg3LDcgKzM4Nyw3IEBACiAJCQkJdXNYMllfdXNicGNtX3VyYnNfcmVsZWFzZShjYXBfc3ViczIpOwogCQl9CiAJfQotCW11dGV4X3VubG9jaygmc3Vicy0+dXNYMlktPnByZXBhcmVfbXV0ZXgpOworCW11dGV4X3VubG9jaygmc3Vicy0+dXNYMlktPnBjbV9tdXRleCk7CiAJcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKIH0KIApAQCAtNDkzLDcgKzQ5Myw3IEBACiAJCW1lbXNldCh1c1gyWS0+aHdkZXBfcGNtX3NobSwgMCwgc2l6ZW9mKHN0cnVjdCBzbmRfdXNYMllfaHdkZXBfcGNtX3NobSkpOwogCX0KIAotCW11dGV4X2xvY2soJnVzWDJZLT5wcmVwYXJlX211dGV4KTsKKwltdXRleF9sb2NrKCZ1c1gyWS0+cGNtX211dGV4KTsKIAl1c1gyWV9zdWJzX3ByZXBhcmUoc3Vicyk7CiAvLyBTdGFydCBoYXJkd2FyZSBzdHJlYW1zCiAvLyBTeW5jU3RyZWFtIGZpcnN0Li4uLgpAQCAtNTM0LDcgKzUzNCw3IEBACiAJCXVzWDJZLT5od2RlcF9wY21fc2htLT5jYXB0dXJlX2lzb19zdGFydCA9IC0xOwogCiAgdXBfcHJlcGFyZV9tdXRleDoKLQltdXRleF91bmxvY2soJnVzWDJZLT5wcmVwYXJlX211dGV4KTsKKwltdXRleF91bmxvY2soJnVzWDJZLT5wY21fbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTYwMCw1OSArNjAwLDMwIEBACiB9OwogCiAKLXN0YXRpYyBpbnQgdXNYMllfcGNtc19sb2NrX2NoZWNrKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCkKK3N0YXRpYyBpbnQgdXNYMllfcGNtc19idXN5X2NoZWNrKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwotCXN0cnVjdCBzbmRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHNuZF9wY20gKnBjbTsKLQlpbnQgZXJyID0gMDsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZjYXJkLT5kZXZpY2VzKSB7Ci0JCWRldiA9IHNuZF9kZXZpY2UobGlzdCk7Ci0JCWlmIChkZXYtPnR5cGUgIT0gU05EUlZfREVWX1BDTSkKLQkJCWNvbnRpbnVlOwotCQlwY20gPSBkZXYtPmRldmljZV9kYXRhOwotCQltdXRleF9sb2NrKCZwY20tPm9wZW5fbXV0ZXgpOworCXN0cnVjdCB1c1gyWWRldgkqZGV2ID0gdXNYMlkoY2FyZCk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5wY21fZGV2cyAqIDI7IGkrKykgeworCQlzdHJ1Y3Qgc25kX3VzWDJZX3N1YnN0cmVhbSAqc3VicyA9IGRldi0+c3Vic1tpXTsKKwkJaWYgKHN1YnMgJiYgc3Vicy0+cGNtX3N1YnN0cmVhbSAmJgorCQkgICAgU1VCU1RSRUFNX0JVU1koc3Vicy0+cGNtX3N1YnN0cmVhbSkpCisJCQlyZXR1cm4gLUVCVVNZOwogCX0KLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZjYXJkLT5kZXZpY2VzKSB7Ci0JCWludCBzOwotCQlkZXYgPSBzbmRfZGV2aWNlKGxpc3QpOwotCQlpZiAoZGV2LT50eXBlICE9IFNORFJWX0RFVl9QQ00pCi0JCQljb250aW51ZTsKLQkJcGNtID0gZGV2LT5kZXZpY2VfZGF0YTsKLQkJZm9yIChzID0gMDsgcyA8IDI7ICsrcykgewotCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07Ci0JCQlzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbc10uc3Vic3RyZWFtOwotCQkJaWYgKHN1YnN0cmVhbSAmJiBTVUJTVFJFQU1fQlVTWShzdWJzdHJlYW0pKQotCQkJCWVyciA9IC1FQlVTWTsKLQkJfQotCX0KLQlyZXR1cm4gZXJyOworCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyB2b2lkIHVzWDJZX3BjbXNfdW5sb2NrKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwotCXN0cnVjdCBzbmRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHNuZF9wY20gKnBjbTsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZjYXJkLT5kZXZpY2VzKSB7Ci0JCWRldiA9IHNuZF9kZXZpY2UobGlzdCk7Ci0JCWlmIChkZXYtPnR5cGUgIT0gU05EUlZfREVWX1BDTSkKLQkJCWNvbnRpbnVlOwotCQlwY20gPSBkZXYtPmRldmljZV9kYXRhOwotCQltdXRleF91bmxvY2soJnBjbS0+b3Blbl9tdXRleCk7Ci0JfQotfQotCi0KIHN0YXRpYyBpbnQgc25kX3VzWDJZX2h3ZGVwX3BjbV9vcGVuKHN0cnVjdCBzbmRfaHdkZXAgKmh3LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQkvLyB3ZSBuZWVkIHRvIGJlIHRoZSBmaXJzdCAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBody0+Y2FyZDsKLQlpbnQgZXJyID0gdXNYMllfcGNtc19sb2NrX2NoZWNrKGNhcmQpOwotCWlmICgwID09IGVycikKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmdXNYMlkoY2FyZCktPnBjbV9tdXRleCk7CisJZXJyID0gdXNYMllfcGNtc19idXN5X2NoZWNrKGNhcmQpOworCWlmICghZXJyKQogCQl1c1gyWShjYXJkKS0+Y2hpcF9zdGF0dXMgfD0gVVNYMllfU1RBVF9DSElQX01NQVBfUENNX1VSQlM7Ci0JdXNYMllfcGNtc191bmxvY2soY2FyZCk7CisJbXV0ZXhfdW5sb2NrKCZ1c1gyWShjYXJkKS0+cGNtX211dGV4KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC02NjAsMTAgKzYzMSwxMyBAQAogc3RhdGljIGludCBzbmRfdXNYMllfaHdkZXBfcGNtX3JlbGVhc2Uoc3RydWN0IHNuZF9od2RlcCAqaHcsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGh3LT5jYXJkOwotCWludCBlcnIgPSB1c1gyWV9wY21zX2xvY2tfY2hlY2soY2FyZCk7Ci0JaWYgKDAgPT0gZXJyKQorCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZ1c1gyWShjYXJkKS0+cGNtX211dGV4KTsKKwllcnIgPSB1c1gyWV9wY21zX2J1c3lfY2hlY2soY2FyZCk7CisJaWYgKCFlcnIpCiAJCXVzWDJZKGh3LT5jYXJkKS0+Y2hpcF9zdGF0dXMgJj0gflVTWDJZX1NUQVRfQ0hJUF9NTUFQX1BDTV9VUkJTOwotCXVzWDJZX3BjbXNfdW5sb2NrKGNhcmQpOworCW11dGV4X3VubG9jaygmdXNYMlkoY2FyZCktPnBjbV9tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvTWFrZWZpbGUgYi90b29scy9NYWtlZmlsZQppbmRleCBmZWVjM2FkLi5iY2FlODA2IDEwMDY0NAotLS0gYS90b29scy9NYWtlZmlsZQorKysgYi90b29scy9NYWtlZmlsZQpAQCAtNyw2ICs3LDcgQEAKIAlAZWNobyAnICBjZ3JvdXAgICAgIC0gY2dyb3VwIHRvb2xzJwogCUBlY2hvICcgIGNwdXBvd2VyICAgLSBhIHRvb2wgZm9yIGFsbCB0aGluZ3MgeDg2IENQVSBwb3dlcicKIAlAZWNobyAnICBmaXJld2lyZSAgIC0gdGhlIHVzZXJzcGFjZSBwYXJ0IG9mIG5vc3ksIGFuIElFRUUtMTM5NCB0cmFmZmljIHNuaWZmZXInCisJQGVjaG8gJyAgaHYgICAgICAgICAtIHRvb2xzIHVzZWQgd2hlbiBpbiBIeXBlci1WIGNsaWVudHMnCiAJQGVjaG8gJyAgbGd1ZXN0ICAgICAtIGEgbWluaW1hbCAzMi1iaXQgeDg2IGh5cGVydmlzb3InCiAJQGVjaG8gJyAgcGVyZiAgICAgICAtIExpbnV4IHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IGFuZCBhbmFseXNpcyB0b29sJwogCUBlY2hvICcgIHNlbGZ0ZXN0cyAgLSB2YXJpb3VzIGtlcm5lbCBzZWxmdGVzdHMnCkBAIC00MCw3ICs0MSw3IEBACiBjcHVwb3dlcjogRk9SQ0UKIAkkKGNhbGwgZGVzY2VuZCxwb3dlci8kQCkKIAotY2dyb3VwIGZpcmV3aXJlIGd1ZXN0IHVzYiB2aXJ0aW8gdm0gbmV0OiBGT1JDRQorY2dyb3VwIGZpcmV3aXJlIGh2IGd1ZXN0IHVzYiB2aXJ0aW8gdm0gbmV0OiBGT1JDRQogCSQoY2FsbCBkZXNjZW5kLCRAKQogCiBsaWJhcGlrZnM6IEZPUkNFCkBAIC02NCw3ICs2NSw3IEBACiBjcHVwb3dlcl9pbnN0YWxsOgogCSQoY2FsbCBkZXNjZW5kLHBvd2VyLyQoQDpfaW5zdGFsbD0pLGluc3RhbGwpCiAKLWNncm91cF9pbnN0YWxsIGZpcmV3aXJlX2luc3RhbGwgbGd1ZXN0X2luc3RhbGwgcGVyZl9pbnN0YWxsIHVzYl9pbnN0YWxsIHZpcnRpb19pbnN0YWxsIHZtX2luc3RhbGwgbmV0X2luc3RhbGw6CitjZ3JvdXBfaW5zdGFsbCBmaXJld2lyZV9pbnN0YWxsIGh2X2luc3RhbGwgbGd1ZXN0X2luc3RhbGwgcGVyZl9pbnN0YWxsIHVzYl9pbnN0YWxsIHZpcnRpb19pbnN0YWxsIHZtX2luc3RhbGwgbmV0X2luc3RhbGw6CiAJJChjYWxsIGRlc2NlbmQsJChAOl9pbnN0YWxsPSksaW5zdGFsbCkKIAogc2VsZnRlc3RzX2luc3RhbGw6CkBAIC03Niw3ICs3Nyw3IEBACiB0bW9uX2luc3RhbGw6CiAJJChjYWxsIGRlc2NlbmQsdGhlcm1hbC8kKEA6X2luc3RhbGw9KSxpbnN0YWxsKQogCi1pbnN0YWxsOiBhY3BpX2luc3RhbGwgY2dyb3VwX2luc3RhbGwgY3B1cG93ZXJfaW5zdGFsbCBmaXJld2lyZV9pbnN0YWxsIGxndWVzdF9pbnN0YWxsIFwKK2luc3RhbGw6IGFjcGlfaW5zdGFsbCBjZ3JvdXBfaW5zdGFsbCBjcHVwb3dlcl9pbnN0YWxsIGh2X2luc3RhbGwgZmlyZXdpcmVfaW5zdGFsbCBsZ3Vlc3RfaW5zdGFsbCBcCiAJCXBlcmZfaW5zdGFsbCBzZWxmdGVzdHNfaW5zdGFsbCB0dXJib3N0YXRfaW5zdGFsbCB1c2JfaW5zdGFsbCBcCiAJCXZpcnRpb19pbnN0YWxsIHZtX2luc3RhbGwgbmV0X2luc3RhbGwgeDg2X2VuZXJneV9wZXJmX3BvbGljeV9pbnN0YWxsIFwKIAl0bW9uCkBAIC04Nyw3ICs4OCw3IEBACiBjcHVwb3dlcl9jbGVhbjoKIAkkKGNhbGwgZGVzY2VuZCxwb3dlci9jcHVwb3dlcixjbGVhbikKIAotY2dyb3VwX2NsZWFuIGZpcmV3aXJlX2NsZWFuIGxndWVzdF9jbGVhbiB1c2JfY2xlYW4gdmlydGlvX2NsZWFuIHZtX2NsZWFuIG5ldF9jbGVhbjoKK2Nncm91cF9jbGVhbiBodl9jbGVhbiBmaXJld2lyZV9jbGVhbiBsZ3Vlc3RfY2xlYW4gdXNiX2NsZWFuIHZpcnRpb19jbGVhbiB2bV9jbGVhbiBuZXRfY2xlYW46CiAJJChjYWxsIGRlc2NlbmQsJChAOl9jbGVhbj0pLGNsZWFuKQogCiBsaWJhcGlrZnNfY2xlYW46CkBAIC0xMDUsNyArMTA2LDcgQEAKIHRtb25fY2xlYW46CiAJJChjYWxsIGRlc2NlbmQsdGhlcm1hbC90bW9uLGNsZWFuKQogCi1jbGVhbjogYWNwaV9jbGVhbiBjZ3JvdXBfY2xlYW4gY3B1cG93ZXJfY2xlYW4gZmlyZXdpcmVfY2xlYW4gbGd1ZXN0X2NsZWFuIFwKK2NsZWFuOiBhY3BpX2NsZWFuIGNncm91cF9jbGVhbiBjcHVwb3dlcl9jbGVhbiBodl9jbGVhbiBmaXJld2lyZV9jbGVhbiBsZ3Vlc3RfY2xlYW4gXAogCQlwZXJmX2NsZWFuIHNlbGZ0ZXN0c19jbGVhbiB0dXJib3N0YXRfY2xlYW4gdXNiX2NsZWFuIHZpcnRpb19jbGVhbiBcCiAJCXZtX2NsZWFuIG5ldF9jbGVhbiB4ODZfZW5lcmd5X3BlcmZfcG9saWN5X2NsZWFuIHRtb25fY2xlYW4KIApkaWZmIC0tZ2l0IGEvdG9vbHMvaHYvTWFrZWZpbGUgYi90b29scy9odi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDIyZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaHYvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIyBNYWtlZmlsZSBmb3IgSHlwZXItViB0b29scworCitDQyA9ICQoQ1JPU1NfQ09NUElMRSlnY2MKK1BUSFJFQURfTElCUyA9IC1scHRocmVhZAorV0FSTklOR1MgPSAtV2FsbCAtV2V4dHJhCitDRkxBR1MgPSAkKFdBUk5JTkdTKSAtZyAkKFBUSFJFQURfTElCUykKKworYWxsOiBodl9rdnBfZGFlbW9uIGh2X3Zzc19kYWVtb24KKyU6ICUuYworCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCAkXgorCitjbGVhbjoKKwkkKFJNKSBodl9rdnBfZGFlbW9uIGh2X3Zzc19kYWVtb24KZGlmZiAtLWdpdCBhL3Rvb2xzL2h2L2h2X2Zjb3B5X2RhZW1vbi5jIGIvdG9vbHMvaHYvaHZfZmNvcHlfZGFlbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjYzRmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2h2L2h2X2Zjb3B5X2RhZW1vbi5jCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgaG9zdCB0byBndWVzdCBjb3B5IGZ1bmN0aW9uYWxpdHkgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCwgTWljcm9zb2Z0LCBJbmMuCisgKgorICogQXV0aG9yIDogSy4gWS4gU3Jpbml2YXNhbiA8a3lzQG1pY3Jvc29mdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaHlwZXJ2Lmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorCitzdGF0aWMgaW50IHRhcmdldF9mZDsKK3N0YXRpYyBjaGFyIHRhcmdldF9mbmFtZVtXX01BWF9QQVRIXTsKKworc3RhdGljIGludCBodl9zdGFydF9mY29weShzdHJ1Y3QgaHZfc3RhcnRfZmNvcHkgKnNtc2cpCit7CisJaW50IGVycm9yID0gSFZfRV9GQUlMOworCWNoYXIgKnEsICpwOworCisJLyoKKwkgKiBJZiBwb3NzaWxlIGFwcGVuZCBhIHBhdGggc2VwZXJhdG9yIHRvIHRoZSBwYXRoLgorCSAqLworCWlmIChzdHJsZW4oKGNoYXIgKilzbXNnLT5wYXRoX25hbWUpIDwgKFdfTUFYX1BBVEggLSAyKSkKKwkJc3RyY2F0KChjaGFyICopc21zZy0+cGF0aF9uYW1lLCAiLyIpOworCisJcCA9IChjaGFyICopc21zZy0+cGF0aF9uYW1lOworCXNucHJpbnRmKHRhcmdldF9mbmFtZSwgc2l6ZW9mKHRhcmdldF9mbmFtZSksICIlcy8lcyIsCisJCShjaGFyICopc21zZy0+cGF0aF9uYW1lLCBzbXNnLT5maWxlX25hbWUpOworCisJc3lzbG9nKExPR19JTkZPLCAiVGFyZ2V0IGZpbGUgbmFtZTogJXMiLCB0YXJnZXRfZm5hbWUpOworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBwYXRoIGlzIGFscmVhZHkgaW4gcGxhY2U7IGlmIG5vdCwKKwkgKiBjcmVhdGUgaWYgcmVxdWlyZWQuCisJICovCisJd2hpbGUgKChxID0gc3RyY2hyKHAsICcvJykpICE9IE5VTEwpIHsKKwkJaWYgKHEgPT0gcCkgeworCQkJcCsrOworCQkJY29udGludWU7CisJCX0KKwkJKnEgPSAnXDAnOworCQlpZiAoYWNjZXNzKChjaGFyICopc21zZy0+cGF0aF9uYW1lLCBGX09LKSkgeworCQkJaWYgKHNtc2ctPmNvcHlfZmxhZ3MgJiBDUkVBVEVfUEFUSCkgeworCQkJCWlmIChta2RpcigoY2hhciAqKXNtc2ctPnBhdGhfbmFtZSwgMDc1NSkpIHsKKwkJCQkJc3lzbG9nKExPR19FUlIsICJGYWlsZWQgdG8gY3JlYXRlICVzIiwKKwkJCQkJCShjaGFyICopc21zZy0+cGF0aF9uYW1lKTsKKwkJCQkJZ290byBkb25lOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc3lzbG9nKExPR19FUlIsICJJbnZhbGlkIHBhdGg6ICVzIiwKKwkJCQkJKGNoYXIgKilzbXNnLT5wYXRoX25hbWUpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCQlwID0gcSArIDE7CisJCSpxID0gJy8nOworCX0KKworCWlmICghYWNjZXNzKHRhcmdldF9mbmFtZSwgRl9PSykpIHsKKwkJc3lzbG9nKExPR19JTkZPLCAiRmlsZTogJXMgZXhpc3RzIiwgdGFyZ2V0X2ZuYW1lKTsKKwkJaWYgKCFzbXNnLT5jb3B5X2ZsYWdzICYgT1ZFUl9XUklURSkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwl0YXJnZXRfZmQgPSBvcGVuKHRhcmdldF9mbmFtZSwgT19SRFdSIHwgT19DUkVBVCB8IE9fQ0xPRVhFQywgMDc0NCk7CisJaWYgKHRhcmdldF9mZCA9PSAtMSkgeworCQlzeXNsb2coTE9HX0lORk8sICJPcGVuIEZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIGRvbmU7CisJfQorCisJZXJyb3IgPSAwOworZG9uZToKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgaHZfY29weV9kYXRhKHN0cnVjdCBodl9kb19mY29weSAqY3Btc2cpCit7CisJc3NpemVfdCBieXRlc193cml0dGVuOworCisJYnl0ZXNfd3JpdHRlbiA9IHB3cml0ZSh0YXJnZXRfZmQsIGNwbXNnLT5kYXRhLCBjcG1zZy0+c2l6ZSwKKwkJCQljcG1zZy0+b2Zmc2V0KTsKKworCWlmIChieXRlc193cml0dGVuICE9IGNwbXNnLT5zaXplKQorCQlyZXR1cm4gSFZfRV9GQUlMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHZfY29weV9maW5pc2hlZCh2b2lkKQoreworCWNsb3NlKHRhcmdldF9mZCk7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IGh2X2NvcHlfY2FuY2VsKHZvaWQpCit7CisJY2xvc2UodGFyZ2V0X2ZkKTsKKwl1bmxpbmsodGFyZ2V0X2ZuYW1lKTsKKwlyZXR1cm4gMDsKKworfQorCitpbnQgbWFpbih2b2lkKQoreworCWludCBmZCwgZmNvcHlfZmQsIGxlbjsKKwlpbnQgZXJyb3I7CisJaW50IHZlcnNpb24gPSBGQ09QWV9DVVJSRU5UX1ZFUlNJT047CisJY2hhciAqYnVmZmVyWzQwOTYgKiAyXTsKKwlzdHJ1Y3QgaHZfZmNvcHlfaGRyICppbl9tc2c7CisKKwlpZiAoZGFlbW9uKDEsIDApKSB7CisJCXN5c2xvZyhMT0dfRVJSLCAiZGFlbW9uKCkgZmFpbGVkOyBlcnJvcjogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJb3BlbmxvZygiSFZfRkNPUFkiLCAwLCBMT0dfVVNFUik7CisJc3lzbG9nKExPR19JTkZPLCAiSFZfRkNPUFkgc3RhcnRpbmc7IHBpZCBpczolZCIsIGdldHBpZCgpKTsKKworCWZjb3B5X2ZkID0gb3BlbigiL2Rldi92bWJ1cy9odl9mY29weSIsIE9fUkRXUik7CisKKwlpZiAoZmNvcHlfZmQgPCAwKSB7CisJCXN5c2xvZyhMT0dfRVJSLCAib3BlbiAvZGV2L3ZtYnVzL2h2X2Zjb3B5IGZhaWxlZDsgZXJyb3I6ICVkICVzIiwKKwkJCWVycm5vLCBzdHJlcnJvcihlcnJubykpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJLyoKKwkgKiBSZWdpc3RlciB3aXRoIHRoZSBrZXJuZWwuCisJICovCisJaWYgKCh3cml0ZShmY29weV9mZCwgJnZlcnNpb24sIHNpemVvZihpbnQpKSkgIT0gc2l6ZW9mKGludCkpIHsKKwkJc3lzbG9nKExPR19FUlIsICJSZWdpc3RyYXRpb24gZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQkvKgorCQkgKiBJbiB0aGlzIGxvb3Agd2UgcHJvY2VzcyBmY29weSBtZXNzYWdlcyBhZnRlciB0aGUKKwkJICogaGFuZHNoYWtlIGlzIGNvbXBsZXRlLgorCQkgKi8KKwkJbGVuID0gcHJlYWQoZmNvcHlfZmQsIGJ1ZmZlciwgKDQwOTYgKiAyKSwgMCk7CisJCWlmIChsZW4gPCAwKSB7CisJCQlzeXNsb2coTE9HX0VSUiwgInByZWFkIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQl9CisJCWluX21zZyA9IChzdHJ1Y3QgaHZfZmNvcHlfaGRyICopYnVmZmVyOworCisJCXN3aXRjaCAoaW5fbXNnLT5vcGVyYXRpb24pIHsKKwkJY2FzZSBTVEFSVF9GSUxFX0NPUFk6CisJCQllcnJvciA9IGh2X3N0YXJ0X2Zjb3B5KChzdHJ1Y3QgaHZfc3RhcnRfZmNvcHkgKilpbl9tc2cpOworCQkJYnJlYWs7CisJCWNhc2UgV1JJVEVfVE9fRklMRToKKwkJCWVycm9yID0gaHZfY29weV9kYXRhKChzdHJ1Y3QgaHZfZG9fZmNvcHkgKilpbl9tc2cpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUExFVEVfRkNPUFk6CisJCQllcnJvciA9IGh2X2NvcHlfZmluaXNoZWQoKTsKKwkJCWJyZWFrOworCQljYXNlIENBTkNFTF9GQ09QWToKKwkJCWVycm9yID0gaHZfY29weV9jYW5jZWwoKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlzeXNsb2coTE9HX0VSUiwgIlVua25vd24gb3BlcmF0aW9uOiAlZCIsCisJCQkJaW5fbXNnLT5vcGVyYXRpb24pOworCisJCX0KKworCQlpZiAocHdyaXRlKGZjb3B5X2ZkLCAmZXJyb3IsIHNpemVvZihpbnQpLCAwKSAhPSBzaXplb2YoaW50KSkgeworCQkJc3lzbG9nKExPR19FUlIsICJwd3JpdGUgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS90b29scy9odi9odl92c3NfZGFlbW9uLmMgYi90b29scy9odi9odl92c3NfZGFlbW9uLmMKaW5kZXggNTIwZGUzMzA0Li42YTIxM2I4IDEwMDY0NAotLS0gYS90b29scy9odi9odl92c3NfZGFlbW9uLmMKKysrIGIvdG9vbHMvaHYvaHZfdnNzX2RhZW1vbi5jCkBAIC04Nyw2ICs4Nyw4IEBACiAJCQljb250aW51ZTsKIAkJaWYgKHN0cmNtcChlbnQtPm1udF90eXBlLCAiaXNvOTY2MCIpID09IDApCiAJCQljb250aW51ZTsKKwkJaWYgKHN0cmNtcChlbnQtPm1udF90eXBlLCAidmZhdCIpID09IDApCisJCQljb250aW51ZTsKIAkJaWYgKHN0cmNtcChlbnQtPm1udF9kaXIsICIvIikgPT0gMCkgewogCQkJcm9vdF9zZWVuID0gMTsKIAkJCWNvbnRpbnVlOwo=